From 95524824a5767c6d785fe10753f163baca26b610 Mon Sep 17 00:00:00 2001 From: HyungKyu Song Date: Thu, 14 Feb 2013 21:46:48 +0900 Subject: [PATCH] Tizen 2.0 Release --- ABOUT-NLS | 1068 + AUTHORS | 21 + COPYING | 504 + ChangeLog | 75313 +++++++++++++++++++ INSTALL | 182 + Makefile.am | 95 + Makefile.in | 1273 + NEWS | 2315 + README | 247 + RELEASE | 379 + REQUIREMENTS | 166 + aclocal.m4 | 1182 + autogen.sh | 120 + common/ChangeLog | 1712 + common/Makefile.am | 22 + common/Makefile.in | 828 + common/c-to-xml.py | 34 + common/check-exports | 70 + common/check.mak | 181 + common/coverage/coverage-report-entry.pl | 69 + common/coverage/coverage-report.pl | 125 + common/coverage/coverage-report.xsl | 235 + common/coverage/lcov.mak | 43 + common/cruft.mak | 56 + common/download-translations | 152 + common/extract-release-date-from-doap-file | 32 + common/gettext.patch | 12 + common/glib-gen.mak | 44 + common/gst-autogen.sh | 376 + common/gst-glib-gen.mak | 45 + common/gst-indent | 49 + common/gst.supp | 3963 + common/gstdoc-scangobj | 1598 + common/gtk-doc-plugins.mak | 387 + common/gtk-doc.mak | 231 + common/m4/Makefile.am | 42 + common/m4/Makefile.in | 647 + common/m4/README | 3 + common/m4/as-ac-expand.m4 | 43 + common/m4/as-auto-alt.m4 | 50 + common/m4/as-compiler-flag.m4 | 64 + common/m4/as-compiler.m4 | 44 + common/m4/as-docbook.m4 | 66 + common/m4/as-gcc-inline-assembly.m4 | 52 + common/m4/as-libtool-tags.m4 | 83 + common/m4/as-libtool.m4 | 45 + common/m4/as-objc.m4 | 56 + common/m4/as-python.m4 | 152 + common/m4/as-scrub-include.m4 | 36 + common/m4/as-version.m4 | 75 + common/m4/ax_create_stdint_h.m4 | 734 + common/m4/check.m4 | 181 + common/m4/glib-gettext.m4 | 432 + common/m4/gst-arch.m4 | 141 + common/m4/gst-args.m4 | 327 + common/m4/gst-check.m4 | 262 + common/m4/gst-debuginfo.m4 | 46 + common/m4/gst-default.m4 | 120 + common/m4/gst-doc.m4 | 148 + common/m4/gst-dowhile.m4 | 24 + common/m4/gst-error.m4 | 213 + common/m4/gst-feature.m4 | 284 + common/m4/gst-function.m4 | 63 + common/m4/gst-gettext.m4 | 21 + common/m4/gst-glib2.m4 | 75 + common/m4/gst-libxml2.m4 | 52 + common/m4/gst-package-release-datetime.m4 | 89 + common/m4/gst-parser.m4 | 55 + common/m4/gst-platform.m4 | 67 + common/m4/gst-plugin-docs.m4 | 21 + common/m4/gst-plugindir.m4 | 17 + common/m4/gst-valgrind.m4 | 35 + common/m4/gst-x11.m4 | 70 + common/m4/gst.m4 | 31 + common/m4/gtk-doc.m4 | 42 + common/m4/introspection.m4 | 94 + common/m4/orc.m4 | 70 + common/m4/pkg.m4 | 157 + common/mangle-tmpl.py | 163 + common/orc.mak | 76 + common/parallel-subdirs.mak | 13 + common/plugins.xsl | 209 + common/po.mak | 4 + common/release.mak | 25 + common/scangobj-merge.py | 309 + common/upload-doc.mak | 66 + common/win32.mak | 72 + compile | 310 + config.guess | 1517 + config.h.in | 436 + config.rpath | 666 + config.sub | 1760 + configure | 40834 ++++++++++ configure.ac | 1276 + debian/changelog | 534 + debian/compat | 1 + debian/control | 45 + debian/copyright | 31 + debian/gstreamer0.10-plugins-good.install.in | 1 + debian/rules | 215 + debian/rules.old | 214 + depcomp | 688 + docs/Makefile.am | 15 + docs/Makefile.in | 819 + docs/plugins/Makefile.am | 251 + docs/plugins/Makefile.in | 1309 + docs/plugins/gst-plugins-good-plugins-docs.sgml | 273 + docs/plugins/gst-plugins-good-plugins-sections.txt | 2523 + docs/plugins/gst-plugins-good-plugins.args | 22420 ++++++ docs/plugins/gst-plugins-good-plugins.hierarchy | 323 + docs/plugins/gst-plugins-good-plugins.interfaces | 68 + .../plugins/gst-plugins-good-plugins.prerequisites | 11 + docs/plugins/gst-plugins-good-plugins.signals | 682 + docs/plugins/gst-plugins-good-plugins.types | 5 + docs/plugins/html/GstIirEqualizer.html | 86 + docs/plugins/html/GstVideoMixer2Pad.html | 73 + docs/plugins/html/GstVideoMixerPad.html | 116 + docs/plugins/html/ch01.html | 533 + docs/plugins/html/ch02.html | 251 + docs/plugins/html/ch03.html | 41 + .../html/gst-plugins-good-plugins-3gppmux.html | 246 + .../html/gst-plugins-good-plugins-aacparse.html | 176 + .../html/gst-plugins-good-plugins-aasink.html | 277 + .../html/gst-plugins-good-plugins-ac3parse.html | 183 + .../html/gst-plugins-good-plugins-agingtv.html | 218 + .../html/gst-plugins-good-plugins-alawdec.html | 147 + .../html/gst-plugins-good-plugins-alawenc.html | 152 + .../html/gst-plugins-good-plugins-alpha.html | 454 + .../html/gst-plugins-good-plugins-alphacolor.html | 201 + .../html/gst-plugins-good-plugins-amrparse.html | 184 + .../html/gst-plugins-good-plugins-apedemux.html | 179 + .../html/gst-plugins-good-plugins-apev2mux.html | 153 + .../gst-plugins-good-plugins-aspectratiocrop.html | 342 + .../gst-plugins-good-plugins-audioamplify.html | 225 + .../gst-plugins-good-plugins-audiochebband.html | 261 + .../gst-plugins-good-plugins-audiocheblimit.html | 250 + .../gst-plugins-good-plugins-audiodynamic.html | 225 + .../html/gst-plugins-good-plugins-audioecho.html | 225 + .../gst-plugins-good-plugins-audiofirfilter.html | 567 + .../gst-plugins-good-plugins-audioiirfilter.html | 514 + .../html/gst-plugins-good-plugins-audioinvert.html | 199 + .../gst-plugins-good-plugins-audiokaraoke.html | 221 + .../gst-plugins-good-plugins-audiopanorama.html | 212 + .../gst-plugins-good-plugins-audiowsincband.html | 233 + .../gst-plugins-good-plugins-audiowsinclimit.html | 233 + .../html/gst-plugins-good-plugins-auparse.html | 163 + .../gst-plugins-good-plugins-autoaudiosink.html | 184 + .../gst-plugins-good-plugins-autoaudiosrc.html | 184 + .../gst-plugins-good-plugins-autovideosink.html | 184 + .../gst-plugins-good-plugins-autovideosrc.html | 184 + .../html/gst-plugins-good-plugins-avidemux.html | 645 + .../html/gst-plugins-good-plugins-avimux.html | 323 + .../html/gst-plugins-good-plugins-avisubtitle.html | 165 + .../html/gst-plugins-good-plugins-cacasink.html | 179 + .../gst-plugins-good-plugins-cairooverlay.html | 211 + .../html/gst-plugins-good-plugins-cairorender.html | 172 + .../gst-plugins-good-plugins-cairotextoverlay.html | 254 + .../gst-plugins-good-plugins-cairotimeoverlay.html | 145 + .../html/gst-plugins-good-plugins-capssetter.html | 208 + .../html/gst-plugins-good-plugins-cmmldec.html | 161 + .../html/gst-plugins-good-plugins-cmmlenc.html | 180 + .../html/gst-plugins-good-plugins-cutter.html | 231 + .../html/gst-plugins-good-plugins-dcaparse.html | 171 + .../html/gst-plugins-good-plugins-deinterlace.html | 394 + .../gst-plugins-good-plugins-deinterleave.html | 223 + .../html/gst-plugins-good-plugins-dicetv.html | 245 + .../gst-plugins-good-plugins-directsoundsink.html | 123 + .../html/gst-plugins-good-plugins-dv1394src.html | 241 + .../html/gst-plugins-good-plugins-dvdec.html | 194 + .../html/gst-plugins-good-plugins-dvdemux.html | 165 + .../html/gst-plugins-good-plugins-edgetv.html | 176 + ...gst-plugins-good-plugins-equalizer-10bands.html | 284 + .../gst-plugins-good-plugins-equalizer-3bands.html | 221 + .../gst-plugins-good-plugins-equalizer-nbands.html | 295 + .../html/gst-plugins-good-plugins-esdsink.html | 147 + .../html/gst-plugins-good-plugins-flacdec.html | 144 + .../html/gst-plugins-good-plugins-flacenc.html | 297 + .../html/gst-plugins-good-plugins-flacparse.html | 202 + .../html/gst-plugins-good-plugins-flactag.html | 152 + .../html/gst-plugins-good-plugins-flvdemux.html | 234 + .../html/gst-plugins-good-plugins-flvmux.html | 275 + .../html/gst-plugins-good-plugins-flxdec.html | 147 + .../html/gst-plugins-good-plugins-gamma.html | 368 + .../gst-plugins-good-plugins-gconfaudiosink.html | 129 + .../gst-plugins-good-plugins-gconfaudiosrc.html | 112 + .../gst-plugins-good-plugins-gconfvideosink.html | 112 + .../gst-plugins-good-plugins-gconfvideosrc.html | 112 + .../gst-plugins-good-plugins-gdkpixbufsink.html | 161 + .../html/gst-plugins-good-plugins-goom.html | 170 + .../html/gst-plugins-good-plugins-goom2k1.html | 171 + .../html/gst-plugins-good-plugins-gstrtpbin.html | 958 + ...st-plugins-good-plugins-gstrtpjitterbuffer.html | 410 + .../gst-plugins-good-plugins-gstrtpptdemux.html | 304 + .../gst-plugins-good-plugins-gstrtpsession.html | 776 + .../gst-plugins-good-plugins-gstrtpssrcdemux.html | 320 + .../gst-plugins-good-plugins-halaudiosink.html | 149 + .../html/gst-plugins-good-plugins-halaudiosrc.html | 149 + .../html/gst-plugins-good-plugins-hdv1394src.html | 184 + .../html/gst-plugins-good-plugins-icydemux.html | 172 + .../html/gst-plugins-good-plugins-id3demux.html | 199 + .../html/gst-plugins-good-plugins-id3v2mux.html | 153 + .../html/gst-plugins-good-plugins-imagefreeze.html | 183 + .../html/gst-plugins-good-plugins-interleave.html | 243 + .../html/gst-plugins-good-plugins-ismlmux.html | 234 + .../gst-plugins-good-plugins-jackaudiosink.html | 165 + .../gst-plugins-good-plugins-jackaudiosrc.html | 166 + .../html/gst-plugins-good-plugins-jpegdec.html | 198 + .../html/gst-plugins-good-plugins-jpegenc.html | 229 + .../html/gst-plugins-good-plugins-level.html | 529 + .../gst-plugins-good-plugins-matroskademux.html | 256 + .../html/gst-plugins-good-plugins-matroskamux.html | 394 + .../html/gst-plugins-good-plugins-mj2mux.html | 338 + .../html/gst-plugins-good-plugins-monoscope.html | 190 + .../html/gst-plugins-good-plugins-mp4mux.html | 351 + .../gst-plugins-good-plugins-mpegaudioparse.html | 171 + .../html/gst-plugins-good-plugins-mulawdec.html | 147 + .../html/gst-plugins-good-plugins-mulawenc.html | 152 + .../gst-plugins-good-plugins-multifilesink.html | 331 + .../gst-plugins-good-plugins-multifilesrc.html | 220 + .../gst-plugins-good-plugins-multipartdemux.html | 217 + .../gst-plugins-good-plugins-multipartmux.html | 186 + .../gst-plugins-good-plugins-multiudpsink.html | 466 + .../html/gst-plugins-good-plugins-optv.html | 211 + .../html/gst-plugins-good-plugins-oss4mixer.html | 135 + .../html/gst-plugins-good-plugins-oss4sink.html | 200 + .../html/gst-plugins-good-plugins-oss4src.html | 184 + .../html/gst-plugins-good-plugins-ossmixer.html | 135 + .../html/gst-plugins-good-plugins-osssink.html | 147 + .../html/gst-plugins-good-plugins-osssrc.html | 164 + .../gst-plugins-good-plugins-osxaudiosink.html | 116 + .../html/gst-plugins-good-plugins-osxaudiosrc.html | 117 + .../gst-plugins-good-plugins-osxvideosink.html | 122 + .../html/gst-plugins-good-plugins-plugin-1394.html | 80 + .../gst-plugins-good-plugins-plugin-aasink.html | 74 + .../html/gst-plugins-good-plugins-plugin-alaw.html | 80 + .../gst-plugins-good-plugins-plugin-alpha.html | 74 + ...gst-plugins-good-plugins-plugin-alphacolor.html | 74 + .../gst-plugins-good-plugins-plugin-annodex.html | 80 + .../gst-plugins-good-plugins-plugin-apetag.html | 74 + .../gst-plugins-good-plugins-plugin-audiofx.html | 120 + .../gst-plugins-good-plugins-plugin-auparse.html | 74 + ...gst-plugins-good-plugins-plugin-autodetect.html | 88 + .../html/gst-plugins-good-plugins-plugin-avi.html | 84 + .../gst-plugins-good-plugins-plugin-cacasink.html | 74 + .../gst-plugins-good-plugins-plugin-cairo.html | 88 + .../gst-plugins-good-plugins-plugin-cutter.html | 74 + .../gst-plugins-good-plugins-plugin-debug.html | 112 + ...st-plugins-good-plugins-plugin-deinterlace.html | 74 + ...st-plugins-good-plugins-plugin-directsound.html | 74 + .../html/gst-plugins-good-plugins-plugin-dv.html | 80 + .../gst-plugins-good-plugins-plugin-efence.html | 74 + .../gst-plugins-good-plugins-plugin-effectv.html | 120 + .../gst-plugins-good-plugins-plugin-equalizer.html | 84 + .../gst-plugins-good-plugins-plugin-esdsink.html | 74 + .../html/gst-plugins-good-plugins-plugin-flac.html | 84 + .../html/gst-plugins-good-plugins-plugin-flv.html | 80 + .../gst-plugins-good-plugins-plugin-flxdec.html | 74 + ...-plugins-good-plugins-plugin-gconfelements.html | 88 + .../gst-plugins-good-plugins-plugin-gdkpixbuf.html | 84 + .../html/gst-plugins-good-plugins-plugin-goom.html | 74 + .../gst-plugins-good-plugins-plugin-goom2k1.html | 74 + ...-plugins-good-plugins-plugin-gstrtpmanager.html | 92 + ...st-plugins-good-plugins-plugin-halelements.html | 80 + .../gst-plugins-good-plugins-plugin-icydemux.html | 74 + .../gst-plugins-good-plugins-plugin-id3demux.html | 74 + ...st-plugins-good-plugins-plugin-imagefreeze.html | 74 + ...gst-plugins-good-plugins-plugin-interleave.html | 80 + .../gst-plugins-good-plugins-plugin-isomp4.html | 108 + .../html/gst-plugins-good-plugins-plugin-jack.html | 80 + .../html/gst-plugins-good-plugins-plugin-jpeg.html | 88 + .../gst-plugins-good-plugins-plugin-level.html | 74 + .../gst-plugins-good-plugins-plugin-matroska.html | 88 + .../gst-plugins-good-plugins-plugin-monoscope.html | 74 + .../gst-plugins-good-plugins-plugin-mulaw.html | 80 + .../gst-plugins-good-plugins-plugin-multifile.html | 84 + .../gst-plugins-good-plugins-plugin-multipart.html | 80 + ...plugins-good-plugins-plugin-navigationtest.html | 74 + .../html/gst-plugins-good-plugins-plugin-oss4.html | 84 + .../gst-plugins-good-plugins-plugin-ossaudio.html | 84 + .../gst-plugins-good-plugins-plugin-osxaudio.html | 80 + .../gst-plugins-good-plugins-plugin-osxvideo.html | 74 + .../html/gst-plugins-good-plugins-plugin-png.html | 80 + ...gst-plugins-good-plugins-plugin-pulseaudio.html | 88 + ...gst-plugins-good-plugins-plugin-replaygain.html | 84 + .../html/gst-plugins-good-plugins-plugin-rtp.html | 348 + .../html/gst-plugins-good-plugins-plugin-rtsp.html | 80 + .../gst-plugins-good-plugins-plugin-shapewipe.html | 74 + ...gst-plugins-good-plugins-plugin-shout2send.html | 74 + .../gst-plugins-good-plugins-plugin-smpte.html | 80 + .../html/gst-plugins-good-plugins-plugin-soup.html | 80 + .../gst-plugins-good-plugins-plugin-spectrum.html | 74 + .../gst-plugins-good-plugins-plugin-speex.html | 80 + .../gst-plugins-good-plugins-plugin-taglib.html | 80 + .../html/gst-plugins-good-plugins-plugin-udp.html | 88 + ...t-plugins-good-plugins-plugin-video4linux2.html | 80 + .../gst-plugins-good-plugins-plugin-videobox.html | 74 + .../gst-plugins-good-plugins-plugin-videocrop.html | 80 + ...st-plugins-good-plugins-plugin-videofilter.html | 84 + ...gst-plugins-good-plugins-plugin-videomixer.html | 80 + .../gst-plugins-good-plugins-plugin-waveform.html | 74 + .../gst-plugins-good-plugins-plugin-wavenc.html | 74 + .../gst-plugins-good-plugins-plugin-wavpack.html | 84 + .../gst-plugins-good-plugins-plugin-wavparse.html | 74 + .../gst-plugins-good-plugins-plugin-ximagesrc.html | 74 + .../gst-plugins-good-plugins-plugin-y4menc.html | 74 + .../html/gst-plugins-good-plugins-pngdec.html | 152 + .../html/gst-plugins-good-plugins-pngenc.html | 178 + .../gst-plugins-good-plugins-progressreport.html | 251 + .../html/gst-plugins-good-plugins-pulsemixer.html | 143 + .../html/gst-plugins-good-plugins-pulsesink.html | 242 + .../html/gst-plugins-good-plugins-pulsesrc.html | 228 + .../html/gst-plugins-good-plugins-qtdemux.html | 261 + .../gst-plugins-good-plugins-qtmoovrecover.html | 201 + .../html/gst-plugins-good-plugins-qtmux.html | 417 + .../html/gst-plugins-good-plugins-quarktv.html | 210 + .../html/gst-plugins-good-plugins-radioactv.html | 227 + .../html/gst-plugins-good-plugins-revtv.html | 190 + .../html/gst-plugins-good-plugins-rganalysis.html | 357 + .../html/gst-plugins-good-plugins-rglimiter.html | 194 + .../html/gst-plugins-good-plugins-rgvolume.html | 366 + .../html/gst-plugins-good-plugins-rippletv.html | 217 + .../html/gst-plugins-good-plugins-rtpdec.html | 461 + .../html/gst-plugins-good-plugins-rtpj2kpay.html | 171 + .../html/gst-plugins-good-plugins-rtpjpegpay.html | 196 + .../html/gst-plugins-good-plugins-rtspsrc.html | 343 + .../gst-plugins-good-plugins-shagadelictv.html | 167 + .../html/gst-plugins-good-plugins-shapewipe.html | 257 + .../html/gst-plugins-good-plugins-smokedec.html | 144 + .../html/gst-plugins-good-plugins-smokeenc.html | 189 + .../html/gst-plugins-good-plugins-smpte.html | 256 + .../html/gst-plugins-good-plugins-smptealpha.html | 276 + .../html/gst-plugins-good-plugins-souphttpsrc.html | 277 + .../html/gst-plugins-good-plugins-spectrum.html | 576 + .../html/gst-plugins-good-plugins-speexdec.html | 162 + .../html/gst-plugins-good-plugins-speexenc.html | 247 + .../gst-plugins-good-plugins-splitfilesrc.html | 174 + .../html/gst-plugins-good-plugins-streaktv.html | 208 + .../html/gst-plugins-good-plugins-taginject.html | 196 + .../html/gst-plugins-good-plugins-udpsink.html | 185 + .../html/gst-plugins-good-plugins-udpsrc.html | 370 + .../html/gst-plugins-good-plugins-v4l2radio.html | 136 + .../html/gst-plugins-good-plugins-v4l2sink.html | 228 + .../html/gst-plugins-good-plugins-v4l2src.html | 360 + .../html/gst-plugins-good-plugins-vertigotv.html | 233 + .../gst-plugins-good-plugins-videobalance.html | 377 + .../html/gst-plugins-good-plugins-videobox.html | 444 + .../html/gst-plugins-good-plugins-videocrop.html | 386 + .../html/gst-plugins-good-plugins-videoflip.html | 388 + .../html/gst-plugins-good-plugins-videomixer.html | 456 + .../html/gst-plugins-good-plugins-videomixer2.html | 475 + .../html/gst-plugins-good-plugins-warptv.html | 191 + .../gst-plugins-good-plugins-waveformsink.html | 128 + .../html/gst-plugins-good-plugins-wavenc.html | 171 + .../html/gst-plugins-good-plugins-wavpackdec.html | 144 + .../html/gst-plugins-good-plugins-wavpackenc.html | 241 + .../gst-plugins-good-plugins-wavpackparse.html | 169 + .../html/gst-plugins-good-plugins-wavparse.html | 289 + .../html/gst-plugins-good-plugins-webmmux.html | 216 + .../html/gst-plugins-good-plugins-ximagesrc.html | 227 + .../html/gst-plugins-good-plugins-y4menc.html | 164 + .../plugins/html/gst-plugins-good-plugins.devhelp2 | 1463 + docs/plugins/html/home.png | Bin 0 -> 654 bytes docs/plugins/html/index.html | 770 + docs/plugins/html/index.sgml | 2271 + docs/plugins/html/left.png | Bin 0 -> 459 bytes docs/plugins/html/right.png | Bin 0 -> 472 bytes docs/plugins/html/style.css | 266 + docs/plugins/html/up.png | Bin 0 -> 406 bytes docs/plugins/inspect/plugin-1394.xml | 43 + docs/plugins/inspect/plugin-aasink.xml | 28 + docs/plugins/inspect/plugin-alaw.xml | 55 + docs/plugins/inspect/plugin-alpha.xml | 36 + docs/plugins/inspect/plugin-alphacolor.xml | 34 + docs/plugins/inspect/plugin-annodex.xml | 55 + docs/plugins/inspect/plugin-apetag.xml | 34 + docs/plugins/inspect/plugin-audiofx.xml | 265 + docs/plugins/inspect/plugin-audioparsers.xml | 139 + docs/plugins/inspect/plugin-auparse.xml | 34 + docs/plugins/inspect/plugin-autodetect.xml | 73 + docs/plugins/inspect/plugin-avi.xml | 94 + docs/plugins/inspect/plugin-cacasink.xml | 28 + docs/plugins/inspect/plugin-cairo.xml | 103 + docs/plugins/inspect/plugin-cutter.xml | 34 + docs/plugins/inspect/plugin-debug.xml | 211 + docs/plugins/inspect/plugin-deinterlace.xml | 34 + docs/plugins/inspect/plugin-directsound.xml | 20 + docs/plugins/inspect/plugin-dv.xml | 61 + docs/plugins/inspect/plugin-efence.xml | 34 + docs/plugins/inspect/plugin-effectv.xml | 265 + docs/plugins/inspect/plugin-equalizer.xml | 76 + docs/plugins/inspect/plugin-esdsink.xml | 28 + docs/plugins/inspect/plugin-flac.xml | 76 + docs/plugins/inspect/plugin-flv.xml | 67 + docs/plugins/inspect/plugin-flxdec.xml | 34 + docs/plugins/inspect/plugin-gconfelements.xml | 49 + docs/plugins/inspect/plugin-gdkpixbuf.xml | 70 + docs/plugins/inspect/plugin-goom.xml | 34 + docs/plugins/inspect/plugin-goom2k1.xml | 34 + docs/plugins/inspect/plugin-gstrtpmanager.xml | 190 + docs/plugins/inspect/plugin-halelements.xml | 43 + docs/plugins/inspect/plugin-icydemux.xml | 34 + docs/plugins/inspect/plugin-id3demux.xml | 34 + docs/plugins/inspect/plugin-imagefreeze.xml | 34 + docs/plugins/inspect/plugin-interleave.xml | 55 + docs/plugins/inspect/plugin-isomp4.xml | 238 + docs/plugins/inspect/plugin-jack.xml | 43 + docs/plugins/inspect/plugin-jpeg.xml | 97 + docs/plugins/inspect/plugin-level.xml | 34 + docs/plugins/inspect/plugin-matroska.xml | 127 + docs/plugins/inspect/plugin-monoscope.xml | 34 + docs/plugins/inspect/plugin-mulaw.xml | 55 + docs/plugins/inspect/plugin-multifile.xml | 58 + docs/plugins/inspect/plugin-multipart.xml | 55 + docs/plugins/inspect/plugin-navigationtest.xml | 34 + docs/plugins/inspect/plugin-oss4.xml | 52 + docs/plugins/inspect/plugin-ossaudio.xml | 52 + docs/plugins/inspect/plugin-osxaudio.xml | 27 + docs/plugins/inspect/plugin-osxvideo.xml | 20 + docs/plugins/inspect/plugin-png.xml | 55 + docs/plugins/inspect/plugin-pulseaudio.xml | 67 + docs/plugins/inspect/plugin-replaygain.xml | 76 + docs/plugins/inspect/plugin-rtp.xml | 1474 + docs/plugins/inspect/plugin-rtsp.xml | 61 + docs/plugins/inspect/plugin-shapewipe.xml | 40 + docs/plugins/inspect/plugin-shout2send.xml | 28 + docs/plugins/inspect/plugin-smpte.xml | 61 + docs/plugins/inspect/plugin-soup.xml | 43 + docs/plugins/inspect/plugin-spectrum.xml | 34 + docs/plugins/inspect/plugin-speex.xml | 55 + docs/plugins/inspect/plugin-taglib.xml | 55 + docs/plugins/inspect/plugin-udp.xml | 73 + docs/plugins/inspect/plugin-video4linux2.xml | 37 + docs/plugins/inspect/plugin-videobox.xml | 34 + docs/plugins/inspect/plugin-videocrop.xml | 55 + docs/plugins/inspect/plugin-videofilter.xml | 76 + docs/plugins/inspect/plugin-videomixer.xml | 55 + docs/plugins/inspect/plugin-waveform.xml | 20 + docs/plugins/inspect/plugin-wavenc.xml | 34 + docs/plugins/inspect/plugin-wavpack.xml | 88 + docs/plugins/inspect/plugin-wavparse.xml | 34 + docs/plugins/inspect/plugin-ximagesrc.xml | 28 + docs/plugins/inspect/plugin-y4menc.xml | 34 + docs/plugins/scanobj-build.stamp | 0 docs/random/ChangeLog-0.8 | 17501 +++++ docs/version.entities.in | 2 + ext/Makefile.am | 180 + ext/Makefile.in | 919 + ext/aalib/Makefile.am | 9 + ext/aalib/Makefile.in | 805 + ext/aalib/gstaasink.c | 587 + ext/aalib/gstaasink.h | 79 + ext/annodex/Makefile.am | 19 + ext/annodex/Makefile.in | 863 + ext/annodex/gstannodex.c | 167 + ext/annodex/gstannodex.h | 34 + ext/annodex/gstcmmldec.c | 708 + ext/annodex/gstcmmldec.h | 98 + ext/annodex/gstcmmlenc.c | 631 + ext/annodex/gstcmmlenc.h | 79 + ext/annodex/gstcmmlparser.c | 648 + ext/annodex/gstcmmlparser.h | 92 + ext/annodex/gstcmmltag.c | 579 + ext/annodex/gstcmmltag.h | 133 + ext/annodex/gstcmmlutils.c | 388 + ext/annodex/gstcmmlutils.h | 53 + ext/cairo/Makefile.am | 45 + ext/cairo/Makefile.in | 942 + ext/cairo/gstcairo-marshal.list | 2 + ext/cairo/gstcairo.c | 59 + ext/cairo/gstcairooverlay.c | 250 + ext/cairo/gstcairooverlay.h | 63 + ext/cairo/gstcairorender.c | 383 + ext/cairo/gstcairorender.h | 63 + ext/cairo/gsttextoverlay.c | 1042 + ext/cairo/gsttextoverlay.h | 90 + ext/cairo/gsttimeoverlay.c | 316 + ext/cairo/gsttimeoverlay.h | 59 + ext/dv/Makefile.am | 20 + ext/dv/Makefile.in | 890 + ext/dv/NOTES | 13 + ext/dv/gstdv.c | 48 + ext/dv/gstdvdec.c | 617 + ext/dv/gstdvdec.h | 95 + ext/dv/gstdvdemux.c | 1908 + ext/dv/gstdvdemux.h | 98 + ext/dv/gstsmptetimecode.c | 240 + ext/dv/gstsmptetimecode.h | 70 + ext/dv/smpte_test.c | 81 + ext/esd/Makefile.am | 14 + ext/esd/Makefile.in | 821 + ext/esd/esdmon.h | 77 + ext/esd/esdsink.c | 468 + ext/esd/esdsink.h | 64 + ext/esd/gstesd.c | 60 + ext/flac/Makefile.am | 13 + ext/flac/Makefile.in | 838 + ext/flac/gstflac.c | 60 + ext/flac/gstflacdec.c | 2176 + ext/flac/gstflacdec.h | 101 + ext/flac/gstflacenc.c | 1399 + ext/flac/gstflacenc.h | 79 + ext/flac/gstflactag.c | 490 + ext/flac/gstflactag.h | 78 + ext/gconf/Makefile.am | 27 + ext/gconf/Makefile.in | 888 + ext/gconf/gstgconf.c | 304 + ext/gconf/gstgconf.h | 66 + ext/gconf/gstgconfaudiosink.c | 310 + ext/gconf/gstgconfaudiosink.h | 62 + ext/gconf/gstgconfaudiosrc.c | 210 + ext/gconf/gstgconfaudiosrc.h | 57 + ext/gconf/gstgconfelements.c | 59 + ext/gconf/gstgconfelements.h | 28 + ext/gconf/gstgconfvideosink.c | 210 + ext/gconf/gstgconfvideosink.h | 64 + ext/gconf/gstgconfvideosrc.c | 209 + ext/gconf/gstgconfvideosrc.h | 58 + ext/gconf/gstswitchsink.c | 269 + ext/gconf/gstswitchsink.h | 62 + ext/gconf/gstswitchsrc.c | 261 + ext/gconf/gstswitchsrc.h | 57 + ext/gdk_pixbuf/Makefile.am | 19 + ext/gdk_pixbuf/Makefile.in | 837 + ext/gdk_pixbuf/gstgdkanimation.h | 117 + ext/gdk_pixbuf/gstgdkpixbuf.c | 558 + ext/gdk_pixbuf/gstgdkpixbuf.h | 70 + ext/gdk_pixbuf/gstgdkpixbufsink.c | 426 + ext/gdk_pixbuf/gstgdkpixbufsink.h | 75 + ext/gdk_pixbuf/pixbufscale.c | 483 + ext/gdk_pixbuf/pixbufscale.h | 84 + ext/hal/Makefile.am | 18 + ext/hal/Makefile.in | 843 + ext/hal/gsthalaudiosink.c | 250 + ext/hal/gsthalaudiosink.h | 58 + ext/hal/gsthalaudiosrc.c | 251 + ext/hal/gsthalaudiosrc.h | 52 + ext/hal/gsthalelements.c | 54 + ext/hal/gsthalelements.h | 29 + ext/hal/hal.c | 397 + ext/hal/hal.h | 48 + ext/jack/Makefile.am | 10 + ext/jack/Makefile.in | 840 + ext/jack/gstjack.c | 97 + ext/jack/gstjack.h | 55 + ext/jack/gstjackaudioclient.c | 527 + ext/jack/gstjackaudioclient.h | 59 + ext/jack/gstjackaudiosink.c | 903 + ext/jack/gstjackaudiosink.h | 80 + ext/jack/gstjackaudiosrc.c | 924 + ext/jack/gstjackaudiosrc.h | 98 + ext/jack/gstjackringbuffer.h | 88 + ext/jack/gstjackutil.c | 114 + ext/jack/gstjackutil.h | 30 + ext/jpeg/Makefile.am | 21 + ext/jpeg/Makefile.in | 863 + ext/jpeg/README | 20 + ext/jpeg/gstjpeg.c | 77 + ext/jpeg/gstjpeg.h | 35 + ext/jpeg/gstjpegdec.c | 1873 + ext/jpeg/gstjpegdec.h | 150 + ext/jpeg/gstjpegenc.c | 744 + ext/jpeg/gstjpegenc.h | 109 + ext/jpeg/gstsmokedec.c | 332 + ext/jpeg/gstsmokedec.h | 75 + ext/jpeg/gstsmokeenc.c | 509 + ext/jpeg/gstsmokeenc.h | 75 + ext/jpeg/smokecodec.c | 709 + ext/jpeg/smokecodec.h | 119 + ext/jpeg/smokeformat.h | 46 + ext/libcaca/Makefile.am | 16 + ext/libcaca/Makefile.in | 814 + ext/libcaca/gstcacasink.c | 426 + ext/libcaca/gstcacasink.h | 72 + ext/libpng/Makefile.am | 10 + ext/libpng/Makefile.in | 824 + ext/libpng/gstpng.c | 47 + ext/libpng/gstpngdec.c | 898 + ext/libpng/gstpngdec.h | 84 + ext/libpng/gstpngenc.c | 432 + ext/libpng/gstpngenc.h | 75 + ext/pulse/Makefile.am | 29 + ext/pulse/Makefile.in | 895 + ext/pulse/plugin.c | 70 + ext/pulse/pulseaudiosink.c | 938 + ext/pulse/pulsemixer.c | 282 + ext/pulse/pulsemixer.h | 68 + ext/pulse/pulsemixerctrl.c | 640 + ext/pulse/pulsemixerctrl.h | 175 + ext/pulse/pulsemixertrack.c | 67 + ext/pulse/pulsemixertrack.h | 60 + ext/pulse/pulseprobe.c | 416 + ext/pulse/pulseprobe.h | 127 + ext/pulse/pulsesink.c | 3024 + ext/pulse/pulsesink.h | 182 + ext/pulse/pulsesrc.c | 1750 + ext/pulse/pulsesrc.h | 102 + ext/pulse/pulseutil.c | 337 + ext/pulse/pulseutil.h | 52 + ext/raw1394/Makefile.am | 29 + ext/raw1394/Makefile.in | 864 + ext/raw1394/gst1394.c | 51 + ext/raw1394/gst1394clock.c | 154 + ext/raw1394/gst1394clock.h | 77 + ext/raw1394/gst1394probe.c | 140 + ext/raw1394/gst1394probe.h | 32 + ext/raw1394/gstdv1394src.c | 1134 + ext/raw1394/gstdv1394src.h | 101 + ext/raw1394/gsthdv1394src.c | 844 + ext/raw1394/gsthdv1394src.h | 85 + ext/shout2/Makefile.am | 9 + ext/shout2/Makefile.in | 805 + ext/shout2/gstshout2.c | 852 + ext/shout2/gstshout2.h | 97 + ext/soup/Makefile.am | 10 + ext/soup/Makefile.in | 824 + ext/soup/gstsoup.c | 47 + ext/soup/gstsouphttpclientsink.c | 765 + ext/soup/gstsouphttpclientsink.h | 81 + ext/soup/gstsouphttpsrc.c | 1676 + ext/soup/gstsouphttpsrc.h | 107 + ext/speex/Makefile.am | 18 + ext/speex/Makefile.in | 834 + ext/speex/gstspeex.c | 49 + ext/speex/gstspeexdec.c | 549 + ext/speex/gstspeexdec.h | 80 + ext/speex/gstspeexenc.c | 850 + ext/speex/gstspeexenc.h | 102 + ext/taglib/Makefile.am | 19 + ext/taglib/Makefile.in | 872 + ext/taglib/gstapev2mux.cc | 373 + ext/taglib/gstapev2mux.h | 55 + ext/taglib/gstid3v2mux.cc | 775 + ext/taglib/gstid3v2mux.h | 54 + ext/taglib/gsttaglibmux.c | 402 + ext/taglib/gsttaglibmux.h | 71 + ext/wavpack/Makefile.am | 24 + ext/wavpack/Makefile.in | 868 + ext/wavpack/gstwavpack.c | 56 + ext/wavpack/gstwavpackcommon.c | 282 + ext/wavpack/gstwavpackcommon.h | 75 + ext/wavpack/gstwavpackdec.c | 512 + ext/wavpack/gstwavpackdec.h | 80 + ext/wavpack/gstwavpackenc.c | 1049 + ext/wavpack/gstwavpackenc.h | 104 + ext/wavpack/gstwavpackparse.c | 1344 + ext/wavpack/gstwavpackparse.h | 97 + ext/wavpack/gstwavpackstreamreader.c | 124 + ext/wavpack/gstwavpackstreamreader.h | 36 + gconf/Makefile.am | 31 + gconf/Makefile.in | 683 + gconf/gstreamer-0.10.schemas | 191 + gconf/gstreamer.schemas.in | 191 + gst-libs/gst/gettext.h | 69 + gst-libs/gst/glib-compat-private.h | 135 + gst-libs/gst/gst-i18n-plugin.h | 47 + gst-plugins-good.doap | 395 + gst-plugins-good.manifest | 5 + gst-plugins-good.spec.in | 174 + gst/Makefile.am | 4 + gst/Makefile.in | 823 + gst/alpha/Makefile.am | 33 + gst/alpha/Makefile.in | 852 + gst/alpha/gstalpha.c | 2654 + gst/alpha/gstalpha.h | 121 + gst/alpha/gstalphacolor.c | 672 + gst/alpha/gstalphacolor.h | 60 + gst/apetag/Makefile.am | 30 + gst/apetag/Makefile.in | 828 + gst/apetag/gstapedemux.c | 436 + gst/apetag/gstapedemux.h | 52 + gst/audiofx/Makefile.am | 66 + gst/audiofx/Makefile.in | 995 + gst/audiofx/audioamplify.c | 504 + gst/audiofx/audioamplify.h | 63 + gst/audiofx/audiochebband.c | 668 + gst/audiofx/audiochebband.h | 64 + gst/audiofx/audiocheblimit.c | 570 + gst/audiofx/audiocheblimit.h | 66 + gst/audiofx/audiodynamic.c | 720 + gst/audiofx/audiodynamic.h | 65 + gst/audiofx/audioecho.c | 402 + gst/audiofx/audioecho.h | 69 + gst/audiofx/audiofirfilter.c | 266 + gst/audiofx/audiofirfilter.h | 72 + gst/audiofx/audiofx.c | 82 + gst/audiofx/audiofxbasefirfilter.c | 1092 + gst/audiofx/audiofxbasefirfilter.h | 99 + gst/audiofx/audiofxbaseiirfilter.c | 406 + gst/audiofx/audiofxbaseiirfilter.h | 77 + gst/audiofx/audioiirfilter.c | 287 + gst/audiofx/audioiirfilter.h | 71 + gst/audiofx/audioinvert.c | 260 + gst/audiofx/audioinvert.h | 60 + gst/audiofx/audiokaraoke.c | 363 + gst/audiofx/audiokaraoke.h | 70 + gst/audiofx/audiopanorama.c | 680 + gst/audiofx/audiopanorama.h | 62 + gst/audiofx/audiowsincband.c | 485 + gst/audiofx/audiowsincband.h | 80 + gst/audiofx/audiowsinclimit.c | 409 + gst/audiofx/audiowsinclimit.h | 80 + gst/audiofx/math_compat.h | 55 + gst/audioparsers/Makefile.am | 18 + gst/audioparsers/Makefile.in | 872 + gst/audioparsers/gstaacparse.c | 925 + gst/audioparsers/gstaacparse.h | 100 + gst/audioparsers/gstac3parse.c | 701 + gst/audioparsers/gstac3parse.h | 81 + gst/audioparsers/gstamrparse.c | 605 + gst/audioparsers/gstamrparse.h | 82 + gst/audioparsers/gstdcaparse.c | 486 + gst/audioparsers/gstdcaparse.h | 78 + gst/audioparsers/gstflacparse.c | 1467 + gst/audioparsers/gstflacparse.h | 95 + gst/audioparsers/gstmpegaudioparse.c | 1318 + gst/audioparsers/gstmpegaudioparse.h | 111 + gst/audioparsers/plugin.c | 57 + gst/auparse/Makefile.am | 23 + gst/auparse/Makefile.in | 819 + gst/auparse/gstauparse.c | 822 + gst/auparse/gstauparse.h | 75 + gst/autodetect/Makefile.am | 33 + gst/autodetect/Makefile.in | 867 + gst/autodetect/gstautoaudiosink.c | 445 + gst/autodetect/gstautoaudiosink.h | 57 + gst/autodetect/gstautoaudiosrc.c | 447 + gst/autodetect/gstautoaudiosrc.h | 58 + gst/autodetect/gstautodetect.c | 54 + gst/autodetect/gstautodetect.h | 26 + gst/autodetect/gstautovideosink.c | 433 + gst/autodetect/gstautovideosink.h | 57 + gst/autodetect/gstautovideosrc.c | 435 + gst/autodetect/gstautovideosrc.h | 58 + gst/avi/Makefile.am | 45 + gst/avi/Makefile.in | 863 + gst/avi/README | 72 + gst/avi/avi-ids.h | 78 + gst/avi/gstavi.c | 59 + gst/avi/gstavidemux.c | 6273 ++ gst/avi/gstavidemux.h | 243 + gst/avi/gstavimux.c | 2180 + gst/avi/gstavimux.h | 197 + gst/avi/gstavisubtitle.c | 383 + gst/avi/gstavisubtitle.h | 39 + gst/cutter/Makefile.am | 25 + gst/cutter/Makefile.in | 820 + gst/cutter/README | 38 + gst/cutter/filter.func | 16 + gst/cutter/gstcutter.c | 465 + gst/cutter/gstcutter.h | 86 + gst/debugutils/Makefile.am | 66 + gst/debugutils/Makefile.in | 994 + gst/debugutils/breakmydata.c | 295 + gst/debugutils/cpureport.c | 153 + gst/debugutils/cpureport.h | 58 + gst/debugutils/efence.c | 532 + gst/debugutils/efence.h | 42 + gst/debugutils/gstcapsdebug.c | 267 + gst/debugutils/gstcapsdebug.h | 55 + gst/debugutils/gstcapssetter.c | 337 + gst/debugutils/gstcapssetter.h | 63 + gst/debugutils/gstdebug.c | 74 + gst/debugutils/gstnavigationtest.c | 352 + gst/debugutils/gstnavigationtest.h | 68 + gst/debugutils/gstnavseek.c | 399 + gst/debugutils/gstnavseek.h | 60 + gst/debugutils/gstpushfilesrc.c | 191 + gst/debugutils/gstpushfilesrc.h | 56 + gst/debugutils/gsttaginject.c | 209 + gst/debugutils/gsttaginject.h | 66 + gst/debugutils/progressreport.c | 512 + gst/debugutils/progressreport.h | 67 + gst/debugutils/rndbuffersize.c | 373 + gst/debugutils/testplugin.c | 313 + gst/debugutils/tests.c | 265 + gst/debugutils/tests.h | 43 + gst/deinterlace/Makefile.am | 68 + gst/deinterlace/Makefile.in | 1051 + gst/deinterlace/gstdeinterlace.c | 2695 + gst/deinterlace/gstdeinterlace.h | 200 + gst/deinterlace/gstdeinterlacemethod.c | 811 + gst/deinterlace/gstdeinterlacemethod.h | 226 + gst/deinterlace/tvtime-dist.c | 1020 + gst/deinterlace/tvtime-dist.h | 80 + gst/deinterlace/tvtime.orc | 109 + gst/deinterlace/tvtime/greedy.c | 250 + gst/deinterlace/tvtime/greedyh.asm | 472 + gst/deinterlace/tvtime/greedyh.c | 1078 + gst/deinterlace/tvtime/greedyhmacros.h | 83 + gst/deinterlace/tvtime/linear.c | 129 + gst/deinterlace/tvtime/linearblend.c | 214 + gst/deinterlace/tvtime/mmx.h | 723 + gst/deinterlace/tvtime/plugins.h | 54 + gst/deinterlace/tvtime/scalerbob.c | 118 + gst/deinterlace/tvtime/sse.h | 992 + gst/deinterlace/tvtime/tomsmocomp.c | 216 + gst/deinterlace/tvtime/tomsmocomp/SearchLoop0A.inc | 15 + .../tvtime/tomsmocomp/SearchLoopBottom.inc | 174 + .../tvtime/tomsmocomp/SearchLoopEdgeA.inc | 11 + .../tvtime/tomsmocomp/SearchLoopEdgeA8.inc | 12 + .../tvtime/tomsmocomp/SearchLoopOddA.inc | 10 + .../tvtime/tomsmocomp/SearchLoopOddA2.inc | 5 + .../tvtime/tomsmocomp/SearchLoopOddA6.inc | 11 + .../tvtime/tomsmocomp/SearchLoopOddAH.inc | 10 + .../tvtime/tomsmocomp/SearchLoopOddAH2.inc | 5 + .../tvtime/tomsmocomp/SearchLoopTop.inc | 254 + gst/deinterlace/tvtime/tomsmocomp/SearchLoopVA.inc | 6 + .../tvtime/tomsmocomp/SearchLoopVAH.inc | 6 + gst/deinterlace/tvtime/tomsmocomp/StrangeBob.inc | 435 + .../tvtime/tomsmocomp/TomsMoCompAll.inc | 266 + .../tvtime/tomsmocomp/TomsMoCompAll2.inc | 243 + gst/deinterlace/tvtime/tomsmocomp/WierdBob.inc | 286 + .../tvtime/tomsmocomp/tomsmocompmacros.h | 164 + gst/deinterlace/tvtime/vfir.c | 318 + gst/deinterlace/tvtime/weave.c | 173 + gst/deinterlace/tvtime/weavebff.c | 174 + gst/deinterlace/tvtime/weavetff.c | 175 + gst/deinterlace/tvtime/x86-64_macros.inc | 82 + gst/effectv/Makefile.am | 38 + gst/effectv/Makefile.in | 942 + gst/effectv/gstaging.c | 428 + gst/effectv/gstaging.h | 91 + gst/effectv/gstdice.c | 325 + gst/effectv/gstdice.h | 76 + gst/effectv/gstedge.c | 263 + gst/effectv/gstedge.h | 71 + gst/effectv/gsteffectv.c | 83 + gst/effectv/gsteffectv.h | 33 + gst/effectv/gstop.c | 432 + gst/effectv/gstop.h | 75 + gst/effectv/gstquark.c | 309 + gst/effectv/gstquark.h | 72 + gst/effectv/gstradioac.c | 632 + gst/effectv/gstradioac.h | 90 + gst/effectv/gstrev.c | 273 + gst/effectv/gstrev.h | 88 + gst/effectv/gstripple.c | 622 + gst/effectv/gstripple.h | 87 + gst/effectv/gstshagadelic.c | 270 + gst/effectv/gstshagadelic.h | 74 + gst/effectv/gststreak.c | 279 + gst/effectv/gststreak.h | 75 + gst/effectv/gstvertigo.c | 328 + gst/effectv/gstvertigo.h | 72 + gst/effectv/gstwarp.c | 288 + gst/effectv/gstwarp.h | 69 + gst/equalizer/GstIirEqualizer10Bands.prs | 174 + gst/equalizer/GstIirEqualizer3Bands.prs | 14 + gst/equalizer/Makefile.am | 36 + gst/equalizer/Makefile.in | 881 + gst/equalizer/gstiirequalizer.c | 942 + gst/equalizer/gstiirequalizer.h | 78 + gst/equalizer/gstiirequalizer10bands.c | 247 + gst/equalizer/gstiirequalizer10bands.h | 51 + gst/equalizer/gstiirequalizer3bands.c | 161 + gst/equalizer/gstiirequalizer3bands.h | 51 + gst/equalizer/gstiirequalizernbands.c | 169 + gst/equalizer/gstiirequalizernbands.h | 52 + gst/flv/Makefile.am | 24 + gst/flv/Makefile.in | 830 + gst/flv/amfdefs.h | 44 + gst/flv/gstflvdemux.c | 3309 + gst/flv/gstflvdemux.h | 156 + gst/flv/gstflvmux.c | 1579 + gst/flv/gstflvmux.h | 93 + gst/flx/Makefile.am | 24 + gst/flx/Makefile.in | 829 + gst/flx/flx_color.c | 118 + gst/flx/flx_color.h | 52 + gst/flx/flx_fmt.h | 200 + gst/flx/gstflxdec.c | 690 + gst/flx/gstflxdec.h | 82 + gst/goom/Makefile.am | 61 + gst/goom/Makefile.in | 1012 + gst/goom/README | 13 + gst/goom/config_param.c | 144 + gst/goom/convolve_fx.c | 368 + gst/goom/drawmethods.c | 222 + gst/goom/drawmethods.h | 27 + gst/goom/filters.c | 872 + gst/goom/flying_stars_fx.c | 361 + gst/goom/goom.h | 42 + gst/goom/goom_config.h | 45 + gst/goom/goom_config_param.h | 134 + gst/goom/goom_core.c | 853 + gst/goom/goom_filters.h | 70 + gst/goom/goom_fx.h | 30 + gst/goom/goom_graphic.h | 92 + gst/goom/goom_plugin_info.h | 181 + gst/goom/goom_tools.c | 50 + gst/goom/goom_tools.h | 53 + gst/goom/goom_typedefs.h | 29 + gst/goom/goom_visual_fx.h | 35 + gst/goom/graphic.c | 28 + gst/goom/gstgoom.c | 676 + gst/goom/gstgoom.h | 88 + gst/goom/ifs.c | 774 + gst/goom/ifs.h | 54 + gst/goom/lines.c | 257 + gst/goom/lines.h | 94 + gst/goom/mathtools.c | 106 + gst/goom/mathtools.h | 58 + gst/goom/mmx.c | 291 + gst/goom/mmx.h | 729 + gst/goom/motif_goom1.h | 1044 + gst/goom/motif_goom2.h | 1044 + gst/goom/plugin_info.c | 264 + gst/goom/ppc_drawings.h | 28 + gst/goom/ppc_drawings.s | 394 + gst/goom/ppc_zoom_ultimate.h | 25 + gst/goom/ppc_zoom_ultimate.s | 336 + gst/goom/sound_tester.c | 161 + gst/goom/sound_tester.h | 29 + gst/goom/surf3d.c | 152 + gst/goom/surf3d.h | 57 + gst/goom/tentacle3d.c | 357 + gst/goom/tentacle3d.h | 26 + gst/goom/v3d.c | 38 + gst/goom/v3d.h | 83 + gst/goom/xmmx.c | 402 + gst/goom/xmmx.h | 537 + gst/goom2k1/Makefile.am | 29 + gst/goom2k1/Makefile.in | 857 + gst/goom2k1/README | 5 + gst/goom2k1/filters.c | 606 + gst/goom2k1/filters.h | 83 + gst/goom2k1/goom_core.c | 411 + gst/goom2k1/goom_core.h | 43 + gst/goom2k1/goom_tools.h | 24 + gst/goom2k1/graphic.c | 14 + gst/goom2k1/graphic.h | 23 + gst/goom2k1/gstgoom.c | 661 + gst/goom2k1/gstgoom.h | 88 + gst/goom2k1/lines.c | 107 + gst/goom2k1/lines.h | 16 + gst/icydemux/Makefile.am | 23 + gst/icydemux/Makefile.in | 820 + gst/icydemux/gsticydemux.c | 651 + gst/icydemux/gsticydemux.h | 87 + gst/id3demux/Makefile.am | 24 + gst/id3demux/Makefile.in | 821 + gst/id3demux/gstid3demux.c | 287 + gst/id3demux/gstid3demux.h | 59 + gst/imagefreeze/Makefile.am | 24 + gst/imagefreeze/Makefile.in | 819 + gst/imagefreeze/gstimagefreeze.c | 927 + gst/imagefreeze/gstimagefreeze.h | 74 + gst/interleave/Makefile.am | 24 + gst/interleave/Makefile.in | 837 + gst/interleave/deinterleave.c | 889 + gst/interleave/deinterleave.h | 75 + gst/interleave/interleave.c | 1306 + gst/interleave/interleave.h | 89 + gst/interleave/plugin.c | 44 + gst/interleave/plugin.h | 31 + gst/isomp4/Makefile.am | 55 + gst/isomp4/Makefile.in | 958 + gst/isomp4/atoms.c | 4494 ++ gst/isomp4/atoms.h | 959 + gst/isomp4/atomsrecovery.c | 1104 + gst/isomp4/atomsrecovery.h | 159 + gst/isomp4/descriptors.c | 457 + gst/isomp4/descriptors.h | 151 + gst/isomp4/fourcc.h | 232 + gst/isomp4/ftypcc.h | 68 + gst/isomp4/gstqtmoovrecover.c | 395 + gst/isomp4/gstqtmoovrecover.h | 88 + gst/isomp4/gstqtmux-doc.c | 300 + gst/isomp4/gstqtmux-doc.h | 52 + gst/isomp4/gstqtmux.c | 3628 + gst/isomp4/gstqtmux.h | 232 + gst/isomp4/gstqtmuxmap.c | 391 + gst/isomp4/gstqtmuxmap.h | 84 + gst/isomp4/gstrtpxqtdepay.c | 694 + gst/isomp4/gstrtpxqtdepay.h | 64 + gst/isomp4/isomp4-plugin.c | 74 + gst/isomp4/properties.c | 210 + gst/isomp4/properties.h | 87 + gst/isomp4/qtatomparser.h | 139 + gst/isomp4/qtdemux.c | 10229 +++ gst/isomp4/qtdemux.h | 140 + gst/isomp4/qtdemux_dump.c | 767 + gst/isomp4/qtdemux_dump.h | 78 + gst/isomp4/qtdemux_fourcc.h | 219 + gst/isomp4/qtdemux_lang.c | 205 + gst/isomp4/qtdemux_lang.h | 31 + gst/isomp4/qtdemux_types.c | 180 + gst/isomp4/qtdemux_types.h | 82 + gst/isomp4/qtpalette.h | 137 + gst/law/Makefile.am | 40 + gst/law/Makefile.in | 894 + gst/law/alaw-decode.c | 344 + gst/law/alaw-decode.h | 58 + gst/law/alaw-encode.c | 524 + gst/law/alaw-encode.h | 59 + gst/law/alaw.c | 77 + gst/law/mulaw-conversion.c | 118 + gst/law/mulaw-conversion.h | 12 + gst/law/mulaw-decode.c | 307 + gst/law/mulaw-decode.h | 58 + gst/law/mulaw-encode.c | 297 + gst/law/mulaw-encode.h | 59 + gst/law/mulaw.c | 75 + gst/level/Makefile.am | 24 + gst/level/Makefile.in | 819 + gst/level/gstlevel.c | 727 + gst/level/gstlevel.h | 96 + gst/matroska/Makefile.am | 58 + gst/matroska/Makefile.in | 937 + gst/matroska/ebml-ids.h | 54 + gst/matroska/ebml-read.c | 671 + gst/matroska/ebml-read.h | 170 + gst/matroska/ebml-write.c | 882 + gst/matroska/ebml-write.h | 152 + gst/matroska/lzo.c | 288 + gst/matroska/lzo.h | 35 + gst/matroska/matroska-demux.c | 6795 ++ gst/matroska/matroska-demux.h | 138 + gst/matroska/matroska-ids.c | 118 + gst/matroska/matroska-ids.h | 639 + gst/matroska/matroska-mux.c | 3167 + gst/matroska/matroska-mux.h | 142 + gst/matroska/matroska-parse.c | 3242 + gst/matroska/matroska-parse.h | 106 + gst/matroska/matroska-read-common.c | 1951 + gst/matroska/matroska-read-common.h | 139 + gst/matroska/matroska.c | 61 + gst/matroska/webm-mux.c | 105 + gst/matroska/webm-mux.h | 49 + gst/monoscope/Makefile.am | 24 + gst/monoscope/Makefile.in | 836 + gst/monoscope/README | 13 + gst/monoscope/convolve.c | 346 + gst/monoscope/convolve.h | 54 + gst/monoscope/gstmonoscope.c | 553 + gst/monoscope/gstmonoscope.h | 82 + gst/monoscope/monoscope.c | 164 + gst/monoscope/monoscope.h | 24 + gst/multifile/Makefile.am | 30 + gst/multifile/Makefile.in | 863 + gst/multifile/gstmultifile.c | 52 + gst/multifile/gstmultifilesink.c | 883 + gst/multifile/gstmultifilesink.h | 108 + gst/multifile/gstmultifilesrc.c | 417 + gst/multifile/gstmultifilesrc.h | 70 + gst/multifile/gstsplitfilesrc.c | 616 + gst/multifile/gstsplitfilesrc.h | 74 + gst/multifile/patternspec.c | 334 + gst/multifile/patternspec.h | 47 + gst/multipart/Makefile.am | 24 + gst/multipart/Makefile.in | 837 + gst/multipart/multipart.c | 42 + gst/multipart/multipartdemux.c | 732 + gst/multipart/multipartdemux.h | 105 + gst/multipart/multipartmux.c | 681 + gst/multipart/multipartmux.h | 94 + gst/replaygain/Makefile.am | 38 + gst/replaygain/Makefile.in | 875 + gst/replaygain/gstrganalysis.c | 721 + gst/replaygain/gstrganalysis.h | 86 + gst/replaygain/gstrglimiter.c | 192 + gst/replaygain/gstrglimiter.h | 64 + gst/replaygain/gstrgvolume.c | 708 + gst/replaygain/gstrgvolume.h | 88 + gst/replaygain/replaygain.c | 53 + gst/replaygain/replaygain.h | 36 + gst/replaygain/rganalysis.c | 824 + gst/replaygain/rganalysis.h | 63 + gst/rtp/Makefile.am | 180 + gst/rtp/Makefile.in | 1583 + gst/rtp/README | 398 + gst/rtp/TODO | 15 + gst/rtp/fnv1hash.c | 63 + gst/rtp/fnv1hash.h | 36 + gst/rtp/gstasteriskh263.c | 235 + gst/rtp/gstasteriskh263.h | 65 + gst/rtp/gstrtp.c | 311 + gst/rtp/gstrtpL16depay.c | 265 + gst/rtp/gstrtpL16depay.h | 64 + gst/rtp/gstrtpL16pay.c | 238 + gst/rtp/gstrtpL16pay.h | 61 + gst/rtp/gstrtpac3depay.c | 219 + gst/rtp/gstrtpac3depay.h | 58 + gst/rtp/gstrtpac3pay.c | 452 + gst/rtp/gstrtpac3pay.h | 64 + gst/rtp/gstrtpamrdepay.c | 458 + gst/rtp/gstrtpamrdepay.h | 77 + gst/rtp/gstrtpamrpay.c | 439 + gst/rtp/gstrtpamrpay.h | 70 + gst/rtp/gstrtpbvdepay.c | 181 + gst/rtp/gstrtpbvdepay.h | 60 + gst/rtp/gstrtpbvpay.c | 221 + gst/rtp/gstrtpbvpay.h | 60 + gst/rtp/gstrtpceltdepay.c | 275 + gst/rtp/gstrtpceltdepay.h | 54 + gst/rtp/gstrtpceltpay.c | 477 + gst/rtp/gstrtpceltpay.h | 62 + gst/rtp/gstrtpchannels.c | 167 + gst/rtp/gstrtpchannels.h | 186 + gst/rtp/gstrtpdepay.c | 162 + gst/rtp/gstrtpdepay.h | 55 + gst/rtp/gstrtpdvdepay.c | 413 + gst/rtp/gstrtpdvdepay.h | 66 + gst/rtp/gstrtpdvpay.c | 375 + gst/rtp/gstrtpdvpay.h | 69 + gst/rtp/gstrtpg722depay.c | 260 + gst/rtp/gstrtpg722depay.h | 64 + gst/rtp/gstrtpg722pay.c | 208 + gst/rtp/gstrtpg722pay.h | 61 + gst/rtp/gstrtpg723depay.c | 228 + gst/rtp/gstrtpg723depay.h | 59 + gst/rtp/gstrtpg723pay.c | 316 + gst/rtp/gstrtpg723pay.h | 64 + gst/rtp/gstrtpg726depay.c | 390 + gst/rtp/gstrtpg726depay.h | 57 + gst/rtp/gstrtpg726pay.c | 419 + gst/rtp/gstrtpg726pay.h | 55 + gst/rtp/gstrtpg729depay.c | 227 + gst/rtp/gstrtpg729depay.h | 61 + gst/rtp/gstrtpg729pay.c | 403 + gst/rtp/gstrtpg729pay.h | 66 + gst/rtp/gstrtpgsmdepay.c | 152 + gst/rtp/gstrtpgsmdepay.h | 58 + gst/rtp/gstrtpgsmpay.c | 183 + gst/rtp/gstrtpgsmpay.h | 59 + gst/rtp/gstrtpgstdepay.c | 359 + gst/rtp/gstrtpgstdepay.h | 63 + gst/rtp/gstrtpgstpay.c | 224 + gst/rtp/gstrtpgstpay.h | 58 + gst/rtp/gstrtph263depay.c | 381 + gst/rtp/gstrtph263depay.h | 66 + gst/rtp/gstrtph263pay.c | 1800 + gst/rtp/gstrtph263pay.h | 414 + gst/rtp/gstrtph263pdepay.c | 399 + gst/rtp/gstrtph263pdepay.h | 62 + gst/rtp/gstrtph263ppay.c | 753 + gst/rtp/gstrtph263ppay.h | 70 + gst/rtp/gstrtph264depay.c | 967 + gst/rtp/gstrtph264depay.h | 77 + gst/rtp/gstrtph264pay.c | 1398 + gst/rtp/gstrtph264pay.h | 86 + gst/rtp/gstrtpilbcdepay.c | 236 + gst/rtp/gstrtpilbcdepay.h | 65 + gst/rtp/gstrtpilbcpay.c | 216 + gst/rtp/gstrtpilbcpay.h | 60 + gst/rtp/gstrtpj2kdepay.c | 674 + gst/rtp/gstrtpj2kdepay.h | 76 + gst/rtp/gstrtpj2kpay.c | 583 + gst/rtp/gstrtpj2kpay.h | 63 + gst/rtp/gstrtpjpegdepay.c | 759 + gst/rtp/gstrtpjpegdepay.h | 70 + gst/rtp/gstrtpjpegpay.c | 934 + gst/rtp/gstrtpjpegpay.h | 65 + gst/rtp/gstrtpmp1sdepay.c | 146 + gst/rtp/gstrtpmp1sdepay.h | 58 + gst/rtp/gstrtpmp2tdepay.c | 228 + gst/rtp/gstrtpmp2tdepay.h | 60 + gst/rtp/gstrtpmp2tpay.c | 208 + gst/rtp/gstrtpmp2tpay.h | 64 + gst/rtp/gstrtpmp4adepay.c | 434 + gst/rtp/gstrtpmp4adepay.h | 62 + gst/rtp/gstrtpmp4apay.c | 437 + gst/rtp/gstrtpmp4apay.h | 65 + gst/rtp/gstrtpmp4gdepay.c | 775 + gst/rtp/gstrtpmp4gdepay.h | 86 + gst/rtp/gstrtpmp4gpay.c | 631 + gst/rtp/gstrtpmp4gpay.h | 73 + gst/rtp/gstrtpmp4vdepay.c | 231 + gst/rtp/gstrtpmp4vdepay.h | 61 + gst/rtp/gstrtpmp4vpay.c | 676 + gst/rtp/gstrtpmp4vpay.h | 76 + gst/rtp/gstrtpmpadepay.c | 180 + gst/rtp/gstrtpmpadepay.h | 58 + gst/rtp/gstrtpmpapay.c | 327 + gst/rtp/gstrtpmpapay.h | 63 + gst/rtp/gstrtpmparobustdepay.c | 792 + gst/rtp/gstrtpmparobustdepay.h | 78 + gst/rtp/gstrtpmpvdepay.c | 204 + gst/rtp/gstrtpmpvdepay.h | 58 + gst/rtp/gstrtpmpvpay.c | 310 + gst/rtp/gstrtpmpvpay.h | 64 + gst/rtp/gstrtppcmadepay.c | 164 + gst/rtp/gstrtppcmadepay.h | 53 + gst/rtp/gstrtppcmapay.c | 118 + gst/rtp/gstrtppcmapay.h | 54 + gst/rtp/gstrtppcmudepay.c | 165 + gst/rtp/gstrtppcmudepay.h | 53 + gst/rtp/gstrtppcmupay.c | 118 + gst/rtp/gstrtppcmupay.h | 54 + gst/rtp/gstrtpqcelpdepay.c | 432 + gst/rtp/gstrtpqcelpdepay.h | 62 + gst/rtp/gstrtpqdmdepay.c | 419 + gst/rtp/gstrtpqdmdepay.h | 85 + gst/rtp/gstrtpsirendepay.c | 124 + gst/rtp/gstrtpsirendepay.h | 59 + gst/rtp/gstrtpsirenpay.c | 152 + gst/rtp/gstrtpsirenpay.h | 57 + gst/rtp/gstrtpspeexdepay.c | 226 + gst/rtp/gstrtpspeexdepay.h | 53 + gst/rtp/gstrtpspeexpay.c | 341 + gst/rtp/gstrtpspeexpay.h | 56 + gst/rtp/gstrtpsv3vdepay.c | 324 + gst/rtp/gstrtpsv3vdepay.h | 67 + gst/rtp/gstrtptheoradepay.c | 666 + gst/rtp/gstrtptheoradepay.h | 72 + gst/rtp/gstrtptheorapay.c | 857 + gst/rtp/gstrtptheorapay.h | 84 + gst/rtp/gstrtpvorbisdepay.c | 700 + gst/rtp/gstrtpvorbisdepay.h | 70 + gst/rtp/gstrtpvorbispay.c | 694 + gst/rtp/gstrtpvorbispay.h | 77 + gst/rtp/gstrtpvrawdepay.c | 627 + gst/rtp/gstrtpvrawdepay.h | 72 + gst/rtp/gstrtpvrawpay.c | 639 + gst/rtp/gstrtpvrawpay.h | 70 + gst/rtpmanager/Makefile.am | 64 + gst/rtpmanager/Makefile.in | 999 + gst/rtpmanager/gstrtpbin-marshal.list | 10 + gst/rtpmanager/gstrtpbin.c | 3146 + gst/rtpmanager/gstrtpbin.h | 100 + gst/rtpmanager/gstrtpjitterbuffer.c | 2299 + gst/rtpmanager/gstrtpjitterbuffer.h | 85 + gst/rtpmanager/gstrtpmanager.c | 60 + gst/rtpmanager/gstrtpptdemux.c | 578 + gst/rtpmanager/gstrtpptdemux.h | 62 + gst/rtpmanager/gstrtpsession.c | 2204 + gst/rtpmanager/gstrtpsession.h | 79 + gst/rtpmanager/gstrtpssrcdemux.c | 823 + gst/rtpmanager/gstrtpssrcdemux.h | 62 + gst/rtpmanager/rtpjitterbuffer.c | 907 + gst/rtpmanager/rtpjitterbuffer.h | 135 + gst/rtpmanager/rtpsession.c | 3447 + gst/rtpmanager/rtpsession.h | 358 + gst/rtpmanager/rtpsource.c | 1801 + gst/rtpmanager/rtpsource.h | 270 + gst/rtpmanager/rtpstats.c | 294 + gst/rtpmanager/rtpstats.h | 203 + gst/rtsp/Makefile.am | 31 + gst/rtsp/Makefile.in | 856 + gst/rtsp/README | 377 + gst/rtsp/gstrtpdec.c | 969 + gst/rtsp/gstrtpdec.h | 88 + gst/rtsp/gstrtsp.c | 75 + gst/rtsp/gstrtsp.h | 53 + gst/rtsp/gstrtspext.c | 268 + gst/rtsp/gstrtspext.h | 83 + gst/rtsp/gstrtspsrc.c | 6854 ++ gst/rtsp/gstrtspsrc.h | 260 + gst/shapewipe/Makefile.am | 25 + gst/shapewipe/Makefile.in | 820 + gst/shapewipe/gstshapewipe.c | 1162 + gst/shapewipe/gstshapewipe.h | 81 + gst/smpte/Makefile.am | 26 + gst/smpte/Makefile.in | 866 + gst/smpte/barboxwipes.c | 957 + gst/smpte/gstmask.c | 121 + gst/smpte/gstmask.h | 64 + gst/smpte/gstsmpte.c | 655 + gst/smpte/gstsmpte.h | 82 + gst/smpte/gstsmptealpha.c | 753 + gst/smpte/gstsmptealpha.h | 79 + gst/smpte/paint.c | 338 + gst/smpte/paint.h | 47 + gst/smpte/plugin.c | 43 + gst/spectrum/Makefile.am | 27 + gst/spectrum/Makefile.in | 826 + gst/spectrum/README | 5 + gst/spectrum/gstspectrum.c | 1164 + gst/spectrum/gstspectrum.h | 93 + gst/udp/Makefile.am | 48 + gst/udp/Makefile.in | 953 + gst/udp/README | 7 + gst/udp/gstdynudpsink.c | 397 + gst/udp/gstdynudpsink.h | 71 + gst/udp/gstmultiudpsink.c | 1299 + gst/udp/gstmultiudpsink.h | 109 + gst/udp/gstudp-marshal.list | 2 + gst/udp/gstudp.c | 65 + gst/udp/gstudp.h | 39 + gst/udp/gstudpnetutils.c | 470 + gst/udp/gstudpnetutils.h | 110 + gst/udp/gstudpsink.c | 298 + gst/udp/gstudpsink.h | 56 + gst/udp/gstudpsrc.c | 1079 + gst/udp/gstudpsrc.h | 88 + gst/videobox/Makefile.am | 38 + gst/videobox/Makefile.in | 922 + gst/videobox/README | 21 + gst/videobox/gstvideobox.c | 3407 + gst/videobox/gstvideobox.h | 92 + gst/videobox/gstvideoboxorc-dist.c | 215 + gst/videobox/gstvideoboxorc-dist.h | 77 + gst/videobox/gstvideoboxorc.orc | 7 + gst/videocrop/Makefile.am | 28 + gst/videocrop/Makefile.in | 833 + gst/videocrop/gstaspectratiocrop.c | 453 + gst/videocrop/gstaspectratiocrop.h | 67 + gst/videocrop/gstvideocrop.c | 760 + gst/videocrop/gstvideocrop.h | 92 + gst/videofilter/Makefile.am | 39 + gst/videofilter/Makefile.in | 866 + gst/videofilter/gstgamma.c | 471 + gst/videofilter/gstgamma.h | 82 + gst/videofilter/gstvideobalance.c | 839 + gst/videofilter/gstvideobalance.h | 85 + gst/videofilter/gstvideoflip.c | 1091 + gst/videofilter/gstvideoflip.h | 92 + gst/videofilter/gstvideotemplate.c | 253 + gst/videofilter/make_filter | 39 + gst/videofilter/plugin.c | 47 + gst/videomixer/Makefile.am | 41 + gst/videomixer/Makefile.in | 946 + gst/videomixer/README | 27 + gst/videomixer/blend.c | 770 + gst/videomixer/blend.h | 96 + gst/videomixer/blendorc-dist.c | 2203 + gst/videomixer/blendorc-dist.h | 83 + gst/videomixer/blendorc.orc | 220 + gst/videomixer/videomixer.c | 1908 + gst/videomixer/videomixer.h | 132 + gst/videomixer/videomixer2.c | 2019 + gst/videomixer/videomixer2.h | 125 + gst/videomixer/videomixer2pad.h | 77 + gst/videomixer/videomixerpad.h | 78 + gst/wavenc/Makefile.am | 28 + gst/wavenc/Makefile.in | 826 + gst/wavenc/gstwavenc.c | 747 + gst/wavenc/gstwavenc.h | 68 + gst/wavparse/Makefile.am | 33 + gst/wavparse/Makefile.in | 832 + gst/wavparse/gstwavparse.c | 2676 + gst/wavparse/gstwavparse.h | 133 + gst/y4m/Makefile.am | 24 + gst/y4m/Makefile.in | 818 + gst/y4m/gsty4mencode.c | 377 + gst/y4m/gsty4mencode.h | 69 + install-sh | 527 + ltmain.sh | 9661 +++ m4/Makefile.am | 39 + m4/Makefile.in | 644 + m4/README | 3 + m4/a52.m4 | 125 + m4/aalib.m4 | 178 + m4/as-arts.m4 | 209 + m4/as-ffmpeg.m4 | 99 + m4/as-liblame.m4 | 50 + m4/as-slurp-ffmpeg.m4 | 59 + m4/check-libheader.m4 | 39 + m4/codeset.m4 | 21 + m4/esd.m4 | 202 + m4/freetype2.m4 | 143 + m4/gconf-2.m4 | 40 + m4/gettext.m4 | 381 + m4/glib.m4 | 196 + m4/glibc21.m4 | 30 + m4/gst-alsa.m4 | 150 + m4/gst-artsc.m4 | 28 + m4/gst-fionread.m4 | 42 + m4/gst-ivorbis.m4 | 68 + m4/gst-matroska.m4 | 262 + m4/gst-sdl.m4 | 184 + m4/gst-shout2.m4 | 102 + m4/gst-sid.m4 | 39 + m4/gtk.m4 | 194 + m4/iconv.m4 | 180 + m4/intdiv0.m4 | 84 + m4/intlmacosx.m4 | 51 + m4/inttypes-pri.m4 | 36 + m4/inttypes_h.m4 | 26 + m4/lcmessage.m4 | 30 + m4/lib-ld.m4 | 110 + m4/lib-link.m4 | 709 + m4/lib-prefix.m4 | 185 + m4/libfame.m4 | 182 + m4/libmikmod.m4 | 216 + m4/libtool.m4 | 8001 ++ m4/ltoptions.m4 | 384 + m4/ltsugar.m4 | 123 + m4/ltversion.m4 | 23 + m4/lt~obsolete.m4 | 98 + m4/nls.m4 | 31 + m4/ogg.m4 | 102 + m4/po.m4 | 449 + m4/progtest.m4 | 92 + m4/stdint_h.m4 | 26 + m4/uintmax_t.m4 | 30 + m4/vorbis.m4 | 128 + missing | 331 + packaging/gst-plugins-good-disable-gtk-doc.patch | 13 + packaging/gst-plugins-good.spec | 154 + pkgconfig/Makefile.am | 31 + pkgconfig/Makefile.in | 642 + pkgconfig/gstreamer-plugins-good-uninstalled.pc.in | 13 + po/LINGUAS | 1 + po/Makefile.in.in | 432 + po/Makevars | 46 + po/POTFILES.in | 26 + po/Rules-quot | 47 + po/af.gmo | Bin 0 -> 1489 bytes po/af.po | 744 + po/az.gmo | Bin 0 -> 1544 bytes po/az.po | 745 + po/bg.gmo | Bin 0 -> 19615 bytes po/bg.po | 673 + po/boldquot.sed | 10 + po/ca.gmo | Bin 0 -> 16154 bytes po/ca.po | 800 + po/cs.gmo | Bin 0 -> 15862 bytes po/cs.po | 677 + po/da.gmo | Bin 0 -> 14553 bytes po/da.po | 682 + po/de.gmo | Bin 0 -> 15852 bytes po/de.po | 844 + po/el.gmo | Bin 0 -> 19693 bytes po/el.po | 693 + po/en@boldquot.header | 25 + po/en@quot.header | 22 + po/en_GB.gmo | Bin 0 -> 1461 bytes po/en_GB.po | 747 + po/eo.gmo | Bin 0 -> 2586 bytes po/eo.po | 651 + po/es.gmo | Bin 0 -> 15813 bytes po/es.po | 746 + po/eu.gmo | Bin 0 -> 14506 bytes po/eu.po | 782 + po/fi.gmo | Bin 0 -> 14534 bytes po/fi.po | 793 + po/fr.gmo | Bin 0 -> 16175 bytes po/fr.po | 693 + po/gl.gmo | Bin 0 -> 16016 bytes po/gl.po | 790 + po/gst-plugins-good-0.10.pot | 850 + po/hu.gmo | Bin 0 -> 15235 bytes po/hu.po | 682 + po/id.gmo | Bin 0 -> 14636 bytes po/id.po | 718 + po/insert-header.sin | 23 + po/it.gmo | Bin 0 -> 15204 bytes po/it.po | 695 + po/ja.gmo | Bin 0 -> 15359 bytes po/ja.po | 848 + po/lt.gmo | Bin 0 -> 14302 bytes po/lt.po | 776 + po/lv.gmo | Bin 0 -> 15371 bytes po/lv.po | 674 + po/mt.gmo | Bin 0 -> 8330 bytes po/mt.po | 754 + po/nb.gmo | Bin 0 -> 4456 bytes po/nb.po | 651 + po/nl.gmo | Bin 0 -> 15064 bytes po/nl.po | 676 + po/or.gmo | Bin 0 -> 2058 bytes po/or.po | 784 + po/pl.gmo | Bin 0 -> 15730 bytes po/pl.po | 672 + po/pt_BR.gmo | Bin 0 -> 15692 bytes po/pt_BR.po | 684 + po/quot.sed | 6 + po/remove-potcdate.sin | 19 + po/ro.gmo | Bin 0 -> 14664 bytes po/ro.po | 684 + po/ru.gmo | Bin 0 -> 19812 bytes po/ru.po | 744 + po/sk.gmo | Bin 0 -> 15146 bytes po/sk.po | 836 + po/sl.gmo | Bin 0 -> 15183 bytes po/sl.po | 773 + po/sq.gmo | Bin 0 -> 1521 bytes po/sq.po | 763 + po/sr.gmo | Bin 0 -> 19603 bytes po/sr.po | 747 + po/stamp-po | 1 + po/sv.gmo | Bin 0 -> 14847 bytes po/sv.po | 1789 + po/tr.gmo | Bin 0 -> 14734 bytes po/tr.po | 707 + po/uk.gmo | Bin 0 -> 19684 bytes po/uk.po | 741 + po/vi.gmo | Bin 0 -> 15445 bytes po/vi.po | 675 + po/zh_CN.gmo | Bin 0 -> 7822 bytes po/zh_CN.po | 730 + po/zh_HK.gmo | Bin 0 -> 4704 bytes po/zh_HK.po | 669 + po/zh_TW.gmo | Bin 0 -> 4703 bytes po/zh_TW.po | 669 + sys/Makefile.am | 84 + sys/Makefile.in | 869 + sys/directsound/Makefile.am | 18 + sys/directsound/Makefile.in | 828 + sys/directsound/gstdirectsoundplugin.c | 49 + sys/directsound/gstdirectsoundsink.c | 785 + sys/directsound/gstdirectsoundsink.h | 97 + sys/oss/Makefile.am | 28 + sys/oss/Makefile.in | 879 + sys/oss/common.h | 43 + sys/oss/gstossaudio.c | 61 + sys/oss/gstossdmabuffer.h | 77 + sys/oss/gstosshelper.c | 407 + sys/oss/gstosshelper.h | 43 + sys/oss/gstossmixer.c | 378 + sys/oss/gstossmixer.h | 171 + sys/oss/gstossmixerelement.c | 218 + sys/oss/gstossmixerelement.h | 59 + sys/oss/gstossmixertrack.c | 172 + sys/oss/gstossmixertrack.h | 62 + sys/oss/gstosssink.c | 565 + sys/oss/gstosssink.h | 62 + sys/oss/gstosssrc.c | 537 + sys/oss/gstosssrc.h | 67 + sys/oss4/Makefile.am | 33 + sys/oss4/Makefile.in | 892 + sys/oss4/oss4-audio.c | 714 + sys/oss4/oss4-audio.h | 43 + sys/oss4/oss4-mixer-enum.c | 269 + sys/oss4/oss4-mixer-enum.h | 67 + sys/oss4/oss4-mixer-slider.c | 311 + sys/oss4/oss4-mixer-slider.h | 70 + sys/oss4/oss4-mixer-switch.c | 150 + sys/oss4/oss4-mixer-switch.h | 65 + sys/oss4/oss4-mixer.c | 1862 + sys/oss4/oss4-mixer.h | 128 + sys/oss4/oss4-property-probe.c | 412 + sys/oss4/oss4-property-probe.h | 38 + sys/oss4/oss4-sink.c | 696 + sys/oss4/oss4-sink.h | 64 + sys/oss4/oss4-soundcard.h | 2067 + sys/oss4/oss4-source.c | 997 + sys/oss4/oss4-source.h | 89 + sys/osxaudio/Makefile.am | 26 + sys/osxaudio/Makefile.in | 858 + sys/osxaudio/gstosxaudio.c | 53 + sys/osxaudio/gstosxaudioelement.c | 92 + sys/osxaudio/gstosxaudioelement.h | 84 + sys/osxaudio/gstosxaudiosink.c | 348 + sys/osxaudio/gstosxaudiosink.h | 86 + sys/osxaudio/gstosxaudiosrc.c | 362 + sys/osxaudio/gstosxaudiosrc.h | 82 + sys/osxaudio/gstosxringbuffer.c | 689 + sys/osxaudio/gstosxringbuffer.h | 94 + sys/osxvideo/Makefile.am | 19 + sys/osxvideo/Makefile.in | 824 + sys/osxvideo/cocoawindow.h | 74 + sys/osxvideo/cocoawindow.m | 432 + sys/osxvideo/osxvideosink.h | 85 + sys/osxvideo/osxvideosink.m | 524 + sys/sunaudio/Makefile.am | 26 + sys/sunaudio/Makefile.in | 877 + sys/sunaudio/gstsunaudio.c | 63 + sys/sunaudio/gstsunaudiomixer.c | 104 + sys/sunaudio/gstsunaudiomixer.h | 51 + sys/sunaudio/gstsunaudiomixerctrl.c | 585 + sys/sunaudio/gstsunaudiomixerctrl.h | 189 + sys/sunaudio/gstsunaudiomixeroptions.c | 157 + sys/sunaudio/gstsunaudiomixeroptions.h | 65 + sys/sunaudio/gstsunaudiomixertrack.c | 158 + sys/sunaudio/gstsunaudiomixertrack.h | 78 + sys/sunaudio/gstsunaudiosink.c | 651 + sys/sunaudio/gstsunaudiosink.h | 78 + sys/sunaudio/gstsunaudiosrc.c | 423 + sys/sunaudio/gstsunaudiosrc.h | 67 + sys/v4l2/Makefile.am | 60 + sys/v4l2/Makefile.in | 953 + sys/v4l2/README | 32 + sys/v4l2/gstv4l2.c | 86 + sys/v4l2/gstv4l2bufferpool.c | 652 + sys/v4l2/gstv4l2bufferpool.h | 97 + sys/v4l2/gstv4l2colorbalance.c | 106 + sys/v4l2/gstv4l2colorbalance.h | 104 + sys/v4l2/gstv4l2object.c | 2247 + sys/v4l2/gstv4l2object.h | 242 + sys/v4l2/gstv4l2radio.c | 635 + sys/v4l2/gstv4l2radio.h | 67 + sys/v4l2/gstv4l2sink.c | 971 + sys/v4l2/gstv4l2sink.h | 91 + sys/v4l2/gstv4l2src.c | 1072 + sys/v4l2/gstv4l2src.h | 102 + sys/v4l2/gstv4l2tuner.c | 364 + sys/v4l2/gstv4l2tuner.h | 198 + sys/v4l2/gstv4l2vidorient.c | 104 + sys/v4l2/gstv4l2vidorient.h | 117 + sys/v4l2/gstv4l2xoverlay.c | 486 + sys/v4l2/gstv4l2xoverlay.h | 70 + sys/v4l2/v4l2_calls.c | 925 + sys/v4l2/v4l2_calls.h | 142 + sys/v4l2/v4l2src_calls.c | 434 + sys/v4l2/v4l2src_calls.h | 46 + sys/waveform/Makefile.am | 20 + sys/waveform/Makefile.in | 828 + sys/waveform/gstwaveformplugin.c | 42 + sys/waveform/gstwaveformsink.c | 585 + sys/waveform/gstwaveformsink.h | 107 + sys/ximage/Makefile.am | 16 + sys/ximage/Makefile.in | 825 + sys/ximage/gstximagesrc.c | 1317 + sys/ximage/gstximagesrc.h | 113 + sys/ximage/ximageutil.c | 501 + sys/ximage/ximageutil.h | 182 + tests/Makefile.am | 22 + tests/Makefile.in | 813 + tests/check/Makefile.am | 309 + tests/check/Makefile.in | 3014 + tests/check/elements/aacparse.c | 240 + tests/check/elements/ac3parse.c | 163 + tests/check/elements/alphacolor.c | 292 + tests/check/elements/amrparse.c | 327 + tests/check/elements/apev2mux.c | 433 + tests/check/elements/aspectratiocrop.c | 201 + tests/check/elements/audioamplify.c | 469 + tests/check/elements/audiochebband.c | 1538 + tests/check/elements/audiocheblimit.c | 1002 + tests/check/elements/audiodynamic.c | 459 + tests/check/elements/audioecho.c | 229 + tests/check/elements/audiofirfilter.c | 169 + tests/check/elements/audioiirfilter.c | 179 + tests/check/elements/audioinvert.c | 286 + tests/check/elements/audiopanorama.c | 707 + tests/check/elements/audiowsincband.c | 1010 + tests/check/elements/audiowsinclimit.c | 704 + tests/check/elements/autodetect.c | 163 + tests/check/elements/avimux.c | 276 + tests/check/elements/avisubtitle.c | 264 + tests/check/elements/capssetter.c | 228 + tests/check/elements/cmmldec.c | 600 + tests/check/elements/cmmlenc.c | 491 + tests/check/elements/deinterlace.c | 445 + tests/check/elements/deinterleave.c | 559 + tests/check/elements/equalizer.c | 327 + tests/check/elements/flacparse.c | 319 + tests/check/elements/flvdemux.c | 184 + tests/check/elements/flvmux.c | 161 + tests/check/elements/gdkpixbufsink.c | 291 + tests/check/elements/icydemux.c | 272 + tests/check/elements/id3demux.c | 290 + tests/check/elements/id3v2mux.c | 538 + tests/check/elements/imagefreeze.c | 640 + tests/check/elements/interleave.c | 733 + tests/check/elements/jpegenc.c | 247 + tests/check/elements/level.c | 326 + tests/check/elements/matroskamux.c | 470 + tests/check/elements/matroskaparse.c | 118 + tests/check/elements/mpegaudioparse.c | 170 + tests/check/elements/multifile.c | 283 + tests/check/elements/parser.c | 436 + tests/check/elements/parser.h | 95 + tests/check/elements/qtmux.c | 899 + tests/check/elements/rganalysis.c | 1878 + tests/check/elements/rglimiter.c | 269 + tests/check/elements/rgvolume.c | 617 + tests/check/elements/rtp-payloading.c | 828 + tests/check/elements/rtpbin.c | 447 + tests/check/elements/rtpbin_buffer_list.c | 331 + tests/check/elements/rtpjitterbuffer.c | 341 + tests/check/elements/shapewipe.c | 307 + tests/check/elements/souphttpsrc.c | 639 + tests/check/elements/spectrum.c | 570 + tests/check/elements/sunaudio.c | 95 + tests/check/elements/udpsink.c | 207 + tests/check/elements/videocrop.c | 816 + tests/check/elements/videofilter.c | 237 + tests/check/elements/wavpackdec.c | 257 + tests/check/elements/wavpackenc.c | 192 + tests/check/elements/wavpackparse.c | 293 + tests/check/elements/y4menc.c | 179 + tests/check/generic/index.c | 140 + tests/check/generic/states.c | 222 + tests/check/gst-plugins-good.supp | 127 + tests/check/pipelines/effectv.c | 146 + tests/check/pipelines/flacdec.c | 247 + tests/check/pipelines/simple-launch-lines.c | 284 + tests/check/pipelines/tagschecking.c | 354 + tests/check/pipelines/wavenc.c | 201 + tests/check/pipelines/wavpack.c | 217 + tests/examples/Makefile.am | 19 + tests/examples/Makefile.in | 831 + tests/examples/audiofx/Makefile.am | 7 + tests/examples/audiofx/Makefile.in | 783 + tests/examples/audiofx/firfilter-example.c | 161 + tests/examples/audiofx/iirfilter-example.c | 137 + tests/examples/cairo/Makefile.am | 7 + tests/examples/cairo/Makefile.in | 752 + tests/examples/cairo/cairo_overlay.c | 172 + tests/examples/equalizer/Makefile.am | 8 + tests/examples/equalizer/Makefile.in | 752 + tests/examples/equalizer/demo.c | 254 + tests/examples/jack/Makefile.am | 12 + tests/examples/jack/Makefile.in | 753 + tests/examples/jack/jack_client.c | 79 + tests/examples/level/Makefile.am | 4 + tests/examples/level/Makefile.in | 751 + tests/examples/level/level-example.c | 129 + tests/examples/pulse/Makefile.am | 5 + tests/examples/pulse/Makefile.in | 751 + tests/examples/pulse/pulse.c | 70 + tests/examples/rtp/Makefile.am | 22 + tests/examples/rtp/Makefile.in | 796 + tests/examples/rtp/client-H263p-AMR.sh | 23 + tests/examples/rtp/client-H263p-PCMA.sdp | 12 + tests/examples/rtp/client-H263p-PCMA.sh | 28 + tests/examples/rtp/client-H264-PCMA.sdp | 12 + tests/examples/rtp/client-H264-PCMA.sh | 64 + tests/examples/rtp/client-PCMA.c | 237 + tests/examples/rtp/client-PCMA.sh | 39 + tests/examples/rtp/server-VTS-H263p-ATS-PCMA.sh | 16 + tests/examples/rtp/server-alsasrc-PCMA.c | 221 + tests/examples/rtp/server-alsasrc-PCMA.sh | 35 + .../examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh | 25 + .../examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh | 78 + tests/examples/shapewipe/Makefile.am | 8 + tests/examples/shapewipe/Makefile.in | 758 + tests/examples/shapewipe/shapewipe-example.c | 147 + tests/examples/spectrum/Makefile.am | 16 + tests/examples/spectrum/Makefile.in | 815 + tests/examples/spectrum/demo-audiotest.c | 233 + tests/examples/spectrum/demo-osssrc.c | 208 + tests/examples/spectrum/spectrum-example.c | 124 + tests/examples/v4l2/Makefile.am | 10 + tests/examples/v4l2/Makefile.in | 780 + tests/examples/v4l2/camctrl.c | 213 + tests/examples/v4l2/probe.c | 85 + tests/files/Makefile.am | 13 + tests/files/Makefile.in | 616 + tests/files/audiotestsrc.flac | Bin 0 -> 4708 bytes tests/files/id3-407349-1.tag | Bin 0 -> 304 bytes tests/files/id3-407349-2.tag | Bin 0 -> 304 bytes tests/files/id3-447000-wcop.tag | Bin 0 -> 360 bytes tests/files/id3-577468-unsynced-tag.tag | Bin 0 -> 11264 bytes tests/files/id3-588148-unsynced-v24.tag | Bin 0 -> 39000 bytes tests/files/pcm16sine.flv | Bin 0 -> 4459 bytes tests/files/pinknoise-vorbis.mkv | Bin 0 -> 5486 bytes tests/files/test-cert.pem | 22 + tests/files/test-key.pem | 15 + tests/icles/Makefile.am | 59 + tests/icles/Makefile.in | 978 + tests/icles/equalizer-test.c | 291 + tests/icles/gdkpixbufsink-test.c | 360 + tests/icles/test-oss4.c | 255 + tests/icles/v4l2src-test.c | 517 + tests/icles/videobox-test.c | 141 + tests/icles/videocrop-test.c | 357 + tests/icles/videocrop2-test.c | 141 + tests/icles/ximagesrc-test.c | 70 + win32/MANIFEST | 91 + win32/common/config.h | 445 + win32/common/gstudp-enumtypes.c | 25 + win32/common/gstudp-enumtypes.h | 19 + win32/vs6/autogen.dsp | 149 + win32/vs6/gst_plugins_good.dsw | 524 + win32/vs6/libgstalaw.dsp | 135 + win32/vs6/libgstalpha.dsp | 119 + win32/vs6/libgstalphacolor.dsp | 119 + win32/vs6/libgstapetag.dsp | 123 + win32/vs6/libgstaudiofx.dsp | 151 + win32/vs6/libgstauparse.dsp | 123 + win32/vs6/libgstautodetect.dsp | 139 + win32/vs6/libgstavi.dsp | 140 + win32/vs6/libgstcutter.dsp | 123 + win32/vs6/libgstdirectsound.dsp | 126 + win32/vs6/libgsteffectv.dsp | 155 + win32/vs6/libgstflx.dsp | 135 + win32/vs6/libgstgoom.dsp | 159 + win32/vs6/libgsticydemux.dsp | 123 + win32/vs6/libgstid3demux.dsp | 135 + win32/vs6/libgstinterleave.dsp | 131 + win32/vs6/libgstjpeg.dsp | 163 + win32/vs6/libgstlevel.dsp | 123 + win32/vs6/libgstmatroska.dsp | 163 + win32/vs6/libgstmedian.dsp | 123 + win32/vs6/libgstmonoscope.dsp | 135 + win32/vs6/libgstmulaw.dsp | 143 + win32/vs6/libgstmultipart.dsp | 127 + win32/vs6/libgstpng.dsp | 139 + win32/vs6/libgstqtdemux.dsp | 142 + win32/vs6/libgstrtp.dsp | 359 + win32/vs6/libgstrtsp.dsp | 175 + win32/vs6/libgstsmpte.dsp | 143 + win32/vs6/libgstspeex.dsp | 135 + win32/vs6/libgstudp.dsp | 179 + win32/vs6/libgstvideobalance.dsp | 123 + win32/vs6/libgstvideobox.dsp | 119 + win32/vs6/libgstvideocrop.dsp | 123 + win32/vs6/libgstvideoflip.dsp | 123 + win32/vs6/libgstvideomixer.dsp | 119 + win32/vs6/libgstwaveform.dsp | 126 + win32/vs6/libgstwavenc.dsp | 127 + win32/vs6/libgstwavparse.dsp | 123 + win32/vs7/libgstdirectsound.vcproj | 145 + win32/vs8/gst-plugins-good.sln | 260 + win32/vs8/libgst1394.vcproj | 214 + win32/vs8/libgstaasink.vcproj | 210 + win32/vs8/libgstalaw.vcproj | 218 + win32/vs8/libgstalpha.vcproj | 210 + win32/vs8/libgstalphacolor.vcproj | 210 + win32/vs8/libgstannodex.vcproj | 230 + win32/vs8/libgstapetag.vcproj | 214 + win32/vs8/libgstaudiofx.vcproj | 214 + win32/vs8/libgstauparse.vcproj | 210 + win32/vs8/libgstautodetect.vcproj | 217 + win32/vs8/libgstavi.vcproj | 218 + win32/vs8/libgstcacasink.vcproj | 210 + win32/vs8/libgstcdio.vcproj | 214 + win32/vs8/libgstcutter.vcproj | 210 + win32/vs8/libgstdirectsound.vcproj | 214 + win32/vs8/libgstdv.vcproj | 218 + win32/vs8/libgsteffectv.vcproj | 242 + win32/vs8/libgstflac.vcproj | 218 + win32/vs8/libgstflxdec.vcproj | 214 + win32/vs8/libgstgoom.vcproj | 226 + win32/vs8/libgsticydemux.vcproj | 210 + win32/vs8/libgstid3demux.vcproj | 217 + win32/vs8/libgstjpeg.vcproj | 230 + win32/vs8/libgstladspa.vcproj | 222 + win32/vs8/libgstlevel.vcproj | 210 + win32/vs8/libgstmatroska.vcproj | 230 + win32/vs8/libgstmikmod.vcproj | 218 + win32/vs8/libgstmng.vcproj | 218 + win32/vs8/libgstmonoscope.vcproj | 218 + win32/vs8/libgstmulaw.vcproj | 222 + win32/vs8/libgstmultipart.vcproj | 218 + win32/vs8/libgstpng.vcproj | 218 + win32/vs8/libgstrtp.vcproj | 322 + win32/vs8/libgstrtsp.vcproj | 246 + win32/vs8/libgstshout2.vcproj | 210 + win32/vs8/libgstsmpte.vcproj | 222 + win32/vs8/libgstspeex.vcproj | 218 + win32/vs8/libgsttaglib.vcproj | 218 + win32/vs8/libgstudp.vcproj | 232 + win32/vs8/libgstvideobalance.vcproj | 210 + win32/vs8/libgstvideobox.vcproj | 210 + win32/vs8/libgstvideoflip.vcproj | 210 + win32/vs8/libgstvideomixer.vcproj | 210 + win32/vs8/libgstwavenc.vcproj | 210 + win32/vs8/libgstwavparse.vcproj | 210 + 1833 files changed, 754294 insertions(+) create mode 100644 ABOUT-NLS create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 RELEASE create mode 100644 REQUIREMENTS create mode 100644 aclocal.m4 create mode 100755 autogen.sh create mode 100644 common/ChangeLog create mode 100644 common/Makefile.am create mode 100644 common/Makefile.in create mode 100644 common/c-to-xml.py create mode 100755 common/check-exports create mode 100644 common/check.mak create mode 100644 common/coverage/coverage-report-entry.pl create mode 100644 common/coverage/coverage-report.pl create mode 100644 common/coverage/coverage-report.xsl create mode 100644 common/coverage/lcov.mak create mode 100644 common/cruft.mak create mode 100755 common/download-translations create mode 100755 common/extract-release-date-from-doap-file create mode 100644 common/gettext.patch create mode 100644 common/glib-gen.mak create mode 100644 common/gst-autogen.sh create mode 100644 common/gst-glib-gen.mak create mode 100755 common/gst-indent create mode 100644 common/gst.supp create mode 100755 common/gstdoc-scangobj create mode 100644 common/gtk-doc-plugins.mak create mode 100644 common/gtk-doc.mak create mode 100644 common/m4/Makefile.am create mode 100644 common/m4/Makefile.in create mode 100644 common/m4/README create mode 100644 common/m4/as-ac-expand.m4 create mode 100644 common/m4/as-auto-alt.m4 create mode 100644 common/m4/as-compiler-flag.m4 create mode 100644 common/m4/as-compiler.m4 create mode 100644 common/m4/as-docbook.m4 create mode 100644 common/m4/as-gcc-inline-assembly.m4 create mode 100644 common/m4/as-libtool-tags.m4 create mode 100644 common/m4/as-libtool.m4 create mode 100644 common/m4/as-objc.m4 create mode 100644 common/m4/as-python.m4 create mode 100644 common/m4/as-scrub-include.m4 create mode 100644 common/m4/as-version.m4 create mode 100644 common/m4/ax_create_stdint_h.m4 create mode 100644 common/m4/check.m4 create mode 100644 common/m4/glib-gettext.m4 create mode 100644 common/m4/gst-arch.m4 create mode 100644 common/m4/gst-args.m4 create mode 100644 common/m4/gst-check.m4 create mode 100644 common/m4/gst-debuginfo.m4 create mode 100644 common/m4/gst-default.m4 create mode 100644 common/m4/gst-doc.m4 create mode 100644 common/m4/gst-dowhile.m4 create mode 100644 common/m4/gst-error.m4 create mode 100644 common/m4/gst-feature.m4 create mode 100644 common/m4/gst-function.m4 create mode 100644 common/m4/gst-gettext.m4 create mode 100644 common/m4/gst-glib2.m4 create mode 100644 common/m4/gst-libxml2.m4 create mode 100644 common/m4/gst-package-release-datetime.m4 create mode 100644 common/m4/gst-parser.m4 create mode 100644 common/m4/gst-platform.m4 create mode 100644 common/m4/gst-plugin-docs.m4 create mode 100644 common/m4/gst-plugindir.m4 create mode 100644 common/m4/gst-valgrind.m4 create mode 100644 common/m4/gst-x11.m4 create mode 100644 common/m4/gst.m4 create mode 100644 common/m4/gtk-doc.m4 create mode 100644 common/m4/introspection.m4 create mode 100644 common/m4/orc.m4 create mode 100644 common/m4/pkg.m4 create mode 100644 common/mangle-tmpl.py create mode 100644 common/orc.mak create mode 100644 common/parallel-subdirs.mak create mode 100644 common/plugins.xsl create mode 100644 common/po.mak create mode 100644 common/release.mak create mode 100755 common/scangobj-merge.py create mode 100644 common/upload-doc.mak create mode 100644 common/win32.mak create mode 100755 compile create mode 100755 config.guess create mode 100644 config.h.in create mode 100755 config.rpath create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.ac create mode 100755 debian/changelog create mode 100644 debian/compat create mode 100755 debian/control create mode 100644 debian/copyright create mode 100644 debian/gstreamer0.10-plugins-good.install.in create mode 100755 debian/rules create mode 100755 debian/rules.old create mode 100755 depcomp create mode 100644 docs/Makefile.am create mode 100644 docs/Makefile.in create mode 100644 docs/plugins/Makefile.am create mode 100644 docs/plugins/Makefile.in create mode 100644 docs/plugins/gst-plugins-good-plugins-docs.sgml create mode 100644 docs/plugins/gst-plugins-good-plugins-sections.txt create mode 100644 docs/plugins/gst-plugins-good-plugins.args create mode 100644 docs/plugins/gst-plugins-good-plugins.hierarchy create mode 100644 docs/plugins/gst-plugins-good-plugins.interfaces create mode 100644 docs/plugins/gst-plugins-good-plugins.prerequisites create mode 100644 docs/plugins/gst-plugins-good-plugins.signals create mode 100644 docs/plugins/gst-plugins-good-plugins.types create mode 100644 docs/plugins/html/GstIirEqualizer.html create mode 100644 docs/plugins/html/GstVideoMixer2Pad.html create mode 100644 docs/plugins/html/GstVideoMixerPad.html create mode 100644 docs/plugins/html/ch01.html create mode 100644 docs/plugins/html/ch02.html create mode 100644 docs/plugins/html/ch03.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-3gppmux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-aacparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-aasink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-ac3parse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-agingtv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-alawdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-alawenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-alpha.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-alphacolor.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-amrparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-apedemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-apev2mux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-aspectratiocrop.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audioamplify.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audiochebband.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audiocheblimit.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audiodynamic.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audioecho.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audiofirfilter.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audioiirfilter.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audioinvert.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audiokaraoke.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audiopanorama.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audiowsincband.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-audiowsinclimit.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-auparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-autoaudiosink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-autoaudiosrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-autovideosink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-autovideosrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-avidemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-avimux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-avisubtitle.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-cacasink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-cairooverlay.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-cairorender.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-cairotextoverlay.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-cairotimeoverlay.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-capssetter.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-cmmldec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-cmmlenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-cutter.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-dcaparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-deinterlace.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-deinterleave.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-dicetv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-directsoundsink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-dv1394src.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-dvdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-dvdemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-edgetv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-equalizer-10bands.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-equalizer-3bands.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-equalizer-nbands.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-esdsink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-flacdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-flacenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-flacparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-flactag.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-flvdemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-flvmux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-flxdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gamma.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gconfaudiosink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gconfaudiosrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gconfvideosink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gconfvideosrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gdkpixbufsink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-goom.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-goom2k1.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gstrtpbin.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gstrtpjitterbuffer.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gstrtpptdemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gstrtpsession.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-gstrtpssrcdemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-halaudiosink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-halaudiosrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-hdv1394src.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-icydemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-id3demux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-id3v2mux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-imagefreeze.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-interleave.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-ismlmux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-jackaudiosink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-jackaudiosrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-jpegdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-jpegenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-level.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-matroskademux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-matroskamux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-mj2mux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-monoscope.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-mp4mux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-mpegaudioparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-mulawdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-mulawenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-multifilesink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-multifilesrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-multipartdemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-multipartmux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-multiudpsink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-optv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-oss4mixer.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-oss4sink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-oss4src.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-ossmixer.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-osssink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-osssrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-osxaudiosink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-osxaudiosrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-osxvideosink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-annodex.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-directsound.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-efence.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-esdsink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-gconfelements.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-gstrtpmanager.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-halelements.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-level.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-monoscope.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-osxaudio.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-osxvideo.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-png.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-waveform.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-pngdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-pngenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-progressreport.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-pulsemixer.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-pulsesink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-pulsesrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-qtdemux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-qtmoovrecover.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-qtmux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-quarktv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-radioactv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-revtv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-rganalysis.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-rglimiter.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-rgvolume.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-rippletv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-rtpdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-rtpj2kpay.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-rtpjpegpay.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-rtspsrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-shagadelictv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-shapewipe.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-smokedec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-smokeenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-smpte.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-smptealpha.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-souphttpsrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-spectrum.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-speexdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-speexenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-splitfilesrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-streaktv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-taginject.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-udpsink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-udpsrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-v4l2radio.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-v4l2src.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-vertigotv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-videobalance.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-videobox.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-videocrop.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-videoflip.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-videomixer.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-videomixer2.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-warptv.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-waveformsink.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-wavenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-wavpackdec.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-wavpackenc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-wavpackparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-wavparse.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-webmmux.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-ximagesrc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins-y4menc.html create mode 100644 docs/plugins/html/gst-plugins-good-plugins.devhelp2 create mode 100644 docs/plugins/html/home.png create mode 100644 docs/plugins/html/index.html create mode 100644 docs/plugins/html/index.sgml create mode 100644 docs/plugins/html/left.png create mode 100644 docs/plugins/html/right.png create mode 100644 docs/plugins/html/style.css create mode 100644 docs/plugins/html/up.png create mode 100644 docs/plugins/inspect/plugin-1394.xml create mode 100644 docs/plugins/inspect/plugin-aasink.xml create mode 100644 docs/plugins/inspect/plugin-alaw.xml create mode 100644 docs/plugins/inspect/plugin-alpha.xml create mode 100644 docs/plugins/inspect/plugin-alphacolor.xml create mode 100644 docs/plugins/inspect/plugin-annodex.xml create mode 100644 docs/plugins/inspect/plugin-apetag.xml create mode 100644 docs/plugins/inspect/plugin-audiofx.xml create mode 100644 docs/plugins/inspect/plugin-audioparsers.xml create mode 100644 docs/plugins/inspect/plugin-auparse.xml create mode 100644 docs/plugins/inspect/plugin-autodetect.xml create mode 100644 docs/plugins/inspect/plugin-avi.xml create mode 100644 docs/plugins/inspect/plugin-cacasink.xml create mode 100644 docs/plugins/inspect/plugin-cairo.xml create mode 100644 docs/plugins/inspect/plugin-cutter.xml create mode 100644 docs/plugins/inspect/plugin-debug.xml create mode 100644 docs/plugins/inspect/plugin-deinterlace.xml create mode 100644 docs/plugins/inspect/plugin-directsound.xml create mode 100644 docs/plugins/inspect/plugin-dv.xml create mode 100644 docs/plugins/inspect/plugin-efence.xml create mode 100644 docs/plugins/inspect/plugin-effectv.xml create mode 100644 docs/plugins/inspect/plugin-equalizer.xml create mode 100644 docs/plugins/inspect/plugin-esdsink.xml create mode 100644 docs/plugins/inspect/plugin-flac.xml create mode 100644 docs/plugins/inspect/plugin-flv.xml create mode 100644 docs/plugins/inspect/plugin-flxdec.xml create mode 100644 docs/plugins/inspect/plugin-gconfelements.xml create mode 100644 docs/plugins/inspect/plugin-gdkpixbuf.xml create mode 100644 docs/plugins/inspect/plugin-goom.xml create mode 100644 docs/plugins/inspect/plugin-goom2k1.xml create mode 100644 docs/plugins/inspect/plugin-gstrtpmanager.xml create mode 100644 docs/plugins/inspect/plugin-halelements.xml create mode 100644 docs/plugins/inspect/plugin-icydemux.xml create mode 100644 docs/plugins/inspect/plugin-id3demux.xml create mode 100644 docs/plugins/inspect/plugin-imagefreeze.xml create mode 100644 docs/plugins/inspect/plugin-interleave.xml create mode 100644 docs/plugins/inspect/plugin-isomp4.xml create mode 100644 docs/plugins/inspect/plugin-jack.xml create mode 100644 docs/plugins/inspect/plugin-jpeg.xml create mode 100644 docs/plugins/inspect/plugin-level.xml create mode 100644 docs/plugins/inspect/plugin-matroska.xml create mode 100644 docs/plugins/inspect/plugin-monoscope.xml create mode 100644 docs/plugins/inspect/plugin-mulaw.xml create mode 100644 docs/plugins/inspect/plugin-multifile.xml create mode 100644 docs/plugins/inspect/plugin-multipart.xml create mode 100644 docs/plugins/inspect/plugin-navigationtest.xml create mode 100644 docs/plugins/inspect/plugin-oss4.xml create mode 100644 docs/plugins/inspect/plugin-ossaudio.xml create mode 100644 docs/plugins/inspect/plugin-osxaudio.xml create mode 100644 docs/plugins/inspect/plugin-osxvideo.xml create mode 100644 docs/plugins/inspect/plugin-png.xml create mode 100644 docs/plugins/inspect/plugin-pulseaudio.xml create mode 100644 docs/plugins/inspect/plugin-replaygain.xml create mode 100644 docs/plugins/inspect/plugin-rtp.xml create mode 100644 docs/plugins/inspect/plugin-rtsp.xml create mode 100644 docs/plugins/inspect/plugin-shapewipe.xml create mode 100644 docs/plugins/inspect/plugin-shout2send.xml create mode 100644 docs/plugins/inspect/plugin-smpte.xml create mode 100644 docs/plugins/inspect/plugin-soup.xml create mode 100644 docs/plugins/inspect/plugin-spectrum.xml create mode 100644 docs/plugins/inspect/plugin-speex.xml create mode 100644 docs/plugins/inspect/plugin-taglib.xml create mode 100644 docs/plugins/inspect/plugin-udp.xml create mode 100644 docs/plugins/inspect/plugin-video4linux2.xml create mode 100644 docs/plugins/inspect/plugin-videobox.xml create mode 100644 docs/plugins/inspect/plugin-videocrop.xml create mode 100644 docs/plugins/inspect/plugin-videofilter.xml create mode 100644 docs/plugins/inspect/plugin-videomixer.xml create mode 100644 docs/plugins/inspect/plugin-waveform.xml create mode 100644 docs/plugins/inspect/plugin-wavenc.xml create mode 100644 docs/plugins/inspect/plugin-wavpack.xml create mode 100644 docs/plugins/inspect/plugin-wavparse.xml create mode 100644 docs/plugins/inspect/plugin-ximagesrc.xml create mode 100644 docs/plugins/inspect/plugin-y4menc.xml create mode 100644 docs/plugins/scanobj-build.stamp create mode 100644 docs/random/ChangeLog-0.8 create mode 100644 docs/version.entities.in create mode 100644 ext/Makefile.am create mode 100644 ext/Makefile.in create mode 100644 ext/aalib/Makefile.am create mode 100644 ext/aalib/Makefile.in create mode 100644 ext/aalib/gstaasink.c create mode 100644 ext/aalib/gstaasink.h create mode 100644 ext/annodex/Makefile.am create mode 100644 ext/annodex/Makefile.in create mode 100644 ext/annodex/gstannodex.c create mode 100644 ext/annodex/gstannodex.h create mode 100644 ext/annodex/gstcmmldec.c create mode 100644 ext/annodex/gstcmmldec.h create mode 100644 ext/annodex/gstcmmlenc.c create mode 100644 ext/annodex/gstcmmlenc.h create mode 100644 ext/annodex/gstcmmlparser.c create mode 100644 ext/annodex/gstcmmlparser.h create mode 100644 ext/annodex/gstcmmltag.c create mode 100644 ext/annodex/gstcmmltag.h create mode 100644 ext/annodex/gstcmmlutils.c create mode 100644 ext/annodex/gstcmmlutils.h create mode 100644 ext/cairo/Makefile.am create mode 100644 ext/cairo/Makefile.in create mode 100644 ext/cairo/gstcairo-marshal.list create mode 100644 ext/cairo/gstcairo.c create mode 100644 ext/cairo/gstcairooverlay.c create mode 100644 ext/cairo/gstcairooverlay.h create mode 100644 ext/cairo/gstcairorender.c create mode 100644 ext/cairo/gstcairorender.h create mode 100644 ext/cairo/gsttextoverlay.c create mode 100644 ext/cairo/gsttextoverlay.h create mode 100644 ext/cairo/gsttimeoverlay.c create mode 100644 ext/cairo/gsttimeoverlay.h create mode 100644 ext/dv/Makefile.am create mode 100644 ext/dv/Makefile.in create mode 100644 ext/dv/NOTES create mode 100644 ext/dv/gstdv.c create mode 100644 ext/dv/gstdvdec.c create mode 100644 ext/dv/gstdvdec.h create mode 100644 ext/dv/gstdvdemux.c create mode 100644 ext/dv/gstdvdemux.h create mode 100644 ext/dv/gstsmptetimecode.c create mode 100644 ext/dv/gstsmptetimecode.h create mode 100644 ext/dv/smpte_test.c create mode 100644 ext/esd/Makefile.am create mode 100644 ext/esd/Makefile.in create mode 100644 ext/esd/esdmon.h create mode 100644 ext/esd/esdsink.c create mode 100644 ext/esd/esdsink.h create mode 100644 ext/esd/gstesd.c create mode 100644 ext/flac/Makefile.am create mode 100644 ext/flac/Makefile.in create mode 100644 ext/flac/gstflac.c create mode 100644 ext/flac/gstflacdec.c create mode 100644 ext/flac/gstflacdec.h create mode 100644 ext/flac/gstflacenc.c create mode 100644 ext/flac/gstflacenc.h create mode 100644 ext/flac/gstflactag.c create mode 100644 ext/flac/gstflactag.h create mode 100644 ext/gconf/Makefile.am create mode 100644 ext/gconf/Makefile.in create mode 100644 ext/gconf/gstgconf.c create mode 100644 ext/gconf/gstgconf.h create mode 100644 ext/gconf/gstgconfaudiosink.c create mode 100644 ext/gconf/gstgconfaudiosink.h create mode 100644 ext/gconf/gstgconfaudiosrc.c create mode 100644 ext/gconf/gstgconfaudiosrc.h create mode 100644 ext/gconf/gstgconfelements.c create mode 100644 ext/gconf/gstgconfelements.h create mode 100644 ext/gconf/gstgconfvideosink.c create mode 100644 ext/gconf/gstgconfvideosink.h create mode 100644 ext/gconf/gstgconfvideosrc.c create mode 100644 ext/gconf/gstgconfvideosrc.h create mode 100644 ext/gconf/gstswitchsink.c create mode 100644 ext/gconf/gstswitchsink.h create mode 100644 ext/gconf/gstswitchsrc.c create mode 100644 ext/gconf/gstswitchsrc.h create mode 100644 ext/gdk_pixbuf/Makefile.am create mode 100644 ext/gdk_pixbuf/Makefile.in create mode 100644 ext/gdk_pixbuf/gstgdkanimation.h create mode 100644 ext/gdk_pixbuf/gstgdkpixbuf.c create mode 100644 ext/gdk_pixbuf/gstgdkpixbuf.h create mode 100644 ext/gdk_pixbuf/gstgdkpixbufsink.c create mode 100644 ext/gdk_pixbuf/gstgdkpixbufsink.h create mode 100644 ext/gdk_pixbuf/pixbufscale.c create mode 100644 ext/gdk_pixbuf/pixbufscale.h create mode 100644 ext/hal/Makefile.am create mode 100644 ext/hal/Makefile.in create mode 100644 ext/hal/gsthalaudiosink.c create mode 100644 ext/hal/gsthalaudiosink.h create mode 100644 ext/hal/gsthalaudiosrc.c create mode 100644 ext/hal/gsthalaudiosrc.h create mode 100644 ext/hal/gsthalelements.c create mode 100644 ext/hal/gsthalelements.h create mode 100644 ext/hal/hal.c create mode 100644 ext/hal/hal.h create mode 100644 ext/jack/Makefile.am create mode 100644 ext/jack/Makefile.in create mode 100644 ext/jack/gstjack.c create mode 100644 ext/jack/gstjack.h create mode 100644 ext/jack/gstjackaudioclient.c create mode 100644 ext/jack/gstjackaudioclient.h create mode 100644 ext/jack/gstjackaudiosink.c create mode 100644 ext/jack/gstjackaudiosink.h create mode 100644 ext/jack/gstjackaudiosrc.c create mode 100644 ext/jack/gstjackaudiosrc.h create mode 100644 ext/jack/gstjackringbuffer.h create mode 100644 ext/jack/gstjackutil.c create mode 100644 ext/jack/gstjackutil.h create mode 100644 ext/jpeg/Makefile.am create mode 100644 ext/jpeg/Makefile.in create mode 100644 ext/jpeg/README create mode 100644 ext/jpeg/gstjpeg.c create mode 100644 ext/jpeg/gstjpeg.h create mode 100644 ext/jpeg/gstjpegdec.c create mode 100644 ext/jpeg/gstjpegdec.h create mode 100644 ext/jpeg/gstjpegenc.c create mode 100644 ext/jpeg/gstjpegenc.h create mode 100644 ext/jpeg/gstsmokedec.c create mode 100644 ext/jpeg/gstsmokedec.h create mode 100644 ext/jpeg/gstsmokeenc.c create mode 100644 ext/jpeg/gstsmokeenc.h create mode 100644 ext/jpeg/smokecodec.c create mode 100644 ext/jpeg/smokecodec.h create mode 100644 ext/jpeg/smokeformat.h create mode 100644 ext/libcaca/Makefile.am create mode 100644 ext/libcaca/Makefile.in create mode 100644 ext/libcaca/gstcacasink.c create mode 100644 ext/libcaca/gstcacasink.h create mode 100644 ext/libpng/Makefile.am create mode 100644 ext/libpng/Makefile.in create mode 100644 ext/libpng/gstpng.c create mode 100644 ext/libpng/gstpngdec.c create mode 100644 ext/libpng/gstpngdec.h create mode 100644 ext/libpng/gstpngenc.c create mode 100644 ext/libpng/gstpngenc.h create mode 100644 ext/pulse/Makefile.am create mode 100644 ext/pulse/Makefile.in create mode 100644 ext/pulse/plugin.c create mode 100644 ext/pulse/pulseaudiosink.c create mode 100644 ext/pulse/pulsemixer.c create mode 100644 ext/pulse/pulsemixer.h create mode 100644 ext/pulse/pulsemixerctrl.c create mode 100644 ext/pulse/pulsemixerctrl.h create mode 100644 ext/pulse/pulsemixertrack.c create mode 100644 ext/pulse/pulsemixertrack.h create mode 100644 ext/pulse/pulseprobe.c create mode 100644 ext/pulse/pulseprobe.h create mode 100644 ext/pulse/pulsesink.c create mode 100644 ext/pulse/pulsesink.h create mode 100644 ext/pulse/pulsesrc.c create mode 100644 ext/pulse/pulsesrc.h create mode 100644 ext/pulse/pulseutil.c create mode 100644 ext/pulse/pulseutil.h create mode 100644 ext/raw1394/Makefile.am create mode 100644 ext/raw1394/Makefile.in create mode 100644 ext/raw1394/gst1394.c create mode 100644 ext/raw1394/gst1394clock.c create mode 100644 ext/raw1394/gst1394clock.h create mode 100644 ext/raw1394/gst1394probe.c create mode 100644 ext/raw1394/gst1394probe.h create mode 100644 ext/raw1394/gstdv1394src.c create mode 100644 ext/raw1394/gstdv1394src.h create mode 100644 ext/raw1394/gsthdv1394src.c create mode 100644 ext/raw1394/gsthdv1394src.h create mode 100644 ext/shout2/Makefile.am create mode 100644 ext/shout2/Makefile.in create mode 100644 ext/shout2/gstshout2.c create mode 100644 ext/shout2/gstshout2.h create mode 100644 ext/soup/Makefile.am create mode 100644 ext/soup/Makefile.in create mode 100644 ext/soup/gstsoup.c create mode 100644 ext/soup/gstsouphttpclientsink.c create mode 100644 ext/soup/gstsouphttpclientsink.h create mode 100644 ext/soup/gstsouphttpsrc.c create mode 100644 ext/soup/gstsouphttpsrc.h create mode 100644 ext/speex/Makefile.am create mode 100644 ext/speex/Makefile.in create mode 100644 ext/speex/gstspeex.c create mode 100644 ext/speex/gstspeexdec.c create mode 100644 ext/speex/gstspeexdec.h create mode 100644 ext/speex/gstspeexenc.c create mode 100644 ext/speex/gstspeexenc.h create mode 100644 ext/taglib/Makefile.am create mode 100644 ext/taglib/Makefile.in create mode 100644 ext/taglib/gstapev2mux.cc create mode 100644 ext/taglib/gstapev2mux.h create mode 100644 ext/taglib/gstid3v2mux.cc create mode 100644 ext/taglib/gstid3v2mux.h create mode 100644 ext/taglib/gsttaglibmux.c create mode 100644 ext/taglib/gsttaglibmux.h create mode 100644 ext/wavpack/Makefile.am create mode 100644 ext/wavpack/Makefile.in create mode 100644 ext/wavpack/gstwavpack.c create mode 100644 ext/wavpack/gstwavpackcommon.c create mode 100644 ext/wavpack/gstwavpackcommon.h create mode 100644 ext/wavpack/gstwavpackdec.c create mode 100644 ext/wavpack/gstwavpackdec.h create mode 100644 ext/wavpack/gstwavpackenc.c create mode 100644 ext/wavpack/gstwavpackenc.h create mode 100644 ext/wavpack/gstwavpackparse.c create mode 100644 ext/wavpack/gstwavpackparse.h create mode 100644 ext/wavpack/gstwavpackstreamreader.c create mode 100644 ext/wavpack/gstwavpackstreamreader.h create mode 100644 gconf/Makefile.am create mode 100644 gconf/Makefile.in create mode 100644 gconf/gstreamer-0.10.schemas create mode 100644 gconf/gstreamer.schemas.in create mode 100644 gst-libs/gst/gettext.h create mode 100644 gst-libs/gst/glib-compat-private.h create mode 100644 gst-libs/gst/gst-i18n-plugin.h create mode 100644 gst-plugins-good.doap create mode 100755 gst-plugins-good.manifest create mode 100644 gst-plugins-good.spec.in create mode 100644 gst/Makefile.am create mode 100644 gst/Makefile.in create mode 100644 gst/alpha/Makefile.am create mode 100644 gst/alpha/Makefile.in create mode 100644 gst/alpha/gstalpha.c create mode 100644 gst/alpha/gstalpha.h create mode 100644 gst/alpha/gstalphacolor.c create mode 100644 gst/alpha/gstalphacolor.h create mode 100644 gst/apetag/Makefile.am create mode 100644 gst/apetag/Makefile.in create mode 100644 gst/apetag/gstapedemux.c create mode 100644 gst/apetag/gstapedemux.h create mode 100644 gst/audiofx/Makefile.am create mode 100644 gst/audiofx/Makefile.in create mode 100644 gst/audiofx/audioamplify.c create mode 100644 gst/audiofx/audioamplify.h create mode 100644 gst/audiofx/audiochebband.c create mode 100644 gst/audiofx/audiochebband.h create mode 100644 gst/audiofx/audiocheblimit.c create mode 100644 gst/audiofx/audiocheblimit.h create mode 100644 gst/audiofx/audiodynamic.c create mode 100644 gst/audiofx/audiodynamic.h create mode 100644 gst/audiofx/audioecho.c create mode 100644 gst/audiofx/audioecho.h create mode 100644 gst/audiofx/audiofirfilter.c create mode 100644 gst/audiofx/audiofirfilter.h create mode 100644 gst/audiofx/audiofx.c create mode 100644 gst/audiofx/audiofxbasefirfilter.c create mode 100644 gst/audiofx/audiofxbasefirfilter.h create mode 100644 gst/audiofx/audiofxbaseiirfilter.c create mode 100644 gst/audiofx/audiofxbaseiirfilter.h create mode 100644 gst/audiofx/audioiirfilter.c create mode 100644 gst/audiofx/audioiirfilter.h create mode 100644 gst/audiofx/audioinvert.c create mode 100644 gst/audiofx/audioinvert.h create mode 100644 gst/audiofx/audiokaraoke.c create mode 100644 gst/audiofx/audiokaraoke.h create mode 100644 gst/audiofx/audiopanorama.c create mode 100644 gst/audiofx/audiopanorama.h create mode 100644 gst/audiofx/audiowsincband.c create mode 100644 gst/audiofx/audiowsincband.h create mode 100644 gst/audiofx/audiowsinclimit.c create mode 100644 gst/audiofx/audiowsinclimit.h create mode 100644 gst/audiofx/math_compat.h create mode 100644 gst/audioparsers/Makefile.am create mode 100644 gst/audioparsers/Makefile.in create mode 100644 gst/audioparsers/gstaacparse.c create mode 100644 gst/audioparsers/gstaacparse.h create mode 100644 gst/audioparsers/gstac3parse.c create mode 100644 gst/audioparsers/gstac3parse.h create mode 100644 gst/audioparsers/gstamrparse.c create mode 100644 gst/audioparsers/gstamrparse.h create mode 100644 gst/audioparsers/gstdcaparse.c create mode 100644 gst/audioparsers/gstdcaparse.h create mode 100644 gst/audioparsers/gstflacparse.c create mode 100644 gst/audioparsers/gstflacparse.h create mode 100644 gst/audioparsers/gstmpegaudioparse.c create mode 100644 gst/audioparsers/gstmpegaudioparse.h create mode 100644 gst/audioparsers/plugin.c create mode 100644 gst/auparse/Makefile.am create mode 100644 gst/auparse/Makefile.in create mode 100644 gst/auparse/gstauparse.c create mode 100644 gst/auparse/gstauparse.h create mode 100644 gst/autodetect/Makefile.am create mode 100644 gst/autodetect/Makefile.in create mode 100644 gst/autodetect/gstautoaudiosink.c create mode 100644 gst/autodetect/gstautoaudiosink.h create mode 100644 gst/autodetect/gstautoaudiosrc.c create mode 100644 gst/autodetect/gstautoaudiosrc.h create mode 100644 gst/autodetect/gstautodetect.c create mode 100644 gst/autodetect/gstautodetect.h create mode 100644 gst/autodetect/gstautovideosink.c create mode 100644 gst/autodetect/gstautovideosink.h create mode 100644 gst/autodetect/gstautovideosrc.c create mode 100644 gst/autodetect/gstautovideosrc.h create mode 100644 gst/avi/Makefile.am create mode 100644 gst/avi/Makefile.in create mode 100644 gst/avi/README create mode 100644 gst/avi/avi-ids.h create mode 100644 gst/avi/gstavi.c create mode 100644 gst/avi/gstavidemux.c create mode 100644 gst/avi/gstavidemux.h create mode 100644 gst/avi/gstavimux.c create mode 100644 gst/avi/gstavimux.h create mode 100644 gst/avi/gstavisubtitle.c create mode 100644 gst/avi/gstavisubtitle.h create mode 100644 gst/cutter/Makefile.am create mode 100644 gst/cutter/Makefile.in create mode 100644 gst/cutter/README create mode 100644 gst/cutter/filter.func create mode 100644 gst/cutter/gstcutter.c create mode 100644 gst/cutter/gstcutter.h create mode 100644 gst/debugutils/Makefile.am create mode 100644 gst/debugutils/Makefile.in create mode 100644 gst/debugutils/breakmydata.c create mode 100644 gst/debugutils/cpureport.c create mode 100644 gst/debugutils/cpureport.h create mode 100644 gst/debugutils/efence.c create mode 100644 gst/debugutils/efence.h create mode 100644 gst/debugutils/gstcapsdebug.c create mode 100644 gst/debugutils/gstcapsdebug.h create mode 100644 gst/debugutils/gstcapssetter.c create mode 100644 gst/debugutils/gstcapssetter.h create mode 100644 gst/debugutils/gstdebug.c create mode 100644 gst/debugutils/gstnavigationtest.c create mode 100644 gst/debugutils/gstnavigationtest.h create mode 100644 gst/debugutils/gstnavseek.c create mode 100644 gst/debugutils/gstnavseek.h create mode 100644 gst/debugutils/gstpushfilesrc.c create mode 100644 gst/debugutils/gstpushfilesrc.h create mode 100644 gst/debugutils/gsttaginject.c create mode 100644 gst/debugutils/gsttaginject.h create mode 100644 gst/debugutils/progressreport.c create mode 100644 gst/debugutils/progressreport.h create mode 100644 gst/debugutils/rndbuffersize.c create mode 100644 gst/debugutils/testplugin.c create mode 100644 gst/debugutils/tests.c create mode 100644 gst/debugutils/tests.h create mode 100644 gst/deinterlace/Makefile.am create mode 100644 gst/deinterlace/Makefile.in create mode 100644 gst/deinterlace/gstdeinterlace.c create mode 100644 gst/deinterlace/gstdeinterlace.h create mode 100644 gst/deinterlace/gstdeinterlacemethod.c create mode 100644 gst/deinterlace/gstdeinterlacemethod.h create mode 100644 gst/deinterlace/tvtime-dist.c create mode 100644 gst/deinterlace/tvtime-dist.h create mode 100644 gst/deinterlace/tvtime.orc create mode 100644 gst/deinterlace/tvtime/greedy.c create mode 100644 gst/deinterlace/tvtime/greedyh.asm create mode 100644 gst/deinterlace/tvtime/greedyh.c create mode 100644 gst/deinterlace/tvtime/greedyhmacros.h create mode 100644 gst/deinterlace/tvtime/linear.c create mode 100644 gst/deinterlace/tvtime/linearblend.c create mode 100644 gst/deinterlace/tvtime/mmx.h create mode 100644 gst/deinterlace/tvtime/plugins.h create mode 100644 gst/deinterlace/tvtime/scalerbob.c create mode 100644 gst/deinterlace/tvtime/sse.h create mode 100644 gst/deinterlace/tvtime/tomsmocomp.c create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoop0A.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopBottom.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA8.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA2.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA6.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH2.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopTop.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopVA.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/SearchLoopVAH.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/StrangeBob.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll2.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/WierdBob.inc create mode 100644 gst/deinterlace/tvtime/tomsmocomp/tomsmocompmacros.h create mode 100644 gst/deinterlace/tvtime/vfir.c create mode 100644 gst/deinterlace/tvtime/weave.c create mode 100644 gst/deinterlace/tvtime/weavebff.c create mode 100644 gst/deinterlace/tvtime/weavetff.c create mode 100644 gst/deinterlace/tvtime/x86-64_macros.inc create mode 100644 gst/effectv/Makefile.am create mode 100644 gst/effectv/Makefile.in create mode 100644 gst/effectv/gstaging.c create mode 100644 gst/effectv/gstaging.h create mode 100644 gst/effectv/gstdice.c create mode 100644 gst/effectv/gstdice.h create mode 100644 gst/effectv/gstedge.c create mode 100644 gst/effectv/gstedge.h create mode 100644 gst/effectv/gsteffectv.c create mode 100644 gst/effectv/gsteffectv.h create mode 100644 gst/effectv/gstop.c create mode 100644 gst/effectv/gstop.h create mode 100644 gst/effectv/gstquark.c create mode 100644 gst/effectv/gstquark.h create mode 100644 gst/effectv/gstradioac.c create mode 100644 gst/effectv/gstradioac.h create mode 100644 gst/effectv/gstrev.c create mode 100644 gst/effectv/gstrev.h create mode 100644 gst/effectv/gstripple.c create mode 100644 gst/effectv/gstripple.h create mode 100644 gst/effectv/gstshagadelic.c create mode 100644 gst/effectv/gstshagadelic.h create mode 100644 gst/effectv/gststreak.c create mode 100644 gst/effectv/gststreak.h create mode 100644 gst/effectv/gstvertigo.c create mode 100644 gst/effectv/gstvertigo.h create mode 100644 gst/effectv/gstwarp.c create mode 100644 gst/effectv/gstwarp.h create mode 100644 gst/equalizer/GstIirEqualizer10Bands.prs create mode 100644 gst/equalizer/GstIirEqualizer3Bands.prs create mode 100644 gst/equalizer/Makefile.am create mode 100644 gst/equalizer/Makefile.in create mode 100644 gst/equalizer/gstiirequalizer.c create mode 100644 gst/equalizer/gstiirequalizer.h create mode 100644 gst/equalizer/gstiirequalizer10bands.c create mode 100644 gst/equalizer/gstiirequalizer10bands.h create mode 100644 gst/equalizer/gstiirequalizer3bands.c create mode 100644 gst/equalizer/gstiirequalizer3bands.h create mode 100644 gst/equalizer/gstiirequalizernbands.c create mode 100644 gst/equalizer/gstiirequalizernbands.h create mode 100644 gst/flv/Makefile.am create mode 100644 gst/flv/Makefile.in create mode 100644 gst/flv/amfdefs.h create mode 100644 gst/flv/gstflvdemux.c create mode 100644 gst/flv/gstflvdemux.h create mode 100644 gst/flv/gstflvmux.c create mode 100644 gst/flv/gstflvmux.h create mode 100644 gst/flx/Makefile.am create mode 100644 gst/flx/Makefile.in create mode 100644 gst/flx/flx_color.c create mode 100644 gst/flx/flx_color.h create mode 100644 gst/flx/flx_fmt.h create mode 100644 gst/flx/gstflxdec.c create mode 100644 gst/flx/gstflxdec.h create mode 100644 gst/goom/Makefile.am create mode 100644 gst/goom/Makefile.in create mode 100644 gst/goom/README create mode 100644 gst/goom/config_param.c create mode 100644 gst/goom/convolve_fx.c create mode 100644 gst/goom/drawmethods.c create mode 100644 gst/goom/drawmethods.h create mode 100644 gst/goom/filters.c create mode 100644 gst/goom/flying_stars_fx.c create mode 100644 gst/goom/goom.h create mode 100644 gst/goom/goom_config.h create mode 100644 gst/goom/goom_config_param.h create mode 100644 gst/goom/goom_core.c create mode 100644 gst/goom/goom_filters.h create mode 100644 gst/goom/goom_fx.h create mode 100644 gst/goom/goom_graphic.h create mode 100644 gst/goom/goom_plugin_info.h create mode 100644 gst/goom/goom_tools.c create mode 100644 gst/goom/goom_tools.h create mode 100644 gst/goom/goom_typedefs.h create mode 100644 gst/goom/goom_visual_fx.h create mode 100644 gst/goom/graphic.c create mode 100644 gst/goom/gstgoom.c create mode 100644 gst/goom/gstgoom.h create mode 100644 gst/goom/ifs.c create mode 100644 gst/goom/ifs.h create mode 100644 gst/goom/lines.c create mode 100644 gst/goom/lines.h create mode 100644 gst/goom/mathtools.c create mode 100644 gst/goom/mathtools.h create mode 100644 gst/goom/mmx.c create mode 100644 gst/goom/mmx.h create mode 100644 gst/goom/motif_goom1.h create mode 100644 gst/goom/motif_goom2.h create mode 100644 gst/goom/plugin_info.c create mode 100644 gst/goom/ppc_drawings.h create mode 100644 gst/goom/ppc_drawings.s create mode 100644 gst/goom/ppc_zoom_ultimate.h create mode 100644 gst/goom/ppc_zoom_ultimate.s create mode 100644 gst/goom/sound_tester.c create mode 100644 gst/goom/sound_tester.h create mode 100644 gst/goom/surf3d.c create mode 100644 gst/goom/surf3d.h create mode 100644 gst/goom/tentacle3d.c create mode 100644 gst/goom/tentacle3d.h create mode 100644 gst/goom/v3d.c create mode 100644 gst/goom/v3d.h create mode 100644 gst/goom/xmmx.c create mode 100644 gst/goom/xmmx.h create mode 100644 gst/goom2k1/Makefile.am create mode 100644 gst/goom2k1/Makefile.in create mode 100644 gst/goom2k1/README create mode 100644 gst/goom2k1/filters.c create mode 100644 gst/goom2k1/filters.h create mode 100644 gst/goom2k1/goom_core.c create mode 100644 gst/goom2k1/goom_core.h create mode 100644 gst/goom2k1/goom_tools.h create mode 100644 gst/goom2k1/graphic.c create mode 100644 gst/goom2k1/graphic.h create mode 100644 gst/goom2k1/gstgoom.c create mode 100644 gst/goom2k1/gstgoom.h create mode 100644 gst/goom2k1/lines.c create mode 100644 gst/goom2k1/lines.h create mode 100644 gst/icydemux/Makefile.am create mode 100644 gst/icydemux/Makefile.in create mode 100644 gst/icydemux/gsticydemux.c create mode 100644 gst/icydemux/gsticydemux.h create mode 100644 gst/id3demux/Makefile.am create mode 100644 gst/id3demux/Makefile.in create mode 100644 gst/id3demux/gstid3demux.c create mode 100644 gst/id3demux/gstid3demux.h create mode 100644 gst/imagefreeze/Makefile.am create mode 100644 gst/imagefreeze/Makefile.in create mode 100644 gst/imagefreeze/gstimagefreeze.c create mode 100644 gst/imagefreeze/gstimagefreeze.h create mode 100644 gst/interleave/Makefile.am create mode 100644 gst/interleave/Makefile.in create mode 100644 gst/interleave/deinterleave.c create mode 100644 gst/interleave/deinterleave.h create mode 100644 gst/interleave/interleave.c create mode 100644 gst/interleave/interleave.h create mode 100644 gst/interleave/plugin.c create mode 100644 gst/interleave/plugin.h create mode 100644 gst/isomp4/Makefile.am create mode 100644 gst/isomp4/Makefile.in create mode 100644 gst/isomp4/atoms.c create mode 100644 gst/isomp4/atoms.h create mode 100644 gst/isomp4/atomsrecovery.c create mode 100644 gst/isomp4/atomsrecovery.h create mode 100644 gst/isomp4/descriptors.c create mode 100644 gst/isomp4/descriptors.h create mode 100644 gst/isomp4/fourcc.h create mode 100644 gst/isomp4/ftypcc.h create mode 100644 gst/isomp4/gstqtmoovrecover.c create mode 100644 gst/isomp4/gstqtmoovrecover.h create mode 100644 gst/isomp4/gstqtmux-doc.c create mode 100644 gst/isomp4/gstqtmux-doc.h create mode 100644 gst/isomp4/gstqtmux.c create mode 100644 gst/isomp4/gstqtmux.h create mode 100644 gst/isomp4/gstqtmuxmap.c create mode 100644 gst/isomp4/gstqtmuxmap.h create mode 100644 gst/isomp4/gstrtpxqtdepay.c create mode 100644 gst/isomp4/gstrtpxqtdepay.h create mode 100644 gst/isomp4/isomp4-plugin.c create mode 100644 gst/isomp4/properties.c create mode 100644 gst/isomp4/properties.h create mode 100644 gst/isomp4/qtatomparser.h create mode 100644 gst/isomp4/qtdemux.c create mode 100644 gst/isomp4/qtdemux.h create mode 100644 gst/isomp4/qtdemux_dump.c create mode 100644 gst/isomp4/qtdemux_dump.h create mode 100644 gst/isomp4/qtdemux_fourcc.h create mode 100644 gst/isomp4/qtdemux_lang.c create mode 100644 gst/isomp4/qtdemux_lang.h create mode 100644 gst/isomp4/qtdemux_types.c create mode 100644 gst/isomp4/qtdemux_types.h create mode 100644 gst/isomp4/qtpalette.h create mode 100644 gst/law/Makefile.am create mode 100644 gst/law/Makefile.in create mode 100644 gst/law/alaw-decode.c create mode 100644 gst/law/alaw-decode.h create mode 100644 gst/law/alaw-encode.c create mode 100644 gst/law/alaw-encode.h create mode 100644 gst/law/alaw.c create mode 100644 gst/law/mulaw-conversion.c create mode 100644 gst/law/mulaw-conversion.h create mode 100644 gst/law/mulaw-decode.c create mode 100644 gst/law/mulaw-decode.h create mode 100644 gst/law/mulaw-encode.c create mode 100644 gst/law/mulaw-encode.h create mode 100644 gst/law/mulaw.c create mode 100644 gst/level/Makefile.am create mode 100644 gst/level/Makefile.in create mode 100644 gst/level/gstlevel.c create mode 100644 gst/level/gstlevel.h create mode 100644 gst/matroska/Makefile.am create mode 100644 gst/matroska/Makefile.in create mode 100644 gst/matroska/ebml-ids.h create mode 100644 gst/matroska/ebml-read.c create mode 100644 gst/matroska/ebml-read.h create mode 100644 gst/matroska/ebml-write.c create mode 100644 gst/matroska/ebml-write.h create mode 100644 gst/matroska/lzo.c create mode 100644 gst/matroska/lzo.h create mode 100644 gst/matroska/matroska-demux.c create mode 100644 gst/matroska/matroska-demux.h create mode 100644 gst/matroska/matroska-ids.c create mode 100644 gst/matroska/matroska-ids.h create mode 100644 gst/matroska/matroska-mux.c create mode 100644 gst/matroska/matroska-mux.h create mode 100644 gst/matroska/matroska-parse.c create mode 100644 gst/matroska/matroska-parse.h create mode 100644 gst/matroska/matroska-read-common.c create mode 100644 gst/matroska/matroska-read-common.h create mode 100644 gst/matroska/matroska.c create mode 100644 gst/matroska/webm-mux.c create mode 100644 gst/matroska/webm-mux.h create mode 100644 gst/monoscope/Makefile.am create mode 100644 gst/monoscope/Makefile.in create mode 100644 gst/monoscope/README create mode 100644 gst/monoscope/convolve.c create mode 100644 gst/monoscope/convolve.h create mode 100644 gst/monoscope/gstmonoscope.c create mode 100644 gst/monoscope/gstmonoscope.h create mode 100644 gst/monoscope/monoscope.c create mode 100644 gst/monoscope/monoscope.h create mode 100644 gst/multifile/Makefile.am create mode 100644 gst/multifile/Makefile.in create mode 100644 gst/multifile/gstmultifile.c create mode 100644 gst/multifile/gstmultifilesink.c create mode 100644 gst/multifile/gstmultifilesink.h create mode 100644 gst/multifile/gstmultifilesrc.c create mode 100644 gst/multifile/gstmultifilesrc.h create mode 100644 gst/multifile/gstsplitfilesrc.c create mode 100644 gst/multifile/gstsplitfilesrc.h create mode 100644 gst/multifile/patternspec.c create mode 100644 gst/multifile/patternspec.h create mode 100644 gst/multipart/Makefile.am create mode 100644 gst/multipart/Makefile.in create mode 100644 gst/multipart/multipart.c create mode 100644 gst/multipart/multipartdemux.c create mode 100644 gst/multipart/multipartdemux.h create mode 100644 gst/multipart/multipartmux.c create mode 100644 gst/multipart/multipartmux.h create mode 100644 gst/replaygain/Makefile.am create mode 100644 gst/replaygain/Makefile.in create mode 100644 gst/replaygain/gstrganalysis.c create mode 100644 gst/replaygain/gstrganalysis.h create mode 100644 gst/replaygain/gstrglimiter.c create mode 100644 gst/replaygain/gstrglimiter.h create mode 100644 gst/replaygain/gstrgvolume.c create mode 100644 gst/replaygain/gstrgvolume.h create mode 100644 gst/replaygain/replaygain.c create mode 100644 gst/replaygain/replaygain.h create mode 100644 gst/replaygain/rganalysis.c create mode 100644 gst/replaygain/rganalysis.h create mode 100644 gst/rtp/Makefile.am create mode 100644 gst/rtp/Makefile.in create mode 100644 gst/rtp/README create mode 100644 gst/rtp/TODO create mode 100644 gst/rtp/fnv1hash.c create mode 100644 gst/rtp/fnv1hash.h create mode 100644 gst/rtp/gstasteriskh263.c create mode 100644 gst/rtp/gstasteriskh263.h create mode 100644 gst/rtp/gstrtp.c create mode 100644 gst/rtp/gstrtpL16depay.c create mode 100644 gst/rtp/gstrtpL16depay.h create mode 100644 gst/rtp/gstrtpL16pay.c create mode 100644 gst/rtp/gstrtpL16pay.h create mode 100644 gst/rtp/gstrtpac3depay.c create mode 100644 gst/rtp/gstrtpac3depay.h create mode 100644 gst/rtp/gstrtpac3pay.c create mode 100644 gst/rtp/gstrtpac3pay.h create mode 100644 gst/rtp/gstrtpamrdepay.c create mode 100644 gst/rtp/gstrtpamrdepay.h create mode 100644 gst/rtp/gstrtpamrpay.c create mode 100644 gst/rtp/gstrtpamrpay.h create mode 100644 gst/rtp/gstrtpbvdepay.c create mode 100644 gst/rtp/gstrtpbvdepay.h create mode 100644 gst/rtp/gstrtpbvpay.c create mode 100644 gst/rtp/gstrtpbvpay.h create mode 100644 gst/rtp/gstrtpceltdepay.c create mode 100644 gst/rtp/gstrtpceltdepay.h create mode 100644 gst/rtp/gstrtpceltpay.c create mode 100644 gst/rtp/gstrtpceltpay.h create mode 100644 gst/rtp/gstrtpchannels.c create mode 100644 gst/rtp/gstrtpchannels.h create mode 100644 gst/rtp/gstrtpdepay.c create mode 100644 gst/rtp/gstrtpdepay.h create mode 100644 gst/rtp/gstrtpdvdepay.c create mode 100644 gst/rtp/gstrtpdvdepay.h create mode 100644 gst/rtp/gstrtpdvpay.c create mode 100644 gst/rtp/gstrtpdvpay.h create mode 100644 gst/rtp/gstrtpg722depay.c create mode 100644 gst/rtp/gstrtpg722depay.h create mode 100644 gst/rtp/gstrtpg722pay.c create mode 100644 gst/rtp/gstrtpg722pay.h create mode 100644 gst/rtp/gstrtpg723depay.c create mode 100644 gst/rtp/gstrtpg723depay.h create mode 100644 gst/rtp/gstrtpg723pay.c create mode 100644 gst/rtp/gstrtpg723pay.h create mode 100644 gst/rtp/gstrtpg726depay.c create mode 100644 gst/rtp/gstrtpg726depay.h create mode 100644 gst/rtp/gstrtpg726pay.c create mode 100644 gst/rtp/gstrtpg726pay.h create mode 100644 gst/rtp/gstrtpg729depay.c create mode 100644 gst/rtp/gstrtpg729depay.h create mode 100644 gst/rtp/gstrtpg729pay.c create mode 100644 gst/rtp/gstrtpg729pay.h create mode 100644 gst/rtp/gstrtpgsmdepay.c create mode 100644 gst/rtp/gstrtpgsmdepay.h create mode 100644 gst/rtp/gstrtpgsmpay.c create mode 100644 gst/rtp/gstrtpgsmpay.h create mode 100644 gst/rtp/gstrtpgstdepay.c create mode 100644 gst/rtp/gstrtpgstdepay.h create mode 100644 gst/rtp/gstrtpgstpay.c create mode 100644 gst/rtp/gstrtpgstpay.h create mode 100644 gst/rtp/gstrtph263depay.c create mode 100644 gst/rtp/gstrtph263depay.h create mode 100644 gst/rtp/gstrtph263pay.c create mode 100644 gst/rtp/gstrtph263pay.h create mode 100644 gst/rtp/gstrtph263pdepay.c create mode 100644 gst/rtp/gstrtph263pdepay.h create mode 100644 gst/rtp/gstrtph263ppay.c create mode 100644 gst/rtp/gstrtph263ppay.h create mode 100644 gst/rtp/gstrtph264depay.c create mode 100644 gst/rtp/gstrtph264depay.h create mode 100644 gst/rtp/gstrtph264pay.c create mode 100644 gst/rtp/gstrtph264pay.h create mode 100644 gst/rtp/gstrtpilbcdepay.c create mode 100644 gst/rtp/gstrtpilbcdepay.h create mode 100644 gst/rtp/gstrtpilbcpay.c create mode 100644 gst/rtp/gstrtpilbcpay.h create mode 100644 gst/rtp/gstrtpj2kdepay.c create mode 100644 gst/rtp/gstrtpj2kdepay.h create mode 100644 gst/rtp/gstrtpj2kpay.c create mode 100644 gst/rtp/gstrtpj2kpay.h create mode 100644 gst/rtp/gstrtpjpegdepay.c create mode 100644 gst/rtp/gstrtpjpegdepay.h create mode 100644 gst/rtp/gstrtpjpegpay.c create mode 100644 gst/rtp/gstrtpjpegpay.h create mode 100644 gst/rtp/gstrtpmp1sdepay.c create mode 100644 gst/rtp/gstrtpmp1sdepay.h create mode 100644 gst/rtp/gstrtpmp2tdepay.c create mode 100644 gst/rtp/gstrtpmp2tdepay.h create mode 100644 gst/rtp/gstrtpmp2tpay.c create mode 100644 gst/rtp/gstrtpmp2tpay.h create mode 100644 gst/rtp/gstrtpmp4adepay.c create mode 100644 gst/rtp/gstrtpmp4adepay.h create mode 100644 gst/rtp/gstrtpmp4apay.c create mode 100644 gst/rtp/gstrtpmp4apay.h create mode 100644 gst/rtp/gstrtpmp4gdepay.c create mode 100644 gst/rtp/gstrtpmp4gdepay.h create mode 100644 gst/rtp/gstrtpmp4gpay.c create mode 100644 gst/rtp/gstrtpmp4gpay.h create mode 100644 gst/rtp/gstrtpmp4vdepay.c create mode 100644 gst/rtp/gstrtpmp4vdepay.h create mode 100644 gst/rtp/gstrtpmp4vpay.c create mode 100644 gst/rtp/gstrtpmp4vpay.h create mode 100644 gst/rtp/gstrtpmpadepay.c create mode 100644 gst/rtp/gstrtpmpadepay.h create mode 100644 gst/rtp/gstrtpmpapay.c create mode 100644 gst/rtp/gstrtpmpapay.h create mode 100644 gst/rtp/gstrtpmparobustdepay.c create mode 100644 gst/rtp/gstrtpmparobustdepay.h create mode 100644 gst/rtp/gstrtpmpvdepay.c create mode 100644 gst/rtp/gstrtpmpvdepay.h create mode 100644 gst/rtp/gstrtpmpvpay.c create mode 100644 gst/rtp/gstrtpmpvpay.h create mode 100644 gst/rtp/gstrtppcmadepay.c create mode 100644 gst/rtp/gstrtppcmadepay.h create mode 100644 gst/rtp/gstrtppcmapay.c create mode 100644 gst/rtp/gstrtppcmapay.h create mode 100644 gst/rtp/gstrtppcmudepay.c create mode 100644 gst/rtp/gstrtppcmudepay.h create mode 100644 gst/rtp/gstrtppcmupay.c create mode 100644 gst/rtp/gstrtppcmupay.h create mode 100644 gst/rtp/gstrtpqcelpdepay.c create mode 100644 gst/rtp/gstrtpqcelpdepay.h create mode 100644 gst/rtp/gstrtpqdmdepay.c create mode 100644 gst/rtp/gstrtpqdmdepay.h create mode 100644 gst/rtp/gstrtpsirendepay.c create mode 100644 gst/rtp/gstrtpsirendepay.h create mode 100644 gst/rtp/gstrtpsirenpay.c create mode 100644 gst/rtp/gstrtpsirenpay.h create mode 100644 gst/rtp/gstrtpspeexdepay.c create mode 100644 gst/rtp/gstrtpspeexdepay.h create mode 100644 gst/rtp/gstrtpspeexpay.c create mode 100644 gst/rtp/gstrtpspeexpay.h create mode 100644 gst/rtp/gstrtpsv3vdepay.c create mode 100644 gst/rtp/gstrtpsv3vdepay.h create mode 100644 gst/rtp/gstrtptheoradepay.c create mode 100644 gst/rtp/gstrtptheoradepay.h create mode 100644 gst/rtp/gstrtptheorapay.c create mode 100644 gst/rtp/gstrtptheorapay.h create mode 100644 gst/rtp/gstrtpvorbisdepay.c create mode 100644 gst/rtp/gstrtpvorbisdepay.h create mode 100644 gst/rtp/gstrtpvorbispay.c create mode 100644 gst/rtp/gstrtpvorbispay.h create mode 100644 gst/rtp/gstrtpvrawdepay.c create mode 100644 gst/rtp/gstrtpvrawdepay.h create mode 100644 gst/rtp/gstrtpvrawpay.c create mode 100644 gst/rtp/gstrtpvrawpay.h create mode 100644 gst/rtpmanager/Makefile.am create mode 100644 gst/rtpmanager/Makefile.in create mode 100644 gst/rtpmanager/gstrtpbin-marshal.list create mode 100644 gst/rtpmanager/gstrtpbin.c create mode 100644 gst/rtpmanager/gstrtpbin.h create mode 100644 gst/rtpmanager/gstrtpjitterbuffer.c create mode 100644 gst/rtpmanager/gstrtpjitterbuffer.h create mode 100644 gst/rtpmanager/gstrtpmanager.c create mode 100644 gst/rtpmanager/gstrtpptdemux.c create mode 100644 gst/rtpmanager/gstrtpptdemux.h create mode 100644 gst/rtpmanager/gstrtpsession.c create mode 100644 gst/rtpmanager/gstrtpsession.h create mode 100644 gst/rtpmanager/gstrtpssrcdemux.c create mode 100644 gst/rtpmanager/gstrtpssrcdemux.h create mode 100644 gst/rtpmanager/rtpjitterbuffer.c create mode 100644 gst/rtpmanager/rtpjitterbuffer.h create mode 100644 gst/rtpmanager/rtpsession.c create mode 100644 gst/rtpmanager/rtpsession.h create mode 100644 gst/rtpmanager/rtpsource.c create mode 100644 gst/rtpmanager/rtpsource.h create mode 100644 gst/rtpmanager/rtpstats.c create mode 100644 gst/rtpmanager/rtpstats.h create mode 100644 gst/rtsp/Makefile.am create mode 100644 gst/rtsp/Makefile.in create mode 100644 gst/rtsp/README create mode 100644 gst/rtsp/gstrtpdec.c create mode 100644 gst/rtsp/gstrtpdec.h create mode 100644 gst/rtsp/gstrtsp.c create mode 100644 gst/rtsp/gstrtsp.h create mode 100644 gst/rtsp/gstrtspext.c create mode 100644 gst/rtsp/gstrtspext.h create mode 100644 gst/rtsp/gstrtspsrc.c create mode 100644 gst/rtsp/gstrtspsrc.h create mode 100644 gst/shapewipe/Makefile.am create mode 100644 gst/shapewipe/Makefile.in create mode 100644 gst/shapewipe/gstshapewipe.c create mode 100644 gst/shapewipe/gstshapewipe.h create mode 100644 gst/smpte/Makefile.am create mode 100644 gst/smpte/Makefile.in create mode 100644 gst/smpte/barboxwipes.c create mode 100644 gst/smpte/gstmask.c create mode 100644 gst/smpte/gstmask.h create mode 100644 gst/smpte/gstsmpte.c create mode 100644 gst/smpte/gstsmpte.h create mode 100644 gst/smpte/gstsmptealpha.c create mode 100644 gst/smpte/gstsmptealpha.h create mode 100644 gst/smpte/paint.c create mode 100644 gst/smpte/paint.h create mode 100644 gst/smpte/plugin.c create mode 100644 gst/spectrum/Makefile.am create mode 100644 gst/spectrum/Makefile.in create mode 100644 gst/spectrum/README create mode 100644 gst/spectrum/gstspectrum.c create mode 100644 gst/spectrum/gstspectrum.h create mode 100644 gst/udp/Makefile.am create mode 100644 gst/udp/Makefile.in create mode 100644 gst/udp/README create mode 100644 gst/udp/gstdynudpsink.c create mode 100644 gst/udp/gstdynudpsink.h create mode 100644 gst/udp/gstmultiudpsink.c create mode 100644 gst/udp/gstmultiudpsink.h create mode 100644 gst/udp/gstudp-marshal.list create mode 100644 gst/udp/gstudp.c create mode 100644 gst/udp/gstudp.h create mode 100644 gst/udp/gstudpnetutils.c create mode 100644 gst/udp/gstudpnetutils.h create mode 100644 gst/udp/gstudpsink.c create mode 100644 gst/udp/gstudpsink.h create mode 100644 gst/udp/gstudpsrc.c create mode 100644 gst/udp/gstudpsrc.h create mode 100644 gst/videobox/Makefile.am create mode 100644 gst/videobox/Makefile.in create mode 100644 gst/videobox/README create mode 100644 gst/videobox/gstvideobox.c create mode 100644 gst/videobox/gstvideobox.h create mode 100644 gst/videobox/gstvideoboxorc-dist.c create mode 100644 gst/videobox/gstvideoboxorc-dist.h create mode 100644 gst/videobox/gstvideoboxorc.orc create mode 100644 gst/videocrop/Makefile.am create mode 100644 gst/videocrop/Makefile.in create mode 100644 gst/videocrop/gstaspectratiocrop.c create mode 100644 gst/videocrop/gstaspectratiocrop.h create mode 100644 gst/videocrop/gstvideocrop.c create mode 100644 gst/videocrop/gstvideocrop.h create mode 100644 gst/videofilter/Makefile.am create mode 100644 gst/videofilter/Makefile.in create mode 100644 gst/videofilter/gstgamma.c create mode 100644 gst/videofilter/gstgamma.h create mode 100644 gst/videofilter/gstvideobalance.c create mode 100644 gst/videofilter/gstvideobalance.h create mode 100644 gst/videofilter/gstvideoflip.c create mode 100644 gst/videofilter/gstvideoflip.h create mode 100644 gst/videofilter/gstvideotemplate.c create mode 100755 gst/videofilter/make_filter create mode 100644 gst/videofilter/plugin.c create mode 100644 gst/videomixer/Makefile.am create mode 100644 gst/videomixer/Makefile.in create mode 100644 gst/videomixer/README create mode 100644 gst/videomixer/blend.c create mode 100644 gst/videomixer/blend.h create mode 100644 gst/videomixer/blendorc-dist.c create mode 100644 gst/videomixer/blendorc-dist.h create mode 100644 gst/videomixer/blendorc.orc create mode 100644 gst/videomixer/videomixer.c create mode 100644 gst/videomixer/videomixer.h create mode 100644 gst/videomixer/videomixer2.c create mode 100644 gst/videomixer/videomixer2.h create mode 100644 gst/videomixer/videomixer2pad.h create mode 100644 gst/videomixer/videomixerpad.h create mode 100644 gst/wavenc/Makefile.am create mode 100644 gst/wavenc/Makefile.in create mode 100644 gst/wavenc/gstwavenc.c create mode 100644 gst/wavenc/gstwavenc.h create mode 100644 gst/wavparse/Makefile.am create mode 100644 gst/wavparse/Makefile.in create mode 100644 gst/wavparse/gstwavparse.c create mode 100644 gst/wavparse/gstwavparse.h create mode 100644 gst/y4m/Makefile.am create mode 100644 gst/y4m/Makefile.in create mode 100644 gst/y4m/gsty4mencode.c create mode 100644 gst/y4m/gsty4mencode.h create mode 100755 install-sh create mode 100644 ltmain.sh create mode 100644 m4/Makefile.am create mode 100644 m4/Makefile.in create mode 100644 m4/README create mode 100644 m4/a52.m4 create mode 100644 m4/aalib.m4 create mode 100644 m4/as-arts.m4 create mode 100644 m4/as-ffmpeg.m4 create mode 100644 m4/as-liblame.m4 create mode 100644 m4/as-slurp-ffmpeg.m4 create mode 100644 m4/check-libheader.m4 create mode 100644 m4/codeset.m4 create mode 100644 m4/esd.m4 create mode 100644 m4/freetype2.m4 create mode 100644 m4/gconf-2.m4 create mode 100644 m4/gettext.m4 create mode 100644 m4/glib.m4 create mode 100644 m4/glibc21.m4 create mode 100644 m4/gst-alsa.m4 create mode 100644 m4/gst-artsc.m4 create mode 100644 m4/gst-fionread.m4 create mode 100644 m4/gst-ivorbis.m4 create mode 100644 m4/gst-matroska.m4 create mode 100644 m4/gst-sdl.m4 create mode 100644 m4/gst-shout2.m4 create mode 100644 m4/gst-sid.m4 create mode 100644 m4/gtk.m4 create mode 100644 m4/iconv.m4 create mode 100644 m4/intdiv0.m4 create mode 100644 m4/intlmacosx.m4 create mode 100644 m4/inttypes-pri.m4 create mode 100644 m4/inttypes_h.m4 create mode 100644 m4/lcmessage.m4 create mode 100644 m4/lib-ld.m4 create mode 100644 m4/lib-link.m4 create mode 100644 m4/lib-prefix.m4 create mode 100644 m4/libfame.m4 create mode 100644 m4/libmikmod.m4 create mode 100644 m4/libtool.m4 create mode 100644 m4/ltoptions.m4 create mode 100644 m4/ltsugar.m4 create mode 100644 m4/ltversion.m4 create mode 100644 m4/lt~obsolete.m4 create mode 100644 m4/nls.m4 create mode 100644 m4/ogg.m4 create mode 100644 m4/po.m4 create mode 100644 m4/progtest.m4 create mode 100644 m4/stdint_h.m4 create mode 100644 m4/uintmax_t.m4 create mode 100644 m4/vorbis.m4 create mode 100755 missing create mode 100644 packaging/gst-plugins-good-disable-gtk-doc.patch create mode 100644 packaging/gst-plugins-good.spec create mode 100644 pkgconfig/Makefile.am create mode 100644 pkgconfig/Makefile.in create mode 100644 pkgconfig/gstreamer-plugins-good-uninstalled.pc.in create mode 100644 po/LINGUAS create mode 100644 po/Makefile.in.in create mode 100644 po/Makevars create mode 100644 po/POTFILES.in create mode 100644 po/Rules-quot create mode 100644 po/af.gmo create mode 100644 po/af.po create mode 100644 po/az.gmo create mode 100644 po/az.po create mode 100644 po/bg.gmo create mode 100644 po/bg.po create mode 100644 po/boldquot.sed create mode 100644 po/ca.gmo create mode 100644 po/ca.po create mode 100644 po/cs.gmo create mode 100644 po/cs.po create mode 100644 po/da.gmo create mode 100644 po/da.po create mode 100644 po/de.gmo create mode 100644 po/de.po create mode 100644 po/el.gmo create mode 100644 po/el.po create mode 100644 po/en@boldquot.header create mode 100644 po/en@quot.header create mode 100644 po/en_GB.gmo create mode 100644 po/en_GB.po create mode 100644 po/eo.gmo create mode 100644 po/eo.po create mode 100644 po/es.gmo create mode 100644 po/es.po create mode 100644 po/eu.gmo create mode 100644 po/eu.po create mode 100644 po/fi.gmo create mode 100644 po/fi.po create mode 100644 po/fr.gmo create mode 100644 po/fr.po create mode 100644 po/gl.gmo create mode 100644 po/gl.po create mode 100644 po/gst-plugins-good-0.10.pot create mode 100644 po/hu.gmo create mode 100644 po/hu.po create mode 100644 po/id.gmo create mode 100644 po/id.po create mode 100644 po/insert-header.sin create mode 100644 po/it.gmo create mode 100644 po/it.po create mode 100644 po/ja.gmo create mode 100644 po/ja.po create mode 100644 po/lt.gmo create mode 100644 po/lt.po create mode 100644 po/lv.gmo create mode 100644 po/lv.po create mode 100644 po/mt.gmo create mode 100644 po/mt.po create mode 100644 po/nb.gmo create mode 100644 po/nb.po create mode 100644 po/nl.gmo create mode 100644 po/nl.po create mode 100644 po/or.gmo create mode 100644 po/or.po create mode 100644 po/pl.gmo create mode 100644 po/pl.po create mode 100644 po/pt_BR.gmo create mode 100644 po/pt_BR.po create mode 100644 po/quot.sed create mode 100644 po/remove-potcdate.sin create mode 100644 po/ro.gmo create mode 100644 po/ro.po create mode 100644 po/ru.gmo create mode 100644 po/ru.po create mode 100644 po/sk.gmo create mode 100644 po/sk.po create mode 100644 po/sl.gmo create mode 100644 po/sl.po create mode 100644 po/sq.gmo create mode 100644 po/sq.po create mode 100644 po/sr.gmo create mode 100644 po/sr.po create mode 100644 po/stamp-po create mode 100644 po/sv.gmo create mode 100644 po/sv.po create mode 100644 po/tr.gmo create mode 100644 po/tr.po create mode 100644 po/uk.gmo create mode 100644 po/uk.po create mode 100644 po/vi.gmo create mode 100644 po/vi.po create mode 100644 po/zh_CN.gmo create mode 100644 po/zh_CN.po create mode 100644 po/zh_HK.gmo create mode 100644 po/zh_HK.po create mode 100644 po/zh_TW.gmo create mode 100644 po/zh_TW.po create mode 100644 sys/Makefile.am create mode 100644 sys/Makefile.in create mode 100644 sys/directsound/Makefile.am create mode 100644 sys/directsound/Makefile.in create mode 100644 sys/directsound/gstdirectsoundplugin.c create mode 100644 sys/directsound/gstdirectsoundsink.c create mode 100644 sys/directsound/gstdirectsoundsink.h create mode 100644 sys/oss/Makefile.am create mode 100644 sys/oss/Makefile.in create mode 100644 sys/oss/common.h create mode 100644 sys/oss/gstossaudio.c create mode 100644 sys/oss/gstossdmabuffer.h create mode 100644 sys/oss/gstosshelper.c create mode 100644 sys/oss/gstosshelper.h create mode 100644 sys/oss/gstossmixer.c create mode 100644 sys/oss/gstossmixer.h create mode 100644 sys/oss/gstossmixerelement.c create mode 100644 sys/oss/gstossmixerelement.h create mode 100644 sys/oss/gstossmixertrack.c create mode 100644 sys/oss/gstossmixertrack.h create mode 100644 sys/oss/gstosssink.c create mode 100644 sys/oss/gstosssink.h create mode 100644 sys/oss/gstosssrc.c create mode 100644 sys/oss/gstosssrc.h create mode 100644 sys/oss4/Makefile.am create mode 100644 sys/oss4/Makefile.in create mode 100644 sys/oss4/oss4-audio.c create mode 100644 sys/oss4/oss4-audio.h create mode 100644 sys/oss4/oss4-mixer-enum.c create mode 100644 sys/oss4/oss4-mixer-enum.h create mode 100644 sys/oss4/oss4-mixer-slider.c create mode 100644 sys/oss4/oss4-mixer-slider.h create mode 100644 sys/oss4/oss4-mixer-switch.c create mode 100644 sys/oss4/oss4-mixer-switch.h create mode 100644 sys/oss4/oss4-mixer.c create mode 100644 sys/oss4/oss4-mixer.h create mode 100644 sys/oss4/oss4-property-probe.c create mode 100644 sys/oss4/oss4-property-probe.h create mode 100644 sys/oss4/oss4-sink.c create mode 100644 sys/oss4/oss4-sink.h create mode 100644 sys/oss4/oss4-soundcard.h create mode 100644 sys/oss4/oss4-source.c create mode 100644 sys/oss4/oss4-source.h create mode 100644 sys/osxaudio/Makefile.am create mode 100644 sys/osxaudio/Makefile.in create mode 100644 sys/osxaudio/gstosxaudio.c create mode 100644 sys/osxaudio/gstosxaudioelement.c create mode 100644 sys/osxaudio/gstosxaudioelement.h create mode 100644 sys/osxaudio/gstosxaudiosink.c create mode 100644 sys/osxaudio/gstosxaudiosink.h create mode 100644 sys/osxaudio/gstosxaudiosrc.c create mode 100644 sys/osxaudio/gstosxaudiosrc.h create mode 100644 sys/osxaudio/gstosxringbuffer.c create mode 100644 sys/osxaudio/gstosxringbuffer.h create mode 100644 sys/osxvideo/Makefile.am create mode 100644 sys/osxvideo/Makefile.in create mode 100644 sys/osxvideo/cocoawindow.h create mode 100644 sys/osxvideo/cocoawindow.m create mode 100644 sys/osxvideo/osxvideosink.h create mode 100644 sys/osxvideo/osxvideosink.m create mode 100644 sys/sunaudio/Makefile.am create mode 100644 sys/sunaudio/Makefile.in create mode 100644 sys/sunaudio/gstsunaudio.c create mode 100644 sys/sunaudio/gstsunaudiomixer.c create mode 100644 sys/sunaudio/gstsunaudiomixer.h create mode 100644 sys/sunaudio/gstsunaudiomixerctrl.c create mode 100644 sys/sunaudio/gstsunaudiomixerctrl.h create mode 100644 sys/sunaudio/gstsunaudiomixeroptions.c create mode 100644 sys/sunaudio/gstsunaudiomixeroptions.h create mode 100644 sys/sunaudio/gstsunaudiomixertrack.c create mode 100644 sys/sunaudio/gstsunaudiomixertrack.h create mode 100644 sys/sunaudio/gstsunaudiosink.c create mode 100644 sys/sunaudio/gstsunaudiosink.h create mode 100644 sys/sunaudio/gstsunaudiosrc.c create mode 100644 sys/sunaudio/gstsunaudiosrc.h create mode 100644 sys/v4l2/Makefile.am create mode 100644 sys/v4l2/Makefile.in create mode 100644 sys/v4l2/README create mode 100644 sys/v4l2/gstv4l2.c create mode 100644 sys/v4l2/gstv4l2bufferpool.c create mode 100644 sys/v4l2/gstv4l2bufferpool.h create mode 100644 sys/v4l2/gstv4l2colorbalance.c create mode 100644 sys/v4l2/gstv4l2colorbalance.h create mode 100644 sys/v4l2/gstv4l2object.c create mode 100644 sys/v4l2/gstv4l2object.h create mode 100644 sys/v4l2/gstv4l2radio.c create mode 100644 sys/v4l2/gstv4l2radio.h create mode 100644 sys/v4l2/gstv4l2sink.c create mode 100644 sys/v4l2/gstv4l2sink.h create mode 100644 sys/v4l2/gstv4l2src.c create mode 100644 sys/v4l2/gstv4l2src.h create mode 100644 sys/v4l2/gstv4l2tuner.c create mode 100644 sys/v4l2/gstv4l2tuner.h create mode 100644 sys/v4l2/gstv4l2vidorient.c create mode 100644 sys/v4l2/gstv4l2vidorient.h create mode 100644 sys/v4l2/gstv4l2xoverlay.c create mode 100644 sys/v4l2/gstv4l2xoverlay.h create mode 100644 sys/v4l2/v4l2_calls.c create mode 100644 sys/v4l2/v4l2_calls.h create mode 100644 sys/v4l2/v4l2src_calls.c create mode 100644 sys/v4l2/v4l2src_calls.h create mode 100644 sys/waveform/Makefile.am create mode 100644 sys/waveform/Makefile.in create mode 100644 sys/waveform/gstwaveformplugin.c create mode 100644 sys/waveform/gstwaveformsink.c create mode 100644 sys/waveform/gstwaveformsink.h create mode 100644 sys/ximage/Makefile.am create mode 100644 sys/ximage/Makefile.in create mode 100644 sys/ximage/gstximagesrc.c create mode 100644 sys/ximage/gstximagesrc.h create mode 100644 sys/ximage/ximageutil.c create mode 100644 sys/ximage/ximageutil.h create mode 100644 tests/Makefile.am create mode 100644 tests/Makefile.in create mode 100644 tests/check/Makefile.am create mode 100644 tests/check/Makefile.in create mode 100644 tests/check/elements/aacparse.c create mode 100644 tests/check/elements/ac3parse.c create mode 100644 tests/check/elements/alphacolor.c create mode 100644 tests/check/elements/amrparse.c create mode 100644 tests/check/elements/apev2mux.c create mode 100644 tests/check/elements/aspectratiocrop.c create mode 100644 tests/check/elements/audioamplify.c create mode 100644 tests/check/elements/audiochebband.c create mode 100644 tests/check/elements/audiocheblimit.c create mode 100644 tests/check/elements/audiodynamic.c create mode 100644 tests/check/elements/audioecho.c create mode 100644 tests/check/elements/audiofirfilter.c create mode 100644 tests/check/elements/audioiirfilter.c create mode 100644 tests/check/elements/audioinvert.c create mode 100644 tests/check/elements/audiopanorama.c create mode 100644 tests/check/elements/audiowsincband.c create mode 100644 tests/check/elements/audiowsinclimit.c create mode 100644 tests/check/elements/autodetect.c create mode 100644 tests/check/elements/avimux.c create mode 100644 tests/check/elements/avisubtitle.c create mode 100644 tests/check/elements/capssetter.c create mode 100644 tests/check/elements/cmmldec.c create mode 100644 tests/check/elements/cmmlenc.c create mode 100644 tests/check/elements/deinterlace.c create mode 100644 tests/check/elements/deinterleave.c create mode 100644 tests/check/elements/equalizer.c create mode 100644 tests/check/elements/flacparse.c create mode 100644 tests/check/elements/flvdemux.c create mode 100644 tests/check/elements/flvmux.c create mode 100644 tests/check/elements/gdkpixbufsink.c create mode 100644 tests/check/elements/icydemux.c create mode 100644 tests/check/elements/id3demux.c create mode 100644 tests/check/elements/id3v2mux.c create mode 100644 tests/check/elements/imagefreeze.c create mode 100644 tests/check/elements/interleave.c create mode 100644 tests/check/elements/jpegenc.c create mode 100644 tests/check/elements/level.c create mode 100644 tests/check/elements/matroskamux.c create mode 100644 tests/check/elements/matroskaparse.c create mode 100644 tests/check/elements/mpegaudioparse.c create mode 100644 tests/check/elements/multifile.c create mode 100644 tests/check/elements/parser.c create mode 100644 tests/check/elements/parser.h create mode 100644 tests/check/elements/qtmux.c create mode 100644 tests/check/elements/rganalysis.c create mode 100644 tests/check/elements/rglimiter.c create mode 100644 tests/check/elements/rgvolume.c create mode 100644 tests/check/elements/rtp-payloading.c create mode 100644 tests/check/elements/rtpbin.c create mode 100644 tests/check/elements/rtpbin_buffer_list.c create mode 100644 tests/check/elements/rtpjitterbuffer.c create mode 100644 tests/check/elements/shapewipe.c create mode 100644 tests/check/elements/souphttpsrc.c create mode 100644 tests/check/elements/spectrum.c create mode 100644 tests/check/elements/sunaudio.c create mode 100644 tests/check/elements/udpsink.c create mode 100644 tests/check/elements/videocrop.c create mode 100644 tests/check/elements/videofilter.c create mode 100644 tests/check/elements/wavpackdec.c create mode 100644 tests/check/elements/wavpackenc.c create mode 100644 tests/check/elements/wavpackparse.c create mode 100644 tests/check/elements/y4menc.c create mode 100644 tests/check/generic/index.c create mode 100644 tests/check/generic/states.c create mode 100644 tests/check/gst-plugins-good.supp create mode 100644 tests/check/pipelines/effectv.c create mode 100644 tests/check/pipelines/flacdec.c create mode 100644 tests/check/pipelines/simple-launch-lines.c create mode 100644 tests/check/pipelines/tagschecking.c create mode 100644 tests/check/pipelines/wavenc.c create mode 100644 tests/check/pipelines/wavpack.c create mode 100644 tests/examples/Makefile.am create mode 100644 tests/examples/Makefile.in create mode 100644 tests/examples/audiofx/Makefile.am create mode 100644 tests/examples/audiofx/Makefile.in create mode 100644 tests/examples/audiofx/firfilter-example.c create mode 100644 tests/examples/audiofx/iirfilter-example.c create mode 100644 tests/examples/cairo/Makefile.am create mode 100644 tests/examples/cairo/Makefile.in create mode 100644 tests/examples/cairo/cairo_overlay.c create mode 100644 tests/examples/equalizer/Makefile.am create mode 100644 tests/examples/equalizer/Makefile.in create mode 100644 tests/examples/equalizer/demo.c create mode 100644 tests/examples/jack/Makefile.am create mode 100644 tests/examples/jack/Makefile.in create mode 100644 tests/examples/jack/jack_client.c create mode 100644 tests/examples/level/Makefile.am create mode 100644 tests/examples/level/Makefile.in create mode 100644 tests/examples/level/level-example.c create mode 100644 tests/examples/pulse/Makefile.am create mode 100644 tests/examples/pulse/Makefile.in create mode 100644 tests/examples/pulse/pulse.c create mode 100644 tests/examples/rtp/Makefile.am create mode 100644 tests/examples/rtp/Makefile.in create mode 100755 tests/examples/rtp/client-H263p-AMR.sh create mode 100644 tests/examples/rtp/client-H263p-PCMA.sdp create mode 100755 tests/examples/rtp/client-H263p-PCMA.sh create mode 100644 tests/examples/rtp/client-H264-PCMA.sdp create mode 100755 tests/examples/rtp/client-H264-PCMA.sh create mode 100644 tests/examples/rtp/client-PCMA.c create mode 100755 tests/examples/rtp/client-PCMA.sh create mode 100755 tests/examples/rtp/server-VTS-H263p-ATS-PCMA.sh create mode 100644 tests/examples/rtp/server-alsasrc-PCMA.c create mode 100755 tests/examples/rtp/server-alsasrc-PCMA.sh create mode 100755 tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh create mode 100755 tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh create mode 100644 tests/examples/shapewipe/Makefile.am create mode 100644 tests/examples/shapewipe/Makefile.in create mode 100644 tests/examples/shapewipe/shapewipe-example.c create mode 100644 tests/examples/spectrum/Makefile.am create mode 100644 tests/examples/spectrum/Makefile.in create mode 100644 tests/examples/spectrum/demo-audiotest.c create mode 100644 tests/examples/spectrum/demo-osssrc.c create mode 100644 tests/examples/spectrum/spectrum-example.c create mode 100644 tests/examples/v4l2/Makefile.am create mode 100644 tests/examples/v4l2/Makefile.in create mode 100644 tests/examples/v4l2/camctrl.c create mode 100644 tests/examples/v4l2/probe.c create mode 100644 tests/files/Makefile.am create mode 100644 tests/files/Makefile.in create mode 100644 tests/files/audiotestsrc.flac create mode 100644 tests/files/id3-407349-1.tag create mode 100644 tests/files/id3-407349-2.tag create mode 100644 tests/files/id3-447000-wcop.tag create mode 100644 tests/files/id3-577468-unsynced-tag.tag create mode 100644 tests/files/id3-588148-unsynced-v24.tag create mode 100644 tests/files/pcm16sine.flv create mode 100644 tests/files/pinknoise-vorbis.mkv create mode 100644 tests/files/test-cert.pem create mode 100644 tests/files/test-key.pem create mode 100644 tests/icles/Makefile.am create mode 100644 tests/icles/Makefile.in create mode 100644 tests/icles/equalizer-test.c create mode 100644 tests/icles/gdkpixbufsink-test.c create mode 100644 tests/icles/test-oss4.c create mode 100644 tests/icles/v4l2src-test.c create mode 100644 tests/icles/videobox-test.c create mode 100644 tests/icles/videocrop-test.c create mode 100644 tests/icles/videocrop2-test.c create mode 100644 tests/icles/ximagesrc-test.c create mode 100644 win32/MANIFEST create mode 100644 win32/common/config.h create mode 100644 win32/common/gstudp-enumtypes.c create mode 100644 win32/common/gstudp-enumtypes.h create mode 100644 win32/vs6/autogen.dsp create mode 100644 win32/vs6/gst_plugins_good.dsw create mode 100644 win32/vs6/libgstalaw.dsp create mode 100644 win32/vs6/libgstalpha.dsp create mode 100644 win32/vs6/libgstalphacolor.dsp create mode 100644 win32/vs6/libgstapetag.dsp create mode 100644 win32/vs6/libgstaudiofx.dsp create mode 100644 win32/vs6/libgstauparse.dsp create mode 100644 win32/vs6/libgstautodetect.dsp create mode 100644 win32/vs6/libgstavi.dsp create mode 100644 win32/vs6/libgstcutter.dsp create mode 100644 win32/vs6/libgstdirectsound.dsp create mode 100644 win32/vs6/libgsteffectv.dsp create mode 100644 win32/vs6/libgstflx.dsp create mode 100644 win32/vs6/libgstgoom.dsp create mode 100644 win32/vs6/libgsticydemux.dsp create mode 100644 win32/vs6/libgstid3demux.dsp create mode 100644 win32/vs6/libgstinterleave.dsp create mode 100644 win32/vs6/libgstjpeg.dsp create mode 100644 win32/vs6/libgstlevel.dsp create mode 100644 win32/vs6/libgstmatroska.dsp create mode 100644 win32/vs6/libgstmedian.dsp create mode 100644 win32/vs6/libgstmonoscope.dsp create mode 100644 win32/vs6/libgstmulaw.dsp create mode 100644 win32/vs6/libgstmultipart.dsp create mode 100644 win32/vs6/libgstpng.dsp create mode 100644 win32/vs6/libgstqtdemux.dsp create mode 100644 win32/vs6/libgstrtp.dsp create mode 100644 win32/vs6/libgstrtsp.dsp create mode 100644 win32/vs6/libgstsmpte.dsp create mode 100644 win32/vs6/libgstspeex.dsp create mode 100644 win32/vs6/libgstudp.dsp create mode 100644 win32/vs6/libgstvideobalance.dsp create mode 100644 win32/vs6/libgstvideobox.dsp create mode 100644 win32/vs6/libgstvideocrop.dsp create mode 100644 win32/vs6/libgstvideoflip.dsp create mode 100644 win32/vs6/libgstvideomixer.dsp create mode 100644 win32/vs6/libgstwaveform.dsp create mode 100644 win32/vs6/libgstwavenc.dsp create mode 100644 win32/vs6/libgstwavparse.dsp create mode 100644 win32/vs7/libgstdirectsound.vcproj create mode 100644 win32/vs8/gst-plugins-good.sln create mode 100644 win32/vs8/libgst1394.vcproj create mode 100644 win32/vs8/libgstaasink.vcproj create mode 100644 win32/vs8/libgstalaw.vcproj create mode 100644 win32/vs8/libgstalpha.vcproj create mode 100644 win32/vs8/libgstalphacolor.vcproj create mode 100644 win32/vs8/libgstannodex.vcproj create mode 100644 win32/vs8/libgstapetag.vcproj create mode 100644 win32/vs8/libgstaudiofx.vcproj create mode 100644 win32/vs8/libgstauparse.vcproj create mode 100644 win32/vs8/libgstautodetect.vcproj create mode 100644 win32/vs8/libgstavi.vcproj create mode 100644 win32/vs8/libgstcacasink.vcproj create mode 100644 win32/vs8/libgstcdio.vcproj create mode 100644 win32/vs8/libgstcutter.vcproj create mode 100644 win32/vs8/libgstdirectsound.vcproj create mode 100644 win32/vs8/libgstdv.vcproj create mode 100644 win32/vs8/libgsteffectv.vcproj create mode 100644 win32/vs8/libgstflac.vcproj create mode 100644 win32/vs8/libgstflxdec.vcproj create mode 100644 win32/vs8/libgstgoom.vcproj create mode 100644 win32/vs8/libgsticydemux.vcproj create mode 100644 win32/vs8/libgstid3demux.vcproj create mode 100644 win32/vs8/libgstjpeg.vcproj create mode 100644 win32/vs8/libgstladspa.vcproj create mode 100644 win32/vs8/libgstlevel.vcproj create mode 100644 win32/vs8/libgstmatroska.vcproj create mode 100644 win32/vs8/libgstmikmod.vcproj create mode 100644 win32/vs8/libgstmng.vcproj create mode 100644 win32/vs8/libgstmonoscope.vcproj create mode 100644 win32/vs8/libgstmulaw.vcproj create mode 100644 win32/vs8/libgstmultipart.vcproj create mode 100644 win32/vs8/libgstpng.vcproj create mode 100644 win32/vs8/libgstrtp.vcproj create mode 100644 win32/vs8/libgstrtsp.vcproj create mode 100644 win32/vs8/libgstshout2.vcproj create mode 100644 win32/vs8/libgstsmpte.vcproj create mode 100644 win32/vs8/libgstspeex.vcproj create mode 100644 win32/vs8/libgsttaglib.vcproj create mode 100644 win32/vs8/libgstudp.vcproj create mode 100644 win32/vs8/libgstvideobalance.vcproj create mode 100644 win32/vs8/libgstvideobox.vcproj create mode 100644 win32/vs8/libgstvideoflip.vcproj create mode 100644 win32/vs8/libgstvideomixer.vcproj create mode 100644 win32/vs8/libgstwavenc.vcproj create mode 100644 win32/vs8/libgstwavparse.vcproj diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..83bc72e --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,1068 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +1.1 Quick configuration advice +============================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +1.2 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the included GNU +`gettext' library will be used. This library is wholly contained +within this package, usually in the `intl/' subdirectory, so prior +installation of the GNU `gettext' package is _not_ required. +Installers may use special options at configuration time for changing +the default behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will, respectively, bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might not be desirable. You should use +the more recent version of the GNU `gettext' library. I.e. if the file +`intl/VERSION' shows that the library which comes with this package is +more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages usually have many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.3 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. If you happen to have the `LC_ALL' or some other +`LC_xxx' environment variables set, you should unset them before +setting `LANG', otherwise the setting of `LANG' will not have the +desired effect. Here `LL' is an ISO 639 two-letter language code, and +`CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your language by running the +command `locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +1.4 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://translationproject.org/', in the "Teams" area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `coordinator@translationproject.org' to +reach the coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skills are praised more than +programming skills, here. + +1.5 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of November +2007. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo + +----------------------------------------------------+ + Compendium | [] [] [] [] | + a2ps | [] [] [] [] [] | + aegis | () | + ant-phone | () | + anubis | [] | + ap-utils | | + aspell | [] [] [] [] [] | + bash | [] | + bfd | | + bibshelf | [] | + binutils | | + bison | [] [] | + bison-runtime | [] | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] [] | + console-tools | [] [] | + coreutils | [] [] [] [] | + cpio | | + cpplib | [] [] [] | + cryptonit | [] | + dialog | | + diffutils | [] [] [] [] [] [] | + doodle | [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] | + fetchmail | [] [] () [] [] | + findutils | [] | + findutils_stable | [] [] [] | + flex | [] [] [] | + fslint | | + gas | | + gawk | [] [] [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] | + gip | [] | + gliv | [] [] | + glunarclock | [] | + gmult | [] [] | + gnubiff | () | + gnucash | [] [] () () [] | + gnuedu | | + gnulib | [] | + gnunet | | + gnunet-gtk | | + gnutls | [] | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | | + gpe-edit | [] | + gpe-filemanager | | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] | + gpe-package | | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | | + gphoto2 | [] [] [] [] | + gprof | [] [] | + gpsdrive | | + gramadoir | [] [] | + grep | [] [] | + gretl | () | + gsasl | | + gss | | + gst-plugins-bad | [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] [] | + gst-plugins-ugly | [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | () | + gtkam | [] [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] [] | + indent | [] [] [] [] | + iso_15924 | | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] [] | + iso_639 | [] [] [] [] | + jpilot | [] | + jtag | | + jwhois | | + kbd | [] [] [] [] | + keytouch | [] [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | () | + ld | [] | + leafpad | [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] | + libgpg-error | [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] | + libgsasl | | + libiconv | [] [] | + libidn | [] [] [] | + lifelines | [] () | + lilypond | [] | + lingoteach | | + lprng | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailfromd | | + mailutils | [] | + make | [] [] | + man-db | [] [] [] | + minicom | [] [] [] | + nano | [] [] [] | + opcodes | [] | + parted | [] [] | + pilot-qof | | + popt | [] [] [] | + psmisc | [] | + pwdutils | | + qof | | + radius | [] | + recode | [] [] [] [] [] [] | + rpm | [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] [] | + sed | [] [] [] | + shared-mime-info | [] [] [] [] () [] [] [] | + sharutils | [] [] [] [] [] [] | + shishi | | + skencil | [] () | + solfege | | + soundtracker | [] [] | + sp | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] | + texinfo | [] [] [] | + tin | () () | + tuxpaint | [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + util-linux-ng | [] [] [] [] | + vorbis-tools | [] | + wastesedge | () | + wdiff | [] [] [] [] | + wget | [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] | + xpad | [] [] [] | + +----------------------------------------------------+ + af am ar az be bg bs ca cs cy da de el en en_GB eo + 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18 + + es et eu fa fi fr ga gl gu he hi hr hu id is it + +--------------------------------------------------+ + Compendium | [] [] [] [] [] | + a2ps | [] [] [] () | + aegis | | + ant-phone | [] | + anubis | [] | + ap-utils | [] [] | + aspell | [] [] [] | + bash | [] | + bfd | [] [] | + bibshelf | [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] | + console-tools | | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] | + cpplib | [] [] | + cryptonit | [] | + dialog | [] [] [] | + diffutils | [] [] [] [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] | + fetchmail | [] | + findutils | [] [] [] | + findutils_stable | [] [] [] [] | + flex | [] [] [] | + fslint | | + gas | [] [] | + gawk | [] [] [] [] () | + gcal | [] [] | + gcc | [] | + gettext-examples | [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] [] | + gip | [] [] [] [] | + gliv | () | + glunarclock | [] [] [] | + gmult | [] [] [] | + gnubiff | () () | + gnucash | () () () | + gnuedu | [] | + gnulib | [] [] [] | + gnunet | | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | | + gpe-clock | [] [] [] [] | + gpe-conf | [] | + gpe-contacts | [] [] | + gpe-edit | [] [] [] [] | + gpe-filemanager | [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] [] [] [] | + gpe-package | [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] [] [] | + gpsdrive | [] | + gramadoir | [] [] | + grep | [] [] [] | + gretl | [] [] [] () | + gsasl | [] [] | + gss | [] [] | + gst-plugins-bad | [] [] [] [] | + gst-plugins-base | [] [] [] [] | + gst-plugins-good | [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] | + gstreamer | [] [] [] | + gtick | [] [] [] | + gtkam | [] [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] [] [] [] | + iso_15924 | [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | [] | + iso_4217 | [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] | + jpilot | [] [] | + jtag | [] | + jwhois | [] [] [] [] [] | + kbd | [] [] | + keytouch | [] [] [] | + keytouch-editor | [] | + keytouch-keyboa... | [] [] | + latrine | [] [] | + ld | [] [] [] [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] [] [] | + libgpg-error | [] | + libgphoto2 | [] [] [] | + libgphoto2_port | [] [] | + libgsasl | [] [] | + libiconv | [] [] [] | + libidn | [] [] | + lifelines | () | + lilypond | [] [] [] | + lingoteach | [] [] [] | + lprng | | + lynx | [] [] [] | + m4 | [] [] [] [] | + mailfromd | | + mailutils | [] [] | + make | [] [] [] [] [] [] [] [] | + man-db | [] | + minicom | [] [] [] [] | + nano | [] [] [] [] [] [] [] | + opcodes | [] [] [] [] | + parted | [] [] [] | + pilot-qof | | + popt | [] [] [] [] | + psmisc | [] [] | + pwdutils | | + qof | [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] | + sed | [] [] [] [] [] | + shared-mime-info | [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] [] [] | + shishi | [] | + skencil | [] [] | + solfege | [] | + soundtracker | [] [] [] | + sp | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] | + tin | [] () | + tuxpaint | [] [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux | [] [] [] [] [] [] [] | + util-linux-ng | [] [] [] [] [] [] [] | + vorbis-tools | | + wastesedge | () | + wdiff | [] [] [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + es et eu fa fi fr ga gl gu he hi hr hu id is it + 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52 + + ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn + +--------------------------------------------------+ + Compendium | [] | + a2ps | () [] [] | + aegis | () | + ant-phone | [] | + anubis | [] [] [] | + ap-utils | [] | + aspell | [] [] | + bash | [] | + bfd | | + bibshelf | [] | + binutils | | + bison | [] [] [] | + bison-runtime | [] [] [] | + bluez-pin | [] [] [] | + cflow | | + clisp | [] | + console-tools | | + coreutils | [] | + cpio | [] | + cpplib | [] | + cryptonit | [] | + dialog | [] [] | + diffutils | [] [] [] | + doodle | | + e2fsprogs | [] | + enscript | [] | + fetchmail | [] [] | + findutils | [] | + findutils_stable | [] | + flex | [] [] | + fslint | | + gas | | + gawk | [] [] | + gcal | | + gcc | | + gettext-examples | [] [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] [] | + gip | [] [] | + gliv | [] | + glunarclock | [] [] | + gmult | [] [] [] | + gnubiff | | + gnucash | () () () | + gnuedu | | + gnulib | [] [] | + gnunet | | + gnunet-gtk | | + gnutls | [] | + gpe-aerial | [] | + gpe-beam | [] | + gpe-calendar | [] | + gpe-clock | [] [] [] | + gpe-conf | [] [] [] | + gpe-contacts | [] | + gpe-edit | [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | [] | + gphoto2 | [] [] | + gprof | [] | + gpsdrive | [] | + gramadoir | () | + grep | [] [] | + gretl | | + gsasl | [] | + gss | | + gst-plugins-bad | [] | + gst-plugins-base | [] | + gst-plugins-good | [] | + gst-plugins-ugly | [] | + gstreamer | [] | + gtick | [] | + gtkam | [] [] | + gtkorphan | [] | + gtkspell | [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] | + indent | [] [] | + iso_15924 | [] | + iso_3166 | [] [] [] [] [] [] [] [] | + iso_3166_2 | [] | + iso_4217 | [] [] [] | + iso_639 | [] [] [] [] | + jpilot | () () | + jtag | | + jwhois | [] | + kbd | [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | | + latrine | [] | + ld | | + leafpad | [] [] | + libc | [] [] [] | + libexif | | + libextractor | | + libgpewidget | [] | + libgpg-error | | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | [] | + libiconv | [] | + libidn | [] [] | + lifelines | [] | + lilypond | [] | + lingoteach | [] | + lprng | | + lynx | [] [] | + m4 | [] [] | + mailfromd | | + mailutils | | + make | [] [] [] | + man-db | | + minicom | [] | + nano | [] [] [] | + opcodes | [] | + parted | [] [] | + pilot-qof | | + popt | [] [] [] | + psmisc | [] [] [] | + pwdutils | | + qof | | + radius | | + recode | [] | + rpm | [] [] | + screem | [] | + scrollkeeper | [] [] [] [] | + sed | [] [] | + shared-mime-info | [] [] [] [] [] [] [] | + sharutils | [] [] | + shishi | | + skencil | | + solfege | () () | + soundtracker | | + sp | () | + system-tools-ba... | [] [] [] [] | + tar | [] [] [] | + texinfo | [] [] | + tin | | + tuxpaint | () [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] | + util-linux-ng | [] [] | + vorbis-tools | | + wastesedge | [] | + wdiff | [] [] | + wget | [] [] | + xchat | [] [] [] [] | + xkeyboard-config | [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn + 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6 + + or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + +--------------------------------------------------+ + Compendium | [] [] [] [] [] | + a2ps | () [] [] [] [] [] [] | + aegis | () () | + ant-phone | [] [] | + anubis | [] [] [] | + ap-utils | () | + aspell | [] [] [] | + bash | [] [] | + bfd | | + bibshelf | [] | + binutils | [] [] | + bison | [] [] [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] [] [] | + cflow | [] | + clisp | [] | + console-tools | [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + cpplib | [] | + cryptonit | [] [] | + dialog | [] | + diffutils | [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] [] | + fetchmail | [] [] [] | + findutils | [] [] [] | + findutils_stable | [] [] [] [] [] [] | + flex | [] [] [] [] [] | + fslint | [] | + gas | | + gawk | [] [] [] [] | + gcal | [] | + gcc | [] [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] [] | + gip | [] [] [] [] | + gliv | [] [] [] [] [] [] | + glunarclock | [] [] [] [] [] [] | + gmult | [] [] [] [] | + gnubiff | () [] | + gnucash | () [] | + gnuedu | | + gnulib | [] [] [] | + gnunet | | + gnunet-gtk | [] | + gnutls | [] [] | + gpe-aerial | [] [] [] [] [] [] [] | + gpe-beam | [] [] [] [] [] [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] [] [] [] [] | + gpe-conf | [] [] [] [] [] [] [] | + gpe-contacts | [] [] [] [] [] | + gpe-edit | [] [] [] [] [] [] [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] [] [] [] [] [] | + gpe-login | [] [] [] [] [] [] [] [] | + gpe-ownerinfo | [] [] [] [] [] [] [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] [] [] [] [] [] [] | + gpe-su | [] [] [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] [] [] [] | + gpe-today | [] [] [] [] [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] [] [] [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] | + gramadoir | [] [] | + grep | [] [] [] [] | + gretl | [] [] [] | + gsasl | [] [] [] | + gss | [] [] [] [] | + gst-plugins-bad | [] [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] | + gst-plugins-ugly | [] [] [] | + gstreamer | [] [] [] [] | + gtick | [] | + gtkam | [] [] [] [] [] | + gtkorphan | [] | + gtkspell | [] [] [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] | + herrie | [] [] [] | + hylafax | | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] | + iso_15924 | | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] [] | + jpilot | | + jtag | [] | + jwhois | [] [] [] [] | + kbd | [] [] [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | | + ld | [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] [] | + libextractor | [] [] | + libgpewidget | [] [] [] [] [] [] [] [] | + libgpg-error | [] [] [] | + libgphoto2 | [] | + libgphoto2_port | [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] | + libidn | [] [] () | + lifelines | [] [] | + lilypond | | + lingoteach | [] | + lprng | [] | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | [] | + mailutils | [] [] [] | + make | [] [] [] [] | + man-db | [] [] [] [] | + minicom | [] [] [] [] [] | + nano | [] [] [] [] | + opcodes | [] [] | + parted | [] | + pilot-qof | | + popt | [] [] [] [] | + psmisc | [] [] | + pwdutils | [] [] | + qof | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] | + rpm | [] [] [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] | + shared-mime-info | [] [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] | + skencil | [] [] [] | + solfege | [] | + soundtracker | [] [] | + sp | | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] [] [] | + texinfo | [] [] [] [] | + tin | () | + tuxpaint | [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + util-linux-ng | [] [] [] [] | + vorbis-tools | [] | + wastesedge | | + wdiff | [] [] [] [] [] [] [] | + wget | [] [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3 + + tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + +---------------------------------------------------+ + Compendium | [] [] [] [] | 19 + a2ps | [] [] [] | 19 + aegis | [] | 1 + ant-phone | [] [] | 6 + anubis | [] [] [] | 11 + ap-utils | () [] | 4 + aspell | [] [] [] | 16 + bash | [] | 6 + bfd | | 2 + bibshelf | [] | 7 + binutils | [] [] [] [] | 9 + bison | [] [] [] [] | 20 + bison-runtime | [] [] [] [] | 18 + bluez-pin | [] [] [] [] [] [] | 28 + cflow | [] [] | 5 + clisp | | 9 + console-tools | [] [] | 5 + coreutils | [] [] [] | 18 + cpio | [] [] [] [] | 11 + cpplib | [] [] [] [] [] | 12 + cryptonit | [] | 6 + dialog | [] [] [] | 9 + diffutils | [] [] [] [] [] | 29 + doodle | [] | 6 + e2fsprogs | [] [] | 10 + enscript | [] [] [] | 16 + fetchmail | [] [] | 12 + findutils | [] [] [] | 11 + findutils_stable | [] [] [] [] | 18 + flex | [] [] | 15 + fslint | [] | 2 + gas | [] | 3 + gawk | [] [] [] | 16 + gcal | [] | 5 + gcc | [] [] [] | 7 + gettext-examples | [] [] [] [] [] [] | 29 + gettext-runtime | [] [] [] [] [] [] | 28 + gettext-tools | [] [] [] [] [] | 20 + gip | [] [] | 13 + gliv | [] [] | 11 + glunarclock | [] [] [] | 15 + gmult | [] [] [] [] | 16 + gnubiff | [] | 2 + gnucash | () [] | 5 + gnuedu | [] | 2 + gnulib | [] | 10 + gnunet | | 0 + gnunet-gtk | [] [] | 3 + gnutls | | 4 + gpe-aerial | [] [] | 14 + gpe-beam | [] [] | 14 + gpe-calendar | [] [] | 7 + gpe-clock | [] [] [] [] | 21 + gpe-conf | [] [] [] | 16 + gpe-contacts | [] [] | 10 + gpe-edit | [] [] [] [] [] | 22 + gpe-filemanager | [] [] | 7 + gpe-go | [] [] [] [] | 19 + gpe-login | [] [] [] [] [] | 21 + gpe-ownerinfo | [] [] [] [] | 21 + gpe-package | [] | 6 + gpe-sketchbook | [] [] | 16 + gpe-su | [] [] [] [] | 21 + gpe-taskmanager | [] [] [] [] | 21 + gpe-timesheet | [] [] [] [] | 18 + gpe-today | [] [] [] [] [] | 21 + gpe-todo | [] [] | 8 + gphoto2 | [] [] [] [] | 21 + gprof | [] [] | 13 + gpsdrive | [] | 5 + gramadoir | [] | 7 + grep | [] | 12 + gretl | | 6 + gsasl | [] [] [] | 9 + gss | [] | 7 + gst-plugins-bad | [] [] [] | 13 + gst-plugins-base | [] [] | 11 + gst-plugins-good | [] [] [] [] [] | 16 + gst-plugins-ugly | [] [] [] | 13 + gstreamer | [] [] [] | 18 + gtick | [] [] | 7 + gtkam | [] | 16 + gtkorphan | [] | 7 + gtkspell | [] [] [] [] [] [] | 27 + gutenprint | | 4 + hello | [] [] [] [] [] | 38 + herrie | [] [] | 8 + hylafax | | 0 + idutils | [] [] | 15 + indent | [] [] [] [] [] | 28 + iso_15924 | [] [] | 4 + iso_3166 | [] [] [] [] [] [] [] [] [] | 54 + iso_3166_2 | [] [] | 4 + iso_4217 | [] [] [] [] [] | 24 + iso_639 | [] [] [] [] [] | 26 + jpilot | [] [] [] [] | 7 + jtag | [] | 3 + jwhois | [] [] [] | 13 + kbd | [] [] [] | 13 + keytouch | [] | 8 + keytouch-editor | [] | 5 + keytouch-keyboa... | [] | 5 + latrine | [] [] | 5 + ld | [] [] [] [] | 10 + leafpad | [] [] [] [] [] | 24 + libc | [] [] [] | 19 + libexif | [] | 5 + libextractor | [] | 5 + libgpewidget | [] [] [] | 20 + libgpg-error | [] | 6 + libgphoto2 | [] [] | 9 + libgphoto2_port | [] [] [] | 11 + libgsasl | [] | 8 + libiconv | [] [] | 11 + libidn | [] [] | 11 + lifelines | | 4 + lilypond | [] | 6 + lingoteach | [] | 6 + lprng | [] | 2 + lynx | [] [] [] | 15 + m4 | [] [] [] | 18 + mailfromd | [] [] | 3 + mailutils | [] [] | 8 + make | [] [] [] | 20 + man-db | [] | 9 + minicom | [] | 14 + nano | [] [] [] | 20 + opcodes | [] [] | 10 + parted | [] [] [] | 11 + pilot-qof | [] | 1 + popt | [] [] [] [] | 18 + psmisc | [] [] | 10 + pwdutils | [] | 3 + qof | [] | 4 + radius | [] [] | 7 + recode | [] [] [] | 25 + rpm | [] [] [] [] | 13 + screem | [] | 2 + scrollkeeper | [] [] [] [] | 26 + sed | [] [] [] [] | 23 + shared-mime-info | [] [] [] | 29 + sharutils | [] [] [] | 23 + shishi | [] | 3 + skencil | [] | 7 + solfege | [] | 3 + soundtracker | [] [] | 9 + sp | [] | 3 + system-tools-ba... | [] [] [] [] [] [] [] | 38 + tar | [] [] [] | 17 + texinfo | [] [] [] | 15 + tin | | 1 + tuxpaint | [] [] [] | 19 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux | [] [] [] | 20 + util-linux-ng | [] [] [] | 20 + vorbis-tools | [] [] | 4 + wastesedge | | 1 + wdiff | [] [] | 23 + wget | [] [] [] | 20 + xchat | [] [] [] [] | 29 + xkeyboard-config | [] [] [] | 14 + xpad | [] [] [] | 15 + +---------------------------------------------------+ + 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If November 2007 seems to be old, you may fetch a more recent copy +of this `ABOUT-NLS' file on most GNU archive sites. The most +up-to-date matrix with full percentage details can be found at +`http://translationproject.org/extra/matrix.html'. + +1.6 Using `gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`coordinator@translationproject.org' to make the `.pot' files available +to the translation teams. + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..5cef5a3 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,21 @@ +Erik Walthinsen +Matt Howell +Brent Bradburn +Wim Taymans +Richard Boulton +Zaheer Abbas Merali +David I. Lehn +Chris Emerson +Jens Thiele +Thomas Nyberg +Bastien Nocera +Christian Fredrik Kalager Schaller +Thomas Vander Stichele +Andy Wingo +Cameron Hutchison +David Schleef +Benjamin Otte +Ronald Bultje +Julien MOUTTE +Jan Schmidt +Arwed v. Merkatz diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..8add30a --- /dev/null +++ b/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..efd0205 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,75313 @@ +=== release 0.10.31 === + +2012-02-21 Tim-Philipp Müller + + * configure.ac: + releasing 0.10.31, "Faster" + +2012-02-20 12:22:12 -0500 Olivier Crête + + * gst/rtp/gstrtph264pay.c: + rtph264pay: force baseline profile is profile-level-id is unspecified + If profile-level-id is missing or invalid, we want any upstream + encoder to default to baseline profile, so specify that in the + caps we pass upstream. If the caps contain no profile restriction, + an encoder may default to high or main profile. + +2012-02-17 17:21:53 +0000 Tim-Philipp Müller + + * gst/equalizer/gstiirequalizer.c: + equalizer: fix switching from passthrough to non-passthrough when parameters change + commit b5bf0294 moved the if(need_new_coefficients) set_passthrough(equ) + after the if(is_passthrough) return FLOW_OK shortcut, so the passthrough + mode would never get updated even if the coefficients change. + Fixes equalizer-test doing .. nothing. + +2012-02-16 17:14:20 +0800 Gary Ching-Pang Lin + + * sys/v4l2/v4l2_calls.c: + v4l2src: failure to query some optional controls is not a fatal error + Don't post a (fatal) error message on the bus just because we + failed to query some control. Fixes issue with built-in + Suyin Corp webcam for HP notebook (usbid 064e:e28a) on + OpenSuse 12.1, where querying red/blue balance fails. + https://bugzilla.gnome.org/show_bug.cgi?id=670197 + +2012-02-16 12:59:10 +0000 Tuukka Pasanen + + * sys/v4l2/v4l2_calls.c: + v4l2src: fix for webcamstudio vloopback + Because vlooback emits 25 - ENOTTY and no EINVAL v4l2src thought it + can't handle this and does not work. + https://bugzilla.gnome.org/show_bug.cgi?id=669455 + +2012-02-13 12:06:37 +0100 Mark Nauwelaerts + + * tests/check/elements/flacparse.c: + tests: flacparse: check and compare intended data + +2012-02-09 22:12:14 +0100 Mark Nauwelaerts + + * tests/check/elements/mpegaudioparse.c: + tests: mpegaudioparse: remove stray declaration + +2012-02-09 10:11:48 +0100 Marc Leeman + + * gst/udp/gstmultiudpsink.c: + multiudpsink: typo fix (bytes send -> bytes sent) + +2012-02-07 14:10:44 -0800 Ralph Giles + + * ext/shout2/gstshout2.c: + shout2send: send video/webm through libshout. + This requires SHOUT_FORMAT_WEBM, added in libshout 2.3.0, + so video/webm support is contingent on that symbol being + defined. + Also an indentation change required by the pre-commit hook. + https://bugzilla.gnome.org/show_bug.cgi?id=669590 + +2012-01-28 11:13:16 +0100 Nicola Murino + + * gst/matroska/matroska-demux.c: + matroskademux: avoid posting invalid duration for each frame + https://bugzilla.gnome.org/show_bug.cgi?id=666583 + +2012-02-05 13:40:13 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.30.3 pre-release + +2012-02-03 22:05:59 +0530 Arun Raghavan + + * ext/pulse/plugin.c: + pulseaudiosink: Lower rank to prevent autoplugging + pulseaudiosink breaks visualisations in its current form, so let's + prevent it from being autoplugged for the time being. + The best we can hope to do in the 0.10 series is query the list of + available sinks and their formats, and expose these as the bin's sinkpad + caps. While this is not a comprehensive solution, it will make sure that + we're only trying to support compressed formats if we're certain that + one exists. + The long-term fix for this will be in the form of proper upstream + renegotiation support in the 0.11/1.0 series. + https://bugzilla.gnome.org/show_bug.cgi?id=666361 + +2012-02-03 14:53:31 +0000 Vincent Penquerc'h + + * ext/flac/gstflacenc.c: + flacenc: fix event leak when there is no peer on the src pad + +2012-02-02 12:27:09 +0000 Vincent Penquerc'h + + * gst/flv/gstflvmux.c: + flvmux: specify we only accept raw AAC in template caps + No header seems to be added, and the codec ID is the same as used + for raw by flvdemux, so raw seems the only supported case. + https://bugzilla.gnome.org/show_bug.cgi?id=665394 + +2012-02-02 12:25:21 +0000 Vincent Penquerc'h + + * gst/flv/gstflvdemux.c: + flvdemux: specify we only output raw AAC in template caps + https://bugzilla.gnome.org/show_bug.cgi?id=665394 + +2012-01-30 14:52:37 +0000 Vincent Penquerc'h + + * gst/rtp/gstrtpmp2tpay.c: + rtpmp2tpay: do not try to flush a packet when no data is available + https://bugzilla.gnome.org/show_bug.cgi?id=668874 + +2010-06-11 08:36:33 +0200 Pascal Buhler + + * gst/rtp/gstrtph264depay.c: + rtph264depay: Exclude NALu size from payload length on truncated packets. + https://bugzilla.gnome.org/show_bug.cgi?id=667846 + +2012-01-28 13:05:09 +0000 Vincent Penquerc'h + + * gst/videobox/gstvideobox.c: + videobox: avoid wrapping opaque to transparent + +2012-01-25 15:21:44 +0000 Jayakrishnan M + + * ext/cairo/Makefile.am: + cairo: fix build, make sure libgstvideo can be found + https://bugzilla.gnome.org/show_bug.cgi?id=668648 + +2012-01-25 13:19:12 +0000 Tim-Philipp Müller + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/rtpsession.c: + rtpmanager: don't pretend our random hostnames are fully-qualified domain names + +2012-01-23 13:15:46 +0000 Tim-Philipp Müller + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/rtpsession.c: + rtpmanager: don't reveal the user's username, hostname or real name by default + Send a randomly made-up user@hostname as CNAME and don't + send a NAME at all by default. + https://bugzilla.gnome.org/show_bug.cgi?id=668320 + +2012-01-20 17:06:42 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: simplify internal src event debug logging + ... which avoids almost superfluous obtaining of rtsp element. + +2012-01-20 17:03:50 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: avoid NULL string comparison + +2012-01-20 17:02:15 +0100 Mark Nauwelaerts + + * gst/rtp/gstrtpmp4adepay.c: + rtpmp4adepay: prevent out-of-bound array access + +2012-01-20 17:01:37 +0100 Mark Nauwelaerts + + * gst/isomp4/atomsrecovery.c: + isomp4: recovery: add sanity check + ... on possibly bogus/corrupt input data. + +2012-01-20 16:58:28 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroska-demux: remove redundant variable + +2012-01-20 16:57:52 +0100 Mark Nauwelaerts + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: fix arithmetic for unsigned comparison + +2012-01-20 16:55:06 +0100 Mark Nauwelaerts + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: add various missing break + +2012-01-20 16:49:14 +0100 Mark Nauwelaerts + + * gst/alpha/gstalphacolor.c: + alphacolor: remove redundant statement + +2012-01-20 16:48:49 +0100 Mark Nauwelaerts + + * ext/flac/gstflacdec.c: + flacdec: improve upstream peer duration querying + ... to avoid accepting unhandled duration query result. + +2012-01-20 16:47:36 +0100 Mark Nauwelaerts + + * ext/pulse/pulsesrc.c: + pulsesrc: additional error condition checking + +2012-01-20 16:46:21 +0100 Mark Nauwelaerts + + * ext/pulse/pulsesink.c: + pulsesink: additional error condition checking + +2012-01-20 16:44:21 +0100 Mark Nauwelaerts + + * ext/jpeg/gstjpegenc.c: + jpegenc: check _alloc_buffer result and perform fallback alloc if needed + ... rather than carrying on with NULL buffer. + +2012-01-13 18:11:36 +0000 Vincent Penquerc'h + + * ext/pulse/pulsesrc.c: + pulsesrc: fix wrong error check + pa_stream_* functions return negative on error, despite the defines + for error codes being positive. + I only got to repro the error twice, so I'm not sure 100% sure this + fixes the issue (the negative var being uninitialized after returning + from pa_stream_get_latency). + +2012-01-16 17:51:18 +0000 Vincent Penquerc'h + + * gst/cutter/gstcutter.c: + cutter: fix leak of unused GValue + +2012-01-16 16:10:08 +0000 Vincent Penquerc'h + + * tests/check/elements/autodetect.c: + tests: fix autodetect test not testing correctly for state change success + State change to PAUSED can be done async, so if this happens, we need + to wait for the change to be done (or failed). + +2012-01-16 15:42:46 +0000 Vincent Penquerc'h + + * gst/rtp/gstrtph263ppay.c: + rtph263ppay: fix caps leak + +2012-01-16 12:13:50 +0000 Vincent Penquerc'h + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: make interlacedness test deterministic + If the interlaced flag is not present in the caps, we assume the + data is not interlaced, instead of leaving the boolean uninitialized. + +2012-01-13 17:43:49 +0000 Vincent Penquerc'h + + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + oss4: fix caps leaks + +2012-01-13 17:25:59 +0000 Vincent Penquerc'h + + * sys/v4l2/gstv4l2src.c: + v4l2src: fix caps leak + +2012-01-13 15:57:20 +0000 Vincent Penquerc'h + + * tests/check/elements/videocrop.c: + tests: fix caps leak in videocrop test + +2012-01-13 10:32:59 +0000 Tim-Philipp Müller + + * gst/rtpmanager/gstrtpptdemux.c: + rtpptdemux: plug pad leak in error code path + Based on patch by: Stig Sandnes + Don't leak srcpad if there are no caps. + https://bugzilla.gnome.org/show_bug.cgi?id=667820 + +2011-10-04 10:00:02 +0200 Stig Sandnes + + * sys/osxvideo/cocoawindow.m: + osxvideo: Fix leak of NSOpenGLPixelFormat object + https://bugzilla.gnome.org/show_bug.cgi?id=667818 + +2011-09-05 10:43:19 +0200 Havard Graff + + * sys/v4l2/gstv4l2src.c: + v4l2src: Don't assert when the interface is not implemented. + Simply return FALSE instead. + https://bugzilla.gnome.org/show_bug.cgi?id=667817 + +2012-01-12 00:18:39 +0200 Raimo Järvi + + * sys/waveform/gstwaveformsink.c: + * sys/waveform/gstwaveformsink.h: + waveformsink: Fix mingw warnings + https://bugzilla.gnome.org/show_bug.cgi?id=667719 + +2012-01-12 18:23:42 +0000 Vincent Penquerc'h + + * gst/rtpmanager/gstrtpssrcdemux.c: + gstrtpssrcdemux: fix element leak + +2012-01-12 14:19:22 +0000 Vincent Penquerc'h + + * gst/matroska/matroska-read-common.c: + matroska: do not leak attachment buffers + +2012-01-12 10:30:11 +0000 Vincent Penquerc'h + + * ext/flac/gstflacenc.c: + flacenc: do not drop the first data buffer on the floor (and leak it either) + +2012-01-11 18:45:33 -0300 Reynaldo H. Verdejo Pinochet + + * Android.mk: + Temporarily disabling multifile for the Android build + There is a hard dependency on inotify comming from gio. We + are not currently bundling inotify with the Android dist so + I'm disabling multifile for now until someone gets around + to sort this out. + This change fixes building on Android + +2012-01-11 01:45:34 +0000 Tim-Philipp Müller + + * tests/check/pipelines/wavenc.c: + tests: fix wavenc test on big endian + wavenc only accepts little-endian PCM, but most of our + elements such as audiotestsrc only produce or process + audio in native endianness, so we need to plug a + converter before wavenc on big endian systems. + +2012-01-05 19:25:33 +0000 Vincent Penquerc'h + + * gst/isomp4/gstqtmux.c: + isomp4: fix caps leak + +2012-01-05 19:08:03 +0000 Vincent Penquerc'h + + * gst/isomp4/gstqtmux.c: + isomp4: remove dead assignment + +2012-01-04 19:40:14 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 11f0cd5 to cb5da59 + +2012-01-04 17:59:55 +0000 Tim-Philipp Müller + + * tests/check/elements/qtmux.c: + tests: fix some leaks and remove files when done in qtmux test + +2011-12-14 10:14:20 +0100 Peter Seiderer + + * gst/multifile/gstmultifilesink.c: + multifilesink: post better error message when we run out of disk space + Map write errno ENOSPC to GST_RESOURCE_ERROR_NO_SPACE_LEFT. + +2011-12-27 11:50:03 +0000 Tim-Philipp Müller + + * gst/udp/gstudpsrc.c: + udpsrc: fix valgrind warning + https://bugzilla.gnome.org/show_bug.cgi?id=666644 + +2011-12-21 13:22:03 +0100 John Ogness + + * gst/udp/gstudpsrc.c: + udpsrc: drop dataless UDP packets + It is allowed to send/receive UDP packets with no data. When such + a packet is available, select() will return with success but + ioctl(FIONREAD) will return 0. But a read() must still occur in + order to clear off the UDP packet from the queue. + This patch will read the dataless packet from the socket. If + select() was woken for other reasons (and FIONREAD returns 0), + this may result in a UDP packet getting accidentally dropped. + But since UDP is not reliable, this is acceptable. + NOTE: This patch fixes a nasty bug where sending a dataless + UDP packet to a udpsrc instance will cause an infinite + loop. + https://bugzilla.gnome.org/show_bug.cgi?id=666644 + Signed-off-by: John Ogness + +2011-12-21 20:50:21 +0100 Nicola Murino + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix peer_caps leak + https://bugzilla.gnome.org/show_bug.cgi?id=666688 + +2011-12-25 14:23:29 +0000 Tim-Philipp Müller + + * gst/flv/gstflvmux.c: + flvmux: don't try to push already-freed buffers + Fixes unit test. + +2011-09-09 11:42:09 +0100 Vincent Penquerc'h + + * gst/audioparsers/gstac3parse.c: + ac3parse: let bsid 9 and 10 through + Files with 9 and 10 happen, and seem to comply with the <= 8 + format, so let them through. + The spec says nothing about 9 and 10. + https://bugzilla.gnome.org/show_bug.cgi?id=658546 + +2011-12-16 19:15:38 +0100 Mark Nauwelaerts + + * gst/flv/gstflvmux.c: + flvmux: properly determine final duration + ... which can be authoratively obtained from our own written timestamps. + +2011-12-19 13:56:30 +0100 Mark Nauwelaerts + + * gst/flv/gstflvmux.c: + flvmux: only write full metadata at start + ... rather than having (potentially) unnecessary duplicates written all over, + or even contradictory varying filesize info, or duration info that will not + be rewritten upon header rewrite. + +2011-12-21 17:43:10 +0100 Branko Subasic + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: do not consider duration of non-finalized file + ... to avoid it clamping requested seek position. + Non-finalized file case, determined by whether + _parse_blockgroup_or_simpleblock ever updates the segment duration. + Fixes #652195. + +2011-12-21 15:06:57 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: improve decision to fall back to scanning when seeking + ... which is basically iff not streaming and no entry found in index + +2011-12-13 18:18:45 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-read-common.c: + matroskademux: filter bogus index entries with missing block number + ... to avoid contradictory information resulting in seeks sending more + downstream than needed for the corresponding segment. + +2011-12-13 18:15:18 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: cater for safer arithmetic with global start time + +2011-12-13 17:02:01 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: tweak final closing segment sending + ... to avoid it interfering with (sparse) stream syncing. + +2011-12-12 11:54:56 +0100 Sebastian Dröge + + * gst-libs/gst/glib-compat-private.h: + glib-compat: Add license boilerplate for LGPL + +2011-12-12 15:15:46 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: mind (un)signed in some timestamp arithmetic + ... to avoid ending up with invalid (negative) duration. + +2011-02-09 15:31:22 +0100 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: increase parse tolerance for fuzzy file cases + +2011-12-12 10:38:20 +0000 Tim-Philipp Müller + + * Makefile.am: + build: dist glib-compat-private.h properly + Add missing slash. + +2011-12-12 10:18:14 +0000 Tim-Philipp Müller + + * tests/check/elements/souphttpsrc.c: + tests: use atexit, g_atexit has been deprecated in glib master + +2011-12-12 02:52:13 +0000 Tim-Philipp Müller + + * ext/dv/gstdvdemux.c: + * ext/flac/gstflacdec.c: + * ext/wavpack/gstwavpackparse.c: + * gst/avi/gstavidemux.c: + * gst/flv/gstflvdemux.c: + * gst/imagefreeze/gstimagefreeze.c: + * gst/isomp4/gstqtmoovrecover.c: + * gst/isomp4/qtdemux.c: + * gst/matroska/matroska-demux.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtsp/gstrtspsrc.c: + * gst/videomixer/videomixer2.c: + * gst/wavparse/gstwavparse.c: + Suppress deprecation warnings in selected files, for g_static_rec_mutex_* mostly + GStaticRecMutex is part of our API/ABI, not much we can do here + in 0.10 for most of these. + +2011-12-12 02:41:37 +0000 Tim-Philipp Müller + + * tests/check/elements/souphttpsrc.c: + * tests/icles/equalizer-test.c: + * tests/icles/gdkpixbufsink-test.c: + * tests/icles/test-oss4.c: + * tests/icles/videocrop-test.c: + tests: g_thread_init() is deprecated in glib master + It's not needed any longer. + +2011-12-12 02:38:37 +0000 Tim-Philipp Müller + + * ext/soup/gstsouphttpclientsink.c: + * gst/rtpmanager/gstrtpsession.c: + * sys/oss4/oss4-mixer.c: + * tests/icles/v4l2src-test.c: + Use g_thread_try_new() instead of g_thread_crate() with newer glib versions + +2011-12-12 02:31:36 +0000 Tim-Philipp Müller + + * gst/alpha/gstalpha.c: + * gst/alpha/gstalpha.h: + alpha: use new glib API for static mutex if available + +2011-12-12 02:30:45 +0000 Tim-Philipp Müller + + * Makefile.am: + * ext/jack/gstjackaudioclient.c: + * ext/pulse/pulseaudiosink.c: + * ext/pulse/pulsesink.c: + * ext/soup/gstsouphttpclientsink.c: + * gst-libs/gst/glib-compat-private.h: + * gst/audiofx/audiochebband.c: + * gst/audiofx/audiocheblimit.c: + * gst/audiofx/audiofirfilter.c: + * gst/audiofx/audioiirfilter.c: + * gst/audiofx/audiowsincband.c: + * gst/audiofx/audiowsinclimit.c: + * gst/equalizer/gstiirequalizer.c: + * gst/imagefreeze/gstimagefreeze.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/shapewipe/gstshapewipe.c: + * gst/udp/gstmultiudpsink.c: + * gst/videobox/gstvideobox.c: + * gst/videocrop/gstaspectratiocrop.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer2.c: + * sys/oss4/oss4-mixer.c: + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/gstv4l2xoverlay.c: + * sys/ximage/gstximagesrc.c: + Work around deprecated thread API in glib master + Add private replacements for deprecated functions such as + g_mutex_new(), g_mutex_free(), g_cond_new() etc., mostly + to avoid the deprecation warnings. We'll change these + over to the new API once we depend on glib >= 2.32. + +2011-12-12 10:24:45 +0100 Sebastian Dröge + + * configure.ac: + configure: Require GLib >= 2.24 + All other modules require this already and nobody is testing with + older versions anyway. + +2011-12-11 18:40:31 +0000 Tim-Philipp Müller + + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + gdkpixbufsink: fix inverted pixel-aspect-ratio + Spotted by Mike Morrison. + https://bugzilla.gnome.org/show_bug.cgi?id=665882 + +2011-12-11 17:55:14 +0000 Tim-Philipp Müller + + * ext/pulse/pulseaudiosink.c: + pulseaudiosink: don't leak pad template + +2011-12-10 15:13:07 +0000 Tim-Philipp Müller + + * configure.ac: + * gst/deinterlace/tvtime-dist.c: + * gst/videobox/gstvideoboxorc-dist.c: + * gst/videomixer/blendorc-dist.c: + * po/eo.po: + * win32/common/config.h: + 0.10.30.2 pre-release + +2011-12-10 14:48:57 +0000 Tim-Philipp Müller + + * ext/soup/gstsouphttpclientsink.c: + soup: fix start/stop race in souphttpclientsink + Fix crash or hang in generic/states unit test when doing stop() + right after start(). Create main loop in the start function already + and not just in the thread function, so that stop() always has a + valid main loop to quit on. Also, calling g_main_loop_quit() before + g_main_loop_run() won't work and result in the stop function waiting + for the thread to join forever. Therefore, wait for the thread to + be ready and get the main loop running in the start() function, to + be sure stop() always works. + +2011-12-10 13:35:08 +0000 Tim-Philipp Müller + + * tests/files/Makefile.am: + tests: dist test file used in matroskaparse unit test + +2011-12-10 12:32:32 +0000 Tim-Philipp Müller + + * tests/check/elements/rgvolume.c: + tests: fix up rgvolume test for basetransform event caching + Some tests assumed that tag events would always pushed through + immediately, which isn't the case any longer, so push a newsegment + event and an empty buffer first. + +2011-12-10 02:21:02 +0000 Tim-Philipp Müller + + * po/LINGUAS: + * po/eo.po: + * po/ja.po: + * po/lv.po: + * po/sr.po: + po: update translations + +2011-12-09 15:50:28 +0000 Tim-Philipp Müller + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: don't leak client name when freeing the element + And add gtk-doc chunks for the new property. + https://bugzilla.gnome.org/show_bug.cgi?id=665872 + +2011-12-09 15:45:03 +0000 Nicolas Baron + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosink.h: + * ext/jack/gstjackaudiosrc.c: + * ext/jack/gstjackaudiosrc.h: + jack: add "client-name" property to jackaudiosink and jackaudiosrc + https://bugzilla.gnome.org/show_bug.cgi?id=665872 + +2011-12-08 11:00:45 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-mux.c: + matroskamux: stream-format=raw goes with aac caps, not mp3 caps + +2011-12-02 12:07:24 +0000 Vincent Penquerc'h + + * sys/v4l2/gstv4l2object.c: + v4l2src: do not ignore the highest frame interval + https://bugzilla.gnome.org/show_bug.cgi?id=665387 + +2011-12-02 11:59:03 +0000 Vincent Penquerc'h + + * sys/v4l2/gstv4l2object.c: + v4l2src: do not ignore the largest resolution + The 'max' value isn't an STL style "one after the end" bound, + but the largest allowed value. + https://bugzilla.gnome.org/show_bug.cgi?id=665387 + +2011-12-06 16:47:25 +0100 Stefan Sauer + + * gst/multifile/gstmultifilesink.h: + docs: add add the two enum values that were just added too + +2011-12-06 16:14:54 +0100 Stefan Sauer + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/multifile/gstmultifilesink.h: + multifilesink: expose the enum property docs for splitting mode. + Fixes #665666. + +2011-12-05 12:15:21 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2object.c: + v4l2: replace deprecated GST_CLASS_LOCK + +2011-11-24 13:58:01 +0100 Sebastian Rasmussen + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: Ceil jpeg dimensions, instead of floor + A JPEG image inside an RTP stream has a preceeding RFC2435 header that + conveys width/height. The dimensions in this header are limited to be + multiples of 8. Since JPEG uses an MCU of 8x8 pixels any image must + already indirectly have image data dimensions that are rounded up in + order to contain enough data to render the image. Therefore this fix + safely rounds the image dimensions in the RFC2435 header up to the + closest multiple of 8. + +2011-12-04 12:50:57 +0000 Vincent Penquerc'h + + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstflacparse.h: + flacparse: ensure we only check for sample/block mixup at start + Otherwise we might trigger at some point within the file, but the + check is only making sense for the second block. + +2011-12-03 18:14:59 +0000 Vincent Penquerc'h + + * gst/matroska/matroska-parse.c: + matroskaparse: warn if accumulating headers after they were pushed + https://bugzilla.gnome.org/show_bug.cgi?id=665412 + +2011-10-25 12:54:43 -0700 David Schleef + + * gst/matroska/matroska-parse.c: + matroskaparse: fix parsing + Mark more parts as belonging to streamheaders. + +2011-12-03 17:30:10 +0000 Vincent Penquerc'h + + * gst/flv/gstflvdemux.c: + flvdemux: fix discontinuity threshold check when timestamps go backwards + Since unsigned types are used, a negative value would show as very, very + positive. + Fixes A/V sync on some... less than well made files where timestamps go + backwards. + +2011-12-02 12:01:22 +0000 Vincent Penquerc'h + + * sys/v4l2/gstv4l2object.c: + v4l2src: add a comment about a "hidden" assumption on rank values + https://bugzilla.gnome.org/show_bug.cgi?id=665387 + +2011-12-01 14:13:05 +0000 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: fix up LIBS order som more` + +2011-12-01 13:22:42 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-mux.c: + matroska-mux: fix name of new property and the unit test + https://bugzilla.gnome.org/show_bug.cgi?id=654379 + +2011-09-25 14:57:56 +0100 Tim-Philipp Müller + + * gst/multifile/gstmultifilesink.c: + multifilesink: add basic buffer list handling + We assume for now that all buffers in a buffer list + should end up in the same file (so we can group GOPs + in buffer lists, for example). Could optimise this + a bit to avoid the memcpy. + +2011-09-23 18:43:35 +0100 Tim-Philipp Müller + + * gst/multifile/gstmultifilesink.c: + multifilesink: write stream-headers when switching to the next file in max-size mode + +2011-09-23 18:31:01 +0100 Tim-Philipp Müller + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + multifilesink: add new 'max-size' mode for switching to the next file + +2011-09-23 17:49:05 +0100 Tim-Philipp Müller + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + multifilesink: add "max-file-size" property for new next-file mode + +2011-12-01 13:38:06 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Don't forget SSA subtitles in last commit + +2011-12-01 13:34:52 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + matroskademux: Only check for markup and escape if necessary for plaintext subtitles + Otherwise we break USF and ASS/SSA subtitles. + +2011-12-01 13:23:33 +0100 Alessandro Decina + + * gst/multifile/Makefile.am: + multifile: fix build in uninstalled setup + Add -base libs includes to CFLAGS, fix order of LIBS . + +2011-12-01 13:08:01 +0100 Alessandro Decina + + * tests/check/elements/multifile.c: + tests: fix g_mkdtemp presence check in multifile tests + g_mkdtemp was added in glib 2.30 even though the doc claims it was added in + 2.26. + +2011-07-17 23:56:04 +0200 Alessandro Decina + + * gst/multifile/Makefile.am: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + * tests/check/Makefile.am: + * tests/check/elements/multifile.c: + multifilesink: add flag to cut after a force key unit event + +2011-12-01 12:47:26 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Copy all buffer flags when creating a subtitle buffer copy after postprocessing + This also copies the caps. Otherwise we could end up pusing + the first buffer without any caps, which causes downstream + to not get notified about the caps. + Fixes bug #664892. + +2011-10-11 02:07:13 +0200 Alexey Fisher + + * gst/matroska/matroska-mux.c: + matroskamux: make default framerate optional per stream + there is at least two use cases where default frame rate + should or may be disabled: + - vp8 stream with altref frame enabled. If default frame rate + is enabled, some players will missinterprete it (critical!) + - for webm container, to reduce micro overhead + - for stream with variable frame rate. + Signed-off-by: Alexey Fisher + +2011-11-30 22:13:11 +0100 Stefan Sauer + + * gst/effectv/gstripple.c: + rippletv: fix CLAMP end-values + +2011-11-30 19:25:37 +0000 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-audioparsers.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-isomp4.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + docs: update docs + +2011-11-30 19:00:42 +0000 Tim-Philipp Müller + + * gst/multifile/Makefile.am: + * gst/multifile/gstsplitfilesrc.c: + * gst/multifile/patternspec.c: + * gst/multifile/patternspec.h: + splitfilesrc: specify filenames via normal wildcards instead of regular expressions + Less cracktastic in the end. + +2011-10-10 18:28:11 +0100 Tim-Philipp Müller + + * gst/multifile/gstsplitfilesrc.c: + splitfilesrc: check bytes actually read, just in case + Handle corner case where we try to read beyond the end of the + last file part, in which case we want to return a short read. + If we get fewer bytes than expected for any other file part, + we should just error out, since something fishy's going on + then. + +2011-10-06 08:33:19 +0100 Tim-Philipp Müller + + * gst/multifile/gstsplitfilesrc.c: + splitfilesrc: set offsets on buffers + Looks like some parsers (in some versions at least) expect the + offsets to be set, and behave weird if that's not the case + (e.g. off-by-one in h264parse). + +2011-07-28 20:19:56 +0100 Tim-Philipp Müller + + * configure.ac: + * gst/multifile/Makefile.am: + * gst/multifile/gstmultifile.c: + * gst/multifile/gstsplitfilesrc.c: + * gst/multifile/gstsplitfilesrc.h: + multifile: add splitfilesrc element + Add new splitfilesrc element that presents multiple files + (selectable via a location regex) as one single contiguous + file. + +2011-11-29 17:34:10 -0300 Thiago Santos + + * ext/pulse/pulseaudiosink.c: + Revert "pulseaudiosink: fix caps leak" + This reverts commit d6a9de9e2aedc8b66ab3219902b5a37e8d65ada2. + setcaps functions aren't supposed to take ownership of the caps passed + +2011-11-28 12:58:44 +0000 Vincent Penquerc'h + + * ext/aalib/gstaasink.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/cairo/gstcairooverlay.c: + * ext/cairo/gstcairorender.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttimeoverlay.c: + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdemux.c: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + * ext/flac/gstflactag.c: + * ext/gconf/gstswitchsink.c: + * ext/gconf/gstswitchsrc.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/hal/gsthalaudiosink.c: + * ext/hal/gsthalaudiosrc.c: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libcaca/gstcacasink.c: + * ext/libmng/gstmngdec.c: + * ext/libmng/gstmngenc.c: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/mikmod/gstmikmod.c: + * ext/pulse/pulseaudiosink.c: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + * ext/shout2/gstshout2.c: + * ext/soup/gstsouphttpclientsink.c: + * ext/soup/gstsouphttpsrc.c: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * ext/taglib/gstapev2mux.cc: + * ext/taglib/gstid3v2mux.cc: + * ext/taglib/gsttaglibmux.c: + * ext/wavpack/gstwavpackdec.c: + * ext/wavpack/gstwavpackenc.c: + * ext/wavpack/gstwavpackparse.c: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalphacolor.c: + * gst/apetag/gstapedemux.c: + * gst/audiofx/audiopanorama.c: + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstmpegaudioparse.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautovideosink.c: + * gst/autodetect/gstautovideosrc.c: + * gst/avi/gstavidemux.c: + * gst/avi/gstavimux.c: + * gst/avi/gstavisubtitle.c: + * gst/cutter/gstcutter.c: + * gst/debugutils/breakmydata.c: + * gst/debugutils/cpureport.c: + * gst/debugutils/efence.c: + * gst/debugutils/gstcapsdebug.c: + * gst/debugutils/gstcapssetter.c: + * gst/debugutils/gstnavigationtest.c: + * gst/debugutils/gstnavseek.c: + * gst/debugutils/gstpushfilesrc.c: + * gst/debugutils/gsttaginject.c: + * gst/debugutils/progressreport.c: + * gst/debugutils/rndbuffersize.c: + * gst/debugutils/testplugin.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstop.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstradioac.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstripple.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gststreak.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvmux.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/goom2k1/gstgoom.c: + * gst/icydemux/gsticydemux.c: + * gst/id3demux/gstid3demux.c: + * gst/imagefreeze/gstimagefreeze.c: + * gst/interleave/deinterleave.c: + * gst/interleave/interleave.c: + * gst/isomp4/gstqtmux.c: + * gst/isomp4/gstrtpxqtdepay.c: + * gst/isomp4/qtdemux.c: + * gst/law/alaw-decode.c: + * gst/law/alaw-encode.c: + * gst/law/mulaw-decode.c: + * gst/law/mulaw-encode.c: + * gst/level/gstlevel.c: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/webm-mux.c: + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/replaygain/gstrganalysis.c: + * gst/replaygain/gstrglimiter.c: + * gst/replaygain/gstrgvolume.c: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpac3pay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpbvdepay.c: + * gst/rtp/gstrtpbvpay.c: + * gst/rtp/gstrtpceltdepay.c: + * gst/rtp/gstrtpceltpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpdvdepay.c: + * gst/rtp/gstrtpdvpay.c: + * gst/rtp/gstrtpg722depay.c: + * gst/rtp/gstrtpg722pay.c: + * gst/rtp/gstrtpg723depay.c: + * gst/rtp/gstrtpg723pay.c: + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729pay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtpgstdepay.c: + * gst/rtp/gstrtpgstpay.c: + * gst/rtp/gstrtph263depay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpj2kdepay.c: + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp2tpay.c: + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmparobustdepay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtpmpvpay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpqcelpdepay.c: + * gst/rtp/gstrtpqdmdepay.c: + * gst/rtp/gstrtpsirendepay.c: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + * gst/rtp/gstrtpvrawdepay.c: + * gst/rtp/gstrtpvrawpay.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtspsrc.c: + * gst/shapewipe/gstshapewipe.c: + * gst/smpte/gstsmpte.c: + * gst/smpte/gstsmptealpha.c: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/videobox/gstvideobox.c: + * gst/videocrop/gstaspectratiocrop.c: + * gst/videocrop/gstvideocrop.c: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer2.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: + * gst/y4m/gsty4mencode.c: + * sys/directsound/gstdirectsoundsink.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxvideo/osxvideosink.m: + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosrc.c: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2src.c: + * sys/waveform/gstwaveformsink.c: + * sys/ximage/gstximagesrc.c: + * tests/check/elements/qtmux.c: + various: fix pad template leaks + https://bugzilla.gnome.org/show_bug.cgi?id=662664 + +2011-11-28 11:47:11 +0100 Chad + + * gst/debugutils/gsttaginject.c: + taginject: set gap-aware + The element does not modify the data anyway. + +2011-11-26 21:39:33 +0100 Stefan Sauer + + * gst/equalizer/gstiirequalizer.c: + equalizer: also sync the parameters for the filter bands + +2011-11-26 16:06:59 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-ids.c: + matroskademux: initialise seen_markup_tag field on subtitle stream context + +2011-11-25 19:28:55 -0300 Thiago Santos + + * gst/isomp4/gstqtmuxmap.c: + ismlmux: Use iso-fragmented as variant type + Using 'iso' conflicts with mp4mux variant type, ismlmux now + uses iso-fragmented + Fixes #656823 + +2011-11-24 12:05:33 +0530 Arun Raghavan + + * ext/pulse/pulsesrc.c: + * ext/pulse/pulsesrc.h: + pulsesrc: Implement GstStreamVolume interface + PulseAudio 1.0 supports per-source-output volumes, and this exposes the + functionality via the GstStreamVolume interface. + When compiled against pre-1.0 PulseAudio, the interface is not + implemented, and the "volume" or "mute" properties are not available. + This bit of ugliness will go away when we can depend on PulseAudio 1.0 + or greater. + https://bugzilla.gnome.org/show_bug.cgi?id=595055 + +2011-09-10 21:21:38 -0700 Arun Raghavan + + * ext/pulse/pulsesrc.c: + pulsesrc: Trivial comment copy-paste-o fix + +2011-11-14 12:43:27 +0530 Arun Raghavan + + * ext/pulse/pulseaudiosink.c: + pulseaudiosink: Remove redundant code + +2011-11-14 12:41:41 +0530 Arun Raghavan + + * ext/pulse/pulseaudiosink.c: + pulseaudiosink: Clean up refcounting in event probe + Makes sure we don't leak a refcount if the object is disposed before a + NEWSEGMENT turns up. + +2011-11-24 16:31:38 +0000 Vincent Penquerc'h + + * gst/flv/gstflvdemux.c: + flvdemux: fix seeking + Which I accidentally broke when fixing flv videos breaking on + spurious timestamp discontinuities in broken files. + https://bugzilla.gnome.org/show_bug.cgi?id=631430 + +2011-11-25 13:13:47 +0100 Stefan Sauer + + * gst/effectv/gstradioac.c: + * gst/effectv/gstradioac.h: + effectv: repair color modes in radioactv by taking rgb,bgr into account + +2011-11-25 11:44:49 +0100 Stefan Sauer + + * gst/effectv/gstradioac.c: + radioactv: add one more set of caps + It also work in this format. Avoids the need for conversion. + +2011-11-25 11:44:18 +0100 Stefan Sauer + + * gst/effectv/gstradioac.c: + * gst/effectv/gstshagadelic.c: + effecttv: fix reverse negotiation + The plugins were using _fixed_caps_ and thus not adjusting to new upstream + sizes. Spotted by Tim Müller. + +2011-11-25 11:43:16 +0100 Stefan Sauer + + * gst/effectv/gstwarp.c: + warptv: remove not needed ifdef + +2011-11-25 10:15:35 +0100 Stefan Sauer + + * gst/effectv/gstripple.c: + rippletv: clean up the rendering code a bit + This is corrrupts the memoy when resizing. Add a FIXME to make it resizeable + once that is solved. + +2011-11-24 20:42:49 +0100 Stefan Sauer + + * gst/effectv/gstquark.c: + * gst/effectv/gststreak.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + effecttv: fix reverse negotiation + The plugins were using _fixed_caps_ and thus not adjusting to new upstream + sizes. Spotted by Tim Müller. + +2011-11-24 14:14:53 -0300 Thiago Santos + + * gst/multifile/gstmultifilesink.c: + multifilesink: Fix leak of filename strings + Do not forget to free the filename strings when deleting + the list of files. + +2011-11-24 14:11:33 -0300 Thiago Santos + + * tests/check/elements/multifile.c: + multifile: fix build of tests + Tests fail to build because g_mkdtemp is available from glib since + 2.26. + This patch adds a condition around the redefinition of + g_mkdtemp on the tests to only build it if glib is older than + 2.26. + +2011-09-27 16:49:45 +0100 Vincent Penquerc'h + + * gst/wavparse/gstwavparse.c: + wavparse: skip id32 tags + This allows decoding at least one sample where something has + stuffed some ID3 tag before the (supposedly initial) FMT\ . + https://bugzilla.gnome.org/show_bug.cgi?id=660249 + +2011-10-31 17:06:18 +0000 Vincent Penquerc'h + + * gst/effectv/gstedge.c: + edgetv: trivial comment fix for clarity + https://bugzilla.gnome.org/show_bug.cgi?id=661841 + +2011-10-31 17:04:23 +0000 Vincent Penquerc'h + + * gst/effectv/gstedge.c: + edgetv: don't leave bits of the output buffer uninitialized + Let's initialize them to zero. It looks alright, but then it + also looks alright with v3, or with the corresponding pixels + from the source. I don't know what the original intent would + be, and the original effectv source also has this bug/feature. + https://bugzilla.gnome.org/show_bug.cgi?id=661841 + +2011-11-24 10:25:02 +0100 Sebastian Dröge + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstmpegaudioparse.c: + audioparse: Use the sinkpad template caps as fallback, not the srcpad ones + +2011-11-24 09:59:40 +0100 Sebastian Dröge + + * gst/audioparsers/gstmpegaudioparse.c: + mpegaudioparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream + +2011-11-24 09:57:57 +0100 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + flacparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream + +2011-11-24 09:55:47 +0100 Sebastian Dröge + + * gst/audioparsers/gstdcaparse.c: + dcaparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream + +2011-11-24 09:53:18 +0100 Sebastian Dröge + + * gst/audioparsers/gstamrparse.c: + amrparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream + +2011-11-24 09:49:27 +0100 Sebastian Dröge + + * gst/audioparsers/gstamrparse.c: + amrparse: Mark some more functions as static + +2011-11-24 09:48:33 +0100 Sebastian Dröge + + * gst/audioparsers/gstac3parse.c: + ac3parse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream + +2011-11-24 09:44:58 +0100 Sebastian Dröge + + * gst/audioparsers/gstaacparse.c: + aacparse: Mark some functions as static and remove unused function declarations + +2011-11-24 09:43:14 +0100 Sebastian Dröge + + * gst/audioparsers/gstaacparse.c: + aacparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream + +2011-11-23 00:57:39 +0000 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/elements/matroskaparse.c: + * tests/files/pinknoise-vorbis.mkv: + tests: add basic unit test for matroskaparse + +2011-11-23 00:56:26 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-parse.c: + matroskaparse: don't leak stream headers + https://bugzilla.gnome.org/show_bug.cgi?id=664548 + +2011-11-16 19:08:05 +0100 Mark Nauwelaerts + + * ext/speex/gstspeexenc.c: + speexenc: ensure to free allocated padded data + +2011-11-16 18:57:38 +0100 Mark Nauwelaerts + + * ext/speex/gstspeexenc.c: + speexenc: reset tag setter interface when appropriate + +2011-11-16 18:57:21 +0100 Mark Nauwelaerts + + * ext/flac/gstflacenc.c: + flacenc: reset tag setter interface when appropriate + +2011-11-14 15:34:57 +0000 Vincent Penquerc'h + + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstflacparse.h: + flacparse: detect when a file lies about fixed block size + If the sample/block number happens to be the same as the block + size, we assume variable block size, and thus counters in samples + in the headers. This can only get us a false positive for a block + size of 1, which is invalid. We can get false negatives more + often though (eg, if not starting at the start of the stream), + but then that's already GIGO. + +2011-09-02 19:20:07 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + gstrtpsession: Add special mode to use FIR as repair as Google does + https://bugzilla.gnome.org/show_bug.cgi?id=658419 + +2011-09-01 17:47:38 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.h: + rtpsession: Send FIR requests in response to key unit requests with all-headers=TRUE + https://bugzilla.gnome.org/show_bug.cgi?id=658419 + +2011-09-01 16:25:21 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.h: + rtpsession: Put the PLI requests in each RTPSource + Also refactor a bit and put all the keyframe request code in one + place inside rtpsession.c + https://bugzilla.gnome.org/show_bug.cgi?id=658419 + +2011-08-31 14:35:33 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Hack to FIR because Google doesn't set the sender ssrc correctly + https://bugzilla.gnome.org/show_bug.cgi?id=658419 + +2011-08-30 19:06:13 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Process received Full Intra Requests + Process FIR requests according to RFC 5104 + https://bugzilla.gnome.org/show_bug.cgi?id=658419 + +2011-11-07 18:43:26 +0000 Sjoerd Simons + + * sys/v4l2/gstv4l2object.c: + v4l2: Set pixel-aspect-ratio to 1/1 + We don't currently support setting the pixel-aspect-ratio from V4L2. So + simply set it to be 1/1 in the caps to prevent negotiation failures when + fixating to weird values (e.g. when the downstream caps has + pixel-aspect-ratio = [ MIN, MAX ] ) + https://bugzilla.gnome.org/show_bug.cgi?id=663580 + +2011-11-11 10:06:25 -0300 Thiago Santos + + * ext/pulse/pulseaudiosink.c: + pulseaudiosink: fix caps leak + +2011-11-11 14:55:48 +0100 Mark Nauwelaerts + + * ext/pulse/pulsesink.c: + pulsesink: do not leak clientname when setting up property + +2011-11-11 18:05:35 +0530 Arun Raghavan + + * ext/pulse/pulseaudiosink.c: + pulse: Chain up dispose() in pulseaudiosink + +2011-11-08 15:35:26 +0000 Vincent Penquerc'h + + * gst/avi/gstavidemux.c: + avidemux: fix wrong stride when inverting uncompressed video + Such frames have a stride multiple of 4, see + http://lscube.org/pipermail/ffmpeg-issues/2010-April/010247.html. + This showed up on a sample using a odd width of 24 bit video. + https://bugzilla.gnome.org/show_bug.cgi?id=652288 + +2011-11-09 10:32:06 +0100 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: minimal sanity check on creation datetime + +2011-11-02 12:58:12 -0400 Olivier Crête + + * gst/rtp/gstrtph263ppay.c: + rtph263ppay: Return the sink pad template as sink caps, not the src's + https://bugzilla.gnome.org/show_bug.cgi?id=577784 + +2009-03-15 19:26:48 -0400 Olivier Crête + + * gst/rtp/gstrtph263ppay.c: + rtph263ppay: Also implement size/framerate restrictions in getcaps + https://bugzilla.gnome.org/show_bug.cgi?id=577784 + +2009-03-04 20:50:19 -0500 Olivier Crête + + * gst/rtp/gstrtph263ppay.c: + rtph263ppay: Implement getcaps following RFC 4629, picks the right annexes + https://bugzilla.gnome.org/show_bug.cgi?id=577784 + +2011-11-08 14:31:34 +0100 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: also set segment stop at startup rather than only post seek + ... so as to ensure consistent playback with or without seek, especially + in presence of some bogus edit list entries. + +2011-11-02 17:02:54 +0000 Raul Gutierrez Segales + + * gst/flv/Makefile.am: + gst/flv/: add amfdefs.h to noinst_HEADERS + https://bugzilla.gnome.org/show_bug.cgi?id=663334 + +2011-10-03 17:50:43 +0100 Vincent Penquerc'h + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + flvdemux: detect large pts gaps and resync + Should work on multiple gaps, but tested on only one. + https://bugzilla.gnome.org/show_bug.cgi?id=631430 + +2011-08-22 10:40:45 +0100 Vincent Penquerc'h + + * ext/flac/gstflacdec.c: + flacdec: fix off by one between granpos and last_stop + +2011-10-07 19:41:35 +0100 Vincent Penquerc'h + + * gst/audioparsers/gstflacparse.c: + flacparse: fix last frame timestamp in fixed block size mode + The last block may have a different block size, so we should not + use it to scale or we'll end up with a wrong timestamp. + See comment and quote from the FLAC format documentation in the code. + Fixes looped playback of FLAC files (via about-to-finish). + https://bugzilla.gnome.org/show_bug.cgi?id=661215 + +2011-10-27 15:52:47 +0100 Vincent Penquerc'h + + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttextoverlay.h: + cairotextoverlay: add a 'silent' property to skip rendering + https://bugzilla.gnome.org/show_bug.cgi?id=662856 + +2011-11-07 12:00:12 +0100 René Stadler + + * gst/matroska/ebml-write.c: + matroskamux: fix regression causing malformed files + This was caused by me in 1b213d. It seems I was too focused on 0.11 when I did + this and tested the wrong branch. + The problem was reported by Alexey Fisher. + +2011-11-03 23:28:31 +0000 Tim-Philipp Müller + + * gst/rtp/gstrtpvrawdepay.c: + rtp: use GLib's G_BIG_ENDIAN define instead of BIG_ENDIAN + Fixes compiler warning on mingw32 + +2011-10-31 16:18:32 +0100 Mark Nauwelaerts + + * gst/isomp4/gstqtmux.c: + qtmux: avoid shortcut evaluation when adding paired mp4 tag + Fixes (part of) #638711. + +2011-10-31 15:43:25 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskamux: do not use unoffical V_MJPEG codec id + ... but as not spec'ed especially, consider it a VfW compatibility case. + Fixes #659837. + +2011-10-30 19:30:14 +0000 Tim-Philipp Müller + + * ext/flac/gstflacenc.h: + flacenc: remove dead code from header + We require a new-enough libflac that this condition will never apply. + +2011-10-28 09:57:36 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: add sof-marker to template caps, so we don't get plugged for lossless jpeg + jpegdec (using libjpeg 6.2/8) can't decode some lossless types of JPEG. + https://bugzilla.gnome.org/show_bug.cgi?id=556648 + +2011-10-28 12:30:33 +0200 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: elaborate some debug statements + +2011-10-11 20:56:51 +0400 Stas Sergeev + + * gst/flv/gstflvdemux.c: + flvdemux: be careful with negative cts + Fixes #661477. + +2011-10-06 13:04:54 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: tune non-update seek handling cases + Fixes #661049. + +2011-10-28 10:40:36 +0200 Sebastian Dröge + + * gst/videomixer/videomixer2.c: + videomixer2: Use the clip function instead of the prepare_buffer function + +2011-10-28 09:36:17 +0200 Sebastian Dröge + + * gst/videomixer/Makefile.am: + * gst/videomixer/gstcollectpads2.c: + * gst/videomixer/gstcollectpads2.h: + * gst/videomixer/videomixer2.h: + * gst/videomixer/videomixer2pad.h: + videomixer2: Use collectpads2 from core + +2011-10-28 00:41:45 +1100 Jan Schmidt + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Don't pointlessly hold object lock over caps operations + Avoids a deadlock when getcaps is recursive due to the getcaps being + reflected upstream/downstream. The lock isn't actually protecting + anything here. + +2011-10-27 00:37:03 +1100 Jan Schmidt + + * gst/flv/amfdefs.h: + * gst/flv/gstflvmux.c: + flvmux: add some comments and defines to clarify code. + +2011-10-10 15:36:14 +0200 René Stadler + + * gst/matroska/ebml-write.c: + matroska: refactor ebml-write to be more 0.11 friendly + Switching to a more 0.11-friendly pattern, where getting the buffer's data + pointer and setting the size many times is less natural. This is of course in + preparation to the upcoming port of the plugin. + +2011-10-11 21:45:46 +0200 René Stadler + + * gst/matroska/ebml-write.c: + matroska: remove stale floatcast include + GDOUBLE_TO_BE was moved to core a long time ago. + +2011-10-11 22:10:27 +0200 René Stadler + + * gst/matroska/matroska-mux.c: + matroskamux: fix possible crash with malformed dirac codec_data + Since size is unsigned, we need to safeguard against wrapping below zero. + +2011-10-21 22:33:34 +0200 René Stadler + + * gst/equalizer/gstiirequalizer.c: + equalizer: remove avoidable call to gst_object_set_name + +2011-10-21 22:32:38 +0200 René Stadler + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: remove avoidable call to gst_object_set_name + +2011-10-16 20:30:25 +0200 René Stadler + + * ext/libpng/gstpngenc.c: + pngenc: increase arbitrary resolution limits + Apparently libpng can technically do up to 2^31-1 rows and columns. However it + imposes an (arbitrary) default limit of 1 million (that could theoretically be + lifted by using some additional API). + Moved array allocation to the heap now. + +2011-10-16 20:25:41 +0200 René Stadler + + * ext/libpng/gstpngenc.c: + pngenc: don't unconditionally allocate 4096 pointers on the stack + Instead allocate as many as needed (on the stack still). + +2011-10-16 20:05:28 +0200 René Stadler + + * ext/libpng/gstpngenc.c: + pngenc: ensure setcaps was called before chain function + This is needed to properly error out for e.g. "fakesrc ! pngenc ! fakesink". + +2011-10-16 19:44:27 +0200 René Stadler + + * ext/libpng/gstpngenc.c: + pngenc: validate input buffer size + Just for safety; of course such mismatch represents a bug in another element. + +2011-10-16 19:41:28 +0200 René Stadler + + * ext/libpng/Makefile.am: + * ext/libpng/gstpngenc.c: + * ext/libpng/gstpngenc.h: + pngenc: make setcaps more robust, use gstvideo functions + A setcaps function needs to actually verify the caps carefully. In this case, + it was possible to e.g. link a video decoder with YUV+RGB template caps to + pngenc. That would cause a crash when the decoder pushes a YUV buffer. Same + thing when pushing a valid buffer that exceeds the resolution limits. + Also, missing framerate caps field would cause a glib critical warning due to + invalid GValue. This fails hard now. + +2011-10-21 10:01:43 +0200 René Stadler + + * gst/matroska/matroska-read-common.c: + ebml: small correction to previous commit + Signal a short read with UNEXPECTED, exactly like the peek_bytes function. + +2011-10-19 13:09:51 +0200 Edward Hervey + + * gst/matroska/matroska-read-common.c: + ebml: Fix push-based behaviour + The 'peek' method was completely wrong (!?) + +2011-10-18 18:31:17 +0530 Arun Raghavan + + * ext/pulse/pulseaudiosink.c: + pulse: Get caps correctly on pad block + Instead of always going upstream, we should first see if already got + caps from a setcaps() call. + https://bugzilla.gnome.org/show_bug.cgi?id=661262 + +2011-10-18 12:25:14 +0100 Tim-Philipp Müller + + * ext/wavpack/gstwavpackenc.c: + wavpackenc: don't unref buffer with gst_object_unref() + +2011-10-18 12:05:01 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: only use is_pcm for 1.0 of pulseaudio + +2011-10-18 11:58:57 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: only disable trickmodes for !pcm + Only disable trickmodes when we are not dealing with raw PCM samples. + +2011-10-14 10:56:16 +0530 Arun Raghavan + + * gst/videomixer/videomixer2.c: + videomixer2: Fix a leak + Buffers weren't being unref'ed in one case inside, causing memory usage + to blow up. + +2011-10-14 09:10:01 +0200 Marc Leeman + + * gst/rtp/gstrtpvrawdepay.c: + set colour masks for video/x-raw-rgb in rtpvrawdepay + +2011-10-13 16:59:50 +0530 Arun Raghavan + + * gst/videomixer/videomixer2.c: + videomixer2: Fix incorrect gst_buffer_replace() call + This got exposed when gst_buffer_replace() was changed from a macro to a + function. + +2011-10-12 11:26:50 +0200 Edward Hervey + + * gst/rtp/gstrtpvrawpay.c: + rtpvrawpay: Only use 24 LSB for depth=24 RGB caps + ... and indent the masks for clarity + +2011-10-11 14:58:43 +0200 René Stadler + + * gst/matroska/matroska-mux.c: + matroskamux: fix segment handling, so we actually use running time + gst_matroska_mux_best_pad adjusts the buffer timestamp to running time using + the segment stored in the pad's collect data. However, the event handler didn't + pass the newsegment event on to collectpads' handler, so this segment was never + updated at all. + Re-fixes bug #432612. + +2011-10-10 19:01:23 +0100 Sjoerd Simons + + * gst/rtp/gstrtpg722pay.c: + gstrtpg722pay: Compensate for clockrate vs. samplerate difference + The RTP clock-rate used for G722 is 8000, even though the samplerate is + 16000. Compensate for this by pretending G722 has 8 bits per sample + instead of the 4 bits as if it were a codec that ran at half the speed, + but with twice the number of bits. Fixes #661376 + +2011-09-27 19:25:53 +0100 Sjoerd Simons + + * ext/jpeg/gstjpegdec.c: + jpegdec: Implement upstream negotiation + Add upstream negotiation for jpegdec. Fixes #660275 + +2011-10-10 19:02:58 +0100 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroska-demux: don't leak audio codec_data buffer + +2011-10-10 13:20:04 +0200 Stefan Sauer + + * tests/examples/cairo/Makefile.am: + tests: add missing PLUGIN_ASE_LIBS to LDADD + +2011-10-09 21:31:27 +0200 Mark Nauwelaerts + + * ext/speex/gstspeexenc.c: + * ext/speex/gstspeexenc.h: + speexenc: only push header buffers following initial events + +2011-10-09 11:18:18 -0300 Thiago Santos + + * gst/isomp4/atomsrecovery.c: + qtmux: Fix memory leak on atoms recovery function + Remember to free the ftyp data after writing it to a file. + Fixes #660969 + +2011-09-21 18:45:42 +0100 Vincent Penquerc'h + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: improve segment handling with non-zero starting timestamp + ... as well as related items, such as seeking and position reporting. + https://bugzilla.gnome.org/show_bug.cgi?id=659808 + +2011-09-29 18:41:53 +0400 Stas Sergeev + + * sys/v4l2/gstv4l2object.c: + * sys/ximage/gstximagesrc.c: + v4l2, ximagesrc: fix some printf format compiler warnings + https://bugzilla.gnome.org/show_bug.cgi?id=660150 + +2011-09-30 12:42:22 -0300 Thiago Santos + + * tests/check/elements/qtmux.c: + tests: qtmux: Refactor bitrate check test + Refactor bitrate check test to accomodate multiple tests + for bitrate + +2011-09-30 13:02:31 -0300 Thiago Santos + + * gst/isomp4/atoms.c: + qtmux: update esds atom under wave atom for aac bitrates + AAC in mov format puts an ESDS atom inside of a WAVE atom in + STSD atom, we need to update the bitrate on this ESDS. This patch + fixes it. + +2011-09-30 12:41:52 -0300 Thiago Santos + + * gst/isomp4/atoms.c: + * gst/isomp4/fourcc.h: + qtmux: Also update btrt atom + When rewriting bitrates, also update the btrt atom under stsd + +2011-09-30 10:55:53 -0300 Thiago Santos + + * tests/check/elements/qtmux.c: + tests: qtmux: add tests for bitrate average calculation + Adds tests to make sure qtmux/mp4mux sets average bitrate + correctly + +2011-09-28 11:41:49 -0300 Thiago Santos + + * gst/isomp4/atoms.c: + * gst/isomp4/atoms.h: + * gst/isomp4/gstqtmux.c: + * gst/isomp4/gstqtmux.h: + qtmux: Calculate average bitrate for streams + Calculate and use average bitrate for streams when no + bitrate tag was received + +2011-09-28 10:41:14 -0300 Thiago Santos + + * gst/isomp4/gstqtmux.c: + qtmux: Avoid a buffer metadata copy if possible + If first_ts is 0 there is no need to subtract, so we might + skip some copying to make the buffer metadata writable. + +2011-09-29 23:21:46 +0100 Tim-Philipp Müller + + * ext/speex/gstspeexenc.c: + speexenc: initialise variable before adding to it + +2011-09-29 17:21:22 +0200 Mark Nauwelaerts + + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexdec.h: + speexdec: port to audiodecoder + +2011-09-29 16:33:01 +0200 Mark Nauwelaerts + + * ext/speex/gstspeexenc.h: + speexenc: clean up some unused remnants + +2011-09-29 17:32:23 +0200 Mark Nauwelaerts + + * ext/speex/Makefile.am: + * ext/speex/gstspeexenc.c: + * ext/speex/gstspeexenc.h: + speexenc: port to audioencoder + +2011-09-28 16:09:58 +0200 Mark Nauwelaerts + + * ext/flac/Makefile.am: + * ext/flac/gstflacenc.c: + * ext/flac/gstflacenc.h: + flacenc: port to audioencoder + +2011-09-27 15:59:24 +0100 Vincent Penquerc'h + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-parse.c: + matroskademux: ensure minimal alignment for audio/x-raw-* buffers + Since matroskademux will attempt to push unaligned buffers, + downstream might have trouble with those, especially if downstream + uses ORC, such as audioconvert. + Ensure we push buffers aligned to the basic type at least for + those raw buffers. + https://bugzilla.gnome.org/show_bug.cgi?id=659798 + +2011-09-28 00:10:09 +0300 Raimo Järvi + + * gst/goom2k1/goom_core.c: + goom2k1: Fix compiler warnings on 64 bit mingw-w64 + Fixes bug #660294. + +2011-09-25 15:13:39 +0100 Tim-Philipp Müller + + * ext/soup/Makefile.am: + * ext/soup/gstsoup.c: + * ext/soup/gstsouphttpclientsink.c: + * ext/soup/gstsouphttpclientsink.h: + * ext/soup/gstsouphttpsink.c: + * ext/soup/gstsouphttpsink.h: + soup: rename souphttpsink to souphttpclientsink + To avoid confusion, and because we might want a server + sink at some point too. + https://bugzilla.gnome.org/show_bug.cgi?id=659947 + +2011-09-23 16:39:46 +0100 Tim-Philipp Müller + + * ext/soup/gstsouphttpsink.c: + * ext/soup/gstsouphttpsink.h: + souphttpsink: don't create unused second sink pad object + The base class will create the sink pad. + +2011-09-23 15:36:36 +0200 Julien Isorce + + * gst/audioparsers/gstac3parse.c: + ac3parse: correctly check for ac3/e-ac3 switch + https://bugzilla.gnome.org/show_bug.cgi?id=659943 + +2011-09-20 13:38:53 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + rtph264depay: improve downstream flow return feedback to upstream + ... although basertpdepay does not really make it easy/possible to do so + all the way. + +2011-09-20 12:11:47 +0100 Vincent Penquerc'h + + * sys/ximage/gstximagesrc.c: + * sys/ximage/gstximagesrc.h: + ximagesrc: add xid and xname properties to allow capturing a particular window + A particular window may be selected using the new xid (X-Window + XID, eg a pointer) and xname (window title) properties. If both + are specified, the XID is used in preference, falling back to + xname if not found. + Default (if none of xid and xname are specified, or if no such + window is found) is to capture the root window. + https://bugzilla.gnome.org/show_bug.cgi?id=546932 + +2011-08-02 17:39:44 +0100 Tim-Philipp Müller + + * tests/check/elements/qtmux.c: + tests: add unit test to make sure encodebin picks mp4mux for variant=iso + https://bugzilla.gnome.org/show_bug.cgi?id=651496 + +2011-09-19 12:15:11 +0200 Ha Nguyen + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Fix a leaked clock for each buffering message + Fixes bug #659237. + +2011-09-19 12:11:32 +0200 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + * gst/isomp4/qtdemux_fourcc.h: + qtdemux: parse embedded ID32 tags + +2011-09-02 13:41:41 +0200 Mark Nauwelaerts + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsource.c: + rtpsession: avoid source premature timing out + Use slightly adjusted sender interval to determine sender timeout rather than + our own sender side interval (which may have been forced small). + +2011-08-25 12:40:52 +0200 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: avoid timing out source too quickly + ... following a PAUSE/PLAY cycle, particularly applicable when operating + with a short RTCP interval (possibly forced so server-side). + +2011-08-24 14:37:52 +0200 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer/rtpbin: relax dropping rtcp packets + ... to at least having it trigger a/v synchronization, possibly without + using provided values which are still not considered sane + (as previously dropped). + +2011-08-24 14:34:23 +0200 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer: some more reset when clearing pt map + ... which in particular caters for some more reset following a possible + rtsp PLAY. + +2011-08-21 21:58:38 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: do not set elements to PLAYING when doing seek in PAUSED + +2011-09-01 14:47:48 +0200 Mark Nauwelaerts + + * gst/rtpmanager/rtpjitterbuffer.c: + rtpjitterbuffer: only reset skew on gap if input ts available + +2011-08-18 14:12:21 +0200 Mark Nauwelaerts + + * gst/rtpmanager/rtpjitterbuffer.c: + rtpjitterbuffer: check some more for possible rtp timestamp discontinuity + ... when operating in non slave mode, and reset if detected. + This should avoid some (large) bogus outgoing timestamp due to jumps + in rtp time, as result of PAUSE/PLAY or seek or ... + +2011-08-08 12:48:50 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: switch to rtp time based syncing when guessed appropriate + +2011-08-08 12:15:20 +0200 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + rtpbin: alternative inter-stream syncing methods + ... at least if not syncing to NPT time: + * either sync using RTCP SR data (as currently) + * only perform the above once using initial RTCP SR packets + * discard RTCP and sync by equating provided stream's clock-base rtptime, + as provided by jitterbuffer (typically obtained from RTP-Info in RTSP). + +2011-08-08 12:11:24 +0200 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer: also provide clock-base to sync signal + +2011-08-08 12:09:41 +0200 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + rtpbin: allow configurable rtcp stream syncing interval + ... rather than necessarily syncing at each RTCP SR. + +2011-08-01 08:35:01 +0200 Mark Nauwelaerts + + * gst/rtpmanager/rtpsession.c: + rtpsession: trigger reconsideration if rtcp interval set + +2011-08-01 08:32:24 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: configure rtcp interval if provided + ... in PLAY response. + +2011-09-16 16:53:22 +0300 Lasse Laukkanen + + * gst/isomp4/gstqtmux.c: + isomp4: Fix allowing zero duration tracks + https://bugzilla.gnome.org/show_bug.cgi?id=637486 + +2011-09-05 10:11:18 +0100 Vincent Penquerc'h + + * gst/udp/gstudpnetutils.c: + udpsrc: error out when no protocol is specified in the uri + It is certainly better than to crash. + https://bugzilla.gnome.org/show_bug.cgi?id=658178 + +2011-09-19 09:37:58 +0200 Vincent Penquerc'h + + * ext/speex/gstspeexenc.c: + speexenc: do not use invalid buffer timestamps + +2011-03-29 12:09:18 +0530 Arun Raghavan + + * ext/pulse/Makefile.am: + * ext/pulse/plugin.c: + * ext/pulse/pulseaudiosink.c: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + * ext/pulse/pulseutil.h: + pulse: New pulseaudiosink element to handle format changes + This introduces a new bin which wraps around pulsesink and depending on + the formats supported by the sink, plugs in/out a decodebin2 as + required. This allows users to switch sinks on the stream and adapts + accordingly (for example, you could watch a movie in passthrough mode on + your receiver which supports AC3 decode, then plug out and switch to a + non-digital profile to continue uninterrupted on analog output). + The bin is required because doing the same with playbin2/playsink will + require API changes that cannot be made in 0.10. With 0.11/1.0, we + should be able to ask for upstream caps renegotiation to deal with all + this. + https://bugzilla.gnome.org/show_bug.cgi?id=657179 + +2011-09-16 15:03:23 +0200 Branko Subasic + + * gst/matroska/ebml-read.c: + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-read-common.c: + matroskademux: Avoid sending EOS when in paused state + Changed the ebml reader's gst_ebml_peek_id_length() function so + that it returns the actual reason for why the peek failed, instead + of (almost) always returning GST_FLOW_UNEXPECTED. This prevents + the pulling task from sending EOS when doing a flushing seek. + +2011-09-15 15:53:47 +0100 Vincent Penquerc'h + + * gst/matroska/matroska-demux.c: + matroskademux: fix stuttering A/V + Someone got had by implicit promotion to unsigned in ops with + a signed and an unsigned value. + https://bugzilla.gnome.org/show_bug.cgi?id=659153 + +2011-09-14 16:37:12 +0100 Vincent Penquerc'h + + * gst/debugutils/gstnavseek.c: + navseek: toggle pause/play on space bar + A useful thing to have. + https://bugzilla.gnome.org/show_bug.cgi?id=659065 + +2011-09-14 14:46:00 +0200 David Svensson Fors + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: configurable timestamp gap handling + matroskademux performs segment tricks to skip gaps in streams, + notably at start for non 0 based files. There may however be + cases when full presentation (including intermediate gaps) is + desired, so a property allows to configure as of which gap + to act (or not at all). + API: GstMatroskaDemux::max-gap-time + Fixes #659009. + +2011-09-12 09:21:47 -0300 Thiago Santos + + * tests/check/elements/flvmux.c: + tests: flvmux: Fix flvmux's tests after fix for request pads handling + Now that flvmux doesn't release its request pads on PAUSED->READY the + test doesn't need to re-request them for every reuse test start. + +2011-09-09 09:12:56 -0300 Thiago Santos + + * gst/isomp4/gstqtmux.c: + qtmux: Fix ctts generation for streams that don't start at 0 timestamps + Subtract the first timestamp of a stream from all input buffers to + get 0-based timestamps for creating a sane ctts table. Without this + patch the ctts could have larger values than needed, causing the + playback to have a delay at startup. + As the first timestamp is only found after a few buffers are queued + (due to possible reordered buffers), once we find the first timestamp + we subtract it from all buffers on the queue, from that point on, + all buffers have their timestamps subtract when they are collected. + https://bugzilla.gnome.org/show_bug.cgi?id=658659 + +2011-09-12 07:55:19 +0200 Alessandro Decina + + * gst/flv/gstflvmux.c: + flvmux: don't release request pads going PAUSED->READY + Don't release request pads but just reset them. This makes pipelines using + flvmux reusable. + +2011-09-09 12:35:50 +0100 Vincent Penquerc'h + + * gst/audioparsers/gstac3parse.c: + ac3parse: use bsid 9 and 10 to control sample rate + See http://matroska.org/technical/specs/codecid/index.html + The spec is silent about this though... + https://bugzilla.gnome.org/show_bug.cgi?id=658546 + +2011-09-07 14:13:03 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: ensure some initial state variable setup + ... which might otherwise be skipped if the PLAY command is issued before + the OPEN command had a chance to actually be acted upon. + Fixes #657376. + +2011-09-08 15:02:05 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: tweak gap handling + ... so as to avoid buffers before and after gap to have identical running time. + +2011-09-08 13:28:24 +0200 Guillaume Desmottes + + * sys/v4l2/gstv4l2object.c: + v4l2: use GST_RESOURCE_ERROR_BUSY if v4l2_ioctl fails with EBUSY + https://bugzilla.gnome.org/show_bug.cgi?id=658543 + +2011-09-07 08:54:17 -0300 Thiago Santos + + * gst/isomp4/gstqtmux.c: + qtmux: remove one G_UNLIKELY for user property + Using G_UNLIKELY on user properties isn't nice, specially when + that is the default option. + +2011-03-15 11:03:53 +0100 Andoni Morales Alastruey + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: handle GstForceKeyUnit event + ... by starting a new cluster after forwarding event. + Fixes #644154. + +2011-09-07 14:27:36 +0200 Sebastian Dröge + + * tests/check/elements/cmmldec.c: + * tests/check/elements/cmmlenc.c: + cmml: Use complete cmml caps in the unit test + +2011-09-07 14:26:01 +0200 Sebastian Dröge + + * tests/check/elements/qtmux.c: + qtmux: Use complete MPEG caps in the unit test + +2011-09-07 14:18:58 +0200 Stefan Sauer + + * docs/plugins/Makefile.am: + docs: cleanup makefiles + Remove commented out parts that we don't need. Remove "the wingo addition" - no + so useful after all. Narrow down file-globs for plugin docs. + +2011-08-29 14:12:22 +0200 Konstantin Miller + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Don't handle HTTP response 407 as error if proxy authentication data is available + Fixes bug #657422. + +2011-09-07 12:11:39 +0200 Sebastian Dröge + + * gst/audioparsers/gstac3parse.c: + ac3parse: Add Converter to the classification because it can convert between different alignments + This allows decodebin2 to let it negotiate properly. + +2011-09-07 12:10:48 +0200 Sebastian Dröge + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstmpegaudioparse.c: + audioparsers: Improve src template caps + Remove the parsed/framed fields and add all fields to the template + caps that always exist. + +2011-09-06 15:59:49 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstaacparse.h: + aacparse: parse codec_data to determine number of samples per frame + Fixes #656734. + +2011-09-06 21:24:46 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From a39eb83 to 11f0cd5 + +2011-09-06 15:40:32 +0200 Stefan Sauer + + * common: + Automatic update of common submodule + From 605cd9a to a39eb83 + +2011-09-06 15:05:37 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: make default duration check less sensitive + Frame duration might vary for 1 usecond, in this case matroskamux + decides to create BLOCKGROUP instead of SIMPLEBLOCK. + Convert duration to timecodescale which is (typically) less precise, and + then also allow the difference of 1/-1 to arrange for less sensitive check. + Based on patch by Alexey Fisher + Fixes #653080. + +2011-09-06 13:18:40 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmp4gdepay.c: + rtpmp4gdepay: improve bogus interleaved index compensating + Patch by + Fixes #654585. + +2011-09-06 10:33:21 +0200 Sebastian Dröge + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Allow positive, non-1.0 segment rates + Only negative rates are not supported. Fixes bug #658305. + +2011-09-05 15:50:56 +0200 Mark Nauwelaerts + + * tests/check/elements/parser.c: + tests: parsers: provide more real data when testing draining of garbage + +2011-09-05 15:50:04 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstamrparse.c: + amrparse: fix and streamline valid frame checking + ... to handle various combinations of sync or not, and sufficient data + or not as might be expected. + Fixes #650714. + +2011-09-05 14:49:32 +0200 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: fragmented support; avoid adjustment for keyframe seek + ... since all index data may not yet be available at that time. + +2011-09-05 14:48:02 +0200 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: fragmented support; mark all audio track samples as keyframe + +2011-09-05 14:46:29 +0200 Brian Li + + * gst/isomp4/qtdemux.c: + qtdemux: fragmented support; properly init return variable value + Fixes #655918. + +2011-09-05 13:31:20 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: add gtk-doc for new short-header property + +2011-09-05 13:18:39 +0200 Marc Leeman + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: allow sending short RTSP requests to a server + Some encoders (Arecont) do not like the long OPTIONS sent at startup as sent by + GStreamer, but do accept the short header as sent by Live555. + This patch makes the extending the request optional by adding a property + (short-header). + Fixes #655805. + API: GstRTSPSrc:short-header + +2009-03-04 14:51:09 -0500 Olivier Crête + + * gst/rtp/gstrtph263ppay.c: + rtph263ppay: Set H263-2000 if thats what the other side wants + The static caps states this element supports H263-2000, but setcaps never + sets it, so it was lie. + See https://bugzilla.gnome.org/show_bug.cgi?id=577784 + +2011-08-30 19:02:51 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Initialise the last_keyframe_request variable + +2011-08-31 16:04:24 +0200 Peter Korsgaard + + * gst/udp/gstmultiudpsink.c: + multiudpsink: make add/remove/clear/get-stats action signals + http://bugzilla.gnome.org/show_bug.cgi?id=657830 + Signed-off-by: Peter Korsgaard + +2011-08-30 13:33:49 +0200 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + * gst/isomp4/qtdemux.h: + qtdemux: push mode; perform some extra checks prior to upstream seeking + +2011-08-30 13:28:21 +0200 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: push mode; fix buffered streaming + That is, in case where no seek is peformed to moov, but preceding + limited mdat is buffered. + +2011-08-29 15:13:56 +0200 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: avoid overflow wraparound in timestamp when adding durations + Do some type juggling to avoid overflow, while still allowing for 'negative' + durations (which would need a wraparound effect). + +2011-08-25 23:37:47 +0100 Vincent Penquerc'h + + * sys/v4l2/v4l2src_calls.c: + v4l2src: make this work more than once in a row + We used to skip frame rate setup if the camera was already setup + with the requested frame rate. This breaks some cameras though, + causing them to not output data (several models of Thinkpad cameras + have this problem at least). + So, don't skip. + https://bugzilla.gnome.org/show_bug.cgi?id=638300 + +2011-08-23 12:12:15 +0100 Vincent Penquerc'h + + * gst/audioparsers/gstaacparse.c: + aacparse: only require two frames in a row when we do not have sync + This avoids a single bit error dropping two frames unnecessarily. + The two consecutive frames check is still required when we don't + have sync. + https://bugzilla.gnome.org/show_bug.cgi?id=657080 + +2011-08-23 21:41:15 +0530 Arun Raghavan + + * ext/pulse/pulsesink.c: + pulsesink: Trivial indentation fix + +2011-07-21 17:23:28 -0400 Monty Montgomery + + * ext/flac/gstflacdec.c: + flacdec: Correct sample number rounding resulting in timestamp jitter + flacdec converts the src timestamp to a sample number, uses that internally, then reconverts the sample number to a timestamp for the output buffer. Unfortunately, sample numbers can't be represented in an integer number of nanoseconds, and the conversion process was truncating rather than rounding, resulting in sample numbers and output timestamps that were often off by a full sample. + This corrects the time->sample convesion + +2011-08-20 14:48:20 -0700 David Schleef + + * gst/debugutils/breakmydata.c: + breakmydata: element is not passthrough + +2011-07-13 11:20:34 -0700 David Schleef + + * gst/multifile/gstmultifilesrc.c: + multifilesrc: quiet debugging + +2011-07-10 21:40:20 -0700 David Schleef + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/greedy.c: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: change field handling through methods + This likely breaks stuff. The good: all of the methods now create + field images aligned with input frames, without timestamp mangling. + The bad: this touches a lot of code, much of which is hairy and in + need of cleanup. However, at this point we can reasonably create a + PSNR-based test. + +2011-08-21 14:41:14 +0200 Alessandro Decina + + * gst/multifile/gstmultifilesink.c: + multifilesink: reset ->streamheaders to NULL on _stop + Fixes invalid memory access reusing multifilesink + +2011-08-18 13:37:39 +0200 David Henningsson + + * ext/pulse/pulsesink.c: + pulsesink: Allow writes in bigger chunks + There's no use in splitting the incoming data down to the segsize + limit - by writing as much as possible in one chunk, we increase + performance and avoid PulseAudio unnecessary rewinds. + Signed-off-by: David Henningsson + +2011-08-08 22:14:28 +0100 Vincent Penquerc'h + + * gst/matroska/matroska-demux.c: + matroskademux: ensure no-more-pads is always emitted + In particular, do so even if failing to read while prerolling, + such as when reading from a partial file (eg, while it is being + downloaded). + This fixes a wedge in playbin2. + https://bugzilla.gnome.org/show_bug.cgi?id=651965 + +2011-08-16 17:27:13 +0100 Vincent Penquerc'h + + * ext/flac/gstflacdec.c: + flacdec: avoid timestamp/offset tracking going out of sync + The libFLAC API is callback based, and we must only call it to + output data when we know we have enough input data. For this + reason, a single processing step is done when receiving a buffer. + However, if there were metadata buffers still pending, a step + intended for the first audio frame might end up writing that + leftover metadata. Since a single step is done per buffer, this + will cause every buffer to be written one step late. + This would add some latency (a bufferfull's worth), possibly + lose a buffer when seeking or the like, and also cause timestamp + and offset to be applied to the wrong buffer, as updates to + the "current" segment last_stop (from incoming buffer timestamp) + will be applied to an output buffer originating from the previous + incoming buffer. + This fixes the issue by ensuring that, upon receiving the first + audio frame, processing is done till all metadata is processed, + so the next "single step" done will be for the audio frame. After + this, we should keep to 1 input buffer -> 1 output buffer and so + avoid getting out of sync. + https://bugzilla.gnome.org/show_bug.cgi?id=650960 + +2011-08-16 15:32:07 +0100 Vincent Penquerc'h + + * ext/flac/gstflacdec.c: + flacdec: bail on reserved value + Now that we look at the right bits, we can test against the reserved + value as we do for other fields. + https://bugzilla.gnome.org/show_bug.cgi?id=650960 + +2011-08-16 15:27:43 +0100 Vincent Penquerc'h + + * ext/flac/gstflacdec.c: + flacdec: fix bit twiddling + Right shifting a 8 bit value by 8 bits is twice too much + to get the high 4 bits. + https://bugzilla.gnome.org/show_bug.cgi?id=650960 + +2011-08-16 15:22:46 +0100 Vincent Penquerc'h + + * ext/flac/gstflacdec.c: + flacdec: warn if we see a variable block size where unsupported + https://bugzilla.gnome.org/show_bug.cgi?id=650960 + +2011-08-16 18:25:29 +0100 Vincent Penquerc'h + + * gst/spectrum/gstspectrum.c: + spectrum: avoid crashing by resetting the correct number of channels + https://bugzilla.gnome.org/show_bug.cgi?id=656606 + +2011-08-16 13:16:22 +0100 Vincent Penquerc'h + + * gst/audioparsers/gstflacparse.c: + flacparse: fix off by one in frame size check + Yes, I was tracking another bug and the small test file I generated + to test with improbably just happened to trigger this, with a second + and last frame of 1615 bytes. + https://bugzilla.gnome.org/show_bug.cgi?id=656649 + +2011-08-14 20:46:01 +0100 Tim-Philipp Müller + + * gst/id3demux/id3v2.3.0.html: + * gst/id3demux/id3v2.4.0-frames.txt: + * gst/id3demux/id3v2.4.0-structure.txt: + id3demux: remove specs from git as well now that parsing code is in -base + +2011-07-14 15:42:36 +0200 Mark Nauwelaerts + + * configure.ac: + * gst/id3demux/Makefile.am: + * gst/id3demux/gstid3demux.c: + * gst/id3demux/id3tags.c: + * gst/id3demux/id3tags.h: + * gst/id3demux/id3v2frames.c: + id3demux: use -base provided id3 tag parsing + https://bugzilla.gnome.org/show_bug.cgi?id=654388 + +2011-08-13 16:51:22 +0100 Tim-Philipp Müller + + * ext/jack/gstjackaudiosrc.c: + jackaudiosrc: fix error message code + And also post 'not found' error if jackd is not even installed. + +2011-08-12 16:32:58 +0200 Stefan Kost + + * gst/isomp4/qtdemux.c: + qtdemux: initialize bitrate variable and reset for each loop + Don't check eventually unset variable and don't accidentially use values from last + cycle. + +2011-08-09 11:28:17 +0200 Edward Hervey + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Properly error out if SDP contains no streams + Also fixes unitialized variable error on macosx. + +2011-08-09 09:05:31 +0100 Vincent Penquerc'h + + * sys/ximage/gstximagesrc.c: + ximagesrc: clear flags on buffer reuse + This will ensure a logically new buffer does not keep flags from + a previous use of that buffer (eg, DISCONT would be set on the first + buffer, and mistakenly kept when reused). + https://bugzilla.gnome.org/show_bug.cgi?id=653709 + +2011-08-08 10:54:26 +0100 Vincent Penquerc'h + + * sys/v4l2/gstv4l2object.c: + v4l2: take care not to change the current format where appropriate + Some drivers are buggy are will change the current format when + processing VIDIOC_TRY_FMT. Save and restore the current format + to ensure the format is kept unchanged. + https://bugzilla.gnome.org/show_bug.cgi?id=649067 + +2011-08-07 12:23:26 +0200 Sjoerd Simons + + * sys/v4l2/v4l2src_calls.c: + v4l2src: Use fraction compare util function. + Use the fraction compare utility to compare function, not the + handcrafted one. The handcrafted one is buggy as it doesn't take into + account rounding error. For example comparing a framerate of 20/1 on a + camera configured as 30/1 fps would yield true: 1 == (1 * 20)/30 and not + re-configure the camera. Fixes #656104 + +2011-08-03 22:50:05 +1000 Jan Schmidt + + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + * gst/matroska/matroska.c: + matroska: Register new debug category + Register the matroskareadcommon debug category when the + plugin is loaded to avoid assertion output when debug is turned on. + +2011-07-29 13:03:55 +0200 Philippe Normand + + * gst/isomp4/qtdemux.c: + qtdemux: soften assertion check on stream size + https://bugzilla.gnome.org/show_bug.cgi?id=655570 + +2011-08-03 10:09:42 +0200 Robert Krakora + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: Add support for H.264 payload in MJPEG container + See http://www.quickcamteam.net/uvc-h264/USB_Video_Payload_H.264_0.87.pdf + Fixes bug #655530. + +2011-08-02 22:05:08 -0400 Tristan Matthews + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosink.h: + jackaudiosink: Don't call g_alloca() in process_cb + g_alloca() is not RT-safe, so instead we should allocate the + memory needed in advance. Fixes #655866 + +2011-08-02 23:42:58 +0100 Tim-Philipp Müller + + * gst/multipart/multipartdemux.c: + * sys/v4l2/gstv4l2object.c: + docs: fix two more Since: tags + +2011-07-31 04:19:00 +0300 Mart Raudsepp + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Fix Since tags for fieldanalysis related new properties + commit c1b100cf9c is after 0.10.29 and 0.10.30 was a branched release. + So fix Since tags from 0.10.29 to 0.10.31 for the new properties. + +2011-07-29 13:05:42 +0100 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + pulsesink: fix variable-set-but-not-used compiler warning with older pulse versions + +2011-07-29 12:07:24 +0200 Mark Nauwelaerts + + * gst/rtpmanager/rtpsession.c: + rtpsession: properly init rtcp_min_interval + +2011-03-09 11:04:36 +0530 Arun Raghavan + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + * ext/pulse/pulseutil.c: + pulsesink: Add support for compressed formats + This adds support for various compressed formats (AC3, E-AC3, DTS and + MP3) payloaded in IEC 61937 format (used for transmission over S/PDIF, + HDMI and Bluetooth). + The acceptcaps() function allows bins to probe for what formats the sink + being connected to support. This only works after the element is set to + at least READY. + If the underlying sink changes and the format we are streaming is not + available, we emit a message that will allow upstream elements/bins to + block and renegotiate a new format. + +2011-03-01 15:34:46 +0530 Arun Raghavan + + * configure.ac: + * ext/pulse/pulsesink.c: + * ext/pulse/pulseutil.c: + * ext/pulse/pulseutil.h: + pulsesink: Use the extended stream API if available + This uses the new extended API for creating streams. This will allow us + to support compressed formats natively in pulsesink as well. + +2011-07-29 00:07:52 +0530 Arun Raghavan + + * ext/pulse/pulsesrc.c: + * ext/pulse/pulsesrc.h: + pulsesrc: Add a source-output-index property + This exposes the source output index of the record stream that we open + so that clients can use this with the introspection if they want (to + move the stream, for example). + +2011-07-28 14:44:57 +0200 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: keep a ref on the src pad while using it + Prevent a possible race if clear_ssrc() is called between getting the pad and + doing the push. + Based on patch by + https://bugzilla.gnome.org/show_bug.cgi?id=650916 + +2011-05-24 11:29:57 +0300 Olivier Crête + + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtpmanager/gstrtpssrcdemux.h: + rtpssrcdemux: Make the pads lock recursive and hold it across the signal emit + We need to keep the lock held because we don't want a push before the "new-ssrc-pad" + handler has completed. But we may want to push an event from inside that handler, hence + the recursive mutex. + https://bugzilla.gnome.org/show_bug.cgi?id=650916 + +2011-05-24 11:17:25 +0300 Olivier Crête + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: Use PADs lock + https://bugzilla.gnome.org/show_bug.cgi?id=650916 + +2011-07-27 18:15:20 +0100 Sjoerd Simons + + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264depay.h: + rtph264depay: Cope with FU-A E bit not being set + Some h264 payloaders are unfortunately buggy and don't correctly set the + E bit in FU-A NAL when they have ended. Work around this by assuming + such a fragmentation unit has ended when there was no packet loss and a + new NAL is started + +2011-04-12 17:01:47 +0530 Arun Raghavan + + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstac3parse.h: + ac3parse: Support switching alignment on-the-fly + This allows switching of alignment for E-AC3 streams at run-time. This + is requested by downstream elements via a custom event. + https://bugzilla.gnome.org/show_bug.cgi?id=650313 + +2011-04-09 12:26:56 +0530 Arun Raghavan + + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstac3parse.h: + * tests/check/elements/ac3parse.c: + ac3parse: Add support for IEC 61937 alignment + When pushing out buffers over S/PDIF or HDMI, IEC 61937 payloading + requires each buffer to contain 6 blocks from each substream. This adds + code to collect all the frames needed to meet this requirement before + pushing out a buffer. + https://bugzilla.gnome.org/show_bug.cgi?id=650313 + +2011-06-08 15:57:37 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Always send application requested feedback in immediate mode + Send as many application requested feedback messages in immediate mode, even if they + have already been sent. + https://bugzilla.gnome.org/show_bug.cgi?id=654583 + +2011-06-08 14:48:01 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Don't let the computed RTP bandwidth fall too low + If it falls too low, the computed RTCP bandwidth will be near zero and + the RTCP thread will be stopped. + https://bugzilla.gnome.org/show_bug.cgi?id=654583 + +2011-04-25 16:13:38 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Wait longer to timeout SSRC collision + Using the current RTCP interval to timeout SSRC collision can lead to + collisions being timed out immediately if a BYE packet is sent because + it is sent immediately, so the interval is 0. This is not what we + want. So just set a static 10 times the default RTCP interval, it + should be enough + https://bugzilla.gnome.org/show_bug.cgi?id=648642 + +2011-07-19 13:38:01 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: set SOURCE flag at init time + Fixes #654816. + +2011-07-18 16:46:27 -0400 Olivier Crête + + * gst/rtp/gstrtph264depay.c: + rtph264depay: Complete merged AU on marker bit + The marker bit on a RTP packet means the AU has been completed, so push it out + immediately to reduce the latency. + https://bugzilla.gnome.org/show_bug.cgi?id=654850 + +2011-07-18 20:27:38 -0400 Olivier Crête + + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + rtph264pay: Only set the marker bit on the last NALU of a multi-NALU access unit + An access unit could contain multiple NAL units, in that case, only the last + RTP packet of the last NALU should have its marker bit set. + https://bugzilla.gnome.org/show_bug.cgi?id=654850 + +2011-07-20 08:52:58 +0200 Alessandro Decina + + * gst/multipart/multipartmux.c: + multipart: fix compiler warning + +2011-07-19 12:05:51 +0200 Mark Nauwelaerts + + * gst/auparse/gstauparse.c: + auparse: avoid hanging on invalid short input + ... as in such case there is no srcpad yet on which to forward EOS. + +2011-07-18 15:13:33 -0300 Thiago Santos + + * ext/pulse/pulsesrc.c: + pulsesrc: Fix default value leaking + Remember to free the default value of client name, avoiding a + leak + +2011-07-18 14:24:48 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + rtph264depay: reset upon FLUSH_STOP + ... which is particularly needed when merging NAL units, where not resetting + would lead to output of an older (pre-flush) AU (with unintended timestamp). + +2011-07-18 14:30:51 +0200 Mark Nauwelaerts + + * gst/multifile/gstmultifilesink.c: + multifilesink: do not use g_slist_free_full + ... as that is only in GLib 2.28, which is not yet required at this time. + +2011-07-18 09:38:26 +0200 Alessandro Decina + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + * tests/check/elements/multifile.c: + multifilesink: add max-files property + Add max-files property to limit the number of files saved on disk. + API: multifilesink::max-files + +2011-07-17 23:36:55 +0200 Alessandro Decina + + * gst/multifile/gstmultifilesink.c: + multifilesink: refactor file opening and closing code + +2011-07-16 19:38:51 +0200 Alexey Fisher + + * gst/matroska/matroska-demux.c: + matroskademux: fix pixel-aspect-ratio if header has only one display variable + Current matroska demux calculates the pixel aspect ratio only if both + DisplayHeight and DisplayWidth are set, but it is legal to use only + one variable if the other is equal to PixelWidth or PixelHeight, at + least the mkclean utility is doing that. So this makse mkcleaned + files play correctly. + https://bugzilla.gnome.org/show_bug.cgi?id=654744 + +2011-07-16 23:47:50 +0100 Antoine Jacoutot + + * gst/goom/plugin_info.c: + goom: fix build on PPC on openbsd + A missing sys/param.h include results in: + /usr/include/sys/proc.h:64: error: 'MAXLOGNAME' undeclared here (not in a + function) + /usr/include/sys/proc.h:285: error: 'MAXCOMLEN' undeclared here (not in a + function) + when compiling goom on openbsd/ppc. We can just remove the two sys/ includes + here, they are not needed for anything. + https://bugzilla.gnome.org/show_bug.cgi?id=654749 + +2011-07-14 20:10:02 -0400 Olivier Crête + + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + rtppcmApay/depay: Static clock rates on static payloads, dynamic on dynamic + Partially reverts 397dc60b + +2011-03-04 15:41:22 -0500 Olivier Crête + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtph264pay.c: + rtph264pay: Implement getcaps + Convert profile-level-id from RTP caps into video/x-h264 style caps (with profile and level) + +2011-07-12 15:04:38 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix seeking regression + ... introduced when shuffling around code for the async implementation + by setting state of source (and udp sources) in _play before downstream + flushing is undone. + +2011-07-11 15:23:41 +0300 René Stadler + + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstac3parse.h: + ac3parse: fix buffer duration on blocks-per-frame change + The gst_base_parse_set_frame_rate call was predicated on a change to + sample rate, duration or profile. However, the block count per frame can + also change between packets, which would result in incorrect buffer + durations. + +2011-07-09 19:23:41 -0700 David Schleef + + * gst/multifile/gstmultifilesrc.c: + * gst/multifile/gstmultifilesrc.h: + multifilesrc: Improve looping + Add start-index and stop-index properties. + +2011-06-16 13:57:03 +0100 Jonny Lamb + + * gst/multifile/gstmultifilesrc.c: + * gst/multifile/gstmultifilesrc.h: + multifile: add loop property to multifilesrc + Fixes: #652727 + Signed-off-by: Jonny Lamb + Signed-off-by: David Schleef + +2009-11-20 10:07:43 +0100 Philip Jägenstedt + + * sys/directsound/gstdirectsoundsink.c: + directsoundsink: 16-bit audio is signed, 8-bit is unsigned. + Pretending to handle 8-bit signed causes distorted audio when + actually given such audio, which you will get if passing 8-bit + unsigned through audioconvert ! audioresample, as audioresample + only handles 8-bit signed. Fixes #605834. + Signed-off-by: David Schleef + +2011-07-07 18:27:36 +0200 Alexey Fisher + + * gst/matroska/matroska-demux.c: + matroskademux: handle blocks with duration=0 + Some video frames, for example alt-ref frame in VP8, will be + never displayed. This is why it has duration=0. + This patch allow to use this duration. + Bug: 654175 + Signed-off-by: Alexey Fisher + +2011-07-06 17:18:05 -0700 David Schleef + + * gst/isomp4/gstqtmux.c: + * gst/isomp4/gstqtmuxmap.c: + qtmux: Add direct dirac mapping + +2011-06-29 20:59:26 +0300 René Stadler + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: prevent race condition causing ref leak + Since commit 8bfd80, gst_pulseringbuffer_stop doesn't wait for the + deferred call to be run before returning. This causes a race when + READY->NULL is executed shortly after, which stops the mainloop. This + leaks the element reference which is passed as userdata for the callback + (introduced in commit 7cf996, bug #614765). + The correct fix is to wait in READY->NULL for all outstanding calls to + be fired (since libpulse doesn't provide a DestroyNotify for the + userdata). We get rid of the reference passing from 7cf996 altogether, + since finalization from the callback would anyways lead to a deadlock. + Re-fixes bug #614765. + +2011-07-04 08:58:14 +0300 René Stadler + + * ext/pulse/pulsesink.c: + pulsesink: small cleanup of copy-paste code + +2011-06-29 19:50:42 +0300 René Stadler + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: remove unused member variable and misleading log message + Wim changed it in commit 8bfd80 so that pa_defer_ran is not read + anywhere. + The log message used to annotate a mainloop_wait call which is gone. + +2011-07-04 12:58:38 -0700 David Schleef + + * gst/goom/gstgoom.c: + goom: Don't answer lantency queries before negotiation + +2011-07-04 14:30:09 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: avoid crashing on invalid input without components + +2011-07-04 11:25:28 +0200 Mark Nauwelaerts + + * gst/flv/gstflvmux.c: + flvmux: pass along segment info to collectpads + ... so it can track this and be subsequently used to determine running time etc. + +2011-07-04 11:24:23 +0200 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + flvdemux: indicate raw format in aac caps + +2011-07-03 19:51:32 -0700 David Schleef + + * ext/pulse/plugin.c: + pulse: Increase ranks to PRIMARY + 10 + So that pulsesrc/pulsesink get chosen over other possible PRIMARY + src/sinks by autoaudiosink. Presumably, if pulse is available, it + is always preferred over another src/sink. + Fixes: #647540. + +2011-06-30 18:47:48 -0700 David Schleef + + * gst/multipart/multipartmux.c: + multipartmux: Add \r\n to tail of pushed buffers + Clients such as Firefox require the \r\n after the payload. + +2011-06-16 14:52:51 +0200 Branko Subasic + + * gst/matroska/ebml-read.c: + * gst/matroska/matroska-demux.c: + matroskademux: avoid looping when searching for clusters + Fixes some bugs that results in the demuxer looping when seaching + for clusters in non-finalized files. + https://bugzilla.gnome.org/show_bug.cgi?id=652195 + +2011-06-10 18:54:48 +0530 Debarshi Ray + + * gst/matroska/matroska-parse.c: + matroskaparse: fix reference counting of parse->streamheader + https://bugzilla.gnome.org/show_bug.cgi?id=652286 + Signed-off-by: David Schleef + +2011-06-29 14:39:52 -0700 David Schleef + + * ext/jpeg/gstjpegenc.c: + jpegenc: Don't round up size of encoded buffers + For some reason, in code dating to 2001, encoded jpeg buffers were + rounded up to multiples of 4 bytes. With the added bonus that the + extra bytes are unwritten, causing valgrind issues. Oops. I can't + think of any reason why JPEG buffers need to be multiples of 4 bytes, + so I removed the padding. There might be some code somewhere that + depends on this behavior, so if this needs to be reverted, please fix + the valgrind issues. + +2011-06-29 12:05:04 +0200 Mark Nauwelaerts + + * gst/isomp4/gstqtmux.c: + qtmux: free date tag + +2011-06-28 12:26:37 +0200 Jonas Larsson + + * gst/audioparsers/gstaacparse.c: + aacparse: not so greedy minimum frame size + Fixes #653559. + +2011-06-25 11:39:23 -0700 David Schleef + + * configure.ac: + configure: remove non-pkg-config check for shout + Fixes: 653327 + +2011-06-20 18:49:57 +0200 Andoni Morales Alastruey + + * ext/raw1394/gst1394clock.c: + dv1394src: make the internal clock thread safe + Fixes: #653091. + +2011-06-24 11:54:29 +0200 Miguel Angel Cabrera Moya + + * gst/rtpmanager/rtpjitterbuffer.c: + rtpjitterbuffer: return correct type when assertion fails + +2011-06-23 11:28:27 -0700 David Schleef + + * common: + Automatic update of common submodule + From 69b981f to 605cd9a + +2011-02-02 16:18:54 +0530 Arun Raghavan + + * configure.ac: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + * ext/pulse/pulseutil.c: + * ext/pulse/pulseutil.h: + pulse: Drop support for PA versions before 0.9.16 + This drops support fof PulseAudio versions prior to 0.9.16, which was + released about 1.5 years ago. Testing with very old versions is not + feasible and we don't want to maintain 2 independent code-paths. + +2011-06-21 15:15:06 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmp4adepay.c: + rtpmp4adepay: fix output buffer timestamps in case of multiple frames + +2011-06-20 16:47:36 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: The signal has 5 arguments, not 4 + +2011-06-18 13:43:02 +0100 Tim-Philipp Müller + + Bump git version after unplanned 0.10.30 release + Merge branch '0.10.30' + Conflicts: + configure.ac + docs/plugins/inspect/plugin-1394.xml + docs/plugins/inspect/plugin-aasink.xml + docs/plugins/inspect/plugin-alaw.xml + docs/plugins/inspect/plugin-alpha.xml + docs/plugins/inspect/plugin-alphacolor.xml + docs/plugins/inspect/plugin-annodex.xml + docs/plugins/inspect/plugin-apetag.xml + docs/plugins/inspect/plugin-audiofx.xml + docs/plugins/inspect/plugin-audioparsers.xml + docs/plugins/inspect/plugin-auparse.xml + docs/plugins/inspect/plugin-autodetect.xml + docs/plugins/inspect/plugin-avi.xml + docs/plugins/inspect/plugin-cacasink.xml + docs/plugins/inspect/plugin-cairo.xml + docs/plugins/inspect/plugin-cutter.xml + docs/plugins/inspect/plugin-debug.xml + docs/plugins/inspect/plugin-deinterlace.xml + docs/plugins/inspect/plugin-dv.xml + docs/plugins/inspect/plugin-efence.xml + docs/plugins/inspect/plugin-effectv.xml + docs/plugins/inspect/plugin-equalizer.xml + docs/plugins/inspect/plugin-esdsink.xml + docs/plugins/inspect/plugin-flac.xml + docs/plugins/inspect/plugin-flv.xml + docs/plugins/inspect/plugin-flxdec.xml + docs/plugins/inspect/plugin-gconfelements.xml + docs/plugins/inspect/plugin-gdkpixbuf.xml + docs/plugins/inspect/plugin-goom.xml + docs/plugins/inspect/plugin-goom2k1.xml + docs/plugins/inspect/plugin-gstrtpmanager.xml + docs/plugins/inspect/plugin-halelements.xml + docs/plugins/inspect/plugin-icydemux.xml + docs/plugins/inspect/plugin-id3demux.xml + docs/plugins/inspect/plugin-imagefreeze.xml + docs/plugins/inspect/plugin-interleave.xml + docs/plugins/inspect/plugin-isomp4.xml + docs/plugins/inspect/plugin-jack.xml + docs/plugins/inspect/plugin-jpeg.xml + docs/plugins/inspect/plugin-level.xml + docs/plugins/inspect/plugin-matroska.xml + docs/plugins/inspect/plugin-mulaw.xml + docs/plugins/inspect/plugin-multifile.xml + docs/plugins/inspect/plugin-multipart.xml + docs/plugins/inspect/plugin-navigationtest.xml + docs/plugins/inspect/plugin-oss4.xml + docs/plugins/inspect/plugin-ossaudio.xml + docs/plugins/inspect/plugin-png.xml + docs/plugins/inspect/plugin-pulseaudio.xml + docs/plugins/inspect/plugin-replaygain.xml + docs/plugins/inspect/plugin-rtp.xml + docs/plugins/inspect/plugin-rtsp.xml + docs/plugins/inspect/plugin-shapewipe.xml + docs/plugins/inspect/plugin-shout2send.xml + docs/plugins/inspect/plugin-smpte.xml + docs/plugins/inspect/plugin-soup.xml + docs/plugins/inspect/plugin-spectrum.xml + docs/plugins/inspect/plugin-speex.xml + docs/plugins/inspect/plugin-taglib.xml + docs/plugins/inspect/plugin-udp.xml + docs/plugins/inspect/plugin-video4linux2.xml + docs/plugins/inspect/plugin-videobox.xml + docs/plugins/inspect/plugin-videocrop.xml + docs/plugins/inspect/plugin-videofilter.xml + docs/plugins/inspect/plugin-videomixer.xml + docs/plugins/inspect/plugin-wavenc.xml + docs/plugins/inspect/plugin-wavpack.xml + docs/plugins/inspect/plugin-wavparse.xml + docs/plugins/inspect/plugin-ximagesrc.xml + docs/plugins/inspect/plugin-y4menc.xml + win32/common/config.h + +2011-06-17 10:37:33 +0100 Tim-Philipp Müller + + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosink.h: + sunaudio: fix typo in comment + +2011-06-17 03:07:09 +0300 Stefan Kost + + * gst/audiofx/audioecho.c: + audioecho: fix param flags + If the parameter cannot be changed in paused&playing, it is not controlable. Set + the appropriate mutability flag instead. + +=== release 0.10.30 === + +2011-06-15 23:57:34 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-audioparsers.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-isomp4.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.30 + This is an ad-hoc release that is almost identical to 0.10.29: + * work around GLib atomic ops API change + * better handling of malformed buffers in RTP depayloders + * some minor compilation fixes + +2011-06-08 18:33:10 +0300 Raimo Järvi + + * gst/udp/gstudpnetutils.h: + udp: Fix compiler warning on mingw-w64 + Fixes: #652144. + gstudpnetutils.h:32:0: error: "WINVER" redefined + /usr/i686-w64-mingw32/sys-root/mingw/include/_mingw.h:231:0: note: this is the + location of the previous definition + +2011-06-04 13:49:52 -0700 David Schleef + + * gst/interleave/interleave.c: + interleave: Work around changes in g_atomic API + See #651514 for details. + +2011-05-18 12:36:40 +0200 Jose Antonio Santos Cadenas + + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpbvdepay.c: + * gst/rtp/gstrtpg722depay.c: + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtpspeexdepay.c: + rtp: Fix segmentation fault processing payload buffers + This commit checks if the value returned by + gst_rtp_buffer_get_payload_buffer and + gst_rtp_buffer_get_payload_subbuffer is NULL before using it. + +2011-05-16 09:04:31 +0200 Pino Toscano + + * ext/pulse/pulseutil.c: + pulse: Define PATH_MAX if it isn't defined + GNU Hurd for example doesn't define it. + +2011-04-29 08:55:19 +0200 Sebastian Dröge + + * gst/wavenc/gstwavenc.c: + wavenc: Allow setcaps to be called after a format was negotiated if it's compatible + Otherwise wavenc will fail if upstream decides to set equivalent caps or caps + with additional information later. + Thanks to Alexander Schremmer for finding this bug. + +2011-06-09 21:06:28 +0300 Stefan Kost + + * gst/matroska/matroska-read-common.c: + matroska: add missing stdio include for sscanf + +2011-06-13 17:05:19 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstmpegaudioparse.c: + audioparsers: not so greedy minimum frame size + ... which will be determined by parsing anyway, and avoids introducing + redundant additional latency. + +2011-06-08 18:33:10 +0300 Raimo Järvi + + * gst/udp/gstudpnetutils.h: + udp: Fix compiler warning on mingw-w64 + Fixes: #652144. + gstudpnetutils.h:32:0: error: "WINVER" redefined + /usr/i686-w64-mingw32/sys-root/mingw/include/_mingw.h:231:0: note: this is the + location of the previous definition + +2011-06-06 18:21:04 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_parse_chapters + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-06-06 14:47:27 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_parse_attachments + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-06-06 12:43:14 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_parse_attached_file + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-06-05 22:45:55 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_parse_info + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-06-05 10:15:23 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_parse_metadata + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-06-05 09:54:42 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_parse_metadata_id_tag + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-06-05 02:24:41 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_parse_metadata_id_simple_tag + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-06-06 12:42:53 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: reset state tracking variable when appropriate + ... so we don't end up interrupting an operation that should not be interrupted + based on the indication of a previous interruptable operation. + +2011-06-04 13:49:52 -0700 David Schleef + + * gst/interleave/interleave.c: + interleave: Work around changes in g_atomic API + See #651514 for details. + +2011-06-04 13:43:00 -0700 David Schleef + + * ext/soup/gstsouphttpsink.c: + * ext/soup/gstsouphttpsink.h: + souphttpsink: code cleanup + +2011-06-05 02:00:08 +0530 Debarshi Ray + + * gst/matroska/matroska-parse.c: + matroskaparse: Use ARTIST tag instead of AUTHOR for GST_TAG_ARTIST + AUTHOR only existed in an old version of the spec and ARTIST is + the new replacement for this. We are still reading both to still + be compatible with old files. + Fixes bug #644875. + +2011-06-02 13:38:30 +0200 Sebastian Dröge + + * ext/dv/gstdvdemux.c: + dvdemux: First query the peer duration in the requested format before converting to BYTES + Fixes usage of dvdemux after another demuxer, e.g. mxfdemux. + Fixes bug #650503. + +2011-06-02 10:41:52 +0200 Sebastian Dröge + + * ext/soup/gstsouphttpsink.c: + souphttpsink: Fix refcounting of the "session" property + Properties should never take ownership of the values + passed to them. + +2011-06-01 17:04:27 -0700 David Schleef + + * gst/matroska/matroska-mux.c: + matroskamux: For streaming files, push tags first + +2011-05-24 14:52:01 -0700 David Schleef + + * ext/soup/Makefile.am: + * ext/soup/gstsoup.c: + * ext/soup/gstsouphttpsink.c: + * ext/soup/gstsouphttpsink.h: + * ext/soup/gstsouphttpsrc.c: + soup: Add souphttpsink + +2011-06-01 10:19:31 +0200 Thijs Vermeir + + * gst/udp/gstudpsrc.c: + udpsrc: allow skip-first-bytes of full buffer size + +2011-05-30 18:31:50 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following functions to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_parse_header + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-30 12:09:31 +0200 Antonio Frediani + + * gst/isomp4/gstqtmux.c: + qtmux: Use GST_TAG_IMAGE for coverart too + Fixes bug #638107. + +2011-05-30 10:40:08 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following functions to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_get_seek_track + - gst_matroska_{demux,parse}_reset_streams + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-28 22:04:34 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska{demux,parse}_found_global_tag + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-28 10:59:09 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following functions to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_index_seek_find + - gst_matroska{demux,parse}_do_index_seek + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-27 23:15:23 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_tracknumber_unique + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-27 20:28:19 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_decode_data + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-27 19:30:48 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_get_length + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-27 09:17:46 +0200 Sebastian Dröge + + * gst/avi/gstavimux.c: + avimux: Revert 1a90a6c4 and drop Dirac support again + It does not work at all (A/V sync issues), is not very useful, + other containers work much better with Dirac and Dirac in AVI + is not supported by other software. + Fixes bug #541215. + +2011-05-26 23:35:52 +0530 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following functions to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_encoding_cmp + - gst_matroska_{demux,parse}_read_track_encodings + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-23 18:06:44 +0300 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following functions to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_peek_id_length_pull + - gst_matroska_{demux,parse}_peek_id_length_push + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-23 18:06:44 +0300 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_peek_adapter + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-26 12:48:36 +0200 Sebastian Dröge + + * sys/ximage/ximageutil.c: + xvimagesink: Fallback to non-XShm mode if allocating the XShm image failed + Fixes bug #630456. + +2011-05-26 12:22:52 +0200 Marc Leeman + + * gst/rtp/gstrtpmp4vpay.c: + rtpmp4vpay: Deprecated send-config property and replace by config-interval + Fixes bug #622412. + +2010-06-23 11:12:00 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + matroskademux: UTF-8 subtitles may have markup + Fixes #616936. + +2011-01-23 15:56:49 +0000 Vincent Penquerc'h + + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttextoverlay.h: + cairotextoverlay: forward new segment events from the sink to the source + Not doing so will cause buffers to be received by downstream without + a time base set. + We use the same method avimux uses to get access to the event when + collectpads got the sink event function. + https://bugzilla.gnome.org/show_bug.cgi?id=640323 + +2011-01-24 11:11:48 +0000 Vincent Penquerc'h + + * ext/cairo/gsttextoverlay.c: + textoverlay: forward source events to sinks + Events are passed to the video sink, and to the text sink if it is + linked. + This will allow seeking, for instance. + https://bugzilla.gnome.org/show_bug.cgi?id=586450 + +2011-05-25 21:12:12 +0200 David Hoyt + + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartdemux.h: + multipartdemux: Add property to assume a single stream and emit no-more-pads + Fixes bug #616686. + +2011-05-25 14:50:26 +0200 Miguel Angel Cabrera Moya + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: uniform unknown message handling + Do the same processing in all the cases when an unknown message is received. + That is, give a warning. + https://bugzilla.gnome.org/show_bug.cgi?id=651059 + +2011-05-23 18:06:44 +0300 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_peek_pull + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-23 18:06:44 +0300 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following function to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_peek_bytes + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-23 18:06:44 +0300 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following functions to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_{demux,parse}_encoding_order_unique + - gst_matroska_{demux,parse}_read_track_encoding + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-24 13:12:19 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtppcmudepay.c: + pcmudepay: allow variable sample rate + +2011-05-24 13:11:54 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtppcmadepay.c: + pcmadepay: allow variable sample rate + +2010-04-04 06:43:41 -0500 Rob Clark + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/v4l2_calls.c: + v4l2: add norm property + Based on a patch by Guennadi Liakhovetski. + v2: updates because I forgot to add GstTuner interface to v4l2sink + v3: update to add all possible values to norm enum + +2011-05-23 20:46:04 +0300 Debarshi Ray + + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: fixed copyright headers + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-23 18:06:44 +0300 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Move the following functions to matroska-read-common.[ch] from + matroska-demux.c and matroska-parse.c: + - gst_matroska_decode_content_encodings + - gst_matroska_decompress_data + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-23 18:48:57 +0300 Debarshi Ray + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska-read-common.h: + matroska: move GstMatroska{Demux,Parse}::state to GstMatroskaReadCommon + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-24 09:48:56 +0200 Jonas Larsson + + * gst/isomp4/qtdemux.c: + qtdemux: Fix buffer leak with corrupted files + Fixes bug #650912. + +2011-05-23 02:46:38 -0700 Miguel Angel Cabrera Moya + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: fix parameter type in trace + https://bugzilla.gnome.org/show_bug.cgi?id=650937 + +2011-05-23 18:06:44 +0300 Debarshi Ray + + * gst/matroska/Makefile.am: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska-read-common.c: + * gst/matroska/matroska-read-common.h: + matroska: refactor code common to matroskademux and matroskaparse + Replace the following functions with their gst_matroska_read_common_* + counterparts: + - gst_matroska_{demux,parse}_parse_index + - gst_matroska_{demux,parse}_parse_skip + - gst_matroska_{demux,parse}_stream_from_num + Introduce GstMatroskaReadCommon to contain those members of + GstMatroskaDemux and GstMatroskaParse that were used by the above + functions. + https://bugzilla.gnome.org/show_bug.cgi?id=650877 + +2011-05-23 13:50:46 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstflacparse.c: + flacparse: tell baseparse the duration in samples for better accuracy + Tell GstBaseParse the duration in samples instead of time, so that + a duration query in DEFAULT format will return the correct number + of samples without rounding errors. Baseparse will convert this + into time itself when needed. + https://bugzilla.gnome.org/show_bug.cgi?id=650785 + +2011-05-23 13:25:44 +0100 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + flacdec: also try upstream first for duration query in DEFAULT format + https://bugzilla.gnome.org/show_bug.cgi?id=650785 + +2011-05-23 13:23:21 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstflacparse.c: + flacparse: make conversion from TIME to DEFAULT format (samples) work + Fix copy'n'paste error in the previous commit. + +2011-05-23 11:36:36 +0200 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + flacparse: Implement conversions between TIME and DEFAULT format + Fixes bug #650785. + +2011-05-22 18:50:51 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstflacparse.c: + flacparse: don't error out on invalid minimum_blocksize value in streaminfo header + We don't use it, so may just as well accept an invalid value + of 0 here, which is likely inconsequential anyway. + https://bugzilla.gnome.org/show_bug.cgi?id=650691 + +2011-05-20 10:34:47 +0300 Stefan Kost + + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpqcelpdepay.c: + rtp: fix static array overruns in a nicer way + Use G_N_ELEMENTS instead of hard-coding the array size. + +2011-05-20 00:53:44 +0300 Stefan Kost + + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpqcelpdepay.c: + rtp: fix static array overruns + Yes array[10] has elements from 0...9. + +2011-05-19 23:31:19 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + docs: update plugin introspection data + Now more files are merged and produced in a canonical fashion, which hopefully + creates less or no delta in the future. + +2011-05-19 22:57:15 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 9e5bbd5 to 69b981f + +2011-05-19 18:21:33 +0300 Stefan Kost + + * gst/isomp4/qtdemux.c: + qtdemux: add missing break + +2010-11-08 14:06:15 +0100 Robert Swain + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Add support for deinterlacing using buffer caps/flags + When not using the fieldanalysis element immediately upstream of deinterlace, + behaviour should remain unchanged. fieldanalysis will set the caps and flags on + the buffers such that they can be interpreted and acted upon to produce + progressive output. + There are two main modes of operation: + - Passive pattern locking + Passive pattern locking is a non-blocking, low-latency mode of operation that + is suitable for close-to-live usage. Initially a telecine stream will be + output as variable framerate with naïve timestamp adjustment. With each + incoming buffer, an attempt is made to lock onto a pattern. When a lock is + obtained, the src pad and output buffer caps will reflect the pattern and + timestamps will be accurately interpolated between pattern repeats. This + means that initially and at pattern transitions there will be short periods + of inaccurate timestamping. + - Active pattern locking + Active pattern locking is a blocking, high-latency mode of operation that is + targeted at use-cases where timestamp accuracy is paramount. Buffers will be + queued until enough are present to make a lock. When locked, timestamps will + be accurately interpolated between pattern repeats. Orphan fields can be + dropped or deinterlaced. If no lock can be obtained, a single field might be + pushed through to be deinterlaced. + Locking can also be disabled or 'auto' chooses between passive and active + locking modes depending on whether upstream is live. + +2011-05-10 16:25:40 -0700 David Schleef + + * configure.ac: + configure: Remove config script check for caca + +2011-05-18 12:36:40 +0200 Jose Antonio Santos Cadenas + + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpbvdepay.c: + * gst/rtp/gstrtpg722depay.c: + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtpspeexdepay.c: + rtp: Fix segmentation fault processing payload buffers + This commit checks if the value returned by + gst_rtp_buffer_get_payload_buffer and + gst_rtp_buffer_get_payload_subbuffer is NULL before using it. + +2011-05-18 16:10:07 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From fd35073 to 9e5bbd5 + +2011-05-18 12:52:31 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: ensure 0-padding when correcting dubious list size + +2011-05-18 12:24:25 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 46dfcea to fd35073 + +2011-05-18 10:22:27 +0300 Stefan Kost + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: use EINVAL for missing url parameter + Fixes gcc warning about using uninitialized variable 'res'. + +2011-04-28 15:37:40 +0300 Stefan Kost + + * gst/debugutils/rndbuffersize.c: + * gst/videofilter/gstgamma.c: + various: fix author tag in element details + +2011-04-20 15:25:58 -0400 Chris E Jones + + * gst/auparse/gstauparse.c: + auparse: implement seeking + Implement seeking and seeking query. Fixes #644512 + +2011-04-06 16:05:55 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: also allow PAUSE to be interrupted + ... as it is on the way out to NULL. + See #632504. + +2011-04-06 15:51:49 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: ensure proper closing and cleanup + ... since the TEARDOWN sequence might not have had a chance to even start, + but at least connections should be closed (synchronously) and state cleaned up. + See #632504. + +2011-04-06 15:49:01 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: fix and improve async handling + Simplify the command handling; passing a command to thread means we really + want it to get the message, which means to always flush provided the command + can handle being interrupted. Command thread indicates whether command + allows interruption and ensure non-flushing connection as it subsequently + needs it. + In particular, this also makes the TEARDOWN sequence interruptable + and also prevents races where _loop_ could miss a command and would + continue receiving (or at least trying to). + See #632504. + +2011-04-06 14:53:27 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: tweak post-seek loop handling + +2011-01-10 12:46:37 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: open on play and pause when not done yet + With the async state changes, it is possible that we need to open the stream + before play and pause. + Also make sure we remember a previous open failure so that we don't keep trying + again. + +2011-01-10 11:45:03 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: improve async handling + Simplify the command handling, only continue looping when we have not received + another command or when the previous loop was successfull. + Avoid looping on a disconnected socket. + +2011-01-07 18:02:49 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: rework reconnect code + Use the same async code path to implement reconnects. + Make sure we only post progress messages when doing async things. + +2011-01-07 17:19:59 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: small cleanups + Make sure we cancel the previous task when queuing a new one. + Move the messages to a central place so we can more easily post them. + +2011-01-07 15:15:49 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't post errors when interrupting + +2011-01-07 13:43:06 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: implement more async handling + Remove some old locks. + Make sure we never go into the loop function when flushing. + +2011-01-07 11:40:32 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: first attempt at async implementation + +2011-01-07 11:40:11 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.h: + rtspsrc: small header cleanups + +2011-05-17 10:47:32 +0200 Sebastian Dröge + + * gst/rtpmanager/gstrtpssrcdemux.c: + ssrcdemux: Fix uninitialized variable compiler warning for (pre-) releases too + +2011-04-28 15:57:04 +0200 Edward Hervey + + * sys/v4l2/gstv4l2object.c: + v4l2objects: Only allow mpeg-ts on source objects + Ugly fix for #648312 + +2011-05-17 09:24:08 +0200 Sebastian Dröge + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: Fix uninitialized variable compiler warning + +2011-05-06 19:09:17 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpssrcdemux.c: + ssrcdemux: Implement iterate internal links for sink pads + https://bugzilla.gnome.org/show_bug.cgi?id=649617 + +2011-05-06 18:41:01 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: iterate pad function is only valid for src pads + The iterate function is only used for src pads, so mark it as such and remove + dead code. + https://bugzilla.gnome.org/show_bug.cgi?id=649617 + +2011-05-06 18:12:53 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: Release lock before emitting signal + If the lock is not released before emitting a signal, it may cause a deadlock + if any other function in the element is called. + Also removed an unused timestamp parameter + https://bugzilla.gnome.org/show_bug.cgi?id=649617 + +2011-05-15 23:25:15 +0300 Debarshi Ray + + * gst/matroska/matroska-parse.c: + matroskaparse: calculate segment duration after parsing all the IDs + Since the segment duration is given in terms of the + GST_MATROSKA_ID_TIMECODESCALE we should only convert it into + nanoseconds when we are sure that any scale specified in the file has + been read. + https://bugzilla.gnome.org/show_bug.cgi?id=650258 + +2011-05-04 11:55:21 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: additional lock safety + Fixes #619590. + +2011-04-26 16:06:56 +0200 Mark Nauwelaerts + + * gst/isomp4/qtdemux.c: + qtdemux: also check for bitrate info in caps + +2010-05-25 01:04:43 +0530 Arun Raghavan + + * gst/isomp4/qtdemux.c: + * gst/isomp4/qtdemux.h: + qtdemux: guess bitrate if only one stream's bitrate is unknown + If the bitrates for all but one audio/video streams are known, and the + total stream size and duration can be determined, this calculates the + unkown bitrate as (stream size / duration) - (sum of known bitrates). + While this is not guaranteed to be very accurate, it should be good + enough for most purposes. + For example, this is useful for H.263 + AAC streams where no 'btrt' atom + is available for the video portion. + https://bugzilla.gnome.org/show_bug.cgi?id=619548 + +2010-05-31 23:59:59 +0530 Arun Raghavan + + * gst/isomp4/qtdemux.c: + qtdemux: Export max bitrate for AMR-NB/-WB streams + This parses the 'damr' atom if present, and exports the maximum bitrate + of the stream using the mode set field to determine the highest bitrate + frame type that might be present. + https://bugzilla.gnome.org/show_bug.cgi?id=620186 + +2011-05-16 09:04:31 +0200 Pino Toscano + + * ext/pulse/pulseutil.c: + pulse: Define PATH_MAX if it isn't defined + GNU Hurd for example doesn't define it. + +2011-05-15 23:25:15 +0300 Debarshi Ray + + * gst/matroska/matroska-demux.c: + matroskademux: calculate segment duration after parsing all the IDs + Since the segment duration is given in terms of the + GST_MATROSKA_ID_TIMECODESCALE we should only convert it into + nanoseconds when we are sure that any scale specified in the file has + been read. + https://bugzilla.gnome.org/show_bug.cgi?id=650258 + +2011-05-09 19:00:45 +0200 Andoni Morales Alastruey + + * gst/flv/gstflvmux.c: + flvmux: Add support for mpegversion 2, which is also AAC + +2011-05-11 10:25:15 +0200 Sebastian Dröge + + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + flacdec: Send EOS when seeking after the end of file instead of failing + Fixes bug #649780. + +2011-04-29 08:59:20 +0200 Sebastian Dröge + + * gst/wavenc/gstwavenc.c: + wavenc: Set fixedcaps getcaps function on the sinkpad + wavenc does not allow to change the caps during playback + and always returning the template caps is just wrong. + +2011-04-29 08:55:19 +0200 Sebastian Dröge + + * gst/wavenc/gstwavenc.c: + wavenc: Allow setcaps to be called after a format was negotiated if it's compatible + Otherwise wavenc will fail if upstream decides to set equivalent caps or caps + with additional information later. + Thanks to Alexander Schremmer for finding this bug. + +2011-05-14 10:02:22 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-audioparsers.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-isomp4.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.29 === + +2011-05-10 10:04:28 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-audioparsers.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-isomp4.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + * win32/common/config.h: + Release 0.10.29 + Highlights: + - amrparse, aacparse, ac3parse, flacparse, mpegaudioparse, dcaparse audio parsers (moved from -bad) + - muxers now mux based on running time + - ISO MP4 muxers: mp4mux/3gppmux/qtmux/mj2mux (moved from -bad) + - new matroskaparse element + - new v4l2radio element + - rtpsession: support RTCP Early Feedback (the AVPF profile) + - orc 0.4.14 or newer recommended + - many other fixes and improvements + +2011-05-05 13:24:23 +0200 Edward Hervey + + * gst/isomp4/gstqtmux.c: + qtmux: Fix signed floating point values writing + You would end up on some architectures with 0 being written out + instead of the proper value. + https://bugzilla.gnome.org/show_bug.cgi?id=649449 + +2011-05-04 12:04:15 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskamux: avoid building index when streamable + ... as it will not be written anyway. + Fixes #648937 (?). + +2011-05-02 12:09:02 +0100 Tim-Philipp Müller + + * Makefile.am: + build: add old qtdemux/quicktime directories to CRUFT_DIRS and CRUFT_FILES + +2011-05-01 00:04:03 -0400 Tom Janiszewski + + * gst/flv/gstflvmux.c: + flvmux: don't overwrite metadata tag with duration in streaming mode + A duration tag gets inserted only for streamable=false, so only + update/write the duration later if we actually inserted that tag, + otherwise we write garbage into other tags. + https://bugzilla.gnome.org/show_bug.cgi?id=649060 + +2011-04-30 18:16:36 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-audioparsers.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-isomp4.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * po/fr.po: + * win32/common/config.h: + 0.10.28.4 pre-release + +2011-04-30 17:46:36 +0100 Tim-Philipp Müller + + * Android.mk: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/inspect/plugin-isomp4.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * gst-plugins-good.spec.in: + * gst/isomp4/LEGAL: + * gst/isomp4/Makefile.am: + * gst/isomp4/atoms.c: + * gst/isomp4/atoms.h: + * gst/isomp4/atomsrecovery.c: + * gst/isomp4/atomsrecovery.h: + * gst/isomp4/descriptors.c: + * gst/isomp4/descriptors.h: + * gst/isomp4/fourcc.h: + * gst/isomp4/ftypcc.h: + * gst/isomp4/gstqtmoovrecover.c: + * gst/isomp4/gstqtmoovrecover.h: + * gst/isomp4/gstqtmux-doc.c: + * gst/isomp4/gstqtmux-doc.h: + * gst/isomp4/gstqtmux.c: + * gst/isomp4/gstqtmux.h: + * gst/isomp4/gstqtmuxmap.c: + * gst/isomp4/gstqtmuxmap.h: + * gst/isomp4/gstrtpxqtdepay.c: + * gst/isomp4/gstrtpxqtdepay.h: + * gst/isomp4/isomp4-plugin.c: + * gst/isomp4/properties.c: + * gst/isomp4/properties.h: + * gst/isomp4/qtatomparser.h: + * gst/isomp4/qtdemux.c: + * gst/isomp4/qtdemux.h: + * gst/isomp4/qtdemux.vcproj: + * gst/isomp4/qtdemux_dump.c: + * gst/isomp4/qtdemux_dump.h: + * gst/isomp4/qtdemux_fourcc.h: + * gst/isomp4/qtdemux_lang.c: + * gst/isomp4/qtdemux_lang.h: + * gst/isomp4/qtdemux_types.c: + * gst/isomp4/qtdemux_types.h: + * gst/isomp4/qtpalette.h: + * gst/quicktime/LEGAL: + * gst/quicktime/Makefile.am: + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/atomsrecovery.c: + * gst/quicktime/atomsrecovery.h: + * gst/quicktime/descriptors.c: + * gst/quicktime/descriptors.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/ftypcc.h: + * gst/quicktime/gstqtmoovrecover.c: + * gst/quicktime/gstqtmoovrecover.h: + * gst/quicktime/gstqtmux-doc.c: + * gst/quicktime/gstqtmux-doc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + * gst/quicktime/gstqtmuxmap.c: + * gst/quicktime/gstqtmuxmap.h: + * gst/quicktime/gstrtpxqtdepay.c: + * gst/quicktime/gstrtpxqtdepay.h: + * gst/quicktime/properties.c: + * gst/quicktime/properties.h: + * gst/quicktime/qtatomparser.h: + * gst/quicktime/qtdemux.c: + * gst/quicktime/qtdemux.h: + * gst/quicktime/qtdemux.vcproj: + * gst/quicktime/qtdemux_dump.c: + * gst/quicktime/qtdemux_dump.h: + * gst/quicktime/qtdemux_fourcc.h: + * gst/quicktime/qtdemux_lang.c: + * gst/quicktime/qtdemux_lang.h: + * gst/quicktime/qtdemux_types.c: + * gst/quicktime/qtdemux_types.h: + * gst/quicktime/qtpalette.h: + * gst/quicktime/quicktime.c: + * po/POTFILES.in: + quicktime: rename plugin to isomp4 + https://bugzilla.gnome.org/show_bug.cgi?id=648004 + +2011-04-27 12:45:51 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-audioparsers.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * po/bg.po: + * po/ja.po: + * po/nl.po: + * po/ru.po: + * win32/common/config.h: + 0.10.28.3 pre-release + +2011-04-26 15:58:12 +0200 Wim Taymans + + * gst/rtp/gstrtpgstpay.c: + rtpgstpay: fix buffer leak + +2011-04-25 10:04:52 +0200 Philip Jägenstedt + + * ext/jpeg/gstjpegdec.c: + jpegdec: documentation typo "jpegddec" + https://bugzilla.gnome.org/show_bug.cgi?id=648589 + +2011-04-24 16:45:07 -0700 David Schleef + + * gst/avi/gstavimux.c: + * gst/matroska/matroska-mux.c: + avimux,matroskamux: Add stream-format to h264 caps + Fixes #606662. + +2011-02-20 12:13:49 -0800 David Schleef + + * ext/libpng/gstpngdec.c: + pngdec: Remove temporary code + Now that we depend on (what will be) -base-0.10.33. + +2011-04-24 14:03:56 +0100 Tim-Philipp Müller + + * configure.ac: + configure: don't pass -Waddress to ObjC compiler on OSX when compiling osxvideosink + Temporary workaround until we fix this properly and check for + the ObjC warning/error flags instead of just passing CFLAGS to the + ObjC compiler. + https://bugzilla.gnome.org/show_bug.cgi?id=643939 + +2011-04-24 13:29:32 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-quicktime.xml: + * gst-plugins-good.spec.in: + * gst/quicktime/Makefile.am: + quicktime: rename plugin filename from *qtdemux* to *quicktime* + https://bugzilla.gnome.org/show_bug.cgi?id=648004 + +2011-04-24 14:03:41 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From c3cafe1 to 46dfcea + +2011-04-21 23:30:26 +0100 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/quicktime/Makefile.am: + * gst/quicktime/gstqtmoovrecover.c: + * gst/quicktime/gstqtmux-doc.c: + * gst/quicktime/gstqtmux-doc.h: + docs: add various qtmux variants to documentation + +2011-04-21 22:51:52 +0100 Tim-Philipp Müller + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + * gst/quicktime/gstqtmuxmap.h: + quicktime: register 3gppmux element in addition to the misnamed gppmux + +2011-04-18 18:08:30 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Remove incomplete support for RTCP FIR + Remove bits that were meant to suppport RTCP FIR + https://bugzilla.gnome.org/show_bug.cgi?id=648160 + +2011-04-19 14:33:25 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/generic/.gitignore: + * tests/check/generic/index.c: + tests: add generic set_index test + +2011-04-19 14:33:42 +0100 Tim-Philipp Müller + + * gst/flv/gstflvdemux.c: + flvdemux: fix deadlock on setting index on flvdemux + +2011-04-19 14:16:11 +0100 Tim-Philipp Müller + + * tests/check/elements/flacparse.c: + tests: add index-setting test for baseparse/flacparse + https://bugzilla.gnome.org/show_bug.cgi?id=646811 + +2011-04-18 11:29:15 +0200 Sebastian Dröge + + * tests/check/pipelines/wavpack.c: + wavpack: Remove bus GSource to prevent a valgrind warning + +2011-04-18 11:14:32 +0200 Sebastian Dröge + + * tests/check/pipelines/wavenc.c: + wavenc: Remove bus GSource to prevent a valgrind warning + +2011-04-18 11:11:53 +0200 Sebastian Dröge + + * tests/check/pipelines/tagschecking.c: + tagschecking: Remove bus GSource to prevent a valgrind warning + +2011-04-18 11:10:01 +0200 Sebastian Dröge + + * tests/check/elements/imagefreeze.c: + imagefreeze: Remove bus GSource to prevent a valgrind warning + +2011-04-17 01:29:01 +0100 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: + avidemux: fix 'variable may be used uninitialized' warnings caused by -DG_DISABLE_ASSERT + +2011-04-16 18:50:11 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + * win32/common/gstrtpbin-marshal.c: + * win32/common/gstrtpbin-marshal.h: + 0.10.28.2 pre-release + +2011-04-16 18:49:27 +0100 Tim-Philipp Müller + + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime-dist.h: + * gst/videobox/gstvideoboxorc-dist.c: + * gst/videobox/gstvideoboxorc-dist.h: + * gst/videomixer/blendorc-dist.c: + * gst/videomixer/blendorc-dist.h: + gst: update disted orc backup code + +2011-04-16 18:29:45 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-audioparsers.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + docs: update for pre-release + +2011-04-16 18:27:54 +0100 Tim-Philipp Müller + + * po/bg.po: + * po/cs.po: + * po/de.po: + * po/es.po: + * po/id.po: + * po/sl.po: + po: update translations + +2011-04-16 18:17:01 +0100 Tim-Philipp Müller + + * gst/quicktime/gstqtmux.c: + qtmux: refuse incomplete legacy h264 caps + Refuse h264 caps without stream-format and codec_data fields for + now, to avoid creating broken files. This might cause some pipelines + that worked previously to fail. However, the move from -bad to -good + is our only chance to fix this up, so make it strict for now. We can + always change it back to be less strict in future. + https://bugzilla.gnome.org/show_bug.cgi?id=647919 + +2011-04-16 18:16:11 +0100 Tim-Philipp Müller + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: fix another unused-but-set-variable warning + +2011-04-16 18:10:24 +0100 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + * ext/speex/gstspeexenc.c: + * gst/rtp/gstrtpgsmpay.c: + pulse, speexenc, rtpgsmpay: don't use g_assert() for error handling + Don't use g_assert() for error handling, even if they're highly unlikely. + Either we *know* that something can't happen, in which case we + should just not handle it, or we think something can happen, but it is + very very unlikely that it will ever happen, in which case we should + handle it like any other error instead of asserting. + g_assert() is best left for conditions we have control of, like checking + internal consistency of our code, not checking return values of external + code. + Fixes a bunch of warnings when compiling with -DG_DISABLE_ASSERT: + gstrtpgsmpay.c: In function 'gst_rtp_gsm_pay_handle_buffer': + gstrtpgsmpay.c:130:17: warning: variable 'rtpgsmpay' set but not used + gstspeexenc.c: In function 'gst_speex_enc_encode': + gstspeexenc.c:904:19: warning: variable 'written' set but not used + pulsesink.c: In function 'gst_pulsesink_change_state': + pulsesink.c:2725:9: warning: variable 'res' set but not used + pulsesrc.c: In function 'gst_pulsesrc_change_state': + pulsesrc.c:1253:7: warning: variable 'e' set but not used + +2011-04-16 18:07:35 +0100 Tim-Philipp Müller + + * tests/examples/rtp/server-alsasrc-PCMA.c: + examples: fix some warnings in rtp example + Caused by -DG_DISABLE_ASSERT + +2011-04-16 17:57:32 +0100 Tim-Philipp Müller + + * tests/examples/level/level-example.c: + examples: don't put code with side-effects into g_assert() + Otherwise things won't work too well when compiling with + -DG_DISABLE_ASSERT (as we do for pre-releases and releases). + +2011-04-16 16:51:32 +0100 Tim-Philipp Müller + + * gst/deinterlace/tvtime/greedyh.c: + * gst/matroska/matroska-mux.c: + deinterlace, matroska: fix two variable-may-be-used-uninitialized compiler warnings + We use -DG_DISABLE_ASSERT for the pre-releases, which makes these + warnings pop up in cases that were previously covered by g_assert_not_reached() + and the like: + tvtime/greedyh.c:801:14: warning: 'scanline' may be used uninitialized in this function + matroska-mux.c:501:19: warning: 'context' may be used uninitialized in this function + +2011-04-16 13:33:45 +0100 Tim-Philipp Müller + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: fix unused-but-set-variable warnings with gcc-4.6 + +2011-04-16 13:23:50 +0100 Tim-Philipp Müller + + * tests/examples/cairo/cairo_overlay.c: + examples: fix 'control reaches end of non-void function' warning in cairo example + +2011-04-15 15:47:24 +0200 Robert Swain + + * sys/v4l2/gstv4l2src.c: + v4l2src: Address unused but set variable + The v4l2object formats list was being obtained into a local variable and + then still used from the context. Make use of the local variable. + +2011-04-15 15:17:34 +0200 Robert Swain + + * sys/oss4/oss4-mixer-slider.c: + * sys/oss4/oss4-mixer-switch.c: + * sys/oss4/oss4-property-probe.c: + * sys/oss4/oss4-source.c: + oss4: Address unused but set variables + GCC 4.6.x complains about such variable usage. Unused but set variables + were removed except that gst_oss4_mixer_slider_set_mute () now returns + the value from the call to gst_oss4_mixer_set_control_val (). + +2011-04-15 15:14:13 +0200 Robert Swain + + * ext/jpeg/gstjpegenc.c: + * ext/pulse/pulsesink.c: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + jpegenc: pulsesink: raw1394: Address unused but set variables + GCC 4.6.x spits warnings about such usage of variables. The variables in + raw1394 were marked with G_GNUC_UNUSED as this seemed omre appropriate. + The others were removed. + +2011-04-15 15:12:44 +0200 Robert Swain + + * gst/shapewipe/gstshapewipe.c: + * gst/y4m/gsty4mencode.c: + y4mencode: shapewipe: Address unused but set variables + GCC 4.6.x complains about such usage. + +2011-04-15 15:11:35 +0200 Robert Swain + + * tests/check/elements/deinterlace.c: + * tests/check/elements/rtp-payloading.c: + * tests/check/pipelines/flacdec.c: + * tests/examples/level/level-example.c: + * tests/icles/videocrop-test.c: + * tests/icles/ximagesrc-test.c: + tests: Address unused but set variables + GCC 4.6.x spits warnings about such usage of variables. + +2011-04-15 15:36:41 +0200 Robert Swain + + * gst/videomixer/blendorc.orc: + videomixer: Fix argb/rgba overlay orc code + Remove some redundant operations (convubw) and use the correct variable, + t2, in the orc_overlay_bgra function. + +2011-04-15 15:33:35 +0200 Robert Swain + + * gst/videomixer/blend.c: + * gst/videomixer/gstcollectpads2.c: + * gst/videomixer/videomixer2.c: + videomixer: address unused but set variables + GCC 4.6.x spits warnings about variables that are set but unused. Such + variables have been removed in blend, collectpads2 and videomixer2. + +2011-04-15 14:57:20 +0200 Robert Swain + + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpbvdepay.c: + * gst/rtp/gstrtpbvpay.c: + * gst/rtp/gstrtpg722pay.c: + * gst/rtp/gstrtpgstdepay.c: + * gst/rtp/gstrtpgstpay.c: + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpqcelpdepay.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpsession.c: + rtp, rtpmanager: Address unused but set variables + GCC 4.6.x spits warnings about variables that are unused but set. Such + variables have been removed where trivial but with comments left behind + for informational purposes in some cases. + gst_rtp_session_chain_recv_rtcp () was changed in commit 490113d4 + to always return GST_FLOW_OK instead of the return value of + rtp_session_process_rtcp (), so we'll keep it that way. + +2011-04-15 11:29:30 +0200 Robert Swain + + * gst/quicktime/descriptors.c: + * gst/quicktime/gstrtpxqtdepay.c: + * gst/quicktime/qtdemux.c: + quicktime: Remove unused but set variables + GCC 4.6.x spits warnings about such variable usage. Note that some + calculations are left as comments for informative purposes. + +2011-04-15 11:23:38 +0200 Robert Swain + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-parse.c: + matroska: Remove unused but set variables + GCC 4.6.x spits warnings about such variable usage. + +2011-04-15 11:19:26 +0200 Robert Swain + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Remove unused but set duration variable + GCC 4.6.x spits warnings about such variable usage. + +2011-04-15 11:18:19 +0200 Robert Swain + + * gst/flv/gstflvdemux.c: + flxdemux: Remove unused but set keyframe variables + The FIXMEs about the keyframe flag never being used are left for later + fixing, at which point the keyframe variables could be added back. + +2011-04-15 11:16:42 +0200 Robert Swain + + * gst/effectv/gstedge.c: + edgetv: Remove unused but set height variable + GCC 4.6.x spits warnings about such variables. + +2011-04-15 18:51:20 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstflacparse.c: + flacparse: update for gst_base_parse_frame_init() API change + +2011-02-01 15:57:01 -0500 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Use existing functions to parse RTCP FB packets + Use existing functions to get the FCI from FB packets. + https://bugzilla.gnome.org/show_bug.cgi?id=622553 + +2011-02-01 16:23:52 -0500 Olivier Crête + + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/rtpsession.c: + rtpsession: marshal GstBuffer as a MiniObject instead of a pointer + https://bugzilla.gnome.org/show_bug.cgi?id=622553 + +2011-04-14 23:24:56 -0700 David Schleef + + * gst/matroska/matroska-demux.c: + matroskademux: Better calculation of framerate + https://bugzilla.gnome.org/show_bug.cgi?id=647833 + +2011-04-13 12:37:09 +0100 Tim-Philipp Müller + + * gst/quicktime/gstqtmux.c: + qtmux: default to dts-method=reorder and presentation-time=true + https://bugzilla.gnome.org/show_bug.cgi?id=636699 + +2011-04-15 12:47:52 +0200 Mark Nauwelaerts + + * tests/check/elements/qtmux.c: + tests: qtmux: test various dts-methods + +2011-04-15 12:34:05 +0200 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: fix corner case buffer handling for reorder method + +2011-04-14 13:47:05 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + flvdemux: Don't leak the SEEKING query + +2011-04-14 13:43:06 +0200 Sebastian Dröge + + * gst/quicktime/gstqtmoovrecover.c: + * gst/quicktime/gstqtmoovrecover.h: + qtmoovrecover: Don't leak the static recursive mutex + +2011-04-14 13:37:52 +0200 Sebastian Dröge + + * sys/v4l2/gstv4l2radio.c: + v4l2radio: Free videodev string before replacing it + +2011-04-14 13:24:21 +0200 Sebastian Dröge + + * gst/matroska/matroska-parse.c: + matroskaparse: Allow webm and matroska caps and don't leak caps + +2011-04-14 07:35:29 +0100 Christian Fredrik Kalager Schaller + + * gst-plugins-good.spec.in: + Add parser plugin + +2011-03-24 14:34:24 -0700 David Schleef + + * sys/directsound/gstdirectsoundsink.c: + directsoundsink: Add conditionals on WAVE_FORMAT_DOLBY_AC3_SPDIF + +2011-04-11 20:09:14 +0100 Tim-Philipp Müller + + * gst/debugutils/gstcapsdebug.c: + capsdebug: fix unused-but-set-variable warnings with gcc 4.6 + +2011-04-11 20:05:54 +0100 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: + avidemux: fix unused-but-set-variable warning with gcc 4.6 + Most likely a leftover from when the index parsing code was rewritten. + +2011-04-11 19:54:00 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstac3parse.c: + ac3parse: fix unused-but-set-variable warning with gcc 4.6 + +2011-04-11 19:50:07 +0100 Tim-Philipp Müller + + * gst/videofilter/gstvideobalance.c: + videobalance: fix handling of YUV images with 'odd' widths + Fixes unused-but-set-variable warnings with gcc 4.6. + +2011-04-11 19:49:22 +0100 Tim-Philipp Müller + + * gst/videofilter/gstvideoflip.c: + videoflip: fix unused-but-set-variable warnings with gcc 4.6 + +2011-04-13 18:11:34 +0200 Sebastian Dröge + + * gst/audiofx/audiowsincband.c: + * gst/audiofx/audiowsinclimit.c: + audiowsinc{band,limit}: Fix check for divison by zero + +2011-04-13 18:01:01 +0200 Sebastian Dröge + + * gst/audiofx/audiowsincband.c: + audiowsincband: Fix range of kernel elements (lim -> lim-1) + +2011-04-13 18:00:44 +0200 Sebastian Dröge + + * gst/audiofx/audiowsinclimit.c: + audiowsinclimit: Add some more braces to make the code more readable + +2011-04-11 18:40:30 -0500 Jordi Burguet-Castell + + * gst/audiofx/audiowsinclimit.c: + audiowsinclimit: Fix range of kernel elements (lim -> lim-1) in high/low-pass filters + +2011-04-13 17:49:22 +0200 Sebastian Dröge + + * gst/audiofx/audiowsincband.c: + audiowsincband: Add new windowing functions: gaussian, cos and hann + +2011-04-11 18:41:43 -0500 Jordi Burguet-Castell + + * gst/audiofx/audiowsinclimit.c: + audiowsinclimimt: Add new windows to high/low-pass filters: gaussian, cosine, hann + +2011-04-13 16:47:05 +0100 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroskademux: set stream-format=byte-stream on h264 caps if there's no codec data + https://bugzilla.gnome.org/show_bug.cgi?id=606662 + +2011-04-13 16:37:07 +0100 Thiago Santos + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + qtmux: restrict h264 some more to only accept AU-aligned AVC + https://bugzilla.gnome.org/show_bug.cgi?id=606662 + +2011-04-13 17:11:26 +0200 Sebastian Dröge + + * gst/audioparsers/gstmpegaudioparse.c: + mpegaudioparse: The VBRI header is always at offset 0x20, independent of MPEG version + Also clean up advancing of the data pointer a bit. + Fixes bug #647659. + +2011-04-13 15:18:11 +0100 Tim-Philipp Müller + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + * tests/check/Makefile.am: + * tests/check/elements/qtmux.c: + qtmux: add variant-less video/quicktime to source pad template caps + This is needed for automatic transcoding using encodebin. Our typefinder + does not always add a variant to the found caps, and encodebin needs + an *exact* match to the caps on the source pad template, so we need + to add the variant-less video/quicktime caps to the template as well + for encodebin to be able to find it. Add unit test for this as well. + https://bugzilla.gnome.org/show_bug.cgi?id=642879 + +2011-04-13 16:17:41 +0200 Sebastian Dröge + + * ext/flac/gstflacenc.c: + flacenc: Properly interprete the result of strcmp() + +2011-04-13 16:09:04 +0200 Sebastian Dröge + + * ext/flac/gstflacenc.c: + flacenc: Don't store image tags inside the vorbiscomments and the flac metadata + Instead only store them inside the flac metadata. There's + no point in storing them twice and the flac metadata is + still the official way to store image tags inside flac. + +2011-04-13 12:38:15 +0100 Tim-Philipp Müller + + * tests/check/elements/.gitignore: + * tests/check/pipelines/.gitignore: + tests: ignore new qtmux-related test binaries + +2011-04-13 11:25:11 +0100 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-quicktime.xml: + * gst/quicktime/Makefile.am: + * gst/quicktime/gstqtmuxplugin.c: + * gst/quicktime/quicktime.c: + * tests/check/Makefile.am: + quicktime: move qtmux plugin from -bad to -good + https://bugzilla.gnome.org/show_bug.cgi?id=636699 + +2011-04-04 12:21:23 +0200 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: more helpful debug error message when no needed duration on input buffers + Fixes #646256. + +2011-03-21 10:56:51 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + qtmux: Adding GstTagXmpWriter interface + Adds GstTagXmpWriter interface support to qtmux + +2011-03-22 20:53:08 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: use running time for synchronization + See also #432612. + +2011-03-10 16:03:58 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: provide for PTS metadata when so configured + ... and not only when sort-of feeling like it. + In any case, if it turns out all really is in order, + and presumably DTS == PTS, then no ctts will be produced anyway. + +2011-03-10 16:02:42 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: also track original PTS buffer timestamp in reorder dts-method + +2011-02-21 12:14:59 +0100 Edward Hervey + + * gst/quicktime/gstqtmux.c: + Revert "Check that collectpads exists before removing pad" + This reverts commit 6d8740476ccd3a3498dc4f18c19733643825c7b8. + Depends on a core commit that was reverted + +2011-02-20 23:57:19 -0800 David Schleef + + * gst/quicktime/gstqtmux.c: + Check that collectpads exists before removing pad + The core now calls release pad from finalize, at which point + the collectpads might have already been freed. + +2011-01-13 11:28:32 -0300 Thiago Santos + + * tests/check/elements/qtmux.c: + test: qtmux: Tests qtmux reuse + Forces the use of qtmux after it has been put to PLAYING and back + to NULL once + https://bugzilla.gnome.org/show_bug.cgi?id=639338 + +2011-01-13 15:27:36 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: set src pads when starting file + ... rather than at _init time, so they are also available following a + pad (de)activation cycle. + https://bugzilla.gnome.org/show_bug.cgi?id=639338 + +2011-01-03 17:24:23 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: adjust nasty case timestamp tracking + That is, all sorts of problems arise with re-ordered input timestamps that + tend to defy automagic handling for every case, so allow for a few variations + that can be tried depending on circumstances. + Also try to document accordingly. + Also fixes #638288. + +2010-12-30 21:48:41 +0200 Felipe Contreras + + * gst/quicktime/gstqtmux.c: + qtmux: get rid of timestamp overprotectiveness + Signed-off-by: Felipe Contreras + +2011-01-03 16:56:57 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/atomsrecovery.c: + * gst/quicktime/gstqtmux.c: + qtmux: simplify and fix pts_offset storing + In particular, only write a ctts atom if and only if ever a non-zero offset. + +2011-01-03 10:43:15 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: add some more documentation + +2010-12-03 15:23:00 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: remove large-file property + Rather, auto-determine if 64-bits fields are needed for a valid result, and + stick to plain 32-bits if not needed. + API: GstQTMux:large-file (removed) + +2010-12-19 12:53:34 +0100 Sebastian Dröge + + * gst/quicktime/gstqtmux.c: + qtmux: Free AtomInfo structs + +2010-12-19 12:50:30 +0100 Sebastian Dröge + + * gst/quicktime/gstqtmux.c: + qtmux: Free tag string after use + +2010-12-19 12:12:25 +0100 Sebastian Dröge + + * tests/check/pipelines/tagschecking.c: + tagschecking: Fix some more memory leaks + +2010-12-17 19:41:25 +0200 Lasse Laukkanen + + * gst/quicktime/gstqtmux.c: + qtmux: allow zero duration tracks + +2010-12-03 18:09:41 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: add documentation + +2010-12-01 10:45:49 +0100 David Hoyt + + * gst/quicktime/gstqtmux.c: + qtmux: handle msvc ftruncate incompatibility + Fixes #636185. + +2010-11-27 16:07:19 -0600 Alejandro Gonzalez + + * gst/quicktime/gstqtmux.c: + qtmux: gst_qtmux_check_difference verify before subtract + Avoid negative overflow by checking the order of operands + on subtraction of unsigned integers. + https://bugzilla.gnome.org/show_bug.cgi?id=635878 + +2010-11-19 17:55:36 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: remove remnant of obsolete property + +2010-11-19 15:18:58 +0100 Mark Nauwelaerts + + * tests/check/elements/qtmux.c: + tests: qtmux: also unit test fragmented file cases + +2010-07-30 12:48:29 +0200 Marc-André Lureau + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: allow specifying trak timescale + This is mainly because Smoothstreaming client are broken and don't + take the TimeScale property into account. + +2010-11-19 17:41:41 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + qtmux: include sdtp atoms for ismv fragmented files + Based on patch by Marc-André Lureau + +2010-11-19 19:17:45 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: enable default fragmented file for ismlmux + +2010-09-02 13:58:05 +0200 Marc-André Lureau + + * gst/quicktime/atoms.h: + * gst/quicktime/ftypcc.h: + * gst/quicktime/gstqtmuxmap.c: + * gst/quicktime/gstqtmuxmap.h: + qtmux: add ismlmux, for fragmented isml major brand + +2010-11-19 14:44:45 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: finalize sinkpads list + +2010-07-22 19:40:07 +0200 Marc-André Lureau + + * gst/quicktime/gstqtmux.c: + qtmux: add moov in streamheader + +2010-08-06 13:26:27 +0200 Marc-André Lureau + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: add streamable property to avoid building fragmented mfra index + +2010-11-18 16:48:06 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: add mfra to fragmented file + Based on patch by Marc-André Lureau + +2010-11-15 15:17:59 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: optionally create fragmented file + In this mode, an initial empty moov (containing only stream metadata) is written, + followed by fragments containing actual data (along with required metadata). + New fragments are started either at keyframe (if such are sparse) or when + property configured duration exceeded. + Based on patch by Marc-André Lureau + Fixes #632911. + +2010-11-15 15:12:45 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + qtmux: use helper to set atom flags from given uint + +2010-11-09 16:49:07 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: refactor configuring and sending of moov + Based on patch by Marc-André Lureau + +2010-11-09 15:54:44 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: refactor extra top-level atom handling + Also check a bit more for possible errors, and free proper items in such case. + +2010-11-09 15:01:15 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: refactor slightly using buffer helper + +2010-11-05 13:48:57 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: fix misinforming comment + +2010-11-05 12:08:15 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + qtmux: delegate mvex handling to atoms + ... which keeps qtmux simpler. + +2009-09-28 16:11:35 +0200 Marc-André Lureau + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + qtmux: add mvex/trex in header if fragmented + One "trex" is added per "trak". We don't support default values, + but the "trex" box is mandatory. + +2009-09-28 13:01:30 +0200 Marc-André Lureau + + * gst/quicktime/fourcc.h: + qtmux: add a couple of fourcc for fragmented mp4 + +2010-11-05 11:08:01 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: avoid removing temp file when error occurred + +2009-09-30 17:16:30 +0200 Marc-André Lureau + + * gst/quicktime/gstqtmux.c: + qtmux: truncate buffer file after each send + +2009-09-28 16:53:51 +0200 Marc-André Lureau + + * gst/quicktime/gstqtmux.c: + qtmux: remove temp file when reset/finalize + +2010-10-19 13:43:14 +0300 Stefan Kost + + * gst/quicktime/gstqtmoovrecover.c: + various (gst): add missing G_PARAM_STATIC_STRINGS flags + Canonicalize property names as needed. + +2010-10-13 17:47:29 +0200 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: prevent infinite loop when adjusting framerate + Fixes #632070. + +2010-10-03 23:45:46 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: Add G_PARAM_STATIC_STRINGS + Add G_PARAM_STATIC_STRINGS to qtmux properties + +2010-09-15 17:54:49 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: Follow xmp serialization guidelines closer + qt and isom variants have different ways of serializing + xmp, follow these guidelines. + Those can be found in Adobe's xmp docs. + +2010-08-16 12:36:24 +0200 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: autodetect out-of-order input timestamps and determine DTS accordingly + Favour using input buffer timestamps for DTS, but fallback to using buffer + duration (accumulation) if input ts detected out-of-order. + Fixes #624212. + +2010-07-28 16:15:53 +0200 Marc-André Lureau + + * gst/quicktime/gstqtmux.c: + qtmux: use caps bitrate at last chance + If we didn't get the stream's bitrate from one of the atoms, + try getting it from the caps as a last resort. + https://bugzilla.gnome.org/show_bug.cgi?id=625496 + +2010-07-28 16:12:11 +0200 Marc-André Lureau + + * gst/quicktime/atoms.c: + qtmux: btrt - max bitrate before average + According to iso base media file format, the max bitrate + is before the avg + https://bugzilla.gnome.org/show_bug.cgi?id=625496 + +2010-07-06 14:48:08 +0530 Arun Raghavan + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + qtmux: Write 'btrt' atom for H.264 media if possible + This writes out the optional 'btrt' atom (MPEG4BitrateBox) for H.264 + media if either or both of average and maximum bitrate are available for + the stream. + https://bugzilla.gnome.org/show_bug.cgi?id=623678 + +2010-07-05 14:09:50 +0530 Arun Raghavan + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: Write avg/max bitrate to ESDS if available + This collects the 'bitrate' and 'maximum-bitrate' tags on the + corresponding pad and uses these to populate these fields in the ESDS + where applicable. + https://bugzilla.gnome.org/show_bug.cgi?id=623678 + +2010-07-02 12:45:20 +0200 Edward Hervey + + * gst/quicktime/gstqtmux.c: + qtmux: Don't use bogus codec/format tags + https://bugzilla.gnome.org/show_bug.cgi?id=623365 + +2010-06-25 20:19:20 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: Write uint tags that don't have a complement + Write uint tags that have complements (e.g. track-number/ + track-count) even when we only have one of them available + and set the other one to 0. + Fixes #622484 + +2010-06-21 19:39:54 +0200 Edward Hervey + + * gst/quicktime/gstqtmux.c: + qtmux: Remove the pad from our internal list before calling collectpads + Previously we would end up with the collectpaddata structure already freed. + This would result in a bogus iteration of mux->sinkpads (all the + GstQTPad being freed) and it wouldn't be removed from that list. + Finally, due to it not being removed from that list, we would end up + calling a bogus gst_qt_mux_pad_reset on those structures => SEGFAULT + +2010-05-12 18:50:34 -0700 David Schleef + + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + qtmux: Add VP8 + +2010-05-11 13:15:37 +0100 Tim-Philipp Müller + + * tests/check/pipelines/tagschecking.c: + tests: don't fail tagschecking test if qtdemux is not available or too old + +2010-03-27 09:46:30 +0000 Tim-Philipp Müller + + * gst/quicktime/gstqtmuxplugin.c: + qtmux: use GStreamer package name and origin in the plugin info + +2010-03-23 17:34:30 -0300 Thiago Santos + + * tests/check/pipelines/tagschecking.c: + tests: tagschecking: New tags tests + Adds new tags checking tests. + +2010-03-25 00:20:54 +0000 Tim-Philipp Müller + + * gst/quicktime/gstqtmux.c: + qtmux: init debug category before using it + +2010-03-22 16:56:03 +0100 Benjamin Otte + + * gst/quicktime/atoms.c: + Add -Wold-style-definition + and fix the warnings + +2010-03-22 13:16:33 +0100 Benjamin Otte + + * gst/quicktime/atoms.c: + * gst/quicktime/gstqtmuxmap.h: + * tests/check/elements/qtmux.c: + Add -Wwrite-strings + and fix its warnings + +2010-03-21 21:39:18 +0100 Benjamin Otte + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/atomsrecovery.c: + * gst/quicktime/descriptors.c: + * tests/check/elements/qtmux.c: + * tests/check/pipelines/tagschecking.c: + Add -Wmissing-declarations -Wmissing-prototypes to configure flags + And fix all warnings + +2010-03-18 17:30:26 +0100 Benjamin Otte + + * gst/quicktime/gstqtmoovrecover.c: + * gst/quicktime/gstqtmux.c: + gst_element_class_set_details => gst_element_class_set_details_simple + +2010-03-12 11:28:51 -0300 Thiago Santos + + * tests/check/pipelines/tagschecking.c: + tests: tagschecking: Improvements and new geo-location tests + Makes some improvements to tagschecking.c, making it use + fakesrc instead of videotestsrc and allowing to set input + caps so that more muxers can be used. Previously we could + only use those that accepted raw video caps. + Also adds some tests for geo-location tags + +2010-03-12 10:53:36 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: Use xmp on mp4mux and gppmux too + Do not restrict xmp to qtmux, but use it too + on mp4mux and gppmux + +2010-03-05 13:33:37 -0300 Thiago Santos + + * tests/check/pipelines/tagschecking.c: + check: tagschecking: tests for tags serialization in muxers + Adds a check unit test that aims to test tags serialization + and deserialization consistency (in muxers). It provides a + basic function that allows one to easily specify tags, a + muxer and a demuxer and a test will be done to check if + the tags have been consistently muxed and demuxed + +2010-02-22 16:45:34 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + qtmux: add xmp support + Adds xmp metatags adding to qtmux. + Fixes #609539 + +2010-03-11 17:17:15 +0000 Tim-Philipp Müller + + * gst/quicktime/gstqtmoovrecover.c: + qtmux: fix GST_ELEMENT_ERROR usage + We need to pass (NULL) rather than NULL for empty arguments. + +2010-03-10 10:23:23 -0600 Rob Clark + + * gst/quicktime/gstqtmoovrecover.c: + qtmux: fix compile error + gst/quicktime/gstqtmoovrecover.c:268: warning: format not a string literal and no format arguments + https://bugzilla.gnome.org/show_bug.cgi?id=612454 + +2010-02-22 19:38:15 -0300 Thiago Santos + + * gst/quicktime/gstqtmuxmap.c: + qtmux: Rename 'avc-sample' to 'avc' in caps + Fixes #606662 + +2010-02-26 11:50:25 -0800 Michael Smith + + * gst/quicktime/gstqtmux.c: + qtmux: Take lock around use of (non-threadsafe) tagsetter interface. + +2010-02-22 16:51:00 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + qtmux: write all udta children atoms + UDTA might have META and other children atoms + together, write them all. + +2010-02-22 10:48:11 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: Use internal sink pads list + Due to GstCollectPads sink pads list being not reliably + iteratable (when not inside the collected function) this + patch adds a sink pads list to qtmux to be used when iterating + sink pads on reset function. + Fixes #609055 + +2010-02-16 17:13:09 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + qtmux: prevent leaking hdlr name + +2010-02-16 16:24:12 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + qtmux: support for ALAC + Fixes #580731. + +2010-02-16 14:19:04 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + qtmux: refactor building stsd entry 'wave' extension + +2010-02-08 11:51:52 -0300 Thiago Santos + + * gst/quicktime/atomsrecovery.c: + qtmux: atomsrecovery: Fix compilation problem + Fixes a compilation error due to unused function result. + +2009-12-12 16:07:15 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/atomsrecovery.c: + * gst/quicktime/atomsrecovery.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmoovrecover.c: + * gst/quicktime/gstqtmoovrecover.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + * gst/quicktime/gstqtmuxplugin.c: + qtmux: Adds moov recovery feature + Adds a new property to qtmux that sets a path to a file to write + and update data about the moov atom (that is not writen till the + end of the file). If the pipeline/app crashes during execution it + might be possible to recover the movie using the qtmoovrecover element. + qtmoovrecover is an element that is also a pipeline. It is not + meant to be used with other elements (it has no pads). It is merely + a tool/utilitary to recover unfinished qtmux files. + Fixes #601576 + +2010-01-27 19:06:53 -0800 Michael Smith + + * gst/quicktime/atoms.c: + qtmux: for fixed-sample size streams (PCM audio, etc) don't allocate an enormous buffer that we then won't use at all. + +2010-01-27 15:37:37 -0800 Michael Smith + + * gst/quicktime/gstqtmux.c: + qtmux: handle muxing adpcm correctly. + +2010-01-22 13:36:04 -0800 Michael Smith + + * gst/quicktime/atoms.c: + qtmux: Set the mdia hdlr name field to what quicktime uses. Fix writing it since it's not null-terminated. Improves compatibility with some hardware players. + +2010-01-22 13:30:07 -0800 Michael Smith + + * gst/quicktime/gstqtmux.c: + qtmux: endianness in gstreamer is an int, not boolean. + +2010-01-26 17:54:28 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + qtmux: streamline moov data memory storage + In particular, use arrays rather than (double) linked lists. + +2010-01-26 13:44:04 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: g_free is NULL safe + +2010-01-20 13:30:48 +0100 Benjamin Otte + + * gst/quicktime/descriptors.c: + * gst/quicktime/descriptors.h: + * gst/quicktime/properties.c: + [cleanup] Various style and cleanups + Various fixes for gtk-doc warnings and making functions without + arguments take void as parameter. + +2010-01-14 08:09:03 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/gstqtmux.c: + qtmux: Actually use new caps info on renegotiation + Following the previous qtmux commit, this patch tries + to use the new info added to the caps to fill the 'trak' + atom's fields and children atoms. This way qtmux will + use the late added 'codec_data' when h264parse adds + it in the following pipeline: + videotestsrc num-buffers=200 ! x264enc byte-stream=true ! \ + h264parse output-format=0 ! qtmux ! \ + filesink location=test.mov + +2010-01-13 23:33:51 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/gstqtmux.c: + qtmux: Do caps renegotiation when it only adds fields + Qtmux can accept caps renegotiation if the new caps is a + superset of the old one, meaning upstream added new info to + the caps. This patch still doesn't make qtmux update any + atoms info from the new info, but at least it doesn't + reject the new caps anymore. + A pipeline that reproduces this use case is: + videotestsrc num-buffers=200 ! x264enc byte-stream=true ! \ + h264parse output-format=0 ! qtmux ! \ + filesink location=test.mov + +2010-01-13 19:30:45 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: provide request pads under wider conditions + Fixes #606859. + +2010-01-13 10:35:00 -0300 Thiago Santos + + * gst/quicktime/gstqtmuxmap.c: + qtmux: Only accept avc-sample h264 + qtmux and mp4mux should only accept h264 in avc-sample + format + +2010-01-11 13:13:41 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + Rename aac's stream-format 'none' to 'raw' + Renames aac's stream-format from previous commits from none to + raw + +2010-01-11 10:34:32 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + qtmux: Only accept stream-format='none' aac + Only accept raw aac streams (stream-format=none) to avoid + generating invalid files. + Fixes #604925 + +2009-12-28 11:34:35 +0200 Stefan Kost + + * gst/quicktime/gstqtmux.h: + qtmux: also add .h file changes to unbreak the build + +2009-12-27 23:51:50 +0200 Stefan Kost + + * gst/quicktime/gstqtmux.c: + qtmux: use correct names from template for request pads + The pads where names pad0, pad1, ... + +2009-12-27 23:32:58 +0200 Stefan Kost + + * gst/quicktime/gstqtmux.c: + qtmux: move errors _new_pad to the end + +2009-12-21 13:58:30 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: Accept non-paired uint tags + Adds support for unpaired unsigned interger tags + +2009-12-21 12:05:37 -0300 Thiago Santos + + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + qtmux: Adds new tags + Maps more tags that are already posted by qtdemux + Fixes #599759 + +2009-12-10 22:20:45 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + * gst/quicktime/gstqtmuxmap.c: + qtmux: support more of j2k + Reads the new caps added to qtdemux by commit + c917d65e6df0b5d585f905c7ad78a8a0a44b2cb0 + and adds its corresponding atoms. + Also adds support for image/x-jpc as it is the same + as image/x-jp2, except that the buffers need to be + boxed inside a jp2c isom box before muxing. To solve + this the QTPads now have a function that (if + not NULL) is called when a buffer is collected. This + function returns a replacement to the current collected + buffer. + Fixes #598916 + +2009-12-10 16:53:19 -0300 Thiago Santos + + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: Maps 'classification' tag for 3gpp files + Adds the mapping of 'classification' tags to writing of + 'clsf' atoms for gppmux. + Based on a patch by: Lasse Laukkanen + +2009-12-08 17:59:04 -0800 Michael Smith + + * gst/quicktime/atoms.c: + * gst/quicktime/gstqtmux.c: + qtmux: remove c++ comments and add some more comments. + +2009-12-08 17:55:56 -0800 Michael Smith + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + qtmux: add ima adpcm support + +2009-11-25 21:41:27 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: replace _scale with _scale_round + Use the rounding version for improved sync between streams. + Small variations in the duration when muxing might lead to + cumullative wrong timestamping when demuxing. + Fixes #602936 + +2009-11-24 16:16:56 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: use timestamps for muxing + Try to use timestamps even when the stream has out of order + timestamps, only fall back to durations when we detect an + out of order buffer. Improves sync between streams. + +2009-11-19 18:28:52 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: fix missing debug argument + Adds a missing debug argument + +2009-11-19 11:36:14 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: fix misinforming debug statement + +2009-11-19 11:14:57 +0100 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: ensure writable buffer metadata before setting caps + +2009-10-29 08:36:02 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + qtmux: support for SVQ3 + Adds support for muxing SVQ3 content. Usually this format + has decoder info that must be passed in the 'seqh' field + in the caps. It is also good to add the gama atom to make + quicktime not crash. + Fixes #587922 + +2009-11-17 09:26:05 -0300 Thiago Sousa Santos + + * gst/quicktime/gstqtmux.c: + qtmux: do not leak a string + Frees a string after use. Also does some code organization + +2009-11-16 14:57:53 -0300 Thiago Sousa Santos + + * gst/quicktime/atoms.c: + qtmux: do not add size to the pointer variable + Do not wrongly add the result of the function to the + pointer to the buffer size. Instead, check the result + to see if the serialization was ok. + Based on a patch by: "Carsten Kroll " + Fixes #602106 + +2009-11-06 10:34:39 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: handle 'late' streams + When muxing streams, some can start later than others. qtmux + now handle this by adding an empty edts entry with the + duration of the 'lateness' to the stream's trak. + It tolerates a stream to be up to 0.1s late. + Fixes #586848 + +2009-11-05 21:35:56 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + qtmux: adds the EDTS and ELTS atoms to atoms.c + These atoms will be useful for signaling streams + that start later in the file. As well for adding + edit lists if needed sometime later. + +2009-11-06 00:46:12 -0300 Thiago Santos + + * gst/quicktime/atoms.c: + * gst/quicktime/gstqtmux.c: + qtmux: Adding some ifs for protection + Adding somes ifs to protect against warning conditions + that might happen when upstream element is not sane + Fixes #600895 + +2009-10-16 10:47:32 -0300 Thiago Santos + + * gst/quicktime/ftypcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + * gst/quicktime/gstqtmuxmap.c: + * gst/quicktime/gstqtmuxmap.h: + gppmux: Add support for 3gr6 + Keep track of the chunk durations to be able to add 3gr6 + brand if it is a faststart file and the longest chunk is + smaller than a sec. Implemented according to 3gpp + TS 26.244 v6.4.0 (2005-09) + Fixes #584361 + +2009-10-15 21:11:16 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: Only push ftyp later (in faststart mode) + In faststart mode, there is no need to send the ftyp + right at the beginning of the stream. Waiting and sending it + only later (when the moov atom is ready to be sent) provides + us with more information about the stream and we can better + select the compatible brands. + +2009-10-15 17:51:39 -0300 Thiago Santos + + * gst/quicktime/gstqtmux.c: + qtmux: Improve error message + Improve error message when we can't get or estimate the + timestamp/duration of a buffer + +2009-09-29 15:47:13 +0200 Marc-André Lureau + + * gst/quicktime/atoms.c: + qtmux: fix flags_as_uint to flags[] + +2009-08-04 12:58:35 +0200 Jan Urbanski + + * gst/quicktime/gstqtmux.c: + qtmux: Don't require endianness field for 8 bit raw audio + Fixes bug #590360. + +2009-06-25 08:38:21 +0200 Edward Hervey + + * gst/quicktime/atoms.c: + qtmux: Remove unused variable. + +2009-06-25 08:38:10 +0200 Edward Hervey + + * gst/quicktime/gstqtmux.c: + qtmux: Fix debug statement. + +2009-06-11 15:54:42 +0200 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + qtmux: only use (64-bit) extended (mdat) atom size if needed. Fixes #585319. + +2009-06-10 14:46:14 +0200 Mark Nauwelaerts + + * gst/quicktime/gstqtmux.c: + qtmux: set default movie timescale to microsecond units + +2009-06-10 13:24:20 +0200 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + qtmux: compress/optimize stsc writing + +2009-06-10 12:42:44 +0200 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + qtmux: add 3GP style tagging (and refactor appropriately) + +2009-06-01 23:00:44 +0200 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + qtmux (and variants): handle pixel-aspect-ratio. Fixes #584358. + +2009-06-01 22:42:08 +0200 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/ftypcc.h: + * gst/quicktime/gstqtmuxmap.c: + gppmux: enhance ftyp brand heuristic. Fixes #584360. + +2009-05-28 13:56:10 +0200 Mark Nauwelaerts + + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: + qtmux: use different stsd atom type for H263 for ISO and QT variants + Fixes #584114. + +2009-05-15 01:54:44 -0300 Thiago Santos + + * gst/quicktime/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-10 21:21:36 +0200 Mark Nauwelaerts + + * gst/quicktime/gstqtmuxmap.c: + gppmux: Add MPEG-4 part 2 to supported formats. Fixes #581593. + +2009-05-07 17:53:42 +0100 Christian Schaller + + * gst/quicktime/gstqtmux.c: + Add ranks to various muxers and encoders in -bad + +2009-04-30 14:43:36 -0300 Thiago Santos + + * gst/quicktime/gstqtmuxmap.c: + qtmux: changes caps of src pads to video/quicktime, variant=something + Take a look at bug #580005 for further info. + +2009-04-24 18:53:36 -0300 Thiago Santos + + * gst/quicktime/gstqtmuxmap.c: + mp4mux: Changes src caps to application/x-iso-mp4 + Fixes #580005 + +2009-03-25 21:24:44 +0100 Mark Nauwelaerts + + * gst/quicktime/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-23 11:17:39 +0100 Wim Taymans + + * gst/quicktime/gstqtmux.c: + qtmux: fix includes for lseek + -- + +2009-03-20 14:20:16 +0100 LRN + + * gst/quicktime/gstqtmux.c: + win32: fix seeking in large files + Use _lseeki64() on Windows to seek in large files. + Fixes #576021. + +2009-03-02 10:57:35 +0100 Edward Hervey + + * gst/quicktime/gstqtmux.c: + qtmux: Be a bit more verbose in our debug message when failing to renegotiate + +2009-01-28 13:25:14 +0100 Mark Nauwelaerts + + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmuxmap.c: + Additional media type support in qtmux (and friends). + Support AMR and H263 for both qtmux and gppmux, + and add extensions in sample table description. + +2009-01-09 21:59:48 +0000 David Schleef + + gst/quicktime/gstqtmuxmap.c: Add video/x-qt-part and video/x-m4-part to caps so schroenc/schroparse can use it. Fixes #5... + Original commit message from CVS: + * gst/quicktime/gstqtmuxmap.c: Add video/x-qt-part and video/x-m4-part + to caps so schroenc/schroparse can use it. Fixes #566958 + +2008-12-19 18:53:47 +0000 Mark Nauwelaerts + + gst/quicktime/gstqtmux.c: Do not tempt or suggest to violate gst_collect_pads API specification. + Original commit message from CVS: + * gst/quicktime/gstqtmux.c: (gst_qt_mux_change_state): + Do not tempt or suggest to violate gst_collect_pads API specification. + +2008-12-19 18:33:47 +0000 Mark Nauwelaerts + + gst/quicktime/: Dual license qtmux LGPL/MIT. Fixes #564232. + Original commit message from CVS: + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/descriptors.c: + * gst/quicktime/descriptors.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/ftypcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + * gst/quicktime/gstqtmuxmap.c: + * gst/quicktime/gstqtmuxmap.h: + * gst/quicktime/properties.c: + * gst/quicktime/properties.h: + Dual license qtmux LGPL/MIT. Fixes #564232. + +2008-12-16 16:26:52 +0000 Stefan Kost + + Totally remove the internal taglists and fully use tagsetter. Fixes various tag muxing issues. + Original commit message from CVS: + * ext/celt/gstceltenc.c: + * ext/celt/gstceltenc.h: + * ext/metadata/gstmetadatamux.c: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + Totally remove the internal taglists and fully use tagsetter. Fixes + various tag muxing issues. + +2008-12-01 16:37:45 +0000 Mark Nauwelaerts + + gst/quicktime/atoms.c: Fix mj2 sample description metadata construction. + Original commit message from CVS: + * gst/quicktime/atoms.c: (build_jp2h_extension): + Fix mj2 sample description metadata construction. + +2008-11-18 01:09:09 +0000 David Schleef + + gst/quicktime/gstqtmux.c: Quiet a debugging message that I recently added. + Original commit message from CVS: + * gst/quicktime/gstqtmux.c: Quiet a debugging message that I recently + added. + +2008-11-15 02:56:31 +0000 David Schleef + + gst/quicktime/gstqtmux.*: Use dts from GST_BUFFER_OFFSET_END() for video/x-qt-part. + Original commit message from CVS: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + Use dts from GST_BUFFER_OFFSET_END() for video/x-qt-part. + +2008-11-14 21:24:51 +0000 Mark Nauwelaerts + + gst/quicktime/: Revert previous commit. + Original commit message from CVS: + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/descriptors.c: + * gst/quicktime/descriptors.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/ftypcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + * gst/quicktime/gstqtmuxmap.c: + * gst/quicktime/gstqtmuxmap.h: + * gst/quicktime/properties.c: + * gst/quicktime/properties.h: + Revert previous commit. + +2008-11-14 20:38:18 +0000 Mark Nauwelaerts + + gst/quicktime/: Dual license LGPL/MIT, as apparently supposed to. + Original commit message from CVS: + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/descriptors.c: + * gst/quicktime/descriptors.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/ftypcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + * gst/quicktime/gstqtmuxmap.c: + * gst/quicktime/gstqtmuxmap.h: + * gst/quicktime/properties.c: + * gst/quicktime/properties.h: + Dual license LGPL/MIT, as apparently supposed to. + +2008-11-14 20:17:10 +0000 Mark Nauwelaerts + + gst/quicktime/: Cut detour in sample description extension construction. + Original commit message from CVS: + * gst/quicktime/atoms.c: (build_esds_extension), + (build_mov_aac_extension), (build_jp2h_extension), + (build_codec_data_extension): + * gst/quicktime/atoms.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/gstqtmux.c: (gst_qt_mux_audio_sink_set_caps), + (gst_qt_mux_video_sink_set_caps): + * gst/quicktime/gstqtmuxmap.c: (gst_qt_mux_map_format_to_header): + Cut detour in sample description extension construction. + Also actually implement ISO JPEG2000 mj2 format. + +2008-11-11 19:31:35 +0000 Mark Nauwelaerts + + tests/check/: Add unit test for qtmux. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/qtmux.c: (setup_src_pad), + (teardown_src_pad), (setup_qtmux), (cleanup_qtmux), + (check_qtmux_pad), (GST_START_TEST), (qtmux_suite), (main): + Add unit test for qtmux. + +2008-11-11 19:24:12 +0000 Mark Nauwelaerts + + gst/quicktime/gstqtmux.c: Add some more safety/sanity checks in tag manipulation. + Original commit message from CVS: + * gst/quicktime/gstqtmux.c: (gst_qt_mux_add_metadata_tags): + Add some more safety/sanity checks in tag manipulation. + +2008-11-08 02:00:58 +0000 Thiago Sousa Santos + + Copy qtmux from revision 148 of the gst-qtmux repository. + Original commit message from CVS: + patch by: Thiago Sousa Santos + * configure.ac: + * gst/quicktime/Makefile.am: + * gst/quicktime/atoms.c: + * gst/quicktime/atoms.h: + * gst/quicktime/descriptors.c: + * gst/quicktime/descriptors.h: + * gst/quicktime/fourcc.h: + * gst/quicktime/ftypcc.h: + * gst/quicktime/gstqtmux.c: + * gst/quicktime/gstqtmux.h: + * gst/quicktime/gstqtmuxmap.c: + * gst/quicktime/gstqtmuxmap.h: + * gst/quicktime/properties.c: + * gst/quicktime/properties.h: + Copy qtmux from revision 148 of the gst-qtmux repository. + Fixes #550280. + +2011-04-12 18:25:34 +0100 Tim-Philipp Müller + + * Android.mk: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/inspect/plugin-quicktime.xml: + * gst/qtdemux/LEGAL: + * gst/qtdemux/Makefile.am: + * gst/qtdemux/gstrtpxqtdepay.c: + * gst/qtdemux/gstrtpxqtdepay.h: + * gst/qtdemux/qtatomparser.h: + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + * gst/qtdemux/qtdemux.vcproj: + * gst/qtdemux/qtdemux_dump.c: + * gst/qtdemux/qtdemux_dump.h: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_lang.c: + * gst/qtdemux/qtdemux_lang.h: + * gst/qtdemux/qtdemux_types.c: + * gst/qtdemux/qtdemux_types.h: + * gst/qtdemux/qtpalette.h: + * gst/qtdemux/quicktime.c: + * gst/quicktime/LEGAL: + * gst/quicktime/Makefile.am: + * gst/quicktime/gstrtpxqtdepay.c: + * gst/quicktime/gstrtpxqtdepay.h: + * gst/quicktime/qtatomparser.h: + * gst/quicktime/qtdemux.c: + * gst/quicktime/qtdemux.h: + * gst/quicktime/qtdemux.vcproj: + * gst/quicktime/qtdemux_dump.c: + * gst/quicktime/qtdemux_dump.h: + * gst/quicktime/qtdemux_fourcc.h: + * gst/quicktime/qtdemux_lang.c: + * gst/quicktime/qtdemux_lang.h: + * gst/quicktime/qtdemux_types.c: + * gst/quicktime/qtdemux_types.h: + * gst/quicktime/qtpalette.h: + * gst/quicktime/quicktime.c: + * po/POTFILES.in: + qtdemux: rename directory to quicktime to match plugin name + In preparation for qtmux moving to -good. + +2011-04-12 11:49:54 +0200 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + flvdemux: simplify framerate fraction calculation + +2011-01-24 15:45:28 -0600 Leonardo Sandoval + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + flvdemux: add width, height and framerate to caps when present on onMetaData + Fixes #640483. + +2010-08-24 13:57:55 +0200 Pascal Buhler + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: Unknown SSRC is not fatal + https://bugzilla.gnome.org/show_bug.cgi?id=646966 + +2010-08-24 13:54:58 +0200 Pascal Buhler + + * gst/rtpmanager/rtpsession.c: + rtpsession: Number of active sources should be updated whenever the status of the source changes to active + Forward-ported by Olivier Crête + https://bugzilla.gnome.org/show_bug.cgi?id=646965 + +2010-06-23 11:29:58 +0200 Havard Graff + + * gst/rtpmanager/rtpsession.c: + rtpmanager: ignore a BYE if it is sent with our internal SSRC + https://bugzilla.gnome.org/show_bug.cgi?id=646964 + +2010-01-29 09:49:48 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Adds more h264 fields to its caps + Adds alignment=au and stream-format=avc to h264 caps + Fixes #606662 + +2011-04-11 12:44:19 +0300 Stefan Kost + + * configure.ac: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: also handle deprecations for jack 1.9.7 + Jack 1.9.7 was released 20.Mar.2011, need to handle the deprecated api for this + version too. + +2011-04-10 18:56:52 -0400 Thibault Saunier + + * Android.mk: + * android/NOTICE: + * android/apetag.mk: + * android/avi.mk: + * android/flv.mk: + * android/gst/rtpmanager/gstrtpbin-marshal.c: + * android/gst/rtpmanager/gstrtpbin-marshal.h: + * android/gst/udp/gstudp-enumtypes.c: + * android/gst/udp/gstudp-enumtypes.h: + * android/gst/udp/gstudp-marshal.c: + * android/gst/udp/gstudp-marshal.h: + * android/icydemux.mk: + * android/id3demux.mk: + * android/qtdemux.mk: + * android/rtp.mk: + * android/rtpmanager.mk: + * android/rtsp.mk: + * android/soup.mk: + * android/udp.mk: + * android/wavenc.mk: + * android/wavparse.mk: + * 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/debugutils/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/effectv/Makefile.am: + * gst/equalizer/Makefile.am: + * gst/flv/Makefile.am: + * gst/flx/Makefile.am: + * gst/goom/Makefile.am: + * gst/goom2k1/Makefile.am: + * gst/icydemux/Makefile.am: + * gst/id3demux/Makefile.am: + * gst/imagefreeze/Makefile.am: + * gst/interleave/Makefile.am: + * gst/law/Makefile.am: + * gst/level/Makefile.am: + * gst/matroska/Makefile.am: + * gst/monoscope/Makefile.am: + * gst/multifile/Makefile.am: + * gst/multipart/Makefile.am: + * gst/qtdemux/Makefile.am: + * gst/replaygain/Makefile.am: + * gst/rtp/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/rtsp/Makefile.am: + * gst/shapewipe/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: + * gst/y4m/Makefile.am: + android: Make it ready for androgenizer + Remove the android/ top dir + Fixe the Makefile.am to be androgenized + To build gstreamer for android we are now using androgenizer which generates the needed Android.mk files. + Androgenizer can be found here: http://git.collabora.co.uk/?p=user/derek/androgenizer.git + +2011-04-05 21:14:43 +0200 Haakon Sporsheim + + * gst/rtp/gstrtpgstpay.c: + rtpgstpay: declare frag_offset to hold 32bits. + As specified in documenation above and below. + https://bugzilla.gnome.org/show_bug.cgi?id=646954 + +2011-04-09 12:41:48 +0200 Havard Graff + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: fix wrongly applied patch + Obviously recv_rtp_sink does not have much to do with send_rtcp_src... + See commit 046ff170. + https://bugzilla.gnome.org/show_bug.cgi?id=647263 + +2011-04-08 15:59:58 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstmpegaudioparse.c: + audioparsers: update for set_frame_props -> set_frame_rate API change + +2011-04-08 00:03:21 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + tests: hook up audioparser unit tests + +2011-04-07 18:30:49 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstmpegaudioparse.c: + mpegaudioparse: relax sync match a bit when draining + ... to at least allow initial caps change (but no further caps jitter). + Fixes unit test again after previous change. + +2011-04-07 15:21:10 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + docs: update for changes in git + +2011-04-07 15:20:19 +0100 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-audioparsers.xml: + docs: add audioparsers to docs + +2011-04-07 15:07:15 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstaacparse.h: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstamrparse.h: + * gst/audioparsers/plugin.c: + aacparse, amrparse: gst_fooparse_xyz -> gst_foo_parse_xyz to match GstFooParse + See moving-plugins checklist. + +2011-04-07 14:43:42 +0100 Tim-Philipp Müller + + * configure.ac: + * gst/audioparsers/Makefile.am: + * gst/audioparsers/plugin.c: + audioparsers: hook up to build + +2011-04-07 13:26:41 +0100 Tim-Philipp Müller + + * gst/audioparsers/Makefile.am: + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstaacparse.h: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstac3parse.h: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstamrparse.h: + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstdcaparse.h: + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstflacparse.h: + * gst/audioparsers/gstmpegaudioparse.c: + * gst/audioparsers/gstmpegaudioparse.h: + audioparsers: port to new GstBaseParse in core + +2011-04-04 20:55:39 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstmpegaudioparse.c: + mpegaudioparse: require tighter sync match when draining + +2011-04-01 14:47:43 +0200 Sebastian Dröge + + * gst/audioparsers/gstmpegaudioparse.c: + * gst/audioparsers/gstmpegaudioparse.h: + mpegaudioparse: Parse encoder delay and encoder padding from the LAME header if present + +2011-03-09 23:06:14 +0530 Arun Raghavan + + * gst/audioparsers/plugin.c: + dcaparse: Bump rank to primary+1 + Seems to work fine with a reasonably wide range of media, so bumping + rank. + +2011-03-23 22:02:37 +0530 Arun Raghavan + + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstdcaparse.h: + dcaparse: Expose frame size in caps + This exports the size of the frame (number of bytes from one sync point + to the next) as the "frame_size" field in caps. + +2011-03-09 23:03:10 +0530 Arun Raghavan + + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstdcaparse.h: + dcaparse: Expose block size in caps + This sets the "block_size" field on caps as the number of samples + encoded in one frame. + +2011-03-16 15:53:13 +0000 Tim-Philipp Müller + + * gst/audioparsers/gstmpegaudioparse.c: + mpegaudioparse: add FIXME for making the base class use xing seek tables better + +2011-03-14 18:25:25 +0100 Sebastian Dröge + + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstdcaparse.h: + dcaparse: Add depth and endianness to the caps + Some decoders can only handle specific endianness or a fixed + depth and this allows better negotiation. + Fixes bug #644208. + +2011-02-26 13:53:44 -0800 David Schleef + + * gst/audioparsers/gstaacparse.c: + Revert "aacparse: allow parsed frames on sink pad" + This reverts commit e49b89d5c5a1244fa0dcb8bb4996e38fb9bff9e5. + +2011-02-23 17:25:03 -0800 David Schleef + + * gst/audioparsers/gstaacparse.c: + aacparse: allow parsed frames on sink pad + +2010-10-13 16:12:02 -0700 David Schleef + + * tests/check/elements/parser.c: + tests: fix baseparse test + +2010-10-13 15:39:55 -0700 David Schleef + + * gst/audioparsers/Makefile.am: + * gst/audioparsers/gstaacparse.h: + * gst/audioparsers/gstac3parse.h: + * gst/audioparsers/gstamrparse.h: + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + * gst/audioparsers/gstdcaparse.h: + * gst/audioparsers/gstflacparse.h: + * gst/audioparsers/gstmpegaudioparse.h: + baseparse: Create baseparse library + +2011-02-07 14:46:57 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: tune QUERY_SEEKING response + Even if we currently do not have a duration yet, assume seekable if + it looks like we'll likely be able to determine it later on + (which coincides with needed information to perform seeking). + Fixes #641047. + +2011-02-08 23:39:24 +0530 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + baseparse: Update min/max bitrate before first posting them + This avoids posting an initial min-bitrate of G_UINTMAX and max-bitrate + of 0. + https://bugzilla.gnome.org/show_bug.cgi?id=641857 + +2011-02-08 23:50:13 +0530 Arun Raghavan + + * gst/audioparsers/gstmpegaudioparse.c: + * gst/audioparsers/gstmpegaudioparse.h: + mpegaudioparse: Post CBR bitrate as nominal bitrate + Even if VBR headers are missing, we can't guarantee that a stream is in + fact a CBR stream, so it's safer to let baseparse calculate the average + bitrate rather than assume a CBR stream. However, in order to make + /some/ metadata available before the requisite number of frames have + been parsed, this posts the bitrate from the non-VBR headers as the + nominal bitrate. + https://bugzilla.gnome.org/show_bug.cgi?id=641858 + +2010-09-06 14:10:11 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstamrparse.c: + amrparse: a valid amr-wb frame should not have reserved frame type index + See #639715. + +2011-01-27 16:52:34 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: improve handling of dependent substream frames + In particular, timestamps of these should track main-stream timestamps. + +2011-01-21 14:53:39 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: tune default duration estimate update interval + Rather than a fixed default frame count, estimate frame count to aim for + an interval duration depending on fps if available, otherwise use old + fixed default. + +2011-01-14 15:16:04 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: reverse playback; mind keyframes for fragment boundary + +2011-01-13 15:26:21 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstamrparse.c: + amrparse: properly check for sufficient available data prior to access + +2011-01-12 14:40:37 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: ensure non-empty candidate frames + +2011-01-11 15:24:23 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: clarify some debug statements + +2011-01-11 15:24:02 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: properly track upstream timestamps + ... rather than with a delay. + +2011-01-11 15:23:29 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: need proper frame duration to obtain sensible frame bitrate + +2011-01-11 15:22:51 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: proper initial values for index tracking variables + +2011-01-11 12:05:13 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: arrange for consistent event handling + +2011-01-10 16:59:59 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.h: + baseparse: header style cleaning + +2011-01-10 17:07:38 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: provide some more initial frame metadata in parse_frame + ... and document accordingly. + +2011-01-10 16:56:36 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + * gst/audioparsers/gstflacparse.c: + baseparse: refactor passthrough into format flags + Also add a format flag to signal baseparse that subclass/format can provide + (parsed) timestamp rather than an estimated one. In particular, such "strong" + timestamp then allows to e.g. determine duration. + +2011-01-10 15:34:48 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstmpegaudioparse.c: + baseparse: introduce a baseparse frame to serve as context + ... and adjust subclass parsers accordingly + +2011-01-07 16:39:51 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: restrict duration scanning to pull mode and avoid extra set_caps call + +2011-01-07 15:58:49 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: update some documentation + Also add some more debug. + +2011-01-06 11:41:44 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: allow increasing min_size for current frame parsing only + Also check that subclass actually either directs to skip bytes or + increases expected frame size to avoid going nowhere in bogus + indefinite looping. + +2011-01-14 15:26:37 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baesparse: fix refactor regression in loop based parsing + +2011-01-06 11:16:56 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: pass all available data to subclass rather than minimum + Also reduce some adapter calls and add a few debug statements. + +2010-12-10 15:59:49 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix reverse playback handling + +2010-12-10 14:56:13 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: minor typo and debug statement cleanup + +2010-12-10 14:40:05 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: reduce locking + ... which is either already mute and/or implicitly handled by STREAM_LOCK. + +2011-01-14 14:08:38 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: avoid loop in frame locating interpolation + +2011-01-19 18:26:30 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: mind gst_buffer_unref not liking NULL + Fixes #639950. + +2011-01-14 16:30:11 -0300 Thiago Santos + + * gst/audioparsers/gstbaseparse.c: + audioparsers: baseparse: Be careful to not lose the event ref + Don't unref the event if it hasn't been handled, because the caller + assumes it is still valid and might reuse it. + I ran into this problem when transcoding an AVI (with mp3 inside) + to gpp. + https://bugzilla.gnome.org/show_bug.cgi?id=639555 + +2011-01-13 17:10:13 +0000 Tim-Philipp Müller + + * gst/audioparsers/gstdcaparse.c: + dcaparse: fix sync word for 14-bit little endian coding + Fix copy'n'paste bug that made us look for the raw little endian + sync word twice instead of looking for the 14-bit LE sync word + as well. Fixes parsing of such streams (see #636234 for sample file). + +2011-01-13 16:27:04 +0000 Tim-Philipp Müller + + * gst/audioparsers/gstbaseparse.c: + docs: minor baseparse docs/comment fixes + Remove copy'n'paste leftovers. + +2011-01-06 12:49:43 +0100 Edward Hervey + + * gst/audioparsers/gstflacparse.c: + flacparse: Fix unitialized variable on macosx + +2010-12-13 15:17:29 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: relax bsid checking + ... to the widest possible spec interpretation. + Fixes #637062. + +2010-12-03 18:11:56 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstamrparse.c: + audioparsers: update some documentation + +2010-12-03 18:11:38 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstmpegaudioparse.c: + mpegaudioparse: add to documentation + +2010-12-03 18:11:09 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstdcaparse.c: + dcaparse: add to documentation + +2010-11-08 19:58:31 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: increase keyframe awareness + ... which is not particular relevant for audio parsing, but more so + in video cases. In particular, auto-determine if dealing with video (caps). + +2010-12-01 15:28:53 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstac3parse.h: + ac3parse: use proper EAC-3 caps + +2010-11-30 15:41:02 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: avoid unexpected stray metadata + +2010-11-30 15:40:28 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: use proper _NONE output value when applicable + +2010-11-25 18:56:42 +0100 Edward Hervey + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstbaseparse.c: + audioparsers: Remove dead assignments + +2010-11-25 17:14:23 +0100 Andoni Morales Alastruey + + * gst/audioparsers/gstbaseparse.c: + audioparse: fix possible division-by-zero + https://bugzilla.gnome.org/show_bug.cgi?id=635786 + +2010-11-17 16:23:42 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: use correct offset when adding index entry + ... bearing in mind that BUFFER_OFFSET is media specific and may not + reflect the basic offset after having been parsed. + +2010-11-17 14:30:09 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: enhancements for timestamp marked framed formats + That is, as such formats allow subclass to extract position from frame, + it is possible to extract duration (if not otherwise provided) + from (near) last frame, and a seek can fairly accurately target the required + position. + Fixes #631389. + +2010-11-16 17:06:14 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: refactor frame scanning peformed by _loop + +2010-11-16 18:04:00 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: slightly optimize sending of pending newsegment events + +2010-11-16 17:04:35 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: minor fixes and enhancements + Arrange for upstream as well as downstream flushing when seeking. + Also determine upstream size as well as seekability. Adjust some comments + to reality and employ debug statement in proper order. + +2010-11-17 15:33:36 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + aacparse: minor cleanups + +2010-11-17 15:24:37 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + aacparse: fix regression in ADIF src caps setting + +2010-11-16 12:11:53 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstflacparse.h: + flacparse: parse seektable + Fixes #631389 (partially). + +2010-11-16 12:08:54 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: minor refactor and enable default baseparse segment clipping + +2010-11-09 19:38:25 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstmpegaudioparse.c: + mpegaudioparse: fix silly leak in _reset + +2010-10-29 14:08:58 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: use only upstream duration if it provides one + +2010-10-25 14:15:50 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: reflow update_bitrate code + ... which makes local variables represent real state better, and avoids + triggering unneeded updates/actions. + +2010-10-25 14:13:51 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: add some debug statements + +2010-10-19 23:25:54 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstdcaparse.c: + dcaparse: init variable to make osx build bot happy + gstdcaparse.c: In function 'gst_dca_parse_check_valid_frame': + gstdcaparse.c:246: warning: 'best_sync' may be used uninitialized in this function + +2010-10-19 00:15:20 +0100 Tim-Philipp Müller + + * gst/audioparsers/Makefile.am: + * gst/audioparsers/gstdcaparse.c: + * gst/audioparsers/gstdcaparse.h: + * gst/audioparsers/plugin.c: + audioparsers: add very basic dts/dca parser + Still some issues, e.g. with seekable queries in totem, but also + processing already-chunked input (created with matroskademux ! gdppay). + +2010-10-14 16:48:21 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: properly parse e-ac3 frame header + Also add a few debug statements. + +2010-10-13 11:00:01 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: tweak setting buffer metadata; avoid timestamp jitter + Fixes #631993. + +2010-10-12 18:07:49 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstaacparse.h: + aacparse: streamline src caps setting + In particular, also set src caps whenever changes in stream warrant doing so. + +2010-10-12 10:28:33 +0200 Sebastian Dröge + + * tests/check/elements/flacparse.c: + flacparse: Adjust unit tests to new flacparse behaviour + Garbage after frames is now included in the frames because flacparse + has no easy way to detect the real end of a frame. Decoders are + expected to everything after the frame because only decoding the + bitstream will reveal the real end of the frame. + Fixes bug #631814. + +2010-10-12 10:27:53 +0200 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + flacparse: Don't drop the last frame if it is followed by garbage + See bug #631814. + +2010-10-11 17:49:46 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: perform bitrate handling and posting after newsegment sending + +2010-10-11 17:36:19 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: immediately post subclass provided bitrate + +2010-10-11 17:06:48 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: fix parsing with unknown framesizes + Fixes #631814 (mostly). + +2010-10-07 23:37:36 +0200 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + flacparse: Simplify frame header parsing by using lookup tables + Based on a patch by Felipe Contreras. + See bug #631200. + +2010-10-07 23:28:08 +0200 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstflacparse.h: + flacparse: Don't parse the complete FLAC frames but only look for valid frame headers + Thanks to Felipe Contreras for the suggestion. This is partially + based on his patches and makes flacparse more than 3.5 times faster. + Looking for valid frame headers is unlikely to give false positives + because every frame header is at least 9 bytes long, contains a + 14 bit sync code and a 8 bit checksum over the first 8 bytes. + Fixes bug #631200. + +2010-10-06 18:32:51 +0200 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + flacparse: Really post tags only after the initial newsegment event + The first newsegment event will be send by the first call to + gst_base_parse_push_buffer() if necessary, posting the tags + before that is not a good idea. Instead do it from the + GstBaseParse::pre_push_buffer vfunc. + +2010-10-05 11:17:52 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstbaseparse.c: + Revert "baseparse: add skip property" + This reverts commit b5a3d60363d837a10f0533c141ec93d10b742312. + Reverting this for now, since no one really seems to remember why this + property exists or what it could possibly be good for. It seems to have + been in the original mp3parse since the beginning of time and was back- + ported from there. + +2010-10-04 10:41:52 +0200 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + flacparse: Fix uninitialized variable compiler warnings + These warnings are wrong, the variables are only used if they were + initialized by the bit reader. + +2010-09-14 02:48:58 +0300 Felipe Contreras + + * gst/audioparsers/gstflacparse.c: + flacparse: fix picture parsing + Signed-off-by: Felipe Contreras + +2010-10-03 23:54:49 +0200 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + flacparse: Push tags before the header buffers are pushed + +2010-08-02 20:50:21 +0300 Felipe Contreras + + * gst/audioparsers/gstflacparse.c: + flacparse: trivial caps fix + Signed-off-by: Felipe Contreras + +2010-10-03 23:50:29 +0200 Sebastian Dröge + + * gst/audioparsers/gstbaseparse.c: + audioparser: Let the format string agree with the parameters to fix compiler warning + +2010-10-03 15:41:20 +0200 Sebastian Dröge + + * gst/audioparsers/gstac3parse.c: + ac3parse: Use unchecked versions of the bitreader get functions + We didn't check the return values anyway... + +2010-09-22 15:44:43 +0530 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + baseparse: Fix debug output + We lose the reference to the buffer after gst_pad_push(), so the debug + print should happen before. + https://bugzilla.gnome.org/show_bug.cgi?id=622276 + +2010-10-01 12:34:55 +0200 Mark Nauwelaerts + + * tests/check/elements/flacparse.c: + * tests/check/elements/parser.c: + * tests/check/elements/parser.h: + audioparsers: add flacparse unit test + ... and tweak parser test helper in the process. + +2010-09-29 16:12:42 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: support reverse playback + ... in pull mode or upstream driven. + +2010-09-27 12:16:43 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: remove done TODOs and update documentation + +2010-09-25 14:40:54 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: use determined seekability in answering SEEKING query + +2010-09-25 14:32:06 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: add skip property + +2010-09-25 13:59:39 +0200 Mark Nauwelaerts + + * tests/check/elements/ac3parse.c: + * tests/check/elements/mpegaudioparse.c: + audioparsers: add ac3parse and mpegaudioparse unit test + +2010-09-25 13:59:18 +0200 Mark Nauwelaerts + + * gst/audioparsers/Makefile.am: + * gst/audioparsers/gstmpegaudioparse.c: + * gst/audioparsers/gstmpegaudioparse.h: + * gst/audioparsers/plugin.c: + mpegaudioparse: initial version + ... adequately equivalent to mp3parse, so lets boldly set it + to higher rank. + +2010-09-25 14:01:07 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + aacparse: set minimum frame size at _start + ... rather than one time at _init. + +2010-09-25 13:50:51 +0200 Mark Nauwelaerts + + * tests/check/elements/aacparse.c: + * tests/check/elements/amrparse.c: + * tests/check/elements/parser.c: + * tests/check/elements/parser.h: + audioparsers: refactor existing unit tests using common helper + +2010-09-22 15:07:09 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: use _set_frame_props to configure frame lead_in and lead_out + ... provided a corresponding decoder with sufficient leading and following + frames to carry out full decoding for a particular segment. + +2010-09-22 14:13:17 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + * gst/audioparsers/gstflacparse.c: + baseparse: use _set_duration to configure duration update interval + ... as it logically belongs there as one or the other; either subclass + can provide a duration, or an estimate must be made (reguarly updated). + +2010-09-22 13:55:20 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: localize use of provided fps information + +2010-09-22 12:13:12 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: seek table and accurate seek support + +2010-09-21 13:57:10 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: proper and more extended segment and seek handling + That is, loop pause handling, segment seek support, newsegment for gaps, etc + +2010-09-21 10:57:04 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: add index support + +2010-09-21 09:59:56 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: refactor state reset + +2010-09-20 16:39:37 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: prevent indefinite resyncing + +2010-09-20 13:57:55 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: specific EOS handling if no output so far + +2010-09-20 13:31:57 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: adjust _set_frame_prop documentation and set default as claimed + +2010-09-20 13:30:54 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix bitrate copy-and-paste and update heuristic + +2010-09-17 18:33:29 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: post duration message if average bitrates is updated + +2010-09-17 18:24:22 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: remove is_seekable vmethod and use a set_seek instead + Seekability, like duration, etc is unlikely to change (frequently), and + the default assumption covers most cases, so let subclass set when needed. + At the same time, allow subclass to indicate if it has seek-metadata (table) + available, and possibly have it provide an average bitrate. + +2010-09-17 17:35:40 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: remove redundant default is_seekable + +2010-09-17 17:21:46 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: add another hook for subclass prior to pushing buffer + ... and allow subclass to perform custom segment clipping, or to + emit tags or messages at this time. + +2010-09-17 17:19:37 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: 0 converts to 0 by default + +2010-09-16 18:56:46 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + basepase: refactor conversion using helper function and export default convert + +2010-09-16 18:35:47 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: streamline query handling + +2010-09-16 11:51:20 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: cleanup struct and remove unused member + +2010-08-16 11:04:37 +0200 Mark Nauwelaerts + + * gst/audioparsers/plugin.c: + audioparsers: increase ranks to enable auto-plugging + Because we can, and should, have some shakedown testing before having + these make it into -good later on ... + +2010-09-22 16:07:24 +0530 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + baseparse: Allow chaining of subclass event handlers + This allows the child class to chain its event handler with + GstBaseParse, so that subclasses don't have to duplicate all the default + event handling logic. + https://bugzilla.gnome.org/show_bug.cgi?id=622276 + +2010-08-27 18:35:10 +0200 Sebastian Dröge + + * gst/audioparsers/gstbaseparse.c: + baseparse: Don't use GST_FLOW_IS_FATAL() + Also don't post an error message for UNEXPECTED and do it + for NOT_LINKED. + +2010-09-06 14:12:00 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: non-TIME seek event is simply not handled + +2010-06-15 15:34:05 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix seek event ref handling + +2010-06-15 15:33:37 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: prevent arithmetic overflows in pull mode buffer cache handling + +2010-06-15 15:32:34 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix seek handling + Allow a few more seek event type combinations, and really use the result + of gst_segment_set_seek to perform the seek. Also add some debug. + +2010-04-12 18:07:29 +0200 Edward Hervey + + * tests/check/elements/aacparse.c: + * tests/check/elements/amrparse.c: + check: Don't re-declare 'GList *buffers' in the tests + It's an external which lives in gstcheck.c. Redeclaring it makes some + compilers/architectures think the 'buffers' in the individual tests are + a different symbol... and therefore we end up comparing holodecks with + oranges. + +2010-03-26 18:56:49 +0000 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + baseparse: Don't emit bitrate tags too early + We wait to parse a minimum number of frames (10, arbitrarily) before + emiting bitrate tags so that our early estimates are not wildly + inaccurate for streams that start with a silence. If the stream ends + before that, we just emit the tags anyway. + While it _would_ be nicer to be specify the threshold to start pushing + the tags in terms of duration, this would introduce more complexity than + this merits. + https://bugzilla.gnome.org/show_bug.cgi?id=614991 + +2010-03-26 18:58:35 +0100 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstflacparse.h: + flacparse: Optionally check the overall frame checksums too before accepting a frame as valid + This is optional because it's a quite expensive operation and it's very + unlikely that a non-frame is detected as frame after the header CRC check + and checking all bits for valid values. The overall frame checksums are + mainly useful to detect inconsistencies in the encoded payload. + +2010-03-26 18:42:28 +0100 Sebastian Dröge + + * gst/audioparsers/gstflacparse.c: + flacparse: Check the CRC-8 of the headers before accepting a frame as valid + This makes false-positives during seeking much less likely and detection of + them much faster. + +2010-03-26 18:20:24 +0100 Sebastian Dröge + + * gst/audioparsers/gstbaseparse.c: + baseparse: Set the last stop to the buffer starttime if the duration is invalid + ...instead of not setting it at all. + +2010-03-26 18:19:00 +0100 Joshua M. Doe + + * gst/audioparsers/gstbaseparse.c: + baseparse: Send NEWSEGMENT event with correct start and position + Instead of taking the last stop (which could be buffer endtime instead + of starttime) always take the buffer starttime. + Fixes bug #614016. + +2010-03-26 16:49:01 +0000 Arun Raghavan + + * gst/audioparsers/gstflacparse.c: + flacparse: Fix buffer refcount issue + When called from the GST_FLAC_PARSE_STATE_HEADERS case, + gst_flac_parse_hand_headers() does a gst_buffer_set_caps() on a buffer + with refcount > 1. This change handles this case by making the buffer + metadata_Writable. + https://bugzilla.gnome.org/show_bug.cgi?id=614037 + +2010-03-25 17:09:17 +0000 Tim-Philipp Müller + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + audioparsers: remove unused GstBaseParseClassPrivate structure + +2010-03-25 12:55:02 +0000 Arun Raghavan + + * gst/audioparsers/gstflacparse.c: + flacparse: Make bitrate estimation more accurate + This implements the get_frame_overhead() vfunc so that baseparse can + make more accurate bitrate estimates. + +2010-03-25 11:48:46 +0000 Arun Raghavan + + * gst/audioparsers/gstaacparse.c: + aacparse: Fix bitrate calculation + This patch adds the get_frame_overhead() vfunc so that baseparse can + accurately calculate the min/avg/max bitrates for aacparse. + Note: The bitrate was being incorrectly calculated for ADTS streams + (it's not in the header as the code suggests). + +2010-03-25 11:22:58 +0000 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + audioparsers: Add bitrate calculation to baseparse + This makes baseparse keep a running average of the stream bitrate, as + well as the minimum and maximum bitrates. Subclasses can override a + vfunc to make sure that per-frame overhead from the container is not + accounted for in the bitrate calculation. + We take care not to override the bitrate, minimum-bitrate, and + maximum-bitrate tags if they have been posted upstream. We also + rate-limit the emission of bitrate so that it is only triggered by a + change of >10 kbps. + +2010-03-22 16:56:03 +0100 Benjamin Otte + + * tests/check/elements/amrparse.c: + Add -Wold-style-definition + and fix the warnings + +2010-03-21 21:39:18 +0100 Benjamin Otte + + * tests/check/elements/aacparse.c: + * tests/check/elements/amrparse.c: + Add -Wmissing-declarations -Wmissing-prototypes to configure flags + And fix all warnings + +2010-03-18 17:30:26 +0100 Benjamin Otte + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstamrparse.c: + gst_element_class_set_details => gst_element_class_set_details_simple + +2010-01-14 11:50:33 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + audioparsers: rename baseparse GType name to avoid possible conflicts + +2010-01-12 18:55:53 +0100 Edward Hervey + + * gst/audioparsers/gstflacparse.c: + flacparse: Initialize variables. + Fixes build on $#@*( macosx + +2010-01-11 22:41:57 +0300 Ðóñëàí Èæáóëàòîâ + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstamrparse.c: + win32: Include config.h before anything else. Fix mpegdemux LIBADD + Because config.h defines __MSVCRT_VERSION__, which should be defined + before inclusion of any system header. + Also fixes mpegdemux Makefile.am LIBADD typo. + Fixes #606665 + +2010-01-11 13:20:26 -0300 Thiago Santos + + * gst/audioparsers/gstaacparse.c: + aacparse: Also add stream-format to template caps + Do not forget to add stream-format to template caps + off aacparse + +2010-01-11 13:13:41 -0300 Thiago Santos + + * gst/audioparsers/gstaacparse.c: + * tests/check/elements/aacparse.c: + Rename aac's stream-format 'none' to 'raw' + Renames aac's stream-format from previous commits from none to + raw + +2010-01-11 12:10:02 -0300 Thiago Santos + + * tests/check/elements/aacparse.c: + aacparse: update tests to stream-format changes + Updates aacparse unit tests to check for stream-format + correctness as well. + +2010-01-11 10:51:18 -0300 Thiago Santos + + * gst/audioparsers/gstaacparse.c: + aacparse: Add stream-format to output caps + Adds stream-format field to output caps + +2010-01-05 15:05:05 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstbaseparse.c: + audioparsers: documentation fixes + +2010-01-05 15:04:38 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: add documentation + +2010-01-05 14:48:49 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstflacparse.h: + flacparse: add documentation + +2009-12-21 18:29:43 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: perform additional frame checks when resyncing + +2010-01-05 16:35:52 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: fix (multiple channel) frame parsing + +2010-01-05 16:35:44 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: declare unparsed input and parsed output + +2009-12-21 18:19:23 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: fix scanning for next syncword + +2009-12-21 18:18:39 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: adjust seek handling and newsegment sending + Perform sanity check on type of seek, and only perform one that is + appropriately supported. Adjust downstream newsegment event + to first buffer timestamp that is sent downstream. + +2009-12-21 11:59:45 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: minor refactor cleanup + Also add some debug logging. + +2009-12-18 21:05:11 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: locate next sync code more efficiently + +2009-12-18 21:04:12 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: baseparse takes care of handling leftover pieces + +2009-12-18 21:02:40 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: implement leftover draining in pull mode + +2009-12-17 12:45:36 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstflacparse.c: + flacparse: set _OFFSET and _OFFSET_END on outgoing buffers + +2009-12-17 12:44:20 +0100 Mark Nauwelaerts + + * gst/audioparsers/Makefile.am: + * gst/audioparsers/gstflacparse.c: + * gst/audioparsers/gstflacparse.h: + * gst/audioparsers/plugin.c: + audioparsers: move 'flacparse' into it + +2009-12-16 18:38:33 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: provide default conversion using bps if no fps available + Also store estimated duration as such, rather than pretending otherwise + (e.g. set by subclass). + +2009-12-18 13:30:29 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: check for remaining data when draining in push mode + +2009-12-18 13:30:07 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix pull mode cache size comparison + +2009-12-18 13:01:17 +0100 Edward Hervey + + * gst/audioparsers/gstac3parse.c: + ac3parse: Fix unitialized variable. + +2009-12-17 14:46:01 +0000 Christian Schaller + + * gst/audioparsers/Makefile.am: + Update spec file and fix ac3parser header listing in Makefile.am + +2009-12-11 10:25:16 -0800 Michael Smith + + * gst/audioparsers/gstbaseparse.c: + audioparse: fix a format string as reported on irc. + +2009-11-23 16:34:50 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: ensure sufficient data available for parsing + +2009-10-29 15:19:04 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: extract and use some more details for Enhanced Ac-3 streams + +2009-10-29 15:18:37 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: custom bufferflag indicates not to count frame in stats + +2009-10-28 14:08:43 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: perform additional frame checks when resyncing + +2009-10-28 14:07:17 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: inform base parser of frame duration + +2009-10-27 16:16:50 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstac3parse.c: + ac3parse: improve src caps settings + +2009-11-27 17:59:03 +0100 Mark Nauwelaerts + + * gst/audioparsers/Makefile.am: + * gst/audioparsers/gstac3parse.c: + * gst/audioparsers/gstac3parse.h: + * gst/audioparsers/plugin.c: + ac3parse: initial version + MARGINAL rank for now; might take some time for some (useful) + framed=true/false to appear here and there. + +2009-11-26 18:34:45 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstamrparse.h: + amrparse: use (default) time handling of baseparser class + +2009-11-26 18:15:21 +0100 Mark Nauwelaerts + + * gst/audioparsers/Makefile.am: + * gst/audioparsers/gstamrparse.c: + * gst/audioparsers/gstamrparse.h: + * gst/audioparsers/plugin.c: + audioparsers: move 'amrparse' into it + +2009-11-27 17:27:32 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + audioparsers: reference GstBaseParse now lives here + +2009-11-28 18:13:31 +0100 Mark Nauwelaerts + + * gst/aacparse/Makefile.am: + * gst/aacparse/gstaacparse.c: + * gst/aacparse/gstaacparse.h: + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + * gst/aacparse/plugin.c: + * gst/audioparsers/Makefile.am: + * gst/audioparsers/gstaacparse.c: + * gst/audioparsers/gstaacparse.h: + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + * gst/audioparsers/plugin.c: + audioparsers: rename 'aacparse' plugin to generic 'audioparsers' plugin + +2009-11-26 17:04:43 +0100 Mark Nauwelaerts + + * gst/aacparse/Makefile.am: + * gst/aacparse/gstaacparse.c: + * gst/aacparse/plugin.c: + aacparse: separate plugin registration and rename plugin + +2009-11-26 17:04:36 +0100 Mark Nauwelaerts + + * gst/aacparse/gstaacparse.c: + aacparse: ensure sufficient data available before accessing + +2009-11-05 14:31:40 +0100 Mark Nauwelaerts + + * gst/aacparse/gstaacparse.c: + * gst/aacparse/gstaacparse.h: + aacparse: use (default) time handling of baseparser class + +2009-10-29 15:19:35 +0100 Mark Nauwelaerts + + * gst/aacparse/gstaacparse.c: + aacparse: fixup comments to C-style + +2009-10-29 16:05:00 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: reset passthrough mode to default (disabled) on activation + +2009-10-29 15:16:59 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: ensure buffer metadata is writable + +2009-10-28 14:06:13 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + baseparse: fix/enhance DISCONT marking + In particular, consider DISCONT == !sync, and allow subclass to query + sync state, as it may want to perform additional checks depending + on whether sync was achieved earlier on. + Also arrange for subclass to query whether leftover data is being drained. + +2009-11-23 15:48:25 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + baseparse: add timestamp handling, and default conversion + In particular, (optionally) provide baseparse with a notion of frames per second + (and therefore also frame duration) and have it track frame and byte counts. + This way, subclass can provide baseparse with fps and have it provide default + buffer time metadata and conversions, though subclass can still install + callbacks to handle such itself. + +2009-10-28 12:02:03 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: documentation fixes + +2009-10-28 12:00:08 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: use_fixed_caps for src pad + After all, stream is as-is, and there is little molding to downstream's + taste that can be done. If subclass can and wants to do so, it can + still override as such. + +2009-11-20 17:32:13 +0100 Julien Moutte + + * gst/aacparse/gstbaseparse.c: + aacparse: Fix compilation warnings + +2009-10-11 11:22:11 +0200 Josep Torra + + * gst/aacparse/gstaacparse.c: + * gst/aacparse/gstbaseparse.c: + aacparse: fix warnings in macosx snow leopard + +2009-09-25 17:02:53 +0200 Mark Nauwelaerts + + * gst/aacparse/gstaacparse.c: + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + aacparse: forego (bogus) parsing of already parsed (raw) input + +2009-08-07 13:07:17 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: prevent infinite loop when draining + +2009-08-07 13:06:28 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: fix minor memory leak + +2009-07-14 14:08:04 +0200 Sebastian Dröge + + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + aacparse: Add function for the baseparse subclass to push buffers downstream + Also handle the case gracefully where the subclass decides to drop + the first buffers and has no caps set yet. It's still required to + have valid caps set when the first buffer should be passed downstream. + +2009-07-14 14:07:44 +0200 Sebastian Dröge + + * gst/aacparse/gstbaseparse.c: + baseparse: Fix seek event leaking + +2009-06-18 12:13:28 +0200 Mark Nauwelaerts + + * gst/aacparse/gstaacparse.c: + aacparse: ADIF: do not send bogus timestamps, leave to downstream (decoder) + +2009-06-01 15:53:27 +0100 Tim-Philipp Müller + + * gst/aacparse/gstaacparse.c: + aacparse: fix sample rate extraction from codec data + In one case we extracted the sample rate index from the codec data + and saved it as sample rate rather than getting the real sample + rate from the table. Fix that, and also make sure we don't access + non-existant table entries by adding a small helper function that + guards against out-of-bounds access in case of invalid input data. + +2009-06-01 14:02:33 +0100 Tim-Philipp Müller + + * gst/aacparse/gstaacparse.c: + aacparse, amrparse: remove bogus gst_pad_fixate_caps() calls + +2009-06-01 13:56:18 +0100 Tim-Philipp Müller + + * gst/aacparse/gstbaseparse.c: + baseparse: propagate return value of GstBaseParse::set_sink_caps() + gst_base_parse_sink_setcaps() presumably should fail if the subclass + returns FALSE from its ::set_sink_caps() function. + +2009-06-01 13:47:01 +0100 Tim-Philipp Müller + + * gst/aacparse/gstbaseparse.c: + baseparse: don't try to GST_LOG an already-freed caps string + The proper way to log caps is via GST_PTR_FORMAT anyway. + +2009-06-01 13:05:35 +0100 Tim-Philipp Müller + + * gst/aacparse/gstaacparse.c: + * tests/check/elements/aacparse.c: + aacparse: set channels and rate on output caps, and keep codec_data + Create output caps from input caps, so we maintain any fields we + might get on the input caps, such as codec_data or rate and channels. + Set channels and rate on the output caps if we don't have input caps + or they don't contain such fields. We do this partly because we can, + but also because some muxers need this information. Tagreadbin will + also be happy about this. + +2009-05-26 19:43:53 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: fix debug category + +2009-04-27 22:39:15 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: fix (regression in) newsegment handling + (aacparse, amrparse, flacparse). Fixes #580133. + +2009-04-07 04:53:02 +0300 René Stadler + + * gst/aacparse/gstbaseparse.c: + baseparse: Fix slightly broken buffer-in-segment check (aacparse, amrparse, flacparse) + +2009-04-05 03:50:19 +0300 René Stadler + + * gst/aacparse/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-03-31 16:07:46 +0200 Mark Nauwelaerts + + * gst/aacparse/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-19 01:17:25 +0200 René Stadler + + * 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 + + * gst/aacparse/gstaacparse.c: + aacparse: Refactor check_valid_frame to expose broken code + Just moving code around and removing an unhelpful/misleading comment. + +2009-02-27 11:24:37 +0200 Stefan Kost + + * gst/aacparse/gstbaseparse.c: + baseparse: revert last change and properly fix + Baseparse internaly breaks the semantics of a _chain function by calling it with + buffer==NULL. The reson I belived it was okay to remove it was that there is + also an unchecked access to buffer later in _chain. Actually that code is wrong, + as it most probably wants to set discont on the outgoing buffer. + +2009-02-26 11:02:06 +0200 Stefan Kost + + * gst/aacparse/gstbaseparse.c: + baseparse: remove checks for buffer==NULL + Accordifn to docs for GstPadChainFunction buffer cannot be NULL. If we would + leave the check, we would also need more such check below. + +2009-02-11 00:15:43 +0200 René Stadler + + * gst/aacparse/gstaacparse.c: + aacparse: Fix license specified in plugin details. + +2009-01-30 18:18:10 +0000 Jan Schmidt + + * gst/aacparse/gstbaseparse.c: + Fix the return value of the default parse_frame function. + Fix the return value of the default parse_frame function in both + copies of GstBaseParse + +2009-01-23 16:00:10 +0200 Stefan Kost + + * gst/aacparse/gstaacparse.c: + Log aac details found in codec_data. + +2008-11-13 17:24:58 +0000 Wim Taymans + + gst/aacparse/gstaacparse.c: Don't autoplug aacparse until it works. + Original commit message from CVS: + * gst/aacparse/gstaacparse.c: (plugin_init): + Don't autoplug aacparse until it works. + +2008-11-13 15:20:15 +0000 Stefan Kost + + tests/check/: Add unit tests for new parsers. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/aacparse.c: + * tests/check/elements/amrparse.c: + Add unit tests for new parsers. + +2008-11-13 14:21:39 +0000 Stefan Kost + + gst/: Fix baseparse type name. + Original commit message from CVS: + * gst/aacparse/gstbaseparse.c: + * gst/amrparse/gstbaseparse.c: + Fix baseparse type name. + +2008-11-13 12:59:34 +0000 Stefan Kost + + Add two new baseparse based parsers (aac and amr) from Bug #518857. + Original commit message from CVS: + * configure.ac: + * gst/aacparse/Makefile.am: + * gst/aacparse/gstaacparse.c: + * gst/aacparse/gstaacparse.h: + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + * gst/amrparse/Makefile.am: + * gst/amrparse/gstamrparse.c: + * gst/amrparse/gstamrparse.h: + * gst/amrparse/gstbaseparse.c: + * gst/amrparse/gstbaseparse.h: + Add two new baseparse based parsers (aac and amr) from Bug #518857. + +2011-03-20 01:08:38 +0100 Havard Graff + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: Make src_query MT-safe + It is possible that the element might be going down while the event arrives + +2011-04-08 15:22:47 +0200 Sebastian Dröge + + * ext/jpeg/gstjpegdec.c: + jpegdec: Unref event if the parent element disappeared + +2011-04-08 15:22:19 +0200 Sebastian Dröge + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: Unref event if the parent element disappeared + +2011-03-21 16:04:34 +0100 Havard Graff + + * ext/jpeg/gstjpegdec.c: + jpegdec: Make upstream events MT-safe + +2011-03-21 16:04:34 +0100 Havard Graff + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: Make upstream events MT-safe + +2011-04-08 15:20:51 +0200 Sebastian Dröge + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + rtp: Unref events if the parent element disappeared + +2011-01-06 18:24:36 +0100 Ole André Vadla RavnÃ¥s + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpmanager: fix pad callbacks so they handle when parent goes away + 1) We need to lock and get a strong ref to the parent, if still there. + 2) If it has gone away, we need to handle that gracefully. + This is necessary in order to safely modify a running pipeline. Has been + observed when a streaming thread is doing a buffer_alloc() while an + application thread sends an event on a pad further downstream, and from + within a pad probe (holding STREAM_LOCK) carries out the pipeline plumbing + while the streaming thread has its buffer_alloc() in progress. + +2010-11-26 15:20:04 +0100 Havard Graff + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: make iterate_internal_links MT-safe + +2011-04-08 14:35:04 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + Revert "Pulsesink: Allow chunks up to bufsize instead of segsize" + This reverts commit 1e2c1467ae042a3c6bb1a6bc0c07aeff13ec5edb. + The commit causes pulsesink to ignore the latency-time baseaudiosink property. + +2011-04-08 11:13:07 +0200 Alexey Fisher + + * gst/rtp/gstrtpspeexpay.c: + rtpspeexpay: Do not transmitt samples with GAP flag + If we get GAP samples, there is no need to transmitt it. + In some situations, microphone is muted, we can drop net traffick + usage to ~1 kbit/s. Without patch it will stay ~20 kbit/s + +2011-04-08 11:11:58 +0200 Alexey Fisher + + * ext/speex/gstspeexenc.c: + speexenc: Use speex intern silence detection + Speex has build in silence detection. If speex_encode_int returns 0, + than there is silence and sample do not need to be transmitted. + This work only if vbr=1 and dtx=1 optionas are enabled. + So if we get 0, we add GAP flag to the sample. + +2011-04-05 17:12:28 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: handle * control correctly + Parse session control attributes when no media control attribute is + present. Threat * control attributes as an empty string, just like the + spec says. + Fixes #646800 + +2011-04-05 14:28:54 +0200 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + matroskamux: Add support for A-Law and µ-Law + Fixes bug #646567. + +2011-04-05 09:44:01 +0200 Jon Nordby + + * configure.ac: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: Fix build with jack 0.120.1 + 9544622674c0d0a3147a9b51145159b02eec68e9 checked + for 0.120.2 and later, but the deprecation was introduced in + 0.120.1 + +2011-04-05 12:05:19 +0300 Stefan Kost + + * sys/v4l2/gstv4l2radio.h: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2xoverlay.c: + docs: fix docuemntation warnings (and reindent) + +2011-04-04 17:34:17 +0200 Alessandro Decina + + * gst/videomixer/blendorc-dist.c: + * gst/videomixer/blendorc-dist.h: + videomixer: update orc dist files + +2011-04-04 15:57:10 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 1ccbe09 to c3cafe1 + +2011-03-01 14:08:12 +0530 Arun Raghavan + + * ext/pulse/pulsesink.c: + pulsesink: Always call pa_stream_new_with_proplist() + pa_stream_new_with_proplist() can take a NULL proplist, so we don't need + to concern ourselves with whether it's NULL or not. + +2011-04-04 11:33:10 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: perform post-flush state tricks downstream to upstream + ... so downstream is set when upstream resumes data flow. + +2011-04-04 11:27:29 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: distribute new base_time to manager children following flush seek + ... by forcing a state changed to PLAYING, which should otherwise be a + no-op as elements should already be in that state. + In particular, jitterbuffer needs new base_time as soon as possible to perform + proper timing (e.g. eos timeout handling) and can't wait for the new base_time + that will be distributed when the whole pipeline returns to PLAYING. + See bug #646397. + +2011-04-04 11:35:59 +0200 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpjitterbuffer.c: + Revert "jitterbuffer: reset element base_time upon flush" + This reverts commit f84b8a69cba9c538f5546869cb4ef454ad5efb9d. + Fixes bug #646397. + +2011-04-04 10:31:44 +0100 Zaheer Abbas Merali + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvmux.c: + flv: Specify the only possible stream-format for h264 in the pad templates. + +2011-04-04 10:07:42 +0200 Sebastian Dröge + + * gst/qtdemux/qtdemux.c: + qtdemux: Check for invalid (empty) classification info entity strings + Otherwise the classification string can be empty and gst_tag_list_add() will + complain or have a \0 in the first four bytes, which is wrong too. + +2011-04-04 10:01:26 +0200 Sebastian Dröge + + * gst/qtdemux/qtdemux.c: + qtdemux: Year 0 is not a valid year for GDate and the proleptic gregorian calendar + +2011-04-01 13:18:55 +0200 Sebastian Dröge + + * ext/flac/gstflacenc.c: + flacenc: Add support for writing METADATA_BLOCK_PICTURE blocks for GST_TAG_IMAGE and GST_TAG_PREVIEW_IMAGE + +2011-04-01 11:33:54 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer2.c: + videomixer[2]: Use orc_memset() instead of memset() + +2011-01-19 18:06:45 -0700 Lane Brooks + + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + videomixer: Add transparent background option for alpha channel formats + +2011-01-19 12:07:17 -0700 Lane Brooks + + * gst/videomixer/blend.c: + * gst/videomixer/blend.h: + * gst/videomixer/blendorc.orc: + * gst/videomixer/videomixer2.c: + * gst/videomixer/videomixer2.h: + videomixer2: Add transparent background option for alpha channel formats + This option allows the videomixer2 element to output a valid alpha + channel when the inputs contain a valid alpha channel. This allows + mixing to occur in multiple stages serially. + The following pipeline shows an example of such a pipeline: + gst-launch videotestsrc background-color=0x000000 pattern=ball ! video/x-raw-yuv,format=\(fourcc\)AYUV ! videomixer2 background=transparent name=mix1 ! videomixer2 name=mix2 ! ffmpegcolorspace ! autovideosink videotestsrc ! video/x-raw-yuv,format=\(fourcc\)AYUV ! mix2. + The first videotestsrc in this pipeline creates a moving ball on a + transparent background. It is then passed to the first videomixer2. + Previously, this videomixer2 would have forced the alpha channel to + 1.0 and given a background of checker, black, or white to the + stream. With this patch, however, you can now specify the background + as transparent, and the alpha channel of the input will be + preserved. This allows for further mixing downstream, as is shown in + the above pipeline where the a second videomixer2 is used to mix in a + background of an smpte videotestsrc. So the result is a ball hovering + over the smpte test source. This could, of course, have been + accomplished with a single mixer element, but staged mixing is useful + when it is not convenient to mix all video at once (e.g. a pipeline + where a foreground and background bin exist and are mixed at the final + output, but the foreground bin needs an internal mixer to create + transitions between clips). + Fixes bug #639994. + +2011-03-31 13:25:00 +0200 Mark Nauwelaerts + + * ext/pulse/pulsesink.c: + pulsesink: also uncork during EOS waiting (and after EOS is rendered) + Pulsesink was recently changed to defer uncorking until there is data + to write. This condition will however never occur when EOS in being + rendered (since that marks the end of data). Changing to PAUSED state + while EOS is being waited on results in a hang: pausing corks the + stream, which will never be undone since there is no more data when + going back to PLAYING. If pulsesink is the clock provider, deadlock + ensues since time doesn't continue in corked state and the clock id + for EOS wait never fires. + Fixes #645961. + +2011-03-29 16:33:43 +0200 Sebastian Dröge + + * tests/check/elements/rtpbin.c: + rtpbin: Don't try to request the same request pad twice + +2011-03-28 23:46:47 +0100 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + flacdec: fix issues with large metadata blocks when streaming unframed flac + Parse metadata blocks when handling unparsed flac in push mode. This + works around a bunch of issues with the flac decoder when handling + metadata blocks that are larger than the max. flac framesize, which + coverart blocks often are. We need to have all the data for these + blocks available when we pass data to libflac. + http://gstreamer-devel.966125.n4.nabble.com/Flac-files-that-will-playback-but-not-stream-td3338198.html#a3395276 + https://bugzilla.gnome.org/show_bug.cgi?id=566769 + +2011-03-27 21:39:50 +0200 Jan Urbański + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + flvdemux: Do not build an index if upstream is not seekable + An index is not useful if upstream cannot handle seeks and building it + for infinite files, for instance FLV streams, results in a memory leak. + +2011-03-27 01:19:58 +0300 Alexey Chernov <4ernov@gmail.com> + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-video4linux2.xml: + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2radio.c: + * sys/v4l2/gstv4l2radio.h: + v4l2: new v4l2radio element to control analog radio devices + https://bugzilla.gnome.org/show_bug.cgi?id=640118 + +2011-03-25 22:22:43 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 193b717 to 1ccbe09 + +2011-03-25 14:56:06 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From b77e2bf to 193b717 + +2011-03-25 12:53:43 +0200 Stefan Kost + + * ext/cairo/Makefile.am: + cairo: fix the name of the *-marshall.list file to unbreak make distcheck + +2011-03-25 09:31:03 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From d8814b6 to b77e2bf + +2011-03-25 09:06:16 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 6aaa286 to d8814b6 + +2011-03-25 00:10:56 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + spectrum: refactor processing loop for block based operation + Previously the chain function was working sample frame based. In each cycle it + was checking if it is time to run a fft or if it is time to send a message. + Now we changed the data transform functions to work on a block of data and + calculate the max length until either {end-of-data, do-fft, do-msg}. This allows + us also to avoid the duplicated code for the single and multi-channel case (as + the transformers have the same signature now). + +2011-03-24 23:47:33 +0200 Stefan Kost + + * configure.ac: + jack: unbreak the build for jack2 users + Jack2 (versions 1.X.X) does only have that API in svn. Limmit the use of the new + API for jack1 versions. + +2011-03-24 18:49:19 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From 6aec6b9 to 6aaa286 + +2011-03-24 14:14:09 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: fix the error accumulation and frames_todo handling + Even though we wrap around the accumulated second, we still need to add the + error in the same cycle. Increase the todo in the same conditional as afterwards + the accumulated error will be below one second. + +2011-03-24 13:53:12 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: fix broken code resulting for a wrong splitup of changes + +2011-03-22 16:29:53 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + spectrum: simplify the have_interval calculation + Move some of the conditions to the places where the dependent variables change. + +2011-03-22 16:26:45 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: use local var for input_data function + Avoid dereferencing the input_data from the instance from within an inner loop. + +2011-03-23 16:34:16 +0100 Sebastian Dröge + + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexdec.h: + speexdec: Get and use streamheader from the caps if possible + This allows playback of streams where the streamheader buffers + were dropped from the stream for some reason. + +2011-03-22 19:36:31 +0100 Mark Nauwelaerts + + * gst/flv/gstflvmux.c: + flvmux: use running time for synchronization + Fixes #432612. + +2011-03-22 19:36:21 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskamux: use running time for synchronization + Fixes #432612. + +2011-03-22 19:35:58 +0100 Mark Nauwelaerts + + * gst/avi/gstavimux.c: + avimux: use running time for synchronization + See bug #432612. + +2011-03-22 12:53:22 +0100 Luis de Bethencourt + + * configure.ac: + configure.ac: redundant uses of AC_MSG_RESULT() + cleaned the redundant uses of AC_MSG_RESULT() in configure.ac + +2011-03-18 19:34:57 +0100 Luis de Bethencourt + + * autogen.sh: + autogen: wingo signed comment + +2011-03-16 10:43:47 +0100 Robert Swain + + * ext/jack/gstjackaudiosink.c: + jackaudiosink: Fix typo from 9544622674c0d0a3147a9b51145159b02eec68e9 + +2011-03-16 09:38:43 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + matroska: Mark tag mapping tables as static const + +2011-03-16 09:37:58 +0100 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + matroskamux: Use ARTIST instead of AUTHOR for GST_TAG_ARTIST + +2011-03-16 09:35:50 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + matroskademux: Use ARTIST Matroska tag instead of AUTHOR for GST_TAG_ARTIST + AUTHOR only existed in an old version of the spec and ARTIST is + the new replacement for this. We are still reading both to still + be compatible with old files. + Fixes bug #644875. + +2011-03-15 20:19:48 +0000 Tim-Philipp Müller + + * tests/check/elements/videofilter.c: + tests: enable more formats in videofilter unit test, check more resolutions + +2011-03-14 19:14:07 -0400 Youness Alaoui + + * gst/videofilter/gstvideoflip.c: + videoflip: Fix buffer overflow bug for odd resolutions and Y422 colorspaces + https://bugzilla.gnome.org/show_bug.cgi?id=644773 + +2011-03-15 19:36:01 +0200 Vincent Penquerc'h + + * ext/speex/gstspeexdec.c: + speexdec: silence warning message when appropriate + If we did not know how many frames to expect, then we get an unexpected + end of stream when trying to decode more frames that are there, if there + are leftover bits to pad to the next byte + +2011-03-14 19:14:07 -0400 Youness Alaoui + + * gst/videofilter/gstvideoflip.c: + videoflip: Add support for YUY2, UVYV and YVYU colorspaces + https://bugzilla.gnome.org/show_bug.cgi?id=644773 + +2011-03-15 09:43:35 +0000 Tim-Philipp Müller + + * tests/check/elements/videofilter.c: + tests: in videofilter unit test also check with 'odd' widths and heights + And only use one test suite. + +2011-03-14 19:28:07 +0100 Sebastian Dröge + + * ext/speex/gstspeexdec.c: + speexdec: Always process the number of frames per packet as specified in the header + Looking at the remaining bits in the bitstream after decoding a + single frame can't be used as loop condition. The remaining + bits might not give a complete frame and the speex decoder will + then output nothing but access uninitialized memory, which leads + to valgrind warnings. + Fixes bug #644669. + +2011-03-14 15:46:50 +0100 Andoni Morales Alastruey + + * gst/matroska/matroska-mux.c: + matroskamux: return TRUE from sink pad event function for tag events, which are handled + https://bugzilla.gnome.org/show_bug.cgi?id=644730 + +2011-03-12 00:44:31 +0530 Philip Jägenstedt + + * ext/pulse/pulsesink.c: + pulsesink: Better fix for deadlock on failed connect + This reverts the previous fix that would cause a double-unlock when the + stream connect failed. + https://bugzilla.gnome.org/show_bug.cgi?id=644510 + +2011-03-11 23:06:31 +0530 Arun Raghavan + + * ext/pulse/pulsesink.c: + pulsesink: Fix deadlock if connecting to PA fails + Commit dd4ec22e introduced a deadlock in the failure path while trying + to connect to PulseAudio. This makes sure we drop the lock on the + resource mutex to avoid this. + https://bugzilla.gnome.org/show_bug.cgi?id=644510 + +2011-03-11 16:59:10 +0200 Stefan Kost + + * tests/check/Makefile.am: + tests: order state-test blacklist and add jack elements + Jack audio src/sink elements recently got moved from bad and should be excluded + from the test (like the other device specific source and sinks). + Fixes #644288 + +2011-03-11 13:47:26 +0100 Sebastian Dröge + + * ext/dv/gstdvdemux.c: + dvdemux: Chain up to the parent class' ::send_event for non-seek events + +2011-03-11 13:46:05 +0100 Sebastian Dröge + + * ext/dv/gstdvdemux.c: + dvdemux: Fix refcount issues with the seek event + Fixes bug #642963. + +2011-03-11 09:54:02 +0000 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + docs: fix pulsesink gtk-doc markup + +2011-03-11 10:29:08 +0100 Philippe Normand + + * configure.ac: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: fix build against jack 0.120.2 + jack_port_get_total_latency() has been deprecated in favor of + jack_port_get_latency_range(). + https://bugzilla.gnome.org/show_bug.cgi?id=644477 + +2011-03-10 14:29:25 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: more comments and tune and logging + +2011-03-10 14:15:42 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: avoid unneccesary extra fft runs + Before it was possible that we run an extra fft when the time for sending a new + message is due. Only do this if we have not run the fft for the interval at all. + +2011-03-10 14:12:01 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: only scale the vectors that we are processing + Phase is not produced by default, so lets not scale it unconditionally to save a + few cycles. + +2011-03-10 14:10:25 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + spectrum: put number of channels to instance variable + When freeing data the format might have changed. Thus we need to remember for + which format we allocated memory. + +2011-03-10 10:27:14 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: update doc review stamp + +2011-03-10 10:22:29 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + spectrum: use function pointers for data readers + Don't check the format for each sample frame to read. We can make that decission + in _setup already. This is still not ideal as we call the function per frame. + Ideally we determine how many samples we can copy and have a loop in the input + reader. As an alternative we might also consider to use the fft variants for the + various formats and not convert to float for all cases - we would still need to + mix or deinterleave though. + +2011-03-09 17:07:47 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: improve recovery from failed seek + In case server-side fails to perform seek, i.e. PLAY at non-zero requested + position, recovery so far would arrange for streaming to continue, albeit + having lost position tracking in the process. So, query position prior + to seek and use upon failed seek. + +2011-03-09 16:51:00 +0100 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: handle position query + +2011-03-09 16:57:28 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + spectrum: multi-channel support + Add a boolean multi-channel property with a default of FALSE. When set to TRUE + the element won't mix all input channels to mono, but instead run a FFT on each + channel. In that case the result message would contain a 2 dimensional array + of channel x data for magnitude and phase. + API: GstSpectrum:multi-channel + https://bugzilla.gnome.org/show_bug.cgi?id=593482 + +2011-03-09 16:55:56 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: more xrefs in the docs + +2011-03-09 12:41:15 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: factor out the code that accumulated samples into the ring-buffer + Use a separate function to read a sample frame into a ringbuffer slot. In the + future we can use format-specific function pointer to avoid the reoccuring + format checks. + +2011-03-09 12:38:52 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: pull format to temp var to improve readability of lines using it + +2011-03-09 12:20:11 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: code cleanup for copying data to ring-buffer + Rename fp to is_float and restructure if-else part for handling the different formats. + +2011-03-09 11:40:48 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + spectrum: add a GstSpecrtumChannel context structure + We now keep the fft data that is related to one channel in a separate structure + to prepare for multichannel support. We also refactor the code to operate more + often on the channel context. + +2011-03-09 11:18:19 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: call the instance var spectrum instead of filter + +2011-03-09 11:14:37 +0200 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: don't value we already took from the gvalue + +2011-03-08 16:28:27 +0000 Tim-Philipp Müller + + Merge ad-hoc release branch '0.10.28' + +=== release 0.10.28 === + +2011-03-08 15:47:52 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.28 + Ad-hoc release to fix build issue with newer kernels. + +2011-03-03 00:16:47 +0000 Tim-Philipp Müller + + * sys/v4l2/v4l2_calls.h: + v4l2: remove unnecessary linux/videodev.h include + Causes compilation issues with newer kernel headers where the old + v4l interface has been removed. + https://bugzilla.gnome.org/show_bug.cgi?id=643716 + +2011-03-07 16:56:43 +0100 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: also estimate eos if very near eos + +2011-03-07 16:56:18 +0100 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: avoid trying to buffer more than is available. + That is, in case of short (or near eos of) stream, deadlock (until timeout) + would occur trying to buffer more than is yet forthcoming. + +2011-03-07 11:01:06 +0100 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: reset element base_time upon flush + ... to arrange for properly scheduled timeout (following seek). + +2011-03-07 10:54:22 +0100 Sebastian Dröge + + * tests/examples/cairo/cairo_overlay.c: + cairooverlay: Add a bus handler to the example to handle EOS/ERROR/WARNING + Also clean up the pipeline properly. + +2011-03-07 10:47:23 +0100 Sebastian Dröge + + * tests/examples/Makefile.am: + examples: Always dist the cairo example + +2011-03-07 10:46:12 +0100 Sebastian Dröge + + * tests/examples/cairo/Makefile.am: + cairooverlay: Use LDADD instead of LDFLAGS for libs and add $(GST_LIBS) + +2011-03-05 23:22:58 +0000 Jon Nordby + + * tests/examples/Makefile.am: + * tests/examples/cairo/Makefile.am: + * tests/examples/cairo/cairo_overlay.c: + cairooverlay: Remove unnecessary gtk/gtk-x11 use in example. + This removes code, and allows the example to be used on any platform. + Fixes bug #643981. + +2011-03-04 18:37:38 -0800 David Schleef + + * sys/v4l2/gstv4l2object.c: + v4l2: Use #ifdefs for V4L2_PIX_FMT_PJPG + It's only recently added to kernel headers. + +2011-02-23 16:50:43 +0100 Mark Nauwelaerts + + * gst/wavparse/gstwavparse.c: + * gst/wavparse/gstwavparse.h: + wavparse: tune output max buffer size to material + ... to avoid ending up with tons of short time buffers for e.g. high sample + rate audio. + +2011-03-04 15:50:01 +0200 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: add a doc example for setting stream-properties + +2011-03-04 15:42:19 +0200 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: fix the xml in the docs + +2011-03-03 00:16:47 +0000 Tim-Philipp Müller + + * sys/v4l2/v4l2_calls.h: + v4l2: remove unnecessary linux/videodev.h include + Causes compilation issues with newer kernel headers where the old + v4l interface has been removed. + https://bugzilla.gnome.org/show_bug.cgi?id=643716 + +2011-03-02 23:21:15 +0100 Sebastian Dröge + + * configure.ac: + * tests/examples/Makefile.am: + * tests/examples/cairo/Makefile.am: + * tests/examples/cairo/cairo_overlay.c: + cairooverlay: The example always requires gtk-x11 + Check for gtk-x11 and only build the example if it's available. + +2011-03-02 23:14:36 +0100 Sebastian Dröge + + * ext/cairo/gstcairooverlay.c: + * ext/cairo/gstcairooverlay.h: + cairooverlay: Some minor cleanup + +2011-03-02 23:09:21 +0100 Sebastian Dröge + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + docs: Update inspected plugin data + +2011-01-28 02:14:04 +0200 Jon Nordby + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * ext/cairo/.gitignore: + * ext/cairo/Makefile.am: + * ext/cairo/gstcairo-marshal.list: + * ext/cairo/gstcairo.c: + * ext/cairo/gstcairooverlay.c: + * ext/cairo/gstcairooverlay.h: + * tests/examples/Makefile.am: + * tests/examples/cairo/.gitignore: + * tests/examples/cairo/Makefile.am: + * tests/examples/cairo/cairo_overlay.c: + cairooverlay: Add generic Cairo overlay video element. + Allows applications to connect to the "draw" signal of + the element and do their custom drawing there. + Includes an example application demonstrating usage. + Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=595520 + +2011-03-02 13:00:31 +0200 Stefan Kost + + * gst/monoscope/monoscope.c: + monoscope: don't leak the monoscope_state data + The monoscope_close() implementation was empty. + +2011-03-02 12:59:35 +0200 Stefan Kost + + * gst/monoscope/monoscope.c: + monoscope: we have 64 colors, don't access colors[64] + Fixes remaining invalid read. + +2011-03-02 10:25:29 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: arrange for non-fatal error when parsing non-vital parts + +2011-03-02 10:56:33 +0200 Stefan Kost + + * gst/monoscope/convolve.c: + monoscope: stack needs to be size+1 as we put a end-marker into it + Valgrind is still complaining about one bad read, but this takes care of the + crash mentioned in the comment and in bug #564122. + +2011-03-01 22:40:19 +0200 Stefan Kost + + * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: + example: fix the variable name for the ip-address + Fix the name in the launch pipeline and use a value of "localhost" by default. + +2011-02-28 19:16:00 +0100 Mark Nauwelaerts + + * configure.ac: + configure.ac: cygwin/mingw; enable plugin linking to static lib + Useful for DirectX plugin(s). + Fixes #642507. + +2011-02-28 19:13:41 +0100 Mark Nauwelaerts + + * configure.ac: + configure.ac: export plugin description more platform independent + Fixes #642504. + +2011-02-28 18:32:54 +0100 Mark Nauwelaerts + + * common: + Automatic update of common submodule + From 1de7f6a to 6aec6b9 + +2011-02-23 17:41:22 +0100 Philip Jägenstedt + + * ext/pulse/pulsesink.c: + pulsesink: release pa_shared_resource_mutex before pa_threaded_mainloop_wait + Not doing so can result in a deadlock when two threads enter + gst_pulseringbuffer_open_device at the same time, as + pa_threaded_mainloop_wait releases the mainloop lock while waiting, + allowing another thread to take it, resulting in a deadlock as two + threads waits for the lock the other is holding. + https://bugzilla.gnome.org/show_bug.cgi?id=643087 + +2011-02-23 17:18:19 +0100 Philip Jägenstedt + + * ext/pulse/pulsesink.c: + pulsesink: s/ressource/resource/ + https://bugzilla.gnome.org/show_bug.cgi?id=643087 + +2011-02-25 20:12:35 -0800 David Schleef + + * gst/qtdemux/qtdemux.c: + qtdemux: remove accidental debug message + in previous commit + +2011-02-25 19:35:51 -0800 David Schleef + + * gst/qtdemux/qtdemux.c: + qtdemux: Add support for 2Vuy and r210 + +2011-02-24 14:08:25 +0100 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Add support for NV21 colorspace + +2011-02-24 14:00:37 +0100 Carsten Kroll + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Add support for NV12 colorspace + Fixes bug #642961. + +2011-02-24 13:56:04 +0100 Carsten Kroll + + * ext/dv/gstdvdemux.c: + dvdemux: First try if upstream handles TIME seeks before handling them here + Fixes bug #642963. + +2010-11-08 14:25:59 +0100 Robert Swain + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Simplify setcaps + The current code never uses upstream negotiation so the code can be + significantly simplified. + +2011-01-24 12:48:18 +0100 Robert Swain + + * gst/deinterlace/tvtime/greedy.c: + deinterlace: Port greedyl to GstDeinterlaceSimpleMethod + The main goal of this change is to reuse the complex but now neatly + written scanline pointer calculation code from the simple methods. + +2011-02-22 15:20:11 +0200 Stefan Kost + + * gst/id3demux/gstid3demux.c: + Revert "id3demux: ensure a taglist before adding the container tag" + This reverts commit a86bab66893bb1a3323a756410573c117b8219ef. The issue is + fixed with commit ff5e5a8f0daa1fdf89792d0726ea063bbd99db18 instead. + +2011-02-22 15:19:00 +0200 Stefan Kost + + * gst/id3demux/id3tags.c: + id3demux: return ID3TAGS_BROKEN_TAG for unsupported versions + This prevents us for trying to work with a NULL taglist. + +2011-02-22 14:15:27 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix unitialized variable. + +2011-02-22 14:01:27 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: ensure sane parameters when parsing superindex + +2011-02-22 14:00:11 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: check for NULL audio stream format header when parsing stream + +2011-02-22 14:52:18 +0200 Stefan Kost + + * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: + * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: + rtp-examples: move capsfilter behind converters + We need to have the capsfilter behin the converters to make the converters + convert from the formats v4l2src can do to what we request with the + capsfilter. + +2011-02-22 14:50:59 +0200 Stefan Kost + + * tests/examples/rtp/client-H264-PCMA.sh: + * tests/examples/rtp/client-PCMA.sh: + * tests/examples/rtp/server-alsasrc-PCMA.sh: + * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: + * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: + rtp-examples: fix ascii-art + Some boxes where misaligned due to long "audiotetssrc" name. Trim trailing + whitespace. + +2011-02-22 13:29:26 +0100 Blaise Gassend + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: handle NULL demux elements + When using gstrtpbin with ignore-pt=true, the free_stream function tries to + call gst_element_set_locked_state and gst_element_set_state on a stream->demux + which is NULL. + fixes #642412 + +2011-01-24 12:18:39 +0100 Robert Swain + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlacemethod.c: + deinterlace: small clean-ups + Improve debug output by printing the buffer pointer when + popping a buffer and simplify code to use scanlines.bottom_field + as appropriate. + https://bugzilla.gnome.org/show_bug.cgi?id=642691 + +2011-01-24 12:18:39 +0100 Robert Swain + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: fix assigned method_id when using fallback + https://bugzilla.gnome.org/show_bug.cgi?id=642691 + +2011-02-21 17:17:32 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: fix setting the SDES property + Only the sdes veriable is protected with the object lock. + Use the right object when setting the sdes property. + +2011-02-21 12:09:07 +0100 Edward Hervey + + * ext/cairo/gsttextoverlay.c: + * gst/avi/gstavimux.c: + * gst/flv/gstflvmux.c: + * gst/interleave/interleave.c: + * gst/matroska/matroska-mux.c: + * gst/videomixer/videomixer.c: + Revert "Check that collectpads exists before removing pad" + This reverts commit 8e6b876e76c94410db160afe5eb30f21452e419f. + Depends on a core commit that was reverted + +2011-02-21 00:55:49 +0000 Tim-Philipp Müller + + * gst/icydemux/gsticydemux.c: + icydemux: fix tag list handling issues that might have caused crashes + Fix slightly confused tag handling in some places: make it clear when + we're taking ownership of a tag list and when not. For example, + gst_icydemux_tag_found() was taking ownership when the source pad + existed, but otherwise not (leak). Also, gst_event_parse_tag() does + not return a newly-allocated taglist, but a tag list that belongs to + the tag event, so don't give ownership of it away. + While we're at it, some minor clean-ups: don't re-invent g_strndup() + and simplify gst_icydemux_parse_and_send_tags() a bit, and don't + leak the tag list in case no valid tags where found. + https://bugzilla.gnome.org/show_bug.cgi?id=641330 + +2011-02-20 23:39:41 -0800 David Schleef + + * ext/cairo/gsttextoverlay.c: + * gst/avi/gstavimux.c: + * gst/flv/gstflvmux.c: + * gst/interleave/interleave.c: + * gst/matroska/matroska-mux.c: + * gst/videomixer/videomixer.c: + Check that collectpads exists before removing pad + The core now calls release pad from finalize, at which point + the collectpads might have already been freed. + +2011-02-19 15:48:22 -0800 David Schleef + + * ext/libpng/gstpngdec.c: + pngdec: Handle 16-bit-per-channel images + +2011-02-18 10:12:47 +0200 Stefan Kost + + * gst/avi/gstavidemux.c: + avidemux: stream->current_total is accumulated byte size and not time + Use timestamp for the stream index as well. + +2011-02-15 19:33:45 -0800 David Schleef + + * gst/udp/gstmultiudpsink.c: + udpsink: warn when packet is too large + +2011-02-17 17:59:25 -0800 David Schleef + + * gst/matroska/Makefile.am: + * gst/matroska/matroska-parse.c: + * gst/matroska/matroska-parse.h: + * gst/matroska/matroska.c: + matroskaparse: New element + Copied from demux. Duplicates much code, also some dead code + remaining. + +2011-02-17 17:57:55 -0800 David Schleef + + * gst/matroska/matroska-demux.c: + matroskademux: Earlier debug category initialization + +2011-01-22 00:13:16 -0800 David Schleef + + * gst/flv/gstflvmux.c: + flvmux: don't set duration for live stream + +2011-01-06 15:44:24 -0800 David Schleef + + * gst/debugutils/Makefile.am: + * gst/debugutils/negotiation.c: + debugutils: remove bitrotten negotiation element + Wasn't enabled, didn't work, and planned features have been + superceded by capsfilter and capsdebug. + +2010-09-17 12:10:38 -0700 David Schleef + + * gst/rtp/gstrtpvrawpay.c: + * gst/rtp/gstrtpvrawpay.h: + rtpvrawpay: Implement interlacing + +2011-02-17 17:57:42 +0200 Stefan Kost + + * gst/avi/gstavidemux.c: + avidemux: also add the frame-type for the stream index + +2011-02-17 17:56:29 +0200 Stefan Kost + + * gst/avi/gstavidemux.c: + avidemux: get the index writer id when the pad has a parent + Otherwise the index writer has a weired name, as the pad has no parent yet. + +2011-02-17 14:00:48 +0200 Stefan Kost + + * gst/avi/gstavidemux.c: + * gst/flv/gstflvdemux.c: + avidemux, flvdemux: formatting cleanup + Trim trailing whitespaces and fix the formatting of double negation. + +2011-02-17 13:57:37 +0200 Stefan Kost + + * gst/avi/gstavidemux.c: + * gst/flv/gstflvdemux.c: + avidemux, flvdemux: mark delta-units in the index + We need to use the 'delta' flag for delta units and not the 'none' flag. + +2011-02-17 11:58:42 +0000 Tim-Philipp Müller + + * tests/icles/.gitignore: + .gitignore: ignore moved equalizer test binary + +2011-02-17 12:46:14 +0200 Stefan Kost + + * gst/qtdemux/qtdemux.c: + qtdemux: mark delta-unit in the index + We need to use the delta flag fro delta units and not none. Print more details + to the debug log. + +2011-02-17 12:44:01 +0200 Stefan Kost + + * gst/qtdemux/qtdemux.c: + qtdemux: formatting cleanup + Trim trailing whitespaces and fix the formatting of double negation. + +2011-02-16 17:09:20 +0200 Stefan Kost + + * gst/matroska/matroska-mux.c: + matroskamux: rework _request_new_pad to handle explict req-pad-names + Don't ignore explicit pad-names. + +2011-02-16 17:06:51 +0200 Stefan Kost + + * gst/avi/gstavimux.c: + avimux: rework _request_new_pad to handle explict req-pad-names + Don't ignore explicit pad-names. Rearrange the code and the error handling a + bit. Add a FIXME-0.11 for the bad pad-names. + +2011-02-16 15:28:53 +0100 Sebastian Dröge + + * tests/icles/Makefile.am: + icles: Add equalizer-test to the build system + +2011-02-16 15:23:50 +0100 Sebastian Dröge + + * tests/icles/equalizer-test.c: + [MOVED FROM BAD 5/5] equalizer-test: Initialize debug category after gst_init() to fix segfault + +2007-11-07 15:36:59 +0000 Sebastian Dröge + + [MOVED FROM BAD 4/5] tests/icles/equalizer-test.c: Fix gain ranges for the latest equalizer changes. + Original commit message from CVS: + * tests/icles/equalizer-test.c: (do_slider_fiddling): + Fix gain ranges for the latest equalizer changes. + +2007-05-21 14:01:16 +0000 Stefan Kost + + [MOVED FROM BAD 3/5] ChangeLog: ChangeLog surgery. gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _GstIirEqualizerBa... + Original commit message from CVS: + * ChangeLog: + ChangeLog surgery. + * gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, + _GstIirEqualizerBand, object, _GstIirEqualizerBandClass, + parent_class, gst_iir_equalizer_band_set_property, + gst_iir_equalizer_band_class_init, gst_iir_equalizer_band_get_type, + gst_iir_equalizer_child_proxy_get_child_by_index, + gst_iir_equalizer_child_proxy_get_children_count, + gst_iir_equalizer_child_proxy_interface_init, setup_filter, + gst_iir_equalizer_compute_frequencies, plugin_init): + * tests/icles/equalizer-test.c: + Add fixme and comment for example. + +2007-03-14 16:33:03 +0000 Stefan Kost + + [MOVED FROM BAD 2/5] tests/icles/equalizer-test.c: Port the example to new equalizer api. + Original commit message from CVS: + * tests/icles/equalizer-test.c: (equalizer_set_band_value), + (equalizer_set_all_band_values), + (equalizer_set_band_value_and_wait), + (equalizer_set_all_band_values_and_wait), (do_slider_fiddling), + (main): + Port the example to new equalizer api. + +2007-02-03 23:35:26 +0000 Tim-Philipp Müller + + [MOVED FROM BAD 1/5] Fix up to use the newly ported (actually working) GstAudioFilter. + Original commit message from CVS: + * configure.ac: + * gst/equalizer/Makefile.am: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init), + (gst_iir_equalizer_class_init), (gst_iir_equalizer_init), + (setup_filter), (gst_iir_equalizer_compute_frequencies), + (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), + (gst_iir_equalizer_transform_ip), (gst_iir_equalizer_setup), + (plugin_init): + * gst/equalizer/gstiirequalizer.h: + Fix up to use the newly ported (actually working) GstAudioFilter. + Bump core/base requirements to CVS for this. + * tests/icles/.cvsignore: + * tests/icles/Makefile.am: + * tests/icles/equalizer-test.c: (check_bus), + (equalizer_set_band_value), (equalizer_set_all_band_values), + (equalizer_set_band_value_and_wait), + (equalizer_set_all_band_values_and_wait), (do_slider_fiddling), + (main): + Add brain-dead interactive test for equalizer. + +2011-02-15 15:59:32 -0300 Thiago Santos + + * sys/v4l2/gstv4l2object.c: + v4l2: Add PJPG mapping + Adds mapping of progressive jpeg format + +2011-02-15 16:30:20 +0100 Andy Wingo + + plug qtdemux refcount leaks + * gst/qtdemux/qtdemux.c (gst_qtdemux_src_convert): Unref the qtdemux; we + weren't doing so before. + (gst_qtdemux_handle_src_event, gst_qtdemux_chain): Fix some error + cases which would leak a ref to the qtdemux. + +2011-02-14 20:20:08 +0100 Andoni Morales Alastruey + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Add URI query handler + Fixes bug #642337. + +2011-02-14 17:49:54 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: avoid sorting NULL array of cluster positions + +2011-02-14 16:46:46 +0100 Wim Taymans + + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + theorapay: handle 0 sized packets + Handle 0 sized packets (repeat frame) in the payloader and depayloader. + Fixes #641827 + +2011-02-14 15:21:29 +0200 Tuukka Pasanen + + * gst/debugutils/gsttaginject.c: + taginject: resend tags when they are changed + Allow setting new tags on the property while running and send them. + Fixes #640249 + +2011-02-14 12:53:27 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From f94d739 to 1de7f6a + +2011-02-07 23:32:53 +0100 Miguel Angel Cabrera Moya + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix minor leaks when handling server requests. + https://bugzilla.gnome.org/show_bug.cgi?id=640163 + +2011-02-14 00:49:00 +0000 Heath Nielson + + * gst/qtdemux/qtdemux.c: + qtdemux: extract MusicBrainz tags + Extract MusicBrainz tags added by MusicBrainz's Picard + tagger application. These tags (esp. the album id) are + helpful for rhythmbox et.al. to automatically downloads + cover art. + https://bugzilla.gnome.org/show_bug.cgi?id=642205 + +2011-02-14 00:38:45 +0000 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: refactor iTunes tag parsing a bit + +2011-02-10 23:52:51 +0000 Tim-Philipp Müller + + * gst-plugins-good.doap: + doap: update mailing list location + +2011-02-10 18:11:46 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: propagate error during expose_streams + ... as it may occur during initial parsing of fragmented file. + +2011-02-10 18:00:11 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: avoid skipping exposing a stream following a removed stream + +2011-02-10 11:56:33 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: store cluster positions provided by SeekHead + ... and use those, if available, to locate a cluster rather than scanning. + +2011-02-09 16:22:47 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: properly resume cluster scanning + ... rather than getting offset tracking messed up, and then likely + failing a subsequent assert. + +2011-02-08 10:07:43 +0200 Stefan Kost + + * gst/id3demux/gstid3demux.c: + id3demux: ensure a taglist before adding the container tag + In the case of id3v1 also don't return NULL on empty tags, but also create a new + taglist and add the container tag for consistency. + +2011-02-07 17:08:47 +0200 Stefan Kost + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: strip trailing spaces + +2011-02-07 17:07:42 +0200 Stefan Kost + + * gst/rtsp/gstrtspsrc.c: + rtpsrc: set multiple properties in one go + There is no need for separate g_object_set() calls here. + +2011-02-03 16:10:49 -0300 Thiago Santos + + * gst/deinterlace/gstdeinterlace.c: + * tests/check/elements/deinterlace.c: + deinterlace: Handle image caps without asserting + Images might have framerate=0/1 in the caps, which caused an + assertion on deinterlace. I don't know of interlaced image formats + but deinterlace might be hardcoded on some generic pipelines and + it shouldn't assert. + The fix was to set field_duration to 0 if the input has a framerate + with a 0 numerator. + This patch also adds checks for this situation on the unit tests. + https://bugzilla.gnome.org/show_bug.cgi?id=641400 + +2011-02-04 12:33:09 +0200 Stefan Kost + + * gst/udp/gstudpsrc.c: + docs: fix parameter name in udpsrc docs + It is "buffer-size" and not "buffer". Also trim trailing whitespace. + +2011-02-03 23:42:59 +0100 Mark Nauwelaerts + + * sys/v4l2/gstv4l2object.c: + v4l2: fix interlaced set_format configuration + Commit 6c8268dbfd5c88fac28c882ef2e4598a6522e2d6 broke recording + from interlaced v4l2 source (e.g. typical tv capture card) since + V4L2_FIELD_SEQ_TB (with fields stored separately) does not map + to currently defined interlaced format (fields stored interleaved). + Besides this mismatch, hardware might quite likely not support or + appreciate this field value, since querying supported formats mapped + _INTERLACED field formats to interlaced=true caps (so the latter should + not be mapped to field value that is not known to be supported). + +2011-02-02 18:27:52 +0100 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + source: fix type of ntpnstime + +2011-02-02 18:21:26 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + * gst/rtpmanager/rtpstats.h: + rtpbin: Get and use the NTP time when receiving RTCP + When we receive an RTCP packet, get the current NTP time in nanseconds so that + we can correctly calculate the round-trip time. + +2011-02-01 19:40:58 +0100 Mark Nauwelaerts + + * sys/directsound/gstdirectsoundsink.c: + directsound: arrange for definition of _swab on Cygwin + gstdirectsoundsink.c: In function 'gst_directsound_sink_write': + gstdirectsoundsink.c:557: error: implicit declaration of function '_swab' + gstdirectsoundsink.c:557: error: nested extern declaration of '_swab' + +2010-10-06 21:17:28 -0400 Olivier Crête + + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheoradepay.h: + rtptheoradepay: Request new keyframe on lost packets + Theora can only use the last frame (or the keyframe) as a reference, so in + practice. If we receive a buffer that references an unknown codebook, request + new headers. It probably means that headers were lost. + +2010-08-27 14:11:53 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Add action signal to request early RTCP + +2010-08-27 16:11:06 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Add callback to get the current time + +2010-10-19 22:21:54 +0200 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Don't relay more than one PLI request per RTT + Drop PLI requests if one was relay in the last RTT, the other side may + just not have received the keyframe yet. + +2010-06-23 16:43:24 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Send GstForceKeyUnit event in response to received RTCP PLI + +2010-11-24 15:27:46 -0500 Sjoerd Simons + + * gst/rtpmanager/gstrtpsession.c: + gstrtpsession: Fallback for FIR to PLI if PLI isn't available + +2010-06-22 19:56:50 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Implement sending PLI packets in response to GstForceKeyUnit + +2010-06-22 13:33:32 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpsource: Retain RTCP Feedback packets for a specified amount of time + +2010-09-07 13:35:16 +0300 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Make rtcp buffer metadata writable after processing it + Functions that process the rtcp buffer could decide to keep a ref + on the buffer for further processing. So make the metadata writable + only after they are done. + +2010-06-17 17:34:19 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Emit signal on incoming RTCP FB packet + +2011-02-01 18:17:13 +0100 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: fix compilation + +2010-06-15 18:39:47 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Add method to request early RTCP packet + Implement the early mode defined in RFC 4585. In this mode, RTCP feedback + packets are sent early to notifier. + +2010-06-01 19:28:01 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpstats.c: + * gst/rtpmanager/rtpstats.h: + rtpsession: Add property for minimum interval between Regular RTCP messages + This can be changed according to RFC 4585 + +2010-06-14 18:40:33 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: Emit signal when sending a compound RTCP packet + This allows users to add extra RTCP packets to the compound + RTCP packet. + +2010-06-19 19:11:06 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpptdemux.c: + rtpptdemux: Tag upstream custom events with payload type + +2010-06-18 19:12:40 -0400 Olivier Crete + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: Tag upstream custom events with SSRC + +2010-10-01 17:19:16 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Emit "on-ssrc-validated" when validating by RTCP + Emit "on-ssrc-validated" if the SSRC is validated by receiving + a RTCP SDES packet. + +2011-02-01 16:38:20 +0100 Wim Taymans + + * gst/rtp/gstrtpj2kpay.c: + j2kpay: skip EPH packets + Include EPH markers into the previous chunk of packets. + +2011-01-31 17:56:18 -0500 Olivier Crête + + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmapay.h: + rtppcmapay: Rename the class to have the right name + It was name pmca instead of pcma and made debug logs hard to search. + +2011-01-31 05:58:36 +0100 David Henningsson + + * ext/pulse/pulsesink.c: + Pulsesink: Allow chunks up to bufsize instead of segsize + By allowing larger chunks to be sent, PulseAudio will have a + lower CPU usage. This is especially important on low-end machines, + where PulseAudio can crash if packets are coming in at a higher + rate than PulseAudio can process them. + Signed-off-by: David Henningsson + +2011-01-31 13:44:45 +0000 Tim-Philipp Müller + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: simplify template caps + We can merge all the YUV variants into one single structure. + +2011-01-27 15:35:06 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + win32: fix DEFAULT_AUDIOSINK, should be direct*sound*sink + https://bugzilla.gnome.org/show_bug.cgi?id=640705 + +2011-01-27 16:02:46 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: initialize local variable to please mingw32 compiler + +2011-01-26 22:21:31 +0100 Mark Nauwelaerts + + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpnetutils.h: + * gst/udp/gstudpsrc.c: + udp: use socklen_t where appropriate rather than custom type + In particular, fixes Cygwin build where socklen_t is defined as int + in line with native win32 api definition. + +2011-01-27 12:16:46 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: mind rounding issues when converting from global time to mov time + In particular, this avoids missing the intended keyframe when first converting + from the frame's mov time to global segment time, and then back from global + time to mov time when activating the segment. + +2011-01-26 08:48:43 +0000 Ognyan Tonchev + + * gst/matroska/ebml-write.c: + * tests/check/elements/matroskamux.c: + matroskamux: don't leak ebml writer caps when re-using matroskamux + https://bugzilla.gnome.org/show_bug.cgi?id=640542 + +2011-01-25 21:56:19 +0200 Stefan Kost + + * gst/rtpmanager/rtpjitterbuffer.c: + rtpjitterbuffer: don't divide by 0 + +2011-01-18 14:48:04 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: pull mode should always report seekable + ... as it no longer requires an index, but can seek by scanning as well. + +2011-01-10 12:34:22 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: support some more mpeg-4 fourcc variants + +2011-01-10 12:34:03 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: simplify retrieving stsd child entry atom + +2011-01-24 18:27:52 +0100 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Don't consider 0 fcc_handler as uncompressed. + Just avoids a warning + +2011-01-20 12:14:08 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: take configured start time into account + when creating the newsegment event, take the configured start time + into account. + +2011-01-24 15:11:02 +0000 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: fix printf format warning on mingw32 + Make win32 build bot happy again, and nicefy output while we're at it. + qtdemux.c: In function 'qtdemux_parse_trun': + qtdemux.c:2162:3: error: format '%lu' expects type 'long unsigned int', but argument 9 has type 'guint32' + +2011-01-24 13:39:58 +0000 Tim-Philipp Müller + + * tests/examples/rtp/client-H263p-AMR.sh: + * tests/examples/rtp/client-H263p-PCMA.sh: + * tests/examples/rtp/client-H264-PCMA.sh: + * tests/examples/rtp/client-PCMA.sh: + examples: autoaudisink -> autoaudiosink in RTP examples + +2011-01-24 00:32:41 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.27 === + +2011-01-21 12:54:16 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.27 + +2011-01-20 14:10:55 +0000 Tim-Philipp Müller + + * gst/rtp/gstrtph264depay.c: + h264depay: don't leak codec data buffer in byte-stream=true mode + https://bugzilla.gnome.org/show_bug.cgi?id=640063 + +2011-01-20 13:41:33 +0000 Tim-Philipp Müller + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't leak url string + https://bugzilla.gnome.org/show_bug.cgi?id=640064 + +2011-01-20 11:45:47 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Gracefully handle mov files misusing the WAVE atoms + Check that the WAVEHEADER node is present instead of blindly using it. + If not present we won't be able to provide a more refined caps, but at + least we won't crash. + https://bugzilla.gnome.org/show_bug.cgi?id=640028 + +2011-01-20 00:07:33 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: fix accidental breakage of navigation interface support + +2011-01-18 12:58:29 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.26.4 pre-release + +2011-01-12 14:03:57 -0800 David Schleef + + * gst/deinterlace/gstdeinterlacemethod.c: + deinterlace: rewrite how neighboring scan lines are calculated + Old code was difficult to understand exactly how the neighboring + scan lines are calculated, and it appeared that some were off by + +2 or -2, depending on the field flag. Fixes #639321. + +2011-01-18 09:33:06 +0000 Tim-Philipp Müller + + * gst/avi/gstavisubtitle.c: + avisubtitle: set caps on srcpad to fix issue with discoverer + Set caps from the start so discoverer doesn't blow up on + seeing no negotiated caps between elements on preroll, + which might happen if no subtitle buffers have been + pushed yet at the time. See file from bug #603308. + +2011-01-17 20:09:16 +0530 Arun Raghavan + + * ext/pulse/pulsesink.c: + pulsesink: Uncork stream while flushing the ringbuffer + After starting the ringbuffer, we wait for enough data to arrive before + uncorking the stream. This will cause the pipeline to stall if we get an + EOS (or otherwise need to flush the stream) before sufficient data + becomes available. This patch makes sure that the stream is uncorked + while flushing to avoid this problem. + Fixes issue with a webkit unit test testing reverse playback of + an MP4 H.264/AAC file. + https://bugzilla.gnome.org/show_bug.cgi?id=639740 + +2011-01-14 14:51:51 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskamux: avoid creating caps from string when possible + Fixes #639516. + +2011-01-14 14:48:49 +0100 Mark Nauwelaerts + + * gst/avi/gstavimux.c: + avimux: set src pad caps when starting file + Fixes #639516. + +2011-01-12 20:38:59 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/gstv4l2object.c: + v4l2: define V4L2_FIELD_INTERLACED_{TB,BT} if not available in header + Older kernels don't have these, and there's no easy way to check for the + existance of enums that doesn't involve a configure check, so just define + these if the V4L2_CAP_VIDEO_OUTPUT_OVERLAY define is not there, which was + added in the same commit as the TB/BT enum. Fixes compilation on CentOS 5. + https://bugzilla.gnome.org/show_bug.cgi?id=639339 + +2011-01-11 23:18:59 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.26.3 pre-release + +2011-01-11 22:42:42 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + docs: update docs + +2011-01-11 23:39:12 +0530 Arun Raghavan + + * ext/pulse/pulsesink.c: + pulsesink: Make corking during pause synchronous + This makes the call to pa_stream_cork() during ringbuffer pause() + synchronous, which makes sure that the clock does not advance after we + take a snapshot for start_time. + https://bugzilla.gnome.org/show_bug.cgi?id=639240 + +2011-01-11 19:33:16 +0000 Tim-Philipp Müller + + * po/da.po: + * po/gl.po: + * po/pl.po: + * po/pt_BR.po: + * po/sl.po: + * po/sv.po: + * po/tr.po: + po: update translations + +2011-01-11 15:50:28 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From e572c87 to f94d739 + +2011-01-10 16:36:19 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From ccbaa85 to e572c87 + +2011-01-10 14:53:39 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 46445ad to ccbaa85 + +2011-01-07 13:24:02 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.26.2 pre-release + +2011-01-07 13:06:38 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + po: update translations + +2011-01-07 02:32:20 +0000 Tim-Philipp Müller + + * gst/alpha/gstalpha.c: + alpha: fix compiler warnings caused by -DG_DISABLE_ASSERT + +2011-01-07 02:06:51 +0000 Tim-Philipp Müller + + * gst/matroska/ebml-read.c: + matroska: don't put essential function calls into g_assert() + g_assert() will expand to NOOPs if -DG_DISABLE_ASSERT is passed. + +2011-01-07 01:35:45 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: don't put functional code like ioctl calls into g_return_if_fail() + These macros will expand to NOOPs given the right defines. Also, + g_return_if_fail() and friends are meant to be used to catch programming + errors (like invalid input to functions), not runtime error handling. + +2011-01-07 01:11:02 +0000 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: never disable g_assert() and cast checks for the unit tests + The unit tests are riddled with g_assert() and friends, make sure we + don't disable assert and cast checks for the unit tests even if + this has been specified for the rest of the code base, e.g. via + --disable-glib-asserts. + +2011-01-06 12:29:21 +0100 Edward Hervey + + * gst/rtp/gstrtpmp4adepay.c: + rtp: Fix unitialized variables on macosx + +2011-01-06 12:28:58 +0100 Edward Hervey + + * gst/qtdemux/qtdemux_dump.c: + qtdemux: Fix unitialized variables on macosx + +2011-01-05 17:49:16 -0800 David Schleef + + * gst/debugutils/gstcapsdebug.c: + capsdebug: Add capdebug debug category + +2010-12-11 12:42:10 -0800 David Schleef + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Change the default to linear + The previous default, greedyh, takes 4 times as long as MPEG-2 + video decoding, and is unlikely fast enough on any current CPU + to play 1080i video in real-time. greedyl isn't much faster. + linear was chosen over vfir, since the quality advantage of vfir + is minimal compared to the occasional visual artifacts and slower + processing. + +2011-01-05 18:32:58 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't confuse return values + Return a return value of the right type. + +2011-01-05 16:24:13 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_dump.c: + qtdemux: Fix unitialized variables on macosx + +2011-01-05 15:03:32 +0100 Wim Taymans + + * gst/rtp/gstrtpvrawdepay.c: + vrawdepay: fix length check + Add some more debugging. + Add the length check so we don't cause unneeded warnings. + +2011-01-05 12:04:03 +0100 Wim Taymans + + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstmultiudpsink.h: + multiudpsink: add buffer-size property + Add buffer-size property to configure the kernel send buffer. + +2011-01-03 20:16:22 +0200 Stefan Kost + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: remove unused variables when debug-logging disabled + +2011-01-03 20:06:35 +0200 Stefan Kost + + * gst/matroska/matroska-demux.c: + matroska-demux: remove unused variables when debug-logging disabled + +2011-01-03 18:05:15 +0100 Wim Taymans + + * ext/libcaca/gstcacasink.c: + cacasink: fix masks and strides + Use the right endianness to read the masks. + Use the right strides for the bitmap. + Fixes #638569 + +2011-01-03 01:18:06 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2src.c: + v4l2src: undo presumably accidental enablement of the GstXOverlay interface + Looks like this got enabled by accident when adding it to v4l2sink, + so undo this for now. Not sure it makes much sense in a GStreamer + context with current hardware. + +2011-01-03 15:40:11 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: increase udp buffer size + Set a bigger UDP buffer size by default to reduce packet loss with + high bitrate streams. + +2011-01-02 19:19:27 -0800 David Schleef + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + multifilesink: send stream headers in key-frame mode + +2011-01-02 19:43:02 +0000 Tim-Philipp Müller + + * ext/jack/Makefile.am: + * ext/jack/README: + * ext/jack/gstjack.c: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: fix up element details and some other minor clean-ups + +2011-01-02 19:23:51 +0000 Erich Schubert + + * gst/id3demux/id3v2frames.c: + id3demux: fix parsing of ID3v2.4 genre frames with multiple genres + We'd only extract the first genre (multiple times) instead of all + genres. + https://bugzilla.gnome.org/show_bug.cgi?id=638535 + +2011-01-02 17:40:41 +0000 Tim-Philipp Müller + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: template caps had lists with one value, just use value directly + +2011-01-02 17:07:19 +0000 Tim-Philipp Müller + + * ext/jack/gstjack.c: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: make get_type functions thread-safe + Because we can (shouldn't be needed with other workarounds still there). + +2011-01-02 15:27:19 +0000 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-rtp.xml: + docs: update plugin docs + +2011-01-02 15:25:41 +0000 Tim-Philipp Müller + + * .gitignore: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-jack.xml: + * ext/Makefile.am: + * gst-plugins-good.spec.in: + * tests/examples/Makefile.am: + * tests/examples/jack/Makefile.am: + jack: new jackaudiosrc and jackaudiosink elements, moved from gst-plugins-bad + https://bugzilla.gnome.org/show_bug.cgi?id=621929 + +2010-10-19 16:23:23 +0300 Stefan Kost + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + various (ext): add missing G_PARAM_STATIC_STRINGS flags + Canonicalize property names as needed. + +2010-09-09 14:49:06 -0400 Tristan Matthews + + * ext/jack/Makefile.am: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: added translatable text for server not found error + +2010-09-06 17:17:54 -0400 Tristan Matthews + + * tests/examples/jack/Makefile.am: + * tests/examples/jack/jack_client.c: + examples: add test to demonstrate jack_client_t usage + +2010-09-06 16:11:31 -0400 Tristan Matthews + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + * ext/jack/gstjackaudioclient.c: + * ext/jack/gstjackaudioclient.h: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosink.h: + * ext/jack/gstjackaudiosrc.c: + * ext/jack/gstjackaudiosrc.h: + jack: added client property + +2010-06-17 16:26:07 -0400 Tristan Matthews + + * ext/jack/gstjackbin.c: + jack: removed unused file gstjackbin.c + This is a 0.8 leftover. + +2010-05-13 12:55:29 +0200 Wim Taymans + + * ext/jack/gstjackaudiosrc.c: + jacksrc: make sure we always read nframes + Error out when we are asked to read a different size that what was configured as + the jack period size because that would mean something else is wrong. + Fixes #618409 + +2010-05-11 17:56:31 -0400 Tristan Matthews + + * ext/jack/gstjackaudiosrc.c: + * ext/jack/gstjackaudiosrc.h: + jack: improve process_cb + +2010-04-27 10:48:32 -0400 Tristan Matthews + + * ext/jack/Makefile.am: + * ext/jack/gstjackaudiosrc.c: + * ext/jack/gstjackutil.c: + * ext/jack/gstjackutil.h: + jack: implement multichannel support correctly for jackaudiosrc + Fixes parts of bug #616541. + +2010-04-27 11:21:16 +0300 Stefan Kost + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + * ext/jack/gstjackringbuffer.h: + jack: remove empty dispose and finalize methods + +2010-04-27 10:59:00 +0300 Stefan Kost + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: don't leak caps + Add dispose methods to clear caps. + +2010-04-27 10:34:24 +0300 Stefan Kost + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: don't use GST_DEBUG_FUNCPTR for gobject vmethods + +2010-03-24 15:59:53 +0200 Stefan Kost + + * ext/jack/gstjackaudiosrc.c: + jack: fix element name in section doc blob + +2010-03-22 16:56:03 +0100 Benjamin Otte + + * ext/jack/gstjackaudiosrc.c: + Add -Wold-style-definition + and fix the warnings + +2010-03-21 21:39:18 +0100 Benjamin Otte + + * ext/jack/gstjack.h: + Add -Wmissing-declarations -Wmissing-prototypes to configure flags + And fix all warnings + +2010-03-18 17:30:26 +0100 Benjamin Otte + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + gst_element_class_set_details => gst_element_class_set_details_simple + +2009-10-12 09:06:37 +0300 Stefan Kost + + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + jack: ensure segtotal is at least 2 + Not only adjust buffer-time and avoid segtotal=0, but instead ensure segtotal is + atleast 2. Do same change on jacksrc. We could also check the latency and buffer + time configured by the client and adjust buffer-time so that we get to the same + number of segments. + +2009-10-12 00:51:27 +0300 Stefan Kost + + * ext/jack/gstjackaudiosink.c: + jack: don't crash in ringbuffer with SIGFPE on small buffer-times + Jack overrides user-specified latency-time with the one it gets from jack + itself. It also needs to adjust buffer-time somewhat to avoid segtotal being 0 + +2009-05-11 16:12:54 +0300 Stefan Kost + + * ext/jack/gstjackaudioclient.c: + * ext/jack/gstjackaudiosink.c: + jack: when stopping playback, do one more cycle to flush the port. Fixes #582167 + The gst_jack_audio_client_set_active() flags the port as deactivating and uses + a GCond to wait until the jack_process_cb() has run once more and cleared the + flag. This way the client zero's the buffer. This happens if one manyally go + to PAUSED and then to READY, while leting the mainloop run inbetween. + +2009-03-16 11:21:02 +0100 Wim Taymans + + * 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. + +2008-11-23 17:50:08 +0000 Stefan Kost + + ext/jack/: Query port latencies for sink/src delays. + Original commit message from CVS: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosrc.c: + Query port latencies for sink/src delays. + * ext/jack/gstjackbin.c: + No printf please. + +2008-11-04 12:42:30 +0000 Stefan Kost + + Don't install static libs for plugins. Fixes #550851 for -bad. + Original commit message from CVS: + * ext/alsaspdif/Makefile.am: + * ext/amrwb/Makefile.am: + * ext/apexsink/Makefile.am: + * ext/arts/Makefile.am: + * ext/artsd/Makefile.am: + * ext/audiofile/Makefile.am: + * ext/audioresample/Makefile.am: + * ext/bz2/Makefile.am: + * ext/cdaudio/Makefile.am: + * ext/celt/Makefile.am: + * ext/dc1394/Makefile.am: + * ext/dirac/Makefile.am: + * ext/directfb/Makefile.am: + * ext/divx/Makefile.am: + * ext/dts/Makefile.am: + * ext/faac/Makefile.am: + * ext/faad/Makefile.am: + * ext/gsm/Makefile.am: + * ext/hermes/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/jack/Makefile.am: + * ext/jp2k/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/lcs/Makefile.am: + * ext/libfame/Makefile.am: + * ext/libmms/Makefile.am: + * ext/metadata/Makefile.am: + * ext/mpeg2enc/Makefile.am: + * ext/mplex/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/mythtv/Makefile.am: + * ext/nas/Makefile.am: + * ext/neon/Makefile.am: + * ext/ofa/Makefile.am: + * ext/polyp/Makefile.am: + * ext/resindvd/Makefile.am: + * ext/sdl/Makefile.am: + * ext/shout/Makefile.am: + * ext/snapshot/Makefile.am: + * ext/sndfile/Makefile.am: + * ext/soundtouch/Makefile.am: + * ext/spc/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/tarkin/Makefile.am: + * ext/theora/Makefile.am: + * ext/timidity/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * ext/xine/Makefile.am: + * ext/xvid/Makefile.am: + * gst-libs/gst/app/Makefile.am: + * gst-libs/gst/dshow/Makefile.am: + * gst/aiffparse/Makefile.am: + * gst/app/Makefile.am: + * gst/audiobuffer/Makefile.am: + * gst/bayer/Makefile.am: + * gst/cdxaparse/Makefile.am: + * gst/chart/Makefile.am: + * gst/colorspace/Makefile.am: + * gst/dccp/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/deinterlace2/Makefile.am: + * gst/dvdspu/Makefile.am: + * gst/festival/Makefile.am: + * gst/filter/Makefile.am: + * gst/flacparse/Makefile.am: + * gst/flv/Makefile.am: + * gst/games/Makefile.am: + * gst/h264parse/Makefile.am: + * gst/librfb/Makefile.am: + * gst/mixmatrix/Makefile.am: + * gst/modplug/Makefile.am: + * gst/mpeg1sys/Makefile.am: + * gst/mpeg4videoparse/Makefile.am: + * gst/mpegdemux/Makefile.am: + * gst/mpegtsmux/Makefile.am: + * gst/mpegvideoparse/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/nuvdemux/Makefile.am: + * gst/overlay/Makefile.am: + * gst/passthrough/Makefile.am: + * gst/pcapparse/Makefile.am: + * gst/playondemand/Makefile.am: + * gst/rawparse/Makefile.am: + * gst/real/Makefile.am: + * gst/rtjpeg/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/scaletempo/Makefile.am: + * gst/sdp/Makefile.am: + * gst/selector/Makefile.am: + * gst/smooth/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/speed/Makefile.am: + * gst/speexresample/Makefile.am: + * gst/stereo/Makefile.am: + * gst/subenc/Makefile.am: + * gst/tta/Makefile.am: + * gst/vbidec/Makefile.am: + * gst/videodrop/Makefile.am: + * gst/videosignal/Makefile.am: + * gst/virtualdub/Makefile.am: + * gst/vmnc/Makefile.am: + * gst/y4m/Makefile.am: + * sys/acmenc/Makefile.am: + * sys/cdrom/Makefile.am: + * sys/dshowdecwrapper/Makefile.am: + * sys/dshowsrcwrapper/Makefile.am: + * sys/dvb/Makefile.am: + * sys/dxr3/Makefile.am: + * sys/fbdev/Makefile.am: + * sys/oss4/Makefile.am: + * sys/qcam/Makefile.am: + * sys/qtwrapper/Makefile.am: + * sys/vcd/Makefile.am: + * sys/wininet/Makefile.am: + * win32/common/config.h: + Don't install static libs for plugins. Fixes #550851 for -bad. + +2008-09-17 13:59:21 +0000 Jan Schmidt + + Fix compiler warnings on OS/X + Original commit message from CVS: + * ext/jack/gstjackaudiosink.c: (jack_process_cb): + * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): + Fix compiler warnings on OS/X + +2008-08-07 13:15:21 +0000 Stefan Kost + + ext/jack/gstjackaudiosrc.c: Try committing this once again. Now properly renamed. + Original commit message from CVS: + * ext/jack/gstjackaudiosrc.c: + Try committing this once again. Now properly renamed. + +2008-08-07 09:09:44 +0000 Stefan Kost + + docs/plugins/: docs/plugins/inspect/plugin-jack.xml + Original commit message from CVS: + * 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/inspect/plugin-jack.xml + Add new element to docs. + * ext/jack/gstjack.h + Add missing file. + * ext/jack/gstjackaudiosrc.c: + * ext/jack/gstjackaudiosrc.h: + Rename jackaudiosrc to jack_audio_src. + +2008-08-07 08:47:40 +0000 Tristan Matthews + + ext/jack/: Add a jackaudiosrc. Refactor sink slightly for better code reuse. + Original commit message from CVS: + patch by: Tristan Matthews + * ext/jack/Makefile.am: + * ext/jack/gstjack.c: + * ext/jack/gstjackaudioclient.c: + * ext/jack/gstjackaudiosink.c: + * ext/jack/gstjackaudiosink.h: + * ext/jack/gstjackaudiosrc.c: + * ext/jack/gstjackaudiosrc.h: + * ext/jack/gstjackringbuffer.h: + Add a jackaudiosrc. Refactor sink slightly for better code reuse. + Fixes #545197. + +2008-06-13 11:59:23 +0000 Stefan Kost + + docs/plugins/: docs/plugins/inspect/plugin-mythtv.xml + Original commit message from CVS: + * 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-alsaspdif.xml: + * docs/plugins/inspect/plugin-amrwb.xml: + * docs/plugins/inspect/plugin-app.xml: + * docs/plugins/inspect/plugin-bayer.xml: + * docs/plugins/inspect/plugin-bz2.xml: + * docs/plugins/inspect/plugin-cdaudio.xml: + * docs/plugins/inspect/plugin-cdxaparse.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-filter.xml: + * docs/plugins/inspect/plugin-flvdemux.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-h264parse.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-ladspa.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-mpegtsparse.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-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-oss4.xml + * docs/plugins/inspect/plugin-rawparse.xml: + * docs/plugins/inspect/plugin-real.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rfbsrc.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-speexresample.xml: + * docs/plugins/inspect/plugin-stereo.xml: + * docs/plugins/inspect/plugin-subenc.xml + * docs/plugins/inspect/plugin-timidity.xml: + * docs/plugins/inspect/plugin-tta.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-xvid.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * ext/amrwb/gstamrwbdec.c: + * ext/amrwb/gstamrwbenc.c: + * ext/amrwb/gstamrwbparse.c: + * ext/dc1394/gstdc1394.c: + * ext/directfb/dfbvideosink.c: + * ext/ivorbis/vorbisdec.c: + * ext/jack/gstjackaudiosink.c: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mplex/gstmplex.cc: + * ext/musicbrainz/gsttrm.c: + * ext/mythtv/gstmythtvsrc.c: + * ext/theora/theoradec.c: + * ext/timidity/gsttimidity.c: + * ext/timidity/gstwildmidi.c: + * gst-libs/gst/app/gstappsink.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/dvdspu/gstdvdspu.c: + * gst/festival/gstfestival.c: + * gst/freeze/gstfreeze.c: + * gst/interleave/deinterleave.c: + * gst/interleave/interleave.c: + * gst/modplug/gstmodplug.cc: + * gst/nuvdemux/gstnuvdemux.c: + Add missing elements to docs. Fix doc-markup: use convinience syntax + for examples (produces valid docbook), add several refsec2 when we + have several titles. Fix some types. + +2008-06-12 14:49:18 +0000 Stefan Kost + + Do not use short_description in section docs for elements. We extract them from element details and there will be war... + Original commit message from CVS: + * ext/dc1394/gstdc1394.c: + * ext/ivorbis/vorbisdec.c: + * ext/jack/gstjackaudiosink.c: + * ext/metadata/gstmetadatademux.c: + * ext/mythtv/gstmythtvsrc.c: + * ext/theora/theoradec.c: + * gst-libs/gst/app/gstappsink.c: + * gst/bayer/gstbayer2rgb.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/rawparse/gstaudioparse.c: + * gst/rawparse/gstvideoparse.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/selector/gstinputselector.c: + * gst/selector/gstoutputselector.c: + * gst/videosignal/gstvideoanalyse.c: + * gst/videosignal/gstvideodetect.c: + * gst/videosignal/gstvideomark.c: + * sys/oss4/oss4-mixer.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + Do not use short_description in section docs for elements. We extract + them from element details and there will be warnings if they differ. + Also fixing up the ChangeLog order. + +2008-05-26 17:52:21 +0000 Wim Taymans + + ext/jack/gstjackaudiosink.c: Include the element name in the port name to avoid duplicate port names. + Original commit message from CVS: + * ext/jack/gstjackaudiosink.c: + (gst_jack_audio_sink_allocate_channels): + Include the element name in the port name to avoid duplicate port names. + +2008-04-06 20:18:16 +0000 Tim-Philipp Müller + + ext/jack/gstjackaudiosink.c: Work around missing bits of thread-safety on older GLibs some more to avoid assertions w... + Original commit message from CVS: + * ext/jack/gstjackaudiosink.c: (gst_jack_audio_sink_class_init): + Work around missing bits of thread-safety on older GLibs some + more to avoid assertions when starting up multiple playbin + objects concurrently (see #512382). + +2008-03-13 14:25:20 +0000 Sebastian Dröge + + Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead of hardcoding values where possible. Fixes bug #522212. + Original commit message from CVS: + * ext/alsaspdif/alsaspdifsink.c: + * ext/gsm/gstgsm.c: + * ext/jack/gstjack.c: + * ext/libmms/gstmms.c: + * ext/neon/gstneonhttpsrc.c: + * ext/shout/gstshout.c: + * ext/timidity/gsttimidity.c: + * ext/timidity/gstwildmidi.c: + * gst/nuvdemux/gstnuvdemux.c: + * gst/tta/gsttta.c: + Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead + of hardcoding values where possible. Fixes bug #522212. + +2007-07-18 07:42:47 +0000 Stefan Kost + + ext/jack/gstjackaudiosink.c: Add stdlib include here too. + Original commit message from CVS: + * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_open_device), + (gst_jack_ring_buffer_acquire): + Add stdlib include here too. + +2007-04-04 07:36:28 +0000 Stefan Kost + + ext/jack/gstjackaudiosink.c: Try t better name clients. properly handle return codes when re- establishing links. + Original commit message from CVS: + * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_open_device), + (gst_jack_ring_buffer_acquire): + Try t better name clients. properly handle return codes when re- + establishing links. + +2007-03-18 17:57:48 +0000 Paul Davis + + ext/jack/gstjackaudioclient.c: Don't need to take the connection lock, it will not be used and could cause deadlocks. + Original commit message from CVS: + Based on patch by: Paul Davis + * ext/jack/gstjackaudioclient.c: (gst_jack_audio_unref_connection): + Don't need to take the connection lock, it will not be used and could + cause deadlocks. + +2007-03-08 15:24:52 +0000 Paul Davis + + ext/jack/: Make an object to manage client connections to the jack server which we will use in the future to run sele... + Original commit message from CVS: + Includes patch by: Paul Davis + * ext/jack/Makefile.am: + * ext/jack/gstjackaudioclient.c: (gst_jack_audio_client_init), + (jack_process_cb), (jack_sample_rate_cb), (jack_buffer_size_cb), + (jack_shutdown_cb), (connection_find), + (gst_jack_audio_make_connection), (gst_jack_audio_get_connection), + (gst_jack_audio_unref_connection), + (gst_jack_audio_connection_add_client), + (gst_jack_audio_connection_remove_client), + (gst_jack_audio_client_new), (gst_jack_audio_client_free), + (gst_jack_audio_client_get_client), + (gst_jack_audio_client_set_active): + * ext/jack/gstjackaudioclient.h: + Make an object to manage client connections to the jack server which we + will use in the future to run selected jack elements with the same jack + connection. + Make some stuff a bit more threadsafe. + Activate the jack client ASAP. + * ext/jack/gstjackaudiosink.c: + (gst_jack_audio_sink_allocate_channels), + (gst_jack_audio_sink_free_channels), (jack_process_cb), + (gst_jack_ring_buffer_open_device), + (gst_jack_ring_buffer_close_device), + (gst_jack_ring_buffer_acquire), (gst_jack_ring_buffer_release), + (gst_jack_audio_sink_class_init), (gst_jack_audio_sink_init), + (gst_jack_audio_sink_getcaps): + * ext/jack/gstjackaudiosink.h: + Use new client object to manage connections. + Don't remove and recreate all ports, try to reuse them. + +2007-01-12 10:25:40 +0000 Wim Taymans + + ext/jack/gstjackaudiosink.*: Improve docs. + Original commit message from CVS: + * ext/jack/gstjackaudiosink.c: (jack_sample_rate_cb), + (jack_buffer_size_cb), (jack_shutdown_cb), + (gst_jack_ring_buffer_acquire): + * ext/jack/gstjackaudiosink.h: + Improve docs. + +2006-12-06 16:57:17 +0000 Jan Schmidt + + ext/jack/.cvsignore: Ignore old files as requested by the build slave. + Original commit message from CVS: + * ext/jack/.cvsignore: + Ignore old files as requested by the build slave. + +2006-11-30 11:59:04 +0000 Wim Taymans + + ext/Makefile.am: Fix build. + Original commit message from CVS: + * ext/Makefile.am: + Fix build. + * ext/jack/gstjackaudiosink.c: (jack_process_cb), + (jack_sample_rate_cb), (jack_buffer_size_cb), (jack_shutdown_cb), + (gst_jack_ring_buffer_acquire): + Small cleanups. + +2006-11-30 11:49:36 +0000 Wim Taymans + + Added fully functional jackaudiosink. + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + * ext/jack/Makefile.am: + * ext/jack/gstjack.c: (plugin_init): + * ext/jack/gstjack.h: + * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_get_type), + (gst_jack_ring_buffer_class_init), (jack_process_cb), + (jack_sample_rate_cb), (jack_buffer_size_cb), (jack_shutdown_cb), + (gst_jack_ring_buffer_init), (gst_jack_ring_buffer_dispose), + (gst_jack_ring_buffer_finalize), + (gst_jack_ring_buffer_open_device), + (gst_jack_ring_buffer_close_device), + (gst_jack_ring_buffer_acquire), (gst_jack_ring_buffer_release), + (gst_jack_ring_buffer_start), (gst_jack_ring_buffer_pause), + (gst_jack_ring_buffer_stop), (gst_jack_ring_buffer_delay), + (gst_jack_connect_get_type), (gst_jack_audio_sink_base_init), + (gst_jack_audio_sink_class_init), (gst_jack_audio_sink_init), + (gst_jack_audio_sink_set_property), + (gst_jack_audio_sink_get_property), (gst_jack_audio_sink_getcaps), + (gst_jack_audio_sink_create_ringbuffer): + * ext/jack/gstjackaudiosink.h: + Added fully functional jackaudiosink. + +2006-04-08 21:48:01 +0000 Stefan Kost + + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + Original commit message from CVS: + * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_class_init): + * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_class_init): + * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_class_init): + * ext/arts/gst_arts.c: (gst_arts_class_init): + * ext/artsd/gstartsdsink.c: (gst_artsdsink_class_init): + * ext/audiofile/gstafsink.c: (gst_afsink_class_init): + * ext/audiofile/gstafsrc.c: (gst_afsrc_class_init): + * ext/audioresample/gstaudioresample.c: + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): + * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_class_init): + * ext/divx/gstdivxdec.c: (gst_divxdec_class_init): + * ext/hermes/gsthermescolorspace.c: + (gst_hermes_colorspace_class_init): + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_class_init): + * ext/jack/gstjack.c: (gst_jack_class_init): + * ext/jack/gstjackbin.c: (gst_jack_bin_class_init): + * ext/lcs/gstcolorspace.c: (gst_colorspace_class_init): + * ext/libfame/gstlibfame.c: (gst_fameenc_class_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): + * ext/nas/nassink.c: (gst_nassink_class_init): + * ext/shout/gstshout.c: (gst_icecastsend_class_init): + * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): + * ext/sndfile/gstsf.c: (gst_sf_class_init): + * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_class_init), + (gst_swfdec_class_init): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_class_init): + * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_class_init): + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_class_init): + * gst/chart/gstchart.c: (gst_chart_class_init): + * gst/colorspace/gstcolorspace.c: (gst_colorspace_class_init): + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_class_init): + * gst/festival/gstfestival.c: (gst_festival_class_init): + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): + * gst/filter/gstiir.c: (gst_iir_class_init): + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): + * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init): + * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_class_init): + * gst/mpeg1sys/gstmpeg1systemencode.c: + (gst_system_encode_class_init): + * gst/mpeg1videoparse/gstmp1videoparse.c: + (gst_mp1videoparse_class_init): + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_class_init): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_class_init): + * gst/overlay/gstoverlay.c: (gst_overlay_class_init): + * gst/passthrough/gstpassthrough.c: (passthrough_class_init): + * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init): + * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_class_init): + * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_class_init): + * gst/smooth/gstsmooth.c: (gst_smooth_class_init): + * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init): + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): + * gst/stereo/gststereo.c: (gst_stereo_class_init): + * gst/switch/gstswitch.c: (gst_switch_class_init): + * gst/tta/gstttadec.c: (gst_tta_dec_class_init): + * gst/tta/gstttaparse.c: (gst_tta_parse_class_init): + * gst/vbidec/gstvbidec.c: (gst_vbidec_class_init): + * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init): + * gst/virtualdub/gstxsharpen.c: (gst_xsharpen_class_init): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_class_init): + * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): + * sys/directsound/gstdirectsoundsink.c: + (gst_directsoundsink_class_init): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_class_init): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_class_init): + * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_class_init): + * sys/v4l2/gstv4l2colorbalance.c: + (gst_v4l2_color_balance_channel_class_init): + * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_channel_class_init), + (gst_v4l2_tuner_norm_class_init): + * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_class_init): + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + +2006-04-01 10:09:11 +0000 Thomas Vander Stichele + + * ext/jack/gstjack.c: + rework build; add translations for v4l2 + Original commit message from CVS: + rework build; add translations for v4l2 + +2005-10-12 14:29:55 +0000 Stefan Kost + + renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition + Original commit message from CVS: + * examples/indexing/indexmpeg.c: (main): + * ext/artsd/gstartsdsink.c: (gst_artsdsink_open_audio), + (gst_artsdsink_close_audio), (gst_artsdsink_change_state): + * ext/artsd/gstartsdsink.h: + * ext/audiofile/gstafparse.c: (gst_afparse_open_file), + (gst_afparse_close_file): + * ext/audiofile/gstafparse.h: + * ext/audiofile/gstafsink.c: (gst_afsink_open_file), + (gst_afsink_close_file), (gst_afsink_chain), + (gst_afsink_change_state): + * ext/audiofile/gstafsink.h: + * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), + (gst_afsrc_close_file), (gst_afsrc_change_state): + * ext/audiofile/gstafsrc.h: + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_init): + * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_init): + * ext/dts/gstdtsdec.c: (gst_dtsdec_init): + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: (gst_jack_bin_init), + (gst_jack_bin_change_state): + * ext/musepack/gstmusepackdec.c: (gst_musepackdec_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_init): + * ext/nas/nassink.c: (gst_nassink_open_audio), + (gst_nassink_close_audio), (gst_nassink_change_state): + * ext/nas/nassink.h: + * ext/polyp/polypsink.c: (gst_polypsink_init): + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_change_state): + * ext/sdl/sdlvideosink.h: + * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): + * ext/sndfile/gstsf.c: (gst_sf_set_property), + (gst_sf_change_state), (gst_sf_release_request_pad), + (gst_sf_open_file), (gst_sf_close_file), (gst_sf_loop): + * ext/sndfile/gstsf.h: + * ext/swfdec/gstswfdec.c: (gst_swfdec_init): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_init): + * gst/apetag/apedemux.c: (gst_ape_demux_init): + * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init): + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_init): + * gst/festival/gstfestival.c: (gst_festival_change_state): + * gst/festival/gstfestival.h: + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): + * gst/multifilesink/gstmultifilesink.c: (gst_multifilesink_init), + (gst_multifilesink_set_location), (gst_multifilesink_open_file), + (gst_multifilesink_close_file), (gst_multifilesink_next_file), + (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), + (gst_multifilesink_chain), (gst_multifilesink_change_state): + * gst/multifilesink/gstmultifilesink.h: + * gst/videodrop/gstvideodrop.c: (gst_videodrop_init): + * sys/cdrom/gstcdplayer.c: (cdplayer_init): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init), + (dxr3audiosink_open), (dxr3audiosink_close), + (dxr3audiosink_chain_pcm), (dxr3audiosink_chain_ac3), + (dxr3audiosink_change_state): + * sys/dxr3/dxr3audiosink.h: + * sys/dxr3/dxr3spusink.c: (dxr3spusink_init), (dxr3spusink_open), + (dxr3spusink_close), (dxr3spusink_chain), + (dxr3spusink_change_state): + * sys/dxr3/dxr3spusink.h: + * sys/dxr3/dxr3videosink.c: (dxr3videosink_init), + (dxr3videosink_open), (dxr3videosink_close), + (dxr3videosink_write_data), (dxr3videosink_change_state): + * sys/dxr3/dxr3videosink.h: + * sys/glsink/glimagesink.c: (gst_glimagesink_init): + * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), + (gst_qcamsrc_open), (gst_qcamsrc_close): + * sys/qcam/gstqcamsrc.h: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): + * sys/vcd/vcdsrc.c: (gst_vcdsrc_set_property), (gst_vcdsrc_get), + (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), + (gst_vcdsrc_change_state), (gst_vcdsrc_recalculate): + * sys/vcd/vcdsrc.h: + renamed GST_FLAGS macros to GST_OBJECT_FLAGS + moved bitshift from macro to enum definition + +2005-09-05 17:20:29 +0000 Jan Schmidt + + * ext/jack/gstjack.c: + * ext/jack/gstjackbin.c: + Fix up all the state change functions. + Original commit message from CVS: + Fix up all the state change functions. + +2004-08-03 14:28:12 +0000 Benjamin Otte + + fixes for G_DISABLE_ASSERT and friends + Original commit message from CVS: + * examples/dynparams/filter.c: (ui_control_create): + * examples/gstplay/player.c: (print_tag): + * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad): + * ext/gdk_pixbuf/gstgdkanimation.c: + (gst_gdk_animation_iter_may_advance): + * ext/jack/gstjack.c: (gst_jack_request_new_pad): + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list), + (tag_list_to_id3_tag_foreach), (gst_id3_tag_handle_event): + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_tag_value): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value): + * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): + * gst-libs/gst/media-info/media-info-test.c: (print_tag): + * gst/sine/demo-dparams.c: (main): + * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): + * testsuite/alsa/formats.c: (create_pipeline): + * testsuite/alsa/sinesrc.c: (sinesrc_force_caps), (sinesrc_get): + fixes for G_DISABLE_ASSERT and friends + * gst/typefind/gsttypefindfunctions.c: (aac_type_find), + (mp3_type_frame_length_from_header), (mp3_type_find), + (plugin_init): + require mp3 typefinding to have at least MIN_HEADERS valid headers + add typefinding for AAC adts files + +2004-05-21 23:28:57 +0000 Stéphane Loeuillet + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + second batch : remove ',' at end of enums as they could confuse older gcc, foreign compilers (forte) and gtk-doc (in ... + Original commit message from CVS: + second batch : + remove ',' at end of enums as they could confuse older gcc, foreign compilers (forte) and gtk-doc + (in gst-plugins/ext/ this time) + +2004-03-15 19:32:27 +0000 Thomas Vander Stichele + + * ext/jack/gstjack.c: + * ext/jack/gstjackbin.c: + don't mix tabs and spaces + Original commit message from CVS: + don't mix tabs and spaces + +2004-03-15 16:32:54 +0000 Johan Dahlin + + *.h: Revert indenting + Original commit message from CVS: + * *.h: Revert indenting + +2004-03-14 22:34:33 +0000 Thomas Vander Stichele + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: + gst-indent + Original commit message from CVS: + gst-indent + +2004-01-12 03:40:18 +0000 David Schleef + + * ext/jack/gstjack.c: + Remove all usage of gst_pad_get_caps(), and replace it with gst_pad_get_allowed_caps() or gst_pad_get_negotiated_cap(). + Original commit message from CVS: + Remove all usage of gst_pad_get_caps(), and replace it with + gst_pad_get_allowed_caps() or gst_pad_get_negotiated_cap(). + +2003-12-22 01:47:09 +0000 David Schleef + + * ext/jack/gstjack.c: + Merge CAPS branch + Original commit message from CVS: + Merge CAPS branch + +2003-12-13 16:59:51 +0000 Benjamin Otte + + * ext/jack/gstjackbin.c: + removed GST_*_CAST. Disabling of type checking is done in glib. + Original commit message from CVS: + removed GST_*_CAST. Disabling of type checking is done in glib. + +2003-12-04 10:37:38 +0000 Andy Wingo + + * ext/jack/gstjack.c: + remove copyright field from plugins + Original commit message from CVS: + remove copyright field from plugins + +2003-11-07 12:47:02 +0000 Ronald S. Bultje + + * ext/jack/gstjackbin.c: + Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes fro... + Original commit message from CVS: + Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes from several source files + +2003-11-01 23:43:13 +0000 Iain Holmes + + * ext/jack/gstjack.c: + Jack fixed too + Original commit message from CVS: + Jack fixed too + +2003-10-29 03:15:55 +0000 David Schleef + + * ext/jack/gstjack.h: + change gst/bytestream.h to gst/bytestream/bytestream.h + Original commit message from CVS: + change gst/bytestream.h to gst/bytestream/bytestream.h + +2003-10-28 20:52:41 +0000 Benjamin Otte + + * ext/jack/gstjack.h: + merge TYPEFIND branch. Major changes: + Original commit message from CVS: + merge TYPEFIND branch. Major changes: + - totally reworked type(find) system + - all typefind functions are in gst/typefind now + - more typefind functions then before + - some plugins might fail to compile now because I don't have them installed and they + a) require bytestream or + b) haven't had their typefind fixed. + Please fix those plugins and put the typefind functions into gst/typefind if they don't have dependencies + +2003-10-08 16:08:19 +0000 Andy Wingo + + * ext/jack/gstjack.c: + /GstBuffer/GstData/ in the API where you can pass events. Fix the plugins to deal with that. Fixes #113488. + Original commit message from CVS: + /GstBuffer/GstData/ in the API where you can pass events. Fix the plugins to deal with that. Fixes #113488. + +2003-10-01 13:14:50 +0000 Ronald S. Bultje + + * ext/jack/gstjack.h: + New typefind system: bytestream is now part of the core all plugins have been modified to use this new typefind syste... + Original commit message from CVS: + New typefind system: + * bytestream is now part of the core + * all plugins have been modified to use this new typefind system + * asf typefinding added + * mpeg video stream typefiding removed because it's broken + * duplicate typefind entries removed + * extra id3 typefinding added, because we've seen 4 types of files + (riff/wav, flac, vorbis, mp3) with id3 headers and each of these needs + to work. Instead, I've added an id3 element and let it redo typefiding + after the id3 header. this needs a hack because spider only typefinds + once. We can remove this hack once spider supports multiple typefinds. + * with all this, mp3 typefinding is semi-rewritten + * id3 typefinding in flac/vorbis is removed, it's no longer needed + * fixed spider and gst-typefind to use this, too. + * Other general cleanups + +2003-09-30 12:56:27 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: + conform to the buffer-frames props entry -- much nicer now... + Original commit message from CVS: + conform to the buffer-frames props entry -- much nicer now... + +2003-08-10 00:01:58 +0000 David Schleef + + * ext/jack/Makefile.am: + Remove redundant plugindir definition + Original commit message from CVS: + Remove redundant plugindir definition + +2003-07-19 23:25:25 +0000 Leif Johnson + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + + changes for new float caps without slope/intercept + some category changes for plugins + Original commit message from CVS: + + changes for new float caps without slope/intercept + + some category changes for plugins + +2003-07-06 20:49:52 +0000 Ronald S. Bultje + + * ext/jack/gstjack.c: + New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as descri... + Original commit message from CVS: + New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as described in the previous commit's document. Note: some plugins will break, some pipelines will break, expect HEAD to be broken or at least not 100% working for a few days, but don't forget to report bugs + +2003-07-01 02:27:06 +0000 David Schleef + + * ext/jack/gstjack.c: + fix type punning + Original commit message from CVS: + fix type punning + +2003-06-29 19:46:13 +0000 Benjamin Otte + + * ext/jack/gstjack.c: + * ext/jack/gstjackbin.c: + compatibility fix for new GST_DEBUG stuff. + Original commit message from CVS: + compatibility fix for new GST_DEBUG stuff. + Includes fixes for missing includes for config.h and unistd.h + I only ensured for plugins I can build that they work, so if some of them are still broken, you gotta fix them yourselves unfortunately. + +2003-06-13 21:21:17 +0000 Wim Taymans + + * ext/jack/gstjack.c: + Removed ugly caps fixed flag hack, will be done automatically in core soon + Original commit message from CVS: + Removed ugly caps fixed flag hack, will be done automatically in + core soon + +2003-03-04 15:34:20 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: + update for the latest jack cvs and non-cothreaded gst scheduler + Original commit message from CVS: + update for the latest jack cvs and non-cothreaded gst scheduler + +2003-02-05 20:38:41 +0000 Jan Schmidt + + * ext/jack/gstjack.c: + Changed caps->fixed to use FLAG_SET + Original commit message from CVS: + Changed caps->fixed to use FLAG_SET + +2003-01-10 13:38:32 +0000 Thomas Vander Stichele + + * ext/jack/gstjack.c: + PadConnect -> PadLink + Original commit message from CVS: + PadConnect -> PadLink + +2003-01-10 10:22:25 +0000 Thomas Vander Stichele + + * ext/jack/gstjack.c: + another batch of connect->link fixes please let me know about issues and please refrain of making them yourself, so t... + Original commit message from CVS: + another batch of connect->link fixes + please let me know about issues + and please refrain of making them yourself, so that I don't spend double + the time resolving conflicts + +2002-12-08 14:50:10 +0000 Thomas Vander Stichele + + * ext/jack/Makefile.am: + parallel install fixes + Original commit message from CVS: + parallel install fixes + +2002-09-29 18:12:18 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjackbin.c: + licenses again + Original commit message from CVS: + licenses again + +2002-09-18 19:02:52 +0000 Christian Schaller + + * ext/jack/gstjack.c: + plugins part of license field patch + Original commit message from CVS: + plugins part of license field patch + +2002-09-10 09:31:40 +0000 Ronald S. Bultje + + * ext/jack/gstjack.c: + This updates all plugins to the new API for gst_pad_try_set_caps + Original commit message from CVS: + This updates all plugins to the new API for gst_pad_try_set_caps + +2002-09-09 23:27:38 +0000 Thomas Vander Stichele + + * ext/jack/gstjack.c: + removing warnings as approved by wim + Original commit message from CVS: + removing warnings as approved by wim + +2002-08-23 04:04:11 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjackbin.c: + fix jack input port connection + Original commit message from CVS: + fix jack input port connection + +2002-07-09 17:39:17 +0000 Andy Wingo + + * ext/jack/gstjack.c: + compile fixen, and prepare to move MAINTAINER_MODE to as-version.m4 + Original commit message from CVS: + compile fixen, and prepare to move MAINTAINER_MODE to as-version.m4 + +2002-07-02 23:35:07 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjackbin.c: + make jack work in all its full duplex glory + Original commit message from CVS: + make jack work in all its full duplex glory + +2002-06-12 03:32:02 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjackbin.c: + working jack elements (fixed a problem in upstream jack) random other fixen... + Original commit message from CVS: + * working jack elements (fixed a problem in upstream jack) + * random other fixen... + +2002-05-15 19:08:49 +0000 Steve Baker + + * ext/jack/gstjack.c: + use new bytestream api + Original commit message from CVS: + use new bytestream api + +2002-05-13 18:08:33 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: + update to new jack api + Original commit message from CVS: + update to new jack api + +2002-05-05 19:39:17 +0000 Andy Wingo + + * ext/jack/gstjack.c: + add some includes + Original commit message from CVS: + add some includes + +2002-05-05 01:08:05 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: + better initialization. it doesn't work over here, though. + Original commit message from CVS: + better initialization. it doesn't work over here, though. + +2002-05-04 21:38:56 +0000 Andy Wingo + + * ext/jack/gstjackbin.c: + a commit so that jack will build without errors on Uraeus's system ;) + Original commit message from CVS: + a commit so that jack will build without errors on Uraeus's system ;) + +2002-05-04 20:53:35 +0000 Andy Wingo + + * ext/jack/gstjack.c: + set caps once we know the sample rate of the system + Original commit message from CVS: + set caps once we know the sample rate of the system + +2002-05-04 18:57:44 +0000 Andy Wingo + + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: + some jack fixes, alsa touchups, and add rtp by default to the build if there are any problems building rtp, we're mov... + Original commit message from CVS: + some jack fixes, alsa touchups, and add rtp by default to the build + if there are any problems building rtp, we're moving it back to experimental ;) + +2002-04-20 21:42:51 +0000 Andy Wingo + + * ext/jack/gstjack.c: + a hack to work around intltool's brokenness a current check for mpeg2dec details->klass reorganizations an element br... + Original commit message from CVS: + * a hack to work around intltool's brokenness + * a current check for mpeg2dec + * details->klass reorganizations + * an element browser that uses details->klass + * separated cdxa parse out from the avi directory + +2002-04-16 17:14:05 +0000 Andy Wingo + + * ext/jack/Makefile.am: + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: + Finally we're on to a proper jack setup, with a specialized bin and elements that can only go in a jack bin. I had to... + Original commit message from CVS: + Finally we're on to a proper jack setup, with a specialized bin and elements + that can only go in a jack bin. I had to fix the parser first to do this, but + to run it, the syntax is like so: + gst-launch jackbin.( filesrc ! mad ! jacksink ) + But of course it's not fully functional yet. Sigh. + +2002-04-11 20:42:26 +0000 Andy Wingo + + * ext/jack/gstjack.c: + GstPadTemplate <-> gst_pad_template <-> GST_PAD_TEMPLATE same with *factory and typefind. + Original commit message from CVS: + GstPadTemplate <-> gst_pad_template <-> GST_PAD_TEMPLATE + same with *factory and typefind. + also, some -Werror fixes. + +2002-03-30 21:07:51 +0000 Andy Wingo + + * ext/jack/gstjack.c: + alphabetization fixen a jack caps fix + Original commit message from CVS: + * alphabetization fixen + * a jack caps fix + +2002-03-30 19:31:13 +0000 Andy Wingo + + * ext/jack/gstjack.c: + add notify back to filesrc, it's needed for MVC applications remove notify printouts from gst-launch cleanup in gst-p... + Original commit message from CVS: + * add notify back to filesrc, it's needed for MVC applications + * remove notify printouts from gst-launch + * cleanup in gst-plugins configure.ac + * some jack updates + * remove SELF_ITERATING flag in favor of SEF_SCHEDULABLE (not a clear name, + but it's what we have for the moment) + * improve parsing of request pad names, no more sscanf + * fixes to the fastscheduler Makefile.am + +2002-03-20 21:45:04 +0000 Andy Wingo + + * ext/jack/gstjack.c: + s/Gnome-Streamer/GStreamer/ + Original commit message from CVS: + s/Gnome-Streamer/GStreamer/ + +2002-03-19 04:10:06 +0000 Andy Wingo + + * ext/jack/Makefile.am: + * ext/jack/gstjack.c: + removal of //-style comments don't link plugins to core libs -- the versioning is done internally to the plugins with... + Original commit message from CVS: + * removal of //-style comments + * don't link plugins to core libs -- the versioning is done internally to the plugins with the plugin_info struct, + and symbol resolution is lazy, so we can always know if a plugin can be loaded by the plugin_info data. in theory. + +2002-03-19 01:39:43 +0000 Andy Wingo + + * ext/jack/Makefile.am: + s/@GST_PLUGIN_LDFLAGS@/$(GST_PLUGIN_LDFLAGS)/ @-substitued variables variables are defined as make variables automagi... + Original commit message from CVS: + s/@GST_PLUGIN_LDFLAGS@/$(GST_PLUGIN_LDFLAGS)/ + @-substitued variables variables are defined as make variables automagically, + and this gives the user the freedom to say make GST_PLUGIN_LDFLAGS=-myflag + +2002-03-18 04:41:35 +0000 Andy Wingo + + * ext/jack/Makefile.am: + * ext/jack/README: + * ext/jack/gstjack.c: + * ext/jack/gstjack.h: + s/gst_element_install_std_props/gst_element_class_install_std_props/ -- it just makes more sense that way added jack ... + Original commit message from CVS: + * s/gst_element_install_std_props/gst_element_class_install_std_props/ -- it just makes more sense that way + * added jack element, doesn't quite work right yet but i didn't want to lose the work -- it does build, register, + and attempt to run though + * imposed some restrictions on the naming of request pads to better allow for reverse parsing + * added '%s' to reverse parsing + * added new bin flag to indicate that it is self-iterating, and some lame code in gst-launch to test it out + * fixen on launch-gui + * added pkg-config stuff for the editor's libs + +2011-01-02 11:37:14 +0000 Tim-Philipp Müller + + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/v4l2_calls.c: + v4l2: mark v4l2sink as experimental and build only if --enable-experimental is passed + It's not really of 'good' quality yet, but there's a lot of + code shared with v4l2src, so not so easy to move it elswhere. + https://bugzilla.gnome.org/show_bug.cgi?id=612244 + +2011-01-02 01:24:21 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/v4l2_calls.c: + Revert "v4l2: add norm property" + This reverts commit 9e1d419d07337e6db2cc3936472be205ce927e54. + Reverting this since it adds unreviewed and bad API to v4l2src + (property of type enum, with seemingly random and unsorted values). + +2011-01-01 23:26:33 +0000 Tim-Philipp Müller + + * tools/.gitignore: + * tools/Makefile.am: + * tools/README.filterstamp: + * tools/filterstamp.sh: + * tools/gst-launch-ext-m.m: + * tools/gst-launch-ext.1.in: + * tools/gst-visualise-m.m: + * tools/gst-visualise.1.in: + tools: remove unused left-over directory + These are all in -base/tools. + +2010-12-31 13:57:05 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpmp4adepay.h: + mp4adepay: improve timestamps on outgoing packets + Improve parsing of the samplerate. + Parse the framelen so that we can calculate timestamps. + When interpollate the incomming timestamp on outgoing buffers when there are + multiple subframes. + fixes #625825 + +2010-12-31 02:16:54 +0000 Tim-Philipp Müller + + * ext/cairo/gsttimeoverlay.c: + * gst/videofilter/gstvideobalance.c: + cairo, videofilter: use gst/math-compat.h header for rint + +2010-12-30 14:30:27 -0800 David Schleef + + * gst/videofilter/gstvideobalance.c: + videobalance: Check for HAVE_RINT instead + Also change M_PI to G_PI for giggles. + +2010-12-30 14:21:37 -0800 David Schleef + + * ext/cairo/gstcairorender.c: + cairo: Don't use #ifdefs inside macros + +2010-12-30 14:20:52 -0800 David Schleef + + * gst/audiofx/audiochebband.c: + * gst/audiofx/audiocheblimit.c: + * gst/audiofx/audiokaraoke.c: + * gst/audiofx/audiowsincband.c: + * gst/audiofx/audiowsinclimit.c: + * gst/effectv/gstop.c: + * gst/equalizer/gstiirequalizer.c: + * gst/goom/convolve_fx.c: + * gst/goom/ifs.c: + * gst/goom/lines.c: + * gst/goom/tentacle3d.c: + * tests/examples/audiofx/firfilter-example.c: + * tests/examples/audiofx/iirfilter-example.c: + Change M_PI to G_PI + +2010-12-30 12:07:52 -0800 David Schleef + + * gst/videofilter/gstvideobalance.c: + videobalance: use G_OS_WIN32 for windows check + +2010-12-30 16:24:16 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4adepay.c: + mp4adepay: fix timestamps on buffers + +2010-12-30 16:22:48 +0100 Wim Taymans + + * gst/rtp/gstrtpmpvpay.c: + mpvpay: fix flushing and discont + Fix flushing and disconts. + Clean up in state changes. + +2010-12-29 23:38:18 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroska-demux: increase allowed max. block size for push mode from 10M to 15M + It was an arbitrary limit from the start, meant as a basic sanity check, + so may just as well increase it a little. Would be good to provide + progress reporting while completing the block in any case.. + https://bugzilla.gnome.org/show_bug.cgi?id=637060 + +2010-12-29 23:09:04 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroska-demux: assume matroska if no doctype is specified + https://bugzilla.gnome.org/show_bug.cgi?id=638019 + +2010-12-04 13:43:11 -0600 Rob Clark + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + v4l2: add interlaced support + +2010-10-02 14:45:14 -0500 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2sink.h: + * sys/v4l2/gstv4l2xoverlay.c: + * sys/v4l2/gstv4l2xoverlay.h: + v4l2sink: add navigation support + +2010-04-04 06:43:41 -0500 Rob Clark + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/v4l2_calls.c: + v4l2: add norm property + Based on a patch by Guennadi Liakhovetski. + +2010-07-13 10:03:51 -0500 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2_calls.h: + v4l2: cleanup get/set input/output + output devices should use get/set output, and in either case we should + not print a warning message if the ioctl fails but the device does not + claim to support the tuner interface + +2010-06-10 11:15:46 -0500 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2xoverlay.c: + * sys/v4l2/gstv4l2xoverlay.h: + v4l2xoverlay: add support to create window + If xoverlay is available, v4l2sink should create a window for the overlay to + display in. + The window automatically tries to make itself as large as possible. + This works well on a small screen, but perhaps should first attempt to use + the size of the video that is played (no scaling). + +2010-04-04 06:41:28 -0500 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: special handling for cases gst_buffer_make_metadata_writable() + Special case check for sub-buffers: In certain cases, places like + GstBaseTransform, which might check that the buffer is writable before copying + metadata, timestamp, and such, will find that the buffer has more than one + reference to it. In these cases, they will create a sub-buffer with an offset=0 + and length equal to the original buffer size. + This could happen in two scenarios: (1) a tee in the pipeline, and (2) because + the refcnt is incremented in gst_mini_object_free() before the finalize function + is called, and decremented after it returns.. but returning this buffer to the + buffer pool in the finalize function, could wake up a thread blocked in + _buffer_alloc() which could run and get a buffer w/ refcnt==2 before the thread + originally unref'ing the buffer returns from finalize function and decrements + the refcnt back to 1! + This is related to issue #545501 + +2010-04-04 06:39:52 -0500 Rob Clark + + * sys/v4l2/gstv4l2bufferpool.c: + v4l2: fix race condition + The size of the buffer would be zero'd out in gst_v4l2_buffer_finalize() + after the buffer is qbuf'd or pushed onto the queue of available buffers.. + leaving a race condition where the thread waiting for the buffer could awake + and set back a valid size before the finalizing thread zeros out the length. + This would result that the newly allocated buffer has length of zero. + +2010-04-04 06:39:08 -0500 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2sink.h: + v4l2sink: add properties to control crop + +2010-04-04 06:37:16 -0500 Rob Clark + + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2xoverlay.c: + v4l2: re-enable x-overlay support + +2010-12-25 11:52:36 -0600 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: fix for PAUSED->READY->PAUSED state transitions + When v4l2sink goes to PAUSED->READY it only stops streaming, so the state + should be set to STATE_PENDING_STREAMON in case the element transitions + back to PLAYING. + +2010-04-04 06:28:51 -0500 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2sink.h: + v4l2sink: add "min-queued-bufs" property + +2010-04-04 06:26:50 -0500 Rob Clark + + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/gstv4l2bufferpool.h: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/v4l2src_calls.c: + v4l2sink: Add support for blocking dequeue. + We'd prefer to throttle the decoder if we run out of buffers, to keep a bound + on memory usage. Also, for OMAP4 it is a requirement of the decoder to not + alternate between memory alloced by the display driver and malloc'd userspace + memory. + +2010-04-04 06:24:41 -0500 Rob Clark + + * sys/v4l2/gstv4l2bufferpool.c: + v4l2: clear flags before reusing buffer from buffer pool + note: this really only affects v4l2sink since gst_v4l2_buffer_pool_get() is + only called once per buffer in the v4l2src case (in + gst_v4l2src_buffer_pool_activate()) + +2010-04-04 06:23:31 -0500 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: don't render preroll buffers + Most v4l2 drivers will get upset when you queue the same buffer twice in a + row without first dequeueing it. + Rendering of pre-roll buffers can be re-introduced later, but will require + tracking the state of the buffer, and avoiding to re-QBUF if the buffer has + already been passed to the driver. + +2010-04-04 06:22:43 -0500 Rob Clark + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: Improve behavior for shared buffers. + When the decoder is using pad_alloc(), v4l2sink would behave badly if + the number of buffers ('queue-size' property) was not high enough to + account for all the buffers needed by the decoder, and other elements + (such as queues) between the decoder and v4l2sink. This patch + slightly increases the default number of buffers, and changes v4l2sink + to drop frames rather than return an error in case the number of + buffers is not high enough. + +2010-11-15 15:58:28 +0100 Andy Wingo + + * ext/pulse/pulsesrc.c: + * ext/pulse/pulsesrc.h: + add "client" property + * ext/pulse/pulsesrc.c (gst_pulsesrc_class_init, gst_pulsesrc_init) + (gst_pulsesrc_set_property, gst_pulsesrc_get_property) + (gst_pulsesrc_open): Add a "client" property, as in pulsesink. + Fixes #634914 + +2010-12-29 15:54:46 +0000 Tim-Philipp Müller + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: serialise/deserialise floats without changing locale + Use g_ascii_dtostr() and g_ascii_strtod() to serialise/deserialise + floating point numbers, instead of ugly hacks that switch locale + before and after calling libc functions (which is not a good idea + in a multi-threaded application). + +2010-12-29 14:40:05 +0000 Tim-Philipp Müller + + * gst/rtp/gstrtpjpegdepay.c: + rtpjpegdepay: fix framerate parsing for locales that use a comma as floating point + atof() converts strings according to the current locale, but the + framerate string will likely always use a dot as floating point + separator, so use g_ascii_strtod() instead (but also canonicalise + the string before, so we can handle both formats as input). + +2010-12-27 13:11:59 +0100 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: use the right variable + Use the right variable for specifying that we sent a receiver report. + +2010-12-23 16:42:29 -0600 Rob Clark + + * sys/v4l2/gstv4l2bufferpool.c: + v4l2: fix typo + +2010-12-23 16:03:00 -0600 Rob Clark + + * gst/matroska/matroska-demux.c: + matroska-demux: add stream-format and alignment properties for h264 + +2010-12-22 11:41:59 +0100 Wim Taymans + + * gst/rtp/gstrtpgstpay.c: + gstpay: fix klass, add RTP as a use case + +2010-12-12 15:10:47 +0100 Wim Taymans + + * gst/rtp/gstrtpgstdepay.c: + gstdepay: cleanup the cache + +2010-12-12 05:10:01 +0100 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpgstdepay.c: + * gst/rtp/gstrtpgstdepay.h: + * gst/rtp/gstrtpgstpay.c: + * gst/rtp/gstrtpgstpay.h: + gstpay/depay: add generic gstreamer payloader + Add the beginnings of a generic GStreamer buffers payloader. + +2010-12-23 17:06:58 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4gpay.c: + mp4gpay: reset state on flush-stop + +2010-12-23 16:26:07 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4gdepay.c: + mp4gdepay: flush state on flush-stop + +2010-12-23 16:25:15 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: on-npt-stop is a manager signal + +2010-12-23 15:24:29 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: improve RTP session handling + Store the RTP session in the stream so that we can more efficiently + perform actions on the stream based on RTP signals. + +2010-12-23 13:55:31 +0100 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: include last send RB block + Only report RB values for non-internal sources. + Report not only the RB blocks we last received from but also the last RB + block we sent to a source. + +2010-12-23 13:52:57 +0100 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsource.h: + rtpsession: remember last sent RB values. + +2010-12-23 13:00:49 +0100 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: include all stats and document + Include all possible stats of a source in the stats structure because we might + be interested in what happened in the past. + Document the stats property and the fields. + +2010-12-23 12:59:59 +0100 Wim Taymans + + * tests/examples/rtp/client-PCMA.c: + examples: add example RTP stats + Add some more RTP examples for how to retrieve RTP stats in a receiver. + +2010-12-23 12:58:05 +0100 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: also emit RTCP activity on SR + Also emit RTCP activity signals when we receive an SR packet without RB blocks, + such as from a sender that is not receiving anything. + +2010-12-23 11:10:55 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + docs: add some more gstrtpbin docs + +2010-12-22 21:27:11 +0100 Edward Hervey + + * sys/ximage/gstximagesrc.c: + ximagesrc: remote is a boolean (and not uint) property + +2010-12-22 19:58:21 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Don't use gst_pad_alloc_buffer() + Using this in a demuxer will cause deadlocks if there's + a pad with a pending pad-block downstream, no matter if + there is a queue between the pad or not. Queues pass + bufferalloc downstream from the same thread and only + act as a thread boundary for events and buffers. + +2010-12-22 14:14:08 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-mux.c: + matroskamux: fix subtitle pad template, we only handle kate for now + +2010-12-16 11:44:44 +0000 Tim-Philipp Müller + + * gst/rtsp/gstrtspsrc.c: + docs: update rtspsrc docs, rtpbin is not in -bad any more + +2010-12-22 11:42:31 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: unlock before emitting signals + +2010-12-21 22:34:49 +0100 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpac3pay.c: + * gst/rtp/gstrtpac3pay.h: + rtpac3pay: add AC3 payloader + +2010-12-21 22:17:19 +0100 Wim Taymans + + * gst/rtp/gstrtpac3depay.c: + ac3depay: fix debug category description + +2010-12-21 22:16:42 +0100 Wim Taymans + + * gst/rtp/gstrtpmpapay.c: + mpapay: add debug category + +2010-12-20 14:49:02 -0300 Thiago Santos + + * tests/check/Makefile.am: + * tests/check/elements/jpegenc.c: + jpegenc: Adds another test case + Adds a test for jpegenc to check that is possible to negotiate and + push buffers with different resolution one after another. + https://bugzilla.gnome.org/show_bug.cgi?id=637686 + +2010-12-21 13:37:40 -0300 Thiago Santos + + * ext/jpeg/gstjpegenc.c: + jpegenc: sink pad's getcaps shouldn't use the src pad getcaps + Instead of using get_allowed_caps on the srcpad, the sinkpad getcaps + should use the getcaps of the srcpad's peer. This way the srcpad + can keep using fixed_caps and sinkpad getcaps exposes all caps + that can be negotiated + https://bugzilla.gnome.org/show_bug.cgi?id=637686 + +2010-12-21 16:58:47 +0100 Wim Taymans + + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpbvdepay.c: + * gst/rtp/gstrtpbvpay.c: + * gst/rtp/gstrtpceltdepay.c: + * gst/rtp/gstrtpceltpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpdvdepay.c: + * gst/rtp/gstrtpdvpay.c: + * gst/rtp/gstrtpg722depay.c: + * gst/rtp/gstrtpg722pay.c: + * gst/rtp/gstrtpg723depay.c: + * gst/rtp/gstrtpg723pay.c: + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729pay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263depay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpj2kdepay.c: + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp2tpay.c: + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmparobustdepay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtpmpvpay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpqcelpdepay.c: + * gst/rtp/gstrtpqdmdepay.c: + * gst/rtp/gstrtpsirendepay.c: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + * gst/rtp/gstrtpvrawdepay.c: + * gst/rtp/gstrtpvrawpay.c: + rtp: add RTP hint to the klass + +2010-12-21 16:49:28 +0100 Wim Taymans + + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpbvdepay.c: + * gst/rtp/gstrtpbvpay.c: + * gst/rtp/gstrtpceltdepay.c: + * gst/rtp/gstrtpceltpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpdvdepay.c: + * gst/rtp/gstrtpdvpay.c: + * gst/rtp/gstrtpg722depay.c: + * gst/rtp/gstrtpg722pay.c: + * gst/rtp/gstrtpg723depay.c: + * gst/rtp/gstrtpg723pay.c: + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729pay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263depay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpj2kdepay.c: + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp2tpay.c: + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmparobustdepay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtpmpvpay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpqcelpdepay.c: + * gst/rtp/gstrtpqdmdepay.c: + * gst/rtp/gstrtpsirendepay.c: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + * gst/rtp/gstrtpvrawdepay.c: + * gst/rtp/gstrtpvrawpay.c: + rtp: fix rank of payloaders and depayloaders + Set the payloaders and depayloaders to a reasonable rank. + +2010-12-21 15:24:18 +0100 Wim Taymans + + * gst/rtp/gstrtpvrawdepay.c: + vrawdepay: reset depayloader state + Reset the depayloader state on flush-stop. + +2010-12-21 15:07:14 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmp4vpay.h: + mp4pay: use vmethod for intercepting events + +2010-12-21 13:55:40 +0100 Wim Taymans + + * gst/rtp/gstrtptheorapay.c: + theorapay: clear packet on flush-stop + +2010-12-21 13:49:41 +0100 Wim Taymans + + * gst/rtp/gstrtpvorbispay.c: + vorbispay: clear packet on flush-stop + +2010-12-21 12:31:44 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4gdepay.c: + mp4gdepay: reset depayloader state + +2010-12-21 12:29:58 +0100 Wim Taymans + + * gst/rtp/gstrtph264pay.c: + h264pay: flush adapter on flush-stop + +2010-12-20 18:49:49 +0100 Wim Taymans + + * gst/rtp/gstrtpmpapay.c: + mpapay: flush last packets on EOS + +2010-12-20 17:47:05 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From 169462a to 46445ad + +2010-12-20 16:51:47 +0100 Wim Taymans + + * gst/rtp/gstrtpmpapay.c: + mpapay: reset payloader on state change + +2010-12-20 16:05:36 +0100 Wim Taymans + + * gst/rtp/gstrtpmpapay.c: + mpapay: reset payloader on flush + Reset the payloader on a flush event. + Handle DISCONT better. + +2010-12-20 15:54:45 +0100 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: get better buffering level + When the jitterbuffer contains -1 timestamps, make sure we still calculate the + buffer fill level by skipping the -1 buffers. + Try to be more resilient to weird input timestamps. + +2010-12-20 11:10:22 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: provide a clock. + since we are using the clock for sync, we need to also provide a clock for good + measure. The reason is that even if downstream elements provide a clock, we + don't want to have that clock selected because it might not be running yet. + +2010-12-20 10:49:56 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: copy buffering stats + when we create an aggregate buffering message, copy the buffering stats form the + last message. At least we get correct buffering mode then. + +2010-12-19 11:02:41 +0100 Sebastian Dröge + + * tests/check/pipelines/wavenc.c: + wavenc: Fix memory leaks in the unit test + +2010-12-19 10:58:16 +0100 Sebastian Dröge + + * gst/effectv/gstradioac.c: + * gst/effectv/gstradioac.h: + radioactv: Prevent use of uninitialized values + Fixes bug #618652. + +2010-12-19 10:22:29 +0100 Sebastian Dröge + + * gst/debugutils/gstcapsdebug.c: + capsdebug: Don't leak pad templates created from static pad templates + +2010-11-29 12:36:06 +0000 Vincent Penquerc'h + + * sys/ximage/gstximagesrc.c: + * sys/ximage/gstximagesrc.h: + ximagesrc: change from XGetImage to XGetSubImage dependant on a property + ximagesrc: change from XGetImage to XGetSubImage dependant on a property + to avoid unnecessary performance hits by default. + +2010-11-28 16:04:35 +0000 Vincent Penquerc'h + + * sys/ximage/gstximagesrc.c: + ximagesrc: use XGetSubImage instead of XGetImage, works with remote X + ximagesrc: use XGetSubImage instead of XGetImage, works with remote X + (on my setup anyway...) + +2010-11-27 17:15:32 +0000 Vincent Penquerc'h + + * sys/ximage/gstximagesrc.c: + ximagesrc: fix various width/height calculations being off by one, + ximagesrc: fix various width/height calculations being off by one, + and make it so a single pixel width/height can be captured (except + the top left one, as 0,0,0,0 is reserved for full screen as per + the property comments). + +2010-12-17 19:19:35 -0600 Rob Clark + + * sys/v4l2/gstv4l2object.c: + fix compile errors on macosx + with i686-apple-darwin10-gcc-4.2.1: + gstv4l2object.c: In function 'gst_v4l2_object_get_nearest_size': + gstv4l2object.c:1988: warning: format '%u' expects type 'unsigned int', but argument 12 has type 'gint *' + gstv4l2object.c:1988: warning: format '%u' expects type 'unsigned int', but argument 13 has type 'gint *' + +2010-12-17 15:38:15 +0100 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + rtph264depay: determine output h264 layout using caps negotiation + ... thereby (partially) deprecating properties currently controlling whether + or not byte-stream output or NAL/AU alignment (though properties still determine + fallback if nothing specified in caps). + Fixes #606662. + +2010-12-16 18:55:43 +0100 Wim Taymans + + * gst/rtp/gstrtpj2kpay.c: + j2kpay: handle EOC correctly + Don't include the next 2 bytes when we are at the end of the data and there are + no more bytes left. + +2010-12-16 15:15:49 +0100 Mark Nauwelaerts + + * ext/pulse/pulsesink.c: + pulsesink: flush remaining buffered samples on EOS + ... which can make a difference between all or nothing when dealing + with short streams and relatively large ringbuffer segment. + +2010-12-16 10:04:19 +0100 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Change classification to Filter/Effect/Video/Deinterlace + +2010-12-15 18:21:34 +0100 Edward Hervey + + * gst/rtp/gstrtpj2kpay.c: + rtpj2kpay: Initialize all fields + Makes sad compliers happy + +2010-12-15 16:22:54 +0100 Wim Taymans + + * gst/rtp/gstrtpj2kpay.c: + j2kpay: cleanup header construction + Use a simpler way of constructing the header that doesn't depend on + the endianness. + +2010-12-15 13:30:50 +0000 Tim-Philipp Müller + + * configure.ac: + configure: depend on -base from git for new rtp base depayloader features + This is ok in this case, since the plan is to release core/base again + along with good/ugly/bad in the next cycle. + +2010-12-15 14:55:58 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From 20742ae to 169462a + +2010-12-15 13:12:09 +0100 Wim Taymans + + * gst/rtp/gstrtpj2kdepay.c: + * gst/rtp/gstrtpj2kdepay.h: + j2kdepay: add support for buffer lists + +2010-12-14 18:12:43 +0100 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + session: fix average RTCP packet size some more. + Fix stupid error in averaging macro. + Include udp headers in packet length estimation. + +2010-12-14 17:15:23 +0100 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpstats.c: + rtpbin: correctly calculate RTCP packet size + +2010-12-14 15:27:52 +0100 Wim Taymans + + * gst/rtp/gstrtpj2kpay.c: + j2kpay: stop scanning when we reached the end + Stop scanning for markers when we reached the end of the data. + +2010-12-13 16:23:24 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From 011bcc8 to 20742ae + +2010-12-13 12:56:12 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: avoid leaking sink events + Avoid leaking the newsegment event when it has the wrong format. + +2010-12-12 14:53:17 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4vpay.c: + mp4vpay: we can also accept xvid caps + +2010-12-12 01:39:06 +1100 Jan Schmidt + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Avoid infinite loop draining frames + When the pipeline is flushed just as we're draining history, + don't loop infinitely, just discard the history and abort. + +2010-12-11 17:39:20 +0000 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: add "max-errors" property to ignore decoding errors + Add property to ignore decoding errors. Default is to ignore a few + decoding errors if the input is packetized, but error out immediately + if the input is not packetized. + Ignoring errors for packetized input most likely doesn't work + properly yet, so don't do that for now. + https://bugzilla.gnome.org/show_bug.cgi?id=623063 + +2010-05-28 15:27:14 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegenc.c: + jpegenc: free/malloc instead of realloc, avoids memcpy + +2010-12-11 17:49:03 +0100 Sebastian Dröge + + * gst/qtdemux/qtdemux.c: + qtdemux: Check if there's actually a seek table before parsing it + +2010-12-11 17:46:17 +0100 Kishore Arepalli + + * gst/qtdemux/qtdemux.c: + qtdemux: Implement CONVERT and FORMATS query + Fixes bug #636784. + +2010-07-01 00:22:07 +0100 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroska-demux: put unrecognised RIFF format IDs into the unknown caps + Extra info can't hurt. Field names aren't necessarily consistent with + what's used elsewhere though (e.g. avidemux), but then neither are the + caps. + https://bugzilla.gnome.org/show_bug.cgi?id=623178 + +2010-10-29 22:50:14 +0100 Jan Schmidt + + * ext/pulse/pulsemixerctrl.c: + * ext/pulse/pulsemixerctrl.h: + pulsemixer: Implement MIXER_FLAG_AUTO_NOTIFICATIONS + Add the mixer flag and send notifications when either the volume or muted + status changes. + https://bugzilla.gnome.org/show_bug.cgi?id=618389 + +2010-02-08 21:41:29 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: mark DISCONT when resuming PLAY + In particular, when streaming interleaved, this arranges for setting a new + timestamp on outgoing buffer so downstream can appropriate reset + to a change in (rtp)time. + +2010-12-02 16:08:34 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: degrade gracefully upon failing seek and tweak QUERY_SEEKING response + +2010-10-25 11:51:06 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: add and use auto buffering mode + ... which selects BUFFER for a non-live stream, and otherwise SLAVE. + Fixes #633088. + +2010-12-06 12:16:12 +0100 Wim Taymans + + * gst/rtp/gstrtpj2kdepay.c: + * gst/rtp/gstrtpj2kdepay.h: + j2kdepay: make the depayloader more resilient + Use 3 adapters, one to accumulate paketization units, another on to accumulate + tiles and a last one to accumulate the final frame. + Don't just blindly flush the adapter on DISCONT but only discard the current + packetization unit. + When we dropped jpeg2000 packets between SOP markers, adjust the SOT header with + the new lenght. + +2010-12-09 13:49:04 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix flow return aggregation + +2010-12-08 11:35:33 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix handling near end-of-file corner cases + Also, relax some error handling to not bail out completely when something + feels amiss, but consider this EOF and continue with was obtained so far. + +2010-12-07 17:19:00 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fragmented support; fix offset handling and relax error raising + In particular, accept unknown stream in track fragment, and only error out + if that raises problems later on with respect to offset tracking. + Fixes #620283. + +2010-12-07 13:11:48 +0100 Mark Nauwelaerts + + * gst/flv/Makefile.am: + * gst/flv/gstflvdemux.c: + flvdemux: use aac codec-data to adjust samplerate if needed + Based on patch by Fabien Lebaillif-Delamare + Fixes #636621. + +2010-12-07 11:43:13 +0100 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: don't uncork in _start + Don't uncork in the _start method just yet but wait until we have written some + samples to pulseaudio. This avoid underruns on pulseaudio and less crackling + noises when starting. + +2010-12-06 19:59:49 +0100 Alessandro Decina + + * gst/qtdemux/qtdemux.c: + qtdemux: fix compiler warnings on OSX. + +2010-12-06 18:17:24 +0100 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: add debug to notify when skipping to jpeg header + +2010-12-06 18:16:19 +0100 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: discard incomplete image + ... as determined when finding SOI next image before an EOI. + Based on patch by David Hoyt + Fixes #635734. + +2010-12-06 17:45:38 +0100 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: avoid infinite loop when resyncing + Fixes #635734 (partly). + +2010-12-06 15:21:53 +0100 David Hoyt + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: pass along eos if received before buffer arrives + Fixes #636172. + +2010-10-20 11:05:49 +0200 Andoni Morales Alastruey + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-mux.c: + matroskamux: try to write timestamps in all the outgoing buffers + Fixes #632654. + +2010-12-06 12:17:21 +0100 Mark Nauwelaerts + + * gst/debugutils/progressreport.c: + * gst/debugutils/progressreport.h: + progressreport: optionally determine progress using buffer metadata + Based on patch by Leo Singer + Fixes #629418. + +2010-12-05 14:39:19 +0100 Edward Hervey + + * tests/check/elements/interleave.c: + check: Fixup the shutting down order + First bring down everything to NULL before attempting to unlink + or unref anything. + Avoids the tests just hanging there for ever waiting to acquire a + lock that doesn't exist anymore. + +2010-11-04 19:31:45 +0100 Janne Grunau + + * sys/v4l2/gstv4l2bufferpool.c: + v4l2src: set top field first for interlaced buffers if v4l2 exports it + https://bugzilla.gnome.org/show_bug.cgi?id=634393 + +2010-11-04 18:36:09 +0100 Janne Grunau + + * sys/v4l2/gstv4l2object.c: + v4l2src: check field information and set interlaced caps accordingly + Reject the format if the field type is not supported. + https://bugzilla.gnome.org/show_bug.cgi?id=634391 + +2010-12-03 17:42:14 +0100 Benjamin Gaignard + + * Android.mk: + * android/NOTICE: + * android/apetag.mk: + * android/avi.mk: + * android/flv.mk: + * android/gst/rtpmanager/gstrtpbin-marshal.c: + * android/gst/rtpmanager/gstrtpbin-marshal.h: + * android/gst/udp/gstudp-enumtypes.c: + * android/gst/udp/gstudp-enumtypes.h: + * android/gst/udp/gstudp-marshal.c: + * android/gst/udp/gstudp-marshal.h: + * android/icydemux.mk: + * android/id3demux.mk: + * android/qtdemux.mk: + * android/rtp.mk: + * android/rtpmanager.mk: + * android/rtsp.mk: + * android/soup.mk: + * android/udp.mk: + * android/wavenc.mk: + * android/wavparse.mk: + Add build system for Android + +2010-03-26 13:51:58 +0100 Guillaume Emont + + * gst/debugutils/gstnavseek.c: + navseek: add basic support to change playback rate + The following keys will now be interpreted by navseek: + 'f' means fast forward: the stream gets played at rate 2.0 + 'r' means rewind: the stream gets played at rate -2.0 + 'n' means normal: the stream gets played at rate 1.0 + Fixes #631516. + +2010-12-01 13:12:04 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: add support for e(a)c-3 audio + +2010-11-19 12:44:35 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: avoid sending EOS event twice + +2010-11-19 12:44:18 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: remove dead code trying to update stream duration + On the one hand, it insufficiently checks whether it only updates a dummy + segment. On the other hand, only doing this at the time the last sampled is + prepared (and sent downstream) is too little too late. + +2010-11-09 10:58:57 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fragmented support; handle ismv sample flags + +2010-11-08 11:41:21 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fragmented support; handle ismv stbl atoms + ... or lack of some thereof, such as mandatory stsz. Shuffle some code + in _stbl_init to detect this early enough. + +2010-11-08 11:39:37 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fragmented support; compensate for ismv offset handling + ... or lack thereof, which according to specs would put media data in + unlikely position. + +2010-11-04 14:07:56 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: fragmented support for push mode + +2010-11-04 10:17:37 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: fragmented support; proper and incremental moof parsing + That is, parse each moof in one pass (considering all contained streams' + metadata), and do so incrementally as needed for playback rather than + an initial complete scan of all moof (though all moov sample metadata + is fully parsed at startup). + +2010-11-04 10:06:30 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: refactor stream freeing + +2010-11-04 10:05:15 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: delegate linear search for sample to binary search when possible + Also arrange for parsing a sample prior to taking a reference to it, + which requires less memory layout assumptions for correctness. + +2010-11-01 15:52:29 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fragmented support; handle moov samples and proper stream duration + +2010-11-01 13:40:05 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fragmented support; consider mvex and handle flags and offset fields + +2010-10-28 16:49:41 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fragmented support; forego check for short streams + ... as some bogus files may indicate streams of 0 duration in moov, + while indicating the complete movie duration in mvhd (the latter should + be in mehd). + +2010-10-28 16:46:48 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_types.h: + qtdemux: fragmented support; code cleanups and optimizations in atom parsing + Avoid extra allocation in _parse_trun, add more checks for parsing errors, + add or adjust some debug statement, fix comments, sprinkle some branch + prediction. + +2010-09-13 23:19:44 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: parse_moof should return TRUE on success + +2010-09-10 22:41:03 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix iteration bug + Avoid infinite loop when iterating traf + +2010-09-10 21:32:26 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Refactor trun parsing + The allocation of the samples can be placed out of the loop. + Makes the code clearer. + Also avoid relying on traf information as it is placed on the + end of the file and might not be acessible on push mode. + +2010-09-10 00:29:26 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Remove parsing of unused atom + sdtp atom is parsed but not used, so we don't have to + parse it. + +2010-11-09 11:45:00 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: tweak wam support + ... with some comment and portability macros. + +2009-09-23 18:47:42 +0200 Marc-André Lureau + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + qtdemux: support wma & vc-1 + https://bugzilla.gnome.org/show_bug.cgi?id=596321 + +2010-03-11 09:56:04 +0100 Andoni Morales Alastruey + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: parse fmp4 samples information + The fragmented mp4 format stores the tracks and samples information in the + 'moof' boxes, which are appended before each fragment (fragment->'moof'+'mdat'). + The 'mfra' box stores the offset of each 'moof' box and their presentation + time. The location of this box can be retrieved from the 'mfro' box, which is + located at the end of the file. + The 'mfra' box is parsed to get the offset of each 'moof' box and their + presentation time. + Each 'moof' box can contain information for one or more tracks inside + 'tfhd' boxes. For each track in a 'moof', we have a 'trun' box, which + contains information of each sample (offset and duration) used to build + the samples table. + Based on patch by Marc-André Lureau + https://bugzilla.gnome.org/show_bug.cgi?id=596321 + +2010-03-11 15:34:49 +0100 Marc-André Lureau + + * gst/qtdemux/qtatomparser.h: + * gst/qtdemux/qtdemux_dump.c: + * gst/qtdemux/qtdemux_dump.h: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + * gst/qtdemux/qtdemux_types.h: + qtdemux: add fragmented mp4 fourccs + Adds fourcc's for tfra, tfhd, trun, sdtp, trex, mehd and + their dumps + https://bugzilla.gnome.org/show_bug.cgi?id=596321 + +2010-03-11 10:24:56 +0100 Marc-André Lureau + + * gst/qtdemux/qtdemux.c: + qtdemux: parse the track id from the track header + Signed-off-by: Andoni Morales Alastruey + https://bugzilla.gnome.org/show_bug.cgi?id=596321 + +2010-03-11 14:10:12 +0100 Marc-André Lureau + + * gst/qtdemux/qtdemux.c: + qtdemux: allow pulling atoms with unknown size + Signed-off-by: Andoni Morales Alastruey + https://bugzilla.gnome.org/show_bug.cgi?id=596321 + +2010-07-14 20:13:55 +0200 Marc-André Lureau + + * gst/qtdemux/qtdemux_dump.c: + qtdemux: make qtdemux_dump_mvhd parse version 1 correctly + Versions 0 and 1 of mvhd have different sizes of its values + (32bits/64bits). This patch makes it dump them correctly. + Also use the right node in the parameter and not the root node. + https://bugzilla.gnome.org/show_bug.cgi?id=596321 + +2010-11-19 12:45:00 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskademux: minor cleanups in setting streamheader on caps + +2010-11-02 17:04:04 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: normalize empty Cues to no Cues + ... to trigger indexless seeking. + +2010-10-26 11:15:49 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: add workaround for buggy list size + Fixes truncated extra-data in hdrl/strl/strf due to buggy containing + list size not accounting for padding in contained chunks. + +2010-12-02 16:11:01 +0100 Mark Nauwelaerts + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: do not hold custom PAD_LOCK when pushing downstream + +2010-12-02 16:10:14 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: reset session manager base time when flushing + ... as rtpbin uses running time to handle rtpjitterbuffer's buffer mode pauses. + +2010-12-01 16:51:33 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: include range request for all streams with non-aggregate control + +2010-10-07 14:50:53 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix debug statement + +2010-12-03 15:38:00 +0100 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Parse more variants of numerical IDIT tag + +2010-05-07 17:30:30 +0200 Edward Hervey + + * ext/libpng/gstpngenc.c: + pngenc: Use proper framerate range in caps + +2010-12-03 15:04:26 +0100 Edward Hervey + + * tests/check/pipelines/wavenc.c: + tests: Fix previously unbuildable/untested wavenc test + +2010-10-24 15:21:08 +0200 Edward Hervey + + * gst/flv/gstflvdemux.c: + flvdemux: Refactor tag pushing logic + The logic of when to push was wrong also (resulting in some tags never + being pushed). + +2010-10-24 15:20:27 +0200 Edward Hervey + + * gst/flv/Makefile.am: + * gst/flv/gstflvdemux.c: + flvdemux: Use pbutils for codec descriptions + +2010-04-13 11:29:30 +0200 Edward Hervey + + * tests/check/elements/udpsink.c: + check: Use fail_unless_equals_int instead of fail_if + Makes the error message more interesting + +2010-11-30 19:22:11 +0100 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Also extract IDIT tags present too early + https://bugzilla.gnome.org/show_bug.cgi?id=636143 + +2010-11-30 19:21:23 +0100 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Also emit DateTime tag + https://bugzilla.gnome.org/show_bug.cgi?id=636143 + +2010-12-03 00:22:48 +0000 Tim-Philipp Müller + + * gst/wavparse/gstwavparse.c: + wavparse: detect DTS advertised as PCM correctly in some more cases + The DTS typefinder may return a lower probability for frames that start + at non-zero offsets and where there's no second frame sync in the first + buffer. It's fairly unlikely that we'll acidentally identify PCM data + as DTS, so we don't do additional checks for now. + https://bugzilla.gnome.org/show_bug.cgi?id=636234 + +2010-11-08 17:11:42 +0200 Stefan Kost + + * tests/check/Makefile.am: + tests: makefile cleanup + Fix indentation. Use $(GST_MAJORMINOR) instead of hardcoded 0.10. + +2010-11-08 17:02:56 +0200 Stefan Kost + + * tests/check/Makefile.am: + * tests/check/pipelines/.gitignore: + * tests/check/pipelines/wavenc.c: + tests: add a test for wav muxing + +2010-11-08 16:57:17 +0200 Stefan Kost + + * tests/check/elements/interleave.c: + * tests/check/pipelines/wavpack.c: + tests: remove newlines between variable decls (old gst-indent failure) + +2010-11-08 14:47:04 +0200 Stefan Kost + + * ext/libpng/gstpngdec.c: + pngdec: use png_error() as recommended by libpng docs to signal an error + Without that the element loops endlessly on broekn pngs. Fixes #634314 + +2010-11-16 17:48:16 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Parse and use creation time tag from mvhd + Expose creation time from mvhd as a datetime tag + Fixes #634928 + +2010-10-27 19:15:20 +0200 Andoni Morales Alastruey + + * gst/icydemux/gsticydemux.c: + icydemux: Add 'StreamUrl' metadata as GST_TAG_HOMEPAGE tag + +2010-10-23 19:34:00 -0400 Tom Janiszewski + + * gst/flv/gstflvmux.c: + flvmux: Fix for nellymoser codecid setting + Fixes bug #632897. + +2010-10-21 16:15:08 +0200 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + matroskamux: Add support for E-AC3 + +2010-10-21 16:14:44 +0200 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + matroskamux: Add support for DTS + +2010-10-31 18:08:17 +0100 Sebastian Dröge + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Don't send seeks behind the end of file to the server + Also improve debug output, re-initialize the content size and let the + seek handler error out on invalid seek segments. + Fixes bug #632977. + +2010-12-02 17:53:42 +0100 Wim Taymans + + * gst/rtp/gstrtpj2kpay.c: + j2kpay: use SOP markers to split bitstream + When parsing the bitstream, look for SOP markers because we are allowed to split + packets on those marker boundaries. + Rework the parsing code a little so that we can pack multiple Packetization + units in one RTP packet. + +2010-11-18 12:49:47 +0100 Wim Taymans + + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpj2kpay.h: + rtpj2kpay: use buffer lists + Use buffer lists for doing zerocopy payloading. + Add property to disable buffer lists. + +2010-11-16 16:54:25 +0100 Wim Taymans + + * gst/rtp/gstrtph264pay.c: + h264pay: small cleanups + Allocate adapter only once. + Make some guint8 * const. + +2010-11-16 15:39:24 +0100 Tambet Ingo + + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + rtph264pay: implement full bytestream scan mode. + Implement the full bytestream scan mode. + Fixes #634910 + +2010-11-15 10:52:31 +0100 Wim Taymans + + * tests/examples/rtp/client-H263p-AMR.sh: + * tests/examples/rtp/client-H263p-PCMA.sh: + * tests/examples/rtp/client-H263p.sh: + * tests/examples/rtp/client-H264-PCMA.sh: + * tests/examples/rtp/client-H264.sh: + * tests/examples/rtp/client-PCMA.sh: + * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: + examples: improve RTP examples + Make the examples use autovideosink and ffmpegcolorspace for better + compàtibility. + Make some more variables for the sink and the decoders. + Set zerolatency tuning on x264enc for better realtime results. + +2010-11-10 11:04:48 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: select multicast transports in a smarter way + When we see a multicast address in the SDP connection, only try to negotiate a + multicast transport with the server. + Fixes #634093 + +2010-12-02 18:14:16 +0000 Tim-Philipp Müller + + * configure.ac: + Bump GLib requirement to implicit requirement + ie. >= 2.20 while we depend on core/base 0.10.31 + +2010-12-02 18:13:57 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.26 === + +2010-12-01 21:15:09 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.26 + +2010-11-30 15:28:50 -0800 David Schleef + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: analyse RFF fields in correct order + Code was repeating the second field, not the first. + Fixes: #636179. + +2010-11-29 15:32:40 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: handle stale digest authentication session data + In particular, handle Unauthorized server response when trying to convey + keep-alive. + Fixes #635532. + +2010-11-26 15:00:29 +0100 Thijs Vermeir + + * gst/rtp/gstrtph264depay.c: + rtph264depay: fix segfault on empty payload + https://bugzilla.gnome.org/show_bug.cgi?id=635843 + +2010-11-18 00:45:29 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.25.5 pre-release + +2010-11-18 00:44:45 +0000 Tim-Philipp Müller + + * po/bg.po: + * po/fi.po: + * po/hu.po: + * po/sk.po: + * po/tr.po: + po: update translations + +2010-11-14 00:18:16 +0000 Tim-Philipp Müller + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: fix reference leak + +2010-11-12 23:59:06 +1100 Jan Schmidt + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Flush QoS and history before applying segment + When handling newsegment, flush out the buffer history in the + existing segment, not the new one. Fixes playback in some DVD + cases. + Partially fixes #633294 + +2010-11-12 12:20:16 +0000 Tim-Philipp Müller + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: improve event logging + +2010-11-05 17:00:15 +0100 Robert Swain + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Implement field history flushing + In a number of cases it is necessary to flush the field history by + performing 'degraded' deinterlacing - that is, using the user-chosen + method for as many fields as possible, then using vfir for as long as + there are >= 2 fields remaining in the history, then using linear for + the last field. + This should avoid losing fields being kept for history for example at + EOS. + This may address part of #633294 + +2010-11-05 15:44:35 +0100 Robert Swain + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Refactor chain function + This is needed to be able to output a frame from outside the chain + function, i.e. in the following commit that adds flushing of the field + history. + +2010-11-05 17:17:56 +0000 Tim-Philipp Müller + + * configure.ac: + configure: we still require Gtk+ >= 2.14.0 when compiling against 2.0 + The check for the minor version was dropped in the previous commit. + +2010-11-05 16:24:42 +0000 Tim-Philipp Müller + + * configure.ac: + configure: add --with-gtk option and default to Gtk+ 2.0 while the 3.0 API is still in flux + https://bugzilla.gnome.org/show_bug.cgi?id=634014 + +2010-11-04 16:42:07 +1000 Jonathan Matthew + + * gst/icydemux/gsticydemux.c: + icydemux: fix use-after-free of taglist + Broken by commit 4c2f5333 (bug #630205). + https://bugzilla.gnome.org/show_bug.cgi?id=633970 + +2010-11-01 17:29:01 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.25.4 pre-release + +2010-11-01 17:28:36 +0000 Tim-Philipp Müller + + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/es.po: + * po/fr.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/pl.po: + * po/sl.po: + * po/sv.po: + po: update translations + +2010-11-01 16:04:20 +0000 Tim-Philipp Müller + + * configure.ac: + configure: fix --disable-external + +2010-11-01 14:56:28 +0100 Wim Taymans + + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264depay.h: + rtph264depay: only set delta unit on all-non-key units + Only set the delta flag when all of the units in the packet are delta units. + Based on patch from Olivier Crête + Fixes #632945 + +2010-10-26 15:44:37 -0300 Thiago Santos + + * gst/goom/gstgoom.c: + goom: Return not-negotiated when bps is unknown + If caps weren't negotiated, goom should return not-negotiated + from its chain functions instead of using bps unitialized, which + leads to a division by 0 + https://bugzilla.gnome.org/show_bug.cgi?id=633212 + +2010-10-27 13:16:54 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From 7bbd708 to 011bcc8 + +2010-10-26 16:54:11 +0100 Jan Schmidt + + * gst/videofilter/gstvideoflip.c: + videoflip: Forward src pad events upstream. + Fix passing navigation and other events upstream by actually sending them. + Fixes: #633205 + +2010-10-24 18:50:30 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: fix deadlock in error code path + GST_ELEMENT_ERROR must not be called with the object lock held, + since it will call gst_object_get_parent() internally, which + takes the object lock as well. + +2010-10-20 10:21:48 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: Remove useless clearing of send_xiph_headers for Dirac + This looks like a mistake when copy-pasting the Theora code. + https://bugzilla.gnome.org/show_bug.cgi?id=632682 + +2010-10-20 13:28:28 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: don't crash if vorbis/theora codec data is missing + Error out properly in this case instead of crashing. + https://bugzilla.gnome.org/show_bug.cgi?id=632682 + +2010-10-22 18:11:46 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.25.3 pre-release + +2010-10-19 16:45:51 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix duration reporting + Init segment prior to storing duration info in it. + Fixes #632548. + +2010-10-19 14:21:53 +0100 Bastien Nocera + + * gconf/Makefile.am: + gconf: Don't install schemas when GConf is disabled + https://bugzilla.gnome.org/show_bug.cgi?id=632553 + +2010-10-16 15:43:53 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + win32: set GST_PACKAGE_RELEASE_DATETIME also in win32 config.h + +2010-10-16 01:33:52 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.25.2 pre-release + +2010-10-16 01:26:01 +0100 Tim-Philipp Müller + + * po/el.po: + * po/vi.po: + po: update translations + +2010-10-15 13:22:03 -0700 David Schleef + + * tests/check/Makefile.am: + tests: Don't dist generated orc files + +2010-10-15 14:02:19 -0700 David Schleef + + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime-dist.h: + * gst/videobox/gstvideoboxorc-dist.c: + * gst/videobox/gstvideoboxorc-dist.h: + * gst/videomixer/blendorc-dist.c: + * gst/videomixer/blendorc-dist.h: + Update generated orc code + +2010-10-15 18:00:10 +0100 Tim-Philipp Müller + + * configure.ac: + configure: bump Orc requirement to 0.4.11 + +2010-10-14 17:41:30 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Use the right constant to define the "use-pipeline-clock" property + The wrong #define was being used, now use the correct one. + +2010-10-14 12:31:48 -0700 David Schleef + + * common: + Automatic update of common submodule + From 5a668bf to 7bbd708 + +2010-10-14 17:26:14 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/qtdemux/qtdemux.c: + ac3: demuxers provide framed output + +2010-10-14 00:11:27 +0100 Tim-Philipp Müller + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + matroskamux: reduce newsegment event spam and set discont flag where needed + Only send newsegment events with new positions downstream when actually + needed, instead of sending multiple newsegment events with new seek + positions in a row. Also set the discont flag on buffers after a + discontinuity. + +2010-10-13 23:46:02 +0100 Tim-Philipp Müller + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + matroskamux: set correct buffer offsets after seeks + Re-use the existing 'pos' field maintained by ebml writer to set + buffer offsets. This also makes sure that we set the right offsets + on buffers after a seek (e.g. when writing an index at the end). + +2010-10-14 00:22:03 +0100 Tim-Philipp Müller + + * gst/matroska/matroska-mux.c: + matroskamux: don't forward tag events downstream + Don't forward stream-specific tag events downstream (esp. not + before any newsegment event).x + +2010-10-13 17:15:25 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: handle another mp4v variation + ... including the glbl atom containing codec-data. + +2010-10-13 17:21:23 +0300 Stefan Kost + + * gst/audiofx/audioamplify.c: + * gst/audiofx/audiodynamic.c: + * gst/audiofx/audioinvert.c: + * gst/audiofx/audiokaraoke.c: + * gst/audiofx/audiopanorama.c: + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautovideosink.c: + * gst/autodetect/gstautovideosrc.c: + * gst/avi/gstavimux.c: + * gst/cutter/gstcutter.c: + * gst/debugutils/breakmydata.c: + * gst/debugutils/efence.c: + * gst/debugutils/gstnavseek.c: + * gst/debugutils/negotiation.c: + * gst/debugutils/progressreport.c: + * gst/debugutils/rndbuffersize.c: + * gst/id3demux/gstid3demux.c: + * gst/level/gstlevel.c: + * gst/matroska/matroska-mux.c: + * gst/median/gstmedian.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/replaygain/gstrganalysis.c: + * gst/replaygain/gstrglimiter.c: + * gst/replaygain/gstrgvolume.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtsp/gstrtpdec.c: + * gst/smpte/gstsmpte.c: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/videocrop/gstaspectratiocrop.c: + * gst/videocrop/gstvideocrop.c: + * gst/videofilter/gstvideotemplate.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + various (gst): add a missing G_PARAM_STATIC_STRINGS flags + +2010-10-13 17:13:04 +0300 Stefan Kost + + * sys/oss/gstossmixerelement.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + * sys/oss4/oss4-mixer.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + * sys/osxvideo/osxvideosink.m: + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosrc.c: + * sys/ximage/gstximagesrc.c: + various (sys): add a missing G_PARAM_STATIC_STRINGS flags + +2010-10-13 16:25:15 +0300 Stefan Kost + + * ext/aalib/gstaasink.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/annodex/gstcmmltag.c: + * ext/cairo/gsttextoverlay.c: + * ext/dv/gstdvdec.c: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/flac/gstflacenc.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/hal/gsthalaudiosink.c: + * ext/hal/gsthalaudiosrc.c: + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libcaca/gstcacasink.c: + * ext/libpng/gstpngenc.c: + * ext/mikmod/gstmikmod.c: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + * ext/shout2/gstshout2.c: + * ext/soup/gstsouphttpsrc.c: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * ext/wavpack/gstwavpackenc.c: + various (ext): add a missing G_PARAM_STATIC_STRINGS flags + +2010-10-13 16:34:09 +0300 Stefan Kost + + * ext/aalib/gstaasink.c: + * ext/esd/esdmon.c: + * gst/median/gstmedian.c: + various: wrap property registration and add a single fixme for long desc. + +2010-10-13 11:46:58 +0200 Wim Taymans + + * gst/rtp/gstrtph264depay.c: + h264depay: always mark the codec_data as keyframe + We need to mark the codec_data as a keyframe or else downstream decoders might + decide to skip it, waiting for a keyframe. + Fixes #631996 + +2010-10-13 07:16:47 +0100 Zaheer Abbas Merali + + * gst/matroska/ebml-write.c: + matroskamux: make buffer offsets a byte count rather than a buffer count + +2010-10-07 21:12:48 +0100 Tim-Philipp Müller + + * ext/aalib/gstaasink.c: + * ext/dv/gstdvdec.c: + * ext/esd/esdmon.c: + * ext/flac/gstflacenc.c: + * ext/mikmod/gstmikmod.c: + * ext/raw1394/gstdv1394src.c: + * gst/debugutils/efence.c: + * gst/rtpmanager/gstrtpbin.c: + ext, gst: canonicalise property names where this wasn't the case + ie. "foo_bar" -> "foo-bar" + +2010-10-12 15:02:42 +0200 Thijs Vermeir + + * gst/rtp/gstrtpmpvpay.c: + rtpmpvpay: fix timestamping of rtp buffers + Incomming buffer is only pushed on the adapter at the end of the + handle_buffer function. But duration/timestamp of this buffer is already + taken into account for the current data in the adapter. This leads to + wrong rtp timestamps and extra latency. + +2010-10-12 11:37:40 +0200 Sebastian Dröge + + * tests/examples/equalizer/demo.c: + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + examples: Fix build with GTK+ 3.0 + +2010-10-11 15:12:00 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: mark as a source + Mark the rtspsrc element as a source. + Requires 0.10.31.1 now + +2010-10-11 14:24:13 +0200 Sebastian Dröge + + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautovideosrc.c: + autodetect: Set GST_ELEMENT_IS_SOURCE flag on sources + +2010-10-11 14:21:07 +0200 Sebastian Dröge + + * ext/gconf/gstswitchsrc.c: + switchsrc: Set the GST_ELEMENT_IS_SOURCE flag + +2010-10-11 14:17:33 +0200 Sebastian Dröge + + * configure.ac: + configure: Require core 0.10.30.1 + +2010-10-10 14:43:58 +0100 Zaheer Abbas Merali + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + matroskamux: set offsets on outgoing buffers + +2010-10-09 14:14:27 +0200 IOhannes m zmölnig + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: Only get/set overlay params if needed + it's perfectly ok for a video output device to not have overlay capabilities. + this patch removes the need to get/set the overlay parameters if the user + does not explicitely request one of the overlay properties + +2010-09-30 15:28:23 +0200 IOhannes m zmölnig + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: Protect against NULL-pointer access + gst_v4l2sink_change_state() would free the pool without checking whether there + was a valid pool... + +2010-10-08 12:43:51 -0700 David Schleef + + * common: + Automatic update of common submodule + From c4a8adc to 5a668bf + +2010-10-08 12:53:33 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 5e3c9bf to c4a8adc + +2010-10-06 11:29:55 +0200 Robert Swain + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Fix required fields logic + Both history_count and fields_required count from 1. As per the while loop + condition that follows this code, to perform the deinterlacing method, we need + history_count >= fields_required fields in the history. Therefore if we have + history_count < fields_required (not fields_required + 1), we need more fields. + +2010-09-20 19:43:45 +0200 Andoni Morales Alastruey + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + flvmux: resend onMetada tag when tags changes in streamable mode + +2010-10-05 19:40:50 +0100 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + qtdemux: AAC codec_data can be > 2 bytes long + This fixes the assumption that DecoderSpecificInfo must be 2 bytes long + for AAC files. The specification allows HE-AAC to be explicitly + signalled in a backward compatible way. This is done by means of an + additional information after the regular AAC header. It is expected that + decoders that can play AAC but not HE-AAC will parse the header normally + and ignore extended bits, much as they do for the HE-AAC specific payload + in the actual stream. + https://bugzilla.gnome.org/show_bug.cgi?id=612313 + +2010-10-05 16:01:19 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: only unref buffer when no longer needed for cluster scanning + Fixes #629047. + +2010-10-05 16:00:45 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: avoid infinite cluster scanning + +2010-10-05 12:20:52 +0200 Wim Taymans + + * gst/goom/gstgoom.c: + * gst/goom2k1/gstgoom.c: + goom: take duration into account when doing QoS + Take the duration of the frames into account so that we don't drop frames that + are only partially past the QoS deadline. + +2010-10-05 10:40:15 +0200 Wim Taymans + + * gst/goom/gstgoom.c: + * gst/goom/gstgoom.h: + * gst/goom2k1/gstgoom.c: + * gst/goom2k1/gstgoom.h: + goom: use adapter for timestamping + Use the adapter timestamp code to get more accurate timestamps. + Fix latency calculation, we add our own latency in the worst case. + +2010-10-04 22:31:32 +0200 Edward Hervey + + * configure.ac: + * ext/raw1394/Makefile.am: + * ext/raw1394/gst1394.c: + raw1394: Don't compile hdv1394src if libiec61883 isn't available + Fixes #629896 + +2010-09-20 19:44:09 +0200 Andoni Morales Alastruey + + * gst/icydemux/gsticydemux.c: + icydemux: forward tag events + https://bugzilla.gnome.org/show_bug.cgi?id=630205 + +2010-10-04 19:00:45 +0200 Wim Taymans + + * gst/goom2k1/gstgoom.c: + goom2k1: report our latency correctly + Fixes #631303 + +2010-10-04 18:56:15 +0200 Wim Taymans + + * gst/goom2k1/gstgoom.c: + goom2k1: add defines for default width/height/fps + Add some defines for the default width/height/fps instead of using different + values in different places. + +2010-10-04 18:52:14 +0200 Wim Taymans + + * gst/goom/gstgoom.c: + goom: add latency compensation code. + Implement a latency query and report how much latency we will add to the + stream. + Alse make some defaults for the default width/height/framerate + Fixes #631303 + +2010-10-04 17:56:57 +0200 Wim Taymans + + * tests/examples/rtp/server-alsasrc-PCMA.py: + test: add python version of the audio sender + Add a python version of the audio sender pipeline. + Ported by Sp4rc on IRC. + +2010-10-04 17:52:22 +0200 Wim Taymans + + * tests/examples/rtp/client-PCMA.py: + tests: Add python RTP client example + Add a python version of the PCMA client app. + Ported by Sp4rc on IRC. + +2010-10-04 09:39:59 +0200 Sebastian Dröge + + * gst/rtp/gstrtpmp4gpay.c: + rtp: Fix unitialized compiler warnings on OS X build bot + These warnings are wrong though, the variables are only used in + the cases where they *are* initialized by the bit reader. + +2010-10-03 23:49:08 +0200 Sebastian Dröge + + * gst/rtp/gstrtpg722pay.c: + rtpg722pay: Fix uninitialized variable compiler warning + The clock rate is always 8000 Hz according to the RFC and + the sampling rate must always be 16000 Hz. + +2010-10-01 13:59:10 +0400 Vladimir Eremeev + + * gst/rtpmanager/rtpjitterbuffer.c: + rtpjitterbuffer: improve article reference in comment block + https://bugzilla.gnome.org/show_bug.cgi?id=631082 + +2010-04-30 21:00:31 +0530 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/quicktime.c: + qtdemux: Use pbutils for H.264 profile/level extraction + The functions used to extract this data have been moved to gstpbutils to + facilitate reuse. + https://bugzilla.gnome.org/show_bug.cgi?id=617318 + +2010-04-30 21:00:31 +0530 Arun Raghavan + + * gst/matroska/Makefile.am: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska.c: + matroskademux: Use pbutils for H.264 profile/level extraction + The functions used to extract this data have been moved to gstpbutils to + facilitate reuse. + https://bugzilla.gnome.org/show_bug.cgi?id=617318 + +2010-04-22 19:39:47 +0530 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + qtdemux: Export MPEG-4 video profile and level in stream caps + This uses gstpbutils to extract the profile and level from the video + object sequence and adds this to stream caps. This can be used as + metadata and for fine-grained decoder selection. + https://bugzilla.gnome.org/show_bug.cgi?id=616521 + +2010-09-30 12:44:52 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: fix aac channel override based on codec data for 7.1 case + +2010-04-30 14:06:27 +0530 Arun Raghavan + + * gst/qtdemux/Makefile.am: + * gst/qtdemux/qtdemux.c: + qtdemux: Export AAC profile and level in caps + This exports the AAC profile and level in caps for use as metadata and + (eventually) for more fine-grained selection of decoders at + caps-negotiation time. (Doesn't work for HE-AAC yet though.) + https://bugzilla.gnome.org/show_bug.cgi?id=612313 + +2010-09-30 18:34:04 +0200 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpg722depay.c: + * gst/rtp/gstrtpg722depay.h: + * gst/rtp/gstrtpg722pay.c: + * gst/rtp/gstrtpg722pay.h: + rtp: add G722 pay and depayloader + +2010-09-30 12:08:49 +0200 Thijs Vermeir + + * gst/rtpmanager/rtpjitterbuffer.c: + rtpjitterbuffer: update link to documentation + +2010-09-30 11:34:56 +0200 Thijs Vermeir + + * tests/examples/rtp/client-H264.sh: + examples: fix indentation on rtp client example + +2010-09-30 11:33:24 +0200 Thijs Vermeir + + * tests/examples/rtp/client-H264-PCMA.sh: + * tests/examples/rtp/client-H264.sh: + examples: fix typo in port of rtp examples + +2010-09-29 13:20:22 +0100 Tim-Philipp Müller + + * gst/wavenc/gstwavenc.c: + wavenc: miniscule code clean-up + GST_CLOCK_TIME_NONE is not something that should be used in connection with + GST_FORMAT_BYTES. + +2010-09-29 10:34:36 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: reverse playback; prevent overlap of subsequent fragments + +2010-09-28 16:21:48 +0300 René Stadler + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix missing null-terminator in protocols array + Fixes random crash regression from commit ae84ae. + +2010-09-24 16:26:20 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't add /UDP in the transport, it's the default + don't add the default UDP lower-transport, some servers don't seem to like it. + Fixes #630500 + +2010-06-25 17:08:03 +0200 Pascal Buhler + + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpmanager: packet lost should not be a warning. It happens all the time... + +2010-09-24 15:33:40 +0200 Pascal Buhler + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpbin: Make cleaning up sources in rtp_session_on_timeout MT safe + Using _foreach_remove on the hashtable, while releasing the lock protecting + that table inside the callback is not a good idea. The hashtable might + then change (a source removed or added) while signals like on_timeout + are being sent. + This solution makes a copy of the table, performs the _foreach without + actually removing any sources, but marks them for removal on a second + iteration with the real list, but this time not letting go of the lock. + Fixes #630452 + +2010-09-24 15:19:15 +0200 Edward Hervey + + * gst/id3demux/id3tags.c: + id3demux: Sanitize id3 frame names + This is similar to what is done in qtdemux. Avoids providing invalid + structure/tags names + +2010-09-24 14:59:45 +0200 Edward Hervey + + * gst/apetag/gstapedemux.c: + apedemux: Skip empty tags + Avoid creating bogus string tags. Also added logging of the string + values of the tag name and value. + +2010-09-24 08:56:36 +0100 Tim-Philipp Müller + + * ext/soup/gstsouphttpsrc.c: + soup: init debug category before using it + +2010-04-12 09:49:14 +0200 Pascal Buhler + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Handle rysnc of iterator when looking for free pad name + If a new pad was added while iterating then a pad could be + returned that was already in use. + Fixes #630451 + +2010-09-24 14:09:12 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: fix compilation + +2010-04-07 15:31:52 +0200 Trond Andersen + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Unlock before adding pad in new_payload_found + Holding internal locks while potentially calling out is a source + of deadlocks, and in this case the application might subscribe to the + pad-added signal. + Fixes #630449 + +2009-08-31 18:37:40 +0200 Havard Graff + + * gst/rtpmanager/rtpsession.c: + rtpsession: relax third-party collision detection + If the source has been inactive for some time, we assume that it has + simply changed its transport source address. Hence, there is no true + third-party collision - only a simulated one. + Fixes #630447 + +2010-09-24 13:50:02 +0200 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: whitespace fixes + +2010-09-24 13:48:50 +0200 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: simplify the rate estimation some more + +2009-08-31 18:34:08 +0200 Havard Graff + + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpstats.c: + * gst/rtpmanager/rtpstats.h: + rtpmanager: provide additional statistics + +2010-09-24 00:01:05 +0100 Tim-Philipp Müller + + * configure.ac: + configure: set plugin release datetime + +2010-09-23 21:21:29 +0100 Tim-Philipp Müller + + * gst/equalizer/gstiirequalizer10bands.h: + * gst/equalizer/gstiirequalizer3bands.h: + * gst/equalizer/gstiirequalizernbands.h: + equalizer: fix class definitions + Class structures must be based on the parent class struct, not on + the parent instance struct. + +2010-09-15 20:36:33 +0100 Tim-Philipp Müller + + * gst/videomixer/videomixer2.c: + videomixer2: pre-register pad class properly with g_type_class_ref + Fix code to match the comment. Also, there's no need to register the + background enum type again, this is already done via install_property. + +2010-09-23 21:57:18 +0200 David Hoyt + + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + speex: Fix crashes with MSVC + Using the symbols for the different Speex modes results + in crashes when using MSVC. Use the library functions to + get the modes instead. + Fixes bug #630378. + +2010-08-24 13:25:02 +0200 Havard Graff + + * gst/level/gstlevel.c: + level: avoid division by zero on silence + Fixes bug #630458. + +2010-09-23 16:46:31 +0200 Wim Taymans + + * gst/flv/gstflvdemux.c: + flvdemux: parse and use cts + For H264, there is an extra header containing the CTS, which is a timestamp + offset that should be applied to the PTS. Parse this value and use it to adjust + the pts. + Fixes #630088 + +2010-09-23 16:45:41 +0200 Wim Taymans + + * gst/flv/gstflvdemux.c: + flvdemux: improve pts debugging + +2010-09-22 19:01:40 +0200 Wim Taymans + + * configure.ac: + * tests/examples/Makefile.am: + * tests/examples/pulse/.gitignore: + * tests/examples/pulse/Makefile.am: + * tests/examples/pulse/pulse.c: + pulse: add test app for pulse device probe + +2010-09-22 18:50:44 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + pulse: fix device_description in READY + Make the is_dead check more clear and add an option to check for the status of + the stream in addition to the context. + We don't need a stream to get the device_description string. + Fixes #630317 + +2010-09-22 12:56:00 +0200 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Don't post tags if there are none + And make all code go through _post_global_tags. + +2010-09-22 12:37:33 +0200 Wim Taymans + + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264depay.h: + rtph264depay: refactor and simplify AU merging + Move the processing of the NALU to a separate method. + Simplify the merging of NALU into AU and use common code when possible. + +2010-09-21 23:23:07 +0300 Stefan Kost + + * tests/examples/shapewipe/shapewipe-example.c: + shapewipe: add optional border parameter and slowdown animation + Allow to play with the border property (sharp/soft edges). + +2010-09-21 19:14:40 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + shapewipe: Force format to AYUV in the example pipeline for the same reason + +2010-09-21 19:13:07 +0200 Sebastian Dröge + + * tests/examples/shapewipe/shapewipe-example.c: + shapewipe: Force the input to AYUV to prevent negotiation failures in videomixer + The second videotestsrc chain might produce YUY2 because everything is + accepted downstream before the first shapewipe chain gets negotiated. + +2010-09-21 19:12:45 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + shapewipe: Improve debugging and immediately return empty caps from the getcaps functions + +2010-09-21 18:33:55 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From aa0d1d0 to 5e3c9bf + +2010-09-21 12:49:31 +0200 Philippe Normand + + * sys/v4l2/gstv4l2xoverlay.c: + * sys/v4l2/gstv4l2xoverlay.h: + v4l2: use the xoverlay APIs + +2010-09-21 12:48:34 +0200 Philippe Normand + + * configure.ac: + * sys/osxvideo/osxvideosink.m: + osxvideosink: use the new xoverlay APIs + Also bumped -base requirements. + +2010-09-21 12:31:59 +0200 Sebastian Dröge + + * configure.ac: + configure: Use -DGST_DISABLE_DEPRECATED again for GIT versions + +2010-09-21 11:52:22 +0200 Edward Hervey + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Fix debug statement + +2010-09-20 23:17:35 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Parse uuid atoms in push mode + Parses uuid atoms in push mode when they are found, they might + contain xmp tags. + Also does a minor refactoring to put the global tags posting + into a single function instead of repeating it in 3 different + places. + Fixes #629839 + +2010-09-16 08:04:02 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Delay tags posting a little + Delay tags posting until we've parsed all the headers so + that the native and xmp tags get merged before posting + https://bugzilla.gnome.org/show_bug.cgi?id=629839 + +2010-09-15 22:13:43 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: Parse xmp packet in uuid atom + xmp packet is placed into a top-level uuid atom for + isom/mp4 variants. + This patch makes qtdemux parse all top-level atoms + in pull-mode before starting to push data, making + it able to find those tags. + https://bugzilla.gnome.org/show_bug.cgi?id=629839 + +2010-09-17 11:07:52 +0200 Wim Taymans + + * gst/rtpmanager/rtpstats.c: + rtpstats: printf format fixes + +2010-09-17 11:07:02 +0200 Wim Taymans + + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpg729pay.c: + rtppay: some printf format fixes + +2010-09-15 18:21:11 +0200 Alessandro Decina + + * gst/qtdemux/qtdemux.c: + qtdemux: fix logic when pushing EOS. + Don't check for return values when pushing EOS. Still post an error if EOS is + reached and no streams have been found. + +2010-09-15 17:02:57 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins.args: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2src.c: + docs: add gtk-doc chunks with Since: markers for new v4l2src properties + +2010-09-15 18:43:50 +0300 Stefan Kost + + * tests/examples/v4l2/camctrl.c: + camctrl: add license header to demo + +2010-09-14 17:41:28 +0200 Alessandro Decina + + * gst/qtdemux/qtdemux.c: + qtdemux: don't send EOS twice on the same pad. + +2010-09-14 10:07:58 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: move the shared mainloop from class to static var + Just have one static var for the shared mainloop instead of one class variable + and copies in the instance. + +2010-09-13 17:31:35 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: cleanups for DRI markers + Protect against invalid DRI markers. + do some cleanups + +2010-09-10 11:35:53 -0400 American Dynamics + + * gst/rtp/gstrtpjpegpay.c: + gstrtpjpegpay: Added Define Restart Interval (DRI) Marker + Added ability to detect and respond to a JPEG-defined DRI marker + +2010-06-19 19:20:18 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + gstrtpsession: Split getting the caps into its own function + +2010-09-13 16:03:50 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: small cleanup. + +2010-09-13 16:24:26 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: rework context sharing + We also need to share the main-loop threads as this owns the context. Thus have + a class wide main-loop thread. From this we create a context per client-name. + Instead of always looking up the context, we keep this with the instance. The + reverse mapping is only needed in pulse singal handlers. This saves a lot of + locking. Also one signal handler becomes simpler as ther eis only one mainloop + to notify. + Now valgind happy - no leaks, no bad reads/writes. + This reverts major parts of commit 69a397c32f4baf07a7b2937c610f9e8f383e9ae9. + Fixes #628996 + +2010-09-13 15:44:52 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpstats.c: + rtpsession: Small cleanups + Make the property description prettier. + Actually multiple the bandwidth with the fraction. + +2010-06-01 21:35:40 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpstats.c: + * gst/rtpmanager/rtpstats.h: + rtpsession: Calculate RTCP bandwidth as a fraction of the RTP bandwidth + Calculate the RTCP bandwidth to be a fraction of the RTP bandwidth if it is + specified as a value between 0 and 1. + +2010-09-13 15:29:06 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + session: improve bandwidth recalculation + Also recalculate bandwidth when one of the source bandwidths changed. + Use the newly calculated bandwidth. + +2010-06-01 21:17:26 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + rtpsession: Add the option to auto-discover the RTP bandwidth + +2010-09-13 14:38:11 +0200 Thijs Vermeir + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: set use-pipeline-clock on correct GObject + +2010-06-02 17:51:12 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Initialise the average scaled by 16 + +2010-09-13 12:41:11 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: add running_time argument docs + +2010-06-23 16:13:01 -0400 Olivier Crête + + * gst/rtpmanager/rtpstats.h: + rtpstats: Rectify description of current_time in RTPArrivalStats + It is the current time, it is unrelated to when the packet was actually received. + +2010-09-13 12:31:40 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: compute the average correctly scaled + +2010-06-01 20:31:18 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Count sent RTCP packets after they have been finished + If they are counted before calling gst_rtcp_buffer_end(), then the + size is way too big. + +2010-06-01 19:51:34 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + gstrtpsession: Don't unref pads in finalize + The gstrtpsession object is not holding any reference to them directly + +2010-09-12 00:09:09 +0100 Tim-Philipp Müller + + * po/POTFILES.in: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + po: update translations for new souphttpsrc messages + +2010-09-12 00:08:05 +0100 Tim-Philipp Müller + + * ext/soup/gstsouphttpsrc.c: + soup: hook up i18n bits for plugin + Call bindtextdomain() etc. + +2010-09-12 00:04:42 +0100 Tim-Philipp Müller + + * ext/soup/gstsouphttpsrc.c: + soup: fix error messages + Error messages should be translated. URIs and filenames should not + be part of the error message string that's shown to the user. + soup_message->reason_phrase is not translated and not suitable as + error message for users (see libsoup documentation). Also fix up + error codes a bit, as far as possible with the existing codes. + +2010-09-10 09:43:24 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: don't post an error message if buffer alloc fails with NOT_LINKED flow + This is not fatal, let upstream handle it. + +2010-09-10 18:06:48 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't clear sdp when set as uri + when we set the SDP with an uri, don't clear it when we go to READY. + +2010-09-10 18:01:18 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: use sdp uri parse method + Use the sdp parse method that does proper uri escaping. + +2010-09-10 16:59:10 +0300 Stefan Kost + + * tests/examples/v4l2/.gitignore: + * tests/examples/v4l2/Makefile.am: + * tests/examples/v4l2/camctrl.c: + example: add v4l2 example, demonstrating the use of gst controller + +2010-09-10 16:55:25 +0300 Stefan Kost + + * sys/v4l2/v4l2src_calls.c: + v4l2src: don't skip calculating the duration + +2010-06-22 15:48:04 +0300 Stefan Kost + + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + v4l2src: add controlable colorbalance parameters + Expose colorbalance controls as object properties (like we do on xvimagesink). + Make them controlable. + +2010-09-10 13:25:39 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmparobustdepay.c: + rtpmparobustdepay: fix some mis-implementation + Also add some debug. + +2010-09-10 13:24:02 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmparobustdepay.c: + rtpmparobustdepay: properly insert dummy buffers + +2010-09-10 11:55:26 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: add rtsp-sdp protocol support + Allow setting an SDP with the rtsp-sdp:// url. + Based on patch from Marco Ballesio. + See #628214 + +2010-09-10 11:35:58 +0200 Alessandro Decina + + * gst/alpha/gstalphacolor.c: + alphacolor: make passthrough work. + +2010-09-09 21:43:40 +0300 Stefan Kost + + * gst/rtp/gstrtpmp4adepay.c: + mp4adepay: small logging cleanup and addition to debug config parsing + +2010-09-09 21:42:46 +0300 Stefan Kost + + * ext/aalib/gstaasink.c: + aasink: fix context initialisation and freeing to not leak + +2010-09-09 21:40:51 +0300 Stefan Kost + + * tests/check/Makefile.am: + * tests/check/generic/states.c: + tests: allow running state tests for all elements + Now one can use GST_NO_STATE_IGNORE_ELEMENTS=1 make generic/states.check + to try elements that would normaly be skipped. + +2010-09-09 18:47:56 +0200 Wim Taymans + + * tests/check/elements/rtp-payloading.c: + tests: fix rtpjpegpay test + Make the data we send to the jpeg payloader be a valid jpeg file because the + payloader now expects this. + +2010-09-09 18:47:11 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: improve debugging + +2010-09-09 16:31:56 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmparobustdepay.c: + rtpmparobustdepay: use valid bitrate for dummy frame + +2010-09-08 17:07:53 -0300 Thiago Santos + + * ext/taglib/gstid3v2mux.cc: + id3v2mux: Adds mapping for album artist + Maps GST_TAG_ALBUM_ARTIST to TPE2 in id3v2mux + +2010-09-08 18:35:08 +0200 Sebastian Dröge + + * configure.ac: + configure: Require orc 0.4.8 + The deinterlace plugin apparently fails to compile with older versions. + +2010-09-08 17:50:11 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: QoS handling logic only applies to forward playback + Fixes #628894. + +2010-09-08 17:43:47 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: remove unused code + +2010-09-08 14:36:48 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: fixup last commit + We need to prevent the eventual leak better. + +2010-09-08 14:16:58 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: code cleanups + Use g_slist_prepend as we don't care about the order. Check for list == NULL + instead of iterating the list to see if it is empty. Move ctx allocation down + to prevent leak in case of failure. + +2010-09-08 07:13:42 +0200 Sebastian Dröge + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: Fix uninitialized variable compiler warning + Fixes bug #629018. + +2010-09-07 19:02:01 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: simplify clock provide code + Don't leak the pulsesink element by having the clock keep a ref to the sink. + Create the clock only once in the constructor and use the baseaudiosink clock + cleanup code. + +2010-09-07 17:49:05 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: move the context table init to _get_type phase + This seems to fix the invalid reads on context shutdown better, altough + I can't really explain. + +2010-09-07 17:06:02 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: use older g_array_free + g_array_unref() is only since 2.22 + +2010-09-07 16:49:16 +0200 Wim Taymans + + * ext/jpeg/gstjpegdec.c: + jpegdec: avoid invalid adapter flush on QoS + First store the available data in the adapter in the rem_img_len instance field + before trying to flush the adapter with that value on QoS. + +2010-09-07 16:40:08 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: do some more sanitity checks + Protect some more against invalid input. + +2010-09-07 15:20:12 +0200 American Dynamics + + * gst/rtp/gstrtpjpegpay.c: + jpegpay: handle corrupted jpeg better + Protect against corrupted jpeg input. + +2010-09-07 13:55:04 +0200 Wim Taymans + + * gst/rtp/gstrtpvrawdepay.c: + rvawdepay: cleanup unused fields + +2010-09-07 13:51:37 +0200 Wim Taymans + + * gst/rtp/gstrtpvrawdepay.c: + vrawdepay: handle invalid payload better + Make sure we don't read more data than available in the input buffer. + Clip the input data into the output buffer. + +2010-08-16 15:35:51 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + * ext/pulse/pulsesrc.c: + * ext/pulse/pulsesrc.h: + * ext/pulse/pulseutil.c: + * ext/pulse/pulseutil.h: + pulse: allow setting stream properties + Add a "properties" property to the elements to allow setting extra stream + properties. + Fixes #537544 + +2010-09-07 12:08:10 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-gdkpixbuf3.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + docs: remove introspection info for gdkpixbuf3 plugin and update version for others + The versions got accidentally reverted to a pre-release version, fix that. + +2010-09-07 11:42:10 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From c2e10bf to aa0d1d0 + +2010-09-07 09:20:03 +0100 Tim-Philipp Müller + + * ext/annodex/gstcmmldec.c: + cmmldec: fix flow return handling + Fix buggy GST_FLOW_IS_FATAL substitution, and 'make check': + - if (!GST_FLOW_IS_FATAL (dec->flow_return) && !dec->sent_root) { + + if (dec->flow_return != GST_FLOW_OK && !dec->sent_root) { + +2010-09-07 00:27:07 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: don't free the context multiple times + Apparently the close function of the ring-buffer can be called multiple times. + +2010-08-12 12:33:06 +0300 Stefan Kost + + * gst/rtp/gstrtpmp4adepay.c: + rtpmp4adepay: grab the sampling arte and put into caps + This is needed to be able to mux the received audio into mp4 (in the case of + aac). Fixes #625825. + +2010-09-06 14:40:02 +0100 Tim-Philipp Müller + + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpqcelpdepay.c: + rtp: mark constant tables as const + +2010-08-18 14:40:48 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpamrpay.h: + rtpamrpay: properly support perfect-rtptime + +2010-08-18 11:42:33 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpamrpay.c: + rtpamrpay: proper duration for multiple frame payload + +2010-08-18 11:42:07 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + rtpamr(de)pay: support AMR-WB SID frame + +2010-08-18 11:39:06 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpg729pay.c: + * gst/rtp/gstrtpg729pay.h: + rtpg729pay: properly support perfect-rtptime + +2010-08-16 16:08:04 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: improve framerate determining + Collect a limited number of starting sample durations and use the median of + those to determine caps framerate. + +2010-08-17 12:08:10 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: attempt more resync upon (cluster) parse error + That is, if parse error occurs in state requiring to move to next cluster, + and doing so to the expected next position of cluster fails, then scan for a + next cluster from present position and resume from there. + Fixes #620790. + +2010-08-16 16:05:41 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: not so fatal error handling + If some bits out of place in block(group) parsing, forego and move to next. + Also skip large blocks in pull mode, but need to give up in push mode. + Fixes #626463. + Improves #620790. + +2010-07-26 15:51:49 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: additional parse recovery + In particular, upon parse failure in one cluster, we may forego remaining + content and try resuming from next cluster onwards. + Fixes #620790. + +2010-09-06 12:22:11 +0200 American Dynamics + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: Add property to configure udpsrc buffer size + Add a new udp-buffer-size property to configure the buffer-size on the udpsrc + elements. + Fixes #628058 + +2010-08-27 17:58:47 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + rtpbin: add ntp-sync property + Add an ntp-sync property that will sync the received streams to the server + NTP time. This requires synchronized NTP times between the sender and receivers, + like with ntpd. + Based on patch from Thijs Vermeir. + Fixes #627796 + +2010-08-27 12:14:25 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: rename a variable to avoid confusion + +2010-08-27 11:07:34 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: rename some variables for less confusion + +2010-08-27 10:41:01 +0200 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + rtpjitterbuffer: move comment where it belongs + +2010-08-26 16:00:38 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + session: minor cleanups + Make clock snapshots more accurate by only sampling the same clock once. + +2010-08-26 10:58:26 +0200 Thijs Vermeir + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpsession.c: + rtpbin: add use-pipeline-clock property + With this property RTCP SR NTP times can be based + on the system clock (maybe synced with ntpd) or the + current pipeline clock. + https://bugzilla.gnome.org/show_bug.cgi?id=627796 + +2010-08-25 09:58:20 +0200 Wim Taymans + + * gst/rtsp/gstrtspext.c: + rtspext: stop configuration on first failure + Stop the configuration of a stream as soon as some of the extensions return + FALSE. + Fixes #581294 + +2010-08-20 15:35:27 +0200 Wim Taymans + + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstmultiudpsink.h: + multifdsink: use refcount to count host/port duplicates + Instead of adding multiple client structures for the same host/port pair, use a + refcount. + Add a send-duplicates feature that allows you to disable sending multiple copies + of the same packet to the same host when it was added multiple times. The + send-duplicates property is by default set to TRUE for backwards compatibility + although it is very likely that this is not desired behaviour. + +2010-08-19 17:06:26 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: implement custom event handler + Extend the _push_event() function so that it can also send events to the udp + sources when asked. + Implement a custum send_event function that correctly dispatches the downstream + events in TCP mode. This fixes sending EOS to rtspsrc and have it push the EOS + downstream. + +2010-08-19 11:37:04 +0200 Wim Taymans + + * ext/pulse/pulsesrc.c: + pulsesrc: use _get_caps_reffed() when we can + Use _get_caps_reffed() + Add some more debug when opening the server connection. + +2010-08-16 11:29:07 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpjpegdepay.h: + jpegdepay: handle DISCONT and reset state + Put a DISCONT event on the next output buffer when the input buffer had a + DISCONT. + Make sure we clear our adapter and reset our state before going to PAUSED. + Free the qtables. + Fixes #626869 + +2010-08-16 11:27:53 +0200 Wim Taymans + + * gst/rtp/gstrtpg729pay.h: + g729pay: extend from right parent + +2010-09-06 09:57:10 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: add since docs for new property. + +2010-08-30 16:45:48 +0300 Stefan Kost + + * gst/qtdemux/qtdemux.c: + qtdemux: use GST_BOILERPLATE macro + +2010-08-16 17:23:58 +0300 Stefan Kost + + * gst/videomixer/videomixer.c: + videmixer: add a example showing how to use the child properties + Show how to position and set the alpho of the videos on gst-launch. + +2010-08-16 15:19:38 +0300 Stefan Kost + + * ext/pulse/pulsesrc.c: + pulsesrc: move the property-setter to the getter. + +2010-08-11 15:48:18 +0300 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum only aggregate magnitude/phase if user asks for it + +2010-08-11 15:45:56 +0300 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: improve performance with local vars + Use 'input' instead of 'spectrum->input' which was intende already (variable + exists, but not used everywhere). Also use a local version of + 'spectrum->input_pos'. + +2010-08-11 15:44:03 +0300 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: code cleanup + More comments and logging. Extract one complex condition to a variable. Reorder + some code for readability. + +2010-08-11 15:40:09 +0300 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: improve property setter + consistently only update if the property actualy changed the value. Do it + without reading the gvalue twice. No need to reset the spectrum analyzer for + threshold changes. + +2010-08-11 15:38:24 +0300 Stefan Kost + + * gst/spectrum/gstspectrum.c: + spectrum: add helper to only flush ringbuffer data without resetting the fft + Reduces some duplicated code as well. + +2010-08-11 12:45:53 +0300 Stefan Kost + + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + spectrum: more comments + +2010-09-05 22:22:42 -0700 David Schleef + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Document methods with bad quality + +2010-09-05 22:19:56 -0700 David Schleef + + * gst/deinterlace/gstdeinterlacemethod.c: + deinterlace: initialize all deinterlace class members + This fixes UYVY deinterlacing. + +2010-09-05 18:58:13 -0700 David Schleef + + * common: + Automatic update of common submodule + From d3d9acf to c2e10bf + +2010-09-05 18:45:21 -0700 David Schleef + + * gst/videomixer/blend.c: + videomixer: orc_init() doesn't need to be called + There's no need to call orc_init() unless you're using the Orc + API directly. All code created by orcc is guaranteed to work + without calling orc_init(). + +2010-09-05 18:40:48 -0700 David Schleef + + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime.orc: + * gst/deinterlace/tvtime/greedy.c: + deinterlace: Fix greedyl Orc implementation + To agree with the previous C/asm code. + +2010-09-05 22:31:34 -0300 Thiago Santos + + * gst/videomixer/videomixer2.c: + videomixer2: Fail when caps are incompatible + Do not forget to return false when caps are incompatible. + +2010-09-05 20:56:52 -0300 Thiago Santos + + * gst/videomixer/blend.c: + videomixer: Only init orc if it is available + Put some ifdef around orc_init to prevent build errors + +2010-09-05 12:17:08 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From ec60217 to d3d9acf + +2010-09-04 12:46:31 -0700 David Schleef + + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime-dist.h: + deinterlace: Update disted Orc files + +2009-06-29 11:43:07 -0700 David Schleef + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + v4l2src: add decimate property + +2010-06-04 12:09:23 -0700 David Schleef + + * ext/dv/Makefile.am: + * ext/dv/gstdvdemux.c: + * ext/dv/gstsmptetimecode.h: + dvdemux: Parse SMPTE time codes + +2010-08-23 02:50:36 -0700 David Schleef + + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + deinterlace: remove assembly code in favor of orc + +2010-06-08 14:54:49 -0700 David Schleef + + * gst/deinterlace/tvtime.orc: + * gst/deinterlace/tvtime/greedy.c: + deinterlace: implement greedy in Orc + +2010-09-04 11:43:21 -0700 David Schleef + + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime-dist.h: + * gst/videobox/gstvideoboxorc-dist.c: + * gst/videobox/gstvideoboxorc-dist.h: + * gst/videomixer/blendorc-dist.c: + * gst/videomixer/blendorc-dist.h: + update disted Orc files + +2010-09-02 14:34:50 +0200 Thibault Saunier + + * gst/alpha/gstalphacolor.c: + alphacolor: Fix classification + This is no effect but a converter. Fixes bug #628608. + +2010-09-02 11:19:06 +0200 Sebastian Dröge + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/gst-plugins-good-plugins.types: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-gdkpixbuf3.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst/videomixer/Makefile.am: + * gst/videomixer/videomixer2.c: + * gst/videomixer/videomixer2.h: + * gst/videomixer/videomixer2pad.h: + videomixer2: Add documentation and add to the docs + +2010-07-26 16:07:15 +0200 Sebastian Dröge + + * gst/videomixer/Makefile.am: + * gst/videomixer/gstcollectpads2.c: + * gst/videomixer/gstcollectpads2.h: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer2.c: + * gst/videomixer/videomixer2.h: + videomixer2: Add videomixer2 element + This is based on collectpads2 and is synchronizing + all streams based on the running time. + New features compared to old videomixer: + * Synchronizing frames on the running time + * Improved and simplified negotiation + * Full QoS support + * Variable framerate support + Fixes bug #626048, #624905. + +2010-09-01 11:11:34 +0200 Pavel Kostyuchenko + + * gst/matroska/matroska-demux.c: + matroskademux: Relax parsing of date tags + Before we required a complete date in matroskademux but in + id3demux for example only the year or year and month was possible too. + Fixes bug #628454. + +2010-08-30 19:03:52 +0100 Sjoerd Simons + + * sys/v4l2/gstv4l2src.c: + v4l2src: Use GstBaseSrc::block-size as fallback size + +2010-08-30 18:36:54 +0100 Sjoerd Simons + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2src.c: + v4l2src: Fix using mpegts via the mmap interface + MPEG doesn't have a static size per frame, so don't pretend it has one + and fail when capturing because it doesn't match. Instead mark the size + as unknown and let the read frame grabbing method use a reasonable fallback + value (assuming that's only for actual streaming formats) + Fixes bug #628349. + +2010-08-27 18:15:03 +0200 Sebastian Dröge + + * ext/wavpack/gstwavpackparse.c: + wavpackparse: Don't use GST_FLOW_IS_FATAL() + +2010-08-27 18:13:21 +0200 Sebastian Dröge + + * ext/libpng/gstpngdec.c: + pngdec: Don't use GST_FLOW_IS_FATAL() + And don't post an error message if downstream returns UNEXPECTED. + +2010-08-27 18:09:11 +0200 Sebastian Dröge + + * ext/dv/gstdvdemux.c: + dvdemux: Don't use GST_FLOW_IS_FATAL() + +2010-08-27 18:05:50 +0200 Sebastian Dröge + + * ext/jpeg/gstjpegdec.c: + jpegdec: Don't use GST_FLOW_IS_FATAL() + And don't post an error message if buffer allocation failed because + of UNEXPECTED, which only means that downstream wants us to EOS now. + +2010-08-27 18:02:57 +0200 Sebastian Dröge + + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + flacenc/dec: Don't use GST_FLOW_IS_FATAL() + And properly handle UNEXPECTED and WRONG_STATE. + +2010-08-27 17:52:18 +0200 Sebastian Dröge + + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + cmmldec/enc: Don't use GST_FLOW_IS_FATAL() + And as a result, don't ignore WRONG_STATE and NOT_LINKED. + Both mean that it's a good idea to pass them upstream instead + of pretending that everything is good. + +2010-08-27 17:47:22 +0200 Sebastian Dröge + + * gst/wavparse/gstwavparse.c: + wavparse: Don't use GST_FLOW_IS_FATAL() + +2010-08-27 17:45:53 +0200 Sebastian Dröge + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Don't use GST_FLOW_IS_FATAL() and GST_FLOW_IS_SUCCESS() + +2010-08-27 17:39:32 +0200 Sebastian Dröge + + * gst/qtdemux/qtdemux.c: + qtdemux: Don't use GST_FLOW_IS_FATAL() + +2010-08-27 17:37:33 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Don't use GST_FLOW_IS_FATAL() + +2010-08-27 17:35:47 +0200 Sebastian Dröge + + * gst/debugutils/rndbuffersize.c: + rndbuffersize: Don't use GST_FLOW_IS_FATAL() + +2010-08-27 17:35:38 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + flvdemux: Don't use GST_FLOW_IS_FATAL() + +2010-08-27 17:32:09 +0200 Sebastian Dröge + + * gst/avi/gstavidemux.c: + avidemux: Don't use GST_FLOW_IS_FATAL() + And document why wrong-state doesn't need an error message. + +2010-08-26 13:44:49 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Fail gracefully if no threaded PA mainloop can be created + Fixes bug #628020. + +2010-08-24 15:11:20 +0200 Sebastian Dröge + + * gst/videomixer/blendorc-dist.c: + * gst/videomixer/blendorc-dist.h: + videomixer: Update disted ORC files + +2010-08-23 15:44:50 +0200 Sebastian Dröge + + * configure.ac: + * gst/videomixer/Makefile.am: + * gst/videomixer/blend.c: + * gst/videomixer/blend_mmx.h: + * gst/videomixer/blendorc.orc: + * gst/videomixer/videomixer.c: + videomixer: Optimize ARGB blending and implement BGRA blending with orc + This now means, that we have absolutely no handwritten assembly anymore + in videomixer and it's also faster now when using SSE. + +2010-08-22 01:58:05 -0700 David Schleef + + * gst/videomixer/blend.c: + * gst/videomixer/blendorc.orc: + videomixer: Add orc implementation for blending + videomixer: Add orc implementation for blending + +2010-08-22 01:54:16 -0700 David Schleef + + * gst/videomixer/videomixer.c: + videomixer: Fix example pipelines + videomixer: Fix example pipelines + +2010-08-20 11:41:55 +0200 Sebastian Dröge + + * tests/check/elements/imagefreeze.c: + imagefreeze: Add test for checking if imagefreeze correctly returns UNEXPECTED after the first buffer + +2010-08-20 11:38:09 +0200 Sebastian Dröge + + * tests/check/elements/imagefreeze.c: + imagefreeze: Add test for bufferalloc passthrough + +2010-08-20 10:35:15 +0200 Sebastian Dröge + + * tests/check/elements/imagefreeze.c: + imagefreeze: Fix race conditions in the unit test + If setting the pipeline to PLAYING before issuing the seek, buffers + are already arriving at the sink before the seek is handled and + will have the wrong timestamps and everything. + Fixes bug #625547. + +2010-08-20 10:34:17 +0200 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + * gst/imagefreeze/gstimagefreeze.h: + imagefreeze: Fix another subtle race condition related to starting the srcpad task + Due to a seek the srcpad task could be started in rare circumstances although + it shouldn't be started anymore because no upstream buffer is available. + +2010-08-20 10:24:33 +0200 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + * gst/imagefreeze/gstimagefreeze.h: + imagefreeze: Protect the flushing-seek variable by the srcpad's stream lock + This fixes a subtle race condition, that caused bufferalloc to fail + with wrong-state due to a seek but caused it to be not retried as + it should. + +2010-08-20 09:14:59 +0200 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Always generate a perfectly timestamped stream + Before there could be rounding errors when calculating the duration, + resulting in timestamp + duration being smaller than the next buffer's + timestamp. + +2010-08-19 18:38:39 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Only include the server name in the context name if it's not NULL + +2010-08-18 16:37:41 +0200 Philippe Normand + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: Add "client" property to set the PA client name + Allows the application to modify the client name used to connect when + connecting to the PulseAudio daemon. Note however that updating the + property after the element reached the READY state will have no + effect until the next NULL->READY transition. + Fixes bug #627174. + +2010-08-19 17:59:09 +0200 David Hoyt + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Improve error messages + Before they contained the URL before the actual failure. The other + way around makes more sense and we do the same in other elements + like filesrc. + Fixes bug #627289. + +2010-08-19 12:46:50 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Free the clock on state change failures too + +2010-08-17 16:26:41 +0200 Philippe Normand + + * configure.ac: + * ext/pulse/pulseutil.c: + * win32/common/config.h: + pulseutil: include pid value in gst_pulse_client_name() fallback return value + Fixes bug #627162 + +2010-08-19 12:32:59 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Free the GstPulseContext after usage + +2010-08-16 09:12:04 +0200 Philippe Normand + + * ext/pulse/pulsesink.c: + pulsesink: share the PA context between all clients with the same name + Avoid to create a new PA context for each new client by using a hash + table containing the list of ring-buffers and the shared PA context + for each client. Doing this will improve application memory usage in + the cases where multiple pipelines involving multiple pulsesink + elements are used. + Fixes bug #624338. + +2010-08-17 13:41:49 +0200 Philippe Normand + + * ext/pulse/pulsesink.c: + pulsesink: clear the PA mainloop if baseaudiosink failed to open the ring_buffer + If the application requests a state-change and pulsesink fails to open + the ring_buffer device the mainloop attribute of the sink should be + cleaned up to avoid future state-change (NULL->READY) failures. + +2010-08-19 12:23:16 +0200 Sebastian Dröge + + * gst/wavparse/gstwavparse.c: + wavparse: Post an error message if EOS happens before valid input is found + Fixes bug #627341. + +2010-08-12 11:49:47 +0200 Sebastian Dröge + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: Send close newsegment event from the streaming thread + +2010-08-11 11:36:31 +0200 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + * gst/imagefreeze/gstimagefreeze.h: + imagefreeze: Retry bufferalloc if it was aborted with WRONG_STATE because of a flushing seek + +2010-08-11 08:46:14 +0200 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Return GST_FLOW_UNEXPECTED when getting a second buffer + This prevents upstream from pushing many useless buffers and makes + it go into EOS state. + +2010-08-10 20:11:26 +0200 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Passthrough buffer allocations + +2010-09-04 13:10:30 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + Back to development + Temporarily disable -DGST_DISABLE_DEPRECATED for git builds until + the code is updated for the GST_FLOW_IS_* macro deprecations. + +=== release 0.10.25 === + +2010-09-02 23:44:19 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * gst-plugins-good.doap: + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime-dist.h: + * gst/videobox/gstvideoboxorc-dist.c: + * gst/videobox/gstvideoboxorc-dist.h: + * gst/videomixer/blendorc-dist.c: + * gst/videomixer/blendorc-dist.h: + * win32/common/config.h: + Release 0.10.25 + +2010-09-02 23:12:48 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + docs: update docs for release + +2010-09-02 23:07:36 +0100 Tim-Philipp Müller + + * po/LINGUAS: + * po/es.po: + * po/gl.po: + * po/lt.po: + * po/nl.po: + * po/ro.po: + * po/sv.po: + po: update translations + +2010-08-25 19:01:50 +0200 Sebastian Dröge + + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + 0.10.24.5 pre-release + +2010-08-22 21:15:07 -0700 David Schleef + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: use separate buffer metadata for fields + Call gst_buffer_make_metadata_writable() on buffers that are + duplicated into fields. Fixes #627689. + +2010-08-21 21:41:36 +0200 Sebastian Dröge + + * configure.ac: + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime-dist.h: + * gst/videobox/gstvideoboxorc-dist.c: + * gst/videobox/gstvideoboxorc-dist.h: + * gst/videomixer/blendorc-dist.c: + * gst/videomixer/blendorc-dist.h: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/ru.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + 0.10.24.4 pre-release + +2010-08-19 18:30:05 -0300 Thiago Santos + + * ext/jpeg/gstjpegdec.c: + jpegdec: Prevent crash when reading image with problems + Check if we have data on the adapter and fail if not. + Fixes #627413 + +2010-08-13 17:24:01 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 3e8db1d to ec60217 + +2010-08-11 22:20:25 +0200 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Send close segments when seeking only for non-flushing seeks and if we already sent a newsegment event + Fixes bug #626619. + +2010-08-11 16:50:42 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + * win32/common/gstrtpbin-marshal.c: + * win32/common/gstudp-enumtypes.c: + * win32/common/gstudp-enumtypes.h: + * win32/common/gstudp-marshal.c: + 0.10.24.3 pre-release + +2010-08-11 11:17:18 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: prevent reading past avc1 atom when parsing + ... when one of the subatoms has a large/invalid size. + Fixes #626609. + +2010-08-10 23:37:23 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + 0.10.24.2 pre-release + +2010-08-10 10:57:45 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From bd2054b to 3e8db1d + +2010-08-09 00:36:36 +0100 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + pulse: fix printf format in some debugging messages + +2010-08-08 23:31:42 +0100 Tim-Philipp Müller + + * pkgconfig/gstreamer-plugins-good-uninstalled.pc.in: + pkgconfig: set pluginsdir to top-level builddir without the pkgconfig/.. bits + Removes clutter in plugin dir paths. This is only used to find the -good + plugins for unit tests of ugly/bad/ffmpeg/etc. in an uninstalled setup. + +2010-08-06 20:04:59 +0100 Tim-Philipp Müller + + * sys/v4l2/gstv4l2object.c: + v4l2src: also log pixel formats in sorted order + +2010-08-06 18:07:46 +0100 Sjoerd Simons + + * sys/v4l2/gstv4l2object.c: + v4l2: sort formats in the right order so that non-emulated formats are prefered + The format list should be sorted from high ranks to low ranks. In the GSList + sorting function this means the compare needs to return a positive value if + format a has a lower rank than format b. + Among other things this fixes v4l2src to prefer non-emulated formats + to emulated formats when built against libv4l. + +2010-08-06 19:24:06 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Fix pipeline in the documentation + Make sure that we have the same color format on all streams, i.e. AYUV + Fixes bug #625452. + +2010-08-05 13:56:44 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From a519571 to bd2054b + +2010-06-14 19:58:11 +1000 Jonathan Matthew + + * ext/taglib/gstid3v2mux.cc: + * tests/check/elements/id3v2mux.c: + id3v2mux: write beats-per-minute tag using TBPM frame + https://bugzilla.gnome.org/show_bug.cgi?id=621520 + +2010-07-25 11:47:43 +0200 Sebastian Dröge + + * gst/videomixer/blend.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + videomixer: Move debug categories into the source files and add debug category for the blend functions + +2010-08-04 19:25:31 +0200 Sebastian Dröge + + * configure.ac: + configure: Check if the compiler supports ISO C89 or C99 and which parameters are required + This first checks what is required for ISO C99 support and sets the relevant + compiler parameters and if no C99 compiler is found, it checks for a + C89 compiler. This enables us to check for and use C89/C99 functions + that gcc hides from us without the correct compiler parameters. + +2010-07-15 10:10:31 +0200 Philippe Normand + + * ext/pulse/pulsesink.c: + pulsesink: use G_TYPE_DEFINE to define ring buffer type + The existing get_type() implementation is racy, and the + g_type_class_ref() workaround didn't actually work because + it was in the wrong function. Since class creation in GObject + is thread-safe these days (since 2.16), the class_ref workaround + is no longer needed and it is sufficient to ensure the _get_type() + function is thread-safe, which G_TYPE_DEFINE does. + https://bugzilla.gnome.org/show_bug.cgi?id=624338 + +2010-08-04 15:20:42 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Post CLOCK-LOST/CLOCK-PROVIDE when going to/from READY + Otherwise the clocks are redistributed every time the pipeline + goes to PAUSED, which is quite expensive. + +2010-07-12 12:35:15 +0200 Wim Taymans + + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4gpay.h: + rtpmp4gpay: implement perfect timestamps + Use bitreader for parsing the config string + Reset state variables when going to READY + Parse frame length and use it to keep track of the rtptimestamps + +2010-07-09 14:07:49 +0200 Wim Taymans + + * gst/rtp/gstrtph263pdepay.c: + rtph263pdepay: allow more clock-rates as input + Although the spec says that the clock-rate should always be 90000, some rtsp + servers send different clock-rates so we must accept then in order to handle + those streams too. + +2010-07-06 19:02:14 +0200 Wim Taymans + + * gst/rtp/gstrtpL16depay.c: + L16depay: default to 1 channel + When we can't find any channel or encoding-params on the caps for dynamic + payload types, set the default number of channels to 1, as the spec says we + should. + See #623209 + +2010-07-06 18:22:24 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't reuse udp sockets + Don't reuse sockets but make the udpsrc element fail the state change when the + socket is already in use. If we don't prevent reuse, we might end up using the same + port for different streams in some cases. + Fixes #622017 + +2010-07-06 18:11:21 +0200 Wim Taymans + + * gst/udp/gstudpsrc.c: + * gst/udp/gstudpsrc.h: + udpsrc: add property to enable port reuse + +2010-07-05 10:23:37 +0200 Wim Taymans + + * gst/rtp/gstrtpL16depay.c: + L16depay: use encoding-params for the channels + When parsing the number of channels, use the encoding-params property from the + RTP caps because that is where we can find the channels according to the spec. + Fall back to the channels property in the caps when needed. + Fixes #623209 + +2010-06-29 10:46:41 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: improve error and warning message + Improve error and warning message. + Fixes #622577 + +2010-08-02 23:15:56 +0300 Stefan Kost + + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + examples: no need to set the color for each frq-band + +2010-08-02 12:56:29 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpg729pay.c: + * gst/rtp/gstrtpg729pay.h: + rtpg729pay: avoid basertppayload perfect-rtptime mode + G729 packets may only occur intermittently (e.g. cn packets), and as such + do not allow for perfect-rtptime calculating rtp times based on frame or byte + count. In particular, do not use rtp audio base payloader as base class, but + rather base payloader directly. + +2010-08-02 12:48:02 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264pay.c: + rtph264pay: fix element leak + +2010-08-02 12:46:41 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmp4vdepay.c: + rtpmp4vdepay: fix buffer leak + +2010-08-02 12:46:20 +0200 Mark Nauwelaerts + + * tests/check/elements/rtp-payloading.c: + tests: rtp payloading: fix pad leak + +2010-07-29 17:18:11 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: push mode; use proper movi offset for movi based index + Fixes #623357. + +2010-07-29 10:00:15 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: Correctly parse mvhd atoms + Parse mvhd data according to its version to avoid failing + on valid files. + +2010-07-28 12:21:41 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix the max/avg in btrt atom reading + According to ISO media base format, the max bitrate is the + first one, and the avg comes next. + +2010-07-27 15:58:02 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: proper handling of streaming upstream without duration + Fixes #625371. + +2010-07-26 18:33:09 +0200 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroskademux: initialize some variables to fix compiler warnings on OSX build bot + +2010-07-26 18:15:25 +0200 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + pulsesink: correctly check what version of gst-plugins-base we're compiling against + We need to check the gst-plugins-base version, not the core version + (even if both should be the same in any sane setup). + +2010-07-26 17:45:42 +0200 Arnaud Vrac + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: add port-range property to rtspsrc + To support setups with firewall/ipsec, it is useful for an rtsp client to be + able to set the range of ports that can be used for rtp/rtcp reception. + Allows this by adding a "port-range" property to the rtspsrc element. + Fixes #625153 + +2010-07-26 13:38:31 +0200 Andoni Morales Alastruey + + * gst/qtdemux/qtdemux.c: + qtdemux: set the pixel-aspect-ratio field also for par=1/1 + https://bugzilla.gnome.org/show_bug.cgi?id=625302 + +2010-07-26 15:31:16 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix memory leak in server request reply + The RTSP server rtspsrc is communicating with, sends a GET_PARAMETER request + periodically as a ping. The code in gst_rtspsrc_handle_request forms an OK + response and sends, but doesn't call gst_rtsp_message_unset to free the memory + after sending the response. This results in a constant slow memory leak. + Fixes #624770 + +2010-07-24 22:39:54 +0100 Zaheer Abbas Merali + + * gst/debugutils/cpureport.c: + cpureport: remove bogus docs + +2010-07-24 22:37:11 +0100 Zaheer Abbas Merali + + * gst/debugutils/Makefile.am: + * gst/debugutils/cpureport.c: + * gst/debugutils/cpureport.h: + * gst/debugutils/gstdebug.c: + debugutils: new element cpureport + cpureport posts bus messages after every buffer received of cpu used, system + clock time, buffer time + +2010-07-24 10:29:01 +0200 Sebastian Dröge + + * tests/examples/equalizer/demo.c: + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + examples: Destroy the cairo context after usage + +2010-07-24 10:21:05 +0200 Sebastian Dröge + + * configure.ac: + * ext/Makefile.am: + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + * ext/gdk_pixbuf/pixbufscale.c: + Revert "gdkpixbuf: Add a gdkpixbuf3 plugin that uses gdkpixbuf3" + This reverts commit b6788153161b4e07fbf3d42a2d8921ea049305d0. + There's no gdk-pixbuf3 anymore. gdk-pixbuf was separated from GTK+ + and will stay at version 2.0 for GTK+ 3.0. + +2010-07-24 10:19:37 +0200 Sebastian Dröge + + * tests/examples/equalizer/demo.c: + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + examples: Use cairo instead of to-be-deprecated GDK API + Fixes bug #625002. + +2010-07-22 16:24:43 +0200 Mark Nauwelaerts + + * ext/flac/gstflacdec.c: + flacdec: fix event leak + +2010-07-22 12:05:26 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: pull mode non-cue seeking + That is, in files that have no index (Cue), perform seek by scanning for + nearest cluster with timecode before requested position. Scanning is done + as a combination of interpolation and sequential scan. + Fixes #617368. + +2010-07-16 12:46:50 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskamux: streamable files need no _finish + Fixes #624455. + +2010-07-22 11:46:35 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: push mode; handle 0-size data chunks + Fixes #618535. + +2010-07-21 08:11:23 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Only reset QoS information and send a NEWSEGMENT event downstream for NEWSEGMENT events on the master pad + +2010-07-14 20:31:44 -0700 David Schleef + + * gst/debugutils/Makefile.am: + * gst/debugutils/gstcapsdebug.c: + * gst/debugutils/gstcapsdebug.h: + * gst/debugutils/gstdebug.c: + capsdebug: Add new element + +2010-07-20 16:11:25 +0100 Tim-Philipp Müller + + * gst/matroska/matroska-mux.c: + matroskamux: demote WARNING message to LOG level + It's not a warning. + +2010-07-19 14:47:32 -0300 Thiago Santos + + * ext/jpeg/gstjpegdec.c: + jpegdec: Fix regression on markers parsing + Fixes a regression introduced when fixing bug #583047 in + commit a391bf52cc3c580c7a0a2316ca52eb66da3b85c1 + Skip the data when libjpeg asks it to be skipped on + one of its callbacks. + +2010-07-16 18:04:44 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: add missing argument in debug message + +2010-07-16 17:53:55 +0200 Sebastian Dröge + + * ext/pulse/pulsemixerctrl.c: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + pulsesink: Only use gst_audio_clock_new() when compiling against newer base + +2010-07-09 17:33:55 +0200 Sebastian Dröge + + * ext/raw1394/gstdv1394src.c: + dv1394src: Post clock-provide and clock-lost messages when going from/to PLAYING + In PAUSED and below the clock is not working. + +2010-07-04 16:57:55 +0200 Sebastian Dröge + + * ext/gconf/gstswitchsink.c: + * ext/gconf/gstswitchsink.h: + * ext/gconf/gstswitchsrc.c: + * ext/gconf/gstswitchsrc.h: + gconf: Fix ref handling of new child elements and minor cleanup + +2010-07-04 09:45:52 +0200 Sebastian Dröge + + * ext/gconf/gstgconfvideosrc.c: + gconfvideosrc: Use correct GConf key + +2010-07-03 14:16:42 +0200 Sebastian Dröge + + * ext/gconf/gstgconfaudiosrc.c: + * ext/gconf/gstgconfaudiosrc.h: + gconf: Port gconfaudiosrc to GstSwitchSrc + +2010-07-03 14:12:12 +0200 Sebastian Dröge + + * ext/gconf/gstgconfvideosrc.c: + * ext/gconf/gstgconfvideosrc.h: + gconf: Port gconfvideosrc to GstSwitchSrc + +2010-07-03 14:11:55 +0200 Sebastian Dröge + + * ext/gconf/Makefile.am: + * ext/gconf/gstswitchsrc.c: + * ext/gconf/gstswitchsrc.h: + gconf: Add GstSwitchSrc base class + +2010-07-03 13:56:33 +0200 Sebastian Dröge + + * ext/gconf/gstswitchsink.c: + gconf: Create the ghostpad of the switchsink from the template + +2010-07-07 10:10:52 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Post clock-provide/clock-lost when going to/from PAUSED + Also use gst_audio_clock_new_full() to prevent crashes when the + clock is used after the element was destroyed. + +2010-07-15 11:49:03 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: remove bogus UNLOCK + +2010-07-13 12:34:44 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: also calculate PAR using track width and height for QT files + (... as opposed to only for ISO style files). + Fixes #624173. + +2010-07-12 17:29:12 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: handle bogus files storing ADTS AAC data + +2010-07-09 16:57:33 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: do not error out on a block with unknown tracknumber + +2010-07-08 18:57:21 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: do not align reverse playback reference stream twice + Timestamp rounding issues could lead to going backwards 2 keyframe periods + (rather than only 1). While this is not necessarily a problem, it might + potentially place additional (buffering) load on downstream and could be + avoided (because We Can). + Fixes #623629. + +2010-07-08 16:07:16 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: convert some more mov format timestamp to gst time + +2010-07-07 14:16:59 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: additional verification heuristics for VBR audio stream + Check for and override some header field(s) for reasonable values, according + to later expected use in calculations. + +2010-07-14 15:21:21 +0200 Alessandro Decina + + * gst/videofilter/gstvideobalance.c: + videobalance: Fix wrong lock order that could lead to a deadlock. Fixes #624331. + +2010-07-16 11:31:08 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.24 === + +2010-07-15 01:49:04 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.24 + +2010-07-15 01:35:06 +0100 Tim-Philipp Müller + + * po/cs.po: + * po/lv.po: + po: update translations + +2010-07-07 00:42:46 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + 0.10.23.4 pre-release + +2010-07-07 00:31:17 +0100 Tim-Philipp Müller + + * po/LINGUAS: + * po/da.po: + * po/el.po: + * po/es.po: + * po/fr.po: + * po/id.po: + * po/pt_BR.po: + * po/sl.po: + * po/tr.po: + * po/zh_CN.po: + po: update translations + +2010-06-23 11:47:43 +0200 Michael Grzeschik + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: destroy buffer pool when changing state to NULL + In the case we change the State from READY_TO_NULL the buffers in the pool + still hold an open dup file descriptor to the device, therefore the device + release function will not be called and the device will probably answer with + -EBUSY when we reopen it in the next NULL_TO_READY transition. + Signed-off-by: Michael Grzeschik + See bug #622500 and #612244. + +2010-07-06 13:21:19 +0530 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix order of bitrates in 'btrt' atom + There seems to be a bug in libmp4v2 that generates a MPEG4BitRateBox as + (bufferSizeDB, avgBitrate, maxBitrate) instead of (bufferSizeDB, + maxBitrate, avgBitrate), according to the spec. I used the mp4file + output while writing this code, so the order is wrong. This patches + fixes that. + https://bugzilla.gnome.org/show_bug.cgi?id=623654 + +2010-07-05 12:05:57 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix skipping extra 0xff markers + Fixes #623585. + +2010-06-29 23:18:23 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: fix memory leak + Don't leak result of gst_adapter_take(). There are most likely + smarter things we can do, but let's keep things simple for the + release. + Fixes #623172. + +2010-07-02 12:31:31 +0200 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: strip out bogus tags from XMP atom + https://bugzilla.gnome.org/show_bug.cgi?id=623366 + +2010-07-02 14:25:22 +0200 Andrzej K. Haczewski + + * gst/flv/gstflvmux.c: + flvmux: Write duration at the correct position + +2010-06-30 11:12:08 +0200 Thijs Vermeir + + * gst/rtpmanager/gstrtpptdemux.c: + rtpptdemux: fix memleak on custom downstream events + by not sending custom downstream event twice and fix memleak when + not handling the event + https://bugzilla.gnome.org/show_bug.cgi?id=623196 + +2010-06-29 20:18:51 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + 0.10.23.3 pre-release + +2010-06-29 20:14:53 +0100 Tim-Philipp Müller + + * gst/wavparse/gstwavparse.c: + wavparse: fix unportable printf format specifiers in commented out code + To avoid false positives when grepping for unportable specifiers. + +2010-06-29 19:12:36 +0100 Tim-Philipp Müller + + * configure.ac: + configure: fix --disable-external + +2010-06-28 15:44:06 +0100 Tim-Philipp Müller + + * autogen.sh: + * configure.ac: + Bump automake requirement to 1.10 and autoconf to 2.60 + For maintainability reasons and $(builddir). + See #622944. + +2010-06-28 09:07:58 +0100 Tim-Philipp Müller + + * gst/goom/plugin_info.c: + goom: don't allocate 260kB struct on the stack + PluginInfo is quite a sizeable struct, let's not allocate it on the + stack, especially not if we're copying it over into another dynamically + allocated copy anyway. + Fixes #570761. + +2010-06-27 10:31:17 +0200 Sebastian Dröge + + * configure.ac: + configure: Require GTK+ >= 2.14 for the examples + +2010-06-26 20:12:25 +0200 Guido Günther + + * tests/examples/equalizer/demo.c: + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + examples: Make demos -DSEAL safe to fix build with GTK+ 3.0 + +2010-06-26 21:39:34 +0200 Sebastian Dröge + + * ext/jpeg/Makefile.am: + jpeg: Explicitely link with libgstbase + +2010-06-26 18:42:29 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.23.2 pre-release + +2010-06-26 18:41:49 +0100 Tim-Philipp Müller + + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime-dist.h: + * gst/videobox/gstvideoboxorc-dist.c: + * gst/videobox/gstvideoboxorc-dist.h: + * gst/videomixer/blendorc-dist.c: + gst: update orc files + +2010-06-26 18:41:39 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + po: update translations + +2010-06-25 19:40:06 +0200 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + matroskamux: Fix leaking of the streamheader buffers + gst_value_set_buffer() increases the refcount and doesn't + take ownership of the buffer. + +2010-06-24 16:32:23 +0100 Tim-Philipp Müller + + * gst/matroska/ebml-read.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstvideoflip.c: + matroska, videobox, videofilter: fix compiler warnings when debugging is disabled in gstreamer + Fixes unused variable warnings when GStreamer's debugging system has been disabled. + +2010-06-24 15:17:11 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: add plugin loading whitelist to test environment + Only want to load core/base/good plugins here. + Fixes #619717. + +2010-06-24 15:09:16 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 73ff93a to a519571 + +2010-06-24 13:02:04 +0100 Tim-Philipp Müller + + * ext/gdk_pixbuf/gstgdkpixbuf.c: + gdkpixbufdec: bump rank to SECONDARY + Bump gdkpixbufdec's rank to SECONDARY to give it an edge over misc. + image decoders in gst-ffmpeg that also have a MARGINAL rank. + Fixes #620162. + +2010-06-23 12:15:13 +0200 Michael Grzeschik + + * gst/avi/gstavidemux.c: + reset the have_index flag at transition PAUSED_TO_READY + If we restart the Stream in the case of doing a transition from + PAUSED_TO_READY and back with READY_TO_PAUSED aso. the duration of the video + will get calculated even if we have a avi header with that information. + Signed-off-by: Michael Grzeschik + +2010-06-23 20:29:14 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix negotiation for I420/YV12 + We don't support conversion into *all* YUV + formats for them, only into I420/YV12/AYUV. + Fixes bug #622501. + +2010-06-22 15:22:44 +0200 Mark Nauwelaerts + + * gst/wavparse/gstwavparse.c: + wavparse: proper closing segment construction + Fixes #618982. + +2010-06-22 15:46:51 +0300 Stefan Kost + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2src_calls.c: + v4l2: precalculate duration + Have frame duration in the instance struct and calculate it after changing the caps. + +2010-06-21 12:17:39 +0300 Stefan Kost + + * sys/v4l2/gstv4l2sink.c: + v4l2sink: use glib defines in property declarations for readability + +2010-06-21 12:15:14 +0300 Stefan Kost + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2src.c: + v4l2: use G_PARAM_STATIC_STRINGS to save a few bytes and strdups + +2010-06-18 20:02:49 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix locking after moving things around + +2010-06-18 14:13:58 -0300 Thiago Santos + + * ext/taglib/gstapev2mux.cc: + taglib: Use newly added gst_tag_list_peek_string_index + Replace calls to gst_tag_list_get_string_index with + gst_tag_list_peek_string_index to avoid a string copy + +2010-06-18 16:56:19 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: make some errors as warnings + Avoid spamming the testsuite with these error debug lines. + +2010-06-18 16:49:08 +0200 Keith Nicholson + + * gst/udp/gstudpsrc.c: + udpsrc: fix multicast support on windows builds + On windows builds, sets source address for bind to INADDR_ANY, while + maintaining the original multicast group address for subsequent join. + Fixes #595978 + +2010-06-18 16:16:28 +0200 Wim Taymans + + * gst/udp/gstudpnetutils.c: + udp: make url parsing compatible with VLC syntax + Skip everything before the @ sign in the url location. VLC uses that as the + remote address to connect to (but we ignore it for now). This makes our udp urls + compatible with the ones used by VLC. + Fixes #597695 + +2010-06-18 15:08:21 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: factor out the connections + Keep a global connection for aggregate control but also keep stream connections + for non-aggregate control. + Add some helper methods to connect/close/flush the connections. + +2010-06-17 13:06:56 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: add non-aggregate control + Add non-aggregate control. + Separate retrieving thr SDP from parsing and setting up the streaming from the + SDP. + +2010-06-17 22:10:03 +0100 Zaheer Abbas Merali + + * common: + common: update common back to what it was + +2010-06-17 17:24:22 +0100 Zaheer Abbas Merali + + * common: + * gst/flv/gstflvmux.c: + flvmux: add documentation for streamable property + +2010-06-17 16:43:44 +0100 Tim-Philipp Müller + + * common: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + docs: update introspected plugin docs for gstdoc-scangobj and other changes + Update common for latest gstdoc-scangobj, and inspect xml files for + escaping and pad template order changes. + +2010-06-17 16:41:56 +0100 Tim-Philipp Müller + + * tests/check/.gitignore: + tests: ignore sub-directory with orc tests + +2010-06-17 10:44:33 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Fix an uninitialized variable compiler warning + +2010-06-16 21:02:13 +0200 Sebastian Dröge + + * gst/matroska/ebml-read.c: + ebml-read: Zero-sized ints/uints/floats have a value of 0 according to the EBML spec + +2010-06-16 20:02:58 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Fix possible NULL pointer dereference and assertion that could be caused by invalid files + +2010-06-16 19:50:34 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Clean up/fix some minor error handling bugs + +2010-06-16 19:30:25 +0200 Sebastian Dröge + + * sys/ximage/gstximagesrc.c: + ximagesrc: Fix NULL pointer dereference when allocation of the ximage fails + +2010-06-16 19:28:04 +0200 Sebastian Dröge + + * ext/flac/gstflactag.c: + flactag: Fix possible NULL pointer dereference + +2010-06-16 19:24:54 +0200 Sebastian Dröge + + * gst/audiofx/audioiirfilter.c: + audioiirfilter: Fix possible NULL pointer dereference + +2010-06-16 19:20:02 +0200 Sebastian Dröge + + * gst/effectv/gstwarp.c: + warptv: Don't use floats as loop counters + +2010-06-16 11:21:35 -0400 Havoc Pennington + + * sys/v4l2/gstv4l2object.c: + v4l2src: do not try to change device format if it's already correct + This allows set_caps to succeed if caps change in a way that + would not modify the format we're getting from the hardware. + Otherwise if not in NULL state, setting caps would fail + with EBUSY. + With this change, in some cases it's OK to go PLAYING->READY->PLAYING + rather than PLAYING->NULL->PLAYING to avoid a time-consuming close + and reopen of the device. + Fixes #621723 + +2010-06-16 11:09:17 -0400 Havoc Pennington + + * sys/v4l2/gstv4l2src.c: + v4l2src: in negotiate, check for error return from set_caps + Fixes #621723 (partially) + set_caps can fail if the video device is running, in that case + setting its format leads to EBUSY. + If set_caps fails then we will not have set up the buffer pool + (it will be NULL) which leads to a crash when we try to pull + buffers. If we fail the negotiate on set_caps failure, then we + won't go to playing state and won't crash. + This is a small improvement. Of course, a nicer fix would + be to make set_caps work in the case where the format is + unchanged. If the format has changed, failing is + probably correct because we need to close the device + (go to NULL state) in order to set caps. + +2010-06-16 15:40:34 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: improve audio vbr detection + Subsequent entry time calculations use blockalign value to determine + number of frames per chunk, and blockalign == 1 is then most unlikely to result + in reasonable values (which also aligns with "spec"). + +2010-06-16 15:52:57 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + rtph264depay: tweak DELTA_UNIT labeling + Consider SPS, PPS and IDR as keyframe, all others as DELTA_UNIT. + See #620154. + +2010-06-15 20:06:17 +0200 Sebastian Dröge + + * ext/wavpack/gstwavpackdec.c: + wavpackdec: Initialize uninitialized variable and don't unref it if it's NULL + +2010-06-15 20:04:35 +0200 Sebastian Dröge + + * gst/avi/gstavidemux.c: + avidemux: Assign variables before printing them + +2010-06-15 20:00:28 +0200 Sebastian Dröge + + * gst/wavparse/gstwavparse.c: + wavparse: Initialize uninitialized variable + +2010-06-15 19:47:16 +0200 Sebastian Dröge + + * sys/v4l2/gstv4l2object.c: + v4l2: Initialize variable + +2010-06-15 19:45:36 +0200 Sebastian Dröge + + * ext/flac/gstflacenc.c: + flacenc: Fix NEWSEGMENT parsing logic and don't use uninitialized variables + +2010-06-15 17:20:20 +0200 Edward Hervey + + * gst/matroska/ebml-read.c: + matroska: Fix unitialized variable + +2010-06-15 16:49:49 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From 9339ccc to 35617c2 + +2010-06-15 16:54:04 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 5adb1ca to 9339ccc + +2010-06-15 16:35:18 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 57c89b7 to 5adb1ca + +2010-06-15 14:08:26 +0100 Tim-Philipp Müller + + * .gitignore: + .gitignore: ignore generated tvtime.h file + +2010-06-15 15:36:33 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From c804988 to 57c89b7 + +2010-05-17 13:54:03 +0200 Marc-André Lureau + + * ext/raw1394/gst1394clock.c: + * ext/raw1394/gst1394clock.h: + raw1394: remove useless last_time + It seems to me this code is useless: removing it. + https://bugzilla.gnome.org/show_bug.cgi?id=618871 + +2010-06-14 19:21:22 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: respect aggregate control attributes + when the SDP specifies an aggregate control url, use that for playback + control. + Fixes #619531 + +2010-06-14 15:36:00 +0200 Sebastian Dröge + + * gst/goom/gstgoom.c: + goom: Call orc_init() before trying to get target flags + +2010-06-14 15:35:08 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Call orc_init() before trying to get target flags + +2010-06-14 14:26:22 +0100 Zaheer Abbas Merali + + * gst/matroska/matroska-mux.c: + * tests/check/elements/matroskamux.c: + matroskamux: revert change that set a reserved flag on the Block. + So matroska's Block structure has no keyframe flag, only the SimpleBlock has it. + To detect keyframes in Blocks, it is just the BlockGroup container that needs + to have a ReferenceBlock attached if it is a delta frame in video. + +2010-05-31 12:45:01 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: use libjpeg scatter-gather operation to avoid data copying + Fixes #583047 (more). + +2010-05-27 15:45:23 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: optimize buffer handling when parsing + Use an adapter to collect incoming data, and use adapter API to scan and peek. + Fixes #583047. + +2010-06-14 13:48:28 +0200 Sebastian Dröge + + * sys/oss4/oss4-mixer.c: + oss4: Use g_ascii_strcasecmp() instead of the deprecated g_strcasecmp() + +2010-06-14 13:27:30 +0200 Sebastian Dröge + + * configure.ac: + configure: Use GLIB_EXTRA_CFLAGS + +2010-06-14 13:03:57 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 7a0fdf5 to c804988 + +2010-06-14 11:46:32 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + rtph264depay: also consider AU and SEI NALUs as DELTA_UNIT + Fixes #620154. + +2010-06-14 11:32:43 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 6da3bab to 7a0fdf5 + +2010-06-12 21:26:16 +0300 Stefan Kost + + * gst/rtp/gstrtpmparobustdepay.c: + build: include stdio.h for sscanf + +2010-06-12 14:12:50 +0200 Sebastian Dröge + + * tests/check/Makefile.am: + tests: Add clean rule for the orc tests + +2010-06-12 14:12:04 +0200 Sebastian Dröge + + * tests/check/Makefile.am: + tests: Add autogenerated orc tests + +2010-06-12 08:27:42 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 733fca9 to 6da3bab + +2010-06-11 16:23:29 -0700 David Schleef + + * sys/v4l2/gstv4l2src.c: + v4l2src: Fix element description + +2010-06-11 21:13:59 +0100 Tim-Philipp Müller + + * gst/rtp/gstrtpmparobustdepay.c: + rtpmparobustdepay: don't try to unref NULL buffers + Fixes generic/states unit test. + +2010-06-11 20:50:23 +0100 Tim-Philipp Müller + + * gst/wavparse/gstwavparse.c: + wavparse: use typefind functions to check if PCM data contains dts stream + Use new dts audio typefinder from -base to check if the PCM data + contains a dts stream. This way we recognise more varieties more + reliably and also detect the dts stream if there isn't a frame + sync right at the start of the data. + Fixes #413942. + +2010-06-11 20:47:22 +0100 Tim-Philipp Müller + + * gst/wavparse/gstwavparse.c: + wavparse: set buffer offsets before using the buffer for the first time + gst_type_find_helper_for_buffer() will need the correct offset + set on the buffer (ie. 0) and not the byte offset we started + pulling the data from. + +2010-06-10 16:14:43 +0200 Mark Nauwelaerts + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpmparobustdepay.c: + * gst/rtp/gstrtpmparobustdepay.h: + rtp: add mpa-robust depayloader + Fixes #589997. + +2010-06-11 10:57:41 +0200 Mark Nauwelaerts + + * gst/avi/gstavimux.c: + avimux: fix avi header bytewriting + ... by using proper offsets for tag list writing. + Also use _reset rather than _free and consistently use bytewriter position. + See #619293. + +2010-06-10 22:58:41 +0200 Sebastian Dröge + + * .gitignore: + Update .gitignore + Add the generated orc source files + +2010-06-10 22:55:17 +0200 Sebastian Dröge + + * tests/check/elements/matroskamux.c: + matroskamux: Fix unit test for changed key-frame behaviour + All audio frames are marked as keyframe now instead of marking + them all as delta unit... + +2010-06-10 22:45:13 +0200 Sebastian Dröge + + * gst/videomixer/Makefile.am: + * gst/videomixer/blend.c: + * gst/videomixer/blend_mmx.h: + * gst/videomixer/blendorc-dist.c: + * gst/videomixer/blendorc-dist.h: + * gst/videomixer/blendorc.orc: + videomixer: Port most blending related functions to orc + Only remaining MMX implementation is the ARGB/BGRA/AYUV blending + for which we first need the orc compositing opcodes. + +2010-06-10 20:17:07 +0200 Sebastian Dröge + + * gst/videomixer/blend_mmx.h: + videomixer: Replace some tabs by spaces + +2010-06-10 11:04:38 +0100 Andoni Morales Alastruey + + * ext/raw1394/gst1394clock.c: + dv1394: Fix the internal clock even more + The cycleCount register is 13 bits long and the cycleOffset one + is 12 bits long. To read the cycleCount register we need to shift + 12 bits and not 13. Fixes #615461 + +2010-06-09 18:37:29 -0700 David Schleef + + * configure.ac: + configure: use m4 macro to check for Orc + +2010-06-09 22:40:23 +0200 Zaheer Abbas Merali + + * gst/matroska/matroska-mux.c: + matroskamux: some non-delta buffers were not marked as keyframes + +2010-06-09 22:00:16 +0200 Zaheer Abbas Merali + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: change 2 second limit per cluster + Start cluster at every keyframe or when we would overflow the previous + cluster's relative timestamp field. This would avoid as much as possible + starting clusters at non-keyframes. + +2010-06-09 12:40:09 -0700 David Schleef + + * common: + Automatic update of common submodule + From fad145b to 733fca9 + +2010-06-09 12:34:01 -0700 David Schleef + + * common: + Automatic update of common submodule + From 47683c1 to fad145b + +2010-06-09 20:53:06 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Don't request more shared memory than needed + +2010-06-09 20:45:04 +0200 Sebastian Dröge + + * ext/gconf/gstswitchsink.c: + switchsink: Set the GST_ELEMENT_IS_SINK flag on the sink + +2010-06-09 20:43:50 +0200 Sebastian Dröge + + * ext/gconf/gstgconfvideosink.c: + * ext/gconf/gstgconfvideosink.h: + gconfvideosink: Use GstSwitchSink as base class + +2010-06-09 20:30:31 +0200 Sebastian Dröge + + * ext/gconf/gstgconfaudiosink.c: + gconfaudiosink: Use G_PARAM_STATIC_STRINGS + +2010-06-09 20:29:02 +0200 Sebastian Dröge + + * ext/gconf/gstgconfaudiosink.c: + * ext/gconf/gstgconfaudiosink.h: + gconfaudiosink: Rename instance variable to be more descriptive + +2010-06-09 20:22:30 +0200 Sebastian Dröge + + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautovideosink.c: + auto{audio,video}sink: Don't lose the GST_ELEMENT_IS_SINK flag after removing the child + +2010-06-09 20:07:09 +0200 Julien Moutte + + * sys/directsound/gstdirectsoundsink.c: + directsoundsink: Plug some memleak and support 22050Hz mono sound. + Segment size needs to be a multiple of the sample size in bytes. + +2010-06-09 16:22:27 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Flush shm buffer immediately if it's full + +2010-06-09 16:21:55 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Fix writing of buffers larger than segsize + Fixes bug #620540. + +2010-06-09 15:42:37 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Fix playback if PA doesn't give us a large enough shared memory buffer + +2010-06-09 15:42:19 +0200 Zaheer Abbas Merali + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: change indexed property to streamable + The property streamable has reverse semantics to indexed. + +2010-06-09 09:13:09 -0300 Thiago Santos + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + flvmux: Rename unreleased property 'indexed' to 'streamable' + Rename 'indexed' to 'streamable' for a better name while it + hasn't been released + +2010-06-08 15:23:51 -0700 David Schleef + + * REQUIREMENTS: + * configure.ac: + configure: remove liboil check + +2010-06-08 14:44:19 -0700 David Schleef + + * gst/level/gstlevel.c: + level: remove unused liboil include + +2010-06-04 18:22:42 -0700 David Schleef + + * gst/videomixer/Makefile.am: + * gst/videomixer/blend.c: + videomixer: liboil to orc conversion + +2010-06-04 18:21:21 -0700 David Schleef + + * gst/videobox/Makefile.am: + * gst/videobox/gstvideobox.c: + * gst/videobox/gstvideoboxorc-dist.c: + * gst/videobox/gstvideoboxorc-dist.h: + * gst/videobox/gstvideoboxorc.orc: + videobox: liboil to orc conversion + +2010-06-04 18:16:25 -0700 David Schleef + + * gst/goom/Makefile.am: + * gst/goom/README: + * gst/goom/gstgoom.c: + * gst/goom/plugin_info.c: + goom: liboil to orc conversion + +2010-06-08 16:04:23 -0700 David Schleef + + * gst/deinterlace/Makefile.am: + * gst/deinterlace/tvtime-dist.c: + * gst/deinterlace/tvtime-dist.h: + * gst/deinterlace/tvtime.orc: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/vfir.c: + deinterlace: orcify some deinterlacing methods + +2010-06-08 16:03:36 -0700 David Schleef + + * gst/deinterlace/Makefile.am: + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/greedy.c: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/tomsmocomp.c: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: convert from liboil to orc + +2010-06-08 15:23:28 -0700 David Schleef + + * REQUIREMENTS: + * configure.ac: + configure: Add orc check + +2010-06-08 14:09:00 +0200 Zaheer Abbas Merali + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + flvmux: Add indexed property to replace disabled is-live. + Add indexed property to be the negation of what the disabled is-live property + was. Fixes bug #613066. + +2010-06-08 09:22:30 +0200 Sebastian Dröge + + * configure.ac: + raw1394: Require libraw1394 >= 2.0.0 for raw1394_read_cycle_timer + Fixes bug #620929. + +2010-06-08 07:35:00 +0200 Sebastian Dröge + + * ext/annodex/gstcmmlenc.c: + cmmlenc: Remove hack to let oggmux start a new page for every CMML buffer + oggmux does this for CMML by its own now + +2010-06-07 18:32:16 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + flvdemux: Don't handle non-TIME seeks + Don't send them upstream because for upstream a BYTES seek + might make sense but is completely wrong because upstream + can't seek to a byte position of the audio or video stream. + Also don't build the index in push mode for non-TIME seeks, + things will go wrong here otherwise. + +2010-06-02 19:16:20 +0100 Sjoerd Simons + + * gst/rtp/gstrtph264pay.c: + Cope with short startcodes in the h264 bytestream + +2010-06-06 17:25:16 +0100 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + pulse: log message printf format fixes + +2010-06-06 18:00:22 +0200 Sebastian Dröge + + * ext/dv/gstdvdemux.c: + * ext/pulse/pulsemixer.c: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + * ext/speex/gstspeexenc.c: + * ext/taglib/gsttaglibmux.c: + * ext/wavpack/gstwavpackdec.c: + * ext/wavpack/gstwavpackenc.c: + * ext/wavpack/gstwavpackparse.c: + ext: Don't use GST_DEBUG_FUNCPTR for GObject vfuncs + +2010-06-06 17:57:03 +0200 Sebastian Dröge + + * sys/directsound/gstdirectsoundsink.c: + * sys/oss/gstossdmabuffer.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxaudio/gstosxringbuffer.c: + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosrc.c: + * sys/waveform/gstwaveformsink.c: + sys: Don't use GST_DEBUG_FUNCPTR for GObject vfuncs + +2010-06-06 17:52:40 +0200 Sebastian Dröge + + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautovideosink.c: + * gst/autodetect/gstautovideosrc.c: + * gst/debugutils/breakmydata.c: + * gst/debugutils/gsttaginject.c: + * gst/debugutils/rndbuffersize.c: + * gst/debugutils/testplugin.c: + * gst/flv/gstflvdemux.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/videofilter/gstvideobalance.c: + * gst/videomixer/videomixer.c: + gst: Don't use GST_DEBUG_FUNCPTR for GObject vfuncs + +2010-06-06 15:12:16 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: refactor delta unit handling + This allows us to skip delta units earlier and is a bit clearer in my + opinion. It also makes only video buffers ever be delta units, not + just for SimpleBlock as before. + +2010-06-06 15:17:00 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + flvdemux: Clear adapter on discontinuities + +2010-06-06 14:03:53 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: Ignore keyframe flag for non-video streams + When the keyframe bit of SimpleBlock Flags wasn't set, the buffer was being + marked with GST_BUFFER_FLAG_DELTA_UNIT, causing all buffers to be skipped + after a seek. This may be a problem with the Sorenson Squish encoder, but + arguably the keyframe bit should only be applied to video. + Fixes bug #620358. + +2010-06-06 14:56:52 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + flvdemux: First try upstream when handling seek events/queries + +2010-06-04 14:54:59 -0400 Tristan Matthews + + * gst/rtp/gstrtpceltpay.c: + gstrtpceltpay: don't always fixate sink caps to 1 channel + The getcaps function should not fixate the channels field until we + get the encoding-params field from our srcpad's caps. Fixes #620591 + +2010-06-04 13:57:28 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtsp: try all ranges from the sdp + Try all ranges in the SDP before giving up. + +2010-06-04 13:56:07 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: make parse_range return result + Make the parse_range function return if the parsing succeeded or failed. + +2010-06-04 11:44:09 +0200 Edward Hervey + + * gst/videomixer/videomixer.c: + videomixer: if we're not linked downstream, we can do any format + Stupid me, assuming _get_allowed_caps() would actually return the + pad templates if there was no peer. + +2010-05-31 16:26:19 +0100 Sjoerd Simons + + * gst/rtp/gstrtptheorapay.c: + Keep announcing the delivery-method in the capabilities + Even though we don't use delivery-method in our payloader, older versions of + the theora payloader in gstreamer required it. As such we need to keep this + around in the caps for backwards-compatibility. + This reverts part of 49463a37cbaa952e1401291f0a2623de6cab3880 + Fixes #618940 + +2010-06-03 17:52:11 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + * sys/oss4/oss4-mixer.c: + oss4: add some comments for translators to clarify meaning of "Low" + "Low" etc. are quality settings here (e.g. for the internal resampler). + Some day when we use GLib's i18n functions we might want to use + NC_() and g_dpgettext2() here instead of the comments. + Fixes #555967. + +2010-06-03 19:23:01 +0200 Wim Taymans + + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gdepay.h: + mp4gdepay: calculate the frame duration correctly + When we calculate the frame duration, we need to use the amount of + frames in the _previous_ packet, not the current packet. The frame duration is + needed to correctly de-interleave interleaved streams. This fixes the case where + there are a variable number of frames in a packet. + Fixes #620494 + +2010-06-03 18:58:42 +0200 Edward Hervey + + * gst/videomixer/videomixer.c: + videomixer: Don't return caps in get_caps() that will be rejected + This commit basically puts _get_caps() in sync with accept_caps(). + If we don't have a master pad OR the master pad caps aren't negotiated + then we just return the downstream allowed caps. + If we have a master pad with negotiated caps, we return those caps + with a free range of width/height/framerate + +2010-06-03 13:45:32 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + Revert "pulsesink: Add comments to remove the provide-clock message posting once we depend on base 0.10.30" + This reverts commit 8f3708f38aa3839a6a625ca7d1c166101c9fbb7f. + The baseaudiosink commit was reverted + +2010-06-03 10:27:25 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Add comments to remove the provide-clock message posting once we depend on base 0.10.30 + baseaudiosink does all this for us now. + +2010-06-02 16:36:11 +0200 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + flvdemux: delayed seek handling also deserves TRUE event response + +2010-06-02 15:30:47 +0200 Thijs Vermeir + + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer: fix compiler warning + unused variable ‘estimated’ + +2010-06-02 15:04:00 +0200 Alessandro Decina + + * common: + common: revert the change i did in my previous commit + +2010-06-02 13:39:10 +0200 Alessandro Decina + + * common: + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer: stop buffering and emit EOS at the end of a stream + When using RTP_JITTER_BUFFER_MODE_BUFFER, make sure that the ringbuffer doesn't + get stuck buffering forever when there isn't enough data left to fill the + buffer. + +2010-06-01 21:52:59 +0200 Benjamin Otte + + * gst/debugutils/testplugin.c: + debugutils: Don't consume preroll buffer twice + +2010-06-01 21:32:11 +0200 Benjamin Otte + + * ext/pulse/pulseutil.c: + pulse: Style fix: use g_strdup() instead of printf()ing a simple string + +2010-05-27 16:07:31 +0200 Benjamin Otte + + * gst/debugutils/tests.c: + debugutils: Replace md5 implementation with glib's + https://bugzilla.gnome.org/show_bug.cgi?id=619824 + +2010-05-22 11:55:37 +0200 Mark Nauwelaerts + + * gst/avi/gstavimux.c: + avimux: clean up code for avi header using a bytewriter + https://bugzilla.gnome.org/show_bug.cgi?id=619293 + +2010-06-01 18:54:41 -0500 Pierre-Louis Bossart + + * configure.ac: + * ext/pulse/pulsesink.c: + pulsesink: optimize communication with PulseAudio using pa_stream_begin_write + +2010-06-02 10:52:56 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Post provide-clock message on the bus if the clock appears/disappears + Fixes bug #620277. + +2010-06-01 23:49:17 -0700 David Schleef + + * common: + Automatic update of common submodule + From 17f89e5 to 47683c1 + +2010-06-01 22:54:49 -0700 David Schleef + + * common: + Automatic update of common submodule + From cdff0fb to 17f89e5 + +2010-06-01 20:45:29 +0200 Edward Hervey + + * gst/videomixer/videomixer.c: + videomixer: filter caps returned from downstream with our pad template. + +2010-06-01 16:56:32 +0100 Zaheer Abbas Merali + + * gst/matroska/matroska-mux.c: + matroskamux: Remove more unneeded warnings + +2010-06-01 16:54:03 +0100 Zaheer Abbas Merali + + * gst/matroska/ebml-write.c: + matroskamux: remove unneeded warning + +2010-06-01 16:49:14 +0100 Zaheer Abbas Merali + + * gst/matroska/ebml-write.c: + matroskamux: remove unneeded debug statement + +2010-06-01 16:24:53 +0100 Zaheer Abbas Merali + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: change is-live property to indexed + +2010-05-23 13:56:16 +0100 Zaheer Abbas Merali + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + matroska: use the uint64 scaling functions + In demuxer and muxer use the gst_util_uint64 scaling functions rather than + standard integer division. Add warnings (to be changed to debug) for debugging + the timestamp and duration. + +2010-05-21 14:35:34 +0100 Zaheer Abbas Merali + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-mux.c: + matroskamux: set delta unit on all buffers except cluster start ones + +2010-05-21 13:38:11 +0100 Zaheer Abbas Merali + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-mux.c: + matroskamux: store caps and set on buffers rather than using pad caps + +2010-05-21 13:25:24 +0100 Zaheer Abbas Merali + + * gst/matroska/matroska-mux.c: + matroskamux: make sure pads caps are set before any buffers pushed. + +2010-05-21 13:14:04 +0100 Zaheer Abbas Merali + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-mux.c: + matroskamux: add streamheaders + +2010-05-21 12:23:08 +0100 Zaheer Abbas Merali + + * gst/matroska/matroska-mux.c: + matroskamux: no need to set cache twice + +2010-05-21 01:59:53 +0200 Xavier Queralt + + * gst/matroska/matroska-mux.c: + Do not create a SeekHeader, Cues, .. when doing live + +2010-05-20 23:39:59 +0200 Xavier Queralt + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + Add is-live property + +2010-06-01 13:22:26 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix variable init + +2010-05-28 16:37:32 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-ids.h: + matroskademux: improve reverse playback + Slightly modify approach to also handle cases where cue entries do not reliably + lead to initial keyframes. + Fixes #619817. + +2010-05-24 16:02:58 +0200 Mark Nauwelaerts + + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/tomsmocomp.c: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: avoid gtk-doc confusing comments + +2010-05-21 11:21:58 +0200 Mark Nauwelaerts + + * tests/check/Makefile.am: + * tests/check/elements/matroskamux.c: + matroskamux: adjust unit test to modified behaviour + +2010-05-20 14:33:41 +0200 Mark Nauwelaerts + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-mux.c: + matroskamux: use write caching also when writing buffer data + Specifically, this reduces pushing several small buffers for each + data buffer and also avoids a seek for each buffer altogether + (though a seek is still needed for each cluster). + Fixes #619273. + +2010-05-20 14:23:07 +0200 Mark Nauwelaerts + + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-mux.c: + matroskamux: fix ebml write caching with bytewriter implementation + Also cache a bit more during header writing. + Fixes #619273. + +2010-05-20 14:08:42 +0200 Mark Nauwelaerts + + * gst/matroska/ebml-write.c: + matroskamux: use consistent debug category name for ebmlwrite + +2010-05-18 14:44:15 +0200 Mark Nauwelaerts + + * gst/matroska/ebml-read.c: + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: use bytereader based GstEbmlRead as a helper + ... rather than basing on it by inheritance. + Also use more common code for push and pull mode. + Fixes #619198. + Fixes #611117. + +2010-06-01 15:47:32 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskamux: _get_pad_template result needs no unref + +2010-05-18 19:42:58 -0300 Thiago Santos + + * ext/libpng/gstpngenc.c: + pngenc: Support 8 bit grayscale + Adds support to 8 bit grayscale input + +2010-05-18 14:46:54 -0300 Thiago Santos + + * ext/jpeg/gstjpegdec.c: + jpegdec: Adds 8bit grayscale support + Adds decoding support for jpeg images in 8 bit grayscale format. + +2010-05-18 01:57:14 -0300 Thiago Santos + + * ext/jpeg/gstjpegenc.c: + jpegenc: Accept grayscale as input + Adds video/x-raw-grayscale (8 bit) support to jpegenc + +2010-05-31 13:30:05 +0200 Edward Hervey + + * gst/videomixer/videomixer.c: + videomixer: Implement sinkpad GetCapsFunction. + This allows returning only the formats, width, height, framerate + and pixel-aspect-ratio that downstream can support. + https://bugzilla.gnome.org/show_bug.cgi?id=620148 + +2010-05-31 07:49:21 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Don't compare running times with stream times when doing QoS + +2010-05-27 21:06:43 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Don't reconfigure the caps when changing properties + Fixes bug #619848. + +2010-05-26 13:13:44 +0200 Sebastian Dröge + + * gst/alpha/gstalpha.c: + * gst/alpha/gstalpha.h: + alpha: Add property to allow passthrough mode + This passthrough mode is used if the alpha method is "set" + and the alpha value is 1.0. + Fixes bug #617512. + +2010-05-25 15:16:06 +1000 Alexander Kojevnikov + + * gst/spectrum/gstspectrum.c: + spectrum: support 24-bit width + Fixes #619045 + +2010-05-24 21:50:58 +1000 Alexander Kojevnikov + + * gst/spectrum/gstspectrum.c: + spectrum: support arbitrary bit depth + Partially fixes #619045 + +2010-05-25 05:36:46 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: fix deadlock introduced by video keyframe QoS + +2010-05-23 09:32:08 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.c: + * gst/matroska/matroska-ids.h: + matroskademux: skip buffers before a late keyframe (QoS) + Before, vp8dec had no option but to decode all frames even if some/all + of them would be late. With this change, performance when keyframes are + frequent is helped a great deal. On my Thinkpad X60s, decoding a 20 s + 1080p sunflower encode with keyframes every 10 frames went from taking + 42 s with 5 frames shown to 21 s with 15 frames shown (still slow + enough to count by hand). When keyframes are more sparse, you will + still be able to catch up eventually, but the results won't be as + noticable. + +2010-05-14 17:57:59 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + * gst/videomixer/videomixerpad.h: + videomixer: Don't mix input with different pixel aspect ratios + Fixes bug #618530. + +2010-05-17 19:54:22 +0200 Sebastian Dröge + + * gst/deinterlace/tvtime/greedyh.asm: + * gst/deinterlace/tvtime/greedyh.c: + deinterlace: Add MMX/3DNow implementations of greedyh for UYVY + +2010-05-17 19:16:43 +0200 Sebastian Dröge + + * gst/deinterlace/tvtime/greedyh.c: + deinterlace: Fix UYVY implementation of greedyh to be actually used + +2010-05-11 11:43:07 +0200 Sebastian Dröge + + * configure.ac: + * ext/Makefile.am: + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + * ext/gdk_pixbuf/pixbufscale.c: + gdkpixbuf: Add a gdkpixbuf3 plugin that uses gdkpixbuf3 + +2010-06-01 10:06:10 +0100 Tim-Philipp Müller + + * Makefile.am: + * common: + * win32/common/gstrtpbin-marshal.c: + * win32/common/gstrtpbin-marshal.h: + * win32/common/gstudp-enumtypes.c: + * win32/common/gstudp-marshal.c: + * win32/common/gstudp-marshal.h: + win32: add more generated marshal and enumtype files to win32-update + +2010-06-01 09:27:00 +0100 Tim-Philipp Müller + + * gst/matroska/matroska.c: + Revert "matroska: add temporary webm typefinder" + This reverts commit d148ec0ad2053abb0c38fc681a8953292985388f. + We depend on -base git now, which has a webm typefinder in the usual + place. + +2010-06-01 09:26:11 +0100 Tim-Philipp Müller + + * gst/avi/gstavimux.c: + * gst/flv/gstflvmux.c: + * gst/matroska/matroska-mux.c: + Revert "avimux, flvmux, matroskamux: don't crash if tags arrive on multiple input pads at the same time" + This reverts commit 6a9983cd20c48b96396229b3f94d0254a05ddf48. + Rely on locking done in GstTagSetter in core git. + +2010-06-01 09:23:18 +0100 Tim-Philipp Müller + + * configure.ac: + configure: require core/base git + For WebM typefinding and GstTagsetter fixes. + +2010-06-01 09:17:52 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.23 === + +2010-05-30 14:03:53 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.23 + +2010-05-30 14:02:04 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2010-05-29 10:23:48 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + flvdemux: Fix position query + +2010-05-28 15:14:07 +0100 Tim-Philipp Müller + + * gst/matroska/webm-mux.c: + docs: remove unnecessary videorate element from webmmux example pipeline + +2010-05-28 10:43:36 -0300 Thiago Santos + + * ext/jpeg/gstjpegenc.c: + jpegenc: Keep variables in sane state after _reset + When reseting, keep 'row' variables at a sane state after + freeing to avoid it being freed again on _resync realloc + when the element is reused. + Fixes #619943 + +2010-05-27 18:08:17 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix floating point to integer conversion for the alpha values + Fixes bug #619835. + +2010-05-26 08:54:33 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.22.3 pre-release + +2010-05-26 00:33:59 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + po: update translations + +2010-05-25 15:34:11 +0200 Mark Nauwelaerts + + * gst/wavparse/gstwavparse.c: + wavparse: handle truncated input data at EOS in pull mode + Fixes #617733. + +2010-05-26 11:55:13 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 357b0db to fd7ca04 + +2010-05-25 21:14:05 +0200 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Round timestamp up when scaling to mov format + Fix timestamp rounding to allow the correct index to be located. + The issue was that scaling from GStreamer time format to mov time format was + rounding down causing the timestamp of the newsegment event received after a + flushing keyframe seek to find the sample index before the one it should + causing further backward seeking to the keyframe prior until no rounding error + occurred. + Rounding up when scaling to mov format has the desired effect, and it is + not clear whether just the _round () variant would be sufficient. + Fixes bug #619105 + +2010-05-24 17:26:42 +0100 Tim-Philipp Müller + + * gst/avi/gstavimux.c: + * gst/flv/gstflvmux.c: + * gst/matroska/matroska-mux.c: + avimux, flvmux, matroskamux: don't crash if tags arrive on multiple input pads at the same time + This is a temporary fix for the release only. + Fixes #619533. + +2010-05-25 17:05:12 +0200 Wim Taymans + + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + rtptheora: remove delivery-method from caps + We can accept all delivery methods so don't advertise anything on the caps or + parse anything, we will handle whatever we receive. + Fixes #618940 + +2010-05-25 15:40:01 +0100 Tim-Philipp Müller + + * gst/matroska/matroska.c: + matroska: add temporary webm typefinder + Add webm typefinder just for the release, so webm works for + people whose distros don't patch gst-plugins-base as well. + We'll remove this again after the release. + +2010-05-23 11:17:27 +0100 Tim-Philipp Müller + + * gst/matroska/webm-mux.c: + docs: add some pipeline examples to webmmux docs + +2010-05-21 12:27:07 +0100 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-oss4.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + docs: add webmmux to docs + +2010-05-21 13:01:30 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-matroska.xml: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska.c: + * gst/matroska/webm-mux.c: + matroska: fix up plugin and element descriptions a bit + +2010-05-21 12:47:03 +0100 Tim-Philipp Müller + + * gst/matroska/Makefile.am: + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + * gst/matroska/matroska.c: + * gst/matroska/webm-mux.c: + * gst/matroska/webm-mux.h: + matroska: move webmmux into own source files + Makes things easier for gtk-doc. + +2010-05-21 12:26:05 +0500 Christian Schaller + + * gst-plugins-good.spec.in: + Update spec file with latest changes + +2010-05-20 20:01:58 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: + matroska: Remove the doctype enum, it's not needed anymore + +2010-05-20 19:57:14 +0200 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + webmmux: Add new webmmux element that only supports muxing of WebM + ...and remove the doctype property from matroskamux again. + +2010-05-20 17:31:59 +0200 Mark Nauwelaerts + + * tests/check/elements/matroskamux.c: + matroskamux: unit test checks version 1 files + +2010-05-18 15:27:06 -0400 Tristan Matthews + + * ext/speex/gstspeexenc.c: + speex: fix latency query + Speex should report 30 ms latency for narrowband mode, 34 otherwise. + Fixes #619018 + +2010-05-18 21:04:32 +0800 Philip + + * gst/matroska/ebml-read.c: + ebmlread: rm floatcast.h include (not used) + +2010-05-17 05:36:00 +0200 Philip Jägenstedt + + * gst/matroska/matroska-mux.c: + matroskamux: bump default doctype version to 2 + In this day and age this should be safe. There's otherwise a risk people + will be creating unneccessarily big WebM files as they can't use + SimpleBlock in v1. + +2010-05-17 05:27:44 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + matroska: handle matroska and webm doctype versions equally + The original plan was to let WebM v1 be the same as Matroska v2 (with + extra constraints), but for simplicity it was decided to handle the + versions equally, such that e.g. SimpleBlock is only allowed in WebM v2. + +2010-05-13 12:10:54 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: Verify lace size in _parse_blockgroup_or_simpleblock + Failure to do this for corrupt input can cause a subbuffer bigger + than the actual buffer to be created, quickly leading to segfault. + Test case: + bug_s222005751_r0.001____memcpy.webm + +2010-05-13 10:23:10 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + ebml: crude hack to avoid crashing on unexpected metadata + The comment says this cannot happen, but it did and I don't know + why. This is not the correct fix, needs investigation. Test case: + bug_s555010094_r0.0005:0.008____IA__g_assertion_message_expr.webm + +2010-05-13 09:18:56 +0200 Philip Jägenstedt + + * gst/matroska/ebml-read.c: + ebml: don't modify out str if returning an error in _read_ascii + This is a regression from ASCII validation changes. Test case: + bug_s66876390_r0.001____malloc_printerr.webm + +2010-05-12 13:16:28 +0200 Philip Jägenstedt + + * gst/matroska/ebml-read.c: + ebml: Validate 7-bit ASCII in gst_ebml_read_ascii + This was triggering an UTF-8 assertion in gst_caps_set_simple for + corrupt files with garbage as codec id. Test case: + gstreamer_error_trying_to_set_invalid_utf8_as_codec_id.webm + Old gst_ebml_read_ascii renamed to gst_ebml_read_string, also used by + gst_ebml_read_utf8. Unlike for UTF-8, failure to validate is an error, + as gst_ebml_read_ascii is used for reading doctype and codec id and we + might just as well give up early in those cases. + +2010-05-12 14:30:18 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: Ignore unexpected CodecState + Because GstMatroskaTrackContext *stream is set up in the first + SimpleBlock or Block, a rogue CodecState otherwise causes a segfault on + derefencing the NULL pointer. Test case: + bug_s5506167_r0.001____gst_matroska_demux_parse_blockgroup_or_simpleblock.webm + +2010-05-10 06:00:49 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: Add video/webm sink caps + +2010-05-09 19:46:51 +0200 Philip Jägenstedt + + * gst/matroska/matroska-mux.c: + matroskamux: Use SimpleBlock for WebM when possible + +2010-05-09 19:28:59 +0200 Philip Jägenstedt + + * gst/matroska/matroska-demux.c: + matroskademux: Support "webm" DocType + +2010-05-09 12:35:10 +0200 Philip Jägenstedt + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: rename matroska_version to doctype_version + +2010-05-09 12:09:57 +0200 Philip Jägenstedt + + * gst/matroska/matroska-ids.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: Support "webm" DocType + +2010-05-12 18:38:48 -0700 David Schleef + + * gst/qtdemux/qtdemux.c: + qtdemux: Add VP8 + +2010-04-27 15:26:13 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: + matroskamux: Add support for On2 VP8 + ...matroskademux automatically supports it through libgstriff. + +2010-04-27 15:25:32 +0200 Sebastian Dröge + + * gst/avi/gstavimux.c: + avimux: Add support for On2 VP8 + ...avidemux automatically supports it through libgstriff. + +2010-05-17 17:17:01 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + pulse: Don't lock the mainloop in NULL + +2010-05-15 21:15:52 +0200 Sebastian Dröge + + * configure.ac: + configure: Use = instead of == in shell scripts for equality checks + +2010-05-14 18:33:32 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.22.2 pre-release + +2010-05-14 18:24:14 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 4d67bd6 to 357b0db + +2010-05-14 18:16:45 +0100 Tim-Philipp Müller + + * tests/check/elements/souphttpsrc.c: + tests: fix leak in souphttpsrc unit test + Unref server objects when done. Fixes check-valgrind. + +2010-05-14 17:30:40 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegenc.c: + jpegenc: fix two leaks + Don't leak othercaps or jpegenc ref. + +2010-05-13 13:01:26 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: fix docs + Documentation error spotted by tony + Fixes #618419 + +2010-05-11 13:18:42 -0400 Olivier Crête + + * gst/rtp/gstrtptheoradepay.c: + rtptheoradepay: make delivery-method parameter optional + It probably will not be in the final RFC as it is not in RFC 5215 for Vorbis. + If there is a configuration specified, assume it is in-line and if nothing is + specified, assume it is in-band. + https://bugzilla.gnome.org/show_bug.cgi?id=618386 + +2010-05-13 12:16:59 +0200 Wim Taymans + + * ext/jpeg/gstjpegdec.c: + jpegdec: increase acceptable output sizes + We can perfectly decode 1x1 images so lower the min width and height to 1. + Fixes #618392 + +2010-05-13 11:30:27 +0200 Wim Taymans + + * gst/rtp/gstrtpceltpay.c: + celtpay: fix queue duration calculations + Don't blindly add the durations of incomming buffers to the total queued + duration because it might be invalid. Mark the total queued duration invalid + when we receive an invalid incomming timestamp because that's when we lose track + of the total queued duration. + Fixes #618324 + +2010-05-10 11:14:39 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264pay.c: + rtph264pay: extract SPS and PPS from property provided parameter set + ... so it can also be regularly inserted into the stream if so configured. + Fixes #617164. + +2010-05-11 22:28:08 +0200 Alessandro Decina + + * sys/osxvideo/osxvideosink.m: + osxvideosink: allow switching views at runtime. + +2010-05-11 20:26:37 +0100 Tim-Philipp Müller + + * gst/rtp/Makefile.am: + rtp: dist missing header file to fix make distcheck + +2010-05-11 19:05:08 +0100 Tim-Philipp Müller + + * sys/oss4/oss4-sink.c: + oss4: minor cleanup + Remove fixed FIXME, change finalise to finalize for consistency. + +2010-05-11 19:01:51 +0100 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-oss4.xml: + docs: add oss4 elements to docs + +2010-05-11 16:09:10 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/ky.po: + * po/lt.po: + * po/lv.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: + * po/zh_HK.po: + * po/zh_TW.po: + po: move oss4 strings from -bad to -good + +2010-05-11 16:08:21 +0100 Tim-Philipp Müller + + * configure.ac: + * gst-plugins-good.spec.in: + * po/POTFILES.in: + * sys/Makefile.am: + * tests/icles/.gitignore: + * tests/icles/Makefile.am: + Move oss4 plugin from -bad to -good + Hook up build infrastructure, docs and tests. + Fixes #614305. + +2010-04-29 13:18:58 +0100 Brian Cameron + + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-sink.h: + oss4sink: implement GstStreamVolume interface and add mute and volume properties + OSS4 supports per-stream volume control, so expose this using the right + API, so that playbin2 and applications like totem can make use of it + (instead of using a volume element for volume control). + Fixes #614305. + +2010-04-08 10:45:33 +0100 Tim-Philipp Müller + + * sys/oss4/oss4-audio.c: + oss4: 8-bit PCM audio caps don't need an endianness field + +2010-04-08 10:40:02 +0100 Tim-Philipp Müller + + * sys/oss4/oss4-audio.c: + oss4: don't iterate the formats table twice for each entry + When iterating the formats table, we can just pass the whole + entry to our helper function, which avoids iterating the table + again to find the entry structure from the passed format id. + +2010-03-30 11:43:04 +0100 Tim-Philipp Müller + + * sys/oss4/oss4-audio.c: + oss4: also accept formats not natively supported + Also accept formats that are not natively supported by the + hardware, OSS4 can convert them internally. List the native + formats first in the caps though, to express our preference + for the native formats. We need this in order to support the + case properly where the audio hardware supports only e.g. + little endian PCM, but the host is big endian, since many + audio elements only support native endianness and make the + reasonable assumption that any audiosink will be able to + handle audio in native endianness. + Based on patch by Jerry Tan + Fixes #614317. + +2010-03-30 01:14:58 +0100 Tim-Philipp Müller + + * sys/oss4/oss4-mixer.c: + oss4: add comment for translators + Not that that will make these strings much better. Also remove i18n + marker where it doesn't make sense. + +2010-03-22 16:13:12 +0100 Benjamin Otte + + * sys/oss4/oss4-mixer.c: + oss4: Refactor code to make it look more modern + A side effect is that it passes -Wformat-nonliteral and doesn't read + invalid memory in some cases, like when the mixer track contains + a % sign or there is a number but not a known mixer name. + +2010-03-22 14:09:24 +0100 Benjamin Otte + + * sys/oss4/oss4-mixer.c: + oss4: Avoid g_quark_to_string (g_quark_from_string ()) madness + We to the strdup inside gst_oss4_mixer_control_get_translated_name() + instead of in the only caller. + +2010-03-21 21:39:18 +0100 Benjamin Otte + + * sys/oss4/oss4-mixer.c: + Add -Wmissing-declarations -Wmissing-prototypes to configure flags + And fix all warnings + +2010-01-20 13:29:52 +0100 Benjamin Otte + + * sys/oss4/oss4-mixer.c: + Fix compiler warning about unused return value + +2009-08-21 01:17:18 +0100 Tim-Philipp Müller + + * tests/icles/test-oss4.c: + tests: fix test-oss4 to treat an empty device name the same as a NULL name + +2009-07-16 13:55:14 +0100 Jan Schmidt + + * sys/oss4/oss4-mixer.c: + oss4: Attempt to fix a compiler warning + Don't store a const gchar * in a non-const gchar * local var. + Also, make the translation string function static since it's only + used in the one file. + +2009-06-10 19:21:21 +0100 Garrett D'Amore + + * sys/oss4/oss4-audio.c: + * sys/oss4/oss4-mixer-slider.c: + * sys/oss4/oss4-mixer-switch.c: + * sys/oss4/oss4-mixer.c: + oss4: Enhancements to the mixer and audio output + Code cleanups, general improvements, support for the + new mixer flags in latest gst-plugins-base. + Fixes: #584252 + Patch By: Brian Cameron + Patch By: Garrett D'Amore + +2009-06-19 16:21:28 +0100 Tim-Philipp Müller + + * sys/oss4/oss4-mixer.c: + Make build without warnings with debugging disabled + +2008-11-04 12:42:30 +0000 Stefan Kost + + Don't install static libs for plugins. Fixes #550851 for -bad. + Original commit message from CVS: + * ext/alsaspdif/Makefile.am: + * ext/amrwb/Makefile.am: + * ext/apexsink/Makefile.am: + * ext/arts/Makefile.am: + * ext/artsd/Makefile.am: + * ext/audiofile/Makefile.am: + * ext/audioresample/Makefile.am: + * ext/bz2/Makefile.am: + * ext/cdaudio/Makefile.am: + * ext/celt/Makefile.am: + * ext/dc1394/Makefile.am: + * ext/dirac/Makefile.am: + * ext/directfb/Makefile.am: + * ext/divx/Makefile.am: + * ext/dts/Makefile.am: + * ext/faac/Makefile.am: + * ext/faad/Makefile.am: + * ext/gsm/Makefile.am: + * ext/hermes/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/jack/Makefile.am: + * ext/jp2k/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/lcs/Makefile.am: + * ext/libfame/Makefile.am: + * ext/libmms/Makefile.am: + * ext/metadata/Makefile.am: + * ext/mpeg2enc/Makefile.am: + * ext/mplex/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/mythtv/Makefile.am: + * ext/nas/Makefile.am: + * ext/neon/Makefile.am: + * ext/ofa/Makefile.am: + * ext/polyp/Makefile.am: + * ext/resindvd/Makefile.am: + * ext/sdl/Makefile.am: + * ext/shout/Makefile.am: + * ext/snapshot/Makefile.am: + * ext/sndfile/Makefile.am: + * ext/soundtouch/Makefile.am: + * ext/spc/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/tarkin/Makefile.am: + * ext/theora/Makefile.am: + * ext/timidity/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * ext/xine/Makefile.am: + * ext/xvid/Makefile.am: + * gst-libs/gst/app/Makefile.am: + * gst-libs/gst/dshow/Makefile.am: + * gst/aiffparse/Makefile.am: + * gst/app/Makefile.am: + * gst/audiobuffer/Makefile.am: + * gst/bayer/Makefile.am: + * gst/cdxaparse/Makefile.am: + * gst/chart/Makefile.am: + * gst/colorspace/Makefile.am: + * gst/dccp/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/deinterlace2/Makefile.am: + * gst/dvdspu/Makefile.am: + * gst/festival/Makefile.am: + * gst/filter/Makefile.am: + * gst/flacparse/Makefile.am: + * gst/flv/Makefile.am: + * gst/games/Makefile.am: + * gst/h264parse/Makefile.am: + * gst/librfb/Makefile.am: + * gst/mixmatrix/Makefile.am: + * gst/modplug/Makefile.am: + * gst/mpeg1sys/Makefile.am: + * gst/mpeg4videoparse/Makefile.am: + * gst/mpegdemux/Makefile.am: + * gst/mpegtsmux/Makefile.am: + * gst/mpegvideoparse/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/nuvdemux/Makefile.am: + * gst/overlay/Makefile.am: + * gst/passthrough/Makefile.am: + * gst/pcapparse/Makefile.am: + * gst/playondemand/Makefile.am: + * gst/rawparse/Makefile.am: + * gst/real/Makefile.am: + * gst/rtjpeg/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/scaletempo/Makefile.am: + * gst/sdp/Makefile.am: + * gst/selector/Makefile.am: + * gst/smooth/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/speed/Makefile.am: + * gst/speexresample/Makefile.am: + * gst/stereo/Makefile.am: + * gst/subenc/Makefile.am: + * gst/tta/Makefile.am: + * gst/vbidec/Makefile.am: + * gst/videodrop/Makefile.am: + * gst/videosignal/Makefile.am: + * gst/virtualdub/Makefile.am: + * gst/vmnc/Makefile.am: + * gst/y4m/Makefile.am: + * sys/acmenc/Makefile.am: + * sys/cdrom/Makefile.am: + * sys/dshowdecwrapper/Makefile.am: + * sys/dshowsrcwrapper/Makefile.am: + * sys/dvb/Makefile.am: + * sys/dxr3/Makefile.am: + * sys/fbdev/Makefile.am: + * sys/oss4/Makefile.am: + * sys/qcam/Makefile.am: + * sys/qtwrapper/Makefile.am: + * sys/vcd/Makefile.am: + * sys/wininet/Makefile.am: + * win32/common/config.h: + Don't install static libs for plugins. Fixes #550851 for -bad. + +2008-10-12 21:52:27 +0000 Jan Schmidt + + sys/oss4/: Add some spaces in translateable strings. + Original commit message from CVS: + * sys/oss4/oss4-mixer.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + Add some spaces in translateable strings. + Fixes: #555969 #555968 #555965 + +2008-08-07 16:20:30 +0000 Frederic Crozat + + Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#546822). + Original commit message from CVS: + Patch by: Frederic Crozat + * ext/sndfile/gstsf.c: (plugin_init): + * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_plugin_init): + * sys/oss4/oss4-audio.c: (plugin_init): + Make sure gettext returns translations in UTF-8 encoding rather + than in the current locale encoding (#546822). + +2008-06-16 07:30:34 +0000 Stefan Kost + + Final round of doc updates. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/speed/gstspeed.c: + * gst/speexresample/gstspeexresample.c: + * gst/videosignal/gstvideoanalyse.c: + * gst/videosignal/gstvideodetect.c: + * gst/videosignal/gstvideomark.c: + * sys/dvb/gstdvbsrc.c: + * sys/oss4/oss4-mixer.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + * sys/wininet/gstwininetsrc.c: + Final round of doc updates. + +2008-06-12 14:49:18 +0000 Stefan Kost + + Do not use short_description in section docs for elements. We extract them from element details and there will be war... + Original commit message from CVS: + * ext/dc1394/gstdc1394.c: + * ext/ivorbis/vorbisdec.c: + * ext/jack/gstjackaudiosink.c: + * ext/metadata/gstmetadatademux.c: + * ext/mythtv/gstmythtvsrc.c: + * ext/theora/theoradec.c: + * gst-libs/gst/app/gstappsink.c: + * gst/bayer/gstbayer2rgb.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/rawparse/gstaudioparse.c: + * gst/rawparse/gstvideoparse.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/selector/gstinputselector.c: + * gst/selector/gstoutputselector.c: + * gst/videosignal/gstvideoanalyse.c: + * gst/videosignal/gstvideodetect.c: + * gst/videosignal/gstvideomark.c: + * sys/oss4/oss4-mixer.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + Do not use short_description in section docs for elements. We extract + them from element details and there will be warnings if they differ. + Also fixing up the ChangeLog order. + +2008-06-12 13:06:37 +0000 Stefan Kost + + tests/icles/test-oss4.c: Include stdlib.h. + Original commit message from CVS: + * tests/icles/test-oss4.c: + Include stdlib.h. + +2008-05-22 16:33:25 +0000 Tim-Philipp Müller + + tests/icles/: Small oss4 test that probes for available devices and retrieves their caps and mixer tracks and all tha... + Original commit message from CVS: + * tests/icles/.cvsignore: + * tests/icles/Makefile.am: + * tests/icles/test-oss4.c: (opt_show_mixer_messages), (WAIT_TIME), + (show_mixer_messages), (probe_mixer_tracks), (probe_pad), + (probe_details), (probe_element), (main): + Small oss4 test that probes for available devices and retrieves + their caps and mixer tracks and all that. Also allows testing of + mixer change messages on the bus. + +2008-05-22 15:14:26 +0000 Tim-Philipp Müller + + sys/oss4/: Make device-name probing in NULL state work better (e.g. for the gnome-control-center sound capplet). + Original commit message from CVS: + * sys/oss4/oss4-mixer.c: (gst_oss4_mixer_open): + * sys/oss4/oss4-property-probe.c: + (gst_oss4_property_probe_find_device_name), + (gst_oss4_property_probe_find_device_name_nofd): + * sys/oss4/oss4-property-probe.h: + * sys/oss4/oss4-sink.c: (gst_oss4_sink_get_property): + * sys/oss4/oss4-source.c: (gst_oss4_source_get_property): + Make device-name probing in NULL state work better (e.g. for the + gnome-control-center sound capplet). + +2008-05-08 19:16:17 +0000 Clive Wright + + sys/oss4/oss4-mixer-slider.c: Apparently mono sliders have the mono value repeated in the upper bits, so mask those o... + Original commit message from CVS: + Based on patch by: Clive Wright + * sys/oss4/oss4-mixer-slider.c: (gst_oss4_mixer_slider_unpack_volume): + Apparently mono sliders have the mono value repeated in the upper bits, + so mask those out when reading them. Probably makes the mixer applet + work properly in some more cases. + +2008-04-11 08:13:22 +0000 Julien Moutte + + sys/oss4/: Fix arguments format in debug statements. + Original commit message from CVS: + 2008-04-11 Julien Moutte + * sys/oss4/oss4-mixer-enum.c: + (gst_oss4_mixer_enum_get_values_locked): + * sys/oss4/oss4-source.c: (gst_oss4_source_delay): Fix arguments + format in debug statements. + +2008-04-02 20:18:58 +0000 Tim-Philipp Müller + + Add initial support for OSSv4. Mixer still needs a bit more love, but even magic has its limits. + Original commit message from CVS: + * configure.ac: + * sys/Makefile.am: + * sys/oss4/Makefile.am: + * sys/oss4/oss4-audio.c: + * sys/oss4/oss4-audio.h: + * sys/oss4/oss4-mixer-enum.c: + * sys/oss4/oss4-mixer-enum.h: + * sys/oss4/oss4-mixer-slider.c: + * sys/oss4/oss4-mixer-slider.h: + * sys/oss4/oss4-mixer-switch.c: + * sys/oss4/oss4-mixer-switch.h: + * sys/oss4/oss4-mixer.c: + * sys/oss4/oss4-mixer.h: + * sys/oss4/oss4-property-probe.c: + * sys/oss4/oss4-property-probe.h: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-sink.h: + * sys/oss4/oss4-soundcard.h: + * sys/oss4/oss4-source.c: + * sys/oss4/oss4-source.h: + Add initial support for OSSv4. Mixer still needs a bit more love, + but even magic has its limits. + +2010-05-11 10:52:58 +0200 Alessandro Decina + + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + osxvideosink: implement the xoverlay interface. Fixes #618349. + +2010-05-11 18:42:32 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix push based seeking + ... where it comes down to transforming incoming BYTE segment + to a corresponding TIME segment. + Also fixes #609405. + +2010-05-11 14:23:47 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-imagefreeze.xml: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + Move imagefreeze plugin from -bad to -good + Hook up build infrastructure, docs and unit test for new plugin. + Fixes #613786. + +2010-05-05 12:23:56 +0200 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Set fixed caps on the correct pad + This makes the sink getcaps function actually used instead of using + the fixed caps function for it. + +2010-03-21 21:39:18 +0100 Benjamin Otte + + * tests/check/elements/imagefreeze.c: + Add -Wmissing-declarations -Wmissing-prototypes to configure flags + And fix all warnings + +2010-03-15 11:54:02 +0100 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Only start the task after a seek if a buffer was received already + +2010-02-28 16:08:14 +0100 Sebastian Dröge + + * tests/check/elements/imagefreeze.c: + imagefreeze: Add some unit tests + +2010-02-28 16:04:31 +0100 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Set undefined framerate in sink getcaps function + +2010-02-28 15:02:02 +0100 Sebastian Dröge + + * gst/imagefreeze/gstimagefreeze.c: + imagefreeze: Implement reverse playback and set buffer offsets + +2010-02-27 17:33:05 +0100 Sebastian Dröge + + * gst/imagefreeze/Makefile.am: + * gst/imagefreeze/gstimagefreeze.c: + * gst/imagefreeze/gstimagefreeze.h: + imagefreeze: Add still frame stream generator element + +2010-05-11 13:07:19 +0100 Tim-Philipp Müller + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-debug.xml: + * gst/debugutils/Makefile.am: + * gst/debugutils/gstdebug.c: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + Move capsfilter element from -bad to -good + Hook up moved files to the build infrastructure and docs. + Fixes #617739. + +2010-05-06 13:12:32 +0200 Sebastian Dröge + + * gst/debugutils/gstcapssetter.c: + * gst/debugutils/gstcapssetter.h: + capssetter: Some minor cleanup + +2010-03-22 16:56:03 +0100 Benjamin Otte + + * tests/check/elements/capssetter.c: + Add -Wold-style-definition + and fix the warnings + +2010-03-18 17:30:26 +0100 Benjamin Otte + + * gst/debugutils/gstcapssetter.c: + gst_element_class_set_details => gst_element_class_set_details_simple + +2009-10-08 19:51:31 +0200 Mark Nauwelaerts + + * tests/check/elements/capssetter.c: + capssetter: add unit test + +2009-06-25 16:41:49 +0200 Mark Nauwelaerts + + * gst/debugutils/gstcapssetter.c: + * gst/debugutils/gstcapssetter.h: + capssetter: import element into -bad + +2010-05-11 12:06:10 +0200 Mark Nauwelaerts + + * gst/avi/gstavimux.c: + avimux: check that pads have been negotiated + Also set fcc_handler field in audio stream header. + Fixes #618351. + +2010-05-10 18:33:03 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix partial parsing of ctts table + Fixes #616516. + +2010-05-10 18:32:15 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: cleanup a comment and add some debug and conditional compilation + +2010-05-11 10:01:52 +0200 Sebastian Dröge + + * configure.ac: + configure: Check for GTK+ 3.0 and if it's not available for GTK+ 2.0 + +2010-05-10 22:11:10 +0200 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: only store the last buffer timestamp if it's valid + Fixes bug #618305 + +2010-01-08 22:13:59 -0500 Olivier Crête + + * gst/rtp/gstrtph264pay.c: + rtph264pay: Re-send SPS/PPS when requested + https://bugzilla.gnome.org/show_bug.cgi?id=606689 + +2010-05-07 17:09:16 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264pay.c: + rtph264pay: fix typo in debug message + +2010-05-07 15:42:23 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtptheorapay.h: + rtptheorapay: add config-interval parameter to re-insert config in stream + Add a new config-interval property to instruct the payloader to insert + configuration headers at periodic intervals in the stream + (when a keyframe is countered). + +2010-05-07 15:31:03 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtptheoradepay.c: + rtptheoradepay: fix in-band configuration parsing + Also make configuration header parsing a bit more relaxed with respect + to length field interpretation. + +2010-05-07 15:30:30 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpvorbisdepay.c: + rtpvorbisdepay: fix in-line configuration parsing + Also make configuration header parsing a bit more relaxed with respect + to length field interpretation. + +2010-05-04 16:57:35 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtptheorapay.c: + rtptheorapay: do not discard downstream flow return + +2010-05-04 16:57:11 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtptheorapay.c: + rtptheorapay: refactor buffer payloading + +2010-05-07 20:41:04 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/greedy.c: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Add support for UYVY + +2010-05-07 19:06:35 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: fix return value + +2010-05-07 19:02:21 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't leak the session + +2010-05-07 18:59:42 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtsp: configure bandwidth properties in the session + +2010-05-07 18:58:58 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: add properties to configure the bandwidth + Add properties to proxy the bandwidth configuration to the session object. + +2010-05-07 18:57:13 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + rtpsession: add properties to configure bandwidths + Add properties to configure the sender and receiver bandwidths. + Configure the bandwidths before calculating the RTCP timeout when we need to. + +2010-05-07 18:56:30 +0200 Wim Taymans + + * gst/rtpmanager/rtpstats.c: + rtpstats: add some debug info + +2010-05-07 18:55:34 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: small cleanups + +2010-05-07 16:55:13 +0200 Wim Taymans + + * gst/rtpmanager/rtpstats.c: + * gst/rtpmanager/rtpstats.h: + rtpstats: make bandwidths more configurable + Add a method to configure the various bandwidths in the session. + +2010-05-07 13:32:30 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: handle NONE RTCP intervals + Prepare for handling RTCP reporting intervals of GST_CLOCK_TIME_NONE, which + means don't send RTCP at all. + +2010-05-07 12:51:05 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: fall back to SDP ports instead of server_port + In multicast, fall back to the ports in the SDP instead of the server_port + attribute as this is more in line with the RFC. + +2010-05-07 12:24:51 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: refactor collecting the transport info + Make a method to collect the ports and destination address. + +2010-05-07 11:28:36 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: handle servers that send broken Transports + Handle servers that send their port pairs with the wrong name. + Fixes #617537 + +2010-05-06 16:52:26 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: use the SDP connection info in multicast + Parse the connection info from the SDP. + When we need to configure the multicast destination, fall back to the SDP + connection info when the transport did not specify a destination and ttl. + Fixes #617537 + +2010-05-06 15:42:38 +0300 Stefan Kost + + * gst/goom/gstgoom.c: + * gst/goom2k1/gstgoom.c: + * gst/monoscope/gstmonoscope.c: + goom,monoscope: truncate own caps, instead of copying and using the first only + We got the caps from an intersect, it is our own, hence we can truncate it. + +2010-05-06 15:40:33 +0300 Stefan Kost + + * ext/pulse/pulsesrc.c: + pulsesrc: reflow to truncate caps just once + We get writable cpas from the intersection (unless it failed). As we truncate + those anyway, we don't need to manyaly copy the first structure. + +2010-05-06 15:39:31 +0300 Stefan Kost + + * ext/gdk_pixbuf/gstgdkpixbuf.c: + gdkpixbuf: don't leak template caps + +2010-05-06 15:38:35 +0300 Stefan Kost + + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautovideosink.c: + * gst/autodetect/gstautovideosrc.c: + auto{audio,video}{src,sink}: use can_intersect to avoid a caps copy + +2010-04-27 13:36:35 +0300 Stefan Kost + + * gst/flv/gstflvdemux.c: + flvdemux: tell what we can do + Any-caps are bad. If apps scan the registry, they'd like to know what we can + output. + +2010-04-27 13:43:29 +0300 Stefan Kost + + * ext/jpeg/gstjpegenc.c: + jpegenc: also lift the arbitrary restrictions for width and height + This was already done for jpegdec. + +2010-05-06 14:03:11 +0200 Sebastian Dröge + + * ext/pulse/pulsesrc.c: + pulsesrc: Allocate/free PA mainloop during state changes + ...also destroy the stream and context during state changes. + +2010-05-06 13:57:01 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Allocate and free the custom clock in NULL<->READY + +2010-05-06 13:51:59 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Create and free the PA mainloop in NULL->READY/READY->NULL + This fixes a race condition, when stopping the mainloop during finalization + is done from a mainloop callback. + Fixes bugs #614765 and #590662. + +2010-05-05 19:35:48 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Make selection of a sinkpad number threadsafe + +2010-05-05 17:39:32 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/greedy.c: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Add support for all common RGB formats + +2010-05-05 16:06:51 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/greedy.c: + * gst/deinterlace/tvtime/greedyh.asm: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Add support for AYUV + +2010-05-04 16:34:27 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: make setup url in a smarter way + Make sure we always separate the base and control url parts with a / when + creating the setup url. + +2010-05-04 16:04:39 +0200 Alessandro Decina + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: handle SEEKING queries. + +2010-05-04 11:13:45 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmp4vpay.h: + rtpmp4vpay: add config-interval parameter to re-insert config in stream + Add a new config-interval property to instruct the payloader to insert + config (VOSH, VOS, etc) at periodic intervals in the stream + (when a GOP or VOP-I is encountered). + Based on patch by + Fixes #607452. + +2010-05-03 13:26:32 +0200 Alessandro Decina + + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer: move some initialization code from change_state to _init. + Set ->active to TRUE in _init so it can be set to FALSE after creating the + jitterbuffer and it won't be mistakenly reset to TRUE in the change_state + function. + This is needed to start the jitterbuffer as inactive when rtpbin is buffering. + +2010-05-03 11:56:58 +0200 Alessandro Decina + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: fix a bug handling BUFFERING messages. + If a session exists but has no streams, set the min buffering percent to 0 + since it means that we haven't received anything for that session yet. + +2010-05-03 11:51:37 +0200 Alessandro Decina + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: when a stream is created, pause the jitterbuffer if rtpbin is buffering. + +2010-05-03 11:23:59 +0200 Alessandro Decina + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: fix a bug calculating stream offsets. + +2010-05-01 14:20:59 +0200 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: Write previous cluster's size + This is useful for backwards playback, which should be implemented + in matroskademux at some point. + +2010-05-01 14:15:49 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Set interlaced flag in the caps if the flag is set in the Matroska file + +2010-05-01 14:12:28 +0200 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + matroskamux: Write interlaced flag if the input video content is interlaced + Unfortunately Matroska has no way to specify TFF and friends... + +2010-05-01 11:25:26 +0100 Tim-Philipp Müller + + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtpvorbisdepay.c: + rtp: fix printf format of some debug messages + +2010-05-01 11:06:53 +0100 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroska: init variable to avoid compiler warning on OSX + Fixes (bogus) "'offset' may be used uninitialized in this function" + warning on build bot (also spotted by philn). + +2010-04-30 17:19:44 -0700 David Schleef + + * gst/qtdemux/qtdemux.c: + qtdemux: UYVY is 4:2:2, not 4:2:0 + +2010-04-30 22:22:25 +0200 Sebastian Dröge + + * ext/pulse/pulseutil.c: + pulse: Don't compare values of two different enum types + +2010-04-30 22:13:30 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Make automatic detection of interlacing the default + Previously "force deinterlacing" was the default, which is a not very + sensible default for the normal use case where deinterlace should act + in passthrough mode unless interlaced content is present. + +2010-04-29 16:26:49 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: optimise buffer scanning + Specifically, when needing more data, do not rescan from start next time + around, but resume from last position. + See also #583047. + +2010-04-29 15:38:49 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: disregard superfluous lines when indirect decoding + +2010-04-27 15:44:39 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: add support for RGB and grayscale color space + Also refactor src caps negotiation and setting. + +2010-04-27 12:19:22 +0200 Mark Nauwelaerts + + * ext/jpeg/Makefile.am: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstjpegenc.h: + jpegenc: support more colour spaces and some cleanups + +2010-04-30 12:47:01 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegenc.c: + jpegenc: more generic sink getcaps + +2010-04-30 12:42:42 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: more sanity checks on input + Specifically, verify input components / colour space is as code + subsequently expects, thereby avoiding crashes or otherwise bogus output. + Presently, that means 3 components YCbCr colour space, and somewhat + limited sampling factors. + Fixes #600553. + +2010-04-22 12:28:22 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtptheoradepay.c: + rtptheoradepay: also accept in-band configuration + Fixes #574416 (theora). + +2010-04-22 12:27:35 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpvorbisdepay.c: + rtpvorbisdepay: also accept in-line configuration + Fixes #574416 (vorbis). + +2010-04-07 17:21:55 -0400 Olivier Crête + + * gst/rtp/gstrtptheoradepay.c: + rtptheoradepay: Ignore packets without a known codebook + Don't produce an error if a packet is received without a valid codebook, + it's possible that the codebook will just be coming later. + See #574416. + +2010-04-20 12:17:26 +0200 Mark Nauwelaerts + + * tests/check/elements/y4menc.c: + y4menc: adjust unit test to element behaviour + +2010-02-23 22:16:39 -0500 Benjamin M. Schwartz + + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + y4menc: add 4:2:2, 4:1:1, and 4:4:4 output support + Fixes #610902. + +2010-04-15 12:21:56 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264depay.h: + rtph264depay: DELTA_UNIT marking of output buffers + ... which evidently makes (most) sense if output buffers are + actually frames. + Partially based on a patch by + Miguel Angel Cabrera + Fixes #609658. + +2010-04-16 17:21:50 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph263depay.c: + * gst/rtp/gstrtph263depay.h: + rtph263depay: extra keyframe info from PTYPE header + ... as opposed to taking it from h263 payload header, which need not + be so reliable. + Fixes #610172. + +2010-04-16 17:08:47 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph263depay.c: + rtph263depay: also use Picture Start Code to detect packet loss + This ensures a whole frame is dropped if a (start) packet is lost, + rather than relying only on the DISCONT flag. + +2010-04-16 17:06:11 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph263depay.c: + rtph263depay: detect frame start using Picture Start Code + So we stop dropping fragments as soon as there is a picture start (code). + In particular, this prevents dropping the first frame following + initial DISCONT. + +2010-04-16 16:34:06 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph263depay.c: + rtph263depay: handle a few FIXMEs + +2010-04-16 16:27:25 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph263depay.c: + rtph263depay: slightly refactor payload dropping + +2010-04-16 11:53:17 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pay.h: + rtph263pay: use found GOBs to apply Mode A payloading + ... rather than falling back to sending the whole frame in one packet + if number of GOB startcodes < maximum. + One might take this further and still perform Mode B/C payloading, + but at least this should cater for decent fragments in typical cases. + Fixes #599585. + +2010-04-14 11:53:46 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: implement push mode seeking + +2010-04-29 20:08:43 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videofilter.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * gst/smpte/gstsmptealpha.c: + docs: update for videofilter plugin merge and add gtk-doc blurb for new property + +2010-04-26 18:12:46 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Improve segment handling a bit + +2010-04-26 18:05:00 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Order caps by amount of contained information + +2010-04-26 17:25:38 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Properly set interlaced field in getcaps + +2010-04-24 16:28:12 +0200 Sebastian Dröge + + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Add planar YUV support to all other simple methods + +2010-04-24 16:10:06 +0200 Sebastian Dröge + + * gst/deinterlace/tvtime/greedyh.asm: + * gst/deinterlace/tvtime/greedyh.c: + deinterlace: Add planar YUV support to greedyh method + +2010-04-24 15:42:07 +0200 Sebastian Dröge + + * gst/deinterlace/tvtime/greedy.c: + deinterlace: Add support for planar YUV formats in greedyl method + +2010-04-24 13:58:03 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/vfir.c: + deinterlace: Add support for Y444, Y42B, I420, YV12 and Y41B + The vfir method supports them and will be used until something else + supports it. + +2010-04-24 09:16:22 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlacemethod.c: + deinterlace: Define deinterlace method base classes as abstract types + +2010-04-23 17:40:10 +0200 Sebastian Dröge + + * gst/deinterlace/Makefile.am: + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + * gst/deinterlace/gstdeinterlacemethod.c: + * gst/deinterlace/gstdeinterlacemethod.h: + * gst/deinterlace/tvtime/greedy.c: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/tomsmocomp.c: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Move deinterlacing methods to their own file + +2010-04-23 17:25:12 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Simplify passthrough mode detection + +2010-04-23 14:35:44 +0200 Sebastian Dröge + + * tests/check/elements/deinterlace.c: + deinterlace: Fix unit test that checks caps handling + deinterlace now always adds the interlaced field to the output caps, + if it wasn't present in the input caps the output caps will still + contain interlaced=false. + +2010-04-21 17:00:05 +0200 Sebastian Dröge + + * gst/deinterlace/Makefile.am: + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + * gst/deinterlace/tvtime/greedy.c: + * gst/deinterlace/tvtime/greedyh.asm: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/tomsmocomp.c: + * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Refactor deinterlacing as preparation for supporting more color formats + +2010-04-22 19:05:37 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Add support for Y444, Y42B and Y41B + +2010-04-22 15:54:21 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Add support for YVYU and reorder template caps + +2010-04-18 21:11:21 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Translate navigation events to make sense again upstream + +2010-04-18 20:58:14 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Properly handle ranges/lists of width or height when transforming caps + Code partly taken from the videocrop element. + +2010-04-22 15:45:15 +0200 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Fix planar YUV->RGB processing + +2010-04-22 15:42:03 +0200 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Correctly clamp after YUV->RGB conversion + +2010-04-22 15:20:24 +0200 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Add support for YUY2, YVYU and UYVY + +2010-04-18 15:02:42 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Sync properties to the controller in before_transform + +2010-04-16 17:00:02 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Add support for YUY2 and UYUV + +2010-04-21 17:41:43 +0200 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Refactor processing and add support for other planar YUV formats + This reduces the generated code size by a factor of 2.5. + +2010-04-21 17:15:33 +0200 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Add support for YV12 input + +2010-04-22 13:56:58 +0200 Sebastian Dröge + + * gst/videomixer/blend.c: + * gst/videomixer/blend.h: + * gst/videomixer/videomixer.c: + videomixer: Add support for YUY2, YVYU, UYVY + +2010-04-20 12:18:18 +0200 Sebastian Dröge + + * gst/videomixer/blend.c: + * gst/videomixer/blend.h: + * gst/videomixer/videomixer.c: + videomixer: Add support for Y444, Y42B, Y41B and YV12 + +2010-04-21 17:07:10 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + videofilter: Order color formats by their contained amount of information + +2010-04-20 18:22:16 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + videoflip: Drop Y41B/Y42B support + Rotating 90°/270° with subsampled YUV where horizontal + and vertical subsampling are different doesn't really work. + +2010-04-19 14:37:54 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + videoflip: Also flip the pixel-aspect-ratio if width/height are exchanged + +2010-04-18 23:08:14 +0200 Sebastian Dröge + + * tests/check/Makefile.am: + * tests/check/elements/videofilter.c: + videofilter: Extend the unit test to test different color formats + +2010-04-18 22:55:36 +0200 Sebastian Dröge + + * tests/check/elements/videofilter.c: + videofilter: Add some more tests + These check different property combinations + +2010-04-18 22:54:23 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + videoflip: Change the default method to identity + +2010-04-18 22:50:20 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideobalance.h: + videobalance: Reduce number of allocations per instance + +2010-04-18 22:45:58 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + videofilter: Update last-reviewed comments + +2010-04-18 22:40:55 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + videobalance: Add support for all RGB formats + +2010-04-18 22:28:17 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + videobalance: Add support for YUY2, UYVY, AYUV and YVYU + +2010-04-18 22:23:03 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + videobalance: Add debug category + +2010-04-18 22:19:55 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + videobalance: Make property access threadsafe + +2010-04-18 22:18:24 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + videobalance: Add support for Y41B, Y42B and Y444 + +2010-04-18 22:17:02 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideobalance.h: + videobalance: Use libgstvideo for format specific things + +2010-04-18 22:09:06 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + videobalance: Make properties controllable + +2010-04-18 22:06:44 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + videobalance: Emit "value-changed" signal of color balance interface when values change + +2010-04-18 21:58:13 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideobalance.h: + videobalance: Some random cleanup + +2010-04-18 21:37:23 +0200 Sebastian Dröge + + * gst/videofilter/gstvideobalance.c: + videobalance: Stop using liboil + The used liboil function is deprecated and has no optimized + implementation anyway. + +2010-04-18 21:14:11 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + videoflip: Make property access threadsafe + +2010-04-18 15:00:36 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + gamma: Sync properties to the controller in before_transform + +2010-04-18 14:46:09 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + videoflip: Add support for all RGB formats and AYUV + +2010-04-18 14:31:36 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + videoflip: Add support for Y41B, Y42B and Y444 + +2010-04-18 14:29:30 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideoflip.h: + videoflip: Make processing more general and use libgstvideo for all format specific things + +2010-04-18 13:12:40 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + videoflip: Make method property controllable and improve debug output + +2010-04-18 13:03:48 +0200 Sebastian Dröge + + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideoflip.h: + videoflip: Some random cleanup + +2010-04-18 10:17:52 +0200 Sebastian Dröge + + * Makefile.am: + * gst/videofilter/Makefile.am: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/plugin.c: + videofilter: Move all elements into a single plugin + Having all these small elements in a separate plugin + is not very memory effective... + +2010-04-18 10:07:24 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstgamma.h: + gamma: Improve docs a bit + +2010-04-18 09:59:43 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + gamma: Add support for all RGB formats + +2010-04-18 09:46:15 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + gamma: Add support for many packed YUV formats + That is YUY2, UYVY, AYUV and YVYU. + +2010-04-18 09:38:36 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + gamma: Add support for all other planar YUV formats + That is Y41B, Y42B, Y444, NV12 and NV21. + +2010-04-18 09:33:49 +0200 Sebastian Dröge + + * gst/videofilter/Makefile.am: + * gst/videofilter/gstgamma.c: + gamma: Stop using liboil + The used liboil function is deprecated, only has a reference implementation + and is more complex than what's needed here. + +2010-04-17 18:13:46 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstgamma.h: + gamma: Use libgstvideo for format specific values and make gamma processing more generic + Allows us to easily add support for new color formats later. + +2010-04-17 18:01:06 +0200 Sebastian Dröge + + * gst/videofilter/Makefile.am: + * gst/videofilter/gstgamma.c: + gamma: Make gamma property controllable + ...and properly use liboil. + +2010-04-17 17:55:22 +0200 Sebastian Dröge + + * gst/videofilter/gstgamma.c: + gamma: Some random cleanup + +2010-04-19 14:45:33 +0200 Sebastian Dröge + + * gst/smpte/gstsmptealpha.c: + smptealpha: Sync properties to the controller in before_transform + +2010-04-17 17:47:05 +0200 Sebastian Dröge + + * gst/smpte/gstsmptealpha.c: + smptealpha: Add support for YV12 (converted to AYUV) + +2010-04-17 17:43:51 +0200 Sebastian Dröge + + * gst/smpte/gstsmptealpha.c: + smptealpha: Add support for all 4 ARGB formats + ...without format conversion. + +2010-04-16 17:27:02 +0200 Sebastian Dröge + + * gst/smpte/gstsmptealpha.c: + * gst/smpte/gstsmptealpha.h: + smptealpha: Make color format support more generic + This allows easier addition of new formats later. + +2010-04-16 17:18:15 +0200 Sebastian Dröge + + * gst/smpte/gstsmptealpha.c: + * gst/smpte/gstsmptealpha.h: + smptealpha: Some random cleanup + +2010-04-15 22:28:58 +0200 Sebastian Dröge + + * gst/smpte/gstmask.c: + * gst/smpte/gstmask.h: + * gst/smpte/gstsmpte.c: + * gst/smpte/gstsmpte.h: + * gst/smpte/gstsmptealpha.c: + * gst/smpte/gstsmptealpha.h: + smpte: Add property for inverting the transition mask + This converts a left-to-right transition to right-to-left or + clock-wise to counter-clock-wise. + +2010-04-15 22:27:57 +0200 Sebastian Dröge + + * gst/smpte/gstsmptealpha.c: + smptealpha: Correctly detect property changes and update properties + +2010-04-16 19:35:12 +0200 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpqcelpdepay.c: + * gst/rtp/gstrtpqcelpdepay.h: + qcelpdepay: add first version of a QCELP depayloader + +2010-04-29 15:18:07 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + Back to development. + +=== release 0.10.22 === + +2010-04-28 02:58:02 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.22 + +2010-04-28 02:57:21 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2010-04-25 23:36:29 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.21.3 pre-release + +2010-04-25 21:19:33 +0100 Tim-Philipp Müller + + * gst/flv/gstflvmux.c: + flvmux: hide is-live property for release + At the very least it needs a better/less wrong name. + See #613066. + +2010-04-25 15:12:20 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: don't crash if jpeg image contains more than three components + Our code currently only handles a maximum of 3 components, so error + out for now if the image has more components than that. + Fixes #604106. + +2010-04-20 17:21:29 +0100 Tim-Philipp Müller + + * gst-plugins-good.doap: + doap: update repository info from cvs->git and maintainers + +2010-04-23 14:40:20 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From fc85867 to 4d67bd6 + +2010-04-22 13:30:55 +0200 Sebastian Dröge + + * gst/videomixer/blend.c: + videomixer: Fix byte order for MMX ARGB/AYUV color filling + Fixes bug #616409. + +2010-04-21 17:53:49 +0200 Sebastian Dröge + + * gst/videomixer/blend.c: + videomixer: Fix AYUV checker/color filling + +2010-04-19 16:43:28 +0200 Sebastian Dröge + + * gst/videomixer/blend_mmx.h: + videomixer: Add i387 floating point registers to the clobbered registers list + They are the same as the mm0-mm7 MMX registers and will be overwritten + by the assembly code if gcc doesn't know about the MMX registers. + Note: They're all added to the list of clobbered registers in all cases + and not only when __MMX__ is not defined just to make sure that no other + bugs happen with this code just because some compiler version gets things + wrong. + Fixes bug #614466. + +2010-04-19 14:09:34 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Use libgstvideo to get the order of RGB + +2010-04-17 10:06:41 +0100 Brian Cameron + + * gst/goom/xmmx.c: + goom: add edx to clobber list in inline assembly code + mull modifies %edx, so should be mentioned in clobber list. + Fixes crash on Solaris (#615998). + +2010-04-15 13:39:41 +0100 Tim-Philipp Müller + + * tests/icles/Makefile.am: + tests: don't use GST_PLUGIN_LDFLAGS when building test binaries + +2010-04-16 15:27:12 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix I420->I420 copying + Fixes bug #615143. + +2010-04-13 18:15:50 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix AYUV->I420 copying + +2010-04-16 12:14:26 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + rtph264depay: profile-level-id is an optional parameter + So, if needed, extract the corresponding info from + sprop-parameter-sets. + Based on patch provided by + Fixes #612657. + +2010-04-15 07:13:46 -0300 Thiago Santos + + * configure.ac: + configure: Drop -Wcast-align + Commit message copied from core's commit from Benjamin Otte: + 246f5dba96a5b50bb74621af67b30942cca72af5 + Apparently gcc warns that GstMiniObject is not castable to + GstEvent/Message/Buffer due to them containing 64bit variables, even + though ARM hackers claim that those only need 4byte alignment. And as + long as gcc behaves that way, this warning is not very useful. + So we'll remove the warning until this problem is fixed. + Fixes #615698 + +2010-04-14 23:46:06 +0100 Tim-Philipp Müller + + * ext/flac/gstflactag.c: + flactag: fix adapter assertion when used directly after flacenc + Unlike filesrc, flacenc outputs the flac blocks neatly aligned one in + each buffer. This means that when we switch from metadata mode to + audio data passthrough mode, there's no data left in the adapter to + push out at this point, so check if there's data in the adapter + before requesting buffers from it (also needed in case we get input + buffers of 0 size). + Fixes #615793. + +2010-04-14 23:18:27 +0100 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.21.2 pre-release + +2010-04-14 20:31:30 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + po: update + +2010-04-14 20:06:09 +0100 Tim-Philipp Müller + + * tests/examples/equalizer/Makefile.am: + * tests/examples/shapewipe/Makefile.am: + * tests/examples/spectrum/Makefile.am: + * tests/examples/v4l2/Makefile.am: + * tests/icles/Makefile.am: + tests: use LDADD for libs to link to instead of LDFLAGS + Use foo_LDADD instead of foo_LDFLAGS to specify the libraries to link to. + This should make sure arguments are passed to the linker in the right + order, and makes LDFLAGS usable again. + Based on patch by Brian Cameron + Fixes #615697. + +2010-04-14 18:13:56 +0200 Edward Hervey + + * gst/videobox/gstvideobox.c: + videobox: transform_caps : We can only convert AYUV to xRGB + We were previously stating that we could convert AYUV/I420/YV12 to xRGB. + +2010-04-13 00:14:46 +0100 Tim-Philipp Müller + + * configure.ac: + configure: also remove -Waggregate-return from warning flags + It causes problems with Objective-C code like in osxvideosink. + Fixes #613663. + +2010-04-12 18:22:39 +0200 Edward Hervey + + * tests/check/Makefile.am: + check: Ignore osx audio/video src/sinks in state change tests + And make the line readable for those mere mortals that don't own a 30" screen + +2010-04-12 18:03:20 +0200 Edward Hervey + + * tests/check/elements/cmmldec.c: + * tests/check/elements/cmmlenc.c: + * tests/check/elements/level.c: + * tests/check/elements/matroskamux.c: + * tests/check/elements/rganalysis.c: + * tests/check/elements/rglimiter.c: + * tests/check/elements/rgvolume.c: + * tests/check/elements/spectrum.c: + * tests/check/elements/videofilter.c: + check: Don't re-declare 'GList *buffers' in the tests + It's an external which lives in gstcheck.c. Redeclaring it makes some + compilers/architectures think the 'buffers' in the individual tests are + a different symbol... and therefore we end up comparing holodecks with + oranges. + +2010-04-12 14:50:46 +0100 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + * gst/qtdemux/qtdemux.c: + matroskademux, qtdemux: minor code cleanup in avc_level_idc_to_string() + Do the same with slightly fewer LOC. + +2010-04-12 12:40:11 +0200 Edward Hervey + + * configure.ac: + configure: Remove -Wundef flag + Fixes #615161 + +2010-04-12 11:43:49 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix I420->AYUV copying + +2010-04-12 11:25:59 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Correctly clamp frame/background alphas to [0,255] before writing them + +2010-04-12 11:16:56 +0200 Edward Hervey + + * tests/check/elements/.gitignore: + check: Ignore jpegenc test + +2010-04-11 13:14:30 -0700 David Schleef + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Only check interlaced flag in sink caps + Fixes #615460. + +2010-04-09 11:21:47 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From ba33d1f to fc85867 + +2010-04-08 18:05:46 +0300 Stefan Kost + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/rtpmanager/gstrtpbin.c: + docs: do proper escaping for "%" + +2010-04-08 17:50:49 +0300 Stefan Kost + + * gst/rtsp/gstrtspgoogle.c: + * gst/rtsp/gstrtspgoogle.h: + rtsp: remove obsolete google extension + This was not build for a while and can be removed. + +2010-04-08 17:42:52 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: move two symbols to private section + +2010-04-08 17:36:30 +0300 Stefan Kost + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: add flxdec docs + +2010-04-08 17:17:06 +0300 Stefan Kost + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpjpegpay.c: + docs: enable the 2 of 65 rtp elements in the docs + +2010-04-08 11:54:19 +0200 Benjamin Otte + + * ext/shout2/gstshout2.c: + shout2: Don't wait if we're late + In fact, due to signedness issues, a negative delay would be changed to + an almost infinite wait causing shout2send to "lock up". + Reported by Christopher Montgomery. + +2010-04-08 16:56:37 +0300 Stefan Kost + + * gst/udp/gstmultiudpsink.c: + docs: upd -> udp and voila it shows up in the docs + +2010-04-08 16:51:27 +0300 Stefan Kost + + * gst/alpha/gstalpha.h: + docs: fix doc blob syntax + +2010-04-08 16:51:05 +0300 Stefan Kost + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: add (sparse) docs for auparse element + +2010-04-08 14:40:43 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: add videobox symbols + +2010-04-08 14:40:19 +0300 Stefan Kost + + * docs/plugins/Makefile.am: + docs: remove dynudpsink until someone documents it + +2010-04-08 14:34:59 +0300 Stefan Kost + + * gst/flv/gstflvdemux.c: + flvdemux: make debug category static + +2010-04-08 14:29:19 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + flxdemux: rename GstFLVDemux for GstFlvDemux + +2010-04-08 14:23:19 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/flv/Makefile.am: + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: + * gst/flv/gstflvparse.h: + flvdemux: merge flvparse into the demuxer and make function static + No need to hide certain function in the docs. Allows to do more cleanups. + +2010-04-08 13:13:34 +0200 Sebastian Dröge + + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalpha.h: + alpha: Add documentation + +2010-04-08 14:00:08 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: v4l2buffer pool is now a separate object, remove them from v4l2src docs + +2010-04-08 13:58:11 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: remove non existing flags and add two internal methods + If someone cares flvparse could be merged into flvdemux. + +2010-04-08 13:57:09 +0300 Stefan Kost + + * gst/rtpmanager/gstrtpsession.h: + rtpsession: remove prototype for non existing function + There is no function by that name anywhere. + +2010-04-08 12:56:50 +0200 Sebastian Dröge + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + docs: Update inspected plugin information + +2010-04-08 12:56:30 +0200 Sebastian Dröge + + * gst/alpha/gstalphacolor.c: + alphacolor: Improve docs a bit + +2010-04-08 13:47:42 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: add effecttv defines and reorder list + +2010-04-08 13:41:47 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: remove three entries that are not exported from the headers anymore + +2010-04-08 13:40:36 +0300 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: move macro to c source + One less semi public symbol without namespace prefix in the headers. + +2010-04-08 13:40:09 +0300 Stefan Kost + + * ext/speex/gstspeexenc.h: + speexenc: remove unused defines + +2010-04-08 13:23:38 +0300 Stefan Kost + + * gst/matroska/matroska-mux.c: + matroska-mux: fix last commit + Use a local define for WAVEFORMAT_EX based on the size of the struct + 2 bytes + for the extension size. + +2010-04-08 13:16:53 +0300 Stefan Kost + + * ext/speex/gstspeexdec.h: + speex: remove unused define + +2010-04-08 13:03:43 +0300 Stefan Kost + + * gst/wavenc/Makefile.am: + * gst/wavenc/gstwavenc.c: + * gst/wavenc/riff.h: + wavenc: remove internal copy of riff.h and use riff-library instead. + We don't use any function yet, just the structures and defines. + +2010-04-08 12:56:09 +0300 Stefan Kost + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: use riff lib more + Remove BITMAPINFOHEADER and use the one from riff-lib. Also remove the + WAVEFORMATEX_SIZE define and use a sizeof together with the respective struct. + Besides better code reuse this lessens the ununsed symbols in the docs. + +2010-04-08 12:14:07 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + docs: trim sections file more + Rename some defines and move some itesm to *.c files. Add more items to internal + subsection. + +2010-04-08 11:19:43 +0300 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docsw: trim the section file + +2010-04-08 10:26:25 +0300 Stefan Kost + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: add v4l2sink to docs + +2010-04-08 10:15:08 +0300 Stefan Kost + + * gst/audiofx/audioamplify.c: + * gst/multifile/gstmultifilesink.c: + docs: fix xml + The title tag belongs into the refsect2. + +2010-04-07 17:43:56 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Add support for YV12, including conversion support for I420/AYUV + +2010-04-07 17:27:12 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Add support for grayscale input/output + This doesn't do any conversion and is the next step to + replacing videocrop by supporting all remaining formats + in passthrough mode. + +2010-04-07 16:24:38 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + * gst/videobox/gstvideobox.h: + videobox: Add support for filling the background with red, yellow and white + +2010-04-07 16:11:11 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Add support for direct RGB<->AYUV conversion + +2010-04-07 16:11:01 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix RGB24 filling + +2010-04-07 16:06:54 +0300 Marco Ballesio + + * gst/rtp/gstrtph264depay.c: + h264depay: handle properly STAPs + in rtph264depay.c, lines 577-576, NALU-type 24 (Single-Time Aggregation + Packet) is handled in fall-through as NALU-type 26 (unhandled). + This leads high quality h264 streams such as: + rtsp://stream.yle.mobi/yle/areena/MEDIA_E0342657_p3.mp4 + to fail with "NAL unit type 24 not supported yet" (but it's actually + supported), and thus to close any stream which contains STAPs. + The proposed one-liner patch fixes the issue. + Fixes #615051. + +2010-04-07 13:47:02 +0200 Thijs Vermeir + + * gst-libs/gst/gst-i18n-plugin.h: + * gst/avi/gstavi.c: + build: fix compiler warnings + fix warnings for all plugins that use: setlocale (LC_ALL... + +2010-04-07 13:31:13 +0200 Thijs Vermeir + + * gst/avi/gstavi.c: + avi: fix compiler warning + +2010-03-31 17:54:21 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: restrict resyncing to subtitle tracks + This should prevent skipping audio or video in not so well interleaved + cases. + Fixes #614460. + +2010-04-06 13:21:51 +0530 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: Post avg./max. bitrate tags for H.264 + This reads the average and maximum bitrates from the 'btrt' atom if + available, and pushes these as tags, + https://bugzilla.gnome.org/show_bug.cgi?id=614927 + +2010-04-03 23:39:20 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: fix racy shutdown + Keep a ref of pulsesink for deferred mainloop invocation. Fixes #614765 + +2010-04-05 15:48:17 -0300 Thiago Santos + + * tests/check/Makefile.am: + * tests/check/elements/jpegenc.c: + tests: jpegenc: Adds some getcaps test + Adds tests for the jpegenc getcaps function, to avoid + having it returning non-subset caps + +2010-04-05 14:51:58 -0300 Thiago Santos + + * ext/jpeg/gstjpegenc.c: + jpegenc: Fix getcaps function + When creating the caps allowed to upstream using downstream + restrictions, use gst_pad_get_allowed_caps as that has the + usable formats and puts into it the width, height and framerate + fields. This avoids getting errors about getcaps returning + non subset caps of its pad template. + This error showed up on the metadata plugin unit test in -bad. + +2010-04-05 17:31:36 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix conversion from 3 byte RGB to ARGB + +2010-04-05 17:08:15 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Add support for 3 byte RGB formats and refactor RGB code a bit + +2010-04-05 15:51:13 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + * gst/videobox/gstvideobox.h: + videobox: Add support for all 32 bit RGB formats + ...including conversion between them. + +2010-04-05 15:26:03 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: add property to control the buffering method + Add a property to control how the jitterbuffer performs timestamping and + buffering. + +2010-04-04 19:02:41 -0300 André Dieb Martins + + * gst/alpha/gstalphacolor.c: + alphacolor: Removing unused variable + Fixes bug #614843. + +2010-04-04 20:31:38 -0300 André Dieb Martins + + * ext/jpeg/gstjpegenc.c: + jpegenc: should not return caps ANY based on downstream + When downstream has a sink pad with ANY caps, jpegenc should + treat it the same as NULL and return its template caps. + Fixes #614842 + +2010-04-04 22:28:33 +0300 Stefan Kost + + * sys/oss/gstosshelper.c: + oss: add fixme comment + +2010-04-04 22:26:59 +0300 Stefan Kost + + * gconf/Makefile.am: + build: use $(builddir) for installing generated files + +2010-04-04 22:07:33 +0300 Stefan Kost + + * configure.ac: + Revert "configure: fix out of source dir builds" + This reverts commit ca0bd3a8cea31f9ea0df798a83d3007e696958ba. + +2010-04-04 21:36:35 +0300 Stefan Kost + + * configure.ac: + configure: fix out of source dir builds + Remove non-existing gst-libs from include and library-paths'. + Fixes #614354 even more. + +2010-04-01 10:19:00 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: Read replaygain peak/gain tags + Make qtdemux read tags replaygain tags that are within '----' atoms. + Fixes #614471 + +2010-04-01 18:48:43 +0530 Arun Raghavan + + * gst/matroska/matroska-demux.c: + * gst/qtdemux/qtdemux.c: + matroska: Export h.264 profile and level in caps + This replicates the code in qtdemux to export the h.264 profile and + level in the stream caps. + https://bugzilla.gnome.org/show_bug.cgi?id=614651 + +2010-04-02 18:50:45 +0200 Sebastian Dröge + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix off-by-one introduced in last commit + +2010-04-01 18:38:38 +0530 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + qtdemux: Minor refactor of the code + This will make it easier to clump together common code when copying to + mastroskademux. + https://bugzilla.gnome.org/show_bug.cgi?id=614651 + +2010-04-01 18:17:09 +0530 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + qtdemux: Export h.264 level in caps + This exports the h.264 level in the stream caps (as a string) which can + be used to match a decoder, or as metadata. + https://bugzilla.gnome.org/show_bug.cgi?id=614651 + +2010-04-01 16:58:32 +0530 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + qtdemux: Export h.264 profile in caps + This adds the h.264 profile for a given stream into caps. This can + (eventually) be used to select an appropriate decoder and as metadata + for certain applications. + https://bugzilla.gnome.org/show_bug.cgi?id=614651 + +2010-03-31 14:43:14 +0200 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + flvdemux: remove obsolete reverse playback code path + +2010-03-31 14:40:50 +0200 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: + flvdemux: support (pull mode) negative seek rate + +2010-03-29 15:27:37 +0200 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + flvdemux: also check for segment stop for non-segment-seek + +2010-03-30 16:50:10 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: push correctly sized flac header buffers + Fixes #614353. + +2010-03-30 07:34:07 -0500 Rob Clark + + * configure.ac: + build: fix compiler warning when srcdir != builddir + Fixes '../../gst-libs: No such file or directory' warning/error when + the build directory is not the same as the source directory. + Fixes #614354. + +2010-03-30 01:50:32 +0100 Tim-Philipp Müller + + * gst/id3demux/id3v2frames.c: + id3demux: fix parsing of unsynced frames with data length indicator + Fixes bug #614158. + +2010-03-29 11:00:04 +0100 Tim-Philipp Müller + + * common: + * ext/Makefile.am: + * gst/Makefile.am: + * sys/Makefile.am: + * tests/examples/Makefile.am: + build: build plugins and examples in parallel where possible + +2010-03-18 18:49:24 +0000 Tim-Philipp Müller + + * sys/directsound/gstdirectsoundsink.c: + directsoundsink: fix redundant function redeclaration compiler warnings + Re-apply this again as well, as it was undone by the previous commit.. + +2010-03-18 14:31:35 +0100 Benjamin Otte + + * sys/directsound/gstdirectsoundsink.c: + gst_element_class_set_details => gst_element_class_set_details_simple + Apply this again, as it was overwritten by the previous commit. Merging + is hard, apparently. + +2010-03-26 23:20:10 +0100 Julien Moutte + + * sys/directsound/gstdirectsoundsink.c: + * sys/directsound/gstdirectsoundsink.h: + directsoundsink: Implement SPDIF support for AC3. + Detect if the sound card supports SPDIF passthru of AC3 and add + necessary code to support that like alsasink. + +2010-03-26 17:06:57 +0000 Tim-Philipp Müller + + * Makefile.am: + build: add cruft alert for common/shave* + +2010-03-26 16:50:22 +0000 Tim-Philipp Müller + + * gst/qtdemux/Makefile.am: + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_lang.c: + * gst/qtdemux/qtdemux_lang.h: + qtdemux: extract stream language in more cases + The 16-bit language code can be either a packed ISO-639-2T code + or a 'Macintosh language code'. Handle the latter type of language + codes as well, and map to the matching ISO code. Lastly, fix + language code posting for language #0, which is valid and stands + for 'English'. + Fixes #614001. + +2010-03-26 14:55:53 +0100 Sebastian Dröge + + * ext/flac/gstflacdec.c: + flacdec: Improve debugging and add some FIXMEs + +2010-03-26 14:42:06 +0100 Sebastian Dröge + + * ext/flac/gstflacdec.c: + flacdec: Sample rate markers 0x01, 0x02 and 0x03 are valid + They are for 88.2kHz, 176.4kHz and 192kHz. + +2010-03-26 14:16:39 +0100 Sebastian Dröge + + * ext/flac/gstflacdec.c: + flacdec: Take samplerate, width and number of channels from the STREAMINFO + ...and update it from the frame headers if it should change for some reason. + This allows playback of files with odd sample rates. + +2010-03-26 13:45:46 +0100 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix AYUV->I420 frame copying + +2010-03-26 13:34:17 +0100 Raimo Järvi + + * ext/jpeg/gstjpegenc.c: + jpegenc: Set correct getcaps/setcaps functions on srcpads and simplify them + This fixes downstream negotiation, upstream negotiation isn't really + supported by jpegenc yet. + Fixes bug #613789. + +2010-03-26 10:31:22 +0100 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + * gst/videobox/gstvideobox.h: + videobox: Always fill the complete frame if borders should be added + This makes sure that we don't get any gaps between rectangles because + of chroma subsampling for example. + +2010-03-18 22:12:40 +0000 Damien Lespiau + + * autogen.sh: + autogen.sh: Don't call configure with --enable-plugin-docs + configure gives a nice warning: + configure: WARNING: unrecognized options: --enable-plugin-docs + and indeed, I could not find anything in the configure.ac or the m4 + macros that would allow enabling that option. Remove it then. + +2010-03-22 16:58:26 +0100 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + * gst/videobox/gstvideobox.h: + videobox: Refactor boxing to reduce code duplication + +2010-03-22 13:13:59 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Simplify caps transformation + +2010-03-21 20:14:19 +0100 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Add const qualifier to the source frame data + +2010-03-23 17:47:48 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: only seek when in proper state + ... and data structures can be thread-safely accessed. + See #601617. + +2010-03-23 17:34:50 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-ids.h: + matroskademux: support (pull mode) negative seek rate + +2010-03-18 15:29:00 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: track clip duration in segment + +2010-03-18 13:39:05 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: prefer index of video track to perform seeking + +2010-03-24 16:19:53 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: fix typo in header validation check + +2010-03-24 18:53:20 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From 55cd514 to c1d07dd + +2010-03-23 19:46:43 +0100 Edward Hervey + + * gst/icydemux/gsticydemux.c: + * gst/icydemux/gsticydemux.h: + icydemux: Handle upstream Content-Type. + Allows us to handle ShoutCast TV (NSV) streams. + If the upstream caps have the 'content-type' field set to video/nsv, then + we shortcut the typefinding and set video/x-nsv directly. + +2010-03-23 19:30:50 +0100 Edward Hervey + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Set the Content-Type HTTP header on the caps. + First step to fixing ShoutCast (NSV) streaming. + +2010-03-23 02:38:43 -0400 Tristan Matthews + + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxvideo/Makefile.am: + osx: fix compiler warnings + Added void parameter to avoid old-style definition warning. + Added -Wno-aggregate-return flag to avoid erroneous aggregate return warning. + https://bugzilla.gnome.org/show_bug.cgi?id=613663 + +2010-03-23 00:15:15 +0000 Tim-Philipp Müller + + * tests/check/elements/videocrop.c: + tests: use loop test for long-running videocrop check + This should avoid timeouts on slow machines. + Fixes #597739. + +2010-03-22 17:26:37 +0200 Stefan Kost + + * ext/flac/gstflac.c: + * ext/pulse/plugin.c: + * ext/wavpack/gstwavpack.c: + * gst-libs/gst/gettext.h: + * gst/multifile/gstmultifilesink.h: + i18n: build fixes: #if -> #ifdef for ENABLE_NLS + +2010-03-22 17:25:09 +0200 Stefan Kost + + * gst-libs/gst/gst-i18n-plugin.h: + i18n: fix the build + Don't inlcude locale.h which we include in gettext.h if needed. Guard the + inlcude like we do in the simillar headers in core. + +2010-03-21 17:46:06 +0100 Benjamin Otte + + * configure.ac: + -Wold-style-definition is not valid for C++ + +2010-03-21 17:36:28 +0100 Benjamin Otte + + * gst/multifile/gstmultifile.c: + multifile: Include headers instead fo defining functions + +2010-03-21 17:24:14 +0100 Benjamin Otte + + * configure.ac: + Add a large set of warning flags. + None of them trigger warnings anymore, so nothing needed to be fixed. + +2010-03-21 17:23:43 +0100 Benjamin Otte + + * gst/goom/config_param.c: + * gst/goom/convolve_fx.c: + * gst/goom/filters.c: + * gst/goom/flying_stars_fx.c: + * gst/goom/goom_config_param.h: + * gst/goom/goom_core.c: + * gst/goom/goom_filters.h: + * gst/goom/goom_fx.h: + * gst/goom/ifs.c: + * gst/goom/ifs.h: + * gst/goom/plugin_info.c: + * gst/goom/tentacle3d.c: + * gst/goom/tentacle3d.h: + Make goom not use aggregate returns + +2010-03-21 15:17:46 +0100 Benjamin Otte + + * configure.ac: + * ext/annodex/gstcmmlutils.c: + * ext/wavpack/gstwavpackparse.c: + * gst/effectv/gstwarp.c: + * gst/rtp/gstrtph263pay.c: + * gst/udp/gstmultiudpsink.c: + * tests/check/elements/cmmldec.c: + * tests/check/elements/cmmlenc.c: + * tests/check/elements/deinterlace.c: + * tests/check/elements/rglimiter.c: + * tests/check/elements/rtp-payloading.c: + * tests/check/elements/udpsink.c: + * tests/check/elements/videofilter.c: + * tests/check/elements/wavpackdec.c: + * tests/check/generic/states.c: + * tests/icles/v4l2src-test.c: + Add -Wold-style-definition flag + And fix the warnings + +2010-03-20 00:54:14 +0100 Benjamin Otte + + * configure.ac: + * ext/hal/hal.c: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + * ext/soup/gstsouphttpsrc.c: + * ext/wavpack/gstwavpackcommon.c: + * gst/avi/gstavimux.c: + * gst/debugutils/gstpushfilesrc.c: + * gst/flv/gstflvparse.c: + * gst/goom/config_param.c: + * gst/goom/goom_config_param.h: + * gst/id3demux/id3tags.c: + * gst/law/alaw-decode.c: + * gst/law/alaw-encode.c: + * gst/law/mulaw-decode.c: + * gst/law/mulaw-encode.c: + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + * gst/qtdemux/qtdemux.c: + * gst/rtp/gstrtpdvpay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtsp/gstrtspsrc.c: + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/videofilter/gstvideobalance.c: + * sys/oss/gstossmixertrack.c: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: + * tests/check/elements/avimux.c: + * tests/check/elements/level.c: + * tests/check/elements/rtpbin_buffer_list.c: + * tests/check/pipelines/simple-launch-lines.c: + Add -Wwrite-strings to the configure flags + ... and fix all warnings + +2010-03-21 11:14:12 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + shapewipe: Add support for the remaining ARGB formats + And handle AYUV like ARGB, we need no YUV specific handling. + +2010-03-20 21:30:58 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Add support for RGB and xRGB input + +2010-03-20 21:13:23 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Add support for ARGB input + +2010-03-20 20:46:19 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Add support for generating ARGB output + +2010-03-20 10:47:42 +0100 Sebastian Dröge + + * gst/videomixer/blend.c: + * gst/videomixer/blend.h: + * gst/videomixer/blend_mmx.h: + * gst/videomixer/videomixer.c: + videomixer: Add support for ABGR and RGBA + Now all 4 ARGB variants are supported by videomixer. + +2010-03-20 10:24:56 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Move chroma keying parameters into stack variables to prevent multiple pointer dereferences per pixel + +2010-03-20 10:20:53 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Move color conversion matrixes into stack variables to speed up processing + +2010-03-20 10:18:04 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Use correct matrixes to convert chroma keying color to YUV + +2010-03-19 18:51:59 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Add support for different color matrixes + +2010-03-19 18:21:19 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Rename and move functions as further preparation for supporting more color formats + +2010-03-19 18:18:08 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + * gst/alpha/gstalpha.h: + alpha: Remove some unneeded calculations and instance struct fields + And document the instance struct fields a bit better + +2010-03-19 18:11:12 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + * gst/alpha/gstalpha.h: + alpha: Some preparations for supporting more color formats + +2010-03-19 17:09:06 +0100 Wim Taymans + + * gst/rtp/gstrtph264pay.c: + h264pay: fix config-interval property + Use the same units for comparing the elapsed time against the interval. + Fixes #613013 + +2010-03-19 16:44:00 +0100 Sebastian Dröge + + * gst/alpha/gstalphacolor.c: + * gst/alpha/gstalphacolor.h: + alphacolor: Implement color-matrix support and use integer arithmetic only + Alphacolor now uses the correct matrixes for SDTV and HDTV and can + convert between them. + +2010-03-19 15:03:43 +0100 Wim Taymans + + * configure.ac: + * gst/rtsp/gstrtspsrc.c: + rtsp: use GType from -base and bump required version + Use the transport flags GType from -base and bump the required version of -base + because of this. + +2010-03-19 00:05:19 +0000 Tim-Philipp Müller + + * gst/apetag/Makefile.am: + apetag: minor Makefile.am surgery + -I$(top_srcdir)/gst-libs/ is already in $(GST_CFLAGS) + +2010-03-04 22:12:35 +0100 Andoni Morales Alastruey + + * ext/raw1394/gst1394clock.c: + dv1394src: Fix internal clock + Fixes #593910. + +2010-03-18 21:14:17 +0000 Tim-Philipp Müller + + * ext/dv/Makefile.am: + * ext/esd/Makefile.am: + * ext/libcaca/Makefile.am: + * ext/pulse/Makefile.am: + * ext/shout2/Makefile.am: + * ext/speex/Makefile.am: + * ext/wavpack/Makefile.am: + * gst/auparse/Makefile.am: + * gst/avi/Makefile.am: + * gst/flx/Makefile.am: + * gst/icydemux/Makefile.am: + * gst/interleave/Makefile.am: + * gst/matroska/Makefile.am: + * gst/qtdemux/Makefile.am: + * gst/replaygain/Makefile.am: + * gst/rtp/Makefile.am: + * gst/udp/Makefile.am: + * gst/videomixer/Makefile.am: + * gst/wavparse/Makefile.am: + * sys/directsound/Makefile.am: + * sys/oss/Makefile.am: + * sys/waveform/Makefile.am: + * tests/examples/v4l2/Makefile.am: + build: Makefile.am cleanups + Mostly add $(GST_BASE_CFLAGS) where it was missing, but also fix up + order of flags and libs if needed (see docs/random/moving-plugins). + +2010-03-18 18:49:24 +0000 Tim-Philipp Müller + + * sys/directsound/gstdirectsoundsink.c: + directsoundsink: fix redundant function redeclaration compiler warnings + +2010-03-18 19:00:09 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + * gst/alpha/gstalpha.h: + alpha: Remove remaining floating point arithmetic when processing a pixel + +2010-03-18 18:55:34 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Refactor chroma keying into a single function + This reduces code duplication once we add support for more color formats. + +2010-03-18 14:31:35 +0100 Benjamin Otte + + * ext/aalib/gstaasink.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttimeoverlay.c: + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdemux.c: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/gconf/gstgconfaudiosink.c: + * ext/gconf/gstgconfaudiosrc.c: + * ext/gconf/gstgconfvideosink.c: + * ext/gconf/gstgconfvideosrc.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/hal/gsthalaudiosink.c: + * ext/hal/gsthalaudiosrc.c: + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libcaca/gstcacasink.c: + * ext/libmng/gstmng.h: + * ext/libmng/gstmngdec.c: + * ext/libmng/gstmngenc.c: + * ext/libpng/gstpng.h: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/mikmod/gstmikmod.c: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + * ext/shout2/gstshout2.c: + * ext/soup/gstsouphttpsrc.c: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * gst/apetag/gstapedemux.c: + * gst/audiofx/audioamplify.c: + * gst/audiofx/audiodynamic.c: + * gst/audiofx/audioinvert.c: + * gst/audiofx/audiokaraoke.c: + * gst/audiofx/audiopanorama.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautovideosink.c: + * gst/autodetect/gstautovideosrc.c: + * gst/avi/gstavidemux.c: + * gst/avi/gstavimux.c: + * gst/cutter/gstcutter.c: + * gst/debugutils/breakmydata.c: + * gst/debugutils/efence.c: + * gst/debugutils/gstnavigationtest.c: + * gst/debugutils/gstnavseek.c: + * gst/debugutils/gstpushfilesrc.c: + * gst/debugutils/negotiation.c: + * gst/debugutils/progressreport.c: + * gst/debugutils/testplugin.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/goom2k1/gstgoom.c: + * gst/icydemux/gsticydemux.c: + * gst/id3demux/gstid3demux.c: + * gst/law/mulaw-decode.c: + * gst/law/mulaw-encode.c: + * gst/level/gstlevel.c: + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/qtdemux/gstrtpxqtdepay.c: + * gst/qtdemux/qtdemux.c: + * gst/replaygain/gstrganalysis.c: + * gst/replaygain/gstrglimiter.c: + * gst/replaygain/gstrgvolume.c: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpbvdepay.c: + * gst/rtp/gstrtpbvpay.c: + * gst/rtp/gstrtpceltdepay.c: + * gst/rtp/gstrtpceltpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpdvdepay.c: + * gst/rtp/gstrtpdvpay.c: + * gst/rtp/gstrtpg723depay.c: + * gst/rtp/gstrtpg723pay.c: + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729pay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263depay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpj2kdepay.c: + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp2tpay.c: + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtpmpvpay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpqdmdepay.c: + * gst/rtp/gstrtpsirendepay.c: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + * gst/rtp/gstrtpvrawdepay.c: + * gst/rtp/gstrtpvrawpay.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtspgoogle.c: + * gst/rtsp/gstrtspsrc.c: + * gst/smpte/gstsmpte.c: + * gst/smpte/gstsmptealpha.c: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/videocrop/gstaspectratiocrop.c: + * gst/videocrop/gstvideocrop.c: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideotemplate.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: + * gst/y4m/gsty4mencode.c: + * sys/directsound/gstdirectsoundsink.c: + * sys/oss/gstossmixerelement.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxvideo/osxvideosink.m: + * sys/sunaudio/gstsunaudiomixer.c: + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosrc.c: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2src.c: + * sys/waveform/gstwaveformsink.c: + * sys/ximage/gstximagesrc.c: + gst_element_class_set_details => gst_element_class_set_details_simple + +2010-03-18 14:02:30 +0100 Benjamin Otte + + * gst/oldcore/Makefile.am: + * gst/oldcore/gstaggregator.c: + * gst/oldcore/gstaggregator.h: + * gst/oldcore/gstelements.c: + * gst/oldcore/gstfdsink.c: + * gst/oldcore/gstfdsink.h: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmd5sink.h: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstmultifilesrc.h: + * gst/oldcore/gstpipefilter.c: + * gst/oldcore/gstpipefilter.h: + * gst/oldcore/gstshaper.c: + * gst/oldcore/gstshaper.h: + * gst/oldcore/gststatistics.c: + * gst/oldcore/gststatistics.h: + Remove oldcore directory + The elements have been unused for ages and all important ones have been + replaced or copied elsewhere. + +2010-03-18 13:45:08 +0100 Benjamin Otte + + * gst/avi/gstavidecoder.c: + avi: Remove old file + Seems to be leftover from the 0.4 days or so. + +2010-03-18 12:44:53 +0100 Mark Nauwelaerts + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + * ext/pulse/pulseutil.c: + pulse: use #ifdef rather than #if conditionals + +2010-03-18 12:20:17 +0100 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + rtph264depay: do not call _push_ts with unneeded (and wrong) time parameter + Fixes #613206. + +2010-03-18 11:33:59 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: fix typo in header validation check + +2010-03-18 01:51:19 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: put more information in the metadata + Additional tags are: audiocodecid, videocodecid framerate and (in the + non-live case) filesize. + While at it, fix index rewriting to update duration and filesize + values even if the index is empty. + Fixes #613094. + +2010-03-17 21:33:28 +0100 Benjamin Otte + + * configure.ac: + * ext/jpeg/gstjpegenc.c: + * ext/speex/gstspeexenc.h: + * gst/goom/goom_config.h: + * gst/goom/mathtools.h: + * tests/check/elements/level.c: + Add -Wundef to configure flags + and fix the resulting warnings + +2010-03-17 20:02:16 +0100 Benjamin Otte + + * configure.ac: + -Wmissing-prototypes is not valid for C++ + +2010-03-17 19:35:10 +0100 Benjamin Otte + + * configure.ac: + * ext/flac/gstflacdec.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/jpeg/gstjpeg.h: + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/soup/gstsouphttpsrc.c: + * ext/wavpack/gstwavpackdec.c: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/tomsmocomp.c: + * gst/equalizer/gstiirequalizer.c: + * gst/replaygain/gstrganalysis.c: + * gst/replaygain/gstrglimiter.c: + * gst/replaygain/gstrgvolume.c: + * gst/rtp/gstrtpg723pay.c: + * gst/rtp/gstrtpg729pay.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtsp/gstrtspsrc.c: + * gst/videomixer/videomixer.c: + * sys/v4l2/v4l2src_calls.c: + Add -Wredundant-decls warning flag + Also fix compile issues + +2010-03-17 18:49:11 +0100 Benjamin Otte + + * gst/monoscope/gstmonoscope.h: + Fix warnings in experimental plugins, too + +2010-03-17 18:23:00 +0100 Benjamin Otte + + * configure.ac: + * ext/annodex/gstannodex.c: + * ext/annodex/gstcmmldec.h: + * ext/annodex/gstcmmlenc.h: + * ext/annodex/gstcmmlparser.c: + * ext/annodex/gstcmmlutils.c: + * ext/dv/gstdvdec.c: + * ext/flac/gstflacenc.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/pixbufscale.h: + * ext/jpeg/Makefile.am: + * ext/jpeg/gstjpeg.c: + * ext/jpeg/gstjpeg.h: + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/wavpack/gstwavpackstreamreader.c: + * ext/wavpack/gstwavpackstreamreader.h: + * gst/debugutils/breakmydata.c: + * gst/debugutils/gstnavseek.c: + * gst/debugutils/rndbuffersize.c: + * gst/debugutils/testplugin.c: + * gst/deinterlace/tvtime/greedyh.asm: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/mmx.h: + * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc: + * gst/goom/goom_fx.h: + * gst/goom2k1/filters.c: + * gst/goom2k1/filters.h: + * gst/law/mulaw-conversion.c: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + * gst/multipart/multipart.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartdemux.h: + * gst/multipart/multipartmux.c: + * gst/multipart/multipartmux.h: + * gst/qtdemux/gstrtpxqtdepay.c: + * gst/rtp/fnv1hash.c: + * gst/rtp/fnv1hash.h: + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpac3depay.h: + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpbvdepay.h: + * gst/rtp/gstrtpbvpay.c: + * gst/rtp/gstrtpbvpay.h: + * gst/rtp/gstrtpceltdepay.h: + * gst/rtp/gstrtpceltpay.h: + * gst/rtp/gstrtpdvdepay.h: + * gst/rtp/gstrtpdvpay.h: + * gst/rtp/gstrtpg723depay.h: + * gst/rtp/gstrtpg723pay.h: + * gst/rtp/gstrtpg726depay.h: + * gst/rtp/gstrtpg726pay.h: + * gst/rtp/gstrtpg729depay.h: + * gst/rtp/gstrtpg729pay.h: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmpay.h: + * gst/rtp/gstrtph263depay.h: + * gst/rtp/gstrtph263pay.h: + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtph264depay.h: + * gst/rtp/gstrtph264pay.h: + * gst/rtp/gstrtpilbcdepay.h: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpilbcpay.h: + * gst/rtp/gstrtpj2kdepay.h: + * gst/rtp/gstrtpj2kpay.h: + * gst/rtp/gstrtpjpegdepay.h: + * gst/rtp/gstrtpjpegpay.h: + * gst/rtp/gstrtpmp1sdepay.h: + * gst/rtp/gstrtpmp2tdepay.h: + * gst/rtp/gstrtpmp2tpay.h: + * gst/rtp/gstrtpmp4adepay.h: + * gst/rtp/gstrtpmp4apay.h: + * gst/rtp/gstrtpmp4gdepay.h: + * gst/rtp/gstrtpmp4gpay.h: + * gst/rtp/gstrtpmp4vdepay.h: + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadepay.h: + * gst/rtp/gstrtpmpapay.h: + * gst/rtp/gstrtpmpvdepay.h: + * gst/rtp/gstrtpmpvpay.h: + * gst/rtp/gstrtppcmadepay.h: + * gst/rtp/gstrtppcmapay.h: + * gst/rtp/gstrtppcmudepay.h: + * gst/rtp/gstrtppcmupay.h: + * gst/rtp/gstrtpqdmdepay.h: + * gst/rtp/gstrtpsirendepay.h: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpsirenpay.h: + * gst/rtp/gstrtpspeexdepay.h: + * gst/rtp/gstrtpspeexpay.h: + * gst/rtp/gstrtpsv3vdepay.h: + * gst/rtp/gstrtptheoradepay.h: + * gst/rtp/gstrtptheorapay.h: + * gst/rtp/gstrtpvorbisdepay.h: + * gst/rtp/gstrtpvorbispay.h: + * gst/rtp/gstrtpvrawdepay.h: + * gst/rtp/gstrtpvrawpay.h: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtspsrc.c: + * gst/smpte/gstmask.c: + * gst/smpte/gstmask.h: + * gst/videobox/gstvideobox.h: + * gst/videocrop/gstvideocrop.h: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + * gst/wavenc/gstwavenc.h: + * sys/v4l2/gstv4l2colorbalance.h: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/gstv4l2vidorient.h: + * sys/ximage/ximageutil.c: + * tests/check/elements/aspectratiocrop.c: + * tests/check/elements/audioamplify.c: + * tests/check/elements/audiochebband.c: + * tests/check/elements/audiocheblimit.c: + * tests/check/elements/audiodynamic.c: + * tests/check/elements/audioecho.c: + * tests/check/elements/audioinvert.c: + * tests/check/elements/audiopanorama.c: + * tests/check/elements/audiowsincband.c: + * tests/check/elements/audiowsinclimit.c: + * tests/check/elements/avimux.c: + * tests/check/elements/avisubtitle.c: + * tests/check/elements/cmmldec.c: + * tests/check/elements/equalizer.c: + * tests/check/elements/level.c: + * tests/check/elements/matroskamux.c: + * tests/check/elements/multifile.c: + * tests/check/elements/rganalysis.c: + * tests/check/elements/rglimiter.c: + * tests/check/elements/rgvolume.c: + * tests/check/elements/shapewipe.c: + * tests/check/elements/souphttpsrc.c: + * tests/check/elements/spectrum.c: + * tests/check/elements/videofilter.c: + * tests/check/elements/wavpackdec.c: + * tests/check/elements/wavpackenc.c: + * tests/check/elements/wavpackparse.c: + * tests/check/elements/y4menc.c: + * tests/check/generic/states.c: + * tests/check/pipelines/simple-launch-lines.c: + * tests/check/pipelines/wavpack.c: + * tests/examples/equalizer/demo.c: + * tests/examples/level/level-example.c: + * tests/examples/spectrum/spectrum-example.c: + * tests/icles/v4l2src-test.c: + Add -Wmissing-declarations -Wmissing-prototypes warning flags + And fix all the warnings. + +2010-03-17 16:23:24 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4gdepay.c: + mp4gdepay: improve constantDuration guessing + When no constantDuration has been given in the caps, try to derive one from the + timestamp difference between packets. Also keep doing this for each packet + because some broken streams might simply provide wrong timestamps. + +2010-03-16 23:43:39 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: Put width and height in the metadata + Some players use that info to scale their display. + See #613094. + +2010-03-16 23:32:45 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: don't put timestamps larger than G_MAXINT32 in the FLV tags + For non-live input respond by pushing EOS, for live wrap the + timestamps every G_MAXINT32 miliseconds. + Fixes #613003. + +2010-03-16 23:40:12 +0200 Stefan Kost + + * ext/soup/gstsouphttpsrc.c: + soup: also use g_value_set_static_string() here for static strings + +2010-03-16 21:23:11 +0100 Sebastian Dröge + + * gst/alpha/gstalphacolor.c: + alphacolor: Fix RGBA<->AYUV conversion + +2010-03-16 21:16:26 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + * gst/alpha/gstalpha.h: + alpha: Remove redundant instance field + +2010-03-16 21:10:08 +0100 Sebastian Dröge + + * gst/alpha/gstalpha.c: + alpha: Protect property values from changes during frame processing + +2010-03-15 23:29:55 +0300 Руслан Ижбулатов + + * ext/libpng/gstpngdec.c: + pngenc: Use png_get_io_ptr() instead of accessing io_ptr directly + Fixes #612700 (for the last time!) + +2010-03-15 23:29:06 +0300 Руслан Ижбулатов + + * configure.ac: + png: Check for libpng >= 1.2 instead of libpng12 + +2010-03-16 01:29:36 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + flvmux: Always put a duration tag in the metadata + Some Flash players (for instance JW Player) always expect a duration + tag, otherwise they don't start playback. + If duration can be queried from the sink pads or is provided as a tag, + use it. Otherwise try to determine it from the last seen timestamp of + the sink pads after EOS and rewrite it in the header before writing + the index. + +2010-03-16 00:35:46 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + flvmux: Remove the send_codec_data field from GstFlvPad + That field is not used anymore after the changes in + 9fdecbc1c11f4e5af6578bba32a9b32771029d33. + +2010-03-16 13:53:26 +0100 Wim Taymans + + * gst/udp/gstmultiudpsink.c: + multiudpsink: get family of external sockets too + Get the family of externally configured sockets so that we can configure it + correctly. + +2010-03-15 20:37:51 +0100 Sebastian Dröge + + * gst/alpha/gstalphacolor.c: + alphacolor: Add support for the remaining ARGB formats + +2010-03-15 19:16:18 +0100 Sebastian Dröge + + * gst/alpha/gstalphacolor.c: + alphacolor: Simplify ARGB<->AYUV conversions by code generation macros + +2010-03-15 19:07:28 +0100 Sebastian Dröge + + * docs/plugins/Makefile.am: + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalpha.h: + alpha: Minor cleanups and move declarations into a separate header file + +2010-03-15 18:58:51 +0100 Sebastian Dröge + + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: + alpha: Use GstVideoFilter as base class for automatic QoS support + +2010-03-15 18:50:11 +0100 Sebastian Dröge + + * gst/alpha/gstalphacolor.c: + * gst/alpha/gstalphacolor.h: + alphacolor: Add support for inplace conversions from AYUV to ARGB + +2010-03-15 18:14:19 +0100 Sebastian Dröge + + * gst/alpha/gstalphacolor.c: + * gst/alpha/gstalphacolor.h: + alphacolor: Use libgstvideo for caps parsing + +2010-03-15 18:09:55 +0100 Sebastian Dröge + + * gst/alpha/Makefile.am: + * gst/alpha/gstalphacolor.c: + * gst/alpha/gstalphacolor.h: + alphacolor: Use GstVideoFilter as base class for automatic QoS support + +2010-03-15 18:07:29 +0100 Sebastian Dröge + + * gst/alpha/gstalphacolor.c: + alphacolor: Some minor cleanup + +2010-03-15 14:16:58 +0100 Sebastian Dröge + + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexdec.h: + speexdec: Use speex_stereo_state_init() instead of the deprecated initialization macro + Fixes bug #612777. + +2010-03-15 01:09:49 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: Correctly mark buffers as delta units + Mark video interframes, video codec data buffers and audio buffers (if + it's not an audio-only stream) as delta units. + +2010-03-14 19:32:20 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: Support streamheaders + Put the FLV header, the metadata tag and (if present) codec + information in the streamheader to allow the muxer to be used for + streaming. + +2010-03-14 01:38:21 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: Preallocate index space and fill it after finishing output + Make the index appear at the beginning of the file, which is what most + players are expecting. + Fixes #601236. + +2010-03-15 13:47:13 +0100 Sebastian Dröge + + * gst/flv/gstflvmux.c: + flvmux: Minor coding style fixes and cleanup + +2010-03-14 01:34:02 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + flvmux: Add a is-live property + If it is set, the muxer will not write the index. Defaults to false. + +2010-03-14 01:25:42 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: Only put valid seek points in the index + For files containing video only video keyframes are valid points to + which a player can seek. For audio-only files any tag start is a valid + seek point. + See #601236. + +2010-03-14 01:09:37 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: Fix index building to make entries point to tag's start offset + Previous coding was wrongly incrementing the total byte count before + adding an index entry. + +2010-03-15 13:40:38 +0100 Sebastian Dröge + + * ext/cairo/gsttextoverlay.c: + cairotextoverlay: Don't render text outside the frame boundaries + Fixes bug #611986. + +2010-03-15 11:38:23 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't forget to send keepalive messages + When we operate in TCP mode, still send keepalive messages when we + need to. + Fixes #612696 + +2010-03-13 23:19:35 +0300 Руслан Ижбулатов + + * ext/libpng/gstpngenc.c: + pngenc: Call png_jmpbuf() instead of accessing png_struct_ptr directly + Fixes #612700 (again) + +2010-03-12 16:44:30 +0300 Руслан Ижбулатов + + * ext/libpng/gstpngenc.c: + pngenc: Call png_error() instead of using longjmp() directly. + Fixes #612700 + +2010-03-12 13:57:28 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From e272f71 to 55cd514 + +2010-03-05 11:06:47 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: add XMP parsing support + Use xmp helpers to parse XMP metadata in udta atom. + Fixes #609539 + +2010-03-11 12:32:56 -0800 Michael Smith + + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudpnetutils.c: + * gst/udp/gstudpnetutils.h: + udp: fix compilation errors on non-windows. + +2010-03-10 22:23:43 +0100 Andoni Morales Alastruey + + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudpnetutils.c: + * gst/udp/gstudpnetutils.h: + multiudpsink: avoid getting the socket family using getsockname() + +2010-03-11 17:28:47 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix print statements for pointer differences. + This fixes it for both 32 and 64 bit + +2010-03-11 17:28:35 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix unitialized variables + +2010-03-11 17:03:47 +0100 Edward Hervey + + * gst/flv/gstflvdemux.c: + flvdemux: Fix printf formatting for macosx + +2010-03-11 17:03:05 +0100 Edward Hervey + + * gst/flv/gstflvdemux.c: + flvdemux: Fix unitialized variables + +2010-03-11 17:02:44 +0100 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Fix unitialized variable. + +2010-02-19 13:39:04 +0100 Edward Hervey + + * gst/flv/gstflvparse.c: + flvparse: Make script tag parsing more flexible. + * The nb_elements for arrays is just an indication, we can therefore ignore + it and carry on parsing metadata items until we reach the end marker. + * If type == 3, then the script tag contains a list of object followed + by the end marker. + Refactor code slightly to handle both cases + https://bugzilla.gnome.org/show_bug.cgi?id=610447 + +2010-03-11 15:51:40 +0000 Tim-Philipp Müller + + * tests/check/elements/deinterleave.c: + * tests/check/elements/interleave.c: + tests: fix metadata not writable warnings in interleave and deinterleave tests + +2010-03-11 15:38:19 +0000 Tim-Philipp Müller + + * tests/check/elements/apev2mux.c: + * tests/check/elements/id3v2mux.c: + tests: fix metadata not writable warnings with apev2mux and id3v2mux tests + +2010-03-11 15:24:20 +0000 Tim-Philipp Müller + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: fix metadata writable warnings + Set metadata on buffer first, when the refcount is still 1, and only + ref again afterwards. + +2010-03-11 15:02:48 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: ignore stream with invalid header time metadata + +2010-03-08 14:57:17 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Set stream-format=raw on AAC caps + Set stream-format=raw for AAC caps, as that is the + expected AAC format to be in this container family. + Fixes #566250 + +2010-03-11 12:56:11 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: check for NULL before doing strcmp + Check the connection and address type for NULL before doing strcmp and + crashing. + Fixes #612553 + +2010-03-11 11:20:59 +0100 Benjamin Otte + + * common: + Automatic update of common submodule + From df8a7c8 to e272f71 + +2010-03-11 11:09:55 +0200 Stefan Kost + + * gst/udp/gstudpnetutils.c: + build: include stdlib.h for atoi() + +2010-03-11 10:33:00 +0200 Stefan Kost + + * gst/audiofx/audiopanorama.c: + audiopanorama: move invariant check out of the inner loop + Improves performance for simple method. + +2010-03-10 22:15:04 +0100 Benjamin Otte + + * configure.ac: + Update CXXFLAGS, too, just like CFLAGS + +2010-03-10 21:01:20 +0100 Benjamin Otte + + * configure.ac: + * gst/rtpmanager/Makefile.am: + * tests/check/Makefile.am: + Update for recent changes to common submodule + This just replaces every "$ERROR_CFLAGS" usage with a usage of + "$WARNING_CFLAGS $ERROR_CFLAGS" to get the same functionality as + previously. + Actually using that separation will happen later. + +2010-03-10 21:52:09 +0100 Benjamin Otte + + * common: + Automatic update of common submodule + From 9720a7d to df8a7c8 + +2010-03-10 20:43:57 +0100 Benjamin Otte + + * common: + Automatic update of common submodule + From 0b6e072 to 9720a7d + +2010-03-10 10:51:28 -0800 Andoni Morales Alastruey + + * gst/udp/gstmultiudpsink.c: + multiudpsink: Reset windows error code after getting corresponding error message. + +2010-03-09 17:32:27 -0800 Michael Smith + + * gst/avi/gstavimux.c: + * gst/avi/gstavimux.h: + avimux: put the codec_data blob into the actual data for MPEG4 video, to match other implementations in the wild. + +2010-03-10 16:09:56 +0100 Benjamin Otte + + * common: + Automatic update of common submodule + From 7cc5eb4 to 0b6e072 + +2010-02-23 21:06:55 -0300 Thadeu Lima de Souza Cascardo + + * sys/ximage/gstximagesrc.c: + ximagesrc: send new_segment with GST_FORMAT_TIME format + Instead of using BaseSrc default format GST_FORMAT_BYTES, send it in + GST_FORMAT_TIME. + Signed-off-by: Thadeu Lima de Souza Cascardo + Fixes #611659 + +2010-03-10 11:46:06 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: push mode; also report seekable without an element index + ... since recent code also seeks around to obtain required data + from avi index. + +2010-03-09 18:06:52 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: add some check and standardized seek event handling in push mode + +2010-03-09 18:05:29 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: fix offset handling in push mode seeking + Push mode seeking uses same index data as pull mode, and stores + offset to data in chunk, whereas push mode operates in chunks, + and as such needs offset consistently corresponding to chunk headers. + Also fix determining best matching stream for incoming newsegment event, + as well as setting some stream state accordingly. + +2010-02-26 21:29:49 +0100 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + flvdemux: conduct index scan in task thread + ... rather than in seeking thread, which might then occupy mainloop + for some time with possible unresponsive side-effects. + +2010-02-26 21:27:33 +0100 Mark Nauwelaerts + + * gst/flv/gstflvparse.c: + flvdemux: avoid indefinite index growth + That is, check for and do not add an index entry that has already + been added. + +2010-02-18 14:57:39 +0100 Mark Nauwelaerts + + * gst/flv/gstflvparse.c: + flvdemux: also collect index info on-the-fly in pull mode + +2010-02-18 12:42:31 +0100 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: + * gst/flv/gstflvparse.h: + flvdemux: incrementally build index in pull mode + Scan for needed part upon a seek as opposed to doing a complete scan + at startup, which may take some time depending on file and/or platform. + Also accept index metadata in pull mode and peek for some metadata + at the end of the file when deemed appropriate. + +2010-02-18 12:26:46 +0100 Mark Nauwelaerts + + * gst/flv/gstflvdemux.c: + flvdemux: some more variable cleanup + +2010-03-09 18:25:23 +0100 Mark Nauwelaerts + + * gst/flv/gstflvparse.c: + flvdemux: refactor adding index entry + +2010-02-17 11:36:13 +0100 Mark Nauwelaerts + + * gst/flv/gstflvparse.c: + flvdemux: fix setting DELTA_UNIT flag on outgoing buffers + ... which should not depend on having index available or not. + Also refactor resulting collapsed code. + +2010-02-11 19:43:47 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: avoid erroneous codec-data overriding of stsd information + +2010-02-01 22:37:30 +0100 Mark Nauwelaerts + + * ext/speex/gstspeexdec.c: + speexdec: adapt to new oggdemux + Remove all granulepos hacks and simply use upstream timestamps. + +2010-02-01 22:36:02 +0100 Mark Nauwelaerts + + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexdec.h: + speexdec: refactor granulepos hacks + +2010-03-10 11:19:46 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: parse connection information + Parse the connection information from the SDP and use it to figure out if we are + dealing with ipv4 or ipv6 connections. + +2010-03-09 17:53:32 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: require a destination for multicast + When setting up the multicast sockets, we need a destination address to listen + on or else we error. + +2010-03-09 17:52:35 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: handle ipv6 listening ports when needed + Add some code to make udpsrc listen on an ipv6 address when needed. The + detection of IPV6 is not yet implemented. + +2010-03-09 17:15:16 +0100 Wim Taymans + + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: + * gst/udp/gstudpsrc.h: + udp: use uri parsing code + Use the uri parsing helper functions to manage the host and port pairs. This + adds support for IPV6. + +2010-03-09 17:13:31 +0100 Wim Taymans + + * gst/udp/gstudpnetutils.c: + * gst/udp/gstudpnetutils.h: + udpnetutils: add helper functions for udp uri handling + Add some helpers to parse udp uris. Make sure IPV6 is supported too. + +2010-03-05 16:08:45 +0100 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpsession: Make it possible to favor new sources in case of SSRC conflict + Add a "favor-new" property that tells the session to favor new sources when + there is a SSRC conflict. This is useful for SIP calls and other such cases + where a remote loop is extremely unlikely. + Fixes #607615 + +2010-03-05 15:46:48 +0100 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpsession: Move SSRC conflicts lists into RTPSource + We will also need to track SSRC conflicts in remote sources. + See #607615 + +2010-02-26 17:13:49 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: send keep alive when paused + When we are paused, send keep alive messages to the server so that our session + doesn't time out when we go back to playing later. + +2010-03-10 01:10:07 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 7aa65b5 to 7cc5eb4 + +2010-02-23 19:48:10 -0800 David Schleef + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + multifilesink: Add key-frame option to next-file + This allows segmenting of MPEG-TS files at key frames, which is + exactly what is needed for Apple's HTTP streaming. + +2010-03-09 21:32:47 +0000 Sebastian Dröge + + * common: + Automatic update of common submodule + From 44ecce7 to 7aa65b5 + +2010-03-08 20:17:58 +0000 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix autocropping for odd width/height differences + +2010-03-08 20:02:19 +0000 Sebastian Dröge + + * gst/videobox/Makefile.am: + * gst/videobox/gstvideobox.c: + * gst/videobox/gstvideobox.h: + videobox: Use libgstvideo for format specific stuff + +2010-03-08 19:28:47 +0000 Sebastian Dröge + + * gst/audiofx/audioamplify.c: + * gst/audiofx/audiodynamic.c: + * gst/audiofx/audioecho.c: + * gst/audiofx/audiofxbasefirfilter.c: + * gst/audiofx/audiofxbaseiirfilter.c: + * gst/audiofx/audioinvert.c: + * gst/audiofx/audiokaraoke.c: + * gst/audiofx/audiopanorama.c: + audiofx: Sync properties to the stream time + +2010-03-08 19:20:59 +0000 Sebastian Dröge + + * gst/videobox/Makefile.am: + * gst/videobox/gstvideobox.c: + videobox: Make properties controllable + +2010-03-08 19:09:01 +0000 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Some cleanup + +2010-02-28 15:47:50 +0100 Sebastian Dröge + + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstop.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstradioac.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstripple.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gststreak.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + effectv: Use controller where possible, optimize a bit and make properties threadsafe + +2010-02-26 16:35:17 +0100 Sebastian Dröge + + * pkgconfig/Makefile.am: + build: Make some more rules silent if requested + +2010-02-26 15:41:52 +0100 Sebastian Dröge + + * configure.ac: + configure: Use automake 1.11 silent rules instead of shave if available + This makes sure that we use something that is still maintained and + also brings back libtool 1.5 support. + +2010-03-08 22:57:34 +0100 Benjamin Otte + + * ext/libpng/gstpngenc.c: + png: fractions don't allow doubles + +2010-03-01 12:03:56 +0100 Benjamin Otte + + * gst/flx/gstflxdec.c: + flx: fix description + It's video, not audio + +2010-03-09 17:45:27 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * win32/common/config.h: + Back to development + +=== release 0.10.21 === + +2010-03-09 00:28:16 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.21 + +2010-03-09 00:24:45 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2010-03-09 00:09:34 +0000 Tim-Philipp Müller + + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + Revert "Add 4:2:2, 4:1:1, and 4:4:4 output support" + This reverts commit 637c26f61a2bd8d7b01f8b6d081d94da65f74557. + +=== release 0.10.20 === + +2010-03-08 23:42:51 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.20 + +2010-03-08 23:42:06 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2010-03-08 16:47:04 +0000 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + flacdec: don't send second newsegment event in framed mode, fixes long playback delay + Don't send another newsegment event if the upstream muxer/parser has already + sent one (otherwise the sink will wait for $duration before starting playback). + Fixes long delay until playback starts with flac-in-ogg files. + Fixes #610959. + +2010-03-05 13:49:31 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: configure multicast correctly + Take the transport destination for multicast. + Disable loop and autojoin for multicast on the udpsinks. + +2010-03-05 13:47:33 +0100 Wim Taymans + + * gst/udp/gstmultiudpsink.c: + multicast: always configure loop and ttl + Also configure TTL and loop parameters when we add a client after initializing + the sender. + +2010-03-08 12:13:32 +0100 Wim Taymans + + * gst/rtp/gstrtph263depay.c: + Revert "rtph263depay: baseclass handles timestamps for us" + This reverts commit 564581e1b88ecd5ec5da82c3cafb0e7a2d58b302. + If we don't call push_ts, there will be no timestamp at all on the outgoing + buffer. + Fixes #612154 + +2010-02-23 22:16:39 -0500 Benjamin M. Schwartz + + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + Add 4:2:2, 4:1:1, and 4:4:4 output support + +2010-03-02 13:21:24 +0100 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: use payload size to estimate bitrate + Use the length of the payload for estimating the receiver bitrate so that it + matches the calculations done on the sender side. Together with the number of + packets one can scale the bitrate with the header overhead of the lower + transport. + +2010-03-02 12:39:20 +0100 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpsource: refactor bitrate estimation + Don't reuse the same variable we need for stats for the bitrate estimation + because we're updating it. + Refactor the bitrate estimation code so that both sender and receivers use the + same code path. + +2010-03-01 16:40:27 -0500 Tristan Matthews + + * gst/rtpmanager/rtpsource.c: + added bitrate estimation to receiver-side stats, fixes #611213 + +2010-03-01 16:01:24 +0100 Wim Taymans + + * gst/rtp/gstrtph263pay.c: + h263pay: fix typo in debug + +=== release 0.10.19 === + +2010-03-06 00:43:03 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shapewipe.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.19 + +2010-03-06 00:42:09 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2010-03-03 20:29:30 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.18.4 pre-release + +2010-03-02 18:29:41 +0100 Edward Hervey + + * gst/matroska/matroska-demux.c: + matroskademux: Make sure we don't send invalid newsegments + Fixes #611501 + +2010-03-02 14:09:14 +0100 Edward Hervey + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + matroskademux: Mark streams as being EOS at the right time. + This allows us to stop streaming only when all streams have gone past the + segment.stop and not before. + Fixes #611501 + +2010-02-26 18:10:32 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Advance sparse streams only as much as required to keep the gap smaller than 500ms + Changing it to the newest timestamp that was ever pushed will + increase the segment start in 500ms jumps, which could be just + after the next sparse stream buffer. E.g. + Video at 1.0s, sparse stream at 0.5s would jump the + sparse stream to 1.0s. Now a new sparse stream buffer could + appear that has a timestamp of 0.9s and this would be + dropped for no good reason because of bad luck. + +2010-02-24 01:36:07 +0000 Tim-Philipp Müller + + * configure.ac: + * po/es.po: + * win32/common/config.h: + 0.10.18.3 pre-release + +2010-02-24 02:05:49 +0100 Alessandro Decina + + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + Make sure FLUSH_STOP is sent so not to leave downstream flushing. + +2010-02-23 17:25:54 +0100 Volker Grabsch + + * configure.ac: + configure: Use $PKG_CONFIG instead of pkg-config to fix cross compilation + Fixes bug #610839. + +2010-02-23 17:24:03 +0100 Sebastian Dröge + + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer: Reset skew detection after instantiating the jitterbuffer + ...not only when going to READY. This sets high_level and friends to + a more useful value. + +2010-02-23 17:19:14 +0100 Sebastian Dröge + + * gst/rtpmanager/rtpjitterbuffer.c: + rtpjitterbuffer: Return 100 if high-level is 0 instead of dividing by zero + +2010-02-22 12:24:14 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4gdepay.c: + rtpmp4gdepay: avoid division by 0 + Avoid a division by 0 when no constantDuration was specified and when out two + timestamps are equal. + Fixes #610265 + +2010-02-22 18:20:46 +0100 Wim Taymans + + * gst/rtp/gstrtpdvdepay.c: + * gst/rtp/gstrtpdvdepay.h: + dvdepay: don't output frames until we have a header + Wait for the complete first 6 header DIF packets before outputting a frame. + Decoders need this info to correctly decode the data. + Fixes #610556 + +2010-02-22 20:55:29 +0100 David Hoyt + + * ext/jpeg/gstjpegdec.c: + jpegdec: Fix invalid memory access by first checking and then reading + Fixes bug #610483. + +2010-02-18 09:05:50 +0100 Philippe Normand + + * ext/pulse/pulsesink.c: + pulsesink: gst_pulsesink_get_mute: set result earlier. + In the cases where no buffer was process yet or the index is not + available, get_pulsesink_get_mute() would unconditionally return + FALSE. + https://bugzilla.gnome.org/show_bug.cgi?id=610337 + +2010-02-19 12:35:29 +0000 Tim-Philipp Müller + + * pkgconfig/gstreamer-plugins-good-uninstalled.pc.in: + pkgconfig: fix gstreamer-plugins-good uninstalled .pc file + Fix gst-plugins-base reference/requirement. This caused spurious + problems with uninstalled -ugly/-bad not finding -good plugins in + their unit tests (when distchecking). + +2010-02-19 01:03:31 +0000 Tim-Philipp Müller + + * configure.ac: + * po/lv.po: + * win32/common/config.h: + 0.10.18.2 pre-release + +2010-02-19 00:54:13 +0000 Tim-Philipp Müller + + * tests/check/elements/.gitignore: + * tests/examples/shapewipe/.gitignore: + Make git ignore shapewipe examples and tests + +2010-02-19 00:46:40 +0000 Tim-Philipp Müller + + * gst/flv/gstflvparse.c: + flvdemux: minor micro-optimisation + We know these values don't change during the loop, but the compiler + doesn't and has to re-check them for every iteration. + +2010-02-19 00:39:50 +0000 Tim-Philipp Müller + + * gst/flv/gstflvparse.c: + flvdemux: remove static keyword from variables that shouldn't be static + Multiple flvparse/flvdemux instances should be able to operate without + trampling over each other by accidentally re-using the same (static) + variables. (Spotted by Mark Nauwelaerts) + +2010-02-16 02:07:07 +0000 Tim-Philipp Müller + + * gst/rtpmanager/gstrtpjitterbuffer.c: + docs: add Since: markers for new jitterbuffer properties + +2010-02-18 18:20:24 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix off-by-one logic error in frame rate cap regression commit + +2010-02-17 16:27:33 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Use the correct duration when comparing segments + Do not confuse QtDemuxSegments with GstSegments when + comparing the total file duration with the segment duration + Fixes #610296 + +2010-02-17 18:06:29 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: add durations modulo 1<<32 + For calculating the durations of each sample, we are supposed to add each + duration modulo 1<<32 so make the elapsed time counter a uint32. + Fixes #610280 + +2010-02-16 21:05:24 +0100 Anders Skargren + + * gst/multipart/multipartdemux.c: + multipartdemux: improve header mime-type parsing + Make the handing of the mime type within the "boundary" a bit less naive. + The standard for MIME allows parameters to follow the "type" / "subtype" + clause separated from the mime type by ';'. + Modifies the multipartdemuxer's header parsing so it doesnt assume + the whole line after "content-type:" is the mime type and thus makes it a bit + more resilient to finding absurd mime types in the case where parameters are + added. + Fixes #604711 + +2010-02-16 19:53:09 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: avoid stopping NULL tasks + Check the task for NULL, it could be paused and set to NULL before. + +2010-02-16 16:22:28 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix ALAC codec-data handling + ALAC codec-data apparently comes in (at least) two flavours (mov, mp4), + so use atom based parsing to retrieve required data, rather than + aiming for a specific offset. + See also #580731. + +2010-02-16 15:50:23 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix debug message + +2010-02-11 19:39:04 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_types.h: + qtdemux: handle signed values in 3GPP location tag + +2010-02-08 21:35:53 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix typo in debug message + +2010-02-16 15:00:13 +0100 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: reset some more stream state after seek + In particular, fixes non-flushing seek. + +2010-02-16 14:44:11 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix frame rate cap regression + Look for a non-zero min_duration during initialisation to avoid + incorrect frame rate caps. + +2010-02-16 10:13:17 +0200 Stefan Kost + + * sys/v4l2/gstv4l2bufferpool.c: + v4l2: log more details in buffer pool finalize + Helps to align with the loggin from libv4l. + +2010-02-16 10:11:40 +0200 Stefan Kost + + * sys/v4l2/gstv4l2object.c: + v4l2: init datastructures after pre-conditions checks + +2010-02-16 10:10:45 +0200 Stefan Kost + + * ext/jpeg/gstjpegenc.c: + jpegenc: add a fixme for handling other YUV variants + +2010-02-16 01:40:19 +0000 Brian Cameron + + * gst/matroska/matroska-demux.c: + matroska: fix GST_ELEMENT_ERROR usage + Fixes #610053. + +2010-02-16 00:50:15 +0000 Tim-Philipp Müller + + * configure.ac: + configure: fix up GST_CXXFLAGS properly + We don't want C specific flags in GST_CXXFLAGS, so base it on the + GST_CFLAGS that only contains the pkg-config CFLAGS but none of + the GST_OPTION_CFLAGS. Also, we only need the local includes once. + Fix typo as well (GST_FLAGS -> GST_CFLAGS). + +2010-02-15 23:13:46 +0200 Stefan Kost + + * configure.ac: + configure: base GST_CXXFLAGS on --cflags from pkg-config + pkg-config sets GST_CFLAGS and GST_LIBS. We need to use CFLAGS as a starting + point for for both C and CXX settings. + +2010-01-20 18:52:51 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpsession.c: + rtpbin: remove use of ntp_ns_base + +2010-01-20 18:22:20 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpstats.h: + rtpbin: remove more ntpnstime and cleanups + Remove some code where we pass ntpnstime around, we can do most things with the + running_time just fine. + Rename a variable in the ArrivalStats struct so that it's clear that this is the + current system time. + +2010-01-20 18:19:34 +0100 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: use running_time for jitter + Use the running_time to calculate the jitter instead of the ntp time. Part of + the plan to get rid of ntpnsbase. + +2010-01-20 17:04:03 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpbin: change how NTP time is calculated in RTCP + Don't calculate the NTP time based on the running_time of the pipeline but from + the systemclock. This allows us to generate more accurate NTP timestamps in case + the systemclock is synchronized with NTP or similar. + +2010-02-15 12:12:36 +0000 Tim-Philipp Müller + + * sys/v4l2/v4l2_calls.c: + v4l2: printf format string fix + The compiler wants a cast here even though the type is already + typedefed as 64-bit integer (presumably because glib has typedefed + guint64 to unsigned long here). + +2010-02-15 10:33:02 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroska: fix printf format string + +2010-02-15 00:50:10 +0000 Tim-Philipp Müller + + * ext/raw1394/gst1394clock.h: + * gst/matroska/ebml-write.h: + * gst/rtpmanager/gstrtpjitterbuffer.h: + raw1394, matroska, rtpmanager: remove padding from structures + None of these element and class structures are in public headers, + so don't need padding. + +2010-02-15 00:47:11 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + po: update for new translator comment + +2010-02-15 00:45:51 +0000 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + pulsesink: add comment for translators for 'x by y' message + Fixes #609724. + +2010-02-15 01:28:44 +0100 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + cairorender: Fix leaking of pad templates + +2010-02-15 00:50:27 +0100 Sebastian Dröge + + * tests/check/elements/shapewipe.c: + shapewipe: Fix unit test for latest changes + Now the alpha is multiplied with the already existing alpha + value instead of simply ignoring it and the luma/chroma values + are kept, even if the output is 100% transparent. + +2010-02-15 00:47:08 +0100 Sebastian Dröge + + * tests/check/elements/shapewipe.c: + shapewipe: Improve unit test output on errors + +2010-02-14 23:17:20 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 96dc793 to 44ecce7 + +2010-02-13 23:28:06 +0000 Tim-Philipp Müller + + * configure.ac: + configure: bump -base requirement to git + For GST_RIFF_TAG_JUNQ. + +2010-02-12 16:11:30 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2.c: + v4l2sink: change rank to NONE so it is never autoplugged + +2010-02-13 18:18:42 +0100 Edward Hervey + + * gst/flv/gstflvparse.c: + flvdemux: Audio tags without any content are valid. + We silently ignore them instead of erroring out. + +2010-02-13 18:07:50 +0100 Edward Hervey + + * gst/flv/gstflvparse.c: + flvdemux: Fix GST_CLOCK_DIFF usage. + It was previously checking for DIFF(a, b > 6 * GST_SECOND) instead of + the proper DIFF(a,b) > 6 * GST_SECOND + +2010-02-13 16:27:07 +0100 Edward Hervey + + * gst/flv/gstflvdemux.c: + flvdemux: Don't forget to reset the indexed variable when cleaning up + +2010-02-13 11:01:53 +0100 Edward Hervey + + * gst/flv/gstflvparse.c: + flvdemux: Speedup GstIndex usage + Used the _add_associationv variant of GstIndex since we know how many + associations we're adding. Trims up to 50% from index generation time. + Note : It would be great if the index could be generated on the fly or + on request as opposed to being fully created at startup. + +2010-02-12 19:32:27 +0100 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: don't resync to invalid timestamps + If we detect backward timestamps on the server, don't try to resync when we + don't have an input timestamp (such as when using RTSP over TCP) instead, do + nothing but assume the timestamp was ok, it will correct itself when time goes + forwards. + +2010-02-12 17:21:43 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: fix typo + +2010-02-12 16:47:29 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: start out active and not buffering + There is no need to set the latency in the jittebuffer in _init, we will set + that later when going to PAUSED. + Set the jitterbuffer active and not buffering when starting. + +2010-01-27 17:57:55 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.h: + rtpbin: more buffering work + When deactivating jitterbuffers when the buffering starts, keep the current + percent of the jitterbuffer and also set the jitterbuffer in the buffering state + so that we know when it's filled again. + Add property to get the buffering percentage of the jitterbuffer. + +2009-10-14 16:29:35 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer: adjust latency in buffer mode + When we are in buffer mode, adjust the buffering low/high thresholds based on + the total configured latency. If we don't and there is a huge queue or element + with a big latency downstream we might drain the complete queue immediately and + start buffering again. + +2009-10-12 11:54:07 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: add ts-offset to timestamp + Add the ts-offset to the buffer timestamp to get the final output timestamp of + the buffer. + +2009-10-08 19:23:53 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpjitterbuffer.h: + * gst/rtpmanager/rtpjitterbuffer.c: + rtpbin: do more accurate buffer offsets + Return the next timestamp in the jitterbuffer. + Use the min-timestamp of the jitterbuffers to calculate an offset so that the + next timestamp is pushed with a timestamp equal to running_time. + Start producing timestamps from 0 in the buffering case too. + +2009-10-08 18:42:11 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: only start buffering when < 100% + Only start buffering when the percentage message is < 100 %. + +2009-10-06 13:34:34 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + rtpbin: keep track of elapsed pause time + Keep track of the time we spend pausing the jitterbuffers when they were + buffering and distribute this elapsed time to the jitterbuffers. + Also keep the latency in nanosecond precision. + +2009-10-06 13:33:15 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpjitterbuffer.h: + jitterbuffer: keep track of offset + Keep track of an outgoing offset that we add to each outgoing buffer to + compensate for PAUSE when buffering. + Adjust the offset when activating. + +2009-10-06 13:30:54 +0200 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: report level using high watermark + +2009-10-05 21:31:59 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtsp/gstrtspsrc.c: + rtpbin: pass running_time to jitterbuffer pause + Pass the current running time to the jitterbuffer when pausing or resuming so + that it calculate the right offsets. + Small cleanups and comments. + Set the default rtspsrc latency to 2 seconds. + +2009-10-05 20:09:30 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/rtpjitterbuffer.c: + rtpbin: add some comments + +2009-10-05 19:45:35 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpjitterbuffer.h: + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.h: + rtpbin: more buffering updates + Add signal to pause the jitterbuffer. This will be emitted from gstrtpbin when + one of the jitterbuffers is buffering. + Make rtpbin collect the buffering messages and post a new buffering message with + the min value. + Remove the stats callback from jitterbuffer but pass a percent integer to + functions that affect the buffering state of the jitterbuffer. This allows us + then to post buffering messages from outside of the jitterbuffer lock. + +2009-10-05 13:32:17 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.h: + rtpbin: propagate buffer-mode property + Propagate buffer-mode property to the jitterbuffers. + Intercept BUFFERING messages in rtpbin + +2009-10-01 17:14:09 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.h: + jitterbuffer: do more buffering implementation + Add callback for buffering stats. + Configure the latency in the jitterbuffer instead of passing it with _insert. + Calculate buffering levels when pushing and popping + Post buffering messages. + +2009-10-01 12:46:21 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.h: + jitterbuffer: flesh out buffering mode some more + Add a buffering state to the jitterbuffer and wait until buffering ends before + pushing out packets. + +2009-10-01 12:09:58 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: hook up the mode property + Expose a mode property on the jitterbuffer. + Fix the case where timestamps are -1 in the check for outgoing timestamps. + +2009-10-01 11:20:08 +0200 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.h: + jitterbuffer: add buffering mode options + Add getters and setters for different buffering modes that the jitterbuffer will + support. Default to the current slave mode. + +2010-02-12 15:54:37 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2.c: + v4lsink: lower rank to MARGINAL + +2010-02-12 16:06:45 +0100 Robert Swain + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: + flvdemux: Obtain the index from the end of an flv file in push mode + Allows for better support of seeking in flv files when in push mode + +2010-01-21 11:55:15 +0100 Robert Swain + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: Drop video frames up to the desired keyframe after a seek + The audio packets in AVI are generally muxed ~0.5s before the + corresponding video packet. This changes causes downstream to only + receive packets with roughly corresponding timestamps. + +2010-01-19 18:35:49 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: more DISCONT handling + Add some debug in the DISCONT handling code. + When we receive a DISCONT in push mode, mark all streams as DISCONT. + +2010-01-19 10:51:08 +0100 Robert Swain + + * gst/avi/gstavidemux.c: + avidemux: Fix _handle_seek_push () and new segement behaviour + +2010-01-18 17:13:06 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: cleanups + Make sure we reset the demuxer correctly wrt parsing the index. + Don't leak pending seek events. + Rename some methods to reflect what they do and to avoid confusion with similar + method names. + Try to make the seeking threadsafe by protecting the setup code with a lock. + Make sure we post errors when a seek fails. + +2010-01-18 11:45:38 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: rename some variables + seek_event -> seg_event + event_seek -> seek_event + +2010-01-15 18:00:46 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: take fallback duration from avih + When we have not parsed any indexes yet, we don't know the length of the streams + and we must take the length given in the avih as a fallback. + Avoid some typechecking. + +2009-12-04 15:13:12 +0100 Robert Swain + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: Push mode seeking support + +2010-02-01 16:04:41 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: cleanup properties + Use more default constants. + Use static strings param flag. + Init properties explicitly instead of letting gobject do this. + +2010-02-12 15:34:38 +0200 Stefan Kost + + * ext/speex/gstspeexdec.c: + speex: add missing include + +2010-02-05 13:28:53 +0200 Stefan Kost + + * gst/debugutils/gsttaginject.c: + taginject: fix multi-value tag example + We need to use {} to specify a list. + +2010-02-01 14:43:04 +0200 Stefan Kost + + * gst/avi/gstavidemux.c: + * gst/wavparse/gstwavparse.c: + avi,wav: also handle JUNQ chunk in addition to JUNK + +2010-02-04 15:59:25 +0100 Wim Taymans + + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdvpay.c: + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpmp2tpay.c: + rtppay: don't ignore result from set_outcaps + set_outcaps can fail and we need to propagate the result upstream. + +2010-02-04 15:36:24 +0100 Wim Taymans + + * gst/flv/gstflvparse.c: + flvparse: fix confusing debug messages + +2010-01-27 13:28:13 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: add some more debug info + +2010-01-27 13:26:46 +0100 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: avoid segfault when shutting down + when we are shutting down, we might still receive state updates from pulseaudio + but since we are unparented we should not do anything with the NULL parent + anymore. + +2010-01-26 18:33:27 +0100 Wim Taymans + + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + videomixer: fix timestamp problems + When the pad with the highest framerate goes EOS, instead of not timestamping + output buffers, intepollate timestamps and durations from the last seen ones. + Fixes #608026 + +2010-02-12 11:32:40 +0100 Sebastian Dröge + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + docs: Update documentation + +2010-02-12 11:18:26 +0100 Sebastian Dröge + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-shapewipe.xml: + * tests/check/Makefile.am: + * tests/examples/Makefile.am: + Moved 'shapewipe' from -bad to -good + Fixes bug #584536. + +2010-02-10 10:52:53 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 29/29] shapewipe: Preserve the input color values in all cases + +2010-02-10 10:50:49 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 28/29] shapewipe: Scale mask alpha values by the source alpha values + +2010-02-10 10:42:32 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 27/29] shapewipe: Fix ARGB processing + +2010-02-10 10:34:24 +0100 Sebastian Dröge + + * tests/examples/shapewipe/shapewipe-example.c: + [MOVED FROM BAD 26/29] shapewipe: Print some more details on error/warning messages + +2010-02-08 08:26:33 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 25/29] shapewipe: Improve/add debug output + +2010-02-08 08:20:44 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 24/29] shapewipe: Always hold the mask mutex before signalling the GCond + +2010-02-08 08:19:48 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 23/29] shapewipe: Move chain function error cases at the end of the function and add useful debug output + +2010-02-08 08:12:11 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + * gst/shapewipe/gstshapewipe.h: + [MOVED FROM BAD 22/29] shapewipe: Fix race condition during shutdown that can lead to a deadlock + +2010-02-08 08:11:33 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 21/29] shapewipe: Drop mask buffer on FLUSH events + +2010-02-08 08:09:55 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + * gst/shapewipe/gstshapewipe.h: + [MOVED FROM BAD 20/29] shapewipe: Update copyright year + +2010-02-08 08:08:44 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 19/29] shapewipe: Don't reset properties when going PAUSED->READY + Also use defines for the default values of the properties. + +2010-01-16 16:52:11 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 18/29] shapewipe: Replace floating point arithmetic in the inner processing loops by integer arithmetic + +2009-12-10 10:40:10 +0100 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 17/29] shapewipe: Don't do pointer dereferences in the processing loop + Lowers the time taken there in my testcase from 6.91% to 6.20% + as measured by callgrind. + +2009-07-08 17:59:29 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 16/29] shapewipe: Add BGRA support for video in/output + +2009-07-02 11:24:48 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + * gst/shapewipe/gstshapewipe.h: + [MOVED FROM BAD 15/29] shapewipe: Add support for ARGB video input/output + +2009-06-23 18:23:13 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 14/29] shapewipe: Correctly handle 0/1 fps + +2009-06-09 19:14:41 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + * gst/shapewipe/gstshapewipe.h: + [MOVED FROM BAD 13/29] shapewipe: Implement basic QoS + This change is based on Tim's QoS implementation + for jpegdec. + +2009-06-09 18:45:19 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 12/29] shapewipe: Proxy queries on the video pads to the correct peers + +2009-06-09 18:37:43 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 11/29] shapewipe: Proxy bufferalloc on the video sinkpad + +2009-06-09 18:25:13 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 10/29] shapewipe: Try to work inplace if possible + This saves one new, large allocation per frame for the + most cases. + +2009-06-04 08:56:14 +0200 Sebastian Dröge + + * tests/check/elements/shapewipe.c: + [MOVED FROM BAD 09/29] shapewipe: Increase timeout of the unit test + +2009-06-01 21:24:27 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 08/29] shapewipe: Fix some issues that were exposed by the new unit test + +2009-06-01 21:24:12 +0200 Sebastian Dröge + + * tests/check/elements/shapewipe.c: + [MOVED FROM BAD 07/29] shapewipe: Add unit test for shapewipe + +2009-05-31 21:33:01 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 06/29] shapewipe: Add documentation and integrate into the build system + +2009-05-29 21:07:26 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + [MOVED FROM BAD 05/29] shapewipe: Adjust border to still have everything transparent at 1.0 and the other way around + +2009-05-29 16:55:25 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + * tests/examples/shapewipe/shapewipe-example.c: + [MOVED FROM BAD 04/29] shapewipe: Divide the border value by two, otherwise we use a twice a wide border + +2009-05-29 16:51:50 +0200 Sebastian Dröge + + * gst/shapewipe/gstshapewipe.c: + * gst/shapewipe/gstshapewipe.h: + * tests/examples/shapewipe/shapewipe-example.c: + [MOVED FROM BAD 03/29] shapewipe: Add border property to allow smooth borders + ...and use a border of 0.01 in the example application. + +2009-05-29 16:00:16 +0200 Sebastian Dröge + + * tests/examples/shapewipe/Makefile.am: + [MOVED FROM BAD 02/29] shapewipe: Fix Makefile of the example application + +2009-05-29 15:32:24 +0200 Sebastian Dröge + + * gst/shapewipe/Makefile.am: + * gst/shapewipe/gstshapewipe.c: + * gst/shapewipe/gstshapewipe.h: + * tests/examples/shapewipe/Makefile.am: + * tests/examples/shapewipe/shapewipe-example.c: + [MOVED FROM BAD 01/29] shapewipe: Add a simple shapewipe transition filter & example application + +2010-02-06 18:19:27 +0100 Sebastian Dröge + + * ext/flac/gstflacdec.c: + flacdec: Only flush the FLAC decoder if it wasn't created right before + If the FLAC decoder is flushed, its state will be set to frame-sync mode, + which will sync to the next *audio* frame and makes it ignore all headers. + This prevented tags and everything else to show up when using flacdec + in push mode. + Fixes bug #608843. + +2010-02-11 01:12:15 +0000 Tim-Philipp Müller + + * MAINTAINERS: + Update MAINTAINERS + +2010-02-12 00:03:09 +0000 Tim-Philipp Müller + + * configure.ac: + configure: back to development + Slushy freeze remains in effect. + +=== release 0.10.18 === + +2010-02-10 23:18:22 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.18 + +2010-02-10 23:17:21 +0000 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2010-02-10 20:36:56 +0000 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: temporary safety check to avoid crashes with a certain file + Add temporary check to avoid crashes with a certain file when seeking + until the real cause of this is figured out. See #609405. + +2010-02-05 18:05:39 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: skip unknown atoms when looking for moov + Fixes bug #609107 + +2010-02-05 02:13:33 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.17.3 pre-release + +2010-02-04 19:10:36 +0000 Tim-Philipp Müller + + * po/bg.po: + * po/hu.po: + po: update translations + +2010-02-04 14:46:56 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: Set the segment start time to the requested seek time for non-keyframe seeks + +2010-02-04 12:00:03 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix time returned for index at a byte offset + The logic for searching forwards/backwards was swapped + +2010-02-01 19:22:24 +0100 Mark Nauwelaerts + + * ext/speex/gstspeexdec.c: + speexdec: initialize stereo decoding state + +2010-01-28 18:58:08 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: improve stream synchronization + In particular, do not make it send newsegment updates that + sort-of contradict the indented playback segment (e.g. start time). + +2010-01-28 18:53:18 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: fix bridging (time) gaps in streams + As a side effect, avoid sending newsegment updates with start times + that go back and forth, which leads to bogus downstream running_time. + Also fixes seeking in bug #606744. + +2010-01-28 18:49:57 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: fix stream synchronization + .. by initializing streams starting at 0, as that is basically + where we 'seek to' at the start and assume streams to start elsewhere. + Also enables newsegment update events for subtitle streams. + +2010-02-02 13:41:03 +0200 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + jpeg: don't directly access message, some message have args + This caused bogus messages, such as reported in bug #607471. + +2010-02-02 00:02:34 +0000 David Hoyt + + * ext/libpng/gstpngdec.c: + png: fix compilation with libpng 1.4 + png_set_gray_1_2_4_to_8() has been deprecated for a while and was + finally removed in libpng 1.4.x. Use png_set_expand_gray_1_2_4_to_8() + instead. + Fixes #608629. + +2010-02-01 16:46:36 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: free transports on errors + See #608564 + +2010-02-01 09:18:53 +0000 Tim-Philipp Müller + + * sys/v4l2/v4l2_calls.c: + v4l2: fix unportable printf format + +2010-01-30 15:18:48 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 15d47a6 to 96dc793 + +2010-01-27 17:53:07 +0100 Robert Swain + + * gst/flv/gstflvmux.c: + flvmux: index timestamps should be in seconds, not milliseconds + +2010-01-27 15:24:52 +0100 Mark Nauwelaerts + + * ext/speex/gstspeexdec.c: + speexdec: free some more when resetting + Fixes #608255. + +2010-01-27 15:24:24 +0100 Mark Nauwelaerts + + * gst/rtp/gstrtpspeexpay.c: + rtpspeexpay: fix occasional buffer leak + Fixes #608255. + +2010-01-27 15:22:46 +0100 Mark Nauwelaerts + + * ext/speex/gstspeexenc.c: + speexenc: prevent invalid arithmetic if not setup yet + Fixes #608255. + +2010-01-27 16:34:21 +0100 Sebastian Dröge + + * gst/videomixer/blend_mmx.h: + videomixer: Fix assembly register constraints + Fixes bug #608209. + +2010-01-27 01:56:03 +0000 Tim-Philipp Müller + + * configure.ac: + * win32/common/config.h: + 0.10.17.2 pre-release + +2010-01-27 01:52:59 +0000 Tim-Philipp Müller + + * po/LINGUAS: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + po: update translations + +2010-01-27 01:49:49 +0000 Tim-Philipp Müller + + * tests/check/elements/.gitignore: + checks: ignore deinterlace check binary + +2010-01-27 01:18:51 +0000 Tim-Philipp Müller + + * configure.ac: + configure: purge all mention of CVS + +2010-01-26 11:18:28 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: ignore streams that finished + When we receive an UNEXPECTED from a stream, move to the next stream and only go + EOS when all streams are EOS. When selecting a stream to push, ignore streams + that went EOS. + Fixes #607949 + +2010-01-25 17:23:43 +0200 Stefan Kost + + * sys/v4l2/v4l2src_calls.c: + v4l2src: don't deref NULL + Error out when the pool gets shutdown. + +2010-01-25 17:21:13 +0200 Stefan Kost + + * ext/jpeg/gstjpegenc.c: + * sys/v4l2/v4l2src_calls.c: + * tests/check/Makefile.am: + Revert "v4l2src: don't deref NULL" + This reverts commit 3d9d34bd60faeb940b36d992a47168fc895036ba. + +2010-01-25 14:16:22 +0200 Stefan Kost + + * ext/jpeg/gstjpegenc.c: + * sys/v4l2/v4l2src_calls.c: + * tests/check/Makefile.am: + v4l2src: don't deref NULL + Error out when the pool gets shutdown. + +2010-01-23 15:32:48 -0800 Michael Smith + + * ext/jpeg/gstjpegenc.c: + jpegenc: when creating an overflow buffer, copy timestamps. + +2010-01-23 14:47:55 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: dmb1 is a valid fourcc for Motion-JPEG + +2010-01-23 14:20:02 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdeux: IV32 is also used for Indeo 3 video streams + +2010-01-22 16:48:01 +0200 Stefan Kost + + * tests/icles/ximagesrc-test.c: + build: no unused variables when disabling asserts + +2010-01-21 23:17:40 -0300 Roland Krikava + + * gst/qtdemux/qtdemux.c: + qtdemux: Avoid negative overflow on keyframe search + Do not overflow negatively when searching a previous + "keyframe" on audio streams. Could cause infinite loops + on backwards playback + Fixes #607718 + +2010-01-21 17:22:38 -0800 Peter van Hardenberg + + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstjpegenc.h: + jpegenc: enlarge buffer if libjpeg tells us it's out of space. Fixes buffer overflow on some high-quality, low-resolution jpeg encodes. + +2010-01-21 19:24:22 +0100 Alessandro Decina + + * gst/qtdemux/qtdemux.c: + qtdemux: fix compiler warnings under OS X. + +2010-01-21 17:57:36 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: don't parse NULL indexes + for some streams we might fail to fetch the index offsets. Don't try to parse + NULL indexes in those cases. + +2010-01-18 21:15:51 -0500 Olivier Crête + + * gst/rtp/gstrtpg729pay.c: + rtpg729pay: ptime should is in nanoseconds + https://bugzilla.gnome.org/show_bug.cgi?id=607403 + +2010-01-20 15:11:15 -0300 Thiago Santos + + * gst/wavenc/gstwavenc.c: + * gst/wavenc/gstwavenc.h: + wavenc: Post warning if file isnt finished properly + When the pipeline is shut down and the file isn't + finished properly, wavenc should post a warning. + Fixes #607440 + +2009-05-27 13:51:44 +0200 Arnout Vandecappelle + + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroskamux: make index size configurable. + Added the 'min-index-interval' property to matroskamux, + which determines how much time (nanoseconds) is left + between keyframes stored in the index. + Fixes #583985. + +2010-01-20 16:28:31 +0100 Wim Taymans + + * gst/rtp/gstrtph264pay.c: + rtph264pay: scale spspps_interval to milliseconds + The spspps_interval is kept in seconds. Convert it to milliseconds before + comparing it to another value in milliseconds. + +2010-01-20 15:18:47 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: always keep media segments within total duration + ... as opposed to only doing so following a seek. + +2010-01-20 15:44:40 +0100 Wim Taymans + + * gst/rtp/gstrtph264pay.c: + rtph264pay: rename spspps-interval property + Rename the spspps-interval property to config-interval because it is nicer. + +2010-01-19 18:37:31 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: skip RIFF and index in push mode + When we are in push mode, we can encounter RIFF and idx tags in the data chunk + when we are dealing with ODML files. In these cases, simply skip the chunks and + continue streaming instead of going EOS. + +2010-01-20 11:27:23 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: more DISCONT handling + Add some debug in the DISCONT handling code. + When we receive a DISCONT in push mode, mark all streams as DISCONT. + +2010-01-20 11:26:34 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: reset on flush events + When we receive a flush event on the sinkpad, reset the EOS state and the + flowreturn of all streams. Also mark the streams with a DISCONT. + +2010-01-20 11:22:04 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: rename some variable + Rename the seek_event variable to seg_event because it really contains the + newsegment event that needs to be pushed. + +2010-01-20 00:54:03 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 14cec89 to 15d47a6 + +2010-01-18 14:49:26 -0500 Olivier Crête + + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + rtph264pay: Don't set profile-level-id in out caps + The profile-level-id represents restrictions on what can be sent, it does not + describe the stream. So it should be reflected in the sink caps of the + payloader, not the src caps. + https://bugzilla.gnome.org/show_bug.cgi?id=607353 + +2010-01-18 14:41:10 -0500 Olivier Crête + + * gst/rtp/gstrtph264pay.c: + rtph264pay: Don't ignore the return value from set_outcaps + https://bugzilla.gnome.org/show_bug.cgi?id=607353 + +2010-01-18 17:43:41 +0100 Sebastian Dröge + + * gst/deinterlace/tvtime/greedyhmacros.h: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/tomsmocomp.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + deinterlace: Fix license and copyright headers + +2010-01-18 14:57:42 +0200 Stefan Kost + + * sys/v4l2/gstv4l2bufferpool.h: + v4l2: move G_END_DECLS to the end + +2010-01-18 14:55:38 +0200 Stefan Kost + + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/gstv4l2bufferpool.h: + v4l2: fix bufferpool file names in header comment + +2010-01-15 18:15:14 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: avoid some typecasting + +2010-01-15 18:13:24 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: avoid some type checks + +2010-01-15 18:09:15 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: fallback to avih duration + when we have not yet parsed the indexes (in push mode, for example) use + the duration as given in the avih header instead of -1. + +2010-01-15 13:32:32 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: g_free is NULL safe + +2010-01-15 13:27:40 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: use DEMUX errors, instead of DECODE + qtdemux should use DEMUX errors, and not DECODE + Conflicts: + gst/qtdemux/qtdemux.c + +2010-01-14 19:16:19 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Minor refactor + Replace repeated code with a function call + +2010-01-14 17:11:13 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: Handle another kind of redirect trak + Some traks might contain a redirect rtsp uri inside + hndl atom (which is a dref atom entry). This commit makes qtdemux + post a message when it finds one of these traks and there are + no other traks. + Fixes #597497 + +2010-01-14 16:13:08 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: Post error when reaching EOS without pads + Post an error when EOS is reached and there are no src pads + +2010-01-14 14:13:50 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Do not post empty redirect messages + Some misinterpreted data could result in posting redirect messages + with empty redirect strings. It is better not to post them. + An example is the file on bug #597497 + +2010-01-14 18:19:25 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: polish last buffer end time usage + That is, reset it upon seek, and note that (rarely) last pushed buffer + time might precede segment start. + +2010-01-13 16:48:46 +0200 Stefan Kost + + * gst/videomixer/blend_mmx.h: + videomixer: use 'q' constraint instead of 'r' + This avoids the "bad register name `%dil'" compilation errors on 32bit where + because of 'r' gcc puts the value in a general purpose register and then tries + to access the lower part as %dil/%sil which is not existing on 32bit. 'q' requests + a-d registers + +2010-01-13 16:44:58 +0200 Stefan Kost + + * gst/avi/gstavidemux.c: + avi: add missing include for sscanf + +2010-01-13 09:36:03 +0100 Sebastian Dröge + + * gst/equalizer/gstiirequalizer10bands.c: + equalizer: Fix property description for the 3rd band of the 10band equalizer + The frequency is actually 237 Hz, not 227 Hz. + Fixes bug #606692. + +2010-01-13 09:22:20 +0100 Kipp Cannon + + * gst/audiofx/audioamplify.c: + audioamplify: Allow negative amplifications + Fixes bug #606807. + +2010-01-13 09:17:05 +0100 Sebastian Dröge + + * ext/taglib/gstapev2mux.cc: + apev2mux: Don't call constructors directly, this leads to compiler errors with gcc 4.5 + +2010-01-12 17:39:05 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: use G_GSIZE_FORMAT for platform independent gsize qualifier + Fixes build on macosx + +2010-01-11 19:02:34 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: refactor eos sending when pausing loop + Also, prevent hanging if no pads yet on which to send eos by + posting a message instead. + +2010-01-11 17:50:35 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: standardize seek handling + ... which implies fixing some corner cases. + +2010-01-11 15:14:06 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskamux: use more generic xiphN_streamheader_to_codecdata helper + +2010-01-11 17:50:04 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-mux.c: + matroskamux: reflow audio and video setcaps and improve logging + Also ensure width and height are available as they are mandatory + in matroska specs. + +2010-01-11 11:42:43 -0800 Michael Smith + + * gst/qtdemux/qtdemux.c: + qtdemux: fix offset for type 2 mp4a sound sample descriptions. + Allows us to correctly find the esds (and thus the codec data) for such + mp4a files. + +2010-01-11 15:45:49 -0300 Thiago Santos + + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + rtpmp4g(de)pay: Only handle raw aac + rtpmp4g(de)pay should only handle raw AAC streams + +2010-01-11 18:59:43 +0100 Sebastian Dröge + + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + videomixer: Implement basic QoS + This drops frames if they're too late anyway before blending and all + that starts but QoS events are not forwarded upstream. In the future + the QoS events should be transformed somehow and forwarded upstream. + +2010-01-11 14:48:26 -0300 Thiago Santos + + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpmp4apay.c: + rtpmp4a(de)pay: Only accept raw aac + rtpmp4a(de)pay should only handle raw aac to conform to the RFC + +2010-01-11 18:35:47 +0100 Sebastian Dröge + + * gst/videomixer/blend.c: + * gst/videomixer/blend_mmx.h: + videomixer: Add MMX implementations for I420 and all non-alpha RGB formats + +2010-01-04 10:24:45 +0100 Sebastian Dröge + + * gst/videomixer/Makefile.am: + * gst/videomixer/blend.c: + * gst/videomixer/blend.h: + * gst/videomixer/blend_ayuv.c: + * gst/videomixer/blend_bgra.c: + * gst/videomixer/blend_i420.c: + * gst/videomixer/blend_mmx.h: + * gst/videomixer/blend_rgb.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + videomixer: Refactor processing functions + This allows easier plugging of optimized processing functions + in the future, like for SSE or AltiVec. + +2010-01-11 13:26:32 -0300 Thiago Santos + + * gst/avi/gstavimux.c: + * gst/matroska/matroska-mux.c: + avimux: matroskamux: rename aac's stream-format to raw + AAC's none stream-format has been renamed to raw, rename + on avimux and matroskamux as well + +2010-01-11 12:07:29 -0300 Thiago Santos + + * gst/matroska/matroska-mux.c: + matroskamux: Only accept raw aac + makes matroskamux reject aac streams that are not + in raw format (stream-format=none) + Fixes #598350 + +2010-01-11 12:08:55 -0300 Thiago Santos + + * gst/avi/gstavimux.c: + avimux: Only accept raw aac + makes avimux reject aac streams that are not + in raw format (stream-format=none) + Fixes #598350 + +2010-01-11 10:38:10 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Oops. The gpointer cast is needed because of the const qualifiers on the data elements + +2010-01-11 10:17:54 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Debug -> info level for a message for benchmarking index parsing + The extra message output at higher levels affects the accuracy of the + benchmark. + +2010-01-11 10:05:10 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Don't check for NULL pointers or cast to gpointer as this is not needed + +2010-01-08 13:55:05 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Refactor stbl sub-atom freeing. Free when index has been completely parsed. + +2010-01-08 14:32:06 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Avoid whitespace commits due to inconsistent GNU indent behaviour + +2010-01-11 00:10:34 +0000 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: remove newline at end of debug statement + +2010-01-08 19:26:21 +0100 Havard Graff + + * gst/udp/gstmultiudpsink.c: + multiudpsink: Compiler warning fixes for Windows + Just simple missing casts + Fixes bug #606438. + +2010-01-08 18:04:14 +0100 Mark Nauwelaerts + + * ext/flac/gstflacenc.c: + flacenc: fix seekpoints property copy-and-paste documentation + +2010-01-06 17:06:53 +0100 Mark Nauwelaerts + + * ext/flac/gstflacenc.c: + * ext/flac/gstflacenc.h: + flacenc: optionally add a seek table + API: GstFlacEnc:seekpoints + Fixes #351595. + +2010-01-08 11:33:02 -0300 Thiago Santos + + * gst/avi/gstavidemux.c: + avidemux: Use more glib and be safer + Be safer on sscanf by limiting string format sizes. + Remove useless parameter and use g_strndup. + +2010-01-08 10:44:44 -0300 Thiago Santos + + * gst/avi/gstavidemux.c: + avidemux: Simplifying code + Greatly simplify the IDIT chunk handling by using sscanf + instead of 'manually' parsing. Also replaces strncasecmp and + is_alpha/is_digit with glib versions. + +2010-01-08 10:18:30 -0300 Thiago Santos + + * gst/avi/gstavidemux.c: + avidemux: it's feb for february + Fix typo in last commit. + +2010-01-08 09:17:22 -0300 Thiago Santos + + * gst/avi/gstavidemux.c: + avidemux: Parse and post IDIT dates + Parses and post date tags contained in IDIT chunks. + Fixes #503582 + +2010-01-07 17:25:05 +0100 Sebastian Dröge + + * gst/audiofx/audiofirfilter.c: + * gst/audiofx/audiofxbasefirfilter.c: + * gst/audiofx/audiofxbasefirfilter.h: + audiofxbasefirfilter: Add property for not draining the history on kernel changes + Currently this only works if the kernel size doesn't change, in the future + it will be possible to change the kernel size too without draining + the complete history and without loosing anything. + Partially based on a patch by + Thiago Santos + +2010-01-07 16:58:55 +0100 Wim Taymans + + * gst/rtp/gstrtph264pay.c: + rtph264pay: remove weird memcmp code + Use plain memcmp for comparing memory instead of the custom buggy one. + Fixes #606198 + +2010-01-07 15:38:36 +0100 Edward Hervey + + * gst/level/gstlevel.c: + level: fix typo in 'message' property description + +2010-01-06 14:06:14 +0100 Mark Nauwelaerts + + * ext/flac/gstflacdec.c: + flacdec: really use upstream timestamp if there is one + See/fixes #603471. + +2010-01-06 13:45:59 +0100 Wim Taymans + + * gst/rtp/gstrtpg729pay.c: + rtpg728pay: remove unused adapter peek + +2010-01-05 19:00:35 -0300 Thiago Santos + + * tests/check/elements/deinterlace.c: + deinterlace: Improve passthrough tests + Improve passthrough tests by forcing more specific + interlaced/deinterlaced caps to be tested + +2010-01-05 18:22:49 -0300 Thiago Santos + + * tests/check/elements/deinterlace.c: + deinterlace: Adds some docs to the new tests + Adds some docs explaining the utility functions of the check + tests of deinterlace + +2010-01-05 18:14:08 -0300 Thiago Santos + + * tests/check/elements/deinterlace.c: + deinterlace: Adds tests for passthrough + Adds tests for checking if the element really does + passthrough in disabled mode and in auto (if the input is + not interlaced) + +2010-01-05 07:50:51 -0300 Thiago Santos + + * tests/check/Makefile.am: + * tests/check/elements/deinterlace.c: + deinterlace: Adds tests for caps acceptance + Adds check unit tests for deinterlace for validating + caps accepting and the expected caps output on the + other pad + +2010-01-04 13:43:00 -0300 Thiago Santos + + * tests/check/Makefile.am: + * tests/check/elements/deinterlace.c: + deinterlace: Adds basic check test + Adds a basic check test for deinterlace element + +2010-01-04 15:44:28 -0800 Michael Smith + + * gst/qtdemux/Makefile.am: + * gst/qtdemux/qtdemux.c: + qtdemux: Add support for wave-style audio in qt. + Uses gstriff to parse the wave headers appropriately. Tested with MS-ADPCM + content. + +2009-12-31 17:09:03 -0500 Olivier Crête + + * tests/check/elements/rtp-payloading.c: + tests: Add G.729 RTP payloader/depayloader test + https://bugzilla.gnome.org/show_bug.cgi?id=606050 + +2009-12-31 16:52:30 -0500 Olivier Crête + + * gst/rtp/gstrtpg729pay.c: + rtpg729pay: Simplify adapter usage + https://bugzilla.gnome.org/show_bug.cgi?id=606050 + +2009-12-31 16:27:30 -0500 Olivier Crête + + * gst/rtp/gstrtpg729pay.c: + rtpg729pay: Support ptime from caps + https://bugzilla.gnome.org/show_bug.cgi?id=606050 + +2009-12-02 19:35:21 +0530 Olivier Crête + + * gst/rtp/README: + rtp: Add maxptime to the README + https://bugzilla.gnome.org/show_bug.cgi?id=606050 + +2010-01-05 19:03:06 +0100 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpg723depay.c: + * gst/rtp/gstrtpg723depay.h: + rtpg723depay: add G723 depayloader + +2010-01-05 19:02:39 +0100 Wim Taymans + + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729depay.h: + rtpg729depay: remove unused variable + +2010-01-05 18:33:25 +0100 Wim Taymans + + * gst/rtp/gstrtpg723pay.c: + * gst/rtp/gstrtpg723pay.h: + rtpg723pay: rewrite payloader + Handle all 3 packet sizes according to RFC 3551. + Totally untested, we don't have a G723 encoder. + Fixes #605882 + +2010-01-05 11:47:20 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: fix chunk counter + +2010-01-04 19:44:53 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: more work at reducing loop overhead + Try to avoid derefs when parsing the index. Save the state into the structures + when we exit the loop instead of for each iteration. + +2010-01-04 16:33:30 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: cleanups and make duration more accurate + Make the QtDemuxSample struct smaller by keeping the duration and the pts_offset + as their 32 bit values. + Make some macros to calculate PTS, DTS and duration of a sample. + Deref the sample index less often by keeping a ref to the sample we're dealing + with. + +2010-01-04 13:41:18 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: simplify logic to calculate duration + Since we no longer store the timestamp and duration in nanoseconds, we can now + simply store the duration as-is. + +2010-01-01 16:42:57 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Store timestamps in mov format in the index + This allows faster building of the index upon seeks so that scaling of + timestamps only occurs when actually needed. + +2009-12-18 13:54:46 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: make seeking in push mode work + Move sample position checks into qtdemux_parse_samples where we can protect it + with a lock. + Refactor and make an qtdemux_ensure_index function. + Rename qtdemux_do_push_seek to qtdemux_seek_offset in order to avoid confusion + with gst_qtdemux_do_push_seek. + +2009-12-18 12:44:27 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: move error code out of normal flow + +2009-11-24 16:27:26 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: Add push mode seek support for seeking to obtain the moov atom + +2010-01-05 12:22:09 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix on-npt-stop signal warnings for RDT + The RDT manager does not implement this signal so we need to check for it before + trying to connect to it. + +2010-01-05 09:47:00 +0000 Tim-Philipp Müller + + * sys/v4l2/gstv4l2src.c: + v4l2src: fix memory leak in new uri handler code + Don't leak a string everytime get_uri() is called and a device + has been set. There's a limited number of devices, so just + intern the string instead of doing more elaborate housekeeping + and storing it in the instance struct or so. + +2010-01-01 14:10:49 +0200 Stefan Kost + + * gst/avi/gstavimux.c: + avimux: fix typo in warning message + +2010-01-04 09:28:36 -0300 Robert Weidlich + + * ext/shout2/gstshout2.c: + * ext/shout2/gstshout2.h: + shout2send: Add 'public' property + Adds a property to set 'public' flag on libshout, making + the stream listed on the server's stream directory. + Fixes #605269 + +2009-12-30 14:14:55 +0530 Arun Raghavan + + * gst/qtdemux/qtdemux.c: + qtdemux: Add tags for average and maximum bitrate + Fixes #599300. + +2009-12-26 16:59:14 -0300 Thiago Santos + + * gst/audiofx/audiofxbasefirfilter.c: + audiofxbasefirfilter: do not try to alloc really large buffers + When nsamples_out is larger than nsamples_in, using unsigned + ints lead to a overflow and the resulting value is wrong and + way too large for allocating a buffer. Use signed integers + and returning immediatelly when that happens. + +2009-12-25 12:38:35 +0100 Wim Taymans + + * gst/videomixer/blend_ayuv.c: + videomixer: optimize blend code some more + Use more efficient formula that uses less multiplies. + Reduce the amount of scalar code, use MMX to calculate the desired + alpha value. + Unroll and handle 2 pixels in one iteration for improved pairing. + +2009-12-24 22:59:09 +0100 Wim Taymans + + * gst/videomixer/blend_ayuv.c: + * gst/videomixer/blend_bgra.c: + * gst/videomixer/blend_i420.c: + * gst/videomixer/blend_rgb.c: + videomixer: scale and clamp + Scale and clamp to the max alpha values. + +2009-12-24 22:50:31 +0100 Wim Taymans + + * gst/alpha/gstalpha.c: + alpha: scale and clamp alpha to its full extend + Convert the alpha value to 0->255 when setting and to 0->256 when using as + a scaling factor. This makes sure we can reach the full opacity value of 0xff in + all cases. + +2009-12-24 22:23:01 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix some comments, remove property check + Fix some comments, clarify some FIXMEs + Remove the on-ntp-stop signal check now that the jitterbuffer is in + -good and we know that it supports this signal. + +2009-12-24 20:27:57 +0100 Wim Taymans + + * gst/videomixer/videomixer.c: + videomixer: some trivial cleanups + +2009-12-24 17:04:28 -0300 Thiago Santos + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Parse all rtpinfo entries + Do not forget to parse all rtp-info entries, instead of + parsing the first one only. + Fixes #605222 + +2009-12-22 12:44:50 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: perf tag should map to GST_TAG_ARTIST + +2009-12-24 17:03:02 +0100 Wim Taymans + + * gst/interleave/interleave.c: + interleave: fix weird indentation + +2009-12-24 17:01:54 +0100 Wim Taymans + + * gst/rtp/gstrtph263ppay.c: + rtph263ppay: use faster _adapter_copy() whem possible + +2009-12-24 17:01:15 +0100 Wim Taymans + + * tests/examples/audiofx/firfilter-example.c: + tests: use right type when passing vararg value + +2009-12-23 17:50:34 +0100 Mark Nauwelaerts + + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + flacdec: use a single decoder field for both push and pull mode + +2009-12-23 17:03:32 +0100 Mark Nauwelaerts + + * ext/flac/gstflacdec.c: + flacdec: fix possible hanging in pull mode seeking + A seek in multi-sink pipeline typically leads to several seek events in a row, + which could lead to sending several newsegments in a row without intermediate + flushing. These would then accumulate, distort rendering times and as such + lead to 'hanging'. + +2009-12-23 19:39:05 +0100 Mark Nauwelaerts + + * gst/rtp/gstrtph264pay.c: + rtph264pay: fix uninitialized variable + +2009-12-23 13:09:54 +0100 Wim Taymans + + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpbvpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263depay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpqdmdepay.c: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbispay.c: + * gst/rtp/gstrtpvrawdepay.c: + * gst/rtp/gstrtpvrawpay.c: + rtp: use boilerplate + +2009-12-23 00:38:05 +0100 Wim Taymans + + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpL16pay.h: + rtpL16pay: convert to baseaudiopayload + Use GstRTPBaseAudioPayload as the base class. This saves a lot of code and fixes + a bunch of problems that were already solved in the base class. + Fixes #853367 + +2009-12-23 00:30:49 +0100 Wim Taymans + + * gst/rtp/gstrtppcmapay.c: + rtppcmapay: the boilerplate macro sets parent_class + +2009-12-22 22:27:21 +0100 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpbin: avoid some structure copies + Don't make copied in the getter and setter for SDES in the RTPSource. This + avoids a couple of copies of the SDES structure when generating RTCP + packets. + +2009-08-31 18:42:25 +0200 Pascal Buhler + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpmanager: improve SDES handling + Store SDES internally as a struct to support multiple PRIV values. + Include all values set in SDES struct when sending RTCP SDES. + +2009-12-22 14:41:35 +0100 Wim Taymans + + * gst/rtp/gstrtph263depay.c: + rtph263depay: add some fixmes + +2009-12-22 14:35:13 +0100 Wim Taymans + + * gst/rtp/gstrtph263depay.c: + rtph263depay: baseclass handles timestamps for us + +2009-12-22 14:27:40 +0100 Wim Taymans + + * gst/rtp/gstrtph263depay.c: + rtph263depay: reset start variable properly + +2009-05-29 15:49:27 +0300 Marco Ballesio + + * gst/rtp/gstrtph263depay.c: + * gst/rtp/gstrtph263depay.h: + Drop the whole frame if a packet is lost. + Fixes #582575 + +2009-12-21 20:39:53 +0100 Wim Taymans + + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + rtph264pay: add option to insert PPS/SPS in streams + Add a new spspps-interval property to instruct the payloader to insert + SPS and PPS at periodic intervals in the stream. + Rework the SPS/PPS handling so that bytestream and AVC sample code both use the + same code paths to handle sprop-parameter-sets. This also allows to have the AVC + code to insert SPS/PPS like the bytestream code. + Fixes #604913 + +2009-12-21 19:12:22 +0100 Mark Nauwelaerts + + * common: + Automatic update of common submodule + From 47cb23a to 14cec89 + +2009-12-21 12:01:53 -0300 Jonathan Conder + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + qtdemux: Adds new tags + Adds some new tags mapping to qtdemux. + Fixes #599759 + +2009-12-21 15:05:09 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: add property to remove pads automatically + Add a property called autoremove to automatically remove the pads of sources + that timed out. + Fixes #554839 + +2009-12-21 14:55:16 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpssrcdemux.c: + ssrcdemux: fix comparison + A NULL means no pad was found. + +2009-11-08 11:49:14 +0100 Edward Hervey + + * sys/v4l2/gstv4l2src.c: + v4l2src: Add GstURIHandler interface. Fixes #601143 + This allows using v4l2://[] + +2009-12-20 17:24:47 -0800 Michael Smith + + * gst/udp/gstmultiudpsink.c: + multiudpsink: pass length parameter to g_convert + +2009-12-18 12:44:50 +0100 Edward Hervey + + * gst/matroska/matroska-demux.c: + matroska: Fix unitialized variable. + Yes, it's stupid, but macosx compilers are even more stupid. + +2009-12-17 16:01:25 +0100 Sebastian Dröge + + * gst/videomixer/blend_ayuv.c: + videomixer: Fix assembly compilation on x86 + Fixes bug #604814. + +2009-12-17 17:37:03 +0100 Branko Čibej + + * gst/replaygain/rganalysis.c: + rganalysis: fix timestamp rounding + Use scaling function to round and avoid overflows. + Fixes #604352 + +2009-12-17 17:27:42 +0100 Tiago Katcipis + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpg723pay.c: + * gst/rtp/gstrtpg723pay.h: + rtp: add G723 payloader + Fixes #597823 + +2009-12-17 16:22:56 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_types.c: + qtdemux: Fix ALAC codec_data parsing + Fixes #604611 + +2009-12-16 17:28:30 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Remove cpp style coments + Removes // comments and replace them with /* */ comments + +2009-12-16 12:48:02 +0100 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: also consider BlockNumber indicated in index when seeking + +2009-12-16 12:43:27 +0100 Mark Nauwelaerts + + * gst/matroska/ebml-read.c: + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: support push based mode + Fixes #598610. + +2009-12-16 12:44:36 +0100 Mark Nauwelaerts + + * gst/matroska/ebml-read.c: + matroskademux: fix ebml read cache usage + +2009-12-16 10:50:32 +0100 Sebastian Dröge + + * gst/videomixer/blend_ayuv.c: + videomixer: Use movzbl instead of movzxb for moving one byte to a l register + For some reason latest gcc/binutils accept movzxb here while + movzbl would be correct and is the only thing accepted by older + gcc/binutils. + Fixes bug #604679. + +2009-12-16 06:59:01 +0100 Sebastian Dröge + + * gst/videomixer/blend_ayuv.c: + videomixer: src/dest are input and output of the AYUV blending MMX assembler + +2009-12-15 18:18:54 +0100 Sebastian Dröge + + * gst/audiofx/audiowsincband.c: + audiowsincband: Use the same upper length limit as audiowsinclimit + +2009-12-12 17:00:50 +0100 Sebastian Dröge + + * gst/audiofx/audiowsincband.c: + * gst/audiofx/audiowsinclimit.c: + audiowsinc{limit,band}: Allow much larger filter lengths now + +2009-12-11 12:27:32 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + audiofxbasefirfilter: Fix frequency response calculation + +2009-12-08 14:57:02 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + audiofxbasefirfilter: Remove dead assignments + +2009-12-06 16:58:51 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + audiofxbasefirfilter: Add special processing functions for Mono/Stereo + This provides another 7% speedup for the time domain convolution and 1.5% + speedup for the FFT convolution on Mono input. + This optimization assumes that the compiler simplifies calculations + and conditions on constant numbers and unrolls loops with a constant + number of repeats. + +2009-12-04 09:25:49 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + * gst/audiofx/audiofxbasefirfilter.h: + audiofxbasefirfilter: Add a "low-latency" mode + This will always use time-domain convolution, which lowers the latency. + With FFT convolution it's always a multiple of the kernel length, + with time domain convolution it's only the pre-latency of the filter kernel. + +2009-12-04 09:00:22 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + audiofxbasefirfilter: Remove obsolete TODO comments + +2009-12-03 20:12:01 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + audiofxbasefirfilter: Use samples everywhere instead of samples*channels sometimes + +2009-12-03 17:27:13 +0100 Sebastian Dröge + + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofxbasefirfilter.c: + * gst/audiofx/audiofxbasefirfilter.h: + audiofxbasefirfilter: FFT convolution implementation + This provides a great speedup, especially the relationship between kernel + length and processing size is now logarithmic instead of linear. Below a + kernel size of 32 it's a bit slower, afterwards it's much faster: + 17 0.788000 -> 0.950000 + 33 1.208000 -> 1.146000 + 65 2.166000 -> 1.146000 + ... + 4097 107.444000 -> 1.508000 + For sizes smaller 32 the normal time-domain convolution is chosen, + for larger sizes the FFT convolution is automatically used. + Fixes bug #594381. + +2009-11-27 20:33:14 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + * gst/audiofx/audiofxbasefirfilter.h: + audiofxbasefirfilter: Make most code parts independent of the processing functions and used convolution algorithm + Only remaining part is the residue pushing, which will be fixed later. + +2009-11-26 15:17:27 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + audiofxbasefirfilter: Optimize time-domain convolution + Remove some redundant calculations, move comparisions out of + inner loops, etc. + This makes the convolution about 3 (!) times faster but + processing time is of course still proportional to the + filter size. + +2009-11-26 10:45:37 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + audiofxbasefirfilter: Use _CAST macros in some places and do some calculations only once + +2009-11-25 18:12:05 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + * gst/audiofx/audiofxbasefirfilter.h: + audiofxbasefirfilter: Rewrite timestamp tracking + It's much simpler now and doesn't introduce accumulating rounding + errors. + +2009-11-25 17:39:53 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + * gst/audiofx/audiofxbasefirfilter.h: + audiofxbasefirfilter: Rename some variables and change comments + +2009-11-24 20:06:25 +0100 Sebastian Dröge + + * gst/audiofx/audiofxbasefirfilter.c: + * gst/audiofx/audiofxbasefirfilter.h: + audiofxbasefirfilter: Add const qualifier to the source data array + +2009-12-14 20:08:06 +0100 Sebastian Dröge + + * gst/videomixer/Makefile.am: + * gst/videomixer/blend_ayuv.c: + * gst/videomixer/videomixer.c: + videomixer: Add MMX implementations of the AYUV blending and color filling functions + This provides a 20% speedup for blending and 100% for color filling. + The blending can probably be optimized even more. + +2009-12-13 13:19:43 +0000 Tim-Philipp Müller + + * gst/id3demux/id3v2frames.c: + id3demux: prefer two letter ISO 639-1 code for extended comment + +2009-12-13 13:10:12 +0000 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: fix up language code extraction some more + Quicktime uses ISO 639-2 for language codes, but GST_TAG_LANGUAGE + is supposed to hold a ISO 639-1 code, so convert as needed using + the new API from -base. + See #602126. + +2009-12-13 12:45:22 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + matroska: fix language code writing and extraction + Matroska uses three-letter ISO 639-2B codes, but GST_TAG_LANGUAGE is + supposed to contain two-letter ISO 639-1 codes, so use new language + code mapping functions in -base to convert between those two as + needed. + Fixes #505823. + +2009-12-07 20:54:07 +0000 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: + avidemux: minor debug message changes + Fix up a few debug messages so that it's clearer what they mean. + +2009-12-12 17:44:04 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + Revert "qtdemux: Correctly parse classification tags" + This reverts commit cd883aa60c1133196a6ae052884d15c295c37dde. + Previous code was correct, 4 is due to table and language code, + not only language code + +2009-12-12 16:28:36 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Correctly parse classification tags + In clsf atoms, the language code is 2 bytes long, not 4. + +2009-12-12 16:55:13 +0100 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Dequeue current buffer on FLUSH_STOP and don't unref NULL buffers + ... NULL buffers shouldn't really happen anymore when popping the + buffer from GstCollectPads but better check for this and print a warning. + +2009-12-11 13:11:12 +0100 Sebastian Dröge + + * gst/videomixer/blend_i420.c: + videomixer: Fix stupid mistake in last commit + +2009-12-11 12:35:59 +0100 Sebastian Dröge + + * gst/videomixer/blend_i420.c: + videomixer: Don't do floating point math in the inner processing loop for I420 blending + +2009-12-10 18:43:44 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: handle NULL and empty transport strings + When an RTSP extension returns NULL or an empty transport string, just ignore it + and try to get the next possible transport. Fixes playback of RealMedia streams. + +2009-12-10 18:42:51 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: install event function on internal RTCP pad + Install a custom event function on the internal RTCP pad so that we can reply + TRUE to a latency event. + +2009-12-10 10:48:49 +0100 Sebastian Dröge + + * gst/videomixer/blend_ayuv.c: + * gst/videomixer/blend_bgra.c: + * gst/videomixer/blend_rgb.c: + videomixer: Remove wrong comments, copied from the I420 blend function + +2009-12-09 21:15:07 +0100 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: The queued duration is a signed integer + ...and it will really be negative sometimes. + +2009-12-09 21:03:57 +0100 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Only pop buffers from collectpads after they're fully consumed + This decreases latency and memory usage because new buffers are only + accepted by collectpads if there's no queued buffer. + +2009-12-09 20:42:44 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: Clean up position/duration handling + Also use the last end time for closing the segment, not the + start time of the last buffer. + +2009-12-09 16:50:02 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Close the segment on EOS if the real duration is known + +2009-12-09 16:46:18 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Update duration if current buffer is already after the old duration + +2009-12-09 16:43:41 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Drop buffers that are after segment stop + ...and if this happened for all streams go EOS. + +2009-12-09 16:41:04 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Fix position tracking and sending of filler segments + +2009-12-09 16:15:09 +0100 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Use gst_util_uint64_scale_int() for fps to seconds per frame calculations + +2009-12-08 17:34:15 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Keep the segment stop position for update newsegment events + +2009-12-04 14:42:49 +0100 Sebastian Dröge + + * configure.ac: + * ext/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/ladspa/gstladspa.c: + * ext/ladspa/gstladspa.h: + * ext/ladspa/gstsignalprocessor.c: + * ext/ladspa/gstsignalprocessor.h: + * ext/ladspa/load.c: + * ext/ladspa/search.c: + * ext/ladspa/utils.h: + ladspa: Remove the sources from gst-plugins-good + It's disabled anyway and the latest version of it is in + gst-plugins-bad. Fixes bug #603779. + +2009-12-04 13:50:59 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: init current_entry in push mode + Set the current_entry to 0 (instead of -1) in push mode so that we correctly + calculate the current frame number and timestamp. + Add some more debug info and fic the duration debug. + +2009-12-04 11:14:03 +0000 Tim-Philipp Müller + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix major memory leak when playing back rtsp video streams + Don't forget to unref QoS, navigation and latency events when + dropping them. + +2009-12-03 08:58:08 +0000 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroskademux: only send pending tags with newsegment events + Send pending tags only from the streaming thread, just after we've sent + the newsegment event, not with e.g. flush-start. This not only does the + right thing, but also makes sure we're not trampling over variables set + up in the streaming thread from the seeking thread in case someone tries + to issue a seek just as the demuxer is parsing the headers. + Fixes #601617. Spotted by Ognyan Tonchev. + +2009-12-03 17:49:55 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: fix debug message printf args + Fixes debug message printf format to make it build in mac's gcc + +2009-12-02 13:33:20 -0300 Thiago Santos + + * ext/shout2/gstshout2.c: + shout2: Convert delay correctly + Use GST_MSECOND to convert delay in msecs to nanosecs + Fixes #603547 + +2009-12-01 19:24:02 +0100 Wim Taymans + + * ext/jpeg/gstjpegdec.c: + jpegdec: reset segment info after flush + Reset the segment info after a flush. We use the segment for handling QoS and if + we don't reset the segment, QoS is basically disabled after a flushing seek. + +2009-12-01 15:07:06 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 87bf428 to 47cb23a + +2009-12-01 14:15:46 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From da4c75c to 87bf428 + +2009-11-30 15:59:50 +0100 Aurelien Grimaud + + * gst/rtpmanager/rtpsession.c: + rtpsession: avoid buffer ref/unref pairs for CSRCs + We ref the buffer before pushing it downstream in order to get the CSRCs of it + after pushing. This causes performance problems when downstream elements want to + change the metadata because the buffer needs to be subbuffered. + Instead, read and store the CSRCs of the buffer in an array before pushing it + and process the array after pushing the buffer. This allows us to remove the + ref/unref pair. + Fixes #603376 + +2009-11-28 19:23:26 +0100 Wim Taymans + + * ext/shout2/gstshout2.c: + * ext/shout2/gstshout2.h: + shout2: use gstpoll for timeouts + Use our own GstPoll based timeout instead of the shout sleep so that we can + interrupt when doing a state change and shutting down. + Fixes #602887 + +2009-11-28 12:25:06 +0100 Wim Taymans + + * tests/check/elements/rtpjitterbuffer.c: + check: fix jitterbuffer check + Make sure we set a base_time on the element. + Fix the timeout to at least twice the jitterbuffer latency. + Enable previously failing tests. + Remove impossible checks. + +2009-11-27 18:55:20 +0100 Edward Hervey + + * common: + Automatic update of common submodule + From 53a2485 to da4c75c + +2009-11-26 16:14:30 +0100 Mark Nauwelaerts + + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264depay.h: + rtph264depay: optionally merge NALUs into Access Units + ... which may be expected/desired by some downstream decoders + (and spec-wise highly recommended for at least non-bytestream mode). + +2009-11-26 17:29:03 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix timestamp datatype + +2009-11-25 10:38:23 -0600 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: avoid using wrong clock-rate + Check for a valid clock-rate before attempting to estimate the npt + stop time. + +2009-11-25 10:37:30 -0600 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: fix typo in comments + +2009-11-25 16:05:10 +0200 Stefan Kost + + * tests/check/elements/rtpjitterbuffer.c: + rtpjitterbuffertest: add one more test and file a bug now + CHange the backwards test to always send first buffer first to have a define + basetime. Add another test that sends buffers backwards to assert that only + first sent buffer is keep and used as basetime. Disabled those tests still, + as its not passing/failing consitently and file a bug for jitterbuffer. + +2009-11-25 10:17:34 +0200 Stefan Kost + + * tests/check/elements/rtpjitterbuffer.c: + jitterbuffertest: improve the test + the tests are a bit more solid now but still not produce reliable results. + Wonder if they are still flawky or if its a bug in jitterbuffer. + +2009-11-24 11:13:06 -0800 Michael Smith + + * gst/udp/gstmultiudpsink.c: + multiudpsink: return error message on windows too. + +2009-11-24 10:58:49 -0800 Michael Smith + + * gst/udp/gstmultiudpsink.c: + multiudpsink: first phase of fixing up error reporting for windows. + +2009-10-30 03:13:54 -0300 Thiago Santos + + * gst/avi/gstavimux.c: + avimux: also set the suggested buf size for audio + We were only setting the suggested buf size for video, + we can set it for audio as well. + This and 195e14529d80ef318ce3a778c1995efb11f266cd + fix an issue that prevented seeking on large avi files + on WMP (non-recent versions). + +2009-11-04 16:10:23 -0300 Thiago Santos + + * gst/avi/gstavimux.c: + * gst/avi/gstavimux.h: + avimux: fix indx duration for PCM audio + GstBuffers for PCM audio usually contains more than + 1 sample, we need to get the total number of samples to set + the indx duration. + +2009-11-04 16:04:10 -0300 Thiago Santos + + * gst/avi/gstavimux.c: + avimux: Audio buffers should be picked earlier + Adds a 0.5s advantage for audio buffers to being + picked earlier for muxing. + +2009-11-24 16:40:19 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix push mode by making sure stbl information is available in next_entry_size () + +2009-11-24 16:35:20 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix order of arguments in log message + +2009-11-24 15:51:21 +0200 Stefan Kost + + * ext/jpeg/gstjpegenc.c: + jpegenc: fix spelling in comment + +2009-11-23 17:58:17 +0100 Robert Swain + + * common: + build system: Fix wrongly committed change to common/ + +2009-11-10 10:26:07 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Ease debugging by removing a goto for an error message + +2009-11-14 15:52:09 +0100 Robert Swain + + * common: + * gst/qtdemux/qtdemux.c: + qtdemux: Parse per sample rather than all at once but build complete index when seeking + +2009-11-04 17:31:15 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Save atom data for later use so it doesn't get freed after initial parsing + +2009-11-06 11:00:04 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Parse from the previously parsed sample up to sample n + +2009-11-04 17:04:22 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Make qtdemux_parse_samples () parse up to n samples + +2009-10-28 17:49:02 +0000 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Separate off stbl sub-atom initialisation + +2009-10-26 22:42:36 +0000 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Move variables into context in preparation for refactorisation + +2009-10-26 20:36:08 +0000 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix bug where stps is never parsed due to logic error + +2009-11-04 17:31:15 +0100 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: Port ctts from Gnode * to GstByteReader + +2009-10-23 13:06:44 +0100 Robert Swain + + * gst/qtdemux/qtatomparser.h: + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_dump.c: + * gst/qtdemux/qtdemux_dump.h: + * gst/qtdemux/qtdemux_types.h: + qtdemux: Switch from QtAtomParser to GstByteReader + +2009-11-23 12:53:50 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: fix typo and grammar + +2009-11-20 10:30:00 +0000 Tim-Philipp Müller + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: fix typo in mode enum description + +2009-11-20 11:25:49 +0200 Stefan Kost + + * gst/rtpmanager/gstrtpbin.c: + docs: more links and better short description + Fix spelling of GstRtpSsrcDemux to get it linked. Add more links. Change + the short description to be more meaningful. + +2009-11-20 09:58:26 +0100 Sebastian Dröge + + * tests/check/elements/wavpackparse.c: + wavpackparse: Fix unit test for recent position reporting changes + +2009-11-19 16:09:38 +0100 Sebastian Dröge + + * ext/wavpack/gstwavpackparse.c: + wavpackparse: After pushing a frame, update last_stop to the end of the frame + This improves position reporting, especially because of the fact that + WavPack frames are usually 0.5-1.0 seconds long. + +2009-11-19 16:08:33 +0100 Sebastian Dröge + + * ext/wavpack/gstwavpackparse.c: + wavpackparse: Allow pulling the last WavPack frame of a file + Because of a >= instead of a >, that last frame of a WavPack file + would never be parsed in pull mode. + +2009-11-19 10:30:43 +0000 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From 0702fe1 to 53a2485 + +2009-10-29 08:29:38 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: Add more fields to SVQ3 caps + qtdemux only added the whole stsd atom as 'codec_data' + in its output caps for SVQ3. This patch makes it add + the SEQH (inside a SMI atom) and a gamma field (taken + from the gama atom) if available. + Fixes #587922 + +2009-11-18 17:55:42 +0100 Edward Hervey + + * gst/wavenc/gstwavenc.c: + wavenc: Raise rank of muxer to PRIMARY + +2009-11-18 17:54:16 +0100 Edward Hervey + + * gst/y4m/gsty4mencode.c: + y4m: Raise rank of encoder to PRIMARY + +2009-11-18 17:54:02 +0100 Edward Hervey + + * gst/law/alaw.c: + * gst/law/mulaw.c: + law: Raise rank of encoders to PRIMARY + +2009-11-12 19:11:18 +0000 Bastien Nocera + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + Add user-id and user-pw properties + So that one doesn't need to modify the URL to have access + to authenticated RTSP streams. + fixes #601728 + +2009-11-18 12:22:10 +0100 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: use acquired flag when checking valid state + Use the acquired field of the ringbuffer in get_time to know when we are in an + invalid state. We don't clear the rate flag when releasing the ringbuffer so + this values is not usable. + Avoids some error messages being posted because the pulseaudio connection is + down. + +2009-11-18 10:17:02 +0000 Tim-Philipp Müller + + * configure.ac: + configure: bump core requirement to 0.10.25.1 as well + Make implicit requirement explicit. + +2009-11-18 12:53:44 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix bogus memory chunk size check + +2009-11-18 12:01:52 +0100 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: implement some more callbacks + Implement some more callbacks for debugging purposes. + +2009-11-11 15:50:19 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: release lock before emiting signals + Release the jbuf lock before emiting the request-pt-map signal to avoid + deadlocks. We also need to catch the shutdown case when locking again. + Fixes #593354 + +2009-11-11 11:59:16 +0100 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpbvdepay.c: + * gst/rtp/gstrtpbvdepay.h: + rtp: add BroadcomVoice depayloader + +2009-11-11 11:38:36 +0100 Wim Taymans + + * gst/rtp/gstrtpbvpay.c: + rtpbvpay: add rfc reference + +2009-11-11 11:37:07 +0100 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpbvpay.c: + * gst/rtp/gstrtpbvpay.h: + rtp: add BroadcomVoice payloader + +2009-11-09 12:17:34 +0100 Jan Urbański + + * gst/flv/gstflvmux.c: + flvmux: properly finish the ECMA array + The ECMA array with the file index was missing a mandatory end marker. + Fixes bug #601242. + +2009-11-18 02:15:15 +0000 Jan Schmidt + + * gst/deinterlace/gstdeinterlace.c: + Use new still-frame API from gst-plugins-base + +2009-11-18 02:14:46 +0000 Jan Schmidt + + * configure.ac: + Bump gst-plugins-base requirement to 0.10.25.1 + +2009-11-17 17:59:13 -0800 Michael Smith + + * gst/qtdemux/qtdemux.c: + qtdemux: identify IMA adpcm in qt properly. + +2009-11-18 01:27:37 +0000 Jan Schmidt + + * configure.ac: + * win32/common/config.h: + Back to development -> 0.10.17.1 + +2009-11-17 01:53:08 +0000 Jan Schmidt + + * gst-plugins-good.doap: + Add release 0.10.17 to the doap file + +=== release 0.10.17 === + +2009-11-17 01:25:30 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + Release 0.10.17 + +2009-11-17 00:18:22 +0000 Jan Schmidt + + * 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/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2009-11-13 02:07:25 +0000 Jan Schmidt + + * 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/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + * win32/common/config.h: + 0.10.16.3 pre-release + +2009-11-10 11:52:24 +0100 Sebastian Dröge + + * sys/v4l2/gstv4l2object.c: + v4l2: Make sure to initialize variables before using them + +2009-11-09 20:06:03 +0000 Jan Schmidt + + * 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/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + * win32/common/config.h: + 0.10.16.2 pre-release + +2009-11-09 15:20:00 +0000 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: free temporary buffer when changing state to NULL + Free temporary allocations in the state change function and not + only when the object is finalised. + +2009-11-09 11:40:25 +0000 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: only allocate as much temporary memory as needed for indirect decoding + When we can't decode directly into the output buffer, make our temp buffers + only as big as needed instead of allocating for the worst case scenario (well, + we still alloc more than strictly needed for some cases, but significantly + less than before). + +2009-11-05 23:46:58 +0000 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + pulsesink: printf format fix + +2009-11-05 23:44:27 +0000 Tim-Philipp Müller + + * ext/raw1394/gst1394clock.c: + * ext/raw1394/gsthdv1394src.c: + raw1394: printf format fixes + +2009-11-05 23:40:15 +0000 Tim-Philipp Müller + + * gst/equalizer/gstiirequalizer.c: + equalizer: printf format fix + +2009-11-05 12:13:44 -0300 Thiago Santos + + * gst/avi/gstavimux.c: + avimux: do not write empty INFO list + avoid writing an empty INFO list chunk, both because + it is useless and because vlc refuses to play the + resulting file. + +2009-11-05 10:54:12 +0100 Sebastian Dröge + + * gst/equalizer/gstiirequalizer.c: + equalizer: Notify about band property changes caused by changing number of bands + +2009-11-05 10:45:59 +0100 Sebastian Dröge + + * gst/equalizer/gstiirequalizer.c: + * gst/equalizer/gstiirequalizer.h: + * gst/equalizer/gstiirequalizernbands.c: + equalizer: Make changes to band properties and the number of bands threadsafe + +2009-11-05 10:30:46 +0100 Sebastian Dröge + + * gst/equalizer/gstiirequalizer.c: + equalizer: Fix stupid off by two bug + +2009-11-05 08:18:05 +0100 Sebastian Dröge + + * gst/equalizer/gstiirequalizer.c: + equalizer: Add band property to select the band filter type + This allows per band configuration of a peak, low shelf or + high shelf filter, which can be very useful if the band frequencies + and widths are manually configured. + +2009-11-05 08:17:53 +0100 Sebastian Dröge + + * gst/equalizer/gstiirequalizer.c: + equalizer: Fix code style + +2009-11-05 08:03:13 +0100 Sebastian Dröge + + * gst/equalizer/gstiirequalizer.c: + * gst/equalizer/gstiirequalizer10bands.c: + * gst/equalizer/gstiirequalizer3bands.c: + * gst/equalizer/gstiirequalizernbands.c: + equalizer: Some cleanup + +2009-10-07 09:31:19 -0400 Gabriel Millaire + + * gst/rtp/gstrtpceltdepay.c: + * gst/rtp/gstrtpceltpay.c: + celtpay/depay : change GST_DEBUG_OBJECT to GST_LOG_OBJECT in pay_handle_buffer and depay_process + +2009-10-02 17:04:43 -0400 Gabriel Millaire + + * gst/rtp/gstrtpceltdepay.c: + * gst/rtp/gstrtpceltdepay.h: + * gst/rtp/gstrtpceltpay.c: + celtpay/depay: Negotiate parameters through caps + celtdepay : added default framesize(480) channels(1) and clockrate(32000) + depay_setcaps : now gets channels and framesize from string with default value + depay_process : now adds timestamp to outbuf + Added frame_size to GstRtpCeltDepay + Changed some GST_DEBUG to GST_DEBUG_OBJECT or GST_LOG_OBJECT + celtpay : getcaps : gets channel and framesize and sets caps + Added frame-size to static caps for audio/x-celt + +2009-11-04 15:58:34 +0000 Jan Schmidt + + * gst/deinterlace/Makefile.am: + deinterlace: Pull in CFLAGS and LIBS flags from -base before core before system. + +2009-10-15 16:33:24 +0100 Jan Schmidt + + * po/Makevars: + po: Don't create backup .po files + As well as preventing creation of useless backup files, it works + around a bug in gettext 0.17 on OS/X + +2009-11-04 16:47:42 +0100 Edward Hervey + + * gst/qtdemux/qtdemux_dump.c: + qtdemux: init variables to make compiler on osx build bot happy + +2009-11-03 16:04:37 +0000 Tim-Philipp Müller + + * gst/qtdemux/qtdemux_dump.c: + qtdemux: init variables to make compiler on osx build bot happy + +2009-11-03 17:35:15 +0200 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: don't allocate big arrays on the stack + Add the arrays to the instance data and allocate on first use. + +2009-11-01 15:57:44 +0000 Tim-Philipp Müller + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: remove pointless call to gst_element_no_more_pads() + +2009-11-01 00:29:57 +0200 Stefan Kost + + * gst/level/gstlevel.c: + level: fix decay to be smooth + The length not having any fractional part as it was promoted to gdouble after + dividing two guint64. + +2009-11-01 00:29:24 +0200 Stefan Kost + + * gst/level/gstlevel.c: + * gst/level/gstlevel.h: + level: calculate the message-intervall when it changes + +2009-11-01 00:14:08 +0200 Stefan Kost + + * gst/level/gstlevel.c: + level: clocktime is a guint64, use right macro to init fields + +2009-11-01 00:10:01 +0200 Stefan Kost + + * gst/level/gstlevel.c: + level: use more g-style types + +2009-10-30 09:27:59 +0100 Sebastian Dröge + + * configure.ac: + * ext/pulse/pulsesink.c: + pulsesink: Only set the volume on stream connection if pulse >= 0.9.20 is available + In older versions the volume set during stream connection had + no defined sematic and usually it was a relative volume. What + was needed for our use case is an absolute volume though, otherwise + the volume will be always decreased on stream connection if it's + less than 100%. + Since pulse 0.9.20 that volume is always an absolute volume if + flat volumes are used and relative otherwise, which is the same + as for pa_context_set_sink_input_volume(). + Relevant pulse changesets: + http://git.0pointer.de/?p=pulseaudio.git;a=commit;h=f27a50691c8fe45bac7dd6b21fac91a359def3a1 + http://git.0pointer.de/?p=pulseaudio.git;a=commit;h=2501687579e359d5032a4d165b2ffc8f5b1b8ba6 + +2009-10-27 18:07:18 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: use segment_full when we can + Use segment_full so that we can pass the applied rate to the segment values. We + will change the applied rate when we implement skip mode. + +2009-10-18 00:16:06 +0100 Robert Swain + + * gst/wavenc/gstwavenc.c: + wavenc: Fix buffer offset by moving length incrementation + +2009-10-23 18:31:14 -0700 Michael Smith + + * sys/osxvideo/osxvideosink.m: + osxvideosink: Create the video NSView in READY->PAUSED rather than NULL->READY + +2009-10-23 18:28:22 -0700 Michael Smith + + * sys/osxvideo/Makefile.am: + osxvideo: explicitly link to GST_LIBS + +2009-10-23 18:09:43 -0700 Michael Smith + + * gst/avi/Makefile.am: + * gst/matroska/Makefile.am: + * gst/wavparse/Makefile.am: + Add dependencies of gstriff to things that link to gstriff, needed on Win32. + +2009-10-23 17:25:17 -0700 Michael Smith + + * tests/examples/rtp/client-PCMA.c: + * tests/examples/rtp/server-alsasrc-PCMA.c: + rtp examples: remove executable bits from C files. + +2009-10-23 11:21:44 +0100 Tim-Philipp Müller + + * tests/check/elements/rtpjitterbuffer.c: + tests: disable all jitterbuffer tests for now + Since even the one enabled seems to fail. + +2009-10-22 13:39:58 +0300 Stefan Kost + + * tests/check/elements/rtpjitterbuffer.c: + tests: also include the new test for prev commit + +2009-10-22 13:19:07 +0300 Stefan Kost + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + tests: add a jitterbuffer test + Tests pushing a few buffers in various order and asserting the order sent by the + jitterbuffer. Contains two disabled tests that need more work. + +2009-10-22 12:30:14 +0200 Sebastian Dröge + + * gst/matroska/matroska-mux.c: + matroskamux: Dirac "muxing" units end on EOS too + A Dirac muxing unit are all non-picture, non-end-of-sequence + packets up to and including the first picture or eos packet. + See http://www.diracvideo.org/wiki/index.php/ContainerFormatMappingGuidelines + +2009-10-22 02:09:08 +0100 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: + avidemux: fix compilation with debugging disabled + total_idx is always evaluated. + +2009-10-19 21:59:46 +0300 Priit Laes + + * ext/libcaca/gstcacasink.h: + cacasink: minor cleanups for header. + Use G_BEGIN_DECLS macros, remove unused variables and fix typo. + See #599018. + +2009-10-19 21:59:23 +0300 Priit Laes + + * ext/libcaca/gstcacasink.c: + cacasink: exit properly when invalid driver has been selected. + See #599018. + +2009-10-20 18:23:28 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Stop scanning at the last entry... and not the one before :) + This ensures we actually push out everything + +2009-10-20 17:20:55 +0200 Andy Wingo + + qtdemux: unpack more information into image/x-j2c caps + * gst/qtdemux/qtdemux_fourcc.h: Add new fourccs for use by the mj2 + unpacker. + * gst/qtdemux/qtdemux.c (qtdemux_parse_trak): Unpack JPEG2000 component + mapping and channel definitions from the jp2h header. Will add + component-map and channel-definitions elements to the caps if the + component maps or channel definitions are nonstandard, where standard + order means RGB, 444 packed YUV, or greyscale, with no alpha channel. + Fixes #598915. + +2009-10-20 17:33:41 +0300 Stefan Kost + + * tests/check/elements/deinterleave.c: + tests: include stdio.h for sscanf + +2009-10-19 15:21:57 +0100 Bastien Nocera + + * ext/pulse/pulsesink.c: + Fix the StreamVolume interface not being advertised + gst_pulsesink_interface_supported() was missing a check for it. + https://bugzilla.gnome.org/show_bug.cgi?id=598933 + +2009-10-16 21:14:14 +0300 Stefan Kost + + * gst/level/gstlevel.c: + level: code cleanup + Use gdouble instead of double. Calculate falloff_time once instead of twice. + +2009-10-18 15:52:02 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: MEMDUMP the junk blobs + It will only actually pull the junk blobs from upstream if the memdump + level is activated + +2009-10-18 15:51:34 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Some avi files have INFO lists in the headers. + +2009-10-18 16:02:01 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Don't seek on empty streams + +2009-10-18 15:50:39 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Ensure _calculate_durations_from_index only uses valid streams + +2009-10-18 15:49:29 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Only call convert function if we have strf.auds + +2009-10-18 15:48:06 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: Use first indexed stream for seeking. + In the future, main_stream can be adjusted to contain the optimal stream + as mentionned in the FIXME line 3440 + +2009-10-18 15:46:48 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: Only expose streams that actually have something in it. + This guarantees that in pull-mode, all streams have a valid index to + work with. + +2009-10-18 15:40:37 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Properly mark presence of index. + Instead of blindly saying we have an index, only do so if we have a + non-empty index. + +2009-10-17 02:18:53 +0200 Lennart Poettering + + * ext/pulse/pulsesink.c: + pulse: never apply volume more than once + Generally decisions on the volume of the stream should be done inside of + PA, not inside of Gst. Only PA knows how volumes translate between + devices and s on. + This patch makes sure that all volumes set via the volume property are + only applied *once* to the underlying stream. After applying them the + client side will not store them anymore. This should make sure that + really only user-triggered volume changes are forwarded to server, but + the client never tries to save/restore the volume internally. + Fixes bug #595231. + +2009-10-17 08:55:16 +0200 Sebastian Dröge + + * ext/pulse/plugin.c: + pulsesink: Initialize gettext for the translated strings in plugin_init() + +2009-10-17 00:10:30 +0200 Lennart Poettering + + * ext/pulse/pulsesink.c: + pulse: use 'performer' as a fallback for 'artist' tag + +2009-10-17 00:09:36 +0200 Lennart Poettering + + * ext/pulse/pulsesink.c: + * po/POTFILES.in: + pulse: when constructing a stream title from tag data make sure it is translatable + +2009-10-17 00:06:15 +0200 Lennart Poettering + + * ext/pulse/pulsemixerctrl.c: + pulse: loop while connecting to server + pthread does not guarantee that there are no spurious condition variable + wakeups, neither does pa_threaded_mainloop_xxx() which is a wrapper + around it. So we need to loop around the _wait() function to make sure + we get the right wakeup. + Also, unify the order of the wait loops across the file. + +2009-10-17 00:05:10 +0200 Lennart Poettering + + * ext/pulse/pulsemixerctrl.c: + * ext/pulse/pulseprobe.c: + pulse: mainloop creation can fail too, so handle that + +2009-10-17 00:03:06 +0200 Lennart Poettering + + * ext/pulse/pulsemixerctrl.c: + pulse: adjust CHECK_DEAD_GOTO macro to glib style + +2009-10-16 17:28:42 +0200 Lennart Poettering + + * ext/pulse/pulsemixerctrl.c: + * ext/pulse/pulsemixerctrl.h: + * ext/pulse/pulseprobe.c: + * ext/pulse/pulseprobe.h: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + * ext/pulse/pulsesrc.h: + pulse: make a few things smaller by making them bitfields + +2009-10-16 17:26:41 +0200 Lennart Poettering + + * configure.ac: + pulse: bump minimum libpulse version to 0.9.10 + Older versions than 0.9.10 are really really old and buggy. Drop + compatibility with them. Nobody should run anything that old. + Also see: https://bugzilla.gnome.org/show_bug.cgi?id=595029 + +2009-10-16 18:18:31 +0200 Mark Nauwelaerts + + * gst/debugutils/gstdebug.c: + debugutils: register pushfilesrc element + +2009-10-16 17:28:09 +0200 Mark Nauwelaerts + + * gst/avi/gstavimux.c: + * gst/avi/gstavimux.h: + avimux: support (some) VBR audio muxing + AVI format can handle VBR audio provided audio chunks are of fixed duration + (cfr fixed duration video frames). Apply this approach to (always) parsed + raw AAC and (if parsed) to MPEG-1/2 audio. + See #368681. + +2009-10-16 13:41:45 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix branch hints + Remove inappropriate branching hints and add some new ones. + +2009-10-16 12:33:04 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix regression in indirect decode path + Revert variable name back to what it was before the G_LIKELY was + added (in commit 69c24fb9). The code works better that way. + +2009-10-16 02:47:38 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix regression with certain formats + Fix regression introduced by previous commit (#598517). + +2009-10-15 19:49:55 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: don't use decompress structure members we shouldn't be using + +2009-10-14 17:53:52 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.h: + jpegdec: remove some unused members from jpegdec instance structure + +2009-10-16 11:53:38 +0300 Stefan Kost + + * gst/rtpmanager/Makefile.am: + * gst/udp/Makefile.am: + build: use gst-glib-gen.mak to fix the glib build rules. + The build rules in glib-gen.mak were using pattern rules in a non save way. + +2009-10-16 10:15:35 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 85d1530 to 0702fe1 + +2009-10-15 21:04:02 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: adjust flow return aggregation to updated loop_data + In particular, each stream is now treated separately, and one stream's + EOS should not lead to overall EOS. + +2009-10-15 11:52:35 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: check some more atom sizes prior to parsing + +2009-10-15 13:19:13 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtsp: handle events in TCP mode + We need to handle events in TCP mode so that we can reply to the LATENCY event + with TRUE. + +2009-10-15 11:24:45 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: add missing argument in debug message + +2009-10-14 18:58:06 +0200 Marvin Schmidt + + * tests/check/elements/flvmux.c: + flvmux: Use loop test to prevent timeout on slow machines + Partially fixes bug #597739. + +2009-10-14 16:15:48 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: forward events into the rtpbin + Only catch the SEEK event on the srcpad and let other events enter the rtpbin. + +2009-10-14 11:33:24 -0300 Thiago Santos + + * gst/matroska/matroska-demux.c: + matroskademux: Fix late tags finding + Use the correct taglist variable when notifying of late tags. + +2009-10-14 13:09:03 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: use GstIndex for (limited) seeking in push mode + ... but disable this for now. Although it basically works fine, + user experience might be shaky (depending on taste), since there + is no keyframe info in push mode. + +2009-10-14 13:08:47 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: add GstIndex support + +2009-10-14 11:55:33 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: also determine duration in push mode + +2009-10-14 11:54:44 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: add GstIndex support + +2009-10-14 07:38:26 -0300 Thiago Santos + + * sys/v4l2/gstv4l2src.c: + v4l2src: Set duration on buffers + Use framerate to estimate duration of buffers. + Fixes #590362 + +2009-10-14 12:28:55 +0200 HÃ¥vard Graff + + * gst/rtpmanager/gstrtpptdemux.c: + rtpptdemux: only forward the lost-event to the last seen pt-number + forward all events on all pads except for the PacketLost event, which we want to + forward to the last seen pt pad. + Fixes #598377 + +2009-10-06 22:28:50 +0300 René Stadler + + * ext/pulse/pulsesink.c: + pulsesink: set desired minreq value to segsize/latency-time + If we let the daemon decide freely by passing -1, we end up always getting 20ms. + We want to set this value because in some cases we want to select a higher + latency-time in order to save power. + Fixes #597601 + +2009-10-14 10:41:21 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From a3e3ce4 to 85d1530 + +2009-10-13 18:33:34 +0200 Edward Hervey + + * tests/check/pipelines/flacdec.c: + tests/pipeline/flac: Fix build on macosx 10.5 + +2009-10-13 18:19:32 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: demote some warnings to debug + +2009-10-13 17:47:40 +0200 Wim Taymans + + * gst/avi/avi-ids.h: + avi: add new avi flag we might want to use + +2009-10-13 17:46:22 +0200 Wim Taymans + + * gst/avi/gstavimux.c: + avimux: calculate suggested buffer size + Calculate the suggested buffer size based on the largest chunk in the file. + See #597847 + +2009-10-13 17:45:14 +0200 Wim Taymans + + * gst/avi/gstavimux.c: + avimux: add jpeg2000 to allowed caps + +2009-10-13 17:41:13 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: add debug for the superindex offsets + +2009-10-13 16:02:37 +0100 Jan Schmidt + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix uninitialized variable warning + Fix another bogus may-be-used-uninitialized warning in qtdemux + +2009-10-13 13:08:33 +0200 Wim Taymans + + * gst/avi/gstavimux.c: + * gst/avi/gstavimux.h: + avi: lower max file size + Make a constant of the max file size and lower the value to what ffmpeg does, + hopefully improving compatibility with windows media player. + See #597847 + +2009-10-13 01:02:15 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix bogus warning about discont flag on first buffer + The very first buffer should always have the DISCONT flag set, no + need to warn about that. Only warn if we get a DISCONT buffer in + non-packetised mode and we already have some data. + +2009-10-13 00:41:57 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix crash for unusual vertical chroma subsampling factors + Fixes #597351. + +2009-10-13 00:12:42 +0100 Jan Schmidt + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix uninitialized variable warnings + The gcc on the OS/X buildbot complains about these variables not being + initialized, even though they can't possibly actually be used + uninitialized. + +2009-10-10 00:37:08 +0200 Josep Torra + + * ext/jpeg/gstjpegdec.c: + jpegdec: fixes warning building in snow leopard + +2009-10-09 17:12:46 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: also consider Quicktime text subtitles + +2009-10-09 17:02:57 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: provide language tag for stream + +2009-10-09 16:30:57 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: refactor common parts in track parsing + +2009-10-09 16:21:03 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: refactor buffer processing and sending + ... so it can be used in both pull and push based mode. + +2009-10-08 13:39:25 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: extract palette data for dvd subpicture streams + ... and send it downstream using custom dvd event + +2009-10-07 14:03:17 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: support 3GPP timed text subtitles + In particular, also make subtitle support less subp(icture)-centric. + +2009-10-07 16:15:55 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: NULL is not a valid taglist + +2009-09-23 17:20:25 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: recognize some more encypted track cases + +2009-10-09 15:59:25 +0200 Josep Torra + + * gst/id3demux/id3tags.c: + id3: fixes warnings building on macosx + Another round on the formating of that debug line. + +2009-10-09 14:44:02 +0300 Stefan Kost + + * gst/id3demux/id3tags.c: + id3: cast pointer math results to glong + +2009-10-09 14:37:32 +0300 Stefan Kost + + * ext/flac/gstflacdec.c: + flac: apparently on some platforms a FLAC__uint64!=guint64 + +2009-10-09 14:21:09 +0300 Stefan Kost + + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtpvrawpay.c: + buikd: explicitely cast, to tell some compilers that this is not long int + +2009-10-09 13:38:17 +0300 Stefan Kost + + * ext/flac/gstflacdec.c: + * gst/id3demux/id3tags.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtpvrawpay.c: + build: don't cast, but use the right format specified instead + This correct some of the previous macos fixes. + +2009-10-09 12:40:47 +0200 Josep Torra + + * ext/dv/gstdvdemux.c: + dv: fix warnings on macosx + +2009-10-09 12:25:19 +0200 Josep Torra + + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + flac: fix warnings on macosx + +2009-10-09 12:19:35 +0200 Josep Torra + + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + annodex: fix warnings in macosx + +2009-10-09 12:14:22 +0200 Josep Torra + + * sys/osxvideo/cocoawindow.m: + osxvideo: fix a warning doing a cast + +2009-10-09 12:11:12 +0200 Josep Torra + + * sys/osxaudio/gstosxringbuffer.c: + osxaudio: fix warnings on macosx + +2009-10-09 12:01:10 +0200 Josep Torra + + * gst/rtp/gstrtpvrawpay.c: + rtpvrawpay: fix warning on macosx + +2009-10-09 11:57:59 +0200 Josep Torra + + * gst/rtp/gstrtph263pay.c: + rtph263pay: fix warning on macosx + +2009-10-09 11:54:03 +0200 Josep Torra + + * gst/qtdemux/qtdemux.c: + qtdemux: fix warnings building on macosx + +2009-10-09 11:42:36 +0200 Josep Torra + + * gst/id3demux/id3tags.c: + id3demux: fix printf warnings on macosx + +2009-10-09 11:30:00 +0200 Josep Torra + + * gst/avi/gstavidemux.c: + avidemux: fix warning in macosx making the format portable + +2009-10-09 10:51:29 +0200 Josep Torra + + * gst/audiofx/audiofxbasefirfilter.c: + audiofx: use G_GUINT64_FORMAT to fix warnings on OSX + +2009-10-09 10:11:38 +0200 Josep Torra + + * sys/osxaudio/gstosxringbuffer.c: + osxaudio: Fixes build on macosx snow leopard. + +2009-10-09 11:34:16 +0200 Pau Garcia i Quiles + + * sys/v4l2/gstv4l2object.h: + v4l2: Include sys/ioctl.h for the V4L ioctl requests + Old videodevice2.h kernel headers used ioctl stuff without + including ioctl.h, making compilation fail on older systems. + Note: Including ioctl.h here is only a workaround for old kernel + headers, should be removed once everybody has new enough headers. + Fixes bug #597867. + +2009-10-09 00:14:07 +0100 Jan Schmidt + + * configure.ac: + * tests/check/elements/level.c: + check: Make the level unit test succeed on Solaris 10 + Add a configure check for functional isinf() and fpclass(), and + use fpclass() where possible when isinf() is not available. + +2009-05-16 13:52:50 +0300 René Stadler + + * gst/matroska/matroska-demux.c: + matroskademux: fix strstr() usage on possibly unterminated string + +2009-10-08 16:16:14 +0100 Jan Schmidt + + * tests/check/Makefile.am: + * tests/check/elements/level.c: + check: Link against LIBM and include math.h for isinf() + +2009-10-07 21:51:38 +0100 Sjoerd Simons + + * sys/oss/gstossaudio.c: + oss: Downgrade the rank of osssrc to SECONDARY + which is the same rank as osssink has. + Fixes bug #597730. + +2009-10-08 10:59:53 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From 19fa4f3 to a3e3ce4 + +2009-10-08 10:20:09 +0100 Jan Schmidt + + * gst/avi/gstavidemux.c: + * gst/wavparse/gstwavparse.c: + avi/wav: Fix some compiler warnings about incompatible pointers. + +2009-10-05 17:36:55 +0100 Jan Schmidt + + * gst/multifile/gstmultifile.c: + multifile: Fix plugin description + +2009-10-07 14:03:20 +0300 Stefan Kost + + * ext/annodex/gstcmmlutils.c: + * ext/jpeg/gstjpegdec.h: + * ext/jpeg/gstjpegenc.h: + * gst/apetag/gstapedemux.c: + * gst/debugutils/tests.c: + * gst/id3demux/id3v2frames.c: + * gst/qtdemux/qtdemux.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtsp/gstrtpdec.c: + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + * tests/examples/spectrum/spectrum-example.c: + build: fprintf, sprintf, sscanf need stdio.h + +2009-10-07 00:33:49 +0300 Stefan Kost + + * gst/equalizer/gstiirequalizer.c: + equalizer: use shelfing filters for first and last band + Refactor the filter setup. Add two new filters with shelf characteristics for + first and last band. Change gain calculation as recommended in the quoted + document (no qrt needed). Rename variables to match the formulas in the + document. + +2009-10-02 23:51:29 +0300 René Stadler + + * ext/pulse/pulsesrc.c: + pulsesrc: guard fragment size with a lower limit based on latency-time + In case that the pulse daemon runs the source device at a relatively low fixed + fragment size compared to the requested latency-time, configure the ring buffer + segsize to the largest integer multiple of the fragment size that is still + smaller than or equal to the requested latency-time. + Fixes bug #597463. + +2009-10-06 17:40:47 +0300 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + jpegdec: comment/logging cleanups and more branch guides + +2009-10-05 22:43:11 +0300 Stefan Kost + + * gst/equalizer/gstiirequalizer.c: + equalizer: fix filter history usage. Fixes #597397 + The process functions where overwriting the history for each channel. Also pull + some static things out of the inner loop. + +2009-10-05 16:07:24 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: use locking around the sessions + +2009-10-05 11:46:08 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: make sure compatible brands buffer exists before dereferencing it + +2009-10-04 21:59:24 +0200 Robert Swain + + * gst/qtdemux/qtdemux.c: + qtdemux: fix printf warnings on OSX + Cast variables passed to printf to avoid warnings about incorrect + formats (most likely caused by sizeof returning a size_t). + Fixes #597348. + +2009-10-02 00:23:34 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: remove internal genre table + No need to maintain our own genre table in qtdemux. The genres are + identical to the ID3 genres, so we can just use libgsttag's + gst_tag_id3_genre_get() to look them up. + +2009-10-03 17:18:28 +0200 Robert Swain + + * gst/avi/gstavidemux.c: + Fix printf formats to avoid warnings in avidemux. Fixes #597214 + https://bugzilla.gnome.org/show_bug.cgi?id=597214 + +2009-10-03 09:52:57 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Change one GST_WARNING to a GST_DEBUG + +2009-10-02 14:37:54 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: + flvdemux: If there's no audio stream after 6 seconds of video signal no-more-pads + ...and the other way around. Also ignore any audio/video streams that appear + after no-more-pads. + Fixes bug #597091. + +2009-10-02 14:37:40 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: + flvdemux: Make sure to only signal no-more-pads a single time + +2009-10-02 22:55:45 +0300 René Stadler + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + pulse: rename pa_buffer_attr variables + Makes it much easier to see what is going on and is a lot less error prone. + +2009-10-02 18:25:16 +0300 Stefan Kost + + * gst/rtp/gstrtpjpegdepay.c: + rtp: add missing include to fix the build + +2009-10-02 13:15:59 +0300 Stefan Kost + + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + videofilter: add G_OBJECT_WARN_INVALID_PROPERTY_ID to property setter + +2009-10-02 13:10:44 +0300 Stefan Kost + + * gst/level/gstlevel.c: + level: don't give wrong number of fields in the message docs + +2009-10-01 12:52:40 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: cache latency in nanoseconds + Cache the latency in nanoseconds units to avoid having to convert the + milliseconds value to nanoseconds all the time. + +2009-10-01 12:12:09 +0200 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: handle -1 input timestamps + Don't try to check a -1 timestamp against the max delay. + +2009-10-01 10:54:55 +0300 Stefan Kost + + * gst/avi/gstavidemux.c: + avi: don't misues perf-category and remove unused ext category + The performance category is meant to be used to audit codepaths that lead to bad + performance (e.g. copies, conversion that can be avoided). + Remove the event category which is not used. + +2009-09-16 14:23:24 -0400 Olivier Crête + + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729pay.c: + rtpg729pay/depay: Demote per-buffer debug messages to log level + +2009-09-16 14:16:27 -0400 Olivier Crête + + * gst/rtp/gstrtpg729pay.c: + rtpg729pay: Don't leak incoming buffers after subbuffering them + +2009-09-16 13:57:05 -0400 Olivier Crête + + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729pay.c: + rtpg729pay/depay: Add debug categories + +2009-09-16 13:55:19 -0400 Olivier Crête + + * gst/rtp/gstrtpg729pay.c: + rtpg729pay: Remove long unneeded define replacement + +2009-09-30 18:06:07 +0100 Christian F.K. Schaller + + * ext/dv/Makefile.am: + Update makefile with missing header file + +2009-09-30 18:45:17 +0200 Sebastian Dröge + + * tests/examples/rtp/client-H263p-AMR.sh: + * tests/examples/rtp/client-H263p-PCMA.sh: + * tests/examples/rtp/client-H264-PCMA.sh: + * tests/examples/rtp/client-PCMA.sh: + * tests/examples/rtp/server-alsasrc-PCMA.sh: + * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: + * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: + rtp: Use autoaudio{sink,src} instead of alsa in the examples + +2009-09-29 17:51:04 +0300 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + jpegdec: don't leak output buffers on decoding errors + The setjmp handles libjpeg error. Free the outputbffer if we don't need it. + +2009-09-29 00:01:59 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix 'unused variable' compiler warning when compiling with GST_DISABLE_GST_DEBUG + +2009-09-23 14:25:08 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: small cleanups + +2009-09-23 13:57:02 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: fix timestamping in some audio streams + For vbr audio streams we need to use the number of blocks to calculate the + timestamps. + When the allocation of additional index memory fails, don't throw away what + we had before. + Various cleanups. + +2009-09-23 12:56:07 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: add support for ODML indexes again + +2009-09-22 22:12:58 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avi: implement index scanning + Implement scanning of the file when we can parse the index. + Some refactoring of common code. + Cleanups and comments. + Remove some reimplemented code. + Remove index massage code and put a FIXME where we should do something + equivalent later. + +2009-09-22 18:18:20 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: fix reverse playback + +2009-09-22 17:42:48 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: fix prev keyframe search and cleanups + +2009-09-22 14:51:30 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: remove code that got converted + +2009-09-22 14:44:42 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avi: more cleanups + Remove some duplicate counters. + Be smarter when updateing the current the timestamp and offset in the stream + because we can reuse previously calculated values when simply go forward one + step. + Correctly set metadata on outgoing buffers. + +2009-09-22 12:35:30 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: small cleanups + +2009-09-22 01:28:54 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: fix read offset and cleanups + +2009-09-21 18:04:25 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avi: rewrite index playback + disable code, start on reimplementing loop based operation. + Rewrite the index handling so that all streams use their own index for decoding + media. + +2009-09-21 15:35:55 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: add new index parsing code + Add a new function and datastructure to parse and hold the index entries on a + per stream base. Also avoid doing too much work trying to figure out the + timestamps and durations as we can trivially do that later. + Less information in the entries makes them 2 times smaller and not doing too + much work makes this code about 12 times faster than the regular case. + Hook in the new function alongside the existing function for comparison until + the rest of the code is updated to handle the new index datastructure. + +2009-09-28 16:29:45 +0300 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + jpeg: handle more libjpeg return values, add some more branch hints + Also remove unused size variable in _chain(). + +2009-09-25 19:21:32 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: some optional QT specified stsd MPEG-4 atoms also apply to H264 + Fixes #596319. + +2009-09-25 16:40:31 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: only send tag events downstream after newsegment + +2009-09-25 14:14:03 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: if transport protocol unsupported, try another one + Also change error message to more accurately reflect cases in which + it can occur. + +2009-09-25 11:54:06 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: add durations modulo 1<<32 + For calculating the durations of each sample, we are supposed to add each + duration modulo 1<<32 so make the elapsed time counter a uint32. + Fixes #595942 + +2009-09-24 20:38:54 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: small cleanup + +2009-09-24 19:33:39 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtatomparser.h: + qtdemux: don't use core API that doesn't exist yet + There's no gst_byte_reader_has_remaining() yet. Fixes build. + +2009-09-24 13:20:50 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtatomparser.h: + qtdemux: map some atomparser functions to their new bytereader equivalents + Now that GstByteReader has unchecked and inlined variants as well, map + atomparser functions to their respective bytereader equivalents. + +2009-08-25 12:11:28 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtatomparser.h: + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_dump.c: + qtdemux: add qt_atom_parser_has_chunks() and fix indentation + +2009-08-20 18:21:59 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: bail out instead of trying to alloc silly index sizes + If it looks like we would be allocating a silly size for our sample + index, just bail out instead of trying to allocate it. Helps with + broken or fuzzed files where we might end up trying to malloc a + couple of hundred MBs otherwise. + +2009-08-20 16:47:25 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: error out correctly if we don't even have enough bytes for an atom header + +2009-08-20 15:39:00 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: init fourcc to 0 as well to avoid invalid reads when printf'ing error message + +2009-08-20 01:39:17 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtatomparser.h: + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_dump.c: + qtdemux: add qt_atom_parse_has_remaining() to avoid overflows with _get_remaining() + +2009-08-20 01:21:04 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: use GstByteReader when parsing tkhd atom + +2009-08-19 19:13:38 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: use unsigned ints for node length and do more sanity checking of the atom length + +2009-08-19 01:36:33 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtatomparser.h: + * gst/qtdemux/qtdemux_dump.c: + * gst/qtdemux/qtdemux_dump.h: + * gst/qtdemux/qtdemux_types.h: + qtdemux: use GstByteReader for atom dumping and fix a few bugs + +2009-08-21 14:21:08 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: move stco, stts, stss and stps atom parsing over to GstByteReader + Make sure we don't read beyond the atom boundary. Note that the code + behaves slightly differently in the corner case where there is not + enough atom data for the specified number of samples (n_samples_time) + in the atom, but still enough data to fill the pre-allocated index of + n_samples entries: before we would just stop parsing the stts data + and continue, whereas now we will likely error out. This should not + be a problem in practice though. We could maintain the old behaviour + by doing reads with a size check inside the loop if needed. + +2009-06-30 19:51:15 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: use bytereader to parse stsz and stsc atoms + Use GstByteReader to parse stsz and stsc chunks, and check size of + available data before parsing it, instead of blindly assuming there + will be enough data. Fixes crashes with some fuzzed/broken files. + +2009-08-15 20:38:40 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtatomparser.h: + qtdemux: add qt_atom_parser_get_offset() and optimise _peek_sub() + +2009-07-01 13:49:57 +0100 Tim-Philipp Müller + + * gst/qtdemux/Makefile.am: + * gst/qtdemux/qtatomparser.h: + * gst/qtdemux/qtdemux.c: + qtdemux: add QtAtomParser, an inlined GstByteReader variant + +2009-09-23 17:19:34 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + matroskademux: use proper order for no-more-pads and newsegment and tag sending + +2009-09-23 09:50:37 +0200 Mark Nauwelaerts + + * gst/matroska/matroska-demux.c: + matroskademux: sprinkle a few branch prediction macros + +2009-09-22 15:03:20 +0200 Alessandro Decina + + * ext/jpeg/gstjpegdec.c: + * gst/avi/gstavidemux.c: + * gst/flv/gstflvparse.c: + * gst/id3demux/id3v2frames.c: + Fix compile warnings with gcc 4.0.1. + +2009-09-22 11:48:50 +0100 Jan Schmidt + + * gst/matroska/matroska-mux.c: + matroskamux: Don't get stuck in an infinite loop with Dirac + At the end, Dirac streams have an EOS packet with 0 length. + Don't ever sit in an infinite loop when processing one. Allows + muxing Dirac into mkv to complete successfully. + +2009-09-22 11:03:46 +0100 Tim-Philipp Müller + + * .gitignore: + Update .gitignore + +2009-09-22 11:02:02 +0100 Tim-Philipp Müller + + * gst/videomixer/Makefile.am: + videomixer: fix up Makefile some more + Remove CFLAGS from LIBADD and make order of the various CFLAGS and + LIBS at least consistent with each other. + +2009-09-22 08:02:48 +0200 Brian Cameron + + * gst/videomixer/Makefile.am: + videomixer: Add $(GST_PLUGINS_BASE_LIBS) to LDFLAGS for linking libgstvideo + Fixes bug #595897. + +2009-09-21 18:09:12 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: fix timestamps in push mode + +2009-09-18 17:26:42 +0300 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + jpegdec: add a G_UNLIKELY and put perf-cat log to code path that copies + +2009-09-21 12:32:51 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avi: add some performance measurements + Measure the performance of various index and header parsing steps to the + PERFORMANCE debug category. + +2009-09-18 11:53:12 +0200 Mark Nauwelaerts + + * ext/speex/gstspeexdec.c: + speexdec: allow for unknown varying number of frames per buffer + In particular, this caters for RTP payloads with multiple frames + per packet. + +2009-09-18 11:45:06 +0200 Mark Nauwelaerts + + * ext/speex/gstspeexdec.c: + speexdec: use correct sample size in conversions + +2009-09-18 11:43:46 +0200 Mark Nauwelaerts + + * ext/speex/gstspeexenc.c: + speexenc: fix buffer time and duration for multiple frames per packet + +2009-09-18 14:22:02 +0300 Stefan Kost + + * gst/avi/gstavidemux.c: + avidemux: some logging cleanup to help understanding the index parsing overhead + +2009-09-16 13:28:27 -0700 David Schleef + + * sys/osxaudio/Makefile.am: + osxaudio: link against GST_BASE_LIBS + +2009-09-15 17:24:24 -0400 Olivier Crête + + * gst/rtp/gstrtpg729pay.c: + rtpg729pay: Fix adapter leak + The adapter would be leaked if it was empty and the data could be pushed out directly. + +2009-09-15 10:04:30 +0200 Sebastian Dröge + + * ext/pulse/pulsesrc.c: + pulsesrc: Don't dereference NULL pointers + pa_stream_get_timing_info() can return NULL. + Fixes bug #595220. + +2009-09-15 10:01:54 +0200 David Henningsson + + * ext/pulse/pulsesink.c: + pulsesink: Don't dereference NULL pointers + pa_stream_get_timing_info() can return NULL. + Fixes bug #595220. + +2009-09-14 16:05:30 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: handle stream events + Handle stream events and request a PAUSE/PLAY state change from the application + when we receive a CORK/UNCORK event. + +2009-09-13 12:30:34 -0700 David Schleef + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + multifilesink: Add next-file property + Add a property to allow control over what event causes a file + to finish being written and a new file start. The default is + the same as before -- each buffer causes a new file to be + written. Added is a case where buffers are written to the + same file until a discontinuity in the stream. + +2009-09-13 15:55:02 -0700 David Schleef + + * ext/dv/gstdvdemux.c: + * ext/dv/gstdvdemux.h: + dvdemux: Use values from decoder structure directly + Don't store the same values in the GstDvDemux. This + fixes a bug where dvdemux would detect a stream as PAL + instead of NTSC, and silently parse it wrong. + +2009-09-13 12:20:23 -0700 David Schleef + + * ext/dv/Makefile.am: + * ext/dv/gstsmptetimecode.c: + * ext/dv/gstsmptetimecode.h: + * ext/dv/smpte_test.c: + dvdemux: Add code to parse SMPTE time codes + Code to convert time codes to/from timestamps and frame numbers. + +2009-09-13 12:01:27 -0700 David Schleef + + * ext/dv/gstdvdemux.c: + * ext/dv/gstdvdemux.h: + dvdemux: Fix detection of new media + There are 5 or 6 AAUX source control packs in a frame, and any + of them could have REC_ST cleared, indicating a recording start + point. libdv only checks the first. + +2009-09-12 19:25:36 +0200 Edward Hervey + + * ext/dv/gstdvdemux.c: + dvdemux: Set DISCONT flag on buffers when REC_ST flag is set. + Also add a few branch prediction macros + +2009-09-12 00:13:04 +0100 Jan Schmidt + + * tests/check/elements/souphttpsrc.c: + * tests/check/elements/y4menc.c: + check: Fix a couple of tests. + The souphttpsrc test wasn't compiling. The soup-misc.h header is needed for + soup_ssl_supported. + Fix the y4menc test to use a 'progressive' header for the test data now that + the element outputs correct interlacing info. + +2009-09-11 13:32:39 -0700 Michael Smith + + * gst/wavparse/gstwavparse.c: + wavparse: treat a zero-sized data chunk as extending to the end of the file. + This fixes playback of some files that don't have a valid data chunk length, + apparently some program creates these. + +2009-09-11 22:24:47 +0300 Stefan Kost + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + v4l2src: add a function pointer for get_frame function and optimize a bit + Use a function-pointer for mmap/read, as this can't change during capture. Also + sprinkle a few G_LIKELY/UNLIKELY to improve the error-less code path. + +2009-09-11 22:15:01 +0300 Stefan Kost + + * sys/v4l2/gstv4l2.c: + * sys/v4l2/v4l2src_calls.c: + v4l2: log buffer copies on queue underrun in perf category + v4l2src has a slow path where it does buffer-copies when it runs out of queued + buffers. Log this to performance category to help monitoring it. + +2009-09-11 15:14:15 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + pulsesink: Implement GstStreamVolume interface + +2009-09-11 16:09:40 +0200 Sebastian Dröge + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: Implement mute property + +2009-09-11 13:33:31 +0200 Wim Taymans + + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + gdkpixbufsink: fix docs refering to send-messages + +2009-09-11 13:28:35 +0200 Wim Taymans + + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + spectrum: add post-messages property + Add a post-messages property and deprecate the less descriptive message + property. + +2009-09-11 13:20:06 +0200 Wim Taymans + + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + * ext/gdk_pixbuf/gstgdkpixbufsink.h: + pixbufsink: add post-messages property + Add post-messages and deprecate send-messages as the former is more + descriptive of what actually happens. + +2009-09-11 13:12:54 +0200 Wim Taymans + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + multifilesink: rename silent to post-messages + Use the post-messages property name instead of silent as it is more + descriptive. + +2009-09-11 12:16:18 +0200 Wim Taymans + + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + multifilesink: post messages for each buffer + Add a silent property that can be set to FALSE to post messages on the bus for + each written file. + Do some more cleanups. + Add some docs. + Fixes #594663 + +2009-09-09 18:13:29 -0400 Olivier Crête + + * gst/rtp/gstrtph263pay.c: + rtph263pay: Allocate Boundry structs on the stack instead of the heap to avoid leaks + Fixes bug #594691. + +2009-09-10 10:28:48 +0300 Stefan Kost + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + docs: fix gtk-doc warnings + +2009-09-10 10:26:23 +0300 Stefan Kost + + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2sink.h: + docs: fix gtk-doc warnings + +2009-09-09 17:51:19 -0700 David Schleef + + * ext/raw1394/Makefile.am: + * ext/raw1394/gst1394clock.c: + * ext/raw1394/gst1394clock.h: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gstdv1394src.h: + dv1394src: Add a clock based on isochronous cycle counter + Partial fix for #169383. + +2009-09-09 16:02:03 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Fix AYUV->I420 conversion + For this fix the averaging of the chroma values. It should't be (a/2 + b)/2 + but just (a + b)/2. + Fixes bug #594599. + +2009-09-09 16:25:06 +0200 Wim Taymans + + * configure.ac: + * ext/pulse/pulsesink.c: + pulsesink: remove ringbuffer reset compensation + Remove the code to deal with a ringbuffer reset as this code is now in the base + class. + Bump the -base requirement as we need the new baseaudiosink code to function + properly. + +2009-09-09 16:24:49 +0200 Wim Taymans + + * ext/pulse/pulsesink.h: + pulsesink: whitespace fixes + +2009-09-09 10:27:55 +0200 Wim Taymans + + * sys/v4l2/gstv4l2colorbalance.h: + whitespace fixes + +2009-09-08 19:34:09 +0200 Wim Taymans + + * ext/pulse/pulsemixer.c: + * ext/pulse/pulsemixerctrl.c: + * ext/pulse/pulseprobe.c: + pulse: small cleanups + Add some debug info + Fix the state changes + +2009-09-08 18:29:35 +0200 Marc-André Lureau + + * gst/multipart/multipartmux.c: + multipartmux: mark data buffer as delta-unit + So that multifdsink always start sending header buffer first + Fixes #594520 + +2009-09-08 17:37:15 +0200 Marc Leeman + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + rtpbin: add ignore-pt parameter + Add a parameter 'ignore-pt' that disables creating a gstrtpptdemux module and + ghosts the pads of gstrtpjitterbuffer instead of the ones of gstrtpptdemux. + Fixes #594490 + +2009-09-04 13:51:37 +0200 Marvin Schmidt + + * tests/check/elements/souphttpsrc.c: + checks: only run HTTPS test if libsoup has SSL support + +2009-09-08 13:59:56 +0200 HÃ¥vard Graff + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + rtpbin: propagate payload-type-change signal from demuxer + fixes #594254 + +2009-08-31 18:46:25 +0200 Havard Graff + + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: change severity of clock-rate change debug + Make log GST_DEBUG under normal circumstances, GST_WARNING otherwise. + Fixes #594253 + +2009-09-08 13:39:31 +0200 HÃ¥vard Graff + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: avoid throwing reordered buffers with same timestamps + When we receive a reordered packet with the same timestamp as the previous one + (which can happen for fragmented packets) don't consider the packet as lost but + instead wait for the reordered packet to arrive. + Switch the warning-level, so that a reordering does not get a warning, only + an actual produced lost-packet. + Fixes #594251 + +2009-08-31 21:16:54 +0200 Havard Graff + + * gst/rtp/gstrtpjpegdepay.c: + rtpjpegdepay: add missing math.h include + Fixes #594247 + +2009-09-08 13:30:29 +0200 Arnout Vandecappelle + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix memory leak + In gst_rtspsrc_parse_digest_challenge(), rtspsrc does a g_strndup of the auth + header items and then passes them to gst_rtsp_connection_set_auth_param() + without freeing. + Fixes #594133 + +2009-09-08 13:18:29 +0200 Stig Sandnes + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: make free_session() remove stream references + When receiving a sync-packet, all sessions with the same cname will be compared + and synced together. In this process, there could still be references to a + session that has been shut down in the meanwhile. + This patch makes sure that these references are removed when shutting down a + session, so that the syncing can be done safely. + Fixes #594283 + +2009-08-31 18:46:51 +0200 Havard Graff + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: use locked state on internal bins + Set the locked state on internal elements to make sure that they don't change + back to another state when shutting down. + Fixes #594248 + +2009-09-07 18:28:51 +0200 Wim Taymans + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + v4l2src: add support for mpeg formats + +2009-09-05 20:51:14 -0700 Zaheer Merali + + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + y4menc: Add interlaced support + Fixes #591713 + Signed-off-by: David Schleef + +2009-08-24 13:42:42 -0700 David Schleef + + * ext/gconf/gstgconfaudiosink.c: + * ext/gconf/gstgconfaudiosrc.c: + * ext/gconf/gstgconfvideosink.c: + * ext/gconf/gstgconfvideosrc.c: + * gst/apetag/gstapedemux.c: + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautovideosink.c: + * gst/autodetect/gstautovideosrc.c: + * gst/avi/gstavidemux.c: + * gst/avi/gstavimux.c: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + * sys/v4l2/gstv4l2src.c: + Remove Ronald Bultje from Authors field + Replaced with "GStreamer maintainers + " or just removed, + depending on the number of other authors. + +2009-09-05 10:21:31 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 00a859e to 19fa4f3 + +2009-09-04 13:42:43 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: prevent a spurious debug warning + +2009-09-04 09:32:42 +0200 Sebastian Dröge + + * sys/v4l2/gstv4l2object.c: + v4l2: Define V4L2_FMT_FLAG_EMULATED if it's not defined yet + libv4l2 already uses this flag, even on Linux kernel versions + before 2.6.32. + +2009-09-04 07:10:03 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Correctly handle NULL GstIndex + +2009-09-03 20:40:17 +0200 Sebastian Dröge + + * sys/v4l2/gstv4l2object.c: + v4l2: Fix stupid typo in last commit + +2009-09-03 20:38:50 +0200 Sebastian Dröge + + * sys/v4l2/gstv4l2object.c: + v4l2: Put emulated formats behind native formats + Fixes bug #593764. + +2009-09-03 19:37:10 +0200 Laurent Glayal + + * gst/rtpmanager/rtpsource.c: + rtpsource: fix memleak + Don't leak the input buffer when the received and expected seqnum are different when + in probation. + fixes #594039 + +2009-09-02 15:21:02 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpjitterbuffer.c: + rtpjitterbuffer: Lock clock_rate variable + The priv->clock_rate variable could become -1 between when its checked to not + be -1 and when its used, causing an assertion. Fixed by taking the mutex + earlier in the chain() function. + Fixes #593955 + +2009-09-03 19:12:39 +0200 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: whitespace fixes + +2009-09-03 19:09:12 +0200 Wim Taymans + + * gst/rtp/gstrtpmpapay.c: + rtpmpapay: whitespace fixes + +2009-09-03 19:08:53 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: whitespace fixes + +2009-09-03 17:33:28 +0200 Edward Hervey + + * ext/jpeg/gstjpegdec.c: + jpegdec: Avoid unnecessary processing until we have a full picture. + This is for non-packetized mode, when we know the upstream size in bytes. + +2009-09-03 14:40:20 +0300 Stefan Kost + + * gst/flv/gstflvmux.c: + flvmux: fully use tagsetter to manage the tags. Fixes #563221 + There is no need to manage a separate taglist. + +2009-09-03 14:13:43 +0300 Stefan Kost + + * ext/speex/gstspeexenc.c: + speexenc: small taglist handling cleanup + Don't eventualy leak the list and instead assert (like in other elements). + +2009-09-02 23:12:41 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: also guard reseting subscribe callback with ifdefs + It is conditionaly set, so do the same when unsetting. + +2009-09-01 15:06:46 +0200 Peter Kjellerstedt + + * gst/rtpmanager/gstrtpsession.c: + rtpmanager: Fixed a copy & paste error + +2009-09-01 13:21:23 +0200 Peter Kjellerstedt + + * gst/rtpmanager/gstrtpsession.c: + rtpmanager: Removed unused variable priv + The variable priv was initialized in a lot of functions but then never + used for anything. + +2009-09-01 13:03:57 +0200 Peter Kjellerstedt + + * gst/rtpmanager/gstrtpsession.c: + rtpmanager: A little clean up + Make the code flow of gst_rtp_session_send_rtcp() and + gst_rtp_session_sync_rtcp() identical. + +2009-09-01 12:47:51 +0200 Peter Kjellerstedt + + * gst/rtpmanager/gstrtpsession.c: + rtpmanager: Make sure that used caps are not freed already (take 2) + This reintroduces the fix for bug #593391. It also applies it in + gst_rtp_session_sync_rtcp() which has very similar code to + gst_rtp_session_send_rtcp(). + +2009-09-01 12:41:36 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.h: + jitterbuffer: make sure time does not go backwards + When we construct a timestamp that would result in a timestamp that is earlier + than when the packet was received, reset the skew calculation as this is + probably a sign that the sender restarted or paused. + Fixes #593354 + +2009-09-01 11:32:41 +0200 Peter Kjellerstedt + + * gst/rtpmanager/gstrtpsession.c: + rtpmanager: Set caps in gst_rtp_session_send_rtcp() correctly again + The test for when to set an RTCP caps on the output pad in + gst_rtp_session_send_rtcp() accidentally got inverted in the last commit. + +2009-09-01 10:26:46 +0200 Sebastian Dröge + + * gst/qtdemux/qtdemux.c: + qtdemux: Add support for QCELP audio + Fixes bug #593757. + +2009-08-31 18:10:11 +0200 Peter Kjellerstedt + + * gst/effectv/gstaging.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstop.c: + * gst/effectv/gstradioac.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstvertigo.c: + effectv: Fix compilation with gcc 3 + Recent changes in gst-plugins-good/gst/effectv prevents it from being compiled + with gcc 3. The problem is that the new code uses preprocessor conditionals + within a macro call which does not work with older versions of gcc. + Fixes bug #593688. + +2009-08-31 16:20:59 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins-sections.txt: + docs: small clean-ups in -sections.txt + Remove duplicate entry for warptv; there is no taglibmux element. + +2009-08-27 15:46:52 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmp4gdepay.c: + rtpmp4gdepay: consider (optional) auxiliary data when parsing + +2009-08-27 15:46:15 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gdepay.h: + rtpmp4gdepay: handle broken AU-Index in non-interleaved streams + In case of non-interleaved (= sequentially payloaded) streams, + the AU-Index serves little purpose (that is not already covered by + RTP fields). (Broken) Payloaders might consider this field then + to be disregarded and have non spec compliant values, e.g. each + RTP packet having AU-Index 2 (rather than 0). As such, ensure/force + simple sequential sending of non-interleaved streams. + +2009-08-18 17:17:28 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: also extract ftyp info in push mode + +2009-08-13 16:11:59 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + qtdemux: consider 3gpp style tag parsing in some more cases + 3GPP specs define a number of tags along with precise layout. While these + are normally expected to be found in a container whose major brand is a + 3GPP brand, this may also happen when a 3GPP brand is only mentioned as a + compatible brand. Apply some checks, heuristic and fallbacks to extract + such tags as well. + +2009-08-11 13:56:43 +0200 Mark Nauwelaerts + + * gst/wavparse/gstwavparse.c: + wavparse: reflow exit, and fix some leaks + +2009-08-11 13:54:56 +0200 Mark Nauwelaerts + + * gst/wavparse/gstwavparse.c: + wavparse: push mode; add pad if needed so downstream gets EOS + +2009-08-10 16:19:03 +0200 Mark Nauwelaerts + + * gst/wavparse/gstwavparse.c: + * gst/wavparse/gstwavparse.h: + wavparse: push mode; fix/improve chunk handling + Handle large, invalid or otherwise unusual chunk sizes. + Verify some chunk sizes to be at least the size they are + expected to be and round up some sizes to even number for + e.g. offset administration, which must also be properly + tracked in push mode. + +2009-08-08 21:54:00 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + * gst/avi/gstavidemux.h: + avidemux: push mode; cater for unusual chunk sizes + +2009-08-31 16:34:14 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: use proper locking for pads and caps + Use the sesion lock and shotdown variable to protect and ref the pads we are + going to push on. + fixes #561825 + +2009-08-31 16:33:26 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: whitespace fixes + +2009-08-31 13:38:08 +0100 Tim-Philipp Müller + + * gst/wavparse/gstwavparse.c: + wavparse: clean up adapter properly + Reflow code so we don't try to clear or re-use an already-freed adapter. + +2009-08-31 13:07:53 +0100 Tim-Philipp Müller + + * ext/flac/gstflactag.c: + * gst/wavparse/gstwavparse.c: + flactag, wavparse: GstAdapter is not a GstObject + +2009-08-31 12:28:52 +0100 Tim-Philipp Müller + + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + docs: update plugin docs to git version + +2009-08-31 11:32:39 +0100 Jan Schmidt + + * gst/flv/gstflvdemux.c: + flvdemux: Fix tests warning from setting a NULL index + Setting a null index in the tests was causing warnings by unreffing + NULL pointers. This is a bug exposed by a recent change in core, it + seems. + +2009-08-31 13:02:16 +0200 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: add slope estimation code and debug + Add some code to measure the sender speed vs the receiver speed. This can be + used to detect bursts. + +2009-08-31 12:57:32 +0200 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: reset skew when timestamps change + Refactor the jitterbuffer resync code. + Reset the skew correction when we detect a big timestamp discont. + See #593354 + +2009-08-31 12:47:15 +0200 Wim Taymans + + * gst/rtpmanager/rtpjitterbuffer.c: + jitterbuffer: make sure time never goes invalid + Since the skew can be negative, we might end up with invalid timestamps. Check + for negative results and clamp to 0. + See #593354 + +2009-08-31 12:16:01 +0200 Jarkko Palviainen + + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudpnetutils.c: + udpsink: Add ttl multicast property + Add a new ttl-mc property to control the TTL on multicast addresses. + Fixes #588245 + +2009-08-31 12:13:07 +0200 Jarkko Palviainen + + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpnetutils.c: + * gst/udp/gstudpnetutils.h: + udp: split out TTL and loop options + Split setting the TTL and loop parameters in 2 methods as they are not related. + Fix setting the TTL correctly for multicast streams. + See #588245 + +2009-08-27 12:36:37 +0200 Wim Taymans + + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + rtp: whitespace fixes + +2009-08-14 13:45:22 +0200 Sebastian Dröge + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins.args: + videobox: Correctly add to the docs + +2009-08-14 13:40:21 +0200 Sebastian Dröge + + * gst/videobox/Makefile.am: + * gst/videobox/gstvideobox.c: + * gst/videobox/gstvideobox.h: + videobox: Split declarations into a header file and add autocrop stuff to the docs + +2009-08-14 13:26:36 +0200 Sebastian Dröge + + * gst/videobox/gstvideobox.c: + videobox: Reconfigure basetransform if something changes again + For this invent a new lock and don't abuse the basetransform lock, + otherwise we'll end up in deadlocks. + +2009-08-14 13:15:57 +0200 Stephen Jungels + + * gst/videobox/gstvideobox.c: + videobox: Add support for autocropping according to the caps + Fixes bug #582238. + +2009-08-30 21:57:57 +0200 Sebastian Dröge + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: Make sure that used caps are not freed already + Fixes bug #593391. + +2009-08-26 17:02:45 +0200 Sebastian Dröge + + * configure.ac: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtpmanager/rtpstats.c: + rtp: Use new gst_iterator_new_single() for the internal linked pads iteration + +2009-08-19 16:57:05 +0200 Sebastian Dröge + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: Use iterate internal links instead of deprecated get internal links + +2009-08-19 16:48:25 +0200 Sebastian Dröge + + * gst/rtpmanager/gstrtpjitterbuffer.c: + jitterbuffer: Use iterate internal links instead of deprecated get internal links + +2009-08-19 16:37:11 +0200 Sebastian Dröge + + * gst/rtpmanager/gstrtpssrcdemux.c: + rtpssrcdemux: Use iterate internal links instead of deprecated get internal links + +2009-08-30 23:27:09 +0100 Tim-Philipp Müller + + * common: + Update common + +2009-08-30 23:26:48 +0100 Tim-Philipp Müller + + * configure.ac: + Back to hacking -> 0.10.16.1 + +=== release 0.10.16 === + +2009-08-29 12:05:40 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * 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/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + Release 0.10.16 + +2009-08-26 00:58:45 +0100 Tim-Philipp Müller + + * configure.ac: + 0.10.15.5 pre-release + +2009-08-25 16:53:29 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: don't use relative seeks + Don't use relative seeks, it's too hard to track where we are after a flush + etc. + fixes #593015 + +2009-08-24 17:50:29 +0100 Tim-Philipp Müller + + * configure.ac: + * po/LINGUAS: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/lv.po: + * po/mt.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/pt_BR.po: + * po/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: + * po/zh_HK.po: + * po/zh_TW.po: + 0.10.15.4 pre-release + +2009-08-24 16:22:47 +0200 Wim Taymans + + * ext/pulse/pulsesrc.c: + pulsesrc: don't discard the result of _set_caps() + Use the result of gst_pad_set_caps() instead of assuming success. + See #590678 + +2009-08-21 11:44:43 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: add support for agsm + Fixes #592530 + +2009-08-18 17:16:11 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix qt style string tag extraction + QT style tags are tested on starting with (C) symbol using >>, + and (unsigned) int (may) have different >> behaviour. + Fixes #592232. + +2009-08-17 15:48:20 +0100 Tim-Philipp Müller + + * ext/jpeg/smokecodec.c: + smokeenc: don't crash when compiled against libjpeg7 + Set parameters so that we don't crash with libjpeg7. Based on + Stefan Kost's fix for jpegenc. Fixes #591951. + +2009-08-14 20:18:04 +0100 Tim-Philipp Müller + + * 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/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.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: + * po/zh_HK.po: + * po/zh_TW.po: + 0.10.15.3 pre-release + +2009-08-14 13:45:08 +0100 Tim-Philipp Müller + + * tests/check/elements/rtpbin.c: + checks: add test for leak to rtpbin unit test + See #591476. + +2009-08-11 14:47:12 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Fix reference leak + Fixes #591476. + +2009-08-14 13:34:53 +0100 Zaheer Merali + + * ext/dv/gstdvdec.c: + dvdec: set bottom field first on PAL interlaced content, not top field first + DV interlaced content is always bottom field first. Fixes #591712. + +2009-08-14 12:44:06 +0100 Hans de Goede + + * sys/v4l2/gstv4l2src.c: + v4l2src: fix 'hang' with some cameras caused by bad timestamping if no framerate is available + For cameras/drivers that don't support e.g. VIDIOC_G_PARM we'd end up without + a framerate and would try to divide by 0, causing run-time warnings and all + frames to be timestamped with 0, which makes sinks that sync against the clock + drop them, causing 'hangs' (observed with the pwc driver and a Logitech QuickCam + Pro 4000). So if we do not know the framerate, simply don't adjust the + timestamps. Fixes #591451. + +2009-08-14 10:11:25 +0200 Filippo Argiolas + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2src.c: + v4l2src: clear format list in READY->NULL + Clear format list and probed caps when going to NULL so if a new device + is set we'll probe the formats again instead of using previously + detected ones. Fixes bug #591747. + +2009-08-11 17:30:41 +0100 Tim-Philipp Müller + + * configure.ac: + * po/LINGUAS: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.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: + * po/zh_HK.po: + * po/zh_TW.po: + 0.10.15.2 pre-release + +2009-08-11 15:25:39 +0100 Tim-Philipp Müller + + * MAINTAINERS: + Add myself to MAINTAINERS file and update Wim's e-mail. + +2009-08-11 03:08:01 +0100 Tim-Philipp Müller + + * sys/v4l2/Makefile.am: + v4l2: fix make distcheck by disting some more headers + +2009-08-11 02:42:16 +0100 Tim-Philipp Müller + + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + docs: update + +2009-08-11 02:31:44 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * gst-plugins-good.spec.in: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/pipelines/.gitignore: + Move rtpmanager from -bad to -good. + Hook up build infrastructure (autotools, docs, unit test). + +2009-08-06 19:26:21 +0200 ric + + * gst/rtpmanager/rtpsource.c: + rtpsource: avoid buffer leak on bad seqnum + Fixes #590797 + +2009-07-28 18:18:20 +0200 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: allow for NULL caps on buffers + Add the NULL caps check where it matters and also cover another case of + potential NULL caps. + Fixes #590030 + +2009-07-28 11:59:56 -0400 Olivier Crête + + * gst/rtpmanager/rtpsource.c: + rtpsource: Incoming buffers do not always have caps + +2009-07-27 15:46:23 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: avoid doing lip-sync in BYE + When we get a BYE packet, don't do lip-sync with the SR inside because some + senders have trouble constructing valid SR packets after BYE. + +2009-07-27 13:17:20 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpbin: don't do lip-sync after a BYE + After a BYE packet from a source, stop forwarding the SR packets for lip-sync + to rtpbin. Some senders don't update their SR packets correctly after sending a + BYE and then we break lip-sync. We prefer to let the jitterbuffers drain with + the current lip-sync instead. + +2009-07-27 12:43:02 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpbin: only reconsider once for BYE + When iterating the sources of a BYE packet, don't signal a reconsideration for + each of them but signal after we handled all sources. + +2009-07-21 15:33:41 -0400 Olivier Crête + + * gst/rtpmanager/rtpsession.c: + rtpsession: Free conflicting addresses on finalize + +2009-07-01 12:55:03 +0200 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpbin: use new method for netaddress to string + +2009-06-29 18:48:33 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * tests/check/elements/rtpbin.c: + rtpbin: do better cleanup of the src ghostpads + Connect to the pad-removed signal of the ptdemux elements so that we remove the + ghostpads for them. Fixes cleanup when going to NULL as well as when releasing + the sinkpads. + Fixes #561752 + +2009-05-28 19:08:40 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + rtpsession: add a comment + +2009-06-29 16:37:54 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpsession.c: + rtpbin: add SDES property + Remove all individual SDES properties and use one sdes property that takes a + GstStructure instead. This will allow us to add more custom stuff to the SDES + messages later. + +2009-06-29 16:21:05 +0200 Wim Taymans + + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + rtpbin: add SDES property that takes GstStructure + Remove all individual SDES properties and use one sdes property that takes a + GstStructure instead. This will allow us to add more custom stuff to the SDES + messages later. + +2009-06-02 17:46:08 +0200 Wim Taymans + + * gst/rtpmanager/Makefile.am: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpclient.h: + * gst/rtpmanager/gstrtpmanager.c: + rtpbin: removed old gstrtpclient + +2009-06-19 19:09:19 +0200 Branko Subasic + + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + * tests/check/elements/rtpbin_buffer_list.c: + rtpbin: add support for buffer-list + Add support for sending buffer-lists. + Add unit test for testing that the buffer-list passed through rtpbin. + fixes #585839 + +2009-06-19 16:21:28 +0100 Tim-Philipp Müller + + * gst/rtpmanager/gstrtpjitterbuffer.c: + Make build without warnings with debugging disabled + +2009-05-28 17:37:44 -0400 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Transform the right session sdes message + Fixes #584165 + +2009-05-28 17:33:10 -0400 Olivier Crête + + * gst/rtpmanager/rtpsource.c: + Add ssrc to application/x-rtp-source-sdes structure + +2009-05-27 11:03:14 +0200 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsouce: the network address is in network order + Bring the network address in netowkr byte order to the host order. + +2009-05-26 15:40:52 +0200 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: byteswap the port from GstNetAddress + Since the port in GstNetAddress is in network order we might need to byteswap it + before adding it to the source statistics. + +2009-05-25 13:46:29 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: remove ptdemux ghostpads + +2009-05-25 13:33:20 +0200 Wim Taymans + + * tests/check/elements/rtpbin.c: + tests: add receive rtpbin unit test + +2009-05-22 16:41:19 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: add to new signal to remove SSRC pads + +2009-05-22 16:35:20 +0200 Ali Sabil + + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtpmanager/gstrtpssrcdemux.h: + ssrcdemux: emit signal when pads are removed + Add action signal to clear an SSRC in the ssrc demuxer. + Add signal to notify of removed ssrc. + See #554839 + +2009-05-22 15:45:19 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: use our ghostpads instead of its target + Since we keep a reference to our ghostpads, we can use them to track sessions. + This avoid us having to mess with the target of the ghostpad. + +2009-05-22 15:37:29 +0200 Wim Taymans + + * tests/check/elements/rtpbin.c: + tests: more rtpbin checks + +2009-05-22 15:36:17 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: don't warn when getting request pads twice + Allow getting the request pads multiple times, just return the previously + created pads. + +2009-05-22 13:47:30 +0200 Wim Taymans + + * gst/rtpmanager/rtpsource.c: + rtpsource: add RTP and RTCP source address + Add the RTP and RTCP sender addresses in the stats structure. + +2009-05-22 13:45:15 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + rtpsession: reuse source code for SDES + Reuse the RTPSource object property instead of duplicating code. + +2009-05-22 13:44:17 +0200 Wim Taymans + + * tests/check/elements/rtpbin.c: + tests: add more rtpbin tests + +2009-05-22 12:23:27 +0200 Wim Taymans + + * tests/check/elements/rtpbin.c: + tests: add rtpbin unit test + Add the beginnings of an rtpbin unit test + Add some more stuff to .gitignore + +2009-05-22 12:20:13 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: set target state on new elements + Set the state on newly added elements to the state of the parent. + Add some debug info and do some cleanups + +2009-05-22 11:59:17 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: unref requests pads after releasing + +2009-05-22 01:43:50 +0200 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement releasing the streams + See #561752 + +2009-05-22 01:16:11 +0200 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Keep jb signals handler + Keep the signal handlers so they can be disconnected at release time + See #561752 + +2009-05-22 01:12:57 +0200 Wim Taymans + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: use the right lock for the sessions + Use the right lock when iterating the sessions. + +2009-05-22 01:03:55 +0200 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Free session if request pads are released + Free the session when all the request pads are released. + Don't mess with the session list in free_session as it is called from a foreach + on that list. + Set the state of the upstream element to NULL first. + See #561752 + +2009-05-22 00:51:53 +0200 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement relasing of the rtp recv pad + +2009-05-22 00:44:51 +0200 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement releasing of rtp send pads + +2009-05-22 00:34:36 +0200 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement release of the recv rtcp pad + See #561752 + +2009-05-22 00:16:19 +0200 Olivier Crête + + * gst/rtpmanager/gstrtpbin.c: + rtpbin: Implement releasing of rtcp src pad + See #561752 + +2009-05-05 16:48:37 +0200 Wim Taymans + + * 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-04-27 11:09:08 +0200 Olivier Crete + + * 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 + + * 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-17 16:16:29 +0200 Wim Taymans + + * 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-15 18:14:48 +0200 Wim Taymans + + * 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 + + * 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 + + * 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 + + * 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-03-27 17:44:57 +0100 Wim Taymans + + * 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-13 15:59:37 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpsession.c: + rtpbin: don't return FALSE on seek events + Silently ignore the seek event instead of returning FALSE. + +2009-02-26 13:10:29 +0100 Olivier Crête + + * gst/rtpmanager/gstrtpsession.c: + gstrtpbin: Don't forward revc events to sender + Don't send events from the receiver to the sender side. + Fixes #572900. + +2009-02-25 11:45:05 +0200 Stefan Kost + + * gst/rtpmanager/rtpjitterbuffer.c: + docs: various doc fixes + No short-desc as we have them in the element details. + Also keep things (Makefile.am and sections.txt) sorted. + Reword ambigous returns. No text after since please. + +2009-01-23 12:13:00 +0100 Wim Taymans + + * gst/rtpmanager/rtpstats.c: + Send BYE packets immediatly for small sessions + When the number of participants is less than 50, the RFC allows for sending the + BYE packet immediatly instead of using the regular BYE timeout. + Fixes #567828. + +2009-01-22 13:33:14 +0100 Wim Taymans + + * gst/rtpmanager/gstrtpjitterbuffer.c: + Unlock the jitterbuffer before pushing out the packet-lost events. Move some code before we do the unlock to make the jitterbuffer state consistent while we are unlocked. + +2009-01-02 17:40:06 +0000 Olivier Crete + + gst/rtpmanager/: When an SSRC is found on the caps of the sender RTP, use this as the internal SSRC. Fixes #565910. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_setcaps_send_rtp), (create_send_rtp_sink): + * gst/rtpmanager/rtpsession.c: (rtp_session_set_internal_ssrc): + When an SSRC is found on the caps of the sender RTP, use this as the + internal SSRC. Fixes #565910. + +2009-01-02 16:50:53 +0000 Wim Taymans + + gst/rtpmanager/: Rename a method to better reflect what it really does. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_event_send_rtp_sink), + (gst_rtp_session_getcaps_send_rtp): + * gst/rtpmanager/rtpsession.c: (check_collision), + (rtp_session_schedule_bye_locked), (rtp_session_schedule_bye): + * gst/rtpmanager/rtpsession.h: + Rename a method to better reflect what it really does. + +2008-12-29 15:49:37 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Use method to get the internal SSRC. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_getcaps_send_rtp): + Use method to get the internal SSRC. + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (rtp_session_set_property), (rtp_session_get_property): + Add property to congiure the internal SSRC of the session. + Fixes #565910. + +2008-12-29 15:21:58 +0000 Wim Taymans + + gst/rtpmanager/rtpsession.c: Only change the SSRC of the session and reset the internal source when the SSRC actually... + Original commit message from CVS: + * gst/rtpmanager/rtpsession.c: (rtp_session_set_internal_ssrc): + Only change the SSRC of the session and reset the internal source when + the SSRC actually changed. See #565910. + +2008-12-29 14:21:47 +0000 Wim Taymans + + gst/rtpmanager/rtpsource.*: When no payload was specified on the caps but there was a clock-rate, assume the clock-ra... + Original commit message from CVS: + * gst/rtpmanager/rtpsource.c: (rtp_source_init), + (rtp_source_update_caps), (get_clock_rate): + * gst/rtpmanager/rtpsource.h: + When no payload was specified on the caps but there was a clock-rate, + assume the clock-rate corresponds to the first payload type found in the + RTP packets. Fixes #565509. + +2008-12-23 11:39:59 +0000 Arnout Vandecappelle + + gst/rtpmanager/rtpjitterbuffer.*: Keep track of the last outgoing timestamp and of the last sender-side time. Timest... + Original commit message from CVS: + Patch by: Arnout Vandecappelle + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), + (calculate_skew): + * gst/rtpmanager/rtpjitterbuffer.h: + Keep track of the last outgoing timestamp and of the last sender-side + time. Timestamps can only go forward if they do at the sender + side, can only go back if they do at the sender side, and remain the + same if they remain the same at the sender side. Fixes #565319. + +2008-11-26 12:40:18 +0000 Wim Taymans + + gst/rtpmanager/rtpsession.c: Make obtain_source return an aditional ref so that we don't lose our ref to it when a se... + Original commit message from CVS: + * gst/rtpmanager/rtpsession.c: (obtain_source), + (rtp_session_create_source), (rtp_session_process_rtp), + (rtp_session_process_sr), (rtp_session_process_rr), + (rtp_session_process_sdes), (rtp_session_process_bye): + Make obtain_source return an aditional ref so that we don't lose our ref + to it when a session cleanup occurs when we are emiting a signal. + Emit the on_new_ssrc signal for the CSRC, not the SSRC. + Fixes #562319. + +2008-11-26 12:02:21 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Reset the sync parameters when clearing the payload type map too. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_reset_sync), + (gst_rtp_bin_clear_pt_map): + Reset the sync parameters when clearing the payload type map too. + Fixes #562312. + +2008-11-26 11:44:37 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.*: Remove a lot of per stream state that is not needed and pass new info in the method call. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (get_client), + (gst_rtp_bin_reset_sync), (gst_rtp_bin_associate), + (gst_rtp_bin_handle_sync), (create_stream), + (gst_rtp_bin_class_init), (new_ssrc_pad_found): + * gst/rtpmanager/gstrtpbin.h: + Remove a lot of per stream state that is not needed and pass new info in + the method call. + Add signal to reset sync parameters. + Avoid parsing the caps to get a clock_base, we get this from the sync + signal now. + +2008-11-25 15:12:06 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Fix event leak. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_event_send_rtcp_src): + Fix event leak. + +2008-11-22 15:31:36 +0000 Wim Taymans + + gst/rtpmanager/rtpsession.c: Add property to configure the RTCP MTU. + Original commit message from CVS: + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (rtp_session_init), (rtp_session_set_property), + (rtp_session_get_property): + Add property to configure the RTCP MTU. + +2008-11-22 15:24:47 +0000 Wim Taymans + + gst/rtpmanager/rtpsession.c: Add G_PARAM_STATIC_STRINGS. + Original commit message from CVS: + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (copy_source), (rtp_session_create_sources), + (rtp_session_get_property): + Add G_PARAM_STATIC_STRINGS. + Add property to return a GValueArray of all known RTPSources in the + session. + * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), + (rtp_source_create_sdes), (rtp_source_set_property), + (rtp_source_get_property): + Remove properties to set the various SDES items, an application is never + supposed to change the RTPSource data. + Change the SDES getter properties to one SDES property that returns all + SDES items in a GstStructure. + +2008-11-22 13:17:24 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Also unref the target pad for unknown pads. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_release_pad): + Also unref the target pad for unknown pads. + +2008-11-21 16:17:22 +0000 Olivier Crete + + gst/rtpmanager/gstrtpbin.c: Release the right pads on rtpbin. Fixes #561752. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_release_pad): + Release the right pads on rtpbin. Fixes #561752. + +2008-11-20 18:41:34 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Pass the running time to the session when processing RTP packets. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (get_current_times), + (rtcp_thread), (gst_rtp_session_chain_recv_rtp): + Pass the running time to the session when processing RTP packets. + Improve the time function to provide more info. + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (rtp_session_init), (update_arrival_stats), + (rtp_session_process_rtp), (rtp_session_process_sdes), + (rtp_session_process_rtcp), (session_start_rtcp), + (rtp_session_on_timeout): + * gst/rtpmanager/rtpsession.h: + Mark the internal source with a flag. + Use running_time instead of the more useless timestamp. + Validate a source when a valid SDES has been received. + Pass the current system time when processing SR packets. + * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), + (rtp_source_init), (rtp_source_create_stats), + (rtp_source_get_property), (rtp_source_send_rtp), + (rtp_source_process_rb), (rtp_source_get_new_rb), + (rtp_source_get_last_rb): + * gst/rtpmanager/rtpsource.h: + Add property to get source stats. + Mark params as STATIC_STRINGS. + Calculate the bitrate at the sender SSRC. + Avoid negative values in the round trip time calculations. + * gst/rtpmanager/rtpstats.h: + Update some docs and change some variable name to more closely reflect + what it contains. + +2008-11-20 08:19:15 +0000 Sebastian Dröge + + gst/rtpmanager/gstrtpjitterbuffer.c: Initialize return value to fix compiler warning about uninitialized variable. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain_rtcp): + Initialize return value to fix compiler warning about uninitialized + variable. + +2008-11-19 16:48:38 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Mark signal arg as static scope. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init): + Mark signal arg as static scope. + +2008-11-19 09:06:29 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Remove internal sync pad, use signals instead to get lip-sync notifications. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), + (gst_rtp_bin_handle_sync), (create_stream), (free_stream), + (new_ssrc_pad_found): + Remove internal sync pad, use signals instead to get lip-sync + notifications. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_base_init), + (gst_rtp_jitter_buffer_class_init), + (gst_rtp_jitter_buffer_internal_links), (create_rtcp_sink), + (remove_rtcp_sink), (gst_rtp_jitter_buffer_request_new_pad), + (gst_rtp_jitter_buffer_release_pad), + (gst_rtp_jitter_buffer_sink_rtcp_event), + (gst_rtp_jitter_buffer_chain_rtcp), + (gst_rtp_jitter_buffer_get_property): + * gst/rtpmanager/gstrtpjitterbuffer.h: + Make it possible to send SR packets to the jitterbuffer. + Check if the SR timestamps are valid by comparing them to the RTP + timestamps. + Signal the SR packet and the timing information to listeners. + * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), + (gst_rtp_ssrc_demux_rtcp_chain), (gst_rtp_ssrc_demux_src_query): + Remove some unused code. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), + (calculate_skew), (rtp_jitter_buffer_get_sync): + * gst/rtpmanager/rtpjitterbuffer.h: + Keep track of the last seen RTP timestamp so that we can filter out + invalid SR packets. + +2008-11-17 19:47:32 +0000 Sebastian Dröge + + gst/rtpmanager/rtpsource.c: Fix GST_DEBUG call to only have as many arguments as required by the format string. Fixes... + Original commit message from CVS: + * gst/rtpmanager/rtpsource.c: (get_clock_rate): + Fix GST_DEBUG call to only have as many arguments as required + by the format string. Fixes a compiler warning. + +2008-11-17 15:17:52 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Do not try to keep track of the clock-rate ourselves but simply get the value from the ji... + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), + (gst_rtp_bin_sync_chain), (create_stream), (new_ssrc_pad_found): + Do not try to keep track of the clock-rate ourselves but simply get the + value from the jitterbuffer. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain), + (gst_rtp_jitter_buffer_get_sync): + * gst/rtpmanager/gstrtpjitterbuffer.h: + Add some debug info. + Pass the clock-rate to the jitterbuffer. + Also pass the clock-rate along with the rtp timestamp when getting the + sync parameters. + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): + Fix some debug. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), + (calculate_skew), (rtp_jitter_buffer_get_sync): + * gst/rtpmanager/rtpjitterbuffer.h: + Keep track of clock-rate changes and return the clock-rate together with + the rtp timestamps used for sync. + Don't try to construct timestamps when we have no base_time. + * gst/rtpmanager/rtpsource.c: (get_clock_rate): + Request a new clock-rate when the payload type changes. + Reset the jitter calculation when the clock-rate changes. + +2008-11-13 15:48:54 +0000 Wim Taymans + + gst/rtpmanager/: Small cleanups and some more debug info. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_jitter_buffer_sink_parse_caps), + (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_chain): + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), + (calculate_skew): + Small cleanups and some more debug info. + +2008-11-10 15:26:40 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Also configure the next expected output seqnum when we get a seqnum-base on the ... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain): + Also configure the next expected output seqnum when we get a seqnum-base + on the caps. + +2008-11-04 12:42:30 +0000 Stefan Kost + + Don't install static libs for plugins. Fixes #550851 for -bad. + Original commit message from CVS: + * ext/alsaspdif/Makefile.am: + * ext/amrwb/Makefile.am: + * ext/apexsink/Makefile.am: + * ext/arts/Makefile.am: + * ext/artsd/Makefile.am: + * ext/audiofile/Makefile.am: + * ext/audioresample/Makefile.am: + * ext/bz2/Makefile.am: + * ext/cdaudio/Makefile.am: + * ext/celt/Makefile.am: + * ext/dc1394/Makefile.am: + * ext/dirac/Makefile.am: + * ext/directfb/Makefile.am: + * ext/divx/Makefile.am: + * ext/dts/Makefile.am: + * ext/faac/Makefile.am: + * ext/faad/Makefile.am: + * ext/gsm/Makefile.am: + * ext/hermes/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/jack/Makefile.am: + * ext/jp2k/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/lcs/Makefile.am: + * ext/libfame/Makefile.am: + * ext/libmms/Makefile.am: + * ext/metadata/Makefile.am: + * ext/mpeg2enc/Makefile.am: + * ext/mplex/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/mythtv/Makefile.am: + * ext/nas/Makefile.am: + * ext/neon/Makefile.am: + * ext/ofa/Makefile.am: + * ext/polyp/Makefile.am: + * ext/resindvd/Makefile.am: + * ext/sdl/Makefile.am: + * ext/shout/Makefile.am: + * ext/snapshot/Makefile.am: + * ext/sndfile/Makefile.am: + * ext/soundtouch/Makefile.am: + * ext/spc/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/tarkin/Makefile.am: + * ext/theora/Makefile.am: + * ext/timidity/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * ext/xine/Makefile.am: + * ext/xvid/Makefile.am: + * gst-libs/gst/app/Makefile.am: + * gst-libs/gst/dshow/Makefile.am: + * gst/aiffparse/Makefile.am: + * gst/app/Makefile.am: + * gst/audiobuffer/Makefile.am: + * gst/bayer/Makefile.am: + * gst/cdxaparse/Makefile.am: + * gst/chart/Makefile.am: + * gst/colorspace/Makefile.am: + * gst/dccp/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/deinterlace2/Makefile.am: + * gst/dvdspu/Makefile.am: + * gst/festival/Makefile.am: + * gst/filter/Makefile.am: + * gst/flacparse/Makefile.am: + * gst/flv/Makefile.am: + * gst/games/Makefile.am: + * gst/h264parse/Makefile.am: + * gst/librfb/Makefile.am: + * gst/mixmatrix/Makefile.am: + * gst/modplug/Makefile.am: + * gst/mpeg1sys/Makefile.am: + * gst/mpeg4videoparse/Makefile.am: + * gst/mpegdemux/Makefile.am: + * gst/mpegtsmux/Makefile.am: + * gst/mpegvideoparse/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/nuvdemux/Makefile.am: + * gst/overlay/Makefile.am: + * gst/passthrough/Makefile.am: + * gst/pcapparse/Makefile.am: + * gst/playondemand/Makefile.am: + * gst/rawparse/Makefile.am: + * gst/real/Makefile.am: + * gst/rtjpeg/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/scaletempo/Makefile.am: + * gst/sdp/Makefile.am: + * gst/selector/Makefile.am: + * gst/smooth/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/speed/Makefile.am: + * gst/speexresample/Makefile.am: + * gst/stereo/Makefile.am: + * gst/subenc/Makefile.am: + * gst/tta/Makefile.am: + * gst/vbidec/Makefile.am: + * gst/videodrop/Makefile.am: + * gst/videosignal/Makefile.am: + * gst/virtualdub/Makefile.am: + * gst/vmnc/Makefile.am: + * gst/y4m/Makefile.am: + * sys/acmenc/Makefile.am: + * sys/cdrom/Makefile.am: + * sys/dshowdecwrapper/Makefile.am: + * sys/dshowsrcwrapper/Makefile.am: + * sys/dvb/Makefile.am: + * sys/dxr3/Makefile.am: + * sys/fbdev/Makefile.am: + * sys/oss4/Makefile.am: + * sys/qcam/Makefile.am: + * sys/qtwrapper/Makefile.am: + * sys/vcd/Makefile.am: + * sys/wininet/Makefile.am: + * win32/common/config.h: + Don't install static libs for plugins. Fixes #550851 for -bad. + +2008-10-16 13:05:37 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Fix problem with using the output seqnum counter to check for input seqnum disco... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_jitter_buffer_sink_parse_caps), + (gst_rtp_jitter_buffer_flush_start), + (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_chain), + (gst_rtp_jitter_buffer_loop): + Fix problem with using the output seqnum counter to check for input + seqnum discontinuities. + Improve gap detection and recovery, reset and flush the jitterbuffer on + seqnum restart. Fixes #556520. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_insert): + Fix wrong G_LIKELY. + +2008-10-16 09:51:28 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Install event handler on the rtcp_src pad, make LATENCY event return + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_event_send_rtcp_src), (create_send_rtcp_src): + Install event handler on the rtcp_src pad, make LATENCY event return + TRUE. + +2008-10-07 18:54:41 +0000 HÃ¥vard Graff + + gst/rtpmanager/gstrtpbin-marshal.list: Add marshaller for new action signal. + Original commit message from CVS: + Patch by: HÃ¥vard Graff + * gst/rtpmanager/gstrtpbin-marshal.list: + Add marshaller for new action signal. + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_get_internal_session), + (gst_rtp_bin_class_init): + * gst/rtpmanager/gstrtpbin.h: + Add action signal to retrieve the internal RTPSession object. + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (gst_rtp_session_get_property), (gst_rtp_session_release_pad): + Add property to access the internal RTPSession object. + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (check_collision): + * gst/rtpmanager/rtpsession.h: + Add action signal to retrieve an RTPSource object by SSRC. + See #555396. + +2008-10-07 11:33:10 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Release pads of the session manager. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (find_session_by_pad), + (free_session), (gst_rtp_bin_dispose), (remove_recv_rtp), + (remove_recv_rtcp), (remove_send_rtp), (remove_rtcp), + (gst_rtp_bin_release_pad): + Release pads of the session manager. + Start implementing releasing pads of gstrtpbin. + * gst/rtpmanager/gstrtpsession.c: (remove_recv_rtp_sink), + (remove_recv_rtcp_sink), (remove_send_rtp_sink), + (remove_send_rtcp_src), (gst_rtp_session_release_pad): + Implement releasing pads in gstrtpsession. + +2008-10-07 10:02:20 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Only update the seqnum-base when it was not already configured for the streams. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_jitter_buffer_sink_parse_caps): + Only update the seqnum-base when it was not already configured for the + streams. + +2008-09-30 15:08:52 +0000 Wim Taymans + + gst/rtpmanager/rtpsession.c: Ref the rtpsource object before we release the session lock when we emit the signals. + Original commit message from CVS: + * gst/rtpmanager/rtpsession.c: (on_new_ssrc), (on_ssrc_collision), + (on_ssrc_validated), (on_ssrc_active), (on_ssrc_sdes), + (on_bye_ssrc), (on_bye_timeout), (on_timeout), (on_sender_timeout): + Ref the rtpsource object before we release the session lock when we emit + the signals. + +2008-09-23 18:13:31 +0000 Wim Taymans + + gst/rtpmanager/: Fix some docs. + Original commit message from CVS: + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_insert), + (rtp_jitter_buffer_get_sync): + * gst/rtpmanager/rtpsession.c: (on_sender_timeout), + (session_cleanup): + * gst/rtpmanager/rtpsource.c: + Fix some docs. + +2008-09-17 13:59:21 +0000 Jan Schmidt + + Fix compiler warnings on OS/X + Original commit message from CVS: + * ext/jack/gstjackaudiosink.c: (jack_process_cb): + * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): + Fix compiler warnings on OS/X + +2008-09-13 01:37:50 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Do not try to adjust the offset of streams for which we have not yet seen an SR packet. A... + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_session), + (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain): + Do not try to adjust the offset of streams for which we have not yet + seen an SR packet. Avoids large ts-offsets in some cases. + +2008-09-05 13:52:34 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.*: Add signal to notify listeners when a sender becomes a receiver. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (on_sender_timeout), + (create_session), (gst_rtp_bin_associate), + (gst_rtp_bin_sync_chain), (gst_rtp_bin_class_init), + (gst_rtp_bin_request_new_pad): + * gst/rtpmanager/gstrtpbin.h: + Add signal to notify listeners when a sender becomes a receiver. + Tweak lip-sync code, don't store our own copy of the ts-offset of the + jitterbuffer, don't adjust sync if the change is less than 4msec. + Get the RTP timestamp <-> GStreamer timestamp relation directly from + the jitterbuffer instead of our inaccurate version from the source. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop), + (gst_rtp_jitter_buffer_get_sync): + * gst/rtpmanager/gstrtpjitterbuffer.h: + Add G_LIKELY macros, use global defines for max packet reorder and + dropouts. + Reset the jitterbuffer clock skew detection when packets seqnums are + changed unexpectedly. + * gst/rtpmanager/gstrtpsession.c: (on_sender_timeout), + (gst_rtp_session_class_init), (gst_rtp_session_init): + * gst/rtpmanager/gstrtpsession.h: + Add sender timeout signal. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), + (calculate_skew), (rtp_jitter_buffer_insert), + (rtp_jitter_buffer_get_sync): + * gst/rtpmanager/rtpjitterbuffer.h: + Add some G_LIKELY macros. + Keep track of the extended RTP timestamp so that we can report the RTP + timestamp <-> GStreamer timestamp relation for lip-sync. + Remove server timestamp gap detection code, the server can sometimes + make a huge gap in timestamps (talk spurts,...) see #549774. + Detect timetamp weirdness instead by observing the sender/receiver + timestamp relation and resync if it changes more than 1 second. + Add method to report about the current rtp <-> gst timestamp relation + which is needed for lip-sync. + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (on_sender_timeout), (check_collision), (rtp_session_process_sr), + (session_cleanup): + * gst/rtpmanager/rtpsession.h: + Add sender timeout signal. + Remove inaccurate rtp <-> gst timestamp relation code, the + jitterbuffer can now do an accurate reporting about this. + * gst/rtpmanager/rtpsource.c: (rtp_source_init), + (rtp_source_update_caps), (calculate_jitter), + (rtp_source_process_rtp): + * gst/rtpmanager/rtpsource.h: + Remove inaccurate rtp <-> gst timestamp relation code. + * gst/rtpmanager/rtpstats.h: + Define global max-reorder and max-dropout constants for use in various + subsystems. + +2008-08-28 15:21:45 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Send EOS when the session object instructs us to. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_send_rtcp), + (gst_rtp_session_event_send_rtp_sink): + Send EOS when the session object instructs us to. + * gst/rtpmanager/rtpsession.c: (rtp_session_on_timeout): + * gst/rtpmanager/rtpsession.h: + Make it possible for the session manager to instruct us to send EOS. We + currently will EOS when the session is a sender and when the sender part + goes EOS. This is not entirely correct behaviour because the session + could still participate as a receiver. + Fixes #549409. + +2008-08-13 14:31:02 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Reset rtp timestamp interpollation when we detect a gap when the clock_base changed. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), + (gst_rtp_bin_sync_chain), (new_ssrc_pad_found): + Reset rtp timestamp interpollation when we detect a gap when the + clock_base changed. + Don't try to adjust the ts-offset when it's too big (> 3seconds) + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_set_ssrc): + * gst/rtpmanager/gstrtpsession.h: + Add method to set session SSRC. + * gst/rtpmanager/rtpsession.c: (check_collision), + (rtp_session_set_internal_ssrc), (rtp_session_get_internal_ssrc), + (rtp_session_on_timeout): + * gst/rtpmanager/rtpsession.h: + Added debugging for the collision checks. + Add method to change the internal SSRC of the session. + * gst/rtpmanager/rtpsource.c: (rtp_source_process_rtp): + Reset the clock base when we detect large jumps in the seqnums. + +2008-08-11 07:20:15 +0000 Stefan Kost + + gst/rtpmanager/gstrtpbin.c: Print the pad-name in debug log. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: + Print the pad-name in debug log. + * sys/dshowsrcwrapper/gstdshowaudiosrc.c: + * sys/dshowsrcwrapper/gstdshowvideosrc.c: + Use "-" instead of "_" in property names. Can we call them just + "device" like everywhere else? + +2008-08-05 09:42:53 +0000 Olivier Crete + + gst/rtpmanager/gstrtpjitterbuffer.c: Make the buffer metadata writable before inserting it in the jitterbuffer becaus... + Original commit message from CVS: + Based on patch by: Olivier Crete + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): + Make the buffer metadata writable before inserting it in the + jitterbuffer because the jitterbuffer will modify the timestamps. + * gst/rtpmanager/rtpjitterbuffer.c: + Update method comment about requiring writable metadata on buffers. + * gst/rtpmanager/rtpsession.c: (rtp_session_process_sr), + (rtp_session_process_rtcp): + Make the RTCP buffer metadata writable because we want to modify the + metadata. + Fixes #546312. + +2008-08-05 09:00:50 +0000 HÃ¥vard Graff + + gst/rtpmanager/gstrtpjitterbuffer.c: Fix debug by logging the right seqnum. + Original commit message from CVS: + Patch by: HÃ¥vard Graff + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain): + Fix debug by logging the right seqnum. + +2008-08-05 08:58:27 +0000 Olivier Crete + + gst/rtpmanager/gstrtpbin.c: Release lock before emitting the request-pt-map signal. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpbin.c: (get_pt_map): + Release lock before emitting the request-pt-map signal. + Fixes #543480. + +2008-07-03 14:44:51 +0000 Peter Kjellerstedt + + gst/rtpmanager/: Corrected a typo (interpollate -> interpolate). + Original commit message from CVS: + * ChangeLog: + * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop): + * gst/rtpmanager/rtpsource.c: (rtp_source_get_new_sr): + Corrected a typo (interpollate -> interpolate). + +2008-07-03 14:31:10 +0000 Peter Kjellerstedt + + gst/rtpmanager/: Changed some GST_DEBUG() to GST_LOG() to reduce the spam when a pipeline is running normally. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), + (gst_rtp_session_send_rtp), (gst_rtp_session_send_rtcp), + (gst_rtp_session_sync_rtcp), (gst_rtp_session_chain_recv_rtp), + (gst_rtp_session_chain_recv_rtcp), (gst_rtp_session_chain_send_rtp): + * gst/rtpmanager/rtpsession.c: (source_push_rtp), + (rtp_session_send_rtp): + * gst/rtpmanager/rtpsource.c: (push_packet), (calculate_jitter), + (rtp_source_process_rtp), (rtp_source_send_rtp): + Changed some GST_DEBUG() to GST_LOG() to reduce the spam when a + pipeline is running normally. + +2008-07-03 13:47:19 +0000 Peter Kjellerstedt + + gst/rtpmanager/: Do not mix the use of g_get_current_time() with gst_clock_get_time(). + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_init), + (gst_rtp_session_finalize), (rtcp_thread), + (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_recv_rtcp), + (gst_rtp_session_event_send_rtp_sink), + (gst_rtp_session_chain_send_rtp): + * gst/rtpmanager/rtpsession.c: (check_collision), + (update_arrival_stats), (rtp_session_process_rtp), + (rtp_session_process_rtcp), (rtp_session_send_rtp), + (rtp_session_send_bye_locked), (rtp_session_send_bye), + (rtp_session_next_timeout), (session_report_blocks), (session_cleanup), + (is_rtcp_time), (rtp_session_on_timeout): + * gst/rtpmanager/rtpsession.h: + Do not mix the use of g_get_current_time() with gst_clock_get_time(). + +2008-06-16 07:30:34 +0000 Stefan Kost + + Final round of doc updates. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/speed/gstspeed.c: + * gst/speexresample/gstspeexresample.c: + * gst/videosignal/gstvideoanalyse.c: + * gst/videosignal/gstvideodetect.c: + * gst/videosignal/gstvideomark.c: + * sys/dvb/gstdvbsrc.c: + * sys/oss4/oss4-mixer.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + * sys/wininet/gstwininetsrc.c: + Final round of doc updates. + +2008-06-16 07:03:58 +0000 Stefan Kost + + gst/: More doc updates. More xrefs. + Original commit message from CVS: + * gst/deinterlace/gstdeinterlace.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/sdp/gstsdpdemux.c: + More doc updates. More xrefs. + +2008-06-12 14:49:18 +0000 Stefan Kost + + Do not use short_description in section docs for elements. We extract them from element details and there will be war... + Original commit message from CVS: + * ext/dc1394/gstdc1394.c: + * ext/ivorbis/vorbisdec.c: + * ext/jack/gstjackaudiosink.c: + * ext/metadata/gstmetadatademux.c: + * ext/mythtv/gstmythtvsrc.c: + * ext/theora/theoradec.c: + * gst-libs/gst/app/gstappsink.c: + * gst/bayer/gstbayer2rgb.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/rawparse/gstaudioparse.c: + * gst/rawparse/gstvideoparse.c: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/selector/gstinputselector.c: + * gst/selector/gstoutputselector.c: + * gst/videosignal/gstvideoanalyse.c: + * gst/videosignal/gstvideodetect.c: + * gst/videosignal/gstvideomark.c: + * sys/oss4/oss4-mixer.c: + * sys/oss4/oss4-sink.c: + * sys/oss4/oss4-source.c: + Do not use short_description in section docs for elements. We extract + them from element details and there will be warnings if they differ. + Also fixing up the ChangeLog order. + +2008-06-06 13:01:05 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Fix deadlock when shutting down, use a new lock instead to properly shutdown. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_init), + (gst_rtp_bin_finalize), (gst_rtp_bin_change_state): + Fix deadlock when shutting down, use a new lock instead to properly + shutdown. + +2008-05-27 16:48:10 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Break out of callbacks when we are shutting down. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: + (gst_rtp_bin_propagate_property_to_jitterbuffer), + (gst_rtp_bin_change_state), (new_payload_found), + (new_ssrc_pad_found): + Break out of callbacks when we are shutting down. + Make sure no state changes can happen when we reconfigure. + +2008-05-26 10:09:29 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: When checking the seqnum, reset the jitterbuffer if the gap is too big, we need ... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): + When checking the seqnum, reset the jitterbuffer if the gap is too big, + we need to do this so that we can better handle a restarted source. + Fix some comments. + * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew), + (rtp_jitter_buffer_insert): + Tweak the skew resync diff. + Use our working seqnum compare function in -base. + Rework the jitterbuffer insert code to make it clearer and more + performant by only retrieving the seqnum of the input buffer once and by + adding some G_LIKELY compiler hints. + Improve debugging for duplicate packets. + * gst/rtpmanager/rtpsource.c: (rtp_source_process_rtp): + Fix a comment, we don't do skew correction here.. + +2008-05-26 10:00:24 +0000 HÃ¥vard Graff + + gst/rtpmanager/gstrtpbin.c: Propagate the do-lost and latency properties to the jitterbuffers when they are changed o... + Original commit message from CVS: + Patch by: HÃ¥vard Graff + * gst/rtpmanager/gstrtpbin.c: + (gst_rtp_bin_propagate_property_to_jitterbuffer), + (gst_rtp_bin_set_property): + Propagate the do-lost and latency properties to the jitterbuffers when + they are changed on rtpbin. + +2008-05-26 09:57:40 +0000 Wim Taymans + + Don't use _gst_pad(). + Original commit message from CVS: + * examples/switch/switcher.c: (switch_timer): + * gst/replaygain/gstrgvolume.c: (gst_rg_volume_init): + * gst/rtpmanager/gstrtpclient.c: (create_stream): + * gst/sdp/gstsdpdemux.c: (gst_sdp_demux_stream_configure_udp), + (gst_sdp_demux_stream_configure_udp_sink): + * tests/check/elements/deinterleave.c: (GST_START_TEST), + (pad_added_setup_data_check_float32_8ch_cb): + * tests/check/elements/rganalysis.c: (send_eos_event), + (send_tag_event): + Don't use _gst_pad(). + +2008-05-16 19:56:30 +0000 Jan Schmidt + + docs/Makefile.am: Don't attempt to build plugin docs when they're disabled. + Original commit message from CVS: + * docs/Makefile.am: + Don't attempt to build plugin docs when they're disabled. + * gst/bayer/Makefile.am: + Add libgstvideo to the link. + * gst/rtpmanager/Makefile.am: + Fix link order, and move LIBS things to _LIBS + +2008-05-14 21:02:19 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Simply drop bad RTP packets with a warning instead of just posting an error and ... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain): + Simply drop bad RTP packets with a warning instead of just posting an + error and stopping. This is a perfectly recoverable event and we don't + force people to use an rtpbin to filter out bad packets first. + +2008-05-13 09:06:51 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Actually add the do-lost property to the object. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): + Actually add the do-lost property to the object. + +2008-05-12 18:43:41 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Avoid waiting for a negative (huge) duration when the last packet has a lower ti... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_loop): + Avoid waiting for a negative (huge) duration when the last packet has a + lower timestamp than the current packet. + +2008-05-12 14:28:09 +0000 Peter Kjellerstedt + + gst/rtpmanager/gstrtpsession.c: Make sure to unref the rtpsession returned by gst_pad_get_parent() to prevent a memor... + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_query_send_rtcp_src): + Make sure to unref the rtpsession returned by gst_pad_get_parent() to + prevent a memory leak. + +2008-05-12 14:12:08 +0000 Jan Schmidt + + gst/rtpmanager/gstrtpjitterbuffer.c: Initialise with GST_CLOCK_TIME_NONE to avoid compiler warning. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_loop): + Initialise with GST_CLOCK_TIME_NONE to avoid compiler warning. + +2008-05-09 07:41:58 +0000 Peter Kjellerstedt + + gst/rtpmanager/rtpsource.c: Make sure to unref the caps used by RTPSource to prevent a memory leak. + Original commit message from CVS: + * gst/rtpmanager/rtpsource.c: (rtp_source_finalize): + Make sure to unref the caps used by RTPSource to prevent a memory leak. + +2008-05-08 09:43:33 +0000 Olivier Crete + + gst/rtpmanager/rtpsession.c: Unlock the session lock when calling one of our callbacks. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/rtpsession.c: (source_clock_rate), + (rtp_session_process_bye), (rtp_session_send_bye_locked): + Unlock the session lock when calling one of our callbacks. + Fixes #532011. + +2008-05-08 06:23:39 +0000 Sjoerd Simons + + gst/rtpmanager/gstrtpsession.c: Send RTP BYE command on EOS. Fixes bug #531955. + Original commit message from CVS: + Patch by: Sjoerd Simons + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_event_send_rtp_sink): + Send RTP BYE command on EOS. Fixes bug #531955. + +2008-04-25 11:32:09 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.*: Expose new jitterbuffer property in rtpbin too. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_stream), (gst_rtp_bin_init), + (gst_rtp_bin_set_property), (gst_rtp_bin_get_property): + * gst/rtpmanager/gstrtpbin.h: + Expose new jitterbuffer property in rtpbin too. + +2008-04-25 11:22:13 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Disable sending out rtp packet lost events by default and make a property to ena... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_init), + (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_set_property), + (gst_rtp_jitter_buffer_get_property): + Disable sending out rtp packet lost events by default and make a + property to enabe it. We will likely enable it by default when the base + depayloaders have a default handler for them so that we don't send these + events all through the pipeline for now. + +2008-04-25 09:35:43 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Remove private version of a function that is in -base now. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_flush_stop), + (gst_rtp_jitter_buffer_src_event), (gst_rtp_jitter_buffer_chain), + (gst_rtp_jitter_buffer_loop): + Remove private version of a function that is in -base now. + Add src event handler. + Rework the jitterbuffer pushing loop so that it can quickly react to + lost packets and instruct the depayloader of them. This can then be used + to implement error concealment data. + +2008-04-25 08:21:06 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Set up some internal links functions for the RTCP and sync pads because the defaults ... + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_query_send_rtcp_src), (create_recv_rtcp_sink), + (create_send_rtcp_src): + Set up some internal links functions for the RTCP and sync pads because + the defaults are really not correct. + Implement a query handler for the RTCP src pad, mostly to correctly + report about the latency. + +2008-04-25 08:15:58 +0000 Wim Taymans + + gst/rtpmanager/: Also keep track of the first buffer timestamp together with the first + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), + (gst_rtp_bin_sync_chain): + * gst/rtpmanager/rtpsession.c: (update_arrival_stats), + (rtp_session_process_sr), (rtp_session_on_timeout): + * gst/rtpmanager/rtpsource.c: (rtp_source_init), + (calculate_jitter): + * gst/rtpmanager/rtpsource.h: + * gst/rtpmanager/rtpstats.h: + Also keep track of the first buffer timestamp together with the first + RTP timestamp as they both are needed to construct the timing of + outgoing packets in the jitterbuffer and are therefore also needed to + manage lip-sync. This fixes lip-sync if the first RTP packets arrive + with a wildly different gap. + +2008-04-21 08:26:37 +0000 Olivier Crete + + gst/rtpmanager/gstrtpbin.c: Ref caps when inserting into the cache. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), + (new_ssrc_pad_found): + Ref caps when inserting into the cache. + Don't leak pads. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_get_clock_rate), + (gst_rtp_jitter_buffer_query): + Avoid a caps leak. + Don't leak refcount in query. + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps), + (gst_rtp_pt_demux_chain): + Avoid caps leaks. + * gst/rtpmanager/gstrtpsession.c: (source_get_sdes_structure), + (gst_rtp_session_init), (return_true), + (gst_rtp_session_clear_pt_map), (gst_rtp_session_cache_caps), + (gst_rtp_session_clock_rate): + Ref caps when inserting into the cache. + Fix some more caps leaks. Fixes #528245. + +2008-04-17 07:31:44 +0000 Wim Taymans + + gst/rtpmanager/: Unset GValues after g_signal_emitv so that we avoid a refcount leak. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (get_pt_map), (free_client), + (gst_rtp_bin_associate), (gst_rtp_bin_get_free_pad_name): + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_get_clock_rate): + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps): + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): + Unset GValues after g_signal_emitv so that we avoid a refcount leak. + Don't leak a padname. + Don't leak client streams list. + Lock rtpbin when associating streams. Fixes #528245. + +2008-04-09 22:27:50 +0000 Peter Kjellerstedt + + gst/rtpmanager/: Avoid leaking pads in the RTP manager. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (free_session): + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_finalize): + Avoid leaking pads in the RTP manager. + +2008-03-11 12:40:58 +0000 Olivier Crete + + gst/rtpmanager/rtpsession.*: Implement collision and loop detection in rtpmanager. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/rtpsession.c: (find_add_conflicting_addresses), + (check_collision), (obtain_source), (rtp_session_create_new_ssrc), + (rtp_session_create_source), (rtp_session_process_rtp), + (rtp_session_process_sr), (rtp_session_process_rr), + (rtp_session_process_sdes), (rtp_session_process_bye), + (rtp_session_send_bye_locked), (rtp_session_send_bye), + (rtp_session_on_timeout): + * gst/rtpmanager/rtpsession.h: + Implement collision and loop detection in rtpmanager. + Fixes #520626. + * gst/rtpmanager/rtpsource.c: (rtp_source_reset), + (rtp_source_init): + * gst/rtpmanager/rtpsource.h: + Add method to reset stats. + +2008-03-11 11:36:03 +0000 Ole André Vadla RavnÃ¥s + + gst/rtpmanager/gstrtpsession.c: Avoid a deadlock when joining the RTCP thread in PAUSED because it might be blocked d... + Original commit message from CVS: + Based on patch by: Ole André Vadla RavnÃ¥s + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_init), + (rtcp_thread), (start_rtcp_thread), (stop_rtcp_thread), + (join_rtcp_thread), (gst_rtp_session_change_state): + Avoid a deadlock when joining the RTCP thread in PAUSED because it might + be blocked downstream. Also avoid spawning multiple rtcp threads. + Fixes #520894. + +2008-03-11 10:43:32 +0000 Stefan Kost + + gst/rtpmanager/rtpjitterbuffer.c: Don't try to reset the clock skew when we have no timestamps. + Original commit message from CVS: + Patch by: Stefan Kost + * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): + Don't try to reset the clock skew when we have no timestamps. + Fixes #519005. + +2008-02-20 09:33:25 +0000 Olivier Crete + + gst/rtpmanager/gstrtpbin.c: Fix small memory leak, leaking caps. Fixes #bug 517571. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpbin.c: (new_ssrc_pad_found): + Fix small memory leak, leaking caps. Fixes #bug 517571. + +2008-02-14 16:25:51 +0000 Olivier Crete + + gst/rtpmanager/gstrtpbin.c: Ignore streams that did not receive an SR packet when doing synchronisation. Fixes #516160. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate): + Ignore streams that did not receive an SR packet when doing + synchronisation. Fixes #516160. + +2008-01-29 18:57:27 +0000 Thijs Vermeir + + gst/rtpmanager/gstrtpjitterbuffer.c: Try to get the new clock-rate from the buffer caps when we receive a new payload... + Original commit message from CVS: + Patch by: Thijs Vermeir + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain): + Try to get the new clock-rate from the buffer caps when we receive a new + payload type instead of always firing the signal. Fixes #512774. + +2008-01-25 16:58:00 +0000 Olivier Crete + + gst/rtpmanager/gstrtpbin.c: Also handle lip-sync when the clock-rate is not provided with caps but with a signal. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), + (create_stream), (payload_type_change), (new_ssrc_pad_found): + Also handle lip-sync when the clock-rate is not provided with caps but + with a signal. + +2008-01-25 16:00:52 +0000 Olivier Crete + + gst/rtpmanager/: Remove the fixed clock-rate from the jitterbuffer and extend it so that a clock-rate can be provided... + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain): + * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew), + (rtp_jitter_buffer_insert): + * gst/rtpmanager/rtpjitterbuffer.h: + Remove the fixed clock-rate from the jitterbuffer and extend it so that + a clock-rate can be provided with each buffer instead. Fixes #511686. + +2008-01-25 15:49:55 +0000 Olivier Crete + + gst/rtpmanager/gstrtpjitterbuffer.c: Remove old unused variable. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_change_state), + (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): + Remove old unused variable. + Track pt on input buffers and get the clock-rate when it changes. + Ignore packets with unknown clock-rate. See #511686. + +2008-01-25 01:44:27 +0000 Olivier Crete + + gst/rtpmanager/rtpsource.c: Fix unref of buffer using the wrong function. Fixes #511920 + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtpmanager/rtpsource.c: Fix unref of buffer using the + wrong function. Fixes #511920 + +2008-01-11 17:02:30 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: If we find the caps in the cache, use it to parse the clock-rate instead of returning... + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): + If we find the caps in the cache, use it to parse the clock-rate instead + of returning an error. Fixes a TODO as found by Youness Alaoui. + +2008-01-11 16:45:57 +0000 Youness Alaoui + + gst/rtpmanager/: Make it possible to use different user_data for each of the callbacks. + Original commit message from CVS: + Patch by: Youness Alaoui + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): + * gst/rtpmanager/rtpsession.c: (rtp_session_set_callbacks), + (rtp_session_set_process_rtp_callback), + (rtp_session_set_send_rtp_callback), + (rtp_session_set_send_rtcp_callback), + (rtp_session_set_sync_rtcp_callback), + (rtp_session_set_clock_rate_callback), + (rtp_session_set_reconsider_callback), (source_push_rtp), + (source_clock_rate), (rtp_session_process_bye), + (rtp_session_process_rtcp), (rtp_session_send_bye), + (rtp_session_on_timeout): + * gst/rtpmanager/rtpsession.h: + Make it possible to use different user_data for each of the callbacks. + Fixes #508587. + +2008-01-10 20:57:17 +0000 Thijs Vermeir + + gst/rtpmanager/gstrtpbin.c: Fix documentation for latest patch + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: + Fix documentation for latest patch + +2008-01-10 14:34:30 +0000 Thijs Vermeir + + gst/rtpmanager/gstrtpbin.c: Allow request_new_pad with name NULL (bug #508515) + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: + Allow request_new_pad with name NULL (bug #508515) + +2008-01-09 14:39:44 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Don't set fixed caps, we can basically do everything the upsteam peer pad can renegot... + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (create_send_rtp_sink): + Don't set fixed caps, we can basically do everything the upsteam peer + pad can renegotiate to. Fixes #507940. + +2008-01-04 18:47:57 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Don't unref the popped buffer when we don't have ownership. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_loop): + Don't unref the popped buffer when we don't have ownership. + Fixes #507020. + +2007-12-31 13:12:06 +0000 Wim Taymans + + gst/rtpmanager/gstrtpssrcdemux.c: Don't clean up pads when going to PAUSED. + Original commit message from CVS: + * gst/rtpmanager/gstrtpssrcdemux.c: + (gst_rtp_ssrc_demux_change_state): + Don't clean up pads when going to PAUSED. + +2007-12-12 16:59:03 +0000 Wim Taymans + + gst/rtpmanager/: Clean up the dynamic pads when going to READY. + Original commit message from CVS: + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_finalize), + (gst_rtp_pt_demux_setup), (gst_rtp_pt_demux_release), + (gst_rtp_pt_demux_change_state): + * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_reset), + (gst_rtp_ssrc_demux_dispose), (gst_rtp_ssrc_demux_src_query), + (gst_rtp_ssrc_demux_change_state): + Clean up the dynamic pads when going to READY. + +2007-12-12 12:11:53 +0000 Wim Taymans + + gst/rtpmanager/: Fix some leaks. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_finalize), + (gst_rtp_bin_set_sdes_string), (gst_rtp_bin_get_sdes_string), + (gst_rtp_bin_handle_message): + * gst/rtpmanager/rtpsession.c: (rtp_session_finalize), + (rtp_session_send_bye): + * gst/rtpmanager/rtpsource.c: (rtp_source_finalize): + Fix some leaks. + +2007-12-10 18:36:04 +0000 Wim Taymans + + gst/rtpmanager/: Post a message when the SDES infor changes for a source. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init), + (gst_rtp_bin_handle_message): + * gst/rtpmanager/gstrtpsession.c: (source_get_sdes_structure), + (on_ssrc_sdes): + Post a message when the SDES infor changes for a source. + * gst/rtpmanager/rtpsession.c: + * gst/rtpmanager/rtpsource.c: + Update some comments. + +2007-12-10 15:34:19 +0000 Wim Taymans + + gst/rtpmanager/: Add signal to notify of an SDES change. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (on_ssrc_sdes), (create_session), + (gst_rtp_bin_class_init): + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpclient.h: + * gst/rtpmanager/gstrtpjitterbuffer.h: + * gst/rtpmanager/gstrtpmanager.c: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpptdemux.h: + * gst/rtpmanager/gstrtpsession.c: (on_ssrc_sdes), + (gst_rtp_session_class_init), (gst_rtp_session_init): + * gst/rtpmanager/gstrtpsession.h: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtpmanager/gstrtpssrcdemux.h: + * gst/rtpmanager/rtpjitterbuffer.c: + * gst/rtpmanager/rtpjitterbuffer.h: + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (on_ssrc_sdes), (rtp_session_process_sdes): + * gst/rtpmanager/rtpsession.h: + * gst/rtpmanager/rtpsource.c: + * gst/rtpmanager/rtpsource.h: + * gst/rtpmanager/rtpstats.c: + * gst/rtpmanager/rtpstats.h: + Add signal to notify of an SDES change. + Fix object type in the signal callbacks. + +2007-12-10 14:03:32 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.*: Expose SDES items as properties and configure the session managers with them. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_session), + (gst_rtp_bin_class_init), (gst_rtp_bin_init), (sdes_type_to_name), + (gst_rtp_bin_set_sdes_string), (gst_rtp_bin_get_sdes_string), + (gst_rtp_bin_set_property), (gst_rtp_bin_get_property): + * gst/rtpmanager/gstrtpbin.h: + Expose SDES items as properties and configure the session managers with + them. + * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), + (rtp_source_set_property): + Fix SSRC property. + +2007-12-10 11:08:11 +0000 Wim Taymans + + gst/rtpmanager/: Update comment. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_session): + * gst/rtpmanager/rtpjitterbuffer.c: + Update comment. + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (gst_rtp_session_set_property), (gst_rtp_session_get_property): + Define some GObject properties to set SDES and other configuration. + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (rtp_session_init), (rtp_session_finalize), + (rtp_session_set_property), (rtp_session_get_property), + (on_ssrc_sdes), (rtp_session_set_bandwidth), + (rtp_session_get_bandwidth), (rtp_session_set_rtcp_fraction), + (rtp_session_get_rtcp_fraction), (rtp_session_set_sdes_string), + (rtp_session_get_sdes_string), (obtain_source), + (rtp_session_get_internal_source), (rtp_session_process_sdes), + (rtp_session_send_rtp), (rtp_session_next_timeout), (session_sdes), + (is_rtcp_time): + * gst/rtpmanager/rtpsession.h: + Add signal when new SDES infor has been found for a source. + Create properties for SDES and other info. + Simplify the SDES API. + Add method for getting the internal source object of the session. + * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), + (rtp_source_finalize), (rtp_source_set_property), + (rtp_source_get_property), (rtp_source_set_callbacks), + (rtp_source_get_ssrc), (rtp_source_set_as_csrc), + (rtp_source_is_as_csrc), (rtp_source_is_active), + (rtp_source_is_validated), (rtp_source_is_sender), + (rtp_source_received_bye), (rtp_source_get_bye_reason), + (rtp_source_set_sdes), (rtp_source_set_sdes_string), + (rtp_source_get_sdes), (rtp_source_get_sdes_string), + (rtp_source_get_new_sr), (rtp_source_get_new_rb): + * gst/rtpmanager/rtpsource.h: + Add GObject properties for various things. + Don't leak the bye reason. + +2007-11-22 09:08:27 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer can buffer an unlimited amount of time and thus has no max_latency ... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_query): + jitterbuffer can buffer an unlimited amount of time and thus has no + max_latency requirements. + +2007-11-02 21:45:38 +0000 Ole André Vadla RavnÃ¥s + + gst/rtpmanager/gstrtpsession.c: Fix bad function signatures (#492798). + Original commit message from CVS: + Patch by: Ole André Vadla RavnÃ¥s + * gst/rtpmanager/gstrtpsession.c: + Fix bad function signatures (#492798). + +2007-10-09 10:01:39 +0000 Laurent Glayal + + gst/rtpmanager/gstrtpbin.c: Fix memleak. Fixes #484990. + Original commit message from CVS: + Patch by: Laurent Glayal + * gst/rtpmanager/gstrtpbin.c: (create_stream), + (gst_rtp_bin_class_init): + Fix memleak. Fixes #484990. + +2007-10-08 17:46:45 +0000 Jan Schmidt + + gst/: Fix compiler warnings shown by Forte. + Original commit message from CVS: + * gst/librfb/rfbbuffer.c: (rfb_buffer_new_and_alloc): + * gst/librfb/rfbbuffer.h: + * gst/librfb/rfbdecoder.c: (rfb_socket_get_buffer): + * gst/mpegvideoparse/mpegvideoparse.c: (gst_mpegvideoparse_chain): + * gst/nsf/nes6502.c: (nes6502_execute): + * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps): + * gst/real/gstrealvideodec.c: (open_library): + * gst/real/gstrealvideodec.h: + * gst/rtpmanager/gstrtpsession.c: (create_recv_rtp_sink), + (create_recv_rtcp_sink), (create_send_rtp_sink): + Fix compiler warnings shown by Forte. + +2007-10-08 10:39:35 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Fix caps refcounting for payload maps. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (get_pt_map), + (gst_rtp_bin_clear_pt_map), (gst_rtp_bin_class_init): + Fix caps refcounting for payload maps. + When clearing payload maps, also clear sessions and streams payload + maps. + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps), + (gst_rtp_pt_demux_clear_pt_map), (gst_rtp_pt_demux_chain), + (find_pad_for_pt): + Implement clearing the payload map. + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_event_send_rtp_sink): + Forward flush events instead of leaking them. + * gst/rtpmanager/gstrtpssrcdemux.c: + (gst_rtp_ssrc_demux_rtcp_sink_event): + Correctly refcount events before pushing them. + +2007-10-05 17:26:14 +0000 Wim Taymans + + gst/rtpmanager/rtpsession.c: When reconsidering RTCP timeouts, set the next timeout against the last report time inst... + Original commit message from CVS: + * gst/rtpmanager/rtpsession.c: (rtp_session_next_timeout), + When reconsidering RTCP timeouts, set the next timeout against the last + report time instead of the current clock time so that we don't end up + reconsidering forever. + +2007-10-05 12:07:37 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Only peek at the tail element instead of popping it off, which allows us to grea... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): + Only peek at the tail element instead of popping it off, which allows + us to greatly simplify things when the tail element changes. + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_event_recv_rtp_sink): + * gst/rtpmanager/gstrtpssrcdemux.c: + (gst_rtp_ssrc_demux_sink_event): + Forward FLUSH events instead of leaking them. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), + (calculate_skew), (rtp_jitter_buffer_insert): + * gst/rtpmanager/rtpjitterbuffer.h: + Remove the tail-changed callback in favour of a simple boolean when we + insert a buffer in the queue. + Add method to peek the tail of the buffer. + +2007-10-02 10:27:45 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Remove some old unused variables. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_flush_start), + (gst_rtp_jitter_buffer_flush_stop), + (gst_rtp_jitter_buffer_change_state), (apply_offset), + (gst_rtp_jitter_buffer_loop): + Remove some old unused variables. + Don't add the latency to the skew corrected timestamp, latency is only + used to sync against the clock. + Improve debugging. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), + (rtp_jitter_buffer_reset_skew), (calculate_skew): + * gst/rtpmanager/rtpjitterbuffer.h: + Handle case where server timestamp goes backwards or wildly jumps by + temporarily pausing the skew correction. + Improve debugging. + +2007-09-28 14:51:58 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Fix crasher in dispose. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (free_client): + Fix crasher in dispose. + * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): + Handle cases where input buffers have no timestamps so that no clock + skew can be calculated, in this case interpollate timestamps based on + rtp timestamp and assume a 0 clock skew. + +2007-09-28 11:17:35 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Remove jitter correction code, it's now in the lower level object. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: (apply_latency), + (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query): + Remove jitter correction code, it's now in the lower level object. + Use new -core method for doing a peer query. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), + (calculate_skew), (rtp_jitter_buffer_insert): + * gst/rtpmanager/rtpjitterbuffer.h: + Move jitter correction to the lowlevel jitterbuffer. + Increase the max window size. + When filling the window, already start estimating the skew using a + parabolic weighting factor so that we have a much better startup + behaviour that gets more accurate with the more samples we have. + Increase the default weighting factor for the steady state to get + smoother timestamps. + +2007-09-26 20:08:28 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Fix cleanup crasher. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_dispose), + (gst_rtp_bin_finalize): + Fix cleanup crasher. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), + (calculate_skew): + * gst/rtpmanager/rtpjitterbuffer.h: + Dynamically adjust the skew calculation window so that we calculate it + over a period of around 2 seconds. + +2007-09-20 14:34:57 +0000 Wim Taymans + + gst/rtpmanager/: Add notification of active SSRCs to various RTP elements. Fixes #478566. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (on_ssrc_active), (create_session), + (gst_rtp_bin_class_init): + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpsession.c: (on_ssrc_active), + (gst_rtp_session_class_init), (gst_rtp_session_init), + (gst_rtp_session_event_send_rtp_sink): + * gst/rtpmanager/gstrtpsession.h: + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (on_ssrc_active), (rtp_session_process_rb): + * gst/rtpmanager/rtpsession.h: + Add notification of active SSRCs to various RTP elements. Fixes #478566. + +2007-09-17 02:01:41 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Link to the right pads regardless of which one was created first in the ssrc demuxer. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (new_ssrc_pad_found): + Link to the right pads regardless of which one was created first in the + ssrc demuxer. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), + (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_send_rtp): + * gst/rtpmanager/rtpsource.c: (calculate_jitter): + Improve debugging. + * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), + (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_finalize), + (gst_rtp_ssrc_demux_sink_event), + (gst_rtp_ssrc_demux_rtcp_sink_event), (gst_rtp_ssrc_demux_chain), + (gst_rtp_ssrc_demux_rtcp_chain), + (gst_rtp_ssrc_demux_internal_links): + * gst/rtpmanager/gstrtpssrcdemux.h: + Fix race in creating the RTP and RTCP pads when a new SSRC is detected. + +2007-09-16 19:40:31 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Use lock to protect variable. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_set_property), + (gst_rtp_bin_get_property): + Use lock to protect variable. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init), + (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain), + (convert_rtptime_to_gsttime), (gst_rtp_jitter_buffer_loop): + Reconstruct GST timestamp from RTP timestamps based on measured clock + skew and sync offset. + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), + (rtp_jitter_buffer_set_tail_changed), + (rtp_jitter_buffer_set_clock_rate), + (rtp_jitter_buffer_get_clock_rate), (calculate_skew), + (rtp_jitter_buffer_insert), (rtp_jitter_buffer_peek): + * gst/rtpmanager/rtpjitterbuffer.h: + Measure clock skew. + Add callback to be notfied when a new packet was inserted at the tail. + * gst/rtpmanager/rtpsource.c: (rtp_source_init), + (calculate_jitter), (rtp_source_send_rtp): + * gst/rtpmanager/rtpsource.h: + Remove clock skew detection, it's move to the jitterbuffer now. + +2007-09-15 18:48:03 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Also set NTP base time on new sessions. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_session): + Also set NTP base time on new sessions. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query), + (gst_rtp_jitter_buffer_set_property), + (gst_rtp_jitter_buffer_get_property): + Use the right lock to protect our variables. + Fix some comment. + * gst/rtpmanager/gstrtpsession.c: + (gst_rtp_session_getcaps_send_rtp), + (gst_rtp_session_chain_send_rtp), (create_send_rtp_sink): + Implement getcaps on the sender sinkpad so that payloaders can negotiate + the right SSRC. + +2007-09-12 21:23:47 +0000 Wim Taymans + + gst/rtpmanager/: Various leak fixes. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_session), (free_session), + (get_client), (free_client), (gst_rtp_bin_associate), + (free_stream), (gst_rtp_bin_class_init), (gst_rtp_bin_dispose), + (gst_rtp_bin_finalize): + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init), + (gst_rtp_jitter_buffer_finalize): + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_release): + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_finalize), + (gst_rtp_session_set_property), (gst_rtp_session_chain_recv_rtp), + (gst_rtp_session_chain_send_rtp): + * gst/rtpmanager/gstrtpssrcdemux.c: + (gst_rtp_ssrc_demux_class_init), (gst_rtp_ssrc_demux_dispose): + * gst/rtpmanager/rtpsession.c: (rtp_session_finalize): + * gst/rtpmanager/rtpsession.h: + Various leak fixes. + +2007-09-12 18:04:32 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Calculate and configure the NTP base time so that we can generate better + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (calc_ntp_ns_base), + (gst_rtp_bin_change_state), (new_payload_found), (create_send_rtp): + Calculate and configure the NTP base time so that we can generate better + NTP times in SR packets. + Set caps on new ghostpad. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_loop): + Clean debug statement. + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (gst_rtp_session_init), (gst_rtp_session_set_property), + (gst_rtp_session_get_property), (get_current_ntp_ns_time), + (rtcp_thread), (gst_rtp_session_event_recv_rtp_sink), + (gst_rtp_session_internal_links), (gst_rtp_session_chain_recv_rtp), + (gst_rtp_session_event_send_rtp_sink), + (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), + (create_send_rtp_sink): + * gst/rtpmanager/gstrtpsession.h: + Add ntp-ns-base property to convert running_time to NTP time. + Handle NEWSEGMENT events on send and recv RTP pads so that we can + calculate the running time and thus NTP time of the packets. + Simplify getting the current NTP time using the pipeline clock. + Implement internal links functions. + Use the buffer timestamp to calculate the NTP time instead of the clock. + * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), + (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_sink_event), + (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_rtcp_chain), + (gst_rtp_ssrc_demux_internal_links), + (gst_rtp_ssrc_demux_src_query): + * gst/rtpmanager/gstrtpssrcdemux.h: + Implement internal links function. + Calculate the diff between different streams, this might be used later + to get the inter stream latency. + * gst/rtpmanager/rtpsession.c: (rtp_session_send_rtp): + Simple cleanup. + * gst/rtpmanager/rtpsource.c: (rtp_source_init), + (calculate_jitter), (rtp_source_send_rtp), (rtp_source_get_new_sr): + Make the clock skew window a little bigger. + Apply the clock skew to all buffers, not just one with a new timestamp. + Calculate and debug sender clock drift. + Use extended last timestamp to interpollate for SR reports. + +2007-09-04 15:23:34 +0000 Tim-Philipp Müller + + gst/rtpmanager/gstrtpsession.c: Make compiler happy: fix compilation with -Wall -Werror (#473562). + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: + Make compiler happy: fix compilation with -Wall -Werror + (#473562). + +2007-09-03 21:19:34 +0000 Wim Taymans + + gst/rtpmanager/: Updated example pipelines in docs. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_get_client), + (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain), (create_stream), + (gst_rtp_bin_init), (caps_changed), (new_ssrc_pad_found), + (create_recv_rtp), (create_recv_rtcp), (create_send_rtp): + * gst/rtpmanager/gstrtpbin.h: + Updated example pipelines in docs. + Handle sync_rtcp buffers from the SSRC demuxer to perform lip-sync. + Set the default latency correctly. + Add some more points where we can get caps. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init), + (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_loop), + (gst_rtp_jitter_buffer_query), + (gst_rtp_jitter_buffer_set_property), + (gst_rtp_jitter_buffer_get_property): + Add ts-offset property to control timestamping. + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (gst_rtp_session_init), (gst_rtp_session_set_property), + (gst_rtp_session_get_property), (get_current_ntp_ns_time), + (rtcp_thread), (stop_rtcp_thread), (gst_rtp_session_change_state), + (gst_rtp_session_send_rtcp), (gst_rtp_session_sync_rtcp), + (gst_rtp_session_cache_caps), (gst_rtp_session_clock_rate), + (gst_rtp_session_sink_setcaps), (gst_rtp_session_chain_recv_rtp), + (gst_rtp_session_event_send_rtp_sink), + (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), + (create_recv_rtcp_sink), (create_send_rtp_sink), + (create_send_rtcp_src): + Various cleanups. + Feed rtpsession manager with NTP time based on pipeline clock when + handling RTP packets and RTCP timeouts. + Perform all RTCP with the system clock. + Set caps on RTCP outgoing buffers. + * gst/rtpmanager/gstrtpssrcdemux.c: (find_demux_pad_for_ssrc), + (create_demux_pad_for_ssrc), (gst_rtp_ssrc_demux_base_init), + (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_sink_event), + (gst_rtp_ssrc_demux_rtcp_sink_event), (gst_rtp_ssrc_demux_chain), + (gst_rtp_ssrc_demux_rtcp_chain): + * gst/rtpmanager/gstrtpssrcdemux.h: + Also demux RTCP messages. + * gst/rtpmanager/rtpsession.c: (rtp_session_set_callbacks), + (update_arrival_stats), (rtp_session_process_rtp), + (rtp_session_process_rb), (rtp_session_process_sr), + (rtp_session_process_rr), (rtp_session_process_rtcp), + (rtp_session_send_rtp), (rtp_session_send_bye), + (session_start_rtcp), (session_report_blocks), (session_cleanup), + (rtp_session_on_timeout): + * gst/rtpmanager/rtpsession.h: + Remove the get_time callback, the GStreamer part will feed us with + enough timing information. + Split sync timing and RTCP timing information. + Factor out common RB handling for SR and RR. + Send out SR RTCP packets for lip-sync. + Move SR and RR packet info generation to the source. + * gst/rtpmanager/rtpsource.c: (rtp_source_init), + (rtp_source_update_caps), (get_clock_rate), (calculate_jitter), + (rtp_source_process_rtp), (rtp_source_send_rtp), + (rtp_source_process_sr), (rtp_source_process_rb), + (rtp_source_get_new_sr), (rtp_source_get_new_rb), + (rtp_source_get_last_sr): + * gst/rtpmanager/rtpsource.h: + * gst/rtpmanager/rtpstats.h: + Use caps on incomming buffers to get timing information when they are + there. + Calculate clock scew of the receiver compared to the sender and adjust + the rtp timestamps. + Calculate the round trip in sources. + Do SR and RR calculations in the source. + +2007-08-31 15:26:14 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Use extended timestamp to release buffers from the jitterbuffer so that we can h... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_flush_stop), + (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_loop): + Use extended timestamp to release buffers from the jitterbuffer so that + we can handle the rtp wraparound correctly. + +2007-08-29 16:56:27 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Improve Comments. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_loop): + Improve Comments. + * gst/rtpmanager/gstrtpsession.c: (stop_rtcp_thread), + (gst_rtp_session_change_state), (gst_rtp_session_parse_caps), + (gst_rtp_session_clock_rate), (gst_rtp_session_sink_setcaps), + (gst_rtp_session_event_send_rtp_sink), (create_recv_rtp_sink), + (create_send_rtp_sink): + Also parse the sink caps for clock-rate instead of only relying on the + result of the signal. + * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): + Make sure we fetch the clock rate for payloads we are sending out so + that we can use it for SR reports. + +2007-08-29 01:22:43 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.*: Distribute synchronisation parameters to the session manager so that it can generate ... + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (stop_rtcp_thread), + (gst_rtp_session_change_state), + (gst_rtp_session_event_send_rtp_sink): + * gst/rtpmanager/gstrtpsession.h: + Distribute synchronisation parameters to the session manager so that it + can generate correct SR packets for lip-sync. + * gst/rtpmanager/rtpsession.c: (rtp_session_set_base_time), + (rtp_session_set_timestamp_sync), (session_start_rtcp): + * gst/rtpmanager/rtpsession.h: + Add methods for setting sync parameters. + Set correct RTP time in SR packets using the sync params. + * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): + * gst/rtpmanager/rtpsource.h: + Record last RTP <-> GST timestamp so that we can use them to convert NTP + to RTP timestamps in SR packets. + +2007-08-28 20:30:16 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Add some more advanced example pipelines. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_clear_pt_map): + Add some more advanced example pipelines. + * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), + (stop_rtcp_thread), (gst_rtp_session_send_rtcp): + Add some debug and FIXME. + Release LOCK when performing session cleanup. + * gst/rtpmanager/rtpsession.c: (session_report_blocks): + Add some debug. + * gst/rtpmanager/rtpsource.c: (calculate_jitter), + (rtp_source_send_rtp): + Make sure we always send RTP packets with the session SSRC. + +2007-08-27 21:17:21 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: When synchronizing buffers, take peer latency into account. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_loop), + (gst_rtp_jitter_buffer_query): + When synchronizing buffers, take peer latency into account. + Don't try to add our latency to invalid peer max latency values. + +2007-08-23 21:39:58 +0000 Tim-Philipp Müller + + Rename all GstRTPFoo structs to GstRtpFoo so that GST_BOILERPLATE registers a GType that's different than the GstRTPF... + Original commit message from CVS: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + * docs/plugins/gst-plugins-bad-plugins.signals: + * gst/rtpmanager/gstrtpbin.c: + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpclient.h: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/rtpmanager/gstrtpjitterbuffer.h: + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpptdemux.h: + * gst/rtpmanager/gstrtpsession.c: + * gst/rtpmanager/gstrtpsession.h: + * gst/rtpmanager/gstrtpssrcdemux.c: + * gst/rtpmanager/gstrtpssrcdemux.h: + Rename all GstRTPFoo structs to GstRtpFoo so that GST_BOILERPLATE + registers a GType that's different than the GstRTPFoo types that + farsight registers (luckily GType names are case sensitive). Should + finally fix #430664. + +2007-08-21 17:18:29 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: When drop-on-latency is set but we have no latency configured, just push the buf... + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain), + (gst_rtp_jitter_buffer_set_property): + When drop-on-latency is set but we have no latency configured, just push + the buffer as fast as possible. + Fix typo in comment. + +2007-08-21 16:04:47 +0000 Wim Taymans + + gst/rtpmanager/rtpjitterbuffer.*: Fix undefined overflow prone ts_diff handling. + Original commit message from CVS: + * gst/rtpmanager/rtpjitterbuffer.c: + (rtp_jitter_buffer_get_ts_diff): + * gst/rtpmanager/rtpjitterbuffer.h: + Fix undefined overflow prone ts_diff handling. + +2007-08-16 11:40:16 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Fix EOS handling. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_chain), + (gst_rtp_jitter_buffer_loop): + Fix EOS handling. + Convert some DEBUG into WARNINGs. + Pause task when flushing. + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (rtcp_thread), (gst_rtp_session_event_recv_rtcp_sink): + Use system clock for RTCP session management timeouts. + * gst/rtpmanager/rtpsession.c: (on_new_ssrc), (on_ssrc_collision), + (on_ssrc_validated), (on_bye_ssrc), (on_bye_timeout), (on_timeout): + Release the session lock when emiting signals. + +2007-08-13 06:16:40 +0000 Stefan Kost + + gst/rtpmanager/rtpjitterbuffer.c: Include stdlib. + Original commit message from CVS: + * gst/rtpmanager/rtpjitterbuffer.c: + Include stdlib. + +2007-08-10 17:16:53 +0000 Wim Taymans + + gst/rtpmanager/: Remove complicated async queue and replace with more simple jitterbuffer code while also fixing some... + Original commit message from CVS: + * gst/rtpmanager/Makefile.am: + * gst/rtpmanager/async_jitter_queue.c: + * gst/rtpmanager/async_jitter_queue.h: + * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_class_init), + (rtp_jitter_buffer_init), (rtp_jitter_buffer_finalize), + (rtp_jitter_buffer_new), (compare_seqnum), + (rtp_jitter_buffer_insert), (rtp_jitter_buffer_pop), + (rtp_jitter_buffer_flush), (rtp_jitter_buffer_num_packets), + (rtp_jitter_buffer_get_ts_diff): + * gst/rtpmanager/rtpjitterbuffer.h: + Remove complicated async queue and replace with more simple jitterbuffer + code while also fixing some bugs. + * gst/rtpmanager/gstrtpbin-marshal.list: + * gst/rtpmanager/gstrtpbin.c: (on_new_ssrc), (on_ssrc_collision), + (on_ssrc_validated), (on_bye_ssrc), (on_bye_timeout), (on_timeout), + (create_session), (gst_rtp_bin_class_init), (create_recv_rtp), + (create_send_rtp): + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_dispose), + (gst_jitter_buffer_sink_parse_caps), + (gst_rtp_jitter_buffer_flush_start), + (gst_rtp_jitter_buffer_flush_stop), + (gst_rtp_jitter_buffer_change_state), + (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_chain), + (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_set_property): + * gst/rtpmanager/gstrtpsession.c: (on_new_ssrc), + (on_ssrc_collision), (on_ssrc_validated), (on_bye_ssrc), + (on_bye_timeout), (on_timeout), (gst_rtp_session_class_init), + (gst_rtp_session_init): + * gst/rtpmanager/gstrtpsession.h: + * gst/rtpmanager/rtpsession.c: (on_bye_ssrc), (session_cleanup): + Use new jitterbuffer code. + Expose some new signals in preparation for handling EOS. + +2007-07-18 07:35:32 +0000 Stefan Kost + + Add stdlib include (free, atoi, exit). + Original commit message from CVS: + * examples/app/appsrc_ex.c: + * examples/switch/switcher.c: + * ext/neon/gstneonhttpsrc.c: + * ext/timidity/gstwildmidi.c: + * ext/x264/gstx264enc.c: + * gst/mve/mveaudioenc.c: (mve_compress_audio): + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/spectrum/demo-audiotest.c: + * gst/spectrum/demo-osssrc.c: + * sys/dvb/gstdvbsrc.c: + Add stdlib include (free, atoi, exit). + +2007-06-22 20:23:18 +0000 Jens Granseuer + + gst/: Build fixes for gcc-2.9x (no mid-block variable declarations etc.). + Original commit message from CVS: + Patch by: Jens Granseuer + * gst/equalizer/gstiirequalizer.c: + * gst/equalizer/gstiirequalizer10bands.c: + * gst/equalizer/gstiirequalizer3bands.c: + * gst/equalizer/gstiirequalizernbands.c: + * gst/rtpmanager/async_jitter_queue.c: + (async_jitter_queue_push_sorted): + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain): + * gst/switch/gstswitch.c: (gst_switch_chain): + Build fixes for gcc-2.9x (no mid-block variable declarations etc.). + Fixes #450185. + +2007-05-28 16:37:47 +0000 Wim Taymans + + Rename elements to avoid conflict with farsight elements with the same name. Fixes #430664. + Original commit message from CVS: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * gst/rtpmanager/gstrtpbin.c: (create_session), (create_stream), + (gst_rtp_bin_class_init), (create_recv_rtp), (create_recv_rtcp), + (create_send_rtp), (create_rtcp), (gst_rtp_bin_request_new_pad): + * gst/rtpmanager/gstrtpclient.c: (create_stream), + (gst_rtp_client_request_new_pad): + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_clear_pt_map), (gst_rtp_jitter_buffer_loop): + * gst/rtpmanager/gstrtpmanager.c: (plugin_init): + * gst/rtpmanager/gstrtpptdemux.c: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (gst_rtp_session_request_new_pad): + * gst/rtpmanager/gstrtpssrcdemux.c: + Rename elements to avoid conflict with farsight elements with the same + name. Fixes #430664. + +2007-05-23 13:08:52 +0000 Wim Taymans + + Document stuff. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init), + (gst_rtp_jitter_buffer_clear_pt_map), (gst_rtp_jitter_buffer_loop): + * gst/rtpmanager/gstrtpjitterbuffer.h: + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init), + (gst_rtp_pt_demux_clear_pt_map): + * gst/rtpmanager/gstrtpptdemux.h: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (rtcp_thread), (gst_rtp_session_clear_pt_map): + * gst/rtpmanager/gstrtpsession.h: + * gst/rtpmanager/gstrtpssrcdemux.c: + (gst_rtp_ssrc_demux_class_init): + Document stuff. + Add clear-pt-map action signal where needed. + +2007-05-15 13:29:53 +0000 Wim Taymans + + gst/rtpmanager/gstrtpptdemux.c: We always use fixed caps. + Original commit message from CVS: + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): + We always use fixed caps. + +2007-05-15 03:45:45 +0000 David Schleef + + gst/rtpmanager/gstrtpbin.c: g_hash_table_remove_all() only exists in 2.12. Work around. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: + g_hash_table_remove_all() only exists in 2.12. Work around. + +2007-05-14 15:28:36 +0000 Wim Taymans + + gst/rtpmanager/async_jitter_queue.c: Fix leak when flushing. + Original commit message from CVS: + * gst/rtpmanager/async_jitter_queue.c: + (async_jitter_queue_set_flushing_unlocked): + Fix leak when flushing. + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_clear_pt_map), + (gst_rtp_bin_class_init): + * gst/rtpmanager/gstrtpbin.h: + Add clear-pt-map signal. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_flush_stop), + (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_loop): + Init clock-rate to -1 to mark unknow clock rate. + Fix flushing. + +2007-05-10 14:02:07 +0000 Stefan Kost + + gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, gst_qtde... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, + gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, + gst_qtdemux_prepare_current_sample, gst_qtdemux_combine_flows, + gst_qtdemux_loop_state_movie, gst_qtdemux_loop, + qtdemux_parse_segments, qtdemux_parse_trak): + * gst/rtpmanager/rtpsession.c (rtp_session_get_bandwidth, + rtp_session_get_rtcp_bandwidth, rtp_session_get_cname, + rtp_session_get_name, rtp_session_get_email, rtp_session_get_phone, + rtp_session_get_location, rtp_session_get_tool, + rtp_session_process_bye, session_report_blocks): + * gst/rtpmanager/rtpsource.c (rtp_source_process_rtp, + rtp_source_send_rtp, rtp_source_process_sr, rtp_source_process_rb): + More format arg fixing (spotted by Ali Sabil ). + * gst/switch/Makefile.am: + Add require libraries(spotted by Ali Sabil ). + +2007-05-10 12:38:49 +0000 Stefan Kost + + * gst/rtpmanager/async_jitter_queue.c: + gst/rtpmanager/async_jitter_queue.c (tail_buffer_duration, async_jitter_queue_ref, async_jitter_queue_ref_unlocked, a... + Original commit message from CVS: + * gst/rtpmanager/async_jitter_queue.c (tail_buffer_duration, + async_jitter_queue_ref, async_jitter_queue_ref_unlocked, + async_jitter_queue_set_low_threshold, + async_jitter_queue_length_ts_units_unlocked, + async_jitter_queue_unref_and_unlock, async_jitter_queue_unref, + async_jitter_queue_lock, async_jitter_queue_push, + async_jitter_queue_push_unlocked, async_jitter_queue_push_sorted, + async_jitter_queue_pop_intern_unlocked, async_jitter_queue_pop, + async_jitter_queue_pop_unlocked, async_jitter_queue_length_unlocked, + async_jitter_queue_set_flushing_unlocked, + async_jitter_queue_unset_flushing_unlocked): + Format arg fix (spotted by Ali Sabil ) + +2007-05-09 11:24:22 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Pass queries upstream. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_query): + Pass queries upstream. + +2007-05-04 12:32:27 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Add some debug info. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_query): + Add some debug info. + * gst/rtpmanager/rtpsession.c: (rtp_session_init), + (rtp_session_send_rtp): + Store real user name in the session. + +2007-04-30 13:41:30 +0000 Wim Taymans + + gst/rtpmanager/async_jitter_queue.c: Fix the case where the buffer underruns and does not block. + Original commit message from CVS: + * gst/rtpmanager/async_jitter_queue.c: (signal_waiting_threads), + (async_jitter_queue_pop_intern_unlocked): + Fix the case where the buffer underruns and does not block. + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_base_init), + (create_recv_rtcp), (create_send_rtp), (create_rtcp), + (gst_rtp_bin_request_new_pad): + Rename RTCP send pad, like in the session manager. + Allow getting an RTCP pad for receiving even if we don't receive RTP. + fix handling of send_rtp_src pad. + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): + When no pt map could be found, fall back to the sinkpad caps. + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), + (gst_rtp_session_send_rtp), (create_recv_rtp_sink), + (create_recv_rtcp_sink), (create_send_rtp_sink), + (create_send_rtcp_src): + Fix pad names. + * gst/rtpmanager/rtpsession.c: (source_push_rtp), + (rtp_session_create_source), (rtp_session_process_sr), + (rtp_session_send_rtp), (session_start_rtcp): + * gst/rtpmanager/rtpsession.h: + Unlock session when performing a callback. + Add callbacks for the internal session object. + Fix sending of RTP packets. + first attempt at adding NTP times in the SR packets. + Small debug and doc improvements. + * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): + Update stats for SR reports. + +2007-04-29 14:46:27 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Remove debug. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_send_rtcp): + Remove debug. + * gst/rtpmanager/rtpsession.c: (rtp_session_process_sr), + (rtp_session_process_sdes), (calculate_rtcp_interval), + (rtp_session_next_timeout), (session_report_blocks): + * gst/rtpmanager/rtpstats.c: (rtp_stats_calculate_rtcp_interval): + Improve debugging + Fix interval for BYE/RTCP packets. + +2007-04-27 15:09:12 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Move reconsideration code to the rtpsession object. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), + (gst_rtp_session_send_rtcp), (gst_rtp_session_reconsider): + Move reconsideration code to the rtpsession object. + Simplify timout handling and add reconsideration. + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (rtp_session_init), (rtp_session_finalize), (on_bye_ssrc), + (on_bye_timeout), (on_timeout), (rtp_session_set_callbacks), + (obtain_source), (rtp_session_create_source), + (update_arrival_stats), (rtp_session_process_rtp), + (rtp_session_process_sr), (rtp_session_process_rr), + (rtp_session_process_bye), (rtp_session_process_rtcp), + (calculate_rtcp_interval), (rtp_session_send_bye), + (rtp_session_next_timeout), (session_start_rtcp), + (session_report_blocks), (session_cleanup), (session_sdes), + (session_bye), (is_rtcp_time), (rtp_session_on_timeout): + * gst/rtpmanager/rtpsession.h: + Handle timeout of inactive sources and senders. + Implement BYE scheduling. + * gst/rtpmanager/rtpsource.c: (calculate_jitter), + (rtp_source_process_sr), (rtp_source_get_last_sr), + (rtp_source_get_last_rb): + * gst/rtpmanager/rtpsource.h: + Add members to check for timeouts. + * gst/rtpmanager/rtpstats.c: (rtp_stats_init_defaults), + (rtp_stats_calculate_rtcp_interval), (rtp_stats_add_rtcp_jitter), + (rtp_stats_calculate_bye_interval): + * gst/rtpmanager/rtpstats.h: + Use RFC algorithm for calculating the reporting interval. + +2007-04-25 16:38:03 +0000 Wim Taymans + + gst/rtpmanager/gstrtpsession.c: Implement forward and reverse reconsideration. + Original commit message from CVS: + * gst/rtpmanager/gstrtpsession.c: (rtcp_thread): + Implement forward and reverse reconsideration. + * gst/rtpmanager/rtpsession.c: (rtp_session_get_num_sources), + (rtp_session_get_num_active_sources), (rtp_session_process_sr), + (session_report_blocks): + * gst/rtpmanager/rtpsession.h: + Small cleanups. + +2007-04-25 15:48:46 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.*: Make default jitterbuffer latency configurable. + Original commit message from CVS: + reviewed by: + * gst/rtpmanager/gstrtpbin.c: (create_stream), + (gst_rtp_bin_class_init), (gst_rtp_bin_set_property), + (gst_rtp_bin_get_property): + * gst/rtpmanager/gstrtpbin.h: + Make default jitterbuffer latency configurable. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init), + (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_loop), + (gst_rtp_jitter_buffer_set_property), + (gst_rtp_jitter_buffer_get_property): + Debuging cleanups. + +2007-04-25 13:19:36 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Report NO_PREROLL when going to PAUSED. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_change_state): + Report NO_PREROLL when going to PAUSED. + * gst/rtpmanager/gstrtpsession.c: (rtcp_thread): + Don't send RTCP right before we are shutting down. + * gst/rtpmanager/rtpsession.c: (rtp_session_process_rtp), + (rtp_session_process_sr), (session_report_blocks), + (rtp_session_perform_reporting): + Improve report blocks. + * gst/rtpmanager/rtpsource.c: (calculate_jitter), (init_seq), + (rtp_source_process_rtp), (rtp_source_process_sr), + (rtp_source_process_rb), (rtp_source_get_last_sr), + (rtp_source_get_last_rb): + * gst/rtpmanager/rtpsource.h: + * gst/rtpmanager/rtpstats.h: + Cleanups, add methods to access stats. + +2007-04-25 08:30:48 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: fix for pad name change + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_rtcp): + fix for pad name change + * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), + (gst_rtp_session_send_rtcp), (gst_rtp_session_clock_rate): + Fix for renamed methods. + * gst/rtpmanager/rtpsession.c: (rtp_session_init), + (rtp_session_finalize), (rtp_session_set_cname), + (rtp_session_get_cname), (rtp_session_set_name), + (rtp_session_get_name), (rtp_session_set_email), + (rtp_session_get_email), (rtp_session_set_phone), + (rtp_session_get_phone), (rtp_session_set_location), + (rtp_session_get_location), (rtp_session_set_tool), + (rtp_session_get_tool), (rtp_session_set_note), + (rtp_session_get_note), (source_push_rtp), (obtain_source), + (rtp_session_add_source), (rtp_session_get_source_by_ssrc), + (rtp_session_create_source), (rtp_session_process_rtp), + (rtp_session_process_sr), (rtp_session_process_sdes), + (rtp_session_process_rtcp), (rtp_session_send_rtp), + (rtp_session_get_reporting_interval), (session_report_blocks), + (session_sdes), (rtp_session_perform_reporting): + * gst/rtpmanager/rtpsession.h: + Prepare for implementing SSRC sampling. + Create SSRC for the session. + Add methods to set the SDES entries. + fix accounting of senders/receivers. + Implement SR/RR/SDES RTCP reporting. + * gst/rtpmanager/rtpsource.c: (rtp_source_init), (init_seq), + (rtp_source_process_rtp), (rtp_source_process_sr): + * gst/rtpmanager/rtpsource.h: + Implement extended sequence number. + * gst/rtpmanager/rtpstats.c: (rtp_stats_calculate_rtcp_interval): + * gst/rtpmanager/rtpstats.h: + Rename some fields. + +2007-04-21 19:21:49 +0000 Tim-Philipp Müller + + gst/rtpmanager/rtpsession.c: Don't use GLib-2.10 API, we only require GLib 2.8 at the moment. + Original commit message from CVS: + * gst/rtpmanager/rtpsession.c: (rtp_session_finalize): + Don't use GLib-2.10 API, we only require GLib 2.8 at the moment. + +2007-04-18 18:58:53 +0000 Wim Taymans + + configure.ac: Disable rtpmanager for now because it depends on CVS -base. + Original commit message from CVS: + * configure.ac: + Disable rtpmanager for now because it depends on CVS -base. + * gst/rtpmanager/Makefile.am: + Added new files for session manager. + * gst/rtpmanager/gstrtpjitterbuffer.h: + * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), + (create_stream), (pt_map_requested), (new_ssrc_pad_found): + Some cleanups. + the session manager can now also request a pt-map. + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_base_init), + (gst_rtp_session_class_init), (gst_rtp_session_init), + (gst_rtp_session_finalize), (rtcp_thread), (start_rtcp_thread), + (stop_rtcp_thread), (gst_rtp_session_change_state), + (gst_rtp_session_process_rtp), (gst_rtp_session_send_rtp), + (gst_rtp_session_send_rtcp), (gst_rtp_session_clock_rate), + (gst_rtp_session_get_time), (gst_rtp_session_event_recv_rtp_sink), + (gst_rtp_session_chain_recv_rtp), + (gst_rtp_session_event_recv_rtcp_sink), + (gst_rtp_session_chain_recv_rtcp), + (gst_rtp_session_event_send_rtp_sink), + (gst_rtp_session_chain_send_rtp), (create_send_rtcp_src), + (gst_rtp_session_request_new_pad): + * gst/rtpmanager/gstrtpsession.h: + We can ask for pt-map now too when the session manager needs it. + Hook up to the new session manager, implement the needed callbacks for + pushing data, getting clock time and requesting clock-rates. + Rename rtcp_src to send_rtcp_src to make it clear that this RTCP is to + be send to clients. + Add code to start and stop the thread that will schedule RTCP through + the session manager. + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (rtp_session_init), (rtp_session_finalize), + (rtp_session_set_property), (rtp_session_get_property), + (on_new_ssrc), (on_ssrc_collision), (on_ssrc_validated), + (on_bye_ssrc), (rtp_session_new), (rtp_session_set_callbacks), + (rtp_session_set_bandwidth), (rtp_session_get_bandwidth), + (rtp_session_set_rtcp_bandwidth), (rtp_session_get_rtcp_bandwidth), + (source_push_rtp), (source_clock_rate), (check_collision), + (obtain_source), (rtp_session_add_source), + (rtp_session_get_num_sources), + (rtp_session_get_num_active_sources), + (rtp_session_get_source_by_ssrc), + (rtp_session_get_source_by_cname), (rtp_session_create_source), + (update_arrival_stats), (rtp_session_process_rtp), + (rtp_session_process_sr), (rtp_session_process_rr), + (rtp_session_process_sdes), (rtp_session_process_bye), + (rtp_session_process_app), (rtp_session_process_rtcp), + (rtp_session_send_rtp), (rtp_session_get_rtcp_interval), + (rtp_session_produce_rtcp): + * gst/rtpmanager/rtpsession.h: + The advanced beginnings of the main session manager that handles the + participant database of RTPSources, SSRC probation, SSRC collisions, + parse RTCP to update source stats. etc.. + * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), + (rtp_source_init), (rtp_source_finalize), (rtp_source_new), + (rtp_source_set_callbacks), (rtp_source_set_as_csrc), + (rtp_source_set_rtp_from), (rtp_source_set_rtcp_from), + (push_packet), (get_clock_rate), (calculate_jitter), + (rtp_source_process_rtp), (rtp_source_process_bye), + (rtp_source_send_rtp), (rtp_source_process_sr), + (rtp_source_process_rb): + * gst/rtpmanager/rtpsource.h: + Object that encapsulates an SSRC and its state in the database. + Calculates the jitter and transit times of data packets. + * gst/rtpmanager/rtpstats.c: (rtp_stats_init_defaults), + (rtp_stats_calculate_rtcp_interval), (rtp_stats_add_rtcp_jitter): + * gst/rtpmanager/rtpstats.h: + Various stats regarding the session and sources. + Used to calculate the RTCP interval. + +2007-04-13 09:20:55 +0000 Wim Taymans + + gst/rtpmanager/: Protect lists and structures with locks. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), + (gst_rtp_bin_init), (gst_rtp_bin_finalize), (new_ssrc_pad_found), + (create_recv_rtp), (gst_rtp_bin_request_new_pad): + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (gst_rtp_session_init), (gst_rtp_session_finalize), + (gst_rtp_session_event_recv_rtp_sink), + (gst_rtp_session_event_recv_rtcp_sink), + (gst_rtp_session_chain_recv_rtcp), + (gst_rtp_session_request_new_pad): + Protect lists and structures with locks. + Return FLOW_OK from RTCP messages for now. + +2007-04-12 08:18:32 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Emit pt map requests and cache results. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), + (create_stream), (gst_rtp_bin_class_init), (pt_map_requested): + Emit pt map requests and cache results. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init), + (gst_jitter_buffer_sink_parse_caps), + (gst_jitter_buffer_sink_setcaps), + (gst_rtp_jitter_buffer_get_clock_rate), + (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): + * gst/rtpmanager/gstrtpjitterbuffer.h: + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): + Emit request-pt-map signals. + +2007-04-11 13:49:54 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin-marshal.list: Some more custom marshallers. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin-marshal.list: + Some more custom marshallers. + * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), + (clock_rate_request), (create_stream), (gst_rtp_bin_class_init), + (pt_map_requested), (new_ssrc_pad_found), (create_recv_rtp): + * gst/rtpmanager/gstrtpbin.h: + Prepare for caching pt maps. + Connect to signals to collect pt maps. + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_class_init), + (gst_jitter_buffer_sink_setcaps), (gst_rtp_jitter_buffer_loop): + * gst/rtpmanager/gstrtpjitterbuffer.h: + Add request_clock_rate signal. + Use scale insteat of scale_int because the later does not deal with + negative numbers. + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init), + (gst_rtp_pt_demux_chain): + * gst/rtpmanager/gstrtpptdemux.h: + Implement request-pt-map signal. + +2007-04-10 09:14:07 +0000 Wim Taymans + + gst/rtpmanager/: Added custom marshallers for signals. + Original commit message from CVS: + * gst/rtpmanager/.cvsignore: + * gst/rtpmanager/Makefile.am: + * gst/rtpmanager/gstrtpbin-marshal.list: + Added custom marshallers for signals. + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): + * gst/rtpmanager/gstrtpbin.h: + Prepare for emiting pt map signals. + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init): + * gst/rtpmanager/gstrtpssrcdemux.c: + (gst_rtp_ssrc_demux_class_init): + Fix signals. + +2007-04-06 12:28:29 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.*: Provide a clock. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init), + (gst_rtp_bin_init), (gst_rtp_bin_provide_clock): + * gst/rtpmanager/gstrtpbin.h: + Provide a clock. + +2007-04-06 12:07:30 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.c: Fix pad template name parsing. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (create_rtcp): + Fix pad template name parsing. + +2007-04-05 16:10:24 +0000 Wim Taymans + + gst/rtpmanager/gstrtpjitterbuffer.c: Add some debug and comments. + Original commit message from CVS: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_jitter_buffer_sink_setcaps), (gst_rtp_jitter_buffer_chain), + (gst_rtp_jitter_buffer_loop): + Add some debug and comments. + Fix double unref() in error cases. + +2007-04-05 13:54:23 +0000 Wim Taymans + + gst/rtpmanager/gstrtpbin.*: Add debugging category. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (find_session_by_id), + (create_session), (find_stream_by_ssrc), (create_stream), + (gst_rtp_bin_class_init), (new_payload_found), + (new_ssrc_pad_found), (create_recv_rtp), (create_recv_rtcp), + (create_send_rtp), (create_rtcp): + * gst/rtpmanager/gstrtpbin.h: + Add debugging category. + Added RTPStream to manage stream per SSRC, each with its own + jitterbuffer and ptdemux. + Added SSRCDemux. + Connect to various SSRC and PT signals and create ghostpads, link stuff. + * gst/rtpmanager/gstrtpmanager.c: (plugin_init): + Added rtpbin to elements. + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): + Fix caps and forward GstFlowReturn + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (gst_rtp_session_event_recv_rtp_sink), + (gst_rtp_session_chain_recv_rtp), + (gst_rtp_session_event_recv_rtcp_sink), + (gst_rtp_session_chain_recv_rtcp), + (gst_rtp_session_event_send_rtp_sink), + (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), + (create_recv_rtcp_sink), (create_send_rtp_sink), (create_rtcp_src), + (gst_rtp_session_request_new_pad): + Add debug category. + Add event handling + * gst/rtpmanager/gstrtpssrcdemux.c: (find_rtp_pad_for_ssrc), + (create_rtp_pad_for_ssrc), (gst_rtp_ssrc_demux_class_init), + (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_chain), + (gst_rtp_ssrc_demux_change_state): + * gst/rtpmanager/gstrtpssrcdemux.h: + Add debug category. + Add new-pt-pad signal. + +2007-04-04 10:23:15 +0000 Wim Taymans + + gst/rtpmanager/: Added simple SSRC demuxer. + Original commit message from CVS: + * gst/rtpmanager/Makefile.am: + * gst/rtpmanager/gstrtpmanager.c: (plugin_init): + * gst/rtpmanager/gstrtpssrcdemux.c: (find_pad_for_ssrc), + (create_pad_for_ssrc), (gst_rtp_ssrc_demux_base_init), + (gst_rtp_ssrc_demux_class_init), (gst_rtp_ssrc_demux_init), + (gst_rtp_ssrc_demux_finalize), (gst_rtp_ssrc_demux_sink_event), + (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_src_event), + (gst_rtp_ssrc_demux_change_state): + * gst/rtpmanager/gstrtpssrcdemux.h: + Added simple SSRC demuxer. + +2007-04-03 11:35:39 +0000 Wim Taymans + + gst/rtpmanager/: Some more ghostpad magic. + Original commit message from CVS: + * gst/rtpmanager/gstrtpbin.c: (find_session_by_id), + (create_session), (gst_rtp_bin_base_init), (create_recv_rtp), + (create_recv_rtcp), (create_send_rtp), (create_rtcp), + (gst_rtp_bin_request_new_pad): + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpclient.c: + Some more ghostpad magic. + +2007-04-03 09:51:13 +0000 Wim Taymans + + gst/rtpmanager/Makefile.am: Add .h file so it can be disted properly. + Original commit message from CVS: + * gst/rtpmanager/Makefile.am: + Add .h file so it can be disted properly. + +2007-04-03 09:13:17 +0000 Wim Taymans + + Add RTP session management elements. Still in progress. + Original commit message from CVS: + * configure.ac: + * gst/rtpmanager/Makefile.am: + * gst/rtpmanager/async_jitter_queue.c: (async_jitter_queue_new), + (signal_waiting_threads), (async_jitter_queue_ref), + (async_jitter_queue_ref_unlocked), + (async_jitter_queue_set_low_threshold), + (async_jitter_queue_set_high_threshold), + (async_jitter_queue_set_max_queue_length), + (async_jitter_queue_get_g_queue), (calculate_ts_diff), + (async_jitter_queue_length_ts_units_unlocked), + (async_jitter_queue_unref_and_unlock), (async_jitter_queue_unref), + (async_jitter_queue_lock), (async_jitter_queue_unlock), + (async_jitter_queue_push), (async_jitter_queue_push_unlocked), + (async_jitter_queue_push_sorted), + (async_jitter_queue_push_sorted_unlocked), + (async_jitter_queue_insert_after_unlocked), + (async_jitter_queue_pop_intern_unlocked), (async_jitter_queue_pop), + (async_jitter_queue_pop_unlocked), (async_jitter_queue_length), + (async_jitter_queue_length_unlocked), + (async_jitter_queue_set_flushing_unlocked), + (async_jitter_queue_unset_flushing_unlocked), + (async_jitter_queue_set_blocking_unlocked): + * gst/rtpmanager/async_jitter_queue.h: + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_base_init), + (gst_rtp_bin_class_init), (gst_rtp_bin_init), + (gst_rtp_bin_finalize), (gst_rtp_bin_set_property), + (gst_rtp_bin_get_property), (gst_rtp_bin_change_state), + (gst_rtp_bin_request_new_pad), (gst_rtp_bin_release_pad): + * gst/rtpmanager/gstrtpbin.h: + * gst/rtpmanager/gstrtpclient.c: (new_pad), (create_stream), + (free_stream), (find_stream_by_ssrc), (gst_rtp_client_base_init), + (gst_rtp_client_class_init), (gst_rtp_client_init), + (gst_rtp_client_finalize), (gst_rtp_client_set_property), + (gst_rtp_client_get_property), (gst_rtp_client_change_state), + (gst_rtp_client_request_new_pad), (gst_rtp_client_release_pad): + * gst/rtpmanager/gstrtpclient.h: + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_base_init), + (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_init), + (gst_rtp_jitter_buffer_dispose), (gst_rtp_jitter_buffer_getcaps), + (gst_jitter_buffer_sink_setcaps), (free_func), + (gst_rtp_jitter_buffer_flush_start), + (gst_rtp_jitter_buffer_flush_stop), + (gst_rtp_jitter_buffer_src_activate_push), + (gst_rtp_jitter_buffer_change_state), (priv_compare_rtp_seq_lt), + (compare_rtp_buffers_seq_num), (gst_rtp_jitter_buffer_sink_event), + (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop), + (gst_rtp_jitter_buffer_query), + (gst_rtp_jitter_buffer_set_property), + (gst_rtp_jitter_buffer_get_property): + * gst/rtpmanager/gstrtpjitterbuffer.h: + * gst/rtpmanager/gstrtpmanager.c: (plugin_init): + * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_base_init), + (gst_rtp_pt_demux_class_init), (gst_rtp_pt_demux_init), + (gst_rtp_pt_demux_finalize), (gst_rtp_pt_demux_chain), + (gst_rtp_pt_demux_getcaps), (find_pad_for_pt), + (gst_rtp_pt_demux_setup), (gst_rtp_pt_demux_release), + (gst_rtp_pt_demux_change_state): + * gst/rtpmanager/gstrtpptdemux.h: + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_base_init), + (gst_rtp_session_class_init), (gst_rtp_session_init), + (gst_rtp_session_finalize), (gst_rtp_session_set_property), + (gst_rtp_session_get_property), (gst_rtp_session_change_state), + (gst_rtp_session_chain_recv_rtp), + (gst_rtp_session_chain_recv_rtcp), + (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), + (create_recv_rtcp_sink), (create_send_rtp_sink), (create_rtcp_src), + (gst_rtp_session_request_new_pad), (gst_rtp_session_release_pad): + * gst/rtpmanager/gstrtpsession.h: + Add RTP session management elements. Still in progress. + +2009-08-10 13:30:23 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: push mode; cater for chunk padding + +2009-08-04 19:45:43 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: only use stream's pad after having checked it exists + +2009-08-04 13:38:09 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: sprinkle some more GST_DEBUG_FUNCPTR + +2009-08-04 13:36:36 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: post error message if no pads to push EOS event on + +2009-08-04 11:39:59 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: fix typo in warning message + +2009-08-04 11:39:39 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: fix some buffer ref handling + +2009-08-04 11:37:16 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: do not exceed maximum number of supported streams + +2009-08-04 11:35:18 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: prevent double unref; gst_avi_demux_parse_avih already unrefs + +2009-08-04 11:32:27 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: verify size of INFO LIST to satisfy subsequent expectations + +2009-07-29 15:25:38 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: check video stream framerate against avi header frame duration + The former might be bogus in silly cases, and the latter seems to + carry more weight. + +2009-08-04 12:16:13 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: streamline stream duration calculation + +2009-07-03 14:04:13 +0200 Edward Hervey + + * ext/raw1394/gstdv1394src.c: + dv1394src: Fix element for live usage... which has been broken for 2 years :( + This is a live source, therefore: + * Use GST_FORMAT_TIME as the default format + * set_timestamp to True + * properly implement query latency. + This allows expected live usage like : playbin2 uri=dv:// + +2009-08-09 09:43:41 +0200 Edward Hervey + + * ext/raw1394/gstdv1394src.c: + raw1394: Remove unneeded variable + +2009-08-09 09:43:29 +0200 Edward Hervey + + * gst/matroska/matroska-demux.c: + matroska: remove dead assignments + +2009-08-09 09:43:00 +0200 Edward Hervey + + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpceltdepay.c: + * gst/rtp/gstrtpj2kdepay.c: + * gst/rtp/gstrtpj2kpay.c: + rtp: Remove dead assignments and resulting unneeded variables. + +2009-08-10 09:53:28 +0200 Sebastian Dröge + + * configure.ac: + * ext/wavpack/Makefile.am: + * ext/wavpack/gstwavpackenc.c: + * ext/wavpack/gstwavpackenc.h: + * ext/wavpack/md5.c: + * ext/wavpack/md5.h: + wavpack: Use GLib GChecksum instead of our own MD5 implementation + This requires GLib 2.16 but that version is already required by core anyway. + +2009-08-08 00:47:48 -0300 Thiago Santos + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + matroska: Adds support to muxing/demuxing WMA + Adds support for muxing wma audio family and fixes + demuxing of wma family in matroskademux. matroskademux + was broken because it missed codec_data. + +2009-08-06 20:15:17 -0300 Thiago Santos + + * gst/matroska/matroska-mux.c: + matroskamux: adds support for wmv family + Adds support to WMV1, WMV2, WMV3 and other family formats that + are signaled by the 'format' field in the caps (i.e. WVC1). + Partially fixes #576378 + +2009-08-09 14:19:42 +0100 Tim-Philipp Müller + + * sys/v4l2/gstv4l2object.c: + v4l2src: if max == min width/height put an int in the probed caps, not an int range + Fixes #560033. + +2009-08-09 13:58:07 +0100 Tim-Philipp Müller + + * sys/osxaudio/gstosxaudiosrc.c: + osxaudiosrc: if max_channels == min_channels, use an int instead of an int range in the caps + +2009-08-09 12:52:17 +0200 LoneStar + + * gst/id3demux/id3v2frames.c: + id3demux: Try GST_*_TAG_ENCODING and locale encoding if tags are not UTF8 + Fixes bug #499242. + +2009-08-09 01:29:50 +0100 Tim-Philipp Müller + + * configure.ac: + configure: bump core/base requirements to latest release + To avoid confusion. + +2009-08-09 01:27:01 +0100 Tim-Philipp Müller + + * tests/check/elements/flvmux.c: + check: fix flvmux unit test on big endian machines + flvmux only accepts raw audio in little endian, but audiotestsrc + produces audio in the native endianness, which makes linking + between audiotestsrc and flvmux fail on big endian machines. Add + an audioconvert element in between the two to fix this. + +2009-02-15 18:49:44 +0000 Vincent Penquerc'h + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: + matroska: add kate subtitle support to matroska muxer and demuxer + See #525743. + +2009-08-07 16:51:45 +0100 Tim-Philipp Müller + + * gst/id3demux/id3v2.3.0.html: + id3demux: add ID3 v2.3 spec as well + +2009-08-07 16:42:39 +0100 Tim-Philipp Müller + + * gst/id3demux/id3v2frames.c: + id3demux: sizes in ID3 v2.3 are unlikely to be sync-safe integers + In ID3 v2.3 compressed frames will have a 4-byte data length indicator + after the frame header to indicate the size of the decompressed data. + This integer is unlikely to be a sync-safe integer for v2.3 tags, + only in v2.4 it's sync-safe. + +2009-08-07 16:36:55 +0100 Tim-Philipp Müller + + * gst/id3demux/id3tags.c: + id3demux: fix typo in debug message + +2009-08-07 16:02:23 +0100 Tim-Philipp Müller + + * gst/id3demux/id3tags.c: + * gst/id3demux/id3tags.h: + * gst/id3demux/id3v2frames.c: + * tests/check/elements/id3demux.c: + * tests/files/Makefile.am: + * tests/files/id3-588148-unsynced-v24.tag: + id3demux: fix parsing of unsync'ed ID3 v2.4 tags and frames + Reversing the unsynchronisation seems to work slightly differently + for ID3 v2.3 tags and v2.4 tags: v2.3 tags don't have syncsafe frame + sizes in the frame header, so the unsynchronisation is applied to + the whole frame data including all the frame headers. v2.4 frames + have sync-safe sizes, however, so the unsynchronisation only needs + to be applied to the actual frame data, and it seems that's what's + being done as well. So we need to undo the unsynchronisation on a + per-frame basis for v2.4 tags for things to work properly. + Fixes extraction of coverart/images from APIC frames in ID3 v2.4 + tags (#588148). + Add unit test for this as well. + +2009-08-06 21:24:14 +0200 Sebastian Dröge + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Use SOUP_METHOD_GET instead of "GET" string + Fixes bug #590970. + +2009-08-06 13:00:59 +0200 Wim Taymans + + * ext/pulse/pulsesrc.c: + pulsesrc: set the default slave method to skew + Set the default slave method to the much better skew algorithm. This is the + default in the new base class but we override this here as well for the + upcomming release. + +2009-08-06 10:20:34 +0100 Tim-Philipp Müller + + * ext/pulse/pulsesrc.c: + pulsesrc: fix compilation with --disable-gst-debug + +2009-08-03 18:59:32 +0200 Wim Taymans + + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + rtph264pay: use array instead of queue + +2009-08-03 18:55:19 +0200 Mark Nauwelaerts + + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + rtph264pay: push NALs only after SPS/PPS + parse complete (bytestream) buffer for SPS/PPS before pushing NALs. + Fixes #564501. + +2009-08-04 14:44:36 +0200 Sebastian Dröge + + * sys/v4l2/v4l2_calls.h: + v4l2: Directly use GST_PTR_FORMAT for printing caps with the LOG_CAPS macro + +2009-08-04 11:17:17 +0200 Edward Hervey + + * gst/rtp/gstrtpqdmdepay.c: + rtpqdm2depay: Fix debug statement. + +2009-08-04 09:32:07 +0200 Sebastian Dröge + + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/v4l2_calls.h: + v4l2: Remove some OMAP specific hacks + They require special build flags and are not useful in general. + +2009-08-04 09:22:29 +0200 Rob Clark + + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/gstv4l2bufferpool.h: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/v4l2src_calls.c: + v4l2sink: change where buffers get dequeued + It seems to cause strange occasional high latencies (almost 200ms) when dequeuing buffers from _buffer_alloc(). It is simpler and seems to work much better to dqbuf from the same thread that is queuing the next buffer. + +2009-08-04 09:14:20 +0200 Rob Clark + + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2bufferpool.c: + * sys/v4l2/gstv4l2bufferpool.h: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2sink.c: + * sys/v4l2/gstv4l2sink.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + v4l2: Add v4l2sink element + This also does the following changes: + (1) pull the bufferpool code out into gstv4l2bufferpool.c, and make a + bit more generic so it can be used both for v4l2src and v4l2sink + (2) move some of the device probing/configuration/caps stuff into + gstv4l2object.c so it does not have to be duplicated between + v4l2src and v4l2sink + Fixes bug #590280. + +2009-08-04 07:07:45 +0200 Sebastian Dröge + + * tests/check/Makefile.am: + flvmux: Enable unit test now that it passes + +2009-08-03 21:21:39 +0200 Edward Hervey + + * gst/rtp/gstrtpqdmdepay.c: + * gst/rtp/gstrtpsv3vdepay.c: + rtpqdm2depay,rtpsv3vdepay: Add debugging category. + +2009-08-03 21:22:48 +0200 Edward Hervey + + * gst/rtp/gstrtpqdmdepay.c: + * gst/rtp/gstrtpqdmdepay.h: + rtpqdm2depay: Handle gaps in incoming packets. + Whenever we see a gap, we flush the temporary packets (but not the adapter). If we + had some data temporarily stored it will be outputted (the sound will sound a bit + garbled... but that's how it sounds on MacOSX :) + +2009-08-03 19:01:07 +0200 Edward Hervey + + * gst/rtp/gstrtpqdmdepay.c: + rtpqdmdepay: Fix CRC calculation and remove commented code. + +2009-08-02 13:42:12 +0200 Edward Hervey + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpqdmdepay.c: + * gst/rtp/gstrtpqdmdepay.h: + rtp: New QDM2 rtp depayloader. + Reverse-engineered by comparing: + * A rtp hinted file provided by DarwinStreamingServer + * The output procued by DSS for that same file + Also used various streaming sources available on the internet to fine-tune + the code. + The header/codec_data extraction methods are from FFMpeg (LGPL). + +2009-08-03 21:24:44 +0200 Edward Hervey + + * gst/rtp/gstrtpsv3vdepay.c: + rtpsv3vdepay: Properly fill codec_data and cleanup code a bite more. + +2009-08-03 19:02:17 +0200 Edward Hervey + + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtpsv3vdepay.h: + rtpsv3vdepay: Only output buffers once we're configured. + +2009-08-03 19:02:00 +0200 Edward Hervey + + * gst/rtp/gstrtpsv3vdepay.c: + rtpsv3vdepay: Add more encoding-name variants + +2009-08-03 20:08:33 +0200 Sebastian Dröge + + * tests/check/elements/flvmux.c: + flvmux: Fix unit test to correctly handle request pads + Request pads are removed by the element instance in PAUSED->READY + so we need to re-request pads for every run and link them again. + Last fix for bug #590447. + +2009-08-03 20:08:00 +0200 Sebastian Dröge + + * gst/flv/gstflvmux.c: + flvmux: Fix writing of the index for < 128 buffers + Partially fixes bug #590447. + +2009-08-03 20:07:00 +0200 Sebastian Dröge + + * gst/flv/gstflvmux.c: + flvmux: Fix resetting of the element + Reset the have_video/have_audio flags and make sure to + properly release the request pads. + Partially fixes bug #590447. + +2009-08-03 18:13:46 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't add non-utf8 chars to structures + +2009-08-03 18:02:31 +0200 Luc Deschenaux + + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpjpegdepay.h: + jpegdepay: use attributes for extra properties + Use some of the SDP attributes when they are present to specify the output + dimension and framerate. This allows us to receive jpeg frames larger than + 2040 width/height. + Fixes #564437 + +2009-08-03 18:01:27 +0200 Wim Taymans + + * gst/rtp/README: + RTP docs: update with attributes in caps + +2009-08-03 17:21:44 +0200 Luc Deschenaux + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: put all SDP attributes on caps + Put the SDP attributes on the caps too so that they can be used by + depayloaders. + See #564437 + +2009-08-03 13:32:12 +0200 Jonathan Tellier + + * ext/pulse/pulsesrc.c: + pulsesrc: initialize the probe with the server + When creating a new probe, pass the server instead of the device string. + fixes #590401 + +2009-08-02 11:44:03 +0100 Tim-Philipp Müller + + * gst/udp/gstmultiudpsink.c: + multiudpsink: don't do things with side-effects inside g_return_val_if_fail() + Someone might compile this code with -DG_DISABLE_ASSERT some day. + +2009-08-01 21:39:30 +0100 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + pulsesink: don't do logic within g_assert() statements + Otherwise that code will just be expanded to nothing when compiled + -DG_DISABLE_ASSERT (PS: why is mainloop_start() called in the init + function and not when changing state to READY?) + +2009-08-01 17:07:42 +0100 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + flacdec: send newsegment event when operating push-based and unframed + For some reason flac doesn't call our metadata callback when we operate + in push mode with unframed input, but that's where we set up the + newsegment event (since that's where we'd get the duration from the + stream info header), so we didn't send a newsegment event at all in this + case. Hack around this by storing a generic newsegment event for now + which will be used if we don't replace it with a better one that + includes the duration. + +2009-08-01 16:48:36 +0100 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + flacdec: small cleanups + Remove some callback indirections which are no longer needed because + there's only one decoder object type now. Also remove unused variable. + +2009-08-01 15:22:49 +0100 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + flacdec: use gst_adapter_copy() to avoid unnecessary buffer merges + gst_adapter_peek() will merge buffers as needed, which we can avoid + here since we're doing a memcpy anyway and then flush the copied + data from the adapter right away. + +2009-08-01 00:00:41 +0100 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + flacdec: repair some broken indenting + +2009-08-01 12:19:41 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/elements/flvmux.c: + checks: add basic unit test for flvmux, but disable it for now + Basic unit test for flvmux. Fails miserably, hence disabled for now. + +2009-07-31 23:28:12 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/elements/flvdemux.c: + * tests/files/Makefile.am: + * tests/files/pcm16sine.flv: + check: add basic unit test for flvdemux + In particular, test re-use of flvdemux in both pull and push mode + (see #583030). + +2009-07-31 20:25:17 +0100 Tim-Philipp Müller + + * gst/flv/gstflvmux.c: + flvmux: fix invalid write caused by using sizeof("string") as length + sizeof("foo") includes the string's NUL-terminator in the size returned, + but we're writing strings here with an explicit size at the beginning + and no NUL-terminator. In most cases using sizeof("foo") as length in + memcpy is not harmful, but it is where the string goes right at the + end of our buffer to write, since we don't allocate space for that + NUL terminator. + +2009-07-27 18:44:45 +0200 Edward Hervey + + * ext/soup/gstsouphttpsrc.c: + soup: Use "GET" instead of SOUP_METHOD_GET. Fixes build with libsoup-2.7.* + This is due to a quality API change in libsoup 2.7. SOUP_METHOD_* are now + integers and not strings... they could have changed the names. + +2009-07-30 17:57:53 +0300 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + jpeg: use longer macro names to not clash with some stupid windows defines + libjpeg headers pull some windows system inlcudes (on windows) that contain a + define for DEFAULT_QUALITY. + +2009-07-29 14:31:48 +0200 Sebastian Dröge + + * gst/avi/gstavidemux.c: + avidemux: Fix last commit and improve readability + +2009-07-24 19:04:31 +0400 Руслан Ижбулатов + + * gst/avi/gstavidemux.c: + Fixed the fix for TIME->DEFAULT conversion. + Fixes bug #578052 again. + +2009-07-29 13:38:03 +0200 Edward Hervey + + * gst/rtp/gstrtpsv3vdepay.c: + rtpsv3depay: Fix width/height calculation, bring up to marginal rank. + Based on documentation found on http://wiki.multimedia.cx/ + +2009-07-29 12:13:20 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + pulse: conditionally compile newer stuff + configured_sink/source_usec in the timing_info is only since 0.9.11 so + conditionally compile this information. + fixes #590038 + +2009-07-28 18:29:07 +0200 Wim Taymans + + * ext/pulse/pulsesrc.c: + * ext/pulse/pulsesrc.h: + pulsesrc: cleanups + Keep track of the paused state of the source and leave the read function when + paused. + don't wait for a latency update when the delay is not yet known but simply + return 0 instead of blocking. + Keep track of the corked state of the stream. + Fix the state changes. + +2009-07-28 16:11:18 +0200 Wim Taymans + + * ext/pulse/pulsesrc.c: + pulsesrc: set maxlength always to -1 + +2009-07-28 15:53:57 +0200 Wim Taymans + + * ext/pulse/pulsesrc.c: + * ext/pulse/pulsesrc.h: + pulsesrc; cleanups, report real latency + Add some more debug info + Avoid some type casts + Report the real latency to the application. + +2009-07-28 16:11:36 +0200 Mark Nauwelaerts + + * ext/jpeg/gstjpegdec.c: + jpegdec: when scanning for 0xff marker ends, ensure desired result + Otherwise, any non 0xff byte at end of data would be mistaken for + a tag byte, and in case of a frame_len 0 tag subsequently lead to an + infinite loop. + +2009-07-28 00:30:43 -0300 Thiago Santos + + * gst/avi/gstavimux.c: + avimux: adds support to wma + +2009-07-28 00:07:15 -0300 Thiago Santos + + * gst/avi/gstavimux.c: + avimux: adds support to wmv + +2009-07-27 21:34:22 -0300 Thiago Santos + + * gst/qtdemux/qtdemux.c: + qtdemux: Downgrade warning message to debug + +2009-07-27 11:51:39 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: avoid using ivalid stream indexes + when we get an invalid stream index from pulse because we were just starting, + avoid using it for getting and setting the volume. + Fixes #589365 + +2009-07-24 19:38:07 +0200 Sebastian Dröge + + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstradioac.c: + * gst/effectv/gstripple.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gststreak.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + effectv: Don't allow caps changes for some effectv filters + These filters use information from previous frames to + generate the current frame and a caps change will make + the effect start from the beginning again. + +2009-07-24 19:37:09 +0200 Sebastian Dröge + + * gst/effectv/gstwarp.c: + * gst/effectv/gstwarp.h: + warptv: Make the sine table global instead of having it in every instance + +2009-07-24 10:47:44 +0300 Stefan Kost + + * ext/jpeg/gstjpegenc.c: + jpeg: make encoder work with libjpeg v7 + We have to specify do_fancy_downsampling = FALSE in the encoder with did not exist before. + +2009-07-24 00:42:33 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From fedaaee to 94f95e3 + +2009-07-23 12:06:27 +0200 Sebastian Dröge + + * ext/flac/gstflacdec.c: + flacdec: Implement SEEKING query + Fixes bug #589423. + +2009-07-22 11:16:06 +0100 Colin Guthrie + + * ext/pulse/pulsesink.c: + pulsesink: Fix a couple error messages that mentioned incorrect function names. + Fixes #589459. + +2009-07-23 11:50:16 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvparse.c: + flvdemux: Implement SEEKING query + Also add some more query types to the answer of the query type function. + Fixes bug #589424. + +2009-07-21 19:46:55 +0100 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + flacdec: fix intermittent FLAC__STREAM_DECODER_ABORTED errors when seeking + When seeking in a local flac file (ie. operating pull-based), the decoder + would often just error out after the loop function sees a DECODER_ABORTED + status. This, however, is the read callback's way of telling our loop + function that pull_range failed and streaming should stop, in this case + because of the flush-start event that the seek handler pushed upstream + from the seeking thread. Handle this slightly better by storing the last + flow return from pull_range, so the loop function can evaluate it properly + when it encounters a DECODER_ABORTED and take the right action. + Fixes #578612. + +2009-07-21 10:07:00 +0300 Stefan Kost + + * gst/interleave/interleave.c: + interleave: fix indenting and upgrade two debugs to warnings. + Fix newlines in variable decls. Change two debugs to become warnings as they + indicate that things will not work. + +2009-07-21 10:04:36 +0300 Stefan Kost + + * ext/jpeg/gstjpeg.c: + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstjpegenc.h: + jpeg: code cleanups for encoder + Remove some disabled code in encoder. Try #if 0'ed code and add comments about + why it is disabled. Move idct-method enum to jpeg.c and use in both encoder and + decoder. Add idct-method property to encoder. + +2009-07-21 07:50:46 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Answer SEEKING queries in the original format + +2009-07-21 01:12:44 +0200 Josep Torra + + * gst/udp/gstudpnetutils.c: + udputils: initialize struct content with 0. + Fixes some random crashes. + +2009-07-20 19:09:19 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: set some values to their defaults + Set the minreq and maxlength buffer attributes to -1 to let puleseaudio select a + sensible value. + +2009-07-20 19:04:09 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: don't wait for posted message + We can't wait for the ENTER/LEAVE messages to be be posted because the base + class sometimes calls the start method with the object lock, which would block + the message posting. + Instead, just assume that the message will be posted soon and continue. We'll + have to fix this in the base class. + +2009-07-20 18:11:33 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: use relative seeks + Use relative seeks because I was told that absolute seeks don't work. + +2009-07-20 16:52:19 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Implement SEEKING query + +2009-07-20 08:07:13 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + cairorender: Add support for ARGB/BGRA input + Note that videotestsrc outputs 100% transparent video + which will result in white output from cairorender. + +2009-07-17 13:22:57 +0100 Elaine Xiong + + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + v4l2: Fix v4l2src on OpenSolaris + The v4l2 driver for USB webcams on OpenSolaris does not support select() + calls. Detect when select() fails, and skip polling the device afterward, + which restores the pre 0.10.14 behaviour on OpenSolaris. + Signed-off-by: Jan Schmidt + +2009-07-17 11:22:06 +0100 Jan Schmidt + + * tests/check/elements/.gitignore: + * tests/examples/v4l2/.gitignore: + gitignore: Ignore some new binaries + +2009-07-17 13:49:21 +0200 Sebastian Dröge + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-cairo.xml: + * ext/cairo/gstcairorender.c: + cairorender: Add to the documentation + +2009-07-17 13:42:49 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + cairorender: Return not-negotiated if we have no caps + +2009-07-17 13:41:19 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + * ext/cairo/gstcairorender.h: + cairorender: Fix caps and colorspace handling + +2009-07-17 13:30:02 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + cairorender: Use correct mimetypes for PDF and SVG + +2009-07-17 13:24:28 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + cairorender: Remove pull mode, it only adds complexity but not advantages + +2009-07-16 21:55:31 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + cairorender: Fix caps negotiation and cairo surface creation + +2009-07-16 21:42:21 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + cairorender: Correctly set srccaps + +2009-07-16 21:31:43 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + * ext/cairo/gstcairorender.h: + cairorender: Move instance/class struct definitions to the header + +2009-07-16 21:30:00 +0200 Sebastian Dröge + + * ext/cairo/gstcairorender.c: + * ext/cairo/gstcairorender.h: + cairorender: Add Lutz' copyright to the file header + +2009-07-16 21:27:45 +0200 Lutz Mueller + + * ext/cairo/Makefile.am: + * ext/cairo/gstcairo.c: + * ext/cairo/gstcairorender.c: + * ext/cairo/gstcairorender.h: + cairo: Add cairo-based PDF/PS/SVG encoder element + Fixes bug #331420. + +2009-07-16 20:44:40 +0200 Sebastian Dröge + + * ext/flac/gstflacenc.c: + * ext/flac/gstflacenc.h: + flacenc: Optionally write a PADDING block + The size of the PADDING block is specified by a new + "padding" property. + Fixes bug #588483. + +2009-07-16 19:35:44 +0200 Sebastian Dröge + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Only assume seekability if the server provides Content-Length + Previously seekability way always assumed until the first seek actually + failed. Now we assume that all servers are not seekable unless they provide + a Content-Length header. If a seek fails after that we continue to + assume no seekability. Fixes bug #585576. + +2009-07-16 15:14:43 +0200 Arnout Vandecappelle + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: don't try to authenticate if no username/password is set. + +2009-07-16 17:10:21 +0200 Sebastian Dröge + + * gst/effectv/gstwarp.c: + effectv: Chain up finalize to the parent class in warptv + Fixes a memory leak. + +2009-07-16 12:55:49 +0200 Sebastian Dröge + + * tests/check/Makefile.am: + * tests/check/pipelines/effectv.c: + effectv: Add unit test for all effectv elements + +2009-07-16 12:17:32 +0200 Sebastian Dröge + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + effectv: Add new effectv elements to the docs + +2009-07-15 14:37:19 +0200 Sebastian Dröge + + * gst/effectv/Makefile.am: + * gst/effectv/gsteffectv.c: + * gst/effectv/gstripple.c: + * gst/effectv/gstripple.h: + effectv: Add rippletv element + This produces a water ripple effect on the video input, + based on motion or a rain drop algorithm. + Kindly relicensed to LGPL2+ by Kentaro Fukuchi . + Fixes bug #588695. + +2009-07-12 15:42:35 +0200 Sebastian Dröge + + * gst/effectv/Makefile.am: + * gst/effectv/gsteffectv.c: + * gst/effectv/gststreak.c: + * gst/effectv/gststreak.h: + effectv: Add streaktv effect filter element + This combines the StreakTV and BaltanTV filters from the + effectv project. + Kindly relicensed to LGPL2+ by Kentaro Fukuchi . + Fixes bug #588368. + +2009-07-12 12:31:15 +0200 Sebastian Dröge + + * gst/effectv/gstaging.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstop.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstradioac.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstvertigo.c: + effectv: Fix processing on big endian architectures + +2009-07-12 11:52:04 +0200 Sebastian Dröge + + * gst/effectv/Makefile.am: + * gst/effectv/gsteffectv.c: + * gst/effectv/gstradioac.c: + * gst/effectv/gstradioac.h: + effectv: Add radioactv effect filter + This filter adds a radiation-like motion blur effect + to the video stream. + Kindly relicensed to LGPL2+ by Kentaro Fukuchi . + Fixes bug #588359. + +2009-07-12 11:26:57 +0200 Sebastian Dröge + + * gst/effectv/gstop.c: + * gst/effectv/gstop.h: + effectv: Make the optv threshold property an uint + +2009-07-12 10:39:02 +0200 Sebastian Dröge + + * gst/effectv/Makefile.am: + * gst/effectv/gsteffectv.c: + * gst/effectv/gstop.c: + * gst/effectv/gstop.h: + effect: Add optv effect filter from the effectv project + This filter binarizes input frames and combines them with various + optical pattern. + Kindly relicensed to LGPL2+ by Kentaro Fukuchi . + Fixes bug #588349. + +2009-07-03 05:11:26 -0400 Olivier Crête + + * ext/pulse/pulsesink.c: + pulsesink: Emit stream-status leave message + Fixes #587695 + +2009-07-03 05:06:45 -0400 Olivier Crête + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: Emit stream-status enter message + Emit stream-status messages for the pulse thread. + Don't use our own GCond for signaling but simply use the pulse mainloop + mechanisms for synchronisation. + See #587695 + +2009-07-14 18:15:59 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: debug the latency update values + +2009-07-14 16:12:55 +0200 Wim Taymans + + * configure.ac: + * ext/pulse/pulsesink.c: + * ext/pulse/pulseutil.c: + pulsesink: add 24bit sample formats + Add check for pulseaudio 0.9.15 and enable 24bits samples in that case. + +2009-07-13 12:23:37 -0400 Olivier Crête + + * common: + Automatic update of common submodule + From 5845b63 to fedaaee + +2009-07-13 17:53:25 +0200 Marc Leeman + + * gst/rtp/gstrtpmpvpay.c: + mpvpay: Rework the timestamping + Rework the timestamping in the mpv payloader so that the timestamps are more + accurate. + Fixes #587680 + +2009-07-03 08:47:12 +0200 Filippo Argiolas + + * configure.ac: + * tests/examples/Makefile.am: + * tests/examples/v4l2/Makefile.am: + * tests/examples/v4l2/probe.c: + v4l2src: add a simple test case for device probing + +2009-07-03 08:38:43 +0200 Filippo Argiolas + + * configure.ac: + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2object.c: + v4l2src: optional support for device probing with gudev + Enumerate v4l2 devices using gudev if available. + Fixes bug #583640. + +2009-07-10 19:54:25 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Random cleanup + +2009-07-10 19:54:13 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Send queries to the master pad by default instead of all pads + +2009-07-10 19:34:41 +0200 Sebastian Dröge + + * gst/videomixer/Makefile.am: + * gst/videomixer/blend_rgb.c: + * gst/videomixer/videomixer.c: + videomixer: Add RGB, BGR, xRGB, RGBx, xBGR, BGRx support + +2009-07-10 17:43:07 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Clean up debugging a bit + +2009-07-10 17:25:48 +0200 Sebastian Dröge + + * gst/videomixer/videomixer.c: + videomixer: Remove some redundant checks and error out immediately if not negotiated + Also stop leaking the output buffer in some error cases. + +2009-07-10 17:23:03 +0200 Sebastian Dröge + + * gst/videomixer/blend_ayuv.c: + * gst/videomixer/blend_bgra.c: + * gst/videomixer/blend_i420.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + videomixer: Remove the calculate_frame_size() function and use libgstvideo instead + +2009-06-30 15:13:44 +0200 Edward Hervey + + * gst/videomixer/videomixer.c: + videomixer: Remove unused link/unlink pad methods + +2009-06-30 12:43:04 +0200 Edward Hervey + + * gst/videomixer/blend_i420.c: + videomixer: I420 mode: Add fast path for 0.0 and 1.0 alpha + If the source alpha is 0.0, we take nothing. + If the source alpha is 1.0, we overwrite everything. + +2009-06-30 12:40:02 +0200 Edward Hervey + + * gst/videomixer/blend_i420.c: + videomixer: I420 blending : Fix main algorithm. + When blending a source layer with an alpha of 'a' on top of another + destination layer we take the sum of: + * 'a' percent of the source layer + * (100 - 'a') percent of the destination layer (the remainder) + +2009-06-30 12:39:19 +0200 Edward Hervey + + * gst/videomixer/blend_i420.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + * gst/videomixer/videomixerpad.h: + videomixer: Make debugging category global to all the code. + +2009-06-29 19:23:41 +0200 Edward Hervey + + * gst/videomixer/videomixer.c: + videomixer: improve readability of debugging statements. + +2009-07-08 13:38:53 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: do not leak timeout message + +2009-07-09 07:14:23 +0200 Sebastian Dröge + + * gst/avi/gstavidemux.c: + avi: Don't forward NEWSEGMENT events from upstream + New ones are generated later and simply forwarding them can + result in NEWSEGMENT events of different format going downstream. + Fixes bug #587983. + +2009-07-08 18:19:45 +0200 Sebastian Dröge + + * gst/videomixer/blend_ayuv.c: + * gst/videomixer/blend_i420.c: + videomixer: Make checker pattern lookup table constant + +2009-07-08 18:17:48 +0200 Sebastian Dröge + + * gst/videomixer/Makefile.am: + * gst/videomixer/blend_bgra.c: + * gst/videomixer/videomixer.c: + videomixer: Add support for ARGB + And clean up the caps parsing. + +2009-07-08 15:17:41 +0200 Benjamin Gaignard + + * gst/udp/gstudpnetutils.c: + udp: Initialize pointer to NULL + Otherwise we're calling free() with some random + memory address in error cases. + Fixes bug #587982. + +2009-07-07 16:35:24 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: sprinkle some more const + +2009-07-07 15:57:55 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: perform some more (careful) data buffering + Once buffering has started (with an mdat atom), continue buffering + until moov atom is reached, which handles cases with multiple + mdat atoms. Also keep adapter/offset better in sync with upstream + and fix some debug statements. Fixes #587426. + +2009-07-06 10:40:31 +0200 Philip Jägenstedt + + * gst/avi/gstavidemux.c: + avidemux: Replace deprecated GST_DISABLE_DEBUG with correct macro. Fixes #587826 + +2009-07-01 13:07:48 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: error out instead of dividing by 0 + Error out if timescale is 0. + +2009-07-01 09:32:42 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + Revert "qtdemux: Make sure we don't blacklist streams by wrongly comparing their" + This reverts commit 5503a59a5779b67451d8a271000181790ee76bc7. + Reverting this since it causes regressions with a lot of sample files + I have, all of which worked fine with the last -good release (#586891). + +2009-06-30 15:54:47 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: comment out unused structure + +2009-06-30 13:12:09 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: more size checks, and use g_try_new0() instead of g_new0() + Whenever we alloc something based on a user-supplied size, we should + really use g_try_new(), otherwise we can easily be made to abort by + passing a ridiculously large number to us for allocing. Fixes + problems with some fuzzed files. + +2009-06-29 18:58:33 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: guard against bogus atom sizes and short reads + Check the possibly 64-bit atom size more carefully before casting it + to an int and passing it to gst_pad_pull_range(), otherwise we might + end up pulling 0 bytes, getting an empty buffer as requested and + dereferencing not available data whilst thinking we actually asked + for and got 0x1000000000000 bytes. Similar fix for push mode operation + where neededbytes ends up being 0 bytes, which makes us assert. Fixes + crash with broken or fuzzed file (NB #122378). + +2009-06-29 16:52:41 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: use 0x prefix when logging numbers in hex + +2009-07-01 08:40:40 +0200 Edward Hervey + + * ext/flac/gstflacdec.c: + flacdec: Don't send empty string tags + +2009-06-30 21:35:37 +0400 LRN + + * gst/udp/gstmultiudpsink.c: + Don't use sendmsg()-dependent code on Windows + Fixes #585842 + +2009-06-30 15:59:20 +0200 Wim Taymans + + * gst/law/alaw-decode.c: + * gst/law/alaw-encode.c: + * gst/law/alaw.c: + * gst/law/mulaw-decode.c: + * gst/law/mulaw-encode.c: + * gst/law/mulaw.c: + law: fix caps and negotiation + Fix the caps to include the depth (instead of width twice) in the caps of + audio/x-raw-int. + Fix negotiation to not only copy the rate/channels of the first structure. + +2009-06-30 14:48:09 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: include "1.0=100%" in volume and change upper limit + Upper volume limmit was 1000. That appear unneceasrily high. It would also cause + sever distortion if accidentialy used. Now its 10 (~ +15db) which is also in + sync with volume and playbin2. + +2009-06-29 15:39:43 +0200 Wim Taymans + + * ext/pulse/pulsesrc.c: + pulse: some more trivial cleanups + +2009-06-29 15:38:49 +0200 Wim Taymans + + * ext/pulse/pulsemixer.c: + pulse: trivial cleanups + +2009-06-29 15:20:31 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: clear ringbuffer when asked to + Since we map the ringbuffer to the pulseaudio internal ringbuffer, flush the + pulseaudio buffer when we are asked to clear the ringbuffer. + This avoids some leftover audio after a seek. + +2009-06-26 15:00:14 +0100 Jan Schmidt + + * autogen.sh: + autogen.sh: Actually do the 'echo -n' -> printf change. + +2009-06-26 14:40:14 +0100 Jan Schmidt + + * autogen.sh: + autogen.sh: Use printf instead of 'echo -n'. Check for automake-1.1[01] + Check for more automake command variants. Use printf instead of 'echo -n' + for portability + +2009-06-26 13:42:09 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From f810030 to 5845b63 + +2009-06-26 13:19:04 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: don't process track_num/track_count tags with a 0 value + Number/count values of 0 mean they're not set. Don't put those in the + taglist. + +2009-06-25 18:51:12 +0100 Tim-Philipp Müller + + * sys/waveform/gstwaveformsink.c: + waveformsink: use 'guint8' instead of 'byte' to fix compilation with MSVC8 + We need a cast here for pointer arithmetic to work correctly, but some + MSVC versions don't seem to like 'byte', so use guint8 here. Hopefully + fixes #585361. + +2009-06-25 19:39:37 +0300 Stefan Kost + + * sys/v4l2/v4l2_calls.c: + v4l2src: set structs to zero before using them in ioctls + This fixes valgrind warnings. + +2009-06-25 13:23:40 +0200 Julien Moutte + + * gst/qtdemux/qtdemux.c: + qtdemux: Make sure we don't blacklist streams by wrongly comparing their duration with entire clip duration. + +2009-06-25 13:18:14 +0200 Krzysztof Błaszkowski + + * gst/rtsp/gstrtpdec.c: + rtpdec: fix some buffer leaks + +2009-06-25 08:11:09 +0200 Edward Hervey + + * gst/flv/gstflvparse.c: + flvparse: Add missing break in switch/case. + +2009-06-25 08:10:38 +0200 Edward Hervey + + * gst/flv/gstflvdemux.c: + flvdemux: Remove unused variable, hint branch likeliness, add comments. + +2009-06-25 08:09:57 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Removed unused variable + +2009-06-25 07:41:07 +0200 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Remove dead assignments and unused variables. + Also add branch likeliness macros. + +2009-06-25 07:40:26 +0200 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Fix uninitialized variables. Fixes build on macosx + +2009-06-24 17:43:25 +0300 Stefan Kost + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: free memory in finalize + finalize is called only once. no need to clear pointers there. dispose is for + unreffing. + +2009-06-24 15:14:14 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From 6ab11d1 to f810030 + +2009-06-08 14:46:48 +0100 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: + avidemux: short-circuit gst_avi_demux_src_convert() when parsing the index + Don't call gst_avi_demux_src_convert() for each single index entry. Not + only do we already have the pointer to the stream context, we also know + the formats we want to convert from and to already, so we may just as + well use optimised conversion routines that bypass some of the checks + and lookups made in gst_avi_demux_src_convert(). + +2009-06-17 16:39:36 +0200 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Another round of G_*LIKELY micro-optimisations. + +2009-06-17 16:20:25 +0200 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Take last sample duration for dummy segment calculation. + This fixes the cases where files without EDL wouldn't output their + last buffer. + +2009-06-24 12:36:31 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Sprinkle branch likeliness macros over the code. + +2009-06-23 16:54:32 +0200 Edward Hervey + + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + raw1394: sprinkle branch likeliness macros accross the code. + +2009-06-14 10:36:17 +0200 Edward Hervey + + * gst/qtdemux/qtdemux.c: + qtdemux: Add GST_MEMDUMP statements for unknown atoms. + This is to help developers track down and implement unhandled atoms faster. + +2009-06-23 17:51:32 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Remove the interlaced field from the output caps if deinterlacing is enabled + +2009-06-23 17:48:47 +0200 Sebastian Dröge + + * gst/deinterlace/tvtime/greedyh.c: + deinterlace: Copy the correct line from correct place in the history + +2009-06-23 16:35:36 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: use same protocols after redirect + After a redirect we want to use the same protocols that we were using for the + current url. + +2009-06-23 15:35:37 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: don't leak cover art + +2009-06-23 14:10:10 +0100 Tim-Philipp Müller + + * gst/udp/gstudpnetutils.c: + udp: fix compiler warning about EAI_ADDRFAMILY getting redefined in some cases + Include the header from where we include all the system headers with the + socket stuff before we try to define EAI_ADDRFAMILY ourselves, otherwise + we define it ourselves and then get a compiler warning if a system header + defines it as well without guarding against it being defined already. + +2009-06-23 14:39:56 +0200 Wim Taymans + + * gst/matroska/matroska-ids.h: + matroska: and the new headers too + +2009-06-23 14:32:43 +0200 Wim Taymans + + * gst/matroska/matroska-demux.c: + matroske: fix compiler error + change gpointer to guint8 * for codec_state and codec_priv as some + functions operate on those types and it avoids breaking strict-aliasing + rules. + +2009-06-23 12:42:33 +0200 Wim Taymans + + * gst/matroska/matroska-demux.c: + matroskademux: avoid leaking buffers + Don't leak buffers when resyncing to a keyframe. + Avoid leaking buffers when exiting the loop on error conditions. + Add some more debug info. + Fixes #585911 + +2009-06-22 15:56:58 +0300 Stefan Kost + + * sys/v4l2/gstv4l2src.c: + v4l2: open/close the device in READY + This allows to query the device in READY. Before one need to switch it to PAUSED + and that also starts streaming. + +2009-06-20 15:41:44 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_dump.c: + qtdemux: use GST_MEMDUMP + +2009-06-19 00:16:41 +0100 Tim-Philipp Müller + + * gst/apetag/Makefile.am: + * gst/apetag/gstapedemux.c: + apedemux: add container-format tag + Use pbutils here because the string is translated. + +2009-06-19 00:15:51 +0100 Tim-Philipp Müller + + * gst/id3demux/Makefile.am: + * gst/id3demux/gstid3demux.c: + id3demux: add container-format tag + Using pbutils here because the string is translated. + +2009-06-18 23:51:52 +0100 Tim-Philipp Müller + + * ext/dv/gstdvdemux.c: + dvdemux: post container-format tag + Also merge the two almost identical _add_*_pad() functions into one. + +2009-06-18 23:43:49 +0100 Tim-Philipp Müller + + * ext/dv/gstdvdemux.c: + dvdemux: don't screw up first audio buffer + Query the audio format, esp. dvdemux->num_channels, before we use that + variable to allocate the initial buffer. That way we don't accidentally + push a zero-sized buffer as first audio buffer. + +2009-06-18 23:38:30 +0100 Tim-Philipp Müller + + * gst/multipart/multipartdemux.c: + multipartdemux: post container-format tag + +2009-06-18 23:37:11 +0100 Tim-Philipp Müller + + * gst/matroska/matroska-demux.c: + matroska-demux: post container-format tags + +2009-06-18 23:36:28 +0100 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: + avidemux: post container-format tag + +2009-06-18 23:35:29 +0100 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: + qtdemux: post container-format tags + +2009-06-21 17:13:43 +0200 Sebastian Dröge + + * gst/audiofx/audioamplify.c: + audioamplify: Fix integer overflows on 32 bit architectures + +2009-06-21 09:50:54 +0200 Kipp Cannon + + * gst/audiofx/audioamplify.c: + audioamplify: Don't declare a loop index static + The previous patch to add support for additional sample formats possibly + introduced a reentrancy bug: a variable used for a loop index was declared + static. This patch fixes that, and also adds a "/* *INDENT-ON* */" annotation + following the macro block. (I don't know what the annotation is for, but the + adder, where I copied this from, has it). + +2009-06-19 22:37:27 +0200 Sebastian Dröge + + * gst/audiofx/audioamplify.c: + audioamplify: Fix off-by-one in wrap-positive mode + +2009-06-19 22:20:45 +0200 Kipp Cannon + + * gst/audiofx/audioamplify.c: + * gst/audiofx/audioamplify.h: + audioamplify: Add noclip method and support for more formats + Fixes bug #585828 and #585831. + +2009-06-19 21:46:41 +0200 Koop Mast + + * gst/udp/gstudpnetutils.h: + udp: Fix build on FreeBSD + Fixes bug #586397. + +2009-06-19 18:12:27 +0200 Ognyan Tonchev + + * tests/check/elements/rtp-payloading.c: + tests: add unit tests for buffer-list payloaders + See #585559 + +2009-06-19 18:00:35 +0200 Ognyan Tonchev + + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmp4vpay.h: + rtpmp4vpay: add support for buffer-list + See #585559 + +2009-06-19 17:57:12 +0200 Ognyan Tonchev + + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpjpegpay.h: + rtpjpegpay: add support for buffer-lists + See #585559 + +2009-06-19 17:53:32 +0200 Ognyan Tonchev + + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + rtph264pay: add support for buffer-lists + See #585559 + +2009-06-18 11:54:22 +0200 Wim Taymans + + * gst/udp/gstudpnetutils.c: + udputils: don't free invalid memory + As spotted by benjiG in IRC. + don't free invalid memory when getaddrinfo failed. + +2009-06-17 17:48:31 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulseink: don't leak device_description + don't leak the device_description. + some cleanups. + +2009-06-19 14:44:40 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.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/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + po: update .po files for sunaudiomixer string changes + +2009-06-18 16:58:26 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: streaming; adjust sizes to cater for padding in chunks + +2009-06-17 11:54:53 +0200 Mark Nauwelaerts + + * gst/avi/gstavidemux.c: + avidemux: streaming mode; handle data chunks grouped in rec lists. + Fixes #567983. + +2009-06-10 12:36:50 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: map some tags to COMPOSER rather than ARTIST + +2009-06-10 12:34:43 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix some 3GP tag extraction (keywords, genre, location) + +2009-06-09 15:36:50 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: extract pixel-aspect-ratio information + +2009-06-17 07:14:09 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Fix leaking of the Matroska TITLE element + +2009-06-16 20:38:42 +0200 Sebastian Dröge + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst/effectv/gstaging.c: + * gst/effectv/gstaging.h: + * gst/effectv/gstdice.c: + * gst/effectv/gstdice.h: + * gst/effectv/gstedge.c: + * gst/effectv/gstedge.h: + * gst/effectv/gstquark.c: + * gst/effectv/gstquark.h: + * gst/effectv/gstrev.c: + * gst/effectv/gstrev.h: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstshagadelic.h: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstvertigo.h: + * gst/effectv/gstwarp.c: + * gst/effectv/gstwarp.h: + effectv: Add basic documentation for the effectv elements + +2009-06-16 20:16:13 +0200 Sebastian Dröge + + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gsteffectv.h: + * gst/effectv/gstquark.c: + * gst/effectv/gstshagadelic.c: + effectv: Define the fast PRNG function at a central place + +2009-06-16 20:13:35 +0200 Sebastian Dröge + + * gst/effectv/Makefile.am: + * gst/effectv/gstaging.c: + * gst/effectv/gstaging.h: + * gst/effectv/gstdice.c: + * gst/effectv/gstdice.h: + * gst/effectv/gstedge.c: + * gst/effectv/gstedge.h: + * gst/effectv/gsteffectv.c: + * gst/effectv/gsteffectv.h: + * gst/effectv/gstquark.c: + * gst/effectv/gstquark.h: + * gst/effectv/gstrev.c: + * gst/effectv/gstrev.h: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstshagadelic.h: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstvertigo.h: + * gst/effectv/gstwarp.c: + * gst/effectv/gstwarp.h: + effectv: Move type definitions into separate headers + This is needed for the docs later. + +2009-06-16 19:41:02 +0200 Sebastian Dröge + + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + effectv: Remove get_unit_size implementations + The default on from GstVideoFilter handles this already. + +2009-06-16 14:54:34 +0100 Tim-Philipp Müller + + * configure.ac: + configure: bump core/base requirements to git + Need git core for basesink bufferlist additions; -base requirement + bumped gratuitously. + +2009-06-16 15:25:54 +0200 Wim Taymans + + * tests/check/elements/udpsink.c: + tests: add some debug, send newsegment + +2009-06-16 15:06:50 +0200 Wim Taymans + + * gst/udp/gstudpsrc.c: + udpsrc: add debug line for the socket + +2009-06-16 15:06:25 +0200 Wim Taymans + + * tests/check/pipelines/flacdec.c: + tests: turn g_print into debug + +2009-06-16 15:04:15 +0200 Ognyan Tonchev + + * gst/udp/gstmultiudpsink.c: + * tests/check/Makefile.am: + * tests/check/elements/udpsink.c: + multiudpsink: add support for buffer lists + Add support for BufferList and add a unit test. + Fixes #585842 + +2009-06-16 00:02:42 +0100 Tim-Philipp Müller + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: reset session state when stopping + Increases the chances that the element is actually reusable. + +2009-06-15 23:49:48 +0100 Tim-Philipp Müller + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: log response and request headers and fix some broken indenting + +2009-06-15 22:40:35 +0200 Wim Taymans + + * gst/rtp/gstrtpmp4gdepay.c: + mp4gdepay: guess constantDuration better + Do a better job at guessing the constantDuration parameter when it is not + present in the caps. + Fixes #585205 + +2009-06-15 21:09:47 +0200 Sebastian Dröge + + * gst/effectv/gstwarp.c: + warptv: Clean up warptv element and fix some minor bugs and leaks + +2009-06-15 20:53:23 +0200 Sebastian Dröge + + * gst/effectv/gstvertigo.c: + vertigotv: Clean up vertigotv element and fix some minor bugs and leaks + +2009-06-15 20:38:01 +0200 Sebastian Dröge + + * gst/effectv/gstdice.c: + dicetv: Use guint8 instead of char (which can be signed or unsigned) + +2009-06-15 20:36:39 +0200 Sebastian Dröge + + * gst/effectv/gstshagadelic.c: + shagadelictv: Use guint8/gint8 instead of char (which can be signed or unsigned) + +2009-06-15 20:31:30 +0200 Sebastian Dröge + + * gst/effectv/gstshagadelic.c: + shagadelictv: Clean up element and free all memory in finalize + +2009-06-15 20:21:58 +0200 Sebastian Dröge + + * gst/effectv/gstrev.c: + revtv: Clean up revtv element + +2009-06-15 20:07:42 +0200 Sebastian Dröge + + * gst/effectv/gstquark.c: + quarktv: Simplify some code + +2009-06-15 20:07:10 +0200 Sebastian Dröge + + * gst/effectv/gstquark.c: + quarktv: Use the input data if a NULL buffer is chosen instead of the value 0 + +2009-06-15 20:00:43 +0200 Sebastian Dröge + + * gst/effectv/gstquark.c: + quarktv: Fix setting the planes property of quarktv + Setting it to a value<16 would cause crashes before because + current_plane was set to the old number of planes-1. Also + fix calculations for non-2^n planes values. + +2009-06-15 17:50:41 +0200 Sebastian Dröge + + * gst/effectv/gstquark.c: + quarktv: Clean up the quarktv element + +2009-06-15 17:39:20 +0200 Sebastian Dröge + + * gst/effectv/gsteffectv.c: + effectv: Make elements list constant + +2009-06-15 17:37:53 +0200 Sebastian Dröge + + * gst/effectv/gstedge.c: + edgetv: Clean up edgetv element and fix memory leak + +2009-06-15 17:21:58 +0200 Sebastian Dröge + + * gst/effectv/gstdice.c: + dicetv: Clean up dicetv element and fix some smaller issues + This fixes a memory leak (the dice map) and a crash when + setting the square-bits property before caps are set. + +2009-06-15 17:20:21 +0200 Sebastian Dröge + + * gst/effectv/Makefile.am: + * gst/effectv/gstaging.c: + agingtv: Actually use GstController for syncing the properties to timestamps + +2009-06-15 17:03:38 +0200 Sebastian Dröge + + * gst/effectv/gstaging.c: + agingtv: Export some more agingtv properties via GObject properties + +2009-06-15 15:06:56 +0200 Sebastian Dröge + + * gst/effectv/gstaging.c: + agingtv: General cleanup and updating of copyright + Also make the scratch-lines property exported via a GObject + property and initialize/reset the internal state correctly. + +2009-06-15 15:05:58 +0200 Sebastian Dröge + + * gst/effectv/gstaging.c: + agingtv: Store and update state inside the instance struct + This makes the coloraging effect and pits effect visible. + +2009-06-15 15:51:32 +0100 Tim-Philipp Müller + + * ext/pulse/pulsesink.c: + pulsesink: ref custom ring buffer class and type in class_init + Hack around thread-safety issues in GObject and our racy _get_type() + functions (we could easily fix the _get_type() functions, but we still + need to hack around the GObject class races until we require a newer + GLib version, I think). + +2009-06-14 19:19:19 +0100 Tim-Philipp Müller + + * ext/dv/demo-play.c: + * tests/old/examples/Makefile.am: + * tests/old/examples/level/Makefile.am: + * tests/old/examples/level/README: + * tests/old/examples/level/demo.c: + * tests/old/examples/level/plot.c: + * tests/old/examples/switch/.gitignore: + * tests/old/examples/switch/Makefile.am: + * tests/old/examples/switch/switcher.c: + Remove a few old example apps from the 0.8 days + Some have been replaced by newer ones, others are demoing elements that + don't exist any longer (not in -good anyway), and others have not been + touched in many years and it seem pointless to keep them around. + Removing these files makes sure we don't have any code in our repository + that uses Gtk+ symbols which are to be removed for GNOME3, and as such + will make some script that greps for this kind of stuff give us a clean + bill of code health. Fixes #585757. + +2009-06-13 21:02:45 -0400 Olivier Crête + + * common: + * gst/rtp/gstrtpsirenpay.c: + rtpsirenpay: Remove deprecated symbol + Patch by: Luis Menina + +2009-06-13 10:43:55 +0200 Marvin Schmidt + + * tests/check/Makefile.am: + tests: Don't run the flacdec test if the plugin isn't built. Fixes #585630 + +2009-06-12 16:06:28 +0200 Patrick Radizi + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: Add RTP blocksize functionality + Add property to make the client suggest a blocksize to the server. + Fixes #585549 + +2009-06-11 22:30:06 +0200 Wim Taymans + + * gst/rtp/README: + rtp: update README, fix some typos, mention gstrtpbin + +2009-06-11 19:10:53 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: handle border cases in resampler + +2009-06-11 13:32:22 +0100 Jan Schmidt + + * common: + * docs/Makefile.am: + * docs/plugins/Makefile.am: + * docs/upload.mak: + docs: Bump common. Use upload-doc.mak instead of upload.mak + Remove the local copy of upload.mak in favour of using the shared + upload-doc.make in common/ + +2009-06-11 11:39:25 +0100 Jan Schmidt + + * gst/goom/goom_config_param.h: + * gst/videomixer/videomixer.c: + docs: Quieten a couple more docs warnings + +2009-06-11 11:27:26 +0100 Jan Schmidt + + * gst/matroska/lzo.c: + docs: Remove gtk-doc comment marker + These comment blocks aren't gtk-doc comments and cause annoying noise in + the docs build. + +2009-06-11 10:05:32 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Implement upstream negotation + +2009-06-10 21:47:40 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Improve debugging and clean up some code + +2009-06-10 14:55:18 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Clip buffers to the current segment if possible + +2009-06-10 14:45:06 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Clean up includes and clean up order of instance struct fields + +2009-06-10 16:09:56 -0400 Olivier Crête + + * gst/rtp/gstrtph263pay.h: + rtph263pay: Default to doing A, B and C modes, not only A + +2009-06-10 09:56:11 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Fix QoS calculations + The diff is a signed integer, not an unsigned one of course. + In modes other than GST_DEINTERLACE_ALL every frame has twice the + duration of the field duration. + +2009-06-09 14:13:31 -0400 Olivier Crête + + * gst/rtp/gstrtpsirenpay.c: + rtpsirenpay: Put the bitrate in the RTP caps + The MS code seems to require the bitrate to interoperate and + draft-ietf-avt-rtp-g7221-00 also has it. + +2009-06-09 19:55:36 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: Implement basic QoS + This change is based on Tim's QoS implementation + for jpegdec. + +2009-06-09 19:29:51 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: Directly proxy events/queries to the peer pads + This removes some overhead introduced by the default handlers + that need to iterate over the other pads. + +2009-06-09 10:38:52 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: debug_memdump() unknown tags. Refactor junk parsing code. + This makes life slightly easier when debugging avi files. + +2009-06-08 08:21:43 +0200 Edward Hervey + + * gst/rtp/Makefile.am: + rtp: Don't forget to dist the headers for the CELT (de)payloaders. + +2009-06-07 20:54:06 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + Revert "Revert "qtdemux: fill timestamp table completely"" + This reverts commit 9f022c8a8503c2ce0fa617fdb50e41706dd412f5. + Sorry, I was thinking about the wrong module. + +2009-06-07 20:49:50 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + Revert "qtdemux: fill timestamp table completely" + This reverts commit 790b050fc5302cae89cddcd23b258093967d05a9. + I forgot we were frozen. + +2009-06-07 20:46:45 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: fill timestamp table completely + When there are less timestamps that there are samples, fill up the sample table + with the last know timestamp. This situation can happen when the last sample + does not decode and doesn't need a timestamp. We however calculate the total + track length using the last sample timestamp so we need to have something + sensible in there. + Fixes #585056 + +2009-06-07 13:37:04 +0200 Wim Taymans + + * gst/wavparse/gstwavparse.c: + wavparse: handle LIST INFO of 0 size + Handle LIST INFO chunks of 0 size instead of causing errors. + Fixes #584981 + +2009-06-07 13:24:45 +0200 Wim Taymans + + * gst/wavparse/gstwavparse.c: + Revert "wavparse: Remove dead assignments, move variable to where it's needed." + Reverts commit 44256a78f8dd79a91f3bb2ab7c3aa623c097bb8a and use the result in + error reporting so that we can see what's going on. + +2009-06-05 18:55:02 +0200 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpceltdepay.c: + * gst/rtp/gstrtpceltdepay.h: + celtdepay: add CELT depayloader + +2009-06-05 15:30:51 +0200 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpceltpay.c: + * gst/rtp/gstrtpceltpay.h: + rtpceltpay: add CELT RTP payloader + +2009-06-05 16:54:48 +0100 Jan Schmidt + + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiomixeroptions.c: + * sys/sunaudio/gstsunaudiomixertrack.c: + sunaudio: Fix switch setting on some devices. Add debug. Fix a FIXME. + Fix the setting of toggle switches on some broken audio drivers which + report that no audio ports are settable by ignoring the mod_port field + there. + Add some debug statements. + Fix a FIXME now that Good relies on a new enough gst-plugins-base. + +2009-06-04 12:27:19 +0100 Jan Schmidt + + * sys/sunaudio/Makefile.am: + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiomixerctrl.h: + * sys/sunaudio/gstsunaudiomixeroptions.c: + * sys/sunaudio/gstsunaudiomixeroptions.h: + * sys/sunaudio/gstsunaudiomixertrack.c: + * sys/sunaudio/gstsunaudiomixertrack.h: + sunaudio: Support new flags for options and actions + Use new audio mixer flags added in Base 0.10.23 to expose flags and options + on the SunAudio devices. + Fixes: #583593 + Patch By: Brian Cameron + Patch By: Garrett D'Amore + +2009-05-15 11:50:38 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + deinterlace: First try to handle DVD still frames correctly + This helps a bit with bug #582740 but still doesn't make it work. + +2009-06-04 17:37:03 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: only notify if all checks passed + Replace goto done: with return, as those are checks when we don't want to flag a + pending notify. + +2009-06-04 15:19:05 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: set the right state on rtpbin + We need to set the state of gstrtpbin to the same state as our source elements. + This fixes fallback to TCP again. + +2009-06-03 18:23:53 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: check pointer before accessing + Move existing check a few lines up, so that we check before accessing fields. + +2009-06-03 18:21:12 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: rename gst_pulse_sink_get_time to gst_pulsesink_get_time + Rename internal method for consistency. + +2009-06-03 18:19:22 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + pulsesink: use values from pa_stream_get_buffer_attr() + We were putting the requested values back into ringbuffer spec, instead of + using the queried values. + +2009-06-02 19:32:21 +0200 Wim Taymans + + * gst/rtp/gstrtpvrawpay.c: + vrawpay: trim output buffers + Remove the leftover unused bytes in the output buffer. + Fixes #584613 + +2009-06-02 19:30:30 +0200 Wim Taymans + + * gst/rtp/gstrtpvrawdepay.c: + vrawdepay: fix parsing of sampling field + commit a12d9a80f225be97b3674b1a0506ac66544dbf49 broke the parsing of the + sampling. + +2009-05-27 17:06:34 +0100 Jan Schmidt + + * ext/libpng/gstpngdec.c: + pngdec: Avoid possible overflow in calculations + A malformed (or simply huge) PNG file can lead to integer overflow in + calculating the size of the output buffer, leading to crashes or buffer + overflows later. Fixes SA35205 security advisory. + +2009-06-02 00:48:00 +0100 Tim-Philipp Müller + + * ext/flac/gstflacenc.c: + flacenc: some more logging - dump header packets + Also, the final fixing up of the headers is expected and not something + we should warn about. + +2009-06-02 00:37:15 +0100 Tim-Philipp Müller + + * ext/flac/gstflacenc.c: + flacenc: never ever pass values >36bits to _set_total_samples_estimate() + Let's be paranoid and make sure we never pass a number that takes up + more than 36 bits to _set_total_samples_estimate(), since libFLAC + expects all the other bits to be zero, and if this is not the case + neighbouring fields in the global stream info header may get messed + up inadvertently, so that flac -d refuses to decode the stream. + See #584455. + +2009-06-01 22:33:02 +0200 Thomas Vander Stichele + + * ext/flac/gstflacenc.c: + Address bad FLAC sample length encoding of #5844455 + Commit df707c666433a78d3878af6f055698d5756226c4 + introduced an obvious bug in the sample length calculation, + using the wrong macro for conversion. + +2009-06-01 11:58:21 -0700 Brian Cameron + + * gst/deinterlace/tvtime/mmx.h: + deinterlace: Fix spurious colons in asm code + Fixes #584174. + Signed-off-by: David Schleef + +2009-06-01 00:40:55 +0100 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: + avidemux: skip JUNK chunks in data section in streaming mode + Skip JUNK tags in streaming mode as well instead of EOSing + prematurely. Fixes #564100. + +2009-05-28 14:01:17 +0200 Sebastian Dröge + + * gst/videomixer/blend_bgra.c: + * gst/videomixer/blend_i420.c: + * gst/videomixer/videomixer.c: + videomixer: Don't use // comments + +2009-05-28 13:56:15 +0200 Sebastian Dröge + + * gst/videomixer/blend_bgra.c: + videomixer: Fix background blitting when a color mode is selected with BGRA + +2009-05-28 13:54:14 +0200 Sebastian Dröge + + * gst/videomixer/blend_ayuv.c: + * gst/videomixer/blend_bgra.c: + * gst/videomixer/blend_i420.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + videomixer: Some cleanup and fix the calculation of the frame size in bytes + +2009-05-28 13:35:52 +0200 Sebastian Dröge + + * gst/videomixer/blend_i420.c: + videomixer: Fix I420 blending to actually do something + For this we a) implement the checkers filling and b) + actually blend the src/dest by using the src alpha value + from the pad. + +2009-05-28 13:14:13 +0200 Sebastian Dröge + + * gst/videomixer/blend_bgra.c: + videomixer: Fix ARGB blending to actually work + +2009-05-28 13:04:51 +0200 Sebastian Dröge + + * gst/videomixer/Makefile.am: + * gst/videomixer/blend_bgra.c: + videomixer: Blend BGRA ourselves instead of using Cairo + +2009-05-28 12:55:16 +0200 Alex Ugarte + + * gst/videomixer/Makefile.am: + * gst/videomixer/blend_ayuv.c: + * gst/videomixer/blend_bgra.c: + * gst/videomixer/blend_i420.c: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + videomixer: Add support for blending BGRA and AYUV + Fixes bug #577017. + +2009-05-28 12:39:46 +0200 Ghislain 'Aus' Lacroix + + * gst/equalizer/gstiirequalizer.c: + equalizer: Use floating point arithmetic internally for the int16 mode + By using int32 arithmetic we will introduce distortions as the + IIR filter is very sensitive to rounding errors. Fixes bug #580214. + +2009-05-28 10:55:16 +0100 Christian Schaller + + * gst-plugins-good.spec.in: + Update spec file with latest plugins + +2009-05-26 17:19:08 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From 888e0a2 to c572721 + +2009-05-26 16:20:35 +0300 Stefan Kost + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + v4l2: cleanup and commenting + Remove newlines inserted by gst-indent once. Remove unused var from instance + struct. Add comments. Add another #define for default property value. + +2009-05-06 12:43:35 +0300 Stefan Kost + + * tests/check/Makefile.am: + makefile: idea about makeing more sources/sinks testable again + +2009-05-25 16:33:35 +0200 John Keeping + + * ext/libpng/gstpngdec.c: + pngdec: match g_malloc() with g_free() + Matching g_malloc() with a g_free() is important when a custom allocator is + installed. + Fixes #583803 + +2009-05-12 18:39:28 +0200 Wim Taymans + + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmp4vpay.h: + rtpmp4vpay: don't look for headers in some cases + In some streams (starting with 00000100) don't look for the headers but push + data as it is. + Fixes #582153 + +2009-05-13 11:50:22 +0200 Patrick Radizi + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix memory leak of messages + Free messages correctly. + Fixes #577318 + +2009-05-24 19:32:17 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: make fakesrc silent + Make the fakesrc that is responsible for sending dummy packets silent. + +2009-05-24 16:33:42 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't send teardown before setup + Don't send a TEARDOWN request when we did not manage to successfully setup a + stream. + +2009-05-14 14:46:14 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-ids.h: + matroskademux: Populate a GstIndex that is set on matroskademux + +2009-05-14 10:35:22 +0200 Sebastian Dröge + + * gst/flv/gstflvmux.c: + flvmux: Get the max duration from upstream if there's no duration tag + +2009-05-14 10:29:49 +0200 Sebastian Dröge + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + flvmux: Write an index table to the end of the file + +2009-05-22 01:12:35 +0100 Tim-Philipp Müller + + * autogen.sh: + * configure.ac: + autotools: move the -Wno-portability from autogen.sh to configure.ac + If we're lucky it'll get used on automatic rebuilds as well that way. + +2009-05-22 01:10:12 +0100 Tim-Philipp Müller + + * common: + * configure.ac: + * m4/gst-fionread.m4: + m4: fix 'suspicious cache id' warnings + and update common to pull in a similar fix. Also check in configure + whether the compiler supports do while macros (GLib wants this + defined and it is needed to avoid warnings with some c++ compilers + apparently). + +2009-05-22 01:39:33 +0300 Zeeshan Ali (Khattak) + + * configure.ac: + souphttpsrc: Bump-up libsoup-2.24 dep to >= 2.26 + The helper function soup_message_headers_get_content_type that we now use + was added in 2.26. + +2009-05-20 17:57:59 +0300 Zeeshan Ali (Khattak) + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Set caps for audio/L16 content-type + When "Content-Type" header is "audio/L16", we need to set the caps on the + outgoing buffers so that downstream elements can have means to detect the + stream type and handle it appropriately. Tested with HTTP stream provided + by pulse-audio's http module (git master). + +2009-05-20 15:06:25 +0300 Zeeshan Ali (Khattak) + + * ext/soup/gstsouphttpsrc.c: + * ext/soup/gstsouphttpsrc.h: + souphttpsrc: Rename icy_caps to src_caps + +2009-05-21 23:39:13 +0200 Philippe Normand + + * ext/jpeg/gstjpegdec.c: + jpegdec: bump max size to 65535x65535 + Remove artificial jpeg image limits. + Fixes #583048. + +2009-05-21 21:36:02 +0100 Jan Schmidt + + * win32/common/config.h: + win32: Update the win32 config.h + +2009-05-19 15:12:09 +0100 Jan Schmidt + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + matroskademux: Recognise PGS subpicture streams - the bluray format. + Recognise and apply appropriate caps to PGS (Presentation Graphic Stream) + subpicture streams. + +2009-05-15 10:42:19 +0100 Jan Schmidt + + * ext/pulse/pulsesink.c: + pulsesink: Convert an erroneous assertion + Occasionally, we get a change callback for an old stream, triggering + the assertion unnecessarily. Just ignore such callbacks. + +2009-05-20 16:14:40 -0400 Olivier Crête + + * ext/pulse/pulsesink.c: + pulse: Print a warning on under/overflows + +2009-05-20 18:45:45 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: parse in24 boxes to get endianness + in24 samples are normally big-endian but an enda box can change this to + little-endian. Recurse into the in24 box and find the enda box so that we get + the endianness right. + Fixes #582515 + +2009-05-20 14:14:31 +0200 Wim Taymans + + * gst/multipart/multipartdemux.c: + multipartdemux: add proper padtemplate + +2009-05-20 14:02:43 +0200 Wim Taymans + + * gst/multipart/multipartdemux.c: + multipartdemux: add more mime types + Add mime-type for Panasonic g726 and add more required caps properties for other + G726 mime-types. + Make mime-types case insensitive. + See #582169 + +2009-05-20 13:47:52 +0200 Wim Taymans + + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartdemux.h: + multipartdemux: add flow aggregation + +2009-05-20 13:29:02 +0200 Arnout Vandecappelle + + * gst/multipart/multipartdemux.c: + multipartdemux: allow content to be empty. + gst_adapter_take_buffer doesn't allow buffer to be empty. + Simply skip any part where the content is empty. Don't + create a pad for it either. + See #582169 + +2009-05-18 22:19:39 +0200 Wim Taymans + + * gst/rtp/gstrtpchannels.h: + rtp: fix channel positions for mono + +2009-05-21 21:02:11 +0100 Jan Schmidt + + * configure.ac: + Back to hacking -> 0.10.15.1 + +=== release 0.10.15 === + +2009-05-20 22:34:18 +0100 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-deinterlace.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.15 + +2009-05-20 22:03:21 +0100 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.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/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2009-05-16 02:59:14 +0100 Jan Schmidt + + * ChangeLog: + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.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/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + * win32/common/config.h: + 0.10.14.3 pre-release + +2009-05-16 02:37:06 +0100 Jan Schmidt + + * tests/check/pipelines/flacdec.c: + check: Don't change directory in the test + Changing directory invalidates the paths the registry has picked + up for our plugins, because the test environment specifies relative + paths. Fixing that is a separate problem, in the meantime, build a + path to the test files instead of changing directory. Fixes the + distcheck. + +2009-05-16 01:53:46 +0100 Jan Schmidt + + * win32/MANIFEST: + win32: Remove directdraw project files from the win32 manifest + +2009-05-16 01:21:34 +0100 Jan Schmidt + + * tests/check/elements/rganalysis.c: + check: Remove assertion that breaks check again git master + Remove the assertion that the sender of the tags message is the + element until we decide whether that's going to be true or not. + +2009-05-16 01:11:33 +0100 Jan Schmidt + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-directdraw.xml: + * sys/Makefile.am: + * sys/directdraw/Makefile.am: + * sys/directdraw/gstdirectdrawplugin.c: + * sys/directdraw/gstdirectdrawsink.c: + * sys/directdraw/gstdirectdrawsink.h: + * win32/vs6/libgstdirectdraw.dsp: + * win32/vs7/libgstdirectdraw.vcproj: + * win32/vs8/libgstdirectdraw.vcproj: + Moved 'directdraw' from -good to -bad + +2009-05-16 00:18:34 +0100 Jan Schmidt + + * tests/check/pipelines/.gitignore: + ignores: Ignore the flacdec check binary + +2009-05-16 00:17:57 +0100 Jan Schmidt + + * docs/plugins/inspect/plugin-avi.xml: + docs: Update inspection details for the avi plugin + +2009-05-16 00:00:07 +0100 Jan Schmidt + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-y4menc.xml: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/elements/y4menc.c: + Moved 'y4menc' from -bad to -good + +2009-05-13 17:55:46 +0200 Wim Taymans + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] y4menc: change my email + change my email to something more current + See #580783 + +2009-05-13 17:54:47 +0200 Wim Taymans + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] y4menc: don't strip timestamps + Fixes #582483 + +2008-11-04 12:42:30 +0000 Stefan Kost + + [MOVED FROM BAD] Don't install static libs for plugins. Fixes #550851 for -bad. + Original commit message from CVS: + * ext/alsaspdif/Makefile.am: + * ext/amrwb/Makefile.am: + * ext/apexsink/Makefile.am: + * ext/arts/Makefile.am: + * ext/artsd/Makefile.am: + * ext/audiofile/Makefile.am: + * ext/audioresample/Makefile.am: + * ext/bz2/Makefile.am: + * ext/cdaudio/Makefile.am: + * ext/celt/Makefile.am: + * ext/dc1394/Makefile.am: + * ext/dirac/Makefile.am: + * ext/directfb/Makefile.am: + * ext/divx/Makefile.am: + * ext/dts/Makefile.am: + * ext/faac/Makefile.am: + * ext/faad/Makefile.am: + * ext/gsm/Makefile.am: + * ext/hermes/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/jack/Makefile.am: + * ext/jp2k/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/lcs/Makefile.am: + * ext/libfame/Makefile.am: + * ext/libmms/Makefile.am: + * ext/metadata/Makefile.am: + * ext/mpeg2enc/Makefile.am: + * ext/mplex/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/mythtv/Makefile.am: + * ext/nas/Makefile.am: + * ext/neon/Makefile.am: + * ext/ofa/Makefile.am: + * ext/polyp/Makefile.am: + * ext/resindvd/Makefile.am: + * ext/sdl/Makefile.am: + * ext/shout/Makefile.am: + * ext/snapshot/Makefile.am: + * ext/sndfile/Makefile.am: + * ext/soundtouch/Makefile.am: + * ext/spc/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/tarkin/Makefile.am: + * ext/theora/Makefile.am: + * ext/timidity/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * ext/xine/Makefile.am: + * ext/xvid/Makefile.am: + * gst-libs/gst/app/Makefile.am: + * gst-libs/gst/dshow/Makefile.am: + * gst/aiffparse/Makefile.am: + * gst/app/Makefile.am: + * gst/audiobuffer/Makefile.am: + * gst/bayer/Makefile.am: + * gst/cdxaparse/Makefile.am: + * gst/chart/Makefile.am: + * gst/colorspace/Makefile.am: + * gst/dccp/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/deinterlace2/Makefile.am: + * gst/dvdspu/Makefile.am: + * gst/festival/Makefile.am: + * gst/filter/Makefile.am: + * gst/flacparse/Makefile.am: + * gst/flv/Makefile.am: + * gst/games/Makefile.am: + * gst/h264parse/Makefile.am: + * gst/librfb/Makefile.am: + * gst/mixmatrix/Makefile.am: + * gst/modplug/Makefile.am: + * gst/mpeg1sys/Makefile.am: + * gst/mpeg4videoparse/Makefile.am: + * gst/mpegdemux/Makefile.am: + * gst/mpegtsmux/Makefile.am: + * gst/mpegvideoparse/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/nuvdemux/Makefile.am: + * gst/overlay/Makefile.am: + * gst/passthrough/Makefile.am: + * gst/pcapparse/Makefile.am: + * gst/playondemand/Makefile.am: + * gst/rawparse/Makefile.am: + * gst/real/Makefile.am: + * gst/rtjpeg/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/scaletempo/Makefile.am: + * gst/sdp/Makefile.am: + * gst/selector/Makefile.am: + * gst/smooth/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/speed/Makefile.am: + * gst/speexresample/Makefile.am: + * gst/stereo/Makefile.am: + * gst/subenc/Makefile.am: + * gst/tta/Makefile.am: + * gst/vbidec/Makefile.am: + * gst/videodrop/Makefile.am: + * gst/videosignal/Makefile.am: + * gst/virtualdub/Makefile.am: + * gst/vmnc/Makefile.am: + * gst/y4m/Makefile.am: + * sys/acmenc/Makefile.am: + * sys/cdrom/Makefile.am: + * sys/dshowdecwrapper/Makefile.am: + * sys/dshowsrcwrapper/Makefile.am: + * sys/dvb/Makefile.am: + * sys/dxr3/Makefile.am: + * sys/fbdev/Makefile.am: + * sys/oss4/Makefile.am: + * sys/qcam/Makefile.am: + * sys/qtwrapper/Makefile.am: + * sys/vcd/Makefile.am: + * sys/wininet/Makefile.am: + * win32/common/config.h: + Don't install static libs for plugins. Fixes #550851 for -bad. + +2008-06-26 15:52:40 +0000 Mark Nauwelaerts + + [MOVED FROM BAD] Add documentation for YUV4MPEG2 encoder element. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * gst/y4m/gsty4mencode.c: + Add documentation for YUV4MPEG2 encoder element. + +2007-04-24 15:49:18 +0000 Tim-Philipp Müller + + [MOVED FROM BAD] Plug some leaks; try to make build bot happy again. + Original commit message from CVS: + * gst/y4m/gsty4mencode.c: (gst_y4m_encode_init), + (gst_y4m_encode_setcaps): + * tests/check/elements/y4menc.c: (GST_START_TEST): + Plug some leaks; try to make build bot happy again. + +2006-11-13 18:55:57 +0000 Mark Nauwelaerts + + [MOVED FROM BAD] configure.ac: Enable cdaudio and y4m. + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * configure.ac: + Enable cdaudio and y4m. + * gst/y4m/Makefile.am: + * gst/y4m/gsty4mencode.c: (gst_y4m_encode_base_init), + (gst_y4m_encode_class_init), (gst_y4m_encode_init), + (gst_y4m_encode_reset), (gst_y4m_encode_setcaps), + (gst_y4m_encode_get_stream_header), + (gst_y4m_encode_get_frame_header), (gst_y4m_encode_chain), + (gst_y4m_encode_set_property), (gst_y4m_encode_get_property), + (gst_y4m_encode_change_state), (plugin_init): + * gst/y4m/gsty4mencode.h: + Port of y4mencode to 0.10. + +2006-04-25 21:56:38 +0000 Stefan Kost + + [MOVED FROM BAD] 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-08 21:48:01 +0000 Stefan Kost + + [MOVED FROM BAD] Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + Original commit message from CVS: + * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_class_init): + * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_class_init): + * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_class_init): + * ext/arts/gst_arts.c: (gst_arts_class_init): + * ext/artsd/gstartsdsink.c: (gst_artsdsink_class_init): + * ext/audiofile/gstafsink.c: (gst_afsink_class_init): + * ext/audiofile/gstafsrc.c: (gst_afsrc_class_init): + * ext/audioresample/gstaudioresample.c: + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): + * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_class_init): + * ext/divx/gstdivxdec.c: (gst_divxdec_class_init): + * ext/hermes/gsthermescolorspace.c: + (gst_hermes_colorspace_class_init): + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_class_init): + * ext/jack/gstjack.c: (gst_jack_class_init): + * ext/jack/gstjackbin.c: (gst_jack_bin_class_init): + * ext/lcs/gstcolorspace.c: (gst_colorspace_class_init): + * ext/libfame/gstlibfame.c: (gst_fameenc_class_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): + * ext/nas/nassink.c: (gst_nassink_class_init): + * ext/shout/gstshout.c: (gst_icecastsend_class_init): + * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): + * ext/sndfile/gstsf.c: (gst_sf_class_init): + * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_class_init), + (gst_swfdec_class_init): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_class_init): + * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_class_init): + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_class_init): + * gst/chart/gstchart.c: (gst_chart_class_init): + * gst/colorspace/gstcolorspace.c: (gst_colorspace_class_init): + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_class_init): + * gst/festival/gstfestival.c: (gst_festival_class_init): + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): + * gst/filter/gstiir.c: (gst_iir_class_init): + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): + * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init): + * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_class_init): + * gst/mpeg1sys/gstmpeg1systemencode.c: + (gst_system_encode_class_init): + * gst/mpeg1videoparse/gstmp1videoparse.c: + (gst_mp1videoparse_class_init): + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_class_init): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_class_init): + * gst/overlay/gstoverlay.c: (gst_overlay_class_init): + * gst/passthrough/gstpassthrough.c: (passthrough_class_init): + * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init): + * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_class_init): + * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_class_init): + * gst/smooth/gstsmooth.c: (gst_smooth_class_init): + * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init): + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): + * gst/stereo/gststereo.c: (gst_stereo_class_init): + * gst/switch/gstswitch.c: (gst_switch_class_init): + * gst/tta/gstttadec.c: (gst_tta_dec_class_init): + * gst/tta/gstttaparse.c: (gst_tta_parse_class_init): + * gst/vbidec/gstvbidec.c: (gst_vbidec_class_init): + * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init): + * gst/virtualdub/gstxsharpen.c: (gst_xsharpen_class_init): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_class_init): + * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): + * sys/directsound/gstdirectsoundsink.c: + (gst_directsoundsink_class_init): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_class_init): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_class_init): + * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_class_init): + * sys/v4l2/gstv4l2colorbalance.c: + (gst_v4l2_color_balance_channel_class_init): + * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_channel_class_init), + (gst_v4l2_tuner_norm_class_init): + * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_class_init): + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + +2006-04-08 19:04:01 +0000 Stefan Kost + + [MOVED FROM BAD] gst/: Fix more broken GObject macros + Original commit message from CVS: + * gst/colorspace/gstcolorspace.h: + * gst/deinterlace/gstdeinterlace.h: + * gst/passthrough/gstpassthrough.h: + * gst/y4m/gsty4mencode.h: + Fix more broken GObject macros + +2006-04-06 11:35:26 +0000 j@bootlab.org + + [MOVED FROM BAD] Unify the long descriptions in the plugin details (#337263). + Original commit message from CVS: + Patch by: j^ + * 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/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/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): + * ext/nas/nassink.c: (gst_nassink_base_init): + * ext/neon/gstneonhttpsrc.c: + * ext/polyp/polypsink.c: (gst_polypsink_base_init): + * ext/sdl/sdlaudiosink.c: + * ext/sdl/sdlvideosink.c: + * ext/shout/gstshout.c: + * ext/snapshot/gstsnapshot.c: + * ext/sndfile/gstsf.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/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): + * gst/festival/gstfestival.c: + * gst/filter/gstiir.c: + * gst/filter/gstlpwsinc.c: + * gst/freeze/gstfreeze.c: + * gst/games/gstpuzzle.c: (gst_puzzle_base_init): + * 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/tta/gstttadec.c: (gst_tta_dec_base_init): + * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): + * 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: + Unify the long descriptions in the plugin details (#337263). + +2006-04-01 10:09:11 +0000 Thomas Vander Stichele + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] rework build; add translations for v4l2 + Original commit message from CVS: + rework build; add translations for v4l2 + +2005-09-05 17:20:29 +0000 Jan Schmidt + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] Fix up all the state change functions. + Original commit message from CVS: + Fix up all the state change functions. + +2005-07-05 10:51:49 +0000 Andy Wingo + + [MOVED FROM BAD] Way, way, way too many files: Remove crack comment from the 2000 era. + Original commit message from CVS: + 2005-07-05 Andy Wingo + * Way, way, way too many files: + Remove crack comment from the 2000 era. + +2005-01-14 18:36:42 +0000 Stéphane Loeuillet + + [MOVED FROM BAD] I'm a bad boy. using /1001. to force C to do float division and not integer division (as it did in my last commit) + Original commit message from CVS: + * ext/dv/gstdvdec.c: + * gst/subparse/gstsubparse.c: (parse_mdvdsub): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): + I'm a bad boy. using /1001. to force C to do float division + and not integer division (as it did in my last commit) + Thanks to David I. Lehn for pointing this mistake. + +2005-01-14 12:27:22 +0000 Stéphane Loeuillet + + [MOVED FROM BAD] replace framerate aproximations by their real value (24000/1001, 30000/1001, 60000/1001) + Original commit message from CVS: + * ext/dv/gstdvdec.c: + * ext/libfame/gstlibfame.c: + * gst/subparse/gstsubparse.c: (parse_mdvdsub): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): + replace framerate aproximations by their real value + (24000/1001, 30000/1001, 60000/1001) + Finish fixing bug #164049 + +2004-07-27 21:41:30 +0000 Steve Lhomme + + * gst/y4m/y4menc.vcproj: + [MOVED FROM BAD] more working plugins + Original commit message from CVS: + more working plugins + +2004-07-27 09:57:33 +0000 Steve Lhomme + + * gst/y4m/y4menc.vcproj: + [MOVED FROM BAD] rename GStreamer-0.8.lib to libgstreamer.lib + Original commit message from CVS: + rename GStreamer-0.8.lib to libgstreamer.lib + +2004-07-27 09:48:51 +0000 Steve Lhomme + + * gst/y4m/y4menc.vcproj: + [MOVED FROM BAD] avoid problems with math.h, fix release dependancy + Original commit message from CVS: + avoid problems with math.h, fix release dependancy + +2004-07-26 13:20:11 +0000 Steve Lhomme + + * gst/y4m/y4menc.vcproj: + [MOVED FROM BAD] more plugins supported under windows + Original commit message from CVS: + more plugins supported under windows + +2004-04-01 11:48:27 +0000 Jan Schmidt + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] a52dec: Use a debug category, Output timestamps correctly + Original commit message from CVS: + a52dec: Use a debug category, Output timestamps correctly + Emit tag info, Handle events, tell liba52dec about cpu + capabilities so it can use MMX etc. + dvdec: Fix a crasher accessing invalid memory + dvdnavsrc:Some support for byte-format seeking. + Small fixes for still frames and menu button overlays + mpeg2dec: Use a debug category. Adjust the report level of several items to + LOG. Call mpeg2_custom_fbuf to mark our buffers as 'custom buffers' + so it doesn't lose the GstBuffer pointer + navseek: Add the navseek debug element for seeking back and forth in a + video stream using arrow keys. + mpeg2subt:Pretty much a complete rewrite. Now a loopbased element. May still + require work to properly synchronise subtitle buffers. + mpegdemux: + dvddemux: Don't attempt to create subbuffers of size 0 + Reduce a couple of error outputs to warnings. + y4mencode:Output the y4m frame header correctly + +2004-03-15 19:32:27 +0000 Thomas Vander Stichele + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] don't mix tabs and spaces + Original commit message from CVS: + don't mix tabs and spaces + +2004-03-15 16:32:54 +0000 Johan Dahlin + + [MOVED FROM BAD] *.h: Revert indenting + Original commit message from CVS: + * *.h: Revert indenting + +2004-03-14 22:34:33 +0000 Thomas Vander Stichele + + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + [MOVED FROM BAD] gst-indent + Original commit message from CVS: + gst-indent + +2004-01-12 02:01:52 +0000 Benjamin Otte + + [MOVED FROM BAD] gst-libs/gst/video/video.h: Fix caps template names to be understandable. + Original commit message from CVS: + 2004-01-12 Benjamin Otte + * gst-libs/gst/video/video.h: + Fix caps template names to be understandable. + Prefix everything with GST_VIDEO. + * ext/aalib/gstaasink.c: + * ext/divx/gstdivxdec.c: + * ext/divx/gstdivxenc.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/hermes/gstcolorspace.c: (gst_colorspace_base_init): + * ext/jpeg/gstjpegdec.c: (raw_caps_factory): + * ext/jpeg/gstjpegenc.c: (raw_caps_factory): + * ext/libcaca/gstcacasink.c: + * ext/libpng/gstpngenc.c: (raw_caps_factory): + * ext/snapshot/gstsnapshot.c: + * ext/swfdec/gstswfdec.c: + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + * gst/chart/gstchart.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/effectv/gsteffectv.c: + * gst/flx/gstflxdec.c: (gst_flxdec_loop): + * gst/goom/gstgoom.c: + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: (gst_monoscope_init), + (gst_monoscope_srcconnect), (gst_monoscope_chain): + * gst/overlay/gstoverlay.c: + * gst/smooth/gstsmooth.c: + * gst/smpte/gstsmpte.c: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/videocrop/gstvideocrop.c: + * gst/videodrop/gstvideodrop.c: + * gst/y4m/gsty4mencode.c: + * sys/qcam/gstqcamsrc.c: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps): + Make them work with new video.h file. + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): + Make it work with new buffer allocation system. + +2003-12-22 01:47:09 +0000 David Schleef + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] Merge CAPS branch + Original commit message from CVS: + Merge CAPS branch + +2003-12-04 10:37:38 +0000 Andy Wingo + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] remove copyright field from plugins + Original commit message from CVS: + remove copyright field from plugins + +2003-11-16 22:02:23 +0000 Leif Johnson + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] + checking in plugin category changes + Original commit message from CVS: + + checking in plugin category changes + +2003-11-07 12:47:02 +0000 Ronald S. Bultje + + * gst/y4m/gsty4mencode.h: + [MOVED FROM BAD] Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes fro... + Original commit message from CVS: + Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes from several source files + +2003-11-02 19:17:27 +0000 Benjamin Otte + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] fix to new plugin system + Original commit message from CVS: + fix to new plugin system + +2003-10-08 16:08:19 +0000 Andy Wingo + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] /GstBuffer/GstData/ in the API where you can pass events. Fix the plugins to deal with that. Fixes #113488. + Original commit message from CVS: + /GstBuffer/GstData/ in the API where you can pass events. Fix the plugins to deal with that. Fixes #113488. + +2003-08-10 00:01:58 +0000 David Schleef + + * gst/y4m/Makefile.am: + [MOVED FROM BAD] Remove redundant plugindir definition + Original commit message from CVS: + Remove redundant plugindir definition + +2003-07-06 20:49:52 +0000 Ronald S. Bultje + + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + [MOVED FROM BAD] New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as descri... + Original commit message from CVS: + New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as described in the previous commit's document. Note: some plugins will break, some pipelines will break, expect HEAD to be broken or at least not 100% working for a few days, but don't forget to report bugs + +2003-06-29 19:46:13 +0000 Benjamin Otte + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] compatibility fix for new GST_DEBUG stuff. + Original commit message from CVS: + compatibility fix for new GST_DEBUG stuff. + Includes fixes for missing includes for config.h and unistd.h + I only ensured for plugins I can build that they work, so if some of them are still broken, you gotta fix them yourselves unfortunately. + +2003-01-10 13:38:32 +0000 Thomas Vander Stichele + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] PadConnect -> PadLink + Original commit message from CVS: + PadConnect -> PadLink + +2003-01-10 10:22:25 +0000 Thomas Vander Stichele + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] another batch of connect->link fixes please let me know about issues and please refrain of making them yourself, so t... + Original commit message from CVS: + another batch of connect->link fixes + please let me know about issues + and please refrain of making them yourself, so that I don't spend double + the time resolving conflicts + +2002-12-08 14:50:10 +0000 Thomas Vander Stichele + + * gst/y4m/Makefile.am: + [MOVED FROM BAD] parallel install fixes + Original commit message from CVS: + parallel install fixes + +2002-09-18 19:02:52 +0000 Christian Schaller + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] plugins part of license field patch + Original commit message from CVS: + plugins part of license field patch + +2002-06-17 10:29:30 +0000 Thomas Vander Stichele + + * gst/y4m/Makefile.am: + [MOVED FROM BAD] cosmetic change + Original commit message from CVS: + cosmetic change + +2002-05-03 09:59:10 +0000 Thomas Vander Stichele + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] various name fixes and sundry + Original commit message from CVS: + various name fixes and sundry + +2002-04-20 21:42:51 +0000 Andy Wingo + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] a hack to work around intltool's brokenness a current check for mpeg2dec details->klass reorganizations an element br... + Original commit message from CVS: + * a hack to work around intltool's brokenness + * a current check for mpeg2dec + * details->klass reorganizations + * an element browser that uses details->klass + * separated cdxa parse out from the avi directory + +2002-04-11 20:42:26 +0000 Andy Wingo + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] GstPadTemplate <-> gst_pad_template <-> GST_PAD_TEMPLATE same with *factory and typefind. + Original commit message from CVS: + GstPadTemplate <-> gst_pad_template <-> GST_PAD_TEMPLATE + same with *factory and typefind. + also, some -Werror fixes. + +2002-03-30 17:06:26 +0000 Wim Taymans + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] Changed to the new props API + Original commit message from CVS: + Changed to the new props API + Other small tuff. + +2002-03-20 21:45:04 +0000 Andy Wingo + + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + [MOVED FROM BAD] s/Gnome-Streamer/GStreamer/ + Original commit message from CVS: + s/Gnome-Streamer/GStreamer/ + +2002-03-19 04:10:06 +0000 Andy Wingo + + * gst/y4m/Makefile.am: + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + [MOVED FROM BAD] removal of //-style comments don't link plugins to core libs -- the versioning is done internally to the plugins with... + Original commit message from CVS: + * removal of //-style comments + * don't link plugins to core libs -- the versioning is done internally to the plugins with the plugin_info struct, + and symbol resolution is lazy, so we can always know if a plugin can be loaded by the plugin_info data. in theory. + +2002-03-19 01:39:43 +0000 Andy Wingo + + * gst/y4m/Makefile.am: + [MOVED FROM BAD] s/@GST_PLUGIN_LDFLAGS@/$(GST_PLUGIN_LDFLAGS)/ @-substitued variables variables are defined as make variables automagi... + Original commit message from CVS: + s/@GST_PLUGIN_LDFLAGS@/$(GST_PLUGIN_LDFLAGS)/ + @-substitued variables variables are defined as make variables automagically, + and this gives the user the freedom to say make GST_PLUGIN_LDFLAGS=-myflag + +2002-01-18 11:37:19 +0000 Wrobell + + * gst/y4m/Makefile.am: + [MOVED FROM BAD] - plugins are built without versioning info + Original commit message from CVS: + - plugins are built without versioning info + +2002-01-13 22:27:25 +0000 Wim Taymans + + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] Bring the plugins in sync with the new core capsnego system. + Original commit message from CVS: + Bring the plugins in sync with the new core capsnego system. + Added some features, enhancements... + +2002-01-12 03:34:27 +0000 David I. Lehn + + * gst/y4m/Makefile.am: + [MOVED FROM BAD] s/filter/plugin/ link plugins to GST_LIBS rearrange rules to a common format + Original commit message from CVS: + * s/filter/plugin/ + * link plugins to GST_LIBS + * rearrange rules to a common format + +2001-12-23 20:21:20 +0000 Thomas Vander Stichele + + * gst/y4m/Makefile.am: + * gst/y4m/gsty4mencode.c: + [MOVED FROM BAD] more fixes + Original commit message from CVS: + more fixes + +2001-12-23 13:17:36 +0000 Thomas Vander Stichele + + * gst/y4m/Makefile.am: + * gst/y4m/gsty4mencode.c: + * gst/y4m/gsty4mencode.h: + [MOVED FROM BAD] BBB asked me to rename lav to y4m can someone who knows the plugin do this in the source as well ? + Original commit message from CVS: + BBB asked me to rename lav to y4m + can someone who knows the plugin do this in the source as well ? + +2009-05-15 18:17:35 +0100 Tim-Philipp Müller + + * 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 17:11:27 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/audiotestsrc.flac: + * tests/check/elements/id3demux.c: + * tests/check/elements/souphttpsrc.c: + * tests/check/pipelines/flacdec.c: + * tests/check/test-cert.pem: + * tests/check/test-key.pem: + * tests/files/Makefile.am: + * tests/files/audiotestsrc.flac: + * tests/files/test-cert.pem: + * tests/files/test-key.pem: + checks: move files required by unit tests into tests/files and make sure they're disted + Move unit test data into the directory where it belongs and make in particular + the flacdec unit test cd into the directory with the test files instead of making + assumptions about the current working directory in that unit test. As a side effect + of movng those files, there's only one EXTRA_DIST in tests/check/Makefile.am now, + which is likely to work better than having two. Hopefully fixes #582753. + +2009-05-14 21:43:14 +0200 Sebastian Dröge + + * gst/deinterlace/gstdeinterlace.c: + deinterlace: If the upstream max latency is unbound return unbound max latency + Fixes bug #582661. + +2009-05-15 08:44:39 +0200 James Andrewartha + + * gst/flv/gstflvmux.c: + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiomixertrack.c: + * sys/sunaudio/gstsunaudiosrc.c: + * sys/v4l2/v4l2_calls.c: + Fix compiler warnings + Fixes bug #582715. + +2009-05-13 22:46:44 +0200 Josep Torra + + * configure.ac: + Recovered debugutils line accidentally removed in deinterlace2 move. + +2009-05-13 10:46:40 +0200 Sebastian Dröge + + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-deinterlace.xml: + * gst/deinterlace/Makefile.am: + * gst/deinterlace/gstdeinterlace.c: + * gst/deinterlace/gstdeinterlace.h: + * gst/deinterlace/tvtime/greedy.c: + * gst/deinterlace/tvtime/greedyh.asm: + * gst/deinterlace/tvtime/greedyh.c: + * gst/deinterlace/tvtime/greedyhmacros.h: + * gst/deinterlace/tvtime/linear.c: + * gst/deinterlace/tvtime/linearblend.c: + * gst/deinterlace/tvtime/mmx.h: + * gst/deinterlace/tvtime/plugins.h: + * gst/deinterlace/tvtime/scalerbob.c: + * gst/deinterlace/tvtime/sse.h: + * gst/deinterlace/tvtime/tomsmocomp.c: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoop0A.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopBottom.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA8.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA2.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA6.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH2.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopTop.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopVA.inc: + * gst/deinterlace/tvtime/tomsmocomp/SearchLoopVAH.inc: + * gst/deinterlace/tvtime/tomsmocomp/StrangeBob.inc: + * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc: + * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll2.inc: + * gst/deinterlace/tvtime/tomsmocomp/WierdBob.inc: + * gst/deinterlace/tvtime/tomsmocomp/tomsmocompmacros.h: + * gst/deinterlace/tvtime/vfir.c: + * gst/deinterlace/tvtime/weave.c: + * gst/deinterlace/tvtime/weavebff.c: + * gst/deinterlace/tvtime/weavetff.c: + * gst/deinterlace/tvtime/x86-64_macros.inc: + * 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 rename it to deinterlace. + +2009-05-08 15:39:24 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + * gst/deinterlace2/gstdeinterlace2.h: + [MOVED FROM BAD 56/56] 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-04-22 19:43:22 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + * gst/deinterlace2/gstdeinterlace2.h: + [MOVED FROM BAD 55/56] deinterlace2: Add documentation and integrate into the build system + +2009-04-19 17:18:35 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + [MOVED FROM BAD 54/56] 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-17 15:39:59 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + [MOVED FROM BAD 53/56] deinterlace2: Use GST_(DEBUG|WARNING|ERROR)_OBJECT instead of the non-OBJECT ones + +2009-04-17 15:39:36 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + [MOVED FROM BAD 52/56] deinterlace2: Reset history if DISCONT is set on the incoming buffer + +2009-04-17 15:39:10 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + [MOVED FROM BAD 51/56] deinterlace2: Fix timestamps for buffers with RFF flag set + +2009-04-16 17:41:37 +0200 Sebastian Dröge + + * 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: + [MOVED FROM BAD 50/56] deinterlace2: Rename line_length to row_stride and remove output_stride + +2009-04-16 15:52:39 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + [MOVED FROM BAD 49/56] deinterlace2: Implement support for RFF and ONEFIELD buffer flags + +2009-04-15 15:46:44 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + * gst/deinterlace2/gstdeinterlace2.h: + * gst/deinterlace2/tvtime/greedy.c: + * gst/deinterlace2/tvtime/greedyh.c: + * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: + [MOVED FROM BAD 48/56] deinterlace2: Move output buffer from the instance struct to a function parameter + +2009-04-15 15:33:17 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + * gst/deinterlace2/gstdeinterlace2.h: + [MOVED FROM BAD 47/56] deinterlace2: Add initial support for automatic detection of the field order + +2009-04-15 14:47:49 +0200 Sebastian Dröge + + * gst/deinterlace2/gstdeinterlace2.c: + [MOVED FROM BAD 46/56] 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. + +2008-11-06 14:05:55 +0000 Wim Taymans + + [MOVED FROM BAD 45/56] gst/deinterlace2/gstdeinterlace2.c: Bring properties into this century. + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace2_class_init), (gst_deinterlace2_init), + (gst_deinterlace2_set_property), (gst_deinterlace2_get_property): + Bring properties into this century. + +2008-11-04 12:42:30 +0000 Stefan Kost + + [MOVED FROM BAD 44/56] Don't install static libs for plugins. Fixes #550851 for -bad. + Original commit message from CVS: + * ext/alsaspdif/Makefile.am: + * ext/amrwb/Makefile.am: + * ext/apexsink/Makefile.am: + * ext/arts/Makefile.am: + * ext/artsd/Makefile.am: + * ext/audiofile/Makefile.am: + * ext/audioresample/Makefile.am: + * ext/bz2/Makefile.am: + * ext/cdaudio/Makefile.am: + * ext/celt/Makefile.am: + * ext/dc1394/Makefile.am: + * ext/dirac/Makefile.am: + * ext/directfb/Makefile.am: + * ext/divx/Makefile.am: + * ext/dts/Makefile.am: + * ext/faac/Makefile.am: + * ext/faad/Makefile.am: + * ext/gsm/Makefile.am: + * ext/hermes/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/jack/Makefile.am: + * ext/jp2k/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/lcs/Makefile.am: + * ext/libfame/Makefile.am: + * ext/libmms/Makefile.am: + * ext/metadata/Makefile.am: + * ext/mpeg2enc/Makefile.am: + * ext/mplex/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/mythtv/Makefile.am: + * ext/nas/Makefile.am: + * ext/neon/Makefile.am: + * ext/ofa/Makefile.am: + * ext/polyp/Makefile.am: + * ext/resindvd/Makefile.am: + * ext/sdl/Makefile.am: + * ext/shout/Makefile.am: + * ext/snapshot/Makefile.am: + * ext/sndfile/Makefile.am: + * ext/soundtouch/Makefile.am: + * ext/spc/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/tarkin/Makefile.am: + * ext/theora/Makefile.am: + * ext/timidity/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * ext/xine/Makefile.am: + * ext/xvid/Makefile.am: + * gst-libs/gst/app/Makefile.am: + * gst-libs/gst/dshow/Makefile.am: + * gst/aiffparse/Makefile.am: + * gst/app/Makefile.am: + * gst/audiobuffer/Makefile.am: + * gst/bayer/Makefile.am: + * gst/cdxaparse/Makefile.am: + * gst/chart/Makefile.am: + * gst/colorspace/Makefile.am: + * gst/dccp/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/deinterlace2/Makefile.am: + * gst/dvdspu/Makefile.am: + * gst/festival/Makefile.am: + * gst/filter/Makefile.am: + * gst/flacparse/Makefile.am: + * gst/flv/Makefile.am: + * gst/games/Makefile.am: + * gst/h264parse/Makefile.am: + * gst/librfb/Makefile.am: + * gst/mixmatrix/Makefile.am: + * gst/modplug/Makefile.am: + * gst/mpeg1sys/Makefile.am: + * gst/mpeg4videoparse/Makefile.am: + * gst/mpegdemux/Makefile.am: + * gst/mpegtsmux/Makefile.am: + * gst/mpegvideoparse/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/nuvdemux/Makefile.am: + * gst/overlay/Makefile.am: + * gst/passthrough/Makefile.am: + * gst/pcapparse/Makefile.am: + * gst/playondemand/Makefile.am: + * gst/rawparse/Makefile.am: + * gst/real/Makefile.am: + * gst/rtjpeg/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/scaletempo/Makefile.am: + * gst/sdp/Makefile.am: + * gst/selector/Makefile.am: + * gst/smooth/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/speed/Makefile.am: + * gst/speexresample/Makefile.am: + * gst/stereo/Makefile.am: + * gst/subenc/Makefile.am: + * gst/tta/Makefile.am: + * gst/vbidec/Makefile.am: + * gst/videodrop/Makefile.am: + * gst/videosignal/Makefile.am: + * gst/virtualdub/Makefile.am: + * gst/vmnc/Makefile.am: + * gst/y4m/Makefile.am: + * sys/acmenc/Makefile.am: + * sys/cdrom/Makefile.am: + * sys/dshowdecwrapper/Makefile.am: + * sys/dshowsrcwrapper/Makefile.am: + * sys/dvb/Makefile.am: + * sys/dxr3/Makefile.am: + * sys/fbdev/Makefile.am: + * sys/oss4/Makefile.am: + * sys/qcam/Makefile.am: + * sys/qtwrapper/Makefile.am: + * sys/vcd/Makefile.am: + * sys/wininet/Makefile.am: + * win32/common/config.h: + Don't install static libs for plugins. Fixes #550851 for -bad. + +2008-10-09 19:38:52 +0000 Sebastian Dröge + + [MOVED FROM BAD 43/56] gst/deinterlace2/tvtime/tomsmocomp.c: Fix unused variable compiler warning when not building + Original commit message from CVS: + * gst/deinterlace2/tvtime/tomsmocomp.c: + (gst_deinterlace_method_tomsmocomp_class_init): + Fix unused variable compiler warning when not building + X86 assembly. + +2008-08-28 17:16:51 +0000 Jan Schmidt + + [MOVED FROM BAD 42/56] gst/dccp/: Fix compilation on Solaris by including filio.h as needed. + Original commit message from CVS: + * gst/dccp/gstdccp.c: + * gst/dccp/gstdccpclientsrc.c: + Fix compilation on Solaris by including filio.h as needed. + * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: + * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: + Fix compilation with Forte - apparently it hates concatenating a + macro argument that starts with an underscore?? + +2008-08-26 12:33:16 +0000 Sebastian Dröge + + [MOVED FROM BAD 41/56] gst/deinterlace2/tvtime/tomsmocomp/: Unroll the loop to handle two bytes at once. This should give a small speedup an... + Original commit message from CVS: + * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: + * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: + * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: + * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: + Unroll the loop to handle two bytes at once. This should give + a small speedup and makes it possible to handle chroma and luma + different which is needed later. + +2008-08-25 14:37:45 +0000 Sebastian Dröge + + [MOVED FROM BAD 40/56] gst/deinterlace2/: First part of the C implementation of the tomsmocomp deinterlacing algorithm. This only supports s... + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace_method_class_init): + * gst/deinterlace2/gstdeinterlace2.h: + * gst/deinterlace2/tvtime/tomsmocomp.c: + (gst_deinterlace_method_tomsmocomp_class_init): + * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: + * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.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: + First part of the C implementation of the tomsmocomp deinterlacing + algorithm. This only supports search-effort=0 currently, is painfully + slow and needs some cleanup later when all search-effort settings + are implemented in C. + +2008-08-02 18:48:17 +0000 Sebastian Dröge + + [MOVED FROM BAD 39/56] gst/deinterlace2/: Use oil_memcpy() instead of memcpy() as it's faster for the sizes that are usually used here. + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace_simple_method_interpolate_scanline), + (gst_deinterlace_simple_method_copy_scanline), + (gst_deinterlace_simple_method_deinterlace_frame): + * gst/deinterlace2/tvtime/greedy.c: (deinterlace_frame_di_greedy): + * gst/deinterlace2/tvtime/greedyh.c: + (deinterlace_frame_di_greedyh): + * gst/deinterlace2/tvtime/scalerbob.c: + (deinterlace_scanline_scaler_bob): + * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy): + * gst/deinterlace2/tvtime/weave.c: (deinterlace_scanline_weave), + (copy_scanline): + * gst/deinterlace2/tvtime/weavebff.c: (deinterlace_scanline_weave), + (copy_scanline): + * gst/deinterlace2/tvtime/weavetff.c: (deinterlace_scanline_weave), + (copy_scanline): + Use oil_memcpy() instead of memcpy() as it's faster for the sizes that + are usually used here. + +2008-08-02 18:36:11 +0000 Sebastian Dröge + + [MOVED FROM BAD 38/56] gst/deinterlace2/: Add the remaining tvtime deinterlacing methods and fix the deinterlace_frame() implementation of G... + Original commit message from CVS: + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace_simple_method_deinterlace_frame), + (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method): + * gst/deinterlace2/gstdeinterlace2.h: + * gst/deinterlace2/tvtime/linear.c: + (deinterlace_scanline_linear_c), (deinterlace_scanline_linear_mmx), + (deinterlace_scanline_linear_mmxext), + (gst_deinterlace_method_linear_class_init), + (gst_deinterlace_method_linear_init): + * gst/deinterlace2/tvtime/linearblend.c: + (deinterlace_scanline_linear_blend_c), + (deinterlace_scanline_linear_blend2_c), + (deinterlace_scanline_linear_blend_mmx), + (deinterlace_scanline_linear_blend2_mmx), + (gst_deinterlace_method_linear_blend_class_init), + (gst_deinterlace_method_linear_blend_init): + * gst/deinterlace2/tvtime/plugins.h: + * gst/deinterlace2/tvtime/scalerbob.c: + (deinterlace_scanline_scaler_bob), + (gst_deinterlace_method_scaler_bob_class_init), + (gst_deinterlace_method_scaler_bob_init): + * gst/deinterlace2/tvtime/weave.c: (deinterlace_scanline_weave), + (copy_scanline), (gst_deinterlace_method_weave_class_init), + (gst_deinterlace_method_weave_init): + * gst/deinterlace2/tvtime/weavebff.c: (deinterlace_scanline_weave), + (copy_scanline), (gst_deinterlace_method_weave_bff_class_init), + (gst_deinterlace_method_weave_bff_init): + * gst/deinterlace2/tvtime/weavetff.c: (deinterlace_scanline_weave), + (copy_scanline), (gst_deinterlace_method_weave_tff_class_init), + (gst_deinterlace_method_weave_tff_init): + Add the remaining tvtime deinterlacing methods and fix the + deinterlace_frame() implementation of GstDeinterlaceSimpleMethod. + +2008-08-02 18:30:56 +0000 Sebastian Dröge + + [MOVED FROM BAD 37/56] gst/deinterlace2/tvtime/vfir.c: Implement the VFIR deinterlacing method as simple method. + Original commit message from CVS: + * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), + (deinterlace_line_mmx), (gst_deinterlace_method_vfir_class_init): + Implement the VFIR deinterlacing method as simple method. + +2008-08-02 18:18:54 +0000 Sebastian Dröge + + [MOVED FROM BAD 36/56] gst/deinterlace2/gstdeinterlace2.*: Add a GstDeinterlaceSimpleMethod subclass of GstDeinterlaceMethod that can be use... + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace_simple_method_interpolate_scanline), + (gst_deinterlace_simple_method_copy_scanline), + (gst_deinterlace_simple_method_deinterlace_frame), + (gst_deinterlace_simple_method_class_init), + (gst_deinterlace_simple_method_init): + * gst/deinterlace2/gstdeinterlace2.h: + Add a GstDeinterlaceSimpleMethod subclass of GstDeinterlaceMethod that + can be used by simple deinterlacing methods. They only have to provide + a function for interpolating a scanline or copying a scanline. + +2008-08-02 18:15:49 +0000 Sebastian Dröge + + [MOVED FROM BAD 35/56] gst/deinterlace2/gstdeinterlace2.c: Respect the latency of the deinterlacing algorithm for the timestamps of every bu... + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_chain): + Respect the latency of the deinterlacing algorithm for the timestamps + of every buffer. + +2008-08-02 18:13:20 +0000 Sebastian Dröge + + [MOVED FROM BAD 34/56] gst/deinterlace2/tvtime/: Add the MMX registers to the clobbered registers only if __MMX__ is defined. + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedyh.asm: + * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: + Add the MMX registers to the clobbered registers only if __MMX__ is + defined. + +2008-08-02 18:09:56 +0000 Sebastian Dröge + + [MOVED FROM BAD 33/56] gst/deinterlace2/: Enable tomsmocomp again as the C port will be ready for the next release. + Original commit message from CVS: + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method), + (gst_deinterlace2_class_init): + Enable tomsmocomp again as the C port will be ready for the next + release. + +2008-08-02 18:02:44 +0000 Sebastian Dröge + + [MOVED FROM BAD 32/56] gst/deinterlace2/gstdeinterlace2.c: Don't use proxy_getcaps() but implement our own getcaps() function that doubles/h... + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_init), + (gst_greatest_common_divisor), (gst_fraction_double), + (gst_deinterlace2_getcaps), (gst_deinterlace2_setcaps): + Don't use proxy_getcaps() but implement our own getcaps() function + that doubles/halfs the framerate if all fields should be sent out. + +2008-07-18 08:34:06 +0000 Sebastian Dröge + + [MOVED FROM BAD 31/56] Disable the tomsmocomp algorithm for this release as it's buggy and has no C implementation yet. + Original commit message from CVS: + * configure.ac: + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method), + (gst_deinterlace2_class_init), (gst_deinterlace2_init): + * gst/deinterlace2/gstdeinterlace2.h: + * gst/deinterlace2/tvtime/greedy.c: + (gst_deinterlace_method_greedy_l_class_init): + * gst/deinterlace2/tvtime/greedyh.c: + (gst_deinterlace_method_greedy_h_class_init): + * gst/deinterlace2/tvtime/vfir.c: + (gst_deinterlace_method_vfir_class_init): + Disable the tomsmocomp algorithm for this release as it's buggy + and has no C implementation yet. + Build the deinterlace2 plugin on all architectures but still mark it + as experimental. + Build the x86 inline assembly only if GCC inline assembly is supported + and only on x86 or amd64. Fixes bug #543286. + +2008-07-14 14:13:54 +0000 Edward Hervey + + [MOVED FROM BAD 30/56] gst/deinterlace2/tvtime/: Fix build on x86_64 + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedy.c: + (gst_deinterlace_method_greedy_l_class_init): + * gst/deinterlace2/tvtime/greedyh.c: + (gst_deinterlace_method_greedy_h_class_init): + * gst/deinterlace2/tvtime/vfir.c: + (gst_deinterlace_method_vfir_class_init): + Fix build on x86_64 + +2008-07-13 10:56:45 +0000 Sebastian Dröge + + [MOVED FROM BAD 29/56] gst/deinterlace2/tvtime/greedyh.asm: Always use the C implementation if width is not a multiple of 4. The assembly op... + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedyh.asm: + Always use the C implementation if width is not a multiple of 4. The + assembly optimized version only handle this and calling the C + implementation for the remaining part doesn't work because it needs + previous calculations. + +2008-07-13 10:52:03 +0000 Sebastian Dröge + + [MOVED FROM BAD 28/56] gst/deinterlace2/tvtime/: Some cleanup, use 3DNOW instead of TDNOW in macros. + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedyh.asm: + * gst/deinterlace2/tvtime/greedyh.c: + * gst/deinterlace2/tvtime/greedyhmacros.h: + Some cleanup, use 3DNOW instead of TDNOW in macros. + * gst/deinterlace2/tvtime/tomsmocomp.c: + (gst_deinterlace_method_tomsmocomp_class_init): + * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: + * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: + The SSE method in fact only needs MMXEXT, declare it as such. + +2008-07-08 13:31:37 +0000 Sebastian Dröge + + [MOVED FROM BAD 27/56] Don't use declarations after statements in the remaining code. + Original commit message from CVS: + * ext/spc/gstspc.c: (spc_setup): + * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: + Don't use declarations after statements in the remaining code. + +2008-07-06 20:43:58 +0000 Sebastian Dröge + + [MOVED FROM BAD 26/56] gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: Mark internal processing functions as static inline for quite ... + Original commit message from CVS: + * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: + Mark internal processing functions as static inline for quite some + speedup as they're used only once and need to get many local variables + passed as parameter. + +2008-07-05 19:20:30 +0000 Sebastian Dröge + + [MOVED FROM BAD 25/56] gst/deinterlace2/gstdeinterlace2.*: Call the current instance "self" instead of "object". + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace_method_deinterlace_frame), + (gst_deinterlace2_set_method), (gst_deinterlace2_init), + (gst_deinterlace2_reset_history), (gst_deinterlace2_reset), + (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), + (gst_deinterlace2_pop_history), (gst_deinterlace2_head_history), + (gst_deinterlace2_push_history), (gst_deinterlace2_chain), + (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), + (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), + (gst_deinterlace2_src_query): + * gst/deinterlace2/gstdeinterlace2.h: + Call the current instance "self" instead of "object". + +2008-07-05 19:11:56 +0000 Sebastian Dröge + + [MOVED FROM BAD 24/56] gst/deinterlace2/gstdeinterlace2.*: Include latency of the method in the returned latency. + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace_method_get_latency), + (gst_deinterlace2_set_method), (gst_deinterlace2_class_init), + (gst_deinterlace2_push_history), (gst_deinterlace2_chain), + (gst_deinterlace2_setcaps), (gst_deinterlace2_src_query): + * gst/deinterlace2/gstdeinterlace2.h: + Include latency of the method in the returned latency. + Fix outputting of all fields, i.e. doubling of the framerate. + +2008-07-05 16:47:32 +0000 Sebastian Dröge + + [MOVED FROM BAD 23/56] gst/deinterlace2/: Use a GstObject subtype for the deinterlacing methods and export the different settings for each d... + Original commit message from CVS: + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace_method_class_init), (gst_deinterlace_method_init), + (gst_deinterlace_method_deinterlace_frame), + (gst_deinterlace_method_get_fields_required), + (gst_deinterlace2_methods_get_type), (_do_init), + (gst_deinterlace2_set_method), (gst_deinterlace2_class_init), + (gst_deinterlace2_child_proxy_get_child_by_index), + (gst_deinterlace2_child_proxy_get_children_count), + (gst_deinterlace2_child_proxy_interface_init), + (gst_deinterlace2_init), (gst_deinterlace2_finalize), + (gst_deinterlace2_chain), (gst_deinterlace2_src_query): + * gst/deinterlace2/gstdeinterlace2.h: + * gst/deinterlace2/tvtime/greedy.c: + (deinterlace_greedy_packed422_scanline_c), + (deinterlace_greedy_packed422_scanline_mmx), + (deinterlace_greedy_packed422_scanline_mmxext), + (deinterlace_frame_di_greedy), + (gst_deinterlace_method_greedy_l_set_property), + (gst_deinterlace_method_greedy_l_get_property), + (gst_deinterlace_method_greedy_l_class_init), + (gst_deinterlace_method_greedy_l_init): + * gst/deinterlace2/tvtime/greedyh.asm: + * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C), + (deinterlace_frame_di_greedyh), + (gst_deinterlace_method_greedy_h_set_property), + (gst_deinterlace_method_greedy_h_get_property), + (gst_deinterlace_method_greedy_h_class_init), + (gst_deinterlace_method_greedy_h_init): + * gst/deinterlace2/tvtime/greedyh.h: + * gst/deinterlace2/tvtime/plugins.h: + * gst/deinterlace2/tvtime/tomsmocomp.c: + (gst_deinterlace_method_tomsmocomp_set_property), + (gst_deinterlace_method_tomsmocomp_get_property), + (gst_deinterlace_method_tomsmocomp_class_init), + (gst_deinterlace_method_tomsmocomp_init): + * gst/deinterlace2/tvtime/tomsmocomp.h: + * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: + * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir), + (gst_deinterlace_method_vfir_class_init), + (gst_deinterlace_method_vfir_init): + Use a GstObject subtype for the deinterlacing methods and export + the different settings for each deinterlacing method via GObject + properties. + Implement GstChildProxy interface to allow access to the used + deinterlacing method and to allow adjusting the different settings. + Move global variables of the tomsmocomp deinterlacing method into + function local variables to make it possible to use this deinterlacing + method from different instances. + +2008-07-05 12:22:37 +0000 Sebastian Dröge + + [MOVED FROM BAD 22/56] gst/deinterlace2/tvtime/greedyh.asm: Support widths that are not a multiply of 4 when using the assembly optimized gr... + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedyh.asm: + Support widths that are not a multiply of 4 when using the assembly + optimized greedyh implementations. + +2008-07-04 18:54:15 +0000 Sebastian Dröge + + [MOVED FROM BAD 21/56] gst/deinterlace2/tvtime/greedyh.c: Only build the assembly optimized implementations on x86. + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedyh.c: + (deinterlace_frame_di_greedyh): + Only build the assembly optimized implementations on x86. + +2008-06-30 07:51:07 +0000 Sebastian Dröge + + [MOVED FROM BAD 20/56] gst/deinterlace2/: Remove useless file and mark everything possible as static. + Original commit message from CVS: + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/tvtime/tomsmocomp.c: (tomsmocomp_init), + (tomsmocomp_filter_mmx), (tomsmocomp_filter_3dnow), + (tomsmocomp_filter_sse), (deinterlace_frame_di_tomsmocomp): + * gst/deinterlace2/tvtime/tomsmocomp.h: + Remove useless file and mark everything possible as static. + * gst/deinterlace2/tvtime/greedy.c: + * gst/deinterlace2/tvtime/greedyh.c: + Use "_stdint.h" instead of . + +2008-06-29 10:56:47 +0000 Sebastian Dröge + + [MOVED FROM BAD 19/56] gst/deinterlace2/: Get rid of speedy.[ch] as we don't use most of it's code anyway and it doesn't seem to be relicens... + Original commit message from CVS: + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_init): + * gst/deinterlace2/tvtime/greedy.c: (deinterlace_frame_di_greedy): + * gst/deinterlace2/tvtime/greedyh.c: + (deinterlace_frame_di_greedyh): + * gst/deinterlace2/tvtime/speedtools.h: + * gst/deinterlace2/tvtime/speedy.c: + * gst/deinterlace2/tvtime/speedy.h: + * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy): + * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: + * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir): + Get rid of speedy.[ch] as we don't use most of it's code anyway + and it doesn't seem to be relicensed to LGPL. Use memcpy() instead + of the speedy memcpy everywhere instead. + * gst/deinterlace2/gstdeinterlace2.h: + Remove many unused declarations. + +2008-06-28 18:13:08 +0000 Sebastian Dröge + + [MOVED FROM BAD 18/56] gst/deinterlace2/gstdeinterlace2.c: Divide latency be 2 to convert from fields to frames. + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_src_query): + Divide latency be 2 to convert from fields to frames. + +2008-06-28 18:10:52 +0000 Sebastian Dröge + + [MOVED FROM BAD 17/56] gst/deinterlace2/tvtime/greedy.c: Don't use scanlines function from gstdeinterlace2 as it's not appropiate for this m... + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedy.c: + (deinterlace_greedy_packed422_scanline_c), + (deinterlace_greedy_packed422_scanline_mmx), + (deinterlace_greedy_packed422_scanline_mmxext), + (deinterlace_frame_di_greedy): + Don't use scanlines function from gstdeinterlace2 as it's + not appropiate for this method. Instead implement deinterlace_frame + function by taking the one from greedyh. + * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C): + Small fix for the C implementation. + * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir): + Don't use the scanlines function from gstdeinterlace2 as it's only + used for this method and will be removed. Instead implement + deinterlace_frame function and make it a bit more efficient. + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace2_class_init), (gst_deinterlace2_set_method), + (gst_deinterlace2_push_history), (gst_deinterlace2_chain), + (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), + (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), + (gst_deinterlace2_src_query): + Fix coding style and remove scanlines function as it's unused now. + +2008-06-28 17:25:56 +0000 Sebastian Dröge + + [MOVED FROM BAD 16/56] gst/deinterlace2/tvtime/: Add a C implementation for the greedyh deinterlacing method, clean up the code a bit and ma... + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedyh.asm: + * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C), + (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method): + * gst/deinterlace2/tvtime/greedyhmacros.h: + Add a C implementation for the greedyh deinterlacing method, clean + up the code a bit and mark the SSE version as MMXEXT as it doesn't + require any SSE instructions. + +2008-06-27 13:22:34 +0000 Sebastian Dröge + + [MOVED FROM BAD 15/56] gst/deinterlace2/gstdeinterlace2.c: If we're outputting all fields the framerate has to be doubled. + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace2_set_property), (gst_deinterlace2_chain), + (gst_deinterlace2_setcaps): + If we're outputting all fields the framerate has to be doubled. + Set duration on the outgoing buffers. + +2008-06-25 16:05:08 +0000 Edward Hervey + + [MOVED FROM BAD 14/56] gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: Remove unneeded macros that break build on macosx. + Original commit message from CVS: + * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: + Remove unneeded macros that break build on macosx. + +2008-06-24 12:08:47 +0000 Sebastian Dröge + + [MOVED FROM BAD 13/56] gst/deinterlace2/tvtime/greedy.c: Optimize MMX/MMXEXT implementations a bit by requiring two less memory accesses and... + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedy.c: + (deinterlace_greedy_packed422_scanline_mmx), + (deinterlace_greedy_packed422_scanline_mmxext): + Optimize MMX/MMXEXT implementations a bit by requiring two less + memory accesses and fix the workaround for the missing right shift + on bytes to unset the highest bit of every byte. + +2008-06-24 10:15:41 +0000 Sebastian Dröge + + [MOVED FROM BAD 12/56] gst/deinterlace2/tvtime/greedy.c: Remove sfence instruction as it's not needed and actually is an SSE instruction. + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedy.c: + (deinterlace_greedy_packed422_scanline_mmxext): + Remove sfence instruction as it's not needed and actually is an SSE + instruction. + +2008-06-24 10:12:08 +0000 Sebastian Dröge + + [MOVED FROM BAD 11/56] gst/deinterlace2/tvtime/greedy.c: Add plain MMX implementation for the greedyl method. + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedy.c: + (deinterlace_greedy_packed422_scanline_mmx), + (deinterlace_greedy_packed422_scanline): + Add plain MMX implementation for the greedyl method. + +2008-06-24 09:40:03 +0000 Sebastian Dröge + + [MOVED FROM BAD 10/56] gst/deinterlace2/Makefile.am: Move the assembly includes to noinst_HEADERS where they belong. + Original commit message from CVS: + * gst/deinterlace2/Makefile.am: + Move the assembly includes to noinst_HEADERS where they belong. + * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), + (deinterlace_line_mmx): + Fix C and MMX implementations a bit more. + +2008-06-24 09:10:46 +0000 Sebastian Dröge + + [MOVED FROM BAD 09/56] gst/deinterlace2/tvtime/greedy.c: Fix the C implementation to produce correct results and optimize the + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedy.c: + (deinterlace_greedy_packed422_scanline_c), + (deinterlace_greedy_packed422_scanline_mmxext), + (deinterlace_greedy_packed422_scanline): + Fix the C implementation to produce correct results and optimize the + MMXEXT implementation. + Handle odd widths and don't read over array boundaries in the MMXEXT + implementation. + * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), + (deinterlace_line_mmx), (deinterlace_scanline_vfir): + Fix a small rounding bug in the MMX implementation, the MMX + implementation doesn't actually need MMXEXT instructions so don't mark + it as such. + Handle odd widths in both implementations. + +2008-06-21 09:05:00 +0000 Sebastian Dröge + + [MOVED FROM BAD 08/56] gst/deinterlace2/tvtime/greedy.c: Implement a C version of the greedy low motion algorithm and mark the assembly opti... + Original commit message from CVS: + * gst/deinterlace2/tvtime/greedy.c: + (deinterlace_greedy_packed422_scanline_sse), + (deinterlace_greedy_packed422_scanline_c), + (deinterlace_greedy_packed422_scanline): + Implement a C version of the greedy low motion algorithm and mark the + assembly optimized version as SSE as it uses SSE instructions + additional to MMX instructions. + +2008-06-20 14:48:40 +0000 Sebastian Dröge + + [MOVED FROM BAD 07/56] gst/deinterlace2/tvtime/vfir.c: Make it possible to use the vfir method on X86 CPUs without MMXEXT too but use the MM... + Original commit message from CVS: + * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_mmxext), + (deinterlace_line_c), (deinterlace_scanline_vfir): + Make it possible to use the vfir method on X86 CPUs without MMXEXT too + but use the MMXEXT optimized code whenever possible. + +2008-06-20 14:35:25 +0000 Sebastian Dröge + + [MOVED FROM BAD 06/56] gst/deinterlace2/gstdeinterlace2.*: Reset element state on PAUSED->READY properly, don't leak any buffers when finali... + Original commit message from CVS: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace2_class_init), (gst_deinterlace2_init), + (gst_deinterlace2_reset_history), (gst_deinterlace2_reset), + (gst_deinterlace2_finalize), (gst_deinterlace2_chain), + (gst_deinterlace2_sink_event), (gst_deinterlace2_change_state), + (gst_deinterlace2_src_query): + * gst/deinterlace2/gstdeinterlace2.h: + Reset element state on PAUSED->READY properly, don't leak any buffers + when finalizing, allocate buffers with gst_pad_alloc_buffer() and + properly return flow returns from gst_pad_push() instead of ignoring them. + +2008-06-20 13:45:08 +0000 Sebastian Dröge + + [MOVED FROM BAD 05/56] gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: Add missing header. + Original commit message from CVS: + * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: + Add missing header. + +2008-06-20 13:24:29 +0000 Sebastian Dröge + + [MOVED FROM BAD 04/56] Fix compilation on generic x86/amd64 and include deinterlace2 in the build system. Because of several bugs it's still... + Original commit message from CVS: + * configure.ac: + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/tvtime/greedyh.asm: + * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: + Fix compilation on generic x86/amd64 and include deinterlace2 in the + build system. Because of several bugs it's still enabled only + by --enable-experimental. + +2008-06-18 06:31:13 +0000 Stefan Kost + + [MOVED FROM BAD 03/56] Fix gtk-doc warnings. Also don't misuse api-doc comments for normal comments. + Original commit message from CVS: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * examples/app/appsrc-ra.c: + * examples/app/appsrc-seekable.c: + * examples/app/appsrc-stream.c: + * examples/app/appsrc-stream2.c: + * ext/directfb/dfbvideosink.h: + * ext/metadata/gstbasemetadata.c: + * ext/metadata/gstbasemetadata.h: + * ext/metadata/metadata.c: + * ext/metadata/metadataexif.c: + * ext/theora/theoradec.h: + * gst/deinterlace2/gstdeinterlace2.h: + * gst/deinterlace2/tvtime/speedy.c: + * gst/deinterlace2/tvtime/speedy.h: + * gst/deinterlace2/tvtime/vfir.c: + Fix gtk-doc warnings. Also don't misuse api-doc comments for normal + comments. + +2008-06-11 11:12:49 +0000 Martin Eikermann + + [MOVED FROM BAD 02/56] gst/deinterlace2/: Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, which was relicensed to LGPL f... + Original commit message from CVS: + Based on a patch by: Martin Eikermann + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace2_method_get_type), + (gst_deinterlace2_fields_get_type), + (gst_deinterlace2_field_layout_get_type), + (gst_deinterlace2_base_init), (gst_deinterlace2_class_init), + (gst_deinterlace2_init), (gst_deinterlace2_set_method), + (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), + (gst_deinterlace2_finalize), (gst_deinterlace2_pop_history), + (gst_deinterlace2_head_history), (gst_deinterlace2_push_history), + (gst_deinterlace2_deinterlace_scanlines), (gst_deinterlace2_chain), + (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), + (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), + (gst_deinterlace2_src_query), (gst_deinterlace2_src_query_types), + (plugin_init): + * gst/deinterlace2/gstdeinterlace2.h: + * gst/deinterlace2/tvtime/greedy.c: (copy_scanline), + (deinterlace_greedy_packed422_scanline_mmxext), + (dscaler_greedyl_get_method): + * gst/deinterlace2/tvtime/greedyh.asm: + * gst/deinterlace2/tvtime/greedyh.c: + (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method), + (greedyh_init), (greedyh_filter_mmx), (greedyh_filter_3dnow), + (greedyh_filter_sse): + * gst/deinterlace2/tvtime/greedyh.h: + * gst/deinterlace2/tvtime/greedyhmacros.h: + * gst/deinterlace2/tvtime/mmx.h: + * gst/deinterlace2/tvtime/plugins.h: + * gst/deinterlace2/tvtime/speedtools.h: + * gst/deinterlace2/tvtime/speedy.c: (multiply_alpha), (clip255), + (comb_factor_packed422_scanline_mmx), + (diff_factor_packed422_scanline_c), + (diff_factor_packed422_scanline_mmx), + (diff_packed422_block8x8_mmx), (diff_packed422_block8x8_c), + (packed444_to_packed422_scanline_c), + (packed422_to_packed444_scanline_c), + (packed422_to_packed444_rec601_scanline_c), + (vfilter_chroma_121_packed422_scanline_mmx), + (vfilter_chroma_121_packed422_scanline_c), + (vfilter_chroma_332_packed422_scanline_mmx), + (vfilter_chroma_332_packed422_scanline_c), + (kill_chroma_packed422_inplace_scanline_mmx), + (kill_chroma_packed422_inplace_scanline_c), + (invert_colour_packed422_inplace_scanline_mmx), + (invert_colour_packed422_inplace_scanline_c), + (mirror_packed422_inplace_scanline_c), + (interpolate_packed422_scanline_c), + (convert_uyvy_to_yuyv_scanline_mmx), + (convert_uyvy_to_yuyv_scanline_c), + (interpolate_packed422_scanline_mmx), + (interpolate_packed422_scanline_mmxext), + (blit_colour_packed422_scanline_c), + (blit_colour_packed422_scanline_mmx), + (blit_colour_packed422_scanline_mmxext), + (blit_colour_packed4444_scanline_c), + (blit_colour_packed4444_scanline_mmx), + (blit_colour_packed4444_scanline_mmxext), (small_memcpy), + (speedy_memcpy_c), (speedy_memcpy_mmx), (speedy_memcpy_mmxext), + (blit_packed422_scanline_c), (blit_packed422_scanline_mmx), + (blit_packed422_scanline_mmxext), + (composite_colour4444_alpha_to_packed422_scanline_c), + (composite_colour4444_alpha_to_packed422_scanline_mmxext), + (composite_packed4444_alpha_to_packed422_scanline_c), + (composite_packed4444_alpha_to_packed422_scanline_mmxext), + (composite_packed4444_to_packed422_scanline_c), + (composite_packed4444_to_packed422_scanline_mmxext), + (composite_alphamask_to_packed4444_scanline_c), + (composite_alphamask_to_packed4444_scanline_mmxext), + (composite_alphamask_alpha_to_packed4444_scanline_c), + (premultiply_packed4444_scanline_c), + (premultiply_packed4444_scanline_mmxext), + (blend_packed422_scanline_c), (blend_packed422_scanline_mmxext), + (quarter_blit_vertical_packed422_scanline_mmxext), + (quarter_blit_vertical_packed422_scanline_c), + (subpix_blit_vertical_packed422_scanline_c), + (a8_subpix_blit_scanline_c), (myround), (init_RGB_to_YCbCr_tables), + (init_YCbCr_to_RGB_tables), (rgb24_to_packed444_rec601_scanline_c), + (rgba32_to_packed4444_rec601_scanline_c), + (packed444_to_rgb24_rec601_scanline_c), + (packed444_to_nonpremultiplied_packed4444_scanline_c), + (aspect_adjust_packed4444_scanline_c), (setup_speedy_calls), + (speedy_get_accel): + * gst/deinterlace2/tvtime/speedy.h: + * gst/deinterlace2/tvtime/sse.h: + * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy), + (deinterlace_frame_di_tomsmocomp), (dscaler_tomsmocomp_get_method), + (tomsmocomp_init), (tomsmocomp_filter_mmx), + (tomsmocomp_filter_3dnow), (tomsmocomp_filter_sse): + * gst/deinterlace2/tvtime/tomsmocomp.h: + * 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/vfir.c: (deinterlace_line), + (deinterlace_scanline_vfir), (copy_scanline), + (dscaler_vfir_get_method): + * gst/deinterlace2/tvtime/x86-64_macros.inc: + Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, + which was relicensed to LGPL for GStreamer and in theory provides + better and faster results than the simple deinterlace element. + Fixes bug #163578. + Ported to GStreamer 0.10 but still not enabled or included in the + build system by default because of bad artefacts caused by a bug + somewhere and as it can be only build on x86/amd64 ATM and requires + special CFLAGS. Will be fixed soon. + +2008-06-11 11:12:14 +0000 Martin Eikermann + + [MOVED FROM BAD 01/56] gst/deinterlace2/: Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, which was relicensed to LGPL f... + Original commit message from CVS: + Based on a patch by: Martin Eikermann + * gst/deinterlace2/Makefile.am: + * gst/deinterlace2/gstdeinterlace2.c: + (gst_deinterlace2_method_get_type), + (gst_deinterlace2_fields_get_type), + (gst_deinterlace2_field_layout_get_type), + (gst_deinterlace2_base_init), (gst_deinterlace2_class_init), + (gst_deinterlace2_init), (gst_deinterlace2_set_method), + (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), + (gst_deinterlace2_finalize), (gst_deinterlace2_pop_history), + (gst_deinterlace2_head_history), (gst_deinterlace2_push_history), + (gst_deinterlace2_deinterlace_scanlines), (gst_deinterlace2_chain), + (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), + (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), + (gst_deinterlace2_src_query), (gst_deinterlace2_src_query_types), + (plugin_init): + * gst/deinterlace2/gstdeinterlace2.h: + * gst/deinterlace2/tvtime/greedy.c: (copy_scanline), + (deinterlace_greedy_packed422_scanline_mmxext), + (dscaler_greedyl_get_method): + * gst/deinterlace2/tvtime/greedyh.asm: + * gst/deinterlace2/tvtime/greedyh.c: + (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method), + (greedyh_init), (greedyh_filter_mmx), (greedyh_filter_3dnow), + (greedyh_filter_sse): + * gst/deinterlace2/tvtime/greedyh.h: + * gst/deinterlace2/tvtime/greedyhmacros.h: + * gst/deinterlace2/tvtime/mmx.h: + * gst/deinterlace2/tvtime/plugins.h: + * gst/deinterlace2/tvtime/speedtools.h: + * gst/deinterlace2/tvtime/speedy.c: (multiply_alpha), (clip255), + (comb_factor_packed422_scanline_mmx), + (diff_factor_packed422_scanline_c), + (diff_factor_packed422_scanline_mmx), + (diff_packed422_block8x8_mmx), (diff_packed422_block8x8_c), + (packed444_to_packed422_scanline_c), + (packed422_to_packed444_scanline_c), + (packed422_to_packed444_rec601_scanline_c), + (vfilter_chroma_121_packed422_scanline_mmx), + (vfilter_chroma_121_packed422_scanline_c), + (vfilter_chroma_332_packed422_scanline_mmx), + (vfilter_chroma_332_packed422_scanline_c), + (kill_chroma_packed422_inplace_scanline_mmx), + (kill_chroma_packed422_inplace_scanline_c), + (invert_colour_packed422_inplace_scanline_mmx), + (invert_colour_packed422_inplace_scanline_c), + (mirror_packed422_inplace_scanline_c), + (interpolate_packed422_scanline_c), + (convert_uyvy_to_yuyv_scanline_mmx), + (convert_uyvy_to_yuyv_scanline_c), + (interpolate_packed422_scanline_mmx), + (interpolate_packed422_scanline_mmxext), + (blit_colour_packed422_scanline_c), + (blit_colour_packed422_scanline_mmx), + (blit_colour_packed422_scanline_mmxext), + (blit_colour_packed4444_scanline_c), + (blit_colour_packed4444_scanline_mmx), + (blit_colour_packed4444_scanline_mmxext), (small_memcpy), + (speedy_memcpy_c), (speedy_memcpy_mmx), (speedy_memcpy_mmxext), + (blit_packed422_scanline_c), (blit_packed422_scanline_mmx), + (blit_packed422_scanline_mmxext), + (composite_colour4444_alpha_to_packed422_scanline_c), + (composite_colour4444_alpha_to_packed422_scanline_mmxext), + (composite_packed4444_alpha_to_packed422_scanline_c), + (composite_packed4444_alpha_to_packed422_scanline_mmxext), + (composite_packed4444_to_packed422_scanline_c), + (composite_packed4444_to_packed422_scanline_mmxext), + (composite_alphamask_to_packed4444_scanline_c), + (composite_alphamask_to_packed4444_scanline_mmxext), + (composite_alphamask_alpha_to_packed4444_scanline_c), + (premultiply_packed4444_scanline_c), + (premultiply_packed4444_scanline_mmxext), + (blend_packed422_scanline_c), (blend_packed422_scanline_mmxext), + (quarter_blit_vertical_packed422_scanline_mmxext), + (quarter_blit_vertical_packed422_scanline_c), + (subpix_blit_vertical_packed422_scanline_c), + (a8_subpix_blit_scanline_c), (myround), (init_RGB_to_YCbCr_tables), + (init_YCbCr_to_RGB_tables), (rgb24_to_packed444_rec601_scanline_c), + (rgba32_to_packed4444_rec601_scanline_c), + (packed444_to_rgb24_rec601_scanline_c), + (packed444_to_nonpremultiplied_packed4444_scanline_c), + (aspect_adjust_packed4444_scanline_c), (setup_speedy_calls), + (speedy_get_accel): + * gst/deinterlace2/tvtime/speedy.h: + * gst/deinterlace2/tvtime/sse.h: + * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy), + (deinterlace_frame_di_tomsmocomp), (dscaler_tomsmocomp_get_method), + (tomsmocomp_init), (tomsmocomp_filter_mmx), + (tomsmocomp_filter_3dnow), (tomsmocomp_filter_sse): + * gst/deinterlace2/tvtime/tomsmocomp.h: + * 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/vfir.c: (deinterlace_line), + (deinterlace_scanline_vfir), (copy_scanline), + (dscaler_vfir_get_method): + * gst/deinterlace2/tvtime/x86-64_macros.inc: + Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, + which was relicensed to LGPL for GStreamer and in theory provides + better and faster results than the simple deinterlace element. + Fixes bug #163578. + Ported to GStreamer 0.10 but still not enabled or included in the + build system by default because of bad artefacts caused by a bug + somewhere and as it can be only build on x86/amd64 ATM and requires + special CFLAGS. Will be fixed soon. + +2009-05-13 10:30:35 +0200 Sebastian Dröge + + * configure.ac: + flv: Actually add the flv plugin to configure.ac + +2009-05-13 09:24:26 +0100 Tim-Philipp Müller + + * tests/check/pipelines/flacdec.c: + checks: fix flacdec unit tests on big-endian machines and under valgrind + Flacdec outputs 16-bit samples, so let's check if the value of the first + sample is what we expect rather than just the first byte, which may be + different from what we expect depending on the host's endianness. Fixes + the flacdec unit tests on PPC. Also fix a bunch of leaks in the unit + tests to make valgrind happy. Fixes #582420. + +2009-05-13 09:18:07 +0100 Tim-Philipp Müller + + * ext/flac/gstflacdec.c: + flacdec: fix buffer leak + gst_buffer_replace() will take its own ref, so we still have + to unref the buffer if we don't need it any longer. + +2009-05-12 21:20:04 +0200 Sebastian Dröge + + * gst/avi/gstavidemux.c: + avidemux: Fix pointer arithmetic + This fixes a seeking regression, bug #134522. + +2009-05-12 21:36:31 +0200 Sebastian Dröge + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flv.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + Moved 'flv' from -bad to -good + +2009-05-07 17:53:42 +0100 Christian Schaller + + * gst/flv/gstflvdemux.c: + [MOVED FROM BAD 57/57] Add ranks to various muxers and encoders in -bad + +2009-04-29 18:52:20 +0100 Tristan Matthews + + * gst/flv/gstflvmux.c: + [MOVED FROM BAD 56/57] flvmux: init variable to NULL to fix compiler warning + Fixes #580786. + +2009-04-29 13:56:07 +0200 Sebastian Dröge + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvparse.c: + [MOVED FROM BAD 55/57] flv: Set/require the framed/parsed fields of the audio/mpeg caps to TRUE + +2009-04-29 13:16:25 +0200 Sebastian Dröge + + * gst/flv/gstflvmux.c: + [MOVED FROM BAD 54/57] flv: Always write at least the minimal tags and write the PAR as tags + +2009-04-29 13:03:46 +0200 Sebastian Dröge + + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + [MOVED FROM BAD 53/57] flv: Add support for muxing some tags + +2009-04-29 13:03:27 +0200 Sebastian Dröge + + * gst/flv/gstflvparse.c: + [MOVED FROM BAD 52/57] flv: Add support for title tag + +2009-04-29 09:40:41 +0200 Sebastian Dröge + + * gst/flv/gstflvparse.c: + [MOVED FROM BAD 51/57] 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-22 19:52:05 +0200 Sebastian Dröge + + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvmux.c: + * gst/flv/gstflvmux.h: + [MOVED FROM BAD 50/57] flv: Add documentation to flvmux and flvdemux + Partially fixes bug #573737. + +2009-01-22 13:39:34 +0100 Jan Urbanski + + * gst/flv/gstflvparse.c: + [MOVED FROM BAD 49/57] Add support for ECMA arrays in script tags. Fixes bug #567965. + Add support for ECMA arrays in script tags. This fixes + seeking on some files that have the seek table stored + inside an ECMA array instead of the normal array. + +2008-12-03 11:43:00 +0000 Sebastian Dröge + + [MOVED FROM BAD 48/57] gst/flv/gstflvparse.c: Check if strings are valid UTF8 before using them. + Original commit message from CVS: + * gst/flv/gstflvparse.c: (FLV_GET_STRING): + Check if strings are valid UTF8 before using them. + +2008-11-24 11:17:19 +0000 Julien Moutte + + [MOVED FROM BAD 47/57] gst/flv/gstflvdemux.c: Fix non key unit seeking by always going to the previous keyframe. Mark the discont flag when ... + Original commit message from CVS: + 2008-11-24 Julien Moutte + * gst/flv/gstflvdemux.c: (gst_flv_demux_find_offset), + (gst_flv_demux_handle_seek_push), + (gst_flv_demux_handle_seek_pull): + Fix non key unit seeking by always going to the previous + keyframe. Mark + the discont flag when we've moved in the file. + * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate): MP3 + streams + are parsed already, makes autoplugged pipelines shorter. + +2008-11-04 12:42:30 +0000 Stefan Kost + + [MOVED FROM BAD 46/57] Don't install static libs for plugins. Fixes #550851 for -bad. + Original commit message from CVS: + * ext/alsaspdif/Makefile.am: + * ext/amrwb/Makefile.am: + * ext/apexsink/Makefile.am: + * ext/arts/Makefile.am: + * ext/artsd/Makefile.am: + * ext/audiofile/Makefile.am: + * ext/audioresample/Makefile.am: + * ext/bz2/Makefile.am: + * ext/cdaudio/Makefile.am: + * ext/celt/Makefile.am: + * ext/dc1394/Makefile.am: + * ext/dirac/Makefile.am: + * ext/directfb/Makefile.am: + * ext/divx/Makefile.am: + * ext/dts/Makefile.am: + * ext/faac/Makefile.am: + * ext/faad/Makefile.am: + * ext/gsm/Makefile.am: + * ext/hermes/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/jack/Makefile.am: + * ext/jp2k/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/lcs/Makefile.am: + * ext/libfame/Makefile.am: + * ext/libmms/Makefile.am: + * ext/metadata/Makefile.am: + * ext/mpeg2enc/Makefile.am: + * ext/mplex/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/mythtv/Makefile.am: + * ext/nas/Makefile.am: + * ext/neon/Makefile.am: + * ext/ofa/Makefile.am: + * ext/polyp/Makefile.am: + * ext/resindvd/Makefile.am: + * ext/sdl/Makefile.am: + * ext/shout/Makefile.am: + * ext/snapshot/Makefile.am: + * ext/sndfile/Makefile.am: + * ext/soundtouch/Makefile.am: + * ext/spc/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/tarkin/Makefile.am: + * ext/theora/Makefile.am: + * ext/timidity/Makefile.am: + * ext/twolame/Makefile.am: + * ext/x264/Makefile.am: + * ext/xine/Makefile.am: + * ext/xvid/Makefile.am: + * gst-libs/gst/app/Makefile.am: + * gst-libs/gst/dshow/Makefile.am: + * gst/aiffparse/Makefile.am: + * gst/app/Makefile.am: + * gst/audiobuffer/Makefile.am: + * gst/bayer/Makefile.am: + * gst/cdxaparse/Makefile.am: + * gst/chart/Makefile.am: + * gst/colorspace/Makefile.am: + * gst/dccp/Makefile.am: + * gst/deinterlace/Makefile.am: + * gst/deinterlace2/Makefile.am: + * gst/dvdspu/Makefile.am: + * gst/festival/Makefile.am: + * gst/filter/Makefile.am: + * gst/flacparse/Makefile.am: + * gst/flv/Makefile.am: + * gst/games/Makefile.am: + * gst/h264parse/Makefile.am: + * gst/librfb/Makefile.am: + * gst/mixmatrix/Makefile.am: + * gst/modplug/Makefile.am: + * gst/mpeg1sys/Makefile.am: + * gst/mpeg4videoparse/Makefile.am: + * gst/mpegdemux/Makefile.am: + * gst/mpegtsmux/Makefile.am: + * gst/mpegvideoparse/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/nuvdemux/Makefile.am: + * gst/overlay/Makefile.am: + * gst/passthrough/Makefile.am: + * gst/pcapparse/Makefile.am: + * gst/playondemand/Makefile.am: + * gst/rawparse/Makefile.am: + * gst/real/Makefile.am: + * gst/rtjpeg/Makefile.am: + * gst/rtpmanager/Makefile.am: + * gst/scaletempo/Makefile.am: + * gst/sdp/Makefile.am: + * gst/selector/Makefile.am: + * gst/smooth/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/speed/Makefile.am: + * gst/speexresample/Makefile.am: + * gst/stereo/Makefile.am: + * gst/subenc/Makefile.am: + * gst/tta/Makefile.am: + * gst/vbidec/Makefile.am: + * gst/videodrop/Makefile.am: + * gst/videosignal/Makefile.am: + * gst/virtualdub/Makefile.am: + * gst/vmnc/Makefile.am: + * gst/y4m/Makefile.am: + * sys/acmenc/Makefile.am: + * sys/cdrom/Makefile.am: + * sys/dshowdecwrapper/Makefile.am: + * sys/dshowsrcwrapper/Makefile.am: + * sys/dvb/Makefile.am: + * sys/dxr3/Makefile.am: + * sys/fbdev/Makefile.am: + * sys/oss4/Makefile.am: + * sys/qcam/Makefile.am: + * sys/qtwrapper/Makefile.am: + * sys/vcd/Makefile.am: + * sys/wininet/Makefile.am: + * win32/common/config.h: + Don't install static libs for plugins. Fixes #550851 for -bad. + +2008-10-28 18:44:44 +0000 Sebastian Dröge + + [MOVED FROM BAD 45/57] gst/flv/gstflvdemux.c: Implement position query in time format. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_query): + Implement position query in time format. + +2008-10-28 18:41:19 +0000 Sebastian Dröge + + [MOVED FROM BAD 44/57] gst/flv/: Put the GstSegment directly into the instance struct instead of allocating and free'ing it again. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), + (gst_flv_demux_loop), (gst_flv_demux_handle_seek_push), + (gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event), + (gst_flv_demux_dispose), (gst_flv_demux_init): + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video), (gst_flv_parse_tag_timestamp): + Put the GstSegment directly into the instance struct instead of + allocating and free'ing it again. + Push tags already if only one pad was added, no need to wait for + the second one. + When generating our index set has_video and has_audio if we find + video or audio in case the FLV header has incorrect data. + +2008-10-27 09:45:04 +0000 Sebastian Dröge + + [MOVED FROM BAD 43/57] gst/flv/: Don't memcpy() all data we want to push downstream, instead just create subbuffers and push them downstream. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_chain), + (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header), + (gst_flv_demux_create_index): + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_script), + (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), + (gst_flv_parse_tag_timestamp), (gst_flv_parse_tag_type), + (gst_flv_parse_header): + * gst/flv/gstflvparse.h: + Don't memcpy() all data we want to push downstream, instead just + create subbuffers and push them downstream. + Fix some minor memory leaks. + +2008-10-27 09:41:18 +0000 Sebastian Dröge + + [MOVED FROM BAD 42/57] gst/flv/Makefile.am: Fix (non-critical) syntax error and add all required CFLAGS and LIBS. + Original commit message from CVS: + * gst/flv/Makefile.am: + Fix (non-critical) syntax error and add all required CFLAGS and LIBS. + * gst/flv/gstflvparse.c: (FLV_GET_STRING), + (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), + (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), + (gst_flv_parse_tag_timestamp), (gst_flv_parse_tag_type): + Rewrite the script tag parsing to make sure we don't try to read + more data than we have. Also use GST_READ_UINT24_BE directly and + fix some minor memory leaks. + This should make all crashes on fuzzed FLV files disappear. + +2008-10-27 09:37:21 +0000 Sebastian Dröge + + [MOVED FROM BAD 41/57] gst/flv/gstflvparse.c: Properly check everywhere that we have enough data to parse and don't read outside the allocat... + Original commit message from CVS: + * gst/flv/gstflvparse.c: (FLV_GET_STRING), + (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), + (gst_flv_parse_tag_type), (gst_flv_parse_header): + Properly check everywhere that we have enough data to parse and + don't read outside the allocated memory region. + +2008-10-27 09:35:34 +0000 Sebastian Dröge + + [MOVED FROM BAD 40/57] gst/flv/gstflvparse.c: If the caps change during playback and negotiation fails error out instead of trying to continue. + Original commit message from CVS: + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): + If the caps change during playback and negotiation fails error out + instead of trying to continue. + +2008-10-27 09:33:40 +0000 Sebastian Dröge + + [MOVED FROM BAD 39/57] gst/flv/: Add support for Speex audio and allow buffers without valid timestamp in the muxer. + Original commit message from CVS: + * gst/flv/gstflvmux.c: (gst_flv_mux_audio_pad_setcaps), + (gst_flv_mux_request_new_pad), (gst_flv_mux_write_buffer), + (gst_flv_mux_collected): + * gst/flv/gstflvmux.h: + * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate): + Add support for Speex audio and allow buffers without valid + timestamp in the muxer. + +2008-10-27 09:32:03 +0000 Sebastian Dröge + + [MOVED FROM BAD 38/57] gst/flv/gstflvdemux.c: Don't post an error message on the bus if sending EOS downstream didn't work. Fixes bug #550454. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_loop), + (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), + (gst_flv_demux_handle_seek_pull): + Don't post an error message on the bus if sending EOS downstream + didn't work. Fixes bug #550454. + Fix seek event handling to look at the flags of the seek event + instead of assuming some random flags, don't send segment-start + messages when operating in push mode and push seek events upstream + if we couldn't handle them. + +2008-10-27 09:27:18 +0000 Sebastian Dröge + + [MOVED FROM BAD 37/57] gst/flv/gstflvdemux.c: Error out early if pulling a tag failed. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag): + Error out early if pulling a tag failed. + +2008-10-27 09:25:11 +0000 Sebastian Dröge + + [MOVED FROM BAD 36/57] gst/flv/: In pull mode we create our own index before doing anything else and don't use the index provided by some fi... + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_create_index), + (gst_flv_demux_loop): + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_script), + (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), + (gst_flv_parse_tag_timestamp): + * gst/flv/gstflvparse.h: + In pull mode we create our own index before doing anything else + and don't use the index provided by some files (which are more than + often incorrect and cause failed seeks). + For push mode we still use the index provided by the file and extend it + while doing the playback. + +2008-10-27 09:20:01 +0000 Sebastian Dröge + + [MOVED FROM BAD 35/57] gst/flv/gstflvdemux.c: Instead of using gst_pad_event_default() use a small gst_pad_push_event() wrapper that only do... + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_push_src_event), + (gst_flv_demux_loop), (gst_flv_demux_handle_seek_pull), + (gst_flv_demux_sink_event): + Instead of using gst_pad_event_default() use a small + gst_pad_push_event() wrapper that only does what we want and is much + more simple. + +2008-10-27 09:14:45 +0000 Sebastian Dröge + + [MOVED FROM BAD 34/57] gst/flv/gstflvdemux.*: If our index was created by the element and not provided from the outside we should destroy it... + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_change_state), + (gst_flv_demux_set_index), (gst_flv_demux_init): + * gst/flv/gstflvdemux.h: + If our index was created by the element and not provided from the + outside we should destroy it when starting a new stream to get + all old entries removed. + +2008-10-27 09:12:33 +0000 Sebastian Dröge + + [MOVED FROM BAD 33/57] gst/flv/gstflvdemux.c: Improve debugging a bit when pulling a buffer from upstream fails. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_range): + Improve debugging a bit when pulling a buffer from upstream fails. + +2008-10-27 09:10:54 +0000 Sebastian Dröge + + [MOVED FROM BAD 32/57] gst/flv/: Close the currently playing segment from the streaming thread instead of the thread where the seek event is... + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), + (gst_flv_demux_handle_seek_pull), (gst_flv_demux_dispose): + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): + Close the currently playing segment from the streaming thread + instead of the thread where the seek event is handled. + +2008-10-16 15:21:15 +0000 Sebastian Dröge + + [MOVED FROM BAD 31/57] gst/flv/gstflvmux.c: Don't set video_codec to the value that actually should go into audio codec, otherwise we create... + Original commit message from CVS: + * gst/flv/gstflvmux.c: (gst_flv_mux_audio_pad_setcaps), + (gst_flv_mux_write_buffer): + Don't set video_codec to the value that actually should go + into audio codec, otherwise we create invalid files. + Fixes bug #556564. + +2008-10-12 17:08:10 +0000 Sebastian Dröge + + [MOVED FROM BAD 30/57] gst/flv/gstflvdemux.c: Fix regression of handling flow returns in pull mode. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag), + (gst_flv_demux_pull_header): + Fix regression of handling flow returns in pull mode. + Fixes bug #556003. + +2008-10-10 16:33:36 +0000 Sebastian Dröge + + [MOVED FROM BAD 29/57] gst/flv/gstflvparse.c: Use gst_pad_alloc_buffer_and_set_caps() to make sure we get a buffer with caps that we can wor... + Original commit message from CVS: + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): + Use gst_pad_alloc_buffer_and_set_caps() to make sure we get + a buffer with caps that we can work with (i.e. the pad's caps). + Add non-keyframe video frames to the index too but without the + keyframe flag. + Add audio frames to the index only if we have no video stream. + +2008-10-10 16:15:09 +0000 Sebastian Dröge + + [MOVED FROM BAD 28/57] gst/flv/gstflvparse.c: Create pads from the pad templates, use fixed caps on them and only activate them after the ca... + Original commit message from CVS: + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): + Create pads from the pad templates, use fixed caps on them + and only activate them after the caps are set. + +2008-10-09 16:20:26 +0000 Sebastian Dröge + + [MOVED FROM BAD 27/57] gst/flv/: Get an approximate duration of the file by looking at the timestamp of the last tag in pull mode. If we get... + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_loop): + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_timestamp): + * gst/flv/gstflvparse.h: + Get an approximate duration of the file by looking at the timestamp + of the last tag in pull mode. If we get (maybe better) duration from + metadata later we'll use that instead. + +2008-10-09 15:43:02 +0000 Sebastian Dröge + + [MOVED FROM BAD 26/57] gst/flv/gstflvdemux.c: Refactor _pull_range() logic with checks into a seperate function to make things a bit more re... + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_range), + (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header): + Refactor _pull_range() logic with checks into a seperate function + to make things a bit more readable. + +2008-10-09 15:26:56 +0000 Sebastian Dröge + + [MOVED FROM BAD 25/57] gst/flv/gstflvdemux.c: Use gst_element_class_set_details_simple(). + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_chain), + (gst_flv_demux_base_init): + Use gst_element_class_set_details_simple(). + If we get GST_FLOW_NOT_LINKED in the parse loop but at least + one of the pads is linked continue the loop. + +2008-10-09 10:00:51 +0000 Sebastian Dröge + + [MOVED FROM BAD 24/57] gst/flv/gstflvparse.c: Correct caps for video codec id 5: It's On2 VP6 with alpha channel which needs a different dec... + Original commit message from CVS: + * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate), + (gst_flv_parse_tag_audio), (gst_flv_parse_video_negotiate): + Correct caps for video codec id 5: It's On2 VP6 with alpha channel + which needs a different decoder and has different caps. + Add support for audio codec id 14, which is MP3 with 8kHz sampling + rate. + Fix endianness and signedness for raw audio codec ids. + Add support for alaw and mulaw audio. + +2008-10-09 09:48:46 +0000 Sebastian Dröge + + [MOVED FROM BAD 23/57] gst/flv/gstflvdemux.c: Go out of the parse loop as soon as we get an error instead of parsing until the GstAdapter is... + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_chain): + Go out of the parse loop as soon as we get an error instead + of parsing until the GstAdapter is empty. + Add some explanations about the header and tag size. + Don't print synchronizing message if everything is fine. + +2008-10-09 09:26:58 +0000 Sebastian Dröge + + [MOVED FROM BAD 22/57] gst/flv/: Add first version of a FLV muxer. The only missing feature is writing of stream metadata. + Original commit message from CVS: + * gst/flv/Makefile.am: + * gst/flv/gstflvdemux.c: (plugin_init): + * gst/flv/gstflvmux.c: (gst_flv_mux_base_init), + (gst_flv_mux_class_init), (gst_flv_mux_init), + (gst_flv_mux_finalize), (gst_flv_mux_reset), + (gst_flv_mux_handle_src_event), (gst_flv_mux_handle_sink_event), + (gst_flv_mux_video_pad_setcaps), (gst_flv_mux_audio_pad_setcaps), + (gst_flv_mux_request_new_pad), (gst_flv_mux_release_pad), + (gst_flv_mux_write_header), (gst_flv_mux_write_buffer), + (gst_flv_mux_collected), (gst_flv_mux_change_state): + * gst/flv/gstflvmux.h: + Add first version of a FLV muxer. The only missing feature is writing + of stream metadata. + +2008-06-13 22:46:43 +0000 Julien Moutte + + [MOVED FROM BAD 21/57] gst/flv/: Introduce demuxing support for AAC and + Original commit message from CVS: + 2008-06-14 Julien Moutte + * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), + (gst_flv_demux_dispose): + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate), + (gst_flv_parse_tag_audio), (gst_flv_parse_video_negotiate), + (gst_flv_parse_tag_video): Introduce demuxing support for AAC + and + H.264/AVC inside FLV. + * sys/dshowdecwrapper/gstdshowaudiodec.c: + (gst_dshowaudiodec_init), + (gst_dshowaudiodec_chain), (gst_dshowaudiodec_push_buffer), + (gst_dshowaudiodec_sink_event), (gst_dshowaudiodec_setup_graph): + * sys/dshowdecwrapper/gstdshowaudiodec.h: + * sys/dshowdecwrapper/gstdshowvideodec.c: + (gst_dshowvideodec_init), + (gst_dshowvideodec_sink_event), (gst_dshowvideodec_chain), + (gst_dshowvideodec_push_buffer), + (gst_dshowvideodec_src_getcaps): + * sys/dshowdecwrapper/gstdshowvideodec.h: Lot of random fixes + to improve stability (ref counting, safety checks...) + +2008-04-25 08:07:36 +0000 Wim Taymans + + [MOVED FROM BAD 20/57] gst/flv/gstflvdemux.c: Forward unknown queries upstream instead of returning FALSE on them. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_query): + Forward unknown queries upstream instead of returning FALSE on them. + +2008-04-11 23:19:21 +0000 Tim-Philipp Müller + + [MOVED FROM BAD 19/57] gst/flv/gstflvparse.c: Handle NULL returns from FLV_GET_STRING() more gracefully. Fixes crash caused by a strlen on a... + Original commit message from CVS: + * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), + (gst_flv_parse_tag_script): + Handle NULL returns from FLV_GET_STRING() more gracefully. Fixes + crash caused by a strlen on a NULL string (#527622). + +2007-12-11 11:54:43 +0000 Tim-Philipp Müller + + [MOVED FROM BAD 18/57] gst/flv/gstflvparse.c: Don't strdup (and thus leak) codec name strings when passing them to gst_tag_list_add(). + Original commit message from CVS: + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): + Don't strdup (and thus leak) codec name strings when passing + them to gst_tag_list_add(). + +2007-12-09 19:37:53 +0000 Edward Hervey + + [MOVED FROM BAD 17/57] gst/flv/gstflvparse.c: Fix list of supported and known codecs. + Original commit message from CVS: + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): + Fix list of supported and known codecs. + Emit tag with the codec name so it gets properly reported in totem and + other applications. + +2007-11-25 10:45:09 +0000 Edward Hervey + + [MOVED FROM BAD 16/57] gst/flv/gstflvparse.c: Output segment with proper 'stop' value, makes flvdemux 100% compatible with gnonlin. + Original commit message from CVS: + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): + Output segment with proper 'stop' value, makes flvdemux 100% compatible + with gnonlin. + +2007-11-12 19:22:24 +0000 Edward Hervey + + [MOVED FROM BAD 15/57] gst/flv/gstflvparse.c: Add mapping for Nellymoser ASAO audio codec. + Original commit message from CVS: + * gst/flv/gstflvparse.c: + Add mapping for Nellymoser ASAO audio codec. + (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Make sure we + actually have data to read at the end of the tag. This avoids trying + to allocate negative buffers. + +2007-10-22 15:45:49 +0000 Julien Moutte + + [MOVED FROM BAD 14/57] gst/flv/gstflvparse.c: Don't emit no-more-pads for single pad scenarios as the header is definitely not reliable. We ... + Original commit message from CVS: + 2007-10-22 Julien MOUTTE + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video), (gst_flv_parse_tag_type): Don't + emit no-more-pads for single pad scenarios as the header + is definitely not reliable. We emit them for 2 pads scenarios + though to speed up media discovery. + +2007-09-27 10:06:23 +0000 Julien Moutte + + [MOVED FROM BAD 13/57] gst/flv/gstflvparse.c: I got it wrong again, audio rate was not detected correctly in all cases. + Original commit message from CVS: + 2007-09-27 Julien MOUTTE + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): I got it wrong again, audio rate + was not detected correctly in all cases. + +2007-09-26 16:30:50 +0000 Julien Moutte + + [MOVED FROM BAD 12/57] gst/flv/gstflvparse.c: codec_data is needed for every tag not just the first one. (Fix a stupid bug i introduced with... + Original commit message from CVS: + 2007-09-26 Julien MOUTTE + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): codec_data is needed for every tag + not just the first one. (Fix a stupid bug i introduced without + testing) + +2007-09-26 11:17:08 +0000 Julien Moutte + + [MOVED FROM BAD 11/57] gst/flv/gstflvparse.c: Fix bit masks operations to be sure we detect the codec_tags and sample rates correctly. + Original commit message from CVS: + 2007-09-26 Julien MOUTTE + * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): Fix bit masks operations to be + sure we detect the codec_tags and sample rates correctly. + Fix raw audio caps generation. + +2007-09-12 08:38:22 +0000 Peter Kjellerstedt + + [MOVED FROM BAD 10/57] gst/: Printf format fixes (#476128). + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst-libs/gst/app/gstappsink.c: + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvparse.c: + * gst/interleave/deinterleave.c: + * gst/switch/gstswitch.c: + Printf format fixes (#476128). + +2007-08-27 14:56:05 +0000 Julien Moutte + + [MOVED FROM BAD 09/57] gst/flv/gstflvdemux.c: Make sure we initialize the seek result. + Original commit message from CVS: + 2007-08-27 Julien MOUTTE + * gst/flv/gstflvdemux.c: (gst_flv_demux_handle_seek_pull): + Make sure we initialize the seek result. + +2007-08-24 17:03:15 +0000 Julien Moutte + + [MOVED FROM BAD 08/57] gst/flv/gstflvdemux.c: Remove some useless ifdef. + Original commit message from CVS: + 2007-08-24 Julien MOUTTE + * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), + (gst_flv_demux_chain), (gst_flv_demux_pull_tag), + (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), + (gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event), + (gst_flv_demux_src_event): Remove some useless ifdef. + +2007-08-24 15:31:26 +0000 Julien Moutte + + [MOVED FROM BAD 07/57] gst/flv/gstflvdemux.c: Implement seeking in push mode. + Original commit message from CVS: + 2007-08-24 Julien MOUTTE + * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), + (gst_flv_demux_cleanup), (gst_flv_demux_chain), + (gst_flv_demux_pull_tag), (gst_flv_demux_find_offset), + (gst_flv_demux_handle_seek_push), + (gst_flv_demux_handle_seek_pull), + (gst_flv_demux_sink_event), (gst_flv_demux_src_event): Implement + seeking in push mode. + * gst/flv/gstflvdemux.h: + +2007-08-22 14:50:51 +0000 Julien Moutte + + [MOVED FROM BAD 06/57] gst/flv/: Handle pixel aspect ratio through metadata tags like ASF does. Fluendo muxer supports this and + Original commit message from CVS: + 2007-08-22 Julien MOUTTE + * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), + (gst_flv_demux_pull_tag): + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), + (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): Handle pixel aspect ratio through + metadata tags like ASF does. Fluendo muxer supports this and + Flash players can support it as well this way. + +2007-08-22 14:03:42 +0000 Julien Moutte + + [MOVED FROM BAD 05/57] gst/flv/: Make sure we don't try filling up the index if no times object was parsed. Fix the way we decide to push ta... + Original commit message from CVS: + 2007-08-22 Julien MOUTTE + * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag): + * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), + (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): Make sure we don't try filling up the + index if no times object was parsed. Fix the way we decide to + push + tags and emit no-more-pads. Fix some printf typing in debugging. + +2007-08-14 14:56:20 +0000 Wim Taymans + + [MOVED FROM BAD 04/57] gst/flv/gstflvdemux.c: Fix locking and refcounting on the index. + Original commit message from CVS: + * gst/flv/gstflvdemux.c: (gst_flv_demux_set_index), + (gst_flv_demux_get_index): + Fix locking and refcounting on the index. + +2007-08-14 14:22:09 +0000 Julien Moutte + + [MOVED FROM BAD 03/57] gst/flv/gstflvdemux.c: First method for seeking in pull mode using the index built step by step or coming from metadata. + Original commit message from CVS: + 2007-08-14 Julien MOUTTE + * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), + (gst_flv_demux_adapter_flush), (gst_flv_demux_chain), + (gst_flv_demux_pull_tag), (gst_flv_demux_do_seek), + (gst_flv_demux_handle_seek), (gst_flv_demux_sink_event), + (gst_flv_demux_src_event), (gst_flv_demux_query), + (gst_flv_demux_change_state), (gst_flv_demux_set_index), + (gst_flv_demux_get_index), (gst_flv_demux_dispose), + (gst_flv_demux_class_init): First method for seeking in pull + mode using the index built step by step or coming from metadata. + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: (FLV_GET_STRING), + (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), + (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Parse + more metadata types and keyframes index. + +2007-07-25 13:29:04 +0000 Julien Moutte + + [MOVED FROM BAD 02/57] gst/flv/: Handle not linked pads, try to make it reusable, more safety checks. + Original commit message from CVS: + 2007-07-25 Julien MOUTTE + (gst_flv_demux_chain), (gst_flv_demux_pull_tag), + (gst_flv_demux_change_state), (gst_flv_demux_dispose), + (gst_flv_demux_init): + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: (FLV_GET_STRING), + (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), + (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), + (gst_flv_parse_header): + * gst/flv/gstflvparse.h: Handle not linked pads, try to make it + reusable, more safety checks. + +2007-07-19 15:05:30 +0000 Julien Moutte + + [MOVED FROM BAD 01/57] Adds a first draft of an FLV demuxer. + Original commit message from CVS: + 2007-07-19 Julien MOUTTE + * configure.ac: + * gst/flv/Makefile.am: + * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), + (gst_flv_demux_cleanup), (gst_flv_demux_chain), + (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header), + (gst_flv_demux_seek_to_prev_keyframe), (gst_flv_demux_loop), + (gst_flv_demux_sink_activate), + (gst_flv_demux_sink_activate_push), + (gst_flv_demux_sink_activate_pull), (gst_flv_demux_sink_event), + (gst_flv_demux_change_state), (gst_flv_demux_dispose), + (gst_flv_demux_base_init), (gst_flv_demux_class_init), + (gst_flv_demux_init), (plugin_init): + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: (FLV_GET_BEUI24), (FLV_GET_STRING), + (gst_flv_demux_query_types), (gst_flv_demux_query), + (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), + (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), + (gst_flv_parse_tag_type), (gst_flv_parse_header): + * gst/flv/gstflvparse.h: Adds a first draft of an FLV demuxer. + It does not do seeking yet, it supports pull and push mode so + YES + you can use it to play youtube videos directly from an HTTP uri. + Not so much testing done yet but it parses metadata, reply to + duration queries, etc... + +2009-05-12 13:00:46 +0200 Sebastian Dröge + + * gst/rtp/Makefile.am: + rtp: Link to -lm + Fixes bug #582281. + +2009-05-12 11:16:48 +0200 Sebastian Dröge + + * tests/check/elements/rganalysis.c: + rganalysis: Remove invalid unit test + The test creates buffers with non-silence, sets the GAP + flag on it and expects rganalysis to ignore the content and assume silence. + That's not the way how GAP buffers should be used, if the GAP flag is set + elements *can* assume that they only contain silence but they're not *required* + to assume that. The GAP flag must only be set on silence buffers. + Fixes bug #582252. + +2009-05-12 00:48:49 +0100 Jan Schmidt + + * ChangeLog: + * configure.ac: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.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/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + * win32/common/config.h: + 0.10.14.2 pre-release + +2009-05-11 23:13:20 +0100 Jan Schmidt + + * tests/files/Makefile.am: + checks: dist id3-577468-unsynced-tag.tag test file + +2009-05-11 21:02:27 +0200 Tristan Matthews + + * gst/avi/gstavidemux.c: + avidemux: initialize variable to 0 + Fixes #582218. + +2009-05-11 18:21:13 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Only search for the index entry once + +2009-05-11 18:18:36 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Use the first index entry if it's after the seek position + +2009-05-11 18:15:22 +0200 Sebastian Dröge + + * gst/avi/gstavidemux.c: + avidemux: Use the first entry for a given stream if the first entry is after the seek position + +2009-05-11 16:50:48 +0200 Sebastian Dröge + + * gst/avi/gstavidemux.c: + avidemux: Use binary search for finding the requested index entry when seeking + +2009-05-11 15:36:46 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + matroskademux: Improve/optimize seeking + First of all a keyframe seek should be done to the + keyframe right before the requested position and not + to the keyframe that is nearest to the requested position. + Use per track index arrays and use our new binary search function + from core to speed up the search. + +2009-05-11 15:36:36 +0200 Sebastian Dröge + + * configure.ac: + Require released versions of core/base + +2009-05-11 10:15:00 +0200 Sebastian Dröge + + * tests/check/Makefile.am: + gdkpixbuf: Use the libs and cflags of gdk pixbuf instead of gtk + This fixes the build if gdk-pixbuf is found but gtk isn't + +2009-05-11 09:58:48 +0200 Sebastian Dröge + + * configure.ac: + Always define the conditional HAVE_GTK to fix configure in some cases + +2009-05-10 11:17:23 +0200 Marc-Andre Lureau + + * autogen.sh: + Run libtoolize before aclocal + This unbreaks the build in some cases. Fixes bug #582021 + +2009-05-09 10:50:45 -0700 David Schleef + + * gst/matroska/matroska-demux.c: + matroska: fix printf format to agree with argument + +2009-05-08 19:42:10 +0100 Tim-Philipp Müller + + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + raw1394: include stdlib.h for strtol() + Fixes compiler warning when compiling with xml stuff in core disabled. + +2009-05-08 16:40:57 +0200 Edward Hervey + + * ext/flac/gstflacdec.c: + flacdec: Actually output the pending buffer.. and not a blank one. + It was previously sending the bogus buffer which was returned from + the bufferalloc (required for reverse negotiation apparently) instead + of the pending buffer. + +2009-05-08 12:00:57 +0200 Sebastian Dröge + + * ext/soup/gstsouphttpsrc.c: + souphttpsrc: Allow non-string fields in the extra-headers property + +2009-05-08 11:35:02 +0200 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpj2kdepay.c: + * gst/rtp/gstrtpj2kdepay.h: + rtj2kdepay: add basic JPEG 2000 depayloader + +2009-05-08 11:31:02 +0200 Wim Taymans + + * gst/rtp/gstrtpj2kpay.c: + rtpj2kpay: set marker bit correctly + +2009-05-08 11:29:04 +0200 Sebastian Dröge + + * ext/soup/gstsouphttpsrc.c: + * ext/soup/gstsouphttpsrc.h: + souphttpsrc: Add support for extra-headers appended to the HTTP request + This allows to set the Referer header among other things by + adding a "extra-headers" property that takes a GstStructure + with field=string pairs. + Fixes bug #581806. + +2009-05-08 10:38:42 +0200 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpj2kpay.c: + * gst/rtp/gstrtpj2kpay.h: + rtpj2kpay: add a simple JPEG 2000 payloader + +2009-05-08 10:31:12 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: we only need to swap bits on LE + +2009-05-07 18:10:08 +0100 Christian Schaller + + * ext/flac/gstflac.c: + * ext/jpeg/gstjpeg.c: + * ext/libpng/gstpng.c: + * ext/speex/gstspeex.c: + * gst/avi/gstavi.c: + * gst/matroska/matroska-mux.c: + Add RANKS for various encoders and muxers + +2009-05-07 17:09:44 +0200 Wim Taymans + + * gst/matroska/matroska-demux.c: + matroskademux: add some debugging + +2009-05-07 15:58:43 +0200 Wim Taymans + + * gst/matroska/matroska-demux.c: + matroskademux: parse xiph headers length correctly + See #580980 + +2009-05-07 16:25:41 +0200 Gabriel Bouvigne + + * gst/replaygain/gstrganalysis.c: + * gst/replaygain/gstrganalysis.h: + * gst/replaygain/rganalysis.c: + * gst/replaygain/rganalysis.h: + rganalysis: Add ability to post level messages + Fixes bug #581568. + +2009-05-06 23:56:44 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: refuse some unsupported jpeg formats + +2009-05-06 18:06:49 +0200 Wim Taymans + + * gst/rtp/gstrtptheorapay.c: + rtptheorapay: fix description + +2009-05-06 16:09:13 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: rewrite quant table handling + Rewrite the quant table parsing to also handle multiple tables in one JPEG HDQ + segment. + Handle more jpeg types by keeping track of the tables used per component and + putting the used ones in the quant headers. + +2009-04-18 17:23:51 +0100 Jan Schmidt + + * tests/check/elements/id3v2mux.c: + id3v2mux: Make the test failure slightly more informative + +2009-04-20 18:33:09 +0100 Jan Schmidt + + * ext/flac/gstflacdec.c: + flac: Make buffers created during seek act like normal buffers. + Store the offset and caps when allocating a buffer during seeking, and then + allocate a new buffer with buffer_alloc before we push it out. This ensures + that in all respects the first buffer decoded during seeking behaves like + all other buffers, including allowing downstream re-negotiation. + +2009-04-18 18:00:54 +0200 Thomas Vander Stichele + + * ext/flac/gstflacdec.c: + flacdec: don't use pad_alloc when decoding while seeking. Fixes #579422 + +2009-05-06 13:22:51 +0200 Arnout Vandecappelle + + * ext/jpeg/gstjpegdec.c: + jpegdec: refactored gst_jpeg_dec_parse_image_data + Fixes #579808 + +2009-05-06 13:11:53 +0200 Arnout Vandecappelle + + * ext/jpeg/gstjpegdec.c: + jpegdec: support additional 0xff before end marker. + JPEG markers may be preceded by additional 0xff. jpegdec should + skip over these, even before the end marker. + See #579808 + +2009-05-06 12:54:22 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegpay.c: + rtpjpegpay: handle input with 1 quant table + Also handle input with just one quant table, simply duplicate the quant table. + Handle invalid SOF correctly and some small cleanups. + Fixes #578257 + +2009-04-29 15:58:10 +0300 Marco Ballesio + + * gst/qtdemux/qtdemux.c: + qtdemux: fix byte order swapping in 3GPP classification entity tag + Fixes #580746. + +2009-05-05 17:07:13 +0200 Arnout Vandecappelle + + * gst/multipart/multipartdemux.c: + multipartdemux: avoid reading from inavlid memory + Read the timestamp of the incomming buffer before we push it in the adapter and + flush it out again as the buffer might be unreffed then and we read from invalid + memory. + Fixes #581444. + +2009-05-05 17:03:29 +0200 Arnout Vandecappelle + + * gst/multipart/multipartdemux.c: + multipartdemux: don't leak dynamic pads + Free the dynamic pads data in finalize. + Fixes #581432 + +2009-05-05 16:32:17 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegpay.c: + * gst/rtp/gstrtpjpegpay.h: + rtpjpegpay: correctly set the type header + Don't require width/height on the caps. Use the SOF header to find width/height + and fall back to the caps if there is no SOF. Also use the SOF info to find the + subsampling and quantization tables used. This allows us to set the right type + value in the JPEG rtp header. + Deprecate the quality property, it's unused now and it was used wrongly before. + Always send full quant tables for now until we have some code to detect default + ones. + Fixes #580880 + +2009-05-05 16:28:44 +0200 Wim Taymans + + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpjpegdepay.h: + rtpjpegdepay: use width/height from payload + Use the width and the height from the payload headers and set them on the + output caps for added awesomeness. + Fix quant parsing, we need to check the type in the lower 6 bits. + Add first bits of caching quantization tables. + +2009-05-05 16:24:16 +0200 Wim Taymans + + * ext/jpeg/gstjpegenc.c: + jpegenc: set colorspace before _set_defaults() + The libjpeg api says that we need to set the colorspace before we call + _set_defaults(). Indeed, if we don't do that we end up with some very freaky + non-standard quant table and huffman table indexes. + +2009-05-05 13:19:19 +0100 Tim-Philipp Müller + + * tests/Makefile.am: + tests: don't build examples if --disable-examples was passed to configure + +2009-05-05 12:33:57 +0100 Tim-Philipp Müller + + * configure.ac: + configure: clean up mess around gtk+ checking + And don't check for gtk+ when it's not needed (ie. if examples are disabled) + +2009-05-05 12:27:21 +0100 Tim-Philipp Müller + + * configure.ac: + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/pixbufscale.h: + configure: make gdk-pixbuf plugin depend only on gdk-pixbuf, not gtk+ + +2009-05-04 18:55:12 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Fix find_stream_by_* functions + Fix various version of find_stream_by_* by not trying to convert an int to a + pointer and vice versa, for portability reasons. + Fixes #581333 + +2009-05-04 18:32:05 +0200 Chris Winter + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix dummy nat packet logic + Fix a typo in the dummy NAT packet sending code. + Fixes #581329 + +2009-04-30 10:24:27 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: avoid errors after server eof + Server eof (e.g. connection closed) is announced as connection closed, + so better record state and act accordingly to prevent (read/write) + errors during subsequent teardown/cleanup sequences. #Fixes 580851.(c). + +2009-04-30 10:19:27 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: also set base_time on src after flush + timestamps following flush/seek should be consistent between + UDP and TCP interleaved case. Fixes #580851.(b). + +2009-04-30 10:17:23 +0200 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: sanity checks on range info + A max range that overflows should not be trusted, + nor should a max range that equals the min range. + Fixes #580851.(a). + +2009-05-04 16:16:54 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: use SKIP flag to use SCALE headers + We can use the SKIP seek flag to instruct the server to send data faster then + normal but with the same bandwidth. + Fixes #537609 + +2009-05-04 14:19:22 +0200 Alessandro Decina + + * ext/speex/gstspeexdec.c: + speexdec: make speex_dec_convert work with same-format values when no data has been decoded. + +2009-05-04 12:43:42 +0200 Sebastian Dröge + + * ext/flac/gstflacenc.c: + flac: Implement preset interface + +2009-05-04 12:41:56 +0200 Sebastian Dröge + + * ext/speex/gstspeexenc.c: + speex: Implement preset interface + +2009-05-04 12:40:12 +0200 Sebastian Dröge + + * ext/wavpack/gstwavpackenc.c: + wavpack: Implement preset interface + +2009-05-04 12:35:19 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: use binary search for index + Use the new binary search method for finding the right index entry faster. + +2009-05-04 11:26:56 +0200 Wim Taymans + + * gst/videobox/gstvideobox.c: + videobox: draw the complete U and V planes + Round up the scaled U and V width and height so that we always draw the correct + amount of pixels to fill the complete image. + Fixes #569611 + +2009-05-01 19:35:11 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: add some more micro optimisations + +2009-04-30 18:41:44 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_dump.c: + * gst/qtdemux/qtdemux_types.c: + qtdemux: micro optimize qtdemux a little + Sprinkle some G_LIKELY around. + Avoid traversing and dumping the tree when debugging is not activated. + +2009-04-30 14:22:27 +0200 Wim Taymans + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: add support for subtitle pictures + Add support for subtitle pictures. + Fixes #568278. + +2009-04-30 10:32:39 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: make sure we always signal waiters + Always signal the waiters in the async callbacks. Especially for the volume + callbacks since this might cause deadlocks. + +2009-04-29 18:09:07 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: release state lock before stopping task + We need to release the state lock before trying to wait for the task to end + because the task might also take the lock. + Fixes #577671 + +2009-04-29 12:19:27 +0200 Hans de Goede + + * gst/qtdemux/qtdemux.c: + qtdemux: handle ac-3 audio + fix demuxing of m4v streams with ac-3 audio + Fixes #580554 + +2009-04-29 11:12:36 +0200 Sebastian Dröge + + * ext/flac/gstflacenc.c: + flacenc: Use the tag merge mode that was set on the interface for merging tag events + +2009-04-25 09:43:38 +0200 Wim Taymans + + * gst/udp/gstudpsrc.c: + udpsrc: fix getaddrinfo error reporting + getaddrinfo errors should be reported with gai_strerror instead of errno as + spotted by MikeS. + +2009-04-27 10:08:39 +0200 Wim Taymans + + * gst/rtp/gstrtpg726pay.c: + g726pay: fix compilation + +2009-04-27 10:02:06 +0200 Wim Taymans + + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpg726pay.h: + g726pay: add RFC compliant packetizing + Shuffle the input bits according to RFC 3551 for G726 payloads. + Add option to force the previous behaviour. + Fixes #567140 + +2009-04-27 09:59:54 +0200 Wim Taymans + + * gst/rtp/gstrtpg726depay.c: + g726depay: add debug category + Add a debugging category, add some comments and remove _peek_parent(). + +2009-04-26 15:59:50 +0100 Tim-Philipp Müller + + * configure.ac: + id3v2mux: we need taglib 1.5 for ID3v2::RelativeVolumeFrame::setIdentification + Bump taglib requirement. + +2009-04-24 02:11:28 +0100 Tim-Philipp Müller + + * tests/check/elements/id3demux.c: + * tests/files/id3-577468-unsynced-tag.tag: + id3demux: add unit test file for unsynced id3 tags + +2009-04-24 01:51:35 +0100 Tim-Philipp Müller + + * gst/id3demux/id3tags.c: + id3demux: parse unsynchronised tags properly + We didn't handle unsynchronization at all up to now, which might have + caused frames to not be extracted - esp. frames after an APIC picture + frame. Fixes #577468. + +2009-04-24 01:01:53 +0100 Tim-Philipp Müller + + * gst/id3demux/id3tags.c: + id3demux: pass the right size value for size of all frames to the parser + Frame data size is tag size adjusted for size of the tag header and + footer, not tag size including header and footer. + +2009-04-22 15:24:55 +0200 Patrick Radizi + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix some more pad leaks + Fix some pad leaks. + See #577318. + +2009-04-21 22:12:45 +0100 Jan Schmidt + + * common: + Automatic update of common submodule + From b3941ea to 6ab11d1 + +2009-04-21 14:02:01 -0700 Michael Smith + + * gst/qtdemux/qtdemux.c: + qtdemux: override caps based on data from ESDS atoms in mpeg4. + If the codec is actually something else (e.g. mjpeg) change the caps to + match when parsing the ESDS atom. + Also, for AAC, override rate and channels with correct values read from + ESDS, since the rate/channels values elsewhere are often wrong. + +2009-04-20 19:32:00 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + jpegdec: fix warning for still images by not trying to divide by 0 + Don't pass a 0 divisor to gst_util_uint64_scale(), or it will complain + in the single image case where fps=0/1 (are we supposed to differentiate + between no fps=still image and fps=0/1=variable rate here btw?) + +2009-04-20 17:25:34 +0100 Jan Schmidt + + * gst/udp/gstudpnetutils.c: + udp: Fix a simple typo in the previous commit + Use #ifdef instead of #if, to fix the build + +2009-04-20 15:48:21 +0200 Andy Wingo + + fix format string in pngdec + * ext/libpng/gstpngdec.c: Fix size_t vs unsigned int format in error message. + +2009-04-20 15:46:03 +0200 Andy Wingo + + only use struct ip_mreqn if it is detected + * configure.ac: Make an explicit check for struct ip_mreqn. + * gst/udp/gstudpnetutils.c: Use HAVE_IP_MREQN instead of the ad-hoc checks. + +2009-04-20 13:45:32 +0200 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + Fix push mode buffering sanity check to actually fit the description. + +2009-04-18 19:11:06 +0200 Edward Hervey + + * gst/rtp/gstrtph263pay.c: + rtph263pay: And let's not forget to remove the unused variable. + +2009-04-18 18:50:32 +0200 Edward Hervey + + * gst/rtp/gstrtph263pay.c: + rtph263pay: Remove dead assignments, the variables are never read after. + +2009-04-18 18:49:49 +0200 Edward Hervey + + * gst/rtp/gstrtpmp4vpay.c: + rtpmp4vpay: Remove dead assignment. The value is never read after. + +2009-04-18 18:48:55 +0200 Edward Hervey + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Remove dead assignment. + t is being overwritten after, before it's used. + +2009-04-18 18:48:06 +0200 Edward Hervey + + * gst/rtp/gstrtpamrdepay.c: + rtpamrdepay: Remove unneeded variable, the value is only read once. + +2009-04-18 18:47:05 +0200 Edward Hervey + + * gst/rtp/gstrtpamrpay.c: + rtpamrpay: Remove unneeded variable, the value is only read once. + +2009-04-18 18:46:12 +0200 Edward Hervey + + * gst/goom/filters.c: + goom/filters: Remove dead assignment. Value overwritten just after. + +2009-04-18 18:45:32 +0200 Edward Hervey + + * gst/rtp/gstrtpvorbispay.c: + rtpvorbispay: Remove dead assignment. Value never read after. + +2009-04-18 18:45:07 +0200 Edward Hervey + + * gst/rtp/gstrtptheorapay.c: + rtptheorapay: Remove dead assignment. Value never read after. + +2009-04-18 18:43:31 +0200 Edward Hervey + + * gst/rtp/gstrtptheoradepay.c: + rtptheoradepay: Remove unused variable, it's never being read. + +2009-04-18 18:42:45 +0200 Edward Hervey + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Remove dead assignment. 'res' isn't read after. + +2009-04-18 18:41:58 +0200 Edward Hervey + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Remove unused variable. 'res' is never read. + +2009-04-18 18:40:48 +0200 Edward Hervey + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: Remove dead variable. 'stream' is never read after. + +2009-04-18 18:39:48 +0200 Edward Hervey + + * gst/videobox/gstvideobox.c: + videbox: Remove dead assignments. + These variables are never read after this point. + +2009-04-18 18:38:29 +0200 Edward Hervey + + * gst/goom/convolve_fx.c: + goom: ff and iff are only used in a '#ifdef DRAW_MOTIF' block. + +2009-04-18 18:34:11 +0200 Edward Hervey + + * gst/wavparse/gstwavparse.c: + wavparse: Remove dead assignment. + res isn't read after this. + +2009-04-18 18:32:03 +0200 Edward Hervey + + * gst/wavparse/gstwavparse.c: + wavparse: Remove dead assignments, move variable to where it's needed. + The header_read_error label will return GST_FLOW_ERROR + +2009-04-18 18:21:22 +0200 Edward Hervey + + * gst/rtp/gstrtpvrawdepay.c: + rtpvrawdepay: Remove dead assignment. + The value of 'str' will never be used in these cases. + +2009-04-18 18:19:12 +0200 Edward Hervey + + * gst/matroska/matroska-demux.c: + matroskademux: Remove useless variable. + iret was never read outside of that loop, and is always being exited if + iret was != GST_FLOW_OK anyway. + +2009-04-18 18:17:35 +0200 Edward Hervey + + * gst/avi/gstavidemux.c: + avidemux: Move 'res' to where it's actually being used. + res was never used outside of that block except for a dead assignment. + +2009-04-18 18:16:33 +0200 Edward Hervey + + * gst/audiofx/audiochebband.c: + * gst/audiofx/audiocheblimit.c: + audiofx: Remove unused variable. + rz is never used in these methods. + +2009-04-18 18:15:39 +0200 Edward Hervey + + * sys/osxaudio/gstosxringbuffer.c: + osxringbuffer: Run gst-indent. + +2009-04-18 18:14:49 +0200 Edward Hervey + + * sys/ximage/gstximagesrc.c: + ximage: Remove dead assignments. + Those variables are not read after that point. + +2009-04-18 18:11:00 +0200 Edward Hervey + + * ext/dv/gstdvdemux.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/libcaca/gstcacasink.c: + * ext/libpng/gstpngdec.c: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + * ext/speex/gstspeexenc.c: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalphacolor.c: + * gst/apetag/gstapedemux.c: + * gst/auparse/gstauparse.c: + * gst/effectv/gstquark.c: + * gst/flx/gstflxdec.c: + * gst/icydemux/gsticydemux.c: + * gst/interleave/interleave.c: + * gst/matroska/matroska-mux.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/qtdemux/gstrtpxqtdepay.c: + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpdvpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp2tpay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtpmpvpay.c: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvrawdepay.c: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtspsrc.c: + * gst/smpte/gstsmptealpha.c: + * gst/smpte/paint.c: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstmultiudpsink.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videomixer/videomixer.c: + * gst/wavparse/gstwavparse.c: + * sys/ximage/gstximagesrc.c: + Remove trivial unused variables detected by CLang static analyzer. + +2009-04-18 17:52:00 +0200 Edward Hervey + + * ext/gconf/gstswitchsink.c: + * gst/qtdemux/gstrtpxqtdepay.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtpjpegdepay.c: + * gst/rtp/gstrtpmp1sdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtpvrawpay.c: + Remove blank {set|get}_property/change_state/finalize methods. + +2009-04-18 17:42:55 +0200 Edward Hervey + + * ext/cairo/gsttimeoverlay.c: + * ext/esd/esdsink.c: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/pulse/pulsesink.c: + * gst/alpha/gstalphacolor.c: + * gst/cutter/gstcutter.c: + * gst/debugutils/efence.c: + * gst/debugutils/gstnavigationtest.c: + * gst/debugutils/gsttaginject.c: + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdvdepay.c: + * gst/rtp/gstrtpdvpay.c: + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpmp2tpay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmpvpay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpsirendepay.c: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbispay.c: + * gst/rtp/gstrtpvrawdepay.c: + * gst/smpte/gstsmptealpha.c: + * gst/udp/gstudpsink.c: + * gst/videofilter/gstvideobalance.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + Remove unused variables in _class_init + Detected by LLVM's CLang static analyzer + +2009-04-18 13:54:08 +0100 Jan Schmidt + + * tests/check/elements/souphttpsrc.c: + check: Check whether threads are already initialised before g_thread_init() + +2009-04-18 14:32:40 +0200 Josep Torra + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: mark discont on the streams as was said the debug line + After a seek mark all streams with discont as it was said in the debug line. + Fixes that buffers after a seek are generated without a valid timestamp. + +2009-04-18 08:45:18 +0200 Josep Torra + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: map GST_RTSP_EEOF to EOS on server requests + Permit properly handle the EOS condition when server report it in a request. + +2009-04-18 08:39:57 +0200 Edward Hervey + + * gst/rtp/gstrtptheoradepay.c: + rtptheoradepay: Fix build on macosx. + Use G_GSIZE_FORMAT instead of u. + +2009-04-16 22:50:59 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: fix sample offset calculation again + +2009-04-15 19:32:18 +0100 Tim-Philipp Müller + + * sys/sunaudio/gstsunaudiomixerctrl.c: + sunaudio: fix broken indentation of variable declarations + +2009-04-15 19:28:53 +0100 James Andrewartha + + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiosink.c: + sunaudio: remove some unused variables and goto labels + Fixes #579070. + +2009-04-15 19:24:49 +0200 James Andrewartha + + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pay.h: + rtph263pay: fix compilation on big-endian + Some semicolons were missing from the big-endian structs in gstrtph263pay.h. + A GST_DEBUG call was missing a format specifier. + Fixes #579069 + +2009-04-15 20:10:04 +0300 Marco Ballesio + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + * gst/qtdemux/quicktime.c: + qtdemux: implement 3GPP (TS 26.244 V8.0.0) Asset metadata handling, Fixes #132193 + Implements 3gpp iso metadata tags which are different from mov udta atoms. + +2009-04-15 15:51:24 +0200 Peter Kjellerstedt + + * gst/debugutils/efence.h: + debugutils: Use G_BEGIN_DECLS/G_END_DECLS. + Use G_BEGIN_DECLS/G_END_DECLS to avoid gst-indent messing up the + indentation due to extern "C" { }. + +2009-04-15 16:03:27 +0300 Stefan Kost + + * configure.ac: + * docs/plugins/Makefile.am: + * gst/debug/Makefile.am: + * gst/debug/breakmydata.c: + * gst/debug/debug.vcproj: + * gst/debug/efence.c: + * gst/debug/efence.h: + * gst/debug/efence.vcproj: + * gst/debug/gstdebug.c: + * gst/debug/gstnavigationtest.c: + * gst/debug/gstnavigationtest.h: + * gst/debug/gstnavseek.c: + * gst/debug/gstnavseek.h: + * gst/debug/gstpushfilesrc.c: + * gst/debug/gstpushfilesrc.h: + * gst/debug/gsttaginject.c: + * gst/debug/gsttaginject.h: + * gst/debug/navigationtest.vcproj: + * gst/debug/negotiation.c: + * gst/debug/progressreport.c: + * gst/debug/progressreport.h: + * gst/debug/rndbuffersize.c: + * gst/debug/testplugin.c: + * gst/debug/tests.c: + * gst/debug/tests.h: + * gst/debugutils/Makefile.am: + * gst/debugutils/breakmydata.c: + * gst/debugutils/debug.vcproj: + * gst/debugutils/efence.c: + * gst/debugutils/efence.h: + * gst/debugutils/efence.vcproj: + * gst/debugutils/gstdebug.c: + * gst/debugutils/gstnavigationtest.c: + * gst/debugutils/gstnavigationtest.h: + * gst/debugutils/gstnavseek.c: + * gst/debugutils/gstnavseek.h: + * gst/debugutils/gstpushfilesrc.c: + * gst/debugutils/gstpushfilesrc.h: + * gst/debugutils/gsttaginject.c: + * gst/debugutils/gsttaginject.h: + * gst/debugutils/navigationtest.vcproj: + * gst/debugutils/negotiation.c: + * gst/debugutils/progressreport.c: + * gst/debugutils/progressreport.h: + * gst/debugutils/rndbuffersize.c: + * gst/debugutils/testplugin.c: + * gst/debugutils/tests.c: + * gst/debugutils/tests.h: + debug: rename debug to debugutils to avoid clash with --disable-debug. Fixes #562168 + +2009-04-15 15:43:04 +0300 Stefan Kost + + * gst/debug/efence.c: + * gst/debug/efence.h: + * gst/debug/gstnavigationtest.h: + * gst/debug/gstnavseek.h: + * gst/debug/gstpushfilesrc.h: + * gst/debug/gsttaginject.h: + * gst/debug/progressreport.h: + * gst/debug/tests.h: + debug: indent before renaming + +2009-04-15 14:07:57 +0200 Wim Taymans + + * gst/rtp/gstrtpg726depay.c: + g726depay: add property for aal2 force + +2009-04-15 13:56:17 +0200 Wim Taymans + + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpg726depay.h: + g726depay: implement RFC3551 packing + We implemented the AAL2 packing, add the encoding-name for those to the caps and + a property to force AAL2 decoding (always TRUE for now). + Implement RFC3551 unpacking for regular G726. + See #567140. + +2009-04-15 00:22:43 +0200 Wim Taymans + + * gst/rtp/gstrtph263pay.h: + rtph263pay: fix build + +2009-04-14 18:52:48 +0200 Youness Alaoui + + * gst/rtp/gstrtph263pay.c: + h263pay: various fixes + Re-enable mode A support and a property to control it. + Fix memory leak of GstRtpH263PayBoundry objects. + Fix marker. + Fixes #509311 + +2009-04-14 18:44:51 +0200 Janin Kolenc + + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pay.h: + h263pay: Fix the payloader + Fix the H263 payloader to be more RFC 2190 compliant. + See #509311 + +2009-04-14 17:27:05 +0200 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: don't push EOS in streaming mode + In streaming mode, avidemux is not supposed to send an EOS event downstream but + it is supposed to return UNEXPECTED from the chain function instead so that + upstream can do the right EOS handling. + +2009-04-13 14:03:03 +0200 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: + Add initial support for muxing/demuxing Speex audio + Note: This is not in the Matroska spec yet + Fixes bug #578310. + +2009-04-10 21:31:06 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: handle NULL timing info + Don't crash when the timing info is not yet available. + +2009-04-10 21:42:13 +0300 Stefan Kost + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulse: make it work on 0.9.12 + First we ignore request to fill the ringbuffer which are less then a segment. + The small request where causing stutter. + Then we disable flushing the stream when running against pa 0.9.12 as this + triggers an assertiong in the sound server and terminates it. It does not happen + with 0.9.10 and 0.9.14. + +2009-04-10 14:18:48 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: handle server disconnect in get_time + When the server is disconnected or when we are shut down, make our clock return + an invalid time instead of erroring out. + +2009-04-10 12:01:27 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: bps is signed int to avoid overflow + Keep bps as gint instead of guint because we will be doing signed math with it + later on and we don't want weird results. + +2009-04-10 00:26:44 +0200 LRN + + * gst/avi/gstavidemux.c: + avidemux: add convert query, fix duration query + Fix the duration query so that it also works with formats other than + TIME, such as DEFAULT to get the number of frames. + Add a convert function. + Fixes #578052. + +2009-04-09 23:43:58 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: check for a stream + Don't try to change the stream volume (and other things) when we don't have a + stream yet. Just store the values for later. + +2009-04-09 18:07:38 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: fix compilation for newer pulseaudio + +2009-04-09 17:18:54 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: uncork fixes and use prebuf = 0 + We can use prebuf = 0 to instruct pulse to not pause the stream on underflows. + This way we can remove the underflow callback. We however have to manually + uncork the stream now when we have no available space in the buffer or when we + are writing too far away from the current read_index. + +2009-04-09 14:38:17 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: handle write errors + +2009-04-09 14:16:35 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: write silence on underflow + Start filling up the buffer with empty samples when an underflow happens. We + need to do this to keep pulseaudio reporting the right time for us. + +2009-04-09 13:14:14 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: handle pull-based scheduling + Use the default basesink methods for implementing pull based scheduling, it + works fine for us. + +2009-04-09 12:13:44 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: add beginnings of pull-based scheduling + +2009-04-08 18:17:10 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: keep track of clock reset + when we switch streams, the clock will reset to 0. Make sure that the provided + clock doesn't get stuck when this happens by keeping an initial offset. We also + need to make sure that we subtract this offset in samples when writing to the + ringbuffer. + +2009-04-08 13:52:41 +0200 Wim Taymans + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: rewrite pulsesink + Derive from BaseAudioSink and implement our custom ringbuffer that maps to the + internal pulseaudio ringbuffer. + +2009-04-08 13:52:00 +0200 Wim Taymans + + * ext/pulse/pulseutil.c: + pulse: remove some stray debug lines + +2009-04-09 11:30:59 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: use slightly more adaptive formula for QoS + Should work at least a tad better if the decoder can't keep up, and + should also spread dropped frames a bit more evenly over time. + +2009-04-07 22:35:31 +0300 Stefan Kost + + * gst/wavparse/gstwavparse.c: + wavparse: don't leak pad-template + gst_element_class_add_pad_template() does not take ownership. + +2009-04-04 21:18:55 +0300 Felipe Contreras + + * common: + Automatic update of common submodule + From d0ea89e to b3941ea + +2009-04-01 01:15:31 +0200 Thomas Vander Stichele + + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + add pending_samples so that we only update segment's last stop after really sending the samples + +2009-03-15 21:31:49 +0100 Thomas Vander Stichele + + * tests/check/pipelines/flacdec.c: + add debug and an assert + +2009-03-15 21:30:32 +0100 Thomas Vander Stichele + + * ext/flac/gstflacdec.c: + add debugging + +2009-03-03 10:14:02 +0100 Thomas Vander Stichele + + * tests/check/Makefile.am: + * tests/check/audiotestsrc.flac: + * tests/check/pipelines/flacdec.c: + add a test to check that we get all decoded bytes from a 10-buffer audiotestsrc flac, in the case of: - a full decode - a decode of a seek for the full file - a decode of a seek for a small part, smaller than the first buffer + The test fails because flacdec drops the first outgoing buffer on a seek + +2009-03-03 10:06:52 +0100 Thomas Vander Stichele + + * ext/flac/gstflacdec.c: + clipping should also work if it's done on the first buffer starting at 0 + +2009-04-04 14:54:01 +0200 Edward Hervey + + * common: + Automatic update of common submodule + From f8b3d91 to d0ea89e + +2009-04-03 09:57:15 +0100 Zaheer Merali + + * gst/qtdemux/LEGAL: + Fix grammar. + +2009-04-02 22:41:01 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: allow http:// on the proxy setting + Allow and ignore http:// at the start of the proxy setting, like + souphttpsrc. + Fixes #573173 + +2009-04-02 21:08:48 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't leak the udpsrc pad + Fix memory leak in rtspsrc because we didn't unref the udpsrc pad. + See #577318 + +2009-04-01 17:31:18 -0700 Michael Smith + + * gst/rtp/gstrtptheorapay.c: + rtptheorapay: fix length encoding in packed headers. + As for vorbis payloader; this by inspection had the same bug. + +2009-04-01 17:23:33 -0700 Michael Smith + + * gst/rtp/gstrtpvorbispay.c: + rtpvorbispay: in packed headers, properly flag multibyte lengths. + In the sequence of header lengths, for headers >127 bytes, we use + multiple bytes to encode the length. Bytes other than the last must have + the top (flag) bit set. + +2009-04-02 00:20:02 +0100 Jonathan Matthew + + * ext/taglib/gstid3v2mux.cc: + * tests/check/elements/id3v2mux.c: + id3v2mux: write RVA2 frames containing peak/gain volume data + +2009-04-02 00:05:14 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: demote some log message from DEBUG to LOG + And log decoder object. + +2009-04-01 21:15:02 +0100 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: implement basic QoS + Don't decode frames that are going to be too late anyway. + +2009-04-01 12:26:12 +0100 Tim-Philipp Müller + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't emit ugly warnings with older rtpjitterbuffer versions + The on-npt-stop signals was added only recently to rtpjitterbuffer in + -bad, so check if the signal exists before g_signal_connect()ing to + it, to avoid warnings. + +2009-03-31 19:08:37 +0200 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: add proxy support + +2009-03-31 17:16:04 +0300 Stefan Kost + + * gst/matroska/matroska-mux.c: + matroska: don't leak serialized values when writing tags + +2009-03-31 17:06:50 +0300 Stefan Kost + + * gst/matroska/matroska-demux.c: + matroska: don't alter passed data and especialy don't leak. + If we need different size, Make a copy, work with that and free it. + +2009-03-31 16:42:15 +0300 Stefan Kost + + * gst/goom/plugin_info.c: + goom: the structure is not fully initialized, but the copied. + Set to fully to 0 to avoid creep of uninitialized values. + +2009-03-31 16:25:58 +0300 Stefan Kost + + * gst/matroska/matroska-mux.c: + matroska: init endianess as such and signedness as boolean. + +2009-03-31 16:22:42 +0300 Stefan Kost + + * gst/qtdemux/qtdemux.c: + qtdemux: don't use ininitialized var in debug log statement + Also make the log statement useful by printing the human readable format name. + +2009-03-31 12:01:21 +0300 Stefan Kost + + * gst/qtdemux/qtdemux.c: + qtdemux: don't leak atom data in case of a wrong fourcc + +2009-03-31 11:57:36 +0300 Stefan Kost + + * gst/matroska/matroska-demux.c: + matroska: don't leak read data in demuxer + +2009-03-31 11:50:41 +0300 Stefan Kost + + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsrc.c: + udp: don't use protocol in debug message after freeing + +2009-03-30 14:10:15 +0100 Tim-Philipp Müller + + * gst/rtp/gstrtpmp4adepay.c: + rtpmp4adepay: output should be framed already + +2009-03-27 21:17:05 +0000 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.c: + * ext/flac/gstflacenc.h: + flac: require a 'newer' flac and remove support for the legacy flac API + +2009-03-27 17:48:13 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: link to the on_npt_stop signal to EOS + Connect to the on_npt_stop signal of the session manager to schedule the EOS + actions. + +2009-03-26 14:39:06 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: some stream synchronization to aid seeking in unbalanced clips + Some clips (trailers) may have (length-wise) unbalanced streams, + which stalls the pipeline if seeking into that region. + Additional stream synchronization can handle this, as well as + sparse (subtitle) streams (at some later time ?) + +2009-03-26 10:31:18 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: additional safety and sanity checks (push based mode) + +2009-03-26 10:18:31 +0100 Wim Taymans + + * gst/videomixer/videomixer.c: + videomixer: some more indent fixes + +2009-03-24 16:00:58 +0100 Wim Taymans + + * gst/videomixer/videomixer.c: + videomixer: fix gst-indent screwup + +2009-03-25 17:54:35 +0000 Tim-Philipp Müller + + * gst/rtsp/gstrtsp.c: + * gst/rtsp/gstrtspsrc.c: + * po/POTFILES.in: + rtspsrc: better error message when the RTSP extension for Real streams is missing + Try to post a decent error message when it looks like we're failing + because the Real RTSP extension plugin is missing. Also add i18n + bits for rtspsrc so our error messages get translated. + +2009-03-25 15:42:15 +0000 Tim-Philipp Müller + + * gst/avi/gstavi.c: + * gst/qtdemux/quicktime.c: + i18n: make sure gettext gives us UTF-8 at all times + +2009-03-25 01:28:38 +0000 Tim-Philipp Müller + + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpmp4apay.c: + rtpmp4apay,rtpmp4depay: fix buffer leaks in AAC payloader and depayloader + +2009-03-25 01:22:17 +0000 Tim-Philipp Müller + + * gst/rtp/gstrtpmp4apay.c: + rtpmp4apay: warn if input is unframed + +2009-03-22 21:20:57 +0000 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegdec.h: + jpegdec: put GstSegment inside the element struct instead of allocating it separately + +2009-03-25 10:08:41 +0200 Stefan Kost + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + v4l2src: move duplicated timestamping and buffer metadata code to _create() + This will include the latency changes also in the mmap case. + +2009-03-25 10:06:48 +0200 Stefan Kost + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + v4l2src: remove win32 ifdefs introduced by commit cff3f46760eac74c9bbd7a36aca44fedf327424b + V4l2src is under sys and does not exists/run under windows anyway. + +2009-03-24 15:44:42 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: handle FLUSH_STOP event + Clean up some state (most notably pad flow returns) to resume + proper streaming following flushing seek. + +2009-03-24 12:42:13 +0100 Alessandro Decina + + * gst/avi/gstavidemux.c: + avidemux: don't post an error if EOS can't be pushed downstream. + This aligns avidemux with other demuxers and fixes a bug using avidemux + with a recent gnonlin. + +2009-03-23 11:22:08 +0100 Wim Taymans + + * ext/pulse/pulsesink.c: + pulsesink: clean up the state change function + Make the state change function a bit more readable and only pause after the + parent had a change to pause first. + +2009-03-20 17:22:32 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: support seeking in push based mode + +2009-03-20 17:11:39 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: align push based behaviour more with pull based + Cater for DELTA_UNIT flag on buffers, keep track of current + position, remove and warn about edit lists if any (as those + as are de facto discarded anyway), add some debug statements + and indent fixes. + +2009-03-20 17:03:03 +0100 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: + qtdemux: fix mem leaks and prevent excessive buffering in push based mode + +2009-03-20 13:27:59 +0000 Jan Schmidt + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: Track the corked/uncorked state ourselves + Use an instance variable to track whether the stream is corked or not, + instead of using PA API that was only introduced in 0.9.11 + +2009-03-19 18:39:04 +0000 Jan Schmidt + + * ext/pulse/pulsesink.c: + pulse: Make sure the stream is uncorked in the write function + If the caps changes, the sink is reset without transitioning through + a PAUSED->PLAYING state change, resulting in a corked stream. This avoids + the problem by checking that the stream is uncorked when writing samples + to it. + +2009-03-20 01:02:26 +0000 Tim-Philipp Müller + + * ext/speex/gstspeexenc.c: + speexenc: fix direction of latency query and other upstream queries + Don't send queries back to the element they just came from by sending + them to the peer of the wrong pad. + +2009-03-19 11:10:40 +0000 Tim-Philipp Müller + + * .gitignore: + * tests/check/elements/.gitignore: + .gitignore: ignore more + +2009-03-18 16:55:27 +0000 Tim-Philipp Müller + + * gst/rtp/gstrtpmp4adepay.c: + rtpmp4adepay: don't append an extra 0 byte to the codec data + The audioMuxVersion structure is packed in such a way that the codec + data does not start byte-aligned, which means there's an extra bit of + padding at the end. We don't want that bit in the codec data, since + some decoders seem get confused when they're fed with an extra codec + data byte (also it's just not right of course). + +2009-03-19 13:25:57 +0100 Wim Taymans + + * gst/rtp/gstrtph264depay.c: + rtph264depay: fix base64 decoding + We can't pass -1 to _decode_step, that functions returns 0 right away instead of + decoding up to the string end. + +2009-03-19 13:24:02 +0100 David Adam + + * gst/udp/gstudpnetutils.c: + udp: Fix build if on Solaris + This patch checks for Solaris and uses ip_mreq instead of ip_mreqn if on this + platform. + Fixes #575937. + +2009-03-18 14:50:17 +0100 Sebastian Dröge + + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbispay.c: + rtp: Use GLib functions for encoding/decoding base64 + +2009-03-16 19:17:24 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: add some debug for the timestamps + When timestamping in TCP mode, log the first timestamp we put on the buffers. + +2009-03-15 23:26:56 +0200 Stefan Kost + + * sys/v4l2/v4l2src_calls.c: + v4l2src: log details if we have them, needed for #575391 + +2009-03-13 18:32:47 +0100 Wim Taymans + + * gst/udp/gstudpsrc.c: + udpsrc: convert _ in properties to - + -- + +2009-03-13 18:28:59 +0100 Edgar E. Iglesias + + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpnetutils.c: + * gst/udp/gstudpnetutils.h: + * gst/udp/gstudpsrc.c: + * gst/udp/gstudpsrc.h: + udpsrc: Add network interface selection + Add network interface selection when joining multicast groups. + Useful when using the udpsrc on multihomed hosts. + Fixes #575234. + API: GstUDPSrc::multicast-iface + +2009-03-13 15:43:52 +0000 Jan Schmidt + + * sys/v4l2/v4l2_calls.c: + v4l2src: Prepend to lists and reverse them at the end. + Gratuitous micro-optimisation - prepend to lists and reverse them, rather + than appending to them each time. + +2009-03-13 15:40:50 +0000 Jan Schmidt + + * ext/pulse/pulsesink.c: + pulsesink: Wait until there is enough room to write an entire segment + When trying to write out a segment, wait until there is enough free space + for the entire segment. This helps to reduce ripple in the clock reporting, + where the app might query the playback position while only half a segment + has been written (and is therefore reported by _delay(), even though + the ring buffer has not yet been advanced) + +2009-03-12 20:38:42 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: don't send PAUSE when not connected + don't send a PAUSE request when we are no longer connected. + +2009-03-12 16:10:25 +0100 Laszlo Pandy + + * ext/flac/gstflacdec.c: + Don't call FLAC__ methods before it's initialized. Fixes #516031 + In the event handler, gst_flac_dec_sink_event(), two functions are called on + the FLAC stream without checking if it has been initialized: + FLAC__stream_decoder_flush() + FLAC__stream_decoder_process_until_end_of_stream() + Both these FLAC__*() functions modify the internal state of the FLAC stream. + Later, when the buffers start flowing, gst_flac_dec_chain() tries to initialize + the stream. the FLAC__stream_decoder_init_stream() call will fail because the + previous calls to FLAC__*() changed the stream state so it is no longer in the + initialized state. + +2009-03-11 17:59:00 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix timeout check + --- + +2009-03-11 12:48:03 +0000 Tim-Philipp Müller + + * win32/MANIFEST: + win32: update MANIFEST, fixing 'make dist' + config.h.in no longer exists. + +2009-03-10 21:14:43 +0200 Stefan Kost + + * gst/multipart/Makefile.am: + makefile: fix typo in no-static plugins rule + +2009-03-10 11:01:16 +0100 Wim Taymans + + * ext/libpng/gstpngdec.c: + pngdec: various cleanups. + Make some code more readable. + Fix a leak when pull range returns a shot buffer. + Push EOS after posting the error. + +2009-03-10 10:16:27 +0100 Edward Hervey + + * gst/rtp/gstrtpvorbisdepay.c: + gstrtpvorbisdepay: Fix build on macosx + +2009-03-01 17:37:56 +0100 Edward Hervey + + * .gitignore: + .gitignore: Ignore m4 directory + +2009-03-09 23:12:33 +0000 Jan Schmidt + + * common: + Automatic update of common submodule + From 7032163 to f8b3d91 + +2009-03-09 18:07:20 +0100 Wim Taymans + + * gst/rtp/gstrtpvorbisdepay.c: + vorbisdepay: fix some leaks + And leak the codebooks. + Use glib base64 decoders. + Use subbuffers to avoid a memcpy of the headers. + +2009-03-09 17:14:12 +0100 Wim Taymans + + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + flacdec: don't lose the first buffer after a seek + The flacdec API calls the write callback when performing a seek. We cannot yet + push out a buffer at that time so we must keep it and push it out later. + Flush out the upstream part of the pipeline when doing a seek. + Fixes #574275. + +2009-03-09 15:20:05 +0100 Wim Taymans + + * gst/qtdemux/qtdemux.c: + qtdemux: sanitize tag names + Sanitize the tag names before turning them into a structure name. We can only + add alphanumeric values as the structure name. + +2009-03-08 12:04:22 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From ffa738d to 7032163 + +2009-03-08 11:19:56 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 3f13e4e to ffa738d + +2009-03-07 11:45:35 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 3c7456b to 3f13e4e + +2009-03-07 10:45:40 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 57c83f2 to 3c7456b + +2009-03-06 21:56:26 +0200 Stefan Kost + + * sys/v4l2/v4l2src_calls.c: + v4l2src: fix pads, so that they are subset of template caps + Do not add w=0 | h=0. When we can't get a framerate add fraction range. + +2009-03-05 14:08:14 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: fix range parsing + Fix parsing of the range headers. + +2009-02-10 17:20:57 +0000 Olivier Crête + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpsirendepay.c: + * gst/rtp/gstrtpsirendepay.h: + * gst/rtp/gstrtpsirenpay.c: + * gst/rtp/gstrtpsirenpay.h: + Move siren rtp pay/depay from gst-plugins-farsight + +2009-03-04 16:25:34 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix memory leak in close + Close the connection even when we fail to send the teardown message. + Use the connection url (which is a copy of the src url). + +2009-03-04 16:15:05 +0100 Peter Kjellerstedt + + * tests/check/Makefile.am: + check: gst-plugins-good.supp needs to be distributed. + +2009-03-04 12:29:50 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: fix do-rtcp property description + --- + +2009-03-03 12:20:27 +0100 Edward Hervey + + * ext/soup/gstsouphttpsrc.c: + * ext/soup/gstsouphttpsrc.h: + souphttpsrc: Expose the SoupSession 'timeout' property. + +2009-03-02 15:07:24 +0100 Edward Hervey + + * .gitignore: + .gitignore: Ignore the m4/ directory + +2009-03-02 17:18:55 +0100 Wim Taymans + + * gst/rtp/gstrtpmp4vpay.c: + rtpmp4vpay: Add support for more formats + Hack around short header mpeg4 video files and put the short header as the + config string. + Fixes #572551. + +2009-03-02 16:08:23 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: add support for http tunneling + Add support for http tunneling and a new rtsph:// uri for it. + See #573173. + +2009-03-02 09:43:30 +0100 Thomas Vander Stichele + + Merge branch 'master' of ssh://thomasvs@git.freedesktop.org/git/gstreamer/gst-plugins-good + +2009-03-02 08:41:15 +0100 Thomas Vander Stichele + + * ext/flac/gstflacdec.c: + Add/clarify/fix some logging. + +2009-03-01 12:47:37 -0800 David Schleef + + * sys/osxvideo/Makefile.am: + Remove hardcoded definition of OBJC + +2009-03-01 19:55:26 +0100 Sjoerd Simons + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + Wait for a frame to become available before capturing it + Use GstPoll to wait for the fd of the video device to become readable before + trying to capture a frame. This speeds up stopping v4l2src a lot as it no + longer has to wait for the next frame, especially when capturing with low + framerates or when the video device just never generates a frame (which seems a + common issue for uvcvideo devices) + Fixes bug #563574. + +2009-02-14 17:56:05 +0000 Tim-Philipp Müller + + * gst/law/alaw-decode.c: + * gst/law/mulaw-decode.c: + alawdec, mulawdec: demote some debug messages from ERROR to WARNING or DEBUG + Non-ok flow returns may happen for a variety of perfectly legitimate and expected reasons + (temporarily not linked, seeking, pipeline shutdown), so we really shouldn't spew ERROR + debug messages to stderr in those cases. Fixes #570781. (Seems like someone already took + care of some of these.) + +2009-02-28 15:26:00 +0200 René Stadler + + * gst/replaygain/gstrgvolume.c: + rgvolume: Improve log message for peak values >1.0 by clamping explicitly. + +2009-02-27 23:25:32 -0800 David Schleef + + * ext/dv/gstdvdec.c: + Fix the field dominance + PAL is TFF, NTSC is BFF. Some day I will learn to keep this + straight. + +2009-02-27 20:40:31 +0100 LRN + + * sys/directdraw/gstdirectdrawsink.c: + directdrawsink: Fix type mismatches + Fixes bug #573343. + +2009-02-27 20:28:27 +0100 Sebastian Dröge + + Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-good + +2009-02-27 20:24:53 +0100 LRN + + * gst/udp/gstudpnetutils.c: + udp: Don't set errno to EAFNOSUPPORT unconditionally + Fixes bug #573342. + +2009-02-27 11:17:50 -0800 Michael Smith + + * gst/replaygain/gstrgvolume.c: + rgvolume: ignore out-of-range peak values + If the peak value is > 1 (and thus nonsensical) ignore it. Prevents + rgvolume reducing volume to effectively silent on files with bogus peak + values. + +2009-02-27 13:29:41 +0100 Mark Nauwelaerts + + * gst/wavparse/gstwavparse.c: + wavparse: Fix SEEK event handling in push mode, and SEEKABLY query handling + Standard pull mode loop based SEEK handling fails in push mode, + so convert the SEEK event appropriately and dispatch to upstream. + Also cater for NEWSEGMENT event handling, and properly inform + downstream and application of SEEKABLE capabilities, depending + on scheduling mode and upstream. + +2009-02-27 11:04:08 +0100 Edward Hervey + + * gst/matroska/matroska-demux.c: + matroskademux: Remove gst_util_dump_mem() calls. + +2009-02-26 19:07:35 +0100 Julien Moutte + + * gst/avi/gstavidemux.c: + avidemux: fix SEEK event handling in push mode + When in push mode we should not try to handle the SEEK event as there's + no code to handle it properly. Propagate upstream. + +2009-02-26 19:05:06 +0100 Patrick Radizi + + * gst/rtsp/gstrtspsrc.h: + rtspsrc: add the .h file change too + Add the .h file change for the new property. + +2009-02-26 19:03:52 +0100 Patrick Radizi + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: add property to disable RTCP + Some old servers don't like us doing RTCP and thus we need a property to disable + it. See #573173. + +2009-02-26 13:19:31 +0100 Jan Smout + + * gst/udp/gstudpnetutils.c: + udp: fix gst_udp_set_loop_ttl() again + Fix the gst_udp_set_loop_ttl() function that was commented out in a + previous commit. See #573115. + +2009-02-26 13:06:17 +0100 Wim Taymans + + * gst/rtp/gstrtpvrawdepay.c: + rtpvrawdepay: fail on interlaced video + Fail on interlaced video until we support it. + +2009-02-26 13:00:58 +0100 Wim Taymans + + * gst/rtp/gstrtpvrawpay.c: + rtpvrawpay: fail on interlaced video + Detect and fail when trying to payload interlaced video. + +2009-02-25 20:47:15 -0800 David Schleef + + * Makefile.am: + * configure.ac: + * win32/common/config.h.in: + Change how win32/common/config.h is updated + Generate win32/common/config.h-new directly from config.h.in, + using shell variables in configure and some hard-coded information. + Change top-level makefile so that 'make win32-update' copies the + generated file to win32/common/config.h, which we keep in source + control. It's kept in source control so that the git tree is + buildable from VS. + This change is similar to the one recently applied to GStreamer + and gst-plugins-good. The previous config.h file in -good was in + pretty bad shape, so unlike core and base, I didn't attempt to + leave it strictly the same, but fixed it as necessary. Needs + testing I cannot do myself. + +2009-02-25 19:58:29 -0800 David Schleef + + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdec.h: + dvdec: Add interlacing info to caps and buffers + +2009-02-25 14:57:33 +0000 Jan Schmidt + + * common: + * configure.ac: + build: Update shave init statement for changes in common. Bump common. + +2009-02-25 14:01:26 +0100 Wim Taymans + + * gst/udp/gstudpsrc.c: + udpsrc: fix compilation + Fix compilation on systems MSG_ERRQUEUE and IP_RECVERR. + +2009-02-19 20:14:10 +0000 Tim-Philipp Müller + + * ext/jpeg/gstjpegenc.c: + jpegenc: error out instead of crashing if no caps have been set + Don't crash if we receive a buffer without caps. Fixes #572413. + +2009-02-25 11:35:31 +0100 Peter Kjellerstedt + + * gst/udp/gstudpsrc.c: + udpsrc: Make sure the sockaddr length used for recvfrom() is big enough. + Previously the sockaddr length used for recvfrom() was calculated as + sizeof (struct sockaddr). However, this is too little to hold an IPv6 + address, so the full size of the gst_sockaddr union should be used + instead. + +2009-02-25 11:32:28 +0100 Peter Kjellerstedt + + * gst/udp/gstudpsrc.c: + udpsrc: Unify the use of union gst_sockaddr. + +2009-02-25 11:32:07 +0000 Jan Schmidt + + * common: + Automatic update of common submodule + From 9cf8c9b to a6ce5c6 + +2009-02-25 12:05:22 +0100 Wim Taymans + + * gst/avi/gstavidemux.c: + avidemux: avoid crashing on subtitles + Avoid a crash in avi with subtitles by only dereferencing the video description + when we actually are dealing with video in the _invert function. + +2009-02-24 17:58:32 +0000 Jan Schmidt + + * gst/udp/gstudpsrc.c: + udp: Fix strict-aliasing warnings from gcc 4.4.0 + Fix strict aliasing warnings by defining a union on the different + sockaddr structs that we need. + +2009-02-24 17:35:46 +0000 Tim-Philipp Müller + + * gst/rtp/gstrtph264pay.c: + rtp: Fix compiler warning in h264 payloader + Fix an undefined behaviour warning from gcc 4.4.0 + Patch By: Tim-Philipp Müller + Fixes: #570995 + Signed-Off-By: Jan Schmidt + +2009-02-22 17:23:09 +0000 Jan Schmidt + + * configure.ac: + * docs/plugins/Makefile.am: + Use shave for the build output + +2009-02-24 14:55:28 +0100 Sebastian Dröge + + * ext/gconf/Makefile.am: + * ext/gconf/gconf.c: + * ext/gconf/gconf.h: + * ext/gconf/gstgconf.c: + * ext/gconf/gstgconf.h: + * ext/gconf/gstgconfelements.h: + gconf: Rename gconf.[ch] to gstgconf.[ch] to prevent name conflicts + +2009-02-24 14:41:26 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + qtdemux: Also use "(c)inf" to fill the comment tag + +2009-01-26 11:06:13 +0100 Mark Nauwelaerts + + * gst/rtsp/gstrtspsrc.c: + rtspsrc: perform UDP SETUP according to MS RTSP spec + MS RTSP spec states that the UDP port pair used in subsequent SETUP + requests for various streams must be identical (since there will actually + be only 1 stream of muxed asf packets). Following traditional specs and + using different port pairs in the SETUPs for separate streams will result + in all but the first one failing and only one stream being streamed. + So, in appropriate circumstances, retry UDP SETUP using previously used + port pair. Fixes #552650. + +2009-02-23 20:49:37 +0100 Aurelien Grimaud + + * gst/udp/gstudpsrc.c: + Read ICMP error messages instead of looping + When we are dealing with connected sockets shared between a udpsrc and a udpsink + we might receive ICMP connection refused error messages in udpsrc that will + cause it to go into a bursty loop because the poll returns right away without a + message to read. + Instead of looping, read the error message from the error queue in udpsrc. + Fixes #567857. + +2009-02-23 19:53:58 +0100 Wim Taymans + + * sys/v4l2/gstv4l2src.c: + Conditionally compile code for YVYU + Only compile the code for the YVYU format when the format is actually defined. + Spotted by tmatth on IRC. + +2009-02-17 11:01:47 -0800 Levente Farkas + + * sys/v4l2/v4l2src_calls.c: + v4l2src: Make sort_by_frame_size conditionally compiled + sort_by_frame_size is declared static and only used inside + an ifdef, so use the same ifdef to define the function. Fixes #572185 + Signed-off-by: David Schleef + +2009-02-23 17:05:43 +0100 Wim Taymans + + * sys/v4l2/gstv4l2src.c: + Add YVYU format to caps + Add YVYU format to the caps. We don't have anything to handle these caps yet, + though. + +2009-02-23 15:48:41 +0100 Wim Taymans + + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstjpegenc.h: + Some cleanups + Remove some unused variables. + Avoid a useless _resync call. + Correctly use a gboolean. + +2009-02-23 15:43:51 +0100 Wai-Ming Ho + + * gst/rtp/gstrtph264pay.c: + Always add PPS to the sprop-parameters-set + Rework the parsing code that under certain circumstances dropped the PPS from + the sprop-parameters-set. + Fixes #572854. + +2009-02-23 12:14:23 +0100 Arnout Vandecappelle + + * gst/matroska/matroska-mux.c: + Don't do crazy things with 0/1 framerates + We use 0/1 framerates to mark variable framerates and matroskamux should not try + to calculate a frame duration for it. + Fixes #571294. + +2009-02-23 11:45:50 +0100 Wim Taymans + + * configure.ac: + Require newer gst-p-b for the RTSP extensions. + -- + +2009-02-23 11:42:53 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + Call new receive_request method + Call the receive_request extension methods so that extensions can handle the + server request if they want. + +2009-02-23 11:13:30 +0100 Wim Taymans + + * gst/rtsp/gstrtspext.c: + * gst/rtsp/gstrtspext.h: + Add method for hadling server requests + Add method to handle server requests on the list of RTSP extensions. + +2009-02-13 14:39:29 +0100 Wim Taymans + + * gst/law/alaw-decode.c: + * gst/law/mulaw-decode.c: + Don't use GST_ERROR for non-error cases. + Turn a GST_ERROR line into a GST_DEBUG line so that we don't spam the log with + errors. Fixes #570781. + +2009-02-22 19:30:32 +0100 Sjoerd Simons + + * ext/gconf/gstgconfvideosink.c: + * ext/gconf/gstgconfvideosink.h: + * ext/gconf/gstgconfvideosrc.c: + * ext/gconf/gstgconfvideosrc.h: + gconfvideo(src|sink): Disconnect GConf notifications + Fixes bug #571321. + +2009-02-22 19:25:39 +0100 Sebastian Dröge + + * gst/matroska/matroska-demux.c: + matroskademux: Unref the buffer and not the memory address of the buffer + +2009-02-22 18:47:35 +0100 Olivier Crete + + * gst/law/alaw-decode.c: + * gst/law/mulaw-decode.c: + alaw/mulaw: Implement _getcaps function for alaw/mulaw decoders + Fixes bug #572358. + +2009-02-22 18:46:03 +0100 Olivier Crete + + * gst/law/alaw-encode.c: + * gst/law/mulaw-encode.c: + alaw/mulaw: Don't require both, rate and channel, to be set in _getcaps + Fixes bug #572358. + +2009-02-22 18:32:02 +0100 Sebastian Dröge + + * gst/avi/gstavidemux.c: + avidemux: Fix alignment issues by using GST_READ_* + Reading integers from random memory addresses will result + in SIGBUS on some architectures if the memory address + is not correctly aligned. This can happen at two + places in avidemux so we should use GST_READ_UINT32_LE + and friends here. Fixes bug #572256. + +2009-02-22 18:08:59 +0100 Sebastian Dröge + + * ext/pulse/pulsemixerctrl.c: + pulsemixer: Don't use g_atomic_int_(get|set) for accessing the mixer track flags + g_atomic_int_(get|set) only work on ints and the flags are + an enum (which on most architectures is stored as an int). + Also the way the flags were accessed atomically would still + leave a possible race condition and we don't do it in any + other mixer track implementation, let alone at any other + place where an integer could be changed from different + threads. Removing the g_atomic_int_(get|set) will only + introduce a new race condition on architectures where + integers could be half-written while reading them + which shouldn't be the case for any modern architecture + and if we really care about this we need to use + g_atomic_int_(get|set) at many other places too. + Apart from that g_atomic_int_(set|get) will result in + aliasing warnings if their argument is explicitely + casted to an int *. Fixes bug #571153. + +2009-02-22 15:52:06 +0000 Jan Schmidt + + * common: + Automatic update of common submodule + From 5d7c9cc to 9cf8c9b + +2009-02-22 12:41:53 +0100 Sebastian Dröge + + * ext/raw1394/gsthdv1394src.c: + hdv1394src: Don't use void * pointer arithmetic + +2009-02-21 11:13:43 -0800 David Schleef + + * common: + Automatic update of common submodule + From 80c627d to 5d7c9cc + +2009-02-21 18:42:46 +0000 Jan Schmidt + + * configure.ac: + Back to development -> 0.10.14.1 + +2009-02-21 12:47:00 +0100 Thomas Vander Stichele + + * ext/flac/gstflacdec.c: + respect DEFAULT segment by clipping the last buffer to be sent + +=== release 0.10.14 === + +2009-02-19 20:09:07 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.14 + +2009-02-19 20:07:41 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.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/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + +2009-02-19 13:16:39 +0000 Jan Schmidt + + * gst/audiofx/audioecho.c: + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautovideosrc.c: + Update Since: tags in autodetect srcs and audioecho + +2009-02-19 11:12:58 +0000 Jan Schmidt + + * ChangeLog: + Update ChangeLog for 0.10.13.3 + +2009-02-19 11:09:03 +0000 Jan Schmidt + + * configure.ac: + * win32/common/config.h: + 0.10.13.3 pre-release + +2009-02-10 11:25:49 +0100 Mark Nauwelaerts + + * ext/pulse/pulsemixerctrl.c: + pulsemixer: Fix compiler warnings. + Cast (enum *) to (int *), not necessarily technically right, + but plugs #571153. + +2009-02-13 18:03:14 +0100 Mark Nauwelaerts + + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + pulsesink: Issue property change notification in streaming thread, rather than PA thread. + pa_threaded_mainloop_lock() (a.o.) and by extension get_property should + not be done from a PA thread, but the latter may occur as a result of a + property change notification. Fixes #571204 (though current situation + not ideal, e.g. post message rather than signal). + +2009-02-10 11:27:51 +0100 Edward Hervey + + * gst/videocrop/gstaspectratiocrop.c: + aspectratiocrop: Don't forget to call parent finalize implementation. + This fixes a memory leak (leaking the contained elements of the bin). + +2009-02-10 08:43:59 +0100 Edward Hervey + + * sys/osxvideo/osxvideosink.m: + osxvideosink: Fix build. Fixes #571038 + +2009-02-09 12:18:36 +0100 Edward Hervey + + * common: + Bump revision to use for common submodule. + +2009-02-07 16:00:49 +0000 Jan Schmidt + + * ChangeLog: + ChangeLog: Update ChangeLog for 0.10.13.2 + +2009-02-07 15:58:55 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.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/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + po: Update translations for 0.10.13.2 + +2009-02-07 15:46:07 +0000 Jan Schmidt + + * configure.ac: + * win32/common/config.h: + Release 0.10.13.2 + +2009-02-07 15:40:53 +0000 Jan Schmidt + + * po/LINGUAS: + * po/mt.po: + po: Add Maltese translation + +2009-02-06 16:16:05 -0800 David Schleef + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_dump.c: + * gst/qtdemux/qtdemux_dump.h: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + qtdemux: Add handling for stps atoms + stps atoms contain "partial sync" information, which means that it's + a sync point where pts != dts. This is needed to properly handle + MPEG2, H.264, Dirac, etc., in quicktime. + +2009-02-05 15:51:42 -0800 Michael Smith + + * ext/flac/gstflacdec.c: + flacdec: if we aborted reading, don't do into an infinite loop. + If our read callback ran out of data, so had to abort reading, we return + GST_FLOW_ERROR instead of going into an infinite loop. + +2009-02-05 10:19:37 -0800 Michael Smith + + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + osxvideosink: remove non-embedded mode and fix memory management. + Remove non-embedded mode. Embed mode becomes default and only mode. + embed property is retained for binary compatibility. + Added autorelease pools around all objc functions that might be called + from a non-main thread. + +2009-02-05 20:02:01 +0100 Thomas Vander Stichele + + * ext/flac/gstflacdec.c: + debug on the object + +2009-02-04 16:40:13 -0800 Michael Smith + + * sys/osxaudio/gstosxringbuffer.c: + osxaudio fixes: multichannel and changing caps. + Ensure we create the ringbuffer segment size as a multiple of the + bytes per sample (fixes 6-channel output). + Reset the segoffset when acquiring the ringbuffer, so we don't retain + a bogus offset when caps change. + +2009-02-04 11:38:30 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + rtspsrc: Keep track of connected state + Keep track of the state of the connection and don't try to send TEARDOWN when + the server has closed the connection. + +2009-02-04 09:20:28 +0100 Robin Stocker + + * gst/matroska/matroska-demux.c: + Read Matroska Title element for the TITLE tag + Not all Matroska files have a Tags element which contains + information about the title among other things. Most video + Matroska files only contain the Title element so we + should parse this too. Fixes bug #570435. + +2009-02-03 22:34:38 +0000 Tim-Philipp Müller + + * configure.ac: + configure.ac: bump core/base requirements to released versions + +2009-02-03 17:10:30 +0100 Sebastian Dröge + + * tests/check/elements/audioecho.c: + Fix audioecho unit test on 32 bit systems + Cast the new value for the "delay" property to GstClockTime. + Integers without type are passed to vararg functions with + an integer type that can hold a pointer. + +2009-02-03 14:09:26 +0200 Stefan Kost + + * gst/equalizer/gstiirequalizer.c: + equalizer: Don't reset frequency bands from user settings. Fixes #570343. + Move reallocating the history buffer out of _compute_frequencies() and call the + right function as needed. Add some logging and tweak the formatting of existing + logging. Simplify setting need_new_coefficients when changing properties. + +2009-02-03 11:52:15 +0100 Sebastian Dröge + + * gst/audiofx/audioecho.c: + Use guint64 instead of guint for storing guint64 + +2009-02-02 18:37:35 +0100 Jonathan Matthew + + * ext/soup/gstsouphttpsrc.c: + Use correct flag for the GNOME proxy configuration + Fixes bug #552140. + +2009-02-02 13:08:14 +0100 Wim Taymans + + * tests/icles/v4l2src-test.c: + Fix compiler warnings + fix compiler warnings due to unused return values of scanf. + +2009-01-31 11:08:30 +0100 Sebastian Dröge + + * tests/icles/v4l2src-test.c: + Fix format string compiler warning + +2009-01-30 22:24:14 +0200 Stefan Kost + + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + Add releaseinfo with online url. + +2009-01-30 18:04:11 +0000 Jan Schmidt + + * tests/check/Makefile.am: + * tests/icles/Makefile.am: + Fix up some compile flags + +2009-01-30 17:35:49 +0000 Jan Schmidt + + * gst/videocrop/gstvideocrop.c: + Don't use Glib 2.16 function g_strcmp0. + +2009-01-30 17:34:45 +0000 Jan Schmidt + + * gst/qtdemux/qtdemux.c: + Don't do void pointer arithmetic + +2009-01-30 17:26:19 +0000 Jan Schmidt + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + Fix Forte compiler warnings. + Don't do void pointer arithmetic. Don't have an unreachable statement. + +2009-01-30 17:29:45 +0000 Jan Schmidt + + * common: + Bump common + +2009-01-26 10:33:55 +0100 Edward Hervey + + * gst/avi/gstavidemux.c: + Remove useless processing for non-raw formats + +2009-01-30 15:34:31 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + Add support for the 'Requirement' and 'Encoder' tags + +2009-01-30 15:33:19 +0100 Edward Hervey + + * gst/qtdemux/qtdemux.c: + Modify private-tag name formatter so that it doesn't go mad at fourcc starting with '(c)'. + +2009-01-30 14:40:51 +0100 Brijesh Singh + + * sys/v4l2/gstv4l2tuner.c: + Fix comparison of the tuner norms + The V4L2 tuner norms that a device supports could + be a subset of some norm (e.g. NTSC instead of NTSC_M). + The comparison should be done by & instead of ==. + See http://www.linuxtv.org/downloads/video4linux/API/V4L2_API/spec-single/v4l2.html#STANDARD + Fixes bug #569820. + +2009-01-30 08:53:06 +0100 Edward Hervey + + * autogen.sh: + * common: + Use a symbolic link for the pre-commit client-side hook + +2009-01-29 14:08:56 +0100 Thijs Vermeir + + * gst/videocrop/gstaspectratiocrop.c: + Only unref the peer when there is one. + +2009-01-29 11:07:59 +0200 Stefan Kost + + * gst/avi/gstavimux.c: + * gst/interleave/deinterleave.c: + * gst/interleave/interleave.c: + * sys/directdraw/gstdirectdrawsink.c: + * sys/directsound/gstdirectsoundsink.c: + * sys/osxvideo/osxvideosink.m: + * sys/v4l2/gstv4l2src.c: + * sys/waveform/gstwaveformsink.c: + 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 + + * sys/directdraw/gstdirectdrawsink.c: + * sys/directsound/gstdirectsoundsink.c: + * sys/oss/gstossmixerelement.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + * sys/osxaudio/gstosxaudio.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxvideo/osxvideosink.m: + * sys/sunaudio/gstsunaudiomixer.c: + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosrc.c: + * sys/v4l2/gstv4l2src.c: + * sys/waveform/gstwaveformsink.c: + * sys/ximage/gstximagesrc.c: + Update and add documentation for platform specific plugins (sys). + Link to properties. Correct titles for examples. Fix examples. + +2009-01-29 09:45:25 +0200 Stefan Kost + + * gst/multipart/multipartmux.c: + Add ' to framerate argument and remove the word 'simple' as all our pipelines are apparently simple. + +2009-01-29 09:42:56 +0200 Stefan Kost + + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + Add examples for the jpeg elements. + +2009-01-28 21:40:11 +0000 Jan Schmidt + + * ext/pulse/pulsesink.c: + Fix compile error in the last commit + +2009-01-28 20:34:40 +0000 Jan Schmidt + + * configure.ac: + * ext/pulse/pulseprobe.c: + * ext/pulse/pulseprobe.h: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + * ext/pulse/pulsesrc.c: + * ext/pulse/pulsesrc.h: + * ext/pulse/pulseutil.c: + * ext/pulse/pulseutil.h: + Rewrite the pulse plugin, conditionally enabling new behaviour with newer pulseaudio. + Fixes: #567794 + * Hook pulsesink's volume property up with the stream volume -- not the + sink volume in PA. + * Read the device description directly from the sink instead of going + via the mixer. + * Properly implement _reset() methods for both sink and source to avoid + deadlocks when shutting down a pipeline. + * Replace all simple pa_threaded_mainloop_wait() by proper loops to + guarantee that we wait for the right event in case multiple events are + fired. While this is not strictly necessary in many cases it + certainly is more correct and makes me sleep better at night. + * Replace CHECK_DEAD_GOTO macros with proper functions + * Extend the number of supported channels to 32 since that is the actual + limit in PA. + * Get rid of _dispose() methods since we don't need them. + * Increase the volume property upper limit of the sink to 1000. + * Reset function pointers after we disconnect a stream/context. Better + fix for bug 556986. + * Reset the state of the element properly if open/prepare fails + * Cork the PA stream when the pipeline is paused. This allows the PA + * daemon to + close audio device on pause and thus save a bit of power. + * Set PA stream properties based on GST tags such as GST_TAG_TITLE, + GST_TAG_ARTIST, and so on. + Signed-off-by: Lennart Poettering + +2009-01-28 17:46:06 +0200 Stefan Kost + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * ext/aalib/gstaasink.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttimeoverlay.c: + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdemux.c: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + * ext/gconf/gstgconfaudiosink.c: + * ext/gconf/gstgconfaudiosrc.c: + * ext/gconf/gstgconfvideosink.c: + * ext/gconf/gstgconfvideosrc.c: + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + * ext/hal/gsthalaudiosink.c: + * ext/hal/gsthalaudiosrc.c: + * ext/hal/hal.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libcaca/gstcacasink.c: + * ext/libcaca/gstcacasink.h: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/pulse/pulsemixer.c: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gsthdv1394src.c: + * ext/soup/gstsouphttpsrc.c: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * ext/taglib/gstapev2mux.cc: + * ext/taglib/gstid3v2mux.cc: + * ext/wavpack/gstwavpackdec.c: + * ext/wavpack/gstwavpackenc.c: + * ext/wavpack/gstwavpackparse.c: + * gst/matroska/matroska-mux.h: + * gst/udp/gstudpsrc.c: + Update and add documentation for plugins with deps (ext). + Link to properties. Correct titles for examples. Document a few trivial cases. Keep lists in section file and docs/plugins/Makefile.am alphabetically ordered. Fix warnings that gtk-doc points out. + +2009-01-28 15:57:20 +0100 Sebastian Dröge + + * gst/audiofx/audioecho.c: + * gst/audiofx/audioecho.h: + Limit the delay by a new max-delay property + Introduce a new max-delay property that can only + be set before going to PLAYING or PAUSED. This + is used to limit the maximum delay and is set + to the current delay by default. + Using this will make sure that we have enough data + in our internal ringbuffer for the echo. With dynamic + reallocation of the ringbuffer as used before silence + could've been used as the echo directly after setting + a new delay. + +2009-01-28 11:58:42 +0100 Edward Hervey + + * win32/common/config.h: + Revert previous bogus commit + +2009-01-28 12:29:42 +0200 Stefan Kost + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * gst/alpha/gstalphacolor.c: + * gst/apetag/gstapedemux.c: + * gst/audiofx/audioamplify.c: + * gst/audiofx/audiochebband.c: + * gst/audiofx/audiocheblimit.c: + * gst/audiofx/audiodynamic.c: + * gst/audiofx/audioecho.c: + * gst/audiofx/audiofirfilter.c: + * gst/audiofx/audioiirfilter.c: + * gst/audiofx/audioinvert.c: + * gst/audiofx/audiokaraoke.c: + * gst/audiofx/audiopanorama.c: + * gst/audiofx/audiowsincband.c: + * gst/audiofx/audiowsinclimit.c: + * gst/auparse/gstauparse.c: + * gst/avi/gstavidemux.c: + * gst/avi/gstavimux.c: + * gst/cutter/gstcutter.c: + * gst/debug/gstpushfilesrc.c: + * gst/debug/gsttaginject.c: + * gst/debug/progressreport.c: + * gst/equalizer/gstiirequalizer10bands.c: + * gst/equalizer/gstiirequalizer3bands.c: + * gst/equalizer/gstiirequalizernbands.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/goom2k1/gstgoom.c: + * gst/icydemux/gsticydemux.c: + * gst/id3demux/gstid3demux.c: + * gst/law/alaw-decode.c: + * gst/law/alaw-encode.c: + * gst/law/mulaw-decode.c: + * gst/law/mulaw-encode.c: + * gst/law/mulaw.c: + * gst/level/gstlevel.c: + * gst/monoscope/gstmonoscope.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/qtdemux/qtdemux.c: + * gst/rtp/gstrtpjpegpay.c: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtspsrc.c: + * gst/smpte/gstsmpte.c: + * gst/smpte/gstsmptealpha.c: + * gst/spectrum/gstspectrum.c: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/videobox/gstvideobox.c: + * gst/videocrop/gstaspectratiocrop.c: + * gst/videocrop/gstvideocrop.c: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videomixer/videomixer.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: + * win32/common/config.h: + Update and add documentation for plugins with no deps (gst). + Link to properties. Correct titles for examples. Document a few trivial cases. Keep lists in section file and docs/plugins/Makefile.am alphabetically ordered. + +2009-01-27 23:09:05 +0200 Stefan Kost + + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + Fix example apps by drawing in the main-loop. + +2009-01-27 20:33:02 +0000 Tim-Philipp Müller + + * tests/check/Makefile.am: + tests: fix build of aspectratio crop unit test in uninstalled environment. + +2009-01-27 20:30:02 +0000 Tim-Philipp Müller + + * .gitignore: + Make git ignore backup files + +2009-01-26 16:14:47 +0100 Peter Kjellerstedt + + * gst/multipart/multipartdemux.c: + Plug a memory leak in a debug message. + +2009-01-22 15:59:40 +0100 Peter Kjellerstedt + + * gst/udp/gstudpnetutils.c: + Correct return value from gst_udp_get_addr() when no known family is found. + +2009-01-26 09:51:36 +0100 Jonathan Matthew + + * configure.ac: + * ext/soup/gstsouphttpsrc.c: + Use libsoup-gnome for proxy configuration if available + If libsoup-gnome is found use this as it will give us + the GNOME proxy configuration. Otherwise use normal + libsoup. + The GNOME proxy configuration will only be used if + the proxy properties are not set on souphttpsrc + and if the http_proxy environment variable is not + set. + Fixes bug #552140. + +2009-01-25 19:26:46 -0800 David Schleef + + * gst/qtdemux/qtdemux.c: + Add a few more video fourcc's + +2009-01-24 14:48:00 +0100 Thijs Vermeir + + * gst/videocrop/gstaspectratiocrop.c: + * tests/check/Makefile.am: + * tests/check/elements/aspectratiocrop.c: + Add unit test for aspectratiocrop Fixes bug #527951 + Add unit test for aspectratiocrop and refactor this element. Added + finalize function to cleanup leaking mutex. + +2009-01-25 14:34:09 +0000 Jan Schmidt + + * tests/check/elements/.gitignore: + Ignore check binaries + +2009-01-24 18:28:06 +0100 Sebastian Dröge + + * gst/audiofx/audioecho.c: + Save some allocations if the echo delay is increased often + Save some allocations if the echo delay is increased often + during playback by always allocating enough memory to hold + data up to the next complete second, i.e. in the worst case + allocate memory for one additional second. + +2009-01-24 14:25:08 +0100 Thijs Vermeir + + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + Update plugin version in documentation + +2009-01-23 21:47:40 +0100 Thijs Vermeir + + * gst/videocrop/gstvideocrop.c: + Fix link in documentation of videocrop element + +2009-01-23 21:46:13 +0100 Thijs Vermeir + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-videocrop.xml: + * gst/videocrop/gstaspectratiocrop.c: + Add documentation for aspectratiocrop + +2009-01-24 13:21:39 +0100 Sebastian Dröge + + * win32/common/config.h: + Update win32/common/config.h for the new development cycle + +2009-01-24 11:53:40 +0100 Sebastian Dröge + + * gst/audiofx/audioecho.c: + Add note that audioecho's reverb sounds metallic + Add a note to the docs that audioecho's reverb will + sound metallic. This happens because for a real + reverb filter additional filtering is necessary. + Also note which values should be used for the delay + property to get an echo effect. + +2009-01-23 23:38:10 +0000 Jan Schmidt + + * .gitignore: + * docs/plugins/.gitignore: + * po/.gitignore: + * tests/examples/audiofx/.gitignore: + More entries for the gitignores + +2009-01-23 20:36:27 +0100 Thijs Vermeir + + * tests/check/elements/videocrop.c: + skip video/x-raw-gray in videocrop unit test + A recent commit added video/x-raw-gray support to videocrop. However + this lets the videocrop unit test fail. Because videotestsrc can't + generate this format. + +2009-01-23 15:39:46 +0100 Thijs Vermeir + + * gst/videocrop/Makefile.am: + * gst/videocrop/gstaspectratiocrop.c: + * gst/videocrop/gstaspectratiocrop.h: + * gst/videocrop/gstvideocrop.c: + Add aspectratiocrop element. Fixes bug #527951 + Add new aspectratiocrop element that crops the video + to a specified aspect ratio using videocrop. + +2009-01-23 10:49:28 +0100 Thijs Vermeir + + * gst/videocrop/gstvideocrop.c: + Fix navigation event forwarding while cropping. Fixes bug #567992. + Fix the navigation event forwarding while cropping by adjusting + the mouse position by the amount of cropped pixels. + +2009-01-23 10:04:39 +0100 Brian Cameron + + * configure.ac: + Fix linking on Solaris. Fixes bug #568809. + Check for the socket library which is needed + for socket() on Solaris. + +2009-01-22 22:41:43 +0000 Jan Schmidt + + * configure.ac: + Bump version number again -> 0.10.13.1 + +2009-01-22 22:41:01 +0000 Jan Schmidt + + * gst-plugins-good.doap: + Add releases 0.10.12 and 0.10.13 to the doap file + +2009-01-22 18:08:50 +0200 Stefan Kost + + * common: + Update common snapshot. + +2009-01-22 14:25:07 +0000 Jan Schmidt + + * configure.ac: + * win32/common/config.h: + Back to devel -> 0.10.12.1 + +2009-01-22 01:29:40 +0000 Jan Schmidt + + * configure.ac: + Release 0.10.12 + +2009-01-21 17:22:39 -0800 David Schleef + + * gst/qtdemux/qtdemux.c: + Fix for security advisory TKADV2009-0xx + Fix potential buffer overflows while reading quicktime headers. + Security issue noticed by Tobias Klein. + +2009-01-21 12:56:55 +0000 Jan Schmidt + + * ext/flac/gstflacdec.c: + Fix typo and small flaw in flac decoder + +2009-01-22 13:49:35 +0100 Sebastian Dröge + + * common: + Fix pre-commit hook + +2009-01-22 10:40:34 +0100 Sebastian Dröge + + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * gst/audiofx/Makefile.am: + * gst/audiofx/audioecho.c: + * gst/audiofx/audioecho.h: + * gst/audiofx/audiofx.c: + * gst/audiofx/audioreverb.c: + * gst/audiofx/audioreverb.h: + * tests/check/Makefile.am: + * tests/check/elements/audioecho.c: + * tests/check/elements/audioreverb.c: + Rename audioreverb to audioecho. Fixes bug #568395. + The element can add an echo and a simple reverb effect to + an audio stream but for a real reverb filter it would need + some additional filtering to prevent a metallic-sounding + result. + +2009-01-22 12:21:29 +0100 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: + Free leftover udp ports (if any) when a setup request fails. + +2009-01-22 06:05:26 +0100 Edward Hervey + + * autogen.sh: + * common: + Install and use pre-commit indentation hook from common + +2009-01-21 13:25:06 +0100 Wim Taymans + + * ext/flac/gstflacdec.c: + Whitespace fixes and some improved debug lines. + +2009-01-21 04:31:58 +0100 Edward Hervey + + * autogen.sh: + autogen.sh : Use git submodule + +2009-01-20 15:33:05 +0000 Tim-Philipp Müller + + sys/v4l2/gstv4l2src.c: Fix error code (the message string also needs love, but not today). + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read): + Fix error code (the message string also needs love, but not today). + +2009-01-19 11:44:36 +0000 Luotao Fu + + gst/videocrop/gstvideocrop.c: Add 8bit grayscale support to videocrop plugin. Fixes #567952. + Original commit message from CVS: + Patch by: Luotao Fu + * gst/videocrop/gstvideocrop.c: + (gst_video_crop_get_image_details_from_caps): + Add 8bit grayscale support to videocrop plugin. Fixes #567952. + +2009-01-19 11:22:06 +0000 Sebastian Dröge + + gst/audiofx/audioreverb.c: Set the default value in the instance init function. + Original commit message from CVS: + * gst/audiofx/audioreverb.c: (gst_audio_reverb_init): + Set the default value in the instance init function. + +2009-01-19 11:19:08 +0000 Sebastian Dröge + + Add an echo/reverb filter to the audiofx plugin, with configurable echo delay, intensity and feedback. Fixes bug #567... + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofx.c: (plugin_init): + * gst/audiofx/audioreverb.c: (gst_audio_reverb_base_init), + (gst_audio_reverb_class_init), (gst_audio_reverb_init), + (gst_audio_reverb_finalize), (gst_audio_reverb_set_property), + (gst_audio_reverb_get_property), (gst_audio_reverb_setup), + (gst_audio_reverb_stop), (gst_audio_reverb_transform_ip): + * gst/audiofx/audioreverb.h: + * tests/check/Makefile.am: + * tests/check/elements/audioreverb.c: (setup_reverb), + (cleanup_reverb), (GST_START_TEST), (audioreverb_suite): + Add an echo/reverb filter to the audiofx plugin, with configurable + echo delay, intensity and feedback. Fixes bug #567874. + +2009-01-19 10:13:53 +0000 Sebastian Dröge + + gst/spectrum/gstspectrum.*: Implement a simple compensation algorithm for rounding errors. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_reset_state), + (gst_spectrum_transform_ip): + * gst/spectrum/gstspectrum.h: + Implement a simple compensation algorithm for rounding errors. + This makes sure that a spectrum message is posted on the bus + every interval nanoseconds. Fixes bug #567955. + +2009-01-15 21:16:45 +0000 Michael Smith + + sys/osxaudio/Makefile.am: Link against CoreServices (needed for osx 10.4) and fix up the linker flags. Fixes #567853. + Original commit message from CVS: + * sys/osxaudio/Makefile.am: + Link against CoreServices (needed for osx 10.4) and fix up the linker + flags. Fixes #567853. + +2009-01-15 14:53:18 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Catch invalid and commonly wrong playback rates in the elst atoms. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_segments): + Catch invalid and commonly wrong playback rates in the elst atoms. + Fixes #567800. + +2009-01-15 11:40:23 +0000 Sebastian Dröge + + gst/spectrum/gstspectrum.c: Don't call gst_fft_f32_free() with NULL to prevent a crash. Fixes bug #567642. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_reset_state): + Don't call gst_fft_f32_free() with NULL to prevent a + crash. Fixes bug #567642. + +2009-01-14 15:44:18 +0000 Sebastian Dröge + + gst/spectrum/gstspectrum.*: Use correct types for frame/fft counters and some minor cleanup. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_transform_ip): + * gst/spectrum/gstspectrum.h: + Use correct types for frame/fft counters and some minor + cleanup. + +2009-01-14 15:37:07 +0000 Lennart Poettering + + ext/pulse/pulseprobe.c: Fix refcount loop, resulting in a thread leak. Fixes bug #567746. + Original commit message from CVS: + Patch by: Lennart Poettering + * ext/pulse/pulseprobe.c: (gst_pulseprobe_new), + (gst_pulseprobe_free): + Fix refcount loop, resulting in a thread leak. Fixes bug #567746. + +2009-01-14 10:46:54 +0000 Sebastian Dröge + + gst/spectrum/: Post a spectrum message on the bus for every interval, even if the interval is small than the length o... + Original commit message from CVS: + * gst/spectrum/Makefile.am: + * gst/spectrum/README: + * gst/spectrum/gstspectrum.c: (gst_spectrum_base_init), + (gst_spectrum_class_init), (gst_spectrum_init), + (gst_spectrum_reset_state), (gst_spectrum_finalize), + (gst_spectrum_set_property), (gst_spectrum_start), + (gst_spectrum_stop), (gst_spectrum_setup), + (gst_spectrum_transform_ip): + * gst/spectrum/gstspectrum.h: + Post a spectrum message on the bus for every interval, even + if the interval is small than the length of the FFT. + Fixes bug #567642. + Major cleanup of the spectrum element. + +2009-01-13 19:23:57 +0000 Sebastian Dröge + + Add audioiirfilter and audiofirfilter elements which allow generic IIR/FIR filters to be implemented by providing the... + Original commit message from CVS: + * configure.ac: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofirfilter.c: (gst_audio_fir_filter_base_init), + (gst_audio_fir_filter_class_init), + (gst_audio_fir_filter_update_kernel), (gst_audio_fir_filter_init), + (gst_audio_fir_filter_setup), (gst_audio_fir_filter_finalize), + (gst_audio_fir_filter_set_property), + (gst_audio_fir_filter_get_property): + * gst/audiofx/audiofirfilter.h: + * gst/audiofx/audiofx.c: (plugin_init): + * gst/audiofx/audioiirfilter.c: (gst_audio_iir_filter_base_init), + (gst_audio_iir_filter_class_init), + (gst_audio_iir_filter_update_coefficients), + (gst_audio_iir_filter_init), (gst_audio_iir_filter_setup), + (gst_audio_iir_filter_finalize), + (gst_audio_iir_filter_set_property), + (gst_audio_iir_filter_get_property): + * gst/audiofx/audioiirfilter.h: + Add audioiirfilter and audiofirfilter elements which allow + generic IIR/FIR filters to be implemented by providing the + filter coefficients. Fixes bug #567577. + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + Add documentation for the audioiirfilter and audiofirfilter + elements. + * tests/check/Makefile.am: + * tests/check/elements/audiofirfilter.c: (on_message), + (on_rate_changed), (on_handoff), (GST_START_TEST), + (audiofirfilter_suite): + * tests/check/elements/audioiirfilter.c: (on_message), + (on_rate_changed), (on_handoff), (GST_START_TEST), + (audioiirfilter_suite): + * tests/examples/Makefile.am: + * tests/examples/audiofx/Makefile.am: + * tests/examples/audiofx/firfilter-example.c: (on_message), + (on_rate_changed), (main): + * tests/examples/audiofx/iirfilter-example.c: (on_message), + (on_rate_changed), (main): + Add unit tests and example applications for the two filter + elements. + +2009-01-13 19:09:19 +0000 Thiago Sousa Santos + + gst/qtdemux/qtdemux.c: Fix format string for guint64. + Original commit message from CVS: + Patch by: Thiago Sousa Santos + * gst/qtdemux/qtdemux.c: + Fix format string for guint64. + +2009-01-13 19:04:09 +0000 Michael Smith + + sys/osxaudio/Makefile.am: osxaudio plugin now requires AudioUnit framework, so link against that. + Original commit message from CVS: + * sys/osxaudio/Makefile.am: + osxaudio plugin now requires AudioUnit framework, so link against that. + Clean up tabs v spaces while I'm there. + +2009-01-13 17:49:07 +0000 Wim Taymans + + tests/examples/rtp/server-alsasrc-PCMA.c: Add some example code for printing the RTP manager stats. + Original commit message from CVS: + * tests/examples/rtp/server-alsasrc-PCMA.c: (print_source_stats), + (print_stats), (main): + Add some example code for printing the RTP manager stats. + +2009-01-13 08:24:25 +0000 Sebastian Dröge + + gst/audiofx/: Use a custom mutex for protecting the instance fields instead of the GstObject lock. Using the latter c... + Original commit message from CVS: + * gst/audiofx/audiochebband.c: (gst_audio_cheb_band_class_init), + (gst_audio_cheb_band_init), (gst_audio_cheb_band_finalize), + (gst_audio_cheb_band_set_property): + * gst/audiofx/audiochebband.h: + * gst/audiofx/audiocheblimit.c: (gst_audio_cheb_limit_class_init), + (gst_audio_cheb_limit_init), (gst_audio_cheb_limit_finalize), + (gst_audio_cheb_limit_set_property): + * gst/audiofx/audiocheblimit.h: + * gst/audiofx/audiowsincband.c: (gst_audio_wsincband_class_init), + (gst_audio_wsincband_init), (gst_audio_wsincband_finalize), + (gst_audio_wsincband_set_property): + * gst/audiofx/audiowsincband.h: + * gst/audiofx/audiowsinclimit.c: (gst_audio_wsinclimit_class_init), + (gst_audio_wsinclimit_init), (gst_audio_wsinclimit_finalize), + (gst_audio_wsinclimit_set_property): + * gst/audiofx/audiowsinclimit.h: + Use a custom mutex for protecting the instance fields instead of + the GstObject lock. Using the latter can lead to deadlocks, especially + with the FIR filters when updating the latency. + +2009-01-11 19:03:38 +0000 Sebastian Dröge + + gst/audiofx/: Implement a base class for generic audio FIR filters. + Original commit message from CVS: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofxbasefirfilter.c: + (gst_audio_fx_base_fir_filter_dispose), + (gst_audio_fx_base_fir_filter_base_init), + (gst_audio_fx_base_fir_filter_class_init), + (gst_audio_fx_base_fir_filter_init), + (gst_audio_fx_base_fir_filter_push_residue), + (gst_audio_fx_base_fir_filter_setup), + (gst_audio_fx_base_fir_filter_transform), + (gst_audio_fx_base_fir_filter_start), + (gst_audio_fx_base_fir_filter_stop), + (gst_audio_fx_base_fir_filter_query), + (gst_audio_fx_base_fir_filter_query_type), + (gst_audio_fx_base_fir_filter_event), + (gst_audio_fx_base_fir_filter_set_kernel): + * gst/audiofx/audiofxbasefirfilter.h: + * gst/audiofx/audiofxbaseiirfilter.c: + Implement a base class for generic audio FIR filters. + * gst/audiofx/audiowsincband.c: + (gst_gst_audio_wsincband_mode_get_type), + (gst_gst_audio_wsincband_window_get_type), + (gst_audio_wsincband_base_init), (gst_audio_wsincband_class_init), + (gst_audio_wsincband_init), (gst_audio_wsincband_build_kernel), + (gst_audio_wsincband_setup), (gst_audio_wsincband_set_property), + (gst_audio_wsincband_get_property): + * gst/audiofx/audiowsincband.h: + * gst/audiofx/audiowsinclimit.c: + (gst_audio_wsinclimit_mode_get_type), + (gst_audio_wsinclimit_window_get_type), + (gst_audio_wsinclimit_base_init), + (gst_audio_wsinclimit_class_init), (gst_audio_wsinclimit_init), + (gst_audio_wsinclimit_build_kernel), (gst_audio_wsinclimit_setup), + (gst_audio_wsinclimit_set_property), + (gst_audio_wsinclimit_get_property): + * gst/audiofx/audiowsinclimit.h: + * tests/check/elements/audiowsincband.c: (GST_START_TEST): + * tests/check/elements/audiowsinclimit.c: (GST_START_TEST): + Use this new base class for audiowsincband and audiowsinclimit. + Also cleanup both elements. + +2009-01-08 18:17:13 +0000 Michael Smith + + gst/qtdemux/qtdemux.c: In push mode, error out if we get EOS before we've created any srcpads. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: + In push mode, error out if we get EOS before we've created any srcpads. + Handle (in pull mode) some files that have a truncated moov atom where + the final sub-atom is a 'free' atom and the contents of that are not + present in the file. + +2009-01-08 15:56:46 +0000 Mark Nauwelaerts + + gst/matroska/: Some cleanups, refactoring and minor enhancements in caps handling. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): + Some cleanups, refactoring and minor enhancements in caps handling. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init), + (gst_matroska_mux_init), (gst_matroska_pad_reset), + (gst_matroska_pad_free), (gst_matroska_mux_reset), + (gst_matroska_mux_video_pad_setcaps), + (gst_matroska_mux_request_new_pad): + * tests/check/elements/matroskamux.c: (teardown_src_pad): + Only remove, release or reset what is appropriate upon state change. + +2009-01-07 20:38:50 +0000 Jan Schmidt + + ext/pulse/pulsesink.*: Use a mutex to protect the current stream pointer, and ignore callbacks for stream objects tha... + Original commit message from CVS: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesink.h: + Use a mutex to protect the current stream pointer, and ignore + callbacks for stream objects that have been destroyed already. + Fixes problems with unprepare/prepare cycles caused by the input + caps changing, without reintroducing bug #556986. + +2009-01-07 16:09:47 +0000 Jan Schmidt + + sys/v4l2/gstv4l2src.c: Remove () from translateable string, so that it makes more sense. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: + Remove () from translateable string, so that it makes more sense. + +2009-01-07 09:43:13 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Minor fix/cleanup in header field calculation. + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_audsink_set_caps): + Minor fix/cleanup in header field calculation. + +2009-01-06 17:48:10 +0000 Mark Nauwelaerts + + gst/matroska/matroska-mux.*: Remove internal taglist and fully use tagsetter interface. + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), + (gst_matroska_mux_handle_sink_event), (gst_matroska_mux_finish): + * gst/matroska/matroska-mux.h: + Remove internal taglist and fully use tagsetter interface. + +2009-01-06 14:50:29 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.*: Ensure header size invariance during subsequent rewrite by using tags snapshot. + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_reset), + (gst_avi_mux_riff_get_avi_header): + * gst/avi/gstavimux.h: + Ensure header size invariance during subsequent rewrite by using + tags snapshot. + +2009-01-05 17:31:13 +0000 Sebastian Dröge + + ext/pulse/pulsesink.c: Don't wait for the pulse mainloop when destroying the stream. + Original commit message from CVS: + * ext/pulse/pulsesink.c: (gst_pulsesink_destroy_stream): + Don't wait for the pulse mainloop when destroying the stream. + Fixes a deadlock when the pulsedaemon goes away while pulsesink + is PLAYING. Fixes bug #556986. + +2009-01-05 12:30:40 +0000 Sascha Hauer + + sys/v4l2/gstv4l2src.c: Add support for grayscale v4l2 devices. Fixes bug #566616. + Original commit message from CVS: + Patch by: Sascha Hauer + Luotao Fu + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_structure), + (gst_v4l2_get_caps_info): + Add support for grayscale v4l2 devices. Fixes bug #566616. + +2009-01-05 11:42:09 +0000 Mark Nauwelaerts + + gst/qtdemux/: Streamline tag handling and pass unparsed tags as binary blob in private tag. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_str), + (qtdemux_tag_add_tmpo), (qtdemux_tag_add_covr), + (qtdemux_tag_add_date), (qtdemux_tag_add_gnre), + (qtdemux_tag_add_blob), (qtdemux_parse_udta): + * gst/qtdemux/qtdemux.h: + * gst/qtdemux/quicktime.c: (plugin_init): + Streamline tag handling and pass unparsed tags as binary blob + in private tag. + +2009-01-05 10:13:29 +0000 Sebastian Dröge + + gst/audiofx/: Implement a base class for IIR filters. + Original commit message from CVS: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofxbaseiirfilter.c: + (gst_audio_fx_base_iir_filter_base_init), + (gst_audio_fx_base_iir_filter_dispose), + (gst_audio_fx_base_iir_filter_class_init), + (gst_audio_fx_base_iir_filter_init), + (gst_audio_fx_base_iir_filter_calculate_gain), + (gst_audio_fx_base_iir_filter_set_coefficients), + (gst_audio_fx_base_iir_filter_setup), (process), + (gst_audio_fx_base_iir_filter_transform_ip), + (gst_audio_fx_base_iir_filter_stop): + * gst/audiofx/audiofxbaseiirfilter.h: + Implement a base class for IIR filters. + * gst/audiofx/audiochebband.c: (gst_audio_cheb_band_base_init), + (gst_audio_cheb_band_class_init), (gst_audio_cheb_band_init), + (generate_coefficients), (gst_audio_cheb_band_set_property), + (gst_audio_cheb_band_setup): + * gst/audiofx/audiochebband.h: + * gst/audiofx/audiocheblimit.c: (gst_audio_cheb_limit_base_init), + (gst_audio_cheb_limit_class_init), (gst_audio_cheb_limit_init), + (generate_coefficients), (gst_audio_cheb_limit_set_property), + (gst_audio_cheb_limit_setup): + * gst/audiofx/audiocheblimit.h: + Use the IIR filter base class for the chebyshev filters. + +2009-01-02 20:39:34 +0000 Justin Karnegas + + sys/osxaudio/: Rewrite osxaudio to work more flexibly and more reliably, using a different abstraction layer of corea... + Original commit message from CVS: + Patch by: Justin Karnegas and + Michael Smith + * sys/osxaudio/gstosxaudio.c: + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudioelement.h: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosink.h: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxaudio/gstosxaudiosrc.h: + * sys/osxaudio/gstosxringbuffer.c: + * sys/osxaudio/gstosxringbuffer.h: + Rewrite osxaudio to work more flexibly and more reliably, using a + different abstraction layer of coreaudio that is the recommended way of + doing low-level audio I/O on OSX. + Fixes byg #564948. + +2009-01-02 16:31:13 +0000 Wim Taymans + + tests/examples/rtp/server-decodebin-H263p-AMR.sh: Add example RTP transcoding pipeline from any file decodedable with... + Original commit message from CVS: + * tests/examples/rtp/server-decodebin-H263p-AMR.sh: + Add example RTP transcoding pipeline from any file decodedable with + uridecodebin. + +2009-01-02 15:20:48 +0000 Wim Taymans + + tests/examples/rtp/: Add two C examples of using gstrtpbin as a sender and a receiver. + Original commit message from CVS: + * tests/examples/rtp/.cvsignore: + * tests/examples/rtp/Makefile.am: + * tests/examples/rtp/client-PCMA.c: (pad_added_cb), (main): + * tests/examples/rtp/server-alsasrc-PCMA.c: (main): + Add two C examples of using gstrtpbin as a sender and a receiver. + +2008-12-31 11:20:55 +0000 Jan Schmidt + + ChangeLog: Remove conflict marker from ChangeLog + Original commit message from CVS: + * ChangeLog: + Remove conflict marker from ChangeLog + +2008-12-28 09:50:31 +0000 j^ + + gst/qtdemux/qtdemux.c: Add codec mapping for xvid, fmp4 and ac3 tracks. + Original commit message from CVS: + Patch by: j^ + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps), + (qtdemux_audio_caps): + Add codec mapping for xvid, fmp4 and ac3 tracks. + Fixes #565850 + +2008-12-23 12:10:41 +0000 Wim Taymans + + ext/jpeg/gstsmokeenc.*: Implement getcaps function. + Original commit message from CVS: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_init), + (gst_smokeenc_getcaps), (gst_smokeenc_setcaps), + (gst_smokeenc_chain), (gst_smokeenc_change_state): + * ext/jpeg/gstsmokeenc.h: + Implement getcaps function. + Set caps on the pad and on all outgoing buffers. + Fixes #565441. + +2008-12-19 09:36:45 +0000 Stefan Kost + + ext/pulse/pulsemixerctrl.c: And remove temporary comment pointing to the bug ticket. + Original commit message from CVS: + * ext/pulse/pulsemixerctrl.c: + And remove temporary comment pointing to the bug ticket. + * gst/avi/gstavimux.c: + Move reoccuring logging to LOG and log instance too. + +2008-12-17 17:28:39 +0000 Stefan Kost + + ext/pulse/pulsemixerctrl.c: Don't leak the pa_operation. + Original commit message from CVS: + * ext/pulse/pulsemixerctrl.c: + Don't leak the pa_operation. + +2008-12-16 16:19:26 +0000 Stefan Kost + + configure.ac: Require core cvs. + Original commit message from CVS: + * configure.ac: + Require core cvs. + +2008-12-16 16:07:48 +0000 Stefan Kost + + gst/avi/gstavimux.c: Rename api from _flush to _reset_tags. + Original commit message from CVS: + * gst/avi/gstavimux.c: + Rename api from _flush to _reset_tags. + +2008-12-16 14:22:51 +0000 Stefan Kost + + gst/avi/gstavimux.c: Use new tagsetter api to flush tags. + Original commit message from CVS: + * gst/avi/gstavimux.c: + Use new tagsetter api to flush tags. + +2008-12-16 13:14:39 +0000 Sebastian Dröge + + tests/check/elements/deinterleave.c: Increase timeout to 3 minutes to prevent timeouts. + Original commit message from CVS: + * tests/check/elements/deinterleave.c: (deinterleave_suite): + Increase timeout to 3 minutes to prevent timeouts. + +2008-12-16 12:52:24 +0000 Sebastian Dröge + + tests/check/elements/interleave.c: Increase timeout to 3 minutes to prevent timeouts. + Original commit message from CVS: + * tests/check/elements/interleave.c: (interleave_suite): + Increase timeout to 3 minutes to prevent timeouts. + +2008-12-16 11:57:01 +0000 Stefan Kost + + gst/avi/gstavimux.*: Totally remove the internal taglists and fully use tagsetter. + Original commit message from CVS: + * gst/avi/gstavimux.c: + * gst/avi/gstavimux.h: + Totally remove the internal taglists and fully use tagsetter. + +2008-12-15 15:59:53 +0000 Stefan Kost + + gst/avi/gstavimux.c: Instead of filtering wrongly just use the mergemode. Applications is use KEEP_ALL if they want t... + Original commit message from CVS: + * gst/avi/gstavimux.c: + Instead of filtering wrongly just use the mergemode. Applications is + use KEEP_ALL if they want to supress tag-events. Fixes #563221 for + avi for real (I hope). Everyone chime in, before I fix the others. + +2008-12-15 12:45:35 +0000 Stefan Kost + + ext/pulse/pulsemixerctrl.c: Add note about memleak. + Original commit message from CVS: + * ext/pulse/pulsemixerctrl.c: + Add note about memleak. + +2008-12-13 16:23:09 +0000 Edward Hervey + + m4/Makefile.am: A couple more .m4 that aren't shipped anymore with gettext 0.17. + Original commit message from CVS: + * m4/Makefile.am: + A couple more .m4 that aren't shipped anymore with gettext 0.17. + +2008-12-13 15:34:01 +0000 Edward Hervey + + Switch to using GstStaticPadTemplate. + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_base_init), + (gst_flac_dec_init): + * gst/law/alaw-decode.c: (gst_alaw_dec_base_init), + (gst_alaw_dec_init): + * gst/law/alaw-encode.c: (gst_alaw_enc_base_init), + (gst_alaw_enc_init): + * gst/law/alaw.c: (plugin_init): + * gst/law/mulaw-decode.c: (gst_mulawdec_base_init), + (gst_mulawdec_init): + * gst/law/mulaw-encode.c: (gst_mulawenc_base_init), + (gst_mulawenc_init): + * gst/law/mulaw.c: (plugin_init): + Switch to using GstStaticPadTemplate. + * gst/udp/gstudpnetutils.c: (gst_udp_get_addr): + Don't forget to free the addrinfo structure. + * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), + (gst_wavparse_sink_activate): + Don't forget to unref the GstAdapter. + +2008-12-13 12:58:24 +0000 Edward Hervey + + m4/Makefile.am: inttypes.m4 hasn't been available since gettext-0.15, and since we now require gettext >= 0.17 ... we... + Original commit message from CVS: + * m4/Makefile.am: + inttypes.m4 hasn't been available since gettext-0.15, and since we now + require gettext >= 0.17 ... we can remove it from the list of files to + dist. + +2008-12-10 15:03:23 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + smaller spec file updates + Original commit message from CVS: + smaller spec file updates + +2008-12-09 17:55:22 +0000 Stefan Kost + + gst/avi/gstavidemux.c: More logging. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + More logging. + * gst/avi/gstavimux.c: + Handle more metadata fields. Better estimate of metadata size. Don't + merge received tags, if application has specified tags using + GST_TAG_MERGE_REPLACE_ALL. Fixes #563221 for avi. + +2008-12-09 14:30:03 +0000 Sebastian Dröge + + tests/check/Makefile.am: Also ignore pulsemixer for the states unit test. + Original commit message from CVS: + * tests/check/Makefile.am: + Also ignore pulsemixer for the states unit test. + +2008-12-09 14:19:16 +0000 Wim Taymans + + gst/rtp/gstrtpjpegdepay.c: Add an EOI marker at the end of the jpeg frame when it's missing. + Original commit message from CVS: + * gst/rtp/gstrtpjpegdepay.c: (gst_rtp_jpeg_depay_process): + Add an EOI marker at the end of the jpeg frame when it's missing. + Fixes #563056. + +2008-12-09 10:47:14 +0000 Sebastian Dröge + + tests/check/elements/videocrop.c: Update the unit test for the new color values for BT.601 red. + Original commit message from CVS: + * tests/check/elements/videocrop.c: (check_1x1_buffer): + Update the unit test for the new color values for BT.601 red. + Fixes bug #563510. + +2008-12-09 10:28:11 +0000 Tim-Philipp Müller + + ext/dv/gstdvdemux.c: Restore previous behaviour of not passing QoS and navigation events upstream, which presumably w... + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_src_event): + Restore previous behaviour of not passing QoS and navigation + events upstream, which presumably wasn't meant to be changed. + +2008-12-09 09:39:53 +0000 Sebastian Dröge + + ext/dv/gstdvdemux.c: Add srcpads only when needed and remove them again when going back to READY. This prevents stall... + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_add_video_pad), + (gst_dvdemux_add_audio_pad), (gst_dvdemux_remove_pads), + (gst_dvdemux_demux_audio), (gst_dvdemux_demux_video), + (gst_dvdemux_chain), (gst_dvdemux_loop), + (gst_dvdemux_change_state): + Add srcpads only when needed and remove them again when going + back to READY. This prevents stalled pipelines if there's no + audio inside the DV stream, which happens for many MXF files. + +2008-12-09 09:09:25 +0000 Sebastian Dröge + + tests/check/elements/souphttpsrc.c: The ports in libsoup are unsigned integers and not signed integers. + Original commit message from CVS: + * tests/check/elements/souphttpsrc.c: (GST_START_TEST), + (run_server): + The ports in libsoup are unsigned integers and not signed + integers. + +2008-12-08 18:31:00 +0000 Sebastian Dröge + + ext/dv/gstdvdemux.c: Forward all events upstream unless it's something we really don't handle. This fixes latency con... + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_src_event): + Forward all events upstream unless it's something we really + don't handle. This fixes latency configuration of pipelines. + +2008-12-08 18:24:21 +0000 Sebastian Dröge + + ext/dv/: Really call dv_init() exactly one time, not one time for the demuxer and one time for the decoder. + Original commit message from CVS: + * ext/dv/gstdv.c: (plugin_init): + * ext/dv/gstdvdec.c: (gst_dvdec_class_init): + * ext/dv/gstdvdemux.c: (gst_dvdemux_class_init): + Really call dv_init() exactly one time, not one time for + the demuxer and one time for the decoder. + +2008-12-08 12:37:45 +0000 Wim Taymans + + gst/rtp/gstrtpmp4apay.c: Copy incomming timestamp to outgoing packets. + Original commit message from CVS: + * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_handle_buffer): + Copy incomming timestamp to outgoing packets. + +2008-12-08 12:36:21 +0000 Wim Taymans + + gst/rtp/gstrtpmp4vpay.c: Don't try to push packets before we could find a valid config startcode. Fixes #563509. + Original commit message from CVS: + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush), + (gst_rtp_mp4v_pay_event): + Don't try to push packets before we could find a valid config + startcode. Fixes #563509. + +2008-12-07 19:22:48 +0000 Brian Cameron + + sys/sunaudio/gstsunaudiomixerctrl.c: Set the mixer fd before calling ioctl() on it. Fixes bug #563414. + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_open): + Set the mixer fd before calling ioctl() on it. Fixes bug #563414. + +2008-12-07 19:01:35 +0000 Alexandre Rostovtsev + + configure.ac: Make usage of libv4l optional by a configure parameter. + Original commit message from CVS: + Patch by: Alexandre Rostovtsev + * configure.ac: + Make usage of libv4l optional by a configure parameter. + Fixes bug #563504. + +2008-12-05 09:24:18 +0000 Sebastian Dröge + + Add documentation for matroskamux and matroskademux and update the inspection xml files. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + Add documentation for matroskamux and matroskademux and + update the inspection xml files. + +2008-12-04 20:10:58 +0000 Sebastian Dröge + + configure.ac: Apparently AC_CONFIG_MACRO_DIR breaks when using more than one macro directory, reverting last change. + Original commit message from CVS: + * configure.ac: + Apparently AC_CONFIG_MACRO_DIR breaks when using more + than one macro directory, reverting last change. + +2008-12-04 19:47:21 +0000 Sebastian Dröge + + configure.ac: Set AC_CONFIG_MACRO_DIR to common/m4 to point autoconf to our M4 macros. + Original commit message from CVS: + * configure.ac: + Set AC_CONFIG_MACRO_DIR to common/m4 to point autoconf to + our M4 macros. + +2008-11-30 16:24:45 +0000 Sebastian Dröge + + gst/udp/gstmultiudpsink.c: Provide the parameters that are required for the format string to fix a compiler warning. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render): + Provide the parameters that are required for the format string + to fix a compiler warning. + +2008-11-29 20:05:41 +0000 Stefan Kost + + gst/autodetect/gstautoaudiosrc.c: Fix classification. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosrc.c: + Fix classification. + +2008-11-29 13:31:55 +0000 Sebastian Dröge + + Require gettext 0.17 because older versions don't mix with libtool 2.2. At build time an older gettext version will s... + Original commit message from CVS: + Patch by: Cygwin Ports maintainer + + * autogen.sh: + * configure.ac: + Require gettext 0.17 because older versions don't mix with libtool + 2.2. At build time an older gettext version will still work. + Fixes bug #556091. + +2008-11-28 15:10:50 +0000 Peter Kjellerstedt + + gst/udp/gstmultiudpsink.c: Make gst_multiudpsink_render() ignore errors from sendto() instead of breaking streaming. ... + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render): + Make gst_multiudpsink_render() ignore errors from sendto() instead of + breaking streaming. Emit a warning instead. Fixes #562572. + +2008-11-27 16:43:24 +0000 Ron McOuat + + Add support for basic and digest authentication in souphttpsrc. + Original commit message from CVS: + Patch by: Ron McOuat + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), + (gst_soup_http_src_init), (gst_soup_http_src_dispose), + (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), + (gst_soup_http_src_authenticate_cb), (gst_soup_http_src_start): + * ext/soup/gstsouphttpsrc.h: + * tests/check/elements/souphttpsrc.c: (basic_auth_cb), + (digest_auth_cb), (run_test), (GST_START_TEST), + (souphttpsrc_suite), (run_server): + Add support for basic and digest authentication in souphttpsrc. + Fixes bug #561775. + +2008-11-27 12:13:39 +0000 Sebastian Dröge + + gst/wavenc/: Add support for a-law and mu-law encoded wav files. Fixes bug #562434. + Original commit message from CVS: + Patch by: Pepijn Van Eeckhoudt + + * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), + (gst_wavenc_sink_setcaps), (gst_wavenc_change_state): + * gst/wavenc/gstwavenc.h: + * gst/wavenc/riff.h: + Add support for a-law and mu-law encoded wav files. Fixes bug #562434. + +2008-11-27 11:22:56 +0000 이문형 + + gst/rtsp/gstrtspsrc.c: Prevent further read/write actions taken to the connect-failed socket by erroring out quickly.... + Original commit message from CVS: + Patch by: 이문형 + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_udp): + Prevent further read/write actions taken to the connect-failed socket by + erroring out quickly. See #562258. + +2008-11-26 21:19:47 +0000 Stefan Kost + + tests/examples/level/level-example.c: Set fakesink to sync. Otherwise people might question the message interval. Nev... + Original commit message from CVS: + * tests/examples/level/level-example.c: + Set fakesink to sync. Otherwise people might question the message + interval. Nevertheless the timestamp in the message is what matters. + +2008-11-25 18:13:25 +0000 Wim Taymans + + tests/icles/.cvsignore: cvsignore newly generated file. + Original commit message from CVS: + * tests/icles/.cvsignore: + cvsignore newly generated file. + +2008-11-25 18:03:02 +0000 Wim Taymans + + gst/rtp/: Fix the descriptions and fix some email addresses. + Original commit message from CVS: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps): + * gst/rtp/gstrtpac3depay.h: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpdepay.h: + * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps): + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729pay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps): + * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps): + * gst/rtp/gstrtph263depay.h: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pay.h: + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264depay.h: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpjpegdepay.h: + * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps): + * gst/rtp/gstrtpmp1sdepay.h: + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): + * gst/rtp/gstrtpmp2tdepay.h: + * gst/rtp/gstrtpmp2tpay.c: + * gst/rtp/gstrtpmp2tpay.h: + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps): + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4apay.h: + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps): + * gst/rtp/gstrtpmp4gdepay.h: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4gpay.h: + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps): + * gst/rtp/gstrtpmp4vdepay.h: + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_event): + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpadepay.h: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmpapay.h: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtpmpvdepay.h: + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_process): + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtpsv3vdepay.h: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheoradepay.h: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtptheorapay.h: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbisdepay.h: + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): + * gst/rtp/gstrtpvorbispay.h: + * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps): + * gst/rtp/gstrtpvrawpay.c: + Fix the descriptions and fix some email addresses. + +2008-11-25 17:47:24 +0000 Julien Moutte + + gst/qtdemux/qtdemux.c: Add MPG1 and MPG2 fourcc to supported qtdemux video codecs as I found some video clips using t... + Original commit message from CVS: + 2008-11-25 Julien Moutte + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add MPG1 and MPG2 + fourcc + to supported qtdemux video codecs as I found some video clips + using + those. + +2008-11-25 16:26:16 +0000 Wim Taymans + + gst/autodetect/: Post an error when we can't set the internal ghostpad target. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_detect): + * gst/autodetect/gstautoaudiosrc.c: (gst_auto_audio_src_detect): + * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), + (gst_auto_video_sink_detect): + * gst/autodetect/gstautovideosrc.c: (gst_auto_video_src_detect): + Post an error when we can't set the internal ghostpad target. + +2008-11-25 16:06:22 +0000 Wim Taymans + + gst/videocrop/gstvideocrop.*: Fix renegotiation when changing properties using the new basetransform features. Fixes ... + Original commit message from CVS: + * gst/videocrop/gstvideocrop.c: (gst_video_crop_init), + (gst_video_crop_transform), (gst_video_crop_transform_caps), + (gst_video_crop_set_caps), (gst_video_crop_set_property): + * gst/videocrop/gstvideocrop.h: + Fix renegotiation when changing properties using the new basetransform + features. Fixes #561502. + * tests/icles/Makefile.am: + * tests/icles/videocrop2-test.c: (make_pipeline), (main): + Add crazy interactive test unit for dynamically changing properties. + +2008-11-24 12:20:29 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Add some more debugging. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (new_session_pad), + (gst_rtspsrc_parse_range): + Add some more debugging. + Use the reanges received from the server unconditionally. + Fixes #561625. + +2008-11-23 15:08:45 +0000 Stefan Kost + + ext/pulse/pulsesink.c: Change #if 0 to something more expresive and add pointer to related bug ticket. + Original commit message from CVS: + * ext/pulse/pulsesink.c: + Change #if 0 to something more expresive and add pointer to related + bug ticket. + +2008-11-23 11:17:01 +0000 Sebastian Dröge + + * ChangeLog: + ChangeLog surgery + Original commit message from CVS: + ChangeLog surgery + +2008-11-23 11:14:42 +0000 Tal Shalif + + gst/qtdemux/qtdemux.c: Use G_{BIG,LITTLE}_ENDIAN instead of the non-GLib variants as the latter don't exist on some s... + Original commit message from CVS: + Patch by: Tal Shalif + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Use G_{BIG,LITTLE}_ENDIAN instead of the non-GLib variants as + the latter don't exist on some systems (mingw). Fixes bug #561992. + +2008-11-21 13:43:29 +0000 Zeeshan Ali + + ext/soup/gstsouphttpsrc.c: Add transferMode.dnla.org header to HTTP requests as this is required by the DLNA specs an... + Original commit message from CVS: + Patch by: Zeeshan Ali + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_build_message): + Add transferMode.dnla.org header to HTTP requests as this is + required by the DLNA specs and doesn't hurt in other situations. + Fixes bug #561802. + +2008-11-20 23:59:07 +0000 Michael Smith + + sys/osxvideo/osxvideosink.*: Handle video window resizing more correctly, avoiding crashes when embedding the window ... + Original commit message from CVS: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + Handle video window resizing more correctly, avoiding crashes when + embedding the window and resizing it. + +2008-11-20 22:56:58 +0000 Michael Smith + + gst/udp/: Fix multiudpsink on OSX by passing the specific length of the socket, refactor that into a function shared ... + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpnetutils.c: + * gst/udp/gstudpnetutils.h: + * gst/udp/gstudpsrc.c: + Fix multiudpsink on OSX by passing the specific length of the socket, + refactor that into a function shared with the same thing in udpsrc. + +2008-11-20 20:07:26 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Fix the scaling code. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), + (uint64_ceiling_scale), (gst_wavparse_calculate_duration), + (gst_wavparse_stream_headers): + Fix the scaling code. + Fix parsing of the INFO chunks, we were reading the wrong number of + bytes. Fixes #561580. + +2008-11-20 14:30:40 +0000 Jan Schmidt + + gst/matroska/matroska-mux.c: Fix NULL pointer dereference of an unset codec_id in the recently added Dirac paths + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + Fix NULL pointer dereference of an unset codec_id in the recently + added Dirac paths + +2008-11-20 13:58:43 +0000 Jan Schmidt + + tests/check/Makefile.am: Just keep disabling elements that hang the states test until it works. + Original commit message from CVS: + * tests/check/Makefile.am: + Just keep disabling elements that hang the states test until it + works. + +2008-11-20 13:46:47 +0000 Jan Schmidt + + ext/libpng/gstpngenc.c: Don't flush downstream after every buffer - that's not what this libpng callback is for at all! + Original commit message from CVS: + * ext/libpng/gstpngenc.c: + Don't flush downstream after every buffer - that's not what + this libpng callback is for at all! + +2008-11-17 14:04:20 +0000 Tim-Philipp Müller + + sys/v4l2/v4l2src_calls.c: Turns out we don't always get the frame sizes in a predefined order from lowest to highest ... + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: + (gst_v4l2src_probe_caps_for_format_and_size), (sort_by_frame_size), + (gst_v4l2src_probe_caps_for_format): + Turns out we don't always get the frame sizes in a predefined + order from lowest to highest resolution, so let's just sort the + list by frame size once we've queried the possible resolutions + rather than assume any particular order. Fixes probed caps for + the camera in my HP2133 mini notebook and makes v4l2src default + to a decent size. + +2008-11-16 14:41:32 +0000 Edward Hervey + + gst/matroska/: Make mkvdemux aware of E-AC3. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): + * gst/matroska/matroska-ids.h: + Make mkvdemux aware of E-AC3. + +2008-11-14 18:41:29 +0000 Wim Taymans + + gst/rtp/: Add a jpeg depayloader. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpjpegdepay.c: (gst_rtp_jpeg_depay_base_init), + (gst_rtp_jpeg_depay_class_init), (gst_rtp_jpeg_depay_init), + (gst_rtp_jpeg_depay_finalize), (MakeTables), (MakeQuantHeader), + (MakeHuffmanHeader), (MakeDRIHeader), (MakeHeaders), + (gst_rtp_jpeg_depay_setcaps), (gst_rtp_jpeg_depay_process), + (gst_rtp_jpeg_depay_change_state), + (gst_rtp_jpeg_depay_plugin_init): + * gst/rtp/gstrtpjpegdepay.h: + Add a jpeg depayloader. + * gst/rtp/gstrtpjpegpay.c: + Set the default properties on the payloader to better defaults. + +2008-11-14 15:42:32 +0000 Stefan Kost + + sys/v4l2/gstv4l2.c: Give it a primary rank for autovideosrc. + Original commit message from CVS: + * sys/v4l2/gstv4l2.c: + Give it a primary rank for autovideosrc. + +2008-11-14 11:41:55 +0000 Bjorn Ostby + + gst/rtp/: Add JPEG payloader. Fixes #560756. + Original commit message from CVS: + Patch by: Bjorn Ostby + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpjpegpay.c: (gst_rtp_jpeg_pay_base_init), + (gst_rtp_jpeg_pay_class_init), (gst_rtp_jpeg_pay_init), + (gst_rtp_jpeg_pay_setcaps), (gst_rtp_jpeg_pay_header_size), + (gst_rtp_jpeg_pay_read_quant_table), + (gst_rtp_jpeg_pay_scan_marker), (gst_rtp_jpeg_pay_handle_buffer), + (gst_rtp_jpeg_pay_set_property), (gst_rtp_jpeg_pay_get_property), + (gst_rtp_jpeg_pay_plugin_init): + * gst/rtp/gstrtpjpegpay.h: + Add JPEG payloader. Fixes #560756. + +2008-11-13 17:45:59 +0000 Fabricio Godoy + + sys/: Fix some spelling mistakes. Fixes #556802. + Original commit message from CVS: + Patch by: Fabricio Godoy + * sys/oss/gstosssink.c: (gst_oss_sink_open): + * sys/oss/gstosssrc.c: (gst_oss_src_open): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_mmap): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + Fix some spelling mistakes. Fixes #556802. + +2008-11-13 16:24:59 +0000 Stefan Kost + + gst/equalizer/: Add presets for equalizer. Fixes #522183. + Original commit message from CVS: + * gst/equalizer/GstIirEqualizer10Bands.prs: + * gst/equalizer/GstIirEqualizer3Bands.prs: + * gst/equalizer/Makefile.am: + * gst/equalizer/gstiirequalizer10bands.c: + * gst/equalizer/gstiirequalizer3bands.c: + Add presets for equalizer. Fixes #522183. + +2008-11-13 16:17:38 +0000 Wim Taymans + + gst/rtsp/: Remove google extension again, it's not needed anymore because we never send multiple transports anymore. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/gstrtsp.c: (plugin_init): + * gst/rtsp/gstrtspgoogle.c: + * gst/rtsp/gstrtspgoogle.h: + Remove google extension again, it's not needed anymore because we never + send multiple transports anymore. + +2008-11-13 16:11:16 +0000 Eric Zhang + + gst/rtsp/gstrtspsrc.*: Add property to configure NAT traversal method. + Original commit message from CVS: + Based on patch by: Eric Zhang + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_nat_method_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_set_property), + (gst_rtspsrc_get_property), (gst_rtspsrc_create_stream), + (gst_rtspsrc_stream_free), + (gst_rtspsrc_stream_configure_udp_sinks), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_send_dummy_packets), + (gst_rtspsrc_create_transports_string), + (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Add property to configure NAT traversal method. + Ignore EOS from the internal sinks. + Implement sending dummy packets as a (simple) method to open up + some firewalls. + Send PLAY request to the server after we started the udp sources. + Fixes #559545. + +2008-11-13 14:04:40 +0000 Yotam + + gst/rtp/gstrtpmp4vpay.c: Flush the remaining frames on EOS. Fixes #560641. + Original commit message from CVS: + Patch by: Yotam + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_event): + Flush the remaining frames on EOS. Fixes #560641. + +2008-11-12 16:37:06 +0000 Jan Schmidt + + gst/rtp/gstrtpg729pay.c: Fix compiler warning about printf formatting. + Original commit message from CVS: + * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_handle_buffer): + Fix compiler warning about printf formatting. + +2008-11-12 11:55:14 +0000 Andy Wingo + + gst/qtdemux/qtdemux.*: Queue up new segment events instead of sending them from the seeking thread. + Original commit message from CVS: + * gst/qtdemux/qtdemux.h (struct _GstQTDemux): + * gst/qtdemux/qtdemux.c (gst_qtdemux_do_seek): Queue up new + segment events instead of sending them from the seeking thread. + Fixes #559288. + (gst_qtdemux_push_pending_newsegment): New helper, sends out + queued newsegment events. + (gst_qtdemux_loop_state_movie): Voilà, call it here. Only need to + call it here, as we only seek when looping, and only push in the + movie state. + +2008-11-11 19:52:05 +0000 Mark Nauwelaerts + + gst/qtdemux/: Add cover and alternative copyright tag, and enhance some existing ones by marking them as container at... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_tmpo), + (qtdemux_tag_add_covr), (qtdemux_parse_udta): + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + Add cover and alternative copyright tag, and enhance some existing + ones by marking them as container atoms. + +2008-11-11 17:33:00 +0000 Wim Taymans + + gst/rtp/gstrtpg729pay.c: Don't ignore the return value of setcaps. + Original commit message from CVS: + * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_set_caps): + Don't ignore the return value of setcaps. + +2008-11-11 17:29:03 +0000 Olivier Crete + + gst/rtp/gstrtpg729pay.*: Replace G729 payloader with an improved version. Fixes #532409. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_base_init), + (gst_rtp_g729_pay_class_init), (gst_rtp_g729_pay_init), + (gst_rtp_g729_pay_set_caps), (gst_rtp_g729_pay_handle_buffer): + * gst/rtp/gstrtpg729pay.h: + Replace G729 payloader with an improved version. Fixes #532409. + +2008-11-11 16:00:48 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Only send one transport at a time for improved compatibility with some broken servers. See #53... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_transports_string), + (gst_rtspsrc_change_state): + Only send one transport at a time for improved compatibility with some + broken servers. See #537832. + +2008-11-11 15:16:31 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Only pause/play in the seek handler when the source was playing. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_do_seek), + (gst_rtspsrc_perform_seek): + Only pause/play in the seek handler when the source was playing. + Fixes #529379. + +2008-11-11 12:18:23 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.c: Fix muxing of Dirac streams if the input already has the format we need, i.e. is the out... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_handle_dirac_packet): + Fix muxing of Dirac streams if the input already has the format + we need, i.e. is the output of matroskademux. + +2008-11-11 10:06:01 +0000 Stefan Kost + + gst/avi/gstavimux.c: Don't segfault on string typed tags being NULL. Fixes #560155. + Original commit message from CVS: + * gst/avi/gstavimux.c: + Don't segfault on string typed tags being NULL. Fixes #560155. + +2008-11-10 16:44:45 +0000 Mark Nauwelaerts + + gst/matroska/matroska-mux.c: Fix mapping AAC profile to Matroska codec id. + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (aac_codec_data_to_codec_id), + (gst_matroska_mux_audio_pad_setcaps): + Fix mapping AAC profile to Matroska codec id. + +2008-11-10 16:36:09 +0000 Mark Nauwelaerts + + gst/qtdemux/qtdemux.c: Refactor some raw audio caps building, and handle >16-bit cases. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), + (qtdemux_video_caps), (qtdemux_audio_caps): + Refactor some raw audio caps building, and handle >16-bit cases. + Fix/replace building caps from a string description. + +2008-11-10 13:59:27 +0000 Thomas Vander Stichele + + gst/: Make author name consistent with others. + Original commit message from CVS: + * gst/audiofx/audiowsincband.c: + * gst/audiofx/audiowsinclimit.c: + * gst/cutter/gstcutter.c: + Make author name consistent with others. + +2008-11-10 12:13:21 +0000 Eric Zhang + + gst/rtsp/gstrtspsrc.c: Pause the RTSP stream before doing a new play request. + Original commit message from CVS: + Based on patch by: Eric Zhang + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_perform_seek), + (gst_rtspsrc_stream_configure_udp_sink): + Pause the RTSP stream before doing a new play request. + Make sure that adding the udpsinks does not cause the rtspsrc to become + a sink. Fixes #559547. + +2008-11-05 14:42:35 +0000 Sebastian Dröge + + gst/matroska/: Implement Dirac muxing into Matroska comforming to the spec, i.e. put all Dirac packages up to a pictu... + Original commit message from CVS: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: (gst_matroska_pad_free), + (gst_matroska_mux_handle_dirac_packet), + (gst_matroska_mux_write_data): + Implement Dirac muxing into Matroska comforming to the spec, i.e. + put all Dirac packages up to a picture into a Matroska block. + TODO: Implement writing of the ReferenceBlock Matroska elements, + currently the Dirac muxing is only 100% correct if Matroska version 2 + is selected for muxing. + +2008-11-04 12:32:48 +0000 Bastien Nocera + + Optionally use libv4l to access v4l2 devices. Fixes bug #545033. + Original commit message from CVS: + Patch by: Bastien Nocera , + Hans de Goede + * configure.ac: + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_close), + (gst_v4l2_get_norm), (gst_v4l2_set_norm), (gst_v4l2_get_frequency), + (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), + (gst_v4l2_get_attribute), (gst_v4l2_set_attribute), + (gst_v4l2_get_input), (gst_v4l2_set_input): + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), + (gst_v4l2_buffer_new), (gst_v4l2_buffer_pool_finalize), + (gst_v4l2_buffer_pool_new), (gst_v4l2_buffer_pool_activate), + (gst_v4l2src_fill_format_list), + (gst_v4l2src_probe_caps_for_format_and_size), + (gst_v4l2src_probe_caps_for_format), (gst_v4l2src_grab_frame), + (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), + (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop), + (gst_v4l2src_get_nearest_size): + Optionally use libv4l to access v4l2 devices. Fixes bug #545033. + +2008-11-04 12:28:34 +0000 Stefan Kost + + 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-10-31 18:17:50 +0000 Sebastian Dröge + + ext/flac/Makefile.am: Include $(FLAC_CFLAGS) in CFLAGS to make sure to find the FLAC headers. + Original commit message from CVS: + * ext/flac/Makefile.am: + Include $(FLAC_CFLAGS) in CFLAGS to make sure to find the FLAC headers. + This fixes compilation if FLAC is installed in an uncommon location + that is not already handled by other CFLAGS. Fixes bug #558711. + +2008-10-31 10:08:50 +0000 Wim Taymans + + sys/v4l2/v4l2src_calls.c: Guard more uncommon formats with ifdefs so that we can compile on older versions. + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_format_get_rank): + Guard more uncommon formats with ifdefs so that we can compile on older + versions. + +2008-10-31 10:00:18 +0000 Nick Haddad + + gst/avi/gstavidemux.c: Invert other uncompressed RGB formats. Fixes #558554. + Original commit message from CVS: + Patch by: Nick Haddad + * gst/avi/gstavidemux.c: (gst_avi_demux_is_uncompressed), + (gst_avi_demux_invert), (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data): + Invert other uncompressed RGB formats. Fixes #558554. + +2008-10-30 15:08:49 +0000 Sebastian Dröge + + gst/wavenc/gstwavenc.*: Add support for float/double as input and remove the (nowadays) useless parsing of the depth ... + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), + (gst_wavenc_sink_setcaps), (gst_wavenc_change_state): + * gst/wavenc/gstwavenc.h: + Add support for float/double as input and remove the (nowadays) + useless parsing of the depth as we require width==depth. + +2008-10-30 10:31:35 +0000 Wim Taymans + + gst/rtp/: Narrow down the caps of the mpeg audio pay/depayloaders to only accept mpeg version 1. Fixes #558427. + Original commit message from CVS: + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps): + * gst/rtp/gstrtpmpapay.c: + Narrow down the caps of the mpeg audio pay/depayloaders to only accept + mpeg version 1. Fixes #558427. + +2008-10-29 18:28:25 +0000 Wim Taymans + + gst/rtp/gstrtpL16pay.c: Only put an integral amount of samples in the RTP packet. + Original commit message from CVS: + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_flush), + (gst_rtp_L16_pay_getcaps): + Only put an integral amount of samples in the RTP packet. + Fixes #556641. + +2008-10-28 17:42:02 +0000 Wim Taymans + + gst/rtp/gstrtpchannels.*: Add method to get possible channel positions. + Original commit message from CVS: + * gst/rtp/gstrtpchannels.c: (gst_rtp_channels_get_by_index): + * gst/rtp/gstrtpchannels.h: + Add method to get possible channel positions. + +2008-10-28 17:39:48 +0000 Wim Taymans + + gst/rtp/Makefile.am: Also commit updated makefile + Original commit message from CVS: + * gst/rtp/Makefile.am: + Also commit updated makefile + +2008-10-28 14:56:08 +0000 Sebastian Dröge + + gst/wavenc/gstwavenc.c: Don't allow width=32,depth=24 as input. WAV requires that the width is the next integer multi... + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + Don't allow width=32,depth=24 as input. WAV requires that the width + is the next integer multiply of 8 from the depth. + +2008-10-28 10:01:49 +0000 Wim Taymans + + gst/rtp/: Add mappings for multichannel support. Does not completely just work because the getcaps function does not ... + Original commit message from CVS: + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), + (gst_rtp_L16_pay_getcaps): + * gst/rtp/gstrtpchannels.c: (check_channels), + (gst_rtp_channels_get_by_pos), (gst_rtp_channels_get_by_order), + (gst_rtp_channels_create_default): + * gst/rtp/gstrtpchannels.h: + Add mappings for multichannel support. Does not completely just work + because the getcaps function does not yet return the allowed channel + mappings. See #556641. + +2008-10-28 06:50:57 +0000 Stefan Kost + + gst/goom/: Add license headers in all source files. Remove filter.c from + Original commit message from CVS: + * gst/goom/Makefile.am: + * gst/goom/README: + * gst/goom/config_param.c: + * gst/goom/convolve_fx.c: + * gst/goom/drawmethods.c: + * gst/goom/drawmethods.h: + * gst/goom/filters.c: + * gst/goom/filters_mmx.s: + * gst/goom/flying_stars_fx.c: + * gst/goom/goom.h: + * gst/goom/goom_config.h: + * gst/goom/goom_config_param.h: + * gst/goom/goom_core.c: + * gst/goom/goom_filters.h: + * gst/goom/goom_fx.h: + * gst/goom/goom_graphic.h: + * gst/goom/goom_plugin_info.h: + * gst/goom/goom_tools.c: + * gst/goom/goom_tools.h: + * gst/goom/goom_typedefs.h: + * gst/goom/goom_visual_fx.h: + * gst/goom/graphic.c: + * gst/goom/ifs.c: + * gst/goom/ifs.h: + * gst/goom/lines.c: + * gst/goom/lines.h: + * gst/goom/mathtools.c: + * gst/goom/mathtools.h: + * gst/goom/mmx.c: + * gst/goom/motif_goom1.h: + * gst/goom/motif_goom2.h: + * gst/goom/plugin_info.c: + * gst/goom/ppc_drawings.h: + * gst/goom/ppc_zoom_ultimate.h: + * gst/goom/sound_tester.c: + * gst/goom/sound_tester.h: + * gst/goom/surf3d.c: + * gst/goom/surf3d.h: + * gst/goom/tentacle3d.c: + * gst/goom/tentacle3d.h: + * gst/goom/v3d.c: + * gst/goom/v3d.h: + * gst/goom/xmmx.c: + Add license headers in all source files. Remove filter.c from + EXTRA_DIST, as its in SOURCES already. Mention the files in the REDME + which are not used right now. Fixes #557709. + +2008-10-27 11:28:30 +0000 Olivier Crete + + gst/rtp/gstrtpL16pay.c: Implement getcaps in rtpL16pay. Fixes #556484. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_class_init), + (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps): + Implement getcaps in rtpL16pay. Fixes #556484. + +2008-10-27 11:03:53 +0000 Wim Taymans + + gst/rtp/gstrtpL16depay.c: Check if clock-rate and channels are valid. + Original commit message from CVS: + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps), + (gst_rtp_L16_depay_process): + Check if clock-rate and channels are valid. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + Use the marker bit to set the DISCONT flag on outgoing buffers. + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps), + (gst_rtp_ac3_depay_process): + Don't ignore the return value of set_caps. + No need to validate the buffer, the base class does that for us. + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), + (gst_rtp_amr_depay_process): + * gst/rtp/gstrtpamrdepay.h: + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + No need to set output caps on the buffers, the base class does that for + us. + The subclass will make sure we are negotiated. + * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps), + (gst_rtp_dv_depay_process), (gst_rtp_dv_depay_reset): + * gst/rtp/gstrtpdvdepay.h: + Clean up caps negotiation. + The subclass will make sure we are negotiated. + * gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_setcaps), + (gst_rtp_g726_depay_process): + Clean up caps negotiation. + Use the marker bit to set the DISCONT flag on outgoing buffers. + * gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_init), + (gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process): + * gst/rtp/gstrtpg729depay.h: + The subclass will make sure we are negotiated. + Use the marker bit to set the DISCONT flag on outgoing buffers. + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_setcaps), + (gst_rtp_gsm_depay_process): + Clean up caps negotiation. + Use the marker bit to set the DISCONT flag on outgoing buffers. + * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps): + Clean up caps negotiation. + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps), + (gst_rtp_h263_depay_process): + Clean up caps negotiation. + No need to validate the buffer, the base class does that for us. + * gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_setcaps), + (gst_rtp_h263_pay_flush), (gst_rtp_h263_pay_handle_buffer): + * gst/rtp/gstrtph263pay.h: + Don't ignore the return value of set_outcaps. + Do some more timestamps. + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), + (gst_rtp_h263p_depay_process): + Clean up caps negotiation. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + * gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init), + (gst_rtp_h263p_pay_setcaps), (gst_rtp_h263p_pay_flush), + (gst_rtp_h263p_pay_handle_buffer): + * gst/rtp/gstrtph263ppay.h: + Don't ignore the return value of set_outcaps. + Do some more timestamps. + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps), + (gst_rtp_h264_depay_process): + Clean up caps negotiation. + Don't ignore the return value of setcaps. + Fix possible caps leak. + No need to validate the buffer, the base class does that for us. + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps): + Add some more debug info. + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps), + (gst_rtp_ilbc_depay_process): + Clean up caps negotiation. + Use the marker bit to set the DISCONT flag on outgoing buffers. + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_sink_setcaps): + Clean up caps negotiation. + * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps), + (gst_rtp_mp1s_depay_process): + Clean up caps negotiation. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + No need to set caps on buffers, subclass does that for us. + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps), + (gst_rtp_mp2t_depay_process): + Clean up caps negotiation. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + No need to set caps on buffers, subclass does that for us. + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps), + (gst_rtp_mp4a_depay_process): + Clean up caps negotiation. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_new_caps), + (gst_rtp_mp4a_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps), + (gst_rtp_mp4g_depay_process): + Clean up caps negotiation. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + No need to set caps on buffers, subclass does that for us. + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize), + (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), + (gst_rtp_mp4v_depay_process): + Clean up caps negotiation. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + No need to set caps on buffers, subclass does that for us. + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_new_caps), + (gst_rtp_mp4v_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps), + (gst_rtp_mpa_depay_process): + Clean up caps negotiation. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + Use the marker bit to set the DISCONT flag on outgoing buffers. + * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_setcaps), + (gst_rtp_mpv_depay_process): + Clean up caps negotiation. + Actually set output caps. + No need to validate the buffer, the base class does that for us. + * gst/rtp/gstrtpmpvpay.c: (gst_rtp_mpv_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps), + (gst_rtp_pcma_depay_process): + Clean up caps negotiation. + Set output buffer duration because we can. + Use the marker bit to set the DISCONT flag on outgoing buffers. + * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps), + (gst_rtp_pcmu_depay_process): + Clean up caps negotiation. + Use the marker bit to set the DISCONT flag on outgoing buffers. + * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init), + (gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process): + Clean up caps negotiation. + Set output caps on the pad and header buffers. + Set duration on output buffers because we can. + * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_parse_ident): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_setcaps), + (gst_rtp_sv3v_depay_process): + Clean up caps negotiation. + No need to validate the buffer, the base class does that for us. + No need to set caps out output buffers, subclass does that. + * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps), + (gst_rtp_theora_depay_process): + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_class_init), + (gst_rtp_theora_pay_flush_packet), (encode_base64), + (gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id), + (gst_rtp_theora_pay_handle_buffer): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps), + (gst_rtp_vorbis_depay_process): + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps): + Clean up caps negotiation, don't ignore setcaps return. + * gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_setcaps): + Don't ignore the return value of set_outcaps. + +2008-10-27 10:35:07 +0000 Wim Taymans + + gst/matroska/matroska-demux.c: Forward unknown events upstream. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_src_event): + Forward unknown events upstream. + +2008-10-27 10:33:20 +0000 Wim Taymans + + tests/check/elements/icydemux.c: Add some refcount check + Original commit message from CVS: + * tests/check/elements/icydemux.c: (icydemux_found_pad): + Add some refcount check + * tests/check/elements/rtp-payloading.c: (rtp_pipeline_run): + Don't ignore the result of write(), fixes a compiler warning for me. + * tests/icles/videobox-test.c: (main): + Make the output a little more pretty. + +2008-10-27 09:26:19 +0000 Stefan Kost + + ext/esd/esdmon.c: Add doc blob. + Original commit message from CVS: + * ext/esd/esdmon.c: + Add doc blob. + +2008-10-27 09:21:44 +0000 Stefan Kost + + docs/plugins/: Add the docs of the new elements. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-autodetect.xml: + Add the docs of the new elements. + +2008-10-27 09:04:37 +0000 Sebastian Dröge + + gst/autodetect/: Fix "Since" tags in the documentation. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosrc.c: + (gst_auto_audio_src_class_init): + * gst/autodetect/gstautovideosrc.c: + (gst_auto_video_src_class_init): + Fix "Since" tags in the documentation. + +2008-10-27 09:00:29 +0000 Sjoerd Simons + + ext/soup/gstsouphttpsrc.c: Add support for souphttpsrc to act as a live source. This makes it possible to get timesta... + Original commit message from CVS: + Patch by: Sjoerd Simons + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), + (gst_soup_http_src_set_property), (gst_soup_http_src_get_property): + Add support for souphttpsrc to act as a live source. This makes it + possible to get timestamped buffers in combination with the + "do-timestamp" property. Fixes bug #556019. + +2008-10-27 08:54:30 +0000 Stefan Kost + + gst/autodetect/: Implement src plugins. Little code/string cleanup in the sinks. + Original commit message from CVS: + * gst/autodetect/Makefile.am: + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautoaudiosrc.c: + * gst/autodetect/gstautoaudiosrc.h: + * gst/autodetect/gstautodetect.c: + * gst/autodetect/gstautovideosink.c: + * gst/autodetect/gstautovideosrc.c: + * gst/autodetect/gstautovideosrc.h: + Implement src plugins. Little code/string cleanup in the sinks. + Fixes #523813. + +2008-10-27 08:45:11 +0000 Peter Kjellerstedt + + gst/matroska/matroska-mux.c: Fix a memory leak when pads are requested but the pipeline never goes into PLAYING. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), + (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad): + Fix a memory leak when pads are requested but the pipeline never + goes into PLAYING. + Correctly remove request pads, no matter if they have collected + data or not. + Fixes bug #557710. + +2008-10-27 08:40:02 +0000 Sebastian Dröge + + gst/udp/gstudpnetutils.h: Define the correct WINVER so getaddinfo() can be used when using mingw32. Fixes bug #557294. + Original commit message from CVS: + Patch by: + * gst/udp/gstudpnetutils.h: + Define the correct WINVER so getaddinfo() can be used when using + mingw32. Fixes bug #557294. + +2008-10-27 08:36:43 +0000 Sebastian Dröge + + gst/udp/: Fix "argument type mismatch" compiler warnings on Windows. + Original commit message from CVS: + Patch by: + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_render): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render): + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Fix "argument type mismatch" compiler warnings on Windows. + Fixes bug #557293. + +2008-10-27 08:30:51 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.c: Don't calculate the filter coefficients for every single buffer but only when it's n... + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: (update_coefficients): + Don't calculate the filter coefficients for every single buffer + but only when it's needed. Fixes bug #557260. + +2008-10-26 20:05:43 +0000 Jan Schmidt + + configure.ac: Back to development -> 0.10.11.1 + Original commit message from CVS: + * configure.ac: + Back to development -> 0.10.11.1 + +2008-10-26 20:04:21 +0000 Jan Schmidt + + gst-plugins-good.doap: Fix version number of 0.10.11 release in doap file + Original commit message from CVS: + * gst-plugins-good.doap: + Fix version number of 0.10.11 release in doap file + +=== release 0.10.11 === + +2008-10-24 22:41:18 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.11 + Original commit message from CVS: + Release 0.10.11 + +2008-10-24 22:20:47 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.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/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + Original commit message from CVS: + Update .po files + +2008-10-24 16:30:53 +0000 Jan Schmidt + + configure.ac: Commit 0.10.10.4 pre-release + Original commit message from CVS: + * configure.ac: + Commit 0.10.10.4 pre-release + +2008-10-21 12:42:45 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Fix VPRP chunk setup in avimux. + Original commit message from CVS: + * gst/avi/gstavimux.c: + Fix VPRP chunk setup in avimux. + Fixes: #556010 + Patch By: Mark Nauwelaerts + +2008-10-21 12:38:35 +0000 Wim Taymans + + gst/videobox/gstvideobox.c: support dynamically changing properties in videobox + Original commit message from CVS: + * gst/videobox/gstvideobox.c: + support dynamically changing properties in videobox + Fixed: #557085 + Patch By: Wim Taymans + +2008-10-16 17:10:42 +0000 Jan Schmidt + + configure.ac: 0.10.10.3 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.10.3 pre-release + +2008-10-16 15:30:22 +0000 Jan Schmidt + + tests/check/Makefile.am: Don't run the states test on pulsesrc and pulsesink + Original commit message from CVS: + * tests/check/Makefile.am: + Don't run the states test on pulsesrc and pulsesink + +2008-10-16 11:52:44 +0000 Jan Schmidt + + configure.ac: Commit 0.10.10.2 pre-release bump that actually went out on 2008-10-11 + Original commit message from CVS: + * configure.ac: + Commit 0.10.10.2 pre-release bump that actually went + out on 2008-10-11 + +2008-10-15 15:42:29 +0000 Edward Hervey + + gst/avi/gstavidemux.c: Skip entries for streams that don't have a output pad yet, thereby avoiding calling pad functi... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_scan): + Skip entries for streams that don't have a output pad yet, thereby + avoiding calling pad functions with a NULL pad. + Fixes #556424 + +2008-10-15 09:39:27 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Remove previous wrong commit + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: Remove previous wrong commit + * tests/check/elements/icydemux.c: (icydemux_found_pad): + Remove problematic and useless refcount check. + Fixes #556381 + +2008-10-15 09:27:27 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Remove problematic and useless refcount check. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_node): + Remove problematic and useless refcount check. + Fixes #556381 + +2008-10-10 12:28:34 +0000 Jan Schmidt + + ext/flac/: Cast some size_t arguments to guint to avoid compiler warnings on 64-bit systems. + Original commit message from CVS: + * ext/flac/gstflacdec.c (gst_flac_dec_read_stream): + * ext/flac/gstflacenc.c (gst_flac_enc_write_callback): + Cast some size_t arguments to guint to avoid compiler + warnings on 64-bit systems. + +2008-10-09 14:27:12 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Return TRUE instead of FALSE from the event handler when we swallowed the event. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_handle_src_event): + Return TRUE instead of FALSE from the event handler when we swallowed the + event. + +2008-10-08 15:59:56 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + remove old CDIO plugin now in ugly + Original commit message from CVS: + remove old CDIO plugin now in ugly + +2008-10-08 14:47:14 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Reset header state. Fixes #555321. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_index): + Reset header state. Fixes #555321. + +2008-10-08 13:31:44 +0000 Wim Taymans + + gst/avi/gstavidemux.*: For timestamping audio packets we need to take into account the amount of blocks in one entry ... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex), + (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index): + * gst/avi/gstavidemux.h: + For timestamping audio packets we need to take into account the + amount of blocks in one entry using the blockalign. Fixes some sync + issues with zero-padded audio blocks in the beginning of avi files. + +2008-10-08 10:42:26 +0000 Wim Taymans + + gst/multifile/gstmultifilesrc.c: Implement DEFAULT and BUFFER position queries. See #555260. + Original commit message from CVS: + * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_class_init), + (gst_multi_file_src_query): + Implement DEFAULT and BUFFER position queries. See #555260. + +2008-10-08 09:29:00 +0000 Edward Hervey + + sys/ximage/gstximagesrc.c: Fix build for systems that don't have XDamage. + Original commit message from CVS: + * sys/ximage/gstximagesrc.c: (gst_ximage_src_stop): + Fix build for systems that don't have XDamage. + +2008-10-07 09:58:13 +0000 Wim Taymans + + tests/examples/rtp/: Add some more H263p server and client examples. + Original commit message from CVS: + * tests/examples/rtp/client-H263p.sdp: + * tests/examples/rtp/client-H263p.sh: + * tests/examples/rtp/server-VTS-H263p.sh: + Add some more H263p server and client examples. + +2008-10-03 17:03:07 +0000 Tim-Philipp Müller + + configure.ac: Depend on released versions of core and base. + Original commit message from CVS: + * configure.ac:: + Depend on released versions of core and base. + +2008-10-03 16:13:32 +0000 Wim Taymans + + ext/pulse/: Return -1 instead of 0 in error cases. Fixes #554771. + Original commit message from CVS: + * ext/pulse/pulsesink.c: (gst_pulsesink_write): + * ext/pulse/pulsesrc.c: (gst_pulsesrc_read): + Return -1 instead of 0 in error cases. Fixes #554771. + +2008-10-03 15:54:07 +0000 Wim Taymans + + sys/ximage/gstximagesrc.c: Stop leaking the cursor image. + Original commit message from CVS: + * sys/ximage/gstximagesrc.c: (gst_ximage_src_start), + (gst_ximage_src_stop), (gst_ximage_src_ximage_get): + Stop leaking the cursor image. + Unref the last_ximage and the cached cursor image on shutdown. + Fixes #551570. + +2008-10-03 11:32:47 +0000 Wim Taymans + + sys/v4l2/gstv4l2object.h: Getting the Class from an instance is not just a matter of casting it to the class struct b... + Original commit message from CVS: + * sys/v4l2/gstv4l2object.h: + Getting the Class from an instance is not just a matter of casting it to + the class struct but it involves calling G_OBJECT_GET_CLASS on the + instance. Fixes #549784. + +2008-10-01 21:22:26 +0000 Michael Smith + + configure.ac: Fix libs for linking directsound. + Original commit message from CVS: + * configure.ac: + Fix libs for linking directsound. + * sys/directsound/gstdirectsoundsink.c: + Fix buffer sizing to prevent racing the ringbuffer at startup. + Add volume property. + +2008-09-27 00:43:07 +0000 Jan Schmidt + + ext/pulse/pulsesink.c: Fix problems with pulsesink randomly erroring with code 'OK' after a format change on the stre... + Original commit message from CVS: + * ext/pulse/pulsesink.c: + Fix problems with pulsesink randomly erroring with code 'OK' after a + format change on the stream by waiting when disconnecting the stream. + +2008-09-26 14:44:49 +0000 Wim Taymans + + gst/rtp/gstrtpamrdepay.c: Mark DISCONT on output buffers when the marker bit signals a new talk spurt. + Original commit message from CVS: + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_class_init), + (gst_rtp_amr_depay_process): + Mark DISCONT on output buffers when the marker bit signals a new talk + spurt. + * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_handle_buffer): + Set the marker bit for buffers with a DISCONT flag to signal a talk + spurt. + +2008-09-26 13:55:48 +0000 Wim Taymans + + gst/rtp/: Added MP4A-LATM payloader to match the depayloader. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_get_type), + (gst_rtp_mp4a_pay_base_init), (gst_rtp_mp4a_pay_class_init), + (gst_rtp_mp4a_pay_init), (gst_rtp_mp4a_pay_finalize), + (gst_rtp_mp4a_pay_parse_audio_config), (gst_rtp_mp4a_pay_new_caps), + (gst_rtp_mp4a_pay_setcaps), (gst_rtp_mp4a_pay_handle_buffer), + (gst_rtp_mp4a_pay_change_state), (gst_rtp_mp4a_pay_plugin_init): + * gst/rtp/gstrtpmp4apay.h: + Added MP4A-LATM payloader to match the depayloader. + +2008-09-25 15:11:16 +0000 Wim Taymans + + gst/videomixer/videomixer.c: Handle segments a little better. Fixes #537361. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_fill_queues), + (gst_videomixer_sink_event): + Handle segments a little better. Fixes #537361. + +2008-09-25 12:07:46 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Don't assume the server supports PAUSE by default. Fixes #551048. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_methods): + Don't assume the server supports PAUSE by default. Fixes #551048. + +2008-09-25 11:30:35 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Switch on the socket family to get the addrlen size right. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_set_uri), (gst_udpsrc_start): + Switch on the socket family to get the addrlen size right. + +2008-09-25 10:34:39 +0000 Daniel Franke + + gst/udp/gstudpsrc.c: OS X's bind() implementation is picky about its addrlen parameter and fails with EINVAL if it is... + Original commit message from CVS: + Patch by: Daniel Franke + * gst/udp/gstudpsrc.c: (gst_udpsrc_create), (gst_udpsrc_start): + OS X's bind() implementation is picky about its addrlen parameter and + fails with EINVAL if it is larger than expected for the socket's address + family. Set the length to the expected length instead. Fixes #553191. + +2008-09-23 18:08:56 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Handle the case where we cannot do desribe or when the describe result does not contain a vali... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): + Handle the case where we cannot do desribe or when the describe result + does not contain a valid SDP message. + +2008-09-23 17:31:22 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.c: Fix setting the qos. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_set_property): + Fix setting the qos. + +2008-09-17 14:50:42 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Some 'broken' files out there have atom lengths of zero... which basically results in qtdemux ... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header), + (gst_qtdemux_chain): + Some 'broken' files out there have atom lengths of zero... + which basically results in qtdemux consuming that atom again and again + until the *end of night* ! + Detect that and emits an adequate element error message. + +2008-09-17 13:49:04 +0000 Jan Schmidt + + gst/: Fix build flags order. + Original commit message from CVS: + * gst/interleave/Makefile.am: + * gst/matroska/Makefile.am: + Fix build flags order. + * tests/check/elements/audioamplify.c: (GST_START_TEST): + * tests/check/elements/audiodynamic.c: (GST_START_TEST): + * tests/check/elements/audioinvert.c: (GST_START_TEST): + * tests/check/elements/audiopanorama.c: (GST_START_TEST): + Format fixes. + * tests/check/elements/multifile.c: + Pull in unistd.h + +2008-09-15 21:10:23 +0000 Wim Taymans + + gst/rtp/gstrtpmp4gdepay.*: Handle interleaved streams by reordering AU in a queue. + Original commit message from CVS: + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_init), + (gst_rtp_mp4g_depay_finalize), (gst_rtp_mp4g_depay_setcaps), + (gst_rtp_mp4g_depay_clear_queue), (gst_rtp_mp4g_depay_flush_queue), + (gst_rtp_mp4g_depay_queue), (gst_rtp_mp4g_depay_process), + (gst_rtp_mp4g_depay_change_state): + * gst/rtp/gstrtpmp4gdepay.h: + Handle interleaved streams by reordering AU in a queue. + +2008-09-15 16:04:26 +0000 Wim Taymans + + gst/rtp/gstrtpmp4gdepay.c: Change some of the ranges in the caps, mostly for the amount of bits we can use. + Original commit message from CVS: + * gst/rtp/gstrtpmp4gdepay.c: (gst_bs_parse_init), + (gst_bs_parse_read), (gst_rtp_mp4g_depay_process): + Change some of the ranges in the caps, mostly for the amount of bits we + can use. + Added a little bitstream parse and use it to parse the AU header fields. + Check for malformed and wrongly sized packets better. + Implement more header field parsing. + Handle the size of fragmented packets correctly. + +2008-09-14 11:32:15 +0000 Jonathan Matthew + + gst/qtdemux/qtdemux.c: Add mapping for 'tiff' => image/tiff + Original commit message from CVS: + Patch by: Jonathan Matthew + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add mapping for 'tiff' => image/tiff + Fixes #552213 + +2008-09-11 11:26:06 +0000 Tim-Philipp Müller + + ext/raw1394/: Pretend to care about the result of write() which works around compiler warnings. + Original commit message from CVS: + * ext/raw1394/gstdv1394src.c: (SEND_COMMAND): + * ext/raw1394/gsthdv1394src.c: (SEND_COMMAND): + Pretend to care about the result of write() which works around + compiler warnings. + +2008-09-04 09:25:59 +0000 Tim-Philipp Müller + + ext/flac/gstflacenc.c: Make sure the desired default values are actually set, not only registered as defaults (actual... + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_class_init): + Make sure the desired default values are actually set, not only + registered as defaults (actual problem is that the stereo-specific + values are only updated if channels==2, which is not the case yet + when the object is created, so the default values for the + mid-side-stereo and loose-mid-side-stereo settings are never + set in _update_quality()). Makes flacenc create smaller files by + default (for stereo input), and fixes #550791. + +2008-09-03 12:39:35 +0000 Mark Nauwelaerts + + gst/qtdemux/: Add support for video/mj2 mime-type and its additional atoms/boxes. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_state_header), (qtdemux_parse_node), + (qtdemux_parse_trak), (qtdemux_video_caps): + * gst/qtdemux/qtdemux.h: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + Add support for video/mj2 mime-type and its additional atoms/boxes. + Fixes #550646. + +2008-09-03 11:10:25 +0000 Stefan Kost + + gst/debug/gsttaginject.c: Add warning when tags parameter is unparsable and give example for quoting in the docs. + Original commit message from CVS: + * gst/debug/gsttaginject.c: + Add warning when tags parameter is unparsable and give example for + quoting in the docs. + +2008-09-02 15:27:49 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Add mapping for IMA Loki SDL MJPEG ADPCM codec. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Add mapping for IMA Loki SDL MJPEG ADPCM codec. + Add some alternative byteswapped mappings that seem to pop up sometimes. + Fixes #550288. + +2008-09-02 09:40:38 +0000 Tim-Philipp Müller + + po/: Add 'ca' to LINGUAS; add some more files with translations and some files which should be ignored by translation... + Original commit message from CVS: + * po/LINGUAS: + * po/POTFILES.in: + * po/POTFILES.skip: + Add 'ca' to LINGUAS; add some more files with translations and some + files which should be ignored by translation tools. + +2008-09-02 08:51:04 +0000 Sebastian Dröge + + ext/speex/: Use integer encoding and decoding functions instead of converting the integer input to float in the eleme... + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data): + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.c: (gst_speex_enc_encode): + * ext/speex/gstspeexenc.h: + Use integer encoding and decoding functions instead of converting + the integer input to float in the element. The libspeex integer + functions are doing this for us already or, if libspeex was compiled + in integer mode, they're doing everything using integer arithmetics. + Also saves some copying around. + +2008-09-01 13:29:29 +0000 Tim-Philipp Müller + + configure.ac: Fix --disable-external + Original commit message from CVS: + * configure.ac: + Fix --disable-external + +2008-08-31 17:09:18 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.*: Handle non-zero start timestamps and stream discontinuities correctly. This only has an ... + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_reset), + (gst_wavpack_enc_push_block), (gst_wavpack_enc_chain): + * ext/wavpack/gstwavpackenc.h: + Handle non-zero start timestamps and stream discontinuities + correctly. This only has an effect if we're muxing into + a container format as the raw WavPack stream must contain + continous sample numbers. + +2008-08-31 15:02:09 +0000 Sebastian Dröge + + ext/speex/gstspeexenc.c: Correct the timestamp and granulepos calculation by one Speex frame. + Original commit message from CVS: + * ext/speex/gstspeexenc.c: (gst_speex_enc_encode): + Correct the timestamp and granulepos calculation by one Speex + frame. + +2008-08-31 14:39:57 +0000 Sebastian Dröge + + ext/speex/gstspeexdec.c: Correctly take the granulepos from upstream if possible and correctly handle the granulepos ... + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data): + Correctly take the granulepos from upstream if possible and + correctly handle the granulepos in various calculations: the + granulepos is the sample number of the _last_ sample in a frame, not + the first. + * ext/speex/gstspeexenc.c: (gst_speex_enc_sinkevent), + (gst_speex_enc_encode), (gst_speex_enc_chain), + (gst_speex_enc_change_state): + * ext/speex/gstspeexenc.h: + Handle non-zero start timestamps in the encoder and detect/handle + stream discontinuities. Fixes bug #547075. + +2008-08-31 08:32:45 +0000 Craig Keogh + + ext/annodex/gstcmmlparser.c: Fix compiler warnings caused by passing a string as format string instead of "%s" and th... + Original commit message from CVS: + Patch by: Craig Keogh + * ext/annodex/gstcmmlparser.c: (gst_cmml_parser_parse_chunk): + Fix compiler warnings caused by passing a string as format string + instead of "%s" and then the string. This is only exposed by -Wformat=2 + as used by default on Ubuntu. Fixes bug #550015. + +2008-08-30 14:15:03 +0000 Tim-Philipp Müller + + Make stuff compile with GST_DISABLE_GST_DEBUG. + Original commit message from CVS: + * ext/raw1394/gsthdv1394src.c: (gst_hdv1394src_create): + * gst/alpha/gstalpha.c: (gst_alpha_get_unit_size): + * gst/audiofx/audiocheblimit.c: (generate_coefficients): + * gst/avi/gstavidemux.c: (gst_avi_demux_src_convert): + * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), + (gst_ebml_read_element_length): + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_check_subtitle_buffer): + Make stuff compile with GST_DISABLE_GST_DEBUG. + +2008-08-29 00:28:55 +0000 Michael Smith + + gst/law/: Ref caps before passing to gst_pad_template_new(), since that takes ownership. + Original commit message from CVS: + * gst/law/alaw.c: + * gst/law/mulaw.c: + Ref caps before passing to gst_pad_template_new(), since that takes + ownership. + +2008-08-28 10:09:16 +0000 Mersad Jelacic + + gst/multipart/: Convert audio/x-adpcm to and from the audio/G726-X in the muxer and demuxer. Fixes #549551. + Original commit message from CVS: + Patch by: Mersad Jelacic + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: (gst_multipart_mux_get_mime): + Convert audio/x-adpcm to and from the audio/G726-X in the muxer and + demuxer. Fixes #549551. + +2008-08-27 16:12:39 +0000 Edward Hervey + + sys/osxaudio/: Fix the build on macosx. + Original commit message from CVS: + * sys/osxaudio/gstosxaudiosink.c: + (gst_osx_audio_sink_select_device): + * sys/osxaudio/gstosxaudiosrc.c: + (gst_osx_audio_src_create_ringbuffer), + (gst_osx_audio_src_select_device): + * sys/osxaudio/gstosxringbuffer.c: (gst_osx_ring_buffer_acquire): + Fix the build on macosx. + +2008-08-27 15:42:11 +0000 Tim-Philipp Müller + + gst/icydemux/gsticydemux.c: Small docs fix: in the example pipeline, we need to pass iradio-mode=true to the source, ... + Original commit message from CVS: + * gst/icydemux/gsticydemux.c: + Small docs fix: in the example pipeline, we need to pass + iradio-mode=true to the source, so the server actually sends + an ICY stream. + +2008-08-27 00:08:20 +0000 Michael Smith + + sys/osxaudio/gstosxaudio.c: Oops. Revert more completely. + Original commit message from CVS: + * sys/osxaudio/gstosxaudio.c: + Oops. Revert more completely. + +2008-08-26 23:57:05 +0000 Michael Smith + + sys/osxaudio/gstosxaudio.c: Revert accidental element rename from testing. + Original commit message from CVS: + * sys/osxaudio/gstosxaudio.c: + Revert accidental element rename from testing. + +2008-08-26 23:53:40 +0000 Jan Schmidt + + gst-plugins-good.doap: Pull in 0.10.10 doap entry from release branch + Original commit message from CVS: + * gst-plugins-good.doap: + Pull in 0.10.10 doap entry from release branch + +2008-08-26 23:05:57 +0000 Jan Schmidt + + configure.ac: Update version number to reflect 0.10.10 release from branch. + Original commit message from CVS: + * configure.ac: + Update version number to reflect 0.10.10 release from + branch. + +2008-08-26 21:13:08 +0000 Michael Smith + + sys/osxaudio/: Rewrite caps setting and ring buffer initialisation. + Original commit message from CVS: + * sys/osxaudio/Makefile.am: + * sys/osxaudio/gstosxaudio.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosink.h: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxaudio/gstosxaudiosrc.h: + * sys/osxaudio/gstosxringbuffer.c: + * sys/osxaudio/gstosxringbuffer.h: + Rewrite caps setting and ring buffer initialisation. + Previously we never told CoreAudio what format we were going to send it, + so it only worked due to luck, and not at all on some hardware. + Now we explicitly advertise what formats the hardware supports, and then + configure the selected one correctly. + +2008-08-26 12:27:11 +0000 Stefan Kost + + sys/v4l2/: Fix memory leaks. Small code cleanups : No need for empty _init(). No need to memset instance structures. ... + Original commit message from CVS: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + Fix memory leaks. Small code cleanups : No need for empty _init(). No + need to memset instance structures. Some more FIXME's. + +2008-08-26 08:11:26 +0000 Stefan Kost + + tests/icles/.cvsignore: Ignore more. + Original commit message from CVS: + * tests/icles/.cvsignore: + Ignore more. + +2008-08-26 08:00:57 +0000 Stefan Kost + + gst/: Ignore files. + Original commit message from CVS: + * gst/goom/.cvsignore: + * gst/goom2k1/.cvsignore: + Ignore files. + +2008-08-26 07:51:42 +0000 Stefan Kost + + ext/cairo/gsttextoverlay.c: Fix compiler warning. + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: + Fix compiler warning. + +2008-08-26 05:42:15 +0000 David Schleef + + ext/cairo/gsttextoverlay.c: Fix obvious memleak. + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: Fix obvious memleak. + +2008-08-25 14:15:43 +0000 Edward Hervey + + gst/matroska/: Add Real[Audio|Video] support to Matroska containers. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_send_event), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps): + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_video_pad_setcaps), + (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_finish): + Add Real[Audio|Video] support to Matroska containers. + It works fine for: + * decoding real audio/video streams contained in mkv + * 'transmuxing' real (.rm) files into .mkv files + It will not work though for encoding real[audio/video] streams that + don't contain the 'mdpr_data' extra data on the caps. + The reason why this will not work is because I never intended to + duplicate virtually all the 'mdpr' block creation into mkvmux. + Fixes #536067 + +2008-08-25 09:48:06 +0000 Wim Taymans + + gst/law/: The encoder can't really renegotiate at the time they perform a pad-alloc so make the srcpads use fixed caps. + Original commit message from CVS: + * gst/law/alaw-encode.c: (gst_alaw_enc_init), (gst_alaw_enc_chain): + * gst/law/mulaw-conversion.c: + * gst/law/mulaw-encode.c: (gst_mulawenc_init), + (gst_mulawenc_chain): + The encoder can't really renegotiate at the time they perform a + pad-alloc so make the srcpads use fixed caps. + Check the buffer size after a pad-alloc because the returned size might + not be right when the downstream element does not know the size of the + new buffer (capsfilter). Fixes #549073. + +2008-08-23 15:43:49 +0000 Filippo Argiolas + + sys/v4l2/gstv4l2tuner.c: v4l2src doesn't have a property named "norm" so don't try to notify about changes to that pr... + Original commit message from CVS: + Patch by: Filippo Argiolas + * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_set_norm_and_notify): + v4l2src doesn't have a property named "norm" so don't try to notify + about changes to that property. The "norm" property and related + code are commented out currently. Fixes bug #549090. + +2008-08-23 15:33:49 +0000 Mike Ruprecht + + sys/v4l2/gstv4l2object.c: Reprobe devices again instead of taking a cached list as new devices could've been plugged ... + Original commit message from CVS: + Patch by: Mike Ruprecht + * sys/v4l2/gstv4l2object.c: (gst_v4l2_class_probe_devices): + Reprobe devices again instead of taking a cached list as new + devices could've been plugged in. Fixes bug #549062. + +2008-08-22 16:04:02 +0000 Sebastian Dröge + + gst/autodetect/Makefile.am: Don't link the autodetect plugin with GConf as it doesn't use GConf. Fixes bug #545463. + Original commit message from CVS: + * gst/autodetect/Makefile.am: + Don't link the autodetect plugin with GConf as it doesn't + use GConf. Fixes bug #545463. + +2008-08-22 12:24:23 +0000 Sebastian Dröge + + gst/matroska/ebml-read.c: Change some GST_ELEMENT_ERRORs to GST_ERROR_OBJECT to make it possible to ignore errors and... + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_read_uint), + (gst_ebml_read_sint), (gst_ebml_read_float), + (gst_ebml_read_header): + Change some GST_ELEMENT_ERRORs to GST_ERROR_OBJECT to make it + possible to ignore errors and not post any ERROR messages on + the bus. + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_contents): + Ignore any errors and not just EOS when parsing the contents of + a SeekHead. Errors here are usually caused by truncated files + and playback of the file works fine. Fixes playback of the + audio_only_chapter_seekbroken.mka file from the MPlayer samples + archive. + +2008-08-22 11:29:26 +0000 Zaheer Abbas Merali + + gst/multipart/: Conform to RFC2046. audio/basic is mulaw 8000Hz mono. + Original commit message from CVS: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + Conform to RFC2046. audio/basic is mulaw 8000Hz mono. + +2008-08-21 21:56:19 +0000 Ole André Vadla RavnÃ¥s + + * ChangeLog: + * sys/directdraw/gstdirectdrawsink.c: + 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 + + sys/directdraw/gstdirectdrawsink.c: Fix buffer ref leak. + Original commit message from CVS: + Patch by: Ole André Vadla RavnÃ¥s + * sys/directdraw/gstdirectdrawsink.c: + (gst_directdraw_sink_show_frame): + Fix buffer ref leak. + +2008-08-21 13:27:12 +0000 Sebastian Dröge + + gst/wavenc/gstwavenc.c: Revert the last commit. wavenc still supports width!=depth for 32 bit width. Thanks Tim. + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + Revert the last commit. wavenc still supports width!=depth for 32 bit + width. Thanks Tim. + +2008-08-21 13:22:06 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: If the duration of a block is unknown only use the timestamp for the first lace and us... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup_or_simpleblock): + If the duration of a block is unknown only use the timestamp for the + first lace and use GST_CLOCK_TIME_NONE as duration for the following + laces. Otherwise every lace has the same timestamp which leads to + various problems. Really fixes bug #548831. + +2008-08-21 12:56:01 +0000 Sebastian Dröge + + gst/wavenc/gstwavenc.c: If we're not allowing width!=depth in wavenc we should also disable the code that was added t... + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + If we're not allowing width!=depth in wavenc we should also disable + the code that was added to support width!=depth. + +2008-08-21 12:52:47 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: Don't calculate the default duration of a frame from the audio sampling rate. This onl... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): + Don't calculate the default duration of a frame from the audio sampling + rate. This only works for raw audio if every frame contains a single + sample and results in broken buffer durations for other formats + if no specified default duration is given or the blocks have no + duration. Fixes bug #548831. + +2008-08-21 12:34:33 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: Allow zero sized blocks instead of returning GST_FLOW_OK. Such blocks are used for tex... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup_or_simpleblock): + Allow zero sized blocks instead of returning GST_FLOW_OK. Such blocks + are used for text/plain subtitles as a gap-filler in some files. + +2008-08-21 12:12:00 +0000 Wim Taymans + + sys/v4l2/gstv4l2src.c: Add S910 and PWC formats with a low priority. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_structure), + (gst_v4l2_get_caps_info): + Add S910 and PWC formats with a low priority. + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_format_get_rank), + (gst_v4l2src_probe_caps_for_format): + Add more debugging. + +2008-08-20 21:54:35 +0000 Tim-Philipp Müller + + ext/flac/gstflacenc.c: Fix compilation against older libflac versions. + Original commit message from CVS: + * ext/flac/gstflacenc.c: + Fix compilation against older libflac versions. + +2008-08-20 17:46:48 +0000 Sebastian Dröge + + ext/pulse/: Use GST_BOILERPLATE everywhere and fix coding style at some places. + Original commit message from CVS: + * ext/pulse/pulsemixer.c: (gst_pulsemixer_class_init), + (gst_pulsemixer_set_property), (gst_pulsemixer_get_property): + * ext/pulse/pulsemixerctrl.c: (gst_pulsemixer_ctrl_subscribe_cb), + (gst_pulsemixer_ctrl_open), (gst_pulsemixer_ctrl_timeout_event), + (gst_pulsemixer_ctrl_set_volume): + * ext/pulse/pulsemixertrack.c: (gst_pulsemixer_track_new): + * ext/pulse/pulseprobe.c: (gst_pulseprobe_open): + * ext/pulse/pulsesink.c: (gst_pulsesink_class_init), + (gst_pulsesink_init), (gst_pulsesink_open), + (gst_pulsesink_prepare), (gst_pulsesink_write), + (gst_pulsesink_delay), (gst_pulsesink_reset): + * ext/pulse/pulsesrc.c: (gst_pulsesrc_class_init), + (gst_pulsesrc_init): + Use GST_BOILERPLATE everywhere and fix coding style at some places. + Fix a locking issue in pulsesink's prepare function. + * ext/pulse/pulseutil.c: (gst_pulse_channel_map_to_gst): + Check if the created channel layout is valid for GStreamer. + +2008-08-20 17:42:21 +0000 Wim Taymans + + gst/rtsp/gstrtspgoogle.c: Things that can happen when your brain is in google mode trying to deal with their google r... + Original commit message from CVS: + * gst/rtsp/gstrtspgoogle.c: + Things that can happen when your brain is in google mode trying to + deal with their google rtsp server extensions and trying to type your + google mail account. + +2008-08-20 17:30:19 +0000 Wim Taymans + + gst/rtsp/: Add google RTSP extension, it can only handle udp and responds with unsupported if we do anything else. Fi... + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/gstrtsp.c: (plugin_init): + * gst/rtsp/gstrtspgoogle.c: (gst_rtsp_google_before_send), + (gst_rtsp_google_after_send), (gst_rtsp_google_get_transports), + (_do_init), (gst_rtsp_google_base_init), + (gst_rtsp_google_class_init), (gst_rtsp_google_init), + (gst_rtsp_google_finalize), (gst_rtsp_google_change_state), + (gst_rtsp_google_extension_init): + * gst/rtsp/gstrtspgoogle.h: + Add google RTSP extension, it can only handle udp and responds with + unsupported if we do anything else. Fixes #546465. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_connection_send), + (gst_rtspsrc_connection_receive), (gst_rtspsrc_loop_send_cmd), + (gst_rtspsrc_create_transports_string), + (gst_rtspsrc_setup_streams), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_pause): + Make transport setup code a bit better using GString. + Add some more debug. + Check for closed connections before doing anything on them. + +2008-08-20 17:17:55 +0000 Sebastian Dröge + + ext/pulse/: If downstream provides no channel layout and >2 channels should be used use the default layout that pulse... + Original commit message from CVS: + * ext/pulse/pulsesrc.c: (gst_pulsesrc_class_init), + (gst_pulsesrc_create_stream), (gst_pulsesrc_negotiate), + (gst_pulsesrc_prepare): + * ext/pulse/pulseutil.c: (gst_pulse_gst_to_channel_map), + (gst_pulse_channel_map_to_gst): + * ext/pulse/pulseutil.h: + If downstream provides no channel layout and >2 channels should be + used use the default layout that pulseaudio chooses and also + add this layout to the caps. Fixes bug #547258. + +2008-08-20 11:51:38 +0000 Peter Kjellerstedt + + gst/udp/: Avoid leaking internally allocated file descriptors when setting custom file descriptors. Fixes #543101. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_init), + (gst_dynudpsink_finalize), (gst_dynudpsink_set_property), + (gst_dynudpsink_init_send), (gst_dynudpsink_close): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init), + (gst_multiudpsink_finalize), (gst_multiudpsink_set_property): + * gst/udp/gstudpsrc.c: (gst_udpsrc_finalize), + (gst_udpsrc_set_property): + Avoid leaking internally allocated file descriptors when setting + custom file descriptors. Fixes #543101. + +2008-08-20 11:48:46 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Don't try to configure RTCP back to the server when the server did not give us a valid port nu... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_udp_sink): + Don't try to configure RTCP back to the server when the server did not + give us a valid port number. + +2008-08-20 10:59:52 +0000 Wim Taymans + + gst/videobox/gstvideobox.c: Use new basetransform method to renegotiate. Fixes #544956. + Original commit message from CVS: + * gst/videobox/gstvideobox.c: (gst_video_box_set_property): + Use new basetransform method to renegotiate. Fixes #544956. + * tests/icles/Makefile.am: + * tests/icles/videobox-test.c: (make_pipeline), (main): + Add videobox renegotiation example. + +2008-08-19 21:03:22 +0000 David Schleef + + gst/wavenc/gstwavenc.c: Remove depth ranges and replace with sane values. Fixes #548530. + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: Remove depth ranges and replace + with sane values. Fixes #548530. + +2008-08-18 15:05:32 +0000 Sebastian Dröge + + ext/pulse/: The bytes_per_sample and silence_sample fields of the GstRingBufferSpec are already filled with the corre... + Original commit message from CVS: + * ext/pulse/pulsesink.c: (gst_pulsesink_prepare): + * ext/pulse/pulsesrc.c: (gst_pulsesrc_prepare): + The bytes_per_sample and silence_sample fields of the GstRingBufferSpec + are already filled with the correct values by + gst_ring_buffer_parse_caps() so there's no need to set them again + with wrong values. + +2008-08-16 14:54:56 +0000 Edward Hervey + + gst/avi/gstavidemux.c: Some AVI 2.0 (ODML) files don't respect the 'specifications' completely and instead of using t... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_read_subindexes_pull), + (gst_avi_demux_read_subindexes_push): + Some AVI 2.0 (ODML) files don't respect the 'specifications' completely + and instead of using the 'ix##' nomenclature, use '##ix'. + They're still valid though, this fixes the duration and indexes for + virtually all the ODML files I have. + +2008-08-15 17:26:18 +0000 Olivier Crete + + gst/rtp/: Update the vorbis RTP pay/depay to RFC 5215. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps), + (gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): + Update the vorbis RTP pay/depay to RFC 5215. + Fixes #547842. + +2008-08-14 22:07:02 +0000 David Schleef + + gst/qtdemux/qtdemux.c: Add 'hdv6' as a HDV format for 1080i/60 with 3:2 pulldown, i.e., 24p. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: Add 'hdv6' as a HDV format for 1080i/60 + with 3:2 pulldown, i.e., 24p. + +2008-08-14 12:47:09 +0000 Wim Taymans + + tests/check/elements/level.c: Fix compilation some more. + Original commit message from CVS: + * tests/check/elements/level.c: (GST_START_TEST): + Fix compilation some more. + +2008-08-14 11:44:59 +0000 Tim-Philipp Müller + + configure.ac: Require -base CVS for wavparse acid chunk parsing. + Original commit message from CVS: + * configure.ac:: + Require -base CVS for wavparse acid chunk parsing. + +2008-08-13 13:57:01 +0000 Sebastian Dröge + + ext/pulse/pulsesink.*: Add "device-name" property to pulsesink too and currently commented out and not working suppor... + Original commit message from CVS: + * ext/pulse/pulsesink.c: (gst_pulsesink_class_init), + (gst_pulsesink_init), (gst_pulsesink_finalize), + (gst_pulsesink_set_volume), (gst_pulsesink_get_volume), + (gst_pulsesink_set_property), (gst_pulsesink_get_property), + (gst_pulsesink_prepare), (gst_pulsesink_change_state): + * ext/pulse/pulsesink.h: + Add "device-name" property to pulsesink too and currently commented + out and not working support for a "volume" property. + +2008-08-13 13:17:15 +0000 Thijs Vermeir + + configure.ac: Remove more cdio stuff (moved to ugly) + Original commit message from CVS: + * configure.ac: + Remove more cdio stuff (moved to ugly) + +2008-08-13 12:37:26 +0000 Laszlo Pandy + + ext/pulse/pulsesrc.c: Add "device-name" property, which provides a human readable string for the audio device, to mak... + Original commit message from CVS: + Patch by: Laszlo Pandy + * ext/pulse/pulsesrc.c: (gst_pulsesrc_class_init), + (gst_pulsesrc_get_property): + Add "device-name" property, which provides a human readable string + for the audio device, to make it more consisten with other audio + sources. Fixes bug #547519. + +2008-08-13 12:34:13 +0000 Sebastian Dröge + + ext/pulse/: Improve debugging a bit by including the parent object in pulsemixerctrl and pulseprobe objects and using... + Original commit message from CVS: + * ext/pulse/pulsemixer.c: (gst_pulsemixer_change_state): + * ext/pulse/pulsemixerctrl.c: (gst_pulsemixer_ctrl_subscribe_cb), + (gst_pulsemixer_ctrl_open), (gst_pulsemixer_ctrl_new), + (gst_pulsemixer_ctrl_free), (gst_pulsemixer_ctrl_timeout_event): + * ext/pulse/pulsemixerctrl.h: + * ext/pulse/pulseprobe.c: (gst_pulseprobe_open), + (gst_pulseprobe_enumerate), (gst_pulseprobe_new), + (gst_pulseprobe_free), (gst_pulseprobe_needs_probe), + (gst_pulseprobe_probe_property), (gst_pulseprobe_get_values): + * ext/pulse/pulseprobe.h: + * ext/pulse/pulsesink.c: (gst_pulsesink_init): + * ext/pulse/pulsesrc.c: (gst_pulsesrc_init), (gst_pulsesrc_delay), + (gst_pulsesrc_change_state): + Improve debugging a bit by including the parent object in pulsemixerctrl + and pulseprobe objects and using GST_WARNING_OBJECT instead of + GST_WARNING. + Use the parent GObject subclass instead of a random struct as GObject + parameter for G_OBJECT_WARN_INVALID_PROPERTY_ID. This fixes a crash + when probing for another property than "device". + +2008-08-13 12:21:22 +0000 Laszlo Pandy + + ext/pulse/pulsemixer.c: Fix property probing after the device property is set by calling set_server when the server p... + Original commit message from CVS: + Patch by: Laszlo Pandy + * ext/pulse/pulsemixer.c: (gst_pulsemixer_set_property): + Fix property probing after the device property is set by calling + set_server when the server property changes. Fixes bug #547518. + +2008-08-13 12:11:34 +0000 Laszlo Pandy + + ext/pulse/pulsemixer.c: Fix property probing after the device property is set by calling set_server when the server p... + Original commit message from CVS: + Patch by: Laszlo Pandy + * ext/pulse/pulsemixer.c: (gst_pulsemixer_set_property): + Fix property probing after the device property is set by calling + set_server when the server property changes. Fixes bug #547518. + +2008-08-13 12:01:01 +0000 Laszlo Pandy + + ext/pulse/: Implement GstPropertyProbe interface on pulsesink for detecting sink devices and on pulsesrc for detectin... + Original commit message from CVS: + Patch by: Laszlo Pandy + * ext/pulse/pulsesink.c: (gst_pulsesink_interface_supported), + (gst_pulsesink_implements_interface_init), + (gst_pulsesink_init_interfaces), (gst_pulsesink_init), + (gst_pulsesink_finalize), (gst_pulsesink_set_property), + (gst_pulsesink_get_type): + * ext/pulse/pulsesink.h: + * ext/pulse/pulsesrc.c: (gst_pulsesrc_interface_supported), + (gst_pulsesrc_init_interfaces), (gst_pulsesrc_init), + (gst_pulsesrc_finalize), (gst_pulsesrc_set_property): + * ext/pulse/pulsesrc.h: + Implement GstPropertyProbe interface on pulsesink for detecting + sink devices and on pulsesrc for detecting source devices. + Fixes bugs #547227 and #547217. + +2008-08-13 09:17:20 +0000 Stefan Kost + + gst/spectrum/gstspectrum.c: Don't terminate on fabs(in)>1.0. Init doubles as doubles. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: + Don't terminate on fabs(in)>1.0. Init doubles as doubles. + +2008-08-13 08:33:57 +0000 Edward Hervey + + sys/v4l2/gstv4l2src.c: Properly set the maximum latency value, in the same way it is done in v4lsrc. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_query): + Properly set the maximum latency value, in the same way it is done in + v4lsrc. + * sys/v4l2/v4l2src_calls.c: + Simplify fraction equality check, no need to use GValues for this. + +2008-08-12 12:04:24 +0000 Edward Hervey + + sys/v4l2/gstv4l2src.c: Add warning messages stating exactly why the latency query failed. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_query): + Add warning messages stating exactly why the latency query failed. + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture): + In some cases, the negotiated framerate might be the default one which + is already set internally. But we still need to mark it down in fps_n + and fps_d so that the latency query can happen properly. + +2008-08-12 11:28:47 +0000 Edward Hervey + + docs/plugins/inspect/plugin-1394.xml: Whoops, forgot one doc file for people who can't/don't build the raw1394 plugin. + Original commit message from CVS: + * docs/plugins/inspect/plugin-1394.xml: + Whoops, forgot one doc file for people who can't/don't build the + raw1394 plugin. + +2008-08-12 09:22:29 +0000 Jan Schmidt + + Pull changes from 0.10.9.2 pre-release branch moving the libcdio + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-cdio.xml: + * ext/Makefile.am: + * ext/cdio/Makefile.am: + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: + * ext/cdio/gstcdiocddasrc.h: + Pull changes from 0.10.9.2 pre-release branch moving the libcdio + CDDA source to -ugly. + * po/LINGUAS: + * po/POTFILES.in: + * po/id.po: + Pull in new translation from 0.10.9.2 release branch. + +2008-08-11 15:05:13 +0000 Edward Hervey + + docs/plugins/: Integrate documentation for new hdv1394src element. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + Integrate documentation for new hdv1394src element. + +2008-08-11 14:36:13 +0000 Edward Hervey + + ext/raw1394/: mpeg2-ts (HDV) variant of firewire capture element. + Original commit message from CVS: + * ext/raw1394/Makefile.am: + * ext/raw1394/gst1394.c: (plugin_init): + * ext/raw1394/gsthdv1394src.c: (_do_init), + (gst_hdv1394src_base_init), (gst_hdv1394src_class_init), + (gst_hdv1394src_init), (gst_hdv1394src_dispose), + (gst_hdv1394src_set_property), (gst_hdv1394src_get_property), + (gst_hdv1394src_from_raw1394handle), + (gst_hdv1394src_iec61883_receive), (gst_hdv1394src_bus_reset), + (gst_hdv1394src_create), (gst_hdv1394src_discover_avc_node), + (gst_hdv1394src_start), (gst_hdv1394src_stop), + (gst_hdv1394src_unlock), (gst_hdv1394src_update_device_name), + (gst_hdv1394src_uri_get_type), (gst_hdv1394src_uri_get_protocols), + (gst_hdv1394src_uri_get_uri), (gst_hdv1394src_uri_set_uri), + (gst_hdv1394src_uri_handler_init): + * ext/raw1394/gsthdv1394src.h: + mpeg2-ts (HDV) variant of firewire capture element. + Fixes #350830 + +2008-08-11 10:53:06 +0000 Edward Hervey + + gst/level/gstlevel.c: Fix compilation (also known as the classic 'fix code that someone committed without compiling i... + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_message_new): + Fix compilation (also known as the classic 'fix code that someone + committed without compiling it first'). + +2008-08-10 19:40:27 +0000 Stefan Kost + + tests/check/elements/level.c: Add a test for level in stereo mode. + Original commit message from CVS: + * tests/check/elements/level.c: + Add a test for level in stereo mode. + +2008-08-10 19:35:05 +0000 Stefan Kost + + tests/examples/spectrum/: Demo how to draw analyzer results synced to the clock. + Original commit message from CVS: + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + Demo how to draw analyzer results synced to the clock. + +2008-08-10 15:52:42 +0000 Stefan Kost + + gst/level/gstlevel.c: Little renaming (l -> level). + Original commit message from CVS: + * gst/level/gstlevel.c: + Little renaming (l -> level). + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + Also send full timestamp/duration details here. + +2008-08-10 11:32:03 +0000 Stefan Kost + + gst/level/gstlevel.*: Send same timestamp/duration details as videoanalysis. This gives applications better chance to... + Original commit message from CVS: + * gst/level/gstlevel.c: + * gst/level/gstlevel.h: + Send same timestamp/duration details as videoanalysis. This gives + applications better chance to sync analysis results with playback. + +2008-08-09 14:02:27 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.c: We need to drop one additional buffer for FLAC as the fLaC marker and STREAMINFO block a... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_handle_sink_event), + (flac_streamheader_to_codecdata): + We need to drop one additional buffer for FLAC as the fLaC + marker and STREAMINFO block are merged into one buffer in the caps. + Also don't pretend to support NEWSEGMENT events, otherwise we + will most probably write some invalid data. + +2008-08-09 13:48:22 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.c: Add support for muxing FLAC into Matroska containers. + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (flac_streamheader_to_codecdata), + (gst_matroska_mux_audio_pad_setcaps): + Add support for muxing FLAC into Matroska containers. + Fixes bug #311586. + +2008-08-09 08:58:26 +0000 Sebastian Dröge + + ext/flac/gstflacenc.c: Actually provide the variables required for the format string. + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_check_discont): + Actually provide the variables required for the format string. + +2008-08-08 16:20:26 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.*: Close the current segment if we're doing a non-flushing seek and send the close-segmen... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroska_demux_element_send_event), + (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_loop): + * gst/matroska/matroska-demux.h: + Close the current segment if we're doing a non-flushing seek and send + the close-segment and the new segment of the seek from the streaming + thread. + +2008-08-08 15:20:24 +0000 Sebastian Dröge + + ext/flac/gstflacenc.*: Handle non-zero start timestamps correctly, mark header packets as + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_write_callback), + (gst_flac_enc_check_discont), (gst_flac_enc_chain), + (gst_flac_enc_change_state): + * ext/flac/gstflacenc.h: + Handle non-zero start timestamps correctly, mark header packets as + IN_CAPS and print a warning and suggest using audiorate if stream + discontinuities are detected. When FLAC supports flushing the encoder + somehow this should be done for discontinuities instead. + Remove some unused variables from the instance struct. + +2008-08-07 17:14:39 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add pulseaudio to plugins list in spec file + Original commit message from CVS: + add pulseaudio to plugins list in spec file + +2008-08-07 16:13:41 +0000 Sebastian Dröge + + ext/flac/gstflacenc.c: If seeking failed return the appropiate return value to FLAC. + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_seek_callback): + If seeking failed return the appropiate return value to FLAC. + Otherwise it thinks seeking was successfull and tries to rewrite + parts of the headers which then get appended to the output. + +2008-08-07 16:11:00 +0000 Frederic Crozat + + Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#546822). + Original commit message from CVS: + Patch by: Frederic Crozat + * ext/esd/gstesd.c: (plugin_init): + * ext/flac/gstflac.c: (plugin_init): + * ext/shout2/gstshout2.c: (plugin_init): + * ext/wavpack/gstwavpack.c: (plugin_init): + * sys/oss/gstossaudio.c: (plugin_init): + * sys/v4l2/gstv4l2.c: (plugin_init): + Make sure gettext returns translations in UTF-8 encoding rather + than in the current locale encoding (#546822). + +2008-08-07 14:40:13 +0000 Sebastian Dröge + + ext/flac/gstflacdec.c: Add FIXME for 0.11 to simply output everything with width=32 as given by FLAC and let audiocon... + Original commit message from CVS: + * ext/flac/gstflacdec.c: + Add FIXME for 0.11 to simply output everything with width=32 as given + by FLAC and let audioconvert handle the conversions instead of doing + them in flacdec. + +2008-08-07 10:22:32 +0000 Jan Schmidt + + sys/v4l2/v4l2src_calls.c: When outputting a pad template range for the size, include a framerate range too, to avoid ... + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format): + When outputting a pad template range for the size, include a framerate + range too, to avoid 'not a real subset of template caps' errors. + +2008-08-06 15:34:55 +0000 Jonathan Matthew + + ext/flac/: Port flactag to 0.10, add documentation for it and clean it up a bit. + Original commit message from CVS: + Based on a patch by: Jonathan Matthew + * ext/flac/Makefile.am: + * ext/flac/gstflac.c: (plugin_init): + * ext/flac/gstflactag.c: (gst_flac_tag_setup_interfaces), + (gst_flac_tag_base_init), (gst_flac_tag_class_init), + (gst_flac_tag_dispose), (gst_flac_tag_init), + (gst_flac_tag_sink_setcaps), (gst_flac_tag_chain), + (gst_flac_tag_change_state): + * ext/flac/gstflactag.h: + Port flactag to 0.10, add documentation for it and clean it up a bit. + Fixes bug #413841. + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-flac.xml: + * ext/flac/gstflacdec.c: (gst_flac_dec_base_init): + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.c: (gst_flac_enc_base_init): + * ext/flac/gstflacenc.h: + Add flactag and flacenc to the documentation and mark + the private parts of the flacdec instance structure as private. + Also use gst_element_class_set_details_simple() in flacdec and + flacenc. + +2008-08-06 13:12:07 +0000 Stefan Kost + + gst/qtdemux/qtdemux.c: Use audio/x-qdm for caps. Collect some info - mplayer has a decoder for it but ffmpeg does not. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: + Use audio/x-qdm for caps. Collect some info - mplayer has a decoder + for it but ffmpeg does not. + +2008-08-05 15:05:44 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: Handle the list chunk and use gst_riff_parse_info() to parse the info sub-chunk. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Handle the list chunk and use gst_riff_parse_info() to parse the info + sub-chunk. + +2008-08-05 14:22:12 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: Handle the acid chunk and send tempo as part of tags. Other fields are interesting too, b... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Handle the acid chunk and send tempo as part of tags. Other fields are + interesting too, but need more tag-definitions. Fixes #545433. + +2008-08-05 14:16:32 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: Refactor wavparse. Call _reset() from dispose() and move old code from dispose into reset... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Refactor wavparse. Call _reset() from dispose() and move old code from + dispose into reset. This way we don't leak taglists when we abort + parsing. Fix some comments. Move code for skipping a chunk into extra + function. Replace chunk sizes with a const to ease readability. + +2008-08-05 13:57:57 +0000 Aurelien Grimaud + + gst/rtsp/gstrtspsrc.c: Improve udp port setup. Fixes #545710. + Original commit message from CVS: + Patch by: Aurelien Grimaud + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_alloc_udp_ports): + Improve udp port setup. Fixes #545710. + +2008-08-05 13:54:18 +0000 Wim Taymans + + gst/rtp/: Add MP1S depayloader. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_base_init), + (gst_rtp_mp1s_depay_class_init), (gst_rtp_mp1s_depay_init), + (gst_rtp_mp1s_depay_setcaps), (gst_rtp_mp1s_depay_process), + (gst_rtp_mp1s_depay_set_property), + (gst_rtp_mp1s_depay_get_property), + (gst_rtp_mp1s_depay_change_state), + (gst_rtp_mp1s_depay_plugin_init): + * gst/rtp/gstrtpmp1sdepay.h: + Add MP1S depayloader. + * gst/rtsp/URLS: + Some more sample rtsp streams. + +2008-08-05 08:43:45 +0000 Wim Taymans + + gst/rtsp/URLS: Add another URL. + Original commit message from CVS: + * gst/rtsp/URLS: + Add another URL. + * tests/check/elements/id3v2mux.c: (test_taglib_id3mux_with_tags): + * tests/check/elements/rglimiter.c: (GST_START_TEST): + Add some more debug info. + +2008-08-04 09:16:40 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Provide cbSize field for audio extra_data size, and take care to pad extra_data. + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_riff_get_avi_header): + Provide cbSize field for audio extra_data size, and take care to + pad extra_data. + +2008-08-04 07:23:07 +0000 Stefan Kost + + gst/qtdemux/qtdemux.c: Return the result of gst_pad_{start,stop}_task instead of hard-coded + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: + Return the result of gst_pad_{start,stop}_task instead of hard-coded + TRUE. + +2008-08-04 07:17:38 +0000 Stefan Kost + + gst/qtdemux/: Add keyword tag support. Fixes #520694 for qtdemux. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux_fourcc.h: + Add keyword tag support. Fixes #520694 for qtdemux. + +2008-08-04 07:05:33 +0000 Stefan Kost + + gst/qtdemux/qtdemux.c: Add support for tmpo tag (BPM). + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: + Add support for tmpo tag (BPM). + +2008-08-03 12:23:49 +0000 Sebastian Dröge + + ext/flac/gstflacenc.c: Set an estimate for the total number of samples that will be encoded if possible to help decod... + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_query_peer_total_samples), + (gst_flac_enc_sink_setcaps), (gst_flac_enc_write_callback): + Set an estimate for the total number of samples that will be encoded + if possible to help decoders if the streaminfo can't be rewritten + later (like when muxing into Ogg containers). + Add a warning if we get header packets after data packets as those + will get lost when muxing into Ogg, i.e. rewriting the headers doesn't + work. + +2008-08-03 11:38:22 +0000 Sebastian Dröge + + ext/flac/gstflacdec.c: Support decoding of all depths between 4 and 32 bits and read the depth from the streaminfo he... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_metadata_callback), + (gst_flac_dec_write): + Support decoding of all depths between 4 and 32 bits and read the + depth from the streaminfo header if needed. Also support all sampling + rates between 1 and 655350 Hz. + * ext/flac/gstflacenc.c: + (gst_flac_enc_caps_append_structure_with_widths), + (gst_flac_enc_sink_getcaps), (gst_flac_enc_sink_setcaps), + (gst_flac_enc_chain): + * ext/flac/gstflacenc.h: + Support encoding in all bit depths supported by the streamable + subformat (i.e. 8, 12, 16, 20 and 24 bits) and all sampling rates + between 1 Hz and 655350 Hz. + +2008-08-03 09:23:14 +0000 Sebastian Dröge + + ext/flac/gstflacenc.c: Support encoding of up to 8 channels. + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_init), + (gst_flac_enc_sink_getcaps): + Support encoding of up to 8 channels. + +2008-08-02 21:39:01 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.*: Fix seeking race condition in #540300 + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: + * ext/soup/gstsouphttpsrc.h: + Fix seeking race condition in #540300 + Patch By: Wouter Cloetens + +2008-08-02 18:35:21 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: When receiving a SEEK event on a specific pad first search for a seek table entry for ... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek), + (gst_matroska_demux_element_send_event), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_handle_src_event): + When receiving a SEEK event on a specific pad first search for a seek + table entry for the stream of the pad and then fall back to an entry + for a different stream. + +2008-08-02 18:20:44 +0000 Sebastian Dröge + + Build depend on core CVS for the attachment tag. + Original commit message from CVS: + * configure.ac: + * gst/matroska/matroska-ids.c: (gst_matroska_register_tags): + * gst/matroska/matroska-ids.h: + Build depend on core CVS for the attachment tag. + +2008-08-02 18:18:05 +0000 Sebastian Dröge + + Decode the codec private data and following ContentEncoding if necessary. + Original commit message from CVS: + * configure.ac: + * gst/matroska/Makefile.am: + * gst/matroska/lzo.c: (get_byte), (get_len), (copy), + (copy_backptr), (lzo1x_decode), (main): + * gst/matroska/lzo.h: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_read_track_encoding), + (gst_matroska_decompress_data), (gst_matroska_decode_data), + (gst_matroska_decode_buffer), + (gst_matroska_decode_content_encodings), + (gst_matroska_demux_read_track_encodings), + (gst_matroska_demux_add_stream), + (gst_matroska_demux_parse_blockgroup_or_simpleblock): + * gst/matroska/matroska-ids.h: + Decode the codec private data and following ContentEncoding if + necessary. + Support bzip2, lzo and header stripped compression. For lzo use the + ffmpeg lzo implementation as liblzo is GPL licensed. + Fix zlib decompression. + +2008-08-02 18:11:32 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.c: Fix muxing of MP3/MP2 with different MPEG versions by calculating the duration of a fram... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_audio_pad_setcaps): + Fix muxing of MP3/MP2 with different MPEG versions by calculating the + duration of a frame with the new mpegaudioversion caps field. + +2008-08-02 18:06:20 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.*: Allow an infinite number of stream inside Matroska containers and use a GPtrArray for ... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_finalize), + (gst_matroska_demux_class_init), (gst_matroska_demux_init), + (gst_matroska_demux_combine_flows), (gst_matroska_demux_reset), + (gst_matroska_demux_stream_from_num), + (gst_matroska_demux_tracknumber_unique), + (gst_matroska_demux_add_stream), (gst_matroska_demux_send_event), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_sync_streams), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_loop): + * gst/matroska/matroska-demux.h: + Allow an infinite number of stream inside Matroska containers and use + a GPtrArray for storing them instead of allowing "only" 127 streams. + +2008-08-02 18:01:36 +0000 Sebastian Dröge + + gst/matroska/: Fix indention everywhere. A broken indent version has added newlines after every single declaration so... + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_read_class_init), + (gst_ebml_read_change_state), (gst_ebml_read_element_level_up), + (gst_ebml_read_peek_bytes), (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_peek_id), + (gst_ebml_read_get_length), (gst_ebml_read_skip), + (gst_ebml_read_buffer), (gst_ebml_read_bytes), + (gst_ebml_read_uint), (gst_ebml_read_sint), (_ext2dbl), + (gst_ebml_read_float), (gst_ebml_read_ascii), (gst_ebml_read_date), + (gst_ebml_read_master), (gst_ebml_read_binary), + (gst_ebml_read_header): + * gst/matroska/ebml-write.c: (gst_ebml_write_element_id), + (gst_ebml_write_element_size), (gst_ebml_write_uint), + (gst_ebml_write_sint), (gst_ebml_write_ascii), + (gst_ebml_write_master_start), (gst_ebml_write_master_finish), + (gst_ebml_replace_uint): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroska_demux_read_track_encoding), + (gst_matroska_demux_read_track_encodings), + (gst_matroska_demux_add_stream), (gst_matroskademux_do_index_seek), + (gst_matroska_demux_send_event), + (gst_matroska_demux_element_send_event), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_handle_src_event), + (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_tracks), + (gst_matroska_demux_parse_index_cuetrack), + (gst_matroska_demux_parse_index_pointentry), + (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), + (gst_matroska_demux_parse_metadata_id_simple_tag), + (gst_matroska_demux_parse_metadata_id_tag), + (gst_matroska_demux_parse_metadata), + (gst_matroska_demux_parse_attached_file), + (gst_matroska_demux_parse_attachments), + (gst_matroska_demux_parse_chapters), (gst_matroska_ebmlnum_uint), + (gst_matroska_ebmlnum_sint), (gst_matroska_demux_push_hdr_buf), + (gst_matroska_demux_push_flac_codec_priv_data), + (gst_matroska_demux_push_xiph_codec_priv_data), + (gst_matroska_demux_push_dvd_clut_change_event), + (gst_matroska_demux_add_mpeg_seq_header), + (gst_matroska_demux_add_wvpk_header), + (gst_matroska_demux_check_subtitle_buffer), + (gst_matroska_decode_buffer), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_parse_cluster), + (gst_matroska_demux_parse_contents_seekentry), + (gst_matroska_demux_parse_contents), + (gst_matroska_demux_loop_stream_parse_id), + (gst_matroska_demux_loop_stream), (gst_matroska_demux_loop), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), + (gst_matroska_demux_subtitle_caps), + (gst_matroska_demux_change_state): + * gst/matroska/matroska-ids.c: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init), + (gst_matroska_mux_reset), (gst_matroska_mux_handle_sink_event), + (gst_matroska_mux_video_pad_setcaps), + (xiph3_streamheader_to_codecdata), + (vorbis_streamheader_to_codecdata), + (theora_streamheader_to_codecdata), + (gst_matroska_mux_audio_pad_setcaps), + (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad), + (gst_matroska_mux_track_header), (gst_matroska_mux_start), + (gst_matroska_mux_write_simple_tag), (gst_matroska_mux_finish), + (gst_matroska_mux_best_pad), (gst_matroska_mux_write_data), + (gst_matroska_mux_collected), (gst_matroska_mux_change_state): + Fix indention everywhere. A broken indent version has added newlines + after every single declaration some time ago. + +2008-08-02 17:59:05 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: If no Tracks are found error out instead of trying it again until the end of time. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_loop_stream_parse_id): + If no Tracks are found error out instead of trying it again until the + end of time. + +2008-08-02 17:57:31 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: Fix demuxing of raw integer audio. The samples are unsigned only for 8 bit and signed ... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): + Fix demuxing of raw integer audio. The samples are unsigned only for 8 + bit and signed otherwise, not the other way around. + +2008-08-02 17:54:04 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.c: Add more raw YUV formats to the list of supported formats. + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + Add more raw YUV formats to the list of supported formats. + +2008-08-02 17:52:16 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.c: Add support for muxing raw float audio now that the spec defines the endianness and add ... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_audio_pad_setcaps): + Add support for muxing raw float audio now that the spec defines the + endianness and add support for muxing raw integer audio with 24 and + 32 bits. + Allow muxing of more than 8 audio channels. + +2008-08-02 17:47:32 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.c: Add locking to the global array of used track UIDs to prevent random crashes if more tha... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_create_uid), + (gst_matroska_mux_reset), (gst_matroska_mux_start): + Add locking to the global array of used track UIDs to prevent random + crashes if more than a single matrosmux instance is used. + Use 64 bit values for the track UIDs. + Use the global GRandom of GLib instead of creating our own one + for the few random numbers we need every single time. + +2008-08-02 17:18:47 +0000 Sebastian Dröge + + ext/flac/gstflacdec.c: Always post the audio-codec tag, not only if other tags are present. + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_setup_seekable_decoder), + (gst_flac_dec_setup_stream_decoder), + (gst_flac_dec_update_metadata): + Always post the audio-codec tag, not only if other tags are present. + +2008-08-01 23:26:50 +0000 Jan Schmidt + + configure.ac: Back to development -> 0.10.9.1 + Original commit message from CVS: + * configure.ac: + Back to development -> 0.10.9.1 + +2008-08-01 15:58:47 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add missing gstreamer plugins to spec file + Original commit message from CVS: + add missing gstreamer plugins to spec file + +=== release 0.10.9 === + +2008-07-31 22:10:17 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * gst-plugins-good.doap: + * win32/common/config.h: + Release 0.10.9 + Original commit message from CVS: + Release 0.10.9 + +2008-07-31 21:50:44 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/it.po: + * po/ja.po: + * po/lt.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/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + Original commit message from CVS: + Update .po files + +2008-07-31 21:26:48 +0000 Jan Schmidt + + ext/soup/gstsouphttpsrc.c: Don't throw an error when soup completes a msg with status 'cancelled', as that indicates ... + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: + Don't throw an error when soup completes a msg with status + 'cancelled', as that indicates we cancelled a request while + shutting down or seeking, and it's not an error. + Fixes: #540300 again. + +2008-07-28 20:17:46 +0000 Jan Schmidt + + configure.ac: 0.10.8.4 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.8.4 pre-release + +2008-07-25 14:50:03 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Fix segment-stop regression. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment): + Fix segment-stop regression. + Add documentation regarding segments in quicktime files by Wim Taymans. + Fixes #544509 + +2008-07-24 23:55:58 +0000 Jan Schmidt + + configure.ac: 0.10.8.3 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.8.3 pre-release + * po/LINGUAS: + * po/pt_BR.po: + Add pt_BR translation + +2008-07-23 22:01:20 +0000 Michael Smith + + gst/goom/: Fix build with MSVC: include glib.h to define inline appropriately, use header guards where needed. + Original commit message from CVS: + * gst/goom/convolve_fx.c: + * gst/goom/filters.c: + * gst/goom/goom_config.h: + * gst/goom/goom_core.c: + * gst/goom/goom_tools.h: + Fix build with MSVC: include glib.h to define inline appropriately, + use header guards where needed. + * gst/udp/gstudpnetutils.c: + * gst/udp/gstudpsrc.c: + Fix build with MSVC: use WSA* constants/functions where appropriate, use + g_snprintf rather than snprintf. + Fixes #544433. + +2008-07-22 06:32:03 +0000 Stefan Kost + + gst/debug/gsttaginject.*: Sent tags in _transform_ip() instead of _start(). Fixes #543404 partially. + Original commit message from CVS: + * gst/debug/gsttaginject.c: + * gst/debug/gsttaginject.h: + Sent tags in _transform_ip() instead of _start(). Fixes #543404 + partially. + +2008-07-19 14:12:39 +0000 Jan Schmidt + + configure.ac: 0.10.8.2 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.8.2 pre-release + +2008-07-19 13:50:53 +0000 Jan Schmidt + + ext/Makefile.am: Finish hooking up pulseaudio plugin to the build. + Original commit message from CVS: + * ext/Makefile.am: + Finish hooking up pulseaudio plugin to the build. + * ext/pulse/pulsemixerctrl.c: + Fix compilation error. + +2008-07-19 13:23:29 +0000 Jan Schmidt + + po/: Add new lithunian translation, and add french to the LINGUAS file. + Original commit message from CVS: + * po/LINGUAS: + * po/lt.po: + Add new lithunian translation, and add french to the LINGUAS + file. + +2008-07-19 13:08:42 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.c: Fix Soup HTTP source seeking. + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: + Fix Soup HTTP source seeking. + Patch By: Wouter Cloetens + Fixes: #540300 + * tests/check/elements/.cvsignore: + Ignore new check programs. + +2008-07-19 01:01:13 +0000 Jan Schmidt + + Move replaygain and interleave plugins from -bad. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * tests/check/Makefile.am: + Move replaygain and interleave plugins from -bad. + Fixes: #543406 + Fixes: #536228 + +2008-07-18 20:03:07 +0000 Mark Nauwelaerts + + gst/qtdemux/qtdemux.c: Revert ISO base media spec based pixel-aspect-ratio calculation. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), + (qtdemux_parse_trak): + Revert ISO base media spec based pixel-aspect-ratio calculation. + Fixes #543300. + +2008-07-17 16:42:53 +0000 Edward Hervey + + sys/osxvideo/osxvideosink.m: Fix minor build issues on macosx. + Original commit message from CVS: + * sys/osxvideo/osxvideosink.m: + Fix minor build issues on macosx. + Fixes #543054 + +2008-07-17 14:40:51 +0000 Tim-Philipp Müller + + Only use -Wno-attributes (which is there to work around a bug in the taglib 1.5 headers) if the c++ compiler actually... + Original commit message from CVS: + * configure.ac:: + * ext/taglib/Makefile.am:: + Only use -Wno-attributes (which is there to work around a + bug in the taglib 1.5 headers) if the c++ compiler actually + supports it (#543255). + +2008-07-17 13:54:38 +0000 Benoit Fouet + + sys/v4l2/gstv4l2src.c: Avoid compiler warning by initialising variable to NULL (#543259). + Original commit message from CVS: + Patch by: Benoit Fouet + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_negotiate): + Avoid compiler warning by initialising variable to NULL (#543259). + +2008-07-14 17:17:47 +0000 Sebastian Dröge + + gst/debug/gsttaginject.c: Don't pass NULL taglists to gst_tag_list_is_empty(). + Original commit message from CVS: + * gst/debug/gsttaginject.c: (gst_tag_inject_start): + Don't pass NULL taglists to gst_tag_list_is_empty(). + +2008-07-14 17:15:42 +0000 Sebastian Dröge + + tests/check/elements/: Don't use declarations after statements. + Original commit message from CVS: + * tests/check/elements/cmmldec.c: (GST_START_TEST): + * tests/check/elements/rtp-payloading.c: (rtp_pipeline_create), + (rtp_pipeline_run): + * tests/check/elements/souphttpsrc.c: (souphttpsrc_suite): + Don't use declarations after statements. + +2008-07-14 16:28:25 +0000 Mark Nauwelaerts + + ext/jpeg/gstjpegdec.c: Align documentation with reality. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: + Align documentation with reality. + +2008-07-14 13:11:14 +0000 Sebastian Dröge + + gst/udp/gstudpnetutils.c: EAI_ADDRFAMILY was obsoleted in BSD at some point. Define it to the old value (1) if it's n... + Original commit message from CVS: + * gst/udp/gstudpnetutils.c: + EAI_ADDRFAMILY was obsoleted in BSD at some point. Define it to the + old value (1) if it's not defined which should not cause any problems + as we're using it internal only anyway. + +2008-07-14 13:02:48 +0000 Alessandro Decina + + gst/avi/gstavidemux.c: Fix build of avidemux on big endian architectures. + Original commit message from CVS: + Patch by: Alessandro Decina + * gst/avi/gstavidemux.c: (gst_avi_demux_riff_parse_vprp): + Fix build of avidemux on big endian architectures. + +2008-07-10 20:47:56 +0000 Thiago Sousa Santos + + gst/qtdemux/qtdemux.c: Correctly distinguish 8bit vs 16bit raw audio. Fixes #542410. + Original commit message from CVS: + Patch by: Thiago Sousa Santos + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Correctly distinguish 8bit vs 16bit raw audio. Fixes #542410. + +2008-07-08 21:05:18 +0000 Mark Nauwelaerts + + gst/qtdemux/qtdemux.c: Set pixel-aspect-ratio in caps using display width and height provided in track. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), + (qtdemux_parse_trak): + Set pixel-aspect-ratio in caps using display width and height + provided in track. + +2008-07-08 13:59:51 +0000 Sebastian Dröge + + configure.ac: Don't include ERROR_CFLAGS in GST_CXXFLAGS as it might include flags that are invalid for C++. Fixes bu... + Original commit message from CVS: + * configure.ac: + Don't include ERROR_CFLAGS in GST_CXXFLAGS as it might include + flags that are invalid for C++. Fixes bug #516509. + +2008-07-08 12:51:34 +0000 Sebastian Dröge + + Don't use declarations after statements and variable length arrays. + Original commit message from CVS: + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_uri_set_uri): + * ext/speex/gstspeexenc.c: (gst_speex_enc_sink_getcaps): + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_set_wp_config): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_fixate): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format): + * tests/examples/equalizer/demo.c: (message_handler): + * tests/examples/spectrum/demo-audiotest.c: (message_handler): + * tests/examples/spectrum/demo-osssrc.c: (message_handler): + Don't use declarations after statements and variable length arrays. + +2008-07-07 21:28:58 +0000 Daniel Drake + + sys/v4l2/v4l2src_calls.c: Try progressive video if interlaced fails. Fixes bug #541956 and the usage of v4l2src on OLPC. + Original commit message from CVS: + Patch by: Daniel Drake + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture), + (gst_v4l2src_get_nearest_size): + Try progressive video if interlaced fails. Fixes bug #541956 + and the usage of v4l2src on OLPC. + +2008-07-07 15:34:12 +0000 Sebastian Dröge + + gst/rtp/gstrtpspeexdepay.*: Revert last change: Only the jitterbuffer is able to convert RTP to + Original commit message from CVS: + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init), + (gst_rtp_speex_depay_process): + * gst/rtp/gstrtpspeexdepay.h: + Revert last change: Only the jitterbuffer is able to convert RTP to + Gstreamer timestamps and normal (de)payloaders should simply copy it. + Reopens bug #541787. + +2008-07-07 10:30:51 +0000 Stefan Kost + + gst/rtp/gstrtpvrawdepay.c: Include stdlib.h for atoi(). + Original commit message from CVS: + * gst/rtp/gstrtpvrawdepay.c: + Include stdlib.h for atoi(). + * gst/rtsp/gstrtspsrc.c: + Use floating point math for latencies < 0 sec in log output. + +2008-07-07 10:16:07 +0000 Tomasz Grobelny + + gst/rtp/gstrtpspeexdepay.*: Take timestamp from the RTP packet as a first step to fix problems with transmission over... + Original commit message from CVS: + Patch by: Tomasz Grobelny + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init), + (gst_rtp_speex_depay_process): + * gst/rtp/gstrtpspeexdepay.h: + Take timestamp from the RTP packet as a first step to fix problems + with transmission over RTP when the network is not reliable. + Fixes bug #541787. + +2008-07-05 19:01:28 +0000 Tero Saarni + + gst/udp/gstudpsrc.c: Fix parsing of udp:// URIs containing IPv6 addresses. + Original commit message from CVS: + Patch by: Tero Saarni + * gst/udp/gstudpsrc.c: (gst_udpsrc_set_uri): + Fix parsing of udp:// URIs containing IPv6 addresses. + Fixes bug #541650. + +2008-07-04 20:43:07 +0000 Mark Nauwelaerts + + ext/gdk_pixbuf/gstgdkpixbuf.c: Do not leak incoming buffers. + Original commit message from CVS: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): + Do not leak incoming buffers. + +2008-07-03 19:27:53 +0000 Damien Lespiau + + configure.ac: Fix build of the RTP plugin with mingw32 by linking to ws2_32 for htons() and htonl(). Fixes bug #541412. + Original commit message from CVS: + Patch by: Damien Lespiau + * configure.ac: + Fix build of the RTP plugin with mingw32 by linking to ws2_32 + for htons() and htonl(). Fixes bug #541412. + +2008-07-02 09:51:16 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: Handle position and duration query in DEFAULT format if the pad's track has a default ... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), + (gst_matroska_demux_add_stream), (gst_matroska_demux_query), + (gst_matroska_demux_element_query), + (gst_matroska_demux_handle_src_query), + (gst_matroska_demux_handle_seek_event): + Handle position and duration query in DEFAULT format if the + pad's track has a default frame duration set. + Fix seeking now that the segment's duration doesn't contain the + (possibly wrong or inaccurate) duration of the Matroska file. + +2008-07-02 09:04:50 +0000 Sebastian Dröge + + gst/matroska/ebml-read.c: Use NAN constant instead of 0.0/0.0 if possible. NAN is defined in math.h except on MSVC wh... + Original commit message from CVS: + * gst/matroska/ebml-read.c: (_ext2dbl): + Use NAN constant instead of 0.0/0.0 if possible. NAN is defined + in math.h except on MSVC where it is defined in xmath.h. + Fixes compilation with MSVC. + +2008-07-02 08:57:04 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.*: Don't set the segment duration to the duration from the Matroska header as this value ... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroska_demux_handle_src_query), + (gst_matroska_demux_parse_info), + (gst_matroska_demux_loop_stream_parse_id): + * gst/matroska/matroska-demux.h: + Don't set the segment duration to the duration from the Matroska + header as this value could be wrong and is just informational. + +2008-07-02 08:47:00 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: If no Tracks element is found until the first Cluster is found search it and error out... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_loop_stream_parse_id): + If no Tracks element is found until the first Cluster is found + search it and error out if none is found in the complete file. + +2008-07-02 08:14:35 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: Resync non-subtitle tracks too if a too large gap compared to other tracks is detected. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_sync_streams): + Resync non-subtitle tracks too if a too large gap compared to other + tracks is detected. + +2008-07-01 13:28:02 +0000 Wim Taymans + + gst/rtp/: Add raw video pay and depayloaders, see RFC4175. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_base_init), + (gst_rtp_vraw_depay_class_init), (gst_rtp_vraw_depay_init), + (gst_rtp_vraw_depay_setcaps), (gst_rtp_vraw_depay_process), + (gst_rtp_vraw_depay_change_state), + (gst_rtp_vraw_depay_plugin_init): + * gst/rtp/gstrtpvrawdepay.h: + * gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_get_type), + (gst_rtp_vraw_pay_base_init), (gst_rtp_vraw_pay_class_init), + (gst_rtp_vraw_pay_init), (gst_rtp_vraw_pay_finalize), + (gst_rtp_vraw_pay_setcaps), (gst_rtp_vraw_pay_handle_buffer), + (gst_rtp_vraw_pay_plugin_init): + * gst/rtp/gstrtpvrawpay.h: + Add raw video pay and depayloaders, see RFC4175. + +2008-06-30 22:53:39 +0000 Jan Schmidt + + ext/libpng/gstpngdec.c: Don't return GST_FLOW_ERROR when buffer_alloc fails - return whatever it returned. + Original commit message from CVS: + * ext/libpng/gstpngdec.c: + Don't return GST_FLOW_ERROR when buffer_alloc fails - return + whatever it returned. + +2008-06-29 19:52:51 +0000 Mark Nauwelaerts + + gst/avi/avi-ids.h: Add vprp chunk related structures. + Original commit message from CVS: + * gst/avi/avi-ids.h: + Add vprp chunk related structures. + * gst/avi/gstavidemux.c: (gst_avi_demux_riff_parse_vprp), + (gst_avi_demux_parse_stream): + Parse optional vprp chunk and add calculated pixel-aspect-ratio + to caps. Fixes #539482. + * gst/avi/gstavimux.h: + * gst/avi/gstavimux.c: (gst_avi_mux_pad_reset), + (gst_avi_mux_vidsink_set_caps), (gst_avi_mux_riff_get_avi_header): + Add a vprp chunk if non-trival pixel-aspect-ratio provided in caps. + +2008-06-28 19:31:46 +0000 Mark Nauwelaerts + + tests/check/elements/avimux.c: Adjust avimux unit test according to increased streamheader size. + Original commit message from CVS: + * tests/check/elements/avimux.c: (check_avimux_pad): + Adjust avimux unit test according to increased streamheader size. + +2008-06-27 18:11:01 +0000 David Schleef + + gst/qtdemux/qtdemux.c: Add Dirac stream type + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: Add Dirac stream type + +2008-06-27 15:25:00 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.*: Add 8 bytes to current streamheader to make for a complete one and to make more players happy. ... + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_riff_get_avi_header): + * gst/avi/gstavimux.h: + Add 8 bytes to current streamheader to make for a complete one + and to make more players happy. Fixes #519460. + +2008-06-26 16:36:47 +0000 Tim-Philipp Müller + + sys/v4l2/v4l2_calls.c: Don't include unused gstv4l2xoverlay.h. Fixes build in case where X11 headers are not installed. + Original commit message from CVS: + * sys/v4l2/v4l2_calls.c:: + Don't include unused gstv4l2xoverlay.h. Fixes build + in case where X11 headers are not installed. + +2008-06-26 10:07:46 +0000 Wim Taymans + + ext/dv/gstdv.c: Fix compilation. + Original commit message from CVS: + * ext/dv/gstdv.c: (plugin_init): + Fix compilation. + +2008-06-26 09:37:23 +0000 Edward Hervey + + ext/dv/gstdv.c: Marking rank of dvdec as GST_RANK_MARGINAL since it's the slowest + Original commit message from CVS: + * ext/dv/gstdv.c: (plugin_init): + Marking rank of dvdec as GST_RANK_MARGINAL since it's the slowest + DV decoder available. + Fixes #532393 + +2008-06-25 08:12:18 +0000 Sebastian Dröge + + gst/udp/gstudpsrc.c: Call getsockname() after the call to bind() to get updated values for the port, etc. This fixes ... + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + Call getsockname() after the call to bind() to get updated values + for the port, etc. This fixes the usage of udpsrc on anonymous + binding and it's usage by rtspsrc. Fixes bugs #539372, #539548. + Thanks to Aurelien Grimaud for pointing out the obvious fix. + +2008-06-25 07:57:26 +0000 Sebastian Dröge + + tests/check/pipelines/wavpack.c: Remove workaround for a bug in identity that is fixed in 0.10.20. + Original commit message from CVS: + * tests/check/pipelines/wavpack.c: (bus_handler): + Remove workaround for a bug in identity that is fixed in 0.10.20. + +2008-06-25 06:36:58 +0000 Jason Donenfeld + + ext/soup/gstsouphttpsrc.c: Fix HTTP auth support with user/password passed via the URI. + Original commit message from CVS: + Patch by: Jason Donenfeld + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_headers_cb): + Fix HTTP auth support with user/password passed via the URI. + Fixes bug #540067. + +2008-06-24 15:42:33 +0000 Tim-Philipp Müller + + configure.ac: Depend on released versions of core and -base. + Original commit message from CVS: + * configure.ac: + Depend on released versions of core and -base. + +2008-06-23 16:13:40 +0000 Julien Moutte + + gst/matroska/matroska-demux.c: Fix buggy format strings in macros. (makes it build on OS X again...) + Original commit message from CVS: + 2008-06-23 Julien Moutte + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_read_track_encoding), + (gst_matroska_demux_parse_blockgroup_or_simpleblock): Fix buggy + format strings in macros. (makes it build on OS X again...) + +2008-06-20 16:24:11 +0000 Thomas Vander Stichele + + gst/: Added debug. + Original commit message from CVS: + * gst/rtp/gstrtptheorapay.c: + * gst/udp/gstmultiudpsink.c: + Added debug. + +2008-06-20 15:21:59 +0000 Christian Schaller + + * ChangeLog: + * common: + * configure.ac: + switch v4l2src from experimental to normal build. Fixes #536831 + Original commit message from CVS: + switch v4l2src from experimental to normal build. Fixes #536831 + +2008-06-19 11:24:54 +0000 Wim Taymans + + gst/rtp/gstrtpg726pay.c: Remove unused variable so that we can compile again. + Original commit message from CVS: + * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_setcaps): + Remove unused variable so that we can compile again. + +2008-06-19 11:06:29 +0000 Peter Kjellerstedt + + gst/rtp/gstrtpg726pay.c: No need to check for audio/G723 and audio/32KADPCM here as they are no longer supported. + Original commit message from CVS: + * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_setcaps): + No need to check for audio/G723 and audio/32KADPCM here as they are + no longer supported. + +2008-06-19 10:58:57 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Use G_GINT64_CONSTANT, this fixes the duration query on files without known length. + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), + (gst_wavpack_parse_src_query), (gst_wavpack_parse_create_src_pad): + Use G_GINT64_CONSTANT, this fixes the duration query on files without + known length. + +2008-06-19 10:48:57 +0000 Sebastian Dröge + + gst/matroska/: Fix demuxing of WavPack files. Muxing is still broken. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_add_wvpk_header), + (gst_matroska_demux_audio_caps): + * gst/matroska/matroska-ids.h: + Fix demuxing of WavPack files. Muxing is still broken. + +2008-06-19 09:12:55 +0000 Sebastian Dröge + + gst/matroska/: Add a "vfunc" to the track context for postprocessing frames and convert the wavpack and subtitle post... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_track_free), + (gst_matroska_demux_add_mpeg_seq_header), + (gst_matroska_demux_add_wvpk_header), + (gst_matroska_demux_check_subtitle_buffer), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), + (gst_matroska_demux_subtitle_caps): + * gst/matroska/matroska-ids.h: + Add a "vfunc" to the track context for postprocessing frames and + convert the wavpack and subtitle postprocessing to this vfunc. + Copy buffer flags in those functions to the new buffers too. + Parse CodecState elements of Blocks. + Add a postprocessing function for MPEG video that adds the sequence + header from the codec private data or codec state to the frames if + it's not already there. + +2008-06-19 08:22:16 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: If a gap of more than 1/2 second is found in one stream send a + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup_or_simpleblock): + If a gap of more than 1/2 second is found in one stream send a + NEWSEGMENT event to not stall the pipeline if the gap is too large. + This also fixes Matroska files where the first buffer doesn't start + at timestamp 0. Fixes bug #429322. + The duration of a block is the default duration multiplied with the + number of laces. Every lace is one frame and the default duration + is the duration of one frame. This fixes playback of files that use + lacing for some tracks. + +2008-06-18 20:09:28 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: Update FIXME/TODOs and only ignore EOS at the central, important place instead of seve... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_contents_seekentry): + Update FIXME/TODOs and only ignore EOS at the central, important place + instead of several places. + +2008-06-18 16:55:05 +0000 Wim Taymans + + gst/rtp/gstrtpg726pay.c: Fix caps, See #538891. + Original commit message from CVS: + * gst/rtp/gstrtpg726pay.c: + Fix caps, See #538891. + +2008-06-18 10:28:20 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: Improve debug output everywhere and fix the EOS logic. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroska_demux_stream_from_num), + (gst_matroska_demux_encoding_cmp), + (gst_matroska_demux_encoding_order_unique), + (gst_matroska_demux_read_track_encoding), + (gst_matroska_demux_read_track_encodings), + (gst_matroska_demux_tracknumber_unique), + (gst_matroska_demux_add_stream), (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_tracks), + (gst_matroska_demux_parse_index_cuetrack), + (gst_matroska_demux_parse_index_pointentry), + (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), + (gst_matroska_demux_parse_metadata_id_simple_tag), + (gst_matroska_demux_parse_metadata_id_tag), + (gst_matroska_demux_parse_metadata), + (gst_matroska_demux_parse_attached_file), + (gst_matroska_demux_parse_attachments), + (gst_matroska_demux_parse_chapters), + (gst_matroska_demux_sync_streams), (gst_matroska_decode_buffer), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_parse_cluster), + (gst_matroska_demux_parse_contents_seekentry), + (gst_matroska_demux_parse_contents), + (gst_matroska_demux_loop_stream_parse_id), + (gst_matroska_demux_loop): + Improve debug output everywhere and fix the EOS logic. + Check the values of the ContentEncoding elements more strictly and + don't use tracks for which it's invalid. + Check that the track number is unique for this stream. + Check that seek positions are below G_MAXINT64 as our seeks are + int64-based and overflows will fail badly. + After seeks also don't push SimpleBlocks until the first one + containing a keyframe is found. Before this was done only for normal + Blocks. + Update some FIXME/TODOs. + * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes), + (gst_ebml_read_utf8), (gst_ebml_read_header): + Improve debug output. + * gst/matroska/matroska-ids.c: + (gst_matroska_track_init_video_context): + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_video_pad_setcaps): + Remove eye mode and don't parse it anymore. We can't use that + information in GStreamer yet so it's useless. + +2008-06-18 10:12:57 +0000 mersad + + gst/rtp/: Added G726 pay/depayloaders. Fixes #538891. + Original commit message from CVS: + Patch by: mersad + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_base_init), + (gst_rtp_g726_depay_class_init), (gst_rtp_g726_depay_init), + (gst_rtp_g726_depay_setcaps), (gst_rtp_g726_depay_process), + (gst_rtp_g726_depay_plugin_init): + * gst/rtp/gstrtpg726depay.h: + * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_base_init), + (gst_rtp_g726_pay_class_init), (gst_rtp_g726_pay_init), + (gst_rtp_g726_pay_setcaps), (gst_rtp_g726_pay_plugin_init): + * gst/rtp/gstrtpg726pay.h: + Added G726 pay/depayloaders. Fixes #538891. + +2008-06-17 10:14:47 +0000 Wim Taymans + + gst/rtsp/URLS: Some more urls. + Original commit message from CVS: + * gst/rtsp/URLS: + Some more urls. + * gst/smpte/barboxwipes.c: + Add a comment + * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: + Fix typo, add audioresample to the pipeline. + +2008-06-17 10:05:55 +0000 Wim Taymans + + ext/libmng/: Somewhat port mngenc and mngdec to 0.10. Does not work yet and has many bits ifdeffed out still. + Original commit message from CVS: + * ext/libmng/Makefile.am: + * ext/libmng/gstmng.c: (plugin_init): + * ext/libmng/gstmngdec.c: (gst_mng_dec_base_init), + (gst_mng_dec_class_init), (gst_mng_dec_sink_setcaps), + (gst_mng_dec_init), (gst_mng_dec_src_getcaps), (gst_mng_dec_loop), + (gst_mng_dec_get_property), (gst_mng_dec_set_property), + (mngdec_error), (mngdec_openstream), (mngdec_closestream), + (gst_mng_dec_sink_event), (mngdec_readdata), (mngdec_settimer), + (mngdec_processheader), (mngdec_getcanvasline), (mngdec_refresh), + (gst_mng_dec_change_state): + * ext/libmng/gstmngdec.h: + * ext/libmng/gstmngenc.c: (gst_mng_enc_base_init), + (gst_mng_enc_class_init), (gst_mng_enc_sink_setcaps), + (gst_mng_enc_init), (gst_mng_enc_chain), + (gst_mng_enc_get_property), (gst_mng_enc_set_property): + * ext/libmng/gstmngenc.h: + Somewhat port mngenc and mngdec to 0.10. Does not work yet and has many + bits ifdeffed out still. + +2008-06-16 11:34:54 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.c: When comparing index elements with the same time compare their block number. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_index_compare): + When comparing index elements with the same time compare their + block number. + +2008-06-16 11:31:06 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_attached_file) + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_attached_file) + Init variable to NULL to avoid compiler warning. + +2008-06-16 10:59:39 +0000 Sebastian Dröge + + gst/matroska/: Parse Attachments and post them as GST_TAG_IMAGE if we detect it as image and otherwise as GST_TAG_ATT... + Original commit message from CVS: + * gst/matroska/Makefile.am: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroska_demux_parse_attached_file), + (gst_matroska_demux_parse_attachments), + (gst_matroska_demux_parse_contents_seekentry), + (gst_matroska_demux_loop_stream_parse_id): + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-ids.c: (gst_matroska_register_tags): + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska.c: (plugin_init): + Parse Attachments and post them as GST_TAG_IMAGE if we detect + it as image and otherwise as GST_TAG_ATTACHMENT. Include filename + and description of the attachments in the caps. Fixes bug #537622. + +2008-06-16 10:09:03 +0000 Wim Taymans + + ext/speex/gstspeexenc.c: Add mode property. + Original commit message from CVS: + * ext/speex/gstspeexenc.c: (gst_speex_enc_mode_get_type), + (gst_speex_enc_class_init), (gst_speex_enc_sink_getcaps), + (gst_speex_enc_get_latency), (gst_speex_enc_get_query_types), + (gst_speex_enc_src_query), (gst_speex_enc_init), + (gst_speex_enc_setup), (gst_speex_enc_push_buffer), + (gst_speex_enc_chain), (gst_speex_enc_get_property), + (gst_speex_enc_set_property): + Add mode property. + Some cleanups, add more debug info. + Add latency query. + +2008-06-16 09:54:27 +0000 Sebastian Dröge + + gst/matroska/ebml-read.c: Return GST_FLOW_UNEXPECTED instead of GST_FLOW_ERROR on short reads. + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes): + Return GST_FLOW_UNEXPECTED instead of GST_FLOW_ERROR on short reads. + If we get less bytes than requested we can't do anything except doing + our EOS logic. + +2008-06-15 19:09:54 +0000 Sebastian Dröge + + gst/matroska/: Use a GArray for storing the Cue (i.e. seek) information, store the CueTrackPositions for every track,... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroskademux_do_index_seek), + (gst_matroska_demux_parse_index_cuetrack), + (gst_matroska_demux_parse_index_pointentry), + (gst_matroska_index_compare), (gst_matroska_demux_parse_index), + (gst_matroska_demux_parse_metadata): + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-ids.h: + Use a GArray for storing the Cue (i.e. seek) information, store + the CueTrackPositions for every track, store the block number + and optimize searching in the array by sorting it after the last + element was added. + Fix a small memory leak when trying to parse a tags element that was + already parsed. + +2008-06-15 15:29:29 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.*: Don't write another SeekHead which indexes all Clusters to the end of the file. This isn... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), + (gst_matroska_mux_start), (gst_matroska_mux_finish), + (gst_matroska_mux_write_data): + * gst/matroska/matroska-mux.h: + Don't write another SeekHead which indexes all Clusters to the end of + the file. This isn't useful for anything and just increases filesize. + +2008-06-15 15:01:30 +0000 Sebastian Dröge + + gst/matroska/ebml-read.c: Prevent unaligned memory access when reading floats. + Original commit message from CVS: + * gst/matroska/ebml-read.c: (_ext2dbl), (gst_ebml_read_float): + Prevent unaligned memory access when reading floats. + +2008-06-15 14:08:41 +0000 Sebastian Dröge + + gst/matroska/: Make sure that every Tags element is only parsed once and it's containing tags are only posted once. + Original commit message from CVS: + * gst/matroska/ebml-read.c: + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroska_demux_parse_metadata): + * gst/matroska/matroska-demux.h: + Make sure that every Tags element is only parsed once and it's + containing tags are only posted once. + +2008-06-15 09:43:25 +0000 Sebastian Dröge + + gst/matroska/: Handle EBML elements like Void or CRC32 in the EbmlRead base class already. They're not useful in the ... + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_peek_id), + (gst_ebml_read_header): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_parse_tracks), + (gst_matroska_demux_parse_index_cuetrack), + (gst_matroska_demux_parse_index_pointentry), + (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), + (gst_matroska_demux_parse_metadata_id_simple_tag), + (gst_matroska_demux_parse_metadata_id_tag), + (gst_matroska_demux_parse_metadata), + (gst_matroska_demux_parse_attachments), + (gst_matroska_demux_parse_chapters), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_parse_cluster), + (gst_matroska_demux_parse_contents_seekentry), + (gst_matroska_demux_parse_contents), + (gst_matroska_demux_loop_stream_parse_id): + Handle EBML elements like Void or CRC32 in the EbmlRead base class + already. They're not useful in the matroska parser and only cause + additional code. + +2008-06-14 15:51:25 +0000 Sebastian Dröge + + gst/matroska/: Reverse the level list as we usually are only interested in the first element or want to add a new fir... + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_level_free), + (gst_ebml_finalize), (gst_ebml_read_change_state), + (gst_ebml_read_element_level_up), (gst_ebml_read_master): + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_contents_seekentry): + Reverse the level list as we usually are only interested in the + first element or want to add a new first element. Having the + first element stored at the end and calling g_list_last() and + g_list_append() is more expensive. + Also use GSlice for allocating the GstEbmlLevel structs. + +2008-06-13 21:13:46 +0000 Tim-Philipp Müller + + gst/debug/gsttaginject.c: Don't unref NULL taglist in finalize. Don't use c++ style comments. + Original commit message from CVS: + * gst/debug/gsttaginject.c: (gst_tag_inject_finalize), + (gst_tag_inject_class_init), (gst_tag_inject_init): + Don't unref NULL taglist in finalize. Don't use c++ style + comments. + +2008-06-13 19:14:41 +0000 Sebastian Dröge + + gst/matroska/: Use gst_value_serialize() and gst_value_deserialize() for transforming tags from some GType to a strin... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_metadata_id_simple_tag): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_write_simple_tag), + (gst_matroska_mux_write_data): + Use gst_value_serialize() and gst_value_deserialize() for transforming + tags from some GType to a string and the other way around. The default + transformations in GLib don't include transformations from string to + number types. + +2008-06-13 19:07:03 +0000 Sebastian Dröge + + gst/matroska/matroska-demux.*: Only parse Tracks, SeekHead and SegmentInfo elements once but allow + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroska_demux_parse_tracks), + (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), + (gst_matroska_demux_parse_attachments), + (gst_matroska_demux_parse_chapters), + (gst_matroska_demux_parse_contents_seekentry), + (gst_matroska_demux_loop_stream_parse_id): + * gst/matroska/matroska-demux.h: + Only parse Tracks, SeekHead and SegmentInfo elements once but allow + Tags multiple times. The first ones can appear more than once but must + contain the same content as the first for backup purposes so we ignore + all but the first one. Tags can appear multiple times with different + content. + Jump to all elements except Clusters that are available from a + SeekHead to make it more likely to have all required informations + before getting to the first Clusters. + Add dummy functions for parsing Attachments and Chapters. + +2008-06-13 14:33:52 +0000 Stefan Kost + + gst/replaygain/: More doc updates. + Original commit message from CVS: + * gst/replaygain/gstrganalysis.c: + * gst/replaygain/gstrglimiter.c: + * gst/replaygain/gstrgvolume.c: + More doc updates. + +2008-06-13 11:59:23 +0000 Stefan Kost + + docs/plugins/: docs/plugins/inspect/plugin-mythtv.xml + Original commit message from CVS: + * 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-alsaspdif.xml: + * docs/plugins/inspect/plugin-amrwb.xml: + * docs/plugins/inspect/plugin-app.xml: + * docs/plugins/inspect/plugin-bayer.xml: + * docs/plugins/inspect/plugin-bz2.xml: + * docs/plugins/inspect/plugin-cdaudio.xml: + * docs/plugins/inspect/plugin-cdxaparse.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-filter.xml: + * docs/plugins/inspect/plugin-flvdemux.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-h264parse.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-ladspa.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-mpegtsparse.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-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-oss4.xml + * docs/plugins/inspect/plugin-rawparse.xml: + * docs/plugins/inspect/plugin-real.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rfbsrc.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-speexresample.xml: + * docs/plugins/inspect/plugin-stereo.xml: + * docs/plugins/inspect/plugin-subenc.xml + * docs/plugins/inspect/plugin-timidity.xml: + * docs/plugins/inspect/plugin-tta.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-xvid.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + * ext/amrwb/gstamrwbdec.c: + * ext/amrwb/gstamrwbenc.c: + * ext/amrwb/gstamrwbparse.c: + * ext/dc1394/gstdc1394.c: + * ext/directfb/dfbvideosink.c: + * ext/ivorbis/vorbisdec.c: + * ext/jack/gstjackaudiosink.c: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mplex/gstmplex.cc: + * ext/musicbrainz/gsttrm.c: + * ext/mythtv/gstmythtvsrc.c: + * ext/theora/theoradec.c: + * ext/timidity/gsttimidity.c: + * ext/timidity/gstwildmidi.c: + * gst-libs/gst/app/gstappsink.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/dvdspu/gstdvdspu.c: + * gst/festival/gstfestival.c: + * gst/freeze/gstfreeze.c: + * gst/interleave/deinterleave.c: + * gst/interleave/interleave.c: + * gst/modplug/gstmodplug.cc: + * gst/nuvdemux/gstnuvdemux.c: + Add missing elements to docs. Fix doc-markup: use convinience syntax + for examples (produces valid docbook), add several refsec2 when we + have several titles. Fix some types. + +2008-06-13 11:54:05 +0000 Wim Taymans + + gst/udp/gstudpsrc.*: Add property to control automatic join/leave of multicast groups. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Add property to control automatic join/leave of multicast groups. + Add G_LIKELY. + Remove setting caps on buffers explicitly, basesrc does that for us now. + Improve debug info. + Convert some non-fatal error into warnings. + Use g_ntohs for better portability. + Leave multicast groups when stopping. + When using external sockets, use getsockname() on them to fill up the + addr structure before calling methods that use the structure. + Should all fix #536903. + API: GstUDPSrc::auto-multicast property + +2008-06-13 11:47:28 +0000 Wim Taymans + + gst/udp/gstudpnetutils.c: Use g_ntohl for better portability. + Original commit message from CVS: + * gst/udp/gstudpnetutils.c: (gst_udp_is_multicast): + Use g_ntohl for better portability. + +2008-06-13 11:45:54 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.c: Fix a typo and do some small cleanups. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send), + (gst_multiudpsink_remove): + Fix a typo and do some small cleanups. + +2008-06-13 09:39:41 +0000 Olivier Crete + + gst/rtp/gstrtptheoradepay.c: Make the delivery-method mandatory on the caps and only accept inline for now. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps): + Make the delivery-method mandatory on the caps and only accept inline + for now. + Reverse strcmp checks for delivery-method. + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps): + Make delivery method optional when parsing caps and note this in the + caps. + Reverse strcmp checks for delivery-method. + * gst/rtp/gstrtpvorbispay.c: + Update a comment to note that the delivery-method is optional, + Fixes #537675. + +2008-06-12 17:30:06 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Set udpsrc for receiving data from multicast groups to PAUSED instead of leaving them in READY... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_mcast): + Set udpsrc for receiving data from multicast groups to PAUSED instead of + leaving them in READY. Fixes #537832. + +2008-06-12 12:14:38 +0000 Stefan Kost + + gst/avi/gstavimux.c: Simplify code. gst_tag_list_merge() does the NULL checks. Add a FIXME for a random constant in t... + Original commit message from CVS: + * gst/avi/gstavimux.c: + Simplify code. gst_tag_list_merge() does the NULL checks. Add a FIXME + for a random constant in tagmuxing code. + +2008-06-11 14:28:44 +0000 Stefan Kost + + gst/debug/gsttaginject.*: Now actually adding the new element. + Original commit message from CVS: + * gst/debug/gsttaginject.c: + * gst/debug/gsttaginject.h: + Now actually adding the new element. + +2008-06-11 14:11:16 +0000 Stefan Kost + + Remove dummy plugin_init. Remove some undefined entries from doc- section file. Add taginject element and rebuild doc... + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * gst/debug/Makefile.am: + * gst/debug/breakmydata.c: + * gst/debug/efence.c: + * gst/debug/gstdebug.c: + * gst/debug/gstnavseek.c: + * gst/debug/gstpushfilesrc.c: + * gst/debug/gstpushfilesrc.h: + * gst/debug/negotiation.c: + * gst/debug/progressreport.c: + * gst/debug/progressreport.h: + * gst/debug/rndbuffersize.c: + * gst/debug/testplugin.c: + Remove dummy plugin_init. Remove some undefined entries from doc- + section file. Add taginject element and rebuild docs for it. + +2008-06-11 11:27:46 +0000 Sebastian Dröge + + gst/matroska/matroska-mux.c: Update the counter for the number of streams when pads are added or removed. This will m... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_request_new_pad), + (gst_matroska_mux_release_pad), (gst_matroska_mux_write_data): + Update the counter for the number of streams when pads are added or + removed. This will make sure that a seek table is generated for + files with just one audio stream. + +2008-06-11 11:18:23 +0000 Sebastian Dröge + + gst/matroska/: Add some more tags, improve debugging a bit and make sure that + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_metadata_id_simple_tag): + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_write_simple_tag): + Add some more tags, improve debugging a bit and make sure that + GValue transformation has succeeded before using the result + as a tag. + +2008-06-11 08:56:16 +0000 Olivier Crete + + gst/rtp/gstrtptheorapay.c: The Theora RTP payloader only supports the "inline" delievery method so let's declare this... + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtptheorapay.c: + The Theora RTP payloader only supports the "inline" delievery method + so let's declare this on the caps of the static pad template. + Fixes bug #537675. + +2008-06-10 17:20:45 +0000 Wim Taymans + + gst/videomixer/videomixer.c: Remove bogus check. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_fill_queues), + (gst_videomixer_blend_buffers), (gst_videomixer_update_queues): + Remove bogus check. + +2008-06-10 16:25:24 +0000 Wim Taymans + + gst/videomixer/videomixer.c: Use stream_time to synchronize the object properties. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_fill_queues), + (gst_videomixer_blend_buffers): + Use stream_time to synchronize the object properties. + Use running_time of the master pad to timestamp outgoing buffers. + Fix the initial segment event to extend an unknown amount of time. + Fixes #537361. + +2008-06-10 11:05:30 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Try to ignore unparsable/unknown streams and give a warning instead of erroring out. Fixes #53... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_parse_index), (gst_avi_demux_massage_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_stream_header_push), + (gst_avi_demux_stream_header_pull): + Try to ignore unparsable/unknown streams and give a warning instead of + erroring out. Fixes #537377. + +2008-06-10 10:44:53 +0000 Sebastian Dröge + + gst/matroska/ebml-write.c: Use GDOUBLE_TO_BE() instead of (probably slower) custom code. + Original commit message from CVS: + * gst/matroska/ebml-write.c: (gst_ebml_write_float): + Use GDOUBLE_TO_BE() instead of (probably slower) custom code. + * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init), + (gst_matroska_demux_class_init), (gst_matroska_demux_init), + (gst_matroska_track_free), (gst_matroska_demux_encoding_cmp), + (gst_matroska_demux_read_track_encodings), + (gst_matroska_demux_add_stream), + (gst_matroska_demux_handle_src_query), + (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_index_cuetrack), + (gst_matroska_demux_parse_index_pointentry), + (gst_matroska_demux_parse_info), + (gst_matroska_demux_parse_metadata_id_simple_tag), + (gst_matroska_demux_parse_metadata), + (gst_matroska_demux_add_wvpk_header), (gst_matroska_decode_buffer), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_parse_cluster), + (gst_matroska_demux_parse_contents_seekentry), + (gst_matroska_demux_loop_stream_parse_id), + (gst_matroska_demux_loop), (gst_matroska_demux_video_caps), + (gst_matroska_demux_audio_caps), + (gst_matroska_demux_subtitle_caps): + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-ids.c: + (gst_matroska_track_init_subtitle_context): + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init), + (gst_matroska_mux_class_init), (gst_matroska_mux_init), + (gst_matroska_mux_create_uid), (gst_matroska_mux_reset), + (gst_matroska_mux_video_pad_setcaps), + (gst_matroska_mux_audio_pad_setcaps), + (gst_matroska_mux_subtitle_pad_setcaps), + (gst_matroska_mux_request_new_pad), + (gst_matroska_mux_track_header), (gst_matroska_mux_start), + (gst_matroska_mux_write_simple_tag), (gst_matroska_mux_finish), + (gst_matroska_mux_write_data), (gst_matroska_mux_collected), + (gst_matroska_mux_set_property): + Add many FIXMEs/TODOs all over the matroska muxer and demuxer + elements, do some checks for valid values in the demuxer, handle + tracktimecodescale in the demuxer, set correct default values for all + settings in the demuxer, review and add all missing matroska + IDs and some more raw YUV formats, and some trivial cleanup. + +2008-06-10 08:59:17 +0000 Sebastian Dröge + + ext/pulse/: Some smaller cleanup. Use G_PARAM_STATIC_STRINGS, gst_element_class_set_details_simple() and fix coding s... + Original commit message from CVS: + * ext/pulse/pulsemixer.c: (gst_pulsemixer_base_init), + (gst_pulsemixer_class_init): + * ext/pulse/pulsesink.c: (gst_pulsesink_base_init), + (gst_pulsesink_class_init), (gst_pulsesink_prepare): + * ext/pulse/pulsesrc.c: (gst_pulsesrc_interface_supported), + (gst_pulsesrc_base_init), (gst_pulsesrc_class_init), + (gst_pulsesrc_prepare): + Some smaller cleanup. Use G_PARAM_STATIC_STRINGS, + gst_element_class_set_details_simple() and fix coding style a bit + more. + +2008-06-10 08:22:17 +0000 Sebastian Dröge + + Add documentation to the pulseaudio plugin and run make update in docs/plugins. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-pulseaudio.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * ext/pulse/plugin.c: + * ext/pulse/pulsemixer.c: + * ext/pulse/pulsesink.c: + * ext/pulse/pulsesrc.c: + Add documentation to the pulseaudio plugin and run make update + in docs/plugins. + +2008-06-10 06:52:44 +0000 Brian Cameron + + sys/sunaudio/gstsunaudiomixerctrl.c: Improvements for the SunAudio mixer by handling mute as no gain for tracks that ... + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_get_volume), + (gst_sunaudiomixer_ctrl_set_volume): + Improvements for the SunAudio mixer by handling mute as no gain + for tracks that have a gain property but no mute property. + Fixes bug #536067. + +2008-06-10 06:45:33 +0000 Sebastian Dröge + + Add pulseaudio GStreamer element from gst-pulse. Development will continue here instead of pulseaudio SVN. Fixes bug ... + Original commit message from CVS: + * configure.ac: + * ext/pulse/Makefile.am: + * ext/pulse/plugin.c: (plugin_init): + * ext/pulse/pulsemixer.c: (gst_pulsemixer_interface_supported), + (gst_pulsemixer_implements_interface_init), + (gst_pulsemixer_init_interfaces), (gst_pulsemixer_base_init), + (gst_pulsemixer_class_init), (gst_pulsemixer_init), + (gst_pulsemixer_finalize), (gst_pulsemixer_set_property), + (gst_pulsemixer_get_property), (gst_pulsemixer_change_state): + * ext/pulse/pulsemixer.h: + * ext/pulse/pulsemixerctrl.c: + (gst_pulsemixer_ctrl_context_state_cb), + (gst_pulsemixer_ctrl_sink_info_cb), + (gst_pulsemixer_ctrl_source_info_cb), + (gst_pulsemixer_ctrl_subscribe_cb), + (gst_pulsemixer_ctrl_success_cb), (gst_pulsemixer_ctrl_open), + (gst_pulsemixer_ctrl_close), (gst_pulsemixer_ctrl_new), + (gst_pulsemixer_ctrl_free), (gst_pulsemixer_ctrl_list_tracks), + (gst_pulsemixer_ctrl_timeout_event), (restart_time_event), + (gst_pulsemixer_ctrl_set_volume), (gst_pulsemixer_ctrl_get_volume), + (gst_pulsemixer_ctrl_set_record), (gst_pulsemixer_ctrl_set_mute): + * ext/pulse/pulsemixerctrl.h: + * ext/pulse/pulsemixertrack.c: (gst_pulsemixer_track_class_init), + (gst_pulsemixer_track_init), (gst_pulsemixer_track_new): + * ext/pulse/pulsemixertrack.h: + * ext/pulse/pulseprobe.c: (gst_pulseprobe_context_state_cb), + (gst_pulseprobe_sink_info_cb), (gst_pulseprobe_source_info_cb), + (gst_pulseprobe_invalidate), (gst_pulseprobe_open), + (gst_pulseprobe_enumerate), (gst_pulseprobe_close), + (gst_pulseprobe_new), (gst_pulseprobe_free), + (gst_pulseprobe_get_properties), (gst_pulseprobe_needs_probe), + (gst_pulseprobe_probe_property), (gst_pulseprobe_get_values), + (gst_pulseprobe_set_server): + * ext/pulse/pulseprobe.h: + * ext/pulse/pulsesink.c: (gst_pulsesink_base_init), + (gst_pulsesink_class_init), (gst_pulsesink_init), + (gst_pulsesink_destroy_stream), (gst_pulsesink_destroy_context), + (gst_pulsesink_finalize), (gst_pulsesink_dispose), + (gst_pulsesink_set_property), (gst_pulsesink_get_property), + (gst_pulsesink_context_state_cb), (gst_pulsesink_stream_state_cb), + (gst_pulsesink_stream_request_cb), + (gst_pulsesink_stream_latency_update_cb), (gst_pulsesink_open), + (gst_pulsesink_close), (gst_pulsesink_prepare), + (gst_pulsesink_unprepare), (gst_pulsesink_write), + (gst_pulsesink_delay), (gst_pulsesink_success_cb), + (gst_pulsesink_reset), (gst_pulsesink_change_title), + (gst_pulsesink_event), (gst_pulsesink_get_type): + * ext/pulse/pulsesink.h: + * ext/pulse/pulsesrc.c: (gst_pulsesrc_interface_supported), + (gst_pulsesrc_implements_interface_init), + (gst_pulsesrc_init_interfaces), (gst_pulsesrc_base_init), + (gst_pulsesrc_class_init), (gst_pulsesrc_init), + (gst_pulsesrc_destroy_stream), (gst_pulsesrc_destroy_context), + (gst_pulsesrc_finalize), (gst_pulsesrc_dispose), + (gst_pulsesrc_set_property), (gst_pulsesrc_get_property), + (gst_pulsesrc_context_state_cb), (gst_pulsesrc_stream_state_cb), + (gst_pulsesrc_stream_request_cb), (gst_pulsesrc_open), + (gst_pulsesrc_close), (gst_pulsesrc_prepare), + (gst_pulsesrc_unprepare), (gst_pulsesrc_read), + (gst_pulsesrc_delay), (gst_pulsesrc_change_state), + (gst_pulsesrc_get_type): + * ext/pulse/pulsesrc.h: + * ext/pulse/pulseutil.c: (gst_pulse_fill_sample_spec), + (gst_pulse_client_name), (gst_pulse_gst_to_channel_map): + * ext/pulse/pulseutil.h: + Add pulseaudio GStreamer element from gst-pulse. Development will + continue here instead of pulseaudio SVN. Fixes bug #400679. + Only changes over gst-pulse SVN are added copyright to the top of + files and coding style changes. + +2008-06-09 20:02:05 +0000 Benjamin Kampmann + + ext/cdio/: Also extract album title and album genre from CD-TEXT if available (#537021). + Original commit message from CVS: + Patch by: Benjamin Kampmann + * ext/cdio/gstcdio.c: (gst_cdio_get_cdtext), + (gst_cdio_add_cdtext_album_tags): + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): + Also extract album title and album genre from CD-TEXT if + available (#537021). + +2008-06-09 08:52:04 +0000 Sjoerd Simons + + sys/v4l2/gstv4l2src.c: Improve negotiation a bit more by picking the smallest possible resolution that is larger than... + Original commit message from CVS: + Patch by: Sjoerd Simons + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_negotiate): + Improve negotiation a bit more by picking the smallest possible + resolution that is larger than the resolution specified in the + first caps entry of the peer caps. Fixes bug #536994. + +2008-06-09 08:42:49 +0000 Bastien Nocera + + sys/v4l2/: Fix compilation with newer GIT kernels that deprecated + Original commit message from CVS: + Patch by: Bastien Nocera + * sys/v4l2/gstv4l2vidorient.c: + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + Fix compilation with newer GIT kernels that deprecated + V4L2_CID_HCENTER and V4L2_CID_VCENTER. Fixes bug #536317. + +2008-06-07 18:48:54 +0000 Tim-Philipp Müller + + Require libcdio >= 0.76. + Original commit message from CVS: + * configure.ac: + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): + Require libcdio >= 0.76. + +2008-06-05 11:07:17 +0000 Sebastian Dröge + + gst/interleave/: Properly implement duration and position queries in bytes format. We have to take the upstream reply... + Original commit message from CVS: + * gst/interleave/deinterleave.c: (gst_deinterleave_add_new_pads), + (gst_deinterleave_src_query): + * gst/interleave/interleave.c: (gst_interleave_src_query_duration), + (gst_interleave_src_query): + Properly implement duration and position queries in bytes format. We + have to take the upstream reply and divide/multiply it by the number + of channels to get the correct result. + +2008-06-05 09:45:00 +0000 Thijs Vermeir + + gst/avi/gstavidemux.c: Catch UNEXPECTED when downstream has reached end of segment in reverse mode. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Catch UNEXPECTED when downstream has reached end of + segment in reverse mode. + +2008-06-04 18:08:35 +0000 Thijs Vermeir + + gst/avi/gstavidemux.c: Fix typo in comment + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Fix typo in comment + +2008-06-04 18:03:24 +0000 Thijs Vermeir + + gst/avi/gstavidemux.c: Because we don't know the frame order we need to push till the next keyframe + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Because we don't know the frame order we need to push till + the next keyframe + +2008-06-04 17:39:31 +0000 Sjoerd Simons + + sys/v4l2/gstv4l2src.c: Provide a custom negotiation function to make sure to pick the highest possible framerate and ... + Original commit message from CVS: + Patch by: Sjoerd Simons + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), + (gst_v4l2src_fixate), (gst_v4l2src_negotiate): + Provide a custom negotiation function to make sure to pick the highest + possible framerate and resolution. Fixes bug #536646. + +2008-06-04 16:49:26 +0000 Thijs Vermeir + + gst/avi/gstavidemux.c: Set EOS when going out of the segment in reverse playback + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Set EOS when going out of the segment in reverse playback + +2008-06-04 15:19:46 +0000 Tim-Philipp Müller + + ext/taglib/Makefile.am: Add -Wno-attributes to CXXFLAGS to suppress warning caused by taglib headers (with gcc 4.3.1). + Original commit message from CVS: + * ext/taglib/Makefile.am:: + Add -Wno-attributes to CXXFLAGS to suppress warning caused by + taglib headers (with gcc 4.3.1). + +2008-06-04 11:59:18 +0000 Peter Kjellerstedt + + gst/rtsp/gstrtspsrc.c: Use the new gst_rtsp_connection_get_ip() to access the IP address of a GstRTSPConnection since... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_udp_sink): + Use the new gst_rtsp_connection_get_ip() to access the IP address + of a GstRTSPConnection since it is a private member. + +2008-06-04 10:42:46 +0000 Tim-Philipp Müller + + Use new utility functions in libgsttag to process coverart (#512333). + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_extract_picture_buffer): + * gst/id3demux/id3v2frames.c: (parse_picture_frame): + Use new utility functions in libgsttag to process coverart (#512333). + +2008-06-04 08:54:09 +0000 Sebastian Dröge + + ext/flac/gstflacdec.c: We actually support left/side, right/side and mid/side files. The conversion to normal, interl... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_write): + We actually support left/side, right/side and mid/side files. The + conversion to normal, interleaved stereo is done by libflac. + +2008-06-04 07:36:07 +0000 Sebastian Dröge + + gst/matroska/ebml-write.c: Unref the write cache in finalize if it was set and add add "FIXME" to a comment that need... + Original commit message from CVS: + * gst/matroska/ebml-write.c: (gst_ebml_write_finalize), + (gst_ebml_write_set_cache): + Unref the write cache in finalize if it was set and add add "FIXME" + to a comment that needs it. + +2008-06-04 06:48:46 +0000 Sebastian Dröge + + gst/interleave/interleave.*: Use an always increasing integer for the number in the name of the requested sink pads t... + Original commit message from CVS: + * gst/interleave/interleave.c: (gst_interleave_pad_get_type), + (gst_interleave_pad_get_property), (gst_interleave_pad_class_init), + (gst_interleave_request_new_pad), (gst_interleave_release_pad): + * gst/interleave/interleave.h: + Use an always increasing integer for the number in the name of the + requested sink pads to guarantuee a unique name. Add a "channel" + property to GstInterleavePad to make it possible for applications + to retrieve the channel number in the output for every pad. + Use g_type_register_static_simple() instead of + g_type_register_static() to save some relocations. + +2008-06-03 14:35:59 +0000 Sebastian Dröge + + gst/interleave/interleave.c: Stop GstCollectPads before calling the parent's state change function when going from PA... + Original commit message from CVS: + * gst/interleave/interleave.c: (gst_interleave_pad_get_type), + (gst_interleave_change_state): + Stop GstCollectPads before calling the parent's state change function + when going from PAUSED to READY as we otherwise deadlock. + Fixes bug #536258. + +2008-06-03 09:03:19 +0000 Sebastian Dröge + + gst/interleave/interleave.c: Use new gst_audio_check_channel_positions() function and register the GstInterleavePad t... + Original commit message from CVS: + * gst/interleave/interleave.c: + (gst_interleave_check_channel_positions), + (gst_interleave_set_channel_positions), + (gst_interleave_class_init): + Use new gst_audio_check_channel_positions() function and register + the GstInterleavePad type from a threadsafe context. + +2008-06-02 16:10:00 +0000 Thijs Vermeir + + gst/avi/gstavidemux.*: Implement reverse playback. Fixes #535300. + Original commit message from CVS: + Patch by: Thijs Vermeir + * gst/avi/gstavidemux.c: (gst_avi_demux_index_next), + (gst_avi_demux_index_prev), (gst_avi_demux_index_entry_for_time), + (gst_avi_demux_do_seek), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry): + * gst/avi/gstavidemux.h: + Implement reverse playback. Fixes #535300. + Small cleanups. + +2008-06-02 12:42:14 +0000 Sebastian Dröge + + gst/interleave/interleave.*: Allow setting channel positions via a property and allow using the channel positions on ... + Original commit message from CVS: + * gst/interleave/interleave.c: (gst_interleave_pad_get_type), + (gst_interleave_finalize), (gst_audio_check_channel_positions), + (gst_interleave_set_channel_positions), + (gst_interleave_class_init), (gst_interleave_init), + (gst_interleave_set_property), (gst_interleave_get_property), + (gst_interleave_request_new_pad), (gst_interleave_release_pad), + (gst_interleave_sink_setcaps), (gst_interleave_src_query_duration), + (gst_interleave_src_query_latency), (gst_interleave_collected): + * gst/interleave/interleave.h: + Allow setting channel positions via a property and allow using the + channel positions on the input as the channel positions of the output. + Fix some broken logic and memory leaks. + * tests/check/Makefile.am: + * tests/check/elements/interleave.c: (src_handoff_float32), + (sink_handoff_float32), (GST_START_TEST), (interleave_suite): + Add unit tests for checking correct handling of channel positions. + +2008-06-02 12:22:56 +0000 Sebastian Dröge + + gst/videomixer/videomixer.c: When using gst_element_iterate_pads() one has to unref every pad after usage. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_query_duration), + (gst_videomixer_query_latency): + When using gst_element_iterate_pads() one has to unref every pad + after usage. + +2008-05-31 16:53:23 +0000 Bastien Nocera + + gst/qtdemux/: Improve meta-data handling, add 'comment', 'description' and 'copyright' tag handling. + Original commit message from CVS: + Patch by: Bastien Nocera + * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_str), + (qtdemux_parse_udta): + * gst/qtdemux/qtdemux_fourcc.h: + Improve meta-data handling, add 'comment', 'description' and + 'copyright' tag handling. + Fixes #535935 + +2008-05-31 15:30:41 +0000 Julien Moutte + + gst/qtdemux/qtdemux.c: Make sure we we don't clip the segment's stop using the main segment duration as that could cr... + Original commit message from CVS: + 2008-05-31 Julien Moutte + * gst/qtdemux/qtdemux.c: (gst_qtdemux_find_keyframe), + (gst_qtdemux_find_segment), (gst_qtdemux_perform_seek), + (gst_qtdemux_seek_to_previous_keyframe), + (gst_qtdemux_activate_segment), (gst_qtdemux_loop): Make sure we + we don't clip the segment's stop using the main segment duration + as + that could crop quite some video frames. Make reverse playback + support + more robust and support edit lists. Support seeking to the last + frame, + and fix reverse looping playback. Add some debugging. + * win32/common/config.h: Updated. + +2008-05-31 08:37:00 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.c: Don't clip float/double samples, correctly unset passthrough mode and use better rou... + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_transform_ip): + Don't clip float/double samples, correctly unset passthrough mode + and use better rounding for integer samples. + +2008-05-30 11:03:57 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.*: Update the filter coefficients only when needed in the transform_ip function and cor... + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_init), + (setup_filter), (set_passthrough), (update_coefficients), + (gst_iir_equalizer_compute_frequencies), + (gst_iir_equalizer_transform_ip): + * gst/equalizer/gstiirequalizer.h: + Update the filter coefficients only when needed in the transform_ip + function and correctly set the element into passthrough mode if the + gain of all bands is 0. + +2008-05-29 11:30:16 +0000 Sebastian Keller + + gst/alpha/gstalpha.c: Try to skip pixels or areas that are too dark or too bright for us to do meaningfull color dete... + Original commit message from CVS: + Based on patch by: Sebastian Keller + * gst/alpha/gstalpha.c: (gst_alpha_class_init), (gst_alpha_init), + (gst_alpha_set_property), (gst_alpha_get_property), + (gst_alpha_chroma_key_ayuv), (gst_alpha_chromakey_row_i420): + Try to skip pixels or areas that are too dark or too bright for us to do + meaningfull color detection. + Added properties to control the sensitivity to light and darkness. + Added some small cleanups. Fixes #512345. + +2008-05-28 20:01:32 +0000 Jan Schmidt + + Ignore some more generated things + Original commit message from CVS: + * docs/plugins/.cvsignore: + * tests/check/elements/.cvsignore: + Ignore some more generated things + * tests/check/Makefile.am: + Ignore OSS elements in the state changes test too. + +2008-05-28 16:22:36 +0000 Wim Taymans + + docs/plugins/: Add SMPTE effect elements to docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + Add SMPTE effect elements to docs. + +2008-05-28 14:31:05 +0000 Stefan Kost + + Document whats first shown on the fdo plugin docs page :) + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * ext/raw1394/gstdv1394src.c: + Document whats first shown on the fdo plugin docs page :) + +2008-05-28 14:07:21 +0000 Stefan Kost + + Rename audiovoice to audiokaraoke and add it to the docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-audiofx.xml: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofx.c: + * gst/audiofx/audiokaraoke.c: + * gst/audiofx/audiokaraoke.h: + * gst/audiofx/audiovoice.c: + * gst/audiofx/audiovoice.h: + Rename audiovoice to audiokaraoke and add it to the docs. + +2008-05-28 13:28:20 +0000 Stefan Kost + + Document aasink and cacasink. + Original commit message from CVS: + * REQUIREMENTS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * ext/aalib/gstaasink.c: + * ext/libcaca/gstcacasink.c: + Document aasink and cacasink. + +2008-05-28 08:36:44 +0000 Sebastian Dröge + + gst/videomixer/videomixer.*: duration and latency queries. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_reset), + (gst_videomixer_init), (gst_videomixer_query_duration), + (gst_videomixer_query_latency), (gst_videomixer_query), + (gst_videomixer_blend_buffers): + * gst/videomixer/videomixer.h: + Implement position (in time), duration and latency queries. + +2008-05-28 08:14:16 +0000 Sebastian Dröge + + gst/interleave/interleave.c: Implement latency query. + Original commit message from CVS: + * gst/interleave/interleave.c: (gst_interleave_src_query_duration), + (gst_interleave_src_query_latency), (gst_interleave_src_query): + Implement latency query. + +2008-05-27 17:55:30 +0000 Edward Hervey + + gst/videomixer/videomixer.*: Implement proper seek/newsegment handling. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_reset), + (gst_videomixer_init), (gst_videomixer_request_new_pad), + (gst_videomixer_fill_queues), (forward_event_func), + (forward_event), (gst_videomixer_src_event), + (gst_videomixer_sink_event): + * gst/videomixer/videomixer.h: + Implement proper seek/newsegment handling. + Based on adder's implementation. + Fixes #535121 + +2008-05-26 16:25:15 +0000 j^ + + gst/qtdemux/qtdemux.c: Add caps for DVCPRO50 and DVCPRO HD PAL/NTSC. See #526481. + Original commit message from CVS: + Patch by: j^ + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add caps for DVCPRO50 and DVCPRO HD PAL/NTSC. See #526481. + +2008-05-26 15:51:41 +0000 Wim Taymans + + gst/audiofx/: Add simple voice removal element. Yay karaoke. + Original commit message from CVS: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofx.c: (plugin_init): + * gst/audiofx/audiovoice.c: (gst_audio_voice_base_init), + (gst_audio_voice_class_init), (gst_audio_voice_init), + (update_filter), (gst_audio_voice_set_property), + (gst_audio_voice_get_property), (gst_audio_voice_setup), + (gst_audio_voice_transform_int), (gst_audio_voice_transform_float), + (gst_audio_voice_transform_ip): + * gst/audiofx/audiovoice.h: + Add simple voice removal element. Yay karaoke. + +2008-05-26 15:39:26 +0000 William M. Brack + + sys/v4l2/v4l2src_calls.c: Fix potential caps leak. + Original commit message from CVS: + Patch by: William M. Brack + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format): + Fix potential caps leak. + If we can't get the framerate with an ioctl, try to get it with the + current norm. Fixes #520092. + +2008-05-26 15:14:55 +0000 William M. Brack + + sys/v4l2/v4l2src_calls.c: If we fail to get the frame intervals, simply don't touch the framerates on the template ca... + Original commit message from CVS: + Patch by: William M. Brack + * sys/v4l2/v4l2src_calls.c: + (gst_v4l2src_probe_caps_for_format_and_size): + If we fail to get the frame intervals, simply don't touch the framerates + on the template caps instead of discarding the format. See #520092. + +2008-05-26 14:52:51 +0000 William M. Brack + + sys/v4l2/gstv4l2src.c: Add NV12, NV21 and bayer support. See #520092. + Original commit message from CVS: + Patch by: William M. Brack + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_structure), + (gst_v4l2_get_caps_info): + Add NV12, NV21 and bayer support. See #520092. + +2008-05-26 13:51:38 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Unbreak segment activation again. Fixes #531672. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_find_segment), + (gst_qtdemux_activate_segment): + Unbreak segment activation again. Fixes #531672. + +2008-05-26 10:28:47 +0000 Sebastian Dröge + + gst/interleave/deinterleave.c: Add another example launch line. + Original commit message from CVS: + * gst/interleave/deinterleave.c: + Add another example launch line. + * gst/interleave/interleave.c: (interleave_24), + (gst_interleave_finalize), (gst_interleave_base_init), + (gst_interleave_class_init), (gst_interleave_init), + (gst_interleave_request_new_pad), (gst_interleave_release_pad), + (gst_interleave_change_state), (__remove_channels), + (__set_channels), (gst_interleave_sink_getcaps), + (gst_interleave_set_process_function), + (gst_interleave_sink_setcaps), (gst_interleave_sink_event), + (gst_interleave_src_query_duration), (gst_interleave_src_query), + (forward_event_func), (forward_event), (gst_interleave_src_event), + (gst_interleave_collected): + * gst/interleave/interleave.h: + Major rewrite of interleave using GstCollectpads. This new version + also supports almost all raw audio formats and has better caps + negotiation. Fixes bug #506594. + Also update docs and add some more examples. + * tests/check/elements/interleave.c: (interleave_chain_func), + (GST_START_TEST), (src_handoff_float32), (sink_handoff_float32), + (interleave_suite): + Add some more extensive unit tests for interleave. + +2008-05-26 09:57:40 +0000 Wim Taymans + + Don't use _gst_pad(). + Original commit message from CVS: + * examples/switch/switcher.c: (switch_timer): + * gst/replaygain/gstrgvolume.c: (gst_rg_volume_init): + * gst/rtpmanager/gstrtpclient.c: (create_stream): + * gst/sdp/gstsdpdemux.c: (gst_sdp_demux_stream_configure_udp), + (gst_sdp_demux_stream_configure_udp_sink): + * tests/check/elements/deinterleave.c: (GST_START_TEST), + (pad_added_setup_data_check_float32_8ch_cb): + * tests/check/elements/rganalysis.c: (send_eos_event), + (send_tag_event): + Don't use _gst_pad(). + +2008-05-25 16:09:39 +0000 Sebastian Dröge + + ext/flac/: Set the channel layout when decoding FLAC files with more than 2 channels as defined by the FLAC spec. Fix... + Original commit message from CVS: + * ext/flac/Makefile.am: + * ext/flac/gstflacdec.c: (gst_flac_dec_write): + Set the channel layout when decoding FLAC files with more than 2 + channels as defined by the FLAC spec. Fixes bug #534570. + Also don't try to decode left/side, right/side and mid/side files + as we don't support this at all. + +2008-05-24 12:55:39 +0000 Tim-Philipp Müller + + configure.ac: We need -base CVS (rtsp). + Original commit message from CVS: + * configure.ac: + We need -base CVS (rtsp). + +2008-05-22 19:47:53 +0000 Sebastian Dröge + + docs/plugins/: Add interleave/deinterleave to the docs and while at that run make update in docs/plugins. + Original commit message from CVS: + * 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-alsaspdif.xml: + * docs/plugins/inspect/plugin-amrwb.xml: + * docs/plugins/inspect/plugin-app.xml: + * docs/plugins/inspect/plugin-bayer.xml: + * docs/plugins/inspect/plugin-bz2.xml: + * docs/plugins/inspect/plugin-cdaudio.xml: + * docs/plugins/inspect/plugin-cdxaparse.xml: + * docs/plugins/inspect/plugin-dfbvideosink.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-filter.xml: + * docs/plugins/inspect/plugin-flvdemux.xml: + * docs/plugins/inspect/plugin-freeze.xml: + * docs/plugins/inspect/plugin-gsm.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-h264parse.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-ladspa.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-mpegtsparse.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-nas.xml: + * docs/plugins/inspect/plugin-neon.xml: + * docs/plugins/inspect/plugin-nsfdec.xml: + * docs/plugins/inspect/plugin-nuvdemux.xml: + * docs/plugins/inspect/plugin-rawparse.xml: + * docs/plugins/inspect/plugin-real.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-rfbsrc.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-speexresample.xml: + * docs/plugins/inspect/plugin-stereo.xml: + * docs/plugins/inspect/plugin-tta.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-xvid.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + Add interleave/deinterleave to the docs and while at that + run make update in docs/plugins. + * gst/interleave/deinterleave.c: + Add a parapraph about using a queue and audioconvert after the source + pads to the docs. + +2008-05-22 18:55:09 +0000 Sebastian Dröge + + gst/interleave/deinterleave.*: Don't set a getcaps() function on the src pads as it's not required and the default ge... + Original commit message from CVS: + * gst/interleave/deinterleave.c: (gst_deinterleave_base_init), + (gst_deinterleave_class_init), (gst_deinterleave_init), + (gst_deinterleave_add_new_pads), (gst_deinterleave_sink_getcaps): + * gst/interleave/deinterleave.h: + Don't set a getcaps() function on the src pads as it's not required + and the default getcaps() function returns the correct results for + our src pads. + Complete documentation and add myself to the authors of the element. + +2008-05-22 14:49:08 +0000 Tim-Philipp Müller + + gst/udp/Makefile.am: Add -D_GNU_SOURCE to CFLAGS so we get things like EAI_ADDRFAMILY when including netdb.h when bui... + Original commit message from CVS: + * gst/udp/Makefile.am: + Add -D_GNU_SOURCE to CFLAGS so we get things like EAI_ADDRFAMILY + when including netdb.h when building against glibc >= 2.8. + +2008-05-22 11:19:03 +0000 Julien Moutte + + gst/smpte/gstsmptealpha.c: Fix debug statement arguments. + Original commit message from CVS: + 2008-05-22 Julien Moutte + * gst/smpte/gstsmptealpha.c: (gst_smpte_alpha_setcaps): Fix + debug statement arguments. + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_setup_qos_dscp): + * gst/udp/gstudpnetutils.c: (gst_udp_join_group), + (gst_udp_leave_group): Fix IP and IPV6 options to make it work + on more platforms. + +2008-05-21 17:51:09 +0000 Wim Taymans + + tests/check/elements/: Don't use gst_element_get_pad(), it's a bad, bad method. + Original commit message from CVS: + * tests/check/elements/avimux.c: (setup_src_pad), + (teardown_src_pad): + * tests/check/elements/icydemux.c: (icydemux_found_pad), + (GST_START_TEST): + * tests/check/elements/matroskamux.c: (setup_src_pad), + (teardown_src_pad), (setup_sink_pad), (teardown_sink_pad): + * tests/check/elements/videocrop.c: (video_crop_get_test_caps), + (GST_START_TEST): + * tests/check/elements/wavpackparse.c: (wavpackparse_found_pad), + (setup_wavpackparse), (cleanup_wavpackparse): + Don't use gst_element_get_pad(), it's a bad, bad method. + +2008-05-21 17:39:38 +0000 Wim Taymans + + Don't use gst_element_get_pad(), it's a bad method. + Original commit message from CVS: + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_reset), + (do_toggle_element): + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), + (do_toggle_element): + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_reset), + (do_toggle_element): + * ext/gconf/gstswitchsink.c: (gst_switch_commit_new_kid): + * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_reset), + (do_toggle_element): + * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_reset), + (do_toggle_element): + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_reset), + (gst_auto_audio_sink_detect): + * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), + (gst_auto_video_sink_detect): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_stream_free), (gst_rtspsrc_stream_configure_udp), + (gst_rtspsrc_stream_configure_udp_sink), (gst_rtspsrc_skip_lws), + (gst_rtspsrc_unskip_lws), (gst_rtspsrc_skip_commas), + (gst_rtspsrc_skip_item), (gst_rtsp_decode_quoted_string), + (gst_rtspsrc_parse_digest_challenge), (gst_rtspsrc_parse_auth_hdr): + * tests/icles/videocrop-test.c: (test_with_caps), + (video_crop_get_test_caps): + Don't use gst_element_get_pad(), it's a bad method. + +2008-05-21 17:35:50 +0000 Wim Taymans + + gst/udp/: Joining a multicast group and setting the loop/ttl properties are totally unrelated tasks are must be separ... + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send), + (gst_multiudpsink_add_internal): + * gst/udp/gstudpnetutils.c: (gst_udp_set_loop_ttl), + (gst_udp_join_group): + * gst/udp/gstudpnetutils.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + Joining a multicast group and setting the loop/ttl properties are + totally unrelated tasks are must be separated. + +2008-05-21 14:09:41 +0000 Stefan Kost + + gst/avi/gstavimux.c: Also support alaw/mulaw. + Original commit message from CVS: + * gst/avi/gstavimux.c: + Also support alaw/mulaw. + +2008-05-21 13:47:43 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.*: Add a fixme for the auto-multicast property. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_setup_qos_dscp), (gst_multiudpsink_add_internal): + * gst/udp/gstmultiudpsink.h: + Add a fixme for the auto-multicast property. + Fix some confusing debug messages. + Disable setting a qos value by default. + +2008-05-21 11:38:17 +0000 Gustaf Räntilä + + gst/udp/gstmultiudpsink.c: Ignore EPERM errors from sendto. Fixes #533619. + Original commit message from CVS: + Patch by: Gustaf Räntilä + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render): + Ignore EPERM errors from sendto. Fixes #533619. + +2008-05-21 10:51:52 +0000 Henrik Eriksson + + gst/udp/gstmultiudpsink.*: Add qos-dscp property to manage the Quality of service. + Original commit message from CVS: + Patch by: Henrik Eriksson + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_setup_qos_dscp), + (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), + (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal): + * gst/udp/gstmultiudpsink.h: + Add qos-dscp property to manage the Quality of service. + +2008-05-21 10:09:23 +0000 Wim Taymans + + gst/rtp/gstrtptheoradepay.c: Improve debugging of the ident. + Original commit message from CVS: + * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_process): + Improve debugging of the ident. + +2008-05-21 09:56:02 +0000 Bruno Santos + + gst/udp/gstudpnetutils.*: Provide a bunch of helper methods to deal with IPv4 and IPv6 transparently. + Original commit message from CVS: + Patch by: Bruno Santos + * gst/udp/gstudpnetutils.c: (gst_udp_get_addr), + (gst_udp_join_group), (gst_udp_leave_group), + (gst_udp_is_multicast): + * gst/udp/gstudpnetutils.h: + Provide a bunch of helper methods to deal with IPv4 and IPv6 + transparently. + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_set_property), + (gst_multiudpsink_get_property), (join_multicast), + (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal), + (gst_multiudpsink_remove): + * gst/udp/gstmultiudpsink.h: + Add multicast TTL and loopback properties. + Use the helper methods to implement ip4 and ip6. + * gst/udp/gstudpsrc.c: (gst_udpsrc_create), (gst_udpsrc_start): + * gst/udp/gstudpsrc.h: + Use the helper methods to implement ip4 and ip6. + Fixes #515962. + +2008-05-21 09:38:48 +0000 Patrick Radizi + + gst/multipart/multipartdemux.*: Don't blindly copy the mime-type as the caps name because they not always map directl... + Original commit message from CVS: + Patch by: Patrick Radizi + * gst/multipart/multipartdemux.c: (gst_multipart_demux_class_init), + (gst_multipart_demux_get_gstname), + (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain): + * gst/multipart/multipartdemux.h: + Don't blindly copy the mime-type as the caps name because they not + always map directly. Instead use a hashtable with common mappings. + Fixes #533287. + +2008-05-20 17:27:35 +0000 Michael Meeks + + ext/esd/esdsink.c: When we post an error, we must return -1 to let the parent know that we cannot write the segment e... + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_write): + When we post an error, we must return -1 to let the parent know that we + cannot write the segment else it will loop and continue to call us again + forever. Patch by Michael Meeks. + +2008-05-20 14:24:21 +0000 Stefan Kost + + gst/videomixer/videomixer.c: Add missing incudes. + Original commit message from CVS: + * gst/videomixer/videomixer.c: + Add missing incudes. + +2008-05-20 13:57:44 +0000 Peter Kjellerstedt + + gst/rtp/gstrtph264pay.*: Correct a typo (sinle -> single). + Original commit message from CVS: + * gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type), + (gst_rtp_h264_pay_handle_buffer): + * gst/rtp/gstrtph264pay.h: + Correct a typo (sinle -> single). + +2008-05-20 11:33:05 +0000 Wim Taymans + + gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist... + Original commit message from CVS: + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), + (gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property), + (gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps), + (gst_rtp_h264_depay_process): + * gst/rtp/gstrtph264depay.h: + Add experimental support for outputting quicktime-like AVC output in + addition to the existing bytestream output. + * gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type), + (gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init), + (gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal), + (gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property), + (gst_rtp_h264_pay_get_property): + * gst/rtp/gstrtph264pay.h: + Make the parsing mode configurable, for some inputs we don't need to + scan every byte for start codes. + Only set the marker bit on ACCESS units. + +2008-05-20 10:47:10 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.c: Use a bigger type in integer mode for the intermediate results to prevent overflows.... + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + Use a bigger type in integer mode for the intermediate results to + prevent overflows. This fixes the crippled sound when using the + equalizer in integer mode. Fixes bug #510865. + +2008-05-20 10:42:33 +0000 Jan Schmidt + + gst/videomixer/videomixer.*: Instead of a random number for the request pad id's, use a counter. + Original commit message from CVS: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + Instead of a random number for the request pad id's, + use a counter. + Register the videomixerpad class from the element's class_init + where it's safer, and allows the docs generator to scan it. + +2008-05-20 09:29:28 +0000 Wim Taymans + + gst/smpte/: Add new plugin that adds the SMPTE transition in the alpha channel of + Original commit message from CVS: + * gst/smpte/Makefile.am: + * gst/smpte/gstsmpte.c: (gst_smpte_plugin_init): + * gst/smpte/gstsmpte.h: + * gst/smpte/gstsmptealpha.c: + (gst_smpte_alpha_transition_type_get_type), + (gst_smpte_alpha_get_type), (gst_smpte_alpha_base_init), + (gst_smpte_alpha_class_init), (gst_smpte_alpha_update_mask), + (gst_smpte_alpha_setcaps), (gst_smpte_alpha_get_unit_size), + (gst_smpte_alpha_init), (gst_smpte_alpha_finalize), + (gst_smpte_alpha_do_ayuv), (gst_smpte_alpha_do_i420), + (gst_smpte_alpha_transform), (gst_smpte_alpha_set_property), + (gst_smpte_alpha_get_property), (gst_smpte_alpha_plugin_init): + * gst/smpte/gstsmptealpha.h: + * gst/smpte/plugin.c: (plugin_init): + Add new plugin that adds the SMPTE transition in the alpha channel of + I420 and AYUV frames so that they can be blended with videomixer later + on. Uses all niceties such as using base transform for efficient alloc + and negotiation. It currently requires GstController to control the + position in the transition effect. + +2008-05-19 21:05:03 +0000 Stefan Kost + + Try using thaytans new mechanism to get extra classes into plugin docs. Aparently works for the Eq. For VideoMixer th... + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.types: + * gst/videomixer/videomixer.c: + Try using thaytans new mechanism to get extra classes into plugin + docs. Aparently works for the Eq. For VideoMixer the GObject stuff is + missing still. + +2008-05-19 12:32:06 +0000 Sebastian Dröge + + tests/check/elements/deinterleave.c: Set keep-positions property to TRUE for the 8 channel test to ensure that the or... + Original commit message from CVS: + * tests/check/elements/deinterleave.c: (GST_START_TEST): + Set keep-positions property to TRUE for the 8 channel test to ensure + that the original channel position is set on the output. + +2008-05-19 07:46:05 +0000 Sebastian Dröge + + gst/interleave/deinterleave.*: Add a property to select whether channel positions should be kept on the mono output b... + Original commit message from CVS: + * gst/interleave/deinterleave.c: (gst_deinterleave_class_init), + (gst_deinterleave_init), (gst_deinterleave_add_new_pads), + (gst_deinterleave_set_pads_caps), (gst_deinterleave_set_property), + (gst_deinterleave_get_property): + * gst/interleave/deinterleave.h: + Add a property to select whether channel positions should be kept on + the mono output buffers or should be dropped. + +2008-05-18 19:27:59 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Set proper rate in avi stream header for PCM audio, and also do some more sanity checks on caps ... + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_audsink_set_caps): + Set proper rate in avi stream header for PCM audio, and also do some + more sanity checks on caps in this case. Fixes #511489. + +2008-05-17 19:39:53 +0000 Sebastian Dröge + + gst/interleave/deinterleave.*: Queue events until src pads were added and they can be sent. Otherwise downstream will... + Original commit message from CVS: + * gst/interleave/deinterleave.c: (gst_deinterleave_finalize), + (gst_deinterleave_init), (gst_deinterleave_sink_event), + (gst_deinterleave_process), (gst_deinterleave_sink_activate_push): + * gst/interleave/deinterleave.h: + Queue events until src pads were added and they can be sent. Otherwise + downstream will never get the first newsegment event. + +2008-05-17 14:05:03 +0000 Sebastian Dröge + + gst/interleave/deinterleave.c: Always set the channel positions when gst_audio_get_channel_positions() returns someth... + Original commit message from CVS: + * gst/interleave/deinterleave.c: (gst_deinterleave_sink_setcaps), + (gst_deinterleave_getcaps): + Always set the channel positions when gst_audio_get_channel_positions() + returns something, even if they're not set in the caps. This makes + sure that the output channels can be interleaved again correctly + in the mono/stereo cases too. + Don't ask for the peercaps of the current pad in getcaps() as this + might call getcaps() again and deadlock. + +2008-05-17 10:38:18 +0000 Sebastian Dröge + + sys/v4l2/gstv4l2src.c: Don't include the gstv4l2xoverlay.h header as the XOverlay support isn't implemented at all ye... + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: + Don't include the gstv4l2xoverlay.h header as the XOverlay support + isn't implemented at all yet and this requires X headers to be + installed. Fixes bug #533264. + +2008-05-16 21:56:24 +0000 Sebastian Dröge + + gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing. + Original commit message from CVS: + * gst/interleave/Makefile.am: + * gst/interleave/deinterleave.c: (deinterleave_24), + (gst_deinterleave_finalize), (gst_deinterleave_base_init), + (gst_deinterleave_class_init), (gst_deinterleave_init), + (gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps), + (gst_deinterleave_set_process_function), + (gst_deinterleave_sink_setcaps), (__remove_channels), + (__set_channels), (gst_deinterleave_getcaps), + (gst_deinterleave_process), (gst_deinterleave_chain), + (gst_deinterleave_sink_activate_push): + * gst/interleave/deinterleave.h: + Add support for all raw audio formats and provide better negotiation + if the caps are changing. + Don't allow changes of the channel positions and set the position of + the corresponding channel on the src pad caps. + General cleanup and smaller bugfixes. + * tests/check/elements/deinterleave.c: (float_buffer_check_probe): + Check the channel positions on the output buffer caps. + +2008-05-16 17:50:20 +0000 Jan Schmidt + + Fix some compiler warnings. + Original commit message from CVS: + * ext/wavpack/gstwavpackstreamreader.c: + * tests/examples/spectrum/demo-audiotest.c: + * tests/examples/spectrum/demo-osssrc.c: + Fix some compiler warnings. + +2008-05-14 18:28:46 +0000 Wim Taymans + + gst/rtp/gstrtph264depay.c: Small comment added. + Original commit message from CVS: + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): + Small comment added. + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_class_init), + (gst_rtp_h264_pay_decode_nal), (gst_rtp_h264_pay_parse_sps_pps), + (gst_rtp_h264_pay_payload_nal), (gst_rtp_h264_pay_handle_buffer): + Debug string cleanups (remove trailing \n) + Refactor and clean up the payloader a bit and make sure that we only + put one NAL unit in an RTP packet even if the input buffer contains + multiple NAL units. + Add suport for AVC format input. + +2008-05-14 17:58:50 +0000 Peter Kjellerstedt + + gst/rtp/gstrtph264pay.*: Make it possible to specify profile-level-id and sprop-parameter-sets using properties in ca... + Original commit message from CVS: + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_class_init), + (gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_handle_buffer), + (gst_rtp_h264_pay_set_property), (gst_rtp_h264_pay_get_property): + * gst/rtp/gstrtph264pay.h: + Make it possible to specify profile-level-id and sprop-parameter-sets + using properties in case they are not available in-stream. + +2008-05-14 14:19:47 +0000 Tim-Philipp Müller + + tests/check/Makefile.am: Add deinterleave unit test to VALGRIND_TO_FIX, since it causes weird invalid free errors in ... + Original commit message from CVS: + * tests/check/Makefile.am: + Add deinterleave unit test to VALGRIND_TO_FIX, since it causes + weird invalid free errors in valgrind/libc after _exit for some + reason. + * tests/check/elements/deinterleave.c: (pads_created), + (set_channel_positions), (src_handoff_float32_8ch), + (float_buffer_check_probe), + (pad_added_setup_data_check_float32_8ch_cb), + (make_fake_src_8chans_float32), (GST_START_TEST), + (deinterleave_suite): + Add some more deinterleave unit test bits I had locally. + +2008-05-14 12:52:15 +0000 Stefan Kost + + docs/plugins/: Remove ladspa fro plugin-docs, its in gst-plugins-bad. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-ladspa.xml: + Remove ladspa fro plugin-docs, its in gst-plugins-bad. + +2008-05-14 07:32:44 +0000 Sebastian Dröge + + gst/interleave/: Split definitions into separate header files for better documentation generation. + Original commit message from CVS: + * gst/interleave/Makefile.am: + * gst/interleave/deinterleave.h: + * gst/interleave/interleave.h: + * gst/interleave/plugin.h: + Split definitions into separate header files for better documentation + generation. + * gst/interleave/deinterleave.c: (gst_deinterleave_base_init), + (gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps), + (gst_deinterleave_process): + Don't use alloca, allow caps changes as long as the number of channels + does not change, don't use g_warning, return NOT_NEGOTIATED as early + as possible and some other cleanup. + * gst/interleave/interleave.c: (gst_interleave_base_init), + (gst_interleave_class_init): + Do some random cleanup. + * tests/check/Makefile.am: + * tests/check/elements/deinterleave.c: (GST_START_TEST), + (deinterleave_chain_func), (deinterleave_pad_added), + (deinterleave_suite): + Add unit tests for the deinterleave element. + +2008-05-13 20:25:20 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Send an initial BYTE segment to inform downstream of later seeking, and to forego sync attempts. + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_start_file): + Send an initial BYTE segment to inform downstream of later seeking, + and to forego sync attempts. + +2008-05-13 08:59:41 +0000 Wim Taymans + + gst/rtp/gstrtpg729depay.c: Fix wrong caps string. + Original commit message from CVS: + * gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_setcaps): + Fix wrong caps string. + +2008-05-13 08:35:55 +0000 Olivier Crete + + gst/rtp/: Added G729 pay and depayloaders. Fixes #532409. + Original commit message from CVS: + Based on patch by: Olivier Crete + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_base_init), + (gst_rtp_g729_depay_class_init), (gst_rtp_g729_depay_init), + (gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process), + (gst_rtp_g729_depay_plugin_init): + * gst/rtp/gstrtpg729depay.h: + * gst/rtp/gstrtpg729pay.c: (gst_rtpg729pay_base_init), + (gst_rtpg729pay_class_init), (gst_rtpg729pay_init), + (gst_rtpg729pay_setcaps), (gst_rtp_g729_pay_plugin_init): + * gst/rtp/gstrtpg729pay.h: + Added G729 pay and depayloaders. Fixes #532409. + +2008-05-13 08:21:26 +0000 Wim Taymans + + ext/speex/gstspeexdec.c: Fix the calculation of the duration of the concealment packets. + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_sink_event): + Fix the calculation of the duration of the concealment packets. + +2008-05-12 18:27:24 +0000 Olivier Crete + + gst/rtp/: Add DV pay and depayloaders. Fixes #532423. + Original commit message from CVS: + Based on patch by: Olivier Crete + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_base_init), + (gst_rtp_dv_depay_class_init), (gst_rtp_dv_depay_init), + (parse_encode), (gst_rtp_dv_depay_setcaps), + (calculate_difblock_location), (gst_rtp_dv_depay_process), + (gst_rtp_dv_depay_reset), (gst_rtp_dv_depay_change_state), + (gst_rtp_dv_depay_plugin_init): + * gst/rtp/gstrtpdvdepay.h: + * gst/rtp/gstrtpdvpay.c: (gst_dv_pay_mode_get_type), + (gst_rtp_dv_pay_base_init), (gst_rtp_dv_pay_class_init), + (gst_rtp_dv_pay_init), (gst_dv_pay_set_property), + (gst_dv_pay_get_property), (gst_rtp_dv_pay_setcaps), + (gst_dv_pay_negotiate), (include_dif), + (gst_rtp_dv_pay_handle_buffer), (gst_rtp_dv_pay_plugin_init): + * gst/rtp/gstrtpdvpay.h: + Add DV pay and depayloaders. Fixes #532423. + +2008-05-12 16:35:39 +0000 Mark Nauwelaerts + + gst/matroska/matroska-demux.c: Convert subtitle palette info in VobSub private data from VobSub's (buggy) RGB to YUV. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_push_dvd_clut_change_event): + Convert subtitle palette info in VobSub private data from VobSub's + (buggy) RGB to YUV. + +2008-05-12 15:26:01 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Do not leave fourcc stream header field empty upon reset. + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_pad_reset): + Do not leave fourcc stream header field empty upon reset. + Fixes #519301. + +2008-05-11 14:43:26 +0000 Jan Schmidt + + Add goom2k1 into the docs. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-goom2k1.xml: + * gst/goom/gstgoom.c: + * gst/goom2k1/gstgoom.c: + Add goom2k1 into the docs. + +2008-05-08 16:58:02 +0000 Wouter Cloetens + + gst/rtsp/gstrtspsrc.c: Support Digest authentication. Fixes #532065. + Original commit message from CVS: + Based on patch by: Wouter Cloetens + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_skip_lws), (gst_rtspsrc_unskip_lws), + (gst_rtspsrc_skip_commas), (gst_rtspsrc_skip_item), + (gst_rtsp_decode_quoted_string), + (gst_rtspsrc_parse_digest_challenge), (gst_rtspsrc_parse_auth_hdr), + (gst_rtspsrc_setup_auth): + Support Digest authentication. Fixes #532065. + +2008-05-08 10:20:52 +0000 Stefan Kost + + gst/level/gstlevel.c: Also support 32bit (e.g. whe having it after 'mad'). Add more notes about whats needed for libo... + Original commit message from CVS: + * gst/level/gstlevel.c: + Also support 32bit (e.g. whe having it after 'mad'). Add more notes + about whats needed for liboil acceleration. Simplify docs a bit. + +2008-05-08 08:15:34 +0000 Sjoerd Simons + + gst/matroska/matroska-mux.c: Update the track duration if the old one was invalid. + Original commit message from CVS: + Patch by: Sjoerd Simons + * gst/matroska/matroska-mux.c: (gst_matroska_mux_collected): + Update the track duration if the old one was invalid. + Fixes bug #532117. + +2008-05-07 16:36:04 +0000 Ole André Vadla RavnÃ¥s + + gst/rtp/gstrtph264pay.c (gst_rtp_h264_pay_parse_sps_pps): Use GST_STR_NULL when trying to print sps and pps strings t... + Original commit message from CVS: + * gst/rtp/gstrtph264pay.c (gst_rtp_h264_pay_parse_sps_pps): + Use GST_STR_NULL when trying to print sps and pps strings that could + be NULL, as this might crash on some platforms. + +2008-05-07 15:33:52 +0000 Haakon Sporsheim + + 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 + * 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 + + 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 + * 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 + + * ChangeLog: + * sys/directdraw/gstdirectdrawsink.c: + sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame, + Original commit message from CVS: + patch by: Haakon Sporsheim + * 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 + + 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 + * 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 + + * ChangeLog: + * sys/directdraw/gstdirectdrawsink.c: + 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 + + * sys/directdraw/gstdirectdrawsink.c: + 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 + + * sys/directdraw/gstdirectdrawsink.c: + 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 + + * ChangeLog: + * sys/directdraw/gstdirectdrawsink.c: + 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-05-07 11:22:51 +0000 Ole André Vadla RavnÃ¥s + + gst/rtp/gstrtpilbcpay.c: Added missing stdlib.h include for strtol(), and made include ordering and style consistent ... + Original commit message from CVS: + * gst/rtp/gstrtpilbcpay.c: + Added missing stdlib.h include for strtol(), and made include ordering and + style consistent with the corresponding depayloader. + +2008-05-07 09:52:34 +0000 Ole André Vadla RavnÃ¥s + + gst/rtp/gstrtpilbcpay.c: Added missing stdlib.h include for strtol(), and made include ordering and style consistent ... + Original commit message from CVS: + * gst/rtp/gstrtpilbcpay.c: + Added missing stdlib.h include for strtol(), and made include ordering and + style consistent with the corresponding depayloader. + +2008-05-07 08:03:51 +0000 Tim-Philipp Müller + + configure.ac: Error out if we don't have the required core/base versions. + Original commit message from CVS: + * configure.ac: + Error out if we don't have the required core/base versions. + +2008-05-06 09:33:46 +0000 Thijs Vermeir + + sys/osxvideo/cocoawindow.m: Fix compiler warnings on PPC64. Fixes bug #499318. + Original commit message from CVS: + Patch by: Thijs Vermeir + * sys/osxvideo/cocoawindow.m: + Fix compiler warnings on PPC64. Fixes bug #499318. + +2008-05-05 11:19:13 +0000 Sjoerd Simons + + gst/rtsp/gstrtspsrc.c: Don't leak file descriptors on error. Fixes #531532. + Original commit message from CVS: + Patch by: Sjoerd Simons + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_open): + Don't leak file descriptors on error. Fixes #531532. + +2008-05-03 09:18:22 +0000 Sebastian Dröge + + ext/gconf/: When we can't create a fakesink/fakesrc complain instead of unreffing + Original commit message from CVS: + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_reset), + (gst_gconf_audio_src_change_state): + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), + (gst_gconf_video_sink_change_state): + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_reset), + (gst_gconf_video_src_change_state): + * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset), + (gst_switch_commit_new_kid), (gst_switch_sink_change_state): + When we can't create a fakesink/fakesrc complain instead of unreffing + NULL pointers and crashing later. See bug #530535. + +2008-05-02 12:44:18 +0000 Wim Taymans + + gst/rtp/gstrtph263pdepay.c: Add some more debug info and guard against small payloads. + Original commit message from CVS: + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_process): + Add some more debug info and guard against small payloads. + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_process): + Set duration on outgoing buffers because we can. + +2008-05-02 12:39:03 +0000 Olivier Crete + + ext/speex/gstspeexenc.c: Add negotiation for the speex channels and rate. Fixes #465146. + Original commit message from CVS: + Patch by: Olivier Crete + * ext/speex/gstspeexenc.c: (gst_speex_enc_sink_getcaps), + (gst_speex_enc_init), (gst_speex_enc_chain): + Add negotiation for the speex channels and rate. Fixes #465146. + +2008-05-02 12:34:22 +0000 Olivier Crete + + gst/rtp/gstrtpspeexpay.c: Add negotiation for the speec channels and rate. See #465146. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_class_init), + (gst_rtp_speex_pay_getcaps): + Add negotiation for the speec channels and rate. See #465146. + +2008-05-02 12:24:55 +0000 Olivier Crete + + gst/rtp/gstrtpilbcpay.c: Add negotiation for the ILBC mode. See #465146. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_class_init), + (gst_rtpilbcpay_sink_setcaps), (gst_rtpilbcpay_sink_getcaps): + Add negotiation for the ILBC mode. See #465146. + +2008-05-02 11:32:31 +0000 Stefan Kost + + ext/soup/gstsouphttpsrc.c: Include stdlib to fix the build. Use g_free instead of free, libsoup uses glib. + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: + Include stdlib to fix the build. Use g_free instead of free, libsoup + uses glib. + +2008-05-02 09:09:58 +0000 j^ + + gst/qtdemux/qtdemux.c: Add more mpeg2 variants. Fixes #530886. + Original commit message from CVS: + Patch by: j^ + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add more mpeg2 variants. Fixes #530886. + +2008-05-01 10:52:11 +0000 Youness Alaoui + + gst/udp/gstudpsrc.c: Don't error out if we get an ICMP destination-unreachable message when trying to read packets on... + Original commit message from CVS: + Patch by: Youness Alaoui + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Don't error out if we get an ICMP destination-unreachable + message when trying to read packets on win32 (#529454). + +2008-04-30 12:18:41 +0000 Tim-Philipp Müller + + Use new error code for encrypted streams (which requires core CVS). + Original commit message from CVS: + * configure.ac: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Use new error code for encrypted streams (which requires core CVS). + +2008-04-30 12:10:02 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Fix swapped pad template names, spotted by Thiago Sousa Santos. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_videosrc_template), + (gst_qtdemux_audiosrc_template): + Fix swapped pad template names, spotted by Thiago Sousa Santos. + +2008-04-30 09:48:11 +0000 Wim Taymans + + ext/speex/gstspeexdec.c: Produce concealment data when time progresses in a segment update. + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_sink_event), + (speex_dec_chain_parse_data): + Produce concealment data when time progresses in a segment update. + +2008-04-29 14:11:45 +0000 Wim Taymans + + ext/speex/gstspeexdec.c: Try to preserve input timestamps when we can. + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data), + (speex_dec_chain): + Try to preserve input timestamps when we can. + Do beginnings of error concealment. + +2008-04-28 22:38:11 +0000 Michael Smith + + gst/debug/gstnavigationtest.c: MSVC doesn't provide rint(), define an adequate replacement locally as elsewhere. + Original commit message from CVS: + * gst/debug/gstnavigationtest.c: + MSVC doesn't provide rint(), define an adequate replacement locally as + elsewhere. + +2008-04-28 11:16:32 +0000 Julien Moutte + + gst/debug/rndbuffersize.c: Fix printf format to pacify Mac OSX's gcc. + Original commit message from CVS: + 2008-04-28 Julien Moutte + * gst/debug/rndbuffersize.c: (gst_rnd_buffer_size_loop): Fix printf + format to pacify Mac OSX's gcc. + +2008-04-25 19:34:31 +0000 Tim-Philipp Müller + + gst/debug/rndbuffersize.c: Bring rndbuffersize element into a state that doesn't require us to move it to -bad immedi... + Original commit message from CVS: + * gst/debug/rndbuffersize.c: (DEFAULT_SEED), (DEFAULT_MIN), + (DEFAULT_MAX), (src_template), (sink_template), + (gst_rnd_buffer_size_base_init), (gst_rnd_buffer_size_class_init), + (gst_rnd_buffer_size_init), (gst_rnd_buffer_size_activate), + (gst_rnd_buffer_size_loop), (gst_rnd_buffer_size_plugin_init): + Bring rndbuffersize element into a state that doesn't require us + to move it to -bad immediately. For one, fix up default min/max + values so that the element actuall works using the default values. + Also, don't ignore flow return values and do some kind of minimal + eos logic. Allow min=max to pull fixed-sized buffers. Bunch of + other gratuitious clean-ups. + +2008-04-25 19:24:00 +0000 Tim-Philipp Müller + + docs/plugins/: Add docs for gdkpixbufsink; update docs to CVS version. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + Add docs for gdkpixbufsink; update docs to CVS version. + +2008-04-25 18:45:33 +0000 Wim Taymans + + tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: Remove test sync-offset by default. + Original commit message from CVS: + * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: + Remove test sync-offset by default. + +2008-04-25 13:31:48 +0000 Tim-Philipp Müller + + gst/: Use GLib versions of htonl, htons, ntohl and ntohs in order to avoid problems on win32 (#529707). + Original commit message from CVS: + * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_chain): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add_internal): + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + Use GLib versions of htonl, htons, ntohl and ntohs in order + to avoid problems on win32 (#529707). + +2008-04-25 12:52:44 +0000 Jesús Corrius + + gst/goom/: Fix build with mingw32: use rand() instead of random() and replace bzero() with memset(). Fixes #529692. + Original commit message from CVS: + Patch by: Jesús Corrius + * gst/goom/filters.c: (zoomVector): + * gst/goom/goom_core.c: (init_buffers): + Fix build with mingw32: use rand() instead of random() and + replace bzero() with memset(). Fixes #529692. + +2008-04-25 07:56:12 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Fix typo in comments. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_combine_flows): + Fix typo in comments. + * tests/examples/rtp/client-H263p-PCMA.sdp: + * tests/examples/rtp/client-H263p-PCMA.sh: + * tests/examples/rtp/client-H264-PCMA.sdp: + * tests/examples/rtp/client-H264-PCMA.sh: + * tests/examples/rtp/client-H264.sdp: + * tests/examples/rtp/client-H264.sh: + * tests/examples/rtp/client-PCMA.sdp: + * tests/examples/rtp/client-PCMA.sh: + * tests/examples/rtp/server-alsasrc-PCMA.sh: + * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: + * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: + Add some more docs and fix examples. + +2008-04-24 22:04:57 +0000 Sebastian Dröge + + tests/check/elements/multifile.c: Include stdlib.h and unistd.h for mkdtemp. Some platforms have it declared in the f... + Original commit message from CVS: + * tests/check/elements/multifile.c: + Include stdlib.h and unistd.h for mkdtemp. Some platforms have it + declared in the former, some have it declared in the latter. + +2008-04-24 22:01:52 +0000 Sebastian Dröge + + Stop using deprecated GLib functions. + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_set_property): + * gst/debug/tests.c: (md5_get_value): + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): + * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps): + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps): + Stop using deprecated GLib functions. + +2008-04-24 21:17:42 +0000 Jan Schmidt + + configure.ac: Back to development -> 0.10.8.1 + Original commit message from CVS: + * configure.ac: + Back to development -> 0.10.8.1 + === release 0.10.8 === + +=== release 0.10.8 === + +2008-04-23 23:40:48 +0000 Jan Schmidt + + * NEWS: + * RELEASE: + Release 0.10.8 a little harder (edited the release notes) + Original commit message from CVS: + Release 0.10.8 a little harder (edited the release notes) + +2008-04-23 23:26:24 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * gst-plugins-good.doap: + * po/LINGUAS: + * win32/common/config.h: + Release 0.10.8 + Original commit message from CVS: + Release 0.10.8 + +2008-04-23 23:18:44 +0000 Jan Schmidt + + * common: + * po/af.po: + * po/az.po: + * po/bg.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/hu.po: + * po/it.po: + * po/ja.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/ru.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + Original commit message from CVS: + Update .po files + +2008-04-22 00:29:00 +0000 Jan Schmidt + + configure.ac: 0.10.7.4 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.7.4 pre-release + +2008-04-22 00:18:52 +0000 Jan Schmidt + + gst/goom/: Free a bunch of stuff, and initialise things to fix leaks and valgrind warnings in the testsuite. + Original commit message from CVS: + * gst/goom/config_param.c: (goom_plugin_parameters_free): + * gst/goom/convolve_fx.c: (convolve_init), (convolve_free): + * gst/goom/filters.c: (zoomFilterVisualFXWrapper_free): + * gst/goom/flying_stars_fx.c: (fs_free): + * gst/goom/goom_config_param.h: + * gst/goom/goom_core.c: (goom_init), (goom_close): + * gst/goom/goom_plugin_info.h: + * gst/goom/gstgoom.c: (gst_goom_finalize): + * gst/goom/lines.c: (goom_lines_free): + * gst/goom/plugin_info.c: (plugin_info_init), (plugin_info_free): + * gst/goom/surf3d.c: (grid3d_free): + * gst/goom/surf3d.h: + * gst/goom/tentacle3d.c: (tentacle_free): + Free a bunch of stuff, and initialise things to fix leaks + and valgrind warnings in the testsuite. + Fixes: #529268 + +2008-04-21 21:54:11 +0000 Sebastian Dröge + + tests/check/elements/rganalysis.c: Don't leak a tag list. Fixes bug #529285. + Original commit message from CVS: + * tests/check/elements/rganalysis.c: (GST_START_TEST): + Don't leak a tag list. Fixes bug #529285. + +2008-04-21 08:21:14 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Ref caps as the return value for the request_pt_map signal. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (request_pt_map), + (gst_rtspsrc_configure_caps): + Ref caps as the return value for the request_pt_map signal. + Remove some caps weirdness when configuring a stream. See #528245. + +2008-04-18 18:47:43 +0000 Tim-Philipp Müller + + tests/icles/gdkpixbufsink-test.c: Add cast to placate gcc 4.1.2. + Original commit message from CVS: + * tests/icles/gdkpixbufsink-test.c: + Add cast to placate gcc 4.1.2. + +2008-04-17 23:00:29 +0000 Jan Schmidt + + configure.ac: 0.10.7.3 pre-release + Original commit message from CVS: + * configure.ac: + 0.10.7.3 pre-release + +2008-04-17 22:32:16 +0000 Jan Schmidt + + tests/check/Makefile.am: Disable some more elements in the state test. + Original commit message from CVS: + * tests/check/Makefile.am: + Disable some more elements in the state test. + Add a define so the soup test can find the test files + it needs at runtime. + * tests/check/elements/souphttpsrc.c: (run_server): + Add a define so the soup test can find the test files + it needs at runtime. + +2008-04-17 18:08:53 +0000 Jan Schmidt + + gst/goom/convolve_fx.c: Don't ever draw the GOOM logo. + Original commit message from CVS: + * gst/goom/convolve_fx.c: (convolve_apply): + Don't ever draw the GOOM logo. + Fixes: #528615 + +2008-04-17 10:24:32 +0000 Edward Hervey + + ext/: gst_atomic_int_set ==> g_atomic_int_set + Original commit message from CVS: + * ext/cdio/gstcdiocddasrc.c: + * ext/dv/gstdvdemux.c: + gst_atomic_int_set ==> g_atomic_int_set + +2008-04-16 10:31:17 +0000 Tim-Philipp Müller + + Strip out the config/script parsing stuff, we don't need it. + Original commit message from CVS: + * configure.ac: + * gst/goom/Makefile.am: + * gst/goom/convolve_fx.c: + * gst/goom/default_scripts.h: + * gst/goom/goom.h: + * gst/goom/goom_core.c: (choose_a_goom_line): + * gst/goom/goom_plugin_info.h: + * gst/goom/goomsl.c: + * gst/goom/goomsl.h: + * gst/goom/goomsl_hash.c: + * gst/goom/goomsl_hash.h: + * gst/goom/goomsl_heap.c: + * gst/goom/goomsl_heap.h: + * gst/goom/goomsl_private.h: + * gst/goom/plugin_info.c: + Strip out the config/script parsing stuff, we don't need it. + Fixes #527999. + +2008-04-15 16:58:36 +0000 Tim-Philipp Müller + + gst/goom/plugin_info.c: Disable altivec optimisations for 32-bit PPC as well to make things build properly on all PPC... + Original commit message from CVS: + * gst/goom/plugin_info.c: (setOptimizedMethods): + Disable altivec optimisations for 32-bit PPC as well to make + things build properly on all PPC systems. Fixes #528143 + +2008-04-14 20:01:44 +0000 Tim-Philipp Müller + + gst-plugins-good.spec.in: Update for souphttpsrc plugin which has moved to -good. + Original commit message from CVS: + * gst-plugins-good.spec.in: + Update for souphttpsrc plugin which has moved to -good. + +2008-04-14 13:38:32 +0000 Mark Nauwelaerts + + gst/matroska/matroska-demux.c: Fix open-ended seeks in matroskademux + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_seek_event): + Fix open-ended seeks in matroskademux + Patch by: Mark Nauwelaerts + Fixes: #526557 + +2008-04-13 23:13:32 +0000 Jan Schmidt + + tests/check/Makefile.am: Add soup test certificates to the dist. + Original commit message from CVS: + * tests/check/Makefile.am: + Add soup test certificates to the dist. + +2008-04-13 17:43:52 +0000 Jan Schmidt + + ext/Makefile.am: Remove LADSPA reference I missed. + Original commit message from CVS: + * ext/Makefile.am: + Remove LADSPA reference I missed. + +2008-04-13 13:06:39 +0000 Sebastian Dröge + + ext/soup/gstsouphttpsrc.c: Give souphttpsrc GST_RANK_PRIMARY to make it the default HTTP source over gnome-vfs and ev... + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: (plugin_init): + Give souphttpsrc GST_RANK_PRIMARY to make it the default HTTP source + over gnome-vfs and everything else. Fixes bug #527848. + +2008-04-12 23:47:23 +0000 Jan Schmidt + + Remove LADSPA plugin. Fixes: #515978 + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + Remove LADSPA plugin. Fixes: #515978 + +2008-04-12 23:30:54 +0000 Jan Schmidt + + Move soup plugin from -bad (Fixes: #523124) + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-soup.xml: + * ext/Makefile.am: + * tests/check/Makefile.am: + Move soup plugin from -bad (Fixes: #523124) + +2008-04-11 11:08:35 +0000 Jan Schmidt + + * ChangeLog: + Fix the Changelog - actually speex <= 1.1.12 are vulnerable. + Original commit message from CVS: + Fix the Changelog - actually speex <= 1.1.12 are vulnerable. + +2008-04-11 10:32:20 +0000 Jan Schmidt + + ext/speex/gstspeexdec.c: Fix bounds checking of mode in Speex header, which may produce negative numbers in speex < 1... + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_header): + Fix bounds checking of mode in Speex header, which may + produce negative numbers in speex < 1.1.12 + +2008-04-10 07:11:51 +0000 Sebastian Dröge + + tests/check/elements/souphttpsrc.c: Increase the timeout for the internet tests to 250 seconds and check for NULL cap... + Original commit message from CVS: + * tests/check/elements/souphttpsrc.c: (got_buffer), + (souphttpsrc_suite): + Increase the timeout for the internet tests to 250 seconds + and check for NULL caps instead of just crashing. + The real fix would be to implement an shoutcast server for the unit test + instead of relying on a working internet connection. + Fixes bug #521749. + +2008-04-09 16:11:40 +0000 Tim-Philipp Müller + + gst/goom/: Remove a bunch of font/text related code that we don't need. + Original commit message from CVS: + * gst/goom/Makefile.am: + * gst/goom/gfontlib.c: + * gst/goom/gfontlib.h: + * gst/goom/gfontrle.c: + * gst/goom/gfontrle.h: + * gst/goom/goom.h: + * gst/goom/goom_core.c: (goom_update): + * gst/goom/goom_plugin_info.h: + * gst/goom/gstgoom.c: (gst_goom_chain): + * gst/goom/plugin_info.c: + Remove a bunch of font/text related code that we don't need. + +2008-04-09 14:02:37 +0000 Tim-Philipp Müller + + gst/goom/: Change license of these files to LGPL, as permitted by the author, Guillaume Borios. See #515073. + Original commit message from CVS: + * gst/goom/ppc_drawings.s: + * gst/goom/ppc_zoom_ultimate.s: + Change license of these files to LGPL, as permitted by the + author, Guillaume Borios. See #515073. + +2008-04-09 13:31:22 +0000 Stefan Kost + + gst/goom/: As hinted in Bug #518213, revert one change and fix warnings properly. + Original commit message from CVS: + * gst/goom/convolve_fx.c: + * gst/goom/motif_goom1.h: + * gst/goom/motif_goom2.h: + As hinted in Bug #518213, revert one change and fix warnings properly. + This fixes both #518213 and #520073 for me. + +2008-04-09 12:02:55 +0000 Jan Schmidt + + gst/matroska/: Fix the Forte build by making function declaration signatures match the implementations. + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_read_seek): + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_parse_contents_seekentry), + (gst_matroska_demux_loop): + Fix the Forte build by making function declaration signatures + match the implementations. + +2008-04-08 19:49:34 +0000 Tim-Philipp Müller + + sys/oss/: More logging when probing (see #518474), some comments in _reset(). + Original commit message from CVS: + * sys/oss/gstosshelper.c: (gst_oss_helper_rate_check_rate): + * sys/oss/gstosssink.c: (gst_oss_sink_reset): + * sys/oss/gstosssrc.c: (gst_oss_src_reset): + More logging when probing (see #518474), some comments in _reset(). + +2008-04-07 17:18:48 +0000 Julien Moutte + + gst/rtp/gstrtph264pay.c: Fix build because of a bad argument number. + Original commit message from CVS: + 2008-04-07 Julien Moutte + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps): Fix build + because of a bad argument number. + +2008-04-06 18:28:09 +0000 Tim-Philipp Müller + + tests/icles/: Interactive test app for gdkpixbufsink. + Original commit message from CVS: + * tests/icles/.cvsignore: + * tests/icles/Makefile.am: + * tests/icles/gdkpixbufsink-test.c: + Interactive test app for gdkpixbufsink. + +2008-04-06 09:01:42 +0000 Sjoerd Simons + + ext/soup/gstsouphttpsrc.c: Only ignore actual redirects not all responses when in state + Original commit message from CVS: + Patch by: Sjoerd Simons + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_response_cb): + Only ignore actual redirects not all responses when in state + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING. Fixes bug #526337. + +2008-04-06 08:57:59 +0000 Damien Lespiau + + configure.ac: Actually build dlls when cross-compiling with mingw32. + Original commit message from CVS: + Patch by: Damien Lespiau + * configure.ac: + Actually build dlls when cross-compiling with mingw32. + Fixes bug #526247. + +2008-04-05 12:00:46 +0000 Tim-Philipp Müller + + ext/hal/hal.c: Don't munge device string to 'default:x' for capture devices. + Original commit message from CVS: + * ext/hal/hal.c: (gst_hal_get_alsa_element): + Don't munge device string to 'default:x' for capture devices. + Fixes #525833. + +2008-04-04 19:00:19 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Always use GSlice as we actually depend on GLib 2.12 already. + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_index_entry_free): + Always use GSlice as we actually depend on GLib 2.12 already. + +2008-04-04 11:26:40 +0000 Tim-Philipp Müller + + configure.ac: Require core/base 0.10.18 for ARGB caps parsing fixes in libgstvideo. + Original commit message from CVS: + * configure.ac: + Require core/base 0.10.18 for ARGB caps parsing fixes in libgstvideo. + Also bump the GLib requirement to the current de-facto requirement + (ie. 2.12). + +2008-04-04 10:32:21 +0000 Wim Taymans + + gst/rtp/gstrtph264pay.*: Parse codec_data for future AVC compatibility. + Original commit message from CVS: + * gst/rtp/gstrtph264pay.c: (encode_base64), + (gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_handle_buffer): + * gst/rtp/gstrtph264pay.h: + Parse codec_data for future AVC compatibility. + Fail when we encounter AVC data for now. + +2008-04-04 09:50:10 +0000 Tim-Philipp Müller + + gst/spectrum/gstspectrum.c: Rename property enums and default defines for the properties to match the property names ... + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), + (gst_spectrum_init), (gst_spectrum_set_property), + (gst_spectrum_get_property), (gst_spectrum_message_new): + Rename property enums and default defines for the properties to match + the property names and rephrase property descriptions to make them a + bit clearer (hopefully). See #518188. + +2008-04-03 22:59:44 +0000 Tim-Philipp Müller + + tests/check/: Add unit test for gdkpixbufsink element. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/gdkpixbufsink.c: + Add unit test for gdkpixbufsink element. + +2008-04-03 22:50:48 +0000 Tim-Philipp Müller + + ext/gdk_pixbuf/: Add gdkpixbufsink element for easy snapshotting (#525946). + Original commit message from CVS: + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + (gst_gdk_pixbuf_sink_base_init), + (gst_gdk_pixbuf_sink_class_init), (gst_gdk_pixbuf_sink_init), + (gst_gdk_pixbuf_sink_start), (gst_gdk_pixbuf_sink_stop), + (gst_gdk_pixbuf_sink_set_caps), + (gst_gdk_pixbuf_sink_pixbuf_destroy_notify), + (gst_gdk_pixbuf_sink_get_pixbuf_from_buffer), + (gst_gdk_pixbuf_sink_handle_buffer), (gst_gdk_pixbuf_sink_preroll), + (gst_gdk_pixbuf_sink_render), (gst_gdk_pixbuf_sink_set_property), + (gst_gdk_pixbuf_sink_get_property): + * ext/gdk_pixbuf/gstgdkpixbufsink.h: + Add gdkpixbufsink element for easy snapshotting (#525946). + +2008-04-03 20:25:34 +0000 Sebastian Dröge + + tests/check/pipelines/wavpack.c: Bump timeout from 3 to 60 seconds. + Original commit message from CVS: + * tests/check/pipelines/wavpack.c: (wavpack_suite): + Bump timeout from 3 to 60 seconds. + +2008-04-03 20:21:15 +0000 Sebastian Dröge + + tests/check/pipelines/.cvignore: Remove useless file. + Original commit message from CVS: + * tests/check/pipelines/.cvignore: + Remove useless file. + * tests/check/pipelines/.cvsignore: + Add new test to .cvsignore. + +2008-04-03 20:05:31 +0000 Sebastian Dröge + + tests/check/: Add unit test that encodes and decodes some data, checks that it is still the same and that all timesta... + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/pipelines/wavpack.c: (bus_handler), + (identity_handoff), (fakesink_handoff), (GST_START_TEST), + (wavpack_suite), (main): + Add unit test that encodes and decodes some data, checks that it + is still the same and that all timestamps/offsets are perfect. + +2008-04-03 18:28:28 +0000 Sebastian Dröge + + ext/wavpack/: Use GSlice for allocating index entries and use gst_element_class_set_details_simple(). + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init): + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_index_entry_new), + (gst_wavpack_parse_index_entry_free), + (gst_wavpack_parse_base_init), + (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset): + Use GSlice for allocating index entries and use + gst_element_class_set_details_simple(). + +2008-04-02 22:37:29 +0000 Brian Cameron + + sys/sunaudio/: Fix up copyrights (#525860). + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudio.c: + * sys/sunaudio/gstsunaudiomixer.c: + * sys/sunaudio/gstsunaudiomixer.h: + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiomixerctrl.h: + * sys/sunaudio/gstsunaudiomixertrack.c: + * sys/sunaudio/gstsunaudiomixertrack.h: + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosink.h: + * sys/sunaudio/gstsunaudiosrc.c: + * sys/sunaudio/gstsunaudiosrc.h: + Fix up copyrights (#525860). + +2008-04-02 16:10:33 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add new goom plugin to spec file + Original commit message from CVS: + add new goom plugin to spec file + +2008-04-02 15:42:27 +0000 Tim-Philipp Müller + + gst/goom/goomsl.c: Check return value of fread() to avoid compiler warnings. + Original commit message from CVS: + * gst/goom/goomsl.c: (gsl_read_file): + Check return value of fread() to avoid compiler warnings. + +2008-04-01 11:00:43 +0000 mersad + + gst/law/: Make negotiation a bit modern. + Original commit message from CVS: + Based on patch by: mersad + * gst/law/alaw-decode.c: (gst_alaw_dec_sink_setcaps), + (gst_alaw_dec_chain), (gst_alaw_dec_change_state): + * gst/law/alaw-decode.h: + * gst/law/alaw-encode.c: (gst_alaw_enc_chain): + * gst/law/mulaw-decode.c: (mulawdec_sink_setcaps), + (gst_mulawdec_chain), (gst_mulawdec_change_state): + * gst/law/mulaw-decode.h: + * gst/law/mulaw-encode.c: (gst_mulawenc_chain): + Make negotiation a bit modern. + Use pad_alloc. Fixes #525359. + +2008-03-31 22:06:14 +0000 David Schleef + + gst/goom/xmmx.c: Fix constraints on asm code so that it compiles consistently. Fixes #522278. + Original commit message from CVS: + * gst/goom/xmmx.c: Fix constraints on asm code so that it + compiles consistently. Fixes #522278. + +2008-03-27 09:36:58 +0000 Brian Cameron + + sys/sunaudio/: Fix up the mixer tracks to use a volume range of 0-255, which is what the sun audio API uses. This sim... + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_get_volume), + (gst_sunaudiomixer_ctrl_set_volume): + * sys/sunaudio/gstsunaudiomixertrack.c: (gst_sunaudiomixer_track_new): + Fix up the mixer tracks to use a volume range of 0-255, which is what + the sun audio API uses. This simplifies the code and avoids rounding + errors. Fixes #524593. + +2008-03-26 15:10:08 +0000 Edgard Lima + + * ChangeLog: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + Add device-fd property to make it possible to apps to call ioctl's. + Original commit message from CVS: + Add device-fd property to make it possible to apps to call ioctl's. + +2008-03-25 16:44:20 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Unbreak streaming mode again. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (next_entry_size): + Unbreak streaming mode again. + +2008-03-25 12:39:22 +0000 Tim-Philipp Müller + + sys/v4l2/v4l2src_calls.c: Remove superfluous DEBUG macro. + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture): + Remove superfluous DEBUG macro. + +2008-03-25 12:33:09 +0000 William M. Brack + + sys/v4l2/v4l2src_calls.c: Check whether the device supports setting the framerate before trying to set it and then po... + Original commit message from CVS: + Based on patch by: William M. Brack + * sys/v4l2/v4l2src_calls.c: (fractions_are_equal), + (gst_v4l2src_set_capture): + Check whether the device supports setting the framerate before + trying to set it and then posting a warning or error if it doesn't + work (#516649, #520092). Also compare fractions more correctly. + +2008-03-24 12:32:59 +0000 Rene Stadler + + Make rganalysis and rglimiter elements GAP-flag aware. + Original commit message from CVS: + * gst/replaygain/gstrganalysis.c (gst_rg_analysis_init), + (gst_rg_analysis_transform_ip): + * gst/replaygain/gstrglimiter.c (gst_rg_limiter_init), + (gst_rg_limiter_transform_ip): + Make rganalysis and rglimiter elements GAP-flag aware. + * tests/check/elements/rganalysis.c: (test_gap_buffers), + (rganalysis_suite): + * tests/check/elements/rglimiter.c (test_gap), (rglimiter_suite): + Add tests to verify gap-awareness. + +2008-03-23 13:31:15 +0000 Tim-Philipp Müller + + gst/goom/Makefile.am: Remove ppc assembler optimisations from the build until they actually build (they also seem to ... + Original commit message from CVS: + * gst/goom/Makefile.am: + Remove ppc assembler optimisations from the build until they + actually build (they also seem to have GPL headers). + +2008-03-23 12:48:44 +0000 Tim-Philipp Müller + + m4/Makefile.am: Better not dist files that don't exist any longer (lrint*m4). + Original commit message from CVS: + * m4/Makefile.am: + Better not dist files that don't exist any longer (lrint*m4). + +2008-03-22 19:26:04 +0000 Sebastian Dröge + + ext/soup/gstsouphttpsrc.c: Don't autoplug souphttpsrc for dav/davs. This is better handled by + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_headers_cb), + (gst_soup_http_src_chunk_allocator), + (gst_soup_http_src_got_chunk_cb), + (gst_soup_http_src_uri_get_protocols): + Don't autoplug souphttpsrc for dav/davs. This is better handled by + GIO and GnomeVFS as they provide authentication. + Don't leak the icy caps if we already set them and get a new + icy-metaint header. + Try harder to set the icy caps on the output buffer to have correct + caps for the first buffer already. + * tests/check/elements/souphttpsrc.c: (got_buffer), + (GST_START_TEST): + Check that we get a buffer with application/x-icy caps if iradio-mode + is enabled and we have an icecast URL. + +2008-03-22 18:18:46 +0000 Sebastian Dröge + + ext/soup/gstsouphttpsrc.c: Actually set the icy caps on our src pad if we have icecast data. + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_chunk_allocator): + Actually set the icy caps on our src pad if we have icecast data. + Fixes bug #523854. + +2008-03-21 13:36:27 +0000 Sebastian Dröge + + Remove lrint/lrintf checks. We don't use it anywhere. + Original commit message from CVS: + * configure.ac: + * m4/lrint.m4: + * m4/lrintf.m4: + Remove lrint/lrintf checks. We don't use it anywhere. + +2008-03-19 19:56:59 +0000 Stefan Kost + + gst/freeze/: Add example to source code documentation blob and remove the 3 line + Original commit message from CVS: + * gst/freeze/FAQ: + * gst/freeze/Makefile.am: + * gst/freeze/gstfreeze.c: + Add example to source code documentation blob and remove the 3 line + FAQ. + * gst/interleave/interleave.c: + Add a source code documentation blob. + +2008-03-18 15:03:06 +0000 Andy Wingo + + * ChangeLog: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy) + Original commit message from CVS: + 2008-03-18 Andy Wingo + * sys/osxvideo/osxvideosink.m + (gst_osx_video_sink_osxwindow_destroy) + (gst_osx_video_sink_osxwindow_new): Actually set a lock on the + task, whoopdee. + (cocoa_event_loop): Pacify the taymans by upping the usleepage to + 2 ms. + +2008-03-18 11:50:08 +0000 Andy Wingo + + sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy) + Original commit message from CVS: + 2008-03-18 Andy Wingo + * sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy) + (gst_osx_video_sink_osxwindow_new, cocoa_event_loop): + * sys/osxvideo/osxvideosink.h (struct _GstOSXVideoSink): If we + need to run an event loop, do so in a task instead of assuming + that there will be a GMainLoop. Fixes #523134. + +2008-03-17 19:50:58 +0000 William M. Brack + + sys/v4l2/v4l2src_calls.c: Make sure the probed frame sizes are reversed in the resulting caps also when using V4L2_FR... + Original commit message from CVS: + Patch by: William M. Brack + * sys/v4l2/v4l2src_calls.c: + (gst_v4l2src_probe_caps_for_format_and_size), + (gst_v4l2src_probe_caps_for_format): + Make sure the probed frame sizes are reversed in the resulting + caps also when using V4L2_FRMSIZE_STEPWISE (so they end up + highest resolution first); also remove unused variable. + (Partly fixes #520092) + +2008-03-17 15:56:01 +0000 Ole André Vadla RavnÃ¥s + + gst/rtsp/gstrtspsrc.c: Call WSAStartup() and WSACleanup before using the Winsock API. + Original commit message from CVS: + Patch by: Ole André Vadla RavnÃ¥s + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_finalize): + Call WSAStartup() and WSACleanup before using the Winsock API. + See #520808. + +2008-03-16 15:01:07 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Erm, the buffer-size is just guint, no need for the special format specifier. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Erm, the buffer-size is just guint, no need for the special format + specifier. + +2008-03-16 14:34:45 +0000 Tim-Philipp Müller + + gst/goom/: Small fixes to build more on PPC: ifdef out code that uses unknown define; add newline at end of header fi... + Original commit message from CVS: + * gst/goom/plugin_info.c: + * gst/goom/ppc_zoom_ultimate.h: + Small fixes to build more on PPC: ifdef out code that uses unknown + define; add newline at end of header file to avoid compiler warning. + Assembler code still doesn't build though. + +2008-03-16 14:04:16 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Fix up my last commit. Use G_GUINT32_FORMAT for the guint32 debug log. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Fix up my last commit. Use G_GUINT32_FORMAT for the guint32 debug log. + Also downgrade a GST_WARNING to GST_DEBUG and add a comment. + +2008-03-15 22:10:38 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Chunksize is uint32. Fix format specifier. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Chunksize is uint32. Fix format specifier. + +2008-03-14 15:53:01 +0000 Christian Schaller + + * ChangeLog: + * gst/rtsp/COPYING.MIT: + fix license file, remove extra line copied over by mistake + Original commit message from CVS: + fix license file, remove extra line copied over by mistake + +2008-03-13 14:30:45 +0000 Sebastian Dröge + + gst/audiofx/audiofx.c: Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead of hardcoding values. + Original commit message from CVS: + * gst/audiofx/audiofx.c: + Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead + of hardcoding values. + +2008-03-13 09:45:09 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.*: Try to resume on server disconnect. Fixes bug #522134. + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_init), + (gst_soup_http_src_finished_cb), (gst_soup_http_src_response_cb), + (gst_soup_http_src_build_message), (gst_soup_http_src_create): + * ext/soup/gstsouphttpsrc.h: + Try to resume on server disconnect. Fixes bug #522134. + +2008-03-11 23:12:04 +0000 Mark Nauwelaerts + + sys/oss/gstosssrc.*: Cache probed caps, so _get_caps() during recording doesn't cause ioctl calls which may disrupt t... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * sys/oss/gstosssrc.c: (gst_oss_src_init), (gst_oss_src_getcaps), + (gst_oss_src_close): + * sys/oss/gstosssrc.h: + Cache probed caps, so _get_caps() during recording doesn't cause + ioctl calls which may disrupt the recording (fixes #521875). + +2008-03-11 16:23:04 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Make sure we always send a DISCONT after a seek by setting the sample index to an undefined va... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), + (gst_qtdemux_activate_segment), + (gst_qtdemux_prepare_current_sample), + (gst_qtdemux_loop_state_movie), (qtdemux_parse_trak): + Make sure we always send a DISCONT after a seek by setting the sample + index to an undefined value after a seek. + +2008-03-11 15:18:43 +0000 Tim-Philipp Müller + + gst/avi/gstavisubtitle.h: Fix up IS_FOO macros, which makes gtk-doc much happier. + Original commit message from CVS: + * gst/avi/gstavisubtitle.h: (GST_IS_AVI_SUBTITLE), + (GST_IS_AVI_SUBTITLE_CLASS): + Fix up IS_FOO macros, which makes gtk-doc much happier. + +2008-03-08 19:29:20 +0000 Tim-Philipp Müller + + tests/icles/Makefile.am: Move the -lgstfoo where it belongs. + Original commit message from CVS: + * tests/icles/Makefile.am: + Move the -lgstfoo where it belongs. + +2008-03-08 19:14:22 +0000 Tim-Philipp Müller + + * ChangeLog: + ChangeLog surgery + Original commit message from CVS: + ChangeLog surgery + +2008-03-08 04:40:32 +0000 Sebastian Dröge + + gst/matroska/ebml-ids.h: Add ID for EBML CRC32 elements. + Original commit message from CVS: + * gst/matroska/ebml-ids.h: + Add ID for EBML CRC32 elements. + * gst/matroska/Makefile.am: + * gst/matroska/ebml-read.c: (gst_ebml_finalize), + (gst_ebml_read_class_init), (gst_ebml_read_peek_bytes), + (gst_ebml_read_get_length), (_ext2dbl), (gst_ebml_read_float), + (gst_ebml_read_header): + Support reading 80bit floats, add finalize method to clean up + in any case, support reading length/id elements with any length + as long as it's smaller than our supported maximum, don't leak + buffers if reading as much data as we wanted failed and some + smaller cleanup. + +2008-03-08 04:21:34 +0000 Olivier Crete + + gst/rtp/gstrtph263pdepay.c: Check that a buffer is large enough before reading from it. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_process): + Check that a buffer is large enough before reading from it. + Fixes bug #521102. + +2008-03-07 15:54:09 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Fix compilation after removing the GstPollMode from the constructor. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + Fix compilation after removing the GstPollMode from the + constructor. + +2008-03-07 13:08:42 +0000 Sebastian Dröge + + Check for sinh(), cosh() and asinh() and define our own implementations if they're not available. Fixes bug #520880. + Original commit message from CVS: + * configure.ac: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiochebband.c: + * gst/audiofx/audiocheblimit.c: + * gst/audiofx/math_compat.h: + Check for sinh(), cosh() and asinh() and define our own + implementations if they're not available. Fixes bug #520880. + +2008-03-07 12:40:18 +0000 Olivier Crete + + ext/speex/gstspeexenc.c: Unref the buffers only once when handling not-negotiated errors. + Original commit message from CVS: + Patch by: Olivier Crete + * ext/speex/gstspeexenc.c: (gst_speex_enc_chain): + Unref the buffers only once when handling not-negotiated errors. + Fixes bug #520764. + +2008-03-07 10:01:40 +0000 Ole André Vadla RavnÃ¥s + + gst/udp/gstudpsrc.c: Properly balance WSA_Cleanup with WSA_Startup. + Original commit message from CVS: + Patch by: Ole André Vadla RavnÃ¥s + * gst/udp/gstudpsrc.c: (gst_udpsrc_finalize), (gst_udpsrc_start), + (gst_udpsrc_stop): + Properly balance WSA_Cleanup with WSA_Startup. + Also make the poll controllable on windows. Fixes #520888. + +2008-03-06 19:47:48 +0000 Wim Taymans + + gst/matroska/: Handle return values from pull_range in a more granular way to properly shut down on seeks. + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes), + (gst_ebml_read_pull_bytes), (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_peek_id), + (gst_ebml_read_skip), (gst_ebml_read_buffer), + (gst_ebml_read_bytes), (gst_ebml_read_uint), (gst_ebml_read_sint), + (gst_ebml_read_float), (gst_ebml_read_ascii), (gst_ebml_read_utf8), + (gst_ebml_read_date), (gst_ebml_read_master), + (gst_ebml_read_binary), (gst_ebml_read_header): + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_combine_flows), (gst_matroska_demux_reset), + (gst_matroska_demux_read_track_encodings), + (gst_matroska_demux_add_stream), + (gst_matroska_demux_handle_src_query), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_tracks), + (gst_matroska_demux_parse_index_cuetrack), + (gst_matroska_demux_parse_index_pointentry), + (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), + (gst_matroska_demux_parse_metadata_id_simple_tag), + (gst_matroska_demux_parse_metadata_id_tag), + (gst_matroska_demux_parse_metadata), + (gst_matroska_demux_sync_streams), + (gst_matroska_demux_push_hdr_buf), + (gst_matroska_demux_push_flac_codec_priv_data), + (gst_matroska_demux_push_xiph_codec_priv_data), + (gst_matroska_demux_add_wvpk_header), + (gst_matroska_demux_check_subtitle_buffer), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_parse_cluster), + (gst_matroska_demux_parse_contents_seekentry), + (gst_matroska_demux_parse_contents), + (gst_matroska_demux_loop_stream_parse_id), + (gst_matroska_demux_loop_stream), (gst_matroska_demux_loop): + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-ids.h: + Handle return values from pull_range in a more granular way to properly + shut down on seeks. + Combine return values from push. + Implement proper error handling. + Prepare for handling seeking correctly. + +2008-03-03 22:01:56 +0000 Jan Schmidt + + gst/matroska/ebml-read.c: Use GINT64 formatting constants from GLIB. + Original commit message from CVS: + * gst/matroska/ebml-read.c: + Use GINT64 formatting constants from GLIB. + * gst/matroska/matroska-demux.c: + Add some guards to avoid a possible division by 0 and crashing + with NULL events on some systems. + Use gst_gdouble_to_guint64 somewhere instead of an implicit + conversion. + * gst/matroska/matroska-mux.c: + Check for invalid timestamps in a bunch of places to avoid + writing bogus durations into the output file. + Fix some double<->gint64 conversions that weren't using + gst_guint64_to_gdouble + +2008-03-03 13:03:43 +0000 Peter Kjellerstedt + + configure.ac: Move the checks for bison, flex and as to the program section and the check for gcc inline asm to the c... + Original commit message from CVS: + * configure.ac: + Move the checks for bison, flex and as to the program section and the + check for gcc inline asm to the compiler characteristics section. + +2008-03-03 12:10:55 +0000 Peter Kjellerstedt + + configure.ac: Use AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to simplify which plug-ins are included/excluded. (#4... + Original commit message from CVS: + * configure.ac: + Use AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to simplify which + plug-ins are included/excluded. (#498222) + +2008-02-29 12:35:24 +0000 Michael Smith + + gst/videomixer/videomixer.c: Don't call gst_object_sync_values() unless we have a valid timestamp. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_blend_buffers): + Don't call gst_object_sync_values() unless we have a valid timestamp. + +2008-02-29 06:18:55 +0000 David Schleef + + gst/matroska/: Fix Dirac mapping. I had previously added a VfW-type mapping, but it looks like Dirac will get a nati... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: + Fix Dirac mapping. I had previously added a VfW-type + mapping, but it looks like Dirac will get a native Matroska + mapping, and this is the most likely method. + +2008-02-28 23:56:30 +0000 David Schleef + + gst/avi/gstavimux.c: Add Dirac encoding + Original commit message from CVS: + * gst/avi/gstavimux.c: Add Dirac encoding + +2008-02-28 11:51:24 +0000 Peter Kjellerstedt + + gst/udp/gstudpsrc.*: Port to GstPoll. See #505417. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create), + (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_unlock), + (gst_udpsrc_unlock_stop), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Port to GstPoll. See #505417. + +2008-02-28 08:37:44 +0000 Sebastian Dröge + + gst/law/mulaw-decode.c: Return GST_FLOW_NOT_NEGOTIATED when the caps are not set yet on the srcpad. We need rate and ... + Original commit message from CVS: + * gst/law/mulaw-decode.c: (gst_mulawdec_chain): + Return GST_FLOW_NOT_NEGOTIATED when the caps are not set + yet on the srcpad. We need rate and channels before we + can do any processing. Fixes bug #519088. + +2008-02-26 10:09:38 +0000 Jan Schmidt + + configure.ac: Detect and indicate if GCC inline assembly syntax is available. + Original commit message from CVS: + * configure.ac: + Detect and indicate if GCC inline assembly syntax is + available. + * gst/goom/Makefile.am: + * gst/goom/convolve_fx.c: + * gst/goom/flying_stars_fx.c: + * gst/goom/goom_config.h: + * gst/goom/goom_core.c: + * gst/goom/goomsl.c: + * gst/goom/ifs.c: + * gst/goom/mmx.c: + * gst/goom/plugin_info.c: + * gst/goom/xmmx.c: + Fix various GCC-isms, and only build the inline assembly + with compilers that support GCC inline assembly. + Fix a couple of other warnings shown with Forte. + +2008-02-26 05:36:17 +0000 Wouter Cloetens + + Add support for specifying a list of cookies to be passed in the HTTP request. Fixes bug #518722. + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), + (gst_soup_http_src_init), (gst_soup_http_src_dispose), + (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), + (gst_soup_http_src_create): + * ext/soup/gstsouphttpsrc.h: + * tests/check/elements/souphttpsrc.c: (run_test), (GST_START_TEST), + (souphttpsrc_suite): + Add support for specifying a list of cookies to be passed in + the HTTP request. Fixes bug #518722. + +2008-02-25 12:03:46 +0000 Stefan Kost + + gst/goom/xmmx.c: Use 'emms' instead of 'femms' to not crash on cpus that do not implement this 3dnow specific instruc... + Original commit message from CVS: + * gst/goom/xmmx.c: + Use 'emms' instead of 'femms' to not crash on cpus that do not + implement this 3dnow specific instruction. + +2008-02-25 10:32:35 +0000 Sebastian Dröge + + gst/goom/plugin_info.c: Use extended MMX for draw_line() too if available, not only normal MMX. + Original commit message from CVS: + * gst/goom/plugin_info.c: (setOptimizedMethods): + Use extended MMX for draw_line() too if available, not only + normal MMX. + +2008-02-25 06:50:31 +0000 Sebastian Dröge + + ext/jpeg/gstjpeg.c: Remove (commented out) smoke typefinder. This is in base now. + Original commit message from CVS: + * ext/jpeg/gstjpeg.c: (plugin_init): + Remove (commented out) smoke typefinder. This is in base now. + +2008-02-23 15:02:15 +0000 Jan Schmidt + + gst/goom2k1/: Rename the installed library, and don't register the same + Original commit message from CVS: + * gst/goom2k1/Makefile.am: + * gst/goom2k1/gstgoom.c: + Rename the installed library, and don't register the same + GType name as the new goom. + +2008-02-23 12:23:38 +0000 Tim-Philipp Müller + + Check for and define ERROR_CXXFLAGS and use them when building + Original commit message from CVS: + * configure.ac: + * ext/taglib/Makefile.am: + Check for and define ERROR_CXXFLAGS and use them when building + C++ code (#516509). + +2008-02-23 12:10:16 +0000 Tim-Philipp Müller + + gst/goom/: Call oil_init(), otherwise oil_get_cpu_flags() won't return anything useful. Export goom debug category so... + Original commit message from CVS: + * gst/goom/gstgoom.c: (goom_debug), (plugin_init): + * gst/goom/plugin_info.c: (goom_debug), (GST_CAT_DEFAULT), + (setOptimizedMethods): + Call oil_init(), otherwise oil_get_cpu_flags() won't return + anything useful. Export goom debug category so we can get + rid of the VERBOSE define and the printfs. + +2008-02-23 11:53:27 +0000 Tim-Philipp Müller + + gst/goom/: Compile fixes for x86-64. + Original commit message from CVS: + * gst/goom/goomsl_heap.c: (align_it): + * gst/goom/plugin_info.c: (setOptimizedMethods): + Compile fixes for x86-64. + +2008-02-23 03:10:55 +0000 Bastien Nocera + + gst/goom/Makefile.am: Don't compile lex or yacc outputs with warnings, but add other CFLAGS + Original commit message from CVS: + * gst/goom/Makefile.am: Don't compile lex or yacc outputs + with warnings, but add other CFLAGS + * gst/goom/goomsl.c (gsl_instr_set_namespace), + (gsl_instr_add_param), (iflow_execute), (gsl_enternamespace), + (calculate_labels), (gsl_read_file): + * gst/goom/goomsl_lex.l: + * gst/goom/goomsl_yacc.y: + * gst/goom/plugin_info.c: Remove a few live printf, and + fprintf, replace exit() calls with g_assert_not_reached() + if it not optimal for a library + +2008-02-23 02:38:03 +0000 Bastien Nocera + + gst/goom/Makefile.am: Remove the warnings being disabled, fix linkage on x86, spotted by Sebastian Dröge + Original commit message from CVS: + * gst/goom/Makefile.am: Remove the warnings being disabled, + fix linkage on x86, spotted by Sebastian Dröge + + * gst/goom/convolve_fx.c (convolve_init), + (create_output_with_brightness), (convolve_apply): + * gst/goom/filters.c (zoomFilterVisualFXWrapper_create): + * gst/goom/goomsl.c: + * gst/goom/ifs.c (ifs_update), (ifs_visualfx_create): + * gst/goom/plugin_info.c: + * gst/goom/tentacle3d.c (tentacle_fx_create): + Fix warnings, and disable the motifs in the convolve_fx + plugin (they were causing warnings, and they were just + "Goom" in funny letterring) + +2008-02-23 01:51:37 +0000 Bastien Nocera + + configure.ac: Add checks for Flex/Yacc/Bison and other furry animals, for the new goom 2k4 based plugin + Original commit message from CVS: + 2008-02-23 Bastien Nocera + * configure.ac: Add checks for Flex/Yacc/Bison and other + furry animals, for the new goom 2k4 based plugin + * gst/goom/*: Update to use goom 2k4, uses liboil to detect + CPU optimisations (not working yet), move the old plugin to... + * gst/goom2k1/*: ... here, in case somebody is sick enough + Fixes #515073 + +2008-02-22 09:56:03 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Post the server response code in an error message instead of a generic 'error' message. Fixes ... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams): + Post the server response code in an error message instead of a generic + 'error' message. Fixes #517237. + +2008-02-22 07:20:03 +0000 Wouter Cloetens + + Implement zero-copy and make the buffer size configurable. + Original commit message from CVS: + Patch by: Wouter Cloetens + * configure.ac: + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_cancel_message), + (gst_soup_http_src_finished_cb), (gst_soup_http_src_chunk_free), + (gst_soup_http_src_chunk_allocator), + (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_create), + (gst_soup_http_src_start), (gst_soup_http_src_set_proxy): + * ext/soup/gstsouphttpsrc.h: + Implement zero-copy and make the buffer size configurable. + Prefix proxy URIs with "http://" if they don't start with it + already and catch errors earlier, fixes hanging in some situations. + Fixes bug #514948. + +2008-02-22 06:22:39 +0000 Sebastian Dröge + + tests/check/Makefile.am: Ignore gconfaudiosrc for the states unit test too. It will fallback to alsasrc if the gconf ... + Original commit message from CVS: + * tests/check/Makefile.am: + Ignore gconfaudiosrc for the states unit test too. It will fallback + to alsasrc if the gconf settings can't be read and not everybody has + alsa. + +2008-02-22 06:06:06 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.*: Always report the duration if we know it in push mode and don't return 0 just to make ... + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query), + (gst_wavpack_parse_create_src_pad): + * ext/wavpack/gstwavpackparse.h: + Always report the duration if we know it in push mode and don't + return 0 just to make totem believe we can't seek in push mode. + Newer totem version use the SEEKING query which properly reports + if we can seek or not. + +2008-02-22 05:39:01 +0000 Jens Granseuer + + tests/examples/equalizer/demo.c: C89 fix, moving variable declarations to the beginning of the block. Fixes bug #517933. + Original commit message from CVS: + Patch by: Jens Granseuer + * tests/examples/equalizer/demo.c: (main): + C89 fix, moving variable declarations to the beginning of + the block. Fixes bug #517933. + +2008-02-21 23:47:37 +0000 Jan Schmidt + + configure.ac: Back to development... + Original commit message from CVS: + * configure.ac: + Back to development... + +=== release 0.10.7 === + +2008-02-21 00:09:07 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.prerequisites: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-equalizer.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multifile.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * gst-plugins-good.doap: + * po/LINGUAS: + * win32/common/config.h: + Release 0.10.7 - Red Door Black + Original commit message from CVS: + Release 0.10.7 - Red Door Black + +2008-02-20 22:51:08 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/hu.po: + * po/it.po: + * po/ja.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/pl.po: + * po/sk.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_HK.po: + * po/zh_TW.po: + Update .po files + Original commit message from CVS: + Update .po files + +2008-02-19 10:47:20 +0000 Sebastian Dröge + + gst/alpha/Makefile.am: Link alpha plugin with libgstbase. Fixes bug #517386. + Original commit message from CVS: + * gst/alpha/Makefile.am: + Link alpha plugin with libgstbase. Fixes bug #517386. + +2008-02-18 11:13:35 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Init values to -1 instead of the default 0 value. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream): + Init values to -1 instead of the default 0 value. + Fixes #516524. + +2008-02-14 14:50:30 +0000 Stefan Kost + + tests/examples/spectrum/spectrum-example.c: Add missing include to fix compilation when libxml usage is disabled. + Original commit message from CVS: + * tests/examples/spectrum/spectrum-example.c: + Add missing include to fix compilation when libxml usage is disabled. + Fixes: #516371 + +2008-02-12 23:38:19 +0000 Wim Taymans + + fixes: #514889 + Original commit message from CVS: + patch by: Wim Taymans + fixes: #514889 + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4gpay.h: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbispay.c: + Fix various leaks shown up in valgrind + - free sprops and buffer in error cases in H264 payloader + - fix leak in mp4g depayloader when construction the caps + - don't leak config string in the mp4g payloader + - don't leak buffers and headers in theora and vorbis payloaders + * tests/check/elements/rtp-payloading.c: + Fix the RTP data test + - Actually send valid amr data to the payloader instead of 20 + zero-bytes + - The mp4g payloader expects codec_data on the caps + +2008-02-12 21:36:40 +0000 Sébastien Moutte + + win32/MANIFEST: Add libgstpng.dsp to MANIFEST. + Original commit message from CVS: + * win32/MANIFEST: + Add libgstpng.dsp to MANIFEST. + * win32/vs6/libgstaudiofx.dsp: + Add new source files to VS project file. + +2008-02-12 13:34:52 +0000 Jan Schmidt + + sys/ximage/gstximagesrc.c: Initialise variables when opening the X display rather than in _start(), as the display ca... + Original commit message from CVS: + * sys/ximage/gstximagesrc.c: + Initialise variables when opening the X display rather + than in _start(), as the display can be opened before that. + Fixes: #515985 + +2008-02-12 12:22:48 +0000 Sebastian Dröge + + 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-02-12 11:38:54 +0000 Sebastian Dröge + + sys/v4l2/v4l2src_calls.c: Chain up the finalize functions. Fixes bug #515984. + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), + (gst_v4l2_buffer_class_init), (gst_v4l2_buffer_pool_finalize), + (gst_v4l2_buffer_pool_class_init): + Chain up the finalize functions. Fixes bug #515984. + +2008-02-12 11:14:36 +0000 Sebastian Dröge + + sys/ximage/ximageutil.c: Chain up in the finalize function for our custom buffer sub-class. + Original commit message from CVS: + * sys/ximage/ximageutil.c: + Chain up in the finalize function for our custom + buffer sub-class. + Patch by: Sebastian Dröge + Fixes: #515706 + +2008-02-12 11:12:43 +0000 Sebastian Dröge + + gst/debug/efence.c: Properly chain up finalize method. Fixes bug #515979. + Original commit message from CVS: + * gst/debug/efence.c: (gst_fenced_buffer_finalize), + (gst_fenced_buffer_class_init): + Properly chain up finalize method. Fixes bug #515979. + +2008-02-12 11:09:08 +0000 Jan Schmidt + + sys/ximage/gstximagesrc.c: Free allocated Damage memory before closing our connection to the + Original commit message from CVS: + * sys/ximage/gstximagesrc.c: + Free allocated Damage memory before closing our connection to the + X server. Fixes: #515706 + +2008-02-12 05:21:46 +0000 Sebastian Dröge + + tests/check/elements/souphttpsrc.c: Include glib/gprintf.h for g_vasprintf(). Fixes bug #515564. + Original commit message from CVS: + * tests/check/elements/souphttpsrc.c: + Include glib/gprintf.h for g_vasprintf(). Fixes bug #515564. + +2008-02-12 05:14:16 +0000 Sebastian Dröge + + Add a few libjpeg suppressions and initialize a variable to make smokeenc valgrind clean. Fixes bug #515701. + Original commit message from CVS: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): + * tests/check/Makefile.am: + * tests/check/gst-plugins-good.supp: + Add a few libjpeg suppressions and initialize a variable to + make smokeenc valgrind clean. Fixes bug #515701. + +2008-02-11 21:24:30 +0000 Jan Schmidt + + gst/avi/gstavidemux.c: Revert patch which sends timestamps only on keyframes, as it breaks playback with current gst-... + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Revert patch which sends timestamps only on keyframes, as it + breaks playback with current gst-ffmpeg. + Fixes: #515562 + +2008-02-11 14:01:52 +0000 Sebastian Dröge + + Close some memory leaks spotted by the unit test. Fixes bug #515697. + Original commit message from CVS: + * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): + * tests/check/elements/multifile.c: (GST_START_TEST): + Close some memory leaks spotted by the unit test. Fixes bug #515697. + +2008-02-11 13:48:03 +0000 Sebastian Dröge + + ext/gconf/gconf.c: Use and unset the GError when pipeline creation fails instead of simply leaking it. Fixes bug #515... + Original commit message from CVS: + * ext/gconf/gconf.c: (gst_gconf_render_bin_with_default): + Use and unset the GError when pipeline creation fails instead of + simply leaking it. Fixes bug #515704. + +2008-02-10 10:46:13 +0000 Sebastian Dröge + + gst/audiofx/: Fix long description of audiofx elements. Fixes bug #515457. + Original commit message from CVS: + * gst/audiofx/audioamplify.c: + * gst/audiofx/audiochebband.c: + * gst/audiofx/audiocheblimit.c: + * gst/audiofx/audiodynamic.c: + * gst/audiofx/audioinvert.c: + * gst/audiofx/audiopanorama.c: + * gst/audiofx/audiowsincband.c: + * gst/audiofx/audiowsinclimit.c: + Fix long description of audiofx elements. Fixes bug #515457. + +2008-02-09 01:45:32 +0000 Jan Schmidt + + Add a simple example application for the spectrum element, include it in the docs, and fix some documentation ambigui... + Original commit message from CVS: + * docs/plugins/Makefile.am: + * gst/spectrum/gstspectrum.c: + * tests/examples/spectrum/.cvsignore: + * tests/examples/spectrum/Makefile.am: + * tests/examples/spectrum/spectrum-example.c: + Add a simple example application for the spectrum element, include it + in the docs, and fix some documentation ambiguities. + Fixes: #348085 + +2008-02-09 00:15:25 +0000 Jan Schmidt + + gst/: Fix includes order + Original commit message from CVS: + * gst/equalizer/Makefile.am: + * gst/spectrum/Makefile.am: + Fix includes order + * tests/check/Makefile.am: + Exclude v4l2src from the states test - it takes too long to start. + * tests/check/elements/spectrum.c: + Make the test run properly with CK_FORK=no + +2008-02-08 15:32:36 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add 3 new plugins to spec file + Original commit message from CVS: + add 3 new plugins to spec file + +2008-02-08 15:27:51 +0000 Christian Schaller + + * ChangeLog: + * gst/audiofx/Makefile.am: + add missing header files for disting + Original commit message from CVS: + add missing header files for disting + +2008-02-08 15:20:31 +0000 Julien Moutte + + gst/matroska/matroska-demux.c: Flag keyframe and delta units correctly when dealign with a + Original commit message from CVS: + 2008-02-08 Julien Moutte + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup_or_simpleblock): Flag + keyframe and delta units correctly when dealign with a + BlockGroup. + Fixes: #514397 + +2008-02-08 10:19:33 +0000 Jan Schmidt + + tests/check/elements/.cvsignore: Spell the new tests correctly in .cvsignore + Original commit message from CVS: + * tests/check/elements/.cvsignore: + Spell the new tests correctly in .cvsignore + +2008-02-08 10:09:33 +0000 Tim-Philipp Müller + + gst/multifile/gstmultifilesrc.c: Need to use gsize here for the size, fixes compiler warning. + Original commit message from CVS: + * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): + Need to use gsize here for the size, fixes compiler warning. + * tests/examples/equalizer/.cvsignore: + * tests/examples/equalizer/Makefile.am: + * tests/examples/spectrum/.cvsignore: + * tests/examples/spectrum/Makefile.am: + Add missing files to fix the build. + +2008-02-08 04:25:32 +0000 Jan Schmidt + + Move multifile plugin from -bad. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-multifile.xml: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + Move multifile plugin from -bad. + Fixes: #490283 + +2008-02-08 03:44:12 +0000 David Schleef + + gst/multifile/: Use g_file_[sg]et_contents() instead of using stdio functions. + Original commit message from CVS: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + Use g_file_[sg]et_contents() instead of using stdio functions. + Should be less error prone. + * tests/check/elements/multifile.c: + Create a temporary directory using standard functions instead of + creating a directory in the current dir. + +2008-02-08 03:28:57 +0000 Jan Schmidt + + Move spectrum plugin from -bad. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-spectrum.xml: + * gst/spectrum/Makefile.am: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/examples/Makefile.am: + Move spectrum plugin from -bad. + Move examples into tests/examples/spectrum. + +2008-02-08 02:56:12 +0000 Jan Schmidt + + * ChangeLog: + Mention bug 415627 fixed with previous commit + Original commit message from CVS: + Mention bug 415627 fixed with previous commit + +2008-02-08 02:49:20 +0000 Jan Schmidt + + Move the equalizer plugin across from -bad + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/inspect/plugin-equalizer.xml: + * gst/equalizer/Makefile.am: + * tests/check/Makefile.am: + * tests/examples/Makefile.am: + Move the equalizer plugin across from -bad + * tests/check/elements/.cvsignore: + Add equalizer, audiosincwband and audiosincwlimit + * tests/check/elements/equalizer.c: + Fix compiler warnings + +2008-02-08 02:48:54 +0000 Jan Schmidt + + docs/plugins/gst-plugins-bad-plugins.*: Remove equalizer plugin docs + Original commit message from CVS: + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + Remove equalizer plugin docs + * tests/check/Makefile.am: + Add GST_OPTION_CFLAGS, to get -Werror -Wall into the tests as for + other modules. + * tests/check/elements/multifile.c: + * tests/check/elements/rganalysis.c: + * tests/check/elements/rglimiter.c: + Fix compiler warnings from -Wall -Werror + +2008-02-08 01:07:02 +0000 Jan Schmidt + + configure.ac: Only build with DISABLE_DEPRECATED during the CVS cycle. Pre-releases are treated like releases and bui... + Original commit message from CVS: + * configure.ac: + Only build with DISABLE_DEPRECATED during the CVS cycle. Pre-releases + are treated like releases and build without it. + +2008-02-07 21:57:54 +0000 Jan Schmidt + + Move the lpwsinc and bpwsinc elements from gst-plugins-bad into the audiofx plugin, and rename to audiowsinclimit and... + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-audiofx.xml: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofx.c: + * gst/audiofx/audiowsincband.c: + * gst/audiofx/audiowsincband.h: + * gst/audiofx/audiowsinclimit.c: + * gst/audiofx/audiowsinclimit.h: + * tests/check/Makefile.am: + * tests/check/elements/audiowsincband.c: + * tests/check/elements/audiowsinclimit.c: + Move the lpwsinc and bpwsinc elements from gst-plugins-bad into + the audiofx plugin, and rename to audiowsinclimit and audiowsincband + respectively. + Fixes: #467666 + +2008-02-07 21:17:36 +0000 Tim-Philipp Müller + + Return GST_FLOW_NOT_NEGOTIATED if we get a buffer without caps, and add a somewhat useful debug message. Plus test. + Original commit message from CVS: + * gst/icydemux/gsticydemux.c: (gst_icydemux_chain): + * tests/check/elements/icydemux.c: + Return GST_FLOW_NOT_NEGOTIATED if we get a buffer without + caps, and add a somewhat useful debug message. Plus test. + +2008-02-07 19:13:56 +0000 Sébastien Moutte + + gst/rtsp/gstrtspsrc.c: Include unistd.h only if HAVE_UNISTD_H is defined + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: + Include unistd.h only if HAVE_UNISTD_H is defined + * win32/common/config.h.in: + * win32/common/config.h: + Define socklen_t as it seems it's not defined in default + Visual Studio headers. + * win32/vs6/libgstalpha.dsp: + * win32/vs6/libgstapetag.dsp: + * win32/vs6/libgstavi.dsp: + * win32/vs6/libgstrtp.dsp: + * win32/vs6/libgstrtsp.dsp: + * win32/vs6/libgstvideomixer.dsp: + Update project file dependencies and add new source files + +2008-02-07 16:38:55 +0000 Bjarne Rosengren + + gst/matroska/ebml-write.c: Don't leak buffers when we don't push them downstream. + Original commit message from CVS: + Patch by: Bjarne Rosengren + * gst/matroska/ebml-write.c: (gst_ebml_write_element_push): + Don't leak buffers when we don't push them downstream. + Fixes bug #514965. + +2008-02-07 13:48:20 +0000 Stefan Kost + + gst/multifile/gstmultifilesink.c: Add a fixme comment. + Original commit message from CVS: + * gst/multifile/gstmultifilesink.c: + Add a fixme comment. + * gst/selector/gstoutputselector.c: + Fix same leak as in input-selector. + * tests/icles/output-selector-test.c: + Improve the test. + +2008-02-07 13:41:11 +0000 Stefan Kost + + gst/spectrum/gstspectrum.c: Improve the docs. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: + Improve the docs. + +2008-02-07 10:17:14 +0000 Tim-Philipp Müller + + configure.ac: Bump requirements to (good) released versions to avoid confusion and make implicit core requirement exp... + Original commit message from CVS: + * configure.ac: + Bump requirements to (good) released versions to avoid + confusion and make implicit core requirement explicit. + +2008-02-07 10:04:01 +0000 Sebastian Dröge + + gst/filter/gstlpwsinc.c: Fix typo in the long description of the element. + Original commit message from CVS: + * gst/filter/gstlpwsinc.c: + Fix typo in the long description of the element. + +2008-02-06 23:44:43 +0000 Jan Schmidt + + Rename audiochebyshevfreqband -> audiochebband and audiochebyshevfreqlimit -> audiocheblimit and do the requisite CVS... + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-audiofx.xml: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiochebband.c: + * gst/audiofx/audiochebband.h: + * gst/audiofx/audiocheblimit.c: + * gst/audiofx/audiocheblimit.h: + * gst/audiofx/audiochebyshevfreqband.c: + * gst/audiofx/audiochebyshevfreqband.h: + * gst/audiofx/audiochebyshevfreqlimit.c: + * gst/audiofx/audiochebyshevfreqlimit.h: + * gst/audiofx/audiofx.c: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/audiochebband.c: + * tests/check/elements/audiocheblimit.c: + * tests/check/elements/audiochebyshevfreqband.c: + * tests/check/elements/audiochebyshevfreqlimit.c: + Rename audiochebyshevfreqband -> audiochebband and + audiochebyshevfreqlimit -> audiocheblimit and do the requisite CVS + surgery. + Closes: #491811 + +2008-02-06 11:07:47 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.c: Fix memory leak and improve debugging a bit. + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_chunk_cb), + (gst_soup_http_src_create): + Fix memory leak and improve debugging a bit. + +2008-02-05 17:59:24 +0000 orjan + + gst/multipart/multipartmux.c: Fix caps memory leak. Fixes #514573. + Original commit message from CVS: + Patch by: orjan + * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): + Fix caps memory leak. Fixes #514573. + +2008-02-04 12:07:14 +0000 Edward Hervey + + gst/avi/gstavidemux.c: If there's no entries in the subindex, don't try to do anything stupid, just return. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex): + If there's no entries in the subindex, don't try to do anything stupid, + just return. + +2008-02-02 19:47:50 +0000 John Millikin + + ext/flac/gstflacdec.c: Fix extraction of picture blocks with newer libflac versions again: + Original commit message from CVS: + Patch by: John Millikin + * ext/flac/gstflacdec.c: (gst_flac_dec_scan_for_last_block), + (gst_flac_extract_picture_buffer), (gst_flac_dec_metadata_callback): + Fix extraction of picture blocks with newer libflac versions again: + FLAC__METADATA_TYPE_PICTURE is an enum, not a define (#513628). + +2008-02-02 18:06:19 +0000 Tim-Philipp Müller + + tests/check/Makefile.am: Add rtp-payloading test to VALGRIND_TO_FIX. + Original commit message from CVS: + * tests/check/Makefile.am: + Add rtp-payloading test to VALGRIND_TO_FIX. + * tests/check/elements/rtp-payloading.c: + Add semicolons after GST_TEST_END so gst-indent gets the + formatting right; make test less verbose in general, but + more verbose in the error case (which should probably + make the test fail anyway). + +2008-02-01 18:29:21 +0000 Thijs Vermeir + + Add documentation for avisubtitle and change class to + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/avi/gstavisubtitle.c: + Add documentation for avisubtitle and change class to + Codec/Parser/Subtitle + +2008-01-31 16:12:28 +0000 Jan Schmidt + + sys/v4l2/v4l2_calls.c: Treat ENOTTY (driver does not implement ioctl) the same as + Original commit message from CVS: + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + Treat ENOTTY (driver does not implement ioctl) the same as + EINVAL since it implies there are no available standards. + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format), + (gst_v4l2src_get_nearest_size): + Replace gst_v4l2src_get_size_limits with 2 calls to new function + gst_v4l2src_get_nearest_size, and get it to use VIDIOC_S_FMT to + probe if the driver does not support VIDIOC_TRY_FMT for whatever + reason, and if we aren't yet actively capturing. + * sys/v4l2/v4l2src_calls.h: + Remove replaced function declaration. + +2008-01-31 16:03:48 +0000 Jan Schmidt + + configure.ac: Bump plugins-base requirement to 0.10.16 for the gst_video_format_* + Original commit message from CVS: + * configure.ac: + Bump plugins-base requirement to 0.10.16 for the gst_video_format_* + API. + +2008-01-31 09:50:31 +0000 Sebastian Dröge + + ext/soup/gstsouphttpsrc.c: Add changes to gstsouphttpsrc.c that were missing from last commit. + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: (_do_init), + (gst_soup_http_src_base_init), (gst_soup_http_src_class_init), + (gst_soup_http_src_init), (gst_soup_http_src_dispose), + (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), + (gst_soup_http_src_unicodify), (gst_soup_http_src_cancel_message), + (gst_soup_http_src_queue_message), + (gst_soup_http_src_add_range_header), + (gst_soup_http_src_session_unpause_message), + (gst_soup_http_src_session_pause_message), + (gst_soup_http_src_session_close), + (gst_soup_http_src_got_headers_cb), + (gst_soup_http_src_got_body_cb), (gst_soup_http_src_finished_cb), + (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_response_cb), + (gst_soup_http_src_parse_status), (gst_soup_http_src_create), + (gst_soup_http_src_start), (gst_soup_http_src_stop), + (gst_soup_http_src_unlock), (gst_soup_http_src_unlock_stop), + (gst_soup_http_src_get_size), (gst_soup_http_src_is_seekable), + (gst_soup_http_src_do_seek), (gst_soup_http_src_set_location), + (gst_soup_http_src_set_proxy), (gst_soup_http_src_uri_get_type), + (gst_soup_http_src_uri_get_protocols), + (gst_soup_http_src_uri_get_uri), (gst_soup_http_src_uri_set_uri), + (gst_soup_http_src_uri_handler_init), (plugin_init): + Add changes to gstsouphttpsrc.c that were missing from last commit. + +2008-01-31 08:57:16 +0000 Wouter Cloetens + + Make coding style more consistent, including class renaming. + Original commit message from CVS: + Patch by: Wouter Cloetens + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + * docs/plugins/inspect/plugin-soup.xml: + (gst_soup_http_src_base_init), (gst_soup_http_src_class_init), + (gst_soup_http_src_init), (gst_soup_http_src_dispose), + (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), + (gst_soup_http_src_unicodify), (gst_soup_http_src_cancel_message), + (gst_soup_http_src_queue_message), + (gst_soup_http_src_add_range_header), + (gst_soup_http_src_session_unpause_message), + (gst_soup_http_src_session_pause_message), + (gst_soup_http_src_session_close), + (gst_soup_http_src_got_headers_cb), + (gst_soup_http_src_got_body_cb), (gst_soup_http_src_finished_cb), + (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_response_cb), + (gst_soup_http_src_parse_status), (gst_soup_http_src_create), + (gst_soup_http_src_start), (gst_soup_http_src_stop), + (gst_soup_http_src_unlock), (gst_soup_http_src_unlock_stop), + (gst_soup_http_src_get_size), (gst_soup_http_src_is_seekable), + (gst_soup_http_src_do_seek), (gst_soup_http_src_set_location), + (gst_soup_http_src_set_proxy), (gst_soup_http_src_uri_get_type), + (gst_soup_http_src_uri_get_protocols), + (gst_soup_http_src_uri_get_uri), (gst_soup_http_src_uri_set_uri), + (gst_soup_http_src_uri_handler_init), (plugin_init): + * ext/soup/gstsouphttpsrc.h: + Make coding style more consistent, including class renaming. + +2008-01-31 00:03:26 +0000 Jan Schmidt + + configure.ac: Fix typo. + Original commit message from CVS: + * configure.ac: + Fix typo. + +2008-01-31 00:00:23 +0000 Jan Schmidt + + gst/alpha/: Re-write the 'alpha' plugin to be BaseTransform based, simplifying some stuff, and making buffer-alloc an... + Original commit message from CVS: + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: + Re-write the 'alpha' plugin to be BaseTransform based, simplifying + some stuff, and making buffer-alloc and resizing work automatically. + No longer crashes on odd frame widths and heights, although there + seems to be a disagreement with ffmpegcolorspace about what size + an AYUV frame with odd height should be. + +2008-01-30 15:40:36 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.c: Update documentation a bit. + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: + Update documentation a bit. + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + * docs/plugins/gst-plugins-bad-plugins.prerequisites: + * docs/plugins/inspect/plugin-alsaspdif.xml: + * docs/plugins/inspect/plugin-dvb.xml: + * docs/plugins/inspect/plugin-filter.xml: + * docs/plugins/inspect/plugin-glimagesink.xml: + * docs/plugins/inspect/plugin-mpegvideoparse.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rawparse.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-sdl.xml: + * docs/plugins/inspect/plugin-soundtouch.xml: + * docs/plugins/inspect/plugin-soup.xml: + * docs/plugins/inspect/plugin-spcdec.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speed.xml: + * docs/plugins/inspect/plugin-speexresample.xml: + * docs/plugins/inspect/plugin-switch.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + Regenerate everything for the documentation changes we had. + +2008-01-30 13:29:15 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.c: Let the proxy property default to the content of the $http_proxy environment variable. + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_init): + Let the proxy property default to the content of the $http_proxy + environment variable. + +2008-01-30 13:08:45 +0000 Wouter Cloetens + + tests/check/: Add missing files for the unit test. + Original commit message from CVS: + Patch by: Wouter Cloetens + * tests/check/test-cert.pem: + * tests/check/test-key.pem: + Add missing files for the unit test. + +2008-01-30 13:06:01 +0000 Wouter Cloetens + + docs/plugins/: Add souphttpsrc to the docs. + Original commit message from CVS: + Patch by: Wouter Cloetens + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + Add souphttpsrc to the docs. + * configure.ac: + * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), + (gst_souphttp_src_init), (gst_souphttp_src_dispose), + (gst_souphttp_src_set_property), (gst_souphttp_src_get_property), + (gst_souphttp_src_cancel_message), + (gst_souphttp_src_queue_message), + (gst_souphttp_src_add_range_header), + (gst_souphttp_src_session_unpause_message), + (gst_souphttp_src_session_pause_message), + (gst_souphttp_src_session_close), + (gst_souphttp_src_got_headers_cb), (gst_souphttp_src_got_body_cb), + (gst_souphttp_src_finished_cb), (gst_souphttp_src_got_chunk_cb), + (gst_souphttp_src_response_cb), (gst_souphttp_src_parse_status), + (gst_souphttp_src_create), (gst_souphttp_src_start), + (gst_souphttp_src_stop), (gst_souphttp_src_unlock), + (gst_souphttp_src_unlock_stop), (gst_souphttp_src_get_size), + (gst_souphttp_src_is_seekable), (gst_souphttp_src_do_seek), + (gst_souphttp_src_set_location), (gst_souphttp_src_set_proxy), + (plugin_init): + * ext/soup/gstsouphttpsrc.h: + Add support for libsoup2.4 and require it. Also implement redirection + and manual proxy specification. Fixes bug #510708. + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/souphttpsrc.c: + Add unit test for souphttpsrc. + +2008-01-29 18:43:32 +0000 Alessandro Decina + + ext/libpng/gstpngenc.*: Preallocate the output buffer so that g_memdup() and gst_buffer_merge() aren't needed anymore... + Original commit message from CVS: + Patch by: Alessandro Decina + * ext/libpng/gstpngenc.c: (user_write_data), (gst_pngenc_chain): + * ext/libpng/gstpngenc.h: + Preallocate the output buffer so that g_memdup() and + gst_buffer_merge() aren't needed anymore. This greatly improves + performances and fixes #512544. + +2008-01-29 18:24:28 +0000 Wim Taymans + + gst/avi/gstavidemux.c: GStreamer timestamps are PTS values while AVI only knows about DTS timestamps. Make sure we on... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data): + GStreamer timestamps are PTS values while AVI only knows about DTS + timestamps. Make sure we only copy the DTS as the buffer timestamp when + we are dealing with a key frame. + +2008-01-29 15:45:48 +0000 Stefan Kost + + tests/check/: Add add testsuite for the rtp-payloader that tries simulating dataflow. Needs more test data. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/rtp-payloading.c: + Add add testsuite for the rtp-payloader that tries simulating + dataflow. Needs more test data. + +2008-01-29 15:27:02 +0000 Stefan Kost + + tests/check/elements/alphacolor.c: Remove two unused variables. + Original commit message from CVS: + * tests/check/elements/alphacolor.c: + Remove two unused variables. + +2008-01-28 12:17:02 +0000 Tim-Philipp Müller + + gst/rtsp/gstrtspsrc.c: Use g_ascii_strtoll() instead of atoll, which is only available in C99. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpinfo): + Use g_ascii_strtoll() instead of atoll, which is only + available in C99. + +2008-01-26 16:19:26 +0000 Sebastian Dröge + + gst/filter/: Don't implement get_unit_size() ourselves, the GstAudioFilter base class already does this for us. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): + Don't implement get_unit_size() ourselves, the GstAudioFilter base + class already does this for us. + +2008-01-25 10:53:17 +0000 Thijs Vermeir + + gst/rtp/: Add MPEG2 video payloader + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpmpvpay.c: + * gst/rtp/gstrtpmpvpay.h: + Add MPEG2 video payloader + +2008-01-23 17:05:32 +0000 Sebastian Dröge + + gst/level/gstlevel.c: Use #include instead of #include "math.h". + Original commit message from CVS: + * gst/level/gstlevel.c: + Use #include instead of #include "math.h". + +2008-01-21 19:41:45 +0000 Jan Schmidt + + tests/check/Makefile.am: Fix up some CFLAGS sets. + Original commit message from CVS: + * tests/check/Makefile.am: + Fix up some CFLAGS sets. + Don't include gconfvideosrc in the states test. + * tests/check/elements/autodetect.c: (GST_START_TEST): + Add some error strings to fail_unless arguments to fix some weird + compiler errors on Solaris. + +2008-01-21 19:35:58 +0000 Brian Cameron + + configure.ac: Detect video4linux headers on Solaris too. + Original commit message from CVS: + * configure.ac: + Detect video4linux headers on Solaris too. + * sys/v4l2/gstv4l2colorbalance.h: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), + (gst_v4l2_buffer_new): + Make v4l2 build on Solaris. + Patch by: Brian Cameron + Fixes: #510505 + +2008-01-21 11:46:19 +0000 Stefan Kost + + docs/plugins/gst-plugins-good-plugins-docs.sgml: Update list from (still local) scanning script. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + Update list from (still local) scanning script. + +2008-01-21 09:57:07 +0000 Stefan Kost + + docs/plugins/: Add symbols from -unused.txt to the right place. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + Add symbols from -unused.txt to the right place. + * gst/dvdspu/gstdvdspu.c: + * gst/dvdspu/gstdvdspu.h: + Coherent namespace usage. + * gst/spectrum/gstspectrum.c: + Fix broken XML fragment in doc snippet even more. + +2008-01-21 07:54:02 +0000 Stefan Kost + + docs/plugins/Makefile.am: Update include list. + Original commit message from CVS: + * docs/plugins/Makefile.am: + Update include list. + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + Update xml includes. + * docs/plugins/inspect/plugin-alsaspdif.xml: + * docs/plugins/inspect/plugin-amrwb.xml: + * docs/plugins/inspect/plugin-bayer.xml: + * docs/plugins/inspect/plugin-bz2.xml: + * docs/plugins/inspect/plugin-cdxaparse.xml: + * docs/plugins/inspect/plugin-dtsdec.xml: + * docs/plugins/inspect/plugin-dvbsrc.xml: + * docs/plugins/inspect/plugin-dvdspu.xml: + * docs/plugins/inspect/plugin-equalizer.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-filter.xml: + * docs/plugins/inspect/plugin-flvdemux.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-h264parse.xml: + * docs/plugins/inspect/plugin-interleave.xml: + * docs/plugins/inspect/plugin-ladspa.xml: + * docs/plugins/inspect/plugin-metadata.xml: + * docs/plugins/inspect/plugin-modplug.xml: + * docs/plugins/inspect/plugin-mpeg4videoparse.xml: + * docs/plugins/inspect/plugin-mpegtsparse.xml: + * docs/plugins/inspect/plugin-mpegvideoparse.xml: + * docs/plugins/inspect/plugin-musicbrainz.xml: + * docs/plugins/inspect/plugin-mve.xml: + * docs/plugins/inspect/plugin-nsfdec.xml: + * docs/plugins/inspect/plugin-nuvdemux.xml: + * docs/plugins/inspect/plugin-qtdemux.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-real.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-sdl.xml: + * docs/plugins/inspect/plugin-sdp.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speed.xml: + * docs/plugins/inspect/plugin-speexresample.xml: + * docs/plugins/inspect/plugin-stereo.xml: + * docs/plugins/inspect/plugin-switch.xml: + * docs/plugins/inspect/plugin-timidity.xml: + * docs/plugins/inspect/plugin-tta.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoparse.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-xingheader.xml: + * docs/plugins/inspect/plugin-xvid.xml: + * docs/plugins/inspect/plugin-y4menc.xml: + Regenerate files. + * gst/spectrum/gstspectrum.c: + Fix broken XML fragment in doc snippet. + * tests/check/elements/.cvsignore: + Add test binary to ignores. + +2008-01-20 05:07:52 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.c: Report the size of the stream as the total size instead of the remaining Content-Length, w... + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: (soup_got_headers): + Report the size of the stream as the total size instead of + the remaining Content-Length, which is wrong after a seek. + +2008-01-19 14:59:08 +0000 Sebastian Dröge + + * ChangeLog: + Add bug number to the latest entry + Original commit message from CVS: + Add bug number to the latest entry + +2008-01-19 14:53:58 +0000 Sebastian Dröge + + gst/wavparse/gstwavparse.c: Set variable to NULL after freeing it to prevent double frees or make failures by another... + Original commit message from CVS: + Based on a patch by: + Victor STINNER + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + Set variable to NULL after freeing it to prevent double frees + or make failures by another use of it afterwards more obvious + and fix use of it after the freeing. + +2008-01-19 14:34:50 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.c: Correctly set duration on the GstBaseSrc segment when we know it to fix failing the durati... + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: (soup_got_headers): + Correctly set duration on the GstBaseSrc segment when we know it + to fix failing the duration query. + +2008-01-18 13:40:38 +0000 Thijs Vermeir + + gst/udp/gstmultiudpsink.c: use GST_WARNING for logging + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: + use GST_WARNING for logging + +2008-01-18 10:05:53 +0000 Sebastian Dröge + + gst/multifile/gstmultifilesrc.c: Fix memory leak spotted by the unit test. + Original commit message from CVS: + * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): + Fix memory leak spotted by the unit test. + +2008-01-18 10:04:25 +0000 Thijs Vermeir + + gst/udp/gstmultiudpsink.c: Don't try to leave a multicast group with an invalid socket + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: + Don't try to leave a multicast group with an invalid socket + +2008-01-18 08:49:59 +0000 Sebastian Dröge + + tests/check/: Add some minimal tests for the equalizer plugin. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/equalizer.c: (setup_equalizer), + (cleanup_equalizer), (GST_START_TEST), (equalizer_suite), (main): + Add some minimal tests for the equalizer plugin. + +2008-01-18 07:03:23 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.c: Unparent all bands from the equalizer when finalizing to stop leaking them. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_finalize): + Unparent all bands from the equalizer when finalizing to stop + leaking them. + +2008-01-18 05:32:26 +0000 Sebastian Dröge + + ext/soup/gstsouphttpsrc.c: Add support for WebDAV. + Original commit message from CVS: + * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_uri_get_protocols): + Add support for WebDAV. + +2008-01-18 05:24:39 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.*: Add support for seeking to souphttpsrc. Fixes bug #502335. + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), + (gst_souphttp_src_init), (gst_souphttp_src_create), + (gst_souphttp_src_is_seekable), (gst_souphttp_src_do_seek), + (soup_add_range_header), (soup_got_headers), (soup_got_chunk): + * ext/soup/gstsouphttpsrc.h: + Add support for seeking to souphttpsrc. Fixes bug #502335. + +2008-01-17 21:23:32 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.c: where the picture metadata defines and structs don't exist yet. + Original commit message from CVS: + * ext/flac/gstflacdec.c: + Fix compilation against flac 1.1.2 (as on debian stable), where + the picture metadata defines and structs don't exist yet. + Fixes #509301. + +2008-01-17 11:13:16 +0000 Olivier Crete + + gst/udp/gstmultiudpsink.*: Add property to automatically join a multicast group or not. This can be useful when shari... + Original commit message from CVS: + Patch by: Olivier Crete + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_set_property), + (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), + (gst_multiudpsink_add_internal), (gst_multiudpsink_remove): + * gst/udp/gstmultiudpsink.h: + Add property to automatically join a multicast group or not. This can be + useful when sharing a socket between multiple elements. + Fixes #509531. + +2008-01-16 21:53:41 +0000 Stefan Kost + + gst/videomixer/Makefile.am: Add controller flags. + Original commit message from CVS: + * gst/videomixer/Makefile.am: + Add controller flags. + +2008-01-16 20:17:08 +0000 Stefan Kost + + gst/videomixer/videomixer.c: Also commit the missing gst_object_sync_values(). + Original commit message from CVS: + * gst/videomixer/videomixer.c: + Also commit the missing gst_object_sync_values(). + +2008-01-16 08:11:46 +0000 Stefan Kost + + docs/plugins/Makefile.am: Remove duplicate entry. + Original commit message from CVS: + * docs/plugins/Makefile.am: + Remove duplicate entry. + +2008-01-15 16:52:10 +0000 Stefan Kost + + docs/plugins/: Add 3 more plugins to docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-gamma.xml: + * docs/plugins/inspect/plugin-monoscope.xml: + * docs/plugins/inspect/plugin-video4linux2.xml: + Add 3 more plugins to docs. + +2008-01-15 16:04:44 +0000 Stefan Kost + + Revert previous change caused by a file that got stuck on an old revision. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * sys/osxvideo/osxvideosink.h: + Revert previous change caused by a file that got stuck on an old + revision. + +2008-01-15 15:40:58 +0000 Stefan Kost + + Re-add multipartdemux to the docs. Last round of section cleanup. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/multipart/Makefile.am: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartdemux.h: + * gst/multipart/multipartmux.c: + * gst/multipart/multipartmux.h: + Re-add multipartdemux to the docs. Last round of section cleanup. + +2008-01-15 15:22:41 +0000 Stefan Kost + + Managed to resolve most unused declarations. Filed a bug for one left. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * sys/osxaudio/gstosxaudiosink.h: + * sys/osxvideo/osxvideosink.h: + Managed to resolve most unused declarations. Filed a bug for one left. + +2008-01-15 08:03:49 +0000 Stefan Kost + + docs/plugins/gst-plugins-good-plugins-sections.txt: Cleanup section file. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + Cleanup section file. + +2008-01-15 07:42:51 +0000 Stefan Kost + + docs/plugins/: Update plugin docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-ladspa.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + Update plugin docs. + * gst/videomixer/Makefile.am: + * gst/videomixer/videomixer.c: + * gst/videomixer/videomixer.h: + * gst/videomixer/videomixerpad.h: + Split out header to fix warnings from the doc-build. + +2008-01-14 12:35:23 +0000 Wim Taymans + + As found by: Tommi Myöhänen + Original commit message from CVS: + As found by: Tommi Myöhänen + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpinfo): + Use atoll to parse the rtptime with enough precision. Fixes #509329. + +2008-01-14 12:11:43 +0000 Tim-Philipp Müller + + gst/: Initialise variables to work around (false) 'foo might be used uninitialized in this function' warnings by gcc-... + Original commit message from CVS: + * gst/avi/gstavisubtitle.c: (gst_avi_subtitle_extract_file): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send): + Initialise variables to work around (false) 'foo might be used + uninitialized in this function' warnings by gcc-3.3.3 (#509298). + +2008-01-12 02:32:35 +0000 David Schleef + + Ignore more files for the buildbot. + Original commit message from CVS: + * docs/plugins/.cvsignore: + * tests/check/pipelines/.cvsignore: + Ignore more files for the buildbot. + +2008-01-11 21:08:59 +0000 Jan Schmidt + + Generate the image-type values correctly. Leave them out of the caps when outputting a "preview image" tag, since it ... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_extract_picture_buffer): + * gst/id3demux/id3v2frames.c: (parse_picture_frame): + Generate the image-type values correctly. Leave them out of the caps + when outputting a "preview image" tag, since it only makes sense + to have one of those - the type is irrelevant. + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_open): + If we can, mark the mixer multiple open when we use it, in case + (for some reason) the process wants to open it again elsewhere. + +2008-01-11 19:16:53 +0000 Tim-Philipp Müller + + tests/check/elements/: It's "endianness", not "endianess". Fixes unit tests. + Original commit message from CVS: + * tests/check/elements/rganalysis.c: (test_buffer_const_float_mono), + (test_buffer_const_float_stereo), (test_buffer_const_int16_mono), + (test_buffer_const_int16_stereo), (test_buffer_square_float_mono), + (test_buffer_square_float_stereo), (test_buffer_square_int16_mono), + (test_buffer_square_int16_stereo): + * tests/check/elements/rglimiter.c: (create_test_buffer): + * tests/check/elements/rgvolume.c: (test_buffer_new): + It's "endianness", not "endianess". Fixes unit tests. + +2008-01-11 18:56:06 +0000 Edward Hervey + + * tests/check/pipelines/.cvignore: + ignore some more + Original commit message from CVS: + ignore some more + +2008-01-11 18:54:31 +0000 Edward Hervey + + * tests/check/elements/.gitignore: + ignore some more + Original commit message from CVS: + ignore some more + +2008-01-11 17:21:30 +0000 Olivier Crete + + gst/rtp/: Fix the clock rate to 90000 as required by the RFC. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps): + * gst/rtp/gstrtptheorapay.c: + Fix the clock rate to 90000 as required by the RFC. + Fixes #508644. + +2008-01-11 17:12:37 +0000 Tim-Philipp Müller + + tests/check/elements/icydemux.c: Don't use deprecated GST_PLUGIN_DEFINE_STATIC. + Original commit message from CVS: + * tests/check/elements/icydemux.c: (GST_START_TEST), (icydemux_suite): + Don't use deprecated GST_PLUGIN_DEFINE_STATIC. + +2008-01-10 12:25:44 +0000 Sebastian Dröge + + autogen.sh: Add -Wno-portability to the automake parameters to stop warnings about GNU make extensions being used. We... + Original commit message from CVS: + * autogen.sh: + Add -Wno-portability to the automake parameters to stop warnings + about GNU make extensions being used. We require GNU make in almost + every Makefile anyway. + * configure.ac: + Use AM_PROG_CC_C_O as a compiler that accepts both -c and -o + at the same time is required for per target flags. + +2008-01-09 15:28:29 +0000 Edward Hervey + + gst/videomixer/videomixer.c: Fix error from my last commit. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_init): + Fix error from my last commit. + +2008-01-09 15:20:19 +0000 Tommi Myöhänen + + gst/id3demux/id3v2frames.c: Make sure the ISO 639-X language code in ID3v2 COMM frames so we don't end up with non-UT... + Original commit message from CVS: + Based on patch by: Tommi Myöhänen + * gst/id3demux/id3v2frames.c: (parse_comment_frame): + Make sure the ISO 639-X language code in ID3v2 COMM frames + is actually valid UTF-8 (or rather: ASCII), so we don't end + up with non-UTF8 strings in tags if there's garbage in the + language field. Also make sure the language code is always + lower case. Fixes: #508291. + +2008-01-09 13:55:28 +0000 Stefan Kost + + ChangeLog: Fix ChangeLog typo. + Original commit message from CVS: + * ChangeLog: + Fix ChangeLog typo. + +2008-01-09 13:50:09 +0000 Stefan Kost + + Makefile.am: Include lcov.mak to allow builging coverage reports. Guard check-torture target like in the other packages. + Original commit message from CVS: + * Makefile.am: + Include lcov.mak to allow builging coverage reports. Guard + check-torture target like in the other packages. + +2008-01-09 12:33:58 +0000 Edward Hervey + + gst/videomixer/videomixer.c: Implement GstChildProxy interface. + Original commit message from CVS: + reviewed by: Edward Hervey + * gst/videomixer/videomixer.c: + (gst_videomixer_set_master_geometry), (_do_init), + (gst_videomixer_child_proxy_get_child_by_index), + (gst_videomixer_child_proxy_get_children_count), + (gst_videomixer_child_proxy_init), (gst_videomixer_reset), + (gst_videomixer_init), (gst_videomixer_request_new_pad), + (gst_videomixer_release_pad), (gst_videomixer_fill_queues): + Implement GstChildProxy interface. + Send newsegment at the right moment + Fixes #488879 + +2008-01-09 12:01:14 +0000 Edward Hervey + + gst/alpha/: Make the various properties of 'alpha' controllable. This allows doing niceties like fade-in/fade-out. + Original commit message from CVS: + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: (gst_alpha_class_init), (gst_alpha_init), + (gst_alpha_sink_event), (gst_alpha_chain), + (gst_alpha_change_state), (plugin_init): + Make the various properties of 'alpha' controllable. This allows doing + niceties like fade-in/fade-out. + +2008-01-09 11:11:01 +0000 Stefan Kost + + gst/rtp/: Remove copy/paste unused code (property setters and getter) found by the coverage suite (yay, saves ~20k on... + Original commit message from CVS: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpac3depay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtph263depay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + Remove copy/paste unused code (property setters and getter) found by + the coverage suite (yay, saves ~20k on disk). + +2008-01-08 20:03:30 +0000 Tim-Philipp Müller + + gst/matroska/matroska-mux.c: Also fix up pad templates to indicate that image/jpeg doesn't absolutely require the fra... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (COMMON_VIDEO_CAPS_NO_FRAMERATE), + (videosink_templ): + Also fix up pad templates to indicate that image/jpeg doesn't + absolutely require the framerate property to be set (#504081). + +2008-01-08 19:57:23 +0000 Wouter Cloetens + + gst/matroska/matroska-mux.*: Keep track of first and last timestamps for each incoming stream, so we can calculate th... + Original commit message from CVS: + Based on patch by: Wouter Cloetens + * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps), + (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad), + (gst_matroska_mux_finish), (gst_matroska_mux_collected): + * gst/matroska/matroska-mux.h: + Keep track of first and last timestamps for each incoming stream, + so we can calculate the total duration for live sources and other + input where we can't query the duration from the start or where + there's no constant framerate from which we can deduce the + duration; also use calculated/observed duration if it is bigger + than the previously queried duration. Furthermore, use + gst_pad_query_peer_duration() and take into account that it may + return TRUE but still a duration of CLOCK_TIME_NONE, which easily + screws up comparisons when using unsigned integers. Fixes #504081. + +2008-01-08 14:58:18 +0000 Sebastian Dröge + + Make elements GST_BUFFER_FLAG_GAP aware and call gst_base_transform_set_gap_aware for this. + Original commit message from CVS: + * configure.ac: + * gst/audiofx/audioamplify.c: + (gst_audio_amplify_clipping_method_get_type), + (gst_audio_amplify_init), (gst_audio_amplify_transform_ip): + * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_init), + (gst_audio_dynamic_transform_ip): + * gst/audiofx/audioinvert.c: (gst_audio_invert_init), + (gst_audio_invert_transform_ip): + * gst/audiofx/audiopanorama.c: (gst_audio_panorama_init), + (gst_audio_panorama_transform): + * gst/level/gstlevel.c: (gst_level_init): + Make elements GST_BUFFER_FLAG_GAP aware and call + gst_base_transform_set_gap_aware for this. + Bump core requirement to CVS. + * gst/audiofx/audiochebyshevfreqband.c: + (gst_audio_chebyshev_freq_band_transform_ip): + * gst/audiofx/audiochebyshevfreqlimit.c: + (gst_audio_chebyshev_freq_limit_transform_ip): + Also sync GObject properties to the controller if operating + in passthrough mode. + +2008-01-07 16:41:00 +0000 Tim-Philipp Müller + + 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 + + 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 + * 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. + +2008-01-04 18:30:21 +0000 Sebastian Dröge + + ext/taglib/: Remove useless typedefs without new type name. Fixes a warning with gcc 4.3. + Original commit message from CVS: + * ext/taglib/gstapev2mux.h: + * ext/taglib/gstid3v2mux.h: + Remove useless typedefs without new type name. Fixes a warning with + gcc 4.3. + +2008-01-03 12:26:03 +0000 John Millikin + + ext/flac/gstflacdec.c: Emit metadata messages when a PICTURE block is encountered. + Original commit message from CVS: + Patch by: John Millikin + * ext/flac/gstflacdec.c: (gst_flac_dec_setup_seekable_decoder), + (gst_flac_dec_setup_stream_decoder), + (gst_flac_normalize_picture_mime_type), + (gst_flac_extract_picture_buffer), + (gst_flac_dec_metadata_callback): + Emit metadata messages when a PICTURE block is encountered. + Fixes #506715. + +2008-01-02 13:54:10 +0000 Thijs Vermeir + + gst/avi/gstavi.c: increase rank because no known issues anymore ... + Original commit message from CVS: + * gst/avi/gstavi.c: + increase rank because no known issues anymore ... + * gst/avi/gstavisubtitle.c: + send subtitle name to the srcpad + +2007-12-31 13:27:32 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Implement redirect for the DESCRIBE reply. Fixes #506025. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open): + * gst/rtsp/gstrtspsrc.h: + Implement redirect for the DESCRIBE reply. Fixes #506025. + +2007-12-29 16:48:33 +0000 Sebastian Dröge + + ext/flac/gstflacdec.c: Fix 'xyz may be used uninitialized' compiler warnings caused by broken g_assert_not_reached() ... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_write): + Fix 'xyz may be used uninitialized' compiler warnings caused + by broken g_assert_not_reached() macro in GLib-2.15.x and don't + abort() in any case but properly report the error. + +2007-12-28 11:44:28 +0000 Tim-Philipp Müller + + ext/soup/: Use gst_tag_freeform_string_to_utf8() and post radio station info as tags on the bus. + Original commit message from CVS: + * ext/soup/Makefile.am: + * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_get_property), + (gst_souphttp_src_unicodify), (soup_got_headers): + Use gst_tag_freeform_string_to_utf8() and post radio station + info as tags on the bus. + +2007-12-26 16:03:57 +0000 Tim-Philipp Müller + + Fix 'xyz may be used uninitialized' compiler warnings caused by broken g_assert_not_reached() macro in GLib-2.15.x (i... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_loop): + * gst/wavparse/gstwavparse.c: (gst_wavparse_chain): + * sys/ximage/gstximagesrc.c: (composite_pixel): + Fix 'xyz may be used uninitialized' compiler warnings caused + by broken g_assert_not_reached() macro in GLib-2.15.x (it's + not really nice to abort in any case). Fixes #505745. + +2007-12-20 17:07:22 +0000 Tim-Philipp Müller + + gst/: Ignore more. + Original commit message from CVS: + * gst/equalizer/.cvsignore: + * gst/switch/.cvsignore: + Ignore more. + +2007-12-18 23:17:14 +0000 Tim-Philipp Müller + + tests/check/elements/avisubtitle.c: Small unit test fix (has no practical impact at the moment, since we're only feed... + Original commit message from CVS: + * tests/check/elements/avisubtitle.c: (check_correct_buffer): + Small unit test fix (has no practical impact at the moment, + since we're only feeding utf8 and hence just create a sub- + buffer for the output). + +2007-12-18 21:13:05 +0000 Thijs Vermeir + + Add seeking support for avi subtitle + Original commit message from CVS: + * gst/avi/gstavisubtitle.c: + * tests/check/elements/avisubtitle.c: + Add seeking support for avi subtitle + +2007-12-18 17:40:34 +0000 Wim Taymans + + ext/flac/gstflacdec.*: Remove some unused vars. + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_reset_decoders), + (gst_flac_dec_update_metadata), (gst_flac_dec_metadata_callback), + (gst_flac_dec_write): + * ext/flac/gstflacdec.h: + Remove some unused vars. + Do more cleanup of leftover events and tags. + Output tags after the segment event. Fixes #504018. + +2007-12-18 14:31:36 +0000 Tim-Philipp Müller + + gst/avi/gstavisubtitle.c: Detect other UTF byte order markers and convert to UTF-8 as appropriate. + Original commit message from CVS: + * gst/avi/gstavisubtitle.c: (IS_BOM_UTF8), (IS_BOM_UTF16_BE), + (IS_BOM_UTF16_LE), (IS_BOM_UTF32_BE), (IS_BOM_UTF32_LE), + (gst_avi_subtitle_extract_file), (gst_avi_subtitle_parse_gab2_chunk): + Detect other UTF byte order markers and convert to UTF-8 as + appropriate. + +2007-12-18 13:30:15 +0000 Tim-Philipp Müller + + gst/avi/gstavisubtitle.*: Refactor a bit; fix name extraction; don't assume all the data in the chunk is actually sub... + Original commit message from CVS: + * gst/avi/gstavisubtitle.c: (src_template), + (gst_avi_subtitle_extract_utf8_file), + (gst_avi_subtitle_parse_gab2_chunk), (gst_avi_subtitle_chain), + (gst_avi_subtitle_base_init), (gst_avi_subtitle_class_init), + (gst_avi_subtitle_init), (gst_avi_subtitle_change_state): + * gst/avi/gstavisubtitle.h: + Refactor a bit; fix name extraction; don't assume all the data + in the chunk is actually subtitle data, there may be padding at + the end; fix GST_ELEMENT_ERROR usage; store extracted subtitle + file so it's there to send again after a seek (for future use). + +2007-12-18 09:13:12 +0000 Thijs Vermeir + + Add avi subtitle element for bug #442034. Need seeking support and more support for character conversion. + Original commit message from CVS: + * gst/avi/Makefile.am: + * gst/avi/gstavi.c: + * gst/avi/gstavisubtitle.c: + * gst/avi/gstavisubtitle.h: + * tests/check/Makefile.am: + * tests/check/elements/avisubtitle.c: + * win32/common/config.h: + Add avi subtitle element for bug #442034. Need seeking support + and more support for character conversion. + +2007-12-18 09:07:17 +0000 Tim-Philipp Müller + + Makefile.am: Include common/win32.mak for CRLF check of win32 project files (see #393626). + Original commit message from CVS: + * Makefile.am: + Include common/win32.mak for CRLF check of win32 project + files (see #393626). + * win32/vs6/libgstpng.dsp: + Fix line endings and do cvs admin -kb. + +2007-12-17 21:12:28 +0000 David Schleef + + gst/multifile/gstmultifilesrc.*: When subsequent files are read, if the file doesn't exist, send an EOS instead of ca... + Original commit message from CVS: + * gst/multifile/gstmultifilesrc.c: + * gst/multifile/gstmultifilesrc.h: + When subsequent files are read, if the file doesn't exist, send + an EOS instead of causing an error. + +2007-12-16 23:43:46 +0000 Edward Hervey + + ext/jpeg/gstjpegdec.c: Actually drop the buffers which are outside the currently configured segment instead of just e... + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): + Actually drop the buffers which are outside the currently configured + segment instead of just emitting a WARNING. + +2007-12-14 18:49:34 +0000 Wim Taymans + + ext/flac/gstflacdec.*: Send segments from the streaming thread. Fixes #502187. + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_metadata_callback), + (gst_flac_dec_write): + * ext/flac/gstflacdec.h: + Send segments from the streaming thread. Fixes #502187. + Fix segment seeking and a bunch of other seeking cases. + +2007-12-14 10:17:10 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: Parse WOAF frames and put the result into GST_TAG_CONTACT, which is where it would end up... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (parse_url_link_frame): + Parse WOAF frames and put the result into GST_TAG_CONTACT, + which is where it would end up if the same information was + put in a vorbis comment (don't think it's worth adding a + new URI tag for this). Fixes #488112. + +2007-12-11 22:29:18 +0000 Tim-Philipp Müller + + configure.ac: We need core/base 0.10.15 or later. + Original commit message from CVS: + * configure.ac: + We need core/base 0.10.15 or later. + +2007-12-11 16:47:12 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Fix regression in stream numbering. Fixes #502655. + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/avi/gstavimux.c: (gst_avi_mux_start_file): + Fix regression in stream numbering. Fixes #502655. + +2007-12-11 16:39:39 +0000 Wouter Cloetens + + ext/soup/gstsouphttpsrc.*: Do not try to unpause I/O in the "queued" state. + Original commit message from CVS: + Patch by: Wouter Cloetens + * ext/soup/gstsouphttpsrc.c: (_do_init), + (gst_souphttp_src_class_init), (gst_souphttp_src_init), + (gst_souphttp_src_dispose), (gst_souphttp_src_set_property), + (gst_souphttp_src_get_property), (unicodify), + (gst_souphttp_src_unicodify), (gst_souphttp_src_create), + (gst_souphttp_src_start), (gst_souphttp_src_stop), + (gst_souphttp_src_unlock), (gst_souphttp_src_unlock_stop), + (gst_souphttp_src_get_size), (gst_souphttp_src_is_seekable), + (soup_got_headers), (soup_got_body), (soup_finished), + (soup_got_chunk), (soup_response), (soup_parse_status), + (gst_souphttp_src_uri_get_type), + (gst_souphttp_src_uri_get_protocols), + (gst_souphttp_src_uri_get_uri), (gst_souphttp_src_uri_set_uri), + (gst_souphttp_src_uri_handler_init): + * ext/soup/gstsouphttpsrc.h: + Do not try to unpause I/O in the "queued" state. + Reorganise a bunch of things and cleanups. + Uses G_GUINT64_FORMAT instead of hard-coding %llu. + See #502335. + +2007-12-11 16:31:49 +0000 Wai-Ming Ho + + gst/rtp/gstrtph264pay.*: Use higher performance start-code searching. + Original commit message from CVS: + Patch by: Wai-Ming Ho + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_init), + (gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_setcaps), + (next_start_code), (is_nal_equal), (gst_rtp_h264_pay_decode_nal), + (encode_base64), (gst_rtp_h264_pay_parse_sps_pps), + (gst_rtp_h264_pay_handle_buffer): + * gst/rtp/gstrtph264pay.h: + Use higher performance start-code searching. + Parse NALs and store SPS, PPS and profile in the caps so that they can + be used in the SDP. Fixes #502814. + +2007-12-11 11:50:54 +0000 Tim-Philipp Müller + + sys/v4l2/: Init some structs to zero before we pass them to ioctl, which avoids valgrind warnings. Also fix a small ... + Original commit message from CVS: + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list): + Init some structs to zero before we pass them to ioctl, which + avoids valgrind warnings. Also fix a small memory leak. + +2007-12-11 11:05:57 +0000 Wouter Cloetens + + gst/multipart/multipartdemux.c: Copy timestamp from input to output. Not very perfect yet but better than nothing. Fi... + Original commit message from CVS: + Patch by: Wouter Cloetens + * gst/multipart/multipartdemux.c: (gst_multipart_demux_chain): + Copy timestamp from input to output. Not very perfect yet but better + than nothing. Fixes #503023. + +2007-12-09 16:49:09 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackdec.c: Also print a useful error message with the old Wavpack API if possible. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): + Also print a useful error message with the old Wavpack API + if possible. + +2007-12-09 16:34:08 +0000 Tim-Philipp Müller + + ext/wavpack/gstwavpackdec.c: More build fixes for old libwavpack versions: include config.h so that WAVPACK_OLD_API i... + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: + More build fixes for old libwavpack versions: include config.h so + that WAVPACK_OLD_API is actually defined as detected; only use + WavpackGetErrorMessage if it is available. This fixes the build + on debian stable for me. + +2007-12-09 16:21:02 +0000 Sebastian Dröge + + ext/wavpack/: Workaround the non-existance of WavpackGetChannelMask in Wavpack versions below 4.40.0. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_create_src_pad): + Workaround the non-existance of WavpackGetChannelMask in Wavpack + versions below 4.40.0. + +2007-12-09 05:13:58 +0000 Sebastian Dröge + + configure.ac: And now do it right for real... + Original commit message from CVS: + * configure.ac: + And now do it right for real... + +2007-12-09 05:09:57 +0000 Sebastian Dröge + + configure.ac: Correctly reset $LIBS to not contain -lm. + Original commit message from CVS: + * configure.ac: + Correctly reset $LIBS to not contain -lm. + +2007-12-09 05:02:17 +0000 Kwang Yul Seo + + Fix compilation with MSVC by using gst_util_guint64_to_gdouble() and checking for rint() and implementing it ourself ... + Original commit message from CVS: + Based on a patch by: Kwang Yul Seo + * configure.ac: + * ext/cairo/gsttimeoverlay.c: + (gst_cairo_time_overlay_print_smpte_time): + Fix compilation with MSVC by using gst_util_guint64_to_gdouble() + and checking for rint() and implementing it ourself if it doesn't + exist. + +2007-12-09 04:29:08 +0000 Sebastian Dröge + + configure.ac: Don't define GST_DISABLE_DEPRECATED for releases. Fixes #498181. + Original commit message from CVS: + * configure.ac: + Don't define GST_DISABLE_DEPRECATED for releases. Fixes #498181. + +2007-12-08 16:47:33 +0000 Jan Schmidt + + sys/oss/gstosshelper.c: Verify that the format returned after the ioctl is the one we requested. It is valid for the ... + Original commit message from CVS: + * sys/oss/gstosshelper.c: + Verify that the format returned after the ioctl is the one + we requested. It is valid for the ioctl to succeed while + substituting an alternate 'supported' sample format. + +2007-12-07 20:07:49 +0000 Tim-Philipp Müller + + sys/oss/: Post decent (and translated) error message when we can't open the audio device for some reason. + Original commit message from CVS: + * sys/oss/gstossaudio.c: (plugin_init): + * sys/oss/gstosssink.c: (gst_oss_sink_open): + * sys/oss/gstosssrc.c: (gst_oss_src_open): + Post decent (and translated) error message when we can't + open the audio device for some reason. + +2007-12-07 19:29:39 +0000 Jan Schmidt + + sys/oss/: Allow the AUDIODEV environment variable to redirect us to a different default OSS device, like sunaudiosink... + Original commit message from CVS: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + Allow the AUDIODEV environment variable to redirect us + to a different default OSS device, like sunaudiosink does + on Solaris (makes audio play automatically on SunRays). + +2007-12-06 12:45:50 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.c: Fix compilation. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_transform_ip): + Fix compilation. + +2007-12-06 12:42:11 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.c: Don't process buffers in passthrough mode. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_transform_ip): + Don't process buffers in passthrough mode. + +2007-12-06 12:37:43 +0000 Sebastian Dröge + + gst/filter/: The transform() methods are not called in passthrough mode so there's no need for checking if the elemen... + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (bpwsinc_transform): + * gst/filter/gstlpwsinc.c: (lpwsinc_transform): + The transform() methods are not called in passthrough mode so + there's no need for checking if the element is in passthrough mode. + +2007-12-06 12:29:26 +0000 Sebastian Dröge + + gst/filter/: Sync the GObject properties with the controller even in passthrough mode to get consistent property values. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (bpwsinc_transform): + * gst/filter/gstlpwsinc.c: (lpwsinc_transform): + Sync the GObject properties with the controller even in passthrough + mode to get consistent property values. + +2007-12-06 12:11:29 +0000 Sebastian Dröge + + gst/audiofx/: The transform_ip() methods should do nothing if in passthrough mode. + Original commit message from CVS: + * gst/audiofx/audioamplify.c: (gst_audio_amplify_transform_ip): + * gst/audiofx/audiochebyshevfreqband.c: + (gst_audio_chebyshev_freq_band_transform_ip): + * gst/audiofx/audiochebyshevfreqlimit.c: + (gst_audio_chebyshev_freq_limit_transform_ip): + * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_transform_ip): + * gst/audiofx/audioinvert.c: (gst_audio_invert_transform_ip): + The transform_ip() methods should do nothing if in passthrough mode. + It might get non-writable buffers in that case but the buffer might + as well be writable. + * gst/audiofx/audiopanorama.c: (gst_audio_panorama_transform): + The transform() methods won't be called in passthrough mode and + otherwise the buffer is always writable so don't check here. + +2007-12-06 11:46:22 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: Fix seeking in .wav files again (#501775). Some people seem to think they don't need to ... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_srcpad_event): + Fix seeking in .wav files again (#501775). Some people seem to think + they don't need to test their changes when they're just 'reflowing' + some code. + +2007-12-05 16:04:47 +0000 Wim Taymans + + gst/autodetect/gstautovideosink.*: Fix docs. + Original commit message from CVS: + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_class_init), (gst_auto_video_sink_dispose), + (gst_auto_video_sink_init), + (gst_auto_video_sink_create_element_with_pretty_name), + (gst_auto_video_sink_find_best), + (gst_auto_video_sink_set_property), + (gst_auto_video_sink_get_property): + * gst/autodetect/gstautovideosink.h: + Fix docs. + Use same error reporting code as autoaudiosink. + Add property to filter sinks based on caps. Only select raw video sinks + by default for backwards compat. + API: GstAutoVideoSink::filter-caps + +2007-12-05 16:02:15 +0000 Tommi Myöhänen + + gst/autodetect/gstautoaudiosink.*: Add property to filter sinks based on caps. Only select raw audio sinks by default... + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_class_init), (gst_auto_audio_sink_dispose), + (gst_auto_audio_sink_init), (gst_auto_audio_sink_find_best), + (gst_auto_audio_sink_set_property), + (gst_auto_audio_sink_get_property): + * gst/autodetect/gstautoaudiosink.h: + Add property to filter sinks based on caps. Only select raw audio sinks + by default for backwards compat. Fixes #417420. + API: GstAutoAudioSink::filter-caps + +2007-11-29 11:40:15 +0000 Arek Korbik + + gst/videobox/gstvideobox.c: Initialise liboil in plugin_init() + Original commit message from CVS: + Patch by: Arek Korbik + * gst/videobox/gstvideobox.c: (plugin_init): + Initialise liboil in plugin_init() + +2007-11-29 10:49:18 +0000 Wouter Cloetens + + configure.ac: Bump libsoup requirement as libsoup does not support async client operation prior to version 2.2.104 an... + Original commit message from CVS: + Patch by: Wouter Cloetens + * configure.ac: + Bump libsoup requirement as libsoup does not support async client + operation prior to version 2.2.104 and it has some leaks. + * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), + (gst_souphttp_src_init), (gst_souphttp_src_dispose), + (gst_souphttp_src_set_property), (gst_souphttp_src_create), + (gst_souphttp_src_start), (gst_souphttp_src_stop), + (gst_souphttp_src_unlock), (gst_souphttp_src_unlock_stop), + (gst_souphttp_src_get_size), (soup_got_headers), (soup_got_body), + (soup_finished), (soup_got_chunk), (soup_response), + (soup_session_close): + * ext/soup/gstsouphttpsrc.h: + Implement unlock(). + Picks up the size from the Content-Length header and emit a duration + message. + Don't leak the GMainContext object. + Fixes #500099. + +2007-11-29 10:34:18 +0000 Wim Taymans + + ext/libpng/gstpngdec.c: Post error before sending EOS. Fixes #499178. + Original commit message from CVS: + * ext/libpng/gstpngdec.c: (gst_pngdec_task): + Post error before sending EOS. Fixes #499178. + +2007-11-28 21:54:50 +0000 Sébastien Moutte + + win32/vs6/: Add a project file for libgstpng + Original commit message from CVS: + * win32/vs6/gst_plugins_good.dsw: + * win32/vs6/libgstpng.dsp: + Add a project file for libgstpng + +2007-11-28 17:48:45 +0000 Edward Hervey + + gst/rtp/gstrtph263depay.c: Code beautification. + Original commit message from CVS: + * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_class_init), + (gst_rtp_h263_depay_process): + Code beautification. + Added debug statements. + Don't bit-shift everything, just do operations on last/first byte + instead. + +2007-11-27 11:11:08 +0000 Jayarama S. Santana + + gst/rtp/gstrtpmp4adepay.c: Fix wrong comparison in overrun check. Fixes #499239 some more. + Original commit message from CVS: + Patch by: Jayarama S. Santana + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_process): + Fix wrong comparison in overrun check. Fixes #499239 some more. + +2007-11-27 00:01:41 +0000 Edward Hervey + + gst/rtp/gstrtph263depay.*: Fix h263 depayloader so that ANY h263 decoder can handle the outgoing stream. + Original commit message from CVS: + * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_init), + (gst_rtp_h263_depay_process): + * gst/rtp/gstrtph263depay.h: + Fix h263 depayloader so that ANY h263 decoder can handle the outgoing + stream. + +2007-11-26 19:17:10 +0000 Wim Taymans + + gst/rtp/gstrtpmp4adepay.*: Fix depayloading when multiple frames are inside one RTP packet. + Original commit message from CVS: + Based on Path by: Jayarama S. Santana + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps), + (gst_rtp_mp4a_depay_process): + * gst/rtp/gstrtpmp4adepay.h: + Fix depayloading when multiple frames are inside one RTP packet. + Fixes #499239. + +2007-11-26 12:26:20 +0000 Stefan Kost + + gst/level/gstlevel.c: Add GAP-flag support. + Original commit message from CVS: + * gst/level/gstlevel.c: + Add GAP-flag support. + +2007-11-26 12:01:11 +0000 Edward Hervey + + gst/rtp/gstrtph263depay.c: Read the I flag for Mode A h263 rtp stream and set the + Original commit message from CVS: + * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_process): + Read the I flag for Mode A h263 rtp stream and set the + GST_BUFFER_FLAG_DELTA_UNIT accordingly. + Fixes #499383 + +2007-11-26 10:08:20 +0000 Stefan Kost + + gst/spectrum/gstspectrum.c: Use dispose and finalize. Dispose can be called multiple times. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: + Use dispose and finalize. Dispose can be called multiple times. + +2007-11-26 10:04:49 +0000 Stefan Kost + + gst/level/gstlevel.c: Remove some dead code and do cleanups. + Original commit message from CVS: + * gst/level/gstlevel.c: + Remove some dead code and do cleanups. + +2007-11-26 09:13:48 +0000 Stefan Kost + + tests/check/pipelines/simple-launch-lines.c: Improve the tests by allowing to set a target state. + Original commit message from CVS: + * tests/check/pipelines/simple-launch-lines.c: + Improve the tests by allowing to set a target state. + +2007-11-26 09:04:17 +0000 Sebastian Dröge + + tests/check/elements/wavpackenc.c: Don't check the caps of the output buffer if they're equal some other caps. The ca... + Original commit message from CVS: + * tests/check/elements/wavpackenc.c: (GST_START_TEST): + Don't check the caps of the output buffer if they're equal some + other caps. The caps can change in a backward compatible way + and did at this point. + +2007-11-24 14:55:04 +0000 Julien Moutte + + gst/qtdemux/qtdemux.c: Implement reverse playback support. + Original commit message from CVS: + 2007-11-24 Julien MOUTTE + * gst/qtdemux/qtdemux.c: (gst_qtdemux_find_segment), + (gst_qtdemux_move_stream), (gst_qtdemux_do_seek), + (gst_qtdemux_seek_to_previous_keyframe), + (gst_qtdemux_activate_segment), (gst_qtdemux_advance_sample), + (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop): Implement + reverse playback support. + +2007-11-21 09:56:54 +0000 Sebastian Dröge + + gst/filter/: Post a GST_MESSAGE_LATENCY if the latency changes. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (bpwsinc_set_property): + * gst/filter/gstlpwsinc.c: (lpwsinc_set_property): + Post a GST_MESSAGE_LATENCY if the latency changes. + +2007-11-21 08:21:10 +0000 Stefan Kost + + gst/equalizer/: Remove preset iface again. We'll re-add this after its been released in -good. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer10bands.c: + * gst/equalizer/gstiirequalizer3bands.c: + Remove preset iface again. We'll re-add this after its been released + in -good. + +2007-11-20 13:14:40 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackcommon.c: Also set the channel layout on the Wavpack caps if we're having a mono layout. Of cou... + Original commit message from CVS: + * ext/wavpack/gstwavpackcommon.c: (gst_wavpack_set_channel_layout): + Also set the channel layout on the Wavpack caps if we're having + a mono layout. Of course only do it for "audio/x-wavpack". + +2007-11-20 13:08:45 +0000 Sebastian Dröge + + ext/wavpack/: Add support for encoding, parsing and decoding multichannel files with up to 8 channels. This also impr... + Original commit message from CVS: + * ext/wavpack/gstwavpackcommon.c: + (gst_wavpack_get_default_channel_mask), + (gst_wavpack_set_channel_layout), + (gst_wavpack_get_default_channel_positions), + (gst_wavpack_get_channel_mask_from_positions), + (gst_wavpack_set_channel_mapping): + * ext/wavpack/gstwavpackcommon.h: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), + (gst_wavpack_dec_sink_set_caps), (gst_wavpack_dec_chain): + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_reset), + (gst_wavpack_enc_init), (gst_wavpack_enc_sink_set_caps), + (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_push_block), + (gst_wavpack_enc_fix_channel_order), (gst_wavpack_enc_chain), + (gst_wavpack_enc_rewrite_first_block), + (gst_wavpack_enc_sink_event): + * ext/wavpack/gstwavpackenc.h: + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset), + (gst_wavpack_parse_scan_to_find_sample), + (gst_wavpack_parse_sink_event), (gst_wavpack_parse_create_src_pad), + (gst_wavpack_parse_push_buffer), (gst_wavpack_parse_loop): + * ext/wavpack/gstwavpackparse.h: + Add support for encoding, parsing and decoding multichannel + files with up to 8 channels. This also improves the robustness + of parsing quite a bit. + * ext/wavpack/gstwavpackstreamreader.c: + (gst_wavpack_stream_reader_read_bytes), + (gst_wavpack_stream_reader_get_pos), + (gst_wavpack_stream_reader_set_pos_abs), + (gst_wavpack_stream_reader_set_pos_rel), + (gst_wavpack_stream_reader_push_back_byte), + (gst_wavpack_stream_reader_get_length), + (gst_wavpack_stream_reader_can_seek), + (gst_wavpack_stream_reader_write_bytes): + Improve debugging. + +2007-11-20 12:20:38 +0000 Stefan Kost + + ext/libpng/gstpngdec.*: Don't release the png-memory from within the callback. + Original commit message from CVS: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngdec.h: + Don't release the png-memory from within the callback. + +2007-11-20 12:11:13 +0000 René Stadler + + ext/libpng/gstpngenc.c: Don't leak buffer data memory. Fixes #498395. + Original commit message from CVS: + Patch by: René Stadler + * ext/libpng/gstpngenc.c: + Don't leak buffer data memory. Fixes #498395. + +2007-11-20 11:46:28 +0000 René Stadler + + tests/check/pipelines/simple-launch-lines.c: Tests for #498395. + Original commit message from CVS: + Patch by: René Stadler + * tests/check/pipelines/simple-launch-lines.c: + Tests for #498395. + +2007-11-20 11:41:13 +0000 Julien Moutte + + Fix build on Mac OS X 10.5 + Original commit message from CVS: + 2007-11-20 Julien MOUTTE + * ext/taglib/gsttaglibmux.c: (gst_tag_lib_mux_render_tag), + (gst_tag_lib_mux_adjust_event_offsets): + * gst/qtdemux/qtdemux.c: (qtdemux_parse_theora_extension): + * sys/osxaudio/Makefile.am: + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: Fix build on Mac OS X 10.5 + +2007-11-19 20:30:19 +0000 Stefan Kost + + gst/equalizer/: Activate preset iface and upload two presets here. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer10bands.c: + * gst/equalizer/gstiirequalizer3bands.c: + Activate preset iface and upload two presets here. + +2007-11-16 05:52:55 +0000 David Schleef + + ext/cairo/gsttextoverlay.c: Change strcasecmp() to g_strcasecmp(). Fixes #497292. + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: + Change strcasecmp() to g_strcasecmp(). Fixes #497292. + +2007-11-15 18:19:19 +0000 Jordi Jaen Pallares + + gst/rtp/gstrtpmp2tpay.*: Fill the MTU with as many packets as possible. Fixes #491323. + Original commit message from CVS: + Patch by: Jordi Jaen Pallares + * gst/rtp/gstrtpmp2tpay.c: (gst_rtp_mp2t_pay_class_init), + (gst_rtp_mp2t_pay_init), (gst_rtp_mp2t_pay_finalize), + (gst_rtp_mp2t_pay_flush), (gst_rtp_mp2t_pay_handle_buffer): + * gst/rtp/gstrtpmp2tpay.h: + Fill the MTU with as many packets as possible. Fixes #491323. + +2007-11-15 17:47:43 +0000 Tommi Myöhänen + + gst/rtsp/gstrtspsrc.c: Fix some more leaks. Fixes #497007. + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams): + Fix some more leaks. Fixes #497007. + +2007-11-15 17:35:18 +0000 Tommi Myöhänen + + gst/rtsp/gstrtspsrc.c: Fix 3 pad leaks. Fixes #496983. + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_free), + (gst_rtspsrc_stream_configure_tcp): + Fix 3 pad leaks. Fixes #496983. + +2007-11-15 17:26:25 +0000 Wouter Cloetens + + Added HTTP source based on libsoup. Fixes #497020. + Original commit message from CVS: + Patch by: Wouter Cloetens + * configure.ac: + * ext/Makefile.am: + * ext/soup/Makefile.am: + * ext/soup/gstsouphttpsrc.c: (_do_init), + (gst_souphttp_src_base_init), (gst_souphttp_src_class_init), + (gst_souphttp_src_init), (gst_souphttp_src_dispose), + (gst_souphttp_src_set_property), (gst_souphttp_src_get_property), + (gst_souphttp_src_create), (gst_souphttp_src_start), + (gst_souphttp_src_stop), (gst_souphttp_src_unlock), + (gst_souphttp_src_set_location), (soup_got_chunk), (soup_response), + (soup_session_close), (plugin_init): + * ext/soup/gstsouphttpsrc.h: + Added HTTP source based on libsoup. Fixes #497020. + +2007-11-15 17:01:32 +0000 Tommi Myöhänen + + gst/rtp/gstrtph264depay.c: Fix small leak. Fixes #497017. + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): + Fix small leak. Fixes #497017. + +2007-11-15 16:31:32 +0000 Wim Taymans + + gst/qtdemux/: Add suppport for theora in quicktime according to XiphQT. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_prepare_current_sample), + (gst_qtdemux_loop_state_movie), (qtdemux_parse_theora_extension), + (qtdemux_parse_node), (qtdemux_parse_trak), (qtdemux_video_caps): + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + Add suppport for theora in quicktime according to XiphQT. + +2007-11-15 12:22:10 +0000 Edgard Lima + + * ChangeLog: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2src_calls.c: + Always copy buffers by default (handle safer with bugged drivers) and added a property to make it possible to use mma... + Original commit message from CVS: + Always copy buffers by default (handle safer with bugged drivers) and added a property to make it possible to use mmap effectively (no copy if possible) when application wants to. Fixes: #480557. + +2007-11-14 21:39:47 +0000 Tim-Philipp Müller + + gst/id3demux/: We don't want the same string multiple times in a tag list for the same tag ever, for any tag, not jus... + Original commit message from CVS: + * gst/id3demux/id3tags.c: + * gst/id3demux/id3tags.h: + * gst/id3demux/id3v2frames.c: (id3v2_tag_to_taglist): + We don't want the same string multiple times in a tag list for the + same tag ever, for any tag, not just for GST_TAG_GENRE, so make sure + this doesn't happen and remove special-case code for GST_TAG_GENRE. + +2007-11-14 21:04:12 +0000 Tim-Philipp Müller + + ext/taglib/gstid3v2mux.cc: Write GST_TAG_MUSICBRAINZ_DISCID and GST_TAG_CDDA_CDDB_DISCID into ID3v2 TXXX frames (fixe... + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: (add_musicbrainz_tag), (add_funcs): + Write GST_TAG_MUSICBRAINZ_DISCID and GST_TAG_CDDA_CDDB_DISCID + into ID3v2 TXXX frames (fixes #347848). + +2007-11-14 20:34:24 +0000 Tim-Philipp Müller + + gst/rtsp/gstrtspsrc.c: Don't leak sdp message contents (fixes #496773). + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): + Don't leak sdp message contents (fixes #496773). + * gst/udp/gstudpsink.c: (gst_udpsink_finalize): + Don't leak URI string. + +2007-11-14 19:10:37 +0000 Julien Puydt + + ext/raw1394/: Implement GstPropertyProbe interface and add "device-name" property, so applications can use this to pr... + Original commit message from CVS: + Patch by: Julien Puydt + * ext/raw1394/Makefile.am: + * ext/raw1394/gst1394probe.c: (gst_1394_get_guid_array), + (gst_1394_property_probe_get_properties), + (gst_1394_property_probe_probe_property), + (gst_1394_property_probe_needs_probe), + (gst_1394_property_probe_get_values), + (gst_1394_property_probe_interface_init), + (gst_1394_type_add_property_probe_interface): + * ext/raw1394/gst1394probe.h: (GST_1394_PROBE_H): + * ext/raw1394/gstdv1394src.c: (_do_init), (gst_dv1394src_class_init), + (gst_dv1394src_init), (gst_dv1394src_dispose), + (gst_dv1394src_set_property), (gst_dv1394src_get_property), + (gst_dv1394src_discover_avc_node), (gst_dv1394src_query), + (gst_dv1394src_update_device_name): + * ext/raw1394/gstdv1394src.h: + Implement GstPropertyProbe interface and add "device-name" property, + so applications can use this to probe for available devices in the + same way they can already with v4lsrc and v4l2src (however horrible + this property probe interface may be). Fixes #358841. + +2007-11-14 17:03:18 +0000 Sebastian Dröge + + tests/check/elements/spectrum.c: Fix spectrum unit test for the latest spectrum changes. + Original commit message from CVS: + * tests/check/elements/spectrum.c: (GST_START_TEST): + Fix spectrum unit test for the latest spectrum changes. + +2007-11-14 15:29:05 +0000 Tommi Myöhänen + + gst/rtsp/gstrtspsrc.c: Don't leak event, don't leak range (fixes #496752). + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_handle_src_event), + (gst_rtspsrc_parse_range): + Don't leak event, don't leak range (fixes #496752). + +2007-11-14 10:22:41 +0000 Arek Korbik + + gst/alpha/gstalphacolor.c: Detect RGBA/BGRA correctly on little endian systems. + Original commit message from CVS: + Patch by: Arek Korbik + * gst/alpha/gstalphacolor.c: (gst_alpha_color_set_caps): + Detect RGBA/BGRA correctly on little endian systems. + +2007-11-13 17:19:13 +0000 Tim-Philipp Müller + + sys/v4l2/v4l2src_calls.c: but the corresponding ioctl() call fails even though the driver claims to support this form... + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format): + If VIDIOC_ENUM_FRAMESIZES is defined (= recent kernel), but the + corresponding ioctl() call fails even though the driver claims to + support this format, just fall back to the pre-2.6.19 kernel + routine that creates caps with suitable height and width ranges + (see #448278). + +2007-11-13 17:01:07 +0000 Mark Nauwelaerts + + gst/matroska/: Extract palette data for dvd subpicture streams and send it downstream as custom gstreamer dvd event (... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_push_dvd_clut_change_event), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_subtitle_caps): + * gst/matroska/matroska-ids.h: + Extract palette data for dvd subpicture streams and send it + downstream as custom gstreamer dvd event (fixes #453417). + +2007-11-13 14:51:30 +0000 Tim-Philipp Müller + + ext/cairo/gsttextoverlay.c: Implement minimal parsing of the passed pango font description string, so passing a font ... + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_font_init): + Implement minimal parsing of the passed pango font description + string, so passing a font size works the same as with the + pango textoverlay plugin; fixes #455086. + (Maybe we could just use pangocairo here at some point). + +2007-11-13 06:55:28 +0000 Stefan Kost + + gst/: Return the result in _activate_pull(). Don't ref element there. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + * gst/wavparse/gstwavparse.c: + Return the result in _activate_pull(). Don't ref element there. + +2007-11-13 06:23:51 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: Ref the element when we should, but not when we its not needed. Reflow the event_handling... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query), + (gst_wavparse_srcpad_event): + Ref the element when we should, but not when we its not needed. Reflow + the event_handling to not leak the event. + +2007-11-12 21:07:31 +0000 René Stadler + + gst/replaygain/rganalysis.c: Avoid slowdown from denormals when processing near-silence input data. + Original commit message from CVS: + Patch by: René Stadler + * gst/replaygain/rganalysis.c: (yule_filter): + Avoid slowdown from denormals when processing near-silence input data. + Spotted by Gabriel Bouvigne. Fixes #494499. + +2007-11-12 17:59:40 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Properly free QTDemuxSamples array. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (qtdemux_parse_samples): + Properly free QTDemuxSamples array. + Protect table write with a sensible check, some files apparently DO contain + stts values starting with 0 :( + +2007-11-12 17:21:59 +0000 Stefan Kost + + gst/: Drop EOS in _handle_src_event(). Fix the refcount in qtdemux that previous commit messed up. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + * gst/qtdemux/qtdemux.c: + Drop EOS in _handle_src_event(). Fix the refcount in qtdemux that + previous commit messed up. + +2007-11-12 17:06:32 +0000 Stefan Kost + + gst/: Sync _handle_src_event() with oggdemux. In avidemux also ref the element when we should, but not when we its no... + Original commit message from CVS: + * gst/avi/gstavidemux.c: + * gst/qtdemux/qtdemux.c: + Sync _handle_src_event() with oggdemux. In avidemux also ref the + element when we should, but not when we its not needed. + +2007-11-11 21:12:10 +0000 Sebastian Dröge + + gst/: Change the meaning of the magnitude values given in the + Original commit message from CVS: + * gst/equalizer/demo.c: (draw_spectrum): + * gst/spectrum/demo-audiotest.c: (draw_spectrum): + * gst/spectrum/demo-osssrc.c: (draw_spectrum): + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): + Change the meaning of the magnitude values given in the + GstMessages by spectrum to decibel instead of + decibel+threshold. + +2007-11-11 13:55:27 +0000 Sebastian Dröge + + gst/equalizer/: And continue to update docs. Also include some sample code for the n-band equalizer in the docs. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer10bands.c: + * gst/equalizer/gstiirequalizer3bands.c: + * gst/equalizer/gstiirequalizernbands.c: + And continue to update docs. Also include some sample code + for the n-band equalizer in the docs. + +2007-11-11 12:54:31 +0000 Sebastian Dröge + + gst/equalizer/: Update docs and property ranges to the real values. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer10bands.c: + (gst_iir_equalizer_10bands_class_init): + * gst/equalizer/gstiirequalizer3bands.c: + (gst_iir_equalizer_3bands_class_init): + * gst/equalizer/gstiirequalizernbands.c: + Update docs and property ranges to the real values. + +2007-11-09 17:27:00 +0000 Sebastian Dröge + + gst/spectrum/gstspectrum.c: Now do the scaling right for real. Also initialize a previously uninitialized variable. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: + Now do the scaling right for real. Also initialize a previously + uninitialized variable. + +2007-11-08 15:56:46 +0000 Stefan Kost + + gst/equalizer/demo.c: Make default volume a bit less. Improve layout by giving more space to the slider with big-numb... + Original commit message from CVS: + * gst/equalizer/demo.c: + Make default volume a bit less. Improve layout by giving more space to + the slider with big-numbers and enable fill. + +2007-11-08 15:00:40 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: Return FALSE if we can't handle a query instead of changing the format. Ignore fact when ... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Return FALSE if we can't handle a query instead of changing the + format. Ignore fact when dealing with mpeg audio. + +2007-11-06 12:23:35 +0000 Sebastian Dröge + + gst/spectrum/demo-audiotest.c: Use autoaudiosink instead of alsasink and use a sine wave. + Original commit message from CVS: + * gst/spectrum/demo-audiotest.c: (main): + Use autoaudiosink instead of alsasink and use a sine wave. + * gst/spectrum/gstspectrum.c: + Fix the magnitude calculation. + +2007-11-03 19:50:11 +0000 Sebastian Dröge + + gst/equalizer/: Allow setting 0 as bandwidth and handle this correctly. + Original commit message from CVS: + * gst/equalizer/demo.c: (main): + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_band_class_init), (setup_filter): + Allow setting 0 as bandwidth and handle this correctly. + Also handle a bandwidth of rate/2 properly. + * gst/equalizer/gstiirequalizernbands.c: + (gst_iir_equalizer_nbands_class_init): + Make it possible to generate a N-band equalizer with 1 bands. The + previous limit of 2 was caused by a nowadays replaced calculation + doing a division by zero if number of bands was 1. + +2007-11-02 21:16:09 +0000 Ole André Vadla Ravnås + + Fix includes for MSVC and GLib-2.14.0 (#492388). + Original commit message from CVS: + Patch by: Ole André Vadla Ravnås + * configure.ac: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstdynudpsink.h: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsink.h: + Fix includes for MSVC and GLib-2.14.0 (#492388). + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + No more pipe define since GLib-2.14.0, need to use _pipe() directly. + +2007-11-02 17:23:43 +0000 Edward Hervey + + gst/law/mulaw-decode.*: Calculate outgoing buffer duration if incoming buffer didn't have a valid duration. + Original commit message from CVS: + * gst/law/mulaw-decode.c: (mulawdec_sink_setcaps), + (gst_mulawdec_chain): + * gst/law/mulaw-decode.h: + Calculate outgoing buffer duration if incoming buffer didn't have a + valid duration. + +2007-10-30 21:37:49 +0000 Sebastian Dröge + + gst/equalizer/: Add small demo application based on the spectrum demo applications that gets white noise as input, pu... + Original commit message from CVS: + * gst/equalizer/Makefile.am: + * gst/equalizer/demo.c: (on_window_destroy), (on_configure_event), + (on_gain_changed), (on_bandwidth_changed), (on_freq_changed), + (draw_spectrum), (message_handler), (main): + Add small demo application based on the spectrum demo applications + that gets white noise as input, pushes it through an equalizer and + paints the spectrum. For every equalizer band it's possible to set + gain, bandwidth and frequency. + * gst/equalizer/gstiirequalizer.c: (setup_filter): + Add some guarding against too large or too small frequencies and + bandwidths. Also improve debugging a bit. + +2007-10-30 21:18:45 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.c: Replace filters with a bit better filters for which we can actually find documentati... + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_band_set_property), + (gst_iir_equalizer_band_get_property), + (gst_iir_equalizer_band_class_init), (arg_to_scale), + (setup_filter), (gst_iir_equalizer_compute_frequencies): + Replace filters with a bit better filters for which we can actually + find documentation, which don't change anything on zero gain, etc. + Make the frequency property of the bands writable, rename the + band-width property to bandwidth and change the meaning to the + frequency difference between bandedges, change the meaning of the + gain property to dB instead of a weird scale between -1 and 1 that + has no real meaning. + +2007-10-30 12:29:46 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Smarter combine_flow code that also deals with downstream elements returning UNEXPECTED when t... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), + (gst_qtdemux_combine_flows), (gst_qtdemux_loop_state_movie): + Smarter combine_flow code that also deals with downstream elements + returning UNEXPECTED when they receive data out of the segment + boundaries. Fixes #491305. + +2007-10-27 16:04:48 +0000 Tim-Philipp Müller + + gst/interleave/interleave.c: Let's not call every request pad we create "sink%d", that'll create problems if there's ... + Original commit message from CVS: + * gst/interleave/interleave.c: (gst_interleave_request_new_pad): + Let's not call every request pad we create "sink%d", that'll + create problems if there's to be more than one pad. Fixes #490682. + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/interleave.c: + Add unit test for the above. + +2007-10-26 15:03:06 +0000 Tim-Philipp Müller + + sys/v4l2/v4l2src_calls.c: Fix 'unused variable' compiler warning when compiling against older kernel headers. + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: + Fix 'unused variable' compiler warning when compiling against + older kernel headers. + +2007-10-26 12:10:43 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + update spec file + Original commit message from CVS: + update spec file + +2007-10-25 23:42:52 +0000 David Schleef + + Improve documentation, write some tests for multifilesrc/sink for upcoming ->good review. + Original commit message from CVS: + * gst/multifile/Makefile.am: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * tests/check/Makefile.am: + * tests/check/elements/multifile.c: + Improve documentation, write some tests for multifilesrc/sink + for upcoming ->good review. + +2007-10-25 15:00:15 +0000 Tim-Philipp Müller + + ext/taglib/gstid3v2mux.cc (add_funcs): Map new SORTNAME tags to ID3v2 TSOP, TSOA and TSOT frames (#414539). + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc (add_funcs): + Map new SORTNAME tags to ID3v2 TSOP, TSOA and TSOT frames (#414539). + +2007-10-24 07:01:47 +0000 Stefan Kost + + tests/check/pipelines/simple-launch-lines.c: Improve the tests a little more. + Original commit message from CVS: + * tests/check/pipelines/simple-launch-lines.c: + Improve the tests a little more. + +2007-10-23 08:38:50 +0000 Yun Zheng Hu + + sys/osxaudio/gstosxaudiosrc.c: Use default input device instead of default output device and only memcpy actual avail... + Original commit message from CVS: + patch by: Yun Zheng Hu + * sys/osxaudio/gstosxaudiosrc.c: + Use default input device instead of default output device and + only memcpy actual available bytes. + +2007-10-22 19:14:08 +0000 Edgard Lima + + sys/v4l2/v4l2src_calls.c: Fixes "v4l2src ! queue ! xvimagesink". The queue ask for buffer too early. It is temporary ... + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_grab_frame): + Fixes "v4l2src ! queue ! xvimagesink". The queue ask for buffer too + early. It is temporary until we find something better. + +2007-10-22 16:44:48 +0000 Tommi Myöhänen + + gst/rtsp/gstrtspsrc.c: Fix race when pausing a RTSP stream in interleaved. + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_interleaved): + Fix race when pausing a RTSP stream in interleaved. + Fixes #475784. + +2007-10-22 09:53:16 +0000 Peter Kjellerstedt + + gst/rtp/gstrtpmp4vpay.c: Use correct unref function for buffers. #488844. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_finalize): + Use correct unref function for buffers. #488844. + +2007-10-19 19:33:16 +0000 Stefan Kost + + Add some debug and sync tests with the fix. + Original commit message from CVS: + * gst/avi/gstavimux.c: + * tests/check/elements/avimux.c: + Add some debug and sync tests with the fix. + +2007-10-18 17:04:14 +0000 Laurent Glayal + + gst/udp/gstudpsrc.c: When the socket is used by the app for other purposes, don't generate an error if there is activ... + Original commit message from CVS: + Based on patch by: Laurent Glayal + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + When the socket is used by the app for other purposes, don't generate an + error if there is activaty on the socket that is not data related. + Fixes #487488. + +2007-10-18 14:55:38 +0000 Wim Taymans + + sys/v4l2/v4l2src_calls.c: Add some more debug info. Generate an error when we run out of buffers for some reason. See... + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), + (gst_v4l2src_grab_frame): + Add some more debug info. Generate an error when we run out of buffers + for some reason. See #480557. + +2007-10-18 08:27:56 +0000 Anders Skargren + + gst/rtp/gstrtph264pay.c: Set marker bit correctly. + Original commit message from CVS: + Patch by: Anders Skargren + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_handle_buffer): + Set marker bit correctly. + +2007-10-18 06:20:21 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.c: Add a missing break. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_band_set_property): + Add a missing break. + +2007-10-18 06:14:42 +0000 Sebastian Dröge + + gst/equalizer/gstiirequalizer.*: Move bandwidth property to the separate bands and add float64 support. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_band_set_property), + (gst_iir_equalizer_band_get_property), + (gst_iir_equalizer_band_class_init), (gst_iir_equalizer_band_init), + (gst_iir_equalizer_band_get_type), (gst_iir_equalizer_class_init), + (setup_filter), (gst_iir_equalizer_setup): + * gst/equalizer/gstiirequalizer.h: + Move bandwidth property to the separate bands and add float64 support. + +2007-10-17 15:08:02 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Use allowed name for the GstStructure. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): + Use allowed name for the GstStructure. + +2007-10-17 11:47:23 +0000 Tim-Philipp Müller + + Use new gst_bus_pop_filtered(). + Original commit message from CVS: + * ext/gconf/gstswitchsink.c: + * gst/autodetect/gstautoaudiosink.c: + Use new gst_bus_pop_filtered(). + +2007-10-13 12:03:44 +0000 Tim-Philipp Müller + + sys/v4l2/: When probing the formats and sizes a camera supports, make sure the best ones (highest resolution, prefere... + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + When probing the formats and sizes a camera supports, make + sure the best ones (highest resolution, prefered format) + end up at the beginning of the probed caps and the less + desirable ones at the end. This is important because the + order within the caps matters for things like fixation and + negotiation, ie. what format is chosen in the end. + With recent kernels, the current probing code will end up + querying the supported sizes from lowest resolution to + highest resolution, adding them to the probed caps in that + order, resulting to v4l2src fixating to the lowest possible + resolution if downstream does not express a size preference. + Also make up a somewhat random ranking of prefered output + formats for the same reason. Fixes #485828. + +2007-10-11 17:55:29 +0000 Jason Kivlighn + + gst/id3demux/id3v2frames.c: Extract license/copyright URIs from ID3v2 WCOP frames (Fixes #447000). + Original commit message from CVS: + Based on patch by: Jason Kivlighn + * gst/id3demux/id3v2frames.c: + Extract license/copyright URIs from ID3v2 WCOP frames + (Fixes #447000). + * tests/check/elements/id3demux.c: + * tests/files/Makefile.am: + * tests/files/id3-447000-wcop.tag: + Add simple unit test. + +2007-10-11 16:41:44 +0000 Tim-Philipp Müller + + ext/taglib/gstid3v2mux.cc: Add support for license/copyright URI tags (ID3v2 WCOP frame). + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: + Add support for license/copyright URI tags (ID3v2 WCOP frame). + Prerequisite for #447000. + +2007-10-08 17:44:42 +0000 Jan Schmidt + + gst/rtsp/gstrtspsrc.c: Fix compiler warning by using GST_CLOCK_TIME_NONE to initialise a GstClockTime. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_flush): + Fix compiler warning by using GST_CLOCK_TIME_NONE to initialise + a GstClockTime. + +2007-10-08 11:58:51 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: More seeking fixes, mostly passing around the new playback segment in order to configure it pr... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_flush), + (gst_rtspsrc_do_seek), (gst_rtspsrc_perform_seek), + (gst_rtspsrc_configure_caps), (gst_rtspsrc_loop_udp), + (gst_rtspsrc_parse_range), (gst_rtspsrc_open), (gst_rtspsrc_play), + (gst_rtspsrc_change_state): + More seeking fixes, mostly passing around the new playback segment in + order to configure it properly. + Also reset base_time of udp sources when setting them back to PLAYING as + a temporary hack until core supports seek in live sources properly. + +2007-10-08 10:34:03 +0000 Wim Taymans + + gst/rtp/gstrtpmp4adepay.c: Fix caps as to not confuse autopluggers. + Original commit message from CVS: + * gst/rtp/gstrtpmp4adepay.c: + Fix caps as to not confuse autopluggers. + +2007-10-06 16:13:14 +0000 Tim-Philipp Müller + + gst/id3demux/: Port ID3 tag demuxer over to the new GstTagDemux in -base (now would be a good time to test re-importi... + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: + * gst/id3demux/gstid3demux.h: + * gst/id3demux/id3tags.c: + * gst/id3demux/id3tags.h: + * gst/id3demux/id3v2frames.c: + Port ID3 tag demuxer over to the new GstTagDemux in -base + (now would be a good time to test re-importing your music + collection). + +2007-10-06 15:13:09 +0000 Tim-Philipp Müller + + gst/apetag/: Port APE tag demuxer over to the new GstTagDemux in -base. + Original commit message from CVS: + * gst/apetag/Makefile.am: + * gst/apetag/gstapedemux.c: + * gst/apetag/gstapedemux.h: + * gst/apetag/gsttagdemux.c: + * gst/apetag/gsttagdemux.h: + Port APE tag demuxer over to the new GstTagDemux in -base. + +2007-10-05 13:18:19 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Improve flushing behaviour. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_flush), + (gst_rtspsrc_perform_seek), (gst_rtspsrc_handle_src_event), + (gst_rtspsrc_handle_internal_src_query), + (gst_rtspsrc_handle_src_query), (new_session_pad), + (gst_rtspsrc_stream_configure_tcp), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_loop_send_cmd): + Improve flushing behaviour. + Set state of the udp sources to PAUSE/PLAYING correctly. + Handle events and queries for UDP and TCP transport now. + +2007-10-04 07:29:48 +0000 Stefan Kost + + gst/rtp/: Add log category. + Original commit message from CVS: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: + Add log category. + +2007-10-04 07:24:02 +0000 Timo Hotti + + tests/check/: Add unit tests for payloaders/depayloaders. + Original commit message from CVS: + Patch by: Timo Hotti + * tests/check/Makefile.am: + * tests/check/pipelines/simple-launch-lines.c: + Add unit tests for payloaders/depayloaders. + +2007-10-02 10:49:03 +0000 Stefan Kost + + gst/avi/gstavimux.*: Also save codec data for audio streams. Fixes #482495. + Original commit message from CVS: + * gst/avi/gstavimux.c: + * gst/avi/gstavimux.h: + Also save codec data for audio streams. Fixes #482495. + +2007-10-02 10:23:04 +0000 Stefan Kost + + gst/avi/gstavimux.c: Fix "Index entry has invalid stream nr 1". + Original commit message from CVS: + * gst/avi/gstavimux.c: + Fix "Index entry has invalid stream nr 1". + Add support for muxing aac - work in progress (see #482495). + +2007-10-01 16:34:56 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Parse bandwidth modifiers, they are not yet configured in the session manager because we don't... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_get_bandwidth), + (gst_rtspsrc_collect_bandwidth), (gst_rtspsrc_create_stream), + (gst_rtspsrc_media_to_caps), (gst_rtspsrc_loop_interleaved): + * gst/rtsp/gstrtspsrc.h: + Parse bandwidth modifiers, they are not yet configured in the session + manager because we don't have an API for that yet. + +2007-10-01 13:57:28 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Use shiny new function in -base to get the default clock-rate. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpmap), + (gst_rtspsrc_media_to_caps), (gst_rtspsrc_loop_interleaved): + Use shiny new function in -base to get the default clock-rate. + Update some docs. + +2007-09-29 12:50:36 +0000 Sébastien Moutte + + win32/MANIFEST: Add files to win32 manifest. + Original commit message from CVS: + * win32/MANIFEST: + Add files to win32 manifest. + * win32/vs6/libgstaudiofx.dsp: + * win32/vs6/libgstqtdemux.dsp: + * win32/vs6/libgstrtp.dsp: + * win32/vs6/libgstrtsp.dsp: + Update project files. + +2007-09-28 14:56:19 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: In TCP mode, only timestamp the first buffer. TCP is not real time and it does not make sense ... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_play): + * gst/rtsp/gstrtspsrc.h: + In TCP mode, only timestamp the first buffer. TCP is not real time and + it does not make sense to try to skew compensate, also some servers send + the first batch of data in a burst. + +2007-09-27 15:00:30 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: Fix setting the discont flag on the first buffer pushed downstream for formats with pr... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + Fix setting the discont flag on the first buffer + pushed downstream for formats with private codec + data that needs to be deserialised into buffers + (such as vorbis and FLAC when in a matroska container). + +2007-09-27 11:10:12 +0000 Antoine Tremblay + + gst/rtp/gstrtpmp4vpay.*: Free the config string. Fixes #480707. + Original commit message from CVS: + Patch by: Antoine Tremblay + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_init), + (gst_rtp_mp4v_pay_finalize), (gst_rtp_mp4v_pay_flush), + (gst_rtp_mp4v_pay_handle_buffer): + * gst/rtp/gstrtpmp4vpay.h: + Free the config string. Fixes #480707. + Clean up the timestamp code a little. + +2007-09-26 20:12:52 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Set timestamps on RTP buffers in interleaved mode. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), + (gst_rtspsrc_handle_src_query), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_close): + * gst/rtsp/gstrtspsrc.h: + Set timestamps on RTP buffers in interleaved mode. + Mark first buffers with a DISCONT. + Remove flush hack now that sync for live sources has been figured out. + +2007-09-26 14:28:20 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Update documentation. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Update documentation. + +2007-09-26 14:26:39 +0000 Wim Taymans + + gst/qtdemux/gstrtpxqtdepay.*: Fail if we don't know the quicktime format. + Original commit message from CVS: + * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_process), + (gst_rtp_xqt_depay_change_state): + * gst/qtdemux/gstrtpxqtdepay.h: + Fail if we don't know the quicktime format. + +2007-09-26 13:19:17 +0000 Tim-Philipp Müller + + ext/flac/gstflacenc.*: Save the flow return from the last gst_pad_push() and make sure we pass the right flow return ... + Original commit message from CVS: + * ext/flac/gstflacenc.c: + * ext/flac/gstflacenc.h: + Save the flow return from the last gst_pad_push() and + make sure we pass the right flow return value upstream + in the case of failure; minor clean-ups. + +2007-09-25 19:09:33 +0000 Tim-Philipp Müller + + Add support for the new GST_TAG_COMPOSER (#459809). + Original commit message from CVS: + * ext/taglib/gstapev2mux.cc: + * ext/taglib/gstid3v2mux.cc: + * gst/apetag/gstapedemux.c: + Add support for the new GST_TAG_COMPOSER (#459809). + +2007-09-25 17:18:34 +0000 Tim-Philipp Müller + + gst/law/: Compulsive clean-ups: use boilerplate macros, add debug categories, fix up things to conform to symbol nome... + Original commit message from CVS: + * gst/law/alaw-decode.c: + * gst/law/alaw-decode.h: + * gst/law/alaw-encode.c: + * gst/law/alaw-encode.h: + * gst/law/alaw.c: + * gst/law/mulaw-conversion.h: + Compulsive clean-ups: use boilerplate macros, add debug + categories, fix up things to conform to symbol nomenklatura, + etc. + +2007-09-25 16:05:29 +0000 Laurent Glayal + + gst/law/: Use static tables for A-Law decoding and encoding; this makes + Original commit message from CVS: + Based on patch by: Laurent Glayal + * gst/law/alaw-decode.c: + * gst/law/alaw-encode.c: + Use static tables for A-Law decoding and encoding; this makes + A-Law decoding and encoding less CPU-intensive, but increases + the binary size a bit. Leaving old code around for now, + selectable by a define in the code. Fixes #435435. + +2007-09-25 08:51:36 +0000 Sebastian Dröge + + configure.ac: Use AG_GST_ARG_WITH_PLUGINS, AG_GST_ARG_ENABLE_EXTERNAL and + Original commit message from CVS: + * configure.ac: + Use AG_GST_ARG_WITH_PLUGINS, AG_GST_ARG_ENABLE_EXTERNAL and + AG_GST_ARG_ENABLE_EXPERIMENTAL instead of duplicating those macros + in configure.ac. + +2007-09-25 05:03:58 +0000 Sebastian Dröge + + gst/qtdemux/qtdemux.c: Add fourccs for MPEG2 HDV streams. Fixes #479960. + Original commit message from CVS: + Patch by: + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add fourccs for MPEG2 HDV streams. Fixes #479960. + +2007-09-24 10:53:36 +0000 Stefan Kost + + Massive leak fixing, plus code cleanups. + Original commit message from CVS: + * ext/audioresample/gstaudioresample.c: + * ext/x264/gstx264enc.c: + * gst/dvdspu/gstdvdspu.c: + * gst/dvdspu/gstdvdspu.h: + * gst/festival/gstfestival.c: + * gst/h264parse/gsth264parse.c: + * gst/mpegtsparse/mpegtspacketizer.c: + * gst/mpegtsparse/mpegtsparse.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/nuvdemux/gstnuvdemux.c: + * sys/dshowsrcwrapper/gstdshowaudiosrc.c: + * sys/dshowsrcwrapper/gstdshowvideosrc.c: + * sys/vcd/vcdsrc.c: + Massive leak fixing, plus code cleanups. + +2007-09-23 18:57:14 +0000 Stefan Kost + + sys/oss/gstosshelper.c: Use GST_WARNING instead of a g_critical. This situation is not caused by the application. + Original commit message from CVS: + * sys/oss/gstosshelper.c: + Use GST_WARNING instead of a g_critical. This situation is not caused + by the application. + +2007-09-22 18:15:12 +0000 Thomas Vander Stichele + + po/: Updated translations. + Original commit message from CVS: + * po/LINGUAS: + * po/nl.po: + Updated translations. + +2007-09-22 18:13:58 +0000 Thomas Vander Stichele + + po/eu.po: Added Basque translation. + Original commit message from CVS: + translated by: Mikel Olasagasti + * po/eu.po: + Added Basque translation. + +2007-09-22 18:13:10 +0000 Thomas Vander Stichele + + po/: Added Chinese (traditional and Hong Kong) translation. + Original commit message from CVS: + translated by: Abel Cheung + * po/zh_HK.po: + * po/zh_TW.po: + Added Chinese (traditional and Hong Kong) translation. + +2007-09-22 18:10:42 +0000 Thomas Vander Stichele + + po/pl.po: Added Polish translation. + Original commit message from CVS: + translated by: Jakub Bogusz + * po/pl.po: + Added Polish translation. + +2007-09-22 18:09:59 +0000 Thomas Vander Stichele + + po/fi.po: Added Finnish translation. + Original commit message from CVS: + translated by: Ilkka Tuohela + * po/fi.po: + Added Finnish translation. + +2007-09-22 18:09:09 +0000 Thomas Vander Stichele + + po/es.po: Added Spanish translation. + Original commit message from CVS: + translated by: Jorge González González + * po/es.po: + Added Spanish translation. + +2007-09-22 18:08:13 +0000 Thomas Vander Stichele + + po/da.po: Added Danish translation. + Original commit message from CVS: + translated by: Mogens Jaeger + * po/da.po: + Added Danish translation. + +2007-09-22 18:06:55 +0000 Thomas Vander Stichele + + po/zh_CN.po: Added Chinese (simplified) translation. + Original commit message from CVS: + translated by: Funda Wang + * po/zh_CN.po: + Added Chinese (simplified) translation. + +2007-09-22 18:05:37 +0000 Thomas Vander Stichele + + po/bg.po: Added Bulgarian translation. + Original commit message from CVS: + translated by: Alexander Shopov + * po/bg.po: + Added Bulgarian translation. + +2007-09-22 08:12:57 +0000 Thomas Vander Stichele + + * common: + * sys/directdraw/gstdirectdrawsink.c: + * sys/directdraw/gstdirectdrawsink.h: + fix header and comments + Original commit message from CVS: + fix header and comments + +2007-09-21 11:34:34 +0000 Wim Taymans + + gst/rtp/gstrtpamrdepay.c: Set outgoing packet duration because we can. Fixes #478244 some more. + Original commit message from CVS: + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_process): + Set outgoing packet duration because we can. Fixes #478244 some more. + +2007-09-20 13:35:34 +0000 Stefan Kost + + ext/cairo/gsttextoverlay.c: Add info about static leak. + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: + Add info about static leak. + * tests/check/Makefile.am: + * tests/check/generic/states.c: + Improved state change unit test. + +2007-09-19 18:19:49 +0000 Stefan Kost + + Ignore registries in any format. + Original commit message from CVS: + * docs/plugins/.cvsignore: + * tests/check/.cvsignore: + Ignore registries in any format. + +2007-09-19 16:24:09 +0000 Wim Taymans + + gst/rtp/gstrtpL16pay.c: Removed some unused code. + Original commit message from CVS: + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_handle_buffer): + Removed some unused code. + * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_handle_buffer): + * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_handle_buffer): + * gst/rtp/gstrtpmp2tpay.c: (gst_rtp_mp2t_pay_handle_buffer): + * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_handle_buffer): + * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_init_packet), + (gst_rtp_theora_pay_flush_packet): + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_flush_packet): + Try to preserve the incomming buffer duration on the outgoing + packets. Fixes #478244. + +2007-09-19 10:22:40 +0000 Tim-Philipp Müller + + ext/taglib/: Work around compiler warnings with g++-4.2 when assigning a string constant to a gchar * (partially fixe... + Original commit message from CVS: + * ext/taglib/gstapev2mux.cc: + * ext/taglib/gstid3v2mux.cc: + Work around compiler warnings with g++-4.2 when assigning a + string constant to a gchar * (partially fixes #478092). + +2007-09-18 16:44:46 +0000 Tim-Philipp Müller + + configure.ac: We require core CVS now for gst_base_src_set_do_timestamp(). + Original commit message from CVS: + * configure.ac: + We require core CVS now for gst_base_src_set_do_timestamp(). + +2007-09-18 13:55:06 +0000 Stefan Kost + + gst/spectrum/: Handling window resize. + Original commit message from CVS: + * gst/spectrum/demo-audiotest.c: + * gst/spectrum/demo-osssrc.c: + Handling window resize. + +2007-09-18 11:45:06 +0000 Stefan Kost + + ChangeLog: Add missing newline. + Original commit message from CVS: + * ChangeLog: + Add missing newline. + * gst/librfb/rfbdecoder.c: + Fix the build (missing stdlib.h). + * gst/spectrum/gstspectrum.c: + * gst/spectrum/gstspectrum.h: + Use basetransform segment so that it is correctly managed on flushes + and start/stop. Report message timestamp as stream time, which is what + an application can understand. (Yes these are adapted from wim recent + level element changes) + +2007-09-17 17:35:13 +0000 Jan Schmidt + + gst/: Fix compiler warnings shown with Forte. + Original commit message from CVS: + * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_class_init): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), + (new_session_pad), (request_pt_map), (gst_rtspsrc_do_stream_eos), + (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_parse_rtpinfo), + (gst_rtspsrc_handle_message): + Fix compiler warnings shown with Forte. + +2007-09-17 02:05:14 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Give meaningfull error when all streams failed to configure for some reason. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams), + (gst_rtspsrc_dup_printf): + Give meaningfull error when all streams failed to configure for some + reason. + +2007-09-16 19:13:58 +0000 Wim Taymans + + gst/rtp/README: Update README with the design for synchronisation rules of RTP on sender and receiver. + Original commit message from CVS: + * gst/rtp/README: + Update README with the design for synchronisation rules of RTP on + sender and receiver. + +2007-09-14 09:40:49 +0000 Sebastian Dröge + + gst/wavparse/gstwavparse.c: Don't push EOS from the chain function, the element driving the pipeline is responsible f... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_loop), + (gst_wavparse_chain): + Don't push EOS from the chain function, the element + driving the pipeline is responsible for this. The bug + this was meant to fix seems to be queue not forwarding + EOS in all cases (see #476514). + +2007-09-13 17:31:16 +0000 Wim Taymans + + gst/level/gstlevel.*: Use basetransform segment so that it is correctly managed on flushes and start/stop. + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_class_init), (gst_level_start), + (gst_level_transform_ip): + * gst/level/gstlevel.h: + Use basetransform segment so that it is correctly managed on flushes and + start/stop. + Report message timestamp as stream time, which is what an application + can understand. + +2007-09-13 15:04:15 +0000 Sebastian Dröge + + Update my mail address. + Original commit message from CVS: + * ext/taglib/gstapev2mux.cc: + * ext/taglib/gstapev2mux.h: + * ext/taglib/gsttaglibmux.c: + * tests/check/elements/apev2mux.c: + Update my mail address. + +2007-09-13 12:37:56 +0000 Sebastian Dröge + + gst/wavparse/gstwavparse.c: Add EOS logic for the push-based mode too. Fixes #476514. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_eos), + (gst_wavparse_loop), (gst_wavparse_chain): + Add EOS logic for the push-based mode too. Fixes #476514. + +2007-09-12 22:01:59 +0000 Wim Taymans + + gst/law/: Fix law encoder timestamps. + Original commit message from CVS: + * gst/law/alaw-encode.c: (gst_alawenc_init), (gst_alawenc_chain): + * gst/law/alaw-encode.h: + * gst/law/mulaw-encode.c: (gst_mulawenc_init), + (gst_mulawenc_chain): + * gst/law/mulaw-encode.h: + Fix law encoder timestamps. + +2007-09-12 09:13:39 +0000 Stefan Kost + + ext/gconf/gstgconfaudiosink.c: Fix warning when building without debug. + Original commit message from CVS: + * ext/gconf/gstgconfaudiosink.c: + Fix warning when building without debug. + * sys/oss/gstossmixertrack.c: + Use const like in alsamixertrack.c (fixes warnings). + +2007-09-12 08:38:21 +0000 Peter Kjellerstedt + + gst/: Printf format fixes (#476128). + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst-libs/gst/app/gstappsink.c: + * gst/flv/gstflvdemux.c: + * gst/flv/gstflvparse.c: + * gst/interleave/deinterleave.c: + * gst/switch/gstswitch.c: + Printf format fixes (#476128). + +2007-09-11 15:37:55 +0000 Wim Taymans + + sys/v4l2/v4l2src_calls.c: Fix framerate detection code some more. + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: + (gst_v4l2src_probe_caps_for_format_and_size): + Fix framerate detection code some more. + Handle the case where there is a weird step in the stepwise framerates. + Don't overwrite the min interval with the framerate, use a temp variable + instead. + Use max in the Continuous framerate intervals instead of step, which is + 1 according to the docs. Fixes #475424. + +2007-09-10 19:53:28 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Make udpsrc timestamp outgoing buffers based on when they were received. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create): + Make udpsrc timestamp outgoing buffers based on when they were received. + Also make it output a segment in time. + +2007-09-10 06:49:32 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Plug a little leak. Little code cleanups. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Plug a little leak. Little code cleanups. + +2007-09-09 18:08:36 +0000 Tim-Philipp Müller + + configure.ac: Use AC_TRY_COMPILE instead of AC_TRY_RUN to check for old flac versions, 's good for cross-compilation ... + Original commit message from CVS: + * configure.ac: + Use AC_TRY_COMPILE instead of AC_TRY_RUN to check for old + flac versions, 's good for cross-compilation karma. + +2007-09-07 18:04:41 +0000 Haakon Sporsheim + + gst/rtp/gstrtph263pay.c: Fix up header structure so that compilers don't add padding between the structure fields, si... + Original commit message from CVS: + Patch by: Haakon Sporsheim + * gst/rtp/gstrtph263pay.c: + Fix up header structure so that compilers don't add padding + between the structure fields, since that would lead to us + sending RTP packets with broken headers (as is currently the + case when compiling with MSVC). Also see similar fixes in + libgstrtp in gst-plugins-base. (#474616; #471194) + +2007-09-07 16:04:14 +0000 Wim Taymans + + sys/v4l2/v4l2src_calls.c: Don't overwrite our GValue with 0 but instead use the previously computed value. Fixes #471... + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: + (gst_v4l2src_probe_caps_for_format_and_size): + Don't overwrite our GValue with 0 but instead use the previously + computed value. Fixes #471823 some more. + +2007-09-07 15:54:38 +0000 Sebastian Dröge + + gst/spectrum/gstspectrum.c: Use the correct parameter order for the memset calls. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_start), + (gst_spectrum_transform_ip): + Use the correct parameter order for the memset calls. + Thanks to Christian Schaller for noticing. + +2007-09-06 12:00:36 +0000 Tim-Philipp Müller + + docs/plugins/gst-plugins-good-plugins.hierarchy: No tabs in this file please, or gtk-doc will end up documenting rath... + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + No tabs in this file please, or gtk-doc will end up documenting + rather absurd class hierarchies. + +2007-09-06 10:48:56 +0000 Tim-Philipp Müller + + ext/gconf/gstswitchsink.c: If the new kid element fails to change state for some reason forward the error message it ... + Original commit message from CVS: + * ext/gconf/gstswitchsink.c: + If the new kid element fails to change state for some reason + (e.g. esdsink not being able to connect to the sound server), + forward the error message it posted on the bus instead of just + posting a generic 'Internal state change error: please file a + bug' error message. Fixes #471364. + +2007-09-06 07:21:22 +0000 Sebastian Dröge + + Port GstSpectrum to GstAudioFilter and libgstfft, add support for int32, float and double, use floats for the message... + Original commit message from CVS: + * configure.ac: + * gst/spectrum/Makefile.am: + * gst/spectrum/demo-audiotest.c: (draw_spectrum), + (message_handler), (main): + * gst/spectrum/demo-osssrc.c: (draw_spectrum), (message_handler): + * gst/spectrum/gstspectrum.c: (gst_spectrum_base_init), + (gst_spectrum_class_init), (gst_spectrum_init), + (gst_spectrum_dispose), (gst_spectrum_set_property), + (gst_spectrum_get_property), (gst_spectrum_start), + (gst_spectrum_setup), (gst_spectrum_message_new), + (gst_spectrum_transform_ip): + * gst/spectrum/gstspectrum.h: + Port GstSpectrum to GstAudioFilter and libgstfft, add support + for int32, float and double, use floats for the message contents, + average all FFTs done in one interval for better results, use + a better windowing function, allow posting the phase in the message + and actually do an FFT with the requested number of bands instead + of interpolating. + * tests/check/elements/spectrum.c: (GST_START_TEST), + (spectrum_suite): + Improve the units tests by checking for a 11025Hz sine wave + and add unit tests for all 4 supported sample types. + +2007-09-05 16:23:21 +0000 Tim-Philipp Müller + + gst/qtdemux/: Don't assume tags are encoded as UTF-8 (#473670). + Original commit message from CVS: + * gst/qtdemux/Makefile.am: + * gst/qtdemux/qtdemux.c: + Don't assume tags are encoded as UTF-8 (#473670). + +2007-09-05 14:43:16 +0000 Tim-Philipp Müller + + sys/v4l2/: Implement LATENCY queries in the crudest way possible so I don't have to use sync=false any longer when te... + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2src_calls.c: + Implement LATENCY queries in the crudest way possible so I don't + have to use sync=false any longer when testing with videosinks. + +2007-09-05 09:25:23 +0000 Tim-Philipp Müller + + configure.ac: Fix build. + Original commit message from CVS: + * configure.ac: + Fix build. + +2007-09-05 00:12:46 +0000 Wim Taymans + + sys/v4l2/v4l2src_calls.c: Add some more debugging in the framerate function. + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: + (gst_v4l2src_probe_caps_for_format_and_size): + Add some more debugging in the framerate function. + Iterate stepwise framerate up to and _including_ the max and if nothing + was added to the list, add a dummy 0/1 to 100/1 framerate so that we + don't end up with an empty list. + +2007-09-04 22:42:21 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.c: Add property do configure destination address/port pairs + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_set_clients_string), + (gst_multiudpsink_get_clients_string), + (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), + (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal), + (gst_multiudpsink_add), (gst_multiudpsink_clear_internal), + (gst_multiudpsink_clear): + Add property do configure destination address/port pairs + API:GstMultiUDPSink::clients + +2007-09-04 18:30:22 +0000 Wim Taymans + + tests/examples/: Added some RTP example scripts for sending and receiving RTP streams. + Original commit message from CVS: + * tests/examples/Makefile.am: + * tests/examples/rtp/Makefile.am: + * tests/examples/rtp/client-H263p-AMR.sh: + * tests/examples/rtp/client-H263p-PCMA.sdp: + * tests/examples/rtp/client-H263p-PCMA.sh: + * tests/examples/rtp/client-H264-PCMA.sdp: + * tests/examples/rtp/client-H264-PCMA.sh: + * tests/examples/rtp/client-PCMA.sh: + * tests/examples/rtp/server-VTS-H263p-ATS-PCMA.sh: + * tests/examples/rtp/server-alsasrc-PCMA.sh: + * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: + * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: + Added some RTP example scripts for sending and receiving RTP streams. + +2007-09-04 16:40:05 +0000 Wim Taymans + + sys/v4l2/gstv4l2src.c: Restructure the setcaps function so that we can also compute the expected GStreamer output siz... + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2_get_caps_info), + (gst_v4l2src_set_caps), (gst_v4l2src_get_mmap): + Restructure the setcaps function so that we can also compute the + expected GStreamer output size of the video frames. + Set frame_byte_size correctly so that read-based devices have a chance + of working correctly. + When grabbing a frame, discard frames that are not of the expected size. + Some cameras don't output the right framesize for the first buffer. + Try only a couple of times to get a valid frame, else error out. + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_get_input): + Add some more debug info when scanning the device. + * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_new), + (gst_v4l2_buffer_pool_new), (gst_v4l2_buffer_pool_activate), + (gst_v4l2src_fill_format_list), (gst_v4l2src_grab_frame), + (gst_v4l2src_set_capture), (gst_v4l2src_capture_init): + Add some more debug info when dequeing a frame. + +2007-09-04 14:37:22 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: More code cleanups. Add some more comment and improve debugs logs. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + More code cleanups. Add some more comment and improve debugs logs. + +2007-09-04 07:58:36 +0000 Stefan Kost + + gst/wavparse/gstwavparse.*: Implement seek-query. Refactor duration calculations. Appropriate use of uint64_scale_int... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + * gst/wavparse/gstwavparse.h: + Implement seek-query. Refactor duration calculations. Appropriate use + of uint64_scale_int and uint64_scale. Move repeadedly calculated stuff + out of loops. + +2007-09-03 07:44:34 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Implement seek-query. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Implement seek-query. + +2007-08-29 21:43:08 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Use new basesink async property to make sparse RTCP packet not wait for preroll. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_udp_sink), + (gst_rtspsrc_dup_printf): + Use new basesink async property to make sparse RTCP packet not wait for + preroll. + +2007-08-27 14:44:19 +0000 Jan Schmidt + + gst/audiofx/Makefile.am: Dist the right file. + Original commit message from CVS: + * gst/audiofx/Makefile.am: + Dist the right file. + +2007-08-23 16:27:36 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Make sure we generate and parse floating point values in the POSIX locale instead of the curre... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_dup_printf), + (gst_rtspsrc_get_float), (gst_rtspsrc_play): + Make sure we generate and parse floating point values in the POSIX + locale instead of the current locale. + +2007-08-22 15:01:29 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Fix method detection again. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_do_seek), + (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), + (gst_rtspsrc_play): + * gst/rtsp/gstrtspsrc.h: + Fix method detection again. + Keep track of when we must send a Range header. + Use segment values for Range, Speed and Scale headers. + Parse Speed and Scale headers to update the segment values. + +2007-08-22 08:22:50 +0000 Mark Nauwelaerts + + sys/v4l2/v4l2src_calls.c: Handle optional v4l2 ioctls gracefully. + Original commit message from CVS: + patch by: Mark Nauwelaerts + * sys/v4l2/v4l2src_calls.c: + Handle optional v4l2 ioctls gracefully. + +2007-08-20 16:52:03 +0000 Wim Taymans + + gst/rtp/: Added an H263 depayloader. Fixes #369392. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_base_init), + (gst_rtp_h263_depay_class_init), (gst_rtp_h263_depay_init), + (gst_rtp_h263_depay_finalize), (gst_rtp_h263_depay_setcaps), + (gst_rtp_h263_depay_process), (gst_rtp_h263_depay_set_property), + (gst_rtp_h263_depay_get_property), + (gst_rtp_h263_depay_change_state), + (gst_rtp_h263_depay_plugin_init): + * gst/rtp/gstrtph263depay.h: + Added an H263 depayloader. Fixes #369392. + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), + (gst_rtp_h263p_depay_process): + * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), + (gst_rtp_h263p_pay_class_init), (gst_rtp_h263p_pay_flush): + Make the H263+ pay/depayloader support H263-1998 and H263-2000 + payloads. + Also alow plain H263 on the h263p payloaders. Fixes #465040. + +2007-08-19 19:16:33 +0000 Sebastian Dröge + + gst/filter/: Add small comparision with the chebyshev filters in the docs. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: + * gst/filter/gstlpwsinc.c: + Add small comparision with the chebyshev filters in the docs. + +2007-08-19 19:11:04 +0000 Sebastian Dröge + + gst/audiofx/: Add small comparision with the windowed sinc filters in the docs. + Original commit message from CVS: + * gst/audiofx/audiochebyshevfreqband.c: + * gst/audiofx/audiochebyshevfreqlimit.c: + Add small comparision with the windowed sinc filters in the docs. + +2007-08-19 19:01:45 +0000 Sebastian Dröge + + tests/check/elements/: Also test everything in 32 bit float mode. + Original commit message from CVS: + * tests/check/elements/bpwsinc.c: (GST_START_TEST), + (bpwsinc_suite): + * tests/check/elements/lpwsinc.c: (GST_START_TEST), + (lpwsinc_suite): + Also test everything in 32 bit float mode. + +2007-08-19 18:47:19 +0000 Sebastian Dröge + + tests/check/elements/: Also test 32 bit float mode and the type 2 variants of the filters. + Original commit message from CVS: + * tests/check/elements/audiochebyshevfreqband.c: (GST_START_TEST), + (audiochebyshevfreqband_suite): + * tests/check/elements/audiochebyshevfreqlimit.c: (GST_START_TEST), + (audiochebyshevfreqlimit_suite): + Also test 32 bit float mode and the type 2 variants of the filters. + +2007-08-18 19:44:55 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Refactor the udp and interleaved loop function a bit. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_loop_send_cmd), + (gst_rtspsrc_loop): + Refactor the udp and interleaved loop function a bit. + +2007-08-17 17:08:11 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Protect connection activity with a new lock, avoids deadlocks when going to PAUSED. Fixes #455... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_finalize), (gst_rtspsrc_connection_send), + (gst_rtspsrc_connection_receive), (gst_rtspsrc_sink_chain), + (gst_rtspsrc_handle_request), (gst_rtspsrc_send_keep_alive), + (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), + (gst_rtspsrc_try_send), (gst_rtspsrc_pause): + * gst/rtsp/gstrtspsrc.h: + Protect connection activity with a new lock, avoids deadlocks when going + to PAUSED. Fixes #455808. + +2007-08-17 15:30:39 +0000 Wim Taymans + + gst/debug/rndbuffersize.c: Fix debug statement. + Original commit message from CVS: + * gst/debug/rndbuffersize.c: (gst_rnd_buffer_size_loop): + Fix debug statement. + +2007-08-17 15:28:40 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Fix stray %u in debug line as spotted by Saur on IRC. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_do_stream_eos): + Fix stray %u in debug line as spotted by Saur on IRC. + +2007-08-17 15:05:17 +0000 Sebastian Dröge + + Use generator macros for the process functions for the different sample types, add lower upper boundaries for the GOb... + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), + (bpwsinc_set_property), (bpwsinc_get_property): + * gst/filter/gstbpwsinc.h: + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), + (gst_lpwsinc_init), (lpwsinc_build_kernel), (lpwsinc_set_property), + (lpwsinc_get_property): + * gst/filter/gstlpwsinc.h: + * tests/check/elements/lpwsinc.c: (GST_START_TEST): + Use generator macros for the process functions for the different + sample types, add lower upper boundaries for the GObject properties + so automatically generated UIs can use sliders and change frequency + properties to floats to save a bit of memory, even ints would in + theory be enough. Also rename frequency to cutoff for consistency + reasons. + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.signals: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + Regenerated for the above changes. + +2007-08-17 14:43:33 +0000 Sebastian Dröge + + gst/audiofx/: Use generator macros for the process functions for the different sample types, add lower upper boundari... + Original commit message from CVS: + * gst/audiofx/audiochebyshevfreqband.c: + (gst_audio_chebyshev_freq_band_class_init): + * gst/audiofx/audiochebyshevfreqlimit.c: + (gst_audio_chebyshev_freq_limit_class_init): + Use generator macros for the process functions for the different + sample types, add lower upper boundaries for the GObject properties + so automatically generated UIs can use sliders and add a note about + the number of poles as a too high number of poles combined with + very low or very high frequencies will produce only noise. + * docs/plugins/gst-plugins-good-plugins.args: + Regenerated for the property changes. + +2007-08-17 14:15:19 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Improve timeout handling. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_property), + (gst_rtspsrc_flush), (gst_rtspsrc_sink_chain), + (gst_rtspsrc_stream_configure_udp_sink), + (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_loop_send_cmd), + (gst_rtspsrc_try_send), (gst_rtspsrc_send), + (gst_rtspsrc_parse_methods), (gst_rtspsrc_parse_range), + (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_pause), + (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Improve timeout handling. + Use the same socket for sending and receiving RTCP packets so that some + servers can track clients better. + Improve connection closed handling. Try to reconnect. + Don't overwrite our content base with NULL. + Improve debugging. + Improve range parsing and handling. + Remove flushing hack now that core does the right thing. + +2007-08-17 13:59:15 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.*: Add support for getting and setting the socket to use. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_set_property), + (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), + (gst_multiudpsink_close), (gst_multiudpsink_add): + * gst/udp/gstmultiudpsink.h: + Add support for getting and setting the socket to use. + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_get_property): + Add support for getting the currently used socket. + +2007-08-16 19:22:48 +0000 Sebastian Dröge + + gst/filter/gstbpwsinc.*: Implement latency query and only forward those samples downstream that actually contain the ... + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), + (gst_bpwsinc_init), (process_32), (process_64), + (bpwsinc_build_kernel), (bpwsinc_push_residue), + (bpwsinc_transform), (bpwsinc_start), (bpwsinc_query), + (bpwsinc_query_type), (bpwsinc_event), (bpwsinc_set_property): + * gst/filter/gstbpwsinc.h: + Implement latency query and only forward those samples downstream + that actually contain the data we want, i.e. drop kernel_length/2 + in the beginning and append kernel_length/2 (created by convolving + the filter kernel with zeroes) to the end. + * tests/check/elements/bpwsinc.c: (GST_START_TEST): + Adjust the unit test for this slightly changed behaviour. + * gst/filter/gstlpwsinc.c: (lpwsinc_build_kernel): + Reset residue length only when actually creating a residue. + +2007-08-16 17:02:07 +0000 Sebastian Dröge + + gst/audiofx/: Add Chebyshev lowpass/highpass and bandpass/bandreject elements. + Original commit message from CVS: + reviewed by: Stefan Kost + * gst/audiofx/Makefile.am: + * gst/audiofx/audiochebyshevfreqband.c: + (gst_audio_chebyshev_freq_band_mode_get_type), + (gst_audio_chebyshev_freq_band_base_init), + (gst_audio_chebyshev_freq_band_dispose), + (gst_audio_chebyshev_freq_band_class_init), + (gst_audio_chebyshev_freq_band_init), + (generate_biquad_coefficients), (calculate_gain), + (generate_coefficients), + (gst_audio_chebyshev_freq_band_set_property), + (gst_audio_chebyshev_freq_band_get_property), + (gst_audio_chebyshev_freq_band_setup), (process), (process_64), + (process_32), (gst_audio_chebyshev_freq_band_transform_ip), + (gst_audio_chebyshev_freq_band_start): + * gst/audiofx/audiochebyshevfreqband.h: + * gst/audiofx/audiochebyshevfreqlimit.c: + (gst_audio_chebyshev_freq_limit_mode_get_type), + (gst_audio_chebyshev_freq_limit_base_init), + (gst_audio_chebyshev_freq_limit_dispose), + (gst_audio_chebyshev_freq_limit_class_init), + (gst_audio_chebyshev_freq_limit_init), + (generate_biquad_coefficients), (calculate_gain), + (generate_coefficients), + (gst_audio_chebyshev_freq_limit_set_property), + (gst_audio_chebyshev_freq_limit_get_property), + (gst_audio_chebyshev_freq_limit_setup), (process), (process_64), + (process_32), (gst_audio_chebyshev_freq_limit_transform_ip), + (gst_audio_chebyshev_freq_limit_start): + * gst/audiofx/audiochebyshevfreqlimit.h: + * gst/audiofx/audiofx.c: (plugin_init): + Add Chebyshev lowpass/highpass and bandpass/bandreject elements. + Fixes #464800. + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/audiochebyshevfreqband.c: + (setup_audiochebyshevfreqband), (cleanup_audiochebyshevfreqband), + (GST_START_TEST), (audiochebyshevfreqband_suite), (main): + * tests/check/elements/audiochebyshevfreqlimit.c: + (setup_audiochebyshevfreqlimit), (cleanup_audiochebyshevfreqlimit), + (GST_START_TEST), (audiochebyshevfreqlimit_suite), (main): + Add unit tests for the chebyshev filters. + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + And add docs for the chebyshev filters. While doing + that also run make update in docs/plugins. + +2007-08-16 12:15:06 +0000 Stefan Kost + + Make ro memory to share. + Original commit message from CVS: + * ext/annodex/gstcmmltag.c: + * gst/rtp/gstrtpvorbispay.c: + Make ro memory to share. + +2007-08-16 11:49:01 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Improve UDP performance by avoiding a select() when we have data available immediatly. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Improve UDP performance by avoiding a select() when we have data + available immediatly. + +2007-08-16 11:47:19 +0000 Wim Taymans + + gst/rtsp/gstrtpdec.*: Add (dummy) SSRC management signals. + Original commit message from CVS: + * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_marshal_VOID__UINT_UINT), + (gst_rtp_dec_class_init): + * gst/rtsp/gstrtpdec.h: + Add (dummy) SSRC management signals. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), + (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), + (find_stream), (gst_rtspsrc_create_stream), (new_session_pad), + (request_pt_map), (gst_rtspsrc_do_stream_eos), (on_bye_ssrc), + (on_timeout), (gst_rtspsrc_stream_configure_manager), + (gst_rtspsrc_stream_push_event), (gst_rtspsrc_push_event), + (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_parse_rtpinfo), + (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Add connection-speed property. + Add find_stream helper functions. + Handle stream EOS based on BYE messages or SSRC timeout. + Returns SUCCESS from the state change function as we hide our async + elements from the parent. + +2007-08-16 09:48:27 +0000 Sebastian Dröge + + gst/filter/gstlpwsinc.*: Implement latency query and only forward those samples downstream that actually contain the ... + Original commit message from CVS: + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), + (gst_lpwsinc_init), (process_32), (process_64), + (lpwsinc_build_kernel), (lpwsinc_push_residue), + (lpwsinc_transform), (lpwsinc_start), (lpwsinc_query), + (lpwsinc_query_type), (lpwsinc_event), (lpwsinc_set_property): + * gst/filter/gstlpwsinc.h: + Implement latency query and only forward those samples downstream + that actually contain the data we want, i.e. drop kernel_length/2 + in the beginning and append kernel_length/2 (created by convolving + the filter kernel with zeroes) to the end. + * tests/check/elements/lpwsinc.c: (GST_START_TEST): + Adjust the unit test for this slightly changed behaviour. + +2007-08-16 07:40:48 +0000 Stefan Kost + + gst/debug/rndbuffersize.c: Fix da leak. + Original commit message from CVS: + * gst/debug/rndbuffersize.c: + Fix da leak. + +2007-08-14 13:50:43 +0000 Stefan Kost + + gst/debug/: Add new test element and clean-up the others a little. + Original commit message from CVS: + * gst/debug/Makefile.am: + * gst/debug/breakmydata.c: + * gst/debug/gstdebug.c: + * gst/debug/negotiation.c: + * gst/debug/progressreport.c: + * gst/debug/rndbuffersize.c: + * gst/debug/testplugin.c: + Add new test element and clean-up the others a little. + +2007-08-13 13:50:39 +0000 Sebastian Dröge + + Add docs for lpwsinc and bpwsinc and integrate them into the build system. While doing that also update all other doc... + Original commit message from CVS: + * 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.signals: + * docs/plugins/inspect/plugin-bz2.xml: + * docs/plugins/inspect/plugin-cdxaparse.xml: + * docs/plugins/inspect/plugin-dtsdec.xml: + * docs/plugins/inspect/plugin-faac.xml: + * docs/plugins/inspect/plugin-faad.xml: + * docs/plugins/inspect/plugin-filter.xml: + * docs/plugins/inspect/plugin-freeze.xml: + * docs/plugins/inspect/plugin-gsm.xml: + * docs/plugins/inspect/plugin-gstrtpmanager.xml: + * docs/plugins/inspect/plugin-h264parse.xml: + * docs/plugins/inspect/plugin-modplug.xml: + * docs/plugins/inspect/plugin-mpeg2enc.xml: + * docs/plugins/inspect/plugin-musepack.xml: + * docs/plugins/inspect/plugin-musicbrainz.xml: + * docs/plugins/inspect/plugin-nsfdec.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-soundtouch.xml: + * docs/plugins/inspect/plugin-spcdec.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speed.xml: + * docs/plugins/inspect/plugin-tta.xml: + * docs/plugins/inspect/plugin-videosignal.xml: + * docs/plugins/inspect/plugin-xingheader.xml: + * docs/plugins/inspect/plugin-xvid.xml: + * gst/filter/gstbpwsinc.c: + * gst/filter/gstbpwsinc.h: + * gst/filter/gstlpwsinc.c: + * gst/filter/gstlpwsinc.h: + Add docs for lpwsinc and bpwsinc and integrate them + into the build system. While doing that also update + all other docs via make update in docs/plugins. + +2007-08-12 20:55:01 +0000 Sebastian Dröge + + tests/check/elements/bpwsinc.c: Make one test constraint a bit stricter. + Original commit message from CVS: + * tests/check/elements/bpwsinc.c: (GST_START_TEST): + Make one test constraint a bit stricter. + +2007-08-12 20:53:11 +0000 Sebastian Dröge + + tests/check/: Add unit tests for bpwsinc, testing fundamental functionality again. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/bpwsinc.c: (setup_bpwsinc), + (cleanup_bpwsinc), (GST_START_TEST), (bpwsinc_suite), (main): + Add unit tests for bpwsinc, testing fundamental functionality again. + +2007-08-12 20:19:37 +0000 Sebastian Dröge + + tests/check/: Add unit tests for lpwsinc, testing fundamental functionality. + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/lpwsinc.c: (setup_lpwsinc), + (cleanup_lpwsinc), (GST_START_TEST), (lpwsinc_suite), (main): + Add unit tests for lpwsinc, testing fundamental functionality. + +2007-08-12 15:41:57 +0000 Sebastian Dröge + + gst/filter/: Improve debugging a bit. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (bpwsinc_build_kernel): + * gst/filter/gstlpwsinc.c: (lpwsinc_build_kernel): + Improve debugging a bit. + +2007-08-12 14:35:41 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Fix parsing of mp4a version 0 atoms. Fixes #465774. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_node): + Fix parsing of mp4a version 0 atoms. Fixes #465774. + +2007-08-12 12:46:20 +0000 Sebastian Dröge + + gst/filter/: Reset the residue in BaseTransform::start to get a clean residue on stream changes. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), + (bpwsinc_start): + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), + (lpwsinc_start): + Reset the residue in BaseTransform::start to get a clean residue + on stream changes. + +2007-08-11 15:58:30 +0000 Sebastian Dröge + + gst/filter/: Fix processing with buffer sizes that are larger than the filter kernel size. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (process_32), (process_64): + * gst/filter/gstlpwsinc.c: (process_32), (process_64): + Fix processing with buffer sizes that are larger than the filter + kernel size. + +2007-08-10 17:08:01 +0000 Stefan Kost + + gst/rtp/gstrtpilbcdepay.c: Include stdlib. + Original commit message from CVS: + * gst/rtp/gstrtpilbcdepay.c: + Include stdlib. + +2007-08-10 16:10:47 +0000 Wim Taymans + + gst/rtp/gstrtpmpvdepay.c: Set the mpegversion in the caps so that autoplugging does not get confused. + Original commit message from CVS: + * gst/rtp/gstrtpmpvdepay.c: + Set the mpegversion in the caps so that autoplugging does not get + confused. + +2007-08-10 05:51:40 +0000 Sebastian Dröge + + gst/filter/gstbpwsinc.c: Fix a segfault with more than one channel and don't rebuild the kernel & residue with every ... + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (bpwsinc_build_kernel): + Fix a segfault with more than one channel and don't rebuild + the kernel & residue with every buffer. + +2007-08-10 05:35:25 +0000 Sebastian Dröge + + gst/filter/gstbpwsinc.*: Add support for a bandreject mode and allow specifying the window function that should be used. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_mode_get_type), + (gst_bpwsinc_window_get_type), (gst_bpwsinc_class_init), + (gst_bpwsinc_init), (bpwsinc_build_kernel), (bpwsinc_set_property), + (bpwsinc_get_property): + * gst/filter/gstbpwsinc.h: + Add support for a bandreject mode and allow specifying the window + function that should be used. + * gst/filter/gstlpwsinc.c: + And another small formatting fix. + +2007-08-10 05:20:06 +0000 Sebastian Dröge + + gst/filter/gstbpwsinc.*: Apply the same changes to the bandpass filter: + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), + (gst_bpwsinc_init), (process_32), (process_64), + (bpwsinc_build_kernel), (bpwsinc_setup), (bpwsinc_get_unit_size), + (bpwsinc_transform), (bpwsinc_set_property), + (bpwsinc_get_property): + * gst/filter/gstbpwsinc.h: + Apply the same changes to the bandpass filter: + - Support double input + - Fix processing for input with >1 channels + - Specify frequency in Hz + - Specify actual filter kernel length + - Use transform instead of transform_ip as we're working + out of place anyway + - Factor out filter kernel generation and update the filter + kernel when the properties are set + Fix bandpass filter kernel generation to actually generate + a bandpass filter by creating a highpass instead of a second + lowpass. + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): + Small formatting fix. + +2007-08-10 04:44:43 +0000 Sebastian Dröge + + gst/filter/gstlpwsinc.*: Specify the actual filter length instead of a weird 2N+1. Setting the property will round to... + Original commit message from CVS: + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), + (gst_lpwsinc_init), (process_32), (process_64), + (lpwsinc_build_kernel), (lpwsinc_set_property), + (lpwsinc_get_property): + * gst/filter/gstlpwsinc.h: + Specify the actual filter length instead of a weird + 2N+1. Setting the property will round to the next odd number. + Also remove now obsolete FIXMEs. + +2007-08-10 04:32:47 +0000 Sebastian Dröge + + gst/filter/gstlpwsinc.*: Allow choosing between hamming and blackman window. The blackman window provides a better st... + Original commit message from CVS: + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_window_get_type), + (gst_lpwsinc_class_init), (gst_lpwsinc_init), + (lpwsinc_build_kernel), (lpwsinc_set_property), + (lpwsinc_get_property): + * gst/filter/gstlpwsinc.h: + Allow choosing between hamming and blackman window. The blackman + window provides a better stopband attenuation but a bit slower + rolloff. + +2007-08-10 04:21:39 +0000 Sebastian Dröge + + gst/filter/gstlpwsinc.*: Add a highpass mode. + Original commit message from CVS: + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_mode_get_type), + (gst_lpwsinc_class_init), (process_32), (process_64), + (lpwsinc_build_kernel), (lpwsinc_set_property), + (lpwsinc_get_property): + * gst/filter/gstlpwsinc.h: + Add a highpass mode. + +2007-08-10 04:06:53 +0000 Sebastian Dröge + + gst/filter/gstlpwsinc.c: Fix processing if the input has more than one channel. + Original commit message from CVS: + * gst/filter/gstlpwsinc.c: (process_32), (process_64), + (lpwsinc_build_kernel): + Fix processing if the input has more than one channel. + +2007-08-09 19:23:33 +0000 Sebastian Dröge + + gst/filter/gstbpwsinc.c: "this" is a C++ keyword, use "self" instead. + Original commit message from CVS: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), + (gst_bpwsinc_init), (bpwsinc_setup), (bpwsinc_transform_ip), + (bpwsinc_set_property), (bpwsinc_get_property): + "this" is a C++ keyword, use "self" instead. + Add TODOs and FIXMEs and remove two wrong FIXMEs. + * gst/filter/gstlpwsinc.c: + Add FIXMEs and a new TODO. + +2007-08-09 18:08:05 +0000 Sebastian Dröge + + gst/filter/gstlpwsinc.*: Add double support, replace "this" with "self" as the former is a C++ keyword. + Original commit message from CVS: + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), + (gst_lpwsinc_class_init), (gst_lpwsinc_init), (process_32), + (process_64), (lpwsinc_build_kernel), (lpwsinc_setup), + (lpwsinc_get_unit_size), (lpwsinc_transform), + (lpwsinc_set_property), (lpwsinc_get_property): + * gst/filter/gstlpwsinc.h: + Add double support, replace "this" with "self" as the former + is a C++ keyword. + Implement the frequency property in Hz instead of fraction + of sampling frequency. + Remove some unecessary FIXMEs and add some TODOs, add some + required locking and refactor the kernel generation into a + separate function that is also called when the properties + change now. + And use BaseTransform::transform instead of transform_ip + as the convolution is done out of place anyway. Should + be done in place later. + +2007-08-09 10:54:05 +0000 Thomas Vander Stichele + + po/: Updated translations. + Original commit message from CVS: + * po/hu.po: + * po/uk.po: + * po/vi.po: + Updated translations. + +2007-08-08 20:47:33 +0000 Sebastian Dröge + + gst/filter/: Use GstAudioFilter as base class and don't leak the memory of the filter kernel and residue. + Original commit message from CVS: + * gst/filter/Makefile.am: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), + (gst_bpwsinc_base_init), (gst_bpwsinc_class_init), + (gst_bpwsinc_init), (bpwsinc_setup): + * gst/filter/gstbpwsinc.h: + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), + (gst_lpwsinc_base_init), (gst_lpwsinc_class_init), + (gst_lpwsinc_init), (lpwsinc_setup): + * gst/filter/gstlpwsinc.h: + Use GstAudioFilter as base class and don't leak the memory + of the filter kernel and residue. + +2007-08-08 17:47:05 +0000 Michael Smith + + gst/videobox/gstvideobox.c: Render right border in the correct location. + Original commit message from CVS: + * gst/videobox/gstvideobox.c: (gst_video_box_ayuv_i420): + Render right border in the correct location. + +2007-08-08 10:54:50 +0000 Olivier Crete + + gst/rtp/: Make mode property a string. Fixes #464475. + Original commit message from CVS: + Patch by: Olivier Crete + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps): + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): + Make mode property a string. Fixes #464475. + +2007-08-05 14:58:20 +0000 Stefan Kost + + ext/flac/gstflacenc.c: Widen caps to match decoder a bit and add more FIXMEs. + Original commit message from CVS: + * ext/flac/gstflacenc.c: + Widen caps to match decoder a bit and add more FIXMEs. + +2007-08-05 14:53:36 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Fix ODML index tag numbering. Fixes #463624. + Original commit message from CVS: + patch by: Mark Nauwelaerts + * gst/avi/gstavimux.c: + Fix ODML index tag numbering. Fixes #463624. + +2007-08-03 16:08:56 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Fix default clock-rate for realmedia. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (get_default_rate_for_pt), + (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_stream_configure_tcp), + (gst_rtspsrc_stream_configure_udp_sink): + Fix default clock-rate for realmedia. + Fix parsing of transport. + Don't try to link NULL pads. + +2007-07-30 17:17:04 +0000 Tim-Philipp Müller + + po/POTFILES.skip: Add POTFILES.skip with list of source files that aren't disted at the moment but contain translatab... + Original commit message from CVS: + * po/POTFILES.skip: + Add POTFILES.skip with list of source files that aren't disted at the + moment but contain translatable strings. Should hopefully pacify + broken tools and make it clearer that these files are left out + intentionally (#461600). + +2007-07-30 12:41:58 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: If the buffer was entirely clipped ... don't try sending it :) + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_movie): + If the buffer was entirely clipped ... don't try sending it :) + +2007-07-27 16:56:45 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: If we don't hav a session manager, set the caps on outgoing buffers ourselves. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_activate_streams), + (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_parse_methods), + (gst_rtspsrc_create_transports_string), + (gst_rtspsrc_prepare_transports): + If we don't hav a session manager, set the caps on outgoing buffers + ourselves. + Force PAUSE/PLAY methods for now until the extensions can overwrite. + Append final bit of the transport string even when it does not contain a + placeholder. + +2007-07-27 11:21:20 +0000 Wim Taymans + + gst/rtsp/: Clean up the interface list. + Original commit message from CVS: + * gst/rtsp/gstrtspext.c: (gst_rtsp_ext_list_free), + (gst_rtsp_ext_list_connect): + * gst/rtsp/gstrtspext.h: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_finalize), (gst_rtspsrc_send_cb): + Clean up the interface list. + Allow connecting to interface signals for the extensions. + Remove old extension code. + Free list on cleanup. + Allow extensions to send additional RTSP messages. + +2007-07-27 10:38:34 +0000 Jan Schmidt + + ext/gconf/gconf.c: Handle a NULL gconf key gracefully by rendering the default element. + Original commit message from CVS: + * ext/gconf/gconf.c: (gst_gconf_render_bin_with_default): + Handle a NULL gconf key gracefully by rendering the default element. + +2007-07-27 10:11:18 +0000 Wim Taymans + + gst/rtsp/gstrtspext.h: Fix include path for extension interface. + Original commit message from CVS: + * gst/rtsp/gstrtspext.h: + Fix include path for extension interface. + +2007-07-26 19:45:30 +0000 Sebastian Dröge + + gst/audiofx/audioamplify.h: Also remove a now unecessary variable here. + Original commit message from CVS: + * gst/audiofx/audioamplify.h: + Also remove a now unecessary variable here. + +2007-07-26 19:41:07 +0000 Sebastian Dröge + + gst/audiofx/: Don't save format information ourselves, this is already saved in + Original commit message from CVS: + * gst/audiofx/audioamplify.c: (gst_audio_amplify_init), + (gst_audio_amplify_setup), (gst_audio_amplify_transform_ip): + * gst/audiofx/audiodynamic.c: + (gst_audio_dynamic_set_process_function), (gst_audio_dynamic_init), + (gst_audio_dynamic_setup), (gst_audio_dynamic_transform_ip): + * gst/audiofx/audiodynamic.h: + * gst/audiofx/audioinvert.c: (gst_audio_invert_init), + (gst_audio_invert_setup), (gst_audio_invert_transform_ip): + * gst/audiofx/audioinvert.h: + Don't save format information ourselves, this is already saved in + GstAudioFilter. + +2007-07-26 15:48:47 +0000 Wim Taymans + + gst/rtsp/: Use rank to filter out extensions. + Original commit message from CVS: + * gst/rtsp/gstrtspext.c: (gst_rtsp_ext_list_filter), + (gst_rtsp_ext_list_stream_select): + * gst/rtsp/gstrtspext.h: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams): + Use rank to filter out extensions. + Add url to stream_select interface call. + +2007-07-25 18:50:08 +0000 Wim Taymans + + gst/rtsp/: Use shiny new RTSP and SDP library. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/base64.c: + * gst/rtsp/base64.h: + * gst/rtsp/gstrtspext.c: (gst_rtsp_ext_list_filter), + (gst_rtsp_ext_list_init), (gst_rtsp_ext_list_get), + (gst_rtsp_ext_list_detect_server), (gst_rtsp_ext_list_before_send), + (gst_rtsp_ext_list_after_send), (gst_rtsp_ext_list_parse_sdp), + (gst_rtsp_ext_list_setup_media), + (gst_rtsp_ext_list_configure_stream), + (gst_rtsp_ext_list_get_transports), + (gst_rtsp_ext_list_stream_select): + * gst/rtsp/gstrtspext.h: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_lower_trans_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_init), + (gst_rtspsrc_finalize), (gst_rtspsrc_create_stream), + (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_flush), (gst_rtspsrc_do_seek), + (gst_rtspsrc_sink_chain), (gst_rtspsrc_stream_configure_manager), + (gst_rtspsrc_stream_configure_tcp), + (gst_rtspsrc_stream_configure_mcast), + (gst_rtspsrc_stream_configure_udp), + (gst_rtspsrc_stream_configure_udp_sink), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_handle_request), (gst_rtspsrc_send_keep_alive), + (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), + (gst_rtspsrc_loop_send_cmd), (gst_rtsp_auth_method_to_string), + (gst_rtspsrc_parse_auth_hdr), (gst_rtspsrc_setup_auth), + (gst_rtspsrc_try_send), (gst_rtspsrc_send), + (gst_rtspsrc_parse_methods), + (gst_rtspsrc_create_transports_string), + (gst_rtspsrc_prepare_transports), (gst_rtspsrc_setup_streams), + (gst_rtspsrc_parse_range), (gst_rtspsrc_open), (gst_rtspsrc_close), + (gst_rtspsrc_play), (gst_rtspsrc_pause), + (gst_rtspsrc_change_state), (gst_rtspsrc_uri_set_uri): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtsp.h: + * gst/rtsp/rtspconnection.c: + * gst/rtsp/rtspconnection.h: + * gst/rtsp/rtspdefs.c: + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspext.h: + * gst/rtsp/rtspextwms.c: + * gst/rtsp/rtspextwms.h: + * gst/rtsp/rtspmessage.c: + * gst/rtsp/rtspmessage.h: + * gst/rtsp/rtsprange.c: + * gst/rtsp/rtsprange.h: + * gst/rtsp/rtsptransport.c: + * gst/rtsp/rtsptransport.h: + * gst/rtsp/rtspurl.c: + * gst/rtsp/rtspurl.h: + * gst/rtsp/sdp.h: + * gst/rtsp/sdpmessage.c: + * gst/rtsp/sdpmessage.h: + * gst/rtsp/test.c: + Use shiny new RTSP and SDP library. + Implement RTSP extensions using the new interface. + Remove a lot of old code. + +2007-07-24 14:31:56 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Add codec mapping for '2vuy' (Raw YUV produced by FCP) and 'divx'. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add codec mapping for '2vuy' (Raw YUV produced by FCP) and 'divx'. + +2007-07-24 05:07:59 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackdec.c: Don't unref the outgoing buffer twice when dropping it because it's outside of the segment. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): + Don't unref the outgoing buffer twice when dropping it because it's + outside of the segment. + +2007-07-24 04:57:20 +0000 Sebastian Dröge + + Use the new buffer clipping function from gstaudio here and require gst-plugins-base CVS. + Original commit message from CVS: + * configure.ac: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), + (gst_wavpack_dec_chain), (gst_wavpack_dec_sink_event): + Use the new buffer clipping function from gstaudio here and + require gst-plugins-base CVS. + * tests/check/elements/wavpackdec.c: (GST_START_TEST): + For framed Wavpack buffers we require a valid timestamp. + +2007-07-23 18:03:54 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Clip raw audio and video when we can, keep track of current output segment. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), + (gst_qtdemux_clip_buffer), (gst_qtdemux_loop_state_movie), + (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): + Clip raw audio and video when we can, keep track of current output + segment. + Don't leak buffers and events when there is no output pad. + Improve debugging here and there. + +2007-07-23 09:02:07 +0000 Stefan Kost + + configure.ac: Sync liboil check with plugins-base. + Original commit message from CVS: + * configure.ac: + Sync liboil check with plugins-base. + +2007-07-20 11:37:37 +0000 Stefan Kost + + gst/equalizer/: Better algorith for the center frequencies. Subtract band filters from input for negative gains. Rewo... + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + (gst_iir_equalizer_band_set_property), + (gst_iir_equalizer_child_proxy_get_child_by_index), + (gst_iir_equalizer_child_proxy_get_children_count), + (gst_iir_equalizer_child_proxy_interface_init), + (gst_iir_equalizer_class_init), (arg_to_scale), (setup_filter), + (gst_iir_equalizer_compute_frequencies): + * gst/equalizer/gstiirequalizer10bands.c: + (gst_iir_equalizer_10bands_class_init): + * gst/equalizer/gstiirequalizer3bands.c: + (gst_iir_equalizer_3bands_class_init): + * gst/equalizer/gstiirequalizernbands.c: + Better algorith for the center frequencies. Subtract band filters from + input for negative gains. Rework the gain mapping. + +2007-07-20 07:41:58 +0000 Stefan Kost + + ext/annodex/Makefile.am: Fix CFLAGS/LIBS. + Original commit message from CVS: + * ext/annodex/Makefile.am: + Fix CFLAGS/LIBS. + * ext/cdio/gstcdiocddasrc.c: + * ext/libpng/gstpngdec.c: (gst_pngdec_task): + Include stdlib + * ext/cairo/Makefile.am: + * gst/videofilter/Makefile.am: + * tests/examples/level/Makefile.am: + Use $(LIBM) instead of -lm + +2007-07-18 11:55:13 +0000 Stefan Kost + + sys/v4l2/gstv4l2src.c: Add another example pipeline. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: + Add another example pipeline. + +2007-07-18 11:42:33 +0000 Alexander Eichner + + sys/v4l2/gstv4l2src.c: Use define here. + Original commit message from CVS: + Patch by: Alexander Eichner + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): + Use define here. + * sys/v4l2/gstv4l2tuner.c: + (gst_v4l2_tuner_set_frequency_and_notify): + Don't touch the property - its still disabled. + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format), + (gst_v4l2src_grab_frame), (gst_v4l2src_get_size_limits): + * sys/v4l2/v4l2src_calls.h: + Improve fallback format negotionation. Fixes #451388 + +2007-07-18 10:33:39 +0000 Stefan Kost + + tests/check/elements/videocrop.c: Fix the test. + Original commit message from CVS: + * tests/check/elements/videocrop.c: (GST_START_TEST): + Fix the test. + +2007-07-18 09:21:23 +0000 Stefan Kost + + More docs. More logs in pngdec. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-png.xml: + * ext/jpeg/gstjpegdec.c: + * ext/libpng/gstpngdec.c: (gst_pngdec_task), + (gst_pngdec_sink_setcaps): + More docs. More logs in pngdec. + +2007-07-18 07:51:11 +0000 Stefan Kost + + gst/multifile/gstmultifilesrc.c: Add example to the docs. Fix buffer-offset-end and add some debug. + Original commit message from CVS: + * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): + Add example to the docs. Fix buffer-offset-end and add some debug. + +2007-07-18 07:35:32 +0000 Stefan Kost + + Add stdlib include (free, atoi, exit). + Original commit message from CVS: + * examples/app/appsrc_ex.c: + * examples/switch/switcher.c: + * ext/neon/gstneonhttpsrc.c: + * ext/timidity/gstwildmidi.c: + * ext/x264/gstx264enc.c: + * gst/mve/mveaudioenc.c: (mve_compress_audio): + * gst/rtpmanager/gstrtpclient.c: + * gst/rtpmanager/gstrtpjitterbuffer.c: + * gst/spectrum/demo-audiotest.c: + * gst/spectrum/demo-osssrc.c: + * sys/dvb/gstdvbsrc.c: + Add stdlib include (free, atoi, exit). + +2007-07-17 11:35:29 +0000 Stefan Kost + + sys/v4l2/gstv4l2src.c: Initialize num_buffers with minimum value. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): + Initialize num_buffers with minimum value. + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_probe_caps_for_format), (gst_v4l2src_grab_frame): + Handle frame-size query failure gracefully. + +2007-07-16 12:11:36 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Fix parsing of esds atoms inside mp4a atoms so that we can set correct codec_info for AAC audi... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_node): + Fix parsing of esds atoms inside mp4a atoms so that we can set correct + codec_info for AAC audio. Fixes #457097 along with a whole other bunch + of qt/aac files. + +2007-07-16 09:16:03 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackdec.c: Fix buffer clipping to correctly clip to the segment stop. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: + (gst_wavpack_dec_clip_outgoing_buffer): + Fix buffer clipping to correctly clip to the segment stop. + +2007-07-13 16:31:27 +0000 Jan Schmidt + + Remove bogus check for libcheck, since we check for gstreamer-check and it pulls in the required info from there, and... + Original commit message from CVS: + * configure.ac: + * tests/Makefile.am: + Remove bogus check for libcheck, since we check for + gstreamer-check and it pulls in the required info from there, + and we weren't actually _using_ the information for libcheck + ourselves anyway. + +2007-07-12 11:21:01 +0000 Stefan Kost + + configure.ac: Use pkg-config to locate check. + Original commit message from CVS: + * configure.ac: + Use pkg-config to locate check. + +2007-07-11 23:43:25 +0000 Tim-Philipp Müller + + gst/: Fix build against core CVS. + Original commit message from CVS: + * gst/interleave/deinterleave.c: (gst_deinterleave_process): + * gst/vmnc/vmncdec.c: (vmnc_make_buffer): + Fix build against core CVS. + +2007-07-11 22:31:06 +0000 Tim-Philipp Müller + + Fix build against core CVS. + Original commit message from CVS: + * ext/cairo/gsttimeoverlay.c: (gst_cairo_time_overlay_transform): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_chain): + * ext/libpng/gstpngenc.c: (gst_pngenc_chain): + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): + * gst/debug/gstnavigationtest.c: (gst_navigationtest_transform): + * gst/effectv/gstaging.c: (gst_agingtv_transform): + * gst/effectv/gstdice.c: (gst_dicetv_transform): + * gst/effectv/gstedge.c: (gst_edgetv_transform): + * gst/effectv/gstquark.c: (gst_quarktv_transform): + * gst/effectv/gstrev.c: (gst_revtv_transform): + * gst/effectv/gstshagadelic.c: (gst_shagadelictv_transform): + * gst/effectv/gstvertigo.c: (gst_vertigotv_transform): + * gst/effectv/gstwarp.c: (gst_warptv_transform): + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_add_wvpk_header), + (gst_matroska_demux_check_subtitle_buffer), + (gst_matroska_decode_buffer): + * gst/videofilter/gstvideoflip.c: (gst_video_flip_transform): + Fix build against core CVS. + +2007-07-10 10:16:38 +0000 Edward Hervey + + gst/id3demux/gstid3demux.c: Don't return GST_FLOW_ERROR when pushing an event returns FALSE. We don't have enough gra... + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): + Don't return GST_FLOW_ERROR when pushing an event returns FALSE. We + don't have enough granularity to convert that boolean into a + GstFlowReturn. + +2007-07-06 15:00:47 +0000 Michael Smith + + gst/law/: Fix capsnego bogosity in *law decoders. + Original commit message from CVS: + * gst/law/alaw-decode.c: (alawdec_sink_setcaps), + (gst_alawdec_class_init), (gst_alawdec_init), (gst_alawdec_chain), + (gst_alawdec_change_state): + * gst/law/alaw-decode.h: + * gst/law/mulaw-decode.c: (mulawdec_sink_setcaps), + (gst_mulawdec_class_init), (gst_mulawdec_init), + (gst_mulawdec_chain), (gst_mulawdec_change_state): + * gst/law/mulaw-decode.h: + Fix capsnego bogosity in *law decoders. + +2007-07-06 14:35:59 +0000 Michael Smith + + ext/jpeg/gstsmokeenc.*: Remove stupidity in get/set caps functions. + Original commit message from CVS: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_init), + (gst_smokeenc_setcaps), (gst_smokeenc_chain), + (gst_smokeenc_change_state): + * ext/jpeg/gstsmokeenc.h: + Remove stupidity in get/set caps functions. + Fix some refcounting problems. + +2007-07-06 11:42:53 +0000 Jan Schmidt + + ext/libpng/gstpngdec.c: Remove endianness-flipping hack that seems to have been required only because of a bug in ffm... + Original commit message from CVS: + * ext/libpng/gstpngdec.c: (gst_pngdec_caps_create_and_set): + Remove endianness-flipping hack that seems to have been required + only because of a bug in ffmpegcolorspace. + Partially Fixes: #451908 + +2007-07-05 08:44:11 +0000 Stefan Kost + + docs/plugins/Makefile.am: Simplify --extra-dir as gtkdoc scans recursively. + Original commit message from CVS: + * docs/plugins/Makefile.am: + Simplify --extra-dir as gtkdoc scans recursively. + +2007-07-03 09:59:46 +0000 Tommi Myöhänen + + gst/rtp/gstrtpilbcpay.c: Set the encoding-name in the rtp caps to all uppercase, as required by the caps spec. + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): + Set the encoding-name in the rtp caps to all uppercase, as required by + the caps spec. + Some small cleanups in the error paths. Fixes #453037. + +2007-07-03 08:01:18 +0000 Stefan Kost + + gst/multifile/: Add .h files to be able to add it to the docs. + Original commit message from CVS: + * gst/multifile/Makefile.am: + * gst/multifile/gstmultifile.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesink.h: + * gst/multifile/gstmultifilesrc.c: + * gst/multifile/gstmultifilesrc.h: + Add .h files to be able to add it to the docs. + +2007-07-03 07:16:26 +0000 Stefan Kost + + gst/replaygain/gstrgvolume.h: Fix GObject macros. + Original commit message from CVS: + * gst/replaygain/gstrgvolume.h: + Fix GObject macros. + +2007-06-28 19:00:43 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.*: Use a GSList for the GArray that is used like a list anyway. + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_index_get_last_entry), + (gst_wavpack_parse_index_get_entry_from_sample), + (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset), + (gst_wavpack_parse_scan_to_find_sample): + * ext/wavpack/gstwavpackparse.h: + Use a GSList for the GArray that is used like a list anyway. + +2007-06-28 13:25:05 +0000 Tim-Philipp Müller + + ext/gdk_pixbuf/gstgdkpixbuf.c: Add state change function where we set 0/1 as default framerate in case our setcaps fu... + Original commit message from CVS: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_setcaps), + (gst_gdk_pixbuf_class_init), (gst_gdk_pixbuf_flush), + (gst_gdk_pixbuf_sink_event), (gst_gdk_pixbuf_change_state): + Add state change function where we set 0/1 as default framerate in + case our setcaps function isn't called, like it might not in a + filesrc ! gdkpixbufdec scenario. Fixes assertion triggered by + gdkpixbufdec trying to create caps with a 0/0 framerate. + Also post an error message on the bus if gst_pad_push() fails when + called from our sink event handler (+1 for flow returns for event + functions in 0.11) instead of failing silently. + +2007-06-27 11:36:24 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Cast stack args to the proper types. Fixes #451249. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_configure_caps): + Cast stack args to the proper types. Fixes #451249. + +2007-06-27 11:04:47 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: For container formats we only need to activate one of the streams so that we correctly signal ... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), + (new_session_pad), (gst_rtspsrc_setup_streams): + * gst/rtsp/gstrtspsrc.h: + For container formats we only need to activate one of the streams so + that we correctly signal no-more-pads. Fixes #451015. + +2007-06-25 12:46:08 +0000 Stefan Kost + + docs/plugins/: Update docs with caps info. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-ladspa.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + Update docs with caps info. + +2007-06-25 12:13:09 +0000 Tim-Philipp Müller + + po/POTFILES.in: Add more files with translatable strings (#450878). + Original commit message from CVS: + * po/POTFILES.in: + Add more files with translatable strings (#450878). + +2007-06-22 20:23:18 +0000 Jens Granseuer + + gst/: Build fixes for gcc-2.9x (no mid-block variable declarations etc.). + Original commit message from CVS: + Patch by: Jens Granseuer + * gst/equalizer/gstiirequalizer.c: + * gst/equalizer/gstiirequalizer10bands.c: + * gst/equalizer/gstiirequalizer3bands.c: + * gst/equalizer/gstiirequalizernbands.c: + * gst/rtpmanager/async_jitter_queue.c: + (async_jitter_queue_push_sorted): + * gst/rtpmanager/gstrtpjitterbuffer.c: + (gst_rtp_jitter_buffer_chain): + * gst/switch/gstswitch.c: (gst_switch_chain): + Build fixes for gcc-2.9x (no mid-block variable declarations etc.). + Fixes #450185. + +2007-06-22 14:26:36 +0000 Jan Schmidt + + MAINTAINERS: Updating all the maintainers files + Original commit message from CVS: + * MAINTAINERS: + Updating all the maintainers files + +2007-06-22 10:12:15 +0000 Edward Hervey + + Fix memory leaks. + Original commit message from CVS: + * ext/flac/gstflactag.c: (gst_flac_tag_init): + * gst/interleave/deinterleave.c: (deinterleave_init), + (deinterleave_sink_link): + * gst/interleave/interleave.c: (interleave_init): + * gst/median/gstmedian.c: (gst_median_init): + * gst/oldcore/gstmultifilesrc.c: (gst_multifilesrc_init): + Fix memory leaks. + * tests/check/elements/id3demux.c: (pad_added_cb): + Remove unused variable. + +2007-06-21 10:48:10 +0000 Damien Carbery + + ext/gconf/gconf.h: Make the prototype of gst_gconf_get_key_for_sink_profile match the implementation. + Original commit message from CVS: + * ext/gconf/gconf.h: + Make the prototype of gst_gconf_get_key_for_sink_profile + match the implementation. + Patch by: Damien Carbery + Fixes: #449747 + +2007-06-20 12:56:12 +0000 Michael Smith + + gst/rtp/gstrtpdepay.c: Fix description - rtpdepay is not a payloader. + Original commit message from CVS: + * gst/rtp/gstrtpdepay.c: + Fix description - rtpdepay is not a payloader. + +2007-06-20 10:15:00 +0000 Stefan Kost + + gst/equalizer/gstiirequalizer.c: Document parameter mapping. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: + Document parameter mapping. + +2007-06-20 08:56:17 +0000 Stefan Kost + + gst/spectrum/gstspectrum.c: Fix leaking buffers. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_event), + (gst_spectrum_transform_ip): + Fix leaking buffers. + * tests/check/Makefile.am: + * tests/check/elements/spectrum.c: (setup_spectrum), + (cleanup_spectrum), (GST_START_TEST), (spectrum_suite), (main): + Add simple test for spectrum element. + +2007-06-20 08:26:21 +0000 Stefan Kost + + gst/qtdemux/: Add MJPG to the variants of motion jpeg. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_samples), + (qtdemux_video_caps): + * gst/qtdemux/qtdemux_fourcc.h: + Add MJPG to the variants of motion jpeg. + +2007-06-19 16:40:40 +0000 Tim-Philipp Müller + + tests/check/: Add GST_OPTION_CFLAGS to CFLAGS when building unit tests, so the error flags are included and it errors... + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/elements/audiopanorama.c: (GST_START_TEST): + * tests/check/elements/videocrop.c: (GST_START_TEST): + * tests/check/elements/videofilter.c: + * tests/check/elements/wavpackdec.c: (GST_START_TEST): + * tests/check/elements/wavpackparse.c: (GST_START_TEST): + Add GST_OPTION_CFLAGS to CFLAGS when building unit tests, so the + error flags are included and it errors out on compiler warnings + for CVS builds; remove unused variables in various unit tests. + +2007-06-19 14:48:03 +0000 Wim Taymans + + gst/rtsp/rtspconnection.c: Use threadsafe inet_ntop to convert an ip number to a string. + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), + (rtsp_connection_close), (rtsp_connection_free): + Use threadsafe inet_ntop to convert an ip number to a string. + Fixes #447961. + Don't leak fd (and ip) when freeing a connection without first closing + it. + +2007-06-19 14:11:49 +0000 Christian Schaller + + * gst/qtdemux/LEGAL: + add 'LEGAL' file describing why this is in -good and under what circumstances it might need to move. + Original commit message from CVS: + add 'LEGAL' file describing why this is in -good and under what + circumstances it might need to move. + +2007-06-19 10:41:49 +0000 Jan Schmidt + + configure.ac: Back to CVS + Original commit message from CVS: + * configure.ac: + Back to CVS + * gst-plugins-good.doap: + Add 0.10.6 to the doap file. + +=== release 0.10.6 === + +2007-06-19 10:24:55 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * win32/common/config.h: + Release 0.10.6 + Original commit message from CVS: + Release 0.10.6 + +2007-06-18 17:53:20 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/ja.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2007-06-17 12:35:03 +0000 Tim-Philipp Müller + + gst/rtsp/rtspconnection.c: Revert previous commit again, since we are frozen (sorry). + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), + (rtsp_connection_free): + Revert previous commit again, since we are frozen (sorry). + +2007-06-17 12:24:58 +0000 Peter Kjellerstedt + + gst/rtsp/rtspconnection.c: inet_ntoa() uses a static buffer internally, so we need to copy the returned string if we ... + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), + (rtsp_connection_free): + inet_ntoa() uses a static buffer internally, so we need to copy the + returned string if we want to store it for later (#447961). + +2007-06-15 09:13:55 +0000 Jan Schmidt + + 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-06-15 08:32:52 +0000 Vincent Torri + + gst/rtsp/rtspconnection.c: Fix the MingW build. + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (rtsp_connection_connect): + Fix the MingW build. + Patch By: Vincent Torri + Fixes: #446981 + +2007-06-14 14:03:41 +0000 Jan Schmidt + + tests/: Hush the buildbots up + Original commit message from CVS: + * tests/check/elements/.cvsignore: + * tests/icles/.cvsignore: + Hush the buildbots up + +2007-06-14 12:14:24 +0000 Jan Schmidt + + 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-14 10:23:20 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: For AMR-NB streams, export the AMRSpecificBox as codec_data on the caps. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + For AMR-NB streams, export the AMRSpecificBox as codec_data on the + caps. + Fixes #447458 + +2007-06-13 17:11:24 +0000 Wim Taymans + + gst/rtp/gstrtph264depay.c: Make sure we allocate enough memory for the codec_data. + Original commit message from CVS: + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): + Make sure we allocate enough memory for the codec_data. + Fixes #447210. + +2007-06-12 21:05:22 +0000 Sébastien Moutte + + win32/MANIFEST: Add videocrop project file to the win32 manifest. + Original commit message from CVS: + * win32/MANIFEST: + Add videocrop project file to the win32 manifest. + * win32/vs6/gst_plugins_good.dsw: + Add qtdemux,videocrop and waveform projects to the workspace. + * win32/vs6/libgstqtdemux.dsp: + Add zlib to the link list of qtdemux. + * win32/vs6/libgstvideocrop.dsp: + Add a project file for videocrop. + +2007-06-12 20:22:26 +0000 Jan Schmidt + + po/POTFILES.in: Add qtdemux for translation + Original commit message from CVS: + * po/POTFILES.in: + Add qtdemux for translation + +2007-06-12 20:15:29 +0000 Jan Schmidt + + Move videocrop and osxvideo from -bad. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-videocrop.xml: + * gst-plugins-good.spec.in: + * sys/Makefile.am: + * tests/check/Makefile.am: + * tests/icles/Makefile.am: + * tests/icles/videocrop-test.c: + Move videocrop and osxvideo from -bad. + +2007-06-12 19:35:08 +0000 Jan Schmidt + + Move qtdemux from -bad. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-qtdemux.xml: + * docs/plugins/inspect/plugin-quicktime.xml: + * win32/MANIFEST: + Move qtdemux from -bad. + * gst-plugins-good.spec.in: + Update spec file to reflect moving of qtdemux and wavpack + +2007-06-12 19:01:41 +0000 Jan Schmidt + + * ChangeLog: + * win32/MANIFEST: + Fix typo in the changelog and commit the manifest too + Original commit message from CVS: + Fix typo in the changelog and commit the manifest too + +2007-06-12 18:52:33 +0000 Jan Schmidt + + win32/MANIFEST + Original commit message from CVS: + * win32/MANIFEST + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-directdraw.xml: + * docs/plugins/inspect/plugin-directsound.xml: + * docs/plugins/inspect/plugin-waveform.xml: + Move the waveform plugin from -bad too. Update the inspect xml + files to mention Plugins Good instead of Plugins Bad. + +2007-06-12 13:33:56 +0000 Andy Wingo + + * ChangeLog: + * sys/v4l2/v4l2src_calls.c: + Return a copy of the pool buffer if all mmap buffers have been dequeued. + Original commit message from CVS: + (gst_v4l2src_grab_frame): Return a copy of the pool buffer if all + mmap buffers have been dequeued. + +2007-06-12 11:23:01 +0000 Andy Wingo + + sys/v4l2/v4l2src_calls.c (gst_v4l2_buffer_finalize) (gst_v4l2_buffer_class_init, gst_v4l2_buffer_get_type) + Original commit message from CVS: + 2007-06-12 Andy Wingo + * sys/v4l2/v4l2src_calls.c (gst_v4l2_buffer_finalize) + (gst_v4l2_buffer_class_init, gst_v4l2_buffer_get_type) + (gst_v4l2_buffer_new): Behave more like ximagesink's buffers, with + finalization and resuscitation. No longer public. + (gst_v4l2_buffer_pool_finalize, gst_v4l2_buffer_pool_init) + (gst_v4l2_buffer_pool_class_init, gst_v4l2_buffer_pool_get_type) + (gst_v4l2_buffer_pool_new, gst_v4l2_buffer_pool_activate) + (gst_v4l2_buffer_pool_destroy): Make the pool follow common + miniobject semantics, and be threadsafe. + (gst_v4l2src_queue_frame): Remove this function, as we just call + the ioctls directly in the two places where we queue buffers. + (gst_v4l2src_grab_frame): Return a flowreturn and fill the buffer + directly. + (gst_v4l2src_capture_init): Use the new buffer_pool_new function + to allocate the pool, which also preallocates the GstBuffers. + (gst_v4l2src_capture_start): Call buffer_pool_activate instead of + queueing the frames directly. + * sys/v4l2/gstv4l2src.h (struct _GstV4l2BufferPool): Make this a + real MiniObject instead of rolling our own refcounting and + finalizing. Give it a lock. + (struct _GstV4l2Buffer): Remove one intermediary object, having + the buffers hold the struct v4l2_buffer directly. + * sys/v4l2/gstv4l2src.c (gst_v4l2src_set_caps): Pass the caps to + capture_init so that it can set them on the buffers that it will + create. + (gst_v4l2src_get_read): For better or for worse, include the + timestamping and offsetting code here; really we should be using + bufferalloc though. + (gst_v4l2src_get_mmap): Just make grab_frame return one of our + preallocated, mmap'd buffers. + +2007-06-11 11:41:56 +0000 daniel fischer + + sys/ximage/gstximagesrc.c: Actually use the display_name property so that we can dump any available X display. Fixes ... + Original commit message from CVS: + Patch by: daniel fischer + * sys/ximage/gstximagesrc.c: (gst_ximage_src_start), + (gst_ximage_src_get_caps): + Actually use the display_name property so that we can dump any + available X display. Fixes #445905. + +2007-06-11 10:21:13 +0000 Tommi Myöhänen + + gst/rtp/: Add missing rate fields to caps. Fixes #441118. + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps): + Add missing rate fields to caps. Fixes #441118. + +2007-06-10 21:14:11 +0000 Sébastien Moutte + + win32/: Add DirectSound and DirectDraw sinks project files to workspace and solution files. + Original commit message from CVS: + * win32/vs6/gst_plugins_good.dsw: + * win32/vs8/gst-plugins-good.sln: + Add DirectSound and DirectDraw sinks project files to + workspace and solution files. + +2007-06-10 10:53:26 +0000 Josh Coalson + + Add support for flac >= 1.1.3 which changed the API. Fixes bug #385887. + Original commit message from CVS: + Patch by: Josh Coalson , + updated by Alexis Ballier : + * configure.ac: + * ext/flac/gstflacdec.c: (gst_flac_dec_reset_decoders), + (gst_flac_dec_setup_seekable_decoder), + (gst_flac_dec_setup_stream_decoder), (gst_flac_dec_seek), + (gst_flac_dec_tell), (gst_flac_dec_length), (gst_flac_dec_eof), + (gst_flac_dec_read_seekable), (gst_flac_dec_read_stream): + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.c: (gst_flac_enc_init), + (gst_flac_enc_finalize), (gst_flac_enc_set_metadata), + (gst_flac_enc_sink_setcaps), (gst_flac_enc_update_quality), + (gst_flac_enc_seek_callback), (gst_flac_enc_write_callback), + (gst_flac_enc_tell_callback), (gst_flac_enc_sink_event), + (gst_flac_enc_chain), (gst_flac_enc_set_property), + (gst_flac_enc_get_property), (gst_flac_enc_change_state): + * ext/flac/gstflacenc.h: + Add support for flac >= 1.1.3 which changed the API. Fixes bug #385887. + +2007-06-09 15:41:52 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.c: Remove workaround for bug #421543. This is fixed in core 0.10.13 and not necessary anymo... + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_sink_set_caps): + Remove workaround for bug #421543. This is fixed in core 0.10.13 and + not necessary anymore as we need at least that core version. + +2007-06-09 15:33:32 +0000 Sebastian Dröge + + ext/wavpack/: Improve discont handling by checking if the next Wavpack block has the expected, following block index. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), + (gst_wavpack_dec_chain): + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), + (gst_wavpack_parse_push_buffer): + * ext/wavpack/gstwavpackparse.h: + Improve discont handling by checking if the next Wavpack block has + the expected, following block index. + +2007-06-08 20:23:07 +0000 Thomas Vander Stichele + + * tests/check/elements/.gitignore: + moap ignore + Original commit message from CVS: + moap ignore + +2007-06-08 20:20:56 +0000 Thomas Vander Stichele + + gst/rtp/gstrtpmp4vpay.c (gst_rtp_mp4vpay_details): Fix element description. + Original commit message from CVS: + * gst/rtp/gstrtpmp4vpay.c (gst_rtp_mp4vpay_details): + Fix element description. + +2007-06-08 20:19:55 +0000 Thomas Vander Stichele + + move wavpack plugin. See #352605. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-ladspa.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * ext/Makefile.am: + * tests/check/Makefile.am: + move wavpack plugin. See #352605. + +2007-06-08 19:45:43 +0000 Thomas Vander Stichele + + * docs/plugins/Makefile.am: + the alphabet tripping up people since 10929BC + Original commit message from CVS: + the alphabet + tripping up people since 10929BC + +2007-06-08 17:37:02 +0000 Jan Schmidt + + Add DirectDraw & DirectSound plugins to the build and docs. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * sys/Makefile.am: + * win32/MANIFEST: + Add DirectDraw & DirectSound plugins to the build and docs. + +2007-06-08 16:31:15 +0000 Jan Schmidt + + 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-06-08 10:43:26 +0000 Tim-Philipp Müller + + ext/: When operating in pull mode, error out correct on not-linked. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_loop): + * ext/libpng/gstpngdec.c: (user_read_data), (gst_pngdec_task): + When operating in pull mode, error out correct on not-linked. + +2007-06-08 08:12:43 +0000 Tim-Philipp Müller + + tests/icles/videocrop-test.c: Default to xvimagesink instead of autovideosink while autovideosink/ghostpads/whatever ... + Original commit message from CVS: + * tests/icles/videocrop-test.c: (main): + Default to xvimagesink instead of autovideosink while + autovideosink/ghostpads/whatever don't handle the way we use it in + the way we expect it to. + +2007-06-06 10:19:17 +0000 Andy Wingo + + * ChangeLog: + * sys/v4l2/v4l2src_calls.c: + sys/v4l2/v4l2src_calls.c (gst_v4l2src_probe_caps_for_format) + Original commit message from CVS: + 2007-06-06 Andy Wingo + * sys/v4l2/v4l2src_calls.c (gst_v4l2src_probe_caps_for_format) + (gst_v4l2src_probe_caps_for_format_and_size): Only probe for + format and size if the ioctls are defined; should fix compilation + on Linux < 2.16.19. + +2007-06-06 08:53:12 +0000 Tim-Philipp Müller + + gst/videobox/gstvideobox.c: Printf fixes in debug statements; use LOG level for debug statements that are printed for... + Original commit message from CVS: + * gst/videobox/gstvideobox.c: (gst_video_box_ayuv_i420): + Printf fixes in debug statements; use LOG level for debug statements + that are printed for each and every frame; convert c++ comments to + C-style comments; not much point using g_try_malloc() if we then not + even check the return value. + +2007-06-05 16:32:19 +0000 Tim-Philipp Müller + + configure.ac: Bump requirements to released versions (core and base 0.10.13). + Original commit message from CVS: + * configure.ac: + Bump requirements to released versions (core and base 0.10.13). + * gst/icydemux/gsticydemux.c: (gst_icydemux_unicodify): + Use gst_tag_utf8_from_freeform_string() from libgsttag instead of + own implementation. + +2007-06-05 14:17:25 +0000 Andy Wingo + + sys/v4l2/gstv4l2src.c (gst_v4l2src_start, gst_v4l2src_stop): Add some useless comments. + Original commit message from CVS: + 2007-06-05 Andy Wingo + * sys/v4l2/gstv4l2src.c (gst_v4l2src_start, gst_v4l2src_stop): Add + some useless comments. + * sys/v4l2/v4l2src_calls.c (gst_v4l2src_capture_init): Don't queue + frames before calling STREAMON, that might leave them in a state + where they can't be dequeued if we go back to NULL without calling + STREAMON, according to the docs. + (gst_v4l2src_capture_start): Enqueue buffers here instead, right + before we call STREAMON. + (gst_v4l2src_capture_deinit): Remove crack to work around dequeue + failures. (For me this code hung.) The pool refcounting is still + crack; added a note to that effect. + +2007-06-05 09:11:41 +0000 Wim Taymans + + gst/multipart/multipartmux.c: Add support for mapping gst structure names to the MIME type equivalent. + Original commit message from CVS: + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_get_mime), (gst_multipart_mux_collected): + Add support for mapping gst structure names to the MIME type equivalent. + Implemented for audio/x-mulaw->audio/basic. Fixes #442874. + +2007-06-03 11:21:44 +0000 Sebastian Dröge + + gst/wavenc/gstwavenc.*: Properly write wav files with width!=depth by having the depth most significant bytes set and... + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), + (gst_wavenc_sink_setcaps), (gst_wavenc_format_samples), + (gst_wavenc_chain), (gst_wavenc_change_state): + * gst/wavenc/gstwavenc.h: + Properly write wav files with width!=depth by having the depth most + significant bytes set and all others zero. Fixes #442535. + +2007-06-01 13:52:17 +0000 Wim Taymans + + gst/rtsp/rtspconnection.c: Add include to make buildbot happy. + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: + Add include to make buildbot happy. + +2007-06-01 13:07:11 +0000 Peter Kjellerstedt + + gst/rtsp/: Improves version checking, allowing an RTSP server to reply with "505 + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (rtsp_connection_connect), (add_date_header), + (rtsp_connection_send), (parse_response_status), + (parse_request_line), (parse_line), (rtsp_connection_receive): + * gst/rtsp/rtspdefs.c: (rtsp_version_as_text): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspmessage.c: (key_value_foreach), + (rtsp_message_init_request), (rtsp_message_init_response), + (rtsp_message_remove_header), (rtsp_message_append_headers), + (rtsp_message_dump): + * gst/rtsp/rtspmessage.h: + Improves version checking, allowing an RTSP server to reply with "505 + RTSP Version not supported. + Adds a Date header to all messages. + Replies with RTSP_EPARSE rather than RTSP_EINVALID in cases where we + want to be able to send a response even if something in the request was + invalid. EINVAL is only used when passing wrong arguments to functions. + Do not handle an invalid method in parse_request_line(). Defer this to + the caller so it can respond with "405 Method Not Allowed". + Improves parsing of the timeout parameter to the Session header, + allowing whitespace after the semicolon. + Avoids a compiler warning due to variables shadowing a function argument. + +2007-06-01 11:16:17 +0000 Daniel Charles + + gst/rtp/: Add support for AMR-WB. + Original commit message from CVS: + Based on Patch by: Daniel Charles + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), + (gst_rtp_amr_depay_process): + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_base_init), + (gst_rtp_amr_pay_class_init), (gst_rtp_amr_pay_init), + (gst_rtp_amr_pay_setcaps), (gst_rtp_amr_pay_handle_buffer): + * gst/rtp/gstrtpamrpay.h: + Add support for AMR-WB. + Small cleanups such as using BOILERPLATE. + +2007-05-31 15:57:07 +0000 Wim Taymans + + gst/rtsp/rtspextwms.c: Fix compile warning when debug is disabled as spotted bu Saur on IRC. + Original commit message from CVS: + * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_configure_stream): + Fix compile warning when debug is disabled as spotted bu Saur on IRC. + +2007-05-30 14:57:44 +0000 Andy Wingo + + sys/v4l2/gstv4l2object.*: Revert some unintended changes. + Original commit message from CVS: + 2007-05-30 Andy Wingo + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2object.c (gst_v4l2_object_new): Revert some + unintended changes. + +2007-05-30 14:40:53 +0000 Andy Wingo + + sys/v4l2/v4l2src_calls.*: Store the format list in the order that the driver gives it to us. + Original commit message from CVS: + 2007-05-30 Andy Wingo + * sys/v4l2/v4l2src_calls.h: + * sys/v4l2/v4l2src_calls.c (gst_v4l2src_fill_format_list): Store + the format list in the order that the driver gives it to us. + (gst_v4l2src_probe_caps_for_format_and_size) + (gst_v4l2src_probe_caps_for_format): New functions, fill GstCaps + based on the capabilities of the device. + (gst_v4l2src_grab_frame): Update for object variable renaming. + (gst_v4l2src_set_capture): Update to be strict in its parameters, + as in the set_caps below. + (gst_v4l2src_capture_init): Update for object variable renaming, + and reflow. + (gst_v4l2src_capture_start, gst_v4l2src_capture_stop) + (gst_v4l2src_capture_deinit): Update for object variable renaming. + (gst_v4l2src_update_fps, gst_v4l2src_set_fps) + (gst_v4l2src_get_fps): Remove; these functions don't have much + meaning outside of an atomic set_caps method. + (gst_v4l2src_buffer_new): Don't set buffer duration, it is not + known. + * sys/v4l2/gstv4l2tuner.c (gst_v4l2_tuner_set_channel): Remove + call to update_fps; not sure about this change. + (gst_v4l2_tuner_set_norm): Work around the fact that for the + moment we don't have an update_fps_func. + * sys/v4l2/gstv4l2src.h (struct _GstV4l2Src): Don't put v4l2 + structures in the object, just store what we need. Do store the + probed caps of the device. Don't store the current frame rate. + * sys/v4l2/gstv4l2src.c (gst_v4l2src_init): Remove the + update_fps_function, for now. Update for new object variable + naming. + (gst_v4l2src_set_property, gst_v4l2src_get_property): Update for + new object variable naming. + (gst_v4l2src_v4l2fourcc_to_structure): Rename from ..._to_caps. + (gst_v4l2_structure_to_v4l2fourcc): Rename from ...caps_to_.... + (gst_v4l2src_get_caps): Rework to probe the device for supported + frame sizes and frame rates. + (gst_v4l2src_set_caps): Rework to be strict in the given + parameters: if someone asks us to have a certain size and rate, + that is what we configure. + (gst_v4l2src_get_read): Update for object variable naming. Don't + leak buffers on short reads. + (gst_v4l2src_get_mmap): Update for object variable naming, and add + comments. + (gst_v4l2src_create): Update for object variable naming. + +2007-05-30 14:38:59 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.*: Parse subtitle text streams instead of erroring out (#442034). Still needs a parser for the su... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_base_init), + (gst_avi_demux_reset), (gst_avi_demux_parse_stream): + * gst/avi/gstavidemux.h: + Parse subtitle text streams instead of erroring out (#442034). Still + needs a parser for the subtitles to actually show up. + +2007-05-30 12:46:32 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Make _push_event() return TRUE if the event could be pushed on at least one pad and not only i... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_push_event), + (gst_avi_demux_loop): + Make _push_event() return TRUE if the event could be pushed on at + least one pad and not only if it could be pushed on all pads, + otherwise we'll end up posting an error message on EOS if one or + more source pads are not connected. + +2007-05-28 16:39:09 +0000 Wim Taymans + + gst/rtsp/rtsptransport.c: Use renamed RTP bin. + Original commit message from CVS: + * gst/rtsp/rtsptransport.c: + Use renamed RTP bin. + +2007-05-28 15:01:33 +0000 Dejan Sakelšak + + gst/videobox/gstvideobox.c: Add AYUV->AYUV and AYUV->I420 formats. + Original commit message from CVS: + Based on patch by: Dejan Sakelšak + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_set_property), (gst_video_box_transform_caps), + (video_box_recalc_transform), (gst_video_box_set_caps), + (gst_video_box_get_unit_size), (gst_video_box_apply_alpha), + (gst_video_box_ayuv_ayuv), (gst_video_box_clear), (UVfloor), + (UVceil), (gst_video_box_ayuv_i420), (gst_video_box_i420_ayuv), + (gst_video_box_i420_i420), (gst_video_box_transform), + (plugin_init): + Add AYUV->AYUV and AYUV->I420 formats. + Fix negotiation and I420->AYUV conversion. + Fixes #429329. + +2007-05-26 15:25:18 +0000 Wim Taymans + + ext/speex/gstspeexdec.c: Use different variables for nested for loops so that the outer loop functions properly and s... + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data): + Use different variables for nested for loops so that the outer loop + functions properly and speex files with multiple frames per buffer work + properly. + Fixes #441408. + +2007-05-25 20:51:36 +0000 Tim-Philipp Müller + + gst/id3demux/gstid3demux.c: Don't leak newsegment events. + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_sink_event): + Don't leak newsegment events. + +2007-05-25 20:33:10 +0000 Tim-Philipp Müller + + gst/wavparse/Makefile.am: Add '-lm' to LIBS for ceil(), don't assume one of our dependencies drags it in. + Original commit message from CVS: + * gst/wavparse/Makefile.am: + Add '-lm' to LIBS for ceil(), don't assume one of our dependencies + drags it in. + +2007-05-25 16:02:51 +0000 Tim-Philipp Müller + + ext/flac/gstflacenc.*: Collect headers, add "streamheader" field to output caps and set + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_init), + (notgst_value_array_append_buffer), + (gst_flac_enc_process_stream_headers), + (gst_flac_enc_write_callback), (gst_flac_enc_chain), + (gst_flac_enc_change_state): + * ext/flac/gstflacenc.h: + Collect headers, add "streamheader" field to output caps and set + BUFFER_IN_CAPS flag on pushed header buffers. That way oggmux + produces output according to the official FLAC-to-Ogg mapping + instead of completely broken files. Fixes #426044. + +2007-05-25 10:44:12 +0000 Jan Schmidt + + gst/: Handle and adjust new-segment events so that downstream really sees a stream with the tag pieces stripped off t... + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_reset), + (gst_id3demux_send_new_segment), (gst_id3demux_chain), + (gst_id3demux_sink_event): + * gst/id3demux/gstid3demux.h: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_reset), + (gst_tag_demux_chain), (gst_tag_demux_sink_event), + (gst_tag_demux_send_new_segment): + Handle and adjust new-segment events so that downstream really + sees a stream with the tag pieces stripped off the front and back. + Fixes strangeness in seeking when mp3 decoders use the new-segment + byte position to estimate their current playback position timestamp + and then the arriving buffers don't match up. + +2007-05-25 10:23:49 +0000 Jan Schmidt + + gst/autodetect/gstautoaudiosink.c: Don't unnecessarily perform a READY->NULL->READY transition on the detected audio ... + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_detect): + Don't unnecessarily perform a READY->NULL->READY transition on the + detected audio sink when starting up. Fixes: #440127 + +2007-05-24 17:00:21 +0000 Tim-Philipp Müller + + ext/flac/gstflacenc.c: Don't crash in chain function if setcaps hasn't been called. + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_sink_setcaps), + (gst_flac_enc_chain): + Don't crash in chain function if setcaps hasn't been called. + +2007-05-24 08:35:23 +0000 Vincent Torri + + sys/directdraw/gstdirectdrawsink.*: Fix more warnings when compiling with MingW (#439914). + Original commit message from CVS: + Patch by: Vincent Torri + * 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-24 08:14:00 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Init value to avoid infinte loops. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_methods): + Init value to avoid infinte loops. + +2007-05-24 08:10:42 +0000 Peter Kjellerstedt + + gst/rtsp/: Fix for new API. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_auth), + (gst_rtspsrc_try_send), (gst_rtspsrc_parse_methods), + (gst_rtspsrc_setup_streams), (gst_rtspsrc_open), + (gst_rtspsrc_play): + (rtsp_connection_send), (rtsp_connection_receive): + * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_after_send): + Fix for new API. + * gst/rtsp/rtspconnection.c: (add_auth_header), + Only add authorisation and session headers when sending messages. + * gst/rtsp/rtspmessage.c: (key_value_foreach), (rtsp_message_init), + (rtsp_message_init_request), (rtsp_message_init_response), + (rtsp_message_unset), (rtsp_message_add_header), + (rtsp_message_remove_header), (rtsp_message_get_header), + (rtsp_message_append_headers), (dump_key_value), + (rtsp_message_dump): + * gst/rtsp/rtspmessage.h: + Add support for multiple headers of the same type by storing the parsed + headers in a GArray instaed of a hashtable. + +2007-05-23 22:44:12 +0000 Sébastien Moutte + + docs/plugins/gst-plugins-bad-plugins.args: Remove directsoundsink property doc as this sink use the mixer interface now. + Original commit message from CVS: + * docs/plugins/gst-plugins-bad-plugins.args: + Remove directsoundsink property doc as this sink use the mixer + interface now. + * docs/plugins/gst-plugins-bad-plugins.interfaces: + Add interfaces implemented by Windows sinks. + * sys/directsound/gstdirectsoundsink.c: + * sys/directsound/gstdirectsoundsink.h: + Remove directsoundsink property and implement the mixer interface. + * win32/vs6/gst_plugins_bad.dsw: + * win32/vs6/libgstdirectsound.dsp: + Update project files. + * gst-libs/gst/dshow/gstdshow.cpp: + * gst-libs/gst/dshow/gstdshow.h: + * gst-libs/gst/dshow/gstdshowfakesink.cpp: + * gst-libs/gst/dshow/gstdshowfakesink.h: + * gst-libs/gst/dshow/gstdshowfakesrc.cpp: + * gst-libs/gst/dshow/gstdshowfakesrc.h: + * gst-libs/gst/dshow/gstdshowinterface.cpp: + * gst-libs/gst/dshow/gstdshowinterface.h: + * win32/common/libgstdshow.def: + * win32/vs6/libgstdshow.dsp: + Add a new gst library which allow to create internal Direct Show + graph (pipelines) to wrap Windows sources, decoders or encoders. + It includes a DirectShow fake source and sink and utility functions. + * sys/dshowsrcwrapper/gstdshowaudiosrc.c: + * sys/dshowsrcwrapper/gstdshowaudiosrc.h: + * sys/dshowsrcwrapper/gstdshowsrcwrapper.c: + * sys/dshowsrcwrapper/gstdshowsrcwrapper.h: + * sys/dshowsrcwrapper/gstdshowvideosrc.c: + * sys/dshowsrcwrapper/gstdshowvideosrc.h: + * win32/vs6/libdshowsrcwrapper.dsp: + Add a new plugin to wrap DirectShow sources on Windows. + It gets data from any webcam, dv cam, micro. We could add + tv tunner card later. + +2007-05-22 11:14:13 +0000 Stefan Kost + + configure.ac: Depend on gstreamer-0.10.12.1. gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _Gs... + Original commit message from CVS: + * configure.ac: + Depend on gstreamer-0.10.12.1. + * gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, + _GstIirEqualizerBand, object, _GstIirEqualizerBandClass, + parent_class, gst_iir_equalizer_band_set_property, + gst_iir_equalizer_band_class_init, gst_iir_equalizer_band_get_type, + gst_iir_equalizer_child_proxy_get_child_by_index, + gst_iir_equalizer_child_proxy_get_children_count, + gst_iir_equalizer_child_proxy_interface_init, setup_filter, + gst_iir_equalizer_compute_frequencies, + gst_iir_equalizer_set_property, gst_iir_equalizer_get_property, + plugin_init): + * gst/equalizer/gstiirequalizer.h (audiofilter): + * gst/equalizer/gstiirequalizernbands.c (ARG_NUM_BANDS, + gst_iir_equalizer_nbands_base_init, gst_iir_equalizer_nbands_init, + gst_iir_equalizer_nbands_set_property): + Use new locking macros. + * gst/filter/gstbpwsinc.c (bpwsinc_set_caps): + Add fixme. + * gst/spectrum/gstspectrum.c (SPECTRUM_WINDOW_BASE, + SPECTRUM_WINDOW_LEN, gst_spectrum_init, gst_spectrum_set_property, + gst_spectrum_event, gst_spectrum_transform_ip): + Use new locking macros. Turn two fixed values into #defines. + +2007-05-22 11:03:30 +0000 Edward Hervey + + docs/plugins/Makefile.am: Also look for .m (objectivec) files. + Original commit message from CVS: + * docs/plugins/Makefile.am: + Also look for .m (objectivec) files. + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * docs/plugins/gst-plugins-bad-plugins.args: + * sys/osxvideo/osxvideosink.m: + Add documentation for element and properties. + +2007-05-21 14:01:16 +0000 Stefan Kost + + ChangeLog: ChangeLog surgery. gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _GstIirEqualizerBa... + Original commit message from CVS: + * ChangeLog: + ChangeLog surgery. + * gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, + _GstIirEqualizerBand, object, _GstIirEqualizerBandClass, + parent_class, gst_iir_equalizer_band_set_property, + gst_iir_equalizer_band_class_init, gst_iir_equalizer_band_get_type, + gst_iir_equalizer_child_proxy_get_child_by_index, + gst_iir_equalizer_child_proxy_get_children_count, + gst_iir_equalizer_child_proxy_interface_init, setup_filter, + gst_iir_equalizer_compute_frequencies, plugin_init): + * tests/icles/equalizer-test.c: + Add fixme and comment for example. + +2007-05-21 12:43:37 +0000 Stefan Kost + + * gst/spectrum/gstspectrum.c: + gst/spectrum/gstspectrum.c (gst_spectrum_set_property, gst_spectrum_event, gst_spectrum_transform_ip): + Original commit message from CVS: + * gst/spectrum/gstspectrum.c (gst_spectrum_set_property, + gst_spectrum_event, gst_spectrum_transform_ip): + Use lock to protect from concurrent access. + +2007-05-21 11:37:16 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.c: Specify and use properties as unsigned int that are an unsigned int. + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), + (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): + Specify and use properties as unsigned int that are an unsigned int. + +2007-05-21 11:17:21 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.*: Fixup docs, make the bitrate property an int as it should be and allow to set the differ... + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), + (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config), + (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): + * ext/wavpack/gstwavpackenc.h: + Fixup docs, make the bitrate property an int as it should be and + allow to set the different extra processing modes instead of only + allowing none and the default one. + +2007-05-21 10:07:05 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Since we depend on 0.10.13 -core, override the unlock_stop vmethod for safer shutdown. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_create), (gst_udpsrc_unlock), (gst_udpsrc_unlock_stop): + Since we depend on 0.10.13 -core, override the unlock_stop vmethod for + safer shutdown. + +2007-05-21 10:03:42 +0000 Wim Taymans + + gst/rtsp/gstrtpdec.*: Added signal for backwards compat. + Original commit message from CVS: + * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_class_init): + * gst/rtsp/gstrtpdec.h: + Added signal for backwards compat. + +2007-05-21 09:32:26 +0000 René Stadler + + Use audioconvert for converting from non-native endianness floats in auparse instead of doing it ourself. Fixes #424527. + Original commit message from CVS: + Patch by: René Stadler + * configure.ac: + * gst/auparse/gstauparse.c: (gst_au_parse_reset), + (gst_au_parse_parse_header), (gst_au_parse_chain): + * gst/auparse/gstauparse.h: + Use audioconvert for converting from non-native endianness floats + in auparse instead of doing it ourself. Fixes #424527. + This needs the audioconvert from plugins-base CVS. + +2007-05-21 09:29:30 +0000 Wim Taymans + + gst/rtp/gstrtph263ppay.c: Fix enum registration. + Original commit message from CVS: + * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), + (gst_rtp_h263p_pay_flush): + Fix enum registration. + +2007-05-21 08:57:18 +0000 Antoine Tremblay + + gst/rtp/gstrtph263ppay.*: Add new fragmentation mode base on GOB headers. Fixes #438940. + Original commit message from CVS: + Patch by: Antoine Tremblay + * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), + (gst_rtp_h263p_pay_class_init), (gst_rtp_h263p_pay_init), + (gst_rtp_h263p_pay_set_property), (gst_rtp_h263p_pay_get_property), + (gst_rtp_h263p_pay_flush): + * gst/rtp/gstrtph263ppay.h: + Add new fragmentation mode base on GOB headers. Fixes #438940. + +2007-05-20 21:31:58 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.c: Add missing audioconverts in the example pipelines of wavpackenc. As the wavpack stuff n... + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: + Add missing audioconverts in the example pipelines of wavpackenc. As + the wavpack stuff now needs input with 32 bit width (and random depth) + this is needed now. The example pipelines for the parser and decoder + are still fine. + +2007-05-20 14:59:46 +0000 Tim-Philipp Müller + + 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-20 14:14:49 +0000 Tim-Philipp Müller + + gst/: Printf format fixes (#439910, #439911). + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample): + * gst/switch/gstswitch.c: (gst_switch_chain): + Printf format fixes (#439910, #439911). + +2007-05-20 14:05:42 +0000 Tim-Philipp Müller + + gst/rtsp/gstrtspsrc.c: Printf format fix. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_udp): + Printf format fix. + +2007-05-19 10:01:45 +0000 René Stadler + + Add replaygain playback elements (#412710). + Original commit message from CVS: + Patch by: René Stadler + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * docs/plugins/inspect/plugin-replaygain.xml: + * gst/replaygain/Makefile.am: + * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_class_init), + (gst_rg_analysis_start), (gst_rg_analysis_set_caps), + (gst_rg_analysis_transform_ip), (gst_rg_analysis_event), + (gst_rg_analysis_stop), (gst_rg_analysis_handle_tags), + (gst_rg_analysis_handle_eos), (gst_rg_analysis_track_result), + (gst_rg_analysis_album_result): + * gst/replaygain/gstrganalysis.h: + * gst/replaygain/gstrglimiter.c: (gst_rg_limiter_base_init), + (gst_rg_limiter_class_init), (gst_rg_limiter_init), + (gst_rg_limiter_set_property), (gst_rg_limiter_get_property), + (gst_rg_limiter_transform_ip): + * gst/replaygain/gstrglimiter.h: + * gst/replaygain/gstrgvolume.c: (gst_rg_volume_base_init), + (gst_rg_volume_class_init), (gst_rg_volume_init), + (gst_rg_volume_set_property), (gst_rg_volume_get_property), + (gst_rg_volume_dispose), (gst_rg_volume_change_state), + (gst_rg_volume_sink_event), (gst_rg_volume_tag_event), + (gst_rg_volume_reset), (gst_rg_volume_update_gain), + (gst_rg_volume_determine_gain): + * gst/replaygain/gstrgvolume.h: + * gst/replaygain/replaygain.c: (plugin_init): + * gst/replaygain/replaygain.h: + * gst/replaygain/rganalysis.h: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/rganalysis.c: (send_eos_event), + (GST_START_TEST): + * tests/check/elements/rglimiter.c: (setup_rglimiter), + (cleanup_rglimiter), (set_playing_state), (create_test_buffer), + (verify_test_buffer), (GST_START_TEST), (rglimiter_suite), (main): + * tests/check/elements/rgvolume.c: (event_func), (setup_rgvolume), + (cleanup_rgvolume), (set_playing_state), (set_null_state), + (send_eos_event), (send_tag_event), (test_buffer_new), + (fail_unless_target_gain), (fail_unless_result_gain), + (fail_unless_gain), (GST_START_TEST), (rgvolume_suite), (main): + Add replaygain playback elements (#412710). + +2007-05-18 13:27:39 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Don't crash when an unsupported transport error was returned by the server, just try to config... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams): + Don't crash when an unsupported transport error was returned by the + server, just try to configure the next stream. Fixes #439255. + +2007-05-18 11:39:12 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Add TCP timeout property and use it for all TCP connection. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), + (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), + (gst_rtspsrc_stream_configure_udp), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_try_send), (gst_rtspsrc_send), + (gst_rtspsrc_setup_streams), (gst_rtspsrc_open): + * gst/rtsp/gstrtspsrc.h: + Add TCP timeout property and use it for all TCP connection. + * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), + (rtsp_connection_write), (rtsp_connection_next_timeout), + (rtsp_connection_reset_timeout): + Make connect and writes cancelable and make them use the timeout. + +2007-05-18 10:36:12 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Refactor timeout handling. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive), + (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), + (gst_rtspsrc_try_send), (gst_rtspsrc_send), + (gst_rtspsrc_setup_streams): + Refactor timeout handling. + Also send keep-alive when dealing with TCP transport. + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (rtsp_connection_free), (rtsp_connection_next_timeout), + (rtsp_connection_reset_timeout): + * gst/rtsp/rtspconnection.h: + Use a timer to handle the session timeouts, add some methods to deal + with timeouts. + +2007-05-17 14:56:39 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Ignore streams that fail the setup command, we will retry with a different transport later on. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), + (gst_rtspsrc_setup_streams): + Ignore streams that fail the setup command, we will retry with a + different transport later on. + * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_parse_sdp), + (rtsp_ext_wms_configure_stream): + Fix encoding name case. + +2007-05-17 10:59:00 +0000 Edward Hervey + + sys/osxvideo/osxvideosink.*: Remove the event-loop-in-separate-thread modifications, because MacOSX is $#@(*%$# ! For... + Original commit message from CVS: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + Remove the event-loop-in-separate-thread modifications, because MacOSX + is $#@(*%$# ! For those wondering, the event handling needs to be done + in the main thread after all.. + +2007-05-17 09:41:48 +0000 Edward Hervey + + sys/osxvideo/osxvideosink.*: Fix a stupid #if vs #ifdef bug. Should use the proper colorspace now. + Original commit message from CVS: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + Fix a stupid #if vs #ifdef bug. Should use the proper colorspace now. + Use a separate thread/task for the cocoa event_loop, else it wouldn't + stop. + +2007-05-16 16:50:23 +0000 Edward Hervey + + ext/libpng/gstpngdec.c: Fix build on macosx. + Original commit message from CVS: + * ext/libpng/gstpngdec.c: (user_endrow_callback), (user_read_data): + Fix build on macosx. + +2007-05-16 16:30:03 +0000 Sebastian Dröge + + ext/raw1394/gstdv1394src.c: Replace direct comparison of a string with the string literal "" with a comparison of the... + Original commit message from CVS: + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_uri_set_uri): + Replace direct comparison of a string with the string literal "" with + a comparison of the first character with '\0'. Fixes #438926. + +2007-05-15 17:22:58 +0000 Tim-Philipp Müller + + 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-05-15 11:18:33 +0000 Stefan Kost + + gst/debug/breakmydata.c (gst_break_my_data_init): One more try. This should be the proper fix now. + Original commit message from CVS: + * gst/debug/breakmydata.c (gst_break_my_data_init): + One more try. This should be the proper fix now. + +2007-05-15 06:41:58 +0000 Stefan Kost + + gst/debug/breakmydata.c: Ooops, no // comments please. + Original commit message from CVS: + * gst/debug/breakmydata.c: + Ooops, no // comments please. + +2007-05-15 06:34:48 +0000 Stefan Kost + + gst/debug/breakmydata.c: Fix gst_buffer_is_writable() assertion. + Original commit message from CVS: + * gst/debug/breakmydata.c: (gst_break_my_data_class_init), + (gst_break_my_data_init): + Fix gst_buffer_is_writable() assertion. + +2007-05-15 02:56:23 +0000 David Schleef + + sys/v4l2/gstv4l2src.c: Add support for Bayer images as video/x-raw-bayer. Fixes #314160. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: Add support for Bayer images as + video/x-raw-bayer. Fixes #314160. + +2007-05-14 17:10:12 +0000 Wim Taymans + + gst/rtp/: Update theora pay/depayloader in a similar to vorbis. + Original commit message from CVS: + * gst/rtp/gstrtptheoradepay.c: (decode_base64), + (gst_rtp_theora_depay_parse_configuration): + * gst/rtp/gstrtptheorapay.c: (encode_base64), + (gst_rtp_theora_pay_finish_headers), + (gst_rtp_theora_pay_handle_buffer): + Update theora pay/depayloader in a similar to vorbis. + * gst/rtp/gstrtpvorbisdepay.c: + (gst_rtp_vorbis_depay_parse_configuration): + Update docs. + +2007-05-14 16:19:58 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: When we try to execute a method that is not supported by the server, don't error out but remov... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send): + When we try to execute a method that is not supported by the server, + don't error out but remove the method from the accepted methods so that + we never try to perform this method again. + +2007-05-14 14:47:26 +0000 Wim Taymans + + gst/rtp/gstrtpvorbisdepay.c: Remove annoying _dump_mem. + Original commit message from CVS: + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_process): + Remove annoying _dump_mem. + +2007-05-14 11:11:42 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Parse range correctly. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_range): + Parse range correctly. + * gst/rtsp/rtspurl.c: (rtsp_url_get_request_uri): + The baseurl now always has a '/' at the start. + +2007-05-14 09:01:05 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Factor out caps configuration and configure more stuff such as the time ranges and speed/scale... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_configure_caps), + (gst_rtspsrc_parse_range), (gst_rtspsrc_open), + (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play): + Factor out caps configuration and configure more stuff such as the time + ranges and speed/scale values. + * gst/rtsp/rtsptransport.c: + Add Copyright after non-trival fixes. + +2007-05-13 19:57:45 +0000 David Schleef + + gst/replaygain/rganalysis.c: Fix wrong ifdef for visual C++. Fixes: #437403. + Original commit message from CVS: + * gst/replaygain/rganalysis.c: + Fix wrong ifdef for visual C++. Fixes: #437403. + By Ali Sabil . + +2007-05-13 15:47:13 +0000 Sébastien Moutte + + gst/level/gstlevel.c: Use guint8 * instead of gpointer then vs6 can build in_data += (filter->width / 8). + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_transform_ip): + Use guint8 * instead of gpointer then vs6 can build + in_data += (filter->width / 8). + +2007-05-12 16:37:50 +0000 Peter Kjellerstedt + + gst/rtsp/: Make channel guint8 where possible. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspconnection.c: (rtsp_connection_receive): + * gst/rtsp/rtspmessage.c: (rtsp_message_init_data), + (rtsp_message_get_header): + * gst/rtsp/rtspmessage.h: + Make channel guint8 where possible. + Make rtsp_message_init_data() take the channel as a guint8. + * gst/rtsp/rtspdefs.c: + Fixed a typo: Timout -> Timeout + * gst/rtsp/rtspdefs.h: + Make RTSP_CHECK() behave as a statement. + * gst/rtsp/sdpmessage.c: + Avoid a compiler warning in INIT_ARRAY(). + Fixes #437692. + +2007-05-12 16:27:51 +0000 Peter Kjellerstedt + + gst/rtsp/rtspurl.*: Add support for query parameters to RTSP URLs. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_free), + (rtsp_url_get_request_uri): + * gst/rtsp/rtspurl.h: + Add support for query parameters to RTSP URLs. + +2007-05-12 16:26:06 +0000 Peter Kjellerstedt + + gst/rtsp/rtsptransport.*: Add validation to rtsp_transport_parse(). + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/rtsp/rtsptransport.c: (rtsp_transport_init), (parse_mode), + (parse_range), (range_as_text), (rtsp_transport_mode_as_text), + (rtsp_transport_profile_as_text), (rtsp_transport_ltrans_as_text), + (rtsp_transport_parse), (rtsp_transport_as_text): + * gst/rtsp/rtsptransport.h: + Add validation to rtsp_transport_parse(). + Add rtsp_transport_as_text() to generate an RTSP header from an + RTSPTransport. + Change ssrc to guint (was a string) since that is what it is, even + though it is sent as a hex string. + Correctly identify PLAY|RECORD mode parameters (the syntax in the RFC is + incorrect, which can be seen when looking at the examples in the RFC). + Fixes #437670. + +2007-05-11 16:11:04 +0000 Eric Anholt + + * ChangeLog: + * sys/ximage/gstximagesrc.c: + sys/ximage/gstximagesrc.c (gst_ximage_src_open_display, gst_ximage_src_ximage_get): + Original commit message from CVS: + Patch by: Eric Anholt + * sys/ximage/gstximagesrc.c (gst_ximage_src_open_display, + gst_ximage_src_ximage_get): + Use union of all damage between frames to make it faster. + Fixes bug #342463. + Also fix crasher when cursor is at bottom right of window. + +2007-05-11 16:01:45 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: Skip LIST chunks before the fmt chunk (fixes #437499). Also fix streaming mode regression... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + Skip LIST chunks before the fmt chunk (fixes #437499). Also fix + streaming mode regression for file from #343837 with 'bext' chunk + before the 'fmt' chunk. + +2007-05-11 15:09:39 +0000 Wim Taymans + + gst/rtsp/: Preliminary seek support. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_flush), + (gst_rtspsrc_do_seek), (gst_rtspsrc_perform_seek), + (gst_rtspsrc_handle_src_event), + (gst_rtspsrc_stream_configure_manager), + (gst_rtspsrc_stream_configure_tcp), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_open), + (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspdefs.h: + Preliminary seek support. + Activate internal pads so that we can receive events on them. + Don't try to parse a range string when it's NULL. + +2007-05-11 15:04:38 +0000 Wim Taymans + + gst/rtp/README: Update README with new RTP variables that will be used for synchronisation. + Original commit message from CVS: + * gst/rtp/README: + Update README with new RTP variables that will be used for + synchronisation. + * gst/rtp/gstrtpvorbisdepay.c: (decode_base64), + (gst_rtp_vorbis_depay_parse_configuration), + (gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbispay.c: (encode_base64), + (gst_rtp_vorbis_pay_finish_headers), + (gst_rtp_vorbis_pay_handle_buffer): + Update vorbis pay and depayloader to draft-04. + +2007-05-11 11:24:13 +0000 Wim Taymans + + gst/rtsp/rtsptransport.c: UDP MCAST is actually the default for RTP/AVP. + Original commit message from CVS: + * gst/rtsp/rtsptransport.c: + UDP MCAST is actually the default for RTP/AVP. + +2007-05-11 10:31:27 +0000 Zaheer Abbas Merali + + sys/ximage/gstximagesrc.c (gst_ximage_src_start, gst_ximage_src_ximage_get): + Original commit message from CVS: + * sys/ximage/gstximagesrc.c (gst_ximage_src_start, + gst_ximage_src_ximage_get): + * sys/ximage/gstximagesrc.h (last_ximage): + When using Damage actually keep the last frame, and not assume + that the buffer we get already has the last frame on it. + Copy the cursor over if we specify a non-zero start x and + start y. + +2007-05-11 09:12:55 +0000 Wim Taymans + + gst/rtsp/rtsptransport.c: Make UDP the default transport when not specified. + Original commit message from CVS: + * gst/rtsp/rtsptransport.c: + Make UDP the default transport when not specified. + +2007-05-10 14:02:07 +0000 Stefan Kost + + gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, gst_qtde... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, + gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, + gst_qtdemux_prepare_current_sample, gst_qtdemux_combine_flows, + gst_qtdemux_loop_state_movie, gst_qtdemux_loop, + qtdemux_parse_segments, qtdemux_parse_trak): + * gst/rtpmanager/rtpsession.c (rtp_session_get_bandwidth, + rtp_session_get_rtcp_bandwidth, rtp_session_get_cname, + rtp_session_get_name, rtp_session_get_email, rtp_session_get_phone, + rtp_session_get_location, rtp_session_get_tool, + rtp_session_process_bye, session_report_blocks): + * gst/rtpmanager/rtpsource.c (rtp_source_process_rtp, + rtp_source_send_rtp, rtp_source_process_sr, rtp_source_process_rb): + More format arg fixing (spotted by Ali Sabil ). + * gst/switch/Makefile.am: + Add require libraries(spotted by Ali Sabil ). + +2007-05-10 01:21:19 +0000 David Schleef + + gst/level/gstlevel.c: Revert last change. + Original commit message from CVS: + * gst/level/gstlevel.c: + Revert last change. + +2007-05-09 21:30:53 +0000 Sébastien Moutte + + gst/level/gstlevel.c: Use guint8 * instead of gpointer then vs6 know the size of data pointed when moving the pointer. + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_calculate_##TYPE), + (gst_level_transform_ip): + Use guint8 * instead of gpointer then vs6 know the size of data + pointed when moving the pointer. + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_handle_buffer): + Move instructions after variables declaration. + * win32/vs6/autogen.dsp: + * win32/vs6/libgstrtp.dsp: + * win32/vs6/libgstrtsp.dsp: + Update vs6 project files. + +2007-05-09 11:23:39 +0000 Wim Taymans + + gst/rtsp/: Add code to parse time ranges. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_handle_src_query), + (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_open): + * gst/rtsp/rtsprange.c: (parse_npt_time), (parse_npt_range), + (parse_clock_range), (parse_smpte_range), (rtsp_range_parse), + (rtsp_range_free): + * gst/rtsp/rtsprange.h: + Add code to parse time ranges. + Report DURATION on the stream when possible. + +2007-05-08 15:49:01 +0000 Tim-Philipp Müller + + gst/videomixer/videomixer.c: Fix strides calculation for AYUV (it's just width*4) (#436910). + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_ayuv), + (gst_videomixer_fill_checker), (gst_videomixer_fill_color), + (gst_videomixer_collected): + Fix strides calculation for AYUV (it's just width*4) (#436910). + +2007-05-06 21:32:40 +0000 Sebastian Dröge + + gst/audiofx/: Sync the GObject properties before each processing step to properly work with the controller. + Original commit message from CVS: + * gst/audiofx/audioamplify.c: (gst_audio_amplify_transform_ip): + * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_transform_ip): + * gst/audiofx/audioinvert.c: (gst_audio_invert_transform_ip): + Sync the GObject properties before each processing step to properly + work with the controller. + +2007-05-04 15:17:14 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Let more error state trickle down so that we can catch more error cases. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_try_send), (gst_rtspsrc_send), + (gst_rtspsrc_setup_streams), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), + (gst_rtspsrc_change_state): + Let more error state trickle down so that we can catch more error + cases. + Handle keep-alive a little smarter by selecting a method the server + actually supports. + Fix a race in UDP streaming shutdown. + +2007-05-04 13:04:31 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Ignore errors when trying to use the keep-alive messages. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive): + Ignore errors when trying to use the keep-alive messages. + +2007-05-04 12:31:32 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Send RTCP messages back to the server over the TCP connection. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_handle_src_event), + (gst_rtspsrc_handle_src_query), (gst_rtspsrc_sink_chain), + (gst_rtspsrc_stream_configure_manager), + (gst_rtspsrc_stream_free_udp), (gst_rtspsrc_stream_configure_tcp), + (gst_rtspsrc_stream_configure_mcast), + (gst_rtspsrc_stream_configure_udp), + (gst_rtspsrc_stream_configure_udp_sink), + (gst_rtspsrc_stream_configure_transport): + Send RTCP messages back to the server over the TCP connection. + * gst/rtsp/rtspconnection.c: (rtsp_connection_write), + (rtsp_connection_send), (rtsp_connection_read), (read_body), + (rtsp_connection_receive): + * gst/rtsp/rtspconnection.h: + Factor out and expose lowlevel _write and _read methods. + Implement sending data messages to the server. + +2007-05-03 15:55:06 +0000 Wim Taymans + + gst/multipart/multipartmux.c: Fix timestamps on outgoing buffers. + Original commit message from CVS: + * gst/multipart/multipartmux.c: (gst_multipart_mux_queue_pads), + (gst_multipart_mux_collected): + Fix timestamps on outgoing buffers. + +2007-05-03 14:39:09 +0000 Wim Taymans + + gst/multipart/multipartmux.c: Emit NEWSEGMENT events before pushing the first buffer. + Original commit message from CVS: + * gst/multipart/multipartmux.c: + (gst_multipart_mux_request_new_pad), (gst_multipart_mux_collected), + (gst_multipart_mux_change_state): + Emit NEWSEGMENT events before pushing the first buffer. + +2007-05-03 13:48:54 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Refactor transport configuration code. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize), + (gst_rtspsrc_alloc_udp_ports), (gst_rtspsrc_handle_src_event), + (gst_rtspsrc_handle_src_query), + (gst_rtspsrc_stream_configure_manager), + (gst_rtspsrc_stream_free_udp), (gst_rtspsrc_stream_configure_tcp), + (gst_rtspsrc_stream_configure_mcast), + (gst_rtspsrc_stream_configure_udp), + (gst_rtspsrc_stream_configure_udp_sink), + (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_push_event), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_open), + (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play), + (gst_rtspsrc_pause): + Refactor transport configuration code. + Create internal pads for TCP transport so that we can implement events + and queries. + Handle events and queries. + Parse range from the SDP. + Fix race in pause handler where the connection could still be flushing. + +2007-05-02 19:32:58 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Fix race when multiple udp sources post timeouts, just act on the first received timeout. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_finalize), (new_session_pad), (request_pt_map), + (gst_rtspsrc_loop_send_cmd), (gst_rtspsrc_try_send), + (gst_rtspsrc_send), (gst_rtspsrc_async_open), (gst_rtspsrc_close), + (gst_rtspsrc_play), (gst_rtspsrc_handle_message), + (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Fix race when multiple udp sources post timeouts, just act on the first + received timeout. + Protect stream list with a recursive lock to fix some races. + Flush connection when we need to do a reconnect or stop. + Make state lock recursive. + * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), + (rtsp_connection_close): + Some small cleanups. + +2007-05-02 18:31:16 +0000 Sebastian Dröge + + ext/wavpack/gstwavpack.c: Call bindtextdomain() to get localized strings. + Original commit message from CVS: + * ext/wavpack/gstwavpack.c: (plugin_init): + Call bindtextdomain() to get localized strings. + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), + (gst_wavpack_parse_handle_seek_event), + (gst_wavpack_parse_push_buffer), (gst_wavpack_parse_chain): + * ext/wavpack/gstwavpackparse.h: + Handle DISCONT buffers by correctly setting the DISCONT flag + on outgoing buffers when necessary. + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_handle_seek_event) + Send newsegment from the streaming thread. + +2007-05-02 18:25:09 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Only set DISCONT when there actually is a discont or when we just started. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data): + Only set DISCONT when there actually is a discont or when we just + started. + +2007-05-02 18:01:52 +0000 Sebastian Dröge + + ext/flac/gstflac.c: Call bindtextdomain() to get localized strings. + Original commit message from CVS: + * ext/flac/gstflac.c: (plugin_init): + Call bindtextdomain() to get localized strings. + +2007-05-02 17:19:36 +0000 Wim Taymans + + gst/wavparse/gstwavparse.*: Be a bit more clever when dealing with VBR files with FACT tags, we don't want to timesta... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), + (gst_wavparse_stream_headers), (gst_wavparse_add_src_pad), + (gst_wavparse_stream_data): + * gst/wavparse/gstwavparse.h: + Be a bit more clever when dealing with VBR files with FACT tags, we + don't want to timestamp buffers in that case but the estimated BPS can + be used for seeking. + Only send close segment in the streaming thread. + +2007-05-02 17:08:09 +0000 Sebastian Dröge + + ext/flac/gstflacdec.c: Correctly post an error on the bus if something went wrong in the loop function. This fixes a ... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_loop): + Correctly post an error on the bus if something went wrong in the loop + function. This fixes a few cases where the task was paused and nothing + happened anymore. + +2007-05-02 16:58:06 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Remove old workaround that was needed when seeking after the last sample. With the fix... + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_handle_seek_event): + Remove old workaround that was needed when seeking after the last + sample. With the fixed error handling this works now as expected + without pushing the last sample although it wasn't requested. + +2007-05-02 16:45:43 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Handle segment seeks in the seek event handler, correctly work with stop position == -... + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_handle_seek_event): + Handle segment seeks in the seek event handler, correctly work with + stop position == -1 and instead of stopping the task on seek just + pause it. + +2007-05-02 16:19:58 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Add handling for segment seeks. + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_loop): + Add handling for segment seeks. + +2007-05-02 15:13:04 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Correctly handle errors, especially in the loop function. Before it was easy to get th... + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_pull_buffer), + (gst_wavpack_parse_create_src_pad), + (gst_wavpack_parse_resync_loop), (gst_wavpack_parse_loop), + (gst_wavpack_parse_chain): + Correctly handle errors, especially in the loop function. Before it + was easy to get the task paused but no error being posted on the bus. + +2007-05-02 14:27:28 +0000 Wim Taymans + + gst/rtsp/test.c: Fix compilation of deprecated test just because I'm too lazy to delete it. + Original commit message from CVS: + * gst/rtsp/test.c: (main): + Fix compilation of deprecated test just because I'm too lazy to delete + it. + +2007-05-02 13:32:57 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Fix sending RTCP to the right place. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_finalize), (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_handle_request), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_udp), + (gst_rtspsrc_loop_send_cmd), (gst_rtspsrc_try_send), + (gst_rtspsrc_open), (gst_rtspsrc_handle_message): + * gst/rtsp/gstrtspsrc.h: + Fix sending RTCP to the right place. + Fix bug in reffing the wrong UDP element. + Use new pad names for the session manager. + Implement handling server requests in interleaved and UDP modes. + Handle session keep-alive in UDP modes. + Remove GCond for handling UDP timeouts. + * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), + (rtsp_connection_send), (rtsp_connection_read), (read_body), + (rtsp_connection_receive), (rtsp_connection_close): + * gst/rtsp/rtspconnection.h: + Store connection IP address for later. + Add timeout args to all operations that might block forever. + Parse session timeout. + Only close sockets when not already closed. + * gst/rtsp/rtspdefs.c: + * gst/rtsp/rtspdefs.h: + Add timeout return value and error string. + * gst/rtsp/rtspmessage.c: (rtsp_message_init_response): + Add small comment. + +2007-05-01 16:13:58 +0000 Sjoerd Simons + + gst/rtp/gstrtpmp4vpay.*: Handle NEWSEGMENT and FLUSH events. Fixes #434824. + Original commit message from CVS: + Patch by: Sjoerd Simons + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_init), + (gst_rtp_mp4v_pay_empty), (gst_rtp_mp4v_pay_event): + * gst/rtp/gstrtpmp4vpay.h: + Handle NEWSEGMENT and FLUSH events. Fixes #434824. + +2007-04-30 11:15:58 +0000 Tim-Philipp Müller + + docs/plugins/gst-plugins-good-plugins-docs.sgml: Remove v4l2src from docs, since it breaks the docs build, and the pl... + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + Remove v4l2src from docs, since it breaks the docs build, and the + plugin is only built if --enable-experimental is used anyway. + * docs/plugins/Makefile.am: + Spaces => tab. + +2007-04-29 14:43:37 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.c: Add code to drop membership of a multicast group. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (leave_multicast), + (gst_multiudpsink_add), (gst_multiudpsink_remove): + Add code to drop membership of a multicast group. + * gst/udp/gstudpsink.c: (gst_udpsink_update_uri), + (gst_udpsink_set_uri): + Implement URI handler. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_parse_rtpinfo): + Use URI handler to make udpsink instace. + Improve code to configure port and destination. + +2007-04-29 13:56:18 +0000 Thomas Vander Stichele + + * sys/directdraw/gstdirectdrawsink.c: + * sys/osxvideo/osxvideosink.m: + 80 char police + Original commit message from CVS: + 80 char police + +2007-04-29 13:53:16 +0000 Thomas Vander Stichele + + autogen.sh: Require automake 1.7 + Original commit message from CVS: + * autogen.sh: + Require automake 1.7 + * ext/alsaspdif/Makefile.am: + * ext/divx/Makefile.am: + * ext/ivorbis/Makefile.am: + * ext/musicbrainz/Makefile.am: + * ext/neon/Makefile.am: + * ext/sdl/Makefile.am: + * ext/swfdec/Makefile.am: + * ext/theora/Makefile.am: + * ext/wavpack/Makefile.am: + * ext/xvid/Makefile.am: + * gst/modplug/Makefile.am: + Fix up Makefile.am accordingly. + +2007-04-29 13:49:02 +0000 Thomas Vander Stichele + + docs/plugins/inspect/: Add jack and update. + Original commit message from CVS: + * docs/plugins/inspect/plugin-alsaspdif.xml: + * docs/plugins/inspect/plugin-bz2.xml: + * docs/plugins/inspect/plugin-cdxaparse.xml: + * docs/plugins/inspect/plugin-dfbvideosink.xml: + * docs/plugins/inspect/plugin-faac.xml: + * docs/plugins/inspect/plugin-faad.xml: + * docs/plugins/inspect/plugin-filter.xml: + * docs/plugins/inspect/plugin-freeze.xml: + * docs/plugins/inspect/plugin-glimagesink.xml: + * docs/plugins/inspect/plugin-gsm.xml: + * docs/plugins/inspect/plugin-h264parse.xml: + * docs/plugins/inspect/plugin-jack.xml: + * docs/plugins/inspect/plugin-mms.xml: + * docs/plugins/inspect/plugin-modplug.xml: + * docs/plugins/inspect/plugin-musepack.xml: + * docs/plugins/inspect/plugin-musicbrainz.xml: + * docs/plugins/inspect/plugin-neon.xml: + * docs/plugins/inspect/plugin-nsfdec.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-sdl.xml: + * docs/plugins/inspect/plugin-soundtouch.xml: + * docs/plugins/inspect/plugin-spectrum.xml: + * docs/plugins/inspect/plugin-speed.xml: + * docs/plugins/inspect/plugin-tta.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + * docs/plugins/inspect/plugin-xingheader.xml: + * docs/plugins/inspect/plugin-xvid.xml: + Add jack and update. + +2007-04-29 12:19:21 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.c: Fix multicast detection. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add): + Fix multicast detection. + Don't try to join a multicast group if the address is not multicast. + * gst/udp/gstudpsrc.c: (gst_udpsrc_update_uri): + Small debug improvement. + +2007-04-27 16:44:17 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Ignore ASYNC state messages from the udpsink, it's irrelevant for the parent. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play), + (gst_rtspsrc_handle_message): + Ignore ASYNC state messages from the udpsink, it's irrelevant for the + parent. + +2007-04-27 15:30:39 +0000 Wim Taymans + + gst/rtp/gstrtpilbcdepay.h: Fix mode property when specified as an arg. + Original commit message from CVS: + * gst/rtp/gstrtpilbcdepay.h: + Fix mode property when specified as an arg. + +2007-04-26 15:08:20 +0000 Edward Hervey + + docs/plugins/: Add documentation for osxaudio plugin. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-osxaudio.xml: + Add documentation for osxaudio plugin. + +2007-04-26 14:31:32 +0000 Edward Hervey + + docs/plugins/: Add documentation for osxvideo + Original commit message from CVS: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/inspect/plugin-osxvideo.xml: + Add documentation for osxvideo + +2007-04-26 10:08:27 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Protect state changes with a lock. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_finalize), (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_open), (gst_rtspsrc_close), + (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play), + (gst_rtspsrc_pause): + * gst/rtsp/gstrtspsrc.h: + Protect state changes with a lock. + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (parse_line): + * gst/rtsp/rtspconnection.h: + Remove some unused stuff. + +2007-04-26 08:48:30 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Handle the case where there are exactly 0 bytes to read and the ioctl did not report an error. F... + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Handle the case where there are exactly 0 bytes to read and the ioctl + did not report an error. Fixes #433530. + +2007-04-26 08:39:49 +0000 Wim Taymans + + gst/wavparse/gstwavparse.*: Apply DISCONT to buffers. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data): + * gst/wavparse/gstwavparse.h: + Apply DISCONT to buffers. + Only apply timestamp to the first sample after a DISCONT, too many VBR + files cause random jitter in the timestamps. Fixes #433119. + +2007-04-25 15:55:32 +0000 Wim Taymans + + gst/rtsp/gstrtpdec.*: Add dummy latency property to be backwards compat with rtpbin. + Original commit message from CVS: + * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_class_init), + (gst_rtp_dec_init), (gst_rtp_dec_set_property), + (gst_rtp_dec_get_property): + * gst/rtsp/gstrtpdec.h: + Add dummy latency property to be backwards compat with rtpbin. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), + (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_parse_rtpinfo): + * gst/rtsp/gstrtspsrc.h: + Add latency property and configure in the session manager. + Don't set invalid clock-base and seqnum-base on caps, some servers + sometimes don't send them. + +2007-04-25 15:31:53 +0000 Tim-Philipp Müller + + gst/alpha/gstalphacolor.c: Double-check that RGB input caps are really RGBA caps (apparently the core doesn't always ... + Original commit message from CVS: + * gst/alpha/gstalphacolor.c: (gst_alpha_color_base_init), + (gst_alpha_color_transform_caps), (gst_alpha_color_set_caps): + Double-check that RGB input caps are really RGBA caps (apparently + the core doesn't always catch it if those caps aren't a subset of + our template caps, also see #421543). Fixes #429319 in a way. + Also, don't leak the pad template in the transform_caps function. + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/alphacolor.c: (setup_alphacolor), + (cleanup_alphacolor), (create_caps_rgb24), (create_caps_rgba32), + (create_buffer_rgb24_3x4), (create_buffer_rgba32_3x4), + (GST_START_TEST), (alphacolor_suite): + Add some basic unit tests for alphacolor. + +2007-04-25 15:08:22 +0000 Tim-Philipp Müller + + ext/libpng/gstpngdec.c: If we get a fatal flow return in the loop function, first post the error message and only the... + Original commit message from CVS: + * ext/libpng/gstpngdec.c: (gst_pngdec_task): + If we get a fatal flow return in the loop function, first post the + error message and only then send the EOS event downstream, otherwise + applications might get an eos message before the error message and + think everything was ok (related to #429319). + +2007-04-25 10:07:12 +0000 Wim Taymans + + gst/rtsp/rtspconnection.c: Read the channel byte as an unsigned byte. + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: (rtsp_connection_receive): + Read the channel byte as an unsigned byte. + +2007-04-25 09:47:48 +0000 Wim Taymans + + gst/rtp/: Make sure we configure the clock_rate in the baseclass in the setcaps function. Fixes #431282. + Original commit message from CVS: + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_set_property): + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_init), + (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_init), + (gst_rtp_gsm_depay_setcaps): + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_class_init), + (gst_rtp_ilbc_depay_init), (gst_rtp_ilbc_depay_setcaps), + (gst_rtp_ilbc_depay_process), (gst_ilbc_depay_set_property), + (gst_ilbc_depay_get_property): + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_init), + (gst_rtp_pcma_depay_setcaps): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_init), + (gst_rtp_pcmu_depay_setcaps): + Make sure we configure the clock_rate in the baseclass in the setcaps + function. Fixes #431282. + +2007-04-25 08:36:46 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Parse server address from SDP. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize), + (gst_rtspsrc_stream_free), (request_pt_map), + (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_open): + * gst/rtsp/gstrtspsrc.h: + Parse server address from SDP. + Hook up a udpsink to send RTCP back to the server. + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/rtsp/rtsptransport.h: + Add some docs. + +2007-04-25 06:52:09 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: Make header field check conditional. Fixes #433135 + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + Make header field check conditional. Fixes #433135 + +2007-04-24 09:12:42 +0000 Tim-Philipp Müller + + Add minimal docs blurb to alphacolor; split out headers into separate header file for gtk-doc. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-alphacolor.xml: + * gst/alpha/Makefile.am: + * gst/alpha/gstalphacolor.c: + * gst/alpha/gstalphacolor.h: + Add minimal docs blurb to alphacolor; split out headers into + separate header file for gtk-doc. + +2007-04-20 17:25:50 +0000 Tim-Philipp Müller + + gst/debug/progressreport.c: Don't try to post NULL message (in case we can't query upstream position or duration). + Original commit message from CVS: + * gst/debug/progressreport.c: (gst_progress_report_report): + Don't try to post NULL message (in case we can't query upstream + position or duration). + +2007-04-18 12:36:37 +0000 Michael Smith + + gst/cutter/gstcutter.*: Fix some of the most obvious bugs in cutter. Now doesn't leak everything if input is silent. + Original commit message from CVS: + * gst/cutter/gstcutter.c: (gst_cutter_init), (gst_cutter_chain), + (gst_cutter_get_caps): + * gst/cutter/gstcutter.h: + Fix some of the most obvious bugs in cutter. Now doesn't leak + everything if input is silent. + +2007-04-18 09:48:25 +0000 Sebastian Dröge + + gst/wavenc/gstwavenc.*: everything else results in a invalid block align and invalid files. + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), + (gst_wavenc_sink_setcaps), (gst_wavenc_change_state): + * gst/wavenc/gstwavenc.h: + Wav apparently only supports width==GST_ROUND_UP(depth), everything + else results in a invalid block align and invalid files. + +2007-04-17 16:39:02 +0000 Snaik + + gst/smpte/barboxwipes.c: Add missing break statement for BOX_HORIZONTAL case. + Original commit message from CVS: + Patch by: Snaik + * gst/smpte/barboxwipes.c: (gst_wipe_boxes_draw): + Add missing break statement for BOX_HORIZONTAL case. + +2007-04-17 10:14:43 +0000 Vincent Torri + + gst/wavparse/gstwavparse.c: Use correct format strings for integer types. + Original commit message from CVS: + Patch by: Vincent Torri + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + Use correct format strings for integer types. + +2007-04-17 02:51:02 +0000 Sebastian Dröge + + gst/wavparse/gstwavparse.c: Use gst_riff_create_audio_template_caps () instead of the local caps. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_create_sourcepad): + Use gst_riff_create_audio_template_caps () instead of the local caps. + This makes updates of the local caps unecessary whenever libgstriff + gets support for new formats. + +2007-04-16 21:29:40 +0000 Brian Cameron + + sys/sunaudio/: Fix and/or update copyright attributions (#430228). + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudio.c: + * sys/sunaudio/gstsunaudiomixer.c: + * sys/sunaudio/gstsunaudiomixer.h: + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiomixerctrl.h: + * sys/sunaudio/gstsunaudiomixertrack.h: + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosink.h: + * sys/sunaudio/gstsunaudiosrc.c: + * sys/sunaudio/gstsunaudiosrc.h: + Fix and/or update copyright attributions (#430228). + +2007-04-14 17:18:14 +0000 Sébastien Moutte + + docs/plugins/inspect/: Add xml doc files for Windows sinks + Original commit message from CVS: + * docs/plugins/inspect/plugin-directdraw.xml: + * docs/plugins/inspect/plugin-directsound.xml: + * docs/plugins/inspect/plugin-waveform.xml: + Add xml doc files for Windows sinks + * win32/vs6/libgstqtdemux.dsp: + * win32/vs6/libgstmpegvideoparse.dsp: + * win32/vs6/gst_plugins_bad.dsw: + Update projects files. + +2007-04-13 09:32:21 +0000 Wim Taymans + + docs/plugins/gst-plugins-good-plugins-sections.txt: Fix docs. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + Fix docs. + * gst/rtsp/URLS: + Add some more example urls. + * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_marshal_BOXED__UINT_UINT), + (gst_rtp_dec_chain_rtp): + Better debugging. + * gst/rtsp/gstrtspsrc.c: (request_pt_map), + (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_parse_rtpinfo): + Remove unused code. + +2007-04-13 08:19:35 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: Relax the audio/mpeg caps again and add FIXME: comment. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), + (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), + (gst_wavparse_stream_data): + Relax the audio/mpeg caps again and add FIXME: comment. + +2007-04-13 06:20:28 +0000 Stefan Kost + + gst/wavparse/gstwavparse.*: More sanity check for the header fields. Fix type for 'rate' header field. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), + (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), + (gst_wavparse_stream_data): + * gst/wavparse/gstwavparse.h: + More sanity check for the header fields. Fix type for 'rate' header + field. + +2007-04-12 16:06:31 +0000 Tim-Philipp Müller + + gst/icydemux/gsticydemux.c: If the metadata strings we get in the stream are not UTF-8, try to interpret them accordi... + Original commit message from CVS: + * gst/icydemux/gsticydemux.c: (notgst_tag_freeform_string_to_utf8), + (gst_icydemux_unicodify): + If the metadata strings we get in the stream are not UTF-8, try to + interpret them according to the character encodings specified in the + GST_ICY_TAG_ENCODING and GST_TAG_ENCODING environment variables, and + only fall back to locale/ISO-8859-1 if those aren't set or don't + work. Should fix #428901. + +2007-04-12 14:20:56 +0000 Wim Taymans + + gst/rtp/gstrtph264depay.c: Use the proper sync word for SPS and PPS. + Original commit message from CVS: + * gst/rtp/gstrtph264depay.c: + Use the proper sync word for SPS and PPS. + +2007-04-12 11:41:11 +0000 Thomas Vander Stichele + + gst/rtp/Makefile.am: gst/rtp/fnv1hash.c (MASK_24, FNV1_HASH_32_INIT, FNV1_HASH_32_PRIME, fnv1_hash_32_new, fnv1_hash_... + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/fnv1hash.c (MASK_24, FNV1_HASH_32_INIT, FNV1_HASH_32_PRIME, + fnv1_hash_32_new, fnv1_hash_32_update, fnv1_hash_32_to_24): + * gst/rtp/fnv1hash.h (__GST_FNV1_HASH_H__): + Add a simple hashing implementation that we can use to generate + a 24-bit ident value based on the codebooks for vorbis and theora. + * gst/rtp/gstrtptheorapay.c (gst_rtp_theora_pay_finish_headers, + gst_rtp_theora_pay_handle_buffer): + * gst/rtp/gstrtpvorbisdepay.c + (gst_rtp_vorbis_depay_parse_configuration, + gst_rtp_vorbis_depay_switch_codebook, gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbispay.c (gst_rtp_vorbis_pay_reset_packet, + gst_rtp_vorbis_pay_init_packet, gst_rtp_vorbis_pay_flush_packet, + gst_rtp_vorbis_pay_finish_headers, gst_rtp_vorbis_pay_handle_buffer): + Use the hashing function, ensuring that the same codebooks result + in the same ident and thus the same SDP description. + Various log fixes/changes. + +2007-04-12 11:37:50 +0000 jerry tan + + sys/sunaudio/gstsunaudiosrc.c: it is the application's responsibility to make sure it open the device once. + Original commit message from CVS: + Patch by: jerry tan + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open): + remove the call of ioctl (fd, AUDIO_MIXER_MULTIPLE_OPEN), it is the + application's responsibility to make sure it open the device once. + Remove a careless error if AUDIODEV is set. Fixes #392620. + +2007-04-12 10:52:02 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Make timescale 32 bits again so we don't screw up the pts_offset calculations. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: + Make timescale 32 bits again so we don't screw up the pts_offset + calculations. + +2007-04-12 08:21:28 +0000 Wim Taymans + + gst/rtsp/gstrtpdec.*: Make backward compat with rtpbin by adding the request-pt-map signals. + Original commit message from CVS: + * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_marshal_BOXED__UINT_UINT), + (gst_rtp_dec_class_init), (gst_rtp_dec_chain_rtp): + * gst/rtsp/gstrtpdec.h: + Make backward compat with rtpbin by adding the request-pt-map signals. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), + (new_session_pad), (request_pt_map), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_stream_configure_caps), + (gst_rtspsrc_activate_streams): + * gst/rtsp/gstrtspsrc.h: + Implement request-pt-map signals instead of setting caps on the buffers + for the session manager. + +2007-04-11 10:25:25 +0000 Wim Taymans + + gst/udp/gstudp.c: Register GstNetBuffer in plugin_init so that the type can be used from multiple threads without races. + Original commit message from CVS: + * gst/udp/gstudp.c: (plugin_init): + Register GstNetBuffer in plugin_init so that the type can be used from + multiple threads without races. + +2007-04-11 10:19:06 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + update to spec file + Original commit message from CVS: + update to spec file + +2007-04-11 09:53:38 +0000 Wim Taymans + + gst/qtdemux/: Handle version 1 mdhd atoms to get extended precision durations. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), + (qtdemux_parse_samples), (qtdemux_parse_segments), + (qtdemux_parse_trak), (qtdemux_parse_tree): + * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_mdhd): + Handle version 1 mdhd atoms to get extended precision durations. + Fixes #426972. + +2007-04-10 17:06:05 +0000 Wim Taymans + + gst/rtp/gstrtpamrdepay.c: Fix depayloader clock_rate and some cleanups. + Original commit message from CVS: + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), + (gst_rtp_amr_depay_process): + Fix depayloader clock_rate and some cleanups. + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_finalize), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): + * gst/rtp/gstrtph264depay.h: + Don't push codec_data in the adapter because it might get flushed when + we get a discont. + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): + Handle multiple AU per packet. + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_process), + (gst_rtp_sv3v_depay_plugin_init): + Disable rank, this one does not work. + Remove timestamping, base class does that. + +2007-04-10 12:01:33 +0000 Stefan Kost + + gst/auparse/gstauparse.c: limit caps to the formats we announce in the template + Original commit message from CVS: + * gst/auparse/gstauparse.c: (gst_au_parse_parse_header): + limit caps to the formats we announce in the template + * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), + (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), + (gst_wavparse_add_src_pad), (gst_wavparse_stream_data): + fix some crashers/asserts when dealing with broken files + +2007-04-10 10:01:14 +0000 Peter Kjellerstedt + + gst/: Fix some compiler warnings. Fixes #428182. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_get_mode), + (gst_rtp_speex_depay_setcaps): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_loop_udp): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send): + Fix some compiler warnings. Fixes #428182. + +2007-04-06 12:54:16 +0000 Wim Taymans + + gst/rtsp/: Morph RTPDec into something compatible with RTPBin as a fallback. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/gstrtpdec.c: (find_session_by_id), (create_session), + (free_session), (gst_rtp_dec_base_init), (gst_rtp_dec_class_init), + (gst_rtp_dec_init), (gst_rtp_dec_finalize), + (gst_rtp_dec_query_src), (gst_rtp_dec_chain_rtp), + (gst_rtp_dec_chain_rtcp), (gst_rtp_dec_set_property), + (gst_rtp_dec_get_property), (gst_rtp_dec_provide_clock), + (gst_rtp_dec_change_state), (create_recv_rtp), (create_recv_rtcp), + (create_rtcp), (gst_rtp_dec_request_new_pad), + (gst_rtp_dec_release_pad): + * gst/rtsp/gstrtpdec.h: + * gst/rtsp/gstrtsp.c: (plugin_init): + Morph RTPDec into something compatible with RTPBin as a fallback. + Various other style fixes. + * gst/rtsp/gstrtspsrc.c: (find_stream_by_id), + (find_stream_by_udpsrc), (gst_rtspsrc_stream_free), + (gst_rtspsrc_cleanup), (gst_rtspsrc_media_to_caps), + (new_session_pad), (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_setup_auth), + (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Implement RTPBin session manager handling. + Don't try to add empty properties to caps. + Implement fallback session manager, handling. + Don't combine errors from RTCP streams, just ignore them. + * gst/rtsp/rtsptransport.c: (rtsp_transport_get_manager): + * gst/rtsp/rtsptransport.h: + Implement fallback session manager. + Make RTPBin the default one when available. + +2007-04-05 15:05:24 +0000 Wim Taymans + + gst/qtdemux/gstrtpxqtdepay.*: Try to recover from packet loss a little better. + Original commit message from CVS: + * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_process), + (gst_rtp_xqt_depay_change_state): + * gst/qtdemux/gstrtpxqtdepay.h: + Try to recover from packet loss a little better. + +2007-04-05 13:56:44 +0000 Wim Taymans + + gst/rtp/gstrtpmp4adepay.c: This element is ready to be autoplugged. + Original commit message from CVS: + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_class_init), + (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_plugin_init): + This element is ready to be autoplugged. + +2007-04-05 11:26:25 +0000 Julien Moutte + + gst/avi/gstavidemux.c: Don't leave the offsets defined by upstream element on the compressed data buffer we are pushi... + Original commit message from CVS: + 2007-04-05 Julien MOUTTE + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): + Don't leave the offsets defined by upstream element on the + compressed data buffer we are pushing downstream. Make them + GST_BUFFER_OFFSET_NONE. + +2007-04-04 12:39:41 +0000 Stefan Kost + + gst/avi/: Don't abort on out-of-memory. Use stream-nr as unsigned integer only. + Original commit message from CVS: + * gst/avi/README: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), + (gst_avi_demux_stream_index), (gst_avi_demux_sync), + (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_stream_header_push), + (gst_avi_demux_stream_header_pull), (gst_avi_demux_combine_flows), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data): + Don't abort on out-of-memory. Use stream-nr as unsigned integer only. + +2007-04-03 09:55:45 +0000 Wim Taymans + + gst/smpte/barboxwipes.c: + Original commit message from CVS: + * gst/smpte/barboxwipes.c: + Fix error as spotted by Snaik + +2007-03-30 17:19:34 +0000 Sebastian Dröge + + gst/wavparse/gstwavparse.c: Support audio/x-raw-float in wav files. This only works with plugins-base CVS, using an o... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Support audio/x-raw-float in wav files. This only works with + plugins-base CVS, using an older version doesn't have any + disadvantages though. + +2007-03-30 15:59:27 +0000 Sebastian Dröge + + Revert last change as we don't want plugins-good to depend on plugins-base CVS now. + Original commit message from CVS: + * configure.ac: + * gst/auparse/gstauparse.c: (gst_au_parse_reset), + (gst_au_parse_parse_header), (gst_au_parse_chain): + * gst/auparse/gstauparse.h: + Revert last change as we don't want plugins-good to depend on + plugins-base CVS now. + +2007-03-30 04:50:11 +0000 Sebastian Dröge + + ext/wavpack/: Don't play audioconvert. As wavpack wants/outputs all samples with width==32 and depth=[1,32] accept th... + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), + (gst_wavpack_dec_init), (gst_wavpack_dec_sink_set_caps), + (gst_wavpack_dec_clip_outgoing_buffer), + (gst_wavpack_dec_post_tags), (gst_wavpack_dec_chain): + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_reset), + (gst_wavpack_enc_sink_set_caps), (gst_wavpack_enc_set_wp_config), + (gst_wavpack_enc_chain): + * ext/wavpack/gstwavpackenc.h: + * ext/wavpack/gstwavpackparse.c: + Don't play audioconvert. As wavpack wants/outputs all samples with + width==32 and depth=[1,32] accept this and let audioconvert convert + to accepted formats instead of doing it in the element for n*8 depths. + This also adds support for non-n*8 depths and prevents some useless + memory allocations. Fixes #421598 + Also add a workaround for bug #421542 in wavpackenc for now... + * tests/check/elements/wavpackdec.c: (GST_START_TEST): + * tests/check/elements/wavpackenc.c: (GST_START_TEST): + * tests/check/elements/wavpackparse.c: (GST_START_TEST): + Consider the change above in the unit tests and test if the correct + caps are accepted and set. Also check for GST_BUFFER_OFFSET_END in + the wavpackparse unit test. + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_init), + (gst_wavpack_dec_sink_set_caps): + Set caps on the src pad as soon as possible. + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackcommon.h: + * ext/wavpack/gstwavpackenc.h: + * ext/wavpack/gstwavpackparse.h: + Fix indention. gst-indent is now called by cicl. + +2007-03-29 18:51:33 +0000 René Stadler + + configure.ac: Require gst-plugins-base CVS for audioconvert with non-native float support and width/depth fix in libg... + Original commit message from CVS: + * configure.ac: + Require gst-plugins-base CVS for audioconvert with non-native + float support and width/depth fix in libgstriff. + Patch by: René Stadler + * gst/auparse/gstauparse.c: (gst_au_parse_reset), + (gst_au_parse_parse_header), (gst_au_parse_chain): + * gst/auparse/gstauparse.h: + Don't swap the floats ourself if they're not in native endianness. + Instead let audioconvert handle this. Fixes #339838. + +2007-03-29 14:40:35 +0000 Wim Taymans + + gst/rtp/: Flush adapter on disconts. + Original commit message from CVS: + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_process), + (gst_rtp_h263p_depay_change_state): + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process), + (gst_rtp_h264_depay_change_state): + * gst/rtp/gstrtph264depay.h: + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_class_init), + (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_process): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): + Flush adapter on disconts. + +2007-03-29 14:03:21 +0000 Wim Taymans + + gst/rtp/: Use more efficient adapter and rtpbuffer methods when possible. + Original commit message from CVS: + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_process): + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_process): + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_process): + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_flush): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), + (gst_rtp_mp4v_depay_process): + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush): + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_process): + * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_flush): + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_process): + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_process): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_process): + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_process): + Use more efficient adapter and rtpbuffer methods when possible. + +2007-03-29 12:14:22 +0000 Sebastian Dröge + + gst/wavenc/gstwavenc.c: Correctly handle width!=depth input. + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), + (gst_wavenc_sink_setcaps): + Correctly handle width!=depth input. + * gst/wavparse/gstwavparse.c: + Already export in the caps that width==8 uses unsigned samples and + everything else uses signed samples. + +2007-03-29 09:59:23 +0000 Laurent Glayal + + gst/udp/: Rework the socket allocation a bit based on the sockfd argument so that it becomes usable. + Original commit message from CVS: + Patch by: Laurent Glayal + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_class_init), + (gst_dynudpsink_init), (gst_dynudpsink_set_property), + (gst_dynudpsink_get_property), (gst_dynudpsink_init_send), + (gst_dynudpsink_close): + * gst/udp/gstdynudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Rework the socket allocation a bit based on the sockfd argument so that + it becomes usable. + Add a closefd property to instruct the udp elements to close the custom + file descriptors when going to READY. Fixes #423304. + API:GstUDPSrc::closefd property + API:GstDynUDPSink::closefd property + +2007-03-29 08:08:49 +0000 Laurent Glayal + + gst/rtp/: Added H264 payloader. Fixes #423782. + Original commit message from CVS: + Patch by: Laurent Glayal + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_base_init), + (gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init), + (gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_setcaps), + (gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property), + (gst_rtp_h264_pay_get_property), (gst_rtp_h264_pay_change_state), + (gst_rtp_h264_pay_plugin_init): + * gst/rtp/gstrtph264pay.h: + Added H264 payloader. Fixes #423782. + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): + Small fixes. + +2007-03-28 22:27:36 +0000 Sebastian Dröge + + gst/wavparse/gstwavparse.c: Actually support depths from 1 to 32, not only 8 to 32. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Actually support depths from 1 to 32, not only 8 to 32. + +2007-03-28 22:23:43 +0000 Sebastian Dröge + + gst/wavparse/gstwavparse.c: Add support for wav files containing audio/x-raw-int with random depths between 1 and 32 ... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Add support for wav files containing audio/x-raw-int with random + depths between 1 and 32 bits. + +2007-03-28 18:40:12 +0000 Stefan Kost + + gst/rtp/: Added MP4A-LATM depayloader. Fixes #417792. + Original commit message from CVS: + Based on patch by: Stefan Kost + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_base_init), + (gst_rtp_mp4a_depay_class_init), (gst_rtp_mp4a_depay_init), + (gst_rtp_mp4a_depay_finalize), (gst_rtp_mp4a_depay_setcaps), + (gst_rtp_mp4a_depay_process), (gst_rtp_mp4a_depay_set_property), + (gst_rtp_mp4a_depay_get_property), + (gst_rtp_mp4a_depay_change_state), + (gst_rtp_mp4a_depay_plugin_init): + * gst/rtp/gstrtpmp4adepay.h: + Added MP4A-LATM depayloader. Fixes #417792. + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), + (gst_rtp_mp4v_depay_process): + Fixup depayloader, setting codec_data, using more efficient adaptor and + rtpbuffer handling. + * gst/rtsp/URLS: + Add url to test above. + +2007-03-28 15:17:27 +0000 Edward Hervey + + gst/qtdemux/: Process 'ctts' atoms, which are present in AVC ISO files (.mov files with h264 video). + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample), + (gst_qtdemux_chain), (qtdemux_parse_samples): + * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_ctts): + * gst/qtdemux/qtdemux_dump.h: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + Process 'ctts' atoms, which are present in AVC ISO files (.mov files + with h264 video). + Use the offset present in 'ctts' to calculate the PTS for each packet + and set the PTS on outgoing buffers. + Fixes #423283 + +2007-03-25 15:34:42 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Handle default clock-rates for static payload types, rearrange stuff so that the rtpmap field ... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (find_stream_by_setup), + (gst_rtspsrc_create_stream), (gst_rtspsrc_stream_free), + (get_default_rate_for_pt), (gst_rtspsrc_parse_rtpmap), + (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_stream_configure_caps), + (gst_rtspsrc_activate_streams), (gst_rtspsrc_parse_rtpinfo): + * gst/rtsp/gstrtspsrc.h: + Handle default clock-rates for static payload types, rearrange stuff so + that the rtpmap field in the sdp can override the defaults. + Parse RTP-Info field to get the seqnum and timebase fields that should + go in the caps. + Delay configuring caps after we got the RTP-Info from the PLAY reply from + the server. + +2007-03-24 19:46:59 +0000 Tim-Philipp Müller + + gst/interleave/deinterleave.c: Remove 'channel-positions' field when munging input caps into 1-channel output caps (I... + Original commit message from CVS: + * gst/interleave/deinterleave.c: (gst_deinterleave_sink_setcaps): + Remove 'channel-positions' field when munging input caps into + 1-channel output caps (I guess technically we should set the + position for each channel on the output caps if it's non-NONE, + but I'll save that as a task for another day). + +2007-03-22 22:14:29 +0000 Tim-Philipp Müller + + gst/interleave/deinterleave.c: Don't leak input buffer in chain function; maintain our own list of source pads - ther... + Original commit message from CVS: + * gst/interleave/deinterleave.c: (gst_deinterleave_add_new_pads), + (gst_deinterleave_remove_pads), (gst_deinterleave_process), + (gst_deinterleave_chain): + Don't leak input buffer in chain function; maintain our own list of + source pads - there are no guarantees about the order of the list + in the GstElement struct, and we want a very specific order; lastly, + some more debugging. + +2007-03-22 16:25:56 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Revert last commit, preventing infinite plugging loops with ranks is no clean solution... + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): + Revert last commit, preventing infinite plugging loops with ranks + is no clean solution and in general there's no reason why one wants + to parse framed wavpack data again. + +2007-03-22 15:52:51 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.c: Send the new segment event in time format instead of bytes. This allows "wavpackenc ! wa... + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_push_block): + Send the new segment event in time format instead of bytes. This + allows "wavpackenc ! wavpackdec ! someaudiosink" pipelines. + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): + Accept framed and non-framed input, wavpackparse doesn't care. To + prevent "wavpackparse ! wavpackparse ! ..." pipelines lower the + rank of wavpackparse by one. This allows "wavpackenc ! wavpackparse ! + ..." pipelines. + +2007-03-22 11:08:03 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackdec.c: Revert to use gst_pad_alloc_buffer() here. We can and should use it. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): + Revert to use gst_pad_alloc_buffer() here. We can and should use it. + Thanks to Jan and Mike for noticing my mistake. + +2007-03-22 09:44:17 +0000 Christophe Dehais + + ext/gconf/gconf.c: Accept complex pipeline descriptions as an audio profile instead of just a single element. Fixes #... + Original commit message from CVS: + Patch by: Christophe Dehais + * ext/gconf/gconf.c: (gst_gconf_render_bin_with_default): + Accept complex pipeline descriptions as an audio profile instead of just + a single element. Fixes #420658. + +2007-03-22 00:17:41 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.*: Put the write helpers into the GstWavpackEnc struct directly and not as a pointer to sav... + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), + (gst_wavpack_enc_init), (gst_wavpack_enc_chain), + (gst_wavpack_enc_rewrite_first_block): + * ext/wavpack/gstwavpackenc.h: + Put the write helpers into the GstWavpackEnc struct directly and not + as a pointer to save two small, but useless mallocs. This also makes + it possible to drop the finalize method. + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_push_buffer): + For consistency reasons also set GST_BUFFER_OFFSET_END on the outgoing + buffers the same way wavpackenc does it. + +2007-03-21 23:50:09 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackdec.c: Don't use gst_pad_alloc_buffer() as we might clip the buffer later and + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): + Don't use gst_pad_alloc_buffer() as we might clip the buffer later and + BaseTransform-based elements will likely break because of wrong + unit-size. Also plug a possible memleak that happens when decoding + fails for some reason. + +2007-03-21 11:49:32 +0000 Tim-Philipp Müller + + gst/apetag/gsttagdemux.c: Rename registered type in preparation of GstTagDemux moving to + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_get_type): + Rename registered type in preparation of GstTagDemux moving to + -base at some point in the future. + +2007-03-19 10:29:19 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: Streaming mode fixes: don't unref buffer we don't own any longer; remove bogus adapter fl... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + Streaming mode fixes: don't unref buffer we don't own any longer; + remove bogus adapter flush. Fixes #419338. + +2007-03-18 04:21:28 +0000 David Schleef + + REQUIREMENTS: Change the format to key/value, add a bunch of information, remove a bunch of requirements that are for... + Original commit message from CVS: + * REQUIREMENTS: Change the format to key/value, add a bunch of + information, remove a bunch of requirements that are for + other GStreamer packages. + +2007-03-18 02:00:54 +0000 David Schleef + + REQUIREMENTS: Fix a few things. This file really needs a good once-over. + Original commit message from CVS: + * REQUIREMENTS: Fix a few things. This file really needs a + good once-over. + +2007-03-16 18:38:18 +0000 Edward Hervey + + sys/osxvideo/osxvideosink.m: Fix previous commit, we want to pass the NSView in the message. + Original commit message from CVS: + * sys/osxvideo/osxvideosink.m: + Fix previous commit, we want to pass the NSView in the message. + +2007-03-16 16:27:20 +0000 Edward Hervey + + sys/osxvideo/osxvideosink.m: Emit 'have-ns-view' message when working in embedded mode. The message will contain a po... + Original commit message from CVS: + * sys/osxvideo/osxvideosink.m: + Emit 'have-ns-view' message when working in embedded mode. The message + will contain a pointer to the newly created NSView. + +2007-03-16 09:57:40 +0000 Stefan Kost + + gst/equalizer/gstiirequalizer10bands.c: A 10 band EQ should be initialized to 1 bands and not to 3. + Original commit message from CVS: + * gst/equalizer/gstiirequalizer10bands.c: + (gst_iir_equalizer_10bands_init): + A 10 band EQ should be initialized to 1 bands and not to 3. + +2007-03-15 12:05:01 +0000 Edward Hervey + + sys/Makefile.am: Don't forget to distribute the sys/osxaudio/ directory. + Original commit message from CVS: + * sys/Makefile.am: + Don't forget to distribute the sys/osxaudio/ directory. + +2007-03-15 11:39:53 +0000 Edward Hervey + + Activate osxaudio in gst-plugins-good with proper build setup. + Original commit message from CVS: + * configure.ac: + * sys/Makefile.am: + * sys/osxaudio/Makefile.am: + * sys/osxaudio/gstosxaudio.c: + * sys/osxaudio/gstosxaudiosink.c: + (gst_osx_audio_sink_osxelement_do_init), (gst_osx_audio_sink_init), + (gst_osx_audio_sink_getcaps), + (gst_osx_audio_sink_create_ringbuffer), (plugin_init): + * sys/osxaudio/gstosxaudiosrc.c: + (gst_osx_audio_src_osxelement_do_init), (gst_osx_audio_src_init), + (gst_osx_audio_src_create_ringbuffer): + * sys/osxaudio/gstosxringbuffer.c: (gst_osx_ring_buffer_get_type), + (gst_osx_ring_buffer_class_init), (gst_osx_ring_buffer_init), + (gst_osx_ring_buffer_acquire), (gst_osx_ring_buffer_start), + (gst_osx_ring_buffer_pause), (gst_osx_ring_buffer_stop): + * sys/osxaudio/gstosxringbuffer.h: + Activate osxaudio in gst-plugins-good with proper build setup. + Add inlined documentation. + Fix debug statements + Fix ringbuffer when pausing. + Fixes #323471 + +2007-03-14 22:21:26 +0000 Philippe Kalaf + + gst/rtp/: Ported mulaw and alaw payloaders to use new base class + Original commit message from CVS: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmapay.h: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtppcmupay.h: + Ported mulaw and alaw payloaders to use new base class + +2007-03-14 16:30:19 +0000 Edward Hervey + + sys/osxvideo/: Fix leaks when running a NSApp. + Original commit message from CVS: + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + Fix leaks when running a NSApp. + Accept any kind of resolutions. + Works in fullscreen. Can maximize. + Only thing left before being able to move this to -good is documentation + and embedded window support. + +2007-03-14 15:25:10 +0000 Thomas Vander Stichele + + po/: Update translations. + Original commit message from CVS: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/it.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update translations. + +2007-03-14 14:49:45 +0000 Tim-Philipp Müller + + configure.ac: Fix string replace error (AG_AG_GST_* => AG_GST_*). + Original commit message from CVS: + * configure.ac: + Fix string replace error (AG_AG_GST_* => AG_GST_*). + +2007-03-14 14:48:08 +0000 Stefan Kost + + gst/equalizer/: Add 3 and 10 band version and add missing gst_object_sync_values. + Original commit message from CVS: + * gst/equalizer/Makefile.am: + * gst/equalizer/gstiirequalizer.c: (_do_init), + (gst_iir_equalizer_band_set_property), + (gst_iir_equalizer_band_class_init), + (gst_iir_equalizer_band_get_type), + (gst_iir_equalizer_child_proxy_get_child_by_index), + (gst_iir_equalizer_child_proxy_get_children_count), + (gst_iir_equalizer_child_proxy_interface_init), (setup_filter), + (gst_iir_equalizer_compute_frequencies), + (gst_iir_equalizer_transform_ip), (plugin_init): + * gst/equalizer/gstiirequalizer10bands.c: + (gst_iir_equalizer_10bands_base_init), + (gst_iir_equalizer_10bands_class_init), + (gst_iir_equalizer_10bands_init), + (gst_iir_equalizer_10bands_set_property), + (gst_iir_equalizer_10bands_get_property): + * gst/equalizer/gstiirequalizer10bands.h: + * gst/equalizer/gstiirequalizer3bands.c: + (gst_iir_equalizer_3bands_base_init), + (gst_iir_equalizer_3bands_class_init), + (gst_iir_equalizer_3bands_init), + (gst_iir_equalizer_3bands_set_property), + (gst_iir_equalizer_3bands_get_property): + * gst/equalizer/gstiirequalizer3bands.h: + * gst/equalizer/gstiirequalizernbands.c: + (gst_iir_equalizer_nbands_base_init), + (gst_iir_equalizer_nbands_init): + Add 3 and 10 band version and add missing gst_object_sync_values. + * gst/spectrum/gstspectrum.c: (gst_spectrum_event), + (gst_spectrum_transform_ip): + Add some comments about float support. + +2007-03-12 17:56:54 +0000 Tim-Philipp Müller + + gst/apetag/gsttagdemux.c: Fix handling of -1 values for start and stop values when seeking, and SEEK_CUR+SEEK_END her... + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_srcpad_event): + Fix handling of -1 values for start and stop values when seeking, + and SEEK_CUR+SEEK_END here as well. + +2007-03-12 17:24:23 +0000 Jan Schmidt + + gst/id3demux/gstid3demux.c: Fix handling of -1 values for start and stop values when seeking, and SEEK_CUR+SEEK_END. + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_srcpad_event): + Fix handling of -1 values for start and stop values when seeking, + and SEEK_CUR+SEEK_END. + +2007-03-12 15:49:02 +0000 Jan Schmidt + + * ChangeLog: + I'm too lazy to comment this + Original commit message from CVS: + Add Patch by: line for wim, since he's away + +2007-03-12 13:28:29 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: Fix parsing of ID3 v2.2.0 PIC frames. Only in version >= 2.3.0 is the image format a vari... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (parse_picture_frame): + Fix parsing of ID3 v2.2.0 PIC frames. Only in version >= 2.3.0 is + the image format a variable-length NUL-terminated string; in + versions before that the image format is a fixed-length string of + 3 characters (see #348644 for a sample tag). + Also make supplied mime type lower-case and fix up 'jpg' to 'jpeg'. + +2007-03-11 22:23:04 +0000 Sébastien Moutte + + 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-03-10 16:07:31 +0000 Sébastien Moutte + + win32/MANIFEST: Add new project files to MANIFEST. + Original commit message from CVS: + * win32/MANIFEST: + Add new project files to MANIFEST. + * win32/vs6/libgstaudiofx.dsp: + * win32/vs6/libgstrtp.dsp: + * win32/vs6/libgstrtsp.dsp: + Update project files. + +2007-03-10 12:30:48 +0000 Tim-Philipp Müller + + Printf format fixes; also add some missing quotes in translated strings. Fixes #416728 and #416727. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex), + (gst_avi_demux_parse_index): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_grab_frame): + Printf format fixes; also add some missing quotes in translated + strings. Fixes #416728 and #416727. + +2007-03-09 20:12:08 +0000 Jan Schmidt + + gst/autodetect/gstautoaudiosink.c: Tim and I can't think of any reason the child audio sink needs to be set back to N... + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_find_best): + Tim and I can't think of any reason the child audio sink needs to + be set back to NULL after successfully determining that it can + reach READY - it gets immediately set back to READY by the caller + anyway, causing an unnecessary close/open of any audio devices + involved. + +2007-03-09 19:51:27 +0000 Tim-Philipp Müller + + po/: Add ja.po file from #377306. + Original commit message from CVS: + * po/LINGUAS: + * po/ja.po: + Add ja.po file from #377306. + +2007-03-09 19:44:30 +0000 Tim-Philipp Müller + + sys/sunaudio/: Actually translate sunaudio mixer track labels instead of just marking the strings as translatable (#3... + Original commit message from CVS: + * sys/sunaudio/gstsunaudio.c: (plugin_init): + * sys/sunaudio/gstsunaudiomixertrack.c: + (gst_sunaudiomixer_track_new): + Actually translate sunaudio mixer track labels instead of just + marking the strings as translatable (#377306); clean up weird + label string mapping code that serves no apparent purpose. Also + set the 'untranslated-label' property when creating mixer tracks + if the GstMixerTrack base class supports this. + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/sunaudio.c: (GST_START_TEST), + (sunaudio_suite): + Very minimalistic unit test for sunaudiomixer element (compiles, but not + actually tested on a system where sunaudiomixer is available). + +2007-03-09 18:49:37 +0000 Jan Schmidt + + tests/check/Makefile.am: Re-enable the states test and see if it works on the buildbots. + Original commit message from CVS: + * tests/check/Makefile.am: + Re-enable the states test and see if it works on the buildbots. + +2007-03-09 17:32:32 +0000 Wim Taymans + + ext/dv/gstdvdec.*: Infer pixel-aspect-ratio from the video frame format if it isn't provided by the container, as hap... + Original commit message from CVS: + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_sink_setcaps), + (gst_dvdec_src_negotiate), (gst_dvdec_chain), + (gst_dvdec_change_state): + * ext/dv/gstdvdec.h: + Infer pixel-aspect-ratio from the video frame format if it isn't + provided by the container, as happens when playing DV from AVI + or Quicktime containers. + Patch by: Wim Taymans + Fixes #380944 + +2007-03-09 17:05:17 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: When activated, remove the udpsrc timeout, we have dataflow and timeouts will later be handled... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_activate_streams): + When activated, remove the udpsrc timeout, we have dataflow and timeouts + will later be handled by the jitterbuffer. + +2007-03-09 16:53:39 +0000 Wim Taymans + + ext/taglib/gstid3v2mux.cc: Add write support for GST_TAG_MUSICBRAINZ_SORTNAME (TSOP) tag. + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: + Add write support for GST_TAG_MUSICBRAINZ_SORTNAME (TSOP) tag. + Fixes #414496. + +2007-03-09 15:04:45 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Fix stream position reporting after a seek. Fixes #416445. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_push_event), (gst_avi_demux_do_seek), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_chain): + Fix stream position reporting after a seek. Fixes #416445. + +2007-03-09 08:58:26 +0000 Stefan Kost + + gst/equalizer/: Refactor plugin into a base class and a first subclass (nband eq). The nband eq uses GstChildProxy an... + Original commit message from CVS: + * gst/equalizer/Makefile.am: + * gst/equalizer/gstiirequalizer.c: (_do_init), + (gst_iir_equalizer_band_set_property), + (gst_iir_equalizer_band_get_property), + (gst_iir_equalizer_band_class_init), + (gst_iir_equalizer_band_get_type), + (gst_iir_equalizer_child_proxy_get_child_by_index), + (gst_iir_equalizer_child_proxy_get_children_count), + (gst_iir_equalizer_child_proxy_interface_init), + (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), + (gst_iir_equalizer_finalize), (setup_filter), + (gst_iir_equalizer_compute_frequencies), + (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), + (gst_iir_equalizer_setup), (plugin_init): + * gst/equalizer/gstiirequalizer.h: + * gst/equalizer/gstiirequalizernbands.c: + (gst_iir_equalizer_nbands_base_init), + (gst_iir_equalizer_nbands_class_init), + (gst_iir_equalizer_nbands_init), + (gst_iir_equalizer_nbands_set_property), + (gst_iir_equalizer_nbands_get_property): + * gst/equalizer/gstiirequalizernbands.h: + Refactor plugin into a base class and a first subclass (nband eq). The + nband eq uses GstChildProxy and is controlable. More subclasses will + follow. + +2007-03-08 16:01:42 +0000 René Stadler + + gst/avi/gstavidemux.c: Make avidemux accept optional header chunks in any order. + Original commit message from CVS: + Patch by: René Stadler + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_push_event), (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data), (gst_avi_demux_chain): + Make avidemux accept optional header chunks in any order. + Fixes #415446. + +2007-03-08 12:23:57 +0000 Jan Schmidt + + tests/check/Makefile.am: Disable the states check until the remaining Valgrind errors are fixed or suppressed. + Original commit message from CVS: + * tests/check/Makefile.am: + Disable the states check until the remaining Valgrind errors + are fixed or suppressed. + +2007-03-08 10:24:43 +0000 Sebastian Dröge + + tests/check/elements/.cvsignore: Add audiodynamic check to .cvsignore + Original commit message from CVS: + * tests/check/elements/.cvsignore: + Add audiodynamic check to .cvsignore + +2007-03-08 10:02:12 +0000 Sebastian Dröge + + gst/audiofx/: Add new audiodynamic element which can act as a compressor or expander. Supported are hard-knee and sof... + Original commit message from CVS: + reviewed by: Stefan Kost + * gst/audiofx/Makefile.am: + * gst/audiofx/audiodynamic.c: + (gst_audio_dynamic_characteristics_get_type), + (gst_audio_dynamic_mode_get_type), + (gst_audio_dynamic_set_process_function), + (gst_audio_dynamic_base_init), (gst_audio_dynamic_class_init), + (gst_audio_dynamic_init), (gst_audio_dynamic_set_property), + (gst_audio_dynamic_get_property), (gst_audio_dynamic_setup), + (gst_audio_dynamic_transform_hard_knee_compressor_int), + (gst_audio_dynamic_transform_hard_knee_compressor_float), + (gst_audio_dynamic_transform_soft_knee_compressor_int), + (gst_audio_dynamic_transform_soft_knee_compressor_float), + (gst_audio_dynamic_transform_hard_knee_expander_int), + (gst_audio_dynamic_transform_hard_knee_expander_float), + (gst_audio_dynamic_transform_soft_knee_expander_int), + (gst_audio_dynamic_transform_soft_knee_expander_float), + (gst_audio_dynamic_transform_ip): + * gst/audiofx/audiodynamic.h: + * gst/audiofx/audiofx.c: (plugin_init): + Add new audiodynamic element which can act as a compressor or + expander. Supported are hard-knee and soft-knee operation modes with + user-specified ratio and threshold. + Attack and release parameters are not yet implemented but will follow. + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-audiofx.xml: + Integrate audiodynamic into the docs. + * tests/check/Makefile.am: + * tests/check/elements/audiodynamic.c: (setup_dynamic), + (cleanup_dynamic), (GST_START_TEST), (dynamic_suite), (main): + Add unit test for audiodynamic. + +2007-03-07 19:48:03 +0000 Jan Schmidt + + ext/raw1394/gstdv1394src.c: Free handles that we allocated when exiting via the error paths. + Original commit message from CVS: + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_start): + Free handles that we allocated when exiting via the error paths. + +2007-03-07 12:07:07 +0000 Sebastian Dröge + + ext/wavpack/: Use a general wavpack debug category for common code. + Original commit message from CVS: + * ext/wavpack/gstwavpack.c: (plugin_init): + * ext/wavpack/gstwavpackcommon.c: + Use a general wavpack debug category for common code. + * ext/wavpack/gstwavpackstreamreader.c: + (gst_wavpack_stream_reader_set_pos_abs), + (gst_wavpack_stream_reader_set_pos_rel), + (gst_wavpack_stream_reader_write_bytes): + Use the general wavpack debug category here too and add debug + output to the functions that should not be called at all by + the wavpack library. + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_plugin_init): + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_plugin_init): + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): + Change debugging category names to conform to the conventions. + +2007-03-07 11:37:23 +0000 Edward Hervey + + gst/qtdemux/qtdemux.*: Share qtdemux debug category across all files, otherwise all debugging in files other than qtd... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + Share qtdemux debug category across all files, otherwise all debugging + in files other than qtdemux.c would end up in the default category. + +2007-03-07 11:24:05 +0000 Stefan Kost + + gst/level/gstlevel.*: Resolve message timestamps against the playback segment. + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_class_init), + (gst_level_set_caps), (gst_level_start), (gst_level_event), + (gst_level_transform_ip): + * gst/level/gstlevel.h: + Resolve message timestamps against the playback segment. + +2007-03-07 11:23:20 +0000 Stefan Kost + + gst/spectrum/gstspectrum.*: One FIXME less, by resolving message timestamps against the playback segment. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_start), + (gst_spectrum_event), (gst_spectrum_transform_ip): + * gst/spectrum/gstspectrum.h: + One FIXME less, by resolving message timestamps against the playback + segment. + +2007-03-06 23:21:41 +0000 Tim-Philipp Müller + + * ChangeLog: + Fix ChangeLog message + Original commit message from CVS: + Fix ChangeLog message + +2007-03-06 23:19:30 +0000 Tim-Philipp Müller + + gst/id3demux/gstid3demux.c: Don't leak caps: make gst_id3demux_add_srcpad() not take ownership of the caps passed to ... + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad), + (gst_id3demux_sink_activate): + Don't leak caps: make gst_id3demux_add_srcpad() not take ownership of the + caps passed to it (previouslly one code path assumes it takes ownership + while another one assumes it doesn't). + * configure.ac: + * tests/files/Makefile.am: + * tests/files/id3-407349-1.tag: + * tests/files/id3-407349-2.tag: + Add directory where data for unit tests can be stored. + * tests/Makefile.am: + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/id3demux.c: (pad_added_cb), (error_cb), + (read_tags_from_file), (run_check_for_file), + (check_date_1977_06_23), (GST_START_TEST), (id3demux_suite): + Add unit test for id3demux, and in particular for bug #407349. Only + testing pull-mode for now; push mode doesn't work yet because the test + files are smaller than ID3_TYPE_FIND_MIN_SIZE. + +2007-03-06 22:14:59 +0000 Tim-Philipp Müller + + tests/check/Makefile.am: Add missing backslash at end of line. + Original commit message from CVS: + * tests/check/Makefile.am: + Add missing backslash at end of line. + +2007-03-06 18:36:09 +0000 Jan Schmidt + + * ChangeLog: + * common: + Trigger rebuild. + Original commit message from CVS: + Trigger rebuild. + +2007-03-06 18:16:49 +0000 Tim-Philipp Müller + + gst/id3demux/: Do not convert obsolete TDA/TDAT frames to TDRC frames, otherwise the four-digit number will be interp... + Original commit message from CVS: + * gst/id3demux/id3tags.c: (id3demux_id3v2_frames_to_tag_list): + * gst/id3demux/id3tags.h: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), + (parse_obsolete_tdat_frame): + Do not convert obsolete TDA/TDAT frames to TDRC frames, otherwise + the four-digit number will be interpreted as a year, whereas it is + month and day in DDMM format. Instead, parse TDAT frames and fix up + the date in the GST_TAG_DATE tag later if we also extracted a year. + Fixes #407349. + +2007-03-06 14:53:04 +0000 Jan Schmidt + + ext/gconf/gstswitchsink.c: Fix up the dispose logic so it doesn't leak, and fix setting of the child state so that we... + Original commit message from CVS: + * ext/gconf/gstswitchsink.c: (gst_switch_sink_dispose), + (gst_switch_commit_new_kid): + Fix up the dispose logic so it doesn't leak, and fix setting of + the child state so that we don't set a child to our current state + just as we are changing it to something else. + +2007-03-06 13:57:55 +0000 Wim Taymans + + gst/spectrum/gstspectrum.c: Fix and cleanup default property values. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), + (gst_spectrum_init), (gst_spectrum_set_property), + (gst_spectrum_transform_ip): + Fix and cleanup default property values. + Add FIXMEs for stuff that looks rather wrong. + +2007-03-06 13:21:23 +0000 Wim Taymans + + gst/goom/gstgoom.*: Document, fix and improve goom adapter behaviour. + Original commit message from CVS: + * gst/goom/gstgoom.c: (gst_goom_src_setcaps), (get_buffer), + (gst_goom_chain): + * gst/goom/gstgoom.h: + Document, fix and improve goom adapter behaviour. + Fixes #407006. + +2007-03-05 18:43:29 +0000 Jan Schmidt + + ext/esd/esdsink.c: Unref static pad template after using it. + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_open): + Unref static pad template after using it. + +2007-03-05 17:17:04 +0000 Jan Schmidt + + ext/gconf/gstswitchsink.c: Fix up the reference counting of the child elements. + Original commit message from CVS: + * ext/gconf/gstswitchsink.c: (gst_switch_sink_dispose), + (gst_switch_commit_new_kid): + Fix up the reference counting of the child elements. + +2007-03-05 17:08:32 +0000 Wim Taymans + + gst/rtp/: Fix encoding-name case. + Original commit message from CVS: + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_setcaps): + * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_finish_headers): + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): + Fix encoding-name case. + +2007-03-05 16:39:29 +0000 Wim Taymans + + gst/rtp/: Fix speex (de)payloader. Fixes #358040. + Original commit message from CVS: + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_class_init), + (gst_rtp_speex_depay_get_mode), (gst_rtp_speex_depay_setcaps), + (gst_rtp_speex_depay_process): + * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_base_init), + (gst_rtp_speex_pay_class_init), (gst_rtp_speex_pay_setcaps), + (gst_rtp_speex_pay_parse_ident), (gst_rtp_speex_pay_handle_buffer), + (gst_rtp_speex_pay_change_state): + * gst/rtp/gstrtpspeexpay.h: + Fix speex (de)payloader. Fixes #358040. + +2007-03-05 15:42:58 +0000 Jan Schmidt + + ext/gconf/gstswitchsink.c: Install fakesink in NULL by fixing some broken logic. This obviates the need to manually s... + Original commit message from CVS: + * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset), + (gst_switch_commit_new_kid), (gst_switch_sink_set_child): + Install fakesink in NULL by fixing some broken logic. This obviates + the need to manually set _IS_SINK. + Add some comments and remove a little cruft while I'm at it. + +2007-03-05 14:46:43 +0000 Wim Taymans + + ext/gconf/gstswitchsink.c: Mark us as a sink when we have no fakesink in NULL. Fixes #414887. + Original commit message from CVS: + * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset): + Mark us as a sink when we have no fakesink in NULL. Fixes #414887. + +2007-03-05 08:30:52 +0000 Stefan Kost + + gst/spectrum/: Remove two obsolete and confusing comments. + Original commit message from CVS: + * gst/spectrum/demo-audiotest.c: (message_handler): + * gst/spectrum/demo-osssrc.c: (message_handler): + Remove two obsolete and confusing comments. + +2007-03-04 18:52:12 +0000 Tim-Philipp Müller + + po/POTFILES.in: Update. + Original commit message from CVS: + * po/POTFILES.in: + Update. + +2007-03-04 17:33:34 +0000 Jan Schmidt + + tests/check/Makefile.am: Gah! Also disable gconfvideosink from the tests, otherwise it will instantiate autovideosink... + Original commit message from CVS: + * tests/check/Makefile.am: + Gah! Also disable gconfvideosink from the tests, otherwise + it will instantiate autovideosink, and dfbvideosink and + leak on the buildbots. + +2007-03-04 17:13:19 +0000 Jan Schmidt + + ext/cdio/gstcdiocddasrc.c: Make sure we always destroy our libcdio handle. + Original commit message from CVS: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open), + (gst_cdio_cdda_src_finalize): + Make sure we always destroy our libcdio handle. + +2007-03-04 17:05:58 +0000 Jan Schmidt + + tests/check/Makefile.am: Disable autovideosink so the buildbots don't barf over memory leaked in the directfb sink. + Original commit message from CVS: + * tests/check/Makefile.am: + Disable autovideosink so the buildbots don't barf over memory + leaked in the directfb sink. + +2007-03-04 15:28:30 +0000 Jan Schmidt + + sys/ximage/gstximagesrc.c: Chain up in dispose + Original commit message from CVS: + * sys/ximage/gstximagesrc.c: (gst_ximage_src_dispose): + Chain up in dispose + +2007-03-04 15:07:15 +0000 Jan Schmidt + + gst/multipart/multipartdemux.c: Use gst_pad_new_from_static_template instead of static_pad_template_get+pad_new. + Original commit message from CVS: + * gst/multipart/multipartdemux.c: (gst_multipart_demux_init), + (gst_multipart_find_pad_by_mime): + Use gst_pad_new_from_static_template instead of + static_pad_template_get+pad_new. + +2007-03-04 14:56:53 +0000 Jan Schmidt + + sys/ximage/gstximagesrc.c: Catch the case where no clock has been set. + Original commit message from CVS: + * sys/ximage/gstximagesrc.c: (gst_ximage_src_create): + Catch the case where no clock has been set. + +2007-03-04 13:52:03 +0000 Jan Schmidt + + Fix a bunch of leaks shown by the newly-added states test. + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flac_enc_finalize): + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_class_init), + (gst_gconf_audio_sink_dispose), (gst_gconf_audio_sink_finalize): + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init), + (gst_gconf_audio_src_class_init), (gst_gconf_audio_src_dispose), + (gst_gconf_audio_src_finalize), (do_toggle_element): + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init), + (gst_gconf_video_sink_class_init), (gst_gconf_video_sink_finalize), + (do_toggle_element): + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init), + (gst_gconf_video_src_class_init), (gst_gconf_video_src_dispose), + (gst_gconf_video_src_finalize), (do_toggle_element): + * ext/gconf/gstswitchsink.c: (gst_switch_sink_class_init), + (gst_switch_sink_reset), (gst_switch_sink_set_child): + * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init): + * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init): + * ext/shout2/gstshout2.c: (gst_shout2send_class_init), + (gst_shout2send_init), (gst_shout2send_finalize): + * gst/debug/testplugin.c: (gst_test_class_init), + (gst_test_finalize): + * gst/flx/gstflxdec.c: (gst_flxdec_class_init), + (gst_flxdec_dispose): + * gst/multipart/multipartmux.c: (gst_multipart_mux_finalize): + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_finalize): + * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_free_context): + * gst/rtsp/rtspextwms.h: + * gst/smpte/gstsmpte.c: (gst_smpte_class_init), + (gst_smpte_finalize): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_finalize): + * gst/udp/gstudpsink.c: (gst_udpsink_class_init), + (gst_udpsink_finalize): + * gst/wavparse/gstwavparse.c: (gst_wavparse_dispose), + (gst_wavparse_sink_activate): + * sys/oss/gstosssink.c: (gst_oss_sink_finalise): + * sys/oss/gstosssrc.c: (gst_oss_src_class_init), + (gst_oss_src_finalize): + * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_destroy): + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), + (gst_v4l2src_finalize): + * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get): + Fix a bunch of leaks shown by the newly-added states test. + +2007-03-04 13:41:00 +0000 Jan Schmidt + + ext/dv/gstdvdec.c: Use gst_pad_new_from_static_template instead of static_pad_template_get+pad_new. + Original commit message from CVS: + * ext/dv/gstdvdec.c: (gst_dvdec_init): + Use gst_pad_new_from_static_template instead of + static_pad_template_get+pad_new. + +2007-03-03 13:06:21 +0000 Loïc Minier + + Don't mix tabs and spaces (#414168). + Original commit message from CVS: + Patch by: Loïc Minier + * ext/libcaca/Makefile.am: + * gst/debug/Makefile.am: + Don't mix tabs and spaces (#414168). + +2007-03-02 21:35:11 +0000 Stefan Kost + + tests/check/generic/.cvsignore: Ignore files to please buildbot. + Original commit message from CVS: + * tests/check/generic/.cvsignore: + Ignore files to please buildbot. + +2007-03-02 21:01:19 +0000 Stefan Kost + + gst/wavparse/gstwavparse.c: Unbreak my previous commit (swapped nominator & denominator). Tim, thanks for spotting. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers), + (gst_wavparse_stream_data): + Unbreak my previous commit (swapped nominator & denominator). Tim, + thanks for spotting. + +2007-03-02 16:08:17 +0000 Wim Taymans + + ext/cdio/gstcdiocddasrc.c: Small code cleanups. + Original commit message from CVS: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_probe_devices), + (gst_cdio_cdda_src_read_sector), (gst_cdio_cdda_src_open), + (gst_cdio_cdda_src_finalize): + Small code cleanups. + Don't use pad_alloc as the base class cannot deal with the error codes. + +2007-03-02 13:40:06 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Fix doc. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_create): + Fix doc. + +2007-03-02 13:29:25 +0000 René Stadler + + gst/wavparse/gstwavparse.c: Handle rounding better to not drop last sample frame. Fixes #356692 + Original commit message from CVS: + Patch by: René Stadler + * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), + (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), + (gst_wavparse_stream_data): + Handle rounding better to not drop last sample frame. Fixes #356692 + +2007-03-02 13:19:57 +0000 Jan Schmidt + + tests/check/Makefile.am: Disable cacasink from the states check too - it also calls exit(1) on us when it can't find ... + Original commit message from CVS: + * tests/check/Makefile.am: + Disable cacasink from the states check too - it also calls exit(1) + on us when it can't find a terminal to talk to. + +2007-03-02 12:56:13 +0000 Thijs Vermeir + + gst/udp/gstudpsrc.*: Add support to strip proprietary headers. Fixes #350296. + Original commit message from CVS: + Patch by: Thijs Vermeir + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property): + * gst/udp/gstudpsrc.h: + Add support to strip proprietary headers. Fixes #350296. + +2007-03-02 12:52:56 +0000 Wim Taymans + + gst/rtp/gstrtpmp2tdepay.c: Fix compilation. + Original commit message from CVS: + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): + Fix compilation. + +2007-03-02 12:16:16 +0000 Thijs Vermeir + + gst/rtp/gstrtpmp2tdepay.*: Add support to strip off proprietary headers. Fixes #350278. + Original commit message from CVS: + Patch by: Thijs Vermeir + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_class_init), + (gst_rtp_mp2t_depay_init), (gst_rtp_mp2t_depay_process), + (gst_rtp_mp2t_depay_set_property), + (gst_rtp_mp2t_depay_get_property): + * gst/rtp/gstrtpmp2tdepay.h: + Add support to strip off proprietary headers. Fixes #350278. + +2007-03-02 11:22:35 +0000 Wim Taymans + + ext/hal/hal.c: Fix compilation. + Original commit message from CVS: + * ext/hal/hal.c: + Fix compilation. + +2007-03-02 10:54:49 +0000 Wim Taymans + + sys/sunaudio/gstsunaudiosrc.*: Remove device-name from GstSunAudioSrc. Fixes #412597. + Original commit message from CVS: + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_class_init), + (gst_sunaudiosrc_init), (gst_sunaudiosrc_get_property), + (gst_sunaudiosrc_open): + * sys/sunaudio/gstsunaudiosrc.h: + Remove device-name from GstSunAudioSrc. Fixes #412597. + +2007-03-01 21:50:36 +0000 Sebastian Dröge + + ext/hal/: Having NULL as UDI previously selected the default sink/src. Change this back but mention it in the debug o... + Original commit message from CVS: + * ext/hal/gsthalaudiosink.c: (do_toggle_element): + * ext/hal/gsthalaudiosrc.c: (do_toggle_element): + Having NULL as UDI previously selected the default sink/src. Change + this back but mention it in the debug output. + * ext/hal/hal.c: (gst_hal_get_alsa_element), + (gst_hal_get_oss_element), (gst_hal_get_string), + (gst_hal_render_bin_from_udi), (gst_hal_get_audio_sink), + (gst_hal_get_audio_src): + * ext/hal/hal.h: + Refactor a bit, check all error conditions, greatly improve debugging + and fix some possible memory leaks. Also implement OSS support + and allow specifying an UDI that points to a real device. For this the + child device which supports ALSA (preferred) or OSS is used. + As a side effect this makes it impossible now to get a alsasink in + halaudiosrc and a alsasrc in halaudiosink. + +2007-03-01 18:47:28 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Errors from the udp sources are not fatal unless all of them are in error. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (find_stream_by_channel), + (find_stream_by_udpsrc), (gst_rtspsrc_handle_message): + Errors from the udp sources are not fatal unless all of them are in + error. + +2007-03-01 18:14:42 +0000 Jan Schmidt + + tests/check/Makefile.am: Disable aasink in the states test. I suspect this is the element that is calling exit(1) whe... + Original commit message from CVS: + * tests/check/Makefile.am: + Disable aasink in the states test. I suspect this is the element that + is calling exit(1) when it can't proceed. + +2007-03-01 17:26:30 +0000 Jan Schmidt + + tests/check/Makefile.am: Draw plugins in from the build tree sys/ dir, rather than picking up the already installed v... + Original commit message from CVS: + * tests/check/Makefile.am: + Draw plugins in from the build tree sys/ dir, rather than picking + up the already installed versions. + +2007-03-01 10:44:36 +0000 Zaheer Abbas Merali + + sys/ximage/gstximagesrc.c: Error out correctly when getting xcontext fails. + Original commit message from CVS: + 2007-03-01 Zaheer Abbas Merali + * sys/ximage/gstximagesrc.c: (gst_ximage_src_open_display): + Error out correctly when getting xcontext fails. + +2007-03-01 09:29:34 +0000 Wim Taymans + + gst/rtsp/gstrtpdec.c: Make state change to PAUSED NO_PREROLL because that's what it will be in the future and rtspsrc... + Original commit message from CVS: + * gst/rtsp/gstrtpdec.c: (gst_rtpdec_change_state): + Make state change to PAUSED NO_PREROLL because that's what it will be in + the future and rtspsrc relies on it. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_change_state): + Don't error out when we don't get an error from the state change + function. + +2007-03-01 01:48:59 +0000 Sebastian Dröge + + ext/hal/: Check if the device UDI is set before trying to query HAL about it and give a useful error message if it wa... + Original commit message from CVS: + * ext/hal/gsthalaudiosink.c: (do_toggle_element): + * ext/hal/gsthalaudiosrc.c: (do_toggle_element): + Check if the device UDI is set before trying to query HAL + about it and give a useful error message if it wasn't set. + * ext/hal/hal.c: (gst_hal_get_string): + Don't query HAL for NULL UDIs. Passing NULL as UDI to HAL + gives an assertion failure in D-Bus when running with + DBUS_FATAL_WARNINGS=1. + +2007-02-28 19:29:42 +0000 Thomas Vander Stichele + + * win32/common/config.h: + update config to trunk + Original commit message from CVS: + update config to trunk + +2007-02-28 19:29:25 +0000 Thomas Vander Stichele + + configure.ac: Convert to new AG_GST style. + Original commit message from CVS: + * configure.ac: + Convert to new AG_GST style. + +2007-02-28 12:59:43 +0000 Thomas Vander Stichele + + tests/check/: add test for states + Original commit message from CVS: + * tests/check/Makefile.am: + * tests/check/generic/states.c: (GST_START_TEST), (states_suite): + add test for states + +2007-02-28 10:58:10 +0000 Wim Taymans + + tests/check/elements/.cvsignore: Add new videofilter check to .cvsignore. + Original commit message from CVS: + * tests/check/elements/.cvsignore: + Add new videofilter check to .cvsignore. + +2007-02-28 10:54:55 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Fix combined flow return. Fixes #412608. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_combine_flows), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_loop), (gst_avi_demux_chain): + Fix combined flow return. Fixes #412608. + +2007-02-28 10:41:14 +0000 Wim Taymans + + gst/videofilter/Makefile.am: Dist header.. + Original commit message from CVS: + * gst/videofilter/Makefile.am: + Dist header.. + +2007-02-28 10:29:08 +0000 Wim Taymans + + gst/videofilter/gstgamma.h: Add header too. + Original commit message from CVS: + * gst/videofilter/gstgamma.h: + Add header too. + +2007-02-28 10:17:15 +0000 Mark Nauwelaerts + + gst/videofilter/: Port gamma filter to 0.10. Fixes #412704. + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/videofilter/Makefile.am: + * gst/videofilter/gstgamma.c: (gst_gamma_base_init), + (gst_gamma_class_init), (gst_gamma_init), (gst_gamma_set_property), + (gst_gamma_get_property), (gst_gamma_calculate_tables), + (oil_tablelookup_u8), (gst_gamma_set_caps), + (gst_gamma_planar411_ip), (gst_gamma_transform_ip), (plugin_init): + Port gamma filter to 0.10. Fixes #412704. + * tests/check/Makefile.am: + * tests/check/elements/videofilter.c: (setup_filter), + (cleanup_filter), (check_filter), (GST_START_TEST), + (videobalance_suite), (videoflip_suite), (gamma_suite), (main): + Add unit tests for videofilters. + +2007-02-28 10:06:27 +0000 Wim Taymans + + gst/rtsp/URLS: Add another interesting test url. + Original commit message from CVS: + * gst/rtsp/URLS: + Add another interesting test url. + * gst/rtsp/rtspmessage.c: (rtsp_message_get_header): + Don't allow getting header fields from data packets. + +2007-02-27 23:43:08 +0000 Michael Smith + + ext/shout2/gstshout2.*: Add a property for username. + Original commit message from CVS: + * ext/shout2/gstshout2.c: (gst_shout2send_class_init), + (gst_shout2send_init), (gst_shout2send_start), + (gst_shout2send_set_property), (gst_shout2send_get_property): + * ext/shout2/gstshout2.h: + Add a property for username. + +2007-02-27 12:02:03 +0000 Christian Schaller + + * sys/directdraw/gstdirectdrawplugin.c: + * sys/directdraw/gstdirectdrawsink.c: + * sys/directdraw/gstdirectdrawsink.h: + * sys/directsound/gstdirectsoundplugin.c: + * sys/directsound/gstdirectsoundsink.c: + * sys/directsound/gstdirectsoundsink.h: + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + update copyright statements + Original commit message from CVS: + update copyright statements + +2007-02-27 11:59:21 +0000 Christian Schaller + + * ChangeLog: + * sys/osxaudio/gstosxaudio.c: + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudioelement.h: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosink.h: + update copyright statement + Original commit message from CVS: + update copyright statement + +2007-02-27 11:30:19 +0000 Edward Hervey + + sys/osxvideo/: Disable the cocoa event loop since it's a huge memory leak. Should only matter if the sink isn't used ... + Original commit message from CVS: + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + Disable the cocoa event loop since it's a huge memory leak. Should only + matter if the sink isn't used within an NSApp (which has already got + a coca event loop). + Remove all unused code. + +2007-02-26 12:07:14 +0000 Jan Schmidt + + gst/rtsp/Makefile.am: Fix make check too. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + Fix make check too. + +2007-02-26 10:00:28 +0000 Jan Schmidt + + gst/rtsp/base64.*: Commit missing files for base64 encoding. + Original commit message from CVS: + * gst/rtsp/base64.c: (util_base64_encode): + * gst/rtsp/base64.h: + Commit missing files for base64 encoding. + +2007-02-24 22:57:49 +0000 Loïc Minier + + Fix build with LDFLAGS='-Wl,-z,defs' (#410997) + Original commit message from CVS: + Patch by: Loïc Minier + * configure.ac: + * ext/annodex/Makefile.am: + * ext/jpeg/Makefile.am: + * ext/speex/Makefile.am: + * gst/alpha/Makefile.am: + * gst/cutter/Makefile.am: + * gst/debug/Makefile.am: + * gst/effectv/Makefile.am: + * gst/goom/Makefile.am: + * gst/level/Makefile.am: + * gst/smpte/Makefile.am: + * gst/videofilter/Makefile.am: + Fix build with LDFLAGS='-Wl,-z,defs' (#410997) + +2007-02-24 22:52:47 +0000 Tim-Philipp Müller + + Fix build with LDFLAGS='-Wl,-z,defs'. + Original commit message from CVS: + * configure.ac: + * ext/gsm/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/wavpack/Makefile.am: + * gst/equalizer/Makefile.am: + * gst/filter/Makefile.am: + * gst/mve/Makefile.am: + * gst/nsf/Makefile.am: + * gst/replaygain/Makefile.am: + * gst/speed/Makefile.am: + Fix build with LDFLAGS='-Wl,-z,defs'. + +2007-02-23 19:12:52 +0000 Jan Schmidt + + gst/rtsp/: g_base64_encode is a GLib 2.12 function. Use an equivalent taken from icecast to replace it. Relicensed fr... + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/rtspconnection.c: (append_auth_header), + (rtsp_connection_send), (rtsp_connection_set_auth): + g_base64_encode is a GLib 2.12 function. Use an equivalent taken + from icecast to replace it. Relicensed from GPL courtesy of Mike + Smith. + +2007-02-23 18:12:27 +0000 Jan Schmidt + + gst/rtsp/: Implement simple Basic Authentication support so that urls like rtsp://user:pass@hostname/rtspstream work ... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize), + (gst_rtspsrc_create_stream), (rtsp_auth_method_to_string), + (gst_rtspsrc_parse_auth_hdr), (gst_rtspsrc_setup_auth), + (gst_rtspsrc_send), (gst_rtspsrc_try_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), + (gst_rtspsrc_uri_set_uri): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (append_auth_header), (rtsp_connection_send), + (rtsp_connection_free), (rtsp_connection_set_auth): + * gst/rtsp/rtspconnection.h: + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspurl.c: (rtsp_url_get_request_uri): + * gst/rtsp/rtspurl.h: + Implement simple Basic Authentication support so that urls like + rtsp://user:pass@hostname/rtspstream work on hosts that require + authentication. + +2007-02-22 17:53:26 +0000 Edgard Lima + + * ChangeLog: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/v4l2_calls.c: + Fix segfault when oppening a radio device. + Original commit message from CVS: + Fix segfault when oppening a radio device. + +2007-02-22 14:35:28 +0000 Stefan Kost + + Fix level for multi-channel case. + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_set_caps), + (gst_level_transform_ip): + * sys/v4l2/README: + * tests/check/elements/level.c: (GST_START_TEST): + Fix level for multi-channel case. + +2007-02-21 10:18:12 +0000 Stefan Kost + + gst/level/gstlevel.*: Use function pointer for process function and add process functions for float audio. + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_init), (gst_level_set_caps), + (gst_level_transform_ip): + * gst/level/gstlevel.h: + Use function pointer for process function and add process functions + for float audio. + +2007-02-20 21:34:00 +0000 Sébastien Moutte + + sys/directsound/gstdirectsoundsink.*: Remove include of unused headers. + Original commit message from CVS: + * sys/directsound/gstdirectsoundsink.c: + * sys/directsound/gstdirectsoundsink.h: + Remove include of unused headers. + * sys/waveform/gstwaveformplugin.c: + * sys/waveform/gstwaveformsink.c: + * sys/waveform/gstwaveformsink.h: + * win32/vs6/libgstwaveform.dsp: + Add a new waveform plugin which includes an audio sink + element using the WaveForm win32 API. + * win32/MANIFEST: + Add the new project file form waveform plugin. + +2007-02-19 12:22:43 +0000 Stefan Kost + + sys/v4l2/v4l2src_calls.c: Readd GST_ELEMENT_ERROR if we can't reenque buffers after EIO, fixes #407369 + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init): + Readd GST_ELEMENT_ERROR if we can't reenque buffers after EIO, + fixes #407369 + +2007-02-18 18:00:51 +0000 Sébastien Moutte + + 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-18 13:24:26 +0000 Wim Taymans + + gst/rtp/: Added simple mpeg transport stream payloader. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp2tpay.c: (gst_rtp_mp2t_pay_base_init), + (gst_rtp_mp2t_pay_class_init), (gst_rtp_mp2t_pay_init), + (gst_rtp_mp2t_pay_setcaps), (gst_rtp_mp2t_pay_handle_buffer), + (gst_rtp_mp2t_pay_plugin_init): + * gst/rtp/gstrtpmp2tpay.h: + Added simple mpeg transport stream payloader. + +2007-02-16 12:32:01 +0000 Wim Taymans + + gst/rtsp/URLS: Add example H264 rtsp url. + Original commit message from CVS: + * gst/rtsp/URLS: + Add example H264 rtsp url. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): + Don't convert values to lowercase or we might mess up base64 encoded + properties. + +2007-02-16 12:30:22 +0000 Wim Taymans + + gst/rtp/README: Fix case of string params. + Original commit message from CVS: + * gst/rtp/README: + Fix case of string params. + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): + Fix depayloader, support more packet types. + Add sync codes to make sure the packetizer can do its job. + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_process): + Fix caps case again. + +2007-02-15 12:26:28 +0000 Wim Taymans + + gst/rtp/gstrtph264depay.c: Set right caps on output buffers. + Original commit message from CVS: + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): + Set right caps on output buffers. + +2007-02-14 17:04:47 +0000 Wim Taymans + + gst/rtsp/sdpmessage.c: Clear stack allocated SDPMedia struct before calling _init() on it. + Original commit message from CVS: + * gst/rtsp/sdpmessage.c: (sdp_parse_line): + As spotted by: Peter Kjellerstedt : + Clear stack allocated SDPMedia struct before calling _init() on it. + Clarify this in the docs as well. + +2007-02-14 17:01:25 +0000 Jan Schmidt + + ext/gconf/gstgconfaudiosink.c: Don't reset the profile when going switching states, as it makes the element non-reusa... + Original commit message from CVS: + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset), + (do_change_child): + Don't reset the profile when going switching states, as it makes + the element non-reusable. + +2007-02-14 15:24:50 +0000 jp.liu + + gst/rtsp/sdpmessage.*: Fix memory management of SDP messages. Fixes #407793. + Original commit message from CVS: + * gst/rtsp/sdpmessage.c: (sdp_origin_init), (sdp_connection_init), + (sdp_bandwidth_init), (sdp_time_init), (sdp_zone_init), + (sdp_key_init), (sdp_attribute_init), (sdp_message_init), + (sdp_message_uninit), (sdp_message_free), (sdp_media_init), + (sdp_media_uninit), (sdp_media_free), (sdp_message_add_media), + (sdp_parse_line): + * gst/rtsp/sdpmessage.h: + Based on patch by: jp.liu + Fix memory management of SDP messages. Fixes #407793. + +2007-02-14 12:07:01 +0000 zhangfei gao + + gst/avi/gstavimux.c: Allow muxing video/x-h264 (was already in the caps). Fixes #407780. + Original commit message from CVS: + Patch by: zhangfei gao + * gst/avi/gstavimux.c: (gst_avi_mux_vidsink_set_caps): + Allow muxing video/x-h264 (was already in the caps). Fixes #407780. + +2007-02-14 10:09:12 +0000 jp.liu + + gst/rtsp/rtspurl.c: Fix parsing of password field in url. Fixes #407797. + Original commit message from CVS: + Patch by: jp.liu + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + Fix parsing of password field in url. Fixes #407797. + +2007-02-14 09:55:47 +0000 Wim Taymans + + gst/wavparse/gstwavparse.*: Update docs. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), + (gst_wavparse_reset), (gst_wavparse_init), + (gst_wavparse_destroy_sourcepad), (gst_wavparse_fmt), + (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), + (gst_wavparse_perform_seek), (gst_wavparse_peek_chunk_info), + (gst_wavparse_stream_headers), (gst_wavparse_parse_stream_init), + (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), + (gst_wavparse_loop), (gst_wavparse_chain), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query), + (gst_wavparse_srcpad_event), (gst_wavparse_change_state), + (plugin_init): + * gst/wavparse/gstwavparse.h: + Update docs. + Use boilerplate. + Various code cleanups. + When the bitrate is not known (bps == 0 or compressed formats) let + downstream element guestimate the duration and position and don't + generate timestamps or durations. Fixes #405213. + Fix EOS and ERROR conditions in chain mode, we just need to forward the + error flowreturn upstream. + +2007-02-13 16:01:29 +0000 Jan Schmidt + + Re-factor the gconfaudiosink into a "GstSwitchSink" base class and a child that implements the GConf key monitoring. ... + Original commit message from CVS: + * ext/gconf/Makefile.am: + * ext/gconf/gconf.c: (gst_gconf_get_string), + (gst_gconf_get_key_for_sink_profile), (gst_gconf_set_string), + (gst_gconf_render_bin_with_default): + * ext/gconf/gconf.h: + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init), + (gst_gconf_audio_sink_reset), (gst_gconf_audio_sink_init), + (gst_gconf_audio_sink_dispose), (do_change_child), + (gst_gconf_switch_profile), (gst_gconf_audio_sink_set_property), + (cb_change_child), (gst_gconf_audio_sink_change_state): + * ext/gconf/gstgconfaudiosink.h: + * ext/gconf/gstswitchsink.c: (gst_switch_sink_base_init), + (gst_switch_sink_class_init), (gst_switch_sink_reset), + (gst_switch_sink_init), (gst_switch_sink_dispose), + (gst_switch_commit_new_kid), (gst_switch_sink_set_child), + (gst_switch_sink_set_property), (gst_switch_sink_handle_event), + (gst_switch_sink_get_property), (gst_switch_sink_change_state): + * ext/gconf/gstswitchsink.h: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_class_init), (gst_auto_audio_sink_dispose), + (gst_auto_audio_sink_clear_kid), (gst_auto_audio_sink_reset), + (gst_auto_audio_sink_detect): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_class_init), (gst_auto_video_sink_dispose), + (gst_auto_video_sink_clear_kid), (gst_auto_video_sink_reset), + (gst_auto_video_sink_detect): + Re-factor the gconfaudiosink into a "GstSwitchSink" base class + and a child that implements the GConf key monitoring. The end goal of + this is an audio sink that can be changed on the fly, but at the + moment it still only changes on the next READY transition. + +2007-02-13 11:57:18 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Put debug stuff into #ifndef GST_DISABLE_DEBUG #endif + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), + (gst_avi_demux_sync), (gst_avi_demux_massage_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_push_event), (gst_avi_demux_stream_header_pull), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_loop): + Put debug stuff into #ifndef GST_DISABLE_DEBUG #endif + +2007-02-13 09:46:26 +0000 Stefan Kost + + Add crossreferences to glib/gobject/gstream docs. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + Add crossreferences to glib/gobject/gstream docs. + +2007-02-12 23:35:16 +0000 Tim-Philipp Müller + + gst/monoscope/: Fix copy'n'paste-o in docs chunk. Also add some missing CFLAGS (but no LIBS, since we only use define... + Original commit message from CVS: + * gst/monoscope/Makefile.am: + * gst/monoscope/gstmonoscope.c: + Fix copy'n'paste-o in docs chunk. Also add some missing CFLAGS + (but no LIBS, since we only use defines from the headers). + +2007-02-12 23:27:31 +0000 Jonathan Matthew + + gst/wavparse/gstwavparse.c: Fix massive memory leak when operating in streaming mode due to + Original commit message from CVS: + Based on patch by: Jonathan Matthew + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_stream_init), + (gst_wavparse_stream_data): + Fix massive memory leak when operating in streaming mode due to + GST_BUFFER_MALLOCDATA() not being set on newly-created buffers. + Fixes #407057. + +2007-02-12 15:29:44 +0000 Stefan Kost + + gst/avi/gstavidemux.*: Save some memory (8%) by repacking the index entry structure (more to come). Add more FIXMEs t... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), + (gst_avi_demux_reset), (gst_avi_demux_index_entry_for_time), + (gst_avi_demux_handle_src_query), (gst_avi_demux_parse_superindex), + (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), + (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), + (gst_avi_demux_sync), (gst_avi_demux_next_data_buffer), + (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_push_event), (gst_avi_demux_stream_header_pull), + (gst_avi_demux_do_seek), (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data), (gst_avi_demux_loop): + * gst/avi/gstavidemux.h: + Save some memory (8%) by repacking the index entry structure (more to + come). Add more FIXMEs to questionable parts. + +2007-02-12 12:57:22 +0000 Stefan Kost + + sys/v4l2/: More FIXME comments and messaging changes. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps), + (gst_v4l2src_get_caps): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init): + More FIXME comments and messaging changes. + +2007-02-12 12:43:00 +0000 Stefan Kost + + gst/goom/gstgoom.*: Improved docs and use GST_DEBUG_FUNCPTR. + Original commit message from CVS: + * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), + (gst_goom_change_state): + * gst/goom/gstgoom.h: + Improved docs and use GST_DEBUG_FUNCPTR. + * gst/level/gstlevel.c: (gst_level_class_init): + Use GST_DEBUG_FUNCPTR. + * gst/monoscope/gstmonoscope.c: (gst_monoscope_init), + (gst_monoscope_chain), (gst_monoscope_change_state): + Improved docs source cleanups. + +2007-02-12 10:29:57 +0000 Tim-Philipp Müller + + gst/debug/: Add code for a pushfilesrc element that implements a pushfile:// URI handler, to make debugging push-mode... + Original commit message from CVS: + * gst/debug/Makefile.am: + * gst/debug/gstdebug.c: (plugin_init): + * gst/debug/gstpushfilesrc.c: + * gst/debug/gstpushfilesrc.h: + Add code for a pushfilesrc element that implements a pushfile:// URI + handler, to make debugging push-mode operation of demuxer/decoders + that support both easier in connection with seek/playbin/etc. + The element isn't registered at the moment. + +2007-02-11 15:26:49 +0000 Sébastien Moutte + + 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-02-11 12:57:47 +0000 Sébastien Moutte + + gst/avi/gstavimux.c: Comment a #if 0 in caps template definition as VS6 seems to do not support it. + Original commit message from CVS: + * gst/avi/gstavimux.c: + Comment a #if 0 in caps template definition as VS6 seems to + do not support it. + * gst/rtsp/gstrtspsrc.c:(gst_rtspsrc_loop_udp): + Use gst_guint64_to_gdouble for conversion. + * gst/rtsp/rtspconnection.c:(rtsp_connection_send): + Move variables declaration before the first instruction. + * gst/rtsp/rtspdefs.c:(rtsp_strresult): + Don't use hstrerror for error log on G_OS_WIN32 build as it's not supported. + And don't include netdb.h for G_OS_WIN32 + * gst/rtsp/sdpmessage.c:(sdp_parse_line): + This initialization SDPMedia nmedia = {.media = NULL }; is not supported + by VS6 then use an other way to initialize SDPMedia structure. + * gst/udp/gstdynudpsink.h: + * gst/udp/gstdynudpnetutils.h: + Do not include for G_OS_WIN32 + * gst/udp/gstudpsrc.c: + Define socklen_t as int for G_OS_WIN32 + * win/common/config.h.in: + Undef HAVE_NETINET_IN_H + * win32/vs6/gst_plugins_good.dsw: + * win32/vs6/libgstrtp.dsp: + * win32/vs6/libgstrtsp.dsp: + * win32/vs6/libgstautogen.dsp: + * win32/vs6/libgstaudiofx.dsp: + * win32/vs6/libgstudp.dsp: + Add and update project files. + * win32/common/gstudp-enumtypes.c: + * win32/common/gstudp-enumtypes.h: + Add a copy of udp enumtypes to win32/common as in core + and base. + +2007-02-11 10:53:21 +0000 Stefan Kost + + configure.ac: Activate monoscope when building with --enable-experimental. Fix + Original commit message from CVS: + * configure.ac: + Activate monoscope when building with --enable-experimental. Fix + --enable-external configure switch description. + * sys/sunaudio/gstsunaudiomixer.c: (gst_sunaudiomixer_base_init): + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_dispose): + Help gst-indent. + +2007-02-09 09:24:58 +0000 Tim-Philipp Müller + + gst/avi/gstavimux.c: Explicitly cast result of pointer arithmetic to integer in order to avoid compiler warnings on s... + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_riff_get_avi_header): + Explicitly cast result of pointer arithmetic to integer in order to + avoid compiler warnings on some 64-bit systems. Should fix #406018. + +2007-02-08 11:09:15 +0000 Tim-Philipp Müller + + gst/debug/progressreport.c: Some more docs. + Original commit message from CVS: + * gst/debug/progressreport.c: + Some more docs. + +2007-02-07 21:09:45 +0000 Tim-Philipp Müller + + docs/plugins/inspect/plugin-rtp.xml: Update for new elements. + Original commit message from CVS: + * docs/plugins/inspect/plugin-rtp.xml: + Update for new elements. + * gst/debug/progressreport.h: + Commit newly-created header file as well. + +2007-02-07 20:39:16 +0000 Tim-Philipp Müller + + Make progressreport element post messages with the current progress on the bus. Also add some basic docs for it. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * gst/debug/Makefile.am: + * gst/debug/progressreport.c: (gst_progress_report_post_progress), + (gst_progress_report_do_query), (gst_progress_report_report): + Make progressreport element post messages with the current progress + on the bus. Also add some basic docs for it. + +2007-02-07 13:08:34 +0000 Tim-Philipp Müller + + ext/hal/hal.*: Some small cleanups; deal with errors when parsing the HAL ALSA capabilities a bit better. + Original commit message from CVS: + * ext/hal/hal.c: (gst_hal_get_string): + * ext/hal/hal.h: + Some small cleanups; deal with errors when parsing the HAL ALSA + capabilities a bit better. + +2007-02-06 16:29:30 +0000 Tim-Philipp Müller + + gst/smpte/gstsmpte.c: Let's try this again and use the right cast this time. + Original commit message from CVS: + * gst/smpte/gstsmpte.c: (gst_smpte_transition_type_get_type): + Let's try this again and use the right cast this time. + +2007-02-06 16:24:57 +0000 Tim-Philipp Müller + + gst/smpte/gstsmpte.c: Add cast to avoid compiler warnings with older GLib versions where the nick/name members in GEn... + Original commit message from CVS: + * gst/smpte/gstsmpte.c: (gst_smpte_transition_type_get_type): + Add cast to avoid compiler warnings with older GLib versions + where the nick/name members in GEnumValue are not declared as + constant strings. + +2007-02-06 15:56:14 +0000 Tim-Philipp Müller + + ext/gconf/: In gconfaudiosink, get the right key as the old key in do_toggle (ie. one dependent on the profile select... + Original commit message from CVS: + * ext/gconf/gconf.c: (gst_gconf_get_key_for_sink_profile), + (gst_gconf_render_bin_from_key), + (gst_gconf_get_default_audio_sink): + * ext/gconf/gconf.h: + * ext/gconf/gstgconfaudiosink.c: (get_gconf_key_for_profile), + (do_toggle_element), (gst_gconf_audio_sink_set_property), + (gst_gconf_audio_sink_get_property): + In gconfaudiosink, get the right key as the old key in do_toggle + (ie. one dependent on the profile selected). Log some more stuff so + we can see what's actually going on. + +2007-02-06 11:16:49 +0000 Sebastian Dröge + + gst/audiofx/: Some small cleanups and port both elements to the new GstAudioFilter base class to save a few lines of ... + Original commit message from CVS: + * gst/audiofx/audioamplify.c: (gst_audio_amplify_base_init), + (gst_audio_amplify_class_init), (gst_audio_amplify_init), + (gst_audio_amplify_set_process_function), + (gst_audio_amplify_setup): + * gst/audiofx/audioamplify.h: + * gst/audiofx/audioinvert.c: (gst_audio_invert_base_init), + (gst_audio_invert_class_init), (gst_audio_invert_setup): + * gst/audiofx/audioinvert.h: + Some small cleanups and port both elements to the new GstAudioFilter + base class to save a few lines of common code. + * gst/audiofx/Makefile.am: + Link against libgstaudio for the above changes + +2007-02-03 23:35:26 +0000 Tim-Philipp Müller + + Fix up to use the newly ported (actually working) GstAudioFilter. + Original commit message from CVS: + * configure.ac: + * gst/equalizer/Makefile.am: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init), + (gst_iir_equalizer_class_init), (gst_iir_equalizer_init), + (setup_filter), (gst_iir_equalizer_compute_frequencies), + (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), + (gst_iir_equalizer_transform_ip), (gst_iir_equalizer_setup), + (plugin_init): + * gst/equalizer/gstiirequalizer.h: + Fix up to use the newly ported (actually working) GstAudioFilter. + Bump core/base requirements to CVS for this. + * tests/icles/.cvsignore: + * tests/icles/Makefile.am: + * tests/icles/equalizer-test.c: (check_bus), + (equalizer_set_band_value), (equalizer_set_all_band_values), + (equalizer_set_band_value_and_wait), + (equalizer_set_all_band_values_and_wait), (do_slider_fiddling), + (main): + Add brain-dead interactive test for equalizer. + +2007-02-02 18:36:28 +0000 Tim-Philipp Müller + + gst/equalizer/gstiirequalizer.c: Rename "values" property to "band-values" and change type into a + Original commit message from CVS: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_class_init), + (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), + (gst_iir_equalizer_filter_inplace): + Rename "values" property to "band-values" and change type into a + GValueArray, so it's more easily bindable and the range of the + values passed in is defined and checked etc.; also do some + locking. + +2007-02-02 17:39:21 +0000 James Doc Livingston + + Port equalizer plugin to 0.10 (#403572). + Original commit message from CVS: + Patch by: James "Doc" Livingston + * configure.ac: + * gst/equalizer/Makefile.am: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_get_type), + (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), + (gst_iir_equalizer_compute_frequencies), + (gst_iir_equalizer_set_property), + (gst_iir_equalizer_filter_inplace), (gst_iir_equalizer_setup), + (plugin_init): + Port equalizer plugin to 0.10 (#403572). + +2007-01-31 08:32:59 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Fix a off by one that leads to the duration reported as one sample less than it is + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query), + (gst_wavpack_parse_handle_seek_event), + (gst_wavpack_parse_create_src_pad): + Fix a off by one that leads to the duration reported as one + sample less than it is + +2007-01-30 17:19:33 +0000 Edward Hervey + + configure.ac: Check for an Objective C compiler + Original commit message from CVS: + * configure.ac: + Check for an Objective C compiler + * sys/Makefile.am: + * sys/osxvideo/Makefile.am: + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + Port of osxvideo plugin to 0.10. Do NOT consider 100% stable ! + Fixes #402470 + +2007-01-29 10:59:48 +0000 Wim Taymans + + tests/check/elements/.cvsignore: Some more ignores. + Original commit message from CVS: + * tests/check/elements/.cvsignore: + Some more ignores. + +2007-01-28 18:28:33 +0000 Tim-Philipp Müller + + gst/videocrop/gstvideocrop.c: Fix cropping for packed 4:2:2 formats YUYV/YUY2 and UYVY. + Original commit message from CVS: + * gst/videocrop/gstvideocrop.c: + (gst_video_crop_get_image_details_from_caps), + (gst_video_crop_transform_packed_complex): + Fix cropping for packed 4:2:2 formats YUYV/YUY2 and UYVY. + * tests/icles/videocrop-test.c: (check_bus_for_errors), + (test_with_caps), (main): + Block streaming thread before changing filter caps while the + pipeline is running so that we don't get random not-negotiated + errors just because GStreamer can't handle that yet. + +2007-01-27 16:08:15 +0000 Tim-Philipp Müller + + tests/icles/videocrop-test.c: Catch errors while the test is running. + Original commit message from CVS: + * tests/icles/videocrop-test.c: (test_with_caps): + Catch errors while the test is running. + +2007-01-26 12:21:41 +0000 charles + + ext/shout2/gstshout2.*: Properly handle tags in shout2send. Fixes #399825. + Original commit message from CVS: + Patch by: charles + * ext/shout2/gstshout2.c: (gst_shout2send_init), + (set_shout_metadata), (gst_shout2send_event): + * ext/shout2/gstshout2.h: + Properly handle tags in shout2send. Fixes #399825. + +2007-01-25 23:27:59 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Fix the SEEKING query. We can seek if we are in pull mode, not the other way around. A... + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query): + Fix the SEEKING query. We can seek if we are in pull mode, not the + other way around. Also set the correct format in the seeking query and + handle the case where the headers are not read yet and we can't say + anything about our seeking capabilities. + +2007-01-25 21:55:49 +0000 Sebastian Dröge + + ext/wavpack/: Fix spelling in 2 places: It's called Wavpack, not WavePack. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): + Fix spelling in 2 places: It's called Wavpack, not WavePack. + +2007-01-25 14:40:15 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Convert SDP fields to upper/lowercase following the rules in the SDP to caps document. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_activate_streams): + Convert SDP fields to upper/lowercase following the rules in the SDP to + caps document. + +2007-01-25 14:22:53 +0000 Wim Taymans + + gst/rtp/: Fix case of encoding-name and key/value pairs to match the document. + Original commit message from CVS: + * gst/rtp/README: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + Fix case of encoding-name and key/value pairs to match the document. + This is to make interoperation with SDP case-insensitive as required by + the relevant RFCs. + +2007-01-25 12:05:11 +0000 Edward Hervey + + gst/: Use proper print statements. + Original commit message from CVS: + * gst/multifile/gstmultifilesink.c: + (gst_multi_file_sink_class_init): + * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_class_init): + * gst/mve/gstmvedemux.c: (gst_mve_video_create_buffer), + (gst_mve_video_palette), (gst_mve_video_code_map), + (gst_mve_audio_init), (gst_mve_audio_data), (gst_mve_timer_create), + (gst_mve_demux_chain): + * gst/mve/gstmvemux.c: (gst_mve_mux_push_chunk): + * gst/mve/mveaudioenc.c: (mve_compress_audio): + * gst/mve/mvevideodec16.c: (ipvideo_copy_block): + * gst/mve/mvevideodec8.c: (ipvideo_copy_block): + * gst/mve/mvevideoenc16.c: (mve_encode_frame16): + * gst/mve/mvevideoenc8.c: (mve_encode_frame8): + Use proper print statements. + Fixes build on mac os x. + oo look at me my name is edward i'm hacking on macos wooo + +2007-01-25 11:02:01 +0000 Wim Taymans + + configure.ac: Bump required -core/-base to CVS + Original commit message from CVS: + * configure.ac: + Bump required -core/-base to CVS + +2007-01-25 10:54:19 +0000 Wim Taymans + + gst/rtp/gstrtpL16pay.*: Fill up to MTU using adapter. + Original commit message from CVS: + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), + (gst_rtp_L16_pay_flush), (gst_rtp_L16_pay_handle_buffer): + * gst/rtp/gstrtpL16pay.h: + Fill up to MTU using adapter. + Timestamp rtp packets. + +2007-01-25 10:36:35 +0000 Edward Hervey + + Use G_GSIZE_FORMAT in print statements for portability. + Original commit message from CVS: + * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): + * sys/ximage/ximageutil.c: (ximageutil_check_xshm_calls): + Use G_GSIZE_FORMAT in print statements for portability. + Fixes build on macosx. + +2007-01-24 18:20:14 +0000 Wim Taymans + + gst/rtp/: Port and enable raw audio payloader/depayloader. Needs a bit more work on the payloader side. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_base_init), + (gst_rtp_L16_depay_class_init), (gst_rtp_L16_depay_init), + (gst_rtp_L16_depay_parse_int), (gst_rtp_L16_depay_setcaps), + (gst_rtp_L16_depay_process), (gst_rtp_L16_depay_set_property), + (gst_rtp_L16_depay_get_property), (gst_rtp_L16_depay_change_state), + (gst_rtp_L16_depay_plugin_init): + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_get_type), + (gst_rtp_L16_pay_base_init), (gst_rtp_L16_pay_class_init), + (gst_rtp_L16_pay_init), (gst_rtp_L16_pay_finalize), + (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_handle_buffer), + (gst_rtp_L16_pay_plugin_init): + * gst/rtp/gstrtpL16pay.h: + Port and enable raw audio payloader/depayloader. Needs a bit more work + on the payloader side. + +2007-01-24 16:25:55 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Only unblock the udp pads when we linked and activated them all. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (pad_blocked), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_udp): + * gst/rtsp/gstrtspsrc.h: + Only unblock the udp pads when we linked and activated them all. + Fixes #395688. + +2007-01-24 15:18:34 +0000 Wim Taymans + + gst/rtp/: Added simple AC3 depayloader (RFC 4184). + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_base_init), + (gst_rtp_ac3_depay_class_init), (gst_rtp_ac3_depay_init), + (gst_rtp_ac3_depay_setcaps), (gst_rtp_ac3_depay_process), + (gst_rtp_ac3_depay_set_property), (gst_rtp_ac3_depay_get_property), + (gst_rtp_ac3_depay_change_state), (gst_rtp_ac3_depay_plugin_init): + * gst/rtp/gstrtpac3depay.h: + Added simple AC3 depayloader (RFC 4184). + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): + Fix a leak. + +2007-01-24 12:41:03 +0000 Sebastian Dröge + + gst/audiofx/: Add new element "audioamplify". This allows scaling of raw audio samples, similar to the "volume" eleme... + Original commit message from CVS: + reviewed by: Stefan Kost + * gst/audiofx/Makefile.am: + * gst/audiofx/audioamplify.c: + (gst_audio_amplify_clipping_method_get_type), + (gst_audio_amplify_base_init), (gst_audio_amplify_class_init), + (gst_audio_amplify_init), (gst_audio_amplify_set_process_function), + (gst_audio_amplify_set_property), (gst_audio_amplify_get_property), + (gst_audio_amplify_set_caps), + (gst_audio_amplify_transform_int_clip), + (gst_audio_amplify_transform_int_wrap_negative), + (gst_audio_amplify_transform_int_wrap_positive), + (gst_audio_amplify_transform_float_clip), + (gst_audio_amplify_transform_float_wrap_negative), + (gst_audio_amplify_transform_float_wrap_positive), + (gst_audio_amplify_transform_ip): + * gst/audiofx/audioamplify.h: + * gst/audiofx/audiofx.c: (plugin_init): + Add new element "audioamplify". This allows scaling of raw audio + samples, similar to the "volume" element, but provides different modes + for clipping and allows unlimited amplification. It's mainly targeted + for creative sound design and not as a replacement of the "volume" + element. Fixes #397162 + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-audiofx.xml: + Add docs for audioamplify and integrate them into the build system + * tests/check/Makefile.am: + * tests/check/elements/audioamplify.c: (setup_amplify), + (cleanup_amplify), (GST_START_TEST), (amplify_suite), (main): + Add fairly extensive unit test suite for audioamplify + +2007-01-24 12:26:41 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Unblock pads after adding the pads to the element so that autopluggers get a change to link so... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (pad_unblocked), (pad_blocked): + Unblock pads after adding the pads to the element so that autopluggers + get a change to link something. Possibly fixes #395688. + +2007-01-24 12:22:51 +0000 Wim Taymans + + gst/rtp/: Fix caps with payload numbers. + Original commit message from CVS: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init): + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_class_init), + (gst_rtp_mpa_depay_init), (gst_rtp_mpa_depay_setcaps), + (gst_rtp_mpa_depay_process): + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_class_init), + (gst_rtp_mpv_depay_init), (gst_rtp_mpv_depay_process): + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + Fix caps with payload numbers. + Add some fixed payload numbers to caps when possible. + +2007-01-24 11:29:00 +0000 Wim Taymans + + gst/qtdemux/gstrtpxqtdepay.c: Fix caps on the depayloader. + Original commit message from CVS: + * gst/qtdemux/gstrtpxqtdepay.c: + Fix caps on the depayloader. + +2007-01-23 18:16:09 +0000 Sebastian Dröge + + gst/audiofx/: Add new audiofx element "audioinvert". This element swaps the upper and lower half of samples and can b... + Original commit message from CVS: + reviewed by: Stefan Kost + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofx.c: (plugin_init): + * gst/audiofx/audioinvert.c: (gst_audio_invert_base_init), + (gst_audio_invert_class_init), (gst_audio_invert_init), + (gst_audio_invert_set_property), (gst_audio_invert_get_property), + (gst_audio_invert_set_caps), (gst_audio_invert_transform_int), + (gst_audio_invert_transform_float), + (gst_audio_invert_transform_ip): + * gst/audiofx/audioinvert.h: + Add new audiofx element "audioinvert". This element swaps the upper + and lower half of samples and can be used for example for a + wide-stereo effect. Fixes #396057 + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-audiofx.xml: + Add docs for the audioinvert element and add them to the build system. + * tests/check/Makefile.am: + * tests/check/elements/audioinvert.c: (setup_invert), + (cleanup_invert), (GST_START_TEST), (invert_suite), (main): + Add unit test suite for the audioinvert element. + +2007-01-23 17:36:32 +0000 Wim Taymans + + gst/rtp/gstrtpmp4gdepay.c: Parse config params as string and int. + Original commit message from CVS: + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_parse_int), + (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process): + Parse config params as string and int. + Parse and use AU header length + +2007-01-23 17:27:39 +0000 Wim Taymans + + gst/smpte/: constify some static structs. + Original commit message from CVS: + * gst/smpte/barboxwipes.c: (gst_wipe_boxes_draw), + (gst_wipe_triangles_clock_draw), (gst_wipe_triangles_draw): + * gst/smpte/gstmask.c: (_gst_mask_register): + * gst/smpte/gstmask.h: + * gst/smpte/gstsmpte.c: (gst_smpte_update_mask): + * gst/smpte/paint.c: (gst_smpte_paint_hbox), (draw_bresenham_line), + (gst_smpte_paint_triangle_clock): + constify some static structs. + Don't update the mask if nothing changed to the params. + Make sure we never draw outside of the picture. Fixes #398325. + +2007-01-22 13:06:43 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Error out properly when pull_range fails while we're reading the headers, instead of just paus... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header_pull): + Error out properly when pull_range fails while we're reading the + headers, instead of just pausing the task silently. Fixes #399338. + +2007-01-19 13:06:07 +0000 Tim-Philipp Müller + + gst/smpte/gstsmpte.c: Some more sanity checks to make sure the input formats match and the input pads are actually ne... + Original commit message from CVS: + * gst/smpte/gstsmpte.c: (gst_smpte_collected): + Some more sanity checks to make sure the input formats match and the + input pads are actually negotiated, in case someone tries to feed + buffers from fakesrc or filesrc. Fixes #398299. + Also const-ify an array, just because we can. + +2007-01-19 10:35:13 +0000 Edward Hervey + + gst/smpte/gstsmpte.c: Ignore previous commit, that was only valid for widths and heights that are multiples of 4. + Original commit message from CVS: + * gst/smpte/gstsmpte.c: (fill_i420), (gst_smpte_collected): + Ignore previous commit, that was only valid for widths and heights + that are multiples of 4. + Copy over size/stride macros from jpegdec. This allows the element + to work with any width,height... + ... but puts in evidence that the actual transformations only work + with width/height that are multiples of 4. + +2007-01-19 09:48:47 +0000 Edward Hervey + + gst/smpte/gstsmpte.c: Allocate buffers of the right size. + Original commit message from CVS: + * gst/smpte/gstsmpte.c: (gst_smpte_collected): + Allocate buffers of the right size. + The proper size of a I420 buffer in bytes is: + width * height * 3 + ------------------ + 2 + +2007-01-18 18:37:39 +0000 Tim-Philipp Müller + + gst/smpte/gstsmpte.c: Proxy getcaps on sink pads too, so that we either end up with the same dimensions on all pads o... + Original commit message from CVS: + * gst/smpte/gstsmpte.c: (gst_smpte_init): + Proxy getcaps on sink pads too, so that we either end up with the + same dimensions on all pads or error out if that's not possible + (seems to work even!). Fixes #398086, I think. + +2007-01-18 11:29:17 +0000 Tim-Philipp Müller + + docs/plugins/: Remove ladspa from docs; add hierarchy info for GstAudioPanorama; fix integer properties with -1 as mi... + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + Remove ladspa from docs; add hierarchy info for GstAudioPanorama; + fix integer properties with -1 as minimum value. + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + Update to CVS. + +2007-01-18 11:23:36 +0000 Stefan Kost + + gst/audiofx/audiopanorama.c: Fix doc section name (Fixes #397946) + Original commit message from CVS: + * gst/audiofx/audiopanorama.c: + Fix doc section name (Fixes #397946) + +2007-01-18 10:33:50 +0000 Tim-Philipp Müller + + * ChangeLog: + Remove bogus ChangeLog entry + Original commit message from CVS: + Remove bogus ChangeLog entry + +2007-01-17 14:30:50 +0000 Stefan Kost + + sys/v4l2/: Fix EIO handing when capturing. Add new property to specify the number of buffers to enque (and remove the... + Original commit message from CVS: + * sys/v4l2/gstv4l2object.c: + (gst_v4l2_object_install_properties_helper), + (gst_v4l2_object_set_property_helper), + (gst_v4l2_object_get_property_helper), (gst_v4l2_set_defaults): + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), + (gst_v4l2src_init), (gst_v4l2src_set_property), + (gst_v4l2src_get_property), (gst_v4l2src_set_caps): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), + (gst_v4l2src_capture_deinit): + Fix EIO handing when capturing. Add new property to specify the number of + buffers to enque (and remove the borked num-buffers usage). + +2007-01-16 08:29:11 +0000 Sebastian Dröge + + gst/audiofx/audiopanorama.c: Use a function array for process methods, add more docs and define the startindex of enums. + Original commit message from CVS: + Patch by: Sebastian Dröge + * gst/audiofx/audiopanorama.c: (gst_audio_panorama_class_init), + (gst_audio_panorama_set_process_function): + Use a function array for process methods, add more docs and define the + startindex of enums. + +2007-01-14 17:55:33 +0000 Mark Nauwelaerts + + Add support for more than one audio stream; write better AVIX header; refactor code a bit; don't announce vorbis caps... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/avi/gstavimux.c: (gst_avi_mux_finalize), + (gst_avi_mux_pad_reset), (gst_avi_mux_reset), (gst_avi_mux_init), + (gst_avi_mux_vidsink_set_caps), (gst_avi_mux_audsink_set_caps), + (gst_avi_mux_request_new_pad), (gst_avi_mux_release_pad), + (gst_avi_mux_riff_get_avi_header), + (gst_avi_mux_riff_get_avix_header), (gst_avi_mux_riff_get_header), + (gst_avi_mux_write_avix_index), (gst_avi_mux_add_index), + (gst_avi_mux_bigfile), (gst_avi_mux_start_file), + (gst_avi_mux_stop_file), (gst_avi_mux_handle_event), + (gst_avi_mux_do_buffer), (gst_avi_mux_do_one_buffer), + (gst_avi_mux_change_state): + * gst/avi/gstavimux.h: + * tests/check/elements/avimux.c: (teardown_src_pad): + Add support for more than one audio stream; write better AVIX + header; refactor code a bit; don't announce vorbis caps on our audio + sink pads since we don't support it anyway. Closes #379298. + +2007-01-13 19:12:32 +0000 Andy Wingo + + gst/interleave/deinterleave.c (gst_deinterleave_add_new_pads): Use fixed caps on src pads. + Original commit message from CVS: + 2007-01-13 Andy Wingo + * gst/interleave/deinterleave.c (gst_deinterleave_add_new_pads): + Use fixed caps on src pads. + (gst_deinterleave_remove_pads): Remove src pads, not sink pads. I + seem to have reverse midas disease! + (gst_deinterleave_process): Proxy timestamps, offsets, durations, + and set caps on outgoing buffers. Fixes #395597, I think. + +2007-01-13 18:01:41 +0000 Andy Wingo + + gst/interleave/interleave.c (gst_interleave_init): Init the activation mode properly. + Original commit message from CVS: + 2007-01-13 Andy Wingo + * gst/interleave/interleave.c (gst_interleave_init): Init the + activation mode properly. + (gst_interleave_src_setcaps, gst_interleave_src_getcaps) + (gst_interleave_init): Set a setcaps and getcaps function on the + src pad, so that we can implement pull-mode negotiation. + (gst_interleave_sink_setcaps): Renamed from + gst_interleave_setcaps, as it only does the sink logic now. + Implement both for pull-mode and push-mode. + (gst_interleave_process): Set caps on our outgoing buffer. + (gst_interleave_src_activate_pull): Fix some more bogus casts. + What is up with this. + +2007-01-13 15:52:18 +0000 Sebastian Dröge + + gst/audiofx/audiopanorama.*: Add 'method' property and provide a simple (non-psychoacustic) processing method (#394859). + Original commit message from CVS: + Patch by: Sebastian Dröge + * gst/audiofx/audiopanorama.c: + (gst_audio_panorama_method_get_type), + (gst_audio_panorama_class_init), (gst_audio_panorama_init), + (gst_audio_panorama_set_process_function), + (gst_audio_panorama_set_property), + (gst_audio_panorama_get_property), (gst_audio_panorama_set_caps), + (gst_audio_panorama_transform_m2s_int_simple), + (gst_audio_panorama_transform_s2s_int_simple), + (gst_audio_panorama_transform_m2s_float_simple), + (gst_audio_panorama_transform_s2s_float_simple): + * gst/audiofx/audiopanorama.h: + Add 'method' property and provide a simple (non-psychoacustic) + processing method (#394859). + * tests/check/elements/audiopanorama.c: (GST_START_TEST), + (panorama_suite): + Tests for new method. + +2007-01-12 18:28:13 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + comment out LADSPA plugin for now + Original commit message from CVS: + comment out LADSPA plugin for now + +2007-01-12 17:16:51 +0000 Wim Taymans + + gst/qtdemux/: Add X-QT depayloader that will eventually share code with the demuxer. + Original commit message from CVS: + * gst/qtdemux/Makefile.am: + * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_base_init), + (gst_rtp_xqt_depay_class_init), (gst_rtp_xqt_depay_init), + (gst_rtp_xqt_depay_finalize), (gst_rtp_quicktime_parse_sd), + (gst_rtp_xqt_depay_setcaps), (gst_rtp_xqt_depay_process), + (gst_rtp_xqt_depay_set_property), (gst_rtp_xqt_depay_get_property), + (gst_rtp_xqt_depay_change_state), (gst_rtp_xqt_depay_plugin_init): + * gst/qtdemux/gstrtpxqtdepay.h: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_base_init), + (gst_qtdemux_loop_state_header), (gst_qtdemux_loop), + (qtdemux_parse_moov), (qtdemux_parse_container), + (qtdemux_parse_node), (gst_qtdemux_add_stream), + (qtdemux_parse_trak), (qtdemux_audio_caps): + * gst/qtdemux/qtdemux.h: + * gst/qtdemux/quicktime.c: (plugin_init): + Add X-QT depayloader that will eventually share code with the demuxer. + Make new plugin entry point with quicktime releated stuff. + +2007-01-12 12:10:19 +0000 Tim-Philipp Müller + + gst/qtdemux/Makefile.am: Dist all new files. + Original commit message from CVS: + * gst/qtdemux/Makefile.am: + Dist all new files. + +2007-01-12 10:27:25 +0000 Wim Taymans + + docs/plugins/: Activate docs for jack, sdl and qtdemux. + Original commit message from CVS: + * 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.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.signals: + * docs/plugins/inspect/plugin-qtdemux.xml: + Activate docs for jack, sdl and qtdemux. + +2007-01-12 10:22:16 +0000 Wim Taymans + + gst/qtdemux/: Cleanup and refactor to make the code more readable. + Original commit message from CVS: + * gst/qtdemux/Makefile.am: + * gst/qtdemux/qtdemux.c: (extract_initial_length_and_fourcc), + (gst_qtdemux_loop_state_header), (gst_qtdemux_combine_flows), + (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), + (gst_qtdemux_chain), (qtdemux_sink_activate_pull), + (qtdemux_inflate), (qtdemux_parse_moov), (qtdemux_parse_container), + (qtdemux_parse_node), (qtdemux_tree_get_child_by_type), + (qtdemux_tree_get_sibling_by_type), (gst_qtdemux_add_stream), + (qtdemux_parse_samples), (qtdemux_parse_segments), + (qtdemux_parse_trak), (qtdemux_tag_add_str), (qtdemux_tag_add_num), + (qtdemux_tag_add_date), (qtdemux_tag_add_gnre), + (qtdemux_parse_udta), (qtdemux_redirects_sort_func), + (qtdemux_process_redirects), (qtdemux_parse_redirects), + (qtdemux_parse_tree), (gst_qtdemux_handle_esds), + (qtdemux_video_caps), (qtdemux_audio_caps): + * gst/qtdemux/qtdemux.h: + * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_mvhd), + (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), + (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), + (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), + (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), + (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), + (qtdemux_dump_unknown), (qtdemux_node_dump_foreach), + (qtdemux_node_dump): + * gst/qtdemux/qtdemux_dump.h: + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: (qtdemux_type_get): + * gst/qtdemux/qtdemux_types.h: + * gst/qtdemux/qtpalette.h: + Cleanup and refactor to make the code more readable. + Move debugging/tables into separate files. + Add 2/4/16 color palletee support. + Fix raw 15 bit RGB handling. + Use more FOURCC constants. + Add some docs. + +2007-01-11 19:51:04 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.c: Minor clean-up: use enum values instead of hardcoded constants (#395536). + Original commit message from CVS: + Patch by: Sebastian Dröge + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), + (gst_wavpack_enc_correction_mode_get_type), + (gst_wavpack_enc_joint_stereo_mode_get_type): + Minor clean-up: use enum values instead of hardcoded constants (#395536). + +2007-01-11 16:59:40 +0000 Tim-Philipp Müller + + gst/: Set correct caps on outgoing pulled buffers, or things blow up after recent core changes. + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_read_range): + * gst/id3demux/gstid3demux.c: (gst_id3demux_read_range): + Set correct caps on outgoing pulled buffers, or things blow up + after recent core changes. + +2007-01-11 11:05:04 +0000 Jonas Holmberg + + gst/multipart/multipartmux.c: Return FLOW errors ASAP. Fixes #394977. + Original commit message from CVS: + Based on patch by: Jonas Holmberg + * gst/multipart/multipartmux.c: (gst_multipart_mux_init), + (gst_multipart_mux_request_new_pad), + (gst_multipart_mux_queue_pads), (gst_multipart_mux_collected), + (gst_multipart_mux_change_state): + Return FLOW errors ASAP. Fixes #394977. + Misc cleanups. + +2007-01-11 09:30:59 +0000 Lutz Mueller + + gst/rtsp/gstrtspsrc.c: Check for stream pad before activating. + Original commit message from CVS: + Patch by: Lutz Mueller + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_activate_streams): + Check for stream pad before activating. + +2007-01-10 15:19:48 +0000 Peter Kjellerstedt + + gst/rtsp/: Allow url to be NULL to be able to use it for server connections. + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/rtsp/COPYING.MIT: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), + (gst_rtspsrc_stream_free), (gst_rtspsrc_cleanup), + (gst_rtspsrc_alloc_udp_ports), (pad_unblocked), (pad_blocked), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_send), + (gst_rtspsrc_parse_methods), + (gst_rtspsrc_create_transports_string), + (gst_rtspsrc_prepare_transports), (gst_rtspsrc_setup_streams), + (gst_rtspsrc_open), (gst_rtspsrc_close): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (rtsp_connection_connect), (rtsp_connection_send), (read_line), + (parse_request_line), (parse_line), (rtsp_connection_read), + (rtsp_connection_close): + * gst/rtsp/rtspdefs.c: (rtsp_init_status), (rtsp_strresult), + (rtsp_method_as_text), (rtsp_header_as_text), + (rtsp_status_as_text), (rtsp_find_header_field), + (rtsp_find_method): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_after_send), + (rtsp_ext_wms_configure_stream): + * gst/rtsp/rtspmessage.c: (rtsp_message_new), (rtsp_message_init), + (rtsp_message_new_request), (rtsp_message_init_request), + (rtsp_message_new_response), (rtsp_message_init_response), + (rtsp_message_init_data), (rtsp_message_unset), + (rtsp_message_free), (rtsp_message_add_header), + (rtsp_message_get_header), (rtsp_message_set_body), + (rtsp_message_get_body), (dump_mem), (rtsp_message_dump): + * gst/rtsp/rtspmessage.h: + * gst/rtsp/sdpmessage.c: (sdp_message_get_attribute_val_n), + (sdp_media_get_attribute_val_n), (read_string), (read_string_del), + (sdp_parse_line), (sdp_message_parse_buffer), (print_media), + (sdp_message_dump): + Allow url to be NULL to be able to use it for server connections. + Can now send responses as well as requests. + No longer hangs in an endless loop if EOF is received. + Can now convert a status code to a text string. + Return RTSP_HDR_INVALID for unknown headers. + Return RTSP_INVALID for unknown methods. + Copy CSeq and Session headers from the request. + Only free memory corresponding to the currently set message type. + Added const to function arguments as appropriate. + Avoid a compiler warning when initializing nmedia. + Use guint rather than gint to avoid compiler warnings. + Fix crasher in wms extension. + Factor out stream setup from open_connection. + Delay activation of streams when actual data is received from the + server, this prepares us to do proper protocol switching. + Added new license. + Fixes #380895. + +2007-01-10 09:47:43 +0000 Sebastian Dröge + + Some small docs fixes (#394851). + Original commit message from CVS: + Patch by: Sebastian Dröge + * docs/plugins/Makefile.am: + * gst/audiofx/audiopanorama.c: + Some small docs fixes (#394851). + +2007-01-09 12:25:26 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Fix docs. + Original commit message from CVS: + * gst/avi/gstavidemux.c: + Fix docs. + +2007-01-09 12:23:48 +0000 Wim Taymans + + gst/rtp/: Added RFC 2250 MPEG Video Depayloader. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_base_init), + (gst_rtp_mpv_depay_class_init), (gst_rtp_mpv_depay_init), + (gst_rtp_mpv_depay_setcaps), (gst_rtp_mpv_depay_process), + (gst_rtp_mpv_depay_set_property), (gst_rtp_mpv_depay_get_property), + (gst_rtp_mpv_depay_change_state), (gst_rtp_mpv_depay_plugin_init): + * gst/rtp/gstrtpmpvdepay.h: + Added RFC 2250 MPEG Video Depayloader. + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), + (gst_rtp_h263p_depay_process): + Fix Header file. Small cleanups. + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_class_init), + (gst_rtp_mp4g_depay_init), (gst_rtp_mp4g_depay_finalize), + (gst_rtp_mp4g_depay_process), (gst_rtp_mp4g_depay_change_state): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init), + (gst_rtp_mp4v_depay_init), (gst_rtp_mp4v_depay_finalize), + (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process), + (gst_rtp_mp4v_depay_change_state): + Remove usused code. Remove Adapter from state Change. Added debug. + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_base_init), + (gst_rtp_mpa_depay_class_init), (gst_rtp_mpa_depay_init), + (gst_rtp_mpa_depay_setcaps), (gst_rtp_mpa_depay_process): + * gst/rtp/gstrtpmpadepay.h: + Subclass base depayloader. + Added debug. + Support static payload type assignment as well. + * gst/rtp/gstrtpmpapay.c: + Fix caps. + +2007-01-08 12:45:10 +0000 Vincent Torri + + ext/jpeg/: These libjpeg callbacks should return a 'boolean' (unsigned char apparently) and not a 'gboolean' (which m... + Original commit message from CVS: + Patch by: Vincent Torri + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/smokecodec.c: + These libjpeg callbacks should return a 'boolean' (unsigned char + apparently) and not a 'gboolean' (which maps to gint). Fixes + warnings when compiling with MingW (#393427). + * gst/rtsp/rtspconnection.c: (rtsp_connection_read): + Use ioctlsocket on win32. + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Some printf format fixes for win32. + +2007-01-07 22:03:54 +0000 Andy Wingo + + New elements interleave and deinterleave, implement channel interleaving and deinterleaving. + Original commit message from CVS: + 2007-01-07 Andy Wingo + * configure.ac: + * gst/interleave/Makefile.am: + * gst/interleave/plugin.h: + * gst/interleave/plugin.c: + * gst/interleave/interleave.c: + * gst/interleave/deinterleave.c: New elements interleave and + deinterleave, implement channel interleaving and deinterleaving. + The interleaver can operate in pull or push mode but the + deinterleaver is more like a demuxer and can only operate in push + mode. + +2007-01-07 10:44:12 +0000 Sébastien Moutte + + gst/cutter/gstcutter.c: Use gst_guint64_to_gdouble for conversion. + Original commit message from CVS: + * gst/cutter/gstcutter.c: (gst_cutter_chain): + Use gst_guint64_to_gdouble for conversion. + * win32/vs6/libgstmatroska.dsp: + Add zlib to the link. + * win32/vs6/libgstvideobox.dsp: + Update liboil library name (project is linked to liboil-0.3-0.lib now). + +2007-01-05 18:32:03 +0000 Tim-Philipp Müller + + Check for zlib and if available pass it explicitly to the linker when linking qtdemux. If not available (or --disable... + Original commit message from CVS: + * configure.ac: + * gst/qtdemux/Makefile.am: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_moov): + Check for zlib and if available pass it explicitly to the linker + when linking qtdemux. If not available (or --disable-external has + been specified!), disable the bits in qtdemux that use it. Fixes + build on MingW (#392856). + +2007-01-05 17:23:04 +0000 Tim-Philipp Müller + + gst/matroska/Makefile.am: If zlib is available and used, we must link it explicitly for things to work on MingW (fixe... + Original commit message from CVS: + * gst/matroska/Makefile.am: + If zlib is available and used, we must link it explicitly for + things to work on MingW (fixes #392855). + +2007-01-05 16:07:12 +0000 Tim-Philipp Müller + + tests/icles/videocrop-test.c: Call g_thread_init() right at the beginning. Remove superfluous gst_init() - we've alre... + Original commit message from CVS: + * tests/icles/videocrop-test.c: (main): + Call g_thread_init() right at the beginning. Remove superfluous + gst_init() - we've already been inited via the GOption stuff. + +2007-01-04 11:02:29 +0000 Tim-Philipp Müller + + ext/esd/esdsink.c: Don't return bogus values when esd_get_delay() fails for some reason (#392189). + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_delay): + Don't return bogus values when esd_get_delay() fails for some + reason (#392189). + +2007-01-04 09:44:57 +0000 Vincent Torri + + Add directsoundsink to build and dist it, so it gets built when compiling with MingW on win32 and the required header... + Original commit message from CVS: + Patch by: Vincent Torri + * configure.ac: + * sys/Makefile.am: + * sys/directsound/Makefile.am: + * sys/directsound/gstdirectsoundsink.c: + (gst_directsoundsink_reset): + Add directsoundsink to build and dist it, so it gets built when + compiling with MingW on win32 and the required headers and libraries + are available (fixes: #392638). Also simplify DirectDraw check a bit. + * tests/check/elements/.cvsignore: + Fix CVS ignore for neonhttpsrc test binary. + +2007-01-03 19:54:33 +0000 Vincent Torri + + 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 + * 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). + +2007-01-03 16:41:10 +0000 Jens Granseuer + + Fix build with gcc-2.x (declare variables at the beginning of a block etc.). Fixes #391971. + Original commit message from CVS: + Patch by: Jens Granseuer + * ext/xvid/gstxvidenc.c: (gst_xvidenc_encode), + (gst_xvidenc_get_property): + * gst/filter/gstbpwsinc.c: (bpwsinc_transform_ip): + * gst/filter/gstfilter.c: (plugin_init): + * gst/filter/gstiir.c: (iir_transform_ip): + * gst/filter/gstlpwsinc.c: (lpwsinc_transform_ip): + * gst/modplug/gstmodplug.cc: + * gst/nuvdemux/gstnuvdemux.c: (gst_nuv_demux_header_load), + (gst_nuv_demux_stream_extend_header): + Fix build with gcc-2.x (declare variables at the beginning of a + block etc.). Fixes #391971. + +2006-12-30 12:44:01 +0000 Tim-Philipp Müller + + tests/check/elements/videocrop.c: When we can't create an element needed for the test, print a message detailing whic... + Original commit message from CVS: + * tests/check/elements/videocrop.c: (GST_START_TEST), + (videocrop_test_cropping_init_context): + When we can't create an element needed for the test, print a message + detailing which element it actually is that's missing (#390673). + +2006-12-24 11:36:31 +0000 Tim-Philipp Müller + + sys/ximage/gstximagesrc.c: Fix presumably copy'n'pasto for 16bpp depth. + Original commit message from CVS: + * sys/ximage/gstximagesrc.c: (composite_pixel): + Fix presumably copy'n'pasto for 16bpp depth. + +2006-12-24 11:24:59 +0000 Tim-Philipp Müller + + gst/matroska/matroska-mux.c: The "signed" field in audio caps is of boolean type, trying to use gst_structure_get_int... + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_audio_pad_setcaps): + The "signed" field in audio caps is of boolean type, trying to use + gst_structure_get_int() to extract it will fail. Fixing this makes + matroskamux accept raw audio input (#387121) (use at your own risk + though, due to the matroska spec being not entirely useful in this + respect). + Also fix up raw audio structures in template caps so that they + represent what our setcaps function will actually accept, so that + converters know what to convert to. + Finally, don't fail if there isn't an "endianness" field in 8-bit + PCM caps. + +2006-12-22 10:15:24 +0000 Stefan Kost + + tests/check/elements/: reapply consistent pad (de)activation + Original commit message from CVS: + * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc), + (cleanup_mpeg2enc): + * tests/check/elements/rganalysis.c: (cleanup_rganalysis): + * tests/check/elements/wavpackdec.c: (setup_wavpackdec), + (cleanup_wavpackdec): + * tests/check/elements/wavpackenc.c: (setup_wavpackenc), + (cleanup_wavpackenc): + * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): + reapply consistent pad (de)activation + +2006-12-22 10:15:23 +0000 Stefan Kost + + tests/check/elements/: reapply consistent pad (de)activation + Original commit message from CVS: + * tests/check/elements/audiopanorama.c: (cleanup_panorama): + * tests/check/elements/avimux.c: (setup_avimux), (cleanup_avimux): + * tests/check/elements/cmmldec.c: (setup_cmmldec), + (teardown_cmmldec): + * tests/check/elements/cmmlenc.c: (setup_cmmlenc), + (teardown_cmmlenc): + * tests/check/elements/level.c: (setup_level), (cleanup_level): + reapply consistent pad (de)activation + +2006-12-21 17:03:39 +0000 Jan Schmidt + + configure.ac: Back to CVS + Original commit message from CVS: + * configure.ac: + Back to CVS + * gst-plugins-good.doap: + Add 0.10.5 doap entry + +=== release 0.10.4 === + +2006-12-21 15:45:02 +0000 Jan Schmidt + + configure.ac: releasing 0.10.4, "Black Bugs" + Original commit message from CVS: + === release 0.10.4 === + 2006-12-21 Jan Schmidt + * configure.ac: + releasing 0.10.4, "Black Bugs" + +=== release 0.10.5 === + +2006-12-21 15:40:55 +0000 Jan Schmidt + + configure.ac: releasing 0.10.5, "The Path of Thorns" + Original commit message from CVS: + === release 0.10.5 === + 2006-12-21 Jan Schmidt + * configure.ac: + releasing 0.10.5, "The Path of Thorns" + +2006-12-21 14:03:42 +0000 Stefan Kost + + tests/check/elements/mpeg2enc.c: (setup_mpeg2enc) + Original commit message from CVS: + * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc) + (cleanup_mpeg2enc): + * tests/check/elements/rganalysis.c: (cleanup_rganalysis): + * tests/check/elements/wavpackdec.c: (setup_wavpackdec), + (cleanup_wavpackdec): + * tests/check/elements/wavpackenc.c: (setup_wavpackenc), + (cleanup_wavpackenc): + * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): + revert my freeze breakage + +2006-12-21 12:48:32 +0000 Stefan Kost + + tests/check/elements/: revert my freeze breakage + Original commit message from CVS: + * tests/check/elements/audiopanorama.c: (cleanup_panorama): + * tests/check/elements/avimux.c: (setup_avimux), (cleanup_avimux): + * tests/check/elements/cmmldec.c: (setup_cmmldec), + (teardown_cmmldec): + * tests/check/elements/cmmlenc.c: (setup_cmmlenc), + (teardown_cmmlenc): + * tests/check/elements/level.c: (setup_level), (cleanup_level): + revert my freeze breakage + +2006-12-21 08:20:10 +0000 Stefan Kost + + tests/check/elements/: consistent pad (de)activation + Original commit message from CVS: + * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc), + (cleanup_mpeg2enc): + * tests/check/elements/rganalysis.c: (cleanup_rganalysis): + * tests/check/elements/wavpackdec.c: (setup_wavpackdec), + (cleanup_wavpackdec): + * tests/check/elements/wavpackenc.c: (setup_wavpackenc), + (cleanup_wavpackenc): + * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): + consistent pad (de)activation + +2006-12-21 08:15:23 +0000 Stefan Kost + + tests/check/elements/: consistent pad (de)activation + Original commit message from CVS: + * tests/check/elements/audiopanorama.c: (cleanup_panorama): + * tests/check/elements/avimux.c: (setup_avimux), (cleanup_avimux): + * tests/check/elements/cmmldec.c: (setup_cmmldec), + (teardown_cmmldec): + * tests/check/elements/cmmlenc.c: (setup_cmmlenc), + (teardown_cmmlenc): + * tests/check/elements/level.c: (setup_level), (cleanup_level): + consistent pad (de)activation + +2006-12-18 17:11:49 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Don't post BUFFERING messages in streaming mode if the stream headers are behind the movie dat... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_post_progress), + (gst_qtdemux_chain): + Don't post BUFFERING messages in streaming mode if the stream + headers are behind the movie data; instead, post "progress" element + messages as a temporary solution. Apps might get confused and do + silly things to the pipeline state if they see buffering messages + from different sources and don't realize they come from different + sources (#387160). + +2006-12-18 16:46:17 +0000 Jan Schmidt + + Disable LADPSA, as it has moved to the -bad module for the duration. + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + Disable LADPSA, as it has moved to the -bad module for the duration. + +2006-12-18 15:51:54 +0000 Wim Taymans + + ext/ladspa/gstsignalprocessor.c: Reset flow_state back to _OK after a flush stop so that we exit our error state afte... + Original commit message from CVS: + * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setcaps), + (gst_signal_processor_event): + Reset flow_state back to _OK after a flush stop so that we exit our + error state after the flush. Fixes #374213 + +2006-12-18 15:49:08 +0000 Jan Schmidt + + ChangeLog surgery on one of Stefan's commits from August: + Original commit message from CVS: + ChangeLog surgery on one of Stefan's commits from August: + * ext/Makefile.am: + Quietly (accidentally) enable LADSPA for building by default, + despite the fact that it doesn't meet the plugin checklist. + -- Added by Jan Schmidt 18 Dec 2006 + +2006-12-18 13:40:34 +0000 Jan Schmidt + + gst/qtdemux/qtdemux.c: Don't output g_warning for an unsupported format, just send a + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain), + (gst_qtdemux_add_stream): + Don't output g_warning for an unsupported format, just send a + GST_ELEMENT_WARNING and don't add the pad. + Fix the case where it doesn't check for a NULL pad in streaming mode. + Fixes #387137 + +2006-12-18 12:27:32 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Fix crash dereferencing NULL pointer if there's no stco atom. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Fix crash dereferencing NULL pointer if there's no stco atom. + Fixes #387122. + +2006-12-18 10:02:56 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.h: Use local copy of md5.h, as it disappeared in recent wavpack installs. + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.h: + Use local copy of md5.h, as it disappeared in recent wavpack + installs. + Patch by: Sebastian Dröge + Fixes: #387076 + +2006-12-17 19:42:05 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2006-12-17 06:11:39 +0000 David Schleef + + sys/osxvideo/osxvideosink.*: Decent effort at porting to 0.10. Needs cleanup on OS/X. + Original commit message from CVS: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + Decent effort at porting to 0.10. Needs cleanup on OS/X. + +2006-12-17 05:07:07 +0000 Vijay Santhanam + + sys/osxvideo/: Preliminary patch for porting osxvideosink + Original commit message from CVS: + Patch by: Vijay Santhanam + * sys/osxvideo/Makefile.am: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + Preliminary patch for porting osxvideosink + +2006-12-16 16:21:26 +0000 Sjoerd Simons + + gst/videomixer/videomixer.c: Introduce some locking around the videomixer state so that it does not crash when adding... + Original commit message from CVS: + Patch by: Sjoerd Simons + * gst/videomixer/videomixer.c: (gst_videomixer_pad_set_property), + (gst_videomixer_set_master_geometry), + (gst_videomixer_pad_sink_setcaps), (gst_videomixer_collect_free), + (gst_videomixer_reset), (gst_videomixer_init), + (gst_videomixer_finalize), (gst_videomixer_request_new_pad), + (gst_videomixer_release_pad), (gst_videomixer_collected), + (gst_videomixer_change_state): + Introduce some locking around the videomixer state so that it does not + crash when adding/removing pads. Fixes #383043. + +2006-12-16 15:25:23 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: We don't support seeking in streaming mode, so don't even try. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_query_types), + (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event): + We don't support seeking in streaming mode, so don't even try. + Implement seeking query so apps can query seekability properly + (see #365414). Fix duration query. + +2006-12-16 11:42:56 +0000 Tim-Philipp Müller + + configure.ac: Make sure libcaca can actually be used instead of just checking for /usr/bin/caca-config, so we don't w... + Original commit message from CVS: + * configure.ac: + Make sure libcaca can actually be used instead of just checking for + /usr/bin/caca-config, so we don't wrongly try to build cacasink when + cross-compiling (fixes #384587). + +2006-12-15 10:54:28 +0000 Thomas Vander Stichele + + adding doap file + Original commit message from CVS: + * Makefile.am: + * gst-plugins-good.doap: + * gst-plugins-good.spec.in: + adding doap file + +2006-12-14 16:20:15 +0000 Tim-Philipp Müller + + configure.ac: libflac-1.1.3 changed API again, but we can't build against it yet, so make sure our check doesn't use ... + Original commit message from CVS: + * configure.ac: + libflac-1.1.3 changed API again, but we can't build against it yet, + so make sure our check doesn't use libflac-1.1.3 and add a comment + to this effect. + +2006-12-14 14:25:17 +0000 Tim-Philipp Müller + + gst/effectv/gstquark.c: Add some NULL pointer checks (possibly related to #385623). + Original commit message from CVS: + * gst/effectv/gstquark.c: (gst_quarktv_transform), + (gst_quarktv_planetable_clear): + Add some NULL pointer checks (possibly related to #385623). + +2006-12-13 17:12:22 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Add AMR-WB to the list of supported formats. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), + (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), + (qtdemux_audio_caps): + Add AMR-WB to the list of supported formats. + +2006-12-12 18:45:58 +0000 Tim-Philipp Müller + + gst/: In streaming mode, if the first buffer we get doesn't have an offset, fix it up to be 0, otherwise trimming won... + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain_parse_tag), + (gst_tag_demux_chain): + * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): + In streaming mode, if the first buffer we get doesn't have an + offset, fix it up to be 0, otherwise trimming won't work later on + and we'll be typefinding application/x-id3, which may result in + decodebin plugging an endless number of id3demux elements as a + consequence. Fixes #385031. + +2006-12-11 21:21:16 +0000 Jan Schmidt + + sys/sunaudio/gstsunaudiosink.c: Ignore the buffer_time the sound device reports. Turns out it is sometimes completely... + Original commit message from CVS: + * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_prepare): + Ignore the buffer_time the sound device reports. Turns out it is + sometimes completely bogus and we're better off without it. + +2006-12-11 17:33:26 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Fix non-working redirects from inetfilm.com (handle 'alis' reference data type as well). Fixes... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): + Fix non-working redirects from inetfilm.com (handle 'alis' reference + data type as well). Fixes #378613. + +2006-12-11 13:59:33 +0000 Tim-Philipp Müller + + gst/matroska/: Try harder to extract the framerate for video tracks correctly and save it directly instead of convert... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_video_caps): + * gst/matroska/matroska-ids.c: + (gst_matroska_track_init_video_context): + * gst/matroska/matroska-ids.h: + Try harder to extract the framerate for video tracks correctly and + save it directly instead of converting it back and forth a few + times. Mostly makes a difference for very small framerates (<1). + Fixes #380199. + +2006-12-11 11:41:18 +0000 Tim-Philipp Müller + + ext/gconf/gstgconfaudiosrc.*: Remove gconf notify hook when the gconfaudiosrc element is destroyed, otherwise the cal... + Original commit message from CVS: + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_init), + (gst_gconf_audio_src_dispose), (do_toggle_element): + * ext/gconf/gstgconfaudiosrc.h: + Remove gconf notify hook when the gconfaudiosrc element is + destroyed, otherwise the callback may be called on an + already-destroyed instance and bad things happen. Should fix + #378184. + Also ignore gconf key changes when the source is already running. + +2006-12-09 19:27:28 +0000 Sebastian Dröge + + gst/apetag/gstapedemux.c: We need to be able to read and parse any possible floating point string format ("1,234" or ... + Original commit message from CVS: + Patch by: Sebastian Dröge + * gst/apetag/gstapedemux.c: (ape_demux_parse_tags): + We need to be able to read and parse any possible floating point string + format ("1,234" or "1.234") irrespective of the current locale. g_strod() + will parse the former only in certain locales though, so we really need + to canonicalise the separator to '.' and then use g_ascii_strtod() to + make sure we can parse either version at all times. + Fixes #382982 for real. + +2006-12-09 16:17:33 +0000 Jan Schmidt + + sys/sunaudio/: Use the sunaudio debug category. + Original commit message from CVS: + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiosrc.c: + Use the sunaudio debug category. + * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_finalize), + (gst_sunaudiosink_class_init), (gst_sunaudiosink_init), + (gst_sunaudiosink_set_property), (gst_sunaudiosink_get_property), + (gst_sunaudiosink_open), (gst_sunaudiosink_close), + (gst_sunaudiosink_prepare), (gst_sunaudio_sink_do_delay), + (gst_sunaudiosink_write), (gst_sunaudiosink_delay), + (gst_sunaudiosink_reset): + * sys/sunaudio/gstsunaudiosink.h: + Uses the sunaudio debug category for all debug output + Implements the _delay() callback to synchronise video playback better + Change the segtotal and segsize values back to the parent class + defaults (taken from buffer_time and latency_times of 200ms and 10ms + respectively) + Measure the samples written to the device vs. played. + Keep track of segments in the device by writing empty eof frames, and + sleep using a GCond when we get too far ahead and risk overrunning the + sink's ringbuffer. + Fixes: #360673 + +2006-12-08 21:12:47 +0000 Jan Schmidt + + * ChangeLog: + Correct the attribution of the previous commit. The patch in question was written by Brian Cameron. + Original commit message from CVS: + Correct the attribution of the previous commit. The patch in + question was written by Brian Cameron. + +2006-12-08 17:06:43 +0000 René Stadler + + gst/qtdemux/qtdemux.c: Fix caps for 24 bit raw PCM audio (2). + Original commit message from CVS: + Patch by: René Stadler + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), + (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), + (qtdemux_audio_caps): + Fix caps for 24 bit raw PCM audio (2). + Fixes #383471. + +2006-12-08 16:38:18 +0000 Sebastian Dröge + + gst/audiofx/audiopanorama.*: Fix audiopanorame with float samples. Fixes #383726. + Original commit message from CVS: + Patch by: Sebastian Dröge + * gst/audiofx/audiopanorama.c: (gst_audio_panorama_init), + (gst_audio_panorama_set_caps), (gst_audio_panorama_transform): + * gst/audiofx/audiopanorama.h: + Fix audiopanorame with float samples. Fixes #383726. + +2006-12-08 15:12:01 +0000 Padraig O'Briain + + sys/sunaudio/: Implement reset functions to unblock the src/sink more quickly on state change requests. + Original commit message from CVS: + * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_reset): + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open), + (gst_sunaudiosrc_reset): + Implement reset functions to unblock the src/sink more quickly on + state change requests. + Patch by: Padraig O'Briain + +2006-12-08 14:42:42 +0000 Jerry Tan + + sys/sunaudio/gstsunaudiomixer.c: Construct the correct mixer device name when the AUDIODEV env var is set. + Original commit message from CVS: + * sys/sunaudio/gstsunaudiomixer.c: + (gst_sunaudiomixer_change_state): + Construct the correct mixer device name when the AUDIODEV env var + is set. + Patch by: Jerry Tan + Fixes: #383596 + +2006-12-08 14:32:51 +0000 Jerry Tan + + sys/sunaudio/gstsunaudiosrc.c: Apply patch to open the mixer control and set the MULTIPLE_OPEN ioctl. On solaris, the... + Original commit message from CVS: + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open): + Apply patch to open the mixer control and set the MULTIPLE_OPEN + ioctl. On solaris, the mixer device doesn't need opening non-blocking + - it can be opened by multiple processes by default, but needs the ioctl for multiple opens within 1 process. + Patch by: Jerry Tan + Fixes: #349015 + +2006-12-07 17:30:03 +0000 Wim Taymans + + gst/smpte/: Port to 0.10 some more. + Original commit message from CVS: + * gst/smpte/gstmask.h: + * gst/smpte/gstsmpte.c: (gst_smpte_class_init), + (gst_smpte_setcaps), (gst_smpte_init), (gst_smpte_reset), + (gst_smpte_collected), (gst_smpte_set_property), + (gst_smpte_get_property), (gst_smpte_change_state), (plugin_init): + * gst/smpte/gstsmpte.h: + Port to 0.10 some more. + Added duration property to specify the duration of the transition. + Make framerate a fraction. + Deprecate fps property, we only use negotiated fps. + Added docs. + Fix collectpad usage. + Reset state in READY. + Send NEWSEGMENT event. + Fix racy updates of object properties. + Added debug category. + Fixes #383323. + +2006-12-07 11:35:41 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Handle more H263 variants. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), + (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), + (qtdemux_video_caps): + Handle more H263 variants. + +2006-12-06 15:06:04 +0000 Sjoerd Simons + + gst/videomixer/videomixer.c: Don't reset xpos and ypos in the setcaps function because causes unexpected behaviour. + Original commit message from CVS: + Patch by: Sjoerd Simons + * gst/videomixer/videomixer.c: + (gst_videomixer_set_master_geometry), + (gst_videomixer_pad_sink_setcaps), (gst_videomixer_collect_free): + Don't reset xpos and ypos in the setcaps function because causes + unexpected behaviour. + Fixes #382179. + +2006-12-06 14:45:30 +0000 Wim Taymans + + gst/multipart/multipartmux.c: Keep track of the buffer timestamp in the collectdata member instead of modifying the b... + Original commit message from CVS: + * gst/multipart/multipartmux.c: (gst_multipart_mux_compare_pads), + (gst_multipart_mux_queue_pads), (gst_multipart_mux_collected): + Keep track of the buffer timestamp in the collectdata member instead + of modifying the buffer without making the metadata writable first. + Fixes #382277. + +2006-12-06 14:33:54 +0000 Rob Taylor + + gst/udp/gstudpsrc.c: If using multicast in udpsrc, bind to the multicast address rather than + Original commit message from CVS: + Patch by: Rob Taylor + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + If using multicast in udpsrc, bind to the multicast address rather than + IN_ADDR_ANY. + This allows the simultanous use of multiple udpsrcs listening on + different multicat addresses. Without this all udpsrcs will receive all + packets from all subscribed multicast addresses. + Fixes #383001. + +2006-12-06 13:35:52 +0000 Jonathan Matthew + + ext/taglib/gstid3v2mux.cc: Don't attempt to write a NULL frame into the ID3 tag set when the createFrame method retur... + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: + Don't attempt to write a NULL frame into the ID3 tag set when the + createFrame method returned NULL. + Fixes: #381857 + Patch by: Jonathan Matthew + +2006-12-06 13:16:59 +0000 Sebastian Dröge + + gst/apetag/gstapedemux.c: Use g_strtod() instead of sscanf to parse doubles, so that it will try parsing in the C loc... + Original commit message from CVS: + * gst/apetag/gstapedemux.c: (ape_demux_parse_tags): + Use g_strtod() instead of sscanf to parse doubles, so that it will + try parsing in the C locale if the current locale fails. + Fixes: #382982 + Patch by: Sebastian Dröge + +2006-12-01 10:31:46 +0000 Sergey Scobich + + win32/MANIFEST: Fix compilation on win32 under VS8 + Original commit message from CVS: + * win32/MANIFEST: + Fix compilation on win32 under VS8 + Patch by: Sergey Scobich + Partially fixes #381175 + +2006-11-30 16:48:51 +0000 Stefan Kost + + gst/avi/gstavimux.c: accept all mpegversions,fixes #380825 spotted by: Jerome Alet + Original commit message from CVS: + * gst/avi/gstavimux.c: + accept all mpegversions,fixes #380825 + spotted by: Jerome Alet + +2006-11-30 16:46:13 +0000 Stefan Kost + + sys/v4l2/v4l2src_calls.c: cleanup the error message a bit more + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), + (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init), (gst_v4l2src_buffer_finalize): + cleanup the error message a bit more + +2006-11-30 15:08:08 +0000 René Stadler + + gst/replaygain/gstrganalysis.c: Call the base class handler. Fixes #380610. + Original commit message from CVS: + Patch by: René Stadler + * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_event): + Call the base class handler. Fixes #380610. + +2006-11-28 12:30:10 +0000 Wim Taymans + + ext/libcaca/gstcacasink.c: Fix width and height properties. + Original commit message from CVS: + * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init): + Fix width and height properties. + * ext/libcaca/gstcacasink.h: + Fix compilation on newer libcaca that require us to include a new + header. Fixes #379918. + +2006-11-28 11:52:27 +0000 Wim Taymans + + gst/rtsp/: Add method so that extensions can choose to disable the setup of a stream. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspext.h: + * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_configure_stream), + (rtsp_ext_wms_get_context): + Add method so that extensions can choose to disable the setup of + a stream. + Make the WMS extension skip setup of x-wms-rtx streams. Fixes #377792. + +2006-11-27 17:16:26 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Remove some asserts and replace them with a proper error message. Fixes #379261. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), + (gst_qtdemux_handle_src_query), (qtdemux_parse_trak): + Remove some asserts and replace them with a proper error + message. Fixes #379261. + +2006-11-27 16:30:49 +0000 Wim Taymans + + * ChangeLog: + mention bug fix + Original commit message from CVS: + mention bug fix + +2006-11-27 16:29:07 +0000 Jonas Holmberg + + gst/multipart/multipartmux.c: Push header in a separate buffer instead of memcpy:ing all data + Original commit message from CVS: + Patch by: Jonas Holmberg + * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): + Push header in a separate buffer instead of memcpy:ing all data + Change LF => CRLF in headers + Move trailing LF to header + +2006-11-27 16:26:50 +0000 Wim Taymans + + gst/rtp/gstrtpmpadepay.c: Small buffer overflow fix and improve debugging. + Original commit message from CVS: + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_chain): + Small buffer overflow fix and improve debugging. + +2006-11-24 08:58:53 +0000 Stefan Kost + + ext/esd/: remove obsolete _factory_init protos + Original commit message from CVS: + * ext/esd/esdmon.h: + * ext/esd/esdsink.h: + remove obsolete _factory_init protos + +2006-11-24 07:46:54 +0000 Stefan Kost + + gst/avi/gstavidemux.c: remove dead code, tweak debugs statements, add comments, use _uint64_scale instead _uint64_sca... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_index_entry_for_time), + (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), + (gst_avi_demux_peek_chunk), (gst_avi_demux_parse_subindex), + (gst_avi_demux_read_subindexes_push), + (gst_avi_demux_read_subindexes_pull), (gst_avi_demux_parse_stream), + (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), + (gst_avi_demux_sync), (gst_avi_demux_next_data_buffer), + (gst_avi_demux_massage_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_stream_header_pull), (gst_avi_demux_do_seek), + (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data), (gst_avi_demux_loop): + remove dead code, tweak debugs statements, add comments, use + _uint64_scale instead _uint64_scale_int when using guint64 values, + small optimizations, reflow some error handling + +2006-11-22 17:39:13 +0000 Edward Hervey + + po/.cvsignore: We never put .pot files in cvs. Let's ignore them all. + Original commit message from CVS: + * po/.cvsignore: + We never put .pot files in cvs. Let's ignore them all. + +2006-11-21 12:57:50 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + enalbe LADSPA plugin in spec file + Original commit message from CVS: + enalbe LADSPA plugin in spec file + +2006-11-19 18:46:03 +0000 Tim-Philipp Müller + + po/POTFILES.in: ... but better exclude files that aren't disted. + Original commit message from CVS: + * po/POTFILES.in: + ... but better exclude files that aren't disted. + +2006-11-19 16:32:49 +0000 Tim-Philipp Müller + + po/POTFILES.in: Add v4l2 source files to list of files with translations, so the strings are actually extracted (howe... + Original commit message from CVS: + * po/POTFILES.in: + Add v4l2 source files to list of files with translations, so the + strings are actually extracted (however bad they still may be). + +2006-11-19 16:30:19 +0000 Tim-Philipp Müller + + gst/videobox/gstvideobox.c: Minor clean-ups: const-ify static array, remove trailing comma from use GST_DEBUG_FUNCPTR. + Original commit message from CVS: + * gst/videobox/gstvideobox.c: (gst_video_box_class_init): + Minor clean-ups: const-ify static array, remove trailing comma from + last enum (gcc-2.9x trips over that), use GST_DEBUG_FUNCPTR. + +2006-11-19 13:41:53 +0000 René Stadler + + gst/id3demux/id3v2frames.c: Make sure that g_free always gets called on the same pointer that was returned by g_mallo... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame): + Make sure that g_free always gets called on the same pointer that was + returned by g_malloc. Fixes #376594. + Do not leak memory if decompressed size is wrong. + Remove unneeded check of return value of g_malloc. + Patch by: René Stadler + +2006-11-18 18:14:34 +0000 Tim-Philipp Müller + + sys/v4l2/v4l2src_calls.c: Add missing curly brackets. + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_deinit): + Add missing curly brackets. + +2006-11-17 14:54:01 +0000 Edgard Lima + + * ChangeLog: + * sys/v4l2/v4l2src_calls.c: + Fix capture_deinit. + Original commit message from CVS: + Fix capture_deinit. + +2006-11-16 15:36:48 +0000 Tim-Philipp Müller + + gst/matroska/matroska-mux.c: Use GST_DEBUG_FUNCPTR; activate request pad before returning it. + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init), + (gst_matroska_mux_request_new_pad): + Use GST_DEBUG_FUNCPTR; activate request pad before returning it. + * tests/check/elements/matroskamux.c: (setup_src_pad), + (setup_sink_pad), (GST_START_TEST): + Activate pads before using them. + +2006-11-16 15:04:55 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Initialise variable to get rid of bogus compiler warning. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_scan): + Initialise variable to get rid of bogus compiler warning. + +2006-11-16 07:26:17 +0000 Ville Syrjala + + gst/rtp/: Specify H.263 variant and version in the caps (fixes #361637) + Original commit message from CVS: + Patch by: Ville Syrjala + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + Specify H.263 variant and version in the caps (fixes #361637) + +2006-11-15 17:44:01 +0000 Wim Taymans + + gst/rtsp/rtspconnection.c: Don't set a data pointer to NULL and a size > 0 when we deal with empty packets. + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: (read_body): + Don't set a data pointer to NULL and a size > 0 when we deal + with empty packets. + * gst/rtsp/rtspmessage.c: (rtsp_message_new_response), + (rtsp_message_init_response), (rtsp_message_init_data), + (rtsp_message_unset), (rtsp_message_free), + (rtsp_message_take_body): + Check that we can't create invalid empty packets. + +2006-11-15 12:35:46 +0000 Sebastian Dröge + + ext/wavpack/: Some small clean-ups: use enums instead of hard-coded numbers, const-ify element details, re-factor som... + Original commit message from CVS: + Patch by: Sebastian Dröge + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), + (gst_wavpack_dec_init), (gst_wavpack_dec_change_state): + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init), + (gst_wavpack_enc_class_init), (gst_wavpack_enc_reset), + (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config), + (gst_wavpack_enc_change_state): + * ext/wavpack/gstwavpackparse.c: + Some small clean-ups: use enums instead of hard-coded numbers, + const-ify element details, re-factor some code into _reset() + functions (#352605). + +2006-11-15 12:08:20 +0000 Mark Nauwelaerts + + gst/matroska/matroska-mux.*: Add basic tag writing support; implement releasing pads (#374658). + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/matroska/matroska-mux.c: (gst_matroska_mux_add_interfaces), + (gst_matroska_mux_class_init), (gst_matroska_pad_free), + (gst_matroska_mux_reset), (gst_matroska_mux_handle_sink_event), + (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad), + (gst_matroska_mux_track_header), (gst_matroska_mux_start), + (gst_matroska_mux_write_simple_tag), (gst_matroska_mux_finish): + * gst/matroska/matroska-mux.h: + Add basic tag writing support; implement releasing pads (#374658). + +2006-11-15 11:19:13 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: Handle opaque/unspecified A_AAC audio codec ID (fixes #374737). + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_audio_caps): + Handle opaque/unspecified A_AAC audio codec ID (fixes #374737). + +2006-11-15 00:12:19 +0000 David Schleef + + gst/matroska/matroska-mux.c: Add Dirac fourcc. + Original commit message from CVS: + * gst/matroska/matroska-mux.c: Add Dirac fourcc. + +2006-11-14 20:07:22 +0000 Sergey Scobich + + win32/vs8/: Make end-of-line returns unixy, so that when the files are checked out on win32 the line returns will be ... + Original commit message from CVS: + Patch by: Sergey Scobich + * win32/vs8/gst-plugins-good.sln: + * win32/vs8/libgst1394.vcproj: + * win32/vs8/libgstaasink.vcproj: + * win32/vs8/libgstalaw.vcproj: + * win32/vs8/libgstalpha.vcproj: + * win32/vs8/libgstalphacolor.vcproj: + * win32/vs8/libgstannodex.vcproj: + * win32/vs8/libgstapetag.vcproj: + * win32/vs8/libgstaudiofx.vcproj: + * win32/vs8/libgstauparse.vcproj: + * win32/vs8/libgstautodetect.vcproj: + * win32/vs8/libgstavi.vcproj: + * win32/vs8/libgstcacasink.vcproj: + * win32/vs8/libgstcdio.vcproj: + * win32/vs8/libgstcutter.vcproj: + * win32/vs8/libgstdv.vcproj: + * win32/vs8/libgsteffectv.vcproj: + * win32/vs8/libgstflac.vcproj: + * win32/vs8/libgstflxdec.vcproj: + * win32/vs8/libgstgoom.vcproj: + * win32/vs8/libgsticydemux.vcproj: + * win32/vs8/libgstid3demux.vcproj: + * win32/vs8/libgstjpeg.vcproj: + * win32/vs8/libgstladspa.vcproj: + * win32/vs8/libgstlevel.vcproj: + * win32/vs8/libgstmatroska.vcproj: + * win32/vs8/libgstmikmod.vcproj: + * win32/vs8/libgstmng.vcproj: + * win32/vs8/libgstmonoscope.vcproj: + * win32/vs8/libgstmulaw.vcproj: + * win32/vs8/libgstmultipart.vcproj: + * win32/vs8/libgstpng.vcproj: + * win32/vs8/libgstrtp.vcproj: + * win32/vs8/libgstrtsp.vcproj: + * win32/vs8/libgstshout2.vcproj: + * win32/vs8/libgstsmpte.vcproj: + * win32/vs8/libgstspeex.vcproj: + * win32/vs8/libgsttaglib.vcproj: + * win32/vs8/libgstudp.vcproj: + * win32/vs8/libgstvideobalance.vcproj: + * win32/vs8/libgstvideobox.vcproj: + * win32/vs8/libgstvideoflip.vcproj: + * win32/vs8/libgstvideomixer.vcproj: + * win32/vs8/libgstwavenc.vcproj: + * win32/vs8/libgstwavparse.vcproj: + Make end-of-line returns unixy, so that when the files are checked + out on win32 the line returns will be 0d 0a and not 0d 0d 0a. + Hopefully fixes #366492. + +2006-11-14 15:55:32 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Disable init_frames delay timestamp adjustment, it does not seem to be needed at all. Fixes #3... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + Disable init_frames delay timestamp adjustment, it does not + seem to be needed at all. Fixes #369621. + +2006-11-14 11:43:40 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Don't parse extra sample params for raw pcm. Fixes #374914. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), + (gst_qtdemux_handle_src_query), (qtdemux_parse_trak): + Don't parse extra sample params for raw pcm. Fixes #374914. + +2006-11-13 18:31:18 +0000 Mark Nauwelaerts + + gst/videomixer/videomixer.c: Fix memleak by unref'ing collectpads instance (when finalizing) + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/videomixer/videomixer.c: + (gst_videomixer_set_master_geometry), + (gst_videomixer_pad_sink_setcaps), (gst_videomixer_class_init), + (gst_videomixer_collect_free), (gst_videomixer_reset), + (gst_videomixer_init), (gst_videomixer_finalize), + (gst_videomixer_request_new_pad), (gst_videomixer_release_pad), + (gst_videomixer_collected), (gst_videomixer_change_state): + Fix memleak by unref'ing collectpads instance (when finalizing) + Implement releasing a request pad. Fixes #374479. + +2006-11-10 20:08:42 +0000 Sergey Scobich + + win32/vs8/: Add VS8 project files (note that many of the plugins in ext are disabled by default). Fixes #366492. + Original commit message from CVS: + Patch by: Sergey Scobich + * win32/vs8/gst-plugins-good.sln: + * win32/vs8/libgst1394.vcproj: + * win32/vs8/libgstaasink.vcproj: + * win32/vs8/libgstalaw.vcproj: + * win32/vs8/libgstalpha.vcproj: + * win32/vs8/libgstalphacolor.vcproj: + * win32/vs8/libgstannodex.vcproj: + * win32/vs8/libgstapetag.vcproj: + * win32/vs8/libgstaudiofx.vcproj: + * win32/vs8/libgstauparse.vcproj: + * win32/vs8/libgstautodetect.vcproj: + * win32/vs8/libgstavi.vcproj: + * win32/vs8/libgstcacasink.vcproj: + * win32/vs8/libgstcdio.vcproj: + * win32/vs8/libgstcutter.vcproj: + * win32/vs8/libgstdv.vcproj: + * win32/vs8/libgsteffectv.vcproj: + * win32/vs8/libgstflac.vcproj: + * win32/vs8/libgstflxdec.vcproj: + * win32/vs8/libgstgoom.vcproj: + * win32/vs8/libgsticydemux.vcproj: + * win32/vs8/libgstid3demux.vcproj: + * win32/vs8/libgstjpeg.vcproj: + * win32/vs8/libgstladspa.vcproj: + * win32/vs8/libgstlevel.vcproj: + * win32/vs8/libgstmatroska.vcproj: + * win32/vs8/libgstmikmod.vcproj: + * win32/vs8/libgstmng.vcproj: + * win32/vs8/libgstmonoscope.vcproj: + * win32/vs8/libgstmulaw.vcproj: + * win32/vs8/libgstmultipart.vcproj: + * win32/vs8/libgstpng.vcproj: + * win32/vs8/libgstrtp.vcproj: + * win32/vs8/libgstrtsp.vcproj: + * win32/vs8/libgstshout2.vcproj: + * win32/vs8/libgstsmpte.vcproj: + * win32/vs8/libgstspeex.vcproj: + * win32/vs8/libgsttaglib.vcproj: + * win32/vs8/libgstudp.vcproj: + * win32/vs8/libgstvideobalance.vcproj: + * win32/vs8/libgstvideobox.vcproj: + * win32/vs8/libgstvideoflip.vcproj: + * win32/vs8/libgstvideomixer.vcproj: + * win32/vs8/libgstwavenc.vcproj: + * win32/vs8/libgstwavparse.vcproj: + Add VS8 project files (note that many of the plugins in ext are + disabled by default). Fixes #366492. + +2006-11-10 19:18:33 +0000 David Schleef + + gst/multifile/Makefile.am: Let's not depend on a file that doesn't exist. + Original commit message from CVS: + * gst/multifile/Makefile.am: + Let's not depend on a file that doesn't exist. + +2006-11-10 18:51:10 +0000 David Schleef + + Revive multifile[src|sink]. + Original commit message from CVS: + * configure.ac: + * gst/multifile/Makefile.am: + * gst/multifile/gstmultifile.c: + * gst/multifile/gstmultifilesink.c: + * gst/multifile/gstmultifilesrc.c: + * gst/multifile/multifile.vproj: + Revive multifile[src|sink]. + +2006-11-10 08:09:05 +0000 Stefan Kost + + sys/v4l2/v4l2src_calls.c: we do not translate debug messages + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_grab_frame): + we do not translate debug messages + +2006-11-08 12:04:03 +0000 Stefan Kost + + gst/flx/gstflxdec.c: fix categorisation, make short desc more explicit, remove unused code + Original commit message from CVS: + * gst/flx/gstflxdec.c: (gst_flxdec_class_init): + fix categorisation, make short desc more explicit, remove unused code + Fixes #372021 + +2006-11-08 01:30:39 +0000 Christian Schaller + + gst/rtp/: Fix element descriptions. + Original commit message from CVS: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + Fix element descriptions. + +2006-11-08 01:29:51 +0000 Christian Schaller + + gst/rtp/: Fix description. + Original commit message from CVS: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_handle_buffer): + Fix description. + Small cleanup in the payloader. + +2006-11-08 01:28:00 +0000 Christian Schaller + + gst/rtp/: Add theora pay/depayloaders. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_base_init), + (gst_rtp_theora_depay_class_init), (gst_rtp_theora_depay_init), + (gst_rtp_theora_depay_finalize), + (gst_rtp_theora_depay_parse_configuration), + (gst_rtp_theora_depay_setcaps), + (gst_rtp_theora_depay_switch_codebook), + (gst_rtp_theora_depay_process), + (gst_rtp_theora_depay_set_property), + (gst_rtp_theora_depay_get_property), + (gst_rtp_theora_depay_change_state), + (gst_rtp_theora_depay_plugin_init): + * gst/rtp/gstrtptheoradepay.h: + * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_base_init), + (gst_rtp_theora_pay_class_init), (gst_rtp_theora_pay_init), + (gst_rtp_theora_pay_setcaps), (gst_rtp_theora_pay_reset_packet), + (gst_rtp_theora_pay_init_packet), + (gst_rtp_theora_pay_flush_packet), + (gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id), + (gst_rtp_theora_pay_handle_buffer), + (gst_rtp_theora_pay_plugin_init): + * gst/rtp/gstrtptheorapay.h: + Add theora pay/depayloaders. + +2006-11-07 01:43:06 +0000 Christian Schaller + + gst/rtp/Makefile.am: We depend on gsttag to generate the vorbis comments. + Original commit message from CVS: + * gst/rtp/Makefile.am: + We depend on gsttag to generate the vorbis comments. + * gst/rtp/gstrtpvorbisdepay.c: + (gst_rtp_vorbis_depay_parse_configuration), + (gst_rtp_vorbis_depay_setcaps), + (gst_rtp_vorbis_depay_switch_codebook), + (gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbisdepay.h: + Parse configuration string in the depayloader. + Implement selecting and switching to a new codebook. + Receiving vorbis over RTP now works. + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_reset_packet), + (gst_rtp_vorbis_pay_init_packet), + (gst_rtp_vorbis_pay_finish_headers), + (gst_rtp_vorbis_pay_handle_buffer): + * gst/rtp/gstrtpvorbispay.h: + Set timestamps on outgoing buffers and RTP packets. + Fix configuration string, prepend number of Packet headers. + Fix encoding of ident string. + Add delivery-method to caps. + Streaming vorbis over RTP now works. + +2006-11-06 20:52:10 +0000 Christian Schaller + + gst/rtp/gstrtpvorbispay.*: Generate a valid configuration string in the caps based on the vorbis headers. + Original commit message from CVS: + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_setcaps), + (gst_rtp_vorbis_pay_finish_headers), (gst_rtp_vorbis_pay_parse_id), + (gst_rtp_vorbis_pay_handle_buffer): + * gst/rtp/gstrtpvorbispay.h: + Generate a valid configuration string in the caps based on the + vorbis headers. + +2006-11-02 20:13:26 +0000 Sebastian Dröge + + Fix enum nicks; only emit no-more-pads once; add support for very fast encoding mode in upcoming 4.40.0 release (#369... + Original commit message from CVS: + Patch by: Sebastian Dröge + * configure.ac: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), + (gst_wavpack_enc_correction_mode_get_type), + (gst_wavpack_enc_joint_stereo_mode_get_type), + (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config): + Fix enum nicks; only emit no-more-pads once; add support for very + fast encoding mode in upcoming 4.40.0 release (#369539). + +2006-11-02 14:43:11 +0000 Tim-Philipp Müller + + ext/cdio/: Move CD-TEXT utility function into common file so it can also be used by a future cdioparanoiasrc. + Original commit message from CVS: + * ext/cdio/gstcdio.c: (gst_cdio_get_cdtext): + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): + Move CD-TEXT utility function into common file so it can also be + used by a future cdioparanoiasrc. + +2006-11-01 19:48:26 +0000 Edgard Lima + + * ChangeLog: + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + Improved comments in ELEMENT_ERROR/WARNING and added "#if 0" to xoverlay code that is still not implemented. + Original commit message from CVS: + Improved comments in ELEMENT_ERROR/WARNING and added "#if 0" to xoverlay code that is still not implemented. + +2006-11-01 13:59:49 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: We require a -base more recent than 0.10.9, so it's safe to use + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (parse_picture_frame): + We require a -base more recent than 0.10.9, so it's safe to use + GST_TYPE_TAG_IMAGE_TYPE unconditionally now. + * ext/dv/gstdvdec.c: (gst_dvdec_sink_event): + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_sink_event): + Use _newsegment_full() now that we depend on a recent enough core. + * gst/wavparse/gstwavparse.c: + Remove cruft that we don't need any longer now that we depend on + a recent enough -base. + +2006-11-01 10:19:18 +0000 Sergey Scobich + + 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 + * 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-10-31 10:52:31 +0000 Wim Taymans + + gst/rtp/: Fix and activate ILBC pay and depayloaders. Fixes #368162. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_init), + (gst_rtpilbcpay_setcaps): + Fix and activate ILBC pay and depayloaders. Fixes #368162. + +2006-10-31 10:31:18 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Handle unbounded length streams a bit better. Fixes #367696. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), + (gst_qtdemux_handle_src_query), (qtdemux_parse_tree), + (qtdemux_parse_trak): + Handle unbounded length streams a bit better. Fixes #367696. + +2006-10-31 09:44:39 +0000 Wim Taymans + + ext/speex/gstspeexdec.c: Some small cleanups, use _scale. + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_convert), + (speex_dec_sink_event), (speex_dec_chain_parse_header): + Some small cleanups, use _scale. + +2006-10-31 09:29:36 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Use higher precision scale function. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): + Use higher precision scale function. + +2006-10-30 16:18:18 +0000 Michal Benes + + gst/matroska/matroska-demux.c: Fix several issues with encoded/compressed/encrypted/signed tracks; also, remove super... + Original commit message from CVS: + Patch by: Michal Benes + * gst/matroska/matroska-demux.c: (gst_matroska_demux_encoding_cmp), + (gst_matroska_demux_read_track_encodings), + (gst_matroska_decode_buffer): + Fix several issues with encoded/compressed/encrypted/signed tracks; + also, remove superfluous newline characters from some debug + statements. (#366155) + +2006-10-30 09:24:53 +0000 Wim Taymans + + ext/jpeg/: Various cleanups, capsnego and leak fixes. + Original commit message from CVS: + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_getcaps): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_class_init), + (gst_smokedec_init), (gst_smokedec_finalize), (gst_smokedec_chain), + (gst_smokedec_change_state): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), + (gst_smokeenc_init), (gst_smokeenc_finalize), + (gst_smokeenc_getcaps), (gst_smokeenc_setcaps), + (gst_smokeenc_resync), (gst_smokeenc_chain), + (gst_smokeenc_set_property), (gst_smokeenc_get_property), + (gst_smokeenc_change_state): + Various cleanups, capsnego and leak fixes. + +2006-10-30 08:17:08 +0000 Mark Nauwelaerts + + gst/videomixer/videomixer.c: Fix videomixer so that it can handle any combination of framerates. + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/videomixer/videomixer.c: (gst_videomixer_update_queues): + Fix videomixer so that it can handle any combination of framerates. + Fixes #367221. + +2006-10-28 16:37:20 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Fix position query for audio. also fixes timestamps in streaming mode and bug #364958. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_parse_file_header), + (gst_avi_demux_stream_init_push), (gst_avi_demux_parse_stream), + (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_data), + (gst_avi_demux_chain): + Fix position query for audio. also fixes timestamps in streaming + mode and bug #364958. + Small cleanups. + +2006-10-27 17:10:42 +0000 Wim Taymans + + ext/libpng/gstpngenc.*: Fix strides. Fixes #364856. + Original commit message from CVS: + * ext/libpng/gstpngenc.c: (gst_pngenc_setcaps), (gst_pngenc_chain): + * ext/libpng/gstpngenc.h: + Fix strides. Fixes #364856. + Cleanup capsnego. + Set caps on outgoing buffers. + +2006-10-18 17:06:21 +0000 Ville Syrjala + + gst/rtp/: Add static payload numbers in addition to the dynamic ones. + Original commit message from CVS: + Patch by: Ville Syrjala + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_flush), + (gst_rtp_pcma_pay_handle_buffer): + * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_flush): + Add static payload numbers in addition to the dynamic ones. + Fixes #361639. + +2006-10-18 16:18:55 +0000 Wim Taymans + + gst/rtsp/: Reuse already existing enum for lower transport. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_lower_trans_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_open), + (gst_rtspsrc_uri_get_protocols), (gst_rtspsrc_uri_set_uri): + * gst/rtsp/rtspconnection.c: (rtsp_connection_create): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + * gst/rtsp/rtspurl.h: + Reuse already existing enum for lower transport. + Add rtspt and rtspu protocols. + Send redirect to rtspt when udp times out. + +2006-10-18 14:00:44 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Fix seeking some more, mostly for speed changes. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), + (gst_wavparse_stream_data): + Fix seeking some more, mostly for speed changes. + +2006-10-18 11:28:05 +0000 Tim-Philipp Müller + + * ChangeLog: + ChangeLog surgery: fix Fredrik's e-mail address + Original commit message from CVS: + ChangeLog surgery: fix Fredrik's e-mail address + +2006-10-18 11:04:09 +0000 Fredrik Persson + + sys/v4l2/gstv4l2tuner.*: Fix _set_channel(): remove useless g_object_notify() for "channel" property that doesn't exi... + Original commit message from CVS: + Patch by: Fredrik Persson + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/gstv4l2tuner.h: + Fix _set_channel(): remove useless g_object_notify() for "channel" + property that doesn't exist any longer and therefore now also + useless redirect (#338818). + +2006-10-17 15:16:47 +0000 Tim-Philipp Müller + + Activate pads before adding them to running element. + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_set_wp_config): + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_create_src_pad): + * gst/nuvdemux/gstnuvdemux.c: (gst_nuv_demux_create_pads): + * tests/check/elements/wavpackparse.c: (wavpackparse_found_pad): + Activate pads before adding them to running element. + +2006-10-17 14:57:17 +0000 Josep Torra Valles + + gst/qtdemux/qtdemux.c: Make compile with Forte compiler, mostly don't do pointer arithmetic with void pointers (#3626... + Original commit message from CVS: + Patch by: Josep Torra Valles + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (next_entry_size), (qtdemux_inflate), (qtdemux_parse_moov), + (qtdemux_parse_tree), (qtdemux_parse_trak), (qtdemux_tag_add_str), + (qtdemux_tag_add_num), (qtdemux_tag_add_date), + (qtdemux_tag_add_gnre): + Make compile with Forte compiler, mostly don't do pointer arithmetic + with void pointers (#362626). + +2006-10-17 14:37:49 +0000 Wim Taymans + + sys/oss/gstosssink.c: Some drivers do not support unsetting the non-blocking flag once the device is opened. In those... + Original commit message from CVS: + * sys/oss/gstosssink.c: (gst_oss_sink_prepare): + Some drivers do not support unsetting the non-blocking flag once the + device is opened. In those cases, close/open the device in + non-blocking mode. Fixes #362673. + +2006-10-17 13:44:14 +0000 Stefan Kost + + sys/v4l2/: dear stefan, framespersecond is not frameperiod, reverting but adding comment + Original commit message from CVS: + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_fps), + (gst_v4l2src_get_fps): + dear stefan, framespersecond is not frameperiod, reverting but adding + comment + +2006-10-17 11:28:50 +0000 Stefan Kost + + sys/v4l2/: Numerator is numerator and denominator is denominator. Say that aloud 5 times and retry after next beer. + Original commit message from CVS: + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_fps), + (gst_v4l2src_get_fps): + Numerator is numerator and denominator is denominator. Say that aloud + 5 times and retry after next beer. + +2006-10-17 10:59:55 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.*: Avoid void pointer usage, better use guint8 * instead. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_moov), (qtdemux_parse), + (qtdemux_node_dump_foreach), (qtdemux_dump_mvhd), + (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), + (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), + (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), + (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), + (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), + (qtdemux_dump_unknown), (qtdemux_tree_get_child_by_type), + (qtdemux_tree_get_sibling_by_type): + * gst/qtdemux/qtdemux.h: + Avoid void pointer usage, better use guint8 * instead. + +2006-10-16 18:22:47 +0000 Josep Torra Valles + + Fix a bunch of problems discovered by the Forte compiler, mostly type mixups and pointer arithmetics with void pointe... + Original commit message from CVS: + Patch by: Josep Torra Valles + * ext/cairo/gsttimeoverlay.c: (gst_cairo_time_overlay_transform): + * ext/esd/esdsink.c: (gst_esdsink_write): + * ext/flac/gstflacdec.c: (gst_flac_dec_length), + (gst_flac_dec_read_seekable), (gst_flac_dec_chain), + (gst_flac_dec_send_newsegment): + * ext/flac/gstflacenc.c: (gst_flac_enc_seek_callback), + (gst_flac_enc_tell_callback): + * ext/jpeg/smokecodec.c: (find_best_size), (smokecodec_encode), + (smokecodec_parse_header), (smokecodec_decode): + * gst/avi/gstavimux.c: (gst_avi_mux_write_avix_index): + * gst/debug/efence.c: (gst_fenced_buffer_alloc): + * gst/goom/Makefile.am: + * gst/goom/gstgoom.c: + * gst/icydemux/gsticydemux.c: (gst_icydemux_typefind_or_forward): + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/rtspconnection.c: (rtsp_connection_read): + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/wavparse/gstwavparse.c: (gst_wavparse_change_state): + * sys/sunaudio/gstsunaudiomixertrack.h: + Fix a bunch of problems discovered by the Forte compiler, mostly type + mixups and pointer arithmetics with void pointers. Fixes #362603. + +2006-10-12 19:02:51 +0000 Tim-Philipp Müller + + ext/speex/: Miscellaneous clean-ups, among other things: speexenc => enc to enhance code readability; change speexenc... + Original commit message from CVS: + * ext/speex/gstspeex.c: (plugin_init): + * ext/speex/gstspeexenc.c: (gst_speex_enc_get_formats), + (gst_speex_enc_setup_interfaces), (gst_speex_enc_base_init), + (gst_speex_enc_class_init), (gst_speex_enc_finalize), + (gst_speex_enc_sink_setcaps), (gst_speex_enc_convert_src), + (gst_speex_enc_convert_sink), (gst_speex_enc_get_query_types), + (gst_speex_enc_src_query), (gst_speex_enc_sink_query), + (gst_speex_enc_init), (gst_speex_enc_create_metadata_buffer), + (gst_speex_enc_set_last_msg), (gst_speex_enc_setup), + (gst_speex_enc_buffer_from_data), (gst_speex_enc_push_buffer), + (gst_speex_enc_set_header_on_caps), (gst_speex_enc_sinkevent), + (gst_speex_enc_chain), (gst_speex_enc_get_property), + (gst_speex_enc_set_property), (gst_speex_enc_change_state): + * ext/speex/gstspeexenc.h: + Miscellaneous clean-ups, among other things: speexenc => enc to + enhance code readability; change speexenc => speex_enc; in chain + function unref input buffer in case of error; take reference in + event function; use boilerplate macro; use gst_pad_query_peer_* + convenience functions. + +2006-10-12 18:35:10 +0000 Tim-Philipp Müller + + ext/speex/gstspeexenc.c: Fix some mem leaks. + Original commit message from CVS: + * ext/speex/gstspeexenc.c: (gst_speexenc_finalize), + (gst_speexenc_set_last_msg), (gst_speexenc_setup), + (gst_speexenc_set_header_on_caps): + Fix some mem leaks. + +2006-10-11 16:21:53 +0000 Wim Taymans + + gst/rtsp/URLS: Added some other URL. + Original commit message from CVS: + * gst/rtsp/URLS: + Added some other URL. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_udp), + (gst_rtspsrc_handle_request), (gst_rtspsrc_send), + (gst_rtspsrc_open), (gst_rtspsrc_play), + (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Work on fallback to TCP connection when the UDP socket times out. + Handler server requests, just reply with OK for now. + * gst/rtsp/rtspdefs.c: (rtsp_strresult): + * gst/rtsp/rtspdefs.h: + Added some more Real extension headers. + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + Fix parsing of urls with a ':' that is not part of the hostname:port + part of the url. + +2006-10-11 13:49:26 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Add some fourcc for DV format. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add some fourcc for DV format. + +2006-10-11 13:24:42 +0000 Tim-Philipp Müller + + gst/: Activate pad before adding it to the already-running element. + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_add_srcpad): + * gst/icydemux/gsticydemux.c: (gst_icydemux_add_srcpad): + * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad): + Activate pad before adding it to the already-running element. + * tests/check/elements/icydemux.c: (icydemux_found_pad): + Activate newly-created pad too. + +2006-10-11 08:34:14 +0000 Sebastien Cote + + gst/udp/gstudpsrc.c: Fix some leaks in caps and uris. Fixes #361252. + Original commit message from CVS: + Patch by: Sebastien Cote + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_finalize), (gst_udpsrc_create), (gst_udpsrc_set_uri), + (gst_udpsrc_start): + Fix some leaks in caps and uris. Fixes #361252. + +2006-10-10 18:54:05 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Printf format fixes. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (extract_initial_length_and_fourcc), + (gst_qtdemux_loop_state_header): + Printf format fixes. + * sys/dvb/gstdvbsrc.c: + Use "_stdint.h". + +2006-10-10 09:57:19 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Reorganise some stuff. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), + (gst_qtdemux_push_event), (gst_qtdemux_do_seek), + (gst_qtdemux_change_state), (extract_initial_length_and_fourcc), + (gst_qtdemux_loop_state_header), (gst_qtdemux_activate_segment), + (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), + (gst_qtdemux_post_buffering), (gst_qtdemux_chain), + (gst_qtdemux_add_stream), (qtdemux_process_redirects), + (qtdemux_parse_tree), (qtdemux_parse_trak): + Reorganise some stuff. + Parse RTSP redirection URLS. + +2006-10-10 08:29:07 +0000 Tim-Philipp Müller + + gst/wavparse/Makefile.am: Fix copy'n'paste-o (spotted by Mark Nauwelaerts, #341489). + Original commit message from CVS: + * gst/wavparse/Makefile.am: + Fix copy'n'paste-o (spotted by Mark Nauwelaerts, #341489). + +2006-10-09 07:01:19 +0000 Jan Schmidt + + sys/v4l2/gstv4l2xoverlay.*: Fix build as per the patch in #338818 comment 36. + Original commit message from CVS: + * sys/v4l2/gstv4l2xoverlay.c: + * sys/v4l2/gstv4l2xoverlay.h: + Fix build as per the patch in #338818 comment 36. + +2006-10-08 20:05:13 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + inspect updates + Original commit message from CVS: + inspect updates + +2006-10-07 21:15:40 +0000 Tim-Philipp Müller + + gst/rtsp/gstrtspsrc.c: Activate pads before adding them to the source. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport): + Activate pads before adding them to the source. + +2006-10-07 11:37:59 +0000 Tim-Philipp Müller + + docs/plugins/: Add/update docs stuff. + Original commit message from CVS: + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + * docs/plugins/gst-plugins-bad-plugins.prerequisites: + * docs/plugins/inspect/plugin-dtsdec.xml: + * docs/plugins/inspect/plugin-mms.xml: + * docs/plugins/inspect/plugin-mpeg2enc.xml: + * docs/plugins/inspect/plugin-neon.xml: + * docs/plugins/inspect/plugin-replaygain.xml: + * docs/plugins/inspect/plugin-soundtouch.xml: + * docs/plugins/inspect/plugin-spcdec.xml: + * docs/plugins/inspect/plugin-swfdec.xml: + * docs/plugins/inspect/plugin-videocrop.xml: + * docs/plugins/inspect/plugin-wavpack.xml: + Add/update docs stuff. + +2006-10-06 17:00:14 +0000 Wim Taymans + + Activate pads before adding. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_add_pads), (gst_dvdemux_chain): + * gst/auparse/gstauparse.c: (gst_au_parse_add_srcpad): + Activate pads before adding. + +2006-10-06 16:03:23 +0000 Wim Taymans + + gst/multipart/multipartdemux.c: Activate pads before adding. + Original commit message from CVS: + * gst/multipart/multipartdemux.c: (gst_multipart_demux_init), + (gst_multipart_find_pad_by_mime): + Activate pads before adding. + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init): + BOILERPLATE sets parent_class for us. + +2006-10-06 15:56:01 +0000 René Stadler + + Add ReplayGain analysis element (#357069). + Original commit message from CVS: + Patch by: René Stadler + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * gst/replaygain/Makefile.am: + * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_base_init), + (gst_rg_analysis_class_init), (gst_rg_analysis_init), + (gst_rg_analysis_set_property), (gst_rg_analysis_get_property), + (gst_rg_analysis_start), (gst_rg_analysis_set_caps), + (gst_rg_analysis_transform_ip), (gst_rg_analysis_event), + (gst_rg_analysis_stop), (gst_rg_analysis_handle_tags), + (gst_rg_analysis_handle_eos), (gst_rg_analysis_track_result), + (gst_rg_analysis_album_result), (plugin_init): + * gst/replaygain/gstrganalysis.h: + * gst/replaygain/rganalysis.c: (yule_filter), (butter_filter), + (apply_filters), (reset_filters), (accumulator_add), + (accumulator_clear), (accumulator_result), (rg_analysis_new), + (rg_analysis_set_sample_rate), (rg_analysis_destroy), + (rg_analysis_analyze_mono_float), + (rg_analysis_analyze_stereo_float), + (rg_analysis_analyze_mono_int16), + (rg_analysis_analyze_stereo_int16), (rg_analysis_analyze), + (rg_analysis_track_result), (rg_analysis_album_result), + (rg_analysis_reset_album), (rg_analysis_reset): + * gst/replaygain/rganalysis.h: + Add ReplayGain analysis element (#357069). + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/rganalysis.c: (get_expected_gain), + (setup_rganalysis), (cleanup_rganalysis), (set_playing_state), + (send_eos_event), (send_tag_event), (poll_eos), (poll_tags), + (fail_unless_track_gain), (fail_unless_track_peak), + (fail_unless_album_gain), (fail_unless_album_peak), + (fail_if_track_tags), (fail_if_album_tags), + (fail_unless_num_tracks), (test_buffer_const_float_mono), + (test_buffer_const_float_stereo), (test_buffer_const_int16_mono), + (test_buffer_const_int16_stereo), (test_buffer_square_float_mono), + (test_buffer_square_float_stereo), (test_buffer_square_int16_mono), + (test_buffer_square_int16_stereo), (push_buffer), (GST_START_TEST), + (rganalysis_suite), (main): + Unit tests for the new replaygain element. + +2006-10-06 15:49:39 +0000 Wim Taymans + + ext/faad/gstfaad.c: Some cleanups. + Original commit message from CVS: + * ext/faad/gstfaad.c: (gst_faad_setcaps), (gst_faad_chain), + (gst_faad_close_decoder): + Some cleanups. + Added some more debugging. + Don't ever ignore unlinked, we're not a demuxer. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream): + Activate pad before adding it to the element. + +2006-10-06 12:55:53 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Rework how the transport string is constructed, try to share channels and udp ports. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_init), + (gst_rtspsrc_create_stream), (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_alloc_udp_ports), + (gst_rtspsrc_stream_configure_transport), (find_stream_by_channel), + (gst_rtspsrc_push_event), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_create_transports_string), + (gst_rtspsrc_configure_transports), (gst_rtspsrc_open), + (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Rework how the transport string is constructed, try to share channels + and udp ports. + Make most of the stuff less dependant on RTP as we are also going to use + it for RDT. + Add support for transport specific session managers. + * gst/rtsp/rtspconnection.c: (rtsp_connection_flush): + Implement _flush(). + * gst/rtsp/rtspdefs.c: (rtsp_strresult): + * gst/rtsp/rtspdefs.h: + Add generic error return code. + * gst/rtsp/rtspext.h: + Add support for pluggable tranport strings. + * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_before_send), + (rtsp_ext_wms_after_send), (rtsp_ext_wms_parse_sdp), + (rtsp_ext_wms_get_context): + Detect WMServer and activate the extension. + * gst/rtsp/rtsptransport.c: (rtsp_transport_get_mime), + (rtsp_transport_get_manager), (rtsp_transport_parse): + * gst/rtsp/rtsptransport.h: + Added methods to get mime/manager for certain transports. + +2006-10-06 11:31:11 +0000 Tim-Philipp Müller + + gst/spectrum/gstspectrum.c: Fix mem leak, avoid unnecessary memcpy. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_transform_ip): + Fix mem leak, avoid unnecessary memcpy. + +2006-10-06 02:29:35 +0000 Stefan Kost + + gst/spectrum/gstspectrum.c: Removed cruft code that was just commented out. Removed some obsolete debug logs statements. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_init), + (gst_spectrum_transform_ip): + Removed cruft code that was just commented out. Removed some obsolete + debug logs statements. + +2006-10-05 18:14:46 +0000 Tim-Philipp Müller + + Another batch of printf format fixes. + Original commit message from CVS: + * ext/dts/gstdtsdec.c: (gst_dtsdec_chain): + * ext/musicbrainz/gsttrm.c: (gst_trm_setcaps): + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_sink_set_caps): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain), (qtdemux_parse), + (qtdemux_parse_trak): + * gst/spectrum/gstspectrum.c: (gst_spectrum_transform_ip): + Another batch of printf format fixes. + +2006-10-05 16:37:33 +0000 Tim-Philipp Müller + + Printf format fixes. + Original commit message from CVS: + * ext/cairo/gsttimeoverlay.c: + (gst_cairo_time_overlay_update_font_height): + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_transform_caps): + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_parse_image_data): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_chain): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): + * ext/libpng/gstpngdec.c: (user_endrow_callback): + * gst/auparse/gstauparse.c: (gst_au_parse_parse_header): + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_superindex), + (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), + (gst_avi_demux_stream_data): + * gst/cutter/gstcutter.c: (gst_cutter_chain): + * gst/debug/efence.c: (gst_efence_buffer_alloc), + (gst_fenced_buffer_copy): + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), + (gst_rtspsrc_handle_message): + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + * sys/ximage/ximageutil.c: (ximageutil_xcontext_get): + Printf format fixes. + +2006-10-04 22:37:07 +0000 Tim-Philipp Müller + + gst/videocrop/gstvideocrop.*: Handle packed YUV formats (UYVY, YUY2, YUYV) separately; also, fix passthrough mode; la... + Original commit message from CVS: + * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init), + (gst_video_crop_init), + (gst_video_crop_get_image_details_from_caps), + (gst_video_crop_transform_packed_complex), + (gst_video_crop_transform_packed_simple), + (gst_video_crop_transform), (gst_video_crop_transform_caps), + (gst_video_crop_set_caps), + (gst_videocrop_clear_negotiated_caps_locked), + (gst_video_crop_set_property): + * gst/videocrop/gstvideocrop.h: + Handle packed YUV formats (UYVY, YUY2, YUYV) separately; also, fix + passthrough mode; lastly, clear negotiated basetransform caps when + the cropping changes in order to force renegotiation. + +2006-10-04 20:05:07 +0000 Tim-Philipp Müller + + tests/icles/: Visual test for videocrop, shows that packed yuv doesn't work right yet. --with-ffmpegcolorspace option... + Original commit message from CVS: + * tests/icles/.cvsignore: + * tests/icles/Makefile.am: + * tests/icles/videocrop-test.c: (quit_mainloop), (tick_cb), + (test_with_caps), (video_crop_get_test_caps), (main): + Visual test for videocrop, shows that packed yuv doesn't work right + yet. --with-ffmpegcolorspace option doesn't work yet for unknown + reasons (another basetransform issue?) + +2006-10-04 17:53:12 +0000 Wim Taymans + + gst/rtsp/Makefile.am: Dist new .h file too. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + Dist new .h file too. + +2006-10-04 17:24:40 +0000 Wim Taymans + + gst/rtsp/: Factor out extension in separate module. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/gstrtpdec.c: (gst_rtpdec_getcaps), + (gst_rtpdec_chain_rtp), (gst_rtpdec_chain_rtcp): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), + (gst_rtspsrc_finalize), (gst_rtspsrc_create_stream), + (gst_rtspsrc_parse_rtpmap), + (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_send), + (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), + (gst_rtspsrc_play), (gst_rtspsrc_handle_message): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspdefs.c: (rtsp_strresult): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspext.h: + * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_parse_sdp), + (rtsp_ext_wms_get_context): + * gst/rtsp/rtspextwms.h: + * gst/rtsp/rtsptransport.c: (rtsp_transport_init), (parse_mode), + (rtsp_transport_parse): + * gst/rtsp/rtsptransport.h: + Factor out extension in separate module. + Fix getcaps to filter against the padtemplate. + Use Content-Base if the server gives one. + Rework the transport parsing a bit for future extensions. + Added some Real Header field definitions. + +2006-10-04 10:29:11 +0000 Thomas Vander Stichele + + docs/plugins/: added v4l2 stubs + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + added v4l2 stubs + * gst-plugins-good.spec.in: + add v4l2 + +2006-10-04 10:24:49 +0000 Tim-Philipp Müller + + gst/apetag/gstapedemux.c: Extract disc/album/medium number and count and try harder to extract track number/count. + Original commit message from CVS: + * gst/apetag/gstapedemux.c: (ape_demux_parse_tags): + Extract disc/album/medium number and count and try harder + to extract track number/count. + +2006-10-03 18:36:29 +0000 Thomas Vander Stichele + + * tests/icles/.gitignore: + moap ignore + Original commit message from CVS: + moap ignore + +2006-10-03 18:35:34 +0000 Thomas Vander Stichele + + * tests/icles/Makefile.am: + add icle for v4l2 + Original commit message from CVS: + add icle for v4l2 + +2006-10-03 18:15:58 +0000 Thomas Vander Stichele + + add build stuff for v4l2, needs --enable-experimental until the last bits are resolved + Original commit message from CVS: + * configure.ac: + * sys/Makefile.am: + add build stuff for v4l2, needs --enable-experimental until + the last bits are resolved + +2006-10-03 13:47:10 +0000 Thomas Vander Stichele + + * sys/v4l2/gstv4l2object.c: + comment out the notifies for removed properties + Original commit message from CVS: + comment out the notifies for removed properties + +2006-10-03 13:30:48 +0000 Thomas Vander Stichele + + sys/v4l2/gstv4l2object.c: comment out the properties that are already part of the tuner interface. + Original commit message from CVS: + * sys/v4l2/gstv4l2object.c: + (gst_v4l2_object_install_properties_helper): + comment out the properties that are already part of the tuner + interface. + +2006-10-03 13:18:59 +0000 Zaheer Abbas Merali + + sys/v4l2/gstv4l2src.c: Improve docs. + Original commit message from CVS: + 2006-10-03 Zaheer Abbas Merali + * sys/v4l2/gstv4l2src.c: + Improve docs. + +2006-10-02 16:14:06 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + stop removing gdkpixbuf plugin from package + Original commit message from CVS: + stop removing gdkpixbuf plugin from package + +2006-09-29 15:39:41 +0000 Tim-Philipp Müller + + tests/check/Makefile.am: Disable autodetect test temporarily, so that the build bots update -bad and the ranks of unr... + Original commit message from CVS: + * tests/check/Makefile.am: + Disable autodetect test temporarily, so that the build bots + update -bad and the ranks of unreliable video sinks in there. + * tests/check/elements/autodetect.c: (GST_START_TEST): + Skip test if no usable videosink is found. + +2006-09-29 15:37:29 +0000 Wim Taymans + + gst/rtsp/URLS: Add some more URLs. + Original commit message from CVS: + * gst/rtsp/URLS: + Add some more URLs. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), + (gst_rtspsrc_init), (gst_rtspsrc_finalize), + (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), + (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_loop_send_cmd), + (gst_rtspsrc_loop), (gst_rtspsrc_send), + (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), + (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Add timeout property to control UDP timeouts. + Fix error messages. + Also start a loop function when operating in UDP mode so that we can + do some more stuff async. + Handle element messages from udpsrc to detect timeouts. If a timeout + happens we currently generate an error. + API: rtspsrc::timeout property. + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_create): + Really implement the timeout in microseconds and not milliseconds. + +2006-09-29 11:09:40 +0000 Wim Taymans + + gst/udp/gstudpsrc.*: Added property to post a message on timeout. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_unlock), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Added property to post a message on timeout. + Updated docs. + When restarting the select, initialize the fdsets again. + Init control sockets so we don't accidentally close a random socket. + API: GstUDPSrc::timeout property + +2006-09-29 08:15:05 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Fix flag registration. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type): + Fix flag registration. + * gst/rtsp/rtspconnection.c: (rtsp_connection_read): + Reading 0 also means 'no more commands' + +2006-09-29 08:09:24 +0000 Antoine Tremblay + + gst/udp/gstudpsrc.c: Fix possible infinite loop when shutting down, a read can also return 0 to indicate no more mess... + Original commit message from CVS: + Patch by: Antoine Tremblay + * gst/udp/gstudpsrc.c: (gst_udpsrc_create): + Fix possible infinite loop when shutting down, a read can also return + 0 to indicate no more messages are available. Fixes #358156. + +2006-09-28 17:08:47 +0000 Wim Taymans + + sys/v4l2/: Framerate can be 0/1 too. + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_all_caps), + (gst_v4l2src_get_caps): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + Framerate can be 0/1 too. + Init framerate to 0/1 before querying it so that we can detect + devices that don't know about a framerate. + Add some more debugging info. + +2006-09-28 14:31:41 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Add support for 'yv12' fourcc. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add support for 'yv12' fourcc. + +2006-09-27 17:47:57 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * tests/icles/v4l2src-test.c: + Removed set-undef-fps. + Original commit message from CVS: + Removed set-undef-fps. + +2006-09-27 17:04:22 +0000 Wim Taymans + + sys/v4l2/: Renamed some properties to match the tuner interface naming. + Original commit message from CVS: + * sys/v4l2/gstv4l2object.c: + (gst_v4l2_object_install_properties_helper), (gst_v4l2_object_new), + (gst_v4l2_object_set_property_helper), + (gst_v4l2_object_get_property_helper), (gst_v4l2_set_defaults): + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), + (gst_v4l2src_create): + * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_contains_channel), + (gst_v4l2_tuner_list_channels), + (gst_v4l2_tuner_set_channel_and_notify), + (gst_v4l2_tuner_get_channel), (gst_v4l2_tuner_contains_norm), + (gst_v4l2_tuner_list_norms), (gst_v4l2_tuner_set_norm_and_notify), + (gst_v4l2_tuner_get_norm): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_empty_lists): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_get_fps): + Renamed some properties to match the tuner interface naming. + +2006-09-27 16:14:18 +0000 Wim Taymans + + Small cleanups. + Original commit message from CVS: + * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_set_property_helper), + (gst_v4l2_set_defaults): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), + (gst_v4l2src_create): + * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_set_norm), + (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), + (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), + (gst_v4l2_set_attribute), (gst_v4l2_get_input), + (gst_v4l2_set_input): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_grab_frame), (gst_v4l2src_get_capture), + (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), + (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop), + (gst_v4l2src_buffer_new): + * tests/icles/v4l2src-test.c: (my_bus_callback), (main): + Small cleanups. + Fix error messages. + Use locks when getting timestamps. + Fix leaks in test. + Add licensing header to tests. + +2006-09-27 15:14:07 +0000 Edgard Lima + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + * tests/icles/v4l2src-test.c: + Some cleanups and comments. + Original commit message from CVS: + Some cleanups and comments. + +2006-09-27 13:41:35 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add audiofx plugin + Original commit message from CVS: + add audiofx plugin + +2006-09-26 14:17:54 +0000 Wim Taymans + + docs/plugins/: Add v4l2 plugin to the docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + Add v4l2 plugin to the docs. + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), + (gst_v4l2src_get_mmap), (gst_v4l2src_create): + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2vidorient.c: + Fix docs. + Remove some more externs. + +2006-09-26 13:18:06 +0000 Wim Taymans + + sys/v4l2/Makefile.am: Fix makefile, list libs in stack order. + Original commit message from CVS: + * sys/v4l2/Makefile.am: + Fix makefile, list libs in stack order. + * sys/v4l2/gstv4l2colorbalance.c: + * sys/v4l2/gstv4l2colorbalance.h: + * sys/v4l2/gstv4l2object.c: (gst_v4l2_device_get_type), + (gst_v4l2_object_install_properties_helper): + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), + (gst_v4l2src_get_mmap), (gst_v4l2src_create): + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/gstv4l2vidorient.h: + * sys/v4l2/gstv4l2xoverlay.h: + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.h: + Fix coding style: + - Remove extern from functions. + - Fix header indentation. + Fix Flags, add defaults for properties. + Remove unused enums. + Fix TOO_LAZY in error messages. + +2006-09-26 11:06:17 +0000 Wim Taymans + + sys/v4l2/: Fix pass at code cleanups, move errors cases out of the normal flow for additional code clarity. + Original commit message from CVS: + * sys/v4l2/gstv4l2object.c: (gst_v4l2_class_probe_devices), + (gst_v4l2_probe_needs_probe), + (gst_v4l2_object_install_properties_helper), (gst_v4l2_object_new), + (gst_v4l2_object_destroy), (gst_v4l2_object_set_property_helper), + (gst_v4l2_object_get_property_helper), (gst_v4l2_set_defaults), + (gst_v4l2_object_start), (gst_v4l2_object_stop): + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), + (gst_v4l2src_init), (gst_v4l2src_dispose), + (gst_v4l2src_set_property), (gst_v4l2src_get_property), + (gst_v4l2src_fixate), (gst_v4l2src_get_caps), + (gst_v4l2src_set_caps), (gst_v4l2src_get_read), + (gst_v4l2src_get_mmap), (gst_v4l2src_create): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_open), (gst_v4l2_close), (gst_v4l2_get_norm), + (gst_v4l2_set_norm), (gst_v4l2_get_frequency), + (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), + (gst_v4l2_get_attribute), (gst_v4l2_set_attribute), + (gst_v4l2_get_input), (gst_v4l2_set_input): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), + (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), + (gst_v4l2src_capture_stop), (gst_v4l2src_capture_deinit), + (gst_v4l2src_get_size_limits), (gst_v4l2src_set_fps), + (gst_v4l2src_get_fps), (gst_v4l2src_buffer_finalize), + (gst_v4l2src_buffer_new): + Fix pass at code cleanups, move errors cases out of the normal + flow for additional code clarity. + +2006-09-25 13:55:44 +0000 Wim Taymans + + gst/autodetect/: Small cleanups. don't try to set "sync" property when it is not available. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init), (gst_auto_audio_sink_class_init), + (gst_auto_audio_sink_find_best): + * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_detect): + Small cleanups. + don't try to set "sync" property when it is not available. + +2006-09-25 11:47:42 +0000 Peter Kjellerstedt + + gst/: Include stdlib.h in some more places, makes things compile with uClibc and -Werror (#357592). + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * gst/alpha/gstalpha.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtsp/gstrtspsrc.c: + * gst/udp/gstudpsrc.c: + * gst/videomixer/videomixer.c: + Include stdlib.h in some more places, makes things compile + with uClibc and -Werror (#357592). + +2006-09-25 09:15:10 +0000 Tim-Philipp Müller + + ext/jpeg/gstjpegdec.c: our code should handle that fine. Some of the buttons on the apple trailer site are apparently... + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: + Set minimum height to 8 (from 16), our code should handle + that fine. Some of the buttons on the apple trailer site + are apparently only 15 pixels high (see #357470). + +2006-09-23 15:31:56 +0000 Wim Taymans + + gst/rtsp/: Improve error reporting. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop), (gst_rtspsrc_send), + (gst_rtspsrc_open): + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (rtsp_connection_connect), (rtsp_connection_read), (read_body), + (rtsp_connection_receive): + * gst/rtsp/rtspdefs.c: (rtsp_strresult): + * gst/rtsp/rtspdefs.h: + Improve error reporting. + +2006-09-23 15:30:40 +0000 Wim Taymans + + gst/rtp/: Fix klass typos. + Original commit message from CVS: + * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_plugin_init): + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_plugin_init): + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_plugin_init): + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_plugin_init): + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_plugin_init): + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_plugin_init): + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_plugin_init): + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps), + (gst_rtp_mp2t_depay_plugin_init): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_plugin_init): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_plugin_init): + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_plugin_init): + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_plugin_init): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_plugin_init): + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_plugin_init): + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_plugin_init): + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_plugin_init): + Fix klass typos. + Mark RANK_MARGINAL, decodebin can handle the depayloaders fine. + +2006-09-22 17:53:48 +0000 Tim-Philipp Müller + + configure.ac: Need -base CVS for gst_base_rtp_depayload_push_ts(). + Original commit message from CVS: + * configure.ac: + Need -base CVS for gst_base_rtp_depayload_push_ts(). + +2006-09-22 17:22:34 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Don't check for a tag that is never there and check if we read the correct tag. Fixes seeking ... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index): + Don't check for a tag that is never there and check if we read the + correct tag. Fixes seeking again. + We must post an error when all pads are unlinked. + +2006-09-22 15:15:13 +0000 Wim Taymans + + gst/rtp/: More fixage, set endoder-params correctly in the payloader. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_setcaps), + (gst_rtp_vorbis_pay_reset_packet), + (gst_rtp_vorbis_pay_init_packet), + (gst_rtp_vorbis_pay_flush_packet), (gst_rtp_vorbis_pay_parse_id), + (gst_rtp_vorbis_pay_handle_buffer): + More fixage, set endoder-params correctly in the payloader. + +2006-09-22 12:12:10 +0000 Tim-Philipp Müller + + gst/autodetect/: Make static pad templates static to appease valgrind's leak detector. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_base_init): + Make static pad templates static to appease valgrind's leak + detector. + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/autodetect.c: (GST_START_TEST), + (autodetect_suite): + Add simple test for the ghostpad lockup on shutdown fixed in core + CVS (audio bit disabled because it would need dozens of alsa + suppressions and I'm too lazy to add those now). + +2006-09-22 12:08:14 +0000 Wim Taymans + + gst/rtp/: Small cleanups. + Original commit message from CVS: + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_change_state): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_class_init): + Small cleanups. + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_base_init), + (gst_rtp_vorbis_depay_class_init), (gst_rtp_vorbis_depay_init), + (gst_rtp_vorbis_depay_finalize), (gst_rtp_vorbis_depay_setcaps), + (gst_rtp_vorbis_depay_process), + (gst_rtp_vorbis_depay_set_property), + (gst_rtp_vorbis_depay_get_property), + (gst_rtp_vorbis_depay_change_state), + (gst_rtp_vorbis_depay_plugin_init): + * gst/rtp/gstrtpvorbisdepay.h: + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_base_init), + (gst_rtp_vorbis_pay_class_init), (gst_rtp_vorbis_pay_init), + (gst_rtp_vorbis_pay_setcaps), (gst_rtp_vorbis_pay_init_packet), + (gst_rtp_vorbis_pay_flush_packet), + (gst_rtp_vorbis_pay_append_buffer), + (gst_rtp_vorbis_pay_handle_buffer), + (gst_rtp_vorbis_pay_plugin_init): + * gst/rtp/gstrtpvorbispay.h: + Add experimental vorbis pay and depayloaders. + +2006-09-21 13:33:16 +0000 Wim Taymans + + gst/rtp/gstrtpmp4gpay.c: Fix profile-level-id parsing and setup. + Original commit message from CVS: + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_parse_audio_config): + Fix profile-level-id parsing and setup. + +2006-09-21 09:50:41 +0000 Wim Taymans + + gst/udp/: Update README, simple cleanup. + Original commit message from CVS: + * gst/udp/README: + * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): + Update README, simple cleanup. + +2006-09-21 09:35:13 +0000 Wim Taymans + + gst/rtp/README: Update README with some examples. + Original commit message from CVS: + * gst/rtp/README: + Update README with some examples. + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_init), + (gst_rtp_mp4g_pay_finalize), (gst_rtp_mp4g_pay_parse_audio_config), + (gst_rtp_mp4g_pay_parse_video_config), (gst_rtp_mp4g_pay_new_caps), + (gst_rtp_mp4g_pay_setcaps): + * gst/rtp/gstrtpmp4gpay.h: + Make optional RTP parameters of type STRING, as required by the + application/x-rtp caps specification. + +2006-09-20 19:37:45 +0000 Philippe Kalaf + + gst/rtp/: Correctly calculate size of each H263+ RTP buffer taking into account MTU and + Original commit message from CVS: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + Correctly calculate size of each H263+ RTP buffer taking into account MTU and + RTP header. + +2006-09-20 16:41:48 +0000 Wim Taymans + + gst/rtp/Makefile.am: And makefile too. + Original commit message from CVS: + * gst/rtp/Makefile.am: + And makefile too. + +2006-09-20 16:09:03 +0000 Wim Taymans + + gst/rtp/: Added preliminary ASF depayloader. + Original commit message from CVS: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpasfdepay.c: (gst_rtp_asf_depay_base_init), + (gst_rtp_asf_depay_class_init), (gst_rtp_asf_depay_init), + (decode_base64), (gst_rtp_asf_depay_setcaps), + (gst_rtp_asf_depay_process), (gst_rtp_asf_depay_set_property), + (gst_rtp_asf_depay_get_property), (gst_rtp_asf_depay_change_state), + (gst_rtp_asf_depay_plugin_init): + * gst/rtp/gstrtpasfdepay.h: + Added preliminary ASF depayloader. + * gst/rtp/gstrtph264depay.c: (decode_base64): + Fix base64 decoding. + +2006-09-20 16:06:27 +0000 Wim Taymans + + gst/rtsp/URLS: Added some test URLS. + Original commit message from CVS: + * gst/rtsp/URLS: + Added some test URLS. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open): + * gst/rtsp/gstrtspsrc.h: + When creating streams, give access to the complete SDP. + Fix some leaks. + Collect and merge global stream properties in stream caps. + Preliminary support for WMServer. + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (rtsp_connection_connect), (rtsp_connection_read), (read_body), + (rtsp_connection_receive): + * gst/rtsp/rtspconnection.h: + Make connection interruptable. + Refactor to make it reconnectable. + Don't fail on short reads when reading data packets. + * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_set_port), + (rtsp_url_get_port): + * gst/rtsp/rtspurl.h: + Add methods for getting/setting the port. + * gst/rtsp/sdpmessage.c: (sdp_message_get_attribute_val_n), + (sdp_message_get_attribute_val), (sdp_media_get_attribute), + (sdp_media_get_attribute_val_n), (sdp_media_get_attribute_val), + (sdp_media_get_format), (sdp_parse_line), + (sdp_message_parse_buffer): + Fix headers. + Add methods for getting multiple attributes with the same name. + Increase buffer size when parsing. + Fix parsing of a=foo fields. + * gst/rtsp/test.c: (main): + Update to new connection API. + * gst/rtsp/rtspmessage.c: (rtsp_message_new_response), + (rtsp_message_init_response), (rtsp_message_init_data), + (rtsp_message_unset), (rtsp_message_free), (rtsp_message_dump): + * gst/rtsp/rtspmessage.h: + * gst/rtsp/rtsptransport.c: (rtsp_transport_free): + * gst/rtsp/rtsptransport.h: + * gst/rtsp/sdp.h: + * gst/rtsp/sdpmessage.h: + * gst/rtsp/gstrtsp.c: + * gst/rtsp/gstrtsp.h: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtpdec.h: + * gst/rtsp/rtsp.h: + * gst/rtsp/rtspdefs.c: + * gst/rtsp/rtspdefs.h: + Dual licensed under MIT and LGPL now. + +2006-09-19 17:25:15 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Reorganize stream parsing and creation. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (find_stream_by_pt), + (gst_rtspsrc_create_stream), (gst_rtspsrc_free_stream), + (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream_by_channel), + (gst_rtspsrc_push_event), (gst_rtspsrc_loop), (gst_rtspsrc_send), + (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), + (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play): + * gst/rtsp/gstrtspsrc.h: + Reorganize stream parsing and creation. + Detect container formats in interleaved mode. + Keep more state about the streams. + Assume a server also supports PLAY if it does not say. + Add unicast and interleaved properties to TCP transport requests to make + some servers happy (WMServer). + * gst/rtsp/sdpmessage.h: + Add some defines for the standard Bandwidth types. + +2006-09-19 16:24:10 +0000 Edgard Lima + + * tests/icles/v4l2src-test.c: + Just a small fix to the app options. + Original commit message from CVS: + Just a small fix to the app options. + +2006-09-19 13:08:35 +0000 Edgard Lima + + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2vidorient.c: + * sys/v4l2/gstv4l2vidorient.h: + * tests/icles/v4l2src-test.c: + Add Video Orientation interface support to v4l2src. + Original commit message from CVS: + Add Video Orientation interface support to v4l2src. + +2006-09-19 10:53:56 +0000 Wim Taymans + + gst/rtsp/test.c: Fix build. + Original commit message from CVS: + * gst/rtsp/test.c: (main): + Fix build. + +2006-09-19 10:14:52 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Add ms-gsm to the src template. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Add ms-gsm to the src template. + +2006-09-18 17:37:46 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Small cleanups, added documentation. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_send), (gst_rtspsrc_parse_methods), + (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), + (gst_rtspsrc_pause), (gst_rtspsrc_change_state), + (gst_rtspsrc_uri_get_uri), (gst_rtspsrc_uri_set_uri): + * gst/rtsp/gstrtspsrc.h: + Small cleanups, added documentation. + Try to clean up the requests and responses. + Refactor parsing the supported methods. + * gst/rtsp/rtspconnection.c: (rtsp_connection_open), + (rtsp_connection_create), (rtsp_connection_send), + (parse_response_status), (parse_request_line), + (rtsp_connection_receive), (rtsp_connection_close), + (rtsp_connection_free): + * gst/rtsp/rtsptransport.c: (rtsp_transport_new), + (rtsp_transport_init), (rtsp_transport_parse), + (rtsp_transport_free): + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + * gst/rtsp/sdpmessage.c: (sdp_message_new), (sdp_message_init), + (sdp_message_clean), (sdp_message_free), (sdp_media_new), + (sdp_media_init), (sdp_message_parse_buffer), (sdp_message_dump): + Use g_return_val some more. + * gst/rtsp/rtspdefs.h: + Add more enum values to track initial states. + * gst/rtsp/rtspmessage.c: (rtsp_message_new_request), + (rtsp_message_init_request), (rtsp_message_new_response), + (rtsp_message_init_response), (rtsp_message_init_data), + (rtsp_message_unset), (rtsp_message_free), + (rtsp_message_add_header), (rtsp_message_remove_header), + (rtsp_message_get_header), (rtsp_message_set_body), + (rtsp_message_take_body), (rtsp_message_get_body), + (rtsp_message_steal_body), (rtsp_message_dump): + * gst/rtsp/rtspmessage.h: + Reorder arguments, object goes as the first one. + Use g_return_val some more. + +2006-09-18 15:36:14 +0000 Edgard Lima + + * sys/v4l2/v4l2src_calls.c: + Fix GST_BUFFER_DURATION. + Original commit message from CVS: + Fix GST_BUFFER_DURATION. + +2006-09-18 14:00:41 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.*: Export sometimes source pad with correct caps on the template, create the ghostpad from the te... + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_base_init), + (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_push_event), + (gst_rtspsrc_loop), (gst_rtspsrc_uri_set_uri): + * gst/rtsp/gstrtspsrc.h: + Export sometimes source pad with correct caps on the template, create + the ghostpad from the template. + Remove RTCP template as we never expose RTCP. + Protect against invalid body size. + Avoid memcpy when creating the output buffer. + Properly post an error and send EOS when the loop function is shut down. + +2006-09-18 11:29:12 +0000 Lutz Mueller + + gst/rtsp/gstrtspsrc.*: Make sure we can never set an invalid location. + Original commit message from CVS: + Based on patch by: Lutz Mueller + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), + (gst_rtspsrc_init), (gst_rtspsrc_set_property), (gst_rtspsrc_open), + (gst_rtspsrc_uri_get_uri), (gst_rtspsrc_uri_set_uri): + * gst/rtsp/gstrtspsrc.h: + Make sure we can never set an invalid location. + * gst/rtsp/rtspmessage.c: (rtsp_message_steal_body): + * gst/rtsp/rtspmessage.h: + Added _steal_body method for future use. + * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_free): + Make freeing of NULL url return immediatly. + +2006-09-18 10:42:52 +0000 Lutz Mueller + + gst/rtsp/gstrtspsrc.*: Use boilerplate. + Original commit message from CVS: + Based on patch by: Lutz Mueller + * gst/rtsp/gstrtspsrc.c: (_do_init), (gst_rtspsrc_class_init), + (gst_rtspsrc_init), (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_play), + (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Use boilerplate. + Make rtspsrc subclass GstBin to make state changes easier. + Add Range header field on the PLAY request. + +2006-09-18 08:59:17 +0000 Thijs Vermeir + + gst/rtsp/: Small cleanups. when multicast is selected as the transport, create UDP sources and connect to the multica... + Original commit message from CVS: + Based on patch by: Thijs Vermeir + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state), + (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause): + * gst/rtsp/rtspconnection.c: (inet_aton): + Small cleanups. + when multicast is selected as the transport, create UDP sources and + connect to the multicast group. + Move parsing and setting of caps to a common place. + Fixes #349894. + +2006-09-16 22:14:35 +0000 Stefan Kost + + More G_OBJECT macro fixing. + Original commit message from CVS: + * ext/hermes/gsthermescolorspace.c: + * ext/ivorbis/vorbisfile.c: + * ext/lcs/gstcolorspace.c: + * ext/wavpack/gstwavpackenc.h: + * ext/xine/xineaudiodec.c: + * ext/xine/xineaudiosink.c: + * ext/xine/xineinput.c: + * gst/chart/gstchart.c: + * gst/equalizer/gstiirequalizer.c: + * gst/games/gstpuzzle.c: + * gst/librfb/gstrfbsrc.c: + * gst/mixmatrix/mixmatrix.c: + * gst/nsf/gstnsf.h: + * gst/vbidec/gstvbidec.c: + * gst/virtualdub/gstxsharpen.c: + More G_OBJECT macro fixing. + +2006-09-16 21:57:29 +0000 Stefan Kost + + More G_OBJECT macro fixing. + Original commit message from CVS: + * ext/flac/gstflactag.c: + * gst/alpha/gstalpha.c: + * gst/debug/breakmydata.c: + * gst/debug/negotiation.c: + * gst/debug/testplugin.c: + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideotemplate.c: + * gst/videomixer/videomixer.c: + * sys/sunaudio/gstsunaudiosrc.h: + More G_OBJECT macro fixing. + +2006-09-16 14:30:59 +0000 Yves Lefebvre + + gst/avi/gstavimux.c: Correctly set the dwLength in strh. + Original commit message from CVS: + Patch by: Yves Lefebvre + * gst/avi/gstavimux.c: (gst_avi_mux_stop_file): + Correctly set the dwLength in strh. + With this patch, the file duration is now displayed correctly in window + media player and the AVI plays completely. Fixes #356147 + +2006-09-15 19:11:00 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2xoverlay.c: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + * tests/icles/v4l2src-test.c: + The test application and the plgind error messages has been improved. + Original commit message from CVS: + The test application and the plgind error messages has been improved. + +2006-09-15 17:10:22 +0000 Darren Kenny + + sys/sunaudio/gstsunaudiomixerctrl.c: Set the output track as the MASTER so that the gnome-settings-daemon keybindings... + Original commit message from CVS: + Patch by: Darren Kenny + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_build_list): + Set the output track as the MASTER so that the gnome-settings-daemon + keybindings for changing the volume using the keyboard works. + Fixes #356142. + +2006-09-15 16:01:48 +0000 Wim Taymans + + gst/multipart/multipartdemux.c: Fix documentation, it is not possible to control the framerate of jpegdec using filte... + Original commit message from CVS: + * gst/multipart/multipartdemux.c: (gst_multipart_demux_chain): + Fix documentation, it is not possible to control the framerate of jpegdec + using filtered caps yet. Fixes #355210. + Return the downstream GstFlowReturn instead of GST_FLOW_OK so that we + stop when there is an error. + +2006-09-14 11:05:35 +0000 Tim-Philipp Müller + + gst/: Don't interpret a first buffer with an offset of NONE as 'from the middle of the stream', but only a first buff... + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain_parse_tag): + * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): + Don't interpret a first buffer with an offset of NONE as + 'from the middle of the stream', but only a first buffer + that has a valid buffer offset that's non-zero (see #345449). + +2006-09-14 10:38:42 +0000 Tim-Philipp Müller + + gst/icydemux/gsticydemux.*: When we merge/collect multiple incoming buffers for typefinding purposes, keep an initial... + Original commit message from CVS: + * gst/icydemux/gsticydemux.c: (gst_icydemux_reset), + (gst_icydemux_typefind_or_forward): + * gst/icydemux/gsticydemux.h: + When we merge/collect multiple incoming buffers for typefinding + purposes, keep an initial 0 offset on the first outgoing buffer + as well (otherwise id3demux won't work right). Fixes #345449. + Also Make buffer metadata writable before setting buffer caps. + * tests/check/elements/icydemux.c: (typefind_succeed), + (cleanup_icydemux), (push_data), (GST_START_TEST), + (icydemux_suite): + Small test case for the above. + +2006-09-13 13:26:15 +0000 Stefan Kost + + gst/avi/gstavidemux.c: More code reuse and better logging in _peek_chunk(). Reintroduce check for chunk sizes before ... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_peek_chunk), + (gst_avi_demux_stream_index), (gst_avi_demux_sync), + (gst_avi_demux_stream_header_push), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_loop): + More code reuse and better logging in _peek_chunk(). Reintroduce check + for chunk sizes before reading them (avoid oom). Better handling for + invalid chunksizes when streaming. + +2006-09-12 20:18:55 +0000 Stefan Kost + + gst/spectrum/gstspectrum.c: Implements stop() to clear the adapter and event() to clear the adapter on FLUSH_STOP and... + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), + (gst_spectrum_start), (gst_spectrum_stop), (gst_spectrum_event): + Implements stop() to clear the adapter and event() to clear the + adapter on FLUSH_STOP and EOS. + +2006-09-11 20:38:41 +0000 Stefan Kost + + gst/level/gstlevel.*: Fix type mixup in level->interval (gdouble<->guint64). Spotted by + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_set_property): + * gst/level/gstlevel.h: + Fix type mixup in level->interval (gdouble<->guint64). Spotted by + René Stadler + +2006-09-11 18:23:59 +0000 Stefan Kost + + gst/spectrum/gstspectrum.*: Fix type mixup in spectrum->interval (gdouble<->guint64). Spotted by + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_init), + (gst_spectrum_set_property): + * gst/spectrum/gstspectrum.h: + Fix type mixup in spectrum->interval (gdouble<->guint64). Spotted by + René Stadler + +2006-09-11 18:02:39 +0000 Stefan Kost + + gst/spectrum/demo-osssrc.c: Use more defines + Original commit message from CVS: + * gst/spectrum/demo-osssrc.c: (draw_spectrum), (main): + Use more defines + * gst/spectrum/gstspectrum.c: (gst_spectrum_init), + (gst_spectrum_dispose), (gst_spectrum_set_caps), + (gst_spectrum_transform_ip): + * gst/spectrum/gstspectrum.h: + Apply some of the spectrum cleanup changes suggested in #348085. + +2006-09-08 16:47:46 +0000 Tim-Philipp Müller + + configure.ac: Bump requirements of -base (videocrop test case needs this). + Original commit message from CVS: + * configure.ac: + Bump requirements of -base (videocrop test case needs this). + * gst/videocrop/gstvideocrop.c: + Document sloppy handling of subsampled chroma planes if + left/top cropping is an odd number. + * tests/check/elements/videocrop.c: (handoff_cb), + (videocrop_test_cropping_init_context), + (videocrop_test_cropping_deinit_context), + (videocrop_test_cropping), (check_1x1_buffer), (GST_START_TEST), + (videocrop_suite), (main): + Add another unit test that crops the input to 1x1 (and checks + that that pixel has the expected values in a number of formats). + +2006-09-08 11:04:24 +0000 Tim-Philipp Müller + + gst/videocrop/: Some quick tests indicate that it doesn't make a great deal of sense to use liboil here, at least not... + Original commit message from CVS: + * gst/videocrop/Makefile.am: + * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init), + (gst_video_crop_transform_packed), + (gst_video_crop_transform_planar): + Some quick tests indicate that it doesn't make a great deal + of sense to use liboil here, at least not for the memcpy()s + we do, so remove liboil usage until there is clear evidence + it actually makes a positive difference somewhere. + +2006-09-06 09:05:33 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Revert one change to fix streaming avi (adapter size != data size). + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_read_subindexes_pull), + (gst_avi_demux_sync), (gst_avi_demux_stream_header_push), + (gst_avi_demux_stream_data): + Revert one change to fix streaming avi (adapter size != data size). + +2006-09-04 16:21:17 +0000 Frédéric Riss + + gst/matroska/: Add support for VOBSUB subtitle tracks and zlib-compressed tracks. Make sure we start on a keyframe af... + Original commit message from CVS: + Patch by: Frédéric Riss + * gst/matroska/matroska-demux.c: (gst_matroska_track_free), + (gst_matroska_demux_reset), + (gst_matroska_demux_read_track_encodings), + (gst_matroska_demux_add_stream), (gst_matroska_decode_buffer), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_subtitle_caps): + * gst/matroska/matroska-ids.h: + Add support for VOBSUB subtitle tracks and zlib-compressed + tracks. Make sure we start on a keyframe after a seek. (#343348) + +2006-09-04 15:06:25 +0000 Tim-Philipp Müller + + gst/matroska/: not perfect yet though, needs some tweaking in flacdec; also, seeking could be better. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_push_hdr_buf), + (gst_matroska_demux_push_flac_codec_priv_data), + (gst_matroska_demux_push_xiph_codec_priv_data), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps): + * gst/matroska/matroska-ids.h: + Add basic FLAC support (#311586), not perfect yet though, needs some + tweaking in flacdec; also, seeking could be better. + Do better bounds checking when deserialising vorbis stream headers + to make sure we don't read beyond the end of the buffer on bad input. + +2006-09-04 09:34:25 +0000 Alessandro Decina + + ext/annodex/gstcmmldec.c: Seeking back in a file containing a CMML stream errors out if the seek goes back up to the ... + Original commit message from CVS: + Patch by: Alessandro Decina + * ext/annodex/gstcmmldec.c: (gst_cmml_dec_chain): + Seeking back in a file containing a CMML stream errors out if the seek + goes back up to the CMML headers. This is because after the seek the xml + processing instruction is submitted to the xml parser again, + which results in an error. The attached patch fixes the problem. + Fixes #353908. + * ext/annodex/gstcmmlenc.h: + Fix authors name. + +2006-09-03 10:46:17 +0000 Tim-Philipp Müller + + tests/check/elements/videocrop.c: More tests: check passthrough mode and caps transform in both directions with fixed... + Original commit message from CVS: + * tests/check/elements/videocrop.c: (handoff_cb), + (buffer_probe_cb), (test_caps_transform), (test_passthrough), + (notgst_value_list_get_nth_int), (videocrop_suite): + More tests: check passthrough mode and caps transform in + both directions with fixed values, ranges and lists. + +2006-09-02 18:49:01 +0000 Tim-Philipp Müller + + docs/plugins/: Add videocrop to docs. + Original commit message from CVS: + * 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.hierarchy: + Add videocrop to docs. + * gst/videocrop/Makefile.am: + * gst/videocrop/gstvideocrop.c: + * gst/videocrop/gstvideocrop.h: + Move boilerplate stuff and structures into a header file. + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/videocrop.c: (video_crop_get_test_caps), + (test_unit_sizes), (videocrop_test_cropping_init_context), + (videocrop_test_cropping_deinit_context), + (videocrop_test_cropping), (test_cropping), (videocrop_suite): + Add unit tests for videocrop. + +2006-09-02 15:30:45 +0000 Tim-Philipp Müller + + Port/rewrite videocrop from scratch for GStreamer-0.10, and make it support all formats videoscale supports (#345653). + Original commit message from CVS: + * configure.ac: + * gst/videocrop/Makefile.am: + * gst/videocrop/gstvideocrop.c: (gst_video_crop_base_init), + (gst_video_crop_class_init), (gst_video_crop_init), + (gst_video_crop_get_image_details_from_caps), + (gst_video_crop_get_unit_size), (gst_video_crop_transform_packed), + (gst_video_crop_transform_planar), (gst_video_crop_transform), + (gst_video_crop_transform_dimension), + (gst_video_crop_transform_dimension_value), + (gst_video_crop_transform_caps), (gst_video_crop_set_caps), + (gst_video_crop_set_property), (gst_video_crop_get_property), + (plugin_init): + Port/rewrite videocrop from scratch for GStreamer-0.10, and make + it support all formats videoscale supports (#345653). + +2006-09-02 14:45:04 +0000 Stefan Kost + + sys/v4l2/: Whitespace cleanups, dashify property-names. + Original commit message from CVS: + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2colorbalance.c: + * sys/v4l2/gstv4l2object.c: + (gst_v4l2_object_install_properties_helper): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init): + * sys/v4l2/gstv4l2src.h: + Whitespace cleanups, dashify property-names. + +2006-09-02 14:28:55 +0000 Stefan Kost + + sys/v4l2/: Cleanup error messages and unify header comments + Original commit message from CVS: + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2colorbalance.c: + * sys/v4l2/gstv4l2colorbalance.h: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): + * sys/v4l2/gstv4l2xoverlay.h: + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_open): + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_queue_frame), + (gst_v4l2src_capture_init): + * sys/v4l2/v4l2src_calls.h: + Cleanup error messages and unify header comments + +2006-08-30 18:01:52 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + Another small fix to set_caps function. + Original commit message from CVS: + Another small fix to set_caps function. + +2006-08-30 13:30:13 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + Send new_segment in GST_FORMAT_TIME instead of in GST_FORMAT_BYTES. + Original commit message from CVS: + Send new_segment in GST_FORMAT_TIME instead of in GST_FORMAT_BYTES. + +2006-08-30 11:36:06 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + A small fix to set_caps function. + Original commit message from CVS: + A small fix to set_caps function. + +2006-08-30 11:27:40 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Reset each streams last_flow to GST_FLOW_OK. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: + (gst_qtdemux_do_seek): + Reset each streams last_flow to GST_FLOW_OK. + (gst_qtdemux_activate_segment): + Removing mystic modifications for good. + +2006-08-30 11:07:37 +0000 Stefan Kost + + gst/qtdemux/qtdemux.c: put back 'segment start<=stop' change that was mystically reverted by the last commit + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), + (qtdemux_parse_tree): + put back 'segment start<=stop' change that was mystically reverted by + the last commit + +2006-08-30 10:43:53 +0000 Stefan Kost + + gst/qtdemux/qtdemux.c: Fix the build for disabled debug + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), + (qtdemux_parse_tree): + Fix the build for disabled debug + +2006-08-29 20:59:47 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + Fixed framerate negotiation. + Original commit message from CVS: + Fixed framerate negotiation. + +2006-08-28 17:47:29 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Make sure segment start<=stop in weird quicktime files. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), + (gst_qtdemux_add_stream), (qtdemux_parse_trak), + (qtdemux_video_caps): + Make sure segment start<=stop in weird quicktime files. + +2006-08-28 16:59:13 +0000 Andy Wingo + + ext/raw1394/gstdv1394src.c (gst_dv1394src_from_raw1394handle): New helper function to lessen the ifdefs. + Original commit message from CVS: + 2006-08-28 Andy Wingo + * ext/raw1394/gstdv1394src.c (gst_dv1394src_from_raw1394handle): + New helper function to lessen the ifdefs. + (GST_INFO_OBJECT): + (gst_dv1394src_iso_receive): Use it. + (gst_dv1394src_create): Also use the control sockets in iec61883 + mode. + (gst_dv1394src_start, gst_dv1394src_stop): Always use a separate + handle for AVC operations; fixes #348233. + +2006-08-28 14:59:05 +0000 Stefan Kost + + sys/v4l2/v4l2_calls.c: add comments and more debug logging + Original commit message from CVS: + * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): + add comments and more debug logging + +2006-08-27 17:14:06 +0000 Stefan Kost + + Rename again (audiofxgood -> audiofx). + Original commit message from CVS: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/inspect/plugin-audiofx.xml: + * docs/plugins/inspect/plugin-audiofxgood.xml: + * gst/audiofx/Makefile.am: + * gst/audiofx/audiofx.c: + * gst/audiofxgood/.cvsignore: + * gst/audiofxgood/Makefile.am: + * gst/audiofxgood/audiofx.c: + * gst/audiofxgood/audiopanorama.c: + * gst/audiofxgood/audiopanorama.h: + Rename again (audiofxgood -> audiofx). + +2006-08-27 13:12:52 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Initialze variables. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_next_data_buffer), + (gst_avi_demux_stream_scan): + Initialze variables. + +2006-08-25 16:21:37 +0000 Wim Taymans + + gst/avi/gstavidemux.*: More attempts to turn this into readable code. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), + (gst_avi_demux_init), (gst_avi_demux_finalize), + (gst_avi_demux_reset), (gst_avi_demux_index_last), + (gst_avi_demux_index_next), (gst_avi_demux_index_entry_for_time), + (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_index), + (gst_avi_demux_stream_index), (gst_avi_demux_peek_tag), + (gst_avi_demux_next_data_buffer), (gst_avi_demux_stream_scan), + (gst_avi_demux_massage_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_stream_header_pull), (gst_avi_demux_do_seek), + (gst_avi_demux_process_next_entry), (gst_avi_demux_loop), + (gst_avi_demux_chain), (gst_avi_demux_sink_activate), + (gst_avi_demux_change_state): + * gst/avi/gstavidemux.h: + More attempts to turn this into readable code. + Don't leak adapters. + Calculate duration according to index more efficiently. + Don't try to act like we drive the pipeline in chain mode. + +2006-08-25 09:53:18 +0000 Wim Taymans + + ext/annodex/gstcmmlutils.c: Fix build. + Original commit message from CVS: + * ext/annodex/gstcmmlutils.c: (gst_cmml_clock_time_from_npt): + Fix build. + +2006-08-25 09:42:43 +0000 Alessandro Decina + + ext/annodex/gstannodex.c: Do some extra sanity checks. + Original commit message from CVS: + Patch by: Alessandro Decina + * ext/annodex/gstannodex.c: (gst_annodex_granule_to_time): + Do some extra sanity checks. + Fixes #350340. + * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_change_state), + (gst_cmml_enc_parse_tag_head), (gst_cmml_enc_parse_tag_clip), + (gst_cmml_enc_push_clip), (gst_cmml_enc_push): + Check if clip->start_time is valid before adding the clip to the + track list. + Reset enc->preamble going from PAUSED to READY. + Don't use GST_FLOW_UNEXPECTED for wrong usage of the element, it is + only used for EOS. + Only post an error message if we were the one that created the fatal + GstFlowReturn value. + * ext/annodex/gstcmmlutils.c: (gst_cmml_clock_time_from_npt), + (gst_cmml_clock_time_to_granule), (gst_cmml_track_list_has_clip): + Parse the seconds field of the npt-sec time format using %llu rather than + %d and check that the value scaled by GST_SECOND doesn't overflow. + Use guint64(s) to represent the keyindex and keyoffset fields of a granulepos. + Lookup a clip's track with clip->track rather than clip->id which + makes no sense. + Identify a clip by its track and start time and not its xml id. + do some more input checking and make sure we don't do undefined shifts. + * tests/check/elements/cmmldec.c: (setup_cmmldec), + (teardown_cmmldec), (check_output_buffer_is_equal), (push_data), + (cmml_tag_message_pop), (check_headers), (push_clip_full), + (push_clip), (push_empty_clip), (check_output_clip), + (GST_START_TEST), (cmmldec_suite): + * tests/check/elements/cmmlenc.c: (setup_cmmlenc), + (teardown_cmmlenc), (check_output_buffer_is_equal), (push_data), + (check_headers), (push_clip), (check_clip_times), (check_clip), + (check_empty_clip), (GST_START_TEST), (cmmlenc_suite): + Added some more checks. + +2006-08-24 19:00:22 +0000 Stefan Kost + + Make also the pan-property float (saves scaling and yields better resolution) + Original commit message from CVS: + * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_class_init), + (gst_audio_panorama_set_property), + (gst_audio_panorama_get_property), + (gst_audio_panorama_transform_m2s_int), + (gst_audio_panorama_transform_s2s_int), + (gst_audio_panorama_transform_m2s_float), + (gst_audio_panorama_transform_s2s_float): + * gst/audiofxgood/audiopanorama.h: + * tests/check/elements/audiopanorama.c: (GST_START_TEST): + Make also the pan-property float (saves scaling and yields better + resolution) + +2006-08-24 18:23:14 +0000 Stefan Kost + + gst/audiofxgood/audiopanorama.c: ChangeLog surgery to add cymax's real name + Original commit message from CVS: + * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_set_caps), + (gst_audio_panorama_transform_m2s_float), + (gst_audio_panorama_transform_s2s_float): + ChangeLog surgery to add cymax's real name + +2006-08-24 18:17:20 +0000 Stefan Kost + + gst/audiofxgood/audiopanorama.*: Added float support (thanks cymax) + Original commit message from CVS: + * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_set_caps), + (gst_audio_panorama_transform_m2s_int), + (gst_audio_panorama_transform_s2s_int), + (gst_audio_panorama_transform_m2s_float), + (gst_audio_panorama_transform_s2s_float), + (gst_audio_panorama_transform): + * gst/audiofxgood/audiopanorama.h: + Added float support (thanks cymax) + +2006-08-24 14:16:55 +0000 Stefan Kost + + gst/audiofxgood/audiopanorama.c: Fix docs & debug category. Add Fixme for volume pan levels. + Original commit message from CVS: + * gst/audiofxgood/audiopanorama.c: + (gst_audio_panorama_transform_m2s): + Fix docs & debug category. Add Fixme for volume pan levels. + +2006-08-24 13:51:15 +0000 Stefan Kost + + gst/avi/gstavidemux.c: unbreak AVI index handling, some more debug, remove an obsolete adapter_flush that caused stre... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_read_subindexes_pull), + (gst_avi_demux_sync), (gst_avi_demux_stream_header_push), + (gst_avi_demux_stream_header_pull), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_chain): + unbreak AVI index handling, some more debug, remove an obsolete + adapter_flush that caused streaming to wander off in the wild + +2006-08-24 11:21:06 +0000 Wim Taymans + + gst/avi/gstavidemux.*: Some more cleanups. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_parse_superindex), (gst_avi_demux_parse_subindex), + (gst_avi_demux_parse_stream), (gst_avi_demux_parse_odml), + (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_stream_header_push), + (gst_avi_demux_stream_header_pull): + * gst/avi/gstavidemux.h: + Some more cleanups. + Fix totalFrames parsing in ODML. + Disable use of index for length calculation in case of ODML as this is + broken now. + +2006-08-24 10:03:03 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.c: Use libgsttag helper function here too. + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_update_metadata): + Use libgsttag helper function here too. + +2006-08-24 09:24:11 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackdec.c: Post audio codec and average bitrate tags on bus (#344472). + Original commit message from CVS: + Patch by: Sebastian Dröge + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_post_tags), + (gst_wavpack_dec_chain): + Post audio codec and average bitrate tags on bus (#344472). + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), + (gst_wavpack_parse_src_query): + Forward queries in other formats (BYTE format in particular) + upstream; add Sebastian to authors. + +2006-08-24 00:40:07 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + Fix set_caps to set width and height to the values the driver is really working with. + Original commit message from CVS: + Fix set_caps to set width and height to the values the driver is really working with. + +2006-08-23 15:33:47 +0000 Stefan Kost + + gst/avi/gstavidemux.*: Initial streaming support for avidemux (fixes #336465) + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), + (gst_avi_demux_init), (gst_avi_demux_dispose), + (gst_avi_demux_reset), (gst_avi_demux_index_next), + (gst_avi_demux_index_entry_for_time), (gst_avi_demux_src_convert), + (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), + (gst_avi_demux_peek_chunk_info), (gst_avi_demux_peek_chunk), + (gst_avi_demux_stream_init_push), (gst_avi_demux_stream_init_pull), + (gst_avi_demux_parse_subindex), + (gst_avi_demux_read_subindexes_push), + (gst_avi_demux_read_subindexes_pull), (gst_avi_demux_parse_stream), + (sort), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), + (gst_avi_demux_sync), (gst_avi_demux_peek_tag), + (gst_avi_demux_massage_index), (gst_avi_demux_stream_header_push), + (gst_avi_demux_stream_header_pull), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (push_tag_lists), (gst_avi_demux_loop), (gst_avi_demux_chain), + (gst_avi_demux_sink_activate), (gst_avi_demux_activate_push), + (gst_avi_demux_change_state): + * gst/avi/gstavidemux.h: + Initial streaming support for avidemux (fixes #336465) + +2006-08-23 10:30:31 +0000 Tim-Philipp Müller + + ext/wavpack/gstwavpackenc.c: Fix mem leak, send newsegment event on correction pad as well (#352476). + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_push_block): + Fix mem leak, send newsegment event on correction pad + as well (#352476). + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): + Restore original author (on Sebastian's request). + * tests/check/Makefile.am: + * tests/check/gst-plugins-bad.supp: + Add (so far empty) suppression file for -bad. Remove + wavpackenc test from VALGRIND_TO_FIX now that the leak + is fixed. + +2006-08-23 09:22:07 +0000 Sebastian Dröge + + tests/check/: Add unit tests for wavpack elements (#352476). + Original commit message from CVS: + Patch by: Sebastian Dröge + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/wavpackdec.c: (setup_wavpackdec), + (cleanup_wavpackdec), (GST_START_TEST), (wavpackdec_suite), (main): + * tests/check/elements/wavpackenc.c: (setup_wavpackenc), + (cleanup_wavpackenc), (GST_START_TEST), (wavpackenc_suite), (main): + * tests/check/elements/wavpackparse.c: (wavpackparse_found_pad), + (setup_wavpackparse), (cleanup_wavpackparse), (GST_START_TEST), + (wavpackparse_suite), (main): + Add unit tests for wavpack elements (#352476). + +2006-08-23 08:52:50 +0000 Sebastian Dröge + + Add docs for wavpack elements (#352476). + Original commit message from CVS: + Patch by: Sebastian Dröge + * 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.hierarchy: + * docs/plugins/inspect/plugin-wavpack.xml: + * ext/wavpack/gstwavpackdec.c: + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackenc.c: + * ext/wavpack/gstwavpackenc.h: + * ext/wavpack/gstwavpackparse.c: + * ext/wavpack/gstwavpackparse.h: + Add docs for wavpack elements (#352476). + +2006-08-22 20:39:26 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + Fixed query size to work with drivers that uses intermediate step like "width * height" to find closest size. + Original commit message from CVS: + Fixed query size to work with drivers that uses intermediate step like "width * height" to find closest size. + +2006-08-22 17:20:41 +0000 Tim-Philipp Müller + + docs/plugins/gst-plugins-good-plugins-docs.sgml: There is no taglibmux element ... + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + There is no taglibmux element ... + * gst/rtsp/gstrtspsrc.c: + Use '%' rather than '&perc;' in gtk-doc blurb, docs build + was complaining about unknown entity here. + +2006-08-22 17:02:39 +0000 Wim Taymans + + gst/avi/gstavidemux.*: Mark DISCONT. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_do_seek), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry): + * gst/avi/gstavidemux.h: + Mark DISCONT. + Remove old unused fields and reorder the struct a bit. + +2006-08-22 16:45:37 +0000 Wim Taymans + + Small documentation updates. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_send), (gst_rtspsrc_close), (gst_rtspsrc_play), + (gst_rtspsrc_pause): + * gst/rtsp/gstrtspsrc.h: + * sys/oss/gstosssink.c: (gst_oss_sink_open), + (gst_oss_sink_prepare), (gst_oss_sink_unprepare): + Small documentation updates. + +2006-08-22 16:42:22 +0000 Wim Taymans + + gst/avi/gstavidemux.*: Precalc most of the duration query for each stream. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_index_entry_for_time), + (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), + (gst_avi_demux_stream_init), (gst_avi_demux_parse_stream), + (gst_avi_demux_stream_index), (gst_avi_demux_peek_tag), + (gst_avi_demux_next_data_buffer), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_stream_header), (gst_avi_demux_do_seek), + (gst_avi_demux_handle_seek), (gst_avi_demux_aggregated_flow), + (gst_avi_demux_process_next_entry), (gst_avi_demux_loop), + (gst_avi_demux_sink_activate_pull), (gst_avi_demux_change_state): + * gst/avi/gstavidemux.h: + Precalc most of the duration query for each stream. + Make seeking more correct. + Use GstSegment to track position and duration. + Code cleanups and leak fixes. + Calculate correct total duration based on index length. + +2006-08-22 13:53:34 +0000 Jan Schmidt + + gst/id3demux/id3v2frames.c: If strings in text fields are marked ISO8859-1, but contain valid UTF-8 already, then han... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (parse_text_identification_frame), + (parse_insert_string_field): + If strings in text fields are marked ISO8859-1, but contain + valid UTF-8 already, then handle them as UTF-8 and ignore + the encoding. (#351794) + +2006-08-22 12:28:24 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.*: Make flac-in-ogg work (#352100). + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_scan_got_frame), + (gst_flac_dec_write), (gst_flac_dec_loop), + (gst_flac_dec_sink_event), (gst_flac_dec_chain), + (gst_flac_dec_src_query): + * ext/flac/gstflacdec.h: + Make flac-in-ogg work (#352100). + +2006-08-22 12:10:32 +0000 Tim-Philipp Müller + + gst/monoscope/gstmonoscope.c: Don't unref buffers of which we've already given away ownership to the adapter. + Original commit message from CVS: + * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): + Don't unref buffers of which we've already given away + ownership to the adapter. + +2006-08-22 10:32:34 +0000 Tim-Philipp Müller + + ext/speex/gstspeexdec.c: Make metadata extraction actually work. + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_comments): + Make metadata extraction actually work. + * ext/speex/gstspeexenc.c: (gst_speexenc_base_init), + (gst_speexenc_init), (gst_speexenc_create_metadata_buffer), + (gst_speexenc_chain): + Fix metadata writing: replace old code which wrote completely + broken tags with libgsttag-based code. Plus miscellaneous + code cleanups (use static pad templates etc.) and a bunch + of leak fixes. + +2006-08-21 19:34:03 +0000 Stefan Kost + + gst/audiopanorama/: die! die! die! you should never have been there + Original commit message from CVS: + * gst/audiopanorama/.cvsignore: + * gst/audiopanorama/Makefile.am: + * gst/audiopanorama/audiofx.c: + * gst/audiopanorama/audiopanorama.c: + * gst/audiopanorama/audiopanorama.h: + die! die! die! you should never have been there + +2006-08-21 16:24:28 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Some more constification. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse), + (qtdemux_node_dump_foreach), (qtdemux_parse_trak), + (qtdemux_video_caps), (qtdemux_audio_caps): + Some more constification. + Fix some paletted data formats again. + Fix ulaw/alaw in qt. + Set correct caps for raw RGB. + Add support for yuv2, which is like Yuv2. + Add support for raw audio with the NONE fourcc, which is like raw. + +2006-08-21 13:59:52 +0000 Tim-Philipp Müller + + ext/wavpack/: More clean-ups: use shorter variable names to make code easier to read; prefix structures we define wit... + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_init), + (gst_wavpack_enc_finalize), (gst_wavpack_enc_sink_set_caps), + (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_format_samples), + (gst_wavpack_enc_push_block), (gst_wavpack_enc_chain), + (gst_wavpack_enc_rewrite_first_block), + (gst_wavpack_enc_sink_event), (gst_wavpack_enc_change_state), + (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): + * ext/wavpack/gstwavpackenc.h: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), + (gst_wavpack_parse_src_query), (gst_wavpack_parse_src_event), + (gst_wavpack_parse_init), (gst_wavpack_parse_get_upstream_length), + (gst_wavpack_parse_loop): + More clean-ups: use shorter variable names to make code easier to + read; prefix structures we define with 'Gst' to make it clearer + where they come from. + +2006-08-21 13:26:37 +0000 Tim-Philipp Müller + + ext/wavpack/gstwavpackenc.c: Fix caps set on buffers and template caps (output is framed) and make them match (#35166... + Original commit message from CVS: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_init), + (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_push_block), + (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block), + (gst_wavpack_enc_sink_event): + Fix caps set on buffers and template caps (output is framed) + and make them match (#351663); use GST_WARNING_OBJECT instead of + GST_ELEMENT_WARNING; simplify push_block(); do some small + clean-ups here and there; fix memleak (#351663). + +2006-08-21 13:12:47 +0000 Jan Schmidt + + tests/check/elements/audiopanorama.c: Fix invalid memory access in audiopanorama test suite. + Original commit message from CVS: + * tests/check/elements/audiopanorama.c: (GST_START_TEST): + Fix invalid memory access in audiopanorama test suite. + +2006-08-21 11:34:41 +0000 Edward Hervey + + tests/check/elements/.cvsignore: ignore built file + Original commit message from CVS: + * tests/check/elements/.cvsignore: + ignore built file + +2006-08-21 10:46:21 +0000 Wim Taymans + + gst/rtp/Makefile.am: Fix the build again. + Original commit message from CVS: + * gst/rtp/Makefile.am: + Fix the build again. + +2006-08-21 09:21:27 +0000 Stefan Kost + + gst/audiofxgood/: resubmit with the desired name *again* + Original commit message from CVS: + * gst/audiofxgood/.cvsignore: + * gst/audiofxgood/Makefile.am: + * gst/audiofxgood/audiofx.c: (plugin_init): + * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_base_init), + (gst_audio_panorama_class_init), (gst_audio_panorama_init), + (gst_audio_panorama_set_property), + (gst_audio_panorama_get_property), + (gst_audio_panorama_get_unit_size), + (gst_audio_panorama_transform_caps), (gst_audio_panorama_set_caps), + (gst_audio_panorama_transform_m2s), + (gst_audio_panorama_transform_s2s), (gst_audio_panorama_transform): + * gst/audiofxgood/audiopanorama.h: + resubmit with the desired name *again* + +2006-08-20 13:09:51 +0000 Stefan Kost + + use g_assert in _get_unit_size + Original commit message from CVS: + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_get_unit_size): + * gst/videobox/gstvideobox.c: (gst_video_box_get_unit_size): + use g_assert in _get_unit_size + +2006-08-20 13:06:44 +0000 Stefan Kost + + docs/plugins/: cleanup -unused.txt to make it useful, add previously missing docs + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-audiofxgood.xml: + cleanup -unused.txt to make it useful, add previously missing docs + * ext/Makefile.am: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/esd/gstesd.c: (plugin_init): + reflow to get rid of two external symbols + * gst/audiofxgood/audiofx.c: (plugin_init): + re-add + +2006-08-20 12:09:16 +0000 Stefan Kost + + gst/audiofxgood/audiofx.c + Original commit message from CVS: + * configure.ac: + * gst/audiofxgood/.cvsignore: + * gst/audiofxgood/Makefile.am: + * gst/audiofxgood/audiofx.c + * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_base_init), + (gst_audio_panorama_class_init), (gst_audio_panorama_init), + (gst_audio_panorama_set_property), + (gst_audio_panorama_get_property), + (gst_audio_panorama_get_unit_size), + (gst_audio_panorama_transform_caps), (gst_audio_panorama_set_caps), + (gst_audio_panorama_transform_m2s), + (gst_audio_panorama_transform_s2s), (gst_audio_panorama_transform): + * gst/audiofxgood/audiopanorama.h: + * tests/check/Makefile.am: + * tests/check/elements/audiopanorama.c: (setup_panorama_m), + (setup_panorama_s), (cleanup_panorama), (GST_START_TEST), + (panorama_suite), (main): + Add audiofxgood plugin with audiopanorama element + +2006-08-18 21:39:00 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.c: Fix resyncing in push mode not stopping re-syncing at embedded zeroes; skip garbage be... + Original commit message from CVS: + Based on patch by: Sebastian Dröge + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_sink_event), + (gst_wavpack_parse_get_upstream_length), + (gst_wavpack_parse_find_marker), (gst_wavpack_parse_resync_loop), + (gst_wavpack_parse_loop), (gst_wavpack_parse_resync_adapter): + Fix resyncing in push mode not stopping re-syncing at embedded + zeroes; skip garbage between frames in pull mode as well if + necessary; use gst_pad_query_peer_duration(); push EOS and + NEWSEGMENT event in right direction (#351659). + +2006-08-18 17:00:53 +0000 Wim Taymans + + docs/plugins/Makefile.am: More Oss docs fixage. + Original commit message from CVS: + * docs/plugins/Makefile.am: + More Oss docs fixage. + +2006-08-18 16:52:21 +0000 Wim Taymans + + gst/rtp/: Added experimental SVQ3 depayloader. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_base_init), + (gst_rtp_sv3v_depay_class_init), (gst_rtp_sv3v_depay_init), + (gst_rtp_sv3v_depay_finalize), (gst_rtp_sv3v_depay_setcaps), + (gst_rtp_sv3v_depay_process), (gst_rtp_sv3v_depay_set_property), + (gst_rtp_sv3v_depay_get_property), + (gst_rtp_sv3v_depay_change_state), + (gst_rtp_sv3v_depay_plugin_init): + * gst/rtp/gstrtpsv3vdepay.h: + Added experimental SVQ3 depayloader. + +2006-08-18 13:25:06 +0000 Edward Hervey + + ext/dv/gstdvdemux.*: When handling seek requests, don't send the newsegment event from the calling thread. Instead sa... + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_pull_seek), + (gst_dvdemux_loop), (gst_dvdemux_change_state): + * ext/dv/gstdvdemux.h: + When handling seek requests, don't send the newsegment event from the + calling thread. Instead save it so it can be sent from the streaming + thread. + +2006-08-17 15:51:50 +0000 Sjoerd Simons + + gst/multipart/multipartdemux.c: Accept leading whitespace before the boundary + Original commit message from CVS: + Patch by: Sjoerd Simons + * gst/multipart/multipartdemux.c: (multipart_parse_header): + Accept leading whitespace before the boundary + This patch makes the demuxer allow some whitespace before the actual + boundary. This makes the demuxer work with the ``old'' gstreamer + multipartmuxer again (which placed an extra \n before the start + of the stream) Fixes #349068. + +2006-08-17 15:47:28 +0000 Wim Taymans + + gst/rtp/gstrtph264depay.c: Error out on non-implemented stuff. + Original commit message from CVS: + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): + Error out on non-implemented stuff. + +2006-08-16 16:50:00 +0000 Andy Wingo + + ext/ladspa/gstsignalprocessor.c: Make ladspa elements reusable. Fixes #350006. + Original commit message from CVS: + Patch by: Andy Wingo + * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setup), + (gst_signal_processor_start), (gst_signal_processor_stop), + (gst_signal_processor_cleanup), (gst_signal_processor_setcaps), + (gst_signal_processor_pen_buffer), (gst_signal_processor_flush), + (gst_signal_processor_do_pulls), (gst_signal_processor_do_pushes), + (gst_signal_processor_change_state): + Make ladspa elements reusable. Fixes #350006. + +2006-08-16 15:33:12 +0000 Wim Taymans + + ext/ladspa/gstladspa.c: Convert ' ' into '_'. Try to keep as many characters in the padtemplate names as possible. + Original commit message from CVS: + * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): + Convert ' ' into '_'. Try to keep as many characters in the padtemplate + names as possible. + +2006-08-16 14:47:50 +0000 Wim Taymans + + ext/ladspa/gstsignalprocessor.c: A push() gives away our refcount so we should not use the buffer on the pen anymore. + Original commit message from CVS: + * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_flush), + (gst_signal_processor_do_pushes): + A push() gives away our refcount so we should not use the buffer on the + pen anymore. + +2006-08-16 13:48:00 +0000 Tim-Philipp Müller + + sys/oss/gstossmixerelement.c: Don't leak device string. + Original commit message from CVS: + * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init), + (gst_oss_mixer_element_finalize): + Don't leak device string. + +2006-08-16 13:01:32 +0000 Tim-Philipp Müller + + configure.ac: Require CVS of GStreamer core and -base (for + Original commit message from CVS: + * configure.ac: + Require CVS of GStreamer core and -base (for + GST_TAG_EXTENDED_COMMENT and gst_tag_parse_extended_comment()). + * ext/taglib/gstid3v2mux.cc: + Write extended comment tags properly (#348762). + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), + (parse_comment_frame): + Extract COMM frames into extended comments, which makes it + easier to properly retain the description bit of the tag + and maintain this information when re-tagging (#348762). + +2006-08-16 12:02:48 +0000 Tim-Philipp Müller + + tests/check/Makefile.am: Don't try to run annodex unit tests if the annodex plugin has not been built (Fixes #351116). + Original commit message from CVS: + * tests/check/Makefile.am: + Don't try to run annodex unit tests if the annodex + plugin has not been built (Fixes #351116). + +2006-08-16 10:53:32 +0000 Tim-Philipp Müller + + gst/autodetect/gstautoaudiosink.c: When we can't find a usable audiosink, don't error out, but use a fake sink instea... + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_find_best): + When we can't find a usable audiosink, don't error out, + but use a fake sink instead and post a warning message + on the bus (#341278). + +2006-08-16 10:40:04 +0000 Sebastian Dröge + + ext/wavpack/: In push mode, re-sync to next wavpack header if sync is lost (#351557). Also use hyphens instead of und... + Original commit message from CVS: + Patch by: Sebastian Dröge + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init): + * ext/wavpack/gstwavpackparse.c: + (gst_wavpack_parse_resync_adapter), (gst_wavpack_parse_chain): + In push mode, re-sync to next wavpack header if sync is lost + (#351557). Also use hyphens instead of underscores in + GObject property names. + +2006-08-16 10:22:32 +0000 Tim-Philipp Müller + + sys/oss/: Document OSS elements; add gtk-doc blurb with 'Since 0.10.5' for ossmixer's new device property. + Original commit message from CVS: + * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init): + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + Document OSS elements; add gtk-doc blurb with 'Since 0.10.5' for + ossmixer's new device property. + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + Add docs for OSS elements. + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + Update to CVS version. + +2006-08-16 10:05:00 +0000 Wim Taymans + + gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP. + Original commit message from CVS: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpmp4gdepay.c: + Caps extra properties must be defined as strings for + depayloaders because they are generated from an SDP. + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init), + (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init), + (gst_rtp_h264_depay_finalize), (decode_base64), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process), + (gst_rtp_h264_depay_set_property), + (gst_rtp_h264_depay_get_property), + (gst_rtp_h264_depay_change_state), + (gst_rtp_h264_depay_plugin_init): + * gst/rtp/gstrtph264depay.h: + Added basic, not completely functional RFC 3984 H264 depayloader. + +2006-08-16 09:48:26 +0000 Wim Taymans + + gst/rtsp/gstrtpdec.c: Add pads after setting them up. + Original commit message from CVS: + * gst/rtsp/gstrtpdec.c: (gst_rtpdec_init), (gst_rtpdec_getcaps): + Add pads after setting them up. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), + (gst_rtspsrc_init), (gst_rtspsrc_finalize), + (gst_rtspsrc_free_stream), (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), + (gst_rtspsrc_combine_flows), (gst_rtspsrc_loop), + (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), + (gst_rtspsrc_pause): + * gst/rtsp/gstrtspsrc.h: + Fix interleaved mode. + - Protect streaming with lock. + - Combine flows + - set caps on outgoing buffers. + - strip trailing \0 from data packets. + - Configure RTP/RTCP in stream. + Use DEBUG_OBJECT more. + +2006-08-16 09:29:20 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.c: Turn a g_print into a DEBUG line. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add): + Turn a g_print into a DEBUG line. + +2006-08-16 09:25:17 +0000 Wim Taymans + + sys/oss/: Small cleanups. Better error reporting. + Original commit message from CVS: + * sys/oss/gstossmixer.c: (gst_ossmixer_open), (gst_ossmixer_new): + * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init), + (gst_oss_mixer_element_init), (gst_oss_mixer_element_set_property), + (gst_oss_mixer_element_get_property), + (gst_oss_mixer_element_change_state): + * sys/oss/gstossmixerelement.h: + Small cleanups. Better error reporting. + Add device property for the mixer instead of the hardcoded + /dev/mixer. Fixes #350785. + API: GstOssMixerElement::device property + +2006-08-15 22:44:27 +0000 Jens Granseuer + + gconf/Makefile.am: Make --disable-schemas work right (they still need to be copied to the installation directory, jus... + Original commit message from CVS: + Patch by: Jens Granseuer + * gconf/Makefile.am: + Make --disable-schemas work right (they still need + to be copied to the installation directory, just not + applied). Fixes #351347 (also #344100). + +2006-08-15 20:29:45 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackparse.*: Make wavpackparse also work in push-mode (not seekable yet though); some small clean-u... + Original commit message from CVS: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_class_init), + (gst_wavpack_parse_reset), (gst_wavpack_parse_get_src_query_types), + (gst_wavpack_parse_src_query), + (gst_wavpack_parse_handle_seek_event), + (gst_wavpack_parse_sink_event), (gst_wavpack_parse_init), + (gst_wavpack_parse_create_src_pad), + (gst_wavpack_parse_push_buffer), (gst_wavpack_parse_loop), + (gst_wavpack_parse_chain), (gst_wavpack_parse_sink_activate), + (gst_wavpack_parse_sink_activate_pull): + * ext/wavpack/gstwavpackparse.h: + Patch by: Sebastian Dröge + Make wavpackparse also work in push-mode (not seekable yet though); + some small clean-ups along the way; add support for SEEKING query + and query types function. (#351495). + +2006-08-14 11:37:10 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + * win32/common/config.h: + back to HEAD + Original commit message from CVS: + back to HEAD + +2006-08-14 11:14:43 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * win32/common/config.h: + releasing 0.10.4 + Original commit message from CVS: + releasing 0.10.4 + +2006-08-14 10:06:55 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Extract all references/redirections if there is more than one and sort them; also extract mini... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_redirects_sort_func), + (qtdemux_process_redirects), (qtdemux_parse_tree): + Extract all references/redirections if there is more + than one and sort them; also extract minimum required + bitrate information if available. (#350399) + +2006-08-10 14:10:28 +0000 Edward Hervey + + Send the newsegment event in the streaming thread. + Original commit message from CVS: + Patch by: Edward Hervey + * configure.ac: + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), + (gst_wavparse_stream_data): + Send the newsegment event in the streaming thread. + Fixes #347529 + +2006-08-10 14:02:45 +0000 Thomas Vander Stichele + + * win32/common/config.h: + bumped for prerel + Original commit message from CVS: + bumped for prerel + +2006-08-10 13:10:38 +0000 Thomas Vander Stichele + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + update translations + Original commit message from CVS: + update translations + +2006-08-08 14:55:53 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Fix silly typo. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): + Fix silly typo. + +2006-08-08 14:46:00 +0000 Tim-Philipp Müller + + * ChangeLog: + ChangeLog surgery: mention bug number + Original commit message from CVS: + ChangeLog surgery: mention bug number + +2006-08-08 14:40:47 +0000 Tim-Philipp Müller + + ext/jpeg/: Refuse sink caps in the encoder if width or height is not a multiple of 16, the encoder does not support t... + Original commit message from CVS: + * ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_setcaps), + (gst_smokeenc_resync), (gst_smokeenc_chain): + Refuse sink caps in the encoder if width or height is not a + multiple of 16, the encoder does not support that yet; along the + same lines, check the return value of the encoder setup function; + also remove some debug log clutter. + +2006-08-04 11:38:54 +0000 Andy Wingo + + ext/ladspa/gstsignalprocessor.h: Add infrastructure for storing whether a processor can work in place or not, and for... + Original commit message from CVS: + 2006-08-04 Andy Wingo + * ext/ladspa/gstsignalprocessor.h: Add infrastructure for storing + whether a processor can work in place or not, and for keeping + track of its state. Change the FlowReturn instance variable from + "state" to "flow_state", all callers changed. + * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setup) + (gst_signal_processor_start, gst_signal_processor_stop) + (gst_signal_processor_cleanup): New functions to manage the + processor's state. + (gst_signal_processor_setcaps): start() as well as setup() here. + (gst_signal_processor_prepare): Respect CAN_PROCESS_IN_PLACE. + (gst_signal_processor_change_state): Stop and cleanup the + processor as we go to NULL. + * ext/ladspa/gstladspa.c (gst_ladspa_base_init): Reuse buffers if + INPLACE_BROKEN is not set. + * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_prepare): + Do the alloc_buffer in bytes, not frames. + +2006-08-04 10:21:26 +0000 Zaheer Abbas Merali + + sys/ximage/ximageutil.c: Fix rgb masks when recording in < 24bpp. + Original commit message from CVS: + 2006-08-04 Zaheer Abbas Merali + * sys/ximage/ximageutil.c: (ximageutil_xcontext_get): + Fix rgb masks when recording in < 24bpp. + +2006-08-04 09:20:26 +0000 Andy Wingo + + * ChangeLog: + * ext/ladspa/gstsignalprocessor.c: + BPB + Original commit message from CVS: + (gst_signal_processor_src_activate_pull): BPB + +2006-08-04 09:05:53 +0000 Andy Wingo + + * ChangeLog: + * ext/ladspa/gstsignalprocessor.c: + ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setcaps) (gst_signal_processor_prepare) (gst_signal_processor_u... + Original commit message from CVS: + 2006-08-04 Andy Wingo + * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setcaps) + (gst_signal_processor_prepare) + (gst_signal_processor_update_inputs) + (gst_signal_processor_process, gst_signal_processor_pen_buffer) + (gst_signal_processor_flush) + (gst_signal_processor_sink_activate_push) + (gst_signal_processor_src_activate_pull) + (gst_signal_processor_change_state): Remove the last of the code + that assumes that we process whole buffers at a time. Fix some + debugging. Seems to work now in some cases. + +2006-07-31 22:27:22 +0000 Andy Wingo + + ext/ladspa/gstsignalprocessor.c (gst_signal_processor_process): Fix nframes-choosing. + Original commit message from CVS: + 2006-08-01 Andy Wingo + * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_process): + Fix nframes-choosing. + (gst_signal_processor_init): Init pending_in and pending_out. + +2006-07-31 22:03:09 +0000 Andy Wingo + + ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): No more default sample rate, although we never check tha... + Original commit message from CVS: + 2006-08-01 Andy Wingo + * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): No + more default sample rate, although we never check that the sample + rate actually gets set. Something for the future. + (gst_signal_processor_setcaps): Some refcount fixes, flow fixes. + (gst_signal_processor_event): Refcount fixen. + (gst_signal_processor_process): Pull the number of frames to + process from the sizes of the buffers in the input pens. + (gst_signal_processor_pen_buffer): Remove an incorrect FIXME :) + (gst_signal_processor_do_pulls): Add an nframes argument, and use + it instead of buffer_frames. + (gst_signal_processor_getrange): Refcount fixen, pass nframes on + to do_pulls. + (gst_signal_processor_chain) + (gst_signal_processor_sink_activate_push) + (gst_signal_processor_src_activate_pull): Refcount fixen. + * ext/ladspa/gstsignalprocessor.h: No more buffer_frames, yay. + +2006-07-31 19:44:18 +0000 Stefan Kost + + ext/ladspa/gstsignalprocessor.c: don't query buffer-frames from caps, add lots of debug-log, try fix for assert (#349... + Original commit message from CVS: + * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setcaps), + (gst_signal_processor_process): + don't query buffer-frames from caps, add lots of debug-log, + try fix for assert (#349189) + +2006-07-31 15:58:43 +0000 Wim Taymans + + gst/udp/gstudpsrc.c: Fix docs. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: + Fix docs. + +2006-07-29 16:32:26 +0000 Stefan Kost + + ext/ladspa/gstsignalprocessor.c: Add debugs logs here and there, add more error handling, add some + Original commit message from CVS: + * ext/ladspa/gstsignalprocessor.c: + (gst_signal_processor_add_pad_from_template), + (gst_signal_processor_init), (gst_signal_processor_setcaps), + (gst_signal_processor_process), (gst_signal_processor_pen_buffer), + (gst_signal_processor_do_pulls), (gst_signal_processor_getrange), + (gst_signal_processor_sink_activate_push), + (gst_signal_processor_src_activate_pull), + (gst_signal_processor_change_state): + Add debugs logs here and there, add more error handling, add some + FIXME comments, filed #349189 + +2006-07-29 11:22:47 +0000 Zaheer Abbas Merali + + ext/jpeg/gstsmokeenc.c: Set caps on buffer correctly. Fixes bug #349155. + Original commit message from CVS: + 2006-07-29 Zaheer Abbas Merali + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_getcaps), + (gst_smokeenc_setcaps), (gst_smokeenc_chain): + Set caps on buffer correctly. Fixes bug #349155. + +2006-07-28 16:17:17 +0000 Sjoerd Simons + + gst/multipart/multipartdemux.c: Uses GstAdapter instead of own buffering. + Original commit message from CVS: + Patch by: Sjoerd Simons + * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), + (gst_multipart_demux_class_init), (gst_multipart_demux_init), + (gst_multipart_demux_finalize), (get_line_end), + (multipart_parse_header), (multipart_find_boundary), + (gst_multipart_demux_chain), (gst_multipart_demux_change_state), + (gst_multipart_set_property), (gst_multipart_get_property): + Uses GstAdapter instead of own buffering. + Actually parses the mime-type correctly (In tests the mime-type was + always "" with the old version). + Uses the Content-length header if available to speed up things. + Reliably autoscans the boundary name by default. + Fixes #349068. + * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): + Don't start the stream with a \n. + +2006-07-28 08:32:47 +0000 Brian Cameron + + sys/sunaudio/gstsunaudiosrc.c: Open source with O_NONBLOCK (#349015). + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open): + Open source with O_NONBLOCK (#349015). + +2006-07-28 08:21:27 +0000 Stefan Kost + + gst/avi/gstavidemux.*: Whitespace fixes and more debug + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_massage_index): + * gst/avi/gstavidemux.h: + Whitespace fixes and more debug + +2006-07-27 11:21:53 +0000 Tim-Philipp Müller + + gst/autodetect/gstautoaudiosink.c: Get rid of old and unused magic sound-server properties stuff. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_create_element_with_pretty_name), + (gst_auto_audio_sink_find_best), + (gst_auto_audio_sink_change_state): + Get rid of old and unused magic sound-server properties stuff. + Add suffix to child sink's name that makes it easy to see from + the name alone which type it actually is (alsa, oss, esd, etc.). + +2006-07-27 10:05:27 +0000 Wim Taymans + + gst/udp/gstudpsrc.*: Rename "buffer" to "buffer-size" to make clear it is a size we set and not some sort of feature ... + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_set_property), (gst_udpsrc_get_property), + (gst_udpsrc_start): + * gst/udp/gstudpsrc.h: + Rename "buffer" to "buffer-size" to make clear it is a size we set and + not some sort of feature we enable. + +2006-07-27 10:01:49 +0000 Tim-Philipp Müller + + gst/udp/gstudpsrc.c: Use CLOSE_SOCKET() here instead of close() to maintain win32 workiness. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + Use CLOSE_SOCKET() here instead of close() to maintain + win32 workiness. + +2006-07-27 09:04:51 +0000 Thijs Vermeir + + gst/udp/gstudpsrc.*: Added "buffer" property to control the kernel receive buffer size. + Original commit message from CVS: + Patch by: Thijs Vermeir + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_start): + * gst/udp/gstudpsrc.h: + Added "buffer" property to control the kernel receive buffer size. + Update documentation. + Small cleanups. Fixes #348752. + API: buffer property + +2006-07-26 16:36:59 +0000 Kai Vehmanen + + gst/rtp/: Fix timestamp calculation on outgoing RTP packets. + Original commit message from CVS: + Patch by: Kai Vehmanen + * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_flush), + (gst_rtp_pcma_pay_handle_buffer): + * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_flush), + (gst_rtp_pcmu_pay_handle_buffer): + Fix timestamp calculation on outgoing RTP packets. + Fixes #348675. + +2006-07-26 10:07:29 +0000 Tim-Philipp Müller + + ext/taglib/gstid3v2mux.cc: is still sub-optimal though, since we don't retain or extract the comment descriptions pro... + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: + Fix writing of comment frames (should be COMM not TCOM), + is still sub-optimal though, since we don't retain or + extract the comment descriptions properly (#334375, + also see #334375). + +2006-07-26 09:02:56 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: #define 'fact' RIFF chunk if we are not compiling against + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + #define 'fact' RIFF chunk if we are not compiling against + -base CVS (we don't want to depend on -base CVS for this + one define only, and also not for release order reasons). + +2006-07-26 08:17:45 +0000 Tim-Philipp Müller + + ext/taglib/gstid3v2mux.cc: Handle multiple tags of the same type properly. Re-inject unparsed ID3v2 frames that we ge... + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: + Handle multiple tags of the same type properly. Re-inject + unparsed ID3v2 frames that we get as binary blobs from + id3demux into the tag again so we don't lose information + when retagging (#334375). + +2006-07-25 17:54:25 +0000 Tim-Philipp Müller + + sys/ximage/gstximagesrc.c: Document newly-added properties properly, so that there is a 'Since: 0.10.4' in the plugin... + Original commit message from CVS: + * sys/ximage/gstximagesrc.c: (gst_ximage_src_class_init): + Document newly-added properties properly, so that there is a + 'Since: 0.10.4' in the plugin docs. Convert some property + names into canonical GObject style (GObject will do that + internally anyway). + +2006-07-25 16:47:04 +0000 Tim-Philipp Müller + + gst/id3demux/id3tags.c: Extract frames for ID3v2 versions prior to ID3v2.3.0 properly as well, and add the version to... + Original commit message from CVS: + * gst/id3demux/id3tags.c: + (id3demux_add_id3v2_frame_blob_to_taglist): + Extract frames for ID3v2 versions prior to ID3v2.3.0 properly as + well, and add the version to the blob's buffer caps, since that + information will be needed for deserialisation later on (#348644). + +2006-07-25 13:14:05 +0000 Stefan Kost + + gst/avi/gstavidemux.c: Moved win32 variant of GST_DEBUG_CATEGORY_EXTERN to gstinfo.h. Fixed indentation and spacing. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_read_subindexes), + (gst_avi_demux_parse_stream): + Moved win32 variant of GST_DEBUG_CATEGORY_EXTERN to gstinfo.h. Fixed + indentation and spacing. + +2006-07-24 21:43:06 +0000 Sébastien Moutte + + 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-07-24 15:25:49 +0000 Tim-Philipp Müller + + docs/plugins/: Update files to CVS/Prerelease version, add esdsink docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + Update files to CVS/Prerelease version, add esdsink docs. + * ext/esd/esdsink.c: + Add gtk-doc blurb. + * gst/rtp/gstrtpmp4vpay.c: + Fix typo in element description. + +2006-07-24 14:54:04 +0000 Tim-Philipp Müller + + * ChangeLog: + ChangeLog surgery: fix Stefan's e-mail address + Original commit message from CVS: + ChangeLog surgery: fix Stefan's e-mail address + +2006-07-24 14:49:19 +0000 Tim-Philipp Müller + + ext/esd/esdsink.c: Prevent libesd from auto-spawning a sound daemon if it is not already running. Now that we don't d... + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_open), + (gst_esdsink_factory_init): + Prevent libesd from auto-spawning a sound daemon if it + is not already running. Now that we don't do evil stuff + like that any longer we can give esdsink a rank so that + autoaudiosink will try it as well if all other audio + sinks fail (#343051). + +2006-07-24 14:42:11 +0000 Tim-Philipp Müller + + ext/esd/Makefile.am: Oops, need to remove README from EXTRA_DIST as well. + Original commit message from CVS: + * ext/esd/Makefile.am: + Oops, need to remove README from EXTRA_DIST as well. + +2006-07-24 14:37:36 +0000 Tim-Philipp Müller + + ext/esd/README: Remove, it contains nothing useful anyway. + Original commit message from CVS: + * ext/esd/README: + Remove, it contains nothing useful anyway. + * ext/esd/esdsink.c: (gst_esdsink_init), (gst_esdsink_prepare), + (gst_esdsink_delay): + Some small clean-ups; use GST_BOILERPLATE etc. + +2006-07-24 14:16:06 +0000 Wim Taymans + + gst/law/: Fix negotiation to deal with ANY/EMPTY caps instead of leaking. + Original commit message from CVS: + * gst/law/alaw-decode.c: (alawdec_getcaps): + * gst/law/alaw-encode.c: (alawenc_getcaps), (gst_alawenc_chain): + * gst/law/mulaw-decode.c: (mulawdec_getcaps): + * gst/law/mulaw-encode.c: (mulawenc_getcaps): + Fix negotiation to deal with ANY/EMPTY caps instead of leaking. + +2006-07-24 13:40:56 +0000 Stefan Kost + + gst/wavparse/gstwavparse.*: Use information from 'fact' chunk for length calculation of compressed samples. Calculate... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), + (gst_wavparse_other), (gst_wavparse_perform_seek), + (gst_wavparse_get_upstream_size), (gst_wavparse_stream_headers), + (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), + (gst_wavparse_pad_query): + * gst/wavparse/gstwavparse.h: + Use information from 'fact' chunk for length calculation of compressed + samples. Calculate bps if bogus value is found in wav header (embeded + mp2/mp3). + +2006-07-24 11:48:03 +0000 Joni Valtanen + + Port udp plugin to win32 (#345288). + Original commit message from CVS: + Based on patch by: Joni Valtanen + * configure.ac: + * gst/udp/Makefile.am: + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_init), + (gst_dynudpsink_finalize), (gst_dynudpsink_close): + * gst/udp/gstdynudpsink.h: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init), + (gst_multiudpsink_finalize), (gst_multiudpsink_close): + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudp.c: (plugin_init): + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create), + (gst_udpsrc_start), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + * gst/udp/gstudpnetutils.c: (gst_udp_net_utils_win32_inet_aton), + (gst_udp_net_utils_win32_wsa_startup): + * gst/udp/gstudpnetutils.h: + Port udp plugin to win32 (#345288). + +2006-07-24 11:00:34 +0000 Wim Taymans + + gst/rtsp/rtspconnection.c: Remove unwanted DEBUG line. + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: (rtsp_connection_send): + Remove unwanted DEBUG line. + +2006-07-23 11:33:54 +0000 Tim-Philipp Müller + + gst/id3demux/: On second thought, it might be wiser and more efficient not to do tag registration from a streaming th... + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (plugin_init): + * gst/id3demux/id3tags.c: + (id3demux_add_id3v2_frame_blob_to_taglist): + * gst/id3demux/id3tags.h: + On second thought, it might be wiser and more efficient + not to do tag registration from a streaming thread. + +2006-07-23 10:56:27 +0000 Tim-Philipp Müller + + gst/id3demux/id3tags.c: Put ID3v2 frames we can't parse as binary blobs into private tags, so that they are not lost ... + Original commit message from CVS: + * gst/id3demux/id3tags.c: + (id3demux_add_id3v2_frame_blob_to_taglist), + (id3demux_id3v2_frames_to_tag_list): + Put ID3v2 frames we can't parse as binary blobs into private + tags, so that they are not lost when retagging, at least once + id3v2mux has been taught to re-inject those frames again. + See bug #334375. + +2006-07-21 10:57:00 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Fix some leaks. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_process_next_entry): + Fix some leaks. + * gst/id3demux/id3tags.c: (id3demux_id3v2_frames_to_tag_list): + Don't use \n in debug lines. + +2006-07-20 18:48:32 +0000 Stefan Kost + + docs/plugins/: Add annodex and icydemux, cleanup the sections a bit + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + Add annodex and icydemux, cleanup the sections a bit + +2006-07-19 14:36:00 +0000 Martin Szulecki + + sys/v4l2/gstv4l2object.c: If "device-name" is requested and the device is not open, try to temporarily open it to obt... + Original commit message from CVS: + Patch by: Martin Szulecki + * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_get_property_helper): + If "device-name" is requested and the device is not + open, try to temporarily open it to obtain this + information (#342494). + +2006-07-19 11:52:53 +0000 Alex Lancaster + + ext/taglib/gstid3v2mux.cc: Write GST_TAG_ENCODER and GST_TAG_ENCODER_VERSION as + Original commit message from CVS: + Patch by: Alex Lancaster + * ext/taglib/gstid3v2mux.cc: + Write GST_TAG_ENCODER and GST_TAG_ENCODER_VERSION as + ID3v2 TSSE frames (#347898). + +2006-07-19 07:40:52 +0000 Tim-Philipp Müller + + * ChangeLog: + ChangeLog surgery: mention fixed bug + Original commit message from CVS: + ChangeLog surgery: mention fixed bug + +2006-07-18 19:59:01 +0000 Stefan Kost + + gst/avi/gstavimux.c: Respect mpegversion for "video/mpeg" and give message in case of unhandled versions. + Original commit message from CVS: + * gst/avi/gstavimux.c: (gst_avi_mux_vidsink_set_caps): + Respect mpegversion for "video/mpeg" and give message in case of + unhandled versions. + +2006-07-18 18:05:15 +0000 Tim-Philipp Müller + + ext/wavpack/gstwavpackdec.c: Fix caps after previous change to byte order endianness. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): + Fix caps after previous change to byte order endianness. + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), + (gst_wavpack_parse_sink_event), (gst_wavpack_parse_init), + (gst_wavpack_parse_loop): + * ext/wavpack/gstwavpackparse.h: + Queue incoming events if there's no source pad yet and + send them downstream later when the pad is there. + +2006-07-18 16:47:25 +0000 Tim-Philipp Müller + + ext/wavpack/gstwavpackdec.*: Output audio in native byte order (which is also how we get samples from wavpack); outpu... + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_init), + (gst_wavpack_dec_format_samples), + (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), + (gst_wavpack_dec_change_state): + * ext/wavpack/gstwavpackdec.h: + Output audio in native byte order (which is also how we get + samples from wavpack); output samples with 21-24 bit depth + with 32 bit width (makes things easier for us). + +2006-07-18 15:53:35 +0000 Tim-Philipp Müller + + ext/wavpack/gstwavpackdec.*: More clean-ups: remove most of the disfunctional correction pad stuff for now, if it eve... + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init), + (gst_wavpack_dec_class_init), (gst_wavpack_dec_init), + (gst_wavpack_dec_finalize), (gst_wavpack_dec_format_samples), + (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), + (gst_wavpack_dec_sink_event), (gst_wavpack_dec_change_state): + * ext/wavpack/gstwavpackdec.h: + More clean-ups: remove most of the disfunctional correction + pad stuff for now, if it ever gets implemented a lot of stuff + will have to be rewritten anyway; redo chain function, move + errors to end, error out instead of g_assert()ing. Also rename + overly long variable 'wavpackdec' to just 'dec'; miscellaneous + other small stuff. + +2006-07-18 14:08:06 +0000 Sebastian Dröge + + configure.ac: Check for wavpack version and define WAVPACK_OLD_API if necessary. + Original commit message from CVS: + Patch by: Sebastian Dröge + * configure.ac: + Check for wavpack version and define WAVPACK_OLD_API if + necessary. + * ext/wavpack/Makefile.am: + * ext/wavpack/gstwavpackcommon.c: (gst_wavpack_read_header), + (gst_wavpack_read_metadata): + * ext/wavpack/gstwavpackcommon.h: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init), + (gst_wavpack_dec_class_init), (gst_wavpack_dec_init), + (gst_wavpack_dec_finalize), (gst_wavpack_dec_format_samples), + (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), + (gst_wavpack_dec_sink_event), (gst_wavpack_dec_change_state), + (gst_wavpack_dec_request_new_pad), (gst_wavpack_dec_plugin_init): + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), + (gst_wavpack_enc_init), (gst_wavpack_enc_finalize), + (gst_wavpack_enc_set_wp_config): + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), + (gst_wavpack_parse_finalize), (gst_wavpack_parse_class_init), + (gst_wavpack_parse_index_get_entry_from_sample), + (gst_wavpack_parse_scan_to_find_sample), + (gst_wavpack_parse_handle_seek_event), + (gst_wavpack_parse_create_src_pad): + * ext/wavpack/gstwavpackstreamreader.c: + * ext/wavpack/gstwavpackstreamreader.h: + Port to new/official wavpack API, don't use API that was exported + in wavpack header files and in the lib but meant to be private, at + least not for recent wavpack versions; misc. 'cleanups' (#347443). + +2006-07-17 10:25:57 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Store duration in uint64 too instead of clipping. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), + (gst_qtdemux_prepare_current_sample), + (gst_qtdemux_loop_state_movie): + Store duration in uint64 too instead of clipping. + When we do a keyframe seek and the requested time is at the + keyframe, don't seek back to the beginning of the keyframe. + Fixes #347439. + +2006-07-17 10:22:54 +0000 Wim Taymans + + ext/libpng/gstpngdec.*: Use statically allocated segment instead of leaking. + Original commit message from CVS: + * ext/libpng/gstpngdec.c: (gst_pngdec_init), (buffer_clip), + (gst_pngdec_caps_create_and_set), (gst_pngdec_task), + (gst_pngdec_chain), (gst_pngdec_sink_event), + (gst_pngdec_libpng_init), (gst_pngdec_change_state), + (gst_pngdec_sink_activate_push): + * ext/libpng/gstpngdec.h: + Use statically allocated segment instead of leaking. + Various cleanups. + Fix flush and seek handling. + +2006-07-16 14:31:48 +0000 Wim Taymans + + gst/rtp/: Added simple generic mpeg4 depayloader. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_base_init), + (gst_rtp_mp4g_depay_class_init), (gst_rtp_mp4g_depay_init), + (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process), + (gst_rtp_mp4g_depay_set_property), + (gst_rtp_mp4g_depay_get_property), + (gst_rtp_mp4g_depay_change_state), + (gst_rtp_mp4g_depay_plugin_init): + * gst/rtp/gstrtpmp4gdepay.h: + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_class_init), + (gst_rtp_mp4g_pay_parse_audio_config), (gst_rtp_mp4g_pay_setcaps), + (gst_rtp_mp4g_pay_flush): + Added simple generic mpeg4 depayloader. + Fix generic mpeg4 payloader. + +2006-07-15 15:25:05 +0000 Tim-Philipp Müller + + gst/rtsp/gstrtspsrc.c: Don't try doing state changes on a NULL pointer. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state): + Don't try doing state changes on a NULL pointer. + +2006-07-15 11:50:25 +0000 Stefan Kost + + gst/spectrum/: Do not use deprecated gtk functions. + Original commit message from CVS: + * gst/spectrum/demo-audiotest.c: (main): + * gst/spectrum/demo-osssrc.c: (main): + Do not use deprecated gtk functions. + +2006-07-14 13:33:54 +0000 Sebastien Cote + + gst/rtp/gstrtpamrdepay.*: rtpamrdec isn't a subclass of GstBaseRtpDepayload. + Original commit message from CVS: + Patch by: Sebastien Cote + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_base_init), + (gst_rtp_amr_depay_class_init), (gst_rtp_amr_depay_init), + (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): + * gst/rtp/gstrtpamrdepay.h: + rtpamrdec isn't a subclass of GstBaseRtpDepayload. + Fixes #321191 + +2006-07-14 12:01:05 +0000 Zaheer Abbas Merali + + sys/ximage/gstximagesrc.c: Fix segfault when moving mouse pointer to the bottom right corner. + Original commit message from CVS: + 2006-07-14 Zaheer Abbas Merali + * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get), + (gst_ximage_src_get_caps), (gst_ximage_src_class_init): + Fix segfault when moving mouse pointer to the bottom right corner. + +2006-07-13 15:22:20 +0000 Thomas Vander Stichele + + * common: + * docs/plugins/inspect/plugin-qtdemux.xml: + remove sdlvideosink plugin and update the rest + Original commit message from CVS: + remove sdlvideosink plugin and update the rest + +2006-07-12 09:34:15 +0000 Wim Taymans + + gst/rtp/: Added mpeg2 TS depayloader. Closing #347234. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_base_init), + (gst_rtp_mp2t_depay_class_init), (gst_rtp_mp2t_depay_init), + (gst_rtp_mp2t_depay_setcaps), (gst_rtp_mp2t_depay_process), + (gst_rtp_mp2t_depay_set_property), + (gst_rtp_mp2t_depay_get_property), + (gst_rtp_mp2t_depay_change_state), + (gst_rtp_mp2t_depay_plugin_init): + * gst/rtp/gstrtpmp2tdepay.h: + Added mpeg2 TS depayloader. Closing #347234. + +2006-07-12 09:28:46 +0000 Tim-Philipp Müller + + gst/spectrum/gstspectrum.c: Fix typo in property nick. + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): + Fix typo in property nick. + +2006-07-11 22:46:47 +0000 Tim-Philipp Müller + + ext/cdio/gstcdiocddasrc.c: Remove g_assert that shouldn't be there. + Original commit message from CVS: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_close): + Remove g_assert that shouldn't be there. + +2006-07-10 20:11:34 +0000 Edward Hervey + + gst/avi/gstavidemux.*: Don't push tag events found by gst_riff_parse_info() before outputting + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_stream_header), (push_tag_lists): + * gst/avi/gstavidemux.h: + Don't push tag events found by gst_riff_parse_info() before outputting + GST_EVENT_NEWSEGMENT. + +2006-07-10 16:41:57 +0000 Wim Taymans + + gst/rtsp/: replaced closesocket and close in code with one CLOSE_SOCKET. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/rtspconnection.c: (rtsp_connection_send), + (rtsp_connection_close): + * gst/rtsp/rtspdefs.h: + replaced closesocket and close in code with one CLOSE_SOCKET. + Some more cleanups. Fixes #345301. + +2006-07-10 15:26:39 +0000 Tim-Philipp Müller + + gst/autodetect/gstautoaudiosink.c: Fix example pipeline in docs. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: + Fix example pipeline in docs. + +2006-07-10 14:49:46 +0000 Wim Taymans + + gst/filter/: Don't forget new files. + Original commit message from CVS: + * gst/filter/gstbpwsinc.h: + * gst/filter/gstiir.h: + * gst/filter/gstlpwsinc.h: + Don't forget new files. + +2006-07-10 14:42:15 +0000 Mathis Hofer + + Ported the gstfilter plugin to GStreamer 0.10. + Original commit message from CVS: + Patch by: Mathis Hofer + * configure.ac: + * gst/filter/Makefile.am: + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), + (gst_bpwsinc_base_init), (gst_bpwsinc_class_init), + (gst_bpwsinc_init), (bpwsinc_set_caps), (bpwsinc_transform_ip), + (bpwsinc_set_property), (bpwsinc_get_property): + * gst/filter/gstfilter.c: (plugin_init): + * gst/filter/gstfilter.h: + * gst/filter/gstiir.c: (gst_iir_dispose), (gst_iir_base_init), + (gst_iir_class_init), (gst_iir_init), (iir_set_caps), + (iir_transform_ip), (iir_set_property), (iir_get_property): + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), + (gst_lpwsinc_base_init), (gst_lpwsinc_class_init), + (gst_lpwsinc_init), (lpwsinc_set_caps), (lpwsinc_transform_ip), + (lpwsinc_set_property), (lpwsinc_get_property): + Ported the gstfilter plugin to GStreamer 0.10. + +2006-07-10 10:21:57 +0000 Rob Taylor + + gst/udp/gstmultiudpsink.c: If a destination is added before the stream is set to PAUSED, the multicast group is not j... + Original commit message from CVS: + Patch by: Rob Taylor + * gst/udp/gstmultiudpsink.c: (join_multicast), + (gst_multiudpsink_init_send), (gst_multiudpsink_add): + If a destination is added before the stream is set to PAUSED, the + multicast group is not joined as the socket is not created yet. + Also TTL and LOOP should also be set. Fixes #346921. + +2006-07-10 09:57:26 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Extract comment information!! + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): + Extract comment information!! + +2006-07-10 09:46:25 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Extract year/date information (fixes #347079). + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta), + (qtdemux_tag_add_date): + Extract year/date information (fixes #347079). + +2006-07-08 22:41:25 +0000 Zaheer Abbas Merali + + sys/ximage/gstximagesrc.*: Fix use-damage property to actually work :) + Original commit message from CVS: + 2006-07-09 Zaheer Abbas Merali + * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get), + (gst_ximage_src_set_property), (gst_ximage_src_get_property), + (gst_ximage_src_get_caps), (gst_ximage_src_class_init), + (gst_ximage_src_init): + * sys/ximage/gstximagesrc.h: + Fix use-damage property to actually work :) + Add startx, starty, endx, endy properties so screencasts other than full + screen ones can work. + +2006-07-08 19:03:54 +0000 Zaheer Abbas Merali + + sys/ximage/gstximagesrc.*: Add use_damage property to offer ability to choose whether to use + Original commit message from CVS: + 2006-07-08 Zaheer Abbas Merali + * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get), + (gst_ximage_src_set_property), (gst_ximage_src_get_property), + (gst_ximage_src_class_init), (gst_ximage_src_init): + * sys/ximage/gstximagesrc.h: + Add use_damage property to offer ability to choose whether to use + XDamage or not. + +2006-07-07 15:04:29 +0000 Wim Taymans + + gst/goom/filters.c: Avoid goom coredumping by clearing memory. + Original commit message from CVS: + * gst/goom/filters.c: (zoomFilterSetResolution): + Avoid goom coredumping by clearing memory. + Fixes 345679. + +2006-07-07 14:30:26 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Don't crash on twos/sowt/raw audio. #345830. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Don't crash on twos/sowt/raw audio. #345830. + +2006-07-05 20:21:02 +0000 Sébastien Moutte + + win32/vs6/libgstid3demux.dsp: Add a link to libgsttag-0.10.lib. + Original commit message from CVS: + * win32/vs6/libgstid3demux.dsp: + Add a link to libgsttag-0.10.lib. + +2006-07-05 14:52:13 +0000 Tim-Philipp Müller + + gst/: Don't return FLOW_UNEXPECTED when a buffer is before the start of the stream (which might happen with large ID3... + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_trim_buffer), + (gst_tag_demux_read_range): + * gst/id3demux/gstid3demux.c: (gst_id3demux_trim_buffer), + (gst_id3demux_read_range): + Don't return FLOW_UNEXPECTED when a buffer is before + the start of the stream (which might happen with + large ID3v2 tags if the tag reading was done pullrange + based and we then switched to push mode later on). + Fixes regression introduced by commit from June 29th. + +2006-07-05 10:14:16 +0000 Tim-Philipp Müller + + ext/taglib/gstid3v2mux.cc: Make UTF-8 the default encoding when writing string tags (before, our UTF-8 strings would ... + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: + Make UTF-8 the default encoding when writing string + tags (before, our UTF-8 strings would automatically + be converted to ISO-8859-1 by taglib and written as + ISO-8859-1 fields if that was possible). + * tests/check/elements/id3v2mux.c: (utf8_string_in_buf), + (test_taglib_id3mux_check_tag_buffer), (identity_cb), + (test_taglib_id3mux_with_tags): + Add test case that makes sure our UTF-8 strings have + actually been written into the tag as UTF-8. + +2006-07-04 16:00:26 +0000 Tim-Philipp Müller + + configure.ac: Let's try that again. + Original commit message from CVS: + * configure.ac: + Let's try that again. + +2006-07-04 15:40:47 +0000 Tim-Philipp Müller + + configure.ac: Disable monoscope plugin for now until it fulfills all the requirements. + Original commit message from CVS: + * configure.ac: + Disable monoscope plugin for now until it fulfills + all the requirements. + +2006-07-03 20:35:45 +0000 Tim-Philipp Müller + + Port monoscope visualisation to 0.10. + Original commit message from CVS: + * configure.ac: + * gst/monoscope/Makefile.am: + * gst/monoscope/gstmonoscope.c: (gst_monoscope_base_init), + (gst_monoscope_class_init), (gst_monoscope_init), + (gst_monoscope_finalize), (gst_monoscope_reset), + (gst_monoscope_sink_setcaps), (gst_monoscope_src_setcaps), + (gst_monoscope_src_negotiate), (get_buffer), (gst_monoscope_chain), + (gst_monoscope_sink_event), (gst_monoscope_src_event), + (gst_monoscope_change_state), (plugin_init): + * gst/monoscope/gstmonoscope.h: + Port monoscope visualisation to 0.10. + +2006-07-03 20:02:56 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Fix silly crasher in state change function; add + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_state_header), (qtdemux_video_caps): + Fix silly crasher in state change function; add + IV41 fourcc (see bug #171111); don't output confusing + debug message when skipping atoms. + +2006-07-03 16:43:10 +0000 Tim-Philipp Müller + + gst/: Return FLOW_UNEXPECTED when at the end of the file, not + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain): + * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): + Return FLOW_UNEXPECTED when at the end of the file, not + FLOW_ERROR. Fixes 'internal stream error' errors that + would sometimes occur in totem when scrubbing to the + end of an ID3v1 tagged mp3 file. + +2006-07-03 15:31:22 +0000 Edward Hervey + + ext/libpng/gstpngdec.*: Implement buffer clipping/dropping using GstSegment. + Original commit message from CVS: + * ext/libpng/gstpngdec.c: (gst_pngdec_init), (user_info_callback), + (buffer_clip), (user_end_callback), (gst_pngdec_chain), + (gst_pngdec_sink_event), (gst_pngdec_change_state): + * ext/libpng/gstpngdec.h: + Implement buffer clipping/dropping using GstSegment. + This provides accurate seeking. + +2006-07-03 15:28:48 +0000 Edward Hervey + + gst/avi/gstavidemux.*: Proper aggregation of each stream's GstFlowReturn in order to figure out whether the task shou... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_read_subindexes), (gst_avi_demux_parse_stream), + (gst_avi_demux_handle_seek), (gst_avi_demux_aggregated_flow), + (gst_avi_demux_process_next_entry), (push_tag_lists), + (gst_avi_demux_stream_data), (gst_avi_demux_loop): + * gst/avi/gstavidemux.h: + Proper aggregation of each stream's GstFlowReturn in order to figure out + whether the task should stop or not. + Don't send inline events before pushing out a NEW_SEGMENT, more + specifically for GST_TAG_EVENT. + Change a GST_ERROR to a GST_WARNING for a non-fatal situation in reading + sub-indexes. + +2006-06-30 07:11:24 +0000 Brian Cameron + + sys/sunaudio/gstsunaudiomixerctrl.c: Move "Monitor" slider to input tab so it works more like sdtaudiocontrol, which ... + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_build_list): + Move "Monitor" slider to input tab so it works more like + sdtaudiocontrol, which is what people on Solaris are used + to using for their mixer program (#346259). + +2006-06-29 14:50:18 +0000 Thomas Vander Stichele + + tests/check/elements/level.c: fix a leak, clean up at the end + Original commit message from CVS: + * tests/check/elements/level.c: (GST_START_TEST): + fix a leak, clean up at the end + +2006-06-29 11:41:55 +0000 Tim-Philipp Müller + + gst/matroska/: Send tag event after newsegment event. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_send_event), + (gst_matroska_demux_loop_stream_parse_id): + * gst/matroska/matroska-ids.h: + Send tag event after newsegment event. + +2006-06-29 11:11:50 +0000 Tim-Philipp Müller + + gst/id3demux/gstid3demux.c: Make sure we don't return GST_FLOW_OK with a NULL buffer in certain cases where a read be... + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_trim_buffer), + (gst_id3demux_read_range): + Make sure we don't return GST_FLOW_OK with a NULL buffer in + certain cases where a read beyond the end of the file is + requested. Fixes #345930. + * gst/apetag/gsttagdemux.c: (gst_tag_demux_trim_buffer), + (gst_tag_demux_read_range): + Fix same issue here as well. + +2006-06-29 11:05:14 +0000 Zaheer Abbas Merali + + sys/ximage/gstximagesrc.c: Fix hypothetical crash. + Original commit message from CVS: + 2006-06-29 Zaheer Abbas Merali + * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get): + Fix hypothetical crash. + +2006-06-28 08:36:30 +0000 Brian Cameron + + sys/sunaudio/gstsunaudiosink.c: Do not modify the ports value. If the user has turned off the built-in speakers, then... + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_prepare): + Do not modify the ports value. If the user has turned off the + built-in speakers, then we should not reset it in the prepare + function, since this causes the built-in speakers to turn + back on anytime the user changes a track in totem, rhythmbox, + etc. (#346066). + +2006-06-23 09:35:45 +0000 Wim Taymans + + gst/goom/gstgoom.c: Fix double caps unref when negotiation fails. + Original commit message from CVS: + * gst/goom/gstgoom.c: (gst_goom_src_negotiate): + Fix double caps unref when negotiation fails. + +2006-06-22 19:31:04 +0000 Tim-Philipp Müller + + Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) plus two minor macro fixes. + Original commit message from CVS: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/annodex/gstcmmlparser.c: + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdemux.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/speex/gstspeexenc.c: + * gst/alpha/gstalphacolor.c: + * gst/cutter/gstcutter.c: + * gst/debug/gstnavigationtest.c: + * gst/icydemux/gsticydemux.c: + * gst/level/gstlevel.c: + * gst/multipart/multipart.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtspsrc.c: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstvideoflip.c: + Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) + plus two minor macro fixes. + +2006-06-22 16:27:03 +0000 Tim-Philipp Müller + + gst/matroska/: Try to fix up broken matroska files containing subtitle streams with non-UTF8 character encodings (cou... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_check_subtitle_buffer), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_subtitle_caps): + * gst/matroska/matroska-ids.c: + (gst_matroska_track_init_subtitle_context): + * gst/matroska/matroska-ids.h: + Try to fix up broken matroska files containing subtitle + streams with non-UTF8 character encodings (courtesy of + mkvmerge) using either the encoding specified in the + GST_SUBTITLE_ENCODING environment variable or the + current locale's character set if it is non-UTF8. + Fixes #337076. + +2006-06-22 12:17:13 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: Set image type from APIC frame as "image-type" field of GST_TAG_IMAGE buffer caps (#344605). + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (parse_picture_frame): + Set image type from APIC frame as "image-type" field + of GST_TAG_IMAGE buffer caps (#344605). + +2006-06-20 19:40:29 +0000 Tim-Philipp Müller + + ext/flac/: Support chain-based operation, should make flac-over-DAAP work (#340492). + Original commit message from CVS: + * ext/flac/Makefile.am: + * ext/flac/gstflacdec.c: (gst_flac_dec_init), + (gst_flac_dec_reset_decoders), + (gst_flac_dec_setup_seekable_decoder), + (gst_flac_dec_setup_stream_decoder), (gst_flac_dec_finalize), + (gst_flac_dec_metadata_callback), + (gst_flac_dec_metadata_callback_seekable), + (gst_flac_dec_metadata_callback_stream), + (gst_flac_dec_error_callback), + (gst_flac_dec_error_callback_seekable), + (gst_flac_dec_error_callback_stream), (gst_flac_dec_read_seekable), + (gst_flac_dec_read_stream), (gst_flac_dec_write), + (gst_flac_dec_write_seekable), (gst_flac_dec_write_stream), + (gst_flac_dec_loop), (gst_flac_dec_sink_event), + (gst_flac_dec_chain), (gst_flac_dec_convert_sink), + (gst_flac_dec_get_sink_query_types), (gst_flac_dec_sink_query), + (gst_flac_dec_get_src_query_types), (gst_flac_dec_src_query), + (gst_flac_dec_handle_seek_event), (gst_flac_dec_sink_activate), + (gst_flac_dec_sink_activate_push), + (gst_flac_dec_sink_activate_pull), (gst_flac_dec_change_state): + * ext/flac/gstflacdec.h: + Support chain-based operation, should make flac-over-DAAP + work (#340492). + +2006-06-20 15:35:05 +0000 Wim Taymans + + docs/plugins/gst-plugins-good-plugins-sections.txt: Doc updates, merge some unused symbols. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + Doc updates, merge some unused symbols. + +2006-06-20 14:57:09 +0000 Wim Taymans + + Added documentation for the rtsp plugin. Fixes #345393. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/rtsp/gstrtpdec.c: (gst_rtpdec_class_init): + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + Added documentation for the rtsp plugin. Fixes #345393. + +2006-06-20 12:10:29 +0000 Wim Taymans + + gst/rtsp/rtspconnection.c: Use better G_OS_* macros. Fixes #345301 some more. + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: (inet_aton), (rtsp_connection_send), + (rtsp_connection_close), (rtsp_connection_free): + Use better G_OS_* macros. Fixes #345301 some more. + +2006-06-20 10:35:48 +0000 Brian Cameron + + sys/sunaudio/: Add a SunAudio source plugin. + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/Makefile.am: + * sys/sunaudio/gstsunaudio.c: (plugin_init): + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_build_list), (gst_sunaudiomixer_ctrl_new), + (gst_sunaudiomixer_ctrl_list_tracks), + (gst_sunaudiomixer_ctrl_get_volume), + (gst_sunaudiomixer_ctrl_set_volume), + (gst_sunaudiomixer_ctrl_set_mute), + (gst_sunaudiomixer_ctrl_set_record): + * sys/sunaudio/gstsunaudiomixerctrl.h: + * sys/sunaudio/gstsunaudiomixertrack.c: + (gst_sunaudiomixer_track_init), (gst_sunaudiomixer_track_new): + * sys/sunaudio/gstsunaudiomixertrack.h: + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_dispose), + (gst_sunaudiosrc_base_init), (gst_sunaudiosrc_class_init), + (gst_sunaudiosrc_init), (gst_sunaudiosrc_set_property), + (gst_sunaudiosrc_get_property), (gst_sunaudiosrc_getcaps), + (gst_sunaudiosrc_open), (gst_sunaudiosrc_close), + (gst_sunaudiosrc_prepare), (gst_sunaudiosrc_unprepare), + (gst_sunaudiosrc_read), (gst_sunaudiosrc_delay), + (gst_sunaudiosrc_reset): + * sys/sunaudio/gstsunaudiosrc.h: + Add a SunAudio source plugin. + Support stereo and right/left channel gain in the mixer plugin. + Support the RECORD flag so that you can switch between line-input and + microphone in gnome-volume-control. + Code cleanups like using an enumerator for track number instead of an + integer. Fixes #344923. + +2006-06-20 10:31:41 +0000 Joni Valtanen + + gst/rtsp/rtspconnection.c: Make RTSP plugin compile on windows. Fixes #345301. + Original commit message from CVS: + Patch by: Joni Valtanen + * gst/rtsp/rtspconnection.c: (inet_aton), (rtsp_connection_send), + (rtsp_connection_close): + Make RTSP plugin compile on windows. Fixes #345301. + Some changes to original patch to catch errors better. + use ifdef WIN32 instead of ifndef. + +2006-06-19 10:00:18 +0000 Zaheer Abbas Merali + + configure.ac: If we have libraw1394 >= 1.2.1, then we need libiec61883. + Original commit message from CVS: + 2006-06-19 Zaheer Abbas Merali + * configure.ac: + If we have libraw1394 >= 1.2.1, then we need libiec61883. + +2006-06-18 14:00:19 +0000 Edward Hervey + + ext/jpeg/gstjpegdec.c: After a failed buffer alloc, we need to abort the jpeg decoding (it started when parsing heade... + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): + After a failed buffer alloc, we need to abort the jpeg decoding (it + started when parsing headers to figure out how many bytes we need + to request downstream). + +2006-06-18 12:37:12 +0000 Mark Nauwelaerts + + gst/wavparse/gstwavparse.c: Make sure we don't read beyond the end of the file (#345232). + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek): + Make sure we don't read beyond the end of the file (#345232). + +2006-06-17 14:35:37 +0000 Tim-Philipp Müller + + configure.ac: Fix --disable-external (can't set conditionals conditionally, #343602). + Original commit message from CVS: + * configure.ac: + Fix --disable-external (can't set conditionals conditionally, + #343602). + +2006-06-16 12:35:08 +0000 Zaheer Abbas Merali + + gst/spectrum/Makefile.am: Fix build. + Original commit message from CVS: + 2006-06-16 Zaheer Abbas Merali + * gst/spectrum/Makefile.am: + Fix build. + +2006-06-16 10:56:24 +0000 Tim-Philipp Müller + + Use GST_PLUGIN_DOCS, --enable-plugin-docs etc. + Original commit message from CVS: + * autogen.sh: + * configure.ac: + * docs/Makefile.am: + Use GST_PLUGIN_DOCS, --enable-plugin-docs etc. + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/inspect/plugin-taglib.xml: + Add/fix apev2mux docs. + +2006-06-16 09:49:07 +0000 Stefan Kost + + gst/spectrum/: port to use message to get results, cleanly exit when closing the window + Original commit message from CVS: + * gst/spectrum/demo-audiotest.c: (on_window_destroy), + (draw_spectrum), (message_handler), (main): + * gst/spectrum/demo-osssrc.c: (on_window_destroy), (draw_spectrum), + (message_handler), (main): + port to use message to get results, cleanly exit when closing the window + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), + (gst_spectrum_init), (gst_spectrum_dispose), + (gst_spectrum_set_property), (gst_spectrum_get_property), + (gst_spectrum_set_caps), (gst_spectrum_start), + (gst_spectrum_message_new), (gst_spectrum_transform_ip): + * gst/spectrum/gstspectrum.h: + port to derive from basetransform and send results via messages + (like level element) + +2006-06-15 15:58:09 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Combine return values from src pad pushes. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), + (gst_qtdemux_combine_flows), (gst_qtdemux_loop_state_movie), + (gst_qtdemux_loop), (gst_qtdemux_chain), (qtdemux_parse_trak): + Combine return values from src pad pushes. + +2006-06-15 08:50:09 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Don't crash on files with 0 samples, EOS immediatly instead. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header), + (gst_qtdemux_prepare_current_sample), (gst_qtdemux_advance_sample), + (gst_qtdemux_add_stream): + Don't crash on files with 0 samples, EOS immediatly instead. + Fixes #344944. + +2006-06-14 15:59:56 +0000 Wim Taymans + + ext/dv/gstdvdec.c: Reset segment info on flush. + Original commit message from CVS: + * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), + (gst_dvdec_finalize), (gst_dvdec_sink_event), + (gst_dvdec_change_state): + Reset segment info on flush. + Alloc segment in _init, free in _finalize. + * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_pull_seek): + Don't send segments twice. + +2006-06-14 15:07:22 +0000 Wim Taymans + + ext/dv/gstdvdemux.c: Respect segment.stop. Fixes #342592. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_demux_frame): + Respect segment.stop. Fixes #342592. + +2006-06-14 11:28:41 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: No language specified means the implied language is English according to the matroska ... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): + No language specified means the implied language is English + according to the matroska spec (partially fixes #344708); + add some more debug output. + +2006-06-14 09:32:27 +0000 Sebastian Dröge + + ext/wavpack/gstwavpackenc.*: Use bitrate property solely for bitrates and add new bits-per-sample property for the ot... + Original commit message from CVS: + Patch by: Sebastian Dröge + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init), + (gst_wavpack_enc_class_init), (gst_wavpack_enc_set_wp_config), + (gst_wavpack_enc_chain), (gst_wavpack_enc_sink_event), + (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): + * ext/wavpack/gstwavpackenc.h: + Use bitrate property solely for bitrates and add new + bits-per-sample property for the other stuff. Set duration + to 'unknown' in initial header and resend header with proper + duration on EOS; update Sebastian's e-mail address. + +2006-06-14 08:06:43 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: When operating chain-based, don't make any assumptions about the chunking of the incoming... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_peek_chunk_info), + (gst_wavparse_peek_chunk), (gst_wavparse_stream_headers), + (gst_wavparse_chain): + When operating chain-based, don't make any assumptions about the + chunking of the incoming data and make streaming work on days other + than the second Thursday after a full moon. Also fix up debug + messages here and there and make use of the most excellent new + gst_pad_query_peer_duration() utility function. + Skip any 'bext' chunks in front of the 'fmt ' chunk. Fixes #343837. + * gst/wavparse/gstwavparse.h: + Remove trailing comma after last enum value, some compilers don't + like that. + +2006-06-13 17:05:25 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Handle premature EOS gracefully. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_data): + Handle premature EOS gracefully. + +2006-06-13 09:54:26 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Prevent out of bounds array access when scrubbing towards the end of the file between the last... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_seek): + Prevent out of bounds array access when scrubbing towards + the end of the file between the last index entry and the + end. Fixes occasional 'start <= stop' newsegment event + assertions when scrubbing in MJPEG files. + +2006-06-12 11:13:39 +0000 Tim-Philipp Müller + + tests/check/elements/.cvsignore: And another one. + Original commit message from CVS: + * tests/check/elements/.cvsignore: + And another one. + +2006-06-12 11:04:59 +0000 Tim-Philipp Müller + + gst/spectrum/.cvsignore: Ignore more. + Original commit message from CVS: + * gst/spectrum/.cvsignore: + Ignore more. + +2006-06-12 10:53:26 +0000 Tim-Philipp Müller + + 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-11 19:31:10 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: Extract images from ID3v2 tags (APIC frames). Fixes #339704. + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), + (scan_encoded_string), (parse_picture_frame): + Extract images from ID3v2 tags (APIC frames). Fixes #339704. + * configure.ac: + Require core >= 0.10.8 (for GST_TAG_IMAGE and + GST_TAG_PPEVIEW_IMAGE used in the patch above). + +2006-06-11 18:56:24 +0000 Thomas Vander Stichele + + * ext/raw1394/.gitignore: + * ext/taglib/.gitignore: + * tests/check/elements/.gitignore: + * tests/examples/level/.gitignore: + moap ignore + Original commit message from CVS: + moap ignore + +2006-06-11 18:52:19 +0000 Thomas Vander Stichele + + ext/raw1394/gstdv1394src.c: gratuitous comment changes + Original commit message from CVS: + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_discover_avc_node): + gratuitous comment changes + * tests/check/elements/level.c: (GST_START_TEST): + fix level test leaks + +2006-06-11 18:44:54 +0000 Thomas Vander Stichele + + * .gitignore: + ignore more + Original commit message from CVS: + ignore more + +2006-06-11 18:20:39 +0000 Tim-Philipp Müller + + gst/: Use gst_pad_query_peer_duration() utility function here. + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_get_upstream_size): + * gst/id3demux/gstid3demux.c: (id3demux_get_upstream_size): + Use gst_pad_query_peer_duration() utility function here. + +2006-06-11 13:57:19 +0000 Thomas Vander Stichele + + autogen.sh: require am17 + Original commit message from CVS: + * autogen.sh: + require am17 + * configure.ac: + * ext/annodex/Makefile.am: + * ext/cdio/Makefile.am: + * ext/dv/Makefile.am: + * ext/esd/Makefile.am: + * ext/flac/Makefile.am: + * ext/gdk_pixbuf/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/libcaca/Makefile.am: + * ext/speex/Makefile.am: + * ext/taglib/Makefile.am: + * sys/oss/Makefile.am: + * sys/sunaudio/Makefile.am: + * sys/ximage/Makefile.am: + clean up build further + +2006-06-11 13:55:34 +0000 Thomas Vander Stichele + + * common: + * win32/common/config.h: + update + Original commit message from CVS: + update + +2006-06-10 15:33:18 +0000 Sebastian Dröge + + ext/wavpack/: Add wavpack encoder element (#343131). + Original commit message from CVS: + Patch by: Sebastian Dröge + * ext/wavpack/Makefile.am: + * ext/wavpack/gstwavpack.c: (plugin_init): + * ext/wavpack/gstwavpackcommon.h: + * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), + (gst_wavpack_enc_correction_mode_get_type), + (gst_wavpack_enc_joint_stereo_mode_get_type), + (gst_wavpack_enc_base_init), (gst_wavpack_enc_class_init), + (gst_wavpack_enc_init), (gst_wavpack_enc_dispose), + (gst_wavpack_enc_sink_set_caps), (gst_wavpack_enc_set_wp_config), + (gst_wavpack_enc_format_samples), (gst_wavpack_enc_push_block), + (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block), + (gst_wavpack_enc_sink_event), (gst_wavpack_enc_change_state), + (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property), + (gst_wavpack_enc_plugin_init): + * ext/wavpack/gstwavpackenc.h: + * ext/wavpack/md5.c: + * ext/wavpack/md5.h: + Add wavpack encoder element (#343131). + +2006-06-09 20:36:00 +0000 Tim-Philipp Müller + + gconf/Makefile.am: Honour --disable-schemas-install configure option. Fixes #344100. + Original commit message from CVS: + * gconf/Makefile.am: + Honour --disable-schemas-install configure option. Fixes #344100. + +2006-06-09 18:33:01 +0000 Tim-Philipp Müller + + tests/examples/level/Makefile.am: Add -lm to LIBS for pow() function, don't assume one of our dependencies (such as l... + Original commit message from CVS: + * tests/examples/level/Makefile.am: + Add -lm to LIBS for pow() function, don't assume one of our + dependencies (such as libxml-2.0) drags it in automatically + (#343603). + +2006-06-09 18:17:23 +0000 Peter Kjellerstedt + + configure.ac: We should use $SED and not $(SED) in configure.ac (#343678). + Original commit message from CVS: + Patch by: Peter Kjellerstedt + * configure.ac: + We should use $SED and not $(SED) in configure.ac (#343678). + +2006-06-09 17:38:19 +0000 Tim-Philipp Müller + + configure.ac: Check for X before using X_CFLAGS in the check for opengl (#343866). + Original commit message from CVS: + * configure.ac: + Check for X before using X_CFLAGS in the check for opengl (#343866). + * ext/musepack/Makefile.am: + * ext/wavpack/Makefile.am: + * gst/speed/Makefile.am: + Add missing GST_LIBS, fixes build on cygwin (#343866). + +2006-06-09 17:29:08 +0000 Brian Cameron + + sys/sunaudio/: Attached find a patch that fixes a number of bugs with the SunAudio mixer plugin and fixes #344101: 1.... + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_open), (gst_sunaudiomixer_ctrl_build_list), + (gst_sunaudiomixer_ctrl_new), (gst_sunaudiomixer_ctrl_set_volume), + (gst_sunaudiomixer_ctrl_set_mute): + * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_class_init), + (gst_sunaudiosink_init), (gst_sunaudiosink_prepare), + (gst_sunaudiosink_write): + Attached find a patch that fixes a number of bugs with the SunAudio mixer + plugin and fixes #344101: + 1. The gst_sunaudiomixer_ctrl_build_list kept appending the same 3 tracks onto + the tracklist causing gnome-volume-control's preferences dialog to be messed + up and would core dump if you checked/unchecked any item. + 2. We weren't previously setting the MUTE flag properly. Fixing this makes + gnome-volume-control work better. + 3. Now we properly define the input track to be GST_MIXER_TRACK_INPUT and + the monitor to be GST_MIXER_TRACK_OUTPUT, so that makes gnome-volume-control + look better. + Also some minor cleanup in gstsunaudiosink.c. + +2006-06-09 17:12:52 +0000 Wim Taymans + + ext/jpeg/gstjpegdec.*: API: Added IDCT method property + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_idct_method_get_type), + (gst_jpeg_dec_class_init), (gst_jpeg_dec_init), + (gst_jpeg_dec_decode_indirect), (gst_jpeg_dec_decode_direct), + (gst_jpeg_dec_chain), (gst_jpeg_dec_sink_event), + (gst_jpeg_dec_set_property), (gst_jpeg_dec_get_property): + * ext/jpeg/gstjpegdec.h: + API: Added IDCT method property + Small cleanups. + Avoid dynamic allocation of trivial fixed structure. + Allocate enough space for temp 4:4:4 YUV buffers. Fixes #343661. + +2006-06-07 09:25:16 +0000 Zaheer Abbas Merali + + configure.ac: We now require libraw1394 >= 1.1.0 and that version onwards all have .pc files. + Original commit message from CVS: + 2006-06-07 Zaheer Abbas Merali + * configure.ac: + We now require libraw1394 >= 1.1.0 and that version onwards all + have .pc files. + +2006-06-02 15:02:54 +0000 Edward Hervey + + gst/law/alaw-decode.c: Trying to get items from an ANY or EMPTY caps is ... stupid. + Original commit message from CVS: + * gst/law/alaw-decode.c: (alawdec_getcaps): + Trying to get items from an ANY or EMPTY caps is ... stupid. + +2006-06-02 11:33:18 +0000 Edward Hervey + + ext/dv/gstdvdec.*: Added GstSegment handling, now implements dropping/clipping. + Original commit message from CVS: + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_sink_event), + (gst_dvdec_chain), (gst_dvdec_change_state): + * ext/dv/gstdvdec.h: + Added GstSegment handling, now implements dropping/clipping. + +2006-06-01 22:00:26 +0000 Stefan Kost + + 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-06-01 21:07:26 +0000 Stefan Kost + + Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass + Original commit message from CVS: + * ext/aalib/gstaasink.h: + * ext/annodex/gstcmmldec.h: + * ext/cairo/gsttimeoverlay.h: + * ext/dv/gstdvdec.h: + * ext/dv/gstdvdemux.h: + * ext/esd/esdmon.h: + * ext/esd/esdsink.h: + * ext/flac/gstflacenc.h: + * ext/gconf/gstgconfaudiosink.h: + * ext/gconf/gstgconfaudiosrc.h: + * ext/gconf/gstgconfvideosink.h: + * ext/gconf/gstgconfvideosrc.h: + * ext/gdk_pixbuf/gstgdkanimation.h: + * ext/gdk_pixbuf/pixbufscale.h: + * ext/hal/gsthalaudiosink.h: + * ext/hal/gsthalaudiosrc.h: + * ext/jpeg/gstjpegenc.h: + * ext/jpeg/gstsmokedec.h: + * ext/jpeg/gstsmokeenc.h: + * ext/libcaca/gstcacasink.h: + * ext/libmng/gstmngdec.h: + * ext/libmng/gstmngenc.h: + * ext/libpng/gstpngdec.h: + * ext/libpng/gstpngenc.h: + * ext/raw1394/gstdv1394src.h: + * ext/speex/gstspeexenc.h: + * gst/autodetect/gstautoaudiosink.h: + * gst/autodetect/gstautovideosink.h: + * gst/avi/gstavidemux.h: + * gst/cutter/gstcutter.h: + * gst/debug/efence.h: + * gst/debug/gstnavigationtest.h: + * gst/debug/gstnavseek.h: + * gst/flx/gstflxdec.h: + * gst/goom/gstgoom.h: + * gst/icydemux/gsticydemux.h: + * gst/id3demux/gstid3demux.h: + * gst/law/alaw-decode.h: + * gst/law/alaw-encode.h: + * gst/law/mulaw-decode.h: + * gst/law/mulaw-encode.h: + * gst/matroska/matroska-mux.h: + * gst/median/gstmedian.h: + * gst/oldcore/gstaggregator.h: + * gst/oldcore/gstfdsink.h: + * gst/oldcore/gstmd5sink.h: + * gst/oldcore/gstmultifilesrc.h: + * gst/oldcore/gstpipefilter.h: + * gst/oldcore/gstshaper.h: + * gst/oldcore/gststatistics.h: + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpdepay.h: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmpay.h: + * gst/rtp/gstrtph263pay.h: + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtpmp4gpay.h: + * gst/rtp/gstrtpmp4vdepay.h: + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadepay.h: + * gst/rtp/gstrtpmpapay.h: + * gst/rtp/gstrtppcmadepay.h: + * gst/rtp/gstrtppcmapay.h: + * gst/rtp/gstrtppcmudepay.h: + * gst/rtp/gstrtppcmupay.h: + * gst/rtp/gstrtpspeexdepay.h: + * gst/rtp/gstrtpspeexpay.h: + * gst/rtsp/gstrtpdec.h: + * gst/rtsp/gstrtspsrc.h: + * gst/smpte/gstsmpte.h: + * gst/udp/gstdynudpsink.h: + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.h: + * gst/videofilter/gstvideobalance.h: + * gst/videofilter/gstvideoflip.h: + * sys/oss/gstossdmabuffer.h: + * sys/oss/gstossmixerelement.h: + * sys/oss/gstosssink.h: + * sys/oss/gstosssrc.h: + * sys/osxvideo/osxvideosink.h: + * sys/sunaudio/gstsunaudiomixer.h: + * sys/sunaudio/gstsunaudiosink.h: + * sys/ximage/gstximagesrc.h: + Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass + +2006-05-31 16:23:54 +0000 Wim Taymans + + gst/goom/gstgoom.*: Handle QoS. + Original commit message from CVS: + * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), + (gst_goom_finalize), (gst_goom_reset), (gst_goom_sink_setcaps), + (gst_goom_src_setcaps), (gst_goom_src_event), + (gst_goom_sink_event), (get_buffer), (gst_goom_chain), + (gst_goom_change_state): + * gst/goom/gstgoom.h: + Handle QoS. + Handle flushing, discont and events. + Fix timestamps and various other cleanups. + +2006-05-31 15:37:16 +0000 Zaheer Abbas Merali + + ext/raw1394/gstdv1394src.c: Fix bus reset when using libiec61883 + Original commit message from CVS: + 2006-05-31 Zaheer Abbas Merali + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_bus_reset): + Fix bus reset when using libiec61883 + +2006-05-31 10:31:23 +0000 Zaheer Abbas Merali + + configure.ac: Detect libiec61883 and set necessary CFLAGS and LIBS for dv1394. + Original commit message from CVS: + 2006-05-31 Zaheer Abbas Merali + * configure.ac: + Detect libiec61883 and set necessary CFLAGS and LIBS for dv1394. + * ext/raw1394/Makefile.am: + Add CFLAGS. + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_iec61883_receive), + New method, to receive using libiec61883. + (gst_dv1394src_iso_receive), + #ifdef'd out if libiec61883 is present. + (gst_dv1394src_bus_reset), + Get userdata correctly if using libiec61883. + (gst_dv1394src_create), + When using libiec61883, only poll one fd and no need to read. + (gst_dv1394src_discover_avc_node), + Replace g_warnings. + (gst_dv1394src_start), + Create new handle when we know which dv port. More reliable + than setting port on an existing handle. Initialise libiec61883. + (gst_dv1394src_stop): + If using libiec61883, then cleanup its handle properly. + * ext/raw1394/gstdv1394src.h: + Add libiec61883 handle. + +2006-05-30 21:07:38 +0000 Sébastien Moutte + + gst/avi/gstavidemux.c: add an explicit dll imported declaration for GST_CAT_EVENT+WIN32 + Original commit message from CVS: + * gst/avi/gstavidemux.c: + add an explicit dll imported declaration for GST_CAT_EVENT+WIN32 + * win32/MANIFEST: + sort file listing + * win32/vs6/libgstavi.dsp: + add gstavimux.c to the project + * win32/vs6/libgstid3demux.dsp: + add link to zlib library + * win32/vs6/libgstmatroska.dsp: + add matroska-ids.c to the project + +2006-05-30 14:35:18 +0000 Sebastian Dröge + + Add apev2mux element (#343122). + Original commit message from CVS: + Patch by: Sebastian Dröge + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * ext/taglib/Makefile.am: + * ext/taglib/gstapev2mux.cc: + * ext/taglib/gstapev2mux.h: + * ext/taglib/gstid3v2mux.cc: + * ext/taglib/gsttaglibmux.c: (plugin_init): + * ext/taglib/gsttaglibmux.h: + Add apev2mux element (#343122). + * tests/check/Makefile.am: + * tests/check/elements/apev2mux.c: + (test_taglib_apev2mux_create_tags), + (test_taglib_apev2mux_check_tags), (fill_mp3_buffer), (got_buffer), + (demux_pad_added), (test_taglib_apev2mux_check_output_buffer), + (test_taglib_apev2mux_with_tags), (GST_START_TEST), + (apev2mux_suite), (main): + Add unit test for apev2mux element. + +2006-05-28 17:33:13 +0000 Tim-Philipp Müller + + gst/: GST_PTR_FORMAT should be used to print caps in debug statements. + Original commit message from CVS: + * gst/alpha/gstalphacolor.c: (gst_alpha_color_transform_caps): + * gst/debug/negotiation.c: (gst_negotiation_update_caps): + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps): + GST_PTR_FORMAT should be used to print caps in debug statements. + +2006-05-28 14:38:11 +0000 Sebastian Dröge + + gst/apetag/gstapedemux.c: Some clean-ups and additions: map APE 'file' tag to + Original commit message from CVS: + Patch by: Sebastian Dröge + * gst/apetag/gstapedemux.c: (ape_demux_get_gst_tag_from_tag), + (ape_demux_parse_tags): + Some clean-ups and additions: map APE 'file' tag to + GST_TAG_LOCATION (#343123); add support for extracting + the track count and clean up parsing a bit (#343127). + +2006-05-28 13:49:12 +0000 Edward Hervey + + ext/jpeg/gstjpegdec.c: Initialize segment to GST_FORMAT_UNDEFINED in READY->PAUSED. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_change_state): + Initialize segment to GST_FORMAT_UNDEFINED in READY->PAUSED. + +2006-05-28 13:30:13 +0000 Edward Hervey + + ext/jpeg/gstjpegdec.*: Clip outgoing buffers according to currently configured segment. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_finalize), + (gst_jpeg_dec_init), (gst_jpeg_dec_chain), + (gst_jpeg_dec_sink_event), (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Clip outgoing buffers according to currently configured segment. + +2006-05-28 10:39:00 +0000 Tim-Philipp Müller + + ext/taglib/gstid3v2mux.cc: Handle writing of track-count or album-volume-count without track-number or albume-volume... + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: + Handle writing of track-count or album-volume-count without + track-number or albume-volume-number (in this case the number + will just be set to 0). + * tests/check/elements/id3v2mux.c: (test_taglib_id3mux_check_tags): + It would be nice if we actually checked the values received for + track/album-volume number/count in _check_tags(), rather than + setting them again ... + +2006-05-28 10:05:47 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: A track/volume number or count of 0 does not make sense, just ignore it along with negati... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3v2_tag_to_taglist): + A track/volume number or count of 0 does not make sense, + just ignore it along with negative numbers (a tag might + only contain a track count without a track number). + +2006-05-27 13:11:37 +0000 Edward Hervey + + ext/jpeg/gstjpegdec.c: Abort decompression when receiving FLUSH_STOP. This should avoid issues when interrupting deco... + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), + (gst_jpeg_dec_sink_event): + Abort decompression when receiving FLUSH_STOP. This should avoid + issues when interrupting decoding with flushes. + +2006-05-27 12:10:50 +0000 Tim-Philipp Müller + + ext/flac/gstflac.c: Don't #include file we don't dist any longer. + Original commit message from CVS: + * ext/flac/gstflac.c: + Don't #include file we don't dist any longer. + +2006-05-27 11:27:59 +0000 Tim-Philipp Müller + + README: Replace current README (containing the release notes from some 0.9.x version) with a proper README taken from... + Original commit message from CVS: + * README: + Replace current README (containing the release notes from + some 0.9.x version) with a proper README taken from the core. + +2006-05-26 22:35:00 +0000 Stefan Kost + + gst/spectrum/: added another example + Original commit message from CVS: + * gst/spectrum/Makefile.am: + * gst/spectrum/demo-audiotest.c: (on_frequency_changed), + (spectrum_chain), (main): + * gst/spectrum/demo-osssrc.c: + added another example + * sys/v4l2/gstv4l2src.c: + fix typo + +2006-05-26 13:16:54 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Clip the outputed NEWSEGMENT stop time to the configured segment stop time. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment): + Clip the outputed NEWSEGMENT stop time to the configured segment stop + time. + +2006-05-26 11:48:44 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Don't clear the running variable in the seek code. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_do_seek): + Don't clear the running variable in the seek code. + +2006-05-24 16:03:40 +0000 Wim Taymans + + ext/dv/gstdvdemux.c: Implement EOS correctly by either posting + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_loop): + Implement EOS correctly by either posting + SEGMENT_DONE or pushing an EOS message depending + on the seek type. Fixes #342592 + +2006-05-24 11:56:43 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Detect QCELP in mp4a descriptors. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_esds): + Detect QCELP in mp4a descriptors. + +2006-05-24 10:00:50 +0000 Wim Taymans + + gst/law/: Some cleanups in the chain functions. + Original commit message from CVS: + * gst/law/alaw-decode.c: (gst_alawdec_chain): + * gst/law/alaw-decode.h: + * gst/law/alaw-encode.c: (gst_alawenc_chain): + * gst/law/alaw-encode.h: + * gst/law/mulaw-decode.c: (gst_mulawdec_chain): + * gst/law/mulaw-decode.h: + * gst/law/mulaw-encode.c: (gst_mulawenc_chain): + * gst/law/mulaw-encode.h: + Some cleanups in the chain functions. + Remove some GStreamer 0.0.2 bits. + +2006-05-23 20:15:04 +0000 Mark Nauwelaerts + + gst/matroska/matroska-mux.c: gst_collect_pads_stop() needs to be called before chaining up to the parent class (#3427... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/matroska/matroska-mux.c: (gst_matroska_mux_change_state): + gst_collect_pads_stop() needs to be called before chaining up + to the parent class (#342734). + +2006-05-23 16:45:22 +0000 Tim-Philipp Müller + + ext/flac/: Remove backwards compatibility cruft for dealing with FLAC API changes in the 1.0.x series - we require 1.... + Original commit message from CVS: + * ext/flac/Makefile.am: + * ext/flac/flac_compat.h: + * ext/flac/gstflac.c: + * ext/flac/gstflacdec.c: (gst_flac_dec_init): + * ext/flac/gstflacenc.c: + Remove backwards compatibility cruft for dealing with FLAC API + changes in the 1.0.x series - we require 1.1.1 or newer these days. + +2006-05-23 13:44:11 +0000 Tim-Philipp Müller + + gst/matroska/: Add support for muxing/demuxing theora video (#342448; too bad none of the usual linux players can act... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_push_xiph_codec_priv_data), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps): + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init), + (gst_matroska_mux_video_pad_setcaps), + (xiph3_streamheader_to_codecdata), + (vorbis_streamheader_to_codecdata), + (theora_streamheader_to_codecdata), + (gst_matroska_mux_audio_pad_setcaps), + (gst_matroska_mux_write_data): + Add support for muxing/demuxing theora video (#342448; too bad + none of the usual linux players can actually play this). Playback + in GStreamer will require additional changes to theoradec in -base. + Refactor streamheaders <=> CodecPrivateData code a bit; some small + cleanups. + +2006-05-22 18:00:52 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: po/POTFILES.in: + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), (plugin_init): + po/POTFILES.in: + Throw an error when the file is encrypted. Move plugin_init stuff + to the end of the file, add stuff for i18n, make debug category + static. + +2006-05-22 15:23:05 +0000 Tim-Philipp Müller + + ext/jpeg/gstjpegdec.c: Fix crashes when the horizontal subsampling is 1. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (hresamplecpy1), + (gst_jpeg_dec_decode_indirect), (gst_jpeg_dec_chain): + Fix crashes when the horizontal subsampling is 1. + Fixes #342097. + +2006-05-22 14:56:29 +0000 Thomas Vander Stichele + + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmpay.h: + * gst/rtp/gstrtph263pay.h: + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtpmp4gpay.h: + * gst/rtp/gstrtpmp4vdepay.h: + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadepay.h: + * gst/rtp/gstrtpmpapay.h: + cover up the dirty truth + Original commit message from CVS: + cover up the dirty truth + +2006-05-22 13:53:18 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.*: - add odml (large file) index support + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/avi/gstavimux.c: (gst_avi_mux_finalize), (gst_avi_mux_init), + (gst_avi_mux_vidsink_set_caps), (gst_avi_mux_audsink_set_caps), + (gst_avi_mux_write_tag), (gst_avi_mux_riff_get_avi_header), + (gst_avi_mux_riff_get_avix_header), (gst_avi_mux_write_avix_index), + (gst_avi_mux_add_index), (gst_avi_mux_bigfile), + (gst_avi_mux_start_file), (gst_avi_mux_stop_file), + (gst_avi_mux_handle_event), (gst_avi_mux_do_audio_buffer), + (gst_avi_mux_do_video_buffer), (gst_avi_mux_do_one_buffer), + (gst_avi_mux_change_state): + * gst/avi/gstavimux.h: + Some enhancements for avimux (#342526): + - add odml (large file) index support + - store codec init data (e.g. huffyuv) + - miscellaneous other fixes/cleanups + +2006-05-22 13:51:30 +0000 Thomas Vander Stichele + + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + fix descriptions and license blocks cut and paste anyone ? + Original commit message from CVS: + fix descriptions and license blocks + cut and paste anyone ? + +2006-05-21 16:41:44 +0000 Stefan Kost + + gst/spectrum/gstspectrum.c: Use boilerplate macro, fix strings to match plugin-moval-requirements + Original commit message from CVS: + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), + (gst_spectrum_init), (gst_spectrum_set_sink_caps), + (gst_spectrum_get_sink_caps), (gst_spectrum_chain): + Use boilerplate macro, fix strings to match plugin-moval-requirements + +2006-05-21 16:23:23 +0000 Stefan Kost + + gst/spectrum/Makefile.am: Link to base libraries + Original commit message from CVS: + * gst/spectrum/Makefile.am: + Link to base libraries + * gst/spectrum/demo-osssrc.c: (main): + use new threshhold property + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), + (gst_spectrum_init), (gst_spectrum_dispose), + (gst_spectrum_set_property), (gst_spectrum_set_sink_caps), + (gst_spectrum_get_sink_caps), (gst_spectrum_chain), + (gst_spectrum_change_state): + * gst/spectrum/gstspectrum.h: + Use gst_adapter, support multiple-channels, add threshold property for + result, add docs, fix resulting spectrum range (was including mirrored + results) + +2006-05-20 22:42:15 +0000 Stefan Kost + + Initial port of the spectrum element + Original commit message from CVS: + * configure.ac: + * gst/spectrum/demo-osssrc.c: (spectrum_chain), (main): + * gst/spectrum/fix_fft.c: (gst_spectrum_fix_dot): + * gst/spectrum/gstspectrum.c: (gst_spectrum_get_type), + (gst_spectrum_base_init), (gst_spectrum_class_init), + (gst_spectrum_init), (gst_spectrum_dispose), + (gst_spectrum_set_property), (gst_spectrum_chain): + * gst/spectrum/gstspectrum.h: + Initial port of the spectrum element + +2006-05-19 18:58:05 +0000 Edgard Lima + + * sys/v4l2/gstv4l2xoverlay.c: + I forget to add sys/v4l2/gstv4l2xoverlay.c in las commit + Original commit message from CVS: + I forget to add sys/v4l2/gstv4l2xoverlay.c in las commit + +2006-05-19 18:31:25 +0000 Edgard Lima + + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: + Some clean-ups requested by wingo in bug #338818. + Original commit message from CVS: + Some clean-ups requested by wingo in bug #338818. + +2006-05-19 14:05:53 +0000 Jan Schmidt + + gst/id3demux/id3v2frames.c: Don't output any tag when we encounter a negative track number - the tag type is uint, so... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3v2_tag_to_taglist): + Don't output any tag when we encounter a negative track number - the + tag type is uint, so we end up outputting huge positive numbers + instead. (Fixes: #342029) + +2006-05-18 23:04:59 +0000 Thomas Vander Stichele + + configure.ac: update for new GSTPB_PLUGINS_DIR + Original commit message from CVS: + * configure.ac: + update for new GSTPB_PLUGINS_DIR + +2006-05-18 19:34:47 +0000 Stefan Kost + + configure.ac: Check for X11 + Original commit message from CVS: + * configure.ac: + Check for X11 + * sys/v4l2/gstv4l2object.c: (gst_v4l2_class_probe_devices): + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_iface_supported): + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): + * sys/v4l2/gstv4l2xoverlay.h: + Code cleanups, fix debug macros + +2006-05-18 14:45:33 +0000 Philippe Kalaf + + rtp/gst/gstrtph263pay.c: Properly set static caps for H263 at 34. + Original commit message from CVS: + 2006-05-18 Philippe Kalaf + * rtp/gst/gstrtph263pay.c: + Properly set static caps for H263 at 34. + +2006-05-18 12:46:08 +0000 James Doc Livingston + + ext/taglib/gsttaglibmux.c: Merge event tags and tag setter tags correctly (#339918). Also, don't leak taglist in case... + Original commit message from CVS: + Patch by: James "Doc" Livingston + * ext/taglib/gsttaglibmux.c: (gst_tag_lib_mux_render_tag): + Merge event tags and tag setter tags correctly (#339918). Also, + don't leak taglist in case of an error. + +2006-05-17 18:09:06 +0000 Philippe Kalaf + + * common: + * gst/rtp/gstrtph263pay.c: + Fixed caps for H263 (not the same as H263+) + Original commit message from CVS: + Fixed caps for H263 (not the same as H263+) + +2006-05-17 12:36:26 +0000 Edward Hervey + + gst/law/mulaw-decode.c: We can only do caps intersection if the othercaps are non-empty and not + Original commit message from CVS: + * gst/law/mulaw-decode.c: (mulawdec_getcaps): + We can only do caps intersection if the othercaps are non-empty and not + ANY. Else we return the pad template (base_caps). + +2006-05-17 11:20:44 +0000 Tim-Philipp Müller + + ext/jpeg/gstjpegdec.c: Fix crash when outputting debugging information for certain pictures (always good to use the r... + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): + Fix crash when outputting debugging information for certain + pictures (always good to use the right struct member for + the number of records in an array). + +2006-05-17 08:10:31 +0000 Jindrich Makovicka + + gst/matroska/ebml-read.c: Don't create unnecessary sub-buffers all the time. Dramatically improves performance with m... + Original commit message from CVS: + Patch by: Jindrich Makovicka + * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes), + (gst_ebml_read_pull_bytes), (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_read_buffer), + (gst_ebml_read_bytes), (gst_ebml_read_uint), (gst_ebml_read_sint), + (gst_ebml_read_float), (gst_ebml_read_ascii), + (gst_ebml_read_binary): + Don't create unnecessary sub-buffers all the time. Dramatically + improves performance with multiple concurrently running + matroskademux instances (#341818) (and avoids doing + unnecessarily inefficient things in the general case). + +2006-05-16 17:20:04 +0000 Edward Hervey + + ext/libpng/gstpngenc.c: In snapshot mode, we always return GST_FLOW_UNEXPECTED whatever the return value of gst_pad_p... + Original commit message from CVS: + * ext/libpng/gstpngenc.c: (gst_pngenc_chain): + In snapshot mode, we always return GST_FLOW_UNEXPECTED whatever the + return value of gst_pad_push_event(). + +2006-05-16 14:07:29 +0000 Jan Schmidt + + gst/autodetect/: Make the name of the child element be based on the name of the parent, so that debug output is more ... + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_find_best): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_find_best): + Make the name of the child element be based on the name of the + parent, so that debug output is more useful. + * gst/id3demux/id3v2frames.c: (find_utf16_bom), + (parse_insert_string_field), (parse_split_strings): + Rework string parsing to always walk over BOM markers in UTF16 + strings, using the endianness indicated by the innermost one, + then trying the opposite endianness if that fails to convert + to valid UTF-8. Fixes #341774 + +2006-05-16 13:31:02 +0000 Zaheer Abbas Merali + + ext/libpng/Makefile.am: Add LIBPNG_CFLAGS. + Original commit message from CVS: + 2006-05-16 Zaheer Abbas Merali + Patch from: Matthieu + * ext/libpng/Makefile.am: + Add LIBPNG_CFLAGS. + +2006-05-15 11:20:21 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + update with latest changes + Original commit message from CVS: + update with latest changes + +2006-05-15 09:00:42 +0000 Tim-Philipp Müller + + ext/taglib/gstid3v2mux.cc: Add support for writing images (APIC frames) into ID3v2 tags (picture type always set to '... + Original commit message from CVS: + * ext/taglib/gstid3v2mux.cc: + Add support for writing images (APIC frames) into ID3v2 + tags (picture type always set to 'other' for now though). + +2006-05-14 12:50:07 +0000 Michael Smith + + gst/wavparse/gstwavparse.c: Update docs; wavparse implements push and pull modes. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: + Update docs; wavparse implements push and pull modes. + +2006-05-12 18:10:36 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Ooops, bitten by the copy-and-paste design paradigm, fixes seek again. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_index_next), + (gst_avi_demux_parse_index), (gst_avi_demux_massage_index), + (gst_avi_demux_handle_seek), (gst_avi_demux_loop): + Ooops, bitten by the copy-and-paste design paradigm, fixes + seek again. + +2006-05-12 18:04:22 +0000 Wim Taymans + + gst/avi/gstavidemux.*: Some cleanups, prepare to use GstSegment. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_index_next), (gst_avi_demux_handle_src_query), + (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_subindex), + (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), + (gst_avi_demux_stream_index), (gst_avi_demux_stream_scan), + (gst_avi_demux_massage_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_push_event), (gst_avi_demux_stream_header), + (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), + (gst_avi_demux_loop): + * gst/avi/gstavidemux.h: + Some cleanups, prepare to use GstSegment. + Fix error in entry walking code. + Fix VBR detection. + Smarter timestamp calculation code. + Uniform error/eos handling. + +2006-05-12 17:44:15 +0000 Michael Smith + + gst/wavparse/gstwavparse.c: Fix use of uninitialised values if we're NOT seeking in ready. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt), + (gst_wavparse_perform_seek), (gst_wavparse_stream_headers): + Fix use of uninitialised values if we're NOT seeking in ready. + Fix typos. + +2006-05-12 08:23:18 +0000 Tim-Philipp Müller + + gst/wavparse/Makefile.am: Add CFLAGS and LIBS for libgstbase, fixes build on + Original commit message from CVS: + * gst/wavparse/Makefile.am: + Add CFLAGS and LIBS for libgstbase, fixes build on + Cygwin (#341489). + +2006-05-12 08:21:37 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: Some more debug info. No need to check whether the string returned by g_convert() is real... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (parse_insert_string_field): + Some more debug info. No need to check whether the string + returned by g_convert() is really UTF-8 - either it is or + we get NULL returned. + +2006-05-11 17:59:59 +0000 Edgard Lima + + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2colorbalance.c: + * sys/v4l2/gstv4l2colorbalance.h: + * sys/v4l2/gstv4l2element.c: + * sys/v4l2/gstv4l2element.h: + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2object.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/gstv4l2xoverlay.c: + * sys/v4l2/gstv4l2xoverlay.h: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + Changes proposed by Wingo in bug #338818. + Original commit message from CVS: + Changes proposed by Wingo in bug #338818. + +2006-05-11 09:09:49 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Figure out the real audio type in mp4a boxes by parsing the optional descriptors in the option... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_parse_trak), + (gst_qtdemux_handle_esds): + Figure out the real audio type in mp4a boxes by parsing the + optional descriptors in the optional esds box. Promote the + default AAC to mp3 when indicated. Fixes #330632. + +2006-05-10 17:44:50 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Parse version 2 sample descriptions. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_dump_unknown), + (qtdemux_parse_trak), (gst_qtdemux_handle_esds): + Parse version 2 sample descriptions. + Don't #define gst_util_dump_mem(), use something more + specific instead to avoid confusion. + +2006-05-10 13:51:01 +0000 Jan Schmidt + + gst/id3demux/id3v2frames.c: Fix parsing of numeric genre strings some more, by ensuring that we only try and parse st... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3v2_genre_fields_to_taglist): + Fix parsing of numeric genre strings some more, by ensuring that + we only try and parse strings that a) Start with '(' and b) Consist + only of digits. + Also, when finding an escaping '((' sequence, bust it back to '(' by + swallowing the first parenthesis + +2006-05-10 11:17:31 +0000 Tim-Philipp Müller + + ext/esd/esdsink.*: Move the esd_get_server_info() into gst_esdsink_open() and fail with a decent error message on err... + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_finalize), (gst_esdsink_getcaps), + (gst_esdsink_open), (gst_esdsink_close): + * ext/esd/esdsink.h: + Move the esd_get_server_info() into gst_esdsink_open() and fail + with a decent error message on errors. + +2006-05-10 10:29:54 +0000 Tim-Philipp Müller + + Const-ify GEnumValue arrays. + Original commit message from CVS: + * ext/esd/esdmon.c: (gst_esdmon_depths_get_type), + (gst_esdmon_channels_get_type): + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_profile_get_type): + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_method_get_type): + * ext/libcaca/gstcacasink.c: (gst_cacasink_dither_get_type): + * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type): + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type): + * gst/rtp/gstrtpilbcdepay.c: (gst_ilbc_mode_get_type): + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type): + * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type): + * gst/videofilter/gstvideoflip.c: (gst_video_flip_method_get_type): + * gst/videomixer/videomixer.c: + (gst_video_mixer_background_get_type): + Const-ify GEnumValue arrays. + +2006-05-09 14:08:15 +0000 Mark Nauwelaerts + + gst/avi/gstavimux.c: Work around gst_buffer_make_metadata_writable() bug that results in avimux marking all frames in... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/avi/gstavimux.c: (gst_avi_mux_do_audio_buffer), + (gst_avi_mux_do_video_buffer): + Work around gst_buffer_make_metadata_writable() bug that + results in avimux marking all frames in the index as + keyframes (#340859). + +2006-05-08 19:21:18 +0000 Martin Rubli + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + Fix fourcc name printed out. Patch from Martin Rubli. + Original commit message from CVS: + Fix fourcc name printed out. Patch from Martin Rubli. + +2006-05-08 15:20:10 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Don't cause side effects in a debugging function. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_query), + (qtdemux_dump_mvhd): + Don't cause side effects in a debugging function. + Also report duration in push mode since we can. + +2006-05-08 14:35:20 +0000 Wim Taymans + + gst/rtsp/rtspurl.c: Make parsing of urls suck slightly less. + Original commit message from CVS: + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + Make parsing of urls suck slightly less. + +2006-05-08 11:53:03 +0000 Edward Hervey + + autogen.sh: libtoolize on Darwin/MacOSX is called glibtoolize. + Original commit message from CVS: + * autogen.sh: (CONFIGURE_DEF_OPT): + libtoolize on Darwin/MacOSX is called glibtoolize. + +2006-05-08 10:59:05 +0000 Jens Granseuer + + C89 compliance fixes. Fixes #340980 + Original commit message from CVS: + Patch by: Jens Granseuer + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_init): + * gst/wavparse/gstwavparse.c: (gst_wavparse_dispose): + C89 compliance fixes. Fixes #340980 + +2006-05-06 09:01:34 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.*: Handle segment seeks that include the end of the file as stop point properly: when the decoder... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_loop): + * ext/flac/gstflacdec.h: + Handle segment seeks that include the end of the file as stop point + properly: when the decoder hits EOS we want to send a SEGMENT_DONE + message instead of an EOS event in case we're in segment seek + mode (fixes #340699). + +2006-05-06 00:14:09 +0000 Maciej Katafiasz + + * ChangeLog: + * ext/cairo/gsttextoverlay.c: + * ext/flac/gstflacdec.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/wavpack/gstwavpackdec.c: + * gst/apetag/gstapedemux.c: + * gst/debug/breakmydata.c: + * gst/debug/testplugin.c: + * gst/matroska/ebml-write.c: + * gst/multipart/multipartdemux.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + Add semicolons after GST_BOILERPLATE[_FULL] so that indent doesn't mess up following lines. + Original commit message from CVS: + Add semicolons after GST_BOILERPLATE[_FULL] so that indent doesn't mess up following lines. + +2006-05-05 20:12:59 +0000 Martin Rubli + + * sys/v4l2/gstv4l2element.c: + * sys/v4l2/gstv4l2element.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + * tests/icles/v4l2src-test.c: + Some changes proposed by wingo in bug #338818 (but not everything yet). Patch from Martin Rubli to fix framerate dete... + Original commit message from CVS: + Some changes proposed by wingo in bug #338818 (but not everything yet). Patch from Martin Rubli to fix framerate detection. + +2006-05-04 17:27:27 +0000 Michal Benes + + gst/matroska/matroska-demux.c: Don't leak caps when freeing the stream context (#340623). + Original commit message from CVS: + Patch by: Michal Benes + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset): + Don't leak caps when freeing the stream context (#340623). + +2006-05-04 15:40:18 +0000 Jan Schmidt + + configure.ac: Back to CVS + Original commit message from CVS: + * configure.ac: + Back to CVS + +=== release 0.10.3 === + +2006-05-04 15:36:02 +0000 Jan Schmidt + + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * win32/common/config.h: + Really release 0.10.3 + Original commit message from CVS: + Really release 0.10.3 + +2006-05-04 15:28:53 +0000 Jan Schmidt + + * docs/plugins/inspect/plugin-qtdemux.xml: + Really release 0.10.3 this time + Original commit message from CVS: + Really release 0.10.3 this time + +2006-05-04 15:05:00 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-icydemux.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-ladspa.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-qtdemux.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/plugins/inspect/plugin-ximagesrc.xml: + * win32/common/config.h: + Release 0.10.3 + Original commit message from CVS: + Release 0.10.3 + +2006-05-03 18:44:38 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2006-05-03 18:41:47 +0000 Tim-Philipp Müller + + gst/matroska/matroska-mux.c: Don't strcmp() NULL strings. + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_stream_is_vorbis_header), + (gst_matroska_mux_write_data): + Don't strcmp() NULL strings. + Only start new clusters on video keyframes, not on any + random audio buffer that doesn't have the DELTA_UNIT + flag set (fixes 'make check' again). + +2006-05-03 14:51:50 +0000 Mark Nauwelaerts + + gst/matroska/matroska-mux.c: Don't misinterpret GST_CLOCK_TIME_NONE as very high timestamp value and then dead-lock w... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/matroska/matroska-mux.c: (gst_matroska_mux_best_pad), + (gst_matroska_mux_stream_is_vorbis_header), + (gst_matroska_mux_write_data): + Don't misinterpret GST_CLOCK_TIME_NONE as very high timestamp + value and then dead-lock when muxing vorbis audio streams + (the three vorbis header buffers carry no timestamp, and it + would try to mux these after all video buffers). Fixes #340346. + Improve clustering: start a new cluster also whenever we get + a keyframe. + +2006-05-03 14:30:21 +0000 Jan Schmidt + + gst/qtdemux/qtdemux.c: Clean up one piece of logic slightly and remove a dead code block. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Clean up one piece of logic slightly and remove a + dead code block. + +2006-05-03 14:28:57 +0000 Thomas Vander Stichele + + add win32 stuff + Original commit message from CVS: + * Makefile.am: + * configure.ac: + * win32/common/config.h.in: + add win32 stuff + +2006-05-03 14:26:51 +0000 Thomas Vander Stichele + + add win32 stuff + Original commit message from CVS: + * Makefile.am: + * configure.ac: + * win32/common/config.h.in: + add win32 stuff + +2006-05-02 22:34:52 +0000 Michael Smith + + ext/cairo/gsttimeoverlay.c: Fix timeoverlay for non-multiple-of-4 widths. This fourcc crap + Original commit message from CVS: + * ext/cairo/gsttimeoverlay.c: (gst_cairo_time_overlay_transform): + Fix timeoverlay for non-multiple-of-4 widths. This fourcc crap + SUCKS. + +2006-05-02 21:52:48 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + Fix get_caps func to work when no framerate is available and the caps isn't simple. + Original commit message from CVS: + Fix get_caps func to work when no framerate is available and the caps isn't simple. + +2006-05-02 18:50:23 +0000 Stefan Kost + + gst/: don't leak caps-string + Original commit message from CVS: + * gst/alpha/gstalphacolor.c: (gst_alpha_color_transform_caps): + * gst/debug/negotiation.c: (gst_negotiation_update_caps): + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps): + don't leak caps-string + +2006-05-02 15:46:02 +0000 Tim-Philipp Müller + + gst/id3demux/gstid3demux.c: Let core insert default error message for TYPE_NOT_FOUND errors, it's just as good as our... + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_chain), + (gst_id3demux_sink_activate): + Let core insert default error message for TYPE_NOT_FOUND + errors, it's just as good as our own and has the added + bonus of being translated. + +2006-05-02 15:40:15 +0000 Tim-Philipp Müller + + gst/: Post an error message when we get an EOS event and were not able to find out the type of stream. + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_init), + (gst_tag_demux_sink_event): + * gst/id3demux/gstid3demux.c: (gst_id3demux_init), + (gst_id3demux_sink_event): + Post an error message when we get an EOS event and were not + able to find out the type of stream. + * tests/check/elements/id3v2mux.c: (fill_mp3_buffer), (got_buffer), + (test_taglib_id3mux_with_tags): + Decrease num-buffers to 16 per iteration again, otherwise the + many memcpy()s and reallocations in the test will hammer slow + CPUs completely and make the test timeout. + +2006-05-02 13:24:38 +0000 Thomas Vander Stichele + + configure.ac: figure out where plugins-base plugins are + Original commit message from CVS: + * configure.ac: + figure out where plugins-base plugins are + * tests/check/Makefile.am: + use plugins-base plugins, so we have typefind functions + * tests/check/elements/id3v2mux.c: (test_taglib_id3mux_with_tags): + increase num-buffers, this makes sure the test errors out instead + of timing out when no typefind functions are present + +2006-05-02 13:01:50 +0000 Thomas Vander Stichele + + * gst/wavparse/gstwavparse.c: + fix docs for wavparse + Original commit message from CVS: + fix docs for wavparse + +2006-05-01 21:37:51 +0000 Edgard Lima + + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2colorbalance.c: + * sys/v4l2/gstv4l2xoverlay.c: + * sys/v4l2/v4l2_calls.c: + * tests/icles/v4l2src-test.c: + Few improvements to move to good. + Original commit message from CVS: + Few improvements to move to good. + +2006-05-01 11:46:33 +0000 Thomas Vander Stichele + + docs/plugins/Makefile.am: also check .cc files for gtk-doc markup + Original commit message from CVS: + * docs/plugins/Makefile.am: + also check .cc files for gtk-doc markup + * configure.ac: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * tests/check/Makefile.am: + * tests/check/elements/id3v2mux.c: (id3v2mux_suite), (main): + * ext/Makefile.am: + * ext/taglib/Makefile.am: + * ext/taglib/gstid3v2mux.h: + * ext/taglib/gsttaglibmux.c: + * ext/taglib/gsttaglibmux.h: + move taglib-based id3v2muxer to -good. Fixes #336110. + +2006-05-01 11:45:15 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-icydemux.xml: + add icydemux inspection + Original commit message from CVS: + add icydemux inspection + +2006-05-01 11:43:31 +0000 Thomas Vander Stichele + + * po/POTFILES.in: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + add ximagesrc for translation + Original commit message from CVS: + add ximagesrc for translation + +2006-04-30 16:16:59 +0000 Thomas Vander Stichele + + * ext/taglib/gstid3v2mux.cc: + * ext/taglib/gsttaglibmux.c: + small cleanups + Original commit message from CVS: + small cleanups + +2006-04-30 15:32:13 +0000 Thomas Vander Stichele + + * ext/taglib/gstid3v2mux.cc: + fix docs + Original commit message from CVS: + fix docs + +2006-04-30 14:55:15 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-qtdemux.xml: + * docs/plugins/inspect/plugin-taglib.xml: + update to latest version + Original commit message from CVS: + update to latest version + +2006-04-29 18:46:36 +0000 Tim-Philipp Müller + + ext/taglib/gsttaglib.cc: Post an error message on the bus in the (extremely unlikely) case of an error. + Original commit message from CVS: + * ext/taglib/gsttaglib.cc: + Post an error message on the bus in the (extremely unlikely) + case of an error. + +2006-04-29 18:18:24 +0000 Tim-Philipp Müller + + ext/taglib/: Split the actual ID3v2 tag rendering code into its own subclass. + Original commit message from CVS: + * ext/taglib/Makefile.am: + * ext/taglib/gstid3v2mux.cc: + * ext/taglib/gstid3v2mux.h: + * ext/taglib/gsttaglib.cc: + * ext/taglib/gsttaglib.h: + Split the actual ID3v2 tag rendering code into + its own subclass. + +2006-04-29 16:14:20 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: ... and fix multichannel/WAVFORMATEX support again. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + ... and fix multichannel/WAVFORMATEX support again. + +2006-04-28 23:09:17 +0000 Stefan Kost + + gst/wavparse/gstwavparse.*: Add push (streaming) mode to wavparse (fixes #337625) + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_class_init), (gst_wavparse_dispose), + (gst_wavparse_reset), (gst_wavparse_init), + (gst_wavparse_create_sourcepad), (gst_wavparse_parse_adtl), + (gst_wavparse_parse_cues), (gst_wavparse_parse_file_header), + (gst_wavparse_stream_init), (gst_wavparse_perform_seek), + (gst_wavparse_peek_chunk_info), (gst_wavparse_peek_chunk), + (gst_wavparse_stream_headers), (gst_wavparse_parse_stream_init), + (gst_wavparse_send_event), (gst_wavparse_add_src_pad), + (gst_wavparse_stream_data), (gst_wavparse_loop), + (gst_wavparse_chain), (gst_wavparse_srcpad_event), + (gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull), + (gst_wavparse_change_state), (plugin_init): + * gst/wavparse/gstwavparse.h: + Add push (streaming) mode to wavparse (fixes #337625) + +2006-04-28 21:43:07 +0000 Thomas Vander Stichele + + * tests/check/elements/id3v2mux.c: + element renamed + Original commit message from CVS: + element renamed + +2006-04-28 19:22:46 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-ximagesrc.xml: + add plugin docs for ximagesrc + Original commit message from CVS: + add plugin docs for ximagesrc + +2006-04-28 19:15:08 +0000 Thomas Vander Stichele + + add ximagesrc icles test + Original commit message from CVS: + * configure.ac: + * tests/Makefile.am: + add ximagesrc icles test + +2006-04-28 18:57:09 +0000 Thomas Vander Stichele + + Move ximagesrc plug-in to good after review. Fixes #336756. + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_class_init), + (gst_cmml_enc_push_clip): + * sys/Makefile.am: + * sys/ximage/Makefile.am: + * sys/ximage/gstximagesrc.c: + Move ximagesrc plug-in to good after review. Fixes #336756. + +2006-04-28 16:51:33 +0000 Thomas Vander Stichele + + * sys/ximage/gstximagesrc.c: + * sys/ximage/gstximagesrc.h: + borgify naming + Original commit message from CVS: + borgify naming + +2006-04-28 16:46:52 +0000 Thomas Vander Stichele + + * sys/ximage/gstximagesrc.c: + doc tweaks + Original commit message from CVS: + doc tweaks + +2006-04-28 16:15:20 +0000 Thomas Vander Stichele + + * sys/ximage/Makefile.am: + * sys/ximage/gstximagesrc.c: + clean up Makefile.am + Original commit message from CVS: + clean up Makefile.am + +2006-04-28 15:33:09 +0000 Thomas Vander Stichele + + * ext/taglib/gsttaglibmux.c: + * ext/taglib/gsttaglibmux.h: + pedantic cleanups + Original commit message from CVS: + pedantic cleanups + +2006-04-28 14:57:57 +0000 Michael Smith + + gst/icydemux/gsticydemux.*: Fix event handling: cache events when typefinding and forward later. + Original commit message from CVS: + * gst/icydemux/gsticydemux.c: (gst_icydemux_reset), (gst_icydemux_init), (gst_icydemux_sink_setcaps), + (gst_icydemux_add_srcpad), (gst_icydemux_parse_and_send_tags), + (gst_icydemux_handle_event), (gst_icydemux_send_cached_events), + (gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta), + (gst_icydemux_chain), (gst_icydemux_send_tag_event): + * gst/icydemux/gsticydemux.h: + Fix event handling: cache events when typefinding and forward later. + +2006-04-28 14:55:20 +0000 Zaheer Abbas Merali + + sys/osxaudio/gstosxaudiosink.c: Register osxaudiosrc to the plugin. + Original commit message from CVS: + 2006-04-28 Zaheer Abbas Merali + * sys/osxaudio/gstosxaudiosink.c: + (plugin_init): + Register osxaudiosrc to the plugin. + * sys/osxaudio/gstosxaudiosrc.c: + (gst_osx_audio_src_osxelement_do_init), + (gst_osx_audio_src_base_init), (gst_osx_audio_src_class_init), + (gst_osx_audio_src_init), (gst_osx_audio_src_set_property), + (gst_osx_audio_src_get_property), + (gst_osx_audio_src_create_ringbuffer), (gst_osx_audio_src_io_proc), + (gst_osx_audio_src_osxelement_init): + * sys/osxaudio/gstosxaudiosrc.h: + Port of osxaudiosrc to 0.10. + * sys/osxaudio/Makefile.am: + Add osxaudiosrc + +2006-04-28 12:00:39 +0000 Zaheer Abbas Merali + + * ChangeLog: + commit Changelog for previous commit + Original commit message from CVS: + commit Changelog for previous commit + +2006-04-28 11:57:39 +0000 Zaheer Abbas Merali + + * sys/osxaudio/gstosxringbuffer.c: + * sys/osxaudio/gstosxringbuffer.h: + Forgot to commit, quick commit be4 apple dies + Original commit message from CVS: + Forgot to commit, quick commit be4 apple dies + +2006-04-28 11:37:22 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: Recognise and skip any byte order marker (BOM) in + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (has_utf16_bom), + (parse_split_strings): + Recognise and skip any byte order marker (BOM) in + UTF-16 strings. + +2006-04-27 16:05:54 +0000 Tim-Philipp Müller + + Add docs for both avidemux and avimux. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-avi.xml: + * gst/avi/gstavidemux.c: + * gst/avi/gstavimux.c: + Add docs for both avidemux and avimux. + +2006-04-27 14:51:06 +0000 Mark Nauwelaerts + + gst/avi/: Port AVI muxer to GStreamer-0.10 (#332031). + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/avi/Makefile.am: + * gst/avi/gstavi.c: (plugin_init): + * gst/avi/gstavimux.c: (gst_avi_mux_get_type), + (gst_avi_mux_base_init), (gst_avi_mux_finalize), + (gst_avi_mux_class_init), (gst_avi_mux_init), + (gst_avi_mux_vidsink_set_caps), (gst_avi_mux_audsink_set_caps), + (gst_avi_mux_pad_link), (gst_avi_mux_pad_unlink), + (gst_avi_mux_request_new_pad), (gst_avi_mux_release_pad), + (gst_avi_mux_write_tag), (gst_avi_mux_riff_get_avi_header), + (gst_avi_mux_riff_get_avix_header), + (gst_avi_mux_riff_get_video_header), + (gst_avi_mux_riff_get_audio_header), (gst_avi_mux_add_index), + (gst_avi_mux_write_index), (gst_avi_mux_bigfile), + (gst_avi_mux_start_file), (gst_avi_mux_stop_file), + (gst_avi_mux_restart_file), (gst_avi_mux_handle_event), + (gst_avi_mux_fill_queue), (gst_avi_mux_send_pad_data), + (gst_avi_mux_strip_buffer), (gst_avi_mux_do_audio_buffer), + (gst_avi_mux_do_video_buffer), (gst_avi_mux_do_one_buffer), + (gst_avi_mux_loop), (gst_avi_mux_collect_pads), + (gst_avi_mux_get_property), (gst_avi_mux_set_property), + (gst_avi_mux_change_state): + * gst/avi/gstavimux.h: + Port AVI muxer to GStreamer-0.10 (#332031). + * tests/check/Makefile.am: + * tests/check/elements/avimux.c: + * tests/check/elements/.cvsignore: + Add unit test for AVI muxer. + +2006-04-26 21:29:45 +0000 Stefan Kost + + gst/wavparse/gstwavparse.*: reverted patch #337625 for the price of 1 hour sleep + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_class_init), (gst_wavparse_reset), + (gst_wavparse_init), (gst_wavparse_create_sourcepad), + (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), + (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), + (gst_wavparse_send_event), (gst_wavparse_add_src_pad), + (gst_wavparse_stream_data), (gst_wavparse_loop), + (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate), + (gst_wavparse_sink_activate_pull), (gst_wavparse_change_state), + (plugin_init): + * gst/wavparse/gstwavparse.h: + reverted patch #337625 for the price of 1 hour sleep + +2006-04-26 20:11:18 +0000 Stefan Kost + + gst/wavparse/gstwavparse.*: correct partial implementation of push mode (from my last commit) + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_class_init), (gst_wavparse_reset), + (gst_wavparse_init), (gst_wavparse_create_sourcepad), + (gst_wavparse_parse_adtl), (gst_wavparse_parse_cues), + (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), + (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), + (gst_wavparse_stream_data), (gst_wavparse_loop), + (gst_wavparse_chain), (plugin_init): + * gst/wavparse/gstwavparse.h: + correct partial implementation of push mode + (from my last commit) + +2006-04-26 17:37:10 +0000 Wim Taymans + + ext/esd/esdsink.c: Fix compile problem by defining ESD_MAX_WRITE_SIZE if it is not in esd.h + Original commit message from CVS: + * ext/esd/esdsink.c: + Fix compile problem by defining ESD_MAX_WRITE_SIZE if + it is not in esd.h + +2006-04-26 17:08:24 +0000 Tim-Philipp Müller + + gst/auparse/gstauparse.*: Rewrite auparse to suck a little bit less: make source pad dynamic, so decodebin/playbin wo... + Original commit message from CVS: + * gst/auparse/gstauparse.c: (gst_au_parse_base_init), + (gst_au_parse_class_init), (gst_au_parse_init), + (gst_au_parse_reset), (gst_au_parse_add_srcpad), + (gst_au_parse_remove_srcpad), (gst_au_parse_parse_header), + (gst_au_parse_chain), (gst_au_parse_src_convert), + (gst_au_parse_src_query), (gst_au_parse_handle_seek), + (gst_au_parse_sink_event), (gst_au_parse_src_event), + (gst_au_parse_change_state): + * gst/auparse/gstauparse.h: + Rewrite auparse to suck a little bit less: make source pad + dynamic, so decodebin/playbin work with non-raw formats + like alaw/mulaw; add query function for duration/position + queries; check whether we have enough data before attempting + to parse the header (instead of crashing when that is not the + case); work around audioconvert sucking by swapping endianness + to the native endianness ourselves for float formats; send + initial newsegment event. Fixes #161712. + +2006-04-26 16:29:38 +0000 Zaheer Abbas Merali + + sys/osxaudio/: Port of osxaudiosink to 0.10 + Original commit message from CVS: + 2006-04-26 Zaheer Abbas Merali + * sys/osxaudio/Makefile.am: + * sys/osxaudio/gstosxaudioelement.c: + (gst_osx_audio_element_get_type), + (gst_osx_audio_element_class_init): + * sys/osxaudio/gstosxaudioelement.h: + * sys/osxaudio/gstosxaudiosink.c: + (gst_osx_audio_sink_osxelement_do_init), + (gst_osx_audio_sink_base_init), (gst_osx_audio_sink_class_init), + (gst_osx_audio_sink_init), (gst_osx_audio_sink_set_property), + (gst_osx_audio_sink_get_property), (gst_osx_audio_sink_getcaps), + (gst_osx_audio_sink_create_ringbuffer), + (gst_osx_audio_sink_io_proc), (gst_osx_audio_sink_osxelement_init), + (plugin_init): + * sys/osxaudio/gstosxaudiosink.h: + Port of osxaudiosink to 0.10 + +2006-04-26 08:55:27 +0000 Wim Taymans + + ext/esd/esdsink.c: Always write ESD_BUF_SIZE bytes and use ESD_MAX_WRITE_SIZE as the size of the ringbuffer. This sho... + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_prepare), (gst_esdsink_delay): + Always write ESD_BUF_SIZE bytes and use ESD_MAX_WRITE_SIZE as + the size of the ringbuffer. This should fix hangs with older + esd sound servers. + +2006-04-25 21:56:38 +0000 Stefan Kost + + 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-25 21:39:46 +0000 Stefan Kost + + Define GstElementDetails as const and also static (when defined as global) + Original commit message from CVS: + * ext/aalib/gstaasink.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttimeoverlay.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdemux.c: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/flac/gstflacenc.c: + * ext/flac/gstflactag.c: + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init): + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init): + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init): + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init): + * ext/gdk_pixbuf/pixbufscale.c: + * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init): + * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init): + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libcaca/gstcacasink.c: + * ext/libmng/gstmngdec.c: + * ext/libmng/gstmngenc.c: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/mikmod/gstmikmod.c: + * ext/raw1394/gstdv1394src.c: + * ext/shout2/gstshout2.c: (gst_shout2send_init): + * ext/shout2/gstshout2.h: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalphacolor.c: + * gst/apetag/gstapedemux.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_base_init): + * gst/avi/gstavidemux.c: (gst_avi_demux_base_init): + * gst/avi/gstavimux.c: (gst_avimux_base_init): + * gst/cutter/gstcutter.c: + * gst/debug/breakmydata.c: + * gst/debug/efence.c: + * gst/debug/gstnavigationtest.c: + * gst/debug/gstnavseek.c: + * gst/debug/negotiation.c: + * gst/debug/progressreport.c: + * gst/debug/testplugin.c: + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/icydemux/gsticydemux.c: + * gst/id3demux/gstid3demux.c: + * gst/interleave/deinterleave.c: + * gst/interleave/interleave.c: + * gst/law/alaw-decode.c: (gst_alawdec_base_init): + * gst/law/alaw-encode.c: (gst_alawenc_base_init): + * gst/law/mulaw-decode.c: (gst_mulawdec_base_init): + * gst/law/mulaw-encode.c: (gst_mulawenc_base_init): + * gst/level/gstlevel.c: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init): + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/oldcore/gstaggregator.c: + * gst/oldcore/gstfdsink.c: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstpipefilter.c: + * gst/oldcore/gstshaper.c: + * gst/oldcore/gststatistics.c: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtsp/gstrtpdec.c: + * gst/rtsp/gstrtspsrc.c: + * gst/smpte/gstsmpte.c: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstmultiudpsink.c: + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsrc.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstgamma.c: (gst_gamma_base_init): + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideotemplate.c: + (gst_videotemplate_base_init): + * gst/videomixer/videomixer.c: + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_class_init), (gst_wavparse_dispose), + (gst_wavparse_reset), (gst_wavparse_init), + (gst_wavparse_perform_seek), (gst_wavparse_peek_chunk_info), + (gst_wavparse_peek_chunk), (gst_wavparse_stream_headers), + (gst_wavparse_parse_stream_init), (gst_wavparse_send_event), + (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), + (gst_wavparse_chain), (gst_wavparse_srcpad_event), + (gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull), + (gst_wavparse_change_state): + * gst/wavparse/gstwavparse.h: + * sys/oss/gstossmixerelement.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/sunaudio/gstsunaudiomixer.c: + * sys/sunaudio/gstsunaudiosink.c: + Define GstElementDetails as const and also static (when defined as + global) + +2006-04-25 17:57:23 +0000 Tim-Philipp Müller + + ext/jpeg/gstjpegdec.c: Source pad has fixed caps. If we don't set this, bad things happen when the window is resized. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): + Source pad has fixed caps. If we don't set this, bad + things happen when the window is resized. + +2006-04-25 16:38:50 +0000 Tim-Philipp Müller + + gst/matroska/: Handle case where the TrackType ebml chunk does not come before the + Original commit message from CVS: + * gst/matroska/Makefile.am: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_handle_src_event): + * gst/matroska/matroska-ids.c: + (gst_matroska_track_init_video_context), + (gst_matroska_track_init_audio_context), + (gst_matroska_track_init_subtitle_context), + (gst_matroska_track_init_complex_context): + * gst/matroska/matroska-ids.h: + Handle case where the TrackType ebml chunk does not come before the + TrackInfoAudio or TrackInfoVideo ebml chunk (#339446). Ignore QoS + events. + +2006-04-25 16:09:55 +0000 Wim Taymans + + gst/rtp/: It's codec_data, not codec_info. + Original commit message from CVS: + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_setcaps): + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_setcaps): + It's codec_data, not codec_info. + +2006-04-25 11:45:00 +0000 Mark Nauwelaerts + + gst/matroska/matroska-demux.c: Handle codec_data for VfW compatibility codec IDs (#339451) + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): + Handle codec_data for VfW compatibility codec IDs (#339451) + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_video_pad_setcaps): + Same here, handle codec_data and add additional caps we can handle + now to the pad template (huffyuv, dv and h263 video) (#339451) + +2006-04-25 11:09:24 +0000 Josef Zlomek + + gst/matroska/matroska-mux.c: Fix timestamping of B-frames, use signed integers, do some rounding (#339678). + Original commit message from CVS: + Patch by: Josef Zlomek + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_create_buffer_header), + (gst_matroska_mux_write_data): + Fix timestamping of B-frames, use signed integers, do + some rounding (#339678). + +2006-04-24 18:30:55 +0000 Edgard Lima + + * ChangeLog: + * ext/annodex/gstcmmlparser.c: + just make it compile with --disable-gst-debug. + Original commit message from CVS: + just make it compile with --disable-gst-debug. + +2006-04-23 15:55:30 +0000 Sébastien Moutte + + gst/matroska/matroska-demux.c: Fix a bad conversion using gst_guint64_to_gdouble. fabs ((gdouble) demux->index[entry]... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek): + Fix a bad conversion using gst_guint64_to_gdouble. + fabs ((gdouble) demux->index[entry].time - (gdouble) seek_pos) can not be + replaced by fabs (gst_guint64_to_gdouble (demux->index[entry].time - seek_pos)) as the + difference could be negative. fabs (gst_guint64_to_gdouble (demux->index[entry].time) - + gst_guint64_to_gdouble (seek_pos)) is the good solution. Thanks to Tim who has seen my + mistake. + +2006-04-22 15:32:48 +0000 Sébastien Moutte + + gst/matroska/matroska-demux.c: Use gst_guint64_to_gdouble for conversions + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek): + Use gst_guint64_to_gdouble for conversions + * win32/vs6/gst_plugins_good.dsw: + * win32/vs6/libgsticydemux.dsp: + Add a project file for icydemux + +2006-04-21 18:07:10 +0000 Fabrizio Gennari + + gst/avi/gstavidemux.c: When splitting audio chunks, the block alignment is not taken in consideration, so the smaller... + Original commit message from CVS: + Patch by: Fabrizio Gennari + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_parse_index), (gst_avi_demux_massage_index): + When splitting audio chunks, the block alignment is not taken in + consideration, so the smaller chunks could be of size which is + not a multiple of the block alignment. Fixes #336904 + +2006-04-21 17:59:03 +0000 Wim Taymans + + ext/raw1394/gstdv1394src.c: Use scale functions + Original commit message from CVS: + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_convert): + Use scale functions + +2006-04-21 17:27:40 +0000 Tim-Philipp Müller + + ext/dv/gstdv.c: Fix build. + Original commit message from CVS: + * ext/dv/gstdv.c: (plugin_init): + Fix build. + +2006-04-21 17:15:29 +0000 Tim-Philipp Müller + + gst/debug/progressreport.c: Add 'format' property to force querying to a particular format. + Original commit message from CVS: + * gst/debug/progressreport.c: (gst_progress_report_finalize), + (gst_progress_report_class_init), (gst_progress_report_init), + (gst_progress_report_do_query), (gst_progress_report_report), + (gst_progress_report_set_property), + (gst_progress_report_get_property): + Add 'format' property to force querying to a particular format. + +2006-04-21 15:50:28 +0000 Andy Wingo + + ext/dv/gstdv.c (plugin_init): libdv is a marginal decoder, at best, on big endian systems. Drop its rank in that case... + Original commit message from CVS: + 2006-04-21 Andy Wingo + * ext/dv/gstdv.c (plugin_init): libdv is a marginal decoder, at + best, on big endian systems. Drop its rank in that case. OTOH on + x86 it's quite fine. See changes from today in gst-ffmpeg as well. + +2006-04-21 09:27:11 +0000 Michael Smith + + Add icydemux, and tests. + Original commit message from CVS: + * configure.ac: + * gst/icydemux/Makefile.am: + * gst/icydemux/gsticydemux.c: (gst_icydemux_get_type), + (gst_icydemux_base_init), (gst_icydemux_class_init), + (gst_icydemux_reset), (gst_icydemux_init), + (gst_icydemux_sink_setcaps), (gst_icydemux_dispose), + (gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad), + (unicodify), (gst_icydemux_unicodify), + (gst_icydemux_parse_and_send_tags), + (gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta), + (gst_icydemux_chain), (gst_icydemux_change_state), + (gst_icydemux_send_tag_event), (plugin_init): + * gst/icydemux/gsticydemux.h: + * tests/check/Makefile.am: + * tests/check/elements/icydemux.c: (typefind_succeed), + (plugin_init), (icydemux_found_pad), (create_icydemux), + (cleanup_icydemux), (push_data), (GST_START_TEST), + (icydemux_suite), (main): + Add icydemux, and tests. + +2006-04-20 17:48:29 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.c: Post SEGMENT_DONE message in TIME format. + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_loop): + Post SEGMENT_DONE message in TIME format. + +2006-04-20 17:29:56 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + Added a couple of ifdefs to make it compile with other kernels. + Original commit message from CVS: + Added a couple of ifdefs to make it compile with other kernels. + +2006-04-20 16:33:55 +0000 Fabrizio Gennari + + gst/avi/gstavidemux.c: Fix index creation when we have to scan the file to create an index. There may be other types ... + Original commit message from CVS: + Patch by: Fabrizio Gennari + * gst/avi/gstavidemux.c: (gst_avi_demux_peek_tag), + (gst_avi_demux_next_data_buffer), (gst_avi_demux_stream_scan): + Fix index creation when we have to scan the file to create + an index. There may be other types of RIFF 'LIST' chunks than + 'movi' and we need to skip them properly as well or we'll end up + reading garbage (#336889). Some other cosmetic changes. + +2006-04-20 14:21:42 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.c: Add support for segment seeks (fixes #338290). Also demote some recurring debug message from D... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_loop), + (gst_flac_dec_handle_seek_event): + Add support for segment seeks (fixes #338290). Also demote + some recurring debug message from DEBUG to LOG level. + +2006-04-20 13:23:40 +0000 Tim-Philipp Müller + + gst/matroska/: Set DISCONT flag on first buffer after a discontinuity. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroskademux_do_index_seek), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_parse_blockgroup_or_simpleblock): + * gst/matroska/matroska-ids.h: + Set DISCONT flag on first buffer after a discontinuity. + Fix newsegment events sent when seeking and honour KEY_UNIT + seek flag. Create pad with bogus caps if we don't recognise + the stream codec id. + * gst/matroska/matroska-demux.h: + Fix GObject macros. + +2006-04-20 11:00:16 +0000 Mark Nauwelaerts + + gst/matroska/matroska-demux.c: Handle end of segment properly when set; don't dead-lock when posting start of segment... + Original commit message from CVS: + Patch by: Mark Nauwelaerts + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_loop): + Handle end of segment properly when set; don't dead-lock when + posting start of segment message when doing a segment seek. + Fixes #338810. + +2006-04-20 09:48:05 +0000 j^ + + gst/qtdemux/qtdemux.c: Never treat video streams as an audio stream. + Original commit message from CVS: + Patch by: j^ + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), + (qtdemux_video_caps): + Never treat video streams as an audio stream. + Add qtdrw mime type. + Fixes #339041 + +2006-04-20 09:11:22 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: Make mpeg2 aac audio work: create artificial private codec data chunk which faad2 seem... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps), + (gst_matroska_demux_plugin_init): + Make mpeg2 aac audio work: create artificial private codec data + chunk which faad2 seems to require, just as we do for mpeg4 aac. + Also call gst_riff_init(). Partially fixes #338767. + +2006-04-19 15:16:33 +0000 Tim-Philipp Müller + + gst/wavenc/gstwavenc.*: Set caps on first outgoing buffer, so that it doesn't error out immediately with a non-negoti... + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_base_init), + (gst_wavenc_class_init), (gst_wavenc_init), + (gst_wavenc_create_header_buf), (gst_wavenc_push_header), + (gst_wavenc_sink_setcaps), (get_id_from_name), (gst_wavenc_event), + (gst_wavenc_chain), (gst_wavenc_change_state): + * gst/wavenc/gstwavenc.h: + Set caps on first outgoing buffer, so that it doesn't error out + immediately with a non-negotiated error (#338716). Rewrite and + clean up a bit; fix setcaps function to parse things properly; + fix sink caps (8bit audio is unsigned and doesn't have depth); + use boilerplate macros; remove unused properties stuff. + +2006-04-19 09:27:00 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: For VBR audio, don't try to calculate the samples_per_frame. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + For VBR audio, don't try to calculate the samples_per_frame. + Fixes #338935. + +2006-04-18 18:14:34 +0000 Tim-Philipp Müller + + ext/gdk_pixbuf/gstgdkpixbuf.c: Leave JPEG decoding to our jpegdec plugin. gdkpixbufdec cannot handle MJPEG streams an... + Original commit message from CVS: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + Leave JPEG decoding to our jpegdec plugin. gdkpixbufdec cannot + handle MJPEG streams and might be autoplugged for those if the + user doesn't have jpegdec installed (resulting in a cryptic error + message about huffman tables). Better to disable JPEG decoding here + and let the user figure out that she needs to install jpegdec. + +2006-04-18 18:04:48 +0000 Tim-Philipp Müller + + ext/gdk_pixbuf/gstgdkpixbuf.*: Make work with packetised/framed input (e.g. png-in-quicktime). Use + Original commit message from CVS: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_setcaps), + (gst_gdk_pixbuf_class_init), (gst_gdk_pixbuf_init), + (gst_gdk_pixbuf_flush), (gst_gdk_pixbuf_chain): + * ext/gdk_pixbuf/gstgdkpixbuf.h: + Make work with packetised/framed input (e.g. png-in-quicktime). Use + GST_ELEMENT_ERROR when we return GST_FLOW_ERROR. Add some + GST_DEBUG_FUNCPTR here and there. Use GST_LOG for recurring + debug messages. Fix boilerplate macros. + +2006-04-18 17:29:42 +0000 Tim-Philipp Müller + + ext/gdk_pixbuf/gstgdkpixbuf.c: No need to special-case for Gdk-2.0 any longer, we require + Original commit message from CVS: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_get_capslist), + (gst_gdk_pixbuf_set_property), (gst_gdk_pixbuf_get_property): + No need to special-case for Gdk-2.0 any longer, we require + Gdk 2.2 or newer; minor clean-ups. + +2006-04-18 17:17:55 +0000 Tim-Philipp Müller + + Rewrite a bit: use GstBaseSink::start and stop instead of a state change function; use GST_ELEMENT_ERROR for error re... + Original commit message from CVS: + * ext/shout2/gstshout2.c: (gst_shout2send_base_init), + (gst_shout2send_class_init), (gst_shout2send_init), + (set_shout_metadata), (gst_shout2send_set_metadata), + (gst_shout2send_event), (gst_shout2send_start), + (gst_shout2send_connect), (gst_shout2send_stop), + (gst_shout2send_render), (gst_shout2send_set_property), + (gst_shout2send_get_property), (gst_shout2send_setcaps), + (plugin_init): + * ext/shout2/gstshout2.h: + * po/POTFILES.in: + Rewrite a bit: use GstBaseSink::start and stop instead of a state + change function; use GST_ELEMENT_ERROR for error reporting, not + g_error() or GST_ERROR(); don't unref caps in setcaps function, + will cause crashes or assertion failures; remove (unused) "sync" + property, basesink already has such a property; misc. other + minor fixes and cleanups. + +2006-04-18 14:15:33 +0000 Tim-Philipp Müller + + Add translatable error message for when we cannot connect to the sound server, as "Cannot open resource for writing" ... + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_open), (gst_esdsink_prepare): + * ext/esd/gstesd.c: (plugin_init): + * po/POTFILES.in: + Add translatable error message for when we cannot + connect to the sound server, as "Cannot open resource + for writing" isn't really an acceptable message to show + to the user in this case. + +2006-04-18 13:32:29 +0000 Tim-Philipp Müller + + sys/oss/gst-i18n-plugin.h: Remove bogus file that doesn't belong here. + Original commit message from CVS: + * sys/oss/gst-i18n-plugin.h: + Remove bogus file that doesn't belong here. + +2006-04-17 19:57:10 +0000 Philippe Valembois + + ext/shout2/gstshout2.*: Handle tags being received before the connection to the server is established properly (see #... + Original commit message from CVS: + Patch by: Philippe Valembois + * ext/shout2/gstshout2.c: (gst_shout2send_init), + (gst_shout2send_set_metadata), (gst_shout2send_event), + (gst_shout2send_render), (gst_shout2send_change_state): + * ext/shout2/gstshout2.h: + Handle tags being received before the connection to + the server is established properly (see #338636). + +2006-04-17 19:43:32 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + Just added a gtk-doc comment. + Original commit message from CVS: + Just added a gtk-doc comment. + +2006-04-17 19:12:36 +0000 Tim-Philipp Müller + + ext/shout2/gstshout2.c: Don't crash in case the connection to the server fails: don't set pointer to NULL by assignin... + Original commit message from CVS: + * ext/shout2/gstshout2.c: (gst_shout2send_render): + Don't crash in case the connection to the server fails: + don't set pointer to NULL by assigning FALSE; error out + properly by using GST_ELEMENT_ERROR and returning + GST_FLOW_ERROR (fixes #338636). Lastly, free connection + before resetting the pointer. + +2006-04-17 10:01:51 +0000 Alex Lancaster + + gst/id3demux/id3tags.c: (Fixes #338713) + Original commit message from CVS: + * gst/id3demux/id3tags.c: + Recognise TCO (Genre) tags in ID3v2.2. Patch by Alex Lancaster + (Fixes #338713) + +2006-04-13 21:45:57 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/v4l2src_calls.c: + Fixed some memory leaks. + Original commit message from CVS: + Fixed some memory leaks. + +2006-04-13 09:15:31 +0000 Thomas Vander Stichele + + * ChangeLog: + * gst/rtp/Makefile.am: + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpdepay.h: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmpay.h: + * gst/rtp/gstrtph263pay.h: + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtpmp4gpay.h: + * gst/rtp/gstrtpmp4vdepay.h: + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadepay.h: + * gst/rtp/gstrtpmpapay.h: + * gst/rtp/gstrtppcmadepay.h: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmapay.h: + * gst/rtp/gstrtppcmudepay.h: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtppcmupay.h: + * gst/rtp/gstrtpspeexdepay.h: + * gst/rtp/gstrtpspeexpay.h: + reverting rtp patches to fix freeze break on -base as explained on the list + Original commit message from CVS: + reverting rtp patches to fix freeze break on -base as explained on the list + +2006-04-13 09:01:17 +0000 Tim-Philipp Müller + + gst/rtp/: Fix GObject macros. + Original commit message from CVS: + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpdepay.h: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmpay.h: + * gst/rtp/gstrtph263pay.h: + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtpilbcdepay.h: + * gst/rtp/gstrtpilbcpay.h: + * gst/rtp/gstrtpmp4gpay.h: + * gst/rtp/gstrtpmp4vdepay.h: + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadepay.h: + * gst/rtp/gstrtpmpapay.h: + * gst/rtp/gstrtppcmadepay.h: + * gst/rtp/gstrtppcmapay.h: + * gst/rtp/gstrtppcmudepay.h: + * gst/rtp/gstrtppcmupay.h: + * gst/rtp/gstrtpspeexdepay.h: + * gst/rtp/gstrtpspeexpay.h: + Fix GObject macros. + +2006-04-13 03:42:51 +0000 Philippe Kalaf + + gst/rtp/: Ported mulaw and alaw payloaders to use new base class + Original commit message from CVS: + 2006-04-12 Philippe Kalaf + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmapay.h: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtppcmupay.h: + Ported mulaw and alaw payloaders to use new base class + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpilbcpay.h: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcdepay.h: + Added new iLBC payloader/depayloader. Payloader uses new audio payload base + class. + +2006-04-12 21:57:02 +0000 Edgard Lima + + * sys/v4l2/gstv4l2src.c: + Fix to work in read mode. + Original commit message from CVS: + Fix to work in read mode. + +2006-04-12 09:42:10 +0000 Wim Taymans + + ext/gdk_pixbuf/gstgdkpixbuf.c: Some cleanups. + Original commit message from CVS: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_setcaps), + (gst_gdk_pixbuf_get_capslist), (gst_gdk_pixbuf_sink_getcaps), + (gst_gdk_pixbuf_class_init), (gst_gdk_pixbuf_init), + (gst_gdk_pixbuf_flush), (gst_gdk_pixbuf_sink_event), + (gst_gdk_pixbuf_chain): + Some cleanups. + Added RGBA as a possible output format. + Correctly free the supported mimetypes. + deprecate silent arg, it's not used. + Return result from _alloc_buffer to peer. + +2006-04-11 18:03:36 +0000 Tim-Philipp Müller + + gst/rtp/gstrtpmp4vdepay.c: Don't leak memory allocated by gst_buffer_new_and_alloc() by overwriting GST_BUFFER_MALLOC... + Original commit message from CVS: + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_process): + Don't leak memory allocated by gst_buffer_new_and_alloc() by + overwriting GST_BUFFER_MALLOCDATA. + +2006-04-11 15:27:31 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + fix version number macro + Original commit message from CVS: + fix version number macro + +2006-04-11 09:35:45 +0000 Tim-Philipp Müller + + ext/libpng/gstpngdec.*: Handle more than one frame if the content is framed, like with png-in-quicktime (#331917). + Original commit message from CVS: + * ext/libpng/gstpngdec.c: (gst_pngdec_init), + (user_endrow_callback), (user_end_callback), + (gst_pngdec_caps_create_and_set), (gst_pngdec_chain), + (gst_pngdec_sink_setcaps), (gst_pngdec_sink_event), + (gst_pngdec_libpng_clear), (gst_pngdec_change_state): + * ext/libpng/gstpngdec.h: + Handle more than one frame if the content is framed, + like with png-in-quicktime (#331917). + +2006-04-10 19:55:31 +0000 Thomas Vander Stichele + + sys/oss/: - the user-visible error strings were in the wrong category + Original commit message from CVS: + * sys/oss/Makefile.am: + * sys/oss/common.h: + * sys/oss/gstosssink.c: (gst_oss_sink_init), (gst_oss_sink_open), + (gst_oss_sink_prepare), (gst_oss_sink_unprepare): + * sys/oss/gstosssrc.c: (gst_oss_src_prepare), + (gst_oss_src_unprepare): + - the user-visible error strings were in the wrong category + - and the messages were not marked for translation + - which is actually a good thing, because they were exactly + the kind of message you would never want anyone to see + - the macros were using variables that didn't exist in the macro + arguments + - and they were obviously copied from each other and then modified + - so a common header makes sense + +2006-04-10 17:16:09 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Fix parsing of newer stsd chunks again. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Fix parsing of newer stsd chunks again. + +2006-04-10 16:09:03 +0000 Tim-Philipp Müller + + gst/matroska/ebml-read.c: Don't try to modify read-only data. + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_read_sint): + Don't try to modify read-only data. + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup_or_simpleblock): + Fix comment (won't crash any longer now). + +2006-04-10 15:48:55 +0000 Michael Smith + + ext/annodex/gstcmmlenc.c: Use copies of header buffers for caps to avoid circular refcounting problems (as in theorad... + Original commit message from CVS: + * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_set_header_on_caps): + Use copies of header buffers for caps to avoid circular refcounting + problems (as in theoradec, vorbisdec). + * tests/check/elements/cmmldec.c: (GST_START_TEST): + Fix a typo in test that meant it was testing the wrong thing. + * tests/check/elements/cmmlenc.c: (check_headers): + Fix refcount checks now that we use buffer-copies for caps. + +2006-04-10 15:43:54 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: Use static pad templates with ANY caps for audio and video source pads and get rid of ... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), + (gst_matroska_demux_subtitle_caps), + (gst_matroska_demux_plugin_init): + Use static pad templates with ANY caps for audio and video + source pads and get rid of a lot of unnecessary (and partially + broken) code for the template caps. Clean up caps finding + functions. Fixes playback of audio files/streams that do not + contain the sample rate and/or number of channels in the audio + context (happens a lot with vorbis/mp3 .mka files it seems). + Fixes #337183. + Also add myself to copyright holders. + +2006-04-10 15:29:21 +0000 Michael Smith + + ext/annodex/gstcmmlutils.c: Use g_list_delete_link () instead of g_list_remove_link () so that we free the link as we... + Original commit message from CVS: + * ext/annodex/gstcmmlutils.c: (gst_cmml_track_list_del_clip): + Use g_list_delete_link () instead of g_list_remove_link () so that + we free the link as well as the contained data. + +2006-04-10 14:20:41 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Fix framerate calculation. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), + (qtdemux_parse_trak): + Fix framerate calculation. + +2006-04-10 10:10:55 +0000 Ryan Lortie (desrt) + + gst/avi/gstavidemux.c: Fix some crashers with empty chunks. (Fixes #337749) + Original commit message from CVS: + Patch by: Ryan Lortie (desrt) + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_superindex), + (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), + (gst_avi_demux_stream_header): + Fix some crashers with empty chunks. (Fixes #337749) + +2006-04-10 08:31:40 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: force mono 8000 Hz on AMR samples. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + force mono 8000 Hz on AMR samples. + +2006-04-09 18:30:51 +0000 Sébastien Moutte + + ext/neon/gstneonhttpsrc.c: remove atoll by using g_ascii_strtoull (atoll is not supported on WIN32) + Original commit message from CVS: + * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_start): + remove atoll by using g_ascii_strtoull (atoll is not supported on WIN32) + * sys/directdraw/gstdirectdrawsink.c: + * sys/directsound/gstdirectsoundsink.c: + done some cleans in sources + * win32/vs6: + add project files for neon, qtdemux + +2006-04-09 17:31:37 +0000 Sébastien Moutte + + gst/level/gstlevel.c: use G_GINT64_CONSTANT for INT64 constants + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_set_caps),(gst_level_transform_ip): + use G_GINT64_CONSTANT for INT64 constants + * gst/videofilter/gstvideobalance.c: + define rint for WIN32 #define rint(x) (floor((x)+0.5)) + * win32/vs6/libgstavi.dsp: + add missing libraries for the link and remove avimux.c from + the project as it isn't ported to 0.10 yet + +2006-04-09 14:00:32 +0000 Tim-Philipp Müller + + gst/matroska/ebml-read.c: Even better would be if we actually did the right thing here (also, G_GUINT64_CONSTANT only... + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_read_sint): + Even better would be if we actually did the right thing + here (also, G_GUINT64_CONSTANT only exists since GLib-2.10). + +2006-04-09 13:52:03 +0000 Tim-Philipp Müller + + gst/matroska/ebml-read.c: Can't just replace 1LL with 1L here just because MSVC doesn't support it, as it might lead ... + Original commit message from CVS: + * gst/matroska/ebml-read.c: (gst_ebml_read_sint): + Can't just replace 1LL with 1L here just because MSVC doesn't + support it, as it might lead to incorrect results when doing the + bitshifting here. Using GLib's G_GUINT64_CONSTANT() macro to + force a 64-bit constant in a way that all compilers are happy with. + +2006-04-08 21:48:01 +0000 Stefan Kost + + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + Original commit message from CVS: + * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_class_init): + * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_class_init): + * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_class_init): + * ext/arts/gst_arts.c: (gst_arts_class_init): + * ext/artsd/gstartsdsink.c: (gst_artsdsink_class_init): + * ext/audiofile/gstafsink.c: (gst_afsink_class_init): + * ext/audiofile/gstafsrc.c: (gst_afsrc_class_init): + * ext/audioresample/gstaudioresample.c: + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): + * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_class_init): + * ext/divx/gstdivxdec.c: (gst_divxdec_class_init): + * ext/hermes/gsthermescolorspace.c: + (gst_hermes_colorspace_class_init): + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_class_init): + * ext/jack/gstjack.c: (gst_jack_class_init): + * ext/jack/gstjackbin.c: (gst_jack_bin_class_init): + * ext/lcs/gstcolorspace.c: (gst_colorspace_class_init): + * ext/libfame/gstlibfame.c: (gst_fameenc_class_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): + * ext/nas/nassink.c: (gst_nassink_class_init): + * ext/shout/gstshout.c: (gst_icecastsend_class_init): + * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): + * ext/sndfile/gstsf.c: (gst_sf_class_init): + * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_class_init), + (gst_swfdec_class_init): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_class_init): + * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_class_init): + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_class_init): + * gst/chart/gstchart.c: (gst_chart_class_init): + * gst/colorspace/gstcolorspace.c: (gst_colorspace_class_init): + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_class_init): + * gst/festival/gstfestival.c: (gst_festival_class_init): + * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): + * gst/filter/gstiir.c: (gst_iir_class_init): + * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): + * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init): + * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_class_init): + * gst/mpeg1sys/gstmpeg1systemencode.c: + (gst_system_encode_class_init): + * gst/mpeg1videoparse/gstmp1videoparse.c: + (gst_mp1videoparse_class_init): + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_class_init): + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_class_init): + * gst/overlay/gstoverlay.c: (gst_overlay_class_init): + * gst/passthrough/gstpassthrough.c: (passthrough_class_init): + * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init): + * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_class_init): + * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_class_init): + * gst/smooth/gstsmooth.c: (gst_smooth_class_init): + * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init): + * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): + * gst/stereo/gststereo.c: (gst_stereo_class_init): + * gst/switch/gstswitch.c: (gst_switch_class_init): + * gst/tta/gstttadec.c: (gst_tta_dec_class_init): + * gst/tta/gstttaparse.c: (gst_tta_parse_class_init): + * gst/vbidec/gstvbidec.c: (gst_vbidec_class_init): + * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init): + * gst/virtualdub/gstxsharpen.c: (gst_xsharpen_class_init): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_class_init): + * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): + * sys/directsound/gstdirectsoundsink.c: + (gst_directsoundsink_class_init): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_class_init): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_class_init): + * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_class_init): + * sys/v4l2/gstv4l2colorbalance.c: + (gst_v4l2_color_balance_channel_class_init): + * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_channel_class_init), + (gst_v4l2_tuner_norm_class_init): + * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_class_init): + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + +2006-04-08 21:21:45 +0000 Stefan Kost + + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + Original commit message from CVS: + * ext/aalib/gstaasink.c: (gst_aasink_class_init): + * ext/esd/esdsink.c: (gst_esdsink_class_init): + * ext/flac/gstflactag.c: (gst_flac_tag_class_init): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_class_init): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_class_init): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init): + * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init): + * ext/libmng/gstmngdec.c: (gst_mngdec_class_init): + * ext/libmng/gstmngenc.c: (gst_mngenc_class_init): + * ext/libpng/gstpngdec.c: (gst_pngdec_class_init): + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init): + * ext/mikmod/gstmikmod.c: (gst_mikmod_class_init): + * ext/shout2/gstshout2.c: (gst_shout2send_class_init): + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): + * gst/alpha/gstalpha.c: (gst_alpha_class_init): + * gst/avi/gstavimux.c: (gst_avimux_class_init): + * gst/debug/efence.c: (gst_efence_class_init): + * gst/debug/negotiation.c: (gst_negotiation_class_init): + * gst/flx/gstflxdec.c: (gst_flxdec_class_init): + * gst/goom/gstgoom.c: (gst_goom_class_init): + * gst/id3demux/gstid3demux.c: (gst_id3demux_class_init): + * gst/interleave/deinterleave.c: (deinterleave_class_init): + * gst/interleave/interleave.c: (interleave_class_init): + * gst/law/alaw-decode.c: (gst_alawdec_class_init): + * gst/law/alaw-encode.c: (gst_alawenc_class_init): + * gst/law/mulaw-encode.c: (gst_mulawenc_class_init): + * gst/median/gstmedian.c: (gst_median_class_init): + * gst/monoscope/gstmonoscope.c: (gst_monoscope_class_init): + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init): + * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_class_init): + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_class_init): + * gst/rtp/gstrtpL16pay.c: (gst_rtpL16pay_class_init): + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_class_init): + * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_class_init): + * gst/rtp/gstrtpdepay.c: (gst_rtp_depay_class_init): + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_class_init): + * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_class_init): + * gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_class_init): + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_class_init): + * gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init): + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_class_init): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init): + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_class_init): + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_class_init): + * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_class_init): + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_class_init): + * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_class_init): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_class_init): + * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_class_init): + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_class_init): + * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_class_init): + * gst/rtsp/gstrtpdec.c: (gst_rtpdec_class_init): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init): + * gst/smpte/gstsmpte.c: (gst_smpte_class_init): + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_class_init): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init): + * gst/udp/gstudpsink.c: (gst_udpsink_class_init): + * gst/videomixer/videomixer.c: (gst_videomixer_class_init): + * gst/wavenc/gstwavenc.c: (gst_wavenc_class_init): + * sys/oss/gstossdmabuffer.c: (gst_ossdmabuffer_class_init): + * sys/oss/gstosssink.c: (gst_oss_sink_class_init): + * sys/osxaudio/gstosxaudioelement.c: + (gst_osxaudioelement_class_init): + * sys/osxaudio/gstosxaudiosink.c: (gst_osxaudiosink_class_init): + * sys/osxaudio/gstosxaudiosrc.c: (gst_osxaudiosrc_class_init): + * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_class_init): + Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) + +2006-04-08 19:06:25 +0000 Stefan Kost + + Fix more broken GObject macros + Original commit message from CVS: + * ext/mikmod/gstmikmod.h: + * gst/level/gstlevel.h: + Fix more broken GObject macros + +2006-04-08 18:41:07 +0000 Stefan Kost + + Fix broken GObject macros + Original commit message from CVS: + * ext/xine/gstxine.h: + * gst-libs/gst/play/play.h: + * sys/v4l2/gstv4l2element.h: + * sys/ximagesrc/ximageutil.h: + Fix broken GObject macros + +2006-04-08 18:25:55 +0000 Stefan Kost + + Fix broken GObject macros + Original commit message from CVS: + * ext/annodex/gstcmmldec.h: + * ext/annodex/gstcmmlenc.h: + * ext/annodex/gstcmmltag.h: + * ext/cairo/gsttextoverlay.h: + * ext/ladspa/gstsignalprocessor.h: + * gst/matroska/ebml-read.h: + * gst/matroska/ebml-write.h: + * sys/osxaudio/gstosxaudioelement.h: + Fix broken GObject macros + +2006-04-08 18:23:04 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Don't make rounding errors in timestamp/duration calculations. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample), + (gst_qtdemux_chain), (gst_qtdemux_add_stream), (qtdemux_dump_stsz), + (qtdemux_dump_stco), (qtdemux_parse_trak): + Don't make rounding errors in timestamp/duration calculations. + Fix timestamps for AMR and IMA4. Fixes (#337436). + Create a dummy segment even when there is no edit list. + +2006-04-08 13:09:50 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.c: Don't try to seek beyond the end of the file (would occasionally display error dialogs in tote... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_handle_seek_event): + Don't try to seek beyond the end of the file (would + occasionally display error dialogs in totem when seeking + to the end) (#335869). Will still throw an error though + if the file is truncated and the total_samples value in + the stream header is wrong. + +2006-04-07 18:15:08 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.*: If the stream header doesn't contain the total number of samples, search for the last flac fra... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_calculate_crc8), + (gst_flac_dec_scan_got_frame), (gst_flac_dec_scan_for_last_block), + (gst_flac_dec_metadata_callback): + * ext/flac/gstflacdec.h: + If the stream header doesn't contain the total number of samples, + search for the last flac frame at the end of the file and calculate + the total duration from that frame's offset (fixes #337609). + +2006-04-07 15:53:43 +0000 Zaheer Abbas Merali + + Typo fix, s/XFree86/X11 and added doc blurb saying that it fixates to 25fps + Original commit message from CVS: + 2006-04-07 Zaheer Abbas Merali + * ext/amrwb/amrwb-code/Makefile.am: + * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_recalc), + (gst_ximagesrc_create), (gst_ximagesrc_set_property): + Typo fix, s/XFree86/X11 and added doc blurb saying that it fixates to + 25fps + +2006-04-07 15:47:27 +0000 Zaheer Abbas Merali + + tests/icles/ximagesrc-test.c: Actually assert that pipeline goes to playing + Original commit message from CVS: + 2006-04-07 Zaheer Abbas Merali + * tests/icles/ximagesrc-test.c: (main): + Actually assert that pipeline goes to playing + +2006-04-07 15:27:40 +0000 Zaheer Abbas Merali + + sys/ximagesrc/ximagesrc.c: Fix typo, C++ style comments and other small cleanups + Original commit message from CVS: + 2006-04-07 Zaheer Abbas Merali + * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_recalc), + (composite_pixel), (gst_ximagesrc_ximage_get), + (gst_ximagesrc_create), (gst_ximagesrc_set_property): + Fix typo, C++ style comments and other small cleanups + +2006-04-07 10:48:19 +0000 Edward Hervey + + gst/avi/gstavidemux.c: Don't unref the GstPadTemplate returned by gst_element_class_get_pad_template(). + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream): + Don't unref the GstPadTemplate returned by + gst_element_class_get_pad_template(). + +2006-04-06 19:16:02 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Added full edit list support. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), + (gst_qtdemux_handle_src_query), (gst_qtdemux_find_index), + (gst_qtdemux_find_keyframe), (gst_qtdemux_find_segment), + (gst_qtdemux_move_stream), (gst_qtdemux_perform_seek), + (gst_qtdemux_do_seek), (gst_qtdemux_change_state), + (gst_qtdemux_activate_segment), + (gst_qtdemux_prepare_current_sample), (gst_qtdemux_advance_sample), + (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), + (qtdemux_parse_trak): + Added full edit list support. + Avoid overflows in prologue image detection code. + Avoid roundoff errors in timestamp calculations. + +2006-04-06 11:35:26 +0000 j^ + + Unify the long descriptions in the plugin details (#337263). + Original commit message from CVS: + Patch by: j^ + * 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/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/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): + * ext/nas/nassink.c: (gst_nassink_base_init): + * ext/neon/gstneonhttpsrc.c: + * ext/polyp/polypsink.c: (gst_polypsink_base_init): + * ext/sdl/sdlaudiosink.c: + * ext/sdl/sdlvideosink.c: + * ext/shout/gstshout.c: + * ext/snapshot/gstsnapshot.c: + * ext/sndfile/gstsf.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/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): + * gst/festival/gstfestival.c: + * gst/filter/gstiir.c: + * gst/filter/gstlpwsinc.c: + * gst/freeze/gstfreeze.c: + * gst/games/gstpuzzle.c: (gst_puzzle_base_init): + * 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/tta/gstttadec.c: (gst_tta_dec_base_init): + * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): + * 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: + Unify the long descriptions in the plugin details (#337263). + +2006-04-06 09:14:30 +0000 Brian Cameron + + sys/sunaudio/gstsunaudiosink.*: Use spec->segsize and spec->segtotal in the prepare function to initialise the ring b... + Original commit message from CVS: + Patch by: Brian Cameron + * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_init), + (gst_sunaudiosink_prepare), (gst_sunaudiosink_write): + * sys/sunaudio/gstsunaudiosink.h: + Use spec->segsize and spec->segtotal in the prepare function + to initialise the ring buffer instead of using the buffer-time + property (#337421). + +2006-04-06 08:52:51 +0000 Tim-Philipp Müller + + configure.ac: Bump core requirements to CVS for gst_pad_query_peer_duration() which is used by speexdec. + Original commit message from CVS: + * configure.ac: + Bump core requirements to CVS for gst_pad_query_peer_duration() + which is used by speexdec. + +2006-04-05 18:27:22 +0000 Tim-Philipp Müller + + ext/speex/: Fix seeking and duration queries (#337033); clean up and refactor a bit. + Original commit message from CVS: + * ext/speex/gstspeex.c: (plugin_init): + * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init), + (gst_speex_dec_reset), (gst_speex_dec_init), (speex_dec_convert), + (speex_get_sink_query_types), (speex_dec_sink_query), + (speex_get_src_query_types), (speex_dec_src_query), + (speex_dec_src_event), (speex_dec_sink_event), + (speex_dec_chain_parse_header), (speex_dec_chain_parse_comments), + (speex_dec_chain_parse_data), (speex_dec_chain), + (gst_speex_dec_get_property), (gst_speex_dec_set_property), + (speex_dec_change_state): + * ext/speex/gstspeexdec.h: + Fix seeking and duration queries (#337033); clean up and + refactor a bit. + +2006-04-05 12:41:14 +0000 Thomas Vander Stichele + + ext/raw1394/gstdv1394src.c: distinguish between device not found and could not open for reading + Original commit message from CVS: + * ext/raw1394/gstdv1394src.c: + distinguish between device not found and could not open for + reading + +2006-04-05 08:36:55 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: Use duration as segment stop position if none is explicitly configured. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), + (gst_qtdemux_do_seek), (gst_qtdemux_loop_state_movie), + (gst_qtdemux_loop): + Use duration as segment stop position if none is + explicitly configured. + Also perform EOS when we run past the segment stop. + +2006-04-04 11:20:58 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: More cleanups, added comments. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_go_back), + (gst_qtdemux_perform_seek), (gst_qtdemux_do_seek), + (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), + (gst_qtdemux_chain), (qtdemux_parse_tree), (qtdemux_parse_trak): + More cleanups, added comments. + Mark discontinuities on outgoing buffers. + Post better errors when something goes wrong. + Handle EOS and segment end properly. + +2006-04-04 08:31:10 +0000 Wim Taymans + + gst/qtdemux/qtdemux.*: Handle stss boxes so we can mark and find keyframes. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), + (gst_qtdemux_push_event), (gst_qtdemux_go_back), + (gst_qtdemux_perform_seek), (gst_qtdemux_do_seek), + (gst_qtdemux_handle_src_event), (plugin_init), + (gst_qtdemux_change_state), (gst_qtdemux_loop_state_movie), + (gst_qtdemux_loop), (gst_qtdemux_chain), + (qtdemux_sink_activate_pull), (gst_qtdemux_add_stream), + (qtdemux_parse), (qtdemux_parse_tree), (qtdemux_parse_trak), + (qtdemux_parse_udta), (qtdemux_tag_add_str), (qtdemux_tag_add_num), + (qtdemux_tag_add_gnre), (gst_qtdemux_handle_esds): + * gst/qtdemux/qtdemux.h: + Handle stss boxes so we can mark and find keyframes. + Implement correct accurate and keyframe seeking. + Use _DEBUG_OBJECT when possible. + +2006-04-03 13:29:20 +0000 Thomas Vander Stichele + + * tests/check/elements/.gitignore: + ignore more + Original commit message from CVS: + ignore more + +2006-04-03 13:28:55 +0000 Thomas Vander Stichele + + * pkgconfig/Makefile.am: + fix dist + Original commit message from CVS: + fix dist + +2006-04-03 09:02:29 +0000 Thomas Vander Stichele + + add a .pc file so other modules can use good plugins in tests + Original commit message from CVS: + * Makefile.am: + * configure.ac: + * pkgconfig/.cvsignore: + * pkgconfig/Makefile.am: + * pkgconfig/gstreamer-plugins-good-uninstalled.pc.in: + add a .pc file so other modules can use good plugins in tests + +2006-04-01 16:50:49 +0000 Thomas Vander Stichele + + * common: + * docs/plugins/inspect/plugin-qtdemux.xml: + * docs/plugins/inspect/plugin-taglib.xml: + * ext/taglib/gsttaglibmux.c: + * tests/check/elements/id3v2mux.c: + add taglib checks and docs + Original commit message from CVS: + add taglib checks and docs + +2006-04-01 15:30:51 +0000 Thomas Vander Stichele + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/upload.mak: + disable use of AS_LIBTOOL_TAGS, it doesn't work correctly + Original commit message from CVS: + disable use of AS_LIBTOOL_TAGS, it doesn't work correctly + +2006-04-01 14:03:03 +0000 Thomas Vander Stichele + + * common: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-annodex.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-gdkpixbuf.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-halelements.xml: + * docs/plugins/inspect/plugin-id3demux.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-ladspa.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-videobalance.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + adding inspect files + Original commit message from CVS: + adding inspect files + +2006-04-01 10:15:33 +0000 Thomas Vander Stichele + + * tests/icles/ximagesrc-test.c: + 5 second timeout + Original commit message from CVS: + 5 second timeout + +2006-04-01 10:14:26 +0000 Thomas Vander Stichele + + * tests/icles/.gitignore: + * tests/icles/Makefile.am: + * tests/icles/ximagesrc-test.c: + rename test + Original commit message from CVS: + rename test + +2006-04-01 10:09:11 +0000 Thomas Vander Stichele + + * gst/equalizer/gstiirequalizer.c: + * gst/qtdemux/qtdemux.c: + * gst/spectrum/gstspectrum.c: + * gst/videocrop/gstvideocrop.c: + * sys/directdraw/gstdirectdrawplugin.c: + * sys/directsound/gstdirectsoundplugin.c: + * sys/v4l2/gstv4l2.c: + * sys/ximage/gstximagesrc.c: + rework build; add translations for v4l2 + Original commit message from CVS: + rework build; add translations for v4l2 + +2006-04-01 09:56:45 +0000 Thomas Vander Stichele + + configure.ac: clean up, use AS_VERSION and AS_NANO + Original commit message from CVS: + * configure.ac: + clean up, use AS_VERSION and AS_NANO + * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): + use PACKAGE_VERSION define + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + updated + +2006-03-31 17:52:36 +0000 Zaheer Abbas Merali + + Add tests and fix PAR caps issue to ximagesrc + Original commit message from CVS: + 2006-03-31 Zaheer Abbas Merali + * Makefile.am: + * configure.ac: + * sys/ximagesrc/ximagesrc.c: + (gst_ximagesrc_ximage_get), + (gst_ximagesrc_get_caps), (gst_ximagesrc_class_init): + * sys/ximagesrc/ximageutil.c: + * tests/Makefile.am: + * tests/icles/Makefile.am: + * tests/icles/ximagesrc-test.c: (terminate_playback), (main): + Add tests and fix PAR caps issue to ximagesrc + +2006-03-31 16:32:47 +0000 Zaheer Abbas Merali + + sys/ximagesrc/ximagesrc.c: Add docs to ximagesrc + Original commit message from CVS: + 2006-03-31 Zaheer Abbas Merali + * sys/ximagesrc/ximagesrc.c: + Add docs to ximagesrc + +2006-03-31 15:21:35 +0000 Zaheer Abbas Merali + + sys/ximagesrc/: Fix ximagesrc so a) the cursor doesnt trail and b) there are no yellow rectangles with the cursor + Original commit message from CVS: + 2006-03-31 Zaheer Abbas Merali + * sys/ximagesrc/ximagesrc.c: (composite_pixel), + (gst_ximagesrc_ximage_get), (gst_ximagesrc_set_property), + (gst_ximagesrc_get_caps), (gst_ximagesrc_class_init): + * sys/ximagesrc/ximagesrc.h: + * sys/ximagesrc/ximageutil.c: (ximageutil_xcontext_get): + * sys/ximagesrc/ximageutil.h: + Fix ximagesrc so a) the cursor doesnt trail and b) there are no + yellow rectangles with the cursor + +2006-03-30 23:46:42 +0000 Sébastien Moutte + + * win32/vs6/gst_plugins_good.dsw: + * win32/vs6/libgstalaw.dsp: + * win32/vs6/libgstalpha.dsp: + * win32/vs6/libgstalphacolor.dsp: + * win32/vs6/libgstapetag.dsp: + * win32/vs6/libgstauparse.dsp: + * win32/vs6/libgstautodetect.dsp: + * win32/vs6/libgstavi.dsp: + * win32/vs6/libgstcutter.dsp: + * win32/vs6/libgsteffectv.dsp: + * win32/vs6/libgstflx.dsp: + * win32/vs6/libgstgoom.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/libgstrtp.dsp: + * win32/vs6/libgstrtsp.dsp: + * win32/vs6/libgstsmpte.dsp: + * win32/vs6/libgstspeex.dsp: + * win32/vs6/libgstvideobalance.dsp: + * win32/vs6/libgstvideobox.dsp: + * win32/vs6/libgstvideoflip.dsp: + * win32/vs6/libgstvideomixer.dsp: + * win32/vs6/libgstwavenc.dsp: + * win32/vs6/libgstwavparse.dsp: + I'm too lazy to comment this + Original commit message from CVS: + *** empty log message *** + +2006-03-30 23:37:16 +0000 Sébastien Moutte + + ext\jpeg\smokecodec.c: use of GST_DEBUG instead of DEBUG(a...) for WIN32 + Original commit message from CVS: + * ext\jpeg\smokecodec.c: + use of GST_DEBUG instead of DEBUG(a...) for WIN32 + * ext\speex\gstspeexenc.c: (gst_speexenc_set_header_on_caps): + move first instruction after all variables declarations + * gst\alpha\gstalpha.c: + * gst\effectv\gstshagadelic.c: + * gst\smpte\paint.c: + * gst\videofilter\gstvideobalance.c: + define M_PI if it's not defined (it's not defined on WIN32) + * gst\cutter\gstcutter.c: (gst_cutter_chain): + * gst\id3demux\id3v2frames.c: (parse_relative_volume_adjustment_two): + * gst\level\gstlevel.c: (gst_level_set_property), (gst_level_transform_ip): + * gst\matroska\matroska-demux.c: (gst_matroska_demux_parse_info), + (gst_matroska_demux_video_caps): + * gst\matroska\matroska-mux.c: (gst_matroska_mux_start), (gst_matroska_mux_finish): + * gst\wavparse\gstwavparse.c: (gst_wavparse_stream_data): + use gst_guint64_to_gdouble for conversions + * gst\goom\filters.c: (setPixelRGB_): + fix a debug which was using undefined variable + * gst\level\gstlevel.c: (gst_level_set_caps), (gst_level_transform_ip): + * gst\matroska\ebml-read.c: (gst_ebml_read_sint): + replace LL suffix with L suffix (LL isn't supported by MSVC6.0) + * win32/vs6: + add vs6 projects files for most of plugins-good + +2006-03-30 15:37:05 +0000 Wim Taymans + + better/unified long descriptions + Original commit message from CVS: + * ext/aalib/gstaasink.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttimeoverlay.c: + * ext/cdio/gstcdiocddasrc.c: + * ext/dv/gstdvdec.c: + * ext/esd/esdmon.c: + * ext/esd/esdsink.c: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + * ext/flac/gstflactag.c: + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init): + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init): + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init): + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init): + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init): + * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init): + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokedec.c: + * ext/jpeg/gstsmokeenc.c: + * ext/libcaca/gstcacasink.c: + * ext/libmng/gstmngdec.c: + * ext/libmng/gstmngenc.c: + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: + * ext/mikmod/gstmikmod.c: + * ext/raw1394/gstdv1394src.c: + * ext/shout2/gstshout2.c: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalphacolor.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_base_init): + * gst/avi/gstavimux.c: (gst_avimux_base_init): + * gst/cutter/gstcutter.c: + * gst/debug/breakmydata.c: + * gst/debug/efence.c: + * gst/debug/gstnavigationtest.c: + * gst/debug/negotiation.c: + * gst/debug/progressreport.c: + * gst/debug/testplugin.c: + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/interleave/deinterleave.c: + * gst/interleave/interleave.c: + * gst/law/alaw-decode.c: (gst_alawdec_base_init): + * gst/law/alaw-encode.c: (gst_alawenc_base_init): + * gst/law/mulaw-decode.c: (gst_mulawdec_base_init): + * gst/law/mulaw-encode.c: (gst_mulawenc_base_init): + * gst/level/gstlevel.c: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init): + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstpipefilter.c: + * gst/oldcore/gstshaper.c: + * gst/oldcore/gststatistics.c: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtsp/gstrtpdec.c: + * gst/smpte/gstsmpte.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstgamma.c: (gst_gamma_base_init): + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideotemplate.c: + (gst_videotemplate_base_init): + * gst/videomixer/videomixer.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init): + better/unified long descriptions + Fixed #336602 + Some cleanups to auparse, don't send multiple newsegments. + +2006-03-29 16:06:50 +0000 Michael Dominic K + + ext/dv/gstdvdemux.*: Seek in READY patch. Only works for pull based mode. + Original commit message from CVS: + From a patch by: Michael Dominic K. + * ext/dv/gstdvdemux.c: (gst_dvdemux_class_init), + (gst_dvdemux_reset), (gst_dvdemux_src_convert), + (gst_dvdemux_send_event), (gst_dvdemux_flush), (gst_dvdemux_loop), + (gst_dvdemux_sink_activate_pull), (gst_dvdemux_change_state): + * ext/dv/gstdvdemux.h: + Seek in READY patch. Only works for pull based mode. + Fixes #323880 + +2006-03-27 17:06:45 +0000 Edgard Lima + + * sys/v4l2/v4l2src_calls.c: + Small fix, now pwc driver can tell about its buffers. + Original commit message from CVS: + Small fix, now pwc driver can tell about its buffers. + +2006-03-27 14:09:18 +0000 Tim-Philipp Müller + + ext/gdk_pixbuf/gstgdkpixbuf.c: Fix two crashers: don't unref the same caps twice, and set pixbuf loader to NULL after... + Original commit message from CVS: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_flush), + (gst_gdk_pixbuf_event): + Fix two crashers: don't unref the same caps twice, and + set pixbuf loader to NULL after freeing it. + +2006-03-27 14:00:02 +0000 Wim Taymans + + ext/speex/gstspeexenc.*: Don't leak adapter. + Original commit message from CVS: + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init), + (gst_speexenc_finalize), (gst_speexenc_sink_setcaps), + (gst_speexenc_chain): + * ext/speex/gstspeexenc.h: + Don't leak adapter. + A push *always* takes ownership of the buffer, even on + errors. + Small cleanups. + +2006-03-26 19:56:37 +0000 Tim-Philipp Müller + + ext/taglib/gsttaglib.*: Fix newsegment event handling a bit. We need to cache the first newsegment event, because we ... + Original commit message from CVS: + * ext/taglib/gsttaglib.cc: + * ext/taglib/gsttaglib.h: + Fix newsegment event handling a bit. We need to + cache the first newsegment event, because we can't + adjust offsets yet when we get it, as we don't + know the size of the tag yet for sure at that point. + Also do some minor cleaning up here and there and add + some debug statements. + +2006-03-26 12:24:56 +0000 Tim-Philipp Müller + + gst/id3demux/gstid3demux.c: Create source pad without leaking. + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad): + Create source pad without leaking. + +2006-03-25 21:57:24 +0000 Tim-Philipp Müller + + ext/taglib/gsttaglib.cc: We do not want to proxy the caps on the sink pad; our source pad should have application/x-i... + Original commit message from CVS: + * ext/taglib/gsttaglib.cc: + We do not want to proxy the caps on the sink pad; our + source pad should have application/x-id3 caps; also, + don't use already-freed strings in debug messages; + finally, adjust buffer offsets on buffers sent out. + +2006-03-25 13:02:55 +0000 Tim-Philipp Müller + + sys/v4l2/gstv4l2src.c: Older kernels don't seem to have this particular v4l2 format, so comment out until this gets f... + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: + Older kernels don't seem to have this particular v4l2 format, + so comment out until this gets fixed properly (and make + buildbots happy). + +2006-03-25 05:31:28 +0000 Edgard Lima + + * common: + * sys/v4l2/gstv4l2colorbalance.c: + * sys/v4l2/gstv4l2colorbalance.h: + * sys/v4l2/gstv4l2element.c: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + Just make few things more robust and also some identation. + Original commit message from CVS: + Just make few things more robust and also some identation. + +2006-03-24 19:41:03 +0000 Wim Taymans + + ext/flac/: Spifify a bit. + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_handle_seek_event): + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.h: + Spifify a bit. + Fix deadly lock order error in seeking code, STREAM_LOCK + cannot be taken within LOCK and the streaming variables are + protected with the STREAM_LOCK anyway. + +2006-03-24 18:56:16 +0000 Wim Taymans + + gst/avi/gstavidemux.c: this patch combines the global init_frames with the stream init_frames. Rationale being that t... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_index), + (gst_avi_demux_stream_index), (gst_avi_demux_stream_scan), + (gst_avi_demux_massage_index), (gst_avi_demux_handle_seek): + this patch combines the global init_frames with the stream + init_frames. Rationale being that the global delay should + be subtracted from any stream delay. + Fixes #335858. + +2006-03-24 17:11:56 +0000 Stefan Kost + + gst/: use DEBUG_FUNCPTR for collectpads + Original commit message from CVS: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_init): + * gst/multipart/multipartmux.c: (gst_multipart_mux_init): + * gst/smpte/gstsmpte.c: (gst_smpte_init): + * gst/videomixer/videomixer.c: (gst_videomixer_init): + use DEBUG_FUNCPTR for collectpads + +2006-03-24 09:54:00 +0000 Tim-Philipp Müller + + ext/jpeg/gstjpegenc.c: Don't crash when encoding images where the number of rows isn't a multiple of 2*DCTSIZE. Add s... + Original commit message from CVS: + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init), (gst_jpegenc_chain): + Don't crash when encoding images where the number of rows isn't + a multiple of 2*DCTSIZE. Add some GST_DEBUG_FUNCPTR. + +2006-03-23 21:28:06 +0000 Tim-Philipp Müller + + More state change function fixes. + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_change_state): + * gst/interleave/deinterleave.c: (deinterleave_change_state): + * gst/interleave/interleave.c: (interleave_change_state): + * gst/wavenc/gstwavenc.c: (gst_wavenc_change_state): + More state change function fixes. + +2006-03-23 20:12:47 +0000 Wim Taymans + + ext/esd/esdsink.*: Fix esd choppy playback by configuring audiosink correctly. Fixes #325191 + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_class_init), + (gst_esdsink_getcaps), (gst_esdsink_open), (gst_esdsink_close), + (gst_esdsink_prepare), (gst_esdsink_unprepare), + (gst_esdsink_delay), (gst_esdsink_reset): + * ext/esd/esdsink.h: + Fix esd choppy playback by configuring audiosink + correctly. Fixes #325191 + +2006-03-23 19:57:34 +0000 Tim-Philipp Müller + + ext/libpng/gstpngdec.c: Make state change function thread-safe. + Original commit message from CVS: + * ext/libpng/gstpngdec.c: (gst_pngdec_change_state): + Make state change function thread-safe. + +2006-03-23 16:50:32 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: Don't try to read beyond the end of the file just because the header claims a bigger size... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_get_upstream_size), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data): + Don't try to read beyond the end of the file just because + the header claims a bigger size (like with truncated files). + +2006-03-23 15:36:27 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.*: Delay source pad creation until we have the first chunk of media data, so the we can exam... + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), + (gst_wavparse_stream_headers), (gst_wavparse_add_src_pad), + (gst_wavparse_stream_data), (gst_wavparse_loop): + * gst/wavparse/gstwavparse.h: + Delay source pad creation until we have the first chunk of + media data, so the we can examine the data and adjust the + caps accordingly if required. This makes playback of .wav + files with DTS-declared-as-PCM content work (#313266). + +2006-03-22 19:50:56 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add videobalance plugn + Original commit message from CVS: + add videobalance plugn + +2006-03-22 13:02:11 +0000 Jan Schmidt + + * ChangeLog: + mention fixed bug number in the changelog + Original commit message from CVS: + mention fixed bug number in the changelog + +2006-03-22 13:00:34 +0000 Jan Schmidt + + gst/: Don't attempt typefinding on too-short buffers that have been completely trimmed away. + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain): + * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): + Don't attempt typefinding on too-short buffers that have been + completely trimmed away. + * gst/id3demux/id3tags.c: (id3demux_read_id3v2_tag): + Improve the debug output + +2006-03-21 18:12:59 +0000 Wim Taymans + + ext/esd/esdsink.c: Some cleanups. + Original commit message from CVS: + * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_init), + (gst_esdsink_finalize), (gst_esdsink_getcaps), (gst_esdsink_open), + (gst_esdsink_close), (gst_esdsink_prepare), (gst_esdsink_write), + (gst_esdsink_set_property), (gst_esdsink_get_property): + Some cleanups. + Reset fd to -1 when we close them. + +2006-03-21 16:19:37 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: the OPTIONS request result is optional so don't fail on it. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): + the OPTIONS request result is optional so don't + fail on it. + +2006-03-21 14:53:36 +0000 Edward Hervey + + gst/: gcc 4.1 unreferenced pointer fixes. + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_reset): + * gst/id3demux/gstid3demux.c: (gst_id3demux_reset): + * gst/wavparse/gstwavparse.c: (gst_wavparse_create_sourcepad), + (gst_wavparse_stream_headers), (gst_wavparse_send_event), + (gst_wavparse_change_state): + gcc 4.1 unreferenced pointer fixes. + +2006-03-21 13:07:31 +0000 Tommi Myöhänen + + gst/wavparse/gstwavparse.c: Fix block alignment calculation. Alignment should be done before adding the byte offset w... + Original commit message from CVS: + Patch by: Tommi Myöhänen + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek): + Fix block alignment calculation. Alignment should be done before + adding the byte offset where the data starts (#335231). + +2006-03-20 18:34:21 +0000 Jan Schmidt + + gst/matroska/ebml-write.c: Ensure that we set correct caps on buffers that are transferred direct from the input. + Original commit message from CVS: + * gst/matroska/ebml-write.c: (gst_ebml_write_element_push): + Ensure that we set correct caps on buffers that are transferred + direct from the input. + +2006-03-20 17:38:48 +0000 Jan Schmidt + + gst/goom/: Free filter data when cleaning up. (Fixes: #334995) + Original commit message from CVS: + * gst/goom/filters.c: (zoomFilterDestroy): + * gst/goom/goom_core.c: (goom_close): + Free filter data when cleaning up. (Fixes: #334995) + +2006-03-20 08:59:29 +0000 Tim-Philipp Müller + + ext/taglib/gsttaglib.h: Fix left-over gst_my_filter_get_type. + Original commit message from CVS: + * ext/taglib/gsttaglib.h: + Fix left-over gst_my_filter_get_type. + +2006-03-17 16:34:36 +0000 Zaheer Abbas Merali + + * sys/ximage/gstximagesrc.c: + Have a show mouse pointer property and use it if we can + Original commit message from CVS: + Have a show mouse pointer property and use it if we can + +2006-03-17 15:33:08 +0000 Tim-Philipp Müller + + configure.ac: Don't compile udp and rtsp plugins on win32 (mingw) or other systems that don't have for... + Original commit message from CVS: + * configure.ac: + Don't compile udp and rtsp plugins on win32 (mingw) or other + systems that don't have for some reason (#316203). + +2006-03-16 17:28:07 +0000 Zaheer Abbas Merali + + * ChangeLog: + * ext/raw1394/gstdv1394src.c: + * ext/raw1394/gstdv1394src.h: + Change bus reset handler so it reports useful information such as whether the device being used connected or disconne... + Original commit message from CVS: + Change bus reset handler so it reports useful information such as + whether the device being used connected or disconnected + +2006-03-16 16:06:22 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: We only care about gain and peak data for the master volume. + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: + (parse_relative_volume_adjustment_two): + We only care about gain and peak data for the master volume. + +2006-03-16 13:22:28 +0000 Tim-Philipp Müller + + gst/id3demux/id3v2frames.c: Read replay gain tags (#323721). + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), + (parse_id_string), (parse_unique_file_identifier), + (parse_relative_volume_adjustment_two), (id3v2_tag_to_taglist): + Read replay gain tags (#323721). + +2006-03-15 23:19:30 +0000 Tim-Philipp Müller + + configure.ac: Bump requirements to gst-plugins-base CVS because of buggy gst_tag_from_id3_user_tag() in 0.10.5. + Original commit message from CVS: + * configure.ac: + Bump requirements to gst-plugins-base CVS because + of buggy gst_tag_from_id3_user_tag() in 0.10.5. + +2006-03-15 22:30:24 +0000 Philippe Kalaf + + * ChangeLog: + * gst/rtp/gstrtppcmadepay.c: + Fixed one of the caps in the code from mulaw to alaw. + Original commit message from CVS: + Fixed one of the caps in the code from mulaw to alaw. + +2006-03-15 16:21:38 +0000 Jan Schmidt + + gst/apetag/gsttagdemux.c: Ensure that we set caps on the buffers we pass. + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain): + Ensure that we set caps on the buffers we pass. + * gst/id3demux/gstid3demux.c: (gst_id3demux_chain), + (gst_id3demux_sink_activate): + Ensure that we set caps on the buffers we pass. + Use STREAM, TYPE_NOT_FOUND as the error class when + typefinding fails. + +2006-03-15 16:17:12 +0000 Edward Hervey + + Fix memleak with gst_static_pad_template_get(). + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_init): + * ext/dv/gstdvdemux.c: (gst_dvdemux_init), (gst_dvdemux_add_pads): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_init): + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), + (gst_jpeg_dec_setcaps): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_init): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_init): + * ext/libmng/gstmngdec.c: (gst_mngdec_init), + (gst_mngdec_src_getcaps): + * ext/libpng/gstpngdec.c: (gst_pngdec_init), + (gst_pngdec_caps_create_and_set): + * ext/libpng/gstpngenc.c: (gst_pngenc_init): + * ext/mikmod/gstmikmod.c: (gst_mikmod_init): + * ext/speex/gstspeexdec.c: (gst_speex_dec_init): + * gst/alpha/gstalpha.c: (gst_alpha_init): + * gst/auparse/gstauparse.c: (gst_au_parse_init): + * gst/avi/gstavidemux.c: (gst_avi_demux_init), + (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_stream): + * gst/cutter/gstcutter.c: (gst_cutter_init): + * gst/debug/efence.c: (gst_efence_init), (gst_efence_getrange), + (gst_efence_checkgetrange): + * gst/debug/negotiation.c: (gst_negotiation_init): + * gst/flx/gstflxdec.c: (gst_flxdec_init): + * gst/goom/gstgoom.c: (gst_goom_init): + * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_init): + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_init): + * gst/rtp/gstrtpL16pay.c: (gst_rtpL16pay_init): + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_init): + * gst/rtp/gstrtpdepay.c: (gst_rtp_depay_init): + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_init): + * gst/rtsp/gstrtpdec.c: (gst_rtpdec_init): + * gst/smpte/gstsmpte.c: (gst_smpte_init): + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_create_sourcepad): + Fix memleak with gst_static_pad_template_get(). + This uses gst_pad_new_from_static_template() instead. + Fixes #333512 + +2006-03-15 15:08:20 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Let's not forget to chain up to the parent dispose. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_dispose): + Let's not forget to chain up to the parent dispose. + +2006-03-15 14:39:25 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Series of memleak fixes: + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), + (gst_qtdemux_init), (gst_qtdemux_dispose), + (gst_qtdemux_add_stream), (qtdemux_parse_trak): + Series of memleak fixes: + - Unref the GstAdapter in finalize. + - Use gst_pad_new_from_static_template(), shorter and safer. + - Free unused QtDemuxStream when not used. + +2006-03-14 17:56:02 +0000 Tim-Philipp Müller + + configure.ac: Bump -base requirement to 0.10.5 for gst_tag_from_id3_user_tag(), used by id3demux. + Original commit message from CVS: + * configure.ac: + Bump -base requirement to 0.10.5 for gst_tag_from_id3_user_tag(), + used by id3demux. + * gst/id3demux/gstid3demux.c: (plugin_init): + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), + (parse_user_text_identification_frame), + (parse_unique_file_identifier): + Add support for UFID and TXXX frames and extract musicbrainz tags. + +2006-03-14 17:24:03 +0000 Edward Hervey + + sys/v4l2/gstv4l2src.c: Initialization of the debugging category should be as early as possible, moving it from _class... + Original commit message from CVS: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_base_init), + (gst_v4l2src_class_init): + Initialization of the debugging category should be as early as possible, + moving it from _class_init() to beginning of _base_init(). + +2006-03-14 15:28:00 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Catch short reads, like they might happen with truncated files (see #305279); remove unnecessa... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): + Catch short reads, like they might happen with truncated + files (see #305279); remove unnecessary indentation. + +2006-03-14 14:18:16 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Fix DIB image inversion for pictures with a depth != 8 (#305279). + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_invert): + Fix DIB image inversion for pictures with a + depth != 8 (#305279). + +2006-03-14 09:23:09 +0000 Tim-Philipp Müller + + ext/jpeg/gstjpegdec.*: Fix durations on outgoing buffers after seeking in MJPEG files (#334083); some minor clean-ups. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_class_init), + (gst_jpeg_dec_chain), (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Fix durations on outgoing buffers after seeking + in MJPEG files (#334083); some minor clean-ups. + +2006-03-13 18:28:18 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Implement seek in READY (re-fixes #327658) + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), + (gst_wavparse_change_state): + Implement seek in READY (re-fixes #327658) + +2006-03-13 17:22:19 +0000 Tim-Philipp Müller + + ext/taglib/gsttaglib.cc: Add gtk-doc blurb (unused for the time being); match registered plugin name to the filename ... + Original commit message from CVS: + * ext/taglib/gsttaglib.cc: + Add gtk-doc blurb (unused for the time being); match registered + plugin name to the filename of the plugin (taglibmux => taglib) + +2006-03-13 15:49:08 +0000 Wim Taymans + + close #333784 unref the result of gst_pad_get_parent() by: Christophe Fergeau. + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_setcaps): + * ext/esd/esdmon.c: (gst_esdmon_get): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_setcaps), + (gst_gdk_pixbuf_sink_getcaps): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_getcaps), + (gst_jpegenc_setcaps): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_getcaps), + (gst_smokeenc_setcaps): + * ext/libmng/gstmngdec.c: (gst_mngdec_sinklink), + (gst_mngdec_src_getcaps): + * ext/libmng/gstmngenc.c: (gst_mngenc_sinklink), + (gst_mngenc_chain): + * ext/libpng/gstpngenc.c: (gst_pngenc_setcaps): + * ext/mikmod/gstmikmod.c: (gst_mikmod_srclink): + * ext/speex/gstspeexdec.c: (speex_dec_convert), + (speex_dec_src_event), (speex_dec_chain): + * gst/avi/gstavimux.c: (gst_avimux_vidsinkconnect), + (gst_avimux_audsinkconnect), (gst_avimux_handle_event): + * gst/debug/negotiation.c: (gst_negotiation_getcaps), + (gst_negotiation_pad_link), (gst_negotiation_chain): + * gst/flx/gstflxdec.c: (gst_flxdec_src_query_handler), + (gst_flxdec_chain): + * gst/interleave/deinterleave.c: (deinterleave_sink_link), + (deinterleave_chain): + * gst/law/mulaw-encode.c: (mulawenc_setcaps): + * gst/median/gstmedian.c: (gst_median_link): + * gst/monoscope/gstmonoscope.c: (gst_monoscope_srcconnect), + (gst_monoscope_chain): + * gst/rtp/gstrtpL16pay.c: (gst_rtpL16pay_sinkconnect): + * gst/wavenc/gstwavenc.c: (gst_wavenc_sink_setcaps): + * sys/osxaudio/gstosxaudiosink.c: (gst_osxaudiosink_chain): + * sys/osxaudio/gstosxaudiosrc.c: (gst_osxaudiosrc_get): + close #333784 unref the result of gst_pad_get_parent() + by: Christophe Fergeau. + +2006-03-13 10:05:09 +0000 Julien Moutte + + Fix build of v4l2 (sigh) + Original commit message from CVS: + 2006-03-13 Julien MOUTTE + * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: + * sys/v4l2/Makefile.am: Fix build of v4l2 (sigh) + +2006-03-12 15:33:00 +0000 Edward Hervey + + sys/v4l2/v4l2src_calls.c: g_atomic_int_set is only available in glib-0.10, use gst_atomic_int_et instead. + Original commit message from CVS: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_init), + (gst_v4l2src_buffer_pool_free): + g_atomic_int_set is only available in glib-0.10, use gst_atomic_int_et + instead. + +2006-03-12 15:25:51 +0000 Edward Hervey + + sys/v4l2/gstv4l2element.h: Remove tim's addition of "_stdint.h" since it doesn't make the PPC buildbot happy. + Original commit message from CVS: + * sys/v4l2/gstv4l2element.h: + Remove tim's addition of "_stdint.h" since it doesn't make the PPC + buildbot happy. + I will just use the same comment Ronald used when he added these lines: + Yet Another Hack (tm) for kernel header borkedness. + +2006-03-12 15:02:02 +0000 Tim-Philipp Müller + + ext/taglib/: Add support for writing MusicBrainz IDs. + Original commit message from CVS: + * ext/taglib/Makefile.am: + * ext/taglib/gsttaglib.cc: + * ext/taglib/gsttaglib.h: + Add support for writing MusicBrainz IDs. + +2006-03-12 14:43:57 +0000 Tim-Philipp Müller + + sys/v4l2/gstv4l2element.h: Include "_stdint.h" in an attempt to make the + Original commit message from CVS: + * sys/v4l2/gstv4l2element.h: + Include "_stdint.h" in an attempt to make the + PPC-buildbot happy. + +2006-03-11 22:50:03 +0000 Edgard Lima + + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2.c: + * sys/v4l2/gstv4l2colorbalance.h: + * sys/v4l2/gstv4l2element.c: + * sys/v4l2/gstv4l2element.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2tuner.c: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/gstv4l2xoverlay.c: + * sys/v4l2/gstv4l2xoverlay.h: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + V4L2 ported to 0.10. + Original commit message from CVS: + V4L2 ported to 0.10. + +2006-03-11 10:58:08 +0000 Alex Lancaster + + ext/taglib/gsttaglib.cc: and add support for TCOP (copyright) + Original commit message from CVS: + 2006-03-11 Christophe Fergeau + Patch by: Alex Lancaster + * ext/taglib/gsttaglib.cc: fix writing of TPOS tags (album number), + and add support for TCOP (copyright) + +2006-03-09 20:02:44 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Fix build with gcc-4.1 (#327355). + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_send_event): + Fix build with gcc-4.1 (#327355). + +2006-03-09 17:44:17 +0000 Christophe Fergeau + + new id3v2 muxer based on TagLib + Original commit message from CVS: + 2006-03-09 Christophe Fergeau + reviewed by: Tim-Philipp Müller + * configure.ac: + * ext/Makefile.am: + * ext/taglib/Makefile.am: + * ext/taglib/gsttaglib.cc: + * ext/taglib/gsttaglib.h: new id3v2 muxer based on TagLib + +2006-03-09 11:47:32 +0000 Wim Taymans + + ext/dv/gstdvdemux.c: Handle events in push mode better, can now do non-flushing seeks in push mode as well. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_sink_event), + (gst_dvdemux_convert_segment), (gst_dvdemux_demux_frame): + Handle events in push mode better, can now do non-flushing + seeks in push mode as well. + +2006-03-08 12:16:14 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Extract disc number and count from files that use 'disk' instead of 'disc' as node identifier ... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): + Extract disc number and count from files that use + 'disk' instead of 'disc' as node identifier for that + (fixes #332066). + +2006-03-07 17:31:03 +0000 Wim Taymans + + gst/udp/gstdynudpsink.c: Applied patch from Kai Vehmanen, fixes #333624. + Original commit message from CVS: + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_class_init): + Applied patch from Kai Vehmanen, fixes #333624. + +2006-03-06 22:22:45 +0000 Julien Moutte + + ext/libpng/gstpngdec.c: Implement paletted and grayscale png files handling. (#150363). + Original commit message from CVS: + 2006-03-06 Julien MOUTTE + * ext/libpng/gstpngdec.c: (gst_pngdec_caps_create_and_set): + Implement paletted and grayscale png files handling. + (#150363). + +2006-03-06 00:10:29 +0000 Thomas Vander Stichele + + ext/speex/gstspeexenc.c: fix a tag list assert follow gst-plugins-base/ext/ogg/README; set OFFSET and OFFSET_END. Mu... + Original commit message from CVS: + * ext/speex/gstspeexenc.c: (gst_speexenc_set_header_on_caps), + (gst_speexenc_chain): + fix a tag list assert + follow gst-plugins-base/ext/ogg/README; set OFFSET + and OFFSET_END. Muxes correctly with gst-plugins-base + > 0.9.3 + +2006-03-05 13:03:40 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Add support for '3IVD' fourcc (#333403). + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add support for '3IVD' fourcc (#333403). + +2006-03-04 20:11:35 +0000 Tim-Philipp Müller + + gst/id3demux/: Use new typefind helper functions here as well, and do typefinding in pull-mode if upstream supports t... + Original commit message from CVS: + * gst/id3demux/Makefile.am: + * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad), + (gst_id3demux_chain), (gst_id3demux_sink_activate): + Use new typefind helper functions here as well, and + do typefinding in pull-mode if upstream supports that. + +2006-03-04 18:57:37 +0000 Benjamin Pineau + + sys/sunaudio/: Remove unused variables, breaks build from CVS + Original commit message from CVS: + * sys/sunaudio/gstsunaudiomixerctrl.c: + (gst_sunaudiomixer_ctrl_get_volume), + (gst_sunaudiomixer_ctrl_set_volume): + * sys/sunaudio/gstsunaudiomixertrack.c: + (gst_sunaudiomixer_track_new): + Remove unused variables, breaks build from CVS + with -Werror (#333392, patch by: Benjamin Pineau) + +2006-03-03 23:45:23 +0000 Sébastien Moutte + + 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-03-03 18:36:53 +0000 Wim Taymans + + docs/plugins/: Added wavparse docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + Added wavparse docs. + * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), + (gst_wavparse_reset), (gst_wavparse_init), + (gst_wavparse_create_sourcepad), (gst_wavparse_parse_file_header), + (gst_wavparse_stream_init), (gst_wavparse_perform_seek), + (gst_wavparse_stream_headers), (gst_wavparse_send_event), + (gst_wavparse_stream_data), (gst_wavparse_loop), + (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate_pull), + (gst_wavparse_change_state): + * gst/wavparse/gstwavparse.h: + Implement seek in READY (fixes #327658) + Added docs and did some cleanups. + +2006-03-03 17:51:16 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.*: If we have an index, use a duration based on the index instead of blindly trusting the informa... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_stream), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_stream_header): + * gst/avi/gstavidemux.h: + If we have an index, use a duration based on the index instead + of blindly trusting the information in the stream headers + (fixes #331817). + +2006-03-03 15:50:40 +0000 Wim Taymans + + docs/plugins/: Added smoke and jpeg to the docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + Added smoke and jpeg to the docs. + * ext/jpeg/Makefile.am: + * ext/jpeg/gstjpeg.c: (plugin_init): + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): + * ext/jpeg/gstjpegenc.h: + * ext/jpeg/gstsmokedec.c: (gst_smokedec_init), + (gst_smokedec_chain): + * ext/jpeg/gstsmokedec.h: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): + * ext/jpeg/gstsmokeenc.h: + * ext/jpeg/smokecodec.h: + Port smokedec (fixes #331905). + Added some docs. + Some cleanups. + +2006-03-03 14:39:55 +0000 Wim Taymans + + docs/plugins/: Added videobalance and videoflip to the docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + Added videobalance and videoflip to the docs. + * gst/videofilter/Makefile.am: + * gst/videofilter/gstvideobalance.c: + (gst_video_balance_update_tables_planar411), + (gst_video_balance_is_passthrough), + (gst_video_balance_update_properties), (oil_tablelookup_u8), + (gst_video_balance_planar411_ip), (gst_video_balance_set_caps), + (gst_video_balance_transform_ip), (gst_video_balance_base_init), + (gst_video_balance_finalize), (gst_video_balance_class_init), + (gst_video_balance_init), (gst_video_balance_interface_supported), + (gst_video_balance_interface_init), + (gst_video_balance_colorbalance_list_channels), + (gst_video_balance_colorbalance_set_value), + (gst_video_balance_colorbalance_get_value), + (gst_video_balance_colorbalance_init), + (gst_video_balance_set_property), (gst_video_balance_get_property), + (gst_video_balance_get_type), (plugin_init): + * gst/videofilter/gstvideobalance.h: + Ported to 0.10. (Fixes #326160) + Added docs. + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideoflip.h: + Added docs. + +2006-03-03 11:07:41 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Use GST_WARNING instead of GST_ERROR for all the too short/long atoms when parsing. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_parse_trak): + Use GST_WARNING instead of GST_ERROR for all the too short/long atoms + when parsing. + Also let's be a bit less vulgar in our warning messages :) + +2006-03-02 15:14:22 +0000 Tim-Philipp Müller + + configure.ac: Bump requirements to current core and -base CVS (core for new typefind helper API, and -base for the + Original commit message from CVS: + * configure.ac: + Bump requirements to current core and -base CVS + (core for new typefind helper API, and -base for the + WAVFORMATEX support that was added to libgstriff and + is needed by wavparse). + * gst/apetag/Makefile.am: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain), + (gst_tag_demux_sink_activate): + Use new typefind helpers for typefinding instead of our + home-grown stuff; also, do typefinding in pull-mode if + upstream supports that. + +2006-02-28 11:59:49 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Can't divide through zero (suppress warning in case of stream with one single still picture) (... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Can't divide through zero (suppress warning in case of + stream with one single still picture) (see #327083) + +2006-02-28 10:40:01 +0000 Christian Schaller + + * ChangeLog: + remove conflict indicator + Original commit message from CVS: + remove conflict indicator + +2006-02-28 10:39:08 +0000 Christian Schaller + + * ChangeLog: + add missing entry + Original commit message from CVS: + add missing entry + +2006-02-28 10:29:16 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Use DEBUG_OBJECT more. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_pad_convert), (gst_wavparse_srcpad_event), + (gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull): + Use DEBUG_OBJECT more. + +2006-02-28 10:22:11 +0000 Wim Taymans + + docs/plugins/: Added dvdec and dvdemux to docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + Added dvdec and dvdemux to docs. + * ext/dv/gstdvdec.c: (gst_dvdec_base_init), (gst_dvdec_chain): + Added docs. + Check frame sizes so we don't crash when don't have enough + data. + Send nice error messages on error. + * ext/dv/gstdvdemux.c: (gst_dvdemux_base_init), + (gst_dvdemux_class_init), (gst_dvdemux_init), + (gst_dvdemux_finalize), (gst_dvdemux_reset), + (gst_dvdemux_src_convert), (gst_dvdemux_sink_convert), + (gst_dvdemux_src_query), (gst_dvdemux_sink_query), + (gst_dvdemux_push_event), (gst_dvdemux_handle_sink_event), + (gst_dvdemux_convert_src_pair), (gst_dvdemux_convert_sink_pair), + (gst_dvdemux_convert_src_to_sink), (gst_dvdemux_handle_push_seek), + (gst_dvdemux_do_seek), (gst_dvdemux_handle_pull_seek), + (gst_dvdemux_handle_src_event), (gst_dvdemux_demux_audio), + (gst_dvdemux_demux_video), (gst_dvdemux_demux_frame), + (gst_dvdemux_flush), (gst_dvdemux_chain), (gst_dvdemux_loop), + (gst_dvdemux_sink_activate_push), (gst_dvdemux_sink_activate_pull), + (gst_dvdemux_sink_activate), (gst_dvdemux_change_state): + * ext/dv/gstdvdemux.h: + Added docs. + Implement pull mode. + Fix memleaks. + Reduce memcpy for the video demuxing. + +2006-02-28 09:21:27 +0000 Jan Schmidt + + ext/annodex/: Add a little extra debug. Make the decoder not return NOT_LINKED, as we want to continue decoding all C... + Original commit message from CVS: + * ext/annodex/gstcmmldec.c: (gst_cmml_dec_sink_event), + (gst_cmml_dec_new_buffer), (gst_cmml_dec_parse_preamble), + (gst_cmml_dec_parse_head), (gst_cmml_dec_push_clip): + * ext/annodex/gstcmmlparser.c: (gst_cmml_parser_parse_chunk): + Add a little extra debug. Make the decoder not return NOT_LINKED, + as we want to continue decoding all CMML and emitting tags. + +2006-02-27 14:37:29 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add annodex plugin + Original commit message from CVS: + add annodex plugin + +2006-02-27 14:00:18 +0000 Michael Smith + + ext/annodex/gstskeltag.*: Deleted; these files aren't used any more either. + Original commit message from CVS: + * ext/annodex/gstskeltag.c: + * ext/annodex/gstskeltag.h: + Deleted; these files aren't used any more either. + +2006-02-25 20:37:29 +0000 Julien Moutte + + ext/Makefile.am: Fix dist-check. + Original commit message from CVS: + 2006-02-25 Julien MOUTTE + * ext/Makefile.am: Fix dist-check. + +2006-02-25 19:36:24 +0000 Julien Moutte + + ext/annodex/gstcmmlenc.c: Fix another memleak. + Original commit message from CVS: + 2006-02-25 Julien MOUTTE + * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_push_clip): Fix another + memleak. + +2006-02-25 19:07:41 +0000 Julien Moutte + + Fix a memleak in gst_cmml_track_list_add_clip. + Original commit message from CVS: + 2006-02-25 Alessandro Decina + * ext/annodex/Makefile.am: + * ext/annodex/gstannodex.c: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmlenc.c: + * ext/annodex/gstcmmlparser.c: + * ext/annodex/gstcmmlparser.h: + * ext/annodex/gstcmmlutils.c: + * tests/check/elements/cmmldec.c: + * tests/check/elements/cmmlenc.c: + Fix a memleak in gst_cmml_track_list_add_clip. + Handle overflows in clip's start and end times. + Add the "encoded" parameter to cmmldec and cmmlenc caps. + Do not parse junk at the end of a CMML preamble buffer. + Register a libxml error handler to not print stuff on stderr. + Check for bad clip start and end times in the testsuites. + +2006-02-25 11:37:10 +0000 Julien Moutte + + ext/annodex/: Fix possible memleaks. + Original commit message from CVS: + 2006-02-25 Julien MOUTTE + * ext/annodex/gstcmmldec.c: (gst_cmml_dec_class_init), + (gst_cmml_dec_finalize), (gst_cmml_dec_change_state): + * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_class_init), + (gst_cmml_enc_finalize), (gst_cmml_enc_change_state): + * ext/annodex/gstcmmlutils.c: (gst_cmml_track_list_destroy): Fix + possible memleaks. + +2006-02-24 23:52:28 +0000 Julien Moutte + + tests/check/: Fix tests so that they use the plugins-base tags. + Original commit message from CVS: + 2006-02-25 Julien MOUTTE + * tests/check/Makefile.am: + * tests/check/elements/cmmldec.c: + * tests/check/elements/cmmlenc.c: Fix tests so that they use + the plugins-base tags. + +2006-02-24 23:36:58 +0000 Julien Moutte + + ext/Makefile.am: Re-enable module. + Original commit message from CVS: + 2006-02-25 Julien MOUTTE + * ext/Makefile.am: Re-enable module. + +2006-02-24 23:32:14 +0000 Julien Moutte + + tests/check/Makefile.am: Forgot to remove that test. + Original commit message from CVS: + 2006-02-25 Julien MOUTTE + * tests/check/Makefile.am: Forgot to remove that test. + +2006-02-24 23:31:08 +0000 Julien Moutte + + Try to fix Annodex plugin. + Original commit message from CVS: + 2006-02-25 Julien MOUTTE + * ext/annodex/Makefile.am: + * ext/annodex/gstannodex.c: (plugin_init): + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstskeldec.c: + * ext/annodex/gstskeldec.h: + * tests/check/Makefile.am: + * tests/check/elements/skeldec.c: Try to fix Annodex plugin. + +2006-02-24 23:06:27 +0000 Julien Moutte + + tests/check/Makefile.am: Disable those checks as well. + Original commit message from CVS: + 2006-02-25 Julien MOUTTE + * tests/check/Makefile.am: Disable those checks as well. + +2006-02-24 22:49:29 +0000 Julien Moutte + + ext/Makefile.am: Disable annodex for now until we figure out how to make it build. + Original commit message from CVS: + 2006-02-24 Julien MOUTTE + * ext/Makefile.am: Disable annodex for now until we figure out + how to make it build. + * ext/gdk_pixbuf/Makefile.am: Note for Thomas : + Add a rule to your checklist : "please try to at least build + what you are going to commit into -good, or if you are too lazy + to do that, please check that the buildbots are not crying because + of your commit." + +2006-02-24 19:51:29 +0000 Edgard Lima + + * ChangeLog: + * configure.ac: + * ext/Makefile.am: + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/gdk_pixbuf/gstgdkpixbuf.h: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/gdk_pixbuf/pixbufscale.h: + I'm too lazy to comment this + Original commit message from CVS: + Gdkpixbuf ported from 0.8 to 0.10 by Renato Filho . gst_loader and gdkpixbufanimation still need port. + +2006-02-24 19:49:32 +0000 Fabrizio Gennari + + gst/qtdemux/qtdemux.c: Add support for palettised Apple SMC videos (#327075, based on + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), + (qtdemux_parse_trak), (qtdemux_video_caps): + Add support for palettised Apple SMC videos (#327075, based on + patch by: Fabrizio Gennari ). + +2006-02-24 19:07:10 +0000 Michael Smith + + Add Annodex elements from Alessendro Decina: skeleton and CMML. + Original commit message from CVS: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * ext/Makefile.am: + * ext/annodex/Makefile.am: + * ext/annodex/gstannodex.c: + * ext/annodex/gstannodex.h: + * ext/annodex/gstcmmldec.c: + * ext/annodex/gstcmmldec.h: + * ext/annodex/gstcmmlenc.c: + * ext/annodex/gstcmmlenc.h: + * ext/annodex/gstcmmlparser.c: + * ext/annodex/gstcmmlparser.h: + * ext/annodex/gstcmmltag.c: + * ext/annodex/gstcmmltag.h: + * ext/annodex/gstcmmlutils.c: + * ext/annodex/gstcmmlutils.h: + * ext/annodex/gstskeldec.c: + * ext/annodex/gstskeldec.h: + * ext/annodex/gstskeltag.c: + * ext/annodex/gstskeltag.h: + * tests/check/Makefile.am: + * tests/check/elements/cmmldec.c: + * tests/check/elements/cmmlenc.c: + * tests/check/elements/skeldec.c: + Add Annodex elements from Alessendro Decina: skeleton and CMML. + Includes tests & docs, oh my! Passes Thomas's -good checklist + entirely. Wow. + +2006-02-24 17:09:56 +0000 Michael Smith + + autogen.sh: Check for automake 1.9 as well. + Original commit message from CVS: + * autogen.sh: + Check for automake 1.9 as well. + +2006-02-24 14:49:48 +0000 Tim-Philipp Müller + + ext/flac/gstflacenc.c: Change min. sample rate to 8kHz to match flacdec's. + Original commit message from CVS: + * ext/flac/gstflacenc.c: + Change min. sample rate to 8kHz to match flacdec's. + +2006-02-23 20:08:58 +0000 Tim-Philipp Müller + + ext/cdio/Makefile.am: Add GST_BASE_CFLAGS and GST_BASE_LIBS (seems to be required for Cygwin, see #317048) + Original commit message from CVS: + * ext/cdio/Makefile.am: + Add GST_BASE_CFLAGS and GST_BASE_LIBS (seems to be + required for Cygwin, see #317048) + * gst/rtp/gstasteriskh263.c: + Cygwin has includes for both the unix network socket API + and the windows API, but only one can be included, so fix + includes to only use one or the other, prefering the unxi + one (#317048). + +2006-02-23 12:21:25 +0000 Philippe Kalaf + + rtp/gst/: Separated the G711 payloaders/depayloaders into separate elements for mulaw/alaw. Also removed the old g711... + Original commit message from CVS: + 2006-02-23 Philippe Kalaf + * rtp/gst/gstrtppcmadepay.c: + * rtp/gst/gstrtppcmadepay.h: + * rtp/gst/gstgstrtppcmapay.c: + * rtp/gst/gstgstrtppcmapay.h: + * rtp/gst/gstrtppcmudepay.c: + * rtp/gst/gstrtppcmudepay.h: + * rtp/gst/gstrtppcmupay.c: + * rtp/gst/gstrtppcmupay.h: + * rtp/gst/Makefile.am: + * rtp/gst/gstrtp.c: + * rtp/gst/README: + Separated the G711 payloaders/depayloaders into separate elements for + mulaw/alaw. Also removed the old g711 payloaders/depayloaders. + +2006-02-22 20:22:25 +0000 Wim Taymans + + ext/dv/: Ueber spiffify some more, added debug category. + Original commit message from CVS: + * ext/dv/gstdvdec.c: (gst_dvdec_base_init), (gst_dvdec_init), + (gst_dvdec_change_state): + * ext/dv/gstdvdec.h: + * ext/dv/gstdvdemux.c: (gst_dvdemux_base_init), (gst_dvdemux_init), + (gst_dvdemux_src_convert), (gst_dvdemux_sink_convert), + (gst_dvdemux_src_query), (gst_dvdemux_sink_query), + (gst_dvdemux_handle_sink_event), (gst_dvdemux_demux_frame), + (gst_dvdemux_flush), (gst_dvdemux_chain), + (gst_dvdemux_change_state): + * ext/dv/gstdvdemux.h: + Ueber spiffify some more, added debug category. + Use _scale. + Use segments, respect playback rate from newsegment. + Fix refcount issue. + +2006-02-22 09:33:25 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Add 'dvsd' and 'dv25' to list of possible fourcc values for DV Video. + Original commit message from CVS: + Reviewed by : Edward Hervey + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add 'dvsd' and 'dv25' to list of possible fourcc values for DV Video. + Add image/png for fourcc 'png ' + +2006-02-20 21:19:59 +0000 Jan Schmidt + + Port ximagesrc to 0.10 (Closes #304795) + Original commit message from CVS: + * configure.ac: + * sys/Makefile.am: + * sys/ximagesrc/Makefile.am: + * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_return_buf), + (gst_ximagesrc_open_display), (gst_ximagesrc_start), + (gst_ximagesrc_stop), (gst_ximagesrc_unlock), + (gst_ximagesrc_recalc), (composite_pixel), + (gst_ximagesrc_ximage_get), (gst_ximagesrc_create), + (gst_ximagesrc_set_property), (gst_ximagesrc_get_property), + (gst_ximagesrc_clear_bufpool), (gst_ximagesrc_base_init), + (gst_ximagesrc_dispose), (gst_ximagesrc_finalize), + (gst_ximagesrc_get_caps), (gst_ximagesrc_set_caps), + (gst_ximagesrc_fixate), (gst_ximagesrc_class_init), + (gst_ximagesrc_init), (plugin_init): + * sys/ximagesrc/ximagesrc.h: + * sys/ximagesrc/ximageutil.c: (ximageutil_handle_xerror), + (ximageutil_check_xshm_calls), (ximageutil_xcontext_get), + (ximageutil_xcontext_clear), + (ximageutil_calculate_pixel_aspect_ratio), + (gst_ximagesrc_buffer_finalize), (gst_ximage_buffer_free), + (gst_ximagesrc_buffer_init), (gst_ximagesrc_buffer_class_init), + (gst_ximagesrc_buffer_get_type), (gst_ximageutil_ximage_new), + (gst_ximageutil_ximage_destroy): + * sys/ximagesrc/ximageutil.h: + Port ximagesrc to 0.10 (Closes #304795) + +=== release 0.10.1 === + +2006-02-20 19:12:10 +0000 Jan Schmidt + + configure.ac: releasing 0.10.1, "Slimy - yet satisfying" + Original commit message from CVS: + 2006-02-20 Jan Schmidt + * configure.ac: + releasing 0.10.1, "Slimy - yet satisfying" + +2006-02-20 13:08:50 +0000 Jan Schmidt + + ext/ladspa/gstsignalprocessor.c: Fix compilation of LADPSA. It doesn't seem to work, and isn't enabled for the build,... + Original commit message from CVS: + * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_event), + (gst_signal_processor_process): + Fix compilation of LADPSA. It doesn't seem to work, and isn't + enabled for the build, but it helps me win the feature-count + competitions ooh yeah. + +2006-02-19 16:02:25 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Use scaling code for added precission and more correct stop position in case scale==0. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_src_convert), + (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), + (gst_avi_demux_parse_file_header), (gst_avi_demux_stream_init), + (gst_avi_demux_parse_avih), (gst_avi_demux_parse_superindex), + (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), + (gst_avi_demux_stream_header), (gst_avi_demux_change_state): + Use scaling code for added precission and more correct stop + position in case scale==0. + +2006-02-19 12:09:19 +0000 Wim Taymans + + gst/flx/gstflxdec.*: Implement DURATION query. + Original commit message from CVS: + * gst/flx/gstflxdec.c: (gst_flxdec_src_query_handler), + (gst_flxdec_chain): + * gst/flx/gstflxdec.h: + Implement DURATION query. + +2006-02-19 11:57:58 +0000 Wim Taymans + + gst/flx/: Set MALLOCDATA for the temp buffers so we don't leak. + Original commit message from CVS: + * gst/flx/flx_color.h: + * gst/flx/flx_fmt.h: + * gst/flx/gstflxdec.c: (gst_flxdec_init), + (gst_flxdec_src_query_handler), (flx_decode_color), + (gst_flxdec_chain): + * gst/flx/gstflxdec.h: + Set MALLOCDATA for the temp buffers so we don't leak. + Some debug cleanups. + Consume all data in the adapter before leaving the chain + function. Fixes #330678. + +2006-02-18 20:48:09 +0000 Jan Schmidt + + gst/id3demux/: Handle 0 data size in otherwise valid frames. + Original commit message from CVS: + * gst/id3demux/id3tags.c: (id3demux_id3v2_frames_to_tag_list): + * gst/id3demux/id3v2frames.c: (id3v2_genre_fields_to_taglist): + Handle 0 data size in otherwise valid frames. + Handle numeric strings in 2.4.0 even when not in parentheses + +2006-02-18 17:20:48 +0000 Tim-Philipp Müller + + gst/matroska/: Recognise SSA/ASS and USF subtitle formats and set proper caps when they are found. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_subtitle_caps), + (gst_matroska_demux_plugin_init): + * gst/matroska/matroska-ids.h: + Recognise SSA/ASS and USF subtitle formats and + set proper caps when they are found. + +2006-02-17 18:25:42 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Don't GST_LOG timestamps from nonexistent index entries (#331582). + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_movie): + Don't GST_LOG timestamps from nonexistent index + entries (#331582). + +2006-02-17 17:54:05 +0000 Tim-Philipp Müller + + ext/jpeg/gstjpegdec.c: Fix invalid memory access for some odd-sized images (see image contained in quicktime stream i... + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_decode_direct), + (gst_jpeg_dec_chain): + Fix invalid memory access for some odd-sized images + (see image contained in quicktime stream in #327083); + use g_malloc() instead of g_alloca(). + +2006-02-17 16:28:29 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Check that the size of the returned buffer is of the correct size because the parser assumes t... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header): + Check that the size of the returned buffer is of the correct size + because the parser assumes that. + Fixes #331543. + +2006-02-17 15:37:38 +0000 Wim Taymans + + gst/rtp/gstrtpamrdepay.c: Patch from Sebastien Cote, fixes #319884 + Original commit message from CVS: + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_chain): + Patch from Sebastien Cote, fixes #319884 + +2006-02-17 11:19:34 +0000 Tim-Philipp Müller + + ext/cdio/gstcdio.c: Init debug category (#331253). + Original commit message from CVS: + * ext/cdio/gstcdio.c: (plugin_init): + Init debug category (#331253). + +2006-02-17 10:53:38 +0000 Christian Schaller + + * ext/gconf/gconf.c: + * ext/gconf/gconf.h: + * ext/gconf/gstgconfaudiosink.c: + * ext/gconf/gstgconfaudiosink.h: + * gconf/gstreamer.schemas.in: + * gst-plugins-good.spec.in: + add Jurg's patch for multidevice support + Original commit message from CVS: + add Jurg's patch for multidevice support + +2006-02-16 20:30:13 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: Pass extra_data to gst_riff_create_audio_caps(), so that + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): + Pass extra_data to gst_riff_create_audio_caps(), so that + WAVEFORMATEX stuff works. Post audio codec name and post + it as taglist on the bus. Allow up to 8 channesl for raw + PCM in the source pad template caps. + +2006-02-16 16:53:52 +0000 Wim Taymans + + gst/multipart/multipartdemux.c: Applied #318663. Gives quite a few false positives in autoscan mode, but it's better ... + Original commit message from CVS: + * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), + (gst_multipart_demux_class_init), (gst_multipart_demux_init), + (gst_multipart_demux_finalize), (gst_multipart_find_pad_by_mime), + (gst_multipart_demux_chain), (gst_multipart_demux_change_state), + (gst_multipart_set_property), (gst_multipart_get_property): + Applied #318663. Gives quite a few false positives in + autoscan mode, but it's better than nothing. Not closing yet. + +2006-02-16 14:13:48 +0000 Wim Taymans + + Update documentation. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-udp.xml: + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_start): + Update documentation. + Fix args. + +2006-02-16 14:02:57 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Don't stop the task if the pad isn't linked. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_event), + (gst_qtdemux_loop), (qtdemux_sink_activate_pull): + Don't stop the task if the pad isn't linked. + +2006-02-16 10:58:18 +0000 Jan Schmidt + + gst/id3demux/id3tags.c: ID3 2.3.0 used synch-safe integers for the tag size, but not for the frame size. (Fixes #331368) + Original commit message from CVS: + * gst/id3demux/id3tags.c: (id3demux_id3v2_frames_to_tag_list): + ID3 2.3.0 used synch-safe integers for the tag size, but not for the + frame size. (Fixes #331368) + +2006-02-16 10:42:25 +0000 Wim Taymans + + gst/rtsp/README: Updated README. + Original commit message from CVS: + * gst/rtsp/README: + Updated README. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_set_property), + (gst_rtspsrc_get_property), (gst_rtspsrc_stream_setup_rtp): + * gst/rtsp/gstrtspsrc.h: + Make sure the RTP port is an even port an try to allocate + another if not. + Added retry property to control max retries for port allocation. + Make sure RTCP port is RTP port+1. + Cleanup when port allocation fails. + Fixes #319183. + +2006-02-16 09:17:58 +0000 Wouter Paesen + + gst/alpha/gstalpha.c: Don't ignore return value of the parent class's state + Original commit message from CVS: + * gst/alpha/gstalpha.c: (gst_alpha_change_state): + Don't ignore return value of the parent class's state + change function (#331385, patch by: Wouter Paesen). + +2006-02-15 12:17:28 +0000 Wim Taymans + + Add HAL sound device wrapper plugins. Closes #329106 + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * ext/Makefile.am: + * ext/hal/Makefile.am: + * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init), + (gst_hal_audio_sink_class_init), (gst_hal_audio_sink_reset), + (gst_hal_audio_sink_init), (gst_hal_audio_sink_dispose), + (do_toggle_element), (gst_hal_audio_sink_set_property), + (gst_hal_audio_sink_get_property), + (gst_hal_audio_sink_change_state): + * ext/hal/gsthalaudiosink.h: + * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init), + (gst_hal_audio_src_class_init), (gst_hal_audio_src_reset), + (gst_hal_audio_src_init), (gst_hal_audio_src_dispose), + (do_toggle_element), (gst_hal_audio_src_set_property), + (gst_hal_audio_src_get_property), (gst_hal_audio_src_change_state): + * ext/hal/gsthalaudiosrc.h: + * ext/hal/gsthalelements.c: (plugin_init): + * ext/hal/gsthalelements.h: + * ext/hal/hal.c: (gst_hal_get_string), + (gst_hal_render_bin_from_udi), (gst_hal_get_audio_sink), + (gst_hal_get_audio_src): + * ext/hal/hal.h: + Add HAL sound device wrapper plugins. Closes #329106 + +2006-02-15 12:13:47 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: It appears 100% equals 1/1 and not 100/1 ... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain): + It appears 100% equals 1/1 and not 100/1 ... + +2006-02-15 10:15:47 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Add comment in a fultile attempt to stop the copy-and-paste paradigm leading to duplication of... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): + Add comment in a fultile attempt to stop the copy-and-paste + paradigm leading to duplication of bad code. + * gst/rtsp/rtsptransport.c: (rtsp_transport_parse): + Mime parameters have to be checked case insensitive + +2006-02-15 09:45:27 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: When buffering MDAT data, show the user something is happening by posting 'buffering' messages... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_post_buffering), + (gst_qtdemux_chain): + When buffering MDAT data, show the user something is + happening by posting 'buffering' messages on the bus. + +2006-02-14 23:23:08 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: Advance stream time for lagging subtitle streams by sending newsegment events with the... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_sync_streams): + Advance stream time for lagging subtitle streams by sending + newsegment events with the update flag set. + +2006-02-14 18:50:13 +0000 Edward Hervey + + gst/qtdemux/qtdemux.*: Make push-based work if mdat atom is before moov atom. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), + (gst_qtdemux_handle_src_query), (gst_qtdemux_change_state), + (next_entry_size), (gst_qtdemux_chain): + * gst/qtdemux/qtdemux.h: + Make push-based work if mdat atom is before moov atom. + Don't answer duration query. This should be transformed into replying + FALSE to seek events. + +2006-02-14 16:58:30 +0000 Edward Hervey + + gst/avi/gstavidemux.c: There can be bogus data before the hdrl LIST tag in the RIFF header. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): + There can be bogus data before the hdrl LIST tag in the RIFF header. + It's hard to say if it's not respecting the AVI specifications or not, + but since Google Video is producing AVIs like that and the other player + don't seem to complain, I guess we should do the same. + +2006-02-14 11:24:53 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Handle the case where data atoms are before moov atoms in push-based mode. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (next_entry_size), (gst_qtdemux_chain): + Handle the case where data atoms are before moov atoms in push-based mode. + Errors out gracefully. + +2006-02-13 22:04:42 +0000 Edward Hervey + + gst/qtdemux/: QtDemux can now work push-based. + Original commit message from CVS: + * gst/qtdemux/Makefile.am: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), + (gst_qtdemux_handle_sink_event), (gst_qtdemux_change_state), + (extract_initial_length_and_fourcc), + (gst_qtdemux_loop_state_header), (gst_qtdemux_loop_state_movie), + (gst_qtdemux_loop_header), (next_entry_size), (gst_qtdemux_chain), + (qtdemux_sink_activate), (qtdemux_sink_activate_pull), + (qtdemux_sink_activate_push), (qtdemux_parse_trak): + * gst/qtdemux/qtdemux.h: + QtDemux can now work push-based. + It still needs some love for seeking. + +2006-02-13 12:00:51 +0000 Jan Schmidt + + gst/id3demux/id3v2frames.c: Add more validation to ensure that a char encoding conversion produced a valid UTF-8 string. + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (parse_insert_string_field), + (parse_split_strings): + Add more validation to ensure that a char encoding conversion + produced a valid UTF-8 string. + +2006-02-13 10:43:15 +0000 Edward Hervey + + gst/avi/gstavidemux.c: Properly handle end of segment. Closes #330885. + Original commit message from CVS: + Reviewed by: Edward Hervey + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): + Properly handle end of segment. Closes #330885. + +2006-02-13 10:36:23 +0000 Wim Taymans + + gst/rtp/gstrtpmp4gpay.h: For got to commit this one. + Original commit message from CVS: + * gst/rtp/gstrtpmp4gpay.h: + For got to commit this one. + +2006-02-12 18:59:36 +0000 Wim Taymans + + gst/rtp/gstrtpmp4gpay.*: Make more things work. + Original commit message from CVS: + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_class_init), + (gst_rtp_mp4g_pay_init), (gst_rtp_mp4g_pay_parse_audio_config), + (gst_rtp_mp4g_pay_parse_video_config), (gst_rtp_mp4g_pay_new_caps), + (gst_rtp_mp4g_pay_setcaps), (gst_rtp_mp4g_pay_flush): + * gst/rtp/gstrtpmp4gpay.h: + Make more things work. + Handle ACC config strings. + +2006-02-12 13:10:20 +0000 Thomas Vander Stichele + + gst/rtp/gstrtpamrpay.c: set timestamps if no incoming timestamps set + Original commit message from CVS: + * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_handle_buffer): + set timestamps if no incoming timestamps set + +2006-02-11 13:54:26 +0000 Tim-Philipp Müller + + gst/apetag/gsttagdemux.c: ... and fix the very same leaks in GstTagDemux. + Original commit message from CVS: + * gst/apetag/gsttagdemux.c: (gst_tag_demux_get_upstream_size), + (gst_tag_demux_do_typefind): + ... and fix the very same leaks in GstTagDemux. + +2006-02-11 13:35:13 +0000 Jon Trowbridge + + gst/id3demux/gstid3demux.c: + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (id3demux_get_upstream_size), + (gst_id3demux_do_typefind): + Fix a couple of mem leaks. (Patch by Jonathan Matthew + ) + +2006-02-10 17:37:39 +0000 Wim Taymans + + gst/rtp/gstrtpmp4vpay.c: First set options, then set caps or else the baseclass will not know about the options, duh. + Original commit message from CVS: + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_setcaps): + First set options, then set caps or else the baseclass + will not know about the options, duh. + +2006-02-10 17:16:55 +0000 Wim Taymans + + gst/rtp/gstrtpmp4vpay.c: Don't waste time looking for a config string if we have codec_info on the incomming caps. + Original commit message from CVS: + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_class_init), + (gst_rtp_mp4v_pay_setcaps): + Don't waste time looking for a config string if we have codec_info + on the incomming caps. + +2006-02-10 16:40:58 +0000 Wim Taymans + + gst/rtp/README: Say something about case-sensitivity of caps vs mime-attributes. + Original commit message from CVS: + * gst/rtp/README: + Say something about case-sensitivity of caps vs mime-attributes. + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_class_init), + (gst_rtp_amr_pay_handle_buffer): + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_get_type), + (gst_rtp_mp4g_pay_base_init), (gst_rtp_mp4g_pay_class_init), + (gst_rtp_mp4g_pay_init), (gst_rtp_mp4g_pay_finalize), + (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps), + (gst_rtp_mp4g_pay_flush), (gst_rtp_mp4g_pay_handle_buffer), + (gst_rtp_mp4g_pay_set_property), (gst_rtp_mp4g_pay_get_property), + (gst_rtp_mp4g_pay_plugin_init): + * gst/rtp/gstrtpmp4gpay.h: + Added beginnings of mpeg4-generic payloader (RFC 3640) + +2006-02-09 14:20:14 +0000 Wim Taymans + + gst/rtsp/: Resurected rtpdec to make rtspsrc happy again. + Original commit message from CVS: + * gst/rtsp/Makefile.am: + * gst/rtsp/gstrtpdec.c: (gst_rtpdec_get_type), + (gst_rtpdec_class_init), (gst_rtpdec_init), (gst_rtpdec_getcaps), + (gst_rtpdec_chain_rtp), (gst_rtpdec_chain_rtcp), + (gst_rtpdec_set_property), (gst_rtpdec_get_property), + (gst_rtpdec_change_state): + * gst/rtsp/gstrtpdec.h: + * gst/rtsp/gstrtsp.c: (plugin_init): + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport): + * gst/rtsp/rtspconnection.c: (read_body), + (rtsp_connection_receive): + * gst/rtsp/rtspmessage.c: (rtsp_message_dump): + Resurected rtpdec to make rtspsrc happy again. + Skip attributes from the session id. + Don't crash when dumping a message with an empty body. + +2006-02-09 14:14:07 +0000 Wim Taymans + + gst/rtp/gstrtpamrdepay.c: Added more meaningfull warnings when something goes wrong. + Original commit message from CVS: + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_chain): + Added more meaningfull warnings when something goes wrong. + Clear F bit on outgoing AMR packets. + * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_class_init), + (gst_rtp_amr_pay_handle_buffer): + Added debugging category + Support payloading of multiple AMR frames. + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_depay_data): + Added some debugging. + +2006-02-09 11:25:42 +0000 Jan Schmidt + + configure.ac: Back to CVS + Original commit message from CVS: + * configure.ac: + Back to CVS + +=== release 0.10.2 === + +2006-02-09 11:22:38 +0000 Jan Schmidt + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-apetag.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cdio.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + Releasing 0.10.2 + Original commit message from CVS: + Releasing 0.10.2 + +2006-02-08 17:35:05 +0000 Jan Schmidt + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2006-02-08 17:18:20 +0000 Jan Schmidt + + * ChangeLog: + Oops, jumping the gun with the ChangeLog entry + Original commit message from CVS: + Oops, jumping the gun with the ChangeLog entry + +2006-02-08 17:16:46 +0000 Jan Schmidt + + configure.ac: Bump core and plugins-base requirement to 0.10.2.2 for API additions (and 1 migration of gst_bin_find_u... + Original commit message from CVS: + * configure.ac: + Bump core and plugins-base requirement to 0.10.2.2 + for API additions (and 1 migration of gst_bin_find_unconnected_pad) + +2006-02-08 17:12:40 +0000 Tim-Philipp Müller + + ext/: Register musicbrainz tags. + Original commit message from CVS: + * ext/flac/gstflac.c: (plugin_init): + * ext/speex/gstspeex.c: (plugin_init): + Register musicbrainz tags. + +2006-02-07 18:31:31 +0000 Thomas Vander Stichele + + * gst/qtdemux/qtdemux.c: + remove unused var + Original commit message from CVS: + remove unused var + +2006-02-07 18:01:17 +0000 Thomas Vander Stichele + + gst/qtdemux/qtdemux.c: use the correct variable to check if we can calculate the last chunk. Looks like an obvious b... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse_trak): + use the correct variable to check if we can calculate + the last chunk. Looks like an obvious bug, and makes + the dump of offsets comparable to other tools + +2006-02-07 17:54:42 +0000 Thomas Vander Stichele + + gst/qtdemux/qtdemux.c: clean up some debugging, using _OBJECT, moving recurring messages to LOG level + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse_trak): + clean up some debugging, using _OBJECT, moving recurring + messages to LOG level + +2006-02-07 16:23:33 +0000 Tim-Philipp Müller + + ext/gconf/gconf.h: Remove declaration of function that no longer exists. + Original commit message from CVS: + * ext/gconf/gconf.h: + Remove declaration of function that no longer exists. + +2006-02-07 13:39:08 +0000 Zaheer Abbas Merali + + ext/shout2/gstshout2.c: Make shout2 work for non ogg streams + Original commit message from CVS: + 2006-02-07 Zaheer Abbas Merali + * ext/shout2/gstshout2.c: (gst_shout2send_render), + (gst_shout2send_setcaps), (gst_shout2send_change_state): + Make shout2 work for non ogg streams + +2006-02-06 17:26:43 +0000 Wim Taymans + + gst/udp/gstmultiudpsink.*: Updated docs. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_render), (gst_multiudpsink_get_property), + (gst_multiudpsink_init_send), (gst_multiudpsink_add), + (gst_multiudpsink_remove), (gst_multiudpsink_clear), + (gst_multiudpsink_get_stats), (gst_multiudpsink_change_state): + * gst/udp/gstmultiudpsink.h: + Updated docs. + Added properties bytes-served, bytes_to_serve. + Post proper error messages, + Emit client added signal too. + +2006-02-06 15:41:25 +0000 Wim Taymans + + gst/qtdemux/qtdemux.*: Some QT demux loving. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_query), + (gst_qtdemux_handle_src_event), (gst_qtdemux_loop_header), + (qtdemux_inflate), (qtdemux_parse), (qtdemux_parse_trak), + (qtdemux_parse_udta), (qtdemux_tag_add_str), (qtdemux_tag_add_num), + (qtdemux_tag_add_gnre), (gst_qtdemux_handle_esds), + (qtdemux_video_caps), (qtdemux_audio_caps): + * gst/qtdemux/qtdemux.h: + Some QT demux loving. + Handle seeking in a less broken way. + Fix AMR caps to match the AMR decoder. + Set first timestamp on AMR samples to 0 for now. + Remove some \n in DEBUG strings. + Use _scale_int for maximum precision. + +2006-02-06 15:31:16 +0000 Thomas Vander Stichele + + * ChangeLog: + * common: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/udp/gstmultiudpsink.c: + adding docs for multiudpsink + Original commit message from CVS: + adding docs for multiudpsink + +2006-02-06 15:28:56 +0000 Thomas Vander Stichele + + gst/level/gstlevel.c: peak below decay is not necessarily an error, so don't ERROR log + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_transform_ip): + peak below decay is not necessarily an error, so don't ERROR log + +2006-02-06 15:27:06 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + cvs versions + Original commit message from CVS: + cvs versions + +2006-02-06 14:25:34 +0000 Tim-Philipp Müller + + gst/matroska/ebml-write.*: Make sure we send a newsegment event in BYTES format before sending buffers (#328531). + Original commit message from CVS: + * gst/matroska/ebml-write.c: (gst_ebml_write_reset), + (gst_ebml_write_flush_cache), (gst_ebml_write_element_push), + (gst_ebml_write_seek): + * gst/matroska/ebml-write.h: + Make sure we send a newsegment event in BYTES format + before sending buffers (#328531). + +2006-02-06 12:18:45 +0000 Tim-Philipp Müller + + Pass unhandled queries upstream instead of just dropping them (#326446). Update query type arrays here and there. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_src_query), + (gst_dvdemux_sink_query): + * ext/flac/gstflacdec.c: (gst_flac_dec_src_query): + * ext/speex/gstspeexdec.c: (speex_get_query_types), + (speex_dec_src_query): + * ext/speex/gstspeexenc.c: (gst_speexenc_src_query), + (gst_speexenc_sink_query): + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_get_src_query_types), + (gst_matroska_demux_handle_src_query): + * gst/wavparse/gstwavparse.c: (gst_wavparse_get_query_types), + (gst_wavparse_pad_query): + Pass unhandled queries upstream instead of just dropping + them (#326446). Update query type arrays here and there. + +2006-02-06 11:57:52 +0000 Tim-Philipp Müller + + tests/check/elements/matroskamux.c: Collectpads in core got changed and now also holds a reference to any pad that is... + Original commit message from CVS: + * tests/check/elements/matroskamux.c: (setup_src_pad): + Collectpads in core got changed and now also holds a + reference to any pad that is part of it. Fix refcount + checks in test case accordingly. + +2006-02-06 11:41:43 +0000 Tim-Philipp Müller + + gst/apetag/gstapedemux.h: Fix include, for now GstTagDemux is in the apetag dir. + Original commit message from CVS: + * gst/apetag/gstapedemux.h: + Fix include, for now GstTagDemux is in the apetag dir. + +2006-02-06 11:34:23 +0000 Tim-Philipp Müller + + docs/plugins/: Add cdio plugin to docs. + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-cdio.xml: + Add cdio plugin to docs. + * ext/cdio/gstcdiocddasrc.c: + Add gtk-doc blurb. + * ext/cdio/gstcdio.c: + The plugin is called 'cdio' not 'cddio'. + +2006-02-06 10:56:07 +0000 Tim-Philipp Müller + + Add APE tag demuxer (#325649). + Original commit message from CVS: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-apetag.xml: + * gst/apetag/Makefile.am: + * gst/apetag/gstapedemux.c: + * gst/apetag/gstapedemux.h: + * gst/apetag/gsttagdemux.c: + * gst/apetag/gsttagdemux.h: + Add APE tag demuxer (#325649). + +2006-02-05 22:22:56 +0000 Jan Schmidt + + ext/gconf/: Ignore changing the GConf key to "". Ignore GConf key updates that don't actually change the string. + Original commit message from CVS: + * ext/gconf/gconf.c: (gst_gconf_get_default_audio_sink), + (gst_gconf_get_default_video_sink), + (gst_gconf_get_default_audio_src), + (gst_gconf_get_default_video_src): + * ext/gconf/gconf.h: + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset), + (gst_gconf_audio_sink_init), (gst_gconf_audio_sink_dispose), + (do_toggle_element): + * ext/gconf/gstgconfaudiosink.h: + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_reset), + (gst_gconf_audio_src_init), (gst_gconf_audio_src_dispose), + (do_toggle_element): + * ext/gconf/gstgconfaudiosrc.h: + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), + (gst_gconf_video_sink_init), (gst_gconf_video_sink_dispose), + (do_toggle_element): + * ext/gconf/gstgconfvideosink.h: + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_reset), + (gst_gconf_video_src_init), (gst_gconf_video_src_dispose), + (do_toggle_element): + * ext/gconf/gstgconfvideosrc.h: + Ignore changing the GConf key to "". Ignore GConf key updates + that don't actually change the string. + For now, ignore the GConf key when the state is > READY, as + it breaks streaming. Sometime it will be nice to bring the + new sink online even mid-stream, by sending NEWSEGMENT info + and possibly prerolling. + (Fixes #326736) + +2006-02-05 20:43:49 +0000 Jan Schmidt + + gst/goom/: Make goom reentrant by moving all important static variables into instance structures. + Original commit message from CVS: + * gst/goom/filters.c: (zoomFilterNew), (calculatePXandPY), + (setPixelRGB), (setPixelRGB_), (getPixelRGB), (getPixelRGB_), + (zoomFilterSetResolution), (zoomFilterDestroy), + (zoomFilterFastRGB), (pointFilter): + * gst/goom/filters.h: + * gst/goom/goom_core.c: (goom_init), (goom_set_resolution), + (goom_update), (goom_close): + * gst/goom/goom_core.h: + * gst/goom/goom_tools.h: + * gst/goom/graphic.c: + * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), + (gst_goom_dispose), (gst_goom_src_setcaps), (gst_goom_chain): + * gst/goom/gstgoom.h: + * gst/goom/lines.c: (goom_lines): + * gst/goom/lines.h: + Make goom reentrant by moving all important static variables + into instance structures. + (Fixes #329181) + +2006-02-04 15:41:43 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.*: Third attempt, use gst_pad_is_linked() this time. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_all_source_pads_unlinked), + (gst_avi_demux_process_next_entry): + * gst/avi/gstavidemux.h: + Third attempt, use gst_pad_is_linked() this time. + +2006-02-04 13:30:12 +0000 Jan Schmidt + + gst/id3demux/id3v2frames.c: Adjust for data length indicators when parsing (Fixes #329810) + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), + (parse_split_strings): + Adjust for data length indicators when parsing (Fixes #329810) + Fix stupid bug parsing UTF-8 tag text. + Output tag strings with multiple fields as multiple tags, so the + app gets all the data. + +2006-02-03 20:05:20 +0000 Edgard Lima + + * ChangeLog: + * ext/flac/gstflacenc.c: + Fixed a bug add in last commit, where no event is send. Thanks Tim to show me. + Original commit message from CVS: + Fixed a bug add in last commit, where no event is send. Thanks Tim to show me. + +2006-02-03 18:07:35 +0000 Edgard Lima + + * ChangeLog: + * ext/flac/gstflacenc.c: + * gst/matroska/ebml-read.c: + Just make it compile with --disable-gst-debug. + Original commit message from CVS: + Just make it compile with --disable-gst-debug. + +2006-02-03 16:55:42 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + update spec file + Original commit message from CVS: + update spec file + +2006-02-03 13:06:24 +0000 Jan Schmidt + + gst/id3demux/id3v2frames.c: Never output a tag with a null contents string. + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (parse_text_identification_frame), + (id3v2_tag_to_taglist), (id3v2_genre_string_to_taglist), + (id3v2_genre_fields_to_taglist): + Never output a tag with a null contents string. + +2006-02-02 21:00:16 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Only pause if all pads are unlinked AND we've tried to send data on all of them at least once. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_all_source_pads_unlinked): + Only pause if all pads are unlinked AND we've tried to send data + on all of them at least once. + +2006-02-02 12:29:24 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Make loop function/task pause itself when all source pads are unlinked. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_all_source_pads_unlinked), + (gst_avi_demux_process_next_entry), (gst_avi_demux_loop): + Make loop function/task pause itself when all source pads are + unlinked. + +2006-02-02 10:47:15 +0000 Tim-Philipp Müller + + Use new functions from core to render a bin from a string. Fixes build. Up requirements to core CVS. + Original commit message from CVS: + * configure.ac: + * ext/gconf/gconf.c: (gst_gconf_render_bin_from_key): + Use new functions from core to render a bin from a + string. Fixes build. Up requirements to core CVS. + +2006-02-01 11:01:04 +0000 Tim-Philipp Müller + + gst/auparse/gstauparse.c: Don't push buffers into the adapter that we are going to push downstream again without fram... + Original commit message from CVS: + * gst/auparse/gstauparse.c: (gst_au_parse_chain): + Don't push buffers into the adapter that we are going to + push downstream again without framing anyway. Also, the + adaptor takes ownership of buffers put into it (fixes + auparse pushing invalid buffers for .au files with + ADPCM contents). Finally, set caps on all outgoing buffers. + +2006-01-30 23:13:05 +0000 Jan Schmidt + + gst/id3demux/: Someone should kick my butt. Remove ID3v1 tags from the end of the file. + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_chain), + (gst_id3demux_read_id3v1), (gst_id3demux_sink_activate), + (gst_id3demux_send_tag_event): + * gst/id3demux/id3tags.c: (id3demux_read_id3v1_tag): + Someone should kick my butt. Remove ID3v1 tags from the end of the + file. + Improve error messages. Send the TAG message as soon as we complete + typefinding, instead of waiting until we send the first buffer. + Downstream tag event is still sent before the first buffer. + +2006-01-29 20:07:49 +0000 Tim-Philipp Müller + + ext/wavpack/gstwavpackdec.c: Add debug category, use boilerplate macros, fix handling of widths of 32 bits. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_setcaps), + (gst_wavpack_dec_base_init), (gst_wavpack_dec_dispose), + (gst_wavpack_dec_class_init), (gst_wavpack_dec_sink_event), + (gst_wavpack_dec_init), (gst_wavpack_dec_format_samples), + (gst_wavpack_dec_chain), (gst_wavpack_dec_plugin_init): + Add debug category, use boilerplate macros, fix handling + of widths of 32 bits. + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), + (gst_wavpack_parse_dispose), (gst_wavpack_parse_class_init), + (gst_wavpack_parse_index_get_last_entry), + (gst_wavpack_parse_index_get_entry_from_sample), + (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset), + (gst_wavpack_parse_src_query), + (gst_wavpack_parse_scan_to_find_sample), + (gst_wavpack_parse_send_newsegment), + (gst_wavpack_parse_handle_seek_event), + (gst_wavpack_parse_src_event), (gst_wavpack_parse_init), + (gst_wavpack_parse_get_upstream_length), + (gst_wavpack_parse_pull_buffer), + (gst_wavpack_parse_create_src_pad), (gst_wavpack_parse_loop), + (gst_wavpack_parse_change_state), + (gst_wavepack_parse_sink_activate), + (gst_wavepack_parse_sink_activate_pull), + (gst_wavpack_parse_plugin_init): + * ext/wavpack/gstwavpackparse.h: + Rewrite a bit, mostly to fix flow logic and to make seeking work. + Fix buffer/event refcounting. Add some debug statements. Add + width of 32 to source pad template caps. Use boilerplate macros. + +2006-01-27 12:17:56 +0000 Andy Wingo + + ext/dv/: Call dv_set_error_log (dv_decoder_t *, NULL); after dv_decoder_new to not have warings flooding stderr. this... + Original commit message from CVS: + 2006-01-27 Jan Gerber + Reviewed by: Andy Wingo + * ext/dv/gstdvdec.c (gst_dvdec_change_state): + * ext/dv/gstdvdemux.c (gst_dvdemux_change_state): + Call dv_set_error_log (dv_decoder_t *, NULL); after dv_decoder_new + to not have warings flooding stderr. this is the suggested way + also used in dvgrab and kino. (#328336) + +2006-01-27 01:43:07 +0000 Jan Schmidt + + sys/oss/gstosssink.c: Free the device name string when finalised. + Original commit message from CVS: + * sys/oss/gstosssink.c: (gst_oss_sink_class_init), + (gst_oss_sink_init), (gst_oss_sink_finalise): + Free the device name string when finalised. + +2006-01-26 16:23:42 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Fix wrong memcpy source pointer. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Fix wrong memcpy source pointer. + +2006-01-25 22:05:28 +0000 Tim-Philipp Müller + + gst/id3demux/gstid3demux.c: Don't put function calls in g_return_if_fail() statements, or they'll be replaced with NO... + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_remove_srcpad): + Don't put function calls in g_return_if_fail() statements, + or they'll be replaced with NOOPs if someone compiles with + G_DISABLE_CHECKS defined. + +2006-01-25 20:33:05 +0000 Jan Schmidt + + * ChangeLog: + changelog surgery + Original commit message from CVS: + changelog surgery + +2006-01-25 18:23:05 +0000 Jan Schmidt + + gst/id3demux/id3v2frames.c: Never trust ANY information encoded in a media file, especially when it's giving you size... + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame): + Never trust ANY information encoded in a media file, especially + when it's giving you sizes. (Fixes #328452) + +2006-01-24 18:03:46 +0000 Edgard Lima + + * ChangeLog: + * gst/rtp/gstrtpg711pay.c: + I'm too lazy to comment this + Original commit message from CVS: + Patch written by Kai Vehmanen applied. See bug #325148. + +2006-01-24 11:58:53 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: More coherent framerate setting on caps. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream), (qtdemux_parse_trak): + More coherent framerate setting on caps. + If sample_size is available, use that for the samples' duration in + the index. This enables single frame streams to work (and I imagine + fixes some other cases). + Tested on testsuite, no regression. + +2006-01-23 18:39:31 +0000 Edward Hervey + + gst/matroska/: Added recognition of Real Audio and Video streams in matroska demuxer. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps), + (gst_matroska_demux_audio_caps), (gst_matroska_demux_plugin_init): + * gst/matroska/matroska-ids.h: + Added recognition of Real Audio and Video streams in matroska demuxer. + +2006-01-23 15:10:55 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Added codec recognition for: _ VP31 : video/x-vp3 _ AVDJ : image/jpeg _ dvcp, dvc : video/x-d... + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), + (qtdemux_video_caps), (qtdemux_audio_caps): + Added codec recognition for: + _ VP31 : video/x-vp3 + _ AVDJ : image/jpeg + _ dvcp, dvc : video/x-dv, systemstream=(boolean)false + _ 0x6d730017 : audio/x-adpcm, layout=(string)quicktime + +2006-01-23 14:32:47 +0000 Jan Schmidt + + gst/id3demux/id3v2frames.c: Remove errant break statement, and fix compilation with older GCC. + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3v2_tag_to_taglist): + Remove errant break statement, and fix compilation with + older GCC. + +2006-01-23 12:04:12 +0000 Jan Schmidt + + * ChangeLog: + Mention that my last commit fixes #328241 + Original commit message from CVS: + Mention that my last commit fixes #328241 + +2006-01-23 11:06:34 +0000 Tim-Philipp Müller + + sys/sunaudio/: Export functions that are needed in other parts of the code, makes the mixer actually work; adjust mag... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_init): + Export functions that are needed in other parts of the code, + makes the mixer actually work; adjust magic minimum buffer-time + value from 3ms to 5ms to work around stuttering during mp3 + playback (#327765). + +2006-01-23 10:44:03 +0000 Tim-Philipp Müller + + gst/matroska/matroska-mux.c: Fix possible deadlock in matroska muxer (#327825). + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * gst/matroska/matroska-mux.c: (gst_matroska_mux_best_pad), + (gst_matroska_mux_write_data), (gst_matroska_mux_collected): + Fix possible deadlock in matroska muxer (#327825). + +2006-01-23 09:59:03 +0000 Jens Granseuer + + C89 fixes: declare variables at the beginning of a block and + Original commit message from CVS: + * ext/libpng/gstpngenc.c: (gst_pngenc_chain): + * gst/avi/gstavidemux.c: (gst_avi_demux_invert): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps): + * gst/rtsp/sdpmessage.h: + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_render): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_stats): + C89 fixes: declare variables at the beginning of a block and + make gcc-2.9x happy (#328264; patch by: Jens Granseuer + ). + +2006-01-23 09:22:17 +0000 Jan Schmidt + + gst/id3demux/: Rewrite parsing of text tags to handle multiple NULL terminated strings. Parse numeric genre strings a... + Original commit message from CVS: + * gst/id3demux/id3tags.c: (id3demux_read_id3v2_tag): + * gst/id3demux/id3tags.h: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), + (parse_comment_frame), (parse_text_identification_frame), + (id3v2_tag_to_taglist), (id3v2_are_digits), + (id3v2_genre_string_to_taglist), (id3v2_genre_fields_to_taglist), + (parse_split_strings), (free_tag_strings): + Rewrite parsing of text tags to handle multiple NULL terminated + strings. Parse numeric genre strings and ID3v2 type + "(3)(6)Alternative" style genre strings. + Parse dates that are only YYYY or YYYY-mm format. + +2006-01-21 11:43:53 +0000 Fabrizio + + gst/qtdemux/qtdemux.c: 'twos' and 'sowt' fourcc can be 16bit or 8bit audio. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), + (qtdemux_audio_caps): + 'twos' and 'sowt' fourcc can be 16bit or 8bit audio. + Fix 8bit case (#327133, based on patch by: Fabrizio + Gennari ). + Also, "G_LITTLE_ENDIAN" and "G_BIG_ENDIAN" are not + valid literals for endianness in caps strings, + only "LITTLE_ENDIAN" and "BIG_ENDIAN" are valid. + +2006-01-20 15:06:28 +0000 Christoph Burghardt + + gst/videobox/gstvideobox.c: Don't forget to initialize liboil, otherwise our oil functions + Original commit message from CVS: + * gst/videobox/gstvideobox.c: (gst_video_box_class_init): + Don't forget to initialize liboil, otherwise our oil functions + will crash (fixes #327871; patch by: Christoph Burghardt + ). + +2006-01-19 21:46:32 +0000 Tim-Philipp Müller + + * ChangeLog: + ChangeLog surgery (last entry may have been slightly misleading) + Original commit message from CVS: + ChangeLog surgery (last entry may have been slightly misleading) + +2006-01-19 21:00:50 +0000 Brian Cameron + + configure.ac: just like in the core and gst-plugins-base. Fixes build on Solaris (fixes + Original commit message from CVS: + * configure.ac: + Use plain AS_LIBTOOL_TAGS instead of AS_LIBTOOL_TAGS([CXX]), just + like in the core and gst-plugins-base. Fixes build on Solaris (fixes + #326683; patch by: Brian Cameron ) + +2006-01-19 00:10:51 +0000 Tim-Philipp Müller + + ext/cdio/: Fix build for libcdio versions >= 76; give slightly lower rank than cdparanoia. + Original commit message from CVS: + * ext/cdio/gstcdio.c: (gst_cdio_add_cdtext_field), (plugin_init): + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_get_cdtext): + Fix build for libcdio versions >= 76; give slightly lower rank + than cdparanoia. + +2006-01-18 19:30:36 +0000 Tim-Philipp Müller + + Port libcdio cdda source, formerly known as cddasrc, now known as cdiocddasrc (fixes #323327). Should also read CD-TE... + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + * ext/cdio/Makefile.am: + * ext/cdio/gstcdio.c: + * ext/cdio/gstcdio.h: + * ext/cdio/gstcdiocddasrc.c: + * ext/cdio/gstcdiocddasrc.h: + Port libcdio cdda source, formerly known as cddasrc, now known as + cdiocddasrc (fixes #323327). Should also read CD-TEXT if available, + but that's not tested (fixes #317658). + +2006-01-18 19:08:08 +0000 Tommi Myöhänen + + gst/wavparse/gstwavparse.c: Fix conversion from TIME to BYTES format (fixes #326864; + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_pad_convert): + Fix conversion from TIME to BYTES format (fixes #326864; + patch by: Tommi Myöhänen ) + +2006-01-18 18:54:02 +0000 Edgard Lima + + * gst/qtdemux/qtdemux.c: + Ronald's patch applied. see bug #326318. + Original commit message from CVS: + Ronald's patch applied. see bug #326318. + +2006-01-17 16:45:43 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.*: Fix seeking for quicktime files. Could still use some more love and sophistication. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), + (gst_qtdemux_send_event), (gst_qtdemux_handle_src_event), + (gst_qtdemux_change_state), (gst_qtdemux_loop_header): + * gst/qtdemux/qtdemux.h: + Fix seeking for quicktime files. Could still use some more + love and sophistication. + +2006-01-16 10:23:47 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + update with love + Original commit message from CVS: + update with love + +2006-01-15 20:21:48 +0000 Sergey Scobich + + gst/id3demux/id3v2frames.c: Fix compilation of id3demux when zlib is not present. + Original commit message from CVS: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame): + Fix compilation of id3demux when zlib is not present. + (Fixes #326602; patch by: Sergey Scobich) + +2006-01-15 14:12:12 +0000 Tim-Philipp Müller + + ext/esd/Makefile.am: otherwise build will fail for folks with libesd in a non-standard prefix (#327009). + Original commit message from CVS: + * ext/esd/Makefile.am: + Add $(ESD_CFLAGS), otherwise build will fail for folks + with libesd in a non-standard prefix (#327009). + +2006-01-13 19:29:27 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to head + Original commit message from CVS: + back to head + +2006-01-13 19:25:40 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * docs/upload.mak: + releasing 0.10.1 + Original commit message from CVS: + releasing 0.10.1 + +2006-01-13 18:37:13 +0000 Wim Taymans + + ext/jpeg/gstsmokeenc.c: fix memleak. Fixes #326618 + Original commit message from CVS: + patch by: Wim Taymans + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): + fix memleak. Fixes #326618 + +2006-01-13 18:35:00 +0000 Mike Smith + + gst/level/gstlevel.c: Fix memleak. Fixes #326612 + Original commit message from CVS: + 2006-01-13 Thomas Vander Stichele + patch by: Mike Smith + * gst/level/gstlevel.c: (gst_level_message_new), + (gst_level_message_append_channel): + Fix memleak. Fixes #326612 + +2006-01-11 11:39:10 +0000 Thomas Vander Stichele + + configure.ac: prereleasing + Original commit message from CVS: + * configure.ac: + prereleasing + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + update translations + +2006-01-11 11:04:03 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Add support for Indeo3 video in Quicktime files. + Original commit message from CVS: + reviewed by: Edward Hervey + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add support for Indeo3 video in Quicktime files. + Closes #326524 + +2006-01-10 12:38:59 +0000 Michael Smith + + gst/level/gstlevel.c: Don't leak filter arrays. + Original commit message from CVS: + * gst/level/gstlevel.c: (gst_level_class_init), + (gst_level_dispose): + Don't leak filter arrays. + +2006-01-09 17:04:52 +0000 Christian Schaller + + * ChangeLog: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/upload.mak: + * gst-plugins-good.spec.in: + * sys/Makefile.am: + * sys/sunaudio/Makefile.am: + * sys/sunaudio/gstsunaudio.c: + * sys/sunaudio/gstsunaudiomixer.c: + * sys/sunaudio/gstsunaudiomixer.h: + * sys/sunaudio/gstsunaudiomixerctrl.c: + * sys/sunaudio/gstsunaudiomixerctrl.h: + * sys/sunaudio/gstsunaudiomixertrack.c: + * sys/sunaudio/gstsunaudiomixertrack.h: + * sys/sunaudio/gstsunaudiosink.c: + * sys/sunaudio/gstsunaudiosink.h: + add Sun Audio plugin. Verified that nothing breaks and that make check works. + Original commit message from CVS: + add Sun Audio plugin. Verified that nothing breaks and that make check works. + Don't think the docs gets properly built yet, but I don't understand exactly how to enable that. + +2006-01-07 20:01:09 +0000 Philippe Kalaf + + gst-plugins-good/gst/udp/: Allow udpsrc and dynudpsink to take a sockfd as a parameter. For udpsrc, overrides the por... + Original commit message from CVS: + 2005-01-07 Philippe Khalaf + * gst-plugins-good/gst/udp/gstdynudpsink.c: + * gst-plugins-good/gst/udp/gstudpsrc.c: + Allow udpsrc and dynudpsink to take a sockfd as a parameter. For udpsrc, + overrides the port or multicast parameters. Fixes bugs #323021. + +2006-01-06 16:28:30 +0000 Tim-Philipp Müller + + ext/gconf/: Add new gconfaudiosrc and gconfvideosrc elements (needed for gnome-sound-recorder). + Original commit message from CVS: + * ext/gconf/Makefile.am: + * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init), + (gst_gconf_audio_src_class_init), (gst_gconf_audio_src_reset), + (gst_gconf_audio_src_init), (gst_gconf_audio_src_dispose), + (do_toggle_element), (cb_toggle_element), + (gst_gconf_audio_src_change_state): + * ext/gconf/gstgconfaudiosrc.h: + * ext/gconf/gstgconfelements.c: (plugin_init): + * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init), + (gst_gconf_video_src_class_init), (gst_gconf_video_src_reset), + (gst_gconf_video_src_init), (gst_gconf_video_src_dispose), + (do_toggle_element), (cb_toggle_element), + (gst_gconf_video_src_change_state): + * ext/gconf/gstgconfvideosrc.h: + Add new gconfaudiosrc and gconfvideosrc elements + (needed for gnome-sound-recorder). + +2006-01-06 11:46:53 +0000 Edward Hervey + + gst/id3demux/gstid3demux.c: Add gst_element_no_more_pads() for proper decodebin behaviour. + Original commit message from CVS: + * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad): + Add gst_element_no_more_pads() for proper decodebin behaviour. + * gst/id3demux/id3v2frames.c: (parse_comment_frame), + (parse_text_identification_frame), (parse_split_strings): + Failure to decode some tags is not a GST_ERROR() but a + GST_WARNING() + When iterating over a chunk of text, check that we haven't gone too + far. + +2006-01-05 23:17:44 +0000 Sébastien Moutte + + * sys/directdraw/gstdirectdrawplugin.c: + * sys/directdraw/gstdirectdrawsink.c: + * sys/directdraw/gstdirectdrawsink.h: + * sys/directsound/gstdirectsoundplugin.c: + * sys/directsound/gstdirectsoundsink.c: + * sys/directsound/gstdirectsoundsink.h: + * win32/vs6/libgstdirectdraw.dsp: + * win32/vs6/libgstdirectsound.dsp: + 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 + * 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 + +2006-01-05 17:03:45 +0000 Stefan Kost + + gst/videobox/gstvideobox.c: call oil_init() when using liboil + Original commit message from CVS: + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (plugin_init): + call oil_init() when using liboil + +2006-01-04 17:28:49 +0000 Wim Taymans + + ext/jpeg/: Fix leaks. + Original commit message from CVS: + * ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): + Fix leaks. + +2006-01-02 19:38:32 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.c: Don't g_assert() where we should just return FALSE; remove unnecessary g_assert(); initialize ... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * ext/flac/gstflacdec.c: (gst_flac_dec_write), + (gst_flac_dec_convert_src), (gst_flac_dec_src_query), + (gst_flac_dec_change_state): + Don't g_assert() where we should just return FALSE; remove + unnecessary g_assert(); initialize some fields properly in + state change function (fixes #325504). Also, use + GST_DEBUG_OBJECT in two more places. + +2005-12-30 15:51:05 +0000 Stefan Kost + + configure.ac: also remove smoothwave's Makefile.am + Original commit message from CVS: + * configure.ac: + also remove smoothwave's Makefile.am + * docs/plugins/Makefile.am: + fix plugin docs + +2005-12-30 15:39:17 +0000 Thomas Vander Stichele + + * gst/smoothwave/.gitignore: + * gst/smoothwave/Makefile.am: + * gst/smoothwave/README: + * gst/smoothwave/demo-osssrc.c: + * gst/smoothwave/gstsmoothwave.c: + * gst/smoothwave/gstsmoothwave.h: + remove old plugin that went bad + Original commit message from CVS: + remove old plugin that went bad + +2005-12-30 15:34:18 +0000 Stefan Kost + + tests/examples/Makefile.am: added missing Makefile.am + Original commit message from CVS: + * tests/examples/Makefile.am: + added missing Makefile.am + +2005-12-30 15:28:44 +0000 Stefan Kost + + moved level-example to tests/examples/level-example + Original commit message from CVS: + * configure.ac: + * gst/level/Makefile.am: + * gst/level/level-example.c: + * tests/Makefile.am: + * tests/examples/level/Makefile.am: + * tests/examples/level/level-example.c: (message_handler), (main): + moved level-example to tests/examples/level-example + * tests/old/examples/level/demo.c: (main): + * tests/old/examples/level/plot.c: (main): + some initial fixes + +2005-12-29 16:36:19 +0000 Michael Smith + + gst/udp/gstmultiudpsink.*: Track packets sent per client in addition to bytes sent; provide this info through get-sta... + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render), + (gst_multiudpsink_remove), (gst_multiudpsink_get_stats): + * gst/udp/gstmultiudpsink.h: + Track packets sent per client in addition to bytes sent; provide + this info through get-stats signal + +2005-12-29 11:26:12 +0000 Tim-Philipp Müller + + gst/auparse/gstauparse.c: Can't use gst_object_unref() on a GstAdapter (#325191). + Original commit message from CVS: + * gst/auparse/gstauparse.c: (gst_au_parse_dispose): + Can't use gst_object_unref() on a GstAdapter (#325191). + +2005-12-28 18:55:32 +0000 Jan Schmidt + + gst/id3demux/id3tags.c: If a broken tag has 0 bytes payload, at least still skip the 10 byte header + Original commit message from CVS: + * gst/id3demux/id3tags.c: (id3demux_read_id3v2_tag): + If a broken tag has 0 bytes payload, at least still skip + the 10 byte header + +2005-12-22 15:00:41 +0000 Philippe Kalaf + + gst-plugins-good/gst/rtp/: Making these depayloaders (H263+ and mpeg4 video) inherit from + Original commit message from CVS: + 2005-12-22 Philippe Khalaf + * gst-plugins-good/gst/rtp/gstrtph263pdepay.h: + * gst-plugins-good/gst/rtp/gstrtph263pdepay.c: + * gst-plugins-good/gst/rtp/gstrtpmp4vdepay.h: + * gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c: + Making these depayloaders (H263+ and mpeg4 video) inherit from + RtpBaseDepayloaderClass. Fixes bugs #323922 and #323908. + +2005-12-21 17:15:09 +0000 Jan Schmidt + + docs/plugins/gst-plugins-good-plugins.*: Regenerate the plugin hiearchy. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + Regenerate the plugin hiearchy. + +2005-12-21 15:24:59 +0000 Jan Schmidt + + Add documentation for id3demux. + Original commit message from CVS: + 2005-12-21 Jan Schmidt + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.args: + * gst/id3demux/gstid3demux.c: (gst_id3demux_get_type), + (gst_id3demux_base_init), (gst_id3demux_class_init), + (gst_id3demux_chain): + * gst/id3demux/gstid3demux.h: + Add documentation for id3demux. + Don't fail if the first buffer is not at offset 0, just + attempt to typefind and do pass through + Rename the gst_type function from gst_gst_id3demux.. + +2005-12-20 12:44:25 +0000 Michael Smith + + gst/udp/gstmultiudpsink.*: Collect statistics; return them from get_stats. + Original commit message from CVS: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render), + (gst_multiudpsink_add), (gst_multiudpsink_remove), + (gst_multiudpsink_get_stats): + * gst/udp/gstmultiudpsink.h: + Collect statistics; return them from get_stats. + +2005-12-19 15:43:30 +0000 Edward Hervey + + gst/avi/gstavidemux.c: Stupid signedness issue... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_scan): + Stupid signedness issue... + +2005-12-19 15:19:44 +0000 Edward Hervey + + ext/swfdec/gstswfdec.c: Add debugging category and return GstFlowReturn in the right places + Original commit message from CVS: + * ext/swfdec/gstswfdec.c: (gst_swfdec_class_init), + (gst_swfdec_chain), (gst_swfdec_render): + Add debugging category and return GstFlowReturn in the right places + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link): + Get something from the peer pad once we've checked if there is a peer pad. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (qtdemux_tree_get_child_by_type), (qtdemux_parse_trak), + (qtdemux_video_caps): + Couple of fixes + +2005-12-19 15:06:27 +0000 Edward Hervey + + gst/avi/gstavidemux.c: Construct index for indexless files. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_stream), + (gst_avi_demux_parse_odml), (gst_avi_demux_peek_tag), + (gst_avi_demux_next_data_buffer), (gst_avi_demux_stream_scan), + (gst_avi_demux_stream_header), (gst_avi_demux_loop): + Construct index for indexless files. + Make sure pad/buffers are correctly reset to NULL once we don't need + them anymore, else we get lovely segfaults/assertions. + * gst/wavparse/gstwavparse.c: + Yes, you can have 96KHz audio and wma in wav :( + +2005-12-18 15:14:44 +0000 Jan Schmidt + + configure.ac: Check for optional dependency on zlib for id3demux + Original commit message from CVS: + * configure.ac: + Check for optional dependency on zlib for id3demux + * gst/id3demux/Makefile.am: + * gst/id3demux/gstid3demux.c: (gst_gst_id3demux_get_type), + (gst_id3demux_base_init), (gst_id3demux_class_init), + (gst_id3demux_reset), (gst_id3demux_init), (gst_id3demux_dispose), + (gst_id3demux_add_srcpad), (gst_id3demux_remove_srcpad), + (gst_id3demux_trim_buffer), (gst_id3demux_chain), + (gst_id3demux_set_property), (gst_id3demux_get_property), + (id3demux_get_upstream_size), (gst_id3demux_srcpad_event), + (gst_id3demux_read_id3v1), (gst_id3demux_read_id3v2), + (gst_id3demux_sink_activate), (gst_id3demux_src_activate_pull), + (gst_id3demux_src_checkgetrange), (gst_id3demux_read_range), + (gst_id3demux_src_getrange), (gst_id3demux_change_state), + (gst_id3demux_pad_query), (gst_id3demux_get_query_types), + (simple_find_peek), (simple_find_suggest), + (gst_id3demux_do_typefind), (gst_id3demux_send_tag_event), + (plugin_init): + * gst/id3demux/gstid3demux.h: + * gst/id3demux/id3tags.c: (read_synch_uint), + (id3demux_read_id3v1_tag), (id3demux_read_id3v2_tag), + (id3demux_id3v2_frame_hdr_size), (convert_fid_to_v240), + (id3demux_id3v2_frames_to_tag_list): + * gst/id3demux/id3tags.h: + * gst/id3demux/id3v2.4.0-frames.txt: + * gst/id3demux/id3v2.4.0-structure.txt: + * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), + (parse_comment_frame), (parse_text_identification_frame), + (id3v2_tag_to_taglist), (parse_split_strings): + All new LGPL id3 demuxer. Can use zlib for compressed frames, + otherwise it discards them. Works on my test files. + * gst/wavparse/gstwavparse.c: (gst_wavparse_loop): + Don't send EOS to a non-existing srcpad + The debug category can be static + +2005-12-17 17:48:38 +0000 Julien Moutte + + docs/plugins/: Updates. + Original commit message from CVS: + 2005-12-17 Julien MOUTTE + * docs/plugins/gst-plugins-bad-plugins-decl.txt: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + * docs/plugins/gst-plugins-bad-plugins.signals: + * docs/plugins/inspect/plugin-dfbvideosink.xml: + * docs/plugins/inspect/plugin-qtdemux.xml: + * docs/plugins/inspect/plugin-sdlvideosink.xml: + * docs/plugins/inspect/plugin-speed.xml: + * docs/plugins/inspect/plugin-tta.xml: Updates. + * ext/directfb/dfbvideosink.c: + (gst_dfbvideosink_surface_create), + (gst_dfbvideosink_event_thread), (gst_dfbvideosink_enum_vmodes), + (gst_dfbvideosink_enum_devices), (gst_dfbvideosink_setup), + (gst_dfbvideosink_cleanup), + (gst_dfbvideosink_can_blit_from_format), + (gst_dfbvideosink_get_best_vmode), (gst_dfbvideosink_getcaps), + (gst_dfbvideosink_setcaps), (gst_dfbvideosink_show_frame), + (gst_dfbvideosink_buffer_alloc), (gst_dfbsurface_finalize), + (gst_dfbvideosink_interface_supported), + (gst_dfbvideosink_navigation_send_event), + (gst_dfbvideosink_update_colorbalance), + (gst_dfbvideosink_colorbalance_list_channels), + (gst_dfbvideosink_colorbalance_set_value), + (gst_dfbvideosink_colorbalance_get_value), + (gst_dfbvideosink_colorbalance_init), + (gst_dfbvideosink_set_property), + (gst_dfbvideosink_get_property), + (gst_dfbvideosink_init), (gst_dfbvideosink_class_init): + * ext/directfb/dfbvideosink.h: Implement vertical sync and + color balance interface. + +2005-12-16 21:57:51 +0000 Stefan Kost + + change some char* into char[] + Original commit message from CVS: + * ext/esd/esdmon.c: (gst_esdmon_open_audio): + * ext/esd/esdsink.c: (gst_esdsink_prepare): + * gst/multipart/multipartdemux.c: + change some char* into char[] + +2005-12-16 19:32:53 +0000 Wim Taymans + + gst/wavparse/gstwavparse.*: Use GstSegment to implement more seeking features. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), + (gst_wavparse_other), (gst_wavparse_perform_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_loop), (gst_wavparse_pad_convert), + (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate_pull): + * gst/wavparse/gstwavparse.h: + Use GstSegment to implement more seeking features. + +2005-12-16 12:25:38 +0000 Tim-Philipp Müller + + ext/wavpack/gstwavpackdec.c: Oops, remove trailing comma from caps string. + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: + Oops, remove trailing comma from caps string. + +2005-12-16 10:12:49 +0000 Benjamin Pineau + + gst/rtsp/rtspconnection.c: Add include and move include to make things work on OpenBSD a... + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: + Add include and move include + to make things work on OpenBSD as well (fixes #323717; + patch by: Benjamin Pineau) + +2005-12-16 09:59:21 +0000 gcocatre@gmail.com + + ext/wavpack/: Wavpack supports samplerates from 6-192kHz, fix pad template remove buffer-frames from caps, they are g... + Original commit message from CVS: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link): + * ext/wavpack/gstwavpackparse.c: + Wavpack supports samplerates from 6-192kHz, fix pad template + caps (fixes #322973; patch by: gcocatre@gmail.com). Also + remove buffer-frames from caps, they are gone in 0.10. + +2005-12-14 20:05:45 +0000 Edgard Lima + + * ChangeLog: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + Set clock rate to be fixed in 8000. It fixes bug #324012. + Original commit message from CVS: + Set clock rate to be fixed in 8000. It fixes bug #324012. + +2005-12-14 18:07:16 +0000 Philippe Kalaf + + gst-plugins-good/gst/rtp/: Fixed payload range in payloder caps. Removed payload range completly from depayloaders as... + Original commit message from CVS: + 2005-12-14 Philippe Khalaf + * gst-plugins-good/gst/rtp/gstasteriskh263.c: + * gst-plugins-good/gst/rtp/gstrtpamrdepay.c: + * gst-plugins-good/gst/rtp/gstrtpamrpay.c: + * gst-plugins-good/gst/rtp/gstrtpg711depay.c: + * gst-plugins-good/gst/rtp/gstrtpg711depay.c: + * gst-plugins-good/gst/rtp/gstrtpgsmdepay.c: + * gst-plugins-good/gst/rtp/gstrtph263pay.c: + * gst-plugins-good/gst/rtp/gstrtph263pdepay.c: + * gst-plugins-good/gst/rtp/gstrtph263ppay.c: + * gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c: + * gst-plugins-good/gst/rtp/gstrtpmp4vpay.c: + * gst-plugins-good/gst/rtp/gstrtpmpadepay.c: + * gst-plugins-good/gst/rtp/gstrtpmpapay.c: + * gst-plugins-good/gst/rtp/README: + Fixed payload range in payloder caps. Removed payload range completly from + depayloaders as they don't require payload type in their caps. In effect, + there isn't any specific payload type for any given codec, only suggestions. + Fixes bug #324011. + +2005-12-13 21:58:42 +0000 Julien Moutte + + gst/videomixer/videomixer.c: Code cleanup and re-enabling queued time validity check for correct EOS handling. + Original commit message from CVS: + 2005-12-13 Julien MOUTTE + * gst/videomixer/videomixer.c: (gst_videomixer_init), + (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), + (gst_videomixer_collected): Code cleanup and re-enabling + queued time validity check for correct EOS handling. + +2005-12-13 17:18:32 +0000 Tim-Philipp Müller + + sys/oss/gstossmixerelement.c: Add 'device-name' property and fix state change function. + Original commit message from CVS: + * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init), + (gst_oss_mixer_element_get_property), + (gst_oss_mixer_element_change_state): + Add 'device-name' property and fix state change function. + +2005-12-13 10:45:04 +0000 Edward Hervey + + gst/flx/gstflxdec.c: If the speed of the file is null in the header, set the frame_time to the default setting of GST... + Original commit message from CVS: + * gst/flx/gstflxdec.c: (gst_flxdec_chain): + If the speed of the file is null in the header, set the frame_time to the default + setting of GST_SECOND / 70. Which is the default frame_delay for .fli files as + stated in this document : http://www.compuphase.com/flic.htm + Would be nice to have the time conversion done properly too + (duration = flxh->frames * flxdec->frame_time) + +2005-12-12 22:29:34 +0000 Julien Moutte + + Adding documentation for videomixer on my way with a funny sample pipeline. + Original commit message from CVS: + 2005-12-12 Julien MOUTTE + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * gst/videomixer/videomixer.c: + (gst_videomixer_pad_sink_setcaps), + (gst_videomixer_getcaps), (gst_videomixer_fill_queues), + (gst_videomixer_update_queues), (gst_videomixer_collected): + Adding + documentation for videomixer on my way with a funny sample + pipeline. + +2005-12-12 21:43:00 +0000 Julien Moutte + + gst/videomixer/videomixer.c: Fix caps negotiation. (#323896) + Original commit message from CVS: + 2005-12-12 Julien MOUTTE + * gst/videomixer/videomixer.c: + (gst_videomixer_pad_sink_setcaps), + (gst_videomixer_getcaps), (gst_videomixer_fill_queues), + (gst_videomixer_update_queues), (gst_videomixer_collected): + Fix caps negotiation. (#323896) + +2005-12-12 18:14:58 +0000 Arwed v. Merkatz + + * ChangeLog: + * gst/matroska/matroska-demux.c: + Set correct timestamps on audio laces, fixes playback of mp3 from matroska. + Original commit message from CVS: + Set correct timestamps on audio laces, fixes playback of mp3 from matroska. + +2005-12-12 10:40:42 +0000 Tim-Philipp Müller + + ext/: GstObjects must be unref'ed with gst_object_unref() instead of g_object_unref(), otherwise things break for GLi... + Original commit message from CVS: + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): + * ext/libmms/gstmms.c: (gst_mms_src_query), (gst_mms_create): + * ext/musepack/gstmusepackdec.c: (gst_musepackdec_src_query), + (gst_musepackdec_loop): + * ext/swfdec/gstswfdec.c: (gst_swfdec_video_link), + (gst_swfdec_src_query): + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query): + GstObjects must be unref'ed with gst_object_unref() instead of + g_object_unref(), otherwise things break for GLib-2.6 users. + +2005-12-12 10:30:20 +0000 Tim-Philipp Müller + + gst/auparse/gstauparse.*: Use gst_object_unref() for GstObjects instead of g_object_unref() and fix a mem leak in a d... + Original commit message from CVS: + * gst/auparse/gstauparse.c: (gst_au_parse_base_init), + (gst_au_parse_class_init), (gst_au_parse_init), + (gst_au_parse_dispose), (gst_au_parse_chain), + (gst_au_parse_change_state), (plugin_init): + * gst/auparse/gstauparse.h: + Use gst_object_unref() for GstObjects instead of + g_object_unref() and fix a mem leak in a debug + statement; while we're at it, also borgify, use + boilerplate macros and clean up a little bit. + +2005-12-11 20:27:06 +0000 Edward Hervey + + gst/debug/efence.c: Added pull mode. + Original commit message from CVS: + * gst/debug/efence.c: (gst_efence_init), (gst_efence_getrange), + (gst_efence_checkgetrange), (gst_efence_activate_src_pull): + Added pull mode. + +2005-12-11 19:25:41 +0000 Tim-Philipp Müller + + gst/: Use audiotestsrc instead of sinesrc (#323798). + Original commit message from CVS: + * gst/goom/gstgoom.c: + * gst/level/level-example.c: (main): + * gst/smoothwave/demo-osssrc.c: (main): + Use audiotestsrc instead of sinesrc (#323798). + +2005-12-11 17:50:50 +0000 Stefan Kost + + sys/oss/gstosssink.c: more debug-func-ptr usage + Original commit message from CVS: + * sys/oss/gstosssink.c: (gst_oss_sink_class_init): + more debug-func-ptr usage + +2005-12-11 16:43:42 +0000 Zeeshan Ali + + * ChangeLog: + * gst/flx/flx_color.c: + * gst/flx/flx_color.h: + * gst/flx/flx_fmt.h: + * gst/flx/gstflxdec.c: + * gst/flx/gstflxdec.h: + Now flxdec works on big-endian machines as well. + Original commit message from CVS: + Now flxdec works on big-endian machines as well. + +2005-12-11 16:14:22 +0000 Tim-Philipp Müller + + gst/debug/efence.c: Make sure GST_BUFFER_DATA is set on fenced copied buffers; fix + Original commit message from CVS: + * gst/debug/efence.c: (gst_efence_init), (gst_efence_chain), + (gst_fenced_buffer_copy): + Make sure GST_BUFFER_DATA is set on fenced copied buffers; fix + GST_DEBUG crasher where GST_TIME_FORMAT was not used in + conjunction with GST_TIME_ARGS. Also, don't leak pad templates + and use GST_DEBUG_FUNCPTR for pad functions. + +2005-12-10 20:26:33 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.*: Rewrite flacdec a bit, so that even seeking might work now. Most importantly, don't act upon a... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (gst_flac_dec_base_init), + (gst_flac_dec_class_init), (gst_flac_dec_init), + (gst_flac_dec_metadata_callback), (gst_flac_dec_error_callback), + (gst_flac_dec_eof), (gst_flac_dec_write), (gst_flac_dec_loop), + (gst_flac_dec_convert_src), (gst_flac_dec_get_src_query_types), + (gst_flac_dec_src_query), (gst_flac_dec_send_newsegment), + (gst_flac_dec_handle_seek_event), (gst_flac_dec_src_event), + (gst_flac_dec_change_state): + * ext/flac/gstflacdec.h: + Rewrite flacdec a bit, so that even seeking might work now. Most + importantly, don't act upon any flow return values we get, just tell + the decoder everything's dandy and act on the flow return values + later on in the loop function. We don't want to mess up the internal + decoder state for non-fatal things like flushing pads etc. Other + than that, use GstSegment (segment seeks don't work yet though, but + should be easy to add), use boilerplate macros, drop the superfluous + 'flacdec:' from debug messages, use gst_util_uint64_scale_int, and + lots of other things. + +2005-12-10 14:57:48 +0000 Tim-Philipp Müller + + configure.ac: Update comment in OSS includes check. + Original commit message from CVS: + * configure.ac: + Update comment in OSS includes check. + * sys/oss/gstossdmabuffer.c: + * sys/oss/gstosshelper.c: + * sys/oss/gstossmixer.c: + * sys/oss/gstossmixertrack.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + * sys/oss/oss_probe.c: + Don't assume the OSS soundcard.h include is always in + the sys/ directory. Instead, use the existing defines + from config.h to include the right file. Fixes + compilation on OpenBSD 3.8 (#323718). + +2005-12-09 19:51:03 +0000 Thomas Vander Stichele + + * ChangeLog: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * ext/flac/gstflac.c: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.c: + * ext/flac/gstflacenc.h: + borgify and fix up documentation + Original commit message from CVS: + borgify and fix up documentation + +2005-12-09 15:30:21 +0000 Jan Schmidt + + ext/faad/gstfaad.c: Assume that an unknown channel mapping with 2 channels is stereo and play it that way instead of ... + Original commit message from CVS: + * ext/faad/gstfaad.c: (gst_faad_chanpos_to_gst), + (gst_faad_update_caps): + Assume that an unknown channel mapping with 2 channels + is stereo and play it that way instead of erroring. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream), (qtdemux_parse_trak): + Handle e.g. jpeg streams with 0 duration frames as having 0 framerate. + Debug fixes. Some 64 bit variable fixes + +2005-12-09 11:12:48 +0000 Michael Smith + + ext/flac/gstflacdec.c: Accept a wider range of flac files, more closely matching flac sp + Original commit message from CVS: + * ext/flac/gstflacdec.c: (raw_caps_factory), (gst_flacdec_write): + Accept a wider range of flac files, more closely matching flac sp + +2005-12-08 16:27:12 +0000 Julien Moutte + + docs/plugins/Makefile.am: Add multipart elements. + Original commit message from CVS: + 2005-12-08 Julien MOUTTE + * docs/plugins/Makefile.am: Add multipart elements. + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: Fix flac. + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: Add docs. + +2005-12-07 11:46:15 +0000 Edward Hervey + + gst/qtdemux/qtdemux.c: Memleak fixes. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream): + Memleak fixes. + Send out EOS for valid reasons (couldn't pull_range() from upstream + for example). + +2005-12-07 11:40:46 +0000 Edward Hervey + + gst/avi/gstavidemux.c: Memleak and crasher fixes. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), + (gst_avi_demux_parse_stream), (gst_avi_demux_stream_header), + (gst_avi_demux_invert): + Memleak and crasher fixes. + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_create_sourcepad), (gst_wavparse_stream_headers): + Memleak fixes + +2005-12-06 19:55:58 +0000 Thomas Vander Stichele + + * gst/equalizer/gstiirequalizer.c: + * gst/qtdemux/qtdemux.c: + * gst/qtdemux/qtdemux.h: + * sys/v4l2/gstv4l2colorbalance.h: + * sys/v4l2/gstv4l2element.h: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/gstv4l2tuner.h: + * sys/v4l2/gstv4l2xoverlay.h: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + expand tabs + Original commit message from CVS: + expand tabs + +2005-12-06 19:44:58 +0000 Thomas Vander Stichele + + * ChangeLog: + * ext/aalib/gstaasink.h: + * ext/cairo/gsttextoverlay.h: + * ext/dv/gstdvdec.h: + * ext/dv/gstdvdemux.c: + * ext/dv/gstdvdemux.h: + * ext/esd/esdsink.h: + * ext/flac/flac_compat.h: + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.h: + * ext/gconf/gconf.h: + * ext/gconf/gstgconfaudiosink.h: + * ext/gconf/gstgconfvideosink.h: + * ext/gdk_pixbuf/gstgdkanimation.h: + * ext/jpeg/gstjpegdec.h: + * ext/jpeg/smokecodec.h: + * ext/jpeg/smokeformat.h: + * ext/ladspa/gstsignalprocessor.h: + * ext/ladspa/search.c: + * ext/ladspa/utils.h: + * ext/libmng/gstmngdec.h: + * ext/libmng/gstmngenc.c: + * ext/libmng/gstmngenc.h: + * ext/libpng/gstpngenc.c: + * ext/libpng/gstpngenc.h: + * ext/shout2/gstshout2.h: + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.c: + * ext/speex/gstspeexenc.h: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.h: + * gst/autodetect/gstautovideosink.h: + * gst/avi/gstavidemux.h: + * gst/cutter/gstcutter.h: + * gst/debug/tests.c: + * gst/debug/tests.h: + * gst/effectv/gstwarp.c: + * gst/flx/flx_fmt.h: + * gst/flx/gstflxdec.h: + * gst/goom/filters.c: + * gst/goom/filters.h: + * gst/goom/goom_tools.h: + * gst/law/alaw-encode.c: + * gst/level/gstlevel.c: + * gst/level/gstlevel.h: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.h: + * gst/monoscope/convolve.c: + * gst/monoscope/convolve.h: + * gst/multipart/multipartmux.c: + * gst/oldcore/gstaggregator.c: + * gst/oldcore/gstaggregator.h: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmd5sink.h: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstmultifilesrc.h: + * gst/oldcore/gstpipefilter.h: + * gst/oldcore/gstshaper.h: + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpdepay.h: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtsp/gstrtspsrc.c: + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspconnection.h: + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspmessage.h: + * gst/rtsp/rtsptransport.h: + * gst/rtsp/rtspurl.c: + * gst/rtsp/rtspurl.h: + * gst/rtsp/sdpmessage.c: + * gst/rtsp/sdpmessage.h: + * gst/smpte/barboxwipes.c: + * gst/smpte/gstmask.h: + * gst/smpte/gstsmpte.h: + * gst/smpte/paint.c: + * gst/smpte/paint.h: + * gst/udp/gstdynudpsink.h: + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudpsink.c: + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: + * gst/videomixer/videomixer.c: + * gst/wavenc/riff.h: + * gst/wavparse/gstwavparse.h: + * sys/oss/gstossdmabuffer.h: + * sys/oss/gstossmixer.h: + * sys/oss/gstossmixerelement.h: + * sys/oss/gstossmixertrack.h: + * sys/oss/gstosssink.c: + * sys/oss/gstosssink.h: + * sys/oss/gstosssrc.c: + * sys/oss/gstosssrc.h: + * sys/osxaudio/gstosxaudioelement.h: + * sys/osxaudio/gstosxaudiosink.h: + * sys/osxaudio/gstosxaudiosrc.h: + expand tabs + Original commit message from CVS: + expand tabs + +2005-12-05 18:12:07 +0000 Thomas Vander Stichele + + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.10.0 === + +2005-12-05 18:03:23 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + releasing 0.10.0 + Original commit message from CVS: + releasing 0.10.0 + +2005-12-05 18:01:48 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-qtdemux.xml: + releasing 0.10.0 + Original commit message from CVS: + releasing 0.10.0 + +2005-12-05 16:21:08 +0000 Thomas Vander Stichele + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2005-12-05 15:08:46 +0000 Thomas Vander Stichele + + * Makefile.am: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/it.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + update translations + Original commit message from CVS: + update translations + +2005-12-05 13:04:22 +0000 Andy Wingo + + Update for alloc_buffer changes. + Original commit message from CVS: + 2005-12-05 Andy Wingo + * ext/faac/gstfaac.c: (gst_faac_sink_event), (gst_faac_chain): + * ext/faad/gstfaad.c: (gst_faad_chain): + * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_chain): + * ext/lcs/gstcolorspace.c: (gst_colorspace_chain): + * ext/xine/xineinput.c: (gst_xine_input_get): + * gst/colorspace/gstcolorspace.c: (gst_colorspace_chain): + * gst/speed/gstspeed.c: (speed_chain): + * gst/videocrop/gstvideocrop.c: (gst_video_crop_chain): Update for + alloc_buffer changes. + +2005-12-05 13:03:00 +0000 Andy Wingo + + Update for alloc_buffer changes. + Original commit message from CVS: + 2005-12-05 Andy Wingo + * ext/dv/gstdvdec.c: (gst_dvdec_chain): + * ext/flac/gstflacdec.c: (gst_flacdec_write): + * ext/flac/gstflacenc.c: (gst_flacenc_write_callback): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_chain): + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_chain): + * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_process): + * ext/libpng/gstpngdec.c: (user_info_callback), (gst_pngdec_task): + * ext/speex/gstspeexdec.c: (speex_dec_chain): + * ext/speex/gstspeexenc.c: (gst_speexenc_chain): + * gst/auparse/gstauparse.c: (gst_auparse_chain): + * gst/flx/gstflxdec.c: (gst_flxdec_chain): + * gst/goom/gstgoom.c: (gst_goom_chain): + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_push_vorbis_codec_priv_data), + (gst_matroska_demux_add_wvpk_header): + * gst/multipart/multipartdemux.c: (gst_multipart_demux_chain): + * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): + * gst/videomixer/videomixer.c: (gst_videomixer_collected): + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Update for + alloc_buffer changes. + +2005-12-05 12:23:22 +0000 Michael Smith + + docs/plugins/gst-plugins-good-plugins.args: Remove args for plugins that aren't in -good. + Original commit message from CVS: + * docs/plugins/gst-plugins-good-plugins.args: + Remove args for plugins that aren't in -good. + +2005-12-04 22:26:07 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + remove pango plugin as its gone into base + Original commit message from CVS: + remove pango plugin as its gone into base + +2005-12-03 18:51:48 +0000 Thomas Vander Stichele + + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpg711pay.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpspeexpay.c: + fix element descriptions + Original commit message from CVS: + fix element descriptions + +2005-12-03 18:50:12 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-fdsrc.xml: + remove fdsrc docs + Original commit message from CVS: + remove fdsrc docs + +2005-12-01 19:18:08 +0000 Thomas Vander Stichele + + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.9.7 === + +2005-12-01 19:14:26 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cutter.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + releasing 0.9.7 + Original commit message from CVS: + releasing 0.9.7 + +2005-12-01 19:13:20 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-qtdemux.xml: + releasing 0.9.7 + Original commit message from CVS: + releasing 0.9.7 + +2005-12-01 17:53:29 +0000 Thomas Vander Stichele + + * common: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2005-12-01 15:34:13 +0000 Thomas Vander Stichele + + * ChangeLog: + * docs/plugins/.gitignore: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/inspect/plugin-multipart.xml: + * docs/plugins/inspect/plugin-rtp.xml: + add multipart plugin to docs + Original commit message from CVS: + add multipart plugin to docs + +2005-12-01 15:22:25 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + * ext/Makefile.am: + * ext/pango/Makefile.am: + * ext/pango/gstclockoverlay.c: + * ext/pango/gstclockoverlay.h: + * ext/pango/gsttextoverlay.c: + * ext/pango/gsttextoverlay.h: + * ext/pango/gsttextrender.c: + * ext/pango/gsttextrender.h: + * ext/pango/gsttimeoverlay.c: + * ext/pango/gsttimeoverlay.h: + move pango to base + Original commit message from CVS: + move pango to base + +2005-12-01 14:39:30 +0000 Thomas Vander Stichele + + gst/rtp/: parsers are depayers + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16parse.c: + * gst/rtp/gstrtpL16parse.h: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtpgsmparse.h: + parsers are depayers + +2005-12-01 14:30:01 +0000 Thomas Vander Stichele + + * ChangeLog: + * common: + * gst/rtp/Makefile.am: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16enc.c: + * gst/rtp/gstrtpL16enc.h: + * gst/rtp/gstrtpL16parse.c: + * gst/rtp/gstrtpL16parse.h: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpamrdec.c: + * gst/rtp/gstrtpamrdec.h: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrenc.c: + * gst/rtp/gstrtpamrenc.h: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpdec.c: + * gst/rtp/gstrtpdec.h: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpdepay.h: + * gst/rtp/gstrtpg711dec.c: + * gst/rtp/gstrtpg711dec.h: + * gst/rtp/gstrtpg711depay.c: + * gst/rtp/gstrtpg711depay.h: + * gst/rtp/gstrtpg711enc.c: + * gst/rtp/gstrtpg711enc.h: + * gst/rtp/gstrtpg711pay.c: + * gst/rtp/gstrtpg711pay.h: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmenc.h: + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtpgsmparse.h: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtpgsmpay.h: + * gst/rtp/gstrtph263enc.c: + * gst/rtp/gstrtph263enc.h: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pay.h: + * gst/rtp/gstrtph263pdec.c: + * gst/rtp/gstrtph263pdec.h: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph263penc.c: + * gst/rtp/gstrtph263penc.h: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtpmp4vdec.c: + * gst/rtp/gstrtpmp4vdec.h: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4vdepay.h: + * gst/rtp/gstrtpmp4venc.c: + * gst/rtp/gstrtpmp4venc.h: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadec.c: + * gst/rtp/gstrtpmpadec.h: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpadepay.h: + * gst/rtp/gstrtpmpaenc.c: + * gst/rtp/gstrtpmpaenc.h: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmpapay.h: + * gst/rtp/gstrtpspeexdec.c: + * gst/rtp/gstrtpspeexdec.h: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexdepay.h: + * gst/rtp/gstrtpspeexenc.c: + * gst/rtp/gstrtpspeexenc.h: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpspeexpay.h: + Do burger's rename for rtp payloaders and depayloaders + Original commit message from CVS: + Do burger's rename for rtp payloaders and depayloaders + +2005-11-30 19:02:35 +0000 Wim Taymans + + ext/dv/: Fix seeking in dvdemux again, add some more debug info. + Original commit message from CVS: + * ext/dv/gstdvdec.c: (gst_dvdec_chain): + * ext/dv/gstdvdemux.c: (gst_dvdemux_demux_frame): + * ext/dv/gstdvdemux.h: + Fix seeking in dvdemux again, add some more debug info. + +2005-11-30 18:48:56 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + fix tests + Original commit message from CVS: + fix tests + +2005-11-30 18:40:19 +0000 Thomas Vander Stichele + + * Makefile.am: + add tests subdir + Original commit message from CVS: + add tests subdir + +2005-11-30 18:36:02 +0000 Thomas Vander Stichele + + * tests/check/Makefile.am: + add Makefile.am + Original commit message from CVS: + add Makefile.am + +2005-11-30 18:28:53 +0000 Thomas Vander Stichele + + move + Original commit message from CVS: + * PORTED_09: + * docs/random/PORTED_09: + move + * tests/Makefile.am: + add + * win32/gst.sln: + remove + +2005-11-30 18:24:08 +0000 Thomas Vander Stichele + + * ChangeLog: + * Makefile.am: + * check/.gitignore: + * check/Makefile.am: + * check/elements/.gitignore: + * check/elements/level.c: + * check/elements/matroskamux.c: + * configure.ac: + * examples/Makefile.am: + * examples/capsfilter/Makefile.am: + * examples/capsfilter/capsfilter1.c: + * examples/gob/Makefile.am: + * examples/gob/gst-identity2.gob: + * examples/gstplay/.gitignore: + * examples/gstplay/Makefile.am: + * examples/gstplay/player.c: + * examples/indexing/.gitignore: + * examples/indexing/Makefile.am: + * examples/indexing/indexmpeg.c: + * examples/level/Makefile.am: + * examples/level/README: + * examples/level/demo.c: + * examples/level/plot.c: + * examples/stats/Makefile.am: + * examples/stats/mp2ogg.c: + * examples/switch/.gitignore: + * examples/switch/Makefile.am: + * examples/switch/switcher.c: + move under tests + Original commit message from CVS: + move under tests + +2005-11-30 16:57:57 +0000 Christian Schaller + + * common: + * gst-plugins-good.spec.in: + update for latest changes + Original commit message from CVS: + update for latest changes + +2005-11-30 14:53:29 +0000 Tim-Philipp Müller + + ext/pango/gsttextrender.*: Add missing files. + Original commit message from CVS: + * ext/pango/gsttextrender.c: (gst_text_render_base_init), + (gst_text_render_class_init), (resize_bitmap), + (gst_text_render_render_text), (gst_text_render_setcaps), + (gst_text_render_fixate_caps), (gst_text_renderer_bitmap_to_ayuv), + (gst_text_render_chain), (gst_text_render_finalize), + (gst_text_render_init), (gst_text_render_set_property): + * ext/pango/gsttextrender.h: + Add missing files. + +2005-11-30 13:20:57 +0000 Tim-Philipp Müller + + Port pango-based textoverlay, timeoverlay and textrender to 0.9 and add background shading and text wrapping modes. M... + Original commit message from CVS: + * configure.ac: + * ext/Makefile.am: + * ext/pango/Makefile.am: + * ext/pango/gstclockoverlay.c: (gst_clock_overlay_base_init), + (gst_clock_overlay_render_time), (gst_clock_overlay_get_text), + (gst_clock_overlay_class_init), (gst_clock_overlay_init): + * ext/pango/gstclockoverlay.h: + * ext/pango/gsttextoverlay.c: (gst_text_overlay_base_init), + (gst_text_overlay_get_text), (gst_text_overlay_class_init), + (gst_text_overlay_finalize), (gst_text_overlay_init), + (gst_text_overlay_update_wrap_mode), (gst_text_overlay_setcaps), + (gst_text_overlay_text_pad_linked), + (gst_text_overlay_text_pad_unlinked), + (gst_text_overlay_set_property), (gst_text_overlay_getcaps), + (gst_text_overlay_shade_y), (gst_text_overlay_blit_yuv420), + (gst_text_overlay_resize_bitmap), (gst_text_overlay_render_text), + (gst_text_overlay_push_frame), (gst_text_overlay_pop_video), + (gst_text_overlay_pop_text), (gst_text_overlay_collected), + (gst_text_overlay_change_state), (plugin_init): + * ext/pango/gsttextoverlay.h: + * ext/pango/gsttimeoverlay.c: (gst_time_overlay_base_init), + (gst_time_overlay_render_time), (gst_time_overlay_get_text), + (gst_time_overlay_class_init), (gst_time_overlay_init): + * ext/pango/gsttimeoverlay.h: + Port pango-based textoverlay, timeoverlay and textrender to 0.9 + and add background shading and text wrapping modes. Make + timoverlay derive from textoverlay. Also add new clockoverlay + element. + +2005-11-30 11:10:01 +0000 Julien Moutte + + gst/udp/Makefile.am: Moved to netbuffer. + Original commit message from CVS: + 2005-11-30 Julien MOUTTE + * gst/udp/Makefile.am: Moved to netbuffer. + +2005-11-30 10:18:42 +0000 Julien Moutte + + Ported multipart mux/demux to 0.9. + Original commit message from CVS: + 2005-11-30 Julien MOUTTE + * configure.ac: + * PORTED_O9: + * gst/multipart/Makefile.am: + * gst/multipart/multipartdemux.c: + (gst_multipart_demux_base_init), + (gst_multipart_demux_class_init), (gst_multipart_demux_init), + (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), + (gst_multipart_demux_change_state), + (gst_multipart_demux_plugin_init): + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_init), (gst_multipart_mux_finalize), + (gst_multipart_mux_sinkconnect), + (gst_multipart_mux_request_new_pad), + (gst_multipart_mux_handle_src_event), + (gst_multipart_mux_queue_pads), (gst_multipart_mux_collected), + (gst_multipart_mux_change_state): Ported multipart mux/demux to + 0.9. + +2005-11-30 08:26:47 +0000 Thomas Vander Stichele + + gst/: update for symbols change + Original commit message from CVS: + * gst/debug/gstnavigationtest.c: (gst_navigationtest_get_type): + * gst/debug/gstnavigationtest.h: + * gst/effectv/gstaging.c: (gst_agingtv_get_type): + * gst/effectv/gstdice.c: (gst_dicetv_get_type): + * gst/effectv/gstedge.c: (gst_edgetv_get_type): + * gst/effectv/gstquark.c: (gst_quarktv_get_type): + * gst/effectv/gstrev.c: (gst_revtv_get_type): + * gst/effectv/gstshagadelic.c: (gst_shagadelictv_get_type): + * gst/effectv/gstvertigo.c: (gst_vertigotv_get_type): + * gst/effectv/gstwarp.c: (gst_warptv_get_type): + * gst/videofilter/gstvideoflip.c: (gst_video_flip_set_property), + (gst_video_flip_get_type): + * gst/videofilter/gstvideoflip.h: + update for symbols change + +2005-11-29 17:46:04 +0000 Thomas Vander Stichele + + gst/udp/: the old gstnet lib was renamed gstnetbuffer (#322257) + Original commit message from CVS: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstudpsrc.c: + the old gstnet lib was renamed gstnetbuffer (#322257) + +2005-11-29 15:42:01 +0000 Tim-Philipp Müller + + ext/cairo/gsttextoverlay.c: Actually render the text from the text pad. + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_render_text), + (gst_text_overlay_collected): + Actually render the text from the text pad. + +2005-11-29 14:49:00 +0000 Edward Hervey + + gst/debug/: Update for GstBaseTransform event virtual method + Original commit message from CVS: + * gst/debug/gstnavseek.c: (gst_navseek_event): + * gst/debug/progressreport.c: (gst_progress_report_event): + Update for GstBaseTransform event virtual method + +2005-11-29 10:55:09 +0000 Thomas Vander Stichele + + ext/cairo/Makefile.am: no need to link to videofilter + Original commit message from CVS: + 2005-11-29 Thomas Vander Stichele + * ext/cairo/Makefile.am: + no need to link to videofilter + +2005-11-29 10:46:00 +0000 Thomas Vander Stichele + + * ChangeLog: + * gst/debug/Makefile.am: + * gst/debug/gstnavigationtest.h: + * gst/effectv/Makefile.am: + * gst/effectv/gstaging.c: + * gst/effectv/gstdice.c: + * gst/effectv/gstedge.c: + * gst/effectv/gstquark.c: + * gst/effectv/gstrev.c: + * gst/effectv/gstshagadelic.c: + * gst/effectv/gstvertigo.c: + * gst/effectv/gstwarp.c: + * gst/videofilter/Makefile.am: + * gst/videofilter/gstvideofilter.c: + * gst/videofilter/gstvideofilter.h: + * gst/videofilter/gstvideoflip.h: + remove the videofilter library and link to the one in base + Original commit message from CVS: + remove the videofilter library and link to the one in base + +2005-11-29 01:30:40 +0000 Thomas Vander Stichele + + * common: + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideoflip.h: + borgify + Original commit message from CVS: + borgify + +2005-11-28 17:31:44 +0000 Edward Hervey + + gst/avi/gstavidemux.c: Useless check now we're setting the current entry correctly. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): + Useless check now we're setting the current entry correctly. + +2005-11-28 16:54:03 +0000 Tim-Philipp Müller + + ext/jpeg/gstjpegenc.c: Don't leak input buffer in chain function (fixes #322667); make state change function thread-s... + Original commit message from CVS: + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_resync), (gst_jpegenc_chain), + (gst_jpegenc_set_property), (gst_jpegenc_get_property), + (gst_jpegenc_change_state): + Don't leak input buffer in chain function (fixes #322667); make + state change function thread-safe; don't repeat the current function + name in GST_DEBUG statements; use GST_ROUND_UP_* macros; use + gst_pad_alloc_buffer(); misc. minor cleanups. + +2005-11-28 15:43:29 +0000 Edward Hervey + + ext/faad/gstfaad.c: Handle gracefully the consequence of "Maximum number of scalefactor bands exceeded", which result... + Original commit message from CVS: + * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): + Handle gracefully the consequence of "Maximum number of scalefactor + bands exceeded", which results in 0 channels with samplerates of 0. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state): + Do upward transitions, then call parent state_change, then do + downward transitions. + +2005-11-28 15:13:22 +0000 Jan Schmidt + + gst/matroska/matroska-mux.c: Look for pixel-aspect-ratio in caps, not pixel_width and pixel_height (Fixes: #322645) + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_video_pad_setcaps): + Look for pixel-aspect-ratio in caps, not pixel_width and + pixel_height (Fixes: #322645) + +2005-11-28 12:59:05 +0000 Jan Schmidt + + gst/matroska/matroska-mux.c: From Michal Benes: frame duration should be GST_SECOND / framerate, not + Original commit message from CVS: + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_video_pad_setcaps): + From Michal Benes: + frame duration should be GST_SECOND / framerate, not + GST_SECOND * framerate. (Fixes: #322643) + +2005-11-27 17:02:53 +0000 Thomas Vander Stichele + + configure.ac: fix up GST_PLUGIN_LDFLAGS + Original commit message from CVS: + * configure.ac: + fix up GST_PLUGIN_LDFLAGS + * gst/rtsp/rtspconnection.c: + fix includes (see #317043) + * gst/videofilter/Makefile.am: + stop installing this library + +2005-11-27 15:30:25 +0000 Thomas Vander Stichele + + * configure.ac: + no need for an AS_LIBTOOL call + Original commit message from CVS: + no need for an AS_LIBTOOL call + +2005-11-27 14:33:31 +0000 Thomas Vander Stichele + + * Makefile.am: + * common: + * gst-plugins-good.spec.in: + add ACLOCAL_AMFLAGS; remove old stuff from spec changelog + Original commit message from CVS: + add ACLOCAL_AMFLAGS; remove old stuff from spec changelog + +2005-11-26 12:54:47 +0000 Edward Hervey + + ext/dv/gstdvdec.c: Handle the case where the incoming Video dv stream doesn't have a pixel aspect ratio set. + Original commit message from CVS: + * ext/dv/gstdvdec.c: (gst_dvdec_sink_setcaps): + Handle the case where the incoming Video dv stream doesn't have + a pixel aspect ratio set. + +2005-11-25 22:14:47 +0000 Thomas Vander Stichele + + * ChangeLog: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * ext/flac/gstflacdec.c: + document flacdec + Original commit message from CVS: + document flacdec + +2005-11-25 21:36:18 +0000 Thomas Vander Stichele + + * ChangeLog: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/inspect/plugin-autodetect.xml: + * ext/cairo/gstcairo.c: + * ext/cairo/gsttextoverlay.c: + * ext/cairo/gsttextoverlay.h: + * ext/cairo/gsttimeoverlay.c: + * ext/cairo/gsttimeoverlay.h: + do some name borgifying document + Original commit message from CVS: + do some name borgifying + document + +2005-11-25 21:02:16 +0000 Thomas Vander Stichele + + documenting auto*sink using strstr for the video sink lookup, class field is not ordered update other plugins + Original commit message from CVS: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_base_init), + (gst_auto_video_sink_factory_filter): + documenting auto*sink + using strstr for the video sink lookup, class field is not ordered + update other plugins + +2005-11-25 19:58:19 +0000 Edgard Lima + + * ext/wavpack/Makefile.am: + * ext/wavpack/gstwavpackdec.c: + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackparse.c: + * ext/wavpack/gstwavpackparse.h: + Wavpack ported to 0.9. No support for correction file yet. + Original commit message from CVS: + Wavpack ported to 0.9. No support for correction file yet. + +2005-11-25 18:15:51 +0000 Thomas Vander Stichele + + ext/wavpack/: put back wavpack - still needs porting + Original commit message from CVS: + * ext/wavpack/gstwavpackcommon.h: + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link), + (gst_wavpack_dec_wvclink), (gst_wavpack_dec_get_type), + (gst_wavpack_dec_base_init), (gst_wavpack_dec_dispose), + (gst_wavpack_dec_class_init), (gst_wavpack_dec_src_query), + (gst_wavpack_dec_init), (gst_wavpack_dec_setup_context), + (gst_wavpack_dec_format_samples), (gst_wavpack_dec_loop), + (gst_wavpack_dec_plugin_init): + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_get_type), + (gst_wavpack_parse_base_init), (gst_wavpack_parse_dispose), + (gst_wavpack_parse_class_init), (gst_wavpack_parse_src_query), + (gst_wavpack_parse_src_event), (find_header), (find_sample), + (gst_wavpack_parse_seek), (gst_wavpack_parse_init), + (gst_wavpack_parse_handle_event), (gst_wavpack_parse_loop), + (gst_wavpack_parse_change_state), (gst_wavpack_parse_plugin_init): + * ext/wavpack/gstwavpackparse.h: + put back wavpack - still needs porting + +2005-11-25 18:03:24 +0000 Sebastien Cote + + gst/udp/gstudpsrc.c: Patch from Sebastien Cote to close control sockets in udpsrc. + Original commit message from CVS: + * gst/udp/gstudpsrc.c: (gst_udpsrc_stop): + Patch from Sebastien Cote to close control sockets in udpsrc. + +2005-11-24 15:07:06 +0000 Julien Moutte + + gst/effectv/gstquark.c: Flush the planes list on reverse caps negotiation. This was crashing because of differently s... + Original commit message from CVS: + 2005-11-24 Julien MOUTTE + * gst/effectv/gstquark.c: (gst_quarktv_set_caps), + (gst_quarktv_get_unit_size), (gst_quarktv_transform), + (gst_quarktv_planetable_clear), (gst_quarktv_change_state), + (gst_quarktv_base_init), (gst_quarktv_class_init), + (gst_quarktv_init): Flush the planes list on reverse caps + negotiation. This was crashing because of differently sized + buffers. + +2005-11-24 12:50:28 +0000 Julien Moutte + + gst/: Handle strides correctly, fix identity flipping, convert navigation event correctly again. + Original commit message from CVS: + 2005-11-24 Julien MOUTTE + * gst/debug/gstnavigationtest.c: (draw_box_planar411): + * gst/videofilter/gstvideoflip.c: + (gst_videoflip_method_get_type), + (gst_videoflip_set_caps), (gst_videoflip_transform_caps), + (gst_videoflip_get_unit_size), (gst_videoflip_flip), + (gst_videoflip_transform), (gst_videoflip_handle_src_event), + (gst_videoflip_set_property), (gst_videoflip_base_init), + (gst_videoflip_class_init), (gst_videoflip_init): Handle strides + correctly, fix identity flipping, convert navigation event + correctly again. + +2005-11-24 11:16:53 +0000 Michael Smith + + * README: + Fix #320288: wrong readme in plugins-good + Original commit message from CVS: + Fix #320288: wrong readme in plugins-good + +2005-11-24 11:06:29 +0000 Thomas Vander Stichele + + * Makefile.am: + fix torture target + Original commit message from CVS: + fix torture target + +2005-11-23 21:25:56 +0000 Thomas Vander Stichele + + * Makefile.am: + add a torture target + Original commit message from CVS: + add a torture target + +2005-11-23 20:05:26 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.9.6 === + +2005-11-23 19:57:49 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-qtdemux.xml: + releasing 0.9.6 + Original commit message from CVS: + releasing 0.9.6 + +2005-11-23 19:56:31 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + releasing 0.9.6 + Original commit message from CVS: + releasing 0.9.6 + +2005-11-23 19:14:07 +0000 Thomas Vander Stichele + + * docs/plugins/inspect/plugin-cutter.xml: + adding cutter + Original commit message from CVS: + adding cutter + +2005-11-23 19:05:29 +0000 Thomas Vander Stichele + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2005-11-23 16:49:16 +0000 Jan Schmidt + + gst/debug/gstnavigationtest.c: Oops, initialise the framerate GValue + Original commit message from CVS: + * gst/debug/gstnavigationtest.c: (gst_navigationtest_init): + Oops, initialise the framerate GValue + +2005-11-23 15:50:51 +0000 Julien Moutte + + VideoFilter inherits from + Original commit message from CVS: + 2005-11-23 Julien MOUTTE + * ext/cairo/gsttimeoverlay.c: + (gst_timeoverlay_update_font_height), + (gst_timeoverlay_set_caps), (gst_timeoverlay_get_unit_size), + (gst_timeoverlay_transform), (gst_timeoverlay_base_init), + (gst_timeoverlay_class_init), (gst_timeoverlay_init), + (gst_timeoverlay_get_type): + * ext/cairo/gsttimeoverlay.h: + * gst/debug/Makefile.am: + * gst/debug/gstnavigationtest.c: + (gst_navigationtest_handle_src_event), + (gst_navigationtest_get_unit_size), + (gst_navigationtest_set_caps), + (gst_navigationtest_transform), + (gst_navigationtest_change_state), + (gst_navigationtest_base_init), (gst_navigationtest_class_init), + (gst_navigationtest_init), (gst_navigationtest_get_type), + (plugin_init): + * gst/debug/gstnavigationtest.h: + * gst/effectv/Makefile.am: + * gst/effectv/gstaging.c: (gst_agingtv_set_caps), + (gst_agingtv_get_unit_size), (gst_agingtv_transform), + (gst_agingtv_base_init), (gst_agingtv_class_init), + (gst_agingtv_init), (gst_agingtv_get_type): + * gst/effectv/gstdice.c: (gst_dicetv_set_caps), + (gst_dicetv_get_unit_size), (gst_dicetv_transform), + (gst_dicetv_base_init), (gst_dicetv_class_init), + (gst_dicetv_init), + (gst_dicetv_get_type): + * gst/effectv/gstedge.c: (gst_edgetv_set_caps), + (gst_edgetv_get_unit_size), (gst_edgetv_transform), + (gst_edgetv_base_init), (gst_edgetv_class_init), + (gst_edgetv_init), + (gst_edgetv_get_type): + * gst/effectv/gsteffectv.c: + * gst/effectv/gsteffectv.h: + * gst/effectv/gstquark.c: (gst_quarktv_set_caps), + (gst_quarktv_get_unit_size), (fastrand), + (gst_quarktv_transform), + (gst_quarktv_change_state), (gst_quarktv_base_init), + (gst_quarktv_class_init), (gst_quarktv_init), + (gst_quarktv_get_type): + * gst/effectv/gstrev.c: (gst_revtv_set_caps), + (gst_revtv_get_unit_size), (gst_revtv_transform), + (gst_revtv_base_init), (gst_revtv_class_init), (gst_revtv_init), + (gst_revtv_get_type): + * gst/effectv/gstshagadelic.c: (gst_shagadelictv_set_caps), + (gst_shagadelictv_get_unit_size), (gst_shagadelictv_transform), + (gst_shagadelictv_base_init), (gst_shagadelictv_class_init), + (gst_shagadelictv_init), (gst_shagadelictv_get_type): + * gst/effectv/gstvertigo.c: (gst_vertigotv_set_caps), + (gst_vertigotv_get_unit_size), (gst_vertigotv_transform), + (gst_vertigotv_base_init), (gst_vertigotv_class_init), + (gst_vertigotv_init), (gst_vertigotv_get_type): + * gst/effectv/gstwarp.c: (gst_warptv_set_caps), + (gst_warptv_get_unit_size), (gst_warptv_transform), + (gst_warptv_base_init), (gst_warptv_class_init), + (gst_warptv_init), + (gst_warptv_get_type): + * gst/videofilter/Makefile.am: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideobalance.h: + * gst/videofilter/gstvideofilter.c: (gst_videofilter_get_type), + (gst_videofilter_class_init), (gst_videofilter_init): + * gst/videofilter/gstvideofilter.h: + * gst/videofilter/gstvideoflip.c: (gst_videoflip_set_caps), + (gst_videoflip_transform_caps), (gst_videoflip_get_unit_size), + (gst_videoflip_flip), (gst_videoflip_transform), + (gst_videoflip_handle_src_event), (gst_videoflip_set_property), + (gst_videoflip_base_init), (gst_videoflip_class_init), + (gst_videoflip_init), (plugin_init), (gst_videoflip_get_type): + * gst/videofilter/gstvideoflip.h: VideoFilter inherits from + BaseTransform, it's just a place holder for now and every video + effect plugin has been ported to use BaseTransform features + directly. QuarkTV was fixed too (was broken), navigationtest + works + and best for the end, videoflip converts navigation events + depending + on flip method ! Fixes #320953 + +2005-11-23 14:22:18 +0000 Jan Schmidt + + Fixes for API changes + Original commit message from CVS: + * ext/aalib/gstaasink.c: (gst_aasink_fixate): + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_collected): + * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_src_setcaps), + (gst_goom_src_negotiate), (gst_goom_chain): + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_video_pad_setcaps): + * sys/osxvideo/osxvideosink.m: + Fixes for API changes + +2005-11-23 12:19:06 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add cutter to spec in + Original commit message from CVS: + add cutter to spec in + +2005-11-23 11:57:51 +0000 Jan Schmidt + + gst/qtdemux/qtdemux.c: Convert to fractional framerates + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream), (qtdemux_dump_mvhd), + (qtdemux_parse_trak): + Convert to fractional framerates + +2005-11-22 23:58:14 +0000 Michael Smith + + ext/jpeg/: JPEG fractiony goodness. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_setcaps), + (gst_jpeg_dec_chain), (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_setcaps): + * ext/jpeg/gstjpegenc.h: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_setcaps), + (gst_smokeenc_resync): + * ext/jpeg/gstsmokeenc.h: + JPEG fractiony goodness. + +2005-11-22 22:35:57 +0000 Michael Smith + + * ChangeLog: + * gst/goom/filters.c: + * gst/goom/graphic.h: + Fix for #321430: unresolved symbols due to incorrect linkage on inline functions in goom. + Original commit message from CVS: + Fix for #321430: unresolved symbols due to incorrect linkage on inline functions + in goom. + Does not, however, fix the general crackheadedness of goom (global variables, + oh my!); this should be moved to -bad. + +2005-11-22 22:21:37 +0000 Jan Schmidt + + More fractional framerate conversions + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_init), + (gst_text_overlay_setcaps), (gst_text_overlay_collected): + * ext/cairo/gsttextoverlay.h: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link): + * ext/gdk_pixbuf/gstgdkpixbuf.h: + * ext/libpng/gstpngdec.c: (gst_pngdec_init), + (gst_pngdec_caps_create_and_set): + * ext/libpng/gstpngdec.h: + * ext/libpng/gstpngenc.c: (gst_pngenc_setcaps): + * gst/alpha/gstalphacolor.c: (gst_alpha_color_set_caps): + * gst/avi/gstavimux.c: (gst_avimux_init), + (gst_avimux_vidsinkconnect): + * gst/flx/gstflxdec.c: (gst_flxdec_chain): + * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_src_setcaps), + (gst_goom_src_negotiate), (gst_goom_chain): + * gst/goom/gstgoom.h: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_video_pad_setcaps): + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + More fractional framerate conversions + +2005-11-22 20:07:47 +0000 Jan Schmidt + + Convert to fractional framerates. + Original commit message from CVS: + * ext/aalib/gstaasink.c: (gst_aasink_fixate): + * gst/debug/gstnavigationtest.c: + (gst_navigationtest_handle_src_event): + * gst/videofilter/gstvideofilter.c: + (gst_videofilter_format_get_structure), (gst_videofilter_setcaps), + (gst_videofilter_init): + * gst/videofilter/gstvideofilter.h: + Convert to fractional framerates. + +2005-11-22 18:11:58 +0000 Thomas Vander Stichele + + * ChangeLog: + * ext/aalib/gstaasink.c: + * ext/dv/gstdvdec.c: + * ext/esd/esdmon.c: + * ext/flac/gstflacenc.c: + * ext/gdk_pixbuf/pixbufscale.c: + * ext/libcaca/gstcacasink.c: + * ext/shout2/gstshout2.c: + * gst/alpha/gstalpha.c: + * gst/oldcore/gstaggregator.c: + * gst/oldcore/gstshaper.c: + * gst/smpte/barboxwipes.c: + * gst/smpte/gstsmpte.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstvideoflip.c: + * gst/videomixer/videomixer.c: + fix up more enums + Original commit message from CVS: + fix up more enums + +2005-11-22 17:39:11 +0000 Michael Smith + + gst/videomixer/videomixer.c: Fractional framerates, videomixer. + Original commit message from CVS: + * gst/videomixer/videomixer.c: (gst_videomixer_pad_sink_setcaps), + (gst_videomixer_getcaps), (gst_videomixer_fill_queues), + (gst_videomixer_update_queues): + Fractional framerates, videomixer. + +2005-11-22 17:09:36 +0000 Michael Smith + + ext/dv/: Fractional framerates for DV. + Original commit message from CVS: + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_sink_setcaps): + * ext/dv/gstdvdec.h: + * ext/dv/gstdvdemux.c: (gst_dvdemux_init), + (gst_dvdemux_src_convert), (gst_dvdemux_sink_convert), + (gst_dvdemux_demux_video), (gst_dvdemux_demux_frame), + (gst_dvdemux_flush): + * ext/dv/gstdvdemux.h: + Fractional framerates for DV. + +2005-11-22 14:44:26 +0000 Tim-Philipp Müller + + gst/autodetect/: Use gst_plugin_feature_list_free() to free feature list and in the case of autovideosink free the li... + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_find_best), (gst_auto_audio_sink_detect): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_find_best), (gst_auto_video_sink_detect): + Use gst_plugin_feature_list_free() to free feature list and + in the case of autovideosink free the list at all. Also + miscellaneous cosmetic fixes. + +2005-11-22 13:13:21 +0000 Thomas Vander Stichele + + gst/cutter/gstcutter.c: copy calculation code from level; remove use of some audio functions + Original commit message from CVS: + * gst/cutter/gstcutter.c: (gst_cutter_chain), + (gst_cutter_set_property), (gst_cutter_get_caps): + copy calculation code from level; remove use of some audio + functions + +2005-11-22 13:11:25 +0000 Thomas Vander Stichele + + * gst/level/gstlevel.c: + various cosmetic fixes + Original commit message from CVS: + various cosmetic fixes + +2005-11-22 12:48:10 +0000 Thomas Vander Stichele + + * gst/level/gstlevel.c: + various cosmetic fixes + Original commit message from CVS: + various cosmetic fixes + +2005-11-22 12:41:35 +0000 Thomas Vander Stichele + + * gst/level/gstlevel.c: + various cosmetic fixes + Original commit message from CVS: + various cosmetic fixes + +2005-11-22 12:38:33 +0000 Andy Wingo + + * ChangeLog: + * ext/flac/gstflacenc.c: + * ext/flac/gstflactag.c: + * ext/shout2/gstshout2.c: + * ext/speex/gstspeexenc.c: + * gst/avi/gstavimux.c: + Update for gst_tag_setter API changes. + Original commit message from CVS: + 2005-11-22 Andy Wingo + * Update for gst_tag_setter API changes. + +2005-11-22 11:57:51 +0000 Andy Wingo + + * gst/qtdemux/qtdemux.c: + ext/faad/gstfaad.c (gst_faad_event) ext/ivorbis/vorbisfile.c (gst_ivorbisfile_loop) gst/qtdemux/qtdemux.c (gst_qtdemu... + Original commit message from CVS: + 2005-11-22 Andy Wingo + * ext/faad/gstfaad.c (gst_faad_event) + * ext/ivorbis/vorbisfile.c (gst_ivorbisfile_loop) + * gst/qtdemux/qtdemux.c (gst_qtdemux_loop_header) + * gst/speed/gstspeed.c (speed_sink_event) + * gst/tta/gstttaparse.c (gst_tta_parse_src_event) + (gst_tta_parse_parse_header): Run update-funcnames. + +2005-11-22 11:53:34 +0000 Andy Wingo + + * ChangeLog: + * ext/dv/gstdvdemux.c: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + * ext/gconf/gstgconfaudiosink.c: + * ext/gconf/gstgconfvideosink.c: + * ext/libpng/gstpngdec.c: + * ext/speex/gstspeexdec.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautovideosink.c: + * gst/avi/gstavidemux.c: + * gst/goom/gstgoom.c: + * gst/matroska/ebml-write.c: + * gst/matroska/matroska-demux.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: + ext/dv/gstdvdemux.c (gst_dvdemux_handle_sink_event) (gst_dvdemux_demux_frame) ext/flac/gstflacdec.c (gst_flacdec_writ... + Original commit message from CVS: + 2005-11-22 Andy Wingo + * ext/dv/gstdvdemux.c (gst_dvdemux_handle_sink_event) + (gst_dvdemux_demux_frame) + * ext/flac/gstflacdec.c (gst_flacdec_write) + * ext/flac/gstflacenc.c (gst_flacenc_seek_callback) + (gst_flacenc_sink_event) + * ext/gconf/gstgconfaudiosink.c (gst_gconf_audio_sink_init) + * ext/gconf/gstgconfvideosink.c (gst_gconf_video_sink_init) + * ext/libpng/gstpngdec.c (gst_pngdec_caps_create_and_set) + * ext/speex/gstspeexdec.c (speex_dec_event, speex_dec_chain) + * gst/auparse/gstauparse.c (gst_auparse_chain) + * gst/autodetect/gstautoaudiosink.c (gst_auto_audio_sink_init) + * gst/autodetect/gstautovideosink.c (gst_auto_video_sink_init) + * gst/avi/gstavidemux.c (gst_avi_demux_stream_header) + (gst_avi_demux_handle_seek) + * gst/goom/gstgoom.c (gst_goom_event) + * gst/matroska/ebml-write.c (gst_ebml_write_seek) + * gst/matroska/matroska-demux.c + (gst_matroska_demux_handle_seek_event) + (gst_matroska_demux_loop_stream_parse_id) + * gst/wavenc/gstwavenc.c (gst_wavenc_stop_file) + * gst/wavparse/gstwavparse.c (gst_wavparse_handle_seek) + (gst_wavparse_stream_headers): Run update-funcnames. + +2005-11-22 11:49:30 +0000 Edward Hervey + + URIHandler interface and element properties are now properly synchronized for DV1394src and UDPSrc + Original commit message from CVS: + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_class_init), + (gst_dv1394src_init), (gst_dv1394src_dispose), + (gst_dv1394src_set_property), (gst_dv1394src_discover_avc_node), + (gst_dv1394src_uri_set_uri): + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_update_uri), (gst_udpsrc_set_uri), + (gst_udpsrc_set_property), (gst_udpsrc_uri_get_uri): + URIHandler interface and element properties are now properly + synchronized for DV1394src and UDPSrc + +2005-11-22 11:36:04 +0000 Tim-Philipp Müller + + ext/: libgsttagedit has been renamed to libgsttag. + Original commit message from CVS: + * ext/flac/Makefile.am: + * ext/speex/Makefile.am: + libgsttagedit has been renamed to libgsttag. + +2005-11-21 20:11:59 +0000 Wim Taymans + + gst/rtsp/rtspconnection.c: Apply patch from Sebastien Cote to fix #319184. + Original commit message from CVS: + * gst/rtsp/rtspconnection.c: (read_body): + Apply patch from Sebastien Cote to fix #319184. + +2005-11-21 19:50:25 +0000 Thomas Vander Stichele + + port cutter + Original commit message from CVS: + * configure.ac: + * gst/cutter/Makefile.am: + * gst/cutter/gstcutter.c: (gst_cutter_class_init), + (gst_cutter_init), (gst_cutter_message_new), (gst_cutter_chain), + (gst_cutter_set_property), (gst_cutter_get_property), + (plugin_init), (gst_cutter_get_caps): + port cutter + * gst/level/gstlevel.c: + fix up plugin details + +2005-11-21 18:09:02 +0000 Tim-Philipp Müller + + Update for stream lock API changes: don't take stream log in sink event handlers any longer and change GST_STREAM_LOC... + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_sink_event): + * ext/flac/gstflacdec.c: (gst_flacdec_loop), + (gst_flacdec_src_event): + * ext/flac/gstflacenc.c: (gst_flacenc_sink_event): + * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_event), + (gst_signal_processor_getrange), (gst_signal_processor_chain): + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_seek): + * gst/flx/gstflxdec.c: (gst_flxdec_src_event_handler), + (gst_flxdec_sink_event_handler): + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_seek_event): + * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek): + Update for stream lock API changes: don't take stream log + in sink event handlers any longer and change GST_STREAM_LOCK + to GST_PAD_STREAM_LOCK. Don't leak references in flxdec event + functions. + +2005-11-21 17:52:15 +0000 Michael Smith + + * gst/auparse/Makefile.am: + * gst/auparse/gstauparse.h: + Forgot to commit header file changes, Makefile.am changes. Oops. + Original commit message from CVS: + Forgot to commit header file changes, Makefile.am changes. Oops. + +2005-11-21 17:49:21 +0000 Michael Smith + + * ChangeLog: + * gst/auparse/gstauparse.c: + gst_object_unref, not g_object_unref + Original commit message from CVS: + gst_object_unref, not g_object_unref + +2005-11-21 17:37:41 +0000 Wim Taymans + + Fix for stream lock updates. + Original commit message from CVS: + * ext/faac/gstfaac.c: (gst_faac_sink_event): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_event): + * gst/tta/gstttaparse.c: (gst_tta_parse_src_event): + Fix for stream lock updates. + +2005-11-21 17:23:46 +0000 Tim-Philipp Müller + + gst/wavparse/gstwavparse.c: Use GST_DEBUG_FUNCPTR; add debug message in pad activate function. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_create_sourcepad), (gst_wavparse_sink_activate): + Use GST_DEBUG_FUNCPTR; add debug message in pad activate function. + +2005-11-21 17:18:01 +0000 Michael Smith + + gst/auparse/: Partially fix #161712. playbin still doesn't work on these files, (on the bug report, Andy says we aren... + Original commit message from CVS: + * gst/auparse/Makefile.am: + * gst/auparse/gstauparse.c: (gst_auparse_class_init), + (gst_auparse_init), (gst_auparse_dispose), (gst_auparse_chain), + (gst_auparse_change_state): + * gst/auparse/gstauparse.h: + Partially fix #161712. playbin still doesn't work on these files, + (on the bug report, Andy says we aren't typefinding it for some + reason?) but at least auparse isn't totally busted like it was before. + +2005-11-21 16:45:46 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: j@bootlab.org, #321903). + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add DX50, DIVX and DIV3 fourccs (patch by + j@bootlab.org, #321903). + +2005-11-21 16:36:05 +0000 Andy Wingo + + *.*: Ran scripts/update-macros. Oh yes. + Original commit message from CVS: + 2005-11-21 Andy Wingo + * *.h: + * *.c: Ran scripts/update-macros. Oh yes. + +2005-11-21 15:06:35 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: Filler events are gone for now, comment out section generating them. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_sync_streams): + Filler events are gone for now, comment out section generating + them. + +2005-11-21 14:39:04 +0000 Tim-Philipp Müller + + Update for GST_FOURCC_FORMAT API change. + Original commit message from CVS: + * ext/directfb/dfbvideosink.c: + (gst_dfbvideosink_get_format_from_caps): + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_create): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse), (qtdemux_type_get), (qtdemux_node_dump_foreach), + (qtdemux_dump_hdlr), (qtdemux_dump_dref), (qtdemux_dump_stsd), + (qtdemux_dump_dcom), (qtdemux_parse_trak), (qtdemux_video_caps), + (qtdemux_audio_caps): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_capture_init), (gst_v4l2src_get_size_limits): + Update for GST_FOURCC_FORMAT API change. + +2005-11-21 14:33:11 +0000 Jan Schmidt + + Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027) + Original commit message from CVS: + * ext/audioresample/gstaudioresample.c: + * ext/polyp/polypsink.c: (gst_polypsink_sink_fixate): + * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_fixate): + * gst/modplug/gstmodplug.cc: + * sys/glsink/glimagesink.c: (gst_glimagesink_fixate): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_fixate): + Rename gst_caps_structure_fixate_* to gst_structure_fixate_* + (#322027) + +2005-11-21 14:31:05 +0000 Jan Schmidt + + Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027) + Original commit message from CVS: + * ext/aalib/gstaasink.c: (gst_aasink_fixate): + * ext/mikmod/gstmikmod.c: (gst_mikmod_srcfixate): + * gst/goom/gstgoom.c: (gst_goom_src_negotiate): + * sys/osxvideo/osxvideosink.m: + Rename gst_caps_structure_fixate_* to gst_structure_fixate_* + (#322027) + +2005-11-21 13:38:24 +0000 Tim-Philipp Müller + + Fixes for GST_FOURCC_FORMAT API change. + Original commit message from CVS: + * ext/aalib/gstaasink.c: (gst_aasink_setcaps): + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_file_header), + (gst_avi_demux_read_subindexes), (gst_avi_demux_parse_stream), + (gst_avi_demux_parse_odml), (gst_avi_demux_stream_index), + (gst_avi_demux_sync), (gst_avi_demux_stream_header), + (gst_avi_demux_stream_data): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): + * gst/wavenc/gstwavenc.c: (write_metadata): + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_adtl), + (gst_wavparse_parse_file_header), (gst_wavparse_stream_headers): + Fixes for GST_FOURCC_FORMAT API change. + +2005-11-21 12:13:48 +0000 Tim-Philipp Müller + + Fix for collect pads API change. Also fix textoverlay state change function. + Original commit message from CVS: + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_finalize), + (gst_text_overlay_init), (gst_text_overlay_text_pad_linked), + (gst_text_overlay_text_pad_unlinked), (gst_text_overlay_pop_video), + (gst_text_overlay_pop_text), (gst_text_overlay_collected), + (gst_text_overlay_change_state): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_init), + (gst_matroska_mux_reset), (gst_matroska_mux_request_new_pad), + (gst_matroska_mux_best_pad), (gst_matroska_mux_change_state): + * gst/smpte/gstsmpte.c: (gst_smpte_init), (gst_smpte_collected): + * gst/videomixer/videomixer.c: (gst_videomixer_init), + (gst_videomixer_request_new_pad), (gst_videomixer_fill_queues), + (gst_videomixer_change_state): + Fix for collect pads API change. Also fix textoverlay state + change function. + +2005-11-20 17:04:55 +0000 Julien Moutte + + gst/matroska/matroska-mux.c: Replace + Original commit message from CVS: + 2005-11-20 Julien MOUTTE + * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): Replace + GST_PAD_IS_USABLE by something approaching it. + +2005-11-20 16:43:32 +0000 Julien Moutte + + gst/matroska/matroska-mux.c: Fix for + Original commit message from CVS: + 2005-11-20 Julien MOUTTE + * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): Fix for + API changes. + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Fix for API + changes, + but also fix the code that was not checking return values from + pad_push neither using pad_alloc_buffer. + +2005-11-18 18:19:21 +0000 Edward Hervey + + ext/libpng/gstpngenc.c: Added debug category + Original commit message from CVS: + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), + (gst_pngenc_chain): + Added debug category + Return GST_FLOW_UNEXPECTED when sending an EOS, so the whole pipeline + goes to EOS. + +2005-11-17 18:23:23 +0000 Edgard Lima + + * ChangeLog: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpg711dec.c: + * gst/rtp/gstrtpg711depay.c: + * gst/rtp/gstrtpg711enc.c: + * gst/rtp/gstrtpg711enc.h: + * gst/rtp/gstrtpg711pay.c: + * gst/rtp/gstrtpg711pay.h: + * gst/rtp/gstrtpspeexdec.c: + * gst/rtp/gstrtpspeexdec.h: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexdepay.h: + * gst/rtp/gstrtpspeexenc.c: + * gst/rtp/gstrtpspeexenc.h: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpspeexpay.h: + Created Speex payloader and depayloader; Optimize G711 payloader to use adapter and send packets until MTU size. + Original commit message from CVS: + Created Speex payloader and depayloader; Optimize G711 payloader to use adapter and send packets until MTU size. + +2005-11-16 19:08:54 +0000 Wim Taymans + + check/elements/matroskamux.c: Fix leak in check. + Original commit message from CVS: + * check/elements/matroskamux.c: (setup_src_pad), (setup_sink_pad): + Fix leak in check. + +2005-11-16 17:00:32 +0000 Wim Taymans + + gst/flx/gstflxdec.c: Fix state change. + Original commit message from CVS: + * gst/flx/gstflxdec.c: (gst_flxdec_change_state): + Fix state change. + +2005-11-16 11:02:24 +0000 Andy Wingo + + * ChangeLog: + * gst/udp/gstudpsrc.c: + Move comment. + Original commit message from CVS: + (gst_udpsrc_create): Move comment. + +2005-11-16 10:43:44 +0000 Andy Wingo + + gst/udp/gstudpsrc.c: Clean up with the boilerplate macro. + Original commit message from CVS: + 2005-11-16 Andy Wingo + * gst/udp/gstudpsrc.c: Clean up with the boilerplate macro. + +2005-11-15 19:41:21 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: When seeking, seek to closest index entry at or before the requested seek position, no... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek): + When seeking, seek to closest index entry at or before the requested + seek position, not just the closest one (#321001). + +2005-11-15 12:16:00 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Invert DIB images again (see #132341). + Original commit message from CVS: + * gst/avi/gstavidemux.c: (swap_line), (gst_avi_demux_invert), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data): + Invert DIB images again (see #132341). + +2005-11-14 02:13:35 +0000 Thomas Vander Stichele + + * ChangeLog: + * common: + * configure.ac: + * ext/aalib/gstaasink.c: + * ext/cairo/gstcairo.c: + * ext/dv/gstdv.c: + * ext/esd/gstesd.c: + * ext/flac/gstflac.c: + * ext/gconf/gstgconfelements.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/jpeg/gstjpeg.c: + * ext/ladspa/gstladspa.c: + * ext/libcaca/gstcacasink.c: + * ext/libmng/gstmng.c: + * ext/libpng/gstpng.c: + * ext/mikmod/gstmikmod.c: + * ext/pango/gsttextoverlay.c: + * ext/pango/gsttimeoverlay.c: + * ext/raw1394/gst1394.c: + * ext/speex/gstspeex.c: + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: + * gst/alpha/gstalphacolor.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautodetect.c: + * gst/avi/gstavi.c: + * gst/cutter/gstcutter.c: + * gst/debug/efence.c: + * gst/debug/gstdebug.c: + * gst/debug/gstnavigationtest.c: + * gst/effectv/gsteffectv.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/law/alaw.c: + * gst/law/mulaw.c: + * gst/level/gstlevel.c: + * gst/matroska/matroska.c: + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: + * gst/multipart/multipart.c: + * gst/oldcore/gstelements.c: + * gst/rtp/Makefile.am: + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstrtp.c: + * gst/rtsp/gstrtsp.c: + * gst/smoothwave/gstsmoothwave.c: + * gst/smpte/gstsmpte.c: + * gst/udp/gstudp.c: + * gst/videobox/gstvideobox.c: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideoflip.c: + * gst/videofilter/gstvideotemplate.c: + * gst/videomixer/videomixer.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: + * sys/oss/gstossaudio.c: + * sys/osxaudio/gstosxaudio.c: + rework configure.ac; make asterisk rtp stuff compile on mingw + Original commit message from CVS: + rework configure.ac; make asterisk rtp stuff compile on mingw + +2005-11-12 13:31:56 +0000 Edward Hervey + + ext/jpeg/gstjpegdec.c: Only GST_DEBUG() information on the valid components. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): + Only GST_DEBUG() information on the valid components. + +2005-11-11 19:34:50 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to head + Original commit message from CVS: + back to head + +=== release 0.9.5 === + +2005-11-11 19:33:23 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + releasing 0.9.5 + Original commit message from CVS: + releasing 0.9.5 + +2005-11-11 18:33:21 +0000 Thomas Vander Stichele + + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + Update .po files + Original commit message from CVS: + Update .po files + +2005-11-11 16:48:58 +0000 Edward Hervey + + gst/avi/gstavidemux.*: Yeah, implement proper seeking. Exact seeking and segment seeking. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_event), + (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_loop): + * gst/avi/gstavidemux.h: + Yeah, implement proper seeking. Exact seeking and segment seeking. + Still need to do some checks for segment_stop. + +2005-11-11 15:17:44 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + fix Cairo entry + Original commit message from CVS: + fix Cairo entry + +2005-11-10 12:34:26 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Add support for custom genre tags. + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): + Add support for custom genre tags. + +2005-11-10 12:22:30 +0000 Tim-Philipp Müller + + gst/matroska/matroska-mux.c: Don't try to ready buffer duration from buffer that we don't own any longer and that mi... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * gst/matroska/matroska-mux.c: (gst_matroska_mux_write_data): + Don't try to ready buffer duration from buffer that we don't + own any longer and that might already have been unreffed. + (#321136) + +2005-11-09 21:35:29 +0000 Zeeshan Ali + + * ChangeLog: + * gst/flx/gstflxdec.c: + Attempting to optimize the code for embedded systems. + Original commit message from CVS: + Attempting to optimize the code for embedded systems. + +2005-11-08 08:54:30 +0000 Tim-Philipp Müller + + sys/oss/gstosssink.c: Don't re-use already closed file descriptor. (#320920) + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * sys/oss/gstosssink.c: (gst_oss_sink_close): + Don't re-use already closed file descriptor. (#320920) + +2005-11-07 17:35:20 +0000 Tim-Philipp Müller + + sys/oss/gstosssink.*: Cache probed caps; fix debug output for SET_PARAM macros. + Original commit message from CVS: + * sys/oss/gstosssink.c: (gst_oss_sink_dispose), + (gst_oss_sink_set_property), (gst_oss_sink_getcaps), + (gst_oss_sink_prepare): + * sys/oss/gstosssink.h: + Cache probed caps; fix debug output for SET_PARAM macros. + +2005-11-07 15:09:54 +0000 Tim-Philipp Müller + + ext/cairo/: Port cairo textoverlay plugin to 0.9. Add 'shaded-background' property and redo position. Doesn't handle ... + Original commit message from CVS: + * ext/cairo/Makefile.am: + * ext/cairo/gstcairo.c: (plugin_init): + * ext/cairo/gsttextoverlay.c: (gst_text_overlay_base_init), + (gst_text_overlay_class_init), (gst_text_overlay_finalize), + (gst_text_overlay_init), (gst_text_overlay_font_init), + (gst_text_overlay_set_property), (gst_text_overlay_render_text), + (gst_text_overlay_getcaps), (gst_text_overlay_setcaps), + (gst_text_overlay_text_pad_linked), + (gst_text_overlay_text_pad_unlinked), (gst_text_overlay_shade_y), + (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), + (gst_text_overlay_push_frame), (gst_text_overlay_pop_video), + (gst_text_overlay_pop_text), (gst_text_overlay_collected), + (gst_text_overlay_change_state): + * ext/cairo/gsttextoverlay.h: + Port cairo textoverlay plugin to 0.9. Add 'shaded-background' + property and redo position. Doesn't handle upstream renegotiation + yet though. + +2005-11-07 10:31:32 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: No need to take the STREAM_LOCK in the loop function. Improve some debug messages. Don't leak ... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_loop): + No need to take the STREAM_LOCK in the loop function. Improve + some debug messages. Don't leak pad names in debug messages. + +2005-11-07 10:27:00 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: Don't error out when the source pad isn't linked. + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_push_vorbis_codec_priv_data), + (gst_matroska_demux_add_wvpk_header): + Don't error out when the source pad isn't linked. + +2005-11-02 19:42:38 +0000 Tim-Philipp Müller + + ext/gconf/: Fix state change functions here as well and set kid to NULL state before removing it. + Original commit message from CVS: + * ext/gconf/gstgconfaudiosink.c: (do_toggle_element), + (gst_gconf_audio_sink_change_state): + * ext/gconf/gstgconfvideosink.c: (do_toggle_element), + (gst_gconf_video_sink_change_state): + Fix state change functions here as well and set kid + to NULL state before removing it. + +2005-11-02 16:48:55 +0000 Thomas Vander Stichele + + * check/elements/matroskamux.c: + * common: + * tests/check/elements/matroskamux.c: + sigh, static pad templates aren't refcounted properly + Original commit message from CVS: + sigh, static pad templates aren't refcounted properly + +2005-11-01 16:14:25 +0000 Thomas Vander Stichele + + * check/elements/.gitignore: + * gst/level/.gitignore: + * tests/check/elements/.gitignore: + ignore more + Original commit message from CVS: + ignore more + +2005-11-01 15:15:44 +0000 Edward Hervey + + gst/wavenc/gstwavenc.c: Added proper event handlind, made downstream newsegment event use GST_FORMAT_BYTES (otherwise... + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_stop_file), + (gst_wavenc_init), (gst_wavenc_event), (gst_wavenc_chain): + Added proper event handlind, + made downstream newsegment event use GST_FORMAT_BYTES (otherwise it's + ignored), + and don't set a duration of 0 for buffers otherwise they are discarded + by GstBaseSink. + GstWavEnc needs some serious loving, after going through the code I'm + really wondering how this can stay in -good ... + +2005-11-01 15:11:16 +0000 Thomas Vander Stichele + + Fix leaks and invalid memory access as reported by valgrind + Original commit message from CVS: + * check/elements/matroskamux.c: (setup_src_pad), (setup_sink_pad), + (setup_matroskamux), (check_buffer_data), (GST_START_TEST): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_finalize), + (gst_matroska_mux_reset), (gst_matroska_mux_audio_pad_setcaps), + (gst_matroska_mux_start), (gst_matroska_mux_write_data), + (gst_matroska_mux_collected): + Fix leaks and invalid memory access as reported by valgrind + +2005-11-01 14:41:01 +0000 Thomas Vander Stichele + + * check/elements/matroskamux.c: + * tests/check/elements/matroskamux.c: + ... and add the missing file + Original commit message from CVS: + ... and add the missing file + +2005-11-01 14:36:02 +0000 Michal Benes + + add a unit test for matroskamux fix the bugs that the unit test exposed + Original commit message from CVS: + Patch by: Michal Benes + * check/Makefile.am: + * gst/matroska/ebml-write.c: (gst_ebml_write_seek): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_handle_src_event), + (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_start): + add a unit test for matroskamux + fix the bugs that the unit test exposed + +2005-11-01 14:34:22 +0000 Thomas Vander Stichele + + * gst/rtp/Makefile.am: + fix Makefile.am + Original commit message from CVS: + fix Makefile.am + +2005-11-01 12:39:16 +0000 Tim-Philipp Müller + + gst/autodetect/: Fix state change function and use GST_DEBUG_FUNCPTR in class_init. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_class_init), + (gst_auto_audio_sink_change_state): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_class_init), + (gst_auto_video_sink_change_state): + Fix state change function and use GST_DEBUG_FUNCPTR in + class_init. + +2005-11-01 12:35:39 +0000 Tim-Philipp Müller + + gst/matroska/: Set timestamps on outgoing ebml headers as well, so that the element after matroskamux can get the tim... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * gst/matroska/ebml-write.c: (gst_ebml_write_new), + (gst_ebml_write_reset), (gst_ebml_write_element_new): + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_write_data): + Set timestamps on outgoing ebml headers as well, so that the + element after matroskamux can get the timestamp already when + reading the first ebml element and doesn't have to wait for + the actual data buffer for that (#320308). + +2005-10-31 22:08:52 +0000 Andy Wingo + + * ChangeLog: + * gst/videomixer/videomixer.c: + gst/videomixer/videomixer.c (gst_videomixer_pad_unlink) + Original commit message from CVS: + 2005-10-31 Andy Wingo + * gst/videomixer/videomixer.c (gst_videomixer_pad_unlink) + (gst_videomixer_pad_link): Kill some memleaks. + (gst_videomixer_pad_get_property): Style fix. + (gst_videomixer_pad_set_property): Style fix. + (gst_videomixer_pad_init): Style fix. + (gst_videomixer_update_queues): Kill memleak. + (gst_videomixer_loop): Kill memleak. + (gst_videomixer_collected): Kill memleak. + +2005-10-31 19:08:27 +0000 Edgard Lima + + * ChangeLog: + * gst/auparse/gstauparse.c: + Just some cleanup. + Original commit message from CVS: + Just some cleanup. + +2005-10-31 14:41:31 +0000 Edgard Lima + + * ChangeLog: + * ext/speex/gstspeexenc.c: + Add checks to GST_FLOW_NOT_LINKED for values returned from gst_pad_push. + Original commit message from CVS: + Add checks to GST_FLOW_NOT_LINKED for values returned from gst_pad_push. + +2005-10-31 12:00:10 +0000 Zeeshan Ali + + * ChangeLog: + * gst/rtp/gstrtpg711dec.c: + * gst/rtp/gstrtpg711depay.c: + Payloader now sets some default caps on the srcpad if caps on the sinkpad are never set. This is important for the g7... + Original commit message from CVS: + Payloader now sets some default caps on the srcpad if caps on the sinkpad are never set. This is important for the g711 to work with burger's rtpbin element. + +2005-10-28 19:19:40 +0000 Edgard Lima + + * ChangeLog: + * common: + * ext/speex/gstspeexenc.c: + Add checks for return values from gst_pad_push and gst_pad_alloc_buffer. + Original commit message from CVS: + Add checks for return values from gst_pad_push and gst_pad_alloc_buffer. + +2005-10-28 15:32:48 +0000 Tim-Philipp Müller + + gst/matroska/: Add SimpleBlock support to matroska demuxer and muxer (part of + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_info), + (gst_matroska_demux_parse_blockgroup_or_simpleblock), + (gst_matroska_demux_parse_cluster): + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init), + (gst_matroska_mux_init), (gst_matroska_mux_start), + (gst_matroska_mux_create_buffer_header), + (gst_matroska_mux_write_data), (gst_matroska_mux_set_property), + (gst_matroska_mux_get_property): + * gst/matroska/matroska-mux.h: + Add SimpleBlock support to matroska demuxer and muxer (part of + Matroska v2). (#319731) + +2005-10-28 13:24:40 +0000 Wim Taymans + + ext/jpeg/gstjpegdec.*: Cleanups. Don't create caps for every chain. + Original commit message from CVS: + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_chain), + (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Cleanups. Don't create caps for every chain. + +2005-10-27 18:46:32 +0000 Flavio Oliveira + + * ChangeLog: + * gst/law/alaw-encode.c: + * gst/law/alaw-encode.h: + * gst/law/mulaw-encode.c: + * gst/law/mulaw-encode.h: + Fix to set timestamp on buffer, it was tested with RTP G711 elements. + Original commit message from CVS: + Fix to set timestamp on buffer, it was tested with RTP G711 elements. + +2005-10-27 11:27:53 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.h: Remove got_redirect from class structure as well. + Original commit message from CVS: + * gst/qtdemux/qtdemux.h: + Remove got_redirect from class structure as well. + +2005-10-27 11:25:19 +0000 Tim-Philipp Müller + + gst/qtdemux/qtdemux.c: Remove 'got-redirect' signal and post element message on the bus instead. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), + (qtdemux_parse_tree): + Remove 'got-redirect' signal and post element message + on the bus instead. + +2005-10-27 11:00:40 +0000 Wim Taymans + + sys/oss/gstosssrc.c: Set correct format on oss instead of a silly value. + Original commit message from CVS: + * sys/oss/gstosssrc.c: (gst_oss_src_prepare): + Set correct format on oss instead of a silly value. + +2005-10-27 09:52:08 +0000 Julien Moutte + + gst/videobox/gstvideobox.c: Use liboil for + Original commit message from CVS: + 2005-10-27 Julien MOUTTE + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_transform_caps), (gst_video_box_set_caps), + (gst_video_box_get_unit_size), (gst_video_box_copy_plane_i420), + (gst_video_box_i420), (gst_video_box_ayuv): Use liboil for + I420 rendering as well, doesn't bring much for my platform. + Might help on some other platforms. + +2005-10-26 21:47:36 +0000 Zeeshan Ali + + * ChangeLog: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtpgsmpay.c: + Declaring the padtemplate correctly. + Original commit message from CVS: + Declaring the padtemplate correctly. + +2005-10-26 20:28:32 +0000 Zeeshan Ali + + * ChangeLog: + * gst/rtp/gstrtpg711dec.c: + * gst/rtp/gstrtpg711depay.c: + * gst/rtp/gstrtpg711enc.c: + * gst/rtp/gstrtpg711pay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtpgsmpay.c: + Setting the proper copyright notice. + Original commit message from CVS: + Setting the proper copyright notice. + +2005-10-26 17:23:06 +0000 Julien Moutte + + gst/videobox/Makefile.am: Use liboil. + Original commit message from CVS: + 2005-10-26 Julien MOUTTE + * gst/videobox/Makefile.am: Use liboil. + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_set_property), (gst_video_box_transform_caps), + (gst_video_box_set_caps), (gst_video_box_get_unit_size), + (gst_video_box_ayuv): Lot of optimization in AYUV rendering + using liboil. Will dot the same to I420 border generation + tomorrow. + +2005-10-26 16:36:01 +0000 Thomas Vander Stichele + + * gst/rtp/Makefile.am: + fix automake warnings + Original commit message from CVS: + fix automake warnings + +2005-10-26 14:50:59 +0000 Zeeshan Ali + + * ChangeLog: + * gst/rtp/gstrtpg711dec.c: + * gst/rtp/gstrtpg711dec.h: + * gst/rtp/gstrtpg711depay.c: + * gst/rtp/gstrtpg711depay.h: + * gst/rtp/gstrtpg711enc.c: + * gst/rtp/gstrtpg711pay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtpgsmparse.h: + * gst/rtp/gstrtpgsmpay.c: + Hacked the G711 (de)payloader to try to make things right. rtpg711dec now inherits from the basertpdepayloader. + Original commit message from CVS: + Hacked the G711 (de)payloader to try to make things right. rtpg711dec now inherits from the basertpdepayloader. + +2005-10-26 14:23:45 +0000 Julien Moutte + + gst/videobox/gstvideobox.c: Removing this forgotten debug. + Original commit message from CVS: + 2005-10-26 Julien MOUTTE + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_transform_caps), (gst_video_box_get_unit_size), + (gst_video_box_ayuv): Removing this forgotten debug. + +2005-10-26 14:08:49 +0000 Julien Moutte + + gst/videobox/gstvideobox.c: Fix the stride issue when boxing to AYUV. + Original commit message from CVS: + 2005-10-26 Julien MOUTTE + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_transform_caps), (gst_video_box_get_unit_size), + (gst_video_box_ayuv): Fix the stride issue when boxing to AYUV. + +2005-10-26 11:12:34 +0000 Tim-Philipp Müller + + sys/oss/: Actually use the 'oss' debug category we register. + Original commit message from CVS: + * sys/oss/gstossaudio.c: + * sys/oss/gstossdmabuffer.c: + * sys/oss/gstosshelper.c: + * sys/oss/gstossmixer.c: + * sys/oss/gstossmixerelement.c: + * sys/oss/gstossmixertrack.c: + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + Actually use the 'oss' debug category we register. + +2005-10-26 10:38:18 +0000 Julien Moutte + + gst/videomixer/videomixer.c: Use gst_pad_get_parent and drop the ref that was added through that call. + Original commit message from CVS: + 2005-10-26 Julien MOUTTE + * gst/videomixer/videomixer.c: + (gst_videomixer_pad_set_property), + (gst_videomixer_pad_sink_setcaps), (gst_videomixer_getcaps): + Use gst_pad_get_parent and drop the ref that was added through + that call. + +2005-10-26 10:03:02 +0000 Thomas Vander Stichele + + * ChangeLog: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmpay.c: + fix compilation + Original commit message from CVS: + fix compilation + +2005-10-25 21:09:36 +0000 Flavio Oliveira + + * ChangeLog: + * gst/rtp/gstrtpg711dec.c: + * gst/rtp/gstrtpg711depay.c: + Just removed a couple of lines of weird code used during development/test time. + Original commit message from CVS: + Just removed a couple of lines of weird code used during development/test time. + +2005-10-25 19:19:38 +0000 Flavio Oliveira + + * ChangeLog: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpg711dec.c: + * gst/rtp/gstrtpg711dec.h: + * gst/rtp/gstrtpg711depay.c: + * gst/rtp/gstrtpg711depay.h: + * gst/rtp/gstrtpg711enc.c: + * gst/rtp/gstrtpg711enc.h: + * gst/rtp/gstrtpg711pay.c: + * gst/rtp/gstrtpg711pay.h: + G711 payloader and depayloader created by Edgard Lima (it supports mulaw and alaw (dec)encoders) + Original commit message from CVS: + G711 payloader and depayloader created by Edgard Lima (it supports + mulaw and alaw (dec)encoders) + +2005-10-25 17:55:19 +0000 Julien Moutte + + gst/videobox/gstvideobox.c: Doh ! I introduced wingo's bug again ! Sorry... + Original commit message from CVS: + 2005-10-25 Julien MOUTTE + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_transform_caps), (gst_video_box_get_unit_size): + Doh ! I introduced wingo's bug again ! Sorry... + +2005-10-25 16:02:38 +0000 Christian Schaller + + * ChangeLog: + * gst/rtp/Makefile.am: + add missing header files for disting + Original commit message from CVS: + add missing header files for disting + +2005-10-25 15:07:02 +0000 Zeeshan Ali + + * ChangeLog: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmenc.h: + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtpgsmparse.h: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtpgsmpay.h: + Getting the GSM (de)payloader working and compatible with our plans for RTP. + Original commit message from CVS: + Getting the GSM (de)payloader working and compatible with our plans for RTP. + +2005-10-25 13:03:04 +0000 Christian Schaller + + * gst/rtp/gstrtp.c: + fix mistaken claim on GPL, its LGPL + Original commit message from CVS: + fix mistaken claim on GPL, its LGPL + +2005-10-25 10:47:09 +0000 Julien Moutte + + ext/libpng/gstpngdec.c: Push a newsegment event, move some redundant code in a single place. + Original commit message from CVS: + 2005-10-25 Julien MOUTTE + * ext/libpng/gstpngdec.c: (user_info_callback), + (gst_pngdec_caps_create_and_set), (gst_pngdec_task): Push + a newsegment event, move some redundant code in a single place. + +2005-10-25 10:23:26 +0000 Julien Moutte + + ext/libpng/gstpngdec.c: Temporary hack to get correct colors order when we have a png image with alpha channel. + Original commit message from CVS: + 2005-10-25 Julien MOUTTE + * ext/libpng/gstpngdec.c: (user_info_callback), + (gst_pngdec_caps_create_and_set), (gst_pngdec_task): Temporary + hack to get correct colors order when we have a png image with + alpha channel. + +2005-10-24 17:29:02 +0000 Edward Hervey + + ext/dv/gstdvdemux.c: Call gst_element_no_more_pads when there will be no more pads. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_add_pads): + Call gst_element_no_more_pads when there will be no more pads. + +2005-10-24 16:39:38 +0000 Wim Taymans + + gst/rtp/: Added two new payloaders, an RFC 2190 payloader for h263 and a payload convertor for an asterisk server. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_get_type), + (gst_asteriskh263_base_init), (gst_asteriskh263_class_init), + (gst_asteriskh263_init), (gst_asteriskh263_finalize), + (gst_asteriskh263_chain), (gst_asteriskh263_set_property), + (gst_asteriskh263_get_property), (gst_asteriskh263_change_state), + (gst_asteriskh263_plugin_init): + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtph263enc.c: (gst_rtph263enc_get_type), + (gst_rtph263enc_base_init), (gst_rtph263enc_class_init), + (gst_rtph263enc_init), (gst_rtph263enc_finalize), + (gst_rtph263enc_setcaps), (gst_rtph263enc_gobfiner), + (gst_rtph263enc_flush), (gst_rtph263enc_handle_buffer), + (gst_rtph263enc_plugin_init): + * gst/rtp/gstrtph263enc.h: + Added two new payloaders, an RFC 2190 payloader for h263 and + a payload convertor for an asterisk server. + +2005-10-24 15:57:17 +0000 Tim-Philipp Müller + + sys/oss/gstosssrc.c: Set bytes_per_sample correctly (is not always 4, but depends on width and number of channels). + Original commit message from CVS: + * sys/oss/gstosssrc.c: (gst_oss_src_prepare): + Set bytes_per_sample correctly (is not always 4, but + depends on width and number of channels). + +2005-10-24 15:50:06 +0000 Tim-Philipp Müller + + ext/flac/gstflacenc.*: Fix seeking, so that flacenc can rewrite the header with the correct duration and amount of sa... + Original commit message from CVS: + * ext/flac/gstflacenc.c: (gst_flacenc_base_init), + (gst_flacenc_init), (gst_flacenc_sink_setcaps), + (gst_flacenc_seek_callback), (gst_flacenc_write_callback), + (gst_flacenc_sink_event), (gst_flacenc_chain), + (gst_flacenc_set_property), (gst_flacenc_get_property), + (gst_flacenc_change_state): + * ext/flac/gstflacenc.h: + Fix seeking, so that flacenc can rewrite the header with the + correct duration and amount of samples and all that at EOS; + also set timestamps and granulepos on outgoing buffers; add + debug category; fix state change function. + +2005-10-24 13:46:09 +0000 Julien Moutte + + gst/videomixer/videomixer.c: Don't restrict video geometry from 16 to 4096. + Original commit message from CVS: + 2005-10-24 Julien MOUTTE + * gst/videomixer/videomixer.c: Don't restrict video geometry + from 16 to 4096. + +2005-10-24 13:22:14 +0000 Julien Moutte + + gst/videobox/gstvideobox.c: Fix caps negotiation correctly, add debugging category. + Original commit message from CVS: + 2005-10-24 Julien MOUTTE + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_transform_caps), (gst_video_box_get_unit_size): + Fix caps negotiation correctly, add debugging category. + +2005-10-24 13:02:47 +0000 Christian Schaller + + * ChangeLog: + * configure.ac: + port over plugin listing from base + Original commit message from CVS: + port over plugin listing from base + +2005-10-24 08:59:24 +0000 Julien Moutte + + ext/libpng/gstpngdec.c: Don't use fixed caps on a sink pad. + Original commit message from CVS: + 2005-10-24 Julien MOUTTE + * ext/libpng/gstpngdec.c: (gst_pngdec_init): Don't use fixed + caps on + a sink pad. + +2005-10-23 23:05:59 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + * docs/upload.mak: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.9.4 === + +2005-10-23 22:43:08 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/Makefile.am: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.signals: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-alphacolor.xml: + * docs/plugins/inspect/plugin-auparse.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-cairo.xml: + * docs/plugins/inspect/plugin-debug.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-efence.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-flxdec.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-matroska.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-navigationtest.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-videomixer.xml: + * docs/plugins/inspect/plugin-wavenc.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + releasing 0.9.4 + Original commit message from CVS: + releasing 0.9.4 + +2005-10-23 11:07:10 +0000 Thomas Vander Stichele + + * ext/libpng/gstpngdec.c: + * gst/wavparse/gstwavparse.c: + * po/POTFILES.in: + STOPPED->FAILED + Original commit message from CVS: + STOPPED->FAILED + +2005-10-21 17:00:58 +0000 Tim-Philipp Müller + + ext/speex/gstspeexenc.c: Add position and duration query, fix query type function. + Original commit message from CVS: + * ext/speex/gstspeexenc.c: (gst_speexenc_get_query_types), + (gst_speexenc_src_query): + Add position and duration query, fix query type function. + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps): + Let's not set non-fixed caps on source pads. + +2005-10-21 16:15:57 +0000 Wim Taymans + + Set correct stream_time in newsegment event. avi can also handle a duration query now. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_demux_frame): + * gst/avi/gstavidemux.c: (gst_avi_demux_get_src_query_types), + (gst_avi_demux_handle_seek): + Set correct stream_time in newsegment event. + avi can also handle a duration query now. + +2005-10-21 10:06:40 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + update for latest additions + Original commit message from CVS: + update for latest additions + +2005-10-20 19:14:27 +0000 Tim-Philipp Müller + + gst/matroska/matroska-demux.c: Fix duration query; fix basetime in newsegment event after seek; fix duration in initi... + Original commit message from CVS: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_src_query), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_loop_stream_parse_id): + Fix duration query; fix basetime in newsegment event after + seek; fix duration in initial newsegment event. + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_start): + Extract number of channels and samplerate from vorbis headers; + add some debug messages when querying the durations of the + input streams. + +2005-10-20 11:50:53 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Set stream time correctly in newsegment. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_pad_convert), (gst_wavparse_srcpad_event): + Set stream time correctly in newsegment. + +2005-10-20 11:39:40 +0000 Wim Taymans + + gst/avi/gstavidemux.c: Correctly fill in the stream time. + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_seek): + Correctly fill in the stream time. + +2005-10-19 20:48:24 +0000 Thomas Vander Stichele + + * ChangeLog: + * check/elements/level.c: + * gst/level/gstlevel.c: + * gst/level/level-example.c: + * tests/check/elements/level.c: + use ELEMENT messages instead + Original commit message from CVS: + use ELEMENT messages instead + +2005-10-19 15:58:00 +0000 Wim Taymans + + gst/: API change fix. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_query_types), + (gst_qtdemux_handle_src_query): + * gst/speed/gstspeed.c: (speed_get_query_types), (speed_src_query): + * gst/tta/gstttaparse.c: (gst_tta_parse_src_event), + (gst_tta_parse_get_query_types), (gst_tta_parse_query): + API change fix. + +2005-10-19 15:57:04 +0000 Wim Taymans + + API change fix. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_get_src_query_types), + (gst_dvdemux_src_query): + * ext/flac/gstflacdec.c: (gst_flacdec_length), + (gst_flacdec_src_query): + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_query): + * ext/speex/gstspeexdec.c: (speex_dec_src_query): + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): + * gst/debug/gstnavseek.c: (gst_navseek_seek): + * gst/debug/progressreport.c: (gst_progress_report_report): + * gst/matroska/ebml-read.c: (gst_ebml_read_get_length): + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_src_query): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): + * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query), + (gst_wavparse_srcpad_event): + API change fix. + +2005-10-19 10:57:46 +0000 Tim-Philipp Müller + + gst/goom/: Make inline functions either 'static inline' or 'extern inline', otherwise the Forte compiler apparently w... + Original commit message from CVS: + * gst/goom/filters.c: + * gst/goom/graphic.h: + * gst/goom/lines.c: + Make inline functions either 'static inline' or 'extern inline', + otherwise the Forte compiler apparently won't inline them (#317300). + +2005-10-18 22:50:11 +0000 Julien Moutte + + ext/libpng/gstpngdec.c: forgot the buffer unref in pull. + Original commit message from CVS: + 2005-10-19 Julien MOUTTE + * ext/libpng/gstpngdec.c: forgot the buffer unref in pull. + +2005-10-18 22:44:11 +0000 Julien Moutte + + ext/libpng/gstpngdec.*: Complete rewrite of pngdec. It's now very nice and handle push/pull based model. if you have ... + Original commit message from CVS: + 2005-10-19 Julien MOUTTE + * ext/libpng/gstpngdec.c: (gst_pngdec_class_init), + (gst_pngdec_init), (user_error_fn), (user_warning_fn), + (user_info_callback), (user_endrow_callback), + (user_end_callback), + (user_read_data), (gst_pngdec_caps_create_and_set), + (gst_pngdec_task), (gst_pngdec_chain), (gst_pngdec_sink_event), + (gst_pngdec_libpng_clear), (gst_pngdec_libpng_init), + (gst_pngdec_change_state), (gst_pngdec_sink_activate_push), + (gst_pngdec_sink_activate_pull), (gst_pngdec_sink_activate): + * ext/libpng/gstpngdec.h: Complete rewrite of pngdec. It's now + very nice and handle push/pull based model. if you have filesrc + connected to it, it will do random access to load the png file. + If you have a network source that can't do _getrange, it does + progressive loading through the chain function. + * gst/alpha/gstalphacolor.c: (gst_alpha_color_transform_caps), + (transform_rgb), (transform_bgr): Fix caps negotiation correctly + thanks to Master Wim Taymans ;-) + +2005-10-18 18:12:31 +0000 Tim-Philipp Müller + + gst/matroska/: Ported matroska demuxer to 0.9. + Original commit message from CVS: + * gst/matroska/Makefile.am: + * gst/matroska/ebml-read.c: + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-demux.h: + * gst/matroska/matroska.c: (plugin_init): + Ported matroska demuxer to 0.9. + +2005-10-18 18:06:14 +0000 Tim-Philipp Müller + + gst/matroska/matroska-mux.c: Fix mpeg4 input handling (#318847); also, while we're at it, fix media type for Motion-J... + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * gst/matroska/matroska-mux.c: + (gst_matroska_mux_video_pad_setcaps), + (gst_matroska_mux_audio_pad_setcaps): + Fix mpeg4 input handling (#318847); also, while we're at it, + fix media type for Motion-JPEG: should be image/jpeg. + +2005-10-18 13:21:18 +0000 Wim Taymans + + gst/wavparse/gstwavparse.c: Fix for segment-start/stop API change. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_pad_convert), (gst_wavparse_srcpad_event): + Fix for segment-start/stop API change. + +2005-10-17 17:18:56 +0000 Julien Moutte + + gst/alpha/gstalphacolor.c: Handle caps negotiation in a better way. + Original commit message from CVS: + 2005-10-17 Julien MOUTTE + * gst/alpha/gstalphacolor.c: (gst_alpha_color_transform_caps), + (transform_rgb), (transform_bgr): Handle caps negotiation in a + better + way. + +2005-10-17 16:59:20 +0000 Julien Moutte + + gst/videobox/gstvideobox.c: Fix caps nego some more to get + Original commit message from CVS: + 2005-10-17 Julien MOUTTE + * gst/videobox/gstvideobox.c: (gst_video_box_transform_caps), + (gst_video_box_get_unit_size): Fix caps nego some more to get + AYUV + output declared in transform_caps. + +2005-10-17 15:23:24 +0000 Julien Moutte + + ext/libpng/gstpngdec.c: We use fixed caps. + Original commit message from CVS: + 2005-10-17 Julien MOUTTE + * ext/libpng/gstpngdec.c: (gst_pngdec_init): We use fixed caps. + +2005-10-17 15:14:29 +0000 Julien Moutte + + gst/videobox/gstvideobox.c: Fix wrong size calculations and implement get_unit_size correctly. + Original commit message from CVS: + 2005-10-17 Julien MOUTTE + * gst/videobox/gstvideobox.c: (gst_video_box_transform_caps), + (gst_video_box_get_unit_size): Fix wrong size calculations and + implement get_unit_size correctly. + +2005-10-17 14:56:12 +0000 Tim-Philipp Müller + + configure.ac: Enable flx plugin. + Original commit message from CVS: + * configure.ac: + Enable flx plugin. + * gst/flx/gstflxdec.c: (flx_decode_chunks): + Fix gcc4 signedness issue. + +2005-10-17 08:46:30 +0000 Julien Moutte + + configure.ac: Adding videomixer. + Original commit message from CVS: + 2005-10-17 Julien MOUTTE + * configure.ac: Adding videomixer. + * ext/libpng/gstpngdec.c: (gst_pngdec_class_init), + (user_read_data), (gst_pngdec_chain): More debugging. + * gst/alpha/Makefile.am: Adding alphacolor + * gst/alpha/gstalphacolor.c: (gst_alpha_color_base_init), + (gst_alpha_color_class_init), (gst_alpha_color_init), + (gst_alpha_color_transform_caps), (gst_alpha_color_set_caps), + (transform_rgb), (transform_bgr), + (gst_alpha_color_transform_ip), + (plugin_init): Ported to 0.9 using in place base tranform. + * gst/videomixer/Makefile.am: + * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), + (gst_videomixer_pad_class_init), + (gst_videomixer_pad_sink_setcaps), + (gst_videomixer_pad_link), (gst_videomixer_pad_unlink), + (gst_videomixer_pad_init), (gst_videomixer_class_init), + (gst_videomixer_init), (gst_videomixer_getcaps), + (gst_videomixer_request_new_pad), (gst_videomixer_fill_queues), + (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), + (gst_videomixer_collected), (gst_videomixer_change_state): + Ported + to 0.9 using collectpads. + +2005-10-16 21:19:44 +0000 Zeeshan Ali + + * ChangeLog: + * common: + * configure.ac: + * gst/flx/Makefile.am: + * gst/flx/gstflxdec.c: + * gst/flx/gstflxdec.h: + flx plugin ported to 0.9 + Original commit message from CVS: + flx plugin ported to 0.9 + +2005-10-16 14:33:05 +0000 Thomas Vander Stichele + + * ChangeLog: + * ext/shout2/gstshout2.c: + use gst_version_string + Original commit message from CVS: + use gst_version_string + +2005-10-16 13:17:11 +0000 Andy Wingo + + configure.ac: GLIB_CHECK. + Original commit message from CVS: + 2005-10-16 Andy Wingo + * configure.ac: GLIB_CHECK. + +2005-10-15 16:48:55 +0000 Julien Moutte + + ext/libpng/: Ported pngdec to 0.9 + Original commit message from CVS: + 2005-10-15 Julien MOUTTE + * ext/libpng/Makefile.am: + * ext/libpng/gstpng.c: (plugin_init): + * ext/libpng/gstpngdec.c: (gst_pngdec_class_init), + (gst_pngdec_init), (user_read_data), (gst_pngdec_chain): + * ext/libpng/gstpngdec.h: Ported pngdec to 0.9 + +2005-10-14 12:43:30 +0000 Tim-Philipp Müller + + Port matroska muxer to 0.9 (#318847). + Original commit message from CVS: + Reviewed by: Tim-Philipp Müller + * configure.ac: + * gst/matroska/Makefile.am: + * gst/matroska/ebml-ids.h: + * gst/matroska/ebml-write.c: + * gst/matroska/ebml-write.h: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: + * gst/matroska/matroska-mux.h: + * gst/matroska/matroska.c: (plugin_init): + Port matroska muxer to 0.9 (#318847). + +2005-10-13 18:59:35 +0000 Tim-Philipp Müller + + ext/speex/gstspeexenc.c: Fix handling of GST_TAG_DATE, which is now of GST_TYPE_DATE; use GST_READ_UINT32_LE() and fr... + Original commit message from CVS: + * ext/speex/gstspeexenc.c: (gst_speexenc_get_tag_value), + (comment_init), (comment_add): + Fix handling of GST_TAG_DATE, which is now of GST_TYPE_DATE; + use GST_READ_UINT32_LE() and friends rather than the private + implementation of those same macros. + +2005-10-13 16:01:35 +0000 Thomas Vander Stichele + + * ext/cairo/Makefile.am: + fix dist + Original commit message from CVS: + fix dist + +2005-10-13 15:28:01 +0000 Stefan Kost + + examples/stats/mp2ogg.c: more typo fixes + Original commit message from CVS: + * examples/stats/mp2ogg.c: + more typo fixes + +2005-10-12 14:29:55 +0000 Stefan Kost + + renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition + Original commit message from CVS: + * examples/indexing/indexmpeg.c: (main): + * ext/artsd/gstartsdsink.c: (gst_artsdsink_open_audio), + (gst_artsdsink_close_audio), (gst_artsdsink_change_state): + * ext/artsd/gstartsdsink.h: + * ext/audiofile/gstafparse.c: (gst_afparse_open_file), + (gst_afparse_close_file): + * ext/audiofile/gstafparse.h: + * ext/audiofile/gstafsink.c: (gst_afsink_open_file), + (gst_afsink_close_file), (gst_afsink_chain), + (gst_afsink_change_state): + * ext/audiofile/gstafsink.h: + * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), + (gst_afsrc_close_file), (gst_afsrc_change_state): + * ext/audiofile/gstafsrc.h: + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_init): + * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_init): + * ext/dts/gstdtsdec.c: (gst_dtsdec_init): + * ext/jack/gstjack.h: + * ext/jack/gstjackbin.c: (gst_jack_bin_init), + (gst_jack_bin_change_state): + * ext/musepack/gstmusepackdec.c: (gst_musepackdec_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_init): + * ext/nas/nassink.c: (gst_nassink_open_audio), + (gst_nassink_close_audio), (gst_nassink_change_state): + * ext/nas/nassink.h: + * ext/polyp/polypsink.c: (gst_polypsink_init): + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_change_state): + * ext/sdl/sdlvideosink.h: + * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): + * ext/sndfile/gstsf.c: (gst_sf_set_property), + (gst_sf_change_state), (gst_sf_release_request_pad), + (gst_sf_open_file), (gst_sf_close_file), (gst_sf_loop): + * ext/sndfile/gstsf.h: + * ext/swfdec/gstswfdec.c: (gst_swfdec_init): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_init): + * gst/apetag/apedemux.c: (gst_ape_demux_init): + * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init): + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_init): + * gst/festival/gstfestival.c: (gst_festival_change_state): + * gst/festival/gstfestival.h: + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): + * gst/multifilesink/gstmultifilesink.c: (gst_multifilesink_init), + (gst_multifilesink_set_location), (gst_multifilesink_open_file), + (gst_multifilesink_close_file), (gst_multifilesink_next_file), + (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), + (gst_multifilesink_chain), (gst_multifilesink_change_state): + * gst/multifilesink/gstmultifilesink.h: + * gst/videodrop/gstvideodrop.c: (gst_videodrop_init): + * sys/cdrom/gstcdplayer.c: (cdplayer_init): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init), + (dxr3audiosink_open), (dxr3audiosink_close), + (dxr3audiosink_chain_pcm), (dxr3audiosink_chain_ac3), + (dxr3audiosink_change_state): + * sys/dxr3/dxr3audiosink.h: + * sys/dxr3/dxr3spusink.c: (dxr3spusink_init), (dxr3spusink_open), + (dxr3spusink_close), (dxr3spusink_chain), + (dxr3spusink_change_state): + * sys/dxr3/dxr3spusink.h: + * sys/dxr3/dxr3videosink.c: (dxr3videosink_init), + (dxr3videosink_open), (dxr3videosink_close), + (dxr3videosink_write_data), (dxr3videosink_change_state): + * sys/dxr3/dxr3videosink.h: + * sys/glsink/glimagesink.c: (gst_glimagesink_init): + * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), + (gst_qcamsrc_open), (gst_qcamsrc_close): + * sys/qcam/gstqcamsrc.h: + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): + * sys/vcd/vcdsrc.c: (gst_vcdsrc_set_property), (gst_vcdsrc_get), + (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), + (gst_vcdsrc_change_state), (gst_vcdsrc_recalculate): + * sys/vcd/vcdsrc.h: + renamed GST_FLAGS macros to GST_OBJECT_FLAGS + moved bitshift from macro to enum definition + +2005-10-12 14:29:43 +0000 Stefan Kost + + renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition + Original commit message from CVS: + * examples/indexing/indexmpeg.c: (main): + * ext/esd/esdmon.c: (gst_esdmon_open_audio), + (gst_esdmon_close_audio), (gst_esdmon_change_state): + * ext/esd/esdmon.h: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_init): + * ext/pango/gsttextoverlay.c: (gst_textoverlay_init): + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_init): + * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_init): + * gst/avi/gstavimux.c: (gst_avimux_init): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_init): + * gst/multipart/multipartdemux.c: (gst_multipart_demux_init): + * gst/multipart/multipartmux.c: (gst_multipart_mux_init): + * gst/oldcore/gstmultifilesrc.c: (gst_multifilesrc_init), + (gst_multifilesrc_get), (gst_multifilesrc_open_file), + (gst_multifilesrc_close_file), (gst_multifilesrc_change_state): + * gst/oldcore/gstmultifilesrc.h: + * gst/oldcore/gstpipefilter.c: (gst_pipefilter_init), + (gst_pipefilter_open_file), (gst_pipefilter_close_file), + (gst_pipefilter_change_state): + * gst/oldcore/gstpipefilter.h: + * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): + * gst/videomixer/videomixer.c: (gst_videomixer_init): + * sys/osxaudio/gstosxaudiosink.c: (gst_osxaudiosink_init): + * sys/osxaudio/gstosxaudiosink.h: + * sys/osxaudio/gstosxaudiosrc.h: + renamed GST_FLAGS macros to GST_OBJECT_FLAGS + moved bitshift from macro to enum definition + +2005-10-12 03:14:57 +0000 Thomas Vander Stichele + + * ext/Makefile.am: + dist cairo + Original commit message from CVS: + dist cairo + +2005-10-12 03:12:57 +0000 Thomas Vander Stichele + + ext/: update of cairo-based timeoverlay to 1.0 Cairo API doesn't work yet for resizing of output sink + Original commit message from CVS: + * ext/Makefile.am: + * ext/cairo/Makefile.am: + * ext/cairo/gstcairo.c: (plugin_init): + * ext/cairo/gsttextoverlay.c: (gst_textoverlay_change_state): + * ext/cairo/gsttimeoverlay.c: (gst_timeoverlay_update_font_height), + (gst_timeoverlay_setup), (gst_timeoverlay_planar411): + * ext/cairo/gsttimeoverlay.h: + update of cairo-based timeoverlay to 1.0 Cairo API + doesn't work yet for resizing of output sink + +2005-10-12 03:07:26 +0000 Thomas Vander Stichele + + * configure.ac: + don't build checks if we don't have check + Original commit message from CVS: + don't build checks if we don't have check + +2005-10-12 03:03:27 +0000 Thomas Vander Stichele + + * Makefile.am: + * common: + don't build checks if we don't have gstcheck + Original commit message from CVS: + don't build checks if we don't have gstcheck + +2005-10-11 17:38:29 +0000 Wim Taymans + + ext/speex/gstspeexdec.c: newsegment API fix. + Original commit message from CVS: + * ext/speex/gstspeexdec.c: (speex_dec_event), (speex_dec_chain): + newsegment API fix. + +2005-10-11 16:34:36 +0000 Wim Taymans + + gst/: newsegment API update. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): + * gst/tta/gstttaparse.c: (gst_tta_parse_src_event), + (gst_tta_parse_parse_header): + newsegment API update. + +2005-10-11 16:33:08 +0000 Wim Taymans + + newsegment API update. + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_sink_event), + (gst_dvdemux_demux_frame): + * ext/flac/gstflacdec.c: (gst_flacdec_write): + * gst/auparse/gstauparse.c: (gst_auparse_chain): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header), + (gst_avi_demux_handle_seek): + * gst/goom/gstgoom.c: (gst_goom_event): + * gst/wavenc/gstwavenc.c: (gst_wavenc_stop_file): + * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_loop), (gst_wavparse_pad_convert), + (gst_wavparse_srcpad_event): + newsegment API update. + +2005-10-11 10:07:35 +0000 Andy Wingo + + ext/speex/gstspeexenc.c: Signedness cleanups. + Original commit message from CVS: + 2005-10-11 Andy Wingo + * ext/speex/gstspeexenc.c: Signedness cleanups. + +2005-10-10 19:57:40 +0000 Edgard Lima + + * ChangeLog: + * PORTED_09: + * ext/speex/Makefile.am: + * ext/speex/gstspeex.c: + * ext/speex/gstspeexenc.c: + Speexenc ported to 0.9. + Original commit message from CVS: + Speexenc ported to 0.9. + +2005-10-10 14:16:21 +0000 Wim Taymans + + sys/oss/: Cleanups, make device configurable in the sink, handle and report errors. + Original commit message from CVS: + * sys/oss/gstosssink.c: (gst_oss_sink_class_init), + (gst_oss_sink_init), (gst_oss_sink_set_property), + (gst_oss_sink_get_property), (gst_oss_sink_open), + (gst_oss_sink_prepare), (gst_oss_sink_reset): + * sys/oss/gstosssink.h: + * sys/oss/gstosssrc.c: (gst_oss_src_class_init), + (gst_oss_src_set_property), (gst_oss_src_init), (gst_oss_src_open), + (gst_oss_src_prepare): + Cleanups, make device configurable in the sink, handle and report + errors. + +2005-10-10 12:31:07 +0000 Wim Taymans + + ext/gconf/: Make sure element is NULL before removing from the bin. + Original commit message from CVS: + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset): + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset): + Make sure element is NULL before removing from the bin. + +2005-10-07 16:28:24 +0000 Andy Wingo + + * ChangeLog: + * ext/raw1394/gstdv1394src.c: + Don't unref the message. + Original commit message from CVS: + (gst_dv1394src_bus_reset): Don't unref the message. + +2005-10-07 16:22:59 +0000 Andy Wingo + + * ChangeLog: + * ext/raw1394/gstdv1394src.c: + Post a message when the cable is unplugged. + Original commit message from CVS: + (gst_dv1394src_bus_reset): Post a message when the cable is + unplugged. + (gst_dv1394src_create, gst_dv1394src_unlock): Remove some prints. + +2005-10-07 15:24:24 +0000 Andy Wingo + + ext/raw1394/gstdv1394src.c: Make interruptible, so it won't block forever in a read(). + Original commit message from CVS: + 2005-10-07 Andy Wingo + * ext/raw1394/gstdv1394src.c: Make interruptible, so it won't + block forever in a read(). + +2005-10-07 13:17:53 +0000 Andy Wingo + + ext/raw1394/gstdv1394src.c: Clean up for style before doing some hacking. The only change should be that the state ch... + Original commit message from CVS: + 2005-10-07 Andy Wingo + * ext/raw1394/gstdv1394src.c: Clean up for style before doing some + hacking. The only change should be that the state change stuff was + put into basesrc's start() and stop() routines, which coalesces + some steps. + +2005-10-07 11:30:41 +0000 Tim-Philipp Müller + + configure.ac: Add check for mmap + Original commit message from CVS: + * configure.ac: + Add check for mmap + * gst/debug/Makefile.am: + Only compile efence plugin on systems that have mmap. + +2005-10-05 16:36:57 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add latest files + Original commit message from CVS: + add latest files + +2005-10-05 11:38:29 +0000 Tim-Philipp Müller + + gst/debug/: Port progressreport, navseek, navigationtest, testsink and breakmydata. + Original commit message from CVS: + * gst/debug/Makefile.am: + * gst/debug/breakmydata.c: + * gst/debug/gstdebug.c: + * gst/debug/gstnavigationtest.c: + * gst/debug/gstnavseek.c: + * gst/debug/gstnavseek.h: + * gst/debug/progressreport.c: + * gst/debug/testplugin.c: + Port progressreport, navseek, navigationtest, testsink and + breakmydata. + +2005-10-05 11:15:23 +0000 Edward Hervey + + ext/dv/gstdvdemux.c: Fixes for better conversion + Original commit message from CVS: + * ext/dv/gstdvdemux.c: (gst_dvdemux_src_convert), + (gst_dvdemux_src_query): + Fixes for better conversion + +2005-10-04 17:58:40 +0000 Michael Smith + + gst/autodetect/: Set state of elements to NULL before removing from bins. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_reset), + (gst_auto_audio_sink_find_best), (gst_auto_audio_sink_detect): + * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), + (gst_auto_video_sink_find_best), (gst_auto_video_sink_detect): + Set state of elements to NULL before removing from bins. + Set state of test element to NULL if we failed to move it to READY + +2005-10-04 17:44:43 +0000 Edward Hervey + + ext/dv/: Added DEFAULT <==> BYTES, TIME conversions on srcpad, + Original commit message from CVS: + * ext/dv/Makefile.am: + * ext/dv/gstdvdemux.c: (gst_dvdemux_src_query), (gst_dvdemux_src_conver): + Added DEFAULT <==> BYTES, TIME conversions on srcpad, + Corrected the query function for position so it doesn't forget what + format was asked, and calls the conversion functions on the correct pad. + +2005-10-03 17:59:18 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + back to head + Original commit message from CVS: + back to head + +=== release 0.9.3 === + +2005-10-03 17:48:57 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * README: + * configure.ac: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + release time + Original commit message from CVS: + release time + +2005-10-02 23:08:35 +0000 Andy Wingo + + ext/flac/gstflacdec.c (gst_flacdec_write): Deal with pad_alloc error returns. + Original commit message from CVS: + 2005-10-03 Andy Wingo + * ext/flac/gstflacdec.c (gst_flacdec_write): Deal with pad_alloc + error returns. + +2005-10-02 15:33:14 +0000 Andy Wingo + + configure.ac (GST_PLUGIN_LDFLAGS): Change to be like -base. + Original commit message from CVS: + 2005-10-02 Andy Wingo + * configure.ac (GST_PLUGIN_LDFLAGS): Change to be like -base. + * ext/flac/gstflacenc.c: Ported to 0.9. + * ext/flac/gstflacdec.c (gst_flacdec_loop): Handle errors better. + * ext/flac/Makefile.am: Add the GST_PLUGINS_BASE cflags and libs, + and link to gsttagedit. Enable flacenc. + * ext/flac/gstflacdec.c: Re-enable tag reading. + +2005-09-30 16:36:49 +0000 Wim Taymans + + gst/rtp/: Various class and caps fixes from Andre Magalhaes (andrunko) + Original commit message from CVS: + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_setcaps): + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtph263penc.c: + * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_class_init), + (gst_rtpmp4venc_parse_data), (gst_rtpmp4venc_handle_buffer), + (gst_rtpmp4venc_set_property): + * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_handle_buffer): + Various class and caps fixes from Andre Magalhaes (andrunko) + +2005-09-29 13:08:41 +0000 Wim Taymans + + gst/level/level-example.c: Update for new bus API. + Original commit message from CVS: + * gst/level/level-example.c: (main): + Update for new bus API. + +2005-09-28 13:38:02 +0000 Wim Taymans + + gst/qtdemux/qtdemux.c: No need to take stream lock here. + Original commit message from CVS: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): + No need to take stream lock here. + +2005-09-28 09:45:00 +0000 Tim-Philipp Müller + + configure.ac: Fix unexpanded autoconf macro GST_DOC, which has been renamed to GST_DOCBOOK_CHECK (see common/m4/gst-d... + Original commit message from CVS: + * configure.ac: + Fix unexpanded autoconf macro GST_DOC, which has been renamed + to GST_DOCBOOK_CHECK (see common/m4/gst-doc.m4) (#316202). + +2005-09-27 15:12:45 +0000 Tim-Philipp Müller + + sys/oss/gstosssink.c: Fix playback of mono streams (bytes_per_sample should be set from the sample width and the numb... + Original commit message from CVS: + * sys/oss/gstosssink.c: (gst_oss_sink_prepare): + Fix playback of mono streams (bytes_per_sample should be set + from the sample width and the number of channels negotiated, + and not just be set to 4) (#317338) + +2005-09-26 14:59:10 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + add auparse to plugins list + Original commit message from CVS: + add auparse to plugins list + +2005-09-26 14:42:09 +0000 Wim Taymans + + gst/rtp/gstrtpmpaenc.c: Set buffer duration correctly. + Original commit message from CVS: + * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_flush), + (gst_rtpmpaenc_handle_buffer): + Set buffer duration correctly. + +2005-09-26 13:06:27 +0000 Tim-Philipp Müller + + gst/avi/gstavidemux.c: Don't crash when encountering a stream with an unknown fourcc or codec id. Instead, create a p... + Original commit message from CVS: + * gst/avi/gstavidemux.c: (gst_avi_demux_base_init), + (gst_avi_demux_class_init), (gst_avi_demux_parse_stream), + (gst_avi_demux_change_state): + Don't crash when encountering a stream with an unknown fourcc or + codec id. Instead, create a pad of type video/x-avi-unknown or + audio/x-avi-unknown, which as a side-effect also results in less + confusing error messages in players ('no decoder' vs. 'no streams'); + minor fixes to state change function and class_init function. + +2005-09-24 13:34:46 +0000 Thomas Vander Stichele + + * check/Makefile.am: + * tests/check/Makefile.am: + set up plugin paths properly + Original commit message from CVS: + set up plugin paths properly + +2005-09-24 13:10:52 +0000 Wim Taymans + + gst/autodetect/: These are sinks. + Original commit message from CVS: + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_init): + * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_init): + These are sinks. + +2005-09-24 12:10:02 +0000 Thomas Vander Stichele + + check/elements/level.c: fix test for new GstClockTime use + Original commit message from CVS: + * check/elements/level.c: (GST_START_TEST): + fix test for new GstClockTime use + * gst/level/gstlevel.c: (gst_level_init), (gst_level_set_caps), + (gst_level_transform_ip): + * gst/level/gstlevel.h: + fix up the decay peak, ensuring the decay peak is never lower + than the peak for that interval + +2005-09-23 18:23:04 +0000 Thomas Vander Stichele + + * ChangeLog: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * gst/level/gstlevel.c: + updating docs + Original commit message from CVS: + updating docs + +2005-09-23 18:15:51 +0000 Thomas Vander Stichele + + * ChangeLog: + * Makefile.am: + * check/elements/level.c: + * common: + * gst/level/Makefile.am: + * gst/level/gstlevel.c: + * gst/level/gstlevel.h: + * gst/level/level-example.c: + * tests/check/elements/level.c: + convert to using GstClockTime for all time values, finally. + Original commit message from CVS: + convert to using GstClockTime for all time values, finally. + +2005-09-23 15:01:00 +0000 Thomas Vander Stichele + + * gst/goom/Makefile.am: + fix build of goom + Original commit message from CVS: + fix build of goom + +2005-09-23 14:20:01 +0000 Thomas Vander Stichele + + * common: + * gst/level/gstlevel.c: + we handle more than two channels + Original commit message from CVS: + we handle more than two channels + +2005-09-23 04:23:00 +0000 Thomas Vander Stichele + + * ChangeLog: + * configure.ac: + * 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/jpeg/Makefile.am: + * ext/ladspa/Makefile.am: + * ext/libcaca/Makefile.am: + * ext/libmng/Makefile.am: + * ext/libpng/Makefile.am: + * ext/mikmod/Makefile.am: + * ext/pango/Makefile.am: + * ext/raw1394/Makefile.am: + * ext/shout2/Makefile.am: + * ext/speex/Makefile.am: + * gst/alpha/Makefile.am: + * gst/auparse/Makefile.am: + * gst/auparse/gstauparse.c: + * gst/autodetect/Makefile.am: + * gst/avi/Makefile.am: + * gst/cutter/Makefile.am: + * gst/debug/Makefile.am: + * gst/effectv/Makefile.am: + * gst/flx/Makefile.am: + * gst/goom/Makefile.am: + * gst/law/Makefile.am: + * gst/matroska/Makefile.am: + * gst/median/Makefile.am: + * gst/monoscope/Makefile.am: + * gst/multipart/Makefile.am: + * gst/oldcore/Makefile.am: + * gst/rtp/Makefile.am: + * gst/rtsp/Makefile.am: + * gst/smoothwave/Makefile.am: + * gst/smpte/Makefile.am: + * gst/videobox/Makefile.am: + * gst/videofilter/Makefile.am: + * gst/videomixer/Makefile.am: + * gst/wavenc/Makefile.am: + * gst/wavparse/Makefile.am: + * sys/oss/Makefile.am: + * sys/osxaudio/Makefile.am: + fix build and use of GST_LIBS + Original commit message from CVS: + fix build and use of GST_LIBS + +2005-09-22 22:38:48 +0000 Edgard Lima + + * ChangeLog: + * PORTED_09: + * configure.ac: + * gst/auparse/gstauparse.c: + * gst/auparse/gstauparse.h: + Auparse ported to 0.9. Tested with filesrc ! auparse ! osssink and alsasink + Original commit message from CVS: + Auparse ported to 0.9. Tested with filesrc ! auparse ! osssink and alsasink + +2005-09-22 14:13:36 +0000 Wim Taymans + + gst/rtp/: Use is_filled to both check MTU and max-ptime of base class. + Original commit message from CVS: + * gst/rtp/TODO: + * gst/rtp/gstrtpdec.c: (gst_rtpdec_getcaps): + * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_class_init), + (gst_rtpmp4venc_parse_data), (gst_rtpmp4venc_handle_buffer), + (gst_rtpmp4venc_set_property): + * gst/rtp/gstrtpmp4venc.h: + * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_handle_buffer): + * gst/rtp/gstrtpmpaenc.h: + Use is_filled to both check MTU and max-ptime of base class. + +2005-09-22 11:28:23 +0000 Wim Taymans + + gst/rtp/gstrtpmp4venc.c: Don't fragment packets with multiple frames. + Original commit message from CVS: + * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_class_init), + (gst_rtpmp4venc_parse_data), (gst_rtpmp4venc_handle_buffer), + (gst_rtpmp4venc_set_property): + Don't fragment packets with multiple frames. + +2005-09-22 10:39:11 +0000 Wim Taymans + + gst/rtp/: Remove g_print. + Original commit message from CVS: + * gst/rtp/TODO: + * gst/rtp/gstrtpmp4vdec.c: (gst_rtpmp4vdec_setcaps): + * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_class_init), + (gst_rtpmp4venc_init), (gst_rtpmp4venc_parse_data), + (gst_rtpmp4venc_handle_buffer), (gst_rtpmp4venc_set_property), + (gst_rtpmp4venc_get_property): + * gst/rtp/gstrtpmp4venc.h: + Remove g_print. + Update TODO + Make payload encoder a bit smarter and more correct with + timestamps. + Added option in payloader to include config string in-band. + +2005-09-21 19:41:45 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: Strip spaces for key/value pairs. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpmap), + (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_send): + Strip spaces for key/value pairs. + +2005-09-21 17:53:26 +0000 Wim Taymans + + gst/rtsp/gstrtspsrc.c: More SDP parsing and caps setting. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpmap), + (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_send), + (gst_rtspsrc_change_state): + More SDP parsing and caps setting. + Do NO_PREROLL differently. + add pads only after negotiated. + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_getcaps): + Implement the getcaps function. + +2005-09-21 17:50:29 +0000 Wim Taymans + + gst/rtp/gstrtpamrdec.c: Handle multiple AMr packets per payload. Handle CRC and parse ILL/ILP. + Original commit message from CVS: + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_sink_setcaps), + (gst_rtpamrdec_chain): + Handle multiple AMr packets per payload. Handle CRC and + parse ILL/ILP. + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_setcaps): + Make caps params strings for easy SDP mapping. + * gst/rtp/gstrtpdec.c: (gst_rtpdec_init), (gst_rtpdec_getcaps): + Handle capsnego better. + * gst/rtp/gstrtpmp4vdec.c: (gst_rtpmp4vdec_setcaps): + * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_new_caps): + Generate and parse config string in the caps. + +2005-09-21 12:19:24 +0000 Wim Taymans + + gst/rtp/README: Update README + Original commit message from CVS: + * gst/rtp/README: + Update README + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_sink_setcaps): + Make extra params as strings. + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state), + (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_send): + Make state change return NO_PREROLL as this is a live + source. + * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): + Don't unref old caps when NULL. + +2005-09-20 17:35:11 +0000 Wim Taymans + + gst/rtsp/: Add URI handler. + Original commit message from CVS: + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_get_type), + (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), + (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_send), + (gst_rtspsrc_open), (gst_rtspsrc_uri_get_type), + (gst_rtspsrc_uri_get_protocols), (gst_rtspsrc_uri_get_uri), + (gst_rtspsrc_uri_set_uri), (gst_rtspsrc_uri_handler_init): + * gst/rtsp/sdpmessage.c: (sdp_media_get_format): + * gst/rtsp/sdpmessage.h: + Add URI handler. + Parse SDP and create caps. + +2005-09-20 17:19:43 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + more spec file fixoring + Original commit message from CVS: + more spec file fixoring + +2005-09-20 17:04:33 +0000 Christian Schaller + + * gst-plugins-good.spec.in: + * gst-plugins.spec.in: + fix spec files + Original commit message from CVS: + fix spec files + +2005-09-20 10:51:51 +0000 Thomas Vander Stichele + + * gst/rtp/README: + * gst/rtp/gstrtpamrdec.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrenc.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pdec.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263penc.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpmp4vdec.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4venc.c: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadec.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpaenc.c: + * gst/rtp/gstrtpmpapay.c: + don't use underscores + Original commit message from CVS: + don't use underscores + +2005-09-20 07:30:31 +0000 Stefan Kost + + gst/alpha/gstalpha.c: fix element description + Original commit message from CVS: + * gst/alpha/gstalpha.c: + fix element description + +2005-09-19 17:57:06 +0000 Thomas Vander Stichele + + * docs/plugins/gst-plugins-good-plugins.prerequisites: + prereqs as well + Original commit message from CVS: + prereqs as well + +2005-09-19 17:53:42 +0000 Thomas Vander Stichele + + * docs/plugins/.gitignore: + * docs/plugins/gst-plugins-good-plugins.args: + * docs/plugins/gst-plugins-good-plugins.hierarchy: + * docs/plugins/gst-plugins-good-plugins.interfaces: + * docs/plugins/gst-plugins-good-plugins.signals: + commit result of scanobj step + Original commit message from CVS: + commit result of scanobj step + +2005-09-19 17:03:55 +0000 Wim Taymans + + gst/rtp/gstrtph263pdec.c: Don't check payload for now. + Original commit message from CVS: + * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_chain): + Don't check payload for now. + +2005-09-19 16:43:56 +0000 Thomas Vander Stichele + + * Makefile.am: + add check-valgrind target + Original commit message from CVS: + add check-valgrind target + +2005-09-19 16:26:30 +0000 Wim Taymans + + gst/wavparse/gstwavparse.*: Fix wavparse some more. + Original commit message from CVS: + * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), + (gst_wavparse_init), (gst_wavparse_parse_file_header), + (gst_wavparse_stream_init), (gst_wavparse_handle_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_loop), (gst_wavparse_pad_convert), + (gst_wavparse_pad_query), (gst_wavparse_srcpad_event), + (gst_wavparse_change_state): + * gst/wavparse/gstwavparse.h: + Fix wavparse some more. + +2005-09-19 11:48:13 +0000 Wim Taymans + + check/elements/level.c: Fix for bus API change. + Original commit message from CVS: + * check/elements/level.c: (GST_START_TEST): + Fix for bus API change. + +2005-09-19 11:38:10 +0000 Wim Taymans + + gst/level/level-example.c: Fix for new bus API. + Original commit message from CVS: + * gst/level/level-example.c: (main): + Fix for new bus API. + * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): + Set caps on pads. + +2005-09-19 11:06:05 +0000 Thomas Vander Stichele + + * gst/debug/Makefile.am: + disable flags for unbuilt plugins + Original commit message from CVS: + disable flags for unbuilt plugins + +2005-09-19 08:21:29 +0000 Thomas Vander Stichele + + * common: + * docs/plugins/scanobj-build.stamp: + normal builds shouldn't scan gobjects + Original commit message from CVS: + normal builds shouldn't scan gobjects + +2005-09-16 00:38:50 +0000 Thomas Vander Stichele + + * check/Makefile.am: + * common: + * tests/check/Makefile.am: + remove gst-register + Original commit message from CVS: + remove gst-register + +2005-09-15 13:57:56 +0000 Wim Taymans + + * ChangeLog: + * common: + * gst/rtp/Makefile.am: + * gst/rtp/README: + * gst/rtp/gstrtp.c: + * gst/rtp/gstrtpamrdec.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrenc.c: + * gst/rtp/gstrtpamrenc.h: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmdepay.h: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmenc.h: + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtpgsmparse.h: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtpgsmpay.h: + * gst/rtp/gstrtph263pdec.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263penc.c: + * gst/rtp/gstrtph263penc.h: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtpmp4vdec.c: + * gst/rtp/gstrtpmp4vdepay.c: + * gst/rtp/gstrtpmp4venc.c: + * gst/rtp/gstrtpmp4venc.h: + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadec.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpaenc.c: + * gst/rtp/gstrtpmpaenc.h: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmpapay.h: + Updates to payloader/depayloaders, make payloaders use the base classes. + Original commit message from CVS: + Updates to payloader/depayloaders, make payloaders use + the base classes. + Updated README with suggested RTP caps and how to convert + to/from SDP. + Added config descriptor in mp4v payloader. + +2005-09-15 10:47:58 +0000 Andy Wingo + + gst/autodetect/gstautoaudiosink.c (gst_auto_audio_sink_find_best): gst/autodetect/gstautovideosink.c + Original commit message from CVS: + 2005-09-15 Andy Wingo + * gst/autodetect/gstautoaudiosink.c (gst_auto_audio_sink_find_best): + * gst/autodetect/gstautovideosink.c + (gst_auto_video_sink_find_best): Update for new registry API. + +2005-09-14 20:51:47 +0000 Thomas Vander Stichele + + common/: a simple py script to generate valid xml from a C example probably also need to strip an MIT license when we... + Original commit message from CVS: + * common/c-to-xml.py: + * common/gtk-doc-plugins.mak: + a simple py script to generate valid xml from a C example + probably also need to strip an MIT license when we decide + * docs/plugins/Makefile.am: + * gst/level/Makefile.am: + * gst/level/gstlevel.c: (gst_level_init): + * gst/level/level-example.c: (message_handler), (main): + add an example to level that will show up in the docs + * gst/rtp/TODO: + add a note for the future + +2005-09-14 11:44:11 +0000 Michael Smith + + gst/wavenc/gstwavenc.c: Actually define the debug object being used in wavenc. Fixes #316205 + Original commit message from CVS: + * gst/wavenc/gstwavenc.c: (gst_wavenc_class_init): + Actually define the debug object being used in wavenc. Fixes #316205 + +2005-09-14 11:23:44 +0000 Michael Smith + + * ChangeLog: + * gst/smpte/Makefile.am: + Link smpte plugin against GST_BASE_LIBS, to get libgstbase; needed to build on win32 as this plugin uses collectpads ... + Original commit message from CVS: + Link smpte plugin against GST_BASE_LIBS, to get libgstbase; needed to + build on win32 as this plugin uses collectpads (bug 316204) + +2005-09-12 16:37:05 +0000 Jan Schmidt + + * ChangeLog: + Fix up bogus ChangeLog entry + Original commit message from CVS: + Fix up bogus ChangeLog entry + +2005-09-12 16:14:48 +0000 Andy Wingo + + autogen.sh (package): Now type 'make' to build gst-plugins-good. + Original commit message from CVS: + 2005-09-12 Andy Wingo + * autogen.sh (package): Now type 'make' to build gst-plugins-good. + +2005-09-11 17:52:09 +0000 Thomas Vander Stichele + + * common: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-fdsrc.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + add source module to docs; reinspect + Original commit message from CVS: + add source module to docs; reinspect + +2005-09-09 17:56:43 +0000 Jan Schmidt + + Move fdsrc back into gstreamer core elements. + Original commit message from CVS: + * configure.ac: + * gst/fdsrc/Makefile.am: + * gst/fdsrc/gstfdsrc.c: + * gst/fdsrc/gstfdsrc.h: + Move fdsrc back into gstreamer core elements. + * gst/level/gstlevel.c: (gst_level_class_init), + (gst_level_transform_ip): + * gst/videobox/gstvideobox.c: (gst_video_box_set_property): + Basetransform changes. + +2005-09-09 16:11:48 +0000 Thomas Vander Stichele + + * ChangeLog: + * ext/jpeg/gstsmokeenc.c: + * ext/jpeg/smokecodec.c: + fix compiler warnings + Original commit message from CVS: + fix compiler warnings + +2005-09-09 11:09:49 +0000 Thomas Vander Stichele + + gst-plugins-good.spec.in: spec file fixes + Original commit message from CVS: + * gst-plugins-good.spec.in: + spec file fixes + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), + (gst_multiudpsink_render), (gst_multiudpsink_add), + (gst_multiudpsink_clear): + it actually helps to actually stream if we hook up the + add signal to an actual implementation + * gst/udp/gstudpsrc.c: (gst_udpsrc_start): + some debugging + +2005-09-08 16:58:40 +0000 Flavio Oliveira + + * ext/jpeg/Makefile.am: + * ext/jpeg/gstjpeg.c: + * ext/jpeg/gstjpegenc.c: + * ext/jpeg/gstsmokeenc.c: + jpgenc ported to GSTreamer 0.9 + Original commit message from CVS: + jpgenc ported to GSTreamer 0.9 + +2005-09-08 16:26:17 +0000 Flavio Oliveira + + * ChangeLog: + jpegenc ported to GStreamer 0.9 + Original commit message from CVS: + jpegenc ported to GStreamer 0.9 + +2005-09-07 13:49:37 +0000 Stefan Kost + + ext/: gsttaginterface.h -> gsttagsetter.h + Original commit message from CVS: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + * ext/flac/gstflactag.c: + * ext/speex/gstspeexenc.c: + gsttaginterface.h -> gsttagsetter.h + +2005-09-06 23:30:03 +0000 Jan Schmidt + + Port to 0.9 and re-enable efence plugin. + Original commit message from CVS: + * configure.ac: + * gst/debug/Makefile.am: + * gst/debug/efence.c: (gst_efence_class_init), (gst_efence_init), + (gst_efence_chain), (gst_efence_buffer_alloc), (plugin_init), + (gst_fenced_buffer_finalize), (gst_fenced_buffer_copy), + (gst_fenced_buffer_alloc), (gst_fenced_buffer_class_init), + (gst_fenced_buffer_init), (gst_fenced_buffer_get_type): + Port to 0.9 and re-enable efence plugin. + +2005-09-06 21:31:25 +0000 Tim-Philipp Müller + + ext/flac/gstflacdec.*: Add support for flac files with 24/32 bits per sample; and misc. minor clean-ups. Seeking is s... + Original commit message from CVS: + * ext/flac/gstflacdec.c: (flac_caps_factory), (raw_caps_factory), + (gst_flacdec_write), (gst_flacdec_convert_src): + * ext/flac/gstflacdec.h: + Add support for flac files with 24/32 bits per sample; and misc. + minor clean-ups. Seeking is still partly broken (for me at least). + +2005-09-06 15:50:58 +0000 Wim Taymans + + gst/rtp/: Added mpeg4 video payload encoder/decoder. + Original commit message from CVS: + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp4vdec.c: (gst_rtpmp4vdec_get_type), + (gst_rtpmp4vdec_base_init), (gst_rtpmp4vdec_class_init), + (gst_rtpmp4vdec_init), (gst_rtpmp4vdec_setcaps), + (gst_rtpmp4vdec_chain), (gst_rtpmp4vdec_set_property), + (gst_rtpmp4vdec_get_property), (gst_rtpmp4vdec_change_state), + (gst_rtpmp4vdec_plugin_init): + * gst/rtp/gstrtpmp4vdec.h: + * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_get_type), + (gst_rtpmp4venc_base_init), (gst_rtpmp4venc_class_init), + (gst_rtpmp4venc_init), (gst_rtpmp4venc_setcaps), + (gst_rtpmp4venc_flush), (gst_rtpmp4venc_chain), + (gst_rtpmp4venc_set_property), (gst_rtpmp4venc_get_property), + (gst_rtpmp4venc_change_state), (gst_rtpmp4venc_plugin_init): + * gst/rtp/gstrtpmp4venc.h: + * gst/rtp/gstrtpmpadec.c: (gst_rtpmpadec_chain): + * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_flush): + Added mpeg4 video payload encoder/decoder. + Added some docs in mpa payloader. + +2005-09-06 14:06:47 +0000 Thomas Vander Stichele + + * configure.ac: + back to HEAD + Original commit message from CVS: + back to HEAD + +=== release 0.9.1 === + +2005-09-06 14:05:33 +0000 Thomas Vander Stichele + + * ChangeLog: + * NEWS: + * README: + * RELEASE: + * autogen.sh: + * common: + * configure.ac: + releasing 0.9.2 + Original commit message from CVS: + releasing 0.9.2 + +2005-09-05 17:20:28 +0000 Jan Schmidt + + * gst/videocrop/gstvideocrop.c: + * sys/v4l2/gstv4l2element.c: + * sys/v4l2/gstv4l2src.c: + Fix up all the state change functions. + Original commit message from CVS: + Fix up all the state change functions. + +2005-09-05 16:28:16 +0000 Andy Wingo + + ext/dv/gstdvdemux.c (gst_dvdemux_chain): Move the pad adding here from the state change handler, so we fire signals w... + Original commit message from CVS: + 2005-09-05 Andy Wingo + * ext/dv/gstdvdemux.c (gst_dvdemux_chain): Move the pad adding + here from the state change handler, so we fire signals without + holding the state lock. + +2005-09-05 15:10:18 +0000 Thomas Vander Stichele + + * gst/qtdemux/qtdemux.c: + cleaning up bad + Original commit message from CVS: + cleaning up bad + +2005-09-05 13:18:42 +0000 Thomas Vander Stichele + + * docs/.gitignore: + * docs/plugins/.gitignore: + maintenance commits + Original commit message from CVS: + maintenance commits + +2005-09-04 15:09:33 +0000 Thomas Vander Stichele + + * configure.ac: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/inspect-build.stamp: + * docs/plugins/inspect.stamp: + * docs/plugins/inspect/plugin-1394.xml: + * docs/plugins/inspect/plugin-aasink.xml: + * docs/plugins/inspect/plugin-alaw.xml: + * docs/plugins/inspect/plugin-alpha.xml: + * docs/plugins/inspect/plugin-autodetect.xml: + * docs/plugins/inspect/plugin-avi.xml: + * docs/plugins/inspect/plugin-cacasink.xml: + * docs/plugins/inspect/plugin-dv.xml: + * docs/plugins/inspect/plugin-effectv.xml: + * docs/plugins/inspect/plugin-esdsink.xml: + * docs/plugins/inspect/plugin-fdsrc.xml: + * docs/plugins/inspect/plugin-flac.xml: + * docs/plugins/inspect/plugin-gconfelements.xml: + * docs/plugins/inspect/plugin-goom.xml: + * docs/plugins/inspect/plugin-jpeg.xml: + * docs/plugins/inspect/plugin-level.xml: + * docs/plugins/inspect/plugin-mulaw.xml: + * docs/plugins/inspect/plugin-ossaudio.xml: + * docs/plugins/inspect/plugin-png.xml: + * docs/plugins/inspect/plugin-rtp.xml: + * docs/plugins/inspect/plugin-rtsp.xml: + * docs/plugins/inspect/plugin-shout2send.xml: + * docs/plugins/inspect/plugin-smpte.xml: + * docs/plugins/inspect/plugin-speex.xml: + * docs/plugins/inspect/plugin-udp.xml: + * docs/plugins/inspect/plugin-videobox.xml: + * docs/plugins/inspect/plugin-videoflip.xml: + * docs/plugins/inspect/plugin-wavparse.xml: + distcheck fixes + Original commit message from CVS: + distcheck fixes + +2005-09-04 11:50:47 +0000 Thomas Vander Stichele + + * Makefile.am: + * autogen.sh: + * common: + * docs/plugins/Makefile.am: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + fix distcheck + Original commit message from CVS: + fix distcheck + +2005-09-02 15:56:52 +0000 Thomas Vander Stichele + + * gst-plugins-good.spec.in: + various spec fixes + Original commit message from CVS: + various spec fixes + +2005-09-02 15:44:50 +0000 Andy Wingo + + * check/elements/level.c: + * examples/gstplay/player.c: + * examples/stats/mp2ogg.c: + * ext/aalib/gstaasink.c: + * ext/cairo/gsttextoverlay.c: + * ext/dv/gstdvdec.c: + * ext/dv/gstdvdemux.c: + * ext/esd/esdmon.c: + * ext/flac/gstflacdec.c: + * ext/flac/gstflacenc.c: + * ext/flac/gstflactag.c: + * ext/gconf/gstgconfaudiosink.c: + * ext/gconf/gstgconfvideosink.c: + * ext/gdk_pixbuf/gstgdkanimation.c: + * ext/jpeg/gstjpegdec.c: + * ext/jpeg/gstjpegenc.c: + * ext/ladspa/gstsignalprocessor.c: + * ext/libcaca/gstcacasink.c: + * ext/libmng/gstmngdec.c: + * ext/mikmod/gstmikmod.c: + * ext/pango/gsttextoverlay.c: + * ext/raw1394/gstdv1394src.c: + * ext/shout2/gstshout2.c: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * gst/alpha/gstalpha.c: + * gst/auparse/gstauparse.c: + * gst/autodetect/gstautoaudiosink.c: + * gst/autodetect/gstautovideosink.c: + * gst/avi/gstavidemux.c: + * gst/avi/gstavimux.c: + * gst/debug/breakmydata.c: + * gst/debug/gstnavigationtest.c: + * gst/effectv/gstquark.c: + * gst/fdsrc/gstfdsrc.c: + * gst/flx/gstflxdec.c: + * gst/goom/gstgoom.c: + * gst/matroska/ebml-read.c: + * gst/matroska/ebml-write.c: + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-mux.c: + * gst/multipart/multipartdemux.c: + * gst/multipart/multipartmux.c: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstpipefilter.c: + * gst/rtp/gstrtpL16depay.c: + * gst/rtp/gstrtpL16enc.c: + * gst/rtp/gstrtpL16parse.c: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpamrdec.c: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrenc.c: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpdec.c: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmenc.c: + * gst/rtp/gstrtpgsmparse.c: + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pdec.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263penc.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtpmpadec.c: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpaenc.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtsp/gstrtspsrc.c: + * gst/smoothwave/gstsmoothwave.c: + * gst/udp/gstdynudpsink.c: + * gst/udp/gstmultiudpsink.c: + * gst/videomixer/videomixer.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + * po/vi.po: + * sys/oss/gstossmixerelement.c: + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + * tests/check/elements/level.c: + All plugins updated for element state changes. + Original commit message from CVS: + 2005-09-02 Andy Wingo + * All plugins updated for element state changes. + +2005-09-01 21:24:57 +0000 Thomas Vander Stichele + + * ext/aalib/Makefile.am: + fix build after cleaning up my vomit + Original commit message from CVS: + fix build after cleaning up my vomit + +2005-09-01 21:23:09 +0000 Thomas Vander Stichele + + * ext/aalib/Makefile.am: + fix build after cleaning up my vomit + Original commit message from CVS: + fix build after cleaning up my vomit + +2005-09-01 21:20:45 +0000 Thomas Vander Stichele + + * gst/smpte/Makefile.am: + fix build after cleaning up my vomit + Original commit message from CVS: + fix build after cleaning up my vomit + +2005-09-01 21:15:30 +0000 Thomas Vander Stichele + + * gst/smpte/Makefile.am: + fix build after cleaning up my vomit + Original commit message from CVS: + fix build after cleaning up my vomit + +2005-09-01 20:23:22 +0000 Thomas Vander Stichele + + * ChangeLog: + * Makefile.am: + * check/.gitignore: + * check/Makefile.am: + * check/elements/.gitignore: + * check/elements/level.c: + * common: + * configure.ac: + * gst/level/gstlevel.c: + * gst/level/gstlevel.h: + * tests/check/.gitignore: + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/elements/level.c: + Andrewio Patrickoforus Wingonymus - 5 additional tests for your sins + Original commit message from CVS: + Andrewio Patrickoforus Wingonymus - 5 additional tests for your sins + Add a regression test for level and fix a casting bug that made the additional + channels turn out wrong + +2005-09-01 17:55:14 +0000 Thomas Vander Stichele + + add docs to build + Original commit message from CVS: + * Makefile.am: + * configure.ac: + add docs to build + * common/plugins.xsl: + wrap Description into a refsect2 + * docs/Makefile.am: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * gst/goom/Makefile.am: + * gst/goom/gstgoom.c: (gst_goom_get_type), (gst_goom_base_init), + (gst_goom_class_init), (gst_goom_init), (gst_goom_dispose), + (gst_goom_sink_setcaps), (gst_goom_src_setcaps), + (gst_goom_src_negotiate), (gst_goom_event), (gst_goom_chain), + (gst_goom_change_state): + * gst/goom/gstgoom.h: + GstGOOM -> GstGoom + add an example launch line + * gst/level/gstlevel.h: + * gst/monoscope/gstmonoscope.c: + cleanups + +2005-08-31 16:28:05 +0000 Thomas Vander Stichele + + * gst/dvdlpcmdec/.gitignore: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + remove dvdlpcmdec, it's dvd stuff + Original commit message from CVS: + remove dvdlpcmdec, it's dvd stuff + +2005-08-30 19:41:12 +0000 Thomas Vander Stichele + + * Makefile.am: + * gst-libs/gst/gettext.h: + * gst-libs/gst/gst-i18n-plugin.h: + add some i18n headers + Original commit message from CVS: + add some i18n headers + +2005-08-30 19:24:37 +0000 Thomas Vander Stichele + + * docs/plugins/.gitignore: + ignore more + Original commit message from CVS: + ignore more + +2005-08-30 19:24:03 +0000 Thomas Vander Stichele + + * docs/Makefile.am: + Makefile.am + Original commit message from CVS: + Makefile.am + +2005-08-30 19:20:02 +0000 Thomas Vander Stichele + + * docs/upload.mak: + * docs/version.entities.in: + commit new stuff + Original commit message from CVS: + commit new stuff + +2005-08-30 19:01:18 +0000 Thomas Vander Stichele + + * ChangeLog: + * common: + * configure.ac: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-good-plugins-docs.sgml: + * docs/plugins/gst-plugins-good-plugins-sections.txt: + * docs/plugins/gst-plugins-good-plugins.types: + document elements and plugins. Shazam ! + Original commit message from CVS: + document elements and plugins. Shazam ! + +2005-08-30 17:37:00 +0000 Thomas Vander Stichele + + * .gitignore: + * COPYING: + * RELEASE: + * gst-plugins-good.spec.in: + add some files + Original commit message from CVS: + add some files + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..b42a17a --- /dev/null +++ b/INSTALL @@ -0,0 +1,182 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..fd94a81 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,95 @@ +DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc + +if USE_GCONFTOOL +GCONF_DIR = gconf +else +GCONF_DIR = +endif + +ALWAYS_SUBDIRS = \ + gst sys ext \ + tests \ + docs \ + po \ + common \ + m4 \ + pkgconfig + +SUBDIRS = \ + $(ALWAYS_SUBDIRS) \ + $(GCONF_DIR) + +DIST_SUBDIRS = \ + $(ALWAYS_SUBDIRS) \ + gconf + + +# include before EXTRA_DIST for win32 assignment +include $(top_srcdir)/common/win32.mak + +EXTRA_DIST = \ + gst-plugins-good.spec depcomp \ + AUTHORS COPYING NEWS README RELEASE REQUIREMENTS \ + ChangeLog gst-plugins-good.doap autogen.sh \ + $(win32) + +DISTCLEANFILES = _stdint.h + +noinst_HEADERS = \ + gst-libs/gst/gettext.h \ + gst-libs/gst/gst-i18n-plugin.h \ + gst-libs/gst/glib-compat-private.h + +ACLOCAL_AMFLAGS = -I m4 -I common/m4 + +include $(top_srcdir)/common/release.mak +include $(top_srcdir)/common/po.mak + +check-valgrind: + cd tests/check && make check-valgrind + +if HAVE_GST_CHECK +check-torture: + cd tests/check && make torture +else +check-torture: + true +endif + +win32-update: + for f in gst/udp/gstudp-marshal.c \ + gst/udp/gstudp-marshal.h \ + gst/udp/gstudp-enumtypes.c \ + gst/udp/gstudp-enumtypes.h \ + gst/rtpmanager/gstrtpbin-marshal.c \ + gst/rtpmanager/gstrtpbin-marshal.h ; do \ + cp $(top_builddir)/$$f win32/common; done + $(top_srcdir)/common/gst-indent win32/common/gstudp-marshal.c + $(top_srcdir)/common/gst-indent win32/common/gstudp-marshal.c + $(top_srcdir)/common/gst-indent win32/common/gstudp-enumtypes.c + $(top_srcdir)/common/gst-indent win32/common/gstudp-enumtypes.c + $(top_srcdir)/common/gst-indent gst/rtpmanager/gstrtpbin-marshal.c + $(top_srcdir)/common/gst-indent gst/rtpmanager/gstrtpbin-marshal.c + cp $(top_builddir)/win32/common/config.h-new \ + $(top_srcdir)/win32/common/config.h + +include $(top_srcdir)/common/coverage/lcov.mak + +# cruft: plugins that have been merged or moved or renamed + +CRUFT_FILES = \ + $(top_builddir)/common/shave \ + $(top_builddir)/common/shave-libtool \ + $(top_builddir)/gst/qtdemux/.libs/*.{so,dll,DLL,dylib} \ + $(top_builddir)/gst/quicktime/.libs/*.{so,dll,DLL,dylib} \ + $(top_builddir)/gst/videofilter/.libs/*videoflip.{so,dll,DLL,dylib} \ + $(top_builddir)/gst/videofilter/.libs/*videobalance.{so,dll,DLL,dylib} \ + $(top_builddir)/gst/videofilter/.libs/*gamma.{so,dll,DLL,dylib} + +CRUFT_DIRS = \ + $(top_srcdir)/gst/qtdemux \ + $(top_srcdir)/gst/quicktime + +include $(top_srcdir)/common/cruft.mak + +all-local: check-cruft diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..c878bf4 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1273 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# various tests to make sure we dist the win32 stuff (for MSVC builds) right + +# include this snippet to add a common release: target by using +# include $(top_srcdir)/common/release.mak + +# checks for left-over files in the (usually uninstalled) tree, ie. for +# stuff that best be deleted to avoid problems like having old plugin binaries +# lying around. +# +# set CRUFT_FILES and/or CRUFT_DIRS in your Makefile.am when you include this + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(am__configure_deps) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(srcdir)/gst-plugins-good.spec.in \ + $(top_srcdir)/common/coverage/lcov.mak \ + $(top_srcdir)/common/cruft.mak $(top_srcdir)/common/po.mak \ + $(top_srcdir)/common/release.mak \ + $(top_srcdir)/common/win32.mak $(top_srcdir)/configure \ + ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS compile \ + config.guess config.rpath config.sub depcomp install-sh \ + ltmain.sh missing +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = gst-plugins-good.spec +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +HEADERS = $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = -I m4 -I common/m4 +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc +@USE_GCONFTOOL_FALSE@GCONF_DIR = +@USE_GCONFTOOL_TRUE@GCONF_DIR = gconf +ALWAYS_SUBDIRS = \ + gst sys ext \ + tests \ + docs \ + po \ + common \ + m4 \ + pkgconfig + +SUBDIRS = \ + $(ALWAYS_SUBDIRS) \ + $(GCONF_DIR) + +DIST_SUBDIRS = \ + $(ALWAYS_SUBDIRS) \ + gconf + + +# the MANIFEST contains all win32 related files that should be disted +win32 = $(shell cat $(top_srcdir)/win32/MANIFEST) + +# wildcard is apparently not portable to other makes, hence the use of find +# these are library .def files with the symbols to export +win32defs = $(shell find $(top_srcdir)/win32/common -name '*.def') + +# wildcard is apparently not portable to other makes, hence the use of find +# these are files that need to be disted with CRLF line endings: +win32crlf = $(shell find $(top_srcdir)/win32 -name '*.dsw' -o -name '*.dsp') + +# include before EXTRA_DIST for win32 assignment +EXTRA_DIST = \ + gst-plugins-good.spec depcomp \ + AUTHORS COPYING NEWS README RELEASE REQUIREMENTS \ + ChangeLog gst-plugins-good.doap autogen.sh \ + $(win32) + +DISTCLEANFILES = _stdint.h +noinst_HEADERS = \ + gst-libs/gst/gettext.h \ + gst-libs/gst/gst-i18n-plugin.h \ + gst-libs/gst/glib-compat-private.h + + +# make bz2 as well +AUTOMAKE_OPTIONS = dist-bzip2 + +# cruft: plugins that have been merged or moved or renamed +CRUFT_FILES = \ + $(top_builddir)/common/shave \ + $(top_builddir)/common/shave-libtool \ + $(top_builddir)/gst/qtdemux/.libs/*.{so,dll,DLL,dylib} \ + $(top_builddir)/gst/quicktime/.libs/*.{so,dll,DLL,dylib} \ + $(top_builddir)/gst/videofilter/.libs/*videoflip.{so,dll,DLL,dylib} \ + $(top_builddir)/gst/videofilter/.libs/*videobalance.{so,dll,DLL,dylib} \ + $(top_builddir)/gst/videofilter/.libs/*gamma.{so,dll,DLL,dylib} + +CRUFT_DIRS = \ + $(top_srcdir)/gst/qtdemux \ + $(top_srcdir)/gst/quicktime + +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/win32.mak $(top_srcdir)/common/release.mak $(top_srcdir)/common/po.mak $(top_srcdir)/common/coverage/lcov.mak $(top_srcdir)/common/cruft.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/win32.mak $(top_srcdir)/common/release.mak $(top_srcdir)/common/po.mak $(top_srcdir)/common/coverage/lcov.mak $(top_srcdir)/common/cruft.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then rm -f stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +gst-plugins-good.spec: $(top_builddir)/config.status $(srcdir)/gst-plugins-good.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && $(MAKE) $(AM_MAKEFLAGS) distcheck-hook \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(HEADERS) config.h all-local +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am all-local am--refresh check check-am clean \ + clean-generic clean-libtool ctags ctags-recursive dist \ + dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-lzma \ + dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am + + +win32-debug: + @echo; \ + echo win32 = $(win32); \ + echo; \ + echo win32defs = $(win32defs); \ + echo; \ + echo win32crlf = $(win32crlf); \ + echo + +win32-check-crlf: + @echo Checking win32 files for CR LF line endings ...; \ + fail=0 ; \ + for each in $(win32crlf) ; do \ + result=`perl -e 'print grep(/\r\n/,<>)' "$$each" | wc -l`; \ + if test "$$result" = 0 ; then \ + echo $$each must be fixed to have CRLF line endings ; \ + fail=1; \ + fi ; \ + done ; \ + exit $$fail + +# make sure all symbols we export on linux are defined in the win32 .def too +# (don't care about other unixes for now, it's enough if it works on one of +# the linux build bots; we assume .so ) +check-exports: + @fail=0 ; \ + for l in $(win32defs); do \ + libbase=`basename "$$l" ".def"`; \ + libso=`find "$(top_builddir)" -name "$$libbase-@GST_MAJORMINOR@.so" | grep -v /_build/ | head -n1`; \ + libdef="$(top_srcdir)/win32/common/$$libbase.def"; \ + if test "x$$libso" != "x"; then \ + echo Checking symbols in $$libso; \ + if ! ($(top_srcdir)/common/check-exports $$libdef $$libso) ; then \ + fail=1; \ + fi; \ + fi; \ + done ; \ + if test $$fail != 0; then \ + echo '-----------------------------------------------------------'; \ + echo 'Run this to update the .def files:'; \ + echo 'make check-exports 2>&1 | patch -p1'; \ + echo '-----------------------------------------------------------'; \ + fi; \ + exit $$fail + +# complain about nonportable printf format strings (%lld, %llu, %zu etc.) +check-nonportable-print-format: + @fail=0 ; \ + loc=`find "$(top_srcdir)" -name '*.c' | xargs grep -n -e '%[0-9]*ll[udx]' -e '%[0-9]*z[udx]'`; \ + if test "x$$loc" != "x"; then \ + echo "Please fix the following print format strings:" ; \ + find "$(top_srcdir)" -name '*.c' | xargs grep -n -e '%[0-9]*ll[udx]' -e '%[0-9]*z[udx]'; \ + fail=1; \ + fi; \ + exit $$fail + +dist-hook: check-exports win32-check-crlf + +release: dist + $(MAKE) $(PACKAGE)-$(VERSION).tar.gz.md5 + $(MAKE) $(PACKAGE)-$(VERSION).tar.bz2.md5 + +# generate md5 sum files +%.md5: % + md5sum $< > $@ + +# check that no marshal or enumtypes files are included +# this in turn ensures that distcheck fails for missing .list files which is currently +# shadowed when the corresponding .c and .h files are included. +distcheck-hook: + @test "x" = "x`find $(distdir) -name \*-enumtypes.[ch] | grep -v win32`" && \ + test "x" = "x`find $(distdir) -name \*-marshal.[ch]`" || \ + ( $(ECHO) "*** Leftover enumtypes or marshal files in the tarball." && \ + $(ECHO) "*** Make sure the following files are not disted:" && \ + find $(distdir) -name \*-enumtypes.[ch] | grep -v win32 && \ + find $(distdir) -name \*-marshal.[ch] && \ + false ) + +# rule to download the latest .po files +download-po: $(top_srcdir)/common/download-translations + $(top_srcdir)/common/download-translations $(PACKAGE) + +check-valgrind: + cd tests/check && make check-valgrind + +@HAVE_GST_CHECK_TRUE@check-torture: +@HAVE_GST_CHECK_TRUE@ cd tests/check && make torture +@HAVE_GST_CHECK_FALSE@check-torture: +@HAVE_GST_CHECK_FALSE@ true + +win32-update: + for f in gst/udp/gstudp-marshal.c \ + gst/udp/gstudp-marshal.h \ + gst/udp/gstudp-enumtypes.c \ + gst/udp/gstudp-enumtypes.h \ + gst/rtpmanager/gstrtpbin-marshal.c \ + gst/rtpmanager/gstrtpbin-marshal.h ; do \ + cp $(top_builddir)/$$f win32/common; done + $(top_srcdir)/common/gst-indent win32/common/gstudp-marshal.c + $(top_srcdir)/common/gst-indent win32/common/gstudp-marshal.c + $(top_srcdir)/common/gst-indent win32/common/gstudp-enumtypes.c + $(top_srcdir)/common/gst-indent win32/common/gstudp-enumtypes.c + $(top_srcdir)/common/gst-indent gst/rtpmanager/gstrtpbin-marshal.c + $(top_srcdir)/common/gst-indent gst/rtpmanager/gstrtpbin-marshal.c + cp $(top_builddir)/win32/common/config.h-new \ + $(top_srcdir)/win32/common/config.h +.PHONY: lcov-reset lcov lcov-run lcov-report lcov-upload + +# run lcov from scratch, always +lcov-reset: + $(MAKE) lcov-run + $(MAKE) lcov-report + +# run lcov from scratch if the dir is not there +lcov: + $(MAKE) lcov-reset + +# reset run coverage tests +@GST_GCOV_ENABLED_TRUE@lcov-run: +@GST_GCOV_ENABLED_TRUE@ @-rm -rf lcov +@GST_GCOV_ENABLED_TRUE@ lcov --directory . --zerocounters +@GST_GCOV_ENABLED_TRUE@ -if test -d tests/check; then $(MAKE) -C tests/check inspect; fi +@GST_GCOV_ENABLED_TRUE@ -$(MAKE) check + +# generate report based on current coverage data +@GST_GCOV_ENABLED_TRUE@lcov-report: +@GST_GCOV_ENABLED_TRUE@ mkdir lcov +@GST_GCOV_ENABLED_TRUE@ lcov --compat-libtool --directory . --capture --output-file lcov/lcov.info +@GST_GCOV_ENABLED_TRUE@ lcov --list-full-path -l lcov/lcov.info | grep -v "`cd $(top_srcdir) && pwd`" | cut -d\| -f1 > lcov/remove +@GST_GCOV_ENABLED_TRUE@ lcov --list-full-path -l lcov/lcov.info | grep "tests/check/" | cut -d\| -f1 >> lcov/remove +@GST_GCOV_ENABLED_TRUE@ lcov --list-full-path -l lcov/lcov.info | grep "docs/plugins/" | cut -d\| -f1 >> lcov/remove +@GST_GCOV_ENABLED_TRUE@ lcov -r lcov/lcov.info `cat lcov/remove` > lcov/lcov.cleaned.info +@GST_GCOV_ENABLED_TRUE@ rm lcov/remove +@GST_GCOV_ENABLED_TRUE@ mv lcov/lcov.cleaned.info lcov/lcov.info +@GST_GCOV_ENABLED_TRUE@ genhtml -t "$(PACKAGE_STRING)" -o lcov --num-spaces 2 lcov/lcov.info + +@GST_GCOV_ENABLED_TRUE@lcov-upload: lcov +@GST_GCOV_ENABLED_TRUE@ rsync -rvz -e ssh --delete lcov/* gstreamer.freedesktop.org:/srv/gstreamer.freedesktop.org/www/data/coverage/lcov/$(PACKAGE) + +@GST_GCOV_ENABLED_FALSE@lcov-run: +@GST_GCOV_ENABLED_FALSE@ echo "Need to reconfigure with --enable-gcov" + +@GST_GCOV_ENABLED_FALSE@lcov-report: +@GST_GCOV_ENABLED_FALSE@ echo "Need to reconfigure with --enable-gcov" + +check-cruft: + @cruft_files=""; cruft_dirs=""; \ + for f in $(CRUFT_FILES); do \ + if test -e $$f; then \ + cruft_files="$$cruft_files $$f"; \ + fi \ + done; \ + for d in $(CRUFT_DIRS); do \ + if test -e $$d; then \ + cruft_dirs="$$cruft_dirs $$d"; \ + fi \ + done; \ + if test "x$$cruft_files$$cruft_dirs" != x; then \ + echo; \ + echo "**** CRUFT ALERT *****"; \ + echo; \ + echo "The following files and directories may not be needed any "; \ + echo "longer (usually because a plugin has been merged into "; \ + echo "another plugin, moved to a different module, or been "; \ + echo "renamed), and you probably want to clean them up if you "; \ + echo "don't have local changes: "; \ + echo; \ + for f in $$cruft_files; do echo "file $$f"; done; \ + echo; \ + for d in $$cruft_dirs; do echo "directory $$d"; done; \ + echo; \ + echo "'make clean-cruft' will remove these for you."; \ + echo; \ + fi + +clean-cruft-dirs: + @for d in $(CRUFT_DIRS); do \ + if test -e $$d; then \ + rm -r "$$d" && echo "Removed directory $$d"; \ + fi \ + done + +clean-cruft-files: + @for f in $(CRUFT_FILES); do \ + if test -e $$f; then \ + rm "$$f" && echo "Removed file $$f"; \ + fi \ + done + +clean-cruft: clean-cruft-dirs clean-cruft-files + +# also might want to add this to your Makefile.am: +# +# all-local: check-cruft + +all-local: check-cruft + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..d4066ec --- /dev/null +++ b/NEWS @@ -0,0 +1,2315 @@ +This is GStreamer Good Plug-ins 0.10.31, "Faster" + +Changes since 0.10.30: + + * audioparsers: propagate downstream caps constraints upstream + * ac3parse: add support for IEC 61937 alignment and conversion/switching between alignments + * ac3parse: let bsid 9 and 10 through + * auparse: implement seeking + * avidemux: fix wrong stride when inverting uncompressed video + * cairotextoverlay: add a "silent" property to skip rendering; forward new segment events + * deinterlace: add support for deinterlacing using buffer caps/flags (as set by e.g. fieldanalysis) + * deinterlace: new fieldanalysis-related properties: "locking" and "ignore-obscure" + * directsoundsink: fix negotiation/device setup: 16-bit audio is signed, 8-bit is unsigned + * effecttv: fix reverse negotiation; repair color modes in radioactv by taking rgb,bgr into account + * equalizer: also sync the parameters for the filter bands + * flacdec: better timestamp/offset handling; try upstream first for duration queries + * flacdec: send EOS when seeking after the end of file instead of failing + * flacenc: do not drop the first data buffer on the floor + * flacparse: detect when a file lies about fixed block size; ignore invalid minimum_blocksize + * flacparse: more accurate/better duration/timestamp handling + * flvdemux: better timestamp handling (negative cts, detect large pts gaps; fix discontinuity threshold check when timestamps go backwards) + * flvmux: properly determine final duration; metadata/header writing fixes + * gdkpixbufsink: fix inverted pixel-aspect-ratio info on pixbufs + * jack: add "client-name" property to jackaudiosink and jackaudiosrc + * jpegdec: add sof-marker to template caps, so we don't get plugged for lossless jpeg + * jpegdec: Implement upstream negotiation + * matroskademux: seeking fixes; better handling of non-finalized files + * matroskademux: better timestamp/duration handling, fix some stuttering A/V + * matroskademux: add "max-gap-time" property to make gap handling configurable + * matroskademux: UTF-8 subtitles may have markup + * matroskamux: do not use unoffical V_MJPEG codec id + * matroskamux: fix segment handling, so we actually use running time + * matroskamux: for streaming files, push tags first + * matroskamux: handle GstForceKeyUnit event + * multifile: new splitfilesrc element to read multiple files as if they were one single file + * multifilesrc: add "loop" property + * multifilesink: handle buffer lists, useful to keep groups of buffers (GOPs) in the same file + * multifilesink: add flag to cut after a force key unit event + * multifilesink: add "max-files" property + * multifilesink: add new 'max-size' mode and "max-file-size" property for switching to the next file based on size + * multifilesink: write stream-headers when switching to the next file in max-size mode + * multipartdemux: Add property to assume a single stream and emit no-more-pads + * multipartmux: Add \r\n to tail of pushed buffers + * navseek: toggle pause/play on space bar + * osxvideo: Fix leak of NSOpenGLPixelFormat object + * pcmadepay,pcmudepay: allow variable sample rate + * pngenc: increase arbitrary resolution limits + * pulse: Drop support for PA versions before 0.9.16 (1.x is recommended) + * pulse: new pulseaudiosink element to handle format changes (not autoplugged yet) + * pulsesink: add support for compressed audio format passthrough (S/PDIF, mp3-over-bluetooth) + * pulsesink: Allow writes in bigger chunks + * pulsesink: Use the extended stream API if available + * pulsesrc: add a "source-output-index" property; implement GstStreamVolume interface + * qtdemux: better fragmented support (avoid adjustment for keyframe seek; mark all audio track samples as keyframe) + * qtdemux: parse embedded ID32 tags; improve bitrate guessing/extraction + * qtdemux: push mode fixes, fix buffered streaming + * qtmux: add direct dirac mapping + * qtmux: calculate average bitrate for streams + * qtmux: fix ctts generation for streams that don't start at 0 timestamps + * qtmux: use GST_TAG_IMAGE for coverart too + * ismlmux: Use iso-fragmented as variant type (useful in connection with encodebin) + * rtph263ppay: implement getcaps following RFC 4629, picks the right annexes + * rtph263ppay: set H263-2000 if thats what the other side wants + * rtph264depay: complete merged AU on marker bit (thus reducing latency) + * rtph264depay: cope with FU-A E bit not being set (caused by buggy payloaders) + * rtph264depay: exclude NALu size from payload length on truncated packets + * rtph264pay: proxy downstream caps restrictions (converting profile-level-id from RTP caps into video/x-h264 style caps) + * rtph264pay: only set the marker bit on the last NALU of a multi-NALU access unit + * rtpjpegpay: add support for H.264 payload in MJPEG container + * rtpjpegpay: fix for "odd" resolutions not a multiple of DCTSIZE + * rtpmp4adepay: fix output buffer timestamps in case of multiple frames + * rtpmp4gdepay: improve bogus interleaved index compensating + * rtpmp4vpay: deprecated send-config property and replace by config-interval + * rtppcmapay/depay: static clock rates on static payloads, dynamic on dynamic + * rtpvrawpay,-depay: RGB video payloading/depayloading fixes + * rtpg722pay: Compensate for clockrate vs. samplerate difference + * rtpbin: allow configurable rtcp stream syncing interval + * rtpbin: new "rtcp-sync" property, alternative inter-stream syncing methods + * rtpjitterbuffer/rtpbin: relax dropping rtcp packets; misc other fixes + * rtpmanager: don't reveal the user's username, hostname or real name by default + * rtpsession: process received Full Intra Requests (FIR) + * rtpsession: add special mode to use FIR as repair as Google does + * rtpsession: send FIR requests in response to key unit requests with all-headers=TRUE + * rtpsession: always send application requested feedback in immediate mode + * rtpsession: put the PLI requests in each RTPSource + * rtpsession: wait longer to timeout SSRC collision + * rtspsrc: implement async network I/O + * rtspsrc: allow sending short RTSP requests to a server + * rtspsrc: configure rtcp interval if provided + * rtspsrc: open on play and pause when not done yet + * shout2send: send video/webm through libshout + * soup: new souphttpclientsink element + * udpsrc: drop dataless UDP packets + * v4l2: take care not to change the current format where appropriate + * v4l2src, v4l2sink: add "norm" property; default to a pixel-aspect-ratio of 1/1 + * v4l2src: do not ignore the highest frame interval or the largest resolution + * v4l2src: handle some feature query failures more gracefully + * videobox: avoid wrapping opaque to transparent + * wavenc: Allow setcaps to be called after a format was negotiated if it's compatible + * ximagesrc: add "xid" and "xname" properties to allow capturing a particular window + * ximagesrc: fallback to non-XShm mode if allocating the XShm image failed + * ximagesrc: clear flags on buffer reuse, so that flags like DISCONT aren't set accidentally + +Bugs fixed since 0.10.30: + + * 668320 : rtpmanager: RTCP receiver reports reveal full user name + * 652727 : multifilesrc: add ability to loop + * 657422 : [souphttpsrc] The souphttpsrc plugin doesn't work behind a proxy that requires authentication + * 432612 : [matroskamux] doesn't handle segments correctly + * 541215 : [avimux] Dirac muxing is broken and results in A/V sync issues + * 546932 : [ximagesrc] allow recording of specific window only + * 571400 : RTSP blocks in gst_element_set_state( GST_STATE_PAUSED ) and incorrect url + * 576524 : rtpbin, jitterbuffer: add mode to support for recording RTP streams + * 586450 : [cairotextoverlay] Forward upstream events to both sinkpads + * 595055 : [pulsesrc] Should implement GstStreamVolume interface + * 605834 : directsoundsink: 16-bit audio is always signed while 8-bit is always unsigned + * 610916 : rtspsrc dosen't work under windows + * 614803 : v4l2: add tv-norm property + * 616686 : multipartdemux: add " single-stream " property to emit no-more-pads earlier + * 616936 : [matroskademux] Incorrect display of subtitles with markup + * 619548 : qtdemux: Guess bitrate if only one stream's bitrate is unknown + * 619590 : [matroskademux] Doesn't protect segment and other fields from concurrent changes from different threads + * 620186 : qtdemux: Export max bitrate for AMR-NB/-WB streams + * 622412 : [rtpmp4vpay] remove send-config parameter; obsoleted by config-interval + * 624887 : pitivi playback hangs / errors while playing mov clips on clip change + * 630456 : [ximagesrc] Fallback to non-XShm mode if image allocation fails + * 631430 : [flvdemux] Cannot play .flv to the end + * 632504 : [rtspsrc] reduce or avoid (network) hang during shutdown + * 634093 : RTSP client asks for unicast from multicast only server + * 638300 : v4l2src: make this work more than once in a row + * 639217 : udpsrc: allow skip-first-bytes of full buffer size + * 640323 : [cairotextoverlay] forward new segment events from the sink to the source + * 643847 : deinterlace: Add support for deinterlacing using buffer caps/flags + * 644151 : [multifilesink] Add option to create a new file after each GstForceKeyUnit event + * 644154 : [matroskamux] Force a new cluster after each GstForceKeyUnit event + * 644512 : [auparse] Add seeking + * 647540 : autoaudiosink picks element to use by rank, but pulsesink/alsasink/jackaudiosink are all PRIMARY + * 648312 : [v4l2sink] Unconditionally accepts video/mpegts + * 648642 : rtpsession: Ensure ssrc collisions aren't timed out immediately + * 648937 : matroskademux: avoid building index when streamable + * 649067 : v4l2src: got unexpected frame size of 262254 instead of 614400 + * 649617 : [rtp] Deadlock and other fixes for rtpssrcdemux + * 649780 : flac: seek beyond end fails instead of EOSing immediately + * 649955 : flvmux: add support for mpegversion 2, which is also AAC + * 650258 : matroskademux/matroskaparse: gst_element_query_duration returns wrong value for Matroska files + * 650313 : ac3parse: Add support for iec61937 alignment + * 650503 : [dvdemux] Broken DURATION query handling + * 650555 : [aacparse] AAC profiles needed in caps + * 650691 : [flacparse] regression playing some flac files + * 650714 : [amrparse] skips first few frames (problem in checking sync) + * 650785 : [flacparse] duration query in DEFAULT format failing with flacparse in pipeline (regression) + * 650877 : matroska: refactor code common to matroskademux and matroskaparse + * 650912 : Rare leak in qtdemux + * 650916 : REGRESSION: ssrcdemux causing FLOW_NOT_LINKED + * 650937 : deinterlace: fix parameter type in trace + * 651059 : rtspsrc: uniform unknown message handling + * 651443 : multifilesink: add next-file=max-size mode and max-file-size property + * 652195 : matroskademux: seeking in non-finalized matroska files does not work correctly + * 652286 : matroskaparse: Gstreamer-CRITICAL when changing state from PAUSED to READY + * 652467 : matroska: missing < stdio.h > include for sscanf + * 653080 : matroskamux: make check for block_duration less sensitive + * 653091 : [dv1394src] Make the internal clock thread-safe + * 653327 : configure script for gst-plugins-good selects shout2 when it's not present + * 653559 : aacparse: too greedy minimum frame size + * 653709 : [ximagesrc] sets DISCONT on half the buffers + * 654175 : matroskademux: handle blocks with duration=0 + * 654379 : matroskamux: make default framerate optional per stream + * 654583 : Immediate RTCP in rtpsession + * 654585 : rtpmp4gdepay choppy sound + * 654744 : matroskademux: fix aspect ratio if header has only onle display variable set + * 654749 : goom: unbreak build on PPC on openbsd + * 654816 : [rtspsrc] rtspsrc doesn't get eos if it's wrapped into a bin + * 655530 : Logitech B990 HD Webcam yields poor video in MJPEG mode. + * 655570 : qtdemux: assertion error when playing Apple Trailers + * 655805 : Make the extended RTSP headers optional + * 655866 : jackaudiosink: Don't call g_alloca in jack_process_cb + * 655918 : qtdemux : qtdemux_add_fragmented_samples return error. + * 656104 : v4l2src fails to correctly configure the framerate + * 656606 : crash in gst_spectrum_reset_message_data() + * 656649 : flacparse: fix off by one in frame size check + * 656734 : [aacparse] Assumes 1024 samples per frame + * 657080 : aacparse: failing test due to two buffers being dropped for one sync loss + * 657179 : pulse: New pulseaudiosink element to handle format changes + * 657376 : rtspsrc regression + * 657830 : multiudpsink: make add/remove/clear/get-stats action signals + * 658178 : udpsrc: rough error reporting when using an invalid URI + * 658305 : [souphttpsrc] can’t seek during double speed playback + * 658419 : Add FIR support to rtpsession + * 658543 : [v4l2src] Use GST_RESOURCE_ERROR_BUSY if webcam is already used + * 658546 : ac3parse: RealAudio file with AC-3 audio no longer plays + * 659009 : [matroskademux] property for configuring gap handling + * 659065 : navseek: toggle pause/play on space bar + * 659153 : matroskademux: fix stuttering A/V + * 659237 : [gstrtpbin] clock is not unreffed after finish using it + * 659242 : [matroskademux] Unexpected EOS when seeking on paused matroska file + * 659798 : Segfault when you convert with audioconvert from audio file mkv to audio file avi + * 659808 : matroskademux: misc fixes + * 659837 : matroskamux: unable to mux audio/x-raw-int,rate=8000,channels=1,endianness=1234,width=16,depth=16,signed=true + * 659943 : [ac3parse] it does not correcly check for ac3/e-ac3 switch + * 660249 : won't play wav file: invalid WAV header (no fmt at start): ID32 + * 660275 : jpegdec doesn't implement upstream negotiation + * 660294 : goom2k1: Fix mingw compiler warnings + * 660448 : videomixer2: memory leak + * 660468 : speexenc: fix calculation of filler data size + * 660481 : v4l, ximagesrc: printf format warnings + * 660969 : qtmux memleak + * 661049 : matroskademux: support seek with start_type NONE + * 661215 : flacparse: fix last frame timestamp in fixed block size mode + * 661400 : rtpg722pay: G722 rtptime too fast + * 661477 : flvdemux: negative cts causes uint overflow, resulting in sinks waiting forever + * 661841 : [edgetv] video artifacts if videorate placed after edgetv + * 661874 : aacparse fails to forward caps to encoder + * 662856 : cairotextoverlay: add a 'silent' property to skip rendering + * 663186 : taginject is not gap aware + * 663334 : gst/flv/: add amfdefs.h to noinst_HEADERS + * 663580 : v4l2src negotiation failure with weird pixel-aspect-ratios + * 664548 : matroskaparse: memleak + * 664792 : Staircase effect in M-JPEG over RTP with unaligned image dimensions.. + * 664892 : [matroskademux] Doesn't set caps properly + * 665387 : v4l2src: fix stepwise enumeration ignoring the highest values + * 665412 : matroskamux: jpeg muxing regression + * 665502 : [flvdemux] broken a/v sync for some files + * 665666 : multifilesink: GstMultiFileSinkNext not documented + * 665872 : jackaudiosink, jackaudiosrc: add " client-name " property + * 665882 : gdkpixbufsink: " pixel-aspect-ratio " is the inverse of what it should be + * 665911 : Ability to specify ignore-length in wavparse + * 666361 : playbin2: regression: visualisations don't work with pulseaudiosink + * 666583 : matroskademux: too many bus messages in streamable mode + * 666602 : ac3parse: no valid frames found before end of stream (unexpected bsid=10) + * 666644 : udpsrc: infinite loop on dataless UDP packets + * 666688 : jpedec: peer_caps leak + * 666711 : rtspsrc: hostname lookup is not thread safe + * 667419 : matroskamux memleaks + * 667818 : osxvideo: Fix leak of NSOpenGLPixelFormat object + * 667820 : rtpptdemux: Plug potential pad leak. + * 667846 : rtph264depay: Exclude NALu size from payload length on truncated packets. + * 668648 : gst-plugins-good does not compile: cairo cannot find libgstvideo-0.10 + * 669455 : V4l2src can't open webcamstudio new vloopback + * 669590 : [shout2send] support webm streaming + * 670197 : v4l2src: webcam doesn't work due to fatal error when querying color balance attributes + * 650960 : flacparse makes decoded flac files start at sample offset 9215 + * 659947 : souphttpsink: rename to souphttpclientsink? + * 658659 : qtmux: Fix ctts entries for streams that don't start with timestamps from 0 + +Changes since 0.10.29: + + * work around GLib atomic ops API change + * better handling of malformed buffers in RTP depayloders + * some minor compilation fixes + +Bugs fixed since 0.10.29: + + + * 650470 : rtp: some depayloaders break with malformed rtp packets + * 652144 : udp: fix compiler warning on mingw-w64 + +Changes since 0.10.28: + + * audioparser: new amrparse, aacparse, ac3parse, flacparse, mpegaudioparse, dcaparse elements + * audiowsincband: Add new windowing functions: gaussian, cos and hann + * audiowsincband: Fix range of kernel elements (lim -> lim-1) + * audiowsinclimimt: Add new windows to high/low-pass filters: gaussian, cosine, hann + * audiowsinclimit: Fix range of kernel elements (lim -> lim-1) in high/low-pass filters + * avidemux: also add the frame-type for the stream index. + * avidemux, flvdemux: mark delta-units in the index + * avidemux: stream->current_total is accumulated byte size and not time + * avimux: add stream-format field to h264 pad template caps + * avimux: rework _request_new_pad to handle explict req-pad-names + * avimux: use running time for synchronization + * cairooverlay: Add generic Cairo overlay video element. + * debugutils: remove bitrotten negotiation element + * deinterlace: add support for NV12 and NV21 formats; fix greedyl method + * dvdemux: first try if upstream handles TIME seeks before handling them here and other event handling fixes + * flacdec: fix issues with large metadata blocks when streaming unframed flac + * flacenc: Add support for writing METADATA_BLOCK_PICTURE blocks for GST_TAG_IMAGE and GST_TAG_PREVIEW_IMAGE + * flacenc: Don't store image tags inside the vorbiscomments and the flac metadata + * flvdemux: add width, height and framerate to caps when present on onMetaData + * flvdemux: Do not build an index if upstream is not seekable + * flvdemux: fix deadlock on setting index on flvdemux + * flvmux: don't overwrite metadata tag with duration in streaming mode + * flvmux: don't set duration for live stream + * flvmux: use running time for synchronization + * flv: specify stream-format for h264 in the pad template caps + * icydemux: fix tag list handling issues that might have caused crashes + * j2kpay: skip EPH packets + * jitterbuffer: also estimate eos if very near eos + * jitterbuffer: avoid trying to buffer more than is available + * jitterbuffer: handle position query + * matroskademux: better calculation of output framerate + * matroskademux: properly resume cluster scanning + * matroskademux: pull mode should always report seekable + * matroskademux: set stream-format=byte-stream on h264 caps if there's no codec data + * matroskademux: store cluster positions provided by SeekHead + * matroskamux: add support for A-Law and µ-Law + * matroskamux: avoid building index when streamable + * matroskamux: use running time for stream synchronization + * matroskamux: add stream-format field to h264 pad template caps + * matroska: Use ARTIST Matroska tag instead of AUTHOR for GST_TAG_ARTIST + * matroskaparse: new element + * monoscope: stability (off-by-one) and memory leak fixes + * pngdec: handle 16-bit-per-channel images + * pulsesink: also uncork during EOS waiting (and after EOS is rendered) + * pulsesink: fix deadlock if connecting to PA fails + * pulsesink: release pa_shared_resource_mutex before pa_threaded_mainloop_wait + * qtdemux: Adds more h264 fields to its caps + * qtdemux: Add support for 2Vuy and r210 + * qtdemux: don't error out when there's a problem parsing non-vital headers + * qtdemux: avoid skipping exposing a stream following a removed stream + * qtdemux: Check for invalid (empty) classification info entity strings + * qtdemux: extract MusicBrainz tags + * qtdemux: mind rounding issues when converting from global time to mov time + * qtdemux: propagate error during expose_streams + * qtdemux: support some more mpeg-4 fourcc variants + * qtdemux: take configured start time into account + * isomp4: move mp4mux/3gppmux/qtmux from -bad to -good, rename qtdemux plugin to isomp4 + * rtpbin: Don't try to request the same request pad twice + * rtpbin: fix setting the SDES property + * rtpbin: Get and use the NTP time when receiving RTCP + * rtpmanager: ignore a BYE if it is sent with our internal SSRC + * rtpptdemux: Tag upstream custom events with payload type + * rtpsession: add action signal to request early RTCP + * rtpsession: add "rtcp-min-interval" property for minimum interval between Regular RTCP messages + * rtpsession: Don't relay more than one PLI request per RTT + * rtpsession: Emit "on-ssrc-validated" when validating by RTCP + * rtpsession: Emit signal on incoming RTCP feedback packet + * rtpsession: Emit signal when sending a compound RTCP packet + * rtpsession: Implement sending PLI packets in response to GstForceKeyUnit + * rtpsession: Number of active sources should be updated whenever the status of the source changes to active + * rtpsession: Send GstForceKeyUnit event in response to received RTCP PLI + * rtpsource: Retain RTCP Feedback packets for a specified amount of time + * rtpssrcdemux: Tag upstream custom events with SSRC + * rtpssrcdemux: Unknown SSRC is not fatal + * rtpspeexpay: Do not transmit samples with GAP flag + * rtptheoradepay: Request new keyframe on lost packets + * rtpvrawpay: add support for interlaced video + * rtspsrc: distribute new base_time to manager children following flush seek + * rtspsrc: handle * control correctly + * rtspsrc: improve recovery from failed seek + * spectrum: miscellaneous optimisations, add multi-channel support + * speexdec: Always process the number of frames per packet as specified in the header + * speexdec: get and use streamheader from the caps if possible + * speexenc: Use speex intern silence detection + * theorapay: handle 0-sized packets (which are repeat frames) + * udpsink: warn when packet is too large + * v4l2: Add PJPG mapping + * v4l2: fix interlaced set_format configuration + * v4l2: new v4l2radio element to control analog radio devices + * videobalance: fix handling of YUV images with 'odd' widths + * videoflip: add support for YUY2, UVYV and YVYU + * videoflip: fix invalid memory access for odd resolutions and Y422 + * videomixer2: Add transparent background option for alpha channel formats + * videomixer: Add transparent background option for alpha channel formats + * videomixer: Fix argb/rgba overlay orc code + * wavparse: tune output max buffer size to material + +Bugs fixed since 0.10.28: + + * 564122 : Crash in monoscope_update + * 432612 : [matroskamux] doesn't handle segments correctly + * 593482 : Spectrum: Multi-Channel support and Stereo to Mono compat report(cross-correlation) + * 595520 : Implement a generic cairo overlay + * 622553 : rtpmanager: Implement RFC 4585 (AVPF / early feedback) + * 636699 : [PLUGIN-MOVE] qtmux: move to -good + * 639994 : videomixer2: added 'transparent' background option + * 640118 : v4l2: add element to control radio devices + * 640163 : rtspsrc: minor leak + * 640249 : [taginject] Taginject does not allow to change tags after init + * 640483 : flvdemux: Video's width, height and/or framerate src caps added when present on onMetaData + * 640542 : matroskamux leaks memory after reset + * 641330 : icydemux: crash while playing MP3 stream in amarok + * 641332 : can't connect vorbisenc ! queue ! matroskamux + * 641400 : [deinterlace] Handle image caps without asserting + * 641827 : rtptheorapay: doesn't handle 0-size packets + * 642205 : qtdemux: extract MusicBrainz tags + * 642337 : [souphttpsrc] Add support for URI queries + * 642412 : gstrtpbin with ignore-pt tries to use NULL stream- > demux during uninitialization + * 642691 : deinterlace: Miscellaneous cleanup + * 642879 : qtmux: add a 'variant' with the bare video/quicktime media type + * 642961 : NV12 colorspace support for deinterlace plugin + * 642963 : [dvdemux] time based upstream seek + * 643087 : pulsesink: deadlock in gst_pulseringbuffer_open_device + * 643981 : [cairooverlay] example uses gtk/gtk-x11 unnecessarily + * 644288 : generic/states check fails + * 644477 : [jack] doesn't build with jack > = 0.120.2 + * 644510 : pulsesink: deadlock when create/connect fails + * 644669 : gstspeexdec causes 'Conditional jump depends on uninitialised value' + * 644773 : Add support for Y422 colorspaces in videoflip element + * 644849 : [speexdec] Remove warning message when it is inappropriate + * 644875 : [matroskademux] can't read the ARTIST tag in a Matroska file + * 645858 : [flvdemux] memory leak when demuxing infinite FLV files + * 645961 : [pulsesink] hangs when going from paused to playing near EOS + * 646397 : rtpjitterbuffer base_time broken by commit f84b8a69 + * 646474 : rtpspeexpay should drop empty samples + * 646567 : [matroska] Add alaw/mulaw audio support + * 646800 : rtspsrc: control attribute on the session and not on the media + * 646954 : rtpgstpay: declare frag_offset to hold 32 bits + * 646964 : rtpmanager: ignore a BYE if it is sent with our internal SSRC + * 646965 : rtpmanager: Number of active sources should be updated whenever the status of the source changes to active + * 646966 : rtpssrcdemux: Unknown SSRC is not fatal + * 646967 : rtpsession: make iterate_internal_links MT-safe + * 646999 : [regression] pulsesink: underruns while playing WMA + * 647263 : REGRESSION: rtpsession: fix wrongly applied patch + * 647510 : audiowsinclimit uses the wrong limits for the range of the kernel elements + * 647511 : add other common windows to low/high-pass filters in audiowsinclimit.c + * 647659 : mp3parse / mpegaudioparse fails to detect VBRI header in mpeg1 mono and mpeg2 files + * 647833 : matroskademux: bad at guessing the framerate + * 647848 : Failure to compile with GCC 4.6.x due to variable unused but set warnings being treated as errors + * 647919 : qtmux: silently corrupts h264 streams with legacy caps + * 648004 : [quicktime] Rename plugin library to quicktime too + * 648160 : Remove half-complete bits of RTCP FIR support + * 648589 : jpegdec: documentation typo " jpegddec " + * 649060 : flvmux: overwrites metadata tags with duration in streamable=false mode + * 649449 : [gppmux] Failure to write location + * 566769 : [flacdec] crash in push mode with large header packet (image) + * 644730 : [matroskamux] Should return TRUE in the event function when the event is handled + +Changes since 0.10.27: + + * Fix build issue with new kernels (with the old video4linux1 interface header removed) + +Bugs fixed since 0.10.27: + + * 643716 : v4l2src: fails to build with newer kernels: ./v4l2_calls.h:33: fatal error: linux/videodev.h: No such file or directory + +Changes since 0.10.26: + + * avidemux: add workaround for buggy list size; extract datetime tags + * cacasink: fix masks and strides + * deinterlace: change the default to linear + * deinterlace: avoid infinite loop draining + * deinterlace: rewrite/fix how neighboring scan lines are calculated + * flvdemux: use aac codec-data to adjust samplerate if needed + * flvmux: Fix for nellymoser codecid setting + * icydemux: Add 'StreamUrl' metadata as GST_TAG_HOMEPAGE tag + * id3demux: fix parsing of ID3v2.4 genre frames with multiple genres + * imagefreeze: pass along eos if received before buffer arrives + * jpegdec: add "max-errors" property to ignore decoding errors + * jpegdec: avoid infinite loop when resyncing; discard incomplete image + * matroskademux: add stream-format and alignment properties for h264 + * matroskademux: assume matroska if no doctype is specified + * matroskademux: increase allowed max. block size for push mode from 10M to 15M + * matroskademux: normalize empty Cues to no Cues + * matroskamux: add support for DTS and E-AC3 audio + * matroskamux: try to write timestamps in all the outgoing buffers + * multifilesink: send stream headers in key-frame mode + * multiudpsink: add buffer-size property + * navseek: add basic support to change playback rate + * pulsemixer: Implement MIXER_FLAG_AUTO_NOTIFICATIONS + * pulsesink: flush remaining buffered samples on EOS + * pulsesink: make corking during pause synchronous; don't uncork in _start + * pulsesink: Uncork stream while flushing the ringbuffer + * pulsesrc: add "client" property + * qtdemux: add support for fragmented mp4 + * qtdemux: add support for (E)AC-3, WMA and VC-1 audio + * qtdemux: allow pulling atoms with unknown size + * qtdemux: fix flow return aggregation and handling of near end-of-file corner cases + * qtdemux: parse and use creation time tag from mvhd + * rtpbin: copy buffering stats + * rtpbin: correctly calculate RTCP packet size + * rtp: fix rank of payloaders and depayloaders + * rtp: flush state on flush-stop for seek handling for many (de)payloaders + * rtp ac3pay: add AC3 payloader + * rtp h264depay: determine output h264 layout using caps negotiation + * rtp h264pay: implement full bytestream scan mode + * rtp j2kdepay: add support for buffer lists; make depayloader more resilient + * rtp j2kpay: use buffer lists for better performance + * rtp j2kpay: handle EOC correctly; stop scanning when we reached the end + * rtp j2kpay: use SOP markers to split bitstream + * rtp jitterbuffer: provide a clock; get better buffering level + * rtp jpegdepay: fix framerate parsing for locales that use a comma as floating point + * rtp mp4adepay: improve timestamps on outgoing packets + * rtpsession: also emit RTCP activity on SR + * rtpsession: remember last sent RB values + * rtspsrc: add and use auto buffering mode + * rtspsrc: degrade gracefully upon failing seek and tweak QUERY_SEEKING response + * rtspsrc: include range request for all streams with non-aggregate control + * rtspsrc: increase udp buffer size + * rtspsrc: reset session manager base time when flushing + * rtspsrc: select multicast transports in a smarter way + * souphttpsrc: don't send seeks behind the end of file to the server + * v4l2sink: add navigation support; properties to control crop + * vrawdepay: fix length check + * wavparse: detect DTS advertised as PCM correctly in some more cases + * ximagesrc: change from XGetImage to XGetSubImage dependant on a property + +Bugs fixed since 0.10.26: + + * 596321 : qtdemux: add support for fragmented MP4 and " mfra " boxes + * 618389 : [pulsemixer] Should implement MIXER_FLAG_AUTO_NOTIFICATIONS interface + * 618652 : [effectv] Use of uninitialised value in unit test + * 620283 : Support for Adobe's F4F missing + * 621929 : [PLUGIN-MOVE] move jack plugin from -bad to -good + * 623178 : [matroskademux] error message for unrecognised FOURCC codes should be improved + * 625825 : cannot link rtpmp4adepay ! aacparse + * 629418 : progressreport: add support for determining stream position from buffer timestamps instead of using queries + * 631516 : [navseek] Add support to change playback rate + * 632654 : [matroskamux] try to write timestamps in most of the outgoing buffers + * 632897 : flvmux does not set the correct nellymoser codec id + * 633280 : [icydemux][PATCH] icydemux: Send 'StreamUrl' metadata as GST_TAG_HOMEPAGE tag + * 634314 : pngdec hangs on faulty pngs + * 634391 : [v4l2src] add interlaced field to caps + * 634393 : v4l2src: Set top field first for interlaced captures + * 634910 : [rtph264pay] Implement bytestream scan mode + * 634928 : [qtdemux] report creation/modification time via metadata tag + * 635734 : jpegdec: infinite loop when playing back motion jpeg stream + * 636049 : ximagesrc: fix remote X and off by ones + * 636172 : imagefreeze: eos is not passed before a buffer arrives + * 636234 : [wavparse] dts 6ch played as stereo 16 bit pcm if DTS frame starts at non-zero offset + * 636621 : flvdemux: doesn't set the right sample rate for aac audio + * 636784 : [qtdemux] GST_QUERY_CONVERT implementation for qtdemux + * 637060 : matroskademux: errors out on 13MB blocks when streaming + * 637686 : [jpegenc] Improve sinkpad getcaps results + * 638019 : [matroskademux] some matroska files are not specifying DocType + * 638072 : build failure: rtpsource.c: error: 'have_rb' may be used uninitialized in this function + * 638535 : id3demux: multiple genres as per ID3v2.4 not supported correctly + * 638569 : cacasink crashes when given 15-bit video. + * 639240 : pulsesink: PLAYING- > PAUSED- > PLAYING transition causes dropout + * 639321 : deinterlace: field{1,3} scanline pointers seem to be off by one field line + * 639339 : v4l2: fails to build with older kernels due to missing V4L_FIELD_INTERLACED_{TB,BT} + * 639516 : muxers: fix setting src pad caps + * 639740 : [pulsesink] doesn't uncork in some cases during reverse playback + * 640028 : [qtdemux] crash on malformed mov stream + * 640063 : rtph264depay: leaks codec data buffer in byte-stream=false mode + * 640064 : rtspsrc memory leak + * 640080 : rtspsrc: fails to error out properly on network failure + * 623063 : [jpegdec] add " max-errors " property + +Changes since 0.10.25: + + * alphacolor: make passthrough work + * avidemux: reverse playback fixes; prevent overlap of subsequent fragments + * deinterlace: remove assembly code in favor of orc + * dvdemux: parse SMPTE time codes + * flvdemux: parse and use cts (fixes jittery H.264 playback in some cases) + * flvmux: resend onMetada tag when tags changes in streamable mode + * g729pay: extend from right parent + * gconf: Don't install schemas when GConf is disabled + * goom, goom2k1: add latency compensation code, report latency correctly + * gstrtpjpegpay: Added Define Restart Interval (DRI) Marker + * h264depay: always mark the codec_data as keyframe + * icydemux: forward tag events + * id3v2mux: Add mapping for album artist + * imagefreeze: generate a perfectly timestamped stream + * level: avoid division by zero on silence + * matroskademux: more robustness for parse errors and corner-cases + * matroskademux: extract H.264 profile and level and set on caps + * matroskamux: reduce newsegment event spam and set discont flag where needed + * pulse: allow setting of pulse stream properties + * pulse: fix device_description in READY + * pulsesink: Add "client" property to set the PA client name + * pulsesink: share the PA context between all clients with the same name + * qtdemux: export AAC/MPEG-4/H.264 profile and level in caps + * rtp: add G722 payloader and depayloader elements + * rtpamr(de)pay: support AMR-WB SID frame + * rtpamrpay: proper duration for multiple frame payload; properly support perfect-rtptime + * rtpbin: add "ntp-sync" property and "use-pipeline-clock" properties + * rtpg729pay: properly support perfect-rtptime + * rtph264depay: only set delta unit on all-non-key units + * rtpmanager: provide additional statistics + * rtpmp4adepay: grab the sampling rate and put into caps + * rtpmparobustdepay: properly insert dummy buffers; use valid bitrate for dummy frame + * rtpmpvpay: fix timestamping of rtp buffers + * rtpsession: Add the option to auto-discover the RTP bandwidth + * rtpsession: Calculate RTCP bandwidth as a fraction of the RTP bandwidth + * rtpsession: Count sent RTCP packets after they have been finished + * rtpsession: relax third-party collision detection + * rtpstats: Rectify description of current_time in RTPArrivalStats + * rtspext: stop configuration on first failure + * rtspsrc: Add property to configure udpsrc buffer size + * rtspsrc: add rtsp-sdp protocol support + * rtspsrc: don't add /UDP in the transport, it's the default + * rtspsrc: fix duration reporting + * rtspsrc: handle stale digest authentication session data + * rtspsrc: use sdp uri parse method + * shapewipe: add optional border parameter and slowdown animation + * shapewipe: Force format to AYUV in the example pipeline for the same reason + * shapewipe: Force the input to AYUV to prevent negotiation failures in videomixer + * spectrum: only aggregate magnitude/phase if user asks for it, performance fixes + * v4l2src: add controllable colorbalance parameters, add decimate property + * v4l2src: fix using mpegts via the mmap interface; use GstBaseSrc::block-size as fallback size + * videomixer2: new videomixer2 element that behaves better than videomixer + * vrawdepay: handle invalid payload better + +Bugs fixed since 0.10.25: + + * 625825 : cannot link rtpmp4adepay ! aacparse + * 629047 : segfault in seek matroskademux + * 537544 : [pulse] allow setting pa context properties + * 628996 : pulsesink broken after shared context patch (bug #624338) + * 529672 : Big latency and bad framerate while mixing multiple live streams + * 581294 : rtspext: extensions configure_stream methods conflict + * 598915 : qtdemux: propagate jpeg2000 header data in image/x-j2c + * 612313 : qtdemux: Post AAC profile/level in caps + * 616521 : qtdemux: Export MPEG-4 video profile and level in stream caps + * 617318 : matroskademux, qtdemux: Use pbutils for H.264 profile/level extraction + * 620790 : [matroskademux] general stream error when trying to play certain .mkv file + * 622390 : [v4l2] add controllable color balance properties / programmable camera + * 624338 : [pulsesink] Handle pulse context separate from the ringbuffers and share them + * 625547 : imagefreeze unit test fails occasionally + * 626048 : [videomixer] needs mode that syncs streams based on timestamps + * 626518 : [imagefreeze] better caps negotiation + * 627162 : [pulse] better fallback return value for gst_pulse_client_name() + * 627174 : [pulsesink] new property to tune the PA client name + * 627289 : souphttpsrc: tweak error messages + * 627341 : wavparse: strange handling of files less than 12 bytes + * 627796 : rtpbin: add ntp clock sync + * 628020 : [pulsesink] assertion failure in change_state NULL- > READY + * 628058 : Need a way to set the SO_RCVBUF property on rtsp-based sockets. + * 628127 : jpeg rtp payloader crashes when there is corruption in the jpeg byte stream. + * 628214 : Add support to RTSP initiation through SDP files + * 628349 : [v4l2src] Doesn't support capturing mpegts using mmap + * 628454 : Matroska demuxer doesn't handle DATE tag if it contains only a year number + * 628608 : [alphacolor] element classification is wrong + * 629018 : rtpjpegpay: unable to build because of uninitialized variable warning + * 629522 : [rtpjpegpay] add support for Define Restart Interval (DRI) + * 629839 : [qtdemux] Update xmp tags parsing + * 629896 : Error compiling raw1394 (without iec61883) + * 630088 : [flvdemux] jerky h.264 video playback + * 630205 : [icydemux] Forward tag events downstrem + * 630256 : rtph264-pay/depay: doesn't respect timestamps from incomming buffers + * 630317 : Getting pulsesink device names doesn't work like for alsasink + * 630378 : speexenc/speexdec crash with MSVC + * 630446 : rtpmanager: provide additional statistics + * 630447 : rtpsession: relax third-party collision detection + * 630449 : rtpbin: Unlock before adding pad in new_payload_found + * 630451 : rtpbin: Handle rysnc of iterator when looking for free pad name + * 630452 : rtpbin: Make cleaning up sources in rtp_session_on_timeout MT safe + * 630457 : rtpmanager: packet lost should not be a warning. + * 630458 : level: avoid division by zero on silence + * 630500 : [rtspsrc] does rtsp setup message always need " /UDP " string? + * 630888 : v4l2sink does not cope with v4l2loopback kernel module + * 631082 : rtpjitterbuffer: improve document reference + * 631303 : [goom] qos warnings if source is GstAudioSrc + * 631330 : [flvmux][PATCH] Resend updated onMetada tag when tags changes in streamable mode + * 631996 : [h264depay] regression: rtsp://stream.zoovision.com/KibaEp1n900.3gp + * 632548 : [rtspsrc] regression; fails to report duration + * 632553 : --disable-gconf still tries to install schemas + * 632682 : [matroskademux] Handle missing CodecPrivate for Vorbis/Theora + * 632945 : rtph264depay in access-unit=true mode does not aggregate the delta unit flag correctly + * 633205 : Fix for navigation events in videoflip + * 633212 : [goom] Return not-negotiated when bps is unknown + * 633970 : [icydemux] broken taglist handling + * 635532 : rtspsrc: unexpected eos when using authentication (regression) + * 635843 : [rtph264depay] segfault on empty payload + * 636179 : [deinterlace] Fields in wrong order + * 626463 : [matroskademux] " reading large block of size 14688496 not supported " + * 628894 : [matroskademux] sloppy reverse playback + * 633294 : deinterlace breaks some DVD menu scenarios + +Changes since 0.10.24: + + * v4l2src: massive performance improvement in many cases + * streaming mode fixes for avi and matroska/webm + * seeking in matroska and webm files that don't have an index + * new cpureport element for debugging + * avidemux: improve VBR audio stream handling + * avidemux: streaming mode fixes: use proper offset for movi-based index, handle 0-size data chunks + * debugutils: new element cpureport, posts "cpu-report" element messages on bus + * flacdec, rtspsrc, rtph264pay, rtpmp4vdepay: memory leak fixes + * gconfvideosrc: use correct GConf key (ie. not the audiosrc key) + * gdkpixbuf: remove gdkpixbuf3 plugin again, gdk-pixbuf was split out of gtk+ and will stay at 2.x + * id3v2mux: write beats-per-minute tag using TBPM frame + * jpegdec: fix markers parsing regression + * matroskademux: do not error out on a block with unknown tracknumber + * matroskademux: fix streaming in case where the size in bytes is unknown + * matroskademux: handle bogus files storing ADTS AAC data + * matroskademux: support seeking in local files even if they don't have an index + * matroskamux: don't try to seek back and fix up headers if streamable=TRUE + * pulsesink: fix race when creating multiple pulsesinks at the same time + * qtdemux: also calculate PAR using track width and height for QT files + * qtdemux: fix the max/avg in btrt atom reading + * qtdemux: improve reverse playback + * qtdemux: parse 64-bit version of mvhd atom as well instead of erroring out + * qtdemux: prevent reading past avc1 atom when parsing + * rtpg729pay: avoid basertppayload perfect-rtptime mode + * rtph263pdepay: allow more clock-rates as input + * rtpL16depay: also parse encoding-params for the number of channels + * rtpL16depay: default to 1 channel if number of channels not specified + * rtpmp4gpay: implement perfect timestamps + * rtspsrc: add "port-range" property, useful for setups with firewall/ipsec + * rtspsrc: don't reuse udp sockets (avoids odd errors when data from previous streams is received) + * udpsrc: add "reuse" property to enable or disable port reuse (enabled by default, but disabled in rtspsrc) + * v4l2: sort formats in the right order so that non-emulated formats are prefered + * videobalance: fix wrong locking order that could lead to a deadlock + * videomixer: only reset QoS information and send a NEWSEGMENT event downstream for NEWSEGMENT events on the master pad + +Bugs fixed since 0.10.24: + + * 626463 : [matroskademux] " reading large block of size 14688496 not supported " + * 593117 : [avidemux] Support AVF files + * 618535 : [avidemux] fails to stream eva_2010_2.22_promo1.avi + * 621520 : [id3v2mux] write beats-per-minute tag + * 622017 : [GstRtpMP4GDepay] Packet payload was too short. + * 622577 : rtspsrc has confusing error messages + * 623209 : bug in rtpL16depay + * 623357 : avidemux: push mode doesn't work for some http streaming avi files + * 623629 : Reverse Playback Issue in QtDemux + * 624173 : [qtdemux] qt file with dimension data in tkhd does not get pixel-aspect-ratio in caps + * 624331 : videobalance: deadlocks/freezes when changing " brightness " property + * 624455 : The matroska muxer seeks even when used with streamable=TRUE + * 624770 : rtspsrc: memory leak in gst_rtspsrc_handle_request + * 625002 : [examples] Don't use GdkDraw + * 625153 : rtspsrc: add property to set client port range + * 625302 : [qtdemux] Set the pixel-aspect-ratio field also for par=1/1 + * 625371 : [matroskademux] critical warnings when playing live webm with progressive download enabled + * 625442 : pulsesink: crash - pa_threaded_mainloop_stop is called from the pa thread + * 625452 : [videomixer] Pipeline from the docs doesn't work anymore + * 626467 : matroskademux: CRITICAL **: file matroska-demux.c: line 578 (gst_matroska_demux_get_length): should not be reached + * 626609 : [qtdemux] segfault when parsing avc1 atom + * 626619 : [imagefreeze] Incorrect seek behaviour + * 627689 : [deinterlace] Broken timestamps + * 617368 : [matroska] Implement push-mode seeking and non-cue seeking + +Changes since 0.10.23: + + * Use Orc (Optimized Inner Loops Runtime Compiler) for SIMD and + other optimisations, and remove liboil dependency. The main goal + for this release was to make the transition from liboil to liborc. + Performance improvements should not be expected and will be the + focus of future versions. liborc is an optional dependency for + the time being, to make it possible to test and develop the very + latest GStreamer versions on systems that don't have orc yet. + However, without orc slow unoptimised backup code will be used + for many performance critical code paths. Distributors are urged + to package and ship the latest version of liborc and compile + GStreamer modules with --enable-orc. Please do not distribute + GStreamer packages that are not orc enabled. More information on + the orc integration can be found in the docs/design/ directory. + * alpha: add "prefer-passthrough" property to allow passthrough mode + * avidemux: improve audio vbr detection + * cmmlenc: Remove hack to let oggmux start a new page for every CMML buffer + * deinterlace: add mmx implementations of greedyh for UYVY; orcify some deinterlacing methods + * dv1394: fix the internal clock even more + * flvmux: add "streamable" property + * flvmux: write duration at the correct position + * gdkpixbuf: Add a gdkpixbuf3 plugin that uses gdkpixbuf3 + * jpegdec: improved parsing, and better buffer handling that minimises memcpys + * jpegdec, jpegenc: add grayscale support + * matroskademux: QoS fixes and improvements; reverse playback improvements + * matroskademux: handle zero-sized numbers correctly + * matroskamux: add "streamable" property; set streamheaders on output caps + * matroskamux: try harder to make sure clusters start with a key frame + * matroskamux: mark output buffers properly as keyframe or delta unit + * matroskamux: do some write caching to avoid newsegment events before each output buffer + * matroskamux: fix some timestamp drift caused by rounding errors + * pngenc: Support 8 bit grayscale + * pulsesink: optimize communication with PulseAudio using pa_stream_begin_write + * pulsesink: Post provide-clock message on the bus if the clock appears/disappears + * rtph264depay: consider SPS, PPS and IDR as keyframe, all others as DELTA_UNIT + * rtph264pay: handle short startcodes in the h264 bytestream + * rtpjitterbuffer: stop buffering and emit EOS at the end of a stream + * rtpmparobustdepay: add mpa-robust depayloader + * rtpmp4gdepay: calculate the frame duration correctly + * rtptheorapay: keep announcing the delivery-method in the capabilities, restores + compatibility with older farsight versions again + * rtspsrc: respect aggregate control attributes; try all ranges from the sdp + * spectrum: support 24-bit width and arbitrary bit depth + * udp: make url parsing compatible with VLC syntax + * udpsrc: fix multicast support on windows + * v4l2sink: destroy buffer pool when changing state to NULL + * videobox: fix negotiation for I420/YV12 + * videomixer: don't mix input with different pixel aspect ratios; negotiation fixes + * wavparse: proper closing segment construction when doing non-flushing seeks + * wavparse: use typefind functions to check if PCM data contains dts stream + +Bugs fixed since 0.10.23: + + * 619045 : [spectrum] Add support for 24-bit width and all depth combinations + * 555967 : [oss4] clarify some translation strings + * 570761 : [goom] crash in plugin_info_init allocating 260kB struct on stack + * 583047 : [jpegdec] optimise buffer handling when parsing frames + * 589997 : [rtp] need mpa-robust depayloader for helix-style MP3-DRAFT-00 + * 595978 : [udpsrc] failed to play a multicast stream + * 597695 : [udpsrc] support VLC-style udp://239.255.11.11:1234 uri with bind address + * 611117 : [matroskademux] can't handle unknown cluster sizes + * 613066 : [flvmux] re-enable renamed/fixed is-live property + * 615461 : dv1394src clock continues to be broken + * 617339 : pulsesink doesn't make use of pa_stream_begin_write + * 618530 : [videomixer] Doesn't handle pixel-aspect-ratio correctly + * 618871 : 1394: remove useless last_time + * 618982 : [wavparse] wrong closing segment when doing non-flushing seek + * 619198 : [matroskademux] GstEbmlRead cleanup + * 619273 : [matroskamux] reduce downstream spam + * 619293 : [avimux] clean up avi header creation code + * 619531 : [rtspsrc] embedded asx streams' rtsp server doesn't like gstreamer request + * 619717 : unit tests fail if older -good plugins are present in system plugin directory + * 619824 : Use glib for checksumming + * 619848 : [deinterlace] can't switch properties on running pipeline + * 620148 : [videomixer] Doesn't negotiate format with downstream + * 620154 : [rtph264depay] Seeking with RTP payloaders corrupts images sometimes + * 620162 : [gdkpixbufdec] Bump rank to SECONDARY + * 620277 : [pulsesink] custom clock is still used after NULL state change + * 620358 : [matroskademux] Sorenson Squish WebM output seeking issues + * 620390 : rtph264pay doesn't understand short startcodes + * 620494 : [rtsp] stuttery audio with some h264/aac streams + * 620540 : [pulsesink] pa_stream_write() failed: Invalid argument + * 620591 : rtpceltpay doesn't handle stereo celt audio + * 620743 : matroskademux: refactor delta unit handling + * 620929 : Required libraw1394 version is not high enough + * 621510 : GNOME Goal: Remove deprecated glib symbols + * 621566 : [pulsesink] since upgrading plugins sound is garbled via Amarok + * 621723 : v4l2src crashes on PLAYING- > READY- > PLAYING + * 622498 : [avidemux] Doesn't reset all state when going back to READY + * 622500 : [v4l2sink] destroy open buffers when changing to NULL + * 622501 : [videobox] may negotiate input/output format combinations it can't actually handle + * 622816 : Make demos -DSEAL safe + * 623103 : matroskamux dispose error + * 623172 : [jpegdec] leak in unit test + * 623196 : rtpptdemux: don't send custom downstream event twice + * 623366 : [qtdemux] strip out bogus tags from XMP + * 623379 : [flvmux] Writing duration outside the allocated memory area in streaming mode + * 623585 : jpegdec: fails to skip extra 0xff markers at start + * 623654 : qtdemux: Fix order of bitrates in 'btrt' atom + * 619817 : [matroskademux] Reverse playback doesn't work + * 617512 : [alpha] should work in passthrough in all formats if alpha == 1.0 + * 619485 : matroskademux: skip buffers before a late keyframe (QoS) + * 413942 : [wavparse] undetected dts-in-wav + +Changes since 0.10.22: + + * alpha: add support for YUY2, YVYU, UYVY and YV12; YUV->RGB conversion fixes + * avimux, flvmux, matroskamux: don't crash if tags arrive on multiple input pads at the same time + * avimux, matroskamux: add support for On2 VP8 + * capssetter: element moved from gst-plugins-bad + * deinterlace: add support for most YUV and RGB formats for some methods + * deinterlace: make automatic detection of interlacing the default + * gamma: add support for more YUV/RGB formats, make gamma property controllable + * jpegdec, jpegenc: support more colour spaces and pixel formats + * matroskademux: implement push mode seeking + * matroskademux: add support for WebM + * imagefreeze: plugin moved from gst-plugins-bad + * oss4: plugin moved from gst-plugins-bad + * osxvideosink: implement the xoverlay interface, allow switching views at runtime + * qcelpdepay: add a QCELP depayloader + * qtdemux: add support for VP8; push-mode seeking and ctts table parsing fixes + * rtph263depay: use Picture Start Code to detect packet loss and frame start + * rtph263pay: use found GOBs to apply Mode A payloading + * rtph264depay: DELTA_UNIT marking of output buffers + * rtph264pay: extract SPS and PPS from property provided parameter set + * rtph264pay: add config-interval property to re-send SPS/PPS in stream + * rtpmp4vpay: add config-interval property to re-insert config in stream + * rtptheoradepay: fix in-band configuration parsing + * rtptheorapay: add config-interval parameter to re-insert config in stream + * rtpvorbisdepay, rtptheoradepay: also accept in-line configuration + * rtsp: configure bandwidth properties in the session + * rtspsrc: fall back to SDP ports instead of server_port + * rtspsrc: use the SDP connection info in multicast + * rtspsrc: handle SEEKING queries + * smptealpha: add support for all 4 ARGB formats and YV12 (converted to AYUV) + * videobalance: add support for all RGB formats, Y41B, Y42B and Y444, YUY2, UYVY, AYUV and YVYU + * videobox: add support for Y444, Y42B, Y41B, YUY2, UYUV, and YVYU + * videobox: fix floating point to integer conversion for the alpha values + * videobox: handle ranges/lists of width or height when transforming caps + * videobox: translate navigation events to make sense again upstream + * videofilter: merge gamma, videobalance, and videoflip plugin into single plu + * videoflip: add support for all RGB formats and AYUV, Y41B, Y42B and Y444 + * videoflip: also flip the pixel-aspect-ratio if width/height are exchanged + * videomixer: add support for Y444, Y42B, Y41B, YV12, YUY2, YVYU, UYVY + * webmmux: Add new webmmux element that only supports muxing of WebM + * y4menc: add 4:2:2, 4:1:1, and 4:4:4 output support + +Bugs fixed since 0.10.22: + + * 619485 : matroskademux: skip buffers before a late keyframe (QoS) + * 576286 : [videomixer] Should accept/output non-alpha streams + * 618349 : osxvideosink: implement the XOverlay interface + * 574416 : rtp{theora,vorbis}depay should accept in-line configuration (too) + * 590662 : [pulse] Allocates and starts pulse main loops in instance_init + * 592270 : Cannot catch 'have-ns-view' on pipeline for playbin and playbin2 + * 599585 : gstrtph263pay does not fragment frame with limited GOBs + * 600553 : [jpegdec] crashes on a fuzzed jpeg + * 606689 : Re-send codec data on GstForceKeyUnit + * 607452 : Failure to sync on rtpmp4vpay stream; sender;receiver mismatch + * 609405 : [qtdemux] Issues when seeking with file with lots of tracks and edit lists + * 609658 : [rtph264depay] doesn't mark output frames as keyframes correctly + * 610172 : inconsistent h263pay/h263depay behaviour + * 610902 : y4menc only supports 4:2:0 + * 613786 : [PLUGIN-MOVE] Move imagefreeze to gst-plugins-good + * 614305 : [PLUGIN-MOVE] oss4 should be moved to good + * 614765 : racy stream status leave implementation + * 615798 : [smptealpha] Need ability to reverse transition direction + * 616516 : [qtdemux] h264 playback gets skippy after a seek + * 616700 : [rtspsrc] gst_query_new_seeking() fails on rtspsrc + * 617164 : [rtph264pay] SPS/PPS in provided sprop-parameter-sets never sent on timeout + * 617537 : rtspsrc always falls back to unicast instead of using the announced multicast + * 617733 : [wavparse] handle gst_pad_pull_range() returning less data than requested + * 617739 : [PLUGIN-MOVE] Move capssetter to gst-plugins-good + * 618305 : [flvmux] last timestamp is stored even if it's invalid + * 618351 : avimux crashes when fed from filesrc + * 618386 : rtptheoradepay: make delivery-method parameter optional + * 618419 : gstrtpbin-Description maybe exist error + * 618733 : [efence] Configure check is broken + * 618874 : [pulse] regression: broken mainloop locking + * 618940 : rtptheorapay/depay wrongly claims to do delivery-method=inline + * 619018 : Speex encoder latency should depend on rate + * 619103 : WebM demuxer + * 619105 : [qtdemux] misalignment between index and sample while looking for frame + * 619219 : [matroska] Move webm muxer into a separate element with restrictions + * 619835 : [videobox] Either makes video completely opaque or completely transparent + * 619943 : [jpegenc] Crash if playing - > setcaps - > ready - > setcaps + * 620002 : [flvdemux] Typo in position query handling makes all position queries fail + * 605231 : [deinterlace] Support AYUV, RGB colorspaces + * 619533 : [avimux, matroskamux, flvmux] crash when receiving tags on multiple pads at the same time + +Changes since 0.10.21: + + * alpha: add support for different color matrixes + * alpha: add support for generating ARGB output + * alpha: add support for ARGB, RGB and xRGB input + * alphacolor: support inplace and on-the-fly conversions from AYUV to ARGB + * alphacolor: Implement color-matrix support and use integer arithmetic only + * videobox: add support for most common RGB(A), (A)YUV, and grayscale formats + * videobox: add support for on-the-fly conversions for some formats + * videobox: add support for filling the background with red, yellow and white + * videobox: add support for YV12, including conversion support for I420/AYUV + * videomixer: add support for ABGR and RGBA + * shapewipe: add support for the remaining ARGB formats + * qtdemux, matroska: export h.264 profile and level in caps + * multifilesink: Add key-frame option to next-file + * directsoundsink: Implement SPDIF support for AC3 + * h264depay: handle STAPs properly + * speexdec: adapt to new oggdemux + * flvdemux: mark delta frames properly + * flvdemux: improve index building and scaning in pull mode + * flvdemux: add support for backwards playback (when operating in pull mode) + * avidemux: fix offset handling in push mode seeking + * matroskademux: prefer index of video track to perform seeking + * matroskademux: add support for backwards playback (when operating in pull mode) + * matroskademux: push correctly sized flac header buffers + * matroskademux: restrict resyncing to subtitle tracks + * rtpsession: Make it possible to favor new sources in case of SSRC conflict + * rtspsrc: send keep alive when paused + * rtspsrc: handle ipv6 listening ports when needed + * rtspsrc: require a destination for multicast + * rtspsrc: parse connection information + * qtdemux: Set stream-format=raw on AAC caps + * qtdemux: add XMP parsing support + * qtdemux: Read replaygain peak/gain tags + * qtdemux: extract stream language in more cases + * id3demux: fix parsing of unsynced frames with data length indicator + * jpegdec: don't crash if jpeg image contains more than three components + * ximagesrc: send new segment event in TIME format + * mp4gdepay: improve constantDuration guessing + * h264pay: fix config-interval property + * rtspsrc: add property to control the buffering method + * png: make work with libpng 1.4 + +Bugs fixed since 0.10.21: + + * 517588 : [avidemux] Allow seeking in push mode + * 593910 : [dv1394src] live streaming / clock issues + * 597739 : Test suite not slow-machine-safe(?) + * 601236 : [flvmux] script tag with index gets written at end of file, contains all tags + * 601617 : matroska-demuxer triggers an assert in gststructure.c + * 604870 : [udpsink] Can't set TTL socket option + * 607615 : Make it possible to favor new sources in case of SSRC conflict + * 610447 : [flvdemux] Be more flexible in script tag (metadata) parsing + * 611659 : [ximagesrc] should send new_segment with GST_FORMAT_TIME format + * 612397 : [multiudpsink] [PATCH] Fix print of socket's error code on Windows + * 612411 : [rtspsrc] lock/performance problem + * 612553 : Segfault in rtspsrc (tcp interleaved and local gst-rtsp-server) + * 612657 : [rtph264depay] refuse caps without profile-level-id when byte-stream is unset + * 612696 : rtspsrc with tcp timeouts after recent commit + * 612700 : pngenc can't be built against libpng 1.4.x anymore + * 612751 : [udpsink] regression when external sockfd is used + * 612777 : Deprecated macro in gstspeexdec.c causes compile error in MSVC + * 613002 : [flvmux] always put duration in metadata tag + * 613003 : [flvmux] EOS after supposedly reaching FLV timestamp limit, but real limit is lower + * 613013 : rtph264pay does not insert config parameters anymore in the stream + * 613094 : [flvmux] put more info (like width and height) in the metadata + * 613206 : [rtph264depay] wrong timestamp for gst_base_rtp_depayload_push_ts? + * 613663 : New warnings in osx plugins + * 613789 : [jpegenc] Updating caps is not supported + * 614158 : [id3demux] doesn't read tags from file correctly (tag with unsynced frames, data length indicator) + * 614353 : matroskademux: can't correctly demux flac-in-MKV + * 614354 : fix small compile break if $(top_srcdir) != $(top_builddir) + * 614460 : matroskademux: wrong H.264 demux in some file + * 614466 : videomixer makes some formats grayscale + * 614471 : [qtdemux] Gstreamer not reading replaygain tags from m4a files + * 614651 : Export h.264 profile and level in caps + * 614765 : racy stream status leave implementation + * 614842 : [jpegenc] sink pad returns ANY (not subset of its template) when connected to a filesink + * 614843 : [alphacolor] unneeded variable + * 614927 : qtdemux: Post avg/max bitrate tags for H.264 + * 615051 : h264depay: STAP are handled the wrong way + * 615143 : [videobox] I420- > AYUV conversion broken + * 615161 : Remove -Wundef from CFLAGS + * 615460 : [deinterlace] broken ... + * 615996 : doesn't detect HAVE_CPU_I386 or HAVE_CPU_X86_64 properly on Solaris + * 615998 : GOOM plugin crashes on Solaris when built with MMX code enabled + * 616166 : [videobox] Use correct order for RGB filling + * 616409 : [videomixer] AYUV blending broken + * 611986 : [cairotextoverlay] Out-of-range deltas give SIGSEGV or other funkyness + * 604106 : [jpegdec] Crash in jpeg_idct_ifast if more than 3 components + * 614001 : [qtdemux] parse Macintosh language codes + * 615793 : [flactag] when used after flacenc: gst_adapter_take_buffer: assertion `nbytes > 0' + +Changes since 0.10.20: + + * y4menc commit reverted, since it broke make check (new release since this was + only discovered after the 0.10.20 tarball had already been uploaded). + +Changes since 0.10.19: + + * Fixes for RTP h263 depayloader timestamping regressions that broke video calls + * Fixes for FLAC decoder when FLAC is embedded in a container such as Ogg or Matroska + * y4menc now supports more YUV pixel layouts + * rtpsource: bitrate estimation improvements + * rtspsrc, udp: multicast fixes + +Bugs fixed since 0.10.19: + + * 532117 : [matroskamux] Doesn't update the track duration + * 610959 : [flacdec] certain flac-in-ogg file only plays after long delay + * 611213 : [rtpsource] estimate bitrate on receiver side + * 612154 : rtph263depay removes all timestamps from outgoing buffers + +Changes since 0.10.18: + + * shapewipe: moved from -bad to -good + * avidemux: push mode seeking support + * avidemux: drop video frames up to the desired keyframe after a seek + * configure: cross-compilation fixes (use $PKG_CONFIG instead of pkg-config) + * dvdepay: don't output frames until we have a header, fixes crash + * flacdec: fix tag extraction in push mode + * flvdemux: obtain the index from the end of an flv file in push mode + * flvdemux: audio tags without any content are valid; indexing improvements + * jpegdec: fix invalid memory access in parser + * jitterbuffer: new buffering modes: low/high watermark buffering, rtp timestamps + * matroskademux: seeking/segment fixes (esp. regression with gnonlin) + * matroskademux: subtitle stream improvements (advance sparse streams in smaller steps) + * multipartdemux: improve header mime-type parsing + * qtdemux: fix ALAC codec-data handling; handle signed values in 3GPP location tag + * qtdemux: fix frame rate cap regression; fix sample durations corner-case + * qtdemux: Use the correct duration when comparing segments + * pulsesink: avoid segfault when shutting down + * pulsesink: return previous mute state if sink is not active at the moment + * rtpbin: change how NTP time is calculated in RTCP, generating more accurate NTP timestamps if the system clock is synchronised with NTP or similar + * rtpmp4gdepay: avoid division by 0 in corner case + * v4l2sink: change rank to NONE so we don't try to autoplug it + * videomixer: fix timestamping problems for input streams with different lengths + * videomixer: fix problem when used with gnonlin (always send FLUSH_STOP) + +Bugs fixed since 0.10.18: + + * 584536 : [PLUGIN-MOVE] Move shapewipe to -good + * 587304 : [jitterbuffer] don't handle correctly data burst from udpsrc + * 599292 : Synchronizing two RTP streams from different devices using RTCP is inaccurate. + * 604711 : Handling of mime type in multipartdemux + * 608026 : [videomixer] timestamping problems + * 608843 : [flacdec] Can't read tags in push mode + * 610004 : GST_CXXFLAGS should contain GST_CFLAGS + * 610053 : matroska fails to build with Sun Studio + * 610238 : Avoid an assertion in the rtspsrc element which abort the client application + * 610265 : gstrtpmp4gdepay issuing a SIGFPE crashing an application + * 610280 : [qtdemux] issue with corrupted 3gp file + * 610296 : [qtdemux] Confusion with gst/qt segments + * 610337 : pulsesink: gst_pulsesink_get_mute: set result earlier. + * 610483 : [jpegdec] invalid memory access + * 610556 : Memory violation when starting to decode a running DV PAL RTP stream + * 610839 : Unable to cross compile gst-plugins-good + * 610894 : send FLUSH_STOP after FLUSH_START in videomixer + * 611501 : [regression] matroskademux fails to output anything on some seeks + * 609724 : Add translator comment for %s in pulsesink + +Changes since 0.10.17: + + * v4l2src: implement GstURIHandler interface + * matroskamux: make index size configurable + * matroskademux: support push based mode + * matroskademux: improve stream synchronization + * flacdec: fix possible hanging in pull mode seeking + * flacdec: use a single decoder field for both push and pull mode + * flacenc: optionally add a seek table + * rtp: add BroadcomVoice payloader and depayloader + * rtp: add G.723 payloader and depayloader + * rtph264pay: add option to insert PPS/SPS in streams + * rtph264depay: optionally merge NALUs into Access Units + * rtspsrc: add user-id and user-pw properties; fix major memory leak + * avimux: many fixes, also better compatibility with Windows Media Player + * avidemux: per-stream index parsing (= much faster startup) + * qtdemux: progressive download support / seeking in push mode + * qtdemux: per sample parsing (= much faster start up) + * wavenc: Post warning if file hasn't been finalised properly + * videomixer: MMX optimisations and other improvements; implement basic QoS + * matroska, qtdemux, id3demux: fix language code writing and extraction + +Bugs fixed since 0.10.17: + + * 609405 : [qtdemux] Issues when seeking with file with lots of tracks and edit lists + * 503582 : [avidemux] Extract date tag (contained in the IDIT chunk) + * 351595 : [flacenc] write seek tables + * 505823 : [matroskademux] language tags have wrong iso code + * 515073 : [goom] Update to goom2k4 + * 539858 : not enough NEWSEGMENT events from matroskademux + * 554839 : [rtpbin] Automaticaly remove pads + * 582575 : [rtph263depay] dropping only part of key frames on lost fragmets + * 583367 : gstrtpL16pay ignores max-ptime property + * 583985 : [matroskamux] make index size configurable + * 587323 : rtpmp4vpay does not payload mp4v stream depayloaded with rtpmp4vdepay + * 593354 : rtpjitterbuffer sometimes outputs packets with timestamps in the past + * 595265 : SDES handling in RTPSource + * 597497 : can't play a redirecting .mov file via playbin + * 597823 : Add rtpg723pay plugin + * 599300 : [qtdemux] Doesn't populate video bitrate field + * 601143 : v4l2src: add GstURIHandler interface + * 601242 : [flvmux] ECMA array with file index lacks final 0x09 byte + * 601728 : [rtspsrc] Add username/password properties + * 602231 : Deadlock between rtpjitterbuffer and gstrtpbin + * 602508 : qtdemux: Parse stbl atom per sample instead of all at once + * 602887 : shout2send element won't change from PLAYING state to NULL + * 602940 : jitterbuffer is racy determining basetime + * 603376 : rtpsession : g_type_create_instance performance issue : avoid buffer ref + * 603471 : [flacdec] not timestamping output buffers + * 603547 : shout2send plugin sends data too fast + * 603779 : [ladspa] Remove ladspa plugin code + * 604352 : [rganalysis] miscomputes timestamps + * 604611 : [qtdemux] Provides invalid ALAC codec data + * 604679 : videomixer MMX code doesn't build on fedora12 + * 604814 : videomixer make error + * 604872 : [udpsink] Add missing 'gssize len' parameter to g_convert() + * 604913 : rtph264pay/NALU/rtph264depay + * 605222 : Mobile Youtube RTSP streams time out at EOS + * 605269 : [shout2][patch] Setting public flag + * 605447 : Unable to play Real Audio stream for radioBERLIN. + * 605882 : rtpg723pay is incorrect + * 606198 : rtph264pay is causing alignment trap on ARM arch + * 606438 : multiudpsink: warningfixes for windows + * 606692 : Incorrect Center Frequency For Band3 + * 606807 : audioamplify: allow negative amplifications + * 607353 : rtph264pay & base: Don't crash if the other side specifies the profile-level-id + * 607440 : [wavenc] should post warning if the file isn't finished properly on pipeline shutting down + * 607718 : [qtdemux] Infinite loop doing negative rate playback for single audio stream + * 607949 : [avidemux] regression in stop position for mp3 streams + * 608209 : [videomixer] blend_mmx.h:173: Error: can't encode register '%ah' in an instruction requiring REX prefix + * 608255 : [speex] speexenc crash and leaks in rtpspeexpay and speexdec + * 608268 : [flvmux] index timestamps should be in seconds, not milliseconds + * 608629 : [pngdec] png_set_gray_1_2_4_to_8() removed in libpng > = 1.4.0 + * 608671 : [mkv] issues when seeking + * 608990 : [qtdemux] Segment start timestamps can be broken + * 609107 : [qtdemux] Unknown atoms should also be skipped when looking for moov + * 598610 : [matroskademux] Support push mode operation + * 594381 : audiofirfilter: Implement FFT convolution + +Changes since 0.10.16: + + * RTP improvements + * Support automatic cropping in videobox + * Add TTL multicast UDP property + * AVI demux push mode fixes and performance improvements + * Support large and unusual chunks sizes in wav + * Quicktime demuxer improvements + * JPEG decode fixes and speedups + * Support interlaced Y4M file output + * DV demuxer improvements + * Pulseaudio fixes and improvements + * Support Pulseaudio PLAY/PAUSE requests + * speexdec improvements + * FLV demuxer improvements + * Fix audio noise in the Equalizer plugin, and other improvements + * Fix compilation on OS/X Snow Leopard + * AVI muxer fixes + * Support MPEG V4L2 devices and improve timestamping + * Better jpeg2k support + * Many other bug fixes and improvements + +Bugs fixed since 0.10.16: + + * 597848 : " Media Player Classic " won't play certain files produced by avimux. + * 588245 : TTL is never applied with udpsink/udpmultisink + * 368681 : avimux + vbr lame always out of sync + * 458629 : [avidemux] high memory usage for many index entries + * 561825 : Problem with RTCP thread using freed objects + * 581334 : [qtdemux] Add support for embedded subtitles + * 582238 : [videobox] Add support for autocrop to caps + * 590362 : [v4l2src] x264enc ! qtmux fails because of missing frame duration + * 591713 : [y4menc] interlaced support + * 593354 : rtpjitterbuffer sometimes outputs packets with timestamps in the past + * 593391 : [rtpsession] : rtp_session_on_timeout : Invalid read of size 4 + * 593688 : effectv can no longer be compiled with gcc 3 + * 593757 : [qtdemux] Lack of support for QualComm PureVoice + * 593764 : [v4l2src] format ordering: put emulated formats behind native formats + * 593955 : rtpjitterbuffer: clock_rate can change between its check and its use + * 594039 : missing unref in rtpsource / leak + * 594133 : [rtspsrc] leaks authentication info + * 594247 : missing math.h include in rtpjpegdepay + * 594248 : Use locked-state on internal rtp-bin to avoid shutdown-state-race + * 594251 : Avoid throwing out reordered packets with the same timestamp + * 594253 : jitterbuf: Only post a warning of clock-rate changed if it is changed from something initialized + * 594254 : propagate the pt-type-changed signal + * 594283 : rtpbin: make free_session() remove dangling stream references + * 594298 : Check if libsoup has SSL support before running HTTPS test in souphttpsrc testsuite + * 594490 : gstrtpbin always uses pt to demux + * 594520 : multipartmux: mark data buffer as delta-unit + * 594599 : videobox: converts AYUV to I420 incorrectly + * 594663 : Patch for multifilesink + * 594691 : rtph263pay: leak + * 595029 : pulse elements fail to connect to pulse 0.9.9 + * 595220 : gstreamer crashes on pulseaudio latency change + * 595231 : [pulsesink] Lowers volume after every new track + * 595888 : qtdemux plugin should not return value from void function + * 595897 : Problem linking videomixer + * 595942 : [qtdemux] issue with corrupted 3gp file + * 596319 : [qtdemux] fails to parse pixel aspect ratio data + * 597091 : [flvdemux] not outputting no-more-pads causes playbin2 to fail badly on streamed single-stream flv + * 597214 : [avidemux] Fix printf formats to avoid warnings in avidemux + * 597348 : [qtdemux] Cast variables passed to printf to avoid warnings about incorrect formats + * 597351 : [jpegdec] segfaults on a specific picture + * 597397 : equalizer is non deterministic + * 597463 : [pulsesrc] has no lower bound for fragment size + * 597601 : [pulsesink] needs to take control of minreq value + * 597730 : osssrc rank should be secondary, just like osssink + * 597847 : Windows Media Player won't play large files produced by avimux + * 597867 : Plugins good do not build on Ubuntu Hardy (kernel 2.6.24) + * 598377 : rtpmanager: only forward the lost event to the last seen payloadnumber + * 598517 : [jpegdec] Regression supporting 4:2:2 jpeg videos + * 598810 : wavenc: Fix buffer offset by moving length incrementation + * 598933 : [pulse] Fix the StreamVolume interface not being advertised + * 601381 : v4l2: Make sure to initialize variables before using them + +Changes since 0.10.15: + + * Moved rtpmanager from -bad to -good + * Implement SEEKING query in more demuxers and decoders (notably mkv, flv, flac) + * avimux: adds support to WMA/WMV + * cairo: Add cairo-based PDF/PS/SVG encoder element (cairorender) + * dv1394src: fix element for live usage + * effectv: new elements: rippletv, streaktv, radioactv, optv + * flacdec: fix intermittent FLAC__STREAM_DECODER_ABORTED errors when seeking + * flacenc: fix issue with broken duration / sample count into flac header in some cases + * flvmux: lots of fixes and improvements + * id3demux: fix parsing of unsync'ed ID3 v2.4 tags and frames + * matroska: add kate subtitle support, add/improve WMA/WMV handling and read bluray PGS subpicture streams + * multipartdemux: support more mime types, do proper flow aggregation + * pulsesrc: cleanups, report real latency, set the default slave method to skew + * qtdemux: support for agsm, misc. tag reading fixes + * rtp: new QDM2 and CELT depayloaders; fix SVQ3 depayloader and make it autopluggable + * souphttpsrc: Only assume seekability if the server provides Content-Length + * v4l2: add v4l2sink element, open device in NULL->READY, optional gudev support + * v4l2src: fix 'hang' with some cameras caused by bad timestamping if no framerate is available + * videomixer: add RGB format support; fix I420 blending + +Bugs fixed since 0.10.15: + + * 331420 : No PDF/PostScript/SVG encoder in GStreamer yet. + * 499242 : [patch] workaround the broken tags encoding for mp3 files + * 521625 : [plugin-move] move rtpmanager from -bad to -good + * 560033 : [v4l2src] returns caps with a range where max == min + * 564100 : [avidemux] premature EOS streaming mjpeg file with JUNK tags + * 564501 : [rtph264pay] bytestream scan mode operation is not reliable + * 567983 : [avidemux] SAMPLE.AVI fails to play in push mode + * 577017 : Videomixer blend bgra and ayuv + * 577318 : rtspsrc appears to be leaking memory + * 578052 : gstavidemux: support seeking and duration query in default format + * 578166 : libgstwaveform, gstwaveformsink.c " BYTE " instead of " byte " + * 578612 : [flacdec] seek on flac file sometimes triggers flac decoder ABORT + * 580214 : Equalizer starts distorting the sound after a while. + * 580732 : AVIMUX needs mappings for Windows Media codecs + * 582153 : rtpmp4vpay does not payload mp4v stream depayloaded with rtpmp4vdepay + * 582169 : [multipartdemux] Segmentation fault on empty content + * 582462 : souphttpsrc should set caps for " audio/L16 " mime_type + * 583593 : Updates for SunAudio plugin + * 583640 : [v4lsrc/v4l2src] add support for better device detection with libgudev + * 584455 : [flacenc] sometimes writes broken flac files + * 584613 : rtpvrawpay seems to produce fixed-length packets padded with random data + * 585205 : [rtpmp4gdepay?] Unable to play audio from one specific radio station stream + * 585361 : [gstwaveformsink.c] 'byte' is not defined in MSVCRT + * 585559 : buffer-list support for rtph264pay, rtpjpegpay and rtpmp4vpay + * 585576 : [souphttpsrc] initially reports all servers as seekable + * 585630 : [PATCH] Don't try to test flacdec if it's not build + * 585699 : GNOME Goal: Remove deprecated glib symbols + * 585757 : Remove deprecated GTK+ symbols from unused code + * 585828 : audioamplify should support more formats + * 585831 : audioamplify should support no clipping + * 586397 : gstudpnetutils.h fails to build on FreeBSD + * 587426 : non fast-start mov files fail to play from http locations + * 587680 : rtp/ts does not repackage cleanly to rtp; mpegvideoparse/rtpmpvpay: timing issues + * 587826 : gstavidemux.c: s/GST_DISABLE_DEBUG/GST_DISABLE_GST_DEBUG + * 587982 : [udp] uninitialized variable in gst_udp_get_addr function + * 587983 : [avidemux] assert format failed + * 588148 : [id3demux] APIC tag not found mp3 file + * 588349 : [effectv] Add new optv effect filter + * 588359 : [effectv] Add radioactv effect filter + * 588368 : [effectv] Add streaktv effect filter + * 588483 : [flacenc] write padding metadata block + * 588695 : [effectv] Add rippletv effect filter + * 588777 : [souphttpsrc] don't try to authenticate if no username/password is set + * 589056 : [qtdemux] no audio in videos from Aiptek camera + * 589365 : [pulsesink] pa_stream_get_sink_input_info() failed: Invalid argument + * 589423 : [flacdec] Implement SEEKING query + * 589424 : [flvdemux] Implement SEEKING query + * 589459 : [pulsesink] Fix a couple error messages that mentioned incorrect function names. + * 590038 : pulsesink: pa_timing_info- > configured_sink_usec requires pulse 0.9.11 + * 590280 : [v4l2] add v4l2sink + * 590401 : GstPulseSrc's pulse probe is not initialized correctly + * 590447 : [flvmux] crashes when writing index with < = 128 entries + * 590970 : [souphttpsrc] better fix for compiler warning fix + * 591451 : [v4l2] causes hanging stream when VIDIOC_G_PARM is not supported + * 591476 : Possible leak in rtpbin + * 591712 : [dvdec] sets top field first not bottom field first on pal interlaced content + * 591747 : [v4l2src] should clear formats list when it closes the device + * 591951 : pipelines/simple-launch-lines check segfaults with libjpeg 7 + * 592232 : [qtdemux] QT style string tag extraction fails + * 592530 : Get only glitches and noise trying to play a gsm file + * 593015 : pa_stream_flush() seems to cause sync issues + * 585911 : matroskademux seems to leak large amounts of memory when seeking (skipping) + * 576378 : [matroskamux] add support for WMA2 and WMV2 + * 564437 : rtpjpegdepay was unable to handle frame dimensions greater than 2040 + * 582515 : Quicktime file with PCM audio does not play correctly + * 583048 : [patch] jpegdec: support for larger pictures + * 583371 : pulsesink: Print message on underflows + * 583803 : pngdec: mismatched g_malloc/free + * 584981 : Gstreamer wavparse Could not demultiplex stream + * 585056 : regression: no more sound in my H.264+AAC clips + * 585549 : Add RTP blocksize functionality to rtspsrc element + * 585842 : Support for GstBufferList in gstmultiudpsink + + +Changes since 0.10.14: + + * Some fixes for seeking in wav and FLAC files + * Faster seeking in Matroska and AVI files + * RTSP and RTP improvements + * directdrawsink moved to Bad + * y4menc and flvmux/flvdemux moved from Bad + * deinterlace2 moved from Bad, replacing deinterlace + * Many bug fixes and improvements + * Pulseaudio sink completely overhauled + +Bugs fixed since 0.10.14: + + * 572551 : mpeg4videoparse fails to extract codec_data from this net... + * 577318 : rtspsrc appears to be leaking memory + * 576286 : [videomixer] Should accept/output non-alpha streams + * 581333 : rtspsrc: request_pt_map in gstrtspsrc.c fails to return c... + * 478092 : gstid3v2mux.cc:deprecated conversion from string constant... + * 486915 : [videomixer] segmentation fault on gst-inspect + * 509311 : [rtph263pay] rtph263pay does not follow rfc2190 + * 516031 : flac within ogg container can't be played on Jokosher + * 537537 : [pulse] Latency issues + * 537609 : RTSP - rtspsrc module support for Scale header + * 552650 : [rtspsrc] (partially) fails SETUP with MS RTSP servers + * 562168 : Good plugins' configury overloads --disable-debug + * 563574 : v4l2src should capture in non-blocking mode + * 567140 : G726 Packetizer issue for 24kbps & 40 kbps datarate + * 567857 : [udpsrc] loop on gst_poll_wait when POLLERR because of icmp + * 570781 : [alawdec] spews ERROR debug messages on shutdown/seek/not... + * 571153 : [pulsemixer] compiler warnings (on ARM) + * 571321 : gconfvideo{src,sink} don't disconnect gconf notifications + * 572256 : gst/avi/gstavidemux.c: Alignment trap in gst_avi_demux_pa... + * 572358 : law encoders _getcaps ignore rate/channel if not both are... + * 572413 : [jpegenc] crashes if no input format has been set + * 573173 : Added Quicktime HTTP tunneling to the RTSP src element + * 573342 : Unconditioned EAFNOSUPPORT in gstudpnetutils.c + * 573343 : Type mismatches in gstdirectdrawsink.c + * 573721 : [PLUGIN-MOVE] move directdrawsink back to -bad + * 573737 : [PLUGIN-MOVE] Move FLV to -good + * 574270 : [rtspsrc] Range request is wrong (should say: npt=now-) + * 574275 : flacdec ! appsink with a seek seems to drop the first buffer + * 577468 : [id3demux] Frames not extracted if tag is unsynchronised + * 577609 : [id3v2mux] write RVA2 frames for peak/gain volume data + * 577671 : [rtspsrc] deadlock on shutdown (locking order problem?) + * 578052 : gstavidemux: support seeking and duration query in defaul... + * 578135 : [qtdemux] missing 3gpp Asset metadata handling + * 578310 : [matroskamux] - Should suppport speex + * 579070 : [sunaudio] fix compiler warnings + * 579422 : flacdec can block allocating before it sent a new-segment + * 579808 : [jpegdec] Doesn't support additional 0xff before end marker + * 580746 : [qtdemux] 3GPP classification entity byte order reversed + * 580783 : [PLUGIN-MOVE] Move y4menc to -good + * 580851 : rtspsrc: various; sanity of ranges, setting of base_time ... + * 580880 : gstrtpjpegpay is not functioning properly; rtp jpeg paylo... + * 581329 : rtspsrc: NAT dummy packets not being sent + * 581568 : ability for replaygain plugin to post level messages + * 581806 : [souphttpsrc] Should allow overriding the referer + * 581884 : [PLUGIN-MOVE] Move deinterlace2 to gst-plugins-good + * 582252 : rganalysis test broken by recent commit + * 582281 : [rtp] Forgets to link to $(LIBM) + * 582387 : [avidemux] Seeking regression + * 582420 : flacdec unit test broken on PPC + * 582661 : [deinterlace] Fix latency query to return unbound max lat... + * 582715 : gcc warnings about unitialized + * 582753 : flacdec check fails + * 582794 : rganalysis unit test fails with git core + * 568278 : [qtdemux] add support for vob subtitle streams + * 569611 : GStreamer videobox element draws thin green lines on edge... + * 571294 : [matroskamux] Should ignore framerate of 0/1 + * 574169 : avidemux/theoradec don't work well together + * 575234 : Network interface selection for multicasting with the udp... + * 576729 : [rtspsrc] perform EOS handling earlier + * 578257 : Image problems using rtpjpeg(de)pay + * 579069 : rtp h263pay build fixes + * 580554 : PATCH: qtdemux: fix demuxing of m4v streams with ac-3 audio + * 581432 : [multipartdemux] source pads are leaked + * 581444 : [multipartdemux] free memory read of buffer timestamp + * 582218 : Uninitialized variable may be used in gstavidemux.c + * 575937 : udp/gstudpnetutils.c: ip_mreqn unavailable on Solaris (an... + + +Changes since 0.10.13: + + * Add autodetect source elements + * Improvements in RTP payload/depayload and RTSP + * Support float input in wav, and require depth == width + * Support inverted RGB video in avi + * Compilation fixes and smarter format selection in V4L2 support + * Use libv4l when available + * Don't install static plugin libraries any more + * Matroska muxing: Add Dirac, fix AAC + * Improve qtdemux segment handling + * Add presets to equalizer + * OS/X video and audio output improvements + * Rework Pulseaudio audio output + * Support basic and digest auth in souphttpsrc + * Use libsoup-gnome instead of libsoup when available + * DV demuxer fixes + * New IIR and FIR base classes and echo filter in audiofx plugin + * Improved spectrum analysis plugin + * 8 bit greyscale support in v4l2src and videocrop + * New aspectratiocrop element + * Many other bug fixes and improvements + +Bugs fixed since 0.10.13: + + * 561502 : Not-negociated error in udpsrc + * 522183 : add preset suport to gstequalizer + * 523813 : [autodetect] add autovideosrc and autoaudiosrc + * 557709 : goom should have license headers in all source files + * 560155 : segfault when trying to set tag to NULL with avimux + * 527951 : [new element] aspectratiocrop + * 529379 : RTSP seeks when pipeline is in STATE_PAUSED + * 532409 : RTP payload/depayloader for G.729 + * 537539 : [pulse] Rhythmbox starts using 100% of CPU time when puls... + * 537540 : [pulse] Causes a deadlock when the pulseserver dies + * 537543 : [pulse] sink/src should have " volume " property (was GstMi... + * 545033 : [v4l2src] Add support for camera specific formats + * 552140 : [soup] use libsoup-gnome for proxy configuration if avail... + * 556019 : Add the ability to make souphttpsrc act as a live source + * 556484 : Implement getcaps in rtpL16pay + * 556641 : rtpL16depay doesn't support multichannel audio + * 556802 : Misspelled messages + * 556955 : [videocrop] fails to renegotiate + * 556986 : pulsesink deadlocks when raising an error + * 557260 : [equalizer] Calculates coefficients for every buffer + * 557293 : Argument type mismatch on Windows + * 557294 : cross mingw32 gcc: getaddrinfo is not in ws2_32.dll befor... + * 557710 : Memory leak related to matroskamux's request pads + * 558427 : rtpmpapay/depay are too wide + * 558638 : Compiler error on v4l2 + * 558711 : gst-plugins-good-0.10.11 compile fails + * 559288 : [qtdemux] deadly embrace! + * 559545 : rtspsrc could not receive data from RTSP server because o... + * 559547 : Seek bugs when playing rtsp video in m.youtube.com + * 560641 : rtp mp4 payloader doesn't flush the last frame upon EOS + * 560756 : New Plugin: JPEG RTP Payloader + * 561625 : Rtspsrc set segment's last_stop incorrectly + * 561775 : souphttpsrc patch to support basic and digest authentication + * 561802 : DLNA specific HTTP header missing + * 561990 : qtdemux build fails on mingw due to missing definition of... + * 562434 : [wavenc] Add support for a-law and mu-law encoded wav files + * 562572 : multiudpsink handles errors in _render() too aggressively + * 563414 : Fix for SunAudioMixer plugin + * 563504 : add libv4l2 support to v4l2 gst plugin - required for mos... + * 563509 : [rtp_data_test] Complains about negotiation errors with m... + * 563510 : [videocrop] 1x1 unit test fails + * 564437 : rtpjpegdepay was unable to handle frame dimensions greate... + * 564948 : Fix and clean up osxaudio + * 565850 : mov files can contain xvid, fmp4 and ac3 tracks + * 566616 : v4l2src: b/w support + * 566843 : [pulse] Terminating an audio stream hangs the application + * 567577 : [audiofx] Add generic IIR/FIR audio filter elements + * 567642 : spectrum element has undocumented arbitrary limitation on... + * 567746 : fix for 547227 created a ref loop + * 567794 : [PATCH] Rework pulse plugin + * 567800 : Mp4 created by Avidemux don't play. + * 567853 : osxaudiosrc does not build on 10.4 + * 567874 : [audiofx] Echo/Reverb filter + * 567955 : [spectrum] Need compensation for rounding errors + * 567992 : [videocrop] wrong mouse navigation commands while cropping + * 568395 : [audiofx] Rename audioreverb to audioecho + * 568780 : elements/videocrop check fails + * 568809 : Patch needed for building gst-plugins-good 0.10.13 on Sol... + * 569820 : In some cases v4l2src element does not return correct norm + * 570343 : equalizer bands != specified parameters + * 570435 : Read Title element of Matroska files + * 571038 : [osxvideosink] build fail + * 571150 : aspectratiocrop : Memory leak + * 571153 : [pulsemixer] compiler warnings (on ARM) + * 571204 : [pulsesink] PA assertion failure triggers abort + * 570581 : osxvideosink: non-embedded mode is badly broken and shoul... + * 341752 : [rtspsrc] 500 Internal Server Error response with tagessc... + * 420658 : gconfaudiosink is not behaving normally + * 558554 : [avidemux] avidemux not recognizing certain uncompressed ... + * 561580 : GStreamer does not play a specific WAV file + * 563056 : " rtpjpegdepay ! jpegdec " doesnt works + * 565441 : Smoke encoder doesn't set caps correctly + * 567952 : videocrop: add b/w support + +Changes since 0.10.12: + + * Fix bad autopoint substitution in the po subdir + +Changes since 0.10.11: + + * Fix for security advisory TKADV2009-0xx + +Changes since 0.10.10: + + * HDV capture support + * Port flactag element to 0.10 + * Support FLAC in alternate bit-depths and more samplerates + * Matroska muxing improvements + * Support Google RTSP variant + * Many other bug-fixes and improvements + +Bugs fixed since 0.10.10: + + * 545433 : [wavparse] support tempo tag + * 311586 : Matroska mux/demux don't support flac + * 350830 : [raw1394] Add HDV support + * 413841 : [flactag] needs porting to 0.10.x + * 536067 : [matroska] Add support for real audio/video + * 537361 : videomixer segment handler fail + * 543101 : The udpsrc/udpsink/multiudpsink/dynudpsink elements may l... + * 544956 : [videobox] segfault when changing properties at running p... + * 545463 : autodetect plugin links to gconf, unnecessarily + * 545710 : [rtspsrc] : create rtp/rtcp socket pair + same port for d... + * 546465 : can't play m.youtube.com rtsp streams + * 547075 : [speex] Encoder doesn't handle non-zero start timestamps ... + * 547217 : Implement GstPropertyProbe interface on pulsesrc for dete... + * 547227 : Implement GstPropertyProbe interface on pulsesink for det... + * 547518 : pulsemixer probe fails after device property is set + * 547519 : Add device-name property to pulsesrc + * 548530 : wavenc allows audio depth of 25 + * 548831 : matroska demuxer setting incorrect timestamps + * 549073 : buffer_alloc function from new basetransform sometimes fa... + * 549090 : v4l2src has no property named norm but notifies it + * 549551 : conversion of gst structure names to mime types in multip... + * 549784 : Memory Corruption Probing v4l2src with Video4Linux1 device + * 550015 : build failure: gstcmmlparser.c:115: error: format not a s... + * 550791 : [flacenc] files are too big, mid-side-stereo=true should ... + * 551048 : rtsp implementation sends PAUSE even when server doesn't ... + * 551570 : plugin ximagesrc is memory leaking... + * 551584 : Crash when modifying the videobox " top " and " left " live w... + * 552213 : [qtdemux] map tiff fourcc to image/tiff caps + * 553191 : udpsrc: bind() fails on OS X + * 554771 : totem spins CPU 100% while allocating (infinitely) becaus... + * 556010 : AVI muxer segfault + * 556381 : [icydemux] test fails with latest core + * 556424 : [avidemux] segmentation fault when creating indexes + * 557085 : [videobox] support dynamically changing properties + * 557610 : udpsrc fails to bind() on Mac OS X (IPv4 vs. IPv6 problem) + * 547842 : Vorbis RTP RFC 5215 is out + * 550288 : Sound not played - a quicktime file + +Changes since 0.10.9: + + * Move the libcdio cddasrc element to -ugly, because of the GPL license + +Bugs fixed since 0.10.9: + + * 413705 : [PLUGINS MOVE] gst-plugins-good contails GPL'ed libcdio p... + +Changes since 0.10.8: + + * Replaygain elements moved from Bad + * Interleave/Deinterleave elements moved from Bad + * Pulseaudio plugin http://pulseaudio.org is now integrated + * New simple Karaoke audio effect plugin + * Improvements in v4l2src + * Multi-channel FLAC file fixes + * AVI and Quicktime reverse playback support + * AVI and Matroska muxing improvements + * New element for rendering SMPTE transitions into alpha channels + * Many improvements in the Win32 directdraw elements + * Error out cleanly for encrypted streams + * RTP/UDP handling improvements + * RTSP digest authentatication implemented. + * New RTP Pay/Depay-loaders for Speex, G.729, DV & raw video/audio + * Error concealment for Speex + * Many other bug-fixes and enhancements + +Bugs fixed since 0.10.8: + + * 541787 : incorrect timestamp + * 413705 : [PLUGINS MOVE] gst-plugins-good contails GPL'ed libcdio p... + * 345393 : Missing documentation + * 400679 : [PLUGIN-MOVE] pulse-gst to -good + * 422917 : G729 payloader/depayloader + * 429322 : [matroska-demux] hangs if file starts at non-zero timestamp + * 465146 : Add more complete negotiation to gstrtpbasepayload + * 469917 : multiudpsink IPv6 and diffserv TOS/TC markup + * 499318 : [osxvideosink] warnings on build (ppc, 64bit, 10.4) + * 503288 : rtph264pay does not split multiple NAL units in incoming ... + * 511489 : avimux muxed audio and video out of sync + * 512345 : gstalpha: chroma-key should not set alpha to 0 if brightn... + * 515962 : [udp] add ipv6 support to multiudpsink and udpsrc, add mu... + * 516509 : gstid3v2mux.cc build failure on Solaris, CFLAGS not valid... + * 519301 : avimux fails when going from NULL to playing a second time + * 519460 : 8 bytes missing in AVI streamheader + * 520092 : v4l2src proposed patches + * 520885 : directdrawsink has some issues + * 527865 : [PATCH] [matroskademux] uses wrong colourspace for palett... + * 529454 : [udpsrc] generates false error on win32 due to ICMP dest-... + * 529692 : [goom] fails to build on Windows with mingw32 + * 529707 : [rtp] fails to build on Windows with mingw32 + * 530886 : Support more mpeg2 variants in .mov files + * 531532 : rtspsrc leaks filedescriptors when gst_rtspsrc_open fails + * 531672 : [qtdemux] does not handle files with edit lists correctly... + * 532295 : gconf setting default audio sink to video default visualizer + * 532393 : [dvdec] Shouldn't be GST_RANK_PRIMARY + * 532409 : RTP payload/depayloader for G.729 + * 532423 : RTP payload/depayloader for DV + * 533264 : Make v4l2 compile without X + * 533619 : udpsink dies when Linux fails (for no reason) sendto() wi... + * 535121 : [videomixer] proper seek/segment handling + * 535300 : [avidemux] missing support for reverse playback. + * 535935 : [qtdemux] Missing metadata + * 536228 : [PLUGIN-MOVE] Move interleave/deinterleave to gst-plugins... + * 536317 : [v4l2src] Doesn't compile with latest git kernel + * 536646 : v4l2src doesn't pick the optimal resolution + * 536831 : v4l2src == non-experimental + * 536903 : udpsrc now assumes one is using multicast + * 537021 : [cdio] does not extract album title from CD-TEXT + * 537031 : Enhancement to SunAudio mixer plugin + * 537361 : videomixer segment handler fail + * 537377 : Gstreamer avidemux fails on avi files with non-AV data st... + * 537622 : [matroskademux] Doesn't export covers (file attachments) + * 537675 : rtp vorbis/theora payloader static caps don't specify del... + * 537832 : rtsp is broken + * 539372 : udpsrc do not set port properly on anonymous binding + * 539548 : [udpsrc] Fails to bind with permission denied when trying... + * 540067 : souphttpsrc does not support http authentication + * 540300 : [souphttpsrc] souphttpsrc does not seek ahead in http stream + * 540940 : Quicktime demuxer does not handle dirac in QT files + * 541081 : [v4l2src] Doesn't compile with on old kernel + * 541384 : cross mingw32 gcc: making goom compile + * 541412 : cross mingw32 gcc: making libgstrtp plugin compile + * 541650 : udpsrc fails to parse URI with IPv6 address + * 541956 : v4l2src only requests interlaced video + * 542410 : qtdemux not recognizing pcm 8bit streams correctly + * 543054 : [osxvideosink] minor build issue + * 543255 : -Wno-attributes does not exist in every gcc version + * 543259 : warning in gstv4l2src.c due to an uninitialized variable + * 543300 : [qtdemux] [PATCH] wrong depth in RLE video caps and wrong... + * 544509 : [qtdemux] Regression in segment.stop + * 539482 : [avidemux] Doesn't parse vprp ODML header + * 544433 : Some -good plugins aren't buildable with MSVC + * 536994 : Improve v4l2src negotiation a bit more + * 329198 : GStreamer-CRITICAL: gst_pad_activate_pull: assertion `old... + * 532065 : Implement RTSP Digest authentication + * 533287 : Mapping of mime types to gst names in multipartdemux + * 538891 : G.726 pay/depayloader is missing + +Changes since 0.10.7: + + * The libsoup based http source moved from the -bad module and + was raised to primary rank + * GOOM visualisation plugin updated to Goom2k4 + * Fixes in UDP, RTSP, matroska, QT/mov, AVI, v4l2, OS/X, SunAudio, + mulaw and wavpack + * New gdkpixbuf output for snapshotting + * Various other bug-fixes + +Bugs fixed since 0.10.7: + + * 516509 : gstid3v2mux.cc build failure on Solaris, CFLAGS not valid... + * 515978 : [ladspa] Should be removed from -good until it's ready to... + * 516649 : [v4l2src] tries to VIDIOC_S_PARM without checking capabil... + * 517237 : [rtspsrc] Better error when bandwidth is too small + * 517933 : [tests] trivial C89 fix + * 518188 : [spectrum] " message " property documentation unclear + * 518213 : [goom2k4] artefacts on x86-64 + * 518564 : goom dies with illegal instruction + * 519088 : gst_mulawdec_chain() may call gst_util_uint64_scale_int()... + * 519417 : Unable to modify DEFAULT_VIDEOSRC in configure + * 520073 : [goom] (goom2k4) shows mostly black frames + * 520764 : double buffer unref in speexenc error handling + * 520880 : audiofx doesn't build on Windows/MSVC + * 520888 : udpsrc has some issues on Windows + * 521102 : h.263+ rtp depayloader crashes on short payloads + * 521875 : [osssrc] recording corrupts upon _get_caps + * 522278 : Problem with " movq " at file gst-plugins-good/gst/goom/xmmx.c + * 522767 : [goom] does not build on ppc + * 523124 : [PLUGIN-MOVE] move souphttpsrc from -bad to -good + * 523134 : osxvideosink does not stop when you control-C + * 524593 : [sunaudio] fix mixer track range + * 525359 : [alaw] [mulaw] Use gst_pad_alloc_buffer_and_set_caps to c... + * 525833 : [halaudiosrc] unable to get mic USB working with gnome-so... + * 525860 : [sunaudio] copyright fixes + * 525946 : [gdkpixbuf] add gdkpixbufsink element + * 526557 : [matroskademux] seeking regression in CVS + * 527848 : [souphttpsrc] Give souphttpsrc PRIMARY rank + * 527984 : Doesn't dist all m4 files needed by configure.ac + * 527999 : [goom] Doesn't dist goomsl.h + * 528143 : [goom] fails to build on 32-bit ppc + * 528615 : Hide goom2k4 logo + * 529268 : [goom] States unit test exposes some memory leaks + +Changes since 0.10.6: + + * 8 months of frenetic development + * Massive RTSP/RTP improvements + * Fixes in pngdec, gdkpixbufdec, wavpackparse, wavpackdec, smokeenc, + mulawdec, alwdec, id3demux + * More Fixes in matroskademux, udpsrc, apedemux, flacenc, avimux, + dv1394src + * V4L2 support improved + * Fixes for OS/X and Windows video/audio sources and sinks + * Support more formats in QT files + * Elements moved from gst-plugins-bad: equalizer, lpwsinc (now + audiowsinclimit), bpwsinc (now audiowsincband), spectrum, + multifilesrc/sink + * New audio effects: High/Low/Band-pass filters + * Many, many other fixes + +Bugs fixed since 0.10.6: + + * 415627 : [PLUGIN-MOVE] move equalizer to good + * 463624 : [PATCH] avimux: mismatch in ODML tag numbering + * 347848 : [id3v2mux] add support for DiscID tags + * 348085 : [PLUGIN-MOVE] move spectrum to good + * 351726 : [rtspsrc] Force to send on periodic time new rtsp play co... + * 358841 : [dv1394src] should have property probe + * 417420 : [autoaudiosink] add " caps " property to filter sinks by caps + * 427573 : [osxaudiosrc] segmentation fault + * 435435 : [alaw] use tables for ALAW (G.711) encoding and decoding + * 442034 : [avi] add support for subtitle streams (GAB2) + * 447000 : [id3demux] add support for reading license URL from WCOP tag + * 448278 : [v4l2src] several issues in cvs + * 449747 : Function parameter mismatch breaks build on Solaris. + * 450190 : [PATCH] v4l2src set_capture (parameters) fails + * 450878 : Missing files in po/POTFILES.in + * 451249 : Integer type mismatch in gstrtspsrc.c + * 451388 : [v4l2src] Could not negotiate format + * 453037 : rtpilbcpayloader encoding-name field mismatch + * 453417 : [matroskademux] support palette info for VobSub stream + * 453630 : Rtspsrc invokes GST_ELEMENT_ERROR in eos when streaming o... + * 455086 : [cairotextoverlay] ignores the size in font-desc property + * 455808 : rtspsrc deadlocks on pause + * 457097 : [faad] " setting caps on pad failed " with BMJ113 mov + * 461600 : Some files missing from POTFILES.in + * 464475 : the mode property if the caps of rtpilbc*pay should be of... + * 464800 : [audiofx] New elements: chebyshev low/highpass and bandpa... + * 465040 : [RTP] h263ppay should allow h263 caps on sink + * 465774 : qt video does not play, but can be seeked + * 467214 : Could not get buffers from device '/dev/video0' + * 467666 : [ELEMENT-MOVE] Move lpwsinc and bpwsinc to gst-plugins-good + * 470502 : Ricoh Webcam not working + * 471364 : [gconf] Internal GStreamer error: state change failed on ... + * 471823 : [v4l2src] Fails to negotiate capabilities with Macbook Pr... + * 473670 : [qtdemux] invalid utf8 in tags causes warnings + * 474616 : [rtph263pay] RTP headers are wrong for win32 + * 475424 : [v4l2] uvcvideo Macbook iSight webcam not working (regres... + * 477199 : Linux-UVC webcams not working + * 477456 : [v4l2src] my webcam is not working anymore + * 479960 : qtdemux is missing fourcc for mpeg2 HDV streams (HDV2. HDV3) + * 480557 : [v4l2src] Nasty segfault (with broken driver?) + * 482495 : avimux does not accept audio/aac + * 484998 : [mulawdec] not-negotiated error playing a sun audio (au) ... + * 485828 : [v4l2src] Fixates to lowest resolution on new kernels + * 487488 : udpsrc errors + * 487563 : Payloader for H264 not marking packets + * 488112 : [id3demux] extract ID3v2 WOAF frame + * 488844 : Free GstBuffer with gst_buffer_unref() in gst_rtp_mp4v_pa... + * 488879 : [videomixer] implement GstChildProxy interface + * 489940 : [gdkpixbufdec] gst_value_set_fraction: assertion 'denomin... + * 490034 : [v4l2src] " could not get buffers from device " + * 490283 : [multifilsrc] move to -good + * 491323 : Extend RTP MPEG-TS payloader to handle large RTP payload ... + * 492388 : Build issues on Windows/MSVC + * 496752 : [rtspsrc] leaks memory + * 496773 : [rtspsrc] leaks SDP messages + * 496983 : [PATCH] rtspsrc leaks pads + * 497007 : [PATCH] rtspsrc leaks RTSP messages in SETUP + * 497017 : [PATCH] H.264 RTP depayloader leaks memory in setcaps + * 497292 : gsttextoverlay compile problem in MSVC + * 497293 : gsttimeoverlay compile error in win32 + * 498181 : Recent change to gst-plugins-base breaks gst-plugins-good + * 498297 : [v4l2src] put real supported resolutions in caps instead ... + * 498395 : [pngenc] leaks buffer data memory + * 498715 : GStreamer fails to decode MPEG1 Video RTP streams when gs... + * 499178 : unexpected not negotiated and other weird beharviours + * 499239 : gstrtpmp4adepay + * 499383 : [rtph263depay] Doesn't read I-frame information from rtp ... + * 500403 : [PATCH] videobox element doesn't init liboil + * 501775 : [wavparse] regression in CVS: seeking is broken + * 502655 : [avimux] creates corrupt avi files (wrong stream numbering) + * 502814 : Adds profile (hex string), sps and pps (base64 encoded) i... + * 502966 : GStreamer segfaults when videobox is introduced into a sp... + * 503023 : Let multipartdemux work in live mode. + * 504018 : flacdec emits newsegment before being able to respond to ... + * 504081 : [matroskamux] support for live sources (calculate duratio... + * 504895 : Build fails: gst/check/gstcheck.h: No such file or direc... + * 505745 : [avidemux] warning: 'res' may be used uninitialized in th... + * 506025 : RTSPsrc doesn't handle redirects. + * 506715 : [PATCH] [flacdec] PICTURE blocks should be retrieved as m... + * 507642 : v4l2src Crash - Size 4156 is not a multiple of unit size ... + * 508644 : The clockrate for theora payloading should always be 90000 + * 509298 : Compilation errors in gstavisubtitle.c and gstrtspsrc.c w... + * 509301 : [flacdec] CVS does not compile against flac-1.1.2 + * 509531 : Make the auto-join/auto-leaving of a multicast group opti... + * 510505 : changes to make v4l plugin build on solaris + * 510592 : Race condition in WAVE parser + * 513628 : [flacdec] Decoding of PICTURE blocks is always disabled b... + * 514397 : matroskademux does not mark delta units + * 514573 : multipartmux memory leak + * 514889 : Bogus output from RTP data test + * 514965 : Possible buffer leaks if last_write_result != GST_FLOW_OK... + * 515457 : [audiofx] Element long descriptions are broken + * 515562 : [avidemux] Seeking broken in 0.10.6.2 + * 515697 : [multifile] Several memory leaks exposed by unit test + * 515701 : [smoke] Several valgrind warnings exposed by unit test + * 515703 : [avisubtitle] Several valgrind warnings with unit test (g... + * 515704 : [gconf] Memory leak when creation of pipeline fails + * 515706 : [ximagesrc] Memory leak when XDamage support is available + * 515905 : gst-error.m4 needs no%E_MACRO_REDEFINED on Solaris + * 515979 : [efence] Doesn't chain up finalize properly + * 515980 : [directdraw] Does not chain up finalize functions properly + * 515984 : [v4l] Does not chain up finalize functions properly + * 515985 : [ximagesrc] regression when using damage + * 516371 : does not build without xml usage + * 516524 : uninitialized variables + * 517386 : [alpha] Doesn't link with libgstbase + * 508291 : [id3demux] must check if language code in id3v2 COMM fram... + * 491811 : Rename audiochebyshevfreq* to audiocheb* + * 447961 : [rtsp] do not store a reference to the result from inet_n... + * 475784 : rtspsrc has race condition between loop_interleaved() and... + * 478244 : rtpamrdepay make no playable stream + * 480707 : Memory leak : gstrtpmp4vpay : config buffer is leaked + * 502187 : flacdec doesn't send newsegment from the streaming thread + * 509329 : [rtspsrc] use atoll when parsing rtptime + * 512544 : preallocate output buffer in pngenc + +Changes since 0.10.5: + + * Much improved RTSP/RTP and V4l2 support + * New plugins - audiopanorama, audioinvert, audiodynamic, audioamplify + * OSX and Windows video/audio support elements moved from Bad Plugins + * qtdemux, videocrop and wavpack elements moved from Bad Plugins + * Fixes in avi and matroska muxing + * Fixes in wavparse, sunaudio, AVI demuxing, ID3 tag handling + * gamma element ported to 0.10 + * Parallel installability with 0.8.x series + * Threadsafe design and API + +Bugs fixed since 0.10.5: + + * 392189 : [esdsink] pipeline hung in state change from PAUSED to PL... + * 407590 : crash using gconfaudiosink + * 439255 : [rtspsrc] crash on unsupported transport + * 441118 : Incorrect caps in G.711 RTP depayloaders + * 323471 : [PLUGIN-MOVE] osxaudio + * 407780 : avimux does not handle video/x-h264 + * 316203 : MinGW: udp and rtsp plugin should be disabled on windows + * 340362 : [PATCH] new plugin - hardlimiter + * 342463 : [ximagesrc] performance improvement + * 347806 : [v4l2src] try_capture(): Error getting buffer information... + * 350296 : [udpsrc] add property to remove extra headers from buffers + * 354007 : [PLUGIN-MOVE] videocrop should be moved to -good + * 356692 : wavparse drops final sample in most files + * 358040 : Fix speex rtp (de)payloader + * 362566 : [dv1394src] Random segfault and kernel oopses + * 374489 : rtspdec never sends out RTCP Receiver reports + * 377306 : [sunaudiomixer] mixer track labels not localized + * 379298 : [avimux] allow multiple audio streams + * 392620 : gnome-sound-record can not be started on sunray client on... + * 393427 : error/warnings when compiling with mingw + * 395688 : playbin is unable to play rtsp stream for 3gp from Darwin... + * 396057 : [audiofx] New audioinvert element + * 397162 : [audiofx] New element audioamplify + * 397946 : [audiopanorama] another trivial docs fix + * 398299 : [smpte] crashes if fed empty buffers from fakesrc + * 398325 : [smpte] Segfaults with big width/height + * 399338 : Hang in PREROLLING when trying to play a specially crafte... + * 399825 : Tags don't work properly for shout2send plugin + * 406042 : [v4l2src] fails with radio chips + * 407369 : [v4l2src] Wrong way of EIO error handling + * 407793 : memory leaks of sdpmessage.c + * 407797 : bug of rtsp_url_parse() in gst/rtsp/rtspurl.c + * 408544 : totem crashed with SIGSEGV to rtsp_ext_wms_configure_stre... + * 410997 : Fails to build with -z defs + * 412597 : Simplify GstSunAudioSrc + * 412608 : [avidemux] flow return aggregation can ignore errors + * 414168 : Mixes spaces and tabs in Makefile.am defs + * 416445 : [avidemux] seeking regressions + * 416727 : [v4l2src] typo in printf format string + * 416728 : [v4l2src] typo in translated strings + * 417729 : [autoaudiosink] plugs alsaspdifsink, breaking playbin + * 419338 : [wavparse] critical warning from plugin viewer + * 420208 : Probably typo + * 426044 : [flacenc] broken files when used with oggmux + * 427990 : [rtph264depay] sprop-parameter-set erros + * 428611 : [ximagesrc] segfaults when used from a non-X terminal + * 428901 : [icydemux] broken tags for non-UTF-8/ISO-8859-1-using ra... + * 429319 : [alphacolor] distorts png images without alpha channel + * 429666 : [goom] totem skips mp3 (while Rhythmbox doesn't) + * 430228 : [sunaudio] copyright bug + * 430632 : memory problem + * 430804 : [PATCH] navseek only seeks (sort-of) partially + * 431282 : broken RTP depayloaders + * 433119 : wavparse causes skipping for MPEG-encoded RIFF Wav files ... + * 433135 : [wavparse] regression in CVS with mp3-in-wav + * 433530 : udpsrc read of size 0 + * 434824 : rtp mp4 payloader doesn't handle newsegments and flush ev... + * 436910 : [videomixer] wrong strides with odd input width + * 437499 : [wavparse] can't handle WAV file with 'LIST' header chunk + * 437670 : Improvements for rtsptransport.[ch] + * 437692 : Some more fixes for the RTSP support + * 438926 : invalid comparison of pointer with string literal + * 438940 : [rtph263ppay] Support for Segment Fragmentation based on ... + * 440127 : Autoaudiosink does extra switching between null and ready... + * 440203 : Support multiple RTSP headers of the same type + * 440928 : Improved RTSP version support, and added Date header + * 441408 : speexdec plays incorrectly files made with nframes=4 + * 442535 : [wavenc] Doesn't handle width!=depth files with audio/x-r... + * 442677 : WideBand AMR payloaders + * 443081 : [wavparse] fails to post error on FLOW_NOT_LINKED + * 445905 : ximagesrc disregards display_name property + * 446981 : error during the compilation of rtspconnection.c + * 447210 : wrong length calculation for codec_data + * 447458 : [qtdemux] export AMRSpecificBox as codec_data + * 385887 : [flac] make work with libflac-1.1.3 + * 404646 : [audiofx] Compressor/Expander element + * 424527 : [auparse] don't convert non-native endianness floats in t... + * 387121 : [matroskamux] Can't mux raw audio + * 392855 : [matroska] plugin must link against zlib (error with MinGW) + * 394851 : [audiopanorama] Some trivial docs fixes + * 394859 : [audiopanorama] New simple method for adjusting the panorama + * 398086 : [smpte] crashes if input dimensions differ + * 406018 : 64bit uncleanness in gstavimux.c + * 407057 : [wavparse] leaks contents of every buffer pushed when in ... + * 407349 : [id3demux] wrongly interprets TDAT as year + * 350278 : [rtpmp2tdepay] Add support for proprietary headers + * 380895 : A couple of corrections and improvements for the RTSP sup... + * 380944 : [dvdec] Doesn't set pixel-aspect-ratio + * 394977 : multipartmux not honoring flow return + * 403956 : Add float32 support for " level " element + * 405213 : mp3 plays too fast in totem or rhythmbox + * 407006 : [goom] odd adapter behaviour + * 412704 : [PATCH] gamma filter ported to 0.10 + * 414887 : [gconf] gconfaudiosink doesn't set GST_ELEMENT_IS_SINK un... + * 415446 : [avidemux] fails parsing mjpeg file from digital camera + * 417792 : rtp depayloader for AAC + * 423304 : file descriptor closed in udpsrc and dynudpsink + * 423782 : Code for H264 payloader + * 428182 : Current CVS generates compiler warnings + * 429329 : [videobox] add support for AYUV input + * 442874 : Multipartmux assumes caps == mime + +Changes since 0.10.4: + + * Parallel installability with 0.8.x series + * Threadsafe design and API + * RTP/RTSP improvements + * Fixes in OSS support + * Addition of the audiopanorama element + * Improvements in AVI playback + * Annodex playback fixes + * Support FLAC in OGG and Matroska + * Fixes in the Speex decoder + * V4L2 source moved from Bad Plugins + * SMPTE element ported to 0.10 + * GStreamer Data Protocol (GDP) Payloader and Depayloader elements added + * Many other bug-fixes + +Bugs fixed since 0.10.4: + + * 336465 : [patch] Streaming support for avidemuxer + * 349207 : [PLUGIN-ADD] audiopanorama + * 341278 : [autoaudiosink] should fallback to fakesink + * 342950 : Implement device profiles in autoaudiosink/autoaudiosrc + * 348233 : dv1394src crashes with libavc1394 0.5.3 - cause known + * 349015 : [sunaudio] open source with O_NONBLOCK + * 349894 : RTSP Multicast + * 351347 : --disable-schemas-install now works too well + * 351794 : [id3demux] try harder to extract wrongly marked strings + * 352577 : [avidemux] regression in CVS with Elephant's Dream + * 355210 : Sample pipeline from the documentation doesn't work properly + * 356142 : GST Sun Audio Mixer doesn't set only Output Track as Mast... + * 356147 : [avimux] duration in header not correct for big avi ( > 2 ... + * 357592 : Avoid compiler warnings with uClibc and -Werror + * 361637 : h263 variant missing from RTP (de)payloaders' caps + * 361639 : MPA payloader's payload number is incorrect + * 362603 : Fixes compiling with forte: warning clean up (part 4) + * 362673 : Playback with 4Front OSS driver not working due to blocki... + * 366492 : add windows vs8 project files + * 369621 : [avidemux] Out-of-sync playback with VBR MP3 audio + * 372021 : flxdec has wrong classification + * 374213 : Seeking with LADSPA plug-ins fails + * 374479 : [PATCH] videomixer memleak fix and enhancement + * 374737 : [matroskademux] doesn't recognise opaque " A_AAC " codec ID + * 376594 : id3demux crashes when reading compressed ID3 frames + * 379433 : [PATCH] avidemux audio pad reports wrong position upon query + * 379792 : Remove memcpy in multipartmux and fix RFC compliance + * 379918 : Doesn't compile with newer libcaca versions (0.99.beta4+) + * 380199 : [matroskademux] Wrong framerate conversion + * 380825 : make avimux accept video/mpeg in versions 1, 2 and 4 + * 381857 : [id3v2mux] crashes trying to write empty frames + * 382179 : Videomixer shouldn't reset position to 0 when the caps ar... + * 382277 : multipartmux modifies buffer timestamp + * 382982 : [apedemux] Fails to read track gain or other doubles + * 383001 : [PATCH] if using multicast in udpsrc, bind to the multica... + * 383043 : Videomixer can crash when adding/removing pads while pla... + * 383596 : mixer doesnot work if set AUDIODEV on solaris + * 384587 : libcaca check breaks cross-compile + * 385031 : [id3demux] autoplug loop if first buffer has nonzero offs... + * 385623 : [quarktv] crash when plugged dynamically into a pipeline + * 343348 : [matroska] add support for vobsub subtitles + * 345449 : [icydemux] Internet radio hangs when connecting to radio.... + * 348762 : [ID3v2] comment frame extraction/writing doesn't retain d... + * 351116 : 'make check' tries to run annodex unit tests even if anno... + * 352110 : [flacdec] no support for ogg flac + * 366155 : [matroskademux] Several problems in encoding handling code + * 374658 : [matroskamux] add tag writing support and implement relea... + * 378184 : g-s-p crash due to incorrect free from do_toggle_element + * 360673 : [PATCH] Stuttering with SunAudio Sink + * 349068 : multipart demuxer improvements + * 350006 : [LADSPA] after changing state from PLAYING to READY/NULL,... + * 350340 : CMML test cases and small fixes + * 350785 : [ossmixer] provides no way to set mixer device + * 353908 : Error seeking at the beginning of a CMML file + * 356596 : [wavparse] Does not support GSM encoded audio + * 358156 : in udpsrc.c gst_udpsrc_create function read command could... + * 361252 : Memory leak in udpsrc + * 364958 : [avidemux] broken timestamping in streaming mode + * 367221 : [PATCH] videomixer does not mix for some framerate combin... + * 368162 : iLBc rtp payloaders and depayloaders not compiled + * 377792 : rtspsrc tries to stream application/x-wms-rtx + * 383323 : smpte doesn't handle sink1 and sink2 correctly + * 383726 : [audiopanorama] only transforms half of the samples in fl... + * 349901 : [LADSPA] gst_element_class_add_pad_template: assertion `g... + * 375476 : v4l2src cannot close /dev/video0 + +Changes since 0.10.3: + + * added apev2mux element + * use libiec61883 for Firewire + +Bugs fixed since 0.10.3: + + * 345930 : [id3demux] segfaults with file containing only ID3v1 tag + * 347529 : wavparse error + * 321191 : rtpamrdec isn't a subclass of GstBaseRtpDepayload + * 340027 : [patch] wavparse fails for several files + * 318563 : offer support for new raw1394_iso api in dv1394src + * 330623 : [avidemux] only the beginning of big avi files gets played + * 334375 : [id3demux] [id3v2mux] ID3 tag rewriting is lossy + * 337076 : Problem with broken matroska files containing non-UTF8 su... + * 339704 : [id3demux] read images from ID3 tags + * 340282 : Goom visualization is unusable at 'Normal' size and higher + * 340623 : [matroskademux] small memory leak + * 340699 : [flacdec] should not send EOS when doing segment seeking + * 340859 : [avimux] produces index with all frames marked as keyframes + * 340946 : raw1394 plugin uses deprecated functions + * 340979 : [id3demux] mp3 id3v2 TCON tag possible bug? + * 341489 : gst-plugins-good wavparse Cygwin fix + * 341774 : Fails to read tags in file + * 341818 : [matroskademux] poor concurrent performance + * 342029 : [id3demux] overflow of titlenumbers + * 342097 : [jpegdec] crash with attached JPEG file + * 342448 : [matroska] support for muxing/demuxing Theora video + * 342526 : [avimux] dml index support, codec_data support, cleanups + * 342592 : dvdemux doesn't post segment-done right + * 342734 : [matroskamux] might block on state-change + * 343051 : [autoaudiosink] doesn't try esdsink + * 343055 : README mentions 0.9.6 + * 343117 : jpegdec, mjpeg avi's and flush seeks + * 343122 : [taglib] new apev2mux element + * 343123 : [apedemux] add support for GST_TAG_LOCATION + * 343127 : [apedemux] extract track count, clean up parsing + * 343602 : configure --disable-external fails + * 343603 : need to add -lm to build tests/examples/level + * 343678 : configure.ac incorrectly uses $(SED) rather than $SED + * 343837 : [wavparse] can't handle WAV file with 'bext' header chunk + * 344100 : --disable-schemas-install not honored + * 344101 : SunAudio mixer fixes + * 344120 : dv1394src should now require libraw1394 > = 1.1.0 + * 344605 : [id3demux] set picture type on image buffers + * 345232 : [wavparse] reads beyond end-of-file (in pull mode) + * 345288 : [udp] make work on Windows + * 345713 : ximagesrc uses XFixesCursorImage incorrectly and will seg... + * 346066 : [sunaudiosink] don't override user setting and switch on ... + * 346259 : [sunaudio] move monitor to input tab in mixer + * 347234 : streaming UDP (MPEGTS) shows only one frame of video + * 347258 : [wavparse] internal stream error reading gnome-game gnibb... + * 347898 : [id3v2mux] write GST_TAG_ENCODER and GST_TAG_ENCODER_VERSION + * 347972 : [cdiocddasrc] core dumps if device is not found + * 348644 : [id3demux] Gets the wrong part of binary blob for ID3 v2.... + * 348752 : [udpsrc] add property to set buffer size for udp socket + * 348913 : [id3v2mux] tagging utf-8 text may be converted to iso-8869-1 + * 349155 : [smokeenc] does not set caps on it's buffers + * 349189 : LADSPA gstsignalprocessor.c: line 408: assertion failed: ... + * 349907 : multiudpsink messes up multicast addresses + * 350433 : [rtph263pdepay] h.263plus depayloader does not work + * 340492 : [flacdec] support push-based operation (and thus flac-ove... + * 345679 : fix to avoid goom core dumping + * 317470 : [GstCheck] gst_check_teardown_element asserts wrong refcount + * 340980 : [pixbuf,wavparse] fix build with gcc 2.95 + * 343661 : Jpeg image crashes gstreamer + * 344923 : New SunAudio source plugin, and mixer now supports stereo... + * 345301 : [PATCH] gst-plugins-good rtsp for Windows + * 346921 : gstmultiudpsink multicast support is broken + * 344136 : More accurate list of plugins which will/will not be buil... + +Changes since 0.10.2: + + * Annodex/CMML support + * RTSP and RTP enhancements + * HAL configured audio device support + * FLAC, Matroska, AVI, WAV, ID3, APE, DV and JPEG plugin improvements + * Recognise SSA/ASS and USF subtitles in Matroska files + * Fixes for ESD and SunAudio output plugins + * More uniform plugin descriptions + * IceCast metadata reading plugin added + * New plugins ported from 0.8: OSX audio, AVI muxer, X-Windows input, + WAV encoder, Gdk-Pixbuf image decoder, Smoke decoder, + Video colour balance + * Lots of bug fixes + +Bugs fixed since 0.10.2: + + * 335067 : RTSP src not working with WMServer servers + * 333657 : Replacing icy demuxing in gnomevfssrc + * 329106 : HAL sound device wrapper plugins + * 337749 : totem (gstreamer) crashes when playing an avi file + * 330885 : avidemux does not handle eos at end of seek-region + * 337364 : faulty GObject macros + * 337625 : [patch] Streaming support for wavparse + * 150363 : [pngdec] doesn't handle grayscale or paletted + * 154744 : Time slider does not work with avi videos from Cannon SD100 + * 161712 : [auparse] .au files don't play in playbin + * 313266 : [wavparse] will not play DTS stream in malformed WAV + * 319183 : rtspsrc filter sometimes uses an odd port for rtp + * 319986 : annodex decoding and encoding support + * 323721 : [id3demux] read in replaygain information from RVA2 frame... + * 323880 : " Seek in ready " for dvdemux + * 325191 : problem with auparse or mulawdec, choppy esd playback + * 326160 : videobalance not ported to new GstVideoFilter + * 327658 : " Seek in ready " support for wavparse plugin + * 328327 : gst-plugins-good fail to compile with gcc 4.1 + * 329107 : Profile support for gconfaudiosink + * 330239 : Crash playing any song from a particular album over rhyth... + * 330678 : Unable to play .fli files + * 331253 : Critical warnings when using cddacdiosrc + * 331368 : Gstreamer doesn't recognise tags + * 331385 : [alpha] state change function returns a constant + * 331672 : Another file that gstreamer can't read the tags on + * 331905 : [jpeg] smokedec not ported + * 331917 : [pngdec] does not support files with png streams + * 332031 : [PATCH] avimux ported to 0.10 + * 332547 : [wavparse] does not support multichannel wavs + * 333070 : [id3demux] reads unicode tags incorrectly where .8 did it... + * 333302 : [apedemux] some WavPack files with APE tags fail to play ... + * 333392 : [sunaudio] unused variables break CVS build with -Werror + * 333512 : [PATCH] Fix gst_pad_new_from_template (gst_static_pad_tem... + * 333624 : invalid get_times implementation in gstdynudpsink + * 333784 : [patch] unref the result of gst_pad_get_parent + * 334083 : [jpegdec] wrong durations set on buffers after seeking in... + * 334522 : avi of mpeg4 video and adpcm audio from digital camera re... + * 334732 : [id3demux] mp3 fails to play because typefinding thinks i... + * 334995 : [goom] zoom filter leaked + * 335231 : [wavparse] incorrect way to calculate seek position with ... + * 335755 : rhythmbox import crasher - png? + * 335858 : Video playback out of sync + * 335958 : [speexenc] doesn't work + * 336110 : move taglib-based ID3 muxer to -good + * 336602 : plugins need better/univied descriptions + * 336756 : move ximagesrc to gst-plugins-good + * 336889 : [avidemux] index creation might fail with some non-indexe... + * 336904 : Problem playing some AVI file when splitting large chunks... + * 337033 : [speex] can't seek in speex-encoded audio + * 337183 : [matroska] " caps not real subset " when playing audio files + * 337294 : AVI files downloaded from vidoe.google.com won't play + * 337421 : [sunaudiosink] some fixes + * 337609 : [flacdec] can't play .flac files where header says total_... + * 338290 : [flacdec] segment seek not supported + * 338713 : [id3demux] TCO genre tags (id3v2.2) don't get read by gst... + * 338715 : [shout2send] fix crash on error and tags received before ... + * 338716 : [wavenc] " not negotiated " error with CVS core + * 338810 : [matroskademux] blocks on segmenting seek (and other seek... + * 339446 : [matroska] can't play file if details come before type in... + * 339451 : [matroska] enhancement for VfW compatibility cases + * 339678 : [matroskamux] wrong timestamps of B-frames + * 340346 : [matroskamux] blocks upon muxing video and vorbis-audio + * 319884 : rtpamrdec discards non-transmitted frames + +Changes since 0.10.1: + * New libcdio based CDDA reading element + * APE tag reader ported + * ID3 tag reading fixes + * Sun Audio Sink fixes + * GOOM and gconf element fixes + * lots of bug and leak fixes + +Bugs fixed since 0.10.1: + * 328336 : silence warings which make dvdec / dvdemux unusable + * 315557 : Internal event problem with MP3s from vgmix.com + * 323327 : [cdio] port cddasrc to 0.10 + * 325148 : Bugs in G711 RTP packetization logic + * 325649 : apetag plugin needs porting to 0.10 + * 326446 : check that all elements in -good pass queries they can't ... + * 326602 : id3demux is not compiling without ZLIB + * 326683 : build problem caused by AS_LIBTOOL_TAGS([CXX]) + * 326736 : gconf(audio|video)sink response to key changes + * 326864 : [wavparse] time to bytes format conversion broken + * 327009 : [esdsink] won't compile with includes in non-standard prefix + * 327765 : [sunaudio] fixes for mixer and stuttering mp3 playback + * 327825 : [matroskamux] Matroska muxer deadlock + * 327871 : [videobox] crash when cropping + * 328241 : id3demux emits NULL date for year tags + * 328264 : Fix build with gcc 2.95 + * 328531 : [matroskamux] doesn't send newsegment event, critical war... + * 329181 : totem crash when using goom effect + * 329810 : Fails to read ID3 tag + * 330005 : Please use the autodetect sinks by default + * 317658 : [cdio] support for cd-text and cd-g + +Changes since 0.10.0: + + * new id3 demuxer (replaces the mad one in gst-plugins-ugly) + * memleak fixes in avidemux, wavparse, level, smoke + * ports of multipart, + * fixes in flacdec, flxdec, rtp + * documentation updates on videomixer + * added new sunaudiosink, gconfaudiosrc and gconfvideosrc elements + +Bugs fixed since 0.10.0: + + * 321269 : add sunaudio to 0.9 + * 322769 : The ID3 tag of this file is a segfaulter + * 323021 : sockfd property to udpsrc/dynudpsink elements + * 322975 : erroneous audio specs in flac plugin + * 323226 : block/crash on id3 v2 tags when using big blocksize + * 323717 : < netinet/in.h > inclusion necessary on some systems + * 323718 : [oss] does not build on OpenBSD 3.8 because of hardcoded ... + * 323896 : pngdec/videomixer negotation problem in 0.10 + * 324011 : Invalid payload type definition for some rtp payloaders + * 324012 : Invalid caps on rtpspeexpay element + * 325504 : [flacdec] gst_flac_dec_convert_src [mis]uses g_assert + * 325974 : [gst0.10] doesn't correctly gets the tags on a mp3 + * 326612 : Serious memory leak in level plugin + * 326618 : memleak fix in smokeenc + +API added since 0.10.0: + + * device-name property on ossmixer subclasses + * GstUDPSrc::sockfd property + +Changes since 0.9.6: + + * Parallel installability with 0.8.x series + * Threadsafe design and API + * effectv elements ported + * videoflip updated + * multipart ported + * dv seeking fixed + * rtp elements renamed + +Bugs fixed since 0.9.6: + + * 322377 : udpsrc leaks sockets + * 322643 : Incorrect matroska frame default duration + * 322645 : Matroska muxer: wrong pixel aspect ratio + * 322667 : [jpegenc] leaks input buffer + * 322794 : udp plugin linked against gstnet instead of gstnetbuffer + +Changes since 0.9.5: + + * added speex RTP payloader/depayloader + * ported cutter + * fractional framerates + * more video filters now use BaseTransform + +Bugs fixed since 0.9.5: + + * 319184 : rtspsrc: invalid read in sdp_message_parse_buffer () + * 321001 : [matroskademux] should seek to nearest preceding index en... + * 321430 : goom fails to register on amd64 + +Changes since 0.9.4: + + * matroskamux fixes + * wavenc fixes + * cairotextoverlay ported + +Bugs fixed since 0.9.4: + + * 315194 : Licence information inconsistency of gst-plugins-good/gst... + * 319731 : [matroska] SimpleBlock support for muxer and demuxer + * 320308 : [matroska] set timestamps for buffers with ebml elements + * 320920 : [osssink] tries to reuse a bad file descriptor + * 321136 : [matroska-mux] avoid reading from unref'ed buffer + +Changes since 0.9.3: + + * DV/Firewire fixes + * speexenc, cairotimeoverlay, matroska, pngdec, flxdec, videomixer, + alphacolor ported + +Bugs fixed since 0.9.3: + + * 316204 : MinGW compilation: smtpe plugin has undefined symbols fro... + * 316205 : Debug category for wavenc is not defined + * 318847 : Matroska muxer port to 0.9 + +Changes since 0.9.1: + + * Parallel installability with 0.8.x series + * Threadsafe design and API + +Bugs fixed since 0.9.1: + + * 316202 : MinGW compilation: undefined autoconf macro GST_DOC + * 317338 : [osssink] can't handle mono diff --git a/README b/README new file mode 100644 index 0000000..908386d --- /dev/null +++ b/README @@ -0,0 +1,247 @@ +WHAT IT IS +---------- + +This is GStreamer, a framework for streaming media. + +WHERE TO START +-------------- + +We have a website at +http://gstreamer.freedesktop.org/ + +You should start by going through our FAQ at +http://gstreamer.freedesktop.org/data/doc/gstreamer/head/faq/html/ + +There is more documentation; go to +http://gstreamer.freedesktop.org/documentation + +You can subscribe to our mailing lists; see the website for details. + +We track bugs in GNOME's bugzilla; see the website for details. + +You can join us on IRC - #gstreamer on irc.freenode.org + +GStreamer 0.10 series +--------------------- + +Starring + + GSTREAMER + +The core around which all other modules revolve. Base functionality and +libraries, some essential elements, documentation, and testing. + + BASE + +A well-groomed and well-maintained collection of GStreamer plug-ins and +elements, spanning the range of possible types of elements one would want +to write for GStreamer. + +And introducing, for the first time ever, on the development screen ... + + THE GOOD + + --- "Such ingratitude. After all the times I've saved your life." + +A collection of plug-ins you'd want to have right next to you on the +battlefield. Shooting sharp and making no mistakes, these plug-ins have it +all: good looks, good code, and good licensing. Documented and dressed up +in tests. If you're looking for a role model to base your own plug-in on, +here it is. + +If you find a plot hole or a badly lip-synced line of code in them, +let us know - it is a matter of honour for us to ensure Blondie doesn't look +like he's been walking 100 miles through the desert without water. + + THE UGLY + + --- "When you have to shoot, shoot. Don't talk." + +There are times when the world needs a color between black and white. +Quality code to match the good's, but two-timing, backstabbing and ready to +sell your freedom down the river. These plug-ins might have a patent noose +around their neck, or a lock-up license, or any other problem that makes you +think twice about shipping them. + +We don't call them ugly because we like them less. Does a mother love her +son less because he's not as pretty as the other ones ? No - she commends +him on his great personality. These plug-ins are the life of the party. +And we'll still step in and set them straight if you report any unacceptable +behaviour - because there are two kinds of people in the world, my friend: +those with a rope around their neck and the people who do the cutting. + + THE BAD + + --- "That an accusation?" + +No perfectly groomed moustache or any amount of fine clothing is going to +cover up the truth - these plug-ins are Bad with a capital B. +They look fine on the outside, and might even appear to get the job done, but +at the end of the day they're a black sheep. Without a golden-haired angel +to watch over them, they'll probably land in an unmarked grave at the final +showdown. + +Don't bug us about their quality - exercise your Free Software rights, +patch up the offender and send us the patch on the fastest steed you can +steal from the Confederates. Because you see, in this world, there's two +kinds of people, my friend: those with loaded guns and those who dig. +You dig. + +The Lowdown +----------- + + --- "I've never seen so many plug-ins wasted so badly." + +GStreamer Plug-ins has grown so big that it's hard to separate the wheat from +the chaff. Also, distributors have brought up issues about the legal status +of some of the plug-ins we ship. To remedy this, we've divided the previous +set of available plug-ins into four modules: + +- gst-plugins-base: a small and fixed set of plug-ins, covering a wide range + of possible types of elements; these are continuously kept up-to-date + with any core changes during the development series. + + - We believe distributors can safely ship these plug-ins. + - People writing elements should base their code on these elements. + - These elements come with examples, documentation, and regression tests. + +- gst-plugins-good: a set of plug-ins that we consider to have good quality + code, correct functionality, our preferred license (LGPL for the plug-in + code, LGPL or LGPL-compatible for the supporting library). + + - We believe distributors can safely ship these plug-ins. + - People writing elements should base their code on these elements. + +- gst-plugins-ugly: a set of plug-ins that have good quality and correct + functionality, but distributing them might pose problems. The license + on either the plug-ins or the supporting libraries might not be how we'd + like. The code might be widely known to present patent problems. + + - Distributors should check if they want/can ship these plug-ins. + - People writing elements should base their code on these elements. + +- gst-plugins-bad: a set of plug-ins that aren't up to par compared to the + rest. They might be close to being good quality, but they're missing + something - be it a good code review, some documentation, a set of tests, + a real live maintainer, or some actual wide use. + If the blanks are filled in they might be upgraded to become part of + either gst-plugins-good or gst-plugins-ugly, depending on the other factors. + + - If the plug-ins break, you can't complain - instead, you can fix the + problem and send us a patch, or bribe someone into fixing them for you. + - New contributors can start here for things to work on. + +PLATFORMS +--------- + +- Linux is of course fully supported +- FreeBSD is reported to work; other BSD's should work too +- Solaris is reported to work; a specific sunaudiosink plugin has been written +- MacOSX is reported to work; specific audio and video sinks have been written +- Windows support is experimental but improving. Output sinks have been + written but are not yet included in the code. We support + - MSys/MingW builds + - Microsoft Visual Studio 6 builds (see win32/README.txt) + +INSTALLING FROM PACKAGES +------------------------ + +You should always prefer installing from packages first. GStreamer is +well-maintained for a number of distributions, including Fedora, Debian, +Ubuntu, Mandrake, Gentoo, ... + +Only in cases where you: +- want to hack on GStreamer +- want to verify that a bug has been fixed +- do not have a sane distribution +should you choose to build from source tarballs or CVS. + +Find more information about the various packages at +http://gstreamer.freedesktop.org/download/ + +COMPILING FROM SOURCE TARBALLS +------------------------------ + +- again, make sure that you really need to install from source ! + If GStreamer is one of your first projects ever that you build from source, + consider taking on an easier project. + +- check output of ./configure --help to see if any options apply to you +- run + ./configure + make + + to build GStreamer. +- if you want to install it (not required, but what you usually want to do), run + make install + +- try out a simple test: + gst-launch -v fakesrc num_buffers=5 ! fakesink + (If you didn't install GStreamer, prefix gst-launch with tools/) + + If it outputs a bunch of messages from fakesrc and fakesink, everything is + ok. + + If it did not work, keep in mind that you might need to adjust the + PATH and/or LD_LIBRARY_PATH environment variables to make the system + find GStreamer in the prefix where you installed (by default that is /usr/local). + +- After this, you're ready to install gst-plugins, which will provide the + functionality you're probably looking for by now, so go on and read + that README. + +COMPILING FROM CVS +------------------ + +When building from CVS sources, you will need to run autogen.sh to generate +the build system files. + +You will need a set of additional tools typical for building from CVS, +including: +- autoconf +- automake +- libtool + +autogen.sh will check for recent enough versions and complain if you don't have +them. You can also specify specific versions of automake and autoconf with +--with-automake and --with-autoconf + +Check autogen.sh options by running autogen.sh --help + +autogen.sh can pass on arguments to configure - you just need to separate them +from autogen.sh with -- between the two. +prefix has been added to autogen.sh but will be passed on to configure because +some build scripts like that. + +When you have done this once, you can use autoregen.sh to re-autogen with +the last passed options as a handy shortcut. Use it. + +After the autogen.sh stage, you can follow the directions listed in +"COMPILING FROM SOURCE" + +You can also run your whole cvs stack uninstalled. The script in +the gstreamer module /docs/faq/gst-uninstalled) is helpful in setting +up your environment for this. + +PLUG-IN DEPENDENCIES AND LICENSES +--------------------------------- + +GStreamer is developed under the terms of the LGPL (see LICENSE file for +details). Some of our plug-ins however rely on libraries which are available +under other licenses. This means that if you are distributing an application +which has a non-GPL compatible license (for instance a closed-source +application) with GStreamer, you have to make sure not to distribute GPL-linked +plug-ins. + +When using GPL-linked plug-ins, GStreamer is for all practical reasons +under the GPL itself. + +HISTORY +------- + +The fundamental design comes from the video pipeline at Oregon Graduate +Institute, as well as some ideas from DirectMedia. It's based on plug-ins that +will provide the various codec and other functionality. The interface +hopefully is generic enough for various companies (ahem, Apple) to release +binary codecs for Linux, until such time as they get a clue and release the +source. diff --git a/RELEASE b/RELEASE new file mode 100644 index 0000000..7de2eab --- /dev/null +++ b/RELEASE @@ -0,0 +1,379 @@ + +Release notes for GStreamer Good Plug-ins 0.10.31 "Faster" + + + +The GStreamer team is proud to announce a new release +in the 0.10.x stable series of the +GStreamer Good Plug-ins. + + +The 0.10.x series is a stable series targeted at end users. + + + +"Such ingratitude. After all the times I've saved your life." + + +A collection of plug-ins you'd want to have right next to you on the +battlefield. Shooting sharp and making no mistakes, these plug-ins have it +all: good looks, good code, and good licensing. Documented and dressed up +in tests. If you're looking for a role model to base your own plug-in on, +here it is. + + +If you find a plot hole or a badly lip-synced line of code in them, +let us know - it is a matter of honour for us to ensure Blondie doesn't look +like he's been walking 100 miles through the desert without water. + + +This module contains a set of plug-ins that we consider to have good quality + code, correct functionality, our preferred license (LGPL for the plug-in + code, LGPL or LGPL-compatible for the supporting library). +We believe distributors can safely ship these plug-ins. +People writing elements should base their code on these elements. + + +Other modules containing plug-ins are: + + +gst-plugins-base +contains a basic set of well-supported plug-ins +gst-plugins-ugly +contains a set of well-supported plug-ins, but might pose problems for + distributors +gst-plugins-bad +contains a set of less supported plug-ins that haven't passed the + rigorous quality testing we expect + + + + + +Features of this release + + * audioparsers: propagate downstream caps constraints upstream + * ac3parse: add support for IEC 61937 alignment and conversion/switching between alignments + * ac3parse: let bsid 9 and 10 through + * auparse: implement seeking + * avidemux: fix wrong stride when inverting uncompressed video + * cairotextoverlay: add a "silent" property to skip rendering; forward new segment events + * deinterlace: add support for deinterlacing using buffer caps/flags (as set by e.g. fieldanalysis) + * deinterlace: new fieldanalysis-related properties: "locking" and "ignore-obscure" + * directsoundsink: fix negotiation/device setup: 16-bit audio is signed, 8-bit is unsigned + * effecttv: fix reverse negotiation; repair color modes in radioactv by taking rgb,bgr into account + * equalizer: also sync the parameters for the filter bands + * flacdec: better timestamp/offset handling; try upstream first for duration queries + * flacdec: send EOS when seeking after the end of file instead of failing + * flacenc: do not drop the first data buffer on the floor + * flacparse: detect when a file lies about fixed block size; ignore invalid minimum_blocksize + * flacparse: more accurate/better duration/timestamp handling + * flvdemux: better timestamp handling (negative cts, detect large pts gaps; fix discontinuity threshold check when timestamps go backwards) + * flvmux: properly determine final duration; metadata/header writing fixes + * gdkpixbufsink: fix inverted pixel-aspect-ratio info on pixbufs + * jack: add "client-name" property to jackaudiosink and jackaudiosrc + * jpegdec: add sof-marker to template caps, so we don't get plugged for lossless jpeg + * jpegdec: Implement upstream negotiation + * matroskademux: seeking fixes; better handling of non-finalized files + * matroskademux: better timestamp/duration handling, fix some stuttering A/V + * matroskademux: add "max-gap-time" property to make gap handling configurable + * matroskademux: UTF-8 subtitles may have markup + * matroskamux: do not use unoffical V_MJPEG codec id + * matroskamux: fix segment handling, so we actually use running time + * matroskamux: for streaming files, push tags first + * matroskamux: handle GstForceKeyUnit event + * multifile: new splitfilesrc element to read multiple files as if they were one single file + * multifilesrc: add "loop" property + * multifilesink: handle buffer lists, useful to keep groups of buffers (GOPs) in the same file + * multifilesink: add flag to cut after a force key unit event + * multifilesink: add "max-files" property + * multifilesink: add new 'max-size' mode and "max-file-size" property for switching to the next file based on size + * multifilesink: write stream-headers when switching to the next file in max-size mode + * multipartdemux: Add property to assume a single stream and emit no-more-pads + * multipartmux: Add \r\n to tail of pushed buffers + * navseek: toggle pause/play on space bar + * osxvideo: Fix leak of NSOpenGLPixelFormat object + * pcmadepay,pcmudepay: allow variable sample rate + * pngenc: increase arbitrary resolution limits + * pulse: Drop support for PA versions before 0.9.16 (1.x is recommended) + * pulse: new pulseaudiosink element to handle format changes (not autoplugged yet) + * pulsesink: add support for compressed audio format passthrough (S/PDIF, mp3-over-bluetooth) + * pulsesink: Allow writes in bigger chunks + * pulsesink: Use the extended stream API if available + * pulsesrc: add a "source-output-index" property; implement GstStreamVolume interface + * qtdemux: better fragmented support (avoid adjustment for keyframe seek; mark all audio track samples as keyframe) + * qtdemux: parse embedded ID32 tags; improve bitrate guessing/extraction + * qtdemux: push mode fixes, fix buffered streaming + * qtmux: add direct dirac mapping + * qtmux: calculate average bitrate for streams + * qtmux: fix ctts generation for streams that don't start at 0 timestamps + * qtmux: use GST_TAG_IMAGE for coverart too + * ismlmux: Use iso-fragmented as variant type (useful in connection with encodebin) + * rtph263ppay: implement getcaps following RFC 4629, picks the right annexes + * rtph263ppay: set H263-2000 if thats what the other side wants + * rtph264depay: complete merged AU on marker bit (thus reducing latency) + * rtph264depay: cope with FU-A E bit not being set (caused by buggy payloaders) + * rtph264depay: exclude NALu size from payload length on truncated packets + * rtph264pay: proxy downstream caps restrictions (converting profile-level-id from RTP caps into video/x-h264 style caps) + * rtph264pay: only set the marker bit on the last NALU of a multi-NALU access unit + * rtpjpegpay: add support for H.264 payload in MJPEG container + * rtpjpegpay: fix for "odd" resolutions not a multiple of DCTSIZE + * rtpmp4adepay: fix output buffer timestamps in case of multiple frames + * rtpmp4gdepay: improve bogus interleaved index compensating + * rtpmp4vpay: deprecated send-config property and replace by config-interval + * rtppcmapay/depay: static clock rates on static payloads, dynamic on dynamic + * rtpvrawpay,-depay: RGB video payloading/depayloading fixes + * rtpg722pay: Compensate for clockrate vs. samplerate difference + * rtpbin: allow configurable rtcp stream syncing interval + * rtpbin: new "rtcp-sync" property, alternative inter-stream syncing methods + * rtpjitterbuffer/rtpbin: relax dropping rtcp packets; misc other fixes + * rtpmanager: don't reveal the user's username, hostname or real name by default + * rtpsession: process received Full Intra Requests (FIR) + * rtpsession: add special mode to use FIR as repair as Google does + * rtpsession: send FIR requests in response to key unit requests with all-headers=TRUE + * rtpsession: always send application requested feedback in immediate mode + * rtpsession: put the PLI requests in each RTPSource + * rtpsession: wait longer to timeout SSRC collision + * rtspsrc: implement async network I/O + * rtspsrc: allow sending short RTSP requests to a server + * rtspsrc: configure rtcp interval if provided + * rtspsrc: open on play and pause when not done yet + * shout2send: send video/webm through libshout + * soup: new souphttpclientsink element + * udpsrc: drop dataless UDP packets + * v4l2: take care not to change the current format where appropriate + * v4l2src, v4l2sink: add "norm" property; default to a pixel-aspect-ratio of 1/1 + * v4l2src: do not ignore the highest frame interval or the largest resolution + * v4l2src: handle some feature query failures more gracefully + * videobox: avoid wrapping opaque to transparent + * wavenc: Allow setcaps to be called after a format was negotiated if it's compatible + * ximagesrc: add "xid" and "xname" properties to allow capturing a particular window + * ximagesrc: fallback to non-XShm mode if allocating the XShm image failed + * ximagesrc: clear flags on buffer reuse, so that flags like DISCONT aren't set accidentally + +Bugs fixed in this release + + * 668320 : rtpmanager: RTCP receiver reports reveal full user name + * 652727 : multifilesrc: add ability to loop + * 657422 : [souphttpsrc] The souphttpsrc plugin doesn't work behind a proxy that requires authentication + * 432612 : [matroskamux] doesn't handle segments correctly + * 541215 : [avimux] Dirac muxing is broken and results in A/V sync issues + * 546932 : [ximagesrc] allow recording of specific window only + * 571400 : RTSP blocks in gst_element_set_state( GST_STATE_PAUSED ) and incorrect url + * 576524 : rtpbin, jitterbuffer: add mode to support for recording RTP streams + * 586450 : [cairotextoverlay] Forward upstream events to both sinkpads + * 595055 : [pulsesrc] Should implement GstStreamVolume interface + * 605834 : directsoundsink: 16-bit audio is always signed while 8-bit is always unsigned + * 610916 : rtspsrc dosen't work under windows + * 614803 : v4l2: add tv-norm property + * 616686 : multipartdemux: add " single-stream " property to emit no-more-pads earlier + * 616936 : [matroskademux] Incorrect display of subtitles with markup + * 619548 : qtdemux: Guess bitrate if only one stream's bitrate is unknown + * 619590 : [matroskademux] Doesn't protect segment and other fields from concurrent changes from different threads + * 620186 : qtdemux: Export max bitrate for AMR-NB/-WB streams + * 622412 : [rtpmp4vpay] remove send-config parameter; obsoleted by config-interval + * 624887 : pitivi playback hangs / errors while playing mov clips on clip change + * 630456 : [ximagesrc] Fallback to non-XShm mode if image allocation fails + * 631430 : [flvdemux] Cannot play .flv to the end + * 632504 : [rtspsrc] reduce or avoid (network) hang during shutdown + * 634093 : RTSP client asks for unicast from multicast only server + * 638300 : v4l2src: make this work more than once in a row + * 639217 : udpsrc: allow skip-first-bytes of full buffer size + * 640323 : [cairotextoverlay] forward new segment events from the sink to the source + * 643847 : deinterlace: Add support for deinterlacing using buffer caps/flags + * 644151 : [multifilesink] Add option to create a new file after each GstForceKeyUnit event + * 644154 : [matroskamux] Force a new cluster after each GstForceKeyUnit event + * 644512 : [auparse] Add seeking + * 647540 : autoaudiosink picks element to use by rank, but pulsesink/alsasink/jackaudiosink are all PRIMARY + * 648312 : [v4l2sink] Unconditionally accepts video/mpegts + * 648642 : rtpsession: Ensure ssrc collisions aren't timed out immediately + * 648937 : matroskademux: avoid building index when streamable + * 649067 : v4l2src: got unexpected frame size of 262254 instead of 614400 + * 649617 : [rtp] Deadlock and other fixes for rtpssrcdemux + * 649780 : flac: seek beyond end fails instead of EOSing immediately + * 649955 : flvmux: add support for mpegversion 2, which is also AAC + * 650258 : matroskademux/matroskaparse: gst_element_query_duration returns wrong value for Matroska files + * 650313 : ac3parse: Add support for iec61937 alignment + * 650503 : [dvdemux] Broken DURATION query handling + * 650555 : [aacparse] AAC profiles needed in caps + * 650691 : [flacparse] regression playing some flac files + * 650714 : [amrparse] skips first few frames (problem in checking sync) + * 650785 : [flacparse] duration query in DEFAULT format failing with flacparse in pipeline (regression) + * 650877 : matroska: refactor code common to matroskademux and matroskaparse + * 650912 : Rare leak in qtdemux + * 650916 : REGRESSION: ssrcdemux causing FLOW_NOT_LINKED + * 650937 : deinterlace: fix parameter type in trace + * 651059 : rtspsrc: uniform unknown message handling + * 651443 : multifilesink: add next-file=max-size mode and max-file-size property + * 652195 : matroskademux: seeking in non-finalized matroska files does not work correctly + * 652286 : matroskaparse: Gstreamer-CRITICAL when changing state from PAUSED to READY + * 652467 : matroska: missing < stdio.h > include for sscanf + * 653080 : matroskamux: make check for block_duration less sensitive + * 653091 : [dv1394src] Make the internal clock thread-safe + * 653327 : configure script for gst-plugins-good selects shout2 when it's not present + * 653559 : aacparse: too greedy minimum frame size + * 653709 : [ximagesrc] sets DISCONT on half the buffers + * 654175 : matroskademux: handle blocks with duration=0 + * 654379 : matroskamux: make default framerate optional per stream + * 654583 : Immediate RTCP in rtpsession + * 654585 : rtpmp4gdepay choppy sound + * 654744 : matroskademux: fix aspect ratio if header has only onle display variable set + * 654749 : goom: unbreak build on PPC on openbsd + * 654816 : [rtspsrc] rtspsrc doesn't get eos if it's wrapped into a bin + * 655530 : Logitech B990 HD Webcam yields poor video in MJPEG mode. + * 655570 : qtdemux: assertion error when playing Apple Trailers + * 655805 : Make the extended RTSP headers optional + * 655866 : jackaudiosink: Don't call g_alloca in jack_process_cb + * 655918 : qtdemux : qtdemux_add_fragmented_samples return error. + * 656104 : v4l2src fails to correctly configure the framerate + * 656606 : crash in gst_spectrum_reset_message_data() + * 656649 : flacparse: fix off by one in frame size check + * 656734 : [aacparse] Assumes 1024 samples per frame + * 657080 : aacparse: failing test due to two buffers being dropped for one sync loss + * 657179 : pulse: New pulseaudiosink element to handle format changes + * 657376 : rtspsrc regression + * 657830 : multiudpsink: make add/remove/clear/get-stats action signals + * 658178 : udpsrc: rough error reporting when using an invalid URI + * 658305 : [souphttpsrc] can’t seek during double speed playback + * 658419 : Add FIR support to rtpsession + * 658543 : [v4l2src] Use GST_RESOURCE_ERROR_BUSY if webcam is already used + * 658546 : ac3parse: RealAudio file with AC-3 audio no longer plays + * 659009 : [matroskademux] property for configuring gap handling + * 659065 : navseek: toggle pause/play on space bar + * 659153 : matroskademux: fix stuttering A/V + * 659237 : [gstrtpbin] clock is not unreffed after finish using it + * 659242 : [matroskademux] Unexpected EOS when seeking on paused matroska file + * 659798 : Segfault when you convert with audioconvert from audio file mkv to audio file avi + * 659808 : matroskademux: misc fixes + * 659837 : matroskamux: unable to mux audio/x-raw-int,rate=8000,channels=1,endianness=1234,width=16,depth=16,signed=true + * 659943 : [ac3parse] it does not correcly check for ac3/e-ac3 switch + * 660249 : won't play wav file: invalid WAV header (no fmt at start): ID32 + * 660275 : jpegdec doesn't implement upstream negotiation + * 660294 : goom2k1: Fix mingw compiler warnings + * 660448 : videomixer2: memory leak + * 660468 : speexenc: fix calculation of filler data size + * 660481 : v4l, ximagesrc: printf format warnings + * 660969 : qtmux memleak + * 661049 : matroskademux: support seek with start_type NONE + * 661215 : flacparse: fix last frame timestamp in fixed block size mode + * 661400 : rtpg722pay: G722 rtptime too fast + * 661477 : flvdemux: negative cts causes uint overflow, resulting in sinks waiting forever + * 661841 : [edgetv] video artifacts if videorate placed after edgetv + * 661874 : aacparse fails to forward caps to encoder + * 662856 : cairotextoverlay: add a 'silent' property to skip rendering + * 663186 : taginject is not gap aware + * 663334 : gst/flv/: add amfdefs.h to noinst_HEADERS + * 663580 : v4l2src negotiation failure with weird pixel-aspect-ratios + * 664548 : matroskaparse: memleak + * 664792 : Staircase effect in M-JPEG over RTP with unaligned image dimensions.. + * 664892 : [matroskademux] Doesn't set caps properly + * 665387 : v4l2src: fix stepwise enumeration ignoring the highest values + * 665412 : matroskamux: jpeg muxing regression + * 665502 : [flvdemux] broken a/v sync for some files + * 665666 : multifilesink: GstMultiFileSinkNext not documented + * 665872 : jackaudiosink, jackaudiosrc: add " client-name " property + * 665882 : gdkpixbufsink: " pixel-aspect-ratio " is the inverse of what it should be + * 665911 : Ability to specify ignore-length in wavparse + * 666361 : playbin2: regression: visualisations don't work with pulseaudiosink + * 666583 : matroskademux: too many bus messages in streamable mode + * 666602 : ac3parse: no valid frames found before end of stream (unexpected bsid=10) + * 666644 : udpsrc: infinite loop on dataless UDP packets + * 666688 : jpedec: peer_caps leak + * 666711 : rtspsrc: hostname lookup is not thread safe + * 667419 : matroskamux memleaks + * 667818 : osxvideo: Fix leak of NSOpenGLPixelFormat object + * 667820 : rtpptdemux: Plug potential pad leak. + * 667846 : rtph264depay: Exclude NALu size from payload length on truncated packets. + * 668648 : gst-plugins-good does not compile: cairo cannot find libgstvideo-0.10 + * 669455 : V4l2src can't open webcamstudio new vloopback + * 669590 : [shout2send] support webm streaming + * 670197 : v4l2src: webcam doesn't work due to fatal error when querying color balance attributes + * 650960 : flacparse makes decoded flac files start at sample offset 9215 + * 659947 : souphttpsink: rename to souphttpclientsink? + * 658659 : qtmux: Fix ctts entries for streams that don't start with timestamps from 0 + +Download + +You can find source releases of gst-plugins-good in the download directory: +http://gstreamer.freedesktop.org/src/gst-plugins-good/ + +GStreamer Homepage + +More details can be found on the project's website: +http://gstreamer.freedesktop.org/ + +Support and Bugs + +We use GNOME's bugzilla for bug reports and feature requests: +http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer + +Developers + +GStreamer is stored in Git, hosted at git.freedesktop.org, and can be cloned from there. +Interested developers of the core library, plug-ins, and applications should +subscribe to the gstreamer-devel list. If there is sufficient interest we +will create more lists as necessary. + + +Applications + +Contributors to this release + + * Alessandro Decina + * Alexey Fisher + * Andoni Morales Alastruey + * Antoine Jacoutot + * Arun Raghavan + * Branko Subasic + * Brian Li + * Chad + * David Henningsson + * David Schleef + * David Svensson Fors + * Debarshi Ray + * Edward Hervey + * Gary Ching-Pang Lin + * Guillaume Desmottes + * Ha Nguyen + * Havard Graff + * Jan Schmidt + * Jayakrishnan M + * John Ogness + * Jonas Larsson + * Jonny Lamb + * Julien Isorce + * Konstantin Miller + * Lasse Laukkanen + * Marc Leeman + * Mark Nauwelaerts + * Mart Raudsepp + * Miguel Angel Cabrera Moya + * Monty Montgomery + * Nicola Murino + * Nicolas Baron + * Olivier Crête + * Pascal Buhler + * Peter Korsgaard + * Peter Seiderer + * Philip Jägenstedt + * Philippe Normand + * Raimo Järvi + * Ralph Giles + * Raul Gutierrez Segales + * René Stadler + * Reynaldo H. Verdejo Pinochet + * Robert Krakora + * Sebastian Dröge + * Sebastian Rasmussen + * Sjoerd Simons + * Stas Sergeev + * Stefan Kost + * Stefan Sauer + * Stig Sandnes + * Thiago Santos + * Tim-Philipp Müller + * Tristan Matthews + * Tuukka Pasanen + * Vincent Penquerc'h + * Wim Taymans +  \ No newline at end of file diff --git a/REQUIREMENTS b/REQUIREMENTS new file mode 100644 index 0000000..2b9b535 --- /dev/null +++ b/REQUIREMENTS @@ -0,0 +1,166 @@ +GStreamer uses a *large* array of tools and libraries, most of which are +optional. We have attempted to make sure that any code that depends on +optional libraries doesn't get built unless you have those libraries. If +you find this not to be the case, please, let us know by filing a bug +report at http://bugzilla.gnome.org/. + + +Required tools: +=============== + +An extra set of tools is required if you wish to build GStreamer out of +CVS (using autogen.sh): + +autoconf 2.52 or better +automake 1.5 +gettext 0.11.5 +libtool v1.4 or better +pkgconfig 0.9.0 or better (http://www.freedesktop.org/software/pkgconfig/) + +Required libraries: +=================== + +Package: GStreamer +Version: 0.10.11.2 +Recommended: 0.10.latest +URL: http://gstreamer.freedesktop.org/ +DebianPackage: libgstreamer0.10-dev +Notes: The required version is updated frequently, so the version + listed in this file is often wrong. If you are compiling from CVS, + the required version is often the latest GStreamer CVS. + +Package: GStreamer Base Plugins +Version: 0.10.11.2 +Recommended: 0.10.latest +URL: http://gstreamer.freedesktop.org/ +DebianPackage: libgstreamer-plugins-base0.10-dev +Notes: The required version is updated frequently, so the version + listed in this file is often wrong. If you are compiling from CVS, + the required version is often the latest GStreamer Base Plugins CVS. + + + +Optional libraries: +=================== + +This file lists supporting libraries for which gst-plugins contains plugins, +as well as their minimum version. You can find the corresponding plugins in +ext/(library) + +Package: Orc +Version: >= 0.4.5 +Recommended: 0.4.latest +URL: http://code.entropywave.com/orc +DebianPackage: liborc-0.4-dev +Notes: Used by many plugins for accelerating processing + +Package: GTK+ +Version: >= 2.0 +Recommended: >= 2.2 +URL: http://www.gtk.org/ +DebianPackage: libgtk2.0-dev +Plugins: gdkpixbuf (gdkpixbufdec, gdkpixbufscale) +Notes: Also required by several examples. Plugin require >= 2.2. + +Package: Check +DebianPackage: check +URL: http://check.sourceforge.net/ + +Package: Xlib +Plugins: ximagesrc, v4l2 +DebianPackage: libx11-dev libxv-dev libxt-dev + +Package: AALib +Plugins: aasink +URL: http://aa-project.sourceforge.net/aalib/ + +Package: LibXML +Version: >= 2.4.9 +Plugins: annodex (cmmlenc, cmmldec) +URL: http://xmlsoft.org/ + +Package: Cairo +Version: >= 1.0 +Plugins: cairo (cairotextoverlay, cairotimeoverlay) +URL: http://cairographics.org/ + +Package: CDIO +Version: >= 0.71 +Plugins: cdio (cdiocddasrc) +URL: http://www.gnu.org/software/libcdio/ + +Package: ESound +Version: >= 0.2.12 +Plugins: esdsink +URL: http://www.gnome.org/ + +Package: FLAC +Version: == 1.1.2 +Plugins: flac (flacenc, flacdec) +URL: http://flac.sourceforge.net/ + +Package: GConf +Version: >= 2.0 +Plugins: gconfelements (gconfvideosink, gconfvideosrc, gconfaudiosink, + gconfaudiosrc) +URL: http://www.gnome.org/ + +Package: HAL +Version: >= 0.5.6 +Plugins: halelements (halaudiosink, halaudiosrc) +URL: http://hal.freedesktop.org/ + +Package: IJG JPEG library +Plugins: jpeg (jpegenc, jpegdec, smokeenc, smokedec) +URL: http://www.ijg.org/ + +Package: LADSPA +Plugins: ladspa +URL: http://www.ladspa.org/ + +Package: Libcaca +Plugins: cacasink +URL: http://libcaca.zoy.org/ + +Package: Libdv +Version: >= 0.100 +Plugins: dv (dvdec) +URL: http://libdv.sourceforge.net/ + +Package: Libpng +Version: >= 1.2 +Plugins: png (pngenc, pngdec) +URL: http://www.libpng.org/pub/png/libpng.html + +Package: libraw1394 +Plugins: dv1394 +URL: http://www.linux1394.org/ + +Package: libiec61883 +Plugins: dv1394 +URL: http://www.linux1394.org/ + +Package: libshout +Version: >= 2.0 +URL: http://www.icecast.org/ + +Package: speex +Version: >= 1.0.4 or >= 1.1.5 +Plugins: speex (speexenc, speexdec) +URL: http://www.speex.org/ + +Package: taglib +Version: >= 1.4 +DebianPackage: libtag1-dev +URL: http://developer.kde.org/~wheeler/taglib.html + +Package: zlib +Plugins: id3demux +URL: http://www.zlib.net/ + + +Optional (debian) packages: +=========================== + +gtk-doc-tools 1.6 -- needed to build documentation +python-xml -- needed to build plugin documentation diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..e8cf18e --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1182 @@ +# generated automatically by aclocal 1.11.3 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, +# Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, +[m4_warning([this file was generated for autoconf 2.68. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.3], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.3])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Figure out how to run the assembler. -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_PROG_AS +# ---------- +AC_DEFUN([AM_PROG_AS], +[# By default we simply use the C compiler to build assembly code. +AC_REQUIRE([AC_PROG_CC]) +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS +AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) +AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, +# 2010, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 12 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, +# 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless `enable' is passed literally. +# For symmetry, `disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], +[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2009, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# (`yes' being less verbose, `no' or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], +[ --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0')]) +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few `make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using `$V' instead of `$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([common/m4/as-ac-expand.m4]) +m4_include([common/m4/as-auto-alt.m4]) +m4_include([common/m4/as-compiler-flag.m4]) +m4_include([common/m4/as-gcc-inline-assembly.m4]) +m4_include([common/m4/as-objc.m4]) +m4_include([common/m4/as-python.m4]) +m4_include([common/m4/as-scrub-include.m4]) +m4_include([common/m4/as-version.m4]) +m4_include([common/m4/ax_create_stdint_h.m4]) +m4_include([common/m4/gst-arch.m4]) +m4_include([common/m4/gst-args.m4]) +m4_include([common/m4/gst-check.m4]) +m4_include([common/m4/gst-default.m4]) +m4_include([common/m4/gst-dowhile.m4]) +m4_include([common/m4/gst-error.m4]) +m4_include([common/m4/gst-feature.m4]) +m4_include([common/m4/gst-gettext.m4]) +m4_include([common/m4/gst-glib2.m4]) +m4_include([common/m4/gst-package-release-datetime.m4]) +m4_include([common/m4/gst-platform.m4]) +m4_include([common/m4/gst-plugin-docs.m4]) +m4_include([common/m4/gst-plugindir.m4]) +m4_include([common/m4/gst-x11.m4]) +m4_include([common/m4/gst.m4]) +m4_include([common/m4/gtk-doc.m4]) +m4_include([common/m4/orc.m4]) +m4_include([common/m4/pkg.m4]) +m4_include([m4/aalib.m4]) +m4_include([m4/esd.m4]) +m4_include([m4/gconf-2.m4]) +m4_include([m4/gettext.m4]) +m4_include([m4/gst-fionread.m4]) +m4_include([m4/iconv.m4]) +m4_include([m4/intlmacosx.m4]) +m4_include([m4/lib-ld.m4]) +m4_include([m4/lib-link.m4]) +m4_include([m4/lib-prefix.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([m4/nls.m4]) +m4_include([m4/po.m4]) +m4_include([m4/progtest.m4]) diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..1fcf9f2 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,120 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +DIE=0 +package=gst-plugins-good +srcfile=gst/law/alaw.c + +# Make sure we have common +if test ! -f common/gst-autogen.sh; +then + echo "+ Setting up common submodule" + git submodule init +fi +git submodule update + +# source helper functions +if test ! -f common/gst-autogen.sh; +then + echo There is something wrong with your source tree. + echo You are missing common/gst-autogen.sh + exit 1 +fi +. common/gst-autogen.sh + +# install pre-commit hook for doing clean commits +if test ! \( -x .git/hooks/pre-commit -a -L .git/hooks/pre-commit \); +then + rm -f .git/hooks/pre-commit + ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit +fi + + +CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc' + +autogen_options $@ + +printf "+ check for build tools" +if test ! -z "$NOCHECK"; then echo " skipped"; else echo; fi +version_check "autoconf" "$AUTOCONF autoconf autoconf270 autoconf269 autoconf268 autoconf267 autoconf266 autoconf265 autoconf264 autoconf263 autoconf262 autoconf261 autoconf260" \ + "ftp://ftp.gnu.org/pub/gnu/autoconf/" 2 60 || DIE=1 +version_check "automake" "$AUTOMAKE automake automake-1.11 automake-1.10" \ + "ftp://ftp.gnu.org/pub/gnu/automake/" 1 10 || DIE=1 +version_check "autopoint" "autopoint" \ + "ftp://ftp.gnu.org/pub/gnu/gettext/" 0 17 || DIE=1 +version_check "libtoolize" "$LIBTOOLIZE libtoolize glibtoolize" \ + "ftp://ftp.gnu.org/pub/gnu/libtool/" 1 5 0 || DIE=1 +version_check "pkg-config" "" \ + "http://www.freedesktop.org/software/pkgconfig" 0 8 0 || DIE=1 + +die_check $DIE + +aclocal_check || DIE=1 +autoheader_check || DIE=1 + +die_check $DIE + +# if no arguments specified then this will be printed +if test -z "$*"; then + echo "+ checking for autogen.sh options" + echo " This autogen script will automatically run ./configure as:" + echo " ./configure $CONFIGURE_DEF_OPT" + echo " To pass any additional options, please specify them on the $0" + echo " command line." +fi + +toplevel_check $srcfile + +# autopoint +# older autopoint (< 0.12) has a tendency to complain about mkinstalldirs +if test -x mkinstalldirs; then rm mkinstalldirs; fi +# first remove patch if necessary, then run autopoint, then reapply +if test -f po/Makefile.in.in; +then + patch -p0 -R < common/gettext.patch +fi +tool_run "$autopoint --force" +patch -p0 < common/gettext.patch + +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 +echo timestamp > stamp-h.in 2> /dev/null + +tool_run "$autoconf" +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 + for a in `cat enable`; do + CONFIGURE_FILE_OPT="--enable-$a" + done +fi + +# if disable exists, add an -disable option for each of the lines in that file +if test -f disable; then + for a in `cat disable`; do + CONFIGURE_FILE_OPT="$CONFIGURE_FILE_OPT --disable-$a" + done +fi + +test -n "$NOCONFIGURE" && { + echo "+ skipping configure stage for package $package, as requested." + echo "+ autogen.sh done." + exit 0 +} + +echo "+ running configure ... " +test ! -z "$CONFIGURE_DEF_OPT" && echo " ./configure default flags: $CONFIGURE_DEF_OPT" +test ! -z "$CONFIGURE_EXT_OPT" && echo " ./configure external flags: $CONFIGURE_EXT_OPT" +test ! -z "$CONFIGURE_FILE_OPT" && echo " ./configure enable/disable flags: $CONFIGURE_FILE_OPT" +echo + +./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT $CONFIGURE_FILE_OPT || { + echo " configure failed" + exit 1 +} + +echo "Now type 'make' to compile $package." diff --git a/common/ChangeLog b/common/ChangeLog new file mode 100644 index 0000000..92d0d25 --- /dev/null +++ b/common/ChangeLog @@ -0,0 +1,1712 @@ +2008-12-17 Edward Hervey + + * gst.supp: + And yet another variation of the GstAudioFilter leak. + +2008-12-15 Sebastian Dröge + + Patch by: Roland Illig + + * m4/gst-parser.m4: + Fix AG_GST_BISON_CHECK to handle version numbers with more than + two components (i.e. 2.4.1). Fixes bug #564507. + +2008-12-14 Edward Hervey + + * gst.supp: + And yet another variant of the GstAudioFilter leak. + +2008-12-13 Edward Hervey + + * gst.supp: + Added variants of leaks of dynamic pad templates created in + GstAudioFilter. + Add conditional jump triggered by getaddrinfo (maybe glibc-2.9). + +2008-12-12 Edward Hervey + + * gst.supp: + Fix leak in GIO called by gnomevfs. Nothing we can do about this. + +2008-12-12 Edward Hervey + + * gst.supp: + Added another suppression for dynamic pad templates, in this case + GstAudioFilter. + Added suppression for PangoLanguage which can never be freed + according to the Pango API. + +2008-12-12 Edward Hervey + + * gst.supp: + A whole bunch of suppressions detected on latest gentoo ~amd64. + Make some existing suppressions more generic (for subtle dependecy + code changes). + Added suppressions for glibc-2.9. + Added suppressions for new variants of ALSA leaks. + Added suppressions for a series of leaks in plugins registrations due + to some pad templates' caps calculated at runtime. + Added suppressions for variants of some leaks in pango/fontconfig. + Added suppressions for leak in gstffmpegcsp.c (nothing we can do + about it, but will only exist once). + +2008-12-04 Sebastian Dröge + + * m4/gst-plugin-docs.m4: + Remove the check if $have_gtk_doc equals yes as it's not defined + and $enable_gtk_doc should be good enough. + Also this restores the build of the plugin documentation. + +2008-12-01 Mark Nauwelaerts + + * gst.supp: + Add suppression variant for Ubuntu Hardy x86/64bit. + +2008-12-01 Stefan Kost + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + Simplily uninstall rule. Its closer to upstream and fixes #150331. + +2008-11-29 Sebastian Dröge + + * m4/glib-gettext.m4: + Update glib-gettext.m4 from latest stable GLib release. + +2008-11-29 Sebastian Dröge + + Patch by: Cygwin Ports maintainer + + + * gettext.patch: + Update the gettext patch for use with gettext 0.17 which is + required to build with libtool 2.2 because of conflicts. + First part of bug #556091. + +2008-11-29 Sebastian Dröge + + * m4/gtk-doc.m4: + * m4/pkg.m4: + Update gtk-doc and pkg-config m4 macros from their latest releases. + +2008-11-20 Michael Smith + + * m4/as-objc.m4: + Fix objective C test macro when none of the compilers are found at all. + +2008-10-30 Stefan Kost + + * gtk-doc.mak: + Also cp the entities here to all xinlcude based docs (workaround for + not being able to set up a search path). + +2008-10-17 Jan Schmidt + + * gtk-doc.mak: + Don't clobber the real registry cache file when + building docs. + +2008-10-07 Jan Schmidt - Sun Microsystems + + * m4/gst-error.m4: + Also disable the bogus "loop not entered at top" warnings appearing on Sparc Forte builds. + +2008-10-06 Stefan Kost + + * gtk-doc.mak: + Apply the same fix as below to gtk-doc.mak. Somehow did not end up in + CVS. + +2008-09-05 David Schleef + + * gtk-doc-plugins.mak: Fix the check for gtkdoc-rebase: don't + pass the 'which' error back to make. This fix is more specific + than what is in upstream. + +2008-09-05 David Schleef + + * gtk-doc.mak: Fix the check for gtkdoc-rebase: don't pass the + 'which' error back to make. This fix is more specific than + what is in upstream. + +2008-09-04 Stefan Kost + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + Get closer to upstream makefiles. Don't install index.sgml twice. Call + gtkdoc-rebase (if exists). + +2008-08-21 Stefan Kost + + * gtk-doc-plugins.mak: + Revert $(top_builddir) -> $(builddir) change of rev. 1.39 as there is + no variable called builddir. + +2008-07-31 Mark Nauwelaerts + + * gst.supp: + Add suppressions for Ubunty Hardy x86/64bit, similar to earlier + versions and 32bit variant. + +2008-07-31 Sebastian Dröge + + * m4/gst-feature.m4: + Remove GST_DISABLE_(ENUMTYPES|INDEX|URI). + +2008-07-21 Tim-Philipp Müller + + * m4/gst-error.m4:: + When checking for GST_ERROR_CXXFLAGS, check each compiler flag + individually, not all together. + +2008-07-20 Tim-Philipp Müller + + * m4/gst-parser.m4:: + Fix bison version number detection for older --version + output format (as bison 1.28 on OSX 10.4 outputs). + Fixes #543853. + +2008-07-12 Stefan Kost + + * plugins.xsl: + Split refsect2 also here to make "Element Pads" subtitle visible. + +2008-07-08 Sebastian Dröge + + * m4/gst-error.m4: + Add compiler flags to warn if declarations after statements or + variable length arrays are used. These are C99/GCC extensions and + are not supported by some compilers we want to support. + +2008-07-02 Mark Nauwelaerts + + * gtk-doc-plugins.mak: + Only clean doc maintainer stamps in maintainer-clean. Fixes #539977. + +2008-06-20 Sebastian Dröge + + * gstdoc-scangobj: + Always use format strings for printf-like functions, even if they just + print a string. Fixes bug #536981. + +2008-06-20 Sebastian Dröge + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + Include CFLAGS and LDFLAGS in GTKDOC_CFLAGS and GTKDOC_LDFLAGS, + otherwise the values passed to configure are ignored. + Fixes bug #536978. + +2008-06-05 Tim-Philipp Müller + + * m4/gst-error.m4: + Add -fno-strict-aliasing when compiling with -Werror, to work around + warnings caused by G_LOCK with recent GLib versions (2.16.x) (#316221). + +2008-06-05 Jan Schmidt + + * gtk-doc.mak: + Don't copy html/*.png files unless they don't already exist + in the destdir. Fixes distcheck failure caused by permissions + problems trying to copy a file into the destdir when it already + exists. + +2008-05-28 Stefan Kost + + * plugins.xsl: + The class was not shown in plugin docs. Fix typo in changelog below. + +2008-05-22 Jan Schmidt + + * gstdoc-scangobj: + Emit warnings if one of the GTypes we're expecting is 0 + when scanning. + +2008-05-21 Felipe Contreras + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + Fix installing png images when gtk-doc is disabled. + +2008-05-21 Felipe Contreras + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + Fix make clean when gtk-doc is disabled and other cleanups. + +2008-05-17 Jan Schmidt + + * gtk-doc-plugins.mak: + Be more quiet when the files don't yet exist. + +2008-05-16 Jan Schmidt + + * gstdoc-scangobj: + Add a mechanism for adding 'implicitly created' GTypes into the + scan, allowing for documenting plugin-private base classes that + provide signals or properties for public elements. + + * gtk-doc-plugins.mak: + Use $(builddir) instead of $(top_builddir) in a few places - there's + no need to hard code 'docs/plugins' as the only useable path. + +2008-05-14 Peter Kjellerstedt + + * m4/gst-feature.m4: + Report plug-ins without external dependencies that will not be built + even when the name of the plug-in is a substring of another plug-in, + e.g., goom vs. goom2k1. + +2008-05-14 Tim-Philipp Müller + + * gst.supp: + Add suppression for glibc bug on gutsy/x86-64 + +2008-05-12 Stefan Kost + + * plugins.xsl: + Improve the layout of the caps, but splitting them on ";". + +2008-05-09 Sebastian Dröge + + Patch by: Brian Cameron + + * m4/gst-default.m4: + Don't set the default audio sink to the default visualizer. + Fixes bug #532295. + +2008-05-07 Tim-Philipp Müller + + * check.mak: (help): + Document GST_CHECKS environment variable in checks 'make help'. + +2008-05-06 Sebastian Dröge + + Patch by: Marc-Andre Lureau + + * scangobj-merge.py: + Don't depend on Twisted just for the OrderedDict but implement our + own ordered dictionary class. Fixes bug #531577. + +2008-04-23 Edward Hervey + + * gst.supp: + Re-arrange latest suppressions. + Add all known suppressions for ubuntu hardy. Same as for older + ubuntus, but with different codepaths. + +2008-04-22 Edward Hervey + + * gst.supp: Make tls leak suppression a bit more generic. + +2008-04-22 Edward Hervey + + * gst.supp: Fix ommission in latest commit. + Make tls leak suppression more generic in order to cover more + distributions (and hopefully also future distributions). + +2008-04-22 Edward Hervey + + * gst.supp: Add suppressions for Hardy. + They're just the newer versions of similar suppressions we had + for the previous versions of ubuntu. + +2008-04-15 Sebastian Dröge + + * Makefile.am: + * m4/Makefile.am: + Dist all files in common. Fixes bug #527984. + +2008-04-14 Tim-Philipp Müller + + * m4/gst-function.m4: + Rename AC_CACHE_VAL cache-ids to contain '_cv_' in order to make + autoconf-2.62 complain less. + +2008-04-13 Tim-Philipp Müller + + * m4/gst-args.m4: + * m4/gst-valgrind.m4: + Bump valgrind requirement to 3.0 (which was released in August 2005). + Fixes #489269. Also, check for version >=REQ and not >REQ. + +2008-04-09 Tim-Philipp Müller + + * m4/gst-default.m4: + Add --with-default-{audiosink|audiosrc|videosink|videosrc|visualizer} + configure switches (#519417). + +2008-04-03 Tim-Philipp Müller + + * m4/gst-args.m4: + Add --disable-foo switch for dependency-less plugins (#525586). + +2008-04-01 Sebastian Dröge + + * m4/gst-parser.m4: + Unconditionally require flex 2.5.31 and bison 1.875. + +2008-03-23 Sebastian Dröge + + * m4/gst-arch.m4: + amd64/x86_64 allows unaligned memory access too. + +2008-03-21 Sebastian Dröge + + * m4/gst-dowhile.m4: + Add macro that checks if the compiler supports do {} while (0) + macros and define HAVE_DOWHILE_MACROS if it does. This is + needed by glib/gmacros.h to use something else than + if (1) else for G_STMT_START/END when compling C++, which + causes compiler warnings because of ambigious else with g++ 4.3. + +2008-03-21 Sebastian Dröge + + * m4/gst-plugin-docs.m4: + * mangle-tmpl.py: + Don't depend on PyXML and use only XML modules that are shipped + with python. Fixes bug #519635. + +2008-03-07 Edward Hervey + + * m4/gtk-doc.m4: (GTK_DOC_CHECK): + The previous commit to this file by Stefan Kost mentionned checking for + SED, but NOT checking for gtkdoc-check (wth is that doing there ??). + Therefore, removing the check for gtkdoc-check + +2008-03-03 David Schleef + + * m4/ax_create_stdint_h.m4: Oops, checked in the wrong copy of + this file. (Update from upstream) + +2008-03-03 David Schleef + + * m4/ax_create_stdint_h.m4: Update from upstream. Fixes a bug + compiling with MSVC. + +2008-03-03 Edward Hervey + + * m4/pkg.m4: + Allow override of pkg-config results, as proposed by configure --help. + This is in fact just a backport from upstream pkg.m4. + Fixes #518892 + +2008-03-03 Peter Kjellerstedt + + * ChangeLog: + Changelog surgery of my previous commit to add bugzilla reference. + * m4/gst-args.m4: + Add AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to make it easier + to include and exclude plug-ins without external references, i.e., + plug-ins listed in GST_PLUGINS_SELECTED. (#498222) + +2008-03-03 Sebastian Dröge + + * gst.supp: + Add another glibc suppression. + +2008-02-29 Peter Kjellerstedt + + * m4/gst-feature.m4: + Make the comment before defines generated via AG_GST_CHECK_FEATURE + look nicer. (#498222) + +2008-02-26 Jan Schmidt + + * m4/Makefile.am: + * m4/as-gcc-inline-assembly.m4: + Add Dave Schleef's GCC inline assembly detection macro + for using in gst-plugins-good in the goom 2k4 plugin. + +2008-02-25 Andy Wingo + + * gst-autogen.sh: Instead of only passing certain arguments to + configure, pass anything that we didn't handle. Much friendlier. + Fixes #34412. + +2008-02-23 Jan Schmidt + + * m4/gst-error.m4: + Store the detected compiler flags into ERROR_CFLAGS rather than + ERROR_CXXFLAGS, and use the macro that checks the C compiler, not + the C++ one. + +2008-02-23 Tim-Philipp Müller + + * m4/gst-error.m4: + Reflow checks for additional warning flags so they're not + nested, which fixes the result reporting in the configure + output. + +2008-02-22 Tim-Philipp Müller + + * m4/as-compiler-flag.m4: + Add AS_CXX_COMPILER_FLAG + + * m4/gst-error.m4: + Add AG_GST_SET_ERROR_CXXFLAGS (Forte bits need testing) + +2008-02-22 Tim-Philipp Müller + + * gtk-doc-plugins.mak: + Add 'check-inspected-versions' target; this helps identify + files that should have been removed or where the version + number should (ideally) be updated before a release + (which doesn't happen automatically if the releaser doesn't + build that plugin locally). Not adding at a distcheck hook + yet though, because it's not really that important and would + probably also be a problem on buildbots. + +2008-02-22 Sebastian Dröge + + * gst.supp: + Add even more glibc 2.7 suppressions. + +2008-02-22 Sebastian Dröge + + * gst.supp: + Add another suppression for GLib caching some values after + the first call. + +2008-02-12 Sebastian Dröge + + Patch by: + Tim Mooney + + * m4/gst-error.m4: + Use no%E_MACRO_REDEFINED on Solaris to prevent compiler warnings. + Fixes bug #515905. + +2008-02-11 Sebastian Dröge + + * gst.supp: + Add a few more glibc 2.7 suppressions to make the avisubtitle unit + test valgrind clean. Fixes bug #515703. + +2008-02-08 Stefan Kost + + * ChangeLog: + Changelog surgery for last commit. + +2008-02-08 Stefan Kost + + * m4/gtk-doc.m4: + Conditionally check for SED. Also sync a bit with upstream macro. + +2008-02-08 Stefan Kost + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + Use '$(SED)' instead of 'sed'. Don't use -i for in-place as its gnu + only, move to a temp file instead. + +2008-02-06 Stefan Kost + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + As our docs are versioned, we need to patch the index.sgml file to have + correct paths there, unless we also want to fork gtk-doc's xsl (which + we don't). This hopefully fixes xrefs between modules. + +2008-02-02 Sebastian Dröge + + * m4/gst-feature.m4: + Use printf instead of echo as "echo -e" isn't POSIX and doesn't work + with strict POSIX shells like tcsh or dash and also not every platform + has a /bin/echo that supports it. + +2008-01-24 Stefan Kost + + * ChangeLog: + ChangeLog surgery. + + * gstdoc-scangobj: + Sync the object scanner with gtk-doc fixes. Update args and hierarchy + files. + +2008-01-20 Sebastian Dröge + + * check.mak: + * coverage/lcov.mak: + * gtk-doc-plugins.mak: + * release.mak: + Use $(MAKE) instead of make to fix the build if GNU make is called + something else on the system. + + * m4/as-docbook.m4: + Fix path for docbook.xsl if we have no /etc/xml/catalog and add a + docbook-xsl search path for FreeBSD. + +2008-01-18 Sebastian Dröge + + * gst.supp: + Add a suppression for a glibc bug: + http://valgrind.org/docs/manual/faq.html#faq.exit_errors> + +2008-01-18 Sebastian Dröge + + * gst.supp: + Add some more glibc 2.7 suppressions and make the GLib suppressions + for the home/tmp/etc directory caching a bit more generic. + +2008-01-18 Sebastian Dröge + + * gst.supp: + Add some glibc 2.7 supressions as found on Debian/unstable. + +2008-01-14 Jan Schmidt + + * download-translations: + Apparently I have problems with leaving things commented out when + I edit shell scripts. + +2008-01-12 Jan Schmidt + + * download-translations: + Remove bash-isms + +2008-01-12 Jan Schmidt + + * check-exports: + Restore the cleanup rm of our tmp file which I didn't mean to leave + commented out. + +2008-01-12 Jan Schmidt + + * check-exports: + Fixes to make check-export work on both Solaris and Linux + + * m4/gst-error.m4: + Disable extra warning category (argument mismatch) as an error + on Forte, as it prevents the libcheck fail_if macros from compiling. + + * win32.mak: + Substitute the GStreamer version so things will keep working in 0.11 + +2008-01-11 Tim-Philipp Müller + + Patch by: Peter Kjellerstedt + + * m4/gst-glib2.m4: + * m4/gst-libxml2.m4: + Improve/fix output from configure if either glib-2.0 or + libxml2 are not installed (#498222). + +2008-01-09 Stefan Kost + + * coverage/lcov.mak: + Update coverage make-rules: use them conditionaly, use libtool mode + and use lcov to cleanup. + +2007-12-18 Sebastian Dröge + + * glib-gen.mak: + Also use #include "header" instead of #include
for the + headers that were used to generate the source files for the same + reason as below. + + Remove whitespace before #include. + +2007-12-18 Sebastian Dröge + + * glib-gen.mak: + Use #include "header" instead of #include
for the generated + enum C files as the file will always be in the same directory and + some compilers seem to be a bit strict about that unless . is added + to the include path. + + Include all headers that were used to generate the source files in + the C file as they're used there. + +2007-12-17 Tim-Philipp Müller + + * win32.mak: (win32), (win32defs), (win32crlf): + Make check for CR LF in Visual C++ 6.0 project files + work, based on patch by David Schleef (#496722, #393626). + +2007-12-17 Tim-Philipp Müller + + * Makefile.am: + Don't forget to dist the new win32.mak. + +2007-12-17 Tim-Philipp Müller + + * win32.mak: (win32), (win32defs): + Move common win32 Makefile foo into this new file. + +2007-12-15 Stefan Kost + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + We should have never forked this that much :/. + +2007-12-13 Tim-Philipp Müller + + * check-exports: + Fix build on the ppc64 build bot. + +2007-12-13 Tim-Philipp Müller + + * check-exports: + Suppress more unintentional exports (too much hassle to rename them, + since the win32 project files would need changing too). + +2007-12-12 Tim-Philipp Müller + + * Makefile.am: + check-exports should be disted. + +2007-12-12 Tim-Philipp Müller + + * check-exports: + Add quick'n'dirty script to check the exported symbols of a library + against the symbols in the corresponding .def file (#493983). Based + on script by Ole André Vadla Ravnås. + +2007-11-06 Jan Schmidt + + * gtk-doc-plugins.mak: + Fix distcheck by making sure the types files are treated like the + other gtkdoc-scangobj generated files. + +2007-09-21 Sebastian Dröge + + * m4/gst-args.m4: + Let the AG_GST_ARG_ENABLE_EXPERIMENTAL macro default to disable + building of experimental plugins. Nobody uses it yet and the + --enable--experimental stuff from gst-plugins-good defaults to + disable too. + +2007-09-06 Tim-Philipp Müller + + * gtk-doc-plugins.mak: + Just use the normal 'check' target and avoid a circular + dependency. + +2007-09-06 Tim-Philipp Müller + + * gtk-doc-plugins.mak: + Add rule to error out if .hierarchy file contains tabs. + +2007-08-20 Tim-Philipp Müller + + * download-translations: + * po.mak: + If there are new languages, they need to be added to po/LINGUAS. + +2007-08-20 Tim-Philipp Müller + + * download-translations: + * po.mak: + Fix up 'download-po' a bit, so that we find new translations + for languages that aren't in our po/LINGUAS file yet too. + +2007-07-16 Jan Schmidt + + * gst.supp: + Add a suppression for GLib caching the tmp dir seen on an + Ubuntu Feisty system. + +2007-07-13 Jan Schmidt + + * m4/gst-feature.m4: + If we want to use 'echo -e', call /bin/echo instead of the shell's + since -e is a bash extension, and our /bin/sh might not be being + provided by bash. + +2007-07-01 Thomas Vander Stichele + + * po.mak: + Translation project has moved. Also, no idea how this used to + work given that we weren't downloading a .po file. + +2007-06-25 Stefan Kost + + * gst-xmlinspect.py: + * plugins.xsl: + Also extract element caps for plugin-docs. Fixes parts of #117692. + +2007-06-21 Tim-Philipp Müller + + Patch by: Andreas Schwab + + * m4/gst-feature.m4: + Fix quoting (#449493). + +2007-06-10 Sebastian Dröge + + * m4/gst-parser.m4: + Only generate the parser if bison >= 1.875 _and_ flex >= 2.5.31 is + installed and use pre-generated sources otherwise. Fixes bug #444820. + +2007-05-11 Michael Smith + + * gst.supp: + Suppression variant for our good friend the TLS leak, this time for + Ubuntu Feisty/x86. + +2007-05-09 Tim-Philipp Müller + + * gtk-doc-plugins.mak: + Fix make distcheck again; change some spaces to tabs in makefile. + +2007-04-29 Thomas Vander Stichele + + * gtk-doc-plugins.mak (-module): + Error out when the html build step gives warnings, so they get + fixed properly. + +2007-04-23 Stefan Kost + + * m4/gst-feature.m4: + Add macro AG_GST_PARSE_SUBSYSTEM_DISABLES that checks the defines in + the configuration header and AC_DEFINES the setings. + +2007-04-19 Sebastian Dröge + + Patch by: Vincent Torri + + * m4/gst-parser.m4: + Put the AC_MSG_RESULT output in brackets to get it properly written to + the terminal. + +2007-04-18 Sebastian Dröge + + * m4/gst-parser.m4: + Check for flex >= 2.5.31 and set GENERATE_PARSER if we have at least + that version. Otherwise use pre-generated parser sources as we can't + raise the required flex version. HAVE_MT_SAVE_FLEX is obsolete now + as we use a new enough flex version anyway. First part of #349180 + +2007-04-10 Thomas Vander Stichele + + * m4/gst-check.m4: + Allow pre-setting the GST(PB)_TOOLS/PLUGINS_DIR variables to help + builds against older GStreamer. + +2007-03-25 Sebastian Dröge + + * m4/gst-parser.m4: + Fix the flex version check. It ignored the micro version before. + +2007-03-09 Jan Schmidt + + * check.mak: + Use the same timeout when generating valgrind suppressions as + running the valgrind test. + + * gst.supp: + Add some more suppressions and stuff. + +2007-03-08 Jan Schmidt + + * check.mak: + Make sure GSlice is disabled when building suppressions too. + + * gst.supp: + Add around *850* lines of suppressions for one-time initialisations + inside libasound and gconf/bonobo/ORBit. I feel so dirty. + +2007-03-07 Jan Schmidt + + * gst.supp: + add a suppression for this GConf flup on the FC5 buildbot. + +2007-03-06 Jan Schmidt + + * gst.supp: + Make the suppression a little more generic, to catch the FC5 + backtrace too. + +2007-03-06 Jan Schmidt + + * gst.supp: + Add a suppression for libcdio 0.76. It leaks an internal struct + when the CD-ROM device is not accessible. + +2007-02-28 Thomas Vander Stichele + + * m4/gst-arch.m4: + Move a line that was in the wrong macro + +2007-02-28 Thomas Vander Stichele + + * m4/gst.m4: + Add + * m4/gst-arch.m4: + * m4/gst-args.m4: + * m4/gst-check.m4: + * m4/gst-debuginfo.m4: + * m4/gst-default.m4: + * m4/gst-doc.m4: + * m4/gst-error.m4: + * m4/gst-feature.m4: + * m4/gst-function.m4: + * m4/gst-gettext.m4: + * m4/gst-glib2.m4: + * m4/gst-libxml2.m4: + * m4/gst-parser.m4: + * m4/gst-plugin-docs.m4: + * m4/gst-plugindir.m4: + * m4/gst-valgrind.m4: + * m4/gst-x11.m4: + Convert all macros to use AG_GST style so we can properly warn + when they're missing if configure.ac calls AG_GST_INIT + Will require update in all GStreamer modules. + +2007-02-11 Stefan Kost + + * m4/gst-args.m4: + Remove 'enable' from configure switch description as this leads to + confusing lines like "disable enable builing ...". + * m4/gst-feature.m4: + Fix comment to sound less horrible. + +2007-02-07 Tim-Philipp Müller + + Patch by: Will Newton + + * m4/gst-check.m4: + Use $PKG_CONFIG rather than pkg-config directly, the one in our path + might not be the one we want, like when cross-compiling. Also, other + macros such as PKG_CHECK_MODULES use $PKG_CONFIG, so we should + probably too just for consistency. Fixes #405288. + +2007-01-08 Tim-Philipp Müller + + * m4/gst-parser.m4: + Need to use double square brackets again so m4 doesn't remove them + (fixes #378931). + + * m4/gst-args.m4: + Use double square brackets here as well, for the same reason. + +2007-01-05 Tim-Philipp Müller + + * m4/gst-parser.m4: + Use 'sed' rather than 'tr' to strip trailing letters from version + numbers, since 'tr' might not be available and we know sed is + (#378931). + +2006-10-21 Tim-Philipp Müller + + * check.mak: + Increase default timeout under valgrind, 60 is just too short and + some tests take a bit longer these days and not everyone has a + beefy machine. + +2006-09-29 Michael Smith + + * gst.supp: + More suppressions for edgy. + +2006-09-28 Jan Schmidt + + * m4/gst-glib2.m4: + Use gmodule-no-export-2.0.pc instead of gmodule-2.0.pc - we neither + want nor need --export-dynamic (which ends up making us export a bunch + of unneeded symbols) + +2006-09-14 Tim-Philipp Müller + + * gst.supp: + Some suppressions for the more recent ld.so in ubuntu edgy. + +2006-08-23 Tim-Philipp Müller + + * gst.supp: + Shorten function trail so the suppression works on + my ubuntu dapper system with core cvs as well. + +2006-07-28 Jan Schmidt + + * gst.supp: + Extra suppressions from my Ubuntu x86_64 machine + +2006-07-24 Tim-Philipp Müller + + Patch by: Frederic Peters + + * m4/gst-parser.m4: + Need to double square brackets in .m4 files. Should fix bison + version detection with version numbers like 1.23a (#348354). + +2006-07-24 Jan Schmidt + + * check.mak: + Valgrind fails to find tests written in tests/check/ directly (rather + than a subdir) - because valgrind gets run with a filename that + doesn't contain a relative path, it goes searching /usr/bin instead. + Run with ./.... to make things work either way. + + * gtk-doc-plugins.mak: + Add $(top_builddir)/src as a place to look for plugins + when building too, since that's where gst-template keeps things + +2006-07-23 Stefan Kost + + Patch by: Frederic Peters + + * m4/gst-parser.m4: + Fix bison detection (#348354) + +2006-07-21 Stefan Kost + + * m4/gst-parser.m4: + check for bison and flex + +2006-07-13 Thomas Vander Stichele + + * m4/gst-plugin-docs.m4: + remove the configure argument for enabling plugin doc build; + having gtk-doc enabled and pyxml present is enough of a trigger + +2006-07-03 Thomas Vander Stichele + + * coverage/lcov.mak: + fix up rules to work with gst-python as well + run "make lcov" to test and generate the reports + run "make lcov-reset" to redo it after that + +2006-07-02 Thomas Vander Stichele + + * Makefile.am: + * check.mak: + add an inspect target that inspects every element feature, + so we can have that added for coverage + * coverage/lcov.mak: + add support for lcov + +2006-07-02 Thomas Vander Stichele + + * m4/gst-args.m4: + when building with gcov, reset CFLAGS and friends to O0 + +2006-07-02 Thomas Vander Stichele + + * m4/gst-args.m4: + Find the gcov that matches the gcc version + Only allow gcov if we use gcc + +2006-07-02 Thomas Vander Stichele + + * Makefile.am: + * coverage/coverage-report-entry.pl: + * coverage/coverage-report.pl: + * coverage/coverage-report.xsl: + copy coverage reporting files from dbus + +2006-07-01 Thomas Vander Stichele + + * m4/gst-args.m4: + libtool strips gcov's -f flags, so libgcov does not get + linked in. Setting GCOV_LIBS with -lgcov fixes libtool's + stripping + also show what pkg-config-path we set + +2006-06-22 Tim-Philipp Müller + + Patch by: Peter Kjellerstedt + + * m4/gst-feature.m4: + Show list of plugins without external dependencies that + will not be built as well (#344136). + +2006-06-15 Tim-Philipp Müller + + * m4/gst-plugin-docs.m4: + add GST_PLUGIN_DOCS, which checks for everything needed + to build the plugin docs (namely gtk-doc and pyxml); also + adds a new --enable-plugin-docs configure switch; will + set ENABLE_PLUGIN_DOCS conditional for use in Makefile.am + files (see #344039). + +2006-06-11 Thomas Vander Stichele + + * m4/gst-check.m4: + add GST_PKG_CHECK_MODULES, which in the normal case of checking + for a dependency lib for a plug-in only needs two arguments + to do the right thing. + * m4/gst-feature.m4: + clean up output a little of feature checking; also deal with + non-plug-in feature checks + * m4/Makefile.am: + * m4/gst-gstreamer.m4: + remove this file; it's a useless check + +2006-06-06 Thomas Vander Stichele + + * m4/gst-arch.m4: + add PPC64 so we can have separate structure sizes for it + +2006-06-05 Edward Hervey + + * gtk-doc.mak: + Check for the proper .devhelp2 file to remove. + +2006-05-31 Thomas Vander Stichele + + * gtk-doc.mak: + allow a magic variable to suppress errors from docbuilding + +2006-05-30 Thomas Vander Stichele + + * gtk-doc.mak: + error out if gtkdoc-mktmpl finds unused declarations + +2006-05-28 Edward Hervey + + * gst.supp: + Reverting previous commit. That's good to know, Edward, but why ? + +2006-05-28 Edward Hervey + + * gst.supp: + Added suppresion for memleak in g_option_context_parse on fc5-64 + +2006-05-19 Thomas Vander Stichele + + * m4/gst-check.m4: + set GSTPB_PLUGINS_DIR just like GST_PLUGINS_DIR + +2006-05-18 Tim-Philipp Müller + + * check.mak: + Fix 'make help' in check directories, it should be + 'valgrind.gen-suppressions' not 'valgrind-gen-suppressions' + (not changing target to match help string on purpose to keep + scripts etc. functional). + +2006-05-18 Thomas Vander Stichele + + Patch by: Peter Kjellerstedt + + * m4/gst-arch.m4: + add support for CRIS and CRISv32. + +2006-05-17 Jan Schmidt + + * m4/gst-args.m4: + Fix the macros for command-line supplied package and origin names + so they don't end up being configure as "" (Fixes #341479) + +2006-05-14 Jan Schmidt + + * gtk-doc.mak: + Add uninstall rule to remove .devhelp2 files. + +2006-05-09 Edward Hervey + + * gst.supp: + Add suppression for GSlice version of + g_type_init calloc leak + +2006-04-05 Michael Smith + + * gst.supp: + Delete a bogus suppression for the registry code. + Generalise a suppression for a glib bug (see #337404) + +2006-04-04 Michael Smith + + * gst.supp: + Add a leak suppression: the existing glibc-doesn't-free-TLS one + wasn't triggering here. + +2006-04-04 Michael Smith + + * gst.supp: + Add some minimally-neccesary suppressions for my x86/dapper system. + +2006-04-01 Thomas Vander Stichele + + * plugins.xsl: + Do not display an origin link if origin does not start with http + See #323798 + +2006-04-01 Thomas Vander Stichele + + * m4/gst-args.m4: + * m4/gst-feature.m4: + add more macros + * m4/gst-x11.m4: + X11-related checks + +2006-04-01 Thomas Vander Stichele + + * m4/as-version.m4: + newer version + * m4/gst-args.m4: + * m4/gst-doc.m4: + update and add other macros to be shared across projects + +2006-03-24 Thomas Vander Stichele + + * gst.supp: + add a suppression for g_parse_debug_string + +2006-03-23 Stefan Kost + + * gstdoc-scangobj: + sync fully with gtkdoc-0.15 + +2006-03-23 Stefan Kost + + * gstdoc-scangobj: + * gtk-doc.mak: + sync a little with gtk-doc mainline + +2006-03-17 Wim Taymans + + * gst.supp: + add another clone suppression + change all glibc suppressions to match 2.3.* + +2006-03-09 Thomas Vander Stichele + + * m4/check.m4: + fix test so it actually works when the normal check is used + over debian's/ubuntu's + +2006-03-08 Jan Schmidt + + * check.mak: + Set G_SLICE=always-malloc when valgrinding tests + (closes #333272) + +2006-02-21 Jan Schmidt + + * m4/gst-glib2.m4: + Fix debug output when the GLib version prerequisite is not found + +2006-02-13 Andy Wingo + + * m4/check.m4: Hack around Debian/Ubuntu's broken installation of + the PIC version of check as libcheck_pic.a. Should work with + cross-compilation too. Grr. + +2006-02-06 Thomas Vander Stichele + + * m4/gst-default.m4: + switch to auto* sinks for defaults + +2006-02-02 Wim Taymans + + * check.mak: + add a .valgrind.gen-suppressions target to aid in generating + suppressions + * gst.supp: + add more repressions from my debian glibc as of today + +2006-02-02 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + only add srcdir/gst if it exists + +2006-01-30 Thomas Vander Stichele + + * release.mak: + don't complain about disted enums in win32 + +2006-01-20 Thomas Vander Stichele + + * m4/gst-check.m4: + AC_SUBST CFLAGS and LIBS + do a non-command because something is stripping out our AC_SUBST + +2006-01-20 Thomas Vander Stichele + + * m4/gst-args.m4: + * m4/gst-valgrind.m4: + properly give a "no" result manually when providing a + not-found action to fix configure output + +2006-01-20 Thomas Vander Stichele + + * m4/pkg.m4: + update with a more recent version + +2006-01-07 Thomas Vander Stichele + + * gettext.patch: + make Makefile depend on LINGUAS, so rebuilds work when adding + a language + +2006-01-03 Michael Smith + + * check.mak: + Clarify error message from valgrind test runs. + +2005-12-16 Thomas Vander Stichele + + * m4/gst-arch.m4: + define HOST_CPU + +2005-11-29 Thomas Vander Stichele + + * check.mak: + add a valgrind-forever target for tests + +2005-11-28 Thomas Vander Stichele + + * check.mak: + when a "make test.check" run fails, make it rerun the test with + at least debug level 2 + +2005-11-14 Thomas Vander Stichele + + * m4/Makefile.am: + * m4/gst-check.m4: + fix check for base plugins + * m4/gst-default.m4: + add m4 to set default elements + +2005-10-18 Thomas Vander Stichele + + * m4/gst-check.m4: + check for tools correctly + +2005-10-18 Thomas Vander Stichele + + * gtk-doc.mak: + only enable breaking on new API when make distcheck passes, + not before + +2005-10-18 Thomas Vander Stichele + + * m4/gst-check.m4: + Resurrect Julien's dead body and wipe his mind clean + +2005-10-18 Thomas Vander Stichele + + * m4/gst-check.m4: + Kill Julien + +2005-10-17 Julien MOUTTE + + * m4/gst-check.m4: I know Thomas will kill me but this + ifelse statement seems incorrect as it is always setting + required to "yes". With this one it seems to work. Fixes + build of gst-plugins-base on my setup where gstreamer-check + is definitely not present/required. + +2005-10-18 Stefan Kost + + * gtk-doc.mak: + make build break on new api that has not been added to the + sections file + +2005-10-17 Thomas Vander Stichele + + * m4/gst-glib2.m4: + * m4/Makefile.am: + * m4/gst-check.m4: + add macro for easy checks for GStreamer libs + +2005-10-16 Thomas Vander Stichele + + * m4/gst-glib2.m4: + update, warn in error cases + +2005-10-16 Thomas Vander Stichele + + * m4/gst-error.m4: + add GST_SET_DEFAULT_LEVEL + +2005-10-16 Thomas Vander Stichele + + * m4/Makefile.am: + * m4/gst-gettext.m4: + remove the AM_GNU_GETTEXT* calls, they need to be in configure.ac + * m4/gst-glib2.m4: + clean up and re-use in core soon + * m4/gst-plugindir.m4: + macro to set up PLUGINDIR and plugindir define/var + +2005-10-15 Thomas Vander Stichele + + * m4/Makefile.am: + * m4/gst-gettext.m4: + add macro for setting up gettext + +2005-10-15 Thomas Vander Stichele + + * m4/gst-args.m4: + add some .m4's for argument checking that can be shared among modules + +2005-10-15 Thomas Vander Stichele + + * m4/as-libtool.m4: + set _LT_LDFLAGS + * m4/gst-libxml2.m4: + document + +2005-10-15 Thomas Vander Stichele + + * m4/gst-arch.m4: + indent a little + add AC_REQUIRE + * m4/gst-error.m4: + clean up + +2005-10-12 Thomas Vander Stichele + + * gst-autogen.sh: + update version detection expression to catch stuff like + Libtool (libtool15) 1.5.0 + +2005-10-11 Thomas Vander Stichele + + * gst.supp: + commit 6 new suppressions related to g_module_open; can these + really not be folded into one ? + +2005-10-11 Edward Hervey + + * gst.supp: + made the suppression more generic + Added pthread memleak suppresions + Added nss_parse_* memleak suppresion (used by g_option_context_parse) + +2005-10-11 Thomas Vander Stichele + + * check.mak: + be more strict, more leak resolution + * gst.supp: + clean up the g_type_init suppressions + +2005-10-07 Thomas Vander Stichele + + * m4/Makefile.am: + * m4/gst-valgrind.m4: + put the valgrind detection in an .m4 + +2005-09-29 Thomas Vander Stichele + + * check.mak: + add some more targets, like "help", but also more intensive tests + +2005-09-23 Thomas Vander Stichele + + * gtk-doc.mak: + make certain doc warnings fatal so people maintain docs again + +2005-09-23 Thomas Vander Stichele + + * Makefile.am: + * gtk-doc-plugins.mak: + * scangobj-merge.py: + merge additions from the .signals.new and .args.new file in + the original ones, only updating if necessary + +2005-09-23 Thomas Vander Stichele + + * gst-xmlinspect.py: + * gstdoc-scangobj: + * gtk-doc-plugins.mak: + fix properly for new API; make update in plugins dir now works + +2005-09-20 Thomas Vander Stichele + + * gst-xmlinspect.py: + * gstdoc-scangobj: + some fixes for new API + * gtk-doc-plugins.mak: + set environment properly + +2005-09-17 David Schleef + + * gtk-doc-plugins.mak: Use new environment variables. + +2005-09-16 Michael Smith + + * gstdoc-scangobj: + Make the scanobj code reflect registry/plugin API changes + +2005-09-15 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + split out scanobj step (which will be run by doc maintainer) + from scan step (which will be run on every build) + clean up some of the commands for make distcheck + +2005-09-15 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + * mangle-tmpl.py: + first stab at reorganizing the plugins build so we can maintain + element docs + +2005-09-14 David Schleef + + * as-libtool.mak: Remove + * m4/as-libtool.m4: The libtool bug that this worked around has + been fixed. + * m4/as-version.m4: Don't define GST_RELEASE, since it causes + config.h to be regenerated needlessly, and we don't use it. + +2005-09-14 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + error out on inspect failure + +2005-09-14 Michael Smith + + * glib-gen.mak: + Don't call glib-mkenums with arguments that confuse/break MinGW, + fixes 316155. + +2005-09-03 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + * m4/gst-doc.m4: + separate out gtk-doc and docbook stuff + have two separate --enable configure flags + +2005-08-26 Thomas Vander Stichele + + * check.mak: + add a .gdb target; rebuild registry for each target, otherwise + a code rebuild always triggers a reg rebuild, and it's just too + annoying + * gstdoc-scangobj: + +2005-08-21 Thomas Vander Stichele + + * check.mak: + separate out REGISTRY_ENVIRONMENT; we want to use that from + our valgrind runs, but we also want TESTS_ENVIRONMENT to contain + everything that the first test, gst-register, needs + +2005-08-21 Thomas Vander Stichele + + * check.mak: + parse output of valgrind and check for definitely lost, and error + out; somehow I was led to believe valgrind returns non-zero for + leaks, but I can't make it do that, so let's parse + +2005-08-20 Thomas Vander Stichele + + * check.mak: + for some weird reason valgrind does not report actual memleaks + if GST_PLUGIN_PATH is set to anything but the core gstreamer dir + while valgrind is running. Since the registry is going to go + anyway, I don't want to waste any more time on this; I just run + valgrind without GST_PLUGIN_PATH set. Since the registry loading + doesn't check if GST_PLUGIN_PATH got changed as a reason to rebuild + the registry, that's actually fine. + +2005-08-15 Thomas Vander Stichele + + * mangle-tmpl.py: + keep original Long_Description; only insert an include if it's + not already the first line in there + * plugins.xsl: + output more information for plugins, including an origin hyperlink + +2005-08-15 Thomas Vander Stichele + + * gst-xmlinspect.py: + a first stab at inspecting plugins and outputting an xml description + * gtk-doc-plugins.mak: + a gtk-doc using snippet for plugins documentation + * plugins.xsl: + a stylesheet to convert gst-xmlinspect.py output to docbook output + for inclusion in the gtk-doc stuff + +2005-07-20 Ronald S. Bultje + + * m4/gst-doc.m4: + s/pdf/eps/ in test for whether we output EPS images (#309379). + +2005-07-18 Andy Wingo + + * m4/as-libtool-tags.m4: Ooh, backported from libtool 1.6. Much + better. Thanks, Paolo Bonzini! + + * m4/Makefile.am (EXTRA_DIST): + * m4/as-libtool-tags.m4: New file, tries to disable some CXX and + fortran checks. + +2005-07-08 Thomas Vander Stichele + + * m4/gst-error.m4: + add macro to set ERROR_CFLAGS + +2005-06-30 Jan Schmidt + + * gst-autogen.sh: + Remove the old autoregen.sh if it exists before recreating it, + to prevent confusing any shell process that might be reading it + currently. + +2005-06-29 Thomas Vander Stichele + + * m4/gtk-doc.m4: + added + +2005-06-03 Stefan Kost + + * gst-autogen.sh: create autoregen.sh *before* shifting the options + +2005-05-17 Thomas Vander Stichele + + * gst-autogen.sh: only update autoregen.sh on actual runs + +2005-03-11 Thomas Vander Stichele + + * m4/check.m4: m4 from the check unit test suite + +2004-12-14 David Schleef + + * m4/gst-arch.m4: remove MMX stuff, since it doesn't work and + isn't needed anywhere + +2004-12-08 Thomas Vander Stichele + + * gst-autogen.sh: + allow failure command to be run so we can clean upfrom autopoint + +2004-09-03 Zeeshan Ali Khattak + * m4/gst-feature.m4: Trying to correct the GST_CHECK_CONFIGPROG macro + +2004-07-21 Benjamin Otte + + * m4/.cvsignore: exciting updates for libtool m4 files + +2004-07-12 David Schleef + + * m4/as-objc.m4: Add a macro to test for objective C + +2004-06-12 Thomas Vander Stichele + + * m4/gst-feature.m4: + not all of them support --plugin-libs, so redirect stderr + +2004-06-12 Thomas Vander Stichele + + * m4/as-scrub-include.m4: + sync with upstream to 0.1.4. Fixes #132440 + +2004-06-07 Benjamin Otte + + * m4/gst-feature.m4: + write a big marker into configure output when checking next plugin + to allow easier parsing of why plugins are(n't) built. + +2004-06-01 Thomas Vander Stichele + + * m4/as-compiler-flag.m4: + * m4/as-compiler.m4: + * m4/as-libtool.m4: + * m4/as-version.m4: + sync with upstream, change sticky options to -ko + +2004-05-24 Thomas Vander Stichele + + * m4/as-scrub-include.m4: synced with upstream + +2004-05-03 Thomas Vander Stichele + + * po.mak: + snippet for updating .po files + +2004-03-18 Thomas Vander Stichele + + * Makefile.am: + * m4/Makefile.am: + integrate these with the dist + +2004-03-17 Thomas Vander Stichele + + * release.mak: add a release target + +2004-03-09 Thomas Vander Stichele + + patch by: Stephane Loeuillet + + * m4/ax_create_stdint_h.m4: + use head -n instead of head - (#136500) + +2004-03-05 Thomas Vander Stichele + + * m4/gst-doc.m4: don't build PS without dvips binary + +2004-02-22 Julio M. Merino Vidal + + reviewed by: Benjamin Otte + + * m4/as-docbook.m4: + don't use == operator with test(1) (fixes #135115) + +2004-02-16 Thomas Vander Stichele + + * common/m4/gst-arch.m4: x86_64 is x86 too (clue from Fedora 2 test) + +2004-02-13 Thomas Vander Stichele + + * m4/gst-feature.m4: + remove AM_CONDITIONAL for the subsystem since automake 1.6.x + requires that call be in configure.ac + +2004-02-13 Thomas Vander Stichele + + * m4/gst-libxml2.m4: + take required version as argument, and default to 2.4.9 if not + specified + +2004-02-12 Thomas Vander Stichele + + * m4/gst-feature.m4: + rename and fix up GST_CHECK_DISABLE_SUBSYSTEM + +2004-02-11 Thomas Vander Stichele + + * common/m4/as-ac-expand.m4: + * common/m4/as-auto-alt.m4: + * common/m4/as-compiler-flag.m4: + * common/m4/as-compiler.m4: + * common/m4/as-docbook.m4: + * common/m4/as-libtool.m4: + * common/m4/as-scrub-include.m4: + * common/m4/as-version.m4: + * common/m4/glib-gettext.m4: + * common/m4/gst-arch.m4: + * common/m4/gst-debuginfo.m4: + * common/m4/gst-doc.m4: + * common/m4/gst-feature.m4: + * common/m4/gst-function.m4: + * common/m4/gst-glib2.m4: + * common/m4/gst-gstreamer.m4: + * common/m4/gst-libxml2.m4: + * common/m4/gst-makecontext.m4: + * common/m4/gst-mcsc.m4: + * common/m4/pkg.m4: + fix underquoted macros as reported by automake 1.8.x (#133800) + +2004-02-11 Johan Dahlin + + * gst-autogen.sh: Use A-Z instead of A-z in sed expression to + avoid a warning + +2004-02-05 Thomas Vander Stichele + + * m4/gst-doc.m4: + we use --output-format=xml and --ingnore-files options to + gtkdoc-mkdb, which got added between 0.9 and 1.0 + +2004-02-04 Thomas Vander Stichele + + * m4/as-libtool.m4: remove AM_PROG_LIBTOOL so it can move back + to configure.ac to shut up libtoolize + +2004-02-03 Thomas Vander Stichele + + * glib-gen.mak: added; used to generate enums and marshal code + +2004-01-13 Thomas Vander Stichele + + * gettext.patch: added; used by autogen.sh to make sure + GETTEXT_PACKAGE is understood from po/Makefile.in.in -> po/Makefile.in + diff --git a/common/Makefile.am b/common/Makefile.am new file mode 100644 index 0000000..25966fc --- /dev/null +++ b/common/Makefile.am @@ -0,0 +1,22 @@ +SUBDIRS = m4 + +EXTRA_DIST = \ + ChangeLog \ + gettext.patch \ + glib-gen.mak gtk-doc.mak upload-doc.mak \ + cruft.mak release.mak win32.mak po.mak \ + parallel-subdirs.mak \ + gst-autogen.sh \ + check-exports \ + c-to-xml.py mangle-tmpl.py scangobj-merge.py \ + gtk-doc-plugins.mak \ + plugins.xsl gstdoc-scangobj \ + gst.supp check.mak \ + coverage/lcov.mak \ + coverage/coverage-report.pl \ + coverage/coverage-report.xsl \ + coverage/coverage-report-entry.pl \ + download-translations \ + extract-release-date-from-doap-file \ + gst-indent \ + orc.mak diff --git a/common/Makefile.in b/common/Makefile.in new file mode 100644 index 0000000..dad689b --- /dev/null +++ b/common/Makefile.in @@ -0,0 +1,828 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = common +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = m4 +EXTRA_DIST = \ + ChangeLog \ + gettext.patch \ + glib-gen.mak gtk-doc.mak upload-doc.mak \ + cruft.mak release.mak win32.mak po.mak \ + parallel-subdirs.mak \ + gst-autogen.sh \ + check-exports \ + c-to-xml.py mangle-tmpl.py scangobj-merge.py \ + gtk-doc-plugins.mak \ + plugins.xsl gstdoc-scangobj \ + gst.supp check.mak \ + coverage/lcov.mak \ + coverage/coverage-report.pl \ + coverage/coverage-report.xsl \ + coverage/coverage-report-entry.pl \ + download-translations \ + extract-release-date-from-doap-file \ + gst-indent \ + orc.mak + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu common/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu common/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/common/c-to-xml.py b/common/c-to-xml.py new file mode 100644 index 0000000..397c112 --- /dev/null +++ b/common/c-to-xml.py @@ -0,0 +1,34 @@ +# -*- Mode: Python -*- +# vi:si:et:sw=4:sts=4:ts=4 + +""" +Convert a C program to valid XML to be included in docbook +""" + +import sys +import os +from xml.sax import saxutils + +def main(): + if len(sys.argv) == 1: + sys.stderr.write("Please specify a source file to convert") + sys.exit(1) + source = sys.argv[1] + + if not os.path.exists(source): + sys.stderr.write("%s does not exist.\n" % source) + sys.exit(1) + + content = open(source, "r").read() + + # print header + print '' + print '' + print + print '' + + # print content + print saxutils.escape(content).encode('UTF-8') + print '' + +main() diff --git a/common/check-exports b/common/check-exports new file mode 100755 index 0000000..dd7bafb --- /dev/null +++ b/common/check-exports @@ -0,0 +1,70 @@ +#!/bin/sh +# check-exports +# +# quick'n'dirty script that retrieves the list of exported symbols of a given +# library using 'nm', and compares that against the list of symbols-to-export +# of our win32/common/libfoo.def files. + +if [ $# -ne 2 ]; then + echo "Usage: $0 library.def library.so" + exit 1 +fi + +def_path="$1" +def_name="$(basename $def_path)" +lib_path="$2" + +lib_result="`mktemp /tmp/defname.XXXXXX`" + +LC_ALL=C +export LC_ALL + +# On Solaris, add -p to get the correct output format +NMARGS= +if nm -V 2>&1 |grep Solaris > /dev/null; then + NMARGS=-p +fi + +# FIXME 0.11: in 0.11, we should change the export filter to only export +# _gst_foo, but not __gst_foo (we can't change this now, since we added +# __gst_debug_min and __gst_debug_enabled at some point and need to keep +# ABI compatibility). So below we special-case some symbols that shouldn't +# really be exported, either because we're too lazy to rename them to something +# that's not exported (like the _gst_parse_* stuff) or because we had them in +# public headers at some point although they shouldn't be and so we need to +# keep them exported now (like _gst_debug_init, +# __gst_element_factory_add_interface or +# __gst_element_factory_add_static_pad_template). We suppress them here to +# make sure they're at least not exported in the windows msvc build (they +# were never in the .def file, so they never got exported). +# _end is special cased because for some reason it is reported as an exported +# BSS symbol, unlike on linux where it's a local absolute symbol. +nm $NMARGS $lib_path | awk \ + '{ + if ($3 !~ /^_gst_[a-z]*_init/ && \ + $3 !~ /^__gst_element_details_/ && \ + $3 !~ /^__gst_element_factory_add_/ && \ + $3 !~ /^gst_interfaces_marshal/ && \ + $3 ~ /^[_]*(gst_|Gst|GST_).*/) + { + if ($2 ~ /^[BSDG]$/) + print "\t" $3 " DATA" + else if ($2 == "T") + print "\t" $3 + } + }' | sort | awk '{ if (NR == 1) print "EXPORTS"; print $0; }' \ + > $lib_result + +diffoutput=`diff -u $def_path $lib_result` +diffresult=$? + +rm $lib_result + +if test "$diffresult" -eq 0; then + exit 0; +else + echo -n "$diffoutput" >&2 + echo >&2 + exit 1; +fi + diff --git a/common/check.mak b/common/check.mak new file mode 100644 index 0000000..30487f1 --- /dev/null +++ b/common/check.mak @@ -0,0 +1,181 @@ +# keep target around, since it's referenced in the modules' Makefiles +clean-local-check: + @echo + +if HAVE_VALGRIND +# hangs spectacularly on some machines, so let's not do this by default yet +check-valgrind: + $(MAKE) valgrind +else +check-valgrind: + @true +endif + +LOOPS = 10 + +# run any given test by running make test.check +# if the test fails, run it again at at least debug level 2 +%.check: % + @$(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $* || \ + $(TESTS_ENVIRONMENT) \ + GST_DEBUG=$$GST_DEBUG,*:2 \ + CK_DEFAULT_TIMEOUT=20 \ + $* + +# run any given test in a loop +%.torture: % + @for i in `seq 1 $(LOOPS)`; do \ + $(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $*; done + +# run any given test in an infinite loop +%.forever: % + @while true; do \ + $(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $* || break; done + +# valgrind any given test by running make test.valgrind +%.valgrind: % + @$(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=360 \ + G_SLICE=always-malloc \ + $(LIBTOOL) --mode=execute \ + $(VALGRIND_PATH) -q \ + $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ + --tool=memcheck --leak-check=full --trace-children=yes \ + --leak-resolution=high --num-callers=20 \ + ./$* 2>&1 | tee valgrind.log + @if grep "==" valgrind.log > /dev/null 2>&1; then \ + rm valgrind.log; \ + exit 1; \ + fi + @rm valgrind.log + +# valgrind any given test and generate suppressions for it +%.valgrind.gen-suppressions: % + @$(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=360 \ + G_SLICE=always-malloc \ + $(LIBTOOL) --mode=execute \ + $(VALGRIND_PATH) -q \ + $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ + --tool=memcheck --leak-check=full --trace-children=yes \ + --leak-resolution=high --num-callers=20 \ + --gen-suppressions=all \ + ./$* 2>&1 | tee suppressions.log + +# valgrind any given test until failure by running make test.valgrind-forever +%.valgrind-forever: % + @while $(MAKE) $*.valgrind; do \ + true; done + +# gdb any given test by running make test.gdb +%.gdb: % + @$(TESTS_ENVIRONMENT) \ + CK_FORK=no \ + $(LIBTOOL) --mode=execute \ + gdb $* + +# torture tests +torture: $(TESTS) + -rm test-registry.xml + @echo "Torturing tests ..." + @for i in `seq 1 $(LOOPS)`; do \ + $(MAKE) check || \ + (echo "Failure after $$i runs"; exit 1) || \ + exit 1; \ + done + @banner="All $(LOOPS) loops passed"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo $$dashes; echo $$banner; echo $$dashes + +# forever tests +forever: $(TESTS) + -rm test-registry.xml + @echo "Forever tests ..." + @while true; do \ + $(MAKE) check || \ + (echo "Failure"; exit 1) || \ + exit 1; \ + done + +# valgrind all tests +valgrind: $(TESTS) + @echo "Valgrinding tests ..." + @failed=0; \ + for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ + $(MAKE) $$t.valgrind; \ + if test "$$?" -ne 0; then \ + echo "Valgrind error for test $$t"; \ + failed=`expr $$failed + 1`; \ + whicht="$$whicht $$t"; \ + fi; \ + done; \ + if test "$$failed" -ne 0; then \ + echo "$$failed tests had leaks or errors under valgrind:"; \ + echo "$$whicht"; \ + false; \ + fi + +# valgrind all tests and generate suppressions +valgrind.gen-suppressions: $(TESTS) + @echo "Valgrinding tests ..." + @failed=0; \ + for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ + $(MAKE) $$t.valgrind.gen-suppressions; \ + if test "$$?" -ne 0; then \ + echo "Valgrind error for test $$t"; \ + failed=`expr $$failed + 1`; \ + whicht="$$whicht $$t"; \ + fi; \ + done; \ + if test "$$failed" -ne 0; then \ + echo "$$failed tests had leaks or errors under valgrind:"; \ + echo "$$whicht"; \ + false; \ + fi + +# inspect every plugin feature +GST_INSPECT = $(GST_TOOLS_DIR)/gst-inspect-$(GST_MAJORMINOR) +inspect: + @echo "Inspecting features ..." + @for e in `$(TESTS_ENVIRONMENT) $(GST_INSPECT) | head -n -2 \ + | cut -d: -f2`; \ + do echo Inspecting $$e; \ + $(GST_INSPECT) $$e > /dev/null 2>&1; done + +help: + @echo + @echo "make check -- run all checks" + @echo "make torture -- run all checks $(LOOPS) times" + @echo "make (dir)/(test).check -- run the given check once" + @echo "make (dir)/(test).forever -- run the given check forever" + @echo "make (dir)/(test).torture -- run the given check $(LOOPS) times" + @echo + @echo "make (dir)/(test).gdb -- start up gdb for the given test" + @echo + @echo "make valgrind -- valgrind all tests" + @echo "make valgrind.gen-suppressions -- generate suppressions for all tests" + @echo " and save to suppressions.log" + @echo "make (dir)/(test).valgrind -- valgrind the given test" + @echo "make (dir)/(test).valgrind-forever -- valgrind the given test forever" + @echo "make (dir)/(test).valgrind.gen-suppressions -- generate suppressions" + @echo " and save to suppressions.log" + @echo "make inspect -- inspect all plugin features" + @echo + @echo + @echo "Additionally, you can use the GST_CHECKS environment variable to" + @echo "specify which test(s) should be run. This is useful if you are" + @echo "debugging a failure in one particular test, or want to reproduce" + @echo "a race condition in a single test." + @echo + @echo "Examples:" + @echo + @echo " GST_CHECKS=test_this,test_that make element/foobar.check" + @echo " GST_CHECKS=test_many_threads make element/foobar.forever" + @echo + diff --git a/common/coverage/coverage-report-entry.pl b/common/coverage/coverage-report-entry.pl new file mode 100644 index 0000000..51c506c --- /dev/null +++ b/common/coverage/coverage-report-entry.pl @@ -0,0 +1,69 @@ +#!/usr/bin/perl +# +# Copyright (C) 2006 Daniel Berrange +# +# 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 of the License, 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 + + +print < + +Coverage report for $ARGV[0] + + + +

Coverage report for $ARGV[0]

+ +
+EOF
+
+
+while (<>) {
+    s/&/&/g;
+    s//>/g;
+
+    if (/^\s*function (\S+) called (\d+) returned \d+% blocks executed \d+%/) {
+	my $class = $2 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    } elsif (/^\s*branch\s+\d+\s+taken\s+(\d+)%\s+.*$/) {
+	my $class = $1 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    } elsif (/^\s*branch\s+\d+\s+never executed.*$/) {
+	my $class = "terrible";
+	$_ = "$_";
+    } elsif (/^\s*call\s+\d+\s+never executed.*$/) {
+	my $class = "terrible";
+	$_ = "$_";
+    } elsif (/^\s*call\s+\d+\s+returned\s+(\d+)%.*$/) {
+	my $class = $1 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    }
+
+    print;
+}
+
+print <
+
+
+EOF
diff --git a/common/coverage/coverage-report.pl b/common/coverage/coverage-report.pl
new file mode 100644
index 0000000..ed30f8d
--- /dev/null
+++ b/common/coverage/coverage-report.pl
@@ -0,0 +1,125 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2006 Daniel Berrange
+#
+# 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 of the License, 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
+
+use warnings;
+use strict;
+
+my %coverage = ( functions => {}, files => {} );
+
+my %filemap;
+
+my $type;
+my $name;
+
+my @functions;
+
+while (<>) {
+    if (/^Function '(.*)'\s*$/) {
+	$type = "function";
+	$name = $1;
+	$coverage{$type}->{$name} = {};
+	push @functions, $name;
+    } elsif (/^File '(.*?)'\s*$/) {
+	$type = "file";
+	$name = $1;
+	$coverage{$type}->{$name} = {};
+
+	foreach my $func (@functions) {
+	    $coverage{"function"}->{$func}->{file} = $name;
+	}
+	@functions = ();
+    } elsif (/^Lines executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{lines} = $2;
+	$coverage{$type}->{$name}->{linesCoverage} = $1;
+    } elsif (/^Branches executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{branches} = $2;
+	$coverage{$type}->{$name}->{branchesCoverage} = $1;
+    } elsif (/^Taken at least once:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{conds} = $2;
+	$coverage{$type}->{$name}->{condsCoverage} = $1;
+    } elsif (/^Calls executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{calls} = $2;
+	$coverage{$type}->{$name}->{callsCoverage} = $1;
+    } elsif (/^No branches$/) {
+	$coverage{$type}->{$name}->{branches} = 0;
+	$coverage{$type}->{$name}->{branchesCoverage} = "100.00";
+	$coverage{$type}->{$name}->{conds} = 0;
+	$coverage{$type}->{$name}->{condsCoverage} = "100.00";
+    } elsif (/^No calls$/) {
+	$coverage{$type}->{$name}->{calls} = 0;
+	$coverage{$type}->{$name}->{callsCoverage} = "100.00";
+    } elsif (/^\s*(.*):creating '(.*)'\s*$/) {
+	$filemap{$1} = $2;
+    } elsif (/^\s*$/) {
+	# nada
+    } else {
+	warn "Shit [$_]\n";
+    }
+}
+
+my %summary;
+foreach my $type ("function", "file") {
+    $summary{$type} = {};
+    foreach my $m ("lines", "branches", "conds", "calls") {
+	my $totalGot = 0;
+	my $totalMiss = 0;
+	my $count = 0;
+	foreach my $func (keys %{$coverage{function}}) {
+	    $count++;
+	    my $got = $coverage{function}->{$func}->{$m};
+	    $totalGot += $got;
+	    my $miss = $got * $coverage{function}->{$func}->{$m ."Coverage"} / 100;
+	    $totalMiss += $miss;
+	}
+	$summary{$type}->{$m} = sprintf("%d", $totalGot);
+	$summary{$type}->{$m . "Coverage"} = sprintf("%.2f", $totalMiss / $totalGot * 100);
+    }
+}
+
+
+
+print "\n";
+
+foreach my $type ("function", "file") {
+    printf "<%ss>\n", $type;
+    foreach my $name (sort { $a cmp $b } keys %{$coverage{$type}}) {
+	my $rec = $coverage{$type}->{$name};
+	printf "  \n", $name, ($type eq "file" ? $filemap{$name} : $filemap{$rec->{file}});
+	printf "    \n", $rec->{lines}, $rec->{linesCoverage};
+	if (exists $rec->{branches}) {
+	    printf "    \n", $rec->{branches}, $rec->{branchesCoverage};
+	}
+	if (exists $rec->{conds}) {
+	    printf "    \n", $rec->{conds}, $rec->{condsCoverage};
+	}
+	if (exists $rec->{calls}) {
+	    printf "    \n", $rec->{calls}, $rec->{callsCoverage};
+	}
+	print  "  \n";
+    }
+
+    printf "  \n";
+    printf "    \n", $summary{$type}->{lines}, $summary{$type}->{linesCoverage};
+    printf "    \n", $summary{$type}->{branches}, $summary{$type}->{branchesCoverage};
+    printf "    \n", $summary{$type}->{conds}, $summary{$type}->{condsCoverage};
+    printf "    \n", $summary{$type}->{calls}, $summary{$type}->{callsCoverage};
+    printf  "  \n";
+    printf "\n", $type;
+}
+
+print "\n";
diff --git a/common/coverage/coverage-report.xsl b/common/coverage/coverage-report.xsl
new file mode 100644
index 0000000..b19ebb6
--- /dev/null
+++ b/common/coverage/coverage-report.xsl
@@ -0,0 +1,235 @@
+
+
+
+
+  
+
+  
+    
+      
+        Coverage report
+        
+      
+      
+        

Coverage report

+ + + +
+ + +

Function coverage

+ + + +
+ + + +

File coverage

+ + + +
+ + + + + + + + + + + + + + + + + + + + + odd + + + even + + + + + + + + + + + + + + odd + + + even + + + + + + +
NameLinesBranchesConditionsCalls
+
+ + + + + + + + + + + + + + Summary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + perfect + + + excellant + + + good + + + poor + + + bad + + + terrible + + + + + % of + + +
diff --git a/common/coverage/lcov.mak b/common/coverage/lcov.mak new file mode 100644 index 0000000..fc1f6b2 --- /dev/null +++ b/common/coverage/lcov.mak @@ -0,0 +1,43 @@ +## .PHONY so it always rebuilds it +.PHONY: lcov-reset lcov lcov-run lcov-report lcov-upload + +# run lcov from scratch, always +lcov-reset: + $(MAKE) lcov-run + $(MAKE) lcov-report + +# run lcov from scratch if the dir is not there +lcov: + $(MAKE) lcov-reset + +if GST_GCOV_ENABLED +# reset run coverage tests +lcov-run: + @-rm -rf lcov + lcov --directory . --zerocounters + -if test -d tests/check; then $(MAKE) -C tests/check inspect; fi + -$(MAKE) check + +# generate report based on current coverage data +lcov-report: + mkdir lcov + lcov --compat-libtool --directory . --capture --output-file lcov/lcov.info + lcov --list-full-path -l lcov/lcov.info | grep -v "`cd $(top_srcdir) && pwd`" | cut -d\| -f1 > lcov/remove + lcov --list-full-path -l lcov/lcov.info | grep "tests/check/" | cut -d\| -f1 >> lcov/remove + lcov --list-full-path -l lcov/lcov.info | grep "docs/plugins/" | cut -d\| -f1 >> lcov/remove + lcov -r lcov/lcov.info `cat lcov/remove` > lcov/lcov.cleaned.info + rm lcov/remove + mv lcov/lcov.cleaned.info lcov/lcov.info + genhtml -t "$(PACKAGE_STRING)" -o lcov --num-spaces 2 lcov/lcov.info + +lcov-upload: lcov + rsync -rvz -e ssh --delete lcov/* gstreamer.freedesktop.org:/srv/gstreamer.freedesktop.org/www/data/coverage/lcov/$(PACKAGE) + +else +lcov-run: + echo "Need to reconfigure with --enable-gcov" + +lcov-report: + echo "Need to reconfigure with --enable-gcov" +endif + diff --git a/common/cruft.mak b/common/cruft.mak new file mode 100644 index 0000000..53eec24 --- /dev/null +++ b/common/cruft.mak @@ -0,0 +1,56 @@ +# checks for left-over files in the (usually uninstalled) tree, ie. for +# stuff that best be deleted to avoid problems like having old plugin binaries +# lying around. +# +# set CRUFT_FILES and/or CRUFT_DIRS in your Makefile.am when you include this + +check-cruft: + @cruft_files=""; cruft_dirs=""; \ + for f in $(CRUFT_FILES); do \ + if test -e $$f; then \ + cruft_files="$$cruft_files $$f"; \ + fi \ + done; \ + for d in $(CRUFT_DIRS); do \ + if test -e $$d; then \ + cruft_dirs="$$cruft_dirs $$d"; \ + fi \ + done; \ + if test "x$$cruft_files$$cruft_dirs" != x; then \ + echo; \ + echo "**** CRUFT ALERT *****"; \ + echo; \ + echo "The following files and directories may not be needed any "; \ + echo "longer (usually because a plugin has been merged into "; \ + echo "another plugin, moved to a different module, or been "; \ + echo "renamed), and you probably want to clean them up if you "; \ + echo "don't have local changes: "; \ + echo; \ + for f in $$cruft_files; do echo "file $$f"; done; \ + echo; \ + for d in $$cruft_dirs; do echo "directory $$d"; done; \ + echo; \ + echo "'make clean-cruft' will remove these for you."; \ + echo; \ + fi + +clean-cruft-dirs: + @for d in $(CRUFT_DIRS); do \ + if test -e $$d; then \ + rm -r "$$d" && echo "Removed directory $$d"; \ + fi \ + done + +clean-cruft-files: + @for f in $(CRUFT_FILES); do \ + if test -e $$f; then \ + rm "$$f" && echo "Removed file $$f"; \ + fi \ + done + +clean-cruft: clean-cruft-dirs clean-cruft-files + +# also might want to add this to your Makefile.am: +# +# all-local: check-cruft + diff --git a/common/download-translations b/common/download-translations new file mode 100755 index 0000000..aef1d31 --- /dev/null +++ b/common/download-translations @@ -0,0 +1,152 @@ +#!/bin/sh +# Shell script to download the latest translations for a given GStreamer +# package from translationproject.org + + +# DOMAINS based on http://translationproject.org/extra/matrix.html +# We need to check all domains, not only po/LINGUAS, since there might be +# new translations +DOMAINS=\ +"af am ar az be bg pt_BR bs ca zh_CN cs cy da de el eo es et eu fa fi fr "\ +"ga en_GB gl gu he hi zh_HK hr hu id is it ja ko ku ky lg lt lv mk mn ms "\ +"mt nb ne nl nn or pa pl pt rm ro ru rw sk sl sq sr sv ta tq th tk "\ +"tr zh_TW uk ven vi wa xh zu" + +# for testing/debugging: +#DOMAINS="es fr hu sv pl xx" + +# check for 'diff' program +diff --version 2>/dev/null >/dev/null +if [ ! $? ]; then + echo "==== You must have the 'diff' program installed for this script ====" + exit 1 +fi + +# check for 'wget' program +wget --version 2>/dev/null >/dev/null +if [ ! $? ]; then + echo "==== You must have the 'wget' program installed for this script ====" + exit 1 +fi + +# make sure we're in the top-level directory +if [ ! -d ./po ]; then + echo "==== No ./po directory in the current working directory ====" + exit 1 +fi + +# make sure a package argument was passed to us +if [ -z "$1" ]; then + echo "Usage: $0 PACKAGE, e.g. $0 gst-plugins-good" + exit 1 +fi + +if test "$1" != "gstreamer" -a \ + "$1" != "gst-plugins-base" -a \ + "$1" != "gst-plugins-good" -a \ + "$1" != "gst-plugins-ugly" -a \ + "$1" != "gst-plugins-bad"; then + echo "Unexpected package '$1' ?!" + exit 1 +fi + +PACKAGE="$1" + +DOMAINS_TO_ADD="" +DOMAINS_UPDATED="" +DOMAINS_NOT_IN_LINGUAS="" + +echo "Downloading latest translation files for package $PACKAGE ..." +echo + +for d in $DOMAINS +do + PACKAGE_PO_URL_BASE="http://translationproject.org/latest/$PACKAGE" + PO_URL="$PACKAGE_PO_URL_BASE/$d.po" + PO_FILENAME="$PACKAGE.$d.po" + if wget -q -nc -O $PO_FILENAME $PO_URL; then + # we want all .po files in UTF-8 format really, so convert if needed.. + CHARSET=`grep Content-Type $PO_FILENAME | sed -e 's/.*charset=\(.*\)\\\\n.*/\1/'` + if test "x$CHARSET" != "xUTF-8" -a "x$CHARSET" != "xutf-8"; then + # note: things like the bugs address will be added back by make update-po + if msguniq $PO_FILENAME --no-location \ + --output-file=$PO_FILENAME.utf8 \ + --to-code=UTF-8; then + mv $PO_FILENAME.utf8 $PO_FILENAME + else + echo "**** $d: conversion from $CHARSET to UTF-8 failed ****" + fi + fi + if [ -f "po/$d.po" ]; then + # ./po/foo.po exists, so let's check if ours matches the latest from the + # translation project website + REVDATE_NEW=`grep PO-Revision-Date $PO_FILENAME`; + REVDATE_OLD=`grep PO-Revision-Date po/$d.po`; + CHARSET_OLD=`grep Content-Type po/$d.po | sed -e 's/.*charset=\(.*\)\\\\n.*/\1/'` + if test "x$REVDATE_NEW" = "x$REVDATE_OLD" -a "x$CHARSET_OLD" = "xUTF-8"; then + # note: source code line markers will be removed later by make upload-po + echo "$d.po: up-to-date" + rm -f $PO_FILENAME + else + mv $PO_FILENAME "po/$d.po" + if test "x$CHARSET_OLD" != "xUTF-8" -a "x$CHARSET_OLD" != "xutf-8"; then + echo "$d.po: update (and charset converted from $CHARSET_OLD to UTF-8)" + else + echo "$d.po: updated" + fi + DOMAINS_UPDATED="$DOMAINS_UPDATED $d" + fi + # make sure domain is listed in LINGUAS + if ! grep $d "po/LINGUAS" >/dev/null 2>/dev/null; then + DOMAINS_NOT_IN_LINGUAS="$DOMAINS_NOT_IN_LINGUAS $d" + fi + else + # ./po/foo.po doesn't exist, but foo.po exists on the translation project + # website, so it's probably a new translation + echo "$d.po: new language" + mv $PO_FILENAME "po/$d.po" + DOMAINS_UPDATED="$DOMAINS_UPDATED $d" + DOMAINS_TO_ADD="$DOMAINS_TO_ADD $d" + fi + else + rm -f $PO_FILENAME + echo "$d.po: failure (does probably not exist)" + fi +done + +if [ -n "$DOMAINS_UPDATED" ]; then + echo "====================================================================" + echo + echo "Language domains updated :$DOMAINS_UPDATED" + echo "Language domains to git add :$DOMAINS_TO_ADD" + echo + echo "Source: http://translationproject.org/latest/$PACKAGE/" + echo + if [ -n "$DOMAINS_TO_ADD" ]; then + CMD_STRING="git add" + for d in $DOMAINS_TO_ADD; do + CMD_STRING="$CMD_STRING po/$d.po" + done + echo "Please run" + echo + echo " $CMD_STRING" + echo + echo "now and add the following domains to the po/LINGUAS file:" + echo + echo " $DOMAINS_TO_ADD" + echo + echo + fi + echo "====================================================================" +fi + +if [ -n "$DOMAINS_NOT_IN_LINGUAS" ]; then + echo + echo "Existing domains missing from the po/LINGUAS file:" + echo + echo " $DOMAINS_NOT_IN_LINGUAS" + echo + echo +fi + + diff --git a/common/extract-release-date-from-doap-file b/common/extract-release-date-from-doap-file new file mode 100755 index 0000000..f2bc418 --- /dev/null +++ b/common/extract-release-date-from-doap-file @@ -0,0 +1,32 @@ +#!/bin/sh +# Shell script to extract the date given a release version and a .doap file + +if test "x$1" = "x" -o "x$2" = "x" -o ! -s "$2"; then + echo "Usage: $0 RELEASE-VERSION-NUMBER DOAP-FILE" >&2; + exit 1 +fi + +if ! grep '/dev/null ; then + echo "$2 does not look lika a .doap file" >&2; + exit 1 +fi + +if ! grep "$1" "$2" >/dev/null ; then + echo "$2 contains no reference to a version $1" >&2; + exit 1 +fi + +awk 'BEGIN {x=0} +{ +if ($0~"") {x=1; chunk=""} +if (x==1) { + if ($0~"") { chunk = chunk $0 } + if ($0~"") { chunk = chunk $0 } +} +if ($0~"") {x=0; print chunk} +}' < "$2" | \ +\ +grep ''"$1"'' | \ +\ +sed -e 's/^.*//' -e 's/<\/created>.*$//' + diff --git a/common/gettext.patch b/common/gettext.patch new file mode 100644 index 0000000..682b905 --- /dev/null +++ b/common/gettext.patch @@ -0,0 +1,12 @@ +--- po/Makefile.in.in.orig 2006-01-07 12:03:45.000000000 +0100 ++++ po/Makefile.in.in 2006-01-07 12:04:23.000000000 +0100 +@@ -11,6 +11,9 @@ + PACKAGE = @PACKAGE@ + VERSION = @VERSION@ + ++# thomas: add GETTEXT_PACKAGE substitution as used in Makevars ++GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ ++ + SHELL = /bin/sh + @SET_MAKE@ + diff --git a/common/glib-gen.mak b/common/glib-gen.mak new file mode 100644 index 0000000..ef93a5f --- /dev/null +++ b/common/glib-gen.mak @@ -0,0 +1,44 @@ +# these are the variables your Makefile.am should set +# the example is based on the colorbalance interface + +#glib_enum_headers=$(colorbalance_headers) +#glib_enum_define=GST_COLOR_BALANCE +#glib_enum_prefix=gst_color_balance + +enum_headers=$(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") + +# these are all the rules generating the relevant files +%-marshal.h: %-marshal.list + $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_enum_prefix)_marshal $^ > $*-marshal.h.tmp && \ + mv $*-marshal.h.tmp $*-marshal.h + +%-marshal.c: %-marshal.list + $(AM_V_GEN)echo "#include \"$*-marshal.h\"" >> $*-marshal.c.tmp && \ + glib-genmarshal --body --prefix=$(glib_enum_prefix)_marshal $^ >> $*-marshal.c.tmp && \ + mv $*-marshal.c.tmp $*-marshal.c + +%-enumtypes.h: $(glib_enum_headers) + $(AM_V_GEN)glib-mkenums \ + --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ + --fprod "\n/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ + $^ > $@ + +%-enumtypes.c: $(glib_enum_headers) + @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi + $(AM_V_GEN)glib-mkenums \ + --fhead "#include \"$*-enumtypes.h\"\n$(enum_headers)" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ + $^ > $@ + +# a hack rule to make sure .Plo files exist because they get include'd +# from Makefile's +.deps/%-marshal.Plo: + @touch $@ + +.deps/%-enumtypes.Plo: + @touch $@ diff --git a/common/gst-autogen.sh b/common/gst-autogen.sh new file mode 100644 index 0000000..f05e021 --- /dev/null +++ b/common/gst-autogen.sh @@ -0,0 +1,376 @@ +# a silly hack that generates autoregen.sh but it's handy +# Remove the old autoregen.sh first to create a new file, +# as the current one may be being read by the shell executing +# this script. +if [ -f "autoregen.sh" ]; then + rm autoregen.sh +fi +echo "#!/bin/sh" > autoregen.sh +echo "./autogen.sh $@ \$@" >> autoregen.sh +chmod +x autoregen.sh + +# helper functions for autogen.sh + +debug () +# print out a debug message if DEBUG is a defined variable +{ + if test ! -z "$DEBUG" + then + echo "DEBUG: $1" + fi +} + +version_get () +# based on the command's version output, set variables +# _MAJOR, _MINOR, _MICRO, _VERSION, using the given prefix as variable prefix +# +# arg 1: command binary name +# arg 2: (uppercased) variable name prefix +{ + COMMAND=$1 + VARPREFIX=`echo $2 | tr .,- _` + + # strip everything that's not a digit, then use cut to get the first field + pkg_version=`$COMMAND --version|head -n 1|sed 's/^.*)[^0-9]*//'|cut -d' ' -f1` + debug "pkg_version $pkg_version" + # remove any non-digit characters from the version numbers to permit numeric + # comparison + pkg_major=`echo $pkg_version | cut -d. -f1 | sed s/[a-zA-Z\-].*//g` + pkg_minor=`echo $pkg_version | cut -d. -f2 | sed s/[a-zA-Z\-].*//g` + pkg_micro=`echo $pkg_version | cut -d. -f3 | sed s/[a-zA-Z\-].*//g` + test -z "$pkg_major" && pkg_major=0 + test -z "$pkg_minor" && pkg_minor=0 + test -z "$pkg_micro" && pkg_micro=0 + debug "found major $pkg_major minor $pkg_minor micro $pkg_micro" + eval ${VARPREFIX}_MAJOR=$pkg_major + eval ${VARPREFIX}_MINOR=$pkg_minor + eval ${VARPREFIX}_MICRO=$pkg_micro + eval ${VARPREFIX}_VERSION=$pkg_version +} + +version_compare () +# Checks whether the version of VARPREFIX is equal to or +# newer than the requested version +# arg1: VARPREFIX +# arg2: MAJOR +# arg3: MINOR +# arg4: MICRO +{ + VARPREFIX=`echo $1 | tr .,- _` + MAJOR=$2 + MINOR=$3 + MICRO=$4 + + eval pkg_major=\$${VARPREFIX}_MAJOR; + eval pkg_minor=\$${VARPREFIX}_MINOR; + eval pkg_micro=\$${VARPREFIX}_MICRO; + + #start checking the version + debug "version_compare: $VARPREFIX against $MAJOR.$MINOR.$MICRO" + + # reset check + WRONG= + + if [ ! "$pkg_major" -gt "$MAJOR" ]; then + debug "major: $pkg_major <= $MAJOR" + if [ "$pkg_major" -lt "$MAJOR" ]; then + debug "major: $pkg_major < $MAJOR" + WRONG=1 + elif [ ! "$pkg_minor" -gt "$MINOR" ]; then + debug "minor: $pkg_minor <= $MINOR" + if [ "$pkg_minor" -lt "$MINOR" ]; then + debug "minor: $pkg_minor < $MINOR" + WRONG=1 + elif [ "$pkg_micro" -lt "$MICRO" ]; then + debug "micro: $pkg_micro < $MICRO" + WRONG=1 + fi + fi + fi + if test ! -z "$WRONG"; then + debug "version_compare: $VARPREFIX older than $MAJOR.$MINOR.$MICRO" + return 1 + fi + debug "version_compare: $VARPREFIX equal to/newer than $MAJOR.$MINOR.$MICRO" + return 0 +} + + +version_check () +# check the version of a package +# first argument : package name (executable) +# second argument : optional path where to look for it instead +# third argument : source download url +# rest of arguments : major, minor, micro version +# all consecutive ones : suggestions for binaries to use +# (if not specified in second argument) +{ + PACKAGE=$1 + PKG_PATH=$2 + URL=$3 + MAJOR=$4 + MINOR=$5 + MICRO=$6 + + # for backwards compatibility, we let PKG_PATH=PACKAGE when PKG_PATH null + if test -z "$PKG_PATH"; then PKG_PATH=$PACKAGE; fi + debug "major $MAJOR minor $MINOR micro $MICRO" + VERSION=$MAJOR + if test ! -z "$MINOR"; then VERSION=$VERSION.$MINOR; else MINOR=0; fi + if test ! -z "$MICRO"; then VERSION=$VERSION.$MICRO; else MICRO=0; fi + + debug "major $MAJOR minor $MINOR micro $MICRO" + + for SUGGESTION in $PKG_PATH; do + COMMAND="$SUGGESTION" + + # don't check if asked not to + test -z "$NOCHECK" && { + printf " checking for $COMMAND >= $VERSION ... " + } || { + # we set a var with the same name as the package, but stripped of + # unwanted chars + VAR=`echo $PACKAGE | sed 's/-//g'` + debug "setting $VAR" + eval $VAR="$COMMAND" + return 0 + } + + which $COMMAND > /dev/null 2>&1 + if test $? -eq 1; + then + debug "$COMMAND not found" + continue + fi + + VARPREFIX=`echo $COMMAND | sed 's/-//g' | tr [:lower:] [:upper:]` + version_get $COMMAND $VARPREFIX + + version_compare $VARPREFIX $MAJOR $MINOR $MICRO + if test $? -ne 0; then + echo "found $pkg_version, not ok !" + continue + else + echo "found $pkg_version, ok." + # we set a var with the same name as the package, but stripped of + # unwanted chars + VAR=`echo $PACKAGE | sed 's/-//g'` + debug "setting $VAR" + eval $VAR="$COMMAND" + return 0 + fi + done + + echo "$PACKAGE not found !" + echo "You must have $PACKAGE installed to compile $package." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at $URL" + return 1; +} + +aclocal_check () +{ + # normally aclocal is part of automake + # so we expect it to be in the same place as automake + # so if a different automake is supplied, we need to adapt as well + # so how's about replacing automake with aclocal in the set var, + # and saving that in $aclocal ? + # note, this will fail if the actual automake isn't called automake* + # or if part of the path before it contains it + if [ -z "$automake" ]; then + echo "Error: no automake variable set !" + return 1 + else + aclocal=`echo $automake | sed s/automake/aclocal/` + debug "aclocal: $aclocal" + if [ "$aclocal" != "aclocal" ]; + then + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-aclocal=$aclocal" + fi + if [ ! -x `which $aclocal` ]; then + echo "Error: cannot execute $aclocal !" + return 1 + fi + fi +} + +autoheader_check () +{ + # same here - autoheader is part of autoconf + # use the same voodoo + if [ -z "$autoconf" ]; then + echo "Error: no autoconf variable set !" + return 1 + else + autoheader=`echo $autoconf | sed s/autoconf/autoheader/` + debug "autoheader: $autoheader" + if [ "$autoheader" != "autoheader" ]; + then + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoheader=$autoheader" + fi + if [ ! -x `which $autoheader` ]; then + echo "Error: cannot execute $autoheader !" + return 1 + fi + fi + +} + +autoconf_2_52d_check () +{ + # autoconf 2.52d has a weird issue involving a yes:no error + # so don't allow it's use + test -z "$NOCHECK" && { + ac_version=`$autoconf --version|head -n 1|sed 's/^[a-zA-Z\.\ ()]*//;s/ .*$//'` + if test "$ac_version" = "2.52d"; then + echo "autoconf 2.52d has an issue with our current build." + echo "We don't know who's to blame however. So until we do, get a" + echo "regular version. RPM's of a working version are on the gstreamer site." + exit 1 + fi + } + return 0 +} +libtool_2_2_gettext_check () +{ + # libtool 2.2 needs autopoint 0.17 or higher + version_compare LIBTOOLIZE 2 2 0 + if test $? -eq 0 + then + version_compare AUTOPOINT 0 17 0 + if test $? -ne 0 + then + echo "libtool 2.2 requires autopoint 0.17 or higher" + return 1 + fi + fi + return 0 +} + + +die_check () +{ + # call with $DIE + # if set to 1, we need to print something helpful then die + DIE=$1 + if test "x$DIE" = "x1"; + then + echo + echo "- Please get the right tools before proceeding." + echo "- Alternatively, if you're sure we're wrong, run with --nocheck." + exit 1 + fi +} + +autogen_options () +{ + if test "x$1" = "x"; then + return 0 + fi + + while test "x$1" != "x" ; do + optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + case "$1" in + --noconfigure) + NOCONFIGURE=defined + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --noconfigure" + echo "+ configure run disabled" + shift + ;; + --nocheck) + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --nocheck" + NOCHECK=defined + echo "+ autotools version check disabled" + shift + ;; + -d|--debug) + DEBUG=defined + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --debug" + echo "+ debug output enabled" + shift + ;; + -h|--help) + echo "autogen.sh (autogen options) -- (configure options)" + echo "autogen.sh help options: " + echo " --noconfigure don't run the configure script" + echo " --nocheck don't do version checks" + echo " --debug debug the autogen process" + echo + echo " --with-autoconf PATH use autoconf in PATH" + echo " --with-automake PATH use automake in PATH" + echo + echo "Any argument either not in the above list or after a '--' will be " + echo "passed to ./configure." + exit 1 + ;; + --with-automake=*) + AUTOMAKE=$optarg + echo "+ using alternate automake in $optarg" + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-automake=$AUTOMAKE" + shift + ;; + --with-autoconf=*) + AUTOCONF=$optarg + echo "+ using alternate autoconf in $optarg" + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoconf=$AUTOCONF" + shift + ;; + --) shift ; break ;; + *) + echo "+ passing argument $1 to configure" + CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $1" + shift + ;; + esac + done + + for arg do CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $arg"; done + if test ! -z "$CONFIGURE_EXT_OPT" + then + echo "+ options passed to configure: $CONFIGURE_EXT_OPT" + fi +} + +toplevel_check () +{ + srcfile=$1 + test -f $srcfile || { + echo "You must run this script in the top-level $package directory" + exit 1 + } +} + +tool_run () +{ + tool=$1 + options=$2 + run_if_fail=$3 + echo "+ running $tool $options..." + $tool $options || { + echo + echo $tool failed + eval $run_if_fail + exit 1 + } +} + +install_git_hooks () +{ + if test -d .git; then + # install pre-commit hook for doing clean commits + for hook in pre-commit; do + if test ! \( -x .git/hooks/$hook -a -L .git/hooks/$hook \); then + echo "+ Installing git $hook hook" + rm -f .git/hooks/$hook + ln -s ../../common/hooks/$hook.hook .git/hooks/$hook || { + # if we couldn't create a symbolic link, try doing a plain cp + if cp common/hooks/pre-commit.hook .git/hooks/pre-commit; then + chmod +x .git/hooks/pre-commit; + else + echo "********** Couldn't install git $hook hook **********"; + fi + } + fi + done + fi +} diff --git a/common/gst-glib-gen.mak b/common/gst-glib-gen.mak new file mode 100644 index 0000000..cc82bbd --- /dev/null +++ b/common/gst-glib-gen.mak @@ -0,0 +1,45 @@ +# these are the variables your Makefile.am should set +# the example is based on the colorbalance interface + +#glib_enum_headers=$(colorbalance_headers) +#glib_enum_define=GST_COLOR_BALANCE +#glib_gen_prefix=gst_color_balance +#glib_gen_basename=colorbalance + +enum_headers=$(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") + +# these are all the rules generating the relevant files +$(glib_gen_basename)-marshal.h: $(glib_gen_basename)-marshal.list + $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_gen_prefix)_marshal $^ > $(glib_gen_basename)-marshal.h.tmp && \ + mv $(glib_gen_basename)-marshal.h.tmp $(glib_gen_basename)-marshal.h + +$(glib_gen_basename)-marshal.c: $(glib_gen_basename)-marshal.list + $(AM_V_GEN)echo "#include \"$(glib_gen_basename)-marshal.h\"" >> $(glib_gen_basename)-marshal.c.tmp && \ + glib-genmarshal --body --prefix=$(glib_gen_prefix)_marshal $^ >> $(glib_gen_basename)-marshal.c.tmp && \ + mv $(glib_gen_basename)-marshal.c.tmp $(glib_gen_basename)-marshal.c + +$(glib_gen_basename)-enumtypes.h: $(glib_enum_headers) + $(AM_V_GEN)glib-mkenums \ + --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ + --fprod "\n/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ + $^ > $@ + +$(glib_gen_basename)-enumtypes.c: $(glib_enum_headers) + @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi + $(AM_V_GEN)glib-mkenums \ + --fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ + $^ > $@ + +# a hack rule to make sure .Plo files exist because they get include'd +# from Makefile's +.deps/%-marshal.Plo: + @touch $@ + +.deps/%-enumtypes.Plo: + @touch $@ diff --git a/common/gst-indent b/common/gst-indent new file mode 100755 index 0000000..732b2ba --- /dev/null +++ b/common/gst-indent @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Check that the code follows a consistant code style +# + +# Check for existence of indent, and error out if not present. +# On some *bsd systems the binary seems to be called gnunindent, +# so check for that first. + +version=`gnuindent --version 2>/dev/null` +if test "x$version" = "x"; then + version=`indent --version 2>/dev/null` + if test "x$version" = "x"; then + echo "GStreamer git pre-commit hook:" + echo "Did not find GNU indent, please install it before continuing." + exit 1 + fi + INDENT=indent +else + INDENT=gnuindent +fi + +case `$INDENT --version` in + GNU*) + ;; + default) + echo "GStreamer git pre-commit hook:" + echo "Did not find GNU indent, please install it before continuing." + echo "(Found $INDENT, but it doesn't seem to be GNU indent)" + exit 1 + ;; +esac + +INDENT_PARAMETERS="--braces-on-if-line \ + --case-brace-indentation0 \ + --case-indentation2 \ + --braces-after-struct-decl-line \ + --line-length80 \ + --no-tabs \ + --cuddle-else \ + --dont-line-up-parentheses \ + --continuation-indentation4 \ + --honour-newlines \ + --tab-size8 \ + --indent-level2 \ + --leave-preprocessor-space" + +$INDENT ${INDENT_PARAMETERS} $@ + diff --git a/common/gst.supp b/common/gst.supp new file mode 100644 index 0000000..d7f8961 --- /dev/null +++ b/common/gst.supp @@ -0,0 +1,3963 @@ +### this file contains suppressions for valgrind when running +### the gstreamer unit tests +### it might be useful for wider use as well + +### syscall suppressions + +{ + + Memcheck:Param + clone(parent_tidptr) + fun:clone + fun:clone +} + +{ + + Memcheck:Param + clone(child_tidptr) + fun:clone + fun:clone +} + +{ + + Memcheck:Param + clone(tlsinfo) + fun:clone + fun:clone +} + +### glibc suppressions + +{ + + Memcheck:Cond + obj:/lib/ld-2.*.so + fun:dl_open_worker + obj:/lib/ld-2.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.*.so + fun:_dlerror_run + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_file +} + +{ + + Memcheck:Cond + fun:strlen + fun:fillin_rpath + fun:_dl_init_paths + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start + obj:/lib64/ld-2.*.so + obj:* + obj:* +} + +{ + + Memcheck:Cond + fun:_dl_relocate_object + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start +} + +{ + + Memcheck:Cond + fun:* + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} + +# glibc does not deallocate thread-local storage + +{ + + Memcheck:Leak + fun:calloc + fun:_dl_allocate_tls + fun:pthread_create@@* +} + +# I get an extra stack entry on x86/dapper +{ + + Memcheck:Leak + fun:calloc + obj:/lib/ld-2.3.*.so + fun:_dl_allocate_tls + fun:pthread_create@@* +} + + +{ + + Memcheck:Cond + fun:strstr + fun:__pthread_initialize_minimal + obj:/lib/libpthread-*.so + obj:/lib/libpthread-*.so + fun:call_init + fun:_dl_init + obj:/lib/ld-*.so +} + +# a thread-related free problem in glibc from Edgard +{ + __libc_freeres_rw_acess + Memcheck:Addr4 + obj:* + obj:* + obj:* + obj:* + obj:* + fun:__libc_freeres +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so +} + +# g_module_open-related problems +{ + + Memcheck:Addr2 + fun:memcpy + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_registry_scan_path_level + fun:gst_registry_scan_path_level + fun:gst_registry_scan_path_level + fun:init_post + fun:g_option_context_parse + fun:gst_init_check + fun:gst_init + fun:gst_check_init + fun:main +} + +{ + + Memcheck:Addr4 + fun:memcpy + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_registry_scan_path_level + fun:gst_registry_scan_path_level + fun:gst_registry_scan_path_level + fun:init_post + fun:g_option_context_parse + fun:gst_init_check + fun:gst_init + fun:gst_check_init + fun:main +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:do_sym + fun:_dl_sym + fun:dlsym_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlsym + fun:g_module_symbol + fun:g_module_open + fun:gst_plugin_load_file +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file +} +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_plugin_load_by_name + fun:gst_plugin_feature_load +} + +{ + + Memcheck:Leak + fun:malloc + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_plugin_load_by_name +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:do_sym + fun:_dl_sym + fun:dlsym_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlsym + fun:g_module_symbol + fun:g_module_open +} + +{ + + Memcheck:Param + futex(uaddr2) + fun:pthread_once + obj:/lib/libc-2.3.*.so + obj:/lib/libc-2.3.*.so + fun:mbsnrtowcs + fun:vfprintf + fun:vsprintf + fun:sprintf + obj:/lib/libc-2.3.*.so + fun:tmpfile + fun:setup_pipe + fun:setup_messaging_with_key + fun:setup_messaging +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + fun:_dl_sym + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlsym + fun:g_module_symbol + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + fun:iconv_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + fun:iconv_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + obj:/lib/libc-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/libc-2.7.so + fun:iconv_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + obj:/lib/libc-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/libc-2.7.so + fun:iconv_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +# suppression for a glibc bug: +# http://valgrind.org/docs/manual/faq.html#faq.exit_errors> +{ + + Memcheck:Free + fun:free + obj:*libc-*.so + fun:__libc_freeres + fun:* + fun:_Exit +} + +# same as above, just so it works for tpm on gutsy/x86-64 +{ + + Memcheck:Free + fun:free + fun:free_mem + fun:__libc_freeres +} + +# valgrind doesn't allow me to specify a suppression for Addr1, Addr2, Addr4 +# as Addr*, so 3 copies for that; and then 2 of each for that pesky memcpy +{ + + Memcheck:Addr1 + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr2 + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} +{ + + Memcheck:Addr4 + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr1 + fun:memcpy + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr2 + fun:memcpy + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} +{ + + Memcheck:Addr4 + fun:memcpy + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/libc-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:_dl_open + obj:/lib/libdl-2.3.*.so + obj:/lib/ld-2.3.*.so +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + obj:/lib/libc-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:_dl_open + obj:/lib/libdl-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/libdl-2.3.*.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_plugin_load_by_name + fun:gst_plugin_feature_load +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libc-2.3.6.so + obj:/lib/ld-2.3.6.so + fun:_dl_open + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libc-2.3.6.so + obj:/lib/ld-2.3.6.so + fun:_dl_open + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libc-2.3.6.so + obj:/lib/ld-2.3.6.so + fun:_dl_open + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + fun:dlopen +} + +### glib suppressions +{ + + Memcheck:Cond + fun:g_parse_debug_string + obj:/usr/lib*/libglib-2.0.so.* + fun:g_slice_alloc + fun:g_slice_alloc0 +} + +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_init* + fun:init_pre* +} + +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_register_fundamental +} + +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:g_realloc + fun:type_node_any_new_W +} + +{ + + Memcheck:Leak + fun:realloc + fun:g_realloc + fun:type_node_any_new_W +} + +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:g_type_class_ref +} + +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:g_realloc + fun:type_add_flags_W +} + +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:type_add_flags_W +} + +#pthread memleaks + +{ + Thread creation leak + Memcheck:Leak + fun:calloc + fun:allocate_dtv + fun:_dl_allocate* + fun:_dl_allocate* + fun:__pthread_initialize_minimal +} + +{ + Thread management leak + Memcheck:Leak + fun:calloc + fun:allocate_dtv + fun:_dl_allocate* + fun:_dl_allocate* + fun:__pthread_* +} + +{ + Thread management leak 2 + Memcheck:Leak + fun:memalign + fun:_dl_allocate* + fun:_dl_allocate* + fun:__pthread_* +} + +{ + pthread_create Syscall param write(buf) points to uninitialised byte(s) + Memcheck:Param + write(buf) + fun:pthread_create@@GLIBC_2.2.5 + fun:g_thread_create* + +} + +# nss_parse_* memleak (used by g_option_context_parse) +{ + nss_parse_* memleak + Memcheck:Leak + fun:malloc + fun:nss_parse_service_list + fun:__nss_database_lookup +} + +# liboil suppressions +{ + + Memcheck:Value8 + obj:/usr/lib/liboil-0.3.so.0.1.0 + obj:/usr/lib/liboil-0.3.so.0.1.0 + obj:/usr/lib/liboil-0.3.so.0.1.0 + fun:oil_cpu_fault_check_try + fun:oil_test_check_impl + fun:oil_class_optimize + fun:oil_optimize_all + fun:oil_init +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.3.6.so +} + +{ + + Memcheck:Param + futex(uaddr2) + fun:pthread_once + obj:/lib/libc-2.3.6.so + obj:/lib/libc-2.3.6.so + fun:setlocale + fun:init_pre + fun:g_option_context_parse + fun:gst_init_check + fun:gst_init + fun:gst_check_init + fun:main +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + fun:_dl_open + obj:/lib/libdl-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/libdl-2.3.6.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_file +} +# this exists in a bunch of different variations, hence the short tail/trace +{ + + Memcheck:Addr4 + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so +} +{ + + Memcheck:Addr8 + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so +} + +# More edgy suppressions (Mike) +{ + + Memcheck:Cond + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + fun:dlopen_doit + obj:/lib/ld-2.4.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + fun:dlopen_doit + obj:/lib/ld-2.4.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + fun:do_sym + fun:_dl_sym +} + +# This one's overly general, but there's zero other information in the stack +# trace - just these five lines! +{ + + Memcheck:Cond + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so +} + +{ + + Memcheck:Leak + fun:calloc + obj:/lib/ld-2.4.so + fun:_dl_allocate_tls + fun:pthread_create@@GLIBC_2.1 +} + +# TLS leaks for feisty/x86 +{ + + Memcheck:Leak + fun:calloc + fun:allocate_dtv + fun:_dl_allocate_tls + fun:pthread_create@@GLIBC_2.1 +} + +{ + + Memcheck:Leak + fun:calloc + obj:/usr/lib/libcdio.so.6.0.1 + fun:cdio_open_am_linux + obj:/usr/lib/libcdio.so.6.0.1 + fun:cdio_open_am +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.5.so +} + +{ + + Memcheck:Cond + fun:snd_pcm_direct_shm_create_or_connect + fun:snd_pcm_dsnoop_open + fun:_snd_pcm_dsnoop_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_plug_open + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_asym_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 +} + +{ + + Memcheck:Cond + fun:snd*_pcm_hw_param_set_near +} + +{ + + Memcheck:Cond + ... + fun:snd*_pcm_hw_param_set_near +} + +{ + + Memcheck:Cond + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_close + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Cond + fun:snd_pcm_direct_shm_create_or_connect + fun:snd_pcm_dmix_open + fun:_snd_pcm_dmix_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_softvol_open + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_plug_open + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_asym_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:malloc + fun:strdup + fun:snd_dlobj_cache_add + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:snd_pcm_dsnoop_open + fun:_snd_pcm_dsnoop_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_plug_open + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_asym_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 +} +# Catch about 15 variations on inserting info into an ALSA +# internal cache +{ + + Memcheck:Leak + fun:malloc + ... + fun:snd*_dlobj_cache_add + obj:/*lib*/libasound.so.2.0.0 +} + +{ + + Memcheck:Leak + fun:*alloc + ... + fun:snd_pcm_open_conf +} + +{ + + Memcheck:Leak + fun:*alloc + obj:/*lib*/libasound.so.2.0.0 + ... + fun:snd_config_hook_load +} + +{ + + Memcheck:Leak + fun:*alloc + obj:/*lib*/libasound.so.2.0.0 + ... + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:*alloc + fun:strdup + ... + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:malloc + obj:/lib/libc*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getgrnam_r + fun:getgrnam + fun:snd_pcm_direct_parse_open_conf +} + +{ + + Memcheck:Leak + fun:calloc + fun:_XCBInitDisplayLock + fun:XOpenDisplay +} + +# GConf internal initialisations related to getting the default client. +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so.* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + obj:* + fun:PortableServer_POA_servant_to_reference + fun:* + fun:* + fun:* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so.* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:ORBit_demarshal_value + fun:* + fun:ORBit_small_invoke_stub + fun:ConfigServer_get_default_database + fun:* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:* + fun:IOP_generate_profiles + fun:ORBit_marshal_object + fun:ORBit_marshal_value + fun:* + fun:ORBit_small_invoke_stub + fun:ConfigServer_add_client + fun:* + fun:* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_by_tc + fun:* + fun:PortableServer_POA_servant_to_reference + fun:* + fun:* + fun:* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_by_tc + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so.* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} + +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:* + fun:* + fun:gconf_activate_server +} + +# Some libORBit/bonobo initialisation stuff +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:ORBit_alloc_string + fun:CORBA_string_dup + fun:Bonobo_ActivationEnvValue_set + fun:bonobo_activation_init_activation_env + fun:bonobo_activation_orb_init + fun:bonobo_activation_init +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:PortableServer_POA_servant_to_reference + obj:/usr/lib/libbonobo-2.so* +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + fun:ORBit_small_allocbuf + fun:ORBit_adaptor_setup + obj:/usr/lib/libORBit-2.so* + fun:ORBit_POA_setup_root + fun:ORBit_init_internals + fun:CORBA_ORB_init +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + fun:ORBit_adaptor_setup + fun:* + fun:ORBit_POA_setup_root + fun:ORBit_init_internals + fun:CORBA_ORB_init +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_allocbuf + fun:bonobo_activation_init_activation_env + fun:bonobo_activation_orb_init + fun:bonobo_activation_init +} + +# More GConf stuff from the FC5 buildbot, mostly variations on the +# above stack traces +{ + + Memcheck:Param + writev(vector[...]) + fun:writev + obj:/usr/lib/libORBit-2.so* + fun:link_connection_writev + fun:giop_send_buffer_write + obj:/usr/lib/libORBit-2.so* + fun:ORBit_small_invoke_stub + fun:ORBit_small_invoke_stub_n + fun:ORBit_c_stub_invoke + fun:ConfigServer_ping + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:PortableServer_POA_servant_to_reference + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc + obj:/usr/lib/libORBit-2.so* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:ORBit_demarshal_value + obj:/usr/lib/libORBit-2.so* + fun:ORBit_small_invoke_stub + fun:ORBit_small_invoke_stub_n + fun:ORBit_c_stub_invoke + fun:ConfigServer_get_default_database + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:ORBit_OAObject_object_to_objkey + fun:IOP_generate_profiles + fun:ORBit_marshal_object + fun:ORBit_marshal_value + obj:/usr/lib/libORBit-2.so* + fun:ORBit_small_invoke_stub + fun:ORBit_small_invoke_stub_n + fun:ORBit_c_stub_invoke + fun:ConfigServer_add_client + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:malloc + obj:*libc-*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwnam_r + obj:/usr/lib*/libglib-2.0.so.* + fun:g_get_home_dir +} +{ + + Memcheck:Leak + fun:malloc + obj:*libc-*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwnam_r + obj:/usr/lib*/libglib-2.0.so.* + fun:g_get_user_name +} +{ + + Memcheck:Leak + fun:malloc + obj:*libc-*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwnam_r + obj:/usr/lib*/libglib-2.0.so.* + fun:g_get_tmp_dir +} + +{ + + Memcheck:Leak + fun:malloc + obj:*libc-*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwnam_r + obj:/usr/lib*/libglib-2.0.so.0.* + fun:g_get_host_name +} + + +## Some Fontconfig errors. +{ + + Memcheck:Leak + fun:malloc + fun:FcPatternObjectInsertElt + fun:FcPatternObjectAddWithBinding + fun:FcPatternAppend + fun:FcEndElement + obj:/usr/lib/libexpat.so.* + obj:/usr/lib/libexpat.so.* + obj:/usr/lib/libexpat.so.* + obj:/usr/lib/libexpat.so.* + fun:XML_ParseBuffer + fun:FcConfigParseAndLoad + fun:FcConfigParseAndLoad + fun:FcParseInclude + fun:FcEndElement + obj:/usr/lib/libexpat.so.* + obj:/usr/lib/libexpat.so.* + obj:/usr/lib/libexpat.so.* + obj:/usr/lib/libexpat.so.* + fun:XML_ParseBuffer + fun:FcConfigParseAndLoad +} +{ + + Memcheck:Leak + fun:*alloc + ... + fun:FcInitLoadConfig +} + +# Issues with ubuntu Hardy, same crack as for previous ubuntus +{ + + Memcheck:Leak + fun:calloc + obj:* + fun:_dl_allocate_tls + fun:pthread_create@@* + obj:/usr/lib/libgthread* + fun:g_thread_* +} + +# I've made this version generic, so that it covers future modifications +# of library names +{ + + Memcheck:Leak + fun:calloc + obj:* + fun:_dl_allocate_tls + fun:pthread_create@@* + fun:g_thread_* +} + +# series of invalid read of size 4 in g_module_open for ubuntu +# hardy x86/32bit +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_* +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_* +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_* +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_* +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load* +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libc-2.7.so + fun:_dl_sym + obj:/lib/tls/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libdl-2.7.so + fun:dlsym + fun:g_module_symbol + fun:g_module_open + fun:gst_plugin_load_* +} + +# series of invalid read of size 8 in g_module_open for ubuntu +# hardy x86/64bit +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libdl-2.7.so + fun:dlsym + fun:g_module_symbol + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + fun:__nss_lookup_function + obj:/lib/tls/i686/cmov/libc-2.7.so + fun:__nss_passwd_lookup + fun:getpwnam_r +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + fun:__nss_lookup_function + obj:/lib/tls/i686/cmov/libc-2.7.so + fun:__nss_passwd_lookup + fun:getpwnam_r +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + fun:__nss_lookup_function + obj:/lib/tls/i686/cmov/libnss_compat-2.7.so + fun:_nss_compat_getpwnam_r + fun:getpwnam_r +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/tls/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + fun:__nss_lookup_function + obj:/lib/tls/i686/cmov/libnss_compat-2.7.so + fun:_nss_compat_getpwnam_r + fun:getpwnam_r +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + fun:__nss_lookup_function + obj:/lib/libc-2.7.so + fun:getpwnam_r +} + +## Leaks in ALSA (variations of leak from snd_config_load1) + +{ + + Memcheck:Leak + fun:calloc + fun:_snd_config_make + fun:_snd_config_make_add + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:calloc + fun:_snd_config_make + fun:_snd_config_make_add + fun:* + fun:* + fun:snd_config_load1 +} +{ + + Memcheck:Leak + fun:calloc + fun:_snd_config_make + fun:_snd_config_make_add + fun:* + fun:* + fun:* + fun:snd_config_load1 +} +{ + + Memcheck:Leak + fun:calloc + fun:_snd_config_make + fun:_snd_config_make_add + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:calloc + fun:_snd_config_make + fun:_snd_config_make_add + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:calloc + fun:_snd_config_make + fun:_snd_config_make_add + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} +{ + + Memcheck:Leak + fun:calloc + fun:_snd_config_make + fun:_snd_config_make_add + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:malloc + fun:snd1_dlobj_cache_add + fun:snd_ctl_open_noupdate +} + +{ + + Memcheck:Leak + fun:malloc + fun:* + fun:snd1_dlobj_cache_add + fun:snd_ctl_open_noupdate +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:snd_config_load1 +} + + +# The following are leaks of caps that need to be created dynamically +# in the type registration of the plugin (used for pad templates). + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_caps_new_simple + fun:* + fun:g_type_class_ref + fun:gst_element_register +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:* + fun:* + fun:g_type_class_ref + fun:gst_element_register + fun:gst_ogm_parse_plugin_init + fun:plugin_init +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_caps_copy + fun:gst_video_test_src_base_init + fun:g_type_class_ref + fun:gst_element_register +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_caps_copy + fun:gst_video_test_src_getcaps + fun:gst_video_test_src_base_init + fun:g_type_class_ref + fun:gst_element_register +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_ffmpegcsp_codectype_to_caps + fun:gst_ffmpegcolorspace_register + fun:plugin_init +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_caps_copy + fun:gst_ffmpegcolorspace_register + fun:plugin_init +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_caps_new_any + fun:gst_ffmpegdemux_register + fun:plugin_init +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_caps_copy + fun:gst_audio_filter_class_add_pad_templates +} + +{ + + Memcheck:Leak + fun:realloc + fun:g_realloc + fun:g_ptr_array_maybe_expand + fun:g_ptr_array_add + fun:gst_caps_append + fun:gst_audio_filter_class_add_pad_templates +} + +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:g_realloc + fun:g_ptr_array_maybe_expand + fun:g_ptr_array_add + fun:gst_caps_append + fun:gst_audio_filter_class_add_pad_templates +} + +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:g_realloc + fun:g_ptr_array_maybe_expand + fun:g_ptr_array_add + fun:gst_caps_copy + fun:gst_audio_filter_class_add_pad_templates +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_ptr_array_sized_new + fun:gst_caps_new_empty + fun:gst_caps_copy + fun:gst_audio_filter_class_add_pad_templates +} +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:g_realloc + fun:g_array_maybe_expand + fun:g_array_sized_new + fun:* + fun:* + fun:* + fun:gst_value_init_and_copy + fun:gst_structure_copy + fun:gst_caps_copy + fun:gst_audio_filter_class_add_pad_templates +} +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:g_realloc + fun:g_array_maybe_expand + fun:g_array_sized_new + fun:* + fun:gst_structure_copy + fun:gst_caps_copy + fun:gst_audio_filter_class_add_pad_templates +} +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_array_sized_new + fun:* + fun:gst_structure_copy + fun:gst_caps_copy + fun:gst_audio_filter_class_add_pad_templates +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_riff_create_*_template_caps +} +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:g_realloc + fun:* + fun:* + fun:* + fun:gst_structure_copy + fun:gst_caps_copy + fun:gst_caps_append + fun:gst_riff_create_*_template_caps +} +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_array_sized_new + fun:* + fun:gst_structure_copy + fun:gst_caps_copy + fun:gst_caps_append + fun:gst_riff_create_*_template_caps +} + +## Leaks in pango (bilboed: gentoo unstable amd64) + +{ + + Memcheck:Leak + fun:*alloc + ... + fun:pango_layout_get_pixel_extents +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:pango_language_from_string + fun:pango_language_get_default + fun:pango_context_init + fun:g_type_create_instance + fun:g_object_constructor + fun:g_object_newv + fun:g_object_new_valist + fun:g_object_new + fun:pango_font_map_create_context +} + +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:pango_language_from_string +} + + +## Leak of property_list in gstffmpegcfg.c +## This list is created in gst_ffmpegcsp_init(), called from +## gst_ffmpegenc_register. +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_datalist_id_set_data_full + fun:gst_ffmpeg_cfg_init + fun:gst_ffmpegenc_register + fun:plugin_init +} +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_datalist_id_set_data_full + fun:g_param_spec_set_qdata_full + fun:gst_ffmpeg_cfg_init + fun:gst_ffmpegenc_register + fun:plugin_init +} + + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:gst_ffmpeg_cfg_init + fun:gst_ffmpegenc_register +} + +## Leak of GIO module through gnomevfs + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:* + fun:* + fun:g_type_create_instance + fun:* + fun:* + fun:* + fun:* + fun:g_io_module_new + fun:g_io_modules_load_all_in_directory + fun:* + fun:get_default_vfs +} + +## Conditional jump in getaddrinfo (bilboed, gentoo ~amd64, Dec 13 2008) +{ + + Memcheck:Cond + fun:gaih_inet + fun:getaddrinfo +} + +## Dynamic pad templates in mxfmux +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_slice_alloc + fun:gst_caps_new_empty + fun:gst_caps_from_string + fun:mxf_*_init + fun:plugin_init +} + +## We don't know if ffmpeg frees this or not and better pass a copy for safety +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_strdup + fun:gst_ffmpeg_cfg_fill_context + fun:gst_ffmpegenc_setcaps + fun:gst_pad_set_caps +} + +## Leak/overreads with glibc-2.10 + +{ + + Memcheck:Value8 + fun:do_sym + fun:dlsym_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlsym +} +{ + + Memcheck:Cond + fun:do_sym + fun:dlsym_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlsym +} + +{ + + Memcheck:Value8 + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Value8 + fun:_dl_relocate_object + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Value8 + fun:_dl_check_map_versions + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Cond + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Cond + fun:_dl_relocate_object + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Cond + fun:_dl_check_map_versions + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Cond + fun:_dl_map_object* + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Value8 + fun:_dl_map_object* + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Value8 + fun:_dl_check_caller + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Cond + fun:_dl_check_caller + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen* +} + +{ + + Memcheck:Value8 + obj:/lib*/libc-2.10.*.so + obj:/lib*/libc-2.10.*.so + fun:_vgnU_freeres +} +{ + + Memcheck:Cond + obj:/lib*/libc-2.10.*.so + obj:/lib*/libc-2.10.*.so + fun:_vgnU_freeres +} +{ + + Memcheck:Free + fun:free + obj:/lib*/libc-2.10.*.so + obj:/lib*/libc-2.10.*.so + fun:_vgnU_freeres +} + +{ + + Memcheck:Value8 + fun:_dl_fini + fun:__run_exit_handlers + fun:exit +} + +{ + + Memcheck:Cond + fun:_dl_fini + fun:__run_exit_handlers + fun:exit +} +{ + + Memcheck:Value8 + fun:_dl_sort_fini + fun:_dl_fini + fun:__run_exit_handlers + fun:exit +} + +{ + + Memcheck:Cond + fun:_dl_sort_fini + fun:_dl_fini + fun:__run_exit_handlers + fun:exit +} + +# glibc-2.10 dl overreads +{ + + Memcheck:Value8 + fun:_dl_fixup + fun:_dl_runtime_resolve +} +{ + + Memcheck:Cond + fun:_dl_fixup + fun:_dl_runtime_resolve +} + +{ + + Memcheck:Value8 + fun:_dl_lookup_symbol_x + fun:_dl_fixup + fun:_dl_runtime_resolve +} +{ + + Memcheck:Cond + fun:_dl_lookup_symbol_x + fun:_dl_fixup + fun:_dl_runtime_resolve +} +{ + + Memcheck:Value8 + fun:call_init + fun:_dl_init +} +{ + + Memcheck:Value8 + fun:_dl_init +} +{ + + Memcheck:Value8 + fun:do_lookup_x + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object + fun:dl_main +} +{ + + Memcheck:Cond + fun:do_lookup_x + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object + fun:dl_main +} +{ + + Memcheck:Value8 + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object + fun:dl_main +} +{ + + Memcheck:Value8 + fun:_dl_relocate_object + fun:dl_main +} +{ + + Memcheck:Value8 + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start +} +{ + + Memcheck:Cond + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start +} + +{ + + Memcheck:Cond + fun:* + fun:do_lookup_x + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:* + fun:do_lookup_x + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:_dl_check_map_versions + fun:_dl_check_all_versions + fun:version_check_doit + fun:_dl_receive_error + fun:dl_main +} + +{ + + Memcheck:Cond + fun:_dl_check_map_versions + fun:_dl_check_all_versions + fun:version_check_doit + fun:_dl_receive_error + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:_dl_check_all_versions + fun:version_check_doit + fun:_dl_receive_error + fun:dl_main +} + +{ + + Memcheck:Cond + fun:_dl_check_all_versions + fun:version_check_doit + fun:_dl_receive_error + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:* + fun:_dl_check_map_versions + fun:_dl_check_all_versions + fun:version_check_doit + fun:_dl_receive_error + fun:dl_main +} +{ + + Memcheck:Cond + fun:* + fun:_dl_check_map_versions + fun:_dl_check_all_versions + fun:version_check_doit + fun:_dl_receive_error + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:init_tls + fun:dl_main +} +{ + + Memcheck:Cond + fun:init_tls + fun:dl_main +} + +{ + + Memcheck:Cond + fun:_dl_map_object_deps + fun:dl_main +} +{ + + Memcheck:Value8 + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:_dl_protect_relro + fun:_dl_relocate_object + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:* + fun:do_lookup_x + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:_dl_setup_hash + fun:_dl_map_object_from_fd + fun:_dl_map_object +} + +{ + + Memcheck:Value8 + fun:* + fun:_dl_new_object + fun:_dl_map_object_from_fd + fun:_dl_map_object +} + +{ + + Memcheck:Cond + fun:* + fun:_dl_new_object + fun:_dl_map_object_from_fd + fun:_dl_map_object +} + +{ + + Memcheck:Value8 + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:* + fun:_dl_map_object +} + +{ + + Memcheck:Cond + fun:* + fun:_dl_map_object +} + +{ + + Memcheck:Cond + fun:_dl_map_object + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:_dl_map_object + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Cond + fun:* + fun:_dl_map_object + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:* + fun:open_path + fun:_dl_map_object + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Cond + fun:* + fun:open_path + fun:_dl_map_object + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:_dl_map_object_from_fd + fun:_dl_map_object +} + +{ + + Memcheck:Cond + fun:_dl_map_object_from_fd + fun:_dl_map_object +} + +{ + + Memcheck:Value8 + fun:* + fun:_dl_new_object + fun:_dl_map_object_from_fd + fun:_dl_map_object +} + +{ + + Memcheck:Value8 + fun:_dl_new_object + fun:_dl_map_object_from_fd + fun:_dl_map_object +} + +{ + + Memcheck:Cond + fun:_dl_new_object + fun:_dl_map_object_from_fd + fun:_dl_map_object +} + +{ + + Memcheck:Value8 + fun:* + fun:_dl_name_match_p + fun:_dl_map_object +} + +{ + + Memcheck:Cond + fun:* + fun:* + fun:_dl_map_object +} + +{ + + Memcheck:Value8 + fun:* + fun:_dl_name_match_p + fun:_dl_check_map_versions + fun:_dl_check_all_versions +} + +{ + + Memcheck:Value8 + fun:* + fun:* + fun:do_lookup_x + fun:_dl_lookup_symbol_x +} + +{ + + Memcheck:Cond + fun:do_lookup_x + fun:_dl_lookup_symbol_x +} + +{ + + Memcheck:Value8 + fun:do_lookup_x + fun:_dl_lookup_symbol_x +} + +{ + + Memcheck:Value8 + fun:* + fun:do_lookup_x + fun:_dl_lookup_symbol_x +} +{ + + Memcheck:Cond + fun:* + fun:do_lookup_x + fun:_dl_lookup_symbol_x +} + +{ + + Memcheck:Value8 + fun:_dl_name_match_p + fun:_dl_map_object + fun:dl_open_worker +} +{ + + Memcheck:Cond + fun:_dl_name_match_p + fun:_dl_map_object + fun:dl_open_worker +} + +{ + + Memcheck:Value8 + fun:* + fun:_dl_name_match_p + fun:_dl_map_object + fun:dl_open_worker +} +{ + + Memcheck:Cond + fun:* + fun:_dl_name_match_p + fun:_dl_map_object + fun:dl_open_worker +} + +{ + + Memcheck:Value8 + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object +} +{ + + Memcheck:Cond + fun:_dl_lookup_symbol_x + fun:_dl_relocate_object +} + +{ + + Memcheck:Value8 + fun:* + fun:* + fun:_dl_check_map_versions +} +{ + + Memcheck:Value8 + fun:* + fun:_dl_check_map_versions +} +{ + + Memcheck:Cond + fun:* + fun:* + fun:_dl_check_map_versions +} +{ + + Memcheck:Cond + fun:* + fun:_dl_check_map_versions +} +{ + + Memcheck:Value8 + fun:openaux +} +{ + + Memcheck:Value8 + fun:_dl_name_match_p + fun:_dl_map_object +} + +{ + + Memcheck:Cond + fun:_dl_close_worker + fun:_dl_close + fun:_dl_catch_error + fun:dlerror_run +} +{ + + Memcheck:Value8 + fun:_dl_close_worker + fun:_dl_close + fun:_dl_catch_error + fun:dlerror_run +} +{ + + Memcheck:Cond + fun:* + fun:_dl_close_worker + fun:_dl_close + fun:_dl_catch_error + fun:dlerror_run +} +{ + + Memcheck:Value8 + fun:* + fun:_dl_close_worker + fun:_dl_close + fun:_dl_catch_error + fun:dlerror_run +} + +{ + + Memcheck:Cond + fun:fillin_rpath + fun:_dl_init_paths + fun:dl_main +} +{ + + Memcheck:Value8 + fun:fillin_rpath + fun:_dl_init_paths + fun:dl_main +} +{ + + Memcheck:Cond + fun:* + fun:fillin_rpath + fun:_dl_init_paths + fun:dl_main +} +{ + + Memcheck:Value8 + fun:* + fun:fillin_rpath + fun:_dl_init_paths + fun:dl_main +} + +{ + + Memcheck:Cond + fun:_dl_map_object + fun:map_doit + fun:_dl_catch_error + fun:do_preload + fun:dl_main +} +{ + + Memcheck:Value8 + fun:_dl_map_object + fun:map_doit + fun:_dl_catch_error + fun:do_preload + fun:dl_main +} +{ + + Memcheck:Param + open(filename) + fun:open + fun:open_verify + fun:_dl_map_object + fun:map_doit + fun:_dl_catch_error + fun:do_preload + fun:dl_main +} + +{ + + Memcheck:Param + stat(file_name) + fun:_xstat + fun:open_path + fun:_dl_map_object + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_open_worker +} + +{ + + Memcheck:Cond + fun:* + fun:_dl_map_object_deps + fun:dl_main +} +{ + + Memcheck:Value8 + fun:* + fun:_dl_map_object_deps + fun:dl_main +} + +{ + + Memcheck:Value8 + fun:* + fun:* + fun:_dl_map_object_deps + fun:dl_main +} + +# glibc-2.10 tls issues +{ + + Memcheck:Cond + fun:* + fun:init_tls + fun:dl_main +} +{ + + Memcheck:Value8 + fun:* + fun:init_tls + fun:dl_main +} +{ + + Memcheck:Cond + fun:* + fun:* + fun:init_tls + fun:dl_main +} +{ + + Memcheck:Value8 + fun:* + fun:* + fun:init_tls + fun:dl_main +} + +{ + + Memcheck:Cond + fun:_dl_allocate_tls_init + fun:dl_main +} +{ + + Memcheck:Value8 + fun:_dl_allocate_tls_init + fun:dl_main +} +{ + + Memcheck:Cond + fun:* + fun:_dl_allocate_tls_init + fun:dl_main +} +{ + + Memcheck:Value8 + fun:* + fun:_dl_allocate_tls_init + fun:dl_main +} + +{ + + Memcheck:Cond + fun:__tls* + obj:* + obj:* + fun:_vgnU_freeres +} + +{ + + Memcheck:Param + arch_prctl(arg2) + fun:init_tls +} +# GLib caching tmp/home directories (glibc-2.10 variants) +{ + + Memcheck:Cond + fun:* + fun:dl_open_worker + fun:* + fun:* + fun:* + fun:_dl_catch_error + fun:dlerror_run + fun:* + fun:__nss_lookup_function + fun:__nss_lookup + fun:getpwnam* +} +{ + + Memcheck:Value8 + fun:* + fun:dl_open_worker + fun:* + fun:* + fun:* + fun:_dl_catch_error + fun:dlerror_run + fun:* + fun:__nss_lookup_function + fun:__nss_lookup + fun:getpwnam* +} +{ + + Memcheck:Cond + fun:dl_open_worker + fun:* + fun:* + fun:do_dlopen + fun:* + fun:dlerror_run + fun:* + fun:__nss_lookup_function + fun:__nss_lookup + fun:getpwnam* +} +{ + + Memcheck:Value8 + fun:dl_open_worker + fun:* + fun:* + fun:do_dlopen + fun:* + fun:dlerror_run + fun:* + fun:__nss_lookup_function + fun:__nss_lookup + fun:getpwnam* +} + +{ + + Memcheck:Value8 + fun:_dl_add_to_slotinfo + fun:dl_main +} +{ + + Memcheck:Param + open(filename) + fun:open + fun:open_verify + fun:open_path + fun:_dl_map_object +} + + + +# GModule issues with glibc-2.10 +{ + + Memcheck:Value8 + fun:* + fun:* + fun:dlsym + fun:g_module_symbol +} +{ + + Memcheck:Value8 + fun:g_module_* + fun:gst_plugin* +} +{ + + Memcheck:Value8 + fun:* + fun:g_module_* + fun:gst_plugin* +} + +{ + + Memcheck:Value8 + fun:* + fun:* + fun:dlopen* + fun:g_module_open +} +{ + + Memcheck:Value8 + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:* + fun:dlsym + fun:g_module_symbol +} + +{ + + Memcheck:Value8 + fun:* + fun:* + fun:* + fun:* + fun:* + fun:dlopen* + fun:g_module_open +} + +# Leak in GSlice +{ + + Memcheck:Value8 + fun:g_parse_debug_string + fun:slice_config_init + fun:g_slice_init_nomessage + fun:_g_slice_thread_init_nomessage + fun:g_thread_init_glib +} + +# 2.10 pthread issues +{ + + Memcheck:Value8 + fun:__pthread_initialize_minimal +} + +# glibc 2.11 conditional +{ + + Memcheck:Cond + fun:_dl_relocate_object + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start + obj:/lib64/ld-2.11.so +} + +# glibc 2.11 Leak + +{ + + Memcheck:Leak + fun:*alloc + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:_dl_* + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:_dl_* + fun:_dl_* + fun:_dl_* + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:_dl_* + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:_dl_map_object + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:_dl_new_object + fun:_dl_map_object_from_fd + fun:_dl_map_object + fun:openaux + fun:_dl_catch_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:_dl_* + fun:_dl_* + fun:_dl_* + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} + +# glib type leaks +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_register_static +} + +# new registry system +# all of this will only be created once when loading registry. + +{ + + Memcheck:Leak + fun:*alloc + ... + fun:_priv_gst_registry_chunks_load_plugin +} + +# system-wide tags +# these tags are registered once + +{ + + Memcheck:Leak + fun:*alloc + fun:* + fun:* + fun:gst_tag_register + fun:_gst_tag_initialize +} + +# system-wide type classes that we keep referenced + +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref +} + +# leaking cached queries which are only initialized once +{ + + Memcheck:Leak + fun:*alloc + ... + fun:_gst_query_initialize + fun:init_post +} + +# macosx (leopard) library loader leak +{ + + Memcheck:Leak + fun:_Znwm + fun:_ZNSs4_Rep9_S_createEmmRKSaIcE + fun:_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag + fun:_ZNSsC2EPKcRKSaIcE + fun:_Z41__static_initialization_and_destruction_0ii + fun:_ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE +} + +# GObject type registration +{ + + Memcheck:Leak + fun:*alloc + ... + fun:_g_atomic_array_copy +} + +{ + + Memcheck:Leak + fun:*alloc + fun:getdelim + obj:*libselinux* +} + +{ + + Memcheck:Leak + fun:*alloc + ... + obj:*/sed +} + +{ + + Memcheck:Addr8 + ... + obj:*/sed +} + +# GLib 2.23 interface vtable +{ + + Memcheck:Leak + fun:*alloc + ... + fun:g_type_add_interface_static +} + +{ + + Memcheck:Leak + fun:*alloc + obj:*/dash +} + +# libtool/gentoo fake leak +# it actually runs bash and valgrind complains +{ + + Memcheck:Leak + fun:*alloc + obj:/bin/bash +} + +{ + + Memcheck:Leak + fun:*alloc + ... + fun:_gst_plugin_loader_client_run + fun:main +} + +{ + + Memcheck:Cond + fun:*strcasecmp* + ... + fun:__dcigettext +} + +{ + + Memcheck:Value8 + fun:*strcasecmp* + ... + fun:__dcigettext +} + +{ + + Memcheck:Leak + fun:malloc + ... + fun:gst_poll_new + fun:gst_poll_new_timer + fun:gst_system_clock_init +} + diff --git a/common/gstdoc-scangobj b/common/gstdoc-scangobj new file mode 100755 index 0000000..5b13352 --- /dev/null +++ b/common/gstdoc-scangobj @@ -0,0 +1,1598 @@ +#!/usr/bin/env perl +# -*- cperl -*- +# +# gtk-doc - GTK DocBook documentation generator. +# Copyright (C) 1998 Damon Chaplin +# +# 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 of the License, 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. +# + +# +# This gets information about object hierarchies and signals +# by compiling a small C program. CFLAGS and LDFLAGS must be +# set appropriately before running this script. +# + +use Getopt::Long; + +my $GTK_DOC_PREFIX=`pkg-config --variable prefix gtk-doc`; +if ($GTK_DOC_PREFIX) { + chomp $GTK_DOC_PREFIX; + #print "Adding $GTK_DOC_PREFIX/share/gtk-doc/data to \@INC\n"; + unshift @INC, "$GTK_DOC_PREFIX/share/gtk-doc/data"; +} else { + unshift @INC, '/usr/share/gtk-doc/data'; +} +require "gtkdoc-common.pl"; + +# Options + +# name of documentation module +my $MODULE; +my $OUTPUT_DIR; +my $INSPECT_DIR; +my $VERBOSE; +my $PRINT_VERSION; +my $PRINT_HELP; +my $TYPE_INIT_FUNC="g_type_init ()"; + +# --nogtkinit is deprecated, as it is the default now anyway. +%optctl = (module => \$MODULE, + source => \$SOURCE, + types => \$TYPES_FILE, + nogtkinit => \$NO_GTK_INIT, + 'type-init-func' => \$TYPE_INIT_FUNC, + 'output-dir' => \$OUTPUT_DIR, + 'inspect-dir' => \$INSPECT_DIR, + 'verbose' => \$VERBOSE, + 'version' => \$PRINT_VERSION, + 'help' => \$PRINT_HELP); + +GetOptions(\%optctl, "module=s", "source=s", "types:s", "output-dir:s", "inspect-dir:s", "nogtkinit", "type-init-func:s", "verbose", "version", "help"); + +if ($NO_GTK_INIT) { + # Do nothing. This just avoids a warning. + # the option is not used anymore +} + +if ($PRINT_VERSION) { + print "1.5\n"; + exit 0; +} + +if (!$MODULE) { + $PRINT_HELP = 1; +} + +if ($PRINT_HELP) { + print <$MODULE-scan.c") || die "Cannot open $MODULE-scan.c: $!\n"; + +my $old_signals_filename = "$OUTPUT_DIR/$MODULE.signals"; +my $new_signals_filename = "$OUTPUT_DIR/$MODULE.signals.new"; +my $old_hierarchy_filename = "$OUTPUT_DIR/$MODULE.hierarchy"; +my $new_hierarchy_filename = "$OUTPUT_DIR/$MODULE.hierarchy.new"; +my $old_interfaces_filename = "$OUTPUT_DIR/$MODULE.interfaces"; +my $new_interfaces_filename = "$OUTPUT_DIR/$MODULE.interfaces.new"; +my $old_prerequisites_filename = "$OUTPUT_DIR/$MODULE.prerequisites"; +my $new_prerequisites_filename = "$OUTPUT_DIR/$MODULE.prerequisites.new"; +my $old_args_filename = "$OUTPUT_DIR/$MODULE.args"; +my $new_args_filename = "$OUTPUT_DIR/$MODULE.args.new"; + +my $debug_log="g_message"; +if (!defined($VERBOSE) or $VERBOSE eq "0") { + $debug_log="//$debug_log"; +} + +# write a C program to scan the types + +$includes = ""; +@types = (); +@impl_types = (); + +for () { + if (/^#include/) { + $includes .= $_; + } elsif (/^%/) { + next; + } elsif (/^\s*$/) { + next; + } elsif (/^type:(.*)$/) { + $t = $1; + chomp $t; + push @impl_types, $t; + } else { + chomp; + push @types, $_; + } +} + +$ntypes = @types + @impl_types + 1; + +print OUTPUT < +#include +#include +#include + +$includes + +#ifdef GTK_IS_WIDGET_CLASS +#include +#endif + +static GType *object_types = NULL; + +static GString *xmlstr = NULL; + +static const gchar* +xmlprint (gint indent, const gchar *tag, const gchar *data) +{ + const gchar indent_str[] = " "; + + /* reset */ + g_string_truncate (xmlstr, 0); + g_string_append_len (xmlstr, indent_str, MIN (indent, strlen (indent_str))); + g_string_append_printf (xmlstr, "<%s>", tag); + + if (data) { + gchar *s; + + s = g_markup_escape_text (data, -1); + g_string_append (xmlstr, s); + g_free (s); + } + + g_string_append_printf (xmlstr, "\\n", tag); + return xmlstr->str; +} + +static gint +gst_feature_sort_compare (gconstpointer a, gconstpointer b) +{ + return strcmp (((GstPluginFeature *)a)->name, ((GstPluginFeature *)b)->name); +} + +static gint +static_pad_template_compare (gconstpointer a, gconstpointer b) +{ + GstStaticPadTemplate *spt_a = (GstStaticPadTemplate *) a; + GstStaticPadTemplate *spt_b = (GstStaticPadTemplate *) b; + + /* we want SINK before SRC (enum is UNKNOWN, SRC, SINK) */ + if (spt_a->direction != spt_b->direction) + return spt_b->direction - spt_a->direction; + + /* we want ALWAYS first, SOMETIMES second, REQUEST last + * (enum is ALWAYS, SOMETIMES, REQUEST) */ + if (spt_a->presence != spt_b->presence) + return spt_a->presence - spt_b->presence; + + return strcmp (spt_a->name_template, spt_b->name_template); +} + +static GType * +get_object_types (void) +{ + gpointer g_object_class; + GList *plugins = NULL; + GList *factories = NULL; + GList *l; + GstElementFactory *factory = NULL; + GType type; + gint i = 0; + gboolean reinspect; + + /* get a list of features from plugins in our source module */ + plugins = gst_registry_get_plugin_list (gst_registry_get_default()); + + xmlstr = g_string_new (""); + + reinspect = !g_file_test ("scanobj-build.stamp", G_FILE_TEST_EXISTS); + + while (plugins) { + GList *features; + GstPlugin *plugin; + const gchar *source; + FILE *inspect = NULL; + gchar *inspect_name; + + plugin = (GstPlugin *) (plugins->data); + plugins = g_list_next (plugins); + source = gst_plugin_get_source (plugin); + if (!source || strcmp (source, "$SOURCE") != 0) { + continue; + } + + /* skip static coreelements plugin with pipeline and bin element factory */ + if (gst_plugin_get_filename (plugin) == NULL) + continue; + + $debug_log ("plugin: %s source: %s", plugin->desc.name, source); + + if (reinspect) { + inspect_name = g_strdup_printf ("$INSPECT_DIR" G_DIR_SEPARATOR_S "plugin-%s.xml", + plugin->desc.name); + inspect = fopen (inspect_name, "w"); + if (inspect == NULL) { + g_error ("Could not open %s for writing: %s\\n", inspect_name, + g_strerror (errno)); + } + g_free (inspect_name); + + /* output plugin data */ + fputs ("\\n",inspect); + fputs (xmlprint(2, "name", plugin->desc.name),inspect); + fputs (xmlprint(2, "description", plugin->desc.description),inspect); + fputs (xmlprint(2, "filename", plugin->filename),inspect); + fputs (xmlprint(2, "basename", plugin->basename),inspect); + fputs (xmlprint(2, "version", plugin->desc.version),inspect); + fputs (xmlprint(2, "license", plugin->desc.license),inspect); + fputs (xmlprint(2, "source", plugin->desc.source),inspect); + fputs (xmlprint(2, "package", plugin->desc.package),inspect); + fputs (xmlprint(2, "origin", plugin->desc.origin),inspect); + fputs (" \\n", inspect); + } + + features = + gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), + plugin->desc.name); + + /* sort factories by feature->name */ + features = g_list_sort (features, gst_feature_sort_compare); + + while (features) { + GstPluginFeature *feature; + feature = GST_PLUGIN_FEATURE (features->data); + feature = gst_plugin_feature_load (feature); + if (!feature) { + g_warning ("Could not load plugin feature %s", + gst_plugin_feature_get_name (feature)); + } + + if (GST_IS_ELEMENT_FACTORY (feature)) { + const gchar *pad_dir[] = { "unknown","source","sink" }; + const gchar *pad_pres[] = { "always","sometimes","request" }; + GList *pads, *pad; + + $debug_log (" feature: %s", feature->name); + + factory = GST_ELEMENT_FACTORY (feature); + factories = g_list_prepend (factories, factory); + + if (reinspect) { + /* output element data */ + fputs (" \\n", inspect); + fputs (xmlprint(6, "name", feature->name),inspect); + fputs (xmlprint(6, "longname", gst_element_factory_get_longname (factory)),inspect); + fputs (xmlprint(6, "class", gst_element_factory_get_klass (factory)),inspect); + fputs (xmlprint(6, "description", gst_element_factory_get_description (factory)),inspect); + fputs (xmlprint(6, "author", gst_element_factory_get_author (factory)),inspect); + fputs (" \\n", inspect); + + /* output pad-template data */ + pads = g_list_copy ((GList *) gst_element_factory_get_static_pad_templates (factory)); + pads = g_list_sort (pads, static_pad_template_compare); + for (pad = pads; pad != NULL; pad = pad->next) { + GstStaticPadTemplate *pt = pad->data; + + fputs (" \\n", inspect); + fputs (xmlprint(10, "name", pt->name_template),inspect); + fputs (xmlprint(10, "direction", pad_dir[pt->direction]),inspect); + fputs (xmlprint(10, "presence", pad_pres[pt->presence]),inspect); + fputs (xmlprint(10, "details", pt->static_caps.string),inspect); + fputs (" \\n", inspect); + } + g_list_free (pads); + fputs (" \\n \\n", inspect); + } + } + features = g_list_next (features); + } + + if (reinspect) { + fputs (" \\n", inspect); + fclose (inspect); + } + } + + g_string_free (xmlstr, TRUE); + + $debug_log ("number of element factories: %d", g_list_length (factories)); + + /* allocate the object_types array to hold them */ + object_types = g_new0 (GType, g_list_length (factories)+$ntypes+1); + + l = factories; + i = 0; + + /* fill it */ + while (l) { + factory = GST_ELEMENT_FACTORY (l->data); + type = gst_element_factory_get_element_type (factory); + if (type != 0) { + $debug_log ("adding type for factory %s", gst_element_factory_get_longname (factory)); + object_types[i++] = type; + } else { + g_message ("type info for factory %s not found", + gst_element_factory_get_longname (factory)); + } + l = g_list_next (l); + } + +EOT + +# get_type functions: +for (@types) { +print OUTPUT < uppercase with '_' + * GFileMonitor -> file_monitor + * GIOExtensionPoint -> extension_point + * GtkTreeView -> tree_view + * if 2nd char is upper case too + * search for first lower case and go back one char + * else + * search for next upper case + */ + if (!strncmp (object_name, "Gtk", 3)) + object_arg = object_name + 3; + else if (!strncmp (object_name, "Gnome", 5)) + object_arg = object_name + 5; + else + object_arg = object_name; + + object_arg_lower = g_ascii_strdown (object_arg, -1); + sprintf (pos, "*%s\\n", object_arg_lower); + pos += strlen (pos); + if (!strncmp (object_arg_lower, "widget", 6)) + widget_num = 2; + g_free(object_arg_lower); + + /* Convert signal name to use underscores rather than dashes '-'. */ + strncpy (signal_name, query_info.signal_name, 127); + signal_name[127] = '\\0'; + for (i = 0; signal_name[i]; i++) + { + if (signal_name[i] == '-') + signal_name[i] = '_'; + } + + /* Output the signal parameters. */ + for (param = 0; param < query_info.n_params; param++) + { + type_name = get_type_name (query_info.param_types[param] & ~G_SIGNAL_TYPE_STATIC_SCOPE, &is_pointer); + + /* Most arguments to the callback are called "arg1", "arg2", etc. + GtkWidgets are called "widget", "widget2", ... + GtkCallbacks are called "callback", "callback2", ... */ + if (!strcmp (type_name, "GtkWidget")) + { + arg_name = "widget"; + arg_num = &widget_num; + } + else if (!strcmp (type_name, "GtkCallback") + || !strcmp (type_name, "GtkCCallback")) + { + arg_name = "callback"; + arg_num = &callback_num; + } + else + { + arg_name = "arg"; + arg_num = ¶m_num; + } + sprintf (pos, "%s ", type_name); + pos += strlen (pos); + + if (!arg_num || *arg_num == 0) + sprintf (pos, "%s%s\\n", is_pointer ? "*" : " ", arg_name); + else + sprintf (pos, "%s%s%i\\n", is_pointer ? "*" : " ", arg_name, + *arg_num); + pos += strlen (pos); + + if (arg_num) + { + if (*arg_num == 0) + *arg_num = 2; + else + *arg_num += 1; + } + } + + pos = flags; + /* We use one-character flags for simplicity. */ + if (query_info.signal_flags & G_SIGNAL_RUN_FIRST) + *pos++ = 'f'; + if (query_info.signal_flags & G_SIGNAL_RUN_LAST) + *pos++ = 'l'; + if (query_info.signal_flags & G_SIGNAL_RUN_CLEANUP) + *pos++ = 'c'; + if (query_info.signal_flags & G_SIGNAL_NO_RECURSE) + *pos++ = 'r'; + if (query_info.signal_flags & G_SIGNAL_DETAILED) + *pos++ = 'd'; + if (query_info.signal_flags & G_SIGNAL_ACTION) + *pos++ = 'a'; + if (query_info.signal_flags & G_SIGNAL_NO_HOOKS) + *pos++ = 'h'; + *pos = 0; + + /* Output the return type and function name. */ + ret_type = get_type_name (query_info.return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE, &is_pointer); + + fprintf (fp, + "\\n%s::%s\\n%s%s\\n%s\\n%s\\n\\n", + object_name, query_info.signal_name, ret_type, is_pointer ? "*" : "", flags, buffer); +} + + +/* Returns the type name to use for a signal argument or return value, given + the GtkType from the signal info. It also sets is_pointer to TRUE if the + argument needs a '*' since it is a pointer. */ +static const gchar * +get_type_name (GType type, gboolean * is_pointer) +{ + const gchar *type_name; + + *is_pointer = FALSE; + type_name = g_type_name (type); + + switch (type) { + case G_TYPE_NONE: + case G_TYPE_CHAR: + case G_TYPE_UCHAR: + case G_TYPE_BOOLEAN: + case G_TYPE_INT: + case G_TYPE_UINT: + case G_TYPE_LONG: + case G_TYPE_ULONG: + case G_TYPE_FLOAT: + case G_TYPE_DOUBLE: + case G_TYPE_POINTER: + /* These all have normal C type names so they are OK. */ + return type_name; + + case G_TYPE_STRING: + /* A GtkString is really a gchar*. */ + *is_pointer = TRUE; + return "gchar"; + + case G_TYPE_ENUM: + case G_TYPE_FLAGS: + /* We use a gint for both of these. Hopefully a subtype with a decent + name will be registered and used instead, as GTK+ does itself. */ + return "gint"; + + case G_TYPE_BOXED: + /* The boxed type shouldn't be used itself, only subtypes. Though we + return 'gpointer' just in case. */ + return "gpointer"; + + case G_TYPE_PARAM: + /* A GParam is really a GParamSpec*. */ + *is_pointer = TRUE; + return "GParamSpec"; + +#if GLIB_CHECK_VERSION (2, 25, 9) + case G_TYPE_VARIANT: + *is_pointer = TRUE; + return "GVariant"; +#endif + +default: + break; + } + + /* For all GObject subclasses we can use the class name with a "*", + e.g. 'GtkWidget *'. */ + if (g_type_is_a (type, G_TYPE_OBJECT)) + *is_pointer = TRUE; + + /* Also catch non GObject root types */ + if (G_TYPE_IS_CLASSED (type)) + *is_pointer = TRUE; + + /* All boxed subtypes will be pointers as well. */ + /* Exception: GStrv */ + if (g_type_is_a (type, G_TYPE_BOXED) && + !g_type_is_a (type, G_TYPE_STRV)) + *is_pointer = TRUE; + + /* All pointer subtypes will be pointers as well. */ + if (g_type_is_a (type, G_TYPE_POINTER)) + *is_pointer = TRUE; + + /* But enums are not */ + if (g_type_is_a (type, G_TYPE_ENUM) || + g_type_is_a (type, G_TYPE_FLAGS)) + *is_pointer = FALSE; + + return type_name; +} + + +/* This outputs the hierarchy of all objects which have been initialized, + i.e. by calling their XXX_get_type() initialization function. */ +static void +output_object_hierarchy (void) +{ + FILE *fp; + gint i,j; + GType root, type; + GType root_types[$ntypes] = { G_TYPE_INVALID, }; + + fp = fopen (hierarchy_filename, "w"); + if (fp == NULL) + { + g_warning ("Couldn't open output file: %s : %s", hierarchy_filename, g_strerror(errno)); + return; + } + output_hierarchy (fp, G_TYPE_OBJECT, 0); + output_hierarchy (fp, G_TYPE_INTERFACE, 0); + + for (i=0; object_types[i]; i++) { + root = object_types[i]; + while ((type = g_type_parent (root))) { + root = type; + } + if ((root != G_TYPE_OBJECT) && (root != G_TYPE_INTERFACE)) { + for (j=0; root_types[j]; j++) { + if (root == root_types[j]) { + root = G_TYPE_INVALID; break; + } + } + if(root) { + root_types[j] = root; + output_hierarchy (fp, root, 0); + } + } + } + + fclose (fp); +} + +static int +compare_types (const void *a, const void *b) +{ + const char *na = g_type_name (*((GType *)a)); + const char *nb = g_type_name (*((GType *)b)); + + return g_strcmp0 (na, nb); +} + + +/* This is called recursively to output the hierarchy of a object. */ +static void +output_hierarchy (FILE *fp, + GType type, + guint level) +{ + guint i; + GType *children; + guint n_children; + + if (!type) + return; + + for (i = 0; i < level; i++) + fprintf (fp, " "); + fprintf (fp, "%s\\n", g_type_name (type)); + + children = g_type_children (type, &n_children); + qsort (children, n_children, sizeof (GType), compare_types); + + + for (i=0; i < n_children; i++) + output_hierarchy (fp, children[i], level + 1); + + g_free (children); +} + +static void output_object_interfaces (void) +{ + guint i; + FILE *fp; + + fp = fopen (interfaces_filename, "w"); + if (fp == NULL) + { + g_warning ("Couldn't open output file: %s : %s", interfaces_filename, g_strerror(errno)); + return; + } + output_interfaces (fp, G_TYPE_OBJECT); + + for (i = 0; object_types[i]; i++) + { + if (!g_type_parent (object_types[i]) && + (object_types[i] != G_TYPE_OBJECT) && + G_TYPE_IS_INSTANTIATABLE (object_types[i])) + { + output_interfaces (fp, object_types[i]); + } + } + fclose (fp); +} + +static void +output_interfaces (FILE *fp, + GType type) +{ + guint i; + GType *children, *interfaces; + guint n_children, n_interfaces; + + if (!type) + return; + + interfaces = g_type_interfaces (type, &n_interfaces); + + if (n_interfaces > 0) + { + fprintf (fp, "%s", g_type_name (type)); + for (i=0; i < n_interfaces; i++) + fprintf (fp, " %s", g_type_name (interfaces[i])); + fprintf (fp, "\\n"); + } + g_free (interfaces); + + children = g_type_children (type, &n_children); + + for (i=0; i < n_children; i++) + output_interfaces (fp, children[i]); + + g_free (children); +} + +static void output_interface_prerequisites (void) +{ + FILE *fp; + + fp = fopen (prerequisites_filename, "w"); + if (fp == NULL) + { + g_warning ("Couldn't open output file: %s : %s", prerequisites_filename, g_strerror(errno)); + return; + } + output_prerequisites (fp, G_TYPE_INTERFACE); + fclose (fp); +} + +static void +output_prerequisites (FILE *fp, + GType type) +{ +#if GLIB_CHECK_VERSION(2,1,0) + guint i; + GType *children, *prerequisites; + guint n_children, n_prerequisites; + + if (!type) + return; + + prerequisites = g_type_interface_prerequisites (type, &n_prerequisites); + + if (n_prerequisites > 0) + { + fprintf (fp, "%s", g_type_name (type)); + for (i=0; i < n_prerequisites; i++) + fprintf (fp, " %s", g_type_name (prerequisites[i])); + fprintf (fp, "\\n"); + } + g_free (prerequisites); + + children = g_type_children (type, &n_children); + + for (i=0; i < n_children; i++) + output_prerequisites (fp, children[i]); + + g_free (children); +#endif +} + +static void +output_args (void) +{ + FILE *fp; + gint i; + + fp = fopen (args_filename, "w"); + if (fp == NULL) + { + g_warning ("Couldn't open output file: %s : %s", args_filename, g_strerror(errno)); + return; + } + + for (i = 0; object_types[i]; i++) { + output_object_args (fp, object_types[i]); + } + + fclose (fp); +} + +static gint +compare_param_specs (const void *a, const void *b) +{ + GParamSpec *spec_a = *(GParamSpec **)a; + GParamSpec *spec_b = *(GParamSpec **)b; + + return strcmp (g_param_spec_get_name (spec_a), g_param_spec_get_name (spec_b)); +} + +/* Its common to have unsigned properties restricted + * to the signed range. Therefore we make this look + * a bit nicer by spelling out the max constants. + */ + +/* Don't use "==" with floats, it might trigger a gcc warning. */ +#define GTKDOC_COMPARE_FLOAT(x, y) (x <= y && x >= y) + +static gchar* +describe_double_constant (gdouble value) +{ + gchar *desc; + + if (GTKDOC_COMPARE_FLOAT (value, G_MAXDOUBLE)) + desc = g_strdup ("G_MAXDOUBLE"); + else if (GTKDOC_COMPARE_FLOAT (value, G_MINDOUBLE)) + desc = g_strdup ("G_MINDOUBLE"); + else if (GTKDOC_COMPARE_FLOAT (value, -G_MAXDOUBLE)) + desc = g_strdup ("-G_MAXDOUBLE"); + else if (GTKDOC_COMPARE_FLOAT (value, G_MAXFLOAT)) + desc = g_strdup ("G_MAXFLOAT"); + else if (GTKDOC_COMPARE_FLOAT (value, G_MINFLOAT)) + desc = g_strdup ("G_MINFLOAT"); + else if (GTKDOC_COMPARE_FLOAT (value, -G_MAXFLOAT)) + desc = g_strdup ("-G_MAXFLOAT"); + else{ + /* make sure floats are output with a decimal dot irrespective of + * current locale. Use formatd since we want human-readable numbers + * and do not need the exact same bit representation when deserialising */ + desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); + g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE, "%g", value); + } + + return desc; +} + +static gchar* +describe_signed_constant (gsize size, gint64 value) +{ + gchar *desc = NULL; + + switch (size) { + case 8: + if (value == G_MAXINT64) + desc = g_strdup ("G_MAXINT64"); + else if (value == G_MININT64) + desc = g_strdup ("G_MININT64"); + /* fall through */ + case 4: + if (sizeof (int) == 4) { + if (value == G_MAXINT) + desc = g_strdup ("G_MAXINT"); + else if (value == G_MININT) + desc = g_strdup ("G_MININT"); + else if (value == (gint64)G_MAXUINT) + desc = g_strdup ("G_MAXUINT"); + } + if (value == G_MAXLONG) + desc = g_strdup ("G_MAXLONG"); + else if (value == G_MINLONG) + desc = g_strdup ("G_MINLONG"); + else if (value == (gint64)G_MAXULONG) + desc = g_strdup ("G_MAXULONG"); + /* fall through */ + case 2: + if (sizeof (int) == 2) { + if (value == G_MAXINT) + desc = g_strdup ("G_MAXINT"); + else if (value == G_MININT) + desc = g_strdup ("G_MININT"); + else if (value == (gint64)G_MAXUINT) + desc = g_strdup ("G_MAXUINT"); + } + break; + default: + break; + } + if (!desc) + desc = g_strdup_printf ("%" G_GINT64_FORMAT, value); + + return desc; +} + +static gchar* +describe_unsigned_constant (gsize size, guint64 value) +{ + gchar *desc = NULL; + + switch (size) { + case 8: + if (value == G_MAXINT64) + desc = g_strdup ("G_MAXINT64"); + else if (value == G_MAXUINT64) + desc = g_strdup ("G_MAXUINT64"); + /* fall through */ + case 4: + if (sizeof (int) == 4) { + if (value == (guint64)G_MAXINT) + desc = g_strdup ("G_MAXINT"); + else if (value == G_MAXUINT) + desc = g_strdup ("G_MAXUINT"); + } + if (value == (guint64)G_MAXLONG) + desc = g_strdup ("G_MAXLONG"); + else if (value == G_MAXULONG) + desc = g_strdup ("G_MAXULONG"); + /* fall through */ + case 2: + if (sizeof (int) == 2) { + if (value == (guint64)G_MAXINT) + desc = g_strdup ("G_MAXINT"); + else if (value == G_MAXUINT) + desc = g_strdup ("G_MAXUINT"); + } + break; + default: + break; + } + if (!desc) + desc = g_strdup_printf ("%" G_GUINT64_FORMAT, value); + + return desc; +} + +static gchar* +describe_type (GParamSpec *spec) +{ + gchar *desc; + gchar *lower; + gchar *upper; + + if (G_IS_PARAM_SPEC_CHAR (spec)) + { + GParamSpecChar *pspec = G_PARAM_SPEC_CHAR (spec); + + lower = describe_signed_constant (sizeof(gchar), pspec->minimum); + upper = describe_signed_constant (sizeof(gchar), pspec->maximum); + if (pspec->minimum == G_MININT8 && pspec->maximum == G_MAXINT8) + desc = g_strdup (""); + else if (pspec->minimum == G_MININT8) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXINT8) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_UCHAR (spec)) + { + GParamSpecUChar *pspec = G_PARAM_SPEC_UCHAR (spec); + + lower = describe_unsigned_constant (sizeof(guchar), pspec->minimum); + upper = describe_unsigned_constant (sizeof(guchar), pspec->maximum); + if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT8) + desc = g_strdup (""); + else if (pspec->minimum == 0) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXUINT8) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_INT (spec)) + { + GParamSpecInt *pspec = G_PARAM_SPEC_INT (spec); + + lower = describe_signed_constant (sizeof(gint), pspec->minimum); + upper = describe_signed_constant (sizeof(gint), pspec->maximum); + if (pspec->minimum == G_MININT && pspec->maximum == G_MAXINT) + desc = g_strdup (""); + else if (pspec->minimum == G_MININT) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXINT) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_UINT (spec)) + { + GParamSpecUInt *pspec = G_PARAM_SPEC_UINT (spec); + + lower = describe_unsigned_constant (sizeof(guint), pspec->minimum); + upper = describe_unsigned_constant (sizeof(guint), pspec->maximum); + if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT) + desc = g_strdup (""); + else if (pspec->minimum == 0) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXUINT) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_LONG (spec)) + { + GParamSpecLong *pspec = G_PARAM_SPEC_LONG (spec); + + lower = describe_signed_constant (sizeof(glong), pspec->minimum); + upper = describe_signed_constant (sizeof(glong), pspec->maximum); + if (pspec->minimum == G_MINLONG && pspec->maximum == G_MAXLONG) + desc = g_strdup (""); + else if (pspec->minimum == G_MINLONG) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXLONG) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_ULONG (spec)) + { + GParamSpecULong *pspec = G_PARAM_SPEC_ULONG (spec); + + lower = describe_unsigned_constant (sizeof(gulong), pspec->minimum); + upper = describe_unsigned_constant (sizeof(gulong), pspec->maximum); + if (pspec->minimum == 0 && pspec->maximum == G_MAXULONG) + desc = g_strdup (""); + else if (pspec->minimum == 0) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXULONG) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_INT64 (spec)) + { + GParamSpecInt64 *pspec = G_PARAM_SPEC_INT64 (spec); + + lower = describe_signed_constant (sizeof(gint64), pspec->minimum); + upper = describe_signed_constant (sizeof(gint64), pspec->maximum); + if (pspec->minimum == G_MININT64 && pspec->maximum == G_MAXINT64) + desc = g_strdup (""); + else if (pspec->minimum == G_MININT64) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXINT64) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_UINT64 (spec)) + { + GParamSpecUInt64 *pspec = G_PARAM_SPEC_UINT64 (spec); + + lower = describe_unsigned_constant (sizeof(guint64), pspec->minimum); + upper = describe_unsigned_constant (sizeof(guint64), pspec->maximum); + if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT64) + desc = g_strdup (""); + else if (pspec->minimum == 0) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXUINT64) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_FLOAT (spec)) + { + GParamSpecFloat *pspec = G_PARAM_SPEC_FLOAT (spec); + + lower = describe_double_constant (pspec->minimum); + upper = describe_double_constant (pspec->maximum); + if (GTKDOC_COMPARE_FLOAT (pspec->minimum, -G_MAXFLOAT)) + { + if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXFLOAT)) + desc = g_strdup (""); + else + desc = g_strdup_printf ("<= %s", upper); + } + else if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXFLOAT)) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_DOUBLE (spec)) + { + GParamSpecDouble *pspec = G_PARAM_SPEC_DOUBLE (spec); + + lower = describe_double_constant (pspec->minimum); + upper = describe_double_constant (pspec->maximum); + if (GTKDOC_COMPARE_FLOAT (pspec->minimum, -G_MAXDOUBLE)) + { + if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXDOUBLE)) + desc = g_strdup (""); + else + desc = g_strdup_printf ("<= %s", upper); + } + else if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXDOUBLE)) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } +#if GLIB_CHECK_VERSION (2, 12, 0) + else if (G_IS_PARAM_SPEC_GTYPE (spec)) + { + GParamSpecGType *pspec = G_PARAM_SPEC_GTYPE (spec); + gboolean is_pointer; + + desc = g_strdup (get_type_name (pspec->is_a_type, &is_pointer)); + } +#endif +#if GLIB_CHECK_VERSION (2, 25, 9) + else if (G_IS_PARAM_SPEC_VARIANT (spec)) + { + GParamSpecVariant *pspec = G_PARAM_SPEC_VARIANT (spec); + gchar *variant_type; + + variant_type = g_variant_type_dup_string (pspec->type); + desc = g_strdup_printf ("GVariant<%s>", variant_type); + g_free (variant_type); + } +#endif + else + { + desc = g_strdup (""); + } + + return desc; +} + +static gchar* +describe_default (GParamSpec *spec) +{ + gchar *desc; + + if (G_IS_PARAM_SPEC_CHAR (spec)) + { + GParamSpecChar *pspec = G_PARAM_SPEC_CHAR (spec); + + desc = g_strdup_printf ("%d", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_UCHAR (spec)) + { + GParamSpecUChar *pspec = G_PARAM_SPEC_UCHAR (spec); + + desc = g_strdup_printf ("%u", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_BOOLEAN (spec)) + { + GParamSpecBoolean *pspec = G_PARAM_SPEC_BOOLEAN (spec); + + desc = g_strdup_printf ("%s", pspec->default_value ? "TRUE" : "FALSE"); + } + else if (G_IS_PARAM_SPEC_INT (spec)) + { + GParamSpecInt *pspec = G_PARAM_SPEC_INT (spec); + + desc = g_strdup_printf ("%d", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_UINT (spec)) + { + GParamSpecUInt *pspec = G_PARAM_SPEC_UINT (spec); + + desc = g_strdup_printf ("%u", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_LONG (spec)) + { + GParamSpecLong *pspec = G_PARAM_SPEC_LONG (spec); + + desc = g_strdup_printf ("%ld", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_LONG (spec)) + { + GParamSpecULong *pspec = G_PARAM_SPEC_ULONG (spec); + + desc = g_strdup_printf ("%lu", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_INT64 (spec)) + { + GParamSpecInt64 *pspec = G_PARAM_SPEC_INT64 (spec); + + desc = g_strdup_printf ("%" G_GINT64_FORMAT, pspec->default_value); + } + else if (G_IS_PARAM_SPEC_UINT64 (spec)) + { + GParamSpecUInt64 *pspec = G_PARAM_SPEC_UINT64 (spec); + + desc = g_strdup_printf ("%" G_GUINT64_FORMAT, pspec->default_value); + } + else if (G_IS_PARAM_SPEC_UNICHAR (spec)) + { + GParamSpecUnichar *pspec = G_PARAM_SPEC_UNICHAR (spec); + + if (g_unichar_isprint (pspec->default_value)) + desc = g_strdup_printf ("'%c'", pspec->default_value); + else + desc = g_strdup_printf ("%u", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_ENUM (spec)) + { + GParamSpecEnum *pspec = G_PARAM_SPEC_ENUM (spec); + + GEnumValue *value = g_enum_get_value (pspec->enum_class, pspec->default_value); + if (value) + desc = g_strdup_printf ("%s", value->value_name); + else + desc = g_strdup_printf ("%d", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_FLAGS (spec)) + { + GParamSpecFlags *pspec = G_PARAM_SPEC_FLAGS (spec); + guint default_value; + GString *acc; + + default_value = pspec->default_value; + acc = g_string_new (""); + + while (default_value) + { + GFlagsValue *value = g_flags_get_first_value (pspec->flags_class, default_value); + + if (!value) + break; + + if (acc->len > 0) + g_string_append (acc, "|"); + g_string_append (acc, value->value_name); + + default_value &= ~value->value; + } + + if (default_value == 0) + desc = g_string_free (acc, FALSE); + else + { + desc = g_strdup_printf ("%d", pspec->default_value); + g_string_free (acc, TRUE); + } + } + else if (G_IS_PARAM_SPEC_FLOAT (spec)) + { + GParamSpecFloat *pspec = G_PARAM_SPEC_FLOAT (spec); + + /* make sure floats are output with a decimal dot irrespective of + * current locale. Use formatd since we want human-readable numbers + * and do not need the exact same bit representation when deserialising */ + desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); + g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE, "%g", + pspec->default_value); + } + else if (G_IS_PARAM_SPEC_DOUBLE (spec)) + { + GParamSpecDouble *pspec = G_PARAM_SPEC_DOUBLE (spec); + + /* make sure floats are output with a decimal dot irrespective of + * current locale. Use formatd since we want human-readable numbers + * and do not need the exact same bit representation when deserialising */ + desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); + g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE, "%g", + pspec->default_value); + } + else if (G_IS_PARAM_SPEC_STRING (spec)) + { + GParamSpecString *pspec = G_PARAM_SPEC_STRING (spec); + + if (pspec->default_value) + { + gchar *esc = g_strescape (pspec->default_value, NULL); + + desc = g_strdup_printf ("\\"%s\\"", esc); + + g_free (esc); + } + else + desc = g_strdup_printf ("NULL"); + } + else + { + desc = g_strdup (""); + } + + return desc; +} + + +static void +output_object_args (FILE *fp, GType object_type) +{ + gpointer class; + const gchar *object_class_name; + guint arg; + gchar flags[16], *pos; + GParamSpec **properties; + guint n_properties; + gboolean child_prop; + gboolean style_prop; + gboolean is_pointer; + const gchar *type_name; + gchar *type_desc; + gchar *default_value; + + if (G_TYPE_IS_OBJECT (object_type)) + { + class = g_type_class_peek (object_type); + if (!class) + return; + + properties = g_object_class_list_properties (class, &n_properties); + } +#if GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 3) + else if (G_TYPE_IS_INTERFACE (object_type)) + { + class = g_type_default_interface_ref (object_type); + + if (!class) + return; + + properties = g_object_interface_list_properties (class, &n_properties); + } +#endif + else + return; + + object_class_name = g_type_name (object_type); + + child_prop = FALSE; + style_prop = FALSE; + + while (TRUE) { + qsort (properties, n_properties, sizeof (GParamSpec *), compare_param_specs); + for (arg = 0; arg < n_properties; arg++) + { + GParamSpec *spec = properties[arg]; + const gchar *nick, *blurb, *dot; + + if (spec->owner_type != object_type) + continue; + + pos = flags; + /* We use one-character flags for simplicity. */ + if (child_prop && !style_prop) + *pos++ = 'c'; + if (style_prop) + *pos++ = 's'; + if (spec->flags & G_PARAM_READABLE) + *pos++ = 'r'; + if (spec->flags & G_PARAM_WRITABLE) + *pos++ = 'w'; + if (spec->flags & G_PARAM_CONSTRUCT) + *pos++ = 'x'; + if (spec->flags & G_PARAM_CONSTRUCT_ONLY) + *pos++ = 'X'; + *pos = 0; + + nick = g_param_spec_get_nick (spec); + blurb = g_param_spec_get_blurb (spec); + + dot = ""; + if (blurb) { + int str_len = strlen (blurb); + if (str_len > 0 && blurb[str_len - 1] != '.') + dot = "."; + } + + type_desc = describe_type (spec); + default_value = describe_default (spec); + type_name = get_type_name (spec->value_type, &is_pointer); + fprintf (fp, "\\n%s::%s\\n%s%s\\n%s\\n%s\\n%s\\n%s%s\\n%s\\n\\n\\n", + object_class_name, g_param_spec_get_name (spec), type_name, is_pointer ? "*" : "", type_desc, flags, nick ? nick : "(null)", blurb ? blurb : "(null)", dot, default_value); + g_free (type_desc); + g_free (default_value); + } + + g_free (properties); + +#ifdef GTK_IS_CONTAINER_CLASS + if (!child_prop && GTK_IS_CONTAINER_CLASS (class)) { + properties = gtk_container_class_list_child_properties (class, &n_properties); + child_prop = TRUE; + continue; + } +#endif + +#ifdef GTK_IS_CELL_AREA_CLASS + if (!child_prop && GTK_IS_CELL_AREA_CLASS (class)) { + properties = gtk_cell_area_class_list_cell_properties (class, &n_properties); + child_prop = TRUE; + continue; + } +#endif + +#ifdef GTK_IS_WIDGET_CLASS +#if GTK_CHECK_VERSION(2,1,0) + if (!style_prop && GTK_IS_WIDGET_CLASS (class)) { + properties = gtk_widget_class_list_style_properties (GTK_WIDGET_CLASS (class), &n_properties); + style_prop = TRUE; + continue; + } +#endif +#endif + + break; + } +} +EOT + +close OUTPUT; + +# Compile and run our file + +$CC = $ENV{CC} ? $ENV{CC} : "gcc"; +$LD = $ENV{LD} ? $ENV{LD} : $CC; +$CFLAGS = $ENV{CFLAGS} ? "$ENV{CFLAGS}" : ""; +$LDFLAGS = $ENV{LDFLAGS} ? $ENV{LDFLAGS} : ""; + +my $o_file; +if ($CC =~ /libtool/) { + $o_file = "$MODULE-scan.lo" +} else { + $o_file = "$MODULE-scan.o" +} + +my $stdout=""; +if (!defined($VERBOSE) or $VERBOSE eq "0") { + $stdout=">/dev/null"; +} + +# Compiling scanner +$command = "$CC $stdout $CFLAGS -c -o $o_file $MODULE-scan.c"; +system("($command)") == 0 or die "Compilation of scanner failed: $!\n"; + +# Linking scanner +$command = "$LD $stdout -o $MODULE-scan $o_file $LDFLAGS"; +system($command) == 0 or die "Linking of scanner failed: $!\n"; + +# Running scanner $MODULE-scan "; +system("sh -c ./$MODULE-scan") == 0 or die "Scan failed: $!\n"; + +if (!defined($ENV{"GTK_DOC_KEEP_INTERMEDIATE"})) { + unlink "./$MODULE-scan.c", "./$MODULE-scan.o", "./$MODULE-scan.lo", "./$MODULE-scan"; +} + +&UpdateFileIfChanged ($old_hierarchy_filename, $new_hierarchy_filename, 0); +# we will merge these in scangobj-merge.py +#&UpdateFileIfChanged ($old_interfaces_filename, $new_interfaces_filename, 0); +#&UpdateFileIfChanged ($old_prerequisites_filename, $new_prerequisites_filename, 0); +#&UpdateFileIfChanged ($old_signals_filename, $new_signals_filename, 0); +#&UpdateFileIfChanged ($old_args_filename, $new_args_filename, 0); + diff --git a/common/gtk-doc-plugins.mak b/common/gtk-doc-plugins.mak new file mode 100644 index 0000000..8cc42e7 --- /dev/null +++ b/common/gtk-doc-plugins.mak @@ -0,0 +1,387 @@ +# This is an include file specifically tuned for building documentation +# for GStreamer plug-ins + +help: + @echo + @echo "If you are a doc maintainer, run 'make update' to update" + @echo "the documentation files maintained in git" + @echo + @echo Other useful make targets: + @echo + @echo check-inspected-versions: make sure the inspected plugin info + @echo is up to date before a release + @echo + +# update the stuff maintained by doc maintainers +update: + $(MAKE) scanobj-update + $(MAKE) check-outdated-docs + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +# thomas: make docs parallel installable +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@ + +MAINTAINER_DOC_STAMPS = \ + scanobj-build.stamp + +EXTRA_DIST = \ + $(MAINTAINER_DOC_STAMPS) \ + $(srcdir)/inspect/*.xml \ + $(SCANOBJ_FILES) \ + $(content_files) \ + $(extra_files) \ + $(HTML_IMAGES) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_OVERRIDES) \ + $(DOC_MODULE)-sections.txt + +# we don't add scanobj-build.stamp here since they are built manually by docs +# maintainers and result is commited to git +DOC_STAMPS = \ + scan-build.stamp \ + tmpl-build.stamp \ + sgml-build.stamp \ + html-build.stamp \ + scan.stamp \ + tmpl.stamp \ + sgml.stamp \ + html.stamp + +# files generated/updated by gtkdoc-scangobj +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals \ + $(DOC_MODULE).types + +SCANOBJ_FILES_O = \ + .libs/$(DOC_MODULE)-scan.o + +# files generated/updated by gtkdoc-scan +SCAN_FILES = \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt \ + $(DOC_MODULE)-decl.txt \ + $(DOC_MODULE)-decl-list.txt + + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = \ + $(SCANOBJ_FILES_O) \ + $(REPORT_FILES) \ + $(DOC_STAMPS) \ + inspect-registry.xml + +INSPECT_DIR = inspect + +if ENABLE_GTK_DOC +all-local: html-build.stamp + +### inspect GStreamer plug-ins; done by documentation maintainer ### + +# only look at the plugins in this module when building inspect .xml stuff +INSPECT_REGISTRY=$(top_builddir)/docs/plugins/inspect-registry.xml +INSPECT_ENVIRONMENT=\ + LC_ALL=C \ + GST_PLUGIN_SYSTEM_PATH= \ + GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src:$(top_builddir)/gnl \ + GST_REGISTRY=$(INSPECT_REGISTRY) \ + PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + $(INSPECT_EXTRA_ENVIRONMENT) + +#### scan gobjects; done by documentation maintainer #### +scanobj-update: + -rm scanobj-build.stamp + $(MAKE) scanobj-build.stamp + +# gstdoc-scanobj produces 5 output files (.new) +# scangobj-merge.py merges them into the file which we commit later +# TODO: also merge the hierarchy +scanobj-build.stamp: $(SCANOBJ_DEPS) $(basefiles) + @echo " DOC Introspecting gobjects" + @if test x"$(srcdir)" != x. ; then \ + for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ + do \ + if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ + done; \ + fi; \ + mkdir -p $(INSPECT_DIR); \ + scanobj_options=""; \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + $(INSPECT_ENVIRONMENT) \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \ + CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS) $(WARNING_CFLAGS)" \ + LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + $(GST_DOC_SCANOBJ) $$scanobj_options --type-init-func="gst_init(NULL,NULL)" \ + --module=$(DOC_MODULE) --source=$(PACKAGE) --inspect-dir=$(INSPECT_DIR) && \ + echo " DOC Merging introspection data" && \ + $(PYTHON) \ + $(top_srcdir)/common/scangobj-merge.py $(DOC_MODULE); \ + if test x"$(srcdir)" != x. ; then \ + for f in $(SCANOBJ_FILES); \ + do \ + cmp -s ./$$f $(srcdir)/$$f || cp ./$$f $(srcdir)/ ; \ + done; \ + fi; \ + touch scanobj-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(SCANOBJ_FILES_O): scan-build.stamp + @true + +### scan headers; done on every build ### +scan-build.stamp: $(HFILE_GLOB) $(EXTRA_HFILES) $(basefiles) scanobj-build.stamp + @echo ' DOC Scanning header files' + @if test x"$(srcdir)" != x. ; then \ + for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ + do \ + if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ + done; \ + fi + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan \ + $(SCAN_OPTIONS) $(EXTRA_HFILES) \ + --module=$(DOC_MODULE) \ + $${_source_dir} \ + --ignore-headers="$(IGNORE_HFILES)"; \ + touch scan-build.stamp + +#### update templates; done on every build #### + +# in a non-srcdir build, we need to copy files from the previous step +# and the files from previous runs of this step +tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES) + @echo ' DOC Rebuilding template files' + @if test x"$(srcdir)" != x. ; then \ + for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ + do \ + if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ + done; \ + fi + @gtkdoc-mktmpl --module=$(DOC_MODULE) + @$(PYTHON) \ + $(top_srcdir)/common/mangle-tmpl.py $(srcdir)/$(INSPECT_DIR) tmpl + @touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +#### xml #### + +sgml-build.stamp: tmpl.stamp scan-build.stamp $(CFILE_GLOB) $(top_srcdir)/common/plugins.xsl $(expand_content_files) + @echo ' DOC Building XML' + @-mkdir -p xml + @for a in $(srcdir)/$(INSPECT_DIR)/*.xml; do \ + xsltproc --stringparam module $(MODULE) \ + $(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done + @for f in $(EXAMPLE_CFILES); do \ + $(PYTHON) $(top_srcdir)/common/c-to-xml.py $$f > xml/element-`basename $$f .c`.xml; done + @gtkdoc-mkdb \ + --module=$(DOC_MODULE) \ + --source-dir=$(DOC_SOURCE_DIR) \ + --expand-content-files="$(expand_content_files)" \ + --main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) \ + --output-format=xml \ + --ignore-files="$(IGNORE_HFILES) $(IGNORE_CFILES)" \ + $(MKDB_OPTIONS) + @cp ../version.entities xml + @touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building HTML' + @rm -rf html + @mkdir html + @cp $(srcdir)/$(DOC_MAIN_SGML_FILE) html + @for f in $(content_files); do cp $(srcdir)/$$f html; done + @cp -pr xml html + @cp ../version.entities html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) + @mv html/index.sgml html/index.sgml.bak + @$(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_MAJORMINOR@\//g" html/index.sgml.bak >html/index.sgml + @rm -f html/index.sgml.bak + @rm -f html/$(DOC_MAIN_SGML_FILE) + @rm -rf html/xml + @rm -f html/version.entities + @test "x$(HTML_IMAGES)" = "x" || for i in "" $(HTML_IMAGES) ; do \ + if test "$$i" != ""; then cp $(srcdir)/$$i html ; fi; done + @echo ' DOC Fixing cross-references' + @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + @touch html-build.stamp + +clean-local-gtkdoc: + @rm -rf xml tmpl html +# clean files copied for nonsrcdir templates build + @if test x"$(srcdir)" != x. ; then \ + rm -rf $(SCANOBJ_FILES) $(SCAN_FILES) $(REPORT_FILES) \ + $(MAINTAINER_DOC_STAMPS); \ + fi +else +all-local: +clean-local-gtkdoc: +endif + +clean-local: clean-local-gtkdoc + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -f $(REPORT_FILES) \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @rm -rf tmpl/*.sgml.bak + @rm -f $(DOC_MODULE).hierarchy + @rm -f *.stamp || true + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(DOC_MODULE)-docs.sgml ; \ + rm -f $(DOC_MODULE).types ; \ + rm -f $(DOC_MODULE).interfaces ; \ + rm -f $(DOC_MODULE)-overrides.txt ; \ + rm -f $(DOC_MODULE).prerequisites ; \ + rm -f $(DOC_MODULE)-sections.txt ; \ + rm -rf tmpl/*.sgml ; \ + rm -rf $(INSPECT_DIR); \ + fi + @rm -rf *.o + +MAINTAINERCLEANFILES = $(MAINTAINER_DOC_STAMPS) + +# thomas: make docs parallel installable; devhelp requires majorminor too +install-data-local: + (installfiles=`echo $(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css`; \ + if test "$$installfiles" = '$(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css'; \ + then echo '-- Nothing to install' ; \ + else \ + $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ + for i in $$installfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + pngfiles=`echo ./html/*.png`; \ + if test "$$pngfiles" != './html/*.png'; then \ + for i in $$pngfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + fi; \ + echo '-- Installing $(builddir)/html/$(DOC_MODULE).devhelp2' ; \ + if test -e $(builddir)/html/$(DOC_MODULE).devhelp2; then \ + $(INSTALL_DATA) $(builddir)/html/$(DOC_MODULE).devhelp2 \ + $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ + fi; \ + (which gtkdoc-rebase >/dev/null && \ + gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR)) || true ; \ + fi) +uninstall-local: + if test -d $(DESTDIR)$(TARGET_DIR); then \ + rm -rf $(DESTDIR)$(TARGET_DIR)/*; \ + rmdir -p $(DESTDIR)$(TARGET_DIR) 2>/dev/null || true; \ + else \ + echo '-- Nothing to uninstall' ; \ + fi; + +# +# Checks +# +if ENABLE_GTK_DOC +check-hierarchy: $(DOC_MODULE).hierarchy + @if grep ' ' $(DOC_MODULE).hierarchy; then \ + echo "$(DOC_MODULE).hierarchy contains tabs, please fix"; \ + /bin/false; \ + fi + +check: check-hierarchy +endif + +# wildcard is apparently not portable to other makes, hence the use of find +inspect_files = $(shell find $(srcdir)/$(INSPECT_DIR) -name '*.xml') + +check-inspected-versions: + @echo Checking plugin versions of inspected plugin data ...; \ + fail=0 ; \ + for each in $(inspect_files) ; do \ + if (grep -H '' $$each | grep -v '$(VERSION)'); then \ + echo $$each should be fixed to say version $(VERSION) or be removed ; \ + echo "sed -i -e 's//$(VERSION)<\/version>/'" $$each; \ + echo ; \ + fail=1; \ + fi ; \ + done ; \ + exit $$fail + +check-outdated-docs: + $(AM_V_GEN)echo Checking for outdated plugin inspect data ...; \ + fail=0 ; \ + if [ -d $(top_srcdir)/.git/ ]; then \ + files=`find $(srcdir)/inspect/ -name '*xml'`; \ + for f in $$files; do \ + ver=`grep '$(PACKAGE_VERSION)' $$f`; \ + if test "x$$ver" = "x"; then \ + plugin=`echo $$f | sed -e 's/^.*plugin-//' -e 's/.xml//'`; \ + # echo "Checking $$plugin $$f"; \ + pushd "$(top_srcdir)" >/dev/null; \ + pinit=`git grep -A3 GST_PLUGIN_DEFINE -- ext/ gst/ sys/ | grep "\"$$plugin\""`; \ + popd >/dev/null; \ + # echo "[$$pinit]"; \ + if test "x$$pinit" = "x"; then \ + printf " **** outdated docs for plugin %-15s: %s\n" $$plugin $$f; \ + fail=1; \ + fi; \ + fi; \ + done; \ + fi ; \ + exit $$fail + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed and enabled in order to make dist" + @false +endif + +# FIXME: decide whether we want to dist generated html or not +# also this only works, if the project has been build before +# we could dist html only if its there, but that might lead to missing html in +# tarballs +dist-hook: dist-check-gtkdoc dist-hook-local + mkdir $(distdir)/html + cp html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ + cd $(distdir) && rm -f $(DISTCLEANFILES) + -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs check-outdated-docs inspect + +# avoid spurious build errors when distchecking with -jN +.NOTPARALLEL: diff --git a/common/gtk-doc.mak b/common/gtk-doc.mak new file mode 100644 index 0000000..dd2b5a5 --- /dev/null +++ b/common/gtk-doc.mak @@ -0,0 +1,231 @@ +########################################################################### +# Everything below here is generic and you shouldn't need to change it. +########################################################################### +# thomas: except of course that we did + +# thomas: copied from glib-2 +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +# thomas: make docs parallel installable +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@ + +EXTRA_DIST = \ + $(content_files) \ + $(extra_files) \ + $(HTML_IMAGES) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE).types \ + $(DOC_OVERRIDES) \ + $(DOC_MODULE)-sections.txt + +DOC_STAMPS = \ + setup-build.stamp \ + scan-build.stamp \ + sgml-build.stamp \ + html-build.stamp \ + sgml.stamp \ + html.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals \ + .libs/$(DOC_MODULE)-scan.o + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) doc-registry.xml + +if ENABLE_GTK_DOC +all-local: html-build.stamp + +#### setup #### + +setup-build.stamp: $(content_files) + -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + echo ' DOC Preparing build'; \ + files=`echo $(DOC_MAIN_SGML_FILE) $(DOC_OVERRIDES) $(DOC_MODULE)-sections.txt $(DOC_MODULE).types $(content_files)`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + test -f $(abs_srcdir)/$$file && \ + cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ + done; \ + fi; \ + fi + @touch setup-build.stamp + +#### scan #### + +# in the case of non-srcdir builds, the built gst directory gets added +# to gtk-doc scanning; but only then, to avoid duplicates +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo ' DOC Scanning header files' + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan \ + $(SCAN_OPTIONS) $(EXTRA_HFILES) \ + --module=$(DOC_MODULE) \ + $${_source_dir} \ + --ignore-headers="$(IGNORE_HFILES)" + @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null; then \ + echo " DOC Introspecting gobjects"; \ + GST_PLUGIN_SYSTEM_PATH=`cd $(top_builddir) && pwd` \ + GST_PLUGIN_PATH= \ + GST_REGISTRY=doc-registry.xml \ + $(GTKDOC_EXTRA_ENVIRONMENT) \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \ + CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" \ + LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj --type-init-func="gst_init(NULL,NULL)" \ + --module=$(DOC_MODULE) ; \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + @touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### xml #### + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(expand_content_files) + @echo ' DOC Building XML' + @gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS) + @cp ../version.entities xml + @touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building HTML' + @rm -rf html + @mkdir html + @cp -pr xml html + @cp ../version.entities ./ + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + @gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options=--path="$(abs_srcdir)"; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + @mv html/index.sgml html/index.sgml.bak + @$(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_MAJORMINOR@\//g" html/index.sgml.bak >html/index.sgml + @rm -f html/index.sgml.bak + @rm -rf html/xml + @rm -f version.entities + @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) $(abs_builddir)/html ) + @echo ' DOC Fixing cross-references' + @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + @touch html-build.stamp + +clean-local-gtkdoc: + @rm -rf xml tmpl html +# clean files copied for nonsrcdir templates build + @if test x"$(srcdir)" != x. ; then \ + rm -rf $(DOC_MODULE).types; \ + fi +else +all-local: +clean-local-gtkdoc: +endif + +clean-local: clean-local-gtkdoc + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -f $(REPORT_FILES) \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @rm -rf tmpl/*.sgml.bak + @rm -f $(DOC_MODULE).hierarchy + @rm -f *.stamp || true + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(DOC_MAIN_SGML_FILE) ; \ + rm -f $(DOC_OVERRIDES) ; \ + rm -f $(DOC_MODULE).types ; \ + rm -f $(DOC_MODULE).interfaces ; \ + rm -f $(DOC_MODULE).prerequisites ; \ + rm -f $(DOC_MODULE)-sections.txt ; \ + rm -f $(content_files) ; \ + rm -rf tmpl/*.sgml ; \ + fi + @rm -rf *.o + +maintainer-clean-local: clean + @cd $(srcdir) && rm -rf html \ + xml $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +# thomas: make docs parallel installable; devhelp requires majorminor too +install-data-local: + (installfiles=`echo $(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css`; \ + if test "$$installfiles" = '$(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css'; \ + then echo '-- Nothing to install' ; \ + else \ + $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ + for i in $$installfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + echo '-- Installing $(builddir)/html/$(DOC_MODULE).devhelp2' ; \ + if test -e $(builddir)/html/$(DOC_MODULE).devhelp2; then \ + $(INSTALL_DATA) $(builddir)/html/$(DOC_MODULE).devhelp2 \ + $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ + fi; \ + (which gtkdoc-rebase >/dev/null && \ + gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR)) || true ; \ + fi) +uninstall-local: + if test -d $(DESTDIR)$(TARGET_DIR); then \ + rm -rf $(DESTDIR)$(TARGET_DIR)/*; \ + rmdir -p $(DESTDIR)$(TARGET_DIR) 2>/dev/null || true; \ + else \ + echo '-- Nothing to uninstall' ; \ + fi; + + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed and enabled in order to make dist" + @false +endif + +dist-hook: dist-check-gtkdoc dist-hook-local + mkdir $(distdir)/html + cp html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ + cd $(distdir) && rm -f $(DISTCLEANFILES) + -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +# avoid spurious build errors when distchecking with -jN +.NOTPARALLEL: diff --git a/common/m4/Makefile.am b/common/m4/Makefile.am new file mode 100644 index 0000000..2ddb8a7 --- /dev/null +++ b/common/m4/Makefile.am @@ -0,0 +1,42 @@ +EXTRA_DIST = \ + README \ + as-ac-expand.m4 \ + as-auto-alt.m4 \ + as-compiler-flag.m4 \ + as-compiler.m4 \ + as-docbook.m4 \ + as-gcc-inline-assembly.m4 \ + as-libtool.m4 \ + as-libtool-tags.m4 \ + as-objc.m4 \ + as-python.m4 \ + as-scrub-include.m4 \ + as-version.m4 \ + ax_create_stdint_h.m4 \ + glib-gettext.m4 \ + gst-arch.m4 \ + gst-args.m4 \ + gst-check.m4 \ + gst-debuginfo.m4 \ + gst-default.m4 \ + gst-doc.m4 \ + gst-dowhile.m4 \ + gst-error.m4 \ + gst-feature.m4 \ + gst-function.m4 \ + gst-gettext.m4 \ + gst-glib2.m4 \ + gst-libxml2.m4 \ + gst-parser.m4 \ + gst-package-release-datetime.m4 \ + gst-platform.m4 \ + gst-plugindir.m4 \ + gst-plugin-docs.m4 \ + gst-valgrind.m4 \ + gst-x11.m4 \ + gst.m4 \ + gtk-doc.m4 \ + introspection.m4 \ + pkg.m4 \ + check.m4 \ + orc.m4 diff --git a/common/m4/Makefile.in b/common/m4/Makefile.in new file mode 100644 index 0000000..9e754c2 --- /dev/null +++ b/common/m4/Makefile.in @@ -0,0 +1,647 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = common/m4 +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + README \ + as-ac-expand.m4 \ + as-auto-alt.m4 \ + as-compiler-flag.m4 \ + as-compiler.m4 \ + as-docbook.m4 \ + as-gcc-inline-assembly.m4 \ + as-libtool.m4 \ + as-libtool-tags.m4 \ + as-objc.m4 \ + as-python.m4 \ + as-scrub-include.m4 \ + as-version.m4 \ + ax_create_stdint_h.m4 \ + glib-gettext.m4 \ + gst-arch.m4 \ + gst-args.m4 \ + gst-check.m4 \ + gst-debuginfo.m4 \ + gst-default.m4 \ + gst-doc.m4 \ + gst-dowhile.m4 \ + gst-error.m4 \ + gst-feature.m4 \ + gst-function.m4 \ + gst-gettext.m4 \ + gst-glib2.m4 \ + gst-libxml2.m4 \ + gst-parser.m4 \ + gst-package-release-datetime.m4 \ + gst-platform.m4 \ + gst-plugindir.m4 \ + gst-plugin-docs.m4 \ + gst-valgrind.m4 \ + gst-x11.m4 \ + gst.m4 \ + gtk-doc.m4 \ + introspection.m4 \ + pkg.m4 \ + check.m4 \ + orc.m4 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu common/m4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu common/m4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/common/m4/README b/common/m4/README new file mode 100644 index 0000000..867a344 --- /dev/null +++ b/common/m4/README @@ -0,0 +1,3 @@ +All aclocal .m4 files we need are put here and cat'd to acinclude.m4 in +the source root. Official ones (taken from the relevant devel packages) +are named as-is, unofficial ones (or changed ones) get a gst-prefix. diff --git a/common/m4/as-ac-expand.m4 b/common/m4/as-ac-expand.m4 new file mode 100644 index 0000000..d6c9e33 --- /dev/null +++ b/common/m4/as-ac-expand.m4 @@ -0,0 +1,43 @@ +dnl as-ac-expand.m4 0.2.0 +dnl autostars m4 macro for expanding directories using configure's prefix +dnl thomas@apestaart.org + +dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR) +dnl example +dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir) +dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local + +AC_DEFUN([AS_AC_EXPAND], +[ + EXP_VAR=[$1] + FROM_VAR=[$2] + + dnl first expand prefix and exec_prefix if necessary + prefix_save=$prefix + exec_prefix_save=$exec_prefix + + dnl if no prefix given, then use /usr/local, the default prefix + if test "x$prefix" = "xNONE"; then + prefix="$ac_default_prefix" + fi + dnl if no exec_prefix given, then use prefix + if test "x$exec_prefix" = "xNONE"; then + exec_prefix=$prefix + fi + + full_var="$FROM_VAR" + dnl loop until it doesn't change anymore + while true; do + new_full_var="`eval echo $full_var`" + if test "x$new_full_var" = "x$full_var"; then break; fi + full_var=$new_full_var + done + + dnl clean up + full_var=$new_full_var + AC_SUBST([$1], "$full_var") + + dnl restore prefix and exec_prefix + prefix=$prefix_save + exec_prefix=$exec_prefix_save +]) diff --git a/common/m4/as-auto-alt.m4 b/common/m4/as-auto-alt.m4 new file mode 100644 index 0000000..3f7920d --- /dev/null +++ b/common/m4/as-auto-alt.m4 @@ -0,0 +1,50 @@ +dnl as-auto-alt.m4 0.0.2 +dnl autostars m4 macro for supplying alternate autotools versions to configure +dnl thomas@apestaart.org +dnl +dnl AS_AUTOTOOLS_ALTERNATE() +dnl +dnl supplies --with arguments for autoconf, autoheader, automake, aclocal + +AC_DEFUN([AS_AUTOTOOLS_ALTERNATE], +[ + dnl allow for different autoconf version + AC_ARG_WITH(autoconf, + AC_HELP_STRING([--with-autoconf], + [use a different autoconf for regeneration of Makefiles]), + [ + unset AUTOCONF + AM_MISSING_PROG(AUTOCONF, ${withval}) + AC_MSG_NOTICE([Using $AUTOCONF as autoconf]) + ]) + + dnl allow for different autoheader version + AC_ARG_WITH(autoheader, + AC_HELP_STRING([--with-autoheader], + [use a different autoheader for regeneration of Makefiles]), + [ + unset AUTOHEADER + AM_MISSING_PROG(AUTOHEADER, ${withval}) + AC_MSG_NOTICE([Using $AUTOHEADER as autoheader]) + ]) + + dnl allow for different automake version + AC_ARG_WITH(automake, + AC_HELP_STRING([--with-automake], + [use a different automake for regeneration of Makefiles]), + [ + unset AUTOMAKE + AM_MISSING_PROG(AUTOMAKE, ${withval}) + AC_MSG_NOTICE([Using $AUTOMAKE as automake]) + ]) + + dnl allow for different aclocal version + AC_ARG_WITH(aclocal, + AC_HELP_STRING([--with-aclocal], + [use a different aclocal for regeneration of Makefiles]), + [ + unset ACLOCAL + AM_MISSING_PROG(ACLOCAL, ${withval}) + AC_MSG_NOTICE([Using $ACLOCAL as aclocal]) + ]) +]) diff --git a/common/m4/as-compiler-flag.m4 b/common/m4/as-compiler-flag.m4 new file mode 100644 index 0000000..882a4c7 --- /dev/null +++ b/common/m4/as-compiler-flag.m4 @@ -0,0 +1,64 @@ +dnl as-compiler-flag.m4 0.1.0 + +dnl autostars m4 macro for detection of compiler flags + +dnl David Schleef +dnl Tim-Philipp Müller + +dnl AS_COMPILER_FLAG(CFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) +dnl Tries to compile with the given CFLAGS. +dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, +dnl and ACTION-IF-NOT-ACCEPTED otherwise. + +AC_DEFUN([AS_COMPILER_FLAG], +[ + AC_MSG_CHECKING([to see if compiler understands $1]) + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $1" + + AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + $2 + true + else + $3 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + +dnl AS_CXX_COMPILER_FLAG(CPPFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) +dnl Tries to compile with the given CPPFLAGS. +dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, +dnl and ACTION-IF-NOT-ACCEPTED otherwise. + +AC_DEFUN([AS_CXX_COMPILER_FLAG], +[ + AC_REQUIRE([AC_PROG_CXX]) + + AC_MSG_CHECKING([to see if c++ compiler understands $1]) + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $1" + + AC_LANG_PUSH(C++) + + AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + $2 + true + else + $3 + true + fi + + AC_LANG_POP(C++) + + AC_MSG_RESULT([$flag_ok]) +]) + diff --git a/common/m4/as-compiler.m4 b/common/m4/as-compiler.m4 new file mode 100644 index 0000000..309a060 --- /dev/null +++ b/common/m4/as-compiler.m4 @@ -0,0 +1,44 @@ +dnl as-compiler.m4 0.1.0 + +dnl autostars m4 macro for detection of compiler flavor + +dnl Thomas Vander Stichele + +dnl $Id: as-compiler.m4,v 1.4 2004/06/01 09:44:19 thomasvs Exp $ + +dnl AS_COMPILER(COMPILER) +dnl will set variable COMPILER to +dnl - gcc +dnl - forte +dnl - (empty) if no guess could be made + +AC_DEFUN([AS_COMPILER], +[ + as_compiler= + AC_MSG_CHECKING(for compiler flavour) + + dnl is it gcc ? + if test "x$GCC" = "xyes"; then + as_compiler="gcc" + fi + + dnl is it forte ? + AC_TRY_RUN([ +int main +(int argc, char *argv[]) +{ +#ifdef __sun + return 0; +#else + return 1; +#endif +} + ], as_compiler="forte", ,) + + if test "x$as_compiler" = "x"; then + AC_MSG_RESULT([unknown !]) + else + AC_MSG_RESULT($as_compiler) + fi + [$1]=$as_compiler +]) diff --git a/common/m4/as-docbook.m4 b/common/m4/as-docbook.m4 new file mode 100644 index 0000000..8a1b32a --- /dev/null +++ b/common/m4/as-docbook.m4 @@ -0,0 +1,66 @@ +dnl AS_DOCBOOK([, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl checks if xsltproc can build docbook documentation +dnl (which is possible if the catalog is set up properly +dnl I also tried checking for a specific version and type of docbook +dnl but xsltproc seemed to happily run anyway, so we can't check for that +dnl and version +dnl this macro takes inspiration from +dnl http://www.movement.uklinux.net/docs/docbook-autotools/configure.html +AC_DEFUN([AS_DOCBOOK], +[ + XSLTPROC_FLAGS=--nonet + DOCBOOK_ROOT= + TYPE_LC=xml + TYPE_UC=XML + DOCBOOK_VERSION=4.1.2 + + if test ! -f /etc/xml/catalog; then + for i in /usr/share/sgml/docbook/stylesheet/xsl/nwalsh /usr/share/sgml/docbook/xsl-stylesheets/ /usr/local/share/xsl/docbook ; + do + if test -d "$i"; then + DOCBOOK_ROOT=$i + fi + done + else + XML_CATALOG=/etc/xml/catalog + CAT_ENTRY_START='' + fi + + dnl We need xsltproc to process the test + AC_CHECK_PROG(XSLTPROC,xsltproc,xsltproc,) + XSLTPROC_WORKS=no + if test -n "$XSLTPROC"; then + AC_MSG_CHECKING([whether xsltproc docbook processing works]) + + if test -n "$XML_CATALOG"; then + DB_FILE="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl" + else + DB_FILE="$DOCBOOK_ROOT/xhtml/docbook.xsl" + fi + $XSLTPROC $XSLTPROC_FLAGS $DB_FILE >/dev/null 2>&1 << END + + + + +END + if test "$?" = 0; then + XSLTPROC_WORKS=yes + fi + AC_MSG_RESULT($XSLTPROC_WORKS) + fi + + if test "x$XSLTPROC_WORKS" = "xyes"; then + dnl execute ACTION-IF-FOUND + ifelse([$1], , :, [$1]) + else + dnl execute ACTION-IF-NOT-FOUND + ifelse([$2], , :, [$2]) + fi + + AC_SUBST(XML_CATALOG) + AC_SUBST(XSLTPROC_FLAGS) + AC_SUBST(DOCBOOK_ROOT) + AC_SUBST(CAT_ENTRY_START) + AC_SUBST(CAT_ENTRY_END) +]) diff --git a/common/m4/as-gcc-inline-assembly.m4 b/common/m4/as-gcc-inline-assembly.m4 new file mode 100644 index 0000000..af32104 --- /dev/null +++ b/common/m4/as-gcc-inline-assembly.m4 @@ -0,0 +1,52 @@ +dnl as-gcc-inline-assembly.m4 0.1.0 + +dnl autostars m4 macro for detection of gcc inline assembly + +dnl David Schleef + +dnl $Id$ + +dnl AS_COMPILER_FLAG(ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) +dnl Tries to compile with the given CFLAGS. +dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, +dnl and ACTION-IF-NOT-ACCEPTED otherwise. + +AC_DEFUN([AS_GCC_INLINE_ASSEMBLY], +[ + AC_MSG_CHECKING([if compiler supports gcc-style inline assembly]) + + AC_TRY_COMPILE([], [ +#ifdef __GNUC_MINOR__ +#if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 +#error GCC before 3.4 has critical bugs compiling inline assembly +#endif +#endif +__asm__ (""::) ], [flag_ok=yes], [flag_ok=no]) + + if test "X$flag_ok" = Xyes ; then + $1 + true + else + $2 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + + +AC_DEFUN([AS_GCC_ASM_POWERPC_FPU], +[ + AC_MSG_CHECKING([if compiler supports FPU instructions on PowerPC]) + + AC_TRY_COMPILE([], [__asm__ ("fadd 0,0,0"::) ], [flag_ok=yes], [flag_ok=no]) + + if test "X$flag_ok" = Xyes ; then + $1 + true + else + $2 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + diff --git a/common/m4/as-libtool-tags.m4 b/common/m4/as-libtool-tags.m4 new file mode 100644 index 0000000..06f0ae4 --- /dev/null +++ b/common/m4/as-libtool-tags.m4 @@ -0,0 +1,83 @@ +dnl as-libtool-tags.m4 0.1.4 + +dnl autostars m4 macro for selecting libtool "tags" (languages) + +dnl Andy Wingo does not claim credit for this macro +dnl backported from libtool 1.6 by Paolo Bonzini +dnl see http://lists.gnu.org/archive/html/libtool/2003-12/msg00007.html + +dnl $Id$ + +dnl AS_LIBTOOL_TAGS([tags...]) + +dnl example +dnl AS_LIBTOOL_TAGS([]) for only C (no fortran, etc) + +dnl When AC_LIBTOOL_TAGS is used, I redefine _LT_AC_TAGCONFIG +dnl to be more similar to the libtool 1.6 implementation, which +dnl uses an m4 loop and m4 case instead of a shell loop. This +dnl way the CXX/GCJ/F77/RC tests are not always expanded. + +dnl AS_LIBTOOL_TAGS +dnl --------------- +dnl tags to enable +AC_DEFUN([AS_LIBTOOL_TAGS], +[m4_define([_LT_TAGS],[$1]) +m4_define([_LT_AC_TAGCONFIG], [ + # redefined LT AC TAGCONFIG + if test -f "$ltmain"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + AC_FOREACH([_LT_TAG], _LT_TAGS, + echo THOMAS: tag _LT_TAG + [m4_case(_LT_TAG, + [CXX], [ + if test -n "$CXX" && test "X$CXX" != "Xno"; then + echo "THOMAS: YAY CXX" + AC_LIBTOOL_LANG_CXX_CONFIG + available_tags="$available_tags _LT_TAG" + fi], + [F77], [ + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + available_tags="$available_tags _LT_TAG" + fi], + [GCJ], [ + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + available_tags="$available_tags _LT_TAG" + fi], + [RC], [ + if test -n "$RC" && test "X$RC" != "Xno"; then + AC_LIBTOOL_LANG_RC_CONFIG + available_tags="$available_tags _LT_TAG" + fi], + [m4_errprintn(m4_location[: error: invalid tag name: ]"_LT_TAG") + m4_exit(1)]) + ]) + echo THOMAS: available tags: $available_tags + fi + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + AC_MSG_NOTICE([updated available libtool tags with $available_tags.]) + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + + fi + +])dnl _LT_AC_TAG_CONFIG +]) diff --git a/common/m4/as-libtool.m4 b/common/m4/as-libtool.m4 new file mode 100644 index 0000000..25de9d1 --- /dev/null +++ b/common/m4/as-libtool.m4 @@ -0,0 +1,45 @@ +dnl as-libtool.m4 0.1.4 + +dnl autostars m4 macro for libtool versioning + +dnl Thomas Vander Stichele + +dnl $Id: as-libtool.m4,v 1.10 2005/10/15 13:44:23 thomasvs Exp $ + +dnl AS_LIBTOOL(PREFIX, CURRENT, REVISION, AGE, [RELEASE]) + +dnl example +dnl AS_LIBTOOL(GST, 2, 0, 0) + +dnl this macro +dnl - defines [$PREFIX]_CURRENT, REVISION and AGE +dnl - defines [$PREFIX]_LIBVERSION +dnl - defines [$PREFIX]_LT_LDFLAGS to set versioning +dnl - AC_SUBST's them all + +dnl if RELEASE is given, then add a -release option to the LDFLAGS +dnl with the given release version +dnl then use [$PREFIX]_LT_LDFLAGS in the relevant Makefile.am's + +dnl call AM_PROG_LIBTOOL after this call + +AC_DEFUN([AS_LIBTOOL], +[ + [$1]_CURRENT=[$2] + [$1]_REVISION=[$3] + [$1]_AGE=[$4] + [$1]_LIBVERSION=[$2]:[$3]:[$4] + AC_SUBST([$1]_CURRENT) + AC_SUBST([$1]_REVISION) + AC_SUBST([$1]_AGE) + AC_SUBST([$1]_LIBVERSION) + + [$1]_LT_LDFLAGS="$[$1]_LT_LDFLAGS -version-info $[$1]_LIBVERSION" + if test ! -z "[$5]" + then + [$1]_LT_LDFLAGS="$[$1]_LT_LDFLAGS -release [$5]" + fi + AC_SUBST([$1]_LT_LDFLAGS) + + AC_LIBTOOL_DLOPEN +]) diff --git a/common/m4/as-objc.m4 b/common/m4/as-objc.m4 new file mode 100644 index 0000000..1e7066a --- /dev/null +++ b/common/m4/as-objc.m4 @@ -0,0 +1,56 @@ + + +# AC_PROG_OBJC([LIST-OF-COMPILERS]) +# +AC_DEFUN([AS_PROG_OBJC], +[ +AC_CHECK_TOOLS(OBJC, + [m4_default([$1], [objcc objc gcc cc CC])], + none) +AC_SUBST(OBJC) +OBJC_LDFLAGS="-lobjc" +AC_SUBST(OBJC_LDFLAGS) +if test "x$OBJC" != xnone ; then + _AM_DEPENDENCIES(OBJC) + AC_MSG_CHECKING([if Objective C compiler works]) + cat >>conftest.m < +@interface Moo:Object +{ +} +- moo; +int main(); +@end + +@implementation Moo +- moo +{ + exit(0); +} + +int main() +{ + id moo; + moo = [[Moo new]]; + [[moo moo]]; + return 1; +} +@end +EOF + ${OBJC} conftest.m ${OBJC_LDFLAGS} >&5 2>&5 + if test -f a.out -o -f a.exe ; then + result=yes + else + result=no + echo failed program is: >&5 + cat conftest.m >&5 + fi + rm -f conftest.m a.out a.exe + AC_MSG_RESULT([$result]) +else + _AM_DEPENDENCIES(OBJC) +fi + +]) + + diff --git a/common/m4/as-python.m4 b/common/m4/as-python.m4 new file mode 100644 index 0000000..eb9b175 --- /dev/null +++ b/common/m4/as-python.m4 @@ -0,0 +1,152 @@ +## ------------------------ +## Python file handling +## From Andrew Dalke +## Updated by James Henstridge +## Updated by Andy Wingo to loop through possible pythons +## ------------------------ + +# AS_PATH_PYTHON([MINIMUM-VERSION]) + +# Adds support for distributing Python modules and packages. To +# install modules, copy them to $(pythondir), using the python_PYTHON +# automake variable. To install a package with the same name as the +# automake package, install to $(pkgpythondir), or use the +# pkgpython_PYTHON automake variable. + +# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +# locations to install python extension modules (shared libraries). +# Another macro is required to find the appropriate flags to compile +# extension modules. + +# If your package is configured with a different prefix to python, +# users will have to add the install directory to the PYTHONPATH +# environment variable, or create a .pth file (see the python +# documentation for details). + +# If the MINIMUM-VERSION argument is passed, AS_PATH_PYTHON will +# cause an error if the version of python installed on the system +# doesn't meet the requirement. MINIMUM-VERSION should consist of +# numbers and dots only. + +# Updated to loop over all possible python binaries by Andy Wingo +# +# Updated to only warn and unset PYTHON if no good one is found + +AC_DEFUN([AS_PATH_PYTHON], + [ + dnl Find a version of Python. I could check for python versions 1.4 + dnl or earlier, but the default installation locations changed from + dnl $prefix/lib/site-python in 1.4 to $prefix/lib/python1.5/site-packages + dnl in 1.5, and I don't want to maintain that logic. + + dnl should we do the version check? + PYTHON_CANDIDATES="python python2.2 python2.1 python2.0 python2 \ + python1.6 python1.5" + ifelse([$1],[], + [AC_PATH_PROG(PYTHON, $PYTHON_CANDIDATES)], + [ + AC_MSG_NOTICE(Looking for Python version >= $1) + changequote(<<, >>)dnl + prog=" +import sys, string +minver = '$1' +# split string by '.' and convert to numeric +minver_info = map(string.atoi, string.split(minver, '.')) +# we can now do comparisons on the two lists: +if sys.version_info >= tuple(minver_info): + sys.exit(0) +else: + sys.exit(1)" + changequote([, ])dnl + + python_good=false + for python_candidate in $PYTHON_CANDIDATES; do + unset PYTHON + AC_PATH_PROG(PYTHON, $python_candidate) 1> /dev/null 2> /dev/null + + if test "x$PYTHON" = "x"; then continue; fi + + if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC; then + AC_MSG_CHECKING(["$PYTHON":]) + AC_MSG_RESULT([okay]) + python_good=true + break; + else + dnl clear the cache val + unset ac_cv_path_PYTHON + fi + done + ]) + + if test "$python_good" != "true"; then + AC_MSG_WARN([No suitable version of python found]) + PYTHON= + else + + AC_MSG_CHECKING([local Python configuration]) + + dnl Query Python for its version number. Getting [:3] seems to be + dnl the best way to do this; it's what "site.py" does in the standard + dnl library. Need to change quote character because of [:3] + + AC_SUBST(PYTHON_VERSION) + changequote(<<, >>)dnl + PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[:3]"` + changequote([, ])dnl + + + dnl Use the values of $prefix and $exec_prefix for the corresponding + dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made + dnl distinct variables so they can be overridden if need be. However, + dnl general consensus is that you shouldn't need this ability. + + AC_SUBST(PYTHON_PREFIX) + PYTHON_PREFIX='${prefix}' + + AC_SUBST(PYTHON_EXEC_PREFIX) + PYTHON_EXEC_PREFIX='${exec_prefix}' + + dnl At times (like when building shared libraries) you may want + dnl to know which OS platform Python thinks this is. + + AC_SUBST(PYTHON_PLATFORM) + PYTHON_PLATFORM=`$PYTHON -c "import sys; print sys.platform"` + + + dnl Set up 4 directories: + + dnl pythondir -- where to install python scripts. This is the + dnl site-packages directory, not the python standard library + dnl directory like in previous automake betas. This behaviour + dnl is more consistent with lispdir.m4 for example. + dnl + dnl Also, if the package prefix isn't the same as python's prefix, + dnl then the old $(pythondir) was pretty useless. + + AC_SUBST(pythondir) + pythondir=$PYTHON_PREFIX"/lib/python"$PYTHON_VERSION/site-packages + + dnl pkgpythondir -- $PACKAGE directory under pythondir. Was + dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is + dnl more consistent with the rest of automake. + dnl Maybe this should be put in python.am? + + AC_SUBST(pkgpythondir) + pkgpythondir=\${pythondir}/$PACKAGE + + dnl pyexecdir -- directory for installing python extension modules + dnl (shared libraries) Was PYTHON_SITE_EXEC in previous betas. + + AC_SUBST(pyexecdir) + pyexecdir=$PYTHON_EXEC_PREFIX"/lib/python"$PYTHON_VERSION/site-packages + + dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) + dnl Maybe this should be put in python.am? + + AC_SUBST(pkgpyexecdir) + pkgpyexecdir=\${pyexecdir}/$PACKAGE + + AC_MSG_RESULT([looks good]) + + fi +]) diff --git a/common/m4/as-scrub-include.m4 b/common/m4/as-scrub-include.m4 new file mode 100644 index 0000000..3ed49b0 --- /dev/null +++ b/common/m4/as-scrub-include.m4 @@ -0,0 +1,36 @@ +dnl as-scrub-include.m4 0.0.4 + +dnl autostars m4 macro for scrubbing CFLAGS of system include dirs +dnl because gcc 3.x complains about including system including dirs + +dnl Thomas Vander Stichele + +dnl $Id: as-scrub-include.m4,v 1.7 2004/06/12 08:30:20 thomasvs Exp $ + +dnl This macro uses output of cpp -v and expects it to contain text that +dnl looks a little bit like this: +dnl #include <...> search starts here: +dnl /usr/local/include +dnl /usr/lib/gcc-lib/i386-redhat-linux/3.2/include +dnl /usr/include +dnl End of search list. + +dnl AS_SCRUB_INCLUDE(VAR) +dnl example +dnl AS_SCRUB_INCLUDE(CFLAGS) +dnl will remove all system include dirs from the given CFLAGS + +AC_DEFUN([AS_SCRUB_INCLUDE], +[ + GIVEN_CFLAGS=$[$1] + INCLUDE_DIRS=`echo | cpp -v 2>&1` + + dnl remove everything from this output between the "starts here" and "End of" + dnl line + INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` + for dir in $INCLUDE_DIRS; do + dnl use "" as the sed script so $dir gets expanded + GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` + done + [$1]=$GIVEN_CFLAGS +]) diff --git a/common/m4/as-version.m4 b/common/m4/as-version.m4 new file mode 100644 index 0000000..22ff774 --- /dev/null +++ b/common/m4/as-version.m4 @@ -0,0 +1,75 @@ +dnl as-version.m4 0.2.0 + +dnl autostars m4 macro for versioning + +dnl Thomas Vander Stichele + +dnl $Id: as-version.m4,v 1.15 2006/04/01 09:40:24 thomasvs Exp $ + +dnl AS_VERSION + +dnl example +dnl AS_VERSION + +dnl this macro +dnl - AC_SUBST's PACKAGE_VERSION_MAJOR, _MINOR, _MICRO +dnl - AC_SUBST's PACKAGE_VERSION_RELEASE, +dnl which can be used for rpm release fields +dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents +dnl maintainer mode from running correctly +dnl +dnl don't forget to put #undef PACKAGE_VERSION_RELEASE in acconfig.h +dnl if you use acconfig.h + +AC_DEFUN([AS_VERSION], +[ + PACKAGE_VERSION_MAJOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f1) + PACKAGE_VERSION_MINOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f2) + PACKAGE_VERSION_MICRO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f3) + + AC_SUBST(PACKAGE_VERSION_MAJOR) + AC_SUBST(PACKAGE_VERSION_MINOR) + AC_SUBST(PACKAGE_VERSION_MICRO) +]) + +dnl AS_NANO(ACTION-IF-NANO-NON-NULL, [ACTION-IF-NANO-NULL]) + +dnl requires AC_INIT to be called before +dnl For projects using a fourth or nano number in your versioning to indicate +dnl development or prerelease snapshots, this macro allows the build to be +dnl set up differently accordingly. + +dnl this macro: +dnl - parses AC_PACKAGE_VERSION, set by AC_INIT, and extracts the nano number +dnl - sets the variable PACKAGE_VERSION_NANO +dnl - sets the variable PACKAGE_VERSION_RELEASE, which can be used +dnl for rpm release fields +dnl - executes ACTION-IF-NANO-NON-NULL or ACTION-IF-NANO-NULL + +dnl example: +dnl AS_NANO(RELEASE="yes", RELEASE="no") + +AC_DEFUN([AS_NANO], +[ + AC_MSG_CHECKING(nano version) + + NANO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f4) + + if test x"$NANO" = x || test "x$NANO" = "x0" ; then + AC_MSG_RESULT([0 (release)]) + NANO=0 + PACKAGE_VERSION_RELEASE=1 + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT($NANO) + PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S` + if test "x$NANO" != "x1" ; then + ifelse([$1], , :, [$1]) + else + ifelse([$2], , :, [$2]) + fi + fi + PACKAGE_VERSION_NANO=$NANO + AC_SUBST(PACKAGE_VERSION_NANO) + AC_SUBST(PACKAGE_VERSION_RELEASE) +]) diff --git a/common/m4/ax_create_stdint_h.m4 b/common/m4/ax_create_stdint_h.m4 new file mode 100644 index 0000000..13bf699 --- /dev/null +++ b/common/m4/ax_create_stdint_h.m4 @@ -0,0 +1,734 @@ +##### http://autoconf-archive.cryp.to/ax_create_stdint_h.html +# +# SYNOPSIS +# +# AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEDERS-TO-CHECK])] +# +# DESCRIPTION +# +# the "ISO C9X: 7.18 Integer types " section requires the +# existence of an include file that defines a set of +# typedefs, especially uint8_t,int32_t,uintptr_t. Many older +# installations will not provide this file, but some will have the +# very same definitions in . In other enviroments we can +# use the inet-types in which would define the typedefs +# int8_t and u_int8_t respectivly. +# +# This macros will create a local "_stdint.h" or the headerfile given +# as an argument. In many cases that file will just "#include +# " or "#include ", while in other environments +# it will provide the set of basic 'stdint's definitions/typedefs: +# +# int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t +# int_least32_t.. int_fast32_t.. intmax_t +# +# which may or may not rely on the definitions of other files, or +# using the AC_CHECK_SIZEOF macro to determine the actual sizeof each +# type. +# +# if your header files require the stdint-types you will want to +# create an installable file mylib-int.h that all your other +# installable header may include. So if you have a library package +# named "mylib", just use +# +# AX_CREATE_STDINT_H(mylib-int.h) +# +# in configure.ac and go to install that very header file in +# Makefile.am along with the other headers (mylib.h) - and the +# mylib-specific headers can simply use "#include " to +# obtain the stdint-types. +# +# Remember, if the system already had a valid , the +# generated file will include it directly. No need for fuzzy +# HAVE_STDINT_H things... (oops, GCC 4.2.x has deliberatly disabled +# its stdint.h for non-c99 compilation and the c99-mode is not the +# default. Therefore this macro will not use the compiler's stdint.h +# - please complain to the GCC developers). +# +# LAST MODIFICATION +# +# 2007-06-27 +# +# COPYLEFT +# +# Copyright (c) 2007 Guido U. Draheim +# +# 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 of the +# License, 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. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([AX_CHECK_DATA_MODEL],[ + AC_CHECK_SIZEOF(char) + AC_CHECK_SIZEOF(short) + AC_CHECK_SIZEOF(int) + AC_CHECK_SIZEOF(long) + AC_CHECK_SIZEOF(void*) + ac_cv_char_data_model="" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int" + ac_cv_long_data_model="" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp" + AC_MSG_CHECKING([data model]) + case "$ac_cv_char_data_model/$ac_cv_long_data_model" in + 122/242) ac_cv_data_model="IP16" ; n="standard 16bit machine" ;; + 122/244) ac_cv_data_model="LP32" ; n="standard 32bit machine" ;; + 122/*) ac_cv_data_model="i16" ; n="unusual int16 model" ;; + 124/444) ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;; + 124/488) ac_cv_data_model="LP64" ; n="standard 64bit unixish" ;; + 124/448) ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;; + 124/*) ac_cv_data_model="i32" ; n="unusual int32 model" ;; + 128/888) ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;; + 128/*) ac_cv_data_model="i64" ; n="unusual int64 model" ;; + 222/*2) ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;; + 333/*3) ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;; + 444/*4) ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;; + 666/*6) ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;; + 888/*8) ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;; + 222/*|333/*|444/*|666/*|888/*) : + ac_cv_data_model="iDSP" ; n="unusual dsptype" ;; + *) ac_cv_data_model="none" ; n="very unusual model" ;; + esac + AC_MSG_RESULT([$ac_cv_data_model ($ac_cv_long_data_model, $n)]) +]) + +dnl AX_CHECK_HEADER_STDINT_X([HEADERLIST][,ACTION-IF]) +AC_DEFUN([AX_CHECK_HEADER_STDINT_X],[ +AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[ + ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h) + AC_MSG_RESULT([(..)]) + for i in m4_ifval([$1],[$1],[stdint.h inttypes.h sys/inttypes.h sys/types.h]) + do + unset ac_cv_type_uintptr_t + unset ac_cv_type_uint64_t + AC_CHECK_TYPE(uintptr_t,[ac_cv_header_stdint_x=$i],continue,[#include <$i>]) + AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>]) + m4_ifvaln([$2],[$2]) break + done + AC_MSG_CHECKING([for stdint uintptr_t]) + ]) +]) + +AC_DEFUN([AX_CHECK_HEADER_STDINT_O],[ +AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[ + ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h) + AC_MSG_RESULT([(..)]) + for i in m4_ifval([$1],[$1],[inttypes.h sys/inttypes.h sys/types.h stdint.h]) + do + unset ac_cv_type_uint32_t + unset ac_cv_type_uint64_t + AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],continue,[#include <$i>]) + AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>]) + m4_ifvaln([$2],[$2]) break + break; + done + AC_MSG_CHECKING([for stdint uint32_t]) + ]) +]) + +AC_DEFUN([AX_CHECK_HEADER_STDINT_U],[ +AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[ + ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h) + AC_MSG_RESULT([(..)]) + for i in m4_ifval([$1],[$1],[sys/types.h inttypes.h sys/inttypes.h]) ; do + unset ac_cv_type_u_int32_t + unset ac_cv_type_u_int64_t + AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],continue,[#include <$i>]) + AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include<$i>]) + m4_ifvaln([$2],[$2]) break + break; + done + AC_MSG_CHECKING([for stdint u_int32_t]) + ]) +]) + +AC_DEFUN([AX_CREATE_STDINT_H], +[# ------ AX CREATE STDINT H ------------------------------------- +AC_MSG_CHECKING([for stdint types]) +ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)` +# try to shortcircuit - if the default include path of the compiler +# can find a "stdint.h" header then we assume that all compilers can. +AC_CACHE_VAL([ac_cv_header_stdint_t],[ +old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS="" +old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS="" +old_CFLAGS="$CFLAGS" ; CFLAGS="" +AC_TRY_COMPILE([#include ],[int_least32_t v = 0;], +[ac_cv_stdint_result="(assuming C99 compatible system)" + ac_cv_header_stdint_t="stdint.h"; ], +[ac_cv_header_stdint_t=""]) +if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then +CFLAGS="-std=c99" +AC_TRY_COMPILE([#include ],[int_least32_t v = 0;], +[AC_MSG_WARN(your GCC compiler has a defunct stdint.h for its default-mode)]) +fi +CXXFLAGS="$old_CXXFLAGS" +CPPFLAGS="$old_CPPFLAGS" +CFLAGS="$old_CFLAGS" ]) + +v="... $ac_cv_header_stdint_h" +if test "$ac_stdint_h" = "stdint.h" ; then + AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)]) +elif test "$ac_stdint_h" = "inttypes.h" ; then + AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)]) +elif test "_$ac_cv_header_stdint_t" = "_" ; then + AC_MSG_RESULT([(putting them into $ac_stdint_h)$v]) +else + ac_cv_header_stdint="$ac_cv_header_stdint_t" + AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)]) +fi + +if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit.. + +dnl .....intro message done, now do a few system checks..... +dnl btw, all old CHECK_TYPE macros do automatically "DEFINE" a type, +dnl therefore we use the autoconf implementation detail CHECK_TYPE_NEW +dnl instead that is triggered with 3 or more arguments (see types.m4) + +inttype_headers=`echo $2 | sed -e 's/,/ /g'` + +ac_cv_stdint_result="(no helpful system typedefs seen)" +AX_CHECK_HEADER_STDINT_X(dnl + stdint.h inttypes.h sys/inttypes.h $inttype_headers, + ac_cv_stdint_result="(seen uintptr_t$and64 in $i)") + +if test "_$ac_cv_header_stdint_x" = "_" ; then +AX_CHECK_HEADER_STDINT_O(dnl, + inttypes.h sys/inttypes.h stdint.h $inttype_headers, + ac_cv_stdint_result="(seen uint32_t$and64 in $i)") +fi + +if test "_$ac_cv_header_stdint_x" = "_" ; then +if test "_$ac_cv_header_stdint_o" = "_" ; then +AX_CHECK_HEADER_STDINT_U(dnl, + sys/types.h inttypes.h sys/inttypes.h $inttype_headers, + ac_cv_stdint_result="(seen u_int32_t$and64 in $i)") +fi fi + +dnl if there was no good C99 header file, do some typedef checks... +if test "_$ac_cv_header_stdint_x" = "_" ; then + AC_MSG_CHECKING([for stdint datatype model]) + AC_MSG_RESULT([(..)]) + AX_CHECK_DATA_MODEL +fi + +if test "_$ac_cv_header_stdint_x" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_x" +elif test "_$ac_cv_header_stdint_o" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_o" +elif test "_$ac_cv_header_stdint_u" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_u" +else + ac_cv_header_stdint="stddef.h" +fi + +AC_MSG_CHECKING([for extra inttypes in chosen header]) +AC_MSG_RESULT([($ac_cv_header_stdint)]) +dnl see if int_least and int_fast types are present in _this_ header. +unset ac_cv_type_int_least32_t +unset ac_cv_type_int_fast32_t +AC_CHECK_TYPE(int_least32_t,,,[#include <$ac_cv_header_stdint>]) +AC_CHECK_TYPE(int_fast32_t,,,[#include<$ac_cv_header_stdint>]) +AC_CHECK_TYPE(intmax_t,,,[#include <$ac_cv_header_stdint>]) + +fi # shortcircut to system "stdint.h" +# ------------------ PREPARE VARIABLES ------------------------------ +if test "$GCC" = "yes" ; then +ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1` +else +ac_cv_stdint_message="using $CC" +fi + +AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl +$ac_cv_stdint_result]) + +dnl ----------------------------------------------------------------- +# ----------------- DONE inttypes.h checks START header ------------- +AC_CONFIG_COMMANDS([$ac_stdint_h],[ +AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h) +ac_stdint=$tmp/_stdint.h + +echo "#ifndef" $_ac_stdint_h >$ac_stdint +echo "#define" $_ac_stdint_h "1" >>$ac_stdint +echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint +echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint +echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint +if test "_$ac_cv_header_stdint_t" != "_" ; then +echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint +echo "#include " >>$ac_stdint +echo "#endif" >>$ac_stdint +echo "#endif" >>$ac_stdint +else + +cat >>$ac_stdint < +#else +#include + +/* .................... configured part ............................ */ + +STDINT_EOF + +echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint +if test "_$ac_cv_header_stdint_x" != "_" ; then + ac_header="$ac_cv_header_stdint_x" + echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint +fi + +echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint +if test "_$ac_cv_header_stdint_o" != "_" ; then + ac_header="$ac_cv_header_stdint_o" + echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint +fi + +echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint +if test "_$ac_cv_header_stdint_u" != "_" ; then + ac_header="$ac_cv_header_stdint_u" + echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint +fi + +echo "" >>$ac_stdint + +if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then + echo "#include <$ac_header>" >>$ac_stdint + echo "" >>$ac_stdint +fi fi + +echo "/* which 64bit typedef has been found */" >>$ac_stdint +if test "$ac_cv_type_uint64_t" = "yes" ; then +echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint +fi +if test "$ac_cv_type_u_int64_t" = "yes" ; then +echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint +fi +echo "" >>$ac_stdint + +echo "/* which type model has been detected */" >>$ac_stdint +if test "_$ac_cv_char_data_model" != "_" ; then +echo "#define _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint +echo "#define _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint +else +echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint +echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint +fi +echo "" >>$ac_stdint + +echo "/* whether int_least types were detected */" >>$ac_stdint +if test "$ac_cv_type_int_least32_t" = "yes"; then +echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint +fi +echo "/* whether int_fast types were detected */" >>$ac_stdint +if test "$ac_cv_type_int_fast32_t" = "yes"; then +echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint +fi +echo "/* whether intmax_t type was detected */" >>$ac_stdint +if test "$ac_cv_type_intmax_t" = "yes"; then +echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint +fi +echo "" >>$ac_stdint + + cat >>$ac_stdint <= 199901L +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef long long int64_t; +typedef unsigned long long uint64_t; + +#elif !defined __STRICT_ANSI__ +#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ +#define _HAVE_UINT64_T +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + +#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ +/* note: all ELF-systems seem to have loff-support which needs 64-bit */ +#if !defined _NO_LONGLONG +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef long long int64_t; +typedef unsigned long long uint64_t; +#endif + +#elif defined __alpha || (defined __mips && defined _ABIN32) +#if !defined _NO_LONGLONG +typedef long int64_t; +typedef unsigned long uint64_t; +#endif + /* compiler/cpu type to define int64_t */ +#endif +#endif +#endif + +#if defined _STDINT_HAVE_U_INT_TYPES +/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ +typedef u_int8_t uint8_t; +typedef u_int16_t uint16_t; +typedef u_int32_t uint32_t; + +/* glibc compatibility */ +#ifndef __int8_t_defined +#define __int8_t_defined +#endif +#endif + +#ifdef _STDINT_NEED_INT_MODEL_T +/* we must guess all the basic types. Apart from byte-adressable system, */ +/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ +/* (btw, those nibble-addressable systems are way off, or so we assume) */ + +dnl /* have a look at "64bit and data size neutrality" at */ +dnl /* http://unix.org/version2/whatsnew/login_64bit.html */ +dnl /* (the shorthand "ILP" types always have a "P" part) */ + +#if defined _STDINT_BYTE_MODEL +#if _STDINT_LONG_MODEL+0 == 242 +/* 2:4:2 = IP16 = a normal 16-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned long uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef long int32_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 +/* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ +/* 4:4:4 = ILP32 = a normal 32-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 +/* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ +/* 4:8:8 = LP64 = a normal 64-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +/* this system has a "long" of 64bit */ +#ifndef _HAVE_UINT64_T +#define _HAVE_UINT64_T +typedef unsigned long uint64_t; +typedef long int64_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 448 +/* LLP64 a 64-bit system derived from a 32-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +/* assuming the system has a "long long" */ +#ifndef _HAVE_UINT64_T +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef unsigned long long uint64_t; +typedef long long int64_t; +#endif +#else +#define _STDINT_NO_INT32_T +#endif +#else +#define _STDINT_NO_INT8_T +#define _STDINT_NO_INT32_T +#endif +#endif + +/* + * quote from SunOS-5.8 sys/inttypes.h: + * Use at your own risk. As of February 1996, the committee is squarely + * behind the fixed sized types; the "least" and "fast" types are still being + * discussed. The probability that the "fast" types may be removed before + * the standard is finalized is high enough that they are not currently + * implemented. + */ + +#if defined _STDINT_NEED_INT_LEAST_T +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +#ifdef _HAVE_UINT64_T +typedef int64_t int_least64_t; +#endif + +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +#ifdef _HAVE_UINT64_T +typedef uint64_t uint_least64_t; +#endif + /* least types */ +#endif + +#if defined _STDINT_NEED_INT_FAST_T +typedef int8_t int_fast8_t; +typedef int int_fast16_t; +typedef int32_t int_fast32_t; +#ifdef _HAVE_UINT64_T +typedef int64_t int_fast64_t; +#endif + +typedef uint8_t uint_fast8_t; +typedef unsigned uint_fast16_t; +typedef uint32_t uint_fast32_t; +#ifdef _HAVE_UINT64_T +typedef uint64_t uint_fast64_t; +#endif + /* fast types */ +#endif + +#ifdef _STDINT_NEED_INTMAX_T +#ifdef _HAVE_UINT64_T +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; +#else +typedef long intmax_t; +typedef unsigned long uintmax_t; +#endif +#endif + +#ifdef _STDINT_NEED_INTPTR_T +#ifndef __intptr_t_defined +#define __intptr_t_defined +/* we encourage using "long" to store pointer values, never use "int" ! */ +#if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 +typedef unsigned int uintptr_t; +typedef int intptr_t; +#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 +typedef unsigned long uintptr_t; +typedef long intptr_t; +#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T +typedef uint64_t uintptr_t; +typedef int64_t intptr_t; +#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ +typedef unsigned long uintptr_t; +typedef long intptr_t; +#endif +#endif +#endif + +/* The ISO C99 standard specifies that in C++ implementations these + should only be defined if explicitly requested. */ +#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS +#ifndef UINT32_C + +/* Signed. */ +# define INT8_C(c) c +# define INT16_C(c) c +# define INT32_C(c) c +# ifdef _HAVE_LONGLONG_UINT64_T +# define INT64_C(c) c ## L +# else +# define INT64_C(c) c ## LL +# endif + +/* Unsigned. */ +# define UINT8_C(c) c ## U +# define UINT16_C(c) c ## U +# define UINT32_C(c) c ## U +# ifdef _HAVE_LONGLONG_UINT64_T +# define UINT64_C(c) c ## UL +# else +# define UINT64_C(c) c ## ULL +# endif + +/* Maximal type. */ +# ifdef _HAVE_LONGLONG_UINT64_T +# define INTMAX_C(c) c ## L +# define UINTMAX_C(c) c ## UL +# else +# define INTMAX_C(c) c ## LL +# define UINTMAX_C(c) c ## ULL +# endif + + /* literalnumbers */ +#endif +#endif + +/* These limits are merily those of a two complement byte-oriented system */ + +/* Minimum of signed integral types. */ +# define INT8_MIN (-128) +# define INT16_MIN (-32767-1) +# define INT32_MIN (-2147483647-1) +# define INT64_MIN (-__INT64_C(9223372036854775807)-1) +/* Maximum of signed integral types. */ +# define INT8_MAX (127) +# define INT16_MAX (32767) +# define INT32_MAX (2147483647) +# define INT64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of unsigned integral types. */ +# define UINT8_MAX (255) +# define UINT16_MAX (65535) +# define UINT32_MAX (4294967295U) +# define UINT64_MAX (__UINT64_C(18446744073709551615)) + +/* Minimum of signed integral types having a minimum size. */ +# define INT_LEAST8_MIN INT8_MIN +# define INT_LEAST16_MIN INT16_MIN +# define INT_LEAST32_MIN INT32_MIN +# define INT_LEAST64_MIN INT64_MIN +/* Maximum of signed integral types having a minimum size. */ +# define INT_LEAST8_MAX INT8_MAX +# define INT_LEAST16_MAX INT16_MAX +# define INT_LEAST32_MAX INT32_MAX +# define INT_LEAST64_MAX INT64_MAX + +/* Maximum of unsigned integral types having a minimum size. */ +# define UINT_LEAST8_MAX UINT8_MAX +# define UINT_LEAST16_MAX UINT16_MAX +# define UINT_LEAST32_MAX UINT32_MAX +# define UINT_LEAST64_MAX UINT64_MAX + + /* shortcircuit*/ +#endif + /* once */ +#endif +#endif +STDINT_EOF +fi + if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then + AC_MSG_NOTICE([$ac_stdint_h is unchanged]) + else + ac_dir=`AS_DIRNAME(["$ac_stdint_h"])` + AS_MKDIR_P(["$ac_dir"]) + rm -f $ac_stdint_h + mv $ac_stdint $ac_stdint_h + fi +],[# variables for create stdint.h replacement +PACKAGE="$PACKAGE" +VERSION="$VERSION" +ac_stdint_h="$ac_stdint_h" +_ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h) +ac_cv_stdint_message="$ac_cv_stdint_message" +ac_cv_header_stdint_t="$ac_cv_header_stdint_t" +ac_cv_header_stdint_x="$ac_cv_header_stdint_x" +ac_cv_header_stdint_o="$ac_cv_header_stdint_o" +ac_cv_header_stdint_u="$ac_cv_header_stdint_u" +ac_cv_type_uint64_t="$ac_cv_type_uint64_t" +ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t" +ac_cv_char_data_model="$ac_cv_char_data_model" +ac_cv_long_data_model="$ac_cv_long_data_model" +ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t" +ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t" +ac_cv_type_intmax_t="$ac_cv_type_intmax_t" +]) +]) diff --git a/common/m4/check.m4 b/common/m4/check.m4 new file mode 100644 index 0000000..afd26eb --- /dev/null +++ b/common/m4/check.m4 @@ -0,0 +1,181 @@ +dnl _AM_TRY_CHECK(MINIMUM-VERSION, EXTRA-CFLAGS, EXTRA-LIBS, CHECK-LIB-NAME +dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for check, and define CHECK_CFLAGS and CHECK_LIBS +dnl Done this way because of the brokenness that is +dnl https://launchpad.net/distros/ubuntu/+source/check/+bug/5840 +dnl + +AC_DEFUN([_AM_TRY_CHECK], +[ + min_check_version=$1 + extra_cflags=$2 + extra_libs=$3 + check_lib_name=$4 + + CHECK_CFLAGS="$extra_cflags" + CHECK_LIBS="$extra_libs -l$check_lib_name" + + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + + CFLAGS="$CFLAGS $CHECK_CFLAGS" + LIBS="$CHECK_LIBS $LIBS" + + AC_MSG_CHECKING(for check named $check_lib_name - version >= $min_check_version) + + rm -f conf.check-test + dnl unset no_check, since in our second run it would have been set to yes + dnl before + no_check= + AC_TRY_RUN([ +#include +#include + +#include + +int main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.check-test"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = strdup("$min_check_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_check_version"); + return 1; + } + + if ((CHECK_MAJOR_VERSION != check_major_version) || + (CHECK_MINOR_VERSION != check_minor_version) || + (CHECK_MICRO_VERSION != check_micro_version)) + { + printf("\n*** The check header file (version %d.%d.%d) does not match\n", + CHECK_MAJOR_VERSION, CHECK_MINOR_VERSION, CHECK_MICRO_VERSION); + printf("*** the check library (version %d.%d.%d).\n", + check_major_version, check_minor_version, check_micro_version); + return 1; + } + + if ((check_major_version > major) || + ((check_major_version == major) && (check_minor_version > minor)) || + ((check_major_version == major) && (check_minor_version == minor) && (check_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of check (%d.%d.%d) was found.\n", + check_major_version, check_minor_version, check_micro_version); + printf("*** You need a version of check being at least %d.%d.%d.\n", major, minor, micro); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the check library and header\n"); + printf("*** file is being found. Rerun configure with the --with-check=PATH option\n"); + printf("*** to specify the prefix where the correct version was installed.\n"); + } + + return 1; +} +],, no_check=yes, [echo $ac_n "cross compiling; assumed OK... $ac_c"]) + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + + if test "x$no_check" = x ; then + AC_MSG_RESULT(yes) + ifelse([$5], , :, [$5]) + else + AC_MSG_RESULT(no) + if test -f conf.check-test ; then + : + else + echo "*** Could not run check test program, checking why..." + CFLAGS="$CFLAGS $CHECK_CFLAGS" + LIBS="$CHECK_LIBS $LIBS" + AC_TRY_LINK([ +#include +#include + +#include +], , [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding check. You'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for" + echo "*** the exact error that occured." ]) + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + CHECK_CFLAGS="" + CHECK_LIBS="" + + rm -f conf.check-test + ifelse([$6], , AC_MSG_ERROR([check not found]), [$6]) + fi +]) + + +dnl AM_PATH_CHECK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for check, and define CHECK_CFLAGS and CHECK_LIBS +dnl + +AC_DEFUN([AM_PATH_CHECK], +[ + AC_ARG_WITH(check, + [ --with-check=PATH prefix where check is installed [default=auto]]) + + AC_ARG_WITH(checklibname, + AC_HELP_STRING([--with-check-lib-name=NAME], + [name of the PIC check library (default=check)])) + + min_check_version=ifelse([$1], ,0.8.2,$1) + + if test x$with_check = xno; then + AC_MSG_RESULT(disabled) + ifelse([$3], , AC_MSG_ERROR([disabling check is not supported]), [$3]) + else + if test "x$with_check" != x; then + CHECK_EXTRA_CFLAGS="-I$with_check/include" + CHECK_EXTRA_LIBS="-L$with_check/lib" + else + CHECK_EXTRA_CFLAGS="" + CHECK_EXTRA_LIBS="" + fi + + if test x$with_checklibname = x; then + _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, + check_pic, [have_check=true], [have_check=false]) + if test x$have_check = xtrue; then + ifelse([$2], , :, [$2]) + else + _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, + check, [have_check=true], [have_check=false]) + if test x$have_check = xtrue; then + ifelse([$2], , :, [$2]) + else + ifelse([$3], , AC_MSG_ERROR([check not found]), [$3]) + fi + fi + else + _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, + $with_checklibname, [have_check=true], [have_check=false]) + if test x$have_check = xtrue; then + ifelse([$2], , :, [$2]) + else + ifelse([$3], , AC_MSG_ERROR([check not found]), [$3]) + fi + fi + + AC_SUBST(CHECK_CFLAGS) + AC_SUBST(CHECK_LIBS) + rm -f conf.check-test + fi +]) diff --git a/common/m4/glib-gettext.m4 b/common/m4/glib-gettext.m4 new file mode 100644 index 0000000..f8d442f --- /dev/null +++ b/common/m4/glib-gettext.m4 @@ -0,0 +1,432 @@ +# Copyright (C) 1995-2002 Free Software Foundation, Inc. +# Copyright (C) 2001-2003,2004 Red Hat, Inc. +# +# This file is free software, distributed under the terms of the GNU +# General Public License. As a special exception to the GNU General +# Public License, this file may be distributed as part of a program +# that contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995, 1996 +# +# Modified to never use included libintl. +# Owen Taylor , 12/15/1998 +# +# Major rework to remove unused code +# Owen Taylor , 12/11/2002 +# +# Added better handling of ALL_LINGUAS from GNU gettext version +# written by Bruno Haible, Owen Taylor 5/30/3002 +# +# Modified to require ngettext +# Matthias Clasen 08/06/2004 +# +# We need this here as well, since someone might use autoconf-2.5x +# to configure GLib then an older version to configure a package +# using AM_GLIB_GNU_GETTEXT +AC_PREREQ(2.53) + +dnl +dnl We go to great lengths to make sure that aclocal won't +dnl try to pull in the installed version of these macros +dnl when running aclocal in the glib directory. +dnl +m4_copy([AC_DEFUN],[glib_DEFUN]) +m4_copy([AC_REQUIRE],[glib_REQUIRE]) +dnl +dnl At the end, if we're not within glib, we'll define the public +dnl definitions in terms of our private definitions. +dnl + +# GLIB_LC_MESSAGES +#-------------------- +glib_DEFUN([GLIB_LC_MESSAGES], + [AC_CHECK_HEADERS([locale.h]) + if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi + fi]) + +# GLIB_PATH_PROG_WITH_TEST +#---------------------------- +dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +# GLIB_WITH_NLS +#----------------- +glib_DEFUN([GLIB_WITH_NLS], + dnl NLS is obligatory + [USE_NLS=yes + AC_SUBST(USE_NLS) + + gt_cv_have_gettext=no + + CATOBJEXT=NONE + XGETTEXT=: + INTLLIBS= + + AC_CHECK_HEADER(libintl.h, + [gt_cv_func_dgettext_libintl="no" + libintl_extra_libs="" + + # + # First check in libc + # + AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, + [AC_TRY_LINK([ +#include +], + [return !ngettext ("","", 1)], + gt_cv_func_ngettext_libc=yes, + gt_cv_func_ngettext_libc=no) + ]) + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, + [AC_TRY_LINK([ +#include +], + [return !dgettext ("","")], + gt_cv_func_dgettext_libc=yes, + gt_cv_func_dgettext_libc=no) + ]) + fi + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + AC_CHECK_FUNCS(bind_textdomain_codeset) + fi + + # + # If we don't have everything we want, check in libintl + # + if test "$gt_cv_func_dgettext_libc" != "yes" \ + || test "$gt_cv_func_ngettext_libc" != "yes" \ + || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then + + AC_CHECK_LIB(intl, bindtextdomain, + [AC_CHECK_LIB(intl, ngettext, + [AC_CHECK_LIB(intl, dgettext, + gt_cv_func_dgettext_libintl=yes)])]) + + if test "$gt_cv_func_dgettext_libintl" != "yes" ; then + AC_MSG_CHECKING([if -liconv is needed to use gettext]) + AC_MSG_RESULT([]) + AC_CHECK_LIB(intl, ngettext, + [AC_CHECK_LIB(intl, dcgettext, + [gt_cv_func_dgettext_libintl=yes + libintl_extra_libs=-liconv], + :,-liconv)], + :,-liconv) + fi + + # + # If we found libintl, then check in it for bind_textdomain_codeset(); + # we'll prefer libc if neither have bind_textdomain_codeset(), + # and both have dgettext and ngettext + # + if test "$gt_cv_func_dgettext_libintl" = "yes" ; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $libintl_extra_libs" + unset ac_cv_func_bind_textdomain_codeset + AC_CHECK_FUNCS(bind_textdomain_codeset) + LIBS="$glib_save_LIBS" + + if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then + gt_cv_func_dgettext_libc=no + else + if test "$gt_cv_func_dgettext_libc" = "yes" \ + && test "$gt_cv_func_ngettext_libc" = "yes"; then + gt_cv_func_dgettext_libintl=no + fi + fi + fi + fi + + if test "$gt_cv_func_dgettext_libc" = "yes" \ + || test "$gt_cv_func_dgettext_libintl" = "yes"; then + gt_cv_have_gettext=yes + fi + + if test "$gt_cv_func_dgettext_libintl" = "yes"; then + INTLLIBS="-lintl $libintl_extra_libs" + fi + + if test "$gt_cv_have_gettext" = "yes"; then + AC_DEFINE(HAVE_GETTEXT,1, + [Define if the GNU gettext() function is already present or preinstalled.]) + GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl + if test "$MSGFMT" != "no"; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + AC_CHECK_FUNCS(dcgettext) + MSGFMT_OPTS= + AC_MSG_CHECKING([if msgfmt accepts -c]) + GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: test 1.0\n" +"PO-Revision-Date: 2007-02-15 12:01+0100\n" +"Last-Translator: test \n" +"Language-Team: C \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) + AC_SUBST(MSGFMT_OPTS) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr], + [CATOBJEXT=.gmo + DATADIRNAME=share], + [case $host in + *-*-solaris*) + dnl On Solaris, if bind_textdomain_codeset is in libc, + dnl GNU format message catalog is always supported, + dnl since both are added to the libc all together. + dnl Hence, we'd like to go with DATADIRNAME=share and + dnl and CATOBJEXT=.gmo in this case. + AC_CHECK_FUNC(bind_textdomain_codeset, + [CATOBJEXT=.gmo + DATADIRNAME=share], + [CATOBJEXT=.mo + DATADIRNAME=lib]) + ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib + ;; + esac]) + LIBS="$glib_save_LIBS" + INSTOBJEXT=.mo + else + gt_cv_have_gettext=no + fi + fi + ]) + + if test "$gt_cv_have_gettext" = "yes" ; then + AC_DEFINE(ENABLE_NLS, 1, + [always defined to indicate that i18n is enabled]) + fi + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is not GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + + AC_OUTPUT_COMMANDS( + [case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac]) + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.in. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(DATADIRNAME) + AC_SUBST(GMOFILES) + AC_SUBST(INSTOBJEXT) + AC_SUBST(INTLLIBS) + AC_SUBST(PO_IN_DATADIR_TRUE) + AC_SUBST(PO_IN_DATADIR_FALSE) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + ]) + +# AM_GLIB_GNU_GETTEXT +# ------------------- +# Do checks necessary for use of gettext. If a suitable implementation +# of gettext is found in either in libintl or in the C library, +# it will set INTLLIBS to the libraries needed for use of gettext +# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable +# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() +# on various variables needed by the Makefile.in.in installed by +# glib-gettextize. +dnl +glib_DEFUN([GLIB_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + + GLIB_LC_MESSAGES + GLIB_WITH_NLS + + if test "$gt_cv_have_gettext" = "yes"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but ($top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl Generate list of files to be processed by xgettext which will + dnl be included in po/Makefile. + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + ]) + +# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) +# ------------------------------- +# Define VARIABLE to the location where catalog files will +# be installed by po/Makefile. +glib_DEFUN([GLIB_DEFINE_LOCALEDIR], +[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl +glib_save_prefix="$prefix" +glib_save_exec_prefix="$exec_prefix" +glib_save_datarootdir="$datarootdir" +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +datarootdir=`eval echo "${datarootdir}"` +if test "x$CATOBJEXT" = "x.mo" ; then + localedir=`eval echo "${libdir}/locale"` +else + localedir=`eval echo "${datadir}/locale"` +fi +prefix="$glib_save_prefix" +exec_prefix="$glib_save_exec_prefix" +datarootdir="$glib_save_datarootdir" +AC_DEFINE_UNQUOTED($1, "$localedir", + [Define the location where the catalogs will be installed]) +]) + +dnl +dnl Now the definitions that aclocal will find +dnl +ifdef(glib_configure_in,[],[ +AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) +AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) +])dnl + +# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) +# +# Create a temporary file with TEST-FILE as its contents and pass the +# file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with +# 0 and perform ACTION-IF-FAIL for any other exit status. +AC_DEFUN([GLIB_RUN_PROG], +[cat >conftest.foo <<_ACEOF +$2 +_ACEOF +if AC_RUN_LOG([$1 conftest.foo]); then + m4_ifval([$3], [$3], [:]) +m4_ifvaln([$4], [else $4])dnl +echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD +sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD +fi]) + diff --git a/common/m4/gst-arch.m4 b/common/m4/gst-arch.m4 new file mode 100644 index 0000000..2e935d2 --- /dev/null +++ b/common/m4/gst-arch.m4 @@ -0,0 +1,141 @@ +dnl AG_GST_ARCH +dnl sets up defines and automake conditionals for host architecture +dnl checks endianness +dnl defines HOST_CPU + +AC_DEFUN([AG_GST_ARCH], +[ + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use host_ variables + + dnl Determine CPU + case "x${host_cpu}" in + xi?86 | xk? | xi?86_64) + case $host_os in + solaris*) + AC_CHECK_DECL([__i386], [I386_ABI="yes"], [I386_ABI="no"]) + AC_CHECK_DECL([__amd64], [AMD64_ABI="yes"], [AMD64_ABI="no"]) + + if test "x$I386_ABI" = "xyes" ; then + HAVE_CPU_I386=yes + AC_DEFINE(HAVE_CPU_I386, 1, [Define if the host CPU is an x86]) + fi + if test "x$AMD64_ABI" = "xyes" ; then + HAVE_CPU_X86_64=yes + AC_DEFINE(HAVE_CPU_X86_64, 1, [Define if the host CPU is a x86_64]) + fi + ;; + *) + HAVE_CPU_I386=yes + AC_DEFINE(HAVE_CPU_I386, 1, [Define if the host CPU is an x86]) + + dnl FIXME could use some better detection + dnl (ie CPUID) + case "x${host_cpu}" in + xi386 | xi486) ;; + *) + AC_DEFINE(HAVE_RDTSC, 1, [Define if RDTSC is available]) ;; + esac + ;; + esac + ;; + xpowerpc) + HAVE_CPU_PPC=yes + AC_DEFINE(HAVE_CPU_PPC, 1, [Define if the host CPU is a PowerPC]) ;; + xpowerpc64) + HAVE_CPU_PPC64=yes + AC_DEFINE(HAVE_CPU_PPC64, 1, [Define if the host CPU is a 64 bit PowerPC]) ;; + xalpha*) + HAVE_CPU_ALPHA=yes + AC_DEFINE(HAVE_CPU_ALPHA, 1, [Define if the host CPU is an Alpha]) ;; + xarm*) + HAVE_CPU_ARM=yes + AC_DEFINE(HAVE_CPU_ARM, 1, [Define if the host CPU is an ARM]) ;; + xsparc*) + HAVE_CPU_SPARC=yes + AC_DEFINE(HAVE_CPU_SPARC, 1, [Define if the host CPU is a SPARC]) ;; + xmips*) + HAVE_CPU_MIPS=yes + AC_DEFINE(HAVE_CPU_MIPS, 1, [Define if the host CPU is a MIPS]) ;; + xhppa*) + HAVE_CPU_HPPA=yes + AC_DEFINE(HAVE_CPU_HPPA, 1, [Define if the host CPU is a HPPA]) ;; + xs390*) + HAVE_CPU_S390=yes + AC_DEFINE(HAVE_CPU_S390, 1, [Define if the host CPU is a S390]) ;; + xia64*) + HAVE_CPU_IA64=yes + AC_DEFINE(HAVE_CPU_IA64, 1, [Define if the host CPU is a IA64]) ;; + xm68k*) + HAVE_CPU_M68K=yes + AC_DEFINE(HAVE_CPU_M68K, 1, [Define if the host CPU is a M68K]) ;; + xx86_64) + HAVE_CPU_X86_64=yes + AC_DEFINE(HAVE_CPU_X86_64, 1, [Define if the host CPU is a x86_64]) ;; + xcris) + HAVE_CPU_CRIS=yes + AC_DEFINE(HAVE_CPU_CRIS, 1, [Define if the host CPU is a CRIS]) ;; + xcrisv32) + HAVE_CPU_CRISV32=yes + AC_DEFINE(HAVE_CPU_CRISV32, 1, [Define if the host CPU is a CRISv32]) ;; + esac + + dnl Determine endianness + AC_C_BIGENDIAN + + AM_CONDITIONAL(HAVE_CPU_I386, test "x$HAVE_CPU_I386" = "xyes") + AM_CONDITIONAL(HAVE_CPU_PPC, test "x$HAVE_CPU_PPC" = "xyes") + AM_CONDITIONAL(HAVE_CPU_PPC64, test "x$HAVE_CPU_PPC64" = "xyes") + AM_CONDITIONAL(HAVE_CPU_ALPHA, test "x$HAVE_CPU_ALPHA" = "xyes") + AM_CONDITIONAL(HAVE_CPU_ARM, test "x$HAVE_CPU_ARM" = "xyes") + AM_CONDITIONAL(HAVE_CPU_SPARC, test "x$HAVE_CPU_SPARC" = "xyes") + AM_CONDITIONAL(HAVE_CPU_HPPA, test "x$HAVE_CPU_HPPA" = "xyes") + AM_CONDITIONAL(HAVE_CPU_MIPS, test "x$HAVE_CPU_MIPS" = "xyes") + AM_CONDITIONAL(HAVE_CPU_S390, test "x$HAVE_CPU_S390" = "xyes") + AM_CONDITIONAL(HAVE_CPU_IA64, test "x$HAVE_CPU_IA64" = "xyes") + AM_CONDITIONAL(HAVE_CPU_M68K, test "x$HAVE_CPU_M68K" = "xyes") + AM_CONDITIONAL(HAVE_CPU_X86_64, test "x$HAVE_CPU_X86_64" = "xyes") + AM_CONDITIONAL(HAVE_CPU_CRIS, test "x$HAVE_CPU_CRIS" = "xyes") + AM_CONDITIONAL(HAVE_CPU_CRISV32, test "x$HAVE_CPU_CRISV32" = "xyes") + + AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu", [the host CPU]) +]) + +dnl check if unaligned memory access works correctly +AC_DEFUN([AG_GST_UNALIGNED_ACCESS], [ + AC_MSG_CHECKING([if unaligned memory access works correctly]) + if test x"$as_cv_unaligned_access" = x ; then + case $host in + alpha*|arm*|hp*|mips*|sh*|sparc*|ia64*) + _AS_ECHO_N([(blacklisted) ]) + as_cv_unaligned_access=no + ;; + i?86*|x86_64*|amd64*|powerpc*|m68k*|cris*) + _AS_ECHO_N([(whitelisted) ]) + as_cv_unaligned_access=yes + ;; + esac + else + _AS_ECHO_N([(cached) ]) + fi + if test x"$as_cv_unaligned_access" = x ; then + AC_TRY_RUN([ +int main(int argc, char **argv) +{ + char array[] = "ABCDEFGH"; + unsigned int iarray[2]; + memcpy(iarray,array,8); +#define GET(x) (*(unsigned int *)((char *)iarray + (x))) + if(GET(0) != 0x41424344 && GET(0) != 0x44434241) return 1; + if(GET(1) != 0x42434445 && GET(1) != 0x45444342) return 1; + if(GET(2) != 0x43444546 && GET(2) != 0x46454443) return 1; + if(GET(3) != 0x44454647 && GET(3) != 0x47464544) return 1; + return 0; +} + ], as_cv_unaligned_access="yes", as_cv_unaligned_access="no") + fi + AC_MSG_RESULT($as_cv_unaligned_access) + if test "$as_cv_unaligned_access" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_UNALIGNED_ACCESS, 1, + [defined if unaligned memory access works correctly]) + fi +]) diff --git a/common/m4/gst-args.m4 b/common/m4/gst-args.m4 new file mode 100644 index 0000000..030e7ac --- /dev/null +++ b/common/m4/gst-args.m4 @@ -0,0 +1,327 @@ +dnl configure-time options shared among gstreamer modules + +dnl AG_GST_ARG_DEBUG +dnl AG_GST_ARG_PROFILING +dnl AG_GST_ARG_VALGRIND +dnl AG_GST_ARG_GCOV + +dnl AG_GST_ARG_EXAMPLES + +dnl AG_GST_ARG_WITH_PKG_CONFIG_PATH +dnl AG_GST_ARG_WITH_PACKAGE_NAME +dnl AG_GST_ARG_WITH_PACKAGE_ORIGIN + +dnl AG_GST_ARG_WITH_PLUGINS +dnl AG_GST_CHECK_PLUGIN +dnl AG_GST_DISABLE_PLUGIN + +dnl AG_GST_ARG_ENABLE_EXTERNAL +dnl AG_GST_ARG_ENABLE_EXPERIMENTAL +dnl AG_GST_ARG_ENABLE_BROKEN + +AC_DEFUN([AG_GST_ARG_DEBUG], +[ + dnl debugging stuff + AC_ARG_ENABLE(debug, + AC_HELP_STRING([--disable-debug],[disable addition of -g debugging info]), + [ + case "${enableval}" in + yes) USE_DEBUG=yes ;; + no) USE_DEBUG=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; + esac + ], + [USE_DEBUG=yes]) dnl Default value +]) + +AC_DEFUN([AG_GST_ARG_PROFILING], +[ + AC_ARG_ENABLE(profiling, + AC_HELP_STRING([--enable-profiling], + [adds -pg to compiler commandline, for profiling]), + [ + case "${enableval}" in + yes) USE_PROFILING=yes ;; + no) USE_PROFILING=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-profiling) ;; + esac + ], + [USE_PROFILING=no]) dnl Default value +]) + +AC_DEFUN([AG_GST_ARG_VALGRIND], +[ + dnl valgrind inclusion + AC_ARG_ENABLE(valgrind, + AC_HELP_STRING([--disable-valgrind],[disable run-time valgrind detection]), + [ + case "${enableval}" in + yes) USE_VALGRIND="$USE_DEBUG" ;; + no) USE_VALGRIND=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind) ;; + esac + ], + [USE_VALGRIND="$USE_DEBUG"]) dnl Default value + VALGRIND_REQ="3.0" + if test "x$USE_VALGRIND" = xyes; then + PKG_CHECK_MODULES(VALGRIND, valgrind >= $VALGRIND_REQ, + USE_VALGRIND="yes", + USE_VALGRIND="no") + fi + if test "x$USE_VALGRIND" = xyes; then + AC_DEFINE(HAVE_VALGRIND, 1, [Define if valgrind should be used]) + AC_MSG_NOTICE(Using extra code paths for valgrind) + fi +]) + +AC_DEFUN([AG_GST_ARG_GCOV], +[ + AC_ARG_ENABLE(gcov, + AC_HELP_STRING([--enable-gcov], + [compile with coverage profiling instrumentation (gcc only)]), + enable_gcov=$enableval, + enable_gcov=no) + if test x$enable_gcov = xyes ; then + if test "x$GCC" != "xyes" + then + AC_MSG_ERROR([gcov only works if gcc is used]) + fi + + AS_COMPILER_FLAG(["-fprofile-arcs"], + [GCOV_CFLAGS="$GCOV_CFLAGS -fprofile-arcs"], + true) + AS_COMPILER_FLAG(["-ftest-coverage"], + [GCOV_CFLAGS="$GCOV_CFLAGS -ftest-coverage"], + true) + dnl remove any -O flags - FIXME: is this needed ? + GCOV_CFLAGS=`echo "$GCOV_CFLAGS" | sed -e 's/-O[[0-9]]*//g'` + dnl libtool 1.5.22 and lower strip -fprofile-arcs from the flags + dnl passed to the linker, which is a bug; -fprofile-arcs implicitly + dnl links in -lgcov, so we do it explicitly here for the same effect + GCOV_LIBS=-lgcov + AC_SUBST(GCOV_CFLAGS) + AC_SUBST(GCOV_LIBS) + GCOV=`echo $CC | sed s/gcc/gcov/g` + AC_SUBST(GCOV) + + GST_GCOV_ENABLED=yes + AC_DEFINE_UNQUOTED(GST_GCOV_ENABLED, 1, + [Defined if gcov is enabled to force a rebuild due to config.h changing]) + dnl if gcov is used, we do not want default -O2 CFLAGS + if test "x$GST_GCOV_ENABLED" = "xyes" + then + CFLAGS="-O0" + AC_SUBST(CFLAGS) + CXXFLAGS="-O0" + AC_SUBST(CXXFLAGS) + FFLAGS="-O0" + AC_SUBST(FFLAGS) + CCASFLAGS="-O0" + AC_SUBST(CCASFLAGS) + AC_MSG_NOTICE([gcov enabled, setting CFLAGS and friends to $CFLAGS]) + fi + fi + AM_CONDITIONAL(GST_GCOV_ENABLED, test x$enable_gcov = xyes) +]) + +AC_DEFUN([AG_GST_ARG_EXAMPLES], +[ + AC_ARG_ENABLE(examples, + AC_HELP_STRING([--disable-examples], [disable building examples]), + [ + case "${enableval}" in + yes) BUILD_EXAMPLES=yes ;; + no) BUILD_EXAMPLES=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-examples) ;; + esac + ], + [BUILD_EXAMPLES=yes]) dnl Default value + AM_CONDITIONAL(BUILD_EXAMPLES, test "x$BUILD_EXAMPLES" = "xyes") +]) + +AC_DEFUN([AG_GST_ARG_WITH_PKG_CONFIG_PATH], +[ + dnl possibly modify pkg-config path + AC_ARG_WITH(pkg-config-path, + AC_HELP_STRING([--with-pkg-config-path], + [colon-separated list of pkg-config(1) dirs]), + [ + export PKG_CONFIG_PATH=${withval} + AC_MSG_NOTICE(Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH) + ]) +]) + + +dnl This macro requires that GST_GIT or GST_CVS is set to yes or no (release) +AC_DEFUN([AG_GST_ARG_WITH_PACKAGE_NAME], +[ + dnl package name in plugins + AC_ARG_WITH(package-name, + AC_HELP_STRING([--with-package-name], + [specify package name to use in plugins]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;; + *) GST_PACKAGE_NAME="${withval}" ;; + esac + ], + [ + P=$1 + if test "x$P" = "x" + then + P=$PACKAGE_NAME + fi + + if test "x$PACKAGE_VERSION_NANO" = "x0" + then + GST_PACKAGE_NAME="$P source release" + else + if test "x$PACKAGE_VERSION_NANO" = "x1" + then + GST_PACKAGE_NAME="$P git" + else + GST_PACKAGE_NAME="$P prerelease" + fi + fi + ] + ) + AC_MSG_NOTICE(Using $GST_PACKAGE_NAME as package name) + AC_DEFINE_UNQUOTED(GST_PACKAGE_NAME, "$GST_PACKAGE_NAME", + [package name in plugins]) + AC_SUBST(GST_PACKAGE_NAME) +]) + +AC_DEFUN([AG_GST_ARG_WITH_PACKAGE_ORIGIN], +[ + dnl package origin URL + AC_ARG_WITH(package-origin, + AC_HELP_STRING([--with-package-origin], + [specify package origin URL to use in plugins]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-package-origin) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-package-origin) ;; + *) GST_PACKAGE_ORIGIN="${withval}" ;; + esac + ], + [GST_PACKAGE_ORIGIN="[Unknown package origin]"] dnl Default value + ) + AC_MSG_NOTICE(Using $GST_PACKAGE_ORIGIN as package origin) + AC_DEFINE_UNQUOTED(GST_PACKAGE_ORIGIN, "$GST_PACKAGE_ORIGIN", + [package origin]) + AC_SUBST(GST_PACKAGE_ORIGIN) +]) + +dnl sets WITH_PLUGINS to the list of plug-ins given as an argument +dnl also clears GST_PLUGINS_ALL and GST_PLUGINS_SELECTED +AC_DEFUN([AG_GST_ARG_WITH_PLUGINS], +[ + AC_ARG_WITH(plugins, + AC_HELP_STRING([--with-plugins], + [comma-separated list of dependencyless plug-ins to compile]), + [WITH_PLUGINS=$withval], + [WITH_PLUGINS=]) + + GST_PLUGINS_ALL="" + GST_PLUGINS_SELECTED="" + + AC_SUBST(GST_PLUGINS_ALL) + AC_SUBST(GST_PLUGINS_SELECTED) +]) + +dnl AG_GST_CHECK_PLUGIN(PLUGIN-NAME) +dnl +dnl This macro adds the plug-in to GST_PLUGINS_ALL. Then it +dnl checks if WITH_PLUGINS is empty or the plugin is present in WITH_PLUGINS, +dnl and if so adds it to GST_PLUGINS_SELECTED. Then it checks if the plugin +dnl is present in WITHOUT_PLUGINS (ie. was disabled specifically) and if so +dnl removes it from GST_PLUGINS_SELECTED. +dnl +dnl The macro will call AM_CONDITIONAL(USE_PLUGIN_, ...) to allow +dnl control of what is built in Makefile.ams. +AC_DEFUN([AG_GST_CHECK_PLUGIN], +[ + GST_PLUGINS_ALL="$GST_PLUGINS_ALL [$1]" + + define([pname_def],translit([$1], -a-z, _a-z)) + + AC_ARG_ENABLE([$1], + AC_HELP_STRING([--disable-[$1]], [disable dependency-less $1 plugin]), + [ + case "${enableval}" in + yes) [gst_use_]pname_def=yes ;; + no) [gst_use_]pname_def=no ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-$1]) ;; + esac + ], + [[gst_use_]pname_def=yes]) dnl Default value + + if test x$[gst_use_]pname_def = xno; then + AC_MSG_NOTICE(disabling dependency-less plugin $1) + WITHOUT_PLUGINS="$WITHOUT_PLUGINS [$1]" + fi + undefine([pname_def]) + + if [[ -z "$WITH_PLUGINS" ]] || echo " [$WITH_PLUGINS] " | tr , ' ' | grep -i " [$1] " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED [$1]" + fi + if echo " [$WITHOUT_PLUGINS] " | tr , ' ' | grep -i " [$1] " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ [$1] / /'` + fi + AM_CONDITIONAL([USE_PLUGIN_]translit([$1], a-z, A-Z), echo " $GST_PLUGINS_SELECTED " | grep -i " [$1] " > /dev/null) +]) + +dnl AG_GST_DISABLE_PLUGIN(PLUGIN-NAME) +dnl +dnl This macro disables the plug-in by removing it from +dnl GST_PLUGINS_SELECTED. +AC_DEFUN([AG_GST_DISABLE_PLUGIN], +[ + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ [$1] / /'` + AM_CONDITIONAL([USE_PLUGIN_]translit([$1], a-z, A-Z), false) +]) + +AC_DEFUN([AG_GST_ARG_ENABLE_EXTERNAL], +[ + AG_GST_CHECK_FEATURE(EXTERNAL, [building of plug-ins with external deps],, + HAVE_EXTERNAL=yes, enabled, + [ + AC_MSG_NOTICE(building external plug-ins) + BUILD_EXTERNAL="yes" + ],[ + AC_MSG_WARN(all plug-ins with external dependencies will not be built) + BUILD_EXTERNAL="no" + ]) + # make BUILD_EXTERNAL available to Makefile.am + AM_CONDITIONAL(BUILD_EXTERNAL, test "x$BUILD_EXTERNAL" = "xyes") +]) + +dnl experimental plug-ins; stuff that hasn't had the dust settle yet +dnl read 'builds, but might not work' +AC_DEFUN([AG_GST_ARG_ENABLE_EXPERIMENTAL], +[ + AG_GST_CHECK_FEATURE(EXPERIMENTAL, [building of experimental plug-ins],, + HAVE_EXPERIMENTAL=yes, disabled, + [ + AC_MSG_WARN(building experimental plug-ins) + BUILD_EXPERIMENTAL="yes" + ],[ + AC_MSG_NOTICE(not building experimental plug-ins) + BUILD_EXPERIMENTAL="no" + ]) + # make BUILD_EXPERIMENTAL available to Makefile.am + AM_CONDITIONAL(BUILD_EXPERIMENTAL, test "x$BUILD_EXPERIMENTAL" = "xyes") +]) + +dnl broken plug-ins; stuff that doesn't seem to build at the moment +AC_DEFUN([AG_GST_ARG_ENABLE_BROKEN], +[ + AG_GST_CHECK_FEATURE(BROKEN, [building of broken plug-ins],, + HAVE_BROKEN=yes, disabled, + [ + AC_MSG_WARN([building broken plug-ins -- no bug reports on these, only patches ...]) + ],[ + AC_MSG_NOTICE([not building broken plug-ins]) + ]) +]) diff --git a/common/m4/gst-check.m4 b/common/m4/gst-check.m4 new file mode 100644 index 0000000..3fd3acf --- /dev/null +++ b/common/m4/gst-check.m4 @@ -0,0 +1,262 @@ +dnl pkg-config-based checks for GStreamer modules and dependency modules + +dnl generic: +dnl AG_GST_PKG_CHECK_MODULES([PREFIX], [WHICH], [REQUIRED]) +dnl sets HAVE_[$PREFIX], [$PREFIX]_* +dnl AG_GST_CHECK_MODULES([PREFIX], [MODULE], [MINVER], [NAME], [REQUIRED]) +dnl sets HAVE_[$PREFIX], [$PREFIX]_* + +dnl specific: +dnl AG_GST_CHECK_GST([MAJMIN], [MINVER], [REQUIRED]) +dnl also sets/ACSUBSTs GST_TOOLS_DIR and GST_PLUGINS_DIR +dnl AG_GST_CHECK_GST_BASE([MAJMIN], [MINVER], [REQUIRED]) +dnl AG_GST_CHECK_GST_GDP([MAJMIN], [MINVER], [REQUIRED]) +dnl AG_GST_CHECK_GST_CONTROLLER([MAJMIN], [MINVER], [REQUIRED]) +dnl AG_GST_CHECK_GST_CHECK([MAJMIN], [MINVER], [REQUIRED]) +dnl AG_GST_CHECK_GST_PLUGINS_BASE([MAJMIN], [MINVER], [REQUIRED]) +dnl also sets/ACSUBSTs GSTPB_PLUGINS_DIR + +AC_DEFUN([AG_GST_PKG_CHECK_MODULES], +[ + which="[$2]" + dnl not required by default, since we use this mostly for plugin deps + required=ifelse([$3], , "no", [$3]) + + PKG_CHECK_MODULES([$1], $which, + [ + HAVE_[$1]="yes" + ], + [ + HAVE_[$1]="no" + if test "x$required" = "xyes"; then + AC_MSG_ERROR($[$1]_PKG_ERRORS) + else + AC_MSG_NOTICE($[$1]_PKG_ERRORS) + fi + ]) + + dnl AC_SUBST of CFLAGS and LIBS was not done before automake 1.7 + dnl It gets done automatically in automake >= 1.7, which we now require +])) + +AC_DEFUN([AG_GST_CHECK_MODULES], +[ + module=[$2] + minver=[$3] + name="[$4]" + required=ifelse([$5], , "yes", [$5]) dnl required by default + + PKG_CHECK_MODULES([$1], $module >= $minver, + [ + HAVE_[$1]="yes" + ], + [ + HAVE_[$1]="no" + AC_MSG_NOTICE($[$1]_PKG_ERRORS) + if test "x$required" = "xyes"; then + AC_MSG_ERROR([no $module >= $minver ($name) found]) + else + AC_MSG_NOTICE([no $module >= $minver ($name) found]) + fi + ]) + + dnl AC_SUBST of CFLAGS and LIBS was not done before automake 1.7 + dnl It gets done automatically in automake >= 1.7, which we now require +])) + +AC_DEFUN([AG_GST_CHECK_GST], +[ + AG_GST_CHECK_MODULES(GST, gstreamer-[$1], [$2], [GStreamer], [$3]) + dnl allow setting before calling this macro to override + if test -z $GST_TOOLS_DIR; then + GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-[$1]` + if test -z $GST_TOOLS_DIR; then + AC_MSG_ERROR( + [no tools dir set in GStreamer pkg-config file, core upgrade needed.]) + fi + fi + AC_MSG_NOTICE([using GStreamer tools in $GST_TOOLS_DIR]) + AC_SUBST(GST_TOOLS_DIR) + + dnl check for where core plug-ins got installed + dnl this is used for unit tests + dnl allow setting before calling this macro to override + if test -z $GST_PLUGINS_DIR; then + GST_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-[$1]` + if test -z $GST_PLUGINS_DIR; then + AC_MSG_ERROR( + [no pluginsdir set in GStreamer pkg-config file, core upgrade needed.]) + fi + fi + AC_MSG_NOTICE([using GStreamer plug-ins in $GST_PLUGINS_DIR]) + AC_SUBST(GST_PLUGINS_DIR) +]) + +AC_DEFUN([AG_GST_CHECK_GST_BASE], +[ + AG_GST_CHECK_MODULES(GST_BASE, gstreamer-base-[$1], [$2], + [GStreamer Base Libraries], [$3]) +]) + +AC_DEFUN([AG_GST_CHECK_GST_GDP], +[ + AG_GST_CHECK_MODULES(GST_GDP, gstreamer-dataprotocol-[$1], [$2], + [GStreamer Data Protocol Library], [$3]) +]) + +AC_DEFUN([AG_GST_CHECK_GST_CONTROLLER], +[ + AG_GST_CHECK_MODULES(GST_CONTROLLER, gstreamer-controller-[$1], [$2], + [GStreamer Controller Library], [$3]) +]) + +AC_DEFUN([AG_GST_CHECK_GST_CHECK], +[ + AG_GST_CHECK_MODULES(GST_CHECK, gstreamer-check-[$1], [$2], + [GStreamer Check unittest Library], [$3]) +]) + +dnl =========================================================================== +dnl AG_GST_CHECK_GST_PLUGINS_BASE([GST-MAJORMINOR], [MIN-VERSION], [REQUIRED]) +dnl +dnl Sets GST_PLUGINS_BASE_CFLAGS and GST_PLUGINS_BASE_LIBS. +dnl +dnl Also sets GSTPB_PLUGINS_DIR (and for consistency also GST_PLUGINS_BASE_DIR) +dnl for use in Makefile.am. This is only really needed/useful in uninstalled +dnl setups, since in an installed setup all plugins will be found in +dnl GST_PLUGINS_DIR anyway. +dnl =========================================================================== +AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_BASE], +[ + AG_GST_CHECK_MODULES(GST_PLUGINS_BASE, gstreamer-plugins-base-[$1], [$2], + [GStreamer Base Plugins], [$3]) + + if test "x$HAVE_GST_PLUGINS_BASE" = "xyes"; then + dnl check for where base plugins got installed + dnl this is used for unit tests + dnl allow setting before calling this macro to override + if test -z $GSTPB_PLUGINS_DIR; then + GSTPB_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-base-[$1]` + if test -z $GSTPB_PLUGINS_DIR; then + AC_MSG_ERROR( + [no pluginsdir set in GStreamer Base Plugins pkg-config file]) + fi + fi + AC_MSG_NOTICE([using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR]) + GST_PLUGINS_BASE_DIR="$GSTPB_PLUGINS_DIR/gst:$GSTPB_PLUGINS_DIR/sys:$GSTPB_PLUGINS_DIR/ext" + AC_SUBST(GST_PLUGINS_BASE_DIR) + AC_SUBST(GSTPB_PLUGINS_DIR) + fi +]) + +dnl =========================================================================== +dnl AG_GST_CHECK_GST_PLUGINS_GOOD([GST-MAJORMINOR], [MIN-VERSION]) +dnl +dnl Will set GST_PLUGINS_GOOD_DIR for use in Makefile.am. Note that this will +dnl only be set in an uninstalled setup, since -good ships no .pc file and in +dnl an installed setup all plugins will be found in GST_PLUGINS_DIR anyway. +dnl =========================================================================== +AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_GOOD], +[ + AG_GST_CHECK_MODULES(GST_PLUGINS_GOOD, gstreamer-plugins-good-[$1], [$2], + [GStreamer Good Plugins], [no]) + + if test "x$HAVE_GST_PLUGINS_GOOD" = "xyes"; then + dnl check for where good plugins got installed + dnl this is used for unit tests + dnl allow setting before calling this macro to override + if test -z $GST_PLUGINS_GOOD_DIR; then + GST_PLUGINS_GOOD_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-good-[$1]` + if test -z $GST_PLUGINS_GOOD_DIR; then + AC_MSG_ERROR([no pluginsdir set in GStreamer Good Plugins pkg-config file]) + fi + fi + AC_MSG_NOTICE([using GStreamer Good Plugins in $GST_PLUGINS_GOOD_DIR]) + GST_PLUGINS_GOOD_DIR="$GST_PLUGINS_GOOD_DIR/gst:$GST_PLUGINS_GOOD_DIR/sys:$GST_PLUGINS_GOOD_DIR/ext" + AC_SUBST(GST_PLUGINS_GOOD_DIR) + fi +]) + +dnl =========================================================================== +dnl AG_GST_CHECK_GST_PLUGINS_UGLY([GST-MAJORMINOR], [MIN-VERSION]) +dnl +dnl Will set GST_PLUGINS_UGLY_DIR for use in Makefile.am. Note that this will +dnl only be set in an uninstalled setup, since -bad ships no .pc file and in +dnl an installed setup all plugins will be found in GST_PLUGINS_DIR anyway. +dnl =========================================================================== +AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_UGLY], +[ + AG_GST_CHECK_MODULES(GST_PLUGINS_UGLY, gstreamer-plugins-ugly-[$1], [$2], + [GStreamer Ugly Plugins], [no]) + + if test "x$HAVE_GST_PLUGINS_UGLY" = "xyes"; then + dnl check for where ugly plugins got installed + dnl this is used for unit tests + dnl allow setting before calling this macro to override + if test -z $GST_PLUGINS_UGLY_DIR; then + GST_PLUGINS_UGLY_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-ugly-[$1]` + if test -z $GST_PLUGINS_UGLY_DIR; then + AC_MSG_ERROR([no pluginsdir set in GStreamer Ugly Plugins pkg-config file]) + fi + fi + AC_MSG_NOTICE([using GStreamer Ugly Plugins in $GST_PLUGINS_UGLY_DIR]) + GST_PLUGINS_UGLY_DIR="$GST_PLUGINS_UGLY_DIR/gst:$GST_PLUGINS_UGLY_DIR/sys:$GST_PLUGINS_UGLY_DIR/ext" + AC_SUBST(GST_PLUGINS_UGLY_DIR) + fi +]) + +dnl =========================================================================== +dnl AG_GST_CHECK_GST_PLUGINS_BAD([GST-MAJORMINOR], [MIN-VERSION]) +dnl +dnl Will set GST_PLUGINS_BAD_DIR for use in Makefile.am. Note that this will +dnl only be set in an uninstalled setup, since -ugly ships no .pc file and in +dnl an installed setup all plugins will be found in GST_PLUGINS_DIR anyway. +dnl =========================================================================== +AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_BAD], +[ + AG_GST_CHECK_MODULES(GST_PLUGINS_BAD, gstreamer-plugins-bad-[$1], [$2], + [GStreamer Bad Plugins], [no]) + + if test "x$HAVE_GST_PLUGINS_BAD" = "xyes"; then + dnl check for where bad plugins got installed + dnl this is used for unit tests + dnl allow setting before calling this macro to override + if test -z $GST_PLUGINS_BAD_DIR; then + GST_PLUGINS_BAD_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-bad-[$1]` + if test -z $GST_PLUGINS_BAD_DIR; then + AC_MSG_ERROR([no pluginsdir set in GStreamer Bad Plugins pkg-config file]) + fi + fi + AC_MSG_NOTICE([using GStreamer Bad Plugins in $GST_PLUGINS_BAD_DIR]) + GST_PLUGINS_BAD_DIR="$GST_PLUGINS_BAD_DIR/gst:$GST_PLUGINS_BAD_DIR/sys:$GST_PLUGINS_BAD_DIR/ext" + AC_SUBST(GST_PLUGINS_BAD_DIR) + fi +]) + +dnl =========================================================================== +dnl AG_GST_CHECK_GST_PLUGINS_FFMPEG([GST-MAJORMINOR], [MIN-VERSION]) +dnl +dnl Will set GST_PLUGINS_FFMPEG_DIR for use in Makefile.am. Note that this will +dnl only be set in an uninstalled setup, since -ffmpeg ships no .pc file and in +dnl an installed setup all plugins will be found in GST_PLUGINS_DIR anyway. +dnl =========================================================================== +AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_FFMPEG], +[ + AG_GST_CHECK_MODULES(GST_PLUGINS_FFMPEG, gstreamer-plugins-ffmpeg-[$1], [$2], + [GStreamer FFmpeg Plugins], [no]) + + if test "x$HAVE_GST_PLUGINS_FFMPEG" = "xyes"; then + dnl check for where ffmpeg plugins got installed + dnl this is used for unit tests + dnl allow setting before calling this macro to override + if test -z $GST_PLUGINS_FFMPEG_DIR; then + GST_PLUGINS_FFMPEG_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-ffmpeg-[$1]` + if test -z $GST_PLUGINS_FFMPEG_DIR; then + AC_MSG_ERROR([no pluginsdir set in GStreamer FFmpeg Plugins pkg-config file]) + fi + fi + GST_PLUGINS_FFMPEG_DIR="$GST_PLUGINS_FFMPEG_DIR/ext/ffmpeg" + AC_MSG_NOTICE([using GStreamer FFmpeg Plugins in $GST_PLUGINS_FFMPEG_DIR]) + AC_SUBST(GST_PLUGINS_FFMPEG_DIR) + fi +]) diff --git a/common/m4/gst-debuginfo.m4 b/common/m4/gst-debuginfo.m4 new file mode 100644 index 0000000..b48854d --- /dev/null +++ b/common/m4/gst-debuginfo.m4 @@ -0,0 +1,46 @@ +AC_DEFUN([AG_GST_DEBUGINFO], [ +AC_ARG_ENABLE(debug, +AC_HELP_STRING([--disable-debug],[disable addition of -g debugging info]), +[case "${enableval}" in + yes) USE_DEBUG=yes ;; + no) USE_DEBUG=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; +esac], +[USE_DEBUG=yes]) dnl Default value + +AC_ARG_ENABLE(DEBUG, +AC_HELP_STRING([--disable-DEBUG],[disables compilation of debugging messages]), +[case "${enableval}" in + yes) ENABLE_DEBUG=yes ;; + no) ENABLE_DEBUG=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-DEBUG) ;; +esac], +[ENABLE_DEBUG=yes]) dnl Default value +if test x$ENABLE_DEBUG = xyes; then + AC_DEFINE(GST_DEBUG_ENABLED, 1, [Define if DEBUG statements should be compiled in]) +fi + +AC_ARG_ENABLE(INFO, +AC_HELP_STRING([--disable-INFO],[disables compilation of informational messages]), +[case "${enableval}" in + yes) ENABLE_INFO=yes ;; + no) ENABLE_INFO=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-INFO) ;; +esac], +[ENABLE_INFO=yes]) dnl Default value +if test x$ENABLE_INFO = xyes; then + AC_DEFINE(GST_INFO_ENABLED, 1, [Define if INFO statements should be compiled in]) +fi + +AC_ARG_ENABLE(debug-color, +AC_HELP_STRING([--disable-debug-color],[disables color output of DEBUG and INFO output]), +[case "${enableval}" in + yes) ENABLE_DEBUG_COLOR=yes ;; + no) ENABLE_DEBUG_COLOR=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug-color) ;; +esac], +[ENABLE_DEBUG_COLOR=yes]) dnl Default value +if test "x$ENABLE_DEBUG_COLOR" = xyes; then + AC_DEFINE(GST_DEBUG_COLOR, 1, [Define if debugging messages should be colorized]) +fi +]) diff --git a/common/m4/gst-default.m4 b/common/m4/gst-default.m4 new file mode 100644 index 0000000..8de9756 --- /dev/null +++ b/common/m4/gst-default.m4 @@ -0,0 +1,120 @@ +dnl default elements used for tests and such + +dnl AG_GST_DEFAULT_ELEMENTS + +AC_DEFUN([AG_GST_DEFAULT_ELEMENTS], +[ + dnl decide on default elements + dnl FIXME: describe where exactly this gets used + dnl FIXME: decide if it's a problem that this could point to sinks from + dnl depending plugin modules + dnl FIXME: when can we just use autoaudiosrc and autovideosrc? + DEFAULT_AUDIOSINK="autoaudiosink" + DEFAULT_VIDEOSINK="autovideosink" + DEFAULT_AUDIOSRC="alsasrc" + DEFAULT_VIDEOSRC="v4l2src" + DEFAULT_VISUALIZER="goom" + case "$host" in + *-sun-* | *pc-solaris* ) + DEFAULT_AUDIOSRC="sunaudiosrc" + ;; + *-darwin* ) + DEFAULT_AUDIOSRC="osxaudiosrc" + ;; + esac + + dnl Default audio sink + AC_ARG_WITH(default-audiosink, + AC_HELP_STRING([--with-default-audiosink], [specify default audio sink]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-default-audiosink) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-default-audiosink) ;; + *) DEFAULT_AUDIOSINK="${withval}" ;; + esac + ], + [ + DEFAULT_AUDIOSINK="$DEFAULT_AUDIOSINK" + ] dnl Default value as determined above + ) + AC_MSG_NOTICE(Using $DEFAULT_AUDIOSINK as default audio sink) + AC_SUBST(DEFAULT_AUDIOSINK) + AC_DEFINE_UNQUOTED(DEFAULT_AUDIOSINK, "$DEFAULT_AUDIOSINK", + [Default audio sink]) + + dnl Default audio source + AC_ARG_WITH(default-audiosrc, + AC_HELP_STRING([--with-default-audiosrc], [specify default audio source]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-default-audiosrc) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-default-audiosrc) ;; + *) DEFAULT_AUDIOSRC="${withval}" ;; + esac + ], + [ + DEFAULT_AUDIOSRC="$DEFAULT_AUDIOSRC" + ] dnl Default value as determined above + ) + AC_MSG_NOTICE(Using $DEFAULT_AUDIOSRC as default audio source) + AC_SUBST(DEFAULT_AUDIOSRC) + AC_DEFINE_UNQUOTED(DEFAULT_AUDIOSRC, "$DEFAULT_AUDIOSRC", + [Default audio source]) + + dnl Default video sink + AC_ARG_WITH(default-videosink, + AC_HELP_STRING([--with-default-videosink], [specify default video sink]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-default-videosink) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-default-videosink) ;; + *) DEFAULT_VIDEOSINK="${withval}" ;; + esac + ], + [ + DEFAULT_VIDEOSINK="$DEFAULT_VIDEOSINK" + ] dnl Default value as determined above + ) + AC_MSG_NOTICE(Using $DEFAULT_VIDEOSINK as default video sink) + AC_SUBST(DEFAULT_VIDEOSINK) + AC_DEFINE_UNQUOTED(DEFAULT_VIDEOSINK, "$DEFAULT_VIDEOSINK", + [Default video sink]) + + dnl Default video source + AC_ARG_WITH(default-videosrc, + AC_HELP_STRING([--with-default-videosrc], [specify default video source]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-default-videosrc) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-default-videosrc) ;; + *) DEFAULT_VIDEOSRC="${withval}" ;; + esac + ], + [ + DEFAULT_VIDEOSRC="$DEFAULT_VIDEOSRC" + ] dnl Default value as determined above + ) + AC_MSG_NOTICE(Using $DEFAULT_VIDEOSRC as default video source) + AC_SUBST(DEFAULT_VIDEOSRC) + AC_DEFINE_UNQUOTED(DEFAULT_VIDEOSRC, "$DEFAULT_VIDEOSRC", + [Default video source]) + + dnl Default visualizer + AC_ARG_WITH(default-visualizer, + AC_HELP_STRING([--with-default-visualizer], [specify default visualizer]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-default-visualizer) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-default-visualizer) ;; + *) DEFAULT_VISUALIZER="${withval}" ;; + esac + ], + [ + DEFAULT_VISUALIZER="$DEFAULT_VISUALIZER" + ] dnl Default value as determined above + ) + AC_MSG_NOTICE(Using $DEFAULT_VISUALIZER as default visualizer) + AC_SUBST(DEFAULT_VISUALIZER) + AC_DEFINE_UNQUOTED(DEFAULT_VISUALIZER, "$DEFAULT_VISUALIZER", + [Default visualizer]) +]) diff --git a/common/m4/gst-doc.m4 b/common/m4/gst-doc.m4 new file mode 100644 index 0000000..6521097 --- /dev/null +++ b/common/m4/gst-doc.m4 @@ -0,0 +1,148 @@ +AC_DEFUN([AG_GST_DOCBOOK_CHECK], +[ + dnl choose a location to install docbook docs in + if test "x$PACKAGE_TARNAME" = "x" + then + AC_MSG_ERROR([Internal error - PACKAGE_TARNAME not set]) + fi + docdir="\$(datadir)/doc/$PACKAGE_TARNAME-$GST_MAJORMINOR" + + dnl enable/disable docbook documentation building + AC_ARG_ENABLE(docbook, + AC_HELP_STRING([--enable-docbook], + [use docbook to build documentation [default=no]]),, + enable_docbook=no) + + have_docbook=no + + if test x$enable_docbook = xyes; then + dnl check if we actually have everything we need + + dnl check for docbook tools + AC_CHECK_PROG(HAVE_DOCBOOK2PS, docbook2ps, yes, no) + AC_CHECK_PROG(HAVE_DOCBOOK2HTML, docbook2html, yes, no) + AC_CHECK_PROG(HAVE_JADETEX, jadetex, yes, no) + AC_CHECK_PROG(HAVE_PS2PDF, ps2pdf, yes, no) + + # -V option appeared in 0.6.10 + docbook2html_min_version=0.6.10 + if test "x$HAVE_DOCBOOK2HTML" != "xno"; then + docbook2html_version=`docbook2html --version` + AC_MSG_CHECKING([docbook2html version ($docbook2html_version) >= $docbook2html_min_version]) + if perl -w < \$min_version_major) || + ((\$docbook2html_version_major == \$min_version_major) && + (\$docbook2html_version_minor >= \$min_version_minor)) || + ((\$docbook2html_version_major == \$min_version_major) && + (\$docbook2html_version_minor >= \$min_version_minor) && + (\$docbook2html_version_micro >= \$min_version_micro))) + ? 0 : 1); +EOF + then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + HAVE_DOCBOOK2HTML=no + fi + fi + + dnl check if we can process docbook stuff + AS_DOCBOOK(have_docbook=yes, have_docbook=no) + + dnl check for extra tools + AC_CHECK_PROG(HAVE_DVIPS, dvips, yes, no) + AC_CHECK_PROG(HAVE_XMLLINT, xmllint, yes, no) + + dnl check for image conversion tools + AC_CHECK_PROG(HAVE_FIG2DEV, fig2dev, yes, no) + if test "x$HAVE_FIG2DEV" = "xno" ; then + AC_MSG_WARN([Did not find fig2dev (from xfig), images will not be generated.]) + fi + + dnl The following is a hack: if fig2dev doesn't display an error message + dnl for the desired type, we assume it supports it. + HAVE_FIG2DEV_EPS=no + if test "x$HAVE_FIG2DEV" = "xyes" ; then + fig2dev_quiet=`fig2dev -L eps &1 >/dev/null` + if test "x$fig2dev_quiet" = "x" ; then + HAVE_FIG2DEV_EPS=yes + fi + fi + HAVE_FIG2DEV_PNG=no + if test "x$HAVE_FIG2DEV" = "xyes" ; then + fig2dev_quiet=`fig2dev -L png &1 >/dev/null` + if test "x$fig2dev_quiet" = "x" ; then + HAVE_FIG2DEV_PNG=yes + fi + fi + HAVE_FIG2DEV_PDF=no + if test "x$HAVE_FIG2DEV" = "xyes" ; then + fig2dev_quiet=`fig2dev -L pdf &1 >/dev/null` + if test "x$fig2dev_quiet" = "x" ; then + HAVE_FIG2DEV_PDF=yes + fi + fi + + AC_CHECK_PROG(HAVE_PNGTOPNM, pngtopnm, yes, no) + AC_CHECK_PROG(HAVE_PNMTOPS, pnmtops, yes, no) + AC_CHECK_PROG(HAVE_EPSTOPDF, epstopdf, yes, no) + + dnl check if we can generate HTML + if test "x$HAVE_DOCBOOK2HTML" = "xyes" && \ + test "x$enable_docbook" = "xyes" && \ + test "x$HAVE_XMLLINT" = "xyes" && \ + test "x$HAVE_FIG2DEV_PNG" = "xyes"; then + DOC_HTML=yes + AC_MSG_NOTICE(Will output HTML documentation) + else + DOC_HTML=no + AC_MSG_NOTICE(Will not output HTML documentation) + fi + + dnl check if we can generate PS + if test "x$HAVE_DOCBOOK2PS" = "xyes" && \ + test "x$enable_docbook" = "xyes" && \ + test "x$HAVE_XMLLINT" = "xyes" && \ + test "x$HAVE_JADETEX" = "xyes" && \ + test "x$HAVE_FIG2DEV_EPS" = "xyes" && \ + test "x$HAVE_DVIPS" = "xyes" && \ + test "x$HAVE_PNGTOPNM" = "xyes" && \ + test "x$HAVE_PNMTOPS" = "xyes"; then + DOC_PS=yes + AC_MSG_NOTICE(Will output PS documentation) + else + DOC_PS=no + AC_MSG_NOTICE(Will not output PS documentation) + fi + + dnl check if we can generate PDF - using only ps2pdf + if test "x$DOC_PS" = "xyes" && \ + test "x$enable_docbook" = "xyes" && \ + test "x$HAVE_XMLLINT" = "xyes" && \ + test "x$HAVE_PS2PDF" = "xyes"; then + DOC_PDF=yes + AC_MSG_NOTICE(Will output PDF documentation) + else + DOC_PDF=no + AC_MSG_NOTICE(Will not output PDF documentation) + fi + + dnl if we don't have everything, we should disable + if test "x$have_docbook" != "xyes"; then + enable_docbook=no + fi + fi + + dnl if we're going to install documentation, tell us where + if test "x$have_docbook" = "xyes"; then + AC_MSG_NOTICE(Installing documentation in $docdir) + AC_SUBST(docdir) + fi + + AM_CONDITIONAL(ENABLE_DOCBOOK, test x$enable_docbook = xyes) + AM_CONDITIONAL(DOC_HTML, test x$DOC_HTML = xyes) + AM_CONDITIONAL(DOC_PDF, test x$DOC_PDF = xyes) + AM_CONDITIONAL(DOC_PS, test x$DOC_PS = xyes) +]) diff --git a/common/m4/gst-dowhile.m4 b/common/m4/gst-dowhile.m4 new file mode 100644 index 0000000..069808d --- /dev/null +++ b/common/m4/gst-dowhile.m4 @@ -0,0 +1,24 @@ +dnl +dnl Check for working do while(0) macros. This is used by G_STMT_START +dnl and G_STMT_END in glib/gmacros.h. Without having this defined we +dnl get "ambigious if-else" compiler warnings when compling C++ code. +dnl +dnl Copied from GLib's configure.in +dnl +AC_DEFUN([AG_GST_CHECK_DOWHILE_MACROS],[ + +dnl *** check for working do while(0) macros *** +AC_CACHE_CHECK([for working do while(0) macros], _cv_g_support_dowhile_macros, [ + AC_TRY_COMPILE([],[ + #define STMT_START do + #define STMT_END while(0) + #define STMT_TEST STMT_START { i = 0; } STMT_END + int main(void) { int i = 1; STMT_TEST; return i; }], + [_cv_g_support_dowhile_macros=yes], + [_cv_g_support_dowhile_macros=no], + [_cv_g_support_dowhile_macros=yes]) +]) +if test x$_cv_g_support_dowhile_macros = xyes; then + AC_DEFINE(HAVE_DOWHILE_MACROS, 1, [define for working do while(0) macros]) +fi +]) diff --git a/common/m4/gst-error.m4 b/common/m4/gst-error.m4 new file mode 100644 index 0000000..f8f2364 --- /dev/null +++ b/common/m4/gst-error.m4 @@ -0,0 +1,213 @@ +dnl handle various error-related things + +dnl Thomas Vander Stichele +dnl Tim-Philipp Müller + +dnl Last modification: 2008-02-18 + +dnl AG_GST_SET_ERROR_CFLAGS([ADD-WERROR], [MORE_FLAGS]) +dnl AG_GST_SET_ERROR_CXXFLAGS([ADD-WERROR], [MORE_FLAGS]) +dnl AG_GST_SET_LEVEL_DEFAULT([IS-GIT-VERSION]) + + +dnl Sets WARNING_CFLAGS and ERROR_CFLAGS to something the compiler +dnl will accept and AC_SUBST them so they are available in Makefile +dnl +dnl WARNING_CFLAGS will contain flags to make the compiler emit more +dnl warnings. +dnl ERROR_CFLAGS will contain flags to make those warnings fatal, +dnl unless ADD-WERROR is set to "no" +dnl +dnl If MORE_FLAGS is set, tries to add each of the given flags +dnl to WARNING_CFLAGS if the compiler supports them. Each flag is +dnl tested separately. +dnl +dnl These flags can be overridden at make time: +dnl make ERROR_CFLAGS= +AC_DEFUN([AG_GST_SET_ERROR_CFLAGS], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AS_COMPILER_FLAG]) + + WARNING_CFLAGS="" + ERROR_CFLAGS="" + + dnl if we support -Wall, set it unconditionally + AS_COMPILER_FLAG(-Wall, + WARNING_CFLAGS="$WARNING_CFLAGS -Wall") + + dnl Warn if declarations after statements are used (C99 extension) + AS_COMPILER_FLAG(-Wdeclaration-after-statement, + WARNING_CFLAGS="$WARNING_CFLAGS -Wdeclaration-after-statement") + + dnl Warn if variable length arrays are used (C99 extension) + AS_COMPILER_FLAG(-Wvla, + WARNING_CFLAGS="$WARNING_CFLAGS -Wvla") + + dnl Warn for invalid pointer arithmetic + AS_COMPILER_FLAG(-Wpointer-arith, + WARNING_CFLAGS="$WARNING_CFLAGS -Wpointer-arith") + + dnl if asked for, add -Werror if supported + if test "x$1" != "xno" + then + AS_COMPILER_FLAG(-Werror, ERROR_CFLAGS="$ERROR_CFLAGS -Werror") + + dnl if -Werror isn't suported, try -errwarn=%all (Sun Forte case) + if test "x$ERROR_CFLAGS" = "x" + then + AS_COMPILER_FLAG([-errwarn=%all], [ + ERROR_CFLAGS="-errwarn=%all" + dnl try -errwarn=%all,no%E_EMPTY_DECLARATION, + dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH, + dnl no%E_MACRO_REDEFINED (Sun Forte case) + dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon + dnl "statement not reached" disabled because there is g_assert_not_reached () in some places + dnl "macro redefined" because of gst/gettext.h + dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'? + for f in 'no%E_EMPTY_DECLARATION' \ + 'no%E_STATEMENT_NOT_REACHED' \ + 'no%E_ARGUEMENT_MISMATCH' \ + 'no%E_MACRO_REDEFINED' \ + 'no%E_LOOP_NOT_ENTERED_AT_TOP' + do + AS_COMPILER_FLAG([-errwarn=%all,$f], [ + ERROR_CFLAGS="$ERROR_CFLAGS,$f" + ]) + done + ]) + else + dnl Add -fno-strict-aliasing for GLib versions before 2.19.8 + dnl as before G_LOCK and friends caused strict aliasing compiler + dnl warnings. + PKG_CHECK_EXISTS([glib-2.0 < 2.19.8], [ + AS_COMPILER_FLAG(-fno-strict-aliasing, + ERROR_CFLAGS="$ERROR_CFLAGS -fno-strict-aliasing") + ]) + fi + fi + + if test "x$2" != "x" + then + UNSUPPORTED="" + list="$2" + for each in $list + do + AS_COMPILER_FLAG($each, + WARNING_CFLAGS="$WARNING_CFLAGS $each", + UNSUPPORTED="$UNSUPPORTED $each") + done + if test "X$UNSUPPORTED" != X ; then + AC_MSG_NOTICE([unsupported compiler flags: $UNSUPPORTED]) + fi + fi + + AC_SUBST(WARNING_CFLAGS) + AC_SUBST(ERROR_CFLAGS) + AC_MSG_NOTICE([set WARNING_CFLAGS to $WARNING_CFLAGS]) + AC_MSG_NOTICE([set ERROR_CFLAGS to $ERROR_CFLAGS]) +]) + +dnl Sets WARNING_CXXFLAGS and ERROR_CXXFLAGS to something the compiler +dnl will accept and AC_SUBST them so they are available in Makefile +dnl +dnl WARNING_CXXFLAGS will contain flags to make the compiler emit more +dnl warnings. +dnl ERROR_CXXFLAGS will contain flags to make those warnings fatal, +dnl unless ADD-WERROR is set to "no" +dnl +dnl If MORE_FLAGS is set, tries to add each of the given flags +dnl to WARNING_CFLAGS if the compiler supports them. Each flag is +dnl tested separately. +dnl +dnl These flags can be overridden at make time: +dnl make ERROR_CXXFLAGS= +AC_DEFUN([AG_GST_SET_ERROR_CXXFLAGS], +[ + AC_REQUIRE([AC_PROG_CXX]) + AC_REQUIRE([AS_CXX_COMPILER_FLAG]) + + ERROR_CXXFLAGS="" + WARNING_CXXFLAGS="" + + dnl if we support -Wall, set it unconditionally + AS_CXX_COMPILER_FLAG(-Wall, WARNING_CXXFLAGS="$WARNING_CXXFLAGS -Wall") + + dnl if asked for, add -Werror if supported + if test "x$1" != "xno" + then + AS_CXX_COMPILER_FLAG(-Werror, ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror") + + if test "x$ERROR_CXXFLAGS" != "x" + then + dnl add exceptions + AS_CXX_COMPILER_FLAG([-Wno-non-virtual-dtor], ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Wno-non-virtual-dtor") + + dnl Add -fno-strict-aliasing for GLib versions before 2.19.8 + dnl as before G_LOCK and friends caused strict aliasing compiler + dnl warnings. + PKG_CHECK_EXISTS([glib-2.0 < 2.19.8], [ + AS_CXX_COMPILER_FLAG([-fno-strict-aliasing], + ERROR_CXXFLAGS="$ERROR_CXXFLAGS -fno-strict-aliasing") + ]) + else + dnl if -Werror isn't suported, try -errwarn=%all + AS_CXX_COMPILER_FLAG([-errwarn=%all], ERROR_CXXFLAGS="$ERROR_CXXFLAGS -errwarn=%all") + if test "x$ERROR_CXXFLAGS" != "x"; then + dnl try -errwarn=%all,no%E_EMPTY_DECLARATION, + dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH, + dnl no%E_MACRO_REDEFINED (Sun Forte case) + dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon + dnl "statement not reached" disabled because there is g_assert_not_reached () in some places + dnl "macro redefined" because of gst/gettext.h + dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'? + dnl FIXME: do any of these work with the c++ compiler? if not, why + dnl do we check at all? + for f in 'no%E_EMPTY_DECLARATION' \ + 'no%E_STATEMENT_NOT_REACHED' \ + 'no%E_ARGUEMENT_MISMATCH' \ + 'no%E_MACRO_REDEFINED' \ + 'no%E_LOOP_NOT_ENTERED_AT_TOP' + do + AS_CXX_COMPILER_FLAG([-errwarn=%all,$f], ERROR_CXXFLAGS="$ERROR_CXXFLAGS,$f") + done + fi + fi + fi + + if test "x$2" != "x" + then + UNSUPPORTED="" + list="$2" + for each in $list + do + AS_CXX_COMPILER_FLAG($each, + WARNING_CXXFLAGS="$WARNING_CXXFLAGS $each", + UNSUPPORTED="$UNSUPPORTED $each") + done + if test "X$UNSUPPORTED" != X ; then + AC_MSG_NOTICE([unsupported compiler flags: $UNSUPPORTED]) + fi + fi + + AC_SUBST(WARNING_CXXFLAGS) + AC_SUBST(ERROR_CXXFLAGS) + AC_MSG_NOTICE([set WARNING_CXXFLAGS to $WARNING_CXXFLAGS]) + AC_MSG_NOTICE([set ERROR_CXXFLAGS to $ERROR_CXXFLAGS]) +]) + +dnl Sets the default error level for debugging messages +AC_DEFUN([AG_GST_SET_LEVEL_DEFAULT], +[ + dnl define correct errorlevel for debugging messages. We want to have + dnl GST_ERROR messages printed when running cvs builds + if test "x[$1]" = "xyes"; then + GST_LEVEL_DEFAULT=GST_LEVEL_ERROR + else + GST_LEVEL_DEFAULT=GST_LEVEL_NONE + fi + AC_DEFINE_UNQUOTED(GST_LEVEL_DEFAULT, $GST_LEVEL_DEFAULT, + [Default errorlevel to use]) + dnl AC_SUBST so we can use it for win32/common/config.h + AC_SUBST(GST_LEVEL_DEFAULT) +]) diff --git a/common/m4/gst-feature.m4 b/common/m4/gst-feature.m4 new file mode 100644 index 0000000..c072c79 --- /dev/null +++ b/common/m4/gst-feature.m4 @@ -0,0 +1,284 @@ +dnl Perform a check for a feature for GStreamer +dnl Richard Boulton +dnl Thomas Vander Stichele added useful stuff +dnl Last modification: 25/06/2001 +dnl +dnl AG_GST_CHECK_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION, +dnl DEPENDENT-PLUGINS, TEST-FOR-FEATURE, +dnl DISABLE-BY-DEFAULT, ACTION-IF-USE, ACTION-IF-NOTUSE) +dnl +dnl This macro adds a command line argument to allow the user to enable +dnl or disable a feature, and if the feature is enabled, performs a supplied +dnl test to check if the feature is available. +dnl +dnl The test should define HAVE_ to "yes" or "no" depending +dnl on whether the feature is available. +dnl +dnl The macro will set USE_ to "yes" or "no" depending on +dnl whether the feature is to be used. +dnl Thomas changed this, so that when USE_ was already set +dnl to no, then it stays that way. +dnl +dnl The macro will call AM_CONDITIONAL(USE_, ...) to allow +dnl the feature to control what is built in Makefile.ams. If you want +dnl additional actions resulting from the test, you can add them with the +dnl ACTION-IF-USE and ACTION-IF-NOTUSE parameters. +dnl +dnl FEATURE-NAME is the name of the feature, and should be in +dnl purely upper case characters. +dnl FEATURE-DESCRIPTION is used to describe the feature in help text for +dnl the command line argument. +dnl DEPENDENT-PLUGINS lists any plug-ins which depend on this feature. +dnl TEST-FOR-FEATURE is a test which sets HAVE_ to "yes" +dnl or "no" depending on whether the feature is +dnl available. +dnl DISABLE-BY-DEFAULT if "disabled", the feature is disabled by default, +dnl if any other value, the feature is enabled by default. +dnl ACTION-IF-USE any extra actions to perform if the feature is to be +dnl used. +dnl ACTION-IF-NOTUSE any extra actions to perform if the feature is not to +dnl be used. +dnl +dnl +dnl thomas : +dnl we also added a history. +dnl GST_PLUGINS_YES will contain all plugins to be built +dnl that were checked through AG_GST_CHECK_FEATURE +dnl GST_PLUGINS_NO will contain those that won't be built + +AC_DEFUN([AG_GST_CHECK_FEATURE], +[echo +AC_MSG_NOTICE(*** checking feature: [$2] ***) +if test "x[$3]" != "x" +then + AC_MSG_NOTICE(*** for plug-ins: [$3] ***) +fi +dnl +builtin(define, [gst_endisable], ifelse($5, [disabled], [enable], [disable]))dnl +dnl if it is set to NO, then don't even consider it for building +NOUSE= +if test "x$USE_[$1]" = "xno"; then + NOUSE="yes" +fi +AC_ARG_ENABLE(translit([$1], A-Z, a-z), + [ ]builtin(format, --%-26s gst_endisable %s, gst_endisable-translit([$1], A-Z, a-z), [$2]ifelse([$3],,,: [$3])), + [ case "${enableval}" in + yes) USE_[$1]=yes;; + no) USE_[$1]=no;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;; + esac], + [ USE_$1=]ifelse($5, [disabled], [no], [yes])) dnl DEFAULT + +dnl *** set it back to no if it was preset to no +if test "x$NOUSE" = "xyes"; then + USE_[$1]="no" + AC_MSG_WARN(*** $3 pre-configured not to be built) +fi +NOUSE= + +dnl *** If it's enabled + +if test x$USE_[$1] = xyes; then + dnl save compile variables before the test + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_[$1]=no + dnl TEST_FOR_FEATURE + $4 + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + dnl If it isn't found, unset USE_[$1] + if test x$HAVE_[$1] = xno; then + USE_[$1]=no + else + ifelse([$3], , :, [AC_MSG_NOTICE(*** These plugins will be built: [$3])]) + fi +fi +dnl *** Warn if it's disabled or not found +if test x$USE_[$1] = xyes; then + ifelse([$6], , :, [$6]) + if test "x$3" != "x"; then + GST_PLUGINS_YES="\t[$3]\n$GST_PLUGINS_YES" + fi + AC_DEFINE(HAVE_[$1], , [Define to enable $2]ifelse($3,,, [ (used by $3)]).) +else + ifelse([$3], , :, [AC_MSG_NOTICE(*** These plugins will not be built: [$3])]) + if test "x$3" != "x"; then + GST_PLUGINS_NO="\t[$3]\n$GST_PLUGINS_NO" + fi + ifelse([$7], , :, [$7]) +fi +dnl *** Define the conditional as appropriate +AM_CONDITIONAL(USE_[$1], test x$USE_[$1] = xyes) +]) + +dnl Use AC_CHECK_LIB and AC_CHECK_HEADER to do both tests at once +dnl sets HAVE_module if we have it +dnl Richard Boulton +dnl Last modification: 26/06/2001 +dnl AG_GST_CHECK_LIBHEADER(FEATURE-NAME, LIB NAME, LIB FUNCTION, EXTRA LD FLAGS, +dnl HEADER NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND) +dnl +dnl This check was written for GStreamer: it should be renamed and checked +dnl for portability if you decide to use it elsewhere. +dnl +AC_DEFUN([AG_GST_CHECK_LIBHEADER], +[ + AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no,[$4]) + if test "x$HAVE_[$1]" = "xyes"; then + AC_CHECK_HEADER([$5], :, HAVE_[$1]=no) + if test "x$HAVE_[$1]" = "xyes"; then + dnl execute what needs to be + ifelse([$6], , :, [$6]) + else + ifelse([$7], , :, [$7]) + fi + else + ifelse([$7], , :, [$7]) + fi + AC_SUBST(HAVE_[$1]) +] +) + +dnl 2004-02-14 Thomas - changed to get set properly and use proper output +dnl 2003-06-27 Benjamin Otte - changed to make this work with gstconfig.h +dnl +dnl Add a subsystem --disable flag and all the necessary symbols and substitions +dnl +dnl AG_GST_CHECK_SUBSYSTEM_DISABLE(SYSNAME, [subsystem name]) +dnl +AC_DEFUN([AG_GST_CHECK_SUBSYSTEM_DISABLE], +[ + dnl this define will replace each literal subsys_def occurrence with + dnl the lowercase hyphen-separated subsystem + dnl e.g. if $1 is GST_DEBUG then subsys_def will be a macro with gst-debug + define([subsys_def],translit([$1], _A-Z, -a-z)) + + AC_ARG_ENABLE(subsys_def, + AC_HELP_STRING(--disable-subsys_def, [disable $2]), + [ + case "${enableval}" in + yes) GST_DISABLE_[$1]=no ;; + no) GST_DISABLE_[$1]=yes ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-subsys_def]) ;; + esac + ], + [GST_DISABLE_[$1]=no]) dnl Default value + + if test x$GST_DISABLE_[$1] = xyes; then + AC_MSG_NOTICE([disabled subsystem [$2]]) + GST_DISABLE_[$1]_DEFINE="#define GST_DISABLE_$1 1" + else + GST_DISABLE_[$1]_DEFINE="/* #undef GST_DISABLE_$1 */" + fi + AC_SUBST(GST_DISABLE_[$1]_DEFINE) + undefine([subsys_def]) +]) + + +dnl Parse gstconfig.h for feature and defines add the symbols and substitions +dnl +dnl AG_GST_PARSE_SUBSYSTEM_DISABLE(GST_CONFIGPATH, FEATURE) +dnl +AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLE], +[ + grep >/dev/null "#undef GST_DISABLE_$2" $1 + if test $? = 0; then + GST_DISABLE_[$2]=0 + else + GST_DISABLE_[$2]=1 + fi + AC_SUBST(GST_DISABLE_[$2]) +]) + +dnl Parse gstconfig.h and defines add the symbols and substitions +dnl +dnl GST_CONFIGPATH=`$PKG_CONFIG --variable=includedir gstreamer-0.10`"/gst/gstconfig.h" +dnl AG_GST_PARSE_SUBSYSTEM_DISABLES(GST_CONFIGPATH) +dnl +AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLES], +[ + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,GST_DEBUG) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,LOADSAVE) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,PARSE) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,TRACE) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,ALLOC_TRACE) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,REGISTRY) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,PLUGIN) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,XML) +]) + +dnl AG_GST_CHECK_GST_DEBUG_DISABLED(ACTION-IF-DISABLED, ACTION-IF-NOT-DISABLED) +dnl +dnl Checks if the GStreamer debugging system is disabled in the core version +dnl we are compiling against (by checking gstconfig.h) +dnl +AC_DEFUN([AG_GST_CHECK_GST_DEBUG_DISABLED], +[ + AC_REQUIRE([AG_GST_CHECK_GST]) + + AC_MSG_CHECKING([whether the GStreamer debugging system is enabled]) + AC_LANG_PUSH([C]) + save_CFLAGS="$CFLAGS" + CFLAGS="$GST_CFLAGS $CFLAGS" + AC_COMPILE_IFELSE([ + #include + #ifdef GST_DISABLE_GST_DEBUG + #error "debugging disabled, make compiler fail" + #endif], [ debug_system_enabled=yes], [debug_system_enabled=no]) + CFLAGS="$save_CFLAGS" + AC_LANG_POP([C]) + + AC_MSG_RESULT([$debug_system_enabled]) + + if test "x$debug_system_enabled" = "xyes" ; then + $2 + true + else + $1 + true + fi +]) + +dnl relies on GST_PLUGINS_ALL, GST_PLUGINS_SELECTED, GST_PLUGINS_YES, +dnl GST_PLUGINS_NO, and BUILD_EXTERNAL +AC_DEFUN([AG_GST_OUTPUT_PLUGINS], [ + +printf "configure: *** Plug-ins without external dependencies that will be built:\n" +( for i in $GST_PLUGINS_SELECTED; do printf '\t'$i'\n'; done ) | sort +printf "\n" + +printf "configure: *** Plug-ins without external dependencies that will NOT be built:\n" +( for i in $GST_PLUGINS_ALL; do + case " $GST_PLUGINS_SELECTED " in + *\ $i\ *) + ;; + *) + printf '\t'$i'\n' + ;; + esac + done ) | sort +printf "\n" + +if test "x$BUILD_EXTERNAL" = "xno"; then + printf "configure: *** No plug-ins with external dependencies will be built\n" +else + printf "configure: *** Plug-ins with dependencies that will be built:" + printf "$GST_PLUGINS_YES\n" | sort + printf "\n" + printf "configure: *** Plug-ins with dependencies that will NOT be built:" + printf "$GST_PLUGINS_NO\n" | sort + printf "\n" +fi +]) + diff --git a/common/m4/gst-function.m4 b/common/m4/gst-function.m4 new file mode 100644 index 0000000..61adfd3 --- /dev/null +++ b/common/m4/gst-function.m4 @@ -0,0 +1,63 @@ +dnl +dnl Check for compiler mechanism to show functions in debugging +dnl copied from an Ali patch floating on the internet +dnl +AC_DEFUN([AG_GST_CHECK_FUNCTION],[ + dnl #1: __PRETTY_FUNCTION__ + AC_MSG_CHECKING(whether $CC implements __PRETTY_FUNCTION__) + AC_CACHE_VAL(gst_cv_have_pretty_function,[ + AC_TRY_LINK([#include ], + [printf("%s", __PRETTY_FUNCTION__);], + gst_cv_have_pretty_function=yes, + gst_cv_have_pretty_function=no) + ]) + AC_MSG_RESULT($gst_cv_have_pretty_function) + if test "$gst_cv_have_pretty_function" = yes; then + AC_DEFINE(HAVE_PRETTY_FUNCTION, 1, + [defined if the compiler implements __PRETTY_FUNCTION__]) + fi + +dnl #2: __FUNCTION__ + AC_MSG_CHECKING(whether $CC implements __FUNCTION__) + AC_CACHE_VAL(gst_cv_have_function,[ + AC_TRY_LINK([#include ], + [printf("%s", __FUNCTION__);], + gst_cv_have_function=yes, + gst_cv_have_function=no) + ]) + AC_MSG_RESULT($gst_cv_have_function) + if test "$gst_cv_have_function" = yes; then + AC_DEFINE(HAVE_FUNCTION, 1, + [defined if the compiler implements __FUNCTION__]) + fi + +dnl #3: __func__ + AC_MSG_CHECKING(whether $CC implements __func__) + AC_CACHE_VAL(gst_cv_have_func,[ + AC_TRY_LINK([#include ], + [printf("%s", __func__);], + gst_cv_have_func=yes, + gst_cv_have_func=no) + ]) + AC_MSG_RESULT($gst_cv_have_func) + if test "$gst_cv_have_func" = yes; then + AC_DEFINE(HAVE_FUNC, 1, + [defined if the compiler implements __func__]) + fi + +dnl now define FUNCTION to whatever works, and fallback to "" + if test "$gst_cv_have_pretty_function" = yes; then + function=__PRETTY_FUNCTION__ + else + if test "$gst_cv_have_function" = yes; then + function=__FUNCTION__ + else + if test "$gst_cv_have_func" = yes; then + function=__func__ + else + function=\"\" + fi + fi + fi + AC_DEFINE_UNQUOTED(GST_FUNCTION, $function, [macro to use to show function name]) +]) diff --git a/common/m4/gst-gettext.m4 b/common/m4/gst-gettext.m4 new file mode 100644 index 0000000..a63651b --- /dev/null +++ b/common/m4/gst-gettext.m4 @@ -0,0 +1,21 @@ +dnl gettext setup + +dnl AG_GST_GETTEXT([gettext-package]) +dnl defines GETTEXT_PACKAGE and LOCALEDIR + +AC_DEFUN([AG_GST_GETTEXT], +[ + if test "$USE_NLS" = "yes"; then + GETTEXT_PACKAGE=[$1] + else + GETTEXT_PACKAGE=[NULL] + fi + AC_SUBST(GETTEXT_PACKAGE) + AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], "$GETTEXT_PACKAGE", + [gettext package name]) + + dnl define LOCALEDIR in config.h + AS_AC_EXPAND(LOCALEDIR, $datadir/locale) + AC_DEFINE_UNQUOTED([LOCALEDIR], "$LOCALEDIR", + [gettext locale dir]) +]) diff --git a/common/m4/gst-glib2.m4 b/common/m4/gst-glib2.m4 new file mode 100644 index 0000000..b01f02f --- /dev/null +++ b/common/m4/gst-glib2.m4 @@ -0,0 +1,75 @@ +dnl check for a minimum version of GLib + +dnl AG_GST_GLIB_CHECK([minimum-version-required]) + +AC_DEFUN([AG_GST_GLIB_CHECK], +[ + AC_REQUIRE([AS_NANO]) + + dnl Minimum required version of GLib + GLIB_REQ=[$1] + if test "x$GLIB_REQ" = "x" + then + AC_MSG_ERROR([Please specify a required version for GLib 2.0]) + fi + AC_SUBST(GLIB_REQ) + + dnl Check for glib with everything + AG_GST_PKG_CHECK_MODULES(GLIB, + glib-2.0 >= $GLIB_REQ gobject-2.0 gthread-2.0 gmodule-no-export-2.0) + + if test "x$HAVE_GLIB" = "xno"; then + AC_MSG_ERROR([This package requires GLib >= $GLIB_REQ to compile.]) + fi + + dnl Add define to tell GLib that threading is always enabled within GStreamer + dnl code (optimisation, bypasses checks if the threading system is enabled + dnl when using threading primitives) + GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_THREADS_MANDATORY" + + dnl Define G_DISABLE_DEPRECATED for GIT versions + if test "x$PACKAGE_VERSION_NANO" = "x1"; then + GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_DEPRECATED" + fi + + AC_ARG_ENABLE(gobject-cast-checks, + AS_HELP_STRING([--enable-gobject-cast-checks[=@<:@no/auto/yes@:>@]], + [Enable GObject cast checks]),, + [enable_gobject_cast_checks=auto]) + + if test "x$enable_gobject_cast_checks" = "xauto"; then + dnl For releases, turn off the cast checks + if test "x$PACKAGE_VERSION_NANO" = "x1"; then + enable_gobject_cast_checks=yes + else + enable_gobject_cast_checks=no + fi + fi + + if test "x$enable_gobject_cast_checks" = "xno"; then + GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_CAST_CHECKS" + fi + + AC_ARG_ENABLE(glib-asserts, + AS_HELP_STRING([--enable-glib-asserts[=@<:@no/auto/yes@:>@]], + [Enable GLib assertion]),, + [enable_glib_assertions=auto]) + + if test "x$enable_glib_assertions" = "xauto"; then + dnl For releases, turn off the assertions + if test "x$PACKAGE_VERSION_NANO" = "x1"; then + enable_glib_assertions=yes + else + enable_glib_assertions=no + fi + fi + + if test "x$enable_glib_assertions" = "xno"; then + GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT" + fi + + dnl for the poor souls who for example have glib in /usr/local + AS_SCRUB_INCLUDE(GLIB_CFLAGS) + + AC_SUBST(GLIB_EXTRA_CFLAGS) +]) diff --git a/common/m4/gst-libxml2.m4 b/common/m4/gst-libxml2.m4 new file mode 100644 index 0000000..4a843f0 --- /dev/null +++ b/common/m4/gst-libxml2.m4 @@ -0,0 +1,52 @@ +dnl call this macro with the minimum required version as an argument +dnl this macro sets and AC_SUBSTs XML_CFLAGS and XML_LIBS +dnl it also sets LIBXML_PKG, used for the pkg-config file + +AC_DEFUN([AG_GST_LIBXML2_CHECK], +[ + dnl Minimum required version of libxml2 + dnl default to 2.4.9 if not specified + LIBXML2_REQ=ifelse([$1],,2.4.9,[$1]) + AC_SUBST(LIBXML2_REQ) + + dnl check for libxml2 + PKG_CHECK_MODULES(XML, libxml-2.0 >= $LIBXML2_REQ, + HAVE_LIBXML2=yes, [ + AC_MSG_RESULT(no) + HAVE_LIBXML2=no + ]) + if test "x$HAVE_LIBXML2" = "xyes"; then + AC_DEFINE(HAVE_LIBXML2, 1, [Define if libxml2 is available]) + else + AC_MSG_ERROR([ + Need libxml2 and development headers/files to build GStreamer. + + You can do without libxml2 if you pass --disable-loadsave to + configure, but that breaks ABI, so don't do that unless you + are building for an embedded setup and know what you are doing. + ]) + fi + dnl this is for the .pc file + LIBXML_PKG=', libxml-2.0' + AC_SUBST(LIBXML_PKG) + AC_SUBST(XML_LIBS) + AC_SUBST(XML_CFLAGS) + + dnl XML_LIBS might pull in -lz without zlib actually being on the system, so + dnl try linking with these LIBS and CFLAGS + ac_save_CFLAGS=$CFLAGS + ac_save_LIBS=$LIBS + CFLAGS="$CFLAGS $XML_CFLAGS" + LIBS="$LIBS $XML_LIBS" + AC_TRY_LINK([ +#include +#include +],[ +/* function body */ +], + AC_MSG_NOTICE([Test xml2 program linked]), + AC_MSG_ERROR([Could not link libxml2 test program. Check if you have the necessary dependencies.]) + ) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" +]) diff --git a/common/m4/gst-package-release-datetime.m4 b/common/m4/gst-package-release-datetime.m4 new file mode 100644 index 0000000..126919b --- /dev/null +++ b/common/m4/gst-package-release-datetime.m4 @@ -0,0 +1,89 @@ +dnl macros to set GST_PACKAGE_RELEASE_DATETIME + +dnl =========================================================================== +dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME +dnl +dnl Usage: +dnl +dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME() +dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]...) +dnl sets the release datetime to the current date +dnl (no = this is not a release, but git or prerelease) +dnl +dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD]) +dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [YYYY-MM-DD]) +dnl sets the release datetime to the specified date (and time, if given) +dnl (yes = this is a release, not git or prerelease) +dnl +dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [DOAP-FILE], [RELEASE-VERSION]) +dnl sets the release date to the release date associated with version +dnl RELEASE-VERSION in the .doap file DOAP-FILE +dnl (yes = this is a release, not git or prerelease) +dnl +dnl We need to treat pre-releases like git because there won't be an entry +dnl in the .doap file for pre-releases yet, and we don't want to use the +dnl date of the last release either. +dnl =========================================================================== +AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME], +[ + dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME() + dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes]...) + if test "x$1" = "xno" -o "x$1" = "x"; then + GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"` + elif test "x$1" = "xyes"; then + dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], ["YYYY-MM-DD"]) + dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], [DOAP-FILE], [RELEASE-VERSION]) + if ( echo $1 | grep -e '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then + GST_PACKAGE_RELEASE_DATETIME=$1 + else + dnl we assume the .doap file contains the date as YYYY-MM-DD + YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $3 $2`; + if test "x$YYYY_MM_DD" != "x"; then + GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD + else + AC_MSG_ERROR([SET_PACKAGE_RELEASE_DATETIME: could not extract + release date for release version $3 from $2]) + GST_PACKAGE_RELEASE_DATETIME="" + fi + fi + dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD]) + elif ( echo $1 | grep -e '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then + GST_PACKAGE_RELEASE_DATETIME=$1 + else + AC_MSG_WARN([SET_PACKAGE_RELEASE_DATETIME: invalid first argument]) + GST_PACKAGE_RELEASE_DATETIME="" + fi + + if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then + AC_MSG_WARN([Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME]) + else + AC_MSG_NOTICE([Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME]) + + AC_DEFINE_UNQUOTED([GST_PACKAGE_RELEASE_DATETIME], + ["$GST_PACKAGE_RELEASE_DATETIME"], + [GStreamer package release date/time for plugins as YYYY-MM-DD]) + fi +]) + +dnl =========================================================================== +dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO +dnl +dnl Usage: +dnl +dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([NANO-VERSION], [DOAP-FILE], [RELEASE-VERSION]) +dnl if NANO-VERSION is 0, sets the release date to the release date associated +dnl with version RELEASE-VERSION in the .doap file DOAP-FILE, otherwise sets +dnl the release date and time to the current date/time. +dnl +dnl We need to treat pre-releases like git because there won't be an entry +dnl in the .doap file for pre-releases yet, and we don't want to use the +dnl date of the last release either. +dnl =========================================================================== +AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO], +[ + if test "x$1" = "x0"; then + AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [ $2 ], [ $3 ]) + else + AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]) + fi +]) diff --git a/common/m4/gst-parser.m4 b/common/m4/gst-parser.m4 new file mode 100644 index 0000000..2cae45d --- /dev/null +++ b/common/m4/gst-parser.m4 @@ -0,0 +1,55 @@ +AC_DEFUN([AG_GST_BISON_CHECK], +[ + dnl FIXME: check if AC_PROG_YACC is suitable here + dnl FIXME: make precious + AC_PATH_PROG(BISON_PATH, bison, no) + if test x$BISON_PATH = xno; then + AC_MSG_ERROR(Could not find bison) + fi + + dnl check bison version + dnl we need version >= 1.875 for the reentrancy support + dnl in the parser. + dnl First lines observed: 'bison (GNU Bison) 2.3' or 'GNU Bison version 1.28' + bison_min_version=1.875 + bison_version=`$BISON_PATH --version | head -n 1 | sed 's/^[[^0-9]]*//' | sed 's/[[^0-9]]*$//' | cut -d' ' -f1` + AC_MSG_CHECKING([bison version $bison_version >= $bison_min_version]) + + if perl -we "exit ((v$bison_version ge v$bison_min_version) ? 0 : 1)"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_ERROR([no]) + fi +]) + +AC_DEFUN([AG_GST_FLEX_CHECK], +[ + dnl we require flex for building the parser + AC_PATH_PROG(FLEX_PATH, flex, no) + if test x$FLEX_PATH = xno; then + AC_MSG_ERROR(Could not find flex) + fi + + dnl check flex version + dnl we need version >= 2.5.31 for the reentrancy support + dnl in the parser. + flex_min_version=2.5.31 + flex_version=`$FLEX_PATH --version | head -n 1 | sed 's/^.* //' | sed 's/[[a-zA-Z]]*$//' | cut -d' ' -f1` + AC_MSG_CHECKING([flex version $flex_version >= $flex_min_version]) + if perl -w < \$min_version_major) || + ((\$flex_version_major == \$min_version_major) && + (\$flex_version_minor > \$min_version_minor)) || + ((\$flex_version_major == \$min_version_major) && + (\$flex_version_minor == \$min_version_minor) && + (\$flex_version_micro >= \$min_version_micro))) + ? 0 : 1); +EOF + then + AC_MSG_RESULT(yes) + else + AC_MSG_ERROR([no]) + fi +]) diff --git a/common/m4/gst-platform.m4 b/common/m4/gst-platform.m4 new file mode 100644 index 0000000..40d6faf --- /dev/null +++ b/common/m4/gst-platform.m4 @@ -0,0 +1,67 @@ +dnl AG_GST_PLATFORM +dnl Check for platform specific features and define some variables +dnl +dnl GST_EXTRA_MODULE_SUFFIX: contains a platform specific +dnl extra module suffix additional to G_MODULE_SUFFIX +dnl +dnl HAVE_OSX: Defined if compiling for OS X +dnl +dnl GST_HAVE_UNSAFE_FORK: Defined if fork is unsafe (Windows) +dnl +dnl HAVE_WIN32: Defined if compiling on Win32 +dnl + +AC_DEFUN([AG_GST_PLATFORM], +[ + AC_REQUIRE([AC_CANONICAL_HOST]) + + case $host_os in + rhapsody*) + AC_DEFINE_UNQUOTED(GST_EXTRA_MODULE_SUFFIX, [".dylib"], [Extra platform specific plugin suffix]) + ;; + darwin*) + AC_DEFINE_UNQUOTED(GST_EXTRA_MODULE_SUFFIX, [".dylib"], [Extra platform specific plugin suffix]) + AC_DEFINE_UNQUOTED(HAVE_OSX, 1, [Defined if compiling for OSX]) + ;; + cygwin*) + AC_DEFINE_UNQUOTED(GST_HAVE_UNSAFE_FORK, 1, [Defined when registry scanning through fork is unsafe]) + ;; + mingw* | msvc* | mks*) + dnl HAVE_WIN32 currently means "disable POSIXisms". + AC_DEFINE_UNQUOTED(HAVE_WIN32, 1, [Defined if compiling for Windows]) + + dnl define __MSVCRT_VERSION__ version if not set already by the + dnl compiler (ie. mostly for mingw). This is needed for things like + dnl __stat64 to be available. If set by the compiler, ensure it's + dnl new enough - we need at least WinXP SP2. + AC_TRY_COMPILE([ ], [ return __MSVCRT_VERSION__; ], [ + AC_TRY_COMPILE([ ], [ + #if __MSVCRT_VERSION__ < 0x0601 + #error "MSVCRT too old" + #endif + ], [ + AC_MSG_NOTICE([MSVCRT version looks ok]) + ], [ + AC_MSG_ERROR([MSVCRT version too old, need at least WinXP SP2]) + ]) + ], [ + AC_MSG_NOTICE([Setting MSVCRT version to 0x0601]) + AC_DEFINE_UNQUOTED(__MSVCRT_VERSION__, 0x0601, [We need at least WinXP SP2 for __stat64]) + ]) + ;; + *) + ;; + esac +]) + +AC_DEFUN([AG_GST_LIBTOOL_PREPARE], +[ + dnl Persuade libtool to also link (-l) a 'pure' (DirectX) static lib, + dnl i.e. as opposed to only import lib with dll counterpart. + dnl Needs to be tweaked before libtool's checks. + case $host_os in + cygwin* | mingw*) + lt_cv_deplibs_check_method=pass_all + ;; + esac +]) \ No newline at end of file diff --git a/common/m4/gst-plugin-docs.m4 b/common/m4/gst-plugin-docs.m4 new file mode 100644 index 0000000..dcfd61d --- /dev/null +++ b/common/m4/gst-plugin-docs.m4 @@ -0,0 +1,21 @@ +dnl AG_GST_PLUGIN_DOCS([MINIMUM-GTK-DOC-VERSION],[MINIMUM-PYTHON-VERSION]) +dnl +dnl checks for prerequisites for the common/mangle-tmpl.py script +dnl used when building the plugin documentation + +AC_DEFUN([AG_GST_PLUGIN_DOCS], +[ + AC_BEFORE([GTK_DOC_CHECK],[$0])dnl check for gtk-doc first + AC_BEFORE([AS_PATH_PYTHON],[$1])dnl find python first + + build_plugin_docs=no + AC_MSG_CHECKING([whether to build plugin documentation]) + if test x$enable_gtk_doc = xyes; then + build_plugin_docs=yes + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no (gtk-doc disabled or not available)]) + fi + + AM_CONDITIONAL(ENABLE_PLUGIN_DOCS, test x$build_plugin_docs = xyes) +]) diff --git a/common/m4/gst-plugindir.m4 b/common/m4/gst-plugindir.m4 new file mode 100644 index 0000000..09989d0 --- /dev/null +++ b/common/m4/gst-plugindir.m4 @@ -0,0 +1,17 @@ +dnl AG_GST_SET_PLUGINDIR + +dnl AC_DEFINE PLUGINDIR to the full location where plug-ins will be installed +dnl AC_SUBST plugindir, to be used in Makefile.am's + +AC_DEFUN([AG_GST_SET_PLUGINDIR], +[ + dnl define location of plugin directory + AS_AC_EXPAND(PLUGINDIR, ${libdir}/gstreamer-$GST_MAJORMINOR) + AC_DEFINE_UNQUOTED(PLUGINDIR, "$PLUGINDIR", + [directory where plugins are located]) + AC_MSG_NOTICE([Using $PLUGINDIR as the plugin install location]) + + dnl plugin directory configure-time variable for use in Makefile.am + plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" + AC_SUBST(plugindir) +]) diff --git a/common/m4/gst-valgrind.m4 b/common/m4/gst-valgrind.m4 new file mode 100644 index 0000000..5c0d608 --- /dev/null +++ b/common/m4/gst-valgrind.m4 @@ -0,0 +1,35 @@ +AC_DEFUN([AG_GST_VALGRIND_CHECK], +[ + dnl valgrind inclusion + AC_ARG_ENABLE(valgrind, + AC_HELP_STRING([--disable-valgrind], [disable run-time valgrind detection]), + [ + case "${enableval}" in + yes) USE_VALGRIND="$USE_DEBUG" ;; + no) USE_VALGRIND=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind) ;; + esac], + [ + USE_VALGRIND="$USE_DEBUG" + ]) dnl Default value + + VALGRIND_REQ="3.0" + if test "x$USE_VALGRIND" = xyes; then + PKG_CHECK_MODULES(VALGRIND, valgrind >= $VALGRIND_REQ, + USE_VALGRIND="yes", + [ + USE_VALGRIND="no" + AC_MSG_RESULT([no]) + ]) + fi + + if test "x$USE_VALGRIND" = xyes; then + AC_DEFINE(HAVE_VALGRIND, 1, [Define if valgrind should be used]) + AC_MSG_NOTICE(Using extra code paths for valgrind) + fi + AC_SUBST(VALGRIND_CFLAGS) + AC_SUBST(VALGRIND_LIBS) + + AC_PATH_PROG(VALGRIND_PATH, valgrind, no) + AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno") +]) diff --git a/common/m4/gst-x11.m4 b/common/m4/gst-x11.m4 new file mode 100644 index 0000000..d3baf2d --- /dev/null +++ b/common/m4/gst-x11.m4 @@ -0,0 +1,70 @@ +dnl macros for X-related detections +dnl AC_SUBST's HAVE_X, X_CFLAGS, X_LIBS +AC_DEFUN([AG_GST_CHECK_X], +[ + AC_PATH_XTRA + ac_cflags_save="$CFLAGS" + ac_cppflags_save="$CPPFLAGS" + CFLAGS="$CFLAGS $X_CFLAGS" + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + dnl now try to find the HEADER + AC_CHECK_HEADER(X11/Xlib.h, HAVE_X="yes", HAVE_X="no") + + if test "x$HAVE_X" = "xno" + then + AC_MSG_NOTICE([cannot find X11 development files]) + else + dnl this is much more than we want + X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS" + dnl AC_PATH_XTRA only defines the path needed to find the X libs, + dnl it does not add the libs; therefore we add them here + X_LIBS="$X_LIBS -lX11" + AC_SUBST(X_CFLAGS) + AC_SUBST(X_LIBS) + fi + AC_SUBST(HAVE_X) + + CFLAGS="$ac_cflags_save" + CPPFLAGS="$ac_cppflags_save" +]) + +dnl *** XVideo *** +dnl Look for the PIC library first, Debian requires it. +dnl Check debian-devel archives for gory details. +dnl 20020110: +dnl At the moment XFree86 doesn't distribute shared libXv due +dnl to unstable API. On many platforms you CAN NOT link a shared +dnl lib to a static non-PIC lib. This is what the xvideo GStreamer +dnl plug-in wants to do. So Debian distributes a PIC compiled +dnl version of the static lib for plug-ins to link to when it is +dnl inappropriate to link the main application to libXv directly. +dnl FIXME: add check if this platform can support linking to a +dnl non-PIC libXv, if not then don not use Xv. +dnl FIXME: perhaps warn user if they have a shared libXv since +dnl this is an error until XFree86 starts shipping one +AC_DEFUN([AG_GST_CHECK_XV], +[ + if test x$HAVE_X = xyes; then + AC_CHECK_LIB(Xv_pic, XvQueryExtension, + HAVE_XVIDEO="yes", HAVE_XVIDEO="no", + $X_LIBS -lXext) + + if test x$HAVE_XVIDEO = xyes; then + XVIDEO_LIBS="-lXv_pic -lXext" + AC_SUBST(XVIDEO_LIBS) + else + dnl try again using something else if we didn't find it first + if test x$HAVE_XVIDEO = xno; then + AC_CHECK_LIB(Xv, XvQueryExtension, + HAVE_XVIDEO="yes", HAVE_XVIDEO="no", + $X_LIBS -lXext) + + if test x$HAVE_XVIDEO = xyes; then + XVIDEO_LIBS="-lXv -lXext" + AC_SUBST(XVIDEO_LIBS) + fi + fi + fi + fi +]) diff --git a/common/m4/gst.m4 b/common/m4/gst.m4 new file mode 100644 index 0000000..ddfde51 --- /dev/null +++ b/common/m4/gst.m4 @@ -0,0 +1,31 @@ +dnl AG_GST_INIT +dnl sets up use of GStreamer configure.ac macros +dnl all GStreamer autoconf macros are prefixed +dnl with AG_GST_ for public macros +dnl with _AG_GST_ for private macros + +AC_DEFUN([AG_GST_INIT], +[ + m4_pattern_forbid(^_?AG_GST_) +]) + +dnl AG_GST_PKG_CONFIG_PATH +dnl +dnl sets up a GST_PKG_CONFIG_PATH variable for use in Makefile.am +dnl which contains the path of the in-tree pkgconfig directory first +dnl and then any paths specified in PKG_CONFIG_PATH. +dnl +dnl We do this mostly so we don't have to use unportable shell constructs +dnl such as ${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH} in Makefile.am to handle +dnl the case where the environment variable is not set, but also in order +dnl to avoid a trailing ':' in the PKG_CONFIG_PATH which apparently causes +dnl problems with pkg-config on windows with msys/mingw. +AC_DEFUN([AG_GST_PKG_CONFIG_PATH], +[ + GST_PKG_CONFIG_PATH="\$(top_builddir)/pkgconfig" + if test "x$PKG_CONFIG_PATH" != "x"; then + GST_PKG_CONFIG_PATH="$GST_PKG_CONFIG_PATH:$PKG_CONFIG_PATH" + fi + AC_SUBST([GST_PKG_CONFIG_PATH]) + AC_MSG_NOTICE([Using GST_PKG_CONFIG_PATH = $GST_PKG_CONFIG_PATH]) +]) diff --git a/common/m4/gtk-doc.m4 b/common/m4/gtk-doc.m4 new file mode 100644 index 0000000..39a4e7d --- /dev/null +++ b/common/m4/gtk-doc.m4 @@ -0,0 +1,42 @@ +dnl -*- mode: autoconf -*- + +# serial 1 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + dnl for overriding the documentation installation directory + AC_ARG_WITH([html-dir], + AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, + [with_html_dir='${datadir}/gtk-doc/html']) + HTML_DIR="$with_html_dir" + AC_SUBST([HTML_DIR]) + + dnl enable/disable documentation building + AC_ARG_ENABLE([gtk-doc], + AS_HELP_STRING([--enable-gtk-doc], + [use gtk-doc to build documentation [[default=no]]]),, + [enable_gtk_doc=no]) + + if test x$enable_gtk_doc = xyes; then + ifelse([$1],[], + [PKG_CHECK_EXISTS([gtk-doc],, + AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], + [PKG_CHECK_EXISTS([gtk-doc >= $1],, + AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build gtk-doc]))]) + if test -z "$SED"; then + AC_PROG_SED + fi + fi + + AC_MSG_CHECKING([whether to build gtk-doc documentation]) + AC_MSG_RESULT($enable_gtk_doc) + + AC_PATH_PROGS(GTKDOC_CHECK,gtkdoc-check,) + + AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) + AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) +]) diff --git a/common/m4/introspection.m4 b/common/m4/introspection.m4 new file mode 100644 index 0000000..589721c --- /dev/null +++ b/common/m4/introspection.m4 @@ -0,0 +1,94 @@ +dnl -*- mode: autoconf -*- +dnl Copyright 2009 Johan Dahlin +dnl +dnl This file is free software; the author(s) gives unlimited +dnl permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. +dnl + +# serial 1 + +m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL], +[ + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([LT_INIT],[$0])dnl setup libtool first + + dnl enable/disable introspection + m4_if([$2], [require], + [dnl + enable_introspection=yes + ],[dnl + AC_ARG_ENABLE(introspection, + AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]], + [Enable introspection for this build]),, + [enable_introspection=auto]) + ])dnl + + AC_MSG_CHECKING([for gobject-introspection]) + + dnl presence/version checking + AS_CASE([$enable_introspection], + [no], [dnl + found_introspection="no (disabled, use --enable-introspection to enable)" + ],dnl + [yes],[dnl + PKG_CHECK_EXISTS([gobject-introspection-1.0],, + AC_MSG_ERROR([gobject-introspection-1.0 is not installed])) + PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], + found_introspection=yes, + AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME])) + ],dnl + [auto],[dnl + PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no) + ],dnl + [dnl + AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@]) + ])dnl + + AC_MSG_RESULT([$found_introspection]) + + INTROSPECTION_SCANNER= + INTROSPECTION_COMPILER= + INTROSPECTION_GENERATE= + INTROSPECTION_GIRDIR= + INTROSPECTION_TYPELIBDIR= + if test "x$found_introspection" = "xyes"; then + INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` + INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` + INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` + INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` + INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" + INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` + INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` + INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection + fi + AC_SUBST(INTROSPECTION_SCANNER) + AC_SUBST(INTROSPECTION_COMPILER) + AC_SUBST(INTROSPECTION_GENERATE) + AC_SUBST(INTROSPECTION_GIRDIR) + AC_SUBST(INTROSPECTION_TYPELIBDIR) + AC_SUBST(INTROSPECTION_CFLAGS) + AC_SUBST(INTROSPECTION_LIBS) + AC_SUBST(INTROSPECTION_MAKEFILE) + + AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes") +]) + + +dnl Usage: +dnl GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version]) + +AC_DEFUN([GOBJECT_INTROSPECTION_CHECK], +[ + _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1]) +]) + +dnl Usage: +dnl GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version]) + + +AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE], +[ + _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require]) +]) diff --git a/common/m4/orc.m4 b/common/m4/orc.m4 new file mode 100644 index 0000000..26b2459 --- /dev/null +++ b/common/m4/orc.m4 @@ -0,0 +1,70 @@ +dnl pkg-config-based checks for Orc + +dnl specific: +dnl ORC_CHECK([REQUIRED_VERSION]) + +AC_DEFUN([ORC_CHECK], +[ + ORC_REQ=ifelse([$1], , "0.4.6", [$1]) + + AC_ARG_ENABLE(orc, + AC_HELP_STRING([--enable-orc],[use Orc if installed]), + [case "${enableval}" in + auto) enable_orc=auto ;; + yes) enable_orc=yes ;; + no) enable_orc=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-orc) ;; + esac + ], + [enable_orc=auto]) dnl Default value + + if test "x$enable_orc" != "xno" ; then + PKG_CHECK_MODULES(ORC, orc-0.4 >= $ORC_REQ, [ + AC_DEFINE(HAVE_ORC, 1, [Use Orc]) + HAVE_ORC=yes + if test "x$ORCC" = "x" ; then + AC_MSG_CHECKING(for usable orcc) + ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` + dnl check whether the orcc found by pkg-config can be run from the build environment + dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH + AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`]) + AC_MSG_RESULT($ORCC) + fi + AC_SUBST(ORCC) + ORCC_FLAGS="--compat $ORC_REQ" + AC_SUBST(ORCC_FLAGS) + AS_IF([test "x$ORCC" = "x"], [HAVE_ORCC=no], [HAVE_ORCC=yes]) + ], [ + if test "x$enable_orc" = "xyes" ; then + AC_MSG_ERROR([--enable-orc specified, but Orc >= $ORC_REQ not found]) + fi + AC_DEFINE(DISABLE_ORC, 1, [Disable Orc]) + HAVE_ORC=no + HAVE_ORCC=no + ]) + else + AC_DEFINE(DISABLE_ORC, 1, [Disable Orc]) + HAVE_ORC=no + HAVE_ORCC=no + fi + AM_CONDITIONAL(HAVE_ORC, [test "x$HAVE_ORC" = "xyes"]) + AM_CONDITIONAL(HAVE_ORCC, [test "x$HAVE_ORCC" = "xyes"]) + +])) + +AC_DEFUN([ORC_OUTPUT], +[ + if test "$HAVE_ORC" = yes ; then + printf "configure: *** Orc acceleration enabled.\n" + else + if test "x$enable_orc" = "xno" ; then + printf "configure: *** Orc acceleration disabled by --disable-orc. Slower code paths\n" + printf " will be used.\n" + else + printf "configure: *** Orc acceleration disabled. Requires Orc >= $ORC_REQ, which was\n" + printf " not found. Slower code paths will be used.\n" + fi + fi + printf "\n" +]) + diff --git a/common/m4/pkg.m4 b/common/m4/pkg.m4 new file mode 100644 index 0000000..996e294 --- /dev/null +++ b/common/m4/pkg.m4 @@ -0,0 +1,157 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# +# Copyright © 2004 Scott James Remnant . +# +# 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 of the License, 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi + +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# +# Similar to PKG_CHECK_MODULES, make sure that the first instance of +# this or PKG_CHECK_MODULES is called, or make sure to call +# PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_ifval([$2], [$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$PKG_CONFIG"; then + if test -n "$$1"; then + pkg_cv_[]$1="$$1" + else + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + fi +else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + ifelse([$4], , [AC_MSG_ERROR(dnl +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT +])], + [AC_MSG_RESULT([no]) + $4]) +elif test $pkg_failed = untried; then + ifelse([$4], , [AC_MSG_FAILURE(dnl +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])], + [$4]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + ifelse([$3], , :, [$3]) +fi[]dnl +])# PKG_CHECK_MODULES diff --git a/common/mangle-tmpl.py b/common/mangle-tmpl.py new file mode 100644 index 0000000..bd4f948 --- /dev/null +++ b/common/mangle-tmpl.py @@ -0,0 +1,163 @@ +# -*- Mode: Python -*- +# vi:si:et:sw=4:sts=4:ts=4 + +""" +use the output from gst-xmlinspect.py to mangle tmpl/*.sgml and +insert/overwrite Short Description and Long Description +""" + +# FIXME: right now it uses pygst and scans on its own; +# we really should use inspect/*.xml instead since the result of +# gst-xmlinspect.py is committed by the docs maintainer, who can be +# expected to have pygst, but this step should be done for every docs build, +# so no pygst allowed + +# read in inspect/*.xml +# for every tmpl/element-(name).xml: mangle with details from element + +import glob +import re +import sys +import os + +class Tmpl: + def __init__(self, filename): + self.filename = filename + self._sectionids = [] + self._sections = {} + + def read(self): + """ + Read and parse the sections from the given file. + """ + lines = open(self.filename).readlines() + matcher = re.compile("\n") + id = None + + for line in lines: + match = matcher.search(line) + if match: + id = match.expand("\\1") + self._sectionids.append(id) + self._sections[id] = [] + else: + if not id: + sys.stderr.write( + "WARNING: line before a SECTION header: %s" % line) + else: + self._sections[id].append(line) + + def get_section(self, id): + """ + Get the content from the given section. + """ + return self._sections[id] + + def set_section(self, id, content): + """ + Replace the given section id with the given content. + """ + self._sections[id] = content + + def output(self): + """ + Return the output of the current template in the tmpl/*.sgml format. + """ + lines = [] + for id in self._sectionids: + lines.append("\n" % id) + for line in self._sections[id]: + lines.append(line) + + return "".join(lines) + + def write(self, backup=False): + """ + Write out the template file again, backing up the previous one. + """ + if backup: + target = self.filename + ".mangle.bak" + os.rename(self.filename, target) + + handle = open(self.filename, "w") + handle.write(self.output()) + handle.close() + +import xml.dom.minidom + +def get_elements(file): + elements = {} + doc = xml.dom.minidom.parse(file) + + elem = None + for e in doc.childNodes: + if e.nodeType == e.ELEMENT_NODE and e.localName == 'plugin': + elem = e + break + if elem == None: + return None + + elem2 = None + for e in elem.childNodes: + if e.nodeType == e.ELEMENT_NODE and e.localName == 'elements': + elem2 = e + break + if elem2 == None: + return None + + elem = elem2 + + for e in elem.childNodes: + if e.nodeType == e.ELEMENT_NODE and e.localName == 'element': + name = None + description = None + + for e2 in e.childNodes: + if e2.nodeType == e2.ELEMENT_NODE and e2.localName == 'name': + name = e2.childNodes[0].nodeValue.encode("UTF-8") + elif e2.nodeType == e2.ELEMENT_NODE and e2.localName == 'description': + if e2.childNodes: + description = e2.childNodes[0].nodeValue.encode("UTF-8") + else: + description = 'No description' + + if name != None and description != None: + elements[name] = {'description': description} + + return elements + +def main(): + if not len(sys.argv) == 3: + sys.stderr.write('Please specify the inspect/ dir and the tmpl/ dir') + sys.exit(1) + + inspectdir = sys.argv[1] + tmpldir = sys.argv[2] + + # parse all .xml files; build map of element name -> short desc + #for file in glob.glob("inspect/plugin-*.xml"): + elements = {} + for file in glob.glob("%s/plugin-*.xml" % inspectdir): + elements.update(get_elements(file)) + + for file in glob.glob("%s/element-*.sgml" % tmpldir): + base = os.path.basename(file) + element = base[len("element-"):-len(".sgml")] + tmpl = Tmpl(file) + tmpl.read() + if element in elements.keys(): + description = elements[element]['description'] + tmpl.set_section("Short_Description", "%s\n\n" % description) + + # put in an include if not yet there + line = '' + \ + '' + \ + '\n' + section = tmpl.get_section("Long_Description") + if not section[0] == line: + section.insert(0, line) + tmpl.set_section("Long_Description", section) + tmpl.write() + +main() diff --git a/common/orc.mak b/common/orc.mak new file mode 100644 index 0000000..a232b5d --- /dev/null +++ b/common/orc.mak @@ -0,0 +1,76 @@ +# +# This is a makefile.am fragment to build Orc code. +# +# Define ORC_SOURCE and then include this file, such as: +# +# ORC_SOURCE=gstadderorc +# include $(top_srcdir)/common/orc.mak +# +# This fragment will create tmp-orc.c and gstadderorc.h from +# gstadderorc.orc. +# +# When 'make dist' is run at the top level, or 'make orc-update' +# in a directory including this fragment, the generated source +# files will be copied to $(ORC_SOURCE)-dist.[ch]. These files +# should be checked in to git, since they are used if Orc is +# disabled. +# +# Note that this file defines BUILT_SOURCES, so any later usage +# of BUILT_SOURCES in the Makefile.am that includes this file +# must use '+='. +# + + +EXTRA_DIST = $(ORC_SOURCE).orc + +ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h +BUILT_SOURCES = tmp-orc.c $(ORC_SOURCE).h + + +orc-update: tmp-orc.c $(ORC_SOURCE).h + $(top_srcdir)/common/gst-indent tmp-orc.c + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h + +orcc_v_gen = $(orcc_v_gen_$(V)) +orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) +orcc_v_gen_0 = @echo " ORCC $@"; + +cp_v_gen = $(cp_v_gen_$(V)) +cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) +cp_v_gen_0 = @echo " CP $@"; + +if HAVE_ORCC +tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc + $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --implementation --include glib.h -o tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc + +$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc + $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --header --include glib.h -o $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc +else +tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c + $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c + +$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c + $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h +endif + +clean-local: clean-orc +.PHONY: clean-orc +clean-orc: + rm -f tmp-orc.c $(ORC_SOURCE).h + +dist-hook: dist-hook-orc +.PHONY: dist-hook-orc + +# we try and copy updated orc -dist files below, but don't fail if it +# doesn't work as the srcdir might not be writable +dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h + $(top_srcdir)/common/gst-indent tmp-orc.c + rm -f tmp-orc.c~ + cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || true + cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || true + cp -p tmp-orc.c $(distdir)/$(ORC_SOURCE)-dist.c + cp -p $(ORC_SOURCE).h $(distdir)/$(ORC_SOURCE)-dist.h + diff --git a/common/parallel-subdirs.mak b/common/parallel-subdirs.mak new file mode 100644 index 0000000..36885df --- /dev/null +++ b/common/parallel-subdirs.mak @@ -0,0 +1,13 @@ +# include this at the end of $MODULE/ext/Makefile.am to force make to +# build subdirectories in parallel when make -jN is used. We will end up +# descending into all subdirectories a second time, but only after the first +# (parallel) run has finished, so it should go right through the second time. + +.PHONY: independent-subdirs $(SUBDIRS) + +independent-subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@ + +all-recursive: independent-subdirs diff --git a/common/plugins.xsl b/common/plugins.xsl new file mode 100644 index 0000000..60515b6 --- /dev/null +++ b/common/plugins.xsl @@ -0,0 +1,209 @@ + + + + + + + + + + + + -plugins- + + + + + + + + + + + + + + Element Information + + + + + plugin + + + + plugin- + + + + + + + + author + + + + + + + class + + + + + + + + + + Element Pads + + + + + name + + + + + + + direction + + + + + + + presence + + + + + + + + + details + + + + + + + + + + + + + + + + + + + + + -plugins-plugin- + + + + + + 3 + FIXME Library + + + + + + + + + + plugin- + + + + + + + Plugin Information + + + + filename + + + + + + + version + + + + + + + run-time license + + + + + + + package + + + + + + + origin + + + + + + + + + + + + + + + + + + + + + + + Elements + + + + + + + + + + + + + + diff --git a/common/po.mak b/common/po.mak new file mode 100644 index 0000000..e019fac --- /dev/null +++ b/common/po.mak @@ -0,0 +1,4 @@ +# rule to download the latest .po files +download-po: $(top_srcdir)/common/download-translations + $(top_srcdir)/common/download-translations $(PACKAGE) + diff --git a/common/release.mak b/common/release.mak new file mode 100644 index 0000000..4a9b7d5 --- /dev/null +++ b/common/release.mak @@ -0,0 +1,25 @@ +# include this snippet to add a common release: target by using +# include $(top_srcdir)/common/release.mak + +# make bz2 as well +AUTOMAKE_OPTIONS = dist-bzip2 + +release: dist + $(MAKE) $(PACKAGE)-$(VERSION).tar.gz.md5 + $(MAKE) $(PACKAGE)-$(VERSION).tar.bz2.md5 + +# generate md5 sum files +%.md5: % + md5sum $< > $@ + +# check that no marshal or enumtypes files are included +# this in turn ensures that distcheck fails for missing .list files which is currently +# shadowed when the corresponding .c and .h files are included. +distcheck-hook: + @test "x" = "x`find $(distdir) -name \*-enumtypes.[ch] | grep -v win32`" && \ + test "x" = "x`find $(distdir) -name \*-marshal.[ch]`" || \ + ( $(ECHO) "*** Leftover enumtypes or marshal files in the tarball." && \ + $(ECHO) "*** Make sure the following files are not disted:" && \ + find $(distdir) -name \*-enumtypes.[ch] | grep -v win32 && \ + find $(distdir) -name \*-marshal.[ch] && \ + false ) diff --git a/common/scangobj-merge.py b/common/scangobj-merge.py new file mode 100755 index 0000000..9a1cac9 --- /dev/null +++ b/common/scangobj-merge.py @@ -0,0 +1,309 @@ +#!/usr/bin/python +# -*- Mode: Python -*- +# vi:si:et:sw=4:sts=4:ts=4 + +""" +parse, merge and write gstdoc-scanobj files +""" + +import sys +import os + +def debug(*args): + pass + +# OrderedDict class based on +# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 +# Licensed under the Python License +class OrderedDict(dict): + def __init__(self): + self._keys = [] + dict.__init__(self) + + def __delitem__(self, key): + dict.__delitem__(self, key) + self._keys.remove(key) + + def __setitem__(self, key, item): + dict.__setitem__(self, key, item) + if key not in self._keys: self._keys.append(key) + + def clear(self): + dict.clear(self) + self._keys = [] + + def copy(self): + dict = dict.copy(self) + dict._keys = self._keys[:] + return dict + + def items(self): + return zip(self._keys, self.values()) + + def keys(self): + return self._keys + + def popitem(self): + try: + key = self._keys[-1] + except IndexError: + raise KeyError('dictionary is empty') + + val = self[key] + del self[key] + + return (key, val) + + def setdefault(self, key, failobj = None): + dict.setdefault(self, key, failobj) + if key not in self._keys: self._keys.append(key) + + def update(self, dict): + dict.update(self, dict) + for key in dict.keys(): + if key not in self._keys: self._keys.append(key) + + def values(self): + return map(self.get, self._keys) + +class Object: + def __init__(self, name): + self._signals = OrderedDict() + self._args = OrderedDict() + self.name = name + + def __repr__(self): + return "" % self.name + + def add_signal(self, signal, overwrite=True): + if not overwrite and self._signals.has_key(signal.name): + raise IndexError, "signal %s already in %r" % (signal.name, self) + self._signals[signal.name] = signal + + def add_arg(self, arg, overwrite=True): + if not overwrite and self._args.has_key(arg.name): + raise IndexError, "arg %s already in %r" % (arg.name, self) + self._args[arg.name] = arg + +class Docable: + def __init__(self, **kwargs): + for key in self.attrs: + setattr(self, key, kwargs[key]) + self.dict = kwargs + + def __repr__(self): + return "<%r %s>" % (str(self.__class__), self.name) + +class Signal(Docable): + attrs = ['name', 'returns', 'args'] + +class Arg(Docable): + attrs = ['name', 'type', 'range', 'flags', 'nick', 'blurb', 'default'] + +class GDoc: + def load_file(self, filename): + try: + lines = open(filename).readlines() + self.load_data("".join(lines)) + except IOError: + print "WARNING - could not read from %s" % filename + + def save_file(self, filename, backup=False): + """ + Save the information to the given file if the file content changed. + """ + olddata = None + try: + lines = open(filename).readlines() + olddata = "".join(lines) + except IOError: + print "WARNING - could not read from %s" % filename + newdata = self.get_data() + if olddata and olddata == newdata: + return + + if olddata: + if backup: + os.rename(filename, filename + '.bak') + + handle = open(filename, "w") + handle.write(newdata) + handle.close() + +class Signals(GDoc): + def __init__(self): + self._objects = OrderedDict() + + def load_data(self, data): + """ + Load the .signals lines, creating our list of objects and signals. + """ + import re + smatcher = re.compile( + '(?s)' # make . match \n + '\n(.*?)\n' + ) + nmatcher = re.compile( + '' + '(?P\S*)' # store object + '::' + '(?P\S*)' # store signal + '' + ) + rmatcher = re.compile( + '(?s)' # make . match \n + '(?P\S*)\n' # store returns + '(?P.*)' # store args + ) + for block in smatcher.findall(data): + nmatch = nmatcher.search(block) + if nmatch: + o = nmatch.group('object') + debug("Found object", o) + debug("Found signal", nmatch.group('signal')) + if not self._objects.has_key(o): + object = Object(o) + self._objects[o] = object + + rmatch = rmatcher.search(block) + if rmatch: + dict = rmatch.groupdict().copy() + dict['name'] = nmatch.group('signal') + signal = Signal(**dict) + self._objects[o].add_signal(signal) + + def get_data(self): + lines = [] + for o in self._objects.values(): + for s in o._signals.values(): + block = """ +%(object)s::%(name)s +%(returns)s +%(args)s +""" + d = s.dict.copy() + d['object'] = o.name + lines.append(block % d) + + return "\n".join(lines) + '\n' + +class Args(GDoc): + def __init__(self): + self._objects = OrderedDict() + + def load_data(self, data): + """ + Load the .args lines, creating our list of objects and args. + """ + import re + amatcher = re.compile( + '(?s)' # make . match \n + '\n(.*?)\n' + ) + nmatcher = re.compile( + '' + '(?P\S*)' # store object + '::' + '(?P\S*)' # store arg + '' + ) + rmatcher = re.compile( + '(?s)' # make . match \n + '(?P\S*)\n' # store type + '(?P.*?)\n' # store range + '(?P\S*)\n' # store flags + '(?P.*?)\n' # store nick + '(?P.*?)\n' # store blurb + '(?P.*?)\n' # store default + ) + for block in amatcher.findall(data): + nmatch = nmatcher.search(block) + if nmatch: + o = nmatch.group('object') + debug("Found object", o) + debug("Found arg", nmatch.group('arg')) + if not self._objects.has_key(o): + object = Object(o) + self._objects[o] = object + + rmatch = rmatcher.search(block) + if rmatch: + dict = rmatch.groupdict().copy() + dict['name'] = nmatch.group('arg') + arg = Arg(**dict) + self._objects[o].add_arg(arg) + else: + print "ERROR: could not match arg from block %s" % block + + def get_data(self): + lines = [] + for o in self._objects.values(): + for a in o._args.values(): + block = """ +%(object)s::%(name)s +%(type)s +%(range)s +%(flags)s +%(nick)s +%(blurb)s +%(default)s + +""" + d = a.dict.copy() + d['object'] = o.name + lines.append(block % d) + + return "\n".join(lines) + '\n' + +class SingleLine(GDoc): + def __init__(self): + self._objects = [] + + def load_data(self, data): + """ + Load the .interfaces/.prerequisites lines, merge duplicates + """ + # split data on '\n' + lines = data.splitlines(); + # merge them into self._objects + for line in lines: + if line not in self._objects: + self._objects.append(line) + + def get_data(self): + lines = sorted(self._objects) + return "\n".join(lines) + '\n' + +def main(argv): + modulename = None + try: + modulename = argv[1] + except IndexError: + sys.stderr.write('Please provide a documentation module name\n') + sys.exit(1) + + signals = Signals() + signals.load_file(modulename + '.signals') + signals.load_file(modulename + '.signals.new') + signals.save_file(modulename + '.signals', backup=True) + os.unlink(modulename + '.signals.new') + + args = Args() + args.load_file(modulename + '.args') + args.load_file(modulename + '.args.new') + args.save_file(modulename + '.args', backup=True) + os.unlink(modulename + '.args.new') + + ifaces = SingleLine() + ifaces.load_file(modulename + '.interfaces') + ifaces.load_file(modulename + '.interfaces.new') + ifaces.save_file(modulename + '.interfaces', backup=True) + os.unlink(modulename + '.interfaces.new') + + prereq = SingleLine() + prereq.load_file(modulename + '.prerequisites') + prereq.load_file(modulename + '.prerequisites.new') + prereq.save_file(modulename + '.prerequisites', backup=True) + os.unlink(modulename + '.prerequisites.new') + +main(sys.argv) diff --git a/common/upload-doc.mak b/common/upload-doc.mak new file mode 100644 index 0000000..3bf9496 --- /dev/null +++ b/common/upload-doc.mak @@ -0,0 +1,66 @@ +# this snippet is to be included by both our docbook manuals +# and gtk-doc API references + +# it adds an upload target to each of these dir's Makefiles + +# each Makefile.am should define the following variables: +# - DOC: the base name of the documentation +# (faq, manual, pwg, gstreamer, gstreamer-libs) +# - FORMATS: the formats in which DOC is output +# (html ps pdf) + +# if you want to use it, make sure your $HOME/.ssh/config file contains the +# correct User entry for the Host entry for the DOC_SERVER + +# these variables define the location of the online docs +DOC_SERVER = gstreamer.freedesktop.org +DOC_BASE = /srv/gstreamer.freedesktop.org/www/data/doc +DOC_URL = $(DOC_SERVER):$(DOC_BASE) + +upload: $(FORMATS) + @if echo $(FORMATS) | grep html > /dev/null; then \ + echo "Preparing docs for upload (rebasing cross-references) ..." ; \ + if test x$(builddir) != x$(srcdir); then \ + echo "make upload can only be used if srcdir == builddir"; \ + exit 1; \ + fi; \ + # gtkdoc-rebase sometimes gets confused, so reset everything to \ + # local links before rebasing to online links \ + gtkdoc-rebase --html-dir=$(builddir)/html 2>/dev/null 2>/dev/null ; \ + rebase=`gtkdoc-rebase --verbose --online --html-dir=$(builddir)/html` ; \ + echo "$$rebase" | grep -e "On-*line"; \ + for req in glib gobject gstreamer gstreamer-libs gst-plugins-base-libs; do \ + if ! ( echo "$$rebase" | grep -i -e "On-*line.*/$$req/" ); then \ + echo "===============================================================================" ; \ + echo " Could not determine online location for $$req docs. Cross-referencing will be " ; \ + echo " broken, so not uploading. Make sure the library's gtk-doc documentation is " ; \ + echo " installed somewhere in /usr/share/gtk-doc. " ; \ + echo "===============================================================================" ; \ + exit 1; \ + fi; \ + done; \ + export SRC="$$SRC html"; \ + fi; \ + if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \ + if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \ + \ + # upload releases to both 0.10.X/ and head/ subdirectories \ + if test "x$(PACKAGE_VERSION_NANO)" = x0; then \ + export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \ + echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) mkdir -p $$DIR; \ + rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ + fi; \ + \ + export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \ + echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) mkdir -p $$DIR; \ + rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ + \ + if echo $(FORMATS) | grep html > /dev/null; then \ + echo "Un-preparing docs for upload (rebasing cross-references) ..." ; \ + gtkdoc-rebase --html-dir=$(builddir)/html ; \ + fi; \ + echo Done diff --git a/common/win32.mak b/common/win32.mak new file mode 100644 index 0000000..94afaec --- /dev/null +++ b/common/win32.mak @@ -0,0 +1,72 @@ +# various tests to make sure we dist the win32 stuff (for MSVC builds) right + +# the MANIFEST contains all win32 related files that should be disted +win32 = $(shell cat $(top_srcdir)/win32/MANIFEST) + +# wildcard is apparently not portable to other makes, hence the use of find +# these are library .def files with the symbols to export +win32defs = $(shell find $(top_srcdir)/win32/common -name '*.def') + +# wildcard is apparently not portable to other makes, hence the use of find +# these are files that need to be disted with CRLF line endings: +win32crlf = $(shell find $(top_srcdir)/win32 -name '*.dsw' -o -name '*.dsp') + +win32-debug: + @echo; \ + echo win32 = $(win32); \ + echo; \ + echo win32defs = $(win32defs); \ + echo; \ + echo win32crlf = $(win32crlf); \ + echo + +win32-check-crlf: + @echo Checking win32 files for CR LF line endings ...; \ + fail=0 ; \ + for each in $(win32crlf) ; do \ + result=`perl -e 'print grep(/\r\n/,<>)' "$$each" | wc -l`; \ + if test "$$result" = 0 ; then \ + echo $$each must be fixed to have CRLF line endings ; \ + fail=1; \ + fi ; \ + done ; \ + exit $$fail + +# make sure all symbols we export on linux are defined in the win32 .def too +# (don't care about other unixes for now, it's enough if it works on one of +# the linux build bots; we assume .so ) +check-exports: + @fail=0 ; \ + for l in $(win32defs); do \ + libbase=`basename "$$l" ".def"`; \ + libso=`find "$(top_builddir)" -name "$$libbase-@GST_MAJORMINOR@.so" | grep -v /_build/ | head -n1`; \ + libdef="$(top_srcdir)/win32/common/$$libbase.def"; \ + if test "x$$libso" != "x"; then \ + echo Checking symbols in $$libso; \ + if ! ($(top_srcdir)/common/check-exports $$libdef $$libso) ; then \ + fail=1; \ + fi; \ + fi; \ + done ; \ + if test $$fail != 0; then \ + echo '-----------------------------------------------------------'; \ + echo 'Run this to update the .def files:'; \ + echo 'make check-exports 2>&1 | patch -p1'; \ + echo '-----------------------------------------------------------'; \ + fi; \ + exit $$fail + +# complain about nonportable printf format strings (%lld, %llu, %zu etc.) +check-nonportable-print-format: + @fail=0 ; \ + loc=`find "$(top_srcdir)" -name '*.c' | xargs grep -n -e '%[0-9]*ll[udx]' -e '%[0-9]*z[udx]'`; \ + if test "x$$loc" != "x"; then \ + echo "Please fix the following print format strings:" ; \ + find "$(top_srcdir)" -name '*.c' | xargs grep -n -e '%[0-9]*ll[udx]' -e '%[0-9]*z[udx]'; \ + fail=1; \ + fi; \ + exit $$fail + +dist-hook: check-exports win32-check-crlf + + diff --git a/compile b/compile new file mode 100755 index 0000000..b1f4749 --- /dev/null +++ b/compile @@ -0,0 +1,310 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-01-04.17; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free +# Software Foundation, Inc. +# Written by Tom Tromey . +# +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l*) + lib=${1#-l} + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + set x "$@" "$dir/$lib.dll.lib" + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + set x "$@" "$dir/$lib.lib" + break + fi + done + IFS=$save_IFS + + test "$found" != yes && set x "$@" "$lib.lib" + shift + ;; + -L*) + func_file_conv "${1#-L}" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..40eaed4 --- /dev/null +++ b/config.guess @@ -0,0 +1,1517 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011 Free Software Foundation, Inc. + +timestamp='2011-05-11' + +# This file 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 of the License, 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., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-tilera-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..53c97d2 --- /dev/null +++ b/config.h.in @@ -0,0 +1,436 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Default audio sink */ +#undef DEFAULT_AUDIOSINK + +/* Default audio source */ +#undef DEFAULT_AUDIOSRC + +/* Default video sink */ +#undef DEFAULT_VIDEOSINK + +/* Default video source */ +#undef DEFAULT_VIDEOSRC + +/* Default visualizer */ +#undef DEFAULT_VISUALIZER + +/* Disable Orc */ +#undef DISABLE_ORC + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* gettext package name */ +#undef GETTEXT_PACKAGE + +/* Defined if gcov is enabled to force a rebuild due to config.h changing */ +#undef GST_GCOV_ENABLED + +/* Default errorlevel to use */ +#undef GST_LEVEL_DEFAULT + +/* GStreamer license */ +#undef GST_LICENSE + +/* package name in plugins */ +#undef GST_PACKAGE_NAME + +/* package origin */ +#undef GST_PACKAGE_ORIGIN + +/* GStreamer package release date/time for plugins as YYYY-MM-DD */ +#undef GST_PACKAGE_RELEASE_DATETIME + +/* struct v4l2_buffer missing */ +#undef GST_V4L2_MISSING_BUFDECL + +/* I know the API is subject to change. */ +#undef G_UDEV_API_IS_SUBJECT_TO_CHANGE + +/* Define to enable aalib ASCII Art library (used by aasink). */ +#undef HAVE_AALIB + +/* Define to enable XML library (used by annodex). */ +#undef HAVE_ANNODEX + +/* Define to 1 if you have the `asinh' function. */ +#undef HAVE_ASINH + +/* Define to enable bz2 library for matroska . */ +#undef HAVE_BZ2 + +/* Define to enable Cairo graphics rendering (used by cairo). */ +#undef HAVE_CAIRO + +/* Define to enable Cairo graphics rendering gobject bindings (used by + cairooverlay). */ +#undef HAVE_CAIRO_GOBJECT + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +#undef HAVE_CFLOCALECOPYCURRENT + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +#undef HAVE_CFPREFERENCESCOPYAPPVALUE + +/* Define to 1 if you have the `cosh' function. */ +#undef HAVE_COSH + +/* Define if the host CPU is an Alpha */ +#undef HAVE_CPU_ALPHA + +/* Define if the host CPU is an ARM */ +#undef HAVE_CPU_ARM + +/* Define if the host CPU is a CRIS */ +#undef HAVE_CPU_CRIS + +/* Define if the host CPU is a CRISv32 */ +#undef HAVE_CPU_CRISV32 + +/* Define if the host CPU is a HPPA */ +#undef HAVE_CPU_HPPA + +/* Define if the host CPU is an x86 */ +#undef HAVE_CPU_I386 + +/* Define if the host CPU is a IA64 */ +#undef HAVE_CPU_IA64 + +/* Define if the host CPU is a M68K */ +#undef HAVE_CPU_M68K + +/* Define if the host CPU is a MIPS */ +#undef HAVE_CPU_MIPS + +/* Define if the host CPU is a PowerPC */ +#undef HAVE_CPU_PPC + +/* Define if the host CPU is a 64 bit PowerPC */ +#undef HAVE_CPU_PPC64 + +/* Define if the host CPU is a S390 */ +#undef HAVE_CPU_S390 + +/* Define if the host CPU is a SPARC */ +#undef HAVE_CPU_SPARC + +/* Define if the host CPU is a x86_64 */ +#undef HAVE_CPU_X86_64 + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to enable DirectSound plug-in (used by directsoundsink). */ +#undef HAVE_DIRECTSOUND + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* define for working do while(0) macros */ +#undef HAVE_DOWHILE_MACROS + +/* Define to enable raw1394 and avc1394 library (used by 1394). */ +#undef HAVE_DV1394 + +/* Define to enable ESounD sound daemon (used by esdsink). */ +#undef HAVE_ESD + +/* Define to enable building of experimental plug-ins. */ +#undef HAVE_EXPERIMENTAL + +/* Define to enable building of plug-ins with external deps. */ +#undef HAVE_EXTERNAL + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* FIONREAD ioctl found in sys/filio.h */ +#undef HAVE_FIONREAD_IN_SYS_FILIO + +/* FIONREAD ioctl found in sys/ioclt.h */ +#undef HAVE_FIONREAD_IN_SYS_IOCTL + +/* Define to enable FLAC lossless audio (used by flac). */ +#undef HAVE_FLAC + +/* Define to 1 if you have the `fpclass' function. */ +#undef HAVE_FPCLASS + +/* Define if compiler supports gcc inline assembly */ +#undef HAVE_GCC_ASM + +/* Define to enable GConf libraries (used by gconfelements). */ +#undef HAVE_GCONF + +/* Define to enable GConf schemas. */ +#undef HAVE_GCONFTOOL + +/* Define to enable GDK pixbuf (used by gdkpixbuf). */ +#undef HAVE_GDK_PIXBUF + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to enable Video 4 Linux 2 (used by v4l2src). */ +#undef HAVE_GST_V4L2 + +/* Whether gudev is available for device detection */ +#undef HAVE_GUDEV + +/* Define to enable HAL libraries (used by halelements). */ +#undef HAVE_HAL + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if we have struct ip_mreqn */ +#undef HAVE_IP_MREQN + +/* Define to 1 if you have the `isinf' function. */ +#undef HAVE_ISINF + +/* Define to enable Jack (used by jack). */ +#undef HAVE_JACK + +/* defined if jack >= 0.120.1 is available */ +#undef HAVE_JACK_0_120_1 + +/* defined if jack >= 1.9.7 is available */ +#undef HAVE_JACK_1_9_7 + +/* Define to enable jpeg library (used by jpeg). */ +#undef HAVE_JPEG + +/* Define to enable libcaca coloured ASCII art (used by cacasink). */ +#undef HAVE_LIBCACA + +/* Define to enable libdv DV demuxer/decoder (used by dv). */ +#undef HAVE_LIBDV + +/* Define to enable Portable Network Graphics library (used by png). */ +#undef HAVE_LIBPNG + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#undef HAVE_LIBSOCKET + +/* soup gnome integration */ +#undef HAVE_LIBSOUP_GNOME + +/* Whether libv4l2 is available for video buffer conversion */ +#undef HAVE_LIBV4L2 + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Use Orc */ +#undef HAVE_ORC + +/* Define to enable OSS audio (used by ossaudio). */ +#undef HAVE_OSS + +/* Define to enable Open Sound System 4 (used by oss4). */ +#undef HAVE_OSS4 + +/* Define if OSS includes are in /machine/ */ +#undef HAVE_OSS_INCLUDE_IN_MACHINE + +/* Define if OSS includes are in / */ +#undef HAVE_OSS_INCLUDE_IN_ROOT + +/* Define if OSS includes are in /sys/ */ +#undef HAVE_OSS_INCLUDE_IN_SYS + +/* Define to enable OSX audio (used by osxaudio). */ +#undef HAVE_OSX_AUDIO + +/* Define to enable OSX video (used by osxvideosink). */ +#undef HAVE_OSX_VIDEO + +/* Define to 1 if you have the header file. */ +#undef HAVE_PROCESS_H + +/* Define to enable pulseaudio plug-in (used by pulseaudio). */ +#undef HAVE_PULSE + +/* defined if pulseaudio >= 0.9.20 is available */ +#undef HAVE_PULSE_0_9_20 + +/* defined if pulseaudio >= 1.0 is available */ +#undef HAVE_PULSE_1_0 + +/* Define if RDTSC is available */ +#undef HAVE_RDTSC + +/* Define to 1 if you have the `rint' function. */ +#undef HAVE_RINT + +/* Define to enable Shoutcast/Icecast client library (used by shout2). */ +#undef HAVE_SHOUT2 + +/* Define to 1 if you have the `sinh' function. */ +#undef HAVE_SINH + +/* Define to enable soup http client plugin (2.4) (used by souphttpsrc). */ +#undef HAVE_SOUP + +/* Define to enable speex speech codec (used by speex). */ +#undef HAVE_SPEEX + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to enable Sun Audio (used by sunaudio). */ +#undef HAVE_SUNAUDIO + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to enable taglib tagging library (used by taglib). */ +#undef HAVE_TAGLIB + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if valgrind should be used */ +#undef HAVE_VALGRIND + +/* Define to enable wavpack plug-in (used by wavpack). */ +#undef HAVE_WAVPACK + +/* Define to 1 if you have the header file. */ +#undef HAVE_WINSOCK2_H + +/* Define to enable X libraries and plugins (used by ximagesrc). */ +#undef HAVE_X + +/* Define to enable X Shared Memory extension. */ +#undef HAVE_XSHM + +/* Define to enable X11 XVideo extensions. */ +#undef HAVE_XVIDEO + +/* Define to enable zlib support for qtdemux/matroska. */ +#undef HAVE_ZLIB + +/* the host CPU */ +#undef HOST_CPU + +/* gettext locale dir */ +#undef LOCALEDIR + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* directory where plugins are located */ +#undef PLUGINDIR + +/* The size of `char', as computed by sizeof. */ +#undef SIZEOF_CHAR + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `void*', as computed by sizeof. */ +#undef SIZEOF_VOIDP + +/* defined if speex 1.0.x API detected */ +#undef SPEEX_1_0 + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* old wavpack API */ +#undef WAVPACK_OLD_API + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to 1 if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING diff --git a/config.rpath b/config.rpath new file mode 100755 index 0000000..c547c68 --- /dev/null +++ b/config.rpath @@ -0,0 +1,666 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2007 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix4* | aix5*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + library_names_spec='$libname.a' + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + nto-qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ + | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile-* | tilegx-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + # This must be matched before tile*. + tilegx*) + basic_machine=tilegx-unknown + os=-linux-gnu + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..d9aae90 --- /dev/null +++ b/configure @@ -0,0 +1,40834 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68 for GStreamer Good Plug-ins 0.10.31. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='GStreamer Good Plug-ins' +PACKAGE_TARNAME='gst-plugins-good' +PACKAGE_VERSION='0.10.31' +PACKAGE_STRING='GStreamer Good Plug-ins 0.10.31' +PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer' +PACKAGE_URL='' + +ac_unique_file="gst/law/alaw.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +gt_needs= +ac_header_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +GST_PLUGIN_LDFLAGS +GST_ALL_LDFLAGS +GST_CXXFLAGS +GST_LT_LDFLAGS +GST_OPTION_CXXFLAGS +GST_OPTION_CFLAGS +DEPRECATED_CFLAGS +PROFILE_CFLAGS +USE_BZ2_FALSE +USE_BZ2_TRUE +BZ2_LIBS +HAVE_BZ2 +USE_ZLIB_FALSE +USE_ZLIB_TRUE +HAVE_ZLIB +ZLIB_LIBS +USE_WAVPACK_FALSE +USE_WAVPACK_TRUE +WAVPACK_LIBS +WAVPACK_CFLAGS +USE_TAGLIB_FALSE +USE_TAGLIB_TRUE +TAGLIB_CXXFLAGS +TAGLIB_LIBS +TAGLIB_CFLAGS +USE_SPEEX_FALSE +USE_SPEEX_TRUE +HAVE_SPEEX +SPEEX_LIBS +SPEEX_CFLAGS +USE_SOUP_FALSE +USE_SOUP_TRUE +SOUP_LIBS +SOUP_CFLAGS +USE_SHOUT2_FALSE +USE_SHOUT2_TRUE +SHOUT2_LIBS +SHOUT2_CFLAGS +USE_LIBIEC61883_FALSE +USE_LIBIEC61883_TRUE +USE_DV1394_FALSE +USE_DV1394_TRUE +DV1394_LIBS +DV1394_CFLAGS +HAVE_ROM1394 +HAVE_AVC1394 +LIBIEC61883_LIBS +LIBIEC61883_CFLAGS +RAW1394_LIBS +RAW1394_CFLAGS +USE_PULSE_FALSE +USE_PULSE_TRUE +PULSE_1_0_LIBS +PULSE_1_0_CFLAGS +PULSE_0_9_20_LIBS +PULSE_0_9_20_CFLAGS +PULSE_LIBS +PULSE_CFLAGS +USE_LIBPNG_FALSE +USE_LIBPNG_TRUE +LIBPNG_LIBS +LIBPNG_CFLAGS +USE_LIBDV_FALSE +USE_LIBDV_TRUE +LIBDV_LIBS +LIBDV_CFLAGS +USE_LIBCACA_FALSE +USE_LIBCACA_TRUE +LIBCACA_LIBS +LIBCACA_CFLAGS +USE_JPEG_FALSE +USE_JPEG_TRUE +JPEG_LIBS +USE_JACK_FALSE +USE_JACK_TRUE +JACK_1_9_7_LIBS +JACK_1_9_7_CFLAGS +JACK_0_120_1_LIBS +JACK_0_120_1_CFLAGS +JACK_LIBS +JACK_CFLAGS +USE_HAL_FALSE +USE_HAL_TRUE +HAL_LIBS +HAL_CFLAGS +USE_GDK_PIXBUF_FALSE +USE_GDK_PIXBUF_TRUE +GDK_PIXBUF_LIBS +GDK_PIXBUF_CFLAGS +USE_GCONF_FALSE +USE_GCONF_TRUE +GCONF_LIBS +GCONF_CFLAGS +USE_FLAC_FALSE +USE_FLAC_TRUE +FLAC_LIBS +FLAC_CFLAGS +USE_ESD_FALSE +USE_ESD_TRUE +ESD_CONFIG +ESD_LIBS +ESD_CFLAGS +USE_CAIRO_GOBJECT_FALSE +USE_CAIRO_GOBJECT_TRUE +CAIRO_GOBJECT_LIBS +CAIRO_GOBJECT_CFLAGS +USE_CAIRO_FALSE +USE_CAIRO_TRUE +CAIRO_LIBS +CAIRO_CFLAGS +USE_ANNODEX_FALSE +USE_ANNODEX_TRUE +ANNODEX_LIBS +ANNODEX_CFLAGS +USE_AALIB_FALSE +USE_AALIB_TRUE +AALIB_LIBS +AALIB_CFLAGS +AALIB_CONFIG +USE_XVIDEO_FALSE +USE_XVIDEO_TRUE +USE_XSHM_FALSE +USE_XSHM_TRUE +XSHM_LIBS +HAVE_XSHM +USE_X_FALSE +USE_X_TRUE +HAVE_X +XDAMAGE_LIBS +XDAMAGE_CFLAGS +XFIXES_LIBS +XFIXES_CFLAGS +X_EXTRA_LIBS +X_LIBS +X_PRE_LIBS +X_CFLAGS +XMKMF +LIBV4L2_LIBS +LIBV4L2_CFLAGS +GUDEV_LIBS +GUDEV_CFLAGS +USE_GST_V4L2_FALSE +USE_GST_V4L2_TRUE +XVIDEO_LIBS +USE_OSX_VIDEO_FALSE +USE_OSX_VIDEO_TRUE +USE_OSX_AUDIO_FALSE +USE_OSX_AUDIO_TRUE +USE_SUNAUDIO_FALSE +USE_SUNAUDIO_TRUE +USE_OSS4_FALSE +USE_OSS4_TRUE +USE_OSS_FALSE +USE_OSS_TRUE +USE_DIRECTSOUND_FALSE +USE_DIRECTSOUND_TRUE +HAVE_DIRECTSOUND +DIRECTSOUND_LIBS +DIRECTSOUND_LDFLAGS +DIRECTSOUND_CFLAGS +WIN32_LIBS +USE_PLUGIN_Y4M_FALSE +USE_PLUGIN_Y4M_TRUE +USE_PLUGIN_WAVPARSE_FALSE +USE_PLUGIN_WAVPARSE_TRUE +USE_PLUGIN_WAVENC_FALSE +USE_PLUGIN_WAVENC_TRUE +USE_PLUGIN_VIDEOMIXER_FALSE +USE_PLUGIN_VIDEOMIXER_TRUE +USE_PLUGIN_VIDEOCROP_FALSE +USE_PLUGIN_VIDEOCROP_TRUE +USE_PLUGIN_VIDEOBOX_FALSE +USE_PLUGIN_VIDEOBOX_TRUE +USE_PLUGIN_UDP_FALSE +USE_PLUGIN_UDP_TRUE +USE_PLUGIN_SPECTRUM_FALSE +USE_PLUGIN_SPECTRUM_TRUE +USE_PLUGIN_SMPTE_FALSE +USE_PLUGIN_SMPTE_TRUE +USE_PLUGIN_SHAPEWIPE_FALSE +USE_PLUGIN_SHAPEWIPE_TRUE +USE_PLUGIN_RTSP_FALSE +USE_PLUGIN_RTSP_TRUE +USE_PLUGIN_RTPMANAGER_FALSE +USE_PLUGIN_RTPMANAGER_TRUE +USE_PLUGIN_RTP_FALSE +USE_PLUGIN_RTP_TRUE +USE_PLUGIN_REPLAYGAIN_FALSE +USE_PLUGIN_REPLAYGAIN_TRUE +USE_PLUGIN_MULTIPART_FALSE +USE_PLUGIN_MULTIPART_TRUE +USE_PLUGIN_MULTIFILE_FALSE +USE_PLUGIN_MULTIFILE_TRUE +USE_PLUGIN_MONOSCOPE_FALSE +USE_PLUGIN_MONOSCOPE_TRUE +USE_PLUGIN_MATROSKA_FALSE +USE_PLUGIN_MATROSKA_TRUE +USE_PLUGIN_LEVEL_FALSE +USE_PLUGIN_LEVEL_TRUE +USE_PLUGIN_LAW_FALSE +USE_PLUGIN_LAW_TRUE +USE_PLUGIN_ISOMP4_FALSE +USE_PLUGIN_ISOMP4_TRUE +USE_PLUGIN_IMAGEFREEZE_FALSE +USE_PLUGIN_IMAGEFREEZE_TRUE +USE_PLUGIN_GOOM2K1_FALSE +USE_PLUGIN_GOOM2K1_TRUE +USE_PLUGIN_GOOM_FALSE +USE_PLUGIN_GOOM_TRUE +USE_PLUGIN_FLX_FALSE +USE_PLUGIN_FLX_TRUE +USE_PLUGIN_INTERLEAVE_FALSE +USE_PLUGIN_INTERLEAVE_TRUE +USE_PLUGIN_ICYDEMUX_FALSE +USE_PLUGIN_ICYDEMUX_TRUE +USE_PLUGIN_ID3DEMUX_FALSE +USE_PLUGIN_ID3DEMUX_TRUE +USE_PLUGIN_FLV_FALSE +USE_PLUGIN_FLV_TRUE +USE_PLUGIN_EQUALIZER_FALSE +USE_PLUGIN_EQUALIZER_TRUE +USE_PLUGIN_EFFECTV_FALSE +USE_PLUGIN_EFFECTV_TRUE +USE_PLUGIN_DEINTERLACE_FALSE +USE_PLUGIN_DEINTERLACE_TRUE +USE_PLUGIN_DEBUGUTILS_FALSE +USE_PLUGIN_DEBUGUTILS_TRUE +USE_PLUGIN_CUTTER_FALSE +USE_PLUGIN_CUTTER_TRUE +USE_PLUGIN_AVI_FALSE +USE_PLUGIN_AVI_TRUE +USE_PLUGIN_AUTODETECT_FALSE +USE_PLUGIN_AUTODETECT_TRUE +USE_PLUGIN_AUPARSE_FALSE +USE_PLUGIN_AUPARSE_TRUE +USE_PLUGIN_AUDIOPARSERS_FALSE +USE_PLUGIN_AUDIOPARSERS_TRUE +USE_PLUGIN_AUDIOFX_FALSE +USE_PLUGIN_AUDIOFX_TRUE +USE_PLUGIN_APETAG_FALSE +USE_PLUGIN_APETAG_TRUE +USE_PLUGIN_ALPHA_FALSE +USE_PLUGIN_ALPHA_TRUE +USE_PLUGIN_VIDEOFILTER_FALSE +USE_PLUGIN_VIDEOFILTER_TRUE +DEFAULT_VISUALIZER +DEFAULT_VIDEOSRC +DEFAULT_VIDEOSINK +DEFAULT_AUDIOSRC +DEFAULT_AUDIOSINK +GST_LEVEL_DEFAULT +ERROR_CXXFLAGS +WARNING_CXXFLAGS +ERROR_CFLAGS +WARNING_CFLAGS +plugindir +PLUGINDIR +GST_LICENSE +USE_GCONFTOOL_FALSE +USE_GCONFTOOL_TRUE +HAVE_GCONFTOOL +GCONFTOOL +HAVE_GTK_X11_FALSE +HAVE_GTK_X11_TRUE +HAVE_GTK_FALSE +HAVE_GTK_TRUE +GTK_X11_LIBS +GTK_X11_CFLAGS +GTK_LIBS +GTK_CFLAGS +GSTPB_PREFIX +GST_PREFIX +GLIB_PREFIX +HAVE_GST_CHECK_FALSE +HAVE_GST_CHECK_TRUE +GSTPB_PLUGINS_DIR +GST_PLUGINS_BASE_DIR +GST_PLUGINS_BASE_LIBS +GST_PLUGINS_BASE_CFLAGS +GST_CHECK_LIBS +GST_CHECK_CFLAGS +GST_CONTROLLER_LIBS +GST_CONTROLLER_CFLAGS +GST_GDP_LIBS +GST_GDP_CFLAGS +GST_BASE_LIBS +GST_BASE_CFLAGS +GST_PLUGINS_DIR +GST_TOOLS_DIR +GST_LIBS +GST_CFLAGS +HAVE_ORCC_FALSE +HAVE_ORCC_TRUE +HAVE_ORC_FALSE +HAVE_ORC_TRUE +ORCC_FLAGS +ORCC +ORC_LIBS +ORC_CFLAGS +GIO_LIBS +GIO_CFLAGS +GLIB_EXTRA_CFLAGS +GLIB_LIBS +GLIB_CFLAGS +GLIB_REQ +GST_HAVE_MMAP_FALSE +GST_HAVE_MMAP_TRUE +HAVE_GCC_ASM_FALSE +HAVE_GCC_ASM_TRUE +HAVE_WINSOCK2_H_FALSE +HAVE_WINSOCK2_H_TRUE +LIBM +ENABLE_PLUGIN_DOCS_FALSE +ENABLE_PLUGIN_DOCS_TRUE +pkgpyexecdir +pyexecdir +pkgpythondir +pythondir +PYTHON_PLATFORM +PYTHON_EXEC_PREFIX +PYTHON_PREFIX +PYTHON_VERSION +PYTHON +GTK_DOC_USE_LIBTOOL_FALSE +GTK_DOC_USE_LIBTOOL_TRUE +ENABLE_GTK_DOC_FALSE +ENABLE_GTK_DOC_TRUE +GTKDOC_CHECK +HTML_DIR +GCONF_SCHEMAS_INSTALL_FALSE +GCONF_SCHEMAS_INSTALL_TRUE +GCONF_SCHEMA_FILE_DIR +GCONF_SCHEMA_CONFIG_SOURCE +HAVE_VALGRIND_FALSE +HAVE_VALGRIND_TRUE +VALGRIND_PATH +am__fastdepCCAS_FALSE +am__fastdepCCAS_TRUE +CCASDEPMODE +CCAS +am__fastdepOBJC_FALSE +am__fastdepOBJC_TRUE +OBJCDEPMODE +OBJC_LDFLAGS +ac_ct_OBJC +OBJC +HAVE_CXX +CXXCPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXX +HAVE_CPU_CRISV32_FALSE +HAVE_CPU_CRISV32_TRUE +HAVE_CPU_CRIS_FALSE +HAVE_CPU_CRIS_TRUE +HAVE_CPU_X86_64_FALSE +HAVE_CPU_X86_64_TRUE +HAVE_CPU_M68K_FALSE +HAVE_CPU_M68K_TRUE +HAVE_CPU_IA64_FALSE +HAVE_CPU_IA64_TRUE +HAVE_CPU_S390_FALSE +HAVE_CPU_S390_TRUE +HAVE_CPU_MIPS_FALSE +HAVE_CPU_MIPS_TRUE +HAVE_CPU_HPPA_FALSE +HAVE_CPU_HPPA_TRUE +HAVE_CPU_SPARC_FALSE +HAVE_CPU_SPARC_TRUE +HAVE_CPU_ARM_FALSE +HAVE_CPU_ARM_TRUE +HAVE_CPU_ALPHA_FALSE +HAVE_CPU_ALPHA_TRUE +HAVE_CPU_PPC64_FALSE +HAVE_CPU_PPC64_TRUE +HAVE_CPU_PPC_FALSE +HAVE_CPU_PPC_TRUE +HAVE_CPU_I386_FALSE +HAVE_CPU_I386_TRUE +BUILD_EXPERIMENTAL_FALSE +BUILD_EXPERIMENTAL_TRUE +USE_EXPERIMENTAL_FALSE +USE_EXPERIMENTAL_TRUE +BUILD_EXTERNAL_FALSE +BUILD_EXTERNAL_TRUE +USE_EXTERNAL_FALSE +USE_EXTERNAL_TRUE +GST_PLUGINS_SELECTED +GST_PLUGINS_ALL +GST_PACKAGE_ORIGIN +GST_PACKAGE_NAME +BUILD_EXAMPLES_FALSE +BUILD_EXAMPLES_TRUE +GST_GCOV_ENABLED_FALSE +GST_GCOV_ENABLED_TRUE +CCASFLAGS +FFLAGS +CXXFLAGS +GCOV +GCOV_LIBS +GCOV_CFLAGS +VALGRIND_LIBS +VALGRIND_CFLAGS +PKG_CONFIG +LOCALEDIR +GETTEXT_PACKAGE +POSUB +LTLIBINTL +LIBINTL +INTLLIBS +LTLIBICONV +LIBICONV +INTL_MACOSX_LIBS +XGETTEXT_EXTRA_OPTIONS +MSGMERGE +XGETTEXT_015 +XGETTEXT +GMSGFMT_015 +MSGFMT_015 +GMSGFMT +MSGFMT +GETTEXT_MACRO_VERSION +USE_NLS +ACLOCAL_AMFLAGS +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +LIBTOOL +OBJDUMP +DLLTOOL +AS +GST_MAJORMINOR +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +PACKAGE_VERSION_RELEASE +PACKAGE_VERSION_NANO +PACKAGE_VERSION_MICRO +PACKAGE_VERSION_MINOR +PACKAGE_VERSION_MAJOR +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_maintainer_mode +enable_silent_rules +enable_shared +enable_static +with_pic +enable_fast_install +enable_dependency_tracking +with_gnu_ld +with_sysroot +enable_libtool_lock +with_autoconf +with_autoheader +with_automake +with_aclocal +enable_nls +enable_rpath +with_libiconv_prefix +with_libintl_prefix +enable_debug +enable_profiling +enable_valgrind +enable_gcov +enable_examples +with_pkg_config_path +with_package_name +with_package_origin +with_plugins +enable_external +enable_experimental +with_gconf_source +with_gconf_schema_file_dir +enable_schemas_install +with_html_dir +enable_gtk_doc +enable_gobject_cast_checks +enable_glib_asserts +enable_orc +with_gtk +enable_gconftool +with_default_audiosink +with_default_audiosrc +with_default_videosink +with_default_videosrc +with_default_visualizer +enable_videofilter +enable_alpha +enable_apetag +enable_audiofx +enable_audioparsers +enable_auparse +enable_autodetect +enable_avi +enable_cutter +enable_debugutils +enable_deinterlace +enable_effectv +enable_equalizer +enable_flv +enable_id3demux +enable_icydemux +enable_interleave +enable_flx +enable_goom +enable_goom2k1 +enable_imagefreeze +enable_isomp4 +enable_law +enable_level +enable_matroska +enable_monoscope +enable_multifile +enable_multipart +enable_replaygain +enable_rtp +enable_rtpmanager +enable_rtsp +enable_shapewipe +enable_smpte +enable_spectrum +enable_udp +enable_videobox +enable_videocrop +enable_videomixer +enable_wavenc +enable_wavparse +enable_y4m +enable_directsound +enable_oss +enable_oss4 +enable_sunaudio +enable_osx_audio +enable_osx_video +enable_gst_v4l2 +with_gudev +with_libv4l2 +enable_x +with_x +enable_xshm +enable_xvideo +enable_aalib +with_aalib_prefix +with_aalib_exec_prefix +enable_aalibtest +enable_annodex +enable_cairo +enable_cairo_gobject +enable_esd +with_esd_prefix +with_esd_exec_prefix +enable_esdtest +enable_flac +enable_gconf +enable_gdk_pixbuf +enable_hal +enable_jack +enable_jpeg +with_jpeg_mmx +enable_libcaca +enable_libdv +enable_libpng +enable_pulse +enable_dv1394 +enable_shout2 +enable_soup +enable_speex +enable_taglib +enable_wavpack +enable_zlib +enable_bz2 +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +PKG_CONFIG +VALGRIND_CFLAGS +VALGRIND_LIBS +CXX +CXXFLAGS +CCC +CXXCPP +CCAS +CCASFLAGS +GLIB_CFLAGS +GLIB_LIBS +GIO_CFLAGS +GIO_LIBS +ORC_CFLAGS +ORC_LIBS +GST_CFLAGS +GST_LIBS +GST_BASE_CFLAGS +GST_BASE_LIBS +GST_GDP_CFLAGS +GST_GDP_LIBS +GST_CONTROLLER_CFLAGS +GST_CONTROLLER_LIBS +GST_CHECK_CFLAGS +GST_CHECK_LIBS +GST_PLUGINS_BASE_CFLAGS +GST_PLUGINS_BASE_LIBS +GTK_CFLAGS +GTK_LIBS +GTK_X11_CFLAGS +GTK_X11_LIBS +GUDEV_CFLAGS +GUDEV_LIBS +LIBV4L2_CFLAGS +LIBV4L2_LIBS +XMKMF +XFIXES_CFLAGS +XFIXES_LIBS +XDAMAGE_CFLAGS +XDAMAGE_LIBS +ANNODEX_CFLAGS +ANNODEX_LIBS +CAIRO_CFLAGS +CAIRO_LIBS +CAIRO_GOBJECT_CFLAGS +CAIRO_GOBJECT_LIBS +ESD_CFLAGS +ESD_LIBS +FLAC_CFLAGS +FLAC_LIBS +GCONF_CFLAGS +GCONF_LIBS +GDK_PIXBUF_CFLAGS +GDK_PIXBUF_LIBS +HAL_CFLAGS +HAL_LIBS +JACK_CFLAGS +JACK_LIBS +JACK_0_120_1_CFLAGS +JACK_0_120_1_LIBS +JACK_1_9_7_CFLAGS +JACK_1_9_7_LIBS +LIBCACA_CFLAGS +LIBCACA_LIBS +LIBDV_CFLAGS +LIBDV_LIBS +LIBPNG_CFLAGS +LIBPNG_LIBS +PULSE_CFLAGS +PULSE_LIBS +PULSE_0_9_20_CFLAGS +PULSE_0_9_20_LIBS +PULSE_1_0_CFLAGS +PULSE_1_0_LIBS +RAW1394_CFLAGS +RAW1394_LIBS +LIBIEC61883_CFLAGS +LIBIEC61883_LIBS +SHOUT2_CFLAGS +SHOUT2_LIBS +SOUP_CFLAGS +SOUP_LIBS +SPEEX_CFLAGS +SPEEX_LIBS +TAGLIB_CFLAGS +TAGLIB_LIBS +WAVPACK_CFLAGS +WAVPACK_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures GStreamer Good Plug-ins 0.10.31 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root + [DATAROOTDIR/doc/gst-plugins-good] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of GStreamer Good Plug-ins 0.10.31:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0') + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-nls do not use Native Language Support + --disable-rpath do not hardcode runtime library paths + --disable-debug disable addition of -g debugging info + --enable-profiling adds -pg to compiler commandline, for profiling + --disable-valgrind disable run-time valgrind detection + --enable-gcov compile with coverage profiling instrumentation (gcc + only) + --disable-examples disable building examples + --disable-external disable building of plug-ins with external deps + --enable-experimental enable building of experimental plug-ins + --disable-schemas-install Disable the schemas installation + --enable-gtk-doc use gtk-doc to build documentation [[default=no]] + --enable-gobject-cast-checks=[no/auto/yes] + Enable GObject cast checks + --enable-glib-asserts=[no/auto/yes] + Enable GLib assertion + --enable-orc use Orc if installed + --disable-gconftool disable GConf schemas + --disable-videofilter disable dependency-less videofilter plugin + --disable-alpha disable dependency-less alpha plugin + --disable-apetag disable dependency-less apetag plugin + --disable-audiofx disable dependency-less audiofx plugin + --disable-audioparsers disable dependency-less audioparsers plugin + --disable-auparse disable dependency-less auparse plugin + --disable-autodetect disable dependency-less autodetect plugin + --disable-avi disable dependency-less avi plugin + --disable-cutter disable dependency-less cutter plugin + --disable-debugutils disable dependency-less debugutils plugin + --disable-deinterlace disable dependency-less deinterlace plugin + --disable-effectv disable dependency-less effectv plugin + --disable-equalizer disable dependency-less equalizer plugin + --disable-flv disable dependency-less flv plugin + --disable-id3demux disable dependency-less id3demux plugin + --disable-icydemux disable dependency-less icydemux plugin + --disable-interleave disable dependency-less interleave plugin + --disable-flx disable dependency-less flx plugin + --disable-goom disable dependency-less goom plugin + --disable-goom2k1 disable dependency-less goom2k1 plugin + --disable-imagefreeze disable dependency-less imagefreeze plugin + --disable-isomp4 disable dependency-less isomp4 plugin + --disable-law disable dependency-less law plugin + --disable-level disable dependency-less level plugin + --disable-matroska disable dependency-less matroska plugin + --disable-monoscope disable dependency-less monoscope plugin + --disable-multifile disable dependency-less multifile plugin + --disable-multipart disable dependency-less multipart plugin + --disable-replaygain disable dependency-less replaygain plugin + --disable-rtp disable dependency-less rtp plugin + --disable-rtpmanager disable dependency-less rtpmanager plugin + --disable-rtsp disable dependency-less rtsp plugin + --disable-shapewipe disable dependency-less shapewipe plugin + --disable-smpte disable dependency-less smpte plugin + --disable-spectrum disable dependency-less spectrum plugin + --disable-udp disable dependency-less udp plugin + --disable-videobox disable dependency-less videobox plugin + --disable-videocrop disable dependency-less videocrop plugin + --disable-videomixer disable dependency-less videomixer plugin + --disable-wavenc disable dependency-less wavenc plugin + --disable-wavparse disable dependency-less wavparse plugin + --disable-y4m disable dependency-less y4m plugin + --disable-directsound disable DirectSound plug-in: directsoundsink + --disable-oss disable OSS audio: ossaudio + --disable-oss4 disable Open Sound System 4: oss4 + --disable-sunaudio disable Sun Audio: sunaudio + --disable-osx_audio disable OSX audio: osxaudio + --disable-osx_video disable OSX video: osxvideosink + --disable-gst_v4l2 disable Video 4 Linux 2: v4l2src + --disable-x disable X libraries and plugins: ximagesrc + --disable-xshm disable X Shared Memory extension + --disable-xvideo disable X11 XVideo extensions + --disable-aalib disable aalib ASCII Art library: aasink + --disable-aalibtest do not try to compile and run a test AALIB program + --disable-annodex disable XML library: annodex + --disable-cairo disable Cairo graphics rendering: cairo + --disable-cairo_gobject disable Cairo graphics rendering gobject bindings: cairooverlay + --disable-esd disable ESounD sound daemon: esdsink + --disable-esdtest do not try to compile and run a test ESD program + --disable-flac disable FLAC lossless audio: flac + --disable-gconf disable GConf libraries: gconfelements + --disable-gdk_pixbuf disable GDK pixbuf: gdkpixbuf + --disable-hal disable HAL libraries: halelements + --disable-jack disable Jack: jack + --disable-jpeg disable jpeg library: jpeg + --disable-libcaca disable libcaca coloured ASCII art: cacasink + --disable-libdv disable libdv DV demuxer/decoder: dv + --disable-libpng disable Portable Network Graphics library: png + --disable-pulse disable pulseaudio plug-in: pulseaudio + --disable-dv1394 disable raw1394 and avc1394 library: 1394 + --disable-shout2 disable Shoutcast/Icecast client library: shout2 + --disable-soup disable soup http client plugin (2.4): souphttpsrc + --disable-speex disable speex speech codec: speex + --disable-taglib disable taglib tagging library: taglib + --disable-wavpack disable wavpack plug-in: wavpack + --disable-zlib disable zlib support for qtdemux/matroska + --disable-bz2 disable bz2 library for matroska + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-autoconf use a different autoconf for regeneration of + Makefiles + --with-autoheader use a different autoheader for regeneration of + Makefiles + --with-automake use a different automake for regeneration of + Makefiles + --with-aclocal use a different aclocal for regeneration of + Makefiles + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + --with-pkg-config-path colon-separated list of pkg-config(1) dirs + --with-package-name specify package name to use in plugins + --with-package-origin specify package origin URL to use in plugins + --with-plugins comma-separated list of dependencyless plug-ins to + compile + --with-gconf-source=sourceaddress Config database for installing schema files. + --with-gconf-schema-file-dir=dir Directory for installing schema files. + --with-html-dir=PATH path to installed docs + --with-gtk=3.0|2.0 which gtk+ version to compile against (default: 2.0) + --with-default-audiosink + specify default audio sink + --with-default-audiosrc specify default audio source + --with-default-videosink + specify default video sink + --with-default-videosrc specify default video source + --with-default-visualizer + specify default visualizer + --with-gudev device detection with gudev + --with-libv4l2 support video buffer conversion using libv4l2 + --with-x use the X Window System + --with-aalib-prefix=PFX prefix where AALIB is installed (optional) + --with-aalib-exec-prefix=PFX + exec prefix where AALIB is installed (optional) + --with-esd-prefix=PFX prefix where ESD is installed (optional) + --with-esd-exec-prefix=PFX + exec prefix where ESD is installed (optional) + --with-jpeg-mmx, path to MMX'ified JPEG library + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + PKG_CONFIG path to pkg-config utility + VALGRIND_CFLAGS + C compiler flags for VALGRIND, overriding pkg-config + VALGRIND_LIBS + linker flags for VALGRIND, overriding pkg-config + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + CCAS assembler compiler command (defaults to CC) + CCASFLAGS assembler compiler flags (defaults to CFLAGS) + GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config + GLIB_LIBS linker flags for GLIB, overriding pkg-config + GIO_CFLAGS C compiler flags for GIO, overriding pkg-config + GIO_LIBS linker flags for GIO, overriding pkg-config + ORC_CFLAGS C compiler flags for ORC, overriding pkg-config + ORC_LIBS linker flags for ORC, overriding pkg-config + GST_CFLAGS C compiler flags for GST, overriding pkg-config + GST_LIBS linker flags for GST, overriding pkg-config + GST_BASE_CFLAGS + C compiler flags for GST_BASE, overriding pkg-config + GST_BASE_LIBS + linker flags for GST_BASE, overriding pkg-config + GST_GDP_CFLAGS + C compiler flags for GST_GDP, overriding pkg-config + GST_GDP_LIBS + linker flags for GST_GDP, overriding pkg-config + GST_CONTROLLER_CFLAGS + C compiler flags for GST_CONTROLLER, overriding pkg-config + GST_CONTROLLER_LIBS + linker flags for GST_CONTROLLER, overriding pkg-config + GST_CHECK_CFLAGS + C compiler flags for GST_CHECK, overriding pkg-config + GST_CHECK_LIBS + linker flags for GST_CHECK, overriding pkg-config + GST_PLUGINS_BASE_CFLAGS + C compiler flags for GST_PLUGINS_BASE, overriding pkg-config + GST_PLUGINS_BASE_LIBS + linker flags for GST_PLUGINS_BASE, overriding pkg-config + GTK_CFLAGS C compiler flags for GTK, overriding pkg-config + GTK_LIBS linker flags for GTK, overriding pkg-config + GTK_X11_CFLAGS + C compiler flags for GTK_X11, overriding pkg-config + GTK_X11_LIBS + linker flags for GTK_X11, overriding pkg-config + GUDEV_CFLAGS + C compiler flags for GUDEV, overriding pkg-config + GUDEV_LIBS linker flags for GUDEV, overriding pkg-config + LIBV4L2_CFLAGS + C compiler flags for LIBV4L2, overriding pkg-config + LIBV4L2_LIBS + linker flags for LIBV4L2, overriding pkg-config + XMKMF Path to xmkmf, Makefile generator for X Window System + XFIXES_CFLAGS + C compiler flags for XFIXES, overriding pkg-config + XFIXES_LIBS linker flags for XFIXES, overriding pkg-config + XDAMAGE_CFLAGS + C compiler flags for XDAMAGE, overriding pkg-config + XDAMAGE_LIBS + linker flags for XDAMAGE, overriding pkg-config + ANNODEX_CFLAGS + C compiler flags for ANNODEX, overriding pkg-config + ANNODEX_LIBS + linker flags for ANNODEX, overriding pkg-config + CAIRO_CFLAGS + C compiler flags for CAIRO, overriding pkg-config + CAIRO_LIBS linker flags for CAIRO, overriding pkg-config + CAIRO_GOBJECT_CFLAGS + C compiler flags for CAIRO_GOBJECT, overriding pkg-config + CAIRO_GOBJECT_LIBS + linker flags for CAIRO_GOBJECT, overriding pkg-config + ESD_CFLAGS C compiler flags for ESD, overriding pkg-config + ESD_LIBS linker flags for ESD, overriding pkg-config + FLAC_CFLAGS C compiler flags for FLAC, overriding pkg-config + FLAC_LIBS linker flags for FLAC, overriding pkg-config + GCONF_CFLAGS + C compiler flags for GCONF, overriding pkg-config + GCONF_LIBS linker flags for GCONF, overriding pkg-config + GDK_PIXBUF_CFLAGS + C compiler flags for GDK_PIXBUF, overriding pkg-config + GDK_PIXBUF_LIBS + linker flags for GDK_PIXBUF, overriding pkg-config + HAL_CFLAGS C compiler flags for HAL, overriding pkg-config + HAL_LIBS linker flags for HAL, overriding pkg-config + JACK_CFLAGS C compiler flags for JACK, overriding pkg-config + JACK_LIBS linker flags for JACK, overriding pkg-config + JACK_0_120_1_CFLAGS + C compiler flags for JACK_0_120_1, overriding pkg-config + JACK_0_120_1_LIBS + linker flags for JACK_0_120_1, overriding pkg-config + JACK_1_9_7_CFLAGS + C compiler flags for JACK_1_9_7, overriding pkg-config + JACK_1_9_7_LIBS + linker flags for JACK_1_9_7, overriding pkg-config + LIBCACA_CFLAGS + C compiler flags for LIBCACA, overriding pkg-config + LIBCACA_LIBS + linker flags for LIBCACA, overriding pkg-config + LIBDV_CFLAGS + C compiler flags for LIBDV, overriding pkg-config + LIBDV_LIBS linker flags for LIBDV, overriding pkg-config + LIBPNG_CFLAGS + C compiler flags for LIBPNG, overriding pkg-config + LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config + PULSE_CFLAGS + C compiler flags for PULSE, overriding pkg-config + PULSE_LIBS linker flags for PULSE, overriding pkg-config + PULSE_0_9_20_CFLAGS + C compiler flags for PULSE_0_9_20, overriding pkg-config + PULSE_0_9_20_LIBS + linker flags for PULSE_0_9_20, overriding pkg-config + PULSE_1_0_CFLAGS + C compiler flags for PULSE_1_0, overriding pkg-config + PULSE_1_0_LIBS + linker flags for PULSE_1_0, overriding pkg-config + RAW1394_CFLAGS + C compiler flags for RAW1394, overriding pkg-config + RAW1394_LIBS + linker flags for RAW1394, overriding pkg-config + LIBIEC61883_CFLAGS + C compiler flags for LIBIEC61883, overriding pkg-config + LIBIEC61883_LIBS + linker flags for LIBIEC61883, overriding pkg-config + SHOUT2_CFLAGS + C compiler flags for SHOUT2, overriding pkg-config + SHOUT2_LIBS linker flags for SHOUT2, overriding pkg-config + SOUP_CFLAGS C compiler flags for SOUP, overriding pkg-config + SOUP_LIBS linker flags for SOUP, overriding pkg-config + SPEEX_CFLAGS + C compiler flags for SPEEX, overriding pkg-config + SPEEX_LIBS linker flags for SPEEX, overriding pkg-config + TAGLIB_CFLAGS + C compiler flags for TAGLIB, overriding pkg-config + TAGLIB_LIBS linker flags for TAGLIB, overriding pkg-config + WAVPACK_CFLAGS + C compiler flags for WAVPACK, overriding pkg-config + WAVPACK_LIBS + linker flags for WAVPACK, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +GStreamer Good Plug-ins configure 0.10.31 +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------------------------------------------ ## +## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer ## +## ------------------------------------------------------------------------ ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by GStreamer Good Plug-ins $as_me 0.10.31, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +gt_needs="$gt_needs " +as_fn_append ac_header_list " stdlib.h" +as_fn_append ac_header_list " unistd.h" +as_fn_append ac_header_list " sys/param.h" +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='gst-plugins-good' + VERSION='0.10.31' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + + + PACKAGE_VERSION_MAJOR=$(echo 0.10.31 | cut -d'.' -f1) + PACKAGE_VERSION_MINOR=$(echo 0.10.31 | cut -d'.' -f2) + PACKAGE_VERSION_MICRO=$(echo 0.10.31 | cut -d'.' -f3) + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5 +$as_echo_n "checking nano version... " >&6; } + + NANO=$(echo 0.10.31 | cut -d'.' -f4) + + if test x"$NANO" = x || test "x$NANO" = "x0" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5 +$as_echo "0 (release)" >&6; } + NANO=0 + PACKAGE_VERSION_RELEASE=1 + GST_GIT="no" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NANO" >&5 +$as_echo "$NANO" >&6; } + PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S` + if test "x$NANO" != "x1" ; then + GST_GIT="no" + else + GST_GIT="yes" + fi + fi + PACKAGE_VERSION_NANO=$NANO + + + + + + +ac_config_headers="$ac_config_headers config.h" + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +GST_MAJORMINOR=$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR +GST_MAJORMINOR=0.10 + + + + case $host_os in + cygwin* | mingw*) + lt_cv_deplibs_check_method=pass_all + ;; + esac + + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +GST_REQ=0.10.36 +GSTPB_REQ=0.10.36 + + + + +# Check whether --with-autoconf was given. +if test "${with_autoconf+set}" = set; then : + withval=$with_autoconf; + unset AUTOCONF + +AUTOCONF=${AUTOCONF-"${am_missing_run}${withval}"} + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOCONF as autoconf" >&5 +$as_echo "$as_me: Using $AUTOCONF as autoconf" >&6;} + +fi + + + +# Check whether --with-autoheader was given. +if test "${with_autoheader+set}" = set; then : + withval=$with_autoheader; + unset AUTOHEADER + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}${withval}"} + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOHEADER as autoheader" >&5 +$as_echo "$as_me: Using $AUTOHEADER as autoheader" >&6;} + +fi + + + +# Check whether --with-automake was given. +if test "${with_automake+set}" = set; then : + withval=$with_automake; + unset AUTOMAKE + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}${withval}"} + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOMAKE as automake" >&5 +$as_echo "$as_me: Using $AUTOMAKE as automake" >&6;} + +fi + + + +# Check whether --with-aclocal was given. +if test "${with_aclocal+set}" = set; then : + withval=$with_aclocal; + unset ACLOCAL + +ACLOCAL=${ACLOCAL-"${am_missing_run}${withval}"} + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $ACLOCAL as aclocal" >&5 +$as_echo "$as_me: Using $ACLOCAL as aclocal" >&6;} + +fi + + + +ACLOCAL_AMFLAGS="-I m4 -I common/m4" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + + GETTEXT_MACRO_VERSION=0.17 + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac + + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + rm -f messages.po + + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGMERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGMERGE" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then + ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" + ;; +esac +fi +MSGMERGE="$ac_cv_path_MSGMERGE" +if test "$MSGMERGE" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$localedir" || localedir='${datadir}/locale' + + + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + + + ac_config_commands="$ac_config_commands po-directories" + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${acl_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${acl_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if ${acl_cv_rpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then : + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then : + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + LIBICONV_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIBICONV_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 +$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } +if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFPreferencesCopyAppValue(NULL, NULL) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFPreferencesCopyAppValue=yes +else + gt_cv_func_CFPreferencesCopyAppValue=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 +$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + +$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 +$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } +if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFLocaleCopyCurrent(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFLocaleCopyCurrent=yes +else + gt_cv_func_CFLocaleCopyCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 +$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + +$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h + + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + + + + + + + LIBINTL= + LTLIBINTL= + POSUB= + + case " $gt_needs " in + *" need-formatstring-macros "*) gt_api_version=3 ;; + *" need-ngettext "*) gt_api_version=2 ;; + *) gt_api_version=1 ;; + esac + gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" + gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" + + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + + + if test $gt_api_version -ge 3; then + gt_revision_test_code=' +#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +' + else + gt_revision_test_code= + fi + if test $gt_api_version -ge 2; then + gt_expression_test_code=' + * ngettext ("", "", 0)' + else + gt_expression_test_code= + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 +$as_echo_n "checking for GNU gettext in libc... " >&6; } +if eval \${$gt_func_gnugettext_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$gt_func_gnugettext_libc=yes" +else + eval "$gt_func_gnugettext_libc=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$gt_func_gnugettext_libc + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +$as_echo_n "checking for iconv... " >&6; } +if ${am_cv_func_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +$as_echo "$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 +$as_echo_n "checking for working iconv... " >&6; } +if ${am_cv_func_iconv_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + if test "$cross_compiling" = yes; then : + case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + am_cv_func_iconv_works=yes +else + am_cv_func_iconv_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS="$am_save_LIBS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 +$as_echo "$am_cv_func_iconv_works" >&6; } + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + +$as_echo "#define HAVE_ICONV 1" >>confdefs.h + + fi + if test "$am_cv_lib_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +$as_echo_n "checking how to link with libiconv... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +$as_echo "$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libintl-prefix was given. +if test "${with_libintl_prefix+set}" = set; then : + withval=$with_libintl_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBINTL= + LTLIBINTL= + INCINTL= + LIBINTL_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='intl ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIBINTL_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" + ;; + esac + done + fi + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 +$as_echo_n "checking for GNU gettext in libintl... " >&6; } +if eval \${$gt_func_gnugettext_libintl+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *); +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$gt_func_gnugettext_libintl=yes" +else + eval "$gt_func_gnugettext_libintl=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *); +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + eval "$gt_func_gnugettext_libintl=yes" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS" +fi +eval ac_res=\$$gt_func_gnugettext_libintl + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + fi + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ + || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + else + USE_NLS=no + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 +$as_echo_n "checking whether to use NLS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + if test "$USE_NLS" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 +$as_echo_n "checking where the gettext function comes from... " >&6; } + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 +$as_echo "$gt_source" >&6; } + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 +$as_echo_n "checking how to link with libintl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 +$as_echo "$LIBINTL" >&6; } + + for element in $INCINTL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + fi + + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + +$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h + + fi + + POSUB=po + fi + + + + INTLLIBS="$LIBINTL" + + + + + + + + if test "$USE_NLS" = "yes"; then + GETTEXT_PACKAGE=gst-plugins-good-$GST_MAJORMINOR + else + GETTEXT_PACKAGE=NULL + fi + + +cat >>confdefs.h <<_ACEOF +#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" +_ACEOF + + + + EXP_VAR=LOCALEDIR + FROM_VAR=$datadir/locale + + prefix_save=$prefix + exec_prefix_save=$exec_prefix + + if test "x$prefix" = "xNONE"; then + prefix="$ac_default_prefix" + fi + if test "x$exec_prefix" = "xNONE"; then + exec_prefix=$prefix + fi + + full_var="$FROM_VAR" + while true; do + new_full_var="`eval echo $full_var`" + if test "x$new_full_var" = "x$full_var"; then break; fi + full_var=$new_full_var + done + + full_var=$new_full_var + LOCALEDIR="$full_var" + + + prefix=$prefix_save + exec_prefix=$exec_prefix_save + + +cat >>confdefs.h <<_ACEOF +#define LOCALEDIR "$LOCALEDIR" +_ACEOF + + + + + + # Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; + case "${enableval}" in + yes) USE_DEBUG=yes ;; + no) USE_DEBUG=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; + esac + +else + USE_DEBUG=yes +fi + + + # Check whether --enable-profiling was given. +if test "${enable_profiling+set}" = set; then : + enableval=$enable_profiling; + case "${enableval}" in + yes) USE_PROFILING=yes ;; + no) USE_PROFILING=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-profiling" "$LINENO" 5 ;; + esac + +else + USE_PROFILING=no +fi + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi + +fi + + # Check whether --enable-valgrind was given. +if test "${enable_valgrind+set}" = set; then : + enableval=$enable_valgrind; + case "${enableval}" in + yes) USE_VALGRIND="$USE_DEBUG" ;; + no) USE_VALGRIND=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-valgrind" "$LINENO" 5 ;; + esac + +else + USE_VALGRIND="$USE_DEBUG" +fi + VALGRIND_REQ="3.0" + if test "x$USE_VALGRIND" = xyes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VALGRIND" >&5 +$as_echo_n "checking for VALGRIND... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$VALGRIND_CFLAGS"; then + pkg_cv_VALGRIND_CFLAGS="$VALGRIND_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind >= \$VALGRIND_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "valgrind >= $VALGRIND_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VALGRIND_CFLAGS=`$PKG_CONFIG --cflags "valgrind >= $VALGRIND_REQ" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$VALGRIND_LIBS"; then + pkg_cv_VALGRIND_LIBS="$VALGRIND_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind >= \$VALGRIND_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "valgrind >= $VALGRIND_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VALGRIND_LIBS=`$PKG_CONFIG --libs "valgrind >= $VALGRIND_REQ" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + VALGRIND_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "valgrind >= $VALGRIND_REQ"` + else + VALGRIND_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "valgrind >= $VALGRIND_REQ"` + fi + # Put the nasty error message in config.log where it belongs + echo "$VALGRIND_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + USE_VALGRIND="no" +elif test $pkg_failed = untried; then + USE_VALGRIND="no" +else + VALGRIND_CFLAGS=$pkg_cv_VALGRIND_CFLAGS + VALGRIND_LIBS=$pkg_cv_VALGRIND_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + USE_VALGRIND="yes" +fi + fi + if test "x$USE_VALGRIND" = xyes; then + +$as_echo "#define HAVE_VALGRIND 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using extra code paths for valgrind" >&5 +$as_echo "$as_me: Using extra code paths for valgrind" >&6;} + fi + + + # Check whether --enable-gcov was given. +if test "${enable_gcov+set}" = set; then : + enableval=$enable_gcov; enable_gcov=$enableval +else + enable_gcov=no +fi + + if test x$enable_gcov = xyes ; then + if test "x$GCC" != "xyes" + then + as_fn_error $? "gcov only works if gcc is used" "$LINENO" 5 + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands \"-fprofile-arcs\"" >&5 +$as_echo_n "checking to see if compiler understands \"-fprofile-arcs\"... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS "-fprofile-arcs"" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + GCOV_CFLAGS="$GCOV_CFLAGS -fprofile-arcs" + true + else + true + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands \"-ftest-coverage\"" >&5 +$as_echo_n "checking to see if compiler understands \"-ftest-coverage\"... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS "-ftest-coverage"" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + GCOV_CFLAGS="$GCOV_CFLAGS -ftest-coverage" + true + else + true + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + GCOV_CFLAGS=`echo "$GCOV_CFLAGS" | sed -e 's/-O[0-9]*//g'` + GCOV_LIBS=-lgcov + + + GCOV=`echo $CC | sed s/gcc/gcov/g` + + + GST_GCOV_ENABLED=yes + +cat >>confdefs.h <<_ACEOF +#define GST_GCOV_ENABLED 1 +_ACEOF + + if test "x$GST_GCOV_ENABLED" = "xyes" + then + CFLAGS="-O0" + + CXXFLAGS="-O0" + + FFLAGS="-O0" + + CCASFLAGS="-O0" + + { $as_echo "$as_me:${as_lineno-$LINENO}: gcov enabled, setting CFLAGS and friends to $CFLAGS" >&5 +$as_echo "$as_me: gcov enabled, setting CFLAGS and friends to $CFLAGS" >&6;} + fi + fi + if test x$enable_gcov = xyes; then + GST_GCOV_ENABLED_TRUE= + GST_GCOV_ENABLED_FALSE='#' +else + GST_GCOV_ENABLED_TRUE='#' + GST_GCOV_ENABLED_FALSE= +fi + + + + + # Check whether --enable-examples was given. +if test "${enable_examples+set}" = set; then : + enableval=$enable_examples; + case "${enableval}" in + yes) BUILD_EXAMPLES=yes ;; + no) BUILD_EXAMPLES=no ;; + *) as_fn_error $? "bad value ${enableval} for --disable-examples" "$LINENO" 5 ;; + esac + +else + BUILD_EXAMPLES=yes +fi + if test "x$BUILD_EXAMPLES" = "xyes"; then + BUILD_EXAMPLES_TRUE= + BUILD_EXAMPLES_FALSE='#' +else + BUILD_EXAMPLES_TRUE='#' + BUILD_EXAMPLES_FALSE= +fi + + + + + +# Check whether --with-pkg-config-path was given. +if test "${with_pkg_config_path+set}" = set; then : + withval=$with_pkg_config_path; + export PKG_CONFIG_PATH=${withval} + { $as_echo "$as_me:${as_lineno-$LINENO}: Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH" >&5 +$as_echo "$as_me: Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH" >&6;} + +fi + + + + +# Check whether --with-package-name was given. +if test "${with_package_name+set}" = set; then : + withval=$with_package_name; + case "${withval}" in + yes) as_fn_error $? "bad value ${withval} for --with-package-name" "$LINENO" 5 ;; + no) as_fn_error $? "bad value ${withval} for --with-package-name" "$LINENO" 5 ;; + *) GST_PACKAGE_NAME="${withval}" ;; + esac + +else + + P= + if test "x$P" = "x" + then + P=$PACKAGE_NAME + fi + + if test "x$PACKAGE_VERSION_NANO" = "x0" + then + GST_PACKAGE_NAME="$P source release" + else + if test "x$PACKAGE_VERSION_NANO" = "x1" + then + GST_PACKAGE_NAME="$P git" + else + GST_PACKAGE_NAME="$P prerelease" + fi + fi + + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $GST_PACKAGE_NAME as package name" >&5 +$as_echo "$as_me: Using $GST_PACKAGE_NAME as package name" >&6;} + +cat >>confdefs.h <<_ACEOF +#define GST_PACKAGE_NAME "$GST_PACKAGE_NAME" +_ACEOF + + + + + +# Check whether --with-package-origin was given. +if test "${with_package_origin+set}" = set; then : + withval=$with_package_origin; + case "${withval}" in + yes) as_fn_error $? "bad value ${withval} for --with-package-origin" "$LINENO" 5 ;; + no) as_fn_error $? "bad value ${withval} for --with-package-origin" "$LINENO" 5 ;; + *) GST_PACKAGE_ORIGIN="${withval}" ;; + esac + +else + GST_PACKAGE_ORIGIN="Unknown package origin" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $GST_PACKAGE_ORIGIN as package origin" >&5 +$as_echo "$as_me: Using $GST_PACKAGE_ORIGIN as package origin" >&6;} + +cat >>confdefs.h <<_ACEOF +#define GST_PACKAGE_ORIGIN "$GST_PACKAGE_ORIGIN" +_ACEOF + + + + + + +# Check whether --with-plugins was given. +if test "${with_plugins+set}" = set; then : + withval=$with_plugins; WITH_PLUGINS=$withval +else + WITH_PLUGINS= +fi + + + GST_PLUGINS_ALL="" + GST_PLUGINS_SELECTED="" + + + + + + + echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: building of plug-ins with external deps ***" >&5 +$as_echo "$as_me: *** checking feature: building of plug-ins with external deps ***" >&6;} +if test "x" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 +$as_echo "$as_me: *** for plug-ins: ***" >&6;} +fi +NOUSE= +if test "x$USE_EXTERNAL" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-external was given. +if test "${enable_external+set}" = set; then : + enableval=$enable_external; case "${enableval}" in + yes) USE_EXTERNAL=yes;; + no) USE_EXTERNAL=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-external" "$LINENO" 5 ;; + esac +else + USE_EXTERNAL=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_EXTERNAL="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_EXTERNAL = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_EXTERNAL=no + HAVE_EXTERNAL=yes + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_EXTERNAL = xno; then + USE_EXTERNAL=no + else + : + fi +fi +if test x$USE_EXTERNAL = xyes; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: building external plug-ins" >&5 +$as_echo "$as_me: building external plug-ins" >&6;} + BUILD_EXTERNAL="yes" + + if test "x" != "x"; then + GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_EXTERNAL /**/" >>confdefs.h + +else + : + if test "x" != "x"; then + GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: all plug-ins with external dependencies will not be built" >&5 +$as_echo "$as_me: WARNING: all plug-ins with external dependencies will not be built" >&2;} + BUILD_EXTERNAL="no" + +fi + if test x$USE_EXTERNAL = xyes; then + USE_EXTERNAL_TRUE= + USE_EXTERNAL_FALSE='#' +else + USE_EXTERNAL_TRUE='#' + USE_EXTERNAL_FALSE= +fi + + + # make BUILD_EXTERNAL available to Makefile.am + if test "x$BUILD_EXTERNAL" = "xyes"; then + BUILD_EXTERNAL_TRUE= + BUILD_EXTERNAL_FALSE='#' +else + BUILD_EXTERNAL_TRUE='#' + BUILD_EXTERNAL_FALSE= +fi + + + + + echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: building of experimental plug-ins ***" >&5 +$as_echo "$as_me: *** checking feature: building of experimental plug-ins ***" >&6;} +if test "x" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 +$as_echo "$as_me: *** for plug-ins: ***" >&6;} +fi +NOUSE= +if test "x$USE_EXPERIMENTAL" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-experimental was given. +if test "${enable_experimental+set}" = set; then : + enableval=$enable_experimental; case "${enableval}" in + yes) USE_EXPERIMENTAL=yes;; + no) USE_EXPERIMENTAL=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-experimental" "$LINENO" 5 ;; + esac +else + USE_EXPERIMENTAL=no +fi + +if test "x$NOUSE" = "xyes"; then + USE_EXPERIMENTAL="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_EXPERIMENTAL = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_EXPERIMENTAL=no + HAVE_EXPERIMENTAL=yes + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_EXPERIMENTAL = xno; then + USE_EXPERIMENTAL=no + else + : + fi +fi +if test x$USE_EXPERIMENTAL = xyes; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: building experimental plug-ins" >&5 +$as_echo "$as_me: WARNING: building experimental plug-ins" >&2;} + BUILD_EXPERIMENTAL="yes" + + if test "x" != "x"; then + GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_EXPERIMENTAL /**/" >>confdefs.h + +else + : + if test "x" != "x"; then + GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: not building experimental plug-ins" >&5 +$as_echo "$as_me: not building experimental plug-ins" >&6;} + BUILD_EXPERIMENTAL="no" + +fi + if test x$USE_EXPERIMENTAL = xyes; then + USE_EXPERIMENTAL_TRUE= + USE_EXPERIMENTAL_FALSE='#' +else + USE_EXPERIMENTAL_TRUE='#' + USE_EXPERIMENTAL_FALSE= +fi + + + # make BUILD_EXPERIMENTAL available to Makefile.am + if test "x$BUILD_EXPERIMENTAL" = "xyes"; then + BUILD_EXPERIMENTAL_TRUE= + BUILD_EXPERIMENTAL_FALSE='#' +else + BUILD_EXPERIMENTAL_TRUE='#' + BUILD_EXPERIMENTAL_FALSE= +fi + + + + + + + + case "x${host_cpu}" in + xi?86 | xk? | xi?86_64) + case $host_os in + solaris*) + ac_fn_c_check_decl "$LINENO" "__i386" "ac_cv_have_decl___i386" "$ac_includes_default" +if test "x$ac_cv_have_decl___i386" = xyes; then : + I386_ABI="yes" +else + I386_ABI="no" +fi + + ac_fn_c_check_decl "$LINENO" "__amd64" "ac_cv_have_decl___amd64" "$ac_includes_default" +if test "x$ac_cv_have_decl___amd64" = xyes; then : + AMD64_ABI="yes" +else + AMD64_ABI="no" +fi + + + if test "x$I386_ABI" = "xyes" ; then + HAVE_CPU_I386=yes + +$as_echo "#define HAVE_CPU_I386 1" >>confdefs.h + + fi + if test "x$AMD64_ABI" = "xyes" ; then + HAVE_CPU_X86_64=yes + +$as_echo "#define HAVE_CPU_X86_64 1" >>confdefs.h + + fi + ;; + *) + HAVE_CPU_I386=yes + +$as_echo "#define HAVE_CPU_I386 1" >>confdefs.h + + + case "x${host_cpu}" in + xi386 | xi486) ;; + *) + +$as_echo "#define HAVE_RDTSC 1" >>confdefs.h + ;; + esac + ;; + esac + ;; + xpowerpc) + HAVE_CPU_PPC=yes + +$as_echo "#define HAVE_CPU_PPC 1" >>confdefs.h + ;; + xpowerpc64) + HAVE_CPU_PPC64=yes + +$as_echo "#define HAVE_CPU_PPC64 1" >>confdefs.h + ;; + xalpha*) + HAVE_CPU_ALPHA=yes + +$as_echo "#define HAVE_CPU_ALPHA 1" >>confdefs.h + ;; + xarm*) + HAVE_CPU_ARM=yes + +$as_echo "#define HAVE_CPU_ARM 1" >>confdefs.h + ;; + xsparc*) + HAVE_CPU_SPARC=yes + +$as_echo "#define HAVE_CPU_SPARC 1" >>confdefs.h + ;; + xmips*) + HAVE_CPU_MIPS=yes + +$as_echo "#define HAVE_CPU_MIPS 1" >>confdefs.h + ;; + xhppa*) + HAVE_CPU_HPPA=yes + +$as_echo "#define HAVE_CPU_HPPA 1" >>confdefs.h + ;; + xs390*) + HAVE_CPU_S390=yes + +$as_echo "#define HAVE_CPU_S390 1" >>confdefs.h + ;; + xia64*) + HAVE_CPU_IA64=yes + +$as_echo "#define HAVE_CPU_IA64 1" >>confdefs.h + ;; + xm68k*) + HAVE_CPU_M68K=yes + +$as_echo "#define HAVE_CPU_M68K 1" >>confdefs.h + ;; + xx86_64) + HAVE_CPU_X86_64=yes + +$as_echo "#define HAVE_CPU_X86_64 1" >>confdefs.h + ;; + xcris) + HAVE_CPU_CRIS=yes + +$as_echo "#define HAVE_CPU_CRIS 1" >>confdefs.h + ;; + xcrisv32) + HAVE_CPU_CRISV32=yes + +$as_echo "#define HAVE_CPU_CRISV32 1" >>confdefs.h + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + + if test "x$HAVE_CPU_I386" = "xyes"; then + HAVE_CPU_I386_TRUE= + HAVE_CPU_I386_FALSE='#' +else + HAVE_CPU_I386_TRUE='#' + HAVE_CPU_I386_FALSE= +fi + + if test "x$HAVE_CPU_PPC" = "xyes"; then + HAVE_CPU_PPC_TRUE= + HAVE_CPU_PPC_FALSE='#' +else + HAVE_CPU_PPC_TRUE='#' + HAVE_CPU_PPC_FALSE= +fi + + if test "x$HAVE_CPU_PPC64" = "xyes"; then + HAVE_CPU_PPC64_TRUE= + HAVE_CPU_PPC64_FALSE='#' +else + HAVE_CPU_PPC64_TRUE='#' + HAVE_CPU_PPC64_FALSE= +fi + + if test "x$HAVE_CPU_ALPHA" = "xyes"; then + HAVE_CPU_ALPHA_TRUE= + HAVE_CPU_ALPHA_FALSE='#' +else + HAVE_CPU_ALPHA_TRUE='#' + HAVE_CPU_ALPHA_FALSE= +fi + + if test "x$HAVE_CPU_ARM" = "xyes"; then + HAVE_CPU_ARM_TRUE= + HAVE_CPU_ARM_FALSE='#' +else + HAVE_CPU_ARM_TRUE='#' + HAVE_CPU_ARM_FALSE= +fi + + if test "x$HAVE_CPU_SPARC" = "xyes"; then + HAVE_CPU_SPARC_TRUE= + HAVE_CPU_SPARC_FALSE='#' +else + HAVE_CPU_SPARC_TRUE='#' + HAVE_CPU_SPARC_FALSE= +fi + + if test "x$HAVE_CPU_HPPA" = "xyes"; then + HAVE_CPU_HPPA_TRUE= + HAVE_CPU_HPPA_FALSE='#' +else + HAVE_CPU_HPPA_TRUE='#' + HAVE_CPU_HPPA_FALSE= +fi + + if test "x$HAVE_CPU_MIPS" = "xyes"; then + HAVE_CPU_MIPS_TRUE= + HAVE_CPU_MIPS_FALSE='#' +else + HAVE_CPU_MIPS_TRUE='#' + HAVE_CPU_MIPS_FALSE= +fi + + if test "x$HAVE_CPU_S390" = "xyes"; then + HAVE_CPU_S390_TRUE= + HAVE_CPU_S390_FALSE='#' +else + HAVE_CPU_S390_TRUE='#' + HAVE_CPU_S390_FALSE= +fi + + if test "x$HAVE_CPU_IA64" = "xyes"; then + HAVE_CPU_IA64_TRUE= + HAVE_CPU_IA64_FALSE='#' +else + HAVE_CPU_IA64_TRUE='#' + HAVE_CPU_IA64_FALSE= +fi + + if test "x$HAVE_CPU_M68K" = "xyes"; then + HAVE_CPU_M68K_TRUE= + HAVE_CPU_M68K_FALSE='#' +else + HAVE_CPU_M68K_TRUE='#' + HAVE_CPU_M68K_FALSE= +fi + + if test "x$HAVE_CPU_X86_64" = "xyes"; then + HAVE_CPU_X86_64_TRUE= + HAVE_CPU_X86_64_FALSE='#' +else + HAVE_CPU_X86_64_TRUE='#' + HAVE_CPU_X86_64_FALSE= +fi + + if test "x$HAVE_CPU_CRIS" = "xyes"; then + HAVE_CPU_CRIS_TRUE= + HAVE_CPU_CRIS_FALSE='#' +else + HAVE_CPU_CRIS_TRUE='#' + HAVE_CPU_CRIS_FALSE= +fi + + if test "x$HAVE_CPU_CRISV32" = "xyes"; then + HAVE_CPU_CRISV32_TRUE= + HAVE_CPU_CRISV32_FALSE='#' +else + HAVE_CPU_CRISV32_TRUE='#' + HAVE_CPU_CRISV32_FALSE= +fi + + + +cat >>confdefs.h <<_ACEOF +#define HOST_CPU "$host_cpu" +_ACEOF + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + case $ac_cv_prog_cc_stdc in #( + no) : + ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +else + ac_cv_prog_cc_stdc=no +fi + +fi + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } + if ${ac_cv_prog_cc_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; #( + '') : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +esac + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Extract the first word of "$CXX", so it can be a program name with args. +set dummy $CXX; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_CXX"; then + ac_cv_prog_HAVE_CXX="$HAVE_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_HAVE_CXX="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_CXX" && ac_cv_prog_HAVE_CXX="no" +fi +fi +HAVE_CXX=$ac_cv_prog_HAVE_CXX +if test -n "$HAVE_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CXX" >&5 +$as_echo "$HAVE_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in objcc objc gcc cc CC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJC"; then + ac_cv_prog_OBJC="$OBJC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJC=$ac_cv_prog_OBJC +if test -n "$OBJC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJC" >&5 +$as_echo "$OBJC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$OBJC" && break + done +fi +if test -z "$OBJC"; then + ac_ct_OBJC=$OBJC + for ac_prog in objcc objc gcc cc CC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJC"; then + ac_cv_prog_ac_ct_OBJC="$ac_ct_OBJC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJC=$ac_cv_prog_ac_ct_OBJC +if test -n "$ac_ct_OBJC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJC" >&5 +$as_echo "$ac_ct_OBJC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_OBJC" && break +done + + if test "x$ac_ct_OBJC" = x; then + OBJC="none" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJC=$ac_ct_OBJC + fi +fi + + +OBJC_LDFLAGS="-lobjc" + +if test "x$OBJC" != xnone ; then + +depcc="$OBJC" am_compiler_list='gcc3 gcc' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_OBJC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_OBJC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_OBJC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_OBJC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_OBJC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_OBJC_dependencies_compiler_type" >&6; } +OBJCDEPMODE=depmode=$am_cv_OBJC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_OBJC_dependencies_compiler_type" = gcc3; then + am__fastdepOBJC_TRUE= + am__fastdepOBJC_FALSE='#' +else + am__fastdepOBJC_TRUE='#' + am__fastdepOBJC_FALSE= +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Objective C compiler works" >&5 +$as_echo_n "checking if Objective C compiler works... " >&6; } + cat >>conftest.m < +@interface Moo:Object +{ +} +- moo; +int main(); +@end + +@implementation Moo +- moo +{ + exit(0); +} + +int main() +{ + id moo; + moo = [Moo new]; + [moo moo]; + return 1; +} +@end +EOF + ${OBJC} conftest.m ${OBJC_LDFLAGS} >&5 2>&5 + if test -f a.out -o -f a.exe ; then + result=yes + else + result=no + echo failed program is: >&5 + cat conftest.m >&5 + fi + rm -f conftest.m a.out a.exe + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +$as_echo "$result" >&6; } +else + +depcc="$OBJC" am_compiler_list='gcc3 gcc' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_OBJC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_OBJC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_OBJC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_OBJC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_OBJC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_OBJC_dependencies_compiler_type" >&6; } +OBJCDEPMODE=depmode=$am_cv_OBJC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_OBJC_dependencies_compiler_type" = gcc3; then + am__fastdepOBJC_TRUE= + am__fastdepOBJC_FALSE='#' +else + am__fastdepOBJC_TRUE='#' + am__fastdepOBJC_FALSE= +fi + + +fi + + + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + + +# By default we simply use the C compiler to build assembly code. + +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS + + + +depcc="$CCAS" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CCAS_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CCAS_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CCAS_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } +CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then + am__fastdepCCAS_TRUE= + am__fastdepCCAS_FALSE='#' +else + am__fastdepCCAS_TRUE='#' + am__fastdepCCAS_FALSE= +fi + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working do while(0) macros" >&5 +$as_echo_n "checking for working do while(0) macros... " >&6; } +if ${_cv_g_support_dowhile_macros+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + #define STMT_START do + #define STMT_END while(0) + #define STMT_TEST STMT_START { i = 0; } STMT_END + int main(void) { int i = 1; STMT_TEST; return i; } + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + _cv_g_support_dowhile_macros=yes +else + _cv_g_support_dowhile_macros=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_g_support_dowhile_macros" >&5 +$as_echo "$_cv_g_support_dowhile_macros" >&6; } +if test x$_cv_g_support_dowhile_macros = xyes; then + +$as_echo "#define HAVE_DOWHILE_MACROS 1" >>confdefs.h + +fi + + +# Extract the first word of "valgrind", so it can be a program name with args. +set dummy valgrind; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_VALGRIND_PATH+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $VALGRIND_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_VALGRIND_PATH="$VALGRIND_PATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_VALGRIND_PATH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_VALGRIND_PATH" && ac_cv_path_VALGRIND_PATH="no" + ;; +esac +fi +VALGRIND_PATH=$ac_cv_path_VALGRIND_PATH +if test -n "$VALGRIND_PATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND_PATH" >&5 +$as_echo "$VALGRIND_PATH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test ! "x$VALGRIND_PATH" = "xno"; then + HAVE_VALGRIND_TRUE= + HAVE_VALGRIND_FALSE='#' +else + HAVE_VALGRIND_TRUE='#' + HAVE_VALGRIND_FALSE= +fi + + + + if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then + GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` + else + GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE + fi + + +# Check whether --with-gconf-source was given. +if test "${with_gconf_source+set}" = set; then : + withval=$with_gconf_source; GCONF_SCHEMA_CONFIG_SOURCE="$withval" +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&5 +$as_echo "Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&6; } + + if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then + GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas' + fi + + +# Check whether --with-gconf-schema-file-dir was given. +if test "${with_gconf_schema_file_dir+set}" = set; then : + withval=$with_gconf_schema_file_dir; GCONF_SCHEMA_FILE_DIR="$withval" +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&5 +$as_echo "Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&6; } + + # Check whether --enable-schemas-install was given. +if test "${enable_schemas_install+set}" = set; then : + enableval=$enable_schemas_install; case "${enableval}" in + yes) schemas_install=true ;; + no) schemas_install=false ;; + *) as_fn_error $? "bad value ${enableval} for --disable-schemas-install" "$LINENO" 5 ;; + esac +else + schemas_install=true +fi + + if test x$schemas_install = xtrue; then + GCONF_SCHEMAS_INSTALL_TRUE= + GCONF_SCHEMAS_INSTALL_FALSE='#' +else + GCONF_SCHEMAS_INSTALL_TRUE='#' + GCONF_SCHEMAS_INSTALL_FALSE= +fi + + + + + +# Check whether --with-html-dir was given. +if test "${with_html_dir+set}" = set; then : + withval=$with_html_dir; +else + with_html_dir='${datadir}/gtk-doc/html' +fi + + HTML_DIR="$with_html_dir" + + + # Check whether --enable-gtk-doc was given. +if test "${enable_gtk_doc+set}" = set; then : + enableval=$enable_gtk_doc; +else + enable_gtk_doc=no +fi + + + if test x$enable_gtk_doc = xyes; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.3") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + : +else + as_fn_error $? "You need to have gtk-doc >= 1.3 installed to build gtk-doc" "$LINENO" 5 +fi + if test -z "$SED"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 +$as_echo_n "checking whether to build gtk-doc documentation... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 +$as_echo "$enable_gtk_doc" >&6; } + + for ac_prog in gtkdoc-check +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_CHECK+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_CHECK in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_CHECK=$ac_cv_path_GTKDOC_CHECK +if test -n "$GTKDOC_CHECK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 +$as_echo "$GTKDOC_CHECK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$GTKDOC_CHECK" && break +done + + + if test x$enable_gtk_doc = xyes; then + ENABLE_GTK_DOC_TRUE= + ENABLE_GTK_DOC_FALSE='#' +else + ENABLE_GTK_DOC_TRUE='#' + ENABLE_GTK_DOC_FALSE= +fi + + if test -n "$LIBTOOL"; then + GTK_DOC_USE_LIBTOOL_TRUE= + GTK_DOC_USE_LIBTOOL_FALSE='#' +else + GTK_DOC_USE_LIBTOOL_TRUE='#' + GTK_DOC_USE_LIBTOOL_FALSE= +fi + + + + + PYTHON_CANDIDATES="python python2.2 python2.1 python2.0 python2 \ + python1.6 python1.5" + + { $as_echo "$as_me:${as_lineno-$LINENO}: Looking for Python version >= 2.1" >&5 +$as_echo "$as_me: Looking for Python version >= 2.1" >&6;} + prog=" +import sys, string +minver = '2.1' +# split string by '.' and convert to numeric +minver_info = map(string.atoi, string.split(minver, '.')) +# we can now do comparisons on the two lists: +if sys.version_info >= tuple(minver_info): + sys.exit(0) +else: + sys.exit(1)" + + python_good=false + for python_candidate in $PYTHON_CANDIDATES; do + unset PYTHON + # Extract the first word of "$python_candidate", so it can be a program name with args. +set dummy $python_candidate; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PYTHON+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PYTHON in + [\\/]* | ?:[\\/]*) + ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PYTHON=$ac_cv_path_PYTHON +if test -n "$PYTHON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 +$as_echo "$PYTHON" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + 1> /dev/null 2> /dev/null + + if test "x$PYTHON" = "x"; then continue; fi + + if $PYTHON -c "$prog" 1>&5 2>&5; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking \"$PYTHON\":" >&5 +$as_echo_n "checking \"$PYTHON\":... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5 +$as_echo "okay" >&6; } + python_good=true + break; + else + unset ac_cv_path_PYTHON + fi + done + + + if test "$python_good" != "true"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No suitable version of python found" >&5 +$as_echo "$as_me: WARNING: No suitable version of python found" >&2;} + PYTHON= + else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking local Python configuration" >&5 +$as_echo_n "checking local Python configuration... " >&6; } + + + + PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[:3]"` + + + + + PYTHON_PREFIX='${prefix}' + + + PYTHON_EXEC_PREFIX='${exec_prefix}' + + + + PYTHON_PLATFORM=`$PYTHON -c "import sys; print sys.platform"` + + + + + + pythondir=$PYTHON_PREFIX"/lib/python"$PYTHON_VERSION/site-packages + + + + pkgpythondir=\${pythondir}/$PACKAGE + + + + pyexecdir=$PYTHON_EXEC_PREFIX"/lib/python"$PYTHON_VERSION/site-packages + + + + pkgpyexecdir=\${pyexecdir}/$PACKAGE + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: looks good" >&5 +$as_echo "looks good" >&6; } + + fi + + + + build_plugin_docs=no + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build plugin documentation" >&5 +$as_echo_n "checking whether to build plugin documentation... " >&6; } + if test x$enable_gtk_doc = xyes; then + build_plugin_docs=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (gtk-doc disabled or not available)" >&5 +$as_echo "no (gtk-doc disabled or not available)" >&6; } + fi + + if test x$build_plugin_docs = xyes; then + ENABLE_PLUGIN_DOCS_TRUE= + ENABLE_PLUGIN_DOCS_FALSE='#' +else + ENABLE_PLUGIN_DOCS_TRUE='#' + ENABLE_PLUGIN_DOCS_FALSE= +fi + + + + +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 +$as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } +if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmw $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char _mwvalidcheckl (); +int +main () +{ +return _mwvalidcheckl (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mw__mwvalidcheckl=yes +else + ac_cv_lib_mw__mwvalidcheckl=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 +$as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } +if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : + LIBM="-lmw" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_cos=yes +else + ac_cv_lib_m_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + LIBM="$LIBM -lm" +fi + + ;; +*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_cos=yes +else + ac_cv_lib_m_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + LIBM="-lm" +fi + + ;; +esac + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + + +# ------ AX CREATE STDINT H ------------------------------------- +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint types" >&5 +$as_echo_n "checking for stdint types... " >&6; } +ac_stdint_h=`echo _stdint.h` +# try to shortcircuit - if the default include path of the compiler +# can find a "stdint.h" header then we assume that all compilers can. +if ${ac_cv_header_stdint_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + +old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS="" +old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS="" +old_CFLAGS="$CFLAGS" ; CFLAGS="" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int_least32_t v = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_stdint_result="(assuming C99 compatible system)" + ac_cv_header_stdint_t="stdint.h"; +else + ac_cv_header_stdint_t="" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then +CFLAGS="-std=c99" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int_least32_t v = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&5 +$as_echo "$as_me: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&2;} +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +CXXFLAGS="$old_CXXFLAGS" +CPPFLAGS="$old_CPPFLAGS" +CFLAGS="$old_CFLAGS" +fi + + +v="... $ac_cv_header_stdint_h" +if test "$ac_stdint_h" = "stdint.h" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./stdint.h?)" >&5 +$as_echo "(are you sure you want them in ./stdint.h?)" >&6; } +elif test "$ac_stdint_h" = "inttypes.h" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./inttypes.h?)" >&5 +$as_echo "(are you sure you want them in ./inttypes.h?)" >&6; } +elif test "_$ac_cv_header_stdint_t" = "_" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: (putting them into $ac_stdint_h)$v" >&5 +$as_echo "(putting them into $ac_stdint_h)$v" >&6; } +else + ac_cv_header_stdint="$ac_cv_header_stdint_t" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint (shortcircuit)" >&5 +$as_echo "$ac_cv_header_stdint (shortcircuit)" >&6; } +fi + +if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit.. + + +inttype_headers=`echo | sed -e 's/,/ /g'` + +ac_cv_stdint_result="(no helpful system typedefs seen)" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5 +$as_echo_n "checking for stdint uintptr_t... " >&6; } +if ${ac_cv_header_stdint_x+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 +$as_echo "(..)" >&6; } + for i in stdint.h inttypes.h sys/inttypes.h $inttype_headers + do + unset ac_cv_type_uintptr_t + unset ac_cv_type_uint64_t + ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <$i> +" +if test "x$ac_cv_type_uintptr_t" = xyes; then : + ac_cv_header_stdint_x=$i +else + continue +fi + + ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i> +" +if test "x$ac_cv_type_uint64_t" = xyes; then : + and64="/uint64_t" +else + and64="" +fi + + ac_cv_stdint_result="(seen uintptr_t$and64 in $i)" + break + done + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5 +$as_echo_n "checking for stdint uintptr_t... " >&6; } + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_x" >&5 +$as_echo "$ac_cv_header_stdint_x" >&6; } + + +if test "_$ac_cv_header_stdint_x" = "_" ; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5 +$as_echo_n "checking for stdint uint32_t... " >&6; } +if ${ac_cv_header_stdint_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 +$as_echo "(..)" >&6; } + for i in inttypes.h sys/inttypes.h stdint.h $inttype_headers + do + unset ac_cv_type_uint32_t + unset ac_cv_type_uint64_t + ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <$i> +" +if test "x$ac_cv_type_uint32_t" = xyes; then : + ac_cv_header_stdint_o=$i +else + continue +fi + + ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i> +" +if test "x$ac_cv_type_uint64_t" = xyes; then : + and64="/uint64_t" +else + and64="" +fi + + ac_cv_stdint_result="(seen uint32_t$and64 in $i)" + break + break; + done + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5 +$as_echo_n "checking for stdint uint32_t... " >&6; } + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_o" >&5 +$as_echo "$ac_cv_header_stdint_o" >&6; } + +fi + +if test "_$ac_cv_header_stdint_x" = "_" ; then +if test "_$ac_cv_header_stdint_o" = "_" ; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5 +$as_echo_n "checking for stdint u_int32_t... " >&6; } +if ${ac_cv_header_stdint_u+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 +$as_echo "(..)" >&6; } + for i in sys/types.h inttypes.h sys/inttypes.h $inttype_headers ; do + unset ac_cv_type_u_int32_t + unset ac_cv_type_u_int64_t + ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <$i> +" +if test "x$ac_cv_type_u_int32_t" = xyes; then : + ac_cv_header_stdint_u=$i +else + continue +fi + + ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include<$i> +" +if test "x$ac_cv_type_u_int64_t" = xyes; then : + and64="/u_int64_t" +else + and64="" +fi + + ac_cv_stdint_result="(seen u_int32_t$and64 in $i)" + break + break; + done + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5 +$as_echo_n "checking for stdint u_int32_t... " >&6; } + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_u" >&5 +$as_echo "$ac_cv_header_stdint_u" >&6; } + +fi fi + +if test "_$ac_cv_header_stdint_x" = "_" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint datatype model" >&5 +$as_echo_n "checking for stdint datatype model... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 +$as_echo "(..)" >&6; } + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5 +$as_echo_n "checking size of char... " >&6; } +if ${ac_cv_sizeof_char+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_char" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (char) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_char=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 +$as_echo "$ac_cv_sizeof_char" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_CHAR $ac_cv_sizeof_char +_ACEOF + + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if ${ac_cv_sizeof_short+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (short) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SHORT $ac_cv_sizeof_short +_ACEOF + + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if ${ac_cv_sizeof_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if ${ac_cv_sizeof_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 +$as_echo_n "checking size of void*... " >&6; } +if ${ac_cv_sizeof_voidp+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_voidp" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (void*) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_voidp=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 +$as_echo "$ac_cv_sizeof_voidp" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOIDP $ac_cv_sizeof_voidp +_ACEOF + + + ac_cv_char_data_model="" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int" + ac_cv_long_data_model="" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking data model" >&5 +$as_echo_n "checking data model... " >&6; } + case "$ac_cv_char_data_model/$ac_cv_long_data_model" in + 122/242) ac_cv_data_model="IP16" ; n="standard 16bit machine" ;; + 122/244) ac_cv_data_model="LP32" ; n="standard 32bit machine" ;; + 122/*) ac_cv_data_model="i16" ; n="unusual int16 model" ;; + 124/444) ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;; + 124/488) ac_cv_data_model="LP64" ; n="standard 64bit unixish" ;; + 124/448) ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;; + 124/*) ac_cv_data_model="i32" ; n="unusual int32 model" ;; + 128/888) ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;; + 128/*) ac_cv_data_model="i64" ; n="unusual int64 model" ;; + 222/*2) ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;; + 333/*3) ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;; + 444/*4) ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;; + 666/*6) ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;; + 888/*8) ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;; + 222/*|333/*|444/*|666/*|888/*) : + ac_cv_data_model="iDSP" ; n="unusual dsptype" ;; + *) ac_cv_data_model="none" ; n="very unusual model" ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_data_model ($ac_cv_long_data_model, $n)" >&5 +$as_echo "$ac_cv_data_model ($ac_cv_long_data_model, $n)" >&6; } + +fi + +if test "_$ac_cv_header_stdint_x" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_x" +elif test "_$ac_cv_header_stdint_o" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_o" +elif test "_$ac_cv_header_stdint_u" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_u" +else + ac_cv_header_stdint="stddef.h" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra inttypes in chosen header" >&5 +$as_echo_n "checking for extra inttypes in chosen header... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ($ac_cv_header_stdint)" >&5 +$as_echo "($ac_cv_header_stdint)" >&6; } +unset ac_cv_type_int_least32_t +unset ac_cv_type_int_fast32_t +ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <$ac_cv_header_stdint> +" +if test "x$ac_cv_type_int_least32_t" = xyes; then : + +fi + +ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include<$ac_cv_header_stdint> +" +if test "x$ac_cv_type_int_fast32_t" = xyes; then : + +fi + +ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "#include <$ac_cv_header_stdint> +" +if test "x$ac_cv_type_intmax_t" = xyes; then : + +fi + + +fi # shortcircut to system "stdint.h" +# ------------------ PREPARE VARIABLES ------------------------------ +if test "$GCC" = "yes" ; then +ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1` +else +ac_cv_stdint_message="using $CC" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&5 +$as_echo "make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&6; } + +# ----------------- DONE inttypes.h checks START header ------------- +ac_config_commands="$ac_config_commands $ac_stdint_h" + + + +for ac_header in netinet/in.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NETINET_IN_H 1 +_ACEOF + +fi + +done + +for ac_header in winsock2.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" +if test "x$ac_cv_header_winsock2_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_WINSOCK2_H 1 +_ACEOF + HAVE_WINSOCK2_H=yes +fi + +done + + if test "x$HAVE_WINSOCK2_H" = "xyes"; then + HAVE_WINSOCK2_H_TRUE= + HAVE_WINSOCK2_H_FALSE='#' +else + HAVE_WINSOCK2_H_TRUE='#' + HAVE_WINSOCK2_H_FALSE= +fi + + +for ac_header in sys/time.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_TIME_H 1 +_ACEOF + +fi + +done + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/ioctl.h" >&5 +$as_echo_n "checking for FIONREAD in sys/ioctl.h... " >&6; } + if ${_cv_gst_fionread_in_sys_ioctl+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main () +{ + +int x = FIONREAD; +if ( x ) + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + _cv_gst_fionread_in_sys_ioctl="yes" +else + _cv_gst_fionread_in_sys_ioctl="no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_gst_fionread_in_sys_ioctl" >&5 +$as_echo "$_cv_gst_fionread_in_sys_ioctl" >&6; } + + if test "$_cv_gst_fionread_in_sys_ioctl" = "yes"; then + +$as_echo "#define HAVE_FIONREAD_IN_SYS_IOCTL 1" >>confdefs.h + + + else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/filio.h" >&5 +$as_echo_n "checking for FIONREAD in sys/filio.h... " >&6; } + if ${_cv_gst_fionread_in_sys_filio+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + +int +main () +{ + + int x = FIONREAD; + if ( x ) + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + _cv_gst_fionread_in_sys_filio="yes" +else + _cv_gst_fionread_in_sys_filio="no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_gst_fionread_in_sys_filio" >&5 +$as_echo "$_cv_gst_fionread_in_sys_filio" >&6; } + + if test "$_cv_gst_fionread_in_sys_filio" = "yes"; then + +$as_echo "#define HAVE_FIONREAD_IN_SYS_FILIO 1" >>confdefs.h + + fi + + fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports gcc-style inline assembly" >&5 +$as_echo_n "checking if compiler supports gcc-style inline assembly... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifdef __GNUC_MINOR__ +#if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 +#error GCC before 3.4 has critical bugs compiling inline assembly +#endif +#endif +__asm__ (""::) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + if test "X$flag_ok" = Xyes ; then + HAVE_GCC_ASM=yes + true + else + HAVE_GCC_ASM=no + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + +if test x$HAVE_GCC_ASM = xyes ; then + +$as_echo "#define HAVE_GCC_ASM 1" >>confdefs.h + +fi + if test "x$HAVE_GCC_ASM" = "xyes"; then + HAVE_GCC_ASM_TRUE= + HAVE_GCC_ASM_FALSE='#' +else + HAVE_GCC_ASM_TRUE='#' + HAVE_GCC_ASM_FALSE= +fi + + + +LIBS_SAVE=$LIBS +LIBS="$LIBS $LIBM" +for ac_func in rint sinh cosh asinh fpclass +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +LIBS=$LIBS_SAVE + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf" >&5 +$as_echo_n "checking for isinf... " >&6; } +if ${ac_cv_have_isinf+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +float f = 0.0; int i=isinf(f) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_have_isinf="yes" +else + ac_cv_have_isinf="no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_isinf" >&5 +$as_echo "$ac_cv_have_isinf" >&6; } +if test "$ac_cv_have_isinf" = "yes" +then + +$as_echo "#define HAVE_ISINF 1" >>confdefs.h + +fi + + + + + for ac_header in $ac_header_list +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + +for ac_func in getpagesize +do : + ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" +if test "x$ac_cv_func_getpagesize" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETPAGESIZE 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 +$as_echo_n "checking for working mmap... " >&6; } +if ${ac_cv_func_mmap_fixed_mapped+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_mmap_fixed_mapped=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H +char *malloc (); +#endif + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +int +main () +{ + char *data, *data2, *data3; + const char *cdata2; + int i, pagesize; + int fd, fd2; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + return 1; + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + return 2; + if (write (fd, data, pagesize) != pagesize) + return 3; + close (fd); + + /* Next, check that the tail of a page is zero-filled. File must have + non-zero length, otherwise we risk SIGBUS for entire page. */ + fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); + if (fd2 < 0) + return 4; + cdata2 = ""; + if (write (fd2, cdata2, 1) != 1) + return 5; + data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); + if (data2 == MAP_FAILED) + return 6; + for (i = 0; i < pagesize; ++i) + if (*(data2 + i)) + return 7; + close (fd2); + if (munmap (data2, pagesize)) + return 8; + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + return 9; + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + return 10; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + return 11; + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + return 12; + if (read (fd, data3, pagesize) != pagesize) + return 13; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + return 14; + close (fd); + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_mmap_fixed_mapped=yes +else + ac_cv_func_mmap_fixed_mapped=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 +$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } +if test $ac_cv_func_mmap_fixed_mapped = yes; then + +$as_echo "#define HAVE_MMAP 1" >>confdefs.h + +fi +rm -f conftest.mmap conftest.txt + + if test "x$ac_cv_func_mmap_fixed_mapped" = "xyes"; then + GST_HAVE_MMAP_TRUE= + GST_HAVE_MMAP_FALSE='#' +else + GST_HAVE_MMAP_TRUE='#' + GST_HAVE_MMAP_FALSE= +fi + + + +ac_fn_c_check_type "$LINENO" "struct ip_mreqn" "ac_cv_type_struct_ip_mreqn" "#include +" +if test "x$ac_cv_type_struct_ip_mreqn" = xyes; then : + + +$as_echo "#define HAVE_IP_MREQN /**/" >>confdefs.h + +fi + + + + + + + GLIB_REQ=2.24 + if test "x$GLIB_REQ" = "x" + then + as_fn_error $? "Please specify a required version for GLib 2.0" "$LINENO" 5 + fi + + + + which="glib-2.0 >= $GLIB_REQ gobject-2.0 gthread-2.0 gmodule-no-export-2.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 +$as_echo_n "checking for GLIB... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GLIB_CFLAGS"; then + pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GLIB_LIBS"; then + pkg_cv_GLIB_LIBS="$GLIB_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GLIB_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GLIB="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$GLIB_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $GLIB_PKG_ERRORS" >&5 +$as_echo "$as_me: $GLIB_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GLIB="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$GLIB_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $GLIB_PKG_ERRORS" >&5 +$as_echo "$as_me: $GLIB_PKG_ERRORS" >&6;} + fi + +else + GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS + GLIB_LIBS=$pkg_cv_GLIB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GLIB="yes" + +fi + + + + if test "x$HAVE_GLIB" = "xno"; then + as_fn_error $? "This package requires GLib >= $GLIB_REQ to compile." "$LINENO" 5 + fi + + GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_THREADS_MANDATORY" + + if test "x$PACKAGE_VERSION_NANO" = "x1"; then + GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_DEPRECATED" + fi + + # Check whether --enable-gobject-cast-checks was given. +if test "${enable_gobject_cast_checks+set}" = set; then : + enableval=$enable_gobject_cast_checks; +else + enable_gobject_cast_checks=auto +fi + + + if test "x$enable_gobject_cast_checks" = "xauto"; then + if test "x$PACKAGE_VERSION_NANO" = "x1"; then + enable_gobject_cast_checks=yes + else + enable_gobject_cast_checks=no + fi + fi + + if test "x$enable_gobject_cast_checks" = "xno"; then + GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_CAST_CHECKS" + fi + + # Check whether --enable-glib-asserts was given. +if test "${enable_glib_asserts+set}" = set; then : + enableval=$enable_glib_asserts; +else + enable_glib_assertions=auto +fi + + + if test "x$enable_glib_assertions" = "xauto"; then + if test "x$PACKAGE_VERSION_NANO" = "x1"; then + enable_glib_assertions=yes + else + enable_glib_assertions=no + fi + fi + + if test "x$enable_glib_assertions" = "xno"; then + GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT" + fi + + + GIVEN_CFLAGS=$GLIB_CFLAGS + INCLUDE_DIRS=`echo | cpp -v 2>&1` + + INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` + for dir in $INCLUDE_DIRS; do + GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` + done + GLIB_CFLAGS=$GIVEN_CFLAGS + + + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIO" >&5 +$as_echo_n "checking for GIO... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GIO_CFLAGS"; then + pkg_cv_GIO_CFLAGS="$GIO_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gio-2.0 >= 2.20 \""; } >&5 + ($PKG_CONFIG --exists --print-errors " gio-2.0 >= 2.20 ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GIO_CFLAGS=`$PKG_CONFIG --cflags " gio-2.0 >= 2.20 " 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GIO_LIBS"; then + pkg_cv_GIO_LIBS="$GIO_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gio-2.0 >= 2.20 \""; } >&5 + ($PKG_CONFIG --exists --print-errors " gio-2.0 >= 2.20 ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GIO_LIBS=`$PKG_CONFIG --libs " gio-2.0 >= 2.20 " 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors " gio-2.0 >= 2.20 "` + else + GIO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors " gio-2.0 >= 2.20 "` + fi + # Put the nasty error message in config.log where it belongs + echo "$GIO_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "gio is required" "$LINENO" 5 +elif test $pkg_failed = untried; then + as_fn_error $? "gio is required" "$LINENO" 5 +else + GIO_CFLAGS=$pkg_cv_GIO_CFLAGS + GIO_LIBS=$pkg_cv_GIO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + + ORC_REQ=0.4.11 + + # Check whether --enable-orc was given. +if test "${enable_orc+set}" = set; then : + enableval=$enable_orc; case "${enableval}" in + auto) enable_orc=auto ;; + yes) enable_orc=yes ;; + no) enable_orc=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-orc" "$LINENO" 5 ;; + esac + +else + enable_orc=auto +fi + + if test "x$enable_orc" != "xno" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ORC" >&5 +$as_echo_n "checking for ORC... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$ORC_CFLAGS"; then + pkg_cv_ORC_CFLAGS="$ORC_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"orc-0.4 >= \$ORC_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "orc-0.4 >= $ORC_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ORC_CFLAGS=`$PKG_CONFIG --cflags "orc-0.4 >= $ORC_REQ" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$ORC_LIBS"; then + pkg_cv_ORC_LIBS="$ORC_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"orc-0.4 >= \$ORC_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "orc-0.4 >= $ORC_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ORC_LIBS=`$PKG_CONFIG --libs "orc-0.4 >= $ORC_REQ" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + ORC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "orc-0.4 >= $ORC_REQ"` + else + ORC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "orc-0.4 >= $ORC_REQ"` + fi + # Put the nasty error message in config.log where it belongs + echo "$ORC_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + if test "x$enable_orc" = "xyes" ; then + as_fn_error $? "--enable-orc specified, but Orc >= $ORC_REQ not found" "$LINENO" 5 + fi + +$as_echo "#define DISABLE_ORC 1" >>confdefs.h + + HAVE_ORC=no + HAVE_ORCC=no + +elif test $pkg_failed = untried; then + + if test "x$enable_orc" = "xyes" ; then + as_fn_error $? "--enable-orc specified, but Orc >= $ORC_REQ not found" "$LINENO" 5 + fi + +$as_echo "#define DISABLE_ORC 1" >>confdefs.h + + HAVE_ORC=no + HAVE_ORCC=no + +else + ORC_CFLAGS=$pkg_cv_ORC_CFLAGS + ORC_LIBS=$pkg_cv_ORC_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +$as_echo "#define HAVE_ORC 1" >>confdefs.h + + HAVE_ORC=yes + if test "x$ORCC" = "x" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usable orcc" >&5 +$as_echo_n "checking for usable orcc... " >&6; } + ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` + if $ORCC --version 1> /dev/null 2> /dev/null; then : + +else + ORCC=`which orcc` +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ORCC" >&5 +$as_echo "$ORCC" >&6; } + fi + + ORCC_FLAGS="--compat $ORC_REQ" + + if test "x$ORCC" = "x"; then : + HAVE_ORCC=no +else + HAVE_ORCC=yes +fi + +fi + else + +$as_echo "#define DISABLE_ORC 1" >>confdefs.h + + HAVE_ORC=no + HAVE_ORCC=no + fi + if test "x$HAVE_ORC" = "xyes"; then + HAVE_ORC_TRUE= + HAVE_ORC_FALSE='#' +else + HAVE_ORC_TRUE='#' + HAVE_ORC_FALSE= +fi + + if test "x$HAVE_ORCC" = "xyes"; then + HAVE_ORCC_TRUE= + HAVE_ORCC_FALSE='#' +else + HAVE_ORCC_TRUE='#' + HAVE_ORCC_FALSE= +fi + + + + + + + module=gstreamer-$GST_MAJORMINOR + minver=$GST_REQ + name="GStreamer" + required=yes + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST" >&5 +$as_echo_n "checking for GST... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GST_CFLAGS"; then + pkg_cv_GST_CFLAGS="$GST_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GST_LIBS"; then + pkg_cv_GST_LIBS="$GST_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GST_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` + else + GST_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GST_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GST="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GST="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +else + GST_CFLAGS=$pkg_cv_GST_CFLAGS + GST_LIBS=$pkg_cv_GST_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GST="yes" + +fi + + + if test -z $GST_TOOLS_DIR; then + GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-$GST_MAJORMINOR` + if test -z $GST_TOOLS_DIR; then + as_fn_error $? "no tools dir set in GStreamer pkg-config file, core upgrade needed." "$LINENO" 5 + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer tools in $GST_TOOLS_DIR" >&5 +$as_echo "$as_me: using GStreamer tools in $GST_TOOLS_DIR" >&6;} + + + if test -z $GST_PLUGINS_DIR; then + GST_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-$GST_MAJORMINOR` + if test -z $GST_PLUGINS_DIR; then + as_fn_error $? "no pluginsdir set in GStreamer pkg-config file, core upgrade needed." "$LINENO" 5 + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer plug-ins in $GST_PLUGINS_DIR" >&5 +$as_echo "$as_me: using GStreamer plug-ins in $GST_PLUGINS_DIR" >&6;} + + + + + module=gstreamer-base-$GST_MAJORMINOR + minver=$GST_REQ + name="GStreamer Base Libraries" + required=yes + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_BASE" >&5 +$as_echo_n "checking for GST_BASE... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GST_BASE_CFLAGS"; then + pkg_cv_GST_BASE_CFLAGS="$GST_BASE_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_BASE_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GST_BASE_LIBS"; then + pkg_cv_GST_BASE_LIBS="$GST_BASE_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_BASE_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GST_BASE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` + else + GST_BASE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GST_BASE_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GST_BASE="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_BASE_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_BASE_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GST_BASE="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_BASE_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_BASE_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +else + GST_BASE_CFLAGS=$pkg_cv_GST_BASE_CFLAGS + GST_BASE_LIBS=$pkg_cv_GST_BASE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GST_BASE="yes" + +fi + + + + + + module=gstreamer-dataprotocol-$GST_MAJORMINOR + minver=$GST_REQ + name="GStreamer Data Protocol Library" + required=yes + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_GDP" >&5 +$as_echo_n "checking for GST_GDP... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GST_GDP_CFLAGS"; then + pkg_cv_GST_GDP_CFLAGS="$GST_GDP_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_GDP_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GST_GDP_LIBS"; then + pkg_cv_GST_GDP_LIBS="$GST_GDP_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_GDP_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GST_GDP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` + else + GST_GDP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GST_GDP_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GST_GDP="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_GDP_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_GDP_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GST_GDP="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_GDP_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_GDP_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +else + GST_GDP_CFLAGS=$pkg_cv_GST_GDP_CFLAGS + GST_GDP_LIBS=$pkg_cv_GST_GDP_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GST_GDP="yes" + +fi + + + + + + module=gstreamer-controller-$GST_MAJORMINOR + minver=$GST_REQ + name="GStreamer Controller Library" + required=yes + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_CONTROLLER" >&5 +$as_echo_n "checking for GST_CONTROLLER... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GST_CONTROLLER_CFLAGS"; then + pkg_cv_GST_CONTROLLER_CFLAGS="$GST_CONTROLLER_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_CONTROLLER_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GST_CONTROLLER_LIBS"; then + pkg_cv_GST_CONTROLLER_LIBS="$GST_CONTROLLER_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_CONTROLLER_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GST_CONTROLLER_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` + else + GST_CONTROLLER_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GST_CONTROLLER_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GST_CONTROLLER="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CONTROLLER_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_CONTROLLER_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GST_CONTROLLER="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CONTROLLER_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_CONTROLLER_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +else + GST_CONTROLLER_CFLAGS=$pkg_cv_GST_CONTROLLER_CFLAGS + GST_CONTROLLER_LIBS=$pkg_cv_GST_CONTROLLER_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GST_CONTROLLER="yes" + +fi + + + + + + module=gstreamer-check-$GST_MAJORMINOR + minver=$GST_REQ + name="GStreamer Check unittest Library" + required=no + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_CHECK" >&5 +$as_echo_n "checking for GST_CHECK... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GST_CHECK_CFLAGS"; then + pkg_cv_GST_CHECK_CFLAGS="$GST_CHECK_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_CHECK_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GST_CHECK_LIBS"; then + pkg_cv_GST_CHECK_LIBS="$GST_CHECK_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_CHECK_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GST_CHECK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` + else + GST_CHECK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GST_CHECK_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GST_CHECK="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CHECK_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_CHECK_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GST_CHECK="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CHECK_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_CHECK_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +else + GST_CHECK_CFLAGS=$pkg_cv_GST_CHECK_CFLAGS + GST_CHECK_LIBS=$pkg_cv_GST_CHECK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GST_CHECK="yes" + +fi + + + + + + module=gstreamer-plugins-base-$GST_MAJORMINOR + minver=$GSTPB_REQ + name="GStreamer Base Plugins" + required=yes + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PLUGINS_BASE" >&5 +$as_echo_n "checking for GST_PLUGINS_BASE... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GST_PLUGINS_BASE_CFLAGS"; then + pkg_cv_GST_PLUGINS_BASE_CFLAGS="$GST_PLUGINS_BASE_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_PLUGINS_BASE_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GST_PLUGINS_BASE_LIBS"; then + pkg_cv_GST_PLUGINS_BASE_LIBS="$GST_PLUGINS_BASE_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_PLUGINS_BASE_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GST_PLUGINS_BASE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` + else + GST_PLUGINS_BASE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GST_PLUGINS_BASE_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GST_PLUGINS_BASE="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_BASE_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_PLUGINS_BASE_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GST_PLUGINS_BASE="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_BASE_PKG_ERRORS" >&5 +$as_echo "$as_me: $GST_PLUGINS_BASE_PKG_ERRORS" >&6;} + if test "x$required" = "xyes"; then + as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 +$as_echo "$as_me: no $module >= $minver ($name) found" >&6;} + fi + +else + GST_PLUGINS_BASE_CFLAGS=$pkg_cv_GST_PLUGINS_BASE_CFLAGS + GST_PLUGINS_BASE_LIBS=$pkg_cv_GST_PLUGINS_BASE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GST_PLUGINS_BASE="yes" + +fi + + + + if test "x$HAVE_GST_PLUGINS_BASE" = "xyes"; then + if test -z $GSTPB_PLUGINS_DIR; then + GSTPB_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-base-$GST_MAJORMINOR` + if test -z $GSTPB_PLUGINS_DIR; then + as_fn_error $? "no pluginsdir set in GStreamer Base Plugins pkg-config file" "$LINENO" 5 + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&5 +$as_echo "$as_me: using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&6;} + GST_PLUGINS_BASE_DIR="$GSTPB_PLUGINS_DIR/gst:$GSTPB_PLUGINS_DIR/sys:$GSTPB_PLUGINS_DIR/ext" + + + fi + + +GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-$GST_MAJORMINOR` +if test -z $GST_TOOLS_DIR; then + as_fn_error $? "no tools dir defined in GStreamer pkg-config file; core upgrade needed." "$LINENO" 5 +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: Using GStreamer Core Plugins in $GST_PLUGINS_DIR" >&5 +$as_echo "$as_me: Using GStreamer Core Plugins in $GST_PLUGINS_DIR" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: Using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&5 +$as_echo "$as_me: Using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&6;} + + if test "x$HAVE_GST_CHECK" = "xyes"; then + HAVE_GST_CHECK_TRUE= + HAVE_GST_CHECK_FALSE='#' +else + HAVE_GST_CHECK_TRUE='#' + HAVE_GST_CHECK_FALSE= +fi + + +GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" +GST_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-$GST_MAJORMINOR`" +GSTPB_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-plugins-base-$GST_MAJORMINOR`" + + + + +HAVE_GTK=no +GTK2_REQ=2.14.0 +GTK3_REQ=2.91.3 +if test "x$BUILD_EXAMPLES" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which gtk+ version to compile examples against (optional)" >&5 +$as_echo_n "checking which gtk+ version to compile examples against (optional)... " >&6; } + +# Check whether --with-gtk was given. +if test "${with_gtk+set}" = set; then : + withval=$with_gtk; case "$with_gtk" in + 2.0) GTK_REQ=$GTK2_REQ ;; + 3.0) GTK_REQ=$GTK3_REQ ;; + *) as_fn_error $? "invalid gtk+ version specified" "$LINENO" 5;; + esac +else + with_gtk=2.0 + GTK_REQ=$GTK2_REQ +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_gtk (>= $GTK_REQ)" >&5 +$as_echo "$with_gtk (>= $GTK_REQ)" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 +$as_echo_n "checking for GTK... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GTK_CFLAGS"; then + pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-\$with_gtk >= \$GTK_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-$with_gtk >= $GTK_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-$with_gtk >= $GTK_REQ" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GTK_LIBS"; then + pkg_cv_GTK_LIBS="$GTK_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-\$with_gtk >= \$GTK_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-$with_gtk >= $GTK_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-$with_gtk >= $GTK_REQ" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-$with_gtk >= $GTK_REQ"` + else + GTK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-$with_gtk >= $GTK_REQ"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTK_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_GTK=no +elif test $pkg_failed = untried; then + HAVE_GTK=no +else + GTK_CFLAGS=$pkg_cv_GTK_CFLAGS + GTK_LIBS=$pkg_cv_GTK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_GTK=yes +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_X11" >&5 +$as_echo_n "checking for GTK_X11... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GTK_X11_CFLAGS"; then + pkg_cv_GTK_X11_CFLAGS="$GTK_X11_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-x11-\$with_gtk >= \$GTK_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_X11_CFLAGS=`$PKG_CONFIG --cflags "gtk+-x11-$with_gtk >= $GTK_REQ" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GTK_X11_LIBS"; then + pkg_cv_GTK_X11_LIBS="$GTK_X11_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-x11-\$with_gtk >= \$GTK_REQ\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_X11_LIBS=`$PKG_CONFIG --libs "gtk+-x11-$with_gtk >= $GTK_REQ" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTK_X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ"` + else + GTK_X11_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTK_X11_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_GTK_X11=no +elif test $pkg_failed = untried; then + HAVE_GTK_X11=no +else + GTK_X11_CFLAGS=$pkg_cv_GTK_X11_CFLAGS + GTK_X11_LIBS=$pkg_cv_GTK_X11_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_GTK_X11=yes +fi + + +fi + if test "x$HAVE_GTK" = "xyes"; then + HAVE_GTK_TRUE= + HAVE_GTK_FALSE='#' +else + HAVE_GTK_TRUE='#' + HAVE_GTK_FALSE= +fi + + if test "x$HAVE_GTK_X11" = "xyes"; then + HAVE_GTK_X11_TRUE= + HAVE_GTK_X11_FALSE='#' +else + HAVE_GTK_X11_TRUE='#' + HAVE_GTK_X11_FALSE= +fi + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: GConf schemas ***" >&5 +$as_echo "$as_me: *** checking feature: GConf schemas ***" >&6;} +if test "x" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 +$as_echo "$as_me: *** for plug-ins: ***" >&6;} +fi +NOUSE= +if test "x$USE_GCONFTOOL" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-gconftool was given. +if test "${enable_gconftool+set}" = set; then : + enableval=$enable_gconftool; case "${enableval}" in + yes) USE_GCONFTOOL=yes;; + no) USE_GCONFTOOL=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-gconftool" "$LINENO" 5 ;; + esac +else + USE_GCONFTOOL=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_GCONFTOOL="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_GCONFTOOL = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_GCONFTOOL=no + + # Extract the first word of "gconftool-2", so it can be a program name with args. +set dummy gconftool-2; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GCONFTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GCONFTOOL in + [\\/]* | ?:[\\/]*) + ac_cv_path_GCONFTOOL="$GCONFTOOL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GCONFTOOL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GCONFTOOL" && ac_cv_path_GCONFTOOL="no" + ;; +esac +fi +GCONFTOOL=$ac_cv_path_GCONFTOOL +if test -n "$GCONFTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCONFTOOL" >&5 +$as_echo "$GCONFTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x$GCONFTOOL = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not installing GConf schemas" >&5 +$as_echo "$as_me: WARNING: Not installing GConf schemas" >&2;} + HAVE_GCONFTOOL="no" + else + HAVE_GCONFTOOL="yes" + fi + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_GCONFTOOL = xno; then + USE_GCONFTOOL=no + else + : + fi +fi +if test x$USE_GCONFTOOL = xyes; then + : + if test "x" != "x"; then + GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_GCONFTOOL /**/" >>confdefs.h + +else + : + if test "x" != "x"; then + GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_GCONFTOOL = xyes; then + USE_GCONFTOOL_TRUE= + USE_GCONFTOOL_FALSE='#' +else + USE_GCONFTOOL_TRUE='#' + USE_GCONFTOOL_FALSE= +fi + + + + +GST_LICENSE="LGPL" + +cat >>confdefs.h <<_ACEOF +#define GST_LICENSE "$GST_LICENSE" +_ACEOF + + + + + + EXP_VAR=PLUGINDIR + FROM_VAR=${libdir}/gstreamer-$GST_MAJORMINOR + + prefix_save=$prefix + exec_prefix_save=$exec_prefix + + if test "x$prefix" = "xNONE"; then + prefix="$ac_default_prefix" + fi + if test "x$exec_prefix" = "xNONE"; then + exec_prefix=$prefix + fi + + full_var="$FROM_VAR" + while true; do + new_full_var="`eval echo $full_var`" + if test "x$new_full_var" = "x$full_var"; then break; fi + full_var=$new_full_var + done + + full_var=$new_full_var + PLUGINDIR="$full_var" + + + prefix=$prefix_save + exec_prefix=$exec_prefix_save + + +cat >>confdefs.h <<_ACEOF +#define PLUGINDIR "$PLUGINDIR" +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $PLUGINDIR as the plugin install location" >&5 +$as_echo "$as_me: Using $PLUGINDIR as the plugin install location" >&6;} + + plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" + + + + + if test "x$PACKAGE_VERSION_NANO" = "x0"; then + + if test "xyes" = "xno" -o "xyes" = "x"; then + GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"` + elif test "xyes" = "xyes"; then + if ( echo yes | grep -e '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then + GST_PACKAGE_RELEASE_DATETIME=yes + else + YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO "${srcdir}/gst-plugins-good.doap" `; + if test "x$YYYY_MM_DD" != "x"; then + GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD + else + as_fn_error $? "SET_PACKAGE_RELEASE_DATETIME: could not extract + release date for release version $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO from \"${srcdir}/gst-plugins-good.doap\" " "$LINENO" 5 + GST_PACKAGE_RELEASE_DATETIME="" + fi + fi + elif ( echo yes | grep -e '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then + GST_PACKAGE_RELEASE_DATETIME=yes + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5 +$as_echo "$as_me: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&2;} + GST_PACKAGE_RELEASE_DATETIME="" + fi + + if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&5 +$as_echo "$as_me: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&2;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&5 +$as_echo "$as_me: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&6;} + + +cat >>confdefs.h <<_ACEOF +#define GST_PACKAGE_RELEASE_DATETIME "$GST_PACKAGE_RELEASE_DATETIME" +_ACEOF + + fi + + else + + if test "xno" = "xno" -o "xno" = "x"; then + GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"` + elif test "xno" = "xyes"; then + if ( echo no | grep -e '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then + GST_PACKAGE_RELEASE_DATETIME=no + else + YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" `; + if test "x$YYYY_MM_DD" != "x"; then + GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD + else + as_fn_error $? "SET_PACKAGE_RELEASE_DATETIME: could not extract + release date for release version from " "$LINENO" 5 + GST_PACKAGE_RELEASE_DATETIME="" + fi + fi + elif ( echo no | grep -e '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then + GST_PACKAGE_RELEASE_DATETIME=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5 +$as_echo "$as_me: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&2;} + GST_PACKAGE_RELEASE_DATETIME="" + fi + + if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&5 +$as_echo "$as_me: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&2;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&5 +$as_echo "$as_me: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&6;} + + +cat >>confdefs.h <<_ACEOF +#define GST_PACKAGE_RELEASE_DATETIME "$GST_PACKAGE_RELEASE_DATETIME" +_ACEOF + + fi + + fi + + +if test "x$HAVE_OSX_VIDEO" != "xyes"; then + + + + + WARNING_CFLAGS="" + ERROR_CFLAGS="" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wall" >&5 +$as_echo_n "checking to see if compiler understands -Wall... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wall" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wall" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wdeclaration-after-statement" >&5 +$as_echo_n "checking to see if compiler understands -Wdeclaration-after-statement... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wdeclaration-after-statement" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wdeclaration-after-statement" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wvla" >&5 +$as_echo_n "checking to see if compiler understands -Wvla... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wvla" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wvla" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wpointer-arith" >&5 +$as_echo_n "checking to see if compiler understands -Wpointer-arith... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wpointer-arith" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wpointer-arith" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + if test "x$GST_GIT" != "xno" + then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Werror" >&5 +$as_echo_n "checking to see if compiler understands -Werror... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CFLAGS="$ERROR_CFLAGS -Werror" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + if test "x$ERROR_CFLAGS" = "x" + then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all" >&5 +$as_echo_n "checking to see if compiler understands -errwarn=%all... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -errwarn=%all" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + + ERROR_CFLAGS="-errwarn=%all" + for f in 'no%E_EMPTY_DECLARATION' \ + 'no%E_STATEMENT_NOT_REACHED' \ + 'no%E_ARGUEMENT_MISMATCH' \ + 'no%E_MACRO_REDEFINED' \ + 'no%E_LOOP_NOT_ENTERED_AT_TOP' + do + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all,$f" >&5 +$as_echo_n "checking to see if compiler understands -errwarn=%all,$f... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -errwarn=%all,$f" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + + ERROR_CFLAGS="$ERROR_CFLAGS,$f" + + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + done + + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 < 2.19.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 < 2.19.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -fno-strict-aliasing" >&5 +$as_echo_n "checking to see if compiler understands -fno-strict-aliasing... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-strict-aliasing" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CFLAGS="$ERROR_CFLAGS -fno-strict-aliasing" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + +fi + fi + fi + + if test "x + -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls + -Wwrite-strings -Wold-style-definition -Waggregate-return + -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar + -Wnested-externs " != "x" + then + UNSUPPORTED="" + list=" + -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls + -Wwrite-strings -Wold-style-definition -Waggregate-return + -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar + -Wnested-externs " + for each in $list + do + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands $each" >&5 +$as_echo_n "checking to see if compiler understands $each... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $each" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS $each" + true + else + UNSUPPORTED="$UNSUPPORTED $each" + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + done + if test "X$UNSUPPORTED" != X ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5 +$as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;} + fi + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_CFLAGS to $WARNING_CFLAGS" >&5 +$as_echo "$as_me: set WARNING_CFLAGS to $WARNING_CFLAGS" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_CFLAGS to $ERROR_CFLAGS" >&5 +$as_echo "$as_me: set ERROR_CFLAGS to $ERROR_CFLAGS" >&6;} + +else + + + + + WARNING_CFLAGS="" + ERROR_CFLAGS="" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wall" >&5 +$as_echo_n "checking to see if compiler understands -Wall... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wall" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wall" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wdeclaration-after-statement" >&5 +$as_echo_n "checking to see if compiler understands -Wdeclaration-after-statement... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wdeclaration-after-statement" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wdeclaration-after-statement" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wvla" >&5 +$as_echo_n "checking to see if compiler understands -Wvla... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wvla" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wvla" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wpointer-arith" >&5 +$as_echo_n "checking to see if compiler understands -Wpointer-arith... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wpointer-arith" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wpointer-arith" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + if test "x$GST_GIT" != "xno" + then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Werror" >&5 +$as_echo_n "checking to see if compiler understands -Werror... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CFLAGS="$ERROR_CFLAGS -Werror" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + if test "x$ERROR_CFLAGS" = "x" + then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all" >&5 +$as_echo_n "checking to see if compiler understands -errwarn=%all... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -errwarn=%all" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + + ERROR_CFLAGS="-errwarn=%all" + for f in 'no%E_EMPTY_DECLARATION' \ + 'no%E_STATEMENT_NOT_REACHED' \ + 'no%E_ARGUEMENT_MISMATCH' \ + 'no%E_MACRO_REDEFINED' \ + 'no%E_LOOP_NOT_ENTERED_AT_TOP' + do + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all,$f" >&5 +$as_echo_n "checking to see if compiler understands -errwarn=%all,$f... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -errwarn=%all,$f" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + + ERROR_CFLAGS="$ERROR_CFLAGS,$f" + + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + done + + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 < 2.19.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 < 2.19.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -fno-strict-aliasing" >&5 +$as_echo_n "checking to see if compiler understands -fno-strict-aliasing... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-strict-aliasing" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CFLAGS="$ERROR_CFLAGS -fno-strict-aliasing" + true + else + + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + +fi + fi + fi + + if test "x + -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls + -Wwrite-strings -Wold-style-definition + -Winit-self -Wmissing-include-dirs -Wno-multichar + -Wnested-externs " != "x" + then + UNSUPPORTED="" + list=" + -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls + -Wwrite-strings -Wold-style-definition + -Winit-self -Wmissing-include-dirs -Wno-multichar + -Wnested-externs " + for each in $list + do + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands $each" >&5 +$as_echo_n "checking to see if compiler understands $each... " >&6; } + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $each" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CFLAGS="$WARNING_CFLAGS $each" + true + else + UNSUPPORTED="$UNSUPPORTED $each" + true + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + done + if test "X$UNSUPPORTED" != X ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5 +$as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;} + fi + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_CFLAGS to $WARNING_CFLAGS" >&5 +$as_echo "$as_me: set WARNING_CFLAGS to $WARNING_CFLAGS" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_CFLAGS to $ERROR_CFLAGS" >&5 +$as_echo "$as_me: set ERROR_CFLAGS to $ERROR_CFLAGS" >&6;} + +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands " >&5 +$as_echo_n "checking to see if c++ compiler understands ... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS " + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + + true + else + + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + + + + ERROR_CXXFLAGS="" + WARNING_CXXFLAGS="" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Wall" >&5 +$as_echo_n "checking to see if c++ compiler understands -Wall... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -Wall" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CXXFLAGS="$WARNING_CXXFLAGS -Wall" + true + else + + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + if test "x$GST_GIT" != "xno" + then + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Werror" >&5 +$as_echo_n "checking to see if c++ compiler understands -Werror... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -Werror" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror" + true + else + + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + if test "x$ERROR_CXXFLAGS" != "x" + then + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Wno-non-virtual-dtor" >&5 +$as_echo_n "checking to see if c++ compiler understands -Wno-non-virtual-dtor... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -Wno-non-virtual-dtor" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Wno-non-virtual-dtor" + true + else + + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 < 2.19.8\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 < 2.19.8") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -fno-strict-aliasing" >&5 +$as_echo_n "checking to see if c++ compiler understands -fno-strict-aliasing... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -fno-strict-aliasing" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CXXFLAGS="$ERROR_CXXFLAGS -fno-strict-aliasing" + true + else + + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + +fi + else + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -errwarn=%all" >&5 +$as_echo_n "checking to see if c++ compiler understands -errwarn=%all... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -errwarn=%all" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CXXFLAGS="$ERROR_CXXFLAGS -errwarn=%all" + true + else + + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + if test "x$ERROR_CXXFLAGS" != "x"; then + for f in 'no%E_EMPTY_DECLARATION' \ + 'no%E_STATEMENT_NOT_REACHED' \ + 'no%E_ARGUEMENT_MISMATCH' \ + 'no%E_MACRO_REDEFINED' \ + 'no%E_LOOP_NOT_ENTERED_AT_TOP' + do + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -errwarn=%all,$f" >&5 +$as_echo_n "checking to see if c++ compiler understands -errwarn=%all,$f... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -errwarn=%all,$f" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + ERROR_CXXFLAGS="$ERROR_CXXFLAGS + true + else + $f" + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + done + fi + fi + fi + + if test "x + -Wmissing-declarations -Wredundant-decls + -Wwrite-strings + -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar " != "x" + then + UNSUPPORTED="" + list=" + -Wmissing-declarations -Wredundant-decls + -Wwrite-strings + -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar " + for each in $list + do + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands $each" >&5 +$as_echo_n "checking to see if c++ compiler understands $each... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $each" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + WARNING_CXXFLAGS="$WARNING_CXXFLAGS $each" + true + else + UNSUPPORTED="$UNSUPPORTED $each" + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + done + if test "X$UNSUPPORTED" != X ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5 +$as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;} + fi + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_CXXFLAGS to $WARNING_CXXFLAGS" >&5 +$as_echo "$as_me: set WARNING_CXXFLAGS to $WARNING_CXXFLAGS" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_CXXFLAGS to $ERROR_CXXFLAGS" >&5 +$as_echo "$as_me: set ERROR_CXXFLAGS to $ERROR_CXXFLAGS" >&6;} + + + + if test "x$GST_GIT" = "xyes"; then + GST_LEVEL_DEFAULT=GST_LEVEL_ERROR + else + GST_LEVEL_DEFAULT=GST_LEVEL_NONE + fi + +cat >>confdefs.h <<_ACEOF +#define GST_LEVEL_DEFAULT $GST_LEVEL_DEFAULT +_ACEOF + + + + + + DEFAULT_AUDIOSINK="autoaudiosink" + DEFAULT_VIDEOSINK="autovideosink" + DEFAULT_AUDIOSRC="alsasrc" + DEFAULT_VIDEOSRC="v4l2src" + DEFAULT_VISUALIZER="goom" + case "$host" in + *-sun-* | *pc-solaris* ) + DEFAULT_AUDIOSRC="sunaudiosrc" + ;; + *-darwin* ) + DEFAULT_AUDIOSRC="osxaudiosrc" + ;; + esac + + +# Check whether --with-default-audiosink was given. +if test "${with_default_audiosink+set}" = set; then : + withval=$with_default_audiosink; + case "${withval}" in + yes) as_fn_error $? "bad value ${withval} for --with-default-audiosink" "$LINENO" 5 ;; + no) as_fn_error $? "bad value ${withval} for --with-default-audiosink" "$LINENO" 5 ;; + *) DEFAULT_AUDIOSINK="${withval}" ;; + esac + +else + + DEFAULT_AUDIOSINK="$DEFAULT_AUDIOSINK" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_AUDIOSINK as default audio sink" >&5 +$as_echo "$as_me: Using $DEFAULT_AUDIOSINK as default audio sink" >&6;} + + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_AUDIOSINK "$DEFAULT_AUDIOSINK" +_ACEOF + + + +# Check whether --with-default-audiosrc was given. +if test "${with_default_audiosrc+set}" = set; then : + withval=$with_default_audiosrc; + case "${withval}" in + yes) as_fn_error $? "bad value ${withval} for --with-default-audiosrc" "$LINENO" 5 ;; + no) as_fn_error $? "bad value ${withval} for --with-default-audiosrc" "$LINENO" 5 ;; + *) DEFAULT_AUDIOSRC="${withval}" ;; + esac + +else + + DEFAULT_AUDIOSRC="$DEFAULT_AUDIOSRC" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_AUDIOSRC as default audio source" >&5 +$as_echo "$as_me: Using $DEFAULT_AUDIOSRC as default audio source" >&6;} + + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_AUDIOSRC "$DEFAULT_AUDIOSRC" +_ACEOF + + + +# Check whether --with-default-videosink was given. +if test "${with_default_videosink+set}" = set; then : + withval=$with_default_videosink; + case "${withval}" in + yes) as_fn_error $? "bad value ${withval} for --with-default-videosink" "$LINENO" 5 ;; + no) as_fn_error $? "bad value ${withval} for --with-default-videosink" "$LINENO" 5 ;; + *) DEFAULT_VIDEOSINK="${withval}" ;; + esac + +else + + DEFAULT_VIDEOSINK="$DEFAULT_VIDEOSINK" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VIDEOSINK as default video sink" >&5 +$as_echo "$as_me: Using $DEFAULT_VIDEOSINK as default video sink" >&6;} + + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_VIDEOSINK "$DEFAULT_VIDEOSINK" +_ACEOF + + + +# Check whether --with-default-videosrc was given. +if test "${with_default_videosrc+set}" = set; then : + withval=$with_default_videosrc; + case "${withval}" in + yes) as_fn_error $? "bad value ${withval} for --with-default-videosrc" "$LINENO" 5 ;; + no) as_fn_error $? "bad value ${withval} for --with-default-videosrc" "$LINENO" 5 ;; + *) DEFAULT_VIDEOSRC="${withval}" ;; + esac + +else + + DEFAULT_VIDEOSRC="$DEFAULT_VIDEOSRC" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VIDEOSRC as default video source" >&5 +$as_echo "$as_me: Using $DEFAULT_VIDEOSRC as default video source" >&6;} + + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_VIDEOSRC "$DEFAULT_VIDEOSRC" +_ACEOF + + + +# Check whether --with-default-visualizer was given. +if test "${with_default_visualizer+set}" = set; then : + withval=$with_default_visualizer; + case "${withval}" in + yes) as_fn_error $? "bad value ${withval} for --with-default-visualizer" "$LINENO" 5 ;; + no) as_fn_error $? "bad value ${withval} for --with-default-visualizer" "$LINENO" 5 ;; + *) DEFAULT_VISUALIZER="${withval}" ;; + esac + +else + + DEFAULT_VISUALIZER="$DEFAULT_VISUALIZER" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VISUALIZER as default visualizer" >&5 +$as_echo "$as_me: Using $DEFAULT_VISUALIZER as default visualizer" >&6;} + + +cat >>confdefs.h <<_ACEOF +#define DEFAULT_VISUALIZER "$DEFAULT_VISUALIZER" +_ACEOF + + + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL videofilter" + + + + # Check whether --enable-videofilter was given. +if test "${enable_videofilter+set}" = set; then : + enableval=$enable_videofilter; + case "${enableval}" in + yes) gst_use_videofilter=yes ;; + no) gst_use_videofilter=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-videofilter" "$LINENO" 5 ;; + esac + +else + gst_use_videofilter=yes +fi + + if test x$gst_use_videofilter = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videofilter" >&5 +$as_echo "$as_me: disabling dependency-less plugin videofilter" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS videofilter" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videofilter " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videofilter" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videofilter " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videofilter / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " videofilter " > /dev/null; then + USE_PLUGIN_VIDEOFILTER_TRUE= + USE_PLUGIN_VIDEOFILTER_FALSE='#' +else + USE_PLUGIN_VIDEOFILTER_TRUE='#' + USE_PLUGIN_VIDEOFILTER_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL alpha" + + + + # Check whether --enable-alpha was given. +if test "${enable_alpha+set}" = set; then : + enableval=$enable_alpha; + case "${enableval}" in + yes) gst_use_alpha=yes ;; + no) gst_use_alpha=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-alpha" "$LINENO" 5 ;; + esac + +else + gst_use_alpha=yes +fi + + if test x$gst_use_alpha = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin alpha" >&5 +$as_echo "$as_me: disabling dependency-less plugin alpha" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS alpha" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " alpha " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED alpha" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " alpha " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ alpha / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " alpha " > /dev/null; then + USE_PLUGIN_ALPHA_TRUE= + USE_PLUGIN_ALPHA_FALSE='#' +else + USE_PLUGIN_ALPHA_TRUE='#' + USE_PLUGIN_ALPHA_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL apetag" + + + + # Check whether --enable-apetag was given. +if test "${enable_apetag+set}" = set; then : + enableval=$enable_apetag; + case "${enableval}" in + yes) gst_use_apetag=yes ;; + no) gst_use_apetag=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-apetag" "$LINENO" 5 ;; + esac + +else + gst_use_apetag=yes +fi + + if test x$gst_use_apetag = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin apetag" >&5 +$as_echo "$as_me: disabling dependency-less plugin apetag" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS apetag" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " apetag " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED apetag" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " apetag " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ apetag / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " apetag " > /dev/null; then + USE_PLUGIN_APETAG_TRUE= + USE_PLUGIN_APETAG_FALSE='#' +else + USE_PLUGIN_APETAG_TRUE='#' + USE_PLUGIN_APETAG_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL audiofx" + + + + # Check whether --enable-audiofx was given. +if test "${enable_audiofx+set}" = set; then : + enableval=$enable_audiofx; + case "${enableval}" in + yes) gst_use_audiofx=yes ;; + no) gst_use_audiofx=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-audiofx" "$LINENO" 5 ;; + esac + +else + gst_use_audiofx=yes +fi + + if test x$gst_use_audiofx = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audiofx" >&5 +$as_echo "$as_me: disabling dependency-less plugin audiofx" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS audiofx" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audiofx " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audiofx" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audiofx " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiofx / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " audiofx " > /dev/null; then + USE_PLUGIN_AUDIOFX_TRUE= + USE_PLUGIN_AUDIOFX_FALSE='#' +else + USE_PLUGIN_AUDIOFX_TRUE='#' + USE_PLUGIN_AUDIOFX_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL audioparsers" + + + + # Check whether --enable-audioparsers was given. +if test "${enable_audioparsers+set}" = set; then : + enableval=$enable_audioparsers; + case "${enableval}" in + yes) gst_use_audioparsers=yes ;; + no) gst_use_audioparsers=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-audioparsers" "$LINENO" 5 ;; + esac + +else + gst_use_audioparsers=yes +fi + + if test x$gst_use_audioparsers = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audioparsers" >&5 +$as_echo "$as_me: disabling dependency-less plugin audioparsers" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS audioparsers" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audioparsers " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audioparsers" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audioparsers " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audioparsers / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " audioparsers " > /dev/null; then + USE_PLUGIN_AUDIOPARSERS_TRUE= + USE_PLUGIN_AUDIOPARSERS_FALSE='#' +else + USE_PLUGIN_AUDIOPARSERS_TRUE='#' + USE_PLUGIN_AUDIOPARSERS_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL auparse" + + + + # Check whether --enable-auparse was given. +if test "${enable_auparse+set}" = set; then : + enableval=$enable_auparse; + case "${enableval}" in + yes) gst_use_auparse=yes ;; + no) gst_use_auparse=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-auparse" "$LINENO" 5 ;; + esac + +else + gst_use_auparse=yes +fi + + if test x$gst_use_auparse = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin auparse" >&5 +$as_echo "$as_me: disabling dependency-less plugin auparse" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS auparse" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " auparse " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED auparse" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " auparse " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ auparse / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " auparse " > /dev/null; then + USE_PLUGIN_AUPARSE_TRUE= + USE_PLUGIN_AUPARSE_FALSE='#' +else + USE_PLUGIN_AUPARSE_TRUE='#' + USE_PLUGIN_AUPARSE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL autodetect" + + + + # Check whether --enable-autodetect was given. +if test "${enable_autodetect+set}" = set; then : + enableval=$enable_autodetect; + case "${enableval}" in + yes) gst_use_autodetect=yes ;; + no) gst_use_autodetect=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-autodetect" "$LINENO" 5 ;; + esac + +else + gst_use_autodetect=yes +fi + + if test x$gst_use_autodetect = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin autodetect" >&5 +$as_echo "$as_me: disabling dependency-less plugin autodetect" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS autodetect" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " autodetect " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED autodetect" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " autodetect " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ autodetect / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " autodetect " > /dev/null; then + USE_PLUGIN_AUTODETECT_TRUE= + USE_PLUGIN_AUTODETECT_FALSE='#' +else + USE_PLUGIN_AUTODETECT_TRUE='#' + USE_PLUGIN_AUTODETECT_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL avi" + + + + # Check whether --enable-avi was given. +if test "${enable_avi+set}" = set; then : + enableval=$enable_avi; + case "${enableval}" in + yes) gst_use_avi=yes ;; + no) gst_use_avi=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-avi" "$LINENO" 5 ;; + esac + +else + gst_use_avi=yes +fi + + if test x$gst_use_avi = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin avi" >&5 +$as_echo "$as_me: disabling dependency-less plugin avi" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS avi" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " avi " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED avi" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " avi " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ avi / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " avi " > /dev/null; then + USE_PLUGIN_AVI_TRUE= + USE_PLUGIN_AVI_FALSE='#' +else + USE_PLUGIN_AVI_TRUE='#' + USE_PLUGIN_AVI_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL cutter" + + + + # Check whether --enable-cutter was given. +if test "${enable_cutter+set}" = set; then : + enableval=$enable_cutter; + case "${enableval}" in + yes) gst_use_cutter=yes ;; + no) gst_use_cutter=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-cutter" "$LINENO" 5 ;; + esac + +else + gst_use_cutter=yes +fi + + if test x$gst_use_cutter = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin cutter" >&5 +$as_echo "$as_me: disabling dependency-less plugin cutter" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS cutter" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " cutter " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED cutter" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " cutter " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ cutter / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " cutter " > /dev/null; then + USE_PLUGIN_CUTTER_TRUE= + USE_PLUGIN_CUTTER_FALSE='#' +else + USE_PLUGIN_CUTTER_TRUE='#' + USE_PLUGIN_CUTTER_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL debugutils" + + + + # Check whether --enable-debugutils was given. +if test "${enable_debugutils+set}" = set; then : + enableval=$enable_debugutils; + case "${enableval}" in + yes) gst_use_debugutils=yes ;; + no) gst_use_debugutils=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-debugutils" "$LINENO" 5 ;; + esac + +else + gst_use_debugutils=yes +fi + + if test x$gst_use_debugutils = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin debugutils" >&5 +$as_echo "$as_me: disabling dependency-less plugin debugutils" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS debugutils" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " debugutils " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED debugutils" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " debugutils " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ debugutils / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " debugutils " > /dev/null; then + USE_PLUGIN_DEBUGUTILS_TRUE= + USE_PLUGIN_DEBUGUTILS_FALSE='#' +else + USE_PLUGIN_DEBUGUTILS_TRUE='#' + USE_PLUGIN_DEBUGUTILS_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL deinterlace" + + + + # Check whether --enable-deinterlace was given. +if test "${enable_deinterlace+set}" = set; then : + enableval=$enable_deinterlace; + case "${enableval}" in + yes) gst_use_deinterlace=yes ;; + no) gst_use_deinterlace=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-deinterlace" "$LINENO" 5 ;; + esac + +else + gst_use_deinterlace=yes +fi + + if test x$gst_use_deinterlace = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin deinterlace" >&5 +$as_echo "$as_me: disabling dependency-less plugin deinterlace" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS deinterlace" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " deinterlace " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED deinterlace" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " deinterlace " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ deinterlace / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " deinterlace " > /dev/null; then + USE_PLUGIN_DEINTERLACE_TRUE= + USE_PLUGIN_DEINTERLACE_FALSE='#' +else + USE_PLUGIN_DEINTERLACE_TRUE='#' + USE_PLUGIN_DEINTERLACE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL effectv" + + + + # Check whether --enable-effectv was given. +if test "${enable_effectv+set}" = set; then : + enableval=$enable_effectv; + case "${enableval}" in + yes) gst_use_effectv=yes ;; + no) gst_use_effectv=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-effectv" "$LINENO" 5 ;; + esac + +else + gst_use_effectv=yes +fi + + if test x$gst_use_effectv = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin effectv" >&5 +$as_echo "$as_me: disabling dependency-less plugin effectv" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS effectv" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " effectv " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED effectv" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " effectv " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ effectv / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " effectv " > /dev/null; then + USE_PLUGIN_EFFECTV_TRUE= + USE_PLUGIN_EFFECTV_FALSE='#' +else + USE_PLUGIN_EFFECTV_TRUE='#' + USE_PLUGIN_EFFECTV_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL equalizer" + + + + # Check whether --enable-equalizer was given. +if test "${enable_equalizer+set}" = set; then : + enableval=$enable_equalizer; + case "${enableval}" in + yes) gst_use_equalizer=yes ;; + no) gst_use_equalizer=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-equalizer" "$LINENO" 5 ;; + esac + +else + gst_use_equalizer=yes +fi + + if test x$gst_use_equalizer = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin equalizer" >&5 +$as_echo "$as_me: disabling dependency-less plugin equalizer" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS equalizer" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " equalizer " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED equalizer" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " equalizer " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ equalizer / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " equalizer " > /dev/null; then + USE_PLUGIN_EQUALIZER_TRUE= + USE_PLUGIN_EQUALIZER_FALSE='#' +else + USE_PLUGIN_EQUALIZER_TRUE='#' + USE_PLUGIN_EQUALIZER_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL flv" + + + + # Check whether --enable-flv was given. +if test "${enable_flv+set}" = set; then : + enableval=$enable_flv; + case "${enableval}" in + yes) gst_use_flv=yes ;; + no) gst_use_flv=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-flv" "$LINENO" 5 ;; + esac + +else + gst_use_flv=yes +fi + + if test x$gst_use_flv = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin flv" >&5 +$as_echo "$as_me: disabling dependency-less plugin flv" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS flv" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " flv " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED flv" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " flv " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ flv / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " flv " > /dev/null; then + USE_PLUGIN_FLV_TRUE= + USE_PLUGIN_FLV_FALSE='#' +else + USE_PLUGIN_FLV_TRUE='#' + USE_PLUGIN_FLV_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL id3demux" + + + + # Check whether --enable-id3demux was given. +if test "${enable_id3demux+set}" = set; then : + enableval=$enable_id3demux; + case "${enableval}" in + yes) gst_use_id3demux=yes ;; + no) gst_use_id3demux=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-id3demux" "$LINENO" 5 ;; + esac + +else + gst_use_id3demux=yes +fi + + if test x$gst_use_id3demux = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin id3demux" >&5 +$as_echo "$as_me: disabling dependency-less plugin id3demux" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS id3demux" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " id3demux " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED id3demux" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " id3demux " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ id3demux / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " id3demux " > /dev/null; then + USE_PLUGIN_ID3DEMUX_TRUE= + USE_PLUGIN_ID3DEMUX_FALSE='#' +else + USE_PLUGIN_ID3DEMUX_TRUE='#' + USE_PLUGIN_ID3DEMUX_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL icydemux" + + + + # Check whether --enable-icydemux was given. +if test "${enable_icydemux+set}" = set; then : + enableval=$enable_icydemux; + case "${enableval}" in + yes) gst_use_icydemux=yes ;; + no) gst_use_icydemux=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-icydemux" "$LINENO" 5 ;; + esac + +else + gst_use_icydemux=yes +fi + + if test x$gst_use_icydemux = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin icydemux" >&5 +$as_echo "$as_me: disabling dependency-less plugin icydemux" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS icydemux" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " icydemux " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED icydemux" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " icydemux " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ icydemux / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " icydemux " > /dev/null; then + USE_PLUGIN_ICYDEMUX_TRUE= + USE_PLUGIN_ICYDEMUX_FALSE='#' +else + USE_PLUGIN_ICYDEMUX_TRUE='#' + USE_PLUGIN_ICYDEMUX_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL interleave" + + + + # Check whether --enable-interleave was given. +if test "${enable_interleave+set}" = set; then : + enableval=$enable_interleave; + case "${enableval}" in + yes) gst_use_interleave=yes ;; + no) gst_use_interleave=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-interleave" "$LINENO" 5 ;; + esac + +else + gst_use_interleave=yes +fi + + if test x$gst_use_interleave = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin interleave" >&5 +$as_echo "$as_me: disabling dependency-less plugin interleave" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS interleave" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " interleave " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED interleave" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " interleave " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ interleave / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " interleave " > /dev/null; then + USE_PLUGIN_INTERLEAVE_TRUE= + USE_PLUGIN_INTERLEAVE_FALSE='#' +else + USE_PLUGIN_INTERLEAVE_TRUE='#' + USE_PLUGIN_INTERLEAVE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL flx" + + + + # Check whether --enable-flx was given. +if test "${enable_flx+set}" = set; then : + enableval=$enable_flx; + case "${enableval}" in + yes) gst_use_flx=yes ;; + no) gst_use_flx=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-flx" "$LINENO" 5 ;; + esac + +else + gst_use_flx=yes +fi + + if test x$gst_use_flx = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin flx" >&5 +$as_echo "$as_me: disabling dependency-less plugin flx" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS flx" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " flx " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED flx" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " flx " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ flx / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " flx " > /dev/null; then + USE_PLUGIN_FLX_TRUE= + USE_PLUGIN_FLX_FALSE='#' +else + USE_PLUGIN_FLX_TRUE='#' + USE_PLUGIN_FLX_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL goom" + + + + # Check whether --enable-goom was given. +if test "${enable_goom+set}" = set; then : + enableval=$enable_goom; + case "${enableval}" in + yes) gst_use_goom=yes ;; + no) gst_use_goom=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-goom" "$LINENO" 5 ;; + esac + +else + gst_use_goom=yes +fi + + if test x$gst_use_goom = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin goom" >&5 +$as_echo "$as_me: disabling dependency-less plugin goom" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS goom" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " goom " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED goom" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " goom " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ goom / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " goom " > /dev/null; then + USE_PLUGIN_GOOM_TRUE= + USE_PLUGIN_GOOM_FALSE='#' +else + USE_PLUGIN_GOOM_TRUE='#' + USE_PLUGIN_GOOM_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL goom2k1" + + + + # Check whether --enable-goom2k1 was given. +if test "${enable_goom2k1+set}" = set; then : + enableval=$enable_goom2k1; + case "${enableval}" in + yes) gst_use_goom2k1=yes ;; + no) gst_use_goom2k1=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-goom2k1" "$LINENO" 5 ;; + esac + +else + gst_use_goom2k1=yes +fi + + if test x$gst_use_goom2k1 = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin goom2k1" >&5 +$as_echo "$as_me: disabling dependency-less plugin goom2k1" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS goom2k1" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " goom2k1 " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED goom2k1" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " goom2k1 " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ goom2k1 / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " goom2k1 " > /dev/null; then + USE_PLUGIN_GOOM2K1_TRUE= + USE_PLUGIN_GOOM2K1_FALSE='#' +else + USE_PLUGIN_GOOM2K1_TRUE='#' + USE_PLUGIN_GOOM2K1_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL imagefreeze" + + + + # Check whether --enable-imagefreeze was given. +if test "${enable_imagefreeze+set}" = set; then : + enableval=$enable_imagefreeze; + case "${enableval}" in + yes) gst_use_imagefreeze=yes ;; + no) gst_use_imagefreeze=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-imagefreeze" "$LINENO" 5 ;; + esac + +else + gst_use_imagefreeze=yes +fi + + if test x$gst_use_imagefreeze = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin imagefreeze" >&5 +$as_echo "$as_me: disabling dependency-less plugin imagefreeze" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS imagefreeze" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " imagefreeze " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED imagefreeze" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " imagefreeze " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ imagefreeze / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " imagefreeze " > /dev/null; then + USE_PLUGIN_IMAGEFREEZE_TRUE= + USE_PLUGIN_IMAGEFREEZE_FALSE='#' +else + USE_PLUGIN_IMAGEFREEZE_TRUE='#' + USE_PLUGIN_IMAGEFREEZE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL isomp4" + + + + # Check whether --enable-isomp4 was given. +if test "${enable_isomp4+set}" = set; then : + enableval=$enable_isomp4; + case "${enableval}" in + yes) gst_use_isomp4=yes ;; + no) gst_use_isomp4=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-isomp4" "$LINENO" 5 ;; + esac + +else + gst_use_isomp4=yes +fi + + if test x$gst_use_isomp4 = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin isomp4" >&5 +$as_echo "$as_me: disabling dependency-less plugin isomp4" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS isomp4" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " isomp4 " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED isomp4" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " isomp4 " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ isomp4 / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " isomp4 " > /dev/null; then + USE_PLUGIN_ISOMP4_TRUE= + USE_PLUGIN_ISOMP4_FALSE='#' +else + USE_PLUGIN_ISOMP4_TRUE='#' + USE_PLUGIN_ISOMP4_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL law" + + + + # Check whether --enable-law was given. +if test "${enable_law+set}" = set; then : + enableval=$enable_law; + case "${enableval}" in + yes) gst_use_law=yes ;; + no) gst_use_law=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-law" "$LINENO" 5 ;; + esac + +else + gst_use_law=yes +fi + + if test x$gst_use_law = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin law" >&5 +$as_echo "$as_me: disabling dependency-less plugin law" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS law" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " law " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED law" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " law " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ law / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " law " > /dev/null; then + USE_PLUGIN_LAW_TRUE= + USE_PLUGIN_LAW_FALSE='#' +else + USE_PLUGIN_LAW_TRUE='#' + USE_PLUGIN_LAW_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL level" + + + + # Check whether --enable-level was given. +if test "${enable_level+set}" = set; then : + enableval=$enable_level; + case "${enableval}" in + yes) gst_use_level=yes ;; + no) gst_use_level=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-level" "$LINENO" 5 ;; + esac + +else + gst_use_level=yes +fi + + if test x$gst_use_level = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin level" >&5 +$as_echo "$as_me: disabling dependency-less plugin level" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS level" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " level " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED level" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " level " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ level / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " level " > /dev/null; then + USE_PLUGIN_LEVEL_TRUE= + USE_PLUGIN_LEVEL_FALSE='#' +else + USE_PLUGIN_LEVEL_TRUE='#' + USE_PLUGIN_LEVEL_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL matroska" + + + + # Check whether --enable-matroska was given. +if test "${enable_matroska+set}" = set; then : + enableval=$enable_matroska; + case "${enableval}" in + yes) gst_use_matroska=yes ;; + no) gst_use_matroska=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-matroska" "$LINENO" 5 ;; + esac + +else + gst_use_matroska=yes +fi + + if test x$gst_use_matroska = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin matroska" >&5 +$as_echo "$as_me: disabling dependency-less plugin matroska" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS matroska" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " matroska " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED matroska" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " matroska " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ matroska / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " matroska " > /dev/null; then + USE_PLUGIN_MATROSKA_TRUE= + USE_PLUGIN_MATROSKA_FALSE='#' +else + USE_PLUGIN_MATROSKA_TRUE='#' + USE_PLUGIN_MATROSKA_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL monoscope" + + + + # Check whether --enable-monoscope was given. +if test "${enable_monoscope+set}" = set; then : + enableval=$enable_monoscope; + case "${enableval}" in + yes) gst_use_monoscope=yes ;; + no) gst_use_monoscope=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-monoscope" "$LINENO" 5 ;; + esac + +else + gst_use_monoscope=yes +fi + + if test x$gst_use_monoscope = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin monoscope" >&5 +$as_echo "$as_me: disabling dependency-less plugin monoscope" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS monoscope" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " monoscope " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED monoscope" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " monoscope " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ monoscope / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " monoscope " > /dev/null; then + USE_PLUGIN_MONOSCOPE_TRUE= + USE_PLUGIN_MONOSCOPE_FALSE='#' +else + USE_PLUGIN_MONOSCOPE_TRUE='#' + USE_PLUGIN_MONOSCOPE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL multifile" + + + + # Check whether --enable-multifile was given. +if test "${enable_multifile+set}" = set; then : + enableval=$enable_multifile; + case "${enableval}" in + yes) gst_use_multifile=yes ;; + no) gst_use_multifile=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-multifile" "$LINENO" 5 ;; + esac + +else + gst_use_multifile=yes +fi + + if test x$gst_use_multifile = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin multifile" >&5 +$as_echo "$as_me: disabling dependency-less plugin multifile" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS multifile" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " multifile " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED multifile" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " multifile " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ multifile / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " multifile " > /dev/null; then + USE_PLUGIN_MULTIFILE_TRUE= + USE_PLUGIN_MULTIFILE_FALSE='#' +else + USE_PLUGIN_MULTIFILE_TRUE='#' + USE_PLUGIN_MULTIFILE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL multipart" + + + + # Check whether --enable-multipart was given. +if test "${enable_multipart+set}" = set; then : + enableval=$enable_multipart; + case "${enableval}" in + yes) gst_use_multipart=yes ;; + no) gst_use_multipart=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-multipart" "$LINENO" 5 ;; + esac + +else + gst_use_multipart=yes +fi + + if test x$gst_use_multipart = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin multipart" >&5 +$as_echo "$as_me: disabling dependency-less plugin multipart" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS multipart" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " multipart " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED multipart" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " multipart " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ multipart / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " multipart " > /dev/null; then + USE_PLUGIN_MULTIPART_TRUE= + USE_PLUGIN_MULTIPART_FALSE='#' +else + USE_PLUGIN_MULTIPART_TRUE='#' + USE_PLUGIN_MULTIPART_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL replaygain" + + + + # Check whether --enable-replaygain was given. +if test "${enable_replaygain+set}" = set; then : + enableval=$enable_replaygain; + case "${enableval}" in + yes) gst_use_replaygain=yes ;; + no) gst_use_replaygain=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-replaygain" "$LINENO" 5 ;; + esac + +else + gst_use_replaygain=yes +fi + + if test x$gst_use_replaygain = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin replaygain" >&5 +$as_echo "$as_me: disabling dependency-less plugin replaygain" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS replaygain" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " replaygain " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED replaygain" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " replaygain " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ replaygain / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " replaygain " > /dev/null; then + USE_PLUGIN_REPLAYGAIN_TRUE= + USE_PLUGIN_REPLAYGAIN_FALSE='#' +else + USE_PLUGIN_REPLAYGAIN_TRUE='#' + USE_PLUGIN_REPLAYGAIN_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL rtp" + + + + # Check whether --enable-rtp was given. +if test "${enable_rtp+set}" = set; then : + enableval=$enable_rtp; + case "${enableval}" in + yes) gst_use_rtp=yes ;; + no) gst_use_rtp=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-rtp" "$LINENO" 5 ;; + esac + +else + gst_use_rtp=yes +fi + + if test x$gst_use_rtp = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin rtp" >&5 +$as_echo "$as_me: disabling dependency-less plugin rtp" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS rtp" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " rtp " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED rtp" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " rtp " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rtp / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " rtp " > /dev/null; then + USE_PLUGIN_RTP_TRUE= + USE_PLUGIN_RTP_FALSE='#' +else + USE_PLUGIN_RTP_TRUE='#' + USE_PLUGIN_RTP_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL rtpmanager" + + + + # Check whether --enable-rtpmanager was given. +if test "${enable_rtpmanager+set}" = set; then : + enableval=$enable_rtpmanager; + case "${enableval}" in + yes) gst_use_rtpmanager=yes ;; + no) gst_use_rtpmanager=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-rtpmanager" "$LINENO" 5 ;; + esac + +else + gst_use_rtpmanager=yes +fi + + if test x$gst_use_rtpmanager = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin rtpmanager" >&5 +$as_echo "$as_me: disabling dependency-less plugin rtpmanager" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS rtpmanager" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " rtpmanager " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED rtpmanager" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " rtpmanager " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rtpmanager / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " rtpmanager " > /dev/null; then + USE_PLUGIN_RTPMANAGER_TRUE= + USE_PLUGIN_RTPMANAGER_FALSE='#' +else + USE_PLUGIN_RTPMANAGER_TRUE='#' + USE_PLUGIN_RTPMANAGER_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL rtsp" + + + + # Check whether --enable-rtsp was given. +if test "${enable_rtsp+set}" = set; then : + enableval=$enable_rtsp; + case "${enableval}" in + yes) gst_use_rtsp=yes ;; + no) gst_use_rtsp=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-rtsp" "$LINENO" 5 ;; + esac + +else + gst_use_rtsp=yes +fi + + if test x$gst_use_rtsp = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin rtsp" >&5 +$as_echo "$as_me: disabling dependency-less plugin rtsp" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS rtsp" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " rtsp " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED rtsp" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " rtsp " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rtsp / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " rtsp " > /dev/null; then + USE_PLUGIN_RTSP_TRUE= + USE_PLUGIN_RTSP_FALSE='#' +else + USE_PLUGIN_RTSP_TRUE='#' + USE_PLUGIN_RTSP_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL shapewipe" + + + + # Check whether --enable-shapewipe was given. +if test "${enable_shapewipe+set}" = set; then : + enableval=$enable_shapewipe; + case "${enableval}" in + yes) gst_use_shapewipe=yes ;; + no) gst_use_shapewipe=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-shapewipe" "$LINENO" 5 ;; + esac + +else + gst_use_shapewipe=yes +fi + + if test x$gst_use_shapewipe = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin shapewipe" >&5 +$as_echo "$as_me: disabling dependency-less plugin shapewipe" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS shapewipe" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " shapewipe " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED shapewipe" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " shapewipe " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ shapewipe / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " shapewipe " > /dev/null; then + USE_PLUGIN_SHAPEWIPE_TRUE= + USE_PLUGIN_SHAPEWIPE_FALSE='#' +else + USE_PLUGIN_SHAPEWIPE_TRUE='#' + USE_PLUGIN_SHAPEWIPE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL smpte" + + + + # Check whether --enable-smpte was given. +if test "${enable_smpte+set}" = set; then : + enableval=$enable_smpte; + case "${enableval}" in + yes) gst_use_smpte=yes ;; + no) gst_use_smpte=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-smpte" "$LINENO" 5 ;; + esac + +else + gst_use_smpte=yes +fi + + if test x$gst_use_smpte = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin smpte" >&5 +$as_echo "$as_me: disabling dependency-less plugin smpte" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS smpte" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " smpte " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED smpte" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " smpte " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ smpte / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " smpte " > /dev/null; then + USE_PLUGIN_SMPTE_TRUE= + USE_PLUGIN_SMPTE_FALSE='#' +else + USE_PLUGIN_SMPTE_TRUE='#' + USE_PLUGIN_SMPTE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL spectrum" + + + + # Check whether --enable-spectrum was given. +if test "${enable_spectrum+set}" = set; then : + enableval=$enable_spectrum; + case "${enableval}" in + yes) gst_use_spectrum=yes ;; + no) gst_use_spectrum=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-spectrum" "$LINENO" 5 ;; + esac + +else + gst_use_spectrum=yes +fi + + if test x$gst_use_spectrum = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin spectrum" >&5 +$as_echo "$as_me: disabling dependency-less plugin spectrum" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS spectrum" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " spectrum " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED spectrum" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " spectrum " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ spectrum / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " spectrum " > /dev/null; then + USE_PLUGIN_SPECTRUM_TRUE= + USE_PLUGIN_SPECTRUM_FALSE='#' +else + USE_PLUGIN_SPECTRUM_TRUE='#' + USE_PLUGIN_SPECTRUM_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL udp" + + + + # Check whether --enable-udp was given. +if test "${enable_udp+set}" = set; then : + enableval=$enable_udp; + case "${enableval}" in + yes) gst_use_udp=yes ;; + no) gst_use_udp=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-udp" "$LINENO" 5 ;; + esac + +else + gst_use_udp=yes +fi + + if test x$gst_use_udp = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin udp" >&5 +$as_echo "$as_me: disabling dependency-less plugin udp" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS udp" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " udp " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED udp" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " udp " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ udp / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " udp " > /dev/null; then + USE_PLUGIN_UDP_TRUE= + USE_PLUGIN_UDP_FALSE='#' +else + USE_PLUGIN_UDP_TRUE='#' + USE_PLUGIN_UDP_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL videobox" + + + + # Check whether --enable-videobox was given. +if test "${enable_videobox+set}" = set; then : + enableval=$enable_videobox; + case "${enableval}" in + yes) gst_use_videobox=yes ;; + no) gst_use_videobox=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-videobox" "$LINENO" 5 ;; + esac + +else + gst_use_videobox=yes +fi + + if test x$gst_use_videobox = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videobox" >&5 +$as_echo "$as_me: disabling dependency-less plugin videobox" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS videobox" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videobox " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videobox" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videobox " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videobox / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " videobox " > /dev/null; then + USE_PLUGIN_VIDEOBOX_TRUE= + USE_PLUGIN_VIDEOBOX_FALSE='#' +else + USE_PLUGIN_VIDEOBOX_TRUE='#' + USE_PLUGIN_VIDEOBOX_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL videocrop" + + + + # Check whether --enable-videocrop was given. +if test "${enable_videocrop+set}" = set; then : + enableval=$enable_videocrop; + case "${enableval}" in + yes) gst_use_videocrop=yes ;; + no) gst_use_videocrop=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-videocrop" "$LINENO" 5 ;; + esac + +else + gst_use_videocrop=yes +fi + + if test x$gst_use_videocrop = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videocrop" >&5 +$as_echo "$as_me: disabling dependency-less plugin videocrop" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS videocrop" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videocrop " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videocrop" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videocrop " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videocrop / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " videocrop " > /dev/null; then + USE_PLUGIN_VIDEOCROP_TRUE= + USE_PLUGIN_VIDEOCROP_FALSE='#' +else + USE_PLUGIN_VIDEOCROP_TRUE='#' + USE_PLUGIN_VIDEOCROP_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL videomixer" + + + + # Check whether --enable-videomixer was given. +if test "${enable_videomixer+set}" = set; then : + enableval=$enable_videomixer; + case "${enableval}" in + yes) gst_use_videomixer=yes ;; + no) gst_use_videomixer=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-videomixer" "$LINENO" 5 ;; + esac + +else + gst_use_videomixer=yes +fi + + if test x$gst_use_videomixer = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videomixer" >&5 +$as_echo "$as_me: disabling dependency-less plugin videomixer" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS videomixer" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videomixer " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videomixer" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videomixer " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videomixer / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " videomixer " > /dev/null; then + USE_PLUGIN_VIDEOMIXER_TRUE= + USE_PLUGIN_VIDEOMIXER_FALSE='#' +else + USE_PLUGIN_VIDEOMIXER_TRUE='#' + USE_PLUGIN_VIDEOMIXER_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL wavenc" + + + + # Check whether --enable-wavenc was given. +if test "${enable_wavenc+set}" = set; then : + enableval=$enable_wavenc; + case "${enableval}" in + yes) gst_use_wavenc=yes ;; + no) gst_use_wavenc=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-wavenc" "$LINENO" 5 ;; + esac + +else + gst_use_wavenc=yes +fi + + if test x$gst_use_wavenc = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin wavenc" >&5 +$as_echo "$as_me: disabling dependency-less plugin wavenc" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS wavenc" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " wavenc " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED wavenc" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " wavenc " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ wavenc / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " wavenc " > /dev/null; then + USE_PLUGIN_WAVENC_TRUE= + USE_PLUGIN_WAVENC_FALSE='#' +else + USE_PLUGIN_WAVENC_TRUE='#' + USE_PLUGIN_WAVENC_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL wavparse" + + + + # Check whether --enable-wavparse was given. +if test "${enable_wavparse+set}" = set; then : + enableval=$enable_wavparse; + case "${enableval}" in + yes) gst_use_wavparse=yes ;; + no) gst_use_wavparse=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-wavparse" "$LINENO" 5 ;; + esac + +else + gst_use_wavparse=yes +fi + + if test x$gst_use_wavparse = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin wavparse" >&5 +$as_echo "$as_me: disabling dependency-less plugin wavparse" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS wavparse" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " wavparse " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED wavparse" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " wavparse " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ wavparse / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " wavparse " > /dev/null; then + USE_PLUGIN_WAVPARSE_TRUE= + USE_PLUGIN_WAVPARSE_FALSE='#' +else + USE_PLUGIN_WAVPARSE_TRUE='#' + USE_PLUGIN_WAVPARSE_FALSE= +fi + + + + GST_PLUGINS_ALL="$GST_PLUGINS_ALL y4m" + + + + # Check whether --enable-y4m was given. +if test "${enable_y4m+set}" = set; then : + enableval=$enable_y4m; + case "${enableval}" in + yes) gst_use_y4m=yes ;; + no) gst_use_y4m=no ;; + *) as_fn_error $? "bad value ${enableval} for --enable-y4m" "$LINENO" 5 ;; + esac + +else + gst_use_y4m=yes +fi + + if test x$gst_use_y4m = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin y4m" >&5 +$as_echo "$as_me: disabling dependency-less plugin y4m" >&6;} + WITHOUT_PLUGINS="$WITHOUT_PLUGINS y4m" + fi + + + if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " y4m " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED y4m" + fi + if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " y4m " > /dev/null; then + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ y4m / /'` + fi + if echo " $GST_PLUGINS_SELECTED " | grep -i " y4m " > /dev/null; then + USE_PLUGIN_Y4M_TRUE= + USE_PLUGIN_Y4M_FALSE='#' +else + USE_PLUGIN_Y4M_TRUE='#' + USE_PLUGIN_Y4M_FALSE= +fi + + + +ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = xyes; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 +$as_echo_n "checking for socket in -lsocket... " >&6; } +if ${ac_cv_lib_socket_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_socket=yes +else + ac_cv_lib_socket_socket=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 +$as_echo "$ac_cv_lib_socket_socket" >&6; } +if test "x$ac_cv_lib_socket_socket" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + +fi + + +for ac_header in sys/socket.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_SOCKET_H 1 +_ACEOF + HAVE_SYS_SOCKET_H=yes +fi + +done + +for ac_header in winsock2.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" +if test "x$ac_cv_header_winsock2_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_WINSOCK2_H 1 +_ACEOF + HAVE_WINSOCK2_H=yes +fi + +done + + +if test "x$HAVE_SYS_SOCKET_H" != "xyes" -a "x$HAVE_WINSOCK2_H" != "xyes"; then + + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ udp / /'` + if false; then + USE_PLUGIN_UDP_TRUE= + USE_PLUGIN_UDP_FALSE='#' +else + USE_PLUGIN_UDP_TRUE='#' + USE_PLUGIN_UDP_FALSE= +fi + + + + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rtsp / /'` + if false; then + USE_PLUGIN_RTSP_TRUE= + USE_PLUGIN_RTSP_FALSE='#' +else + USE_PLUGIN_RTSP_TRUE='#' + USE_PLUGIN_RTSP_FALSE= +fi + + +fi + +if test "x$HAVE_WINSOCK2_H" = "xyes"; then + WIN32_LIBS="-lws2_32" + +fi + +if test "x$BUILD_EXPERIMENTAL" != "xyes"; then + + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ monoscope / /'` + if false; then + USE_PLUGIN_MONOSCOPE_TRUE= + USE_PLUGIN_MONOSCOPE_FALSE='#' +else + USE_PLUGIN_MONOSCOPE_TRUE='#' + USE_PLUGIN_MONOSCOPE_FALSE= +fi + + +fi + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: Checking libraries for plugins in sys/" >&5 +$as_echo "$as_me: Checking libraries for plugins in sys/" >&6;} +echo + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: DirectSound plug-in ***" >&5 +$as_echo "$as_me: *** checking feature: DirectSound plug-in ***" >&6;} +if test "xdirectsoundsink" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: directsoundsink ***" >&5 +$as_echo "$as_me: *** for plug-ins: directsoundsink ***" >&6;} +fi +NOUSE= +if test "x$USE_DIRECTSOUND" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-directsound was given. +if test "${enable_directsound+set}" = set; then : + enableval=$enable_directsound; case "${enableval}" in + yes) USE_DIRECTSOUND=yes;; + no) USE_DIRECTSOUND=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-directsound" "$LINENO" 5 ;; + esac +else + USE_DIRECTSOUND=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_DIRECTSOUND="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** directsoundsink pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** directsoundsink pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_DIRECTSOUND = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_DIRECTSOUND=no + + HAVE_DIRECTSOUND="no" + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + save_LIBS="$LIBS" + CFLAGS="$CFLAGS $DIRECTSOUND_CFLAGS" + LDFLAGS="$LDFLAGS $DIRECTSOUND_LDFLAGS" + LIBS="$LIBS -ldsound -ldxerr9 -luser32" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DirectSound LDFLAGS" >&5 +$as_echo_n "checking for DirectSound LDFLAGS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int main () +{ + DXGetErrorString9 (0); + DirectSoundCreate(NULL, NULL, NULL); + + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + HAVE_DIRECTSOUND="yes" +else + HAVE_DIRECTSOUND="no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DIRECTSOUND" >&5 +$as_echo "$HAVE_DIRECTSOUND" >&6; } + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + + if test "x$HAVE_DIRECTSOUND" = "xyes"; then + DIRECTSOUND_LIBS="-ldsound -ldxerr9 -luser32" + + + + fi + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_DIRECTSOUND = xno; then + USE_DIRECTSOUND=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: directsoundsink" >&5 +$as_echo "$as_me: *** These plugins will be built: directsoundsink" >&6;} + fi +fi +if test x$USE_DIRECTSOUND = xyes; then + : + if test "xdirectsoundsink" != "x"; then + GST_PLUGINS_YES="\tdirectsoundsink\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_DIRECTSOUND /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: directsoundsink" >&5 +$as_echo "$as_me: *** These plugins will not be built: directsoundsink" >&6;} + if test "xdirectsoundsink" != "x"; then + GST_PLUGINS_NO="\tdirectsoundsink\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_DIRECTSOUND = xyes; then + USE_DIRECTSOUND_TRUE= + USE_DIRECTSOUND_FALSE='#' +else + USE_DIRECTSOUND_TRUE='#' + USE_DIRECTSOUND_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: OSS audio ***" >&5 +$as_echo "$as_me: *** checking feature: OSS audio ***" >&6;} +if test "xossaudio" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ossaudio ***" >&5 +$as_echo "$as_me: *** for plug-ins: ossaudio ***" >&6;} +fi +NOUSE= +if test "x$USE_OSS" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-oss was given. +if test "${enable_oss+set}" = set; then : + enableval=$enable_oss; case "${enableval}" in + yes) USE_OSS=yes;; + no) USE_OSS=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-oss" "$LINENO" 5 ;; + esac +else + USE_OSS=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_OSS="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ossaudio pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** ossaudio pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_OSS = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_OSS=no + + HAVE_OSS="yes" + ac_fn_c_check_header_mongrel "$LINENO" "sys/soundcard.h" "ac_cv_header_sys_soundcard_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_soundcard_h" = xyes; then : + + +$as_echo "#define HAVE_OSS_INCLUDE_IN_SYS /**/" >>confdefs.h + + +else + + ac_fn_c_check_header_mongrel "$LINENO" "soundcard.h" "ac_cv_header_soundcard_h" "$ac_includes_default" +if test "x$ac_cv_header_soundcard_h" = xyes; then : + + +$as_echo "#define HAVE_OSS_INCLUDE_IN_ROOT /**/" >>confdefs.h + + +else + + ac_fn_c_check_header_mongrel "$LINENO" "machine/soundcard.h" "ac_cv_header_machine_soundcard_h" "$ac_includes_default" +if test "x$ac_cv_header_machine_soundcard_h" = xyes; then : + + +$as_echo "#define HAVE_OSS_INCLUDE_IN_MACHINE /**/" >>confdefs.h + + +else + + HAVE_OSS="no" + +fi + + + +fi + + + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_OSS = xno; then + USE_OSS=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: ossaudio" >&5 +$as_echo "$as_me: *** These plugins will be built: ossaudio" >&6;} + fi +fi +if test x$USE_OSS = xyes; then + : + if test "xossaudio" != "x"; then + GST_PLUGINS_YES="\tossaudio\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_OSS /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: ossaudio" >&5 +$as_echo "$as_me: *** These plugins will not be built: ossaudio" >&6;} + if test "xossaudio" != "x"; then + GST_PLUGINS_NO="\tossaudio\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_OSS = xyes; then + USE_OSS_TRUE= + USE_OSS_FALSE='#' +else + USE_OSS_TRUE='#' + USE_OSS_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Open Sound System 4 ***" >&5 +$as_echo "$as_me: *** checking feature: Open Sound System 4 ***" >&6;} +if test "xoss4" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: oss4 ***" >&5 +$as_echo "$as_me: *** for plug-ins: oss4 ***" >&6;} +fi +NOUSE= +if test "x$USE_OSS4" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-oss4 was given. +if test "${enable_oss4+set}" = set; then : + enableval=$enable_oss4; case "${enableval}" in + yes) USE_OSS4=yes;; + no) USE_OSS4=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-oss4" "$LINENO" 5 ;; + esac +else + USE_OSS4=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_OSS4="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** oss4 pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** oss4 pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_OSS4 = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_OSS4=no + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking if we can build the OSS4 elements" >&5 +$as_echo_n "checking Checking if we can build the OSS4 elements... " >&6; } + for ac_header in fcntl.h sys/ioctl.h sys/stat.h sys/types.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + test -z "$OSS4_MISSING_HEADER" && HAVE_OSS4="yes" +else + OSS4_MISSING_HEADER="yes";HAVE_OSS4="no" +fi + +done + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_OSS4 = xno; then + USE_OSS4=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: oss4" >&5 +$as_echo "$as_me: *** These plugins will be built: oss4" >&6;} + fi +fi +if test x$USE_OSS4 = xyes; then + : + if test "xoss4" != "x"; then + GST_PLUGINS_YES="\toss4\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_OSS4 /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: oss4" >&5 +$as_echo "$as_me: *** These plugins will not be built: oss4" >&6;} + if test "xoss4" != "x"; then + GST_PLUGINS_NO="\toss4\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_OSS4 = xyes; then + USE_OSS4_TRUE= + USE_OSS4_FALSE='#' +else + USE_OSS4_TRUE='#' + USE_OSS4_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Sun Audio ***" >&5 +$as_echo "$as_me: *** checking feature: Sun Audio ***" >&6;} +if test "xsunaudio" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: sunaudio ***" >&5 +$as_echo "$as_me: *** for plug-ins: sunaudio ***" >&6;} +fi +NOUSE= +if test "x$USE_SUNAUDIO" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-sunaudio was given. +if test "${enable_sunaudio+set}" = set; then : + enableval=$enable_sunaudio; case "${enableval}" in + yes) USE_SUNAUDIO=yes;; + no) USE_SUNAUDIO=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-sunaudio" "$LINENO" 5 ;; + esac +else + USE_SUNAUDIO=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_SUNAUDIO="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sunaudio pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** sunaudio pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_SUNAUDIO = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_SUNAUDIO=no + + ac_fn_c_check_header_mongrel "$LINENO" "sys/audioio.h" "ac_cv_header_sys_audioio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_audioio_h" = xyes; then : + HAVE_SUNAUDIO="yes" +else + HAVE_SUNAUDIO="no" +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_SUNAUDIO = xno; then + USE_SUNAUDIO=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: sunaudio" >&5 +$as_echo "$as_me: *** These plugins will be built: sunaudio" >&6;} + fi +fi +if test x$USE_SUNAUDIO = xyes; then + : + if test "xsunaudio" != "x"; then + GST_PLUGINS_YES="\tsunaudio\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_SUNAUDIO /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: sunaudio" >&5 +$as_echo "$as_me: *** These plugins will not be built: sunaudio" >&6;} + if test "xsunaudio" != "x"; then + GST_PLUGINS_NO="\tsunaudio\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_SUNAUDIO = xyes; then + USE_SUNAUDIO_TRUE= + USE_SUNAUDIO_FALSE='#' +else + USE_SUNAUDIO_TRUE='#' + USE_SUNAUDIO_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: OSX audio ***" >&5 +$as_echo "$as_me: *** checking feature: OSX audio ***" >&6;} +if test "xosxaudio" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: osxaudio ***" >&5 +$as_echo "$as_me: *** for plug-ins: osxaudio ***" >&6;} +fi +NOUSE= +if test "x$USE_OSX_AUDIO" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-osx_audio was given. +if test "${enable_osx_audio+set}" = set; then : + enableval=$enable_osx_audio; case "${enableval}" in + yes) USE_OSX_AUDIO=yes;; + no) USE_OSX_AUDIO=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-osx_audio" "$LINENO" 5 ;; + esac +else + USE_OSX_AUDIO=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_OSX_AUDIO="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** osxaudio pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** osxaudio pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_OSX_AUDIO = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_OSX_AUDIO=no + + ac_fn_c_check_header_mongrel "$LINENO" "CoreAudio/CoreAudio.h" "ac_cv_header_CoreAudio_CoreAudio_h" "$ac_includes_default" +if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = xyes; then : + HAVE_OSX_AUDIO="yes" +else + HAVE_OSX_AUDIO="no" +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_OSX_AUDIO = xno; then + USE_OSX_AUDIO=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: osxaudio" >&5 +$as_echo "$as_me: *** These plugins will be built: osxaudio" >&6;} + fi +fi +if test x$USE_OSX_AUDIO = xyes; then + : + if test "xosxaudio" != "x"; then + GST_PLUGINS_YES="\tosxaudio\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_OSX_AUDIO /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: osxaudio" >&5 +$as_echo "$as_me: *** These plugins will not be built: osxaudio" >&6;} + if test "xosxaudio" != "x"; then + GST_PLUGINS_NO="\tosxaudio\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_OSX_AUDIO = xyes; then + USE_OSX_AUDIO_TRUE= + USE_OSX_AUDIO_FALSE='#' +else + USE_OSX_AUDIO_TRUE='#' + USE_OSX_AUDIO_FALSE= +fi + + + +HAVE_OSX_VIDEO="no" +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: OSX video ***" >&5 +$as_echo "$as_me: *** checking feature: OSX video ***" >&6;} +if test "xosxvideosink" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: osxvideosink ***" >&5 +$as_echo "$as_me: *** for plug-ins: osxvideosink ***" >&6;} +fi +NOUSE= +if test "x$USE_OSX_VIDEO" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-osx_video was given. +if test "${enable_osx_video+set}" = set; then : + enableval=$enable_osx_video; case "${enableval}" in + yes) USE_OSX_VIDEO=yes;; + no) USE_OSX_VIDEO=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-osx_video" "$LINENO" 5 ;; + esac +else + USE_OSX_VIDEO=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_OSX_VIDEO="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** osxvideosink pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** osxvideosink pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_OSX_VIDEO = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_OSX_VIDEO=no + + ac_fn_c_check_header_mongrel "$LINENO" "OpenGL/gl.h" "ac_cv_header_OpenGL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_OpenGL_gl_h" = xyes; then : + HAVE_OSX_VIDEO="yes" +else + HAVE_OSX_VIDEO="no" +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_OSX_VIDEO = xno; then + USE_OSX_VIDEO=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: osxvideosink" >&5 +$as_echo "$as_me: *** These plugins will be built: osxvideosink" >&6;} + fi +fi +if test x$USE_OSX_VIDEO = xyes; then + : + if test "xosxvideosink" != "x"; then + GST_PLUGINS_YES="\tosxvideosink\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_OSX_VIDEO /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: osxvideosink" >&5 +$as_echo "$as_me: *** These plugins will not be built: osxvideosink" >&6;} + if test "xosxvideosink" != "x"; then + GST_PLUGINS_NO="\tosxvideosink\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_OSX_VIDEO = xyes; then + USE_OSX_VIDEO_TRUE= + USE_OSX_VIDEO_FALSE='#' +else + USE_OSX_VIDEO_TRUE='#' + USE_OSX_VIDEO_FALSE= +fi + + +case "$host" in + *-*darwin*) + ;; + *) + HAVE_OSX_VIDEO="no" + ;; +esac + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Video 4 Linux 2 ***" >&5 +$as_echo "$as_me: *** checking feature: Video 4 Linux 2 ***" >&6;} +if test "xv4l2src" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: v4l2src ***" >&5 +$as_echo "$as_me: *** for plug-ins: v4l2src ***" >&6;} +fi +NOUSE= +if test "x$USE_GST_V4L2" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-gst_v4l2 was given. +if test "${enable_gst_v4l2+set}" = set; then : + enableval=$enable_gst_v4l2; case "${enableval}" in + yes) USE_GST_V4L2=yes;; + no) USE_GST_V4L2=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-gst_v4l2" "$LINENO" 5 ;; + esac +else + USE_GST_V4L2=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_GST_V4L2="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** v4l2src pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** v4l2src pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_GST_V4L2 = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_GST_V4L2=no + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking for up to date v4l2 installation" >&5 +$as_echo_n "checking Checking for up to date v4l2 installation... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef __sun /* Solaris */ +#include +#include +#else /* Linux */ +#include +#define _LINUX_TIME_H +#define __user +#include +#endif +#if defined(V4L2_MAJOR_VERSION) || defined(V4L2_MINOR_VERSION) +#error too early v4l2 version or no v4l2 at all +#endif + +int +main () +{ + +return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + HAVE_GST_V4L2="yes" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + HAVE_GST_V4L2="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_VIDEODEV=no + ac_fn_c_check_header_mongrel "$LINENO" "linux/videodev2.h" "ac_cv_header_linux_videodev2_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_videodev2_h" = xyes; then : + HAVE_VIDEODEV=yes +else + + ac_fn_c_check_header_mongrel "$LINENO" "sys/videodev2.h" "ac_cv_header_sys_videodev2_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_videodev2_h" = xyes; then : + HAVE_VIDEODEV=yes +fi + + + +fi + + + + if test "x$HAVE_VIDEODEV" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: video4linux2 headers were found, but they're old." >&5 +$as_echo "$as_me: WARNING: video4linux2 headers were found, but they're old." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Please update v4l2 to compile the v4l2 plugins" >&5 +$as_echo "$as_me: WARNING: Please update v4l2 to compile the v4l2 plugins" >&2;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: video4linux2 was not found" >&5 +$as_echo "$as_me: WARNING: video4linux2 was not found" >&2;} + fi + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + if test x$HAVE_GST_V4L2 = xyes ; then + MISSING_DECL=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking struct v4l2_buffer declaration" >&5 +$as_echo_n "checking struct v4l2_buffer declaration... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef __sun /* Solaris */ +#include +#include +#else /* Linux */ +#include +#define _LINUX_TIME_H +#define __user +#include +#endif + +int +main () +{ + +struct v4l2_buffer buf; +buf.index = 0; +return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + MISSING_DECL=1 && { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test x$MISSING_DECL = x1 ; then + +$as_echo "#define GST_V4L2_MISSING_BUFDECL 1" >>confdefs.h + + fi + + + if test x$HAVE_X = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XvQueryExtension in -lXv_pic" >&5 +$as_echo_n "checking for XvQueryExtension in -lXv_pic... " >&6; } +if ${ac_cv_lib_Xv_pic_XvQueryExtension+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXv_pic $X_LIBS -lXext $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XvQueryExtension (); +int +main () +{ +return XvQueryExtension (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xv_pic_XvQueryExtension=yes +else + ac_cv_lib_Xv_pic_XvQueryExtension=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xv_pic_XvQueryExtension" >&5 +$as_echo "$ac_cv_lib_Xv_pic_XvQueryExtension" >&6; } +if test "x$ac_cv_lib_Xv_pic_XvQueryExtension" = xyes; then : + HAVE_XVIDEO="yes" +else + HAVE_XVIDEO="no" +fi + + + if test x$HAVE_XVIDEO = xyes; then + XVIDEO_LIBS="-lXv_pic -lXext" + + else + if test x$HAVE_XVIDEO = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XvQueryExtension in -lXv" >&5 +$as_echo_n "checking for XvQueryExtension in -lXv... " >&6; } +if ${ac_cv_lib_Xv_XvQueryExtension+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXv $X_LIBS -lXext $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XvQueryExtension (); +int +main () +{ +return XvQueryExtension (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xv_XvQueryExtension=yes +else + ac_cv_lib_Xv_XvQueryExtension=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xv_XvQueryExtension" >&5 +$as_echo "$ac_cv_lib_Xv_XvQueryExtension" >&6; } +if test "x$ac_cv_lib_Xv_XvQueryExtension" = xyes; then : + HAVE_XVIDEO="yes" +else + HAVE_XVIDEO="no" +fi + + + if test x$HAVE_XVIDEO = xyes; then + XVIDEO_LIBS="-lXv -lXext" + + fi + fi + fi + fi + + fi + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_GST_V4L2 = xno; then + USE_GST_V4L2=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: v4l2src" >&5 +$as_echo "$as_me: *** These plugins will be built: v4l2src" >&6;} + fi +fi +if test x$USE_GST_V4L2 = xyes; then + : + if test "xv4l2src" != "x"; then + GST_PLUGINS_YES="\tv4l2src\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_GST_V4L2 /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: v4l2src" >&5 +$as_echo "$as_me: *** These plugins will not be built: v4l2src" >&6;} + if test "xv4l2src" != "x"; then + GST_PLUGINS_NO="\tv4l2src\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_GST_V4L2 = xyes; then + USE_GST_V4L2_TRUE= + USE_GST_V4L2_FALSE='#' +else + USE_GST_V4L2_TRUE='#' + USE_GST_V4L2_FALSE= +fi + + + +# Optional gudev for device probing + +# Check whether --with-gudev was given. +if test "${with_gudev+set}" = set; then : + withval=$with_gudev; +else + with_gudev=check +fi + +if test x$HAVE_GST_V4L2 = xyes; then + if test x$with_gudev != xno; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUDEV" >&5 +$as_echo_n "checking for GUDEV... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GUDEV_CFLAGS"; then + pkg_cv_GUDEV_CFLAGS="$GUDEV_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gudev-1.0 >= 143 \""; } >&5 + ($PKG_CONFIG --exists --print-errors " gudev-1.0 >= 143 ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GUDEV_CFLAGS=`$PKG_CONFIG --cflags " gudev-1.0 >= 143 " 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GUDEV_LIBS"; then + pkg_cv_GUDEV_LIBS="$GUDEV_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gudev-1.0 >= 143 \""; } >&5 + ($PKG_CONFIG --exists --print-errors " gudev-1.0 >= 143 ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GUDEV_LIBS=`$PKG_CONFIG --libs " gudev-1.0 >= 143 " 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GUDEV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors " gudev-1.0 >= 143 "` + else + GUDEV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors " gudev-1.0 >= 143 "` + fi + # Put the nasty error message in config.log where it belongs + echo "$GUDEV_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + have_gudev=no + +elif test $pkg_failed = untried; then + + have_gudev=no + +else + GUDEV_CFLAGS=$pkg_cv_GUDEV_CFLAGS + GUDEV_LIBS=$pkg_cv_GUDEV_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_gudev=yes + +$as_echo "#define HAVE_GUDEV 1" >>confdefs.h + + +$as_echo "#define G_UDEV_API_IS_SUBJECT_TO_CHANGE 1" >>confdefs.h + + +fi + else + have_gudev=no + fi +fi + + + +# Make libv4l2 non-automagic + +# Check whether --with-libv4l2 was given. +if test "${with_libv4l2+set}" = set; then : + withval=$with_libv4l2; +else + with_libv4l2=check +fi + +if test x$HAVE_GST_V4L2 = xyes; then + if test x$with_libv4l2 != xno; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBV4L2" >&5 +$as_echo_n "checking for LIBV4L2... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$LIBV4L2_CFLAGS"; then + pkg_cv_LIBV4L2_CFLAGS="$LIBV4L2_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libv4l2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libv4l2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBV4L2_CFLAGS=`$PKG_CONFIG --cflags "libv4l2" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$LIBV4L2_LIBS"; then + pkg_cv_LIBV4L2_LIBS="$LIBV4L2_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libv4l2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libv4l2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBV4L2_LIBS=`$PKG_CONFIG --libs "libv4l2" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBV4L2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libv4l2"` + else + LIBV4L2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libv4l2"` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBV4L2_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + have_libv4l2=no + +elif test $pkg_failed = untried; then + + have_libv4l2=no + +else + LIBV4L2_CFLAGS=$pkg_cv_LIBV4L2_CFLAGS + LIBV4L2_LIBS=$pkg_cv_LIBV4L2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_libv4l2=yes + +$as_echo "#define HAVE_LIBV4L2 1" >>confdefs.h + + +fi + else + have_libv4l2=no + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +$as_echo_n "checking for X... " >&6; } + + +# Check whether --with-x was given. +if test "${with_x+set}" = set; then : + withval=$with_x; +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + case $x_includes,$x_libraries in #( + *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( + *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : + $as_echo_n "(cached) " >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + cat >Imakefile <<'_ACEOF' +incroot: + @echo incroot='${INCROOT}' +usrlibdir: + @echo usrlibdir='${USRLIBDIR}' +libdir: + @echo libdir='${LIBDIR}' +_ACEOF + if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. + for ac_var in incroot usrlibdir libdir; do + eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" + done + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib la dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ac_x_includes= ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /usr/lib64 | /lib | /lib64) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Xlib.h. + # First, try using that file with no special directory specified. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # We can compile using X headers with no special include directory. +ac_x_includes= +else + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +XrmInitialize () + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + LIBS=$ac_save_LIBS +for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib la dll; do + if test -r "$ac_dir/libX11.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +case $ac_x_includes,$ac_x_libraries in #( + no,* | *,no | *\'*) + # Didn't find X, or a directory has "'" in its name. + ac_cv_have_x="have_x=no";; #( + *) + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$ac_x_includes'\ + ac_x_libraries='$ac_x_libraries'" +esac +fi +;; #( + *) have_x=yes;; + esac + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +$as_echo "$have_x" >&6; } + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$x_includes'\ + ac_x_libraries='$x_libraries'" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +$as_echo "libraries $x_libraries, headers $x_includes" >&6; } +fi + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: X libraries and plugins ***" >&5 +$as_echo "$as_me: *** checking feature: X libraries and plugins ***" >&6;} +if test "xximagesrc" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ximagesrc ***" >&5 +$as_echo "$as_me: *** for plug-ins: ximagesrc ***" >&6;} +fi +NOUSE= +if test "x$USE_X" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-x was given. +if test "${enable_x+set}" = set; then : + enableval=$enable_x; case "${enableval}" in + yes) USE_X=yes;; + no) USE_X=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-x" "$LINENO" 5 ;; + esac +else + USE_X=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_X="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ximagesrc pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** ximagesrc pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_X = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_X=no + + if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +$as_echo_n "checking whether -R must be followed by a space... " >&6; } + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + ac_xsave_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + X_LIBS="$X_LIBS -R$x_libraries" +else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + X_LIBS="$X_LIBS -R $x_libraries" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +$as_echo "neither works" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_c_werror_flag=$ac_xsave_c_werror_flag + LIBS=$ac_xsave_LIBS + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XOpenDisplay (); +int +main () +{ +return XOpenDisplay (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } +if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_dnet_ntoa=yes +else + ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + +fi + + if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +if test "x$ac_cv_func_connect" = xyes; then : + +fi + + if test $ac_cv_func_connect = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if ${ac_cv_lib_socket_connect+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = xyes; then : + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" +if test "x$ac_cv_func_remove" = xyes; then : + +fi + + if test $ac_cv_func_remove = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +$as_echo_n "checking for remove in -lposix... " >&6; } +if ${ac_cv_lib_posix_remove+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_posix_remove=yes +else + ac_cv_lib_posix_remove=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +$as_echo "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" +if test "x$ac_cv_func_shmat" = xyes; then : + +fi + + if test $ac_cv_func_shmat = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +$as_echo_n "checking for shmat in -lipc... " >&6; } +if ${ac_cv_lib_ipc_shmat+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ipc_shmat=yes +else + ac_cv_lib_ipc_shmat=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +$as_echo "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } +if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IceConnectionNumber (); +int +main () +{ +return IceConnectionNumber (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ICE_IceConnectionNumber=yes +else + ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + + ac_cflags_save="$CFLAGS" + ac_cppflags_save="$CPPFLAGS" + CFLAGS="$CFLAGS $X_CFLAGS" + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_fn_c_check_header_mongrel "$LINENO" "X11/Xlib.h" "ac_cv_header_X11_Xlib_h" "$ac_includes_default" +if test "x$ac_cv_header_X11_Xlib_h" = xyes; then : + HAVE_X="yes" +else + HAVE_X="no" +fi + + + + if test "x$HAVE_X" = "xno" + then + { $as_echo "$as_me:${as_lineno-$LINENO}: cannot find X11 development files" >&5 +$as_echo "$as_me: cannot find X11 development files" >&6;} + else + X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS" + X_LIBS="$X_LIBS -lX11" + + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XFIXES" >&5 +$as_echo_n "checking for XFIXES... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$XFIXES_CFLAGS"; then + pkg_cv_XFIXES_CFLAGS="$XFIXES_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xfixes\""; } >&5 + ($PKG_CONFIG --exists --print-errors "xfixes") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_XFIXES_CFLAGS=`$PKG_CONFIG --cflags "xfixes" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$XFIXES_LIBS"; then + pkg_cv_XFIXES_LIBS="$XFIXES_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xfixes\""; } >&5 + ($PKG_CONFIG --exists --print-errors "xfixes") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_XFIXES_LIBS=`$PKG_CONFIG --libs "xfixes" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + XFIXES_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xfixes"` + else + XFIXES_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xfixes"` + fi + # Put the nasty error message in config.log where it belongs + echo "$XFIXES_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_XFIXES="no" +elif test $pkg_failed = untried; then + HAVE_XFIXES="no" +else + XFIXES_CFLAGS=$pkg_cv_XFIXES_CFLAGS + XFIXES_LIBS=$pkg_cv_XFIXES_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_XFIXES="yes" +fi + if test "x$HAVE_XFIXES" = "xyes" + then + XFIXES_CFLAGS="-DHAVE_XFIXES $XFIXES_CFLAGS" + fi + + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XDAMAGE" >&5 +$as_echo_n "checking for XDAMAGE... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$XDAMAGE_CFLAGS"; then + pkg_cv_XDAMAGE_CFLAGS="$XDAMAGE_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xdamage\""; } >&5 + ($PKG_CONFIG --exists --print-errors "xdamage") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_XDAMAGE_CFLAGS=`$PKG_CONFIG --cflags "xdamage" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$XDAMAGE_LIBS"; then + pkg_cv_XDAMAGE_LIBS="$XDAMAGE_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xdamage\""; } >&5 + ($PKG_CONFIG --exists --print-errors "xdamage") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_XDAMAGE_LIBS=`$PKG_CONFIG --libs "xdamage" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + XDAMAGE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xdamage"` + else + XDAMAGE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xdamage"` + fi + # Put the nasty error message in config.log where it belongs + echo "$XDAMAGE_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_XDAMAGE="no" +elif test $pkg_failed = untried; then + HAVE_XDAMAGE="no" +else + XDAMAGE_CFLAGS=$pkg_cv_XDAMAGE_CFLAGS + XDAMAGE_LIBS=$pkg_cv_XDAMAGE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_XDAMAGE="yes" +fi + if test "x$HAVE_XDAMAGE" = "xyes" + then + XDAMAGE_CFLAGS="-DHAVE_XDAMAGE $XDAMAGE_CFLAGS" + fi + + + fi + + CFLAGS="$ac_cflags_save" + CPPFLAGS="$ac_cppflags_save" + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_X = xno; then + USE_X=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: ximagesrc" >&5 +$as_echo "$as_me: *** These plugins will be built: ximagesrc" >&6;} + fi +fi +if test x$USE_X = xyes; then + : + if test "xximagesrc" != "x"; then + GST_PLUGINS_YES="\tximagesrc\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_X /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: ximagesrc" >&5 +$as_echo "$as_me: *** These plugins will not be built: ximagesrc" >&6;} + if test "xximagesrc" != "x"; then + GST_PLUGINS_NO="\tximagesrc\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_X = xyes; then + USE_X_TRUE= + USE_X_FALSE='#' +else + USE_X_TRUE='#' + USE_X_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: X Shared Memory extension ***" >&5 +$as_echo "$as_me: *** checking feature: X Shared Memory extension ***" >&6;} +if test "x" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 +$as_echo "$as_me: *** for plug-ins: ***" >&6;} +fi +NOUSE= +if test "x$USE_XSHM" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-xshm was given. +if test "${enable_xshm+set}" = set; then : + enableval=$enable_xshm; case "${enableval}" in + yes) USE_XSHM=yes;; + no) USE_XSHM=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-xshm" "$LINENO" 5 ;; + esac +else + USE_XSHM=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_XSHM="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_XSHM = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_XSHM=no + + if test x$HAVE_X = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmAttach in -lXext" >&5 +$as_echo_n "checking for XShmAttach in -lXext... " >&6; } +if ${ac_cv_lib_Xext_XShmAttach+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXext $X_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XShmAttach (); +int +main () +{ +return XShmAttach (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xext_XShmAttach=yes +else + ac_cv_lib_Xext_XShmAttach=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XShmAttach" >&5 +$as_echo "$ac_cv_lib_Xext_XShmAttach" >&6; } +if test "x$ac_cv_lib_Xext_XShmAttach" = xyes; then : + HAVE_XSHM="yes" +else + HAVE_XSHM="no" +fi + + if test "x$HAVE_XSHM" = "xyes"; then + XSHM_LIBS="-lXext" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmAttach in -lXextSam" >&5 +$as_echo_n "checking for XShmAttach in -lXextSam... " >&6; } +if ${ac_cv_lib_XextSam_XShmAttach+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXextSam $X_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XShmAttach (); +int +main () +{ +return XShmAttach (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_XextSam_XShmAttach=yes +else + ac_cv_lib_XextSam_XShmAttach=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XextSam_XShmAttach" >&5 +$as_echo "$ac_cv_lib_XextSam_XShmAttach" >&6; } +if test "x$ac_cv_lib_XextSam_XShmAttach" = xyes; then : + HAVE_XSHM="yes" +else + HAVE_XSHM="no" +fi + + if test "x$HAVE_XSHM" = "xyes"; then + XSHM_LIBS="-lXext -lXextSam" + fi + fi + fi + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_XSHM = xno; then + USE_XSHM=no + else + : + fi +fi +if test x$USE_XSHM = xyes; then + + + + + if test "x" != "x"; then + GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_XSHM /**/" >>confdefs.h + +else + : + if test "x" != "x"; then + GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_XSHM = xyes; then + USE_XSHM_TRUE= + USE_XSHM_FALSE='#' +else + USE_XSHM_TRUE='#' + USE_XSHM_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: X11 XVideo extensions ***" >&5 +$as_echo "$as_me: *** checking feature: X11 XVideo extensions ***" >&6;} +if test "x" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 +$as_echo "$as_me: *** for plug-ins: ***" >&6;} +fi +NOUSE= +if test "x$USE_XVIDEO" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-xvideo was given. +if test "${enable_xvideo+set}" = set; then : + enableval=$enable_xvideo; case "${enableval}" in + yes) USE_XVIDEO=yes;; + no) USE_XVIDEO=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-xvideo" "$LINENO" 5 ;; + esac +else + USE_XVIDEO=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_XVIDEO="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_XVIDEO = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_XVIDEO=no + + + if test x$HAVE_X = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XvQueryExtension in -lXv_pic" >&5 +$as_echo_n "checking for XvQueryExtension in -lXv_pic... " >&6; } +if ${ac_cv_lib_Xv_pic_XvQueryExtension+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXv_pic $X_LIBS -lXext $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XvQueryExtension (); +int +main () +{ +return XvQueryExtension (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xv_pic_XvQueryExtension=yes +else + ac_cv_lib_Xv_pic_XvQueryExtension=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xv_pic_XvQueryExtension" >&5 +$as_echo "$ac_cv_lib_Xv_pic_XvQueryExtension" >&6; } +if test "x$ac_cv_lib_Xv_pic_XvQueryExtension" = xyes; then : + HAVE_XVIDEO="yes" +else + HAVE_XVIDEO="no" +fi + + + if test x$HAVE_XVIDEO = xyes; then + XVIDEO_LIBS="-lXv_pic -lXext" + + else + if test x$HAVE_XVIDEO = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XvQueryExtension in -lXv" >&5 +$as_echo_n "checking for XvQueryExtension in -lXv... " >&6; } +if ${ac_cv_lib_Xv_XvQueryExtension+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXv $X_LIBS -lXext $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XvQueryExtension (); +int +main () +{ +return XvQueryExtension (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xv_XvQueryExtension=yes +else + ac_cv_lib_Xv_XvQueryExtension=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xv_XvQueryExtension" >&5 +$as_echo "$ac_cv_lib_Xv_XvQueryExtension" >&6; } +if test "x$ac_cv_lib_Xv_XvQueryExtension" = xyes; then : + HAVE_XVIDEO="yes" +else + HAVE_XVIDEO="no" +fi + + + if test x$HAVE_XVIDEO = xyes; then + XVIDEO_LIBS="-lXv -lXext" + + fi + fi + fi + fi + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_XVIDEO = xno; then + USE_XVIDEO=no + else + : + fi +fi +if test x$USE_XVIDEO = xyes; then + : + if test "x" != "x"; then + GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_XVIDEO /**/" >>confdefs.h + +else + : + if test "x" != "x"; then + GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_XVIDEO = xyes; then + USE_XVIDEO_TRUE= + USE_XVIDEO_FALSE='#' +else + USE_XVIDEO_TRUE='#' + USE_XVIDEO_FALSE= +fi + + + + +if test "x$BUILD_EXTERNAL" = "xyes"; then + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: Checking libraries for plugins in ext/" >&5 +$as_echo "$as_me: Checking libraries for plugins in ext/" >&6;} +echo + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: aalib ASCII Art library ***" >&5 +$as_echo "$as_me: *** checking feature: aalib ASCII Art library ***" >&6;} +if test "xaasink" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: aasink ***" >&5 +$as_echo "$as_me: *** for plug-ins: aasink ***" >&6;} +fi +NOUSE= +if test "x$USE_AALIB" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-aalib was given. +if test "${enable_aalib+set}" = set; then : + enableval=$enable_aalib; case "${enableval}" in + yes) USE_AALIB=yes;; + no) USE_AALIB=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-aalib" "$LINENO" 5 ;; + esac +else + USE_AALIB=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_AALIB="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** aasink pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** aasink pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_AALIB = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_AALIB=no + + +# Check whether --with-aalib-prefix was given. +if test "${with_aalib_prefix+set}" = set; then : + withval=$with_aalib_prefix; aalib_prefix="$withval" +else + aalib_prefix="" +fi + + + +# Check whether --with-aalib-exec-prefix was given. +if test "${with_aalib_exec_prefix+set}" = set; then : + withval=$with_aalib_exec_prefix; aalib_exec_prefix="$withval" +else + aalib_exec_prefix="" +fi + + +# Check whether --enable-aalibtest was given. +if test "${enable_aalibtest+set}" = set; then : + enableval=$enable_aalibtest; +else + enable_aalibtest=yes +fi + + + if test x$aalib_exec_prefix != x ; then + aalib_args="$aalib_args --exec-prefix=$aalib_exec_prefix" + if test x${AALIB_CONFIG+set} != xset ; then + AALIB_CONFIG=$aalib_exec_prefix/bin/aalib-config + fi + fi + if test x$aalib_prefix != x ; then + aalib_args="$aalib_args --prefix=$aalib_prefix" + if test x${AALIB_CONFIG+set} != xset ; then + AALIB_CONFIG=$aalib_prefix/bin/aalib-config + fi + fi + + # Extract the first word of "aalib-config", so it can be a program name with args. +set dummy aalib-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_AALIB_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $AALIB_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_AALIB_CONFIG="$AALIB_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_AALIB_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_AALIB_CONFIG" && ac_cv_path_AALIB_CONFIG="no" + ;; +esac +fi +AALIB_CONFIG=$ac_cv_path_AALIB_CONFIG +if test -n "$AALIB_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AALIB_CONFIG" >&5 +$as_echo "$AALIB_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + min_aalib_version=0.11.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for AALIB - version >= $min_aalib_version" >&5 +$as_echo_n "checking for AALIB - version >= $min_aalib_version... " >&6; } + no_aalib="" + if test "$AALIB_CONFIG" = "no" ; then + no_aalib=yes + else + AALIB_CFLAGS=`$AALIB_CONFIG $aalibconf_args --cflags` + AALIB_LIBS=`$AALIB_CONFIG $aalibconf_args --libs` + + aalib_major_version=`$AALIB_CONFIG $aalib_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + aalib_minor_version=`$AALIB_CONFIG $aalib_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + aalib_micro_version=`$AALIB_CONFIG $aalib_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_aalibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $AALIB_CFLAGS" + LIBS="$LIBS $AALIB_LIBS" + rm -f conf.aalibtest + if test "$cross_compiling" = yes; then : + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include "aalib.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.aalibtest"); + */ + { FILE *fp = fopen("conf.aalibtest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_aalib_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_aalib_version"); + exit(1); + } + + if (($aalib_major_version > major) || + (($aalib_major_version == major) && ($aalib_minor_version > minor)) || + (($aalib_major_version == major) && ($aalib_minor_version == minor) && ($aalib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'aalib-config --version' returned %d.%d.%d, but the minimum version\n", $aalib_major_version, $aalib_minor_version, $aalib_micro_version); + printf("*** of AALIB required is %d.%d.%d. If aalib-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If aalib-config was wrong, set the environment variable AALIB_CONFIG\n"); + printf("*** to point to the correct copy of aalib-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + no_aalib=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_aalib" = x ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_AALIB=yes + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + if test "$AALIB_CONFIG" = "no" ; then + echo "*** The aalib-config script installed by AALIB could not be found" + echo "*** If AALIB was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the AALIB_CONFIG environment variable to the" + echo "*** full path to aalib-config." + else + if test -f conf.aalibtest ; then + : + else + echo "*** Could not run AALIB test program, checking why..." + CFLAGS="$CFLAGS $AALIB_CFLAGS" + LIBS="$LIBS $AALIB_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include "AALIB.h" + +int +main () +{ + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding AALIB or finding the wrong" + echo "*** version of AALIB. If it is not finding AALIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" +else + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means AALIB was incorrectly installed" + echo "*** or that you have moved AALIB since it was installed. In the latter case, you" + echo "*** may want to edit the aalib-config script: $AALIB_CONFIG" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + AALIB_CFLAGS="" + AALIB_LIBS="" + HAVE_AALIB=no + fi + + + rm -f conf.aalibtest + + + GIVEN_CFLAGS=$AALIB_CFLAGS + INCLUDE_DIRS=`echo | cpp -v 2>&1` + + INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` + for dir in $INCLUDE_DIRS; do + GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` + done + AALIB_CFLAGS=$GIVEN_CFLAGS + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_AALIB = xno; then + USE_AALIB=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: aasink" >&5 +$as_echo "$as_me: *** These plugins will be built: aasink" >&6;} + fi +fi +if test x$USE_AALIB = xyes; then + : + if test "xaasink" != "x"; then + GST_PLUGINS_YES="\taasink\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_AALIB /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: aasink" >&5 +$as_echo "$as_me: *** These plugins will not be built: aasink" >&6;} + if test "xaasink" != "x"; then + GST_PLUGINS_NO="\taasink\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_AALIB = xyes; then + USE_AALIB_TRUE= + USE_AALIB_FALSE='#' +else + USE_AALIB_TRUE='#' + USE_AALIB_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: XML library ***" >&5 +$as_echo "$as_me: *** checking feature: XML library ***" >&6;} +if test "xannodex" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: annodex ***" >&5 +$as_echo "$as_me: *** for plug-ins: annodex ***" >&6;} +fi +NOUSE= +if test "x$USE_ANNODEX" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-annodex was given. +if test "${enable_annodex+set}" = set; then : + enableval=$enable_annodex; case "${enableval}" in + yes) USE_ANNODEX=yes;; + no) USE_ANNODEX=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-annodex" "$LINENO" 5 ;; + esac +else + USE_ANNODEX=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_ANNODEX="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** annodex pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** annodex pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_ANNODEX = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_ANNODEX=no + + + which="libxml-2.0 >= 2.4.9" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANNODEX" >&5 +$as_echo_n "checking for ANNODEX... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$ANNODEX_CFLAGS"; then + pkg_cv_ANNODEX_CFLAGS="$ANNODEX_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ANNODEX_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$ANNODEX_LIBS"; then + pkg_cv_ANNODEX_LIBS="$ANNODEX_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ANNODEX_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + ANNODEX_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + ANNODEX_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$ANNODEX_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_ANNODEX="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$ANNODEX_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $ANNODEX_PKG_ERRORS" >&5 +$as_echo "$as_me: $ANNODEX_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_ANNODEX="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$ANNODEX_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $ANNODEX_PKG_ERRORS" >&5 +$as_echo "$as_me: $ANNODEX_PKG_ERRORS" >&6;} + fi + +else + ANNODEX_CFLAGS=$pkg_cv_ANNODEX_CFLAGS + ANNODEX_LIBS=$pkg_cv_ANNODEX_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_ANNODEX="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_ANNODEX = xno; then + USE_ANNODEX=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: annodex" >&5 +$as_echo "$as_me: *** These plugins will be built: annodex" >&6;} + fi +fi +if test x$USE_ANNODEX = xyes; then + : + if test "xannodex" != "x"; then + GST_PLUGINS_YES="\tannodex\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_ANNODEX /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: annodex" >&5 +$as_echo "$as_me: *** These plugins will not be built: annodex" >&6;} + if test "xannodex" != "x"; then + GST_PLUGINS_NO="\tannodex\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_ANNODEX = xyes; then + USE_ANNODEX_TRUE= + USE_ANNODEX_FALSE='#' +else + USE_ANNODEX_TRUE='#' + USE_ANNODEX_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Cairo graphics rendering ***" >&5 +$as_echo "$as_me: *** checking feature: Cairo graphics rendering ***" >&6;} +if test "xcairo" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: cairo ***" >&5 +$as_echo "$as_me: *** for plug-ins: cairo ***" >&6;} +fi +NOUSE= +if test "x$USE_CAIRO" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-cairo was given. +if test "${enable_cairo+set}" = set; then : + enableval=$enable_cairo; case "${enableval}" in + yes) USE_CAIRO=yes;; + no) USE_CAIRO=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-cairo" "$LINENO" 5 ;; + esac +else + USE_CAIRO=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_CAIRO="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** cairo pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** cairo pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_CAIRO = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_CAIRO=no + + + which="cairo >= 1.0.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 +$as_echo_n "checking for CAIRO... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$CAIRO_CFLAGS"; then + pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$CAIRO_LIBS"; then + pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + CAIRO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$CAIRO_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_CAIRO="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$CAIRO_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $CAIRO_PKG_ERRORS" >&5 +$as_echo "$as_me: $CAIRO_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_CAIRO="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$CAIRO_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $CAIRO_PKG_ERRORS" >&5 +$as_echo "$as_me: $CAIRO_PKG_ERRORS" >&6;} + fi + +else + CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS + CAIRO_LIBS=$pkg_cv_CAIRO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_CAIRO="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_CAIRO = xno; then + USE_CAIRO=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: cairo" >&5 +$as_echo "$as_me: *** These plugins will be built: cairo" >&6;} + fi +fi +if test x$USE_CAIRO = xyes; then + : + if test "xcairo" != "x"; then + GST_PLUGINS_YES="\tcairo\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_CAIRO /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: cairo" >&5 +$as_echo "$as_me: *** These plugins will not be built: cairo" >&6;} + if test "xcairo" != "x"; then + GST_PLUGINS_NO="\tcairo\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_CAIRO = xyes; then + USE_CAIRO_TRUE= + USE_CAIRO_FALSE='#' +else + USE_CAIRO_TRUE='#' + USE_CAIRO_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Cairo graphics rendering gobject bindings ***" >&5 +$as_echo "$as_me: *** checking feature: Cairo graphics rendering gobject bindings ***" >&6;} +if test "xcairooverlay" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: cairooverlay ***" >&5 +$as_echo "$as_me: *** for plug-ins: cairooverlay ***" >&6;} +fi +NOUSE= +if test "x$USE_CAIRO_GOBJECT" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-cairo_gobject was given. +if test "${enable_cairo_gobject+set}" = set; then : + enableval=$enable_cairo_gobject; case "${enableval}" in + yes) USE_CAIRO_GOBJECT=yes;; + no) USE_CAIRO_GOBJECT=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-cairo_gobject" "$LINENO" 5 ;; + esac +else + USE_CAIRO_GOBJECT=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_CAIRO_GOBJECT="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** cairooverlay pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** cairooverlay pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_CAIRO_GOBJECT = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_CAIRO_GOBJECT=no + + + which="cairo-gobject >= 1.10.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO_GOBJECT" >&5 +$as_echo_n "checking for CAIRO_GOBJECT... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$CAIRO_GOBJECT_CFLAGS"; then + pkg_cv_CAIRO_GOBJECT_CFLAGS="$CAIRO_GOBJECT_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_GOBJECT_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$CAIRO_GOBJECT_LIBS"; then + pkg_cv_CAIRO_GOBJECT_LIBS="$CAIRO_GOBJECT_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_GOBJECT_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + CAIRO_GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + CAIRO_GOBJECT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$CAIRO_GOBJECT_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_CAIRO_GOBJECT="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$CAIRO_GOBJECT_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $CAIRO_GOBJECT_PKG_ERRORS" >&5 +$as_echo "$as_me: $CAIRO_GOBJECT_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_CAIRO_GOBJECT="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$CAIRO_GOBJECT_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $CAIRO_GOBJECT_PKG_ERRORS" >&5 +$as_echo "$as_me: $CAIRO_GOBJECT_PKG_ERRORS" >&6;} + fi + +else + CAIRO_GOBJECT_CFLAGS=$pkg_cv_CAIRO_GOBJECT_CFLAGS + CAIRO_GOBJECT_LIBS=$pkg_cv_CAIRO_GOBJECT_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_CAIRO_GOBJECT="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_CAIRO_GOBJECT = xno; then + USE_CAIRO_GOBJECT=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: cairooverlay" >&5 +$as_echo "$as_me: *** These plugins will be built: cairooverlay" >&6;} + fi +fi +if test x$USE_CAIRO_GOBJECT = xyes; then + : + if test "xcairooverlay" != "x"; then + GST_PLUGINS_YES="\tcairooverlay\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_CAIRO_GOBJECT /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: cairooverlay" >&5 +$as_echo "$as_me: *** These plugins will not be built: cairooverlay" >&6;} + if test "xcairooverlay" != "x"; then + GST_PLUGINS_NO="\tcairooverlay\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_CAIRO_GOBJECT = xyes; then + USE_CAIRO_GOBJECT_TRUE= + USE_CAIRO_GOBJECT_FALSE='#' +else + USE_CAIRO_GOBJECT_TRUE='#' + USE_CAIRO_GOBJECT_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: ESounD sound daemon ***" >&5 +$as_echo "$as_me: *** checking feature: ESounD sound daemon ***" >&6;} +if test "xesdsink" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: esdsink ***" >&5 +$as_echo "$as_me: *** for plug-ins: esdsink ***" >&6;} +fi +NOUSE= +if test "x$USE_ESD" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-esd was given. +if test "${enable_esd+set}" = set; then : + enableval=$enable_esd; case "${enableval}" in + yes) USE_ESD=yes;; + no) USE_ESD=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-esd" "$LINENO" 5 ;; + esac +else + USE_ESD=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_ESD="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** esdsink pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** esdsink pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_ESD = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_ESD=no + + + which="esound >= 0.2.12" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ESD" >&5 +$as_echo_n "checking for ESD... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$ESD_CFLAGS"; then + pkg_cv_ESD_CFLAGS="$ESD_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ESD_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$ESD_LIBS"; then + pkg_cv_ESD_LIBS="$ESD_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ESD_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + ESD_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + ESD_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$ESD_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_ESD="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$ESD_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $ESD_PKG_ERRORS" >&5 +$as_echo "$as_me: $ESD_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_ESD="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$ESD_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $ESD_PKG_ERRORS" >&5 +$as_echo "$as_me: $ESD_PKG_ERRORS" >&6;} + fi + +else + ESD_CFLAGS=$pkg_cv_ESD_CFLAGS + ESD_LIBS=$pkg_cv_ESD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_ESD="yes" + +fi + + + if test $HAVE_ESD = no + then + +# Check whether --with-esd-prefix was given. +if test "${with_esd_prefix+set}" = set; then : + withval=$with_esd_prefix; esd_prefix="$withval" +else + esd_prefix="" +fi + + + +# Check whether --with-esd-exec-prefix was given. +if test "${with_esd_exec_prefix+set}" = set; then : + withval=$with_esd_exec_prefix; esd_exec_prefix="$withval" +else + esd_exec_prefix="" +fi + + +# Check whether --enable-esdtest was given. +if test "${enable_esdtest+set}" = set; then : + enableval=$enable_esdtest; +else + enable_esdtest=yes +fi + + + if test x$esd_exec_prefix != x ; then + esd_args="$esd_args --exec-prefix=$esd_exec_prefix" + if test x${ESD_CONFIG+set} != xset ; then + ESD_CONFIG=$esd_exec_prefix/bin/esd-config + fi + fi + if test x$esd_prefix != x ; then + esd_args="$esd_args --prefix=$esd_prefix" + if test x${ESD_CONFIG+set} != xset ; then + ESD_CONFIG=$esd_prefix/bin/esd-config + fi + fi + + # Extract the first word of "esd-config", so it can be a program name with args. +set dummy esd-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ESD_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ESD_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ESD_CONFIG="$ESD_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ESD_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ESD_CONFIG" && ac_cv_path_ESD_CONFIG="no" + ;; +esac +fi +ESD_CONFIG=$ac_cv_path_ESD_CONFIG +if test -n "$ESD_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESD_CONFIG" >&5 +$as_echo "$ESD_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + min_esd_version=0.2.12 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ESD - version >= $min_esd_version" >&5 +$as_echo_n "checking for ESD - version >= $min_esd_version... " >&6; } + no_esd="" + if test "$ESD_CONFIG" = "no" ; then + no_esd=yes + else + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ESD_CFLAGS=`$ESD_CONFIG $esdconf_args --cflags` + ESD_LIBS=`$ESD_CONFIG $esdconf_args --libs` + + esd_major_version=`$ESD_CONFIG $esd_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + esd_minor_version=`$ESD_CONFIG $esd_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + esd_micro_version=`$ESD_CONFIG $esd_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_esdtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $ESD_CFLAGS" + LIBS="$LIBS $ESD_LIBS" + rm -f conf.esdtest + if test "$cross_compiling" = yes; then : + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.esdtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_esd_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_esd_version"); + exit(1); + } + + if (($esd_major_version > major) || + (($esd_major_version == major) && ($esd_minor_version > minor)) || + (($esd_major_version == major) && ($esd_minor_version == minor) && ($esd_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'esd-config --version' returned %d.%d.%d, but the minimum version\n", $esd_major_version, $esd_minor_version, $esd_micro_version); + printf("*** of ESD required is %d.%d.%d. If esd-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If esd-config was wrong, set the environment variable ESD_CONFIG\n"); + printf("*** to point to the correct copy of esd-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + no_esd=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + fi + fi + if test "x$no_esd" = x ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_ESD="yes" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + if test "$ESD_CONFIG" = "no" ; then + echo "*** The esd-config script installed by ESD could not be found" + echo "*** If ESD was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the ESD_CONFIG environment variable to the" + echo "*** full path to esd-config." + else + if test -f conf.esdtest ; then + : + else + echo "*** Could not run ESD test program, checking why..." + CFLAGS="$CFLAGS $ESD_CFLAGS" + LIBS="$LIBS $ESD_LIBS" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main () +{ + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding ESD or finding the wrong" + echo "*** version of ESD. If it is not finding ESD, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" +else + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means ESD was incorrectly installed" + echo "*** or that you have moved ESD since it was installed. In the latter case, you" + echo "*** may want to edit the esd-config script: $ESD_CONFIG" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + fi + fi + ESD_CFLAGS="" + ESD_LIBS="" + : + fi + + + rm -f conf.esdtest + + + GIVEN_CFLAGS=$ESD_CFLAGS + INCLUDE_DIRS=`echo | cpp -v 2>&1` + + INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` + for dir in $INCLUDE_DIRS; do + GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` + done + ESD_CFLAGS=$GIVEN_CFLAGS + + fi + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_ESD = xno; then + USE_ESD=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: esdsink" >&5 +$as_echo "$as_me: *** These plugins will be built: esdsink" >&6;} + fi +fi +if test x$USE_ESD = xyes; then + : + if test "xesdsink" != "x"; then + GST_PLUGINS_YES="\tesdsink\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_ESD /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: esdsink" >&5 +$as_echo "$as_me: *** These plugins will not be built: esdsink" >&6;} + if test "xesdsink" != "x"; then + GST_PLUGINS_NO="\tesdsink\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_ESD = xyes; then + USE_ESD_TRUE= + USE_ESD_FALSE='#' +else + USE_ESD_TRUE='#' + USE_ESD_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: FLAC lossless audio ***" >&5 +$as_echo "$as_me: *** checking feature: FLAC lossless audio ***" >&6;} +if test "xflac" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: flac ***" >&5 +$as_echo "$as_me: *** for plug-ins: flac ***" >&6;} +fi +NOUSE= +if test "x$USE_FLAC" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-flac was given. +if test "${enable_flac+set}" = set; then : + enableval=$enable_flac; case "${enableval}" in + yes) USE_FLAC=yes;; + no) USE_FLAC=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-flac" "$LINENO" 5 ;; + esac +else + USE_FLAC=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_FLAC="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** flac pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** flac pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_FLAC = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_FLAC=no + + + which="flac >= 1.1.4" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLAC" >&5 +$as_echo_n "checking for FLAC... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$FLAC_CFLAGS"; then + pkg_cv_FLAC_CFLAGS="$FLAC_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FLAC_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$FLAC_LIBS"; then + pkg_cv_FLAC_LIBS="$FLAC_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FLAC_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FLAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + FLAC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$FLAC_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_FLAC="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$FLAC_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $FLAC_PKG_ERRORS" >&5 +$as_echo "$as_me: $FLAC_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_FLAC="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$FLAC_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $FLAC_PKG_ERRORS" >&5 +$as_echo "$as_me: $FLAC_PKG_ERRORS" >&6;} + fi + +else + FLAC_CFLAGS=$pkg_cv_FLAC_CFLAGS + FLAC_LIBS=$pkg_cv_FLAC_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_FLAC="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_FLAC = xno; then + USE_FLAC=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: flac" >&5 +$as_echo "$as_me: *** These plugins will be built: flac" >&6;} + fi +fi +if test x$USE_FLAC = xyes; then + : + if test "xflac" != "x"; then + GST_PLUGINS_YES="\tflac\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_FLAC /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: flac" >&5 +$as_echo "$as_me: *** These plugins will not be built: flac" >&6;} + if test "xflac" != "x"; then + GST_PLUGINS_NO="\tflac\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_FLAC = xyes; then + USE_FLAC_TRUE= + USE_FLAC_FALSE='#' +else + USE_FLAC_TRUE='#' + USE_FLAC_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: GConf libraries ***" >&5 +$as_echo "$as_me: *** checking feature: GConf libraries ***" >&6;} +if test "xgconfelements" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gconfelements ***" >&5 +$as_echo "$as_me: *** for plug-ins: gconfelements ***" >&6;} +fi +NOUSE= +if test "x$USE_GCONF" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-gconf was given. +if test "${enable_gconf+set}" = set; then : + enableval=$enable_gconf; case "${enableval}" in + yes) USE_GCONF=yes;; + no) USE_GCONF=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-gconf" "$LINENO" 5 ;; + esac +else + USE_GCONF=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_GCONF="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gconfelements pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** gconfelements pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_GCONF = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_GCONF=no + + + which="gconf-2.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GCONF" >&5 +$as_echo_n "checking for GCONF... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GCONF_CFLAGS"; then + pkg_cv_GCONF_CFLAGS="$GCONF_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GCONF_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GCONF_LIBS"; then + pkg_cv_GCONF_LIBS="$GCONF_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GCONF_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GCONF_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + GCONF_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GCONF_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GCONF="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$GCONF_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $GCONF_PKG_ERRORS" >&5 +$as_echo "$as_me: $GCONF_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GCONF="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$GCONF_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $GCONF_PKG_ERRORS" >&5 +$as_echo "$as_me: $GCONF_PKG_ERRORS" >&6;} + fi + +else + GCONF_CFLAGS=$pkg_cv_GCONF_CFLAGS + GCONF_LIBS=$pkg_cv_GCONF_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GCONF="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_GCONF = xno; then + USE_GCONF=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gconfelements" >&5 +$as_echo "$as_me: *** These plugins will be built: gconfelements" >&6;} + fi +fi +if test x$USE_GCONF = xyes; then + : + if test "xgconfelements" != "x"; then + GST_PLUGINS_YES="\tgconfelements\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_GCONF /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gconfelements" >&5 +$as_echo "$as_me: *** These plugins will not be built: gconfelements" >&6;} + if test "xgconfelements" != "x"; then + GST_PLUGINS_NO="\tgconfelements\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_GCONF = xyes; then + USE_GCONF_TRUE= + USE_GCONF_FALSE='#' +else + USE_GCONF_TRUE='#' + USE_GCONF_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: GDK pixbuf ***" >&5 +$as_echo "$as_me: *** checking feature: GDK pixbuf ***" >&6;} +if test "xgdkpixbuf" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gdkpixbuf ***" >&5 +$as_echo "$as_me: *** for plug-ins: gdkpixbuf ***" >&6;} +fi +NOUSE= +if test "x$USE_GDK_PIXBUF" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-gdk_pixbuf was given. +if test "${enable_gdk_pixbuf+set}" = set; then : + enableval=$enable_gdk_pixbuf; case "${enableval}" in + yes) USE_GDK_PIXBUF=yes;; + no) USE_GDK_PIXBUF=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-gdk_pixbuf" "$LINENO" 5 ;; + esac +else + USE_GDK_PIXBUF=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_GDK_PIXBUF="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gdkpixbuf pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** gdkpixbuf pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_GDK_PIXBUF = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_GDK_PIXBUF=no + + + which="gdk-pixbuf-2.0 >= 2.8.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF" >&5 +$as_echo_n "checking for GDK_PIXBUF... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$GDK_PIXBUF_CFLAGS"; then + pkg_cv_GDK_PIXBUF_CFLAGS="$GDK_PIXBUF_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GDK_PIXBUF_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GDK_PIXBUF_LIBS"; then + pkg_cv_GDK_PIXBUF_LIBS="$GDK_PIXBUF_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GDK_PIXBUF_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GDK_PIXBUF_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + GDK_PIXBUF_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GDK_PIXBUF_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_GDK_PIXBUF="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$GDK_PIXBUF_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $GDK_PIXBUF_PKG_ERRORS" >&5 +$as_echo "$as_me: $GDK_PIXBUF_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_GDK_PIXBUF="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$GDK_PIXBUF_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $GDK_PIXBUF_PKG_ERRORS" >&5 +$as_echo "$as_me: $GDK_PIXBUF_PKG_ERRORS" >&6;} + fi + +else + GDK_PIXBUF_CFLAGS=$pkg_cv_GDK_PIXBUF_CFLAGS + GDK_PIXBUF_LIBS=$pkg_cv_GDK_PIXBUF_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_GDK_PIXBUF="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_GDK_PIXBUF = xno; then + USE_GDK_PIXBUF=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gdkpixbuf" >&5 +$as_echo "$as_me: *** These plugins will be built: gdkpixbuf" >&6;} + fi +fi +if test x$USE_GDK_PIXBUF = xyes; then + : + if test "xgdkpixbuf" != "x"; then + GST_PLUGINS_YES="\tgdkpixbuf\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_GDK_PIXBUF /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gdkpixbuf" >&5 +$as_echo "$as_me: *** These plugins will not be built: gdkpixbuf" >&6;} + if test "xgdkpixbuf" != "x"; then + GST_PLUGINS_NO="\tgdkpixbuf\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_GDK_PIXBUF = xyes; then + USE_GDK_PIXBUF_TRUE= + USE_GDK_PIXBUF_FALSE='#' +else + USE_GDK_PIXBUF_TRUE='#' + USE_GDK_PIXBUF_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: HAL libraries ***" >&5 +$as_echo "$as_me: *** checking feature: HAL libraries ***" >&6;} +if test "xhalelements" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: halelements ***" >&5 +$as_echo "$as_me: *** for plug-ins: halelements ***" >&6;} +fi +NOUSE= +if test "x$USE_HAL" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-hal was given. +if test "${enable_hal+set}" = set; then : + enableval=$enable_hal; case "${enableval}" in + yes) USE_HAL=yes;; + no) USE_HAL=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-hal" "$LINENO" 5 ;; + esac +else + USE_HAL=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_HAL="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** halelements pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** halelements pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_HAL = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_HAL=no + + + which="hal >= 0.5.6, dbus-1 >= 0.32" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for HAL" >&5 +$as_echo_n "checking for HAL... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$HAL_CFLAGS"; then + pkg_cv_HAL_CFLAGS="$HAL_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_HAL_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$HAL_LIBS"; then + pkg_cv_HAL_LIBS="$HAL_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_HAL_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + HAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + HAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$HAL_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_HAL="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$HAL_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $HAL_PKG_ERRORS" >&5 +$as_echo "$as_me: $HAL_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_HAL="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$HAL_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $HAL_PKG_ERRORS" >&5 +$as_echo "$as_me: $HAL_PKG_ERRORS" >&6;} + fi + +else + HAL_CFLAGS=$pkg_cv_HAL_CFLAGS + HAL_LIBS=$pkg_cv_HAL_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_HAL="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_HAL = xno; then + USE_HAL=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: halelements" >&5 +$as_echo "$as_me: *** These plugins will be built: halelements" >&6;} + fi +fi +if test x$USE_HAL = xyes; then + : + if test "xhalelements" != "x"; then + GST_PLUGINS_YES="\thalelements\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_HAL /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: halelements" >&5 +$as_echo "$as_me: *** These plugins will not be built: halelements" >&6;} + if test "xhalelements" != "x"; then + GST_PLUGINS_NO="\thalelements\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_HAL = xyes; then + USE_HAL_TRUE= + USE_HAL_FALSE='#' +else + USE_HAL_TRUE='#' + USE_HAL_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Jack ***" >&5 +$as_echo "$as_me: *** checking feature: Jack ***" >&6;} +if test "xjack" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: jack ***" >&5 +$as_echo "$as_me: *** for plug-ins: jack ***" >&6;} +fi +NOUSE= +if test "x$USE_JACK" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-jack was given. +if test "${enable_jack+set}" = set; then : + enableval=$enable_jack; case "${enableval}" in + yes) USE_JACK=yes;; + no) USE_JACK=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-jack" "$LINENO" 5 ;; + esac +else + USE_JACK=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_JACK="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** jack pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_JACK = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_JACK=no + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 +$as_echo_n "checking for JACK... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$JACK_CFLAGS"; then + pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack >= 0.99.10\""; } >&5 + ($PKG_CONFIG --exists --print-errors "jack >= 0.99.10") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "jack >= 0.99.10" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$JACK_LIBS"; then + pkg_cv_JACK_LIBS="$JACK_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack >= 0.99.10\""; } >&5 + ($PKG_CONFIG --exists --print-errors "jack >= 0.99.10") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "jack >= 0.99.10" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "jack >= 0.99.10"` + else + JACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "jack >= 0.99.10"` + fi + # Put the nasty error message in config.log where it belongs + echo "$JACK_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + HAVE_JACK="no" +elif test $pkg_failed = untried; then + HAVE_JACK="no" +else + JACK_CFLAGS=$pkg_cv_JACK_CFLAGS + JACK_LIBS=$pkg_cv_JACK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_JACK="yes" +fi + + + + + which="jack >= 0.120.1 jack < 1.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK_0_120_1" >&5 +$as_echo_n "checking for JACK_0_120_1... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$JACK_0_120_1_CFLAGS"; then + pkg_cv_JACK_0_120_1_CFLAGS="$JACK_0_120_1_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_JACK_0_120_1_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$JACK_0_120_1_LIBS"; then + pkg_cv_JACK_0_120_1_LIBS="$JACK_0_120_1_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_JACK_0_120_1_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + JACK_0_120_1_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + JACK_0_120_1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$JACK_0_120_1_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_JACK_0_120_1="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$JACK_0_120_1_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $JACK_0_120_1_PKG_ERRORS" >&5 +$as_echo "$as_me: $JACK_0_120_1_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_JACK_0_120_1="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$JACK_0_120_1_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $JACK_0_120_1_PKG_ERRORS" >&5 +$as_echo "$as_me: $JACK_0_120_1_PKG_ERRORS" >&6;} + fi + +else + JACK_0_120_1_CFLAGS=$pkg_cv_JACK_0_120_1_CFLAGS + JACK_0_120_1_LIBS=$pkg_cv_JACK_0_120_1_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_JACK_0_120_1="yes" + +fi + + + if test x$HAVE_JACK_0_120_1 = xyes; then + +$as_echo "#define HAVE_JACK_0_120_1 1" >>confdefs.h + + fi + + which="jack >= 1.9.7" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK_1_9_7" >&5 +$as_echo_n "checking for JACK_1_9_7... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$JACK_1_9_7_CFLAGS"; then + pkg_cv_JACK_1_9_7_CFLAGS="$JACK_1_9_7_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_JACK_1_9_7_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$JACK_1_9_7_LIBS"; then + pkg_cv_JACK_1_9_7_LIBS="$JACK_1_9_7_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_JACK_1_9_7_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + JACK_1_9_7_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + JACK_1_9_7_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$JACK_1_9_7_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_JACK_1_9_7="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$JACK_1_9_7_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $JACK_1_9_7_PKG_ERRORS" >&5 +$as_echo "$as_me: $JACK_1_9_7_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_JACK_1_9_7="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$JACK_1_9_7_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $JACK_1_9_7_PKG_ERRORS" >&5 +$as_echo "$as_me: $JACK_1_9_7_PKG_ERRORS" >&6;} + fi + +else + JACK_1_9_7_CFLAGS=$pkg_cv_JACK_1_9_7_CFLAGS + JACK_1_9_7_LIBS=$pkg_cv_JACK_1_9_7_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_JACK_1_9_7="yes" + +fi + + + if test x$HAVE_JACK_1_9_7 = xyes; then + +$as_echo "#define HAVE_JACK_1_9_7 1" >>confdefs.h + + fi + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_JACK = xno; then + USE_JACK=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: jack" >&5 +$as_echo "$as_me: *** These plugins will be built: jack" >&6;} + fi +fi +if test x$USE_JACK = xyes; then + : + if test "xjack" != "x"; then + GST_PLUGINS_YES="\tjack\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_JACK /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: jack" >&5 +$as_echo "$as_me: *** These plugins will not be built: jack" >&6;} + if test "xjack" != "x"; then + GST_PLUGINS_NO="\tjack\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_JACK = xyes; then + USE_JACK_TRUE= + USE_JACK_FALSE='#' +else + USE_JACK_TRUE='#' + USE_JACK_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: jpeg library ***" >&5 +$as_echo "$as_me: *** checking feature: jpeg library ***" >&6;} +if test "xjpeg" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: jpeg ***" >&5 +$as_echo "$as_me: *** for plug-ins: jpeg ***" >&6;} +fi +NOUSE= +if test "x$USE_JPEG" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-jpeg was given. +if test "${enable_jpeg+set}" = set; then : + enableval=$enable_jpeg; case "${enableval}" in + yes) USE_JPEG=yes;; + no) USE_JPEG=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-jpeg" "$LINENO" 5 ;; + esac +else + USE_JPEG=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_JPEG="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jpeg pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** jpeg pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_JPEG = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_JPEG=no + + +# Check whether --with-jpeg-mmx was given. +if test "${with_jpeg_mmx+set}" = set; then : + withval=$with_jpeg_mmx; +fi + + OLD_LIBS="$LIBS" + if test x$with_jpeg_mmx != x; then + LIBS="$LIBS -L$with_jpeg_mmx" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_set_defaults in -ljpeg-mmx" >&5 +$as_echo_n "checking for jpeg_set_defaults in -ljpeg-mmx... " >&6; } +if ${ac_cv_lib_jpeg_mmx_jpeg_set_defaults+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg-mmx $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char jpeg_set_defaults (); +int +main () +{ +return jpeg_set_defaults (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jpeg_mmx_jpeg_set_defaults=yes +else + ac_cv_lib_jpeg_mmx_jpeg_set_defaults=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_mmx_jpeg_set_defaults" >&5 +$as_echo "$ac_cv_lib_jpeg_mmx_jpeg_set_defaults" >&6; } +if test "x$ac_cv_lib_jpeg_mmx_jpeg_set_defaults" = xyes; then : + HAVE_JPEG="yes" +else + HAVE_JPEG="no" +fi + + JPEG_LIBS="$LIBS -ljpeg-mmx" + LIBS="$OLD_LIBS" + if test x$HAVE_JPEG != xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_set_defaults in -ljpeg" >&5 +$as_echo_n "checking for jpeg_set_defaults in -ljpeg... " >&6; } +if ${ac_cv_lib_jpeg_jpeg_set_defaults+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char jpeg_set_defaults (); +int +main () +{ +return jpeg_set_defaults (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jpeg_jpeg_set_defaults=yes +else + ac_cv_lib_jpeg_jpeg_set_defaults=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_set_defaults" >&5 +$as_echo "$ac_cv_lib_jpeg_jpeg_set_defaults" >&6; } +if test "x$ac_cv_lib_jpeg_jpeg_set_defaults" = xyes; then : + HAVE_JPEG="yes" +else + HAVE_JPEG="no" +fi + + JPEG_LIBS="-ljpeg" + fi + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_JPEG = xno; then + USE_JPEG=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: jpeg" >&5 +$as_echo "$as_me: *** These plugins will be built: jpeg" >&6;} + fi +fi +if test x$USE_JPEG = xyes; then + : + if test "xjpeg" != "x"; then + GST_PLUGINS_YES="\tjpeg\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_JPEG /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: jpeg" >&5 +$as_echo "$as_me: *** These plugins will not be built: jpeg" >&6;} + if test "xjpeg" != "x"; then + GST_PLUGINS_NO="\tjpeg\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_JPEG = xyes; then + USE_JPEG_TRUE= + USE_JPEG_FALSE='#' +else + USE_JPEG_TRUE='#' + USE_JPEG_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libcaca coloured ASCII art ***" >&5 +$as_echo "$as_me: *** checking feature: libcaca coloured ASCII art ***" >&6;} +if test "xcacasink" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: cacasink ***" >&5 +$as_echo "$as_me: *** for plug-ins: cacasink ***" >&6;} +fi +NOUSE= +if test "x$USE_LIBCACA" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-libcaca was given. +if test "${enable_libcaca+set}" = set; then : + enableval=$enable_libcaca; case "${enableval}" in + yes) USE_LIBCACA=yes;; + no) USE_LIBCACA=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-libcaca" "$LINENO" 5 ;; + esac +else + USE_LIBCACA=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_LIBCACA="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** cacasink pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** cacasink pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_LIBCACA = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_LIBCACA=no + + + which="caca" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCACA" >&5 +$as_echo_n "checking for LIBCACA... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$LIBCACA_CFLAGS"; then + pkg_cv_LIBCACA_CFLAGS="$LIBCACA_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBCACA_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$LIBCACA_LIBS"; then + pkg_cv_LIBCACA_LIBS="$LIBCACA_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBCACA_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBCACA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + LIBCACA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBCACA_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_LIBCACA="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$LIBCACA_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBCACA_PKG_ERRORS" >&5 +$as_echo "$as_me: $LIBCACA_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_LIBCACA="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$LIBCACA_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBCACA_PKG_ERRORS" >&5 +$as_echo "$as_me: $LIBCACA_PKG_ERRORS" >&6;} + fi + +else + LIBCACA_CFLAGS=$pkg_cv_LIBCACA_CFLAGS + LIBCACA_LIBS=$pkg_cv_LIBCACA_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_LIBCACA="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_LIBCACA = xno; then + USE_LIBCACA=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: cacasink" >&5 +$as_echo "$as_me: *** These plugins will be built: cacasink" >&6;} + fi +fi +if test x$USE_LIBCACA = xyes; then + : + if test "xcacasink" != "x"; then + GST_PLUGINS_YES="\tcacasink\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_LIBCACA /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: cacasink" >&5 +$as_echo "$as_me: *** These plugins will not be built: cacasink" >&6;} + if test "xcacasink" != "x"; then + GST_PLUGINS_NO="\tcacasink\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_LIBCACA = xyes; then + USE_LIBCACA_TRUE= + USE_LIBCACA_FALSE='#' +else + USE_LIBCACA_TRUE='#' + USE_LIBCACA_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libdv DV demuxer/decoder ***" >&5 +$as_echo "$as_me: *** checking feature: libdv DV demuxer/decoder ***" >&6;} +if test "xdv" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: dv ***" >&5 +$as_echo "$as_me: *** for plug-ins: dv ***" >&6;} +fi +NOUSE= +if test "x$USE_LIBDV" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-libdv was given. +if test "${enable_libdv+set}" = set; then : + enableval=$enable_libdv; case "${enableval}" in + yes) USE_LIBDV=yes;; + no) USE_LIBDV=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-libdv" "$LINENO" 5 ;; + esac +else + USE_LIBDV=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_LIBDV="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dv pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** dv pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_LIBDV = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_LIBDV=no + + + which="libdv >= 0.100" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBDV" >&5 +$as_echo_n "checking for LIBDV... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$LIBDV_CFLAGS"; then + pkg_cv_LIBDV_CFLAGS="$LIBDV_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBDV_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$LIBDV_LIBS"; then + pkg_cv_LIBDV_LIBS="$LIBDV_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBDV_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBDV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + LIBDV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBDV_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_LIBDV="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$LIBDV_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBDV_PKG_ERRORS" >&5 +$as_echo "$as_me: $LIBDV_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_LIBDV="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$LIBDV_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBDV_PKG_ERRORS" >&5 +$as_echo "$as_me: $LIBDV_PKG_ERRORS" >&6;} + fi + +else + LIBDV_CFLAGS=$pkg_cv_LIBDV_CFLAGS + LIBDV_LIBS=$pkg_cv_LIBDV_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_LIBDV="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_LIBDV = xno; then + USE_LIBDV=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: dv" >&5 +$as_echo "$as_me: *** These plugins will be built: dv" >&6;} + fi +fi +if test x$USE_LIBDV = xyes; then + : + if test "xdv" != "x"; then + GST_PLUGINS_YES="\tdv\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_LIBDV /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: dv" >&5 +$as_echo "$as_me: *** These plugins will not be built: dv" >&6;} + if test "xdv" != "x"; then + GST_PLUGINS_NO="\tdv\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_LIBDV = xyes; then + USE_LIBDV_TRUE= + USE_LIBDV_FALSE='#' +else + USE_LIBDV_TRUE='#' + USE_LIBDV_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Portable Network Graphics library ***" >&5 +$as_echo "$as_me: *** checking feature: Portable Network Graphics library ***" >&6;} +if test "xpng" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: png ***" >&5 +$as_echo "$as_me: *** for plug-ins: png ***" >&6;} +fi +NOUSE= +if test "x$USE_LIBPNG" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-libpng was given. +if test "${enable_libpng+set}" = set; then : + enableval=$enable_libpng; case "${enableval}" in + yes) USE_LIBPNG=yes;; + no) USE_LIBPNG=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-libpng" "$LINENO" 5 ;; + esac +else + USE_LIBPNG=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_LIBPNG="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** png pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** png pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_LIBPNG = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_LIBPNG=no + + + which="libpng >= 1.2" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBPNG" >&5 +$as_echo_n "checking for LIBPNG... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$LIBPNG_CFLAGS"; then + pkg_cv_LIBPNG_CFLAGS="$LIBPNG_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBPNG_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$LIBPNG_LIBS"; then + pkg_cv_LIBPNG_LIBS="$LIBPNG_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBPNG_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBPNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + LIBPNG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBPNG_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_LIBPNG="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$LIBPNG_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBPNG_PKG_ERRORS" >&5 +$as_echo "$as_me: $LIBPNG_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_LIBPNG="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$LIBPNG_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBPNG_PKG_ERRORS" >&5 +$as_echo "$as_me: $LIBPNG_PKG_ERRORS" >&6;} + fi + +else + LIBPNG_CFLAGS=$pkg_cv_LIBPNG_CFLAGS + LIBPNG_LIBS=$pkg_cv_LIBPNG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_LIBPNG="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_LIBPNG = xno; then + USE_LIBPNG=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: png" >&5 +$as_echo "$as_me: *** These plugins will be built: png" >&6;} + fi +fi +if test x$USE_LIBPNG = xyes; then + : + if test "xpng" != "x"; then + GST_PLUGINS_YES="\tpng\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_LIBPNG /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: png" >&5 +$as_echo "$as_me: *** These plugins will not be built: png" >&6;} + if test "xpng" != "x"; then + GST_PLUGINS_NO="\tpng\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_LIBPNG = xyes; then + USE_LIBPNG_TRUE= + USE_LIBPNG_FALSE='#' +else + USE_LIBPNG_TRUE='#' + USE_LIBPNG_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: pulseaudio plug-in ***" >&5 +$as_echo "$as_me: *** checking feature: pulseaudio plug-in ***" >&6;} +if test "xpulseaudio" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: pulseaudio ***" >&5 +$as_echo "$as_me: *** for plug-ins: pulseaudio ***" >&6;} +fi +NOUSE= +if test "x$USE_PULSE" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-pulse was given. +if test "${enable_pulse+set}" = set; then : + enableval=$enable_pulse; case "${enableval}" in + yes) USE_PULSE=yes;; + no) USE_PULSE=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-pulse" "$LINENO" 5 ;; + esac +else + USE_PULSE=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_PULSE="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pulseaudio pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** pulseaudio pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_PULSE = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_PULSE=no + + + for ac_header in process.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "process.h" "ac_cv_header_process_h" "$ac_includes_default" +if test "x$ac_cv_header_process_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PROCESS_H 1 +_ACEOF + +fi + +done + + + + which="libpulse >= 0.9.16" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSE" >&5 +$as_echo_n "checking for PULSE... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$PULSE_CFLAGS"; then + pkg_cv_PULSE_CFLAGS="$PULSE_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PULSE_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$PULSE_LIBS"; then + pkg_cv_PULSE_LIBS="$PULSE_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PULSE_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PULSE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + PULSE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$PULSE_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_PULSE="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$PULSE_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_PKG_ERRORS" >&5 +$as_echo "$as_me: $PULSE_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_PULSE="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$PULSE_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_PKG_ERRORS" >&5 +$as_echo "$as_me: $PULSE_PKG_ERRORS" >&6;} + fi + +else + PULSE_CFLAGS=$pkg_cv_PULSE_CFLAGS + PULSE_LIBS=$pkg_cv_PULSE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_PULSE="yes" + +fi + + + + which="libpulse >= 0.9.20" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSE_0_9_20" >&5 +$as_echo_n "checking for PULSE_0_9_20... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$PULSE_0_9_20_CFLAGS"; then + pkg_cv_PULSE_0_9_20_CFLAGS="$PULSE_0_9_20_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PULSE_0_9_20_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$PULSE_0_9_20_LIBS"; then + pkg_cv_PULSE_0_9_20_LIBS="$PULSE_0_9_20_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PULSE_0_9_20_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PULSE_0_9_20_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + PULSE_0_9_20_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$PULSE_0_9_20_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_PULSE_0_9_20="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$PULSE_0_9_20_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_0_9_20_PKG_ERRORS" >&5 +$as_echo "$as_me: $PULSE_0_9_20_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_PULSE_0_9_20="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$PULSE_0_9_20_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_0_9_20_PKG_ERRORS" >&5 +$as_echo "$as_me: $PULSE_0_9_20_PKG_ERRORS" >&6;} + fi + +else + PULSE_0_9_20_CFLAGS=$pkg_cv_PULSE_0_9_20_CFLAGS + PULSE_0_9_20_LIBS=$pkg_cv_PULSE_0_9_20_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_PULSE_0_9_20="yes" + +fi + + + if test x$HAVE_PULSE_0_9_20 = xyes; then + +$as_echo "#define HAVE_PULSE_0_9_20 1" >>confdefs.h + + fi + + which="libpulse >= 0.98" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSE_1_0" >&5 +$as_echo_n "checking for PULSE_1_0... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$PULSE_1_0_CFLAGS"; then + pkg_cv_PULSE_1_0_CFLAGS="$PULSE_1_0_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PULSE_1_0_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$PULSE_1_0_LIBS"; then + pkg_cv_PULSE_1_0_LIBS="$PULSE_1_0_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PULSE_1_0_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PULSE_1_0_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + PULSE_1_0_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$PULSE_1_0_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_PULSE_1_0="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$PULSE_1_0_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_1_0_PKG_ERRORS" >&5 +$as_echo "$as_me: $PULSE_1_0_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_PULSE_1_0="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$PULSE_1_0_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_1_0_PKG_ERRORS" >&5 +$as_echo "$as_me: $PULSE_1_0_PKG_ERRORS" >&6;} + fi + +else + PULSE_1_0_CFLAGS=$pkg_cv_PULSE_1_0_CFLAGS + PULSE_1_0_LIBS=$pkg_cv_PULSE_1_0_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_PULSE_1_0="yes" + +fi + + + if test x$HAVE_PULSE_1_0 = xyes; then + +$as_echo "#define HAVE_PULSE_1_0 1" >>confdefs.h + + fi + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_PULSE = xno; then + USE_PULSE=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: pulseaudio" >&5 +$as_echo "$as_me: *** These plugins will be built: pulseaudio" >&6;} + fi +fi +if test x$USE_PULSE = xyes; then + : + if test "xpulseaudio" != "x"; then + GST_PLUGINS_YES="\tpulseaudio\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_PULSE /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: pulseaudio" >&5 +$as_echo "$as_me: *** These plugins will not be built: pulseaudio" >&6;} + if test "xpulseaudio" != "x"; then + GST_PLUGINS_NO="\tpulseaudio\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_PULSE = xyes; then + USE_PULSE_TRUE= + USE_PULSE_FALSE='#' +else + USE_PULSE_TRUE='#' + USE_PULSE_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: raw1394 and avc1394 library ***" >&5 +$as_echo "$as_me: *** checking feature: raw1394 and avc1394 library ***" >&6;} +if test "x1394" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: 1394 ***" >&5 +$as_echo "$as_me: *** for plug-ins: 1394 ***" >&6;} +fi +NOUSE= +if test "x$USE_DV1394" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-dv1394 was given. +if test "${enable_dv1394+set}" = set; then : + enableval=$enable_dv1394; case "${enableval}" in + yes) USE_DV1394=yes;; + no) USE_DV1394=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-dv1394" "$LINENO" 5 ;; + esac +else + USE_DV1394=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_DV1394="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** 1394 pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** 1394 pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_DV1394 = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_DV1394=no + + + which="libraw1394 >= 2.0.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RAW1394" >&5 +$as_echo_n "checking for RAW1394... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$RAW1394_CFLAGS"; then + pkg_cv_RAW1394_CFLAGS="$RAW1394_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RAW1394_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$RAW1394_LIBS"; then + pkg_cv_RAW1394_LIBS="$RAW1394_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RAW1394_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + RAW1394_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + RAW1394_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$RAW1394_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_RAW1394="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$RAW1394_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $RAW1394_PKG_ERRORS" >&5 +$as_echo "$as_me: $RAW1394_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_RAW1394="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$RAW1394_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $RAW1394_PKG_ERRORS" >&5 +$as_echo "$as_me: $RAW1394_PKG_ERRORS" >&6;} + fi + +else + RAW1394_CFLAGS=$pkg_cv_RAW1394_CFLAGS + RAW1394_LIBS=$pkg_cv_RAW1394_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_RAW1394="yes" + +fi + + + + which="libiec61883 >= 1.0.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBIEC61883" >&5 +$as_echo_n "checking for LIBIEC61883... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$LIBIEC61883_CFLAGS"; then + pkg_cv_LIBIEC61883_CFLAGS="$LIBIEC61883_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBIEC61883_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$LIBIEC61883_LIBS"; then + pkg_cv_LIBIEC61883_LIBS="$LIBIEC61883_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBIEC61883_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBIEC61883_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + LIBIEC61883_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBIEC61883_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_LIBIEC61883="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$LIBIEC61883_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBIEC61883_PKG_ERRORS" >&5 +$as_echo "$as_me: $LIBIEC61883_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_LIBIEC61883="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$LIBIEC61883_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBIEC61883_PKG_ERRORS" >&5 +$as_echo "$as_me: $LIBIEC61883_PKG_ERRORS" >&6;} + fi + +else + LIBIEC61883_CFLAGS=$pkg_cv_LIBIEC61883_CFLAGS + LIBIEC61883_LIBS=$pkg_cv_LIBIEC61883_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_LIBIEC61883="yes" + +fi + + + if test x$HAVE_RAW1394 = xyes && \ + test x$HAVE_LIBIEC61883 = xyes; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for avc1394_send_command in -lavc1394" >&5 +$as_echo_n "checking for avc1394_send_command in -lavc1394... " >&6; } +if ${ac_cv_lib_avc1394_avc1394_send_command+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lavc1394 $RAW1394_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char avc1394_send_command (); +int +main () +{ +return avc1394_send_command (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_avc1394_avc1394_send_command=yes +else + ac_cv_lib_avc1394_avc1394_send_command=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avc1394_avc1394_send_command" >&5 +$as_echo "$ac_cv_lib_avc1394_avc1394_send_command" >&6; } +if test "x$ac_cv_lib_avc1394_avc1394_send_command" = xyes; then : + HAVE_AVC1394=yes +else + HAVE_AVC1394=no +fi + + if test "x$HAVE_AVC1394" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "libavc1394/avc1394.h" "ac_cv_header_libavc1394_avc1394_h" "$ac_includes_default" +if test "x$ac_cv_header_libavc1394_avc1394_h" = xyes; then : + : +else + HAVE_AVC1394=no +fi + + + if test "x$HAVE_AVC1394" = "xyes"; then + AVC1394_LIBS="-lavc1394" + else + : + fi + else + : + fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rom1394_free_directory in -lrom1394" >&5 +$as_echo_n "checking for rom1394_free_directory in -lrom1394... " >&6; } +if ${ac_cv_lib_rom1394_rom1394_free_directory+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrom1394 $RAW1394_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char rom1394_free_directory (); +int +main () +{ +return rom1394_free_directory (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rom1394_rom1394_free_directory=yes +else + ac_cv_lib_rom1394_rom1394_free_directory=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rom1394_rom1394_free_directory" >&5 +$as_echo "$ac_cv_lib_rom1394_rom1394_free_directory" >&6; } +if test "x$ac_cv_lib_rom1394_rom1394_free_directory" = xyes; then : + HAVE_ROM1394=yes +else + HAVE_ROM1394=no +fi + + if test "x$HAVE_ROM1394" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "libavc1394/rom1394.h" "ac_cv_header_libavc1394_rom1394_h" "$ac_includes_default" +if test "x$ac_cv_header_libavc1394_rom1394_h" = xyes; then : + : +else + HAVE_ROM1394=no +fi + + + if test "x$HAVE_ROM1394" = "xyes"; then + ROM1394_LIBS="-lrom1394" + else + : + fi + else + : + fi + + + + if test x$HAVE_AVC1394 = xyes && \ + test x$HAVE_AVC1394 = xyes && \ + test x$HAVE_ROM1394 = xyes; then + HAVE_DV1394=yes + DV1394_LIBS="$RAW1394_LIBS $AVC1394_LIBS $ROM1394_LIBS $LIBIEC61883_LIBS" + DV1394_CFLAGS="$RAW1394_CFLAGS $LIBIEC61883_CFLAGS -DHAVE_LIBIEC61883" + + + fi + else + if test x$HAVE_RAW1394 = xno; then + + which="libraw1394 >= 1.1.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RAW1394" >&5 +$as_echo_n "checking for RAW1394... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$RAW1394_CFLAGS"; then + pkg_cv_RAW1394_CFLAGS="$RAW1394_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RAW1394_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$RAW1394_LIBS"; then + pkg_cv_RAW1394_LIBS="$RAW1394_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_RAW1394_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + RAW1394_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + RAW1394_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$RAW1394_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_RAW1394="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$RAW1394_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $RAW1394_PKG_ERRORS" >&5 +$as_echo "$as_me: $RAW1394_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_RAW1394="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$RAW1394_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $RAW1394_PKG_ERRORS" >&5 +$as_echo "$as_me: $RAW1394_PKG_ERRORS" >&6;} + fi + +else + RAW1394_CFLAGS=$pkg_cv_RAW1394_CFLAGS + RAW1394_LIBS=$pkg_cv_RAW1394_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_RAW1394="yes" + +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for avc1394_send_command in -lavc1394" >&5 +$as_echo_n "checking for avc1394_send_command in -lavc1394... " >&6; } +if ${ac_cv_lib_avc1394_avc1394_send_command+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lavc1394 $RAW1394_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char avc1394_send_command (); +int +main () +{ +return avc1394_send_command (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_avc1394_avc1394_send_command=yes +else + ac_cv_lib_avc1394_avc1394_send_command=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avc1394_avc1394_send_command" >&5 +$as_echo "$ac_cv_lib_avc1394_avc1394_send_command" >&6; } +if test "x$ac_cv_lib_avc1394_avc1394_send_command" = xyes; then : + HAVE_AVC1394=yes +else + HAVE_AVC1394=no +fi + + if test "x$HAVE_AVC1394" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "libavc1394/avc1394.h" "ac_cv_header_libavc1394_avc1394_h" "$ac_includes_default" +if test "x$ac_cv_header_libavc1394_avc1394_h" = xyes; then : + : +else + HAVE_AVC1394=no +fi + + + if test "x$HAVE_AVC1394" = "xyes"; then + AVC1394_LIBS="-lavc1394" + else + : + fi + else + : + fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rom1394_free_directory in -lrom1394" >&5 +$as_echo_n "checking for rom1394_free_directory in -lrom1394... " >&6; } +if ${ac_cv_lib_rom1394_rom1394_free_directory+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrom1394 $RAW1394_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char rom1394_free_directory (); +int +main () +{ +return rom1394_free_directory (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rom1394_rom1394_free_directory=yes +else + ac_cv_lib_rom1394_rom1394_free_directory=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rom1394_rom1394_free_directory" >&5 +$as_echo "$ac_cv_lib_rom1394_rom1394_free_directory" >&6; } +if test "x$ac_cv_lib_rom1394_rom1394_free_directory" = xyes; then : + HAVE_ROM1394=yes +else + HAVE_ROM1394=no +fi + + if test "x$HAVE_ROM1394" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "libavc1394/rom1394.h" "ac_cv_header_libavc1394_rom1394_h" "$ac_includes_default" +if test "x$ac_cv_header_libavc1394_rom1394_h" = xyes; then : + : +else + HAVE_ROM1394=no +fi + + + if test "x$HAVE_ROM1394" = "xyes"; then + ROM1394_LIBS="-lrom1394" + else + : + fi + else + : + fi + + + + if test x$HAVE_RAW1394 = xyes && \ + test x$HAVE_AVC1394 = xyes && \ + test x$HAVE_ROM1394 = xyes; then + HAVE_DV1394=yes + DV1394_LIBS="$RAW1394_LIBS $AVC1394_LIBS $ROM1394_LIBS" + DV1394_CFLAGS="$RAW1394_CFLAGS" + if test x$HAVE_LIBIEC61883 = xyes; then + DV1394_CFLAGS="$RAW1394_CFLAGS $LIBIEC61883_CFLAGS -DHAVE_LIBIEC61883" + DV1394_LIBS="$DV1394_LIBS $LIBIEC61883_LIBS" + fi + + + fi + fi + fi + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_DV1394 = xno; then + USE_DV1394=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: 1394" >&5 +$as_echo "$as_me: *** These plugins will be built: 1394" >&6;} + fi +fi +if test x$USE_DV1394 = xyes; then + : + if test "x1394" != "x"; then + GST_PLUGINS_YES="\t1394\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_DV1394 /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: 1394" >&5 +$as_echo "$as_me: *** These plugins will not be built: 1394" >&6;} + if test "x1394" != "x"; then + GST_PLUGINS_NO="\t1394\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_DV1394 = xyes; then + USE_DV1394_TRUE= + USE_DV1394_FALSE='#' +else + USE_DV1394_TRUE='#' + USE_DV1394_FALSE= +fi + + + if test "x${HAVE_LIBIEC61883}" = xyes ; then + USE_LIBIEC61883_TRUE= + USE_LIBIEC61883_FALSE='#' +else + USE_LIBIEC61883_TRUE='#' + USE_LIBIEC61883_FALSE= +fi + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Shoutcast/Icecast client library ***" >&5 +$as_echo "$as_me: *** checking feature: Shoutcast/Icecast client library ***" >&6;} +if test "xshout2" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: shout2 ***" >&5 +$as_echo "$as_me: *** for plug-ins: shout2 ***" >&6;} +fi +NOUSE= +if test "x$USE_SHOUT2" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-shout2 was given. +if test "${enable_shout2+set}" = set; then : + enableval=$enable_shout2; case "${enableval}" in + yes) USE_SHOUT2=yes;; + no) USE_SHOUT2=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-shout2" "$LINENO" 5 ;; + esac +else + USE_SHOUT2=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_SHOUT2="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** shout2 pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** shout2 pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_SHOUT2 = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_SHOUT2=no + + + which="shout >= 2.0" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SHOUT2" >&5 +$as_echo_n "checking for SHOUT2... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$SHOUT2_CFLAGS"; then + pkg_cv_SHOUT2_CFLAGS="$SHOUT2_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SHOUT2_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$SHOUT2_LIBS"; then + pkg_cv_SHOUT2_LIBS="$SHOUT2_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SHOUT2_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SHOUT2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + SHOUT2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$SHOUT2_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_SHOUT2="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$SHOUT2_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $SHOUT2_PKG_ERRORS" >&5 +$as_echo "$as_me: $SHOUT2_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_SHOUT2="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$SHOUT2_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $SHOUT2_PKG_ERRORS" >&5 +$as_echo "$as_me: $SHOUT2_PKG_ERRORS" >&6;} + fi + +else + SHOUT2_CFLAGS=$pkg_cv_SHOUT2_CFLAGS + SHOUT2_LIBS=$pkg_cv_SHOUT2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_SHOUT2="yes" + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_SHOUT2 = xno; then + USE_SHOUT2=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: shout2" >&5 +$as_echo "$as_me: *** These plugins will be built: shout2" >&6;} + fi +fi +if test x$USE_SHOUT2 = xyes; then + : + if test "xshout2" != "x"; then + GST_PLUGINS_YES="\tshout2\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_SHOUT2 /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: shout2" >&5 +$as_echo "$as_me: *** These plugins will not be built: shout2" >&6;} + if test "xshout2" != "x"; then + GST_PLUGINS_NO="\tshout2\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_SHOUT2 = xyes; then + USE_SHOUT2_TRUE= + USE_SHOUT2_FALSE='#' +else + USE_SHOUT2_TRUE='#' + USE_SHOUT2_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: soup http client plugin (2.4) ***" >&5 +$as_echo "$as_me: *** checking feature: soup http client plugin (2.4) ***" >&6;} +if test "xsouphttpsrc" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: souphttpsrc ***" >&5 +$as_echo "$as_me: *** for plug-ins: souphttpsrc ***" >&6;} +fi +NOUSE= +if test "x$USE_SOUP" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-soup was given. +if test "${enable_soup+set}" = set; then : + enableval=$enable_soup; case "${enableval}" in + yes) USE_SOUP=yes;; + no) USE_SOUP=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-soup" "$LINENO" 5 ;; + esac +else + USE_SOUP=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_SOUP="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** souphttpsrc pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** souphttpsrc pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_SOUP = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_SOUP=no + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUP" >&5 +$as_echo_n "checking for SOUP... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$SOUP_CFLAGS"; then + pkg_cv_SOUP_CFLAGS="$SOUP_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-gnome-2.4 >= 2.3.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsoup-gnome-2.4 >= 2.3.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SOUP_CFLAGS=`$PKG_CONFIG --cflags "libsoup-gnome-2.4 >= 2.3.2" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$SOUP_LIBS"; then + pkg_cv_SOUP_LIBS="$SOUP_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-gnome-2.4 >= 2.3.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsoup-gnome-2.4 >= 2.3.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SOUP_LIBS=`$PKG_CONFIG --libs "libsoup-gnome-2.4 >= 2.3.2" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SOUP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libsoup-gnome-2.4 >= 2.3.2"` + else + SOUP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libsoup-gnome-2.4 >= 2.3.2"` + fi + # Put the nasty error message in config.log where it belongs + echo "$SOUP_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUP" >&5 +$as_echo_n "checking for SOUP... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$SOUP_CFLAGS"; then + pkg_cv_SOUP_CFLAGS="$SOUP_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.26\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.26") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SOUP_CFLAGS=`$PKG_CONFIG --cflags "libsoup-2.4 >= 2.26" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$SOUP_LIBS"; then + pkg_cv_SOUP_LIBS="$SOUP_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.26\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.26") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SOUP_LIBS=`$PKG_CONFIG --libs "libsoup-2.4 >= 2.26" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SOUP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libsoup-2.4 >= 2.26"` + else + SOUP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libsoup-2.4 >= 2.26"` + fi + # Put the nasty error message in config.log where it belongs + echo "$SOUP_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_SOUP="no" + +elif test $pkg_failed = untried; then + + HAVE_SOUP="no" + +else + SOUP_CFLAGS=$pkg_cv_SOUP_CFLAGS + SOUP_LIBS=$pkg_cv_SOUP_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_SOUP="yes" +fi + +elif test $pkg_failed = untried; then + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUP" >&5 +$as_echo_n "checking for SOUP... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$SOUP_CFLAGS"; then + pkg_cv_SOUP_CFLAGS="$SOUP_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.26\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.26") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SOUP_CFLAGS=`$PKG_CONFIG --cflags "libsoup-2.4 >= 2.26" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$SOUP_LIBS"; then + pkg_cv_SOUP_LIBS="$SOUP_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.26\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.26") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SOUP_LIBS=`$PKG_CONFIG --libs "libsoup-2.4 >= 2.26" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SOUP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libsoup-2.4 >= 2.26"` + else + SOUP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libsoup-2.4 >= 2.26"` + fi + # Put the nasty error message in config.log where it belongs + echo "$SOUP_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_SOUP="no" + +elif test $pkg_failed = untried; then + + HAVE_SOUP="no" + +else + SOUP_CFLAGS=$pkg_cv_SOUP_CFLAGS + SOUP_LIBS=$pkg_cv_SOUP_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_SOUP="yes" +fi + +else + SOUP_CFLAGS=$pkg_cv_SOUP_CFLAGS + SOUP_LIBS=$pkg_cv_SOUP_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_SOUP="yes" + +$as_echo "#define HAVE_LIBSOUP_GNOME 1" >>confdefs.h + + +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_SOUP = xno; then + USE_SOUP=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: souphttpsrc" >&5 +$as_echo "$as_me: *** These plugins will be built: souphttpsrc" >&6;} + fi +fi +if test x$USE_SOUP = xyes; then + : + if test "xsouphttpsrc" != "x"; then + GST_PLUGINS_YES="\tsouphttpsrc\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_SOUP /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: souphttpsrc" >&5 +$as_echo "$as_me: *** These plugins will not be built: souphttpsrc" >&6;} + if test "xsouphttpsrc" != "x"; then + GST_PLUGINS_NO="\tsouphttpsrc\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_SOUP = xyes; then + USE_SOUP_TRUE= + USE_SOUP_FALSE='#' +else + USE_SOUP_TRUE='#' + USE_SOUP_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: speex speech codec ***" >&5 +$as_echo "$as_me: *** checking feature: speex speech codec ***" >&6;} +if test "xspeex" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: speex ***" >&5 +$as_echo "$as_me: *** for plug-ins: speex ***" >&6;} +fi +NOUSE= +if test "x$USE_SPEEX" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-speex was given. +if test "${enable_speex+set}" = set; then : + enableval=$enable_speex; case "${enableval}" in + yes) USE_SPEEX=yes;; + no) USE_SPEEX=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-speex" "$LINENO" 5 ;; + esac +else + USE_SPEEX=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_SPEEX="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** speex pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** speex pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_SPEEX = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_SPEEX=no + + + which="speex >= 1.1.6" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SPEEX" >&5 +$as_echo_n "checking for SPEEX... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$SPEEX_CFLAGS"; then + pkg_cv_SPEEX_CFLAGS="$SPEEX_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SPEEX_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$SPEEX_LIBS"; then + pkg_cv_SPEEX_LIBS="$SPEEX_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SPEEX_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SPEEX_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + SPEEX_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$SPEEX_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_SPEEX="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$SPEEX_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $SPEEX_PKG_ERRORS" >&5 +$as_echo "$as_me: $SPEEX_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_SPEEX="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$SPEEX_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $SPEEX_PKG_ERRORS" >&5 +$as_echo "$as_me: $SPEEX_PKG_ERRORS" >&6;} + fi + +else + SPEEX_CFLAGS=$pkg_cv_SPEEX_CFLAGS + SPEEX_LIBS=$pkg_cv_SPEEX_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_SPEEX="yes" + +fi + + + if test $HAVE_SPEEX = no + then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for speex_bits_init in -lspeex" >&5 +$as_echo_n "checking for speex_bits_init in -lspeex... " >&6; } +if ${ac_cv_lib_speex_speex_bits_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lspeex $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char speex_bits_init (); +int +main () +{ +return speex_bits_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_speex_speex_bits_init=yes +else + ac_cv_lib_speex_speex_bits_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_speex_speex_bits_init" >&5 +$as_echo "$ac_cv_lib_speex_speex_bits_init" >&6; } +if test "x$ac_cv_lib_speex_speex_bits_init" = xyes; then : + HAVE_SPEEX=yes +else + HAVE_SPEEX=no +fi + + if test "x$HAVE_SPEEX" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "speex/speex.h" "ac_cv_header_speex_speex_h" "$ac_includes_default" +if test "x$ac_cv_header_speex_speex_h" = xyes; then : + : +else + HAVE_SPEEX=no +fi + + + if test "x$HAVE_SPEEX" = "xyes"; then + + ac_fn_c_check_header_mongrel "$LINENO" "speex/speex_jitter.h" "ac_cv_header_speex_speex_jitter_h" "$ac_includes_default" +if test "x$ac_cv_header_speex_speex_jitter_h" = xyes; then : + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for speex_encode_int in -lspeex" >&5 +$as_echo_n "checking for speex_encode_int in -lspeex... " >&6; } +if ${ac_cv_lib_speex_speex_encode_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lspeex $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char speex_encode_int (); +int +main () +{ +return speex_encode_int (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_speex_speex_encode_int=yes +else + ac_cv_lib_speex_speex_encode_int=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_speex_speex_encode_int" >&5 +$as_echo "$ac_cv_lib_speex_speex_encode_int" >&6; } +if test "x$ac_cv_lib_speex_speex_encode_int" = xyes; then : + HAVE_SPEEX=yes +else + HAVE_SPEEX=no +fi + + if test "x$HAVE_SPEEX" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "speex/speex.h" "ac_cv_header_speex_speex_h" "$ac_includes_default" +if test "x$ac_cv_header_speex_speex_h" = xyes; then : + : +else + HAVE_SPEEX=no +fi + + + if test "x$HAVE_SPEEX" = "xyes"; then + + HAVE_SPEEX="yes" + SPEEX_LIBS="-lspeex" + + + + else + + HAVE_SPEEX="no" + + fi + else + + HAVE_SPEEX="no" + + fi + + + + +else + + ac_fn_c_check_decl "$LINENO" "SPEEX_GET_LOOKAHEAD" "ac_cv_have_decl_SPEEX_GET_LOOKAHEAD" " +#include + +" +if test "x$ac_cv_have_decl_SPEEX_GET_LOOKAHEAD" = xyes; then : + + HAVE_SPEEX="yes" + SPEEX_LIBS="-lspeex" + + + + +cat >>confdefs.h <<_ACEOF +#define SPEEX_1_0 1 +_ACEOF + + +else + + HAVE_SPEEX="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: You need at least 1.0.4 to compile the speex plugin" >&5 +$as_echo "$as_me: You need at least 1.0.4 to compile the speex plugin" >&6;} + +fi + + +fi + + + + else + : + fi + else + : + fi + + + + fi + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_SPEEX = xno; then + USE_SPEEX=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: speex" >&5 +$as_echo "$as_me: *** These plugins will be built: speex" >&6;} + fi +fi +if test x$USE_SPEEX = xyes; then + : + if test "xspeex" != "x"; then + GST_PLUGINS_YES="\tspeex\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_SPEEX /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: speex" >&5 +$as_echo "$as_me: *** These plugins will not be built: speex" >&6;} + if test "xspeex" != "x"; then + GST_PLUGINS_NO="\tspeex\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_SPEEX = xyes; then + USE_SPEEX_TRUE= + USE_SPEEX_FALSE='#' +else + USE_SPEEX_TRUE='#' + USE_SPEEX_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: taglib tagging library ***" >&5 +$as_echo "$as_me: *** checking feature: taglib tagging library ***" >&6;} +if test "xtaglib" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: taglib ***" >&5 +$as_echo "$as_me: *** for plug-ins: taglib ***" >&6;} +fi +NOUSE= +if test "x$USE_TAGLIB" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-taglib was given. +if test "${enable_taglib+set}" = set; then : + enableval=$enable_taglib; case "${enableval}" in + yes) USE_TAGLIB=yes;; + no) USE_TAGLIB=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-taglib" "$LINENO" 5 ;; + esac +else + USE_TAGLIB=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_TAGLIB="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** taglib pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** taglib pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_TAGLIB = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_TAGLIB=no + + + which="taglib >= 1.5" + required="no" + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TAGLIB" >&5 +$as_echo_n "checking for TAGLIB... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$TAGLIB_CFLAGS"; then + pkg_cv_TAGLIB_CFLAGS="$TAGLIB_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_TAGLIB_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$TAGLIB_LIBS"; then + pkg_cv_TAGLIB_LIBS="$TAGLIB_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$which") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_TAGLIB_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + TAGLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` + else + TAGLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` + fi + # Put the nasty error message in config.log where it belongs + echo "$TAGLIB_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_TAGLIB="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$TAGLIB_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $TAGLIB_PKG_ERRORS" >&5 +$as_echo "$as_me: $TAGLIB_PKG_ERRORS" >&6;} + fi + +elif test $pkg_failed = untried; then + + HAVE_TAGLIB="no" + if test "x$required" = "xyes"; then + as_fn_error $? "$TAGLIB_PKG_ERRORS" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: $TAGLIB_PKG_ERRORS" >&5 +$as_echo "$as_me: $TAGLIB_PKG_ERRORS" >&6;} + fi + +else + TAGLIB_CFLAGS=$pkg_cv_TAGLIB_CFLAGS + TAGLIB_LIBS=$pkg_cv_TAGLIB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_TAGLIB="yes" + +fi + + + if test "x$HAVE_CXX" != "xyes"; then + USE_TAGLIB=false + { $as_echo "$as_me:${as_lineno-$LINENO}: Not building taglib plugin: no C++ compiler found" >&5 +$as_echo "$as_me: Not building taglib plugin: no C++ compiler found" >&6;} + else + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Wno-attributes" >&5 +$as_echo_n "checking to see if c++ compiler understands -Wno-attributes... " >&6; } + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -Wno-attributes" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + flag_ok=yes +else + flag_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + + TAGLIB_CXXFLAGS="$TAGLIB_CFLAGS -Wno-attributes" + + true + else + + TAGLIB_CXXFLAGS="$TAGLIB_CFLAGS" + + true + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 +$as_echo "$flag_ok" >&6; } + + + fi + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_TAGLIB = xno; then + USE_TAGLIB=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: taglib" >&5 +$as_echo "$as_me: *** These plugins will be built: taglib" >&6;} + fi +fi +if test x$USE_TAGLIB = xyes; then + : + if test "xtaglib" != "x"; then + GST_PLUGINS_YES="\ttaglib\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_TAGLIB /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: taglib" >&5 +$as_echo "$as_me: *** These plugins will not be built: taglib" >&6;} + if test "xtaglib" != "x"; then + GST_PLUGINS_NO="\ttaglib\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_TAGLIB = xyes; then + USE_TAGLIB_TRUE= + USE_TAGLIB_FALSE='#' +else + USE_TAGLIB_TRUE='#' + USE_TAGLIB_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: wavpack plug-in ***" >&5 +$as_echo "$as_me: *** checking feature: wavpack plug-in ***" >&6;} +if test "xwavpack" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: wavpack ***" >&5 +$as_echo "$as_me: *** for plug-ins: wavpack ***" >&6;} +fi +NOUSE= +if test "x$USE_WAVPACK" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-wavpack was given. +if test "${enable_wavpack+set}" = set; then : + enableval=$enable_wavpack; case "${enableval}" in + yes) USE_WAVPACK=yes;; + no) USE_WAVPACK=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-wavpack" "$LINENO" 5 ;; + esac +else + USE_WAVPACK=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_WAVPACK="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wavpack pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** wavpack pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_WAVPACK = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_WAVPACK=no + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAVPACK" >&5 +$as_echo_n "checking for WAVPACK... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$WAVPACK_CFLAGS"; then + pkg_cv_WAVPACK_CFLAGS="$WAVPACK_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.40.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "wavpack >= 4.40.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WAVPACK_CFLAGS=`$PKG_CONFIG --cflags "wavpack >= 4.40.0" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$WAVPACK_LIBS"; then + pkg_cv_WAVPACK_LIBS="$WAVPACK_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.40.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "wavpack >= 4.40.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WAVPACK_LIBS=`$PKG_CONFIG --libs "wavpack >= 4.40.0" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + WAVPACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wavpack >= 4.40.0"` + else + WAVPACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wavpack >= 4.40.0"` + fi + # Put the nasty error message in config.log where it belongs + echo "$WAVPACK_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAVPACK" >&5 +$as_echo_n "checking for WAVPACK... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$WAVPACK_CFLAGS"; then + pkg_cv_WAVPACK_CFLAGS="$WAVPACK_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.20\""; } >&5 + ($PKG_CONFIG --exists --print-errors "wavpack >= 4.20") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WAVPACK_CFLAGS=`$PKG_CONFIG --cflags "wavpack >= 4.20" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$WAVPACK_LIBS"; then + pkg_cv_WAVPACK_LIBS="$WAVPACK_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.20\""; } >&5 + ($PKG_CONFIG --exists --print-errors "wavpack >= 4.20") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WAVPACK_LIBS=`$PKG_CONFIG --libs "wavpack >= 4.20" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + WAVPACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wavpack >= 4.20"` + else + WAVPACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wavpack >= 4.20"` + fi + # Put the nasty error message in config.log where it belongs + echo "$WAVPACK_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_WAVPACK=no + +elif test $pkg_failed = untried; then + + HAVE_WAVPACK=no + +else + WAVPACK_CFLAGS=$pkg_cv_WAVPACK_CFLAGS + WAVPACK_LIBS=$pkg_cv_WAVPACK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_WAVPACK=yes + +$as_echo "#define WAVPACK_OLD_API 1" >>confdefs.h + + +fi + +elif test $pkg_failed = untried; then + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAVPACK" >&5 +$as_echo_n "checking for WAVPACK... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$WAVPACK_CFLAGS"; then + pkg_cv_WAVPACK_CFLAGS="$WAVPACK_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.20\""; } >&5 + ($PKG_CONFIG --exists --print-errors "wavpack >= 4.20") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WAVPACK_CFLAGS=`$PKG_CONFIG --cflags "wavpack >= 4.20" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$WAVPACK_LIBS"; then + pkg_cv_WAVPACK_LIBS="$WAVPACK_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.20\""; } >&5 + ($PKG_CONFIG --exists --print-errors "wavpack >= 4.20") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_WAVPACK_LIBS=`$PKG_CONFIG --libs "wavpack >= 4.20" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + WAVPACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wavpack >= 4.20"` + else + WAVPACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wavpack >= 4.20"` + fi + # Put the nasty error message in config.log where it belongs + echo "$WAVPACK_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + HAVE_WAVPACK=no + +elif test $pkg_failed = untried; then + + HAVE_WAVPACK=no + +else + WAVPACK_CFLAGS=$pkg_cv_WAVPACK_CFLAGS + WAVPACK_LIBS=$pkg_cv_WAVPACK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + HAVE_WAVPACK=yes + +$as_echo "#define WAVPACK_OLD_API 1" >>confdefs.h + + +fi + +else + WAVPACK_CFLAGS=$pkg_cv_WAVPACK_CFLAGS + WAVPACK_LIBS=$pkg_cv_WAVPACK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + HAVE_WAVPACK=yes +fi + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_WAVPACK = xno; then + USE_WAVPACK=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: wavpack" >&5 +$as_echo "$as_me: *** These plugins will be built: wavpack" >&6;} + fi +fi +if test x$USE_WAVPACK = xyes; then + : + if test "xwavpack" != "x"; then + GST_PLUGINS_YES="\twavpack\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_WAVPACK /**/" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: wavpack" >&5 +$as_echo "$as_me: *** These plugins will not be built: wavpack" >&6;} + if test "xwavpack" != "x"; then + GST_PLUGINS_NO="\twavpack\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_WAVPACK = xyes; then + USE_WAVPACK_TRUE= + USE_WAVPACK_FALSE='#' +else + USE_WAVPACK_TRUE='#' + USE_WAVPACK_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: zlib support for qtdemux/matroska ***" >&5 +$as_echo "$as_me: *** checking feature: zlib support for qtdemux/matroska ***" >&6;} +if test "x" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 +$as_echo "$as_me: *** for plug-ins: ***" >&6;} +fi +NOUSE= +if test "x$USE_ZLIB" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-zlib was given. +if test "${enable_zlib+set}" = set; then : + enableval=$enable_zlib; case "${enableval}" in + yes) USE_ZLIB=yes;; + no) USE_ZLIB=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-zlib" "$LINENO" 5 ;; + esac +else + USE_ZLIB=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_ZLIB="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_ZLIB = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_ZLIB=no + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uncompress in -lz" >&5 +$as_echo_n "checking for uncompress in -lz... " >&6; } +if ${ac_cv_lib_z_uncompress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char uncompress (); +int +main () +{ +return uncompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_uncompress=yes +else + ac_cv_lib_z_uncompress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_uncompress" >&5 +$as_echo "$ac_cv_lib_z_uncompress" >&6; } +if test "x$ac_cv_lib_z_uncompress" = xyes; then : + HAVE_ZLIB=yes +else + HAVE_ZLIB=no +fi + + if test "x$HAVE_ZLIB" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + : +else + HAVE_ZLIB=no +fi + + + if test "x$HAVE_ZLIB" = "xyes"; then + + HAVE_ZLIB="yes" + ZLIB_LIBS="-lz" + + + else + : + fi + else + : + fi + + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_ZLIB = xno; then + USE_ZLIB=no + else + : + fi +fi +if test x$USE_ZLIB = xyes; then + : + if test "x" != "x"; then + GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_ZLIB /**/" >>confdefs.h + +else + : + if test "x" != "x"; then + GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_ZLIB = xyes; then + USE_ZLIB_TRUE= + USE_ZLIB_FALSE='#' +else + USE_ZLIB_TRUE='#' + USE_ZLIB_FALSE= +fi + + + +echo +{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: bz2 library for matroska ***" >&5 +$as_echo "$as_me: *** checking feature: bz2 library for matroska ***" >&6;} +if test "x" != "x" +then + { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 +$as_echo "$as_me: *** for plug-ins: ***" >&6;} +fi +NOUSE= +if test "x$USE_BZ2" = "xno"; then + NOUSE="yes" +fi +# Check whether --enable-bz2 was given. +if test "${enable_bz2+set}" = set; then : + enableval=$enable_bz2; case "${enableval}" in + yes) USE_BZ2=yes;; + no) USE_BZ2=no;; + *) as_fn_error $? "bad value ${enableval} for --enable-bz2" "$LINENO" 5 ;; + esac +else + USE_BZ2=yes +fi + +if test "x$NOUSE" = "xyes"; then + USE_BZ2="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 +$as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} +fi +NOUSE= + + +if test x$USE_BZ2 = xyes; then + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_BZ2=no + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzCompress in -lbz2" >&5 +$as_echo_n "checking for BZ2_bzCompress in -lbz2... " >&6; } +if ${ac_cv_lib_bz2_BZ2_bzCompress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbz2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char BZ2_bzCompress (); +int +main () +{ +return BZ2_bzCompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bz2_BZ2_bzCompress=yes +else + ac_cv_lib_bz2_BZ2_bzCompress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzCompress" >&5 +$as_echo "$ac_cv_lib_bz2_BZ2_bzCompress" >&6; } +if test "x$ac_cv_lib_bz2_BZ2_bzCompress" = xyes; then : + HAVE_BZ2=yes +else + HAVE_BZ2=no +fi + + if test "x$HAVE_BZ2" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" +if test "x$ac_cv_header_bzlib_h" = xyes; then : + : +else + HAVE_BZ2=no +fi + + + if test "x$HAVE_BZ2" = "xyes"; then + BZ2_LIBS="-lbz2" + else + : + fi + else + : + fi + + + + + + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + if test x$HAVE_BZ2 = xno; then + USE_BZ2=no + else + : + fi +fi +if test x$USE_BZ2 = xyes; then + : + if test "x" != "x"; then + GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" + fi + +$as_echo "#define HAVE_BZ2 /**/" >>confdefs.h + +else + : + if test "x" != "x"; then + GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" + fi + : +fi + if test x$USE_BZ2 = xyes; then + USE_BZ2_TRUE= + USE_BZ2_FALSE='#' +else + USE_BZ2_TRUE='#' + USE_BZ2_FALSE= +fi + + + +else + + if false; then + USE_AALIB_TRUE= + USE_AALIB_FALSE='#' +else + USE_AALIB_TRUE='#' + USE_AALIB_FALSE= +fi + + if false; then + USE_ANNODEX_TRUE= + USE_ANNODEX_FALSE='#' +else + USE_ANNODEX_TRUE='#' + USE_ANNODEX_FALSE= +fi + + if false; then + USE_BZ2_TRUE= + USE_BZ2_FALSE='#' +else + USE_BZ2_TRUE='#' + USE_BZ2_FALSE= +fi + + if false; then + USE_CAIRO_TRUE= + USE_CAIRO_FALSE='#' +else + USE_CAIRO_TRUE='#' + USE_CAIRO_FALSE= +fi + + if false; then + USE_CAIRO_GOBJECT_TRUE= + USE_CAIRO_GOBJECT_FALSE='#' +else + USE_CAIRO_GOBJECT_TRUE='#' + USE_CAIRO_GOBJECT_FALSE= +fi + + if false; then + USE_DIRECTSOUND_TRUE= + USE_DIRECTSOUND_FALSE='#' +else + USE_DIRECTSOUND_TRUE='#' + USE_DIRECTSOUND_FALSE= +fi + + if false; then + USE_DV1394_TRUE= + USE_DV1394_FALSE='#' +else + USE_DV1394_TRUE='#' + USE_DV1394_FALSE= +fi + + if false; then + USE_ESD_TRUE= + USE_ESD_FALSE='#' +else + USE_ESD_TRUE='#' + USE_ESD_FALSE= +fi + + if false; then + USE_FLAC_TRUE= + USE_FLAC_FALSE='#' +else + USE_FLAC_TRUE='#' + USE_FLAC_FALSE= +fi + + if false; then + USE_GCONF_TRUE= + USE_GCONF_FALSE='#' +else + USE_GCONF_TRUE='#' + USE_GCONF_FALSE= +fi + + if false; then + USE_GCONFTOOL_TRUE= + USE_GCONFTOOL_FALSE='#' +else + USE_GCONFTOOL_TRUE='#' + USE_GCONFTOOL_FALSE= +fi + + if false; then + USE_GDK_PIXBUF_TRUE= + USE_GDK_PIXBUF_FALSE='#' +else + USE_GDK_PIXBUF_TRUE='#' + USE_GDK_PIXBUF_FALSE= +fi + + if false; then + USE_GST_V4L2_TRUE= + USE_GST_V4L2_FALSE='#' +else + USE_GST_V4L2_TRUE='#' + USE_GST_V4L2_FALSE= +fi + + if false; then + USE_HAL_TRUE= + USE_HAL_FALSE='#' +else + USE_HAL_TRUE='#' + USE_HAL_FALSE= +fi + + if false; then + USE_JACK_TRUE= + USE_JACK_FALSE='#' +else + USE_JACK_TRUE='#' + USE_JACK_FALSE= +fi + + if false; then + USE_JPEG_TRUE= + USE_JPEG_FALSE='#' +else + USE_JPEG_TRUE='#' + USE_JPEG_FALSE= +fi + + if false; then + USE_LIBCACA_TRUE= + USE_LIBCACA_FALSE='#' +else + USE_LIBCACA_TRUE='#' + USE_LIBCACA_FALSE= +fi + + if false; then + USE_LIBDV_TRUE= + USE_LIBDV_FALSE='#' +else + USE_LIBDV_TRUE='#' + USE_LIBDV_FALSE= +fi + + if false; then + USE_LIBIEC61883_TRUE= + USE_LIBIEC61883_FALSE='#' +else + USE_LIBIEC61883_TRUE='#' + USE_LIBIEC61883_FALSE= +fi + + if false; then + USE_LIBPNG_TRUE= + USE_LIBPNG_FALSE='#' +else + USE_LIBPNG_TRUE='#' + USE_LIBPNG_FALSE= +fi + + if false; then + USE_OSS_TRUE= + USE_OSS_FALSE='#' +else + USE_OSS_TRUE='#' + USE_OSS_FALSE= +fi + + if false; then + USE_OSS4_TRUE= + USE_OSS4_FALSE='#' +else + USE_OSS4_TRUE='#' + USE_OSS4_FALSE= +fi + + if false; then + USE_OSX_AUDIO_TRUE= + USE_OSX_AUDIO_FALSE='#' +else + USE_OSX_AUDIO_TRUE='#' + USE_OSX_AUDIO_FALSE= +fi + + if false; then + USE_OSX_VIDEO_TRUE= + USE_OSX_VIDEO_FALSE='#' +else + USE_OSX_VIDEO_TRUE='#' + USE_OSX_VIDEO_FALSE= +fi + + if false; then + USE_PULSE_TRUE= + USE_PULSE_FALSE='#' +else + USE_PULSE_TRUE='#' + USE_PULSE_FALSE= +fi + + if false; then + USE_SHOUT2_TRUE= + USE_SHOUT2_FALSE='#' +else + USE_SHOUT2_TRUE='#' + USE_SHOUT2_FALSE= +fi + + if false; then + USE_SOUP_TRUE= + USE_SOUP_FALSE='#' +else + USE_SOUP_TRUE='#' + USE_SOUP_FALSE= +fi + + if false; then + USE_SPEEX_TRUE= + USE_SPEEX_FALSE='#' +else + USE_SPEEX_TRUE='#' + USE_SPEEX_FALSE= +fi + + if false; then + USE_SUNAUDIO_TRUE= + USE_SUNAUDIO_FALSE='#' +else + USE_SUNAUDIO_TRUE='#' + USE_SUNAUDIO_FALSE= +fi + + if false; then + USE_TAGLIB_TRUE= + USE_TAGLIB_FALSE='#' +else + USE_TAGLIB_TRUE='#' + USE_TAGLIB_FALSE= +fi + + if false; then + USE_WAVPACK_TRUE= + USE_WAVPACK_FALSE='#' +else + USE_WAVPACK_TRUE='#' + USE_WAVPACK_FALSE= +fi + + if false; then + USE_X_TRUE= + USE_X_FALSE='#' +else + USE_X_TRUE='#' + USE_X_FALSE= +fi + + if false; then + USE_XSHM_TRUE= + USE_XSHM_FALSE='#' +else + USE_XSHM_TRUE='#' + USE_XSHM_FALSE= +fi + + if false; then + USE_XVIDEO_TRUE= + USE_XVIDEO_FALSE='#' +else + USE_XVIDEO_TRUE='#' + USE_XVIDEO_FALSE= +fi + + if false; then + USE_ZLIB_TRUE= + USE_ZLIB_FALSE='#' +else + USE_ZLIB_TRUE='#' + USE_ZLIB_FALSE= +fi + + +fi + + +if test "x$USE_DEBUG" = xyes; then + PROFILE_CFLAGS="-g" +fi + + +if test "x$PACKAGE_VERSION_NANO" = "x1"; then + DEPRECATED_CFLAGS="-DGST_DISABLE_DEPRECATED" +else + DEPRECATED_CFLAGS="" +fi + + +GST_OPTION_CFLAGS="\$(WARNING_CFLAGS) \$(ERROR_CFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)" +GST_OPTION_CXXFLAGS="\$(WARNING_CXXFLAGS) \$(ERROR_CXXFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)" + + + + + +GST_CXXFLAGS="-I\$(top_srcdir)/gst-libs $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)" +GST_CFLAGS="-I\$(top_srcdir)/gst-libs $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)" + + + + +GST_ALL_LDFLAGS="-no-undefined" + + +GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^_*gst_plugin_desc.*' $GST_ALL_LDFLAGS" + + + +ac_config_files="$ac_config_files Makefile gst/Makefile gst/alpha/Makefile gst/apetag/Makefile gst/audiofx/Makefile gst/audioparsers/Makefile gst/auparse/Makefile gst/autodetect/Makefile gst/avi/Makefile gst/cutter/Makefile gst/deinterlace/Makefile gst/debugutils/Makefile gst/effectv/Makefile gst/equalizer/Makefile gst/flv/Makefile gst/goom/Makefile gst/goom2k1/Makefile gst/id3demux/Makefile gst/icydemux/Makefile gst/imagefreeze/Makefile gst/interleave/Makefile gst/isomp4/Makefile gst/law/Makefile gst/level/Makefile gst/matroska/Makefile gst/monoscope/Makefile gst/multifile/Makefile gst/multipart/Makefile gst/replaygain/Makefile gst/rtp/Makefile gst/rtpmanager/Makefile gst/rtsp/Makefile gst/shapewipe/Makefile gst/smpte/Makefile gst/spectrum/Makefile gst/udp/Makefile gst/videobox/Makefile gst/videocrop/Makefile gst/videofilter/Makefile gst/videomixer/Makefile gst/wavenc/Makefile gst/wavparse/Makefile gst/flx/Makefile gst/y4m/Makefile ext/Makefile ext/aalib/Makefile ext/annodex/Makefile ext/cairo/Makefile ext/dv/Makefile ext/esd/Makefile ext/flac/Makefile ext/gconf/Makefile ext/gdk_pixbuf/Makefile ext/hal/Makefile ext/jack/Makefile ext/jpeg/Makefile ext/libcaca/Makefile ext/libpng/Makefile ext/pulse/Makefile ext/raw1394/Makefile ext/shout2/Makefile ext/soup/Makefile ext/speex/Makefile ext/taglib/Makefile ext/wavpack/Makefile sys/Makefile sys/directsound/Makefile sys/oss/Makefile sys/oss4/Makefile sys/osxaudio/Makefile sys/osxvideo/Makefile sys/sunaudio/Makefile sys/v4l2/Makefile sys/waveform/Makefile sys/ximage/Makefile po/Makefile.in tests/Makefile tests/check/Makefile tests/examples/Makefile tests/examples/audiofx/Makefile tests/examples/cairo/Makefile tests/examples/equalizer/Makefile tests/examples/jack/Makefile tests/examples/level/Makefile tests/examples/pulse/Makefile tests/examples/rtp/Makefile tests/examples/shapewipe/Makefile tests/examples/spectrum/Makefile tests/examples/v4l2/Makefile tests/files/Makefile tests/icles/Makefile gconf/Makefile gconf/gstreamer.schemas common/Makefile common/m4/Makefile m4/Makefile docs/Makefile docs/plugins/Makefile docs/version.entities pkgconfig/Makefile pkgconfig/gstreamer-plugins-good-uninstalled.pc gst-plugins-good.spec" + + +sed \ + -e 's/.*config.h.in.*autoheader.*/\/* Autogenerated config.h created for win32 Visual Studio builds *\/\n\n\/* PREFIX -- specifically added for Windows for easier moving *\/\n#define PREFIX "C:\\\\gstreamer"\n\n#define GST_INSTALL_PLUGINS_HELPER PREFIX "\\\\libexec\\\\gst-install-plugins-helper.exe"/' \ + -e 's/.* GETTEXT_PACKAGE$/#define GETTEXT_PACKAGE "'$GETTEXT_PACKAGE'"/' \ + -e 's/.* GST_DATADIR$/#define GST_DATADIR PREFIX "\\\\share"/' \ + -e 's/.* GST_LEVEL_DEFAULT$/#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR/' \ + -e 's/.* GST_LICENSE$/#define GST_LICENSE "'$GST_LICENSE'"/' \ + -e 's/.* GST_MAJORMINOR$/#define GST_MAJORMINOR "'$GST_MAJORMINOR'"/' \ + -e "s,.* GST_PACKAGE_NAME$,#define GST_PACKAGE_NAME \"${GST_PACKAGE_NAME}\"," \ + -e 's/.* GST_PACKAGE_ORIGIN$/#define GST_PACKAGE_ORIGIN "Unknown package origin"/' \ + -e "s,.* GST_PACKAGE_RELEASE_DATETIME$,#define GST_PACKAGE_RELEASE_DATETIME \"${GST_PACKAGE_RELEASE_DATETIME}\"," \ + -e 's/.* HAVE_CPU_I386$/#define HAVE_CPU_I386 1/' \ + -e 's/.* HAVE_FGETPOS$/#define HAVE_FGETPOS 1/' \ + -e 's/.* HAVE_FSETPOS$/#define HAVE_FSETPOS 1/' \ + -e 's/.* HAVE_LIBXML2$/#define HAVE_LIBXML2 1/' \ + -e 's/.* HAVE_PROCESS_H$/#define HAVE_PROCESS_H 1/' \ + -e 's/.* HAVE_STDLIB_H$/#define HAVE_STDLIB_H 1/' \ + -e 's/.* HAVE_STRING_H$/#define HAVE_STRING_H 1/' \ + -e 's/.* HAVE_SYS_STAT_H$/#define HAVE_SYS_STAT_H 1/' \ + -e 's/.* HAVE_SYS_TYPES_H$/#define HAVE_SYS_TYPES_H 1/' \ + -e 's/.* HAVE_WIN32$/#define HAVE_WIN32 1/' \ + -e 's/.* HAVE_WINSOCK2_H$/#define HAVE_WINSOCK2_H 1/' \ + -e 's/.* HOST_CPU$/#define HOST_CPU "i686"/' \ + -e 's/.* LIBDIR$/#ifdef _DEBUG\n# define LIBDIR PREFIX "\\\\debug\\\\lib"\n#else\n# define LIBDIR PREFIX "\\\\lib"\n#endif/' \ + -e 's/.* LOCALEDIR$/#define LOCALEDIR PREFIX "\\\\share\\\\locale"/' \ + -e "s/.* PACKAGE$/#define PACKAGE \"$PACKAGE\"/" \ + -e 's/.* PACKAGE_BUGREPORT$/#define PACKAGE_BUGREPORT "http:\/\/bugzilla.gnome.org\/enter_bug.cgi?product=GStreamer"/' \ + -e "s/.* PACKAGE_NAME$/#define PACKAGE_NAME \"$PACKAGE_NAME\"/" \ + -e "s/.* PACKAGE_STRING$/#define PACKAGE_STRING \"$PACKAGE_STRING\"/" \ + -e 's/.* PACKAGE_TARNAME$/#define PACKAGE_TARNAME "'$PACKAGE_TARNAME'"/' \ + -e 's/.* PACKAGE_VERSION$/#define PACKAGE_VERSION "'$PACKAGE_VERSION'"/' \ + -e 's/.* PLUGINDIR$/#ifdef _DEBUG\n# define PLUGINDIR PREFIX "\\\\debug\\\\lib\\\\gstreamer-0.10"\n#else\n# define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.10"\n#endif/' \ + -e 's/.* USE_BINARY_REGISTRY$/#define USE_BINARY_REGISTRY/' \ + -e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \ + -e "s/.* DEFAULT_AUDIOSINK$/#define DEFAULT_AUDIOSINK \"directsoundsink\"/" \ + -e "s/.* DEFAULT_AUDIOSRC$/#define DEFAULT_AUDIOSRC \"audiotestsrc\"/" \ + -e "s/.* DEFAULT_VIDEOSRC$/#define DEFAULT_VIDEOSRC \"videotestsrc\"/" \ + -e "s/.* DEFAULT_VISUALIZER$/#define DEFAULT_VISUALIZER \"goom\"/" \ + config.h.in >win32/common/config.h-new + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GST_GCOV_ENABLED_TRUE}" && test -z "${GST_GCOV_ENABLED_FALSE}"; then + as_fn_error $? "conditional \"GST_GCOV_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then + as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_EXTERNAL_TRUE}" && test -z "${USE_EXTERNAL_FALSE}"; then + as_fn_error $? "conditional \"USE_EXTERNAL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_EXTERNAL_TRUE}" && test -z "${BUILD_EXTERNAL_FALSE}"; then + as_fn_error $? "conditional \"BUILD_EXTERNAL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_EXPERIMENTAL_TRUE}" && test -z "${USE_EXPERIMENTAL_FALSE}"; then + as_fn_error $? "conditional \"USE_EXPERIMENTAL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_EXPERIMENTAL_TRUE}" && test -z "${BUILD_EXPERIMENTAL_FALSE}"; then + as_fn_error $? "conditional \"BUILD_EXPERIMENTAL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${HAVE_CPU_I386_TRUE}" && test -z "${HAVE_CPU_I386_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_I386\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_PPC_TRUE}" && test -z "${HAVE_CPU_PPC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_PPC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_PPC64_TRUE}" && test -z "${HAVE_CPU_PPC64_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_PPC64\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_ALPHA_TRUE}" && test -z "${HAVE_CPU_ALPHA_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_ALPHA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_ARM_TRUE}" && test -z "${HAVE_CPU_ARM_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_ARM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_SPARC_TRUE}" && test -z "${HAVE_CPU_SPARC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_SPARC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_HPPA_TRUE}" && test -z "${HAVE_CPU_HPPA_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_HPPA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_MIPS_TRUE}" && test -z "${HAVE_CPU_MIPS_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_MIPS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_S390_TRUE}" && test -z "${HAVE_CPU_S390_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_S390\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_IA64_TRUE}" && test -z "${HAVE_CPU_IA64_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_IA64\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_M68K_TRUE}" && test -z "${HAVE_CPU_M68K_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_M68K\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_X86_64_TRUE}" && test -z "${HAVE_CPU_X86_64_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_X86_64\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_CRIS_TRUE}" && test -z "${HAVE_CPU_CRIS_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_CRIS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CPU_CRISV32_TRUE}" && test -z "${HAVE_CPU_CRISV32_FALSE}"; then + as_fn_error $? "conditional \"HAVE_CPU_CRISV32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepOBJC_TRUE}" && test -z "${am__fastdepOBJC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepOBJC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepOBJC_TRUE}" && test -z "${am__fastdepOBJC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepOBJC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_VALGRIND_TRUE}" && test -z "${HAVE_VALGRIND_FALSE}"; then + as_fn_error $? "conditional \"HAVE_VALGRIND\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GCONF_SCHEMAS_INSTALL_TRUE}" && test -z "${GCONF_SCHEMAS_INSTALL_FALSE}"; then + as_fn_error $? "conditional \"GCONF_SCHEMAS_INSTALL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_PLUGIN_DOCS_TRUE}" && test -z "${ENABLE_PLUGIN_DOCS_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_PLUGIN_DOCS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_WINSOCK2_H_TRUE}" && test -z "${HAVE_WINSOCK2_H_FALSE}"; then + as_fn_error $? "conditional \"HAVE_WINSOCK2_H\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GCC_ASM_TRUE}" && test -z "${HAVE_GCC_ASM_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GCC_ASM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GST_HAVE_MMAP_TRUE}" && test -z "${GST_HAVE_MMAP_FALSE}"; then + as_fn_error $? "conditional \"GST_HAVE_MMAP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_ORC_TRUE}" && test -z "${HAVE_ORC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_ORC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_ORCC_TRUE}" && test -z "${HAVE_ORCC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_ORCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GST_CHECK_TRUE}" && test -z "${HAVE_GST_CHECK_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GST_CHECK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GTK_TRUE}" && test -z "${HAVE_GTK_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GTK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GTK_X11_TRUE}" && test -z "${HAVE_GTK_X11_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GTK_X11\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_GCONFTOOL_TRUE}" && test -z "${USE_GCONFTOOL_FALSE}"; then + as_fn_error $? "conditional \"USE_GCONFTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_VIDEOFILTER_TRUE}" && test -z "${USE_PLUGIN_VIDEOFILTER_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_VIDEOFILTER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_ALPHA_TRUE}" && test -z "${USE_PLUGIN_ALPHA_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_ALPHA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_APETAG_TRUE}" && test -z "${USE_PLUGIN_APETAG_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_APETAG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_AUDIOFX_TRUE}" && test -z "${USE_PLUGIN_AUDIOFX_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_AUDIOFX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_AUDIOPARSERS_TRUE}" && test -z "${USE_PLUGIN_AUDIOPARSERS_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_AUDIOPARSERS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_AUPARSE_TRUE}" && test -z "${USE_PLUGIN_AUPARSE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_AUPARSE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_AUTODETECT_TRUE}" && test -z "${USE_PLUGIN_AUTODETECT_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_AUTODETECT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_AVI_TRUE}" && test -z "${USE_PLUGIN_AVI_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_AVI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_CUTTER_TRUE}" && test -z "${USE_PLUGIN_CUTTER_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_CUTTER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_DEBUGUTILS_TRUE}" && test -z "${USE_PLUGIN_DEBUGUTILS_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_DEBUGUTILS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_DEINTERLACE_TRUE}" && test -z "${USE_PLUGIN_DEINTERLACE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_DEINTERLACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_EFFECTV_TRUE}" && test -z "${USE_PLUGIN_EFFECTV_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_EFFECTV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_EQUALIZER_TRUE}" && test -z "${USE_PLUGIN_EQUALIZER_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_EQUALIZER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_FLV_TRUE}" && test -z "${USE_PLUGIN_FLV_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_FLV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_ID3DEMUX_TRUE}" && test -z "${USE_PLUGIN_ID3DEMUX_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_ID3DEMUX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_ICYDEMUX_TRUE}" && test -z "${USE_PLUGIN_ICYDEMUX_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_ICYDEMUX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_INTERLEAVE_TRUE}" && test -z "${USE_PLUGIN_INTERLEAVE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_INTERLEAVE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_FLX_TRUE}" && test -z "${USE_PLUGIN_FLX_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_FLX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_GOOM_TRUE}" && test -z "${USE_PLUGIN_GOOM_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_GOOM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_GOOM2K1_TRUE}" && test -z "${USE_PLUGIN_GOOM2K1_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_GOOM2K1\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_IMAGEFREEZE_TRUE}" && test -z "${USE_PLUGIN_IMAGEFREEZE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_IMAGEFREEZE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_ISOMP4_TRUE}" && test -z "${USE_PLUGIN_ISOMP4_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_ISOMP4\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_LAW_TRUE}" && test -z "${USE_PLUGIN_LAW_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_LAW\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_LEVEL_TRUE}" && test -z "${USE_PLUGIN_LEVEL_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_LEVEL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_MATROSKA_TRUE}" && test -z "${USE_PLUGIN_MATROSKA_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_MATROSKA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_MONOSCOPE_TRUE}" && test -z "${USE_PLUGIN_MONOSCOPE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_MONOSCOPE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_MULTIFILE_TRUE}" && test -z "${USE_PLUGIN_MULTIFILE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_MULTIFILE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_MULTIPART_TRUE}" && test -z "${USE_PLUGIN_MULTIPART_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_MULTIPART\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_REPLAYGAIN_TRUE}" && test -z "${USE_PLUGIN_REPLAYGAIN_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_REPLAYGAIN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_RTP_TRUE}" && test -z "${USE_PLUGIN_RTP_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_RTP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_RTPMANAGER_TRUE}" && test -z "${USE_PLUGIN_RTPMANAGER_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_RTPMANAGER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_RTSP_TRUE}" && test -z "${USE_PLUGIN_RTSP_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_RTSP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_SHAPEWIPE_TRUE}" && test -z "${USE_PLUGIN_SHAPEWIPE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_SHAPEWIPE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_SMPTE_TRUE}" && test -z "${USE_PLUGIN_SMPTE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_SMPTE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_SPECTRUM_TRUE}" && test -z "${USE_PLUGIN_SPECTRUM_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_SPECTRUM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_UDP_TRUE}" && test -z "${USE_PLUGIN_UDP_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_UDP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_VIDEOBOX_TRUE}" && test -z "${USE_PLUGIN_VIDEOBOX_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_VIDEOBOX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_VIDEOCROP_TRUE}" && test -z "${USE_PLUGIN_VIDEOCROP_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_VIDEOCROP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_VIDEOMIXER_TRUE}" && test -z "${USE_PLUGIN_VIDEOMIXER_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_VIDEOMIXER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_WAVENC_TRUE}" && test -z "${USE_PLUGIN_WAVENC_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_WAVENC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_WAVPARSE_TRUE}" && test -z "${USE_PLUGIN_WAVPARSE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_WAVPARSE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_Y4M_TRUE}" && test -z "${USE_PLUGIN_Y4M_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_Y4M\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_UDP_TRUE}" && test -z "${USE_PLUGIN_UDP_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_UDP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_RTSP_TRUE}" && test -z "${USE_PLUGIN_RTSP_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_RTSP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PLUGIN_MONOSCOPE_TRUE}" && test -z "${USE_PLUGIN_MONOSCOPE_FALSE}"; then + as_fn_error $? "conditional \"USE_PLUGIN_MONOSCOPE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_DIRECTSOUND_TRUE}" && test -z "${USE_DIRECTSOUND_FALSE}"; then + as_fn_error $? "conditional \"USE_DIRECTSOUND\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSS_TRUE}" && test -z "${USE_OSS_FALSE}"; then + as_fn_error $? "conditional \"USE_OSS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSS4_TRUE}" && test -z "${USE_OSS4_FALSE}"; then + as_fn_error $? "conditional \"USE_OSS4\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SUNAUDIO_TRUE}" && test -z "${USE_SUNAUDIO_FALSE}"; then + as_fn_error $? "conditional \"USE_SUNAUDIO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSX_AUDIO_TRUE}" && test -z "${USE_OSX_AUDIO_FALSE}"; then + as_fn_error $? "conditional \"USE_OSX_AUDIO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSX_VIDEO_TRUE}" && test -z "${USE_OSX_VIDEO_FALSE}"; then + as_fn_error $? "conditional \"USE_OSX_VIDEO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_GST_V4L2_TRUE}" && test -z "${USE_GST_V4L2_FALSE}"; then + as_fn_error $? "conditional \"USE_GST_V4L2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_X_TRUE}" && test -z "${USE_X_FALSE}"; then + as_fn_error $? "conditional \"USE_X\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_XSHM_TRUE}" && test -z "${USE_XSHM_FALSE}"; then + as_fn_error $? "conditional \"USE_XSHM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_XVIDEO_TRUE}" && test -z "${USE_XVIDEO_FALSE}"; then + as_fn_error $? "conditional \"USE_XVIDEO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_AALIB_TRUE}" && test -z "${USE_AALIB_FALSE}"; then + as_fn_error $? "conditional \"USE_AALIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_ANNODEX_TRUE}" && test -z "${USE_ANNODEX_FALSE}"; then + as_fn_error $? "conditional \"USE_ANNODEX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_CAIRO_TRUE}" && test -z "${USE_CAIRO_FALSE}"; then + as_fn_error $? "conditional \"USE_CAIRO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_CAIRO_GOBJECT_TRUE}" && test -z "${USE_CAIRO_GOBJECT_FALSE}"; then + as_fn_error $? "conditional \"USE_CAIRO_GOBJECT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_ESD_TRUE}" && test -z "${USE_ESD_FALSE}"; then + as_fn_error $? "conditional \"USE_ESD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_FLAC_TRUE}" && test -z "${USE_FLAC_FALSE}"; then + as_fn_error $? "conditional \"USE_FLAC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_GCONF_TRUE}" && test -z "${USE_GCONF_FALSE}"; then + as_fn_error $? "conditional \"USE_GCONF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_GDK_PIXBUF_TRUE}" && test -z "${USE_GDK_PIXBUF_FALSE}"; then + as_fn_error $? "conditional \"USE_GDK_PIXBUF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_HAL_TRUE}" && test -z "${USE_HAL_FALSE}"; then + as_fn_error $? "conditional \"USE_HAL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_JACK_TRUE}" && test -z "${USE_JACK_FALSE}"; then + as_fn_error $? "conditional \"USE_JACK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_JPEG_TRUE}" && test -z "${USE_JPEG_FALSE}"; then + as_fn_error $? "conditional \"USE_JPEG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBCACA_TRUE}" && test -z "${USE_LIBCACA_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBCACA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBDV_TRUE}" && test -z "${USE_LIBDV_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBDV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBPNG_TRUE}" && test -z "${USE_LIBPNG_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBPNG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PULSE_TRUE}" && test -z "${USE_PULSE_FALSE}"; then + as_fn_error $? "conditional \"USE_PULSE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_DV1394_TRUE}" && test -z "${USE_DV1394_FALSE}"; then + as_fn_error $? "conditional \"USE_DV1394\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBIEC61883_TRUE}" && test -z "${USE_LIBIEC61883_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBIEC61883\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SHOUT2_TRUE}" && test -z "${USE_SHOUT2_FALSE}"; then + as_fn_error $? "conditional \"USE_SHOUT2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SOUP_TRUE}" && test -z "${USE_SOUP_FALSE}"; then + as_fn_error $? "conditional \"USE_SOUP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SPEEX_TRUE}" && test -z "${USE_SPEEX_FALSE}"; then + as_fn_error $? "conditional \"USE_SPEEX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_TAGLIB_TRUE}" && test -z "${USE_TAGLIB_FALSE}"; then + as_fn_error $? "conditional \"USE_TAGLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_WAVPACK_TRUE}" && test -z "${USE_WAVPACK_FALSE}"; then + as_fn_error $? "conditional \"USE_WAVPACK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_ZLIB_TRUE}" && test -z "${USE_ZLIB_FALSE}"; then + as_fn_error $? "conditional \"USE_ZLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_BZ2_TRUE}" && test -z "${USE_BZ2_FALSE}"; then + as_fn_error $? "conditional \"USE_BZ2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_AALIB_TRUE}" && test -z "${USE_AALIB_FALSE}"; then + as_fn_error $? "conditional \"USE_AALIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_ANNODEX_TRUE}" && test -z "${USE_ANNODEX_FALSE}"; then + as_fn_error $? "conditional \"USE_ANNODEX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_BZ2_TRUE}" && test -z "${USE_BZ2_FALSE}"; then + as_fn_error $? "conditional \"USE_BZ2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_CAIRO_TRUE}" && test -z "${USE_CAIRO_FALSE}"; then + as_fn_error $? "conditional \"USE_CAIRO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_CAIRO_GOBJECT_TRUE}" && test -z "${USE_CAIRO_GOBJECT_FALSE}"; then + as_fn_error $? "conditional \"USE_CAIRO_GOBJECT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_DIRECTSOUND_TRUE}" && test -z "${USE_DIRECTSOUND_FALSE}"; then + as_fn_error $? "conditional \"USE_DIRECTSOUND\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_DV1394_TRUE}" && test -z "${USE_DV1394_FALSE}"; then + as_fn_error $? "conditional \"USE_DV1394\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_ESD_TRUE}" && test -z "${USE_ESD_FALSE}"; then + as_fn_error $? "conditional \"USE_ESD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_FLAC_TRUE}" && test -z "${USE_FLAC_FALSE}"; then + as_fn_error $? "conditional \"USE_FLAC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_GCONF_TRUE}" && test -z "${USE_GCONF_FALSE}"; then + as_fn_error $? "conditional \"USE_GCONF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_GCONFTOOL_TRUE}" && test -z "${USE_GCONFTOOL_FALSE}"; then + as_fn_error $? "conditional \"USE_GCONFTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_GDK_PIXBUF_TRUE}" && test -z "${USE_GDK_PIXBUF_FALSE}"; then + as_fn_error $? "conditional \"USE_GDK_PIXBUF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_GST_V4L2_TRUE}" && test -z "${USE_GST_V4L2_FALSE}"; then + as_fn_error $? "conditional \"USE_GST_V4L2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_HAL_TRUE}" && test -z "${USE_HAL_FALSE}"; then + as_fn_error $? "conditional \"USE_HAL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_JACK_TRUE}" && test -z "${USE_JACK_FALSE}"; then + as_fn_error $? "conditional \"USE_JACK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_JPEG_TRUE}" && test -z "${USE_JPEG_FALSE}"; then + as_fn_error $? "conditional \"USE_JPEG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBCACA_TRUE}" && test -z "${USE_LIBCACA_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBCACA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBDV_TRUE}" && test -z "${USE_LIBDV_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBDV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBIEC61883_TRUE}" && test -z "${USE_LIBIEC61883_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBIEC61883\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBPNG_TRUE}" && test -z "${USE_LIBPNG_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBPNG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSS_TRUE}" && test -z "${USE_OSS_FALSE}"; then + as_fn_error $? "conditional \"USE_OSS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSS4_TRUE}" && test -z "${USE_OSS4_FALSE}"; then + as_fn_error $? "conditional \"USE_OSS4\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSX_AUDIO_TRUE}" && test -z "${USE_OSX_AUDIO_FALSE}"; then + as_fn_error $? "conditional \"USE_OSX_AUDIO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSX_VIDEO_TRUE}" && test -z "${USE_OSX_VIDEO_FALSE}"; then + as_fn_error $? "conditional \"USE_OSX_VIDEO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_PULSE_TRUE}" && test -z "${USE_PULSE_FALSE}"; then + as_fn_error $? "conditional \"USE_PULSE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SHOUT2_TRUE}" && test -z "${USE_SHOUT2_FALSE}"; then + as_fn_error $? "conditional \"USE_SHOUT2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SOUP_TRUE}" && test -z "${USE_SOUP_FALSE}"; then + as_fn_error $? "conditional \"USE_SOUP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SPEEX_TRUE}" && test -z "${USE_SPEEX_FALSE}"; then + as_fn_error $? "conditional \"USE_SPEEX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SUNAUDIO_TRUE}" && test -z "${USE_SUNAUDIO_FALSE}"; then + as_fn_error $? "conditional \"USE_SUNAUDIO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_TAGLIB_TRUE}" && test -z "${USE_TAGLIB_FALSE}"; then + as_fn_error $? "conditional \"USE_TAGLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_WAVPACK_TRUE}" && test -z "${USE_WAVPACK_FALSE}"; then + as_fn_error $? "conditional \"USE_WAVPACK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_X_TRUE}" && test -z "${USE_X_FALSE}"; then + as_fn_error $? "conditional \"USE_X\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_XSHM_TRUE}" && test -z "${USE_XSHM_FALSE}"; then + as_fn_error $? "conditional \"USE_XSHM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_XVIDEO_TRUE}" && test -z "${USE_XVIDEO_FALSE}"; then + as_fn_error $? "conditional \"USE_XVIDEO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_ZLIB_TRUE}" && test -z "${USE_ZLIB_FALSE}"; then + as_fn_error $? "conditional \"USE_ZLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by GStreamer Good Plug-ins $as_me 0.10.31, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +GStreamer Good Plug-ins config.status 0.10.31 +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + +# variables for create stdint.h replacement +PACKAGE="$PACKAGE" +VERSION="$VERSION" +ac_stdint_h="$ac_stdint_h" +_ac_stdint_h=`$as_echo "_$PACKAGE-$ac_stdint_h" | $as_tr_cpp` +ac_cv_stdint_message="$ac_cv_stdint_message" +ac_cv_header_stdint_t="$ac_cv_header_stdint_t" +ac_cv_header_stdint_x="$ac_cv_header_stdint_x" +ac_cv_header_stdint_o="$ac_cv_header_stdint_o" +ac_cv_header_stdint_u="$ac_cv_header_stdint_u" +ac_cv_type_uint64_t="$ac_cv_type_uint64_t" +ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t" +ac_cv_char_data_model="$ac_cv_char_data_model" +ac_cv_long_data_model="$ac_cv_long_data_model" +ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t" +ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t" +ac_cv_type_intmax_t="$ac_cv_type_intmax_t" + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; + "$ac_stdint_h") CONFIG_COMMANDS="$CONFIG_COMMANDS $ac_stdint_h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "gst/Makefile") CONFIG_FILES="$CONFIG_FILES gst/Makefile" ;; + "gst/alpha/Makefile") CONFIG_FILES="$CONFIG_FILES gst/alpha/Makefile" ;; + "gst/apetag/Makefile") CONFIG_FILES="$CONFIG_FILES gst/apetag/Makefile" ;; + "gst/audiofx/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiofx/Makefile" ;; + "gst/audioparsers/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audioparsers/Makefile" ;; + "gst/auparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/auparse/Makefile" ;; + "gst/autodetect/Makefile") CONFIG_FILES="$CONFIG_FILES gst/autodetect/Makefile" ;; + "gst/avi/Makefile") CONFIG_FILES="$CONFIG_FILES gst/avi/Makefile" ;; + "gst/cutter/Makefile") CONFIG_FILES="$CONFIG_FILES gst/cutter/Makefile" ;; + "gst/deinterlace/Makefile") CONFIG_FILES="$CONFIG_FILES gst/deinterlace/Makefile" ;; + "gst/debugutils/Makefile") CONFIG_FILES="$CONFIG_FILES gst/debugutils/Makefile" ;; + "gst/effectv/Makefile") CONFIG_FILES="$CONFIG_FILES gst/effectv/Makefile" ;; + "gst/equalizer/Makefile") CONFIG_FILES="$CONFIG_FILES gst/equalizer/Makefile" ;; + "gst/flv/Makefile") CONFIG_FILES="$CONFIG_FILES gst/flv/Makefile" ;; + "gst/goom/Makefile") CONFIG_FILES="$CONFIG_FILES gst/goom/Makefile" ;; + "gst/goom2k1/Makefile") CONFIG_FILES="$CONFIG_FILES gst/goom2k1/Makefile" ;; + "gst/id3demux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/id3demux/Makefile" ;; + "gst/icydemux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/icydemux/Makefile" ;; + "gst/imagefreeze/Makefile") CONFIG_FILES="$CONFIG_FILES gst/imagefreeze/Makefile" ;; + "gst/interleave/Makefile") CONFIG_FILES="$CONFIG_FILES gst/interleave/Makefile" ;; + "gst/isomp4/Makefile") CONFIG_FILES="$CONFIG_FILES gst/isomp4/Makefile" ;; + "gst/law/Makefile") CONFIG_FILES="$CONFIG_FILES gst/law/Makefile" ;; + "gst/level/Makefile") CONFIG_FILES="$CONFIG_FILES gst/level/Makefile" ;; + "gst/matroska/Makefile") CONFIG_FILES="$CONFIG_FILES gst/matroska/Makefile" ;; + "gst/monoscope/Makefile") CONFIG_FILES="$CONFIG_FILES gst/monoscope/Makefile" ;; + "gst/multifile/Makefile") CONFIG_FILES="$CONFIG_FILES gst/multifile/Makefile" ;; + "gst/multipart/Makefile") CONFIG_FILES="$CONFIG_FILES gst/multipart/Makefile" ;; + "gst/replaygain/Makefile") CONFIG_FILES="$CONFIG_FILES gst/replaygain/Makefile" ;; + "gst/rtp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/rtp/Makefile" ;; + "gst/rtpmanager/Makefile") CONFIG_FILES="$CONFIG_FILES gst/rtpmanager/Makefile" ;; + "gst/rtsp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/rtsp/Makefile" ;; + "gst/shapewipe/Makefile") CONFIG_FILES="$CONFIG_FILES gst/shapewipe/Makefile" ;; + "gst/smpte/Makefile") CONFIG_FILES="$CONFIG_FILES gst/smpte/Makefile" ;; + "gst/spectrum/Makefile") CONFIG_FILES="$CONFIG_FILES gst/spectrum/Makefile" ;; + "gst/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/udp/Makefile" ;; + "gst/videobox/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videobox/Makefile" ;; + "gst/videocrop/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videocrop/Makefile" ;; + "gst/videofilter/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videofilter/Makefile" ;; + "gst/videomixer/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videomixer/Makefile" ;; + "gst/wavenc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/wavenc/Makefile" ;; + "gst/wavparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/wavparse/Makefile" ;; + "gst/flx/Makefile") CONFIG_FILES="$CONFIG_FILES gst/flx/Makefile" ;; + "gst/y4m/Makefile") CONFIG_FILES="$CONFIG_FILES gst/y4m/Makefile" ;; + "ext/Makefile") CONFIG_FILES="$CONFIG_FILES ext/Makefile" ;; + "ext/aalib/Makefile") CONFIG_FILES="$CONFIG_FILES ext/aalib/Makefile" ;; + "ext/annodex/Makefile") CONFIG_FILES="$CONFIG_FILES ext/annodex/Makefile" ;; + "ext/cairo/Makefile") CONFIG_FILES="$CONFIG_FILES ext/cairo/Makefile" ;; + "ext/dv/Makefile") CONFIG_FILES="$CONFIG_FILES ext/dv/Makefile" ;; + "ext/esd/Makefile") CONFIG_FILES="$CONFIG_FILES ext/esd/Makefile" ;; + "ext/flac/Makefile") CONFIG_FILES="$CONFIG_FILES ext/flac/Makefile" ;; + "ext/gconf/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gconf/Makefile" ;; + "ext/gdk_pixbuf/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gdk_pixbuf/Makefile" ;; + "ext/hal/Makefile") CONFIG_FILES="$CONFIG_FILES ext/hal/Makefile" ;; + "ext/jack/Makefile") CONFIG_FILES="$CONFIG_FILES ext/jack/Makefile" ;; + "ext/jpeg/Makefile") CONFIG_FILES="$CONFIG_FILES ext/jpeg/Makefile" ;; + "ext/libcaca/Makefile") CONFIG_FILES="$CONFIG_FILES ext/libcaca/Makefile" ;; + "ext/libpng/Makefile") CONFIG_FILES="$CONFIG_FILES ext/libpng/Makefile" ;; + "ext/pulse/Makefile") CONFIG_FILES="$CONFIG_FILES ext/pulse/Makefile" ;; + "ext/raw1394/Makefile") CONFIG_FILES="$CONFIG_FILES ext/raw1394/Makefile" ;; + "ext/shout2/Makefile") CONFIG_FILES="$CONFIG_FILES ext/shout2/Makefile" ;; + "ext/soup/Makefile") CONFIG_FILES="$CONFIG_FILES ext/soup/Makefile" ;; + "ext/speex/Makefile") CONFIG_FILES="$CONFIG_FILES ext/speex/Makefile" ;; + "ext/taglib/Makefile") CONFIG_FILES="$CONFIG_FILES ext/taglib/Makefile" ;; + "ext/wavpack/Makefile") CONFIG_FILES="$CONFIG_FILES ext/wavpack/Makefile" ;; + "sys/Makefile") CONFIG_FILES="$CONFIG_FILES sys/Makefile" ;; + "sys/directsound/Makefile") CONFIG_FILES="$CONFIG_FILES sys/directsound/Makefile" ;; + "sys/oss/Makefile") CONFIG_FILES="$CONFIG_FILES sys/oss/Makefile" ;; + "sys/oss4/Makefile") CONFIG_FILES="$CONFIG_FILES sys/oss4/Makefile" ;; + "sys/osxaudio/Makefile") CONFIG_FILES="$CONFIG_FILES sys/osxaudio/Makefile" ;; + "sys/osxvideo/Makefile") CONFIG_FILES="$CONFIG_FILES sys/osxvideo/Makefile" ;; + "sys/sunaudio/Makefile") CONFIG_FILES="$CONFIG_FILES sys/sunaudio/Makefile" ;; + "sys/v4l2/Makefile") CONFIG_FILES="$CONFIG_FILES sys/v4l2/Makefile" ;; + "sys/waveform/Makefile") CONFIG_FILES="$CONFIG_FILES sys/waveform/Makefile" ;; + "sys/ximage/Makefile") CONFIG_FILES="$CONFIG_FILES sys/ximage/Makefile" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "tests/check/Makefile") CONFIG_FILES="$CONFIG_FILES tests/check/Makefile" ;; + "tests/examples/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/Makefile" ;; + "tests/examples/audiofx/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/audiofx/Makefile" ;; + "tests/examples/cairo/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/cairo/Makefile" ;; + "tests/examples/equalizer/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/equalizer/Makefile" ;; + "tests/examples/jack/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/jack/Makefile" ;; + "tests/examples/level/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/level/Makefile" ;; + "tests/examples/pulse/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/pulse/Makefile" ;; + "tests/examples/rtp/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/rtp/Makefile" ;; + "tests/examples/shapewipe/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/shapewipe/Makefile" ;; + "tests/examples/spectrum/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/spectrum/Makefile" ;; + "tests/examples/v4l2/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/v4l2/Makefile" ;; + "tests/files/Makefile") CONFIG_FILES="$CONFIG_FILES tests/files/Makefile" ;; + "tests/icles/Makefile") CONFIG_FILES="$CONFIG_FILES tests/icles/Makefile" ;; + "gconf/Makefile") CONFIG_FILES="$CONFIG_FILES gconf/Makefile" ;; + "gconf/gstreamer.schemas") CONFIG_FILES="$CONFIG_FILES gconf/gstreamer.schemas" ;; + "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;; + "common/m4/Makefile") CONFIG_FILES="$CONFIG_FILES common/m4/Makefile" ;; + "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; + "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; + "docs/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES docs/plugins/Makefile" ;; + "docs/version.entities") CONFIG_FILES="$CONFIG_FILES docs/version.entities" ;; + "pkgconfig/Makefile") CONFIG_FILES="$CONFIG_FILES pkgconfig/Makefile" ;; + "pkgconfig/gstreamer-plugins-good-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-plugins-good-uninstalled.pc" ;; + "gst-plugins-good.spec") CONFIG_FILES="$CONFIG_FILES gst-plugins-good.spec" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + "po-directories":C) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done ;; + "$ac_stdint_h":C) +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_stdint_h : $_ac_stdint_h" >&5 +$as_echo "$as_me: creating $ac_stdint_h : $_ac_stdint_h" >&6;} +ac_stdint=$tmp/_stdint.h + +echo "#ifndef" $_ac_stdint_h >$ac_stdint +echo "#define" $_ac_stdint_h "1" >>$ac_stdint +echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint +echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint +echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint +if test "_$ac_cv_header_stdint_t" != "_" ; then +echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint +echo "#include " >>$ac_stdint +echo "#endif" >>$ac_stdint +echo "#endif" >>$ac_stdint +else + +cat >>$ac_stdint < +#else +#include + +/* .................... configured part ............................ */ + +STDINT_EOF + +echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint +if test "_$ac_cv_header_stdint_x" != "_" ; then + ac_header="$ac_cv_header_stdint_x" + echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint +fi + +echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint +if test "_$ac_cv_header_stdint_o" != "_" ; then + ac_header="$ac_cv_header_stdint_o" + echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint +fi + +echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint +if test "_$ac_cv_header_stdint_u" != "_" ; then + ac_header="$ac_cv_header_stdint_u" + echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint +fi + +echo "" >>$ac_stdint + +if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then + echo "#include <$ac_header>" >>$ac_stdint + echo "" >>$ac_stdint +fi fi + +echo "/* which 64bit typedef has been found */" >>$ac_stdint +if test "$ac_cv_type_uint64_t" = "yes" ; then +echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint +fi +if test "$ac_cv_type_u_int64_t" = "yes" ; then +echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint +fi +echo "" >>$ac_stdint + +echo "/* which type model has been detected */" >>$ac_stdint +if test "_$ac_cv_char_data_model" != "_" ; then +echo "#define _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint +echo "#define _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint +else +echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint +echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint +fi +echo "" >>$ac_stdint + +echo "/* whether int_least types were detected */" >>$ac_stdint +if test "$ac_cv_type_int_least32_t" = "yes"; then +echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint +fi +echo "/* whether int_fast types were detected */" >>$ac_stdint +if test "$ac_cv_type_int_fast32_t" = "yes"; then +echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint +fi +echo "/* whether intmax_t type was detected */" >>$ac_stdint +if test "$ac_cv_type_intmax_t" = "yes"; then +echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint +fi +echo "" >>$ac_stdint + + cat >>$ac_stdint <= 199901L +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef long long int64_t; +typedef unsigned long long uint64_t; + +#elif !defined __STRICT_ANSI__ +#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ +#define _HAVE_UINT64_T +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + +#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ +/* note: all ELF-systems seem to have loff-support which needs 64-bit */ +#if !defined _NO_LONGLONG +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef long long int64_t; +typedef unsigned long long uint64_t; +#endif + +#elif defined __alpha || (defined __mips && defined _ABIN32) +#if !defined _NO_LONGLONG +typedef long int64_t; +typedef unsigned long uint64_t; +#endif + /* compiler/cpu type to define int64_t */ +#endif +#endif +#endif + +#if defined _STDINT_HAVE_U_INT_TYPES +/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ +typedef u_int8_t uint8_t; +typedef u_int16_t uint16_t; +typedef u_int32_t uint32_t; + +/* glibc compatibility */ +#ifndef __int8_t_defined +#define __int8_t_defined +#endif +#endif + +#ifdef _STDINT_NEED_INT_MODEL_T +/* we must guess all the basic types. Apart from byte-adressable system, */ +/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ +/* (btw, those nibble-addressable systems are way off, or so we assume) */ + + +#if defined _STDINT_BYTE_MODEL +#if _STDINT_LONG_MODEL+0 == 242 +/* 2:4:2 = IP16 = a normal 16-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned long uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef long int32_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 +/* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ +/* 4:4:4 = ILP32 = a normal 32-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 +/* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ +/* 4:8:8 = LP64 = a normal 64-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +/* this system has a "long" of 64bit */ +#ifndef _HAVE_UINT64_T +#define _HAVE_UINT64_T +typedef unsigned long uint64_t; +typedef long int64_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 448 +/* LLP64 a 64-bit system derived from a 32-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +/* assuming the system has a "long long" */ +#ifndef _HAVE_UINT64_T +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef unsigned long long uint64_t; +typedef long long int64_t; +#endif +#else +#define _STDINT_NO_INT32_T +#endif +#else +#define _STDINT_NO_INT8_T +#define _STDINT_NO_INT32_T +#endif +#endif + +/* + * quote from SunOS-5.8 sys/inttypes.h: + * Use at your own risk. As of February 1996, the committee is squarely + * behind the fixed sized types; the "least" and "fast" types are still being + * discussed. The probability that the "fast" types may be removed before + * the standard is finalized is high enough that they are not currently + * implemented. + */ + +#if defined _STDINT_NEED_INT_LEAST_T +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +#ifdef _HAVE_UINT64_T +typedef int64_t int_least64_t; +#endif + +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +#ifdef _HAVE_UINT64_T +typedef uint64_t uint_least64_t; +#endif + /* least types */ +#endif + +#if defined _STDINT_NEED_INT_FAST_T +typedef int8_t int_fast8_t; +typedef int int_fast16_t; +typedef int32_t int_fast32_t; +#ifdef _HAVE_UINT64_T +typedef int64_t int_fast64_t; +#endif + +typedef uint8_t uint_fast8_t; +typedef unsigned uint_fast16_t; +typedef uint32_t uint_fast32_t; +#ifdef _HAVE_UINT64_T +typedef uint64_t uint_fast64_t; +#endif + /* fast types */ +#endif + +#ifdef _STDINT_NEED_INTMAX_T +#ifdef _HAVE_UINT64_T +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; +#else +typedef long intmax_t; +typedef unsigned long uintmax_t; +#endif +#endif + +#ifdef _STDINT_NEED_INTPTR_T +#ifndef __intptr_t_defined +#define __intptr_t_defined +/* we encourage using "long" to store pointer values, never use "int" ! */ +#if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 +typedef unsigned int uintptr_t; +typedef int intptr_t; +#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 +typedef unsigned long uintptr_t; +typedef long intptr_t; +#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T +typedef uint64_t uintptr_t; +typedef int64_t intptr_t; +#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ +typedef unsigned long uintptr_t; +typedef long intptr_t; +#endif +#endif +#endif + +/* The ISO C99 standard specifies that in C++ implementations these + should only be defined if explicitly requested. */ +#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS +#ifndef UINT32_C + +/* Signed. */ +# define INT8_C(c) c +# define INT16_C(c) c +# define INT32_C(c) c +# ifdef _HAVE_LONGLONG_UINT64_T +# define INT64_C(c) c ## L +# else +# define INT64_C(c) c ## LL +# endif + +/* Unsigned. */ +# define UINT8_C(c) c ## U +# define UINT16_C(c) c ## U +# define UINT32_C(c) c ## U +# ifdef _HAVE_LONGLONG_UINT64_T +# define UINT64_C(c) c ## UL +# else +# define UINT64_C(c) c ## ULL +# endif + +/* Maximal type. */ +# ifdef _HAVE_LONGLONG_UINT64_T +# define INTMAX_C(c) c ## L +# define UINTMAX_C(c) c ## UL +# else +# define INTMAX_C(c) c ## LL +# define UINTMAX_C(c) c ## ULL +# endif + + /* literalnumbers */ +#endif +#endif + +/* These limits are merily those of a two complement byte-oriented system */ + +/* Minimum of signed integral types. */ +# define INT8_MIN (-128) +# define INT16_MIN (-32767-1) +# define INT32_MIN (-2147483647-1) +# define INT64_MIN (-__INT64_C(9223372036854775807)-1) +/* Maximum of signed integral types. */ +# define INT8_MAX (127) +# define INT16_MAX (32767) +# define INT32_MAX (2147483647) +# define INT64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of unsigned integral types. */ +# define UINT8_MAX (255) +# define UINT16_MAX (65535) +# define UINT32_MAX (4294967295U) +# define UINT64_MAX (__UINT64_C(18446744073709551615)) + +/* Minimum of signed integral types having a minimum size. */ +# define INT_LEAST8_MIN INT8_MIN +# define INT_LEAST16_MIN INT16_MIN +# define INT_LEAST32_MIN INT32_MIN +# define INT_LEAST64_MIN INT64_MIN +/* Maximum of signed integral types having a minimum size. */ +# define INT_LEAST8_MAX INT8_MAX +# define INT_LEAST16_MAX INT16_MAX +# define INT_LEAST32_MAX INT32_MAX +# define INT_LEAST64_MAX INT64_MAX + +/* Maximum of unsigned integral types having a minimum size. */ +# define UINT_LEAST8_MAX UINT8_MAX +# define UINT_LEAST16_MAX UINT16_MAX +# define UINT_LEAST32_MAX UINT32_MAX +# define UINT_LEAST64_MAX UINT64_MAX + + /* shortcircuit*/ +#endif + /* once */ +#endif +#endif +STDINT_EOF +fi + if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_stdint_h is unchanged" >&5 +$as_echo "$as_me: $ac_stdint_h is unchanged" >&6;} + else + ac_dir=`$as_dirname -- "$ac_stdint_h" || +$as_expr X"$ac_stdint_h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_stdint_h" : 'X\(//\)[^/]' \| \ + X"$ac_stdint_h" : 'X\(//\)$' \| \ + X"$ac_stdint_h" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_stdint_h" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + rm -f $ac_stdint_h + mv $ac_stdint $ac_stdint_h + fi + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + + + +printf "configure: *** Plug-ins without external dependencies that will be built:\n" +( for i in $GST_PLUGINS_SELECTED; do printf '\t'$i'\n'; done ) | sort +printf "\n" + +printf "configure: *** Plug-ins without external dependencies that will NOT be built:\n" +( for i in $GST_PLUGINS_ALL; do + case " $GST_PLUGINS_SELECTED " in + *\ $i\ *) + ;; + *) + printf '\t'$i'\n' + ;; + esac + done ) | sort +printf "\n" + +if test "x$BUILD_EXTERNAL" = "xno"; then + printf "configure: *** No plug-ins with external dependencies will be built\n" +else + printf "configure: *** Plug-ins with dependencies that will be built:" + printf "$GST_PLUGINS_YES\n" | sort + printf "\n" + printf "configure: *** Plug-ins with dependencies that will NOT be built:" + printf "$GST_PLUGINS_NO\n" | sort + printf "\n" +fi + + + if test "$HAVE_ORC" = yes ; then + printf "configure: *** Orc acceleration enabled.\n" + else + if test "x$enable_orc" = "xno" ; then + printf "configure: *** Orc acceleration disabled by --disable-orc. Slower code paths\n" + printf " will be used.\n" + else + printf "configure: *** Orc acceleration disabled. Requires Orc >= $ORC_REQ, which was\n" + printf " not found. Slower code paths will be used.\n" + fi + fi + printf "\n" + + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..13a6745 --- /dev/null +++ b/configure.ac @@ -0,0 +1,1276 @@ +AC_PREREQ(2.60) + +dnl please read gstreamer/docs/random/autotools before changing this file + +dnl initialize autoconf +dnl releases only do -Wall, git and prerelease does -Werror too +dnl use a three digit version number for releases, and four for git/pre +AC_INIT(GStreamer Good Plug-ins, 0.10.31, + http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, + gst-plugins-good) + +AG_GST_INIT + +dnl initialize automake +AM_INIT_AUTOMAKE([-Wno-portability 1.10]) + +dnl define PACKAGE_VERSION_* variables +AS_VERSION + +dnl check if this is a release version +AS_NANO(GST_GIT="no", GST_GIT="yes") + +dnl can autoconf find the source ? +AC_CONFIG_SRCDIR([gst/law/alaw.c]) + +dnl define the output header for config +AM_CONFIG_HEADER([config.h]) + +dnl AM_MAINTAINER_MODE only provides the option to configure to enable it +AM_MAINTAINER_MODE + +dnl sets host_* variables +AC_CANONICAL_HOST + +dnl use pretty build output with automake >= 1.11 +m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])], + [AM_DEFAULT_VERBOSITY=1 + AC_SUBST(AM_DEFAULT_VERBOSITY)]) + +dnl our libraries and install dirs use major.minor as a version +GST_MAJORMINOR=$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR +dnl we override it here if we need to for the release candidate of new series +GST_MAJORMINOR=0.10 +AC_SUBST(GST_MAJORMINOR) + +AG_GST_LIBTOOL_PREPARE + +dnl FIXME: this macro doesn't actually work; +dnl the generated libtool script has no support for the listed tags. +dnl So this needs to be fixed first if we want to use this +dnl AS_LIBTOOL_TAGS + +AC_LIBTOOL_WIN32_DLL +AM_PROG_LIBTOOL + +dnl *** required versions of GStreamer stuff *** +GST_REQ=0.10.36 +GSTPB_REQ=0.10.36 + +dnl *** autotools stuff **** + +dnl allow for different autotools +AS_AUTOTOOLS_ALTERNATE + +dnl Add parameters for aclocal +AC_SUBST(ACLOCAL_AMFLAGS, "-I m4 -I common/m4") + +dnl set up gettext +dnl the version check needs to stay here because autopoint greps for it +AM_GNU_GETTEXT_VERSION([0.17]) +AM_GNU_GETTEXT([external]) +AG_GST_GETTEXT([gst-plugins-good-$GST_MAJORMINOR]) + +dnl *** check for arguments to configure *** + +AG_GST_ARG_DEBUG +AG_GST_ARG_PROFILING +AG_GST_ARG_VALGRIND +AG_GST_ARG_GCOV + +AG_GST_ARG_EXAMPLES + +AG_GST_ARG_WITH_PKG_CONFIG_PATH +AG_GST_ARG_WITH_PACKAGE_NAME +AG_GST_ARG_WITH_PACKAGE_ORIGIN + +AG_GST_ARG_WITH_PLUGINS + +AG_GST_ARG_ENABLE_EXTERNAL + +AG_GST_ARG_ENABLE_EXPERIMENTAL + +dnl *** checks for platform *** + +dnl * hardware/architecture * + +dnl common/m4/gst-arch.m4 +dnl check CPU type +AG_GST_ARCH + +dnl Determine endianness +AC_C_BIGENDIAN + +dnl *** checks for programs *** + +dnl find a compiler +AC_PROG_CC +AC_PROG_CC_STDC + +dnl determine c++ compiler +AC_PROG_CXX +dnl determine if c++ is available on this system +AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no) + +dnl determine c++ preprocessor +dnl FIXME: do we need this ? +AC_PROG_CXXCPP + +AS_PROG_OBJC + +dnl check if the compiler supports '-c' and '-o' options +AM_PROG_CC_C_O + +dnl find an assembler +AM_PROG_AS + +dnl check if the compiler supports do while(0) macros +AG_GST_CHECK_DOWHILE_MACROS + +AC_PATH_PROG(VALGRIND_PATH, valgrind, no) +AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno") + +dnl check for gconftool-2 +dnl this macro defines an am conditional, so it needs to be run always +AM_GCONF_SOURCE_2 + +dnl check for documentation tools +GTK_DOC_CHECK([1.3]) +AS_PATH_PYTHON([2.1]) +AG_GST_PLUGIN_DOCS([1.3],[2.1]) + +dnl *** checks for libraries *** + +dnl check for libm, for sin() +AC_CHECK_LIBM +AC_SUBST(LIBM) + +dnl *** checks for header files *** + +dnl check if we have ANSI C header files +AC_HEADER_STDC + +dnl used by ext/wavpack +AX_CREATE_STDINT_H + +dnl used in gst/rtp/gstasteriskh263.c +AC_CHECK_HEADERS([netinet/in.h]) +AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes) +AM_CONDITIONAL(HAVE_WINSOCK2_H, test "x$HAVE_WINSOCK2_H" = "xyes") + +dnl used in gst/udp +AC_CHECK_HEADERS([sys/time.h]) + +dnl *** checks for types/defines *** + +dnl Check for FIONREAD ioctl declaration. This check is needed +dnl for the UDP plugin to build on Solaris +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 *** + +LIBS_SAVE=$LIBS +LIBS="$LIBS $LIBM" +AC_CHECK_FUNCS(rint sinh cosh asinh fpclass) +LIBS=$LIBS_SAVE + +dnl Check whether isinf() is defined by math.h +AC_CACHE_CHECK([for isinf], ac_cv_have_isinf, + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[float f = 0.0; int i=isinf(f)]])],[ac_cv_have_isinf="yes"],[ac_cv_have_isinf="no"])) +if test "$ac_cv_have_isinf" = "yes" +then + AC_DEFINE(HAVE_ISINF, 1, [Define to 1 if you have the `isinf' function.]) +fi + +dnl Check for mmap (needed by electricfence plugin) +AC_FUNC_MMAP +AM_CONDITIONAL(GST_HAVE_MMAP, test "x$ac_cv_func_mmap_fixed_mapped" = "xyes") + +dnl Check for mmap (needed by electricfence plugin) + +AC_CHECK_TYPE([struct ip_mreqn], [ + AC_DEFINE(HAVE_IP_MREQN,, [Define if we have struct ip_mreqn])],, + [#include ]) + +dnl *** checks for dependency libraries *** + +dnl GLib is required +AG_GST_GLIB_CHECK([2.24]) +PKG_CHECK_MODULES(GIO, [ gio-2.0 >= 2.20 ], , AC_MSG_ERROR([gio is required])) + +dnl Orc +ORC_CHECK([0.4.11]) + +dnl checks for gstreamer +dnl uninstalled is selected preferentially -- see pkg-config(1) +AG_GST_CHECK_GST($GST_MAJORMINOR, [$GST_REQ], yes) +AG_GST_CHECK_GST_BASE($GST_MAJORMINOR, [$GST_REQ], yes) +AG_GST_CHECK_GST_GDP($GST_MAJORMINOR, [$GST_REQ], yes) +AG_GST_CHECK_GST_CONTROLLER($GST_MAJORMINOR, [$GST_REQ], yes) +AG_GST_CHECK_GST_CHECK($GST_MAJORMINOR, [$GST_REQ], no) +AG_GST_CHECK_GST_PLUGINS_BASE($GST_MAJORMINOR, [$GSTPB_REQ], yes) + +GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-$GST_MAJORMINOR` +if test -z $GST_TOOLS_DIR; then + AC_MSG_ERROR([no tools dir defined in GStreamer pkg-config file; core upgrade needed.]) +fi +AC_SUBST(GST_TOOLS_DIR) + +AC_MSG_NOTICE(Using GStreamer Core Plugins in $GST_PLUGINS_DIR) +AC_MSG_NOTICE(Using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR) + +AM_CONDITIONAL(HAVE_GST_CHECK, test "x$HAVE_GST_CHECK" = "xyes") + +dnl Check for documentation xrefs +GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" +GST_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-$GST_MAJORMINOR`" +GSTPB_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-plugins-base-$GST_MAJORMINOR`" +AC_SUBST(GLIB_PREFIX) +AC_SUBST(GST_PREFIX) +AC_SUBST(GSTPB_PREFIX) + +dnl GTK is optional and used in examples +HAVE_GTK=no +GTK2_REQ=2.14.0 +GTK3_REQ=2.91.3 +if test "x$BUILD_EXAMPLES" = "xyes"; then + AC_MSG_CHECKING([which gtk+ version to compile examples against (optional)]) + AC_ARG_WITH([gtk], + AC_HELP_STRING([--with-gtk=3.0|2.0], + [which gtk+ version to compile against (default: 2.0)]), + [case "$with_gtk" in + 2.0) GTK_REQ=$GTK2_REQ ;; + 3.0) GTK_REQ=$GTK3_REQ ;; + *) AC_MSG_ERROR([invalid gtk+ version specified]);; + esac], + [with_gtk=2.0 + GTK_REQ=$GTK2_REQ]) + AC_MSG_RESULT([$with_gtk (>= $GTK_REQ)]) + PKG_CHECK_MODULES(GTK, gtk+-$with_gtk >= $GTK_REQ, HAVE_GTK=yes, HAVE_GTK=no) + dnl some examples need gtk+-x11 + PKG_CHECK_MODULES(GTK_X11, gtk+-x11-$with_gtk >= $GTK_REQ, HAVE_GTK_X11=yes, HAVE_GTK_X11=no) + AC_SUBST(GTK_LIBS) + AC_SUBST(GTK_CFLAGS) +fi +AM_CONDITIONAL(HAVE_GTK, test "x$HAVE_GTK" = "xyes") +AM_CONDITIONAL(HAVE_GTK_X11, test "x$HAVE_GTK_X11" = "xyes") + +dnl should we install schemas ? +translit(dnm, m, l) AM_CONDITIONAL(USE_GCONFTOOL, true) +AG_GST_CHECK_FEATURE(GCONFTOOL, [GConf schemas], , [ + AC_PATH_PROG(GCONFTOOL, gconftool-2, no) + if test x$GCONFTOOL = xno; then + AC_MSG_WARN(Not installing GConf schemas) + HAVE_GCONFTOOL="no" + else + HAVE_GCONFTOOL="yes" + fi + AC_SUBST(HAVE_GCONFTOOL) +]) + +dnl use divx drm -------------------------------------------------------------------------- +AC_ARG_ENABLE(divx-drm, AC_HELP_STRING([--enable-divx-drm], [using divx drm]), + [ + case "${enableval}" in + yes) USE_DIVX_DRM=yes ;; + no) USE_DIVX_DRM=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-divx-drm) ;; + esac + ], + [USE_DIVX_DRM=no]) +AM_CONDITIONAL(USE_DIVX_DRM, test "x$USE_DIVX_DRM" = "xyes") + +dnl *** set variables based on configure arguments *** + +dnl set license and copyright notice +GST_LICENSE="LGPL" +AC_DEFINE_UNQUOTED(GST_LICENSE, "$GST_LICENSE", [GStreamer license]) +AC_SUBST(GST_LICENSE) + +dnl set location of plugin directory +AG_GST_SET_PLUGINDIR + +dnl set release date/time +AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO([$PACKAGE_VERSION_NANO], + ["${srcdir}/gst-plugins-good.doap"], + [$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO]) + +dnl define an ERROR_CFLAGS Makefile variable +dnl -Wundef: too many broken headers +if test "x$HAVE_OSX_VIDEO" != "xyes"; then + AG_GST_SET_ERROR_CFLAGS($GST_GIT, [ + -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls + -Wwrite-strings -Wold-style-definition -Waggregate-return + -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar + -Wnested-externs ]) +else + dnl work-around for us passing GST_CFLAGS to the ObjC-compiler, which + dnl doesn't understand all warning flags that the C compiler knows about + dnl (e.g. -Waddress) or causes problems with some flags (-Waggregate-return) + AG_GST_SET_ERROR_CFLAGS($GST_GIT, [ + -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls + -Wwrite-strings -Wold-style-definition + -Winit-self -Wmissing-include-dirs -Wno-multichar + -Wnested-externs ]) +fi + +dnl define an ERROR_CXXFLAGS Makefile variable +AG_GST_SET_ERROR_CXXFLAGS($GST_GIT, [ + -Wmissing-declarations -Wredundant-decls + -Wwrite-strings + -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar ]) + +dnl define correct level for debugging messages +AG_GST_SET_LEVEL_DEFAULT($GST_GIT) + +dnl used in examples +AG_GST_DEFAULT_ELEMENTS + +dnl *** plug-ins to include *** + +dnl these are all the gst plug-ins, compilable without additional libs +dnl videofilter is at the top because others depend on it +AG_GST_CHECK_PLUGIN(videofilter) +AG_GST_CHECK_PLUGIN(alpha) +AG_GST_CHECK_PLUGIN(apetag) +AG_GST_CHECK_PLUGIN(audiofx) +AG_GST_CHECK_PLUGIN(audioparsers) +AG_GST_CHECK_PLUGIN(auparse) +AG_GST_CHECK_PLUGIN(autodetect) +AG_GST_CHECK_PLUGIN(avi) +AG_GST_CHECK_PLUGIN(cutter) +AG_GST_CHECK_PLUGIN(debugutils) +AG_GST_CHECK_PLUGIN(deinterlace) +AG_GST_CHECK_PLUGIN(effectv) +AG_GST_CHECK_PLUGIN(equalizer) +AG_GST_CHECK_PLUGIN(flv) +AG_GST_CHECK_PLUGIN(id3demux) +AG_GST_CHECK_PLUGIN(icydemux) +AG_GST_CHECK_PLUGIN(interleave) +AG_GST_CHECK_PLUGIN(flx) +AG_GST_CHECK_PLUGIN(goom) +AG_GST_CHECK_PLUGIN(goom2k1) +AG_GST_CHECK_PLUGIN(imagefreeze) +AG_GST_CHECK_PLUGIN(isomp4) +AG_GST_CHECK_PLUGIN(law) +AG_GST_CHECK_PLUGIN(level) +AG_GST_CHECK_PLUGIN(matroska) +AG_GST_CHECK_PLUGIN(monoscope) +AG_GST_CHECK_PLUGIN(multifile) +AG_GST_CHECK_PLUGIN(multipart) +AG_GST_CHECK_PLUGIN(replaygain) +AG_GST_CHECK_PLUGIN(rtp) +AG_GST_CHECK_PLUGIN(rtpmanager) +AG_GST_CHECK_PLUGIN(rtsp) +AG_GST_CHECK_PLUGIN(shapewipe) +AG_GST_CHECK_PLUGIN(smpte) +AG_GST_CHECK_PLUGIN(spectrum) +AG_GST_CHECK_PLUGIN(udp) +AG_GST_CHECK_PLUGIN(videobox) +AG_GST_CHECK_PLUGIN(videocrop) +AG_GST_CHECK_PLUGIN(videomixer) +AG_GST_CHECK_PLUGIN(wavenc) +AG_GST_CHECK_PLUGIN(wavparse) +AG_GST_CHECK_PLUGIN(y4m) + +dnl *** checks for socket and nsl libraries *** +AC_CHECK_FUNC(socket,,[AC_CHECK_LIB(socket,socket)]) + +dnl disable gst plugins we might not be able to build on this +dnl platform: udp and rtsp (ugly but minimally invasive) +dnl FIXME: maybe move to sys +AC_CHECK_HEADERS([sys/socket.h], HAVE_SYS_SOCKET_H=yes) +AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes) + +if test "x$HAVE_SYS_SOCKET_H" != "xyes" -a "x$HAVE_WINSOCK2_H" != "xyes"; then + AG_GST_DISABLE_PLUGIN(udp) + AG_GST_DISABLE_PLUGIN(rtsp) +fi + +if test "x$HAVE_WINSOCK2_H" = "xyes"; then + WIN32_LIBS="-lws2_32" + AC_SUBST(WIN32_LIBS) +fi + +dnl disable experimental plug-ins +if test "x$BUILD_EXPERIMENTAL" != "xyes"; then + AG_GST_DISABLE_PLUGIN(monoscope) +fi + +dnl *** sys plug-ins *** + +echo +AC_MSG_NOTICE([Checking libraries for plugins in sys/]) +echo + +dnl DirectSound +translit(dnm, m, l) AM_CONDITIONAL(USE_DIRECTSOUND, true) +AG_GST_CHECK_FEATURE(DIRECTSOUND, [DirectSound plug-in], directsoundsink, [ + HAVE_DIRECTSOUND="no" + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + save_LIBS="$LIBS" + CFLAGS="$CFLAGS $DIRECTSOUND_CFLAGS" + LDFLAGS="$LDFLAGS $DIRECTSOUND_LDFLAGS" + LIBS="$LIBS -ldsound -ldxerr9 -luser32" + AC_MSG_CHECKING(for DirectSound LDFLAGS) + AC_LINK_IFELSE([ +#include +#include +#include + +int main () +{ + DXGetErrorString9 (0); + DirectSoundCreate(NULL, NULL, NULL); + + return 0; +} +], + [HAVE_DIRECTSOUND="yes"], + [HAVE_DIRECTSOUND="no"]) + AC_MSG_RESULT($HAVE_DIRECTSOUND) + CFLAGS=$save_CFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + + if test "x$HAVE_DIRECTSOUND" = "xyes"; then + dnl this is much more than we want + DIRECTSOUND_LIBS="-ldsound -ldxerr9 -luser32" + AC_SUBST(DIRECTSOUND_CFLAGS) + AC_SUBST(DIRECTSOUND_LDFLAGS) + AC_SUBST(DIRECTSOUND_LIBS) + fi + AC_SUBST(HAVE_DIRECTSOUND) +]) + +dnl *** OSS audio *** (Linux, *BSD) +translit(dnm, m, l) AM_CONDITIONAL(USE_OSS, true) +AG_GST_CHECK_FEATURE(OSS, [OSS audio], ossaudio, [ + HAVE_OSS="yes" +dnl Linux and newer BSD versions : + AC_CHECK_HEADER(sys/soundcard.h, [ + AC_DEFINE(HAVE_OSS_INCLUDE_IN_SYS,, [Define if OSS includes are in /sys/]) + ] , [ +dnl Some old BSD versions and also newer OpenBSD versions : + AC_CHECK_HEADER(soundcard.h, [ + AC_DEFINE(HAVE_OSS_INCLUDE_IN_ROOT,, [Define if OSS includes are in /]) + ], [ + dnl Some old BSD versions : + AC_CHECK_HEADER(machine/soundcard.h, [ + AC_DEFINE(HAVE_OSS_INCLUDE_IN_MACHINE,, + [Define if OSS includes are in /machine/]) + ], [ + HAVE_OSS="no" + ]) + ]) + ]) +]) + +dnl *** oss4 *** +translit(dnm, m, l) AM_CONDITIONAL(USE_OSS4, true) +AG_GST_CHECK_FEATURE(OSS4, [Open Sound System 4], oss4, [ + AC_MSG_CHECKING([Checking if we can build the OSS4 elements]) + AC_CHECK_HEADERS([fcntl.h sys/ioctl.h sys/stat.h sys/types.h], + [test -z "$OSS4_MISSING_HEADER" && HAVE_OSS4="yes"], + [OSS4_MISSING_HEADER="yes";HAVE_OSS4="no"]) +]) + +dnl *** Sun Audio *** +translit(dnm, m, l) AM_CONDITIONAL(USE_SUNAUDIO, true) +AG_GST_CHECK_FEATURE(SUNAUDIO, [Sun Audio], sunaudio, [ + AC_CHECK_HEADER(sys/audioio.h, HAVE_SUNAUDIO="yes", HAVE_SUNAUDIO="no") +]) + +dnl *** OSX Audio *** +translit(dnm, m, l) AM_CONDITIONAL(USE_OSX_AUDIO, true) +AG_GST_CHECK_FEATURE(OSX_AUDIO, [OSX audio], osxaudio, [ + AC_CHECK_HEADER(CoreAudio/CoreAudio.h, HAVE_OSX_AUDIO="yes", HAVE_OSX_AUDIO="no") +]) + +dnl *** OS X video *** +translit(dnm, m, l) AM_CONDITIONAL(USE_OSX_VIDEO, true) +HAVE_OSX_VIDEO="no" +AG_GST_CHECK_FEATURE(OSX_VIDEO, [OSX video], osxvideosink, [ + AC_CHECK_HEADER(OpenGL/gl.h, HAVE_OSX_VIDEO="yes", HAVE_OSX_VIDEO="no") +]) +dnl in case header OpenGL/gl.h is found on other platforms +case "$host" in + *-*darwin*) + dnl do nothing + ;; + *) + HAVE_OSX_VIDEO="no" + ;; +esac + + +dnl *** Video 4 Linux 2 *** +dnl for information about the header/define, see sys/v4l2/gstv4l2element.h +dnl renamed to GST_V4L2 because of some conflict with kernel headers +translit(dnm, m, l) AM_CONDITIONAL(USE_GST_V4L2, true) +AG_GST_CHECK_FEATURE(GST_V4L2, [Video 4 Linux 2], v4l2src, [ + AC_MSG_CHECKING([Checking for up to date v4l2 installation]) + AC_TRY_COMPILE([ +#include +#ifdef __sun /* Solaris */ +#include +#include +#else /* Linux */ +#include +#define _LINUX_TIME_H +#define __user +#include +#endif +#if defined(V4L2_MAJOR_VERSION) || defined(V4L2_MINOR_VERSION) +#error too early v4l2 version or no v4l2 at all +#endif + ], [ +return 0; + ], [ + HAVE_GST_V4L2="yes" + AC_MSG_RESULT(yes) + ], [ + HAVE_GST_V4L2="no" + AC_MSG_RESULT(no) + + HAVE_VIDEODEV=no + AC_CHECK_HEADER(linux/videodev2.h, [ HAVE_VIDEODEV=yes ], + [ + AC_CHECK_HEADER(sys/videodev2.h, [ HAVE_VIDEODEV=yes ]) + ]) + + if test "x$HAVE_VIDEODEV" = "xyes"; then + AC_MSG_WARN([video4linux2 headers were found, but they're old.]) + AC_MSG_WARN([Please update v4l2 to compile the v4l2 plugins]) + else + AC_MSG_WARN([video4linux2 was not found]) + fi + ]) + + if [ test x$HAVE_GST_V4L2 = xyes ]; then + dnl check for missing v4l2_buffer declaration (see #135919) + MISSING_DECL=0 + AC_MSG_CHECKING(struct v4l2_buffer declaration) + AC_TRY_COMPILE([ +#include +#ifdef __sun /* Solaris */ +#include +#include +#else /* Linux */ +#include +#define _LINUX_TIME_H +#define __user +#include +#endif + ],[ +struct v4l2_buffer buf; +buf.index = 0; +return 0; + ], [ AC_MSG_RESULT(yes) ], [ MISSING_DECL=1 && AC_MSG_RESULT(no) ]) + if [ test x$MISSING_DECL = x1 ]; then + AC_DEFINE(GST_V4L2_MISSING_BUFDECL, 1, [struct v4l2_buffer missing]) + fi + + dnl check for XOverlay libraries + AG_GST_CHECK_XV + fi +]) + +# Optional gudev for device probing +AC_ARG_WITH([gudev], + AC_HELP_STRING([--with-gudev], + [device detection with gudev]), + [], + [with_gudev=check]) +if test x$HAVE_GST_V4L2 = xyes; then + if test x$with_gudev != xno; then + PKG_CHECK_MODULES(GUDEV, [ gudev-1.0 >= 143 ], + [ have_gudev=yes + AC_DEFINE(HAVE_GUDEV, 1, + [Whether gudev is available for device detection]) + AC_DEFINE([G_UDEV_API_IS_SUBJECT_TO_CHANGE], 1, [I know the API is subject to change.]) + ], [ + have_gudev=no + ]) + else + have_gudev=no + fi +fi +AC_SUBST(GUDEV_CFLAGS) +AC_SUBST(GUDEV_LIBS) + +# Make libv4l2 non-automagic +AC_ARG_WITH([libv4l2], + AC_HELP_STRING([--with-libv4l2], + [support video buffer conversion using libv4l2]), + [], + [with_libv4l2=check]) +if test x$HAVE_GST_V4L2 = xyes; then + if test x$with_libv4l2 != xno; then + PKG_CHECK_MODULES(LIBV4L2, libv4l2, + [ have_libv4l2=yes + AC_DEFINE(HAVE_LIBV4L2, 1, + [Whether libv4l2 is available for video buffer conversion]) + ], [ + have_libv4l2=no + ]) + else + have_libv4l2=no + fi +fi + +dnl Check for X11 +translit(dnm, m, l) AM_CONDITIONAL(USE_X, true) +AG_GST_CHECK_FEATURE(X, [X libraries and plugins], + [ximagesrc], [ + AC_PATH_XTRA + + dnl now try to find the HEADER + ac_cflags_save="$CFLAGS" + ac_cppflags_save="$CPPFLAGS" + CFLAGS="$CFLAGS $X_CFLAGS" + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + AC_CHECK_HEADER(X11/Xlib.h, HAVE_X="yes", HAVE_X="no") + + if test "x$HAVE_X" = "xno" + then + AC_MSG_NOTICE([cannot find X11 development files]) + else + dnl this is much more than we want + X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS" + dnl AC_PATH_XTRA only defines the path needed to find the X libs, + dnl it does not add the libs; therefore we add them here + X_LIBS="$X_LIBS -lX11" + AC_SUBST(X_CFLAGS) + AC_SUBST(X_LIBS) + + dnl check for Xfixes + PKG_CHECK_MODULES(XFIXES, xfixes, HAVE_XFIXES="yes", HAVE_XFIXES="no") + if test "x$HAVE_XFIXES" = "xyes" + then + XFIXES_CFLAGS="-DHAVE_XFIXES $XFIXES_CFLAGS" + fi + AC_SUBST(XFIXES_LIBS) + AC_SUBST(XFIXES_CFLAGS) + + dnl check for Xdamage + PKG_CHECK_MODULES(XDAMAGE, xdamage, HAVE_XDAMAGE="yes", HAVE_XDAMAGE="no") + if test "x$HAVE_XDAMAGE" = "xyes" + then + XDAMAGE_CFLAGS="-DHAVE_XDAMAGE $XDAMAGE_CFLAGS" + fi + AC_SUBST(XDAMAGE_LIBS) + AC_SUBST(XDAMAGE_CFLAGS) + fi + AC_SUBST(HAVE_X) + CFLAGS="$ac_cflags_save" + CPPFLAGS="$ac_cppflags_save" +]) + +dnl FIXME: this should be rolled into the test above, it's just an additional +dnl feature of the ximagesrc plug-in +dnl This is the same as in gst-plugins-base +dnl check for X Shm +translit(dnm, m, l) AM_CONDITIONAL(USE_XSHM, true) +AG_GST_CHECK_FEATURE(XSHM, [X Shared Memory extension], , [ + if test x$HAVE_X = xyes; then + AC_CHECK_LIB(Xext, XShmAttach, + HAVE_XSHM="yes", HAVE_XSHM="no", + $X_LIBS) + if test "x$HAVE_XSHM" = "xyes"; then + XSHM_LIBS="-lXext" + else + dnl On AIX, it is in XextSam instead, but we still need -lXext + AC_CHECK_LIB(XextSam, XShmAttach, + HAVE_XSHM="yes", HAVE_XSHM="no", + $X_LIBS) + if test "x$HAVE_XSHM" = "xyes"; then + XSHM_LIBS="-lXext -lXextSam" + fi + fi + fi +], ,[ + AC_SUBST(HAVE_XSHM) + AC_SUBST(XSHM_LIBS) +]) + +dnl for V4L2, we also need to know if we have XVIDEO +translit(dnm, m, l) AM_CONDITIONAL(USE_XVIDEO, true) +AG_GST_CHECK_FEATURE(XVIDEO, [X11 XVideo extensions], + [], [ + AG_GST_CHECK_XV +]) + +dnl *** ext plug-ins *** +dnl keep this list sorted alphabetically ! + +if test "x$BUILD_EXTERNAL" = "xyes"; then + +echo +AC_MSG_NOTICE([Checking libraries for plugins in ext/]) +echo + +dnl *** aalib *** +translit(dnm, m, l) AM_CONDITIONAL(USE_AALIB, true) +AG_GST_CHECK_FEATURE(AALIB, [aalib ASCII Art library], aasink, [ + AM_PATH_AALIB(, HAVE_AALIB=yes, HAVE_AALIB=no) + AS_SCRUB_INCLUDE(AALIB_CFLAGS) +]) + +dnl *** annodex *** +translit(dnm, m, l) AM_CONDITIONAL(USE_ANNODEX, true) +AG_GST_CHECK_FEATURE(ANNODEX, [XML library], annodex, [ + AG_GST_PKG_CHECK_MODULES(ANNODEX, libxml-2.0 >= 2.4.9) +]) + +dnl *** cairo *** +translit(dnm, m, l) AM_CONDITIONAL(USE_CAIRO, true) +AG_GST_CHECK_FEATURE(CAIRO, [Cairo graphics rendering], cairo, [ + AG_GST_PKG_CHECK_MODULES(CAIRO, cairo >= 1.0.0) +]) + +dnl *** cairo-gobject *** +translit(dnm, m, l) AM_CONDITIONAL(USE_CAIRO_GOBJECT, true) +AG_GST_CHECK_FEATURE(CAIRO_GOBJECT, + [Cairo graphics rendering gobject bindings], cairooverlay, [ + AG_GST_PKG_CHECK_MODULES(CAIRO_GOBJECT, cairo-gobject >= 1.10.0) +]) + +dnl **** ESound **** +translit(dnm, m, l) AM_CONDITIONAL(USE_ESD, true) +AG_GST_CHECK_FEATURE(ESD, [ESounD sound daemon], esdsink, [ + AG_GST_PKG_CHECK_MODULES(ESD, esound >= 0.2.12) + if test $HAVE_ESD = no + then + AM_PATH_ESD(0.2.12, HAVE_ESD="yes") + AS_SCRUB_INCLUDE(ESD_CFLAGS) + fi +]) + +dnl *** FLAC *** +translit(dnm, m, l) AM_CONDITIONAL(USE_FLAC, true) +AG_GST_CHECK_FEATURE(FLAC, [FLAC lossless audio], flac, [ + AG_GST_PKG_CHECK_MODULES(FLAC, flac >= 1.1.4) +]) + +dnl *** GConf *** +translit(dnm, m, l) AM_CONDITIONAL(USE_GCONF, true) +AG_GST_CHECK_FEATURE(GCONF, [GConf libraries], gconfelements, [ + AG_GST_PKG_CHECK_MODULES(GCONF, gconf-2.0) +]) + +dnl *** GDK pixbuf *** +translit(dnm, m, l) AM_CONDITIONAL(USE_GDK_PIXBUF, true) +AG_GST_CHECK_FEATURE(GDK_PIXBUF, [GDK pixbuf], gdkpixbuf, [ + AG_GST_PKG_CHECK_MODULES(GDK_PIXBUF, gdk-pixbuf-2.0 >= 2.8.0) +]) + +dnl *** HAL *** +translit(dnm, m, l) AM_CONDITIONAL(USE_HAL, true) +AG_GST_CHECK_FEATURE(HAL, [HAL libraries], halelements, [ + AG_GST_PKG_CHECK_MODULES(HAL, [hal >= 0.5.6, dbus-1 >= 0.32]) +]) + +dnl *** Jack *** +translit(dnm, m, l) AM_CONDITIONAL(USE_JACK, true) +AG_GST_CHECK_FEATURE(JACK, Jack, jack, [ + PKG_CHECK_MODULES(JACK, jack >= 0.99.10, HAVE_JACK="yes", HAVE_JACK="no") + AC_SUBST(JACK_CFLAGS) + AC_SUBST(JACK_LIBS) + + AG_GST_PKG_CHECK_MODULES(JACK_0_120_1, jack >= 0.120.1 jack < 1.0) + if test x$HAVE_JACK_0_120_1 = xyes; then + AC_DEFINE(HAVE_JACK_0_120_1, 1, [defined if jack >= 0.120.1 is available]) + fi + AG_GST_PKG_CHECK_MODULES(JACK_1_9_7, jack >= 1.9.7) + if test x$HAVE_JACK_1_9_7 = xyes; then + AC_DEFINE(HAVE_JACK_1_9_7, 1, [defined if jack >= 1.9.7 is available]) + fi + +]) + +dnl *** jpeg *** +dnl FIXME: we could use header checks here as well IMO +translit(dnm, m, l) AM_CONDITIONAL(USE_JPEG, true) +AG_GST_CHECK_FEATURE(JPEG, [jpeg library], jpeg, [ + AC_ARG_WITH(jpeg-mmx, + [ --with-jpeg-mmx, path to MMX'ified JPEG library]) + OLD_LIBS="$LIBS" + if test x$with_jpeg_mmx != x; then + LIBS="$LIBS -L$with_jpeg_mmx" + fi + AC_CHECK_LIB(jpeg-mmx, jpeg_set_defaults, HAVE_JPEG="yes", HAVE_JPEG="no") + JPEG_LIBS="$LIBS -ljpeg-mmx" + LIBS="$OLD_LIBS" + if test x$HAVE_JPEG != xyes; then + AC_CHECK_LIB(jpeg, jpeg_set_defaults, HAVE_JPEG="yes", HAVE_JPEG="no") + JPEG_LIBS="-ljpeg" + fi + AC_SUBST(JPEG_LIBS) +]) + +dnl *** libcaca *** +translit(dnm, m, l) AM_CONDITIONAL(USE_LIBCACA, true) +AG_GST_CHECK_FEATURE(LIBCACA, [libcaca coloured ASCII art], cacasink, [ + AG_GST_PKG_CHECK_MODULES(LIBCACA, caca) +]) + +dnl *** libdv *** +translit(dnm, m, l) AM_CONDITIONAL(USE_LIBDV, true) +AG_GST_CHECK_FEATURE(LIBDV, [libdv DV demuxer/decoder], dv, [ + AG_GST_PKG_CHECK_MODULES(LIBDV, libdv >= 0.100) +]) + +dnl *** libpng *** +translit(dnm, m, l) AM_CONDITIONAL(USE_LIBPNG, true) +AG_GST_CHECK_FEATURE(LIBPNG, [Portable Network Graphics library], png, [ + AG_GST_PKG_CHECK_MODULES(LIBPNG, libpng >= 1.2) +]) + +dnl *** pulseaudio *** +translit(dnm, m, l) AM_CONDITIONAL(USE_PULSE, true) +AG_GST_CHECK_FEATURE(PULSE, [pulseaudio plug-in], pulseaudio, [ + + dnl used in ext/pulse/pulseutil.c + AC_CHECK_HEADERS([process.h]) + + AG_GST_PKG_CHECK_MODULES(PULSE, libpulse >= 0.9.16) + AG_GST_PKG_CHECK_MODULES(PULSE_0_9_20, libpulse >= 0.9.20) + if test x$HAVE_PULSE_0_9_20 = xyes; then + AC_DEFINE(HAVE_PULSE_0_9_20, 1, [defined if pulseaudio >= 0.9.20 is available]) + fi + AG_GST_PKG_CHECK_MODULES(PULSE_1_0, libpulse >= 0.98) + if test x$HAVE_PULSE_1_0 = xyes; then + AC_DEFINE(HAVE_PULSE_1_0, 1, [defined if pulseaudio >= 1.0 is available]) + fi +]) + +dnl *** dv1394 *** +translit(dnm, m, l) AM_CONDITIONAL(USE_DV1394, true) +AG_GST_CHECK_FEATURE(DV1394, [raw1394 and avc1394 library], 1394, [ + dnl first test for libraw1394 >= 2.0.0 + AG_GST_PKG_CHECK_MODULES(RAW1394, libraw1394 >= 2.0.0) + AG_GST_PKG_CHECK_MODULES(LIBIEC61883, libiec61883 >= 1.0.0) + dnl now see how far we got + if test x$HAVE_RAW1394 = xyes && \ + test x$HAVE_LIBIEC61883 = xyes; then + AG_GST_CHECK_LIBHEADER(AVC1394, + avc1394, avc1394_send_command, $RAW1394_LIBS, + libavc1394/avc1394.h, AVC1394_LIBS="-lavc1394") + AG_GST_CHECK_LIBHEADER(ROM1394, + rom1394, rom1394_free_directory, $RAW1394_LIBS, + libavc1394/rom1394.h, ROM1394_LIBS="-lrom1394") + if test x$HAVE_AVC1394 = xyes && \ + test x$HAVE_AVC1394 = xyes && \ + test x$HAVE_ROM1394 = xyes; then + HAVE_DV1394=yes + DV1394_LIBS="$RAW1394_LIBS $AVC1394_LIBS $ROM1394_LIBS $LIBIEC61883_LIBS" + DV1394_CFLAGS="$RAW1394_CFLAGS $LIBIEC61883_CFLAGS -DHAVE_LIBIEC61883" + AC_SUBST(DV1394_CFLAGS) + AC_SUBST(DV1394_LIBS) + fi + else + if test x$HAVE_RAW1394 = xno; then + AG_GST_PKG_CHECK_MODULES(RAW1394, libraw1394 >= 1.1.0) + AG_GST_CHECK_LIBHEADER(AVC1394, + avc1394, avc1394_send_command, $RAW1394_LIBS, + libavc1394/avc1394.h, AVC1394_LIBS="-lavc1394") + AG_GST_CHECK_LIBHEADER(ROM1394, + rom1394, rom1394_free_directory, $RAW1394_LIBS, + libavc1394/rom1394.h, ROM1394_LIBS="-lrom1394") + if test x$HAVE_RAW1394 = xyes && \ + test x$HAVE_AVC1394 = xyes && \ + test x$HAVE_ROM1394 = xyes; then + HAVE_DV1394=yes + DV1394_LIBS="$RAW1394_LIBS $AVC1394_LIBS $ROM1394_LIBS" + DV1394_CFLAGS="$RAW1394_CFLAGS" + if test x$HAVE_LIBIEC61883 = xyes; then + DV1394_CFLAGS="$RAW1394_CFLAGS $LIBIEC61883_CFLAGS -DHAVE_LIBIEC61883" + DV1394_LIBS="$DV1394_LIBS $LIBIEC61883_LIBS" + fi + AC_SUBST(DV1394_CFLAGS) + AC_SUBST(DV1394_LIBS) + fi + fi + fi +]) +AM_CONDITIONAL(USE_LIBIEC61883, [ test "x${HAVE_LIBIEC61883}" = xyes ] ) + +dnl *** shout2 *** +translit(dnm, m, l) AM_CONDITIONAL(USE_SHOUT2, true) +AG_GST_CHECK_FEATURE(SHOUT2, [Shoutcast/Icecast client library], shout2, [ + AG_GST_PKG_CHECK_MODULES(SHOUT2, shout >= 2.0) +]) + +dnl *** soup *** +translit(dnm, m, l) AM_CONDITIONAL(USE_SOUP, true) +AG_GST_CHECK_FEATURE(SOUP, [soup http client plugin (2.4)], souphttpsrc, [ + PKG_CHECK_MODULES(SOUP, libsoup-gnome-2.4 >= 2.3.2, [ + HAVE_SOUP="yes" + AC_DEFINE(HAVE_LIBSOUP_GNOME, 1, [soup gnome integration]) + ],[ + PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.26, HAVE_SOUP="yes", [ + HAVE_SOUP="no" + ]) + ]) + AC_SUBST(SOUP_CFLAGS) + AC_SUBST(SOUP_LIBS) +]) + +dnl *** speex >= 1.0.4 or >= 1.1.5 *** +dnl 1.1.4 and earlier were not API/ABI compatible with 1.0 +dnl 1.1.6 is the first to use a .pc/pkg-config file *** +dnl speex_jitter.h is 1.1.x only +translit(dnm, m, l) AM_CONDITIONAL(USE_SPEEX, true) +AG_GST_CHECK_FEATURE(SPEEX, [speex speech codec], speex, [ + AG_GST_PKG_CHECK_MODULES(SPEEX, speex >= 1.1.6) + if test $HAVE_SPEEX = no + then + AG_GST_CHECK_LIBHEADER(SPEEX, speex, speex_bits_init, , speex/speex.h, [ + AC_CHECK_HEADER(speex/speex_jitter.h, [ + dnl speex 1.1.x : + AG_GST_CHECK_LIBHEADER(SPEEX, speex, speex_encode_int, , speex/speex.h, [ + dnl speex 1.1.5 or + : + HAVE_SPEEX="yes" + SPEEX_LIBS="-lspeex" + AC_SUBST(SPEEX_CFLAGS) + AC_SUBST(SPEEX_LIBS) + ],[ + HAVE_SPEEX="no" + ]) + ],[ + dnl speex 1.0.x : + AC_CHECK_DECL(SPEEX_GET_LOOKAHEAD, [ + dnl speex 1.0.4 + HAVE_SPEEX="yes" + SPEEX_LIBS="-lspeex" + AC_SUBST(SPEEX_CFLAGS) + AC_SUBST(SPEEX_LIBS) + + AC_DEFINE_UNQUOTED(SPEEX_1_0, 1, + [defined if speex 1.0.x API detected]) + ],[ + HAVE_SPEEX="no" + AC_MSG_NOTICE(You need at least 1.0.4 to compile the speex plugin) + ], [ +#include + ]) + ]) + ]) + fi +]) + +dnl *** taglib *** +translit(dnm, m, l) AM_CONDITIONAL(USE_TAGLIB, true) +AG_GST_CHECK_FEATURE(TAGLIB, [taglib tagging library], taglib, [ + AG_GST_PKG_CHECK_MODULES(TAGLIB, taglib >= 1.5) + if test "x$HAVE_CXX" != "xyes"; then + USE_TAGLIB=false + AC_MSG_NOTICE([Not building taglib plugin: no C++ compiler found]) + else + dnl work around bug in taglib 1.5 headers, remove once there is a 1.6 + AS_CXX_COMPILER_FLAG([-Wno-attributes], [ + TAGLIB_CXXFLAGS="$TAGLIB_CFLAGS -Wno-attributes" + ], [ + TAGLIB_CXXFLAGS="$TAGLIB_CFLAGS" + ]) + AC_SUBST(TAGLIB_CXXFLAGS) + fi +]) + +dnl *** wavpack *** +translit(dnm, m, l) AM_CONDITIONAL(USE_WAVPACK, true) +AG_GST_CHECK_FEATURE(WAVPACK, [wavpack plug-in], wavpack, [ + PKG_CHECK_MODULES(WAVPACK, wavpack >= 4.40.0, HAVE_WAVPACK=yes, [ + PKG_CHECK_MODULES(WAVPACK, wavpack >= 4.20, [ + HAVE_WAVPACK=yes + AC_DEFINE(WAVPACK_OLD_API, 1, [old wavpack API]) + ],[ + HAVE_WAVPACK=no + ]) + ]) + AC_SUBST(WAVPACK_CFLAGS) + AC_SUBST(WAVPACK_LIBS) +]) + +dnl *** qtdemux & matroska prefer to have zlib *** +translit(dnm, m, l) AM_CONDITIONAL(USE_ZLIB, true) +AG_GST_CHECK_FEATURE(ZLIB, [zlib support for qtdemux/matroska],, [ + AG_GST_CHECK_LIBHEADER(ZLIB, + z, uncompress,, zlib.h, [ + HAVE_ZLIB="yes" + ZLIB_LIBS="-lz" + AC_SUBST(ZLIB_LIBS) + ]) +]) + +dnl *** matroska prefers to have bz2 *** +translit(dnm, m, l) AM_CONDITIONAL(USE_BZ2, true) +AG_GST_CHECK_FEATURE(BZ2, [bz2 library for matroska ],, [ + AG_GST_CHECK_LIBHEADER(BZ2, bz2, BZ2_bzCompress, ,bzlib.h, BZ2_LIBS="-lbz2") + AC_SUBST(BZ2_LIBS) +]) + +else + +dnl not building plugins with external dependencies, +dnl but we still need to set the conditionals +AM_CONDITIONAL(USE_AALIB, false) +AM_CONDITIONAL(USE_ANNODEX, false) +AM_CONDITIONAL(USE_BZ2, false) +AM_CONDITIONAL(USE_CAIRO, false) +AM_CONDITIONAL(USE_CAIRO_GOBJECT, false) +AM_CONDITIONAL(USE_DIRECTSOUND, false) +AM_CONDITIONAL(USE_DV1394, false) +AM_CONDITIONAL(USE_ESD, false) +AM_CONDITIONAL(USE_FLAC, false) +AM_CONDITIONAL(USE_GCONF, false) +AM_CONDITIONAL(USE_GCONFTOOL, false) +AM_CONDITIONAL(USE_GDK_PIXBUF, false) +AM_CONDITIONAL(USE_GST_V4L2, false) +AM_CONDITIONAL(USE_HAL, false) +AM_CONDITIONAL(USE_JACK, false) +AM_CONDITIONAL(USE_JPEG, false) +AM_CONDITIONAL(USE_LIBCACA, false) +AM_CONDITIONAL(USE_LIBDV, false) +AM_CONDITIONAL(USE_LIBIEC61883, false) +AM_CONDITIONAL(USE_LIBPNG, false) +AM_CONDITIONAL(USE_OSS, false) +AM_CONDITIONAL(USE_OSS4, false) +AM_CONDITIONAL(USE_OSX_AUDIO, false) +AM_CONDITIONAL(USE_OSX_VIDEO, false) +AM_CONDITIONAL(USE_PULSE, false) +AM_CONDITIONAL(USE_SHOUT2, false) +AM_CONDITIONAL(USE_SOUP, false) +AM_CONDITIONAL(USE_SPEEX, false) +AM_CONDITIONAL(USE_SUNAUDIO, false) +AM_CONDITIONAL(USE_TAGLIB, false) +AM_CONDITIONAL(USE_WAVPACK, false) +AM_CONDITIONAL(USE_X, false) +AM_CONDITIONAL(USE_XSHM, false) +AM_CONDITIONAL(USE_XVIDEO, false) +AM_CONDITIONAL(USE_ZLIB, false) + +fi dnl of EXT plugins + +dnl *** finalize CFLAGS, LDFLAGS, LIBS + +dnl Overview: +dnl GST_OPTION_CFLAGS: common flags for profiling, debugging, errors, ... +dnl GST_*: flags shared by all built objects +dnl GST_ALL_LDFLAGS: linker flags shared by all +dnl GST_LIB_LDFLAGS: not needed, we don't install libraries +dnl GST_LT_LDFLAGS: library versioning of our libraries +dnl GST_PLUGIN_LDFLAGS: flags to be used for all plugins + +dnl GST_OPTION_CFLAGS +if test "x$USE_DEBUG" = xyes; then + PROFILE_CFLAGS="-g" +fi +AC_SUBST(PROFILE_CFLAGS) + +if test "x$PACKAGE_VERSION_NANO" = "x1"; then + dnl Define _only_ for git (not pre-releases or releases) + DEPRECATED_CFLAGS="-DGST_DISABLE_DEPRECATED" +else + DEPRECATED_CFLAGS="" +fi +AC_SUBST(DEPRECATED_CFLAGS) + +dnl every flag in GST_OPTION_CFLAGS and GST_OPTION_CXXFLAGS can be overridden +dnl at make time with e.g. make ERROR_CFLAGS="" +GST_OPTION_CFLAGS="\$(WARNING_CFLAGS) \$(ERROR_CFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)" +GST_OPTION_CXXFLAGS="\$(WARNING_CXXFLAGS) \$(ERROR_CXXFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)" +AC_SUBST(GST_OPTION_CFLAGS) +AC_SUBST(GST_OPTION_CXXFLAGS) + +dnl our libraries need to be versioned correctly +AC_SUBST(GST_LT_LDFLAGS) + +dnl FIXME: do we want to rename to GST_ALL_* ? +dnl prefer internal headers to already installed ones +dnl also add builddir include for enumtypes and marshal +dnl add ERROR_CFLAGS, but overridable +GST_CXXFLAGS="-I\$(top_srcdir)/gst-libs $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)" +GST_CFLAGS="-I\$(top_srcdir)/gst-libs $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)" +AC_SUBST(GST_CFLAGS) +AC_SUBST(GST_CXXFLAGS) +AC_SUBST(GST_LIBS) + +dnl LDFLAGS really should only contain flags, not libs - they get added before +dnl whatevertarget_LIBS and -L flags here affect the rest of the linking +GST_ALL_LDFLAGS="-no-undefined" +AC_SUBST(GST_ALL_LDFLAGS) + +dnl this really should only contain flags, not libs - they get added before +dnl whatevertarget_LIBS and -L flags here affect the rest of the linking +GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^[_]*gst_plugin_desc.*' $GST_ALL_LDFLAGS" +AC_SUBST(GST_PLUGIN_LDFLAGS) + +dnl *** output files *** + +dnl keep this alphabetic per directory, please +AC_CONFIG_FILES( +Makefile +gst/Makefile +gst/alpha/Makefile +gst/apetag/Makefile +gst/audiofx/Makefile +gst/audioparsers/Makefile +gst/auparse/Makefile +gst/autodetect/Makefile +gst/avi/Makefile +gst/cutter/Makefile +gst/deinterlace/Makefile +gst/debugutils/Makefile +gst/effectv/Makefile +gst/equalizer/Makefile +gst/flv/Makefile +gst/goom/Makefile +gst/goom2k1/Makefile +gst/id3demux/Makefile +gst/icydemux/Makefile +gst/imagefreeze/Makefile +gst/interleave/Makefile +gst/isomp4/Makefile +gst/law/Makefile +gst/level/Makefile +gst/matroska/Makefile +gst/monoscope/Makefile +gst/multifile/Makefile +gst/multipart/Makefile +gst/replaygain/Makefile +gst/rtp/Makefile +gst/rtpmanager/Makefile +gst/rtsp/Makefile +gst/shapewipe/Makefile +gst/smpte/Makefile +gst/spectrum/Makefile +gst/udp/Makefile +gst/videobox/Makefile +gst/videocrop/Makefile +gst/videofilter/Makefile +gst/videomixer/Makefile +gst/wavenc/Makefile +gst/wavparse/Makefile +gst/flx/Makefile +gst/y4m/Makefile +ext/Makefile +ext/aalib/Makefile +ext/annodex/Makefile +ext/cairo/Makefile +ext/dv/Makefile +ext/esd/Makefile +ext/flac/Makefile +ext/gconf/Makefile +ext/gdk_pixbuf/Makefile +ext/hal/Makefile +ext/jack/Makefile +ext/jpeg/Makefile +ext/libcaca/Makefile +ext/libpng/Makefile +ext/pulse/Makefile +ext/raw1394/Makefile +ext/shout2/Makefile +ext/soup/Makefile +ext/speex/Makefile +ext/taglib/Makefile +ext/wavpack/Makefile +sys/Makefile +sys/directsound/Makefile +sys/oss/Makefile +sys/oss4/Makefile +sys/osxaudio/Makefile +sys/osxvideo/Makefile +sys/sunaudio/Makefile +sys/v4l2/Makefile +sys/waveform/Makefile +sys/ximage/Makefile +po/Makefile.in +tests/Makefile +tests/check/Makefile +tests/examples/Makefile +tests/examples/audiofx/Makefile +tests/examples/cairo/Makefile +tests/examples/equalizer/Makefile +tests/examples/jack/Makefile +tests/examples/level/Makefile +tests/examples/pulse/Makefile +tests/examples/rtp/Makefile +tests/examples/shapewipe/Makefile +tests/examples/spectrum/Makefile +tests/examples/v4l2/Makefile +tests/files/Makefile +tests/icles/Makefile +gconf/Makefile +gconf/gstreamer.schemas +common/Makefile +common/m4/Makefile +m4/Makefile +docs/Makefile +docs/plugins/Makefile +docs/version.entities +pkgconfig/Makefile +pkgconfig/gstreamer-plugins-good-uninstalled.pc +gst-plugins-good.spec +) + +dnl Create the config.h file for Visual Studio builds +dnl Beware of spaces and /'s in some of the shell variable contents. +sed \ + -e 's/.*config.h.in.*autoheader.*/\/* Autogenerated config.h created for win32 Visual Studio builds *\/\n\n\/* PREFIX -- specifically added for Windows for easier moving *\/\n#define PREFIX "C:\\\\gstreamer"\n\n#define GST_INSTALL_PLUGINS_HELPER PREFIX "\\\\libexec\\\\gst-install-plugins-helper.exe"/' \ + -e 's/.* GETTEXT_PACKAGE$/#define GETTEXT_PACKAGE "'$GETTEXT_PACKAGE'"/' \ + -e 's/.* GST_DATADIR$/#define GST_DATADIR PREFIX "\\\\share"/' \ + -e 's/.* GST_LEVEL_DEFAULT$/#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR/' \ + -e 's/.* GST_LICENSE$/#define GST_LICENSE "'$GST_LICENSE'"/' \ + -e 's/.* GST_MAJORMINOR$/#define GST_MAJORMINOR "'$GST_MAJORMINOR'"/' \ + -e "s,.* GST_PACKAGE_NAME$,#define GST_PACKAGE_NAME \"${GST_PACKAGE_NAME}\"," \ + -e 's/.* GST_PACKAGE_ORIGIN$/#define GST_PACKAGE_ORIGIN "Unknown package origin"/' \ + -e "s,.* GST_PACKAGE_RELEASE_DATETIME$,#define GST_PACKAGE_RELEASE_DATETIME \"${GST_PACKAGE_RELEASE_DATETIME}\"," \ + -e 's/.* HAVE_CPU_I386$/#define HAVE_CPU_I386 1/' \ + -e 's/.* HAVE_FGETPOS$/#define HAVE_FGETPOS 1/' \ + -e 's/.* HAVE_FSETPOS$/#define HAVE_FSETPOS 1/' \ + -e 's/.* HAVE_LIBXML2$/#define HAVE_LIBXML2 1/' \ + -e 's/.* HAVE_PROCESS_H$/#define HAVE_PROCESS_H 1/' \ + -e 's/.* HAVE_STDLIB_H$/#define HAVE_STDLIB_H 1/' \ + -e 's/.* HAVE_STRING_H$/#define HAVE_STRING_H 1/' \ + -e 's/.* HAVE_SYS_STAT_H$/#define HAVE_SYS_STAT_H 1/' \ + -e 's/.* HAVE_SYS_TYPES_H$/#define HAVE_SYS_TYPES_H 1/' \ + -e 's/.* HAVE_WIN32$/#define HAVE_WIN32 1/' \ + -e 's/.* HAVE_WINSOCK2_H$/#define HAVE_WINSOCK2_H 1/' \ + -e 's/.* HOST_CPU$/#define HOST_CPU "i686"/' \ + -e 's/.* LIBDIR$/#ifdef _DEBUG\n# define LIBDIR PREFIX "\\\\debug\\\\lib"\n#else\n# define LIBDIR PREFIX "\\\\lib"\n#endif/' \ + -e 's/.* LOCALEDIR$/#define LOCALEDIR PREFIX "\\\\share\\\\locale"/' \ + -e "s/.* PACKAGE$/#define PACKAGE \"$PACKAGE\"/" \ + -e 's/.* PACKAGE_BUGREPORT$/#define PACKAGE_BUGREPORT "http:\/\/bugzilla.gnome.org\/enter_bug.cgi?product=GStreamer"/' \ + -e "s/.* PACKAGE_NAME$/#define PACKAGE_NAME \"$PACKAGE_NAME\"/" \ + -e "s/.* PACKAGE_STRING$/#define PACKAGE_STRING \"$PACKAGE_STRING\"/" \ + -e 's/.* PACKAGE_TARNAME$/#define PACKAGE_TARNAME "'$PACKAGE_TARNAME'"/' \ + -e 's/.* PACKAGE_VERSION$/#define PACKAGE_VERSION "'$PACKAGE_VERSION'"/' \ + -e 's/.* PLUGINDIR$/#ifdef _DEBUG\n# define PLUGINDIR PREFIX "\\\\debug\\\\lib\\\\gstreamer-0.10"\n#else\n# define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.10"\n#endif/' \ + -e 's/.* USE_BINARY_REGISTRY$/#define USE_BINARY_REGISTRY/' \ + -e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \ + -e "s/.* DEFAULT_AUDIOSINK$/#define DEFAULT_AUDIOSINK \"directsoundsink\"/" \ + -e "s/.* DEFAULT_AUDIOSRC$/#define DEFAULT_AUDIOSRC \"audiotestsrc\"/" \ + -e "s/.* DEFAULT_VIDEOSRC$/#define DEFAULT_VIDEOSRC \"videotestsrc\"/" \ + -e "s/.* DEFAULT_VISUALIZER$/#define DEFAULT_VISUALIZER \"goom\"/" \ + config.h.in >win32/common/config.h-new + +AC_OUTPUT + +AG_GST_OUTPUT_PLUGINS +ORC_OUTPUT + diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..f11a53e --- /dev/null +++ b/debian/changelog @@ -0,0 +1,534 @@ +gst-plugins-good0.10 (0.10.31-14) unstable; urgency=low + + * [aacparse] modify buffer size to calculate aac duration + * Git: framework/multimedia/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+14 + + -- Sunghyun Eum Thu, 08 Nov 2012 13:15:10 +0900 + +gst-plugins-good0.10 (0.10.31-13) unstable; urgency=low + + * Build with libjpeg-turbo-devel not libjpeg-devel + * Git: framework/multimedia/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-13 + + -- YoungHun Kim Wed, 31 Oct 2012 17:20:17 +0900 + +gst-plugins-good0.10 (0.10.31-1slp2+12) unstable; urgency=low + + * [aacparse] calculate total duration for small aac adts file + * Git: framework/multimedia/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+12 + + -- Sunghyun Eum Fri, 19 Oct 2012 15:16:42 +0900 + +gst-plugins-good0.10 (0.10.31-1slp2+7) unstable; urgency=low + + * [aacparse] estimate total duration for aac adts + * Git: framework/multimedia/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+7 + + -- Sunghyun Eum Thu, 04 Oct 2012 23:41:37 +0900 + +gst-plugins-good0.10 (0.10.31-1slp2+6) unstable; urgency=low + + * [amrparse] make amr index table before seek efficiently + * Git: framework/multimedia/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+6 + + -- Sunghyun Eum Sun, 30 Sep 2012 11:48:43 +0900 + +gst-plugins-good0.10 (0.10.31-1slp2+5) unstable; urgency=low + + * [mpegaudioparse] return error about spec out mpeg1 layer2 header + * Git: framework/multimedia/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+5 + + -- Sunghyun Eum Fri, 21 Sep 2012 13:40:19 +0900 + +gst-plugins-good0.10 (0.10.31-1slp2+4) unstable; urgency=low + + * [rtspsrc] Fix to send PLAY method after sending PAUSE method + * Git: framework/multimedia/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+4 + + -- YeJin Cho Thu, 20 Sep 2012 17:51:32 +0900 + +gst-plugins-good0.10 (0.10.31-1slp2+3) unstable; urgency=low + + * modify mkv lockup issue + * Git: framework/multimedia/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+3 + + -- SunghyunEum Thu, 13 Sep 2012 18:51:50 +0900 + +gst-plugins-good0.10 (0.10.31-1slp2+2) unstable; urgency=low + + * Matroska Index Table generation + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+2 + + -- Abhishek Bajaj Mon, 10 Sept 2012 10:40:50 +0530 + +gst-plugins-good0.10 (0.10.31-1slp2+1) unstable; urgency=low + + * Upgrade 0.10.29 to 0.10.31 + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.31-1slp2+1 + + -- Hyunseok Lee Wed, 27 Jun 2012 21:17:50 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+21) unstable; urgency=low + + * Adding unified trickplay of matroska demuxer + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+21 + + -- Naveen Ch Tue, 17 Apr 2012 22:30:17 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+20) unstable; urgency=low + + * enable mutipart to use getUserMedia in webkit + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+20 + + -- Jeongmo Yang Thu, 12 Apr 2012 20:16:17 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+19) unstable; urgency=low + + * Adding unified trickplay of QT & AVI demuxers + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+19 + + -- Naveen Ch Fri, 30 Mar 2012 07:30:08 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+18) unstable; urgency=low + + * Add null check after gst_pad_pull_range in avidemux + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+18 + + -- Sunghyun Eum Wed, 15 Feb 2012 07:09:08 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+17) unstable; urgency=low + + * Modify souphttpsrc plugin : adding Range field to request header at very first time with offset 0 + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+17 + + -- YeJin Cho Tue, 07 Feb 2012 15:46:44 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+16) unstable; urgency=low + + * update debian/control for libjpeg(7to8) + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+16 + + -- Seungbae Shin Thu, 12 Jan 2012 13:23:16 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+15) unstable; urgency=low + + * Enable interleave for WebAudio API + * Git: slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+15 + + -- Hyunseok Lee Fri, 16 Dec 2011 18:46:33 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+14) unstable; urgency=low + + * Code cleanup for source open + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+14 + + -- Sangchul Lee Tue, 06 Dec 2011 16:18:21 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+13) unstable; urgency=low + + * Modify scale function for fast forward + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+13 + + -- Sunghyun Eum Fri, 25 Nov 2011 19:11:24 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+12) unstable; urgency=low + + * Update gst_qtdemux_find_index function to latest version. + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+12 + + -- Dowan Kim Mon, 07 Nov 2011 10:30:51 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+11) unstable; urgency=low + + * Check the possiblity of H263 in case of mp4v fourCC and correct it. + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+11 + + -- Hyunseok Lee Wed, 12 Oct 2011 10:31:26 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+10) unstable; urgency=low + + * Add dependancy for bz2 + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+10 + + -- Seungbae Shin Fri, 30 Sep 2011 11:38:17 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+9) unstable; urgency=low + + * Fix divx drm commit fails + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+9 + + -- Seungbae Shin Tue, 06 Sep 2011 21:24:19 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+8) unstable; urgency=low + + * Remove GTK dependancy + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+8 + + -- Seungbae Shin > Tue, 06 Sep 2011 19:36:28 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+7) unstable; urgency=low + + * Increase version (already previous version exists) + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+7 + + -- Seungbae Shin Thu, 25 Aug 2011 13:56:03 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+6) unstable; urgency=low + + * Remove divxsdk depedancy and use libmm-divxsdk plugin + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+6 + + -- Seungbae Shin Thu, 25 Aug 2011 13:25:41 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+5) unstable; urgency=low + + * enable wavenc + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+5 + + -- Jeongmo Yang Wed, 22 Jun 2011 11:52:03 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+4) unstable; urgency=low + + * [avi] merge unmerged divx drm related code + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+4 + + -- Seungbae Shin Fri, 10 Jun 2011 19:27:03 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+3) unstable; urgency=low + + * remove old files + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+3 + + -- Younghwan Ahn Wed, 08 Jun 2011 17:01:37 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+2) unstable; urgency=low + + * update changelog + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+2 + + -- Younghwan Ahn Tue, 07 Jun 2011 20:41:03 +0900 + +gst-plugins-good0.10 (0.10.29-18slp2+1) lucid; urgency=low + + * upgrade 17 to 29 + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.29-18slp2+1 + + -- Younghwan Ahn Thu, 12 May 2011 19:44:48 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+12) unstable; urgency=low + + * [avidemux] Fix to get duration from avih in case of push-mode + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+12 + + -- YeJin Cho Wed, 16 Mar 2011 17:25:51 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+11) unstable; urgency=low + + * [avidemux] Return GST_FLOW_ERROR when avidemux fail to parse stream + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+11 + + -- Seungbae Shin Thu, 10 Mar 2011 14:07:20 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+10) unstable; urgency=low + + * [avidemux] Post error when DivX DRM init fails + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+10 + + -- Seungbae Shin Mon, 07 Mar 2011 19:05:09 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+9) unstable; urgency=low + + * Revert Disable matroska plugin + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+9 + + -- Seungbae Shin Wed, 16 Feb 2011 10:50:15 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+8) unstable; urgency=low + + * Disable matroska plugin + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+8 + + -- Seungbae Shin Wed, 09 Feb 2011 15:25:55 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+7) unstable; urgency=low + + * Support DivX JIT DRM + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+7 + + -- Seungbae Shin Wed, 05 Jan 2011 12:09:11 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+6) unstable; urgency=low + + * Modified AVI demux to solved DIVX issues + * Git: 165.213.180.234:slp/pkgs/g/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+6 + + -- Naveen Ch Tue, 07 Dec 2010 13:09:22 +0530 + +gst-plugins-good0.10 (0.10.17-18slp2+5) unstable; urgency=low + + * Skip indexing when dd chunk + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+5 + + -- Seungbae.shin Fri, 03 Dec 2010 16:28:06 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+4) unstable; urgency=low + + * Merge max/avg bitrate from latest qtdemux + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+4 + + -- Seungbae.shin Wed, 01 Dec 2010 16:59:38 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+3) unstable; urgency=low + + * Fix for as-needed + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+3 + + -- Seungbae.shin Wed, 24 Nov 2010 21:04:10 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+2) unstable; urgency=low + + * Add dbg package, PIC, as-needed + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+2 + + -- Seungbae.shin Fri, 19 Nov 2010 10:55:49 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+1) unstable; urgency=low + + * fix h264 rtph264payloader not to check sps/pps info (by yoserb.yi) + * enable mulaw,alaw enc/dec to support VoIP via Farsight (by yoserb.yi) + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+1 + + -- Seungbae.shin Wed, 10 Nov 2010 21:30:23 +0900 + +gst-plugins-good0.10 (0.10.17-18slp2+0) unstable; urgency=low + + * Enable FLV demuxer + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-18slp2+0 + + -- Seungbae Shin Fri, 05 Nov 2010 20:26:27 +0900 + +gst-plugins-good0.10 (0.10.17-17slp2+8) unstable; urgency=low + + * Rollback v4l2src to original src except for setting input index + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+8 + + -- Wonhyung Cho Tue, 21 Sep 2010 20:14:45 +0900 + +gst-plugins-good0.10 (0.10.17-17slp2+7) unstable; urgency=low + + * Repackaging for pulse (basesink updated) + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+7 + + -- Seungbae Shin Wed, 01 Sep 2010 13:41:03 +0900 + +gst-plugins-good0.10 (0.10.17-17slp2+6) unstable; urgency=low + + * Replace libsoup2.4-1 with libsoup2.4 in debian/control + * Git: 165.213.180.234:/git/slp/pkgs/gst-plugins-good0.10 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+6 + + -- Seungbae Shin Wed, 25 Aug 2010 11:12:53 +0900 + +gst-plugins-good0.10 (0.10.17-17slp2+5) unstable; urgency=low + + * No change in source code + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/gst-plugins-good-0.10.17 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+5 + + -- Naveen Ch Thu, 24 Jun 2010 08:48:53 +0530 + +gst-plugins-good0.10 (0.10.17-17slp2+4) unstable; urgency=low + + * Matroska Demux: Added WebM support in matroska demuxer + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/gst-plugins-good-0.10.17 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+4 + + -- Naveen Ch Thu, 17 Jun 2010 16:45:27 +0530 + +gst-plugins-good0.10 (0.10.17-17slp2+3) unstable; urgency=low + + * Matroska Demux: Added reverse trick play functionality + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/gst-plugins-good-0.10.17 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+3 + + -- Naveen Ch Wed, 02 Jun 2010 13:01:47 +0530 + +gst-plugins-good0.10 (0.10.17-17slp2+2) unstable; urgency=low + + * AVI Demux: Modified the created mp3 caps to avoid selecting "mp3parse" element + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/gst-plugins-good-0.10.17 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+2 + + -- Prashanth Kumar D Mon, 17 May 2010 18:21:49 +0530 + +gst-plugins-good0.10 (0.10.17-17slp2+1) unstable; urgency=low + + * AVI Demux: Added "framed" field in the caps for AC3 content to avoid selecting ac3parse + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/gst-plugins-good-0.10.17 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+1 + + -- Prashanth Kumar D Fri, 30 Apr 2010 18:08:54 +0530 + +gst-plugins-good0.10 (0.10.17-17slp2+0) unstable; urgency=low + + * Add pulseaudio dependancy + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/gst-plugins-good-0.10.17 + * Tag: gst-plugins-good0.10_0.10.17-17slp2+0 + + -- Seungbae Shin Mon, 12 Apr 2010 15:52:54 +0900 + +gst-plugins-good0.10 (0.10.17-16slp+1) unstable; urgency=low + + * enable matroska demuxer/muxer + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/gst-plugins-good-0.10.17 + * Tag: gst-plugins-good0.10_0.10.17-16slp+1 + + -- Heungsoon Rim Fri, 09 Apr 2010 13:32:52 +0900 + +gst-plugins-good0.10 (0.10.17-16slp+0) unstable; urgency=low + + * Change package naming rule + + -- Seungbae Shin Thu, 25 Mar 2010 15:13:04 +0900 + +gst-plugins-good0.10 (0.10.17-16) unstable; urgency=low + + * Add uploader list + + -- Wonhyung Cho Mon, 22 Mar 2010 14:56:25 +0900 + +gst-plugins-good0.10 (0.10.17-15) unstable; urgency=low + + * Because gstbasesrc.h was changed, I build and upload this package again. + + -- Wonhyung Cho Mon, 22 Mar 2010 14:31:02 +0900 + +gst-plugins-good0.10 (0.10.17-14) unstable; urgency=low + + * Remove taglib dependancy + + -- Seungbae Shin Tue, 09 Mar 2010 18:05:52 +0900 + +gst-plugins-good0.10 (0.10.17-13) unstable; urgency=low + + * Added support for generating index table with key frames as an alternate approach to CQ issue H0100083573 + + -- Naveen Ch Mon, 08 Mar 2010 16:58:36 +0530 + +gst-plugins-good0.10 (0.10.17-12) unstable; urgency=low + + * Repacking by kishore + + -- YoungHwan Ahn Wed, 24 Feb 2010 21:13:22 +0900 + +gst-plugins-good0.10 (0.10.17-11) unstable; urgency=low + + * avi audio handling for < 4x by kishore + + -- YoungHwan Ahn Tue, 23 Feb 2010 22:33:34 +0900 + +gst-plugins-good0.10 (0.10.17-10) unstable; urgency=low + + * avi fixes added for trick play + + -- Kishore Arepalli Tue, 23 Feb 2010 12:39:42 +0530 + +gst-plugins-good0.10 (0.10.17-9) unstable; urgency=low + + * Trick play added for avidemux by kishore + + -- younghwan ahn Thu, 18 Feb 2010 13:47:03 +0900 + +gst-plugins-good0.10 (0.10.17-8) unstable; urgency=low + + * Repacking due to the build failed + + -- younghwan ahn Sat, 06 Feb 2010 01:42:14 +0900 + +gst-plugins-good0.10 (0.10.17-7) unstable; urgency=low + + * jump to keyframe removed for trick play.. & modified number of lines reduced for trickplay + + -- younghwan ahn Sat, 06 Feb 2010 01:26:15 +0900 + +gst-plugins-good0.10 (0.10.17-6) unstable; urgency=low + + * trick play implementation + + -- younghwan ahn Wed, 02 Dec 2009 10:35:21 +0900 + +gst-plugins-good0.10 (0.10.17-5) unstable; urgency=low + + * check duplicated timestamp after binary sesearch in qtdemux + + -- jongmin lee Wed, 02 Dec 2009 10:35:21 +0900 + +gst-plugins-good0.10 (0.10.17-4) unstable; urgency=low + + * force revision up + + -- sangho park Mon, 30 Nov 2009 11:07:21 +0900 + +gst-plugins-good0.10 (0.10.17-3) unstable; urgency=low + + * change timeout to 3 sec + + -- sangho park Mon, 30 Nov 2009 10:44:16 +0900 + +gst-plugins-good0.10 (0.10.17-2) unstable; urgency=low + + * resolve dependency break + + -- jongmin lee Tue, 17 Nov 2009 17:56:42 +0900 + +gst-plugins-good0.10 (0.10.17-1) unstable; urgency=low + + * Initial release. + + -- jongmin lee The, 17 Nov 2009 12:50:00 +0900 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100755 index 0000000..17b5600 --- /dev/null +++ b/debian/control @@ -0,0 +1,45 @@ +Source: gst-plugins-good0.10 +Section: libs +Priority: optional +Maintainer: Shin Seung Bae , JongHyuk Choi +Uploaders: younghwan ahn , Naveen Ch , Hyunseok Lee , Jeongmo Yang +Build-Depends: libglib2.0-dev (>= 2.16), + liboil0.3-dev (>= 0.3.8), + libgstreamer0.10-dev (>= 0.10.25), + libgstreamer-plugins-base0.10-dev (>= 0.10.25), + libjpeg8-dev, + libpng12-dev, + libsoup2.4-dev, + libpulse-dev, + libbz2-dev +Standards-Version: 3.8.0 + +Package: gstreamer0.10-plugins-good +Architecture: any +Section: libs +Depends: ${misc:Depends}, ${shlibs:Depends}, + libglib2.0-0 (>= 2.16), + liboil0.3 (>= 0.3.8), + libgstreamer0.10-0 (>= 0.10.25), + libgstreamer-plugins-base0.10-0 (>= 0.10.25), + libjpeg8, + libpng12-0, + libsoup2.4, + libpulse0, + libbz2-1.0 +Description: GStreamer plugins from the "good" set + GStreamer is a streaming media framework, based on graphs of filters + which operate on media data. Applications using this library can do + anything from real-time sound processing to playing videos, and just + about anything else media-related. Its plugin-based architecture means + that new data types or processing capabilities can be added simply by + installing new plug-ins. + . + This package contains the GStreamer plugins from the "good" set, a set + of good-quality plug-ins under the LGPL license. + +Package: gstreamer0.10-plugins-good-dbg +Section: debug +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, gstreamer0.10-plugins-good (= ${Source-Version}) +Description: GStreamer plugins from the "good" set (unstripped) diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..e3e9f94 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,31 @@ +This package was debianized by David I. Lehn on +Mon, 15 Jan 2001 18:21:37 -0500. + +It was downloaded from http://gstreamer.net/ + +Upstream Authors: + + Erik Walthinsen + Wim Taymans + Richard Boulton + and many more... + +Copyright: + + This package 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 package 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 package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian GNU/Linux systems, the complete text of the GNU Lesser General +Public License can be found in `/usr/share/common-licenses/LGPL'. + diff --git a/debian/gstreamer0.10-plugins-good.install.in b/debian/gstreamer0.10-plugins-good.install.in new file mode 100644 index 0000000..a32767e --- /dev/null +++ b/debian/gstreamer0.10-plugins-good.install.in @@ -0,0 +1 @@ +@PREFIX@/lib/gstreamer-0.10/libgst*.so* diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..0cd87f0 --- /dev/null +++ b/debian/rules @@ -0,0 +1,215 @@ +#!/usr/bin/make -f + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CFLAGS ?= -Wall -g -fPIC +LDFLAGS ?= +PREFIX ?= /usr +DATADIR ?= /opt + +CONFIGURE_OPTION += --disable-static \ + --disable-nls \ + --with-html-dir=/tmp/dump \ + --disable-examples \ + --disable-gconftool \ + --disable-alpha \ + --disable-apetag \ + --disable-audiofx \ + --disable-auparse \ + --disable-cutter \ + --disable-debugutils \ + --disable-deinterlace \ + --disable-effectv \ + --disable-equalizer \ + --disable-icydemux \ + --disable-flx \ + --disable-goom \ + --disable-goom2k1 \ + --disable-level \ + --disable-monoscope \ + --disable-replaygain \ + --disable-smpte \ + --disable-spectrum \ + --disable-videobox \ + --disable-videomixer \ + --disable-y4m \ + --disable-directsound \ + --disable-oss \ + --disable-sunaudio \ + --disable-osx_aidio \ + --disable-osx_video \ + --disable-aalib \ + --disable-aalibtest \ + --disable-annodex \ + --disable-cairo \ + --disable-esd \ + --disable-esdtest \ + --disable-flac \ + --disable-gconf \ + --disable-hal \ + --disable-libcaca \ + --disable-libdv \ + --disable-dv1394 \ + --disable-shout2 \ + --disable-shout2test \ + --disable-speex \ + --disable-taglib + +#--disable-wavenc \ +#--disable-bz2 \ +#--disable-jpeg \ +#--disable-autodetext \ +#--disable-wavpack \ +#--disable-avi \ +#--disable-soup \ +#--disable-id3demux \ +#--disable-qtdemux \ +#--disable-rtp \ +#--disable-rtpmanager \ +#--disable-udp \ +#--disable-gst_v4l2 \ +#--disable-taglib \ +#--disable-zlib \ +#--disable-wavparse \ +#--disable-videofilter \ +#--disable-libpng \ +#--disable-x \ +#--disable-xshm \ +#--disable-xvideo \ +#--disable-videocrop \ + +CFLAGS += -DGST_EXT_SOUP_MODIFICATION + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +#ifneq (,$(findstring arm, $(DEB_HOST_GNU_TYPE))) +#endif + +# architecture is not arm +ifneq (, $(findstring arm, $(DEB_HOST_ARCH))) + # ARM + CONFIGURE_OPTION += --enable-divx-drm +else + # OTHER +endif + +LDFLAGS += -Wl,--hash-style=both -Wl,--as-needed + +config.status: configure + dh_testdir + ./autogen.sh + # Add here commands to configure the package. + ./configure $(CONFIGURE_OPTION) --prefix=$(PREFIX) CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" + +#configure: +# dh_testdir +# ./autogen.sh + +build: build-stamp +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + touch $@ + +clean:: + dh_testdir + dh_testroot + rm -f build-stamp stamp-h1 + # Add here commands to clean up after the build process. + -$(MAKE) clean + +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + find ./ -depth -name "Makefile" -exec rm {} -f \; + find ./ -depth -name ".deps" -exec rm {} -rf \; + rm -f common/shave + rm -f common/shave-libtool + rm -f docs/version.entities + rm -f gconf/gstreamer.schemas + rm -f pkgconfig/gstreamer-plugins-good-uninstalled.pc + rm -f po/Makefile.in + rm -f po/POTFILES + rm -f tests/check/elements/.dirstamp + rm -f win32/common/config.h-new + rm -f _stdint.h + rm -f config.h + rm -f config.log + rm -f config.status + rm -f libtool + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + rm -f $${f%.in}; \ + done + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp + $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_install --sourcedir debian/tmp --list-missing +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip --dbg-package=gstreamer0.10-plugins-good-dbg + dh_compress + dh_fixperms + dh_perl + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/debian/rules.old b/debian/rules.old new file mode 100755 index 0000000..b2be11f --- /dev/null +++ b/debian/rules.old @@ -0,0 +1,214 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/simple-patchsys.mk + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CFLAGS ?= -Wall -g +LDFLAGS ?= +PREFIX ?= /usr +DATADIR ?= /opt + +CONFIGURE_OPTION= --disable-static \ +--disable-nls \ +--with-html-dir=/tmp/dump \ +--disable-examples \ +--disable-gconftool \ +--disable-alpha \ +--disable-apetag \ +--disable-audiofx \ +--disable-auparse \ +--disable-cutter \ +--disable-debugutils \ +--disable-deinterlace \ +--disable-effectv \ +--disable-equalizer \ +--disable-flv \ +--disable-icydemux \ +--disable-interleave \ +--disable-flx \ +--disable-goom \ +--disable-goom2k1 \ +--disable-law \ +--disable-level \ +--disable-matroska \ +--disable-monoscope \ +--disable-multifile \ +--disable-multipart \ +--disable-replaygain \ +--disable-smpte \ +--disable-spectrum \ +--disable-videobox \ +--disable-videomixer \ +--disable-wavenc \ +--disable-y4m \ +--disable-directsound \ +--disable-oss \ +--disable-sunaudio \ +--disable-osx_aidio \ +--disable-osx_video \ +--disable-aalib \ +--disable-aalibtest \ +--disable-annodex \ +--disable-cairo \ +--disable-esd \ +--disable-esdtest \ +--disable-flac \ +--disable-gconf \ +--disable-gdk_pixbuf \ +--disable-hal \ +--disable-libcaca \ +--disable-libdv \ +--disable-pulse \ +--disable-dv1394 \ +--disable-shout2 \ +--disable-shout2test \ +--disable-speex + +#--disable-bz2 \ +#--disable-jpeg \ +#--disable-autodetext \ +#--disable-wavpack \ +#--disable-avi \ +#--disable-soup \ +#--disable-id3demux \ +#--disable-qtdemux \ +#--disable-rtp \ +#--disable-rtpmanager \ +#--disable-udp \ +#--disable-gst_v4l2 \ +#--disable-taglib \ +#--disable-zlib \ +#--disable-wavparse \ +#--disable-videofilter \ +#--disable-libpng \ +#--disable-x \ +#--disable-xshm \ +#--disable-xvideo \ +#--disable-videocrop \ + + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +#ifneq (,$(findstring arm, $(DEB_HOST_GNU_TYPE))) +#endif + +CFLAGS += -DMODEL_AQUILA + +config.status: configure + dh_testdir + # Add here commands to configure the package. + ./configure $(CONFIGURE_OPTION) --prefix=$(PREFIX) CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" + +#configure: +# dh_testdir +# ./autogen.sh + +build: build-stamp +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + touch $@ + +clean:: + dh_testdir + dh_testroot + rm -f build-stamp stamp-h1 + # Add here commands to clean up after the build process. + -$(MAKE) clean + +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + find ./ -depth -name "Makefile" -exec rm {} -f \; + find ./ -depth -name ".deps" -exec rm {} -rf \; + rm -f common/shave + rm -f common/shave-libtool + rm -f docs/version.entities + rm -f gconf/gstreamer.schemas + rm -f pkgconfig/gstreamer-plugins-good-uninstalled.pc + rm -f po/Makefile.in + rm -f po/POTFILES + rm -f tests/check/elements/.dirstamp + rm -f win32/common/config.h-new + rm -f _stdint.h + rm -f config.h + rm -f config.log + rm -f config.status + rm -f libtool + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + rm -f $${f%.in}; \ + done + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp + $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_install --sourcedir debian/tmp --list-missing +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms + dh_perl + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..bd0ac08 --- /dev/null +++ b/depcomp @@ -0,0 +1,688 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2011-12-04.11; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, +# 2011 Free Software Foundation, Inc. + +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test "$stat" = 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/ \1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/ / + G + p +}' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/docs/Makefile.am b/docs/Makefile.am new file mode 100644 index 0000000..10847b5 --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,15 @@ +if ENABLE_PLUGIN_DOCS +PLUGIN_DOCS_DIRS = plugins +else +PLUGIN_DOCS_DIRS = +endif + +SUBDIRS = $(PLUGIN_DOCS_DIRS) +DIST_SUBDIRS = plugins + +EXTRA_DIST = \ + random/ChangeLog-0.8 \ + version.entities.in + +upload: + @if test "x$(SUBDIRS)" != x; then for a in $(SUBDIRS); do cd $$a; make upload; cd ..; done; fi diff --git a/docs/Makefile.in b/docs/Makefile.in new file mode 100644 index 0000000..71c1d5b --- /dev/null +++ b/docs/Makefile.in @@ -0,0 +1,819 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = docs +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/version.entities.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = version.entities +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@ENABLE_PLUGIN_DOCS_FALSE@PLUGIN_DOCS_DIRS = +@ENABLE_PLUGIN_DOCS_TRUE@PLUGIN_DOCS_DIRS = plugins +SUBDIRS = $(PLUGIN_DOCS_DIRS) +DIST_SUBDIRS = plugins +EXTRA_DIST = \ + random/ChangeLog-0.8 \ + version.entities.in + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +version.entities: $(top_builddir)/config.status $(srcdir)/version.entities.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +upload: + @if test "x$(SUBDIRS)" != x; then for a in $(SUBDIRS); do cd $$a; make upload; cd ..; done; fi + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am new file mode 100644 index 0000000..1fc2e07 --- /dev/null +++ b/docs/plugins/Makefile.am @@ -0,0 +1,251 @@ +GST_DOC_SCANOBJ = $(top_srcdir)/common/gstdoc-scangobj + +## Process this file with automake to produce Makefile.in + +# The name of the module, e.g. 'glib'. +#DOC_MODULE=gst-plugins-libs-@GST_MAJORMINOR@ +MODULE=gst-plugins-good +DOC_MODULE=$(MODULE)-plugins + +# for upload-doc.mak +DOC=$(MODULE)-plugins +FORMATS=html +html: html-build.stamp +include $(top_srcdir)/common/upload-doc.mak + +# The top-level SGML file. Change it if you want. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# The directory containing the source code. +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting functions and macros. +DOC_SOURCE_DIR = $(top_srcdir)/gst $(top_srcdir)/ext $(top_srcdir)/sys + +# Extra options to supply to gtkdoc-scan. +SCAN_OPTIONS= + +# Extra options to supply to gtkdoc-mkdb. +MKDB_OPTIONS=--sgml-mode --source-suffixes=c,h,cc + +# Extra options to supply to gtkdoc-fixref. +FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \ + --extra-dir=$(GST_PREFIX)/share/gtk-doc/html \ + --extra-dir=$(GSTPB_PREFIX)/share/gtk-doc/html + +# Used for dependencies. +HFILE_GLOB= \ + $(top_srcdir)/gst/*/*.h $(top_srcdir)/ext/*/*.h $(top_srcdir)/sys/*/*.h +CFILE_GLOB= \ + $(top_srcdir)/gst/*/*.c $(top_srcdir)/ext/*/*.c $(top_srcdir)/sys/*/*.c \ + $(top_srcdir)/ext/*/*.cc $(top_srcdir)/sys/*/*.m + +# Header files to ignore when scanning. +IGNORE_HFILES = +IGNORE_CFILES = + +# we add all .h files of elements that have signals/args we want +# sadly this also pulls in the private methods - maybe we should +# move those around in the source ? +# also, we should add some stuff here conditionally based on whether +# or not the plugin will actually build +# but I'm not sure about that - it might be this Just Works given that +# the registry won't have the element + +EXTRA_HFILES = \ + $(top_srcdir)/ext/aalib/gstaasink.h \ + $(top_srcdir)/ext/annodex/gstcmmldec.h \ + $(top_srcdir)/ext/annodex/gstcmmlenc.h \ + $(top_srcdir)/ext/cairo/gsttextoverlay.h \ + $(top_srcdir)/ext/cairo/gsttimeoverlay.h \ + $(top_srcdir)/ext/cairo/gstcairorender.h \ + $(top_srcdir)/ext/cairo/gstcairooverlay.h \ + $(top_srcdir)/ext/dv/gstdvdec.h \ + $(top_srcdir)/ext/dv/gstdvdemux.h \ + $(top_srcdir)/ext/esd/esdsink.h \ + $(top_srcdir)/ext/flac/gstflacdec.h \ + $(top_srcdir)/ext/flac/gstflacenc.h \ + $(top_srcdir)/ext/flac/gstflactag.h \ + $(top_srcdir)/ext/gconf/gstgconfaudiosrc.h \ + $(top_srcdir)/ext/gconf/gstgconfaudiosink.h \ + $(top_srcdir)/ext/gconf/gstgconfvideosrc.h \ + $(top_srcdir)/ext/gconf/gstgconfvideosink.h \ + $(top_srcdir)/ext/gdk_pixbuf/gstgdkpixbufsink.h \ + $(top_srcdir)/ext/hal/gsthalaudiosink.h \ + $(top_srcdir)/ext/hal/gsthalaudiosrc.h \ + $(top_srcdir)/ext/jack/gstjackaudiosrc.h \ + $(top_srcdir)/ext/jack/gstjackaudiosink.h \ + $(top_srcdir)/ext/jpeg/gstjpegdec.h \ + $(top_srcdir)/ext/jpeg/gstjpegenc.h \ + $(top_srcdir)/ext/jpeg/gstsmokedec.h \ + $(top_srcdir)/ext/jpeg/gstsmokeenc.h \ + $(top_srcdir)/ext/libcaca/gstcacasink.h \ + $(top_srcdir)/ext/libpng/gstpngdec.h \ + $(top_srcdir)/ext/libpng/gstpngenc.h \ + $(top_srcdir)/ext/raw1394/gstdv1394src.h \ + $(top_srcdir)/ext/raw1394/gsthdv1394src.h \ + $(top_srcdir)/ext/soup/gstsouphttpsrc.h \ + $(top_srcdir)/ext/taglib/gstapev2mux.h \ + $(top_srcdir)/ext/taglib/gstid3v2mux.h \ + $(top_srcdir)/ext/pulse/pulsesink.h \ + $(top_srcdir)/ext/pulse/pulsesrc.h \ + $(top_srcdir)/ext/pulse/pulsemixer.h \ + $(top_srcdir)/ext/speex/gstspeexenc.h \ + $(top_srcdir)/ext/speex/gstspeexdec.h \ + $(top_srcdir)/ext/wavpack/gstwavpackdec.h \ + $(top_srcdir)/ext/wavpack/gstwavpackenc.h \ + $(top_srcdir)/ext/wavpack/gstwavpackparse.h \ + $(top_srcdir)/gst/alpha/gstalpha.h \ + $(top_srcdir)/gst/alpha/gstalphacolor.h \ + $(top_srcdir)/gst/apetag/gstapedemux.h \ + $(top_srcdir)/gst/audiofx/audioamplify.h \ + $(top_srcdir)/gst/audiofx/audioecho.h \ + $(top_srcdir)/gst/audiofx/audiodynamic.h \ + $(top_srcdir)/gst/audiofx/audioinvert.h \ + $(top_srcdir)/gst/audiofx/audiokaraoke.h \ + $(top_srcdir)/gst/audiofx/audiopanorama.h \ + $(top_srcdir)/gst/audiofx/audiocheblimit.h \ + $(top_srcdir)/gst/audiofx/audiochebband.h \ + $(top_srcdir)/gst/audiofx/audioiirfilter.h \ + $(top_srcdir)/gst/audiofx/audiowsincband.h \ + $(top_srcdir)/gst/audiofx/audiowsinclimit.h \ + $(top_srcdir)/gst/audiofx/audiofirfilter.h \ + $(top_srcdir)/gst/audioparsers/gstaacparse.h \ + $(top_srcdir)/gst/audioparsers/gstac3parse.h \ + $(top_srcdir)/gst/audioparsers/gstamrparse.h \ + $(top_srcdir)/gst/audioparsers/gstflacparse.h \ + $(top_srcdir)/gst/audioparsers/gstdcaparse.h \ + $(top_srcdir)/gst/audioparsers/gstmpegaudioparse.h \ + $(top_srcdir)/gst/auparse/gstauparse.h \ + $(top_srcdir)/gst/autodetect/gstautoaudiosink.h \ + $(top_srcdir)/gst/autodetect/gstautoaudiosrc.h \ + $(top_srcdir)/gst/autodetect/gstautovideosink.h \ + $(top_srcdir)/gst/autodetect/gstautovideosrc.h \ + $(top_srcdir)/gst/avi/gstavidemux.h \ + $(top_srcdir)/gst/avi/gstavimux.h \ + $(top_srcdir)/gst/avi/gstavisubtitle.h \ + $(top_srcdir)/gst/cutter/gstcutter.h \ + $(top_srcdir)/gst/debugutils/gstcapssetter.h \ + $(top_srcdir)/gst/debugutils/gsttaginject.h \ + $(top_srcdir)/gst/debugutils/progressreport.h \ + $(top_srcdir)/gst/deinterlace/gstdeinterlace.h \ + $(top_srcdir)/gst/effectv/gstaging.h \ + $(top_srcdir)/gst/effectv/gstdice.h \ + $(top_srcdir)/gst/effectv/gstedge.h \ + $(top_srcdir)/gst/effectv/gstquark.h \ + $(top_srcdir)/gst/effectv/gstrev.h \ + $(top_srcdir)/gst/effectv/gstshagadelic.h \ + $(top_srcdir)/gst/effectv/gstvertigo.h \ + $(top_srcdir)/gst/effectv/gstwarp.h \ + $(top_srcdir)/gst/effectv/gststreak.h \ + $(top_srcdir)/gst/effectv/gstripple.h \ + $(top_srcdir)/gst/effectv/gstop.h \ + $(top_srcdir)/gst/effectv/gstradioac.h \ + $(top_srcdir)/gst/equalizer/gstiirequalizer.h \ + $(top_srcdir)/gst/equalizer/gstiirequalizer3bands.h \ + $(top_srcdir)/gst/equalizer/gstiirequalizer10bands.h \ + $(top_srcdir)/gst/equalizer/gstiirequalizernbands.h \ + $(top_srcdir)/gst/flv/gstflvdemux.h \ + $(top_srcdir)/gst/flv/gstflvmux.h \ + $(top_srcdir)/gst/flx/gstflxdec.h \ + $(top_srcdir)/gst/goom/gstgoom.h \ + $(top_srcdir)/gst/goom2k1/gstgoom.h \ + $(top_srcdir)/gst/law/alaw-decode.h \ + $(top_srcdir)/gst/law/alaw-encode.h \ + $(top_srcdir)/gst/law/mulaw-decode.h \ + $(top_srcdir)/gst/law/mulaw-encode.h \ + $(top_srcdir)/gst/icydemux/gsticydemux.h \ + $(top_srcdir)/gst/id3demux/gstid3demux.h \ + $(top_srcdir)/gst/imagefreeze/gstimagefreeze.h \ + $(top_srcdir)/gst/interleave/deinterleave.h \ + $(top_srcdir)/gst/interleave/interleave.h \ + $(top_srcdir)/gst/level/gstlevel.h \ + $(top_srcdir)/gst/matroska/matroska-demux.h \ + $(top_srcdir)/gst/matroska/matroska-mux.h \ + $(top_srcdir)/gst/matroska/webm-mux.h \ + $(top_srcdir)/gst/monoscope/gstmonoscope.h \ + $(top_srcdir)/gst/multifile/gstmultifilesink.h \ + $(top_srcdir)/gst/multifile/gstmultifilesrc.h \ + $(top_srcdir)/gst/multifile/gstsplitfilesrc.h \ + $(top_srcdir)/gst/multipart/multipartdemux.h \ + $(top_srcdir)/gst/multipart/multipartmux.h \ + $(top_srcdir)/gst/isomp4/qtdemux.h \ + $(top_srcdir)/gst/isomp4/gstqtmux.h \ + $(top_srcdir)/gst/isomp4/gstqtmux-doc.h \ + $(top_srcdir)/gst/replaygain/gstrganalysis.h \ + $(top_srcdir)/gst/replaygain/gstrglimiter.h \ + $(top_srcdir)/gst/replaygain/gstrgvolume.h \ + $(top_srcdir)/gst/rtp/gstrtpj2kpay.h \ + $(top_srcdir)/gst/rtp/gstrtpjpegpay.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpbin.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpjitterbuffer.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpptdemux.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpsession.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpssrcdemux.h \ + $(top_srcdir)/gst/rtsp/gstrtpdec.h \ + $(top_srcdir)/gst/rtsp/gstrtspsrc.h \ + $(top_srcdir)/gst/shapewipe/gstshapewipe.h \ + $(top_srcdir)/gst/smpte/gstsmpte.h \ + $(top_srcdir)/gst/smpte/gstsmptealpha.h \ + $(top_srcdir)/gst/spectrum/gstspectrum.h \ + $(top_srcdir)/gst/udp/gstmultiudpsink.h \ + $(top_srcdir)/gst/udp/gstudpsrc.h \ + $(top_srcdir)/gst/udp/gstudpsink.h \ + $(top_srcdir)/gst/videobox/gstvideobox.h \ + $(top_srcdir)/gst/videocrop/gstvideocrop.h \ + $(top_srcdir)/gst/videocrop/gstaspectratiocrop.h \ + $(top_srcdir)/gst/videofilter/gstgamma.h \ + $(top_srcdir)/gst/videofilter/gstvideobalance.h \ + $(top_srcdir)/gst/videofilter/gstvideoflip.h \ + $(top_srcdir)/gst/videomixer/videomixer.h \ + $(top_srcdir)/gst/videomixer/videomixerpad.h \ + $(top_srcdir)/gst/videomixer/videomixer2.h \ + $(top_srcdir)/gst/videomixer/videomixer2pad.h \ + $(top_srcdir)/gst/wavenc/gstwavenc.h \ + $(top_srcdir)/gst/wavparse/gstwavparse.h \ + $(top_srcdir)/gst/y4m/gsty4mencode.h \ + $(top_srcdir)/sys/directsound/gstdirectsoundsink.h \ + $(top_srcdir)/sys/oss4/oss4-mixer.h \ + $(top_srcdir)/sys/oss4/oss4-sink.h \ + $(top_srcdir)/sys/oss4/oss4-source.h \ + $(top_srcdir)/sys/oss/gstossmixerelement.h \ + $(top_srcdir)/sys/oss/gstosssink.h \ + $(top_srcdir)/sys/oss/gstosssrc.h \ + $(top_srcdir)/sys/osxaudio/gstosxaudiosrc.h \ + $(top_srcdir)/sys/osxaudio/gstosxaudiosink.h \ + $(top_srcdir)/sys/osxvideo/osxvideosink.h \ + $(top_srcdir)/sys/v4l2/gstv4l2src.h \ + $(top_srcdir)/sys/v4l2/gstv4l2sink.h \ + $(top_srcdir)/sys/v4l2/gstv4l2radio.h \ + $(top_srcdir)/sys/waveform/gstwaveformsink.h \ + $(top_srcdir)/sys/ximage/gstximagesrc.h + +# example code that needs to be converted to xml and placed in xml/ +EXAMPLE_CFILES = \ + $(top_srcdir)/tests/examples/level/level-example.c \ + $(top_srcdir)/tests/examples/spectrum/spectrum-example.c \ + $(top_srcdir)/tests/examples/audiofx/firfilter-example.c \ + $(top_srcdir)/tests/examples/audiofx/iirfilter-example.c + +# Images to copy into HTML directory. +HTML_IMAGES = + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +content_files = + +# Other files to distribute. +extra_files = + +# CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib +# contains GtkObjects/GObjects and you want to document signals and properties. +GTKDOC_CFLAGS = $(GST_BASE_CFLAGS) -I$(top_builddir) +GTKDOC_LIBS = $(GST_BASE_LIBS) + +GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC) +GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC) + +# If you need to override some of the declarations, place them in this file +# and uncomment this line. +#DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt +DOC_OVERRIDES = + +include $(top_srcdir)/common/gtk-doc-plugins.mak diff --git a/docs/plugins/Makefile.in b/docs/plugins/Makefile.in new file mode 100644 index 0000000..b13d47a --- /dev/null +++ b/docs/plugins/Makefile.in @@ -0,0 +1,1309 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# this snippet is to be included by both our docbook manuals +# and gtk-doc API references + +# it adds an upload target to each of these dir's Makefiles + +# each Makefile.am should define the following variables: +# - DOC: the base name of the documentation +# (faq, manual, pwg, gstreamer, gstreamer-libs) +# - FORMATS: the formats in which DOC is output +# (html ps pdf) + +# if you want to use it, make sure your $HOME/.ssh/config file contains the +# correct User entry for the Host entry for the DOC_SERVER + +# This is an include file specifically tuned for building documentation +# for GStreamer plug-ins +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/common/gtk-doc-plugins.mak \ + $(top_srcdir)/common/upload-doc.mak +subdir = docs/plugins +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +GST_DOC_SCANOBJ = $(top_srcdir)/common/gstdoc-scangobj + +# The name of the module, e.g. 'glib'. +#DOC_MODULE=gst-plugins-libs-@GST_MAJORMINOR@ +MODULE = gst-plugins-good +DOC_MODULE = $(MODULE)-plugins + +# for upload-doc.mak +DOC = $(MODULE)-plugins +FORMATS = html + +# these variables define the location of the online docs +DOC_SERVER = gstreamer.freedesktop.org +DOC_BASE = /srv/gstreamer.freedesktop.org/www/data/doc +DOC_URL = $(DOC_SERVER):$(DOC_BASE) + +# The top-level SGML file. Change it if you want. +DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml + +# The directory containing the source code. +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting functions and macros. +DOC_SOURCE_DIR = $(top_srcdir)/gst $(top_srcdir)/ext $(top_srcdir)/sys + +# Extra options to supply to gtkdoc-scan. +SCAN_OPTIONS = + +# Extra options to supply to gtkdoc-mkdb. +MKDB_OPTIONS = --sgml-mode --source-suffixes=c,h,cc + +# Extra options to supply to gtkdoc-fixref. +FIXXREF_OPTIONS = --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \ + --extra-dir=$(GST_PREFIX)/share/gtk-doc/html \ + --extra-dir=$(GSTPB_PREFIX)/share/gtk-doc/html + + +# Used for dependencies. +HFILE_GLOB = \ + $(top_srcdir)/gst/*/*.h $(top_srcdir)/ext/*/*.h $(top_srcdir)/sys/*/*.h + +CFILE_GLOB = \ + $(top_srcdir)/gst/*/*.c $(top_srcdir)/ext/*/*.c $(top_srcdir)/sys/*/*.c \ + $(top_srcdir)/ext/*/*.cc $(top_srcdir)/sys/*/*.m + + +# Header files to ignore when scanning. +IGNORE_HFILES = +IGNORE_CFILES = + +# we add all .h files of elements that have signals/args we want +# sadly this also pulls in the private methods - maybe we should +# move those around in the source ? +# also, we should add some stuff here conditionally based on whether +# or not the plugin will actually build +# but I'm not sure about that - it might be this Just Works given that +# the registry won't have the element +EXTRA_HFILES = \ + $(top_srcdir)/ext/aalib/gstaasink.h \ + $(top_srcdir)/ext/annodex/gstcmmldec.h \ + $(top_srcdir)/ext/annodex/gstcmmlenc.h \ + $(top_srcdir)/ext/cairo/gsttextoverlay.h \ + $(top_srcdir)/ext/cairo/gsttimeoverlay.h \ + $(top_srcdir)/ext/cairo/gstcairorender.h \ + $(top_srcdir)/ext/cairo/gstcairooverlay.h \ + $(top_srcdir)/ext/dv/gstdvdec.h \ + $(top_srcdir)/ext/dv/gstdvdemux.h \ + $(top_srcdir)/ext/esd/esdsink.h \ + $(top_srcdir)/ext/flac/gstflacdec.h \ + $(top_srcdir)/ext/flac/gstflacenc.h \ + $(top_srcdir)/ext/flac/gstflactag.h \ + $(top_srcdir)/ext/gconf/gstgconfaudiosrc.h \ + $(top_srcdir)/ext/gconf/gstgconfaudiosink.h \ + $(top_srcdir)/ext/gconf/gstgconfvideosrc.h \ + $(top_srcdir)/ext/gconf/gstgconfvideosink.h \ + $(top_srcdir)/ext/gdk_pixbuf/gstgdkpixbufsink.h \ + $(top_srcdir)/ext/hal/gsthalaudiosink.h \ + $(top_srcdir)/ext/hal/gsthalaudiosrc.h \ + $(top_srcdir)/ext/jack/gstjackaudiosrc.h \ + $(top_srcdir)/ext/jack/gstjackaudiosink.h \ + $(top_srcdir)/ext/jpeg/gstjpegdec.h \ + $(top_srcdir)/ext/jpeg/gstjpegenc.h \ + $(top_srcdir)/ext/jpeg/gstsmokedec.h \ + $(top_srcdir)/ext/jpeg/gstsmokeenc.h \ + $(top_srcdir)/ext/libcaca/gstcacasink.h \ + $(top_srcdir)/ext/libpng/gstpngdec.h \ + $(top_srcdir)/ext/libpng/gstpngenc.h \ + $(top_srcdir)/ext/raw1394/gstdv1394src.h \ + $(top_srcdir)/ext/raw1394/gsthdv1394src.h \ + $(top_srcdir)/ext/soup/gstsouphttpsrc.h \ + $(top_srcdir)/ext/taglib/gstapev2mux.h \ + $(top_srcdir)/ext/taglib/gstid3v2mux.h \ + $(top_srcdir)/ext/pulse/pulsesink.h \ + $(top_srcdir)/ext/pulse/pulsesrc.h \ + $(top_srcdir)/ext/pulse/pulsemixer.h \ + $(top_srcdir)/ext/speex/gstspeexenc.h \ + $(top_srcdir)/ext/speex/gstspeexdec.h \ + $(top_srcdir)/ext/wavpack/gstwavpackdec.h \ + $(top_srcdir)/ext/wavpack/gstwavpackenc.h \ + $(top_srcdir)/ext/wavpack/gstwavpackparse.h \ + $(top_srcdir)/gst/alpha/gstalpha.h \ + $(top_srcdir)/gst/alpha/gstalphacolor.h \ + $(top_srcdir)/gst/apetag/gstapedemux.h \ + $(top_srcdir)/gst/audiofx/audioamplify.h \ + $(top_srcdir)/gst/audiofx/audioecho.h \ + $(top_srcdir)/gst/audiofx/audiodynamic.h \ + $(top_srcdir)/gst/audiofx/audioinvert.h \ + $(top_srcdir)/gst/audiofx/audiokaraoke.h \ + $(top_srcdir)/gst/audiofx/audiopanorama.h \ + $(top_srcdir)/gst/audiofx/audiocheblimit.h \ + $(top_srcdir)/gst/audiofx/audiochebband.h \ + $(top_srcdir)/gst/audiofx/audioiirfilter.h \ + $(top_srcdir)/gst/audiofx/audiowsincband.h \ + $(top_srcdir)/gst/audiofx/audiowsinclimit.h \ + $(top_srcdir)/gst/audiofx/audiofirfilter.h \ + $(top_srcdir)/gst/audioparsers/gstaacparse.h \ + $(top_srcdir)/gst/audioparsers/gstac3parse.h \ + $(top_srcdir)/gst/audioparsers/gstamrparse.h \ + $(top_srcdir)/gst/audioparsers/gstflacparse.h \ + $(top_srcdir)/gst/audioparsers/gstdcaparse.h \ + $(top_srcdir)/gst/audioparsers/gstmpegaudioparse.h \ + $(top_srcdir)/gst/auparse/gstauparse.h \ + $(top_srcdir)/gst/autodetect/gstautoaudiosink.h \ + $(top_srcdir)/gst/autodetect/gstautoaudiosrc.h \ + $(top_srcdir)/gst/autodetect/gstautovideosink.h \ + $(top_srcdir)/gst/autodetect/gstautovideosrc.h \ + $(top_srcdir)/gst/avi/gstavidemux.h \ + $(top_srcdir)/gst/avi/gstavimux.h \ + $(top_srcdir)/gst/avi/gstavisubtitle.h \ + $(top_srcdir)/gst/cutter/gstcutter.h \ + $(top_srcdir)/gst/debugutils/gstcapssetter.h \ + $(top_srcdir)/gst/debugutils/gsttaginject.h \ + $(top_srcdir)/gst/debugutils/progressreport.h \ + $(top_srcdir)/gst/deinterlace/gstdeinterlace.h \ + $(top_srcdir)/gst/effectv/gstaging.h \ + $(top_srcdir)/gst/effectv/gstdice.h \ + $(top_srcdir)/gst/effectv/gstedge.h \ + $(top_srcdir)/gst/effectv/gstquark.h \ + $(top_srcdir)/gst/effectv/gstrev.h \ + $(top_srcdir)/gst/effectv/gstshagadelic.h \ + $(top_srcdir)/gst/effectv/gstvertigo.h \ + $(top_srcdir)/gst/effectv/gstwarp.h \ + $(top_srcdir)/gst/effectv/gststreak.h \ + $(top_srcdir)/gst/effectv/gstripple.h \ + $(top_srcdir)/gst/effectv/gstop.h \ + $(top_srcdir)/gst/effectv/gstradioac.h \ + $(top_srcdir)/gst/equalizer/gstiirequalizer.h \ + $(top_srcdir)/gst/equalizer/gstiirequalizer3bands.h \ + $(top_srcdir)/gst/equalizer/gstiirequalizer10bands.h \ + $(top_srcdir)/gst/equalizer/gstiirequalizernbands.h \ + $(top_srcdir)/gst/flv/gstflvdemux.h \ + $(top_srcdir)/gst/flv/gstflvmux.h \ + $(top_srcdir)/gst/flx/gstflxdec.h \ + $(top_srcdir)/gst/goom/gstgoom.h \ + $(top_srcdir)/gst/goom2k1/gstgoom.h \ + $(top_srcdir)/gst/law/alaw-decode.h \ + $(top_srcdir)/gst/law/alaw-encode.h \ + $(top_srcdir)/gst/law/mulaw-decode.h \ + $(top_srcdir)/gst/law/mulaw-encode.h \ + $(top_srcdir)/gst/icydemux/gsticydemux.h \ + $(top_srcdir)/gst/id3demux/gstid3demux.h \ + $(top_srcdir)/gst/imagefreeze/gstimagefreeze.h \ + $(top_srcdir)/gst/interleave/deinterleave.h \ + $(top_srcdir)/gst/interleave/interleave.h \ + $(top_srcdir)/gst/level/gstlevel.h \ + $(top_srcdir)/gst/matroska/matroska-demux.h \ + $(top_srcdir)/gst/matroska/matroska-mux.h \ + $(top_srcdir)/gst/matroska/webm-mux.h \ + $(top_srcdir)/gst/monoscope/gstmonoscope.h \ + $(top_srcdir)/gst/multifile/gstmultifilesink.h \ + $(top_srcdir)/gst/multifile/gstmultifilesrc.h \ + $(top_srcdir)/gst/multifile/gstsplitfilesrc.h \ + $(top_srcdir)/gst/multipart/multipartdemux.h \ + $(top_srcdir)/gst/multipart/multipartmux.h \ + $(top_srcdir)/gst/isomp4/qtdemux.h \ + $(top_srcdir)/gst/isomp4/gstqtmux.h \ + $(top_srcdir)/gst/isomp4/gstqtmux-doc.h \ + $(top_srcdir)/gst/replaygain/gstrganalysis.h \ + $(top_srcdir)/gst/replaygain/gstrglimiter.h \ + $(top_srcdir)/gst/replaygain/gstrgvolume.h \ + $(top_srcdir)/gst/rtp/gstrtpj2kpay.h \ + $(top_srcdir)/gst/rtp/gstrtpjpegpay.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpbin.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpjitterbuffer.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpptdemux.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpsession.h \ + $(top_srcdir)/gst/rtpmanager/gstrtpssrcdemux.h \ + $(top_srcdir)/gst/rtsp/gstrtpdec.h \ + $(top_srcdir)/gst/rtsp/gstrtspsrc.h \ + $(top_srcdir)/gst/shapewipe/gstshapewipe.h \ + $(top_srcdir)/gst/smpte/gstsmpte.h \ + $(top_srcdir)/gst/smpte/gstsmptealpha.h \ + $(top_srcdir)/gst/spectrum/gstspectrum.h \ + $(top_srcdir)/gst/udp/gstmultiudpsink.h \ + $(top_srcdir)/gst/udp/gstudpsrc.h \ + $(top_srcdir)/gst/udp/gstudpsink.h \ + $(top_srcdir)/gst/videobox/gstvideobox.h \ + $(top_srcdir)/gst/videocrop/gstvideocrop.h \ + $(top_srcdir)/gst/videocrop/gstaspectratiocrop.h \ + $(top_srcdir)/gst/videofilter/gstgamma.h \ + $(top_srcdir)/gst/videofilter/gstvideobalance.h \ + $(top_srcdir)/gst/videofilter/gstvideoflip.h \ + $(top_srcdir)/gst/videomixer/videomixer.h \ + $(top_srcdir)/gst/videomixer/videomixerpad.h \ + $(top_srcdir)/gst/videomixer/videomixer2.h \ + $(top_srcdir)/gst/videomixer/videomixer2pad.h \ + $(top_srcdir)/gst/wavenc/gstwavenc.h \ + $(top_srcdir)/gst/wavparse/gstwavparse.h \ + $(top_srcdir)/gst/y4m/gsty4mencode.h \ + $(top_srcdir)/sys/directsound/gstdirectsoundsink.h \ + $(top_srcdir)/sys/oss4/oss4-mixer.h \ + $(top_srcdir)/sys/oss4/oss4-sink.h \ + $(top_srcdir)/sys/oss4/oss4-source.h \ + $(top_srcdir)/sys/oss/gstossmixerelement.h \ + $(top_srcdir)/sys/oss/gstosssink.h \ + $(top_srcdir)/sys/oss/gstosssrc.h \ + $(top_srcdir)/sys/osxaudio/gstosxaudiosrc.h \ + $(top_srcdir)/sys/osxaudio/gstosxaudiosink.h \ + $(top_srcdir)/sys/osxvideo/osxvideosink.h \ + $(top_srcdir)/sys/v4l2/gstv4l2src.h \ + $(top_srcdir)/sys/v4l2/gstv4l2sink.h \ + $(top_srcdir)/sys/v4l2/gstv4l2radio.h \ + $(top_srcdir)/sys/waveform/gstwaveformsink.h \ + $(top_srcdir)/sys/ximage/gstximagesrc.h + + +# example code that needs to be converted to xml and placed in xml/ +EXAMPLE_CFILES = \ + $(top_srcdir)/tests/examples/level/level-example.c \ + $(top_srcdir)/tests/examples/spectrum/spectrum-example.c \ + $(top_srcdir)/tests/examples/audiofx/firfilter-example.c \ + $(top_srcdir)/tests/examples/audiofx/iirfilter-example.c + + +# Images to copy into HTML directory. +HTML_IMAGES = + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +content_files = + +# Other files to distribute. +extra_files = + +# CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib +# contains GtkObjects/GObjects and you want to document signals and properties. +GTKDOC_CFLAGS = $(GST_BASE_CFLAGS) -I$(top_builddir) +GTKDOC_LIBS = $(GST_BASE_LIBS) +GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) +GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) + +# If you need to override some of the declarations, place them in this file +# and uncomment this line. +#DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt +DOC_OVERRIDES = + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +# thomas: make docs parallel installable +TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@ +MAINTAINER_DOC_STAMPS = \ + scanobj-build.stamp + +EXTRA_DIST = \ + $(MAINTAINER_DOC_STAMPS) \ + $(srcdir)/inspect/*.xml \ + $(SCANOBJ_FILES) \ + $(content_files) \ + $(extra_files) \ + $(HTML_IMAGES) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_OVERRIDES) \ + $(DOC_MODULE)-sections.txt + + +# we don't add scanobj-build.stamp here since they are built manually by docs +# maintainers and result is commited to git +DOC_STAMPS = \ + scan-build.stamp \ + tmpl-build.stamp \ + sgml-build.stamp \ + html-build.stamp \ + scan.stamp \ + tmpl.stamp \ + sgml.stamp \ + html.stamp + + +# files generated/updated by gtkdoc-scangobj +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals \ + $(DOC_MODULE).types + +SCANOBJ_FILES_O = \ + .libs/$(DOC_MODULE)-scan.o + + +# files generated/updated by gtkdoc-scan +SCAN_FILES = \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt \ + $(DOC_MODULE)-decl.txt \ + $(DOC_MODULE)-decl-list.txt + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = \ + $(SCANOBJ_FILES_O) \ + $(REPORT_FILES) \ + $(DOC_STAMPS) \ + inspect-registry.xml + +INSPECT_DIR = inspect + +### inspect GStreamer plug-ins; done by documentation maintainer ### + +# only look at the plugins in this module when building inspect .xml stuff +@ENABLE_GTK_DOC_TRUE@INSPECT_REGISTRY = $(top_builddir)/docs/plugins/inspect-registry.xml +@ENABLE_GTK_DOC_TRUE@INSPECT_ENVIRONMENT = \ +@ENABLE_GTK_DOC_TRUE@ LC_ALL=C \ +@ENABLE_GTK_DOC_TRUE@ GST_PLUGIN_SYSTEM_PATH= \ +@ENABLE_GTK_DOC_TRUE@ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src:$(top_builddir)/gnl \ +@ENABLE_GTK_DOC_TRUE@ GST_REGISTRY=$(INSPECT_REGISTRY) \ +@ENABLE_GTK_DOC_TRUE@ PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ +@ENABLE_GTK_DOC_TRUE@ $(INSPECT_EXTRA_ENVIRONMENT) + +MAINTAINERCLEANFILES = $(MAINTAINER_DOC_STAMPS) + +# wildcard is apparently not portable to other makes, hence the use of find +inspect_files = $(shell find $(srcdir)/$(INSPECT_DIR) -name '*.xml') +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/upload-doc.mak $(top_srcdir)/common/gtk-doc-plugins.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/plugins/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/plugins/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/upload-doc.mak $(top_srcdir)/common/gtk-doc-plugins.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-libtool clean-local dist-hook distclean \ + distclean-generic distclean-libtool distclean-local distdir \ + dvi dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-local + +html: html-build.stamp + +upload: $(FORMATS) + @if echo $(FORMATS) | grep html > /dev/null; then \ + echo "Preparing docs for upload (rebasing cross-references) ..." ; \ + if test x$(builddir) != x$(srcdir); then \ + echo "make upload can only be used if srcdir == builddir"; \ + exit 1; \ + fi; \ + # gtkdoc-rebase sometimes gets confused, so reset everything to \ + # local links before rebasing to online links \ + gtkdoc-rebase --html-dir=$(builddir)/html 2>/dev/null 2>/dev/null ; \ + rebase=`gtkdoc-rebase --verbose --online --html-dir=$(builddir)/html` ; \ + echo "$$rebase" | grep -e "On-*line"; \ + for req in glib gobject gstreamer gstreamer-libs gst-plugins-base-libs; do \ + if ! ( echo "$$rebase" | grep -i -e "On-*line.*/$$req/" ); then \ + echo "===============================================================================" ; \ + echo " Could not determine online location for $$req docs. Cross-referencing will be " ; \ + echo " broken, so not uploading. Make sure the library's gtk-doc documentation is " ; \ + echo " installed somewhere in /usr/share/gtk-doc. " ; \ + echo "===============================================================================" ; \ + exit 1; \ + fi; \ + done; \ + export SRC="$$SRC html"; \ + fi; \ + if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \ + if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \ + \ + # upload releases to both 0.10.X/ and head/ subdirectories \ + if test "x$(PACKAGE_VERSION_NANO)" = x0; then \ + export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \ + echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) mkdir -p $$DIR; \ + rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ + fi; \ + \ + export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \ + echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) mkdir -p $$DIR; \ + rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ + \ + if echo $(FORMATS) | grep html > /dev/null; then \ + echo "Un-preparing docs for upload (rebasing cross-references) ..." ; \ + gtkdoc-rebase --html-dir=$(builddir)/html ; \ + fi; \ + echo Done + +help: + @echo + @echo "If you are a doc maintainer, run 'make update' to update" + @echo "the documentation files maintained in git" + @echo + @echo Other useful make targets: + @echo + @echo check-inspected-versions: make sure the inspected plugin info + @echo is up to date before a release + @echo + +# update the stuff maintained by doc maintainers +update: + $(MAKE) scanobj-update + $(MAKE) check-outdated-docs + +@ENABLE_GTK_DOC_TRUE@all-local: html-build.stamp + +#### scan gobjects; done by documentation maintainer #### +@ENABLE_GTK_DOC_TRUE@scanobj-update: +@ENABLE_GTK_DOC_TRUE@ -rm scanobj-build.stamp +@ENABLE_GTK_DOC_TRUE@ $(MAKE) scanobj-build.stamp + +# gstdoc-scanobj produces 5 output files (.new) +# scangobj-merge.py merges them into the file which we commit later +# TODO: also merge the hierarchy +@ENABLE_GTK_DOC_TRUE@scanobj-build.stamp: $(SCANOBJ_DEPS) $(basefiles) +@ENABLE_GTK_DOC_TRUE@ @echo " DOC Introspecting gobjects" +@ENABLE_GTK_DOC_TRUE@ @if test x"$(srcdir)" != x. ; then \ +@ENABLE_GTK_DOC_TRUE@ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ +@ENABLE_GTK_DOC_TRUE@ do \ +@ENABLE_GTK_DOC_TRUE@ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ +@ENABLE_GTK_DOC_TRUE@ done; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ mkdir -p $(INSPECT_DIR); \ +@ENABLE_GTK_DOC_TRUE@ scanobj_options=""; \ +@ENABLE_GTK_DOC_TRUE@ if test "x$(V)" = "x1"; then \ +@ENABLE_GTK_DOC_TRUE@ scanobj_options="--verbose"; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ $(INSPECT_ENVIRONMENT) \ +@ENABLE_GTK_DOC_TRUE@ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \ +@ENABLE_GTK_DOC_TRUE@ CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS) $(WARNING_CFLAGS)" \ +@ENABLE_GTK_DOC_TRUE@ LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ +@ENABLE_GTK_DOC_TRUE@ $(GST_DOC_SCANOBJ) $$scanobj_options --type-init-func="gst_init(NULL,NULL)" \ +@ENABLE_GTK_DOC_TRUE@ --module=$(DOC_MODULE) --source=$(PACKAGE) --inspect-dir=$(INSPECT_DIR) && \ +@ENABLE_GTK_DOC_TRUE@ echo " DOC Merging introspection data" && \ +@ENABLE_GTK_DOC_TRUE@ $(PYTHON) \ +@ENABLE_GTK_DOC_TRUE@ $(top_srcdir)/common/scangobj-merge.py $(DOC_MODULE); \ +@ENABLE_GTK_DOC_TRUE@ if test x"$(srcdir)" != x. ; then \ +@ENABLE_GTK_DOC_TRUE@ for f in $(SCANOBJ_FILES); \ +@ENABLE_GTK_DOC_TRUE@ do \ +@ENABLE_GTK_DOC_TRUE@ cmp -s ./$$f $(srcdir)/$$f || cp ./$$f $(srcdir)/ ; \ +@ENABLE_GTK_DOC_TRUE@ done; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ touch scanobj-build.stamp + +@ENABLE_GTK_DOC_TRUE@$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(SCANOBJ_FILES_O): scan-build.stamp +@ENABLE_GTK_DOC_TRUE@ @true + +### scan headers; done on every build ### +@ENABLE_GTK_DOC_TRUE@scan-build.stamp: $(HFILE_GLOB) $(EXTRA_HFILES) $(basefiles) scanobj-build.stamp +@ENABLE_GTK_DOC_TRUE@ @echo ' DOC Scanning header files' +@ENABLE_GTK_DOC_TRUE@ @if test x"$(srcdir)" != x. ; then \ +@ENABLE_GTK_DOC_TRUE@ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ +@ENABLE_GTK_DOC_TRUE@ do \ +@ENABLE_GTK_DOC_TRUE@ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ +@ENABLE_GTK_DOC_TRUE@ done; \ +@ENABLE_GTK_DOC_TRUE@ fi +@ENABLE_GTK_DOC_TRUE@ @_source_dir='' ; \ +@ENABLE_GTK_DOC_TRUE@ for i in $(DOC_SOURCE_DIR) ; do \ +@ENABLE_GTK_DOC_TRUE@ _source_dir="$${_source_dir} --source-dir=$$i" ; \ +@ENABLE_GTK_DOC_TRUE@ done ; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-scan \ +@ENABLE_GTK_DOC_TRUE@ $(SCAN_OPTIONS) $(EXTRA_HFILES) \ +@ENABLE_GTK_DOC_TRUE@ --module=$(DOC_MODULE) \ +@ENABLE_GTK_DOC_TRUE@ $${_source_dir} \ +@ENABLE_GTK_DOC_TRUE@ --ignore-headers="$(IGNORE_HFILES)"; \ +@ENABLE_GTK_DOC_TRUE@ touch scan-build.stamp + +#### update templates; done on every build #### + +# in a non-srcdir build, we need to copy files from the previous step +# and the files from previous runs of this step +@ENABLE_GTK_DOC_TRUE@tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES) +@ENABLE_GTK_DOC_TRUE@ @echo ' DOC Rebuilding template files' +@ENABLE_GTK_DOC_TRUE@ @if test x"$(srcdir)" != x. ; then \ +@ENABLE_GTK_DOC_TRUE@ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ +@ENABLE_GTK_DOC_TRUE@ do \ +@ENABLE_GTK_DOC_TRUE@ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ +@ENABLE_GTK_DOC_TRUE@ done; \ +@ENABLE_GTK_DOC_TRUE@ fi +@ENABLE_GTK_DOC_TRUE@ @gtkdoc-mktmpl --module=$(DOC_MODULE) +@ENABLE_GTK_DOC_TRUE@ @$(PYTHON) \ +@ENABLE_GTK_DOC_TRUE@ $(top_srcdir)/common/mangle-tmpl.py $(srcdir)/$(INSPECT_DIR) tmpl +@ENABLE_GTK_DOC_TRUE@ @touch tmpl-build.stamp + +@ENABLE_GTK_DOC_TRUE@tmpl.stamp: tmpl-build.stamp +@ENABLE_GTK_DOC_TRUE@ @true + +#### xml #### + +@ENABLE_GTK_DOC_TRUE@sgml-build.stamp: tmpl.stamp scan-build.stamp $(CFILE_GLOB) $(top_srcdir)/common/plugins.xsl $(expand_content_files) +@ENABLE_GTK_DOC_TRUE@ @echo ' DOC Building XML' +@ENABLE_GTK_DOC_TRUE@ @-mkdir -p xml +@ENABLE_GTK_DOC_TRUE@ @for a in $(srcdir)/$(INSPECT_DIR)/*.xml; do \ +@ENABLE_GTK_DOC_TRUE@ xsltproc --stringparam module $(MODULE) \ +@ENABLE_GTK_DOC_TRUE@ $(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done +@ENABLE_GTK_DOC_TRUE@ @for f in $(EXAMPLE_CFILES); do \ +@ENABLE_GTK_DOC_TRUE@ $(PYTHON) $(top_srcdir)/common/c-to-xml.py $$f > xml/element-`basename $$f .c`.xml; done +@ENABLE_GTK_DOC_TRUE@ @gtkdoc-mkdb \ +@ENABLE_GTK_DOC_TRUE@ --module=$(DOC_MODULE) \ +@ENABLE_GTK_DOC_TRUE@ --source-dir=$(DOC_SOURCE_DIR) \ +@ENABLE_GTK_DOC_TRUE@ --expand-content-files="$(expand_content_files)" \ +@ENABLE_GTK_DOC_TRUE@ --main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) \ +@ENABLE_GTK_DOC_TRUE@ --output-format=xml \ +@ENABLE_GTK_DOC_TRUE@ --ignore-files="$(IGNORE_HFILES) $(IGNORE_CFILES)" \ +@ENABLE_GTK_DOC_TRUE@ $(MKDB_OPTIONS) +@ENABLE_GTK_DOC_TRUE@ @cp ../version.entities xml +@ENABLE_GTK_DOC_TRUE@ @touch sgml-build.stamp + +@ENABLE_GTK_DOC_TRUE@sgml.stamp: sgml-build.stamp +@ENABLE_GTK_DOC_TRUE@ @true + +#### html #### + +@ENABLE_GTK_DOC_TRUE@html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) +@ENABLE_GTK_DOC_TRUE@ @echo ' DOC Building HTML' +@ENABLE_GTK_DOC_TRUE@ @rm -rf html +@ENABLE_GTK_DOC_TRUE@ @mkdir html +@ENABLE_GTK_DOC_TRUE@ @cp $(srcdir)/$(DOC_MAIN_SGML_FILE) html +@ENABLE_GTK_DOC_TRUE@ @for f in $(content_files); do cp $(srcdir)/$$f html; done +@ENABLE_GTK_DOC_TRUE@ @cp -pr xml html +@ENABLE_GTK_DOC_TRUE@ @cp ../version.entities html +@ENABLE_GTK_DOC_TRUE@ @mkhtml_options=""; \ +@ENABLE_GTK_DOC_TRUE@ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ +@ENABLE_GTK_DOC_TRUE@ if test "$(?)" = "0"; then \ +@ENABLE_GTK_DOC_TRUE@ if test "x$(V)" = "x1"; then \ +@ENABLE_GTK_DOC_TRUE@ mkhtml_options="$$mkhtml_options --verbose"; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ fi; \ +@ENABLE_GTK_DOC_TRUE@ cd html && gtkdoc-mkhtml $$mkhtml_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) +@ENABLE_GTK_DOC_TRUE@ @mv html/index.sgml html/index.sgml.bak +@ENABLE_GTK_DOC_TRUE@ @$(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_MAJORMINOR@\//g" html/index.sgml.bak >html/index.sgml +@ENABLE_GTK_DOC_TRUE@ @rm -f html/index.sgml.bak +@ENABLE_GTK_DOC_TRUE@ @rm -f html/$(DOC_MAIN_SGML_FILE) +@ENABLE_GTK_DOC_TRUE@ @rm -rf html/xml +@ENABLE_GTK_DOC_TRUE@ @rm -f html/version.entities +@ENABLE_GTK_DOC_TRUE@ @test "x$(HTML_IMAGES)" = "x" || for i in "" $(HTML_IMAGES) ; do \ +@ENABLE_GTK_DOC_TRUE@ if test "$$i" != ""; then cp $(srcdir)/$$i html ; fi; done +@ENABLE_GTK_DOC_TRUE@ @echo ' DOC Fixing cross-references' +@ENABLE_GTK_DOC_TRUE@ @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) +@ENABLE_GTK_DOC_TRUE@ @touch html-build.stamp + +@ENABLE_GTK_DOC_TRUE@clean-local-gtkdoc: +@ENABLE_GTK_DOC_TRUE@ @rm -rf xml tmpl html +# clean files copied for nonsrcdir templates build +@ENABLE_GTK_DOC_TRUE@ @if test x"$(srcdir)" != x. ; then \ +@ENABLE_GTK_DOC_TRUE@ rm -rf $(SCANOBJ_FILES) $(SCAN_FILES) $(REPORT_FILES) \ +@ENABLE_GTK_DOC_TRUE@ $(MAINTAINER_DOC_STAMPS); \ +@ENABLE_GTK_DOC_TRUE@ fi +@ENABLE_GTK_DOC_FALSE@all-local: +@ENABLE_GTK_DOC_FALSE@clean-local-gtkdoc: + +clean-local: clean-local-gtkdoc + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -f $(REPORT_FILES) \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @rm -rf tmpl/*.sgml.bak + @rm -f $(DOC_MODULE).hierarchy + @rm -f *.stamp || true + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(DOC_MODULE)-docs.sgml ; \ + rm -f $(DOC_MODULE).types ; \ + rm -f $(DOC_MODULE).interfaces ; \ + rm -f $(DOC_MODULE)-overrides.txt ; \ + rm -f $(DOC_MODULE).prerequisites ; \ + rm -f $(DOC_MODULE)-sections.txt ; \ + rm -rf tmpl/*.sgml ; \ + rm -rf $(INSPECT_DIR); \ + fi + @rm -rf *.o + +# thomas: make docs parallel installable; devhelp requires majorminor too +install-data-local: + (installfiles=`echo $(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css`; \ + if test "$$installfiles" = '$(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css'; \ + then echo '-- Nothing to install' ; \ + else \ + $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ + for i in $$installfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + pngfiles=`echo ./html/*.png`; \ + if test "$$pngfiles" != './html/*.png'; then \ + for i in $$pngfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + fi; \ + echo '-- Installing $(builddir)/html/$(DOC_MODULE).devhelp2' ; \ + if test -e $(builddir)/html/$(DOC_MODULE).devhelp2; then \ + $(INSTALL_DATA) $(builddir)/html/$(DOC_MODULE).devhelp2 \ + $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ + fi; \ + (which gtkdoc-rebase >/dev/null && \ + gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR)) || true ; \ + fi) +uninstall-local: + if test -d $(DESTDIR)$(TARGET_DIR); then \ + rm -rf $(DESTDIR)$(TARGET_DIR)/*; \ + rmdir -p $(DESTDIR)$(TARGET_DIR) 2>/dev/null || true; \ + else \ + echo '-- Nothing to uninstall' ; \ + fi; + +# +# Checks +# +@ENABLE_GTK_DOC_TRUE@check-hierarchy: $(DOC_MODULE).hierarchy +@ENABLE_GTK_DOC_TRUE@ @if grep ' ' $(DOC_MODULE).hierarchy; then \ +@ENABLE_GTK_DOC_TRUE@ echo "$(DOC_MODULE).hierarchy contains tabs, please fix"; \ +@ENABLE_GTK_DOC_TRUE@ /bin/false; \ +@ENABLE_GTK_DOC_TRUE@ fi + +@ENABLE_GTK_DOC_TRUE@check: check-hierarchy + +check-inspected-versions: + @echo Checking plugin versions of inspected plugin data ...; \ + fail=0 ; \ + for each in $(inspect_files) ; do \ + if (grep -H '' $$each | grep -v '$(VERSION)'); then \ + echo $$each should be fixed to say version $(VERSION) or be removed ; \ + echo "sed -i -e 's//$(VERSION)<\/version>/'" $$each; \ + echo ; \ + fail=1; \ + fi ; \ + done ; \ + exit $$fail + +check-outdated-docs: + $(AM_V_GEN)echo Checking for outdated plugin inspect data ...; \ + fail=0 ; \ + if [ -d $(top_srcdir)/.git/ ]; then \ + files=`find $(srcdir)/inspect/ -name '*xml'`; \ + for f in $$files; do \ + ver=`grep '$(PACKAGE_VERSION)' $$f`; \ + if test "x$$ver" = "x"; then \ + plugin=`echo $$f | sed -e 's/^.*plugin-//' -e 's/.xml//'`; \ + # echo "Checking $$plugin $$f"; \ + pushd "$(top_srcdir)" >/dev/null; \ + pinit=`git grep -A3 GST_PLUGIN_DEFINE -- ext/ gst/ sys/ | grep "\"$$plugin\""`; \ + popd >/dev/null; \ + # echo "[$$pinit]"; \ + if test "x$$pinit" = "x"; then \ + printf " **** outdated docs for plugin %-15s: %s\n" $$plugin $$f; \ + fail=1; \ + fi; \ + fi; \ + done; \ + fi ; \ + exit $$fail + +# +# Require gtk-doc when making dist +# +@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" +@ENABLE_GTK_DOC_FALSE@ @false + +# FIXME: decide whether we want to dist generated html or not +# also this only works, if the project has been build before +# we could dist html only if its there, but that might lead to missing html in +# tarballs +dist-hook: dist-check-gtkdoc dist-hook-local + mkdir $(distdir)/html + cp html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ + cd $(distdir) && rm -f $(DISTCLEANFILES) + -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs check-outdated-docs inspect + +# avoid spurious build errors when distchecking with -jN +.NOTPARALLEL: + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/docs/plugins/gst-plugins-good-plugins-docs.sgml b/docs/plugins/gst-plugins-good-plugins-docs.sgml new file mode 100644 index 0000000..9f65e21 --- /dev/null +++ b/docs/plugins/gst-plugins-good-plugins-docs.sgml @@ -0,0 +1,273 @@ + + + +%version-entities; +]> + + + + GStreamer Good Plugins &GST_MAJORMINOR; Plugins Reference Manual + + for GStreamer Good Plugins &GST_MAJORMINOR; (&GST_VERSION;) + The latest version of this documentation can be found on-line at + http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/. + + + + + gst-plugins-good Elements + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gst-plugins-good Plugins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gst-plugins-good Base Classes + + + + + diff --git a/docs/plugins/gst-plugins-good-plugins-sections.txt b/docs/plugins/gst-plugins-good-plugins-sections.txt new file mode 100644 index 0000000..0f03971 --- /dev/null +++ b/docs/plugins/gst-plugins-good-plugins-sections.txt @@ -0,0 +1,2523 @@ +
+element-3gppmux +3gppmux +Gst3GPPMux + +
+ +
+element-aacparse +aacparse +GstAacParse + +GstAacParseClass +GST_AAC_PARSE +GST_AAC_PARSE_CLASS +GST_IS_AAC_PARSE +GST_IS_AAC_PARSE_CLASS +GST_TYPE_AAC_PARSE +gst_aac_parse_get_type +
+ +
+element-aasink +aasink +GstAASink + +GstAASinkClass +GST_AASINK +GST_IS_AASINK +GST_TYPE_AASINK +GST_AASINK_CLASS +GST_IS_AASINK_CLASS +gst_aasink_get_type +
+ +
+element-ac3parse +ac3parse +GstAc3Parse + +GstAc3ParseClass +GST_AC3_PARSE +GST_AC3_PARSE_CLASS +GST_IS_AC3_PARSE +GST_IS_AC3_PARSE_CLASS +GST_TYPE_AC3_PARSE +gst_ac3_parse_get_type +
+ +
+element-alawdec +alawdec +GstALawDec + +GstALawDecClass +GST_ALAW_DEC +GST_IS_ALAW_DEC +GST_TYPE_ALAW_DEC +GST_ALAW_DEC_CLASS +GST_IS_ALAW_DEC_CLASS +gst_alaw_dec_get_type +
+ +element-alawenc +alawenc +GstALawEnc + +GstALawEncClass +GST_ALAW_ENC +GST_IS_ALAW_ENC +GST_TYPE_ALAW_ENC +GST_ALAW_ENC_CLASS +GST_IS_ALAW_ENC_CLASS +gst_alaw_enc_get_type + + +
+element-alpha +alpha +GstAlpha +GstAlphaMethod + +GstAlphaClass +GST_ALPHA +GST_IS_ALPHA +GST_TYPE_ALPHA +gst_alpha_get_type +GST_ALPHA_CLASS +GST_IS_ALPHA_CLASS +
+ +
+element-alphacolor +alphacolor +GstAlphaColor + +GstAlphaColorClass +GST_ALPHA_COLOR +GST_IS_ALPHA_COLOR +GST_TYPE_ALPHA_COLOR +gst_alpha_color_get_type +GST_ALPHA_COLOR_CLASS +GST_IS_ALPHA_COLOR_CLASS +
+ +
+element-amrparse +amrparse +GstAmrParse + +GstAmrParseClass +GST_AMR_PARSE +GST_AMR_PARSE_CLASS +GST_IS_AMR_PARSE +GST_IS_AMR_PARSE_CLASS +GST_TYPE_AMR_PARSE +gst_amr_parse_get_type +
+ +
+element-apedemux +apedemux +GstApeDemux + +GstApeDemuxClass +GST_APE_DEMUX +GST_IS_APE_DEMUX +GST_TYPE_APE_DEMUX +gst_ape_demux_get_type +GST_APE_DEMUX_CLASS +GST_IS_APE_DEMUX_CLASS +
+ +
+element-apev2mux +apev2mux +GstApev2Mux + +GstApev2MuxClass +GST_APEV2_MUX +GST_IS_APEV2_MUX +GST_TYPE_APEV2_MUX +gst_apev2_mux_get_type +GST_APEV2_MUX_CLASS +GST_IS_APEV2_MUX_CLASS +
+ +
+element-audioamplify +audioamplify +GstAudioAmplify + +GstAudioAmplifyClass +GstAudioAmplifyProcessFunc +GST_AUDIO_AMPLIFY +GST_AUDIO_AMPLIFY_CLASS +GST_AUDIO_AMPLIFY_GET_CLASS +GST_IS_AUDIO_AMPLIFY +GST_IS_AUDIO_AMPLIFY_CLASS +GST_TYPE_AUDIO_AMPLIFY +gst_audio_amplify_get_type +
+ +
+element-audiochebband +audiochebband +GstAudioChebBand + +GstAudioChebBandClass +GST_AUDIO_CHEB_BAND +GST_AUDIO_CHEB_BAND_CLASS +GST_AUDIO_CHEB_BAND_GET_CLASS +GST_IS_AUDIO_CHEB_BAND +GST_IS_AUDIO_CHEB_BAND_CLASS +GST_TYPE_AUDIO_CHEB_BAND +gst_audio_cheb_band_get_type +
+ +
+element-audiocheblimit +audiocheblimit +GstAudioChebLimit + +GstAudioChebLimitClass +GST_AUDIO_CHEB_LIMIT +GST_AUDIO_CHEB_LIMIT_CLASS +GST_AUDIO_CHEB_LIMIT_GET_CLASS +GST_IS_AUDIO_CHEB_LIMIT +GST_IS_AUDIO_CHEB_LIMIT_CLASS +GST_TYPE_AUDIO_CHEB_LIMIT +gst_audio_cheb_limit_get_type +
+ +
+element-audiodynamic +audiodynamic +GstAudioDynamic + +GstAudioDynamicClass +GstAudioDynamicProcessFunc +GST_AUDIO_DYNAMIC +GST_AUDIO_DYNAMIC_CLASS +GST_AUDIO_DYNAMIC_GET_CLASS +GST_IS_AUDIO_DYNAMIC +GST_IS_AUDIO_DYNAMIC_CLASS +GST_TYPE_AUDIO_DYNAMIC +gst_audio_dynamic_get_type +
+ +
+element-audioecho +audioecho +GstAudioEcho + +GstAudioEchoClass +GstAudioEchoProcessFunc +GST_AUDIO_ECHO +GST_AUDIO_ECHO_CLASS +GST_AUDIO_ECHO_GET_CLASS +GST_IS_AUDIO_ECHO +GST_IS_AUDIO_ECHO_CLASS +GST_TYPE_AUDIO_ECHO +gst_audio_echo_get_type +
+ +
+element-audiofirfilter +audiofirfilter +GstAudioFIRFilter + +GstAudioFIRFilterClass +GST_AUDIO_FIR_FILTER +GST_AUDIO_FIR_FILTER_CLASS +GST_IS_AUDIO_FIR_FILTER +GST_IS_AUDIO_FIR_FILTER_CLASS +GST_TYPE_AUDIO_FIR_FILTER +gst_audio_fir_filter_get_type +
+ +
+element-audioiirfilter +audioiirfilter +GstAudioIIRFilter + +GstAudioIIRFilterClass +GST_AUDIO_IIR_FILTER +GST_AUDIO_IIR_FILTER_CLASS +GST_IS_AUDIO_IIR_FILTER +GST_IS_AUDIO_IIR_FILTER_CLASS +GST_TYPE_AUDIO_IIR_FILTER +gst_audio_iir_filter_get_type +
+ +
+element-audioinvert +audioinvert +GstAudioInvert + +GstAudioInvertClass +GstAudioInvertProcessFunc +GST_AUDIO_INVERT +GST_AUDIO_INVERT_CLASS +GST_AUDIO_INVERT_GET_CLASS +GST_IS_AUDIO_INVERT +GST_IS_AUDIO_INVERT_CLASS +GST_TYPE_AUDIO_INVERT +gst_audio_invert_get_type +
+ +
+element-audiokaraoke +audiokaraoke +GstAudioKaraoke + +GstAudioKaraokeClass +GstAudioKaraokeProcessFunc +GST_AUDIO_KARAOKE +GST_AUDIO_KARAOKE_CLASS +GST_AUDIO_KARAOKE_GET_CLASS +GST_IS_AUDIO_KARAOKE +GST_IS_AUDIO_KARAOKE_CLASS +GST_TYPE_AUDIO_KARAOKE +gst_audio_karaoke_get_type +
+ +
+element-audiopanorama +audiopanorama +GstAudioPanorama + +GstAudioPanoramaClass +GstAudioPanoramaProcessFunc +GST_AUDIO_PANORAMA +GST_AUDIO_PANORAMA_CLASS +GST_AUDIO_PANORAMA_GET_CLASS +GST_IS_AUDIO_PANORAMA +GST_IS_AUDIO_PANORAMA_CLASS +GST_TYPE_AUDIO_PANORAMA +gst_audio_panorama_get_type +
+ +
+element-audiowsincband +audiowsincband +GstAudioWSincBand + +GstAudioWSincBandClass +GST_AUDIO_WSINC_BAND +GST_AUDIO_WSINC_BAND_CLASS +GST_IS_AUDIO_WSINC_BAND +GST_IS_AUDIO_WSINC_BAND_CLASS +GST_TYPE_AUDIO_WSINC_BAND +gst_audio_wsincband_get_type +
+ +
+element-audiowsinclimit +audiowsinclimit +GstAudioWSincLimit + +GstAudioWSincLimitClass +GST_AUDIO_WSINC_LIMIT +GST_AUDIO_WSINC_LIMIT_CLASS +GST_IS_AUDIO_WSINC_LIMIT +GST_IS_AUDIO_WSINC_LIMIT_CLASS +GST_TYPE_AUDIO_WSINC_LIMIT +gst_audio_wsinclimit_get_type +
+ +
+element-auparse +auparse +GstAuParse + +GstAuParseClass +GST_TYPE_AU_PARSE +GST_AU_PARSE +GST_AU_PARSE_CLASS +GST_IS_AU_PARSE +GST_IS_AU_PARSE_CLASS +gst_au_parse_get_type +
+ +
+element-autoaudiosink +autoaudiosink +GstAutoAudioSink + +GstAutoAudioSinkClass +GST_TYPE_AUTO_AUDIO_SINK +GST_AUTO_AUDIO_SINK +GST_AUTO_AUDIO_SINK_CLASS +GST_IS_AUTO_AUDIO_SINK +GST_IS_AUTO_AUDIO_SINK_CLASS +gst_auto_audio_sink_get_type +
+ +
+element-autoaudiosrc +autoaudiosrc +GstAutoAudioSrc + +GstAutoAudioSrcClass +GST_TYPE_AUTO_AUDIO_SRC +GST_AUTO_AUDIO_SRC +GST_AUTO_AUDIO_SRC_CLASS +GST_IS_AUTO_AUDIO_SRC +GST_IS_AUTO_AUDIO_SRC_CLASS +gst_auto_audio_src_get_type +
+ +
+element-autovideosink +autovideosink +GstAutoVideoSink + +GstAutoVideoSinkClass +GST_TYPE_AUTO_VIDEO_SINK +GST_AUTO_VIDEO_SINK +GST_AUTO_VIDEO_SINK_CLASS +GST_IS_AUTO_VIDEO_SINK +GST_IS_AUTO_VIDEO_SINK_CLASS +gst_auto_video_sink_get_type +
+ +
+element-autovideosrc +autovideosrc +GstAutoVideoSrc + +GstAutoVideoSrcClass +GST_TYPE_AUTO_VIDEO_SRC +GST_AUTO_VIDEO_SRC +GST_AUTO_VIDEO_SRC_CLASS +GST_IS_AUTO_VIDEO_SRC +GST_IS_AUTO_VIDEO_SRC_CLASS +gst_auto_video_src_get_type +
+ +
+element-avidemux +avidemux +GstAviDemux + +GstAviDemuxClass +GstAviAudioPad +GstAviCollectData +GstAviDemuxHeaderState +GstAviDemuxState +GstAviPad +GstAviVideoPad +GstAviIndexEntry +GstAviStream +GST_TYPE_AVI_DEMUX +GST_AVI_DEMUX +GST_AVI_DEMUX_CLASS +GST_IS_AVI_DEMUX +GST_IS_AVI_DEMUX_CLASS +GST_AVI_DEMUX_MAX_STREAMS +gst_avi_demux_get_type +CHUNKID_TO_STREAMNR +
+ +
+element-avimux +avimux +GstAviMux + +GstAviMuxClass +GstAviPadHook +GST_AVI_MAX_SIZE +GST_TYPE_AVI_MUX +GST_AVI_MUX +GST_AVI_MUX_CLASS +GST_IS_AVI_MUX +GST_IS_AVI_MUX_CLASS +gst_avi_mux_get_type +GST_AVI_INDEX_OF_CHUNKS +GST_AVI_INDEX_OF_INDEXES +GST_AVI_SUPERINDEX_COUNT +gst_avi_superindex_entry +gst_riff_strh_full +
+ +
+element-avisubtitle +avisubtitle +GstAviSubtitle + +GstAviSubtitleClass +GST_TYPE_AVI_SUBTITLE +GST_AVI_SUBTITLE +GST_AVI_SUBTITLE_CLASS +GST_AVI_SUBTITLE_GET_CLASS +GST_IS_AVI_SUBTITLE +GST_IS_AVI_SUBTITLE_CLASS +gst_avi_subtitle_get_type +
+ +
+element-cacasink +cacasink +GstCACASink + +GstCACASinkClass +GST_CACASINK +GST_IS_CACASINK +GST_TYPE_CACASINK +GST_CACASINK_CLASS +GST_IS_CACASINK_CLASS +gst_cacasink_get_type +
+ +
+element-cairotextoverlay +cairotextoverlay +GstCairoTextOverlay + +GstCairoTextOverlayClass +GST_TYPE_CAIRO_TEXT_OVERLAY +GST_CAIRO_TEXT_OVERLAY +GST_CAIRO_TEXT_OVERLAY_CLASS +GST_IS_CAIRO_TEXT_OVERLAY +GST_IS_CAIRO_TEXT_OVERLAY_CLASS +GST_CAIRO_TEXT_OVERLAY_GET_CLASS +gst_text_overlay_get_type +GstCairoTextOverlayHAlign +GstCairoTextOverlayVAlign +
+ +
+element-cairotimeoverlay +cairotimeoverlay +GstCairoTimeOverlay + +GstCairoTimeOverlayClass +GST_TYPE_CAIRO_TIME_OVERLAY +GST_CAIRO_TIME_OVERLAY +GST_CAIRO_TIME_OVERLAY_CLASS +GST_IS_CAIRO_TIME_OVERLAY +GST_IS_CAIRO_TIME_OVERLAY_CLASS +gst_cairo_time_overlay_get_type +
+ +
+element-cairorender +cairorender +GstCairoRender + +GstCairoRenderClass +GST_TYPE_CAIRO_RENDER +GST_CAIRO_RENDER +GST_CAIRO_RENDER_CLASS +gst_cairo_render_get_type +
+ +
+element-cairooverlay +cairooverlay +GstCairoOverlay + +GstCairoOverlayClass +GST_TYPE_CAIRO_OVERLAY +GST_CAIRO_OVERLAY +GST_CAIRO_OVERLAY_CLASS +gst_cairo_overlay_get_type +
+ +
+element-capssetter +capssetter +GstCapsSetter + +GstCapsSetterClass +GST_TYPE_CAPS_SETTER +GST_CAPS_SETTER +GST_IS_CAPS_SETTER +GST_CAPS_SETTER_CLASS +GST_IS_CAPS_SETTER_CLASS +gst_caps_setter_get_type +
+ +
+element-cmmldec +cmmldec +GstCmmlDec + +GstCmmlDecClass +GST_TYPE_CMML_DEC +GST_CMML_DEC +GST_CMML_DEC_CLASS +GST_CMML_DEC_GET_CLASS +GST_IS_CMML_DEC +GST_IS_CMML_DEC_CLASS +gst_cmml_dec_plugin_init +gst_cmml_dec_get_type +
+ +
+element-cmmlenc +cmmlenc +GstCmmlEnc + +GstCmmlEncClass +GST_TYPE_CMML_ENC +GST_CMML_ENC +GST_CMML_ENC_CLASS +GST_CMML_ENC_GET_CLASS +GST_IS_CMML_ENC +GST_IS_CMML_ENC_CLASS +gst_cmml_enc_plugin_init +gst_cmml_enc_get_type +
+ +
+element-cutter +cutter +GstCutter + +GST_CUTTER +GST_CUTTER_CLASS +GST_IS_CUTTER +GST_IS_CUTTER_CLASS +GST_TYPE_CUTTER +GstCutterClass +gst_cutter_get_type +
+ +
+element-dcaparse +dcaparse +GstDcaParse + +GstDcaParseClass +GST_DCA_PARSE +GST_DCA_PARSE_CLASS +GST_IS_DCA_PARSE +GST_IS_DCA_PARSE_CLASS +GST_TYPE_DCA_PARSE +gst_dca_parse_get_type +
+ + +
+element-deinterlace +deinterlace +GstDeinterlace + +GST_DEINTERLACE_MAX_FIELD_HISTORY +BUILD_X86_ASM +PICTURE_PROGRESSIVE +PICTURE_INTERLACED_BOTTOM +PICTURE_INTERLACED_TOP +PICTURE_INTERLACED_MASK +GstDeinterlaceClass +GST_IS_DEINTERLACE +GST_IS_DEINTERLACE_CLASS +GST_DEINTERLACE +GST_DEINTERLACE_CLASS +GST_TYPE_DEINTERLACE +gst_deinterlace_get_type +GstDeinterlaceFieldLayout +GstDeinterlaceFields +GstDeinterlaceMethods +GstDeinterlaceMode +GstDeinterlaceScanlineData +GstDeinterlaceMethod +GstDeinterlaceMethodClass +GST_DEINTERLACE_METHOD +GST_DEINTERLACE_METHOD_CAST +GST_DEINTERLACE_METHOD_CLASS +GST_DEINTERLACE_METHOD_GET_CLASS +GST_IS_DEINTERLACE_METHOD +GST_IS_DEINTERLACE_METHOD_CLASS +GST_TYPE_DEINTERLACE_METHOD +gst_deinterlace_method_get_type +GstDeinterlaceSimpleMethod +GstDeinterlaceSimpleMethodClass +GST_DEINTERLACE_SIMPLE_METHOD +GST_DEINTERLACE_SIMPLE_METHOD_CAST +GST_DEINTERLACE_SIMPLE_METHOD_CLASS +GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS +GST_IS_DEINTERLACE_SIMPLE_METHOD +GST_IS_DEINTERLACE_SIMPLE_METHOD_CLASS +GST_TYPE_DEINTERLACE_SIMPLE_METHOD +gst_deinterlace_simple_method_get_type +
+ +
+element-deinterleave +deinterleave +GstDeinterleave + +GST_DEINTERLEAVE +GST_DEINTERLEAVE_CLASS +GST_DEINTERLEAVE_GET_CLASS +GST_IS_DEINTERLEAVE +GST_IS_DEINTERLEAVE_CLASS +GST_TYPE_DEINTERLEAVE +GstDeinterleaveClass +GstDeinterleaveFunc +gst_deinterleave_get_type +
+ +
+element-directsoundsink +directsoundsink +GstDirectSoundSink + +GstDirectSoundSinkClass +GST_DIRECTSOUND_SINK +GST_DIRECTSOUND_SINK_CLASS +GST_IS_DIRECTSOUND_SINK +GST_IS_DIRECTSOUND_SINK_CLASS +GST_TYPE_DIRECTSOUND_SINK +gst_directsound_sink_get_type +GST_DSOUND_LOCK +GST_DSOUND_UNLOCK +
+ +
+element-dv1394src +dv1394src +GstDV1394Src + +GstDV1394SrcClass +GST_TYPE_DV1394SRC +GST_DV1394SRC +GST_DV1394SRC_CLASS +GST_IS_DV1394SRC +GST_IS_DV1394SRC_CLASS +gst_dv1394src_get_type +
+ +
+element-hdv1394src +hdv1394src +GstHDV1394Src + +GstHDV1394SrcClass +GST_TYPE_HDV1394SRC +GST_HDV1394SRC +GST_HDV1394SRC_CLASS +GST_IS_HDV1394SRC +GST_IS_HDV1394SRC_CLASS +gst_hdv1394src_get_type +
+ +
+element-dvdec +dvdec +GstDVDec + +GstDVDecClass +GST_TYPE_DVDEC +GST_DVDEC +GST_DVDEC_CLASS +GST_IS_DVDEC +GST_IS_DVDEC_CLASS +gst_dvdec_get_type +
+ +
+element-dvdemux +dvdemux +GstDVDemux + +GstDVDemuxClass +GstDVDemuxSeekHandler +GST_TYPE_DVDEMUX +GST_DVDEMUX +GST_DVDEMUX_CLASS +GST_IS_DVDEMUX +GST_IS_DVDEMUX_CLASS +gst_dvdemux_get_type +
+ +
+gstiirequalizer +GstIirEqualizer +GstIirEqualizer + +GstIirEqualizerBand +GstIirEqualizerClass +GST_IIR_EQUALIZER +GST_IIR_EQUALIZER_CLASS +GST_IS_IIR_EQUALIZER +GST_IS_IIR_EQUALIZER_CLASS +GST_TYPE_IIR_EQUALIZER +gst_iir_equalizer_get_type +gst_iir_equalizer_compute_frequencies +
+ +
+element-equalizer-3bands +equalizer-3bands +GstIirEqualizer3Bands + +GstIirEqualizer3BandsClass +GST_IIR_EQUALIZER_3BANDS +GST_IIR_EQUALIZER_3BANDS_CLASS +GST_IS_IIR_EQUALIZER_3BANDS +GST_IS_IIR_EQUALIZER_3BANDS_CLASS +GST_TYPE_IIR_EQUALIZER_3BANDS +gst_iir_equalizer_3bands_get_type +
+ +
+element-equalizer-10bands +equalizer-10bands +GstIirEqualizer10Bands + +GstIirEqualizer10BandsClass +GST_IIR_EQUALIZER_10BANDS +GST_IIR_EQUALIZER_10BANDS_CLASS +GST_IS_IIR_EQUALIZER_10BANDS +GST_IS_IIR_EQUALIZER_10BANDS_CLASS +GST_TYPE_IIR_EQUALIZER_10BANDS +gst_iir_equalizer_10bands_get_type +
+ +
+element-equalizer-nbands +equalizer-nbands +GstIirEqualizerNBands + +GstIirEqualizerNBandsClass +GST_IIR_EQUALIZER_NBANDS +GST_IIR_EQUALIZER_NBANDS_CLASS +GST_IS_IIR_EQUALIZER_NBANDS +GST_IS_IIR_EQUALIZER_NBANDS_CLASS +GST_TYPE_IIR_EQUALIZER_NBANDS +gst_iir_equalizer_nbands_get_type + +HIGHEST_FREQ +LOWEST_FREQ +ProcessFunc +
+ +
+element-esdsink +esdsink +GstEsdSink + +GstEsdSinkClass +GST_TYPE_ESDSINK +GST_ESDSINK +GST_ESDSINK_CLASS +GST_IS_ESDSINK +GST_IS_ESDSINK_CLASS +gst_esdsink_get_type +
+ +
+element-flacdec +flacdec +GstFlacDec + +GstFlacDecClass +GST_TYPE_FLAC_DEC +GST_FLAC_DEC +GST_FLAC_DEC_CLASS +GST_IS_FLAC_DEC +GST_IS_FLAC_DEC_CLASS +gst_flac_dec_get_type +
+ +
+element-flacenc +flacenc +GstFlacEnc + +GstFlacEncClass +GstFlacTagState +GST_TYPE_FLAC_ENC +GST_FLAC_ENC +GST_FLAC_ENC_CLASS +GST_IS_FLAC_ENC +GST_IS_FLAC_ENC_CLASS +gst_flac_enc_get_type +
+ +
+element-flacparse +flacparse +GstFlacParse + +GstFlacParseClass +GST_FLAC_PARSE +GST_FLAC_PARSE_CLASS +GST_IS_FLAC_PARSE +GST_IS_FLAC_PARSE_CLASS +GST_TYPE_FLAC_PARSE +gst_flac_parse_get_type +
+ +
+element-flactag +flactag +GstFlacTag + +GstFlacTagClass +GST_TYPE_FLAC_TAG +GST_FLAC_TAG +GST_FLAC_TAG_CLASS +GST_IS_FLAC_TAG +GST_IS_FLAC_TAG_CLASS +gst_flac_tag_get_type +
+ +
+element-flvdemux +flvdemux +GstFlvDemux + +GstFlvDemuxClass +GstFlvDemuxState +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 +
+ +
+element-flvmux +flvmux +GstFlvMux + +GstFlvMuxClass +GstFlvMuxState +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 +
+ +
+element-flxdec +flxdec +GstFlxDec + +GstFlxDecClass +GstFlxDecState +GST_FLXDEC +GST_FLXDEC_CLASS +GST_IS_FLXDEC +GST_IS_FLXDEC_CLASS +GST_TYPE_FLXDEC +gst_flxdec_get_type +
+ +
+element-gamma +gamma +GstGamma + +GstGammaClass +GST_GAMMA +GST_IS_GAMMA +GST_TYPE_GAMMA +GST_GAMMA_CLASS +GST_IS_GAMMA_CLASS +gst_gamma_get_type +
+ +
+element-gconfaudiosrc +gconfaudiosrc +GstGConfAudioSrc + +GstGConfAudioSrcClass +GST_GCONF_AUDIO_SRC +GST_IS_GCONF_AUDIO_SRC +GST_TYPE_GCONF_AUDIO_SRC +GST_GCONF_AUDIO_SRC_CLASS +GST_IS_GCONF_AUDIO_SRC_CLASS +gst_gconf_audio_src_get_type +
+ +
+element-gconfaudiosink +gconfaudiosink +GstGConfAudioSink + +GstGConfAudioSinkClass +GST_GCONF_AUDIO_SINK +GST_IS_GCONF_AUDIO_SINK +GST_TYPE_GCONF_AUDIO_SINK +GST_GCONF_AUDIO_SINK_CLASS +GST_IS_GCONF_AUDIO_SINK_CLASS +gst_gconf_audio_sink_get_type +
+ +
+element-gconfvideosrc +gconfvideosrc +GstGConfVideoSrc + +GstGConfVideoSrcClass +GST_GCONF_VIDEO_SRC +GST_IS_GCONF_VIDEO_SRC +GST_TYPE_GCONF_VIDEO_SRC +GST_GCONF_VIDEO_SRC_CLASS +GST_IS_GCONF_VIDEO_SRC_CLASS +gst_gconf_video_src_get_type +
+ +
+element-gconfvideosink +gconfvideosink +GstGConfVideoSink + +GstGConfVideoSinkClass +GST_GCONF_VIDEO_SINK +GST_IS_GCONF_VIDEO_SINK +GST_TYPE_GCONF_VIDEO_SINK +GST_GCONF_VIDEO_SINK_CLASS +GST_IS_GCONF_VIDEO_SINK_CLASS +gst_gconf_video_sink_get_type +
+ +
+element-gdkpixbufsink +gdkpixbufsink +GstGdkPixbufSink + +GstGdkPixbufSinkClass +GST_TYPE_GDK_PIXBUF_SINK +GST_GDK_PIXBUF_SINK +GST_GDK_PIXBUF_SINK_CLASS +GST_IS_GDK_PIXBUF_SINK +GST_IS_GDK_PIXBUF_SINK_CLASS +gst_gdk_pixbuf_sink_get_type +
+ +
+element-goom +goom +GstGoom + +GstGoomClass +GOOM_SAMPLES +GST_GOOM +GST_IS_GOOM +GST_TYPE_GOOM +GST_GOOM_CLASS +GST_IS_GOOM_CLASS +gst_goom_get_type +
+ +
+element-goom2k1 +goom2k1 +GstGoom + +GstGoomClass +GOOM_SAMPLES +GST_GOOM +GST_IS_GOOM +GST_TYPE_GOOM +GST_GOOM_CLASS +GST_IS_GOOM_CLASS +
+ +
+element-gstrtpbin +gstrtpbin +GstRtpBin + +GstRtpBinPrivate +GstRtpBinClass +GST_RTP_BIN +GST_IS_RTP_BIN +GST_TYPE_RTP_BIN +gst_rtp_bin_get_type +GST_RTP_BIN_CLASS +GST_IS_RTP_BIN_CLASS +
+ +
+element-gstrtpjitterbuffer +gstrtpjitterbuffer +GstRtpJitterBuffer + +GstRtpJitterBufferClass +GstRtpJitterBufferPrivate +GST_RTP_JITTER_BUFFER +GST_IS_RTP_JITTER_BUFFER +GST_TYPE_RTP_JITTER_BUFFER +gst_rtp_jitter_buffer_get_type +GST_RTP_JITTER_BUFFER_CLASS +GST_IS_RTP_JITTER_BUFFER_CLASS +
+ +
+element-gstrtpptdemux +gstrtpptdemux +GstRtpPtDemux + +GstRtpPtDemuxClass +GstRtpPtDemuxPad +GST_RTP_PT_DEMUX +GST_IS_RTP_PT_DEMUX +GST_TYPE_RTP_PT_DEMUX +gst_rtp_pt_demux_get_type +GST_RTP_PT_DEMUX_CLASS +GST_IS_RTP_PT_DEMUX_CLASS +
+ +
+element-gstrtpsession +gstrtpsession +GstRtpSession + +GstRtpSessionClass +GstRtpSessionPrivate +GST_RTP_SESSION +GST_IS_RTP_SESSION +GST_TYPE_RTP_SESSION +gst_rtp_session_get_type +GST_RTP_SESSION_CLASS +GST_IS_RTP_SESSION_CLASS +GST_RTP_SESSION_CAST +
+ +
+element-gstrtpssrcdemux +gstrtpssrcdemux +GstRtpSsrcDemux + +GstRtpSsrcDemuxClass +GstRtpSsrcDemuxPad +GST_RTP_SSRC_DEMUX +GST_IS_RTP_SSRC_DEMUX +GST_TYPE_RTP_SSRC_DEMUX +gst_rtp_ssrc_demux_get_type +GST_RTP_SSRC_DEMUX_CLASS +GST_IS_RTP_SSRC_DEMUX_CLASS +
+ +
+element-halaudiosink +halaudiosink +GstHalAudioSink + +GstHalAudioSinkClass +GST_TYPE_HAL_AUDIO_SINK +GST_HAL_AUDIO_SINK +GST_HAL_AUDIO_SINK_CLASS +GST_IS_HAL_AUDIO_SINK +GST_IS_HAL_AUDIO_SINK_CLASS +gst_hal_audio_sink_get_type +
+ +
+element-halaudiosrc +halaudiosrc +GstHalAudioSrc + +GstHalAudioSrcClass +GST_TYPE_HAL_AUDIO_SRC +GST_HAL_AUDIO_SRC +GST_HAL_AUDIO_SRC_CLASS +GST_IS_HAL_AUDIO_SRC +GST_IS_HAL_AUDIO_SRC_CLASS +gst_hal_audio_src_get_type +
+ +
+element-icydemux +icydemux +GstICYDemux + +GstICYDemuxClass +GST_TYPE_ICYDEMUX +GST_ICYDEMUX +GST_ICYDEMUX_CLASS +GST_IS_ICYDEMUX +GST_IS_ICYDEMUX_CLASS +gst_icydemux_get_type +
+ +
+element-id3demux +id3demux +GstID3Demux + +GstID3DemuxClass +GST_TYPE_ID3DEMUX +GST_ID3DEMUX +GST_ID3DEMUX_CLASS +GST_IS_ID3DEMUX +GST_IS_ID3DEMUX_CLASS +gst_id3demux_get_type +
+ +
+element-id3v2mux +id3v2mux +GstId3v2Mux + +GstId3v2MuxClass +GST_TYPE_ID3V2_MUX +GST_ID3V2_MUX +GST_ID3V2_MUX_CLASS +GST_IS_ID3V2_MUX +GST_IS_ID3V2_MUX_CLASS +gst_id3v2_mux_get_type +
+ +
+element-imagefreeze +imagefreeze +GstImageFreeze + +GstImageFreezeClass +GST_IMAGE_FREEZE +GST_IMAGE_FREEZE_CLASS +GST_IS_IMAGE_FREEZE +GST_IS_IMAGE_FREEZE_CLASS +GST_IMAGE_FREEZE_GET_CLASS +GST_TYPE_IMAGE_FREEZE +gst_image_freeze_get_type +
+ +
+element-interleave +interleave +GstInterleave + +GST_INTERLEAVE +GST_INTERLEAVE_CLASS +GST_INTERLEAVE_GET_CLASS +GST_IS_INTERLEAVE +GST_IS_INTERLEAVE_CLASS +GST_TYPE_INTERLEAVE +GstInterleaveClass +GstInterleaveFunc +gst_interleave_get_type +
+ +
+element-ismlmux +ismlmux +GstISMLMux + +
+ +
+element-jackaudiosrc +jackaudiosrc +GstJackAudioSrc + +GstJackAudioSrcClass +GST_JACK_AUDIO_SRC +GST_JACK_AUDIO_SRC_CLASS +GST_JACK_AUDIO_SRC_GET_CLASS +GST_IS_JACK_AUDIO_SRC +GST_IS_JACK_AUDIO_SRC_CLASS +GST_TYPE_JACK_AUDIO_SRC +gst_jack_audio_src_get_type +
+ +
+element-jackaudiosink +jackaudiosink +GstJackAudioSink + +GstJackAudioSinkClass +GST_JACK_AUDIO_SINK +GST_JACK_AUDIO_SINK_CLASS +GST_JACK_AUDIO_SINK_GET_CLASS +GST_IS_JACK_AUDIO_SINK +GST_IS_JACK_AUDIO_SINK_CLASS +GST_TYPE_JACK_AUDIO_SINK +gst_jack_audio_sink_get_type +
+ +
+element-jpegdec +jpegdec +GstJpegDec + +GstJpegDecClass +GST_JPEG_DEC +GST_IS_JPEG_DEC +GST_TYPE_JPEG_DEC +GST_JPEG_DEC_CLASS +GST_IS_JPEG_DEC_CLASS +gst_jpeg_dec_get_type +
+ +
+element-jpegenc +jpegenc +GstJpegEnc + +GstJpegEncClass +GST_JPEGENC +GST_IS_JPEGENC +GST_TYPE_JPEGENC +GST_JPEGENC_CLASS +GST_IS_JPEGENC_CLASS +gst_jpegenc_get_type +
+ +
+element-level +level +GstLevel + +GstLevelClass +GST_TYPE_LEVEL +GST_LEVEL +GST_LEVEL_CLASS +GST_LEVEL_GET_CLASS +GST_IS_LEVEL +GST_IS_LEVEL_CLASS +gst_level_get_type +
+ +
+element-matroskamux +matroskamux +GstMatroskaMux + +GstMatroskaMuxClass +GstMatroskaMuxState +GstMatroskaMetaSeekIndex +GST_TYPE_MATROSKA_MUX +GST_MATROSKA_MUX +GST_MATROSKA_MUX_CLASS +GST_IS_MATROSKA_MUX +GST_IS_MATROSKA_MUX_CLASS +gst_matroska_mux_get_type +
+ +
+element-matroskademux +matroskademux +GstMatroskaDemux + +GstMatroskaDemuxClass +GstMatroskaDemuxState +GST_TYPE_MATROSKA_DEMUX +GST_MATROSKA_DEMUX +GST_MATROSKA_DEMUX_CLASS +GST_IS_MATROSKA_DEMUX +GST_IS_MATROSKA_DEMUX_CLASS +gst_matroska_demux_plugin_init +
+ +
+element-mj2mux +mj2mux +GstMJ2Mux + +
+ +
+element-monoscope +monoscope +GstMonoscope + +GstMonoscopeClass +GST_MONOSCOPE +GST_IS_MONOSCOPE +GST_TYPE_MONOSCOPE +GST_MONOSCOPE_CLASS +GST_IS_MONOSCOPE_CLASS +gst_monoscope_get_type +
+ +
+element-mpegaudioparse +mpegaudioparse +GstMpegAudioParse + +GstMpegAudioParseClass +GST_MPEG_AUDIO_PARSE +GST_MPEG_AUDIO_PARSE_CLASS +GST_IS_MPEG_AUDIO_PARSE +GST_IS_MPEG_AUDIO_PARSE_CLASS +GST_TYPE_MPEG_AUDIO_PARSE +gst_mpeg_audio_parse_get_type +
+ +
+element-mp4mux +mp4mux +GstMP4Mux + +
+ +
+element-mulawdec +mulawdec +GstMuLawDec + +GstMuLawDecClass +GST_MULAWDEC +GST_IS_MULAWDEC +GST_TYPE_MULAWDEC +GST_MULAWDEC_CLASS +GST_IS_MULAWDEC_CLASS +gst_mulawdec_get_type +
+ +element-mulawenc +mulawenc +GstMuLawEnc + +GstMuLawEncClass +GST_MULAWENC +GST_IS_MULAWENC +GST_TYPE_MULAWENC +GST_MULAWENC_CLASS +GST_IS_MULAWENC_CLASS +gst_mulawenc_get_type + + +
+element-multifilesrc +multifilesrc +GstMultiFileSrc + +GstMultiFileSrcClass +GST_MULTI_FILE_SRC +GST_MULTI_FILE_SRC_CLASS +GST_IS_MULTI_FILE_SRC +GST_IS_MULTI_FILE_SRC_CLASS +GST_TYPE_MULTI_FILE_SRC +gst_multi_file_src_get_type +
+ +
+element-multifilesink +multifilesink +GstMultiFileSink +GstMultiFileSinkNext + +GstMultiFileSinkClass +GST_MULTI_FILE_SINK +GST_MULTI_FILE_SINK_CLASS +GST_IS_MULTI_FILE_SINK +GST_IS_MULTI_FILE_SINK_CLASS +GST_TYPE_MULTI_FILE_SINK +gst_multi_file_sink_get_type +
+ +
+element-multipartdemux +multipartdemux +GstMultipartDemux + +GstMultipartDemuxClass +GST_TYPE_MULTIPART_DEMUX +GST_MULTIPART_DEMUX +GST_MULTIPART_DEMUX_CLASS +GST_IS_MULTIPART_DEMUX +GST_IS_MULTIPART_DEMUX_CLASS +GST_MULTIPART_DEMUX_GET_CLASS +MULTIPART_DATA_EOS +MULTIPART_DATA_ERROR +MULTIPART_NEED_MORE_DATA +gst_multipart_demux_get_type +gst_multipart_demux_plugin_init +
+ +
+element-multipartmux +multipartmux +GstMultipartMux + +GstMultipartMuxClass +GST_TYPE_MULTIPART_MUX +GST_MULTIPART_MUX +GST_MULTIPART_MUX_CLASS +GST_IS_MULTIPART_MUX +GST_IS_MULTIPART_MUX_CLASS +GST_MULTIPART_MUX_GET_CLASS +gst_multipart_mux_get_type +gst_multipart_mux_plugin_init +
+ +
+element-multiudpsink +multiudpsink +GstMultiUDPSink + +GstMultiUDPSinkClass +GstUDPClient +gst_multiudpsink_add +gst_multiudpsink_remove +gst_multiudpsink_clear +gst_multiudpsink_get_stats +GST_MULTIUDPSINK +GST_IS_MULTIUDPSINK +GST_TYPE_MULTIUDPSINK +GST_MULTIUDPSINK_CLASS +GST_IS_MULTIUDPSINK_CLASS +gst_multiudpsink_get_type +
+ +
+element-oss4mixer +oss4mixer +GstOss4Mixer + +GstOss4MixerClass +GST_OSS4_MIXER +GST_OSS4_MIXER_CLASS +GST_IS_OSS4_MIXER +GST_IS_OSS4_MIXER_CLASS +GST_TYPE_OSS4_MIXER +gst_oss4_mixer_get_type +GST_OSS4_MIXER_CAST +GST_OSS4_MIXER_IS_OPEN +MIXEXT_ENUM_IS_AVAILABLE +MIXEXT_HAS_DESCRIPTION +MIXEXT_IS_ROOT +MIXEXT_IS_SLIDER +gst_oss4_mixer_get_control_val +gst_oss4_mixer_set_control_val +gst_oss4_source_input_get_type +GstOss4MixerControl +
+ +
+element-oss4sink +oss4sink +GstOss4Sink + +GstOss4SinkClass +GST_TYPE_OSS4_SINK +GST_OSS4_SINK +GST_OSS4_SINK_CLASS +GST_IS_OSS4_SINK +GST_IS_OSS4_SINK_CLASS +gst_oss4_sink_get_type +GST_OSS4_SINK_CAST +
+ +
+element-oss4src +oss4src +GstOss4Source + +GstOss4SourceClass +GST_TYPE_OSS4_SOURCE +GST_OSS4_SOURCE +GST_OSS4_SOURCE_CLASS +GST_IS_OSS4_SOURCE +GST_IS_OSS4_SOURCE_CLASS +gst_oss4_source_get_type +GST_IS_OSS4_SOURCE_INPUT +GST_IS_OSS4_SOURCE_INPUT_CLASS +GST_OSS4_SOURCE_CAST +GST_OSS4_SOURCE_INPUT +GST_OSS4_SOURCE_INPUT_CLASS +GST_TYPE_OSS4_SOURCE_INPUT +GstOss4SourceInput +GstOss4SourceInputClass +
+ +
+element-ossmixer +ossmixer +GstOssMixerElement + +GstOssMixerElementClass +GST_OSS_MIXER_ELEMENT +GST_OSS_MIXER_ELEMENT_CLASS +GST_IS_OSS_MIXER_ELEMENT +GST_IS_OSS_MIXER_ELEMENT_CLASS +GST_TYPE_OSS_MIXER_ELEMENT +gst_oss_mixer_element_get_type +
+ +
+element-osssink +osssink +GstOssSink + +GstOssSinkClass +GST_TYPE_OSSSINK +GST_OSSSINK +GST_OSSSINK_CLASS +GST_IS_OSSSINK +GST_IS_OSSSINK_CLASS +gst_oss_sink_get_type +
+ +
+element-osssrc +osssrc +GstOssSrc + +GstOssSrcClass +GST_TYPE_OSS_SRC +GST_OSS_SRC +GST_OSS_SRC_CLASS +GST_IS_OSS_SRC +GST_IS_OSS_SRC_CLASS +gst_oss_src_get_type +
+ +
+element-osxaudiosink +osxaudiosink +GstOsxAudioSink + +GstOsxAudioSinkClass +GST_TYPE_OSX_AUDIO_SINK +GST_OSX_AUDIO_SINK +GST_OSX_AUDIO_SINK_CLASS +gst_osx_audio_sink_get_type +
+ +
+element-osxaudiosrc +osxaudiosrc +GstOsxAudioSrc + +GstOsxAudioSrcClass +GST_TYPE_OSX_AUDIO_SRC +GST_OSX_AUDIO_SRC +GST_OSX_AUDIO_SRC_CLASS +gst_osx_audio_src_get_type +
+ +
+element-osxvideosink +osxvideosink +GstOSXVideoSink + +GstOSXVideoSinkClass +GstOSXWindow + +GST_IS_OSX_VIDEO_SINK +GST_IS_OSX_VIDEO_SINK_CLASS +GST_OSX_VIDEO_SINK +GST_OSX_VIDEO_SINK_CLASS +GST_TYPE_OSX_VIDEO_SINK +GST_TYPE_OSXVIDEOBUFFER +gst_osx_video_sink_get_type +
+ +
+element-pngdec +pngdec +GstPngDec + +GstPngDecClass +GST_PNGDEC +GST_IS_PNGDEC +GST_TYPE_PNGDEC +GST_PNGDEC_CLASS +GST_IS_PNGDEC_CLASS +gst_pngdec_get_type +
+ +
+element-pngenc +pngenc +GstPngEnc + +GstPngEncClass +GST_PNGENC +GST_IS_PNGENC +GST_TYPE_PNGENC +GST_PNGENC_CLASS +GST_IS_PNGENC_CLASS +gst_pngenc_get_type +
+ +
+element-pulsesink +pulsesink +GstPulseSink + +GstPulseSinkClass +GST_PULSESINK +GST_IS_PULSESINK +GST_TYPE_PULSESINK +GST_PULSESINK_CLASS +GST_IS_PULSESINK_CLASS +GST_PULSESINK_CAST +gst_pulsesink_get_type +
+ +
+element-pulsesrc +pulsesrc +GstPulseSrc + +GstPulseSrcClass +GST_PULSESRC +GST_IS_PULSESRC +GST_TYPE_PULSESRC +GST_PULSESRC_CLASS +GST_IS_PULSESRC_CLASS +GST_PULSESRC_CAST +gst_pulsesrc_get_type +
+ +
+element-pulsemixer +pulsemixer +GstPulseMixer + +GstPulseMixerClass +GST_PULSEMIXER +GST_IS_PULSEMIXER +GST_TYPE_PULSEMIXER +GST_PULSEMIXER_CLASS +GST_IS_PULSEMIXER_CLASS +gst_pulsemixer_get_type +
+ +
+element-progressreport +progressreport +GstProgressReport + +GstProgressReportClass +GST_TYPE_PROGRESS_REPORT +GST_PROGRESS_REPORT +GST_PROGRESS_REPORT_CLASS +GST_IS_PROGRESS_REPORT +GST_IS_PROGRESS_REPORT_CLASS +gst_progress_report_get_type +
+ +
+element-qtdemux +qtdemux +GstQTDemux + +GstQTDemuxClass +QtDemuxStream +GST_QT_DEMUX_CLASSIFICATION_TAG +GST_QT_DEMUX_PRIVATE_TAG +GST_IS_QTDEMUX +GST_IS_QTDEMUX_CLASS +GST_QTDEMUX +GST_QTDEMUX_CAST +GST_QTDEMUX_CLASS +GST_QTDEMUX_MAX_STREAMS +GST_TYPE_QTDEMUX +gst_qtdemux_get_type +
+ +
+element-qtmoovrecover +qtmoovrecover +GstQTMoovRecover +GstQTMoovRecoverClass +gst_qt_moov_recover_get_type +gst_qt_moov_recover_register + +
+ +
+element-qtmux +qtmux +GstQTMux + +GstQTMuxClass +GST_QT_MUX +GST_QT_MUX_CLASS +GST_IS_QT_MUX +GST_IS_QT_MUX_CLASS +GST_TYPE_QT_MUX +gst_qt_mux_get_type +
+ +
+element-rganalysis +rganalysis +GstRgAnalysis + +GstRgAnalysisClass +GST_RG_ANALYSIS +GST_RG_ANALYSIS_CLASS +GST_IS_RG_ANALYSIS +GST_IS_RG_ANALYSIS_CLASS +GST_TYPE_RG_ANALYSIS +gst_rg_analysis_get_type +
+ +
+element-rglimiter +rglimiter +GstRgLimiter + +GstRgLimiterClass +GST_RG_LIMITER +GST_RG_LIMITER_CLASS +GST_IS_RG_LIMITER +GST_IS_RG_LIMITER_CLASS +GST_TYPE_RG_LIMITER +gst_rg_limiter_get_type +
+ +
+element-rgvolume +rgvolume +GstRgVolume + +GstRgVolumeClass +GST_RG_VOLUME +GST_RG_VOLUME_CLASS +GST_IS_RG_VOLUME +GST_TYPE_RG_VOLUME +GST_IS_RG_VOLUME_CLASS +gst_rg_volume_get_type +
+ +
+element-rtpdec +rtpdec +GstRTPDec + +GstRTPDecClass +GstRTPDecSession +GST_RTP_DEC +GST_IS_RTP_DEC +GST_TYPE_RTP_DEC +GST_RTP_DEC_CLASS +GST_IS_RTP_DEC_CLASS +gst_rtp_dec_get_type +
+ +
+element-rtpj2kpay +rtpj2kpay +GstRtpJ2KPay + +GstRtpJ2KPayClass +GST_RTP_J2K_PAY +GST_IS_RTP_J2K_PAY +GST_TYPE_RTP_J2K_PAY +GST_RTP_J2K_PAY_CLASS +GST_IS_RTP_J2K_PAY_CLASS +gst_rtp_j2k_pay_plugin_init +gst_rtp_j2k_pay_get_type +
+ +
+element-rtpjpegpay +rtpjpegpay +GstRtpJPEGPay + +GstRtpJPEGPayClass +GST_RTP_JPEG_PAY +GST_IS_RTP_JPEG_PAY +GST_TYPE_RTP_JPEG_PAY +GST_RTP_JPEG_PAY_CLASS +GST_IS_RTP_JPEG_PAY_CLASS +gst_rtp_jpeg_pay_plugin_init +gst_rtp_jpeg_pay_get_type +
+ +
+element-rtspsrc +rtspsrc +GstRTSPSrc + +GstRTSPStream +GstRTSPSrcClass +GstRTSPNatMethod +GST_RTSPSRC +GST_IS_RTSPSRC +GST_TYPE_RTSPSRC +GST_RTSPSRC_CLASS +GST_IS_RTSPSRC_CLASS +GST_RTSPSRC_CAST +GST_RTSP_CONN_GET_LOCK +GST_RTSP_CONN_LOCK +GST_RTSP_CONN_UNLOCK +GST_RTSP_STATE_GET_LOCK +GST_RTSP_STATE_LOCK +GST_RTSP_STATE_UNLOCK +GST_RTSP_STREAM_GET_LOCK +GST_RTSP_STREAM_LOCK +GST_RTSP_STREAM_UNLOCK +gst_rtspsrc_get_type +
+ +
+element-shapewipe +shapewipe +GstShapeWipe + +GstShapeWipeClass +GST_SHAPE_WIPE +GST_SHAPE_WIPE_CLASS +GST_IS_SHAPE_WIPE +GST_IS_SHAPE_WIPE_CLASS +GST_SHAPE_WIPE_GET_CLASS +GST_TYPE_SHAPE_WIPE +gst_shape_wipe_get_type +
+ +
+element-smpte +smpte +GstSMPTE + +GstSMPTEClass +GST_SMPTE +GST_IS_SMPTE +GST_TYPE_SMPTE +GST_SMPTE_CLASS +GST_IS_SMPTE_CLASS +gst_smpte_plugin_init +
+ +
+element-smptealpha +smptealpha +GstSMPTEAlpha + +GstSMPTEAlphaClass +GST_SMPTE_ALPHA +GST_IS_SMPTE_ALPHA +GST_TYPE_SMPTE_ALPHA +GST_SMPTE_ALPHA_CLASS +GST_IS_SMPTE_ALPHA_CLASS +gst_smpte_alpha_plugin_init +
+ +
+element-souphttpsrc +souphttpsrc +GstSoupHTTPSrc + +GstSoupHTTPSrcClass +GstSoupHTTPSrcSessionIOStatus +GST_SOUP_HTTP_SRC +GST_SOUP_HTTP_SRC_CLASS +GST_IS_SOUP_HTTP_SRC +GST_IS_SOUP_HTTP_SRC_CLASS +GST_TYPE_SOUP_HTTP_SRC +gst_soup_http_src_get_type +
+ +
+element-smokedec +smokedec +GstSmokeDec + +GstSmokeDecClass +GST_SMOKEDEC +GST_IS_SMOKEDEC +GST_TYPE_SMOKEDEC +gst_smokedec_get_type +GST_SMOKEDEC_CLASS +GST_IS_SMOKEDEC_CLASS +
+ +
+element-smokeenc +smokeenc +GstSmokeEnc + +GstSmokeEncClass +GST_SMOKEENC +GST_IS_SMOKEENC +GST_TYPE_SMOKEENC +gst_smokeenc_get_type +GST_SMOKEENC_CLASS +GST_IS_SMOKEENC_CLASS +
+ +
+element-spectrum +spectrum +GstSpectrum + +GstSpectrumClass +GST_SPECTRUM +GST_SPECTRUM_CLASS +GST_IS_SPECTRUM +GST_IS_SPECTRUM_CLASS +GST_TYPE_SPECTRUM +gst_spectrum_get_type +
+ +
+element-speexdec +speexdec +GstSpeexDec + +GstSpeexDecClass +GST_TYPE_SPEEX_DEC +GST_SPEEX_DEC +GST_SPEEX_DEC_CLASS +GST_IS_SPEEX_DEC +GST_IS_SPEEX_DEC_CLASS +gst_speex_dec_get_type +
+ +
+element-speexenc +speexenc +GstSpeexEnc + +GstSpeexEncClass +GstSpeexMode +GST_TYPE_SPEEX_ENC +GST_SPEEX_ENC +GST_SPEEX_ENC_CLASS +GST_IS_SPEEX_ENC +GST_IS_SPEEX_ENC_CLASS +gst_speex_enc_get_type +
+ +
+element-splitfilesrc +splitfilesrc +GstSplitFileSrc + +GstSplitFileSrcClass +GST_SPLIT_FILE_SRC +GST_SPLIT_FILE_SRC_CLASS +GST_IS_SPLIT_FILE_SRC +GST_IS_SPLIT_FILE_SRC_CLASS +GST_TYPE_SPLIT_FILE_SRC +gst_split_file_src_get_type +
+ +
+element-taginject +taginject +GstTagInject + +GstTagInjectClass +GST_TAG_INJECT +GST_IS_TAG_INJECT +GST_TYPE_TAG_INJECT +GST_TAG_INJECT_CLASS +GST_IS_TAG_INJECT_CLASS +gst_tag_inject_get_type +
+ +
+element-udpsrc +udpsrc +GstUDPSrc + +GstUDPSrcClass +GST_UDPSRC +GST_IS_UDPSRC +GST_TYPE_UDPSRC +GST_UDPSRC_CLASS +GST_IS_UDPSRC_CLASS +GST_UDPSRC_CAST +gst_udpsrc_get_type +
+ +
+element-udpsink +udpsink +GstUDPSink + +GstUDPSinkClass +GST_UDPSINK +GST_IS_UDPSINK +GST_TYPE_UDPSINK +GST_UDPSINK_CLASS +GST_IS_UDPSINK_CLASS +gst_udpsink_get_type +
+ +
+element-videobox +videobox +GstVideoBox + +GstVideoBoxClass +GstVideoBoxFill +GST_IS_VIDEO_BOX +GST_IS_VIDEO_BOX_CLASS +GST_TYPE_VIDEO_BOX +GST_VIDEO_BOX +GST_VIDEO_BOX_CLASS +gst_video_box_get_type +gst_video_crop_get_type +
+ +
+element-videocrop +videocrop +GstVideoCrop + +GstVideoCropClass +VideoCropPixelFormat +GstVideoCropImageDetails +GST_IS_VIDEO_CROP +GST_IS_VIDEO_CROP_CLASS +GST_VIDEO_CROP +GST_VIDEO_CROP_CLASS +GST_TYPE_VIDEO_CROP +
+ +
+element-aspectratiocrop +aspectratiocrop +GstAspectRatioCrop + +GstAspectRatioCropClass +GST_IS_ASPECT_RATIO_CROP +GST_IS_ASPECT_RATIO_CROP_CLASS +GST_ASPECT_RATIO_CROP +GST_ASPECT_RATIO_CROP_CLASS +GST_TYPE_ASPECT_RATIO_CROP +gst_aspect_ratio_crop_get_type +
+ +
+element-videoflip +videoflip +GstVideoFlip +GstVideoFlipMethod + +GstVideoFlipClass +GST_VIDEO_FLIP +GST_IS_VIDEO_FLIP +GST_TYPE_VIDEO_FLIP +gst_video_flip_get_type +GST_VIDEO_FLIP_CLASS +GST_IS_VIDEO_FLIP_CLASS +
+ +
+element-videobalance +videobalance +GstVideoBalance + +GstVideoBalanceClass +GST_VIDEO_BALANCE +GST_IS_VIDEO_BALANCE +GST_TYPE_VIDEO_BALANCE +gst_video_balance_get_type +GST_VIDEO_BALANCE_CLASS +GST_IS_VIDEO_BALANCE_CLASS +
+ +
+gstvideomixerpad +GstVideoMixerPad +GstVideoMixerPad + +GstVideoMixerPadClass +GstVideoMixerCollect +GST_VIDEO_MIXER_PAD +GST_VIDEO_MIXER_PAD_CLASS +GST_IS_VIDEO_MIXER_PAD +GST_IS_VIDEO_MIXER_PAD_CLASS +GST_TYPE_VIDEO_MIXER_PAD +
+ +
+element-videomixer +videomixer +GstVideoMixer +GstVideoMixerBackground + +GstVideoMixerClass +GST_VIDEO_MIXER +GST_IS_VIDEO_MIXER +GST_TYPE_VIDEO_MIXER +GST_VIDEO_MIXER_CLASS +GST_IS_VIDEO_MIXER_CLASS +gst_video_mixer_get_type +
+ +
+gstvideomixer2pad +GstVideoMixer2Pad +GstVideoMixer2Pad + +GstVideoMixer2PadClass +GST_VIDEO_MIXER2_PAD +GST_VIDEO_MIXER2_PAD_CLASS +GST_IS_VIDEO_MIXER2_PAD +GST_IS_VIDEO_MIXER2_PAD_CLASS +GST_TYPE_VIDEO_MIXER2_PAD +gst_videomixer2_pad_get_type +
+ +
+element-videomixer2 +videomixer2 +GstVideoMixer2 +GstVideoMixer2Background + +GstVideoMixer2Class +GST_VIDEO_MIXER2 +GST_IS_VIDEO_MIXER2 +GST_TYPE_VIDEO_MIXER2 +GST_VIDEO_MIXER2_CLASS +GST_IS_VIDEO_MIXER2_CLASS +gst_videomixer2_get_type +
+ +
+element-v4l2src +v4l2src +GstV4l2Src + +GstV4l2SrcGetFunc +GstV4l2SrcClass +GST_V4L2SRC +GST_IS_V4L2SRC +GST_TYPE_V4L2SRC +GST_V4L2SRC_CLASS +GST_IS_V4L2SRC_CLASS +gst_v4l2src_get_type +
+ +
+element-v4l2sink +v4l2sink +GstV4l2Sink + +GstV4l2SinkClass +GST_V4L2SINK +GST_IS_V4L2SINK +GST_TYPE_V4L2SINK +GST_V4L2SINK_CLASS +GST_IS_V4L2SINK_CLASS +gst_v4l2sink_get_type +
+ +
+element-v4l2radio +v4l2radio +GstV4l2Radio + +GstV4l2RadioClass +GST_V4L2RADIO +GST_IS_V4L2RADIO +GST_TYPE_V4L2RADIO +GST_V4L2RADIO_CLASS +GST_IS_V4L2RADIO_CLASS +gst_v4l2radio_get_type +
+ +
+element-waveformsink +waveformsink +GstWaveFormSink + +GstWaveFormSinkClass +GST_IS_WAVEFORM_SINK +GST_IS_WAVEFORM_SINK_CLASS +GST_WAVEFORM_SINK +GST_WAVEFORM_SINK_CLASS +GST_TYPE_WAVEFORM_SINK +gst_waveform_sink_get_type +WAVE_FORMAT_96M08 +WAVE_FORMAT_96M16 +WAVE_FORMAT_96S08 +WAVE_FORMAT_96S16 +BUFFER_COUNT +BUFFER_SIZE +ERROR_LENGTH +
+ +
+element-wavenc +wavenc +GstWavEnc + +GstWavEncClass +GST_WAVENC +GST_IS_WAVENC +GST_TYPE_WAVENC +GST_WAVENC_CLASS +GST_IS_WAVENC_CLASS +gst_wavenc_get_type +
+ +
+element-wavpackdec +wavpackdec +GstWavpackDec + +GstWavpackDecClass +GST_IS_WAVPACK_DEC +GST_IS_WAVPACK_DEC_CLASS +GST_WAVPACK_DEC +GST_WAVPACK_DEC_CLASS +GST_TYPE_WAVPACK_DEC +gst_wavpack_dec_get_type +gst_wavpack_dec_plugin_init +
+ +
+element-wavpackenc +wavpackenc +GstWavpackEnc + +GstWavpackEncClass +GST_IS_WAVPACK_ENC +GST_IS_WAVPACK_ENC_CLASS +GST_WAVPACK_ENC +GST_WAVPACK_ENC_CLASS +GST_TYPE_WAVPACK_ENC +gst_wavpack_enc_get_type +gst_wavpack_enc_plugin_init +
+ +
+element-wavpackparse +wavpackparse +GstWavpackParse + +GstWavpackParseClass +GstWavpackParseIndexEntry +GST_IS_WAVPACK_PARSE +GST_IS_WAVPACK_PARSE_CLASS +GST_WAVPACK_PARSE +GST_WAVPACK_PARSE_CLASS +GST_TYPE_WAVPACK_PARSE +gst_wavpack_parse_get_type +gst_wavpack_parse_plugin_init +
+ +
+element-wavparse +wavparse +GstWavParse + +GstWavParseClass +GstWavParseState +GST_WAVPARSE +GST_IS_WAVPARSE +GST_TYPE_WAVPARSE +GST_WAVPARSE_CLASS +GST_IS_WAVPARSE_CLASS +gst_wavparse_get_type +
+ +
+element-ximagesrc +ximagesrc +GstXImageSrc + +GstXImageSrcClass +GST_XIMAGE_SRC +GST_IS_XIMAGE_SRC +GST_TYPE_XIMAGE_SRC +GST_XIMAGE_SRC_CLASS +GST_IS_XIMAGE_SRC_CLASS +gst_ximage_src_get_type +
+ +
+element-y4menc +y4menc +GstY4mEncode + +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 +
+ +
+element-agingtv +agingtv +GstAgingTV + +SCRATCH_MAX +GstAgingTVClass +GST_AGINGTV +GST_AGINGTV_CLASS +GST_IS_AGINGTV +GST_IS_AGINGTV_CLASS +GST_TYPE_AGINGTV +gst_agingtv_get_type +
+ +
+element-dicetv +dicetv +GstDiceTV + +GstDiceTVClass +GST_DICETV +GST_DICETV_CLASS +GST_IS_DICETV +GST_IS_DICETV_CLASS +GST_TYPE_DICETV +gst_dicetv_get_type +
+ +
+element-edgetv +edgetv +GstEdgeTV + +GstEdgeTVClass +GST_EDGETV +GST_EDGETV_CLASS +GST_IS_EDGETV +GST_IS_EDGETV_CLASS +GST_TYPE_EDGETV +gst_edgetv_get_type +
+ +
+element-optv +optv +GstOpTV + +GstOpTVClass +GST_OPTV +GST_OPTV_CLASS +GST_IS_OPTV +GST_IS_OPTV_CLASS +GST_TYPE_OPTV +gst_optv_get_type +
+ +
+element-quarktv +quarktv +GstQuarkTV + +GstQuarkTVClass +GST_QUARKTV +GST_QUARKTV_CLASS +GST_IS_QUARKTV +GST_IS_QUARKTV_CLASS +GST_TYPE_QUARKTV +gst_quarktv_get_type +
+ +
+element-radioactv +radioactv +GstRadioacTV + +GstRadioacTVClass +GST_RADIOACTV +GST_RADIOACTV_CLASS +GST_IS_RADIOACTV +GST_IS_RADIOACTV_CLASS +GST_TYPE_RADIOACTV +gst_radioactv_get_type +
+ +
+element-revtv +revtv +GstRevTV + +GstRevTVClass +GST_REVTV +GST_REVTV_CLASS +GST_IS_REVTV +GST_IS_REVTV_CLASS +GST_TYPE_REVTV +gst_revtv_get_type +
+ +
+element-rippletv +rippletv +GstRippleTV + +GstRippleTVClass +GST_RIPPLETV +GST_RIPPLETV_CLASS +GST_IS_RIPPLETV +GST_IS_RIPPLETV_CLASS +GST_TYPE_RIPPLETV +gst_rippletv_get_type +
+ +
+element-shagadelictv +shagadelictv +GstShagadelicTV + +GstShagadelicTVClass +GST_SHAGADELICTV +GST_SHAGADELICTV_CLASS +GST_IS_SHAGADELICTV +GST_IS_SHAGADELICTV_CLASS +GST_TYPE_SHAGADELICTV +gst_shagadelictv_get_type +
+ +
+element-streaktv +streaktv +GstStreakTV + +PLANES +GstStreakTVClass +GST_STREAKTV +GST_STREAKTV_CLASS +GST_IS_STREAKTV +GST_IS_STREAKTV_CLASS +GST_TYPE_STREAKTV +gst_streaktv_get_type +
+ +
+element-vertigotv +vertigotv +GstVertigoTV + +GstVertigoTVClass +GST_VERTIGOTV +GST_VERTIGOTV_CLASS +GST_IS_VERTIGOTV +GST_IS_VERTIGOTV_CLASS +GST_TYPE_VERTIGOTV +gst_vertigotv_get_type +
+ +
+element-warptv +warptv +GstWarpTV + +GstWarpTVClass +GST_WARPTV +GST_WARPTV_CLASS +GST_IS_WARPTV +GST_IS_WARPTV_CLASS +GST_TYPE_WARPTV +gst_warptv_get_type +
+ +
+element-webmmux +webmmux +GstWebMMux + +GST_TYPE_WEBM_MUX +GST_WEBM_MUX +GST_WEBM_MUX_CLASS +GST_IS_WEBM_MUX +GST_IS_WEBM_MUX_CLASS +gst_webm_mux_get_type +GstWebMMuxClass +
diff --git a/docs/plugins/gst-plugins-good-plugins.args b/docs/plugins/gst-plugins-good-plugins.args new file mode 100644 index 0000000..625e93e --- /dev/null +++ b/docs/plugins/gst-plugins-good-plugins.args @@ -0,0 +1,22420 @@ + +GstIirEqualizer10Bands::band0 +gdouble +[-24,12] +rw +29 Hz +gain for the frequency band 29 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band1 +gdouble +[-24,12] +rw +59 Hz +gain for the frequency band 59 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band2 +gdouble +[-24,12] +rw +119 Hz +gain for the frequency band 119 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band3 +gdouble +[-24,12] +rw +237 Hz +gain for the frequency band 237 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band4 +gdouble +[-24,12] +rw +474 Hz +gain for the frequency band 474 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band5 +gdouble +[-24,12] +rw +947 Hz +gain for the frequency band 947 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band6 +gdouble +[-24,12] +rw +1889 Hz +gain for the frequency band 1889 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band7 +gdouble +[-24,12] +rw +3770 Hz +gain for the frequency band 3770 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band8 +gdouble +[-24,12] +rw +7523 Hz +gain for the frequency band 7523 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer10Bands::band9 +gdouble +[-24,12] +rw +15011 Hz +gain for the frequency band 15011 Hz, ranging from -24 dB to +12 dB. +0 + + + +GstIirEqualizer3Bands::band0 +gdouble +[-24,12] +rw +110 Hz +gain for the frequency band 100 Hz, ranging from -24.0 to +12.0. +0 + + + +GstIirEqualizer3Bands::band1 +gdouble +[-24,12] +rw +1100 Hz +gain for the frequency band 1100 Hz, ranging from -24.0 to +12.0. +0 + + + +GstIirEqualizer3Bands::band2 +gdouble +[-24,12] +rw +11 kHz +gain for the frequency band 11 kHz, ranging from -24.0 to +12.0. +0 + + + +GstIirEqualizerNBands::num-bands +guint +[1,64] +rwx +num-bands +number of different bands to use. +10 + + + +GstMultiFileSink::location +gchar* + +rw +File Location +Location of the file to write. +NULL + + + +GstMultiFileSink::index +gint +>= 0 +rw +Index +Index to use with location property to create file names. The index is incremented by one for each buffer written. +0 + + + +GstMultiFileSink::next-file +GstMultiFileSinkNext + +rw +Next File +When to start a new file. +New file for each buffer + + + +GstMultiFileSink::post-messages +gboolean + +rw +Post Messages +Post a message for each file with information of the buffer. +FALSE + + + +GstMultiFileSink::max-files +guint + +rw +Max files +Maximum number of files to keep on disk. Once the maximum is reached,old files start to be deleted to make room for new ones. +0 + + + +GstMultiFileSink::max-file-size +guint64 + +rw +Maximum File Size +Maximum file size before starting a new file in max-size mode. +2147483648 + + + +GstMultiFileSrc::caps +GstCaps* + +rw +Caps +Caps describing the format of the data. + + + + +GstMultiFileSrc::index +gint +>= 0 +rw +File Index +Index to use with location property to create file names. The index is incremented by one for each buffer read. +0 + + + +GstMultiFileSrc::location +gchar* + +rw +File Location +Pattern to create file names of input files. File names are created by calling sprintf() with the pattern and the current index. +"%05d" + + + +GstMultiFileSrc::loop +gboolean + +rw +Loop +Whether to repeat from the beginning when all files have been read. +FALSE + + + +GstMultiFileSrc::start-index +gint +>= 0 +rw +Start Index +Start value of index. The initial value of index can be set either by setting index or start-index. When the end of the loop is reached, the index will be set to the value start-index. +0 + + + +GstMultiFileSrc::stop-index +gint +>= G_MAXULONG +rw +Start Index +Stop value of index. The special value -1 means no stop. +0 + + + +GstOssSrc::device +gchar* + +rw +Device +OSS device (usually /dev/dspN). +"/dev/dsp" + + + +GstOssSrc::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +"" + + + +GstSpectrum::bands +guint + +rw +Bands +Number of frequency bands. +128 + + + +GstSpectrum::interval +guint64 +>= 1 +rw +Interval +Interval of time between message posts (in nanoseconds). +100000000 + + + +GstSpectrum::message +gboolean + +rw +Message +Whether to post a 'spectrum' element message on the bus for each passed interval (deprecated, use post-messages). +TRUE + + + +GstSpectrum::threshold +gint +<= 0 +rw +Threshold +dB threshold for result. All lower values will be set to this. +-60 + + + +GstSpectrum::message-magnitude +gboolean + +rw +Magnitude +Whether to add a 'magnitude' field to the structure of any 'spectrum' element messages posted on the bus. +TRUE + + + +GstSpectrum::message-phase +gboolean + +rw +Phase +Whether to add a 'phase' field to the structure of any 'spectrum' element messages posted on the bus. +FALSE + + + +GstSpectrum::post-messages +gboolean + +rw +Post Messages +Whether to post a 'spectrum' element message on the bus for each passed interval. +TRUE + + + +GstSpectrum::multi-channel +gboolean + +rw +Multichannel results +Send separate results for each channel. +FALSE + + + +GstVideoflip::method +GstVideoflipMethod + +rw +method +method. +Rotate clockwise 90 degrees + + + +GstVideoBox::alpha +gdouble +[0,1] +rw +Alpha +Alpha value picture. +1 + + + +GstVideoBox::border-alpha +gdouble +[0,1] +rw +Border Alpha +Alpha value of the border. +1 + + + +GstVideoBox::bottom +gint + +rw +Bottom +Pixels to box at bottom (<0 = add a border). +0 + + + +GstVideoBox::fill +GstVideoBoxFill + +rw +Fill +How to fill the borders. +Black + + + +GstVideoBox::left +gint + +rw +Left +Pixels to box at left (<0 = add a border). +0 + + + +GstVideoBox::right +gint + +rw +Right +Pixels to box at right (<0 = add a border). +0 + + + +GstVideoBox::top +gint + +rw +Top +Pixels to box at top (<0 = add a border). +0 + + + +GstVideoBox::autocrop +gboolean + +rw +Auto crop +Auto crop. +FALSE + + + +GstUDPSink::host +gchar* + +rw +host +The host/IP/Multicast group to send the packets to. +"localhost" + + + +GstUDPSink::port +gint +[0,65535] +rw +port +The port to send the packets to. +4951 + + + +GstUDPSrc::caps +GstCaps* + +rw +Caps +The caps of the source pad. + + + + +GstUDPSrc::multicast-group +gchar* + +rw +Multicast Group +The Address of multicast group to join. +"0.0.0.0" + + + +GstUDPSrc::port +gint +[0,65535] +rw +Port +The port to receive the packets from, 0=allocate. +4951 + + + +GstUDPSrc::uri +gchar* + +rw +URI +URI in the form of udp://multicast_group:port. +"udp://0.0.0.0:4951" + + + +GstUDPSrc::sockfd +gint +>= G_MAXULONG +rw +Socket Handle +Socket to use for UDP reception. (-1 == allocate). +-1 + + + +GstUDPSrc::buffer-size +gint +>= 0 +rw +Buffer Size +Size of the kernel receive buffer in bytes, 0=default. +0 + + + +GstUDPSrc::timeout +guint64 + +rw +Timeout +Post a message after timeout microseconds (0 = disabled). +0 + + + +GstUDPSrc::closefd +gboolean + +rw +Close sockfd +Close sockfd if passed as property on state change. +TRUE + + + +GstUDPSrc::skip-first-bytes +gint +>= 0 +rw +Skip first bytes +number of bytes to skip for each udp packet. +0 + + + +GstUDPSrc::sock +gint +>= G_MAXULONG +r +Socket Handle +Socket currently in use for UDP reception. (-1 = no socket). +-1 + + + +GstUDPSrc::auto-multicast +gboolean + +rw +Auto Multicast +Automatically join/leave multicast groups. +TRUE + + + +GstUDPSrc::multicast-iface +gchar* + +rw +Multicast Interface +The network interface on which to join the multicast group. +NULL + + + +GstUDPSrc::reuse +gboolean + +rw +Reuse +Enable reuse of the port. +TRUE + + + +GstSMPTE::border +gint +>= 0 +rw +Border +The border width of the transition. +0 + + + +GstSMPTE::depth +gint +[1,24] +rw +Depth +Depth of the mask in bits. +16 + + + +GstSMPTE::fps +gfloat +>= 0 +rw +FPS +Frames per second if no input files are given (deprecated). +0 + + + +GstSMPTE::type +GstSMPTETransitionType + +rw +Type +The type of transition to use. +A bar moves from left to right + + + +GstSMPTE::duration +guint64 + +rw +Duration +Duration of the transition effect in nanoseconds. +1000000000 + + + +GstSMPTE::invert +gboolean + +rw +Invert +Invert transition mask. +FALSE + + + +GstRTSPSrc::debug +gboolean + +rw +Debug +Dump request and response messages to stdout. +FALSE + + + +GstRTSPSrc::location +gchar* + +rw +RTSP Location +Location of the RTSP url to read. +NULL + + + +GstRTSPSrc::protocols +GstRTSPLowerTrans + +rw +Protocols +Allowed lower transport protocols. +GST_RTSP_LOWER_TRANS_UDP|GST_RTSP_LOWER_TRANS_UDP_MCAST|GST_RTSP_LOWER_TRANS_TCP + + + +GstRTSPSrc::retry +guint +<= 65535 +rw +Retry +Max number of retries when allocating RTP ports. +20 + + + +GstRTSPSrc::timeout +guint64 + +rw +Timeout +Retry TCP transport after UDP timeout microseconds (0 = disabled). +5000000 + + + +GstRTSPSrc::latency +guint + +rw +Buffer latency in ms +Amount of ms to buffer. +2000 + + + +GstRTSPSrc::tcp-timeout +guint64 + +rw +TCP Timeout +Fail after timeout microseconds on TCP connections (0 = disabled). +20000000 + + + +GstRTSPSrc::connection-speed +guint +<= 2147483 +rw +Connection Speed +Network connection speed in kbps (0 = unknown). +0 + + + +GstRTSPSrc::nat-method +GstRTSPNatMethod + +rw +NAT Method +Method to use for traversing firewalls and NAT. +Send Dummy packets + + + +GstRTSPSrc::do-rtcp +gboolean + +rw +Do RTCP +Send RTCP packets, disable for old incompatible server. +TRUE + + + +GstRTSPSrc::proxy +gchar* + +rw +Proxy +Proxy settings for HTTP tunneling. Format: [http://][user:passwd@]host[:port]. +NULL + + + +GstRTSPSrc::rtp-blocksize +guint +<= 65536 +rw +RTP Blocksize +RTP package size to suggest to server (0 = disabled). +0 + + + +GstRTSPSrc::user-id +gchar* + +rw +user-id +RTSP location URI user id for authentication. +NULL + + + +GstRTSPSrc::user-pw +gchar* + +rw +user-pw +RTSP location URI user password for authentication. +NULL + + + +GstRTSPSrc::buffer-mode +GstRTSPSrcBufferMode + +rw +Buffer Mode +Control the buffering algorithm in use. +Choose mode depending on stream live + + + +GstRTSPSrc::port-range +gchar* + +rw +Port range +Client port range that can be used to receive RTP and RTCP data, eg. 3000-3005 (NULL = no restrictions). +NULL + + + +GstRTSPSrc::udp-buffer-size +gint +>= 0 +rw +UDP Buffer Size +Size of the kernel UDP receive buffer in bytes, 0=default. +524288 + + + +GstRTSPSrc::short-header +gboolean + +rw +Short Header +Only send the basic RTSP headers for broken encoders. +FALSE + + + +GstRTPDec::skip +gint + +rw +Skip +skip (unused). +0 + + + +GstRTPDec::latency +guint + +rw +Buffer latency in ms +Amount of ms to buffer. +200 + + + +GstLevel::interval +guint64 +>= 1 +rw +Interval +Interval of time between message posts (in nanoseconds). +100000000 + + + +GstLevel::message +gboolean + +rw +message +Post a level message for each passed interval. +TRUE + + + +GstLevel::peak-falloff +gdouble +>= 0 +rw +Peak Falloff +Decay rate of decay peak after TTL (in dB/sec). +10 + + + +GstLevel::peak-ttl +guint64 + +rw +Peak TTL +Time To Live of decay peak before it falls back (in nanoseconds). +300000000 + + + +GstDiceTV::square-bits +gint +[0,5] +rw +Square Bits +The size of the Squares. +4 + + + +GstVertigoTV::speed +gfloat +[0.01,100] +rw +Speed +Control the speed of movement. +0.02 + + + +GstVertigoTV::zoom-speed +gfloat +[1.01,1.1] +rw +Zoom Speed +Control the rate of zooming. +1.01 + + + +GstRevTV::delay +gint +[1,100] +rw +Delay +Delay in frames between updates. +1 + + + +GstRevTV::gain +gint +[1,200] +rw +Gain +Control gain. +50 + + + +GstRevTV::linespace +gint +[1,100] +rw +Linespace +Control line spacing. +6 + + + +GstQuarkTV::planes +gint +[0,64] +rw +Planes +Number of planes. +16 + + + +GstEFence::fence-top +gboolean + +rw +Fence Top +Align buffers with top of fenced region. +TRUE + + + +GstAlpha::alpha +gdouble +[0,1] +rw +Alpha +The value for the alpha channel. +1 + + + +GstAlpha::angle +gfloat +[0,90] +rw +Angle +Size of the colorcube to change. +20 + + + +GstAlpha::method +GstAlphaMethod + +rw +Method +How the alpha channels should be created. +Set/adjust alpha channel + + + +GstAlpha::noise-level +gfloat +[0,64] +rw +Noise Level +Size of noise radius. +2 + + + +GstAlpha::target-b +guint +<= 255 +rw +Target Blue +The Blue target. +0 + + + +GstAlpha::target-g +guint +<= 255 +rw +Target Green +The Green target. +255 + + + +GstAlpha::target-r +guint +<= 255 +rw +Target Red +The Red target. +0 + + + +GstAlpha::black-sensitivity +guint +<= 128 +rw +Black Sensitivity +Sensitivity to dark colors. +100 + + + +GstAlpha::white-sensitivity +guint +<= 128 +rw +Sensitivity +Sensitivity to bright colors. +100 + + + +GstAlpha::prefer-passthrough +gboolean + +rw +Prefer Passthrough +Don't do any processing for alpha=1.0 if possible. +FALSE + + + +GstShout2send::description +gchar* + +rw +description +description. +"" + + + +GstShout2send::genre +gchar* + +rw +genre +genre. +"" + + + +GstShout2send::ip +gchar* + +rw +ip +ip. +"127.0.0.1" + + + +GstShout2send::mount +gchar* + +rw +mount +mount. +"" + + + +GstShout2send::password +gchar* + +rw +password +password. +"hackme" + + + +GstShout2send::port +gint +[1,65535] +rw +port +port. +8000 + + + +GstShout2send::protocol +GstShout2SendProtocol + +rw +protocol +Connection Protocol to use. +Http Protocol (icecast 2.x) + + + +GstShout2send::streamname +gchar* + +rw +streamname +name of the stream. +"" + + + +GstShout2send::sync +gboolean + +rw +Sync +Sync on the clock. +FALSE + + + +GstShout2send::url +gchar* + +rw +url +url. +"" + + + +GstShout2send::username +gchar* + +rw +username +username. +"source" + + + +GstShout2send::public +gboolean + +rw +public +If the stream should be listed on the server's stream directory. +FALSE + + + +GstSpeexDec::enh +gboolean + +rw +Enh +Enable perceptual enhancement. +TRUE + + + +DV1394Src::channel +gint +[0,64] +rw +Channel +Channel number for listening. +63 + + + +DV1394Src::consecutive +gint +>= 1 +rw +consecutive frames +send n consecutive frames after skipping. +1 + + + +DV1394Src::drop-incomplete +gboolean + +rw +drop_incomplete +drop incomplete frames. +TRUE + + + +DV1394Src::guid +guint64 + +rw +GUID +select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid). +0 + + + +DV1394Src::port +gint +[-1,16] +rw +Port +Port number (-1 automatic). +-1 + + + +DV1394Src::skip +gint +>= 0 +rw +skip frames +skip n frames. +0 + + + +DV1394Src::use-avc +gboolean + +rw +Use AV/C +Use AV/C VTR control. +TRUE + + + +GstPngEnc::compression-level +guint +<= 9 +rw +compression-level +PNG compression level. +6 + + + +GstPngEnc::snapshot +gboolean + +rw +Snapshot +Send EOS after encoding a frame, useful for snapshots. +TRUE + + + +GstCACASink::anti-aliasing +gboolean + +rw +Anti Aliasing +Enables Anti-Aliasing. +TRUE + + + +GstCACASink::dither +GstCACASinkDithering + +rw +Dither Type +Set type of Dither. +No dithering + + + +GstCACASink::screen-height +gint +>= 0 +r +Screen Height +The height of the screen. +25 + + + +GstCACASink::screen-width +gint +>= 0 +r +Screen Width +The width of the screen. +80 + + + +GstJpegEnc::quality +gint +[0,100] +rw +Quality +Quality of encoding. +85 + + + +GstJpegEnc::idct-method +GstIDCTMethod + +rw +IDCT Method +The IDCT algorithm to use. +Faster, less accurate integer method + + + +GstSmokeEnc::keyframe +gint +[1,100000] +rw +Keyframe +Insert keyframe every N frames. +20 + + + +GstSmokeEnc::qmax +gint +[0,100] +rw +Qmax +Maximum quality. +85 + + + +GstSmokeEnc::qmin +gint +[0,100] +rw +Qmin +Minimum quality. +10 + + + +GstSmokeEnc::threshold +gint +[0,100000000] +rw +Threshold +Motion estimation threshold. +3000 + + + +GstEsdSink::host +gchar* + +rw +Host +The host running the esound daemon. +NULL + + + +GstDVDec::clamp-chroma +gboolean + +rw +Clamp chroma +Clamp chroma. +FALSE + + + +GstDVDec::clamp-luma +gboolean + +rw +Clamp luma +Clamp luma. +FALSE + + + +GstDVDec::drop-factor +gint +>= 1 +rw +Drop Factor +Only decode Nth frame. +1 + + + +GstDVDec::quality +GstDVDecQualityEnum + +rw +Quality +Decoding quality. +Highest quality colour decoding + + + +GstAASink::brightness +gint + +rw +brightness +brightness. +0 + + + +GstAASink::contrast +gint + +rw +contrast +contrast. +0 + + + +GstAASink::dither +GstAASinkDitherers + +rw +dither +dither. +no dithering + + + +GstAASink::driver +GstAASinkDrivers + +rw +driver +driver. +X11 driver 1.1 + + + +GstAASink::frame-time +gint + +r +frame time +frame time. +0 + + + +GstAASink::frames-displayed +gint + +r +frames displayed +frames displayed. +0 + + + +GstAASink::gamma +gfloat +[0,5] +rw +gamma +gamma. +1 + + + +GstAASink::height +gint + +rw +height +height. +0 + + + +GstAASink::inversion +gboolean + +rw +inversion +inversion. +TRUE + + + +GstAASink::randomval +gint + +rw +randomval +randomval. +0 + + + +GstAASink::width +gint + +rw +width +width. +0 + + + +GstRtpGSMParse::frequency +gint + +rw +frequency +frequency. +8000 + + + +GstSpeexEnc::abr +gint +>= 0 +rwx +ABR +Enable average bit-rate (0 = disabled). +0 + + + +GstSpeexEnc::bitrate +gint +>= 0 +rwx +Encoding Bit-rate +Specify an encoding bit-rate (in bps). (0 = automatic). +0 + + + +GstSpeexEnc::complexity +gint +>= 0 +rwx +Complexity +Set encoding complexity. +3 + + + +GstSpeexEnc::dtx +gboolean + +rwx +DTX +Enable discontinuous transmission. +FALSE + + + +GstSpeexEnc::last-message +gchar* + +r +last-message +The last status message. +NULL + + + +GstSpeexEnc::nframes +gint +>= 0 +rwx +NFrames +Number of frames per buffer. +1 + + + +GstSpeexEnc::quality +gfloat +[0,10] +rwx +Quality +Encoding quality. +8 + + + +GstSpeexEnc::vad +gboolean + +rwx +VAD +Enable voice activity detection. +FALSE + + + +GstSpeexEnc::vbr +gboolean + +rwx +VBR +Enable variable bit-rate. +FALSE + + + +GstSpeexEnc::mode +GstSpeexEncMode + +rwx +Mode +The encoding mode. +Auto + + + +GstDV1394Src::channel +gint +[0,64] +rw +Channel +Channel number for listening. +63 + + + +GstDV1394Src::consecutive +gint +>= 1 +rw +consecutive frames +send n consecutive frames after skipping. +1 + + + +GstDV1394Src::drop-incomplete +gboolean + +rw +drop incomplete +drop incomplete frames. +TRUE + + + +GstDV1394Src::guid +guint64 + +rw +GUID +select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid). +0 + + + +GstDV1394Src::port +gint +[G_MAXULONG,16] +rw +Port +Port number (-1 automatic). +-1 + + + +GstDV1394Src::skip +gint +>= 0 +rw +skip frames +skip n frames. +0 + + + +GstDV1394Src::use-avc +gboolean + +rw +Use AV/C +Use AV/C VTR control. +TRUE + + + +GstDV1394Src::device-name +gchar* + +r +device name +user-friendly name of the device. +"Default" + + + +GstFlacEnc::blocksize +guint +[16,65535] +rwx +Blocksize +Blocksize in samples. +4608 + + + +GstFlacEnc::escape-coding +gboolean + +rwx +Do Escape coding +search for escape codes in the entropy coding stage for slightly better compression. +FALSE + + + +GstFlacEnc::exhaustive-model-search +gboolean + +rwx +Do exhaustive model search +do exhaustive search of LP coefficient quantization (expensive!). +FALSE + + + +GstFlacEnc::loose-mid-side-stereo +gboolean + +rwx +Loose mid side stereo +Loose mid side stereo. +FALSE + + + +GstFlacEnc::max-lpc-order +guint +<= 32 +rwx +Max LPC order +Max LPC order; 0 => use only fixed predictors. +8 + + + +GstFlacEnc::max-residual-partition-order +guint +<= 16 +rwx +Max residual partition order +Max residual partition order (above 4 doesn't usually help much). +3 + + + +GstFlacEnc::mid-side-stereo +gboolean + +rwx +Do mid side stereo +Do mid side stereo (only for stereo input). +TRUE + + + +GstFlacEnc::min-residual-partition-order +guint +<= 16 +rwx +Min residual partition order +Min residual partition order (above 4 doesn't usually help much). +3 + + + +GstFlacEnc::qlp-coeff-prec-search +gboolean + +rwx +Do QLP coefficients precision search +false = use qlp_coeff_precision, true = search around qlp_coeff_precision, take best. +FALSE + + + +GstFlacEnc::qlp-coeff-precision +guint +<= 32 +rwx +QLP coefficients precision +Precision in bits of quantized linear-predictor coefficients; 0 = automatic. +0 + + + +GstFlacEnc::quality +GstFlacEncQuality + +rwx +Quality +Speed versus compression tradeoff. +5 - Default + + + +GstFlacEnc::rice-parameter-search-dist +guint +<= 15 +rwx +rice_parameter_search_dist +0 = try only calc'd parameter k; else try all [k-dist..k+dist] parameters, use best. +0 + + + +GstFlacEnc::streamable-subset +gboolean + +rwx +Streamable subset +true to limit encoder to generating a Subset stream, else false. +TRUE + + + +GstFlacEnc::padding +guint + +rwx +Padding +Write a PADDING block with this length in bytes. +0 + + + +GstFlacEnc::seekpoints +gint +>= -2147483647 +rwx +Seekpoints +Add SEEKTABLE metadata (if > 0, number of entries, if < 0, interval in sec). +0 + + + +GstOssSink::device +gchar* + +rw +Device +OSS device (usually /dev/dspN). +"/dev/dsp" + + + +GstVideoMixer::background +GstVideoMixerBackground + +rw +Background +Background type. +Checker pattern + + + +GstMatroskaMux::writing-app +gchar* + +rw +Writing application. +The name the application that creates the matroska file. +NULL + + + +GstMatroskaMux::version +gint +[1,2] +rw +DocType version +This parameter determines what Matroska features can be used. +2 + + + +GstMatroskaMux::min-index-interval +gint64 +>= 0 +rw +Minimum time between index entries +An index entry is created every so many nanoseconds. +0 + + + +GstMatroskaMux::streamable +gboolean + +rw +Determines whether output should be streamable +If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. +FALSE + + + +GstTest::allowed-timestamp-deviation +gint64 +>= G_MAXULONG +rwx +allowed timestamp deviation +allowed average difference in usec between timestamp of next buffer and expected timestamp from analyzing last buffer. +-1 + + + +GstTest::buffer-count +gint64 +>= G_MAXULONG +r +buffer count +number of buffers in stream. +-1 + + + +GstTest::expected-buffer-count +gint64 +>= G_MAXULONG +rwx +expected buffer count +expected number of buffers in stream. +-1 + + + +GstTest::expected-length +gint64 +>= G_MAXULONG +rwx +expected length +expected length of stream. +-1 + + + +GstTest::expected-md5 +gchar* + +rwx +expected md5 +expected md5 of processing the whole data. +"---" + + + +GstTest::length +gint64 +>= G_MAXULONG +r +length +length of stream. +-1 + + + +GstTest::md5 +gchar* + +r +md5 +md5 of processing the whole data. +"---" + + + +GstTest::timestamp-deviation +gint64 +>= G_MAXULONG +r +timestamp deviation +average difference in usec between timestamp of next buffer and expected timestamp from analyzing last buffer. +-1 + + + +GstProgressReport::silent +gboolean + +rw +Do not print output to stdout +Do not print output to stdout. +FALSE + + + +GstProgressReport::update-freq +gint +>= 1 +rw +Update Frequency +Number of seconds between reports when data is flowing. +5 + + + +GstProgressReport::format +gchar* + +rw +format +Format to use for the querying. +"auto" + + + +GstProgressReport::do-query +gboolean + +rw +Use a query instead of buffer metadata to determine stream position +Use a query instead of buffer metadata to determine stream position. +TRUE + + + +GstNavSeek::seek-offset +gdouble +>= 0 +rw +Seek Offset +Time in seconds to seek by. +5 + + + +GstBreakMyData::probability +gdouble +[0,1] +rwx +probability +probability for each byte in the buffer to be changed. +0 + + + +GstBreakMyData::seed +guint + +rwx +seed +seed for randomness (initialized when going from READY to PAUSED). +0 + + + +GstBreakMyData::set-to +gint +[G_MAXULONG,255] +rwx +set-to +set changed bytes to this value (-1 means random value. +-1 + + + +GstBreakMyData::skip +guint + +rwx +skip +amount of bytes skipped at the beginning of stream. +0 + + + +GstTextOverlay::deltax +gint + +w +X position modifier +Shift X position to the left or to the right. Unit is pixels. +0 + + + +GstTextOverlay::deltay +gint + +w +Y position modifier +Shift Y position up or down. Unit is pixels. +0 + + + +GstTextOverlay::font-desc +gchararray + +w +font description +Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax. +"" + + + +GstTextOverlay::halign +gchararray + +w +horizontal alignment +Horizontal alignment of the text. Can be either 'left', 'right', or 'center'. +"center" + + + +GstTextOverlay::shaded-background +gboolean + +w +shaded background +Whether to shade the background under the text area. +FALSE + + + +GstTextOverlay::text +gchararray + +w +text +Text to be display. +"" + + + +GstTextOverlay::valign +gchararray + +w +vertical alignment +Vertical alignment of the text. Can be either 'baseline', 'bottom', or 'top'. +"baseline" + + + +GstTextOverlay::xpad +gint + +w +horizontal paddding +Horizontal paddding when using left/right alignment. +25 + + + +GstTextOverlay::ypad +gint + +w +vertical padding +Vertical padding when using top/bottom alignment. +25 + + + +GstCutter::leaky +gboolean + +rw +Leaky +do we leak buffers when below threshold ?. +FALSE + + + +GstCutter::pre-length +guint64 + +rw +Pre-recording buffer length +Length of pre-recording buffer (in nanoseconds). +0 + + + +GstCutter::run-length +guint64 + +rw +Run length +Length of drop below threshold before cut_stop (in nanoseconds). +0 + + + +GstCutter::threshold +gdouble + +rw +Threshold +Volume threshold before trigger. +0 + + + +GstCutter::threshold-dB +gdouble + +rw +Threshold (dB) +Volume threshold before trigger (in dB). +0 + + + +GstVideoFlip::method +GstVideoFlipMethod + +rw +method +method. +Identity (no rotation) + + + +GstRtpMP4VPay::send-config +gboolean + +rw +Send Config +Send the config parameters in RTP packets as well(deprecated see config-interval). +FALSE + + + +GstRtpMP4VPay::buffer-list +gboolean + +rw +Buffer Array +Use Buffer Arrays. +FALSE + + + +GstRtpMP4VPay::config-interval +guint +<= 3600 +rw +Config Send Interval +Send Config Insertion Interval in seconds (configuration headers will be multiplexed in the data stream when detected.) (0 = disabled). +0 + + + +GstRTPDepay::skip +gint + +rw +skip +skip. +0 + + + +GstMultipartMux::boundary +gchar* + +rw +Boundary +Boundary string. +"ThisRandomString" + + + +GstCairoTextOverlay::deltax +gint + +w +X position modifier +Shift X position to the left or to the right. Unit is pixels. +0 + + + +GstCairoTextOverlay::deltay +gint + +w +Y position modifier +Shift Y position up or down. Unit is pixels. +0 + + + +GstCairoTextOverlay::font-desc +gchar* + +w +font description +Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax. +"" + + + +GstCairoTextOverlay::halign +gchar* + +w +horizontal alignment +Horizontal alignment of the text. Can be either 'left', 'right', or 'center'. +"center" + + + +GstCairoTextOverlay::shaded-background +gboolean + +w +shaded background +Whether to shade the background under the text area. +FALSE + + + +GstCairoTextOverlay::text +gchar* + +w +text +Text to be display. +"" + + + +GstCairoTextOverlay::valign +gchar* + +w +vertical alignment +Vertical alignment of the text. Can be either 'baseline', 'bottom', or 'top'. +"baseline" + + + +GstCairoTextOverlay::xpad +gint + +w +horizontal paddding +Horizontal paddding when using left/right alignment. +25 + + + +GstCairoTextOverlay::ypad +gint + +w +vertical padding +Vertical padding when using top/bottom alignment. +25 + + + +GstCairoTextOverlay::silent +gboolean + +w +silent +Whether to render the text string. +FALSE + + + +GstOssMixerElement::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +NULL + + + +GstOssMixerElement::device +gchar* + +rw +Device +OSS mixer device (usually /dev/mixer). +"/dev/mixer" + + + +GstID3Demux::prefer-v1 +gboolean + +rwx +Prefer version 1 tag +Prefer tags from ID3v1 tag at end of file when both ID3v1 and ID3v2 tags are present. +FALSE + + + +GstDynUDPSink::sockfd +gint +[G_MAXULONG,32767] +rw +socket handle +Socket to use for UDP sending. (-1 == allocate). +-1 + + + +GstDynUDPSink::closefd +gboolean + +rw +Close sockfd +Close sockfd if passed as property on state change. +TRUE + + + +GstCdioCddaSrc::read-speed +gint +[-1,100] +rw +Read speed +Read from device at the specified speed (-1 = default). +-1 + + + +GstMultiUDPSink::bytes-served +guint64 + +r +Bytes served +Total number of bytes sent to all clients. +0 + + + +GstMultiUDPSink::bytes-to-serve +guint64 + +r +Bytes to serve +Number of bytes received to serve to clients. +0 + + + +GstMultiUDPSink::clients +gchar* + +rw +Clients +A comma separated list of host:port pairs with destinations. +NULL + + + +GstMultiUDPSink::closefd +gboolean + +rw +Close sockfd +Close sockfd if passed as property on state change. +TRUE + + + +GstMultiUDPSink::sock +gint +>= G_MAXULONG +r +Socket Handle +Socket currently in use for UDP sending. (-1 == no socket). +-1 + + + +GstMultiUDPSink::sockfd +gint +>= G_MAXULONG +rw +Socket Handle +Socket to use for UDP sending. (-1 == allocate). +-1 + + + +GstMultiUDPSink::auto-multicast +gboolean + +rw +Automatically join/leave multicast groups +Automatically join/leave the multicast groups, FALSE means user has to do it himself. +TRUE + + + +GstMultiUDPSink::loop +gboolean + +rw +Multicast Loopback +Used for setting the multicast loop parameter. TRUE = enable, FALSE = disable. +TRUE + + + +GstMultiUDPSink::qos-dscp +gint +[G_MAXULONG,63] +rw +QoS diff srv code point +Quality of Service, differentiated services code point (-1 default). +-1 + + + +GstMultiUDPSink::ttl +gint +[0,255] +rw +Unicast TTL +Used for setting the unicast TTL parameter. +64 + + + +GstMultiUDPSink::ttl-mc +gint +[0,255] +rw +Multicast TTL +Used for setting the multicast TTL parameter. +1 + + + +GstMultiUDPSink::send-duplicates +gboolean + +rw +Send Duplicates +When a distination/port pair is added multiple times, send packets multiple times as well. +TRUE + + + +GstMultiUDPSink::buffer-size +gint +>= 0 +rw +Buffer Size +Size of the kernel send buffer in bytes, 0=default. +0 + + + +GstCmmlDec::wait-clip-end-time +gboolean + +rw +Wait clip end time +Send a tag for a clip when the clip ends, setting its end-time. Use when you need to know both clip's start-time and end-time. +FALSE + + + +GstCmmlEnc::granule-rate-denominator +gint64 +>= 0 +rwx +Granulerate denominator +Granulerate denominator. +1 + + + +GstCmmlEnc::granule-rate-numerator +gint64 +>= 0 +rwx +Granulerate numerator +Granulerate numerator. +1000 + + + +GstCmmlEnc::granule-shift +guchar +<= 64 +rwx +Granuleshift +The number of lower bits to use for partitioning a granule position. +32 + + + +GstHalAudioSrc::udi +gchar* + +rw +UDI +Unique Device Id. +NULL + + + +GstHalAudioSink::udi +gchar* + +rw +UDI +Unique Device Id. +NULL + + + +GstPixbufScale::method +GstPixbufScaleMethod + +rw +method +method. +2 + + + +GstGdkPixbuf::silent +gboolean + +rw +Silent +Produce verbose output ? (deprecated). +FALSE + + + +GstGConfAudioSink::profile +GstGConfProfile + +rw +Profile +Profile. +Sound Events + + + +GstXImageSrc::display-name +gchar* + +rw +Display +X Display Name. +NULL + + + +GstXImageSrc::screen-num +guint +<= G_MAXINT +rw +Screen number +X Screen Number. +0 + + + +GstXImageSrc::show-pointer +gboolean + +rw +Show Mouse Pointer +Show mouse pointer (if XFixes extension enabled). +TRUE + + + +GstXImageSrc::endx +guint +<= G_MAXINT +rw +End X +X coordinate of bottom right corner of area to be recorded (0 for bottom right of screen). +0 + + + +GstXImageSrc::endy +guint +<= G_MAXINT +rw +End Y +Y coordinate of bottom right corner of area to be recorded (0 for bottom right of screen). +0 + + + +GstXImageSrc::startx +guint +<= G_MAXINT +rw +Start X co-ordinate +X coordinate of top left corner of area to be recorded (0 for top left of screen). +0 + + + +GstXImageSrc::starty +guint +<= G_MAXINT +rw +Start Y co-ordinate +Y coordinate of top left corner of area to be recorded (0 for top left of screen). +0 + + + +GstXImageSrc::use-damage +gboolean + +rw +Use XDamage +Use XDamage (if XDamage extension enabled). +TRUE + + + +GstXImageSrc::remote +gboolean + +rw +Remote dispay +Whether the display is remote. +FALSE + + + +GstXImageSrc::xid +guint64 + +rw +Window XID +Window XID to capture from. +0 + + + +GstXImageSrc::xname +gchar* + +rw +Window name +Window name to capture from. +NULL + + + +GstVideoBalance::brightness +gdouble +[-1,1] +rw +Brightness +brightness. +0 + + + +GstVideoBalance::contrast +gdouble +[0,2] +rw +Contrast +contrast. +1 + + + +GstVideoBalance::hue +gdouble +[-1,1] +rw +Hue +hue. +0 + + + +GstVideoBalance::saturation +gdouble +[0,2] +rw +Saturation +saturation. +1 + + + +GstMultipartDemux::autoscan +gboolean + +rw +autoscan +Try to autofind the prefix (deprecated unused, see boundary). +FALSE + + + +GstMultipartDemux::boundary +gchar* + +rwx +Boundary +The boundary string separating data, automatic if NULL. +NULL + + + +GstMultipartDemux::single-stream +gboolean + +rw +Single Stream +Assume that there is only one stream whose content-type will not change and emit no-more-pads as soon as the first boundary content is parsed, decoded, and pads are linked. +FALSE + + + +GstAviMux::bigfile +gboolean + +rw +Bigfile Support (>2GB) +Support for openDML-2.0 (big) AVI files. +TRUE + + + +GstJpegDec::idct-method +GstIDCTMethod + +rw +IDCT Method +The IDCT algorithm to use. +Faster, less accurate integer method + + + +GstJpegDec::max-errors +gint +>= G_MAXULONG +rw +Maximum Consecutive Decoding Errors +Error out after receiving N consecutive decoding errors (-1 = never fail, 0 = automatic, 1 = fail on first error). +0 + + + +GstRTPiLBCDepay::mode +iLBCMode + +rw +Mode +iLBC frame mode. +30ms frames + + + +GstAudioPanorama::panorama +gfloat +[-1,1] +rw +Panorama +Position in stereo panorama (-1.0 left -> 1.0 right). +0 + + + +GstAudioPanorama::method +GstAudioPanoramaMethod + +rw +Panning method +Psychoacoustic mode keeps same perceived loudness, simple mode just controls volume of one channel. +Psychoacoustic Panning (default) + + + +GstAudioInvert::degree +gfloat +[0,1] +rw +Degree +Degree of inversion. +0 + + + +GstAudioAmplify::amplification +gfloat + +rw +Amplification +Factor of amplification. +1 + + + +GstAudioAmplify::clipping-method +GstAudioPanoramaClippingMethod + +rw +Clipping method +Selects how to handle values higher than the maximum. +Normal clipping (default) + + + +GstAudioDynamic::characteristics +GstAudioDynamicCharacteristics + +rw +Characteristics +Selects whether the ratio should be applied smooth (soft-knee) or hard (hard-knee). +Hard Knee (default) + + + +GstAudioDynamic::mode +GstAudioDynamicMode + +rw +Mode +Selects whether the filter should work on loud samples (compressor) orquiet samples (expander). +Compressor (default) + + + +GstAudioDynamic::ratio +gfloat +>= 0 +rw +Ratio +Ratio that should be applied. +1 + + + +GstAudioDynamic::threshold +gfloat +[0,1] +rw +Threshold +Threshold until the filter is activated. +0 + + + +GstDirectDrawSink::force-aspect-ratio +gboolean + +rw +Force aspect ratio +When enabled, scaling will respect original aspect ratio. +FALSE + + + +GstWavpackEnc::bitrate +guint +<= 9600000 +rw +Bitrate +Try to encode with this average bitrate (bits/sec). This enables lossy encoding, values smaller than 24000 disable it again. +0 + + + +GstWavpackEnc::bits-per-sample +gdouble +[0,24] +rw +Bits per sample +Try to encode with this amount of bits per sample. This enables lossy encoding, values smaller than 2.0 disable it again. +0 + + + +GstWavpackEnc::correction-mode +GstWavpackEncCorrectionMode + +rw +Correction stream mode +Use this mode for the correction stream. Only works in lossy mode!. +Create no correction file + + + +GstWavpackEnc::extra-processing +guint +<= 6 +rw +Extra processing +Use better but slower filters for better compression/quality. +0 + + + +GstWavpackEnc::joint-stereo-mode +GstWavpackEncJSMode + +rw +Joint-Stereo mode +Use this joint-stereo mode. +auto + + + +GstWavpackEnc::md5 +gboolean + +rw +MD5 +Store MD5 hash of raw samples within the file. +FALSE + + + +GstWavpackEnc::mode +GstWavpackEncMode + +rw +Encoding mode +Speed versus compression tradeoff. +Normal Compression + + + +GstRtpMP2TDepay::skip-first-bytes +guint + +rw +Skip first bytes +The amount of bytes that need to be skipped at the beginning of the payload. +0 + + + +GstRtpH263PPay::fragmentation-mode +GstFragmentationMode + +rw +Fragmentation Mode +Packet Fragmentation Mode. +Normal + + + +GstGamma::gamma +gdouble +[0.01,10] +rw +Gamma +gamma. +1 + + + +GstVideoCrop::bottom +gint +>= 0 +rw +Bottom +Pixels to crop at bottom. +0 + + + +GstVideoCrop::left +gint +>= 0 +rw +Left +Pixels to crop at left. +0 + + + +GstVideoCrop::right +gint +>= 0 +rw +Right +Pixels to crop at right. +0 + + + +GstVideoCrop::top +gint +>= 0 +rw +Top +Pixels to crop at top. +0 + + + +GstV4l2Src::device +gchar* + +rw +Device +Device location. +"/dev/video0" + + + +GstV4l2Src::device-name +gchar* + +r +Device name +Name of the device. +NULL + + + +GstV4l2Src::flags +GstV4l2DeviceTypeFlags + +r +Flags +Device type flags. + + + + +GstV4l2Src::queue-size +guint +[1,16] +rw +Queue size +Number of buffers to be enqueud in the driver in streaming mode. +2 + + + +GstV4l2Src::always-copy +gboolean + +rw +Always Copy +If the buffer will or not be used directly from mmap. +TRUE + + + +GstV4l2Src::device-fd +gint +>= G_MAXULONG +r +File descriptor +File descriptor of the device. +-1 + + + +GstV4l2Src::brightness +gint + +rw +Brightness +Picture brightness, or more precisely, the black level. +0 + + + +GstV4l2Src::contrast +gint + +rw +Contrast +Picture contrast or luma gain. +0 + + + +GstV4l2Src::decimate +gint +>= 1 +rw +Decimate +Only use every nth frame. +1 + + + +GstV4l2Src::hue +gint + +rw +Hue +Hue or color balance. +0 + + + +GstV4l2Src::saturation +gint + +rw +Saturation +Picture color saturation or chroma gain. +0 + + + +GstV4l2Src::norm +V4L2_TV_norms + +rw +TV norm +video standard. +none + + + +GstAudioChebBand::lower-frequency +gfloat +[0,100000] +rw +Lower frequency +Start frequency of the band (Hz). +0 + + + +GstAudioChebBand::mode +GstAudioChebBandMode + +rw +Mode +Low pass or high pass mode. +Band pass (default) + + + +GstAudioChebBand::poles +gint +[4,32] +rw +Poles +Number of poles to use, will be rounded up to the next multiply of four. +4 + + + +GstAudioChebBand::ripple +gfloat +[0,200] +rw +Ripple +Amount of ripple (dB). +0.25 + + + +GstAudioChebBand::type +gint +[1,2] +rw +Type +Type of the chebychev filter. +1 + + + +GstAudioChebBand::upper-frequency +gfloat +[0,100000] +rw +Upper frequency +Stop frequency of the band (Hz). +0 + + + +GstAudioChebLimit::cutoff +gfloat +[0,100000] +rw +Cutoff +Cut off frequency (Hz). +0 + + + +GstAudioChebLimit::mode +GstAudioChebLimitMode + +rw +Mode +Low pass or high pass mode. +Low pass (default) + + + +GstAudioChebLimit::poles +gint +[2,32] +rw +Poles +Number of poles to use, will be rounded up to the next even number. +4 + + + +GstAudioChebLimit::ripple +gfloat +[0,200] +rw +Ripple +Amount of ripple (dB). +0.25 + + + +GstAudioChebLimit::type +gint +[1,2] +rw +Type +Type of the chebychev filter. +1 + + + +GstAudioWSincBand::lower-frequency +gfloat +[0,100000] +rw +Lower Frequency +Cut-off lower frequency (Hz). +0 + + + +GstAudioWSincBand::upper-frequency +gfloat +[0,100000] +rw +Upper Frequency +Cut-off upper frequency (Hz). +0 + + + +GstAudioWSincBand::mode +GstAudioWSincBandMode + +rw +Mode +Band pass or band reject mode. +Band pass (default) + + + +GstAudioWSincBand::window +GstAudioWSincBandWindow + +rw +Window +Window function to use. +Hamming window (default) + + + +GstAudioWSincBand::length +gint +[3,256000] +rw +Length +Filter kernel length, will be rounded to the next odd number. +101 + + + +GstAudioWSincLimit::frequency +gdouble +>= 0 +rw +Frequency +Cut-off Frequency (Hz). +0 + + + +GstAudioWSincLimit::length +gint +[3,256000] +rw +Length +Filter kernel length, will be rounded to the next odd number. +101 + + + +GstAudioWSincLimit::mode +GstAudioWSincLimitMode + +rw +Mode +Low pass or high pass mode. +Low pass (default) + + + +GstAudioWSincLimit::window +GstAudioWSincLimitWindow + +rw +Window +Window function to use. +Hamming window (default) + + + +GstAudioWSincLimit::cutoff +gfloat +[0,100000] +rw +Cutoff +Cut-off Frequency (Hz). +0 + + + +GstRndBufferSize::max +glong +[1,G_MAXINT] +rwx +maximum +maximum buffer size. +8192 + + + +GstRndBufferSize::min +glong +[0,G_MAXINT] +rwx +mininum +mininum buffer size. +1 + + + +GstRndBufferSize::seed +gulong +<= G_MAXUINT +rwx +random number seed +seed for randomness (initialized when going from READY to PAUSED). + + + + +GstAutoAudioSink::filter-caps +GstCaps* + +rw +Filter caps +Filter sink candidates using these caps. + + + + +GstAutoVideoSink::filter-caps +GstCaps* + +rw +Filter caps +Filter sink candidates using these caps. + + + + +GstOsxAudioSink::device +gint +>= 0 +rw +Device ID +Device ID of output device. +0 + + + +GstOsxAudioSrc::device +gint +>= 0 +rw +Device ID +Device ID of input device. +0 + + + +GstOSXVideoSink::embed +gboolean + +rw +embed +When enabled, it can be embedded. +FALSE + + + +GstOSXVideoSink::fullscreen +gboolean + +rw +fullscreen +When enabled, the view is fullscreen. +FALSE + + + +GstGdkPixbufSink::last-pixbuf +GdkPixbuf* + +r +Last Pixbuf +Last GdkPixbuf object rendered. + + + + +GstGdkPixbufSink::send-messages +gboolean + +rw +Send Messages +Whether to post messages containing pixbufs on the bus (deprecated, use post-messages). +TRUE + + + +GstGdkPixbufSink::post-messages +gboolean + +rw +Post Messages +Whether to post messages containing pixbufs on the bus. +TRUE + + + +GstSoupHTTPSrc::automatic-redirect +gboolean + +rw +automatic-redirect +Automatically follow HTTP redirects (HTTP Status Code 3xx). +TRUE + + + +GstSoupHTTPSrc::cookies +GStrv + +rw +Cookies +HTTP request cookies. + + + + +GstSoupHTTPSrc::iradio-genre +gchar* + +r +iradio-genre +Genre of the stream. +NULL + + + +GstSoupHTTPSrc::iradio-mode +gboolean + +rw +iradio-mode +Enable internet radio mode (extraction of shoutcast/icecast metadata). +FALSE + + + +GstSoupHTTPSrc::iradio-name +gchar* + +r +iradio-name +Name of the stream. +NULL + + + +GstSoupHTTPSrc::iradio-title +gchar* + +r +iradio-title +Name of currently playing song. +NULL + + + +GstSoupHTTPSrc::iradio-url +gchar* + +r +iradio-url +Homepage URL for radio stream. +NULL + + + +GstSoupHTTPSrc::location +gchar* + +rw +Location +Location to read from. +"" + + + +GstSoupHTTPSrc::proxy +gchar* + +rw +Proxy +HTTP proxy server URI. +"" + + + +GstSoupHTTPSrc::user-agent +gchar* + +rw +User-Agent +Value of the User-Agent HTTP request header field. +"GStreamer souphttpsrc " + + + +GstSoupHTTPSrc::is-live +gboolean + +rw +is-live +Act like a live source. +FALSE + + + +GstSoupHTTPSrc::proxy-id +gchar* + +rw +proxy-id +HTTP proxy URI user id for authentication. +"" + + + +GstSoupHTTPSrc::proxy-pw +gchar* + +rw +proxy-pw +HTTP proxy URI user password for authentication. +"" + + + +GstSoupHTTPSrc::user-id +gchar* + +rw +user-id +HTTP location URI user id for authentication. +"" + + + +GstSoupHTTPSrc::user-pw +gchar* + +rw +user-pw +HTTP location URI user password for authentication. +"" + + + +GstSoupHTTPSrc::extra-headers +GstStructure* + +rw +Extra Headers +Extra headers to append to the HTTP request. + + + + +GstSoupHTTPSrc::timeout +guint +<= 3600 +rw +timeout +Value in seconds to timeout a blocking I/O (0 = No timeout). +0 + + + +GstRTPDVPay::mode +GstDVPayMode + +rw +Mode +The payload mode of payloading. +Video only + + + +GstRtpH264Pay::profile-level-id +gchar* + +rw +profile-level-id +The base64 profile-level-id to set in the sink caps (deprecated). +NULL + + + +GstRtpH264Pay::sprop-parameter-sets +gchar* + +rw +sprop-parameter-sets +The base64 sprop-parameter-sets to set in out caps (set to NULL to extract from stream). +NULL + + + +GstRtpH264Pay::scan-mode +GstH264PayScanMode + +rw +Scan Mode +How to scan the input buffers for NAL units. Performance can be increased when certain assumptions are made about the input buffers. +Buffers contain multiple complete NALUs + + + +GstRtpH264Pay::buffer-list +gboolean + +rw +Buffer List +Use Buffer Lists. +FALSE + + + +GstRtpH264Pay::config-interval +guint +<= 3600 +rw +SPS PPS Send Interval +Send SPS and PPS Insertion Interval in seconds (sprop parameter sets will be multiplexed in the data stream when detected.) (0 = disabled). +0 + + + +ladspa-hardLimiter::Residue-level +gfloat +[0,1] +rwx +Residue-level +Residue-level. +0 + + + +ladspa-hardLimiter::Wet-level +gfloat +[0,1] +rwx +Wet-level +Wet-level. +1 + + + +ladspa-hardLimiter::dB-limit +gfloat +[-50,0] +rwx +dB-limit +dB-limit. +0 + + + +ladspa-dj-eq-mono::Hi-gain +gfloat +[-70,6] +rwx +Hi-gain +Hi-gain. +0 + + + +ladspa-dj-eq-mono::Lo-gain +gfloat +[-70,6] +rwx +Lo-gain +Lo-gain. +0 + + + +ladspa-dj-eq-mono::Mid-gain +gfloat +[-70,6] +rwx +Mid-gain +Mid-gain. +0 + + + +ladspa-dj-eq-mono::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-dj-eq::Hi-gain +gfloat +[-70,6] +rwx +Hi-gain +Hi-gain. +0 + + + +ladspa-dj-eq::Lo-gain +gfloat +[-70,6] +rwx +Lo-gain +Lo-gain. +0 + + + +ladspa-dj-eq::Mid-gain +gfloat +[-70,6] +rwx +Mid-gain +Mid-gain. +0 + + + +ladspa-dj-eq::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-branch-ic-ococ::First-Output +gfloat + +r +First-Output +First-Output. +-3,40282e+38 + + + +ladspa-branch-ic-ococ::Input +gfloat + +rwx +Input +Input. +-3,40282e+38 + + + +ladspa-branch-ic-ococ::Second-Output +gfloat + +r +Second-Output +Second-Output. +-3,40282e+38 + + + +ladspa-Exaggerate::amount +gfloat +[-1,10] +rwx +amount +amount. +1 + + + +ladspa-Transpose::transpose +gfloat +[-24,24] +rwx +transpose +transpose. +0 + + + +ladspa-Accumulate::decay +gfloat +[0,1] +rwx +decay +decay. +0,25 + + + +ladspa-Accumulate::glissando +gfloat +[-1,1] +rwx +glissando +glissando. +0 + + + +ladspa-sinusWavewrapper::Wrap-degree +gfloat +[0,10] +rwx +Wrap-degree +Wrap-degree. +0 + + + +ladspa-foverdrive::Drive-level +gfloat +[1,3] +rwx +Drive-level +Drive-level. +1 + + + +ladspa-mbeq::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-mbeq::param-10000Hz-gain +gfloat +[-70,30] +rwx +param-10000Hz-gain +param-10000Hz-gain. +0 + + + +ladspa-mbeq::param-100Hz-gain +gfloat +[-70,30] +rwx +param-100Hz-gain +param-100Hz-gain. +0 + + + +ladspa-mbeq::param-1250Hz-gain +gfloat +[-70,30] +rwx +param-1250Hz-gain +param-1250Hz-gain. +0 + + + +ladspa-mbeq::param-156Hz-gain +gfloat +[-70,30] +rwx +param-156Hz-gain +param-156Hz-gain. +0 + + + +ladspa-mbeq::param-1750Hz-gain +gfloat +[-70,30] +rwx +param-1750Hz-gain +param-1750Hz-gain. +0 + + + +ladspa-mbeq::param-20000Hz-gain +gfloat +[-70,30] +rwx +param-20000Hz-gain +param-20000Hz-gain. +0 + + + +ladspa-mbeq::param-220Hz-gain +gfloat +[-70,30] +rwx +param-220Hz-gain +param-220Hz-gain. +0 + + + +ladspa-mbeq::param-2500Hz-gain +gfloat +[-70,30] +rwx +param-2500Hz-gain +param-2500Hz-gain. +0 + + + +ladspa-mbeq::param-311Hz-gain +gfloat +[-70,30] +rwx +param-311Hz-gain +param-311Hz-gain. +0 + + + +ladspa-mbeq::param-3500Hz-gain +gfloat +[-70,30] +rwx +param-3500Hz-gain +param-3500Hz-gain. +0 + + + +ladspa-mbeq::param-440Hz-gain +gfloat +[-70,30] +rwx +param-440Hz-gain +param-440Hz-gain. +0 + + + +ladspa-mbeq::param-5000Hz-gain +gfloat +[-70,30] +rwx +param-5000Hz-gain +param-5000Hz-gain. +0 + + + +ladspa-mbeq::param-50Hz-gain +gfloat +[-70,30] +rwx +param-50Hz-gain +param-50Hz-gain. +0 + + + +ladspa-mbeq::param-622Hz-gain +gfloat +[-70,30] +rwx +param-622Hz-gain +param-622Hz-gain. +0 + + + +ladspa-mbeq::param-880Hz-gain +gfloat +[-70,30] +rwx +param-880Hz-gain +param-880Hz-gain. +0 + + + +ladspa-delayorama::Amplitude-change +gfloat +[0,2,5] +rwx +Amplitude-change +Amplitude-change. +1 + + + +ladspa-delayorama::Amplitude-random +gfloat +[0,100] +rwx +Amplitude-random +Amplitude-random. +0 + + + +ladspa-delayorama::Delay-change +gfloat +[0,2,5] +rwx +Delay-change +Delay-change. +1 + + + +ladspa-delayorama::Delay-random +gfloat +[0,100] +rwx +Delay-random +Delay-random. +0 + + + +ladspa-delayorama::Delay-range +gfloat +[0,0001,6] +rwx +Delay-range +Delay-range. +6 + + + +ladspa-delayorama::Dry-wet-mix +gfloat +[0,1] +rwx +Dry-wet-mix +Dry-wet-mix. +1 + + + +ladspa-delayorama::Feedback +gfloat +[0,100] +rwx +Feedback +Feedback. +0 + + + +ladspa-delayorama::First-delay +gfloat +[0,5] +rwx +First-delay +First-delay. +0 + + + +ladspa-delayorama::Input-gain +gfloat +[-96,24] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-delayorama::Number-of-taps +gint +[2,128] +rwx +Number-of-taps +Number-of-taps. +2 + + + +ladspa-delayorama::Random-seed +gint +[0,1000] +rwx +Random-seed +Random-seed. +0 + + + +ladspa-tap-equalizer-bw::Band-1-Bandwidth--octaves- +gfloat +[0,1,5] +rwx +Band-1-Bandwidth--octaves- +Band-1-Bandwidth--octaves-. +1 + + + +ladspa-tap-equalizer-bw::Band-1-Freq--Hz- +gfloat +[40,280] +rwx +Band-1-Freq--Hz- +Band-1-Freq--Hz-. +100 + + + +ladspa-tap-equalizer-bw::Band-1-Gain--dB- +gfloat +[-50,20] +rwx +Band-1-Gain--dB- +Band-1-Gain--dB-. +0 + + + +ladspa-tap-equalizer-bw::Band-2-Bandwidth--octaves- +gfloat +[0,1,5] +rwx +Band-2-Bandwidth--octaves- +Band-2-Bandwidth--octaves-. +1 + + + +ladspa-tap-equalizer-bw::Band-2-Freq--Hz- +gfloat +[100,500] +rwx +Band-2-Freq--Hz- +Band-2-Freq--Hz-. +200 + + + +ladspa-tap-equalizer-bw::Band-2-Gain--dB- +gfloat +[-50,20] +rwx +Band-2-Gain--dB- +Band-2-Gain--dB-. +0 + + + +ladspa-tap-equalizer-bw::Band-3-Bandwidth--octaves- +gfloat +[0,1,5] +rwx +Band-3-Bandwidth--octaves- +Band-3-Bandwidth--octaves-. +1 + + + +ladspa-tap-equalizer-bw::Band-3-Freq--Hz- +gfloat +[200,1000] +rwx +Band-3-Freq--Hz- +Band-3-Freq--Hz-. +400 + + + +ladspa-tap-equalizer-bw::Band-3-Gain--dB- +gfloat +[-50,20] +rwx +Band-3-Gain--dB- +Band-3-Gain--dB-. +0 + + + +ladspa-tap-equalizer-bw::Band-4-Bandwidth--octaves- +gfloat +[0,1,5] +rwx +Band-4-Bandwidth--octaves- +Band-4-Bandwidth--octaves-. +1 + + + +ladspa-tap-equalizer-bw::Band-4-Freq--Hz- +gfloat +[400,2800] +rwx +Band-4-Freq--Hz- +Band-4-Freq--Hz-. +1000 + + + +ladspa-tap-equalizer-bw::Band-4-Gain--dB- +gfloat +[-50,20] +rwx +Band-4-Gain--dB- +Band-4-Gain--dB-. +0 + + + +ladspa-tap-equalizer-bw::Band-5-Bandwidth--octaves- +gfloat +[0,1,5] +rwx +Band-5-Bandwidth--octaves- +Band-5-Bandwidth--octaves-. +1 + + + +ladspa-tap-equalizer-bw::Band-5-Freq--Hz- +gfloat +[1000,5000] +rwx +Band-5-Freq--Hz- +Band-5-Freq--Hz-. +3000 + + + +ladspa-tap-equalizer-bw::Band-5-Gain--dB- +gfloat +[-50,20] +rwx +Band-5-Gain--dB- +Band-5-Gain--dB-. +0 + + + +ladspa-tap-equalizer-bw::Band-6-Bandwidth--octaves- +gfloat +[0,1,5] +rwx +Band-6-Bandwidth--octaves- +Band-6-Bandwidth--octaves-. +1 + + + +ladspa-tap-equalizer-bw::Band-6-Freq--Hz- +gfloat +[3000,9000] +rwx +Band-6-Freq--Hz- +Band-6-Freq--Hz-. +6000 + + + +ladspa-tap-equalizer-bw::Band-6-Gain--dB- +gfloat +[-50,20] +rwx +Band-6-Gain--dB- +Band-6-Gain--dB-. +0 + + + +ladspa-tap-equalizer-bw::Band-7-Bandwidth--octaves- +gfloat +[0,1,5] +rwx +Band-7-Bandwidth--octaves- +Band-7-Bandwidth--octaves-. +1 + + + +ladspa-tap-equalizer-bw::Band-7-Freq--Hz- +gfloat +[6000,18000] +rwx +Band-7-Freq--Hz- +Band-7-Freq--Hz-. +12000 + + + +ladspa-tap-equalizer-bw::Band-7-Gain--dB- +gfloat +[-50,20] +rwx +Band-7-Gain--dB- +Band-7-Gain--dB-. +0 + + + +ladspa-tap-equalizer-bw::Band-8-Bandwidth--octaves- +gfloat +[0,1,5] +rwx +Band-8-Bandwidth--octaves- +Band-8-Bandwidth--octaves-. +1 + + + +ladspa-tap-equalizer-bw::Band-8-Freq--Hz- +gfloat +[10000,20000] +rwx +Band-8-Freq--Hz- +Band-8-Freq--Hz-. +15000 + + + +ladspa-tap-equalizer-bw::Band-8-Gain--dB- +gfloat +[-50,20] +rwx +Band-8-Gain--dB- +Band-8-Gain--dB-. +0 + + + +ladspa-crossoverDist::Crossover-amplitude +gfloat +[0,0,1] +rwx +Crossover-amplitude +Crossover-amplitude. +0 + + + +ladspa-crossoverDist::Smoothing +gfloat +[0,1] +rwx +Smoothing +Smoothing. +1 + + + +ladspa-fadDelay::Delay +gfloat +[0,1,10] +rwx +Delay +Delay. +1 + + + +ladspa-fadDelay::Feedback +gfloat +[-70,0] +rwx +Feedback +Feedback. +0 + + + +ladspa-multivoiceChorus::Delay-base +gfloat +[10,40] +rwx +Delay-base +Delay-base. +10 + + + +ladspa-multivoiceChorus::Detune +gfloat +[0,5] +rwx +Detune +Detune. +1 + + + +ladspa-multivoiceChorus::LFO-frequency +gfloat +[2,30] +rwx +LFO-frequency +LFO-frequency. +9 + + + +ladspa-multivoiceChorus::Number-of-voices +gint +[1,8] +rwx +Number-of-voices +Number-of-voices. +1 + + + +ladspa-multivoiceChorus::Output-attenuation +gfloat +[-20,0] +rwx +Output-attenuation +Output-attenuation. +0 + + + +ladspa-multivoiceChorus::Voice-separation +gfloat +[0,2] +rwx +Voice-separation +Voice-separation. +0,5 + + + +ladspa-syncsquare-fcga-oa::Frequency +gfloat +[0,64] +rwx +Frequency +Frequency. +16 + + + +ladspa-smoothDecimate::Resample-rate +gfloat +[0,44100] +rwx +Resample-rate +Resample-rate. +44100 + + + +ladspa-smoothDecimate::Smoothing +gfloat +[0,1] +rwx +Smoothing +Smoothing. +1 + + + +ladspa-allpass-n::Decay-Time +gfloat +>= 0 +rwx +Decay-Time +Decay-Time. +0 + + + +ladspa-allpass-n::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-allpass-n::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-allpass-l::Decay-Time +gfloat +>= 0 +rwx +Decay-Time +Decay-Time. +0 + + + +ladspa-allpass-l::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-allpass-l::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-allpass-c::Decay-Time +gfloat +>= 0 +rwx +Decay-Time +Decay-Time. +0 + + + +ladspa-allpass-c::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-allpass-c::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-fmOsc::Waveform +gint +[1,4] +rwx +Waveform +Waveform. +1 + + + +ladspa-foldover::Drive +gfloat +[0,1] +rwx +Drive +Drive. +0 + + + +ladspa-foldover::Skew +gfloat +[0,1] +rwx +Skew +Skew. +0 + + + +ladspa-valve::Distortion-character +gfloat +[0,1] +rwx +Distortion-character +Distortion-character. +0 + + + +ladspa-valve::Distortion-level +gfloat +[0,1] +rwx +Distortion-level +Distortion-level. +0 + + + +ladspa-difference-iamc-oa::Input-to-Subtract +gfloat + +rwx +Input-to-Subtract +Input-to-Subtract. +-3,40282e+38 + + + +ladspa-difference-icma-oa::Input +gfloat + +rwx +Input +Input. +-3,40282e+38 + + + +ladspa-difference-icmc-oc::Difference-Output +gfloat + +r +Difference-Output +Difference-Output. +-3,40282e+38 + + + +ladspa-difference-icmc-oc::Input +gfloat + +rwx +Input +Input. +-3,40282e+38 + + + +ladspa-difference-icmc-oc::Input-to-Subtract +gfloat + +rwx +Input-to-Subtract +Input-to-Subtract. +-3,40282e+38 + + + +ladspa-Mvclpf-1::Exp-FM-gain +gfloat +[0,10] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Mvclpf-1::Frequency +gfloat +[-6,6] +rwx +Frequency +Frequency. +0 + + + +ladspa-Mvclpf-1::Input-gain +gfloat +[-60,10] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-Mvclpf-1::Output-gain +gfloat +[-15,15] +rwx +Output-gain +Output-gain. +0 + + + +ladspa-Mvclpf-1::Resonance +gfloat +[0,1] +rwx +Resonance +Resonance. +0 + + + +ladspa-Mvclpf-1::Resonance-gain +gfloat +[0,1] +rwx +Resonance-gain +Resonance-gain. +0 + + + +ladspa-Mvclpf-2::Exp-FM-gain +gfloat +[0,10] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Mvclpf-2::Frequency +gfloat +[-6,6] +rwx +Frequency +Frequency. +0 + + + +ladspa-Mvclpf-2::Input-gain +gfloat +[-60,10] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-Mvclpf-2::Output-gain +gfloat +[-15,15] +rwx +Output-gain +Output-gain. +0 + + + +ladspa-Mvclpf-2::Resonance +gfloat +[0,1] +rwx +Resonance +Resonance. +0 + + + +ladspa-Mvclpf-2::Resonance-gain +gfloat +[0,1] +rwx +Resonance-gain +Resonance-gain. +0 + + + +ladspa-Mvclpf-3::Exp-FM-gain +gfloat +[0,10] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Mvclpf-3::Frequency +gfloat +[-6,6] +rwx +Frequency +Frequency. +0 + + + +ladspa-Mvclpf-3::Input-gain +gfloat +[-60,10] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-Mvclpf-3::Output-gain +gfloat +[-15,15] +rwx +Output-gain +Output-gain. +0 + + + +ladspa-Mvclpf-3::Resonance +gfloat +[0,1] +rwx +Resonance +Resonance. +0 + + + +ladspa-Mvclpf-3::Resonance-gain +gfloat +[0,1] +rwx +Resonance-gain +Resonance-gain. +0 + + + +ladspa-Mvclpf-4::Exp-FM-gain +gfloat +[0,10] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Mvclpf-4::Filter-poles +gint +[0,4] +rwx +Filter-poles +Filter-poles. +0 + + + +ladspa-Mvclpf-4::Frequency +gfloat +[-6,6] +rwx +Frequency +Frequency. +0 + + + +ladspa-Mvclpf-4::Input-gain +gfloat +[-60,10] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-Mvclpf-4::Output-gain +gfloat +[-15,15] +rwx +Output-gain +Output-gain. +0 + + + +ladspa-Mvclpf-4::Resonance +gfloat +[0,1] +rwx +Resonance +Resonance. +0 + + + +ladspa-Mvclpf-4::Resonance-gain +gfloat +[0,1] +rwx +Resonance-gain +Resonance-gain. +0 + + + +ladspa-alienwah-mono::Delay +gint +[5,50] +rwx +Delay +Delay. +5 + + + +ladspa-alienwah-mono::Feedback +gfloat +[0,1] +rwx +Feedback +Feedback. +0 + + + +ladspa-alienwah-mono::Frequency +gfloat +[0,inf] +rwx +Frequency +Frequency. +0 + + + +ladspa-alienwah-mono::Initial-phase-for-stereo +gfloat + +rwx +Initial-phase-for-stereo +Initial-phase-for-stereo. +-3,40282e+38 + + + +ladspa-alienwah-stereo::Delay +gint +[5,50] +rwx +Delay +Delay. +5 + + + +ladspa-alienwah-stereo::Feedback +gfloat +[0,2] +rwx +Feedback +Feedback. +0 + + + +ladspa-alienwah-stereo::Frequency +gfloat +[0,inf] +rwx +Frequency +Frequency. +0 + + + +ladspa-alienwah-stereo::Initial-phase-for-stereo +gfloat +[0,6,28319] +rwx +Initial-phase-for-stereo +Initial-phase-for-stereo. +6,28319 + + + +ladspa-gongBeater::Impulse-gain +gfloat +[-70,0] +rwx +Impulse-gain +Impulse-gain. +-70 + + + +ladspa-gongBeater::Strike-duration +gfloat +[0,001,0,2] +rwx +Strike-duration +Strike-duration. +0,1005 + + + +ladspa-gongBeater::Strike-gain +gfloat +[-70,0] +rwx +Strike-gain +Strike-gain. +0 + + + +ladspa-Chorus1::Delay +gfloat +[0,30] +rwx +Delay +Delay. +0 + + + +ladspa-Chorus1::Mod-Amplitude-1 +gfloat +[0,10] +rwx +Mod-Amplitude-1 +Mod-Amplitude-1. +0 + + + +ladspa-Chorus1::Mod-Amplitude-2 +gfloat +[0,3] +rwx +Mod-Amplitude-2 +Mod-Amplitude-2. +0 + + + +ladspa-Chorus1::Mod-Frequency-1 +gfloat +[0,003,10] +rwx +Mod-Frequency-1 +Mod-Frequency-1. +0,003 + + + +ladspa-Chorus1::Mod-Frequency-2 +gfloat +[0,01,30] +rwx +Mod-Frequency-2 +Mod-Frequency-2. +0,01 + + + +ladspa-Chorus2::Delay +gfloat +[0,30] +rwx +Delay +Delay. +0 + + + +ladspa-Chorus2::Mod-Amplitude-1 +gfloat +[0,10] +rwx +Mod-Amplitude-1 +Mod-Amplitude-1. +0 + + + +ladspa-Chorus2::Mod-Amplitude-2 +gfloat +[0,3] +rwx +Mod-Amplitude-2 +Mod-Amplitude-2. +0 + + + +ladspa-Chorus2::Mod-Frequency-1 +gfloat +[0,003,10] +rwx +Mod-Frequency-1 +Mod-Frequency-1. +0,003 + + + +ladspa-Chorus2::Mod-Frequency-2 +gfloat +[0,01,30] +rwx +Mod-Frequency-2 +Mod-Frequency-2. +0,01 + + + +ladspa-hilbert::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-tapeDelay::Dry-level +gfloat +[-90,0] +rwx +Dry-level +Dry-level. +-90 + + + +ladspa-tapeDelay::Tap-1-distance +gfloat +[0,4] +rwx +Tap-1-distance +Tap-1-distance. +0 + + + +ladspa-tapeDelay::Tap-1-level +gfloat +[-90,0] +rwx +Tap-1-level +Tap-1-level. +0 + + + +ladspa-tapeDelay::Tap-2-distance +gfloat +[0,4] +rwx +Tap-2-distance +Tap-2-distance. +1 + + + +ladspa-tapeDelay::Tap-2-level +gfloat +[-90,0] +rwx +Tap-2-level +Tap-2-level. +-90 + + + +ladspa-tapeDelay::Tap-3-distance +gfloat +[0,4] +rwx +Tap-3-distance +Tap-3-distance. +2 + + + +ladspa-tapeDelay::Tap-3-level +gfloat +[-90,0] +rwx +Tap-3-level +Tap-3-level. +-90 + + + +ladspa-tapeDelay::Tap-4-distance +gfloat +[0,4] +rwx +Tap-4-distance +Tap-4-distance. +3 + + + +ladspa-tapeDelay::Tap-4-level +gfloat +[-90,0] +rwx +Tap-4-level +Tap-4-level. +-90 + + + +ladspa-tapeDelay::Tape-speed +gfloat +[0,10] +rwx +Tape-speed +Tape-speed. +1 + + + +ladspa-sum-iaic-oa::Second-Input +gfloat + +rwx +Second-Input +Second-Input. +-3,40282e+38 + + + +ladspa-sum-icic-oc::First-Input +gfloat + +rwx +First-Input +First-Input. +-3,40282e+38 + + + +ladspa-sum-icic-oc::Second-Input +gfloat + +rwx +Second-Input +Second-Input. +-3,40282e+38 + + + +ladspa-sum-icic-oc::Summed-Output +gfloat + +r +Summed-Output +Summed-Output. +-3,40282e+38 + + + +ladspa-sc1::Attack-time +gfloat +[2,400] +rwx +Attack-time +Attack-time. +101,5 + + + +ladspa-sc1::Knee-radius +gfloat +[1,10] +rwx +Knee-radius +Knee-radius. +3,25 + + + +ladspa-sc1::Makeup-gain +gfloat +[0,24] +rwx +Makeup-gain +Makeup-gain. +0 + + + +ladspa-sc1::Ratio +gfloat +[1,10] +rwx +Ratio +Ratio. +1 + + + +ladspa-sc1::Release-time +gfloat +[2,800] +rwx +Release-time +Release-time. +401 + + + +ladspa-sc1::Threshold-level +gfloat +[-30,0] +rwx +Threshold-level +Threshold-level. +0 + + + +ladspa-combSplitter::Band-separation +gfloat +[16,640] +rwx +Band-separation +Band-separation. +172 + + + +ladspa-sc4m::Amplitude +gfloat +[-40,12] +r +Amplitude +Amplitude. +-40 + + + +ladspa-sc4m::Attack-time +gfloat +[1,5,400] +rwx +Attack-time +Attack-time. +101,125 + + + +ladspa-sc4m::Gain-reduction +gfloat +[-24,0] +r +Gain-reduction +Gain-reduction. +-24 + + + +ladspa-sc4m::Knee-radius +gfloat +[1,10] +rwx +Knee-radius +Knee-radius. +3,25 + + + +ladspa-sc4m::Makeup-gain +gfloat +[0,24] +rwx +Makeup-gain +Makeup-gain. +0 + + + +ladspa-sc4m::RMS-peak +gfloat +[0,1] +rwx +RMS-peak +RMS-peak. +0 + + + +ladspa-sc4m::Ratio +gfloat +[1,20] +rwx +Ratio +Ratio. +1 + + + +ladspa-sc4m::Release-time +gfloat +[2,800] +rwx +Release-time +Release-time. +401 + + + +ladspa-sc4m::Threshold-level +gfloat +[-30,0] +rwx +Threshold-level +Threshold-level. +0 + + + +ladspa-preamp::fc +gfloat +[20,4000] +rwx +fc +fc. +440 + + + +ladspa-preamp::gain +gfloat +[0,10] +rwx +gain +gain. +1 + + + +ladspa-lsFilter::Cutoff-frequency +gfloat +[88,2,22050] +rwx +Cutoff-frequency +Cutoff-frequency. +1394,56 + + + +ladspa-lsFilter::Filter-type +gint +[0,2] +rwx +Filter-type +Filter-type. +0 + + + +ladspa-lsFilter::Resonance +gfloat +[0,1] +rwx +Resonance +Resonance. +0 + + + +ladspa-matrixMSSt::Width +gfloat +[0,2] +rwx +Width +Width. +1 + + + +ladspa-lpf::Cutoff-Frequency +gfloat +[0,22050] +rwx +Cutoff-Frequency +Cutoff-Frequency. +440 + + + +ladspa-hpf::Cutoff-Frequency +gfloat +[0,22050] +rwx +Cutoff-Frequency +Cutoff-Frequency. +440 + + + +ladspa-quantiser50::Match-Range +gfloat +>= 0 +rwx +Match-Range +Match-Range. +0 + + + +ladspa-quantiser50::Mode +gint +[0,2] +rwx +Mode +Mode. +0 + + + +ladspa-quantiser50::Quantise-Range-Maximum +gfloat + +rwx +Quantise-Range-Maximum +Quantise-Range-Maximum. +-3,40282e+38 + + + +ladspa-quantiser50::Quantise-Range-Minimum +gfloat + +rwx +Quantise-Range-Minimum +Quantise-Range-Minimum. +-3,40282e+38 + + + +ladspa-quantiser50::Steps +gint +[1,50] +rwx +Steps +Steps. +50 + + + +ladspa-quantiser50::Value-0 +gfloat + +rwx +Value-0 +Value-0. +-3,40282e+38 + + + +ladspa-quantiser50::Value-1 +gfloat + +rwx +Value-1 +Value-1. +-3,40282e+38 + + + +ladspa-quantiser50::Value-10 +gfloat + +rwx +Value-10 +Value-10. +-3,40282e+38 + + + +ladspa-quantiser50::Value-11 +gfloat + +rwx +Value-11 +Value-11. +-3,40282e+38 + + + +ladspa-quantiser50::Value-12 +gfloat + +rwx +Value-12 +Value-12. +-3,40282e+38 + + + +ladspa-quantiser50::Value-13 +gfloat + +rwx +Value-13 +Value-13. +-3,40282e+38 + + + +ladspa-quantiser50::Value-14 +gfloat + +rwx +Value-14 +Value-14. +-3,40282e+38 + + + +ladspa-quantiser50::Value-15 +gfloat + +rwx +Value-15 +Value-15. +-3,40282e+38 + + + +ladspa-quantiser50::Value-16 +gfloat + +rwx +Value-16 +Value-16. +-3,40282e+38 + + + +ladspa-quantiser50::Value-17 +gfloat + +rwx +Value-17 +Value-17. +-3,40282e+38 + + + +ladspa-quantiser50::Value-18 +gfloat + +rwx +Value-18 +Value-18. +-3,40282e+38 + + + +ladspa-quantiser50::Value-19 +gfloat + +rwx +Value-19 +Value-19. +-3,40282e+38 + + + +ladspa-quantiser50::Value-2 +gfloat + +rwx +Value-2 +Value-2. +-3,40282e+38 + + + +ladspa-quantiser50::Value-20 +gfloat + +rwx +Value-20 +Value-20. +-3,40282e+38 + + + +ladspa-quantiser50::Value-21 +gfloat + +rwx +Value-21 +Value-21. +-3,40282e+38 + + + +ladspa-quantiser50::Value-22 +gfloat + +rwx +Value-22 +Value-22. +-3,40282e+38 + + + +ladspa-quantiser50::Value-23 +gfloat + +rwx +Value-23 +Value-23. +-3,40282e+38 + + + +ladspa-quantiser50::Value-24 +gfloat + +rwx +Value-24 +Value-24. +-3,40282e+38 + + + +ladspa-quantiser50::Value-25 +gfloat + +rwx +Value-25 +Value-25. +-3,40282e+38 + + + +ladspa-quantiser50::Value-26 +gfloat + +rwx +Value-26 +Value-26. +-3,40282e+38 + + + +ladspa-quantiser50::Value-27 +gfloat + +rwx +Value-27 +Value-27. +-3,40282e+38 + + + +ladspa-quantiser50::Value-28 +gfloat + +rwx +Value-28 +Value-28. +-3,40282e+38 + + + +ladspa-quantiser50::Value-29 +gfloat + +rwx +Value-29 +Value-29. +-3,40282e+38 + + + +ladspa-quantiser50::Value-3 +gfloat + +rwx +Value-3 +Value-3. +-3,40282e+38 + + + +ladspa-quantiser50::Value-30 +gfloat + +rwx +Value-30 +Value-30. +-3,40282e+38 + + + +ladspa-quantiser50::Value-31 +gfloat + +rwx +Value-31 +Value-31. +-3,40282e+38 + + + +ladspa-quantiser50::Value-32 +gfloat + +rwx +Value-32 +Value-32. +-3,40282e+38 + + + +ladspa-quantiser50::Value-33 +gfloat + +rwx +Value-33 +Value-33. +-3,40282e+38 + + + +ladspa-quantiser50::Value-34 +gfloat + +rwx +Value-34 +Value-34. +-3,40282e+38 + + + +ladspa-quantiser50::Value-35 +gfloat + +rwx +Value-35 +Value-35. +-3,40282e+38 + + + +ladspa-quantiser50::Value-36 +gfloat + +rwx +Value-36 +Value-36. +-3,40282e+38 + + + +ladspa-quantiser50::Value-37 +gfloat + +rwx +Value-37 +Value-37. +-3,40282e+38 + + + +ladspa-quantiser50::Value-38 +gfloat + +rwx +Value-38 +Value-38. +-3,40282e+38 + + + +ladspa-quantiser50::Value-39 +gfloat + +rwx +Value-39 +Value-39. +-3,40282e+38 + + + +ladspa-quantiser50::Value-4 +gfloat + +rwx +Value-4 +Value-4. +-3,40282e+38 + + + +ladspa-quantiser50::Value-40 +gfloat + +rwx +Value-40 +Value-40. +-3,40282e+38 + + + +ladspa-quantiser50::Value-41 +gfloat + +rwx +Value-41 +Value-41. +-3,40282e+38 + + + +ladspa-quantiser50::Value-42 +gfloat + +rwx +Value-42 +Value-42. +-3,40282e+38 + + + +ladspa-quantiser50::Value-43 +gfloat + +rwx +Value-43 +Value-43. +-3,40282e+38 + + + +ladspa-quantiser50::Value-44 +gfloat + +rwx +Value-44 +Value-44. +-3,40282e+38 + + + +ladspa-quantiser50::Value-45 +gfloat + +rwx +Value-45 +Value-45. +-3,40282e+38 + + + +ladspa-quantiser50::Value-46 +gfloat + +rwx +Value-46 +Value-46. +-3,40282e+38 + + + +ladspa-quantiser50::Value-47 +gfloat + +rwx +Value-47 +Value-47. +-3,40282e+38 + + + +ladspa-quantiser50::Value-48 +gfloat + +rwx +Value-48 +Value-48. +-3,40282e+38 + + + +ladspa-quantiser50::Value-49 +gfloat + +rwx +Value-49 +Value-49. +-3,40282e+38 + + + +ladspa-quantiser50::Value-5 +gfloat + +rwx +Value-5 +Value-5. +-3,40282e+38 + + + +ladspa-quantiser50::Value-6 +gfloat + +rwx +Value-6 +Value-6. +-3,40282e+38 + + + +ladspa-quantiser50::Value-7 +gfloat + +rwx +Value-7 +Value-7. +-3,40282e+38 + + + +ladspa-quantiser50::Value-8 +gfloat + +rwx +Value-8 +Value-8. +-3,40282e+38 + + + +ladspa-quantiser50::Value-9 +gfloat + +rwx +Value-9 +Value-9. +-3,40282e+38 + + + +ladspa-plate::Damping +gfloat +[0,1] +rwx +Damping +Damping. +0,25 + + + +ladspa-plate::Dry-wet-mix +gfloat +[0,1] +rwx +Dry-wet-mix +Dry-wet-mix. +0,25 + + + +ladspa-plate::Reverb-time +gfloat +[0,01,8,5] +rwx +Reverb-time +Reverb-time. +4,255 + + + +ladspa-diode::Mode +gfloat +[0,3] +rwx +Mode +Mode. +0 + + + +ladspa-quantiser100::Match-Range +gfloat +>= 0 +rwx +Match-Range +Match-Range. +0 + + + +ladspa-quantiser100::Mode +gint +[0,2] +rwx +Mode +Mode. +0 + + + +ladspa-quantiser100::Quantise-Range-Maximum +gfloat + +rwx +Quantise-Range-Maximum +Quantise-Range-Maximum. +-3,40282e+38 + + + +ladspa-quantiser100::Quantise-Range-Minimum +gfloat + +rwx +Quantise-Range-Minimum +Quantise-Range-Minimum. +-3,40282e+38 + + + +ladspa-quantiser100::Steps +gint +[1,100] +rwx +Steps +Steps. +100 + + + +ladspa-quantiser100::Value-0 +gfloat + +rwx +Value-0 +Value-0. +-3,40282e+38 + + + +ladspa-quantiser100::Value-1 +gfloat + +rwx +Value-1 +Value-1. +-3,40282e+38 + + + +ladspa-quantiser100::Value-10 +gfloat + +rwx +Value-10 +Value-10. +-3,40282e+38 + + + +ladspa-quantiser100::Value-11 +gfloat + +rwx +Value-11 +Value-11. +-3,40282e+38 + + + +ladspa-quantiser100::Value-12 +gfloat + +rwx +Value-12 +Value-12. +-3,40282e+38 + + + +ladspa-quantiser100::Value-13 +gfloat + +rwx +Value-13 +Value-13. +-3,40282e+38 + + + +ladspa-quantiser100::Value-14 +gfloat + +rwx +Value-14 +Value-14. +-3,40282e+38 + + + +ladspa-quantiser100::Value-15 +gfloat + +rwx +Value-15 +Value-15. +-3,40282e+38 + + + +ladspa-quantiser100::Value-16 +gfloat + +rwx +Value-16 +Value-16. +-3,40282e+38 + + + +ladspa-quantiser100::Value-17 +gfloat + +rwx +Value-17 +Value-17. +-3,40282e+38 + + + +ladspa-quantiser100::Value-18 +gfloat + +rwx +Value-18 +Value-18. +-3,40282e+38 + + + +ladspa-quantiser100::Value-19 +gfloat + +rwx +Value-19 +Value-19. +-3,40282e+38 + + + +ladspa-quantiser100::Value-2 +gfloat + +rwx +Value-2 +Value-2. +-3,40282e+38 + + + +ladspa-quantiser100::Value-20 +gfloat + +rwx +Value-20 +Value-20. +-3,40282e+38 + + + +ladspa-quantiser100::Value-21 +gfloat + +rwx +Value-21 +Value-21. +-3,40282e+38 + + + +ladspa-quantiser100::Value-22 +gfloat + +rwx +Value-22 +Value-22. +-3,40282e+38 + + + +ladspa-quantiser100::Value-23 +gfloat + +rwx +Value-23 +Value-23. +-3,40282e+38 + + + +ladspa-quantiser100::Value-24 +gfloat + +rwx +Value-24 +Value-24. +-3,40282e+38 + + + +ladspa-quantiser100::Value-25 +gfloat + +rwx +Value-25 +Value-25. +-3,40282e+38 + + + +ladspa-quantiser100::Value-26 +gfloat + +rwx +Value-26 +Value-26. +-3,40282e+38 + + + +ladspa-quantiser100::Value-27 +gfloat + +rwx +Value-27 +Value-27. +-3,40282e+38 + + + +ladspa-quantiser100::Value-28 +gfloat + +rwx +Value-28 +Value-28. +-3,40282e+38 + + + +ladspa-quantiser100::Value-29 +gfloat + +rwx +Value-29 +Value-29. +-3,40282e+38 + + + +ladspa-quantiser100::Value-3 +gfloat + +rwx +Value-3 +Value-3. +-3,40282e+38 + + + +ladspa-quantiser100::Value-30 +gfloat + +rwx +Value-30 +Value-30. +-3,40282e+38 + + + +ladspa-quantiser100::Value-31 +gfloat + +rwx +Value-31 +Value-31. +-3,40282e+38 + + + +ladspa-quantiser100::Value-32 +gfloat + +rwx +Value-32 +Value-32. +-3,40282e+38 + + + +ladspa-quantiser100::Value-33 +gfloat + +rwx +Value-33 +Value-33. +-3,40282e+38 + + + +ladspa-quantiser100::Value-34 +gfloat + +rwx +Value-34 +Value-34. +-3,40282e+38 + + + +ladspa-quantiser100::Value-35 +gfloat + +rwx +Value-35 +Value-35. +-3,40282e+38 + + + +ladspa-quantiser100::Value-36 +gfloat + +rwx +Value-36 +Value-36. +-3,40282e+38 + + + +ladspa-quantiser100::Value-37 +gfloat + +rwx +Value-37 +Value-37. +-3,40282e+38 + + + +ladspa-quantiser100::Value-38 +gfloat + +rwx +Value-38 +Value-38. +-3,40282e+38 + + + +ladspa-quantiser100::Value-39 +gfloat + +rwx +Value-39 +Value-39. +-3,40282e+38 + + + +ladspa-quantiser100::Value-4 +gfloat + +rwx +Value-4 +Value-4. +-3,40282e+38 + + + +ladspa-quantiser100::Value-40 +gfloat + +rwx +Value-40 +Value-40. +-3,40282e+38 + + + +ladspa-quantiser100::Value-41 +gfloat + +rwx +Value-41 +Value-41. +-3,40282e+38 + + + +ladspa-quantiser100::Value-42 +gfloat + +rwx +Value-42 +Value-42. +-3,40282e+38 + + + +ladspa-quantiser100::Value-43 +gfloat + +rwx +Value-43 +Value-43. +-3,40282e+38 + + + +ladspa-quantiser100::Value-44 +gfloat + +rwx +Value-44 +Value-44. +-3,40282e+38 + + + +ladspa-quantiser100::Value-45 +gfloat + +rwx +Value-45 +Value-45. +-3,40282e+38 + + + +ladspa-quantiser100::Value-46 +gfloat + +rwx +Value-46 +Value-46. +-3,40282e+38 + + + +ladspa-quantiser100::Value-47 +gfloat + +rwx +Value-47 +Value-47. +-3,40282e+38 + + + +ladspa-quantiser100::Value-48 +gfloat + +rwx +Value-48 +Value-48. +-3,40282e+38 + + + +ladspa-quantiser100::Value-49 +gfloat + +rwx +Value-49 +Value-49. +-3,40282e+38 + + + +ladspa-quantiser100::Value-5 +gfloat + +rwx +Value-5 +Value-5. +-3,40282e+38 + + + +ladspa-quantiser100::Value-50 +gfloat + +rwx +Value-50 +Value-50. +-3,40282e+38 + + + +ladspa-quantiser100::Value-51 +gfloat + +rwx +Value-51 +Value-51. +-3,40282e+38 + + + +ladspa-quantiser100::Value-52 +gfloat + +rwx +Value-52 +Value-52. +-3,40282e+38 + + + +ladspa-quantiser100::Value-53 +gfloat + +rwx +Value-53 +Value-53. +-3,40282e+38 + + + +ladspa-quantiser100::Value-54 +gfloat + +rwx +Value-54 +Value-54. +-3,40282e+38 + + + +ladspa-quantiser100::Value-55 +gfloat + +rwx +Value-55 +Value-55. +-3,40282e+38 + + + +ladspa-quantiser100::Value-56 +gfloat + +rwx +Value-56 +Value-56. +-3,40282e+38 + + + +ladspa-quantiser100::Value-57 +gfloat + +rwx +Value-57 +Value-57. +-3,40282e+38 + + + +ladspa-quantiser100::Value-58 +gfloat + +rwx +Value-58 +Value-58. +-3,40282e+38 + + + +ladspa-quantiser100::Value-59 +gfloat + +rwx +Value-59 +Value-59. +-3,40282e+38 + + + +ladspa-quantiser100::Value-6 +gfloat + +rwx +Value-6 +Value-6. +-3,40282e+38 + + + +ladspa-quantiser100::Value-60 +gfloat + +rwx +Value-60 +Value-60. +-3,40282e+38 + + + +ladspa-quantiser100::Value-61 +gfloat + +rwx +Value-61 +Value-61. +-3,40282e+38 + + + +ladspa-quantiser100::Value-62 +gfloat + +rwx +Value-62 +Value-62. +-3,40282e+38 + + + +ladspa-quantiser100::Value-63 +gfloat + +rwx +Value-63 +Value-63. +-3,40282e+38 + + + +ladspa-quantiser100::Value-64 +gfloat + +rwx +Value-64 +Value-64. +-3,40282e+38 + + + +ladspa-quantiser100::Value-65 +gfloat + +rwx +Value-65 +Value-65. +-3,40282e+38 + + + +ladspa-quantiser100::Value-66 +gfloat + +rwx +Value-66 +Value-66. +-3,40282e+38 + + + +ladspa-quantiser100::Value-67 +gfloat + +rwx +Value-67 +Value-67. +-3,40282e+38 + + + +ladspa-quantiser100::Value-68 +gfloat + +rwx +Value-68 +Value-68. +-3,40282e+38 + + + +ladspa-quantiser100::Value-69 +gfloat + +rwx +Value-69 +Value-69. +-3,40282e+38 + + + +ladspa-quantiser100::Value-7 +gfloat + +rwx +Value-7 +Value-7. +-3,40282e+38 + + + +ladspa-quantiser100::Value-70 +gfloat + +rwx +Value-70 +Value-70. +-3,40282e+38 + + + +ladspa-quantiser100::Value-71 +gfloat + +rwx +Value-71 +Value-71. +-3,40282e+38 + + + +ladspa-quantiser100::Value-72 +gfloat + +rwx +Value-72 +Value-72. +-3,40282e+38 + + + +ladspa-quantiser100::Value-73 +gfloat + +rwx +Value-73 +Value-73. +-3,40282e+38 + + + +ladspa-quantiser100::Value-74 +gfloat + +rwx +Value-74 +Value-74. +-3,40282e+38 + + + +ladspa-quantiser100::Value-75 +gfloat + +rwx +Value-75 +Value-75. +-3,40282e+38 + + + +ladspa-quantiser100::Value-76 +gfloat + +rwx +Value-76 +Value-76. +-3,40282e+38 + + + +ladspa-quantiser100::Value-77 +gfloat + +rwx +Value-77 +Value-77. +-3,40282e+38 + + + +ladspa-quantiser100::Value-78 +gfloat + +rwx +Value-78 +Value-78. +-3,40282e+38 + + + +ladspa-quantiser100::Value-79 +gfloat + +rwx +Value-79 +Value-79. +-3,40282e+38 + + + +ladspa-quantiser100::Value-8 +gfloat + +rwx +Value-8 +Value-8. +-3,40282e+38 + + + +ladspa-quantiser100::Value-80 +gfloat + +rwx +Value-80 +Value-80. +-3,40282e+38 + + + +ladspa-quantiser100::Value-81 +gfloat + +rwx +Value-81 +Value-81. +-3,40282e+38 + + + +ladspa-quantiser100::Value-82 +gfloat + +rwx +Value-82 +Value-82. +-3,40282e+38 + + + +ladspa-quantiser100::Value-83 +gfloat + +rwx +Value-83 +Value-83. +-3,40282e+38 + + + +ladspa-quantiser100::Value-84 +gfloat + +rwx +Value-84 +Value-84. +-3,40282e+38 + + + +ladspa-quantiser100::Value-85 +gfloat + +rwx +Value-85 +Value-85. +-3,40282e+38 + + + +ladspa-quantiser100::Value-86 +gfloat + +rwx +Value-86 +Value-86. +-3,40282e+38 + + + +ladspa-quantiser100::Value-87 +gfloat + +rwx +Value-87 +Value-87. +-3,40282e+38 + + + +ladspa-quantiser100::Value-88 +gfloat + +rwx +Value-88 +Value-88. +-3,40282e+38 + + + +ladspa-quantiser100::Value-89 +gfloat + +rwx +Value-89 +Value-89. +-3,40282e+38 + + + +ladspa-quantiser100::Value-9 +gfloat + +rwx +Value-9 +Value-9. +-3,40282e+38 + + + +ladspa-quantiser100::Value-90 +gfloat + +rwx +Value-90 +Value-90. +-3,40282e+38 + + + +ladspa-quantiser100::Value-91 +gfloat + +rwx +Value-91 +Value-91. +-3,40282e+38 + + + +ladspa-quantiser100::Value-92 +gfloat + +rwx +Value-92 +Value-92. +-3,40282e+38 + + + +ladspa-quantiser100::Value-93 +gfloat + +rwx +Value-93 +Value-93. +-3,40282e+38 + + + +ladspa-quantiser100::Value-94 +gfloat + +rwx +Value-94 +Value-94. +-3,40282e+38 + + + +ladspa-quantiser100::Value-95 +gfloat + +rwx +Value-95 +Value-95. +-3,40282e+38 + + + +ladspa-quantiser100::Value-96 +gfloat + +rwx +Value-96 +Value-96. +-3,40282e+38 + + + +ladspa-quantiser100::Value-97 +gfloat + +rwx +Value-97 +Value-97. +-3,40282e+38 + + + +ladspa-quantiser100::Value-98 +gfloat + +rwx +Value-98 +Value-98. +-3,40282e+38 + + + +ladspa-quantiser100::Value-99 +gfloat + +rwx +Value-99 +Value-99. +-3,40282e+38 + + + +ladspa-tap-tubewarmth::Drive +gfloat +[0,1,10] +rwx +Drive +Drive. +2,575 + + + +ladspa-tap-tubewarmth::Tape--Tube-Blend +gfloat +[-10,10] +rwx +Tape--Tube-Blend +Tape--Tube-Blend. +10 + + + +ladspa-vcf-reslp::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-reslp::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-reslp::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-reslp::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-lp::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-lp::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-lp::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-lp::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-hp::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-hp::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-hp::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-hp::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-bp1::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-bp1::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-bp1::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-bp1::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-bp2::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-bp2::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-bp2::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-bp2::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-notch::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-notch::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-notch::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-notch::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-peakeq::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-peakeq::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-peakeq::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-peakeq::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-peakeq::dBgain-Offset +gfloat +[6,24] +rwx +dBgain-Offset +dBgain-Offset. +6 + + + +ladspa-vcf-lshelf::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-lshelf::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-lshelf::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-lshelf::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-lshelf::dBgain-Offset +gfloat +[6,24] +rwx +dBgain-Offset +dBgain-Offset. +6 + + + +ladspa-vcf-hshelf::Frequency-Offset +gfloat +[20,20000] +rwx +Frequency-Offset +Frequency-Offset. +20 + + + +ladspa-vcf-hshelf::Frequency-Pitch +gfloat +[-2,2] +rwx +Frequency-Pitch +Frequency-Pitch. +-2 + + + +ladspa-vcf-hshelf::Gain +gfloat +[0,1] +rwx +Gain +Gain. +0 + + + +ladspa-vcf-hshelf::Resonance-Offset +gfloat +[0,001,1] +rwx +Resonance-Offset +Resonance-Offset. +0,001 + + + +ladspa-vcf-hshelf::dBgain-Offset +gfloat +[6,24] +rwx +dBgain-Offset +dBgain-Offset. +6 + + + +ladspa-satanMaximiser::Decay-time +gfloat +[2,30] +rwx +Decay-time +Decay-time. +30 + + + +ladspa-satanMaximiser::Knee-point +gfloat +[-90,0] +rwx +Knee-point +Knee-point. +0 + + + +ladspa-syncpulse-fcpcga-oa::Frequenz +gfloat +[0,64] +rwx +Frequenz +Frequenz. +16 + + + +ladspa-syncpulse-fcpcga-oa::Pulse-Width +gfloat +[0,1] +rwx +Pulse-Width +Pulse-Width. +0,5 + + + +ladspa-transient::Attack-speed +gfloat +[-1,1] +rwx +Attack-speed +Attack-speed. +0 + + + +ladspa-transient::Sustain-time +gfloat +[-1,1] +rwx +Sustain-time +Sustain-time. +0 + + + +ladspa-sc3::Attack-time +gfloat +[2,400] +rwx +Attack-time +Attack-time. +101,5 + + + +ladspa-sc3::Chain-balance +gfloat +[0,1] +rwx +Chain-balance +Chain-balance. +0 + + + +ladspa-sc3::Knee-radius +gfloat +[1,10] +rwx +Knee-radius +Knee-radius. +3,25 + + + +ladspa-sc3::Makeup-gain +gfloat +[0,24] +rwx +Makeup-gain +Makeup-gain. +0 + + + +ladspa-sc3::Ratio +gfloat +[1,10] +rwx +Ratio +Ratio. +1 + + + +ladspa-sc3::Release-time +gfloat +[2,800] +rwx +Release-time +Release-time. +401 + + + +ladspa-sc3::Threshold-level +gfloat +[-30,0] +rwx +Threshold-level +Threshold-level. +0 + + + +ladspa-tap-sigmoid::Post-Gain--dB- +gfloat +[-90,20] +rwx +Post-Gain--dB- +Post-Gain--dB-. +0 + + + +ladspa-tap-sigmoid::Pre-Gain--dB- +gfloat +[-90,20] +rwx +Pre-Gain--dB- +Pre-Gain--dB-. +0 + + + +ladspa-analogueOsc::Frequency +gfloat +[0,0441,22005,9] +rwx +Frequency +Frequency. +440 + + + +ladspa-analogueOsc::Instability +gfloat +[0,1] +rwx +Instability +Instability. +0 + + + +ladspa-analogueOsc::Warmth +gfloat +[0,1] +rwx +Warmth +Warmth. +0 + + + +ladspa-analogueOsc::Waveform +gint +[1,4] +rwx +Waveform +Waveform. +1 + + + +ladspa-adsr::Abklingzeit +gfloat +>= 0 +rwx +Abklingzeit +Abklingzeit. +0 + + + +ladspa-adsr::Ausklingzeit +gfloat +>= 0 +rwx +Ausklingzeit +Ausklingzeit. +0 + + + +ladspa-adsr::Einschwingzeit +gfloat +>= 0 +rwx +Einschwingzeit +Einschwingzeit. +0 + + + +ladspa-adsr::Haltewert +gfloat +[0,1] +rwx +Haltewert +Haltewert. +1 + + + +ladspa-adsr::Trigger-Threshold +gfloat + +rwx +Trigger-Threshold +Trigger-Threshold. +-3,40282e+38 + + + +ladspa-sifter::Sift-size +gfloat +[1,1000] +rwx +Sift-size +Sift-size. +1 + + + +ladspa-adsr-g+t::Abklingzeit +gfloat +>= 0 +rwx +Abklingzeit +Abklingzeit. +0 + + + +ladspa-adsr-g+t::Ausklingzeit +gfloat +>= 0 +rwx +Ausklingzeit +Ausklingzeit. +0 + + + +ladspa-adsr-g+t::Einschwingzeit +gfloat +>= 0 +rwx +Einschwingzeit +Einschwingzeit. +0 + + + +ladspa-adsr-g+t::Haltewert +gfloat +[0,1] +rwx +Haltewert +Haltewert. +1 + + + +ladspa-ratio-nadc-oa::Denominator +gfloat + +rwx +Denominator +Denominator. +-3,40282e+38 + + + +ladspa-ratio-ncda-oa::Numerator +gfloat + +rwx +Numerator +Numerator. +-3,40282e+38 + + + +ladspa-ratio-ncdc-oc::Denominator +gfloat + +rwx +Denominator +Denominator. +-3,40282e+38 + + + +ladspa-ratio-ncdc-oc::Numerator +gfloat + +rwx +Numerator +Numerator. +-3,40282e+38 + + + +ladspa-ratio-ncdc-oc::Ratio-Output +gfloat + +r +Ratio-Output +Ratio-Output. +-3,40282e+38 + + + +ladspa-giantFlange::Delay-1-range +gfloat +[0,10,5] +rwx +Delay-1-range +Delay-1-range. +2,625 + + + +ladspa-giantFlange::Delay-2-range +gfloat +[0,10,5] +rwx +Delay-2-range +Delay-2-range. +0 + + + +ladspa-giantFlange::Double-delay +gfloat + +rwx +Double-delay +Double-delay. +-3,40282e+38 + + + +ladspa-giantFlange::Dry-Wet-level +gfloat +[0,1] +rwx +Dry-Wet-level +Dry-Wet-level. +0 + + + +ladspa-giantFlange::Feedback +gfloat +[-100,100] +rwx +Feedback +Feedback. +0 + + + +ladspa-giantFlange::LFO-frequency-1 +gfloat +[0,30] +rwx +LFO-frequency-1 +LFO-frequency-1. +1 + + + +ladspa-giantFlange::LFO-frequency-2 +gfloat +[0,30] +rwx +LFO-frequency-2 +LFO-frequency-2. +1 + + + +ladspa-svf::Filter-Q +gfloat +[0,1] +rwx +Filter-Q +Filter-Q. +0,25 + + + +ladspa-svf::Filter-freq +gfloat +[0,6000] +rwx +Filter-freq +Filter-freq. +440 + + + +ladspa-svf::Filter-resonance +gfloat +[0,1] +rwx +Filter-resonance +Filter-resonance. +0 + + + +ladspa-svf::Filter-type +gint +[0,5] +rwx +Filter-type +Filter-type. +0 + + + +ladspa-lp4pole-fcrcia-oa::Cutoff-Frequency +gfloat +[0,91875,22050] +rwx +Cutoff-Frequency +Cutoff-Frequency. +22050 + + + +ladspa-lp4pole-fcrcia-oa::Resonanz +gfloat +[0,4] +rwx +Resonanz +Resonanz. +0 + + + +ladspa-tap-pitch::Dry-Level--dB- +gfloat +[-90,20] +rwx +Dry-Level--dB- +Dry-Level--dB-. +-90 + + + +ladspa-tap-pitch::Rate-Shift---- +gfloat +[-50,100] +rwx +Rate-Shift---- +Rate-Shift----. +0 + + + +ladspa-tap-pitch::Semitone-Shift +gfloat +[-12,12] +rwx +Semitone-Shift +Semitone-Shift. +0 + + + +ladspa-tap-pitch::Wet-Level--dB- +gfloat +[-90,20] +rwx +Wet-Level--dB- +Wet-Level--dB-. +0 + + + +ladspa-tap-pitch::latency +gfloat +[0,16027] +r +latency +latency. +16027 + + + +ladspa-square-fc-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-bandpass-a-iir::Bandwidth +gfloat +[4,41,19845] +rwx +Bandwidth +Bandwidth. +295,832 + + + +ladspa-bandpass-a-iir::Center-Frequency +gfloat +[4,41,19845] +rwx +Center-Frequency +Center-Frequency. +36,1195 + + + +ladspa-amp-mono::Gain +gfloat +>= 0 +rwx +Gain +Gain. +1 + + + +ladspa-amp-stereo::Gain +gfloat +>= 0 +rwx +Gain +Gain. +1 + + + +ladspa-ringmod-2i1o::Modulation-depth +gfloat +[0,2] +rwx +Modulation-depth +Modulation-depth. +0 + + + +ladspa-ringmod-1i1o1l::Frequency +gfloat +[1,1000] +rwx +Frequency +Frequency. +440 + + + +ladspa-ringmod-1i1o1l::Modulation-depth +gfloat +[0,2] +rwx +Modulation-depth +Modulation-depth. +0 + + + +ladspa-ringmod-1i1o1l::Sawtooth-level +gfloat +[-1,1] +rwx +Sawtooth-level +Sawtooth-level. +0 + + + +ladspa-ringmod-1i1o1l::Sine-level +gfloat +[-1,1] +rwx +Sine-level +Sine-level. +1 + + + +ladspa-ringmod-1i1o1l::Square-level +gfloat +[-1,1] +rwx +Square-level +Square-level. +0 + + + +ladspa-ringmod-1i1o1l::Triangle-level +gfloat +[-1,1] +rwx +Triangle-level +Triangle-level. +0 + + + +ladspa-delay-n::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-delay-n::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-delay-l::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-delay-l::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-delay-c::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-delay-c::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-fmod-famc-oa::Modulation +gfloat + +rwx +Modulation +Modulation. +-3,40282e+38 + + + +ladspa-fmod-fcma-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-fmod-fcmc-oc::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-fmod-fcmc-oc::Modulation +gfloat + +rwx +Modulation +Modulation. +-3,40282e+38 + + + +ladspa-fmod-fcmc-oc::Modulierte-Frequenz +gfloat + +r +Modulierte-Frequenz +Modulierte-Frequenz. +-3,40282e+38 + + + +ladspa-gverb::Damping +gfloat +[0,1] +rwx +Damping +Damping. +0,5 + + + +ladspa-gverb::Dry-signal-level +gfloat +[-70,0] +rwx +Dry-signal-level +Dry-signal-level. +-70 + + + +ladspa-gverb::Early-reflection-level +gfloat +[-70,0] +rwx +Early-reflection-level +Early-reflection-level. +0 + + + +ladspa-gverb::Input-bandwidth +gfloat +[0,1] +rwx +Input-bandwidth +Input-bandwidth. +0,75 + + + +ladspa-gverb::Reverb-time +gfloat +[0,1,30] +rwx +Reverb-time +Reverb-time. +7,575 + + + +ladspa-gverb::Roomsize +gfloat +[1,300] +rwx +Roomsize +Roomsize. +75,75 + + + +ladspa-gverb::Tail-level +gfloat +[-70,0] +rwx +Tail-level +Tail-level. +-17,5 + + + +ladspa-se4::Amplitude +gfloat +[-40,12] +r +Amplitude +Amplitude. +-40 + + + +ladspa-se4::Attack-time +gfloat +[1,5,400] +rwx +Attack-time +Attack-time. +101,125 + + + +ladspa-se4::Attenuation +gfloat +[-24,0] +rwx +Attenuation +Attenuation. +0 + + + +ladspa-se4::Gain-expansion +gfloat +[0,24] +r +Gain-expansion +Gain-expansion. +0 + + + +ladspa-se4::Knee-radius +gfloat +[1,10] +rwx +Knee-radius +Knee-radius. +3,25 + + + +ladspa-se4::RMS-peak +gfloat +[0,1] +rwx +RMS-peak +RMS-peak. +0 + + + +ladspa-se4::Ratio +gfloat +[1,20] +rwx +Ratio +Ratio. +1 + + + +ladspa-se4::Release-time +gfloat +[2,800] +rwx +Release-time +Release-time. +401 + + + +ladspa-se4::Threshold-level +gfloat +[-30,0] +rwx +Threshold-level +Threshold-level. +0 + + + +ladspa-gong::Inner-damping +gfloat +[0,1] +rwx +Inner-damping +Inner-damping. +0,5 + + + +ladspa-gong::Inner-size-1 +gfloat +[0,1] +rwx +Inner-size-1 +Inner-size-1. +0,5 + + + +ladspa-gong::Inner-size-2 +gfloat +[0,1] +rwx +Inner-size-2 +Inner-size-2. +0,5 + + + +ladspa-gong::Inner-size-3 +gfloat +[0,1] +rwx +Inner-size-3 +Inner-size-3. +0,5 + + + +ladspa-gong::Inner-size-4 +gfloat +[0,1] +rwx +Inner-size-4 +Inner-size-4. +0,5 + + + +ladspa-gong::Inner-stiffness-1-- +gfloat +[0,1] +rwx +Inner-stiffness-1-- +Inner-stiffness-1--. +0,5 + + + +ladspa-gong::Inner-stiffness-1---1 +gfloat +[0,1] +rwx +Inner-stiffness-1---1 +Inner-stiffness-1---1. +0,5 + + + +ladspa-gong::Inner-stiffness-2-- +gfloat +[0,1] +rwx +Inner-stiffness-2-- +Inner-stiffness-2--. +0,5 + + + +ladspa-gong::Inner-stiffness-2---1 +gfloat +[0,1] +rwx +Inner-stiffness-2---1 +Inner-stiffness-2---1. +0,5 + + + +ladspa-gong::Inner-stiffness-3-- +gfloat +[0,1] +rwx +Inner-stiffness-3-- +Inner-stiffness-3--. +0,5 + + + +ladspa-gong::Inner-stiffness-3---1 +gfloat +[0,1] +rwx +Inner-stiffness-3---1 +Inner-stiffness-3---1. +0,5 + + + +ladspa-gong::Inner-stiffness-4-- +gfloat +[0,1] +rwx +Inner-stiffness-4-- +Inner-stiffness-4--. +0,5 + + + +ladspa-gong::Inner-stiffness-4---1 +gfloat +[0,1] +rwx +Inner-stiffness-4---1 +Inner-stiffness-4---1. +0,5 + + + +ladspa-gong::Mic-position +gfloat +[0,1] +rwx +Mic-position +Mic-position. +0,25 + + + +ladspa-gong::Outer-damping +gfloat +[0,1] +rwx +Outer-damping +Outer-damping. +0,5 + + + +ladspa-gong::Outer-size-1 +gfloat +[0,1] +rwx +Outer-size-1 +Outer-size-1. +0,5 + + + +ladspa-gong::Outer-size-2 +gfloat +[0,1] +rwx +Outer-size-2 +Outer-size-2. +0,5 + + + +ladspa-gong::Outer-size-3 +gfloat +[0,1] +rwx +Outer-size-3 +Outer-size-3. +0,5 + + + +ladspa-gong::Outer-size-4 +gfloat +[0,1] +rwx +Outer-size-4 +Outer-size-4. +0,5 + + + +ladspa-gong::Outer-stiffness-1-- +gfloat +[0,1] +rwx +Outer-stiffness-1-- +Outer-stiffness-1--. +0,5 + + + +ladspa-gong::Outer-stiffness-1---1 +gfloat +[0,1] +rwx +Outer-stiffness-1---1 +Outer-stiffness-1---1. +0,5 + + + +ladspa-gong::Outer-stiffness-2-- +gfloat +[0,1] +rwx +Outer-stiffness-2-- +Outer-stiffness-2--. +0,5 + + + +ladspa-gong::Outer-stiffness-2---1 +gfloat +[0,1] +rwx +Outer-stiffness-2---1 +Outer-stiffness-2---1. +0,5 + + + +ladspa-gong::Outer-stiffness-3-- +gfloat +[0,1] +rwx +Outer-stiffness-3-- +Outer-stiffness-3--. +0,5 + + + +ladspa-gong::Outer-stiffness-3---1 +gfloat +[0,1] +rwx +Outer-stiffness-3---1 +Outer-stiffness-3---1. +0,5 + + + +ladspa-gong::Outer-stiffness-4-- +gfloat +[0,1] +rwx +Outer-stiffness-4-- +Outer-stiffness-4--. +0,5 + + + +ladspa-gong::Outer-stiffness-4---1 +gfloat +[0,1] +rwx +Outer-stiffness-4---1 +Outer-stiffness-4---1. +0,5 + + + +ladspa-encode-bformat::Sound-Source-X-Coordinate +gfloat + +rwx +Sound-Source-X-Coordinate +Sound-Source-X-Coordinate. +1 + + + +ladspa-encode-bformat::Sound-Source-Y-Coordinate +gfloat + +rwx +Sound-Source-Y-Coordinate +Sound-Source-Y-Coordinate. +0 + + + +ladspa-encode-bformat::Sound-Source-Z-Coordinate +gfloat + +rwx +Sound-Source-Z-Coordinate +Sound-Source-Z-Coordinate. +0 + + + +ladspa-encode-fmh::Sound-Source-X-Coordinate +gfloat + +rwx +Sound-Source-X-Coordinate +Sound-Source-X-Coordinate. +1 + + + +ladspa-encode-fmh::Sound-Source-Y-Coordinate +gfloat + +rwx +Sound-Source-Y-Coordinate +Sound-Source-Y-Coordinate. +0 + + + +ladspa-encode-fmh::Sound-Source-Z-Coordinate +gfloat + +rwx +Sound-Source-Z-Coordinate +Sound-Source-Z-Coordinate. +0 + + + +ladspa-bf-rotate-z::Angle-of-Rotation +gfloat +[-180,180] +rwx +Angle-of-Rotation +Angle-of-Rotation. +90 + + + +ladspa-fmh-rotate-z::Angle-of-Rotation +gfloat +[-180,180] +rwx +Angle-of-Rotation +Angle-of-Rotation. +90 + + + +ladspa-analogue::DCO1-Attack +gfloat +[0,1] +rwx +DCO1-Attack +DCO1-Attack. +0 + + + +ladspa-analogue::DCO1-Decay +gfloat +[0,1] +rwx +DCO1-Decay +DCO1-Decay. +0 + + + +ladspa-analogue::DCO1-LFO-Frequency-Modulation +gfloat +[-2,2] +rwx +DCO1-LFO-Frequency-Modulation +DCO1-LFO-Frequency-Modulation. +-2 + + + +ladspa-analogue::DCO1-LFO-Pulse-Width-Modulation +gint +[0,5] +rwx +DCO1-LFO-Pulse-Width-Modulation +DCO1-LFO-Pulse-Width-Modulation. +0 + + + +ladspa-analogue::DCO1-Octave +gfloat +[0,001,1] +rwx +DCO1-Octave +DCO1-Octave. +0,001 + + + +ladspa-analogue::DCO1-Release +gfloat +[0,01,8] +rwx +DCO1-Release +DCO1-Release. +0,01 + + + +ladspa-analogue::DCO1-Sustain +gfloat +[0,01,8] +rwx +DCO1-Sustain +DCO1-Sustain. +0,01 + + + +ladspa-analogue::DCO1-Waveform +gfloat +[0,10] +rwx +DCO1-Waveform +DCO1-Waveform. +0 + + + +ladspa-analogue::DCO2-Attack +gfloat +[0,1] +rwx +DCO2-Attack +DCO2-Attack. +0 + + + +ladspa-analogue::DCO2-Decay +gfloat +[0,1] +rwx +DCO2-Decay +DCO2-Decay. +0 + + + +ladspa-analogue::DCO2-LFO-Frequency-Modulation +gfloat +[-2,2] +rwx +DCO2-LFO-Frequency-Modulation +DCO2-LFO-Frequency-Modulation. +-2 + + + +ladspa-analogue::DCO2-LFO-Pulse-Width-Modulation +gint +[0,5] +rwx +DCO2-LFO-Pulse-Width-Modulation +DCO2-LFO-Pulse-Width-Modulation. +0 + + + +ladspa-analogue::DCO2-Octave +gfloat +[0,1] +rwx +DCO2-Octave +DCO2-Octave. +0 + + + +ladspa-analogue::DCO2-Release +gfloat +[0,01,8] +rwx +DCO2-Release +DCO2-Release. +0,01 + + + +ladspa-analogue::DCO2-Sustain +gfloat +[0,01,8] +rwx +DCO2-Sustain +DCO2-Sustain. +0,01 + + + +ladspa-analogue::DCO2-Waveform +gfloat +[0,01,8] +rwx +DCO2-Waveform +DCO2-Waveform. +0,01 + + + +ladspa-analogue::Filter-Attack +gfloat +[0,1] +rwx +Filter-Attack +Filter-Attack. +0 + + + +ladspa-analogue::Filter-Decay +gfloat +[0,1] +rwx +Filter-Decay +Filter-Decay. +0 + + + +ladspa-analogue::Filter-Envelope-Modulation +gfloat +[0,20] +rwx +Filter-Envelope-Modulation +Filter-Envelope-Modulation. +0 + + + +ladspa-analogue::Filter-LFO-Modulation +gfloat +[0,01,8] +rwx +Filter-LFO-Modulation +Filter-LFO-Modulation. +0,01 + + + +ladspa-analogue::Filter-Release +gfloat +[0,01,8] +rwx +Filter-Release +Filter-Release. +0,01 + + + +ladspa-analogue::Filter-Resonance +gfloat +[0,1] +rwx +Filter-Resonance +Filter-Resonance. +0 + + + +ladspa-analogue::Filter-Sustain +gfloat +[0,01,8] +rwx +Filter-Sustain +Filter-Sustain. +0,01 + + + +ladspa-analogue::Frequency +gfloat +[0,20000] +rwx +Frequency +Frequency. +0 + + + +ladspa-analogue::Gate +gboolean + +rwx +Gate +Gate. +FALSE + + + +ladspa-analogue::LFO-Fadein +gfloat +[0,01,8] +rwx +LFO-Fadein +LFO-Fadein. +0,01 + + + +ladspa-analogue::LFO-Frequency +gfloat +[0,1] +rwx +LFO-Frequency +LFO-Frequency. +0 + + + +ladspa-analogue::Velocity +gfloat +[0,1] +rwx +Velocity +Velocity. +0 + + + +ladspa-canyon-delay::Left-to-Right-Feedback +gfloat +[-1,1] +rwx +Left-to-Right-Feedback +Left-to-Right-Feedback. +-1 + + + +ladspa-canyon-delay::Left-to-Right-Time +gfloat +[0,01,0,99] +rwx +Left-to-Right-Time +Left-to-Right-Time. +0,01 + + + +ladspa-canyon-delay::Low-Pass-Cutoff +gfloat +[1,5000] +rwx +Low-Pass-Cutoff +Low-Pass-Cutoff. +1 + + + +ladspa-canyon-delay::Right-to-Left-Feedback +gfloat +[-1,1] +rwx +Right-to-Left-Feedback +Right-to-Left-Feedback. +-1 + + + +ladspa-canyon-delay::Right-to-Left-Time +gfloat +[0,01,0,99] +rwx +Right-to-Left-Time +Right-to-Left-Time. +0,01 + + + +ladspa-disintegrator::Multiplier +gfloat +[-1,1] +rwx +Multiplier +Multiplier. +0 + + + +ladspa-disintegrator::Probability +gfloat +[0,1] +rwx +Probability +Probability. +0 + + + +ladspa-sledgehammer::Carrier-influence +gfloat +[-1,1] +rwx +Carrier-influence +Carrier-influence. +1 + + + +ladspa-sledgehammer::Modulator-influence +gfloat +[-1,1] +rwx +Modulator-influence +Modulator-influence. +0 + + + +ladspa-sledgehammer::Rate +gfloat +[1e-05,0,001] +rwx +Rate +Rate. +0,000505 + + + +ladspa-delay-0-01s::Delay +gfloat +[0,0,01] +rwx +Delay +Delay. +0,01 + + + +ladspa-delay-0-01s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-delay-0-1s::Delay +gfloat +[0,0,1] +rwx +Delay +Delay. +0,1 + + + +ladspa-delay-0-1s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-delay-1s::Delay +gfloat +[0,1] +rwx +Delay +Delay. +1 + + + +ladspa-delay-1s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-delay-5s::Delay +gfloat +[0,5] +rwx +Delay +Delay. +1 + + + +ladspa-delay-5s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-delay-60s::Delay +gfloat +[0,60] +rwx +Delay +Delay. +1 + + + +ladspa-delay-60s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-track-max-peak::Envelope-Forgetting-Factor +gfloat +>= 0 +rwx +Envelope-Forgetting-Factor +Envelope-Forgetting-Factor. +3,40282e+38 + + + +ladspa-track-max-peak::Output +gfloat +>= 0 +r +Output +Output. +0 + + + +ladspa-track-max-rms::Envelope-Forgetting-Factor +gfloat +>= 0 +rwx +Envelope-Forgetting-Factor +Envelope-Forgetting-Factor. +3,40282e+38 + + + +ladspa-track-max-rms::Output +gfloat +>= 0 +r +Output +Output. +0 + + + +ladspa-track-peak::Output +gfloat +>= 0 +r +Output +Output. +0 + + + +ladspa-track-peak::Smoothing-Factor +gfloat +[0,1] +rwx +Smoothing-Factor +Smoothing-Factor. +0 + + + +ladspa-track-rms::Output +gfloat +>= 0 +r +Output +Output. +0 + + + +ladspa-track-rms::Smoothing-Factor +gfloat +[0,1] +rwx +Smoothing-Factor +Smoothing-Factor. +0 + + + +ladspa-fbdelay-0-01s::Delay +gfloat +[0,0,01] +rwx +Delay +Delay. +0,01 + + + +ladspa-fbdelay-0-01s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-fbdelay-0-01s::Feedback +gfloat +[-1,1] +rwx +Feedback +Feedback. +0,5 + + + +ladspa-fbdelay-0-1s::Delay +gfloat +[0,0,1] +rwx +Delay +Delay. +0,1 + + + +ladspa-fbdelay-0-1s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-fbdelay-0-1s::Feedback +gfloat +[-1,1] +rwx +Feedback +Feedback. +0,5 + + + +ladspa-fbdelay-1s::Delay +gfloat +[0,1] +rwx +Delay +Delay. +1 + + + +ladspa-fbdelay-1s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-fbdelay-1s::Feedback +gfloat +[-1,1] +rwx +Feedback +Feedback. +0,5 + + + +ladspa-fbdelay-5s::Delay +gfloat +[0,5] +rwx +Delay +Delay. +1 + + + +ladspa-fbdelay-5s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-fbdelay-5s::Feedback +gfloat +[-1,1] +rwx +Feedback +Feedback. +0,5 + + + +ladspa-fbdelay-60s::Delay +gfloat +[0,60] +rwx +Delay +Delay. +1 + + + +ladspa-fbdelay-60s::Dry-Wet-Balance +gfloat +[0,1] +rwx +Dry-Wet-Balance +Dry-Wet-Balance. +0,5 + + + +ladspa-fbdelay-60s::Feedback +gfloat +[-1,1] +rwx +Feedback +Feedback. +0,5 + + + +ladspa-freeverb3::Damping +gfloat +[0,1] +rwx +Damping +Damping. +0 + + + +ladspa-freeverb3::Dry-Level +gfloat +[0,1] +rwx +Dry-Level +Dry-Level. +1 + + + +ladspa-freeverb3::Freeze-Mode +gboolean + +rwx +Freeze-Mode +Freeze-Mode. +FALSE + + + +ladspa-freeverb3::Room-Size +gfloat +[0,1] +rwx +Room-Size +Room-Size. +0,5 + + + +ladspa-freeverb3::Wet-Level +gfloat +[0,1] +rwx +Wet-Level +Wet-Level. +0 + + + +ladspa-freeverb3::Width +gfloat +[0,1] +rwx +Width +Width. +0,5 + + + +ladspa-grain-scatter::Density +gfloat +>= 0 +rwx +Density +Density. +3,40282e+38 + + + +ladspa-grain-scatter::Grain-Attack +gfloat +>= 0 +rwx +Grain-Attack +Grain-Attack. +3,40282e+38 + + + +ladspa-grain-scatter::Grain-Length +gfloat +>= 0 +rwx +Grain-Length +Grain-Length. +3,40282e+38 + + + +ladspa-grain-scatter::Scatter +gfloat +[0,5] +rwx +Scatter +Scatter. +2,5 + + + +ladspa-hard-gate::Threshold +gfloat +[0,1] +rwx +Threshold +Threshold. +0 + + + +ladspa-identity-control::Input +gfloat + +rwx +Input +Input. +-3,40282e+38 + + + +ladspa-identity-control::Output +gfloat + +r +Output +Output. +-3,40282e+38 + + + +ladspa-lofi::Crackling +gint +[0,100] +rwx +Crackling +Crackling. +0 + + + +ladspa-lofi::Opamp-Bandwidth-Limiting +gfloat +[1,10000] +rwx +Opamp-Bandwidth-Limiting +Opamp-Bandwidth-Limiting. +1 + + + +ladspa-lofi::Powersupply-Overloading +gfloat +[0,100] +rwx +Powersupply-Overloading +Powersupply-Overloading. +0 + + + +ladspa-logistic::Step-frequency +gfloat +[0,44,1] +rwx +Step-frequency +Step-frequency. +22,05 + + + +ladspa-logistic::param--r--parameter +gfloat +[2,9,3,9999] +rwx +param--r--parameter +param--r--parameter. +3,9999 + + + +ladspa-noise-source-white::Amplitude +gfloat +>= 0 +rwx +Amplitude +Amplitude. +1 + + + +ladspa-null-ci::Input +gfloat + +rwx +Input +Input. +-3,40282e+38 + + + +ladspa-null-co::Output +gfloat + +r +Output +Output. +-3,40282e+38 + + + +ladspa-organ::Attack-Hi +gfloat +[0,01,1] +rwx +Attack-Hi +Attack-Hi. +0,01 + + + +ladspa-organ::Attack-Lo +gfloat +[0,01,1] +rwx +Attack-Lo +Attack-Lo. +0,01 + + + +ladspa-organ::Brass +gboolean + +rwx +Brass +Brass. +FALSE + + + +ladspa-organ::Decay-Hi +gfloat +[0,01,1] +rwx +Decay-Hi +Decay-Hi. +0,01 + + + +ladspa-organ::Decay-Lo +gfloat +[0,01,1] +rwx +Decay-Lo +Decay-Lo. +0,01 + + + +ladspa-organ::Flute +gboolean + +rwx +Flute +Flute. +FALSE + + + +ladspa-organ::Frequency +gfloat +[0,20000] +rwx +Frequency +Frequency. +0 + + + +ladspa-organ::Gate +gboolean + +rwx +Gate +Gate. +FALSE + + + +ladspa-organ::Reed +gboolean + +rwx +Reed +Reed. +FALSE + + + +ladspa-organ::Release-Hi +gfloat +[0,01,1] +rwx +Release-Hi +Release-Hi. +0,01 + + + +ladspa-organ::Release-Lo +gfloat +[0,01,1] +rwx +Release-Lo +Release-Lo. +0,01 + + + +ladspa-organ::Sustain-Hi +gfloat +[0,1] +rwx +Sustain-Hi +Sustain-Hi. +0 + + + +ladspa-organ::Sustain-Lo +gfloat +[0,1] +rwx +Sustain-Lo +Sustain-Lo. +0 + + + +ladspa-organ::Velocity +gfloat +[0,1] +rwx +Velocity +Velocity. +0 + + + +ladspa-organ::param-16th-Harmonic +gfloat +[0,1] +rwx +param-16th-Harmonic +param-16th-Harmonic. +0 + + + +ladspa-organ::param-2-2-3rd-Harmonic +gfloat +[0,1] +rwx +param-2-2-3rd-Harmonic +param-2-2-3rd-Harmonic. +0 + + + +ladspa-organ::param-2nd-Harmonic +gfloat +[0,1] +rwx +param-2nd-Harmonic +param-2nd-Harmonic. +0 + + + +ladspa-organ::param-4th-Harmonic +gfloat +[0,1] +rwx +param-4th-Harmonic +param-4th-Harmonic. +0 + + + +ladspa-organ::param-5-1-3rd-Harmonic +gfloat +[0,1] +rwx +param-5-1-3rd-Harmonic +param-5-1-3rd-Harmonic. +0 + + + +ladspa-organ::param-8th-Harmonic +gfloat +[0,1] +rwx +param-8th-Harmonic +param-8th-Harmonic. +0 + + + +ladspa-peak::Peak +gfloat +>= 0 +r +Peak +Peak. +0 + + + +ladspa-phasemod::DCO1-Attack +gfloat +[0,01,8] +rwx +DCO1-Attack +DCO1-Attack. +0,01 + + + +ladspa-phasemod::DCO1-Decay +gfloat +[0,01,8] +rwx +DCO1-Decay +DCO1-Decay. +0,01 + + + +ladspa-phasemod::DCO1-Modulation +gfloat +[0,1] +rwx +DCO1-Modulation +DCO1-Modulation. +0 + + + +ladspa-phasemod::DCO1-Octave +gfloat +[-2,2] +rwx +DCO1-Octave +DCO1-Octave. +-2 + + + +ladspa-phasemod::DCO1-Release +gfloat +[0,01,8] +rwx +DCO1-Release +DCO1-Release. +0,01 + + + +ladspa-phasemod::DCO1-Sustain +gfloat +[0,1] +rwx +DCO1-Sustain +DCO1-Sustain. +0 + + + +ladspa-phasemod::DCO1-Waveform +gint +[0,5] +rwx +DCO1-Waveform +DCO1-Waveform. +0 + + + +ladspa-phasemod::DCO2-Attack +gfloat +[0,01,8] +rwx +DCO2-Attack +DCO2-Attack. +0,01 + + + +ladspa-phasemod::DCO2-Decay +gfloat +[0,01,8] +rwx +DCO2-Decay +DCO2-Decay. +0,01 + + + +ladspa-phasemod::DCO2-Modulation +gfloat +[0,1] +rwx +DCO2-Modulation +DCO2-Modulation. +0 + + + +ladspa-phasemod::DCO2-Octave +gfloat +[-2,2] +rwx +DCO2-Octave +DCO2-Octave. +-2 + + + +ladspa-phasemod::DCO2-Release +gfloat +[0,01,8] +rwx +DCO2-Release +DCO2-Release. +0,01 + + + +ladspa-phasemod::DCO2-Sustain +gfloat +[0,1] +rwx +DCO2-Sustain +DCO2-Sustain. +0 + + + +ladspa-phasemod::DCO2-Waveform +gint +[0,5] +rwx +DCO2-Waveform +DCO2-Waveform. +0 + + + +ladspa-phasemod::DCO3-Attack +gfloat +[0,01,8] +rwx +DCO3-Attack +DCO3-Attack. +0,01 + + + +ladspa-phasemod::DCO3-Decay +gfloat +[0,01,8] +rwx +DCO3-Decay +DCO3-Decay. +0,01 + + + +ladspa-phasemod::DCO3-Modulation +gfloat +[0,1] +rwx +DCO3-Modulation +DCO3-Modulation. +0 + + + +ladspa-phasemod::DCO3-Octave +gfloat +[-2,2] +rwx +DCO3-Octave +DCO3-Octave. +-2 + + + +ladspa-phasemod::DCO3-Release +gfloat +[0,01,8] +rwx +DCO3-Release +DCO3-Release. +0,01 + + + +ladspa-phasemod::DCO3-Sustain +gfloat +[0,1] +rwx +DCO3-Sustain +DCO3-Sustain. +0 + + + +ladspa-phasemod::DCO3-Waveform +gint +[0,5] +rwx +DCO3-Waveform +DCO3-Waveform. +0 + + + +ladspa-phasemod::DCO4-Attack +gfloat +[0,01,8] +rwx +DCO4-Attack +DCO4-Attack. +0,01 + + + +ladspa-phasemod::DCO4-Decay +gfloat +[0,01,8] +rwx +DCO4-Decay +DCO4-Decay. +0,01 + + + +ladspa-phasemod::DCO4-Modulation +gfloat +[0,1] +rwx +DCO4-Modulation +DCO4-Modulation. +0 + + + +ladspa-phasemod::DCO4-Octave +gfloat +[-2,2] +rwx +DCO4-Octave +DCO4-Octave. +-2 + + + +ladspa-phasemod::DCO4-Release +gfloat +[0,01,8] +rwx +DCO4-Release +DCO4-Release. +0,01 + + + +ladspa-phasemod::DCO4-Sustain +gfloat +[0,1] +rwx +DCO4-Sustain +DCO4-Sustain. +0 + + + +ladspa-phasemod::DCO4-Waveform +gint +[0,5] +rwx +DCO4-Waveform +DCO4-Waveform. +0 + + + +ladspa-phasemod::DCO5-Attack +gfloat +[0,01,8] +rwx +DCO5-Attack +DCO5-Attack. +0,01 + + + +ladspa-phasemod::DCO5-Decay +gfloat +[0,01,8] +rwx +DCO5-Decay +DCO5-Decay. +0,01 + + + +ladspa-phasemod::DCO5-Modulation +gfloat +[0,1] +rwx +DCO5-Modulation +DCO5-Modulation. +0 + + + +ladspa-phasemod::DCO5-Octave +gfloat +[-2,2] +rwx +DCO5-Octave +DCO5-Octave. +-2 + + + +ladspa-phasemod::DCO5-Release +gfloat +[0,01,8] +rwx +DCO5-Release +DCO5-Release. +0,01 + + + +ladspa-phasemod::DCO5-Sustain +gfloat +[0,1] +rwx +DCO5-Sustain +DCO5-Sustain. +0 + + + +ladspa-phasemod::DCO5-Waveform +gint +[0,5] +rwx +DCO5-Waveform +DCO5-Waveform. +0 + + + +ladspa-phasemod::DCO6-Attack +gfloat +[0,01,8] +rwx +DCO6-Attack +DCO6-Attack. +0,01 + + + +ladspa-phasemod::DCO6-Decay +gfloat +[0,01,8] +rwx +DCO6-Decay +DCO6-Decay. +0,01 + + + +ladspa-phasemod::DCO6-Modulation +gfloat +[0,1] +rwx +DCO6-Modulation +DCO6-Modulation. +0 + + + +ladspa-phasemod::DCO6-Octave +gfloat +[-2,2] +rwx +DCO6-Octave +DCO6-Octave. +-2 + + + +ladspa-phasemod::DCO6-Release +gfloat +[0,01,8] +rwx +DCO6-Release +DCO6-Release. +0,01 + + + +ladspa-phasemod::DCO6-Sustain +gfloat +[0,1] +rwx +DCO6-Sustain +DCO6-Sustain. +0 + + + +ladspa-phasemod::DCO6-Waveform +gint +[0,5] +rwx +DCO6-Waveform +DCO6-Waveform. +0 + + + +ladspa-phasemod::Frequency +gfloat +[0,20000] +rwx +Frequency +Frequency. +0 + + + +ladspa-phasemod::Gate +gboolean + +rwx +Gate +Gate. +FALSE + + + +ladspa-phasemod::Velocity +gfloat +[0,1] +rwx +Velocity +Velocity. +0 + + + +ladspa-pink-interpolated-audio::Highest-frequency +gfloat +[0,44100] +rwx +Highest-frequency +Highest-frequency. +1 + + + +ladspa-pink-sh::Sample-and-hold-frequency +gfloat +[0,882] +rwx +Sample-and-hold-frequency +Sample-and-hold-frequency. +1 + + + +ladspa-compress-peak::Compression-Ratio +gfloat +<= 1 +rwx +Compression-Ratio +Compression-Ratio. +-1,70141e+38 + + + +ladspa-compress-peak::Output-Envelope-Attack +gfloat +>= 0 +rwx +Output-Envelope-Attack +Output-Envelope-Attack. +3,40282e+38 + + + +ladspa-compress-peak::Output-Envelope-Decay +gfloat +>= 0 +rwx +Output-Envelope-Decay +Output-Envelope-Decay. +3,40282e+38 + + + +ladspa-compress-peak::Threshold +gfloat +>= 0 +rwx +Threshold +Threshold. +1 + + + +ladspa-compress-rms::Compression-Ratio +gfloat +<= 1 +rwx +Compression-Ratio +Compression-Ratio. +-1,70141e+38 + + + +ladspa-compress-rms::Output-Envelope-Attack +gfloat +>= 0 +rwx +Output-Envelope-Attack +Output-Envelope-Attack. +3,40282e+38 + + + +ladspa-compress-rms::Output-Envelope-Decay +gfloat +>= 0 +rwx +Output-Envelope-Decay +Output-Envelope-Decay. +3,40282e+38 + + + +ladspa-compress-rms::Threshold +gfloat +>= 0 +rwx +Threshold +Threshold. +1 + + + +ladspa-expand-peak::Expansion-Ratio +gfloat +<= 1 +rwx +Expansion-Ratio +Expansion-Ratio. +-1,70141e+38 + + + +ladspa-expand-peak::Output-Envelope-Attack +gfloat +>= 0 +rwx +Output-Envelope-Attack +Output-Envelope-Attack. +3,40282e+38 + + + +ladspa-expand-peak::Output-Envelope-Decay +gfloat +>= 0 +rwx +Output-Envelope-Decay +Output-Envelope-Decay. +3,40282e+38 + + + +ladspa-expand-peak::Threshold +gfloat +>= 0 +rwx +Threshold +Threshold. +1 + + + +ladspa-expand-rms::Expansion-Ratio +gfloat +<= 1 +rwx +Expansion-Ratio +Expansion-Ratio. +-1,70141e+38 + + + +ladspa-expand-rms::Output-Envelope-Attack +gfloat +>= 0 +rwx +Output-Envelope-Attack +Output-Envelope-Attack. +3,40282e+38 + + + +ladspa-expand-rms::Output-Envelope-Decay +gfloat +>= 0 +rwx +Output-Envelope-Decay +Output-Envelope-Decay. +3,40282e+38 + + + +ladspa-expand-rms::Threshold +gfloat +>= 0 +rwx +Threshold +Threshold. +1 + + + +ladspa-limit-peak::Output-Envelope-Attack +gfloat +>= 0 +rwx +Output-Envelope-Attack +Output-Envelope-Attack. +3,40282e+38 + + + +ladspa-limit-peak::Output-Envelope-Decay +gfloat +>= 0 +rwx +Output-Envelope-Decay +Output-Envelope-Decay. +3,40282e+38 + + + +ladspa-limit-peak::Threshold +gfloat +>= 0 +rwx +Threshold +Threshold. +1 + + + +ladspa-limit-rms::Output-Envelope-Attack +gfloat +>= 0 +rwx +Output-Envelope-Attack +Output-Envelope-Attack. +3,40282e+38 + + + +ladspa-limit-rms::Output-Envelope-Decay +gfloat +>= 0 +rwx +Output-Envelope-Decay +Output-Envelope-Decay. +3,40282e+38 + + + +ladspa-limit-rms::Threshold +gfloat +>= 0 +rwx +Threshold +Threshold. +1 + + + +ladspa-sine-faac::Amplitude +gfloat +>= 0 +rwx +Amplitude +Amplitude. +1 + + + +ladspa-sine-fcaa::Frequency +gfloat +[0,22050] +rwx +Frequency +Frequency. +440 + + + +ladspa-sine-fcac::Amplitude +gfloat +>= 0 +rwx +Amplitude +Amplitude. +1 + + + +ladspa-sine-fcac::Frequency +gfloat +[0,22050] +rwx +Frequency +Frequency. +440 + + + +ladspa-syndrum::Frequency +gfloat +[0,20000] +rwx +Frequency +Frequency. +0 + + + +ladspa-syndrum::Frequency-Ratio +gfloat +[0,10] +rwx +Frequency-Ratio +Frequency-Ratio. +0 + + + +ladspa-syndrum::Resonance +gfloat +[0,001,1] +rwx +Resonance +Resonance. +0,001 + + + +ladspa-syndrum::Trigger +gboolean + +rwx +Trigger +Trigger. +FALSE + + + +ladspa-syndrum::Velocity +gfloat +[0,10] +rwx +Velocity +Velocity. +0 + + + +ladspa-vcf303::Cutoff +gfloat +[0,1] +rwx +Cutoff +Cutoff. +0 + + + +ladspa-vcf303::Decay +gfloat +[0,1] +rwx +Decay +Decay. +0 + + + +ladspa-vcf303::Envelope-Modulation +gfloat +[0,1] +rwx +Envelope-Modulation +Envelope-Modulation. +0 + + + +ladspa-vcf303::Resonance +gfloat +[0,1] +rwx +Resonance +Resonance. +0 + + + +ladspa-vcf303::Trigger +gboolean + +rwx +Trigger +Trigger. +FALSE + + + +ladspa-wshape-sine::Limiting-Amplitude +gfloat +>= 0 +rwx +Limiting-Amplitude +Limiting-Amplitude. +1 + + + +ladspa-chebstortion::Distortion +gfloat +[0,3] +rwx +Distortion +Distortion. +0 + + + +ladspa-lcrDelay::C-delay +gfloat +[0,2700] +rwx +C-delay +C-delay. +675 + + + +ladspa-lcrDelay::C-level +gfloat +[0,50] +rwx +C-level +C-level. +25 + + + +ladspa-lcrDelay::Dry-Wet-level +gfloat +[0,1] +rwx +Dry-Wet-level +Dry-Wet-level. +0 + + + +ladspa-lcrDelay::Feedback +gfloat +[-100,100] +rwx +Feedback +Feedback. +0 + + + +ladspa-lcrDelay::High-damp +gfloat +[0,100] +rwx +High-damp +High-damp. +50 + + + +ladspa-lcrDelay::L-delay +gfloat +[0,2700] +rwx +L-delay +L-delay. +675 + + + +ladspa-lcrDelay::L-level +gfloat +[0,50] +rwx +L-level +L-level. +25 + + + +ladspa-lcrDelay::Low-damp +gfloat +[0,100] +rwx +Low-damp +Low-damp. +50 + + + +ladspa-lcrDelay::R-delay +gfloat +[0,2700] +rwx +R-delay +R-delay. +675 + + + +ladspa-lcrDelay::R-level +gfloat +[0,50] +rwx +R-level +R-level. +25 + + + +ladspa-lcrDelay::Spread +gfloat +[0,50] +rwx +Spread +Spread. +25 + + + +ladspa-divider::Denominator +gint +[1,8] +rwx +Denominator +Denominator. +1 + + + +ladspa-random-fasc-oa::Wave-Smoothness +gfloat +[0,1] +rwx +Wave-Smoothness +Wave-Smoothness. +1 + + + +ladspa-random-fcsa-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-random-fcsc-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-random-fcsc-oa::Wave-Smoothness +gfloat +[0,1] +rwx +Wave-Smoothness +Wave-Smoothness. +1 + + + +ladspa-lfoPhaser::Feedback +gfloat +[-1,1] +rwx +Feedback +Feedback. +0 + + + +ladspa-lfoPhaser::LFO-depth +gfloat +[0,1] +rwx +LFO-depth +LFO-depth. +0,25 + + + +ladspa-lfoPhaser::LFO-rate +gfloat +[0,100] +rwx +LFO-rate +LFO-rate. +25 + + + +ladspa-lfoPhaser::Spread +gfloat +[0,2] +rwx +Spread +Spread. +1 + + + +ladspa-fourByFourPole::Feedback-1 +gfloat +[-1,1] +rwx +Feedback-1 +Feedback-1. +0 + + + +ladspa-fourByFourPole::Feedback-2 +gfloat +[-1,1] +rwx +Feedback-2 +Feedback-2. +0 + + + +ladspa-fourByFourPole::Feedback-3 +gfloat +[-1,1] +rwx +Feedback-3 +Feedback-3. +0 + + + +ladspa-fourByFourPole::Feedback-4 +gfloat +[-1,1] +rwx +Feedback-4 +Feedback-4. +0 + + + +ladspa-fourByFourPole::Frequency-1 +gfloat +[1,20000] +rwx +Frequency-1 +Frequency-1. +5000,75 + + + +ladspa-fourByFourPole::Frequency-2 +gfloat +[1,20000] +rwx +Frequency-2 +Frequency-2. +10000,5 + + + +ladspa-fourByFourPole::Frequency-3 +gfloat +[1,20000] +rwx +Frequency-3 +Frequency-3. +15000,2 + + + +ladspa-fourByFourPole::Frequency-4 +gfloat +[1,20000] +rwx +Frequency-4 +Frequency-4. +20000 + + + +ladspa-autoPhaser::Attack-time +gfloat +[0,1] +rwx +Attack-time +Attack-time. +0,25 + + + +ladspa-autoPhaser::Decay-time +gfloat +[0,1] +rwx +Decay-time +Decay-time. +0,25 + + + +ladspa-autoPhaser::Feedback +gfloat +[-1,1] +rwx +Feedback +Feedback. +0 + + + +ladspa-autoPhaser::Modulation-depth +gfloat +[0,1] +rwx +Modulation-depth +Modulation-depth. +0,25 + + + +ladspa-autoPhaser::Spread +gfloat +[0,2] +rwx +Spread +Spread. +1 + + + +ladspa-tap-reflector::Dry-Level--dB- +gfloat +[-90,20] +rwx +Dry-Level--dB- +Dry-Level--dB-. +-90 + + + +ladspa-tap-reflector::Fragment-Length--ms- +gfloat +[20,1600] +rwx +Fragment-Length--ms- +Fragment-Length--ms-. +415 + + + +ladspa-tap-reflector::Wet-Level--dB- +gfloat +[-90,20] +rwx +Wet-Level--dB- +Wet-Level--dB-. +0 + + + +ladspa-fastLookaheadLimiter::Attenuation +gfloat +[0,70] +r +Attenuation +Attenuation. +0 + + + +ladspa-fastLookaheadLimiter::Input-gain +gfloat +[-20,20] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-fastLookaheadLimiter::Limit +gfloat +[-20,0] +rwx +Limit +Limit. +0 + + + +ladspa-fastLookaheadLimiter::Release-time +gfloat +[0,01,2] +rwx +Release-time +Release-time. +0,5075 + + + +ladspa-fastLookaheadLimiter::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-quantiser20::Match-Range +gfloat +>= 0 +rwx +Match-Range +Match-Range. +0 + + + +ladspa-quantiser20::Mode +gint +[0,2] +rwx +Mode +Mode. +0 + + + +ladspa-quantiser20::Quantise-Range-Maximum +gfloat + +rwx +Quantise-Range-Maximum +Quantise-Range-Maximum. +-3,40282e+38 + + + +ladspa-quantiser20::Quantise-Range-Minimum +gfloat + +rwx +Quantise-Range-Minimum +Quantise-Range-Minimum. +-3,40282e+38 + + + +ladspa-quantiser20::Steps +gint +[1,20] +rwx +Steps +Steps. +20 + + + +ladspa-quantiser20::Value-0 +gfloat + +rwx +Value-0 +Value-0. +-3,40282e+38 + + + +ladspa-quantiser20::Value-1 +gfloat + +rwx +Value-1 +Value-1. +-3,40282e+38 + + + +ladspa-quantiser20::Value-10 +gfloat + +rwx +Value-10 +Value-10. +-3,40282e+38 + + + +ladspa-quantiser20::Value-11 +gfloat + +rwx +Value-11 +Value-11. +-3,40282e+38 + + + +ladspa-quantiser20::Value-12 +gfloat + +rwx +Value-12 +Value-12. +-3,40282e+38 + + + +ladspa-quantiser20::Value-13 +gfloat + +rwx +Value-13 +Value-13. +-3,40282e+38 + + + +ladspa-quantiser20::Value-14 +gfloat + +rwx +Value-14 +Value-14. +-3,40282e+38 + + + +ladspa-quantiser20::Value-15 +gfloat + +rwx +Value-15 +Value-15. +-3,40282e+38 + + + +ladspa-quantiser20::Value-16 +gfloat + +rwx +Value-16 +Value-16. +-3,40282e+38 + + + +ladspa-quantiser20::Value-17 +gfloat + +rwx +Value-17 +Value-17. +-3,40282e+38 + + + +ladspa-quantiser20::Value-18 +gfloat + +rwx +Value-18 +Value-18. +-3,40282e+38 + + + +ladspa-quantiser20::Value-19 +gfloat + +rwx +Value-19 +Value-19. +-3,40282e+38 + + + +ladspa-quantiser20::Value-2 +gfloat + +rwx +Value-2 +Value-2. +-3,40282e+38 + + + +ladspa-quantiser20::Value-3 +gfloat + +rwx +Value-3 +Value-3. +-3,40282e+38 + + + +ladspa-quantiser20::Value-4 +gfloat + +rwx +Value-4 +Value-4. +-3,40282e+38 + + + +ladspa-quantiser20::Value-5 +gfloat + +rwx +Value-5 +Value-5. +-3,40282e+38 + + + +ladspa-quantiser20::Value-6 +gfloat + +rwx +Value-6 +Value-6. +-3,40282e+38 + + + +ladspa-quantiser20::Value-7 +gfloat + +rwx +Value-7 +Value-7. +-3,40282e+38 + + + +ladspa-quantiser20::Value-8 +gfloat + +rwx +Value-8 +Value-8. +-3,40282e+38 + + + +ladspa-quantiser20::Value-9 +gfloat + +rwx +Value-9 +Value-9. +-3,40282e+38 + + + +ladspa-vynil::Crackle +gfloat +[0,1] +rwx +Crackle +Crackle. +0 + + + +ladspa-vynil::RPM +gfloat +[33,78] +rwx +RPM +RPM. +33 + + + +ladspa-vynil::Surface-warping +gfloat +[0,1] +rwx +Surface-warping +Surface-warping. +0 + + + +ladspa-vynil::Wear +gfloat +[0,1] +rwx +Wear +Wear. +0 + + + +ladspa-vynil::Year +gfloat +[1900,1990] +rwx +Year +Year. +1990 + + + +ladspa-const::Signal-amplitude +gfloat +[-1,1,1] +rwx +Signal-amplitude +Signal-amplitude. +0 + + + +ladspa-product-iaic-oa::Second-Input +gfloat + +rwx +Second-Input +Second-Input. +-3,40282e+38 + + + +ladspa-product-icic-oc::First-Input +gfloat + +rwx +First-Input +First-Input. +-3,40282e+38 + + + +ladspa-product-icic-oc::Product-Output +gfloat + +r +Product-Output +Product-Output. +-3,40282e+38 + + + +ladspa-product-icic-oc::Second-Input +gfloat + +rwx +Second-Input +Second-Input. +-3,40282e+38 + + + +ladspa-tap-reverb::Allpass-Filters +gboolean + +rwx +Allpass-Filters +Allpass-Filters. +FALSE + + + +ladspa-tap-reverb::Bandpass-Filter +gboolean + +rwx +Bandpass-Filter +Bandpass-Filter. +FALSE + + + +ladspa-tap-reverb::Comb-Filters +gboolean + +rwx +Comb-Filters +Comb-Filters. +FALSE + + + +ladspa-tap-reverb::Decay--ms- +gfloat +[0,10000] +rwx +Decay--ms- +Decay--ms-. +2500 + + + +ladspa-tap-reverb::Dry-Level--dB- +gfloat +[-70,10] +rwx +Dry-Level--dB- +Dry-Level--dB-. +0 + + + +ladspa-tap-reverb::Enhanced-Stereo +gboolean + +rwx +Enhanced-Stereo +Enhanced-Stereo. +FALSE + + + +ladspa-tap-reverb::Reverb-Type +gint +[0,42] +rwx +Reverb-Type +Reverb-Type. +0 + + + +ladspa-tap-reverb::Wet-Level--dB- +gfloat +[-70,10] +rwx +Wet-Level--dB- +Wet-Level--dB-. +0 + + + +ladspa-Pulse-VCO::Exp-FM-gain +gfloat +[0,4] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Pulse-VCO::LP-filter +gfloat +[0,1] +rwx +LP-filter +LP-filter. +1 + + + +ladspa-Pulse-VCO::Lin-FM-gain +gfloat +[0,4] +rwx +Lin-FM-gain +Lin-FM-gain. +0 + + + +ladspa-Pulse-VCO::Octave +gint +[-4,4] +rwx +Octave +Octave. +0 + + + +ladspa-Pulse-VCO::Tune +gfloat +[0,1] +rwx +Tune +Tune. +0 + + + +ladspa-Saw-VCO::Exp-FM-gain +gfloat +[0,4] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Saw-VCO::LP-filter +gfloat +[0,1] +rwx +LP-filter +LP-filter. +1 + + + +ladspa-Saw-VCO::Lin-FM-gain +gfloat +[0,4] +rwx +Lin-FM-gain +Lin-FM-gain. +0 + + + +ladspa-Saw-VCO::Octave +gint +[-4,4] +rwx +Octave +Octave. +0 + + + +ladspa-Saw-VCO::Tune +gfloat +[0,1] +rwx +Tune +Tune. +0 + + + +ladspa-Rec-VCO::Exp-FM-gain +gfloat +[0,4] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Rec-VCO::Form-mod +gfloat +[0,4] +rwx +Form-mod +Form-mod. +0 + + + +ladspa-Rec-VCO::LP-filter +gfloat +[0,1] +rwx +LP-filter +LP-filter. +1 + + + +ladspa-Rec-VCO::Lin-FM-gain +gfloat +[0,4] +rwx +Lin-FM-gain +Lin-FM-gain. +0 + + + +ladspa-Rec-VCO::Octave +gint +[-4,4] +rwx +Octave +Octave. +0 + + + +ladspa-Rec-VCO::Tune +gfloat +[0,1] +rwx +Tune +Tune. +0 + + + +ladspa-Rec-VCO::Waveform +gfloat +[-1,1] +rwx +Waveform +Waveform. +0 + + + +ladspa-singlePara::Bandwidth +gfloat +[0,4] +rwx +Bandwidth +Bandwidth. +1 + + + +ladspa-singlePara::Frequency +gfloat +[0,17640] +rwx +Frequency +Frequency. +440 + + + +ladspa-singlePara::Gain +gfloat +[-70,30] +rwx +Gain +Gain. +0 + + + +ladspa-gate::Attack +gfloat +[0,01,1000] +rwx +Attack +Attack. +250,008 + + + +ladspa-gate::Decay +gfloat +[2,4000] +rwx +Decay +Decay. +2001 + + + +ladspa-gate::HF-key-filter +gfloat +[220,5,21609] +rwx +HF-key-filter +HF-key-filter. +21609 + + + +ladspa-gate::Hold +gfloat +[2,2000] +rwx +Hold +Hold. +1500,5 + + + +ladspa-gate::LF-key-filter +gfloat +[30,87,4410] +rwx +LF-key-filter +LF-key-filter. +30,87 + + + +ladspa-gate::Output-select +gint +[-1,1] +rwx +Output-select +Output-select. +0 + + + +ladspa-gate::Range +gfloat +[-90,0] +rwx +Range +Range. +-90 + + + +ladspa-gate::Threshold +gfloat +[-70,20] +rwx +Threshold +Threshold. +-70 + + + +ladspa-tap-dynamics-st::Attack--ms- +gfloat +[4,500] +rwx +Attack--ms- +Attack--ms-. +128 + + + +ladspa-tap-dynamics-st::Envelope-Volume +gfloat +[-60,20] +r +Envelope-Volume +Envelope-Volume. +0 + + + +ladspa-tap-dynamics-st::Envelope-Volume-1 +gfloat +[-60,20] +r +Envelope-Volume-1 +Envelope-Volume-1. +0 + + + +ladspa-tap-dynamics-st::Function +gint +[0,14] +rwx +Function +Function. +0 + + + +ladspa-tap-dynamics-st::Gain-Adjustment +gfloat +[-60,20] +r +Gain-Adjustment +Gain-Adjustment. +0 + + + +ladspa-tap-dynamics-st::Gain-Adjustment-1 +gfloat +[-60,20] +r +Gain-Adjustment-1 +Gain-Adjustment-1. +0 + + + +ladspa-tap-dynamics-st::Makeup-Gain--dB- +gfloat +[-20,20] +rwx +Makeup-Gain--dB- +Makeup-Gain--dB-. +0 + + + +ladspa-tap-dynamics-st::Offset-Gain--dB- +gfloat +[-20,20] +rwx +Offset-Gain--dB- +Offset-Gain--dB-. +0 + + + +ladspa-tap-dynamics-st::Release--ms- +gfloat +[4,1000] +rwx +Release--ms- +Release--ms-. +502 + + + +ladspa-tap-dynamics-st::Stereo-Mode +gint +[0,2] +rwx +Stereo-Mode +Stereo-Mode. +0 + + + +ladspa-Parametric1::Bandwidth-1 +gfloat +[0,125,8] +rwx +Bandwidth-1 +Bandwidth-1. +1 + + + +ladspa-Parametric1::Bandwidth-2 +gfloat +[0,125,8] +rwx +Bandwidth-2 +Bandwidth-2. +1 + + + +ladspa-Parametric1::Bandwidth-3 +gfloat +[0,125,8] +rwx +Bandwidth-3 +Bandwidth-3. +1 + + + +ladspa-Parametric1::Bandwidth-4 +gfloat +[0,125,8] +rwx +Bandwidth-4 +Bandwidth-4. +1 + + + +ladspa-Parametric1::Filter +gboolean + +rwx +Filter +Filter. +FALSE + + + +ladspa-Parametric1::Frequency-1 +gfloat +[20,2000] +rwx +Frequency-1 +Frequency-1. +200 + + + +ladspa-Parametric1::Frequency-2 +gfloat +[40,4000] +rwx +Frequency-2 +Frequency-2. +400 + + + +ladspa-Parametric1::Frequency-3 +gfloat +[100,10000] +rwx +Frequency-3 +Frequency-3. +1000 + + + +ladspa-Parametric1::Frequency-4 +gfloat +[200,20000] +rwx +Frequency-4 +Frequency-4. +2000 + + + +ladspa-Parametric1::Gain +gfloat +[-20,20] +rwx +Gain +Gain. +0 + + + +ladspa-Parametric1::Gain-1 +gfloat +[-20,20] +rwx +Gain-1 +Gain-1. +0 + + + +ladspa-Parametric1::Gain-2 +gfloat +[-20,20] +rwx +Gain-2 +Gain-2. +0 + + + +ladspa-Parametric1::Gain-3 +gfloat +[-20,20] +rwx +Gain-3 +Gain-3. +0 + + + +ladspa-Parametric1::Gain-4 +gfloat +[-20,20] +rwx +Gain-4 +Gain-4. +0 + + + +ladspa-Parametric1::Section-1 +gboolean + +rwx +Section-1 +Section-1. +FALSE + + + +ladspa-Parametric1::Section-2 +gboolean + +rwx +Section-2 +Section-2. +FALSE + + + +ladspa-Parametric1::Section-3 +gboolean + +rwx +Section-3 +Section-3. +FALSE + + + +ladspa-Parametric1::Section-4 +gboolean + +rwx +Section-4 +Section-4. +FALSE + + + +ladspa-sinCos::Base-frequency +gfloat +[0,0441,22050] +rwx +Base-frequency +Base-frequency. +440 + + + +ladspa-sinCos::Pitch-offset +gfloat +[0,8] +rwx +Pitch-offset +Pitch-offset. +0 + + + +ladspa-matrixSpatialiser::Width +gint +[-512,512] +rwx +Width +Width. +0 + + + +ladspa-tap-limiter::Limit-Level--dB- +gfloat +[-30,20] +rwx +Limit-Level--dB- +Limit-Level--dB-. +0 + + + +ladspa-tap-limiter::Output-Volume--dB- +gfloat +[-30,20] +rwx +Output-Volume--dB- +Output-Volume--dB-. +0 + + + +ladspa-tap-limiter::latency +gfloat +[0,2500,1] +r +latency +latency. +2500,1 + + + +ladspa-bodeShifterCV::Base-shift +gfloat +[0,5000] +rwx +Base-shift +Base-shift. +0 + + + +ladspa-bodeShifterCV::CV-Attenuation +gfloat +[0,1] +rwx +CV-Attenuation +CV-Attenuation. +1 + + + +ladspa-bodeShifterCV::Mix +gfloat +[-1,1] +rwx +Mix +Mix. +0 + + + +ladspa-bodeShifterCV::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-Phaser1::Exp-FM-gain +gfloat +[0,10] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Phaser1::Feedback-gain +gfloat +[-1,1] +rwx +Feedback-gain +Feedback-gain. +0 + + + +ladspa-Phaser1::Frequency +gfloat +[-6,6] +rwx +Frequency +Frequency. +0 + + + +ladspa-Phaser1::Input-gain +gfloat +[-40,10] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-Phaser1::Lin-FM-gain +gfloat +[0,10] +rwx +Lin-FM-gain +Lin-FM-gain. +0 + + + +ladspa-Phaser1::Output-mix +gfloat +[-1,1] +rwx +Output-mix +Output-mix. +0 + + + +ladspa-Phaser1::Sections +gint +[1,30] +rwx +Sections +Sections. +1 + + + +ladspa-Phaser1+LFO::Feedback-gain +gfloat +[-1,1] +rwx +Feedback-gain +Feedback-gain. +0 + + + +ladspa-Phaser1+LFO::Frequency +gfloat +[-6,6] +rwx +Frequency +Frequency. +0 + + + +ladspa-Phaser1+LFO::Input-gain +gfloat +[-40,10] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-Phaser1+LFO::LFO-frequency +gfloat +[0,01,30] +rwx +LFO-frequency +LFO-frequency. +0,01 + + + +ladspa-Phaser1+LFO::LFO-waveform +gfloat +[-1,1] +rwx +LFO-waveform +LFO-waveform. +0 + + + +ladspa-Phaser1+LFO::Modulation-gain +gfloat +[0,10] +rwx +Modulation-gain +Modulation-gain. +0 + + + +ladspa-Phaser1+LFO::Output-mix +gfloat +[-1,1] +rwx +Output-mix +Output-mix. +0 + + + +ladspa-Phaser1+LFO::Sections +gint +[1,30] +rwx +Sections +Sections. +1 + + + +ladspa-decimator::Bit-depth +gfloat +[1,24] +rwx +Bit-depth +Bit-depth. +24 + + + +ladspa-decimator::Sample-rate +gfloat +[44,1,44100] +rwx +Sample-rate +Sample-rate. +44100 + + + +ladspa-shaper::Waveshape +gfloat +[-10,10] +rwx +Waveshape +Waveshape. +0 + + + +ladspa-triangle-fasc-oa::Slope +gfloat +[0,1] +rwx +Slope +Slope. +0,5 + + + +ladspa-triangle-fcsa-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-triangle-fcsc-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-triangle-fcsc-oa::Slope +gfloat +[0,1] +rwx +Slope +Slope. +0,5 + + + +ladspa-djFlanger::Feedback +gfloat +[-100,100] +rwx +Feedback +Feedback. +0 + + + +ladspa-djFlanger::LFO-depth +gfloat +[1,5] +rwx +LFO-depth +LFO-depth. +4 + + + +ladspa-djFlanger::LFO-period +gfloat +[0,1,32] +rwx +LFO-period +LFO-period. +1 + + + +ladspa-djFlanger::LFO-sync +gfloat + +rwx +LFO-sync +LFO-sync. +-3,40282e+38 + + + +ladspa-imp::Gain +gfloat +[-90,24] +rwx +Gain +Gain. +0 + + + +ladspa-imp::High-latency-mode +gint +[0,1] +rwx +High-latency-mode +High-latency-mode. +0 + + + +ladspa-imp::Impulse-ID +gint +[1,21] +rwx +Impulse-ID +Impulse-ID. +1 + + + +ladspa-imp::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-tap-dynamics-m::Attack--ms- +gfloat +[4,500] +rwx +Attack--ms- +Attack--ms-. +128 + + + +ladspa-tap-dynamics-m::Envelope-Volume--dB- +gfloat +[-60,20] +r +Envelope-Volume--dB- +Envelope-Volume--dB-. +0 + + + +ladspa-tap-dynamics-m::Function +gint +[0,14] +rwx +Function +Function. +0 + + + +ladspa-tap-dynamics-m::Gain-Adjustment--dB- +gfloat +[-60,20] +r +Gain-Adjustment--dB- +Gain-Adjustment--dB-. +0 + + + +ladspa-tap-dynamics-m::Makeup-Gain--dB- +gfloat +[-20,20] +rwx +Makeup-Gain--dB- +Makeup-Gain--dB-. +0 + + + +ladspa-tap-dynamics-m::Offset-Gain--dB- +gfloat +[-20,20] +rwx +Offset-Gain--dB- +Offset-Gain--dB-. +0 + + + +ladspa-tap-dynamics-m::Release--ms- +gfloat +[4,1000] +rwx +Release--ms- +Release--ms-. +502 + + + +ladspa-xfade::Crossfade +gfloat +[-1,1] +rwx +Crossfade +Crossfade. +0 + + + +ladspa-xfade4::Crossfade +gfloat +[-1,1] +rwx +Crossfade +Crossfade. +0 + + + +ladspa-tap-tremolo::Depth---- +gfloat +[0,100] +rwx +Depth---- +Depth----. +0 + + + +ladspa-tap-tremolo::Frequency--Hz- +gfloat +[0,20] +rwx +Frequency--Hz- +Frequency--Hz-. +0 + + + +ladspa-tap-tremolo::Gain--dB- +gfloat +[-70,20] +rwx +Gain--dB- +Gain--dB-. +0 + + + +ladspa-pitchScale::Pitch-co-efficient +gfloat +[0,5,2] +rwx +Pitch-co-efficient +Pitch-co-efficient. +1 + + + +ladspa-pitchScale::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-pitchScaleHQ::Pitch-co-efficient +gfloat +[0,5,2] +rwx +Pitch-co-efficient +Pitch-co-efficient. +1 + + + +ladspa-pitchScaleHQ::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-valveRect::Distortion +gfloat +[0,1] +rwx +Distortion +Distortion. +0 + + + +ladspa-valveRect::Sag-level +gfloat +[0,1] +rwx +Sag-level +Sag-level. +0 + + + +ladspa-tap-pinknoise::Fractal-Dimension +gfloat +[0,1] +rwx +Fractal-Dimension +Fractal-Dimension. +0,5 + + + +ladspa-tap-pinknoise::Noise-Level--dB- +gfloat +[-90,20] +rwx +Noise-Level--dB- +Noise-Level--dB-. +-90 + + + +ladspa-tap-pinknoise::Signal-Level--dB- +gfloat +[-90,20] +rwx +Signal-Level--dB- +Signal-Level--dB-. +0 + + + +ladspa-interpolator::Control-Input +gfloat + +rwx +Control-Input +Control-Input. +-3,40282e+38 + + + +ladspa-hermesFilter::Band-1-gain +gfloat +[-70,20] +rwx +Band-1-gain +Band-1-gain. +0 + + + +ladspa-hermesFilter::Band-2-gain +gfloat +[-70,20] +rwx +Band-2-gain +Band-2-gain. +0 + + + +ladspa-hermesFilter::Band-3-gain +gfloat +[-70,20] +rwx +Band-3-gain +Band-3-gain. +0 + + + +ladspa-hermesFilter::Delay1-feedback +gfloat +[0,1] +rwx +Delay1-feedback +Delay1-feedback. +0 + + + +ladspa-hermesFilter::Delay1-length +gfloat +[0,2] +rwx +Delay1-length +Delay1-length. +0 + + + +ladspa-hermesFilter::Delay1-wetness +gfloat +[0,1] +rwx +Delay1-wetness +Delay1-wetness. +0 + + + +ladspa-hermesFilter::Delay2-feedback +gfloat +[0,1] +rwx +Delay2-feedback +Delay2-feedback. +0 + + + +ladspa-hermesFilter::Delay2-length +gfloat +[0,2] +rwx +Delay2-length +Delay2-length. +0 + + + +ladspa-hermesFilter::Delay2-wetness +gfloat +[0,1] +rwx +Delay2-wetness +Delay2-wetness. +0 + + + +ladspa-hermesFilter::Delay3-feedback +gfloat +[0,1] +rwx +Delay3-feedback +Delay3-feedback. +0 + + + +ladspa-hermesFilter::Delay3-length +gfloat +[0,2] +rwx +Delay3-length +Delay3-length. +0 + + + +ladspa-hermesFilter::Delay3-wetness +gfloat +[0,1] +rwx +Delay3-wetness +Delay3-wetness. +0 + + + +ladspa-hermesFilter::Dist1-drive +gfloat +[0,3] +rwx +Dist1-drive +Dist1-drive. +0 + + + +ladspa-hermesFilter::Dist2-drive +gfloat +[0,3] +rwx +Dist2-drive +Dist2-drive. +0 + + + +ladspa-hermesFilter::Dist3-drive +gfloat +[0,3] +rwx +Dist3-drive +Dist3-drive. +0 + + + +ladspa-hermesFilter::Filt1-LFO1-level +gfloat +[-500,500] +rwx +Filt1-LFO1-level +Filt1-LFO1-level. +0 + + + +ladspa-hermesFilter::Filt1-LFO2-level +gfloat +[-500,500] +rwx +Filt1-LFO2-level +Filt1-LFO2-level. +0 + + + +ladspa-hermesFilter::Filt1-freq +gfloat +[0,8000] +rwx +Filt1-freq +Filt1-freq. +440 + + + +ladspa-hermesFilter::Filt1-q +gfloat +[0,1] +rwx +Filt1-q +Filt1-q. +0 + + + +ladspa-hermesFilter::Filt1-resonance +gfloat +[0,1] +rwx +Filt1-resonance +Filt1-resonance. +0 + + + +ladspa-hermesFilter::Filt1-type +gint +[0,5] +rwx +Filt1-type +Filt1-type. +0 + + + +ladspa-hermesFilter::Filt2-LFO1-level +gfloat +[-500,500] +rwx +Filt2-LFO1-level +Filt2-LFO1-level. +0 + + + +ladspa-hermesFilter::Filt2-LFO2-level +gfloat +[-500,500] +rwx +Filt2-LFO2-level +Filt2-LFO2-level. +0 + + + +ladspa-hermesFilter::Filt2-freq +gfloat +[0,8000] +rwx +Filt2-freq +Filt2-freq. +440 + + + +ladspa-hermesFilter::Filt2-q +gfloat +[0,1] +rwx +Filt2-q +Filt2-q. +0 + + + +ladspa-hermesFilter::Filt2-resonance +gfloat +[0,1] +rwx +Filt2-resonance +Filt2-resonance. +0 + + + +ladspa-hermesFilter::Filt2-type +gint +[0,5] +rwx +Filt2-type +Filt2-type. +0 + + + +ladspa-hermesFilter::Filt3-LFO1-level +gfloat +[-500,500] +rwx +Filt3-LFO1-level +Filt3-LFO1-level. +0 + + + +ladspa-hermesFilter::Filt3-LFO2-level +gfloat +[-500,500] +rwx +Filt3-LFO2-level +Filt3-LFO2-level. +0 + + + +ladspa-hermesFilter::Filt3-freq +gfloat +[0,8000] +rwx +Filt3-freq +Filt3-freq. +440 + + + +ladspa-hermesFilter::Filt3-q +gfloat +[0,1] +rwx +Filt3-q +Filt3-q. +0 + + + +ladspa-hermesFilter::Filt3-resonance +gfloat +[0,1] +rwx +Filt3-resonance +Filt3-resonance. +0 + + + +ladspa-hermesFilter::Filt3-type +gint +[0,5] +rwx +Filt3-type +Filt3-type. +0 + + + +ladspa-hermesFilter::Input-gain +gfloat +[-70,20] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-hermesFilter::LFO1-freq +gfloat +[0,1000] +rwx +LFO1-freq +LFO1-freq. +250 + + + +ladspa-hermesFilter::LFO1-wave +gint +[0,4] +rwx +LFO1-wave +LFO1-wave. +0 + + + +ladspa-hermesFilter::LFO2-freq +gfloat +[0,1000] +rwx +LFO2-freq +LFO2-freq. +250 + + + +ladspa-hermesFilter::LFO2-wave +gint +[0,4] +rwx +LFO2-wave +LFO2-wave. +0 + + + +ladspa-hermesFilter::Osc1-freq +gfloat +[0,4000] +rwx +Osc1-freq +Osc1-freq. +440 + + + +ladspa-hermesFilter::Osc1-gain +gfloat +[-70,20] +rwx +Osc1-gain +Osc1-gain. +-70 + + + +ladspa-hermesFilter::Osc1-wave +gint +[0,4] +rwx +Osc1-wave +Osc1-wave. +0 + + + +ladspa-hermesFilter::Osc2-freq +gfloat +[0,4000] +rwx +Osc2-freq +Osc2-freq. +440 + + + +ladspa-hermesFilter::Osc2-gain +gfloat +[-70,20] +rwx +Osc2-gain +Osc2-gain. +-70 + + + +ladspa-hermesFilter::Osc2-wave +gint +[0,4] +rwx +Osc2-wave +Osc2-wave. +0 + + + +ladspa-hermesFilter::RM1-gain +gfloat +[-70,20] +rwx +RM1-gain +RM1-gain. +-70 + + + +ladspa-hermesFilter::RM2-gain +gfloat +[-70,20] +rwx +RM2-gain +RM2-gain. +-70 + + + +ladspa-hermesFilter::RM3-gain +gfloat +[-70,20] +rwx +RM3-gain +RM3-gain. +-70 + + + +ladspa-hermesFilter::Ringmod-1-depth +gfloat +[0,2] +rwx +Ringmod-1-depth +Ringmod-1-depth. +0 + + + +ladspa-hermesFilter::Ringmod-2-depth +gfloat +[0,2] +rwx +Ringmod-2-depth +Ringmod-2-depth. +0 + + + +ladspa-hermesFilter::Ringmod-3-depth +gfloat +[0,2] +rwx +Ringmod-3-depth +Ringmod-3-depth. +0 + + + +ladspa-hermesFilter::Xover-lower-freq +gfloat +[50,6000] +rwx +Xover-lower-freq +Xover-lower-freq. +1537,5 + + + +ladspa-hermesFilter::Xover-upper-freq +gfloat +[1000,10000] +rwx +Xover-upper-freq +Xover-upper-freq. +7750 + + + +ladspa-impulse-fc::Frequency +gfloat +>= 0 +rwx +Frequency +Frequency. +0 + + + +ladspa-bodeShifter::Frequency-shift +gfloat +[0,5000] +rwx +Frequency-shift +Frequency-shift. +0 + + + +ladspa-bodeShifter::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-harmonicGen::Fundamental-magnitude +gfloat +[-1,1] +rwx +Fundamental-magnitude +Fundamental-magnitude. +1 + + + +ladspa-harmonicGen::param-10th-harmonic-magnitude +gfloat +[-1,1] +rwx +param-10th-harmonic-magnitude +param-10th-harmonic-magnitude. +0 + + + +ladspa-harmonicGen::param-2nd-harmonic-magnitude +gfloat +[-1,1] +rwx +param-2nd-harmonic-magnitude +param-2nd-harmonic-magnitude. +0 + + + +ladspa-harmonicGen::param-3rd-harmonic-magnitude +gfloat +[-1,1] +rwx +param-3rd-harmonic-magnitude +param-3rd-harmonic-magnitude. +0 + + + +ladspa-harmonicGen::param-4th-harmonic-magnitude +gfloat +[-1,1] +rwx +param-4th-harmonic-magnitude +param-4th-harmonic-magnitude. +0 + + + +ladspa-harmonicGen::param-5th-harmonic-magnitude +gfloat +[-1,1] +rwx +param-5th-harmonic-magnitude +param-5th-harmonic-magnitude. +0 + + + +ladspa-harmonicGen::param-6th-harmonic-magnitude +gfloat +[-1,1] +rwx +param-6th-harmonic-magnitude +param-6th-harmonic-magnitude. +0 + + + +ladspa-harmonicGen::param-7th-harmonic-magnitude +gfloat +[-1,1] +rwx +param-7th-harmonic-magnitude +param-7th-harmonic-magnitude. +0 + + + +ladspa-harmonicGen::param-8th-harmonic-magnitude +gfloat +[-1,1] +rwx +param-8th-harmonic-magnitude +param-8th-harmonic-magnitude. +0 + + + +ladspa-harmonicGen::param-9th-harmonic-magnitude +gfloat +[-1,1] +rwx +param-9th-harmonic-magnitude +param-9th-harmonic-magnitude. +0 + + + +ladspa-pulse-fapc-oa::Pulse-Width +gfloat +[0,1] +rwx +Pulse-Width +Pulse-Width. +0,5 + + + +ladspa-pulse-fcpa-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-pulse-fcpc-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-pulse-fcpc-oa::Pulse-Width +gfloat +[0,1] +rwx +Pulse-Width +Pulse-Width. +0,5 + + + +ladspa-lowpass-iir::Cutoff-Frequency +gfloat +[4,41,19845] +rwx +Cutoff-Frequency +Cutoff-Frequency. +2422,97 + + + +ladspa-lowpass-iir::Stages-2-poles-per-stage- +gint +[1,10] +rwx +Stages-2-poles-per-stage- +Stages-2-poles-per-stage-. +1 + + + +ladspa-tap-rotspeak::Horn-Frequency--Hz- +gfloat +[0,30] +rwx +Horn-Frequency--Hz- +Horn-Frequency--Hz-. +0 + + + +ladspa-tap-rotspeak::Mic-Distance---- +gfloat +[0,100] +rwx +Mic-Distance---- +Mic-Distance----. +25 + + + +ladspa-tap-rotspeak::Rotor-Frequency--Hz- +gfloat +[0,30] +rwx +Rotor-Frequency--Hz- +Rotor-Frequency--Hz-. +0 + + + +ladspa-tap-rotspeak::Rotor-Horn-Mix +gfloat +[0,1] +rwx +Rotor-Horn-Mix +Rotor-Horn-Mix. +0,5 + + + +ladspa-tap-rotspeak::latency +gfloat +[0,9200] +r +latency +latency. +9200 + + + +ladspa-tap-vibrato::Depth---- +gfloat +[0,20] +rwx +Depth---- +Depth----. +0 + + + +ladspa-tap-vibrato::Dry-Level--dB- +gfloat +[-90,20] +rwx +Dry-Level--dB- +Dry-Level--dB-. +-90 + + + +ladspa-tap-vibrato::Frequency--Hz- +gfloat +[0,30] +rwx +Frequency--Hz- +Frequency--Hz-. +0 + + + +ladspa-tap-vibrato::Wet-Level--dB- +gfloat +[-90,20] +rwx +Wet-Level--dB- +Wet-Level--dB-. +0 + + + +ladspa-tap-vibrato::latency +gfloat +[0,6300] +r +latency +latency. +6300 + + + +ladspa-stepMuxer::Crossfade-time +gfloat +[0,100] +rwx +Crossfade-time +Crossfade-time. +50 + + + +ladspa-flanger::Delay-base +gfloat +[0,1,25] +rwx +Delay-base +Delay-base. +6,325 + + + +ladspa-flanger::Feedback +gfloat +[-1,1] +rwx +Feedback +Feedback. +0 + + + +ladspa-flanger::LFO-frequency +gfloat +[0,05,100] +rwx +LFO-frequency +LFO-frequency. +0,33437 + + + +ladspa-flanger::Max-slowdown +gfloat +[0,10] +rwx +Max-slowdown +Max-slowdown. +2,5 + + + +ladspa-amp::Amps-gain +gfloat +[-70,70] +rwx +Amps-gain +Amps-gain. +0 + + + +ladspa-dahdsr-g+t-control::Abklingzeit +gfloat +>= 0 +rwx +Abklingzeit +Abklingzeit. +0 + + + +ladspa-dahdsr-g+t-control::Ausklingzeit +gfloat +>= 0 +rwx +Ausklingzeit +Ausklingzeit. +0 + + + +ladspa-dahdsr-g+t-control::Einschwingzeit +gfloat +>= 0 +rwx +Einschwingzeit +Einschwingzeit. +0 + + + +ladspa-dahdsr-g+t-control::Haltewert +gfloat +[0,1] +rwx +Haltewert +Haltewert. +1 + + + +ladspa-dahdsr-g+t-control::Haltezeit +gfloat +>= 0 +rwx +Haltezeit +Haltezeit. +0 + + + +ladspa-dahdsr-g+t-control::Verz--gerungszeit +gfloat +>= 0 +rwx +Verz--gerungszeit +Verz--gerungszeit. +0 + + + +ladspa-dahdsr-cg+t-control::Abklingzeit +gfloat +>= 0 +rwx +Abklingzeit +Abklingzeit. +0 + + + +ladspa-dahdsr-cg+t-control::Ausklingzeit +gfloat +>= 0 +rwx +Ausklingzeit +Ausklingzeit. +0 + + + +ladspa-dahdsr-cg+t-control::Ausl--ser +gboolean + +rwx +Ausl--ser +Ausl--ser. +FALSE + + + +ladspa-dahdsr-cg+t-control::Einschwingzeit +gfloat +>= 0 +rwx +Einschwingzeit +Einschwingzeit. +0 + + + +ladspa-dahdsr-cg+t-control::Gatter +gboolean + +rwx +Gatter +Gatter. +FALSE + + + +ladspa-dahdsr-cg+t-control::Haltewert +gfloat +[0,1] +rwx +Haltewert +Haltewert. +1 + + + +ladspa-dahdsr-cg+t-control::Haltezeit +gfloat +>= 0 +rwx +Haltezeit +Haltezeit. +0 + + + +ladspa-dahdsr-cg+t-control::Verz--gerungszeit +gfloat +>= 0 +rwx +Verz--gerungszeit +Verz--gerungszeit. +0 + + + +ladspa-Sync-Saw-VCO::Exp-FM-gain +gfloat +[0,4] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Sync-Saw-VCO::LP-filter +gfloat +[0,1] +rwx +LP-filter +LP-filter. +0,5 + + + +ladspa-Sync-Saw-VCO::Lin-FM-gain +gfloat +[0,4] +rwx +Lin-FM-gain +Lin-FM-gain. +0 + + + +ladspa-Sync-Saw-VCO::Octave +gint +[-4,4] +rwx +Octave +Octave. +0 + + + +ladspa-Sync-Saw-VCO::Tune +gfloat +[0,1] +rwx +Tune +Tune. +0 + + + +ladspa-Sync-Rect-VCO::Exp-FM-gain +gfloat +[0,4] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Sync-Rect-VCO::LP-filter +gfloat +[0,1] +rwx +LP-filter +LP-filter. +0,5 + + + +ladspa-Sync-Rect-VCO::Lin-FM-gain +gfloat +[0,4] +rwx +Lin-FM-gain +Lin-FM-gain. +0 + + + +ladspa-Sync-Rect-VCO::Octave +gint +[-4,4] +rwx +Octave +Octave. +0 + + + +ladspa-Sync-Rect-VCO::Tune +gfloat +[0,1] +rwx +Tune +Tune. +0 + + + +ladspa-Sync-Rect-VCO::WMod-gain +gfloat +[0,4] +rwx +WMod-gain +WMod-gain. +0 + + + +ladspa-Sync-Rect-VCO::Waveform +gfloat +[-1,1] +rwx +Waveform +Waveform. +0 + + + +ladspa-Sync-Tri-VCO::Exp-FM-gain +gfloat +[0,4] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Sync-Tri-VCO::LP-filter +gfloat +[0,1] +rwx +LP-filter +LP-filter. +0,5 + + + +ladspa-Sync-Tri-VCO::Lin-FM-gain +gfloat +[0,4] +rwx +Lin-FM-gain +Lin-FM-gain. +0 + + + +ladspa-Sync-Tri-VCO::Octave +gint +[-4,4] +rwx +Octave +Octave. +0 + + + +ladspa-Sync-Tri-VCO::Tune +gfloat +[0,1] +rwx +Tune +Tune. +0 + + + +ladspa-Sync-Tri-VCO::WMod-gain +gfloat +[0,4] +rwx +WMod-gain +WMod-gain. +0 + + + +ladspa-Sync-Tri-VCO::Waveform +gfloat +[-1,1] +rwx +Waveform +Waveform. +0 + + + +ladspa-bwxover-iir::Cutoff-Frequency +gfloat +[4,41,19845] +rwx +Cutoff-Frequency +Cutoff-Frequency. +36,1195 + + + +ladspa-bwxover-iir::Resonance +gfloat +[0,1,1,41] +rwx +Resonance +Resonance. +0,755 + + + +ladspa-buttlow-iir::Cutoff-Frequency +gfloat +[4,41,19845] +rwx +Cutoff-Frequency +Cutoff-Frequency. +36,1195 + + + +ladspa-buttlow-iir::Resonance +gfloat +[0,1,1,41] +rwx +Resonance +Resonance. +0,755 + + + +ladspa-butthigh-iir::Cutoff-Frequency +gfloat +[4,41,19845] +rwx +Cutoff-Frequency +Cutoff-Frequency. +36,1195 + + + +ladspa-butthigh-iir::Resonance +gfloat +[0,1,1,41] +rwx +Resonance +Resonance. +0,755 + + + +ladspa-Mvchpf-1::Exp-FM-gain +gfloat +[0,10] +rwx +Exp-FM-gain +Exp-FM-gain. +0 + + + +ladspa-Mvchpf-1::Frequency +gfloat +[-6,6] +rwx +Frequency +Frequency. +0 + + + +ladspa-Mvchpf-1::Input-gain +gfloat +[-60,10] +rwx +Input-gain +Input-gain. +0 + + + +ladspa-Mvchpf-1::Output-gain +gfloat +[-15,15] +rwx +Output-gain +Output-gain. +0 + + + +ladspa-tracker-gaacdcia-oa::Attack-Rate +gfloat +[0,91875,22050] +rwx +Attack-Rate +Attack-Rate. +100 + + + +ladspa-tracker-gaacdcia-oa::Attack-Rate-1 +gfloat +[0,91875,22050] +rwx +Attack-Rate-1 +Attack-Rate-1. +100 + + + +ladspa-tracker-gaacdcia-oa::Decay-Rate +gfloat +[0,91875,22050] +rwx +Decay-Rate +Decay-Rate. +100 + + + +ladspa-tracker-gaacdcia-oa::Decay-Rate-1 +gfloat +[0,91875,22050] +rwx +Decay-Rate-1 +Decay-Rate-1. +100 + + + +ladspa-tap-doubler::Dry-Left-Position +gfloat +[0,1] +rwx +Dry-Left-Position +Dry-Left-Position. +0 + + + +ladspa-tap-doubler::Dry-Level--dB- +gfloat +[-90,20] +rwx +Dry-Level--dB- +Dry-Level--dB-. +0 + + + +ladspa-tap-doubler::Dry-Right-Position +gfloat +[0,1] +rwx +Dry-Right-Position +Dry-Right-Position. +1 + + + +ladspa-tap-doubler::Pitch-Tracking +gfloat +[0,1] +rwx +Pitch-Tracking +Pitch-Tracking. +0,5 + + + +ladspa-tap-doubler::Time-Tracking +gfloat +[0,1] +rwx +Time-Tracking +Time-Tracking. +0,5 + + + +ladspa-tap-doubler::Wet-Left-Position +gfloat +[0,1] +rwx +Wet-Left-Position +Wet-Left-Position. +0 + + + +ladspa-tap-doubler::Wet-Level--dB- +gfloat +[-90,20] +rwx +Wet-Level--dB- +Wet-Level--dB-. +0 + + + +ladspa-tap-doubler::Wet-Right-Position +gfloat +[0,1] +rwx +Wet-Right-Position +Wet-Right-Position. +1 + + + +ladspa-amp-gcia-oa::Verst--rkung +gfloat +[-96,96] +rwx +Verst--rkung +Verst--rkung. +-96 + + + +ladspa-sequencer16::Closed-Gate-Value +gfloat + +rwx +Closed-Gate-Value +Closed-Gate-Value. +-3,40282e+38 + + + +ladspa-sequencer16::Loop-Steps +gint +[1,16] +rwx +Loop-Steps +Loop-Steps. +16 + + + +ladspa-sequencer16::Reset-to-Value-on-Gate-Close- +gint +[0,1] +rwx +Reset-to-Value-on-Gate-Close- +Reset-to-Value-on-Gate-Close-. +0 + + + +ladspa-sequencer16::Value-Step-0 +gfloat + +rwx +Value-Step-0 +Value-Step-0. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-1 +gfloat + +rwx +Value-Step-1 +Value-Step-1. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-10 +gfloat + +rwx +Value-Step-10 +Value-Step-10. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-11 +gfloat + +rwx +Value-Step-11 +Value-Step-11. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-12 +gfloat + +rwx +Value-Step-12 +Value-Step-12. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-13 +gfloat + +rwx +Value-Step-13 +Value-Step-13. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-14 +gfloat + +rwx +Value-Step-14 +Value-Step-14. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-15 +gfloat + +rwx +Value-Step-15 +Value-Step-15. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-2 +gfloat + +rwx +Value-Step-2 +Value-Step-2. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-3 +gfloat + +rwx +Value-Step-3 +Value-Step-3. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-4 +gfloat + +rwx +Value-Step-4 +Value-Step-4. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-5 +gfloat + +rwx +Value-Step-5 +Value-Step-5. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-6 +gfloat + +rwx +Value-Step-6 +Value-Step-6. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-7 +gfloat + +rwx +Value-Step-7 +Value-Step-7. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-8 +gfloat + +rwx +Value-Step-8 +Value-Step-8. +-3,40282e+38 + + + +ladspa-sequencer16::Value-Step-9 +gfloat + +rwx +Value-Step-9 +Value-Step-9. +-3,40282e+38 + + + +ladspa-sc2::Attack-time +gfloat +[2,400] +rwx +Attack-time +Attack-time. +101,5 + + + +ladspa-sc2::Knee-radius +gfloat +[1,10] +rwx +Knee-radius +Knee-radius. +3,25 + + + +ladspa-sc2::Makeup-gain +gfloat +[0,24] +rwx +Makeup-gain +Makeup-gain. +0 + + + +ladspa-sc2::Ratio +gfloat +[1,10] +rwx +Ratio +Ratio. +1 + + + +ladspa-sc2::Release-time +gfloat +[2,800] +rwx +Release-time +Release-time. +401 + + + +ladspa-sc2::Threshold-level +gfloat +[-30,0] +rwx +Threshold-level +Threshold-level. +0 + + + +ladspa-dysonCompress::Compression-ratio +gfloat +[0,1] +rwx +Compression-ratio +Compression-ratio. +0,5 + + + +ladspa-dysonCompress::Fast-compression-ratio +gfloat +[0,1] +rwx +Fast-compression-ratio +Fast-compression-ratio. +0,5 + + + +ladspa-dysonCompress::Peak-limit +gfloat +[-30,0] +rwx +Peak-limit +Peak-limit. +0 + + + +ladspa-dysonCompress::Release-time +gfloat +[0,1] +rwx +Release-time +Release-time. +0,25 + + + +ladspa-decay::Decay-Time +gfloat +>= 0 +rwx +Decay-Time +Decay-Time. +0 + + + +ladspa-alias::Aliasing-level +gfloat +[0,1] +rwx +Aliasing-level +Aliasing-level. +0 + + + +ladspa-SooperLooper::Cycle-Length-Out +gfloat +>= 0 +r +Cycle-Length-Out +Cycle-Length-Out. +0 + + + +ladspa-SooperLooper::Dry-Level +gfloat +[0,1] +rwx +Dry-Level +Dry-Level. +0 + + + +ladspa-SooperLooper::Feedback +gfloat +[0,1] +rwx +Feedback +Feedback. +0 + + + +ladspa-SooperLooper::Free-Sample-Mem +gfloat +>= 0 +r +Free-Sample-Mem +Free-Sample-Mem. +0 + + + +ladspa-SooperLooper::Loop-Length-Out +gfloat +>= 0 +r +Loop-Length-Out +Loop-Length-Out. +0 + + + +ladspa-SooperLooper::Loop-Position-Out +gfloat +>= 0 +r +Loop-Position-Out +Loop-Position-Out. +0 + + + +ladspa-SooperLooper::Multi-Control +gint +[0,127] +rwx +Multi-Control +Multi-Control. +0 + + + +ladspa-SooperLooper::MultiCtrl-10s +gint +[0,12] +rwx +MultiCtrl-10s +MultiCtrl-10s. +0 + + + +ladspa-SooperLooper::QuantizeMode +gint +<= G_MININT +rwx +QuantizeMode +QuantizeMode. +-2147483648 + + + +ladspa-SooperLooper::Rate +gfloat +[-4,4] +rwx +Rate +Rate. +-4 + + + +ladspa-SooperLooper::RedoTapMode +gint +<= G_MININT +rwx +RedoTapMode +RedoTapMode. +-2147483648 + + + +ladspa-SooperLooper::RoundMode +gint +<= G_MININT +rwx +RoundMode +RoundMode. +-2147483648 + + + +ladspa-SooperLooper::Scratch-Destination +gfloat +[0,1] +rwx +Scratch-Destination +Scratch-Destination. +0 + + + +ladspa-SooperLooper::State-Output +gfloat + +r +State-Output +State-Output. +-3,40282e+38 + + + +ladspa-SooperLooper::Tap-Delay-Trigger +gfloat +[0,1] +rwx +Tap-Delay-Trigger +Tap-Delay-Trigger. +0 + + + +ladspa-SooperLooper::Total-Sample-Mem +gfloat +>= 0 +r +Total-Sample-Mem +Total-Sample-Mem. +0 + + + +ladspa-SooperLooper::Trigger-Threshold +gfloat +[0,1] +rwx +Trigger-Threshold +Trigger-Threshold. +0 + + + +ladspa-SooperLooper::Wet-Level +gfloat +[0,1] +rwx +Wet-Level +Wet-Level. +0 + + + +ladspa-vlevel-mono::Current-Multiplier +gfloat +[0,20] +r +Current-Multiplier +Current-Multiplier. +0 + + + +ladspa-vlevel-mono::Look-ahead +gfloat +[0,5] +rwx +Look-ahead +Look-ahead. +2,5 + + + +ladspa-vlevel-mono::Maximum-Multiplier +gfloat +[0,20] +rwx +Maximum-Multiplier +Maximum-Multiplier. +10 + + + +ladspa-vlevel-mono::Strength +gfloat +[0,1] +rwx +Strength +Strength. +0,75 + + + +ladspa-vlevel-mono::Undo +gboolean + +rwx +Undo +Undo. +FALSE + + + +ladspa-vlevel-mono::Use-Maximum-Multiplier +gboolean + +rwx +Use-Maximum-Multiplier +Use-Maximum-Multiplier. +FALSE + + + +ladspa-vlevel-stereo::Current-Multiplier +gfloat +[0,20] +r +Current-Multiplier +Current-Multiplier. +0 + + + +ladspa-vlevel-stereo::Look-ahead +gfloat +[0,5] +rwx +Look-ahead +Look-ahead. +2,5 + + + +ladspa-vlevel-stereo::Maximum-Multiplier +gfloat +[0,20] +rwx +Maximum-Multiplier +Maximum-Multiplier. +10 + + + +ladspa-vlevel-stereo::Strength +gfloat +[0,1] +rwx +Strength +Strength. +0,75 + + + +ladspa-vlevel-stereo::Undo +gboolean + +rwx +Undo +Undo. +FALSE + + + +ladspa-vlevel-stereo::Use-Maximum-Multiplier +gboolean + +rwx +Use-Maximum-Multiplier +Use-Maximum-Multiplier. +FALSE + + + +ladspa-artificialLatency::Delay +gfloat +[0,10000] +rwx +Delay +Delay. +2500 + + + +ladspa-artificialLatency::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-triplePara::Band-1-bandwidth +gfloat +[0,4] +rwx +Band-1-bandwidth +Band-1-bandwidth. +1 + + + +ladspa-triplePara::Band-1-frequency +gfloat +[4,41,21609] +rwx +Band-1-frequency +Band-1-frequency. +36,8967 + + + +ladspa-triplePara::Band-1-gain +gfloat +[-70,30] +rwx +Band-1-gain +Band-1-gain. +0 + + + +ladspa-triplePara::Band-2-bandwidth +gfloat +[0,4] +rwx +Band-2-bandwidth +Band-2-bandwidth. +1 + + + +ladspa-triplePara::Band-2-frequency +gfloat +[4,41,21609] +rwx +Band-2-frequency +Band-2-frequency. +308,7 + + + +ladspa-triplePara::Band-2-gain +gfloat +[-70,30] +rwx +Band-2-gain +Band-2-gain. +0 + + + +ladspa-triplePara::Band-3-bandwidth +gfloat +[0,4] +rwx +Band-3-bandwidth +Band-3-bandwidth. +1 + + + +ladspa-triplePara::Band-3-frequency +gfloat +[4,41,21609] +rwx +Band-3-frequency +Band-3-frequency. +2582,77 + + + +ladspa-triplePara::Band-3-gain +gfloat +[-70,30] +rwx +Band-3-gain +Band-3-gain. +0 + + + +ladspa-triplePara::High-shelving-frequency +gfloat +[4,41,21609] +rwx +High-shelving-frequency +High-shelving-frequency. +21609 + + + +ladspa-triplePara::High-shelving-gain +gfloat +[-70,30] +rwx +High-shelving-gain +High-shelving-gain. +0 + + + +ladspa-triplePara::High-shelving-slope +gfloat +[0,1] +rwx +High-shelving-slope +High-shelving-slope. +0,5 + + + +ladspa-triplePara::Low-shelving-frequency +gfloat +[4,41,21609] +rwx +Low-shelving-frequency +Low-shelving-frequency. +4,41 + + + +ladspa-triplePara::Low-shelving-gain +gfloat +[-70,30] +rwx +Low-shelving-gain +Low-shelving-gain. +0 + + + +ladspa-triplePara::Low-shelving-slope +gfloat +[0,1] +rwx +Low-shelving-slope +Low-shelving-slope. +0,5 + + + +ladspa-revdelay::Crossfade-samples +gint +[0,5000] +rwx +Crossfade-samples +Crossfade-samples. +1250 + + + +ladspa-revdelay::Delay-Time +gfloat +[0,5] +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-revdelay::Dry-Level +gfloat +[-70,0] +rwx +Dry-Level +Dry-Level. +0 + + + +ladspa-revdelay::Feedback +gfloat +[0,1] +rwx +Feedback +Feedback. +0 + + + +ladspa-revdelay::Wet-Level +gfloat +[-70,0] +rwx +Wet-Level +Wet-Level. +0 + + + +ladspa-tap-equalizer::Band-1-Freq--Hz- +gfloat +[40,280] +rwx +Band-1-Freq--Hz- +Band-1-Freq--Hz-. +100 + + + +ladspa-tap-equalizer::Band-1-Gain--dB- +gfloat +[-50,20] +rwx +Band-1-Gain--dB- +Band-1-Gain--dB-. +0 + + + +ladspa-tap-equalizer::Band-2-Freq--Hz- +gfloat +[100,500] +rwx +Band-2-Freq--Hz- +Band-2-Freq--Hz-. +200 + + + +ladspa-tap-equalizer::Band-2-Gain--dB- +gfloat +[-50,20] +rwx +Band-2-Gain--dB- +Band-2-Gain--dB-. +0 + + + +ladspa-tap-equalizer::Band-3-Freq--Hz- +gfloat +[200,1000] +rwx +Band-3-Freq--Hz- +Band-3-Freq--Hz-. +400 + + + +ladspa-tap-equalizer::Band-3-Gain--dB- +gfloat +[-50,20] +rwx +Band-3-Gain--dB- +Band-3-Gain--dB-. +0 + + + +ladspa-tap-equalizer::Band-4-Freq--Hz- +gfloat +[400,2800] +rwx +Band-4-Freq--Hz- +Band-4-Freq--Hz-. +1000 + + + +ladspa-tap-equalizer::Band-4-Gain--dB- +gfloat +[-50,20] +rwx +Band-4-Gain--dB- +Band-4-Gain--dB-. +0 + + + +ladspa-tap-equalizer::Band-5-Freq--Hz- +gfloat +[1000,5000] +rwx +Band-5-Freq--Hz- +Band-5-Freq--Hz-. +3000 + + + +ladspa-tap-equalizer::Band-5-Gain--dB- +gfloat +[-50,20] +rwx +Band-5-Gain--dB- +Band-5-Gain--dB-. +0 + + + +ladspa-tap-equalizer::Band-6-Freq--Hz- +gfloat +[3000,9000] +rwx +Band-6-Freq--Hz- +Band-6-Freq--Hz-. +6000 + + + +ladspa-tap-equalizer::Band-6-Gain--dB- +gfloat +[-50,20] +rwx +Band-6-Gain--dB- +Band-6-Gain--dB-. +0 + + + +ladspa-tap-equalizer::Band-7-Freq--Hz- +gfloat +[6000,18000] +rwx +Band-7-Freq--Hz- +Band-7-Freq--Hz-. +12000 + + + +ladspa-tap-equalizer::Band-7-Gain--dB- +gfloat +[-50,20] +rwx +Band-7-Gain--dB- +Band-7-Gain--dB-. +0 + + + +ladspa-tap-equalizer::Band-8-Freq--Hz- +gfloat +[10000,20000] +rwx +Band-8-Freq--Hz- +Band-8-Freq--Hz-. +15000 + + + +ladspa-tap-equalizer::Band-8-Gain--dB- +gfloat +[-50,20] +rwx +Band-8-Gain--dB- +Band-8-Gain--dB-. +0 + + + +ladspa-retroFlange::Average-stall +gfloat +[0,10] +rwx +Average-stall +Average-stall. +2,5 + + + +ladspa-retroFlange::Flange-frequency +gfloat +[0,5,8] +rwx +Flange-frequency +Flange-frequency. +1 + + + +ladspa-Ambisonics-mono-panner::Azimuth +gfloat +[-180,180] +rwx +Azimuth +Azimuth. +0 + + + +ladspa-Ambisonics-mono-panner::Elevation +gfloat +[-90,90] +rwx +Elevation +Elevation. +0 + + + +ladspa-Ambisonics-stero-panner::Azimuth +gfloat +[-180,180] +rwx +Azimuth +Azimuth. +0 + + + +ladspa-Ambisonics-stero-panner::Elevation +gfloat +[-90,90] +rwx +Elevation +Elevation. +0 + + + +ladspa-Ambisonics-stero-panner::Width +gfloat +[-90,90] +rwx +Width +Width. +90 + + + +ladspa-Ambisonics-rotator::Angle +gfloat +[-180,180] +rwx +Angle +Angle. +0 + + + +ladspa-Ambisonics-square-decoder::Distance +gfloat +[1,30] +rwx +Distance +Distance. +30 + + + +ladspa-Ambisonics-square-decoder::Front +gboolean + +rwx +Front +Front. +FALSE + + + +ladspa-Ambisonics-square-decoder::LF-ratio +gfloat +[1,2] +rwx +LF-ratio +LF-ratio. +1 + + + +ladspa-Ambisonics-hexagon-decoder::Distance +gfloat +[1,30] +rwx +Distance +Distance. +30 + + + +ladspa-Ambisonics-hexagon-decoder::Front +gboolean + +rwx +Front +Front. +FALSE + + + +ladspa-Ambisonics-hexagon-decoder::LF-ratio +gfloat +[1,2] +rwx +LF-ratio +LF-ratio. +1 + + + +ladspa-G2reverb::Damping +gfloat +[0,1] +rwx +Damping +Damping. +0 + + + +ladspa-G2reverb::Dry-sound +gfloat +[-80,0] +rwx +Dry-sound +Dry-sound. +-80 + + + +ladspa-G2reverb::Input-BW +gfloat +[0,1] +rwx +Input-BW +Input-BW. +0 + + + +ladspa-G2reverb::Reflections +gfloat +[-80,0] +rwx +Reflections +Reflections. +-80 + + + +ladspa-G2reverb::Reverb-tail +gfloat +[-80,0] +rwx +Reverb-tail +Reverb-tail. +-80 + + + +ladspa-G2reverb::Reverb-time +gfloat +[1,20] +rwx +Reverb-time +Reverb-time. +1 + + + +ladspa-G2reverb::Room-size +gfloat +[10,150] +rwx +Room-size +Room-size. +10 + + + +ladspa-amPitchshift::Buffer-size +gint +[1,7] +rwx +Buffer-size +Buffer-size. +4 + + + +ladspa-amPitchshift::Pitch-shift +gfloat +[0,25,4] +rwx +Pitch-shift +Pitch-shift. +1 + + + +ladspa-amPitchshift::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-modDelay::Base-delay +gfloat +[0,1] +rwx +Base-delay +Base-delay. +1 + + + +ladspa-tap-autopan::Depth---- +gfloat +[0,100] +rwx +Depth---- +Depth----. +0 + + + +ladspa-tap-autopan::Frequency--Hz- +gfloat +[0,20] +rwx +Frequency--Hz- +Frequency--Hz-. +0 + + + +ladspa-tap-autopan::Gain--dB- +gfloat +[-70,20] +rwx +Gain--dB- +Gain--dB-. +0 + + + +ladspa-rateShifter::Rate +gfloat +[-4,4] +rwx +Rate +Rate. +1 + + + +ladspa-Filter::Frequency +gfloat +[10,20000] +rwx +Frequency +Frequency. +10 + + + +ladspa-Filter::Inertia +gfloat +[5,100] +rwx +Inertia +Inertia. +5 + + + +ladspa-Filter::Mode +gint +[0,5] +rwx +Mode +Mode. +0 + + + +ladspa-Filter::Resonance +gfloat +[0,707,20] +rwx +Resonance +Resonance. +0,707 + + + +ladspa-Flanger::Amount +gfloat +[0,2] +rwx +Amount +Amount. +0 + + + +ladspa-Flanger::Feedback +gfloat +[-0,99,0,99] +rwx +Feedback +Feedback. +-0,99 + + + +ladspa-Flanger::Minimum-delay +gfloat +[0,1,10] +rwx +Minimum-delay +Minimum-delay. +0,1 + + + +ladspa-Flanger::Modulation-depth +gfloat +[0,1,10] +rwx +Modulation-depth +Modulation-depth. +0,1 + + + +ladspa-Flanger::Modulation-rate +gfloat +[0,01,20] +rwx +Modulation-rate +Modulation-rate. +0,01 + + + +ladspa-Flanger::Reset +gboolean + +rwx +Reset +Reset. +FALSE + + + +ladspa-Flanger::Stereo-phase +gfloat +[0,360] +rwx +Stereo-phase +Stereo-phase. +0 + + + +ladspa-Reverb::Amount +gfloat +[0,2] +rwx +Amount +Amount. +0 + + + +ladspa-Reverb::Decay-time +gfloat +[0,5,15] +rwx +Decay-time +Decay-time. +0,5 + + + +ladspa-Reverb::Diffusion +gfloat +[0,1] +rwx +Diffusion +Diffusion. +0 + + + +ladspa-Reverb::High-Frq-Damp +gfloat +[2000,20000] +rwx +High-Frq-Damp +High-Frq-Damp. +2000 + + + +ladspa-Reverb::Room-size +gint +[0,3] +rwx +Room-size +Room-size. +0 + + + +ladspa-VintageDelay::Amount +gfloat +[0,2] +rwx +Amount +Amount. +0 + + + +ladspa-VintageDelay::Feedback +gfloat +[0,1] +rwx +Feedback +Feedback. +0 + + + +ladspa-VintageDelay::Medium +gint +[0,2] +rwx +Medium +Medium. +0 + + + +ladspa-VintageDelay::Mix-mode +gint +[0,1] +rwx +Mix-mode +Mix-mode. +0 + + + +ladspa-VintageDelay::Subdivide +gint +[1,16] +rwx +Subdivide +Subdivide. +1 + + + +ladspa-VintageDelay::Tempo +gfloat +[30,300] +rwx +Tempo +Tempo. +30 + + + +ladspa-VintageDelay::Time-L +gint +[1,16] +rwx +Time-L +Time-L. +1 + + + +ladspa-VintageDelay::Time-R +gint +[1,16] +rwx +Time-R +Time-R. +1 + + + +ladspa-RotarySpeaker::Speed-Mode +gint +[0,4] +rwx +Speed-Mode +Speed-Mode. +0 + + + +ladspa-RotarySpeaker::Tap-Offset +gfloat +[0,1] +rwx +Tap-Offset +Tap-Offset. +0 + + + +ladspa-RotarySpeaker::Tap-Spacing +gfloat +[0,1] +rwx +Tap-Spacing +Tap-Spacing. +0 + + + +ladspa-phaser::Amount +gfloat +[0,2] +rwx +Amount +Amount. +0 + + + +ladspa-phaser::Center-Freq +gfloat +[20,20000] +rwx +Center-Freq +Center-Freq. +20 + + + +ladspa-phaser::Feedback +gfloat +[-0,99,0,99] +rwx +Feedback +Feedback. +-0,99 + + + +ladspa-phaser::Modulation-depth +gfloat +[0,10800] +rwx +Modulation-depth +Modulation-depth. +0 + + + +ladspa-phaser::Modulation-rate +gfloat +[0,01,20] +rwx +Modulation-rate +Modulation-rate. +0,01 + + + +ladspa-phaser::Reset +gboolean + +rwx +Reset +Reset. +FALSE + + + +ladspa-phaser::Stereo-phase +gfloat +[0,360] +rwx +Stereo-phase +Stereo-phase. +0 + + + +ladspa-phaser::param---Stages +gint +[1,12] +rwx +param---Stages +param---Stages. +1 + + + +ladspa-Eq::param-1-kHz +gfloat +[-48,24] +rwx +param-1-kHz +param-1-kHz. +0 + + + +ladspa-Eq::param-125-Hz +gfloat +[-48,24] +rwx +param-125-Hz +param-125-Hz. +0 + + + +ladspa-Eq::param-16-kHz +gfloat +[-48,24] +rwx +param-16-kHz +param-16-kHz. +0 + + + +ladspa-Eq::param-2-kHz +gfloat +[-48,24] +rwx +param-2-kHz +param-2-kHz. +0 + + + +ladspa-Eq::param-250-Hz +gfloat +[-48,24] +rwx +param-250-Hz +param-250-Hz. +0 + + + +ladspa-Eq::param-31-Hz +gfloat +[-48,24] +rwx +param-31-Hz +param-31-Hz. +-30 + + + +ladspa-Eq::param-4-kHz +gfloat +[-48,24] +rwx +param-4-kHz +param-4-kHz. +0 + + + +ladspa-Eq::param-500-Hz +gfloat +[-48,24] +rwx +param-500-Hz +param-500-Hz. +0 + + + +ladspa-Eq::param-63-Hz +gfloat +[-48,24] +rwx +param-63-Hz +param-63-Hz. +0 + + + +ladspa-Eq::param-8-kHz +gfloat +[-48,24] +rwx +param-8-kHz +param-8-kHz. +0 + + + +ladspa-Eq2x2::param-1-kHz +gfloat +[-48,24] +rwx +param-1-kHz +param-1-kHz. +0 + + + +ladspa-Eq2x2::param-125-Hz +gfloat +[-48,24] +rwx +param-125-Hz +param-125-Hz. +0 + + + +ladspa-Eq2x2::param-16-kHz +gfloat +[-48,24] +rwx +param-16-kHz +param-16-kHz. +0 + + + +ladspa-Eq2x2::param-2-kHz +gfloat +[-48,24] +rwx +param-2-kHz +param-2-kHz. +0 + + + +ladspa-Eq2x2::param-250-Hz +gfloat +[-48,24] +rwx +param-250-Hz +param-250-Hz. +0 + + + +ladspa-Eq2x2::param-31-Hz +gfloat +[-48,24] +rwx +param-31-Hz +param-31-Hz. +0 + + + +ladspa-Eq2x2::param-4-kHz +gfloat +[-48,24] +rwx +param-4-kHz +param-4-kHz. +0 + + + +ladspa-Eq2x2::param-500-Hz +gfloat +[-48,24] +rwx +param-500-Hz +param-500-Hz. +0 + + + +ladspa-Eq2x2::param-63-Hz +gfloat +[-48,24] +rwx +param-63-Hz +param-63-Hz. +0 + + + +ladspa-Eq2x2::param-8-kHz +gfloat +[-48,24] +rwx +param-8-kHz +param-8-kHz. +0 + + + +ladspa-Compress::attack +gfloat +[0,001,1] +rwx +attack +attack. +0,001 + + + +ladspa-Compress::gain +gfloat +[0,24] +rwx +gain +gain. +6 + + + +ladspa-Compress::knee-radius +gfloat +[1,10] +rwx +knee-radius +knee-radius. +3,25 + + + +ladspa-Compress::ratio +gfloat +[1,10] +rwx +ratio +ratio. +1 + + + +ladspa-Compress::release +gfloat +[0,001,1] +rwx +release +release. +0,5005 + + + +ladspa-Compress::threshold +gfloat +[-30,400] +rwx +threshold +threshold. +0 + + + +ladspa-Pan::mono +gboolean + +rwx +mono +mono. +FALSE + + + +ladspa-Pan::pan +gfloat +[-1,1] +rwx +pan +pan. +0 + + + +ladspa-Pan::t +gfloat +[0,1,40] +rwx +t +t. +10,075 + + + +ladspa-Pan::width +gfloat +[0,1] +rwx +width +width. +0 + + + +ladspa-PreampIII::gain +gfloat +[0,10] +rwx +gain +gain. +1 + + + +ladspa-PreampIII::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-PreampIII::temperature +gfloat +[0,005,1] +rwx +temperature +temperature. +0,25375 + + + +ladspa-PreampIV::bass +gfloat +[-20,20] +rwx +bass +bass. +0 + + + +ladspa-PreampIV::gain +gfloat +[0,10] +rwx +gain +gain. +1 + + + +ladspa-PreampIV::hi +gfloat +[-20,20] +rwx +hi +hi. +0 + + + +ladspa-PreampIV::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-PreampIV::mid +gfloat +[-20,20] +rwx +mid +mid. +0 + + + +ladspa-PreampIV::temperature +gfloat +[0,005,1] +rwx +temperature +temperature. +0,5025 + + + +ladspa-PreampIV::treble +gfloat +[-20,20] +rwx +treble +treble. +0 + + + +ladspa-ToneStack::bass +gfloat +[0,1] +rwx +bass +bass. +0,5 + + + +ladspa-ToneStack::mid +gfloat +[0,1] +rwx +mid +mid. +0,5 + + + +ladspa-ToneStack::model +gint +[0,5] +rwx +model +model. +0 + + + +ladspa-ToneStack::treble +gfloat +[0,1] +rwx +treble +treble. +0,5 + + + +ladspa-ToneStackLT::bass +gfloat +[0,1] +rwx +bass +bass. +0,5 + + + +ladspa-ToneStackLT::mid +gfloat +[0,1] +rwx +mid +mid. +0,5 + + + +ladspa-ToneStackLT::treble +gfloat +[0,1] +rwx +treble +treble. +0,5 + + + +ladspa-AmpIII::drive +gfloat +[0,0001,1] +rwx +drive +drive. +1 + + + +ladspa-AmpIII::gain +gfloat +[0,10] +rwx +gain +gain. +1 + + + +ladspa-AmpIII::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-AmpIII::temperature +gfloat +[0,005,1] +rwx +temperature +temperature. +0,5025 + + + +ladspa-AmpIV::bass +gfloat +[-20,20] +rwx +bass +bass. +0 + + + +ladspa-AmpIV::drive +gfloat +[0,0001,1] +rwx +drive +drive. +1 + + + +ladspa-AmpIV::gain +gfloat +[0,10] +rwx +gain +gain. +1 + + + +ladspa-AmpIV::hi +gfloat +[-20,20] +rwx +hi +hi. +0 + + + +ladspa-AmpIV::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-AmpIV::mid +gfloat +[-20,20] +rwx +mid +mid. +0 + + + +ladspa-AmpIV::temperature +gfloat +[0,005,1] +rwx +temperature +temperature. +0,5025 + + + +ladspa-AmpIV::treble +gfloat +[-20,20] +rwx +treble +treble. +0 + + + +ladspa-AmpV::bass +gfloat +[-9,9] +rwx +bass +bass. +0 + + + +ladspa-AmpV::drive +gfloat +[0,0001,1] +rwx +drive +drive. +0,750025 + + + +ladspa-AmpV::gain +gfloat +[0,3] +rwx +gain +gain. +1 + + + +ladspa-AmpV::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-AmpV::tone +gfloat +[0,1] +rwx +tone +tone. +0 + + + +ladspa-AmpV::watts +gfloat +[5,150] +rwx +watts +watts. +77,5 + + + +ladspa-AmpVTS::bass +gfloat +[0,1] +rwx +bass +bass. +0,5 + + + +ladspa-AmpVTS::drive +gfloat +[0,0001,1] +rwx +drive +drive. +0,250075 + + + +ladspa-AmpVTS::gain +gfloat +[0,3] +rwx +gain +gain. +2,25 + + + +ladspa-AmpVTS::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-AmpVTS::mid +gfloat +[0,1] +rwx +mid +mid. +1 + + + +ladspa-AmpVTS::model +gint +[0,5] +rwx +model +model. +0 + + + +ladspa-AmpVTS::treble +gfloat +[0,1] +rwx +treble +treble. +0,75 + + + +ladspa-AmpVTS::watts +gfloat +[0,0001,1] +rwx +watts +watts. +0,750025 + + + +ladspa-CabinetI::gain +gfloat +[-24,24] +rwx +gain +gain. +0 + + + +ladspa-CabinetI::model +gint +[0,5] +rwx +model +model. +1 + + + +ladspa-CabinetII::gain +gfloat +[-24,24] +rwx +gain +gain. +0 + + + +ladspa-CabinetII::model +gint +[0,5] +rwx +model +model. +1 + + + +ladspa-Clip::gain +gfloat +[-72,72] +rwx +gain +gain. +1 + + + +ladspa-Clip::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-ChorusI::blend +gfloat +[0,1] +rwx +blend +blend. +1 + + + +ladspa-ChorusI::feedback +gfloat +[0,1] +rwx +feedback +feedback. +0 + + + +ladspa-ChorusI::feedforward +gfloat +[0,1] +rwx +feedforward +feedforward. +0,25 + + + +ladspa-ChorusI::rate +gfloat +[0,5] +rwx +rate +rate. +1,25 + + + +ladspa-ChorusI::t +gfloat +[2,5,40] +rwx +t +t. +5 + + + +ladspa-ChorusI::width +gfloat +[0,5,10] +rwx +width +width. +1 + + + +ladspa-StereoChorusI::blend +gfloat +[0,1] +rwx +blend +blend. +1 + + + +ladspa-StereoChorusI::feedback +gfloat +[0,1] +rwx +feedback +feedback. +0 + + + +ladspa-StereoChorusI::feedforward +gfloat +[0,1] +rwx +feedforward +feedforward. +0,25 + + + +ladspa-StereoChorusI::phase +gfloat +[0,1] +rwx +phase +phase. +1 + + + +ladspa-StereoChorusI::rate +gfloat +[0,5] +rwx +rate +rate. +1,25 + + + +ladspa-StereoChorusI::t +gfloat +[2,5,40] +rwx +t +t. +2,5 + + + +ladspa-StereoChorusI::width +gfloat +[0,5,10] +rwx +width +width. +1 + + + +ladspa-ChorusII::blend +gfloat +[0,1] +rwx +blend +blend. +1 + + + +ladspa-ChorusII::feedback +gfloat +[0,1] +rwx +feedback +feedback. +0 + + + +ladspa-ChorusII::feedforward +gfloat +[0,1] +rwx +feedforward +feedforward. +0,25 + + + +ladspa-ChorusII::rate +gfloat +[0,1] +rwx +rate +rate. +0,25 + + + +ladspa-ChorusII::t +gfloat +[2,5,40] +rwx +t +t. +5 + + + +ladspa-ChorusII::width +gfloat +[0,5,10] +rwx +width +width. +1 + + + +ladspa-StereoChorusII::blend +gfloat +[0,1] +rwx +blend +blend. +1 + + + +ladspa-StereoChorusII::feedback +gfloat +[0,1] +rwx +feedback +feedback. +0 + + + +ladspa-StereoChorusII::feedforward +gfloat +[0,1] +rwx +feedforward +feedforward. +0,5 + + + +ladspa-StereoChorusII::rate +gfloat +[0,1] +rwx +rate +rate. +0,25 + + + +ladspa-StereoChorusII::t +gfloat +[2,5,40] +rwx +t +t. +11,875 + + + +ladspa-StereoChorusII::width +gfloat +[0,5,10] +rwx +width +width. +2,875 + + + +ladspa-PhaserI::depth +gfloat +[0,1] +rwx +depth +depth. +0,75 + + + +ladspa-PhaserI::feedback +gfloat +[0,0,999] +rwx +feedback +feedback. +0,74925 + + + +ladspa-PhaserI::rate +gfloat +[0,10] +rwx +rate +rate. +1 + + + +ladspa-PhaserI::spread +gfloat +[0,3,14159] +rwx +spread +spread. +0,785398 + + + +ladspa-PhaserII::depth +gfloat +[0,1] +rwx +depth +depth. +0,75 + + + +ladspa-PhaserII::feedback +gfloat +[0,0,999] +rwx +feedback +feedback. +0,74925 + + + +ladspa-PhaserII::rate +gfloat +[0,1] +rwx +rate +rate. +0,25 + + + +ladspa-PhaserII::spread +gfloat +[0,1,5708] +rwx +spread +spread. +0,392699 + + + +ladspa-SweepVFI::Q +gfloat +[0,001,0,999] +rwx +Q +Q. +0,5 + + + +ladspa-SweepVFI::depth-x +gfloat +[0,1] +rwx +depth-x +depth-x. +0,25 + + + +ladspa-SweepVFI::depth-y +gfloat +[0,1] +rwx +depth-y +depth-y. +0,5 + + + +ladspa-SweepVFI::depth-z +gfloat +[0,1] +rwx +depth-z +depth-z. +1 + + + +ladspa-SweepVFI::f +gfloat +[83,3383] +rwx +f +f. +209,717 + + + +ladspa-SweepVFI::h +gfloat +[0,001,1] +rwx +h +h. +0,25075 + + + +ladspa-SweepVFI::mode +gint +[0,1] +rwx +mode +mode. +1 + + + +ladspa-SweepVFII::Q +gfloat +[0,001,0,999] +rwx +Q +Q. +0,5 + + + +ladspa-SweepVFII::Q-depth-x +gfloat +[0,1] +rwx +Q-depth-x +Q-depth-x. +0,25 + + + +ladspa-SweepVFII::Q-depth-y +gfloat +[0,1] +rwx +Q-depth-y +Q-depth-y. +0,5 + + + +ladspa-SweepVFII::Q-depth-z +gfloat +[0,1] +rwx +Q-depth-z +Q-depth-z. +1 + + + +ladspa-SweepVFII::Q-h +gfloat +[0,001,1] +rwx +Q-h +Q-h. +0,25075 + + + +ladspa-SweepVFII::f +gfloat +[83,3383] +rwx +f +f. +209,717 + + + +ladspa-SweepVFII::f-depth-x +gfloat +[0,1] +rwx +f-depth-x +f-depth-x. +0,25 + + + +ladspa-SweepVFII::f-depth-y +gfloat +[0,1] +rwx +f-depth-y +f-depth-y. +0,5 + + + +ladspa-SweepVFII::f-depth-z +gfloat +[0,1] +rwx +f-depth-z +f-depth-z. +1 + + + +ladspa-SweepVFII::f-h +gfloat +[0,001,1] +rwx +f-h +f-h. +0,25075 + + + +ladspa-SweepVFII::mode +gint +[0,1] +rwx +mode +mode. +1 + + + +ladspa-AutoWah::Q +gfloat +[0,001,0,999] +rwx +Q +Q. +0,2505 + + + +ladspa-AutoWah::depth +gfloat +[0,1] +rwx +depth +depth. +0,5 + + + +ladspa-AutoWah::f +gfloat +[43,933] +rwx +f +f. +92,8051 + + + +ladspa-Scape::blend +gfloat +[0,1] +rwx +blend +blend. +0,75 + + + +ladspa-Scape::bpm +gfloat +[30,240] +rwx +bpm +bpm. +82,5 + + + +ladspa-Scape::divider +gint +[2,4] +rwx +divider +divider. +2 + + + +ladspa-Scape::dry +gfloat +[0,1] +rwx +dry +dry. +0,25 + + + +ladspa-Scape::feedback +gfloat +[0,1] +rwx +feedback +feedback. +0,25 + + + +ladspa-VCOs::f +gfloat +[1,5751] +rwx +f +f. +100 + + + +ladspa-VCOs::param------square +gfloat +[0,1] +rwx +param------square +param------square. +0 + + + +ladspa-VCOs::tri----saw +gfloat +[0,1] +rwx +tri----saw +tri----saw. +0 + + + +ladspa-VCOs::volume +gfloat +[1e-06,1] +rwx +volume +volume. +0,5 + + + +ladspa-VCOd::blend +gfloat +[-1,1] +rwx +blend +blend. +0,5 + + + +ladspa-VCOd::f +gfloat +[1,5751] +rwx +f +f. +100 + + + +ladspa-VCOd::param-1-------square +gfloat +[0,1] +rwx +param-1-------square +param-1-------square. +0 + + + +ladspa-VCOd::param-1--tri----saw +gfloat +[0,1] +rwx +param-1--tri----saw +param-1--tri----saw. +0 + + + +ladspa-VCOd::param-2-------square +gfloat +[0,1] +rwx +param-2-------square +param-2-------square. +0 + + + +ladspa-VCOd::param-2--tri----saw +gfloat +[0,1] +rwx +param-2--tri----saw +param-2--tri----saw. +0 + + + +ladspa-VCOd::param-2--tune +gfloat +[-12,12] +rwx +param-2--tune +param-2--tune. +0 + + + +ladspa-VCOd::sync +gfloat +[0,1] +rwx +sync +sync. +0 + + + +ladspa-VCOd::volume +gfloat +[1e-06,1] +rwx +volume +volume. +0,5 + + + +ladspa-CEO::damping +gfloat +[0,1] +rwx +damping +damping. +0 + + + +ladspa-CEO::mpm +gfloat +[4,244] +rwx +mpm +mpm. +184 + + + +ladspa-CEO::volume +gfloat +[0,1] +rwx +volume +volume. +0,5 + + + +ladspa-Sin::f +gfloat +[0,0001,20000] +rwx +f +f. +100 + + + +ladspa-Sin::volume +gfloat +[1e-06,1] +rwx +volume +volume. +0,5 + + + +ladspa-White::volume +gfloat +[1e-06,1] +rwx +volume +volume. +0,5 + + + +ladspa-Lorenz::h +gfloat +[0,1] +rwx +h +h. +0 + + + +ladspa-Lorenz::volume +gfloat +[1e-06,1] +rwx +volume +volume. +0,5 + + + +ladspa-Lorenz::x +gfloat +[0,1] +rwx +x +x. +1 + + + +ladspa-Lorenz::y +gfloat +[0,1] +rwx +y +y. +0 + + + +ladspa-Lorenz::z +gfloat +[0,1] +rwx +z +z. +0 + + + +ladspa-Roessler::h +gfloat +[0,1] +rwx +h +h. +0 + + + +ladspa-Roessler::volume +gfloat +[1e-06,1] +rwx +volume +volume. +0,5 + + + +ladspa-Roessler::x +gfloat +[0,1] +rwx +x +x. +1 + + + +ladspa-Roessler::y +gfloat +[0,1] +rwx +y +y. +0,5 + + + +ladspa-Roessler::z +gfloat +[0,1] +rwx +z +z. +0 + + + +ladspa-JVRev::blend +gfloat +[0,0,28] +rwx +blend +blend. +0,07 + + + +ladspa-JVRev::t60 +gfloat +[0,4,6] +rwx +t60 +t60. +2,3 + + + +ladspa-Plate::bandwidth +gfloat +[0,005,0,999] +rwx +bandwidth +bandwidth. +0,502 + + + +ladspa-Plate::blend +gfloat +[0,1] +rwx +blend +blend. +0,25 + + + +ladspa-Plate::damping +gfloat +[0,0005,1] +rwx +damping +damping. +0,250375 + + + +ladspa-Plate::tail +gfloat +[0,0,749] +rwx +tail +tail. +0,3745 + + + +ladspa-Plate2x2::bandwidth +gfloat +[0,005,0,999] +rwx +bandwidth +bandwidth. +0,502 + + + +ladspa-Plate2x2::blend +gfloat +[0,1] +rwx +blend +blend. +0,25 + + + +ladspa-Plate2x2::damping +gfloat +[0,0005,1] +rwx +damping +damping. +0,250375 + + + +ladspa-Plate2x2::tail +gfloat +[0,0,749] +rwx +tail +tail. +0,3745 + + + +ladspa-Click::bpm +gfloat +[4,244] +rwx +bpm +bpm. +64 + + + +ladspa-Click::damping +gfloat +[0,1] +rwx +damping +damping. +0,75 + + + +ladspa-Click::volume +gfloat +[0,1] +rwx +volume +volume. +0,5 + + + +ladspa-Dirac::damping +gfloat +[0,1] +rwx +damping +damping. +0 + + + +ladspa-Dirac::ppm +gfloat +[30,60] +rwx +ppm +ppm. +30 + + + +ladspa-Dirac::volume +gfloat +[0,1] +rwx +volume +volume. +0 + + + +ladspa-HRTF::pan +gint +[-36,36] +rwx +pan +pan. +0 + + + +ladspa-sequencer64::Closed-Gate-Value +gfloat + +rwx +Closed-Gate-Value +Closed-Gate-Value. +-3,40282e+38 + + + +ladspa-sequencer64::Loop-Steps +gint +[1,64] +rwx +Loop-Steps +Loop-Steps. +64 + + + +ladspa-sequencer64::Reset-to-Value-on-Gate-Close- +gint +[0,1] +rwx +Reset-to-Value-on-Gate-Close- +Reset-to-Value-on-Gate-Close-. +0 + + + +ladspa-sequencer64::Value-Step-0 +gfloat + +rwx +Value-Step-0 +Value-Step-0. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-1 +gfloat + +rwx +Value-Step-1 +Value-Step-1. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-10 +gfloat + +rwx +Value-Step-10 +Value-Step-10. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-11 +gfloat + +rwx +Value-Step-11 +Value-Step-11. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-12 +gfloat + +rwx +Value-Step-12 +Value-Step-12. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-13 +gfloat + +rwx +Value-Step-13 +Value-Step-13. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-14 +gfloat + +rwx +Value-Step-14 +Value-Step-14. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-15 +gfloat + +rwx +Value-Step-15 +Value-Step-15. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-16 +gfloat + +rwx +Value-Step-16 +Value-Step-16. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-17 +gfloat + +rwx +Value-Step-17 +Value-Step-17. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-18 +gfloat + +rwx +Value-Step-18 +Value-Step-18. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-19 +gfloat + +rwx +Value-Step-19 +Value-Step-19. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-2 +gfloat + +rwx +Value-Step-2 +Value-Step-2. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-20 +gfloat + +rwx +Value-Step-20 +Value-Step-20. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-21 +gfloat + +rwx +Value-Step-21 +Value-Step-21. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-22 +gfloat + +rwx +Value-Step-22 +Value-Step-22. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-23 +gfloat + +rwx +Value-Step-23 +Value-Step-23. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-24 +gfloat + +rwx +Value-Step-24 +Value-Step-24. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-25 +gfloat + +rwx +Value-Step-25 +Value-Step-25. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-26 +gfloat + +rwx +Value-Step-26 +Value-Step-26. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-27 +gfloat + +rwx +Value-Step-27 +Value-Step-27. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-28 +gfloat + +rwx +Value-Step-28 +Value-Step-28. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-29 +gfloat + +rwx +Value-Step-29 +Value-Step-29. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-3 +gfloat + +rwx +Value-Step-3 +Value-Step-3. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-30 +gfloat + +rwx +Value-Step-30 +Value-Step-30. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-31 +gfloat + +rwx +Value-Step-31 +Value-Step-31. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-32 +gfloat + +rwx +Value-Step-32 +Value-Step-32. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-33 +gfloat + +rwx +Value-Step-33 +Value-Step-33. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-34 +gfloat + +rwx +Value-Step-34 +Value-Step-34. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-35 +gfloat + +rwx +Value-Step-35 +Value-Step-35. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-36 +gfloat + +rwx +Value-Step-36 +Value-Step-36. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-37 +gfloat + +rwx +Value-Step-37 +Value-Step-37. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-38 +gfloat + +rwx +Value-Step-38 +Value-Step-38. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-39 +gfloat + +rwx +Value-Step-39 +Value-Step-39. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-4 +gfloat + +rwx +Value-Step-4 +Value-Step-4. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-40 +gfloat + +rwx +Value-Step-40 +Value-Step-40. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-41 +gfloat + +rwx +Value-Step-41 +Value-Step-41. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-42 +gfloat + +rwx +Value-Step-42 +Value-Step-42. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-43 +gfloat + +rwx +Value-Step-43 +Value-Step-43. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-44 +gfloat + +rwx +Value-Step-44 +Value-Step-44. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-45 +gfloat + +rwx +Value-Step-45 +Value-Step-45. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-46 +gfloat + +rwx +Value-Step-46 +Value-Step-46. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-47 +gfloat + +rwx +Value-Step-47 +Value-Step-47. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-48 +gfloat + +rwx +Value-Step-48 +Value-Step-48. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-49 +gfloat + +rwx +Value-Step-49 +Value-Step-49. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-5 +gfloat + +rwx +Value-Step-5 +Value-Step-5. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-50 +gfloat + +rwx +Value-Step-50 +Value-Step-50. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-51 +gfloat + +rwx +Value-Step-51 +Value-Step-51. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-52 +gfloat + +rwx +Value-Step-52 +Value-Step-52. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-53 +gfloat + +rwx +Value-Step-53 +Value-Step-53. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-54 +gfloat + +rwx +Value-Step-54 +Value-Step-54. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-55 +gfloat + +rwx +Value-Step-55 +Value-Step-55. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-56 +gfloat + +rwx +Value-Step-56 +Value-Step-56. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-57 +gfloat + +rwx +Value-Step-57 +Value-Step-57. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-58 +gfloat + +rwx +Value-Step-58 +Value-Step-58. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-59 +gfloat + +rwx +Value-Step-59 +Value-Step-59. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-6 +gfloat + +rwx +Value-Step-6 +Value-Step-6. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-60 +gfloat + +rwx +Value-Step-60 +Value-Step-60. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-61 +gfloat + +rwx +Value-Step-61 +Value-Step-61. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-62 +gfloat + +rwx +Value-Step-62 +Value-Step-62. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-63 +gfloat + +rwx +Value-Step-63 +Value-Step-63. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-7 +gfloat + +rwx +Value-Step-7 +Value-Step-7. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-8 +gfloat + +rwx +Value-Step-8 +Value-Step-8. +-3,40282e+38 + + + +ladspa-sequencer64::Value-Step-9 +gfloat + +rwx +Value-Step-9 +Value-Step-9. +-3,40282e+38 + + + +ladspa-pointerCastDistortion::Dry-wet-mix +gfloat +[0,1] +rwx +Dry-wet-mix +Dry-wet-mix. +0 + + + +ladspa-pointerCastDistortion::Effect-cutoff-freq +gfloat +[4,41,13230] +rwx +Effect-cutoff-freq +Effect-cutoff-freq. +32,6376 + + + +ladspa-comb::Band-separation +gfloat +[16,640] +rwx +Band-separation +Band-separation. +172 + + + +ladspa-comb::Feedback +gfloat +[-0,99,0,99] +rwx +Feedback +Feedback. +0 + + + +ladspa-tap-stereo-echo::Cross-Mode +gboolean + +rwx +Cross-Mode +Cross-Mode. +FALSE + + + +ladspa-tap-stereo-echo::Dry-Level--dB- +gfloat +[-70,10] +rwx +Dry-Level--dB- +Dry-Level--dB-. +0 + + + +ladspa-tap-stereo-echo::Haas-Effect +gboolean + +rwx +Haas-Effect +Haas-Effect. +FALSE + + + +ladspa-tap-stereo-echo::L-Delay--ms- +gfloat +[0,2000] +rwx +L-Delay--ms- +L-Delay--ms-. +100 + + + +ladspa-tap-stereo-echo::L-Echo-Level--dB- +gfloat +[-70,10] +rwx +L-Echo-Level--dB- +L-Echo-Level--dB-. +0 + + + +ladspa-tap-stereo-echo::L-Feedback---- +gfloat +[0,100] +rwx +L-Feedback---- +L-Feedback----. +0 + + + +ladspa-tap-stereo-echo::R-Echo-Level--dB- +gfloat +[-70,10] +rwx +R-Echo-Level--dB- +R-Echo-Level--dB-. +0 + + + +ladspa-tap-stereo-echo::R-Haas-Delay--ms- +gfloat +[0,2000] +rwx +R-Haas-Delay--ms- +R-Haas-Delay--ms-. +100 + + + +ladspa-tap-stereo-echo::R-Haas-Feedback---- +gfloat +[0,100] +rwx +R-Haas-Feedback---- +R-Haas-Feedback----. +0 + + + +ladspa-tap-stereo-echo::Swap-Outputs +gboolean + +rwx +Swap-Outputs +Swap-Outputs. +FALSE + + + +ladspa-gsm::Dry-wet-mix +gfloat +[0,1] +rwx +Dry-wet-mix +Dry-wet-mix. +1 + + + +ladspa-gsm::Error-rate +gfloat +[0,30] +rwx +Error-rate +Error-rate. +0 + + + +ladspa-gsm::Number-of-passes +gint +[0,10] +rwx +Number-of-passes +Number-of-passes. +1 + + + +ladspa-gsm::latency +gfloat + +r +latency +latency. +-3,40282e+38 + + + +ladspa-highpass-iir::Cutoff-Frequency +gfloat +[4,41,19845] +rwx +Cutoff-Frequency +Cutoff-Frequency. +36,1195 + + + +ladspa-highpass-iir::Stages-2-poles-per-stage- +gint +[1,10] +rwx +Stages-2-poles-per-stage- +Stages-2-poles-per-stage-. +1 + + + +ladspa-vocoder::Band-1-Level +gfloat +[0,1] +rwx +Band-1-Level +Band-1-Level. +0 + + + +ladspa-vocoder::Band-10-Level +gfloat +[0,1] +rwx +Band-10-Level +Band-10-Level. +0 + + + +ladspa-vocoder::Band-11-Level +gfloat +[0,1] +rwx +Band-11-Level +Band-11-Level. +0 + + + +ladspa-vocoder::Band-12-Level +gfloat +[0,1] +rwx +Band-12-Level +Band-12-Level. +0 + + + +ladspa-vocoder::Band-13-Level +gfloat +[0,1] +rwx +Band-13-Level +Band-13-Level. +0 + + + +ladspa-vocoder::Band-14-Level +gfloat +[0,1] +rwx +Band-14-Level +Band-14-Level. +0 + + + +ladspa-vocoder::Band-15-Level +gfloat +[0,1] +rwx +Band-15-Level +Band-15-Level. +0 + + + +ladspa-vocoder::Band-16-Level +gfloat +[0,1] +rwx +Band-16-Level +Band-16-Level. +0 + + + +ladspa-vocoder::Band-2-Level +gfloat +[0,1] +rwx +Band-2-Level +Band-2-Level. +0 + + + +ladspa-vocoder::Band-3-Level +gfloat +[0,1] +rwx +Band-3-Level +Band-3-Level. +0 + + + +ladspa-vocoder::Band-4-Level +gfloat +[0,1] +rwx +Band-4-Level +Band-4-Level. +0 + + + +ladspa-vocoder::Band-5-Level +gfloat +[0,1] +rwx +Band-5-Level +Band-5-Level. +0 + + + +ladspa-vocoder::Band-6-Level +gfloat +[0,1] +rwx +Band-6-Level +Band-6-Level. +0 + + + +ladspa-vocoder::Band-7-Level +gfloat +[0,1] +rwx +Band-7-Level +Band-7-Level. +0 + + + +ladspa-vocoder::Band-8-Level +gfloat +[0,1] +rwx +Band-8-Level +Band-8-Level. +0 + + + +ladspa-vocoder::Band-9-Level +gfloat +[0,1] +rwx +Band-9-Level +Band-9-Level. +0 + + + +ladspa-vocoder::Number-of-bands +gint +[1,16] +rwx +Number-of-bands +Number-of-bands. +1 + + + +ladspa-karaoke::Vocal-volume +gfloat +[-70,0] +rwx +Vocal-volume +Vocal-volume. +0 + + + +ladspa-jaminController::Scene-no- +gint +[1,20] +rwx +Scene-no- +Scene-no-. +1 + + + +ladspa-tap-chorusflanger::Contour--Hz- +gfloat +[20,20000] +rwx +Contour--Hz- +Contour--Hz-. +100 + + + +ladspa-tap-chorusflanger::Delay--ms- +gfloat +[0,100] +rwx +Delay--ms- +Delay--ms-. +25 + + + +ladspa-tap-chorusflanger::Depth---- +gfloat +[0,100] +rwx +Depth---- +Depth----. +75 + + + +ladspa-tap-chorusflanger::Dry-Level--dB- +gfloat +[-90,20] +rwx +Dry-Level--dB- +Dry-Level--dB-. +0 + + + +ladspa-tap-chorusflanger::Frequency--Hz- +gfloat +[0,5] +rwx +Frequency--Hz- +Frequency--Hz-. +1,25 + + + +ladspa-tap-chorusflanger::L-R-Phase-Shift--deg- +gfloat +[0,180] +rwx +L-R-Phase-Shift--deg- +L-R-Phase-Shift--deg-. +90 + + + +ladspa-tap-chorusflanger::Wet-Level--dB- +gfloat +[-90,20] +rwx +Wet-Level--dB- +Wet-Level--dB-. +0 + + + +ladspa-bandpass-iir::Bandwidth +gfloat +[4,41,19845] +rwx +Bandwidth +Bandwidth. +295,832 + + + +ladspa-bandpass-iir::Center-Frequency +gfloat +[4,41,19845] +rwx +Center-Frequency +Center-Frequency. +295,832 + + + +ladspa-bandpass-iir::Stages-2-poles-per-stage- +gint +[1,10] +rwx +Stages-2-poles-per-stage- +Stages-2-poles-per-stage-. +1 + + + +ladspa-sc4::Amplitude +gfloat +[-40,12] +r +Amplitude +Amplitude. +-40 + + + +ladspa-sc4::Attack-time +gfloat +[1,5,400] +rwx +Attack-time +Attack-time. +101,125 + + + +ladspa-sc4::Gain-reduction +gfloat +[-24,0] +r +Gain-reduction +Gain-reduction. +-24 + + + +ladspa-sc4::Knee-radius +gfloat +[1,10] +rwx +Knee-radius +Knee-radius. +3,25 + + + +ladspa-sc4::Makeup-gain +gfloat +[0,24] +rwx +Makeup-gain +Makeup-gain. +0 + + + +ladspa-sc4::RMS-peak +gfloat +[0,1] +rwx +RMS-peak +RMS-peak. +0 + + + +ladspa-sc4::Ratio +gfloat +[1,20] +rwx +Ratio +Ratio. +1 + + + +ladspa-sc4::Release-time +gfloat +[2,800] +rwx +Release-time +Release-time. +401 + + + +ladspa-sc4::Threshold-level +gfloat +[-30,0] +rwx +Threshold-level +Threshold-level. +0 + + + +ladspa-sawtooth-fc-oa::Frequenz +gfloat +[0,91875,22050] +rwx +Frequenz +Frequenz. +440 + + + +ladspa-notch-iir::Bandwidth +gfloat +[4,41,19845] +rwx +Bandwidth +Bandwidth. +295,832 + + + +ladspa-notch-iir::Center-Frequency +gfloat +[4,41,19845] +rwx +Center-Frequency +Center-Frequency. +295,832 + + + +ladspa-notch-iir::Stages-2-poles-per-stage- +gint +[1,10] +rwx +Stages-2-poles-per-stage- +Stages-2-poles-per-stage-. +1 + + + +ladspa-freqTracker::Tracking-speed +gfloat +[0,1] +rwx +Tracking-speed +Tracking-speed. +0,5 + + + +ladspa-comb-n::Decay-Time +gfloat +>= 0 +rwx +Decay-Time +Decay-Time. +0 + + + +ladspa-comb-n::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-comb-n::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-comb-l::Decay-Time +gfloat +>= 0 +rwx +Decay-Time +Decay-Time. +0 + + + +ladspa-comb-l::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-comb-l::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-comb-c::Decay-Time +gfloat +>= 0 +rwx +Decay-Time +Decay-Time. +0 + + + +ladspa-comb-c::Delay-Time +gfloat +>= 0 +rwx +Delay-Time +Delay-Time. +0 + + + +ladspa-comb-c::Max-Delay +gfloat +>= 0 +rwx +Max-Delay +Max-Delay. +0 + + + +ladspa-sequencer32::Closed-Gate-Value +gfloat + +rwx +Closed-Gate-Value +Closed-Gate-Value. +-3,40282e+38 + + + +ladspa-sequencer32::Loop-Steps +gint +[1,32] +rwx +Loop-Steps +Loop-Steps. +32 + + + +ladspa-sequencer32::Reset-to-Value-on-Gate-Close- +gint +[0,1] +rwx +Reset-to-Value-on-Gate-Close- +Reset-to-Value-on-Gate-Close-. +0 + + + +ladspa-sequencer32::Value-Step-0 +gfloat + +rwx +Value-Step-0 +Value-Step-0. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-1 +gfloat + +rwx +Value-Step-1 +Value-Step-1. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-10 +gfloat + +rwx +Value-Step-10 +Value-Step-10. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-11 +gfloat + +rwx +Value-Step-11 +Value-Step-11. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-12 +gfloat + +rwx +Value-Step-12 +Value-Step-12. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-13 +gfloat + +rwx +Value-Step-13 +Value-Step-13. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-14 +gfloat + +rwx +Value-Step-14 +Value-Step-14. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-15 +gfloat + +rwx +Value-Step-15 +Value-Step-15. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-16 +gfloat + +rwx +Value-Step-16 +Value-Step-16. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-17 +gfloat + +rwx +Value-Step-17 +Value-Step-17. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-18 +gfloat + +rwx +Value-Step-18 +Value-Step-18. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-19 +gfloat + +rwx +Value-Step-19 +Value-Step-19. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-2 +gfloat + +rwx +Value-Step-2 +Value-Step-2. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-20 +gfloat + +rwx +Value-Step-20 +Value-Step-20. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-21 +gfloat + +rwx +Value-Step-21 +Value-Step-21. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-22 +gfloat + +rwx +Value-Step-22 +Value-Step-22. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-23 +gfloat + +rwx +Value-Step-23 +Value-Step-23. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-24 +gfloat + +rwx +Value-Step-24 +Value-Step-24. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-25 +gfloat + +rwx +Value-Step-25 +Value-Step-25. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-26 +gfloat + +rwx +Value-Step-26 +Value-Step-26. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-27 +gfloat + +rwx +Value-Step-27 +Value-Step-27. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-28 +gfloat + +rwx +Value-Step-28 +Value-Step-28. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-29 +gfloat + +rwx +Value-Step-29 +Value-Step-29. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-3 +gfloat + +rwx +Value-Step-3 +Value-Step-3. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-30 +gfloat + +rwx +Value-Step-30 +Value-Step-30. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-31 +gfloat + +rwx +Value-Step-31 +Value-Step-31. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-4 +gfloat + +rwx +Value-Step-4 +Value-Step-4. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-5 +gfloat + +rwx +Value-Step-5 +Value-Step-5. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-6 +gfloat + +rwx +Value-Step-6 +Value-Step-6. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-7 +gfloat + +rwx +Value-Step-7 +Value-Step-7. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-8 +gfloat + +rwx +Value-Step-8 +Value-Step-8. +-3,40282e+38 + + + +ladspa-sequencer32::Value-Step-9 +gfloat + +rwx +Value-Step-9 +Value-Step-9. +-3,40282e+38 + + + +ladspa-tap-deesser::Attenuation--dB- +gfloat +[0,10] +r +Attenuation--dB- +Attenuation--dB-. +0 + + + +ladspa-tap-deesser::Frequency--Hz- +gfloat +[2000,16000] +rwx +Frequency--Hz- +Frequency--Hz-. +5500 + + + +ladspa-tap-deesser::Monitor +gint +[0,1] +rwx +Monitor +Monitor. +0 + + + +ladspa-tap-deesser::Sidechain-Filter +gint +[0,1] +rwx +Sidechain-Filter +Sidechain-Filter. +0 + + + +ladspa-tap-deesser::Threshold-Level--dB- +gfloat +[-50,10] +rwx +Threshold-Level--dB- +Threshold-Level--dB-. +0 + + + +ladspa-noise-white::Amplitude +gfloat +>= 0 +rwx +Amplitude +Amplitude. +1 + + + +GstSMPTEAlpha::border +gint +>= 0 +rw +Border +The border width of the transition. +0 + + + +GstSMPTEAlpha::depth +gint +[1,24] +rw +Depth +Depth of the mask in bits. +16 + + + +GstSMPTEAlpha::position +gdouble +[0,1] +rw +Position +Position of the transition effect. +0 + + + +GstSMPTEAlpha::type +GstSMPTEAlphaTransitionType + +rw +Type +The type of transition to use. +A bar moves from left to right + + + +GstSMPTEAlpha::invert +gboolean + +rw +Invert +Invert transition mask. +FALSE + + + +GstVideoMixerPad::alpha +gdouble +[0,1] +rw +Alpha +Alpha of the picture. +1 + + + +GstVideoMixerPad::xpos +gint + +rw +X Position +X Position of the picture. +0 + + + +GstVideoMixerPad::ypos +gint + +rw +Y Position +Y Position of the picture. +0 + + + +GstVideoMixerPad::zorder +guint +<= 10000 +rw +Z-Order +Z Order of the picture. +0 + + + +GstRtpH264Depay::byte-stream +gboolean + +rw +Byte Stream +Generate byte stream format of NALU (deprecated; use caps). +TRUE + + + +GstRtpH264Depay::access-unit +gboolean + +rw +Access Unit +Merge NALU into AU (picture) (deprecated; use caps). +FALSE + + + +GstAudioKaraoke::filter-band +gfloat +[0,441] +rw +Filter Band +The Frequency band of the filter. +220 + + + +GstAudioKaraoke::filter-width +gfloat +[0,100] +rw +Filter Width +The Frequency width of the filter. +100 + + + +GstAudioKaraoke::level +gfloat +[0,1] +rw +Level +Level of the effect (1.0 = full). +1 + + + +GstAudioKaraoke::mono-level +gfloat +[0,1] +rw +Mono Level +Level of the mono channel (1.0 = full). +1 + + + +GstPulseSink::device +gchar* + +rw +Device +The PulseAudio sink device to connect to. +NULL + + + +GstPulseSink::server +gchar* + +rw +Server +The PulseAudio server to connect to. +NULL + + + +GstPulseSink::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +NULL + + + +GstPulseSink::volume +gdouble +[0,10] +rw +Volume +Linear volume of this stream, 1.0=100%. +1 + + + +GstPulseSink::mute +gboolean + +rw +Mute +Mute state of this stream. +FALSE + + + +GstPulseSink::client +gchar* + +rw +Client +The PulseAudio client name to use. +"lt-gst-plugins-good-plugins-scan" + + + +GstPulseSink::stream-properties +GstStructure* + +rw +stream properties +list of pulseaudio stream properties. + + + + +GstPulseSrc::device +gchar* + +rw +Device +The PulseAudio source device to connect to. +NULL + + + +GstPulseSrc::server +gchar* + +rw +Server +The PulseAudio server to connect to. +NULL + + + +GstPulseSrc::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +NULL + + + +GstPulseSrc::stream-properties +GstStructure* + +rw +stream properties +list of pulseaudio stream properties. + + + + +GstPulseSrc::client +gchar* + +rw +Client +The PulseAudio client_name_to_use. +"lt-gst-plugins-good-plugins-scan" + + + +GstPulseSrc::mute +gboolean + +rw +Mute +Mute state of this stream. +FALSE + + + +GstPulseSrc::source-output-index +guint + +r +source output index +The index of the PulseAudio source output corresponding to this record stream. +4294967295 + + + +GstPulseSrc::volume +gdouble +[0,10] +rw +Volume +Linear volume of this stream, 1.0=100%. +1 + + + +GstPulseMixer::device +gchar* + +rw +Device +The PulseAudio sink or source to control. +NULL + + + +GstPulseMixer::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +NULL + + + +GstPulseMixer::server +gchar* + +rw +Server +The PulseAudio server to connect to. +NULL + + + +GstTagInject::tags +gchar* + +w +taglist +List of tags to inject into the target file. +NULL + + + +GstDeinterleave::keep-positions +gboolean + +rw +Keep positions +Keep the original channel positions on the output buffers. +FALSE + + + +GstInterleave::channel-positions +GValueArray* + +rw +Channel positions +Channel positions used on the output. + + + + +GstInterleave::channel-positions-from-input +gboolean + +rw +Channel positions from input +Take channel positions from the input. +TRUE + + + +GstRgVolume::album-mode +gboolean + +rw +Album mode +Prefer album over track gain. +TRUE + + + +GstRgVolume::fallback-gain +gdouble +[-60,60] +rw +Fallback gain +Gain for streams missing tags [dB]. +0 + + + +GstRgVolume::headroom +gdouble +[0,60] +rw +Headroom +Extra headroom [dB]. +0 + + + +GstRgVolume::pre-amp +gdouble +[-60,60] +rw +Pre-amp +Extra gain [dB]. +0 + + + +GstRgVolume::result-gain +gdouble +[-120,120] +r +Result-gain +Applied gain [dB]. +0 + + + +GstRgVolume::target-gain +gdouble +[-120,120] +r +Target-gain +Applicable gain [dB]. +0 + + + +GstRgLimiter::enabled +gboolean + +rw +Enabled +Enable processing. +TRUE + + + +GstRgAnalysis::forced +gboolean + +rw +Forced +Analyze even if ReplayGain tags exist. +TRUE + + + +GstRgAnalysis::num-tracks +gint +>= 0 +rw +Number of album tracks +Number of remaining album tracks. +0 + + + +GstRgAnalysis::reference-level +gdouble +[0,150] +rw +Reference level +Reference level [dB]. +89 + + + +GstRgAnalysis::message +gboolean + +rwx +Message +Post statics messages. +FALSE + + + +GstHDV1394Src::channel +gint +[0,64] +rw +Channel +Channel number for listening. +63 + + + +GstHDV1394Src::device-name +gchar* + +r +device name +user-friendly name of the device. +"Default" + + + +GstHDV1394Src::guid +guint64 + +rw +GUID +select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid). +0 + + + +GstHDV1394Src::port +gint +[G_MAXULONG,16] +rw +Port +Port number (-1 automatic). +-1 + + + +GstHDV1394Src::use-avc +gboolean + +rw +Use AV/C +Use AV/C VTR control. +TRUE + + + +GstAutoVideoSrc::filter-caps +GstCaps* + +rw +Filter caps +Filter src candidates using these caps. + + + + +GstAutoAudioSrc::filter-caps +GstCaps* + +rw +Filter caps +Filter sink candidates using these caps. + + + + +GstRtpJPEGPay::quality +gint +[0,255] +rw +Quality +Quality factor on JPEG data (unused). +255 + + + +GstRtpJPEGPay::type +gint +[0,255] +rw +Type +Default JPEG Type, overwritten by SOF when present. +1 + + + +GstRtpJPEGPay::buffer-list +gboolean + +rw +Buffer List +Use Buffer Lists. +FALSE + + + +GstAudioFIRFilter::kernel +GValueArray* + +rw +Filter Kernel +Filter kernel for the FIR filter. + + + + +GstAudioFIRFilter::latency +guint64 + +rw +Latecy +Filter latency in samples. +0 + + + +GstAudioIIRFilter::a +GValueArray* + +rw +A +Filter coefficients (numerator of transfer function). + + + + +GstAudioIIRFilter::b +GValueArray* + +rw +B +Filter coefficients (denominator of transfer function). + + + + +GstAudioDelay::delay +guint64 +>= 1 +rw +Delay +Delay in nanoseconds. +1 + + + +GstAudioDelay::feedback +gfloat +[0,1] +rw +Feedback +Amount of feedback. +0 + + + +GstAudioDelay::intensity +gfloat +[0,1] +rw +Intensity +Intensity of the echo. +0 + + + +GstAudioReverb::delay +guint64 +>= 1 +rw +Delay +Delay of the echo in nanoseconds. +1 + + + +GstAudioReverb::feedback +gfloat +[0,1] +rw +Feedback +Amount of feedback. +0 + + + +GstAudioReverb::intensity +gfloat +[0,1] +rw +Intensity +Intensity of the echo. +0 + + + +GstAudioEcho::delay +guint64 +>= 1 +rw +Delay +Delay of the echo in nanoseconds. +1 + + + +GstAudioEcho::feedback +gfloat +[0,1] +rw +Feedback +Amount of feedback. +0 + + + +GstAudioEcho::intensity +gfloat +[0,1] +rw +Intensity +Intensity of the echo. +0 + + + +GstAudioEcho::max-delay +guint64 +>= 1 +rw +Maximum Delay +Maximum delay of the echo in nanoseconds (can't be changed in PLAYING or PAUSED state). +1 + + + +GstAspectRatioCrop::aspect-ratio +GstFraction + +rw +aspect-ratio +Target aspect-ratio of video. + + + + +GstRtpG726Depay::force-aal2 +gboolean + +rw +Force AAL2 +Force AAL2 decoding for compatibility with bad payloaders. +TRUE + + + +GstRtpG726Pay::force-aal2 +gboolean + +rw +Force AAL2 +Force AAL2 encoding for compatibility with bad depayloaders. +TRUE + + + +GstRtpH263Pay::modea-only +gboolean + +rw +Fragment packets in mode A Only +Disable packetization modes B and C. +FALSE + + + +GstDeinterlace::fields +GstDeinterlaceFields + +rw +fields +Fields to use for deinterlacing. +All fields + + + +GstDeinterlace::method +GstDeinterlaceMethods + +rw +Method +Deinterlace Method. +Television: Full resolution + + + +GstDeinterlace::mode +GstDeinterlaceModes + +rw +Mode +Deinterlace Mode. +Auto detection + + + +GstDeinterlace::tff +GstDeinterlaceFieldLayout + +rw +tff +Deinterlace top field first. +Auto detection + + + +GstDeinterlace::drop-orphans +gboolean + +rw +drop-orphans +Drop orphan fields at the beginning of telecine patterns in active locking mode. +TRUE + + + +GstDeinterlace::ignore-obscure +gboolean + +rw +ignore-obscure +Ignore obscure telecine patterns (only consider P, I and 2:3 variants). +TRUE + + + +GstDeinterlace::locking +GstDeinterlaceLocking + +rw +locking +Pattern locking mode. +No pattern locking + + + +GstAgingTV::color-aging +gboolean + +rw +Color Aging +Color Aging. +TRUE + + + +GstAgingTV::dusts +gboolean + +rw +Dusts +Dusts. +TRUE + + + +GstAgingTV::pits +gboolean + +rw +Pits +Pits. +TRUE + + + +GstAgingTV::scratch-lines +guint +<= 20 +rw +Scratch Lines +Number of scratch lines. +7 + + + +GstOpTV::mode +GstOpTVMode + +rw +Mode +Mode. +Maelstrom + + + +GstOpTV::speed +gint + +rw +Speed +Effect speed. +16 + + + +GstOpTV::threshold +guint +<= G_MAXINT +rw +Threshold +Luma threshold. +60 + + + +GstRadioacTV::color +GstRadioacTVColor + +rw +Color +Color. +White + + + +GstRadioacTV::interval +guint +<= G_MAXINT +rw +Interval +Snapshot interval (in strobe mode). +3 + + + +GstRadioacTV::mode +GstRadioacTVMode + +rw +Mode +Mode. +Normal + + + +GstRadioacTV::trigger +gboolean + +rw +Trigger +Trigger (in trigger mode). +FALSE + + + +GstStreakTV::feedback +gboolean + +rw +Feedback +Feedback. +FALSE + + + +GstRippleTV::mode +GstRippleTVMode + +rw +Mode +Mode. +Motion Detection + + + +GstRippleTV::reset +gboolean + +w +Reset +Reset all current ripples. +FALSE + + + +GstRtpBin::do-lost +gboolean + +rw +Do Lost +Send an event downstream when a packet is lost. +FALSE + + + +GstRtpBin::latency +guint + +rw +Buffer latency in ms +Default amount of ms to buffer in the jitterbuffers. +200 + + + +GstRtpBin::sdes +GstStructure* + +rw +SDES +The SDES items of this session. + + + + +GstRtpBin::ignore-pt +gboolean + +rw +Ignore PT +Do not demultiplex based on PT values. +FALSE + + + +GstRtpBin::autoremove +gboolean + +rw +Auto Remove +Automatically remove timed out sources. +FALSE + + + +GstRtpBin::buffer-mode +RTPJitterBufferMode + +rw +Buffer Mode +Control the buffering algorithm in use. +Slave receiver to sender clock + + + +GstRtpBin::ntp-sync +gboolean + +rw +Sync on NTP clock +Synchronize received streams to the NTP clock. +FALSE + + + +GstRtpBin::use-pipeline-clock +gboolean + +rw +Use pipeline clock +Use the pipeline clock to set the NTP time in the RTCP SR messages. +FALSE + + + +GstRtpBin::rtcp-sync +GstRTCPSync + +rw +RTCP Sync +Use of RTCP SR in synchronization. +always + + + +GstRtpBin::rtcp-sync-interval +guint + +rw +RTCP Sync Interval +RTCP SR interval synchronization (ms) (0 = always). +0 + + + +GstRtpJitterBuffer::do-lost +gboolean + +rw +Do Lost +Send an event downstream when a packet is lost. +FALSE + + + +GstRtpJitterBuffer::drop-on-latency +gboolean + +rw +Drop buffers when maximum latency is reached +Tells the jitterbuffer to never exceed the given latency in size. +FALSE + + + +GstRtpJitterBuffer::latency +guint + +rw +Buffer latency in ms +Amount of ms to buffer. +200 + + + +GstRtpJitterBuffer::ts-offset +gint64 + +rw +Timestamp Offset +Adjust buffer timestamps with offset in nanoseconds. +0 + + + +GstRtpJitterBuffer::mode +RTPJitterBufferMode + +rw +Mode +Control the buffering algorithm in use. +Slave receiver to sender clock + + + +GstRtpJitterBuffer::percent +gint +[0,100] +r +percent +The buffer filled percent. +0 + + + +GstRtpSession::bandwidth +gdouble +>= 0 +rw +Bandwidth +The bandwidth of the session in bytes per second (0 for auto-discover). +64000 + + + +GstRtpSession::internal-session +RTPSession* + +r +Internal Session +The internal RTPSession object. + + + + +GstRtpSession::ntp-ns-base +guint64 + +rw +NTP base time +The NTP base time corresponding to running_time 0 (deprecated). +0 + + + +GstRtpSession::num-active-sources +guint + +r +Num Active Sources +The number of active sources in the session. +0 + + + +GstRtpSession::num-sources +guint + +r +Num Sources +The number of sources in the session. +0 + + + +GstRtpSession::rtcp-fraction +gdouble +>= 0 +rw +RTCP Fraction +The RTCP bandwidth of the session in bytes per second (or as a real fraction of the RTP bandwidth if < 1.0). +3200 + + + +GstRtpSession::sdes +GstStructure* + +rw +SDES +The SDES items of this session. + + + + +GstRtpSession::rtcp-rr-bandwidth +gint +>= G_MAXULONG +rw +RTCP RR bandwidth +The RTCP bandwidth used for receivers in bytes per second (-1 = default). +-1 + + + +GstRtpSession::rtcp-rs-bandwidth +gint +>= G_MAXULONG +rw +RTCP RS bandwidth +The RTCP bandwidth used for senders in bytes per second (-1 = default). +-1 + + + +GstRtpSession::use-pipeline-clock +gboolean + +rw +Use pipeline clock +Use the pipeline clock to set the NTP time in the RTCP SR messages. +FALSE + + + +GstRtpSession::rtcp-min-interval +guint64 + +rw +Minimum RTCP interval +Minimum interval between Regular RTCP packet (in ns). +5000000000 + + + +GstV4l2Sink::device +gchar* + +rw +Device +Device location. +"/dev/video1" + + + +GstV4l2Sink::device-fd +gint +>= -1 +r +File descriptor +File descriptor of the device. +-1 + + + +GstV4l2Sink::device-name +gchar* + +r +Device name +Name of the device. +NULL + + + +GstV4l2Sink::flags +GstV4l2DeviceTypeFlags + +r +Flags +Device type flags. + + + + +GstV4l2Sink::overlay-height +guint + +rw +Overlay height +The height of the video overlay; default is equal to negotiated image height. +0 + + + +GstV4l2Sink::overlay-left +gint + +rw +Overlay left +The leftmost (x) coordinate of the video overlay; top left corner of screen is 0,0. +0 + + + +GstV4l2Sink::overlay-top +gint + +rw +Overlay top +The topmost (y) coordinate of the video overlay; top left corner of screen is 0,0. +0 + + + +GstV4l2Sink::overlay-width +guint + +rw +Overlay width +The width of the video overlay; default is equal to negotiated image width. +0 + + + +GstV4l2Sink::queue-size +guint +[1,16] +rw +Queue size +Number of buffers to be enqueud in the driver in streaming mode. +12 + + + +GstV4l2Sink::brightness +gint + +rw +Brightness +Picture brightness, or more precisely, the black level. +0 + + + +GstV4l2Sink::contrast +gint + +rw +Contrast +Picture contrast or luma gain. +0 + + + +GstV4l2Sink::hue +gint + +rw +Hue +Hue or color balance. +0 + + + +GstV4l2Sink::saturation +gint + +rw +Saturation +Picture color saturation or chroma gain. +0 + + + +GstV4l2Sink::crop-height +guint + +rw +Crop height +The height of the video crop; default is equal to negotiated image height. +0 + + + +GstV4l2Sink::crop-left +gint + +rw +Crop left +The leftmost (x) coordinate of the video crop; top left corner of image is 0,0. +0 + + + +GstV4l2Sink::crop-top +gint + +rw +Crop top +The topmost (y) coordinate of the video crop; top left corner of image is 0,0. +0 + + + +GstV4l2Sink::crop-width +guint + +rw +Crop width +The width of the video crop; default is equal to negotiated image width. +0 + + + +GstV4l2Sink::min-queued-bufs +guint +<= 16 +rw +Minimum queued bufs +Minimum number of queued bufs; v4l2sink won't dqbuf if the driver doesn't have more than this number (which normally you shouldn't change). +1 + + + +GstShapeWipe::border +gfloat +[0,1] +rw +Border +Border of the mask. +0 + + + +GstShapeWipe::position +gfloat +[0,1] +rw +Position +Position of the mask. +0 + + + +GstFlvMux::is-live +gboolean + +rw +Is Live +The stream is live and does not need an index. +FALSE + + + +GstFlvMux::streamable +gboolean + +rw +streamable +If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. +FALSE + + + +GstCapsSetter::caps +GstCaps* + +rw +Merge caps +Merge these caps (thereby overwriting) in the stream. + + + + +GstCapsSetter::join +gboolean + +rw +Join +Match incoming caps' mime-type to mime-type of provided caps. +TRUE + + + +GstCapsSetter::replace +gboolean + +rw +Replace +Drop fields of incoming caps. +FALSE + + + +GstOss4Mixer::device +gchar* + +rw +Device +OSS mixer device (e.g. /dev/oss/hdaudio0/mix0 or /dev/mixerN) (NULL = use first mixer device found). +NULL + + + +GstOss4Mixer::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +NULL + + + +GstOss4Source::device +gchar* + +rw +Device +OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) (NULL = use first available device). +NULL + + + +GstOss4Source::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +NULL + + + +GstOss4Sink::device +gchar* + +rw +Device +OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) (NULL = use first available playback device). +NULL + + + +GstOss4Sink::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +NULL + + + +GstOss4Sink::mute +gboolean + +rw +Mute +Mute state of this stream. +FALSE + + + +GstOss4Sink::volume +gdouble +[0,10] +rw +Volume +Linear volume of this stream, 1.0=100%. +1 + + + +GstRtpTheoraPay::config-interval +guint +<= 3600 +rw +Config Send Interval +Send Config Insertion Interval in seconds (configuration headers will be multiplexed in the data stream when detected.) (0 = disabled). +0 + + + +GstVideoMixer2::background +GstVideoMixer2Background + +rw +Background +Background type. +Checker pattern + + + +GstRtpJ2KPay::buffer-list +gboolean + +rw +Buffer List +Use Buffer Lists. +TRUE + + + +GstRtpJ2KDepay::buffer-list +gboolean + +rw +Buffer List +Use Buffer Lists. +TRUE + + + +GstJackAudioSrc::client +JackClient* + +rw +JackClient +Handle for jack client. + + + + +GstJackAudioSrc::connect +GstJackConnect + +rw +Connect +Specify how the input ports will be connected. +Automatically connect ports to physical ports + + + +GstJackAudioSrc::server +gchar* + +rw +Server +The Jack server to connect to (NULL = default). +NULL + + + +GstJackAudioSrc::client-name +gchar* + +rw +Client name +The client name of the Jack instance (NULL = default). +NULL + + + +GstJackAudioSink::client +JackClient* + +rw +JackClient +Handle for jack client. + + + + +GstJackAudioSink::connect +GstJackConnect + +rw +Connect +Specify how the output ports will be connected. +Automatically connect ports to physical ports + + + +GstJackAudioSink::server +gchar* + +rw +Server +The Jack server to connect to (NULL = default). +NULL + + + +GstJackAudioSink::client-name +gchar* + +rw +Client name +The client name of the Jack instance (NULL = default). +NULL + + + +GstFlacParse::check-frame-checksums +gboolean + +rw +Check Frame Checksums +Check the overall checksums of every frame. +FALSE + + + +GstV4l2Radio::device +gchar* + +rw +Radio device location +Video4Linux2 radio device location. +"/dev/radio0" + + + +GstV4l2Radio::frequency +gint +[87500000,108000000] +rw +Station frequency +Station frequency in Hz. +100000000 + + + +GstQTMux::dts-method +GstQTMuxDtsMethods + +rwx +dts-method +Method to determine DTS time. +reorder + + + +GstQTMux::faststart +gboolean + +rw +Format file to faststart +If the file should be formatted for faststart (headers first). +FALSE + + + +GstQTMux::faststart-file +gchar* + +rwx +File to use for storing buffers +File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. +NULL + + + +GstQTMux::fragment-duration +guint + +rwx +Fragment duration +Fragment durations in ms (produce a fragmented file if > 0). +0 + + + +GstQTMux::moov-recovery-file +gchar* + +rwx +File to store data for posterior moov atom recovery +File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). +NULL + + + +GstQTMux::movie-timescale +guint +>= 1 +rwx +Movie timescale +Timescale to use in the movie (units per second). +1000 + + + +GstQTMux::presentation-time +gboolean + +rwx +Include presentation-time info +Calculate and include presentation/composition time (in addition to decoding time). +TRUE + + + +GstQTMux::streamable +gboolean + +rwx +Streamable +If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. +FALSE + + + +GstQTMux::trak-timescale +guint + +rwx +Track timescale +Timescale to use for the tracks (units per second, 0 is automatic). +0 + + + +GstQTMoovRecover::broken-input +gchar* + +rw +Path to broken input file +Path to broken input file. (If qtmux was on faststart mode, this file is the faststart file). +NULL + + + +GstQTMoovRecover::faststart-mode +gboolean + +rw +If the broken input is from faststart mode +If the broken input is from faststart mode. +FALSE + + + +GstQTMoovRecover::fixed-output +gchar* + +rw +Path to write the fixed file +Path to write the fixed file to (used as output). +NULL + + + +GstQTMoovRecover::recovery-input +gchar* + +rw +Path to recovery file +Path to recovery file (used as input). +NULL + + + +GstMP4Mux::dts-method +GstQTMuxDtsMethods + +rwx +dts-method +Method to determine DTS time. +reorder + + + +GstMP4Mux::faststart +gboolean + +rw +Format file to faststart +If the file should be formatted for faststart (headers first). +FALSE + + + +GstMP4Mux::faststart-file +gchar* + +rwx +File to use for storing buffers +File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. +NULL + + + +GstMP4Mux::fragment-duration +guint + +rwx +Fragment duration +Fragment durations in ms (produce a fragmented file if > 0). +0 + + + +GstMP4Mux::moov-recovery-file +gchar* + +rwx +File to store data for posterior moov atom recovery +File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). +NULL + + + +GstMP4Mux::movie-timescale +guint +>= 1 +rwx +Movie timescale +Timescale to use in the movie (units per second). +1000 + + + +GstMP4Mux::presentation-time +gboolean + +rwx +Include presentation-time info +Calculate and include presentation/composition time (in addition to decoding time). +TRUE + + + +GstMP4Mux::streamable +gboolean + +rwx +Streamable +If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. +FALSE + + + +GstMP4Mux::trak-timescale +guint + +rwx +Track timescale +Timescale to use for the tracks (units per second, 0 is automatic). +0 + + + +GstMJ2Mux::dts-method +GstQTMuxDtsMethods + +rwx +dts-method +Method to determine DTS time. +reorder + + + +GstMJ2Mux::faststart +gboolean + +rw +Format file to faststart +If the file should be formatted for faststart (headers first). +FALSE + + + +GstMJ2Mux::faststart-file +gchar* + +rwx +File to use for storing buffers +File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. +NULL + + + +GstMJ2Mux::fragment-duration +guint + +rwx +Fragment duration +Fragment durations in ms (produce a fragmented file if > 0). +0 + + + +GstMJ2Mux::moov-recovery-file +gchar* + +rwx +File to store data for posterior moov atom recovery +File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). +NULL + + + +GstMJ2Mux::movie-timescale +guint +>= 1 +rwx +Movie timescale +Timescale to use in the movie (units per second). +1000 + + + +GstMJ2Mux::presentation-time +gboolean + +rwx +Include presentation-time info +Calculate and include presentation/composition time (in addition to decoding time). +TRUE + + + +GstMJ2Mux::streamable +gboolean + +rwx +Streamable +If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. +FALSE + + + +GstMJ2Mux::trak-timescale +guint + +rwx +Track timescale +Timescale to use for the tracks (units per second, 0 is automatic). +0 + + + +GstISMLMux::dts-method +GstQTMuxDtsMethods + +rwx +dts-method +Method to determine DTS time. +reorder + + + +GstISMLMux::faststart +gboolean + +rw +Format file to faststart +If the file should be formatted for faststart (headers first). +FALSE + + + +GstISMLMux::faststart-file +gchar* + +rwx +File to use for storing buffers +File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. +NULL + + + +GstISMLMux::fragment-duration +guint + +rwx +Fragment duration +Fragment durations in ms (produce a fragmented file if > 0). +2000 + + + +GstISMLMux::moov-recovery-file +gchar* + +rwx +File to store data for posterior moov atom recovery +File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). +NULL + + + +GstISMLMux::movie-timescale +guint +>= 1 +rwx +Movie timescale +Timescale to use in the movie (units per second). +1000 + + + +GstISMLMux::presentation-time +gboolean + +rwx +Include presentation-time info +Calculate and include presentation/composition time (in addition to decoding time). +TRUE + + + +GstISMLMux::streamable +gboolean + +rwx +Streamable +If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. +FALSE + + + +GstISMLMux::trak-timescale +guint + +rwx +Track timescale +Timescale to use for the tracks (units per second, 0 is automatic). +0 + + + +GstGPPMux::dts-method +GstQTMuxDtsMethods + +rwx +dts-method +Method to determine DTS time. +reorder + + + +GstGPPMux::faststart +gboolean + +rw +Format file to faststart +If the file should be formatted for faststart (headers first). +FALSE + + + +GstGPPMux::faststart-file +gchar* + +rwx +File to use for storing buffers +File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. +NULL + + + +GstGPPMux::fragment-duration +guint + +rwx +Fragment duration +Fragment durations in ms (produce a fragmented file if > 0). +0 + + + +GstGPPMux::moov-recovery-file +gchar* + +rwx +File to store data for posterior moov atom recovery +File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). +NULL + + + +GstGPPMux::movie-timescale +guint +>= 1 +rwx +Movie timescale +Timescale to use in the movie (units per second). +1000 + + + +GstGPPMux::presentation-time +gboolean + +rwx +Include presentation-time info +Calculate and include presentation/composition time (in addition to decoding time). +TRUE + + + +GstGPPMux::streamable +gboolean + +rwx +Streamable +If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. +FALSE + + + +GstGPPMux::trak-timescale +guint + +rwx +Track timescale +Timescale to use for the tracks (units per second, 0 is automatic). +0 + + + +Gst3GPPMux::dts-method +GstQTMuxDtsMethods + +rwx +dts-method +Method to determine DTS time. +reorder + + + +Gst3GPPMux::faststart +gboolean + +rw +Format file to faststart +If the file should be formatted for faststart (headers first). +FALSE + + + +Gst3GPPMux::faststart-file +gchar* + +rwx +File to use for storing buffers +File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. +NULL + + + +Gst3GPPMux::fragment-duration +guint + +rwx +Fragment duration +Fragment durations in ms (produce a fragmented file if > 0). +0 + + + +Gst3GPPMux::moov-recovery-file +gchar* + +rwx +File to store data for posterior moov atom recovery +File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). +NULL + + + +Gst3GPPMux::movie-timescale +guint +>= 1 +rwx +Movie timescale +Timescale to use in the movie (units per second). +1000 + + + +Gst3GPPMux::presentation-time +gboolean + +rwx +Include presentation-time info +Calculate and include presentation/composition time (in addition to decoding time). +TRUE + + + +Gst3GPPMux::streamable +gboolean + +rwx +Streamable +If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. +FALSE + + + +Gst3GPPMux::trak-timescale +guint + +rwx +Track timescale +Timescale to use for the tracks (units per second, 0 is automatic). +0 + + + +GstSplitFileSrc::location +gchar* + +rw +File Location +Wildcard pattern to match file names of the input files. If the location is an absolute path or contains directory components, only the base file name part will be considered for pattern matching. The results will be sorted. +NULL + + + +GstMatroskaDemux::max-gap-time +guint64 + +rw +Maximum gap time +The demuxer sends out newsegment events for skipping gaps longer than this (0 = disabled). +2000000000 + + + +GstPulseAudioSink::alignment-threshold +guint64 +[1,18446744073709551614] +rw +Alignment Threshold +Timestamp alignment threshold in nanoseconds. +40000000 + + + +GstPulseAudioSink::async +gboolean + +rw +Async +Go asynchronously to PAUSED. +TRUE + + + +GstPulseAudioSink::blocksize +guint + +rw +Block size +Size in bytes to pull per buffer (0 = default). +4096 + + + +GstPulseAudioSink::buffer-time +gint64 +>= 1 +rw +Buffer Time +Size of audio buffer in microseconds. +200000 + + + +GstPulseAudioSink::can-activate-pull +gboolean + +rw +Allow Pull Scheduling +Allow pull-based scheduling. +FALSE + + + +GstPulseAudioSink::client +gchar* + +rw +Client +The PulseAudio client name to use. +"lt-gst-plugins-good-plugins-scan" + + + +GstPulseAudioSink::device +gchar* + +rw +Device +The PulseAudio sink device to connect to. +NULL + + + +GstPulseAudioSink::device-name +gchar* + +r +Device name +Human-readable name of the sound device. +NULL + + + +GstPulseAudioSink::discont-wait +guint64 +<= 18446744073709551614 +rw +Discont Wait +Window of time in nanoseconds to wait before creating a discontinuity. +1000000000 + + + +GstPulseAudioSink::drift-tolerance +gint64 +>= 1 +rw +Drift Tolerance +Tolerance for clock drift in microseconds. +40000 + + + +GstPulseAudioSink::enable-last-buffer +gboolean + +rw +Enable Last Buffer +Enable the last-buffer property. +TRUE + + + +GstPulseAudioSink::last-buffer +GstBuffer* + +r +Last Buffer +The last buffer received in the sink. + + + + +GstPulseAudioSink::latency-time +gint64 +>= 1 +rw +Latency Time +Audio latency in microseconds. +10000 + + + +GstPulseAudioSink::max-lateness +gint64 +>= G_MAXULONG +rw +Max Lateness +Maximum number of nanoseconds that a buffer can be late before it is dropped (-1 unlimited). +-1 + + + +GstPulseAudioSink::mute +gboolean + +rw +Mute +Mute state of this stream. +FALSE + + + +GstPulseAudioSink::preroll-queue-len +guint + +rwx +Preroll queue length +Number of buffers to queue during preroll. +0 + + + +GstPulseAudioSink::provide-clock +gboolean + +rw +Provide Clock +Provide a clock to be used as the global pipeline clock. +TRUE + + + +GstPulseAudioSink::qos +gboolean + +rw +Qos +Generate Quality-of-Service events upstream. +FALSE + + + +GstPulseAudioSink::render-delay +guint64 + +rw +Render Delay +Additional render delay of the sink in nanoseconds. +0 + + + +GstPulseAudioSink::server +gchar* + +rw +Server +The PulseAudio server to connect to. +NULL + + + +GstPulseAudioSink::slave-method +GstBaseAudioSinkSlaveMethod + +rw +Slave Method +Algorithm to use to match the rate of the masterclock. +GST_BASE_AUDIO_SINK_SLAVE_SKEW + + + +GstPulseAudioSink::stream-properties +GstStructure* + +rw +stream properties +list of pulseaudio stream properties. + + + + +GstPulseAudioSink::sync +gboolean + +rw +Sync +Sync on the clock. +TRUE + + + +GstPulseAudioSink::throttle-time +guint64 + +rw +Throttle time +The time to keep between rendered buffers (unused). +0 + + + +GstPulseAudioSink::ts-offset +gint64 + +rw +TS Offset +Timestamp offset in nanoseconds. +0 + + + +GstPulseAudioSink::volume +gdouble +[0,10] +rw +Volume +Linear volume of this stream, 1.0=100%. +1 + + + +GstSoupHttpClientSink::automatic-redirect +gboolean + +rw +automatic-redirect +Automatically follow HTTP redirects (HTTP Status Code 3xx). +TRUE + + + +GstSoupHttpClientSink::cookies +GStrv + +rw +Cookies +HTTP request cookies. + + + + +GstSoupHttpClientSink::location +gchar* + +rw +Location +URI to send to. +"" + + + +GstSoupHttpClientSink::proxy +gchar* + +rw +Proxy +HTTP proxy server URI. +"" + + + +GstSoupHttpClientSink::proxy-id +gchar* + +rw +proxy-id +user id for proxy authentication. +"" + + + +GstSoupHttpClientSink::proxy-pw +gchar* + +rw +proxy-pw +user password for proxy authentication. +"" + + + +GstSoupHttpClientSink::session +SoupSession* + +rw +session +SoupSession object to use for communication. + + + + +GstSoupHttpClientSink::user-agent +gchar* + +rw +User-Agent +Value of the User-Agent HTTP request header field. +"GStreamer souphttpclientsink " + + + +GstSoupHttpClientSink::user-id +gchar* + +rw +user-id +user id for authentication. +"" + + + +GstSoupHttpClientSink::user-pw +gchar* + +rw +user-pw +user password for authentication. +"" + + diff --git a/docs/plugins/gst-plugins-good-plugins.hierarchy b/docs/plugins/gst-plugins-good-plugins.hierarchy new file mode 100644 index 0000000..3288bab --- /dev/null +++ b/docs/plugins/gst-plugins-good-plugins.hierarchy @@ -0,0 +1,323 @@ +GObject + GdkPixbuf + GstCmmlTagClip + GstCmmlTagHead + GstCmmlTagStream + GstColorBalanceChannel + GstMixerTrack + GstMixerOptions + GstObject + GstBus + GstClock + GstSystemClock + GstAudioClock + GstElement + Gst3GPPMux + GstALawDec + GstALawEnc + GstAsteriskh263 + GstAuParse + GstAudioDecoder + GstSpeexDec + GstAudioEncoder + GstFlacEnc + GstSpeexEnc + GstAviDemux + GstAviMux + GstAviSubtitle + GstBaseParse + GstAacParse + GstAc3Parse + GstAmrParse + GstDcaParse + GstFlacParse + GstMpegAudioParse + GstBaseRTPDepayload + GstRTPBVDepay + GstRTPDVDepay + GstRTPGSMDepay + GstRTPSirenDepay + GstRTPiLBCDepay + GstRtpAC3Depay + GstRtpAMRDepay + GstRtpCELTDepay + GstRtpG722Depay + GstRtpG723Depay + GstRtpG726Depay + GstRtpG729Depay + GstRtpGSTDepay + GstRtpH263Depay + GstRtpH263PDepay + GstRtpH264Depay + GstRtpJ2KDepay + GstRtpJPEGDepay + GstRtpL16Depay + GstRtpMP1SDepay + GstRtpMP2TDepay + GstRtpMP4ADepay + GstRtpMP4GDepay + GstRtpMP4VDepay + GstRtpMPADepay + GstRtpMPARobustDepay + GstRtpMPVDepay + GstRtpPcmaDepay + GstRtpPcmuDepay + GstRtpQCELPDepay + GstRtpQDM2Depay + GstRtpSPEEXDepay + GstRtpSV3VDepay + GstRtpTheoraDepay + GstRtpVRawDepay + GstRtpVorbisDepay + GstRtpXQTDepay + GstBaseRTPPayload + GstBaseRTPAudioPayload + GstRTPBVPay + GstRTPILBCPay + GstRTPSirenPay + GstRtpG722Pay + GstRtpG726Pay + GstRtpL16Pay + GstRtpPcmaPay + GstRtpPcmuPay + GstRTPDVPay + GstRTPG723Pay + GstRTPG729Pay + GstRTPGSMPay + GstRTPMP2TPay + GstRTPMPVPay + GstRtpAC3Pay + GstRtpAMRPay + GstRtpCELTPay + GstRtpGSTPay + GstRtpH263PPay + GstRtpH263Pay + GstRtpH264Pay + GstRtpJ2KPay + GstRtpJPEGPay + GstRtpMP4APay + GstRtpMP4GPay + GstRtpMP4VPay + GstRtpMPAPay + GstRtpSPEEXPay + GstRtpTheoraPay + GstRtpVRawPay + GstRtpVorbisPay + GstBaseSink + GstAASink + GstBaseAudioSink + GstAudioSink + GstEsdSink + GstOss4Sink + GstOssSink + GstJackAudioSink + GstPulseSink + GstCACASink + GstDynUDPSink + GstMultiFileSink + GstMultiUDPSink + GstUDPSink + GstShout2send + GstSoupHttpClientSink + GstTest + GstVideoSink + GstGdkPixbufSink + GstBaseSrc + GstPushSrc + GstBaseAudioSrc + GstAudioSrc + GstOss4Source + GstOssSrc + GstPulseSrc + GstJackAudioSrc + GstDV1394Src + GstHDV1394Src + GstMultiFileSrc + GstSoupHTTPSrc + GstUDPSrc + GstV4l2Src + GstXImageSrc + GstSplitFileSrc + GstBaseTransform + GstAudioFilter + GstAudioAmplify + GstAudioDynamic + GstAudioEcho + GstAudioFXBaseFIRFilter + GstAudioFIRFilter + GstAudioWSincBand + GstAudioWSincLimit + GstAudioFXBaseIIRFilter + GstAudioChebBand + GstAudioChebLimit + GstAudioIIRFilter + GstAudioInvert + GstAudioKaraoke + GstIirEqualizer + GstIirEqualizer10Bands + GstIirEqualizer3Bands + GstIirEqualizerNBands + GstSpectrum + GstAudioPanorama + GstBreakMyData + GstCairoTimeOverlay + GstCapsSetter + GstCpuReport + GstLevel + GstNavSeek + GstPixbufScale + GstProgressReport + GstRgAnalysis + GstRgLimiter + GstTagInject + GstVideoBox + GstVideoCrop + GstVideoFilter + GstAgingTV + GstAlpha + GstAlphaColor + GstCairoOverlay + GstDiceTV + GstEdgeTV + GstGamma + GstNavigationtest + GstOpTV + GstQuarkTV + GstRadioacTV + GstRevTV + GstRippleTV + GstSMPTEAlpha + GstShagadelicTV + GstStreakTV + GstVertigoTV + GstVideoBalance + GstVideoFlip + GstWarpTV + GstBin + GstAspectRatioCrop + GstAutoAudioSink + GstAutoAudioSrc + GstAutoVideoSink + GstAutoVideoSrc + GstHalAudioSink + GstHalAudioSrc + GstPipeline + GstQTMoovRecover + GstPulseAudioSink + GstPushFileSrc + GstRTSPSrc + GstRgVolume + GstRtpBin + GstSwitchSink + GstGConfAudioSink + GstGConfVideoSink + GstSwitchSrc + GstGConfAudioSrc + GstGConfVideoSrc + GstCairoRender + GstCairoTextOverlay + GstCapsDebug + GstCmmlDec + GstCmmlEnc + GstCutter + GstDVDec + GstDVDemux + GstDeinterlace + GstDeinterleave + GstEFence + GstFlacDec + GstFlacTag + GstFlvDemux + GstFlvMux + GstFlxDec + GstGPPMux + GstGdkPixbuf + GstGoom + GstGoom2k1 + GstICYDemux + GstISMLMux + GstImageFreeze + GstInterleave + GstJpegDec + GstJpegEnc + GstMJ2Mux + GstMP4Mux + GstMatroskaDemux + GstMatroskaMux + GstWebMMux + GstMatroskaParse + GstMuLawDec + GstMuLawEnc + GstMultipartDemux + GstMultipartMux + GstOss4Mixer + GstOssMixerElement + GstPngDec + GstPngEnc + GstPulseMixer + GstQTDemux + GstQTMux + GstRTPDec + GstRTPDepay + GstRndBufferSize + GstRtpJitterBuffer + GstRtpPtDemux + GstRtpSession + GstRtpSsrcDemux + GstSMPTE + GstShapeWipe + GstSmokeDec + GstSmokeEnc + GstTagDemux + GstApeDemux + GstID3Demux + GstTagLibMux + GstApev2Mux + GstId3v2Mux + GstV4l2Radio + GstVideoMixer + GstVideoMixer2 + GstWavEnc + GstWavParse + GstWavpackDec + GstWavpackEnc + GstWavpackParse + GstY4mEncode + GstPad + GstInterleavePad + GstVideoMixer2Pad + GstVideoMixerPad + GstPadTemplate + GstPlugin + GstPluginFeature + GstElementFactory + GstIndexFactory + GstTypeFindFactory + GstRegistry + GstRingBuffer + GstAudioSinkRingBuffer + GstAudioSrcRingBuffer + GstJackAudioSinkRingBuffer + GstJackAudioSrcRingBuffer + GstTask + GstTaskPool + GstSignalObject + GstTunerChannel + GstTunerNorm + RTPSession + SoupSession +GInterface + GIcon + GTypePlugin + GstChildProxy + GstColorBalance + GstImplementsInterface + GstMixer + GstPreset + GstPropertyProbe + GstStreamVolume + GstTagSetter + GstTagXmpWriter + GstTuner + GstURIHandler + GstVideoOrientation diff --git a/docs/plugins/gst-plugins-good-plugins.interfaces b/docs/plugins/gst-plugins-good-plugins.interfaces new file mode 100644 index 0000000..b356c99 --- /dev/null +++ b/docs/plugins/gst-plugins-good-plugins.interfaces @@ -0,0 +1,68 @@ +GdkPixbuf GIcon +Gst3GPPMux GstTagSetter GstTagXmpWriter +GstApev2Mux GstTagSetter +GstAspectRatioCrop GstChildProxy +GstAudioEncoder GstPreset +GstAutoAudioSink GstChildProxy +GstAutoAudioSrc GstChildProxy +GstAutoVideoSink GstChildProxy +GstAutoVideoSrc GstChildProxy +GstAviMux GstTagSetter +GstBin GstChildProxy +GstDV1394Src GstURIHandler GstPropertyProbe +GstDeinterlace GstChildProxy +GstFlacEnc GstPreset GstTagSetter +GstFlacEnc GstTagSetter GstPreset +GstFlacTag GstTagSetter +GstFlvMux GstTagSetter +GstGConfAudioSink GstChildProxy +GstGConfAudioSrc GstChildProxy +GstGConfVideoSink GstChildProxy +GstGConfVideoSrc GstChildProxy +GstGPPMux GstTagSetter GstTagXmpWriter +GstHDV1394Src GstURIHandler GstPropertyProbe +GstHalAudioSink GstChildProxy +GstHalAudioSrc GstChildProxy +GstISMLMux GstTagSetter GstTagXmpWriter +GstId3v2Mux GstTagSetter +GstIirEqualizer GstChildProxy +GstIirEqualizer10Bands GstChildProxy GstPreset +GstIirEqualizer3Bands GstChildProxy GstPreset +GstIirEqualizerNBands GstChildProxy +GstMJ2Mux GstTagSetter GstTagXmpWriter +GstMP4Mux GstTagSetter GstTagXmpWriter +GstMatroskaMux GstTagSetter +GstOss4Mixer GstImplementsInterface GstMixer GstPropertyProbe +GstOss4Sink GstStreamVolume GstPropertyProbe +GstOss4Source GstImplementsInterface GstMixer GstPropertyProbe +GstOssMixerElement GstImplementsInterface GstMixer +GstOssSrc GstImplementsInterface GstMixer +GstPipeline GstChildProxy +GstPulseAudioSink GstChildProxy +GstPulseMixer GstImplementsInterface GstMixer GstPropertyProbe +GstPulseSink GstStreamVolume GstImplementsInterface GstPropertyProbe +GstPulseSrc GstImplementsInterface GstMixer GstPropertyProbe +GstPulseSrc GstStreamVolume GstImplementsInterface GstMixer GstPropertyProbe +GstPushFileSrc GstChildProxy GstURIHandler +GstQTMoovRecover GstChildProxy +GstQTMux GstTagSetter GstTagXmpWriter +GstRTSPSrc GstChildProxy GstURIHandler +GstRgVolume GstChildProxy +GstRtpBin GstChildProxy +GstShout2send GstTagSetter +GstSoupHTTPSrc GstURIHandler +GstSpeexEnc GstPreset GstTagSetter +GstSpeexEnc GstTagSetter GstPreset +GstSwitchSink GstChildProxy +GstSwitchSrc GstChildProxy +GstTagLibMux GstTagSetter +GstUDPSink GstURIHandler +GstUDPSrc GstURIHandler +GstV4l2Radio GstURIHandler GstImplementsInterface GstTuner GstPropertyProbe +GstV4l2Sink GstImplementsInterface GstXOverlay GstNavigation GstColorBalance GstVideoOrientation GstPropertyProbe +GstV4l2Src GstURIHandler GstImplementsInterface GstTuner GstColorBalance GstVideoOrientation GstPropertyProbe +GstVideoBalance GstImplementsInterface GstColorBalance +GstVideoMixer GstChildProxy +GstVideoMixer2 GstChildProxy +GstWavpackEnc GstPreset +GstWebMMux GstTagSetter diff --git a/docs/plugins/gst-plugins-good-plugins.prerequisites b/docs/plugins/gst-plugins-good-plugins.prerequisites new file mode 100644 index 0000000..5c212bb --- /dev/null +++ b/docs/plugins/gst-plugins-good-plugins.prerequisites @@ -0,0 +1,11 @@ +GIcon GObject +GstChildProxy GstObject +GstColorBalance GstImplementsInterface GstElement +GstImplementsInterface GstElement +GstMixer GstImplementsInterface GstElement +GstStreamVolume GObject +GstTagSetter GstElement +GstTagXmpWriter GstElement +GstTuner GstImplementsInterface GstElement +GstVideoOrientation GstImplementsInterface GstElement +GstXOverlay GstImplementsInterface GstElement diff --git a/docs/plugins/gst-plugins-good-plugins.signals b/docs/plugins/gst-plugins-good-plugins.signals new file mode 100644 index 0000000..a68d13b --- /dev/null +++ b/docs/plugins/gst-plugins-good-plugins.signals @@ -0,0 +1,682 @@ + +GstQTDemux::got-redirect +void +GstQTDemux *gstqtdemux +gchar *arg1 + + + +GstGSMEnc::frame-encoded +void +GstGSMEnc *gstgsmenc + + + +GstMultiUDPSink::add +void +la +GstMultiUDPSink *gstmultiudpsink +gchar *arg1 +gint arg2 + + + +GstMultiUDPSink::clear +void +la +GstMultiUDPSink *gstmultiudpsink + + + +GstMultiUDPSink::client-added +void +l +GstMultiUDPSink *gstmultiudpsink +gchar *arg1 +gint arg2 + + + +GstMultiUDPSink::client-removed +void +l +GstMultiUDPSink *gstmultiudpsink +gchar *arg1 +gint arg2 + + + +GstMultiUDPSink::get-stats +GValueArray* +la +GstMultiUDPSink *gstmultiudpsink +gchar *arg1 +gint arg2 + + + +GstMultiUDPSink::remove +void +la +GstMultiUDPSink *gstmultiudpsink +gchar *arg1 +gint arg2 + + + +GstDynUDPSink::get-stats +GValueArray* +l +GstDynUDPSink *gstdynudpsink +gchar *arg1 +gint arg2 + + + +GstFdSrc::timeout +void +GstFdSrc *gstfdsrc + + + +GstDiceTV::reset +void +GstDiceTV *gstdicetv + + + +GstVertigoTV::reset-parms +void +GstVertigoTV *gstvertigotv + + + +GstShout2send::connection-problem +void +c +GstShout2send *gstshout2send +gint arg1 + + + +DV1394Src::frame-dropped +void +DV1394Src *dv1394src + + + +GstJpegEnc::frame-encoded +void +l +GstJpegEnc *gstjpegenc + + + +GstAASink::frame-displayed +void +l +GstAASink *gstaasink + + + +GstAASink::have-size +void +l +GstAASink *gstaasink +guint arg1 +guint arg2 + + + +GstMultiFdSink::add +void +GstMultiFdSink *gstmultifdsink +gint arg1 + + + +GstMultiFdSink::clear +void +GstMultiFdSink *gstmultifdsink + + + +GstMultiFdSink::client-added +void +GstMultiFdSink *gstmultifdsink +gint arg1 + + + +GstMultiFdSink::client-removed +void +GstMultiFdSink *gstmultifdsink +gint arg1 +GstClientStatus arg2 + + + +GstMultiFdSink::get-stats +GValueArray* +GstMultiFdSink *gstmultifdsink +gint arg1 + + + +GstMultiFdSink::remove +void +GstMultiFdSink *gstmultifdsink +gint arg1 + + + +GstDecodeBin::new-decoded-pad +void +GstDecodeBin *gstdecodebin +GstPad *arg1 +gboolean arg2 + + + +GstDecodeBin::removed-decoded-pad +void +GstDecodeBin *gstdecodebin +GstPad *arg1 + + + +GstDecodeBin::unknown-type +void +GstDecodeBin *gstdecodebin +GstPad *arg1 +GstCaps *arg2 + + + +GstFakeSrc::handoff +void +GstFakeSrc *gstfakesrc +GstBuffer arg1 +GstPad *arg2 + + + +GstFakeSink::handoff +void +GstFakeSink *gstfakesink +GstBuffer arg1 +GstPad *arg2 + + + +GstIdentity::handoff +void +GstIdentity *gstidentity +GstBuffer arg1 + + + +GstTypeFindElement::have-type +void +GstTypeFindElement *gsttypefindelement +guint arg1 +GstCaps *arg2 + + + +GstQueue::overrun +void +GstQueue *gstqueue + + + +GstQueue::running +void +GstQueue *gstqueue + + + +GstQueue::underrun +void +GstQueue *gstqueue + + + +GstBin::element-added +void +GstBin *gstbin +GstElement *arg1 + + + +GstBin::element-removed +void +GstBin *gstbin +GstElement *arg1 + + + +GstDV1394Src::frame-dropped +void +l +GstDV1394Src *gstdv1394src + + + +GstRTPDec::clear-pt-map +void +l +GstRTPDec *gstrtpdec + + + +GstRTPDec::request-pt-map +GstCaps* +l +GstRTPDec *gstrtpdec +guint arg1 +guint arg2 + + + +GstRTPDec::on-bye-ssrc +void +l +GstRTPDec *gstrtpdec +guint arg1 +guint arg2 + + + +GstRTPDec::on-bye-timeout +void +l +GstRTPDec *gstrtpdec +guint arg1 +guint arg2 + + + +GstRTPDec::on-new-ssrc +void +l +GstRTPDec *gstrtpdec +guint arg1 +guint arg2 + + + +GstRTPDec::on-ssrc-collision +void +l +GstRTPDec *gstrtpdec +guint arg1 +guint arg2 + + + +GstRTPDec::on-ssrc-validated +void +l +GstRTPDec *gstrtpdec +guint arg1 +guint arg2 + + + +GstRTPDec::on-timeout +void +l +GstRTPDec *gstrtpdec +guint arg1 +guint arg2 + + + +GstAudioFIRFilter::rate-changed +void +l +GstAudioFIRFilter *gstaudiofirfilter +gint arg1 + + + +GstAudioIIRFilter::rate-changed +void +l +GstAudioIIRFilter *gstaudioiirfilter +gint arg1 + + + +GstRtpBin::clear-pt-map +void +la +GstRtpBin *gstrtpbin + + + +GstRtpBin::get-internal-session +RTPSession* +la +GstRtpBin *gstrtpbin +guint arg1 + + + +GstRtpBin::on-bye-ssrc +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-bye-timeout +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-new-ssrc +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-npt-stop +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-sender-timeout +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-ssrc-active +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-ssrc-collision +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-ssrc-sdes +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-ssrc-validated +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::on-timeout +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::request-pt-map +GstCaps* +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpBin::reset-sync +void +la +GstRtpBin *gstrtpbin + + + +GstRtpBin::payload-type-change +void +l +GstRtpBin *gstrtpbin +guint arg1 +guint arg2 + + + +GstRtpJitterBuffer::clear-pt-map +void +la +GstRtpJitterBuffer *gstrtpjitterbuffer + + + +GstRtpJitterBuffer::handle-sync +void +l +GstRtpJitterBuffer *gstrtpjitterbuffer +GstStructure *arg1 + + + +GstRtpJitterBuffer::on-npt-stop +void +l +GstRtpJitterBuffer *gstrtpjitterbuffer + + + +GstRtpJitterBuffer::request-pt-map +GstCaps* +l +GstRtpJitterBuffer *gstrtpjitterbuffer +guint arg1 + + + +GstRtpJitterBuffer::set-active +guint64 +la +GstRtpJitterBuffer *gstrtpjitterbuffer +gboolean arg1 +guint64 arg2 + + + +GstRtpPtDemux::clear-pt-map +void +la +GstRtpPtDemux *gstrtpptdemux + + + +GstRtpPtDemux::new-payload-type +void +l +GstRtpPtDemux *gstrtpptdemux +guint arg1 +GstPad *arg2 + + + +GstRtpPtDemux::payload-type-change +void +l +GstRtpPtDemux *gstrtpptdemux +guint arg1 + + + +GstRtpPtDemux::request-pt-map +GstCaps* +l +GstRtpPtDemux *gstrtpptdemux +guint arg1 + + + +GstRtpSession::clear-pt-map +void +a +GstRtpSession *gstrtpsession + + + +GstRtpSession::on-bye-ssrc +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::on-bye-timeout +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::on-new-ssrc +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::on-sender-timeout +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::on-ssrc-active +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::on-ssrc-collision +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::on-ssrc-sdes +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::on-ssrc-validated +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::on-timeout +void +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSession::request-pt-map +GstCaps* +l +GstRtpSession *gstrtpsession +guint arg1 + + + +GstRtpSsrcDemux::clear-ssrc +void +la +GstRtpSsrcDemux *gstrtpssrcdemux +guint arg1 + + + +GstRtpSsrcDemux::new-ssrc-pad +void +l +GstRtpSsrcDemux *gstrtpssrcdemux +guint arg1 +GstPad *arg2 + + + +GstRtpSsrcDemux::removed-ssrc-pad +void +l +GstRtpSsrcDemux *gstrtpssrcdemux +guint arg1 +GstPad *arg2 + + + +GstCairoOverlay::caps-changed +void + +GstCairoOverlay *gstcairooverlay +GstCaps *arg1 + + + +GstCairoOverlay::draw +void + +GstCairoOverlay *gstcairooverlay +CairoContext *arg1 +guint64 arg2 +guint64 arg3 + + diff --git a/docs/plugins/gst-plugins-good-plugins.types b/docs/plugins/gst-plugins-good-plugins.types new file mode 100644 index 0000000..63f6ec1 --- /dev/null +++ b/docs/plugins/gst-plugins-good-plugins.types @@ -0,0 +1,5 @@ +#include + +type:GstIirEqualizer +type:GstVideoMixerPad +type:GstVideoMixer2Pad diff --git a/docs/plugins/html/GstIirEqualizer.html b/docs/plugins/html/GstIirEqualizer.html new file mode 100644 index 0000000..f2f24cd --- /dev/null +++ b/docs/plugins/html/GstIirEqualizer.html @@ -0,0 +1,86 @@ + + + + +GstIirEqualizer + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GstIirEqualizer

+

GstIirEqualizer

+
+
+

Synopsis

+
struct              GstIirEqualizer;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstIirEqualizer
+                                 +----GstIirEqualizer10Bands
+                                 +----GstIirEqualizer3Bands
+                                 +----GstIirEqualizerNBands
+
+
+
+

Implemented Interfaces

+

+GstIirEqualizer implements + GstChildProxy.

+
+
+

Description

+

+

+
+
+

Details

+
+

struct GstIirEqualizer

+
struct GstIirEqualizer;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/GstVideoMixer2Pad.html b/docs/plugins/html/GstVideoMixer2Pad.html new file mode 100644 index 0000000..da05240 --- /dev/null +++ b/docs/plugins/html/GstVideoMixer2Pad.html @@ -0,0 +1,73 @@ + + + + +GstVideoMixer2Pad + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GstVideoMixer2Pad

+

GstVideoMixer2Pad

+
+
+

Synopsis

+
struct              GstVideoMixer2Pad;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstPad
+               +----GstVideoMixer2Pad
+
+
+
+

Description

+

+

+
+
+

Details

+
+

struct GstVideoMixer2Pad

+
struct GstVideoMixer2Pad;
+

+The opaque GstVideoMixer2Pad structure. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/GstVideoMixerPad.html b/docs/plugins/html/GstVideoMixerPad.html new file mode 100644 index 0000000..154948a --- /dev/null +++ b/docs/plugins/html/GstVideoMixerPad.html @@ -0,0 +1,116 @@ + + + + +GstVideoMixerPad + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GstVideoMixerPad

+

GstVideoMixerPad

+
+
+

Synopsis

+
struct              GstVideoMixerPad;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstPad
+               +----GstVideoMixerPad
+
+
+
+

Properties

+
+  "alpha"                    gdouble               : Read / Write
+  "xpos"                     gint                  : Read / Write
+  "ypos"                     gint                  : Read / Write
+  "zorder"                   guint                 : Read / Write
+
+
+
+

Description

+

+

+
+
+

Details

+
+

struct GstVideoMixerPad

+
struct GstVideoMixerPad;
+

+

+
+
+
+

Property Details

+
+

The "alpha" property

+
  "alpha"                    gdouble               : Read / Write
+

Alpha of the picture.

+

Allowed values: [0,1]

+

Default value: 1

+
+
+
+

The "xpos" property

+
  "xpos"                     gint                  : Read / Write
+

X Position of the picture.

+

Default value: 0

+
+
+
+

The "ypos" property

+
  "ypos"                     gint                  : Read / Write
+

Y Position of the picture.

+

Default value: 0

+
+
+
+

The "zorder" property

+
  "zorder"                   guint                 : Read / Write
+

Z Order of the picture.

+

Allowed values: <= 10000

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/ch01.html b/docs/plugins/html/ch01.html new file mode 100644 index 0000000..15c6d55 --- /dev/null +++ b/docs/plugins/html/ch01.html @@ -0,0 +1,533 @@ + + + + +gst-plugins-good Elements + + + + + + + + + + + + + + + + +
+

+gst-plugins-good Elements

+
+
+3gppmux — Muxer for 3GPP (.3gp) files +
+
+aacparse — AAC parser +
+
+aasink — An ASCII art videosink +
+
+ac3parse — AC3 parser +
+
+agingtv — AgingTV adds age to video input using scratches and dust +
+
+alpha — Adds an alpha channel to video - uniform or via chroma-keying +
+
+alphacolor — ARGB from/to AYUV colorspace conversion preserving the alpha channel +
+
+alawdec — Convert 8bit A law to 16bit PCM +
+
+alawenc — Convert 16bit PCM to 8bit A law +
+
+amrparse — AMR parser +
+
+apedemux — Read and output APE tags while demuxing the contents +
+
+apev2mux — Adds an APEv2 header to the beginning of files using taglib +
+
+aspectratiocrop — Crops video into a user-defined aspect-ratio +
+
+audioamplify — Amplifies an audio stream by a given factor +
+
+audiochebband — Chebyshev band pass and band reject filter +
+
+audiocheblimit — Chebyshev low pass and high pass filter +
+
+audiofirfilter — Generic audio FIR filter with custom filter kernel +
+
+audioiirfilter — Generic audio IIR filter with custom filter kernel +
+
+audiowsincband — Band pass and band reject windowed sinc filter +
+
+audiowsinclimit — Low pass and high pass windowed sinc filter +
+
+audioecho — Adds an echo or reverb effect to an audio stream +
+
+audiodynamic — Compressor and Expander +
+
+audioinvert — Swaps upper and lower half of audio samples +
+
+audiopanorama — Positions audio streams in the stereo panorama +
+
+audiokaraoke — Removes voice from sound +
+
+auparse — Parse an .au file into raw audio +
+
+autoaudiosink — Wrapper audio sink for automatically detected audio sink +
+
+autoaudiosrc — Wrapper audio source for automatically detected audio source +
+
+autovideosink — Wrapper video sink for automatically detected video sink +
+
+autovideosrc — Wrapper video source for automatically detected video source +
+
+avidemux — Demultiplex an avi file into audio and video +
+
+avimux — Muxes audio and video into an avi stream +
+
+avisubtitle — Parse avi subtitle stream +
+
+cacasink — A colored ASCII art videosink +
+
+cairotextoverlay — Adds text strings on top of a video buffer +
+
+cairotimeoverlay — Overlays the time on a video stream +
+
+cairorender — Encodes streams using Cairo +
+
+cairooverlay — Render overlay on a video stream using Cairo +
+
+capssetter — Set/merge caps on stream +
+
+cmmldec — Decodes CMML streams +
+
+cmmlenc — Encodes CMML streams +
+
+cutter — Audio Cutter to split audio into non-silent bits +
+
+dcaparse — DCA (DTS Coherent Acoustics) parser +
+
+deinterlace — Deinterlace Methods ported from DScaler/TvTime +
+
+deinterleave — Splits one interleaved multichannel audio stream into many mono audio streams +
+
+dicetv — 'Dices' the screen up into many small squares +
+
+directsoundsink — DirectSound audio sink +
+
+dv1394src — Source for DV video data from firewire port +
+
+dvdec — Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net) +
+
+dvdemux — Uses libdv to separate DV audio from DV video (libdv.sourceforge.net) +
+
+edgetv — Apply edge detect on video +
+
+equalizer-10bands — Direct Form 10 band IIR equalizer +
+
+equalizer-3bands — Direct Form 3 band IIR equalizer +
+
+equalizer-nbands — Direct Form IIR equalizer +
+
+esdsink — Plays audio to an esound server +
+
+flacdec — Decodes FLAC lossless audio streams +
+
+flacenc — Encodes audio with the FLAC lossless audio encoder +
+
+flacparse — Parses audio with the FLAC lossless audio codec +
+
+flactag — Rewrite tags in a FLAC file +
+
+flvdemux — Demux FLV feeds into digital streams +
+
+flvmux — Muxes video/audio streams into a FLV stream +
+
+flxdec — FLC/FLI/FLX video decoder +
+
+gamma — Adjusts gamma on a video stream +
+
+gconfaudiosrc — Audio source embedding the GConf-settings for audio input +
+
+gconfaudiosink — Audio sink embedding the GConf-settings for audio output +
+
+gconfvideosrc — Video source embedding the GConf-settings for video input +
+
+gconfvideosink — Video sink embedding the GConf-settings for video output +
+
+gdkpixbufsink — Output images as GdkPixbuf objects in bus messages +
+
+goom — Takes frames of data and outputs video frames using the GOOM filter +
+
+goom2k1 — Takes frames of data and outputs video frames using the GOOM 2k1 filter +
+
+gstrtpbin — Real-Time Transport Protocol bin +
+
+gstrtpjitterbuffer — A buffer that deals with network jitter and other transmission faults +
+
+gstrtpptdemux — Parses codec streams transmitted in the same RTP session +
+
+gstrtpsession — Implement an RTP session +
+
+gstrtpssrcdemux — Splits RTP streams based on the SSRC +
+
+halaudiosink — Audio sink for sound device access via HAL +
+
+halaudiosrc — Audio source for sound device access via HAL +
+
+hdv1394src — Source for MPEG-TS video data from firewire port +
+
+icydemux — Read and output ICY tags while demuxing the contents +
+
+id3demux — Read and output ID3v1 and ID3v2 tags while demuxing the contents +
+
+id3v2mux — Adds an ID3v2 header to the beginning of MP3 files using taglib +
+
+imagefreeze — Generates a still frame stream from an image +
+
+interleave — Folds many mono channels into one interleaved audio stream +
+
+ismlmux — Muxer for ISML smooth streaming (.isml) files +
+
+jackaudiosrc — Captures audio from a JACK server +
+
+jackaudiosink — Output audio to a JACK server +
+
+jpegdec — Decode images from JPEG format +
+
+jpegenc — Encode images in JPEG format +
+
+level — RMS/Peak/Decaying Peak Level messager for audio/raw +
+
+matroskamux — Muxes video/audio/subtitle streams into a matroska stream +
+
+matroskademux — Demuxes Matroska/WebM streams into video/audio/subtitles +
+
+mj2mux — Muxer for Motion JPEG-2000 (.mj2) files +
+
+monoscope — Displays a highly stabilised waveform of audio input +
+
+mpegaudioparse — MPEG audio parser +
+
+mp4mux — Muxer for ISO MPEG-4 (.mp4) files +
+
+mulawdec — Convert 8bit mu law to 16bit PCM +
+
+mulawenc — Convert 16bit PCM to 8bit mu law +
+
+multifilesink — Write buffers to a sequentially named set of files +
+
+multifilesrc — Read a sequentially named set of files into buffers +
+
+multipartdemux — demux multipart streams +
+
+multipartmux — mux multipart streams +
+
+multiudpsink — Send data over the network via UDP +
+
+optv — Optical art meets real-time video effect +
+
+oss4mixer — Control sound input and output levels with OSS4 +
+
+oss4sink — Output to a sound card via OSS version 4 +
+
+oss4src — Capture from a sound card via OSS version 4 +
+
+ossmixer — Control sound input and output levels with OSS +
+
+osssink — Output to a sound card via OSS +
+
+osssrc — Capture from a sound card via OSS +
+
+osxaudiosink — Output to a sound card in OS X +
+
+osxaudiosrc — Input from a sound card in OS X +
+
+osxvideosink — OSX native videosink +
+
+pngdec — Decode a png video frame to a raw image +
+
+pngenc — Encode a video frame to a .png image +
+
+progressreport — Periodically query and report on processing progress +
+
+pulsesink — Plays audio to a PulseAudio server +
+
+pulsesrc — Captures audio from a PulseAudio server +
+
+pulsemixer — Control sound input and output levels for PulseAudio +
+
+quarktv — Motion dissolver +
+
+qtdemux — Demultiplex a QuickTime file into audio and video streams +
+
+qtmux — Muxer for quicktime(.mov) files +
+
+qtmoovrecover — Utility element for recovering unfinished quicktime files +
+
+radioactv — motion-enlightment effect +
+
+revtv — A video waveform monitor for each line of video processed +
+
+rganalysis — Perform the ReplayGain analysis +
+
+rglimiter — Apply signal compression to raw audio data +
+
+rgvolume — Apply ReplayGain volume adjustment +
+
+rippletv — RippleTV does ripple mark effect on the video input +
+
+rtpdec — Accepts raw RTP and RTCP packets and sends them forward +
+
+rtpj2kpay — Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371) +
+
+rtpjpegpay — Payload-encodes JPEG pictures into RTP packets (RFC 2435) +
+
+rtspsrc — Receive data over the network via RTSP (RFC 2326) +
+
+shagadelictv — Oh behave, ShagedelicTV makes images shagadelic! +
+
+shapewipe — Adds a shape wipe transition to a video stream +
+
+smokedec — Decode video from Smoke format +
+
+smokeenc — Encode images into the Smoke format +
+
+smpte — Apply the standard SMPTE transitions on video images +
+
+smptealpha — Apply the standard SMPTE transitions as alpha on video images +
+
+souphttpsrc — Receive data as a client over the network via HTTP using SOUP +
+
+spectrum — Run an FFT on the audio signal, output spectrum data +
+
+speexenc — Encodes audio in Speex format +
+
+speexdec — decode speex streams to audio +
+
+splitfilesrc — Read a sequentially named set of files as if it was one large file +
+
+streaktv — StreakTV makes after images of moving objects +
+
+taginject — inject metadata tags +
+
+udpsrc — Receive data over the network via UDP +
+
+udpsink — Send data over the network via UDP +
+
+v4l2src — Reads frames from a Video4Linux2 device +
+
+v4l2sink +
+
+v4l2radio — Controls a Video4Linux2 radio device +
+
+vertigotv — A loopback alpha blending effector with rotating and scaling +
+
+videobalance — Adjusts brightness, contrast, hue, saturation on a video stream +
+
+videobox — Resizes a video by adding borders or cropping +
+
+videocrop — Crops video into a user-defined region +
+
+videoflip — Flips and rotates video +
+
+videomixer — Mix multiple video streams +
+
+videomixer2 — Mix multiple video streams +
+
+warptv — WarpTV does realtime goo'ing of the video input +
+
+wavenc — Encode raw audio into WAV +
+
+waveformsink — WaveForm audio sink +
+
+wavpackdec — Decodes Wavpack audio data +
+
+wavpackenc — Encodes audio with the Wavpack lossless/lossy audio codec +
+
+wavpackparse — Parses Wavpack files +
+
+wavparse — Parse a .wav file into raw audio +
+
+webmmux — Muxes video and audio streams into a WebM stream +
+
+ximagesrc — Creates a screenshot video stream +
+
+y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools) +
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/ch02.html b/docs/plugins/html/ch02.html new file mode 100644 index 0000000..31cd5e8 --- /dev/null +++ b/docs/plugins/html/ch02.html @@ -0,0 +1,251 @@ + + + + +gst-plugins-good Plugins + + + + + + + + + + + + + + + + +
+

+gst-plugins-good Plugins

+
+
+1394 — Source for video data via IEEE1394 interface +
+
+aasink — ASCII Art video sink +
+
+alaw — ALaw audio conversion routines +
+
+alpha — adds an alpha channel to video - constant or via chroma-keying +
+
+alphacolor — RGBA from/to AYUV colorspace conversion preserving the alpha channel +
+
+annodex — annodex stream manipulation (info about annodex: http://www.annodex.net) +
+
+apetag — APEv1/2 tag reader +
+
+audiofx — Audio effects plugin +
+
+auparse — parses au streams +
+
+autodetect — Plugin contains auto-detection plugins for video/audio in- and outputs +
+
+avi — AVI stream handling +
+
+cacasink — Colored ASCII Art video sink +
+
+cairo — Cairo-based elements +
+
+cutter — Audio Cutter to split audio into non-silent bits +
+
+debug — elements for testing and debugging +
+
+deinterlace — Deinterlacer +
+
+directsound — DirectSound plugin +
+
+dv — DV demuxer and decoder based on libdv (libdv.sf.net) +
+
+efence — This element converts a stream of normal GStreamer buffers into a stream of buffers that are allocated in such a way that out-of-bounds access to data in the buffer is more likely to cause segmentation faults. This allocation method is very similar to the debugging tool "Electric Fence". +
+
+equalizer — GStreamer audio equalizers +
+
+effectv — effect plugins from the effectv project +
+
+esdsink — ESD Element Plugins +
+
+flac — The FLAC Lossless compressor Codec +
+
+flv — FLV muxing and demuxing plugin +
+
+flxdec — FLC/FLI/FLX video decoder +
+
+gconfelements — elements wrapping the GStreamer/GConf audio/video output settings +
+
+gdkpixbuf — GdkPixbuf-based image decoder, scaler and sink +
+
+goom — GOOM visualization filter +
+
+goom2k1 — GOOM 2k1 visualization filter +
+
+halelements — elements wrapping the GStreamer/HAL audio input/output devices +
+
+icydemux — Demux ICY tags from a stream +
+
+id3demux — Demux ID3v1 and ID3v2 tags from a file +
+
+imagefreeze — Still frame stream generator +
+
+interleave — Audio interleaver/deinterleaver +
+
+isomp4 — ISO base media file format support (mp4, 3gpp, qt, mj2) +
+
+jack — JACK audio elements +
+
+jpeg — JPeg plugin library +
+
+level — Audio level plugin +
+
+matroska — Matroska and WebM stream handling +
+
+monoscope — Monoscope visualization +
+
+mulaw — MuLaw audio conversion routines +
+
+multifile — Reads/Writes buffers from/to sequentially named files +
+
+multipart — multipart stream manipulation +
+
+navigationtest — Template for a video filter +
+
+oss4 — Open Sound System (OSS) version 4 support for GStreamer +
+
+ossaudio — OSS (Open Sound System) support for GStreamer +
+
+osxaudio — OSX (Mac OS X) audio support for GStreamer +
+
+osxvideo — OSX native video output plugin +
+
+png — PNG plugin library +
+
+pulseaudio — PulseAudio plugin library +
+
+replaygain — ReplayGain volume normalization +
+
+rtp — Real-time protocol plugins +
+
+gstrtpmanager — RTP session management plugin library +
+
+rtsp — transfer data via RTSP +
+
+shapewipe — Shape Wipe transition filter +
+
+shout2send — Sends data to an icecast server using libshout2 +
+
+smpte — Apply the standard SMPTE transitions on video images +
+
+soup — libsoup HTTP client src/sink +
+
+spectrum — Run an FFT on the audio signal, output spectrum data +
+
+speex — Speex plugin library +
+
+taglib — Tag writing plug-in based on taglib +
+
+udp — transfer data via UDP +
+
+video4linux2 — elements for Video 4 Linux +
+
+videobox — resizes a video by adding borders or cropping +
+
+videocrop — Crops video into a user-defined region +
+
+videofilter — Video filters plugin +
+
+videomixer — Video mixer +
+
+waveform — WaveForm API based plugin +
+
+wavenc — Encode raw audio into WAV +
+
+wavpack — Wavpack lossless/lossy audio format handling +
+
+wavparse — Parse a .wav file into raw audio +
+
+ximagesrc — X11 video input plugin using standard Xlib calls +
+
+y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools) +
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/ch03.html b/docs/plugins/html/ch03.html new file mode 100644 index 0000000..a2c1535 --- /dev/null +++ b/docs/plugins/html/ch03.html @@ -0,0 +1,41 @@ + + + + +gst-plugins-good Base Classes + + + + + + + + + + + + + + + + +
+

+gst-plugins-good Base Classes

+ +
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-3gppmux.html b/docs/plugins/html/gst-plugins-good-plugins-3gppmux.html new file mode 100644 index 0000000..75db44f --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-3gppmux.html @@ -0,0 +1,246 @@ + + + + +3gppmux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

3gppmux

+

3gppmux — Muxer for 3GPP (.3gp) files

+
+
+

Synopsis

+

+
+
+

Description

+

+This element merges streams (audio and video) into 3GPP (.3gp) files. +

+

+The following background intends to explain why various similar muxers +are present in this plugin. +

+

+The +QuickTime file format specification served as basis for the MP4 file +format specification (mp4mux), and as such the QuickTime file structure is +nearly identical to the so-called ISO Base Media file format defined in +ISO 14496-12 (except for some media specific parts). +In turn, the latter ISO Base Media format was further specialized as a +Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) +and in various 3GPP(2) specs (gppmux). +The fragmented file features defined (only) in ISO Base Media are used by +ISMV files making up (a.o.) Smooth Streaming (ismlmux). +

+

+A few properties (movie-timescale, +trak-timescale) allow adjusting +some technical parameters, which might be useful in (rare) cases to resolve +compatibility issues in some situations. +

+

+Some other properties influence the result more fundamentally. +A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, +somewhat contrary to this usually being called "the header". +However, a faststart file will +(with some effort) arrange this to be located near start of the file, +which then allows it e.g. to be played while downloading. +Alternatively, rather than having one chunk of metadata at start (or end), +there can be some metadata at start and most of the other data can be spread +out into fragments of fragment-duration. +If such fragmented layout is intended for streaming purposes, then +streamable allows foregoing to add +index metadata (at the end of file). +

+

+dts-method allows selecting a +method for managing input timestamps (stay tuned for 0.11 to have this +automagically settled). The default delta/duration method should handle nice +(aka perfect streams) just fine, but may experience problems otherwise +(e.g. input stream with re-ordered B-frames and/or with frame dropping). +The re-ordering approach re-assigns incoming timestamps in ascending order +to incoming buffers and offers an alternative in such cases. In cases where +that might fail, the remaining method can be tried, which is exact and +according to specs, but might experience playback on not so spec-wise players. +Note that this latter approach also requires one to enable +presentation-timestamp. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch v4l2src num-buffers=50 ! queue ! ffenc_h263 ! gppmux ! filesink location=video.3gp
+
+ +Records a video stream captured from a v4l2 device, encodes it into H.263 +and muxes it into an 3gp file. +
+

+

+

+Documentation last reviewed on 2011-04-21 +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ isomp4 +

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

audio_%d

direction

sink

presence

request

details

audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]

audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video_%d

direction

sink

presence

request

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, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/quicktime, variant=(string)3gpp
+
+
+

+

+
+
+

Details

+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-aacparse.html b/docs/plugins/html/gst-plugins-good-plugins-aacparse.html new file mode 100644 index 0000000..a5f3119 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-aacparse.html @@ -0,0 +1,176 @@ + + + + +aacparse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

aacparse

+

aacparse — AAC parser

+
+
+

Synopsis

+
struct              GstAacParse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseParse
+                     +----GstAacParse
+
+
+
+

Description

+

+This is an AAC parser which handles both ADIF and ADTS stream formats. +

+

+As ADIF format is not framed, it is not seekable and stream duration cannot +be determined either. However, ADTS format AAC clips can be seeked, and parser +can also estimate playback position and clip duration. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=abc.aac ! aacparse ! faad ! audioresample ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audioparsers +

author

Stefan Kost <stefan.kost@nokia.com>

class

Codec/Parser/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/mpeg, mpegversion=(int){ 2, 4 }
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/mpeg, framed=(boolean)true, mpegversion=(int){ 2, 4 }, stream-format=(string){ raw, adts, adif }
+
+
+

+

+
+
+

Details

+
+

struct GstAacParse

+
struct GstAacParse;
+

+The opaque GstAacParse data structure. +

+
+
+
+

See Also

+GstAmrParse +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-aasink.html b/docs/plugins/html/gst-plugins-good-plugins-aasink.html new file mode 100644 index 0000000..104b28f --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-aasink.html @@ -0,0 +1,277 @@ + + + + +aasink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

aasink

+

aasink — An ASCII art videosink

+
+
+

Synopsis

+
struct              GstAASink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstAASink
+
+
+
+

Properties

+
+  "brightness"               gint                  : Read / Write
+  "contrast"                 gint                  : Read / Write
+  "dither"                   GstAASinkDitherers    : Read / Write
+  "driver"                   GstAASinkDrivers      : Read / Write
+  "frame-time"               gint                  : Read
+  "frames-displayed"         gint                  : Read
+  "gamma"                    gfloat                : Read / Write
+  "height"                   gint                  : Read / Write
+  "inversion"                gboolean              : Read / Write
+  "randomval"                gint                  : Read / Write
+  "width"                    gint                  : Read / Write
+
+
+
+

Signals

+
+  "frame-displayed"                                : Run Last
+  "have-size"                                      : Run Last
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ aasink +

author

Wim Taymans <wim.taymans@chello.be>

class

Sink/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAASink

+
struct GstAASink;
+

+

+
+
+
+

Property Details

+
+

The "brightness" property

+
  "brightness"               gint                  : Read / Write
+

brightness.

+

Default value: 0

+
+
+
+

The "contrast" property

+
  "contrast"                 gint                  : Read / Write
+

contrast.

+

Default value: 0

+
+
+
+

The "dither" property

+
  "dither"                   GstAASinkDitherers    : Read / Write
+

dither.

+

Default value: no dithering

+
+
+
+

The "driver" property

+
  "driver"                   GstAASinkDrivers      : Read / Write
+

driver.

+

Default value: X11 driver 1.1

+
+
+
+

The "frame-time" property

+
  "frame-time"               gint                  : Read
+

frame time.

+

Default value: 0

+
+
+
+

The "frames-displayed" property

+
  "frames-displayed"         gint                  : Read
+

frames displayed.

+

Default value: 0

+
+
+
+

The "gamma" property

+
  "gamma"                    gfloat                : Read / Write
+

gamma.

+

Allowed values: [0,5]

+

Default value: 1

+
+
+
+

The "height" property

+
  "height"                   gint                  : Read / Write
+

height.

+

Default value: 0

+
+
+
+

The "inversion" property

+
  "inversion"                gboolean              : Read / Write
+

inversion.

+

Default value: TRUE

+
+
+
+

The "randomval" property

+
  "randomval"                gint                  : Read / Write
+

randomval.

+

Default value: 0

+
+
+
+

The "width" property

+
  "width"                    gint                  : Read / Write
+

width.

+

Default value: 0

+
+
+
+

Signal Details

+
+

The "frame-displayed" signal

+
void                user_function                      (GstAASink *gstaasink,
+                                                        gpointer   user_data)      : Run Last
+

+

+
++ + + + + + + + + + +

gstaasink :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "have-size" signal

+
void                user_function                      (GstAASink *gstaasink,
+                                                        guint      arg1,
+                                                        guint      arg2,
+                                                        gpointer   user_data)      : Run Last
+

+

+
++ + + + + + + + + + +

gstaasink :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-ac3parse.html b/docs/plugins/html/gst-plugins-good-plugins-ac3parse.html new file mode 100644 index 0000000..f5dd603 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-ac3parse.html @@ -0,0 +1,183 @@ + + + + +ac3parse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

ac3parse

+

ac3parse — AC3 parser

+
+
+

Synopsis

+
struct              GstAc3Parse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseParse
+                     +----GstAc3Parse
+
+
+
+

Description

+

+This is an AC3 parser. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=abc.ac3 ! ac3parse ! a52dec ! audioresample ! audioconvert ! autoaudiosink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audioparsers +

author

Tim-Philipp Müller <tim centricular net>

class

Codec/Parser/Converter/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-ac3

audio/x-eac3

audio/ac3
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-ac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }

audio/x-eac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }
+
+
+

+

+
+
+

Details

+
+

struct GstAc3Parse

+
struct GstAc3Parse;
+

+The opaque GstAc3Parse object +

+
+
+
+

See Also

+GstAmrParse, GstAACParse +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-agingtv.html b/docs/plugins/html/gst-plugins-good-plugins-agingtv.html new file mode 100644 index 0000000..4562ff7 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-agingtv.html @@ -0,0 +1,218 @@ + + + + +agingtv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

agingtv

+

agingtv — AgingTV adds age to video input using scratches and dust

+
+
+

Synopsis

+
struct              GstAgingTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstAgingTV
+
+
+
+

Properties

+
+  "color-aging"              gboolean              : Read / Write
+  "dusts"                    gboolean              : Read / Write
+  "pits"                     gboolean              : Read / Write
+  "scratch-lines"            guint                 : Read / Write
+
+
+
+

Description

+

+AgingTV ages a video stream in realtime, changes the colors and adds +scratches and dust. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! agingtv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of agingtv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

Sam Lantinga <slouken@devolution.com>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAgingTV

+
struct GstAgingTV;
+

+

+
+
+
+

Property Details

+
+

The "color-aging" property

+
  "color-aging"              gboolean              : Read / Write
+

Color Aging.

+

Default value: TRUE

+
+
+
+

The "dusts" property

+
  "dusts"                    gboolean              : Read / Write
+

Dusts.

+

Default value: TRUE

+
+
+
+

The "pits" property

+
  "pits"                     gboolean              : Read / Write
+

Pits.

+

Default value: TRUE

+
+
+
+

The "scratch-lines" property

+
  "scratch-lines"            guint                 : Read / Write
+

Number of scratch lines.

+

Allowed values: <= 20

+

Default value: 7

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-alawdec.html b/docs/plugins/html/gst-plugins-good-plugins-alawdec.html new file mode 100644 index 0000000..47d3e15 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-alawdec.html @@ -0,0 +1,147 @@ + + + + +alawdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

alawdec

+

alawdec — Convert 8bit A law to 16bit PCM

+
+
+

Synopsis

+
struct              GstALawDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstALawDec
+
+
+
+

Description

+

+This element decodes alaw audio. Alaw coding is also known as G.711. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ alaw +

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Codec/Decoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstALawDec

+
struct GstALawDec;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-alawenc.html b/docs/plugins/html/gst-plugins-good-plugins-alawenc.html new file mode 100644 index 0000000..7e5829a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-alawenc.html @@ -0,0 +1,152 @@ + + + + +alawenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

alawenc

+

alawenc — Convert 16bit PCM to 8bit A law

+
+
+

Synopsis

+
struct              GstALawDec;
+struct              GstALawEnc;
+
+
+
+

Description

+

+This element encode alaw audio. Alaw coding is also known as G.711. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ alaw +

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Codec/Encoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
+
+
+

+

+
+
+

Details

+
+

struct GstALawDec

+
struct GstALawDec;
+

+

+
+
+
+

struct GstALawEnc

+
struct GstALawEnc {
+  GstElement element;
+
+  GstPad *sinkpad,*srcpad;
+
+  gint channels;
+  gint rate;
+};
+
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-alpha.html b/docs/plugins/html/gst-plugins-good-plugins-alpha.html new file mode 100644 index 0000000..25023a5 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-alpha.html @@ -0,0 +1,454 @@ + + + + +alpha + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

alpha

+

alpha — Adds an alpha channel to video - uniform or via chroma-keying

+
+
+

Synopsis

+
struct              GstAlpha;
+enum                GstAlphaMethod;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstAlpha
+
+
+
+

Properties

+
+  "alpha"                    gdouble               : Read / Write
+  "angle"                    gfloat                : Read / Write
+  "method"                   GstAlphaMethod        : Read / Write
+  "noise-level"              gfloat                : Read / Write
+  "target-b"                 guint                 : Read / Write
+  "target-g"                 guint                 : Read / Write
+  "target-r"                 guint                 : Read / Write
+  "black-sensitivity"        guint                 : Read / Write
+  "white-sensitivity"        guint                 : Read / Write
+  "prefer-passthrough"       gboolean              : Read / Write
+
+
+
+

Description

+

+The alpha element adds an alpha channel to a video stream. The values +of the alpha channel can be either be set to a constant or can be +dynamically calculated via chroma keying, e.g. blue can be set as +the transparent color. +

+

+Sample pipeline: +

+
+ + + + + + + +
1
+2
+3
gst-launch videotestsrc pattern=smpte75 ! alpha method=green ! \
+  videomixer name=mixer ! ffmpegcolorspace ! autovideosink     \
+  videotestsrc pattern=snow ! mixer.
+
+ +

This pipeline adds a alpha channel to the SMPTE color bars +with green as the transparent color and mixes the output with +a snow video stream. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ alpha +

author

Wim Taymans <wim@fluendo.com> +Edward Hervey <edward.hervey@collabora.co.uk> +Jan Schmidt <thaytan@noraisin.net>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAlpha

+
struct GstAlpha;
+

+

+
+
+
+

enum GstAlphaMethod

+
typedef enum {
+  ALPHA_METHOD_SET,
+  ALPHA_METHOD_GREEN,
+  ALPHA_METHOD_BLUE,
+  ALPHA_METHOD_CUSTOM,
+} GstAlphaMethod;
+
+
++ + + + + + + + + + + + + + + + + + +

ALPHA_METHOD_SET

Set/adjust alpha channel +

ALPHA_METHOD_GREEN

Chroma Key green +

ALPHA_METHOD_BLUE

Chroma Key blue +

ALPHA_METHOD_CUSTOM

Chroma Key on target_r/g/b +
+
+
+
+

Property Details

+
+

The "alpha" property

+
  "alpha"                    gdouble               : Read / Write
+

The value for the alpha channel.

+

Allowed values: [0,1]

+

Default value: 1

+
+
+
+

The "angle" property

+
  "angle"                    gfloat                : Read / Write
+

Size of the colorcube to change.

+

Allowed values: [0,90]

+

Default value: 20

+
+
+
+

The "method" property

+
  "method"                   GstAlphaMethod        : Read / Write
+

How the alpha channels should be created.

+

Default value: Set/adjust alpha channel

+
+
+
+

The "noise-level" property

+
  "noise-level"              gfloat                : Read / Write
+

Size of noise radius.

+

Allowed values: [0,64]

+

Default value: 2

+
+
+
+

The "target-b" property

+
  "target-b"                 guint                 : Read / Write
+

The Blue target.

+

Allowed values: <= 255

+

Default value: 0

+
+
+
+

The "target-g" property

+
  "target-g"                 guint                 : Read / Write
+

The Green target.

+

Allowed values: <= 255

+

Default value: 255

+
+
+
+

The "target-r" property

+
  "target-r"                 guint                 : Read / Write
+

The Red target.

+

Allowed values: <= 255

+

Default value: 0

+
+
+
+

The "black-sensitivity" property

+
  "black-sensitivity"        guint                 : Read / Write
+

Sensitivity to dark colors.

+

Allowed values: <= 128

+

Default value: 100

+
+
+
+

The "white-sensitivity" property

+
  "white-sensitivity"        guint                 : Read / Write
+

Sensitivity to bright colors.

+

Allowed values: <= 128

+

Default value: 100

+
+
+
+

The "prefer-passthrough" property

+
  "prefer-passthrough"       gboolean              : Read / Write
+

Don't do any processing for alpha=1.0 if possible.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-alphacolor.html b/docs/plugins/html/gst-plugins-good-plugins-alphacolor.html new file mode 100644 index 0000000..d739cca --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-alphacolor.html @@ -0,0 +1,201 @@ + + + + +alphacolor + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

alphacolor

+

alphacolor — ARGB from/to AYUV colorspace conversion preserving the alpha channel

+
+
+

Synopsis

+
struct              GstAlphaColor;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstAlphaColor
+
+
+
+

Description

+

+The alphacolor element does memory-efficient (in-place) colourspace +conversion from RGBA to AYUV or AYUV to RGBA while preserving the +alpha channel. +

+

+Sample pipeline: +

+
+ + + + + + + +
1
+2
gst-launch videotestsrc ! "video/x-raw-yuv,format=(fourcc)AYUV" ! \
+  alphacolor ! "video/x-raw-rgb" ! ffmpegcolorspace ! autovideosink
+
+ +

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ alphacolor +

author

Wim Taymans <wim@fluendo.com>

class

Filter/Converter/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAlphaColor

+
struct GstAlphaColor;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-amrparse.html b/docs/plugins/html/gst-plugins-good-plugins-amrparse.html new file mode 100644 index 0000000..f0264fd --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-amrparse.html @@ -0,0 +1,184 @@ + + + + +amrparse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

amrparse

+

amrparse — AMR parser

+
+
+

Synopsis

+
struct              GstAmrParse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseParse
+                     +----GstAmrParse
+
+
+
+

Description

+

+This is an AMR parser capable of handling both narrow-band and wideband +formats. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=abc.amr ! amrparse ! amrdec ! audioresample ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audioparsers +

author

Ronald Bultje <rbultje@ronald.bitfreak.net>

class

Codec/Parser/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-amr-nb-sh

audio/x-amr-wb-sh
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/AMR, rate=(int)8000, channels=(int)1

audio/AMR-WB, rate=(int)16000, channels=(int)1
+
+
+

+

+
+
+

Details

+
+

struct GstAmrParse

+
struct GstAmrParse;
+

+The opaque GstAacParse data structure. +

+
++ +
+
+
+
+

See Also

+GstAmrnbDec, GstAmrnbEnc +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-apedemux.html b/docs/plugins/html/gst-plugins-good-plugins-apedemux.html new file mode 100644 index 0000000..b0e47a8 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-apedemux.html @@ -0,0 +1,179 @@ + + + + +apedemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

apedemux

+

apedemux — Read and output APE tags while demuxing the contents

+
+
+

Synopsis

+
struct              GstApeDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstTagDemux
+                     +----GstApeDemux
+
+
+
+

Description

+

+apedemux accepts data streams with APE tags at the start or at the end +(or both). The mime type of the data between the tag blocks is detected +using typefind functions, and the appropriate output mime type set on +outgoing buffers. +

+

+The element is only able to read APE tags at the end of a stream from +a seekable stream, ie. when get_range mode is supported by the upstream +elements. If get_range operation is available, apedemux makes it available +downstream. This means that elements which require get_range mode, such as +wavparse or musepackdec, can operate on files containing APE tag +information. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -t filesrc location=file.mpc ! apedemux ! fakesink
+
+ This pipeline should read any available APE tag information and output it. +The contents of the file inside the APE tag regions should be detected, and +the appropriate mime type set on buffers produced from apedemux. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ apetag +

author

Tim-Philipp Müller <tim centricular net>

class

Codec/Demuxer/Metadata
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

application/x-apetag
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

sometimes

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstApeDemux

+
struct GstApeDemux;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-apev2mux.html b/docs/plugins/html/gst-plugins-good-plugins-apev2mux.html new file mode 100644 index 0000000..378e7ad --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-apev2mux.html @@ -0,0 +1,153 @@ + + + + +apev2mux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

apev2mux

+

apev2mux — Adds an APEv2 header to the beginning of files using taglib

+
+
+

Synopsis

+
struct              GstApev2Mux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstTagLibMux
+                     +----GstApev2Mux
+
+
+
+

Implemented Interfaces

+

+GstApev2Mux implements + GstTagSetter.

+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ taglib +

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Formatter/Metadata
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

application/x-apetag
+
+
+

+

+
+
+

Details

+
+

struct GstApev2Mux

+
struct GstApev2Mux;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-aspectratiocrop.html b/docs/plugins/html/gst-plugins-good-plugins-aspectratiocrop.html new file mode 100644 index 0000000..3d27eab --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-aspectratiocrop.html @@ -0,0 +1,342 @@ + + + + +aspectratiocrop + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

aspectratiocrop

+

aspectratiocrop — Crops video into a user-defined aspect-ratio

+
+
+

Synopsis

+
struct              GstAspectRatioCrop;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstAspectRatioCrop
+
+
+
+

Implemented Interfaces

+

+GstAspectRatioCrop implements + GstChildProxy.

+
+
+

Properties

+
+  "aspect-ratio"             GstFraction           : Read / Write
+
+
+
+

Description

+

+This element crops video frames to a specified "aspect-ratio". +

+

+If the aspect-ratio is already correct, the element will operate +in pass-through mode. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! video/x-raw-rgb,height=640,width=480 ! aspectratiocrop aspect-ratio=16/9 ! ximagesink
+
+ This pipeline generates a videostream in 4/3 and crops it to 16/9. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ videocrop +

author

Thijs Vermeir <thijsvermeir@gmail.com>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAspectRatioCrop

+
struct GstAspectRatioCrop;
+

+

+
+
+
+

Property Details

+
+

The "aspect-ratio" property

+
  "aspect-ratio"             GstFraction           : Read / Write
+

Target aspect-ratio of video.

+
+
+
+

See Also

+GstVideoCrop +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audioamplify.html b/docs/plugins/html/gst-plugins-good-plugins-audioamplify.html new file mode 100644 index 0000000..99fe4d3 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audioamplify.html @@ -0,0 +1,225 @@ + + + + +audioamplify + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audioamplify

+

audioamplify — Amplifies an audio stream by a given factor

+
+
+

Synopsis

+
struct              GstAudioAmplify;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioAmplify
+
+
+
+

Properties

+
+  "amplification"            gfloat                : Read / Write
+  "clipping-method"          GstAudioPanoramaClippingMethod  : Read / Write
+
+
+
+

Description

+

+Amplifies an audio stream by a given factor and allows the selection of different clipping modes. +The difference between the clipping modes is best evaluated by testing. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch audiotestsrc wave=saw ! audioamplify amplification=1.5 ! alsasink
+gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audioamplify amplification=1.5 method=wrap-negative ! alsasink
+gst-launch audiotestsrc wave=saw ! audioconvert ! audioamplify amplification=1.5 method=wrap-positive ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)8, width=(int)8, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, depth=(int)32, width=(int)32, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)8, width=(int)8, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, depth=(int)32, width=(int)32, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioAmplify

+
struct GstAudioAmplify;
+

+

+
+
+
+

Property Details

+
+

The "amplification" property

+
  "amplification"            gfloat                : Read / Write
+

Factor of amplification.

+

Default value: 1

+
+
+
+

The "clipping-method" property

+
  "clipping-method"          GstAudioPanoramaClippingMethod  : Read / Write
+

+Clipping method: clip mode set values higher than the maximum to the +maximum. The wrap-negative mode pushes those values back from the +opposite side, wrap-positive pushes them back from the same side. +

+

Default value: Normal clipping (default)

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audiochebband.html b/docs/plugins/html/gst-plugins-good-plugins-audiochebband.html new file mode 100644 index 0000000..050c512 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audiochebband.html @@ -0,0 +1,261 @@ + + + + +audiochebband + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiochebband

+

audiochebband — Chebyshev band pass and band reject filter

+
+
+

Synopsis

+
struct              GstAudioChebBand;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioFXBaseIIRFilter
+                                 +----GstAudioChebBand
+
+
+
+

Properties

+
+  "lower-frequency"          gfloat                : Read / Write
+  "mode"                     GstAudioChebBandMode  : Read / Write
+  "poles"                    gint                  : Read / Write
+  "ripple"                   gfloat                : Read / Write
+  "type"                     gint                  : Read / Write
+  "upper-frequency"          gfloat                : Read / Write
+
+
+
+

Description

+

+Attenuates all frequencies outside (bandpass) or inside (bandreject) of a frequency +band. The number of poles and the ripple parameter control the rolloff. +

+

+This element has the advantage over the windowed sinc bandpass and bandreject filter that it is +much faster and produces almost as good results. It's only disadvantages are the highly +non-linear phase and the slower rolloff compared to a windowed sinc filter with a large kernel. +

+

+For type 1 the ripple parameter specifies how much ripple in dB is allowed in the passband, i.e. +some frequencies in the passband will be amplified by that value. A higher ripple value will allow +a faster rolloff. +

+

+For type 2 the ripple parameter specifies the stopband attenuation. In the stopband the gain will +be at most this value. A lower ripple value will allow a faster rolloff. +

+

+As a special case, a Chebyshev type 1 filter with no ripple is a Butterworth filter. +

+

+

+
+

Note

+Be warned that a too large number of poles can produce noise. The most poles are possible with +a cutoff frequency at a quarter of the sampling rate. +
+

+

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch audiotestsrc freq=1500 ! audioconvert ! audiochebband mode=band-pass lower-frequency=1000 upper-frequenc=6000 poles=4 ! audioconvert ! alsasink
+gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiochebband mode=band-reject lower-frequency=1000 upper-frequency=4000 ripple=0.2 ! audioconvert ! alsasink
+gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiochebband mode=band-pass lower-frequency=1000 upper-frequency=4000 type=2 ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioChebBand

+
struct GstAudioChebBand;
+

+

+
+
+
+

Property Details

+
+

The "lower-frequency" property

+
  "lower-frequency"          gfloat                : Read / Write
+

Start frequency of the band (Hz).

+

Allowed values: [0,100000]

+

Default value: 0

+
+
+
+

The "mode" property

+
  "mode"                     GstAudioChebBandMode  : Read / Write
+

Low pass or high pass mode.

+

Default value: Band pass (default)

+
+
+
+

The "poles" property

+
  "poles"                    gint                  : Read / Write
+

Number of poles to use, will be rounded up to the next multiply of four.

+

Allowed values: [4,32]

+

Default value: 4

+
+
+
+

The "ripple" property

+
  "ripple"                   gfloat                : Read / Write
+

Amount of ripple (dB).

+

Allowed values: [0,200]

+

Default value: 0.25

+
+
+
+

The "type" property

+
  "type"                     gint                  : Read / Write
+

Type of the chebychev filter.

+

Allowed values: [1,2]

+

Default value: 1

+
+
+
+

The "upper-frequency" property

+
  "upper-frequency"          gfloat                : Read / Write
+

Stop frequency of the band (Hz).

+

Allowed values: [0,100000]

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audiocheblimit.html b/docs/plugins/html/gst-plugins-good-plugins-audiocheblimit.html new file mode 100644 index 0000000..42d15e0 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audiocheblimit.html @@ -0,0 +1,250 @@ + + + + +audiocheblimit + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiocheblimit

+

audiocheblimit — Chebyshev low pass and high pass filter

+
+
+

Synopsis

+
struct              GstAudioChebLimit;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioFXBaseIIRFilter
+                                 +----GstAudioChebLimit
+
+
+
+

Properties

+
+  "cutoff"                   gfloat                : Read / Write
+  "mode"                     GstAudioChebLimitMode  : Read / Write
+  "poles"                    gint                  : Read / Write
+  "ripple"                   gfloat                : Read / Write
+  "type"                     gint                  : Read / Write
+
+
+
+

Description

+

+Attenuates all frequencies above the cutoff frequency (low-pass) or all frequencies below the +cutoff frequency (high-pass). The number of poles and the ripple parameter control the rolloff. +

+

+This element has the advantage over the windowed sinc lowpass and highpass filter that it is +much faster and produces almost as good results. It's only disadvantages are the highly +non-linear phase and the slower rolloff compared to a windowed sinc filter with a large kernel. +

+

+For type 1 the ripple parameter specifies how much ripple in dB is allowed in the passband, i.e. +some frequencies in the passband will be amplified by that value. A higher ripple value will allow +a faster rolloff. +

+

+For type 2 the ripple parameter specifies the stopband attenuation. In the stopband the gain will +be at most this value. A lower ripple value will allow a faster rolloff. +

+

+As a special case, a Chebyshev type 1 filter with no ripple is a Butterworth filter. +

+
+

Note

+

+Be warned that a too large number of poles can produce noise. The most poles are possible with +a cutoff frequency at a quarter of the sampling rate. +

+
+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch audiotestsrc freq=1500 ! audioconvert ! audiocheblimit mode=low-pass cutoff=1000 poles=4 ! audioconvert ! alsasink
+gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiocheblimit mode=high-pass cutoff=400 ripple=0.2 ! audioconvert ! alsasink
+gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiocheblimit mode=low-pass cutoff=800 type=2 ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioChebLimit

+
struct GstAudioChebLimit;
+

+

+
+
+
+

Property Details

+
+

The "cutoff" property

+
  "cutoff"                   gfloat                : Read / Write
+

Cut off frequency (Hz).

+

Allowed values: [0,100000]

+

Default value: 0

+
+
+
+

The "mode" property

+
  "mode"                     GstAudioChebLimitMode  : Read / Write
+

Low pass or high pass mode.

+

Default value: Low pass (default)

+
+
+
+

The "poles" property

+
  "poles"                    gint                  : Read / Write
+

Number of poles to use, will be rounded up to the next even number.

+

Allowed values: [2,32]

+

Default value: 4

+
+
+
+

The "ripple" property

+
  "ripple"                   gfloat                : Read / Write
+

Amount of ripple (dB).

+

Allowed values: [0,200]

+

Default value: 0.25

+
+
+
+

The "type" property

+
  "type"                     gint                  : Read / Write
+

Type of the chebychev filter.

+

Allowed values: [1,2]

+

Default value: 1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audiodynamic.html b/docs/plugins/html/gst-plugins-good-plugins-audiodynamic.html new file mode 100644 index 0000000..57eb894 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audiodynamic.html @@ -0,0 +1,225 @@ + + + + +audiodynamic + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiodynamic

+

audiodynamic — Compressor and Expander

+
+
+

Synopsis

+
struct              GstAudioDynamic;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioDynamic
+
+
+
+

Properties

+
+  "characteristics"          GstAudioDynamicCharacteristics  : Read / Write
+  "mode"                     GstAudioDynamicMode   : Read / Write
+  "ratio"                    gfloat                : Read / Write
+  "threshold"                gfloat                : Read / Write
+
+
+
+

Description

+

+This element can act as a compressor or expander. A compressor changes the +amplitude of all samples above a specific threshold with a specific ratio, +a expander does the same for all samples below a specific threshold. If +soft-knee mode is selected the ratio is applied smoothly. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch audiotestsrc wave=saw ! audiodynamic characteristics=soft-knee mode=compressor threshold=0.5 rate=0.5 ! alsasink
+gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiodynamic characteristics=hard-knee mode=expander threshold=0.2 rate=4.0 ! alsasink
+gst-launch audiotestsrc wave=saw ! audioconvert ! audiodynamic ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioDynamic

+
struct GstAudioDynamic;
+

+

+
+
+
+

Property Details

+
+

The "characteristics" property

+
  "characteristics"          GstAudioDynamicCharacteristics  : Read / Write
+

Selects whether the ratio should be applied smooth (soft-knee) or hard (hard-knee).

+

Default value: Hard Knee (default)

+
+
+
+

The "mode" property

+
  "mode"                     GstAudioDynamicMode   : Read / Write
+

Selects whether the filter should work on loud samples (compressor) orquiet samples (expander).

+

Default value: Compressor (default)

+
+
+
+

The "ratio" property

+
  "ratio"                    gfloat                : Read / Write
+

Ratio that should be applied.

+

Allowed values: >= 0

+

Default value: 1

+
+
+
+

The "threshold" property

+
  "threshold"                gfloat                : Read / Write
+

Threshold until the filter is activated.

+

Allowed values: [0,1]

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audioecho.html b/docs/plugins/html/gst-plugins-good-plugins-audioecho.html new file mode 100644 index 0000000..b5d8779 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audioecho.html @@ -0,0 +1,225 @@ + + + + +audioecho + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audioecho

+

audioecho — Adds an echo or reverb effect to an audio stream

+
+
+

Synopsis

+
struct              GstAudioEcho;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioEcho
+
+
+
+

Properties

+
+  "delay"                    guint64               : Read / Write
+  "feedback"                 gfloat                : Read / Write
+  "intensity"                gfloat                : Read / Write
+  "max-delay"                guint64               : Read / Write
+
+
+
+

Description

+

+audioecho adds an echo or (simple) reverb effect to an audio stream. The echo +delay, intensity and the percentage of feedback can be configured. +

+

+For getting an echo effect you have to set the delay to a larger value, +for example 200ms and more. Everything below will result in a simple +reverb effect, which results in a slightly metallic sound. +

+

+Use the max-delay property to set the maximum amount of delay that +will be used. This can only be set before going to the PAUSED or PLAYING +state and will be set to the current delay by default. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
gst-launch filesrc location="melo1.ogg" ! audioconvert ! audioecho delay=500000000 intensity=0.6 feedback=0.4 ! audioconvert ! autoaudiosink
+gst-launch filesrc location="melo1.ogg" ! decodebin ! audioconvert ! audioecho delay=50000000 intensity=0.6 feedback=0.4 ! audioconvert ! autoaudiosink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioEcho

+
struct GstAudioEcho;
+

+

+
+
+
+

Property Details

+
+

The "delay" property

+
  "delay"                    guint64               : Read / Write
+

Delay of the echo in nanoseconds.

+

Allowed values: >= 1

+

Default value: 1

+
+
+
+

The "feedback" property

+
  "feedback"                 gfloat                : Read / Write
+

Amount of feedback.

+

Allowed values: [0,1]

+

Default value: 0

+
+
+
+

The "intensity" property

+
  "intensity"                gfloat                : Read / Write
+

Intensity of the echo.

+

Allowed values: [0,1]

+

Default value: 0

+
+
+
+

The "max-delay" property

+
  "max-delay"                guint64               : Read / Write
+

Maximum delay of the echo in nanoseconds (can't be changed in PLAYING or PAUSED state).

+

Allowed values: >= 1

+

Default value: 1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audiofirfilter.html b/docs/plugins/html/gst-plugins-good-plugins-audiofirfilter.html new file mode 100644 index 0000000..be1994d --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audiofirfilter.html @@ -0,0 +1,567 @@ + + + + +audiofirfilter + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiofirfilter

+

audiofirfilter — Generic audio FIR filter with custom filter kernel

+
+
+

Synopsis

+
struct              GstAudioFIRFilter;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioFXBaseFIRFilter
+                                 +----GstAudioFIRFilter
+
+
+
+

Properties

+
+  "kernel"                   GValueArray*          : Read / Write
+  "latency"                  guint64               : Read / Write
+
+
+
+

Signals

+
+  "rate-changed"                                   : Run Last
+
+
+
+

Description

+

+audiofirfilter implements a generic audio FIR filter. Before usage the +"kernel" property has to be set to the filter kernel that should be +used and the "latency" property has to be set to the latency (in samples) +that is introduced by the filter kernel. Setting a latency of n samples +will lead to the first n samples being dropped from the output and +n samples added to the end. +

+

+The filter kernel describes the impulse response of the filter. To +calculate the frequency response of the filter you have to calculate +the Fourier Transform of the impulse response. +

+

+To change the filter kernel whenever the sampling rate changes the +"rate-changed" signal can be used. This should be done for most +FIR filters as they're depending on the sampling rate. +

+

+

+
+

Example application

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
/* GStreamer
+ * Copyright (C) 2009 Sebastian Droege <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.
+ */
+
+/* This small sample application creates a bandpass FIR filter
+ * by transforming the frequency response to the filter kernel.
+ */
+
+#include <string.h>
+#include <math.h>
+
+#include <gst/gst.h>
+#include <gst/fft/gstfftf64.h>
+
+static gboolean
+on_message (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+  GMainLoop *loop = (GMainLoop *) user_data;
+
+  switch (GST_MESSAGE_TYPE (message)) {
+    case GST_MESSAGE_ERROR:
+      g_error ("Got ERROR");
+      g_main_loop_quit (loop);
+      break;
+    case GST_MESSAGE_WARNING:
+      g_warning ("Got WARNING");
+      g_main_loop_quit (loop);
+      break;
+    case GST_MESSAGE_EOS:
+      g_main_loop_quit (loop);
+      break;
+    default:
+      break;
+  }
+
+  return TRUE;
+}
+
+static void
+on_rate_changed (GstElement * element, gint rate, gpointer user_data)
+{
+  GValueArray *va;
+  GValue v = { 0, };
+  GstFFTF64 *fft;
+  GstFFTF64Complex frequency_response[17];
+  gdouble tmp[32];
+  gdouble filter_kernel[32];
+  guint i;
+
+  /* Create the frequency response: zero outside
+   * a small frequency band */
+  for (i = 0; i < 17; i++) {
+    if (i < 5 || i > 11)
+      frequency_response[i].r = 0.0;
+    else
+      frequency_response[i].r = 1.0;
+
+    frequency_response[i].i = 0.0;
+  }
+
+  /* Calculate the inverse FT of the frequency response */
+  fft = gst_fft_f64_new (32, TRUE);
+  gst_fft_f64_inverse_fft (fft, frequency_response, tmp);
+  gst_fft_f64_free (fft);
+
+  /* Shift the inverse FT of the frequency response by 16,
+   * i.e. the half of the kernel length to get the
+   * impulse response. See http://www.dspguide.com/ch17/1.htm
+   * for more information.
+   */
+  for (i = 0; i < 32; i++)
+    filter_kernel[i] = tmp[(i + 16) % 32];
+
+  /* Apply the hamming window to the impulse response to get
+   * a better result than given from the rectangular window
+   */
+  for (i = 0; i < 32; i++)
+    filter_kernel[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / 32));
+
+  va = g_value_array_new (1);
+
+  g_value_init (&v, G_TYPE_DOUBLE);
+  for (i = 0; i < 32; i++) {
+    g_value_set_double (&v, filter_kernel[i]);
+    g_value_array_append (va, &v);
+    g_value_reset (&v);
+  }
+  g_object_set (G_OBJECT (element), "kernel", va, NULL);
+  /* Latency is 1/2 of the kernel length for this method of
+   * calculating a filter kernel from the frequency response
+   */
+  g_object_set (G_OBJECT (element), "latency", (gint64) (32 / 2), NULL);
+  g_value_array_free (va);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+  GstElement *pipeline, *src, *filter, *conv, *sink;
+  GstBus *bus;
+  GMainLoop *loop;
+
+  gst_init (NULL, NULL);
+
+  pipeline = gst_element_factory_make ("pipeline", NULL);
+
+  src = gst_element_factory_make ("audiotestsrc", NULL);
+  g_object_set (G_OBJECT (src), "wave", 5, NULL);
+
+  filter = gst_element_factory_make ("audiofirfilter", NULL);
+  g_signal_connect (G_OBJECT (filter), "rate-changed",
+      G_CALLBACK (on_rate_changed), NULL);
+
+  conv = gst_element_factory_make ("audioconvert", NULL);
+
+  sink = gst_element_factory_make ("autoaudiosink", NULL);
+  g_return_val_if_fail (sink != NULL, -1);
+
+  gst_bin_add_many (GST_BIN (pipeline), src, filter, conv, sink, NULL);
+  if (!gst_element_link_many (src, filter, conv, sink, NULL)) {
+    g_error ("Failed to link elements");
+    return -2;
+  }
+
+  loop = g_main_loop_new (NULL, FALSE);
+
+  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+  gst_bus_add_signal_watch (bus);
+  g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop);
+  gst_object_unref (GST_OBJECT (bus));
+
+  if (gst_element_set_state (pipeline,
+          GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+    g_error ("Failed to go into PLAYING state");
+    return -3;
+  }
+
+  g_main_loop_run (loop);
+
+  gst_element_set_state (pipeline, GST_STATE_NULL);
+
+  g_main_loop_unref (loop);
+  gst_object_unref (pipeline);
+
+  return 0;
+}
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioFIRFilter

+
struct GstAudioFIRFilter;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "kernel" property

+
  "kernel"                   GValueArray*          : Read / Write
+

Filter kernel for the FIR filter.

+
+
+
+

The "latency" property

+
  "latency"                  guint64               : Read / Write
+

Filter latency in samples.

+

Default value: 0

+
+
+
+

Signal Details

+
+

The "rate-changed" signal

+
void                user_function                      (GstAudioFIRFilter *filter,
+                                                        gint               rate,
+                                                        gpointer           user_data)      : Run Last
+

+Will be emitted when the sampling rate changes. The callbacks +will be called from the streaming thread and processing will +stop until the event is handled. +

+
++ + + + + + + + + + + + + + +

filter :

the filter on which the signal is emitted

rate :

the new sampling rate

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audioiirfilter.html b/docs/plugins/html/gst-plugins-good-plugins-audioiirfilter.html new file mode 100644 index 0000000..155ae0c --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audioiirfilter.html @@ -0,0 +1,514 @@ + + + + +audioiirfilter + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audioiirfilter

+

audioiirfilter — Generic audio IIR filter with custom filter kernel

+
+
+

Synopsis

+
struct              GstAudioIIRFilter;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioFXBaseIIRFilter
+                                 +----GstAudioIIRFilter
+
+
+
+

Properties

+
+  "a"                        GValueArray*          : Read / Write
+  "b"                        GValueArray*          : Read / Write
+
+
+
+

Signals

+
+  "rate-changed"                                   : Run Last
+
+
+
+

Description

+

+audioiirfilter implements a generic audio IIR filter. Before usage the +"a" and "b" properties have to be set to the filter coefficients that +should be used. +

+

+The filter coefficients describe the numerator and denominator of the +transfer function. +

+

+To change the filter coefficients whenever the sampling rate changes the +"rate-changed" signal can be used. This should be done for most +IIR filters as they're depending on the sampling rate. +

+

+

+
+

Example application

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
/* GStreamer
+ * Copyright (C) 2009 Sebastian Droege <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.
+ */
+
+/* This small sample application creates a lowpass IIR filter
+ * and applies it to white noise.
+ * See http://www.dspguide.com/ch19/2.htm for a description
+ * of the IIR filter that is used.
+ */
+
+#include <string.h>
+#include <math.h>
+
+#include <gst/gst.h>
+
+/* Cutoff of 4000 Hz */
+#define CUTOFF (4000.0)
+
+static gboolean
+on_message (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+  GMainLoop *loop = (GMainLoop *) user_data;
+
+  switch (GST_MESSAGE_TYPE (message)) {
+    case GST_MESSAGE_ERROR:
+      g_error ("Got ERROR");
+      g_main_loop_quit (loop);
+      break;
+    case GST_MESSAGE_WARNING:
+      g_warning ("Got WARNING");
+      g_main_loop_quit (loop);
+      break;
+    case GST_MESSAGE_EOS:
+      g_main_loop_quit (loop);
+      break;
+    default:
+      break;
+  }
+
+  return TRUE;
+}
+
+static void
+on_rate_changed (GstElement * element, gint rate, gpointer user_data)
+{
+  GValueArray *va;
+  GValue v = { 0, };
+  gdouble x;
+
+  if (rate / 2.0 > CUTOFF)
+    x = exp (-2.0 * G_PI * (CUTOFF / rate));
+  else
+    x = 0.0;
+
+  va = g_value_array_new (1);
+
+  g_value_init (&v, G_TYPE_DOUBLE);
+  g_value_set_double (&v, 1.0 - x);
+  g_value_array_append (va, &v);
+  g_value_reset (&v);
+  g_object_set (G_OBJECT (element), "a", va, NULL);
+  g_value_array_free (va);
+
+  va = g_value_array_new (1);
+  g_value_set_double (&v, x);
+  g_value_array_append (va, &v);
+  g_value_reset (&v);
+  g_object_set (G_OBJECT (element), "b", va, NULL);
+  g_value_array_free (va);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+  GstElement *pipeline, *src, *filter, *conv, *sink;
+  GstBus *bus;
+  GMainLoop *loop;
+
+  gst_init (NULL, NULL);
+
+  pipeline = gst_element_factory_make ("pipeline", NULL);
+
+  src = gst_element_factory_make ("audiotestsrc", NULL);
+  g_object_set (G_OBJECT (src), "wave", 5, NULL);
+
+  filter = gst_element_factory_make ("audioiirfilter", NULL);
+  g_signal_connect (G_OBJECT (filter), "rate-changed",
+      G_CALLBACK (on_rate_changed), NULL);
+
+  conv = gst_element_factory_make ("audioconvert", NULL);
+
+  sink = gst_element_factory_make ("autoaudiosink", NULL);
+  g_return_val_if_fail (sink != NULL, -1);
+
+  gst_bin_add_many (GST_BIN (pipeline), src, filter, conv, sink, NULL);
+  if (!gst_element_link_many (src, filter, conv, sink, NULL)) {
+    g_error ("Failed to link elements");
+    return -2;
+  }
+
+  loop = g_main_loop_new (NULL, FALSE);
+
+  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+  gst_bus_add_signal_watch (bus);
+  g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop);
+  gst_object_unref (GST_OBJECT (bus));
+
+  if (gst_element_set_state (pipeline,
+          GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+    g_error ("Failed to go into PLAYING state");
+    return -3;
+  }
+
+  g_main_loop_run (loop);
+
+  gst_element_set_state (pipeline, GST_STATE_NULL);
+
+  g_main_loop_unref (loop);
+  gst_object_unref (pipeline);
+
+  return 0;
+}
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioIIRFilter

+
struct GstAudioIIRFilter;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "a" property

+
  "a"                        GValueArray*          : Read / Write
+

Filter coefficients (numerator of transfer function).

+
+
+
+

The "b" property

+
  "b"                        GValueArray*          : Read / Write
+

Filter coefficients (denominator of transfer function).

+
+
+
+

Signal Details

+
+

The "rate-changed" signal

+
void                user_function                      (GstAudioIIRFilter *filter,
+                                                        gint               rate,
+                                                        gpointer           user_data)      : Run Last
+

+Will be emitted when the sampling rate changes. The callbacks +will be called from the streaming thread and processing will +stop until the event is handled. +

+
++ + + + + + + + + + + + + + +

filter :

the filter on which the signal is emitted

rate :

the new sampling rate

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audioinvert.html b/docs/plugins/html/gst-plugins-good-plugins-audioinvert.html new file mode 100644 index 0000000..f36f003 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audioinvert.html @@ -0,0 +1,199 @@ + + + + +audioinvert + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audioinvert

+

audioinvert — Swaps upper and lower half of audio samples

+
+
+

Synopsis

+
struct              GstAudioInvert;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioInvert
+
+
+
+

Properties

+
+  "degree"                   gfloat                : Read / Write
+
+
+
+

Description

+

+Swaps upper and lower half of audio samples. Mixing an inverted sample on top of +the original with a slight delay can produce effects that sound like resonance. +Creating a stereo sample from a mono source, with one channel inverted produces wide-stereo sounds. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch audiotestsrc wave=saw ! audioinvert invert=0.4 ! alsasink
+gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audioinvert invert=0.4 ! alsasink
+gst-launch audiotestsrc wave=saw ! audioconvert ! audioinvert invert=0.4 ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioInvert

+
struct GstAudioInvert;
+

+

+
+
+
+

Property Details

+
+

The "degree" property

+
  "degree"                   gfloat                : Read / Write
+

Degree of inversion.

+

Allowed values: [0,1]

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audiokaraoke.html b/docs/plugins/html/gst-plugins-good-plugins-audiokaraoke.html new file mode 100644 index 0000000..ba0fa6a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audiokaraoke.html @@ -0,0 +1,221 @@ + + + + +audiokaraoke + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiokaraoke

+

audiokaraoke — Removes voice from sound

+
+
+

Synopsis

+
struct              GstAudioKaraoke;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioKaraoke
+
+
+
+

Properties

+
+  "filter-band"              gfloat                : Read / Write
+  "filter-width"             gfloat                : Read / Write
+  "level"                    gfloat                : Read / Write
+  "mono-level"               gfloat                : Read / Write
+
+
+
+

Description

+

+Remove the voice from audio by filtering the center channel. +This plugin is useful for karaoke applications. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audiokaraoke ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Wim Taymans <wim.taymans@gmail.com>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioKaraoke

+
struct GstAudioKaraoke;
+

+

+
+
+
+

Property Details

+
+

The "filter-band" property

+
  "filter-band"              gfloat                : Read / Write
+

The Frequency band of the filter.

+

Allowed values: [0,441]

+

Default value: 220

+
+
+
+

The "filter-width" property

+
  "filter-width"             gfloat                : Read / Write
+

The Frequency width of the filter.

+

Allowed values: [0,100]

+

Default value: 100

+
+
+
+

The "level" property

+
  "level"                    gfloat                : Read / Write
+

Level of the effect (1.0 = full).

+

Allowed values: [0,1]

+

Default value: 1

+
+
+
+

The "mono-level" property

+
  "mono-level"               gfloat                : Read / Write
+

Level of the mono channel (1.0 = full).

+

Allowed values: [0,1]

+

Default value: 1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audiopanorama.html b/docs/plugins/html/gst-plugins-good-plugins-audiopanorama.html new file mode 100644 index 0000000..c889a0c --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audiopanorama.html @@ -0,0 +1,212 @@ + + + + +audiopanorama + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiopanorama

+

audiopanorama — Positions audio streams in the stereo panorama

+
+
+

Synopsis

+
struct              GstAudioPanorama;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioPanorama
+
+
+
+

Properties

+
+  "panorama"                 gfloat                : Read / Write
+  "method"                   GstAudioPanoramaMethod  : Read / Write
+
+
+
+

Description

+

+Stereo panorama effect with controllable pan position. One can choose between the default psychoacoustic panning method, +which keeps the same perceived loudness, and a simple panning method that just controls the volume on one channel. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
+4
gst-launch audiotestsrc wave=saw ! audiopanorama panorama=-1.00 ! alsasink
+gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiopanorama panorama=-1.00 ! alsasink
+gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama panorama=-1.00 ! audioconvert ! alsasink
+gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama method=simple panorama=-0.50 ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Stefan Kost <ensonic@users.sf.net>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)32

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstAudioPanorama

+
struct GstAudioPanorama;
+

+

+
+
+
+

Property Details

+
+

The "panorama" property

+
  "panorama"                 gfloat                : Read / Write
+

Position in stereo panorama (-1.0 left -> 1.0 right).

+

Allowed values: [-1,1]

+

Default value: 0

+
+
+
+

The "method" property

+
  "method"                   GstAudioPanoramaMethod  : Read / Write
+

+Panning method: psychoacoustic mode keeps the same perceived loudness, +while simple mode just controls the volume of one channel. It's merely +a matter of taste which method should be chosen. +

+

Default value: Psychoacoustic Panning (default)

+

Since 0.10.6

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audiowsincband.html b/docs/plugins/html/gst-plugins-good-plugins-audiowsincband.html new file mode 100644 index 0000000..549a85b --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audiowsincband.html @@ -0,0 +1,233 @@ + + + + +audiowsincband + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiowsincband

+

audiowsincband — Band pass and band reject windowed sinc filter

+
+
+

Synopsis

+
struct              GstAudioWSincBand;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioFXBaseFIRFilter
+                                 +----GstAudioWSincBand
+
+
+
+

Properties

+
+  "lower-frequency"          gfloat                : Read / Write
+  "upper-frequency"          gfloat                : Read / Write
+  "mode"                     GstAudioWSincBandMode  : Read / Write
+  "window"                   GstAudioWSincBandWindow  : Read / Write
+  "length"                   gint                  : Read / Write
+
+
+
+

Description

+

+Attenuates all frequencies outside (bandpass) or inside (bandreject) of a frequency +band. The length parameter controls the rolloff, the window parameter +controls rolloff and stopband attenuation. The Hamming window provides a faster rolloff but a bit +worse stopband attenuation, the other way around for the Blackman window. +

+

+This element has the advantage over the Chebyshev bandpass and bandreject filter that it has +a much better rolloff when using a larger kernel size and almost linear phase. The only +disadvantage is the much slower execution time with larger kernels. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch audiotestsrc freq=1500 ! audioconvert ! audiosincband mode=band-pass lower-frequency=3000 upper-frequency=10000 length=501 window=blackman ! audioconvert ! alsasink
+gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiowsincband mode=band-reject lower-frequency=59 upper-frequency=61 length=10001 window=hamming ! audioconvert ! alsasink
+gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiowsincband mode=band-pass lower-frequency=1000 upper-frequency=2000 length=31 ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Thomas Vander Stichele <thomas at apestaart dot org>, Steven W. Smith, Dreamlab Technologies Ltd. <mathis.hofer@dreamlab.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioWSincBand

+
struct GstAudioWSincBand;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "lower-frequency" property

+
  "lower-frequency"          gfloat                : Read / Write
+

Cut-off lower frequency (Hz).

+

Allowed values: [0,100000]

+

Default value: 0

+
+
+
+

The "upper-frequency" property

+
  "upper-frequency"          gfloat                : Read / Write
+

Cut-off upper frequency (Hz).

+

Allowed values: [0,100000]

+

Default value: 0

+
+
+
+

The "mode" property

+
  "mode"                     GstAudioWSincBandMode  : Read / Write
+

Band pass or band reject mode.

+

Default value: Band pass (default)

+
+
+
+

The "window" property

+
  "window"                   GstAudioWSincBandWindow  : Read / Write
+

Window function to use.

+

Default value: Hamming window (default)

+
+
+
+

The "length" property

+
  "length"                   gint                  : Read / Write
+

Filter kernel length, will be rounded to the next odd number.

+

Allowed values: [3,256000]

+

Default value: 101

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-audiowsinclimit.html b/docs/plugins/html/gst-plugins-good-plugins-audiowsinclimit.html new file mode 100644 index 0000000..f6df2ca --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-audiowsinclimit.html @@ -0,0 +1,233 @@ + + + + +audiowsinclimit + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiowsinclimit

+

audiowsinclimit — Low pass and high pass windowed sinc filter

+
+
+

Synopsis

+
struct              GstAudioWSincLimit;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstAudioFXBaseFIRFilter
+                                 +----GstAudioWSincLimit
+
+
+
+

Properties

+
+  "frequency"                gdouble               : Read / Write
+  "length"                   gint                  : Read / Write
+  "mode"                     GstAudioWSincLimitMode  : Read / Write
+  "window"                   GstAudioWSincLimitWindow  : Read / Write
+  "cutoff"                   gfloat                : Read / Write
+
+
+
+

Description

+

+Attenuates all frequencies above the cutoff frequency (low-pass) or all frequencies below the +cutoff frequency (high-pass). The length parameter controls the rolloff, the window parameter +controls rolloff and stopband attenuation. The Hamming window provides a faster rolloff but a bit +worse stopband attenuation, the other way around for the Blackman window. +

+

+This element has the advantage over the Chebyshev lowpass and highpass filter that it has +a much better rolloff when using a larger kernel size and almost linear phase. The only +disadvantage is the much slower execution time with larger kernels. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch audiotestsrc freq=1500 ! audioconvert ! audiowsinclimit mode=low-pass frequency=1000 length=501 ! audioconvert ! alsasink
+gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiowsinclimit mode=high-pass frequency=15000 length=501 ! audioconvert ! alsasink
+gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiowsinclimit mode=low-pass frequency=1000 length=10001 window=blackman ! audioconvert ! alsasink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audiofx +

author

Thomas Vander Stichele <thomas at apestaart dot org>, Steven W. Smith, Dreamlab Technologies Ltd. <mathis.hofer@dreamlab.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstAudioWSincLimit

+
struct GstAudioWSincLimit;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "frequency" property

+
  "frequency"                gdouble               : Read / Write
+

Cut-off Frequency (Hz).

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "length" property

+
  "length"                   gint                  : Read / Write
+

Filter kernel length, will be rounded to the next odd number.

+

Allowed values: [3,256000]

+

Default value: 101

+
+
+
+

The "mode" property

+
  "mode"                     GstAudioWSincLimitMode  : Read / Write
+

Low pass or high pass mode.

+

Default value: Low pass (default)

+
+
+
+

The "window" property

+
  "window"                   GstAudioWSincLimitWindow  : Read / Write
+

Window function to use.

+

Default value: Hamming window (default)

+
+
+
+

The "cutoff" property

+
  "cutoff"                   gfloat                : Read / Write
+

Cut-off Frequency (Hz).

+

Allowed values: [0,100000]

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-auparse.html b/docs/plugins/html/gst-plugins-good-plugins-auparse.html new file mode 100644 index 0000000..7e7644b --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-auparse.html @@ -0,0 +1,163 @@ + + + + +auparse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

auparse

+

auparse — Parse an .au file into raw audio

+
+
+

Synopsis

+
struct              GstAuParse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstAuParse
+
+
+
+

Description

+

+Parses .au files mostly originating from sun os based computers. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ auparse +

author

Erik Walthinsen <omega@cse.ogi.edu>

class

Codec/Demuxer/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-au
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

sometimes

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }

audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]

audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string){ g721, g722, g723_3, g723_5 }
+
+
+

+

+
+
+

Details

+
+

struct GstAuParse

+
struct GstAuParse;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-autoaudiosink.html b/docs/plugins/html/gst-plugins-good-plugins-autoaudiosink.html new file mode 100644 index 0000000..44afb13 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-autoaudiosink.html @@ -0,0 +1,184 @@ + + + + +autoaudiosink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

autoaudiosink

+

autoaudiosink — Wrapper audio sink for automatically detected audio sink

+
+
+

Synopsis

+
                    GstAutoAudioSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstAutoAudioSink
+
+
+
+

Implemented Interfaces

+

+GstAutoAudioSink implements + GstChildProxy.

+
+
+

Properties

+
+  "filter-caps"              GstCaps*              : Read / Write
+
+
+
+

Description

+

+autoaudiosink is an audio sink that automatically detects an appropriate +audio sink to use. It does so by scanning the registry for all elements +that have “Sink” and “Audio” in the class field +of their element information, and also have a non-zero autoplugging rank. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v -m audiotestsrc ! audioconvert ! audioresample ! autoaudiosink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ autodetect +

author

Jan Schmidt <thaytan@noraisin.net>

class

Sink/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

GstAutoAudioSink

+
typedef struct _GstAutoAudioSink GstAutoAudioSink;
+

+

+
+
+
+

Property Details

+
+

The "filter-caps" property

+
  "filter-caps"              GstCaps*              : Read / Write
+

+This property will filter out candidate sinks that can handle the specified +caps. By default only audio sinks that support raw floating point and +integer audio are selected. +

+

+This property can only be set before the element goes to the READY state. +

+

Since 0.10.7

+
+
+
+

See Also

+autovideosink, alsasink, osssink +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-autoaudiosrc.html b/docs/plugins/html/gst-plugins-good-plugins-autoaudiosrc.html new file mode 100644 index 0000000..d1db3c8 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-autoaudiosrc.html @@ -0,0 +1,184 @@ + + + + +autoaudiosrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

autoaudiosrc

+

autoaudiosrc — Wrapper audio source for automatically detected audio source

+
+
+

Synopsis

+
                    GstAutoAudioSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstAutoAudioSrc
+
+
+
+

Implemented Interfaces

+

+GstAutoAudioSrc implements + GstChildProxy.

+
+
+

Properties

+
+  "filter-caps"              GstCaps*              : Read / Write
+
+
+
+

Description

+

+autoaudiosrc is an audio source that automatically detects an appropriate +audio source to use. It does so by scanning the registry for all elements +that have “Source” and “Audio” in the class field +of their element information, and also have a non-zero autoplugging rank. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v -m autoaudiosrc ! audioconvert ! audioresample ! autoaudiosink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ autodetect +

author

Jan Schmidt <thaytan@noraisin.net>, Stefan Kost <ensonic@users.sf.net>

class

Source/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

GstAutoAudioSrc

+
typedef struct _GstAutoAudioSrc GstAutoAudioSrc;
+

+

+
+
+
+

Property Details

+
+

The "filter-caps" property

+
  "filter-caps"              GstCaps*              : Read / Write
+

+This property will filter out candidate sinks that can handle the specified +caps. By default only audio sinks that support raw floating point and +integer audio are selected. +

+

+This property can only be set before the element goes to the READY state. +

+

Since 0.10.14

+
+
+
+

See Also

+autovideosrc, alsasrc, osssrc +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-autovideosink.html b/docs/plugins/html/gst-plugins-good-plugins-autovideosink.html new file mode 100644 index 0000000..249af93 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-autovideosink.html @@ -0,0 +1,184 @@ + + + + +autovideosink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

autovideosink

+

autovideosink — Wrapper video sink for automatically detected video sink

+
+
+

Synopsis

+
                    GstAutoVideoSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstAutoVideoSink
+
+
+
+

Implemented Interfaces

+

+GstAutoVideoSink implements + GstChildProxy.

+
+
+

Properties

+
+  "filter-caps"              GstCaps*              : Read / Write
+
+
+
+

Description

+

+autovideosink is a video sink that automatically detects an appropriate +video sink to use. It does so by scanning the registry for all elements +that have “Sink” and “Video” in the class field +of their element information, and also have a non-zero autoplugging rank. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v -m videotestsrc ! autovideosink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ autodetect +

author

Jan Schmidt <thaytan@noraisin.net>

class

Sink/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

GstAutoVideoSink

+
typedef struct _GstAutoVideoSink GstAutoVideoSink;
+

+

+
+
+
+

Property Details

+
+

The "filter-caps" property

+
  "filter-caps"              GstCaps*              : Read / Write
+

+This property will filter out candidate sinks that can handle the specified +caps. By default only video sinks that support raw rgb and yuv video +are selected. +

+

+This property can only be set before the element goes to the READY state. +

+

Since 0.10.7

+
+
+
+

See Also

+autoaudiosink, ximagesink, xvimagesink, sdlvideosink +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-autovideosrc.html b/docs/plugins/html/gst-plugins-good-plugins-autovideosrc.html new file mode 100644 index 0000000..7d2c275 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-autovideosrc.html @@ -0,0 +1,184 @@ + + + + +autovideosrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

autovideosrc

+

autovideosrc — Wrapper video source for automatically detected video source

+
+
+

Synopsis

+
                    GstAutoVideoSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstAutoVideoSrc
+
+
+
+

Implemented Interfaces

+

+GstAutoVideoSrc implements + GstChildProxy.

+
+
+

Properties

+
+  "filter-caps"              GstCaps*              : Read / Write
+
+
+
+

Description

+

+autovideosrc is a video src that automatically detects an appropriate +video source to use. It does so by scanning the registry for all elements +that have “Source” and “Video” in the class field +of their element information, and also have a non-zero autoplugging rank. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v -m autovideosrc ! xvimagesink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ autodetect +

author

Jan Schmidt <thaytan@noraisin.net>, Stefan Kost <ensonic@users.sf.net>

class

Source/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

GstAutoVideoSrc

+
typedef struct _GstAutoVideoSrc GstAutoVideoSrc;
+

+

+
+
+
+

Property Details

+
+

The "filter-caps" property

+
  "filter-caps"              GstCaps*              : Read / Write
+

+This property will filter out candidate sources that can handle the specified +caps. By default only video sources that support raw rgb and yuv video +are selected. +

+

+This property can only be set before the element goes to the READY state. +

+

Since 0.10.14

+
+
+
+

See Also

+autoaudiosrc, v4l2src, v4lsrc +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-avidemux.html b/docs/plugins/html/gst-plugins-good-plugins-avidemux.html new file mode 100644 index 0000000..3ef3c06 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-avidemux.html @@ -0,0 +1,645 @@ + + + + +avidemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

avidemux

+

avidemux — Demultiplex an avi file into audio and video

+
+
+

Synopsis

+
                    GstAviDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstAviDemux
+
+
+
+

Description

+

+Demuxes an .avi file into raw or compressed audio and/or video streams. +

+

+This element supports both push and pull-based scheduling, depending on the +capabilities of the upstream elements. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=test.avi ! avidemux name=demux  demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink   demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! autovideosink
+
+ Play (parse and decode) an .avi file and try to output it to +an automatically detected soundcard and videosink. If the AVI file contains +compressed audio or video data, this will only work if you have the +right decoder elements/plugins installed. +
+

+

+

+Last reviewed on 2006-12-29 (0.10.6) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ avi +

author

Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be>, Thijs Vermeir <thijsvermeir@gmail.com>

class

Codec/Demuxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-msvideo
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

audio_%02d

direction

source

presence

sometimes

details

audio/ms-gsm, rate=(int)[ 1, 96000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)3, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)2, rate=(int)[ 16000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]

audio/x-vorbis, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 2 ]

audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ]

audio/x-dts

audio/mpeg, mpegversion=(int)4, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 8 ]

audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-wms, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)dvi, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-truespeech, rate=(int)8000, channels=(int)[ 1, 2 ]

audio/x-wma, wmaversion=(int)1, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)2, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)3, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-vnd.sony.atrac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]

audio/x-voxware, voxwaretype=(int)117, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dk4, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dk3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dvi, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/AMR, rate=(int)8000, channels=(int)1

audio/AMR-WB, rate=(int)16000, channels=(int)1

audio/x-siren

application/x-ogg-avi

audio/x-avi-unknown
+
++ + + + + + + + + + + + + + + + + + +

name

subtitle_%02d

direction

source

presence

sometimes

details

application/x-subtitle-avi
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video_%02d

direction

source

presence

sometimes

details

video/x-3ivx, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-asus, asusversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-asus, asusversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-cirrus-logic-accupak, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-camstudio, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-compressed-yuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-rgb, bpp=(int){ 8, 24, 32 }, depth=(int){ 8, 24 }, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-divx, divxversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-divx, divxversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-truemotion, trueversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-dv, systemstream=(boolean)false, dvversion=(int)25, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-dv, systemstream=(boolean)false, dvversion=(int)50, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-divx, divxversion=(int)5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/mpeg, mpegversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-flash-video, flvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp6-flash, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)lucent, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h264, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-huffyuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-intel-h263, variant=(string)intel, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-indeo, indeoversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-indeo, indeoversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-indeo, indeoversion=(int)5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)lead, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h264, variant=(string)lead, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)microsoft, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/mpeg, mpegversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

image/jpeg, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-msmpeg, msmpegversion=(int)42, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-msmpeg, msmpegversion=(int)43, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/mpeg, systemstream=(boolean)false, mpegversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/mpeg, systemstream=(boolean)false, mpegversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-msmpeg, msmpegversion=(int)41, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-mszh, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

image/png, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-rle, layout=(string)microsoft, depth=(int)[ 1, 64 ], framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-indeo, indeoversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/sp5x, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-truemotion, trueversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-camtasia, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-ultimotion, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)UYVY, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-ati-vcr, vcrversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-ati-vcr, vcrversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)vdolive, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)vivo, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vmnc, version=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h264, variant=(string)videosoft, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-wmv, wmvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-wmv, wmvversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-wmv, wmvversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-xvid, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-xan, wcversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)YUY2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)YVU9, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-zlib, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-cinepak, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h264, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-msvideocodec, msvideoversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)xirlink, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-dirac, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-ffv, ffvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-kmvc, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp6, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp6-flash, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp7, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp8, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-mimic, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-apple-video, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-theora, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-fraps, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-aasc, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)YV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-loco, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-zmbv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-dv, systemstream=(boolean)true

video/x-avi-unknown
+
+
+

+

+
+
+

Details

+
+

GstAviDemux

+
typedef struct _GstAviDemux GstAviDemux;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-avimux.html b/docs/plugins/html/gst-plugins-good-plugins-avimux.html new file mode 100644 index 0000000..b8477bc --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-avimux.html @@ -0,0 +1,323 @@ + + + + +avimux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

avimux

+

avimux — Muxes audio and video into an avi stream

+
+
+

Synopsis

+
struct              GstAviMux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstAviMux
+
+
+
+

Implemented Interfaces

+

+GstAviMux implements + GstTagSetter.

+
+
+

Properties

+
+  "bigfile"                  gboolean              : Read / Write
+
+
+
+

Description

+

+Muxes raw or compressed audio and/or video streams into an AVI file. +

+

+

+
+

Example launch lines

+

(write everything in one line, without the backslash characters)

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
gst-launch videotestsrc num-buffers=250 \
+! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \
+! queue ! mux. \
+audiotestsrc num-buffers=440 ! audioconvert \
+! 'audio/x-raw-int,rate=44100,channels=2' ! queue ! mux. \
+avimux name=mux ! filesink location=test.avi
+
+ This will create an .AVI file containing an uncompressed video stream +with a test picture and an uncompressed audio stream containing a +test sound. +
+ + + + + + + +
1
+2
+3
+4
+5
+6
gst-launch videotestsrc num-buffers=250 \
+! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \
+! xvidenc ! queue ! mux. \
+audiotestsrc num-buffers=440 ! audioconvert ! 'audio/x-raw-int,rate=44100,channels=2' \
+! lame ! queue ! mux. \
+avimux name=mux ! filesink location=test.avi
+
+ This will create an .AVI file containing the same test video and sound +as above, only that both streams will be compressed this time. This will +only work if you have the necessary encoder elements installed of course. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ avi +

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

audio_%d

direction

sink

presence

request

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-wma, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], wmaversion=(int)[ 1, 2 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video_%d

direction

sink

presence

request

details

video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], divxversion=(int)[ 3, 5 ]

video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], msmpegversion=(int)[ 41, 43 ]

video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false

video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-dv, width=(int)720, height=(int){ 576, 480 }, framerate=(fraction)[ 0/1, 2147483647/1 ], systemstream=(boolean)false

video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-wmv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], wmvversion=(int)[ 1, 3 ]

image/x-jpc, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-vp8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-msvideo
+
+
+

+

+
+
+

Details

+
+

struct GstAviMux

+
struct GstAviMux;
+

+

+
+
+
+

Property Details

+
+

The "bigfile" property

+
  "bigfile"                  gboolean              : Read / Write
+

Support for openDML-2.0 (big) AVI files.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-avisubtitle.html b/docs/plugins/html/gst-plugins-good-plugins-avisubtitle.html new file mode 100644 index 0000000..962d75a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-avisubtitle.html @@ -0,0 +1,165 @@ + + + + +avisubtitle + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

avisubtitle

+

avisubtitle — Parse avi subtitle stream

+
+
+

Synopsis

+
struct              GstAviSubtitle;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstAviSubtitle
+
+
+
+

Description

+

+

+
+

Example launch line

+

+Parses the subtitle stream from an avi file. +

+

+

+
+gst-launch filesrc location=subtitle.avi ! avidemux name=demux ! queue ! avisubtitle ! subparse ! textoverlay name=overlay ! ffmpegcolorspace ! autovideosink demux. ! queue ! decodebin ! overlay.
+
+

+This plays an avi file with a video and subtitle stream. +

+
+

+

+

+Last reviewed on 2008-02-01 +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ avi +

author

Thijs Vermeir <thijsvermeir@gmail.com>

class

Codec/Parser/Subtitle
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

application/x-subtitle-avi
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

application/x-subtitle
+
+
+

+

+
+
+

Details

+
+

struct GstAviSubtitle

+
struct GstAviSubtitle;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-cacasink.html b/docs/plugins/html/gst-plugins-good-plugins-cacasink.html new file mode 100644 index 0000000..c070a2a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-cacasink.html @@ -0,0 +1,179 @@ + + + + +cacasink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cacasink

+

cacasink — A colored ASCII art videosink

+
+
+

Synopsis

+
struct              GstCACASink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstCACASink
+
+
+
+

Properties

+
+  "anti-aliasing"            gboolean              : Read / Write
+  "dither"                   GstCACASinkDithering  : Read / Write
+  "screen-height"            gint                  : Read
+  "screen-width"             gint                  : Read
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ cacasink +

author

Zeeshan Ali <zak147@yahoo.com>

class

Sink/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstCACASink

+
struct GstCACASink;
+

+

+
+
+
+

Property Details

+
+

The "anti-aliasing" property

+
  "anti-aliasing"            gboolean              : Read / Write
+

Enables Anti-Aliasing.

+

Default value: TRUE

+
+
+
+

The "dither" property

+
  "dither"                   GstCACASinkDithering  : Read / Write
+

Set type of Dither.

+

Default value: No dithering

+
+
+
+

The "screen-height" property

+
  "screen-height"            gint                  : Read
+

The height of the screen.

+

Allowed values: >= 0

+

Default value: 25

+
+
+
+

The "screen-width" property

+
  "screen-width"             gint                  : Read
+

The width of the screen.

+

Allowed values: >= 0

+

Default value: 80

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-cairooverlay.html b/docs/plugins/html/gst-plugins-good-plugins-cairooverlay.html new file mode 100644 index 0000000..721188e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-cairooverlay.html @@ -0,0 +1,211 @@ + + + + +cairooverlay + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairooverlay

+

cairooverlay — Render overlay on a video stream using Cairo

+
+
+

Synopsis

+
struct              GstCairoOverlay;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstCairoOverlay
+
+
+
+

Signals

+
+  "caps-changed"                                   
+  "draw"                                           
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ cairo +

author

Jon Nordby <jononor@gmail.com>

class

Filter/Editor/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstCairoOverlay

+
struct GstCairoOverlay;
+

+

+
+
+
+

Signal Details

+
+

The "caps-changed" signal

+
void                user_function                      (GstCairoOverlay *gstcairooverlay,
+                                                        GstCaps         *arg1,
+                                                        gpointer         user_data)
+

+

+
++ + + + + + + + + + +

gstcairooverlay :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "draw" signal

+
void                user_function                      (GstCairoOverlay *gstcairooverlay,
+                                                        CairoContext    *arg1,
+                                                        guint64          arg2,
+                                                        guint64          arg3,
+                                                        gpointer         user_data)
+

+

+
++ + + + + + + + + + +

gstcairooverlay :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-cairorender.html b/docs/plugins/html/gst-plugins-good-plugins-cairorender.html new file mode 100644 index 0000000..c05b46d --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-cairorender.html @@ -0,0 +1,172 @@ + + + + +cairorender + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairorender

+

cairorender — Encodes streams using Cairo

+
+
+

Synopsis

+
struct              GstCairoRender;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstCairoRender
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ cairo +

author

Lutz Mueller <lutz@topfrose.de>

class

Codec/Encoder
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/png, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

application/pdf, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

application/postscript, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

image/svg+xml, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

image/png, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstCairoRender

+
struct GstCairoRender;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-cairotextoverlay.html b/docs/plugins/html/gst-plugins-good-plugins-cairotextoverlay.html new file mode 100644 index 0000000..909f327 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-cairotextoverlay.html @@ -0,0 +1,254 @@ + + + + +cairotextoverlay + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairotextoverlay

+

cairotextoverlay — Adds text strings on top of a video buffer

+
+
+

Synopsis

+
struct              GstCairoTextOverlay;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstCairoTextOverlay
+
+
+
+

Properties

+
+  "deltax"                   gint                  : Write
+  "deltay"                   gint                  : Write
+  "font-desc"                gchar*                : Write
+  "halign"                   gchar*                : Write
+  "shaded-background"        gboolean              : Write
+  "text"                     gchar*                : Write
+  "valign"                   gchar*                : Write
+  "xpad"                     gint                  : Write
+  "ypad"                     gint                  : Write
+  "silent"                   gboolean              : Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ cairo +

author

David Schleef <ds@schleef.org>

class

Filter/Editor/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

text_sink

direction

sink

presence

always

details

text/plain
+
++ + + + + + + + + + + + + + + + + + +

name

video_sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstCairoTextOverlay

+
struct GstCairoTextOverlay;
+

+

+
+
+
+

Property Details

+
+

The "deltax" property

+
  "deltax"                   gint                  : Write
+

Shift X position to the left or to the right. Unit is pixels.

+

Default value: 0

+
+
+
+

The "deltay" property

+
  "deltay"                   gint                  : Write
+

Shift Y position up or down. Unit is pixels.

+

Default value: 0

+
+
+
+

The "font-desc" property

+
  "font-desc"                gchar*                : Write
+

Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax.

+

Default value: ""

+
+
+
+

The "halign" property

+
  "halign"                   gchar*                : Write
+

Horizontal alignment of the text. Can be either 'left', 'right', or 'center'.

+

Default value: "center"

+
+
+
+

The "shaded-background" property

+
  "shaded-background"        gboolean              : Write
+

Whether to shade the background under the text area.

+

Default value: FALSE

+
+
+
+

The "text" property

+
  "text"                     gchar*                : Write
+

Text to be display.

+

Default value: ""

+
+
+
+

The "valign" property

+
  "valign"                   gchar*                : Write
+

Vertical alignment of the text. Can be either 'baseline', 'bottom', or 'top'.

+

Default value: "baseline"

+
+
+
+

The "xpad" property

+
  "xpad"                     gint                  : Write
+

Horizontal paddding when using left/right alignment.

+

Default value: 25

+
+
+
+

The "ypad" property

+
  "ypad"                     gint                  : Write
+

Vertical padding when using top/bottom alignment.

+

Default value: 25

+
+
+
+

The "silent" property

+
  "silent"                   gboolean              : Write
+

Whether to render the text string.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-cairotimeoverlay.html b/docs/plugins/html/gst-plugins-good-plugins-cairotimeoverlay.html new file mode 100644 index 0000000..02e7dbe --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-cairotimeoverlay.html @@ -0,0 +1,145 @@ + + + + +cairotimeoverlay + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairotimeoverlay

+

cairotimeoverlay — Overlays the time on a video stream

+
+
+

Synopsis

+
                    GstCairoTimeOverlay;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstCairoTimeOverlay
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ cairo +

author

David Schleef <ds@schleef.org>

class

Filter/Editor/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

GstCairoTimeOverlay

+
typedef struct _GstCairoTimeOverlay GstCairoTimeOverlay;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-capssetter.html b/docs/plugins/html/gst-plugins-good-plugins-capssetter.html new file mode 100644 index 0000000..af6903a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-capssetter.html @@ -0,0 +1,208 @@ + + + + +capssetter + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

capssetter

+

capssetter — Set/merge caps on stream

+
+
+

Synopsis

+
struct              GstCapsSetter;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstCapsSetter
+
+
+
+

Properties

+
+  "caps"                     GstCaps*              : Read / Write
+  "join"                     gboolean              : Read / Write
+  "replace"                  gboolean              : Read / Write
+
+
+
+

Description

+

+

+
+

+Sets or merges caps on a stream's buffers. +That is, a buffer's caps are updated using (fields of) +caps. Note that this may +contain multiple structures (though not likely recommended), but each +of these must be fixed (or will otherwise be rejected). +

+

+If join +is TRUE, then the incoming caps' mime-type is compared to the mime-type(s) +of provided caps and only matching structure(s) are considered for updating. +

+

+If replace +is TRUE, then any caps update is preceded by clearing existing fields, +making provided fields (as a whole) replace incoming ones. +Otherwise, no clearing is performed, in which case provided fields are +added/merged onto incoming caps +

+

+Although this element might mainly serve as debug helper, +it can also practically be used to correct a faulty pixel-aspect-ratio, +or to modify a yuv fourcc value to effectively swap chroma components or such +alike. +

+
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ debug +

author

Mark Nauwelaerts <mnauw@users.sourceforge.net>

class

Generic
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstCapsSetter

+
struct GstCapsSetter;
+

+

+
+
+
+

Property Details

+
+

The "caps" property

+
  "caps"                     GstCaps*              : Read / Write
+

Merge these caps (thereby overwriting) in the stream.

+
+
+
+

The "join" property

+
  "join"                     gboolean              : Read / Write
+

Match incoming caps' mime-type to mime-type of provided caps.

+

Default value: TRUE

+
+
+
+

The "replace" property

+
  "replace"                  gboolean              : Read / Write
+

Drop fields of incoming caps.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-cmmldec.html b/docs/plugins/html/gst-plugins-good-plugins-cmmldec.html new file mode 100644 index 0000000..ee2fde8 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-cmmldec.html @@ -0,0 +1,161 @@ + + + + +cmmldec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cmmldec

+

cmmldec — Decodes CMML streams

+
+
+

Synopsis

+
struct              GstCmmlDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstCmmlDec
+
+
+
+

Properties

+
+  "wait-clip-end-time"       gboolean              : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ annodex +

author

Alessandro Decina <alessandro@nnva.org>

class

Codec/Decoder
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

text/x-cmml, encoded=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

text/x-cmml, encoded=(boolean)false
+
+
+

+

+
+
+

Details

+
+

struct GstCmmlDec

+
struct GstCmmlDec;
+

+

+
+
+
+

Property Details

+
+

The "wait-clip-end-time" property

+
  "wait-clip-end-time"       gboolean              : Read / Write
+

Send a tag for a clip when the clip ends, setting its end-time. Use when you need to know both clip's start-time and end-time.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-cmmlenc.html b/docs/plugins/html/gst-plugins-good-plugins-cmmlenc.html new file mode 100644 index 0000000..d61c057 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-cmmlenc.html @@ -0,0 +1,180 @@ + + + + +cmmlenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cmmlenc

+

cmmlenc — Encodes CMML streams

+
+
+

Synopsis

+
struct              GstCmmlEnc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstCmmlEnc
+
+
+
+

Properties

+
+  "granule-rate-denominator" gint64                : Read / Write / Construct
+  "granule-rate-numerator"   gint64                : Read / Write / Construct
+  "granule-shift"            guchar                : Read / Write / Construct
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ annodex +

author

Alessandro Decina <alessandro@nnva.org>

class

Codec/Encoder
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

text/x-cmml, encoded=(boolean)false
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

text/x-cmml, encoded=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstCmmlEnc

+
struct GstCmmlEnc;
+

+

+
+
+
+

Property Details

+
+

The "granule-rate-denominator" property

+
  "granule-rate-denominator" gint64                : Read / Write / Construct
+

Granulerate denominator.

+

Allowed values: >= 0

+

Default value: 1

+
+
+
+

The "granule-rate-numerator" property

+
  "granule-rate-numerator"   gint64                : Read / Write / Construct
+

Granulerate numerator.

+

Allowed values: >= 0

+

Default value: 1000

+
+
+
+

The "granule-shift" property

+
  "granule-shift"            guchar                : Read / Write / Construct
+

The number of lower bits to use for partitioning a granule position.

+

Allowed values: <= 64

+

Default value: 32

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-cutter.html b/docs/plugins/html/gst-plugins-good-plugins-cutter.html new file mode 100644 index 0000000..9ad5fe5 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-cutter.html @@ -0,0 +1,231 @@ + + + + +cutter + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cutter

+

cutter — Audio Cutter to split audio into non-silent bits

+
+
+

Synopsis

+
struct              GstCutter;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstCutter
+
+
+
+

Properties

+
+  "leaky"                    gboolean              : Read / Write
+  "pre-length"               guint64               : Read / Write
+  "run-length"               guint64               : Read / Write
+  "threshold"                gdouble               : Read / Write
+  "threshold-dB"             gdouble               : Read / Write
+
+
+
+

Description

+

+Analyses the audio signal for periods of silence. The start and end of +silence is signalled by bus messages named +"cutter". +The message's structure contains two fields: +

+
    +
  • + GstClockTime + "timestamp": + the timestamp of the buffer that triggered the message. +

  • +
  • + gboolean + "above": + TRUE for begin of silence and FALSE for end of silence. +

  • +
+

+

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -m filesrc location=foo.ogg ! decodebin ! audioconvert ! cutter ! autoaudiosink
+
+ Show cut messages. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ cutter +

author

Thomas Vander Stichele <thomas at apestaart dot org>

class

Filter/Editor/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstCutter

+
struct GstCutter;
+

+

+
+
+
+

Property Details

+
+

The "leaky" property

+
  "leaky"                    gboolean              : Read / Write
+

do we leak buffers when below threshold ?.

+

Default value: FALSE

+
+
+
+

The "pre-length" property

+
  "pre-length"               guint64               : Read / Write
+

Length of pre-recording buffer (in nanoseconds).

+

Default value: 0

+
+
+
+

The "run-length" property

+
  "run-length"               guint64               : Read / Write
+

Length of drop below threshold before cut_stop (in nanoseconds).

+

Default value: 0

+
+
+
+

The "threshold" property

+
  "threshold"                gdouble               : Read / Write
+

Volume threshold before trigger.

+

Default value: 0

+
+
+
+

The "threshold-dB" property

+
  "threshold-dB"             gdouble               : Read / Write
+

Volume threshold before trigger (in dB).

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-dcaparse.html b/docs/plugins/html/gst-plugins-good-plugins-dcaparse.html new file mode 100644 index 0000000..469737a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-dcaparse.html @@ -0,0 +1,171 @@ + + + + +dcaparse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

dcaparse

+

dcaparse — DCA (DTS Coherent Acoustics) parser

+
+
+

Synopsis

+
struct              GstDcaParse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseParse
+                     +----GstDcaParse
+
+
+
+

Description

+

+This is a DCA (DTS Coherent Acoustics) parser. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=abc.dts ! dcaparse ! dtsdec ! audioresample ! audioconvert ! autoaudiosink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audioparsers +

author

Tim-Philipp Müller <tim centricular net>

class

Codec/Parser/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-dts
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-dts, framed=(boolean)true, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 192000 ], depth=(int){ 14, 16 }, endianness=(int){ 1234, 4321 }, block-size=(int)[ 1, 2147483647 ], frame-size=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstDcaParse

+
struct GstDcaParse;
+

+The opaque GstDcaParse object +

+
+
+
+

See Also

+GstAmrParse, GstAACParse, GstAc3Parse +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-deinterlace.html b/docs/plugins/html/gst-plugins-good-plugins-deinterlace.html new file mode 100644 index 0000000..02b1ce0 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-deinterlace.html @@ -0,0 +1,394 @@ + + + + +deinterlace + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

deinterlace

+

deinterlace — Deinterlace Methods ported from DScaler/TvTime

+
+
+

Synopsis

+
struct              GstDeinterlace;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstDeinterlace
+
+
+
+

Implemented Interfaces

+

+GstDeinterlace implements + GstChildProxy.

+
+
+

Properties

+
+  "fields"                   GstDeinterlaceFields  : Read / Write
+  "method"                   GstDeinterlaceMethods  : Read / Write
+  "mode"                     GstDeinterlaceModes   : Read / Write
+  "tff"                      GstDeinterlaceFieldLayout  : Read / Write
+  "drop-orphans"             gboolean              : Read / Write
+  "ignore-obscure"           gboolean              : Read / Write
+  "locking"                  GstDeinterlaceLocking  : Read / Write
+
+
+
+

Description

+

+deinterlace deinterlaces interlaced video frames to progressive video frames. +For this different algorithms can be selected which will be described later. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v filesrc location=/path/to/file ! decodebin2 ! ffmpegcolorspace ! deinterlace ! ffmpegcolorspace ! autovideosink
+
+ This pipeline deinterlaces a video file with the default deinterlacing options. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ deinterlace +

author

Martin Eikermann <meiker@upb.de>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video/Deinterlace
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc){ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc){ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstDeinterlace

+
struct GstDeinterlace;
+

+

+
+
+
+

Property Details

+
+

The "fields" property

+
  "fields"                   GstDeinterlaceFields  : Read / Write
+

+This selects which fields should be output. If "all" is selected +the output framerate will be double. +

+

Default value: All fields

+
+
+
+

The "method" property

+
  "method"                   GstDeinterlaceMethods  : Read / Write
+

+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. +

+

+

+
    +
  • +tomsmocomp +Motion Adaptive: Motion Search +

  • +
  • +greedyh +Motion Adaptive: Advanced Detection +

  • +
  • +greedyl +Motion Adaptive: Simple Detection +

  • +
  • +vfir +Blur vertical +

  • +
  • +linear +Linear interpolation +

  • +
  • +linearblend +Linear interpolation in time domain. Any motion causes significant +ghosting, so this method should not be used. +

  • +
  • +scalerbob +Double lines +

  • +
  • +weave +Weave. Bad quality, do not use. +

  • +
  • +weavetff +Progressive: Top Field First. Bad quality, do not use. +

  • +
  • +weavebff +Progressive: Bottom Field First. Bad quality, do not use. +

  • +
+

+

+

Default value: Television: Full resolution

+
+
+
+

The "mode" property

+
  "mode"                     GstDeinterlaceModes   : Read / Write
+

+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. +

+

Default value: Auto detection

+
+
+
+

The "tff" property

+
  "tff"                      GstDeinterlaceFieldLayout  : Read / Write
+

Deinterlace top field first.

+

Default value: Auto detection

+
+
+
+

The "drop-orphans" property

+
  "drop-orphans"             gboolean              : Read / Write
+

+This selects whether to drop orphan fields at the beginning of telecine +patterns in active locking mode. +

+

Default value: TRUE

+

Since 0.10.31

+
+
+
+

The "ignore-obscure" property

+
  "ignore-obscure"           gboolean              : Read / Write
+

+This selects whether to ignore obscure/rare telecine patterns. +NTSC 2:3 pulldown variants are the only really common patterns. +

+

Default value: TRUE

+

Since 0.10.31

+
+
+
+

The "locking" property

+
  "locking"                  GstDeinterlaceLocking  : Read / Write
+

+This selects which approach to pattern locking is used which affects +processing latency and accuracy of timestamp adjustment for telecine +streams. +

+

Default value: No pattern locking

+

Since 0.10.31

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-deinterleave.html b/docs/plugins/html/gst-plugins-good-plugins-deinterleave.html new file mode 100644 index 0000000..ff669da --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-deinterleave.html @@ -0,0 +1,223 @@ + + + + +deinterleave + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

deinterleave

+

deinterleave — Splits one interleaved multichannel audio stream into many mono audio streams

+
+
+

Synopsis

+
struct              GstDeinterleave;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstDeinterleave
+
+
+
+

Properties

+
+  "keep-positions"           gboolean              : Read / Write
+
+
+
+

Description

+

+Splits one interleaved multichannel audio stream into many mono audio streams. +

+

+This element handles all raw audio formats and supports changing the input caps as long as +all downstream elements can handle the new caps and the number of channels and the channel +positions stay the same. This restriction will be removed in later versions by adding or +removing some source pads as required. +

+

+In most cases a queue and an audioconvert element should be added after each source pad +before further processing of the audio data. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=/path/to/file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2 ! deinterleave name=d  d.src0 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel1.ogg  d.src1 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel2.ogg
+
+ Decodes an MP3 file and encodes the left and right channel into separate +Ogg Vorbis files. +
+ + + + + + + +
1
gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2" ! deinterleave name=d  interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav    d.src0 ! queue ! audioconvert ! i.sink1    d.src1 ! queue ! audioconvert ! i.sink0
+
+ Decodes and deinterleaves a Stereo MP3 file into separate channels and +then interleaves the channels again to a WAV file with the channel with the +channels exchanged. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ interleave +

author

Andy Wingo <wingo at pobox.com>, Iain <iain@prettypeople.org>, Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Converter/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src%d

direction

source

presence

sometimes

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
+
+
+

+

+
+
+

Details

+
+

struct GstDeinterleave

+
struct GstDeinterleave;
+

+

+
+
+
+

Property Details

+
+

The "keep-positions" property

+
  "keep-positions"           gboolean              : Read / Write
+

+Keep positions: When enable the caps on the output buffers will +contain the original channel positions. This can be used to correctly +interleave the output again later but can also lead to unwanted effects +if the output should be handled as Mono. +

+

Default value: FALSE

+
+
+
+

See Also

+interleave +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-dicetv.html b/docs/plugins/html/gst-plugins-good-plugins-dicetv.html new file mode 100644 index 0000000..0a83531 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-dicetv.html @@ -0,0 +1,245 @@ + + + + +dicetv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

dicetv

+

dicetv — 'Dices' the screen up into many small squares

+
+
+

Synopsis

+
struct              GstDiceTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstDiceTV
+
+
+
+

Properties

+
+  "square-bits"              gint                  : Read / Write
+
+
+
+

Signals

+
+  "reset"                                          : Run Last
+
+
+
+

Description

+

+DiceTV 'dices' the screen up into many small squares, each defaulting +to a size of 16 pixels by 16 pixels.. Each square is rotated randomly +in one of four directions: up (no change), down (180 degrees, or +upside down), right (90 degrees clockwise), or left (90 degrees +counterclockwise). The direction of each square normally remains +consistent between each frame. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! dicetv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of dicetv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstDiceTV

+
struct GstDiceTV;
+

+

+
+
+
+

Property Details

+
+

The "square-bits" property

+
  "square-bits"              gint                  : Read / Write
+

The size of the Squares.

+

Allowed values: [0,5]

+

Default value: 4

+
+
+
+

Signal Details

+
+

The "reset" signal

+
void                user_function                      (GstDiceTV *gstdicetv,
+                                                        gpointer   user_data)      : Run Last
+

+

+
++ + + + + + + + + + +

gstdicetv :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-directsoundsink.html b/docs/plugins/html/gst-plugins-good-plugins-directsoundsink.html new file mode 100644 index 0000000..b27a7aa --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-directsoundsink.html @@ -0,0 +1,123 @@ + + + + +directsoundsink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

directsoundsink

+

directsoundsink — DirectSound audio sink

+
+
+

Synopsis

+
struct              GstDirectSoundSink;
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ directsound +

author

Sebastien Moutte <sebastien@moutte.net>

class

Sink/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstDirectSoundSink

+
struct GstDirectSoundSink {
+  GstAudioSink sink;
+
+  /* directsound object interface pointer */
+  LPDIRECTSOUND pDS;
+
+  /* directsound sound object interface pointer */
+  LPDIRECTSOUNDBUFFER pDSBSecondary;
+
+  /* directSound buffer size */
+  guint buffer_size;
+
+  /* offset of the circular buffer where we must write next */
+  guint current_circular_offset;
+
+  guint bytes_per_sample;
+
+  /* current volume setup by mixer interface */
+  glong volume;
+
+  /* tracks list of our mixer interface implementation */
+  GList *tracks;
+
+  GstCaps *cached_caps;
+
+  /* lock used to protect writes and resets */
+  GMutex *dsound_lock;
+
+  gboolean first_buffer_after_reset;
+
+  GstBufferFormat buffer_format;
+};
+
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-dv1394src.html b/docs/plugins/html/gst-plugins-good-plugins-dv1394src.html new file mode 100644 index 0000000..1f8ac60 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-dv1394src.html @@ -0,0 +1,241 @@ + + + + +dv1394src + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

dv1394src

+

dv1394src — Source for DV video data from firewire port

+
+
+

Synopsis

+
struct              GstDV1394Src;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstDV1394Src
+
+
+
+

Implemented Interfaces

+

+GstDV1394Src implements + GstURIHandler and GstPropertyProbe.

+
+
+

Properties

+
+  "channel"                  gint                  : Read / Write
+  "consecutive"              gint                  : Read / Write
+  "drop-incomplete"          gboolean              : Read / Write
+  "guid"                     guint64               : Read / Write
+  "port"                     gint                  : Read / Write
+  "skip"                     gint                  : Read / Write
+  "use-avc"                  gboolean              : Read / Write
+  "device-name"              gchar*                : Read
+
+
+
+

Signals

+
+  "frame-dropped"                                  : Run Last
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ 1394 +

author

Erik Walthinsen <omega@temple-baptist.com>, Daniel Fischer <dan@f3c.com>, Wim Taymans <wim@fluendo.com>, Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Source/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-dv, format=(string){ NTSC, PAL }, systemstream=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstDV1394Src

+
struct GstDV1394Src;
+

+

+
+
+
+

Property Details

+
+

The "channel" property

+
  "channel"                  gint                  : Read / Write
+

Channel number for listening.

+

Allowed values: [0,64]

+

Default value: 63

+
+
+
+

The "consecutive" property

+
  "consecutive"              gint                  : Read / Write
+

send n consecutive frames after skipping.

+

Allowed values: >= 1

+

Default value: 1

+
+
+
+

The "drop-incomplete" property

+
  "drop-incomplete"          gboolean              : Read / Write
+

drop incomplete frames.

+

Default value: TRUE

+
+
+
+

The "guid" property

+
  "guid"                     guint64               : Read / Write
+

select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid).

+

Default value: 0

+
+
+
+

The "port" property

+
  "port"                     gint                  : Read / Write
+

Port number (-1 automatic).

+

Allowed values: [G_MAXULONG,16]

+

Default value: -1

+
+
+
+

The "skip" property

+
  "skip"                     gint                  : Read / Write
+

skip n frames.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "use-avc" property

+
  "use-avc"                  gboolean              : Read / Write
+

Use AV/C VTR control.

+

Default value: TRUE

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

user-friendly name of the device.

+

Default value: "Default"

+
+
+
+

Signal Details

+
+

The "frame-dropped" signal

+
void                user_function                      (GstDV1394Src *gstdv1394src,
+                                                        gpointer      user_data)         : Run Last
+

+

+
++ + + + + + + + + + +

gstdv1394src :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-dvdec.html b/docs/plugins/html/gst-plugins-good-plugins-dvdec.html new file mode 100644 index 0000000..70032aa --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-dvdec.html @@ -0,0 +1,194 @@ + + + + +dvdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

dvdec

+

dvdec — Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net)

+
+
+

Synopsis

+
struct              GstDVDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstDVDec
+
+
+
+

Properties

+
+  "clamp-chroma"             gboolean              : Read / Write
+  "clamp-luma"               gboolean              : Read / Write
+  "drop-factor"              gint                  : Read / Write
+  "quality"                  GstDVDecQualityEnum   : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ dv +

author

Erik Walthinsen <omega@cse.ogi.edu>,Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-dv, systemstream=(boolean)false
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstDVDec

+
struct GstDVDec;
+

+

+
+
+
+

Property Details

+
+

The "clamp-chroma" property

+
  "clamp-chroma"             gboolean              : Read / Write
+

Clamp chroma.

+

Default value: FALSE

+
+
+
+

The "clamp-luma" property

+
  "clamp-luma"               gboolean              : Read / Write
+

Clamp luma.

+

Default value: FALSE

+
+
+
+

The "drop-factor" property

+
  "drop-factor"              gint                  : Read / Write
+

Only decode Nth frame.

+

Allowed values: >= 1

+

Default value: 1

+
+
+
+

The "quality" property

+
  "quality"                  GstDVDecQualityEnum   : Read / Write
+

Decoding quality.

+

Default value: Highest quality colour decoding

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-dvdemux.html b/docs/plugins/html/gst-plugins-good-plugins-dvdemux.html new file mode 100644 index 0000000..d0da8cb --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-dvdemux.html @@ -0,0 +1,165 @@ + + + + +dvdemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

dvdemux

+

dvdemux — Uses libdv to separate DV audio from DV video (libdv.sourceforge.net)

+
+
+

Synopsis

+
struct              GstDVDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstDVDemux
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ dv +

author

Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com>

class

Codec/Demuxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-dv, systemstream=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

audio

direction

source

presence

sometimes

details

audio/x-raw-int, depth=(int)16, width=(int)16, signed=(boolean)true, channels=(int){ 2, 4 }, endianness=(int)1234, rate=(int){ 32000, 44100, 48000 }
+
++ + + + + + + + + + + + + + + + + + +

name

video

direction

source

presence

sometimes

details

video/x-dv, systemstream=(boolean)false
+
+
+

+

+
+
+

Details

+
+

struct GstDVDemux

+
struct GstDVDemux;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-edgetv.html b/docs/plugins/html/gst-plugins-good-plugins-edgetv.html new file mode 100644 index 0000000..b187c17 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-edgetv.html @@ -0,0 +1,176 @@ + + + + +edgetv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

edgetv

+

edgetv — Apply edge detect on video

+
+
+

Synopsis

+
struct              GstEdgeTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstEdgeTV
+
+
+
+

Description

+

+EdgeTV detects edges and display it in good old low resolution +computer way. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! edgetv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of edgetv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstEdgeTV

+
struct GstEdgeTV;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-equalizer-10bands.html b/docs/plugins/html/gst-plugins-good-plugins-equalizer-10bands.html new file mode 100644 index 0000000..7923f9a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-equalizer-10bands.html @@ -0,0 +1,284 @@ + + + + +equalizer-10bands + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

equalizer-10bands

+

equalizer-10bands — Direct Form 10 band IIR equalizer

+
+
+

Synopsis

+
struct              GstIirEqualizer10Bands;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstIirEqualizer
+                                 +----GstIirEqualizer10Bands
+
+
+
+

Implemented Interfaces

+

+GstIirEqualizer10Bands implements + GstChildProxy and GstPreset.

+
+
+

Properties

+
+  "band0"                    gdouble               : Read / Write
+  "band1"                    gdouble               : Read / Write
+  "band2"                    gdouble               : Read / Write
+  "band3"                    gdouble               : Read / Write
+  "band4"                    gdouble               : Read / Write
+  "band5"                    gdouble               : Read / Write
+  "band6"                    gdouble               : Read / Write
+  "band7"                    gdouble               : Read / Write
+  "band8"                    gdouble               : Read / Write
+  "band9"                    gdouble               : Read / Write
+
+
+
+

Description

+

+The 10 band equalizer element allows to change the gain of 10 equally distributed +frequency bands between 30 Hz and 15 kHz. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-10bands band2=3.0 ! alsasink
+
+ This raises the volume of the 3rd band which is at 119 Hz by 3 db. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ equalizer +

author

Stefan Kost <ensonic@users.sf.net>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstIirEqualizer10Bands

+
struct GstIirEqualizer10Bands;
+

+

+
+
+
+

Property Details

+
+

The "band0" property

+
  "band0"                    gdouble               : Read / Write
+

gain for the frequency band 29 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band1" property

+
  "band1"                    gdouble               : Read / Write
+

gain for the frequency band 59 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band2" property

+
  "band2"                    gdouble               : Read / Write
+

gain for the frequency band 119 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band3" property

+
  "band3"                    gdouble               : Read / Write
+

gain for the frequency band 237 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band4" property

+
  "band4"                    gdouble               : Read / Write
+

gain for the frequency band 474 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band5" property

+
  "band5"                    gdouble               : Read / Write
+

gain for the frequency band 947 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band6" property

+
  "band6"                    gdouble               : Read / Write
+

gain for the frequency band 1889 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band7" property

+
  "band7"                    gdouble               : Read / Write
+

gain for the frequency band 3770 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band8" property

+
  "band8"                    gdouble               : Read / Write
+

gain for the frequency band 7523 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band9" property

+
  "band9"                    gdouble               : Read / Write
+

gain for the frequency band 15011 Hz, ranging from -24 dB to +12 dB.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-equalizer-3bands.html b/docs/plugins/html/gst-plugins-good-plugins-equalizer-3bands.html new file mode 100644 index 0000000..077f1c5 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-equalizer-3bands.html @@ -0,0 +1,221 @@ + + + + +equalizer-3bands + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

equalizer-3bands

+

equalizer-3bands — Direct Form 3 band IIR equalizer

+
+
+

Synopsis

+
struct              GstIirEqualizer3Bands;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstIirEqualizer
+                                 +----GstIirEqualizer3Bands
+
+
+
+

Implemented Interfaces

+

+GstIirEqualizer3Bands implements + GstChildProxy and GstPreset.

+
+
+

Properties

+
+  "band0"                    gdouble               : Read / Write
+  "band1"                    gdouble               : Read / Write
+  "band2"                    gdouble               : Read / Write
+
+
+
+

Description

+

+The 3-band equalizer element allows to change the gain of a low frequency, +medium frequency and high frequency band. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-3bands band1=6.0 ! alsasink
+
+ This raises the volume of the 2nd band, which is at 1110 Hz, by 6 db. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ equalizer +

author

Stefan Kost <ensonic@users.sf.net>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstIirEqualizer3Bands

+
struct GstIirEqualizer3Bands;
+

+

+
+
+
+

Property Details

+
+

The "band0" property

+
  "band0"                    gdouble               : Read / Write
+

gain for the frequency band 100 Hz, ranging from -24.0 to +12.0.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band1" property

+
  "band1"                    gdouble               : Read / Write
+

gain for the frequency band 1100 Hz, ranging from -24.0 to +12.0.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+

The "band2" property

+
  "band2"                    gdouble               : Read / Write
+

gain for the frequency band 11 kHz, ranging from -24.0 to +12.0.

+

Allowed values: [-24,12]

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-equalizer-nbands.html b/docs/plugins/html/gst-plugins-good-plugins-equalizer-nbands.html new file mode 100644 index 0000000..e8ae24a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-equalizer-nbands.html @@ -0,0 +1,295 @@ + + + + +equalizer-nbands + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

equalizer-nbands

+

equalizer-nbands — Direct Form IIR equalizer

+
+
+

Synopsis

+
struct              GstIirEqualizerNBands;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstIirEqualizer
+                                 +----GstIirEqualizerNBands
+
+
+
+

Implemented Interfaces

+

+GstIirEqualizerNBands implements + GstChildProxy.

+
+
+

Properties

+
+  "num-bands"                guint                 : Read / Write / Construct
+
+
+
+

Description

+

+The n-band equalizer element is a fully parametric equalizer. It allows to +select between 1 and 64 bands and has properties on each band to change +the center frequency, band width and gain. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-nbands num-bands=15 band5::gain=6.0 ! alsasink
+
+ This make the equalizer use 15 bands and raises the volume of the 5th band by 6 db. +
+

+

+
+
+

Example code

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
#include <gst/gst.h>
+
+...
+typedef struct {
+  gfloat freq;
+  gfloat width;
+  gfloat gain;
+} GstEqualizerBandState;
+
+...
+
+  GstElement *equalizer;
+  GstObject *band;
+  gint i;
+  GstEqualizerBandState state[] = {
+    { 120.0,   50.0, - 3.0},
+    { 500.0,   20.0,  12.0},
+    {1503.0,    2.0, -20.0},
+    {6000.0, 1000.0,   6.0},
+    {3000.0,  120.0,   2.0}
+  };
+
+...
+
+  equalizer = gst_element_factory_make ("equalizer-nbands", "equalizer");
+  g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL);
+
+...
+
+  for (i = 0; i < 5; i++) {
+    band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i);
+    g_object_set (G_OBJECT (band), "freq", state[i].freq,
+        "bandwidth", state[i].width,
+	"gain", state[i].gain);
+    g_object_unref (G_OBJECT (band));
+  }
+
+...
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ equalizer +

author

Benjamin Otte <otte@gnome.org>, Stefan Kost <ensonic@users.sf.net>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstIirEqualizerNBands

+
struct GstIirEqualizerNBands;
+

+

+
+
+
+

Property Details

+
+

The "num-bands" property

+
  "num-bands"                guint                 : Read / Write / Construct
+

number of different bands to use.

+

Allowed values: [1,64]

+

Default value: 10

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-esdsink.html b/docs/plugins/html/gst-plugins-good-plugins-esdsink.html new file mode 100644 index 0000000..756035f --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-esdsink.html @@ -0,0 +1,147 @@ + + + + +esdsink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

esdsink

+

esdsink — Plays audio to an esound server

+
+
+

Synopsis

+
struct              GstEsdSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstBaseAudioSink
+                           +----GstAudioSink
+                                 +----GstEsdSink
+
+
+
+

Properties

+
+  "host"                     gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ esdsink +

author

Arwed von Merkatz <v.merkatz@gmx.net>

class

Sink/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
+
+
+

+

+
+
+

Details

+
+

struct GstEsdSink

+
struct GstEsdSink;
+

+

+
+
+
+

Property Details

+
+

The "host" property

+
  "host"                     gchar*                : Read / Write
+

The host running the esound daemon.

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-flacdec.html b/docs/plugins/html/gst-plugins-good-plugins-flacdec.html new file mode 100644 index 0000000..2b22282 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-flacdec.html @@ -0,0 +1,144 @@ + + + + +flacdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flacdec

+

flacdec — Decodes FLAC lossless audio streams

+
+
+

Synopsis

+
struct              GstFlacDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstFlacDec
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ flac +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-flac
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int){ 8, 16, 32 }, depth=(int)[ 4, 32 ], rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]
+
+
+

+

+
+
+

Details

+
+

struct GstFlacDec

+
struct GstFlacDec;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-flacenc.html b/docs/plugins/html/gst-plugins-good-plugins-flacenc.html new file mode 100644 index 0000000..1f9fb26 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-flacenc.html @@ -0,0 +1,297 @@ + + + + +flacenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flacenc

+

flacenc — Encodes audio with the FLAC lossless audio encoder

+
+
+

Synopsis

+
struct              GstFlacEnc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstAudioEncoder
+                     +----GstFlacEnc
+
+
+
+

Implemented Interfaces

+

+GstFlacEnc implements + GstTagSetter and GstPreset.

+
+
+

Properties

+
+  "blocksize"                guint                 : Read / Write / Construct
+  "escape-coding"            gboolean              : Read / Write / Construct
+  "exhaustive-model-search"  gboolean              : Read / Write / Construct
+  "loose-mid-side-stereo"    gboolean              : Read / Write / Construct
+  "max-lpc-order"            guint                 : Read / Write / Construct
+  "max-residual-partition-order" guint                 : Read / Write / Construct
+  "mid-side-stereo"          gboolean              : Read / Write / Construct
+  "min-residual-partition-order" guint                 : Read / Write / Construct
+  "qlp-coeff-prec-search"    gboolean              : Read / Write / Construct
+  "qlp-coeff-precision"      guint                 : Read / Write / Construct
+  "quality"                  GstFlacEncQuality     : Read / Write / Construct
+  "rice-parameter-search-dist" guint                 : Read / Write / Construct
+  "streamable-subset"        gboolean              : Read / Write / Construct
+  "padding"                  guint                 : Read / Write / Construct
+  "seekpoints"               gint                  : Read / Write / Construct
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ flac +

author

Wim Taymans <wim.taymans@chello.be>

class

Codec/Encoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)8, depth=(int)8, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int){ 12, 16 }, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)32, depth=(int){ 20, 24 }, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-flac
+
+
+

+

+
+
+

Details

+
+

struct GstFlacEnc

+
struct GstFlacEnc;
+

+

+
+
+
+

Property Details

+
+

The "blocksize" property

+
  "blocksize"                guint                 : Read / Write / Construct
+

Blocksize in samples.

+

Allowed values: [16,65535]

+

Default value: 4608

+
+
+
+

The "escape-coding" property

+
  "escape-coding"            gboolean              : Read / Write / Construct
+

search for escape codes in the entropy coding stage for slightly better compression.

+

Default value: FALSE

+
+
+
+

The "exhaustive-model-search" property

+
  "exhaustive-model-search"  gboolean              : Read / Write / Construct
+

do exhaustive search of LP coefficient quantization (expensive!).

+

Default value: FALSE

+
+
+
+

The "loose-mid-side-stereo" property

+
  "loose-mid-side-stereo"    gboolean              : Read / Write / Construct
+

Loose mid side stereo.

+

Default value: FALSE

+
+
+
+

The "max-lpc-order" property

+
  "max-lpc-order"            guint                 : Read / Write / Construct
+

Max LPC order; 0 => use only fixed predictors.

+

Allowed values: <= 32

+

Default value: 8

+
+
+
+

The "max-residual-partition-order" property

+
  "max-residual-partition-order" guint                 : Read / Write / Construct
+

Max residual partition order (above 4 doesn't usually help much).

+

Allowed values: <= 16

+

Default value: 3

+
+
+
+

The "mid-side-stereo" property

+
  "mid-side-stereo"          gboolean              : Read / Write / Construct
+

Do mid side stereo (only for stereo input).

+

Default value: TRUE

+
+
+
+

The "min-residual-partition-order" property

+
  "min-residual-partition-order" guint                 : Read / Write / Construct
+

Min residual partition order (above 4 doesn't usually help much).

+

Allowed values: <= 16

+

Default value: 3

+
+
+
+

The "qlp-coeff-prec-search" property

+
  "qlp-coeff-prec-search"    gboolean              : Read / Write / Construct
+

false = use qlp_coeff_precision, true = search around qlp_coeff_precision, take best.

+

Default value: FALSE

+
+
+
+

The "qlp-coeff-precision" property

+
  "qlp-coeff-precision"      guint                 : Read / Write / Construct
+

Precision in bits of quantized linear-predictor coefficients; 0 = automatic.

+

Allowed values: <= 32

+

Default value: 0

+
+
+
+

The "quality" property

+
  "quality"                  GstFlacEncQuality     : Read / Write / Construct
+

Speed versus compression tradeoff.

+

Default value: 5 - Default

+
+
+
+

The "rice-parameter-search-dist" property

+
  "rice-parameter-search-dist" guint                 : Read / Write / Construct
+

0 = try only calc'd parameter k; else try all [k-dist..k+dist] parameters, use best.

+

Allowed values: <= 15

+

Default value: 0

+
+
+
+

The "streamable-subset" property

+
  "streamable-subset"        gboolean              : Read / Write / Construct
+

true to limit encoder to generating a Subset stream, else false.

+

Default value: TRUE

+
+
+
+

The "padding" property

+
  "padding"                  guint                 : Read / Write / Construct
+

Write a PADDING block with this length in bytes.

+

Default value: 0

+
+
+
+

The "seekpoints" property

+
  "seekpoints"               gint                  : Read / Write / Construct
+

Add SEEKTABLE metadata (if > 0, number of entries, if < 0, interval in sec).

+

Allowed values: >= -2147483647

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-flacparse.html b/docs/plugins/html/gst-plugins-good-plugins-flacparse.html new file mode 100644 index 0000000..fd3d7d9 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-flacparse.html @@ -0,0 +1,202 @@ + + + + +flacparse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flacparse

+

flacparse — Parses audio with the FLAC lossless audio codec

+
+
+

Synopsis

+
struct              GstFlacParse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseParse
+                     +----GstFlacParse
+
+
+
+

Properties

+
+  "check-frame-checksums"    gboolean              : Read / Write
+
+
+
+

Description

+

+The flacparse element will parse the header packets of the FLAC +stream and put them as the streamheader in the caps. This is used in the +multifdsink case where you want to stream live FLAC streams to multiple +clients, each client has to receive the streamheaders first before they can +consume the FLAC packets. +

+

+This element also makes sure that the buffers that it pushes out are properly +timestamped and that their offset and offset_end are set. The buffers that +flacparse outputs have all of the metadata that oggmux expects to receive, +which allows you to (for example) remux an ogg/flac or convert a native FLAC +format file to an ogg bitstream. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
+2
gst-launch -v filesrc location=sine.flac ! flacparse ! identity \
+           ! oggmux ! filesink location=sine-remuxed.ogg
+
+ This pipeline converts a native FLAC format file to an ogg bitstream. +It also illustrates that the streamheader is set in the caps, and that each +buffer has the timestamp, duration, offset, and offset_end set. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audioparsers +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Codec/Parser/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-flac
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-flac, framed=(boolean)true, channels=(int)[ 1, 8 ], rate=(int)[ 1, 655350 ]
+
+
+

+

+
+
+

Details

+
+

struct GstFlacParse

+
struct GstFlacParse;
+

+

+
+
+
+

Property Details

+
+

The "check-frame-checksums" property

+
  "check-frame-checksums"    gboolean              : Read / Write
+

Check the overall checksums of every frame.

+

Default value: FALSE

+
+
+
+

See Also

+flacdec, oggdemux, vorbisparse +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-flactag.html b/docs/plugins/html/gst-plugins-good-plugins-flactag.html new file mode 100644 index 0000000..f6b80bd --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-flactag.html @@ -0,0 +1,152 @@ + + + + +flactag + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flactag

+

flactag — Rewrite tags in a FLAC file

+
+
+

Synopsis

+
struct              GstFlacTag;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstFlacTag
+
+
+
+

Implemented Interfaces

+

+GstFlacTag implements + GstTagSetter.

+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ flac +

author

Christophe Fergeau <teuf@gnome.org>

class

Formatter/Metadata
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-flac
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-flac
+
+
+

+

+
+
+

Details

+
+

struct GstFlacTag

+
struct GstFlacTag;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-flvdemux.html b/docs/plugins/html/gst-plugins-good-plugins-flvdemux.html new file mode 100644 index 0000000..72434be --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-flvdemux.html @@ -0,0 +1,234 @@ + + + + +flvdemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flvdemux

+

flvdemux — Demux FLV feeds into digital streams

+
+
+

Synopsis

+
struct              GstFlvDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstFlvDemux
+
+
+
+

Description

+

+flvdemux demuxes an FLV file into the different contained streams. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v filesrc location=/path/to/flv ! flvdemux ! audioconvert ! autoaudiosink
+
+ This pipeline demuxes an FLV file and outputs the contained raw audio streams. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ flv +

author

Julien Moutte <julien@moutte.net>

class

Codec/Demuxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-flv
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

audio

direction

source

presence

sometimes

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 }, parsed=(boolean)true

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, framed=(boolean)true

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 }
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video

direction

source

presence

sometimes

details

video/x-flash-video

video/x-flash-screen

video/x-vp6-flash

video/x-vp6-alpha

video/x-h264, stream-format=(string)avc
+
+
+

+

+
+
+

Details

+
+

struct GstFlvDemux

+
struct GstFlvDemux;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-flvmux.html b/docs/plugins/html/gst-plugins-good-plugins-flvmux.html new file mode 100644 index 0000000..445df1e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-flvmux.html @@ -0,0 +1,275 @@ + + + + +flvmux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flvmux

+

flvmux — Muxes video/audio streams into a FLV stream

+
+
+

Synopsis

+
                    GstFlvMux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstFlvMux
+
+
+
+

Implemented Interfaces

+

+GstFlvMux implements + GstTagSetter.

+
+
+

Properties

+
+  "is-live"                  gboolean              : Read / Write
+  "streamable"               gboolean              : Read / Write
+
+
+
+

Description

+

+flvmux muxes different streams into an FLV file. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
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. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ flv +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

audio

direction

sink

presence

request

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 }, parsed=(boolean)true

audio/mpeg, mpegversion=(int)2, framed=(boolean)true

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, framed=(boolean)true

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 }
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video

direction

sink

presence

request

details

video/x-flash-video

video/x-flash-screen

video/x-vp6-flash

video/x-vp6-alpha

video/x-h264, stream-format=(string)avc
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-flv
+
+
+

+

+
+
+

Details

+
+

GstFlvMux

+
typedef struct _GstFlvMux GstFlvMux;
+

+

+
+
+
+

Property Details

+
+

The "is-live" property

+
  "is-live"                  gboolean              : Read / Write
+

The stream is live and does not need an index.

+

Default value: FALSE

+
+
+
+

The "streamable" property

+
  "streamable"               gboolean              : Read / Write
+

+If True, the output will be streaming friendly. (ie without indexes and +duration) +

+

Default value: FALSE

+

Since 0.10.24

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-flxdec.html b/docs/plugins/html/gst-plugins-good-plugins-flxdec.html new file mode 100644 index 0000000..0097c85 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-flxdec.html @@ -0,0 +1,147 @@ + + + + +flxdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flxdec

+

flxdec — FLC/FLI/FLX video decoder

+
+
+

Synopsis

+
struct              GstFlxDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstFlxDec
+
+
+
+

Description

+

+This element decodes fli/flc/flx-video into raw video +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ flxdec +

author

Sepp Wijnands <mrrazz@garbage-coderz.net>, Zeeshan Ali <zeenix@gmail.com>

class

Codec/Decoder/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-fli
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstFlxDec

+
struct GstFlxDec;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gamma.html b/docs/plugins/html/gst-plugins-good-plugins-gamma.html new file mode 100644 index 0000000..0abcee6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gamma.html @@ -0,0 +1,368 @@ + + + + +gamma + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gamma

+

gamma — Adjusts gamma on a video stream

+
+
+

Synopsis

+
struct              GstGamma;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstGamma
+
+
+
+

Properties

+
+  "gamma"                    gdouble               : Read / Write
+
+
+
+

Description

+

+Performs gamma correction on a video stream. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch videotestsrc ! gamma gamma=2.0 ! ffmpegcolorspace ! ximagesink
+
+ This pipeline will make the image "brighter". +
+ + + + + + + +
1
gst-launch videotestsrc ! gamma gamma=0.5 ! ffmpegcolorspace ! ximagesink
+
+ This pipeline will make the image "darker". +
+

+

+

+Last reviewed on 2010-04-18 (0.10.22) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ videofilter +

author

Arwed v. Merkatz <v.merkatz@gmx.net>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstGamma

+
struct GstGamma;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "gamma" property

+
  "gamma"                    gdouble               : Read / Write
+

gamma.

+

Allowed values: [0.01,10]

+

Default value: 1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gconfaudiosink.html b/docs/plugins/html/gst-plugins-good-plugins-gconfaudiosink.html new file mode 100644 index 0000000..6ac779b --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gconfaudiosink.html @@ -0,0 +1,129 @@ + + + + +gconfaudiosink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gconfaudiosink

+

gconfaudiosink — Audio sink embedding the GConf-settings for audio output

+
+
+

Synopsis

+
                    GstGConfAudioSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstSwitchSink
+                           +----GstGConfAudioSink
+
+
+
+

Implemented Interfaces

+

+GstGConfAudioSink implements + GstChildProxy.

+
+
+

Properties

+
+  "profile"                  GstGConfProfile       : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gconfelements +

author

Jan Schmidt <thaytan@mad.scientist.com>

class

Sink/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

GstGConfAudioSink

+
typedef struct _GstGConfAudioSink GstGConfAudioSink;
+

+

+
+
+
+

Property Details

+
+

The "profile" property

+
  "profile"                  GstGConfProfile       : Read / Write
+

Profile.

+

Default value: Sound Events

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gconfaudiosrc.html b/docs/plugins/html/gst-plugins-good-plugins-gconfaudiosrc.html new file mode 100644 index 0000000..8700a51 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gconfaudiosrc.html @@ -0,0 +1,112 @@ + + + + +gconfaudiosrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gconfaudiosrc

+

gconfaudiosrc — Audio source embedding the GConf-settings for audio input

+
+
+

Synopsis

+
                    GstGConfAudioSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstSwitchSrc
+                           +----GstGConfAudioSrc
+
+
+
+

Implemented Interfaces

+

+GstGConfAudioSrc implements + GstChildProxy.

+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gconfelements +

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Source/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

GstGConfAudioSrc

+
typedef struct _GstGConfAudioSrc GstGConfAudioSrc;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gconfvideosink.html b/docs/plugins/html/gst-plugins-good-plugins-gconfvideosink.html new file mode 100644 index 0000000..652393e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gconfvideosink.html @@ -0,0 +1,112 @@ + + + + +gconfvideosink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gconfvideosink

+

gconfvideosink — Video sink embedding the GConf-settings for video output

+
+
+

Synopsis

+
                    GstGConfVideoSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstSwitchSink
+                           +----GstGConfVideoSink
+
+
+
+

Implemented Interfaces

+

+GstGConfVideoSink implements + GstChildProxy.

+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gconfelements +

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Sink/Video
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

GstGConfVideoSink

+
typedef struct _GstGConfVideoSink GstGConfVideoSink;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gconfvideosrc.html b/docs/plugins/html/gst-plugins-good-plugins-gconfvideosrc.html new file mode 100644 index 0000000..763706e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gconfvideosrc.html @@ -0,0 +1,112 @@ + + + + +gconfvideosrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gconfvideosrc

+

gconfvideosrc — Video source embedding the GConf-settings for video input

+
+
+

Synopsis

+
                    GstGConfVideoSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstSwitchSrc
+                           +----GstGConfVideoSrc
+
+
+
+

Implemented Interfaces

+

+GstGConfVideoSrc implements + GstChildProxy.

+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gconfelements +

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Source/Video
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

GstGConfVideoSrc

+
typedef struct _GstGConfVideoSrc GstGConfVideoSrc;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gdkpixbufsink.html b/docs/plugins/html/gst-plugins-good-plugins-gdkpixbufsink.html new file mode 100644 index 0000000..c5a6beb --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gdkpixbufsink.html @@ -0,0 +1,161 @@ + + + + +gdkpixbufsink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gdkpixbufsink

+

gdkpixbufsink — Output images as GdkPixbuf objects in bus messages

+
+
+

Synopsis

+
struct              GstGdkPixbufSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstVideoSink
+                           +----GstGdkPixbufSink
+
+
+
+

Properties

+
+  "last-pixbuf"              GdkPixbuf*            : Read
+  "send-messages"            gboolean              : Read / Write
+  "post-messages"            gboolean              : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gdkpixbuf +

author

Tim-Philipp Müller <tim centricular net>

class

Sink/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstGdkPixbufSink

+
struct GstGdkPixbufSink;
+

+

+
+
+
+

Property Details

+
+

The "last-pixbuf" property

+
  "last-pixbuf"              GdkPixbuf*            : Read
+

Last GdkPixbuf object rendered.

+
+
+
+

The "send-messages" property

+
  "send-messages"            gboolean              : Read / Write
+

Whether to post messages containing pixbufs on the bus (deprecated, use post-messages).

+

Default value: TRUE

+
+
+
+

The "post-messages" property

+
  "post-messages"            gboolean              : Read / Write
+

Whether to post messages containing pixbufs on the bus.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-goom.html b/docs/plugins/html/gst-plugins-good-plugins-goom.html new file mode 100644 index 0000000..4eb2a9c --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-goom.html @@ -0,0 +1,170 @@ + + + + +goom + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

goom

+

goom — Takes frames of data and outputs video frames using the GOOM filter

+
+
+

Synopsis

+
struct              GstGoom;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstGoom
+
+
+
+

Description

+

+Goom is an audio visualisation element. It creates warping structures +based on the incoming audio signal. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v audiotestsrc ! goom ! ffmpegcolorspace ! xvimagesink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ goom +

author

Wim Taymans <wim@fluendo.com>

class

Visualization
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int){ 1, 2 }
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstGoom

+
struct GstGoom;
+

+

+
+
+
+

See Also

+synaesthesia +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-goom2k1.html b/docs/plugins/html/gst-plugins-good-plugins-goom2k1.html new file mode 100644 index 0000000..761a708 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-goom2k1.html @@ -0,0 +1,171 @@ + + + + +goom2k1 + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

goom2k1

+

goom2k1 — Takes frames of data and outputs video frames using the GOOM 2k1 filter

+
+
+

Synopsis

+
struct              GstGoom;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstGoom
+
+
+
+

Description

+

+Goom2k1 is an audio visualisation element. It creates warping structures +based on the incomming audio signal. Goom2k1 is the older version of the +visualisation. Also available is goom2k4, with a different look. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v audiotestsrc ! goom2k1 ! ffmpegcolorspace ! xvimagesink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ goom2k1 +

author

Wim Taymans <wim@fluendo.com>

class

Visualization
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int){ 1, 2 }
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstGoom

+
struct GstGoom;
+

+

+
+
+
+

See Also

+goom, synaesthesia +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gstrtpbin.html b/docs/plugins/html/gst-plugins-good-plugins-gstrtpbin.html new file mode 100644 index 0000000..599ff85 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gstrtpbin.html @@ -0,0 +1,958 @@ + + + + +gstrtpbin + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gstrtpbin

+

gstrtpbin — Real-Time Transport Protocol bin

+
+
+

Synopsis

+
struct              GstRtpBin;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstRtpBin
+
+
+
+

Implemented Interfaces

+

+GstRtpBin implements + GstChildProxy.

+
+
+

Properties

+
+  "do-lost"                  gboolean              : Read / Write
+  "latency"                  guint                 : Read / Write
+  "sdes"                     GstStructure*         : Read / Write
+  "ignore-pt"                gboolean              : Read / Write
+  "autoremove"               gboolean              : Read / Write
+  "buffer-mode"              RTPJitterBufferMode   : Read / Write
+  "ntp-sync"                 gboolean              : Read / Write
+  "use-pipeline-clock"       gboolean              : Read / Write
+  "rtcp-sync"                GstRTCPSync           : Read / Write
+  "rtcp-sync-interval"       guint                 : Read / Write
+
+
+ +
+

Description

+

+RTP bin combines the functions of GstRtpSession, GstRtpSsrcDemux, +GstRtpJitterBuffer and GstRtpPtDemux in one element. It allows for multiple +RTP sessions that will be synchronized together using RTCP SR packets. +

+

+GstRtpBin is configured with a number of request pads that define the +functionality that is activated, similar to the GstRtpSession element. +

+

+To use GstRtpBin as an RTP receiver, request a recv_rtp_sink_%d pad. The session +number must be specified in the pad name. +Data received on the recv_rtp_sink_%d pad will be processed in the GstRtpSession +manager and after being validated forwarded on GstRtpSsrcDemux element. Each +RTP stream is demuxed based on the SSRC and send to a GstRtpJitterBuffer. After +the packets are released from the jitterbuffer, they will be forwarded to a +GstRtpPtDemux element. The GstRtpPtDemux element will demux the packets based +on the payload type and will create a unique pad recv_rtp_src_%d_%d_%d on +gstrtpbin with the session number, SSRC and payload type respectively as the pad +name. +

+

+To also use GstRtpBin as an RTCP receiver, request a recv_rtcp_sink_%d pad. The +session number must be specified in the pad name. +

+

+If you want the session manager to generate and send RTCP packets, request +the send_rtcp_src_%d pad with the session number in the pad name. Packet pushed +on this pad contain SR/RR RTCP reports that should be sent to all participants +in the session. +

+

+To use GstRtpBin as a sender, request a send_rtp_sink_%d pad, which will +automatically create a send_rtp_src_%d pad. If the session number is not provided, +the pad from the lowest available session will be returned. The session manager will modify the +SSRC in the RTP packets to its own SSRC and wil forward the packets on the +send_rtp_src_%d pad after updating its internal state. +

+

+The session manager needs the clock-rate of the payload types it is handling +and will signal the "request-pt-map" signal when it needs such a +mapping. One can clear the cached values with the "clear-pt-map" +signal. +

+

+Access to the internal statistics of gstrtpbin is provided with the +get-internal-session property. This action signal gives access to the +RTPSession object which further provides action signals to retrieve the +internal source and other sources. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
+2
gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink_0 \
+    gstrtpbin ! rtptheoradepay ! theoradec ! xvimagesink
+
+ Receive RTP data from port 5000 and send to the session 0 in gstrtpbin. +
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
gst-launch gstrtpbin name=rtpbin \
+        v4l2src ! ffmpegcolorspace ! ffenc_h263 ! rtph263ppay ! rtpbin.send_rtp_sink_0 \
+                  rtpbin.send_rtp_src_0 ! udpsink port=5000                            \
+                  rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false    \
+                  udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
+        audiotestsrc ! amrnbenc ! rtpamrpay ! rtpbin.send_rtp_sink_1                   \
+                  rtpbin.send_rtp_src_1 ! udpsink port=5002                            \
+                  rtpbin.send_rtcp_src_1 ! udpsink port=5003 sync=false async=false    \
+                  udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1
+
+ Encode and payload H263 video captured from a v4l2src. Encode and payload AMR +audio generated from audiotestsrc. The video is sent to session 0 in rtpbin +and the audio is sent to session 1. Video packets are sent on UDP port 5000 +and audio packets on port 5002. The video RTCP packets for session 0 are sent +on port 5001 and the audio RTCP packets for session 0 are sent on port 5003. +RTCP packets for session 0 are received on port 5005 and RTCP for session 1 +is received on port 5007. Since RTCP packets from the sender should be sent +as soon as possible and do not participate in preroll, sync=false and +async=false is configured on udpsink +
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
gst-launch -v gstrtpbin name=rtpbin                                          \
+    udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998" \
+            port=5000 ! rtpbin.recv_rtp_sink_0                                \
+        rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink                    \
+     udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
+     rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
+    udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1" \
+            port=5002 ! rtpbin.recv_rtp_sink_1                                \
+        rtpbin. ! rtpamrdepay ! amrnbdec ! alsasink                           \
+     udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
+     rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false
+
+ Receive H263 on port 5000, send it through rtpbin in session 0, depayload, +decode and display the video. +Receive AMR on port 5002, send it through rtpbin in session 1, depayload, +decode and play the audio. +Receive server RTCP packets for session 0 on port 5001 and RTCP packets for +session 1 on port 5003. These packets will be used for session management and +synchronisation. +Send RTCP reports for session 0 on port 5005 and RTCP reports for session 1 +on port 5007. +
+

+

+

+Last reviewed on 2007-08-30 (0.10.6) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gstrtpmanager +

author

Wim Taymans <wim.taymans@gmail.com>

class

Filter/Network/RTP
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtcp_sink_%d

direction

sink

presence

request

details

application/x-rtcp
+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtp_sink_%d

direction

sink

presence

request

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

send_rtp_sink_%d

direction

sink

presence

request

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtp_src_%d_%d_%d

direction

source

presence

sometimes

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

send_rtp_src_%d

direction

source

presence

sometimes

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

send_rtcp_src_%d

direction

source

presence

request

details

application/x-rtcp
+
+
+

+

+
+
+

Details

+
+

struct GstRtpBin

+
struct GstRtpBin;
+

+

+
+
+
+

Property Details

+
+

The "do-lost" property

+
  "do-lost"                  gboolean              : Read / Write
+

Send an event downstream when a packet is lost.

+

Default value: FALSE

+
+
+
+

The "latency" property

+
  "latency"                  guint                 : Read / Write
+

Default amount of ms to buffer in the jitterbuffers.

+

Default value: 200

+
+
+
+

The "sdes" property

+
  "sdes"                     GstStructure*         : Read / Write
+

The SDES items of this session.

+
+
+
+

The "ignore-pt" property

+
  "ignore-pt"                gboolean              : Read / Write
+

Do not demultiplex based on PT values.

+

Default value: FALSE

+
+
+
+

The "autoremove" property

+
  "autoremove"               gboolean              : Read / Write
+

Automatically remove timed out sources.

+

Default value: FALSE

+
+
+
+

The "buffer-mode" property

+
  "buffer-mode"              RTPJitterBufferMode   : Read / Write
+

Control the buffering algorithm in use.

+

Default value: Slave receiver to sender clock

+
+
+
+

The "ntp-sync" property

+
  "ntp-sync"                 gboolean              : Read / Write
+

Synchronize received streams to the NTP clock.

+

Default value: FALSE

+
+
+
+

The "use-pipeline-clock" property

+
  "use-pipeline-clock"       gboolean              : Read / Write
+

Use the pipeline clock to set the NTP time in the RTCP SR messages.

+

Default value: FALSE

+
+
+
+

The "rtcp-sync" property

+
  "rtcp-sync"                GstRTCPSync           : Read / Write
+

Use of RTCP SR in synchronization.

+

Default value: always

+
+
+
+

The "rtcp-sync-interval" property

+
  "rtcp-sync-interval"       guint                 : Read / Write
+

RTCP SR interval synchronization (ms) (0 = always).

+

Default value: 0

+
+
+
+

Signal Details

+
+

The "clear-pt-map" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        gpointer   user_data)      : Action
+

+Clear all previously cached pt-mapping obtained with +"request-pt-map". +

+
++ + + + + + + + + + +

rtpbin :

the object which received the signal

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "get-internal-session" signal

+
RTPSession*         user_function                      (GstRtpBin *rtpbin,
+                                                        guint      id,
+                                                        gpointer   user_data)      : Action
+

+Request the internal RTPSession object as GObject in session id. +

+
++ + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

id :

the session id

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-bye-ssrc" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of an SSRC that became inactive because of a BYE packet. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-bye-timeout" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of an SSRC that has timed out because of BYE +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-new-ssrc" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of a new SSRC that entered session. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-npt-stop" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify that SSRC sender has sent data up to the configured NPT stop time. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-sender-timeout" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of a sender SSRC that has timed out and became a receiver +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-active" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of a SSRC that is active, i.e., sending RTCP. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-collision" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify when we have an SSRC collision +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-sdes" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of a SSRC that is active, i.e., sending RTCP. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-validated" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of a new SSRC that became validated. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-timeout" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of an SSRC that has timed out +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "request-pt-map" signal

+
GstCaps*            user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      pt,
+                                                        gpointer   user_data)      : Run Last
+

+Request the payload type as GstCaps for pt in session. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

pt :

the pt

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "reset-sync" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        gpointer   user_data)      : Action
+

+Reset all currently configured lip-sync parameters and require new SR +packets for all streams before lip-sync is attempted again. +

+
++ + + + + + + + + + +

rtpbin :

the object which received the signal

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "payload-type-change" signal

+
void                user_function                      (GstRtpBin *rtpbin,
+                                                        guint      session,
+                                                        guint      pt,
+                                                        gpointer   user_data)      : Run Last
+

+Signal that the current payload type changed to pt in session. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

pt :

the pt

user_data :

user data set when the signal handler was connected.
+

Since 0.10.17

+
+
+
+

See Also

+gstrtpjitterbuffer, gstrtpsession, gstrtpptdemux, gstrtpssrcdemux +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gstrtpjitterbuffer.html b/docs/plugins/html/gst-plugins-good-plugins-gstrtpjitterbuffer.html new file mode 100644 index 0000000..c16474e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gstrtpjitterbuffer.html @@ -0,0 +1,410 @@ + + + + +gstrtpjitterbuffer + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gstrtpjitterbuffer

+

gstrtpjitterbuffer — A buffer that deals with network jitter and other transmission faults

+
+
+

Synopsis

+
struct              GstRtpJitterBuffer;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstRtpJitterBuffer
+
+
+
+

Properties

+
+  "do-lost"                  gboolean              : Read / Write
+  "drop-on-latency"          gboolean              : Read / Write
+  "latency"                  guint                 : Read / Write
+  "ts-offset"                gint64                : Read / Write
+  "mode"                     RTPJitterBufferMode   : Read / Write
+  "percent"                  gint                  : Read
+
+
+ +
+

Description

+

+This element reorders and removes duplicate RTP packets as they are received +from a network source. It will also wait for missing packets up to a +configurable time limit using the "latency" property. +Packets arriving too late are considered to be lost packets. +

+

+This element acts as a live element and so adds "latency" +to the pipeline. +

+

+The element needs the clock-rate of the RTP payload in order to estimate the +delay. This information is obtained either from the caps on the sink pad or, +when no caps are present, from the "request-pt-map" signal. +To clear the previous pt-map use the "clear-pt-map" signal. +

+

+This element will automatically be used inside gstrtpbin. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch rtspsrc location=rtsp://192.168.1.133:8554/mpeg1or2AudioVideoTest ! gstrtpjitterbuffer ! rtpmpvdepay ! mpeg2dec ! xvimagesink
+
+ Connect to a streaming server and decode the MPEG video. The jitterbuffer is +inserted into the pipeline to smooth out network jitter and to reorder the +out-of-order RTP packets. +
+

+

+

+Last reviewed on 2007-05-28 (0.10.5) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gstrtpmanager +

author

Philippe Kalaf <philippe.kalaf@collabora.co.uk>, Wim Taymans <wim.taymans@gmail.com>

class

Filter/Network/RTP
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

application/x-rtp, clock-rate=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

sink_rtcp

direction

sink

presence

request

details

application/x-rtcp
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

application/x-rtp
+
+
+

+

+
+
+

Details

+
+

struct GstRtpJitterBuffer

+
struct GstRtpJitterBuffer;
+

+Opaque jitterbuffer structure. +

+
+
+
+

Property Details

+
+

The "do-lost" property

+
  "do-lost"                  gboolean              : Read / Write
+

Send an event downstream when a packet is lost.

+

Default value: FALSE

+
+
+
+

The "drop-on-latency" property

+
  "drop-on-latency"          gboolean              : Read / Write
+

Tells the jitterbuffer to never exceed the given latency in size.

+

Default value: FALSE

+
+
+
+

The "latency" property

+
  "latency"                  guint                 : Read / Write
+

Amount of ms to buffer.

+

Default value: 200

+
+
+
+

The "ts-offset" property

+
  "ts-offset"                gint64                : Read / Write
+

Adjust buffer timestamps with offset in nanoseconds.

+

Default value: 0

+
+
+
+

The "mode" property

+
  "mode"                     RTPJitterBufferMode   : Read / Write
+

Control the buffering algorithm in use.

+

Default value: Slave receiver to sender clock

+
+
+
+

The "percent" property

+
  "percent"                  gint                  : Read
+

The buffer filled percent.

+

Allowed values: [0,100]

+

Default value: 0

+
+
+
+

Signal Details

+
+

The "clear-pt-map" signal

+
void                user_function                      (GstRtpJitterBuffer *buffer,
+                                                        gpointer            user_data)      : Action
+

+Invalidate the clock-rate as obtained with the +"request-pt-map" signal. +

+
++ + + + + + + + + + +

buffer :

the object which received the signal

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "handle-sync" signal

+
void                user_function                      (GstRtpJitterBuffer *buffer,
+                                                        GstStructure       *struct,
+                                                        gpointer            user_data)      : Run Last
+

+Be notified of new sync values. +

+
++ + + + + + + + + + + + + + +

buffer :

the object which received the signal

struct :

a GstStructure containing sync values.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-npt-stop" signal

+
void                user_function                      (GstRtpJitterBuffer *buffer,
+                                                        gpointer            user_data)      : Run Last
+

+Signal that the jitterbufer has pushed the RTP packet that corresponds to +the npt-stop position. +

+
++ + + + + + + + + + +

buffer :

the object which received the signal

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "request-pt-map" signal

+
GstCaps*            user_function                      (GstRtpJitterBuffer *buffer,
+                                                        guint               pt,
+                                                        gpointer            user_data)      : Run Last
+

+Request the payload type as GstCaps for pt. +

+
++ + + + + + + + + + + + + + +

buffer :

the object which received the signal

pt :

the pt

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "set-active" signal

+
guint64             user_function                      (GstRtpJitterBuffer *buffer,
+                                                        gboolean            Returns,
+                                                        guint64             arg2,
+                                                        gpointer            user_data)      : Action
+

+Start pushing out packets with the given base time. This signal is only +useful in buffering mode. +

+
++ + + + + + + + + + + + + + +

buffer :

the object which received the signal

user_data :

user data set when the signal handler was connected.

Returns :

the time of the last pushed packet.
+

Since 0.10.19

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gstrtpptdemux.html b/docs/plugins/html/gst-plugins-good-plugins-gstrtpptdemux.html new file mode 100644 index 0000000..e02f8d5 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gstrtpptdemux.html @@ -0,0 +1,304 @@ + + + + +gstrtpptdemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gstrtpptdemux

+

gstrtpptdemux — Parses codec streams transmitted in the same RTP session

+
+
+

Synopsis

+
struct              GstRtpPtDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstRtpPtDemux
+
+
+ +
+

Description

+

+gstrtpptdemux acts as a demuxer for RTP packets based on the payload type of +the packets. Its main purpose is to allow an application to easily receive +and decode an RTP stream with multiple payload types. +

+

+For each payload type that is detected, a new pad will be created and the +"new-payload-type" signal will be emitted. When the payload for +the RTP stream changes, the "payload-type-change" signal will be +emitted. +

+

+The element will try to set complete and unique application/x-rtp caps on the +outgoing buffers and pads based on the result of the +"request-pt-map" signal. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch udpsrc caps="application/x-rtp" ! gstrtpptdemux ! fakesink
+
+ Takes an RTP stream and send the RTP packets with the first detected +payload type to fakesink, discarding the other payload types. +
+

+

+

+Last reviewed on 2007-05-28 (0.10.5) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gstrtpmanager +

author

Kai Vehmanen <kai.vehmanen@nokia.com>

class

Demux/Network/RTP
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

src_%d

direction

source

presence

sometimes

details

application/x-rtp, payload=(int)[ 0, 255 ]
+
+
+

+

+
+
+

Details

+
+

struct GstRtpPtDemux

+
struct GstRtpPtDemux;
+

+

+
+
+
+

Signal Details

+
+

The "clear-pt-map" signal

+
void                user_function                      (GstRtpPtDemux *demux,
+                                                        gpointer       user_data)      : Action
+

+The application can call this signal to instruct the element to discard the +currently cached payload type map. +

+
++ + + + + + + + + + +

demux :

the object which received the signal

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "new-payload-type" signal

+
void                user_function                      (GstRtpPtDemux *demux,
+                                                        guint          pt,
+                                                        GstPad        *pad,
+                                                        gpointer       user_data)      : Run Last
+

+Emited when a new payload type pad has been created in demux. +

+
++ + + + + + + + + + + + + + + + + + +

demux :

the object which received the signal

pt :

the payload type

pad :

the pad with the new payload

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "payload-type-change" signal

+
void                user_function                      (GstRtpPtDemux *demux,
+                                                        guint          pt,
+                                                        gpointer       user_data)      : Run Last
+

+Emited when the payload type changed. +

+
++ + + + + + + + + + + + + + +

demux :

the object which received the signal

pt :

the new payload type

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "request-pt-map" signal

+
GstCaps*            user_function                      (GstRtpPtDemux *demux,
+                                                        guint          pt,
+                                                        gpointer       user_data)      : Run Last
+

+Request the payload type as GstCaps for pt. +

+
++ + + + + + + + + + + + + + +

demux :

the object which received the signal

pt :

the payload type

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gstrtpsession.html b/docs/plugins/html/gst-plugins-good-plugins-gstrtpsession.html new file mode 100644 index 0000000..33511f8 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gstrtpsession.html @@ -0,0 +1,776 @@ + + + + +gstrtpsession + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gstrtpsession

+

gstrtpsession — Implement an RTP session

+
+
+

Synopsis

+
struct              GstRtpSession;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstRtpSession
+
+
+
+

Properties

+
+  "bandwidth"                gdouble               : Read / Write
+  "internal-session"         RTPSession*           : Read
+  "ntp-ns-base"              guint64               : Read / Write
+  "num-active-sources"       guint                 : Read
+  "num-sources"              guint                 : Read
+  "rtcp-fraction"            gdouble               : Read / Write
+  "sdes"                     GstStructure*         : Read / Write
+  "rtcp-rr-bandwidth"        gint                  : Read / Write
+  "rtcp-rs-bandwidth"        gint                  : Read / Write
+  "use-pipeline-clock"       gboolean              : Read / Write
+  "rtcp-min-interval"        guint64               : Read / Write
+
+
+ +
+

Description

+

+The RTP session manager models one participant with a unique SSRC in an RTP +session. This session can be used to send and receive RTP and RTCP packets. +Based on what REQUEST pads are requested from the session manager, specific +functionality can be activated. +

+

+The session manager currently implements RFC 3550 including: +

+
    +
  • RTP packet validation based on consecutive sequence numbers.

  • +
  • Maintainance of the SSRC participant database.

  • +
  • Keeping per participant statistics based on received RTCP packets.

  • +
  • Scheduling of RR/SR RTCP packets.

  • +
+

+

+

+The gstrtpsession will not demux packets based on SSRC or payload type, nor will +it correct for packet reordering and jitter. Use GstRtpsSrcDemux, +GstRtpPtDemux and GstRtpJitterBuffer in addition to GstRtpSession to +perform these tasks. It is usually a good idea to use GstRtpBin, which +combines all these features in one element. +

+

+To use GstRtpSession as an RTP receiver, request a recv_rtp_sink pad, which will +automatically create recv_rtp_src pad. Data received on the recv_rtp_sink pad +will be processed in the session and after being validated forwarded on the +recv_rtp_src pad. +

+

+To also use GstRtpSession as an RTCP receiver, request a recv_rtcp_sink pad, +which will automatically create a sync_src pad. Packets received on the RTCP +pad will be used by the session manager to update the stats and database of +the other participants. SR packets will be forwarded on the sync_src pad +so that they can be used to perform inter-stream synchronisation when needed. +

+

+If you want the session manager to generate and send RTCP packets, request +the send_rtcp_src pad. Packet pushed on this pad contain SR/RR RTCP reports +that should be sent to all participants in the session. +

+

+To use GstRtpSession as a sender, request a send_rtp_sink pad, which will +automatically create a send_rtp_src pad. The session manager will modify the +SSRC in the RTP packets to its own SSRC and wil forward the packets on the +send_rtp_src pad after updating its internal state. +

+

+The session manager needs the clock-rate of the payload types it is handling +and will signal the "request-pt-map" signal when it needs such a +mapping. One can clear the cached values with the "clear-pt-map" +signal. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink gstrtpsession .recv_rtp_src ! rtptheoradepay ! theoradec ! xvimagesink
+
+ Receive theora RTP packets from port 5000 and send them to the depayloader, +decoder and display. Note that the application/x-rtp caps on udpsrc should be +configured based on some negotiation process such as RTSP for this pipeline +to work correctly. +
+ + + + + + + +
1
+2
+3
gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink gstrtpsession name=session \
+       .recv_rtp_src ! rtptheoradepay ! theoradec ! xvimagesink \
+    udpsrc port=5001 caps="application/x-rtcp" ! session.recv_rtcp_sink
+
+ Receive theora RTP packets from port 5000 and send them to the depayloader, +decoder and display. Receive RTCP packets from port 5001 and process them in +the session manager. +Note that the application/x-rtp caps on udpsrc should be +configured based on some negotiation process such as RTSP for this pipeline +to work correctly. +
+ + + + + + + +
1
gst-launch videotestsrc ! theoraenc ! rtptheorapay ! .send_rtp_sink gstrtpsession .send_rtp_src ! udpsink port=5000
+
+ Send theora RTP packets through the session manager and out on UDP port +5000. +
+ + + + + + + +
1
+2
gst-launch videotestsrc ! theoraenc ! rtptheorapay ! .send_rtp_sink gstrtpsession name=session .send_rtp_src \
+    ! udpsink port=5000  session.send_rtcp_src ! udpsink port=5001
+
+ Send theora RTP packets through the session manager and out on UDP port +5000. Send RTCP packets on port 5001. Note that this pipeline will not preroll +correctly because the second udpsink will not preroll correctly (no RTCP +packets are sent in the PAUSED state). Applications should manually set and +keep (see gst_element_set_locked_state()) the RTCP udpsink to the PLAYING state. +
+

+

+

+Last reviewed on 2007-05-28 (0.10.5) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gstrtpmanager +

author

Wim Taymans <wim.taymans@gmail.com>

class

Filter/Network/RTP
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtcp_sink

direction

sink

presence

request

details

application/x-rtcp
+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtp_sink

direction

sink

presence

request

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

send_rtp_sink

direction

sink

presence

request

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtp_src

direction

source

presence

sometimes

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

send_rtp_src

direction

source

presence

sometimes

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

sync_src

direction

source

presence

sometimes

details

application/x-rtcp
+
++ + + + + + + + + + + + + + + + + + +

name

send_rtcp_src

direction

source

presence

request

details

application/x-rtcp
+
+
+

+

+
+
+

Details

+
+

struct GstRtpSession

+
struct GstRtpSession;
+

+

+
+
+
+

Property Details

+
+

The "bandwidth" property

+
  "bandwidth"                gdouble               : Read / Write
+

The bandwidth of the session in bytes per second (0 for auto-discover).

+

Allowed values: >= 0

+

Default value: 64000

+
+
+
+

The "internal-session" property

+
  "internal-session"         RTPSession*           : Read
+

The internal RTPSession object.

+
+
+
+

The "ntp-ns-base" property

+
  "ntp-ns-base"              guint64               : Read / Write
+

The NTP base time corresponding to running_time 0 (deprecated).

+

Default value: 0

+
+
+
+

The "num-active-sources" property

+
  "num-active-sources"       guint                 : Read
+

The number of active sources in the session.

+

Default value: 0

+
+
+
+

The "num-sources" property

+
  "num-sources"              guint                 : Read
+

The number of sources in the session.

+

Default value: 0

+
+
+
+

The "rtcp-fraction" property

+
  "rtcp-fraction"            gdouble               : Read / Write
+

The RTCP bandwidth of the session in bytes per second (or as a real fraction of the RTP bandwidth if < 1.0).

+

Allowed values: >= 0

+

Default value: 3200

+
+
+
+

The "sdes" property

+
  "sdes"                     GstStructure*         : Read / Write
+

The SDES items of this session.

+
+
+
+

The "rtcp-rr-bandwidth" property

+
  "rtcp-rr-bandwidth"        gint                  : Read / Write
+

The RTCP bandwidth used for receivers in bytes per second (-1 = default).

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "rtcp-rs-bandwidth" property

+
  "rtcp-rs-bandwidth"        gint                  : Read / Write
+

The RTCP bandwidth used for senders in bytes per second (-1 = default).

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "use-pipeline-clock" property

+
  "use-pipeline-clock"       gboolean              : Read / Write
+

Use the pipeline clock to set the NTP time in the RTCP SR messages.

+

Default value: FALSE

+
+
+
+

The "rtcp-min-interval" property

+
  "rtcp-min-interval"        guint64               : Read / Write
+

Minimum interval between Regular RTCP packet (in ns).

+

Default value: 5000000000

+
+
+
+

Signal Details

+
+

The "clear-pt-map" signal

+
void                user_function                      (GstRtpSession *sess,
+                                                        gpointer       user_data)      : Action
+

+Clear the cached pt-maps requested with "request-pt-map". +

+
++ + + + + + + + + + +

sess :

the object which received the signal

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-bye-ssrc" signal

+
void                user_function                      (GstRtpSession *sess,
+                                                        guint          ssrc,
+                                                        gpointer       user_data)      : Run Last
+

+Notify of an SSRC that became inactive because of a BYE packet. +

+
++ + + + + + + + + + + + + + +

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-bye-timeout" signal

+
void                user_function                      (GstRtpSession *sess,
+                                                        guint          ssrc,
+                                                        gpointer       user_data)      : Run Last
+

+Notify of an SSRC that has timed out because of BYE +

+
++ + + + + + + + + + + + + + +

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-new-ssrc" signal

+
void                user_function                      (GstRtpSession *sess,
+                                                        guint          ssrc,
+                                                        gpointer       user_data)      : Run Last
+

+Notify of a new SSRC that entered session. +

+
++ + + + + + + + + + + + + + +

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-sender-timeout" signal

+
void                user_function                      (GstRtpSession *sess,
+                                                        guint          ssrc,
+                                                        gpointer       user_data)      : Run Last
+

+Notify of a sender SSRC that has timed out and became a receiver +

+
++ + + + + + + + + + + + + + +

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-active" signal

+
void                user_function                      (GstRtpSession *gstrtpsession,
+                                                        guint          arg1,
+                                                        gpointer       user_data)          : Run Last
+

+

+
++ + + + + + + + + + +

gstrtpsession :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-collision" signal

+
void                user_function                      (GstRtpSession *gstrtpsession,
+                                                        guint          arg1,
+                                                        gpointer       user_data)          : Run Last
+

+

+
++ + + + + + + + + + +

gstrtpsession :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-sdes" signal

+
void                user_function                      (GstRtpSession *session,
+                                                        guint          src,
+                                                        gpointer       user_data)      : Run Last
+

+Notify that a new SDES was received for SSRC. +

+
++ + + + + + + + + + + + + + +

session :

the object which received the signal

src :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-validated" signal

+
void                user_function                      (GstRtpSession *gstrtpsession,
+                                                        guint          arg1,
+                                                        gpointer       user_data)          : Run Last
+

+

+
++ + + + + + + + + + +

gstrtpsession :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-timeout" signal

+
void                user_function                      (GstRtpSession *sess,
+                                                        guint          ssrc,
+                                                        gpointer       user_data)      : Run Last
+

+Notify of an SSRC that has timed out +

+
++ + + + + + + + + + + + + + +

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "request-pt-map" signal

+
GstCaps*            user_function                      (GstRtpSession *sess,
+                                                        guint          pt,
+                                                        gpointer       user_data)      : Run Last
+

+Request the payload type as GstCaps for pt. +

+
++ + + + + + + + + + + + + + +

sess :

the object which received the signal

pt :

the pt

user_data :

user data set when the signal handler was connected.
+
+
+
+

See Also

+gstrtpjitterbuffer, gstrtpbin, gstrtpptdemux, gstrtpssrcdemux +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-gstrtpssrcdemux.html b/docs/plugins/html/gst-plugins-good-plugins-gstrtpssrcdemux.html new file mode 100644 index 0000000..c1e2c51 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-gstrtpssrcdemux.html @@ -0,0 +1,320 @@ + + + + +gstrtpssrcdemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gstrtpssrcdemux

+

gstrtpssrcdemux — Splits RTP streams based on the SSRC

+
+
+

Synopsis

+
struct              GstRtpSsrcDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstRtpSsrcDemux
+
+
+ +
+

Description

+

+gstrtpssrcdemux acts as a demuxer for RTP packets based on the SSRC of the +packets. Its main purpose is to allow an application to easily receive and +decode an RTP stream with multiple SSRCs. +

+

+For each SSRC that is detected, a new pad will be created and the +"new-ssrc-pad" signal will be emitted. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch udpsrc caps="application/x-rtp" ! gstrtpssrcdemux ! fakesink
+
+ Takes an RTP stream and send the RTP packets with the first detected SSRC +to fakesink, discarding the other SSRCs. +
+

+

+

+Last reviewed on 2007-05-28 (0.10.5) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ gstrtpmanager +

author

Wim Taymans <wim.taymans@gmail.com>

class

Demux/Network/RTP
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

rtcp_sink

direction

sink

presence

always

details

application/x-rtcp
+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

rtcp_src_%d

direction

source

presence

sometimes

details

application/x-rtcp
+
++ + + + + + + + + + + + + + + + + + +

name

src_%d

direction

source

presence

sometimes

details

application/x-rtp
+
+
+

+

+
+
+

Details

+
+

struct GstRtpSsrcDemux

+
struct GstRtpSsrcDemux;
+

+

+
+
+
+

Signal Details

+
+

The "clear-ssrc" signal

+
void                user_function                      (GstRtpSsrcDemux *demux,
+                                                        guint            ssrc,
+                                                        gpointer         user_data)      : Action
+

+Action signal to remove the pad for SSRC. +

+
++ + + + + + + + + + + + + + +

demux :

the object which received the signal

ssrc :

the SSRC of the pad

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "new-ssrc-pad" signal

+
void                user_function                      (GstRtpSsrcDemux *demux,
+                                                        guint            ssrc,
+                                                        GstPad          *pad,
+                                                        gpointer         user_data)      : Run Last
+

+Emited when a new SSRC pad has been created. +

+
++ + + + + + + + + + + + + + + + + + +

demux :

the object which received the signal

ssrc :

the SSRC of the pad

pad :

the new pad.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "removed-ssrc-pad" signal

+
void                user_function                      (GstRtpSsrcDemux *demux,
+                                                        guint            ssrc,
+                                                        GstPad          *pad,
+                                                        gpointer         user_data)      : Run Last
+

+Emited when a SSRC pad has been removed. +

+
++ + + + + + + + + + + + + + + + + + +

demux :

the object which received the signal

ssrc :

the SSRC of the pad

pad :

the removed pad.

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-halaudiosink.html b/docs/plugins/html/gst-plugins-good-plugins-halaudiosink.html new file mode 100644 index 0000000..e079f25 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-halaudiosink.html @@ -0,0 +1,149 @@ + + + + +halaudiosink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

halaudiosink

+

halaudiosink — Audio sink for sound device access via HAL

+
+
+

Synopsis

+
                    GstHalAudioSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstHalAudioSink
+
+
+
+

Implemented Interfaces

+

+GstHalAudioSink implements + GstChildProxy.

+
+
+

Properties

+
+  "udi"                      gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ halelements +

author

Jürg Billeter <j@bitron.ch>

class

Sink/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

GstHalAudioSink

+
typedef struct _GstHalAudioSink GstHalAudioSink;
+

+

+
+
+
+

Property Details

+
+

The "udi" property

+
  "udi"                      gchar*                : Read / Write
+

Unique Device Id.

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-halaudiosrc.html b/docs/plugins/html/gst-plugins-good-plugins-halaudiosrc.html new file mode 100644 index 0000000..88f0449 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-halaudiosrc.html @@ -0,0 +1,149 @@ + + + + +halaudiosrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

halaudiosrc

+

halaudiosrc — Audio source for sound device access via HAL

+
+
+

Synopsis

+
                    GstHalAudioSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstHalAudioSrc
+
+
+
+

Implemented Interfaces

+

+GstHalAudioSrc implements + GstChildProxy.

+
+
+

Properties

+
+  "udi"                      gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ halelements +

author

Jürg Billeter <j@bitron.ch>

class

Source/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

GstHalAudioSrc

+
typedef struct _GstHalAudioSrc GstHalAudioSrc;
+

+

+
+
+
+

Property Details

+
+

The "udi" property

+
  "udi"                      gchar*                : Read / Write
+

Unique Device Id.

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-hdv1394src.html b/docs/plugins/html/gst-plugins-good-plugins-hdv1394src.html new file mode 100644 index 0000000..3e6882d --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-hdv1394src.html @@ -0,0 +1,184 @@ + + + + +hdv1394src + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

hdv1394src

+

hdv1394src — Source for MPEG-TS video data from firewire port

+
+
+

Synopsis

+
struct              GstHDV1394Src;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstHDV1394Src
+
+
+
+

Implemented Interfaces

+

+GstHDV1394Src implements + GstURIHandler and GstPropertyProbe.

+
+
+

Properties

+
+  "channel"                  gint                  : Read / Write
+  "device-name"              gchar*                : Read
+  "guid"                     guint64               : Read / Write
+  "port"                     gint                  : Read / Write
+  "use-avc"                  gboolean              : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ 1394 +

author

Edward Hervey <bilboed@bilboed.com>

class

Source/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/mpegts, systemstream=(boolean)true, packetsize=(int)188
+
+
+

+

+
+
+

Details

+
+

struct GstHDV1394Src

+
struct GstHDV1394Src;
+

+

+
+
+
+

Property Details

+
+

The "channel" property

+
  "channel"                  gint                  : Read / Write
+

Channel number for listening.

+

Allowed values: [0,64]

+

Default value: 63

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

user-friendly name of the device.

+

Default value: "Default"

+
+
+
+

The "guid" property

+
  "guid"                     guint64               : Read / Write
+

select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid).

+

Default value: 0

+
+
+
+

The "port" property

+
  "port"                     gint                  : Read / Write
+

Port number (-1 automatic).

+

Allowed values: [G_MAXULONG,16]

+

Default value: -1

+
+
+
+

The "use-avc" property

+
  "use-avc"                  gboolean              : Read / Write
+

Use AV/C VTR control.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-icydemux.html b/docs/plugins/html/gst-plugins-good-plugins-icydemux.html new file mode 100644 index 0000000..78c80db --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-icydemux.html @@ -0,0 +1,172 @@ + + + + +icydemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

icydemux

+

icydemux — Read and output ICY tags while demuxing the contents

+
+
+

Synopsis

+
struct              GstICYDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstICYDemux
+
+
+
+

Description

+

+icydemux accepts data streams with ICY metadata at known intervals, as +transmitted from an upstream element (usually read as response headers from +an HTTP stream). The mime type of the data between the tag blocks is +detected using typefind functions, and the appropriate output mime type set +on outgoing buffers. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch souphttpsrc location=http://some.server/ iradio-mode=true ! icydemux ! fakesink -t
+
+ This pipeline should read any available ICY tag information and output it. +The contents of the stream should be detected, and the appropriate mime +type set on buffers produced from icydemux. (Using gnomevfssrc, neonhttpsrc +or giosrc instead of souphttpsrc should also work.) +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ icydemux +

author

Jan Schmidt <thaytan@mad.scientist.com>, Michael Smith <msmith@fluendo.com>

class

Codec/Demuxer/Metadata
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

application/x-icy, metadata-interval=(int)[ 0, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

sometimes

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstICYDemux

+
struct GstICYDemux;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-id3demux.html b/docs/plugins/html/gst-plugins-good-plugins-id3demux.html new file mode 100644 index 0000000..86e7d04 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-id3demux.html @@ -0,0 +1,199 @@ + + + + +id3demux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

id3demux

+

id3demux — Read and output ID3v1 and ID3v2 tags while demuxing the contents

+
+
+

Synopsis

+
struct              GstID3Demux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstTagDemux
+                     +----GstID3Demux
+
+
+
+

Properties

+
+  "prefer-v1"                gboolean              : Read / Write / Construct
+
+
+
+

Description

+

+id3demux accepts data streams with either (or both) ID3v2 regions at the +start, or ID3v1 at the end. The mime type of the data between the tag blocks +is detected using typefind functions, and the appropriate output mime type +set on outgoing buffers. +

+

+The element is only able to read ID3v1 tags from a seekable stream, because +they are at the end of the stream. That is, when get_range mode is supported +by the upstream elements. If get_range operation is available, id3demux makes +it available downstream. This means that elements which require get_range +mode, such as wavparse, can operate on files containing ID3 tag information. +

+

+This id3demux element replaced an older element with the same name which +relied on libid3tag from the MAD project. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=file.mp3 ! id3demux ! fakesink -t
+
+ This pipeline should read any available ID3 tag information and output it. +The contents of the file inside the ID3 tag regions should be detected, and +the appropriate mime type set on buffers produced from id3demux. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ id3demux +

author

Jan Schmidt <thaytan@mad.scientist.com>

class

Codec/Demuxer/Metadata
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

application/x-id3
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

sometimes

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstID3Demux

+
struct GstID3Demux;
+

+

+
+
+
+

Property Details

+
+

The "prefer-v1" property

+
  "prefer-v1"                gboolean              : Read / Write / Construct
+

Prefer tags from ID3v1 tag at end of file when both ID3v1 and ID3v2 tags are present.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-id3v2mux.html b/docs/plugins/html/gst-plugins-good-plugins-id3v2mux.html new file mode 100644 index 0000000..d76260e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-id3v2mux.html @@ -0,0 +1,153 @@ + + + + +id3v2mux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

id3v2mux

+

id3v2mux — Adds an ID3v2 header to the beginning of MP3 files using taglib

+
+
+

Synopsis

+
struct              GstId3v2Mux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstTagLibMux
+                     +----GstId3v2Mux
+
+
+
+

Implemented Interfaces

+

+GstId3v2Mux implements + GstTagSetter.

+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ taglib +

author

Christophe Fergeau <teuf@gnome.org>

class

Formatter/Metadata
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

application/x-id3
+
+
+

+

+
+
+

Details

+
+

struct GstId3v2Mux

+
struct GstId3v2Mux;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-imagefreeze.html b/docs/plugins/html/gst-plugins-good-plugins-imagefreeze.html new file mode 100644 index 0000000..3e3637c --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-imagefreeze.html @@ -0,0 +1,183 @@ + + + + +imagefreeze + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

imagefreeze

+

imagefreeze — Generates a still frame stream from an image

+
+
+

Synopsis

+
struct              GstImageFreeze;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstImageFreeze
+
+
+
+

Description

+

+The imagefreeze element generates a still frame video stream from +the input. It duplicates the first frame with the framerate requested +by downstream, allows seeking and answers queries. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v filesrc location=some.png ! decodebin2 ! imagefreeze ! autovideosink
+
+ This pipeline shows a still frame stream of a PNG file. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ imagefreeze +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv

video/x-raw-rgb

video/x-raw-gray
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv

video/x-raw-rgb

video/x-raw-gray
+
+
+

+

+
+
+

Details

+
+

struct GstImageFreeze

+
struct GstImageFreeze;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-interleave.html b/docs/plugins/html/gst-plugins-good-plugins-interleave.html new file mode 100644 index 0000000..bd7ec7b --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-interleave.html @@ -0,0 +1,243 @@ + + + + +interleave + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

interleave

+

interleave — Folds many mono channels into one interleaved audio stream

+
+
+

Synopsis

+
struct              GstInterleave;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstInterleave
+
+
+
+

Properties

+
+  "channel-positions"        GValueArray*          : Read / Write
+  "channel-positions-from-input" gboolean              : Read / Write
+
+
+
+

Description

+

+Merges separate mono inputs into one interleaved stream. +

+

+This element handles all raw floating point sample formats and all signed integer sample formats. The first +caps on one of the sinkpads will set the caps of the output so usually an audioconvert element should be +placed before every sinkpad of interleave. +

+

+It's possible to change the number of channels while the pipeline is running by adding or removing +some of the request pads but this will change the caps of the output buffers. Changing the input +caps is _not_ supported yet. +

+

+The channel number of every sinkpad in the out can be retrieved from the "channel" property of the pad. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2" ! deinterleave name=d  interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav    d.src0 ! queue ! audioconvert ! i.sink1    d.src1 ! queue ! audioconvert ! i.sink0
+
+ Decodes and deinterleaves a Stereo MP3 file into separate channels and +then interleaves the channels again to a WAV file with the channel with the +channels exchanged. +
+ + + + + + + +
1
gst-launch interleave name=i ! audioconvert ! wavenc ! filesink location=file.wav  filesrc location=file1.wav ! decodebin ! audioconvert ! "audio/x-raw-int,channels=1" ! queue ! i.sink0   filesrc location=file2.wav ! decodebin ! audioconvert ! "audio/x-raw-int,channels=1" ! queue ! i.sink1
+
+ Interleaves two Mono WAV files to a single Stereo WAV file. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ interleave +

author

Andy Wingo <wingo at pobox.com>, Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Converter/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink%d

direction

sink

presence

request

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean)true

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean)true

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
+
+
+

+

+
+
+

Details

+
+

struct GstInterleave

+
struct GstInterleave;
+

+

+
+
+
+

Property Details

+
+

The "channel-positions" property

+
  "channel-positions"        GValueArray*          : Read / Write
+

+Channel positions: This property controls the channel positions +that are used on the src caps. The number of elements should be +the same as the number of sink pads and the array should contain +a valid list of channel positions. The n-th element of the array +is the position of the n-th sink pad. +

+

+These channel positions will only be used if they're valid and the +number of elements is the same as the number of channels. If this +is not given a NONE layout will be used. +

+
+
+
+

The "channel-positions-from-input" property

+
  "channel-positions-from-input" gboolean              : Read / Write
+

+Channel positions from input: If this property is set to TRUE the channel +positions will be taken from the input caps if valid channel positions for +the output can be constructed from them. If this is set to TRUE setting the +channel-positions property overwrites this property again. +

+

Default value: TRUE

+
+
+
+

See Also

+deinterleave +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-ismlmux.html b/docs/plugins/html/gst-plugins-good-plugins-ismlmux.html new file mode 100644 index 0000000..0e5ebc7 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-ismlmux.html @@ -0,0 +1,234 @@ + + + + +ismlmux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

ismlmux

+

ismlmux — Muxer for ISML smooth streaming (.isml) files

+
+
+

Synopsis

+

+
+
+

Description

+

+This element merges streams (audio and video) into MJ2 (.mj2) files. +

+

+The following background intends to explain why various similar muxers +are present in this plugin. +

+

+The +QuickTime file format specification served as basis for the MP4 file +format specification (mp4mux), and as such the QuickTime file structure is +nearly identical to the so-called ISO Base Media file format defined in +ISO 14496-12 (except for some media specific parts). +In turn, the latter ISO Base Media format was further specialized as a +Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) +and in various 3GPP(2) specs (gppmux). +The fragmented file features defined (only) in ISO Base Media are used by +ISMV files making up (a.o.) Smooth Streaming (ismlmux). +

+

+A few properties (movie-timescale, +trak-timescale) allow adjusting +some technical parameters, which might be useful in (rare) cases to resolve +compatibility issues in some situations. +

+

+Some other properties influence the result more fundamentally. +A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, +somewhat contrary to this usually being called "the header". +However, a faststart file will +(with some effort) arrange this to be located near start of the file, +which then allows it e.g. to be played while downloading. +Alternatively, rather than having one chunk of metadata at start (or end), +there can be some metadata at start and most of the other data can be spread +out into fragments of fragment-duration. +If such fragmented layout is intended for streaming purposes, then +streamable allows foregoing to add +index metadata (at the end of file). +

+

+dts-method allows selecting a +method for managing input timestamps (stay tuned for 0.11 to have this +automagically settled). The default delta/duration method should handle nice +(aka perfect streams) just fine, but may experience problems otherwise +(e.g. input stream with re-ordered B-frames and/or with frame dropping). +The re-ordering approach re-assigns incoming timestamps in ascending order +to incoming buffers and offers an alternative in such cases. In cases where +that might fail, the remaining method can be tried, which is exact and +according to specs, but might experience playback on not so spec-wise players. +Note that this latter approach also requires one to enable +presentation-timestamp. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch v4l2src num-buffers=50 ! queue ! jp2kenc ! mj2mux ! filesink location=video.mj2
+
+ +Records a video stream captured from a v4l2 device, encodes it into JPEG-2000 +and muxes it into an mj2 file. +
+

+

+

+Documentation last reviewed on 2011-04-21 +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ isomp4 +

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

audio_%d

direction

sink

presence

request

details

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video_%d

direction

sink

presence

request

details

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, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/quicktime, variant=(string)iso-fragmented
+
+
+

+

+
+
+

Details

+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-jackaudiosink.html b/docs/plugins/html/gst-plugins-good-plugins-jackaudiosink.html new file mode 100644 index 0000000..0b4cb8e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-jackaudiosink.html @@ -0,0 +1,165 @@ + + + + +jackaudiosink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

jackaudiosink

+

jackaudiosink — Output audio to a JACK server

+
+
+

Synopsis

+
struct              GstJackAudioSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstBaseAudioSink
+                           +----GstJackAudioSink
+
+
+
+

Properties

+
+  "client"                   JackClient*           : Read / Write
+  "connect"                  GstJackConnect        : Read / Write
+  "server"                   gchar*                : Read / Write
+  "client-name"              gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ jack +

author

Wim Taymans <wim.taymans@gmail.com>

class

Sink/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstJackAudioSink

+
struct GstJackAudioSink;
+

+

+
+
+
+

Property Details

+
+

The "client" property

+
  "client"                   JackClient*           : Read / Write
+

Handle for jack client.

+
+
+
+

The "connect" property

+
  "connect"                  GstJackConnect        : Read / Write
+

Specify how the output ports will be connected.

+

Default value: Automatically connect ports to physical ports

+
+
+
+

The "server" property

+
  "server"                   gchar*                : Read / Write
+

The Jack server to connect to (NULL = default).

+

Default value: NULL

+
+
+
+

The "client-name" property

+
  "client-name"              gchar*                : Read / Write
+

The client name of the Jack instance (NULL = default).

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-jackaudiosrc.html b/docs/plugins/html/gst-plugins-good-plugins-jackaudiosrc.html new file mode 100644 index 0000000..09f9bf9 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-jackaudiosrc.html @@ -0,0 +1,166 @@ + + + + +jackaudiosrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

jackaudiosrc

+

jackaudiosrc — Captures audio from a JACK server

+
+
+

Synopsis

+
struct              GstJackAudioSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstBaseAudioSrc
+                                 +----GstJackAudioSrc
+
+
+
+

Properties

+
+  "client"                   JackClient*           : Read / Write
+  "connect"                  GstJackConnect        : Read / Write
+  "server"                   gchar*                : Read / Write
+  "client-name"              gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ jack +

author

Tristan Matthews <tristan@sat.qc.ca>

class

Source/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstJackAudioSrc

+
struct GstJackAudioSrc;
+

+

+
+
+
+

Property Details

+
+

The "client" property

+
  "client"                   JackClient*           : Read / Write
+

Handle for jack client.

+
+
+
+

The "connect" property

+
  "connect"                  GstJackConnect        : Read / Write
+

Specify how the input ports will be connected.

+

Default value: Automatically connect ports to physical ports

+
+
+
+

The "server" property

+
  "server"                   gchar*                : Read / Write
+

The Jack server to connect to (NULL = default).

+

Default value: NULL

+
+
+
+

The "client-name" property

+
  "client-name"              gchar*                : Read / Write
+

The client name of the Jack instance (NULL = default).

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-jpegdec.html b/docs/plugins/html/gst-plugins-good-plugins-jpegdec.html new file mode 100644 index 0000000..5a1170a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-jpegdec.html @@ -0,0 +1,198 @@ + + + + +jpegdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

jpegdec

+

jpegdec — Decode images from JPEG format

+
+
+

Synopsis

+
struct              GstJpegDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstJpegDec
+
+
+
+

Properties

+
+  "idct-method"              GstIDCTMethod         : Read / Write
+  "max-errors"               gint                  : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ jpeg +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Image
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

image/jpeg, width=(int)[ 1, 65535 ], height=(int)[ 1, 65535 ], framerate=(fraction)[ 0/1, 2147483647/1 ], sof-marker=(int){ 0, 1, 2, 5, 6, 7, 9, 10, 13, 14 }
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstJpegDec

+
struct GstJpegDec;
+

+

+
+
+
+

Property Details

+
+

The "idct-method" property

+
  "idct-method"              GstIDCTMethod         : Read / Write
+

The IDCT algorithm to use.

+

Default value: Faster, less accurate integer method

+
+
+
+

The "max-errors" property

+
  "max-errors"               gint                  : Read / Write
+

Error out after receiving N consecutive decoding errors (-1 = never fail, 0 = automatic, 1 = fail on first error).

+

Allowed values: >= G_MAXULONG

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-jpegenc.html b/docs/plugins/html/gst-plugins-good-plugins-jpegenc.html new file mode 100644 index 0000000..a041769 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-jpegenc.html @@ -0,0 +1,229 @@ + + + + +jpegenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

jpegenc

+

jpegenc — Encode images in JPEG format

+
+
+

Synopsis

+
struct              GstJpegEnc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstJpegEnc
+
+
+
+

Properties

+
+  "quality"                  gint                  : Read / Write
+  "idct-method"              GstIDCTMethod         : Read / Write
+
+
+
+

Signals

+
+  "frame-encoded"                                  : Run Last
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ jpeg +

author

Wim Taymans <wim.taymans@tvd.be>

class

Codec/Encoder/Image
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, UYVY, Y41B, Y42B, YVYU, Y444 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

image/jpeg, width=(int)[ 16, 65535 ], height=(int)[ 16, 65535 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstJpegEnc

+
struct GstJpegEnc;
+

+

+
+
+
+

Property Details

+
+

The "quality" property

+
  "quality"                  gint                  : Read / Write
+

Quality of encoding.

+

Allowed values: [0,100]

+

Default value: 85

+
+
+
+

The "idct-method" property

+
  "idct-method"              GstIDCTMethod         : Read / Write
+

The IDCT algorithm to use.

+

Default value: Faster, less accurate integer method

+
+
+
+

Signal Details

+
+

The "frame-encoded" signal

+
void                user_function                      (GstJpegEnc *gstjpegenc,
+                                                        gpointer    user_data)       : Run Last
+

+

+
++ + + + + + + + + + +

gstjpegenc :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-level.html b/docs/plugins/html/gst-plugins-good-plugins-level.html new file mode 100644 index 0000000..e9a3841 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-level.html @@ -0,0 +1,529 @@ + + + + +level + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

level

+

level — RMS/Peak/Decaying Peak Level messager for audio/raw

+
+
+

Synopsis

+
struct              GstLevel;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstLevel
+
+
+
+

Properties

+
+  "interval"                 guint64               : Read / Write
+  "message"                  gboolean              : Read / Write
+  "peak-falloff"             gdouble               : Read / Write
+  "peak-ttl"                 guint64               : Read / Write
+
+
+
+

Description

+

+Level analyses incoming audio buffers and, if the "message" property +is TRUE, generates an element message named +"level": +after each interval of time given by the "interval" property. +The message's structure contains these fields: +

+
    +
  • + GstClockTime + "timestamp": + the timestamp of the buffer that triggered the message. +

  • +
  • + GstClockTime + "stream-time": + the stream time of the buffer. +

  • +
  • + GstClockTime + "running-time": + the running_time of the buffer. +

  • +
  • + GstClockTime + "duration": + the duration of the buffer. +

  • +
  • + GstClockTime + "endtime": + the end time of the buffer that triggered the message as stream time (this + is deprecated, as it can be calculated from stream-time + duration) +

  • +
  • + GstValueList of gdouble + "peak": + the peak power level in dB for each channel +

  • +
  • + GstValueList of gdouble + "decay": + the decaying peak power level in dB for each channel + the decaying peak level follows the peak level, but starts dropping + if no new peak is reached after the time given by + the the time to live. + When the decaying peak level drops, it does so at the decay rate + as specified by the + the peak falloff rate. +

  • +
  • + GstValueList of gdouble + "rms": + the Root Mean Square (or average power) level in dB for each channel +

  • +
+

+

+

+

+
+

Example application

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
/* GStreamer
+ * Copyright (C) 2000,2001,2002,2003,2005
+ *           Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <math.h>
+
+#include <gst/gst.h>
+
+static gboolean
+message_handler (GstBus * bus, GstMessage * message, gpointer data)
+{
+
+  if (message->type == GST_MESSAGE_ELEMENT) {
+    const GstStructure *s = gst_message_get_structure (message);
+    const gchar *name = gst_structure_get_name (s);
+
+    if (strcmp (name, "level") == 0) {
+      gint channels;
+      GstClockTime endtime;
+      gdouble rms_dB, peak_dB, decay_dB;
+      gdouble rms;
+      const GValue *list;
+      const GValue *value;
+
+      gint i;
+
+      if (!gst_structure_get_clock_time (s, "endtime", &endtime))
+        g_warning ("Could not parse endtime");
+      /* we can get the number of channels as the length of any of the value
+       * lists */
+      list = gst_structure_get_value (s, "rms");
+      channels = gst_value_list_get_size (list);
+
+      g_print ("endtime: %" GST_TIME_FORMAT ", channels: %d\n",
+          GST_TIME_ARGS (endtime), channels);
+      for (i = 0; i < channels; ++i) {
+        g_print ("channel %d\n", i);
+        list = gst_structure_get_value (s, "rms");
+        value = gst_value_list_get_value (list, i);
+        rms_dB = g_value_get_double (value);
+        list = gst_structure_get_value (s, "peak");
+        value = gst_value_list_get_value (list, i);
+        peak_dB = g_value_get_double (value);
+        list = gst_structure_get_value (s, "decay");
+        value = gst_value_list_get_value (list, i);
+        decay_dB = g_value_get_double (value);
+        g_print ("    RMS: %f dB, peak: %f dB, decay: %f dB\n",
+            rms_dB, peak_dB, decay_dB);
+
+        /* converting from dB to normal gives us a value between 0.0 and 1.0 */
+        rms = pow (10, rms_dB / 20);
+        g_print ("    normalized rms value: %f\n", rms);
+      }
+    }
+  }
+  /* we handled the message we want, and ignored the ones we didn't want.
+   * so the core can unref the message for us */
+  return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+  GstElement *audiotestsrc, *audioconvert, *level, *fakesink;
+  GstElement *pipeline;
+  GstCaps *caps;
+  GstBus *bus;
+  guint watch_id;
+  GMainLoop *loop;
+
+  gst_init (&argc, &argv);
+
+  caps = gst_caps_from_string ("audio/x-raw-int,channels=2");
+
+  pipeline = gst_pipeline_new (NULL);
+  g_assert (pipeline);
+  audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL);
+  g_assert (audiotestsrc);
+  audioconvert = gst_element_factory_make ("audioconvert", NULL);
+  g_assert (audioconvert);
+  level = gst_element_factory_make ("level", NULL);
+  g_assert (level);
+  fakesink = gst_element_factory_make ("fakesink", NULL);
+  g_assert (fakesink);
+
+  gst_bin_add_many (GST_BIN (pipeline), audiotestsrc, audioconvert, level,
+      fakesink, NULL);
+  if (!gst_element_link (audiotestsrc, audioconvert))
+    g_error ("Failed to link audiotestsrc and audioconvert");
+  if (!gst_element_link_filtered (audioconvert, level, caps))
+    g_error ("Failed to link audioconvert and level");
+  if (!gst_element_link (level, fakesink))
+    g_error ("Failed to link level and fakesink");
+
+  /* make sure we'll get messages */
+  g_object_set (G_OBJECT (level), "message", TRUE, NULL);
+  /* run synced and not as fast as we can */
+  g_object_set (G_OBJECT (fakesink), "sync", TRUE, NULL);
+
+  bus = gst_element_get_bus (pipeline);
+  watch_id = gst_bus_add_watch (bus, message_handler, NULL);
+
+  gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+  /* we need to run a GLib main loop to get the messages */
+  loop = g_main_loop_new (NULL, FALSE);
+  g_main_loop_run (loop);
+
+  g_source_remove (watch_id);
+  g_main_loop_unref (loop);
+  return 0;
+}
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ level +

author

Thomas Vander Stichele <thomas at apestaart dot org>

class

Filter/Analyzer/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16, 32 }, depth=(int){ 8, 16, 32 }, signed=(boolean)true

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16, 32 }, depth=(int){ 8, 16, 32 }, signed=(boolean)true

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }
+
+
+

+

+
+
+

Details

+
+

struct GstLevel

+
struct GstLevel;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "interval" property

+
  "interval"                 guint64               : Read / Write
+

Interval of time between message posts (in nanoseconds).

+

Allowed values: >= 1

+

Default value: 100000000

+
+
+
+

The "message" property

+
  "message"                  gboolean              : Read / Write
+

Post a level message for each passed interval.

+

Default value: TRUE

+
+
+
+

The "peak-falloff" property

+
  "peak-falloff"             gdouble               : Read / Write
+

Decay rate of decay peak after TTL (in dB/sec).

+

Allowed values: >= 0

+

Default value: 10

+
+
+
+

The "peak-ttl" property

+
  "peak-ttl"                 guint64               : Read / Write
+

Time To Live of decay peak before it falls back (in nanoseconds).

+

Default value: 300000000

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-matroskademux.html b/docs/plugins/html/gst-plugins-good-plugins-matroskademux.html new file mode 100644 index 0000000..5a78918 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-matroskademux.html @@ -0,0 +1,256 @@ + + + + +matroskademux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

matroskademux

+

matroskademux — Demuxes Matroska/WebM streams into video/audio/subtitles

+
+
+

Synopsis

+
                    GstMatroskaDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstMatroskaDemux
+
+
+
+

Properties

+
+  "max-gap-time"             guint64               : Read / Write
+
+
+
+

Description

+

+matroskademux demuxes a Matroska file into the different contained streams. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v filesrc location=/path/to/mkv ! matroskademux ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
+
+ This pipeline demuxes a Matroska file and outputs the contained Vorbis audio. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ matroska +

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Codec/Demuxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-matroska

video/webm
+
++ + + + + + + + + + + + + + + + + + +

name

audio_%02d

direction

source

presence

sometimes

details

ANY
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

subtitle_%02d

direction

source

presence

sometimes

details

text/x-pango-markup

application/x-ssa

application/x-ass

application/x-usf

video/x-dvd-subpicture

subpicture/x-pgs

subtitle/x-kate

application/x-subtitle-unknown
+
++ + + + + + + + + + + + + + + + + + +

name

video_%02d

direction

source

presence

sometimes

details

ANY
+
+
+

+

+
+
+

Details

+
+

GstMatroskaDemux

+
typedef struct _GstMatroskaDemux GstMatroskaDemux;
+

+

+
+
+
+

Property Details

+
+

The "max-gap-time" property

+
  "max-gap-time"             guint64               : Read / Write
+

The demuxer sends out newsegment events for skipping gaps longer than this (0 = disabled).

+

Default value: 2000000000

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-matroskamux.html b/docs/plugins/html/gst-plugins-good-plugins-matroskamux.html new file mode 100644 index 0000000..6d291ef --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-matroskamux.html @@ -0,0 +1,394 @@ + + + + +matroskamux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

matroskamux

+

matroskamux — Muxes video/audio/subtitle streams into a matroska stream

+
+
+

Synopsis

+
                    GstMatroskaMux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstMatroskaMux
+                     +----GstWebMMux
+
+
+
+

Implemented Interfaces

+

+GstMatroskaMux implements + GstTagSetter.

+
+
+

Properties

+
+  "writing-app"              gchar*                : Read / Write
+  "version"                  gint                  : Read / Write
+  "min-index-interval"       gint64                : Read / Write
+  "streamable"               gboolean              : Read / Write
+
+
+
+

Description

+

+matroskamux muxes different input streams into a Matroska file. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v filesrc location=/path/to/mp3 ! mp3parse ! matroskamux name=mux ! filesink location=test.mkv  filesrc location=/path/to/theora.ogg ! oggdemux ! theoraparse ! mux.
+
+ This pipeline muxes an MP3 file and a Ogg Theora video into a Matroska file. +
+ + + + + + + +
1
gst-launch -v audiotestsrc num-buffers=100 ! audioconvert ! vorbisenc ! matroskamux ! filesink location=test.mka
+
+ This pipeline muxes a 440Hz sine wave encoded with the Vorbis codec into a Matroska file. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ matroska +

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

audio_%d

direction

sink

presence

request

details

audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int){ 2, 4 }, stream-format=(string)raw, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-ac3, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-eac3, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-dts, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-vorbis, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-flac, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-speex, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean)false, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)24, depth=(int)24, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)32, depth=(int)32, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)[ 32, 64 ], endianness=(int)1234, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-tta, width=(int){ 8, 16, 24 }, channels=(int){ 1, 2 }, rate=(int)[ 8000, 96000 ]

audio/x-pn-realaudio, raversion=(int){ 1, 2, 8 }, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)[ 1, 3 ], block_align=(int)[ 0, 65535 ], bitrate=(int)[ 0, 524288 ], channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/x-alaw, channels=(int){ 1, 2 }, rate=(int)[ 8000, 192000 ]

audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int)[ 8000, 192000 ]
+
++ + + + + + + + + + + + + + + + + + +

name

subtitle_%d

direction

sink

presence

request

details

subtitle/x-kate
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video_%d

direction

sink

presence

request

details

video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-dv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]

video/x-theora

video/x-dirac, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-pn-realvideo, rmversion=(int)[ 1, 4 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc){ YUY2, I420, YV12, UYVY, AYUV }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-wmv, wmvversion=(int)[ 1, 3 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-matroska
+
+
+

+

+
+
+

Details

+
+

GstMatroskaMux

+
typedef struct _GstMatroskaMux GstMatroskaMux;
+

+

+
+
+
+

Property Details

+
+

The "writing-app" property

+
  "writing-app"              gchar*                : Read / Write
+

The name the application that creates the matroska file.

+

Default value: NULL

+
+
+
+

The "version" property

+
  "version"                  gint                  : Read / Write
+

This parameter determines what Matroska features can be used.

+

Allowed values: [1,2]

+

Default value: 2

+
+
+
+

The "min-index-interval" property

+
  "min-index-interval"       gint64                : Read / Write
+

An index entry is created every so many nanoseconds.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "streamable" property

+
  "streamable"               gboolean              : Read / Write
+

If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-mj2mux.html b/docs/plugins/html/gst-plugins-good-plugins-mj2mux.html new file mode 100644 index 0000000..a140e73 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-mj2mux.html @@ -0,0 +1,338 @@ + + + + +mj2mux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

mj2mux

+

mj2mux — Muxer for Motion JPEG-2000 (.mj2) files

+
+
+

Synopsis

+
                    GstMJ2Mux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstMJ2Mux
+
+
+
+

Implemented Interfaces

+

+GstMJ2Mux implements + GstTagSetter and GstTagXmpWriter.

+
+
+

Properties

+
+  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
+  "faststart"                gboolean              : Read / Write
+  "faststart-file"           gchar*                : Read / Write / Construct
+  "fragment-duration"        guint                 : Read / Write / Construct
+  "moov-recovery-file"       gchar*                : Read / Write / Construct
+  "movie-timescale"          guint                 : Read / Write / Construct
+  "presentation-time"        gboolean              : Read / Write / Construct
+  "streamable"               gboolean              : Read / Write / Construct
+  "trak-timescale"           guint                 : Read / Write / Construct
+
+
+
+

Description

+

+This element merges streams (audio and video) into MJ2 (.mj2) files. +

+

+The following background intends to explain why various similar muxers +are present in this plugin. +

+

+The +QuickTime file format specification served as basis for the MP4 file +format specification (mp4mux), and as such the QuickTime file structure is +nearly identical to the so-called ISO Base Media file format defined in +ISO 14496-12 (except for some media specific parts). +In turn, the latter ISO Base Media format was further specialized as a +Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) +and in various 3GPP(2) specs (gppmux). +The fragmented file features defined (only) in ISO Base Media are used by +ISMV files making up (a.o.) Smooth Streaming (ismlmux). +

+

+A few properties (movie-timescale, +trak-timescale) allow adjusting +some technical parameters, which might be useful in (rare) cases to resolve +compatibility issues in some situations. +

+

+Some other properties influence the result more fundamentally. +A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, +somewhat contrary to this usually being called "the header". +However, a faststart file will +(with some effort) arrange this to be located near start of the file, +which then allows it e.g. to be played while downloading. +Alternatively, rather than having one chunk of metadata at start (or end), +there can be some metadata at start and most of the other data can be spread +out into fragments of fragment-duration. +If such fragmented layout is intended for streaming purposes, then +streamable allows foregoing to add +index metadata (at the end of file). +

+

+dts-method allows selecting a +method for managing input timestamps (stay tuned for 0.11 to have this +automagically settled). The default delta/duration method should handle nice +(aka perfect streams) just fine, but may experience problems otherwise +(e.g. input stream with re-ordered B-frames and/or with frame dropping). +The re-ordering approach re-assigns incoming timestamps in ascending order +to incoming buffers and offers an alternative in such cases. In cases where +that might fail, the remaining method can be tried, which is exact and +according to specs, but might experience playback on not so spec-wise players. +Note that this latter approach also requires one to enable +presentation-timestamp. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch v4l2src num-buffers=50 ! queue ! jp2kenc ! mj2mux ! filesink location=video.mj2
+
+ +Records a video stream captured from a v4l2 device, encodes it into JPEG-2000 +and muxes it into an mj2 file. +
+

+

+

+Documentation last reviewed on 2011-04-21 +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ isomp4 +

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

audio_%d

direction

sink

presence

request

details

audio/x-raw-int, width=(int)8, depth=(int)8, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean){ true, false }

audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

video_%d

direction

sink

presence

request

details

image/x-j2c, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/x-jpc, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/mj2
+
+
+

+

+
+
+

Details

+
+

GstMJ2Mux

+
typedef struct _GstMJ2Mux GstMJ2Mux;
+

+

+
+
+
+

Property Details

+
+

The "dts-method" property

+
  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
+

Method to determine DTS time.

+

Default value: reorder

+
+
+
+

The "faststart" property

+
  "faststart"                gboolean              : Read / Write
+

If the file should be formatted for faststart (headers first).

+

Default value: FALSE

+
+
+
+

The "faststart-file" property

+
  "faststart-file"           gchar*                : Read / Write / Construct
+

File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically.

+

Default value: NULL

+
+
+
+

The "fragment-duration" property

+
  "fragment-duration"        guint                 : Read / Write / Construct
+

Fragment durations in ms (produce a fragmented file if > 0).

+

Default value: 0

+
+
+
+

The "moov-recovery-file" property

+
  "moov-recovery-file"       gchar*                : Read / Write / Construct
+

File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental).

+

Default value: NULL

+
+
+
+

The "movie-timescale" property

+
  "movie-timescale"          guint                 : Read / Write / Construct
+

Timescale to use in the movie (units per second).

+

Allowed values: >= 1

+

Default value: 1000

+
+
+
+

The "presentation-time" property

+
  "presentation-time"        gboolean              : Read / Write / Construct
+

Calculate and include presentation/composition time (in addition to decoding time).

+

Default value: TRUE

+
+
+
+

The "streamable" property

+
  "streamable"               gboolean              : Read / Write / Construct
+

If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written.

+

Default value: FALSE

+
+
+
+

The "trak-timescale" property

+
  "trak-timescale"           guint                 : Read / Write / Construct
+

Timescale to use for the tracks (units per second, 0 is automatic).

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-monoscope.html b/docs/plugins/html/gst-plugins-good-plugins-monoscope.html new file mode 100644 index 0000000..8d5f4e3 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-monoscope.html @@ -0,0 +1,190 @@ + + + + +monoscope + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

monoscope

+

monoscope — Displays a highly stabilised waveform of audio input

+
+
+

Synopsis

+
struct              GstMonoscope;
+
+
+
+

Description

+

+Monoscope is an audio visualisation element. It creates a coloured +curve of the audio signal like on an oscilloscope. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v audiotestsrc ! audioconvert ! monoscope ! ffmpegcolorspace ! ximagesink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ monoscope +

author

Richard Boulton <richard@tartarus.org>

class

Visualization
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)256, height=(int)128, framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstMonoscope

+
struct GstMonoscope {
+  GstElement element;
+
+  /* pads */
+  GstPad      *sinkpad;
+  GstPad      *srcpad;
+
+  GstAdapter  *adapter;
+
+  guint64      next_ts;             /* expected timestamp of the next frame */
+  guint64      frame_duration;      /* video frame duration    */
+  gint         rate;                /* sample rate             */
+  guint        bps;                 /* bytes per sample        */
+  guint        spf;                 /* samples per video frame */
+
+  GstSegment   segment;
+
+  /* QoS stuff *//* with LOCK */
+  gdouble      proportion;
+  GstClockTime earliest_time;
+
+  /* video state */
+  gint         fps_num;
+  gint         fps_denom;
+  gint         width;
+  gint         height;
+  guint        outsize;
+
+  /* visualisation state */
+  struct monoscope_state *visstate;
+};
+
+

+

+
+
+
+

See Also

+goom +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-mp4mux.html b/docs/plugins/html/gst-plugins-good-plugins-mp4mux.html new file mode 100644 index 0000000..96021e5 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-mp4mux.html @@ -0,0 +1,351 @@ + + + + +mp4mux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

mp4mux

+

mp4mux — Muxer for ISO MPEG-4 (.mp4) files

+
+
+

Synopsis

+
typedef             GstMP4Mux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstMP4Mux
+
+
+
+

Implemented Interfaces

+

+GstMP4Mux implements + GstTagSetter and GstTagXmpWriter.

+
+
+

Properties

+
+  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
+  "faststart"                gboolean              : Read / Write
+  "faststart-file"           gchar*                : Read / Write / Construct
+  "fragment-duration"        guint                 : Read / Write / Construct
+  "moov-recovery-file"       gchar*                : Read / Write / Construct
+  "movie-timescale"          guint                 : Read / Write / Construct
+  "presentation-time"        gboolean              : Read / Write / Construct
+  "streamable"               gboolean              : Read / Write / Construct
+  "trak-timescale"           guint                 : Read / Write / Construct
+
+
+
+

Description

+

+This element merges streams (audio and video) into ISO MPEG-4 (.mp4) files. +

+

+The following background intends to explain why various similar muxers +are present in this plugin. +

+

+The +QuickTime file format specification served as basis for the MP4 file +format specification (mp4mux), and as such the QuickTime file structure is +nearly identical to the so-called ISO Base Media file format defined in +ISO 14496-12 (except for some media specific parts). +In turn, the latter ISO Base Media format was further specialized as a +Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) +and in various 3GPP(2) specs (gppmux). +The fragmented file features defined (only) in ISO Base Media are used by +ISMV files making up (a.o.) Smooth Streaming (ismlmux). +

+

+A few properties (movie-timescale, +trak-timescale) allow adjusting +some technical parameters, which might be useful in (rare) cases to resolve +compatibility issues in some situations. +

+

+Some other properties influence the result more fundamentally. +A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, +somewhat contrary to this usually being called "the header". +However, a faststart file will +(with some effort) arrange this to be located near start of the file, +which then allows it e.g. to be played while downloading. +Alternatively, rather than having one chunk of metadata at start (or end), +there can be some metadata at start and most of the other data can be spread +out into fragments of fragment-duration. +If such fragmented layout is intended for streaming purposes, then +streamable allows foregoing to add +index metadata (at the end of file). +

+

+dts-method allows selecting a +method for managing input timestamps (stay tuned for 0.11 to have this +automagically settled). The default delta/duration method should handle nice +(aka perfect streams) just fine, but may experience problems otherwise +(e.g. input stream with re-ordered B-frames and/or with frame dropping). +The re-ordering approach re-assigns incoming timestamps in ascending order +to incoming buffers and offers an alternative in such cases. In cases where +that might fail, the remaining method can be tried, which is exact and +according to specs, but might experience playback on not so spec-wise players. +Note that this latter approach also requires one to enable +presentation-timestamp. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch gst-launch v4l2src num-buffers=50 ! queue ! x264enc ! mp4mux ! filesink location=video.mp4
+
+ +Records a video stream captured from a v4l2 device, encodes it into H.264 +and muxes it into an mp4 file. +
+

+

+

+Documentation last reviewed on 2011-04-21 +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ isomp4 +

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

audio_%d

direction

sink

presence

request

details

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]

audio/x-alac, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video_%d

direction

sink

presence

request

details

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, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-mp4-part, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/quicktime, variant=(string)iso
+
+
+

+

+
+
+

Details

+
+

GstMP4Mux

+
typedef struct _Gst3GPPMux GstMP4Mux;
+
+

+

+
+
+
+

Property Details

+
+

The "dts-method" property

+
  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
+

Method to determine DTS time.

+

Default value: reorder

+
+
+
+

The "faststart" property

+
  "faststart"                gboolean              : Read / Write
+

If the file should be formatted for faststart (headers first).

+

Default value: FALSE

+
+
+
+

The "faststart-file" property

+
  "faststart-file"           gchar*                : Read / Write / Construct
+

File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically.

+

Default value: NULL

+
+
+
+

The "fragment-duration" property

+
  "fragment-duration"        guint                 : Read / Write / Construct
+

Fragment durations in ms (produce a fragmented file if > 0).

+

Default value: 0

+
+
+
+

The "moov-recovery-file" property

+
  "moov-recovery-file"       gchar*                : Read / Write / Construct
+

File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental).

+

Default value: NULL

+
+
+
+

The "movie-timescale" property

+
  "movie-timescale"          guint                 : Read / Write / Construct
+

Timescale to use in the movie (units per second).

+

Allowed values: >= 1

+

Default value: 1000

+
+
+
+

The "presentation-time" property

+
  "presentation-time"        gboolean              : Read / Write / Construct
+

Calculate and include presentation/composition time (in addition to decoding time).

+

Default value: TRUE

+
+
+
+

The "streamable" property

+
  "streamable"               gboolean              : Read / Write / Construct
+

If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written.

+

Default value: FALSE

+
+
+
+

The "trak-timescale" property

+
  "trak-timescale"           guint                 : Read / Write / Construct
+

Timescale to use for the tracks (units per second, 0 is automatic).

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-mpegaudioparse.html b/docs/plugins/html/gst-plugins-good-plugins-mpegaudioparse.html new file mode 100644 index 0000000..1d851dd --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-mpegaudioparse.html @@ -0,0 +1,171 @@ + + + + +mpegaudioparse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

mpegaudioparse

+

mpegaudioparse — MPEG audio parser

+
+
+

Synopsis

+
struct              GstMpegAudioParse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseParse
+                     +----GstMpegAudioParse
+
+
+
+

Description

+

+Parses and frames mpeg1 audio streams. Provides seeking. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=test.mp3 ! mpegaudioparse ! mad ! autoaudiosink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ audioparsers +

author

Jan Schmidt <thaytan@mad.scientist.com>,Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>

class

Codec/Parser/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/mpeg, mpegversion=(int)1
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], mpegaudioversion=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ], parsed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstMpegAudioParse

+
struct GstMpegAudioParse;
+

+The opaque GstMpegAudioParse object +

+
+
+
+

See Also

+GstAmrParse, GstAACParse +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-mulawdec.html b/docs/plugins/html/gst-plugins-good-plugins-mulawdec.html new file mode 100644 index 0000000..ec30965 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-mulawdec.html @@ -0,0 +1,147 @@ + + + + +mulawdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

mulawdec

+

mulawdec — Convert 8bit mu law to 16bit PCM

+
+
+

Synopsis

+
struct              GstMuLawDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstMuLawDec
+
+
+
+

Description

+

+This element decodes mulaw audio. Mulaw coding is also known as G.711. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ mulaw +

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Codec/Decoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstMuLawDec

+
struct GstMuLawDec;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-mulawenc.html b/docs/plugins/html/gst-plugins-good-plugins-mulawenc.html new file mode 100644 index 0000000..5bde4d5 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-mulawenc.html @@ -0,0 +1,152 @@ + + + + +mulawenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

mulawenc

+

mulawenc — Convert 16bit PCM to 8bit mu law

+
+
+

Synopsis

+
struct              GstMuLawDec;
+struct              GstMuLawEnc;
+
+
+
+

Description

+

+This element encode mulaw audio. Mulaw coding is also known as G.711. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ mulaw +

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Codec/Encoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
+
+
+

+

+
+
+

Details

+
+

struct GstMuLawDec

+
struct GstMuLawDec;
+

+

+
+
+
+

struct GstMuLawEnc

+
struct GstMuLawEnc {
+  GstElement element;
+
+  GstPad *sinkpad,*srcpad;
+
+  gint channels;
+  gint rate;
+};
+
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-multifilesink.html b/docs/plugins/html/gst-plugins-good-plugins-multifilesink.html new file mode 100644 index 0000000..7e00d2a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-multifilesink.html @@ -0,0 +1,331 @@ + + + + +multifilesink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

multifilesink

+

multifilesink — Write buffers to a sequentially named set of files

+
+
+

Synopsis

+
struct              GstMultiFileSink;
+enum                GstMultiFileSinkNext;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstMultiFileSink
+
+
+
+

Properties

+
+  "location"                 gchar*                : Read / Write
+  "index"                    gint                  : Read / Write
+  "next-file"                GstMultiFileSinkNext  : Read / Write
+  "post-messages"            gboolean              : Read / Write
+  "max-files"                guint                 : Read / Write
+  "max-file-size"            guint64               : Read / Write
+
+
+
+

Description

+

+Write incoming data to a series of sequentially-named files. +

+

+The filename property should contain a string with a %d placeholder that will +be substituted with the index for each filename. +

+

+If the "post-messages" property is TRUE, it sends an application +message named +"GstMultiFileSink" after writing each +buffer. +

+

+The message's structure contains these fields: +

+
    +
  • + gchar * + "filename": + the filename where the buffer was written. +

  • +
  • + gint + "index": + the index of the buffer. +

  • +
  • + GstClockTime + "timestamp": + the timestamp of the buffer. +

  • +
  • + GstClockTime + "stream-time": + the stream time of the buffer. +

  • +
  • + GstClockTime + "running-time": + the running_time of the buffer. +

  • +
  • + GstClockTime + "duration": + the duration of the buffer. +

  • +
  • + guint64 + "offset": + the offset of the buffer that triggered the message. +

  • +
  • + guint64 + "offset-end": + the offset-end of the buffer that triggered the message. +

  • +
+

+

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
gst-launch audiotestsrc ! multifilesink
+gst-launch videotestsrc ! multifilesink post-messages=true filename="frame%d"
+
+ +
+

+

+

+Last reviewed on 2009-09-11 (0.10.17) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ multifile +

author

David Schleef <ds@schleef.org>

class

Sink/File
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstMultiFileSink

+
struct GstMultiFileSink;
+

+

+
+
+
+

enum GstMultiFileSinkNext

+
typedef enum {
+  GST_MULTI_FILE_SINK_NEXT_BUFFER,
+  GST_MULTI_FILE_SINK_NEXT_DISCONT,
+  GST_MULTI_FILE_SINK_NEXT_KEY_FRAME,
+  GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT,
+  GST_MULTI_FILE_SINK_NEXT_MAX_SIZE
+} GstMultiFileSinkNext;
+
+

+File splitting modes. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

GST_MULTI_FILE_SINK_NEXT_BUFFER

New file for each buffer +

GST_MULTI_FILE_SINK_NEXT_DISCONT

New file after each discontinuity +

GST_MULTI_FILE_SINK_NEXT_KEY_FRAME

New file at each key frame + (Useful for MPEG-TS segmenting) +

GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT

New file after a force key unit + event (Since: 0.10.31) +

GST_MULTI_FILE_SINK_NEXT_MAX_SIZE

New file when the configured maximum file + size would be exceeded with the next buffer or buffer list (Since: 0.10.31) +
+
+
+
+

Property Details

+
+

The "location" property

+
  "location"                 gchar*                : Read / Write
+

Location of the file to write.

+

Default value: NULL

+
+
+
+

The "index" property

+
  "index"                    gint                  : Read / Write
+

Index to use with location property to create file names. The index is incremented by one for each buffer written.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "next-file" property

+
  "next-file"                GstMultiFileSinkNext  : Read / Write
+

+When to start a new file. +

+

Default value: New file for each buffer

+

Since 0.10.17

+
+
+
+

The "post-messages" property

+
  "post-messages"            gboolean              : Read / Write
+

+Post a message on the GstBus for each file. +

+

Default value: FALSE

+

Since 0.10.17

+
+
+
+

The "max-files" property

+
  "max-files"                guint                 : Read / Write
+

+Maximum number of files to keep on disk. Once the maximum is reached, old +files start to be deleted to make room for new ones. +

+

Default value: 0

+

Since 0.10.31

+
+
+
+

The "max-file-size" property

+
  "max-file-size"            guint64               : Read / Write
+

+Maximum file size before starting a new file in max-size mode. +

+

Default value: 2147483648

+

Since 0.10.31

+
+
+
+

See Also

+GstFileSrc +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-multifilesrc.html b/docs/plugins/html/gst-plugins-good-plugins-multifilesrc.html new file mode 100644 index 0000000..a544344 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-multifilesrc.html @@ -0,0 +1,220 @@ + + + + +multifilesrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

multifilesrc

+

multifilesrc — Read a sequentially named set of files into buffers

+
+
+

Synopsis

+
struct              GstMultiFileSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstMultiFileSrc
+
+
+
+

Properties

+
+  "caps"                     GstCaps*              : Read / Write
+  "index"                    gint                  : Read / Write
+  "location"                 gchar*                : Read / Write
+  "loop"                     gboolean              : Read / Write
+  "start-index"              gint                  : Read / Write
+  "stop-index"               gint                  : Read / Write
+
+
+
+

Description

+

+Reads buffers from sequentially named files. If used together with an image +decoder, one needs to use the "caps" property or a capsfilter +to force to caps containing a framerate. Otherwise image decoders send EOS +after the first picture. +

+

+File names are created by replacing "%d" with the index using printf(). +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch multifilesrc location="img.%04d.png" index=0 caps="image/png,framerate=\(fraction\)12/1" ! \
+    pngdec ! ffmpegcolorspace ! theoraenc ! oggmux ! \
+    filesink location="images.ogg"
+
+ This pipeline creates a video file "images.ogg" by joining multiple PNG +files named img.0000.png, img.0001.png, etc. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ multifile +

author

David Schleef <ds@schleef.org>

class

Source/File
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstMultiFileSrc

+
struct GstMultiFileSrc;
+

+

+
+
+
+

Property Details

+
+

The "caps" property

+
  "caps"                     GstCaps*              : Read / Write
+

Caps describing the format of the data.

+
+
+
+

The "index" property

+
  "index"                    gint                  : Read / Write
+

Index to use with location property to create file names. The index is incremented by one for each buffer read.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "location" property

+
  "location"                 gchar*                : Read / Write
+

Pattern to create file names of input files. File names are created by calling sprintf() with the pattern and the current index.

+

Default value: "%05d"

+
+
+
+

The "loop" property

+
  "loop"                     gboolean              : Read / Write
+

Whether to repeat from the beginning when all files have been read.

+

Default value: FALSE

+
+
+
+

The "start-index" property

+
  "start-index"              gint                  : Read / Write
+

Start value of index. The initial value of index can be set either by setting index or start-index. When the end of the loop is reached, the index will be set to the value start-index.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "stop-index" property

+
  "stop-index"               gint                  : Read / Write
+

Stop value of index. The special value -1 means no stop.

+

Allowed values: >= G_MAXULONG

+

Default value: 0

+
+
+
+

See Also

+GstFileSrc +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-multipartdemux.html b/docs/plugins/html/gst-plugins-good-plugins-multipartdemux.html new file mode 100644 index 0000000..390cdc2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-multipartdemux.html @@ -0,0 +1,217 @@ + + + + +multipartdemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

multipartdemux

+

multipartdemux — demux multipart streams

+
+
+

Synopsis

+
struct              GstMultipartDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstMultipartDemux
+
+
+
+

Properties

+
+  "autoscan"                 gboolean              : Read / Write
+  "boundary"                 gchar*                : Read / Write / Construct
+  "single-stream"            gboolean              : Read / Write
+
+
+
+

Description

+

+MultipartDemux uses the Content-type field of incoming buffers to demux and +push data to dynamic source pads. Most of the time multipart streams are +sequential JPEG frames generated from a live source such as a network source +or a camera. +

+

+The output buffers of the multipartdemux typically have no timestamps and are +usually played as fast as possible (at the rate that the source provides the +data). +

+

+the content in multipart files is separated with a boundary string that can +be configured specifically with the "boundary" property +otherwise it will be autodetected. +

+

+

+
+

Sample pipelines

+
+ + + + + + + +
1
gst-launch filesrc location=/tmp/test.multipart ! multipartdemux ! jpegdec ! ffmpegcolorspace ! ximagesink
+
+ a simple pipeline to demux a multipart file muxed with GstMultipartMux +containing JPEG frames. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ multipart +

author

Wim Taymans <wim.taymans@gmail.com>, Sjoerd Simons <sjoerd@luon.net>

class

Codec/Demuxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

multipart/x-mixed-replace
+
++ + + + + + + + + + + + + + + + + + +

name

src_%d

direction

source

presence

sometimes

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstMultipartDemux

+
struct GstMultipartDemux;
+

+The opaque GstMultipartDemux structure. +

+
+
+
+

Property Details

+
+

The "autoscan" property

+
  "autoscan"                 gboolean              : Read / Write
+

Try to autofind the prefix (deprecated unused, see boundary).

+

Default value: FALSE

+
+
+
+

The "boundary" property

+
  "boundary"                 gchar*                : Read / Write / Construct
+

The boundary string separating data, automatic if NULL.

+

Default value: NULL

+
+
+
+

The "single-stream" property

+
  "single-stream"            gboolean              : Read / Write
+

Assume that there is only one stream whose content-type will not change and emit no-more-pads as soon as the first boundary content is parsed, decoded, and pads are linked.

+

Default value: FALSE

+
+
+
+

See Also

+GstMultipartMux +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-multipartmux.html b/docs/plugins/html/gst-plugins-good-plugins-multipartmux.html new file mode 100644 index 0000000..18cfe17 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-multipartmux.html @@ -0,0 +1,186 @@ + + + + +multipartmux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

multipartmux

+

multipartmux — mux multipart streams

+
+
+

Synopsis

+
struct              GstMultipartMux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstMultipartMux
+
+
+
+

Properties

+
+  "boundary"                 gchar*                : Read / Write
+
+
+
+

Description

+

+MultipartMux uses the GstCaps of the sink pad as the Content-type field for +incoming buffers when muxing them to a multipart stream. Most of the time +multipart streams are sequential JPEG frames. +

+

+

+
+

Sample pipelines

+
+ + + + + + + +
1
gst-launch videotestsrc ! video/x-raw-yuv, framerate='(fraction)'5/1 ! jpegenc ! multipartmux ! filesink location=/tmp/test.multipart
+
+ a pipeline to mux 5 JPEG frames per second into a multipart stream +stored to a file. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ multipart +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink_%d

direction

sink

presence

request

details

ANY
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

multipart/x-mixed-replace
+
+
+

+

+
+
+

Details

+
+

struct GstMultipartMux

+
struct GstMultipartMux;
+

+The opaque GstMultipartMux structure. +

+
+
+
+

Property Details

+
+

The "boundary" property

+
  "boundary"                 gchar*                : Read / Write
+

Boundary string.

+

Default value: "ThisRandomString"

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-multiudpsink.html b/docs/plugins/html/gst-plugins-good-plugins-multiudpsink.html new file mode 100644 index 0000000..15784e7 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-multiudpsink.html @@ -0,0 +1,466 @@ + + + + +multiudpsink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

multiudpsink

+

multiudpsink — Send data over the network via UDP

+
+
+

Synopsis

+
struct              GstMultiUDPSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstMultiUDPSink
+                           +----GstUDPSink
+
+
+
+

Properties

+
+  "bytes-served"             guint64               : Read
+  "bytes-to-serve"           guint64               : Read
+  "clients"                  gchar*                : Read / Write
+  "closefd"                  gboolean              : Read / Write
+  "sock"                     gint                  : Read
+  "sockfd"                   gint                  : Read / Write
+  "auto-multicast"           gboolean              : Read / Write
+  "loop"                     gboolean              : Read / Write
+  "qos-dscp"                 gint                  : Read / Write
+  "ttl"                      gint                  : Read / Write
+  "ttl-mc"                   gint                  : Read / Write
+  "send-duplicates"          gboolean              : Read / Write
+  "buffer-size"              gint                  : Read / Write
+
+
+
+

Signals

+
+  "add"                                            : Action
+  "clear"                                          : Action
+  "client-added"                                   : Run Last
+  "client-removed"                                 : Run Last
+  "get-stats"                                      : Action
+  "remove"                                         : Action
+
+
+
+

Description

+

+multiudpsink is a network sink that sends UDP packets to multiple +clients. +It can be combined with rtp payload encoders to implement RTP streaming. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ udp +

author

Wim Taymans <wim.taymans@gmail.com>

class

Sink/Network
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstMultiUDPSink

+
struct GstMultiUDPSink;
+

+

+
+
+
+

Property Details

+
+

The "bytes-served" property

+
  "bytes-served"             guint64               : Read
+

Total number of bytes sent to all clients.

+

Default value: 0

+
+
+
+

The "bytes-to-serve" property

+
  "bytes-to-serve"           guint64               : Read
+

Number of bytes received to serve to clients.

+

Default value: 0

+
+
+
+

The "clients" property

+
  "clients"                  gchar*                : Read / Write
+

A comma separated list of host:port pairs with destinations.

+

Default value: NULL

+
+
+
+

The "closefd" property

+
  "closefd"                  gboolean              : Read / Write
+

Close sockfd if passed as property on state change.

+

Default value: TRUE

+
+
+
+

The "sock" property

+
  "sock"                     gint                  : Read
+

Socket currently in use for UDP sending. (-1 == no socket).

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "sockfd" property

+
  "sockfd"                   gint                  : Read / Write
+

Socket to use for UDP sending. (-1 == allocate).

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "auto-multicast" property

+
  "auto-multicast"           gboolean              : Read / Write
+

Automatically join/leave the multicast groups, FALSE means user has to do it himself.

+

Default value: TRUE

+
+
+
+

The "loop" property

+
  "loop"                     gboolean              : Read / Write
+

Used for setting the multicast loop parameter. TRUE = enable, FALSE = disable.

+

Default value: TRUE

+
+
+
+

The "qos-dscp" property

+
  "qos-dscp"                 gint                  : Read / Write
+

Quality of Service, differentiated services code point (-1 default).

+

Allowed values: [G_MAXULONG,63]

+

Default value: -1

+
+
+
+

The "ttl" property

+
  "ttl"                      gint                  : Read / Write
+

Used for setting the unicast TTL parameter.

+

Allowed values: [0,255]

+

Default value: 64

+
+
+
+

The "ttl-mc" property

+
  "ttl-mc"                   gint                  : Read / Write
+

Used for setting the multicast TTL parameter.

+

Allowed values: [0,255]

+

Default value: 1

+
+
+
+

The "send-duplicates" property

+
  "send-duplicates"          gboolean              : Read / Write
+

When a distination/port pair is added multiple times, send packets multiple times as well.

+

Default value: TRUE

+
+
+
+

The "buffer-size" property

+
  "buffer-size"              gint                  : Read / Write
+

Size of the kernel send buffer in bytes, 0=default.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

Signal Details

+
+

The "add" signal

+
void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
+                                                        gchar           *host,
+                                                        gint             port,
+                                                        gpointer         user_data)            : Action
+

+Add a client with destination host and port to the list of +clients. When the same host/port pair is added multiple times, the +send-duplicates property defines if the packets are sent multiple times to +the same host/port pair or not. +

+

+When a host/port pair is added multiple times, an equal amount of remove +calls must be performed to actually remove the host/port pair from the list +of destinations. +

+
++ + + + + + + + + + + + + + + + + + +

gstmultiudpsink :

the sink on which the signal is emitted

host :

the hostname/IP address of the client to add

port :

the port of the client to add

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "clear" signal

+
void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
+                                                        gpointer         user_data)            : Action
+

+Clear the list of clients. +

+
++ + + + + + + + + + +

gstmultiudpsink :

the sink on which the signal is emitted

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "client-added" signal

+
void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
+                                                        gchar           *host,
+                                                        gint             port,
+                                                        gpointer         user_data)            : Run Last
+

+Signal emited when a new client is added to the list of +clients. +

+
++ + + + + + + + + + + + + + + + + + +

gstmultiudpsink :

the sink emitting the signal

host :

the hostname/IP address of the added client

port :

the port of the added client

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "client-removed" signal

+
void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
+                                                        gchar           *host,
+                                                        gint             port,
+                                                        gpointer         user_data)            : Run Last
+

+Signal emited when a client is removed from the list of +clients. +

+
++ + + + + + + + + + + + + + + + + + +

gstmultiudpsink :

the sink emitting the signal

host :

the hostname/IP address of the removed client

port :

the port of the removed client

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "get-stats" signal

+
GValueArray*        user_function                      (GstMultiUDPSink *gstmultiudpsink,
+                                                        gchar           *host,
+                                                        gint             port,
+                                                        gpointer         user_data)            : Action
+

+Get the statistics of the client with destination host and port. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

gstmultiudpsink :

the sink on which the signal is emitted

host :

the hostname/IP address of the client to get stats on

port :

the port of the client to get stats on

user_data :

user data set when the signal handler was connected.

Returns :

a GValueArray of uint64: bytes_sent, packets_sent, +connect_time (in epoch seconds), disconnect_time (in epoch seconds)
+
+
+
+

The "remove" signal

+
void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
+                                                        gchar           *host,
+                                                        gint             port,
+                                                        gpointer         user_data)            : Action
+

+Remove the client with destination host and port from the list of +clients. +

+
++ + + + + + + + + + + + + + + + + + +

gstmultiudpsink :

the sink on which the signal is emitted

host :

the hostname/IP address of the client to remove

port :

the port of the client to remove

user_data :

user data set when the signal handler was connected.
+
+
+
+

See Also

+udpsink, multifdsink +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-optv.html b/docs/plugins/html/gst-plugins-good-plugins-optv.html new file mode 100644 index 0000000..288f740 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-optv.html @@ -0,0 +1,211 @@ + + + + +optv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

optv

+

optv — Optical art meets real-time video effect

+
+
+

Synopsis

+
struct              GstOpTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstOpTV
+
+
+
+

Properties

+
+  "mode"                     GstOpTVMode           : Read / Write
+  "speed"                    gint                  : Read / Write
+  "threshold"                guint                 : Read / Write
+
+
+
+

Description

+

+Traditional black-white optical animation is now resurrected as a +real-time video effect. Input images are binarized and combined with +various optical pattern. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! optv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of optv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstOpTV

+
struct GstOpTV;
+

+

+
+
+
+

Property Details

+
+

The "mode" property

+
  "mode"                     GstOpTVMode           : Read / Write
+

Mode.

+

Default value: Maelstrom

+
+
+
+

The "speed" property

+
  "speed"                    gint                  : Read / Write
+

Effect speed.

+

Default value: 16

+
+
+
+

The "threshold" property

+
  "threshold"                guint                 : Read / Write
+

Luma threshold.

+

Allowed values: <= G_MAXINT

+

Default value: 60

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-oss4mixer.html b/docs/plugins/html/gst-plugins-good-plugins-oss4mixer.html new file mode 100644 index 0000000..5231619 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-oss4mixer.html @@ -0,0 +1,135 @@ + + + + +oss4mixer + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

oss4mixer

+

oss4mixer — Control sound input and output levels with OSS4

+
+
+

Synopsis

+
struct              GstOss4Mixer;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstOss4Mixer
+
+
+
+

Implemented Interfaces

+

+GstOss4Mixer implements + GstImplementsInterface, GstMixer and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "device-name"              gchar*                : Read
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ oss4 +

author

Tim-Philipp Müller <tim centricular net>

class

Generic/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstOss4Mixer

+
struct GstOss4Mixer;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

OSS mixer device (e.g. /dev/oss/hdaudio0/mix0 or /dev/mixerN) (NULL = use first mixer device found).

+

Default value: NULL

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Human-readable name of the sound device.

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-oss4sink.html b/docs/plugins/html/gst-plugins-good-plugins-oss4sink.html new file mode 100644 index 0000000..2d0a4e8 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-oss4sink.html @@ -0,0 +1,200 @@ + + + + +oss4sink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

oss4sink

+

oss4sink — Output to a sound card via OSS version 4

+
+
+

Synopsis

+
struct              GstOss4Sink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstBaseAudioSink
+                           +----GstAudioSink
+                                 +----GstOss4Sink
+
+
+
+

Implemented Interfaces

+

+GstOss4Sink implements + GstStreamVolume and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "device-name"              gchar*                : Read
+  "mute"                     gboolean              : Read / Write
+  "volume"                   gdouble               : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ oss4 +

author

Tim-Philipp Müller <tim centricular net>

class

Sink/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-alaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-mulaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)32, depth=(int){ 32, 24 }, signed=(boolean)true, endianness=(int)4321, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int){ 32, 24 }, depth=(int)24, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]
+
+
+

+

+
+
+

Details

+
+

struct GstOss4Sink

+
struct GstOss4Sink;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) (NULL = use first available playback device).

+

Default value: NULL

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Human-readable name of the sound device.

+

Default value: NULL

+
+
+
+

The "mute" property

+
  "mute"                     gboolean              : Read / Write
+

Mute state of this stream.

+

Default value: FALSE

+
+
+
+

The "volume" property

+
  "volume"                   gdouble               : Read / Write
+

Linear volume of this stream, 1.0=100%.

+

Allowed values: [0,10]

+

Default value: 1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-oss4src.html b/docs/plugins/html/gst-plugins-good-plugins-oss4src.html new file mode 100644 index 0000000..c6d23ef --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-oss4src.html @@ -0,0 +1,184 @@ + + + + +oss4src + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

oss4src

+

oss4src — Capture from a sound card via OSS version 4

+
+
+

Synopsis

+
struct              GstOss4Source;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstBaseAudioSrc
+                                 +----GstAudioSrc
+                                       +----GstOss4Source
+
+
+
+

Implemented Interfaces

+

+GstOss4Source implements + GstImplementsInterface, GstMixer and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "device-name"              gchar*                : Read
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ oss4 +

author

Tim-Philipp Müller <tim centricular net>

class

Source/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-alaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-mulaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)32, depth=(int){ 32, 24 }, signed=(boolean)true, endianness=(int)4321, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int){ 32, 24 }, depth=(int)24, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]
+
+
+

+

+
+
+

Details

+
+

struct GstOss4Source

+
struct GstOss4Source;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) (NULL = use first available device).

+

Default value: NULL

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Human-readable name of the sound device.

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-ossmixer.html b/docs/plugins/html/gst-plugins-good-plugins-ossmixer.html new file mode 100644 index 0000000..4968ce2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-ossmixer.html @@ -0,0 +1,135 @@ + + + + +ossmixer + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

ossmixer

+

ossmixer — Control sound input and output levels with OSS

+
+
+

Synopsis

+
struct              GstOssMixerElement;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstOssMixerElement
+
+
+
+

Implemented Interfaces

+

+GstOssMixerElement implements + GstImplementsInterface and GstMixer.

+
+
+

Properties

+
+  "device-name"              gchar*                : Read
+  "device"                   gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ ossaudio +

author

Andrew Vander Wingo <wingo@pobox.com>

class

Generic/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstOssMixerElement

+
struct GstOssMixerElement;
+

+

+
+
+
+

Property Details

+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Human-readable name of the sound device.

+

Default value: NULL

+
+
+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

OSS mixer device (usually /dev/mixer).

+

Default value: "/dev/mixer"

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-osssink.html b/docs/plugins/html/gst-plugins-good-plugins-osssink.html new file mode 100644 index 0000000..654b737 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-osssink.html @@ -0,0 +1,147 @@ + + + + +osssink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

osssink

+

osssink — Output to a sound card via OSS

+
+
+

Synopsis

+
struct              GstOssSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstBaseAudioSink
+                           +----GstAudioSink
+                                 +----GstOssSink
+
+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ ossaudio +

author

Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be>

class

Sink/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int){ 1234 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
+
+
+

+

+
+
+

Details

+
+

struct GstOssSink

+
struct GstOssSink;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

OSS device (usually /dev/dspN).

+

Default value: "/dev/dsp"

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-osssrc.html b/docs/plugins/html/gst-plugins-good-plugins-osssrc.html new file mode 100644 index 0000000..e61b3a6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-osssrc.html @@ -0,0 +1,164 @@ + + + + +osssrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

osssrc

+

osssrc — Capture from a sound card via OSS

+
+
+

Synopsis

+
struct              GstOssSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstBaseAudioSrc
+                                 +----GstAudioSrc
+                                       +----GstOssSrc
+
+
+
+

Implemented Interfaces

+

+GstOssSrc implements + GstImplementsInterface and GstMixer.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "device-name"              gchar*                : Read
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ ossaudio +

author

Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com>

class

Source/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, endianness=(int){ 1234 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
+
+
+

+

+
+
+

Details

+
+

struct GstOssSrc

+
struct GstOssSrc;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

OSS device (usually /dev/dspN).

+

Default value: "/dev/dsp"

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Human-readable name of the sound device.

+

Default value: ""

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-osxaudiosink.html b/docs/plugins/html/gst-plugins-good-plugins-osxaudiosink.html new file mode 100644 index 0000000..610c686 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-osxaudiosink.html @@ -0,0 +1,116 @@ + + + + +osxaudiosink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

osxaudiosink

+

osxaudiosink — Output to a sound card in OS X

+
+
+

Synopsis

+
struct              GstOsxAudioSink;
+
+
+
+

Properties

+
+  "device"                   gint                  : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ osxaudio +

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Sink/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstOsxAudioSink

+
struct GstOsxAudioSink {
+  GstBaseAudioSink sink;
+
+  AudioDeviceID device_id;
+  AudioUnit audiounit;
+  double volume;
+};
+
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gint                  : Read / Write
+

Device ID of output device.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-osxaudiosrc.html b/docs/plugins/html/gst-plugins-good-plugins-osxaudiosrc.html new file mode 100644 index 0000000..589752f --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-osxaudiosrc.html @@ -0,0 +1,117 @@ + + + + +osxaudiosrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

osxaudiosrc

+

osxaudiosrc — Input from a sound card in OS X

+
+
+

Synopsis

+
struct              GstOsxAudioSrc;
+
+
+
+

Properties

+
+  "device"                   gint                  : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ osxaudio +

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Source/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstOsxAudioSrc

+
struct GstOsxAudioSrc {
+  GstBaseAudioSrc src;
+
+  AudioDeviceID device_id;
+
+  /* actual number of channels reported by input device */
+  int deviceChannels;
+};
+
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gint                  : Read / Write
+

Device ID of input device.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-osxvideosink.html b/docs/plugins/html/gst-plugins-good-plugins-osxvideosink.html new file mode 100644 index 0000000..2ad0b06 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-osxvideosink.html @@ -0,0 +1,122 @@ + + + + +osxvideosink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

osxvideosink

+

osxvideosink — OSX native videosink

+
+
+

Synopsis

+
struct              GstOSXVideoSink;
+
+
+
+

Properties

+
+  "embed"                    gboolean              : Read / Write
+  "fullscreen"               gboolean              : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ osxvideo +

author

Zaheer Abbas Merali <zaheerabas at merali dot org>

class

Sink/Video
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstOSXVideoSink

+
struct GstOSXVideoSink {
+  /* Our element stuff */
+  GstVideoSink videosink;
+  GstOSXWindow *osxwindow;
+  NSView *superview;
+};
+
+

+

+
+
+
+

Property Details

+
+

The "embed" property

+
  "embed"                    gboolean              : Read / Write
+

When enabled, it can be embedded.

+

Default value: FALSE

+
+
+
+

The "fullscreen" property

+
  "fullscreen"               gboolean              : Read / Write
+

When enabled, the view is fullscreen.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html new file mode 100644 index 0000000..b34d0d2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html @@ -0,0 +1,80 @@ + + + + +1394 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

1394

+

1394 — Source for video data via IEEE1394 interface

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgst1394.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

dv1394src

Source for DV video data from firewire port

hdv1394src

Source for MPEG-TS video data from firewire port
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html new file mode 100644 index 0000000..56adae7 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html @@ -0,0 +1,74 @@ + + + + +aasink + + + + + + + + + + + + + + + + +
+
+
+ + +
+

aasink

+

aasink — ASCII Art video sink

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstaasink.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

aasink

An ASCII art videosink
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html new file mode 100644 index 0000000..4faaf4a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html @@ -0,0 +1,80 @@ + + + + +alaw + + + + + + + + + + + + + + + + +
+
+
+ + +
+

alaw

+

alaw — ALaw audio conversion routines

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstalaw.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

alawdec

Convert 8bit A law to 16bit PCM

alawenc

Convert 16bit PCM to 8bit A law
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html new file mode 100644 index 0000000..79daccb --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html @@ -0,0 +1,74 @@ + + + + +alpha + + + + + + + + + + + + + + + + +
+
+
+ + +
+

alpha

+

alpha — adds an alpha channel to video - constant or via chroma-keying

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstalpha.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

alpha

Adds an alpha channel to video - uniform or via chroma-keying
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html new file mode 100644 index 0000000..d557204 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html @@ -0,0 +1,74 @@ + + + + +alphacolor + + + + + + + + + + + + + + + + +
+
+
+ + +
+

alphacolor

+

alphacolor — RGBA from/to AYUV colorspace conversion preserving the alpha channel

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstalphacolor.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

alphacolor

ARGB from/to AYUV colorspace conversion preserving the alpha channel
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-annodex.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-annodex.html new file mode 100644 index 0000000..dab88b6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-annodex.html @@ -0,0 +1,80 @@ + + + + +annodex + + + + + + + + + + + + + + + + +
+
+
+ + +
+

annodex

+

annodex — annodex stream manipulation (info about annodex: http://www.annodex.net)

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstannodex.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

cmmldec

Decodes CMML streams

cmmlenc

Encodes CMML streams
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html new file mode 100644 index 0000000..3eb5e54 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html @@ -0,0 +1,74 @@ + + + + +apetag + + + + + + + + + + + + + + + + +
+
+
+ + +
+

apetag

+

apetag — APEv1/2 tag reader

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstapetag.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

apedemux

Read and output APE tags while demuxing the contents
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html new file mode 100644 index 0000000..1c0b144 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html @@ -0,0 +1,120 @@ + + + + +audiofx + + + + + + + + + + + + + + + + +
+
+
+ + +
+

audiofx

+

audiofx — Audio effects plugin

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstaudiofx.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

audioamplify

Amplifies an audio stream by a given factor

audiochebband

Chebyshev band pass and band reject filter

audiocheblimit

Chebyshev low pass and high pass filter

audiodynamic

Compressor and Expander

audioecho

Adds an echo or reverb effect to an audio stream

audiofirfilter

Generic audio FIR filter with custom filter kernel

audioiirfilter

Generic audio IIR filter with custom filter kernel

audioinvert

Swaps upper and lower half of audio samples

audiokaraoke

Removes voice from sound

audiopanorama

Positions audio streams in the stereo panorama

audiowsincband

Band pass and band reject windowed sinc filter

audiowsinclimit

Low pass and high pass windowed sinc filter
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html new file mode 100644 index 0000000..c037824 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html @@ -0,0 +1,74 @@ + + + + +auparse + + + + + + + + + + + + + + + + +
+
+
+ + +
+

auparse

+

auparse — parses au streams

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstauparse.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

auparse

Parse an .au file into raw audio
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html new file mode 100644 index 0000000..7e20a2e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html @@ -0,0 +1,88 @@ + + + + +autodetect + + + + + + + + + + + + + + + + +
+
+
+ + +
+

autodetect

+

autodetect — Plugin contains auto-detection plugins for video/audio in- and outputs

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstautodetect.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + +

autoaudiosink

Wrapper audio sink for automatically detected audio sink

autoaudiosrc

Wrapper audio source for automatically detected audio source

autovideosink

Wrapper video sink for automatically detected video sink

autovideosrc

Wrapper video source for automatically detected video source
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html new file mode 100644 index 0000000..7741221 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html @@ -0,0 +1,84 @@ + + + + +avi + + + + + + + + + + + + + + + + +
+
+
+ + +
+

avi

+

avi — AVI stream handling

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstavi.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

avidemux

Demultiplex an avi file into audio and video

avimux

Muxes audio and video into an avi stream

avisubtitle

Parse avi subtitle stream
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html new file mode 100644 index 0000000..56054cb --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html @@ -0,0 +1,74 @@ + + + + +cacasink + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cacasink

+

cacasink — Colored ASCII Art video sink

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstcacasink.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

cacasink

A colored ASCII art videosink
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html new file mode 100644 index 0000000..1e8ef9b --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html @@ -0,0 +1,88 @@ + + + + +cairo + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo

+

cairo — Cairo-based elements

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstcairo.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + +

cairooverlay

Render overlay on a video stream using Cairo

cairorender

Encodes streams using Cairo

cairotextoverlay

Adds text strings on top of a video buffer

cairotimeoverlay

Overlays the time on a video stream
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html new file mode 100644 index 0000000..db1fa59 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html @@ -0,0 +1,74 @@ + + + + +cutter + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cutter

+

cutter — Audio Cutter to split audio into non-silent bits

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstcutter.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

cutter

Audio Cutter to split audio into non-silent bits
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html new file mode 100644 index 0000000..3213efe --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html @@ -0,0 +1,112 @@ + + + + +debug + + + + + + + + + + + + + + + + +
+
+
+ + +
+

debug

+

debug — elements for testing and debugging

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstdebug.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

breakmydata

randomly change data in the stream

capsdebug

Debug caps negotiation

capssetter

Set/merge caps on stream

cpureport

Post cpu usage information every buffer

navseek

Seek based on navigation keys left-right

progressreport

Periodically query and report on processing progress

pushfilesrc

Implements pushfile:// URI-handler for push-based file access

rndbuffersize

pull random sized buffers

taginject

inject metadata tags

testsink

perform a number of tests
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html new file mode 100644 index 0000000..fa6f9a1 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html @@ -0,0 +1,74 @@ + + + + +deinterlace + + + + + + + + + + + + + + + + +
+
+
+ + +
+

deinterlace

+

deinterlace — Deinterlacer

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstdeinterlace.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

deinterlace

Deinterlace Methods ported from DScaler/TvTime
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-directsound.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-directsound.html new file mode 100644 index 0000000..b0ca470 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-directsound.html @@ -0,0 +1,74 @@ + + + + +directsound + + + + + + + + + + + + + + + + +
+
+
+ + +
+

directsound

+

directsound — DirectSound plugin

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstdirectsound.dll

version

0.10.4.1

run-time license

LGPL

package

GStreamer Good Plug-ins CVS

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

directsoundsink

DirectSound audio sink
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html new file mode 100644 index 0000000..0b691b2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html @@ -0,0 +1,80 @@ + + + + +dv + + + + + + + + + + + + + + + + +
+
+
+ + +
+

dv

+

dv — DV demuxer and decoder based on libdv (libdv.sf.net)

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstdv.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

dvdec

Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net)

dvdemux

Uses libdv to separate DV audio from DV video (libdv.sourceforge.net)
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-efence.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-efence.html new file mode 100644 index 0000000..75e79cc --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-efence.html @@ -0,0 +1,74 @@ + + + + +efence + + + + + + + + + + + + + + + + +
+
+
+ + +
+

efence

+

efence — This element converts a stream of normal GStreamer buffers into a stream of buffers that are allocated in such a way that out-of-bounds access to data in the buffer is more likely to cause segmentation faults. This allocation method is very similar to the debugging tool "Electric Fence".

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstefence.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

efence

This element converts a stream of normal GStreamer buffers into a stream of buffers that are allocated in such a way that out-of-bounds access to data in the buffer is more likely to cause segmentation faults. This allocation method is very similar to the debugging tool "Electric Fence".
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html new file mode 100644 index 0000000..4eaa4ce --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html @@ -0,0 +1,120 @@ + + + + +effectv + + + + + + + + + + + + + + + + +
+
+
+ + +
+

effectv

+

effectv — effect plugins from the effectv project

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgsteffectv.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

agingtv

AgingTV adds age to video input using scratches and dust

dicetv

'Dices' the screen up into many small squares

edgetv

Apply edge detect on video

optv

Optical art meets real-time video effect

quarktv

Motion dissolver

radioactv

motion-enlightment effect

revtv

A video waveform monitor for each line of video processed

rippletv

RippleTV does ripple mark effect on the video input

shagadelictv

Oh behave, ShagedelicTV makes images shagadelic!

streaktv

StreakTV makes after images of moving objects

vertigotv

A loopback alpha blending effector with rotating and scaling

warptv

WarpTV does realtime goo'ing of the video input
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html new file mode 100644 index 0000000..f8aaaa2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html @@ -0,0 +1,84 @@ + + + + +equalizer + + + + + + + + + + + + + + + + +
+
+
+ + +
+

equalizer

+

equalizer — GStreamer audio equalizers

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstequalizer.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

equalizer-10bands

Direct Form 10 band IIR equalizer

equalizer-3bands

Direct Form 3 band IIR equalizer

equalizer-nbands

Direct Form IIR equalizer
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-esdsink.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-esdsink.html new file mode 100644 index 0000000..1b0e8db --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-esdsink.html @@ -0,0 +1,74 @@ + + + + +esdsink + + + + + + + + + + + + + + + + +
+
+
+ + +
+

esdsink

+

esdsink — ESD Element Plugins

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstesd.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

esdsink

Plays audio to an esound server
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html new file mode 100644 index 0000000..d56736f --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html @@ -0,0 +1,84 @@ + + + + +flac + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flac

+

flac — The FLAC Lossless compressor Codec

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstflac.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

flacdec

Decodes FLAC lossless audio streams

flacenc

Encodes audio with the FLAC lossless audio encoder

flactag

Rewrite tags in a FLAC file
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html new file mode 100644 index 0000000..b8dd007 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html @@ -0,0 +1,80 @@ + + + + +flv + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flv

+

flv — FLV muxing and demuxing plugin

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstflv.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

flvdemux

Demux FLV feeds into digital streams

flvmux

Muxes video/audio streams into a FLV stream
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html new file mode 100644 index 0000000..6ed6b58 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html @@ -0,0 +1,74 @@ + + + + +flxdec + + + + + + + + + + + + + + + + +
+
+
+ + +
+

flxdec

+

flxdec — FLC/FLI/FLX video decoder

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstflxdec.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

flxdec

FLC/FLI/FLX video decoder
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-gconfelements.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-gconfelements.html new file mode 100644 index 0000000..31180b0 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-gconfelements.html @@ -0,0 +1,88 @@ + + + + +gconfelements + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gconfelements

+

gconfelements — elements wrapping the GStreamer/GConf audio/video output settings

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstgconfelements.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + +

gconfaudiosink

Audio sink embedding the GConf-settings for audio output

gconfaudiosrc

Audio source embedding the GConf-settings for audio input

gconfvideosink

Video sink embedding the GConf-settings for video output

gconfvideosrc

Video source embedding the GConf-settings for video input
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html new file mode 100644 index 0000000..13fe2fa --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html @@ -0,0 +1,84 @@ + + + + +gdkpixbuf + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gdkpixbuf

+

gdkpixbuf — GdkPixbuf-based image decoder, scaler and sink

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstgdkpixbuf.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

gdkpixbufdec

Decodes images in a video stream using GdkPixbuf

gdkpixbufscale

Resizes video

gdkpixbufsink

Output images as GdkPixbuf objects in bus messages
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html new file mode 100644 index 0000000..adb3c54 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html @@ -0,0 +1,74 @@ + + + + +goom + + + + + + + + + + + + + + + + +
+
+
+ + +
+

goom

+

goom — GOOM visualization filter

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstgoom.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

goom

Takes frames of data and outputs video frames using the GOOM filter
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html new file mode 100644 index 0000000..26d3b8d --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html @@ -0,0 +1,74 @@ + + + + +goom2k1 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

goom2k1

+

goom2k1 — GOOM 2k1 visualization filter

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstgoom2k1.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

goom2k1

Takes frames of data and outputs video frames using the GOOM 2k1 filter
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-gstrtpmanager.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-gstrtpmanager.html new file mode 100644 index 0000000..a72e37e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-gstrtpmanager.html @@ -0,0 +1,92 @@ + + + + +gstrtpmanager + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gstrtpmanager

+

gstrtpmanager — RTP session management plugin library

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstrtpmanager.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + + + + + +

gstrtpbin

Real-Time Transport Protocol bin

gstrtpjitterbuffer

A buffer that deals with network jitter and other transmission faults

gstrtpptdemux

Parses codec streams transmitted in the same RTP session

gstrtpsession

Implement an RTP session

gstrtpssrcdemux

Splits RTP streams based on the SSRC
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-halelements.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-halelements.html new file mode 100644 index 0000000..badda34 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-halelements.html @@ -0,0 +1,80 @@ + + + + +halelements + + + + + + + + + + + + + + + + +
+
+
+ + +
+

halelements

+

halelements — elements wrapping the GStreamer/HAL audio input/output devices

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgsthalelements.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

halaudiosink

Audio sink for sound device access via HAL

halaudiosrc

Audio source for sound device access via HAL
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html new file mode 100644 index 0000000..90342bb --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html @@ -0,0 +1,74 @@ + + + + +icydemux + + + + + + + + + + + + + + + + +
+
+
+ + +
+

icydemux

+

icydemux — Demux ICY tags from a stream

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgsticydemux.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

icydemux

Read and output ICY tags while demuxing the contents
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html new file mode 100644 index 0000000..eb8afcd --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html @@ -0,0 +1,74 @@ + + + + +id3demux + + + + + + + + + + + + + + + + +
+
+
+ + +
+

id3demux

+

id3demux — Demux ID3v1 and ID3v2 tags from a file

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstid3demux.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

id3demux

Read and output ID3v1 and ID3v2 tags while demuxing the contents
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html new file mode 100644 index 0000000..6113f9d --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html @@ -0,0 +1,74 @@ + + + + +imagefreeze + + + + + + + + + + + + + + + + +
+
+
+ + +
+

imagefreeze

+

imagefreeze — Still frame stream generator

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstimagefreeze.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

imagefreeze

Generates a still frame stream from an image
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html new file mode 100644 index 0000000..8caca84 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html @@ -0,0 +1,80 @@ + + + + +interleave + + + + + + + + + + + + + + + + +
+
+
+ + +
+

interleave

+

interleave — Audio interleaver/deinterleaver

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstinterleave.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

deinterleave

Splits one interleaved multichannel audio stream into many mono audio streams

interleave

Folds many mono channels into one interleaved audio stream
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html new file mode 100644 index 0000000..a395966 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html @@ -0,0 +1,108 @@ + + + + +isomp4 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

isomp4

+

isomp4 — ISO base media file format support (mp4, 3gpp, qt, mj2)

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstisomp4.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

3gppmux

Multiplex audio and video into a 3GPP file

gppmux

Multiplex audio and video into a 3GPP file (deprecated)

ismlmux

Multiplex audio and video into a ISML file

mj2mux

Multiplex audio and video into a MJ2 file

mp4mux

Multiplex audio and video into a MP4 file

qtdemux

Demultiplex a QuickTime file into audio and video streams

qtmoovrecover

Recovers unfinished qtmux files

qtmux

Multiplex audio and video into a QuickTime file

rtpxqtdepay

Extracts Quicktime audio/video from RTP packets
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html new file mode 100644 index 0000000..800e8f6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html @@ -0,0 +1,80 @@ + + + + +jack + + + + + + + + + + + + + + + + +
+
+
+ + +
+

jack

+

jack — JACK audio elements

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstjack.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

jackaudiosink

Output audio to a JACK server

jackaudiosrc

Captures audio from a JACK server
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html new file mode 100644 index 0000000..7415ff2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html @@ -0,0 +1,88 @@ + + + + +jpeg + + + + + + + + + + + + + + + + +
+
+
+ + +
+

jpeg

+

jpeg — JPeg plugin library

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstjpeg.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + +

jpegdec

Decode images from JPEG format

jpegenc

Encode images in JPEG format

smokedec

Decode video from Smoke format

smokeenc

Encode images into the Smoke format
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-level.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-level.html new file mode 100644 index 0000000..a1c7aa2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-level.html @@ -0,0 +1,74 @@ + + + + +level + + + + + + + + + + + + + + + + +
+
+
+ + +
+

level

+

level — Audio level plugin

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstlevel.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

level

RMS/Peak/Decaying Peak Level messager for audio/raw
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html new file mode 100644 index 0000000..275c762 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html @@ -0,0 +1,88 @@ + + + + +matroska + + + + + + + + + + + + + + + + +
+
+
+ + +
+

matroska

+

matroska — Matroska and WebM stream handling

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstmatroska.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + +

matroskademux

Demuxes Matroska/WebM streams into video/audio/subtitles

matroskamux

Muxes video/audio/subtitle streams into a matroska stream

matroskaparse

Parses Matroska/WebM streams into video/audio/subtitles

webmmux

Muxes video and audio streams into a WebM stream
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-monoscope.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-monoscope.html new file mode 100644 index 0000000..9946a4f --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-monoscope.html @@ -0,0 +1,74 @@ + + + + +monoscope + + + + + + + + + + + + + + + + +
+
+
+ + +
+

monoscope

+

monoscope — Monoscope visualization

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstmonoscope.so

version

0.10.30.1

run-time license

LGPL

package

GStreamer Good Plug-ins git

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

monoscope

Displays a highly stabilised waveform of audio input
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html new file mode 100644 index 0000000..d69f19f --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html @@ -0,0 +1,80 @@ + + + + +mulaw + + + + + + + + + + + + + + + + +
+
+
+ + +
+

mulaw

+

mulaw — MuLaw audio conversion routines

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstmulaw.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

mulawdec

Convert 8bit mu law to 16bit PCM

mulawenc

Convert 16bit PCM to 8bit mu law
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html new file mode 100644 index 0000000..6a9c8d6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html @@ -0,0 +1,84 @@ + + + + +multifile + + + + + + + + + + + + + + + + +
+
+
+ + +
+

multifile

+

multifile — Reads/Writes buffers from/to sequentially named files

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstmultifile.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

multifilesink

Write buffers to a sequentially named set of files

multifilesrc

Read a sequentially named set of files into buffers

splitfilesrc

Read a sequentially named set of files as if it was one large file
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html new file mode 100644 index 0000000..00e881a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html @@ -0,0 +1,80 @@ + + + + +multipart + + + + + + + + + + + + + + + + +
+
+
+ + +
+

multipart

+

multipart — multipart stream manipulation

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstmultipart.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

multipartdemux

demux multipart streams

multipartmux

mux multipart streams
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html new file mode 100644 index 0000000..2e57d21 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html @@ -0,0 +1,74 @@ + + + + +navigationtest + + + + + + + + + + + + + + + + +
+
+
+ + +
+

navigationtest

+

navigationtest — Template for a video filter

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstnavigationtest.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

navigationtest

Handle navigation events showing a black square following mouse pointer
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html new file mode 100644 index 0000000..a0aae66 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html @@ -0,0 +1,84 @@ + + + + +oss4 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

oss4

+

oss4 — Open Sound System (OSS) version 4 support for GStreamer

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstoss4audio.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

oss4mixer

Control sound input and output levels with OSS4

oss4sink

Output to a sound card via OSS version 4

oss4src

Capture from a sound card via OSS version 4
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html new file mode 100644 index 0000000..e83ca3d --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html @@ -0,0 +1,84 @@ + + + + +ossaudio + + + + + + + + + + + + + + + + +
+
+
+ + +
+

ossaudio

+

ossaudio — OSS (Open Sound System) support for GStreamer

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstossaudio.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

ossmixer

Control sound input and output levels with OSS

osssink

Output to a sound card via OSS

osssrc

Capture from a sound card via OSS
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-osxaudio.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-osxaudio.html new file mode 100644 index 0000000..a35b166 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-osxaudio.html @@ -0,0 +1,80 @@ + + + + +osxaudio + + + + + + + + + + + + + + + + +
+
+
+ + +
+

osxaudio

+

osxaudio — OSX (Mac OS X) audio support for GStreamer

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstosxaudio.so

version

0.10.5.1

run-time license

LGPL

package

GStreamer Good Plug-ins CVS/prerelease

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

osxaudiosink

Output to a sound card in OS X

osxaudiosrc

Input from a sound card in OS X
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-osxvideo.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-osxvideo.html new file mode 100644 index 0000000..0d7b297 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-osxvideo.html @@ -0,0 +1,74 @@ + + + + +osxvideo + + + + + + + + + + + + + + + + +
+
+
+ + +
+

osxvideo

+

osxvideo — OSX native video output plugin

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstosxvideo.so

version

0.10.4

run-time license

LGPL

package

Gstreamer

origin

http://gstreamer.freedesktop.org
+
+
+

Elements

+
++ + + + +

osxvideosink

OSX native videosink
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-png.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-png.html new file mode 100644 index 0000000..7e104c5 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-png.html @@ -0,0 +1,80 @@ + + + + +png + + + + + + + + + + + + + + + + +
+
+
+ + +
+

png

+

png — PNG plugin library

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstpng.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

pngdec

Decode a png video frame to a raw image

pngenc

Encode a video frame to a .png image
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html new file mode 100644 index 0000000..7f04c68 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html @@ -0,0 +1,88 @@ + + + + +pulseaudio + + + + + + + + + + + + + + + + +
+
+
+ + +
+

pulseaudio

+

pulseaudio — PulseAudio plugin library

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstpulse.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + +

pulseaudiosink

Correctly handles sink changes when streaming compressed formats to pulsesink

pulsemixer

Control sound input and output levels for PulseAudio

pulsesink

Plays audio to a PulseAudio server

pulsesrc

Captures audio from a PulseAudio server
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html new file mode 100644 index 0000000..1c356f6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html @@ -0,0 +1,84 @@ + + + + +replaygain + + + + + + + + + + + + + + + + +
+
+
+ + +
+

replaygain

+

replaygain — ReplayGain volume normalization

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstreplaygain.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

rganalysis

Perform the ReplayGain analysis

rglimiter

Apply signal compression to raw audio data

rgvolume

Apply ReplayGain volume adjustment
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html new file mode 100644 index 0000000..0ffbf6d --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html @@ -0,0 +1,348 @@ + + + + +rtp + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rtp

+

rtp — Real-time protocol plugins

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstrtp.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

asteriskh263

Extracts H263 video from RTP and encodes in Asterisk H263 format

rtpL16depay

Extracts raw audio from RTP packets

rtpL16pay

Payload-encode Raw audio into RTP packets (RFC 3551)

rtpac3depay

Extracts AC3 audio from RTP packets (RFC 4184)

rtpac3pay

Payload AC3 audio as RTP packets (RFC 4184)

rtpamrdepay

Extracts AMR or AMR-WB audio from RTP packets (RFC 3267)

rtpamrpay

Payload-encode AMR or AMR-WB audio into RTP packets (RFC 3267)

rtpbvdepay

Extracts BroadcomVoice audio from RTP packets (RFC 4298)

rtpbvpay

Packetize BroadcomVoice audio streams into RTP packets (RFC 4298)

rtpceltdepay

Extracts CELT audio from RTP packets

rtpceltpay

Payload-encodes CELT audio into a RTP packet

rtpdepay

Accepts raw RTP and RTCP packets and sends them forward

rtpdvdepay

Depayloads DV from RTP packets (RFC 3189)

rtpdvpay

Payloads DV into RTP packets (RFC 3189)

rtpg722depay

Extracts G722 audio from RTP packets

rtpg722pay

Payload-encode Raw audio into RTP packets (RFC 3551)

rtpg723depay

Extracts G.723 audio from RTP packets (RFC 3551)

rtpg723pay

Packetize G.723 audio into RTP packets

rtpg726depay

Extracts G.726 audio from RTP packets

rtpg726pay

Payload-encodes G.726 audio into a RTP packet

rtpg729depay

Extracts G.729 audio from RTP packets (RFC 3551)

rtpg729pay

Packetize G.729 audio into RTP packets

rtpgsmdepay

Extracts GSM audio from RTP packets

rtpgsmpay

Payload-encodes GSM audio into a RTP packet

rtpgstdepay

Extracts GStreamer buffers from RTP packets

rtpgstpay

Payload GStreamer buffers as RTP packets

rtph263depay

Extracts H263 video from RTP packets (RFC 2190)

rtph263pay

Payload-encodes H263 video in RTP packets (RFC 2190)

rtph263pdepay

Extracts H263/+/++ video from RTP packets (RFC 4629)

rtph263ppay

Payload-encodes H263/+/++ video in RTP packets (RFC 4629)

rtph264depay

Extracts H264 video from RTP packets (RFC 3984)

rtph264pay

Payload-encode H264 video into RTP packets (RFC 3984)

rtpilbcdepay

Extracts iLBC audio from RTP packets (RFC 3952)

rtpilbcpay

Packetize iLBC audio streams into RTP packets

rtpj2kdepay

Extracts JPEG 2000 video from RTP packets (RFC 5371)

rtpj2kpay

Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)

rtpjpegdepay

Extracts JPEG video from RTP packets (RFC 2435)

rtpjpegpay

Payload-encodes JPEG pictures into RTP packets (RFC 2435)

rtpmp1sdepay

Extracts MPEG1 System Streams from RTP packets (RFC 3555)

rtpmp2tdepay

Extracts MPEG2 TS from RTP packets (RFC 2250)

rtpmp2tpay

Payload-encodes MPEG2 TS into RTP packets (RFC 2250)

rtpmp4adepay

Extracts MPEG4 audio from RTP packets (RFC 3016)

rtpmp4apay

Payload MPEG4 audio as RTP packets (RFC 3016)

rtpmp4gdepay

Extracts MPEG4 elementary streams from RTP packets (RFC 3640)

rtpmp4gpay

Payload MPEG4 elementary streams as RTP packets (RFC 3640)

rtpmp4vdepay

Extracts MPEG4 video from RTP packets (RFC 3016)

rtpmp4vpay

Payload MPEG-4 video as RTP packets (RFC 3016)

rtpmpadepay

Extracts MPEG audio from RTP packets (RFC 2038)

rtpmpapay

Payload MPEG audio as RTP packets (RFC 2038)

rtpmparobustdepay

Extracts MPEG audio from RTP packets (RFC 5219)

rtpmpvdepay

Extracts MPEG video from RTP packets (RFC 2250)

rtpmpvpay

Payload-encodes MPEG2 ES into RTP packets (RFC 2250)

rtppcmadepay

Extracts PCMA audio from RTP packets

rtppcmapay

Payload-encodes PCMA audio into a RTP packet

rtppcmudepay

Extracts PCMU audio from RTP packets

rtppcmupay

Payload-encodes PCMU audio into a RTP packet

rtpqcelpdepay

Extracts QCELP (PureVoice) audio from RTP packets (RFC 2658)

rtpqdm2depay

Extracts QDM2 audio from RTP packets (no RFC)

rtpsirendepay

Extracts Siren audio from RTP packets

rtpsirenpay

Packetize Siren audio streams into RTP packets

rtpspeexdepay

Extracts Speex audio from RTP packets

rtpspeexpay

Payload-encodes Speex audio into a RTP packet

rtpsv3vdepay

Extracts SVQ3 video from RTP packets (no RFC)

rtptheoradepay

Extracts Theora video from RTP packets (draft-01 of RFC XXXX)

rtptheorapay

Payload-encode Theora video into RTP packets (draft-01 RFC XXXX)

rtpvorbisdepay

Extracts Vorbis Audio from RTP packets (RFC 5215)

rtpvorbispay

Payload-encode Vorbis audio into RTP packets (RFC 5215)

rtpvrawdepay

Extracts raw video from RTP packets (RFC 4175)

rtpvrawpay

Payload raw video as RTP packets (RFC 4175)
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html new file mode 100644 index 0000000..5f700a9 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html @@ -0,0 +1,80 @@ + + + + +rtsp + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rtsp

+

rtsp — transfer data via RTSP

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstrtsp.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

rtpdec

Accepts raw RTP and RTCP packets and sends them forward

rtspsrc

Receive data over the network via RTSP (RFC 2326)
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html new file mode 100644 index 0000000..d499d25 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html @@ -0,0 +1,74 @@ + + + + +shapewipe + + + + + + + + + + + + + + + + +
+
+
+ + +
+

shapewipe

+

shapewipe — Shape Wipe transition filter

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstshapewipe.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

shapewipe

Adds a shape wipe transition to a video stream
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html new file mode 100644 index 0000000..6863c5e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html @@ -0,0 +1,74 @@ + + + + +shout2send + + + + + + + + + + + + + + + + +
+
+
+ + +
+

shout2send

+

shout2send — Sends data to an icecast server using libshout2

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstshout2.so

version

0.10.31

run-time license

LGPL

package

libshout2

origin

http://www.icecast.org/download.html
+
+
+

Elements

+
++ + + + +

shout2send

Sends data to an icecast server
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html new file mode 100644 index 0000000..13ae5ff --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html @@ -0,0 +1,80 @@ + + + + +smpte + + + + + + + + + + + + + + + + +
+
+
+ + +
+

smpte

+

smpte — Apply the standard SMPTE transitions on video images

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstsmpte.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

smpte

Apply the standard SMPTE transitions on video images

smptealpha

Apply the standard SMPTE transitions as alpha on video images
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html new file mode 100644 index 0000000..c137b09 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html @@ -0,0 +1,80 @@ + + + + +soup + + + + + + + + + + + + + + + + +
+
+
+ + +
+

soup

+

soup — libsoup HTTP client src/sink

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstsouphttpsrc.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

souphttpclientsink

Sends streams to HTTP server via PUT

souphttpsrc

Receive data as a client over the network via HTTP using SOUP
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html new file mode 100644 index 0000000..516eddf --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html @@ -0,0 +1,74 @@ + + + + +spectrum + + + + + + + + + + + + + + + + +
+
+
+ + +
+

spectrum

+

spectrum — Run an FFT on the audio signal, output spectrum data

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstspectrum.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

spectrum

Run an FFT on the audio signal, output spectrum data
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html new file mode 100644 index 0000000..40dbaae --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html @@ -0,0 +1,80 @@ + + + + +speex + + + + + + + + + + + + + + + + +
+
+
+ + +
+

speex

+

speex — Speex plugin library

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstspeex.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

speexdec

decode speex streams to audio

speexenc

Encodes audio in Speex format
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html new file mode 100644 index 0000000..4dadcd2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html @@ -0,0 +1,80 @@ + + + + +taglib + + + + + + + + + + + + + + + + +
+
+
+ + +
+

taglib

+

taglib — Tag writing plug-in based on taglib

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgsttaglib.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

apev2mux

Adds an APEv2 header to the beginning of files using taglib

id3v2mux

Adds an ID3v2 header to the beginning of MP3 files using taglib
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html new file mode 100644 index 0000000..1e6359e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html @@ -0,0 +1,88 @@ + + + + +udp + + + + + + + + + + + + + + + + +
+
+
+ + +
+

udp

+

udp — transfer data via UDP

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstudp.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + + + + + +

dynudpsink

Send data over the network via UDP

multiudpsink

Send data over the network via UDP

udpsink

Send data over the network via UDP

udpsrc

Receive data over the network via UDP
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html new file mode 100644 index 0000000..bc6339e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html @@ -0,0 +1,80 @@ + + + + +video4linux2 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

video4linux2

+

video4linux2 — elements for Video 4 Linux

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstvideo4linux2.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

v4l2radio

Controls a Video4Linux2 radio device

v4l2src

Reads frames from a Video4Linux2 device
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html new file mode 100644 index 0000000..f148bfe --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html @@ -0,0 +1,74 @@ + + + + +videobox + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videobox

+

videobox — resizes a video by adding borders or cropping

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstvideobox.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

videobox

Resizes a video by adding borders or cropping
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html new file mode 100644 index 0000000..c5d692e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html @@ -0,0 +1,80 @@ + + + + +videocrop + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videocrop

+

videocrop — Crops video into a user-defined region

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstvideocrop.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

aspectratiocrop

Crops video into a user-defined aspect-ratio

videocrop

Crops video into a user-defined region
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html new file mode 100644 index 0000000..510df61 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html @@ -0,0 +1,84 @@ + + + + +videofilter + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videofilter

+

videofilter — Video filters plugin

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstvideofilter.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

gamma

Adjusts gamma on a video stream

videobalance

Adjusts brightness, contrast, hue, saturation on a video stream

videoflip

Flips and rotates video
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html new file mode 100644 index 0000000..15cf962 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html @@ -0,0 +1,80 @@ + + + + +videomixer + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videomixer

+

videomixer — Video mixer

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstvideomixer.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + +

videomixer

Mix multiple video streams

videomixer2

Mix multiple video streams
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-waveform.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-waveform.html new file mode 100644 index 0000000..dd6c16a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-waveform.html @@ -0,0 +1,74 @@ + + + + +waveform + + + + + + + + + + + + + + + + +
+
+
+ + +
+

waveform

+

waveform — WaveForm API based plugin

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstwaveform.dll

version

0.10.4.1

run-time license

LGPL

package

GStreamer Good Plug-ins CVS

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

waveformsink

WaveForm audio sink
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html new file mode 100644 index 0000000..63b88fa --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html @@ -0,0 +1,74 @@ + + + + +wavenc + + + + + + + + + + + + + + + + +
+
+
+ + +
+

wavenc

+

wavenc — Encode raw audio into WAV

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstwavenc.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

wavenc

Encode raw audio into WAV
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html new file mode 100644 index 0000000..7ab63f4 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html @@ -0,0 +1,84 @@ + + + + +wavpack + + + + + + + + + + + + + + + + +
+
+
+ + +
+

wavpack

+

wavpack — Wavpack lossless/lossy audio format handling

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstwavpack.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + + + + + + + + + + + +

wavpackdec

Decodes Wavpack audio data

wavpackenc

Encodes audio with the Wavpack lossless/lossy audio codec

wavpackparse

Parses Wavpack files
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html new file mode 100644 index 0000000..e4cfe11 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html @@ -0,0 +1,74 @@ + + + + +wavparse + + + + + + + + + + + + + + + + +
+
+
+ + +
+

wavparse

+

wavparse — Parse a .wav file into raw audio

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstwavparse.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

wavparse

Parse a .wav file into raw audio
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html new file mode 100644 index 0000000..eaa9f59 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html @@ -0,0 +1,74 @@ + + + + +ximagesrc + + + + + + + + + + + + + + + + +
+
+
+ + +
+

ximagesrc

+

ximagesrc — X11 video input plugin using standard Xlib calls

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgstximagesrc.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

ximagesrc

Creates a screenshot video stream
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html new file mode 100644 index 0000000..8d2a975 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html @@ -0,0 +1,74 @@ + + + + +y4menc + + + + + + + + + + + + + + + + +
+
+
+ + +
+

y4menc

+

y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools)

+
+
+

Plugin Information

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename

libgsty4menc.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin
+
+
+

Elements

+
++ + + + +

y4menc

Encodes a YUV frame into the yuv4mpeg format (mjpegtools)
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-pngdec.html b/docs/plugins/html/gst-plugins-good-plugins-pngdec.html new file mode 100644 index 0000000..855980a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-pngdec.html @@ -0,0 +1,152 @@ + + + + +pngdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

pngdec

+

pngdec — Decode a png video frame to a raw image

+
+
+

Synopsis

+
struct              GstPngDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstPngDec
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ png +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Image
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

image/png
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)64, depth=(int)64, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstPngDec

+
struct GstPngDec;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-pngenc.html b/docs/plugins/html/gst-plugins-good-plugins-pngenc.html new file mode 100644 index 0000000..07bd88a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-pngenc.html @@ -0,0 +1,178 @@ + + + + +pngenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

pngenc

+

pngenc — Encode a video frame to a .png image

+
+
+

Synopsis

+
struct              GstPngEnc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstPngEnc
+
+
+
+

Properties

+
+  "compression-level"        guint                 : Read / Write
+  "snapshot"                 gboolean              : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ png +

author

Jeremy SIMON <jsimon13@yahoo.fr>

class

Codec/Encoder/Image
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

image/png, width=(int)[ 16, 1000000 ], height=(int)[ 16, 1000000 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstPngEnc

+
struct GstPngEnc;
+

+

+
+
+
+

Property Details

+
+

The "compression-level" property

+
  "compression-level"        guint                 : Read / Write
+

PNG compression level.

+

Allowed values: <= 9

+

Default value: 6

+
+
+
+

The "snapshot" property

+
  "snapshot"                 gboolean              : Read / Write
+

Send EOS after encoding a frame, useful for snapshots.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-progressreport.html b/docs/plugins/html/gst-plugins-good-plugins-progressreport.html new file mode 100644 index 0000000..7705d71 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-progressreport.html @@ -0,0 +1,251 @@ + + + + +progressreport + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

progressreport

+

progressreport — Periodically query and report on processing progress

+
+
+

Synopsis

+
struct              GstProgressReport;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstProgressReport
+
+
+
+

Properties

+
+  "silent"                   gboolean              : Read / Write
+  "update-freq"              gint                  : Read / Write
+  "format"                   gchar*                : Read / Write
+  "do-query"                 gboolean              : Read / Write
+
+
+
+

Description

+

+The progressreport element can be put into a pipeline to report progress, +which is done by doing upstream duration and position queries in regular +(real-time) intervals. Both the interval and the prefered query format +can be specified via the "update-freq" and the +"format" property. +

+

+Element messages containing a "progress" structure are posted on the bus +whenever progress has been queried (since gst-plugins-good 0.10.6 only). +

+

+Since the element was originally designed for debugging purposes, it will +by default also print information about the current progress to the +terminal. This can be prevented by setting the "silent" +property to TRUE. +

+

+This element is most useful in transcoding pipelines or other situations +where just querying the pipeline might not lead to the wanted result. For +progress in TIME format, the element is best placed in a 'raw stream' +section of the pipeline (or after any demuxers/decoders/parsers). +

+

+Three more things should be pointed out: firstly, the element will only +query progress when data flow happens. If data flow is stalled for some +reason, no progress messages will be posted. Secondly, there are other +elements (like qtdemux, for example) that may also post "progress" element +messages on the bus. Applications should check the source of any element +messages they receive, if needed. Finally, applications should not take +action on receiving notification of progress being 100%, they should only +take action when they receive an EOS message (since the progress reported +is in reference to an internal point of a pipeline and not the pipeline as +a whole). +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -m filesrc location=foo.ogg ! decodebin ! progressreport update-freq=1 ! audioconvert ! audioresample ! autoaudiosink
+
+ This shows a progress query where a duration is available. +
+ + + + + + + +
1
gst-launch -m audiotestsrc ! progressreport update-freq=1 ! audioconvert ! autoaudiosink
+
+ This shows a progress query where no duration is available. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ debug +

author

Jan Schmidt <thaytan@mad.scientist.com>

class

Testing
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstProgressReport

+
struct GstProgressReport;
+

+

+
+
+
+

Property Details

+
+

The "silent" property

+
  "silent"                   gboolean              : Read / Write
+

Do not print output to stdout.

+

Default value: FALSE

+
+
+
+

The "update-freq" property

+
  "update-freq"              gint                  : Read / Write
+

Number of seconds between reports when data is flowing.

+

Allowed values: >= 1

+

Default value: 5

+
+
+
+

The "format" property

+
  "format"                   gchar*                : Read / Write
+

Format to use for the querying.

+

Default value: "auto"

+
+
+
+

The "do-query" property

+
  "do-query"                 gboolean              : Read / Write
+

Use a query instead of buffer metadata to determine stream position.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-pulsemixer.html b/docs/plugins/html/gst-plugins-good-plugins-pulsemixer.html new file mode 100644 index 0000000..7978475 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-pulsemixer.html @@ -0,0 +1,143 @@ + + + + +pulsemixer + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

pulsemixer

+

pulsemixer — Control sound input and output levels for PulseAudio

+
+
+

Synopsis

+
struct              GstPulseMixer;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstPulseMixer
+
+
+
+

Implemented Interfaces

+

+GstPulseMixer implements + GstImplementsInterface, GstMixer and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "device-name"              gchar*                : Read
+  "server"                   gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ pulseaudio +

author

Lennart Poettering

class

Generic/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstPulseMixer

+
struct GstPulseMixer;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

The PulseAudio sink or source to control.

+

Default value: NULL

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Human-readable name of the sound device.

+

Default value: NULL

+
+
+
+

The "server" property

+
  "server"                   gchar*                : Read / Write
+

The PulseAudio server to connect to.

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-pulsesink.html b/docs/plugins/html/gst-plugins-good-plugins-pulsesink.html new file mode 100644 index 0000000..89120dd --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-pulsesink.html @@ -0,0 +1,242 @@ + + + + +pulsesink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

pulsesink

+

pulsesink — Plays audio to a PulseAudio server

+
+
+

Synopsis

+
struct              GstPulseSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstBaseAudioSink
+                           +----GstPulseSink
+
+
+
+

Implemented Interfaces

+

+GstPulseSink implements + GstStreamVolume, GstImplementsInterface and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "server"                   gchar*                : Read / Write
+  "device-name"              gchar*                : Read
+  "volume"                   gdouble               : Read / Write
+  "mute"                     gboolean              : Read / Write
+  "client"                   gchar*                : Read / Write
+  "stream-properties"        GstStructure*         : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ pulseaudio +

author

Lennart Poettering

class

Sink/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-ac3, framed=(boolean)true

audio/x-eac3, framed=(boolean)true

audio/x-dts, framed=(boolean)true, block-size=(int){ 512, 1024, 2048 }

audio/mpeg, mpegversion=(int)1, mpegaudioversion=(int)[ 1, 2 ], parsed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstPulseSink

+
struct GstPulseSink;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

The PulseAudio sink device to connect to.

+

Default value: NULL

+
+
+
+

The "server" property

+
  "server"                   gchar*                : Read / Write
+

The PulseAudio server to connect to.

+

Default value: NULL

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Human-readable name of the sound device.

+

Default value: NULL

+
+
+
+

The "volume" property

+
  "volume"                   gdouble               : Read / Write
+

Linear volume of this stream, 1.0=100%.

+

Allowed values: [0,10]

+

Default value: 1

+
+
+
+

The "mute" property

+
  "mute"                     gboolean              : Read / Write
+

Mute state of this stream.

+

Default value: FALSE

+
+
+
+

The "client" property

+
  "client"                   gchar*                : Read / Write
+

The PulseAudio client name to use.

+

Default value: "lt-gst-plugins-good-plugins-scan"

+
+
+
+

The "stream-properties" property

+
  "stream-properties"        GstStructure*         : Read / Write
+

list of pulseaudio stream properties.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-pulsesrc.html b/docs/plugins/html/gst-plugins-good-plugins-pulsesrc.html new file mode 100644 index 0000000..37dcda5 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-pulsesrc.html @@ -0,0 +1,228 @@ + + + + +pulsesrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

pulsesrc

+

pulsesrc — Captures audio from a PulseAudio server

+
+
+

Synopsis

+
struct              GstPulseSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstBaseAudioSrc
+                                 +----GstAudioSrc
+                                       +----GstPulseSrc
+
+
+
+

Implemented Interfaces

+

+GstPulseSrc implements + GstStreamVolume, GstImplementsInterface, GstMixer and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "server"                   gchar*                : Read / Write
+  "device-name"              gchar*                : Read
+  "stream-properties"        GstStructure*         : Read / Write
+  "client"                   gchar*                : Read / Write
+  "mute"                     gboolean              : Read / Write
+  "source-output-index"      guint                 : Read
+  "volume"                   gdouble               : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ pulseaudio +

author

Lennart Poettering

class

Source/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]
+
+
+

+

+
+
+

Details

+
+

struct GstPulseSrc

+
struct GstPulseSrc;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

The PulseAudio source device to connect to.

+

Default value: NULL

+
+
+
+

The "server" property

+
  "server"                   gchar*                : Read / Write
+

The PulseAudio server to connect to.

+

Default value: NULL

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Human-readable name of the sound device.

+

Default value: NULL

+
+
+
+

The "stream-properties" property

+
  "stream-properties"        GstStructure*         : Read / Write
+

list of pulseaudio stream properties.

+
+
+
+

The "client" property

+
  "client"                   gchar*                : Read / Write
+

The PulseAudio client_name_to_use.

+

Default value: "lt-gst-plugins-good-plugins-scan"

+
+
+
+

The "mute" property

+
  "mute"                     gboolean              : Read / Write
+

Mute state of this stream.

+

Default value: FALSE

+
+
+
+

The "source-output-index" property

+
  "source-output-index"      guint                 : Read
+

The index of the PulseAudio source output corresponding to this record stream.

+

Default value: 4294967295

+
+
+
+

The "volume" property

+
  "volume"                   gdouble               : Read / Write
+

Linear volume of this stream, 1.0=100%.

+

Allowed values: [0,10]

+

Default value: 1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-qtdemux.html b/docs/plugins/html/gst-plugins-good-plugins-qtdemux.html new file mode 100644 index 0000000..79da1d6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-qtdemux.html @@ -0,0 +1,261 @@ + + + + +qtdemux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

qtdemux

+

qtdemux — Demultiplex a QuickTime file into audio and video streams

+
+
+

Synopsis

+
struct              GstQTDemux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstQTDemux
+
+
+
+

Signals

+
+  "got-redirect"                                   
+
+
+
+

Description

+

+Demuxes a .mov file into raw or compressed audio and/or video streams. +

+

+This element supports both push and pull-based scheduling, depending on the +capabilities of the upstream elements. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=test.mov ! qtdemux name=demux  demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink   demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! autovideosink
+
+ Play (parse and decode) a .mov file and try to output it to +an automatically detected soundcard and videosink. If the MOV file contains +compressed audio or video data, this will only work if you have the +right decoder elements/plugins installed. +
+

+

+

+Last reviewed on 2006-12-29 (0.10.5) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ isomp4 +

author

David Schleef <ds@schleef.org>, Wim Taymans <wim@fluendo.com>

class

Codec/Demuxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/quicktime

video/mj2

audio/x-m4a

application/x-3gp
+
++ + + + + + + + + + + + + + + + + + +

name

audio_%02d

direction

source

presence

sometimes

details

ANY
+
++ + + + + + + + + + + + + + + + + + +

name

subtitle_%02d

direction

source

presence

sometimes

details

ANY
+
++ + + + + + + + + + + + + + + + + + +

name

video_%02d

direction

source

presence

sometimes

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstQTDemux

+
struct GstQTDemux;
+

+

+
+
+
+

Signal Details

+
+

The "got-redirect" signal

+
void                user_function                      (GstQTDemux *gstqtdemux,
+                                                        gchar      *arg1,
+                                                        gpointer    user_data)
+

+

+
++ + + + + + + + + + +

gstqtdemux :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-qtmoovrecover.html b/docs/plugins/html/gst-plugins-good-plugins-qtmoovrecover.html new file mode 100644 index 0000000..bbfbfd6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-qtmoovrecover.html @@ -0,0 +1,201 @@ + + + + +qtmoovrecover + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

qtmoovrecover

+

qtmoovrecover — Utility element for recovering unfinished quicktime files

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstPipeline
+                           +----GstQTMoovRecover
+
+
+
+

Implemented Interfaces

+

+GstQTMoovRecover implements + GstChildProxy.

+
+
+

Properties

+
+  "broken-input"             gchar*                : Read / Write
+  "faststart-mode"           gboolean              : Read / Write
+  "fixed-output"             gchar*                : Read / Write
+  "recovery-input"           gchar*                : Read / Write
+
+
+
+

Description

+

+

+
+

Example pipelines

+

+This element recovers quicktime files created with qtmux using the moov +recovery feature. +

+

+

+
+TODO
+
+

+

+
+

+

+

+Documentation last reviewed on 2011-04-21 +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ isomp4 +

author

Thiago Santos <thiago.sousa.santos@collabora.co.uk>

class

Util
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstQTMoovRecover

+
struct GstQTMoovRecover;
+

+

+
+
+
+

struct GstQTMoovRecoverClass

+
struct GstQTMoovRecoverClass {
+  GstPipelineClass parent_class;
+};
+
+

+

+
+
+
+

gst_qt_moov_recover_get_type ()

+
GType               gst_qt_moov_recover_get_type        (void);
+

+

+
+
+
+

gst_qt_moov_recover_register ()

+
gboolean            gst_qt_moov_recover_register        (GstPlugin *plugin);
+

+

+
+
+
+

Property Details

+
+

The "broken-input" property

+
  "broken-input"             gchar*                : Read / Write
+

Path to broken input file. (If qtmux was on faststart mode, this file is the faststart file).

+

Default value: NULL

+
+
+
+

The "faststart-mode" property

+
  "faststart-mode"           gboolean              : Read / Write
+

If the broken input is from faststart mode.

+

Default value: FALSE

+
+
+
+

The "fixed-output" property

+
  "fixed-output"             gchar*                : Read / Write
+

Path to write the fixed file to (used as output).

+

Default value: NULL

+
+
+
+

The "recovery-input" property

+
  "recovery-input"           gchar*                : Read / Write
+

Path to recovery file (used as input).

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-qtmux.html b/docs/plugins/html/gst-plugins-good-plugins-qtmux.html new file mode 100644 index 0000000..c2affdb --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-qtmux.html @@ -0,0 +1,417 @@ + + + + +qtmux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

qtmux

+

qtmux — Muxer for quicktime(.mov) files

+
+
+

Synopsis

+
struct              GstQTMux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstQTMux
+
+
+
+

Implemented Interfaces

+

+GstQTMux implements + GstTagSetter and GstTagXmpWriter.

+
+
+

Properties

+
+  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
+  "faststart"                gboolean              : Read / Write
+  "faststart-file"           gchar*                : Read / Write / Construct
+  "fragment-duration"        guint                 : Read / Write / Construct
+  "moov-recovery-file"       gchar*                : Read / Write / Construct
+  "movie-timescale"          guint                 : Read / Write / Construct
+  "presentation-time"        gboolean              : Read / Write / Construct
+  "streamable"               gboolean              : Read / Write / Construct
+  "trak-timescale"           guint                 : Read / Write / Construct
+
+
+
+

Description

+

+This element merges streams (audio and video) into QuickTime(.mov) files. +

+

+The following background intends to explain why various similar muxers +are present in this plugin. +

+

+The +QuickTime file format specification served as basis for the MP4 file +format specification (mp4mux), and as such the QuickTime file structure is +nearly identical to the so-called ISO Base Media file format defined in +ISO 14496-12 (except for some media specific parts). +In turn, the latter ISO Base Media format was further specialized as a +Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) +and in various 3GPP(2) specs (gppmux). +The fragmented file features defined (only) in ISO Base Media are used by +ISMV files making up (a.o.) Smooth Streaming (ismlmux). +

+

+A few properties (movie-timescale, +trak-timescale) allow adjusting +some technical parameters, which might be useful in (rare) cases to resolve +compatibility issues in some situations. +

+

+Some other properties influence the result more fundamentally. +A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, +somewhat contrary to this usually being called "the header". +However, a faststart file will +(with some effort) arrange this to be located near start of the file, +which then allows it e.g. to be played while downloading. +Alternatively, rather than having one chunk of metadata at start (or end), +there can be some metadata at start and most of the other data can be spread +out into fragments of fragment-duration. +If such fragmented layout is intended for streaming purposes, then +streamable allows foregoing to add +index metadata (at the end of file). +

+

+dts-method allows selecting a +method for managing input timestamps (stay tuned for 0.11 to have this +automagically settled). The default delta/duration method should handle nice +(aka perfect streams) just fine, but may experience problems otherwise +(e.g. input stream with re-ordered B-frames and/or with frame dropping). +The re-ordering approach re-assigns incoming timestamps in ascending order +to incoming buffers and offers an alternative in such cases. In cases where +that might fail, the remaining method can be tried, which is exact and +according to specs, but might experience playback on not so spec-wise players. +Note that this latter approach also requires one to enable +presentation-timestamp. +

+

+

+
+

Example pipelines

+
+ + + + + + + +
1
gst-launch v4l2src num-buffers=500 ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! qtmux ! filesink location=video.mov
+
+ +Records a video stream captured from a v4l2 device and muxes it into a qt file. +
+

+

+

+Last reviewed on 2010-12-03 +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ isomp4 +

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

audio_%d

direction

sink

presence

request

details

audio/x-raw-int, width=(int)8, depth=(int)8, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean){ true, false }

audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true

audio/x-raw-int, width=(int)24, depth=(int)24, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true

audio/x-raw-int, width=(int)32, depth=(int)32, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)dvi, block_align=(int)[ 64, 8096 ], channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/x-alaw, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]

audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]

audio/x-alac, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video_%d

direction

sink

presence

request

details

video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, 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-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-svq, svqversion=(int)3, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-dv, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]

video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-dirac, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-qt-part, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/quicktime, variant=(string)apple

video/quicktime
+
+
+

+

+
+
+

Details

+
+

struct GstQTMux

+
struct GstQTMux;
+

+

+
+
+
+

Property Details

+
+

The "dts-method" property

+
  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
+

Method to determine DTS time.

+

Default value: reorder

+
+
+
+

The "faststart" property

+
  "faststart"                gboolean              : Read / Write
+

If the file should be formatted for faststart (headers first).

+

Default value: FALSE

+
+
+
+

The "faststart-file" property

+
  "faststart-file"           gchar*                : Read / Write / Construct
+

File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically.

+

Default value: NULL

+
+
+
+

The "fragment-duration" property

+
  "fragment-duration"        guint                 : Read / Write / Construct
+

Fragment durations in ms (produce a fragmented file if > 0).

+

Default value: 0

+
+
+
+

The "moov-recovery-file" property

+
  "moov-recovery-file"       gchar*                : Read / Write / Construct
+

File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental).

+

Default value: NULL

+
+
+
+

The "movie-timescale" property

+
  "movie-timescale"          guint                 : Read / Write / Construct
+

Timescale to use in the movie (units per second).

+

Allowed values: >= 1

+

Default value: 1000

+
+
+
+

The "presentation-time" property

+
  "presentation-time"        gboolean              : Read / Write / Construct
+

Calculate and include presentation/composition time (in addition to decoding time).

+

Default value: TRUE

+
+
+
+

The "streamable" property

+
  "streamable"               gboolean              : Read / Write / Construct
+

If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written.

+

Default value: FALSE

+
+
+
+

The "trak-timescale" property

+
  "trak-timescale"           guint                 : Read / Write / Construct
+

Timescale to use for the tracks (units per second, 0 is automatic).

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-quarktv.html b/docs/plugins/html/gst-plugins-good-plugins-quarktv.html new file mode 100644 index 0000000..3865d23 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-quarktv.html @@ -0,0 +1,210 @@ + + + + +quarktv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

quarktv

+

quarktv — Motion dissolver

+
+
+

Synopsis

+
struct              GstQuarkTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstQuarkTV
+
+
+
+

Properties

+
+  "planes"                   gint                  : Read / Write
+
+
+
+

Description

+

+QuarkTV disolves moving objects. It picks up pixels from +the last frames randomly. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! quarktv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of quarktv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstQuarkTV

+
struct GstQuarkTV;
+

+

+
+
+
+

Property Details

+
+

The "planes" property

+
  "planes"                   gint                  : Read / Write
+

Number of planes.

+

Allowed values: [0,64]

+

Default value: 16

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-radioactv.html b/docs/plugins/html/gst-plugins-good-plugins-radioactv.html new file mode 100644 index 0000000..df145b6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-radioactv.html @@ -0,0 +1,227 @@ + + + + +radioactv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

radioactv

+

radioactv — motion-enlightment effect

+
+
+

Synopsis

+
struct              GstRadioacTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstRadioacTV
+
+
+
+

Properties

+
+  "color"                    GstRadioacTVColor     : Read / Write
+  "interval"                 guint                 : Read / Write
+  "mode"                     GstRadioacTVMode      : Read / Write
+  "trigger"                  gboolean              : Read / Write
+
+
+
+

Description

+

+RadioacTV does *NOT* detect a radioactivity. It detects a difference +from previous frame and blurs it. +

+

+RadioacTV has 4 mode, normal, strobe1, strobe2 and trigger. +In trigger mode, effect appears only when the trigger property is TRUE. +

+

+strobe1 and strobe2 mode drops some frames. strobe1 mode uses the difference between +current frame and previous frame dropped, while strobe2 mode uses the difference from +previous frame displayed. The effect of strobe2 is stronger than strobe1. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! radioactv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of radioactv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstRadioacTV

+
struct GstRadioacTV;
+

+

+
+
+
+

Property Details

+
+

The "color" property

+
  "color"                    GstRadioacTVColor     : Read / Write
+

Color.

+

Default value: White

+
+
+
+

The "interval" property

+
  "interval"                 guint                 : Read / Write
+

Snapshot interval (in strobe mode).

+

Allowed values: <= G_MAXINT

+

Default value: 3

+
+
+
+

The "mode" property

+
  "mode"                     GstRadioacTVMode      : Read / Write
+

Mode.

+

Default value: Normal

+
+
+
+

The "trigger" property

+
  "trigger"                  gboolean              : Read / Write
+

Trigger (in trigger mode).

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-revtv.html b/docs/plugins/html/gst-plugins-good-plugins-revtv.html new file mode 100644 index 0000000..87ef34e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-revtv.html @@ -0,0 +1,190 @@ + + + + +revtv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

revtv

+

revtv — A video waveform monitor for each line of video processed

+
+
+

Synopsis

+
struct              GstRevTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstRevTV
+
+
+
+

Properties

+
+  "delay"                    gint                  : Read / Write
+  "gain"                     gint                  : Read / Write
+  "linespace"                gint                  : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstRevTV

+
struct GstRevTV;
+

+

+
+
+
+

Property Details

+
+

The "delay" property

+
  "delay"                    gint                  : Read / Write
+

Delay in frames between updates.

+

Allowed values: [1,100]

+

Default value: 1

+
+
+
+

The "gain" property

+
  "gain"                     gint                  : Read / Write
+

Control gain.

+

Allowed values: [1,200]

+

Default value: 50

+
+
+
+

The "linespace" property

+
  "linespace"                gint                  : Read / Write
+

Control line spacing.

+

Allowed values: [1,100]

+

Default value: 6

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-rganalysis.html b/docs/plugins/html/gst-plugins-good-plugins-rganalysis.html new file mode 100644 index 0000000..f54fa4b --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-rganalysis.html @@ -0,0 +1,357 @@ + + + + +rganalysis + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rganalysis

+

rganalysis — Perform the ReplayGain analysis

+
+
+

Synopsis

+
struct              GstRgAnalysis;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstRgAnalysis
+
+
+
+

Properties

+
+  "forced"                   gboolean              : Read / Write
+  "num-tracks"               gint                  : Read / Write
+  "reference-level"          gdouble               : Read / Write
+  "message"                  gboolean              : Read / Write / Construct
+
+
+
+

Description

+

+This element analyzes raw audio sample data in accordance with the proposed +ReplayGain standard for +calculating the ideal replay gain for music tracks and albums. The element +is designed as a pass-through filter that never modifies any data. As it +receives an EOS event, it finalizes the ongoing analysis and generates a tag +list containing the results. It is sent downstream with a tag event and +posted on the message bus with a tag message. The EOS event is forwarded as +normal afterwards. Result tag lists at least contain the tags +GST_TAG_TRACK_GAIN, GST_TAG_TRACK_PEAK and GST_TAG_REFERENCE_LEVEL. +

+

+Because the generated metadata tags become available at the end of streams, +downstream muxer and encoder elements are normally unable to save them in +their output since they generally save metadata in the file header. +Therefore, it is often necessary that applications read the results in a bus +event handler for the tag message. Obtaining the values this way is always +needed for album processing +since the album gain and peak values need to be associated with all tracks of +an album, not just the last one. +

+

+

+
+

Example launch lines

+
+ + + + + + + +
1
gst-launch -t audiotestsrc wave=sine num-buffers=512 ! rganalysis ! fakesink
+
+ Analyze a simple test waveform +
+ + + + + + + +
1
+2
gst-launch -t filesrc location=filename.ext ! decodebin \
+    ! audioconvert ! audioresample ! rganalysis ! fakesink
+
+ Analyze a given file +
+ + + + + + + +
1
+2
gst-launch -t gnomevfssrc location=http://replaygain.hydrogenaudio.org/ref_pink.wav \
+    ! wavparse ! rganalysis ! fakesink
+
+ Analyze the pink noise reference file +

+The above launch line yields a result gain of +6 dB (instead of the expected ++0 dB). This is not in error, refer to the "reference-level" +property documentation for more information. +

+
+

+

+
+
+

Acknowledgements

+

+This element is based on code used in the vorbisgain program and many +others. The relevant parts are copyrighted by David Robinson, Glen Sawyer +and Frank Klemm. +

+
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ replaygain +

author

René Stadler <mail@renestadler.de>

class

Filter/Analyzer/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int)32, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }

audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int)32, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }

audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
+
+
+

+

+
+
+

Details

+
+

struct GstRgAnalysis

+
struct GstRgAnalysis;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "forced" property

+
  "forced"                   gboolean              : Read / Write
+

+Whether to analyze streams even when ReplayGain tags exist. +

+

+For assisting transcoder/converter applications, the element can silently +skip the processing of streams that already contain the necessary tags. +Data will flow as usual but the element will not consume CPU time and will +not generate result tags. To enable possible skipping, set this property +to FALSE. +

+

+If used in conjunction with album +processing, the element will skip the number of remaining album +tracks if a full set of tags is found for the first track. If a subsequent +track of the album is missing tags, processing cannot start again. If this +is undesired, the application has to scan all files beforehand and enable +forcing of processing if needed. +

+

Default value: TRUE

+
+
+
+

The "num-tracks" property

+
  "num-tracks"               gint                  : Read / Write
+

+Number of remaining album tracks. +

+

+Analyzing several streams sequentially and assigning them a common result +gain is known as "album processing". If this gain is used during playback +(by switching to "album mode"), all tracks of an album receive the same +amplification. This keeps the relative volume levels between the tracks +intact. To enable this, set this property to the number of streams that +will be processed as album tracks. +

+

+Every time an EOS event is received, the value of this property is +decremented by one. As it reaches zero, it is assumed that the last track +of the album finished. The tag list for the final stream will contain the +additional tags GST_TAG_ALBUM_GAIN and GST_TAG_ALBUM_PEAK. All other +streams just get the two track tags posted because the values for the album +tags are not known before all tracks are analyzed. Applications need to +ensure that the album gain and peak values are also associated with the +other tracks when storing the results. +

+

+If the total number of album tracks is unknown beforehand, just ensure that +the value is greater than 1 before each track starts. Then before the end +of the last track, set it to the value 1. +

+

+To perform album processing, the element has to preserve data between +streams. This cannot survive a state change to the NULL or READY state. +If you change your pipeline's state to NULL or READY between tracks, lock +the element's state using gst_element_set_locked_state() when it is in +PAUSED or PLAYING. +

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "reference-level" property

+
  "reference-level"          gdouble               : Read / Write
+

+Reference level [dB]. +

+

+Analyzing the ReplayGain pink noise reference waveform computes a result of ++6 dB instead of the expected 0 dB. This is because the default reference +level is 89 dB. To obtain values as lined out in the original proposal of +ReplayGain, set this property to 83. +

+

+Almost all software uses 89 dB as a reference however, and this value has +become the new official value. That is to say, while the change has been +acclaimed by the author of the ReplayGain proposal, the webpage is still outdated at the time +of this writing. +

+

+The value was changed because the original proposal recommends a default +pre-amp value of +6 dB for playback. This seemed a bit odd, as it means +that the algorithm has the general tendency to produce adjustment values +that are 6 dB too low. Bumping the reference level by 6 dB compensated for +this. +

+

+The problem of the reference level being ambiguous for lack of concise +standardization is to be solved by adopting the GST_TAG_REFERENCE_LEVEL +tag, which allows to store the used value alongside the gain values. +

+

Allowed values: [0,150]

+

Default value: 89

+
+
+
+

The "message" property

+
  "message"                  gboolean              : Read / Write / Construct
+

Post statics messages.

+

Default value: FALSE

+
+
+
+

See Also

+GstRgVolume +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-rglimiter.html b/docs/plugins/html/gst-plugins-good-plugins-rglimiter.html new file mode 100644 index 0000000..8e42d29 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-rglimiter.html @@ -0,0 +1,194 @@ + + + + +rglimiter + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rglimiter

+

rglimiter — Apply signal compression to raw audio data

+
+
+

Synopsis

+
struct              GstRgLimiter;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstRgLimiter
+
+
+
+

Properties

+
+  "enabled"                  gboolean              : Read / Write
+
+
+
+

Description

+

+This element applies signal compression/limiting to raw audio data. It +performs strict hard limiting with soft-knee characteristics, using a +threshold of -6 dB. This type of filter is mentioned in the proposed ReplayGain standard. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
gst-launch filesrc location=filename.ext ! decodebin ! audioconvert \
+           ! rgvolume pre-amp=6.0 headroom=10.0 ! rglimiter \
+           ! audioconvert ! audioresample ! alsasink
+
+Playback of a file +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ replaygain +

author

René Stadler <mail@renestadler.de>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int)32, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int)32, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234
+
+
+

+

+
+
+

Details

+
+

struct GstRgLimiter

+
struct GstRgLimiter;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "enabled" property

+
  "enabled"                  gboolean              : Read / Write
+

Enable processing.

+

Default value: TRUE

+
+
+
+

See Also

+GstRgVolume +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-rgvolume.html b/docs/plugins/html/gst-plugins-good-plugins-rgvolume.html new file mode 100644 index 0000000..ea8e6f4 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-rgvolume.html @@ -0,0 +1,366 @@ + + + + +rgvolume + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rgvolume

+

rgvolume — Apply ReplayGain volume adjustment

+
+
+

Synopsis

+
struct              GstRgVolume;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstRgVolume
+
+
+
+

Implemented Interfaces

+

+GstRgVolume implements + GstChildProxy.

+
+
+

Properties

+
+  "album-mode"               gboolean              : Read / Write
+  "fallback-gain"            gdouble               : Read / Write
+  "headroom"                 gdouble               : Read / Write
+  "pre-amp"                  gdouble               : Read / Write
+  "result-gain"              gdouble               : Read
+  "target-gain"              gdouble               : Read
+
+
+
+

Description

+

+This element applies volume changes to streams as lined out in the proposed +ReplayGain standard. It +interprets the ReplayGain meta data tags and carries out the adjustment (by +using a volume element internally). The relevant tags are: +

+ +

+The information carried by these tags must have been calculated beforehand by +performing the ReplayGain analysis. This is implemented by the rganalysis element. +

+

+The signal compression/limiting recommendations outlined in the proposed +standard are not implemented by this element. This has to be handled by +separate elements because applications might want to have additional filters +between the volume adjustment and the limiting stage. A basic limiter is +included with this plugin: The rglimiter +element applies -6 dB hard limiting as mentioned in the ReplayGain standard. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
gst-launch filesrc location=filename.ext ! decodebin ! audioconvert \
+    ! rgvolume ! audioconvert ! audioresample ! alsasink
+
+ Playback of a file +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ replaygain +

author

René Stadler <mail@renestadler.de>

class

Filter/Effect/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32

audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32

audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstRgVolume

+
struct GstRgVolume;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "album-mode" property

+
  "album-mode"               gboolean              : Read / Write
+

+Whether to prefer album gain over track gain. +

+

+If set to TRUE, use album gain instead of track gain if both are +available. This keeps the relative loudness levels of tracks from the same +album intact. +

+

+If set to FALSE, track mode is used instead. This effectively leads to +more extensive normalization. +

+

+If album mode is enabled but the album gain tag is absent in the stream, +the track gain is used instead. If both gain tags are missing, the value +of the fallback-gain +property is used instead. +

+

Default value: TRUE

+
+
+
+

The "fallback-gain" property

+
  "fallback-gain"            gdouble               : Read / Write
+

+Fallback gain [dB] for streams missing ReplayGain tags. +

+

Allowed values: [-60,60]

+

Default value: 0

+
+
+
+

The "headroom" property

+
  "headroom"                 gdouble               : Read / Write
+

+Extra headroom [dB]. This controls the amount by which the output can +exceed digital full scale. +

+

+Only set this to a value greater than 0.0 if signal compression/limiting of +a suitable form is applied to the output (or output is brought into the +correct range by some other transformation). +

+

+This element internally uses a volume element, which also supports +operating on integer audio formats. These formats do not allow exceeding +digital full scale. If extra headroom is used, make sure that the raw +audio data format is floating point (audio/x-raw-float). Otherwise, +clipping distortion might be introduced as part of the volume adjustment +itself. +

+

Allowed values: [0,60]

+

Default value: 0

+
+
+
+

The "pre-amp" property

+
  "pre-amp"                  gdouble               : Read / Write
+

+Additional gain to apply globally [dB]. This controls the trade-off +between uniformity of normalization and utilization of available dynamic +range. +

+

+Note that the default value is 0 dB because the ReplayGain reference value +was adjusted by +6 dB (from 83 to 89 dB). At the time of this writing, the +webpage is still outdated and +does not reflect this change however. Where the original proposal states +that a proper default pre-amp value is +6 dB, this translates to the used 0 +dB. +

+

Allowed values: [-60,60]

+

Default value: 0

+
+
+
+

The "result-gain" property

+
  "result-gain"              gdouble               : Read
+

+Applied gain [dB]. This gain is applied to processed buffer data. +

+

+This is set to the target +gain if amplification by that amount can be applied safely. +"Safely" means that the volume adjustment does not inflict clipping +distortion. Should this not be the case, the result gain is set to an +appropriately reduced value (by applying peak normalization). The proposed +standard calls this "clipping prevention". +

+

+The difference between target and result gain reflects the necessary amount +of reduction. Applications can make use of this information to temporarily +reduce the pre-amp for +subsequent streams, as recommended by the ReplayGain standard. +

+

+Note that target and result gain differing for a great majority of streams +indicates a problem: What happens in this case is that most streams receive +peak normalization instead of amplification by the ideal replay gain. To +prevent this, the pre-amp has +to be lowered and/or a limiter has to be used which facilitates the use of +headroom. +

+

Allowed values: [-120,120]

+

Default value: 0

+
+
+
+

The "target-gain" property

+
  "target-gain"              gdouble               : Read
+

+Applicable gain [dB]. This gain is supposed to be applied. +

+

+Depending on the value of the album-mode property and the +presence of ReplayGain tags in the stream, this is set according to one of +these simple formulas: +

+

+

+
+

+

+

Allowed values: [-120,120]

+

Default value: 0

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-rippletv.html b/docs/plugins/html/gst-plugins-good-plugins-rippletv.html new file mode 100644 index 0000000..dec42a8 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-rippletv.html @@ -0,0 +1,217 @@ + + + + +rippletv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rippletv

+

rippletv — RippleTV does ripple mark effect on the video input

+
+
+

Synopsis

+
struct              GstRippleTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstRippleTV
+
+
+
+

Properties

+
+  "mode"                     GstRippleTVMode       : Read / Write
+  "reset"                    gboolean              : Write
+
+
+
+

Description

+

+RippleTV does ripple mark effect on the video input. The ripple is caused +by motion or random rain drops. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! rippletv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of rippletv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstRippleTV

+
struct GstRippleTV;
+

+

+
+
+
+

Property Details

+
+

The "mode" property

+
  "mode"                     GstRippleTVMode       : Read / Write
+

Mode.

+

Default value: Motion Detection

+
+
+
+

The "reset" property

+
  "reset"                    gboolean              : Write
+

Reset all current ripples.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-rtpdec.html b/docs/plugins/html/gst-plugins-good-plugins-rtpdec.html new file mode 100644 index 0000000..d06adc2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-rtpdec.html @@ -0,0 +1,461 @@ + + + + +rtpdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rtpdec

+

rtpdec — Accepts raw RTP and RTCP packets and sends them forward

+
+
+

Synopsis

+
struct              GstRTPDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstRTPDec
+
+
+
+

Properties

+
+  "skip"                     gint                  : Read / Write
+  "latency"                  guint                 : Read / Write
+
+
+ +
+

Description

+

+A simple RTP session manager used internally by rtspsrc. +

+

+Last reviewed on 2006-06-20 (0.10.4) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ rtsp +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Parser/Network
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtcp_sink_%d

direction

sink

presence

request

details

application/x-rtcp
+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtp_sink_%d

direction

sink

presence

request

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

recv_rtp_src_%d_%d_%d

direction

source

presence

sometimes

details

application/x-rtp
+
++ + + + + + + + + + + + + + + + + + +

name

rtcp_src_%d

direction

source

presence

request

details

application/x-rtcp
+
+
+

+

+
+
+

Details

+
+

struct GstRTPDec

+
struct GstRTPDec;
+

+

+
+
+
+

Property Details

+
+

The "skip" property

+
  "skip"                     gint                  : Read / Write
+

skip (unused).

+

Default value: 0

+
+
+
+

The "latency" property

+
  "latency"                  guint                 : Read / Write
+

Amount of ms to buffer.

+

Default value: 200

+
+
+
+

Signal Details

+
+

The "clear-pt-map" signal

+
void                user_function                      (GstRTPDec *gstrtpdec,
+                                                        gpointer   user_data)      : Run Last
+

+

+
++ + + + + + + + + + +

gstrtpdec :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "request-pt-map" signal

+
GstCaps*            user_function                      (GstRTPDec *rtpdec,
+                                                        guint      session,
+                                                        guint      pt,
+                                                        gpointer   user_data)      : Run Last
+

+Request the payload type as GstCaps for pt in session. +

+
++ + + + + + + + + + + + + + + + + + +

rtpdec :

the object which received the signal

session :

the session

pt :

the pt

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-bye-ssrc" signal

+
void                user_function                      (GstRTPDec *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of an SSRC that became inactive because of a BYE packet. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-bye-timeout" signal

+
void                user_function                      (GstRTPDec *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of an SSRC that has timed out because of BYE +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-new-ssrc" signal

+
void                user_function                      (GstRTPDec *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of a new SSRC that entered session. +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-collision" signal

+
void                user_function                      (GstRTPDec *gstrtpdec,
+                                                        guint      arg1,
+                                                        guint      arg2,
+                                                        gpointer   user_data)      : Run Last
+

+

+
++ + + + + + + + + + +

gstrtpdec :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-ssrc-validated" signal

+
void                user_function                      (GstRTPDec *gstrtpdec,
+                                                        guint      arg1,
+                                                        guint      arg2,
+                                                        gpointer   user_data)      : Run Last
+

+

+
++ + + + + + + + + + +

gstrtpdec :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "on-timeout" signal

+
void                user_function                      (GstRTPDec *rtpbin,
+                                                        guint      session,
+                                                        guint      ssrc,
+                                                        gpointer   user_data)      : Run Last
+

+Notify of an SSRC that has timed out +

+
++ + + + + + + + + + + + + + + + + + +

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-rtpj2kpay.html b/docs/plugins/html/gst-plugins-good-plugins-rtpj2kpay.html new file mode 100644 index 0000000..a30f6b0 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-rtpj2kpay.html @@ -0,0 +1,171 @@ + + + + +rtpj2kpay + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rtpj2kpay

+

rtpj2kpay — Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)

+
+
+

Synopsis

+
struct              GstRtpJ2KPay;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseRTPPayload
+                     +----GstRtpJ2KPay
+
+
+
+

Properties

+
+  "buffer-list"              gboolean              : Read / Write
+
+
+
+

Description

+

+Payload encode JPEG 2000 pictures into RTP packets according to RFC 5371. +For detailed information see: http://www.rfc-editor.org/rfc/rfc5371.txt +

+

+The payloader takes a JPEG 2000 picture, scans the header for packetization +units and constructs the RTP packet header followed by the actual JPEG 2000 +codestream. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ rtp +

author

Wim Taymans <wim.taymans@gmail.com>

class

Codec/Payloader/Network/RTP
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

image/x-jpc
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)JPEG2000
+
+
+

+

+
+
+

Details

+
+

struct GstRtpJ2KPay

+
struct GstRtpJ2KPay;
+

+

+
+
+
+

Property Details

+
+

The "buffer-list" property

+
  "buffer-list"              gboolean              : Read / Write
+

Use Buffer Lists.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-rtpjpegpay.html b/docs/plugins/html/gst-plugins-good-plugins-rtpjpegpay.html new file mode 100644 index 0000000..53eb9dd --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-rtpjpegpay.html @@ -0,0 +1,196 @@ + + + + +rtpjpegpay + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rtpjpegpay

+

rtpjpegpay — Payload-encodes JPEG pictures into RTP packets (RFC 2435)

+
+
+

Synopsis

+
struct              GstRtpJPEGPay;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseRTPPayload
+                     +----GstRtpJPEGPay
+
+
+
+

Properties

+
+  "quality"                  gint                  : Read / Write
+  "type"                     gint                  : Read / Write
+  "buffer-list"              gboolean              : Read / Write
+
+
+
+

Description

+

+Payload encode JPEG pictures into RTP packets according to RFC 2435. +For detailed information see: http://www.rfc-editor.org/rfc/rfc2435.txt +

+

+The payloader takes a JPEG picture, scans the header for quantization +tables (if needed) and constructs the RTP packet header followed by +the actual JPEG entropy scan. +

+

+The payloader assumes that correct width and height is found in the caps. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ rtp +

author

Axis Communications <dev-gstreamer@axis.com>

class

Codec/Payloader/Network/RTP
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

image/jpeg

video/x-jpeg
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

application/x-rtp, media=(string)video, payload=(int)26, clock-rate=(int)90000, encoding-name=(string)JPEG
+
+
+

+

+
+
+

Details

+
+

struct GstRtpJPEGPay

+
struct GstRtpJPEGPay;
+

+

+
+
+
+

Property Details

+
+

The "quality" property

+
  "quality"                  gint                  : Read / Write
+

Quality factor on JPEG data (unused).

+

Allowed values: [0,255]

+

Default value: 255

+
+
+
+

The "type" property

+
  "type"                     gint                  : Read / Write
+

Default JPEG Type, overwritten by SOF when present.

+

Allowed values: [0,255]

+

Default value: 1

+
+
+
+

The "buffer-list" property

+
  "buffer-list"              gboolean              : Read / Write
+

Use Buffer Lists.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-rtspsrc.html b/docs/plugins/html/gst-plugins-good-plugins-rtspsrc.html new file mode 100644 index 0000000..a4f30f6 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-rtspsrc.html @@ -0,0 +1,343 @@ + + + + +rtspsrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

rtspsrc

+

rtspsrc — Receive data over the network via RTSP (RFC 2326)

+
+
+

Synopsis

+
struct              GstRTSPSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBin
+                     +----GstRTSPSrc
+
+
+
+

Implemented Interfaces

+

+GstRTSPSrc implements + GstChildProxy and GstURIHandler.

+
+
+

Properties

+
+  "debug"                    gboolean              : Read / Write
+  "location"                 gchar*                : Read / Write
+  "protocols"                GstRTSPLowerTrans     : Read / Write
+  "retry"                    guint                 : Read / Write
+  "timeout"                  guint64               : Read / Write
+  "latency"                  guint                 : Read / Write
+  "tcp-timeout"              guint64               : Read / Write
+  "connection-speed"         guint                 : Read / Write
+  "nat-method"               GstRTSPNatMethod      : Read / Write
+  "do-rtcp"                  gboolean              : Read / Write
+  "proxy"                    gchar*                : Read / Write
+  "rtp-blocksize"            guint                 : Read / Write
+  "user-id"                  gchar*                : Read / Write
+  "user-pw"                  gchar*                : Read / Write
+  "buffer-mode"              GstRTSPSrcBufferMode  : Read / Write
+  "port-range"               gchar*                : Read / Write
+  "udp-buffer-size"          gint                  : Read / Write
+  "short-header"             gboolean              : Read / Write
+
+
+
+

Description

+

+Makes a connection to an RTSP server and read the data. +rtspsrc strictly follows RFC 2326 and therefore does not (yet) support +RealMedia/Quicktime/Microsoft extensions. +

+

+RTSP supports transport over TCP or UDP in unicast or multicast mode. By +default rtspsrc will negotiate a connection in the following order: +UDP unicast/UDP multicast/TCP. The order cannot be changed but the allowed +protocols can be controlled with the "protocols" property. +

+

+rtspsrc currently understands SDP as the format of the session description. +For each stream listed in the SDP a new rtp_streamd pad will be created +with caps derived from the SDP media description. This is a caps of mime type +"application/x-rtp" that can be connected to any available RTP depayloader +element. +

+

+rtspsrc will internally instantiate an RTP session manager element +that will handle the RTCP messages to and from the server, jitter removal, +packet reordering along with providing a clock for the pipeline. +This feature is implemented using the gstrtpbin element. +

+

+rtspsrc acts like a live source and will therefore only generate data in the +PLAYING state. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch rtspsrc location=rtsp://some.server/url ! fakesink
+
+ Establish a connection to an RTSP server and send the raw RTP packets to a +fakesink. +
+

+

+

+Last reviewed on 2006-08-18 (0.10.5) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ rtsp +

author

Wim Taymans <wim@fluendo.com>, Thijs Vermeir <thijs.vermeir@barco.com>, Lutz Mueller <lutz@topfrose.de>

class

Source/Network
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

stream%d

direction

source

presence

sometimes

details

application/x-rtp

application/x-rdt
+
+
+

+

+
+
+

Details

+
+

struct GstRTSPSrc

+
struct GstRTSPSrc;
+

+

+
+
+
+

Property Details

+
+

The "debug" property

+
  "debug"                    gboolean              : Read / Write
+

Dump request and response messages to stdout.

+

Default value: FALSE

+
+
+
+

The "location" property

+
  "location"                 gchar*                : Read / Write
+

Location of the RTSP url to read.

+

Default value: NULL

+
+
+
+

The "protocols" property

+
  "protocols"                GstRTSPLowerTrans     : Read / Write
+

Allowed lower transport protocols.

+

Default value: GST_RTSP_LOWER_TRANS_UDP|GST_RTSP_LOWER_TRANS_UDP_MCAST|GST_RTSP_LOWER_TRANS_TCP

+
+
+
+

The "retry" property

+
  "retry"                    guint                 : Read / Write
+

Max number of retries when allocating RTP ports.

+

Allowed values: <= 65535

+

Default value: 20

+
+
+
+

The "timeout" property

+
  "timeout"                  guint64               : Read / Write
+

Retry TCP transport after UDP timeout microseconds (0 = disabled).

+

Default value: 5000000

+
+
+
+

The "latency" property

+
  "latency"                  guint                 : Read / Write
+

Amount of ms to buffer.

+

Default value: 2000

+
+
+
+

The "tcp-timeout" property

+
  "tcp-timeout"              guint64               : Read / Write
+

Fail after timeout microseconds on TCP connections (0 = disabled).

+

Default value: 20000000

+
+
+
+

The "connection-speed" property

+
  "connection-speed"         guint                 : Read / Write
+

Network connection speed in kbps (0 = unknown).

+

Allowed values: <= 2147483

+

Default value: 0

+
+
+
+

The "nat-method" property

+
  "nat-method"               GstRTSPNatMethod      : Read / Write
+

Method to use for traversing firewalls and NAT.

+

Default value: Send Dummy packets

+
+
+
+

The "do-rtcp" property

+
  "do-rtcp"                  gboolean              : Read / Write
+

Send RTCP packets, disable for old incompatible server.

+

Default value: TRUE

+
+
+
+

The "proxy" property

+
  "proxy"                    gchar*                : Read / Write
+

Proxy settings for HTTP tunneling. Format: [http://][user:passwd@]host[:port].

+

Default value: NULL

+
+
+
+

The "rtp-blocksize" property

+
  "rtp-blocksize"            guint                 : Read / Write
+

RTP package size to suggest to server (0 = disabled).

+

Allowed values: <= 65536

+

Default value: 0

+
+
+
+

The "user-id" property

+
  "user-id"                  gchar*                : Read / Write
+

RTSP location URI user id for authentication.

+

Default value: NULL

+
+
+
+

The "user-pw" property

+
  "user-pw"                  gchar*                : Read / Write
+

RTSP location URI user password for authentication.

+

Default value: NULL

+
+
+
+

The "buffer-mode" property

+
  "buffer-mode"              GstRTSPSrcBufferMode  : Read / Write
+

Control the buffering algorithm in use.

+

Default value: Choose mode depending on stream live

+
+
+
+

The "port-range" property

+
  "port-range"               gchar*                : Read / Write
+

Client port range that can be used to receive RTP and RTCP data, eg. 3000-3005 (NULL = no restrictions).

+

Default value: NULL

+
+
+
+

The "udp-buffer-size" property

+
  "udp-buffer-size"          gint                  : Read / Write
+

Size of the kernel UDP receive buffer in bytes, 0=default.

+

Allowed values: >= 0

+

Default value: 524288

+
+
+
+

The "short-header" property

+
  "short-header"             gboolean              : Read / Write
+

Only send the basic RTSP headers for broken encoders.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-shagadelictv.html b/docs/plugins/html/gst-plugins-good-plugins-shagadelictv.html new file mode 100644 index 0000000..7b58864 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-shagadelictv.html @@ -0,0 +1,167 @@ + + + + +shagadelictv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

shagadelictv

+

shagadelictv — Oh behave, ShagedelicTV makes images shagadelic!

+
+
+

Synopsis

+
struct              GstShagadelicTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstShagadelicTV
+
+
+
+

Description

+

+Oh behave, ShagedelicTV makes images shagadelic! +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! shagadelictv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of shagadelictv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstShagadelicTV

+
struct GstShagadelicTV;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-shapewipe.html b/docs/plugins/html/gst-plugins-good-plugins-shapewipe.html new file mode 100644 index 0000000..9a0b7fe --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-shapewipe.html @@ -0,0 +1,257 @@ + + + + +shapewipe + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

shapewipe

+

shapewipe — Adds a shape wipe transition to a video stream

+
+
+

Synopsis

+
struct              GstShapeWipe;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstShapeWipe
+
+
+
+

Properties

+
+  "border"                   gfloat                : Read / Write
+  "position"                 gfloat                : Read / Write
+
+
+
+

Description

+

+The shapewipe element provides custom transitions on video streams +based on a grayscale bitmap. The state of the transition can be +controlled by the position property and an optional blended border +can be added by the border property. +

+

+Transition bitmaps can be downloaded from the +Cinelerra transition +page. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! shapewipe position=0.5 name=shape ! videomixer name=mixer ! ffmpegcolorspace ! autovideosink     filesrc location=mask.png ! typefind ! decodebin2 ! ffmpegcolorspace ! videoscale ! queue ! shape.mask_sink    videotestsrc pattern=snow ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! queue ! mixer.
+
+ This pipeline adds the transition from mask.png with position 0.5 to an SMPTE test screen and snow. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ shapewipe +

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Editor/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

mask_sink

direction

sink

presence

always

details

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)0/1

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)0/1
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

video_sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstShapeWipe

+
struct GstShapeWipe;
+

+

+
+
+
+

Property Details

+
+

The "border" property

+
  "border"                   gfloat                : Read / Write
+

Border of the mask.

+

Allowed values: [0,1]

+

Default value: 0

+
+
+
+

The "position" property

+
  "position"                 gfloat                : Read / Write
+

Position of the mask.

+

Allowed values: [0,1]

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-smokedec.html b/docs/plugins/html/gst-plugins-good-plugins-smokedec.html new file mode 100644 index 0000000..ce0aa17 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-smokedec.html @@ -0,0 +1,144 @@ + + + + +smokedec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

smokedec

+

smokedec — Decode video from Smoke format

+
+
+

Synopsis

+
struct              GstSmokeDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstSmokeDec
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ jpeg +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-smoke, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstSmokeDec

+
struct GstSmokeDec;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-smokeenc.html b/docs/plugins/html/gst-plugins-good-plugins-smokeenc.html new file mode 100644 index 0000000..7aa47b2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-smokeenc.html @@ -0,0 +1,189 @@ + + + + +smokeenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

smokeenc

+

smokeenc — Encode images into the Smoke format

+
+
+

Synopsis

+
struct              GstSmokeEnc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstSmokeEnc
+
+
+
+

Properties

+
+  "keyframe"                 gint                  : Read / Write
+  "qmax"                     gint                  : Read / Write
+  "qmin"                     gint                  : Read / Write
+  "threshold"                gint                  : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ jpeg +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Encoder/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-smoke, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstSmokeEnc

+
struct GstSmokeEnc;
+

+

+
+
+
+

Property Details

+
+

The "keyframe" property

+
  "keyframe"                 gint                  : Read / Write
+

Insert keyframe every N frames.

+

Allowed values: [1,100000]

+

Default value: 20

+
+
+
+

The "qmax" property

+
  "qmax"                     gint                  : Read / Write
+

Maximum quality.

+

Allowed values: [0,100]

+

Default value: 85

+
+
+
+

The "qmin" property

+
  "qmin"                     gint                  : Read / Write
+

Minimum quality.

+

Allowed values: [0,100]

+

Default value: 10

+
+
+
+

The "threshold" property

+
  "threshold"                gint                  : Read / Write
+

Motion estimation threshold.

+

Allowed values: [0,100000000]

+

Default value: 3000

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-smpte.html b/docs/plugins/html/gst-plugins-good-plugins-smpte.html new file mode 100644 index 0000000..1ad224b --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-smpte.html @@ -0,0 +1,256 @@ + + + + +smpte + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

smpte

+

smpte — Apply the standard SMPTE transitions on video images

+
+
+

Synopsis

+
struct              GstSMPTE;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstSMPTE
+
+
+
+

Properties

+
+  "border"                   gint                  : Read / Write
+  "depth"                    gint                  : Read / Write
+  "fps"                      gfloat                : Read / Write
+  "type"                     GstSMPTETransitionType  : Read / Write
+  "duration"                 guint64               : Read / Write
+  "invert"                   gboolean              : Read / Write
+
+
+
+

Description

+

+smpte can accept I420 video streams with the same width, height and +framerate. The two incomming buffers are blended together using an effect +specific alpha mask. +

+

+The "depth" property defines the presision in bits of the mask. A +higher presision will create a mask with smoother gradients in order to avoid +banding. +

+

+

+
+

Sample pipelines

+
+ + + + + + + +
1
gst-launch -v videotestsrc pattern=1 ! smpte name=s border=20000 type=234 duration=2000000000 ! ffmpegcolorspace ! ximagesink videotestsrc ! s.
+
+ A pipeline to demonstrate the smpte transition. +It shows a pinwheel transition a from a snow videotestsrc to an smpte +pattern videotestsrc. The transition will take 2 seconds to complete. The +edges of the transition are smoothed with a 20000 big border. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ smpte +

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Editor/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink1

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

sink2

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstSMPTE

+
struct GstSMPTE;
+

+

+
+
+
+

Property Details

+
+

The "border" property

+
  "border"                   gint                  : Read / Write
+

The border width of the transition.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "depth" property

+
  "depth"                    gint                  : Read / Write
+

Depth of the mask in bits.

+

Allowed values: [1,24]

+

Default value: 16

+
+
+
+

The "fps" property

+
  "fps"                      gfloat                : Read / Write
+

Frames per second if no input files are given (deprecated).

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "type" property

+
  "type"                     GstSMPTETransitionType  : Read / Write
+

The type of transition to use.

+

Default value: A bar moves from left to right

+
+
+
+

The "duration" property

+
  "duration"                 guint64               : Read / Write
+

Duration of the transition effect in nanoseconds.

+

Default value: 1000000000

+
+
+
+

The "invert" property

+
  "invert"                   gboolean              : Read / Write
+

Invert transition mask.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-smptealpha.html b/docs/plugins/html/gst-plugins-good-plugins-smptealpha.html new file mode 100644 index 0000000..1fe0e50 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-smptealpha.html @@ -0,0 +1,276 @@ + + + + +smptealpha + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

smptealpha

+

smptealpha — Apply the standard SMPTE transitions as alpha on video images

+
+
+

Synopsis

+
struct              GstSMPTEAlpha;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstSMPTEAlpha
+
+
+
+

Properties

+
+  "border"                   gint                  : Read / Write
+  "depth"                    gint                  : Read / Write
+  "position"                 gdouble               : Read / Write
+  "type"                     GstSMPTEAlphaTransitionType  : Read / Write
+  "invert"                   gboolean              : Read / Write
+
+
+
+

Description

+

+smptealpha can accept an I420 or AYUV video stream. An alpha channel is added +using an effect specific SMPTE mask in the I420 input case. In the AYUV case, +the alpha channel is modified using the effect specific SMPTE mask. +

+

+The "position" property is a controllabe double between 0.0 and +1.0 that specifies the position in the transition. 0.0 is the start of the +transition with the alpha channel to complete opaque where 1.0 has the alpha +channel set to completely transparent. +

+

+The "depth" property defines the precision in bits of the mask. +A higher presision will create a mask with smoother gradients in order to +avoid banding. +

+

+

+
+

Sample pipelines

+

+Here is a pipeline to demonstrate the smpte transition : +

+
+gst-launch -v videotestsrc ! smptealpha border=20000 type=44
+position=0.5 ! videomixer ! ffmpegcolorspace ! ximagesink 
+
+

+This shows a midway bowtie-h transition a from a videotestsrc to a +transparent image. The edges of the transition are smoothed with a +20000 big border. +

+
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ smpte +

author

Wim Taymans <wim.taymans@gmail.com>

class

Filter/Editor/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstSMPTEAlpha

+
struct GstSMPTEAlpha;
+

+

+
+
+
+

Property Details

+
+

The "border" property

+
  "border"                   gint                  : Read / Write
+

The border width of the transition.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "depth" property

+
  "depth"                    gint                  : Read / Write
+

Depth of the mask in bits.

+

Allowed values: [1,24]

+

Default value: 16

+
+
+
+

The "position" property

+
  "position"                 gdouble               : Read / Write
+

Position of the transition effect.

+

Allowed values: [0,1]

+

Default value: 0

+
+
+
+

The "type" property

+
  "type"                     GstSMPTEAlphaTransitionType  : Read / Write
+

The type of transition to use.

+

Default value: A bar moves from left to right

+
+
+
+

The "invert" property

+
  "invert"                   gboolean              : Read / Write
+

+Set to TRUE to invert the transition mask (ie. flip it horizontally). +

+

Default value: FALSE

+

Since 0.10.23

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-souphttpsrc.html b/docs/plugins/html/gst-plugins-good-plugins-souphttpsrc.html new file mode 100644 index 0000000..574b21e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-souphttpsrc.html @@ -0,0 +1,277 @@ + + + + +souphttpsrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

souphttpsrc

+

souphttpsrc — Receive data as a client over the network via HTTP using SOUP

+
+
+

Synopsis

+
struct              GstSoupHTTPSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstSoupHTTPSrc
+
+
+
+

Implemented Interfaces

+

+GstSoupHTTPSrc implements + GstURIHandler.

+
+
+

Properties

+
+  "automatic-redirect"       gboolean              : Read / Write
+  "cookies"                  GStrv                 : Read / Write
+  "iradio-genre"             gchar*                : Read
+  "iradio-mode"              gboolean              : Read / Write
+  "iradio-name"              gchar*                : Read
+  "iradio-title"             gchar*                : Read
+  "iradio-url"               gchar*                : Read
+  "location"                 gchar*                : Read / Write
+  "proxy"                    gchar*                : Read / Write
+  "user-agent"               gchar*                : Read / Write
+  "is-live"                  gboolean              : Read / Write
+  "proxy-id"                 gchar*                : Read / Write
+  "proxy-pw"                 gchar*                : Read / Write
+  "user-id"                  gchar*                : Read / Write
+  "user-pw"                  gchar*                : Read / Write
+  "extra-headers"            GstStructure*         : Read / Write
+  "timeout"                  guint                 : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ soup +

author

Wouter Cloetens <wouter@mind.be>

class

Source/Network
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstSoupHTTPSrc

+
struct GstSoupHTTPSrc;
+

+

+
+
+
+

Property Details

+
+

The "automatic-redirect" property

+
  "automatic-redirect"       gboolean              : Read / Write
+

Automatically follow HTTP redirects (HTTP Status Code 3xx).

+

Default value: TRUE

+
+
+
+

The "cookies" property

+
  "cookies"                  GStrv                 : Read / Write
+

HTTP request cookies.

+
+
+
+

The "iradio-genre" property

+
  "iradio-genre"             gchar*                : Read
+

Genre of the stream.

+

Default value: NULL

+
+
+
+

The "iradio-mode" property

+
  "iradio-mode"              gboolean              : Read / Write
+

Enable internet radio mode (extraction of shoutcast/icecast metadata).

+

Default value: FALSE

+
+
+
+

The "iradio-name" property

+
  "iradio-name"              gchar*                : Read
+

Name of the stream.

+

Default value: NULL

+
+
+
+

The "iradio-title" property

+
  "iradio-title"             gchar*                : Read
+

Name of currently playing song.

+

Default value: NULL

+
+
+
+

The "iradio-url" property

+
  "iradio-url"               gchar*                : Read
+

Homepage URL for radio stream.

+

Default value: NULL

+
+
+
+

The "location" property

+
  "location"                 gchar*                : Read / Write
+

Location to read from.

+

Default value: ""

+
+
+
+

The "proxy" property

+
  "proxy"                    gchar*                : Read / Write
+

HTTP proxy server URI.

+

Default value: ""

+
+
+
+

The "user-agent" property

+
  "user-agent"               gchar*                : Read / Write
+

Value of the User-Agent HTTP request header field.

+

Default value: "GStreamer souphttpsrc "

+
+
+
+

The "is-live" property

+
  "is-live"                  gboolean              : Read / Write
+

Act like a live source.

+

Default value: FALSE

+
+
+
+

The "proxy-id" property

+
  "proxy-id"                 gchar*                : Read / Write
+

HTTP proxy URI user id for authentication.

+

Default value: ""

+
+
+
+

The "proxy-pw" property

+
  "proxy-pw"                 gchar*                : Read / Write
+

HTTP proxy URI user password for authentication.

+

Default value: ""

+
+
+
+

The "user-id" property

+
  "user-id"                  gchar*                : Read / Write
+

HTTP location URI user id for authentication.

+

Default value: ""

+
+
+
+

The "user-pw" property

+
  "user-pw"                  gchar*                : Read / Write
+

HTTP location URI user password for authentication.

+

Default value: ""

+
+
+
+

The "extra-headers" property

+
  "extra-headers"            GstStructure*         : Read / Write
+

Extra headers to append to the HTTP request.

+
+
+
+

The "timeout" property

+
  "timeout"                  guint                 : Read / Write
+

Value in seconds to timeout a blocking I/O (0 = No timeout).

+

Allowed values: <= 3600

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-spectrum.html b/docs/plugins/html/gst-plugins-good-plugins-spectrum.html new file mode 100644 index 0000000..b8cc22c --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-spectrum.html @@ -0,0 +1,576 @@ + + + + +spectrum + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

spectrum

+

spectrum — Run an FFT on the audio signal, output spectrum data

+
+
+

Synopsis

+
struct              GstSpectrum;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstAudioFilter
+                           +----GstSpectrum
+
+
+
+

Properties

+
+  "bands"                    guint                 : Read / Write
+  "interval"                 guint64               : Read / Write
+  "message"                  gboolean              : Read / Write
+  "threshold"                gint                  : Read / Write
+  "message-magnitude"        gboolean              : Read / Write
+  "message-phase"            gboolean              : Read / Write
+  "post-messages"            gboolean              : Read / Write
+  "multi-channel"            gboolean              : Read / Write
+
+
+
+

Description

+

+The Spectrum element analyzes the frequency spectrum of an audio signal. +If the "post-messages" property is TRUE, it sends analysis results +as application messages named +"spectrum" after each interval of time given +by the "interval" property. +

+

+The message's structure contains some combination of these fields: +

+
    +
  • + GstClockTime + "timestamp": + the timestamp of the buffer that triggered the message. +

  • +
  • + GstClockTime + "stream-time": + the stream time of the buffer. +

  • +
  • + GstClockTime + "running-time": + the running_time of the buffer. +

  • +
  • + GstClockTime + "duration": + the duration of the buffer. +

  • +
  • + GstClockTime + "endtime": + the end time of the buffer that triggered the message as stream time (this + is deprecated, as it can be calculated from stream-time + duration) +

  • +
  • + GstValueList of gfloat + "magnitude": + the level for each frequency band in dB. All values below the value of the + "threshold" property will be set to the threshold. Only present + if the "message-magnitude" property is TRUE. +

  • +
  • + GstValueList of gfloat + "phase": + The phase for each frequency band. The value is between -pi and pi. Only + present if the "message-phase" property is TRUE. +

  • +
+

+

+

+If "multi-channel" property is set to true. magnitude and phase +fields will be each a nested GstValueArray. The first dimension are the +channels and the second dimension are the values. +

+

+

+
+

Example application

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
/* GStreamer
+ * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
+ * Copyright (C) 2008 Jan Schmidt <jan.schmidt@sun.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 <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <gst/gst.h>
+
+static guint spect_bands = 20;
+
+#define AUDIOFREQ 32000
+
+/* receive spectral data from element message */
+static gboolean
+message_handler (GstBus * bus, GstMessage * message, gpointer data)
+{
+  if (message->type == GST_MESSAGE_ELEMENT) {
+    const GstStructure *s = gst_message_get_structure (message);
+    const gchar *name = gst_structure_get_name (s);
+    GstClockTime endtime;
+
+    if (strcmp (name, "spectrum") == 0) {
+      const GValue *magnitudes;
+      const GValue *phases;
+      const GValue *mag, *phase;
+      gdouble freq;
+      guint i;
+
+      if (!gst_structure_get_clock_time (s, "endtime", &endtime))
+        endtime = GST_CLOCK_TIME_NONE;
+
+      g_print ("New spectrum message, endtime %" GST_TIME_FORMAT "\n",
+          GST_TIME_ARGS (endtime));
+
+      magnitudes = gst_structure_get_value (s, "magnitude");
+      phases = gst_structure_get_value (s, "phase");
+
+      for (i = 0; i < spect_bands; ++i) {
+        freq = (gdouble) ((AUDIOFREQ / 2) * i + AUDIOFREQ / 4) / spect_bands;
+        mag = gst_value_list_get_value (magnitudes, i);
+        phase = gst_value_list_get_value (phases, i);
+
+        if (mag != NULL && phase != NULL) {
+          g_print ("band %d (freq %g): magnitude %f dB phase %f\n", i, freq,
+              g_value_get_float (mag), g_value_get_float (phase));
+        }
+      }
+      g_print ("\n");
+    }
+  }
+  return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+  GstElement *bin;
+  GstElement *src, *audioconvert, *spectrum, *sink;
+  GstBus *bus;
+  GstCaps *caps;
+  GMainLoop *loop;
+
+  gst_init (&argc, &argv);
+
+  bin = gst_pipeline_new ("bin");
+
+  src = gst_element_factory_make ("audiotestsrc", "src");
+  g_object_set (G_OBJECT (src), "wave", 0, "freq", 6000.0, NULL);
+  audioconvert = gst_element_factory_make ("audioconvert", NULL);
+  g_assert (audioconvert);
+
+  spectrum = gst_element_factory_make ("spectrum", "spectrum");
+  g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,
+      "message", TRUE, "message-phase", TRUE, NULL);
+
+  sink = gst_element_factory_make ("fakesink", "sink");
+  g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+
+  gst_bin_add_many (GST_BIN (bin), src, audioconvert, spectrum, sink, NULL);
+
+  caps = gst_caps_new_simple ("audio/x-raw-int",
+      "rate", G_TYPE_INT, AUDIOFREQ, NULL);
+
+  if (!gst_element_link (src, audioconvert) ||
+      !gst_element_link_filtered (audioconvert, spectrum, caps) ||
+      !gst_element_link (spectrum, sink)) {
+    fprintf (stderr, "can't link elements\n");
+    exit (1);
+  }
+  gst_caps_unref (caps);
+
+  bus = gst_element_get_bus (bin);
+  gst_bus_add_watch (bus, message_handler, NULL);
+  gst_object_unref (bus);
+
+  gst_element_set_state (bin, GST_STATE_PLAYING);
+
+  /* we need to run a GLib main loop to get the messages */
+  loop = g_main_loop_new (NULL, FALSE);
+  g_main_loop_run (loop);
+
+  gst_element_set_state (bin, GST_STATE_NULL);
+
+  gst_object_unref (bin);
+
+  return 0;
+}
+
+ +
+

+

+

+Last reviewed on 2011-03-10 (0.10.29) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ spectrum +

author

Erik Walthinsen <omega@cse.ogi.edu>, Stefan Kost <ensonic@users.sf.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Analyzer/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+

+

+
+
+

Details

+
+

struct GstSpectrum

+
struct GstSpectrum;
+

+

+
+
+
+

Property Details

+
+

The "bands" property

+
  "bands"                    guint                 : Read / Write
+

Number of frequency bands.

+

Default value: 128

+
+
+
+

The "interval" property

+
  "interval"                 guint64               : Read / Write
+

Interval of time between message posts (in nanoseconds).

+

Allowed values: >= 1

+

Default value: 100000000

+
+
+
+

The "message" property

+
  "message"                  gboolean              : Read / Write
+

Whether to post a 'spectrum' element message on the bus for each passed interval (deprecated, use post-messages).

+

Default value: TRUE

+
+
+
+

The "threshold" property

+
  "threshold"                gint                  : Read / Write
+

dB threshold for result. All lower values will be set to this.

+

Allowed values: <= 0

+

Default value: -60

+
+
+
+

The "message-magnitude" property

+
  "message-magnitude"        gboolean              : Read / Write
+

Whether to add a 'magnitude' field to the structure of any 'spectrum' element messages posted on the bus.

+

Default value: TRUE

+
+
+
+

The "message-phase" property

+
  "message-phase"            gboolean              : Read / Write
+

Whether to add a 'phase' field to the structure of any 'spectrum' element messages posted on the bus.

+

Default value: FALSE

+
+
+
+

The "post-messages" property

+
  "post-messages"            gboolean              : Read / Write
+

+Post messages on the bus with spectrum information. +

+

Default value: TRUE

+

Since 0.10.17

+
+
+
+

The "multi-channel" property

+
  "multi-channel"            gboolean              : Read / Write
+

+Send separate results for each channel +

+

Default value: FALSE

+

Since 0.10.29

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-speexdec.html b/docs/plugins/html/gst-plugins-good-plugins-speexdec.html new file mode 100644 index 0000000..23b3804 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-speexdec.html @@ -0,0 +1,162 @@ + + + + +speexdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

speexdec

+

speexdec — decode speex streams to audio

+
+
+

Synopsis

+
struct              GstSpeexDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstAudioDecoder
+                     +----GstSpeexDec
+
+
+
+

Properties

+
+  "enh"                      gboolean              : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ speex +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-speex
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16
+
+
+

+

+
+
+

Details

+
+

struct GstSpeexDec

+
struct GstSpeexDec;
+

+

+
+
+
+

Property Details

+
+

The "enh" property

+
  "enh"                      gboolean              : Read / Write
+

Enable perceptual enhancement.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-speexenc.html b/docs/plugins/html/gst-plugins-good-plugins-speexenc.html new file mode 100644 index 0000000..ed62694 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-speexenc.html @@ -0,0 +1,247 @@ + + + + +speexenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

speexenc

+

speexenc — Encodes audio in Speex format

+
+
+

Synopsis

+
struct              GstSpeexEnc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstAudioEncoder
+                     +----GstSpeexEnc
+
+
+
+

Implemented Interfaces

+

+GstSpeexEnc implements + GstTagSetter and GstPreset.

+
+
+

Properties

+
+  "abr"                      gint                  : Read / Write / Construct
+  "bitrate"                  gint                  : Read / Write / Construct
+  "complexity"               gint                  : Read / Write / Construct
+  "dtx"                      gboolean              : Read / Write / Construct
+  "last-message"             gchar*                : Read
+  "nframes"                  gint                  : Read / Write / Construct
+  "quality"                  gfloat                : Read / Write / Construct
+  "vad"                      gboolean              : Read / Write / Construct
+  "vbr"                      gboolean              : Read / Write / Construct
+  "mode"                     GstSpeexEncMode       : Read / Write / Construct
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ speex +

author

Wim Taymans <wim@fluendo.com>

class

Codec/Encoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-speex, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ]
+
+
+

+

+
+
+

Details

+
+

struct GstSpeexEnc

+
struct GstSpeexEnc;
+

+

+
+
+
+

Property Details

+
+

The "abr" property

+
  "abr"                      gint                  : Read / Write / Construct
+

Enable average bit-rate (0 = disabled).

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "bitrate" property

+
  "bitrate"                  gint                  : Read / Write / Construct
+

Specify an encoding bit-rate (in bps). (0 = automatic).

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "complexity" property

+
  "complexity"               gint                  : Read / Write / Construct
+

Set encoding complexity.

+

Allowed values: >= 0

+

Default value: 3

+
+
+
+

The "dtx" property

+
  "dtx"                      gboolean              : Read / Write / Construct
+

Enable discontinuous transmission.

+

Default value: FALSE

+
+
+
+

The "last-message" property

+
  "last-message"             gchar*                : Read
+

The last status message.

+

Default value: NULL

+
+
+
+

The "nframes" property

+
  "nframes"                  gint                  : Read / Write / Construct
+

Number of frames per buffer.

+

Allowed values: >= 0

+

Default value: 1

+
+
+
+

The "quality" property

+
  "quality"                  gfloat                : Read / Write / Construct
+

Encoding quality.

+

Allowed values: [0,10]

+

Default value: 8

+
+
+
+

The "vad" property

+
  "vad"                      gboolean              : Read / Write / Construct
+

Enable voice activity detection.

+

Default value: FALSE

+
+
+
+

The "vbr" property

+
  "vbr"                      gboolean              : Read / Write / Construct
+

Enable variable bit-rate.

+

Default value: FALSE

+
+
+
+

The "mode" property

+
  "mode"                     GstSpeexEncMode       : Read / Write / Construct
+

The encoding mode.

+

Default value: Auto

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-splitfilesrc.html b/docs/plugins/html/gst-plugins-good-plugins-splitfilesrc.html new file mode 100644 index 0000000..229057b --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-splitfilesrc.html @@ -0,0 +1,174 @@ + + + + +splitfilesrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

splitfilesrc

+

splitfilesrc — Read a sequentially named set of files as if it was one large file

+
+
+

Synopsis

+
struct              GstSplitFileSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstSplitFileSrc
+
+
+
+

Properties

+
+  "location"                 gchar*                : Read / Write
+
+
+
+

Description

+

+Reads data from multiple files, presenting those files as one continuous +file to downstream elements. This is useful for reading a large file that +had to be split into multiple parts due to filesystem file size limitations, +for example. +

+

+The files to select are chosen via the location property, which supports +(and expects) shell-style wildcards (but only for the filename, not for +directories). The results will be sorted. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch splitfilesrc location="/path/to/part-*.mpg" ! decodebin ! ... \
+
+ Plays the different parts as if they were one single MPEG file. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ multifile +

author

Tim-Philipp Müller <tim.muller@collabora.co.uk>

class

Source/File
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstSplitFileSrc

+
struct GstSplitFileSrc;
+

+

+
+
+
+

Property Details

+
+

The "location" property

+
  "location"                 gchar*                : Read / Write
+

Wildcard pattern to match file names of the input files. If the location is an absolute path or contains directory components, only the base file name part will be considered for pattern matching. The results will be sorted.

+

Default value: NULL

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-streaktv.html b/docs/plugins/html/gst-plugins-good-plugins-streaktv.html new file mode 100644 index 0000000..740e41e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-streaktv.html @@ -0,0 +1,208 @@ + + + + +streaktv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

streaktv

+

streaktv — StreakTV makes after images of moving objects

+
+
+

Synopsis

+
struct              GstStreakTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstStreakTV
+
+
+
+

Properties

+
+  "feedback"                 gboolean              : Read / Write
+
+
+
+

Description

+

+StreakTV makes after images of moving objects. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! streaktv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of streaktv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstStreakTV

+
struct GstStreakTV;
+

+

+
+
+
+

Property Details

+
+

The "feedback" property

+
  "feedback"                 gboolean              : Read / Write
+

Feedback.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-taginject.html b/docs/plugins/html/gst-plugins-good-plugins-taginject.html new file mode 100644 index 0000000..e7076e8 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-taginject.html @@ -0,0 +1,196 @@ + + + + +taginject + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

taginject

+

taginject — inject metadata tags

+
+
+

Synopsis

+
struct              GstTagInject;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstTagInject
+
+
+
+

Properties

+
+  "tags"                     gchar*                : Write
+
+
+
+

Description

+

+Element that injects new metadata tags, but passes incomming data through +unmodified. +

+

+

+
+

Example launch lines

+
+ + + + + + + +
1
gst-launch audiotestsrc num-buffers=100 ! taginject tags="title=testsrc,artist=gstreamer" ! vorbisenc ! oggmux ! filesink location=test.ogg
+
+ set title and artist +
+ + + + + + + +
1
gst-launch audiotestsrc num-buffers=100 ! taginject tags="keywords=\{\"testone\",\"audio\"\},title=\"audio testtone\"" ! vorbisenc ! oggmux ! filesink location=test.ogg
+
+ set keywords and title demonstrating quoting of special chars and handling lists +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ debug +

author

Stefan Kost <ensonic@users.sf.net>

class

Generic
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstTagInject

+
struct GstTagInject;
+

+Opaque GstTagInject data structure +

+
+
+
+

Property Details

+
+

The "tags" property

+
  "tags"                     gchar*                : Write
+

List of tags to inject into the target file.

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-udpsink.html b/docs/plugins/html/gst-plugins-good-plugins-udpsink.html new file mode 100644 index 0000000..f67550a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-udpsink.html @@ -0,0 +1,185 @@ + + + + +udpsink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

udpsink

+

udpsink — Send data over the network via UDP

+
+
+

Synopsis

+
struct              GstUDPSink;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSink
+                     +----GstMultiUDPSink
+                           +----GstUDPSink
+
+
+
+

Implemented Interfaces

+

+GstUDPSink implements + GstURIHandler.

+
+
+

Properties

+
+  "host"                     gchar*                : Read / Write
+  "port"                     gint                  : Read / Write
+
+
+
+

Description

+

+udpsink is a network sink that sends UDP packets to the network. +It can be combined with RTP payloaders to implement RTP streaming. +

+

+

+
+

Examples

+
+ + + + + + + +
1
gst-launch -v audiotestsrc ! udpsink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ udp +

author

Wim Taymans <wim@fluendo.com>

class

Sink/Network
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstUDPSink

+
struct GstUDPSink;
+

+

+
+
+
+

Property Details

+
+

The "host" property

+
  "host"                     gchar*                : Read / Write
+

The host/IP/Multicast group to send the packets to.

+

Default value: "localhost"

+
+
+
+

The "port" property

+
  "port"                     gint                  : Read / Write
+

The port to send the packets to.

+

Allowed values: [0,65535]

+

Default value: 4951

+
+
+
+

See Also

+udpsrc, multifdsink +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-udpsrc.html b/docs/plugins/html/gst-plugins-good-plugins-udpsrc.html new file mode 100644 index 0000000..1efdf39 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-udpsrc.html @@ -0,0 +1,370 @@ + + + + +udpsrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

udpsrc

+

udpsrc — Receive data over the network via UDP

+
+
+

Synopsis

+
struct              GstUDPSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstUDPSrc
+
+
+
+

Implemented Interfaces

+

+GstUDPSrc implements + GstURIHandler.

+
+
+

Properties

+
+  "caps"                     GstCaps*              : Read / Write
+  "multicast-group"          gchar*                : Read / Write
+  "port"                     gint                  : Read / Write
+  "uri"                      gchar*                : Read / Write
+  "sockfd"                   gint                  : Read / Write
+  "buffer-size"              gint                  : Read / Write
+  "timeout"                  guint64               : Read / Write
+  "closefd"                  gboolean              : Read / Write
+  "skip-first-bytes"         gint                  : Read / Write
+  "sock"                     gint                  : Read
+  "auto-multicast"           gboolean              : Read / Write
+  "multicast-iface"          gchar*                : Read / Write
+  "reuse"                    gboolean              : Read / Write
+
+
+
+

Description

+

+udpsrc is a network source that reads UDP packets from the network. +It can be combined with RTP depayloaders to implement RTP streaming. +

+

+The udpsrc element supports automatic port allocation by setting the +"port" property to 0. After setting the udpsrc to PAUSED, the +allocated port can be obtained by reading the port property. +

+

+udpsrc can read from multicast groups by setting the "multicast-group" +property to the IP address of the multicast group. +

+

+Alternatively one can provide a custom socket to udpsrc with the "sockfd" +property, udpsrc will then not allocate a socket itself but use the provided +one. +

+

+The "caps" property is mainly used to give a type to the UDP packet +so that they can be autoplugged in GStreamer pipelines. This is very usefull +for RTP implementations where the contents of the UDP packets is transfered +out-of-bounds using SDP or other means. +

+

+The "buffer-size" property is used to change the default kernel +buffersizes used for receiving packets. The buffer size may be increased for +high-volume connections, or may be decreased to limit the possible backlog of +incoming data. The system places an absolute limit on these values, on Linux, +for example, the default buffer size is typically 50K and can be increased to +maximally 100K. +

+

+The "skip-first-bytes" property is used to strip off an arbitrary +number of bytes from the start of the raw udp packet and can be used to strip +off proprietary header, for example. +

+

+The udpsrc is always a live source. It does however not provide a GstClock, +this is left for upstream elements such as an RTP session manager or demuxer +(such as an MPEG demuxer). As with all live sources, the captured buffers +will have their timestamp set to the current running time of the pipeline. +

+

+udpsrc implements a GstURIHandler interface that handles udp://host:port +type URIs. +

+

+If the "timeout" property is set to a value bigger than 0, udpsrc +will generate an element message named +"GstUDPSrcTimeout" +if no data was recieved in the given timeout. +The message's structure contains one field: +

+
  • + guint64 + "timeout": the timeout in microseconds that + expired when waiting for data. +

+

+The message is typically used to detect that no UDP arrives in the receiver +because it is blocked by a firewall. +

+

+A custom file descriptor can be configured with the +"sockfd" property. The socket will be closed when setting the +element to READY by default. This behaviour can be +overriden with the "closefd" property, in which case the application +is responsible for closing the file descriptor. +

+

+

+
+

Examples

+
+ + + + + + + +
1
gst-launch -v udpsrc ! fakesink dump=1
+
+ A pipeline to read from the default port and dump the udp packets. +To actually generate udp packets on the default port one can use the +udpsink element. When running the following pipeline in another terminal, the +above mentioned pipeline should dump data packets to the console. +
+ + + + + + + +
1
gst-launch -v audiotestsrc ! udpsink
+
+ +
+ + + + + + + +
1
gst-launch -v udpsrc port=0 ! fakesink
+
+ read udp packets from a free port. +
+

+

+

+Last reviewed on 2007-09-20 (0.10.7) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ udp +

author

Wim Taymans <wim@fluendo.com>, Thijs Vermeir <thijs.vermeir@barco.com>

class

Source/Network
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

ANY
+
+
+

+

+
+
+

Details

+
+

struct GstUDPSrc

+
struct GstUDPSrc;
+

+

+
+
+
+

Property Details

+
+

The "caps" property

+
  "caps"                     GstCaps*              : Read / Write
+

The caps of the source pad.

+
+
+
+

The "multicast-group" property

+
  "multicast-group"          gchar*                : Read / Write
+

The Address of multicast group to join.

+

Default value: "0.0.0.0"

+
+
+
+

The "port" property

+
  "port"                     gint                  : Read / Write
+

The port to receive the packets from, 0=allocate.

+

Allowed values: [0,65535]

+

Default value: 4951

+
+
+
+

The "uri" property

+
  "uri"                      gchar*                : Read / Write
+

URI in the form of udp://multicast_group:port.

+

Default value: "udp://0.0.0.0:4951"

+
+
+
+

The "sockfd" property

+
  "sockfd"                   gint                  : Read / Write
+

Socket to use for UDP reception. (-1 == allocate).

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "buffer-size" property

+
  "buffer-size"              gint                  : Read / Write
+

Size of the kernel receive buffer in bytes, 0=default.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "timeout" property

+
  "timeout"                  guint64               : Read / Write
+

Post a message after timeout microseconds (0 = disabled).

+

Default value: 0

+
+
+
+

The "closefd" property

+
  "closefd"                  gboolean              : Read / Write
+

Close sockfd if passed as property on state change.

+

Default value: TRUE

+
+
+
+

The "skip-first-bytes" property

+
  "skip-first-bytes"         gint                  : Read / Write
+

number of bytes to skip for each udp packet.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "sock" property

+
  "sock"                     gint                  : Read
+

Socket currently in use for UDP reception. (-1 = no socket).

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "auto-multicast" property

+
  "auto-multicast"           gboolean              : Read / Write
+

Automatically join/leave multicast groups.

+

Default value: TRUE

+
+
+
+

The "multicast-iface" property

+
  "multicast-iface"          gchar*                : Read / Write
+

The network interface on which to join the multicast group.

+

Default value: NULL

+
+
+
+

The "reuse" property

+
  "reuse"                    gboolean              : Read / Write
+

Enable reuse of the port.

+

Default value: TRUE

+
+
+
+

See Also

+udpsink, multifdsink +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-v4l2radio.html b/docs/plugins/html/gst-plugins-good-plugins-v4l2radio.html new file mode 100644 index 0000000..46da1e9 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-v4l2radio.html @@ -0,0 +1,136 @@ + + + + +v4l2radio + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

v4l2radio

+

v4l2radio — Controls a Video4Linux2 radio device

+
+
+

Synopsis

+
struct              GstV4l2Radio;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstV4l2Radio
+
+
+
+

Implemented Interfaces

+

+GstV4l2Radio implements + GstURIHandler, GstImplementsInterface, GstTuner and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "frequency"                gint                  : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ video4linux2 +

author

Alexey Chernov <4ernov@gmail.com>

class

Tuner
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstV4l2Radio

+
struct GstV4l2Radio;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

Video4Linux2 radio device location.

+

Default value: "/dev/radio0"

+
+
+
+

The "frequency" property

+
  "frequency"                gint                  : Read / Write
+

Station frequency in Hz.

+

Allowed values: [87500000,108000000]

+

Default value: 100000000

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html b/docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html new file mode 100644 index 0000000..c0d7a0e --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html @@ -0,0 +1,228 @@ + + + + +v4l2sink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

v4l2sink

+

v4l2sink

+
+
+

Synopsis

+
struct              GstV4l2Sink;
+
+
+
+

Implemented Interfaces

+

+GstV4l2Sink implements + GstImplementsInterface, GstXOverlay, GstNavigation, GstColorBalance, GstVideoOrientation and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "device-fd"                gint                  : Read
+  "device-name"              gchar*                : Read
+  "flags"                    GstV4l2DeviceTypeFlags  : Read
+  "overlay-height"           guint                 : Read / Write
+  "overlay-left"             gint                  : Read / Write
+  "overlay-top"              gint                  : Read / Write
+  "overlay-width"            guint                 : Read / Write
+  "queue-size"               guint                 : Read / Write
+  "brightness"               gint                  : Read / Write
+  "contrast"                 gint                  : Read / Write
+  "hue"                      gint                  : Read / Write
+  "saturation"               gint                  : Read / Write
+  "crop-height"              guint                 : Read / Write
+  "crop-left"                gint                  : Read / Write
+  "crop-top"                 gint                  : Read / Write
+  "crop-width"               guint                 : Read / Write
+  "min-queued-bufs"          guint                 : Read / Write
+
+
+
+

Description

+

+

+
+
+

Details

+
+

struct GstV4l2Sink

+
struct GstV4l2Sink {
+  GstVideoSink videosink;
+};
+
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

Device location.

+

Default value: "/dev/video1"

+
+
+
+

The "device-fd" property

+
  "device-fd"                gint                  : Read
+

File descriptor of the device.

+

Allowed values: >= -1

+

Default value: -1

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Name of the device.

+

Default value: NULL

+
+
+
+

The "flags" property

+
  "flags"                    GstV4l2DeviceTypeFlags  : Read
+

Device type flags.

+
+
+
+

The "overlay-height" property

+
  "overlay-height"           guint                 : Read / Write
+

The height of the video overlay; default is equal to negotiated image height.

+

Default value: 0

+
+
+
+

The "overlay-left" property

+
  "overlay-left"             gint                  : Read / Write
+

The leftmost (x) coordinate of the video overlay; top left corner of screen is 0,0.

+

Default value: 0

+
+
+
+

The "overlay-top" property

+
  "overlay-top"              gint                  : Read / Write
+

The topmost (y) coordinate of the video overlay; top left corner of screen is 0,0.

+

Default value: 0

+
+
+
+

The "overlay-width" property

+
  "overlay-width"            guint                 : Read / Write
+

The width of the video overlay; default is equal to negotiated image width.

+

Default value: 0

+
+
+
+

The "queue-size" property

+
  "queue-size"               guint                 : Read / Write
+

Number of buffers to be enqueud in the driver in streaming mode.

+

Allowed values: [1,16]

+

Default value: 12

+
+
+
+

The "brightness" property

+
  "brightness"               gint                  : Read / Write
+

Picture brightness, or more precisely, the black level.

+

Default value: 0

+
+
+
+

The "contrast" property

+
  "contrast"                 gint                  : Read / Write
+

Picture contrast or luma gain.

+

Default value: 0

+
+
+
+

The "hue" property

+
  "hue"                      gint                  : Read / Write
+

Hue or color balance.

+

Default value: 0

+
+
+
+

The "saturation" property

+
  "saturation"               gint                  : Read / Write
+

Picture color saturation or chroma gain.

+

Default value: 0

+
+
+
+

The "crop-height" property

+
  "crop-height"              guint                 : Read / Write
+

The height of the video crop; default is equal to negotiated image height.

+

Default value: 0

+
+
+
+

The "crop-left" property

+
  "crop-left"                gint                  : Read / Write
+

The leftmost (x) coordinate of the video crop; top left corner of image is 0,0.

+

Default value: 0

+
+
+
+

The "crop-top" property

+
  "crop-top"                 gint                  : Read / Write
+

The topmost (y) coordinate of the video crop; top left corner of image is 0,0.

+

Default value: 0

+
+
+
+

The "crop-width" property

+
  "crop-width"               guint                 : Read / Write
+

The width of the video crop; default is equal to negotiated image width.

+

Default value: 0

+
+
+
+

The "min-queued-bufs" property

+
  "min-queued-bufs"          guint                 : Read / Write
+

Minimum number of queued bufs; v4l2sink won't dqbuf if the driver doesn't have more than this number (which normally you shouldn't change).

+

Allowed values: <= 16

+

Default value: 1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-v4l2src.html b/docs/plugins/html/gst-plugins-good-plugins-v4l2src.html new file mode 100644 index 0000000..67cf5ec --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-v4l2src.html @@ -0,0 +1,360 @@ + + + + +v4l2src + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

v4l2src

+

v4l2src — Reads frames from a Video4Linux2 device

+
+
+

Synopsis

+
struct              GstV4l2Src;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstV4l2Src
+
+
+
+

Implemented Interfaces

+

+GstV4l2Src implements + GstURIHandler, GstImplementsInterface, GstTuner, GstColorBalance, GstVideoOrientation and GstPropertyProbe.

+
+
+

Properties

+
+  "device"                   gchar*                : Read / Write
+  "device-name"              gchar*                : Read
+  "flags"                    GstV4l2DeviceTypeFlags  : Read
+  "queue-size"               guint                 : Read / Write
+  "always-copy"              gboolean              : Read / Write
+  "device-fd"                gint                  : Read
+  "brightness"               gint                  : Read / Write
+  "contrast"                 gint                  : Read / Write
+  "decimate"                 gint                  : Read / Write
+  "hue"                      gint                  : Read / Write
+  "saturation"               gint                  : Read / Write
+  "norm"                     V4L2_TV_norms         : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ video4linux2 +

author

Edgard Lima <edgard.lima@indt.org.br>, Stefan Kost <ensonic@users.sf.net>

class

Source/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)8, depth=(int)8, red_mask=(int)224, green_mask=(int)28, blue_mask=(int)3, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YVU9, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)Y41P, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YUV9, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-bayer, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-dv, systemstream=(boolean)true, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/mpegts

video/x-sonix, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-pwc1, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-pwc2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstV4l2Src

+
struct GstV4l2Src;
+

+

+
+
+
+

Property Details

+
+

The "device" property

+
  "device"                   gchar*                : Read / Write
+

Device location.

+

Default value: "/dev/video0"

+
+
+
+

The "device-name" property

+
  "device-name"              gchar*                : Read
+

Name of the device.

+

Default value: NULL

+
+
+
+

The "flags" property

+
  "flags"                    GstV4l2DeviceTypeFlags  : Read
+

Device type flags.

+
+
+
+

The "queue-size" property

+
  "queue-size"               guint                 : Read / Write
+

Number of buffers to be enqueud in the driver in streaming mode.

+

Allowed values: [1,16]

+

Default value: 2

+
+
+
+

The "always-copy" property

+
  "always-copy"              gboolean              : Read / Write
+

If the buffer will or not be used directly from mmap.

+

Default value: TRUE

+
+
+
+

The "device-fd" property

+
  "device-fd"                gint                  : Read
+

File descriptor of the device.

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "brightness" property

+
  "brightness"               gint                  : Read / Write
+

Picture brightness, or more precisely, the black level.

+

Default value: 0

+
+
+
+

The "contrast" property

+
  "contrast"                 gint                  : Read / Write
+

Picture contrast or luma gain.

+

Default value: 0

+
+
+
+

The "decimate" property

+
  "decimate"                 gint                  : Read / Write
+

Only use every nth frame.

+

Allowed values: >= 1

+

Default value: 1

+
+
+
+

The "hue" property

+
  "hue"                      gint                  : Read / Write
+

Hue or color balance.

+

Default value: 0

+
+
+
+

The "saturation" property

+
  "saturation"               gint                  : Read / Write
+

Picture color saturation or chroma gain.

+

Default value: 0

+
+
+
+

The "norm" property

+
  "norm"                     V4L2_TV_norms         : Read / Write
+

video standard.

+

Default value: none

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-vertigotv.html b/docs/plugins/html/gst-plugins-good-plugins-vertigotv.html new file mode 100644 index 0000000..d1ea2c8 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-vertigotv.html @@ -0,0 +1,233 @@ + + + + +vertigotv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

vertigotv

+

vertigotv — A loopback alpha blending effector with rotating and scaling

+
+
+

Synopsis

+
struct              GstVertigoTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstVertigoTV
+
+
+
+

Properties

+
+  "speed"                    gfloat                : Read / Write
+  "zoom-speed"               gfloat                : Read / Write
+
+
+
+

Signals

+
+  "reset-parms"                                    : Run Last
+
+
+
+

Description

+

+VertigoTV is a loopback alpha blending effector with rotating and scaling. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! vertigotv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of vertigotv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstVertigoTV

+
struct GstVertigoTV;
+

+

+
+
+
+

Property Details

+
+

The "speed" property

+
  "speed"                    gfloat                : Read / Write
+

Control the speed of movement.

+

Allowed values: [0.01,100]

+

Default value: 0.02

+
+
+
+

The "zoom-speed" property

+
  "zoom-speed"               gfloat                : Read / Write
+

Control the rate of zooming.

+

Allowed values: [1.01,1.1]

+

Default value: 1.01

+
+
+
+

Signal Details

+
+

The "reset-parms" signal

+
void                user_function                      (GstVertigoTV *gstvertigotv,
+                                                        gpointer      user_data)         : Run Last
+

+

+
++ + + + + + + + + + +

gstvertigotv :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-videobalance.html b/docs/plugins/html/gst-plugins-good-plugins-videobalance.html new file mode 100644 index 0000000..b201868 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-videobalance.html @@ -0,0 +1,377 @@ + + + + +videobalance + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videobalance

+

videobalance — Adjusts brightness, contrast, hue, saturation on a video stream

+
+
+

Synopsis

+
struct              GstVideoBalance;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstVideoBalance
+
+
+
+

Implemented Interfaces

+

+GstVideoBalance implements + GstImplementsInterface and GstColorBalance.

+
+
+

Properties

+
+  "brightness"               gdouble               : Read / Write
+  "contrast"                 gdouble               : Read / Write
+  "hue"                      gdouble               : Read / Write
+  "saturation"               gdouble               : Read / Write
+
+
+
+

Description

+

+Adjusts brightness, contrast, hue, saturation on a video stream. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch videotestsrc ! videobalance saturation=0.0 ! ffmpegcolorspace ! ximagesink
+
+ This pipeline converts the image to black and white by setting the +saturation to 0.0. +
+

+

+

+Last reviewed on 2010-04-18 (0.10.22) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ videofilter +

author

David Schleef <ds@schleef.org>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstVideoBalance

+
struct GstVideoBalance;
+

+Opaque data structure. +

+
+
+
+

Property Details

+
+

The "brightness" property

+
  "brightness"               gdouble               : Read / Write
+

brightness.

+

Allowed values: [-1,1]

+

Default value: 0

+
+
+
+

The "contrast" property

+
  "contrast"                 gdouble               : Read / Write
+

contrast.

+

Allowed values: [0,2]

+

Default value: 1

+
+
+
+

The "hue" property

+
  "hue"                      gdouble               : Read / Write
+

hue.

+

Allowed values: [-1,1]

+

Default value: 0

+
+
+
+

The "saturation" property

+
  "saturation"               gdouble               : Read / Write
+

saturation.

+

Allowed values: [0,2]

+

Default value: 1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-videobox.html b/docs/plugins/html/gst-plugins-good-plugins-videobox.html new file mode 100644 index 0000000..8fdd8a7 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-videobox.html @@ -0,0 +1,444 @@ + + + + +videobox + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videobox

+

videobox — Resizes a video by adding borders or cropping

+
+
+

Synopsis

+
struct              GstVideoBox;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoBox
+
+
+
+

Properties

+
+  "alpha"                    gdouble               : Read / Write
+  "border-alpha"             gdouble               : Read / Write
+  "bottom"                   gint                  : Read / Write
+  "fill"                     GstVideoBoxFill       : Read / Write
+  "left"                     gint                  : Read / Write
+  "right"                    gint                  : Read / Write
+  "top"                      gint                  : Read / Write
+  "autocrop"                 gboolean              : Read / Write
+
+
+
+

Description

+

+This plugin crops or enlarges the image. It takes 4 values as input, a +top, bottom, left and right offset. Positive values will crop that much +pixels from the respective border of the image, negative values will add +that much pixels. When pixels are added, you can specify their color. +Some predefined colors are usable with an enum property. +

+

+The plugin is alpha channel aware and will try to negotiate with a format +that supports alpha channels first. When alpha channel is active two +other properties, alpha and border_alpha can be used to set the alpha +values of the inner picture and the border respectively. an alpha value of +0.0 means total transparency, 1.0 is opaque. +

+

+The videobox plugin has many uses such as doing a mosaic of pictures, +letterboxing video, cutting out pieces of video, picture in picture, etc.. +

+

+Setting autocrop to true changes the behavior of the plugin so that +caps determine crop properties rather than the other way around: given +input and output dimensions, the crop values are selected so that the +smaller frame is effectively centered in the larger frame. This +involves either cropping or padding. +

+

+If you use autocrop there is little point in setting the other +properties manually because they will be overriden if the caps change, +but nothing stops you from doing so. +

+

+Sample pipeline: +

+
+ + + + + + + +
1
+2
gst-launch videotestsrc ! videobox autocrop=true ! \
+  "video/x-raw-yuv, width=600, height=400" ! ffmpegcolorspace ! ximagesink
+
+ +

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ videobox +

author

Wim Taymans <wim@fluendo.com>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)4321, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)4321, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstVideoBox

+
struct GstVideoBox;
+

+

+
+
+
+

Property Details

+
+

The "alpha" property

+
  "alpha"                    gdouble               : Read / Write
+

Alpha value picture.

+

Allowed values: [0,1]

+

Default value: 1

+
+
+
+

The "border-alpha" property

+
  "border-alpha"             gdouble               : Read / Write
+

Alpha value of the border.

+

Allowed values: [0,1]

+

Default value: 1

+
+
+
+

The "bottom" property

+
  "bottom"                   gint                  : Read / Write
+

Pixels to box at bottom (<0 = add a border).

+

Default value: 0

+
+
+
+

The "fill" property

+
  "fill"                     GstVideoBoxFill       : Read / Write
+

How to fill the borders.

+

Default value: Black

+
+
+
+

The "left" property

+
  "left"                     gint                  : Read / Write
+

Pixels to box at left (<0 = add a border).

+

Default value: 0

+
+
+
+

The "right" property

+
  "right"                    gint                  : Read / Write
+

Pixels to box at right (<0 = add a border).

+

Default value: 0

+
+
+
+

The "top" property

+
  "top"                      gint                  : Read / Write
+

Pixels to box at top (<0 = add a border).

+

Default value: 0

+
+
+
+

The "autocrop" property

+
  "autocrop"                 gboolean              : Read / Write
+

+If set to TRUE videobox will automatically crop/pad the input +video to be centered in the output. +

+

Default value: FALSE

+

Since 0.10.16

+
+
+
+

See Also

+GstVideoCrop +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-videocrop.html b/docs/plugins/html/gst-plugins-good-plugins-videocrop.html new file mode 100644 index 0000000..411d125 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-videocrop.html @@ -0,0 +1,386 @@ + + + + +videocrop + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videocrop

+

videocrop — Crops video into a user-defined region

+
+
+

Synopsis

+
struct              GstVideoCrop;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoCrop
+
+
+
+

Properties

+
+  "bottom"                   gint                  : Read / Write
+  "left"                     gint                  : Read / Write
+  "right"                    gint                  : Read / Write
+  "top"                      gint                  : Read / Write
+
+
+
+

Description

+

+This element crops video frames, meaning it can remove parts of the +picture on the left, right, top or bottom of the picture and output +a smaller picture than the input picture, with the unwanted parts at the +border removed. +

+

+The videocrop element is similar to the videobox element, but its main +goal is to support a multitude of formats as efficiently as possible. +Unlike videbox, it cannot add borders to the picture and unlike videbox +it will always output images in exactly the same format as the input image. +

+

+If there is nothing to crop, the element will operate in pass-through mode. +

+

+Note that no special efforts are made to handle chroma-subsampled formats +in the case of odd-valued cropping and compensate for sub-unit chroma plane +shifts for such formats in the case where the "left" or +"top" property is set to an odd number. This doesn't matter for +most use cases, but it might matter for yours. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! ximagesink
+
+ +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ videocrop +

author

Tim-Philipp Müller <tim centricular net>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstVideoCrop

+
struct GstVideoCrop;
+

+

+
+
+
+

Property Details

+
+

The "bottom" property

+
  "bottom"                   gint                  : Read / Write
+

Pixels to crop at bottom.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "left" property

+
  "left"                     gint                  : Read / Write
+

Pixels to crop at left.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "right" property

+
  "right"                    gint                  : Read / Write
+

Pixels to crop at right.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "top" property

+
  "top"                      gint                  : Read / Write
+

Pixels to crop at top.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

See Also

+GstVideoBox +
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-videoflip.html b/docs/plugins/html/gst-plugins-good-plugins-videoflip.html new file mode 100644 index 0000000..e28d77a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-videoflip.html @@ -0,0 +1,388 @@ + + + + +videoflip + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videoflip

+

videoflip — Flips and rotates video

+
+
+

Synopsis

+
struct              GstVideoFlip;
+enum                GstVideoFlipMethod;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstVideoFlip
+
+
+
+

Properties

+
+  "method"                   GstVideoFlipMethod    : Read / Write
+
+
+
+

Description

+

+Flips and rotates video. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch videotestsrc ! videoflip method=clockwise ! ffmpegcolorspace ! ximagesink
+
+ This pipeline flips the test image 90 degrees clockwise. +
+

+

+

+Last reviewed on 2010-04-18 (0.10.22) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ videofilter +

author

David Schleef <ds@schleef.org>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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

+
+

struct GstVideoFlip

+
struct GstVideoFlip;
+

+Opaque datastructure. +

+
+
+
+

enum GstVideoFlipMethod

+
typedef enum {
+  GST_VIDEO_FLIP_METHOD_IDENTITY,
+  GST_VIDEO_FLIP_METHOD_90R,
+  GST_VIDEO_FLIP_METHOD_180,
+  GST_VIDEO_FLIP_METHOD_90L,
+  GST_VIDEO_FLIP_METHOD_HORIZ,
+  GST_VIDEO_FLIP_METHOD_VERT,
+  GST_VIDEO_FLIP_METHOD_TRANS,
+  GST_VIDEO_FLIP_METHOD_OTHER
+} GstVideoFlipMethod;
+
+

+The different flip methods. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GST_VIDEO_FLIP_METHOD_IDENTITY

Identity (no rotation) +

GST_VIDEO_FLIP_METHOD_90R

Rotate clockwise 90 degrees +

GST_VIDEO_FLIP_METHOD_180

Rotate 180 degrees +

GST_VIDEO_FLIP_METHOD_90L

Rotate counter-clockwise 90 degrees +

GST_VIDEO_FLIP_METHOD_HORIZ

Flip horizontally +

GST_VIDEO_FLIP_METHOD_VERT

Flip vertically +

GST_VIDEO_FLIP_METHOD_TRANS

Flip across upper left/lower right diagonal +

GST_VIDEO_FLIP_METHOD_OTHER

Flip across upper right/lower left diagonal +
+
+
+
+

Property Details

+
+

The "method" property

+
  "method"                   GstVideoFlipMethod    : Read / Write
+

method.

+

Default value: Identity (no rotation)

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-videomixer.html b/docs/plugins/html/gst-plugins-good-plugins-videomixer.html new file mode 100644 index 0000000..0653bb2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-videomixer.html @@ -0,0 +1,456 @@ + + + + +videomixer + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videomixer

+

videomixer — Mix multiple video streams

+
+
+

Synopsis

+
struct              GstVideoMixer;
+enum                GstVideoMixerBackground;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstVideoMixer
+
+
+
+

Implemented Interfaces

+

+GstVideoMixer implements + GstChildProxy.

+
+
+

Properties

+
+  "background"               GstVideoMixerBackground  : Read / Write
+
+
+
+

Description

+

+Videomixer can accept AYUV, ARGB and BGRA video streams. For each of the requested +sink pads it will compare the incoming geometry and framerate to define the +output parameters. Indeed output video frames will have the geometry of the +biggest incoming video stream and the framerate of the fastest incoming one. +

+

+All sink pads must be either AYUV, ARGB or BGRA, but a mixture of them is not +supported. The src pad will have the same colorspace as the sinks. +No colorspace conversion is done. +

+

+Individual parameters for each input stream can be configured on the +GstVideoMixerPad. +

+

+

+
+

Sample pipelines

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
gst-launch-0.10 \
+  videotestsrc pattern=1 ! \
+  video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! \
+  videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! \
+  videomixer name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! \
+  ffmpegcolorspace ! xvimagesink \
+  videotestsrc ! \
+  video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix.
+
+ A pipeline to demonstrate videomixer used together with videobox. +This should show a 320x240 pixels video test source with some transparency +showing the background checker pattern. Another video test source with just +the snow pattern of 100x100 pixels is overlayed on top of the first one on +the left vertically centered with a small transparency showing the first +video test source behind and the checker pattern under it. Note that the +framerate of the output video is 10 frames per second. +
+ + + + + + + +
1
+2
+3
+4
+5
gst-launch videotestsrc pattern=1 ! \
+  video/x-raw-rgb, framerate=\(fraction\)10/1, width=100, height=100 ! \
+  videomixer name=mix ! ffmpegcolorspace ! ximagesink \
+  videotestsrc !  \
+  video/x-raw-rgb, framerate=\(fraction\)5/1, width=320, height=240 ! mix.
+
+ A pipeline to demostrate bgra mixing. (This does not demonstrate alpha blending). +
+ + + + + + + +
1
+2
+3
+4
+5
gst-launch videotestsrc pattern=1 ! \
+  video/x-raw-yuv,format =\(fourcc\)I420, framerate=\(fraction\)10/1, width=100, height=100 ! \
+  videomixer name=mix ! ffmpegcolorspace ! ximagesink \
+  videotestsrc ! \
+  video/x-raw-yuv,format=\(fourcc\)I420, framerate=\(fraction\)5/1, width=320, height=240 ! mix.
+
+ A pipeline to test I420 +
+ + + + + + + +
1
gst-launch videotestsrc pattern="snow" ! video/x-raw-yuv, framerate=\(fraction\)10/1, width=200, height=150 ! videomixer name=mix sink_1::xpos=20 sink_1::ypos=20 sink_1::alpha=0.5 ! ffmpegcolorspace ! xvimagesink videotestsrc ! video/x-raw-yuv, framerate=\(fraction\)10/1, width=640, height=360 ! mix.
+
+ Set position and alpha on the mixer using GstVideoMixerPad properties. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ videomixer +

author

Wim Taymans <wim@fluendo.com>

class

Filter/Editor/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink_%d

direction

sink

presence

request

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstVideoMixer

+
struct GstVideoMixer;
+

+The opaque GstVideoMixer structure. +

+
+
+
+

enum GstVideoMixerBackground

+
typedef enum {
+  VIDEO_MIXER_BACKGROUND_CHECKER,
+  VIDEO_MIXER_BACKGROUND_BLACK,
+  VIDEO_MIXER_BACKGROUND_WHITE,
+  VIDEO_MIXER_BACKGROUND_TRANSPARENT,
+} GstVideoMixerBackground;
+
+

+The different backgrounds videomixer can blend over. +

+
++ + + + + + + + + + + + + + + + + + +

VIDEO_MIXER_BACKGROUND_CHECKER

checker pattern background +

VIDEO_MIXER_BACKGROUND_BLACK

solid color black background +

VIDEO_MIXER_BACKGROUND_WHITE

solid color white background +

VIDEO_MIXER_BACKGROUND_TRANSPARENT

background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing. +
+
+
+
+

Property Details

+
+

The "background" property

+
  "background"               GstVideoMixerBackground  : Read / Write
+

Background type.

+

Default value: Checker pattern

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-videomixer2.html b/docs/plugins/html/gst-plugins-good-plugins-videomixer2.html new file mode 100644 index 0000000..4b3fa3a --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-videomixer2.html @@ -0,0 +1,475 @@ + + + + +videomixer2 + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

videomixer2

+

videomixer2 — Mix multiple video streams

+
+
+

Synopsis

+
struct              GstVideoMixer2;
+enum                GstVideoMixer2Background;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstVideoMixer2
+
+
+
+

Implemented Interfaces

+

+GstVideoMixer2 implements + GstChildProxy.

+
+
+

Properties

+
+  "background"               GstVideoMixer2Background  : Read / Write
+
+
+
+

Description

+

+Videomixer2 can accept AYUV, ARGB and BGRA video streams. For each of the requested +sink pads it will compare the incoming geometry and framerate to define the +output parameters. Indeed output video frames will have the geometry of the +biggest incoming video stream and the framerate of the fastest incoming one. +

+

+All sink pads must be either AYUV, ARGB or BGRA, but a mixture of them is not +supported. The src pad will have the same colorspace as the sinks. +No colorspace conversion is done. +

+

+Individual parameters for each input stream can be configured on the +GstVideoMixer2Pad. +

+

+At this stage, videomixer2 is considered UNSTABLE. The API provided in the +properties may yet change in the near future. When videomixer2 is stable, +it will replace videomixer +

+

+

+
+

Sample pipelines

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
gst-launch-0.10 \
+  videotestsrc pattern=1 ! \
+  video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! \
+  videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! \
+  videomixer2 name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! \
+  ffmpegcolorspace ! xvimagesink \
+  videotestsrc ! \
+  video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix.
+
+ A pipeline to demonstrate videomixer used together with videobox. +This should show a 320x240 pixels video test source with some transparency +showing the background checker pattern. Another video test source with just +the snow pattern of 100x100 pixels is overlayed on top of the first one on +the left vertically centered with a small transparency showing the first +video test source behind and the checker pattern under it. Note that the +framerate of the output video is 10 frames per second. +
+ + + + + + + +
1
+2
+3
+4
+5
gst-launch videotestsrc pattern=1 ! \
+  video/x-raw-rgb, framerate=\(fraction\)10/1, width=100, height=100 ! \
+  videomixer2 name=mix ! ffmpegcolorspace ! ximagesink \
+  videotestsrc !  \
+  video/x-raw-rgb, framerate=\(fraction\)5/1, width=320, height=240 ! mix.
+
+ A pipeline to demostrate bgra mixing. (This does not demonstrate alpha blending). +
+ + + + + + + +
1
+2
+3
+4
+5
gst-launch videotestsrc pattern=1 ! \
+  video/x-raw-yuv,format =\(fourcc\)I420, framerate=\(fraction\)10/1, width=100, height=100 ! \
+  videomixer2 name=mix ! ffmpegcolorspace ! ximagesink \
+  videotestsrc ! \
+  video/x-raw-yuv,format=\(fourcc\)I420, framerate=\(fraction\)5/1, width=320, height=240 ! mix.
+
+ A pipeline to test I420 +
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
gst-launch videomixer2 name=mixer sink_1::alpha=0.5 sink_1::xpos=50 sink_1::ypos=50 ! \
+  ffmpegcolorspace ! ximagesink \
+  videotestsrc pattern=snow timestamp-offset=3000000000 ! \
+  "video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480,framerate=(fraction)30/1" ! \
+  timeoverlay ! queue2 ! mixer. \
+  videotestsrc pattern=smpte ! \
+  "video/x-raw-yuv,format=(fourcc)AYUV,width=800,height=600,framerate=(fraction)10/1" ! \
+  timeoverlay ! queue2 ! mixer.
+
+ A pipeline to demonstrate synchronized mixing (the second stream starts after 3 seconds) +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ videomixer +

author

Wim Taymans <wim@fluendo.com>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Editor/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink_%d

direction

sink

presence

request

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

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)UYVY, 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 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstVideoMixer2

+
struct GstVideoMixer2;
+

+The opaque GstVideoMixer2 structure. +

+
+
+
+

enum GstVideoMixer2Background

+
typedef enum {
+  VIDEO_MIXER2_BACKGROUND_CHECKER,
+  VIDEO_MIXER2_BACKGROUND_BLACK,
+  VIDEO_MIXER2_BACKGROUND_WHITE,
+  VIDEO_MIXER2_BACKGROUND_TRANSPARENT,
+} GstVideoMixer2Background;
+
+

+The different backgrounds videomixer can blend over. +

+
++ + + + + + + + + + + + + + + + + + +

VIDEO_MIXER2_BACKGROUND_CHECKER

checker pattern background +

VIDEO_MIXER2_BACKGROUND_BLACK

solid color black background +

VIDEO_MIXER2_BACKGROUND_WHITE

solid color white background +

VIDEO_MIXER2_BACKGROUND_TRANSPARENT

background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing. +
+
+
+
+

Property Details

+
+

The "background" property

+
  "background"               GstVideoMixer2Background  : Read / Write
+

Background type.

+

Default value: Checker pattern

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-warptv.html b/docs/plugins/html/gst-plugins-good-plugins-warptv.html new file mode 100644 index 0000000..d46a007 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-warptv.html @@ -0,0 +1,191 @@ + + + + +warptv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

warptv

+

warptv — WarpTV does realtime goo'ing of the video input

+
+
+

Synopsis

+
struct              GstWarpTV;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseTransform
+                     +----GstVideoFilter
+                           +----GstWarpTV
+
+
+
+

Description

+

+WarpTV does realtime goo'ing of the video input. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch -v videotestsrc ! warptv ! ffmpegcolorspace ! autovideosink
+
+ This pipeline shows the effect of warptv on a test stream. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ effectv +

author

Sam Lantinga <slouken@devolution.com>

class

Filter/Effect/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstWarpTV

+
struct GstWarpTV;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-waveformsink.html b/docs/plugins/html/gst-plugins-good-plugins-waveformsink.html new file mode 100644 index 0000000..d9dc734 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-waveformsink.html @@ -0,0 +1,128 @@ + + + + +waveformsink + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

waveformsink

+

waveformsink — WaveForm audio sink

+
+
+

Synopsis

+
struct              GstWaveFormSink;
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ waveform +

author

Sebastien Moutte <sebastien@moutte.net>

class

Sink/Audio
+
+
+
+

Element Pads

+
+
+

+

+
+
+

Details

+
+

struct GstWaveFormSink

+
struct GstWaveFormSink {
+  /* parent object */
+  GstAudioSink sink;
+
+  /* supported caps */
+  GstCaps *cached_caps;
+  
+  /* handle to the waveform-audio output device */
+  HWAVEOUT hwaveout;
+  
+  /* table of buffer headers */
+  WAVEHDR *wave_buffers;
+
+  /* critical section protecting access to the number of free buffers */
+  CRITICAL_SECTION critic_wave;
+
+  /* number of free buffers available */
+  guint free_buffers_count;
+  
+  /* current free buffer where you have to write incoming data */
+  guint write_buffer;
+  
+  /* size of buffers streamed to the device */
+  guint buffer_size;
+
+  /* number of buffers streamed to the device */
+  guint buffer_count;
+
+  /* total of bytes in queue before they are written to the device */
+  guint bytes_in_queue;
+
+  /* bytes per sample from setcaps used to evaluate the number samples returned by delay */
+  guint bytes_per_sample;
+
+  /* wave form error string */
+  gchar error_string[ERROR_LENGTH];
+};
+
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-wavenc.html b/docs/plugins/html/gst-plugins-good-plugins-wavenc.html new file mode 100644 index 0000000..5d2c537 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-wavenc.html @@ -0,0 +1,171 @@ + + + + +wavenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

wavenc

+

wavenc — Encode raw audio into WAV

+
+
+

Synopsis

+
struct              GstWavEnc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstWavEnc
+
+
+
+

Description

+

+Format a audio stream into the wav format. +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ wavenc +

author

Iain Holmes <iain@prettypeople.org>

class

Codec/Muxer/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int){ 32, 64 }

audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false

audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-wav
+
+
+

+

+
+
+

Details

+
+

struct GstWavEnc

+
struct GstWavEnc;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-wavpackdec.html b/docs/plugins/html/gst-plugins-good-plugins-wavpackdec.html new file mode 100644 index 0000000..87b0ac9 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-wavpackdec.html @@ -0,0 +1,144 @@ + + + + +wavpackdec + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

wavpackdec

+

wavpackdec — Decodes Wavpack audio data

+
+
+

Synopsis

+
struct              GstWavpackDec;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstWavpackDec
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ wavpack +

author

Arwed v. Merkatz <v.merkatz@gmx.net>, Sebastian Dröge <slomo@circular-chaos.org>

class

Codec/Decoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], endianness=(int)1234, signed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstWavpackDec

+
struct GstWavpackDec;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-wavpackenc.html b/docs/plugins/html/gst-plugins-good-plugins-wavpackenc.html new file mode 100644 index 0000000..dbd60e4 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-wavpackenc.html @@ -0,0 +1,241 @@ + + + + +wavpackenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

wavpackenc

+

wavpackenc — Encodes audio with the Wavpack lossless/lossy audio codec

+
+
+

Synopsis

+
struct              GstWavpackEnc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstWavpackEnc
+
+
+
+

Implemented Interfaces

+

+GstWavpackEnc implements + GstPreset.

+
+
+

Properties

+
+  "bitrate"                  guint                 : Read / Write
+  "bits-per-sample"          gdouble               : Read / Write
+  "correction-mode"          GstWavpackEncCorrectionMode  : Read / Write
+  "extra-processing"         guint                 : Read / Write
+  "joint-stereo-mode"        GstWavpackEncJSMode   : Read / Write
+  "md5"                      gboolean              : Read / Write
+  "mode"                     GstWavpackEncMode     : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ wavpack +

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Codec/Encoder/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], endianness=(int)1234, channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], signed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 2 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

wvcsrc

direction

source

presence

sometimes

details

audio/x-wavpack-correction, framed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstWavpackEnc

+
struct GstWavpackEnc;
+

+

+
+
+
+

Property Details

+
+

The "bitrate" property

+
  "bitrate"                  guint                 : Read / Write
+

Try to encode with this average bitrate (bits/sec). This enables lossy encoding, values smaller than 24000 disable it again.

+

Allowed values: <= 9600000

+

Default value: 0

+
+
+
+

The "bits-per-sample" property

+
  "bits-per-sample"          gdouble               : Read / Write
+

Try to encode with this amount of bits per sample. This enables lossy encoding, values smaller than 2.0 disable it again.

+

Allowed values: [0,24]

+

Default value: 0

+
+
+
+

The "correction-mode" property

+
  "correction-mode"          GstWavpackEncCorrectionMode  : Read / Write
+

Use this mode for the correction stream. Only works in lossy mode!.

+

Default value: Create no correction file

+
+
+
+

The "extra-processing" property

+
  "extra-processing"         guint                 : Read / Write
+

Use better but slower filters for better compression/quality.

+

Allowed values: <= 6

+

Default value: 0

+
+
+
+

The "joint-stereo-mode" property

+
  "joint-stereo-mode"        GstWavpackEncJSMode   : Read / Write
+

Use this joint-stereo mode.

+

Default value: auto

+
+
+
+

The "md5" property

+
  "md5"                      gboolean              : Read / Write
+

Store MD5 hash of raw samples within the file.

+

Default value: FALSE

+
+
+
+

The "mode" property

+
  "mode"                     GstWavpackEncMode     : Read / Write
+

Speed versus compression tradeoff.

+

Default value: Normal Compression

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-wavpackparse.html b/docs/plugins/html/gst-plugins-good-plugins-wavpackparse.html new file mode 100644 index 0000000..667ef74 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-wavpackparse.html @@ -0,0 +1,169 @@ + + + + +wavpackparse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

wavpackparse

+

wavpackparse — Parses Wavpack files

+
+
+

Synopsis

+
struct              GstWavpackParse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstWavpackParse
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ wavpack +

author

Arwed v. Merkatz <v.merkatz@gmx.net>, Sebastian Dröge <slomo@circular-chaos.org>

class

Codec/Demuxer/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

audio/x-wavpack, framed=(boolean)false

audio/x-wavpack-correction, framed=(boolean)false
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

sometimes

details

audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
+
++ + + + + + + + + + + + + + + + + + +

name

wvcsrc

direction

source

presence

sometimes

details

audio/x-wavpack-correction, framed=(boolean)true
+
+
+

+

+
+
+

Details

+
+

struct GstWavpackParse

+
struct GstWavpackParse;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-wavparse.html b/docs/plugins/html/gst-plugins-good-plugins-wavparse.html new file mode 100644 index 0000000..5b99c16 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-wavparse.html @@ -0,0 +1,289 @@ + + + + +wavparse + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

wavparse

+

wavparse — Parse a .wav file into raw audio

+
+
+

Synopsis

+
struct              GstWavParse;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstWavParse
+
+
+
+

Description

+

+Parse a .wav file into raw or compressed audio. +

+

+Wavparse supports both push and pull mode operations, making it possible to +stream from a network source. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
gst-launch filesrc location=sine.wav ! wavparse ! audioconvert ! alsasink
+
+ Read a wav file and output to the soundcard using the ALSA element. The +wav file is assumed to contain raw uncompressed samples. +
+ + + + + + + +
1
gst-launch gnomevfssrc location=http://www.example.org/sine.wav ! queue ! wavparse ! audioconvert ! alsasink
+
+ Stream data from a network url. +
+

+

+

+Last reviewed on 2007-02-14 (0.10.6) +

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ wavparse +

author

Erik Walthinsen <omega@cse.ogi.edu>

class

Codec/Demuxer/Audio
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

wavparse_sink

direction

sink

presence

always

details

audio/x-wav
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

wavparse_src

direction

source

presence

sometimes

details

audio/ms-gsm, rate=(int)[ 1, 96000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)3, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)2, rate=(int)[ 16000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]

audio/x-vorbis, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 2 ]

audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ]

audio/x-dts

audio/mpeg, mpegversion=(int)4, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 8 ]

audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-wms, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)dvi, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-truespeech, rate=(int)8000, channels=(int)[ 1, 2 ]

audio/x-wma, wmaversion=(int)1, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)2, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)3, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-vnd.sony.atrac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]

audio/x-voxware, voxwaretype=(int)117, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dk4, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dk3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dvi, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/AMR, rate=(int)8000, channels=(int)1

audio/AMR-WB, rate=(int)16000, channels=(int)1

audio/x-siren

application/x-ogg-avi
+
+
+

+

+
+
+

Details

+
+

struct GstWavParse

+
struct GstWavParse;
+

+Opaque data structure. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-webmmux.html b/docs/plugins/html/gst-plugins-good-plugins-webmmux.html new file mode 100644 index 0000000..dc808b2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-webmmux.html @@ -0,0 +1,216 @@ + + + + +webmmux + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

webmmux

+

webmmux — Muxes video and audio streams into a WebM stream

+
+
+

Synopsis

+
struct              GstWebMMux;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstMatroskaMux
+                     +----GstWebMMux
+
+
+
+

Implemented Interfaces

+

+GstWebMMux implements + GstTagSetter.

+
+
+

Description

+

+webmmux muxes VP8 video and Vorbis audio streams into a WebM file. +

+

+

+
+

Example launch line

+
+ + + + + + + +
1
+2
+3
+4
gst-launch-0.10 webmmux name=mux ! filesink location=newfile.webm         \
+  uridecodebin uri=file:///path/to/somefile.ogv name=demux                \
+  demux. ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0    \
+  demux. ! progressreport ! audioconvert ! audiorate ! vorbisenc ! queue ! mux.audio_0
+
+ This pipeline re-encodes a video file of any format into a WebM file. +
+ + + + + + + +
1
+2
+3
gst-launch-0.10 webmmux name=mux ! filesink location=test.webm            \
+  videotestsrc num-buffers=250 ! video/x-raw-yuv,framerate=25/1 ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0 \
+  audiotestsrc samplesperbuffer=44100 num-buffers=10 ! audio/x-raw-float,rate=44100 ! vorbisenc ! queue ! mux.audio_0
+
+ This pipeline muxes a test video and a sine wave into a WebM file. +
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ matroska +

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Codec/Muxer
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

audio_%d

direction

sink

presence

request

details

audio/x-vorbis, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]
+
++ + + + + + + + + + + + + + + + + + +

name

video_%d

direction

sink

presence

request

details

video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/webm
+
+
+

+

+
+
+

Details

+
+

struct GstWebMMux

+
struct GstWebMMux;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-ximagesrc.html b/docs/plugins/html/gst-plugins-good-plugins-ximagesrc.html new file mode 100644 index 0000000..be5edb2 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-ximagesrc.html @@ -0,0 +1,227 @@ + + + + +ximagesrc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

ximagesrc

+

ximagesrc — Creates a screenshot video stream

+
+
+

Synopsis

+
struct              GstXImageSrc;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstBaseSrc
+                     +----GstPushSrc
+                           +----GstXImageSrc
+
+
+
+

Properties

+
+  "display-name"             gchar*                : Read / Write
+  "screen-num"               guint                 : Read / Write
+  "show-pointer"             gboolean              : Read / Write
+  "endx"                     guint                 : Read / Write
+  "endy"                     guint                 : Read / Write
+  "startx"                   guint                 : Read / Write
+  "starty"                   guint                 : Read / Write
+  "use-damage"               gboolean              : Read / Write
+  "remote"                   gboolean              : Read / Write
+  "xid"                      guint64               : Read / Write
+  "xname"                    gchar*                : Read / Write
+
+
+
+

Description

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ ximagesrc +

author

Lutz Mueller <lutz@users.sourceforge.net>, Jan Schmidt <thaytan@mad.scientist.com>, Zaheer Merali <zaheerabbas at merali dot org>

class

Source/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

video/x-raw-rgb, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], pixel-aspect-ratio=(fraction)[ 0/1, 2147483647/1 ]
+
+
+

+

+
+
+

Details

+
+

struct GstXImageSrc

+
struct GstXImageSrc;
+

+

+
+
+
+

Property Details

+
+

The "display-name" property

+
  "display-name"             gchar*                : Read / Write
+

X Display Name.

+

Default value: NULL

+
+
+
+

The "screen-num" property

+
  "screen-num"               guint                 : Read / Write
+

X Screen Number.

+

Allowed values: <= G_MAXINT

+

Default value: 0

+
+
+
+

The "show-pointer" property

+
  "show-pointer"             gboolean              : Read / Write
+

Show mouse pointer (if XFixes extension enabled).

+

Default value: TRUE

+
+
+
+

The "endx" property

+
  "endx"                     guint                 : Read / Write
+

X coordinate of bottom right corner of area to be recorded (0 for bottom right of screen).

+

Allowed values: <= G_MAXINT

+

Default value: 0

+
+
+
+

The "endy" property

+
  "endy"                     guint                 : Read / Write
+

Y coordinate of bottom right corner of area to be recorded (0 for bottom right of screen).

+

Allowed values: <= G_MAXINT

+

Default value: 0

+
+
+
+

The "startx" property

+
  "startx"                   guint                 : Read / Write
+

X coordinate of top left corner of area to be recorded (0 for top left of screen).

+

Allowed values: <= G_MAXINT

+

Default value: 0

+
+
+
+

The "starty" property

+
  "starty"                   guint                 : Read / Write
+

Y coordinate of top left corner of area to be recorded (0 for top left of screen).

+

Allowed values: <= G_MAXINT

+

Default value: 0

+
+
+
+

The "use-damage" property

+
  "use-damage"               gboolean              : Read / Write
+

Use XDamage (if XDamage extension enabled).

+

Default value: TRUE

+
+
+
+

The "remote" property

+
  "remote"                   gboolean              : Read / Write
+

Whether the display is remote.

+

Default value: FALSE

+
+
+
+

The "xid" property

+
  "xid"                      guint64               : Read / Write
+

Window XID to capture from.

+

Default value: 0

+
+
+
+

The "xname" property

+
  "xname"                    gchar*                : Read / Write
+

Window name to capture from.

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins-y4menc.html b/docs/plugins/html/gst-plugins-good-plugins-y4menc.html new file mode 100644 index 0000000..5e04c8d --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins-y4menc.html @@ -0,0 +1,164 @@ + + + + +y4menc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

y4menc

+

y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools)

+
+
+

Synopsis

+
struct              GstY4mEncode;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GstObject
+         +----GstElement
+               +----GstY4mEncode
+
+
+
+

Description

+

+

+
+

Example launch line

+

+Creates a YU4MPEG2 raw video stream as defined by the mjpegtools project. +

+

+(write everything in one line, without the backslash characters) +

+
+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
+
+

+

+
+

+

+
+

Synopsis

+
+

Element Information

+
++ + + + + + + + + + + + + + +

plugin

+ y4menc +

author

Wim Taymans <wim.taymans@gmail.com>

class

Codec/Encoder/Video
+
+
+
+

Element Pads

+
++ + + + + + + + + + + + + + + + + + +

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc){ IYUV, I420, Y42B, Y41B, Y444 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
++ + + + + + + + + + + + + + + + + + +

name

src

direction

source

presence

always

details

application/x-yuv4mpeg, y4mversion=(int)2
+
+
+

+

+
+
+

Details

+
+

struct GstY4mEncode

+
struct GstY4mEncode;
+

+

+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/gst-plugins-good-plugins.devhelp2 b/docs/plugins/html/gst-plugins-good-plugins.devhelp2 new file mode 100644 index 0000000..fa15287 --- /dev/null +++ b/docs/plugins/html/gst-plugins-good-plugins.devhelp2 @@ -0,0 +1,1463 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/plugins/html/home.png b/docs/plugins/html/home.png new file mode 100644 index 0000000000000000000000000000000000000000..17003611d9df2b066afc682cbde962f3a575002d GIT binary patch literal 654 zcmV;90&)F`P)~yY zO1cF+0vxb!W?!x?K+*#62Jq)nA4q`)5S6sgX4ao{=)(Mgq+YMr)7sjak|a^9)zS!j zlk{-n29mabXYF=7SYBQx&vO8xC}MYams+hxqtO7sImhPaCf@rq;I^3!#u*2aUP)55 zT2&N90xmEJ0s&fGT~(T<3d2xYmK9C>IP*x-M@ib*+0pFm>>uW37N2Wzaq-fCnIZE9 zpb8}0+uN+KuQM2oZVHfP8U6kQdo3?>Wo2dT)WeM9So8DqhLi#T0 z-i(>mfjhvbsYV`;4sgfJ-p>G-SqJ!fjR6BQYs1h*y9xaN0l{VB;o%`08yiy@)$8@~ z2PD1gcDuiy;j1tR0v#V8OH%W)25-YKyx(j#IXO9*YWf0mb8}QG6@b@;cHxh9{t7+@ o!Yd`f8L$sLH?yBt^q3C6015TtIu@BS5dZ)H07*qoM6N<$f*igdr~m)} literal 0 HcmV?d00001 diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html new file mode 100644 index 0000000..72bd858 --- /dev/null +++ b/docs/plugins/html/index.html @@ -0,0 +1,770 @@ + + + + +GStreamer Good Plugins 0.10 Plugins Reference Manual + + + + + + + +
+
+
+
+

+ for GStreamer Good Plugins 0.10 (0.10.31) + The latest version of this documentation can be found on-line at + http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/. +

+
+
+
+
+
gst-plugins-good Elements
+
+
+3gppmux — Muxer for 3GPP (.3gp) files +
+
+aacparse — AAC parser +
+
+aasink — An ASCII art videosink +
+
+ac3parse — AC3 parser +
+
+agingtv — AgingTV adds age to video input using scratches and dust +
+
+alpha — Adds an alpha channel to video - uniform or via chroma-keying +
+
+alphacolor — ARGB from/to AYUV colorspace conversion preserving the alpha channel +
+
+alawdec — Convert 8bit A law to 16bit PCM +
+
+alawenc — Convert 16bit PCM to 8bit A law +
+
+amrparse — AMR parser +
+
+apedemux — Read and output APE tags while demuxing the contents +
+
+apev2mux — Adds an APEv2 header to the beginning of files using taglib +
+
+aspectratiocrop — Crops video into a user-defined aspect-ratio +
+
+audioamplify — Amplifies an audio stream by a given factor +
+
+audiochebband — Chebyshev band pass and band reject filter +
+
+audiocheblimit — Chebyshev low pass and high pass filter +
+
+audiofirfilter — Generic audio FIR filter with custom filter kernel +
+
+audioiirfilter — Generic audio IIR filter with custom filter kernel +
+
+audiowsincband — Band pass and band reject windowed sinc filter +
+
+audiowsinclimit — Low pass and high pass windowed sinc filter +
+
+audioecho — Adds an echo or reverb effect to an audio stream +
+
+audiodynamic — Compressor and Expander +
+
+audioinvert — Swaps upper and lower half of audio samples +
+
+audiopanorama — Positions audio streams in the stereo panorama +
+
+audiokaraoke — Removes voice from sound +
+
+auparse — Parse an .au file into raw audio +
+
+autoaudiosink — Wrapper audio sink for automatically detected audio sink +
+
+autoaudiosrc — Wrapper audio source for automatically detected audio source +
+
+autovideosink — Wrapper video sink for automatically detected video sink +
+
+autovideosrc — Wrapper video source for automatically detected video source +
+
+avidemux — Demultiplex an avi file into audio and video +
+
+avimux — Muxes audio and video into an avi stream +
+
+avisubtitle — Parse avi subtitle stream +
+
+cacasink — A colored ASCII art videosink +
+
+cairotextoverlay — Adds text strings on top of a video buffer +
+
+cairotimeoverlay — Overlays the time on a video stream +
+
+cairorender — Encodes streams using Cairo +
+
+cairooverlay — Render overlay on a video stream using Cairo +
+
+capssetter — Set/merge caps on stream +
+
+cmmldec — Decodes CMML streams +
+
+cmmlenc — Encodes CMML streams +
+
+cutter — Audio Cutter to split audio into non-silent bits +
+
+dcaparse — DCA (DTS Coherent Acoustics) parser +
+
+deinterlace — Deinterlace Methods ported from DScaler/TvTime +
+
+deinterleave — Splits one interleaved multichannel audio stream into many mono audio streams +
+
+dicetv — 'Dices' the screen up into many small squares +
+
+directsoundsink — DirectSound audio sink +
+
+dv1394src — Source for DV video data from firewire port +
+
+dvdec — Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net) +
+
+dvdemux — Uses libdv to separate DV audio from DV video (libdv.sourceforge.net) +
+
+edgetv — Apply edge detect on video +
+
+equalizer-10bands — Direct Form 10 band IIR equalizer +
+
+equalizer-3bands — Direct Form 3 band IIR equalizer +
+
+equalizer-nbands — Direct Form IIR equalizer +
+
+esdsink — Plays audio to an esound server +
+
+flacdec — Decodes FLAC lossless audio streams +
+
+flacenc — Encodes audio with the FLAC lossless audio encoder +
+
+flacparse — Parses audio with the FLAC lossless audio codec +
+
+flactag — Rewrite tags in a FLAC file +
+
+flvdemux — Demux FLV feeds into digital streams +
+
+flvmux — Muxes video/audio streams into a FLV stream +
+
+flxdec — FLC/FLI/FLX video decoder +
+
+gamma — Adjusts gamma on a video stream +
+
+gconfaudiosrc — Audio source embedding the GConf-settings for audio input +
+
+gconfaudiosink — Audio sink embedding the GConf-settings for audio output +
+
+gconfvideosrc — Video source embedding the GConf-settings for video input +
+
+gconfvideosink — Video sink embedding the GConf-settings for video output +
+
+gdkpixbufsink — Output images as GdkPixbuf objects in bus messages +
+
+goom — Takes frames of data and outputs video frames using the GOOM filter +
+
+goom2k1 — Takes frames of data and outputs video frames using the GOOM 2k1 filter +
+
+gstrtpbin — Real-Time Transport Protocol bin +
+
+gstrtpjitterbuffer — A buffer that deals with network jitter and other transmission faults +
+
+gstrtpptdemux — Parses codec streams transmitted in the same RTP session +
+
+gstrtpsession — Implement an RTP session +
+
+gstrtpssrcdemux — Splits RTP streams based on the SSRC +
+
+halaudiosink — Audio sink for sound device access via HAL +
+
+halaudiosrc — Audio source for sound device access via HAL +
+
+hdv1394src — Source for MPEG-TS video data from firewire port +
+
+icydemux — Read and output ICY tags while demuxing the contents +
+
+id3demux — Read and output ID3v1 and ID3v2 tags while demuxing the contents +
+
+id3v2mux — Adds an ID3v2 header to the beginning of MP3 files using taglib +
+
+imagefreeze — Generates a still frame stream from an image +
+
+interleave — Folds many mono channels into one interleaved audio stream +
+
+ismlmux — Muxer for ISML smooth streaming (.isml) files +
+
+jackaudiosrc — Captures audio from a JACK server +
+
+jackaudiosink — Output audio to a JACK server +
+
+jpegdec — Decode images from JPEG format +
+
+jpegenc — Encode images in JPEG format +
+
+level — RMS/Peak/Decaying Peak Level messager for audio/raw +
+
+matroskamux — Muxes video/audio/subtitle streams into a matroska stream +
+
+matroskademux — Demuxes Matroska/WebM streams into video/audio/subtitles +
+
+mj2mux — Muxer for Motion JPEG-2000 (.mj2) files +
+
+monoscope — Displays a highly stabilised waveform of audio input +
+
+mpegaudioparse — MPEG audio parser +
+
+mp4mux — Muxer for ISO MPEG-4 (.mp4) files +
+
+mulawdec — Convert 8bit mu law to 16bit PCM +
+
+mulawenc — Convert 16bit PCM to 8bit mu law +
+
+multifilesink — Write buffers to a sequentially named set of files +
+
+multifilesrc — Read a sequentially named set of files into buffers +
+
+multipartdemux — demux multipart streams +
+
+multipartmux — mux multipart streams +
+
+multiudpsink — Send data over the network via UDP +
+
+optv — Optical art meets real-time video effect +
+
+oss4mixer — Control sound input and output levels with OSS4 +
+
+oss4sink — Output to a sound card via OSS version 4 +
+
+oss4src — Capture from a sound card via OSS version 4 +
+
+ossmixer — Control sound input and output levels with OSS +
+
+osssink — Output to a sound card via OSS +
+
+osssrc — Capture from a sound card via OSS +
+
+osxaudiosink — Output to a sound card in OS X +
+
+osxaudiosrc — Input from a sound card in OS X +
+
+osxvideosink — OSX native videosink +
+
+pngdec — Decode a png video frame to a raw image +
+
+pngenc — Encode a video frame to a .png image +
+
+progressreport — Periodically query and report on processing progress +
+
+pulsesink — Plays audio to a PulseAudio server +
+
+pulsesrc — Captures audio from a PulseAudio server +
+
+pulsemixer — Control sound input and output levels for PulseAudio +
+
+quarktv — Motion dissolver +
+
+qtdemux — Demultiplex a QuickTime file into audio and video streams +
+
+qtmux — Muxer for quicktime(.mov) files +
+
+qtmoovrecover — Utility element for recovering unfinished quicktime files +
+
+radioactv — motion-enlightment effect +
+
+revtv — A video waveform monitor for each line of video processed +
+
+rganalysis — Perform the ReplayGain analysis +
+
+rglimiter — Apply signal compression to raw audio data +
+
+rgvolume — Apply ReplayGain volume adjustment +
+
+rippletv — RippleTV does ripple mark effect on the video input +
+
+rtpdec — Accepts raw RTP and RTCP packets and sends them forward +
+
+rtpj2kpay — Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371) +
+
+rtpjpegpay — Payload-encodes JPEG pictures into RTP packets (RFC 2435) +
+
+rtspsrc — Receive data over the network via RTSP (RFC 2326) +
+
+shagadelictv — Oh behave, ShagedelicTV makes images shagadelic! +
+
+shapewipe — Adds a shape wipe transition to a video stream +
+
+smokedec — Decode video from Smoke format +
+
+smokeenc — Encode images into the Smoke format +
+
+smpte — Apply the standard SMPTE transitions on video images +
+
+smptealpha — Apply the standard SMPTE transitions as alpha on video images +
+
+souphttpsrc — Receive data as a client over the network via HTTP using SOUP +
+
+spectrum — Run an FFT on the audio signal, output spectrum data +
+
+speexenc — Encodes audio in Speex format +
+
+speexdec — decode speex streams to audio +
+
+splitfilesrc — Read a sequentially named set of files as if it was one large file +
+
+streaktv — StreakTV makes after images of moving objects +
+
+taginject — inject metadata tags +
+
+udpsrc — Receive data over the network via UDP +
+
+udpsink — Send data over the network via UDP +
+
+v4l2src — Reads frames from a Video4Linux2 device +
+
+v4l2sink +
+
+v4l2radio — Controls a Video4Linux2 radio device +
+
+vertigotv — A loopback alpha blending effector with rotating and scaling +
+
+videobalance — Adjusts brightness, contrast, hue, saturation on a video stream +
+
+videobox — Resizes a video by adding borders or cropping +
+
+videocrop — Crops video into a user-defined region +
+
+videoflip — Flips and rotates video +
+
+videomixer — Mix multiple video streams +
+
+videomixer2 — Mix multiple video streams +
+
+warptv — WarpTV does realtime goo'ing of the video input +
+
+wavenc — Encode raw audio into WAV +
+
+waveformsink — WaveForm audio sink +
+
+wavpackdec — Decodes Wavpack audio data +
+
+wavpackenc — Encodes audio with the Wavpack lossless/lossy audio codec +
+
+wavpackparse — Parses Wavpack files +
+
+wavparse — Parse a .wav file into raw audio +
+
+webmmux — Muxes video and audio streams into a WebM stream +
+
+ximagesrc — Creates a screenshot video stream +
+
+y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools) +
+
+
gst-plugins-good Plugins
+
+
+1394 — Source for video data via IEEE1394 interface +
+
+aasink — ASCII Art video sink +
+
+alaw — ALaw audio conversion routines +
+
+alpha — adds an alpha channel to video - constant or via chroma-keying +
+
+alphacolor — RGBA from/to AYUV colorspace conversion preserving the alpha channel +
+
+annodex — annodex stream manipulation (info about annodex: http://www.annodex.net) +
+
+apetag — APEv1/2 tag reader +
+
+audiofx — Audio effects plugin +
+
+auparse — parses au streams +
+
+autodetect — Plugin contains auto-detection plugins for video/audio in- and outputs +
+
+avi — AVI stream handling +
+
+cacasink — Colored ASCII Art video sink +
+
+cairo — Cairo-based elements +
+
+cutter — Audio Cutter to split audio into non-silent bits +
+
+debug — elements for testing and debugging +
+
+deinterlace — Deinterlacer +
+
+directsound — DirectSound plugin +
+
+dv — DV demuxer and decoder based on libdv (libdv.sf.net) +
+
+efence — This element converts a stream of normal GStreamer buffers into a stream of buffers that are allocated in such a way that out-of-bounds access to data in the buffer is more likely to cause segmentation faults. This allocation method is very similar to the debugging tool "Electric Fence". +
+
+equalizer — GStreamer audio equalizers +
+
+effectv — effect plugins from the effectv project +
+
+esdsink — ESD Element Plugins +
+
+flac — The FLAC Lossless compressor Codec +
+
+flv — FLV muxing and demuxing plugin +
+
+flxdec — FLC/FLI/FLX video decoder +
+
+gconfelements — elements wrapping the GStreamer/GConf audio/video output settings +
+
+gdkpixbuf — GdkPixbuf-based image decoder, scaler and sink +
+
+goom — GOOM visualization filter +
+
+goom2k1 — GOOM 2k1 visualization filter +
+
+halelements — elements wrapping the GStreamer/HAL audio input/output devices +
+
+icydemux — Demux ICY tags from a stream +
+
+id3demux — Demux ID3v1 and ID3v2 tags from a file +
+
+imagefreeze — Still frame stream generator +
+
+interleave — Audio interleaver/deinterleaver +
+
+isomp4 — ISO base media file format support (mp4, 3gpp, qt, mj2) +
+
+jack — JACK audio elements +
+
+jpeg — JPeg plugin library +
+
+level — Audio level plugin +
+
+matroska — Matroska and WebM stream handling +
+
+monoscope — Monoscope visualization +
+
+mulaw — MuLaw audio conversion routines +
+
+multifile — Reads/Writes buffers from/to sequentially named files +
+
+multipart — multipart stream manipulation +
+
+navigationtest — Template for a video filter +
+
+oss4 — Open Sound System (OSS) version 4 support for GStreamer +
+
+ossaudio — OSS (Open Sound System) support for GStreamer +
+
+osxaudio — OSX (Mac OS X) audio support for GStreamer +
+
+osxvideo — OSX native video output plugin +
+
+png — PNG plugin library +
+
+pulseaudio — PulseAudio plugin library +
+
+replaygain — ReplayGain volume normalization +
+
+rtp — Real-time protocol plugins +
+
+gstrtpmanager — RTP session management plugin library +
+
+rtsp — transfer data via RTSP +
+
+shapewipe — Shape Wipe transition filter +
+
+shout2send — Sends data to an icecast server using libshout2 +
+
+smpte — Apply the standard SMPTE transitions on video images +
+
+soup — libsoup HTTP client src/sink +
+
+spectrum — Run an FFT on the audio signal, output spectrum data +
+
+speex — Speex plugin library +
+
+taglib — Tag writing plug-in based on taglib +
+
+udp — transfer data via UDP +
+
+video4linux2 — elements for Video 4 Linux +
+
+videobox — resizes a video by adding borders or cropping +
+
+videocrop — Crops video into a user-defined region +
+
+videofilter — Video filters plugin +
+
+videomixer — Video mixer +
+
+waveform — WaveForm API based plugin +
+
+wavenc — Encode raw audio into WAV +
+
+wavpack — Wavpack lossless/lossy audio format handling +
+
+wavparse — Parse a .wav file into raw audio +
+
+ximagesrc — X11 video input plugin using standard Xlib calls +
+
+y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools) +
+
+
gst-plugins-good Base Classes
+
+
+GstIirEqualizer +
+
+GstVideoMixerPad +
+
+GstVideoMixer2Pad +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/plugins/html/index.sgml b/docs/plugins/html/index.sgml new file mode 100644 index 0000000..75d398a --- /dev/null +++ b/docs/plugins/html/index.sgml @@ -0,0 +1,2271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/plugins/html/left.png b/docs/plugins/html/left.png new file mode 100644 index 0000000000000000000000000000000000000000..2d05b3d5b4aeec9384bbfe404bfc4ed0897051c4 GIT binary patch literal 459 zcmV;+0W|)JP)40xL?wO*>WZ(J#ML5j2<9jD6A%Q&kC}jOeEc;X{s;`zcnxLeZR6?6h#^ihmNF6NpGdilO$m<82oD9WQ|6nVv1`? z>KufRi{?QPXg;4;wroQu4?mN1Ydd@|kaQ|ZyWLK!)yi7Wb%=0{}lD)tfliHAUyWRQ+fD_;aV6j->y6!O_8bENg6P)Cd4HCN^TYHBC0dz3r5|}*T3c5!K}0^NPTey!^rYo;W&eW{b1SE%dR-1ljcju- zJITo5P_e{cPDWDszO|97o#m$fni3V4d%~7^?0HU4-k!+X`e~w55Q}HA=c?CM9`EK` z^o5GF_RsnG`ey+9wOf8O4bzg>7W*;jU~M?g`OZAA$mNp|Lz<$s+~N9!2`ir8RcClo$(Q~19INM~9}j;&*|enC yGd}kJak0wj?aUKd8;%}`i}SSew>!A-2iw}^5}Rh(M>+vRkipZ{&t;ucLK6U4uc96R literal 0 HcmV?d00001 diff --git a/docs/plugins/inspect/plugin-1394.xml b/docs/plugins/inspect/plugin-1394.xml new file mode 100644 index 0000000..74e4398 --- /dev/null +++ b/docs/plugins/inspect/plugin-1394.xml @@ -0,0 +1,43 @@ + + 1394 + Source for video data via IEEE1394 interface + ../../ext/raw1394/.libs/libgst1394.so + libgst1394.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + dv1394src + Firewire (1394) DV video source + Source/Video + Source for DV video data from firewire port + Erik Walthinsen <omega@temple-baptist.com>, Daniel Fischer <dan@f3c.com>, Wim Taymans <wim@fluendo.com>, Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + src + source + always +
video/x-dv, format=(string){ NTSC, PAL }, systemstream=(boolean)true
+
+
+
+ + hdv1394src + Firewire (1394) HDV video source + Source/Video + Source for MPEG-TS video data from firewire port + Edward Hervey <bilboed@bilboed.com> + + + src + source + always +
video/mpegts, systemstream=(boolean)true, packetsize=(int)188
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-aasink.xml b/docs/plugins/inspect/plugin-aasink.xml new file mode 100644 index 0000000..41b7484 --- /dev/null +++ b/docs/plugins/inspect/plugin-aasink.xml @@ -0,0 +1,28 @@ + + aasink + ASCII Art video sink + ../../ext/aalib/.libs/libgstaasink.so + libgstaasink.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + aasink + ASCII art video sink + Sink/Video + An ASCII art videosink + Wim Taymans <wim.taymans@chello.be> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-alaw.xml b/docs/plugins/inspect/plugin-alaw.xml new file mode 100644 index 0000000..4dd3192 --- /dev/null +++ b/docs/plugins/inspect/plugin-alaw.xml @@ -0,0 +1,55 @@ + + alaw + ALaw audio conversion routines + ../../gst/law/.libs/libgstalaw.so + libgstalaw.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + alawdec + A Law audio decoder + Codec/Decoder/Audio + Convert 8bit A law to 16bit PCM + Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + sink + sink + always +
audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
+
+ + src + source + always +
audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+
+ + alawenc + A Law audio encoder + Codec/Encoder/Audio + Convert 16bit PCM to 8bit A law + Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+ + src + source + always +
audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-alpha.xml b/docs/plugins/inspect/plugin-alpha.xml new file mode 100644 index 0000000..d9c91f0 --- /dev/null +++ b/docs/plugins/inspect/plugin-alpha.xml @@ -0,0 +1,36 @@ + + alpha + adds an alpha channel to video - constant or via chroma-keying + ../../gst/alpha/.libs/libgstalpha.so + libgstalpha.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + alpha + Alpha filter + Filter/Effect/Video + Adds an alpha channel to video - uniform or via chroma-keying + Wim Taymans <wim@fluendo.com> +Edward Hervey <edward.hervey@collabora.co.uk> +Jan Schmidt <thaytan@noraisin.net> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-alphacolor.xml b/docs/plugins/inspect/plugin-alphacolor.xml new file mode 100644 index 0000000..d488936 --- /dev/null +++ b/docs/plugins/inspect/plugin-alphacolor.xml @@ -0,0 +1,34 @@ + + alphacolor + RGBA from/to AYUV colorspace conversion preserving the alpha channel + ../../gst/alpha/.libs/libgstalphacolor.so + libgstalphacolor.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + alphacolor + Alpha color filter + Filter/Converter/Video + ARGB from/to AYUV colorspace conversion preserving the alpha channel + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-annodex.xml b/docs/plugins/inspect/plugin-annodex.xml new file mode 100644 index 0000000..5cf2db6 --- /dev/null +++ b/docs/plugins/inspect/plugin-annodex.xml @@ -0,0 +1,55 @@ + + annodex + annodex stream manipulation (info about annodex: http://www.annodex.net) + ../../ext/annodex/.libs/libgstannodex.so + libgstannodex.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + cmmldec + CMML stream decoder + Codec/Decoder + Decodes CMML streams + Alessandro Decina <alessandro@nnva.org> + + + sink + sink + always +
text/x-cmml, encoded=(boolean)true
+
+ + src + source + always +
text/x-cmml, encoded=(boolean)false
+
+
+
+ + cmmlenc + CMML streams encoder + Codec/Encoder + Encodes CMML streams + Alessandro Decina <alessandro@nnva.org> + + + sink + sink + always +
text/x-cmml, encoded=(boolean)false
+
+ + src + source + always +
text/x-cmml, encoded=(boolean)true
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-apetag.xml b/docs/plugins/inspect/plugin-apetag.xml new file mode 100644 index 0000000..d57533d --- /dev/null +++ b/docs/plugins/inspect/plugin-apetag.xml @@ -0,0 +1,34 @@ + + apetag + APEv1/2 tag reader + ../../gst/apetag/.libs/libgstapetag.so + libgstapetag.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + apedemux + APE tag demuxer + Codec/Demuxer/Metadata + Read and output APE tags while demuxing the contents + Tim-Philipp Müller <tim centricular net> + + + sink + sink + always +
application/x-apetag
+
+ + src + source + sometimes +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-audiofx.xml b/docs/plugins/inspect/plugin-audiofx.xml new file mode 100644 index 0000000..98462d7 --- /dev/null +++ b/docs/plugins/inspect/plugin-audiofx.xml @@ -0,0 +1,265 @@ + + audiofx + Audio effects plugin + ../../gst/audiofx/.libs/libgstaudiofx.so + libgstaudiofx.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + audioamplify + Audio amplifier + Filter/Effect/Audio + Amplifies an audio stream by a given factor + Sebastian Dröge <slomo@circular-chaos.org> + + + sink + sink + always +
audio/x-raw-int, depth=(int)8, width=(int)8, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, depth=(int)32, width=(int)32, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, depth=(int)8, width=(int)8, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, depth=(int)32, width=(int)32, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audiochebband + Band pass & band reject filter + Filter/Effect/Audio + Chebyshev band pass and band reject filter + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audiocheblimit + Low pass & high pass filter + Filter/Effect/Audio + Chebyshev low pass and high pass filter + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audiodynamic + Dynamic range controller + Filter/Effect/Audio + Compressor and Expander + Sebastian Dröge <slomo@circular-chaos.org> + + + sink + sink + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audioecho + Audio echo + Filter/Effect/Audio + Adds an echo or reverb effect to an audio stream + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audiofirfilter + Audio FIR filter + Filter/Effect/Audio + Generic audio FIR filter with custom filter kernel + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audioiirfilter + Audio IIR filter + Filter/Effect/Audio + Generic audio IIR filter with custom filter kernel + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audioinvert + Audio inversion + Filter/Effect/Audio + Swaps upper and lower half of audio samples + Sebastian Dröge <slomo@circular-chaos.org> + + + sink + sink + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audiokaraoke + AudioKaraoke + Filter/Effect/Audio + Removes voice from sound + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audiopanorama + Stereo positioning + Filter/Effect/Audio + Positions audio streams in the stereo panorama + Stefan Kost <ensonic@users.sf.net> + + + sink + sink + always +
audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+ + src + source + always +
audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)32; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+
+ + audiowsincband + Band pass & band reject filter + Filter/Effect/Audio + Band pass and band reject windowed sinc filter + Thomas Vander Stichele <thomas at apestaart dot org>, Steven W. Smith, Dreamlab Technologies Ltd. <mathis.hofer@dreamlab.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + audiowsinclimit + Low pass & high pass filter + Filter/Effect/Audio + Low pass and high pass windowed sinc filter + Thomas Vander Stichele <thomas at apestaart dot org>, Steven W. Smith, Dreamlab Technologies Ltd. <mathis.hofer@dreamlab.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-audioparsers.xml b/docs/plugins/inspect/plugin-audioparsers.xml new file mode 100644 index 0000000..5579512 --- /dev/null +++ b/docs/plugins/inspect/plugin-audioparsers.xml @@ -0,0 +1,139 @@ + + audioparsers + Parsers for various audio formats + ../../gst/audioparsers/.libs/libgstaudioparsers.so + libgstaudioparsers.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + aacparse + AAC audio stream parser + Codec/Parser/Audio + Advanced Audio Coding parser + Stefan Kost <stefan.kost@nokia.com> + + + sink + sink + always +
audio/mpeg, mpegversion=(int){ 2, 4 }
+
+ + src + source + always +
audio/mpeg, framed=(boolean)true, mpegversion=(int){ 2, 4 }, stream-format=(string){ raw, adts, adif }
+
+
+
+ + ac3parse + AC3 audio stream parser + Codec/Parser/Converter/Audio + AC3 parser + Tim-Philipp Müller <tim centricular net> + + + sink + sink + always +
audio/x-ac3; audio/x-eac3; audio/ac3
+
+ + src + source + always +
audio/x-ac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }; audio/x-eac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }
+
+
+
+ + amrparse + AMR audio stream parser + Codec/Parser/Audio + Adaptive Multi-Rate audio parser + Ronald Bultje <rbultje@ronald.bitfreak.net> + + + sink + sink + always +
audio/x-amr-nb-sh; audio/x-amr-wb-sh
+
+ + src + source + always +
audio/AMR, rate=(int)8000, channels=(int)1; audio/AMR-WB, rate=(int)16000, channels=(int)1
+
+
+
+ + dcaparse + DTS Coherent Acoustics audio stream parser + Codec/Parser/Audio + DCA parser + Tim-Philipp Müller <tim centricular net> + + + sink + sink + always +
audio/x-dts
+
+ + src + source + always +
audio/x-dts, framed=(boolean)true, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 192000 ], depth=(int){ 14, 16 }, endianness=(int){ 1234, 4321 }, block-size=(int)[ 1, 2147483647 ], frame-size=(int)[ 1, 2147483647 ]
+
+
+
+ + flacparse + FLAC audio parser + Codec/Parser/Audio + Parses audio with the FLAC lossless audio codec + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-flac
+
+ + src + source + always +
audio/x-flac, framed=(boolean)true, channels=(int)[ 1, 8 ], rate=(int)[ 1, 655350 ]
+
+
+
+ + mpegaudioparse + MPEG1 Audio Parser + Codec/Parser/Audio + Parses and frames mpeg1 audio streams (levels 1-3), provides seek + Jan Schmidt <thaytan@mad.scientist.com>,Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + + + sink + sink + always +
audio/mpeg, mpegversion=(int)1
+
+ + src + source + always +
audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], mpegaudioversion=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ], parsed=(boolean)true
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-auparse.xml b/docs/plugins/inspect/plugin-auparse.xml new file mode 100644 index 0000000..606d88c --- /dev/null +++ b/docs/plugins/inspect/plugin-auparse.xml @@ -0,0 +1,34 @@ + + auparse + parses au streams + ../../gst/auparse/.libs/libgstauparse.so + libgstauparse.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + auparse + AU audio demuxer + Codec/Demuxer/Audio + Parse an .au file into raw audio + Erik Walthinsen <omega@cse.ogi.edu> + + + sink + sink + always +
audio/x-au
+
+ + src + source + sometimes +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }; audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string){ g721, g722, g723_3, g723_5 }
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-autodetect.xml b/docs/plugins/inspect/plugin-autodetect.xml new file mode 100644 index 0000000..bda0f2e --- /dev/null +++ b/docs/plugins/inspect/plugin-autodetect.xml @@ -0,0 +1,73 @@ + + autodetect + Plugin contains auto-detection plugins for video/audio in- and outputs + ../../gst/autodetect/.libs/libgstautodetect.so + libgstautodetect.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + autoaudiosink + Auto audio sink + Sink/Audio + Wrapper audio sink for automatically detected audio sink + Jan Schmidt <thaytan@noraisin.net> + + + sink + sink + always +
ANY
+
+
+
+ + autoaudiosrc + Auto audio source + Source/Audio + Wrapper audio source for automatically detected audio source + Jan Schmidt <thaytan@noraisin.net>, Stefan Kost <ensonic@users.sf.net> + + + src + source + always +
ANY
+
+
+
+ + autovideosink + Auto video sink + Sink/Video + Wrapper video sink for automatically detected video sink + Jan Schmidt <thaytan@noraisin.net> + + + sink + sink + always +
ANY
+
+
+
+ + autovideosrc + Auto video source + Source/Video + Wrapper video source for automatically detected video source + Jan Schmidt <thaytan@noraisin.net>, Stefan Kost <ensonic@users.sf.net> + + + src + source + always +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-avi.xml b/docs/plugins/inspect/plugin-avi.xml new file mode 100644 index 0000000..14128ab --- /dev/null +++ b/docs/plugins/inspect/plugin-avi.xml @@ -0,0 +1,94 @@ + + avi + AVI stream handling + ../../gst/avi/.libs/libgstavi.so + libgstavi.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + avidemux + Avi demuxer + Codec/Demuxer + Demultiplex an avi file into audio and video + Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be>, Thijs Vermeir <thijsvermeir@gmail.com> + + + sink + sink + always +
video/x-msvideo
+
+ + audio_%02d + source + sometimes +
audio/ms-gsm, rate=(int)[ 1, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)3, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)2, rate=(int)[ 16000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]; audio/x-vorbis, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-dts; audio/mpeg, mpegversion=(int)4, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 8 ]; audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-wms, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)dvi, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-truespeech, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/x-wma, wmaversion=(int)1, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)2, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)3, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-vnd.sony.atrac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]; audio/x-voxware, voxwaretype=(int)117, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dk4, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dk3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dvi, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/AMR, rate=(int)8000, channels=(int)1; audio/AMR-WB, rate=(int)16000, channels=(int)1; audio/x-siren; application/x-ogg-avi; audio/x-avi-unknown
+
+ + subtitle_%02d + source + sometimes +
application/x-subtitle-avi
+
+ + video_%02d + source + sometimes +
video/x-3ivx, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-asus, asusversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-asus, asusversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-cirrus-logic-accupak, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-camstudio, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-compressed-yuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-rgb, bpp=(int){ 8, 24, 32 }, depth=(int){ 8, 24 }, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-truemotion, trueversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)false, dvversion=(int)25, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)false, dvversion=(int)50, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, mpegversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-flash-video, flvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp6-flash, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)lucent, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h264, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-huffyuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-intel-h263, variant=(string)intel, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-indeo, indeoversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-indeo, indeoversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-indeo, indeoversion=(int)5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)lead, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h264, variant=(string)lead, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)microsoft, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, mpegversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; image/jpeg, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)42, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)43, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, systemstream=(boolean)false, mpegversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, systemstream=(boolean)false, mpegversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)41, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-mszh, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; image/png, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-rle, layout=(string)microsoft, depth=(int)[ 1, 64 ], framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-indeo, indeoversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/sp5x, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-truemotion, trueversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-camtasia, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-ultimotion, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)UYVY, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-ati-vcr, vcrversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-ati-vcr, vcrversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)vdolive, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)vivo, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vmnc, version=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h264, variant=(string)videosoft, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-wmv, wmvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-wmv, wmvversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-wmv, wmvversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-xvid, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-xan, wcversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)YUY2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)YVU9, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-zlib, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-cinepak, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h264, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msvideocodec, msvideoversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)xirlink, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dirac, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-ffv, ffvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-kmvc, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp6, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp6-flash, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp7, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp8, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-mimic, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-apple-video, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-theora, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-fraps, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-aasc, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)YV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-loco, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-zmbv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)true; video/x-avi-unknown
+
+
+
+ + avimux + Avi muxer + Codec/Muxer + Muxes audio and video into an avi stream + GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> + + + audio_%d + sink + request +
audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-wma, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], wmaversion=(int)[ 1, 2 ]
+
+ + video_%d + sink + request +
video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], divxversion=(int)[ 3, 5 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], msmpegversion=(int)[ 41, 43 ]; video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-dv, width=(int)720, height=(int){ 576, 480 }, framerate=(fraction)[ 0/1, 2147483647/1 ], systemstream=(boolean)false; video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-wmv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], wmvversion=(int)[ 1, 3 ]; image/x-jpc, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-vp8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-msvideo
+
+
+
+ + avisubtitle + Avi subtitle parser + Codec/Parser/Subtitle + Parse avi subtitle stream + Thijs Vermeir <thijsvermeir@gmail.com> + + + sink + sink + always +
application/x-subtitle-avi
+
+ + src + source + always +
application/x-subtitle
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-cacasink.xml b/docs/plugins/inspect/plugin-cacasink.xml new file mode 100644 index 0000000..389f32a --- /dev/null +++ b/docs/plugins/inspect/plugin-cacasink.xml @@ -0,0 +1,28 @@ + + cacasink + Colored ASCII Art video sink + ../../ext/libcaca/.libs/libgstcacasink.so + libgstcacasink.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + cacasink + A colored ASCII art video sink + Sink/Video + A colored ASCII art videosink + Zeeshan Ali <zak147@yahoo.com> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-cairo.xml b/docs/plugins/inspect/plugin-cairo.xml new file mode 100644 index 0000000..1cbb913 --- /dev/null +++ b/docs/plugins/inspect/plugin-cairo.xml @@ -0,0 +1,103 @@ + + cairo + Cairo-based elements + ../../ext/cairo/.libs/libgstcairo.so + libgstcairo.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + cairooverlay + Cairo overlay + Filter/Editor/Video + Render overlay on a video stream using Cairo + Jon Nordby <jononor@gmail.com> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + cairorender + Cairo encoder + Codec/Encoder + Encodes streams using Cairo + Lutz Mueller <lutz@topfrose.de> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/png, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
application/pdf, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; application/postscript, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; image/svg+xml, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; image/png, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]
+
+
+
+ + cairotextoverlay + Text overlay + Filter/Editor/Video + Adds text strings on top of a video buffer + David Schleef <ds@schleef.org> + + + text_sink + sink + always +
text/plain
+
+ + video_sink + sink + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + cairotimeoverlay + Time overlay + Filter/Editor/Video + Overlays the time on a video stream + David Schleef <ds@schleef.org> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-cutter.xml b/docs/plugins/inspect/plugin-cutter.xml new file mode 100644 index 0000000..1a3dd78 --- /dev/null +++ b/docs/plugins/inspect/plugin-cutter.xml @@ -0,0 +1,34 @@ + + cutter + Audio Cutter to split audio into non-silent bits + ../../gst/cutter/.libs/libgstcutter.so + libgstcutter.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + cutter + Audio cutter + Filter/Editor/Audio + Audio Cutter to split audio into non-silent bits + Thomas Vander Stichele <thomas at apestaart dot org> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true
+
+ + src + source + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-debug.xml b/docs/plugins/inspect/plugin-debug.xml new file mode 100644 index 0000000..dedcb7e --- /dev/null +++ b/docs/plugins/inspect/plugin-debug.xml @@ -0,0 +1,211 @@ + + debug + elements for testing and debugging + ../../gst/debugutils/.libs/libgstdebug.so + libgstdebug.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + breakmydata + Break my data + Testing + randomly change data in the stream + Benjamin Otte <otte@gnome> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+ + capsdebug + Caps debug + Generic + Debug caps negotiation + David Schleef <ds@schleef.org> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+ + capssetter + CapsSetter + Generic + Set/merge caps on stream + Mark Nauwelaerts <mnauw@users.sourceforge.net> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+ + cpureport + CPU report + Testing + Post cpu usage information every buffer + Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+ + navseek + Seek based on left-right arrows + Filter/Video + Seek based on navigation keys left-right + Jan Schmidt <thaytan@mad.scientist.com> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+ + progressreport + Progress report + Testing + Periodically query and report on processing progress + Jan Schmidt <thaytan@mad.scientist.com> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+ + pushfilesrc + Push File Source + Testing + Implements pushfile:// URI-handler for push-based file access + Tim-Philipp Müller <tim centricular net> + + + src + source + always +
ANY
+
+
+
+ + rndbuffersize + Random buffer size + Testing + pull random sized buffers + Stefan Kost <stefan.kost@nokia.com> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+ + taginject + TagInject + Generic + inject metadata tags + Stefan Kost <ensonic@users.sf.net> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+ + testsink + Test plugin + Testing + perform a number of tests + Benjamin Otte <otte@gnome> + + + sink + sink + always +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-deinterlace.xml b/docs/plugins/inspect/plugin-deinterlace.xml new file mode 100644 index 0000000..da67e47 --- /dev/null +++ b/docs/plugins/inspect/plugin-deinterlace.xml @@ -0,0 +1,34 @@ + + deinterlace + Deinterlacer + ../../gst/deinterlace/.libs/libgstdeinterlace.so + libgstdeinterlace.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + deinterlace + Deinterlacer + Filter/Effect/Video/Deinterlace + Deinterlace Methods ported from DScaler/TvTime + Martin Eikermann <meiker@upb.de>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc){ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc){ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-directsound.xml b/docs/plugins/inspect/plugin-directsound.xml new file mode 100644 index 0000000..899ccd6 --- /dev/null +++ b/docs/plugins/inspect/plugin-directsound.xml @@ -0,0 +1,20 @@ + + directsound + DirectSound plugin + ../../win32/vs6/release/libgstdirectsound.dll + libgstdirectsound.dll + 0.10.4.1 + LGPL + gst-plugins-bad + GStreamer Good Plug-ins CVS + Unknown package origin + + + directsoundsink + DirectSound audio sink + Sink/Audio + DirectSound audio sink + Sebastien Moutte <sebastien@moutte.net> + + + diff --git a/docs/plugins/inspect/plugin-dv.xml b/docs/plugins/inspect/plugin-dv.xml new file mode 100644 index 0000000..27be1a9 --- /dev/null +++ b/docs/plugins/inspect/plugin-dv.xml @@ -0,0 +1,61 @@ + + dv + DV demuxer and decoder based on libdv (libdv.sf.net) + ../../ext/dv/.libs/libgstdv.so + libgstdv.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + dvdec + DV video decoder + Codec/Decoder/Video + Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net) + Erik Walthinsen <omega@cse.ogi.edu>,Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
video/x-dv, systemstream=(boolean)false
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]
+
+
+
+ + dvdemux + DV system stream demuxer + Codec/Demuxer + Uses libdv to separate DV audio from DV video (libdv.sourceforge.net) + Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
video/x-dv, systemstream=(boolean)true
+
+ + audio + source + sometimes +
audio/x-raw-int, depth=(int)16, width=(int)16, signed=(boolean)true, channels=(int){ 2, 4 }, endianness=(int)1234, rate=(int){ 32000, 44100, 48000 }
+
+ + video + source + sometimes +
video/x-dv, systemstream=(boolean)false
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-efence.xml b/docs/plugins/inspect/plugin-efence.xml new file mode 100644 index 0000000..dae0fda --- /dev/null +++ b/docs/plugins/inspect/plugin-efence.xml @@ -0,0 +1,34 @@ + + efence + This element converts a stream of normal GStreamer buffers into a stream of buffers that are allocated in such a way that out-of-bounds access to data in the buffer is more likely to cause segmentation faults. This allocation method is very similar to the debugging tool "Electric Fence". + ../../gst/debugutils/.libs/libgstefence.so + libgstefence.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + efence + Electric Fence + Testing + This element converts a stream of normal GStreamer buffers into a stream of buffers that are allocated in such a way that out-of-bounds access to data in the buffer is more likely to cause segmentation faults. This allocation method is very similar to the debugging tool "Electric Fence". + David A. Schleef <ds@schleef.org> + + + sink + sink + always +
ANY
+
+ + src + source + always +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-effectv.xml b/docs/plugins/inspect/plugin-effectv.xml new file mode 100644 index 0000000..60ea0d8 --- /dev/null +++ b/docs/plugins/inspect/plugin-effectv.xml @@ -0,0 +1,265 @@ + + effectv + effect plugins from the effectv project + ../../gst/effectv/.libs/libgsteffectv.so + libgsteffectv.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + agingtv + AgingTV effect + Filter/Effect/Video + AgingTV adds age to video input using scratches and dust + Sam Lantinga <slouken@devolution.com> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + dicetv + DiceTV effect + Filter/Effect/Video + 'Dices' the screen up into many small squares + Wim Taymans <wim.taymans@chello.be> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + edgetv + EdgeTV effect + Filter/Effect/Video + Apply edge detect on video + Wim Taymans <wim.taymans@chello.be> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + optv + OpTV effect + Filter/Effect/Video + Optical art meets real-time video effect + FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + quarktv + QuarkTV effect + Filter/Effect/Video + Motion dissolver + FUKUCHI, Kentarou <fukuchi@users.sourceforge.net> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + radioactv + RadioacTV effect + Filter/Effect/Video + motion-enlightment effect + FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + revtv + RevTV effect + Filter/Effect/Video + A video waveform monitor for each line of video processed + Wim Taymans <wim.taymans@chello.be> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + rippletv + RippleTV effect + Filter/Effect/Video + RippleTV does ripple mark effect on the video input + FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + shagadelictv + ShagadelicTV + Filter/Effect/Video + Oh behave, ShagedelicTV makes images shagadelic! + Wim Taymans <wim.taymans@chello.be> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + streaktv + StreakTV effect + Filter/Effect/Video + StreakTV makes after images of moving objects + FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + vertigotv + VertigoTV effect + Filter/Effect/Video + A loopback alpha blending effector with rotating and scaling + Wim Taymans <wim.taymans@chello.be> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + warptv + WarpTV effect + Filter/Effect/Video + WarpTV does realtime goo'ing of the video input + Sam Lantinga <slouken@devolution.com> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-equalizer.xml b/docs/plugins/inspect/plugin-equalizer.xml new file mode 100644 index 0000000..fc9588c --- /dev/null +++ b/docs/plugins/inspect/plugin-equalizer.xml @@ -0,0 +1,76 @@ + + equalizer + GStreamer audio equalizers + ../../gst/equalizer/.libs/libgstequalizer.so + libgstequalizer.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + equalizer-10bands + 10 Band Equalizer + Filter/Effect/Audio + Direct Form 10 band IIR equalizer + Stefan Kost <ensonic@users.sf.net> + + + sink + sink + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + equalizer-3bands + 3 Band Equalizer + Filter/Effect/Audio + Direct Form 3 band IIR equalizer + Stefan Kost <ensonic@users.sf.net> + + + sink + sink + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + equalizer-nbands + N Band Equalizer + Filter/Effect/Audio + Direct Form IIR equalizer + Benjamin Otte <otte@gnome.org>, Stefan Kost <ensonic@users.sf.net> + + + sink + sink + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-esdsink.xml b/docs/plugins/inspect/plugin-esdsink.xml new file mode 100644 index 0000000..85ec8dc --- /dev/null +++ b/docs/plugins/inspect/plugin-esdsink.xml @@ -0,0 +1,28 @@ + + esdsink + ESD Element Plugins + ../../ext/esd/.libs/libgstesd.so + libgstesd.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + esdsink + Esound audio sink + Sink/Audio + Plays audio to an esound server + Arwed von Merkatz <v.merkatz@gmx.net> + + + sink + sink + always +
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-flac.xml b/docs/plugins/inspect/plugin-flac.xml new file mode 100644 index 0000000..763eb6e --- /dev/null +++ b/docs/plugins/inspect/plugin-flac.xml @@ -0,0 +1,76 @@ + + flac + The FLAC Lossless compressor Codec + ../../ext/flac/.libs/libgstflac.so + libgstflac.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + flacdec + FLAC audio decoder + Codec/Decoder/Audio + Decodes FLAC lossless audio streams + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
audio/x-flac
+
+ + src + source + always +
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int){ 8, 16, 32 }, depth=(int)[ 4, 32 ], rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]
+
+
+
+ + flacenc + FLAC audio encoder + Codec/Encoder/Audio + Encodes audio with the FLAC lossless audio encoder + Wim Taymans <wim.taymans@chello.be> + + + sink + sink + always +
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)8, depth=(int)8, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int){ 12, 16 }, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)32, depth=(int){ 20, 24 }, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]
+
+ + src + source + always +
audio/x-flac
+
+
+
+ + flactag + FLAC tagger + Formatter/Metadata + Rewrite tags in a FLAC file + Christophe Fergeau <teuf@gnome.org> + + + sink + sink + always +
audio/x-flac
+
+ + src + source + always +
audio/x-flac
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-flv.xml b/docs/plugins/inspect/plugin-flv.xml new file mode 100644 index 0000000..8ac1fe8 --- /dev/null +++ b/docs/plugins/inspect/plugin-flv.xml @@ -0,0 +1,67 @@ + + flv + FLV muxing and demuxing plugin + ../../gst/flv/.libs/libgstflv.so + libgstflv.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + flvdemux + FLV Demuxer + Codec/Demuxer + Demux FLV feeds into digital streams + Julien Moutte <julien@moutte.net> + + + sink + sink + always +
video/x-flv
+
+ + audio + source + sometimes +
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, stream-format=(string)raw, framed=(boolean)true; 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 }
+
+ + video + source + sometimes +
video/x-flash-video; video/x-flash-screen; video/x-vp6-flash; video/x-vp6-alpha; video/x-h264, stream-format=(string)avc
+
+
+
+ + flvmux + FLV muxer + Codec/Muxer + Muxes video/audio streams into a FLV stream + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + audio + sink + request +
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)2, framed=(boolean)true; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, framed=(boolean)true; 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 }
+
+ + video + sink + request +
video/x-flash-video; video/x-flash-screen; video/x-vp6-flash; video/x-vp6-alpha; video/x-h264, stream-format=(string)avc
+
+ + src + source + always +
video/x-flv
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-flxdec.xml b/docs/plugins/inspect/plugin-flxdec.xml new file mode 100644 index 0000000..f7049cd --- /dev/null +++ b/docs/plugins/inspect/plugin-flxdec.xml @@ -0,0 +1,34 @@ + + flxdec + FLC/FLI/FLX video decoder + ../../gst/flx/.libs/libgstflxdec.so + libgstflxdec.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + flxdec + FLX video decoder + Codec/Decoder/Video + FLC/FLI/FLX video decoder + Sepp Wijnands <mrrazz@garbage-coderz.net>, Zeeshan Ali <zeenix@gmail.com> + + + sink + sink + always +
video/x-fli
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-gconfelements.xml b/docs/plugins/inspect/plugin-gconfelements.xml new file mode 100644 index 0000000..e451ebc --- /dev/null +++ b/docs/plugins/inspect/plugin-gconfelements.xml @@ -0,0 +1,49 @@ + + gconfelements + elements wrapping the GStreamer/GConf audio/video output settings + ../../ext/gconf/.libs/libgstgconfelements.so + libgstgconfelements.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + gconfaudiosink + GConf audio sink + Sink/Audio + Audio sink embedding the GConf-settings for audio output + Jan Schmidt <thaytan@mad.scientist.com> + + + + + gconfaudiosrc + GConf audio source + Source/Audio + Audio source embedding the GConf-settings for audio input + GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> + + + + + gconfvideosink + GConf video sink + Sink/Video + Video sink embedding the GConf-settings for video output + GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> + + + + + gconfvideosrc + GConf video source + Source/Video + Video source embedding the GConf-settings for video input + GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> + + + + + \ No newline at end of file diff --git a/docs/plugins/inspect/plugin-gdkpixbuf.xml b/docs/plugins/inspect/plugin-gdkpixbuf.xml new file mode 100644 index 0000000..23e32c3 --- /dev/null +++ b/docs/plugins/inspect/plugin-gdkpixbuf.xml @@ -0,0 +1,70 @@ + + gdkpixbuf + GdkPixbuf-based image decoder, scaler and sink + ../../ext/gdk_pixbuf/.libs/libgstgdkpixbuf.so + libgstgdkpixbuf.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + gdkpixbufdec + GdkPixbuf image decoder + Codec/Decoder/Image + Decodes images in a video stream using GdkPixbuf + David A. Schleef <ds@schleef.org>, Renato Filho <renato.filho@indt.org.br> + + + sink + sink + always +
image/png; image/gif; image/x-icon; application/x-navi-animation; image/x-cmu-raster; image/x-sun-raster; image/x-pixmap; image/tiff; image/x-portable-anymap; image/x-portable-bitmap; image/x-portable-graymap; image/x-portable-pixmap; image/bmp; image/x-bmp; image/x-MS-bmp; image/vnd.wap.wbmp; image/x-bitmap; image/x-tga; image/x-pcx; image/svg; image/svg+xml
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + gdkpixbufscale + GdkPixbuf image scaler + Filter/Effect/Video + Resizes video + Jan Schmidt <thaytan@mad.scientist.com>, Wim Taymans <wim.taymans@chello.be>, Renato Filho <renato.filho@indt.org.br> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + gdkpixbufsink + GdkPixbuf sink + Sink/Video + Output images as GdkPixbuf objects in bus messages + Tim-Philipp Müller <tim centricular net> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-goom.xml b/docs/plugins/inspect/plugin-goom.xml new file mode 100644 index 0000000..7d4ad4b --- /dev/null +++ b/docs/plugins/inspect/plugin-goom.xml @@ -0,0 +1,34 @@ + + goom + GOOM visualization filter + ../../gst/goom/.libs/libgstgoom.so + libgstgoom.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + goom + GOOM: what a GOOM! + Visualization + Takes frames of data and outputs video frames using the GOOM filter + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int){ 1, 2 }
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-goom2k1.xml b/docs/plugins/inspect/plugin-goom2k1.xml new file mode 100644 index 0000000..4f57b00 --- /dev/null +++ b/docs/plugins/inspect/plugin-goom2k1.xml @@ -0,0 +1,34 @@ + + goom2k1 + GOOM 2k1 visualization filter + ../../gst/goom2k1/.libs/libgstgoom2k1.so + libgstgoom2k1.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + goom2k1 + GOOM: what a GOOM! 2k1 edition + Visualization + Takes frames of data and outputs video frames using the GOOM 2k1 filter + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int){ 1, 2 }
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-gstrtpmanager.xml b/docs/plugins/inspect/plugin-gstrtpmanager.xml new file mode 100644 index 0000000..1d4ecab --- /dev/null +++ b/docs/plugins/inspect/plugin-gstrtpmanager.xml @@ -0,0 +1,190 @@ + + gstrtpmanager + RTP session management plugin library + ../../gst/rtpmanager/.libs/libgstrtpmanager.so + libgstrtpmanager.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + gstrtpbin + RTP Bin + Filter/Network/RTP + Real-Time Transport Protocol bin + Wim Taymans <wim.taymans@gmail.com> + + + recv_rtcp_sink_%d + sink + request +
application/x-rtcp
+
+ + recv_rtp_sink_%d + sink + request +
application/x-rtp
+
+ + send_rtp_sink_%d + sink + request +
application/x-rtp
+
+ + recv_rtp_src_%d_%d_%d + source + sometimes +
application/x-rtp
+
+ + send_rtp_src_%d + source + sometimes +
application/x-rtp
+
+ + send_rtcp_src_%d + source + request +
application/x-rtcp
+
+
+
+ + gstrtpjitterbuffer + RTP packet jitter-buffer + Filter/Network/RTP + A buffer that deals with network jitter and other transmission faults + Philippe Kalaf <philippe.kalaf@collabora.co.uk>, Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, clock-rate=(int)[ 1, 2147483647 ]
+
+ + sink_rtcp + sink + request +
application/x-rtcp
+
+ + src + source + always +
application/x-rtp
+
+
+
+ + gstrtpptdemux + RTP Demux + Demux/Network/RTP + Parses codec streams transmitted in the same RTP session + Kai Vehmanen <kai.vehmanen@nokia.com> + + + sink + sink + always +
application/x-rtp
+
+ + src_%d + source + sometimes +
application/x-rtp, payload=(int)[ 0, 255 ]
+
+
+
+ + gstrtpsession + RTP Session + Filter/Network/RTP + Implement an RTP session + Wim Taymans <wim.taymans@gmail.com> + + + recv_rtcp_sink + sink + request +
application/x-rtcp
+
+ + recv_rtp_sink + sink + request +
application/x-rtp
+
+ + send_rtp_sink + sink + request +
application/x-rtp
+
+ + recv_rtp_src + source + sometimes +
application/x-rtp
+
+ + send_rtp_src + source + sometimes +
application/x-rtp
+
+ + sync_src + source + sometimes +
application/x-rtcp
+
+ + send_rtcp_src + source + request +
application/x-rtcp
+
+
+
+ + gstrtpssrcdemux + RTP SSRC Demux + Demux/Network/RTP + Splits RTP streams based on the SSRC + Wim Taymans <wim.taymans@gmail.com> + + + rtcp_sink + sink + always +
application/x-rtcp
+
+ + sink + sink + always +
application/x-rtp
+
+ + rtcp_src_%d + source + sometimes +
application/x-rtcp
+
+ + src_%d + source + sometimes +
application/x-rtp
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-halelements.xml b/docs/plugins/inspect/plugin-halelements.xml new file mode 100644 index 0000000..70e9892 --- /dev/null +++ b/docs/plugins/inspect/plugin-halelements.xml @@ -0,0 +1,43 @@ + + halelements + elements wrapping the GStreamer/HAL audio input/output devices + ../../ext/hal/.libs/libgsthalelements.so + libgsthalelements.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + halaudiosink + HAL audio sink + Sink/Audio + Audio sink for sound device access via HAL + Jürg Billeter <j@bitron.ch> + + + sink + sink + always +
ANY
+
+
+
+ + halaudiosrc + HAL audio source + Source/Audio + Audio source for sound device access via HAL + Jürg Billeter <j@bitron.ch> + + + src + source + always +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-icydemux.xml b/docs/plugins/inspect/plugin-icydemux.xml new file mode 100644 index 0000000..612b740 --- /dev/null +++ b/docs/plugins/inspect/plugin-icydemux.xml @@ -0,0 +1,34 @@ + + icydemux + Demux ICY tags from a stream + ../../gst/icydemux/.libs/libgsticydemux.so + libgsticydemux.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + icydemux + ICY tag demuxer + Codec/Demuxer/Metadata + Read and output ICY tags while demuxing the contents + Jan Schmidt <thaytan@mad.scientist.com>, Michael Smith <msmith@fluendo.com> + + + sink + sink + always +
application/x-icy, metadata-interval=(int)[ 0, 2147483647 ]
+
+ + src + source + sometimes +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-id3demux.xml b/docs/plugins/inspect/plugin-id3demux.xml new file mode 100644 index 0000000..78d85c6 --- /dev/null +++ b/docs/plugins/inspect/plugin-id3demux.xml @@ -0,0 +1,34 @@ + + id3demux + Demux ID3v1 and ID3v2 tags from a file + ../../gst/id3demux/.libs/libgstid3demux.so + libgstid3demux.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + id3demux + ID3 tag demuxer + Codec/Demuxer/Metadata + Read and output ID3v1 and ID3v2 tags while demuxing the contents + Jan Schmidt <thaytan@mad.scientist.com> + + + sink + sink + always +
application/x-id3
+
+ + src + source + sometimes +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-imagefreeze.xml b/docs/plugins/inspect/plugin-imagefreeze.xml new file mode 100644 index 0000000..d63157f --- /dev/null +++ b/docs/plugins/inspect/plugin-imagefreeze.xml @@ -0,0 +1,34 @@ + + imagefreeze + Still frame stream generator + ../../gst/imagefreeze/.libs/libgstimagefreeze.so + libgstimagefreeze.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + imagefreeze + Still frame stream generator + Filter/Video + Generates a still frame stream from an image + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray
+
+ + src + source + always +
video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-interleave.xml b/docs/plugins/inspect/plugin-interleave.xml new file mode 100644 index 0000000..cacd3bc --- /dev/null +++ b/docs/plugins/inspect/plugin-interleave.xml @@ -0,0 +1,55 @@ + + interleave + Audio interleaver/deinterleaver + ../../gst/interleave/.libs/libgstinterleave.so + libgstinterleave.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + deinterleave + Audio deinterleaver + Filter/Converter/Audio + Splits one interleaved multichannel audio stream into many mono audio streams + Andy Wingo <wingo at pobox.com>, Iain <iain@prettypeople.org>, Sebastian Dröge <slomo@circular-chaos.org> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
+
+ + src%d + source + sometimes +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
+
+
+
+ + interleave + Audio interleaver + Filter/Converter/Audio + Folds many mono channels into one interleaved audio stream + Andy Wingo <wingo at pobox.com>, Sebastian Dröge <slomo@circular-chaos.org> + + + sink%d + sink + request +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean)true; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
+
+ + src + source + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean)true; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-isomp4.xml b/docs/plugins/inspect/plugin-isomp4.xml new file mode 100644 index 0000000..f71d1f9 --- /dev/null +++ b/docs/plugins/inspect/plugin-isomp4.xml @@ -0,0 +1,238 @@ + + isomp4 + ISO base media file format support (mp4, 3gpp, qt, mj2) + ../../gst/isomp4/.libs/libgstisomp4.so + libgstisomp4.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + 3gppmux + 3GPP Muxer + Codec/Muxer + Multiplex audio and video into a 3GPP file + Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> + + + audio_%d + sink + request +
audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]
+
+ + video_%d + sink + request +
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, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/quicktime, variant=(string)3gpp
+
+
+
+ + gppmux + 3GPP Muxer + Codec/Muxer + Multiplex audio and video into a 3GPP file (deprecated) + Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> + + + audio_%d + sink + request +
audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]
+
+ + video_%d + sink + request +
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, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/quicktime, variant=(string)3gpp
+
+
+
+ + ismlmux + ISML Muxer + Codec/Muxer + Multiplex audio and video into a ISML file + Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> + + + audio_%d + sink + request +
audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]
+
+ + video_%d + sink + request +
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, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/quicktime, variant=(string)iso-fragmented
+
+
+
+ + mj2mux + MJ2 Muxer + Codec/Muxer + Multiplex audio and video into a MJ2 file + Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> + + + audio_%d + sink + request +
audio/x-raw-int, width=(int)8, depth=(int)8, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean){ true, false }; audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true
+
+ + video_%d + sink + request +
image/x-j2c, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/x-jpc, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/mj2
+
+
+
+ + mp4mux + MP4 Muxer + Codec/Muxer + Multiplex audio and video into a MP4 file + Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> + + + audio_%d + sink + request +
audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]; audio/x-alac, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]
+
+ + video_%d + sink + request +
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, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-mp4-part, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/quicktime, variant=(string)iso
+
+
+
+ + qtdemux + QuickTime demuxer + Codec/Demuxer + Demultiplex a QuickTime file into audio and video streams + David Schleef <ds@schleef.org>, Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
video/quicktime; video/mj2; audio/x-m4a; application/x-3gp
+
+ + audio_%02d + source + sometimes +
ANY
+
+ + subtitle_%02d + source + sometimes +
ANY
+
+ + video_%02d + source + sometimes +
ANY
+
+
+
+ + qtmoovrecover + QT Moov Recover + Util + Recovers unfinished qtmux files + Thiago Santos <thiago.sousa.santos@collabora.co.uk> + + + + + qtmux + QuickTime Muxer + Codec/Muxer + Multiplex audio and video into a QuickTime file + Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> + + + audio_%d + sink + request +
audio/x-raw-int, width=(int)8, depth=(int)8, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean){ true, false }; audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true; audio/x-raw-int, width=(int)24, depth=(int)24, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true; audio/x-raw-int, width=(int)32, depth=(int)32, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)dvi, block_align=(int)[ 64, 8096 ], channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/x-alaw, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]; audio/x-alac, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]
+
+ + video_%d + sink + request +
video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, 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-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-svq, svqversion=(int)3, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-dv, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-dirac, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-qt-part, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/quicktime, variant=(string)apple; video/quicktime
+
+
+
+ + rtpxqtdepay + RTP packet depayloader + Codec/Depayloader/Network + Extracts Quicktime audio/video from RTP packets + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
application/x-rtp, payload=(int)[ 96, 127 ], media=(string){ audio, video }, clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string){ X-QT, X-QUICKTIME }
+
+ + src + source + always +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-jack.xml b/docs/plugins/inspect/plugin-jack.xml new file mode 100644 index 0000000..c297205 --- /dev/null +++ b/docs/plugins/inspect/plugin-jack.xml @@ -0,0 +1,43 @@ + + jack + JACK audio elements + ../../ext/jack/.libs/libgstjack.so + libgstjack.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + jackaudiosink + Audio Sink (Jack) + Sink/Audio + Output audio to a JACK server + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + jackaudiosrc + Audio Source (Jack) + Source/Audio + Captures audio from a JACK server + Tristan Matthews <tristan@sat.qc.ca> + + + src + source + always +
audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-jpeg.xml b/docs/plugins/inspect/plugin-jpeg.xml new file mode 100644 index 0000000..a742e2d --- /dev/null +++ b/docs/plugins/inspect/plugin-jpeg.xml @@ -0,0 +1,97 @@ + + jpeg + JPeg plugin library + ../../ext/jpeg/.libs/libgstjpeg.so + libgstjpeg.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + jpegdec + JPEG image decoder + Codec/Decoder/Image + Decode images from JPEG format + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
image/jpeg, width=(int)[ 1, 65535 ], height=(int)[ 1, 65535 ], framerate=(fraction)[ 0/1, 2147483647/1 ], sof-marker=(int){ 0, 1, 2, 5, 6, 7, 9, 10, 13, 14 }
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + jpegenc + JPEG image encoder + Codec/Encoder/Image + Encode images in JPEG format + Wim Taymans <wim.taymans@tvd.be> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, UYVY, Y41B, Y42B, YVYU, Y444 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
image/jpeg, width=(int)[ 16, 65535 ], height=(int)[ 16, 65535 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + smokedec + Smoke video decoder + Codec/Decoder/Video + Decode video from Smoke format + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
video/x-smoke, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + smokeenc + Smoke video encoder + Codec/Encoder/Video + Encode images into the Smoke format + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-smoke, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-level.xml b/docs/plugins/inspect/plugin-level.xml new file mode 100644 index 0000000..a7a2a30 --- /dev/null +++ b/docs/plugins/inspect/plugin-level.xml @@ -0,0 +1,34 @@ + + level + Audio level plugin + ../../gst/level/.libs/libgstlevel.so + libgstlevel.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + level + Level + Filter/Analyzer/Audio + RMS/Peak/Decaying Peak Level messager for audio/raw + Thomas Vander Stichele <thomas at apestaart dot org> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16, 32 }, depth=(int){ 8, 16, 32 }, signed=(boolean)true; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }
+
+ + src + source + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16, 32 }, depth=(int){ 8, 16, 32 }, signed=(boolean)true; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-matroska.xml b/docs/plugins/inspect/plugin-matroska.xml new file mode 100644 index 0000000..749a802 --- /dev/null +++ b/docs/plugins/inspect/plugin-matroska.xml @@ -0,0 +1,127 @@ + + matroska + Matroska and WebM stream handling + ../../gst/matroska/.libs/libgstmatroska.so + libgstmatroska.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + matroskademux + Matroska demuxer + Codec/Demuxer + Demuxes Matroska/WebM streams into video/audio/subtitles + GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> + + + sink + sink + always +
video/x-matroska; video/webm
+
+ + audio_%02d + source + sometimes +
ANY
+
+ + subtitle_%02d + source + sometimes +
text/x-pango-markup; application/x-ssa; application/x-ass; application/x-usf; video/x-dvd-subpicture; subpicture/x-pgs; subtitle/x-kate; application/x-subtitle-unknown
+
+ + video_%02d + source + sometimes +
ANY
+
+
+
+ + matroskamux + Matroska muxer + Codec/Muxer + Muxes video/audio/subtitle streams into a matroska stream + GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> + + + audio_%d + sink + request +
audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int){ 2, 4 }, stream-format=(string)raw, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-ac3, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-eac3, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-dts, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-vorbis, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-flac, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-speex, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean)false, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)24, depth=(int)24, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)32, depth=(int)32, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)[ 32, 64 ], endianness=(int)1234, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-tta, width=(int){ 8, 16, 24 }, channels=(int){ 1, 2 }, rate=(int)[ 8000, 96000 ]; audio/x-pn-realaudio, raversion=(int){ 1, 2, 8 }, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)[ 1, 3 ], block_align=(int)[ 0, 65535 ], bitrate=(int)[ 0, 524288 ], channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-alaw, channels=(int){ 1, 2 }, rate=(int)[ 8000, 192000 ]; audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int)[ 8000, 192000 ]
+
+ + subtitle_%d + sink + request +
subtitle/x-kate
+
+ + video_%d + sink + request +
video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-dv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-theora; video/x-dirac, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-pn-realvideo, rmversion=(int)[ 1, 4 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc){ YUY2, I420, YV12, UYVY, AYUV }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-wmv, wmvversion=(int)[ 1, 3 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-matroska
+
+
+
+ + matroskaparse + Matroska parser + Codec/Parser + Parses Matroska/WebM streams into video/audio/subtitles + GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> + + + sink + sink + always +
video/x-matroska; video/webm
+
+ + src + source + always +
video/x-matroska; video/webm
+
+
+
+ + webmmux + WebM muxer + Codec/Muxer + Muxes video and audio streams into a WebM stream + GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> + + + audio_%d + sink + request +
audio/x-vorbis, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]
+
+ + video_%d + sink + request +
video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/webm
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-monoscope.xml b/docs/plugins/inspect/plugin-monoscope.xml new file mode 100644 index 0000000..02762d3 --- /dev/null +++ b/docs/plugins/inspect/plugin-monoscope.xml @@ -0,0 +1,34 @@ + + monoscope + Monoscope visualization + ../../gst/monoscope/.libs/libgstmonoscope.so + libgstmonoscope.so + 0.10.30.1 + LGPL + gst-plugins-good + GStreamer Good Plug-ins git + Unknown package origin + + + monoscope + Monoscope + Visualization + Displays a highly stabilised waveform of audio input + Richard Boulton <richard@tartarus.org> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)256, height=(int)128, framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-mulaw.xml b/docs/plugins/inspect/plugin-mulaw.xml new file mode 100644 index 0000000..9329eaf --- /dev/null +++ b/docs/plugins/inspect/plugin-mulaw.xml @@ -0,0 +1,55 @@ + + mulaw + MuLaw audio conversion routines + ../../gst/law/.libs/libgstmulaw.so + libgstmulaw.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + mulawdec + Mu Law audio decoder + Codec/Decoder/Audio + Convert 8bit mu law to 16bit PCM + Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + sink + sink + always +
audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
+
+ + src + source + always +
audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+
+ + mulawenc + Mu Law audio encoder + Codec/Encoder/Audio + Convert 16bit PCM to 8bit mu law + Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+ + src + source + always +
audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-multifile.xml b/docs/plugins/inspect/plugin-multifile.xml new file mode 100644 index 0000000..669bed4 --- /dev/null +++ b/docs/plugins/inspect/plugin-multifile.xml @@ -0,0 +1,58 @@ + + multifile + Reads/Writes buffers from/to sequentially named files + ../../gst/multifile/.libs/libgstmultifile.so + libgstmultifile.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + multifilesink + Multi-File Sink + Sink/File + Write buffers to a sequentially named set of files + David Schleef <ds@schleef.org> + + + sink + sink + always +
ANY
+
+
+
+ + multifilesrc + Multi-File Source + Source/File + Read a sequentially named set of files into buffers + David Schleef <ds@schleef.org> + + + src + source + always +
ANY
+
+
+
+ + splitfilesrc + Split-File Source + Source/File + Read a sequentially named set of files as if it was one large file + Tim-Philipp Müller <tim.muller@collabora.co.uk> + + + src + source + always +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-multipart.xml b/docs/plugins/inspect/plugin-multipart.xml new file mode 100644 index 0000000..ccbdb8e --- /dev/null +++ b/docs/plugins/inspect/plugin-multipart.xml @@ -0,0 +1,55 @@ + + multipart + multipart stream manipulation + ../../gst/multipart/.libs/libgstmultipart.so + libgstmultipart.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + multipartdemux + Multipart demuxer + Codec/Demuxer + demux multipart streams + Wim Taymans <wim.taymans@gmail.com>, Sjoerd Simons <sjoerd@luon.net> + + + sink + sink + always +
multipart/x-mixed-replace
+
+ + src_%d + source + sometimes +
ANY
+
+
+
+ + multipartmux + Multipart muxer + Codec/Muxer + mux multipart streams + Wim Taymans <wim@fluendo.com> + + + sink_%d + sink + request +
ANY
+
+ + src + source + always +
multipart/x-mixed-replace
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-navigationtest.xml b/docs/plugins/inspect/plugin-navigationtest.xml new file mode 100644 index 0000000..d65edab --- /dev/null +++ b/docs/plugins/inspect/plugin-navigationtest.xml @@ -0,0 +1,34 @@ + + navigationtest + Template for a video filter + ../../gst/debugutils/.libs/libgstnavigationtest.so + libgstnavigationtest.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + navigationtest + Video navigation test + Filter/Effect/Video + Handle navigation events showing a black square following mouse pointer + David Schleef <ds@schleef.org> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-oss4.xml b/docs/plugins/inspect/plugin-oss4.xml new file mode 100644 index 0000000..f6f6384 --- /dev/null +++ b/docs/plugins/inspect/plugin-oss4.xml @@ -0,0 +1,52 @@ + + oss4 + Open Sound System (OSS) version 4 support for GStreamer + ../../sys/oss4/.libs/libgstoss4audio.so + libgstoss4audio.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + oss4mixer + OSS v4 Audio Mixer + Generic/Audio + Control sound input and output levels with OSS4 + Tim-Philipp Müller <tim centricular net> + + + + + oss4sink + OSS v4 Audio Sink + Sink/Audio + Output to a sound card via OSS version 4 + Tim-Philipp Müller <tim centricular net> + + + sink + sink + always +
audio/x-alaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-mulaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)32, depth=(int){ 32, 24 }, signed=(boolean)true, endianness=(int)4321, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int){ 32, 24 }, depth=(int)24, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]
+
+
+
+ + oss4src + OSS v4 Audio Source + Source/Audio + Capture from a sound card via OSS version 4 + Tim-Philipp Müller <tim centricular net> + + + src + source + always +
audio/x-alaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-mulaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)32, depth=(int){ 32, 24 }, signed=(boolean)true, endianness=(int)4321, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int){ 32, 24 }, depth=(int)24, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-ossaudio.xml b/docs/plugins/inspect/plugin-ossaudio.xml new file mode 100644 index 0000000..e05e651 --- /dev/null +++ b/docs/plugins/inspect/plugin-ossaudio.xml @@ -0,0 +1,52 @@ + + ossaudio + OSS (Open Sound System) support for GStreamer + ../../sys/oss/.libs/libgstossaudio.so + libgstossaudio.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + ossmixer + OSS Mixer + Generic/Audio + Control sound input and output levels with OSS + Andrew Vander Wingo <wingo@pobox.com> + + + + + osssink + Audio Sink (OSS) + Sink/Audio + Output to a sound card via OSS + Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be> + + + sink + sink + always +
audio/x-raw-int, endianness=(int){ 1234 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
+
+
+
+ + osssrc + Audio Source (OSS) + Source/Audio + Capture from a sound card via OSS + Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com> + + + src + source + always +
audio/x-raw-int, endianness=(int){ 1234 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-osxaudio.xml b/docs/plugins/inspect/plugin-osxaudio.xml new file mode 100644 index 0000000..4718a4a --- /dev/null +++ b/docs/plugins/inspect/plugin-osxaudio.xml @@ -0,0 +1,27 @@ + + osxaudio + OSX (Mac OS X) audio support for GStreamer + ../../sys/osxaudio/.libs/libgstosxaudio.so + libgstosxaudio.so + 0.10.5.1 + LGPL + gst-plugins-good + GStreamer Good Plug-ins CVS/prerelease + Unknown package origin + + + osxaudiosink + Audio Sink (OSX) + Sink/Audio + Output to a sound card in OS X + Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + osxaudiosrc + Audio Source (OSX) + Source/Audio + Input from a sound card in OS X + Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + diff --git a/docs/plugins/inspect/plugin-osxvideo.xml b/docs/plugins/inspect/plugin-osxvideo.xml new file mode 100644 index 0000000..45bdeeb --- /dev/null +++ b/docs/plugins/inspect/plugin-osxvideo.xml @@ -0,0 +1,20 @@ + + osxvideo + OSX native video output plugin + ../../ext/osxvideo/.libs/libgstosxvideo.so + libgstosxvideo.so + 0.10.4 + LGPL + gst-plugins-bad + Gstreamer + http://gstreamer.freedesktop.org + + + osxvideosink + OSX Video sink + Sink/Video + OSX native videosink + Zaheer Abbas Merali <zaheerabas at merali dot org> + + + diff --git a/docs/plugins/inspect/plugin-png.xml b/docs/plugins/inspect/plugin-png.xml new file mode 100644 index 0000000..2209b12 --- /dev/null +++ b/docs/plugins/inspect/plugin-png.xml @@ -0,0 +1,55 @@ + + png + PNG plugin library + ../../ext/libpng/.libs/libgstpng.so + libgstpng.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + pngdec + PNG image decoder + Codec/Decoder/Image + Decode a png video frame to a raw image + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
image/png
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)64, depth=(int)64, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + pngenc + PNG image encoder + Codec/Encoder/Image + Encode a video frame to a .png image + Jeremy SIMON <jsimon13@yahoo.fr> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
image/png, width=(int)[ 16, 1000000 ], height=(int)[ 16, 1000000 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-pulseaudio.xml b/docs/plugins/inspect/plugin-pulseaudio.xml new file mode 100644 index 0000000..8d51d9f --- /dev/null +++ b/docs/plugins/inspect/plugin-pulseaudio.xml @@ -0,0 +1,67 @@ + + pulseaudio + PulseAudio plugin library + ../../ext/pulse/.libs/libgstpulse.so + libgstpulse.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + pulseaudiosink + Bin wrapping pulsesink + Sink/Audio/Bin + Correctly handles sink changes when streaming compressed formats to pulsesink + Arun Raghavan <arun.raghavan@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-ac3, framed=(boolean)true; audio/x-eac3, framed=(boolean)true; audio/x-dts, framed=(boolean)true, block-size=(int){ 512, 1024, 2048 }; audio/mpeg, mpegversion=(int)1, mpegaudioversion=(int)[ 1, 2 ], parsed=(boolean)true
+
+
+
+ + pulsemixer + PulseAudio Mixer + Generic/Audio + Control sound input and output levels for PulseAudio + Lennart Poettering + + + + + pulsesink + PulseAudio Audio Sink + Sink/Audio + Plays audio to a PulseAudio server + Lennart Poettering + + + sink + sink + always +
audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-ac3, framed=(boolean)true; audio/x-eac3, framed=(boolean)true; audio/x-dts, framed=(boolean)true, block-size=(int){ 512, 1024, 2048 }; audio/mpeg, mpegversion=(int)1, mpegaudioversion=(int)[ 1, 2 ], parsed=(boolean)true
+
+
+
+ + pulsesrc + PulseAudio Audio Source + Source/Audio + Captures audio from a PulseAudio server + Lennart Poettering + + + src + source + always +
audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-replaygain.xml b/docs/plugins/inspect/plugin-replaygain.xml new file mode 100644 index 0000000..240e806 --- /dev/null +++ b/docs/plugins/inspect/plugin-replaygain.xml @@ -0,0 +1,76 @@ + + replaygain + ReplayGain volume normalization + ../../gst/replaygain/.libs/libgstreplaygain.so + libgstreplaygain.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + rganalysis + ReplayGain analysis + Filter/Analyzer/Audio + Perform the ReplayGain analysis + René Stadler <mail@renestadler.de> + + + sink + sink + always +
audio/x-raw-float, width=(int)32, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }; audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
+
+ + src + source + always +
audio/x-raw-float, width=(int)32, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }; audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
+
+
+
+ + rglimiter + ReplayGain limiter + Filter/Effect/Audio + Apply signal compression to raw audio data + René Stadler <mail@renestadler.de> + + + sink + sink + always +
audio/x-raw-float, width=(int)32, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234
+
+ + src + source + always +
audio/x-raw-float, width=(int)32, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234
+
+
+
+ + rgvolume + ReplayGain volume + Filter/Effect/Audio + Apply ReplayGain volume adjustment + René Stadler <mail@renestadler.de> + + + sink + sink + always +
audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+ + src + source + always +
audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-rtp.xml b/docs/plugins/inspect/plugin-rtp.xml new file mode 100644 index 0000000..1277495 --- /dev/null +++ b/docs/plugins/inspect/plugin-rtp.xml @@ -0,0 +1,1474 @@ + + rtp + Real-time protocol plugins + ../../gst/rtp/.libs/libgstrtp.so + libgstrtp.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + asteriskh263 + RTP Asterisk H263 depayloader + Codec/Depayloader/Network/RTP + Extracts H263 video from RTP and encodes in Asterisk H263 format + Neil Stratford <neils@vipadia.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263-1998
+
+ + src + source + always +
application/x-asteriskh263
+
+
+
+ + rtpL16depay + RTP audio depayloader + Codec/Depayloader/Network/RTP + Extracts raw audio from RTP packets + Zeeshan Ali <zak147@yahoo.com>,Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)L16; application/x-rtp, media=(string)audio, payload=(int){ 10, 11 }, clock-rate=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, endianness=(int)4321, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + rtpL16pay + RTP audio payloader + Codec/Payloader/Network/RTP + Payload-encode Raw audio into RTP packets (RFC 3551) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/x-raw-int, endianness=(int)4321, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)L16, channels=(int)[ 1, 2147483647 ]; application/x-rtp, media=(string)audio, encoding-name=(string)L16, payload=(int)10, clock-rate=(int)44100; application/x-rtp, media=(string)audio, encoding-name=(string)L16, payload=(int)11, clock-rate=(int)44100
+
+
+
+ + rtpac3depay + RTP AC3 depayloader + Codec/Depayloader/Network/RTP + Extracts AC3 audio from RTP packets (RFC 4184) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int){ 32000, 44100, 48000 }, encoding-name=(string)AC3
+
+ + src + source + always +
audio/ac3
+
+
+
+ + rtpac3pay + RTP AC3 audio payloader + Codec/Payloader/Network/RTP + Payload AC3 audio as RTP packets (RFC 4184) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/ac3; audio/x-ac3
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int){ 32000, 44100, 48000 }, encoding-name=(string)AC3
+
+
+
+ + rtpamrdepay + RTP AMR depayloader + Codec/Depayloader/Network/RTP + Extracts AMR or AMR-WB audio from RTP packets (RFC 3267) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)AMR, encoding-params=(string)1, octet-align=(string)1, crc=(string){ 0, 1 }, robust-sorting=(string)0, interleaving=(string)0; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)AMR-WB, encoding-params=(string)1, octet-align=(string)1, crc=(string){ 0, 1 }, robust-sorting=(string)0, interleaving=(string)0
+
+ + src + source + always +
audio/AMR, channels=(int)1, rate=(int)8000; audio/AMR-WB, channels=(int)1, rate=(int)16000
+
+
+
+ + rtpamrpay + RTP AMR payloader + Codec/Payloader/Network/RTP + Payload-encode AMR or AMR-WB audio into RTP packets (RFC 3267) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/AMR, channels=(int)1, rate=(int)8000; audio/AMR-WB, channels=(int)1, rate=(int)16000
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)AMR, encoding-params=(string)1, octet-align=(string)1, crc=(string)0, robust-sorting=(string)0, interleaving=(string)0, mode-set=(int)[ 0, 7 ], mode-change-period=(int)[ 1, 2147483647 ], mode-change-neighbor=(string){ 0, 1 }, maxptime=(int)[ 20, 2147483647 ], ptime=(int)[ 20, 2147483647 ]; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)AMR-WB, encoding-params=(string)1, octet-align=(string)1, crc=(string)0, robust-sorting=(string)0, interleaving=(string)0, mode-set=(int)[ 0, 7 ], mode-change-period=(int)[ 1, 2147483647 ], mode-change-neighbor=(string){ 0, 1 }, maxptime=(int)[ 20, 2147483647 ], ptime=(int)[ 20, 2147483647 ]
+
+
+
+ + rtpbvdepay + RTP BroadcomVoice depayloader + Codec/Depayloader/Network/RTP + Extracts BroadcomVoice audio from RTP packets (RFC 4298) + Wim Taymans <wim.taymans@collabora.co.uk> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)BV16; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)BV32
+
+ + src + source + always +
audio/x-bv, mode=(int){ 16, 32 }
+
+
+
+ + rtpbvpay + RTP BV Payloader + Codec/Payloader/Network/RTP + Packetize BroadcomVoice audio streams into RTP packets (RFC 4298) + Wim Taymans <wim.taymans@collabora.co.uk> + + + sink + sink + always +
audio/x-bv, mode=(int){ 16, 32 }
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)BV16; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)BV32
+
+
+
+ + rtpceltdepay + RTP CELT depayloader + Codec/Depayloader/Network/RTP + Extracts CELT audio from RTP packets + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 32000, 48000 ], encoding-name=(string)CELT
+
+ + src + source + always +
audio/x-celt
+
+
+
+ + rtpceltpay + RTP CELT payloader + Codec/Payloader/Network/RTP + Payload-encodes CELT audio into a RTP packet + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/x-celt, rate=(int)[ 32000, 64000 ], channels=(int)[ 1, 2 ], frame-size=(int)[ 64, 512 ]
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 32000, 48000 ], encoding-name=(string)CELT
+
+
+
+ + rtpdepay + Dummy RTP session manager + Codec/Depayloader/Network/RTP + Accepts raw RTP and RTCP packets and sends them forward + Wim Taymans <wim.taymans@gmail.com> + + + sinkrtcp + sink + always +
application/x-rtcp
+
+ + sinkrtp + sink + always +
application/x-rtp
+
+ + srcrtcp + source + always +
application/x-rtcp
+
+ + srcrtp + source + always +
application/x-rtp
+
+
+
+ + rtpdvdepay + RTP DV Depayloader + Codec/Depayloader/Network/RTP + Depayloads DV from RTP packets (RFC 3189) + Marcel Moreaux <marcelm@spacelabs.nl>, Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string){ video, audio }, payload=(int)[ 96, 127 ], encoding-name=(string)DV, clock-rate=(int)90000, encode=(string){ SD-VCR/525-60, SD-VCR/625-50, HD-VCR/1125-60, HD-VCR/1250-50, SDL-VCR/525-60, SDL-VCR/625-50, 306M/525-60, 306M/625-50, 314M-25/525-60, 314M-25/625-50, 314M-50/525-60, 314M-50/625-50 }
+
+ + src + source + always +
video/x-dv
+
+
+
+ + rtpdvpay + RTP DV Payloader + Codec/Payloader/Network/RTP + Payloads DV into RTP packets (RFC 3189) + Marcel Moreaux <marcelm@spacelabs.nl>, Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/x-dv
+
+ + src + source + always +
application/x-rtp, media=(string){ video, audio }, payload=(int)[ 96, 127 ], encoding-name=(string)DV, clock-rate=(int)90000, encode=(string){ SD-VCR/525-60, SD-VCR/625-50, HD-VCR/1125-60, HD-VCR/1250-50, SDL-VCR/525-60, SDL-VCR/625-50, 306M/525-60, 306M/625-50, 314M-25/525-60, 314M-25/625-50, 314M-50/525-60, 314M-50/625-50 }
+
+
+
+ + rtpg722depay + RTP audio depayloader + Codec/Depayloader/Network/RTP + Extracts G722 audio from RTP packets + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G722; application/x-rtp, media=(string)audio, payload=(int)9, clock-rate=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/G722, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+ + rtpg722pay + RTP audio payloader + Codec/Payloader/Network/RTP + Payload-encode Raw audio into RTP packets (RFC 3551) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/G722, rate=(int)16000, channels=(int)1
+
+ + src + source + always +
application/x-rtp, media=(string)audio, encoding-name=(string)G722, payload=(int)9, clock-rate=(int)8000
+
+
+
+ + rtpg723depay + RTP G.723 depayloader + Codec/Depayloader/Network/RTP + Extracts G.723 audio from RTP packets (RFC 3551) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G723; application/x-rtp, media=(string)audio, payload=(int)4, clock-rate=(int)8000
+
+ + src + source + always +
audio/G723, channels=(int)1, rate=(int)8000
+
+
+
+ + rtpg723pay + RTP G.723 payloader + Codec/Payloader/Network/RTP + Packetize G.723 audio into RTP packets + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/G723, channels=(int)1, rate=(int)8000
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)4, clock-rate=(int)8000, encoding-name=(string)G723; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G723
+
+
+
+ + rtpg726depay + RTP G.726 depayloader + Codec/Depayloader/Network/RTP + Extracts G.726 audio from RTP packets + Axis Communications <dev-gstreamer@axis.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], encoding-name=(string){ G726, G726-16, G726-24, G726-32, G726-40, AAL2-G726-16, AAL2-G726-24, AAL2-G726-32, AAL2-G726-40 }, clock-rate=(int)8000
+
+ + src + source + always +
audio/x-adpcm, channels=(int)1, rate=(int)8000, bitrate=(int){ 16000, 24000, 32000, 40000 }, layout=(string)g726
+
+
+
+ + rtpg726pay + RTP G.726 payloader + Codec/Payloader/Network/RTP + Payload-encodes G.726 audio into a RTP packet + Axis Communications <dev-gstreamer@axis.com> + + + sink + sink + always +
audio/x-adpcm, channels=(int)1, rate=(int)8000, bitrate=(int){ 16000, 24000, 32000, 40000 }, layout=(string)g726
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string){ G726-16, G726-24, G726-32, G726-40, AAL2-G726-16, AAL2-G726-24, AAL2-G726-32, AAL2-G726-40 }
+
+
+
+ + rtpg729depay + RTP G.729 depayloader + Codec/Depayloader/Network/RTP + Extracts G.729 audio from RTP packets (RFC 3551) + Laurent Glayal <spglegle@yahoo.fr> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G729; application/x-rtp, media=(string)audio, payload=(int)18, clock-rate=(int)8000
+
+ + src + source + always +
audio/G729, channels=(int)1, rate=(int)8000
+
+
+
+ + rtpg729pay + RTP G.729 payloader + Codec/Payloader/Network/RTP + Packetize G.729 audio into RTP packets + Olivier Crete <olivier.crete@collabora.co.uk> + + + sink + sink + always +
audio/G729, channels=(int)1, rate=(int)8000
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)18, clock-rate=(int)8000, encoding-name=(string)G729; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G729
+
+
+
+ + rtpgsmdepay + RTP GSM depayloader + Codec/Depayloader/Network/RTP + Extracts GSM audio from RTP packets + Zeeshan Ali <zeenix@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)GSM; application/x-rtp, media=(string)audio, payload=(int)3, clock-rate=(int)8000
+
+ + src + source + always +
audio/x-gsm, rate=(int)8000, channels=(int)1
+
+
+
+ + rtpgsmpay + RTP GSM payloader + Codec/Payloader/Network/RTP + Payload-encodes GSM audio into a RTP packet + Zeeshan Ali <zeenix@gmail.com> + + + sink + sink + always +
audio/x-gsm, rate=(int)8000, channels=(int)1
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)3, clock-rate=(int)8000, encoding-name=(string)GSM; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)GSM
+
+
+
+ + rtpgstdepay + GStreamer depayloader + Codec/Depayloader/Network + Extracts GStreamer buffers from RTP packets + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)application, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)X-GST
+
+ + src + source + always +
ANY
+
+
+
+ + rtpgstpay + RTP GStreamer payloader + Codec/Payloader/Network/RTP + Payload GStreamer buffers as RTP packets + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
ANY
+
+ + src + source + always +
application/x-rtp, media=(string)application, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)X-GST
+
+
+
+ + rtph263depay + RTP H263 depayloader + Codec/Depayloader/Network/RTP + Extracts H263 video from RTP packets (RFC 2190) + Philippe Kalaf <philippe.kalaf@collabora.co.uk>, Edward Hervey <bilboed@bilboed.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)34, clock-rate=(int)90000, encoding-name=(string)H263; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263
+
+ + src + source + always +
video/x-h263, variant=(string)itu, h263version=(string)h263
+
+
+
+ + rtph263pay + RTP H263 packet payloader + Codec/Payloader/Network/RTP + Payload-encodes H263 video in RTP packets (RFC 2190) + Neil Stratford <neils@vipadia.com>Dejan Sakelsak <dejan.sakelsak@marand.si> + + + sink + sink + always +
video/x-h263, variant=(string)itu, h263version=(string)h263
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)34, clock-rate=(int)90000, encoding-name=(string)H263; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263
+
+
+
+ + rtph263pdepay + RTP H263 depayloader + Codec/Depayloader/Network/RTP + Extracts H263/+/++ video from RTP packets (RFC 4629) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)H263-1998; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)H263-2000
+
+ + src + source + always +
video/x-h263, variant=(string)itu
+
+
+
+ + rtph263ppay + RTP H263 payloader + Codec/Payloader/Network/RTP + Payload-encodes H263/+/++ video in RTP packets (RFC 4629) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/x-h263, variant=(string)itu
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263-1998; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263-2000
+
+
+
+ + rtph264depay + RTP H264 depayloader + Codec/Depayloader/Network/RTP + Extracts H264 video from RTP packets (RFC 3984) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H264
+
+ + src + source + always +
video/x-h264
+
+
+
+ + rtph264pay + RTP H264 payloader + Codec/Payloader/Network/RTP + Payload-encode H264 video into RTP packets (RFC 3984) + Laurent Glayal <spglegle@yahoo.fr> + + + sink + sink + always +
video/x-h264
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H264
+
+
+
+ + rtpilbcdepay + RTP iLBC depayloader + Codec/Depayloader/Network/RTP + Extracts iLBC audio from RTP packets (RFC 3952) + Philippe Kalaf <philippe.kalaf@collabora.co.uk> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)ILBC, mode=(string){ 20, 30 }
+
+ + src + source + always +
audio/x-iLBC, mode=(int){ 20, 30 }
+
+
+
+ + rtpilbcpay + RTP iLBC Payloader + Codec/Payloader/Network/RTP + Packetize iLBC audio streams into RTP packets + Philippe Kalaf <philippe.kalaf@collabora.co.uk> + + + sink + sink + always +
audio/x-iLBC, mode=(int){ 20, 30 }
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)ILBC, mode=(string){ 20, 30 }
+
+
+
+ + rtpj2kdepay + RTP JPEG 2000 depayloader + Codec/Depayloader/Network/RTP + Extracts JPEG 2000 video from RTP packets (RFC 5371) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)JPEG2000
+
+ + src + source + always +
image/x-jpc
+
+
+
+ + rtpj2kpay + RTP JPEG 2000 payloader + Codec/Payloader/Network/RTP + Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
image/x-jpc
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)JPEG2000
+
+
+
+ + rtpjpegdepay + RTP JPEG depayloader + Codec/Depayloader/Network/RTP + Extracts JPEG video from RTP packets (RFC 2435) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)JPEG; application/x-rtp, media=(string)video, payload=(int)26, clock-rate=(int)90000
+
+ + src + source + always +
image/jpeg
+
+
+
+ + rtpjpegpay + RTP JPEG payloader + Codec/Payloader/Network/RTP + Payload-encodes JPEG pictures into RTP packets (RFC 2435) + Axis Communications <dev-gstreamer@axis.com> + + + sink + sink + always +
image/jpeg; video/x-jpeg
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)26, clock-rate=(int)90000, encoding-name=(string)JPEG
+
+
+
+ + rtpmp1sdepay + RTP MPEG1 System Stream depayloader + Codec/Depayloader/Network/RTP + Extracts MPEG1 System Streams from RTP packets (RFC 3555) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)other, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP1S; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP1S
+
+ + src + source + always +
video/mpeg, systemstream=(boolean)true
+
+
+
+ + rtpmp2tdepay + RTP MPEG Transport Stream depayloader + Codec/Depayloader/Network/RTP + Extracts MPEG2 TS from RTP packets (RFC 2250) + Wim Taymans <wim.taymans@gmail.com>, Thijs Vermeir <thijs.vermeir@barco.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP2T-ES; application/x-rtp, media=(string)video, payload=(int)33, clock-rate=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
video/mpegts, packetsize=(int)188, systemstream=(boolean)true
+
+
+
+ + rtpmp2tpay + RTP MPEG2 Transport Stream payloader + Codec/Payloader/Network/RTP + Payload-encodes MPEG2 TS into RTP packets (RFC 2250) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/mpegts, packetsize=(int)188, systemstream=(boolean)true
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MP2T-ES
+
+
+
+ + rtpmp4adepay + RTP MPEG4 audio depayloader + Codec/Depayloader/Network/RTP + Extracts MPEG4 audio from RTP packets (RFC 3016) + Nokia Corporation (contact <stefan.kost@nokia.com>), Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP4A-LATM
+
+ + src + source + always +
audio/mpeg, mpegversion=(int)4, framed=(boolean)true, stream-format=(string)raw
+
+
+
+ + rtpmp4apay + RTP MPEG4 audio payloader + Codec/Payloader/Network/RTP + Payload MPEG4 audio as RTP packets (RFC 3016) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/mpeg, mpegversion=(int)4, stream-format=(string)raw
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP4A-LATM
+
+
+
+ + rtpmp4gdepay + RTP MPEG4 ES depayloader + Codec/Depayloader/Network/RTP + Extracts MPEG4 elementary streams from RTP packets (RFC 3640) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string){ video, audio, application }, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MPEG4-GENERIC, streamtype=(string){ 4, 5 }, mode=(string){ generic, CELP-cbr, CELP-vbr, AAC-lbr, AAC-hbr }
+
+ + src + source + always +
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw
+
+
+
+ + rtpmp4gpay + RTP MPEG4 ES payloader + Codec/Payloader/Network/RTP + Payload MPEG4 elementary streams as RTP packets (RFC 3640) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw
+
+ + src + source + always +
application/x-rtp, media=(string){ video, audio, application }, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MPEG4-GENERIC, streamtype=(string){ 4, 5 }, mode=(string){ generic, CELP-cbr, CELP-vbr, AAC-lbr, AAC-hbr }
+
+
+
+ + rtpmp4vdepay + RTP MPEG4 video depayloader + Codec/Depayloader/Network/RTP + Extracts MPEG4 video from RTP packets (RFC 3016) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP4V-ES
+
+ + src + source + always +
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false
+
+
+
+ + rtpmp4vpay + RTP MPEG4 Video payloader + Codec/Payloader/Network/RTP + Payload MPEG-4 video as RTP packets (RFC 3016) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-xvid
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP4V-ES
+
+
+
+ + rtpmpadepay + RTP MPEG audio depayloader + Codec/Depayloader/Network/RTP + Extracts MPEG audio from RTP packets (RFC 2038) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MPA; application/x-rtp, media=(string)audio, payload=(int)14, clock-rate=(int)90000
+
+ + src + source + always +
audio/mpeg, mpegversion=(int)1
+
+
+
+ + rtpmpapay + RTP MPEG audio payloader + Codec/Payloader/Network/RTP + Payload MPEG audio as RTP packets (RFC 2038) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
audio/mpeg, mpegversion=(int)1
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)14, clock-rate=(int)90000; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MPA
+
+
+
+ + rtpmparobustdepay + RTP MPEG audio depayloader + Codec/Depayloader/Network/RTP + Extracts MPEG audio from RTP packets (RFC 5219) + Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MPA-ROBUST; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string){ X-MP3-DRAFT-00, X-MP3-DRAFT-01, X-MP3-DRAFT-02, X-MP3-DRAFT-03, X-MP3-DRAFT-04, X-MP3-DRAFT-05, X-MP3-DRAFT-06 }
+
+ + src + source + always +
audio/mpeg, mpegversion=(int)1
+
+
+
+ + rtpmpvdepay + RTP MPEG video depayloader + Codec/Depayloader/Network/RTP + Extracts MPEG video from RTP packets (RFC 2250) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MPV; application/x-rtp, media=(string)video, payload=(int)32, clock-rate=(int)90000
+
+ + src + source + always +
video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
+
+
+
+ + rtpmpvpay + RTP MPEG2 ES video payloader + Codec/Payloader/Network/RTP + Payload-encodes MPEG2 ES into RTP packets (RFC 2250) + Thijs Vermeir <thijsvermeir@gmail.com> + + + sink + sink + always +
video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)32, clock-rate=(int)90000, encoding-name=(string)MPV
+
+
+
+ + rtppcmadepay + RTP PCMA depayloader + Codec/Depayloader/Network/RTP + Extracts PCMA audio from RTP packets + Edgard Lima <edgard.lima@indt.org.br>, Zeeshan Ali <zeenix@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)8, clock-rate=(int)8000, encoding-name=(string)PCMA; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)PCMA
+
+ + src + source + always +
audio/x-alaw, channels=(int)1, rate=(int)[ 1, 2147483647 ]
+
+
+
+ + rtppcmapay + RTP PCMA payloader + Codec/Payloader/Network/RTP + Payload-encodes PCMA audio into a RTP packet + Edgard Lima <edgard.lima@indt.org.br> + + + sink + sink + always +
audio/x-alaw, channels=(int)1, rate=(int)8000
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)8, clock-rate=(int)8000, encoding-name=(string)PCMA; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)PCMA
+
+
+
+ + rtppcmudepay + RTP PCMU depayloader + Codec/Depayloader/Network/RTP + Extracts PCMU audio from RTP packets + Edgard Lima <edgard.lima@indt.org.br>, Zeeshan Ali <zeenix@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)0, encoding-name=(string)PCMU, clock-rate=(int)8000; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], encoding-name=(string)PCMU, clock-rate=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-mulaw, channels=(int)1, rate=(int)[ 1, 2147483647 ]
+
+
+
+ + rtppcmupay + RTP PCMU payloader + Codec/Payloader/Network/RTP + Payload-encodes PCMU audio into a RTP packet + Edgard Lima <edgard.lima@indt.org.br> + + + sink + sink + always +
audio/x-mulaw, channels=(int)1, rate=(int)8000
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)0, clock-rate=(int)8000, encoding-name=(string)PCMU; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)PCMU
+
+
+
+ + rtpqcelpdepay + RTP QCELP depayloader + Codec/Depayloader/Network/RTP + Extracts QCELP (PureVoice) audio from RTP packets (RFC 2658) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)QCELP; application/x-rtp, media=(string)audio, payload=(int)12, clock-rate=(int)8000
+
+ + src + source + always +
audio/qcelp, channels=(int)1, rate=(int)8000
+
+
+
+ + rtpqdm2depay + RTP QDM2 depayloader + Codec/Depayloader/Network/RTP + Extracts QDM2 audio from RTP packets (no RFC) + Edward Hervey <bilboed@bilboed.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], encoding-name=(string)X-QDM
+
+ + src + source + always +
audio/x-qdm2
+
+
+
+ + rtpsirendepay + RTP Siren packet depayloader + Codec/Depayloader/Network/RTP + Extracts Siren audio from RTP packets + Philippe Kalaf <philippe.kalaf@collabora.co.uk> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)SIREN, dct-length=(int)320
+
+ + src + source + always +
audio/x-siren, dct-length=(int)320
+
+
+
+ + rtpsirenpay + RTP Payloader for Siren Audio + Codec/Payloader/Network/RTP + Packetize Siren audio streams into RTP packets + Youness Alaoui <kakaroto@kakaroto.homelinux.net> + + + sink + sink + always +
audio/x-siren, dct-length=(int)320
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)SIREN, bitrate=(string)16000, dct-length=(int)320
+
+
+
+ + rtpspeexdepay + RTP Speex depayloader + Codec/Depayloader/Network/RTP + Extracts Speex audio from RTP packets + Edgard Lima <edgard.lima@indt.org.br> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 6000, 48000 ], encoding-name=(string)SPEEX, encoding-params=(string)1
+
+ + src + source + always +
audio/x-speex
+
+
+
+ + rtpspeexpay + RTP Speex payloader + Codec/Payloader/Network/RTP + Payload-encodes Speex audio into a RTP packet + Edgard Lima <edgard.lima@indt.org.br> + + + sink + sink + always +
audio/x-speex, rate=(int)[ 6000, 48000 ], channels=(int)1
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 6000, 48000 ], encoding-name=(string)SPEEX, encoding-params=(string)1
+
+
+
+ + rtpsv3vdepay + RTP SVQ3 depayloader + Codec/Depayloader/Network/RTP + Extracts SVQ3 video from RTP packets (no RFC) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string){ X-SV3V-ES, X-SORENSON-VIDEO, X-SORENSONVIDEO, X-SorensonVideo }
+
+ + src + source + always +
video/x-svq, svqversion=(int)3
+
+
+
+ + rtptheoradepay + RTP Theora depayloader + Codec/Depayloader/Network/RTP + Extracts Theora video from RTP packets (draft-01 of RFC XXXX) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)THEORA
+
+ + src + source + always +
video/x-theora
+
+
+
+ + rtptheorapay + RTP Theora payloader + Codec/Payloader/Network/RTP + Payload-encode Theora video into RTP packets (draft-01 RFC XXXX) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/x-theora
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)THEORA
+
+
+
+ + rtpvorbisdepay + RTP Vorbis depayloader + Codec/Depayloader/Network/RTP + Extracts Vorbis Audio from RTP packets (RFC 5215) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)VORBIS
+
+ + src + source + always +
audio/x-vorbis
+
+
+
+ + rtpvorbispay + RTP Vorbis depayloader + Codec/Payloader/Network/RTP + Payload-encode Vorbis audio into RTP packets (RFC 5215) + Wim Taymans <wimi.taymans@gmail.com> + + + sink + sink + always +
audio/x-vorbis
+
+ + src + source + always +
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)VORBIS
+
+
+
+ + rtpvrawdepay + RTP Raw Video depayloader + Codec/Depayloader/Network/RTP + Extracts raw video from RTP packets (RFC 4175) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)RAW
+
+ + src + source + always +
video/x-raw-rgb; video/x-raw-yuv
+
+
+
+ + rtpvrawpay + RTP Raw Video payloader + Codec/Payloader/Network/RTP + Payload raw video as RTP packets (RFC 4175) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]; video/x-raw-yuv, format=(fourcc){ AYUV, UYVY, I420, Y41B, UYVP }, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]
+
+ + src + source + always +
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string){ RGB, RGBA, BGR, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1 }, depth=(string){ 8, 10, 12, 16 }, colorimetry=(string){ BT601-5, BT709-2, SMPTE240M }
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-rtsp.xml b/docs/plugins/inspect/plugin-rtsp.xml new file mode 100644 index 0000000..da53f3e --- /dev/null +++ b/docs/plugins/inspect/plugin-rtsp.xml @@ -0,0 +1,61 @@ + + rtsp + transfer data via RTSP + ../../gst/rtsp/.libs/libgstrtsp.so + libgstrtsp.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + rtpdec + RTP Decoder + Codec/Parser/Network + Accepts raw RTP and RTCP packets and sends them forward + Wim Taymans <wim@fluendo.com> + + + recv_rtcp_sink_%d + sink + request +
application/x-rtcp
+
+ + recv_rtp_sink_%d + sink + request +
application/x-rtp
+
+ + recv_rtp_src_%d_%d_%d + source + sometimes +
application/x-rtp
+
+ + rtcp_src_%d + source + request +
application/x-rtcp
+
+
+
+ + rtspsrc + RTSP packet receiver + Source/Network + Receive data over the network via RTSP (RFC 2326) + Wim Taymans <wim@fluendo.com>, Thijs Vermeir <thijs.vermeir@barco.com>, Lutz Mueller <lutz@topfrose.de> + + + stream%d + source + sometimes +
application/x-rtp; application/x-rdt
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-shapewipe.xml b/docs/plugins/inspect/plugin-shapewipe.xml new file mode 100644 index 0000000..4ddc5c7 --- /dev/null +++ b/docs/plugins/inspect/plugin-shapewipe.xml @@ -0,0 +1,40 @@ + + shapewipe + Shape Wipe transition filter + ../../gst/shapewipe/.libs/libgstshapewipe.so + libgstshapewipe.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + shapewipe + Shape Wipe transition filter + Filter/Editor/Video + Adds a shape wipe transition to a video stream + Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + mask_sink + sink + always +
video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)0/1; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)0/1
+
+ + video_sink + sink + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-shout2send.xml b/docs/plugins/inspect/plugin-shout2send.xml new file mode 100644 index 0000000..24eb4a7 --- /dev/null +++ b/docs/plugins/inspect/plugin-shout2send.xml @@ -0,0 +1,28 @@ + + shout2send + Sends data to an icecast server using libshout2 + ../../ext/shout2/.libs/libgstshout2.so + libgstshout2.so + 0.10.31 + LGPL + gst-plugins-good + libshout2 + http://www.icecast.org/download.html + + + shout2send + Icecast network sink + Sink/Network + Sends data to an icecast server + Wim Taymans <wim.taymans@chello.be>, Pedro Corte-Real <typo@netcabo.pt>, Zaheer Abbas Merali <zaheerabbas at merali dot org> + + + sink + sink + always +
application/ogg; audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-smpte.xml b/docs/plugins/inspect/plugin-smpte.xml new file mode 100644 index 0000000..7283bc7 --- /dev/null +++ b/docs/plugins/inspect/plugin-smpte.xml @@ -0,0 +1,61 @@ + + smpte + Apply the standard SMPTE transitions on video images + ../../gst/smpte/.libs/libgstsmpte.so + libgstsmpte.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + smpte + SMPTE transitions + Filter/Editor/Video + Apply the standard SMPTE transitions on video images + Wim Taymans <wim.taymans@chello.be> + + + sink1 + sink + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + sink2 + sink + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + smptealpha + SMPTE transitions + Filter/Editor/Video + Apply the standard SMPTE transitions as alpha on video images + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-soup.xml b/docs/plugins/inspect/plugin-soup.xml new file mode 100644 index 0000000..f3707ba --- /dev/null +++ b/docs/plugins/inspect/plugin-soup.xml @@ -0,0 +1,43 @@ + + soup + libsoup HTTP client src/sink + ../../ext/soup/.libs/libgstsouphttpsrc.so + libgstsouphttpsrc.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + souphttpclientsink + HTTP client sink + Generic + Sends streams to HTTP server via PUT + David Schleef <ds@entropywave.com> + + + sink + sink + always +
ANY
+
+
+
+ + souphttpsrc + HTTP client source + Source/Network + Receive data as a client over the network via HTTP using SOUP + Wouter Cloetens <wouter@mind.be> + + + src + source + always +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-spectrum.xml b/docs/plugins/inspect/plugin-spectrum.xml new file mode 100644 index 0000000..ac9f023 --- /dev/null +++ b/docs/plugins/inspect/plugin-spectrum.xml @@ -0,0 +1,34 @@ + + spectrum + Run an FFT on the audio signal, output spectrum data + ../../gst/spectrum/.libs/libgstspectrum.so + libgstspectrum.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + spectrum + Spectrum analyzer + Filter/Analyzer/Audio + Run an FFT on the audio signal, output spectrum data + Erik Walthinsen <omega@cse.ogi.edu>, Stefan Kost <ensonic@users.sf.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink + sink + always +
audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+ + src + source + always +
audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-speex.xml b/docs/plugins/inspect/plugin-speex.xml new file mode 100644 index 0000000..fdcc94b --- /dev/null +++ b/docs/plugins/inspect/plugin-speex.xml @@ -0,0 +1,55 @@ + + speex + Speex plugin library + ../../ext/speex/.libs/libgstspeex.so + libgstspeex.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + speexdec + Speex audio decoder + Codec/Decoder/Audio + decode speex streams to audio + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
audio/x-speex
+
+ + src + source + always +
audio/x-raw-int, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16
+
+
+
+ + speexenc + Speex audio encoder + Codec/Encoder/Audio + Encodes audio in Speex format + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16
+
+ + src + source + always +
audio/x-speex, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-taglib.xml b/docs/plugins/inspect/plugin-taglib.xml new file mode 100644 index 0000000..d7d404f --- /dev/null +++ b/docs/plugins/inspect/plugin-taglib.xml @@ -0,0 +1,55 @@ + + taglib + Tag writing plug-in based on taglib + ../../ext/taglib/.libs/libgsttaglib.so + libgsttaglib.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + apev2mux + TagLib-based APEv2 Muxer + Formatter/Metadata + Adds an APEv2 header to the beginning of files using taglib + Sebastian Dröge <slomo@circular-chaos.org> + + + sink + sink + always +
ANY
+
+ + src + source + always +
application/x-apetag
+
+
+
+ + id3v2mux + TagLib-based ID3v2 Muxer + Formatter/Metadata + Adds an ID3v2 header to the beginning of MP3 files using taglib + Christophe Fergeau <teuf@gnome.org> + + + sink + sink + always +
ANY
+
+ + src + source + always +
application/x-id3
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-udp.xml b/docs/plugins/inspect/plugin-udp.xml new file mode 100644 index 0000000..2cca70b --- /dev/null +++ b/docs/plugins/inspect/plugin-udp.xml @@ -0,0 +1,73 @@ + + udp + transfer data via UDP + ../../gst/udp/.libs/libgstudp.so + libgstudp.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + dynudpsink + UDP packet sender + Sink/Network + Send data over the network via UDP + Philippe Khalaf <burger@speedy.org> + + + sink + sink + always +
ANY
+
+
+
+ + multiudpsink + UDP packet sender + Sink/Network + Send data over the network via UDP + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
ANY
+
+
+
+ + udpsink + UDP packet sender + Sink/Network + Send data over the network via UDP + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
ANY
+
+
+
+ + udpsrc + UDP packet receiver + Source/Network + Receive data over the network via UDP + Wim Taymans <wim@fluendo.com>, Thijs Vermeir <thijs.vermeir@barco.com> + + + src + source + always +
ANY
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-video4linux2.xml b/docs/plugins/inspect/plugin-video4linux2.xml new file mode 100644 index 0000000..5ed6afa --- /dev/null +++ b/docs/plugins/inspect/plugin-video4linux2.xml @@ -0,0 +1,37 @@ + + video4linux2 + elements for Video 4 Linux + ../../sys/v4l2/.libs/libgstvideo4linux2.so + libgstvideo4linux2.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + v4l2radio + Radio (video4linux2) Tuner + Tuner + Controls a Video4Linux2 radio device + Alexey Chernov <4ernov@gmail.com> + + + + + v4l2src + Video (video4linux2) Source + Source/Video + Reads frames from a Video4Linux2 device + Edgard Lima <edgard.lima@indt.org.br>, Stefan Kost <ensonic@users.sf.net> + + + src + source + always +
video/x-raw-rgb, bpp=(int)8, depth=(int)8, red_mask=(int)224, green_mask=(int)28, blue_mask=(int)3, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YVU9, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)Y41P, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YUV9, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-bayer, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-dv, systemstream=(boolean)true, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/mpegts; video/x-sonix, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-pwc1, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-pwc2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-videobox.xml b/docs/plugins/inspect/plugin-videobox.xml new file mode 100644 index 0000000..37956b0 --- /dev/null +++ b/docs/plugins/inspect/plugin-videobox.xml @@ -0,0 +1,34 @@ + + videobox + resizes a video by adding borders or cropping + ../../gst/videobox/.libs/libgstvideobox.so + libgstvideobox.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + videobox + Video box filter + Filter/Effect/Video + Resizes a video by adding borders or cropping + Wim Taymans <wim@fluendo.com> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)4321, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)4321, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-videocrop.xml b/docs/plugins/inspect/plugin-videocrop.xml new file mode 100644 index 0000000..795baff --- /dev/null +++ b/docs/plugins/inspect/plugin-videocrop.xml @@ -0,0 +1,55 @@ + + videocrop + Crops video into a user-defined region + ../../gst/videocrop/.libs/libgstvideocrop.so + libgstvideocrop.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + aspectratiocrop + aspectratiocrop + Filter/Effect/Video + Crops video into a user-defined aspect-ratio + Thijs Vermeir <thijsvermeir@gmail.com> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + videocrop + Crop + Filter/Effect/Video + Crops video into a user-defined region + Tim-Philipp Müller <tim centricular net> + + + sink + sink + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-videofilter.xml b/docs/plugins/inspect/plugin-videofilter.xml new file mode 100644 index 0000000..967f386 --- /dev/null +++ b/docs/plugins/inspect/plugin-videofilter.xml @@ -0,0 +1,76 @@ + + videofilter + Video filters plugin + ../../gst/videofilter/.libs/libgstvideofilter.so + libgstvideofilter.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + gamma + Video gamma correction + Filter/Effect/Video + Adjusts gamma on a video stream + Arwed v. Merkatz <v.merkatz@gmx.net> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + videobalance + Video balance + Filter/Effect/Video + Adjusts brightness, contrast, hue, saturation on a video stream + David Schleef <ds@schleef.org> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + videoflip + Video flipper + Filter/Effect/Video + Flips and rotates video + David Schleef <ds@schleef.org> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-videomixer.xml b/docs/plugins/inspect/plugin-videomixer.xml new file mode 100644 index 0000000..664e5b7 --- /dev/null +++ b/docs/plugins/inspect/plugin-videomixer.xml @@ -0,0 +1,55 @@ + + videomixer + Video mixer + ../../gst/videomixer/.libs/libgstvideomixer.so + libgstvideomixer.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + videomixer + Video mixer + Filter/Editor/Video + Mix multiple video streams + Wim Taymans <wim@fluendo.com> + + + sink_%d + sink + request +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + videomixer2 + Video mixer 2 + Filter/Editor/Video + Mix multiple video streams + Wim Taymans <wim@fluendo.com>, Sebastian Dröge <sebastian.droege@collabora.co.uk> + + + sink_%d + sink + request +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; 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)UYVY, 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 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-waveform.xml b/docs/plugins/inspect/plugin-waveform.xml new file mode 100644 index 0000000..edd277e --- /dev/null +++ b/docs/plugins/inspect/plugin-waveform.xml @@ -0,0 +1,20 @@ + + waveform + WaveForm API based plugin + ../../win32/vs6/release/libgstwaveform.dll + libgstwaveform.dll + 0.10.4.1 + LGPL + gst-plugins-bad + GStreamer Good Plug-ins CVS + Unknown package origin + + + waveformsink + WaveForm audio sink + Sink/Audio + WaveForm audio sink + Sebastien Moutte <sebastien@moutte.net> + + + diff --git a/docs/plugins/inspect/plugin-wavenc.xml b/docs/plugins/inspect/plugin-wavenc.xml new file mode 100644 index 0000000..f384207 --- /dev/null +++ b/docs/plugins/inspect/plugin-wavenc.xml @@ -0,0 +1,34 @@ + + wavenc + Encode raw audio into WAV + ../../gst/wavenc/.libs/libgstwavenc.so + libgstwavenc.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + wavenc + WAV audio muxer + Codec/Muxer/Audio + Encode raw audio into WAV + Iain Holmes <iain@prettypeople.org> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int){ 32, 64 }; audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false; audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false
+
+ + src + source + always +
audio/x-wav
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-wavpack.xml b/docs/plugins/inspect/plugin-wavpack.xml new file mode 100644 index 0000000..79e820d --- /dev/null +++ b/docs/plugins/inspect/plugin-wavpack.xml @@ -0,0 +1,88 @@ + + wavpack + Wavpack lossless/lossy audio format handling + ../../ext/wavpack/.libs/libgstwavpack.so + libgstwavpack.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + wavpackdec + Wavpack audio decoder + Codec/Decoder/Audio + Decodes Wavpack audio data + Arwed v. Merkatz <v.merkatz@gmx.net>, Sebastian Dröge <slomo@circular-chaos.org> + + + sink + sink + always +
audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
+
+ + src + source + always +
audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], endianness=(int)1234, signed=(boolean)true
+
+
+
+ + wavpackenc + Wavpack audio encoder + Codec/Encoder/Audio + Encodes audio with the Wavpack lossless/lossy audio codec + Sebastian Dröge <slomo@circular-chaos.org> + + + sink + sink + always +
audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], endianness=(int)1234, channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], signed=(boolean)true
+
+ + src + source + always +
audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 2 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
+
+ + wvcsrc + source + sometimes +
audio/x-wavpack-correction, framed=(boolean)true
+
+
+
+ + wavpackparse + Wavpack parser + Codec/Demuxer/Audio + Parses Wavpack files + Arwed v. Merkatz <v.merkatz@gmx.net>, Sebastian Dröge <slomo@circular-chaos.org> + + + sink + sink + always +
audio/x-wavpack, framed=(boolean)false; audio/x-wavpack-correction, framed=(boolean)false
+
+ + src + source + sometimes +
audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
+
+ + wvcsrc + source + sometimes +
audio/x-wavpack-correction, framed=(boolean)true
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-wavparse.xml b/docs/plugins/inspect/plugin-wavparse.xml new file mode 100644 index 0000000..56039a1 --- /dev/null +++ b/docs/plugins/inspect/plugin-wavparse.xml @@ -0,0 +1,34 @@ + + wavparse + Parse a .wav file into raw audio + ../../gst/wavparse/.libs/libgstwavparse.so + libgstwavparse.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + wavparse + WAV audio demuxer + Codec/Demuxer/Audio + Parse a .wav file into raw audio + Erik Walthinsen <omega@cse.ogi.edu> + + + wavparse_sink + sink + always +
audio/x-wav
+
+ + wavparse_src + source + sometimes +
audio/ms-gsm, rate=(int)[ 1, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)3, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)2, rate=(int)[ 16000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]; audio/x-vorbis, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-dts; audio/mpeg, mpegversion=(int)4, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 8 ]; audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-wms, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)dvi, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-truespeech, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/x-wma, wmaversion=(int)1, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)2, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)3, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-vnd.sony.atrac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]; audio/x-voxware, voxwaretype=(int)117, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dk4, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dk3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dvi, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/AMR, rate=(int)8000, channels=(int)1; audio/AMR-WB, rate=(int)16000, channels=(int)1; audio/x-siren; application/x-ogg-avi
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-ximagesrc.xml b/docs/plugins/inspect/plugin-ximagesrc.xml new file mode 100644 index 0000000..4463b48 --- /dev/null +++ b/docs/plugins/inspect/plugin-ximagesrc.xml @@ -0,0 +1,28 @@ + + ximagesrc + X11 video input plugin using standard Xlib calls + ../../sys/ximage/.libs/libgstximagesrc.so + libgstximagesrc.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + ximagesrc + Ximage video source + Source/Video + Creates a screenshot video stream + Lutz Mueller <lutz@users.sourceforge.net>, Jan Schmidt <thaytan@mad.scientist.com>, Zaheer Merali <zaheerabbas at merali dot org> + + + src + source + always +
video/x-raw-rgb, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], pixel-aspect-ratio=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-y4menc.xml b/docs/plugins/inspect/plugin-y4menc.xml new file mode 100644 index 0000000..dc2b7d9 --- /dev/null +++ b/docs/plugins/inspect/plugin-y4menc.xml @@ -0,0 +1,34 @@ + + y4menc + Encodes a YUV frame into the yuv4mpeg format (mjpegtools) + ../../gst/y4m/.libs/libgsty4menc.so + libgsty4menc.so + 0.10.31 + LGPL + gst-plugins-good + GStreamer Good Plug-ins source release + Unknown package origin + + + y4menc + YUV4MPEG video encoder + Codec/Encoder/Video + Encodes a YUV frame into the yuv4mpeg format (mjpegtools) + Wim Taymans <wim.taymans@gmail.com> + + + sink + sink + always +
video/x-raw-yuv, format=(fourcc){ IYUV, I420, Y42B, Y41B, Y444 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+ + src + source + always +
application/x-yuv4mpeg, y4mversion=(int)2
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/scanobj-build.stamp b/docs/plugins/scanobj-build.stamp new file mode 100644 index 0000000..e69de29 diff --git a/docs/random/ChangeLog-0.8 b/docs/random/ChangeLog-0.8 new file mode 100644 index 0000000..c63ef6c --- /dev/null +++ b/docs/random/ChangeLog-0.8 @@ -0,0 +1,17501 @@ +2005-08-28 Andy Wingo + + * Updates for two-arg init from GST_BOILERPLATE. + + * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): Use + the second arg for the class, because G_OBJECT_GET_CLASS (self) + returns the wrong thing. + (gst_signal_processor_add_pad_from_template): Make pads of the + right type. + + * ext/ladspa/gstladspa.c (gst_ladspa_class_get_param_spec): Make + writable param specs G_PARAM_CONSTRUCT so default values work. + (gst_ladspa_init): Use the second arg for the class. + +2005-08-26 Andy Wingo + + * ext/ladspa/gstladspa.c: + * ext/ladspa/gstladspa.h: Finish porting, still doesn't work but + it does compile and register. I have more features than you. + + * ext/ladspa/gstsignalprocessor.h: + * ext/ladspa/gstsignalprocessor.c: Updates, bug fixen. + +2005-08-26 Thomas Vander Stichele + + * gst/effectv/gstquark.c: (gst_quarktv_init), + (gst_quarktv_change_state): + do proper cleanup/creation, fixes state changes + +2005-08-25 Jan Schmidt + + * gst/level/gstlevel.c: (gst_level_message_new): + Revert unpopular change for GST_MESSAGE_SRC to GObject. + +2005-08-25 Andy Wingo + + * ext/ladspa/gstladspa.h: + * ext/ladspa/gstladspa.c: Halfway-ported. Doesn't compile yet. + + * ext/ladspa/gstsignalprocessor.h: + * ext/ladspa/gstsignalprocessor.c: New files, the start of a base + class for DSP elements. + + * configure.ac: Sort the external libs checks, add a ladspa check, + output the ladspa makefile. + +2005-08-25 Owen Fraser-Green + + * gst/realmedia/rmdemux.c (gst_rmdemux_loop, gst_rmdemux_chain): + Fixed EOS. + (gst_rmdemux_parse_indx_data, gst_rmdemux_parse_indx): Handle + malformed index headers where the packet size is incorrect. + +2005-08-24 Andy Wingo + + * ext/dv/gstdvdemux.c (gst_dvdemux_demux_frame): Send out valid + segment end timestamps. + +2005-08-24 Thomas Vander Stichele + + * configure.ac: + * ext/Makefile.am: + lame and mpegaudioparse seem to work + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_transform_caps), (gst_video_box_get_unit_size): + update for basetransform changes + +2005-08-24 Jan Schmidt + * gst/level/gstlevel.c: (gst_level_message_new): + GST_MESSAGE_SRC became a GObject + +2005-08-23 Stefan Kost + + * ext/speex/gstspeexenc.h: + Fixed include path of adapter + +2005-08-23 Wim Taymans + + * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init): + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): + Fix property warning. + +2005-08-23 Wim Taymans + + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), + (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain): + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain): + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), + (gst_rtph263penc_flush), (gst_rtph263penc_chain): + Small updates, RFC reference to payload encoders. + +2005-08-23 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/speex/Makefile.am: + * ext/speex/gstspeex.c: (plugin_init): + * ext/speex/gstspeexdec.c: (speex_get_query_types), + (gst_speex_dec_init), (speex_dec_src_query), (speex_dec_src_event), + (speex_dec_event), (speex_dec_chain): + Port speexdec. Leads to some unfamiliar warnings on console, + but works otherwise. + +2005-08-23 Andy Wingo + + * sys/oss/gstosssrc.c (gst_oss_src_open): Set the device-name + property after opening the mixer. + + * sys/oss/gstosssrc.c: + * sys/oss/gstosssrc.h: Easy to implement a mixer, eh... + + * sys/oss/gstossmixerelement.h: + * sys/oss/gstossmixerelement.c: Added mixer element like + alsamixer. + + * sys/oss/Makefile.am: + * sys/oss/gstossaudio.c: Register the ossmixer element. + + * sys/oss/gstossmixer.h: + * sys/oss/gstossmixer.c: Refactored to be more like alsamixer. + + * sys/oss/gstossmixertrack.h: + * sys/oss/gstossmixertrack.c: Split out from gstossmixer.[ch], + like gstalsamixer. + + * sys/oss/gstosssrc.c: + * sys/oss/gstosssink.c: Where before we used a gstosselement + object as a helper library, now just call functions from + gstosshelper. + + * sys/oss/gstosshelper.h: + * sys/oss/gstosshelper.c: Made a real library. Removed + propertyprobe for now, should add it back later. + + * sys/oss/gstosselement.h: + * sys/oss/gstosselement.c: Removed, we don't have a shared base + class. + + * sys/oss/gstosshelper.c (gst_oss_helper_probe_caps): Search + higher-to-lower, makes 16 bit appear earlier in the caps, which + makes it preferred. + + * sys/oss/gstosssrc.h: + * sys/oss/gstosssrc.c: Totally ported, dude. + + * sys/oss/Makefile.am: + * sys/oss/gstossaudio.c: Add osssrc. + + * sys/oss/gstosssink.c: We do native byte order. + +2005-08-23 Owen Fraser-Green + + * gst/realmedia/rmdemux.c (gst_rmdemux_src_event): Fixed bug + causing events to be passed wrong way. + (gst_rmdemux_parse_packet): Avoid accidentally skipping audio. + +2005-08-22 Jan Schmidt + + * ext/mad/gstid3tag.c: (gst_id3_tag_init), + (gst_id3_tag_sink_event), (gst_id3_tag_do_caps_nego), + (gst_id3_tag_chain), (gst_id3_tag_change_state), (plugin_init): + Works a bit better now, but still needs a rewrite to use + get_range instead of this seeking nastiness. + +2005-08-22 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/flac/Makefile.am: + * ext/flac/gstflac.c: (plugin_init): + * ext/flac/gstflacdec.c: (flacdec_get_type), (gst_flacdec_init), + (gst_flacdec_update_metadata), (gst_flacdec_seek), + (gst_flacdec_tell), (gst_flacdec_length), (gst_flacdec_read), + (gst_flacdec_write), (gst_flacdec_loop), + (gst_flacdec_get_src_query_types), (gst_flacdec_src_query), + (gst_flacdec_src_event), (gst_flacdec_sink_activate), + (gst_flacdec_sink_activate_pull), (gst_flacdec_change_state): + * ext/flac/gstflacdec.h: + Port flacdec (seeking is still slow'ish). + +2005-08-22 Owen Fraser-Green + + * gst/realmedia/rmdemux.c: + (gst_rmdemux_perform_seek, gst_rmdemux_parse_packet): + Seeking improvements. + +2005-08-19 Wim Taymans + + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init): + Remove get_time code that is both wrong and unneeded. + +2005-08-19 Wim Taymans + + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), + (gst_rtph263penc_flush), (gst_rtph263penc_chain), + (gst_rtph263penc_set_property), (gst_rtph263penc_get_property): + * gst/rtp/gstrtph263penc.h: + Added configurable pt and ssrc, to be merged in the caps or + a base class... + +2005-08-19 Wim Taymans + + * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_init), + (gst_rtph263pdec_chain): + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), + (gst_rtph263penc_flush), (gst_rtph263penc_chain): + Some cleanups in the h263p (de)payloaders. + +2005-08-19 Wim Taymans + + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_setcaps): + * ext/amrnb/amrnbparse.c: + Update caps with audio/AMR. + + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), + (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain), + (gst_rtpamrdec_change_state): + * gst/rtp/gstrtpamrdec.h: + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain): + Dont set FT headers twice, it was already in the encoded + bitstream. + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play): + * gst/rtsp/rtspconnection.c: (parse_line): + Cleanups + + * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), + (gst_udpsrc_create), (gst_udpsrc_set_property), + (gst_udpsrc_get_property): + * gst/udp/gstudpsrc.h: + Added caps property, we need this soon to type the buffers. + +2005-08-18 Wim Taymans + + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), + (gst_rtpamrdec_chain): + Fix up amr depayloader a bit. + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play): + Look for options result in Public and Allow header fields.. + spec says Allow but some servers return Public... + +2005-08-18 Wim Taymans + + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain), + (gst_rtpamrenc_set_property), (gst_rtpamrenc_get_property): + * gst/rtp/gstrtpamrenc.h: + Added payload_type and ssrc properties to the payloader. + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play): + Options need to be stripped and are in the Public header field. + + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + Fix url / parsing... + + +2005-08-18 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_get_type), + (gst_rtpamrdec_base_init), (gst_rtpamrdec_class_init), + (gst_rtpamrdec_init), (gst_rtpamrdec_chain), + (gst_rtpamrdec_set_property), (gst_rtpamrdec_get_property), + (gst_rtpamrdec_change_state), (gst_rtpamrdec_plugin_init): + * gst/rtp/gstrtpamrdec.h: + * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_get_type), + (gst_rtpamrenc_base_init), (gst_rtpamrenc_class_init), + (gst_rtpamrenc_init), (gst_rtpamrenc_chain), + (gst_rtpamrenc_set_property), (gst_rtpamrenc_get_property), + (gst_rtpamrenc_change_state), (gst_rtpamrenc_plugin_init): + * gst/rtp/gstrtpamrenc.h: + * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_class_init), + (gst_rtpmpaenc_flush), (gst_rtpmpaenc_chain): + Added very simplistic amr payloader. depayloader does not + work yet. + +2005-08-18 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), + (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtspdefs.c: (rtsp_method_as_text), (rtsp_find_method): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtsptransport.c: (rtsp_transport_parse): + Handle RTSP defaults better. + Issue OPTIONS request to figure out what we are allowed to do. + Make the methods a bitfield so we can easily collect supported + options. + Fix rtsp_find_method. + Do proper RTSP connection shutdown. + +2005-08-18 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp-common.h: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpL16enc.h: + * gst/rtp/gstrtpdec.c: (gst_rtpdec_get_type), + (gst_rtpdec_class_init), (gst_rtpdec_chain_rtp), + (gst_rtpdec_chain_rtcp), (gst_rtpdec_change_state), + (gst_rtpdec_plugin_init): + * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_get_type), + (gst_rtph263pdec_base_init), (gst_rtph263pdec_class_init), + (gst_rtph263pdec_init), (gst_rtph263pdec_chain), + (gst_rtph263pdec_set_property), (gst_rtph263pdec_get_property), + (gst_rtph263pdec_change_state), (gst_rtph263pdec_plugin_init): + * gst/rtp/gstrtph263pdec.h: + * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_get_type), + (gst_rtph263penc_base_init), (gst_rtph263penc_class_init), + (gst_rtph263penc_init), (gst_rtph263penc_flush), + (gst_rtph263penc_chain), (gst_rtph263penc_set_property), + (gst_rtph263penc_get_property), (gst_rtph263penc_change_state), + (gst_rtph263penc_plugin_init): + * gst/rtp/gstrtph263penc.h: + * gst/rtp/gstrtpmpadec.c: (gst_rtpmpadec_get_type), + (gst_rtpmpadec_base_init), (gst_rtpmpadec_class_init), + (gst_rtpmpadec_init), (gst_rtpmpadec_chain), + (gst_rtpmpadec_set_property), (gst_rtpmpadec_get_property), + (gst_rtpmpadec_change_state), (gst_rtpmpadec_plugin_init): + * gst/rtp/gstrtpmpadec.h: + * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_get_type), + (gst_rtpmpaenc_base_init), (gst_rtpmpaenc_class_init), + (gst_rtpmpaenc_init), (gst_rtpmpaenc_flush), (gst_rtpmpaenc_chain), + (gst_rtpmpaenc_set_property), (gst_rtpmpaenc_get_property), + (gst_rtpmpaenc_change_state), (gst_rtpmpaenc_plugin_init): + * gst/rtp/gstrtpmpaenc.h: + * gst/rtp/rtp-packet.c: + * gst/rtp/rtp-packet.h: + Remove old code that is now in gst-libs/gst/rtp/. + Added some payload/depayloaders. + + * gst/udp/gstudpsink.c: (gst_udpsink_class_init): + Fix port number range. + +2005-08-17 Wim Taymans + + * configure.ac: + Added mpegaudioparse + + * ext/lame/gstlame.c: (gst_lame_src_getcaps), + (gst_lame_src_setcaps), (gst_lame_sink_setcaps), + (gst_lame_sink_event), (gst_lame_chain): + Some cleanups. + Fix memleak. + + * gst/mpegaudioparse/gstmpegaudioparse.c: + (gst_mp3parse_class_init), (gst_mp3parse_init), + (gst_mp3parse_chain), (gst_mp3parse_change_state): + * gst/mpegaudioparse/gstmpegaudioparse.h: + Ported mpegaudioparse + +2005-08-17 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open), (gst_rtspsrc_play): + Support absolute control urls too. + +2005-08-16 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_stream_header): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_add_stream), (qtdemux_parse_tree): + Uncomment metadata and codec-name handling. + +2005-08-16 Wim Taymans + + * configure.ac: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_read_header): + Fix compile warning. + + * ext/lame/gstlame.c: (gst_lame_class_init), + (gst_lame_src_getcaps), (gst_lame_src_setcaps), + (gst_lame_sink_setcaps), (gst_lame_init), (gst_lame_sink_event), + (gst_lame_chain), (gst_lame_change_state): + * ext/lame/gstlame.h: + Port lame plugin + +2005-08-16 Andy Wingo + + * ext/dv/gstdvdemux.c (gst_dvdemux_flush): Use gst_adapter_take so + we have our own copy of the data. + (gst_dvdemux_demux_video): Set the take() data as malloc_data so + it will get freed later. + + * ext/raw1394/gstdv1394src.c (gst_dv1394src_iso_receive): Note + license info in the source code -- was only in the commit log + before. + + * ext/dv/gstdvdec.h: + * ext/dv/gstdvdec.c: Only decodes systemstream=FALSE dv video -- + old pipelines using dvdec should probably have a dvdemux first. + + * ext/dv/gstdvdemux.h: + * ext/dv/gstdvdemux.c: Split out from dvdec, chunks the incoming + systemstream=TRUE data into frames, sets caps data, and spits out + PCM audio in addition to systemstream=FALSE video frames. Operates + in chain mode only for now; should make a getrange version as + well. + + * ext/dv/gstdv.c: New file, registers the libgstdv plugin. + + * ext/dv/Makefile.am: Library name changed to libgstdv. Split + dvdec into dvdemux and dvdec. + +2005-08-16 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_event), (gst_faad_chain): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): + Handle _push() return values. + +2005-08-15 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_event): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): + Fix debug. + +2005-08-15 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), + (qtdemux_video_caps): + Forwardport from 0.8 to implement RLE. + +2005-08-15 Wim Taymans + + * gst/rtsp/README: + Added rtsp server implementation docs. + +2005-08-14 Thomas Vander Stichele + + * ext/aalib/gstaasink.c: + aalib is LGPL, so this plugin can be LGPL + * ext/arts/gst_arts.c: (plugin_init): + rename, we don't like underscores + * ext/audiofile/gstaf.c: + * ext/sndfile/gstsf.c: + rename, we like a descriptive plugin name + * ext/gconf/gstgconfelements.c: + change description a little + * ext/musicbrainz/gsttrm.c: + musicbrainz is LGPL, so plugin can be LGPL + * ext/raw1394/gst1394.c: + rename, we like all-digit names + * gst/equalizer/gstiirequalizer.c: + * gst/fdsrc/gstfdsrc.c: + * gst/multifilesink/gstmultifilesink.c: + rename + * gst/virtualdub/gstvirtualdub.c: + use GST_PLUGIN_DEFINE + * sys/dxr3/dxr3init.c: + only uses system headers, and code is LGPL, so plugin is LGPL + +2005-08-13 Tim-Philipp Müller + + * ext/mad/Makefile.am: + * gst/avi/Makefile.am: + * gst/effectv/Makefile.am: + * gst/udp/Makefile.am: + * gst/wavparse/Makefile.am: + Use -lgstfoo-@GST_MAJORMINOR@ instead of -lgstfoo-0.9 + +2005-08-12 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_decode_indirect), + (gst_jpeg_dec_decode_direct), (gst_jpeg_dec_chain): + Fix decoding of pictures with certain uneven or unaligned + widths where jpeglib needs more horizontal padding than our + I420 buffers provide, resulting in blocky artifacts at the + left side of the picture (#164176). + Also make use of our shiny new GST_ROUND_N() macros. + +2005-08-11 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_chain), + (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Fix crashes/invalid memory access for pictures that have a height + that is not a multiple of 16 (or rather: v_samp_factor * DCTSIZE). + + Also fix the state change function for downwards state changes + (need to chain up to parent before destroying our resources, to + make sure pads get deactivated and our chain function isn't + running and using those very same resources in another thread). + + The jpeg line buffer only needs to be v_samp_factor*DCTSIZE lines + per plane, not picture_height lines; allocate that on the stack. + +2005-08-10 Tim-Philipp Müller + + * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers), + (gst_wavparse_stream_data): + Add some fixes from 0.8 branch: allow 24/32bps songs and + blockalign samples to the header-specified size, if any + (#311070); error out on channels==0 or bitrate==0 + (#309043, #304588). + +2005-08-10 Thomas Vander Stichele + + * gst/level/gstlevel.c: (gst_level_init), (gst_level_set_caps), + (gst_level_transform): + * gst/level/gstlevel.h: + remove unused MS struct member + don't reset the CS values for channels on every _chain, so that + level actually correctly calculates the RMS value. sigh. + calculate RMS values correctly for peak and decay peak sums; + before we were signalling them as if they already were amplitude + and not power values. sigh. + Remind me to not try and pretend I'm writing DSP code. + +2005-08-10 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_class_init), (gst_faad_setcaps): + Add debug category, remove Close() call that made it crash + whenever reusing, renegotiating or anything; Close() actually + free()s the handle and should only be called on READY->NULL. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): + Actually set caps on buffer (in addition to pad), also. + +2005-08-10 Owen Fraser-Green + + * gst/realmedia/rmdemux.c (gst_rmdemux_sink_activate) + (gst_rmdemux_sink_activate_push, gst_rmdemux_sink_activate_pull) + (gst_rmdemux_loop, gst_rmdemux_src_event) + (gst_rmdemux_perform_seek, gst_rmdemux_src_query): Implemented + push-pull and seeking. + +2005-08-09 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_event): + Sign/unsign mismatch. + * configure.ac: + * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), + (gst_qtdemux_init), (gst_qtdemux_get_src_query_types), + (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), + (plugin_init), (gst_qtdemux_handle_sink_event), + (gst_qtdemux_change_state), (gst_qtdemux_loop_header), + (qtdemux_sink_activate), (qtdemux_sink_activate_pull), + (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), + (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): + * gst/qtdemux/qtdemux.h: + Half-assed port (hey, it works). + +2005-08-09 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): + Fix AVI header parsing: add missing break statement after + GST_RIFF_INFO_LIST parsing code; gst_riff_read_chunk() has + already advanced the avi->offset, no need to do it twice + (fixes MovieOfMovies.avi). + +2005-08-09 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), + (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain), + (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Make mjpeg actually work and skip jpeg data parsing if we + know that the input is packetized (ie. each input buffer + is exactly one jpeg frame). + +2005-08-09 Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): + It'd be nice if I could listen to my mp3 files, so send out an + initial discont, as the sink apparently wants. + +2005-08-09 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), + (gst_avi_demux_handle_seek): + Fix seeking (or, well, fix threading issue where a variable was + set before a lock was taken and was already unset before that + same lock was taken and was thus no longer in existance when it + actually had to be used). + +2005-08-09 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): + Mixing binary and logical operators is not going to work; fix + position-querying in Totem. + +2005-08-08 Tim-Philipp Müller + + * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_class_init), + (gst_faad_init), (gst_faad_setcaps), (gst_faad_srcgetcaps), + (gst_faad_event), (gst_faad_update_caps), (gst_faad_chain), + (gst_faad_change_state): + * ext/faad/gstfaad.h: + Fix negotiation (#310932) and miscellaneous other stuff. Probably + still needs some more work. + +2005-08-08 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), + (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain): + Add setcaps() function (for mjpeg). + +2005-08-08 Andy Wingo + + * ext/esd/esdsink.c (gst_esdsink_getcaps): Seems that wierd + va_list caps setting function was borked. Fixed esdsink. + + * sys/oss/gstosssink.c (gst_oss_sink_open, gst_oss_sink_close) + (gst_oss_sink_prepare, gst_oss_sink_unprepare): Update for newer + audiosink api. + + * ext/raw1394/gstdv1394src.c (gst_dv1394src_get_property) + (gst_dv1394src_set_property): Style. All about the style. + + * ext/esd/esdsink.c (gst_esdsink_getcaps): Return specific caps + only if in READY or higher (i.e., if _open() has been called.) + (gst_esdsink_open, gst_esdsink_close, gst_esdsink_prepare) + (gst_esdsink_unprepare): Update for audiosink changes. + (gst_esdsink_change_state): Die! + +2005-08-08 Ronald S. Bultje + + * ext/jpeg/Makefile.am: + Fix compile. + +2005-08-08 Tim-Philipp Müller + + * configure.ac: + * ext/Makefile.am: + * ext/jpeg/Makefile.am: + * ext/jpeg/gstjpeg.c: (plugin_init): + * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_get_type), + (gst_jpeg_dec_finalize), (gst_jpeg_dec_base_init), + (gst_jpeg_dec_class_init), (gst_jpeg_dec_fill_input_buffer), + (gst_jpeg_dec_init_source), (gst_jpeg_dec_skip_input_data), + (gst_jpeg_dec_resync_to_restart), (gst_jpeg_dec_term_source), + (gst_jpeg_dec_my_output_message), (gst_jpeg_dec_my_emit_message), + (gst_jpeg_dec_my_error_exit), (gst_jpeg_dec_init), + (is_jpeg_start_marker), (is_jpeg_end_marker), + (gst_jpeg_dec_find_jpeg_header), (gst_jpeg_dec_ensure_header), + (gst_jpeg_dec_have_end_marker), + (gst_jpeg_dec_parse_tag_has_entropy_segment), + (gst_jpeg_dec_parse_image_data), (gst_jpeg_dec_chain), + (gst_jpeg_dec_change_state): + * ext/jpeg/gstjpegdec.h: + Port jpegdec to 0.9; handles 'progressive loading' now, ie. input does + no longer need to be one single buffer. + +2005-08-04 Andy Wingo + + * sys/oss/gstossaudio.c (plugin_init): Second-class citizen. + + * gst/videobox/gstvideobox.c (gst_video_box_get_size): Update for + API changes. + + * configure.ac (DEFAULT_AUDIOSINK, DEFAULT_VIDEOSINK): Set to + autoaudiosink and autovideosink. + +2005-08-04 Edward Hervey + + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_parse_stream), (gst_avi_demux_process_next_entry): + You need to allocatate (len+1) characters to store a len size string. + Also don't stop the processing task if the output pad is not linked. + +2005-08-03 Ronald S. Bultje + + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset), + (gst_gconf_audio_sink_init), (do_toggle_element), + (cb_toggle_element), (gst_gconf_audio_sink_change_state): + * ext/gconf/gstgconfaudiosink.h: + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), + (gst_gconf_video_sink_init), (do_toggle_element), + (cb_toggle_element), (gst_gconf_video_sink_change_state): + * ext/gconf/gstgconfvideosink.h: + * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_reset), + (gst_auto_audio_sink_init), (gst_auto_audio_sink_detect), + (gst_auto_audio_sink_change_state): + * gst/autodetect/gstautoaudiosink.h: + * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), + (gst_auto_video_sink_init), (gst_auto_video_sink_detect), + (gst_auto_video_sink_change_state): + * gst/autodetect/gstautovideosink.h: + Use new ghostpad API; now they actually work in Totem, also. + +2005-08-03 Ronald S. Bultje + + * ext/libpng/Makefile.am: + Fix uninstalled build. + +2005-08-02 Edward Hervey + + * configure.ac: + * ext/Makefile.am: + * ext/libpng/Makefile.am: + * ext/libpng/gstpng.c: + * ext/libpng/gstpngenc.c: + Ported pngenc , still have to port pngdec... + +2005-08-01 Stefan Kost + + reviewed by: + + * configure.ac: + * ext/ladspa/Makefile.am: + * ext/ladspa/gstladspa.c: (gst_ladspa_init), (gst_ladspa_loop), + (gst_ladspa_chain), (gst_ladspa_get), (plugin_init): + * ext/ladspa/gstladspa.h: + deactivate and remove dparams (libgstcontrol) + +2005-07-27 Wim Taymans + + * ext/faad/gstfaad.c: (gst_faad_event): + Compile fixes. + +2005-07-27 Wim Taymans + + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_event), + (gst_amrnbparse_loop): + * ext/dv/gstdvdec.c: (gst_dvdec_handle_sink_event), + (gst_dvdec_handle_src_event), (gst_dvdec_decode_frame): + * ext/mad/gstid3tag.c: (gst_id3_tag_src_event), + (gst_id3_tag_sink_event), (gst_id3_tag_chain): + * ext/mad/gstmad.c: (gst_mad_src_query), (index_seek), + (normal_seek), (gst_mad_sink_event), (gst_mad_chain): + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/shout2/gstshout2.c: (gst_shout2send_event): + * ext/sidplay/gstsiddec.cc: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), + (gst_avi_demux_send_event), (gst_avi_demux_stream_header), + (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry): + * gst/goom/gstgoom.c: (gst_goom_event): + * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), + (gst_rmdemux_chain), (gst_rmdemux_send_event), + (gst_rmdemux_add_stream): + * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), + (gst_wavparse_stream_headers), (gst_wavparse_stream_data), + (gst_wavparse_loop), (gst_wavparse_srcpad_event): + Various event updates and cleanups. + +2005-07-25 Christian Schaller + + + * gst-plugins.spec.in: add silence and videoflip + * gst/videofilter/Makefile.am: add missing header to noinst + +2005-07-25 Thomas Vander Stichele + + * gst/videofilter/Makefile.am: + * gst/videofilter/gstgamma.c: (gst_gamma_setup): + * gst/videofilter/gstvideobalance.c: (gst_videobalance_setup): + * gst/videofilter/gstvideofilter.c: (gst_videofilter_class_init), + (gst_videofilter_getcaps), (gst_videofilter_setcaps), + (gst_videofilter_init), (gst_videofilter_chain), + (gst_videofilter_set_property), (gst_videofilter_get_property), + (gst_videofilter_setup), (gst_videofilter_class_add_pad_templates): + * gst/videofilter/gstvideofilter.h: + * gst/videofilter/gstvideoflip.c: (gst_videoflip_init), + (gst_videoflip_set_property), (gst_videoflip_get_property), + (plugin_init), (gst_videoflip_setup), (gst_videoflip_planar411): + forward port from 0.9 and enable videoflip now that it works + +2005-07-23 Edward Hervey + + * configure.ac: + * gst/silence/Makefile.am: + * gst/silence/gstsilence.h: + * gst/silence/gstsilence.c: + Ported silence to 0.9 using GstBaseSrc ... 180 lines :) + +2005-07-22 Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_src_event): + First try forwarding events, makes seeking in AVI files with mp3 + audio work again. + +2005-07-20 Andy Wingo + + * ext/mpeg2dec/gstmpeg2dec.c (gst_mpeg2dec_sink_event): Signedness + fix. + +2005-07-20 Edward Hervey + + * configure.ac: + * gst/wavparse/gstwavparse.c: + * gst/wavparse/gstwavparse.h: + * gst/wavparse/Makefile.am: + Ported wavparse to 0.9 . Playing, seeking and state changes work. + Could need more loving on the headers though. + +2005-07-20 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/gconf/Makefile.am: + * ext/gconf/gconf.c: (gst_bin_find_unconnected_pad), + (gst_gconf_render_bin_from_description), + (gst_gconf_get_default_video_sink): + * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init), + (gst_gconf_audio_sink_class_init), (gst_gconf_audio_sink_dispose), + (cb_toggle_element), (gst_gconf_audio_sink_change_state): + * ext/gconf/gstgconfelements.h: + * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init), + (gst_gconf_video_sink_class_init), (gst_gconf_video_sink_dispose), + (cb_toggle_element), (gst_gconf_video_sink_change_state): + * gst/autodetect/gstautoaudiosink.c: + (gst_auto_audio_sink_base_init), (gst_auto_audio_sink_class_init), + (gst_auto_audio_sink_detect), (gst_auto_audio_sink_change_state): + * gst/autodetect/gstautovideosink.c: + (gst_auto_video_sink_base_init), (gst_auto_video_sink_class_init), + (gst_auto_video_sink_find_best), (gst_auto_video_sink_detect): + Port auto/gconfsinks to 0.9. They actually appear to work here in + Totem as well, making them actually useful. + +2005-07-20 Ronald S. Bultje + + * ext/faad/Makefile.am: + Fix uninstalled build. + +2005-07-19 Wim Taymans + + * sys/oss/gstosssink.c: (gst_oss_sink_get_format), + (gst_oss_sink_open): + Parse spec to set correct oss values. + +2005-07-19 Edgard N. A. G. Lima + + * configure.ac + * ext/Makefile.am + * ext/amrnb/amrnbdec.c + * ext/amrnb/amrnbenc.c + * ext/amrnb/amrnbparse.c + * ext/faad/gstfaad.c + * ext/mpeg2dec/gstmpeg2dec.c + Ported amrnb, faad, mpeg2dec to 0.9 + +2005-07-19 Andy Wingo + + * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Set the proper + framerate on the outbound buffer. + + * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Don't clobber + alloc_buffer's return value. + (gst_dvdec_decode_frame): Handle unlinked pads with grace and + agility. + + * ext/dv/gstdvdec.h: Fix signedness error. + +2005-07-19 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), + (gst_dvdec_sink_convert), (gst_dvdec_get_src_query_types), + (gst_dvdec_src_query), (gst_dvdec_get_sink_query_types), + (gst_dvdec_sink_query), (gst_dvdec_send_event), + (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), + (gst_dvdec_decode_audio), (gst_dvdec_decode_video), + (gst_dvdec_decode_frame), (gst_dvdec_flush), (gst_dvdec_chain): + * ext/dv/gstdvdec.h: + Implemented seeking in dvdec. + +2005-07-19 Andy Wingo + + * ext/Makefile.am: Enable dvdev and raw1394src. + +2005-07-18 Andy Wingo + + * configure.ac: Use AS_LIBTOOL_TAGS. Fix crap gettext commit + comment. + +2005-07-18 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_add_element), + (gst_rtspsrc_play): + Fix for core changes. + +2005-07-18 Jan Schmidt + + * ext/mad/gstid3tag.c: (gst_id3_tag_sink_event): + When returning to NORMAL state after reading tags, + pass on the discont event. + +2005-07-18 Wim Taymans + + * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), + (gst_rmdemux_change_state), (gst_rmdemux_chain), + (gst_rmdemux_get_stream_by_id), (gst_rmdemux_send_event), + (gst_rmdemux_add_stream): + Send discont event before pushing first buffer. + +2005-07-17 Philippe Khalaf + + * gst/fdsrc/gstfdsrc.c: + Removed #include + +2005-07-16 Philippe Khalaf + + * gst/fdsrc/gstfdsrc.c: + * gst/fdsrc/gstfdsrc.h: + * gst/fdsrc/Makefile.am: + Moved fdsrc 0.9 port from gstreamer/gst/elements to here. + +2005-07-16 Wim Taymans + + * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event), + (gst_mad_chain): + Add convert function for proper timestamp calculations. + + * gst/avi/gstavidemux.c: (gst_avi_demux_send_event), + (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry), (gst_avi_demux_loop): + Send out initial discont. + +2005-07-15 Wim Taymans + + * gst/level/gstlevel.c: (gst_level_transform): + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_get_size), (gst_video_box_transform): + Port to new base class. + +2005-07-14 Wim Taymans + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), + (gst_dv1394src_class_init), (gst_dv1394src_init), + (gst_dv1394src_iso_receive), (gst_dv1394src_create), + (gst_dv1394src_change_state), (gst_dv1394src_query): + It's PUSH_SRC now. + +2005-07-14 Thomas Vander Stichele + + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_class_init): + more autistic cleanliness in functions/names/defines + + +2005-07-10 Thomas Vander Stichele + + * ext/aalib/gstaasink.c: (gst_aasink_get_type), + (gst_aasink_class_init), (gst_aasink_init): + * ext/esd/esdsink.c: (gst_esdsink_get_type), + (gst_esdsink_class_init): + * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), + (gst_cacasink_class_init), (gst_cacasink_init): + * ext/shout2/gstshout2.c: (gst_shout2send_get_type), + (gst_shout2send_class_init), (gst_shout2send_init): + * gst/udp/gstdynudpsink.c: (gst_dynudpsink_get_type), + (gst_dynudpsink_class_init): + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), + (gst_multiudpsink_class_init): + more macro splitting + +2005-07-08 Andy Wingo + + * sys/oss/: Port from THREADED+wim's fixes. + + * gst/avi/Makefile.am (libgstavi_la_CFLAGS): No gettext hacks, the + defines come from config.h. + + * autogen.sh: Run autopoint, etc. + + * Makefile.am (DIST_SUBDIRS, SUBDIRS): Go into po/. + + * configure.ac: Add gettext stuff. + +2005-07-07 Wim Taymans + + * gst/videobox/gstvideobox.c: (gst_video_box_init), + (gst_video_box_transform_caps), (gst_video_box_set_caps): + Logic was reversed. Needs some more fixes in the transform + function to include AYUV output. + Moved AYUV as prefered format. + +2005-07-07 Wim Taymans + + * configure.ac: + * ext/dv/Makefile.am: + * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), + (gst_dvdec_get_src_query_types), (gst_dvdec_src_query), + (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), + (gst_dvdec_video_getcaps), (gst_dvdec_video_setcaps), + (gst_dvdec_decode_audio), (gst_dvdec_decode_video), + (gst_dvdec_decode_frame), (gst_dvdec_chain), + (gst_dvdec_change_state), (gst_dvdec_set_property), + (gst_dvdec_get_property), (plugin_init): + * ext/dv/gstdvdec.h: + * ext/esd/esdsink.c: (gst_esdsink_class_init): + Ported DVdec to 0.9. + Parent of esdsink is GstAudioSink. + +2005-07-07 Wim Taymans + + * configure.ac: + * ext/raw1394/Makefile.am: + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), + (gst_dv1394src_class_init), (gst_dv1394src_init), + (gst_dv1394src_iso_receive), (gst_dv1394src_create), + (gst_dv1394src_change_state), (gst_dv1394src_convert), + (gst_dv1394src_get_query_types), (gst_dv1394src_query): + * ext/raw1394/gstdv1394src.h: + Ported the 1394 source to 0.9. + +2005-07-07 Wim Taymans + + * ext/mad/gstid3tag.c: (gst_id3_tag_get_query_types): + * ext/mad/gstmad.c: (gst_mad_get_query_types), (gst_mad_src_query): + * gst/avi/gstavidemux.c: (gst_avi_demux_get_src_query_types): + Remove deprecated/unsed code. + +2005-07-06 Edward Hervey + + * gst/udp/gstudpsrc.c: (gst_udpsrc_init): + GST_BASESRC --> GST_BASE_SRC + +2005-07-05 Andy Wingo + + * gst/oneton: Removed (replaced by deinterleave). + + * gst/adder: + * gst/audioconvert: + * gst/audiorate: + * gst/audioscale: + * gst/ffmpegcolorspace: + * gst/playback: + * gst/sine: + * gst/subparse: + * gst/tags: + * gst/tcp: + * gst/videoscale: + * gst/volume: Removed dirs that are now in gst-plugins-base. + +2005-07-05 Edward Hervey + + * configure.ac: (GST_PLUGINS_ALL): + videofilter must be compiled first, since other plugins depend ont it. + +2005-07-05 Andy Wingo + + * Way, way, way too many files: + Remove crack comment from the 2000 era. + +2005-07-05 Andy Wingo + + * gst/videobox/gstvideobox.c: Clean up, port to 0.9, use + BaseTransform. + + * gst/videobox/Makefile.am: Link to base libs, include + plugins-base cflags, dist the README. + + * configure.ac (GST_PLUGIN_ALL, AC_CONFIG_FILES): Add videobox to + the build. + +2005-07-04 Wim Taymans + + * gst/realmedia/rmdemux.c: + I don't think that piece of changelog should go there. + +2005-07-04 Andy Wingo + + * examples/level/: + * examples/level/Makefile.am: + * examples/level/README: + * examples/level/demo.c: + * examples/level/plot.c: Examples moved out of the source dir. Not + updated tho. + + * configure.ac: Add level to the build. + + * gst/level/Makefile.am: + * gst/level/gstlevel.h: + * gst/level/gstlevel.c: Cleaned up, ported to 0.9. + + * ext/aalib/gstaasink.c (gst_aasink_fixate): Update for newer + fixate prototype. + +2005-07-03 Owen Fraser-Green + + * gst/realmedia/rmdemux.c (gst_rmdemux_add_stream), + (gst_rmdemux_src_getcaps), (gst_rmdemux_chain): + Added getcaps function no_more_pads call + +2005-07-01 Philippe Khalaf + * gst/udp/Makefile.am: + * gst/udp/gstudp.c: + * gst/udp/gstdynudpsink.c: (new) + * gst/udp/gstdynudpsink.h: (new) + Added new element (udpdynsink) that receives GstNetBuffers and sends the + udp packets to the source given in the buffer. It's used by rtpsession + element for now. + * gst/udp/gstudpsrc.c: + Fixed memory leak. + +2005-07-01 Jan Schmidt + + * configure.ac: + * ext/mad/Makefile.am: + * sys/oss/Makefile.am: + Roll gstreamer-interfaces-0.9.pc into gstreamer-plugins-base-0.9.pc + +2005-07-01 Jan Schmidt + * ext/libcaca/Makefile.am: + * ext/mad/Makefile.am: + * gst/effectv/Makefile.am: + * gst/udp/Makefile.am: + Replace GST_PLUGINS_LIBS_* with GST_PLUGINS_BASE_* + + * ext/mad/gstid3tag.c: (gst_id3_tag_src_query), + (gst_id3_tag_src_event), (gst_id3_tag_sink_event), + (gst_id3_tag_chain), (plugin_init): + * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_chain): + Signedness warning fix, use gst_pad_get_peer instead of GST_PAD_PEER + in querying and event handling, because we're not holding the pad + lock and the peer may disappear. + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex), + (gst_avi_demux_parse_index), (gst_avi_demux_massage_index): + Signedness warning fixes. + + * gst/videofilter/gstvideotemplate.c: (plugin_init): + Remove gst_library_load + +2005-06-30 Edward Hervey + + * gst/avi/Makefile.am: (libgstavi_la_LIBADD): + Added linking to libgstriff-0.9 + + * ext/mad/gstmad.c: (gst_mad_src_query): + check the format of the upstream query and return query if it's the + same format as the requested one. + +2005-06-30 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): + Compiler pains. + +2005-06-30 Ronald S. Bultje + + * configure.ac: + * gst/avi/Makefile.am: + * gst/avi/gstavi.c: (plugin_init): + * gst/avi/gstavidemux.c: (gst_avi_demux_get_type), + (gst_avi_demux_class_init), (gst_avi_demux_init), + (gst_avi_demux_reset), (gst_avi_demux_index_next), + (gst_avi_demux_index_entry_for_time), + (gst_avi_demux_index_entry_for_byte), + (gst_avi_demux_index_entry_for_frame), (gst_avi_demux_src_convert), + (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), + (gst_avi_demux_parse_file_header), (gst_avi_demux_stream_init), + (gst_avi_demux_parse_avih), (gst_avi_demux_parse_superindex), + (gst_avi_demux_parse_subindex), (gst_avi_demux_read_subindexes), + (gst_avi_demux_parse_stream), (gst_avi_demux_parse_odml), + (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), + (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), + (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), + (gst_avi_demux_loop), (gst_avi_demux_sink_activate), + (gst_avi_demux_sink_activate_pull): + * gst/avi/gstavidemux.h: + Port from -THREADED to HEAD, and fix for latest API changes of + the day. Keep avimux dead for now. + +2005-06-29 Wim Taymans + + * ext/shout2/gstshout2.c: (gst_shout2send_render): + Fix build. + +2005-06-29 Andy Wingo + + * gst/videofilter/gstvideoexample.c: Removed gst_library_load, I + think. Whatever this plugin actually does, that I don't know. + +2005-06-29 Andy Wingo + + * ext/mad/gstid3tag.c (gst_id3_tag_get_event_masks): Reschmoove. + + * ext/mad/gstmad.c (gst_mad_get_event_masks): Remove. + (gst_mad_chain): Appease GCC. + + * ext/libcaca/gstcacasink.c (gst_cacasink_setcaps): Signedness. + + * ext/aalib/gstaasink.c (gst_aasink_fixate): Unref caps, not free. + (gst_aasink_scale): Signedness. + + * gst/udp/gstudpsink.c (gst_udpsink_get_type): Actually add the + URI handler. + + * gst/udp/gstudpsrc.c (gst_udpsrc_start): + (gst_udpsrc_create): Signedness. + + * gst/rtsp/sdpmessage.c (sdp_message_parse_buffer): Thanks + compiler! + (sdp_parse_line): Signedness fix. + + * configure.ac (GST_CFLAGS): GCC strikes back!!! Let the build + breakage ensue!!! + + * gst/rtsp/gstrtspsrc.c (gst_rtspsrc_loop, gst_rtspsrc_open): + Signedness, unused var fixes. + (gst_rtspsrc_close): Unused? + + * gst/realmedia/rmdemux.c (re_hexdump_bytes): Unused. + + * gst/law/mulaw-encode.c (gst_mulawenc_chain): Signeness fix. + + * gst/law/alaw-encode.c (alawenc_getcaps): Remove unneeded + declarations. Typo (probably crasher) fix. + + * gst/law/mulaw-encode.c (mulawdec_getcaps): + * gst/law/mulaw-encode.c (mulawenc_getcaps): + * gst/law/alaw-decode.c (alawdec_getcaps): Same crasher fix. + + * gst/goom/gstgoom.c (gst_goom_init): Hook up the event function. + + * gst/effectv/gstwarp.c (gst_warptv_setup): Signedness fix. + + * gst/effectv/gstdice.c (gst_dicetv_draw): Um, deferencing + uninitialized pointer not good. + + * gst/videofilter/gstvideoexample.c (plugin_init): + * gst/videofilter/Makefile.am (libgstvideoexample_la_LIBADD): Link + to libgstvideofilter instead of gst_library_load. + + * gst/alpha/gstalpha.c (gst_alpha_chroma_key_i420) + (gst_alpha_chroma_key_ayuv): Signedness fixen. + +2005-06-29 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), + (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), + (gst_rtspsrc_change_state): + Fix case where outpad could not be decided. + +2005-06-29 Andy Wingo + + * ext/Makefile.am (MAD_DIR): Add mad to the build. + +2005-06-28 Wim Taymans + + * ext/mad/gstid3tag.c: (gst_id3_tag_src_link): + * gst/udp/gstudpsrc.c: (gst_udpsrc_init): + Fix old RPAD macro. + basesrc -> base_src + +2005-06-27 Wim Taymans + + * ext/mad/gstid3tag.c: (gst_id3_tag_src_link): + * ext/mad/gstmad.c: (gst_mad_chain): + RPAD_ -> PAD + Fix args in bufferalloc function call. + Makes the mad plugin compile again + +2005-06-27 Owen Fraser-Green + + * gst/realmedia/rmdemux.c: Rewrote to use gstadapter. Also parses + audio and video header packets for known properties. + +2005-06-23 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), + (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), + (gst_rtspsrc_change_state): + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + Make rtspsrc a live source. + Don't try to parse NULL urls. + +2005-06-23 Wim Taymans + + * gst/udp/gstudpsrc.c: (gst_udpsrc_init): + Make udpsrc a live source. + +2005-06-02 Wim Taymans + + * gst/udp/Makefile.am: + Use versioned net lib. + +2005-06-02 Wim Taymans + + * gst/udp/Makefile.am: + Fix hack in makefile. + +2005-06-02 Andy Wingo + + * ext/mad/gstid3tag.c: Finish porting to 0.9: no more gstdata, + check for link functions before calling them, give + gst_message_new_tag its own copy of the tag list, set the parser + state before sending the event (because in 0.9 events are + processed immediately), casting fixes. + + * ext/mad/Makefile.am (libgstmad_la_LDFLAGS): Link with + gsttagedit. + +2005-06-02 Wim Taymans + + * gst/udp/Makefile.am: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), + (gst_multiudpsink_base_init), (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_finalize), + (gst_multiudpsink_get_times), (gst_multiudpsink_render), + (gst_multiudpsink_set_property), (gst_multiudpsink_init_send), + (gst_multiudpsink_add), (client_compare), (free_client), + (gst_multiudpsink_remove), (gst_multiudpsink_clear), + (gst_multiudpsink_get_stats): + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_base_init), (gst_udpsrc_class_init), + (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), + (gst_udpsrc_unlock), (gst_udpsrc_stop): + Use NetBuffer and small cleanups. + Implement client removal in multiudpsink. + +2005-06-02 Wim Taymans + + * gst/rtsp/README: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), + (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), + (gst_rtspsrc_change_state): + * gst/rtsp/rtsptransport.c: (rtsp_transport_new), + (rtsp_transport_init), (parse_mode), (parse_range), + (rtsp_transport_parse), (rtsp_transport_free): + RTSP cleanups. + +2005-06-02 Wim Taymans + + * gst/effectv/gstquark.c: (gst_quarktv_chain): + * gst/goom/gstgoom.c: (gst_goom_chain): + * gst/videobox/Makefile.am: + * gst/videobox/gstvideobox.c: (gst_video_box_class_init), + (gst_video_box_init), (gst_video_box_sink_setcaps), + (gst_video_box_chain): + * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): + * gst/videorate/gstvideorate.c: (gst_videorate_class_init), + (gst_videorate_getcaps), (gst_videorate_setcaps), + (gst_videorate_init), (gst_videorate_event), (gst_videorate_chain), + (gst_videorate_change_state): + Bufferalloc changes. + +2005-05-25 Wim Taymans + + * ext/mad/gstmad.c: (gst_mad_chain), (gst_mad_change_state): + * ext/sidplay/gstsiddec.cc: + * gst/alpha/gstalpha.c: (gst_alpha_chain): + * gst/goom/gstgoom.c: (gst_goom_chain): + No need to take the lock anymore, core already did + that before calling us. + +2005-05-25 Wim Taymans + + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_base_init), + (gst_amrnbenc_finalize), (gst_amrnbenc_chain), + (gst_amrnbenc_state_change): + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), + (gst_amrnbparse_query), (gst_amrnbparse_chain), + (gst_amrnbparse_read_header), (gst_amrnbparse_loop), + (gst_amrnbparse_sink_activate), (gst_amrnbparse_state_change): + Core already took the lock. + +2005-05-19 Ronald S. Bultje + + * configure.ac: + * ext/esd/Makefile.am: + Disable tcp elements and esdmon (they don't compile). + +2005-05-19 Jan Schmidt + + * Makefile.am: + * ext/Makefile.am: + * sys/Makefile.am: + Make my automake version shut up about undefined variables + * gst/goom/gstgoom.c: + GstAdapter moved to base objects. + +2005-05-18 Wim Taymans + + * ext/amrnb/Makefile.am: + * ext/amrnb/amrnb.c: (plugin_init): + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), + (gst_amrnbdec_setcaps), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.c: (gst_amrnbenc_get_type), + (gst_amrnbenc_base_init), (gst_amrnbenc_class_init), + (gst_amrnbenc_init), (gst_amrnbenc_finalize), + (gst_amrnbenc_setcaps), (gst_amrnbenc_chain), + (gst_amrnbenc_state_change): + * ext/amrnb/amrnbenc.h: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), + (gst_amrnbparse_query), (gst_amrnbparse_event), + (gst_amrnbparse_chain), (gst_amrnbparse_read_header), + (gst_amrnbparse_loop), (gst_amrnbparse_sink_activate), + (gst_amrnbparse_state_change): + * ext/amrnb/amrnbparse.h: + Ported AMR decoder/parse. + Added AMR encoder. + +2005-05-18 Wim Taymans + + * configure.ac: + * gst/goom/Makefile.am: + * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_sink_setcaps), + (gst_goom_src_setcaps), (gst_goom_src_negotiate), (gst_goom_event), + (gst_goom_chain), (gst_goom_change_state), (plugin_init): + Ported goom. + Added goom and alpha to build. + +2005-05-17 Wim Taymans + + * configure.ac: + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: (gst_alpha_class_init), (gst_alpha_init), + (gst_alpha_sink_setcaps), (gst_alpha_chain): + Ported alpha, remove alphacolor as functionality is in + ffmpegcolorspace. + +2005-05-17 Wim Taymans + + * ext/libcaca/gstcacasink.c: (gst_cacasink_setcaps), + (gst_cacasink_render), (gst_cacasink_open), (gst_cacasink_close), + (gst_cacasink_change_state): + * ext/libcaca/gstcacasink.h: + Cleanups. + +2005-05-15 David Schleef + + Move core plugins out of core. I don't mind fdsrc/fdsink + going back into the core; they were just disabled there, so + I moved them. Some of this stuff could (should) be deleted. + * gst/oldcore/Makefile.am: + * gst/oldcore/gstaggregator.c: + * gst/oldcore/gstaggregator.h: + * gst/oldcore/gstelements.c: + * gst/oldcore/gstfdsink.c: + * gst/oldcore/gstfdsink.h: + * gst/oldcore/gstfdsrc.c: + * gst/oldcore/gstfdsrc.h: + * gst/oldcore/gstmd5sink.c: + * gst/oldcore/gstmd5sink.h: + * gst/oldcore/gstmultifilesrc.c: + * gst/oldcore/gstmultifilesrc.h: + * gst/oldcore/gstpipefilter.c: + * gst/oldcore/gstpipefilter.h: + * gst/oldcore/gstshaper.c: + * gst/oldcore/gstshaper.h: + * gst/oldcore/gststatistics.c: + * gst/oldcore/gststatistics.h: + +2005-05-13 Christian Schaller + + * ext/Makefile.am: dist esd directory + * gst-plugins.spec.in: add rtp plugins and esd plugin + * gst/effectv/Makefile.am: fix videofilter linking + * gst/rtp/Makefile.am: add missing headers + * gst/rtsp/Makefile.am: add missing headers + +2005-05-12 Wim Taymans + + * configure.ac: + * ext/sidplay/gstsiddec.cc: + Add working plugins to build. + Make sidplay compile again. + +2005-05-12 Wim Taymans + + * ext/mad/gstid3tag.c: (gst_id3_tag_src_query): + * ext/mad/gstmad.c: (gst_mad_chain): + Fix mad and id3tag compilation again. + +2005-05-12 Wim Taymans + + * gst/udp/.cvsignore: + * gst/udp/Makefile.am: + * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), + (gst_multiudpsink_base_init), (gst_multiudpsink_class_init), + (gst_multiudpsink_init), (gst_multiudpsink_finalize), + (gst_multiudpsink_get_times), (gst_multiudpsink_render), + (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), + (gst_multiudpsink_init_send), (gst_multiudpsink_close), + (gst_multiudpsink_add), (gst_multiudpsink_remove), + (gst_multiudpsink_clear), (gst_multiudpsink_get_stats), + (gst_multiudpsink_change_state): + * gst/udp/gstmultiudpsink.h: + * gst/udp/gstudp-marshal.list: + * gst/udp/gstudp.c: (plugin_init): + * gst/udp/gstudp.h: + * gst/udp/gstudpsink.c: (gst_udpsink_get_type), + (gst_udpsink_base_init), (gst_udpsink_class_init), + (gst_udpsink_init), (gst_udpsink_set_uri), + (gst_udpsink_set_property), (gst_udpsink_get_property), + (gst_udpsink_uri_get_type), (gst_udpsink_uri_get_protocols), + (gst_udpsink_uri_get_uri), (gst_udpsink_uri_set_uri), + (gst_udpsink_uri_handler_init): + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_base_init), (gst_udpsrc_class_init), + (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), + (gst_udpsrc_unlock), (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Added multifdsink to send UDP to multiple addresses. + Cleaned up UDP source/sink elements some more. + Make UDP sink extends from multiudpsink. + +2005-05-12 Tim-Philipp Müller + + * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event): + Make queries actually work (update core first). + +2005-05-12 Wim Taymans + + * gst/rtsp/README: + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get_type), + (gst_tcpclientsrc_base_init), (gst_tcpclientsrc_class_init), + (gst_tcpclientsrc_init), (gst_tcpclientsrc_getcaps), + (gst_tcpclientsrc_stop), (gst_tcpclientsrc_eos), + (gst_tcpclientsrc_create), (gst_tcpclientsrc_start): + * gst/tcp/gsttcpclientsrc.h: + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_get_type), + (gst_tcpserversrc_base_init), (gst_tcpserversrc_class_init), + (gst_tcpserversrc_init), (gst_tcpserversrc_create), + (gst_tcpserversrc_start), (gst_tcpserversrc_stop): + * gst/tcp/gsttcpserversrc.h: + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get_type), + (gst_tcpsrc_base_init), (gst_tcpsrc_class_init), (gst_tcpsrc_init), + (gst_tcpsrc_create), (gst_tcpsrc_start), (gst_tcpsrc_stop): + * gst/tcp/gsttcpsrc.h: + * gst/udp/gstudpsink.c: (gst_udpsink_base_init), + (gst_udpsink_init), (gst_udpsink_get_times), (gst_udpsink_render), + (gst_udpsink_set_property), (gst_udpsink_get_property), + (gst_udpsink_change_state): + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), + (gst_udpsrc_stop): + * gst/udp/gstudpsrc.h: + Make UDP and TCP elements use PushSrc. + + +2005-05-11 Tim-Philipp Müller + + * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_src_query), + (index_seek), (normal_seek), (gst_mad_sink_event): + Port to new query API and replace gst_pad_convert() + and gst_pad_get_formats() usage. gstid3tag looks like + it needs some more love before it will work again, if + not a rewrite. + +2005-05-12 Zeeshan Ali + + * gst/effectv/Makefile.am: + Fixed the effectv build again. + +2005-05-11 Wim Taymans + + * gst/tcp/Makefile.am: + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_get_type), + (gst_multifdsink_base_init), (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_render), + (gst_multifdsink_change_state): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_get_type), + (gst_tcpclientsink_base_init), (gst_tcpclientsink_class_init), + (gst_tcpclientsink_init), (gst_tcpclientsink_render), + (gst_tcpclientsink_set_property), (gst_tcpclientsink_get_property), + (gst_tcpclientsink_change_state): + * gst/tcp/gsttcpclientsink.h: + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), + (gst_tcpclientsrc_init_receive): + * gst/tcp/gsttcpplugin.c: (plugin_init): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init): + * gst/tcp/gsttcpserversink.h: + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init): + * gst/tcp/gsttcpsink.c: (gst_tcpsink_get_type), + (gst_tcpsink_base_init), (gst_tcpsink_class_init), + (gst_tcpsink_setcaps), (gst_tcpsink_init), (gst_tcpsink_get_times), + (gst_tcpsink_render), (gst_tcpsink_set_property), + (gst_tcpsink_get_property): + * gst/tcp/gsttcpsink.h: + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_class_init), (gst_tcpsrc_get): + Ported over some sink elements. + Sources not ported yet as they require a PushSource base class. + +2005-05-11 Tim-Philipp Müller + + * gst/effectv/Makefile.am: + * gst/videofilter/Makefile.am: + Turn videofilter into a library (private for now) + +2005-05-11 Wim Taymans + + * gst/rtsp/README: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), + (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play): + * gst/rtsp/rtsp.h: + * gst/rtsp/rtspconnection.c: (rtsp_connection_create), + (rtsp_connection_send), (read_line), (parse_request_line), + (parse_line), (read_body), (rtsp_connection_receive), + (rtsp_connection_free): + * gst/rtsp/rtspconnection.h: + * gst/rtsp/rtspdefs.c: (rtsp_find_method): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspmessage.c: (rtsp_message_set_body), + (rtsp_message_take_body): + * gst/rtsp/rtspmessage.h: + * gst/rtsp/rtspstream.h: + * gst/rtsp/sdpmessage.c: (sdp_parse_line): + Added README + Some cleanups. + +2005-05-11 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_init), + (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), + (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_close), + (gst_rtspsrc_play), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + Setup UDP sources correctly, receives raw data from RTSP + compliant servers now. + +2005-05-11 Wim Taymans + + * gst/rtsp/.cvsignore: + * gst/rtsp/Makefile.am: + * gst/rtsp/gstrtsp.c: (plugin_init): + * gst/rtsp/gstrtsp.h: + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), + (gst_rtspsrc_get_type), (gst_rtspsrc_base_init), + (gst_rtspsrc_class_init), (gst_rtspsrc_init), + (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), + (gst_rtspsrc_create_stream), (rtspsrc_add_element), + (gst_rtspsrc_stream_setup_rtp), + (gst_rtspsrc_stream_configure_transport), (find_stream), + (gst_rtspsrc_loop), (gst_rtspsrc_send), (gst_rtspsrc_open), + (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), + (gst_rtspsrc_activate), (gst_rtspsrc_change_state): + * gst/rtsp/gstrtspsrc.h: + * gst/rtsp/rtsp.h: + * gst/rtsp/rtspconnection.c: (rtsp_connection_open), + (rtsp_connection_create), (append_header), (rtsp_connection_send), + (read_line), (read_string), (read_key), (parse_response_status), + (parse_line), (read_body), (rtsp_connection_receive), + (rtsp_connection_close): + * gst/rtsp/rtspconnection.h: + * gst/rtsp/rtspdefs.c: (rtsp_init_status), (rtsp_method_as_text), + (rtsp_header_as_text), (rtsp_status_as_text), + (rtsp_status_to_string), (rtsp_find_header_field): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspmessage.c: (rtsp_message_new_request), + (rtsp_message_init_request), (rtsp_message_new_response), + (rtsp_message_init_response), (rtsp_message_init_data), + (rtsp_message_add_header), (rtsp_message_remove_header), + (rtsp_message_get_header), (rtsp_message_get_header_copy), + (rtsp_message_set_body), (rtsp_message_set_body_copy), + (rtsp_message_get_body), (rtsp_message_get_body_copy), (dump_mem), + (dump_key_value), (rtsp_message_dump): + * gst/rtsp/rtspmessage.h: + * gst/rtsp/rtspstream.h: + * gst/rtsp/rtsptransport.c: (rtsp_transport_new), + (rtsp_transport_init), (parse_mode), (parse_range), + (rtsp_transport_parse), (rtsp_transport_free): + * gst/rtsp/rtsptransport.h: + * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_free): + * gst/rtsp/rtspurl.h: + * gst/rtsp/sdp.h: + * gst/rtsp/sdpmessage.c: (sdp_message_new), (sdp_message_init), + (sdp_message_clean), (sdp_message_free), (sdp_media_new), + (sdp_media_init), (sdp_message_set_origin), + (sdp_message_get_origin), (sdp_message_set_connection), + (sdp_message_get_connection), (sdp_message_add_bandwidth), + (sdp_message_add_time), (sdp_message_add_zone), + (sdp_message_set_key), (sdp_message_get_key), + (sdp_message_get_attribute_val), (sdp_message_add_attribute), + (sdp_message_add_media), (sdp_media_add_attribute), + (sdp_media_add_bandwidth), (sdp_media_add_format), + (sdp_media_get_attribute_val), (read_string), (read_string_del), + (sdp_parse_line), (sdp_message_parse_buffer), (print_media), + (sdp_message_dump): + * gst/rtsp/sdpmessage.h: + * gst/rtsp/test.c: (main): + Ported to 0.9. + Set up transports, init UDP ports, init RTP session managers. + +2005-05-11 Wim Taymans + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpdec.c: (gst_rtpdec_get_type), + (gst_rtpdec_class_init), (gst_rtpdec_init), (gst_rtpdec_chain_rtp), + (gst_rtpdec_chain_rtcp), (gst_rtpdec_set_property), + (gst_rtpdec_get_property), (gst_rtpdec_change_state), + (gst_rtpdec_plugin_init): + * gst/rtp/gstrtpdec.h: + * gst/udp/gstudpsink.c: (gst_udpsink_base_init), + (gst_udpsink_get_times), (gst_udpsink_render), + (gst_udpsink_change_state): + * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), + (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), + (gst_udpsrc_loop), (gst_udpsrc_set_uri), (gst_udpsrc_set_property), + (gst_udpsrc_get_property), (gst_udpsrc_init_receive), + (gst_udpsrc_activate), (gst_udpsrc_change_state), + (gst_udpsrc_uri_get_type), (gst_udpsrc_uri_get_protocols), + (gst_udpsrc_uri_get_uri), (gst_udpsrc_uri_set_uri), + (gst_udpsrc_uri_handler_init): + * gst/udp/gstudpsrc.h: + UDP fixes, added uri handler. + Added rtpdec that will manage the RTP session in the future. + +2005-05-10 Arwed v. Merkatz + + * PORTED_09: + * configure.ac: + * ext/Makefile.am: + * ext/esd/Makefile.am: + * ext/esd/esdsink.c: (gst_esdsink_get_type), + (gst_esdsink_class_init), (gst_esdsink_init), + (gst_esdsink_dispose), (gst_esdsink_change_state), + (gst_caps_set_each), (gst_esdsink_getcaps), (gst_esdsink_open), + (gst_esdsink_close), (gst_esdsink_write), (gst_esdsink_delay), + (gst_esdsink_reset), (gst_esdsink_set_property), + (gst_esdsink_get_property), (gst_esdsink_factory_init): + * ext/esd/esdsink.h: + * ext/esd/gstesd.c: (plugin_init): + Ported esdsink plugin + +2005-05-10 Wim Taymans + + * gst/udp/Makefile.am: + * gst/udp/gstudpsink.c: (gst_udpsink_get_type), + (gst_udpsink_base_init), (gst_udpsink_class_init), + (gst_udpsink_init), (gst_udpsink_get_times), (gst_udpsink_render), + (gst_udpsink_set_property), (gst_udpsink_get_property), + (gst_udpsink_init_send), (gst_udpsink_close), + (gst_udpsink_change_state): + * gst/udp/gstudpsink.h: + * gst/udp/gstudpsrc.c: (gst_udpsrc_base_init), + (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_loop), + (gst_udpsrc_set_property), (gst_udpsrc_get_property), + (gst_udpsrc_init_receive), (gst_udpsrc_close), + (gst_udpsrc_activate), (gst_udpsrc_change_state): + * gst/udp/gstudpsrc.h: + Ported udp src/sink. + +2005-05-09 Zaheer Abbas Merali + + * PORTED_09: + * configure.ac: + * ext/Makefile.am: + * ext/shout2/Makefile.am: + * ext/shout2/gstshout2.c: (gst_shout2send_get_type), + (gst_shout2send_base_init), (gst_shout2send_class_init), + (gst_shout2send_init), (gst_shout2send_event), + (gst_shout2send_render), (gst_shout2send_set_property), + (gst_shout2send_get_property), (gst_shout2send_setcaps), + (gst_shout2send_change_state): + * ext/shout2/gstshout2.h: + + Port shout2 plugin + +2005-05-08 Zeeshan Ali + + * configure.ac: + * ext/Makefile.am: + * ext/libcaca/Makefile.am: + * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), + (gst_cacasink_class_init), (gst_cacasink_get_times), + (gst_cacasink_setcaps), (gst_cacasink_init), (gst_cacasink_render), + (plugin_init): + * ext/libcaca/gstcacasink.h: + Ported the libcaca plugin. + +2005-05-08 Zeeshan Ali + + * configure.ac: + * ext/mad/Makefile.am: + * effectv/Makefile.am: + Fixed a few things to enable the mad and effectv to be able to find the + headers in the gst-plugins-base/gst-libs and to link against the libs + in there. + +2005-05-07 Zeeshan Ali + + * configure.ac: + Fixed the build by fixing a small mistake of Wim. + +2005-05-06 Wim Taymans + + * configure.ac: + * ext/aalib/Makefile.am: + * ext/aalib/gstaasink.c: (gst_aasink_get_type), + (gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps), + (gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render), + (gst_aasink_set_property), (gst_aasink_get_property), + (gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state): + * ext/aalib/gstaasink.h: + * gst/smpte/Makefile.am: + * gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init), + (gst_smpte_collected): + * gst/smpte/gstsmpte.h: + Ported 2 more plugins. usgly hack in the Makefile.am though, I'm + sure someone will fix it. + +2005-05-06 Christian Schaller + + * configure.ac: add sidplay + * ext/Makefile.am: add sidplay + * ext/sidplay/Makefile.am: add GST_PLUGINS_CFLAGS + * ext/sidplay/gstsiddec.cc: remove bytestream.h + +2005-05-06 Christian Schaller + + * configure.ac: add gst-plugins-libs + +2005-05-06 Wim Taymans + + * configure.ac: + * ext/sidplay/gstsiddec.cc: + * ext/sidplay/gstsiddec.h: + Ported sidplay. + +2005-05-06 Christian Schaller + + * configure.ac: + * ext/mad/Makefile.am: add linking of gstinterfaces + * ext/mad/gstid3tag.c: (plugin_init): remove library_load + * gst-plugins.spec.in: + * gst/effectv/Makefile.am: link to libgstvideofilter + * gst/effectv/gsteffectv.c: (plugin_init): same as for mad + * gst/videofilter/Makefile.am: make sure videoflip is not built + +2005-05-06 Wim Taymans + + * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_setcaps), + (gst_alawdec_init), (gst_alawdec_chain): + * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_setcaps), + (gst_alawenc_init), (gst_alawenc_chain): + * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_setcaps), + (gst_mulawdec_init), (gst_mulawdec_chain): + * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_setcaps), + (gst_mulawenc_init), (gst_mulawenc_chain): + Ported alaw and mulaw plugins to 0.9, fixed the negotiation as + well. + +2005-05-06 Christian Schaller + + * ext/alsa: removed plugins that are now in gst-plugins-base + * ext/gnomevfs: + * ext/theora: + * ext/vorbis: + * gst/adder: + * gst/audioconvert: + * gst/ffmpegcolorspace: + * gst/typefind: + * gst/videofilter: comment out videoflip and gamma plugins + +2005-05-06 Christian Schaller + + * gst-libs: Remove all files as this is in gst-plugins-base now + * gst-libs/README: add a remove informing of this move + +2005-05-06 Christian Schaller + + * PORTED_09: update to add videofilter + * configure.ac: re-add videofilter + * gst/videofilter/Makefile.am: remove videobalance (not ported yet) + * gst/videofilter/gstgamma.c: (gst_gamma_class_init): + * gst/videofilter/gstvideobalance.c: (gst_videobalance_class_init): + * gst/videofilter/gstvideofilter.c: (gst_videofilter_getcaps), + (gst_videofilter_setcaps), (gst_videofilter_init), + (gst_videofilter_chain), (gst_videofilter_set_output_size): + * gst/videofilter/gstvideoflip.c: (gst_videoflip_class_init): + +2005-05-06 Christian Schaller + + * ext/mad: ported plugin from threaded branch + * gst/effectv: ported plugins from threaded branch + * gst/law: enable law plugin as it compiles (Wim will fixor) + +2005-05-06 Zaheer Abbas Merali + + * configure.ac: + fix typo + +2005-05-05 Christian Schaller + + * Update configure.ac and Makefiles to only build what is actually + ported and not moved into gst-plugins-base + +2005-02-22 Thomas Vander Stichele + + * configure.ac: + hunting season on 0.9 is now OPEN + +2005-02-22 Ronald S. Bultje + + * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): + Kick the hell out of gcc for not warning me about a symbol conflict. + +2005-02-22 Luca Ognibene + + Reviewed by: Tim-Philipp Müller + + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_link): + Don't leak caps string (fixes #168134) + + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init), + (gst_jpegenc_init), (gst_jpegenc_finalize), + (gst_jpegenc_change_state): + Don't leak line buffers and context struct (fixes #168133). + +2005-02-21 Tim-Philipp Müller + + * configure.ac: + * ext/dirac/gstdiracdec.cc: + (gst_diracdec_chain): + Since dirac 0.5.0 the framerate in dirac is expressed as a + rational number. Fix build and up requirement to 0.5.0, and + also pass parameters to gst_diracdec_link in the right order + (fixes #167959). + +2005-02-21 Maciej Katafiasz + + * ext/faad/gstfaad.c: (gst_faad_sinkconnect), (gst_faad_chain): + * ext/faad/gstfaad.h: + TEH LONGEST DEBUGGING SESSION EVAR is over. Fix interaction with + certain invalid muxed streams, where some packets will contain + junk after decoder data. Partially fixes #149158. + +2005-02-21 Jan Schmidt + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain): + Make sure we only write to writable buffers + +2005-02-20 Tim-Philipp Müller + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data): + Do actually fix invalid RIFF fmt header values for alaw + and mulaw audio instead of just saying so. + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): + Give gst_riff_create_audio_caps_with_data() a chance to + fix up broken format header fields before extracting any + parameters from the header. (fixes #167633) + +2005-02-19 Martin Holters + + Reviewed by: Tim-Philipp Müller + + * gst/audioconvert/bufferframesconvert.c: + (buffer_frames_convert_link): + Don't leak othercaps. (fixes #167878) + +2005-02-19 Arwed v. Merkatz > + + * configure.ac: + * ext/libvisual/visual.c: (gst_visual_srclink), + (gst_visual_change_state): + Support libvisual 0.2.0. + +2005-02-18 Tim-Philipp Müller + + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_chain): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_resync), (gst_jpegenc_chain): + Use same rowstrides for I420 as used everywhere else. + +2005-02-17 Tim-Philipp Müller + + * gst/avi/gstavidemux.c: (gst_avi_demux_invert): + Declare variables at beginning of block and make gcc-2.95 happy + (fixes # 167482, patch by Gergely Nagy). + + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpclientsrc.h: + Move some includes into the header, so that struct sockaddr_in is + defined when it should be defined on FreeBSD as well (fixes + #167483). + + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_init_receive): + Don't pass uninitialised values to setsockopt() here either. + +2005-02-17 Luca Ognibene + + Reviewed by: Tim-Philipp Müller + + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init_send): + Don't pass uninitialised values to setsockopt(). (fixes #167704) + +2005-02-16 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (add_sink): + Invert bin_add/link order to workaround deadlock in opt. + +2005-02-15 Ronald S. Bultje + + * gst/modplug/gstmodplug.cc: + Add missing break causing position queries to fail. + +2005-02-15 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_populate): + Granpos can apparently be -1, which screws up calculations... + +2005-02-16 Jan Schmidt + + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_send_pending_navigation), + (gst_ximagesink_navigation_send_event), (gst_ximagesink_finalize), + (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_send_pending_navigation), + (gst_xvimagesink_navigation_send_event), + (gst_xvimagesink_finalize), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: + Use a mutex protected list to marshal navigation + events into the stream thread from whichever thread + sends them. + +2005-02-15 Tim-Philipp Müller + + * gst/speed/demo-mp3.c: (time_tick_cb), (main): + Display current position and track length; misc. clean-ups. + + * gst/speed/gstspeed.c: (speed_get_query_types), (speed_src_query), + (speed_init), (speed_chain): + Add query function, so that the stream length and current position + get adjusted when queried (note that current position queries may + still be wrong if the audio sink returns values based on buffer + timestamps instead of passing on the query). + +2005-02-13 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), + (gst_audio_convert_channels): + create channel conversion matrix when linking + * gst/audioconvert/.cvsignore: + * gst/audioconvert/Makefile.am: + * gst/audioconvert/channelmixtest.c: (main): + add (ugly) test that ensures stereo <=> mono conversion works + correctly + +2005-02-13 Benjamin Otte + + * gst/audioconvert/gstchannelmix.h: + include missing header file + * gst/audioconvert/gstchannelmix.c: + (gst_audio_convert_fill_compatible): + use same sign for both channels when converting to/from compatible + channel. Previously used different signs made the signals cancel + each other out and appear like silence. (fixes #167269) + +2005-02-12 Tim-Philipp Müller + + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/imgconvert.c: + Convert to and from YV12 (fixes #156379). + +2005-02-12 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), + (gst_ximagesink_sink_link), (gst_ximagesink_change_state), + (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), + (gst_ximagesink_expose), (gst_ximagesink_set_property), + (gst_ximagesink_finalize), (gst_ximagesink_init): Protect interface + methods from chain and negotiation and vice versa (Fixes #166142). + * sys/ximage/ximagesink.h: Add stream_lock. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_expose): Check for xcontext before trying to link. + +2005-02-12 Tim-Philipp Müller + + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_open): + Don't send "Hey! You gave me a NULL pointer you naughty person" as + error message when we can't open the DVD device (when dvdnav_open() + fails, src->dvdnav is NULL, so dvdnav_err_to_string() will return + the above). Send something more useful instead (fixes #167117). + +2005-02-11 Julien MOUTTE + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put), + (gst_xvimagesink_sink_link), (gst_xvimagesink_change_state), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_expose), (gst_xvimagesink_set_property), + (gst_xvimagesink_finalize), (gst_xvimagesink_init): Protect interface + methods from chain and negotiation and vice versa (Fixes #166142). + Fix a possible bug of images in the buffer pool being discarded because + we are looking at the wrong geometry. + * sys/xvimage/xvimagesink.h: Add stream_lock. + +2005-02-11 David Schleef + + * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer): Change uint to + unsigned int. (fixes #167128) + +2005-02-11 David Schleef + + * gst/librfb/Makefile.am: Testing stuff before committing is + for wimps... and people with fast machines. Fix stupid + mistake. + +2005-02-11 David Schleef + + * configure.ac: Pull in librfb from my CVS tree, because it is + too small and annoying to be separate. Move rfbsrc plugin + to gst/. + * ext/Makefile.am: + * ext/librfb/Makefile.am: + * ext/librfb/gstrfbsrc.c: + * gst/librfb/Makefile.am: + * gst/librfb/gstrfbsrc.c: + * gst/librfb/rfb.c: + * gst/librfb/rfb.h: + * gst/librfb/rfbbuffer.c: + * gst/librfb/rfbbuffer.h: + * gst/librfb/rfbbytestream.c: + * gst/librfb/rfbbytestream.h: + * gst/librfb/rfbcontext.h: + * gst/librfb/rfbdecoder.c: + * gst/librfb/rfbdecoder.h: + * gst/librfb/rfbutil.h: + +2005-02-10 Tim-Philipp Müller + + * gst/speed/Makefile.am: + * gst/speed/demo-mp3.c: (main): + * gst/speed/filter.func: + * gst/speed/gstspeed.c: (speed_link), (speed_parse_caps), + (speed_class_init), (speed_init), (speed_chain_int16), + (speed_chain_float32), (speed_chain), (speed_set_property), + (speed_get_property), (speed_change_state): + * gst/speed/gstspeed.h: + Fix speed element and make it chain-based (fixes #156467), + and make it handle more than one channel. + +2005-02-10 Jan Schmidt + + * ext/dts/gstdtsdec.c: (gst_dtsdec_init), (gst_dtsdec_channels), + (gst_dtsdec_handle_event), (gst_dtsdec_handle_frame), + (gst_dtsdec_chain), (gst_dtsdec_change_state): + * ext/dts/gstdtsdec.h: + Don't clobber the stack constructing the channels array. + Make the element chain-based. DTS tracks can now be played. + +2005-02-09 Tim-Philipp Müller + + * gst-libs/gst/audio/multichannel.h: + * gst-libs/gst/gconf/gconf.h: + * gst-libs/gst/idct/idct.h: + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/play/play.h: + * gst-libs/gst/resample/private.h: + * gst-libs/gst/resample/resample.h: + * gst-libs/gst/riff/riff-ids.h: + * gst-libs/gst/video/video.h: + * gst-libs/gst/video/videosink.h: + Add G_BEGIN_DECLS and G_END_DECLS around headers where + missing, so that they work when included from C++ code. + +2005-02-09 David Schleef + + * testsuite/gst-lint: Check for non-statically scoped + parent_class variables. This won't be a problem once + plugins are loaded with RTLD_LOCAL. + +2005-02-09 Ronald S. Bultje + + * ext/mplex/gstmplexibitstream.cc: + gcc madness. + +2005-02-09 Ronald S. Bultje + + * ext/ogg/gstogmparse.c: + * gst/debug/gstnavigationtest.c: + Die, thou faulty symbol pollutors (non-static parent_class). + +2005-02-08 Ronald S. Bultje + + * ext/mplex/gstmplexibitstream.cc: + Fix event handling (#165525). + +2005-02-08 Ronald S. Bultje + + * ext/mikmod/gstmikmod.c: + * gst/modplug/gstmodplug.cc: + Add missing endianness to template (fixes #165509). + +2005-02-08 Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_data): + Fix wrong order of reading of optional bytes (#165290). + +2005-02-08 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + Implement FILLER event awareness. + +2005-02-08 Ronald S. Bultje + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_convert): + Fix track calculations (#166208). + +2005-02-08 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * ext/libpng/gstpngdec.c: (gst_pngdec_init), (gst_pngdec_chain): + * ext/libpng/gstpngenc.c: + Fix byte-order, use proper fixed caps. Fixes #164197. + +2005-02-08 Jan Schmidt + + * configure.ac: + Add dvdlpcmdec + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_reset), + (free_all_buffers), (gst_mpeg2dec_alloc_buffer): + Don't push buffers if the src pad isn't negotiated yet. + + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_buffer_to_default_format), + (gst_audio_convert_buffer_from_default_format): + Add support for 24-bit width. + + * gst/dvdlpcmdec/.cvsignore: + * gst/dvdlpcmdec/Makefile.am: + * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_get_type), + (gst_dvdlpcmdec_base_init), (gst_dvdlpcmdec_class_init), + (gst_dvdlpcm_reset), (gst_dvdlpcmdec_init), (gst_dvdlpcmdec_link), + (gst_dvdlpcmdec_chain), (gst_dvdlpcmdec_change_state), + (plugin_init): + * gst/dvdlpcmdec/gstdvdlpcmdec.h: + New decoder for rearranging DVD LPCM into our audio/x-raw-int + format. Needs support for the channels maps if someone can find + a DVD LPCM track with > 2 channels. + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_handle_dvd_event), + (gst_dvd_demux_send_discont), (gst_dvd_demux_handle_discont), + (gst_dvd_demux_get_audio_stream), (gst_dvd_demux_process_private): + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont), + (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_init_stream), + (gst_mpeg_demux_send_subbuffer), (gst_mpeg_demux_handle_src_query): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_reset), + (gst_mpeg_parse_parse_packhead), (gst_mpeg_parse_loop), + (gst_mpeg_parse_get_rate), (gst_mpeg_parse_convert_src), + (gst_mpeg_parse_handle_src_query), + (gst_mpeg_parse_handle_src_event): + Use audio/x-dvd-lpcm for LPCM output. + Add DTS output. + +2005-02-08 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * gst/alpha/gstalphacolor.c: (gst_alpha_color_sink_link), + (transform_rgb), (transform_bgr), (gst_alpha_color_chain): + Add BGRA handling (#165736). + +2005-02-08 Francis Labonte + + Reviewed by: Ronald S. Bultje + + * gst/law/alaw-decode.c: (alawdec_link): + * gst/law/alaw-encode.c: (alawenc_link): + * gst/law/mulaw-decode.c: (mulawdec_link): + * gst/law/mulaw-encode.c: (mulawenc_link): + Fix caps memleaks (#166600). + +2005-02-08 Tim-Philipp Müller + + * ext/tarkin/mem.h: + * ext/tarkin/wavelet.h: + * ext/tarkin/yuv.h: + * gst/ffmpegcolorspace/avcodec.h: + Include "_stdint.h" instead of . Fixes build on + systems that don't have stdint.h, like Solaris9 (fixes #166631). + +2005-02-05 Ronald S. Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_change_state): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_clear), + (gst_xvimagesink_change_state): + Clear window on PAUSED->READY instead of READY->PAUSED. Stop + Xv video (and thereby regenerate Xv colourkey) in clear() so + that PLAY -> READY -> PLAY works (fixes #162504). + +2005-02-05 Ronald S. Bultje + + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_getcaps): + Switch to list instead of range, since MJPEG-devices really just + support decimations, not any size. + +2005-02-05 Jan Schmidt + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_open_decoder), + (gst_mpeg2dec_reset), (free_all_buffers), + (gst_mpeg2dec_alloc_buffer), (handle_sequence): + * ext/mpeg2dec/gstmpeg2dec.h: + The libmpeg2 user-allocated buffer management is awkward, + to say the least. Hopefully this fixes things. + +2005-02-04 Andy Wingo + + * gst/audioconvert/bufferframesconvert.c + (buffer_frames_convert_fixate): New function, fixates to 256 + frames per buffer by default. (Much better than 1.) + (buffer_frames_convert_init): Set the fixate function for both src + and sink pad. + (buffer_frames_convert_link): After success setting nonfixed caps, + get the negotiated caps so we can know how many buffer-frames it + will be. No idea how this worked at all before. + +2005-02-05 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (gst_mpeg2dec_close_decoder), (put_buffer), (check_buffer), + (free_buffer), (free_all_buffers), (gst_mpeg2dec_alloc_buffer), + (handle_sequence), (handle_picture): + * ext/mpeg2dec/gstmpeg2dec.h: + Rearrange buffer tracking and refcounting and refactor + a little for readability. + +2005-02-04 Jan Schmidt + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l/gstv4ljpegsrc.c: (gst_v4ljpegsrc_get_type), + (gst_v4ljpegsrc_base_init), (gst_v4ljpegsrc_class_init), + (gst_v4ljpegsrc_init), (gst_v4ljpegsrc_src_link), + (gst_v4ljpegsrc_getcaps), (gst_v4ljpegsrc_get): + * sys/v4l/gstv4ljpegsrc.h: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_open), (gst_v4lsrc_src_link): + * sys/v4l/v4l_calls.h: + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_palette_name), + (gst_v4lsrc_get_fps): + * sys/v4l/v4lsrc_calls.h: + Add new v4ljpegsrc for handling the ov51x hacky "I'll give + you jpeg inside rgb frames" driver. + Don't error in the v4lsrc link function, just return + REFUSED. + +2005-02-03 Ronald S. Bultje + + * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), + (gst_qcamsrc_open): + Use GST_ELEMENT_ERROR, not g_warning, if open failed. + +2005-02-02 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Change caps on MJPEG-B so it doesn't interfere with MJPEG/JPEG. + +2005-02-02 Ronald S. Bultje + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_change_state): + Reset negotiated state on PAUSED->READY. + +2005-02-02 David Schleef + + * configure.ac: Put DEFAULT_AUDIOSINK in config.h and use + whereever possible. (Fixes #165997) + * examples/capsfilter/capsfilter1.c: (main): + * examples/dynparams/filter.c: (create_ui): + * examples/seeking/cdparanoia.c: (get_track_info), (main): + * examples/seeking/chained.c: (main): + * examples/seeking/seek.c: (make_mod_pipeline), (make_dv_pipeline), + (make_wav_pipeline), (make_flac_pipeline), (make_sid_pipeline), + (make_vorbis_pipeline), (make_mp3_pipeline), (make_avi_pipeline), + (make_mpeg_pipeline), (make_mpegnt_pipeline): + * examples/seeking/spider_seek.c: (make_spider_pipeline): + * examples/switch/switcher.c: (main): + * ext/dv/demo-play.c: (main): + * ext/faad/gstfaad.c: (gst_faad_change_state): + * ext/mad/gstmad.c: (gst_mad_chain): + * ext/smoothwave/demo-osssrc.c: (main): + * gst-libs/gst/gconf/gconf.c: (gst_gconf_set_string), + (gst_gconf_render_bin_from_description), + (gst_gconf_get_default_audio_sink), + (gst_gconf_get_default_video_sink), + (gst_gconf_get_default_audio_src), + (gst_gconf_get_default_video_src), + (gst_gconf_get_default_visualization_element): + * gst/level/demo.c: (main): + * gst/level/plot.c: (main): + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): + * gst/playback/test.c: (gen_video_element), (gen_audio_element): + * gst/playondemand/demo-mp3.c: (setup_pipeline): + * gst/sine/demo-dparams.c: (main): + * gst/spectrum/demo-osssrc.c: (main): + * gst/speed/demo-mp3.c: (main): + * gst/volume/demo.c: (main): + * testsuite/embed/embed.c: (main): + +2005-02-02 Jan Schmidt + + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_class_init), + (gst_tcpclientsink_finalize): + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), + (gst_tcpclientsrc_finalize): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_init), (gst_tcpserversink_finalize): + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init), + (gst_tcpserversrc_init), (gst_tcpserversrc_finalize): + Don't leak the hostname when shutting down. + In tcpserversrc, take a copy of the default hostname. + +2005-02-01 Ronald S. Bultje + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_iso_receive): + Set caps to systemstream=TRUE. + +2005-02-01 Ronald S. Bultje + + * testsuite/Makefile.am: + Fix more OSX buildbots. + +2005-02-02 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: + Don't send things to NULL PAD_PEERs + + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_chain): + Copy-on-write the incoming buffer. + + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegclock.h: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), + (normal_seek), (gst_mpeg_demux_handle_src_event): + * gst/mpegstream/gstmpegdemux.h: + * gst/mpegstream/gstmpegpacketize.h: + * gst/mpegstream/gstmpegparse.c: + (gst_mpeg_parse_update_streaminfo), (gst_mpeg_parse_reset), + (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead), + (gst_mpeg_parse_loop), (gst_mpeg_parse_get_rate), + (gst_mpeg_parse_convert_src), (gst_mpeg_parse_handle_src_query), + (gst_mpeg_parse_handle_src_event), (gst_mpeg_parse_change_state): + * gst/mpegstream/gstmpegparse.h: + * gst/mpegstream/gstrfc2250enc.h: + Various changes to the way time is computed that make seeking and + total time estimation much better here. + Use G_BEGIN/END_DECLS instead of __cplusplus + + * gst/videocrop/gstvideocrop.c: (gst_video_crop_chain): + Use gst_buffer_stamp instead of only copying the TIMESTAMP + +2005-02-01 Ronald S. Bultje + + * gst/subparse/gstsubparse.c: + Fix OSX buildbot. + +2005-01-31 Tim-Philipp Müller + + * ext/theora/theoraenc.c: (theora_buffer_from_packet), + (theora_enc_chain), (theora_enc_change_state): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_init), + (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_chain), + (gst_vorbisenc_change_state): + * ext/vorbis/vorbisenc.h: + Set granulepos and timestamp correctly for streams not + starting at 0, taking into account the initial delay. + +2005-01-31 Tim-Philipp Müller + + * gst/mpegstream/gstdvddemux.c: + Add audio/x-dts to audio pad template caps + +2005-01-30 David Schleef + + * ext/polyp/polypsink.c: (gst_polypsink_base_init), + (create_context), (gst_polypsink_link): Fix silly endianness + bug. Add some debugging. Remove float from caps; it doesn't + work. Attempt to get remote audio working. + +2005-01-29 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): + Add 3IV2 fourcc. + +2005-01-29 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream), (swap_line), + (gst_avi_demux_invert), (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data): + * gst/avi/gstavidemux.h: + Invert DIB images. Fixes #132341. + +2005-01-29 Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_chain): + D'oh, reference the palette data, not the palette structure. + Fixes color distortion in #132341. + +2005-01-29 Ronald S. Bultje + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_link): + PAR can be non-fixed when not provided as argument (#162626). + +2005-01-29 David Moore + + Reviewed by: Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_header): + Re-apply patch from #142272 that allows non-seekable sources, + re-proposed by Daniel Drake . + +2005-01-29 Ronald S. Bultje + + * gst/rtp/gstrtpgsmenc.c: (gst_rtpgsmenc_init): + Use the src template for creating the src pad (#162330). + +2005-01-29 Ronald S. Bultje + + * configure.ac: + * ext/musepack/Makefile.am: + * ext/musepack/gstmusepackdec.c: (gst_musepackdec_class_init), + (gst_musepackdec_init), (gst_musepackdec_dispose), + (gst_musepackdec_src_query), (gst_musepackdec_src_convert), + (gst_musepack_stream_init), (gst_musepackdec_loop), + (gst_musepackdec_change_state): + * ext/musepack/gstmusepackdec.cpp: + * ext/musepack/gstmusepackdec.h: + * ext/musepack/gstmusepackreader.c: (gst_musepack_reader_peek), + (gst_musepack_reader_read), (gst_musepack_reader_seek), + (gst_musepack_reader_tell), (gst_musepack_reader_get_size), + (gst_musepack_reader_canseek), (gst_musepack_init_reader): + * ext/musepack/gstmusepackreader.cpp: + * ext/musepack/gstmusepackreader.h: + Update to 1.1 API (#165446). + +2005-01-28 Ronald S. Bultje + + * ext/Makefile.am: + Unbreak buildbot. + +2005-01-28 Andy Wingo + + * ext/dv/gstdvdec.c: Change the pixel aspect ratio of dvdec output + to reflect a different dubious internet source. Add a reference + and some commentary. + +2005-01-28 Ronald S. Bultje + + * gst/playback/gststreamselector.c: (gst_stream_selector_init), + (gst_stream_selector_get_caps), (gst_stream_selector_chain): + * gst/playback/gststreamselector.h: + Be more selective when we're redoing caps negotiation from + within the chain function on a stream change. + +2005-01-28 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/amrnb/Makefile.am: + * ext/amrnb/amrnb.c: (plugin_init): + * ext/amrnb/amrnbdec.c: (gst_amrnbdec_get_type), + (gst_amrnbdec_base_init), (gst_amrnbdec_class_init), + (gst_amrnbdec_init), (gst_amrnbdec_link), (gst_amrnbdec_chain), + (gst_amrnbdec_state_change): + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbparse.c: (gst_amrnbparse_get_type), + (gst_amrnbparse_base_init), (gst_amrnbparse_class_init), + (gst_amrnbparse_init), (gst_amrnbparse_formats), + (gst_amrnbparse_querytypes), (gst_amrnbparse_query), + (gst_amrnbparse_handle_event), (gst_amrnbparse_reserve), + (gst_amrnbparse_loop), (gst_amrnbparse_state_change): + * ext/amrnb/amrnbparse.h: + Add support for AMR-NB (mobile phone audio format; #155163, #163286). + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + Add AMR-NB/-WB raw formats. + * ext/alsa/gstalsa.c: (gst_alsa_link): + Keep valid time when changing format. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse_trak): + Add some more format-specific options (#140141, #143555, #155163). + +2005-01-28 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix logic error in timing of subtitle stream synchronization. + * gst/typefind/gsttypefindfunctions.c: (qt_type_find): + Add skip-chunk, which is found in kodak-camera streams. + +2005-01-27 Thomas Vander Stichele + + * po/LINGUAS: + * po/vi.po: + Adding Vietnamese translation (submitted by Clytie Siddall) + +2005-01-27 Ronald S. Bultje + + * gst/playback/gstdecodebin.c: (try_to_link_1): + Use realpad for signal. + +2005-01-27 Ronald S. Bultje + + * ext/mad/gstid3demuxbin.c: (gst_id3demux_bin_base_init): + Fix category so decodebin picks it up. + +2005-01-27 Ronald S. Bultje + + * ext/mad/Makefile.am: + * ext/mad/gstid3demuxbin.c: (gst_id3demux_bin_get_type), + (gst_id3demux_bin_base_init), (gst_id3demux_bin_class_init), + (gst_id3demux_bin_init), (gst_id3demux_bin_remove_pad), + (found_type), (gst_id3demux_bin_change_state): + * ext/mad/gstid3tag.c: (gst_id3_tag_add_src_pad), + (gst_id3_tag_init), (gst_id3_tag_handle_event), + (gst_id3_tag_src_link), (gst_id3_tag_chain), + (gst_id3_tag_change_state), (plugin_init): + * ext/mad/gstmad.h: + Add id3demuxbin (which is a simple bin consisting of id3demux + and typefind), take over rank from id3demux, remove typefind + code from id3demux. Makes all broken mp3s that I know of work, + and thereby fixes #152688. + +2005-01-27 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_src_event): + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): + Allow seeks on audio pad, make mad forward those (#164826). + * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): + Set duration (#165335). + +2005-01-27 Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), + (gst_asf_demux_commit_taglist), (gst_asf_demux_process_comment), + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_change_state), (gst_asf_demux_add_audio_stream), + (gst_asf_demux_add_video_stream), (gst_asf_demux_setup_pad): + * gst/asfdemux/gstasfdemux.h: + Improve metadata display, e.g. if the metadata comes before the + streams are loaded (which is perfectly valid). + +2005-01-27 Ronald S. Bultje + + * tools/gst-launch-ext-m.m: + Fix AVI/ASF pipelines (#165340). + +2005-01-26 Amaury Jacquot + * ext/cairo/gsttextoverlay.c: include string.h and strings.h to fix + build failure on amd64 + +2005-01-26 Tim-Philipp Müller + + * ext/mad/gstid3tag.c: (mad_id3_parse_latin1_string), + (mad_id3_parse_comment_frame), (gst_mad_id3_to_tag_list): + Check environment variables GST_ID3V2_TAG_ENCODING, + GST_ID3_TAG_ENCODING and GST_TAG_ENCODING for a colon-separated + list of character encodings to force interpretation of non-unicode + strings stored in an ID3v2 tag to a particular encoding. If none + is specified, try to use current locale's encoding, then fall back + to ISO-8859-1 (which will always succeed). (Resolves #149274) + * gst/tags/gstid3tag.c: (gst_tag_from_id3_tag), + (gst_tag_extract_id3v1_string), (gst_tag_list_new_from_id3v1): + Check environment variables GST_ID3V1_TAG_ENCODING, + GST_ID3_TAG_ENCODING and GST_TAG_ENCODING for a colon-separated + list of character encodings to use in case a string encountered + in an ID3v1 tag is not valid UTF-8 already. If no encoding is + specified, try to use the current locale's encoding, then fall + back to ISO-8859-1 (which will always succeed). + +2005-01-25 Benjamin Otte + + * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): + - on half framerate, compute the rate in advance so the comparisons + don't compare wrong values + - don't use mad_synth/frame_mute anymore, this mirrors mad_decoder + behaviour + - don't use mad_header_decode anymore, mad_frame_decode does that + automatically + - when getting rid of consumed bytes, reset the stream's skiplen + (fixes #163867) + +2005-01-26 Jan Schmidt + + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init) + Use 1/2 a second for default max_discont, as PES streams from DVB + seem to have larger spacings in the SCR. + Fix a typo. + +2005-01-25 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (group_commit): + Notify delayed stream-info availability. + +2005-01-26 Jan Schmidt + * ext/a52dec/gsta52dec.c: (gst_a52dec_push), + (gst_a52dec_handle_event), (gst_a52dec_chain): + Add some debug output. Check that a discont has a valid + time associated. + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), + (gst_alsa_sink_loop): + Ignore TAG events. A little extra debug for broken timestamps. + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop), + (dvdnavsrc_change_state): + Ensure we send a discont to engage the link before we send any + other events. + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init), + (dvdreadsrc_finalize), (_close), (_open), (_seek_title), + (_seek_chapter), (seek_sector), (dvdreadsrc_get), + (dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri): + Handle URI of the form dvd://title[,chapter[,angle]]. Currently only + dvd://title works in totem because typefinding sends a seek that ends + up going back to chapter 1 regardless. + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2dec/gstmpeg2dec.h: + Output correct timestamps and handle disconts. + * ext/ogg/gstoggdemux.c: (get_relative): + Small guard against a null dereference. + * ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize), + (gst_textoverlay_set_property): + Free memory when done. Don't call gst_event_filler_get_duration on + EOS events. Use GST_LOG and GST_WARNING instead of g_message and + g_warning. + * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init), + (draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink), + (gst_sw_srclink), (gst_smoothwave_chain): + Draw solid lines, prettier colours. + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): + Add a default palette that'll work for some movies. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init), + (gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont), + (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset): + * gst/mpegstream/gstdvddemux.h: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont), + (gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), + (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead): + * gst/mpegstream/gstmpegparse.h: + Use PTM/NAV events when for timestamp adjustment when connected to + dvdnavsrc. Don't use many discont events where one suffices. + * gst/playback/gstplaybasebin.c: (group_destroy), + (gen_preroll_element), (gst_play_base_bin_add_element): + * gst/playback/gstplaybasebin.h: + Make sure we remove subtitles from the same bin we put them in. + * gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip), + (gst_subparse_buffer_format_autodetect), + (gst_subparse_change_state): + Fix some memleaks and invalid accesses. + * gst/typefind/gsttypefindfunctions.c: (ogganx_type_find), + (oggskel_type_find), (cmml_type_find), (plugin_init): + Some typefind functions for Annodex v3.0 files + * gst/wavparse/gstwavparse.h: + GstRiffReadClass is the correct parent class. + +2005-01-25 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + Add extradata to huffyuv (fixes #165013). + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data): + Fix extradata extraction if it is in the chunk size. + +2005-01-25 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * gst/effectv/gstquark.c: (gst_quarktv_class_init), + (gst_quarktv_change_state), (gst_quarktv_dispose): + Memory free'ing location fix (#164708). + +2005-01-25 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (group_commit), + (gen_preroll_element), (probe_triggered), (gen_source_element), + (setup_source), (gst_play_base_bin_change_state), + (gst_play_base_bin_add_element): + Don't block for streams. + * gst/playback/gststreaminfo.c: (stream_info_change_state), + (gst_stream_info_set_mute): + Use gst_pad_set_active_recursive. + +2005-01-25 Andy Wingo + + * sys/v4l/gstv4lelement.c (gst_v4l_iface_supported): Fix compile + for #ifndef HAVE_XVIDEO. + +2005-01-24 Jeffrey C. Ollie + + reviewed by: Maciej Katafiasz + + * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), (gst_gsmdec_chain): + * ext/gsm/gstgsmdec.h: + * ext/gsm/gstgsmenc.c: (gst_gsmenc_init), (gst_gsmenc_chain): + * ext/gsm/gstgsmenc.h: + Fix rate to 8kHz as per spec, removes obscure errors when no rate + was given by property. Add proper buffer timestamps and offsets. + +2005-01-24 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data): + Audio can be <8000Hz. + +2005-01-22 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + Explicit state change to workaround refcount bugs. + +2005-01-22 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_write_tag), + (gst_avimux_riff_get_avi_header): + Fix... + +2005-01-19 Ronald S. Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_element_data), + (gst_riff_read_element_data): + * gst-libs/gst/riff/riff-read.h: + Add _peek version (req'ed in CDXA). + * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init), + (gst_cdxaparse_loop): + Fix parsing in playbin. + * gst/playback/gstdecodebin.c: (close_pad_link): + Ignore current_ pads, they cause major annoyance. + +2005-01-19 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + Safety guard. + +2005-01-19 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_write_tag): + Fix padding... + +2005-01-19 Ronald S. Bultje + + * gst/matroska/ebml-read.c: (gst_ebml_read_buffer): + Allow for 0-sized buffers. Fixes length query problems in + starwars.mkv from the testsuite. + +2005-01-19 Tim-Philipp Müller + + * gst/videobox/gstvideobox.c: (gst_video_box_copy_plane_i420), + (gst_video_box_i420), (gst_video_box_chain): + Fix row strides for I420 (fixes #163159) + +2005-01-19 Ronald S. Bultje + + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + MPEG2 has a useful rate property, so we can actually use that. + For MPEG-1, continue using the bytes/time properties. + +2005-01-19 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add intel-h263. + +2005-01-19 Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): + Fail if caps negotiation fails. Should fix #162184, and should + definately be in there regardless of it fixing the actual bug. + * gst/avi/gstavimux.c: (gst_avimux_get_type), (gst_avimux_init), + (gst_avimux_write_tag), (gst_avimux_riff_get_avi_header), + (gst_avimux_riff_get_avix_header), + (gst_avimux_riff_get_video_header), + (gst_avimux_riff_get_audio_header), (gst_avimux_write_index), + (gst_avimux_start_file), (gst_avimux_handle_event), + (gst_avimux_change_state): + * gst/avi/gstavimux.h: + Refactor structure writing to use GST_WRITE_UINT macros, add + metadata writing support. + +2005-01-18 Ronald S. Bultje + + * gst/playback/gststreaminfo.c: (gst_stream_info_dispose): + Elements may already be destroyed when this function is called. + +2005-01-18 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_header), (gst_qtdemux_handle_esds): + More memory leak fixes (#149162). + +2005-01-18 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_add_stream): + Fix two memleaks. + +2005-01-18 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): + Argh... + +2005-01-17 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): + Fix off-by-one bug. Fixes warnings during playback of sincity.mp4 + when fixating to six channels in Totem. + +2005-01-17 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: (get_next_cell_for): + Fix compile warnings on Solaris 10 buildbot + +2005-01-17 Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: (_read): + Don't read beyond the last cell in a chapter (fixes + invalid memory access) + +2005-01-17 Tim-Philipp Müller + + * ext/dvdread/stream_labels.c: + (dvdreadsrc_get_audio_stream_labels): + Use NULL for an empty GList instead of g_list_alloc(); fix + memory leaks; s/LCPM/LPCM/; use g_strdup_printf() instead + of GString (easier to bulk free later) + +2005-01-17 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps): + Fix BGRA32 caps (#164209). + +2005-01-17 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_caps_to_pixfmt): + alpha_mask can be RGBA/ABGR. Fixes #164265. + +2005-01-17 Francis Labonte + + Reviewed by: Ronald S. Bultje + + * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer), + (gst_mpeg2dec_alloc_buffer): + * ext/mpeg2dec/gstmpeg2dec.h: + Crop if decoding size is not the actual image size (#163676). + +2005-01-17 Steve Baker + + Reviewed by: Ronald S. Bultje + + * gst/typefind/gsttypefindfunctions.c: (aiff_type_find), + (svx_type_find), (sds_type_find), (ircam_type_find), (plugin_init): + Add libsndfile typefind functions (#163309). + +2005-01-17 Ronald S. Bultje + + * tools/gst-launch-ext-m.m: + Add .aac, fix .m1v/.m2v (#163891). + +2005-01-17 Ronald S. Bultje + + * ext/alsa/gstalsaclock.c: (gst_alsa_clock_wait): + Sanity check, don't wait endlessly since the clock might not + actually run at this point (which is a deadlock). Fixes #164069. + +2005-01-16 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (probe_triggered): + Of course, only pause if group is done... + +2005-01-16 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (probe_triggered): + Thread safety. + +2005-01-16 Jan Schmidt + + * ext/swfdec/gstswfdec.c: (gst_swfdec_change_state): + Don't return state change success when the parent + failed. + +2005-01-16 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_handle_event): + Free events (fix memleak in #162905). + +2005-01-15 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_caps_to_pixfmt): + Fix for depth = 15. Fixes #161675. + +2005-01-14 Ronald S. Bultje + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): + Set FPS correctly, even for webcams and the like. + * sys/v4l/v4l_calls.c: (gst_v4l_set_chan_norm): + Don error on setting while capturing. + +2005-01-14 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + * gst/subparse/gstsubparse.c: (parse_mdvdsub): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): + I'm a bad boy. using /1001. to force C to do float division + and not integer division (as it did in my last commit) + Thanks to David I. Lehn for pointing this mistake. + +2005-01-14 Ronald S. Bultje + + * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): + Revert Johan´s 1.35->1.36 since it breaks compat. + +2005-01-14 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + * ext/libfame/gstlibfame.c: + * gst/subparse/gstsubparse.c: (parse_mdvdsub): + * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): + replace framerate aproximations by their real value + (24000/1001, 30000/1001, 60000/1001) + Finish fixing bug #164049 + +2005-01-13 Thomas Vander Stichele + + * ext/ogg/gstoggmux.c: + eos/bos debugging + * gst/tcp/gstmultifdsink.c: + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcp.h: + * gst/tcp/gsttcpclientsink.c: + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpserversink.c: + * gst/tcp/gsttcpserversrc.c: + improve reusability of elements after state changes and errors + make multifdsink throw away streamheaders when receiving new ones + +2005-01-13 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_rates_probe): + Fix for if items are already in list... + +2005-01-12 Benjamin Otte + + * gst/adder/gstadder.c: (gst_adder_loop): + fix adder a bit so it doesn't screw up with events as much anymore + +2005-01-12 Jan Schmidt + + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_link), + (pixbufscale_scale), (gst_pixbufscale_chain): + * ext/gdk_pixbuf/pixbufscale.h: + Incorporate changes from Tim-Philipp Mueller + to ensure rowstrides are calculated the same way as + ffmpegcolorspace + Use gst_buffer_stamp instead of copying TIMESTAMP manually, so + that we pick up duration and offset also. + +2005-01-11 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_class_init), + (gst_avimux_pad_unlink), (gst_avimux_release_pad): + Reusability fixes. + +2005-01-11 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_update), + (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), + (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), + (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): + Update flags when requested. + +2005-01-11 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_rates_probe): + Fix dmix. + +2005-01-11 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (gst_play_base_bin_init), (gst_play_base_bin_dispose), + (probe_triggered), (new_decoded_pad), (gen_source_element), + (gst_play_base_bin_set_property), (gst_play_base_bin_get_property): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_class_init), + (gst_play_bin_init), (group_switch), (remove_sinks), (setup_sinks), + (gst_play_bin_change_state): + Implement group-switch signal for use in apps to clear metadata + cache, clean up subtitle, add suburi property instead of # hack, + some error-out fixes. + +2005-01-11 Ronald S. Bultje + + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + Debug. + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_grab_frame): + If we got a state change in the _get handler, don't return success. + +2005-01-10 Stephane LOEUILLET + + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_my_output_message), + (gst_jpegdec_my_emit_message), (gst_jpegdec_init): + Make jpegdec quiet on MJPEG decoding + * gst/asfdemux/README: + Fix mimetypes for MJPEG and H263 + +2005-01-10 Ronald S. Bultje + + * ext/theora/theoradec.c: (theora_dec_chain): + Fix broken code generation by gcc by swapping arguments. + * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): + Fix \n in debug. + +2005-01-10 Stephane LOEUILLET + + * TODO: + delete this file, it is by far outdated + * ext/alsa/gstalsa.1: remove + * ext/alsa/gstalsa.c: (add_rates), (add_channels), (gst_alsa_caps), + (gst_alsa_check_sample_rates), (gst_alsa_rates_probe), + (gst_alsa_get_caps): + Add HW probing for supported sample rates. Fixes #161704 + +2005-01-10 Ronald S. Bultje + + * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): + Don't crash, biatch! :). + +2005-01-10 Ronald S. Bultje + + * ext/musepack/gstmusepackreader.cpp: + * gst/apetag/apedemux.c: (gst_ape_demux_stream_data): + Some work on tags - still doesn't work in playbin... + * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): + Handle events... + +2005-01-10 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): + Also shove tags on kid pads. + +2005-01-10 Ronald S. Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_use_event): + Don't bail on unknown events. + * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): + Don't crash on events before negotiation. + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + Send tags on pads, too. + * gst/playback/gststreamselector.c: + (gst_stream_selector_request_new_pad): + Forward events on first pad if no input was selected yet. + +2005-01-10 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (setup_substreams): + Don't disable streamtype if the stream doesn't exist, since + then playing a video after audio will disable both and nothing + will happen. Fixes the testsuite. + +2005-01-10 Ronald S. Bultje + + * sys/v4l/gstv4lxoverlay.c: (gst_v4l_xoverlay_interface_init), + (gst_v4l_xoverlay_set_xwindow_id): + * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_interface_init), + (gst_v4l2_xoverlay_set_xwindow_id): + Add debug categories, fix overlay disabling. + +2005-01-10 Stephane LOEUILLET + + * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_get_caps): + * ext/alsa/gstalsa.h: + Add HW probing for period_count/size and buffer_size MIX/MAX + Adjust default/user defined value if out of bounds + Should fix bug #162024 + +2005-01-09 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event): + Fix warning (#161191). + +2005-01-09 Stephane LOEUILLET + + * ext/dvdread/stream_labels.c: + (dvdreadsrc_get_audio_stream_labels): + Fix warning (init the good variable in switch default) + +2005-01-09 Koop Mast + + Reviewed by: Ronald S. Bultje + + * gst/tta/gstttaparse.c: (gst_tta_src_event): + Fix gcc-2.95 compile (#163485). + +2005-01-09 Ronald S. Bultje + + * configure.ac: + * ext/flac/gstflacenc.c: (gst_flacenc_init), + (gst_flacenc_seek_callback), (gst_flacenc_write_callback), + (gst_flacenc_tell_callback), (gst_flacenc_chain), + (gst_flacenc_change_state): + * ext/flac/gstflacenc.h: + Update for API change in flac-1.1.1. Update requirement in + configure.ac. Fixes #162974. + +2005-01-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (group_destroy): + Remove hack to get rid of assert and get rid of unlinked + signals properly. + +2005-01-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (setup_source): + Set source to NULL so that resources are free'ed. Fixes issues + with playback of CDDA and similar device-accessing things. + +2005-01-09 Ronald S. Bultje + + * testsuite/embed/Makefile.am: + test->noinst, fix make test in buildbot. + +2005-01-09 Stephane LOEUILLET + + * ext/dvdread/stream_labels.c: new file + * ext/dvdread/stream_labels.h: new file + * ext/dvdread/Makefile.am: + * ext/dvdread/dvdreadsrc.c: (_seek_title): + Extract audio stream label from DVD IFO files. + It only dump them on the console for now, still have to + make playbin aware of them. + +2005-01-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (setup_source): + Fix hanging subs. + +2005-01-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), + (gen_preroll_element), (remove_groups), (setup_subtitle), + (gen_source_element), (setup_source): + * gst/playback/gstplaybasebin.h: + Multiple .sub files is just a stupid idea... Fix some threading + mistakes. Interestingly, external .sub files cause playbin to + hang, I don't know why... Parsing fixes contributed by François + Kooman . + +2005-01-09 Ronald S. Bultje + + * testsuite/embed/Makefile.am: + Fix buildbot. + +2005-01-09 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), + (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), + (gst_pngenc_set_property): + * ext/libpng/gstpngenc.h: + Add compression level property (#163323). + +2005-01-09 Ronald S. Bultje + + * configure.ac: + * examples/capsfilter/capsfilter1.c: (main): + * examples/seeking/spider_seek.c: (make_spider_pipeline): + * ext/dvdread/Makefile.am: + * ext/dvdread/demo-play: + * ext/dvdread/demo-play.c: + * gconf/gstreamer.schemas.in: + * gst-libs/gst/gconf/gconf.c: + * sys/v4l/TODO: + * testsuite/Makefile.am: + * testsuite/embed/Makefile.am: + * testsuite/embed/embed.c: (cb_expose), (main): + Remove all references to xvideosink, fix examples (#140845). + * gst/playback/gstplaybasebin.c: (group_destroy): + Apparently, disposal does not unlink - so do explicitely. + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + Add debug. + +2005-01-09 Maciej Katafiasz + + * README: fix PKG_CONFIG_PATH instructions, what was there + previously was breaking default search path, not nice. + Fixes #163358 + +2005-01-09 Ronald S. Bultje + + * gst/audioscale/gstaudioscale.c: (gst_audioscale_init), + (gst_audioscale_chain): + %#^@^#@^@#^#@^#@^@#^@#^@#^@#^#@^#@^#@^@#^#@ fix seeking + when resampling - how the ^@$^!@^! is this possible?!? + +2005-01-09 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_change_state): + Reset variables on READY. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_request_new_pad), + (gst_matroska_mux_loop): + Require data before writing header. + +2005-01-09 Francis Labonte + + Reviewed by: Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_chain): + Don't call mad_stream_sync() directly after recovering sync. + Fixes #151661. + +2005-01-09 Martin Eikermann + + Reviewed by: Ronald S. Bultje + + * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init), + (snapshot_handler), (gst_snapshot_sinkconnect), + (gst_snapshot_chain): + Allocate resources when required, fix recursive signal emission + and fix caps. Fixes #161667. + +2005-01-09 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * ext/libpng/gstpngdec.c: (gst_pngdec_src_getcaps), + (gst_pngdec_chain): + Handle only 8-bppc (bits-per-pixel-component) images, better + error handling and correct strides. Fixes #163177. + * ext/libpng/gstpngenc.c: (gst_pngenc_sinklink), + (gst_pngenc_chain): + Better error handling. Fixes #163348. + +2005-01-09 Ronald S. Bultje + + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_get_type), + (dvdnavsrc_uri_get_type), (dvdnavsrc_uri_get_protocols), + (dvdnavsrc_uri_get_uri), (dvdnavsrc_uri_set_uri), + (dvdnavsrc_uri_handler_init): + Add DVD-nav URI (dvdnav://) for Totem testing purposes. + * gst/playback/gstplaybasebin.c: (gen_source_element): + Add MMS to streaming URIs. + +2005-01-09 Ronald S. Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event): + * sys/xvimage/xvimagesink.c: + (gst_xvimagesink_navigation_send_event): + Check for pad availability before sending event. + +2005-01-08 Ronald S. Bultje + + * gst-plugins.spec.in: + Add subparse. + +2005-01-08 Ronald S. Bultje + + * configure.ac: + Since we use functions from CVS, up requirement. + +2005-01-08 Ronald S. Bultje + + * gst/playback/Makefile.am: + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (group_destroy), (group_commit), (group_is_muted), + (gen_preroll_element), (add_stream), (unknown_type), + (probe_triggered), (preroll_unlinked), (mute_stream), + (silence_stream), (new_decoded_pad), (setup_substreams), + (setup_source), (get_active_source), (mute_group_type), + (muted_group_change_state), (set_active_source), + (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), + (play_base_eos), (gst_play_base_bin_change_state): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (add_sink), (setup_sinks): + * gst/playback/gststreaminfo.c: (gst_stream_info_class_init), + (gst_stream_info_dispose), (stream_info_mute_pad), + (stream_info_change_state), (gst_stream_info_set_mute): + * gst/playback/gststreamselector.c: (gst_stream_selector_get_type), + (gst_stream_selector_base_init), (gst_stream_selector_class_init), + (gst_stream_selector_init), (gst_stream_selector_dispose), + (gst_stream_selector_get_linked_pad), + (gst_stream_selector_get_caps), (gst_stream_selector_link), + (gst_stream_selector_get_linked_pads), + (gst_stream_selector_request_new_pad), (gst_stream_selector_chain): + * gst/playback/gststreamselector.h: + Adding stream selection support plus required properties for + applications to use this. Fully fixes #100931. + +2005-01-08 Benjamin Otte + + * gst/games/gstpuzzle.c: (nav_event_handler): + - handle nav events differently: forward every event no matter if it + was handled or not. + - translate events + You can now cheat by using navigationtest ! puzzle and moving the + mouse close to the edge of a tile. ;) + +2005-01-08 Ronald S. Bultje + + * configure.ac: + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_new): + * ext/ogg/gstogmparse.c: (gst_ogm_text_parse_get_type), + (gst_ogm_text_parse_base_init), (gst_ogm_text_parse_init), + (gst_ogm_parse_get_sink_querytypes), (gst_ogm_parse_sink_convert), + (gst_ogm_parse_sink_query), (gst_ogm_parse_chain), + (gst_ogm_parse_plugin_init): + * ext/pango/gsttextoverlay.c: (gst_textoverlay_linkedpads), + (gst_textoverlay_link), (gst_textoverlay_getcaps), + (gst_textoverlay_event), (gst_textoverlay_video_chain), + (gst_textoverlay_loop), (gst_textoverlay_init), (plugin_init): + * ext/pango/gsttextoverlay.h: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_handle_seek_event), + (gst_matroska_demux_sync_streams), + (gst_matroska_demux_parse_blockgroup), + (gst_matroska_demux_subtitle_caps), + (gst_matroska_demux_plugin_init): + * gst/matroska/matroska-ids.h: + * gst/playback/gstdecodebin.c: (close_pad_link): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), + (gen_preroll_element), (remove_groups), (add_stream), + (new_decoded_pad), (setup_subtitles), (gen_source_element), + (setup_source): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gen_text_element), (setup_sinks): + * gst/subparse/Makefile.am: + * gst/subparse/gstsubparse.c: (gst_subparse_get_type), + (gst_subparse_base_init), (gst_subparse_class_init), + (gst_subparse_init), (gst_subparse_formats), + (gst_subparse_eventmask), (gst_subparse_event), + (gst_subparse_handle_event), (convert_encoding), (get_next_line), + (parse_mdvdsub), (parse_mdvdsub_init), (parse_subrip), + (parse_subrip_deinit), (parse_subrip_init), (parse_mpsub), + (parse_mpsub_deinit), (parse_mpsub_init), + (gst_subparse_buffer_format_autodetect), + (gst_subparse_format_autodetect), (gst_subparse_loop), + (gst_subparse_change_state), (gst_subparse_type_find), + (plugin_init): + * gst/subparse/gstsubparse.h: + * gst/typefind/gsttypefindfunctions.c: (ogmtext_type_find), + (plugin_init): + Add subtitle support, .sub parser (supports SRT and MPsub), + OGM text support, Matroska UTF-8 text support, deadlock fixes + all over the place, subtitle awareness in decodebin/playbin + and some fixes to textoverlay to handle subtitles in a stream + correctly. Fixes #100931. + +2005-01-08 Ronald S. Bultje + + * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): + Check for pad availability before doing a query on it. + +2005-01-08 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + really fix bpp24/32 dvdec caps (classic rgba indeed) + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + don't send text tags if they are empty (bis repetita) + +2005-01-08 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + remove unneeded comment from dvdec + (related to DV 4CC codes in AVI files) + moved them in gstreamer/docs/random/mimetypes + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + don't send text tags if they are empty + fix mem leak on error path + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/imgconvert.c: (img_get_alpha_info): + * gst/ffmpegcolorspace/imgconvert_template.h: + adds BGR32 and BGRA32 to ffmpegcolorspace + (still bad colors, fixing it on next commit) + helps with dvdec outputing BGR32 + +2005-01-08 Stephane LOEUILLET + + * ext/dv/gstdvdec.c: + Fix audio caps i just broke (missing ',') + * gst/matroska/matroska-mux.c: (gst_matroska_mux_get_type), + (gst_matroska_mux_reset): + Fix typo + add FIXME about old "x-gst-metadata" crap + +2005-01-07 Stephane LOEUILLET + + * ext/dv/demo-play.c: (main): + xvideosink -> xvimagesink + * ext/dv/gstdvdec.c: + change rgb 32/32 caps to 24/32 (no alpha) + change nb of channels to be a list (2 or 4, not 2) + change sample rate to be a list (32, 44.1, 48 kHz) not a range + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + Add 'date/year' to extracted metadata list + +2005-01-07 Ronald S. Bultje + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): + The return value of fixate_to does not imply that the requested + value was set, so don't assume. + +2005-01-07 Gergely Nagy + + Reviewed by: Ronald S. Bultje + + * ext/libpng/gstpngdec.c: + * ext/libpng/gstpngenc.c: (gst_pngenc_base_init), + (gst_pngenc_sinklink), (gst_pngenc_init), (gst_pngenc_chain): + * ext/libpng/gstpngenc.h: + Alpha support (encoder; #163161), mime fixage. + +2005-01-07 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * ext/faac/gstfaac.c: (gst_faac_outputformat_get_type), + (gst_faac_class_init), (gst_faac_init), (gst_faac_srcconnect), + (gst_faac_set_property), (gst_faac_get_property): + * ext/faac/gstfaac.h: + Allow for ADTS output (#153434). + +2005-01-07 Ronald S. Bultje + + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): + Fix against template (#150576). + +2005-01-06 Benjamin Otte + + * gst/games/gstpuzzle.c: (draw_puzzle): + don't draw a puzzle if either width or height of tiles would be 0. + +2005-01-06 Benjamin Otte + + * gst/games/gstpuzzle.c: (gst_puzzle_get_type), + (gst_puzzle_class_init), (gst_puzzle_finalize): + no memleaks, please + (gst_puzzle_create), (gst_puzzle_init), + (gst_puzzle_set_property), (gst_puzzle_setup): + change initialization code around so we don't reshuffle on resize + (draw_puzzle): + fix another stupid typo + +2005-01-06 Benjamin Otte + + * gst/games/gstvideoimage.c: (copy_hline_YUY2): + fix stupid typo that borked copying on YUY2 + +2005-01-06 Benjamin Otte + + * gst/games/gstpuzzle.c: (draw_puzzle): + fix edges when image sizes aren't multiples of tile sizes + +2005-01-06 Benjamin Otte + + * gst/games/gstpuzzle.c: (gst_puzzle_base_init): + make RGB endianness work correctly + (gst_puzzle_show), (gst_puzzle_swap), (gst_puzzle_move): + refactor and fix race with initial shuffling + (nav_event_handler): + allow using the mouse to puzzle + (draw_puzzle): + insist on tiles having width and height as multiples of 4 to get + clean YUV image handling + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_handle_xevents), (gst_xvimagesink_buffer_alloc): + s/DEBUG/LOG/ for common messages + (gst_xvimagesink_navigation_send_event): + fix mouse event translation to not include screen PAR + * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event): + fix mouse event translation to actually work + +2005-01-06 Stephane LOEUILLET + + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + Extract TrackNumber metadata + clean up code + * gst/games/gstvideoimage.c: (gst_video_image_draw_rectangle): + Hope this is the good fix (var used unitialised) + +2005-01-06 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_chain): + Only increment timestamp if it's valid. Fixes raw AAC streams. + +2005-01-06 Benjamin Otte + + * configure.ac: + * gst/games/Makefile.am: + * gst/games/gstpuzzle.c: + add a puzzle game with... + * gst/games/gstvideoimage.c: + * gst/games/gstvideoimage.h: + ... full colorspace support (that includes YUV9 and RGB16)) stolen + from videotestsrc and made into something that would be a nice + library for a lot of other plugins. + +2005-01-06 Stephane LOEUILLET + + * configure.ac: + don't compile faad plugin if a RC of 2.0 is found + Fixes #155346 (and FC1 buildbot) + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc): + try to make Solaris compiler happier + +2005-01-06 Paul Jack + + Reviewed by: Ronald S. Bultje + + * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): + Fix segfault (#161667). + +2005-01-05 Ronald S. Bultje + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): + Fix framerate reporting. + +2005-01-05 Stephane LOEUILLET + + * gst-libs/gst/riff/riff-ids.h: + * gst/wavenc/riff.h: + Add AMR (VBR and CBR) ids to riff.h audio codec list + * gst/asfdemux/gstasfdemux.c: + (gst_asf_demux_process_ext_content_desc), + (gst_asf_demux_process_object): + Retrieve more tags from ASF files (Genre, AlbumTitle, Artist) + +2005-01-05 Martin Eikermann + + Reviewed by: Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), + (gst_dvd_demux_handle_discont): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), + (gst_mpeg_demux_handle_discont): + Recreate pads on new-media (#160730). + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_new_pad): + Send discont even if manager changes timestamps (#161929). + +2005-01-05 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16): + Fix invalid memory access (#159211). + +2005-01-05 Ronald S. Bultje + + * examples/gstplay/player.c: (main): + Don't iterate. + * examples/seeking/seek.c: (fixate), (make_playerbin_pipeline): + Add visualizations. + * ext/a52dec/gsta52dec.c: (gst_a52dec_push), + (gst_a52dec_handle_frame): + Set duration. + * ext/dvdnav/gst-dvd: + Add audioconvert. Fixes #161325. + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get): + Explicitely case to gint64. Possible valgrind error. + * gst-libs/gst/play/play.c: (caps_set), (setup_size), + (gst_play_tick_callback), (gst_play_change_state), + (gst_play_dispose), (gst_play_init), (gst_play_class_init), + (gst_play_set_location), (gst_play_get_location), + (gst_play_seek_to_time), (gst_play_set_data_src), + (gst_play_set_video_sink), (gst_play_set_audio_sink), + (gst_play_set_visualization), (gst_play_connect_visualization), + (gst_play_get_framerate), (gst_play_get_all_by_interface), + (gst_play_new): + Use playbin. Fixes #139749 and #147744. + * gst/apetag/apedemux.c: (gst_ape_demux_parse_tags): + Add genre tag. + * gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type), + (audioscale_get_type), (gst_audioscale_base_init), + (gst_audioscale_class_init), (gst_audioscale_expand_caps), + (gst_audioscale_getcaps), (gst_audioscale_fixate), + (gst_audioscale_link), (gst_audioscale_get_buffer), + (gst_audioscale_decrease_rate), (gst_audioscale_increase_rate), + (gst_audioscale_init), (gst_audioscale_dispose), + (gst_audioscale_chain), (gst_audioscale_set_property), + (gst_audioscale_get_property), (plugin_init): + Indent properly. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private): + Fix LPCM. + * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta), + (qtdemux_tag_add_str), (qtdemux_tag_add_num), + (qtdemux_tag_add_gnre), (qtdemux_video_caps): + Add more metadata (fixes #162656). + +2005-01-05 Thomas Vander Stichele + + * configure.ac: + back to cvs + +=== release 0.8.7 === + +2005-01-05 Thomas Vander Stichele + + * NEWS: + * RELEASE: + * configure.ac: + releasing 0.8.7, "Hyperspace" + +2005-01-05 Thomas Vander Stichele + + patch by: Tim-Philipp Müller + + * gst/playback/gstplaybasebin.c: + Fix for #162924 - free caps after use, not before + +2005-01-04 Thomas Vander Stichele + + patch by: Ronald Bultje + + * gst/playback/gstplaybasebin.c: + * gst/wavparse/gstwavparse.c: + Fix for #154773 - fixes playback of small .wav files + +2005-01-03 Thomas Vander Stichele + + patch by: Ronald Bultje + + * gst/audioscale/gstaudioscale.c: + Fix for #162819 - make audioscale reusable + Fixes playback of more than one file with playbin/totem + +2004-12-29 Thomas Vander Stichele + + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + * gst/ffmpegcolorspace/imgconvert.c: + clean up the mess that made me cry and avoid needless duplication + +2004-12-29 Thomas Vander Stichele + + * gst/ffmpegcolorspace/imgconvert.c: + give some indication of why we're segfaulting + +2004-12-29 Ronald S. Bultje + + * configure.ac: + Fix indentation, fix v4l2 plugin detection. + * ext/Makefile.am: + Fix libmms location (Maciej, use diff -u!). + * ext/alsa/gstalsa.c: (gst_alsa_init): + Initialize caps cache to NULL. + * gst/playback/gstplaybin.c: (gst_play_bin_change_state): + Only change state on audiosink if it exists. + +2004-12-28 Maciej Katafiasz + + * gst/matroska/matroska-demux.c: + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-demux.h: + Fix Vorbis streams failing to decode in some files, where cluster_time + isn't 0, because then it doesn't send codec_priv before actual data. + Remove time-based test and replace it with marker set on beginning of + new stream + +2004-12-28 David Schleef + + Merge patch from Ronald fixing problems with streaming + text. + * ext/cairo/gstcairo.c: (plugin_init): + * ext/cairo/gsttextoverlay.c: (gst_textoverlay_render_text), + (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), + (gst_textoverlay_video_chain), (gst_textoverlay_loop), + (gst_textoverlay_font_init), (gst_textoverlay_init), + (gst_textoverlay_set_property): + * ext/cairo/gsttextoverlay.h: + +2004-12-27 David Schleef + + * ext/cairo/gsttextoverlay.c: (gst_textoverlay_render_text), + (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), + (gst_textoverlay_video_chain), (gst_textoverlay_loop), + (gst_textoverlay_font_init), (gst_textoverlay_init), + (gst_textoverlay_set_property): Improvements to actually + render text as white on black outline on video, including + font selection and horizontal/vertical alignment. (Ronald's + christmas present) + * ext/cairo/gsttextoverlay.h: + +2004-12-26 Stephane Loeuillet + + * ext/ogg/gstogg.c: + * ext/ogg/gstogmparse.c: + fix ogm[audio/video]parse plugin registration + (riff won't load if bytestream is already loaded) + +2004-12-24 Thomas Vander Stichele + + * gst/audioconvert/gstchannelmix.c: + fix for GLIB < 2.4 + +2004-12-24 Thomas Vander Stichele + + * Makefile.am: + * configure.ac: + disable docs again until it actually passes make distcheck. + +2004-12-24 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_type_get), (qtdemux_audio_caps): + * gst/typefind/gsttypefindfunctions.c: (q3gp_type_find), + (plugin_init): + Add 3GP (variables name Q3GP because they can't start with a + number). Add samr audio fourcc (used in .3gp files), decoder + is work in progress. Also do a GST_WARNING instead of ERROR + in case of unknown nodes, to decrease output. + +2004-12-24 Thomas Vander Stichele + + * Makefile.am: + really fix dist + +2004-12-23 Thomas Vander Stichele + + * configure.ac: + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.h: + Fixes #158382. Make speex plugin compatible with both 1.0 and 1.1. + Fix detection code in configure.ac + +2004-12-23 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Save position, so that queries give proper return values. Don't + know how this could ever have worked before... + +2004-12-23 Thomas Vander Stichele + + * configure.ac: + Put additional LAME check inside the conditional. Fixes #152339 + +2004-12-23 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_stream_scan): + Add some more debug. Fix logic error when setting movi offset + while reading index. + +2004-12-23 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_stream_scan), (gst_avi_demux_handle_seek), + (gst_avi_demux_process_next_entry): + Add some debugging. Better detection of broken indexes and the + accompanying index recovery. No infinite loops on state changes + when we're still in our loopfunction. + +2004-12-22 Ronald S. Bultje + + * configure.ac: + Fix up. + +2004-12-22 Archana Shah + + Reviewed by: Ronald S. Bultje + + * sys/sunaudio/gstsunmixer.c: (gst_sunaudiomixer_set_volume): + Normalizing the value before setting + (gst_sunaudiomixer_get_volume): + Normalizing the value after getting. Fixes bug# 161980 + +2004-12-22 Christian Fredrik Kalager Schaller + + * Makefile.am: Make sure docs gets disted + * docs/Makefile.am: Make sure all needed files get disted + * gst-plugins.spec.in: latest updates + +2004-12-22 Wim Taymans + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): + Revert patch 1.38 as clock distribution over schedulers does + not work correcly in the core yet. + +2004-12-21 Stephane Loeuillet + + * sys/oss/README: remove this file, which predates my birth + (and which content is by far outdated) + +2004-12-20 Stefan Kost + + * Makefile.am: + * configure.ac: + * docs/Makefile.am: + * docs/libs/Makefile.am: + * docs/libs/gst-plugins-libs-docs.sgml: + * docs/libs/gst-plugins-libs-sections.txt: + * docs/libs/tmpl/gstgconf.sgml: + * docs/upload.mak: + * docs/version.entities.in: + Added boilerplate gtk-doc files for plugin-libs documentation. + +2004-12-19 Stephane Loeuillet + + * gst/auparse/gstauparse.c: fix int and float audio caps + +2004-12-19 Ronald S. Bultje + + * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): + * sys/v4l2/gstv4l2element.c: (gst_v4l2_iface_supported): + g_assert() can be a macro, don't use #ifdef inside it. + +2004-12-19 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * gst/videorate/gstvideorate.c: (gst_videorate_blank_data), + (gst_videorate_init), (gst_videorate_chain), + (gst_videorate_change_state): + Event handling (fixes #159986). + +2004-12-19 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + Add BLZ0 (Blizzard's version of DivX) fourcc. + +2004-12-18 David Schleef + + * gst/tta/gstttadec.c: (gst_tta_dec_link): And yet another + portability fix. + +2004-12-18 David Schleef + + * gst/tta/ttadec.h: Disable some header code that isn't used + and clearly isn't portable. + +2004-12-18 David Schleef + + * gst/ffmpegcolorspace/imgconvert.c: (get_pix_fmt_info), + (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), + (avcodec_get_pix_fmt), (avpicture_layout), + (avcodec_get_pix_fmt_loss), (avg_bits_per_pixel), (img_copy), + (get_convert_table_entry), (img_convert), (img_get_alpha_info): + Fix code to not use GCC extensions (and c99 extensions that + Forte does not like.) + +2004-12-19 Tim-Philipp Müller + + Reviewed by: Ronald S. Bultje + + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_link), + (gst_deinterlace_chain): + Rowstride fixes. Fixes #161039. + * gst/videocrop/gstvideocrop.c: (gst_video_crop_init), + (gst_video_crop_get_property), (gst_video_crop_add_to_struct_val), + (gst_video_crop_getcaps), (gst_video_crop_link), + (gst_video_crop_i420), (gst_video_crop_chain), + (gst_video_crop_change_state): + Rework of negotiation. Actually works now. Fixes #158650. + +2004-12-18 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_ebmlnum_sint): + That was very stupid. + +2004-12-18 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix possible crasher. + +2004-12-18 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_ebmlnum_uint), + (gst_matroska_ebmlnum_sint), (gst_matroska_demux_parse_blockgroup): + Lace sizes can be zero. + +2004-12-18 Ronald S. Bultje + + * ext/musepack/gstmusepackdec.cpp: + Fetch error return values. Fixes #161624. + * gst/apetag/apedemux.c: (gst_ape_demux_stream_data): + Really EOS. + +2004-12-18 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index): + Work for truncated (unfinished download etc.) files. Fixes #160514. + +2004-12-18 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + Fix for integer overflow. Makes #156001 not crash. Probably masks + the real bug. + +2004-12-17 Ronald S. Bultje + + * gst/ac3parse/gstac3parse.c: (plugin_init): + Parsers never have ranks. Fixes #159651. + +2004-12-17 Benjamin Otte + + * gst/playback/gstdecodebin.c: (compare_ranks): + make sure the facotries are ordered the same every time even if they + have the same rank by using the name + * gst/playback/gstdecodebin.c: (find_compatibles): + make sure we don't add factories to the list twice + +2004-12-16 David Schleef + + * configure.ac: look for musepack headers as musepack/*.h + (fixes #159847) + * ext/musepack/gstmusepackdec.h: use + * ext/musepack/gstmusepackreader.h: same + +2004-12-17 Ronald S. Bultje + + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_auds_with_data): + Read extradata correctly (fixes #155879). + +2004-12-16 David Schleef + + * gst/audioscale/gstaudioscale.c: allow passthru of >2 channel + audio. does _not_ attempt or allow conversion unless channels + is 1 or 2. + +2004-12-16 Christian Fredrik Kalager Schaller + + * tools/gst-launch-ext-m.m: fix mpeg and vob pipelines + +2004-12-16 David Schleef + + * gst/audioscale/gstaudioscale.c: the resample library only + handles 1 or 2 channels. Change caps to compensate. + +2004-12-16 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: (aac_rate_idx), (aac_profile_idx), + (gst_matroska_demux_audio_caps): + Some MPEG-AAC hacks, because else it doesn't work... + +2004-12-16 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add h264. + +2004-12-16 Ronald S. Bultje + + * gst-libs/gst/audio/Makefile.am: + Try to fix buildbot. + +2004-12-16 Thomas Vander Stichele + + * gst/tcp/gstmultifdsink.c: + Clean up and uniformize debugging. + +2004-12-16 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), + (gst_dvd_demux_reset), (gst_dvd_demux_change_state): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_reset), + (gst_mpeg_demux_change_state): + Reset on ready. Fixes 160276. + +2004-12-16 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_pad_link): + Fix memleak (#154815). + +2004-12-16 James Bowes + + Reviewed by: Ronald S. Bultje + + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init), + (gst_musicbrainz_init), (gst_musicbrainz_chain), + (gst_musicbrainz_set_property), (gst_musicbrainz_get_property): + * ext/musicbrainz/gsttrm.h: + Add support for using a proxy server when getting a trm id from + the MusicBrainz database (#149613). + +2004-12-16 Christophe Fergeau + + Reviewed by: Ronald S. Bultje + + * gst/playback/gstdecodebin.c: (new_pad), (close_link): + * gst/playback/gstplaybasebin.c: (new_decoded_pad): + Fix memleaks (#157233). + +2004-12-16 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst-libs/gst/resample/resample.c: (gst_resample_close): + * gst-libs/gst/resample/resample.h: + * gst/audioscale/gstaudioscale.c: + Fix memleak (#159215). + +2004-12-16 Toni Willberg + + Reviewed by: Ronald S. Bultje + + * sys/oss/gstosselement.c: (gst_osselement_probe_caps): + * sys/oss/oss_probe.c: (main): + Check for mono/stereo support (similar to samplerate probing), + fixes #159433. Also add missing copyright header to oss_probe.c. + +2004-12-15 David Schleef + + * configure.ac: add audioresample and cairo plugins. Remove + HAVE_MMX stuff, because it's not used. + * ext/Makefile.am: same + * ext/audioresample/Makefile.am: You are not ready for an + audio resampling element based on audioresample. + * ext/audioresample/gstaudioresample.c: + * ext/audioresample/gstaudioresample.h: + * ext/cairo/Makefile.am: You are not ready for overlay elements + based on cairo. Don't look too closely, these elements kinda + suck right now. + * ext/cairo/gstcairo.c: new + * ext/cairo/gsttextoverlay.c: new + * ext/cairo/gsttextoverlay.h: new + * ext/cairo/gsttimeoverlay.c: new + * ext/cairo/gsttimeoverlay.h: new + * gst-libs/gst/media-info/media-info-priv.h: fix compile + problem with compilers that don't support variadic macros. + +2004-12-15 Balamurali Viswanathan + + Reviewed by: David Schleef + + * sys/sunaudio/gstsunaudio.c: (plugin_init): Apply patch from + Bala, registering sunaudiosrc (oops!), and cleaning up code a + bit. Also ran indent-gst. + * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_init), + (gst_sunaudiosrc_change_state), (gst_sunaudiosrc_get), + (gst_sunaudiosrc_setparams): + +2004-12-14 David Schleef + + * gst/festival/gstfestival.c: (gst_festival_chain): Set the + output rate to 16000. Should fix #160235. + +2004-12-14 Zaheer Abbas Merali + + * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find): + Add typefinding for mpeg2 pes streams + +2004-12-13 David Schleef + + * configure.ac: Applied patch from bug #143659, making default + sources and sinks OS-dependent (for Solaris), and added code + for OS/X. + * gconf/gstreamer.schemas.in: use OS-dependent sinks in gconf. + +2004-12-13 Stephane Loeuillet + + * gst-libs/gst/riff/riff-media.c: + forgot to add h2.64 to avidemux template caps + +2004-12-13 Stephane Loeuillet + + * gst/wavenc/riff.h: + * gst-libs/gst/riff/riff-media.c: + * gst-libs/gst/riff/riff-ids.h: + * gst/avi/gstavimux.c + add 4CC code for VideoSoft h264 in AVI (VSSH) + fixes bug #160655 + remove s323 from riff, it's quicktime specific :( + +2004-12-13 Stephane Loeuillet + + * gst/asfdemux/README + * gst/wavenc/riff.h + * gst-libs/gst/riff/riff-ids.h + * gst-libs/gst/riff/riff-media.c + * gst/qtdemux/qtdemux.c: + add new 4CC codes for h263 related codecs + fixes partially bug #155163 + +2004-12-12 Christian Fredrik Kalager Schaller + + * configure.ac: Update polyaudio requirement to 0.7 + * ext/polyp/polypsink.c: (create_stream): add patch from iain (158258) + +2004-12-11 Zaheer Abbas Merali + + * gst/interleave/deinterleave.c: + fix my name's spelling! :) + +2004-12-11 Stephane Loeuillet + + * AUTHORS ChangeLog + * gst/auparse/gstauparse.c + * gst/interleave/deinterleave.c + * gst/law/: + alaw-decode.c alaw-encode.c + mulaw-decode.c mulaw-encode.c + * gst/oneton/gstoneton.c + * sys/osxaudio/: + gstosxaudioelement.c gstosxaudiosink.c gstosxaudiosrc.c + * sys/osxvideo/: + cocoawindow.h cocoawindow.m + osxvideosink.h osxvideosink.m + + put the same mail address for Zaheer Abbas Merali everywhere + +2004-12-10 Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_loop): + Align by packetsize, and assert that we a packet available before + playing. The first makes webstreams work (they often include + trailing padding data in a packet), the second allows pausing a + ASF stream in totem without getting demux errors afterwards. + +2004-12-09 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (get_relative): + Check for non-NULL before accessing member (end-of-chain). + +2004-12-09 Ronald S. Bultje + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), + (cdparanoia_set_property), (cdparanoia_get_property): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init), + (dvdnavsrc_set_property), (dvdnavsrc_get_property): + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), + (dvdreadsrc_init), (dvdreadsrc_set_property), + (dvdreadsrc_get_property): + * sys/vcd/vcdsrc.c: (gst_vcdsrc_class_init), + (gst_vcdsrc_set_property), (gst_vcdsrc_get_property): + Synchronize property names where not yet the case. Devices are + now device=X, other versions are deprecated (but still exist). + Also use g_free() unconditionally. + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (setup_source), (gst_play_base_bin_get_property): + Expose source. + +2004-12-09 Thomas Vander Stichele + + * configure.ac: move GCONF macro outside conditional for the am + conditional. Fixes #160439 + +2004-12-08 David Schleef + + * tools/gst-visualise-m.m: Switch to elements that currently + exist. + +2004-12-08 Ronald S. Bultje + + * ext/ogg/gstogmparse.c: (gst_ogm_parse_chain): + We love wrong commas. + +2004-12-08 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_src_query): + Don't set DEFAULT, unsupported - makes length display incorrectly + in some cases. + +2004-12-07 Christian Fredrik Kalager Schaller + + * gst/monoscope/README: remove blurb about files being GPL + * gst/monoscope/gstmonoscope.c: Change license field to LGPL + * gst/monoscope/monoscope.c: Change license to BSD with explanation + monoscope is now effectively LGPL licensed + +2004-12-07 Christian Fredrik Kalager Schaller + + * gst/monoscope/README: Update information to be more correct + * gst/monoscope/convolve.c: Relicense to LGPL + * gst/monoscope/convolve.h: Relicense to LGPL + +2004-12-06 Arwed v. Merkatz + + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + set BUFFER_DURATION to correct values (mpeg1 audio frame length is fixed) + * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link): + set default_duration for mpeg1 audio + +2004-12-06 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_get_caps), (gst_alsa_close_audio): + * ext/alsa/gstalsa.h: + refactor big chunks of the core caps negotiation code to make it + a lot faster, because people claim it's really slow + (actually, just cache the getcaps when the device is opened) + +2004-12-06 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_init), + (gst_a52dec_handle_event), (gst_a52dec_update_streaminfo), + (gst_a52dec_handle_frame), (gst_a52dec_chain), + (gst_a52dec_change_state), (plugin_init): + * ext/a52dec/gsta52dec.h: + Do something useful with timestamps. Make chain-based (since + there's really no reason to be loopbased). + * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): + Update current_byte/frame correctly. + +2004-12-04 Ronald S. Bultje + + * gst/apetag/apedemux.c: (gst_ape_demux_parse_tags), + (gst_ape_demux_stream_init): + Forward tags, too. + +2004-12-04 Ronald S. Bultje + + * gst/apetag/apedemux.c: (gst_ape_demux_stream_init): + Let's make sure we're done typefinding when detecting tags. + +2004-12-03 Ronald S. Bultje + + * gst/matroska/ebml-read.c: (gst_ebml_read_class_init), + (gst_ebml_read_init), (gst_ebml_read_use_event), + (gst_ebml_read_element_id), (gst_ebml_peek_id), + (gst_ebml_read_seek), (gst_ebml_read_skip), + (gst_ebml_read_reserve), (gst_ebml_read_buffer), + (gst_ebml_read_master): + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_contents), + (gst_matroska_demux_loop_stream), (gst_matroska_demux_audio_caps): + Disgustingly evil hack for working around INTERRUPT events and + their extremely annoying habit of being a pain in the ass. We + simply peek a cluster before reading any of it. + +2004-12-03 Ronald S. Bultje + + * ext/musepack/gstmusepackdec.cpp: + There's also floating point libmusepacks. + +2004-12-03 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_chanpos_from_gst), + (gst_faad_chanpos_to_gst), (gst_faad_chain): + Set DURATION even if source buffer didn't. Also use increasing + timestamps. + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data): + Block_align can have larger values than 8192. + +2004-12-02 Ronald S. Bultje + + * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_link): + * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_link): + * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_link): + * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_link): + Fix caps. + +2004-12-01 Ronald S. Bultje + + * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names): + Fix logic bug. + +2004-12-01 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_type_find): + Yay, another one. + +2004-12-01 Ronald S. Bultje + + * ext/esd/esdsink.c: (gst_esdsink_chain): + Make error actually say something useful (fixes #156798). + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add Intel Video 5.0 fourcc (IV50). + +2004-12-01 Christophe Fergeau + + * ext/mad/gstmad.c: (mpg123_parse_xing_header): fix xing header + detection on mono and stereo mp3 files. + +2004-12-01 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + Don't crash on EMPTY caps (e.g. when the demuxer didn't recognize + the contained stream). + +2004-12-01 Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_srcconnect), (gst_faad_chain): + Oops, remove debug. + +2004-12-01 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst/law/alaw-decode.c: (alawdec_getcaps): + * gst/law/mulaw-decode.c: (mulawdec_getcaps): + Prevent warnings when negotiating caps (fixes #159338). + +2004-12-01 Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_chain): + Remove old leftover that shouldn't be there... + +2004-12-01 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_use_event): + Don't forward DISCONT events (fixes #159684). + +2004-12-01 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (remove_sinks), (setup_sinks): + Unlink manually since sometimes bin disposal (and therefore + pad unlinking) is delayed, which will cause a new media file + to not be able to start playing instantly. + +2004-11-29 Ronald S. Bultje + + * gst/playback/gststreaminfo.c: (stream_info_mute_pad): + On mute of an unlinked stream, check for pad availability so + we don't crash on unlinked pad. + +2004-11-29 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_massage_index): + Fix quite humiliating bug in omitting 0-sized index chunks but + forgetting to count them for timestamps. + +2004-11-29 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_loop): + Actually leave the loop if we failed to sync. Don't crash. + +2004-11-28 Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream), + (gst_dvd_demux_process_private): + * gst/mpegstream/gstdvddemux.h: + Fix crash (#159759). Doesn't work, though. :-(. + +2004-11-28 Benjamin Otte + + * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_mix): + more overwriting protection due to modifying channels one by one + instead of all at once + +2004-11-28 Ronald S. Bultje + + * gst/audioconvert/gstchannelmix.c: + (gst_audio_convert_fill_normalize): + Normalize using absolute values. + +2004-11-28 Julien MOUTTE + + * configure.ac: + * ext/Makefile.am: + * ext/directfb/Makefile.am: + * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_create), + (gst_directfbvideosink_get_pixel_format), + (gst_directfbvideosink_get_format_from_fourcc), + (gst_directfbvideosink_fixate), (gst_directfbvideosink_getcaps), + (gst_directfbvideosink_sink_link), + (gst_directfbvideosink_change_state), + (gst_directfbvideosink_chain), (gst_directfbvideosink_buffer_free), + (gst_directfbvideosink_buffer_alloc), + (gst_directfbvideosink_interface_supported), + (gst_directfbvideosink_interface_init), + (gst_directfbvideosink_navigation_send_event), + (gst_directfbvideosink_navigation_init), + (gst_directfbvideosink_set_property), + (gst_directfbvideosink_get_property), + (gst_directfbvideosink_finalize), (gst_directfbvideosink_init), + (gst_directfbvideosink_base_init), + (gst_directfbvideosink_class_init), + (gst_directfbvideosink_get_type), (plugin_init): + * ext/directfb/directfbvideosink.h: Adding a first version of + directfbvideosink. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): Initializing some + more. + +2004-11-28 Benjamin Otte + + * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_mix): + walk the samples backwards if out_channels > in_channels so we don't + overwrite data + +2004-11-28 Ronald S. Bultje + + * gst/audioconvert/Makefile.am: + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init), + (gst_audio_convert_link), (gst_audio_convert_change_state), + (gst_audio_convert_channels): + * gst/audioconvert/gstchannelmix.c: + (gst_audio_convert_unset_matrix), + (gst_audio_convert_fill_identical), + (gst_audio_convert_fill_compatible), + (gst_audio_convert_detect_pos), (gst_audio_convert_fill_one_other), + (gst_audio_convert_fill_others), + (gst_audio_convert_fill_normalize), + (gst_audio_convert_fill_matrix), (gst_audio_convert_setup_matrix), + (gst_audio_convert_passthrough), (gst_audio_convert_mix): + * gst/audioconvert/gstchannelmix.h: + Implement a channel mixer. + +2004-11-28 Martin Soto + + * ext/alsa/gstalsasink.c (gst_alsa_sink_loop): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsa.c (gst_alsa_set_clock): + Make alsasink actually honor gst_element_set_clock and use that + clock instead of its internal one. + +2004-11-27 Christophe Fergeau + + * gst/playback/gstplaybasebin.c: (setup_source): fixed a caps leak + (gst_play_base_bin_change_state): nullify source and decoder when + going from READY to NULL so that we don't try to do weird stuff with + them when going from NULL to READY + * gst/playback/gstplaybin.c: (gst_play_bin_init): use gst_object_unref + instead of g_object_unref + (gen_video_element), (gen_audio_element): more refcounting fixes, now + it should be correct + (gst_play_bin_change_state): don't call remove_sinks if we are + currently disposing the object + +2004-11-27 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_loop): + Don't forget bass if it's there. Else left channel is silent... + +2004-11-27 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_loop), + (gst_a52dec_change_state): + Don't do sample adjusting anymore, we use float audio now. + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): + Don't fixate to non-existing properties. + +2004-11-27 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), + (gst_a52dec_change_state): + Advertise that we can do surround sound. + +2004-11-27 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_reneg): + Add buffer-frames=0. + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get_type), + (dvdreadsrc_init), (dvdreadsrc_get_event_mask), + (dvdreadsrc_get_query_types), (dvdreadsrc_get_formats), + (dvdreadsrc_srcpad_event), (dvdreadsrc_srcpad_query), + (_seek_title), (_seek_chapter), (get_next_cell_for), (_read), + (seek_sector), (dvdreadsrc_get), (dvdreadsrc_open_file), + (dvdreadsrc_change_state), (dvdreadsrc_uri_get_type), + (dvdreadsrc_uri_get_protocols), (dvdreadsrc_uri_get_uri), + (dvdreadsrc_uri_set_uri), (dvdreadsrc_uri_handler_init): + * ext/dvdread/dvdreadsrc.h: + Add seeking, querying for bytes, sectors, title, angle and + chapter. Handle multiple chapters. Relicense to LGPL because + Billy agreed on that (thanks Billy!). + +2004-11-27 Christophe Fergeau + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_dispose): + call parent dispose method + +2004-11-27 Martin Soto + + * gst-libs/gst/audio/audioclock.c (gst_audio_clock_set_active) + (gst_audio_clock_get_internal_time): + Fix active <-> inactive transitions: ensure time value always + grows and avoid abrupt value changes. + +2004-11-27 Arwed v. Merkatz + + * configure.ac: + * gst/tta/Makefile.am: + * gst/tta/crc32.h: + * gst/tta/filters.h: + * gst/tta/gsttta.c: + * gst/tta/gstttadec.c: + * gst/tta/gstttadec.h: + * gst/tta/gstttaparse.c: + * gst/tta/gstttaparse.h: + * gst/tta/ttadec.h: + added TTA parser and decoder + +2004-11-26 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (probe_triggered), (check_queue), (buffer_underrun), + (buffer_running), (buffer_overrun), (gen_source_element), + (setup_source): + * gst/playback/gstplaybasebin.h: + Implement buffering. Needs some more work. + +2004-11-26 Ronald S. Bultje + + * ext/theora/theoradec.c: (theora_dec_chain): + Fix ilog mask range overflow. + +2004-11-26 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_get_caps): + Don't omit the last (which in case of dmix is the only :) ) + channel count. Don't set channels if <= 2. + +2004-11-26 Christophe Fergeau + + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): Removed 2 obsolete comments + +2004-11-26 Stephane Loeuillet + + * ext/vorbis/oggvorbisenc.c + * ext/vorbis/vorbisenc.c : + change description fields of those plugins to differentiate them + (pitivi show Encoders by description, they had the same one) + +2004-11-25 Christophe Fergeau + + Reviewed by: Ronald S. Bultje + + * gst/playback/gstplaybin.c: (gst_play_bin_dispose), + (gst_play_bin_set_property), (gen_video_element), + (gen_audio_element): + Refcounting fixes for provided audio-/videosinks. + +2004-11-25 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element), (setup_sinks), (gst_play_bin_change_state): + Don't reference all sinks, but only the video- and audiosinks. + The vis. element should be disposed when we're done with it. + We don't have any reason to keep it around. This fixes warnings + when reusing playbin for playing multiple audio files with + vis. enabled. Also release audio device on pause - idea stolen + from Rhythmbox. + +2004-11-25 Ronald S. Bultje + + * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push), + (gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init): + * ext/alsa/gstalsa.c: (gst_alsa_get_caps): + * ext/alsa/gstalsaplugin.c: (plugin_init): + * ext/dts/gstdtsdec.c: (gst_dtsdec_channels), + (gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init): + * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst), + (gst_faad_chanpos_to_gst), (gst_faad_sinkconnect), + (gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain), + (gst_faad_change_state), (plugin_init): + * ext/faad/gstfaad.h: + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + * gst-libs/gst/audio/Makefile.am: + * gst-libs/gst/audio/audio.c: (plugin_init): + * gst-libs/gst/audio/multichannel.c: + (gst_audio_check_channel_positions), + (gst_audio_get_channel_positions), + (gst_audio_set_channel_positions), + (gst_audio_set_structure_channel_positions_list), + (add_list_to_struct), (gst_audio_set_caps_channel_positions_list), + (gst_audio_fixate_channel_positions): + * gst-libs/gst/audio/multichannel.h: + * gst-libs/gst/audio/testchannels.c: (main): + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_class_init), (gst_audio_convert_init), + (gst_audio_convert_dispose), (gst_audio_convert_getcaps), + (gst_audio_convert_parse_caps), (gst_audio_convert_link), + (gst_audio_convert_fixate), (gst_audio_convert_channels): + * gst/audioconvert/plugin.c: (plugin_init): + Surround sound support. + +2004-11-25 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push): + Fix position for discont if we're close as well. Nitpicking, but + saves a few milliseconds of extra waiting or skipping. + +2004-11-25 Ronald S. Bultje + + * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter): + We sometimes need parsers for playback, so add those too. + +2004-11-25 Ronald S. Bultje + + * configure.ac: + * gst/apetag/Makefile.am: + * gst/apetag/apedemux.c: (gst_ape_demux_get_type), + (gst_ape_demux_base_init), (gst_ape_demux_class_init), + (gst_ape_demux_init), (gst_ape_demux_get_src_formats), + (gst_ape_demux_get_src_query_types), + (gst_ape_demux_handle_src_query), (gst_ape_demux_get_event_mask), + (gst_ape_demux_handle_src_event), (gst_ape_demux_handle_event), + (gst_ape_demux_typefind_peek), (gst_ape_demux_typefind_get_length), + (gst_ape_demux_typefind_suggest), (gst_ape_demux_typefind), + (gst_ape_demux_parse_tags), (gst_ape_demux_stream_init), + (gst_ape_demux_stream_data), (gst_ape_demux_loop), + (gst_ape_demux_change_state): + * gst/apetag/apedemux.h: + * gst/apetag/apetag.c: (plugin_init): + * gst/typefind/gsttypefindfunctions.c: (apetag_type_find), + (plugin_init): + APE v1/2 tag reader plus typefind function. + +2004-11-25 Ronald S. Bultje + + * configure.ac: + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): + Remove hacks for older core. Require newer core version + accordingly. + +2004-11-25 Ronald S. Bultje + + * gst/cdxaparse/Makefile.am: + * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_get_type), + (gst_cdxaparse_class_init), (gst_cdxaparse_init), + (gst_cdxaparse_loop), (gst_cdxaparse_change_state), (plugin_init): + * gst/cdxaparse/gstcdxaparse.h: + * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_get_type), + (gst_cdxastrip_base_init), (gst_cdxastrip_class_init), + (gst_cdxastrip_init), (gst_cdxastrip_get_src_formats), + (gst_cdxastrip_get_src_query_types), + (gst_cdxastrip_handle_src_query), (gst_cdxastrip_get_event_mask), + (gst_cdxastrip_handle_src_event), (gst_cdxastrip_strip), + (gst_cdxastrip_sync), (gst_cdxastrip_handle_event), + (gst_cdxastrip_chain), (gst_cdxastrip_change_state): + * gst/cdxaparse/gstcdxastrip.h: + SVCD/VCD header stripping separated from CDXA image parsing. + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), + (plugin_init): + Add VCD/SVCD header typefinding for VCD/SVCD. + * sys/vcd/vcdsrc.c: (gst_vcdsrc_get_type), (gst_vcdsrc_base_init), + (gst_vcdsrc_class_init), (gst_vcdsrc_init), + (gst_vcdsrc_set_property), (gst_vcdsrc_get_property), + (gst_vcdsrc_get_event_mask), (gst_vcdsrc_get_query_types), + (gst_vcdsrc_get_formats), (gst_vcdsrc_srcpad_event), + (gst_vcdsrc_srcpad_query), (gst_vcdsrc_get), + (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), + (gst_vcdsrc_change_state), (gst_vcdsrc_msf), + (gst_vcdsrc_recalculate), (gst_vcdsrc_uri_get_type), + (gst_vcdsrc_uri_get_protocols), (gst_vcdsrc_uri_get_uri), + (gst_vcdsrc_uri_set_uri), (gst_vcdsrc_uri_handler_init): + * sys/vcd/vcdsrc.h: + Fix up, add seeking, querying, URI interface. Works in totem now. + +2004-11-25 Thomas Vander Stichele + + * configure.ac: + back to CVS + +=== release 0.8.6 === + +2004-11-25 Thomas Vander Stichele + + * NEWS: + * RELEASE: + * configure.ac: + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/it.po: + * po/nb.po: + * po/nl.po: + * po/or.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + releasing 0.8.6, "IOU Love" + +2004-11-23 Thomas Vander Stichele + + patch by: Ronald Bultje + + * gst/playback/gstplaybasebin.c: + Fix unplayable files error handling. Fixes #158365 + +2004-11-23 Thomas Vander Stichele + + patch by: Ronald Bultje + + * gst/typefind/gsttypefindfunctions.c: + Fix broken mp3 typefinding. Fixes #158375 + +2004-11-23 Thomas Vander Stichele + + patch by: Ronald Bultje + + * ext/ogg/gstoggdemux.c: + Fix sync on broken files. Fixes #158976 + +2004-11-23 Thomas Vander Stichele + + patch by: Edward Hervey + + * ext/libpng/gstpngenc.c: + Copy over buffer properties. Fixes #158832 + +2004-11-23 Thomas Vander Stichele + + patch by: Tim-Philipp Müller + + * ext/dvdread/dvdreadsrc.c: + Fixes invalid reads (#158462) + +2004-11-23 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4lsrc_calls.c: + Probe less and cache it. Fixes #159187. + +2004-11-23 Thomas Vander Stichele + + * gst/videorate/gstvideorate.c: + Handle all video formats. Fixes #159186. + +2004-11-16 Jan Schmidt + * gst/synaesthesia/gstsynaesthesia.c: + (gst_synaesthesia_class_init), (gst_synaesthesia_init), + (gst_synaesthesia_dispose), (gst_synaesthesia_finalize), + (gst_synaesthesia_sink_link), (gst_synaesthesia_src_getcaps), + (gst_synaesthesia_src_link), (gst_synaesthesia_chain), + (gst_synaesthesia_change_state), (plugin_init): + Fix up synaesthesia to work under different samplerates/ buffer sizes. + Force 320x200 output, as that's the only thing the underlying + synaesthesia implementation supports. Still needs to be made + re-entrant. + +2004-11-14 Ronald S. Bultje + + * configure.ac: + Fix mpeg2enc configure check (similar to mplex check below). + +2004-11-14 Koop Mast + + reviewed by: Ronald S. Bultje + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + Fix for gcc-2.95 (fixes #158221). + +2004-11-13 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): + Re-add clock distribution hack (until new core is released). + Fixes #158125. + +2004-11-13 Arwed v. Merkatz + * configure.ac: + fix mplex configure check segfaulting on some systems (bug #140994) + +2004-11-13 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_pcm_wait): + add debugging + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + do a wait when we enter the loop func with no data available to + write instead of getting into an 100% CPU loop by just returning and + being called again by the scheduler + +2004-11-13 Jan Schmidt + + * configure.ac: + * ext/libvisual/visual.c: (gst_visual_get_type), + (libvisual_log_handler), (gst_visual_getcaps), + (gst_visual_srclink), (gst_visual_change_state), (make_valid_name), + (plugin_init): + Update libvisual to 0.1.7. Link in the debug handling to gstreamer + * ext/smoothwave/Makefile.am: + * ext/smoothwave/demo-osssrc.c: (main): + * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init), + (gst_smoothwave_init), (gst_smoothwave_dispose), (gst_sw_sinklink), + (gst_sw_srclink), (gst_smoothwave_chain), (gst_sw_change_state), + (plugin_init): + * ext/smoothwave/gstsmoothwave.h: + Make gstsmoothwave a working element in the 20th century. + + * gst/chart/gstchart.c: (gst_chart_init), (gst_chart_srcconnect): + Fix incorrect link function + +2004-11-12 Ronald S. Bultje + + * gst/volume/gstvolume.c: + Allow buffer-frames=0. + +2004-11-12 Iain + + * configure.ac: Check for polypaudio + + * ext/Makefile.am: Build the polyp dir + + * ext/polyp: The polypsink sources. + +2004-10-30 Iain + + * gst/interleave/interleave.c (interleave_unlink): Change the src pads + caps to reflect the new number of channels. + +2004-11-12 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + Fix for negotiation order problem. This would show when the + ALSA loopfuction was called before any other function. ALSA + wouldn't do anything because we're not negotiated yet, leading + to an infinite loop. Showed in e.g. Rhythmbox. Fixes #158006. + +2004-11-11 Tim-Philipp Müller + + reviewed by: Ronald S. Bultje + + * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): + No warnings (#157986). + +2004-11-11 Ronald S. Bultje + + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + Prefer apev1/2 and id3v1 (at end of file) over musepack. + +2004-11-11 Ronald S. Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_loop_stream): + Signal no-more-pads (so it works in playbin). + +2004-11-11 Ronald S. Bultje + + * ext/musepack/gstmusepackreader.cpp: + Workaround for older core. + +2004-11-11 Ronald S. Bultje + + * gst/ffmpegcolorspace/imgconvert.c: (yuv420p_to_yuv422): + Actually test for odd width/height rather than testing whether + a temporary variable that was 0 before we subtracted 1 is now + not equal to zero (which it always is). + +2004-11-11 Zaheer Abbas Merali + + * sys/v4l2/gstv4l2element.c: (gst_v4l2_iface_supported): + Fix compilation if HAVE_XVIDEO is not defined + +2004-11-11 Zaheer Abbas Merali + + * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): + Fix compilation if HAVE_XVIDEO is not defined + +2004-11-11 Jan Schmidt + + * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), + (gst_goom_dispose), (gst_goom_sinkconnect), (gst_goom_chain), + (gst_goom_change_state), (plugin_init): + Use the bytestream adapter so goom doesn't depend on the input + buffer size. + Add a debug category + +2004-11-11 Ronald S. Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_change_state): + Only set hardware parameters *after* negotiation. Before + negotiation, it will set ANY and that seems to cause crashes + (see e.g. #151288, #153227). + +2004-11-10 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): + This seems to be antique leftover. It needs to pass error + checking. + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_init), + (gst_sdlvideosink_deinitsdl), (gst_sdlvideosink_initsdl), + (gst_sdlvideosink_destroy), (gst_sdlvideosink_create), + (gst_sdlvideosink_sinkconnect), (gst_sdlvideosink_chain): + Fix GstXOverlay implementation (#151059). + +2004-11-10 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + Don't assert (#157853). + +2004-11-10 Ronald S. Bultje + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), + Fix bytes/samples confustion. + (gst_alsa_sink_mmap), (gst_alsa_sink_loop): + Fix for underrun (#144389). + +2004-11-09 Ronald S. Bultje + + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): + Disable halfway-seek for pending release (since it needs a new + core release). + +2004-11-09 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4lsrc_calls.c: + add autoprobe-fps property so we can separate autoprobing parts + +2004-11-09 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: + * sys/v4l/v4lsrc_calls.c: + initialise fourcc to catch unset fourcc's, and debug + +2004-11-09 Wim Taymans + + * gst/playback/README: + * gst/playback/gstdecodebin.c: (close_pad_link), (try_to_link_1): + * gst/playback/gstplaybin.c: (gst_play_bin_init), + (gst_play_bin_dispose), (gst_play_bin_set_property), + (remove_sinks), (setup_sinks), (gst_play_bin_change_state), + (gst_play_bin_get_event_masks), (gst_play_bin_send_event), + (gst_play_bin_get_formats), (gst_play_bin_convert), + (gst_play_bin_get_query_types), (gst_play_bin_query): + Cleanups and some more documentation. + +2004-11-09 Jan Schmidt + + * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init), + (gst_cacasink_init), (gst_cacasink_chain): + * ext/libcaca/gstcacasink.h: + Cacasink inherits from VideoSink, so let that store the clock. + +2004-11-09 Wim Taymans + + * gst/playback/README: + * gst/playback/gstplaybasebin.c: (group_destroy), (group_is_muted), + (add_stream), (unknown_type), (add_element_stream), (no_more_pads), + (probe_triggered), (preroll_unlinked), (new_decoded_pad), + (gst_play_base_bin_change_state), (gst_play_base_bin_found_tag): + * gst/playback/gstplaybin.c: (gen_vis_element), (remove_sinks), + (setup_sinks): + * gst/playback/gststreaminfo.c: (gst_stream_info_set_mute), + (gst_stream_info_is_mute), (gst_stream_info_set_property): + * gst/playback/gststreaminfo.h: + Updated README. + Only switch groups if all streams have muted (EOSed). + Send Tags in sync with the stream playback instead of in + the playback/preroll phase. + Some cleanups, free the fakesrc elements. + +2004-11-09 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_get_caps_internal): + buffer-frames property was missing + * ext/arts/gst_arts.c: + rate missing from sinkcaps + * ext/audiofile/gstafparse.c: + * ext/audiofile/gstafsink.c: + * ext/audiofile/gstafsrc.c: + * ext/swfdec/gstswfdec.c: + int audio doesn't know buffer-frames + * ext/cdparanoia/gstcdparanoia.c: + int audio doesn't know chunksize either + * ext/nas/nassink.c: + it's endianness, not endianess + * gst-libs/gst/audio/audio.h: + make float standard pad template caps really describe float + * gst/law/mulaw.c: (linear_factory): + signed only, please + * gst/mpegstream/gstdvddemux.c: + widths of 20 are not valid + +2004-11-08 Thomas Vander Stichele + + Submitted by: Luca Ferretti + + * po/LINGUAS: + * po/it.po: + Add Italian + +2004-11-08 Wim Taymans + + * gst/playback/README: + * gst/playback/gstdecodebin.c: (close_pad_link), (try_to_link_1): + * gst/playback/gstplaybasebin.c: (probe_triggered), + (gst_play_base_bin_change_state): + Updated README, added more comments for fixmes etc.. + +2004-11-08 Wim Taymans + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): + We can remove this hack now. + +2004-11-08 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_ayuv), + (gst_videomixer_fill_checker), (gst_videomixer_fill_color), + (gst_videomixer_blend_buffers), (gst_videomixer_loop): + Only mix AYUV for maximum quality. + +2004-11-08 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (get_relative), (gst_ogg_demux_src_query), + (gst_ogg_demux_push), (gst_ogg_pad_push): + Let's act as if we're synchronized now! :). + * ext/theora/theoradec.c: (theora_dec_chain): + Add some debug. + +2004-11-08 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), + (gst_alpha_set_property), (gst_alpha_sink_link), + (gst_alpha_set_ayuv), (gst_alpha_set_i420), + (gst_alpha_chroma_key_ayuv), (gst_alpha_chroma_key_i420), + (gst_alpha_init_params), (gst_alpha_chain): + Implement alpha functions for AYUV too, this increases + accuracy quite a bit. + +2004-11-08 Wim Taymans + + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_caps_remove_format_info): + * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), + (shrink12), (img_get_alpha_info), (deinterlace_line), + (deinterlace_line_inplace): + * gst/ffmpegcolorspace/imgconvert_template.h: + Added AYUV colorspace and handle RGBA a bit more respectful. + +2004-11-08 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + Actually always send a discont (cornercase when resending the + same serial-tagged chain twice). + +2004-11-08 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_clear), + (gst_ximagesink_finalize): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_clear), + (gst_xvimagesink_finalize): Some more cleanups, leaks fixed and checks. + +2004-11-08 Wim Taymans + + * gst/typefind/gsttypefindfunctions.c: (aac_type_find): + Don't segfault on NULL data. + +2004-11-08 Wim Taymans + + * gst/playback/gstdecodebin.c: (unlinked): + * gst/playback/gstplay-marshal.list: + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (gst_play_base_bin_init), (group_create), (get_active_group), + (get_building_group), (group_destroy), (group_commit), + (queue_overrun), (remove_groups), (add_stream), (unknown_type), + (add_element_stream), (no_more_pads), (probe_triggered), + (preroll_unlinked), (new_decoded_pad), (removed_decoded_pad), + (state_change), (setup_source), (gst_play_base_bin_get_property), + (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), + (gst_play_base_bin_link_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_class_init), + (remove_sinks), (setup_sinks), (gst_play_bin_change_state): + Add support for chained ogg files. Prepare for playlist + support. This patch introduces the concept of pad groups, which + together compose one playable media file. + +2004-11-07 David Schleef + + * testsuite/gst-lint: Check for pad templates that aren't statically + scoped. + +2004-11-07 Ronald S. Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/musepack/Makefile.am: + * ext/musepack/gstmusepackdec.cpp: + * ext/musepack/gstmusepackdec.h: + * ext/musepack/gstmusepackreader.cpp: + * ext/musepack/gstmusepackreader.h: + Add musepack decoder. + * ext/faad/gstfaad.c: (gst_faad_base_init): + Make pad templates static. + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), + (plugin_init): + Add musepack typefinder, make mp3 typefinding work halfway stream, + which doesn't actually work yet because id3demux doesn't implement + _get_length(). + +2004-11-07 Ronald S. Bultje + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop): + Fix interrupt event handling (#144436). + +2004-11-07 Ronald S. Bultje + + * ext/mad/gstid3tag.c: (gst_id3_tag_do_typefind): + Hide unused glory. + +2004-11-06 Tim-Philipp Müller + + reviewed by: Ronald S. Bultje + + * ext/vorbis/vorbisenc.c: (raw_caps_factory): + Fix weird caps (#157548). + +2004-11-06 Tim-Philipp Müller + + Reviewed by: Ronald S. Bultje + + * gst/rtp/gstrtpgsmparse.c: (gst_rtpgsm_caps_nego): + Add missing NULL terminator (#157543). + +2004-11-05 Thomas Vander Stichele + + * gst/tcp/gsttcp.h: + * gst/tcp/gsttcpclientsink.c: + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpserversink.c: + * gst/tcp/gsttcpserversrc.c: + ports can go up to 65535. Move common defines to gsttcp.h + +2004-11-05 Wim Taymans + + * gst/videotestsrc/videotestsrc.c: (paint_setup_Y41B), + (paint_hline_Y41B), (paint_setup_Y42B), (paint_hline_Y42B): + Added two more colorspaces. + +2004-11-05 Wim Taymans + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), + (yuv422p_to_yuv422), (yuv420p_to_yuv422), (shrink12), + (img_convert), (deinterlace_line), (deinterlace_line_inplace): + More stride fixes. + +2004-11-05 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_set_property), (gst_alpha_add), + (gst_alpha_chroma_key), (gst_alpha_init_params), (gst_alpha_chain): + * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), + (gst_videomixer_fill_checker), (gst_videomixer_blend_buffers), + (gst_videomixer_loop): + More stride fixes. + +2004-11-05 Benjamin Otte + + * ext/mad/gstmad.c: (gst_mad_chain): + don't overflow data buffer. Flush not needed sync data when syncing + failed. + +2004-11-04 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), + (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), + (gst_alpha_get_property), (gst_alpha_add), (gst_alpha_chroma_key), + (gst_alpha_init_params), (gst_alpha_chain), + (gst_alpha_change_state): + Updated the chroma keying algorithm with something more + sophisticated. + +2004-11-03 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), + (gst_videomixer_fill_checker), (gst_videomixer_fill_color), + (gst_videomixer_blend_buffers), (gst_videomixer_loop): + Fix stride issues. Does not completely work for odd + heights. + +2004-11-03 Wim Taymans + + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), + (gst_alpha_chroma_key), (gst_alpha_chain): + Fix stride issues. Does not completely work for odd + heights. + +2004-11-03 Christophe Fergeau + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): + * gst/videoscale/videoscale.c: (videoscale_find_by_structure): + leak fixes + +2004-11-03 Wim Taymans + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), + (avpicture_alloc): + * gst/ffmpegcolorspace/imgconvert_template.h: + Use correct _fill function to get correct strides. + +2004-11-02 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), + (qtdemux_parse_udta), (qtdemux_tag_add), (gst_qtdemux_handle_esds): + Change all g_print()s to debugging. Add a bunch of consistency + checks. + +2004-11-02 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (try_to_link_1), (get_our_ghost_pad), (remove_element_chain), + (unlinked), (no_more_pads), (close_link): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), + (unknown_type), (add_element_stream), (new_decoded_pad), + (removed_decoded_pad), (setup_source): + * gst/playback/gststreaminfo.c: (gst_stream_info_get_type), + (gst_stream_info_class_init), (gst_stream_info_init), + (gst_stream_info_new), (gst_stream_info_dispose), + (stream_info_mute_pad), (gst_stream_info_set_property), + (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + Fix playback of multiple files. + a slightly different approach to handling dynamic pad removals. + This one only looks at pads that we have linked. + +2004-11-01 Christophe Fergeau + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_finalize): fix an "invalid + free" warning from libc. + +2004-11-01 Ronald S. Bultje + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (get_unconnected_element), (remove_starting_from), (pad_removed), + (close_link): + Implement support for dynamic pad changing. We listen to "live" + pad removals (i.e. while playing) and re-setup autoplugging + after that. Playbasebin/playbin need some more work for this + to finally work, but decodebin supports (and replugs) chained + ogg now. + +2004-11-02 Jan Schmidt + + * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_dispose), + (gst_alsa_finalize): + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init), + (gst_cdaudio_finalize): + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), + (cdparanoia_finalize): + * ext/divx/gstdivxdec.c: (gst_divxdec_dispose): + * ext/divx/gstdivxenc.c: (gst_divxenc_dispose): + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), + (dvdreadsrc_finalize): + * ext/flac/gstflacdec.c: (gst_flacdec_class_init), + (gst_flacdec_finalize): + * ext/flac/gstflacenc.c: (gst_flacenc_class_init), + (gst_flacenc_finalize): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_class_init), + (gst_gnomevfssink_finalize): + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_class_init), + (gst_gnomevfssrc_finalize): + * ext/libfame/gstlibfame.c: (gst_fameenc_class_init), + (gst_fameenc_finalize): + * ext/nas/nassink.c: (gst_nassink_class_init), + (gst_nassink_finalize): + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_finalize), + (gst_sdlvideosink_class_init): + * ext/sndfile/gstsf.c: (gst_sf_dispose): + * gst-libs/gst/mixer/mixertrack.c: (gst_mixer_track_dispose): + * gst-libs/gst/tuner/tunerchannel.c: (gst_tuner_channel_dispose): + * gst-libs/gst/tuner/tunernorm.c: (gst_tuner_norm_dispose): + * gst-libs/gst/xwindowlistener/xwindowlistener.c: + (gst_x_window_listener_dispose): + * gst/audioscale/gstaudioscale.c: + * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init), + (play_on_demand_finalize): + * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose): + * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): + * sys/cdrom/gstcdplayer.c: (cdplayer_class_init), + (cdplayer_finalize): + * sys/glsink/glimagesink.c: (gst_glimagesink_finalize), + (gst_glimagesink_class_init): + * sys/oss/gstosselement.c: (gst_osselement_class_init), + (gst_osselement_finalize): + * sys/oss/gstosssink.c: (gst_osssink_dispose): + * sys/oss/gstosssrc.c: (gst_osssrc_dispose): + * sys/v4l/gstv4lelement.c: (gst_v4lelement_dispose): + Fixes a bunch of problems with finalize and dispose functions, + either assumptions that dispose is only called once, or not calling + the parent class dispose/finalize function + +2004-11-01 Stefan Kost + + * ext/esd/esdsink.c: (gst_esdsink_init), (gst_esdsink_link): + added two api precondition guards + use g_strdup with getenv to fix crash when using ENVVAR + +2004-11-01 Jan Schmidt + * ext/esd/esdsink.c: (gst_esdsink_class_init), + (gst_esdsink_finalize): + Use a finalize function, not dispose, and more importantly, + call the parent class finalize function too + +2004-11-01 Johan Dahlin + + * ext/ogg/gstoggdemux.c: + * gst/tags/gstvorbistag.c: + Plug leaks. + +2004-10-31 Benjamin Otte + + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): + lotsa memleaks today. But they're all small... + +2004-10-31 Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + another memleak crushed + +2004-10-31 Benjamin Otte + + * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): + fix memleak + +2004-10-31 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + Hack to prevent crash when going to READY inside signal handler + while this function is active. + +2004-10-31 Ronald S. Bultje + + * gst/ffmpegcolorspace/Makefile.am: + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/common.h: + * gst/ffmpegcolorspace/dsputil.c: (dsputil_static_init): + * gst/ffmpegcolorspace/dsputil.h: + * gst/ffmpegcolorspace/gstffmpeg.c: (plugin_init): + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_get_palette), (gst_ffmpeg_set_palette), + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_smpfmt_to_caps), + (gst_ffmpegcsp_codectype_to_caps), (gst_ffmpeg_caps_to_smpfmt), + (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpegcsp_caps_with_codectype), + (gst_ffmpegcsp_avpicture_fill): + * gst/ffmpegcolorspace/gstffmpegcodecmap.h: + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_caps_remove_format_info), (gst_ffmpegcsp_getcaps), + (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_get_type), + (gst_ffmpegcsp_base_init), (gst_ffmpegcsp_class_init), + (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), + (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_set_property), + (gst_ffmpegcsp_get_property), (gst_ffmpegcolorspace_register): + * gst/ffmpegcolorspace/imgconvert.c: + (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), + (avcodec_get_pix_fmt), (avpicture_fill), (avpicture_layout), + (avpicture_get_size), (avcodec_get_pix_fmt_loss), + (avg_bits_per_pixel), (avcodec_find_best_pix_fmt1), + (avcodec_find_best_pix_fmt), (img_copy_plane), (img_copy), + (yuv422_to_yuv420p), (uyvy422_to_yuv420p), (uyvy422_to_yuv422p), + (yuv422_to_yuv422p), (yuv422p_to_yuv422), (yuv422p_to_uyvy422), + (uyvy411_to_yuv411p), (yuv420p_to_yuv422), (C_JPEG_TO_CCIR), + (img_convert_init), (img_apply_table), (shrink41), (shrink21), + (shrink12), (shrink22), (shrink44), (grow21_line), (grow41_line), + (grow21), (grow22), (grow41), (grow44), (conv411), + (gif_clut_index), (build_rgb_palette), (bitcopy_n), (mono_to_gray), + (monowhite_to_gray), (monoblack_to_gray), (gray_to_mono), + (gray_to_monowhite), (gray_to_monoblack), (avpicture_alloc), + (avpicture_free), (is_yuv_planar), (img_convert), + (get_alpha_info_pal8), (img_get_alpha_info), (deinterlace_line), + (deinterlace_line_inplace), (deinterlace_bottom_field), + (deinterlace_bottom_field_inplace), (avpicture_deinterlace): + * gst/ffmpegcolorspace/imgconvert_template.h: + * gst/ffmpegcolorspace/mem.c: (av_malloc), (av_realloc), (av_free): + * gst/ffmpegcolorspace/mmx.h: + * gst/ffmpegcolorspace/utils.c: (av_mallocz), (av_strdup), + (av_fast_realloc), (av_mallocz_static), (av_free_static), + (av_freep), (avcodec_get_context_defaults), + (avcodec_alloc_context), (avcodec_init): + Sync back from gst-ffmpeg. Deprecates ffcolorspace. Adds palette + handling plus update from ffmpeg CVS. Large clean-up. + +2004-10-31 Ronald S. Bultje + + * gst/playback/Makefile.am: + We need the marshallers for decodebin, too. + +2004-10-30 David Schleef + + * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Make + quicktime typefinding work with 64-bit offsets. + +2004-10-30 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_handle_sink_event): + Set EOS on the element when processing an EOS event. + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.h: + Only keep a const ptr to the mode + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data), + (gst_riff_create_audio_template_caps): + Allow WMAV3, with up to 6 channels. + * gst/asfdemux/gstasfmux.c: (gst_asfmux_request_new_pad): + Don't call gst_pad_set_event_function on a sink pad. + * gst/mpegstream/gstdvddemux.c: + (gst_dvd_demux_get_subpicture_stream), + (gst_dvd_demux_set_cur_audio), (gst_dvd_demux_set_cur_subpicture): + Copy the explicit caps that were set across to the cur_* pads, + instead of trying to use a possibly non-existent negotiated caps. + Reset the type of subpicture pads to UNKNOWN after calling + init_stream, so that the caps get set. + +2004-10-29 Martin Pitt + + Reviewed by: Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): + Don't touch buffer if it is of size 0 (fixes #151064). + +2004-10-29 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push), (gst_ogg_pad_push): + Synchronized discont handling. + +2004-10-29 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), + (gst_ogg_demux_push): + Make seeking sort-of exact again (fixes #156387). + +2004-10-29 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (unknown_type), + (add_element_stream), (new_decoded_pad), + (gst_play_base_bin_change_state): + * gst/playback/gststreaminfo.c: (gst_stream_info_class_init), + (gst_stream_info_init), (gst_stream_info_new), + (gst_stream_info_dispose), (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + Make caps explicitely available. Makes testing for unsupported + types possible. Improves error reporting. + +2004-10-29 Ronald S. Bultje + + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_buffer_to_default_format): + Really don't touch read-only buffers (#156563). + +2004-10-29 Sebastien Cote + + Reviewd by: Ronald S. Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): + Fix memleak (#155223). + +2004-10-29 Wim Taymans + + * gst/tcp/.cvsignore: + * gst/tcp/gstmultifdsink.c: (gst_sync_method_get_type), + (gst_multifdsink_class_init), (gst_multifdsink_init), + (gst_multifdsink_add), (gst_multifdsink_remove), + (gst_multifdsink_remove_client_link), (is_sync_frame), + (gst_multifdsink_new_client), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), + (gst_multifdsink_get_property): + * gst/tcp/gstmultifdsink.h: + Added burst on connect sync_method, deprecated sync_clients, + streamlined the sync code some more. + +2004-10-29 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (thread_error), (setup_source), + (gst_play_base_bin_change_state): + Improve error reporting. + +2004-10-28 Wim Taymans + + * gst/tcp/Makefile.am: + * gst/tcp/fdsetstress.c: (mess_some_more), (run_test), (main): + * gst/tcp/gstfdset.c: (nearest_pow), (resize), (ensure_size), + (gst_fdset_new), (gst_fdset_free), (gst_fdset_set_mode), + (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), + (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), + (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), + (gst_fdset_wait): + Added more locks around fdset structures. Fixed/reworked + the poll array resizing code. + Added stress test for fdset. + +2004-10-28 Zaheer Abbas Merali + + * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link): + fix build + +2004-10-28 Benjamin Otte + + * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link): + fix link function to always query channels and query width for + floats + * configure.ac: + add equalizer dir + * gst/equalizer/Makefile.am: + * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_get_type), + (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), + (gst_iir_equalizer_init), (gst_iir_equalizer_finalize), + (arg_to_scale), (setup_filter), + (gst_iir_equalizer_compute_frequencies), + (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), + (gst_iir_equalizer_filter_inplace), (gst_iir_equalizer_setup), + (plugin_init): + add an equalizer + +2004-10-27 Thomas Vander Stichele + + Submitted by: Kjartan Maraas + + * po/LINGUAS: + * po/nb.po: + Added Norwegian Bokmaal translation + +2004-10-27 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + Don't break on options (fixes #156488). + +2004-10-27 Thomas Vander Stichele + + * configure.ac: + * ext/cdaudio/Makefile.am: + * sys/Makefile.am: + fix build on older automake + +2004-10-26 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_video_getcaps), + (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop): + Allow a little margin when negotiating the framerate. + +2004-10-26 Stefan Kost + + * gst/level/gstlevel.c: + synchonised naming of pads and pad-templates + +2004-10-26 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), + (gst_ogg_demux_handle_event), (_find_chain_get_unknown_part), + (_find_streams_check), (gst_ogg_demux_push): + Fix EOS again. Needs to be done in a better way. We should not + remove the pad if there is no new chained stream. + +2004-10-26 Iain + + * ext/ogg/gstoggdemux.c (gst_ogg_pad_new): Free the tag list. + * gst/audioscale/gstaudioscale.c (gst_audioscale_link): Free the copy + of the caps. + * gst/interleave/interleave.c (interleave_class_init): Hook up release + pad. + (interleave_release_pad): Remove the pad. + * gst/level/gstlevel.c: Allow the level to take 1 or 2 channels. + * sys/sunaudio/gstsunaudio.c (gst_sunaudio_setparams): Pay attention to + the set device. + * sys/xvimage/xvimagesink.c (gst_xvimagesink_get_xv_support): Free the + attrs + (gst_xvimagesink_xcontext_clear): Free the xcontext. + (gst_xvimagesink_finalize): Free the par. + +2004-10-26 Ronald S. Bultje + + * gst/avi/gstavimux.c: (gst_avimux_audsinkconnect), + (gst_avimux_stop_file): + First calculate the rate, and only then use it. Hdr.rate is a + multiple and not a derivative of hdr.scale. Scale is not the + same as blockalign but is solely related to rate. + +2004-10-26 Ronald S. Bultje + + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_init), + (gst_gnomevfssink_handle_event), (gst_gnomevfssink_chain): + Implement seeking. + +2004-10-25 James Henstridge + + Reviewed by: David Schleef + + * examples/gstplay/player.c: (got_stream_length), (main): + * examples/seeking/cdplayer.c: (update_scale): + * examples/seeking/seek.c: (format_value), (update_scale): + * examples/seeking/spider_seek.c: (format_value), (update_scale), + (stop_seek): + Build fixes on AMD64. + +2004-10-25 Zaheer Abbas Merali + + reviewed by: Ronald Bultje + + * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names): + Fix for some v4l cards which hang in v4lsrc + +2004-10-25 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_remove), + (gst_ogg_demux_push), (gst_ogg_chains_clear): + Make sure to remove the pad when a new chain is + encountered. Set some vars to NULL so we don't try + to reference freed memory. + +2004-10-25 Wim Taymans + + * examples/seeking/Makefile.am: + * examples/seeking/cdplayer.c: (update_scale): + * examples/seeking/chained.c: (unlinked), (new_pad), (main): + * examples/seeking/playbin.c: (make_playerbin_pipeline), + (format_value), (update_scale), (iterate), (start_seek), + (stop_seek), (print_media_info), (play_cb), (pause_cb), (stop_cb), + (print_usage), (main): + Added some more examples, update others. + +2004-10-25 Ronald S. Bultje + + * ext/flac/gstflacdec.c: (gst_flacdec_update_metadata): + * ext/speex/gstspeexdec.c: (speex_dec_chain): + * ext/theora/theoradec.c: (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + Add codec-name metadata. + +2004-10-25 Takao Fujiwara + + Reviewd by: Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): + * ext/alsa/gstalsamixertrack.h: + * po/POTFILES.in: + ALSA mixer track label internationalization (#154054). + +2004-10-25 Ronald S. Bultje + + * ext/theora/theoradec.c: (theora_dec_chain): + Export bitrate as metadata. + +2004-10-25 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): + * ext/alsa/gstalsamixertrack.h: + Fix names, fix loop. + +2004-10-25 Ronald S. Bultje + + * ext/speex/gstspeexdec.c: (gst_speex_dec_init), + (speex_dec_convert): + sinkconvert function so oggdemux can get the file length (totem). + +2004-10-25 James Morrison + + Reviewed by: Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): + Don't push incomplete packets. + * gst/typefind/gsttypefindfunctions.c: (m4a_type_find): + Fix MPEG-4 audio typefinding. + +2004-10-25 Ronald S. Bultje + + * sys/v4l/Makefile.am: + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l/gstv4lelement.c: (gst_v4lelement_get_type), + (gst_v4lelement_init), (gst_v4lelement_dispose), + (gst_v4lelement_change_state): + * sys/v4l/gstv4lelement.h: + * sys/v4l/gstv4lxoverlay.c: (gst_v4l_xoverlay_open), + (gst_v4l_xoverlay_close), (idle_refresh), + (gst_v4l_xoverlay_set_xwindow_id): + * sys/v4l/gstv4lxoverlay.h: + * sys/v4l/v4l-overlay_calls.c: + * sys/v4l/v4l_calls.h: + * sys/v4l2/Makefile.am: + * sys/v4l2/gstv4l2.c: (plugin_init): + * sys/v4l2/gstv4l2element.c: (gst_v4l2element_get_type), + (gst_v4l2element_init), (gst_v4l2element_dispose), + (gst_v4l2element_change_state): + * sys/v4l2/gstv4l2element.h: + * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open), + (gst_v4l2_xoverlay_close), (idle_refresh), + (gst_v4l2_xoverlay_set_xwindow_id): + * sys/v4l2/gstv4l2xoverlay.h: + * sys/v4l2/v4l2-overlay_calls.c: + * sys/v4l2/v4l2_calls.h: + Remove client-side overlay handling, use the X-server v4l plugin + for that. Nicer overlay, less code. Also make the plugin + compileable without X (but then without overlay, obviously). + Makes xwindowlistener obsolete, should we remove that? + +2004-10-25 Ronald S. Bultje + + * sys/oss/gstosssrc.c: (gst_osssrc_get_time), (gst_osssrc_get), + (gst_osssrc_src_query): + * sys/oss/gstosssrc.h: + OK, so people want offset in DEFAULT. This time, actually fix all + cases. + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): + Add FPS properly. + +2004-10-24 Ronald S. Bultje + + * gst/asfdemux/gstasfmux.c: + * gst/avi/gstavimux.c: + Framerate. + +2004-10-24 Ronald S. Bultje + + * sys/v4l2/gstv4l2element.c: (gst_v4l2element_set_property): + Fix properties (channel, norm, frequency). + +2004-10-24 Ronald S. Bultje + + * sys/v4l2/gstv4l2element.c: (gst_v4l2element_get_property): + Flag typo. + * sys/v4l2/v4l2_calls.c: (gst_v4l2_set_defaults): + No warnings. + +2004-10-24 Ronald S. Bultje + + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_clear_format_list): + Fix hang. + +2004-10-24 Ronald S. Bultje + + * sys/v4l2/gstv4l2element.h: + Yet Another Hack (tm) for kernel header borkedness. + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), + (gst_v4l2src_v4l2fourcc_to_caps), (gst_v4l2_fourcc_from_structure), + (gst_v4l2src_link), (gst_v4l2src_getcaps), + (gst_v4l2src_change_state): + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_init), + (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop): + Fix caps, keep track of state, work. + +2004-10-24 Ronald S. Bultje + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): + Quiet. + +2004-10-24 Ronald S. Bultje + + * sys/oss/gstosssrc.c: (gst_osssrc_get): + Don't mix bytes and samples. + +2004-10-24 Ronald S. Bultje + + * ext/ogg/gstoggmux.c: + Basic pad template which accepts OGM tracks, speex, flac, vorbis + and theora. Any is incorrect. + * gst/asfdemux/gstasfmux.c: (gst_asfmux_vidsink_link): + Fix caps. + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_base_init): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_base_init), + (gst_v4lmjpegsrc_init), (gst_v4lmjpegsrc_srcconnect), + (gst_v4lmjpegsrc_getcaps), (gst_v4lmjpegsrc_change_state): + * sys/v4l/gstv4lmjpegsrc.h: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps), + (gst_v4lsrc_change_state): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_start), + (gst_v4lmjpegsrc_capture_stop): + Fix caps. Keep track of internal state. Work. + +2004-10-23 Ronald S. Bultje + + * ext/Makefile.am: + Fix the build fixes. + +2004-10-23 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (_find_chain_seek), + (gst_ogg_pad_push): + Check for pad availability before using it. + * ext/ogg/gstoggdemux.c: (_find_chain_process): + Fix parsing of chained ogg. Needs more work on the decoder side. + +2004-10-22 Benjamin Otte + + * gst/spectrum/Makefile.am: + * gst/spectrum/demo-osssrc.c: (spectrum_chain), (main), + (idle_func): + Fix demo and reenable it. Yes, I'm currently playing with audio + analysis tools + +2004-10-22 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + We love it if files that start at zero work too... + +2004-10-22 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): + Handle files with missing EOS headers. + +2004-10-21 Zaheer Abbas Merali + + * gst/tcp/gsttcpserversink.c: + (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_init_send): + Zero some variables first (need for accept not to return EINVAL) + +2004-10-20 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_pad_push): + * ext/theora/theoradec.c: (theora_dec_sink_convert), + (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), + (gst_vorbis_dec_init), (vorbis_dec_convert), (vorbis_dec_chain): + Seeking and querying finetune. + +2004-10-20 Thomas Vander Stichele + + * configure.ac: + * ext/Makefile.am: + * ext/raw1394/Makefile.am: + fix the build + +2004-10-20 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): + Wrong return. + * gst/playback/Makefile.am: + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init): + * gst/playback/gstplay-marshal.list: + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init): + Fix marshallers. + +2004-10-18 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event): + Silence. + +2004-10-18 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_pad_populate), + (gst_ogg_pad_push): + Yay for non-lineair granulepos in theora. + +2004-10-18 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_video_getcaps), + (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop): + * ext/dv/gstdvdec.h: + Make sure we renegotiate aspect ratio when the camera switches. + +2004-10-18 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_pad_push): + Start at zero. + * ext/theora/theoradec.c: (theora_dec_chain): + Skip headers. Bad idea for chained ogg, but fixes seeking. + +2004-10-18 Wim Taymans + + * configure.ac: + I swear, this is the last time I touch this. + +2004-10-18 Ronald S. Bultje + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_pad_populate), + (_read_bos_process), (gst_ogg_demux_iterate), (gst_ogg_pad_new): + Faster seeking. + * ext/theora/theoradec.c: (theora_dec_sink_convert): + Time-to-default conversion. + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + Don't error on unknown packets, just skip. We should probably + read them if we want to support chained ogg. + +2004-10-18 Wim Taymans + + * configure.ac: + Added cdaudio to wrong list. + +2004-10-18 Wim Taymans + + * configure.ac: + Revive cdaudio. + +2004-10-18 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_video_getcaps), + (gst_dvdec_video_link), (gst_dvdec_push): + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), + (gst_smokeenc_resync), (gst_smokeenc_chain): + Fix mimetype on smoke encoder. + Add aspect ratio to dvdec. Not sure if these + values are correct though.... + +2004-10-18 Wim Taymans + + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_class_init): + Fix vorbis property descriptions and ranges. + +2004-10-18 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): + Really do nothing when no data is available. + Go to the playing state when the stream is not seekable + instead of failing. + +2004-10-18 Wim Taymans + + * ext/cdaudio/gstcdaudio.c: (_do_init), (gst_cdaudio_base_init), + (gst_cdaudio_get_event_masks), (gst_cdaudio_send_event), + (gst_cdaudio_query), (plugin_init), (cdaudio_uri_get_type), + (cdaudio_uri_get_protocols), (cdaudio_uri_get_uri), + (cdaudio_uri_set_uri), (cdaudio_uri_handler_init): + Added uri handler for cd:// + Port to new API. + +2004-10-18 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (gst_decode_bin_init), (find_compatibles), (close_pad_link), + (try_to_link_1), (no_more_pads), (close_link), (type_found): + * gst/playback/gstplaybasebin.c: (gen_preroll_element), + (remove_prerolls), (unknown_type), (add_element_stream), + (new_decoded_pad), (setup_source), (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_link_stream): + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_vis_element), (remove_sinks), (setup_sinks): + * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), + (gst_stream_info_get_type), (gst_stream_info_class_init), + (gst_stream_info_init), (gst_stream_info_new), + (gst_stream_info_dispose), (stream_info_mute_pad), + (gst_stream_info_set_property), (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + Add sink padtemplate to decodebin. + Added some more comments. + Make queue size configurable in playbasebin. + Added possibility to use elements as sinks (ex cdaudio). + +2004-10-15 Wim Taymans + + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init), + (gst_speexenc_chain): + Fix speex timestamps so that it gets muxed properly. + +2004-10-15 Wim Taymans + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), + (gst_dv1394src_base_init), (gst_dv1394src_class_init), + (gst_dv1394src_init), (gst_dv1394src_dispose), + (gst_dv1394src_iso_receive), (gst_dv1394src_discover_avc_node), + (gst_dv1394src_change_state), (gst_dv1394src_get_event_mask), + (gst_dv1394src_event), (gst_dv1394src_get_formats), + (gst_dv1394src_convert), (gst_dv1394src_get_query_types), + (gst_dv1394src_query), (gst_dv1394src_uri_get_type), + (gst_dv1394src_uri_get_protocols), (gst_dv1394src_uri_get_uri), + (gst_dv1394src_uri_set_uri), (gst_dv1394src_uri_handler_init): + * ext/raw1394/gstdv1394src.h: + Added conversion/query functions. + Update buffer timestamps, + Added signals. + Added uri dv:// so it might play from the firewire in playbin. + Fix a possible leak. + Added debugging. + +2004-10-15 Wim Taymans + + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_class_init), + (gst_dv1394src_init), (gst_dv1394src_set_property), + (gst_dv1394src_get_property), (gst_dv1394src_iso_receive), + (gst_dv1394src_discover_avc_node), (gst_dv1394src_change_state): + * ext/raw1394/gstdv1394src.h: + Added AV/C VTR control support needed for some cameras. + Added automatic port detection. + Added properties for selecting the channel. + The configure.ac script is not yet updated to reflect the + new libavc1394 and librom1394 dependencies. + +2004-10-15 Wim Taymans + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse), (gst_qtdemux_handle_esds): + An esds box is not a container. + Fix parsing of mp4v boxes. + Do not try to renegotiate fps for each frame. Need to + find a better method. This should fix mp4 playback. + +2004-10-14 David Schleef + + * configure.ac: update for swfdec-0.3 and liboil-0.2 + * ext/swfdec/gstswfdec.c: update for swfdec-0.3 + * ext/swfdec/gstswfdec.h: same + * gst/videofilter/gstvideobalance.c: update for liboil-0.2 + * gst/videotestsrc/videotestsrc.c: same + +2004-10-14 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), + (is_sync_frame), (gst_multifdsink_new_client), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_change_state): + Turn warnings into info. + Don't allow a state change in the streaming thread. + +2004-10-14 Thomas Vander Stichele + + * ext/vorbis/oggvorbisenc.c: + * ext/vorbis/vorbisdec.c: + fix template sample rate + +2004-10-13 Wim Taymans + + * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): + Decoding the header first fixes some problems in resyncing + in more mp3s. + +2004-10-12 Wim Taymans + + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_vis_element), (remove_sinks), (setup_sinks): + Added vis plugin support, need to configure the vis + element to activate it. + +2004-10-12 Ronald S. Bultje + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get), + (gst_gnomevfssrc_srcpad_query), (gst_gnomevfssrc_srcpad_event): + Some debug. + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_handle_src_event), (gst_avi_demux_read_superindex), + (gst_avi_demux_read_subindexes), (gst_avi_demux_add_stream), + (gst_avi_demux_stream_index), (gst_avi_demux_skip), + (gst_avi_demux_sync), (gst_avi_demux_stream_scan), + (gst_avi_demux_massage_index), (gst_avi_demux_stream_header): + * gst/avi/gstavidemux.h: + Support for openDML-2.0 indx/ix## chunks. Support for broken index + recovery (where, if part of the index is broken, we will still read + the rest of the index and recover the broken part by stream + scanning). More broken media support. EOS workarounds. General AVI + braindamage headache recovery. Aspirin included. + +2004-10-11 Ronald S. Bultje + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_open), + (cdparanoia_event), (cdparanoia_query): + Get rid of hideous lead-in. + +2004-10-11 Wim Taymans + + * gst/playback/gstplaybasebin.c: (setup_source): + Wrong var used to get g_list_next. + +2004-10-11 Ronald S. Bultje + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), + (cdparanoia_get), (cdparanoia_open): + Report discid as metadata, add duration. + +2004-10-11 Wim Taymans + + * gst/playback/gstplaybasebin.c: (setup_source): + Cleanup the previous pipeline a little earlier for the + case that a source element provides raw data. + +2004-10-11 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + reset v1 tag offset when there is no v1 tag. Fixes id3demux always + consuming the last 128 bytes, even though it was valid mp3 data. + +2004-10-10 Zaheer Abbas Merali + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps), + (gst_v4lsrc_getcaps), (gst_v4lsrc_get): + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): + Change g_warnings to GST_WARNING_OBJECT and fix colourspace issue + +2004-10-10 Zaheer Abbas Merali + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps): + Fix for webcams that support only specific width or height + +2004-10-09 Tim-Philipp Müller + + Reviewed by: Ronald S. Bultje + + * gst/wavenc/gstwavenc.c: (gst_wavenc_stop_file): + Fix wrong discont event setup (fixes #154967). + +2004-10-09 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst/auparse/gstauparse.c: (gst_auparse_chain): + Error out on invalid data (fixes #154807). + +2004-10-09 Tim-Philipp Müller + + Reviewed by: Ronald S. Bultje + + * ext/dvdread/dvdreadsrc.c: (_read): + Make titles > 0 work again (fixes #154834). + +2004-10-09 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_template_caps): + WMV3 missing in template caps. + +2004-10-09 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + OK, so the original code was too strict. It makes random AVI files + hang for seconds upon opening, which is unacceptable and is far + beyond the original goal of getting multiple chunks for one-chunk + sounc stream files. So now do just that. + +2004-10-09 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (setup_source), + (gst_play_base_bin_change_state): + Actually clean up streaminfo if output fails. This would trigger + if, for example, there was no CD in the drive. No preroll, so + a streaminfo structure is created, but the subsequent state change + of the thread fails. + * gst/playback/gstplaybin.c: (gst_play_bin_change_state): + Don't change state if parent failed. + +2004-10-08 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (gst_play_bin_class_init), + (gst_play_bin_init), (gst_play_bin_get_property), (handoff), + (gen_video_element), (remove_sinks): + Add small bits of code for screenshot handling. + +2004-10-08 Wim Taymans + + * gst/playback/gstplaybin.c: (gst_play_bin_set_property), + (gen_video_element), (gen_audio_element), (setup_sinks): + Don't assume the user provided sinks are named "sink"... + +2004-10-08 Wim Taymans + + * gst/playback/gstplaybasebin.c: (gen_preroll_element), + (unknown_type), (setup_source), (gst_play_base_bin_remove_element), + (gst_play_base_bin_link_stream): + Do not try to autoplug sources that generate raw streams like + cdparanoia. + disconnect the preroll overrun signal when we don't need it anymore. + +2004-10-08 Milosz Derezynski + + * ext/cdparanoia/gstcdparanoia.c: (_do_init), + Added reworked patch from #154903 from milosz derezynski (deadchip). + +2004-10-08 Wim Taymans + + * ext/cdparanoia/gstcdparanoia.c: (_do_init), + (cdparanoia_base_init), (cdparanoia_class_init), (cdparanoia_init), + (cdparanoia_dispose), (cdparanoia_get), (cdparanoia_change_state), + (cdparanoia_convert), (cdparanoia_uri_get_type), + (cdparanoia_uri_get_protocols), (cdparanoia_uri_get_uri), + (cdparanoia_uri_set_uri), (cdparanoia_uri_handler_init): + * ext/cdparanoia/gstcdparanoia.h: + This adds the cdda:// uri. + +2004-10-08 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (gst_decode_bin_init), (find_compatibles), (close_pad_link), + (try_to_link_1), (no_more_pads), (close_link), (type_found): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), + (unknown_type), (gst_play_base_bin_remove_element), + (gst_play_base_bin_link_stream): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_init), + (gst_play_bin_set_property), (gen_video_element), + (gen_audio_element), (setup_sinks): + * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), + (gst_stream_info_get_type), (gst_stream_info_class_init), + (gst_stream_info_init), (gst_stream_info_new), + (gst_stream_info_dispose), (stream_info_mute_pad), + (gst_stream_info_set_property), (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + Reuse the audio and video bins. + Some internal cleanups in the stream selection code. + +2004-10-08 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: Reverting Ronald's changes as the issue is + not coming from those elements. Moreover these elements should not keep + the xid they have been given when in NULL state. + +2004-10-07 Ronald S. Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: + Actually only create a new toplevel window if we're not gonna + embed it right after. + +2004-10-07 Wim Taymans + + * gst/playback/gstplaybasebin.c: (play_base_bin_mute_pad), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream): + * gst/playback/gstplaybin.c: (setup_sinks): + Implement muting/unmuting of streams, mute streams that are not + used. + +2004-10-07 Wim Taymans + + * gst/typefind/gsttypefindfunctions.c: (ac3_type_find), + (plugin_init): + Added lame audio/x-ac3 typefind function. + +2004-10-06 Thomas Vander Stichele + + * configure.ac: + bump nano to cvs + +=== release 0.8.5 === + +2004-10-06 Thomas Vander Stichele + + * NEWS: + * RELEASE: + * configure.ac: + releasing 0.8.5, "Take You On" + +2004-10-06 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_init), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (no_more_pads), (close_link), (type_found): + * gst/playback/gstplaybasebin.c: (new_decoded_pad): + * gst/playback/gstplaybin.c: (gen_video_element): + Do not signal the no_more_pads after the first pad when + we are plugging a non dynamic element with multiple + output pads (like swfdec, dvdec, ...). + +2004-10-06 Thomas Vander Stichele + + * configure.ac: + bump for prerelease + +2004-10-06 Stephane Loeuillet + + * gst/wavparse/gstwavparse.c: + add ATRAC3 to STATIC CAPS to fix a warning + + * gst/matroska/ebml-read.c: + * gst-libs/gst/riff/riff-read.c: + fix typos + +2004-10-06 Stephane Loeuillet + + * gst-libs/gst/riff/riff-media.c: + generate caps for ATRAC3 audio streams + + * gst/realmedia/rmdemux.c: + generate caps for ATRAC3 audio streams + +2004-10-06 Stephane Loeuillet + + * gst/wavparse/Makefile.am + * gst/wavparse/riff.h + * gst/wavparse/wavparse.vcproj + riff.h removal (unused and duplication with riff-ids.h) + +2004-10-06 Stephane Loeuillet + + * gst/wavparse/gstwavparse.h + remove duplicated defines for audio codec codes + + * gst-libs/gst/riff/riff-ids.h + * gst/wavenc/riff.h: + add "4CC" code for ATRAC3 audio streams + add "4CC" code for ITU_G721_ADPCM (unused for now) + +2004-10-06 Wim Taymans + + * gst/flx/gstflxdec.c: (gst_flxdec_init), (gst_flxdec_loop): + Actually _do_ negotiation. Pass gdouble as arg instead + of guint64 for the framerate. + +2004-10-06 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_init), + (find_compatibles), (close_pad_link), (try_to_link_1), + (no_more_pads), (close_link), (type_found): + * gst/playback/gstplaybasebin.c: (new_decoded_pad): + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): + Set state on newly added element to READY so that negotiation + can happen ASAP. + Addes some more debug info. + Do not try to plug pads with multiple caps structures or ANY + because it is too dangerous since we do not do dynamic + replugging. + +2004-10-06 Thomas Vander Stichele + + written by: Gora Mohanty + + * po/LINGUAS: + * po/or.po: + add Oriya translation + +2004-10-05 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + Prevent overwrite of size member. Makes audio sound crappy. + +2004-10-05 Stephane Loeuillet + + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + Add rmvb to the list of known RealMedia extensions + +2004-10-05 Wim Taymans + + * ext/libmng/gstmngdec.c: (gst_mngdec_loop), (mngdec_error), + (mngdec_openstream), (mngdec_closestream), + (mngdec_handle_sink_event), (mngdec_readdata), + (mngdec_gettickcount), (mngdec_settimer), (mngdec_processheader), + (mngdec_getcanvasline), (mngdec_refresh), + (gst_mngdec_change_state): + Set the framerate correctly. + +2004-10-04 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + There was something wrong with the index massaging. + +2004-10-04 Wim Taymans + + * ext/jpeg/gstjpeg.c: (smoke_type_find), (plugin_init): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_init), + (gst_smokedec_chain): + * ext/jpeg/gstsmokedec.h: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), + (gst_smokeenc_init), (gst_smokeenc_resync), (gst_smokeenc_chain): + * ext/jpeg/gstsmokeenc.h: + * ext/jpeg/smokecodec.c: (smokecodec_encode_new), + (smokecodec_decode_new), (smokecodec_info_free), + (smokecodec_set_quality), (smokecodec_get_quality), + (smokecodec_set_threshold), (smokecodec_get_threshold), + (smokecodec_set_bitrate), (smokecodec_get_bitrate), + (find_best_size), (abs_diff), (put), (smokecodec_encode_id), + (smokecodec_encode), (smokecodec_parse_id), + (smokecodec_parse_header), (smokecodec_decode): + * ext/jpeg/smokecodec.h: + * ext/jpeg/smokeformat.h: + Updated smoke, new bitstream, allows embedding in ogg. + +2004-10-04 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): + Fix seeking in some files. All this code is no longer needed (and + actually breaks stuff) because we now synchronize the full index + right when reading the header. + +2004-10-04 Wim Taymans + + * configure.ac: + configure update for libmng. + +2004-10-04 Wim Taymans + + * ext/libmng/Makefile.am: + * ext/libmng/gstmng.c: (plugin_init): + * ext/libmng/gstmng.h: + * ext/libmng/gstmngdec.c: (gst_mngdec_get_type), + (gst_mngdec_base_init), (gst_mngdec_class_init), + (gst_mngdec_sinklink), (gst_mngdec_init), (gst_mngdec_src_getcaps), + (gst_mngdec_loop), (gst_mngdec_get_property), + (gst_mngdec_set_property), (mngdec_error), (mngdec_openstream), + (mngdec_closestream), (mngdec_handle_sink_event), + (mngdec_readdata), (mngdec_gettickcount), (mngdec_settimer), + (mngdec_processheader), (mngdec_getcanvasline), (mngdec_refresh), + (gst_mngdec_change_state): + * ext/libmng/gstmngdec.h: + * ext/libmng/gstmngenc.c: (gst_mngenc_get_type), + (mng_caps_factory), (raw_caps_factory), (gst_mngenc_base_init), + (gst_mngenc_class_init), (gst_mngenc_sinklink), (gst_mngenc_init), + (gst_mngenc_chain), (gst_mngenc_get_property), + (gst_mngenc_set_property): + * ext/libmng/gstmngenc.h: + Added basic MNG decoder. Needs more work. The encoder does + not work yet. + +2004-10-04 Ronald S. Bultje + + * gst/realmedia/rmdemux.c: (gst_rmdemux_handle_sink_event), + (gst_rmdemux_loop), (gst_rmdemux_add_stream), + (gst_rmdemux_parse_mdpr), (gst_rmdemux_dump_mdpr): + Don't hang on length=0 chunks. Some negotiation fixes. Signal + no-more-pads. + +2004-10-04 Thomas Vander Stichele + + * configure.ac: + you need at least 1.0.4 of speex + +2004-10-04 Iain + + * ext/speex/gstspeexdec.h: Revert the includes changes. + + * ext/speex/gstspeexenc.[ch]: Revert the includes changes. + +2004-09-30 Iain + + * sys/sunaudio/gstsunaudio.c (gst_sunaudiosink_open): Use the device + found during init or set as a property instead of hardcoding /dev/audio + +2004-10-04 Ronald S. Bultje + + * gst/realmedia/rmdemux.c: (gst_rmdemux_class_init), + (gst_rmdemux_init), (gst_rmdemux_handle_sink_event), + (gst_rmdemux_loop), (gst_rmdemux_add_stream), (re_hexdump_bytes), + (re_dump_pascal_string), (gst_rmdemux_dump__rmf), + (gst_rmdemux_dump_prop), (gst_rmdemux_parse_mdpr), + (gst_rmdemux_dump_mdpr), (gst_rmdemux_dump_indx), + (gst_rmdemux_dump_data): + Use debug category, fix EOS handling. filesrc ! rmdemux now + works. + +2004-10-04 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_stream_scan), (sort), (gst_avi_demux_massage_index), + (gst_avi_demux_stream_header), (gst_avi_demux_stream_data): + Improve allocation, cutting and sorting of the index. How takes a + few seconds instead of minutes. + +2004-10-03 Christophe Fergeau + + * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_mdpr): + fixed compilation + +2004-10-02 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add wing commander format mimetype/fourccs. + * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): + Don't crash if some value is 0. + +2004-10-02 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_template_caps): + Add DIB fourcc (raw, palettized 8-bit RGB). + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data): + Oops, fix strf_data reading bug. + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + Use a non-NULL tag. + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Time for hacks. Sorry Dave. At least one quicktime movie (a + trailer) that I've encountered contains multiple video tracks. + One of those is the actual video track, the other are one-frame + tracks (images). Unfortunately, the number of frames according + to the trak header is 1 for each, so that doesn't help. So + instead, I look at the duration and discard tracks with a + duration shorter than 20% of the length of the stream. Better + than nothing. + +2004-10-01 Christian Schaller + + * ext/ivorbis/vorbis.c: + Patch from Phil Blundell (Bug 152341) + +2004-10-01 Wim Taymans + + * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init), + (speex_dec_get_formats), (speex_dec_convert), + (speex_dec_src_query), (speex_dec_src_event), (speex_dec_event), + (speex_dec_chain), (gst_speexdec_get_property), + (gst_speexdec_set_property): + Small cleanups. + +2004-10-01 Wim Taymans + + * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), + (gst_wavparse_stream_init), (gst_wavparse_fmt), + (gst_wavparse_other), (gst_wavparse_loop), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query), + (gst_wavparse_srcpad_event): + * gst/wavparse/gstwavparse.h: + Added some more debugging info. + Fix the case where the length of the file is 0. + Make sure we seek to sample borders. + +2004-10-01 Wim Taymans + + * gst/playback/README: + * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter), + (gst_decode_bin_init), (find_compatibles), (close_pad_link), + (try_to_link_1), (no_more_pads), (close_link), (type_found): + Add some debug info to decodebin, update README + +2004-10-01 Ronald S. Bultje + + * ext/dvdnav/dvdnavsrc.c: (dvdnav_handle_navigation_event): + Don't use g_print(); use GST_DEBUG(). + +2004-10-01 Ronald S. Bultje + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_queue_pads): + Handle EOS properly. + +2004-10-01 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_sinkconnect), + (gst_faad_chain), (gst_faad_change_state): + * ext/faad/gstfaad.h: + Allow playback of raw (unframed) MPEG AAC files (#148993). + +2004-10-01 Sebastien Cote + + Reviewed by: Ronald S. Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): + Throw error if we didn't recognize the stream. Fixes #152289. + +2004-10-01 Ronald S. Bultje + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_link): + Fix negotiation. + +2004-10-01 Francis Labonte + + Reviewed by: Ronald S. Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): + Fix memleak. + +2004-10-01 Balamurali Viswanathan + + Reviewed by: Ronald S. Bultje + + * sys/sunaudio/gstsunaudio.c: (gst_sunaudiosink_setparams): + Solve #152805. + * sys/sunaudio/gstsunmixer.c: (gst_sunaudiomixer_set_mute): + Solve 152806. + +2004-10-01 Ronald S. Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_audio_caps_with_data): + Add codec_data handling (like asfdemux used to do). + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream): + Use riff-media for caps creation instead of our own (mostly + broken) copy of its functions. + +2004-10-01 Ronald S. Bultje + + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_try_capture): + Don't actually error out if we get another return value than + -EINVAL. Opposite to what I first thought, drivers have random + return values for this, although -EINVAL is the expected return + value. Since this is not fatal, we shouldn't use + GST_ELEMENT_ERROR() but just GST_ERROR_OBJECT(). + +2004-10-01 Ronald S. Bultje + + * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), + (dvdreadsrc_init), (dvdreadsrc_dispose), (dvdreadsrc_set_property), + (dvdreadsrc_get_property), (_open), (_seek), (_read), + (dvdreadsrc_get), (dvdreadsrc_open_file), + (dvdreadsrc_change_state): + Fix. Don't do one big huge loop around the whole DVD, that will + cache all data and thus eat sizeof(dvd) (several GB) before we + see something. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): + Actually NULL'ify event after using it. + * gst/matroska/ebml-read.c: (gst_ebml_read_use_event), + (gst_ebml_read_handle_event), (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_read_element_data), + (gst_ebml_read_seek), (gst_ebml_read_skip): + Handle events. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_base_init), + (gst_dvd_demux_init), (gst_dvd_demux_get_audio_stream), + (gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_plugin_init): + Fix timing (this will probably break if I seek using menus, but + I didn't get there yet). VOBs and normal DVDs should now work. + Add a mpeg2-only pad with high rank so this get autoplugged for + MPEG-2 movies. + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_base_init), + (gst_mpeg_demux_class_init), (gst_mpeg_demux_init), + (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream), + (gst_mpeg_demux_get_private_stream), (gst_mpeg_demux_parse_packet), + (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_plugin_init): + Use this as second rank for MPEG-1 and MPEG-2. Still use this for + MPEG-1 but use dvddemux for MPEG-2. + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init), + (gst_mpeg_parse_init), (gst_mpeg_parse_new_pad), + (gst_mpeg_parse_parse_packhead): + Timing. Only add pad template if it exists. Add sink template from + class and not from ourselves. This means we will always use the + correct sink template even if it is not the one defined in this + file. + +2004-09-29 Wim Taymans + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_packet), + (gst_mpeg_demux_parse_pes): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + Fix playback of mpeg again, timestamps where screwed up by + patch 1.61. + +2004-09-29 Ronald S. Bultje + + * ext/flac/gstflacdec.c: (gst_flacdec_src_query): + Only return true if we actually filled something in. Prevents + player applications from showing a random length for flac files. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_class_init), + (gst_riff_read_use_event), (gst_riff_read_handle_event), + (gst_riff_read_seek), (gst_riff_read_skip), (gst_riff_read_strh), + (gst_riff_read_strf_vids_with_data), + (gst_riff_read_strf_auds_with_data), (gst_riff_read_strf_iavs): + OK, ok, so I implemented event handling. Apparently it's normal + that we receive random events at random points without asking + for it. + * gst/avi/gstavidemux.c: (gst_avi_demux_reset), + (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), + (gst_avi_demux_handle_src_event), (gst_avi_demux_stream_index), + (gst_avi_demux_sync), (gst_avi_demux_stream_scan), + (gst_avi_demux_massage_index), (gst_avi_demux_stream_header), + (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), + (gst_avi_demux_stream_data), (gst_avi_demux_loop): + * gst/avi/gstavidemux.h: + Implement non-lineair chunk handling and subchunk processing. + The first solves playback of AVI files where the audio and video + data of individual buffers that we read are not synchronized. + This should not happen according to the wonderful AVI specs, but + of course it does happen in reality. It is also a prerequisite for + the second. Subchunk processing allows us to cut chunks in small + pieces and process each of these pieces separately. This is + required because I've seen several AVI files with incredibly large + audio chunks, even some files with only one audio chunk for the + whole file. This allows for proper playback including seeking. + This patch is supposed to fix all AVI A/V sync issues. + * gst/flx/gstflxdec.c: (gst_flxdec_class_init), + (flx_decode_chunks), (flx_decode_color), (gst_flxdec_loop): + Work. + * gst/modplug/gstmodplug.cc: + Proper return value setting for the query() function. + * gst/playback/gstplaybasebin.c: (setup_source): + Being in non-playing state (after, e.g., EOS) is not necessarily + a bad thing. Allow for that. This fixes playback of short files. + They don't actually playback fully now, because the clock already + runs. This means that small files (<500kB) with a small length + (<2sec) will still not or barely play. Other files, such as mod + or flx, will work correctly, however. + +2004-09-28 Wim Taymans + + * ext/speex/gstspeex.c: (plugin_init): + * ext/speex/gstspeexdec.c: (gst_speex_dec_base_init), + (gst_speex_dec_class_init), (speex_dec_get_formats), + (speex_get_event_masks), (speex_get_query_types), + (gst_speex_dec_init), (speex_dec_convert), (speex_dec_src_query), + (speex_dec_src_event), (speex_dec_event), (speex_dec_chain), + (gst_speexdec_get_property), (gst_speexdec_set_property), + (speex_dec_change_state): + * ext/speex/gstspeexdec.h: + * ext/speex/gstspeexenc.c: (gst_speexenc_get_formats), + (gst_speexenc_get_type), (speex_caps_factory), (raw_caps_factory), + (gst_speexenc_base_init), (gst_speexenc_class_init), + (gst_speexenc_sinkconnect), (gst_speexenc_convert_src), + (gst_speexenc_convert_sink), (gst_speexenc_get_query_types), + (gst_speexenc_src_query), (gst_speexenc_init), + (gst_speexenc_get_tag_value), (comment_init), (comment_add), + (gst_speexenc_metadata_set1), (gst_speexenc_set_metadata), + (gst_speexenc_setup), (gst_speexenc_buffer_from_data), + (gst_speexenc_push_buffer), (gst_speexenc_set_header_on_caps), + (gst_speexenc_chain), (gst_speexenc_get_property), + (gst_speexenc_set_property), (gst_speexenc_change_state): + * ext/speex/gstspeexenc.h: + Rewrote speex encoder, make sure it can be embedded in ogg. + Implemented speex decoder. + +2004-09-28 Christian Schaller + + * configure.ac: + Remove kioslave plugin. Markey is brewing a new working one + * ext/Makefile.am: Remove kioslave plugin + * ext/kio: remove + * gst-plugins.spec.in: remove kio plugin from spec + +2004-09-27 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), + (is_sync_frame), (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_new_client), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients): + * gst/tcp/gstmultifdsink.h: + Make syncing to keyframes actually work for new clients and lagging + clients. + +2004-09-26 Benjamin Otte + + * gst/debug/gstnavigationtest.c: (gst_navigationtest_class_init), + (gst_navigationtest_handle_src_event), (draw_box_planar411), + (gst_navigationtest_planar411), (gst_navigationtest_change_state): + * gst/debug/gstnavigationtest.h: + make navigationtest display button-press and button-release events + +2004-09-26 Iain + + * gst/interleave/interleave.c (all_channels_new_media): Checks if all + the channels have received a new media event. + (interleave_buffered_loop): Compresses a new media event on all + channels into one. + +2004-09-26 Iain + + * gst/wavenc/gstwavenc.c (gst_wavenc_chain): Company says we need to + call the sinkpad's default event handler and not the srcpads. He also + says this is confusing :) + (gst_wavenc_stop_file): Company says that seek events only go upstream + we should send a discontinuous downstream instead. + +2004-09-25 Christian Schaller + + * Update SPEC file to be usable in conjunction with Fedora Core, + Fedora.us and freshrpms packages + * Fix typo in multifilesrc test Makefile + +2004-09-24 Wim Taymans + + * gst/playback/gstplaybasebin.c: (new_decoded_pad): + Only signal the no_more_pads signal when we have + added the stream to our list. + +2004-09-24 Wim Taymans + + * gst/playback/gstplaybasebin.c: (remove_prerolls), + (new_decoded_pad): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (setup_sinks): + Don't try to preroll or decode more than one audio/video + track. + +2004-09-24 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + Throw error if we failed to find a suitable output. This should + throw an error if we successfully set up a pipeline (e.g. because + we recognized a media file) but found no decodable streams in it + (e.g. because it contains only media stream types for which we + have no decoders, or because it's not a media type). + +2004-09-23 Ronald S. Bultje + + * ext/dirac/Makefile.am: + * ext/dirac/gstdirac.cc: + * ext/dirac/gstdiracdec.cc: + * ext/dirac/gstdiracdec.h: + Do something. Don't actually know if this works because I don't + have a demuxer yet. + * ext/gsm/gstgsmdec.c: (gst_gsmdec_getcaps): + Add channels=1 to caps returned from _getcaps(). + * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_get_type), + (gst_ogm_video_parse_get_type), (gst_ogm_audio_parse_base_init), + (gst_ogm_video_parse_base_init), (gst_ogm_parse_init), + (gst_ogm_audio_parse_init), (gst_ogm_video_parse_init), + (gst_ogm_parse_sink_convert), (gst_ogm_parse_chain), + (gst_ogm_parse_change_state): + Separate between audio/video so ogmaudioparse actually uses the + audio pad templates. Both audio and video work now, including + autoplugging. Also use sometimes-srcpad hack. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): + Handle events better. Don't hang on infinite loops. + * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), + (gst_avi_demux_init), (gst_avi_demux_reset), + (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), + (gst_avi_demux_stream_header), (gst_avi_demux_stream_data), + (gst_avi_demux_change_state): + * gst/avi/gstavidemux.h: + Improve A/V sync. Still not perfect. + * gst/matroska/ebml-read.c: (gst_ebml_read_seek), + (gst_ebml_read_skip): + Handle events better. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (gst_qtdemux_loop_header), (qtdemux_parse_trak), + (qtdemux_audio_caps): + Add IMA4. Improve event handling. Save offset after a seek when + the headers are at the end of the file so that we don't end up in + an infinite loop. + * gst/typefind/gsttypefindfunctions.c: (qt_type_find): + Add low-priority typefind support for files with no length. + +2004-09-23 Zaheer Abbas Merali + + * testsuite/multifilesink/Makefile.am: + fix typo + +2004-09-22 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls): Fix + mistakes from thaytan's patches. + +2004-09-23 Jan Schmidt + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): + For completeness, XSync in the destroy function as xvimage does. + +2004-09-23 Jan Schmidt + + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_getcaps): + Correct caps negotiation + * gst/volume/gstvolume.c: (volume_chain_float), + (volume_chain_int16): + Modify debug output to be little more informative + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_destroy): + Add XSync calls after detaching from the shared memory segment to + avoid a crash. + +2004-09-22 Zaheer Abbas Merali + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), + (gst_ogg_mux_next_buffer), (gst_ogg_mux_loop): + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_init), + (gst_vorbisenc_chain): + * ext/vorbis/vorbisenc.h: + remove explicit newmedia support from oggmux and vorbisenc + add debug category to vorbisenc + * gst/multifilesink/gstmultifilesink.c: + (gst_multifilesink_class_init), (gst_multifilesink_init), + (gst_multifilesink_dispose), (gst_multifilesink_set_location), + (gst_multifilesink_set_property), (gst_multifilesink_next_file), + (gst_multifilesink_handle_event), (gst_multifilesink_chain), + (plugin_init): + * gst/multifilesink/gstmultifilesink.h: + add support for streamheader in multifilesink + +2004-09-22 Ronald S. Bultje + + * gst/asfdemux/gstasfdemux.c: (_read_var_length), (_read_guid), + (gst_asf_demux_process_segment), (gst_asf_demux_handle_data), + (gst_asf_demux_process_chunk), (gst_asf_demux_handle_sink_event): + Prevent infinite loops. More correct error reporting. + * gst/auparse/gstauparse.c: (gst_auparse_chain): + Error out if negotiation fails. + * gst/playback/gstplaybasebin.c: (setup_source), + (gst_play_base_bin_change_state), (gst_play_base_bin_error), + (gst_play_base_bin_found_tag): + Error/tag forwarding. Pre-roll fixes for source errors on state + changes (e.g. "file does not exist") to prevent hangs. + +2004-09-21 Zaheer Abbas Merali + + * testsuite/multifilesink/Makefile.am: + * testsuite/multifilesink/lame_test.c: (gst_newmedia_base_init), + (gst_newmedia_class_init), (gst_newmedia_init), + (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), + (newfile_signal), (test_signal), (main): + * testsuite/multifilesink/multifilesrc_test.c: (main): + * testsuite/multifilesink/oggtheora_test.c: + (gst_newmedia_base_init), (gst_newmedia_class_init), + (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), + (test_format), (newfile_signal), (test_signal), (main): + * testsuite/multifilesink/oggvorbis_test.c: + (gst_newmedia_base_init), (gst_newmedia_class_init), + (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), + (test_format), (newfile_signal), (test_signal), (main): + * testsuite/multifilesink/wavenc_test.c: (gst_newmedia_base_init), + (gst_newmedia_class_init), (gst_newmedia_init), + (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), + (newfile_signal), (test_signal), (main): + New media tests + +2004-09-20 Christian Schaller + + * Fix mikmod license to LGPL as they have relicensed + * Move Dirac and Effectv into LGPL section of README_license + +2004-09-20 Ronald S. Bultje + + * ext/mad/gstmad.c: (gst_mad_check_caps_reset), + (gst_mad_change_state): + Allow for mp3 rate/channels changes. However, only very + conservatively. Reason that we *have* to enable this is smiply + because the mad find_sync() function is not good enough, it will + regularly sync on random data as valid frames and therefore make + us provide random caps as *final* caps of the stream. The best fix + I could think of is to simply require several of the same stream + changes in a row before we change caps. + The actual testcase that works now is # + * ext/ogg/Makefile.am: + * ext/ogg/gstogg.c: (plugin_init): + * ext/ogg/gstogmparse.c: + OGM support (video only for now; I need an audio sample file). + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_process_stream), (gst_asf_demux_video_caps), + (gst_asf_demux_add_video_stream): + WMV extradata. + * gst/playback/gstplaybasebin.c: (unknown_type): + Don't error out on single unknown-types after all. It's wrong. + If we found type of video and audio but not of a subtitle stream, + it will still error out (which is unwanted). Will find a better fix + later on. + * gst/typefind/gsttypefindfunctions.c: (ogmvideo_type_find), + (ogmaudio_type_find), (plugin_init): + OGM support. + +2004-09-20 Johan Dahlin + + * ext/jpeg/gstjpegdec.c (gst_jpegdec_chain): Allocate the buffer + after setting caps. + +2004-09-19 Zaheer Abbas Merali + + * gst/wavenc/gstwavenc.c: (gst_wavenc_init), (gst_wavenc_chain): + * gst/wavenc/gstwavenc.h: + Added newmedia support to wavenc + +2004-09-17 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_fd_has_closed), + (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), + (gst_fdset_fd_can_write), (gst_fdset_wait): + * gst/tcp/gstmultifdsink.c: (gst_client_status_get_type), + (gst_multifdsink_init), (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_get_stats), + (gst_multifdsink_remove_client_link), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_handle_clients), + (gst_multifdsink_close), (gst_multifdsink_change_state): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_removed): + Small cleanups in fdset.c + Use a hastable to map fd to the client structure for faster + lookup in _remove and get_stats. + Added virtual function to close the fds. + Handle clients even when the select/poll call was unblocked because + of a command. + Implement syncing to keyframe in the recovery procedure. + +2004-09-16 Iain + + * gst/audioconvert/gstaudioconvert.c (_fixate_caps_to_int): Free the + try caps. + +2004-09-15 Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream): + Caps are only set if the type of the stream is unknown, but this + is initialized in ->init_stream(), so set to UNKNOWN after calling + ->init_stream() so that capsnego starts. + +2004-09-15 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_stream_data): + Just hardcode for raw audio then. AVI audio sucks. + +2004-09-15 Arwed v. Merkatz + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): + * gst/matroska/matroska-mux.c: (audiosink_templ), + (gst_matroska_mux_audio_pad_link): + * gst/typefind/gsttypefindfunctions.c: (tta_caps), (plugin_init): + Use audio/x-ttafile for tta files and audio/x-tta for raw tta frames. + +2004-09-15 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_stream_data): + Try to fix a/v sync issues. + +2004-09-15 David Schleef + + * configure.ac: remove NASM check, since we don't use it. Update + dirac check to 0.4 + * ext/dirac/gstdiracdec.cc: update to current 0.4 API + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + Initialized variables. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_header), (qtdemux_parse), (qtdemux_parse_trak), + (gst_qtdemux_handle_esds), (qtdemux_audio_caps): Fix seeking, add + SVQ3 format + +2004-09-15 Ronald S. Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_add_stream), (gst_avi_demux_stream_data): + * gst/avi/gstavidemux.h: + Fix for compressed audio (mp3) timestamp generation. How did this + ever work? + +2004-09-15 Ronald S. Bultje + + * gst/playback/gstplaybin.c: (gst_play_bin_get_property): + Volume is a double not a float. + +2004-09-15 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_remove_client_link), + (gst_multifdsink_handle_clients), (gst_multifdsink_change_state): + Don't close the fd in multifdsink as we didn't open it in the + first place. Some cleanups. + +2004-09-15 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): + Fix the case where the muxer would mark pages as delta + frames when they are not (vorbis only ogg). + +2004-09-15 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: (state_change), (setup_source), + (gst_play_base_bin_change_state): + Handle the case where we failed to setup a clear pipeline. This + will throw an error (or EOS, another nice case) and if you don't + catch that, the app will wait for the signal forever (and thus + hang). + +2004-09-15 Ronald S. Bultje + + * ext/gnomevfs/gstgnomevfssink.c: + (gst_gnomevfssink_uri_get_protocols): + * ext/gnomevfs/gstgnomevfssrc.c: + (gst_gnomevfssrc_uri_get_protocols): + * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris): + * ext/gnomevfs/gstgnomevfsuri.h: + Use _uri_new() instead of _open(), so it doesn't take as long and + Christophe's computer won't hang. + * gst/playback/gstplaybasebin.c: (unknown_type): + Throw error on unknown media type, so apps actually display it. + +2004-09-14 Brian Cameron + + * gst/playback/gstplaybasebin.c: (queue_overrun), (no_more_pads), + (setup_source), (gst_play_base_bin_set_property), + (gst_play_base_bin_add_element): + * gst/playback/gstplaybin.c: (gst_play_bin_send_event): + Some more work on making sure seeking pauses the pipeline and + that changing the uri actually does something. + +2004-09-17 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_wait): + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_close): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init_send), + (gst_tcpserversink_close): + Be a bit more paranoid when freeing memory. + +2004-09-13 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), + (qtdemux_parse_trak): + Don't crash by dividing by zero (see sample movie in #126922). + +2004-09-13 Ronald S. Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Don't touch non-existing data (fixes crash on file in #140147). + +2004-09-13 Ronald S. Bultje + + * gst/playback/gstplaybasebin.c: + (gst_play_base_bin_dispose), (gst_play_base_bin_set_property): + Handle double disposals, and proper change of URIs. + +2004-09-13 Martin Eikermann + + * gst/mpegstream/gstmpegparse.c: + fix synchronistation for streams recorded from digital PCR + fixes bug #119376 + +2004-09-13 Ronald S. Bultje + + * ext/gnomevfs/Makefile.am: + * ext/gnomevfs/gstgnomevfs.c: (plugin_init): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_get_type), + (gst_gnomevfssink_dispose), (gst_gnomevfssink_init), + (gst_gnomevfssink_uri_get_type), + (gst_gnomevfssink_uri_get_protocols), + (gst_gnomevfssink_uri_get_uri), (gst_gnomevfssink_uri_set_uri), + (gst_gnomevfssink_uri_handler_init), + (gst_gnomevfssink_set_property), (gst_gnomevfssink_get_property), + (gst_gnomevfssink_open_file), (gst_gnomevfssink_close_file): + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get_type), + (gst_gnomevfssrc_init), (gst_gnomevfssrc_dispose), + (gst_gnomevfssrc_uri_get_type), + (gst_gnomevfssrc_uri_get_protocols), (gst_gnomevfssrc_uri_get_uri), + (gst_gnomevfssrc_uri_set_uri), (gst_gnomevfssrc_uri_handler_init), + (gst_gnomevfssrc_set_property), (gst_gnomevfssrc_get_property), + (gst_gnomevfssrc_open_file), (gst_gnomevfssrc_close_file): + * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris): + * ext/gnomevfs/gstgnomevfsuri.h: + Add URI support to Gnome-VFS plugins. Tries to load a fixed list + of fake URIs to see which this version of Gnome-VFS likes, and + uses that for the Gst-URI interface. Makes playbin support http:// + streams. Also fix up some stupid behaviour in gnomevfssrc. + +2004-09-13 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_update), + (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), + (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), + (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): + Update mixer (to sync with other sessions) if we try to obtain + a new value. This makes alsamixer work accross applications. + * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): + Only call sync functions if we're running, else alsalib asserts. + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query): + Sometimes fails to compile. Possibly a gcc bug. + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): + Add a reference to an application-provided object, because we lose + this same reference if we add it to the bin. If we don't do this, + we can only use this object once and thus crash if we go from + ready to playing, back to ready and back to playing again. + Also add an audioscale element because several cheap soundcards - + like mine - don't support all samplerates. + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), + (gst_ximagesink_xcontext_clear), (gst_ximagesink_change_state): + Fix wrong order or PAR calls. Makes automatically obtained PAR + from the X server atually being used. + +2004-09-12 David Schleef + + Fixes: #151879, #151881, #151882, #151883, #151884, #151886, + #151887, #152102, #152247. + * examples/indexing/indexmpeg.c: 64-bit warning fixes. + * examples/seeking/cdparanoia.c: same + * examples/seeking/cdplayer.c: same + * examples/seeking/seek.c: same + * examples/seeking/spider_seek.c: same + * examples/seeking/vorbisfile.c: same + * examples/stats/mp2ogg.c: same + * ext/esd/esdsink.c: (gst_esdsink_class_init), + (gst_esdsink_dispose): Dispose of element properly. + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_seek): 64-bit warning + fixes. + * ext/nas/nassink.c: (gst_nassink_class_init), + (gst_nassink_dispose): Dispose of element correctly. + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Fix leak. + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy): + Fix 64-bit warning. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy): + Fix 64-bit warning. + +2004-09-12 Stephane Loeuillet + + * configure.ac : change speex detection as 1.1.6 now uses + .pc/pkg-config and they changed their headers location. + +2004-09-09 Arwed v. Merkatz + + * gst/matroska/matroska-mux.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), + (gst_matroska_mux_start), (gst_matroska_mux_finish), + (gst_matroska_mux_write_data): + Write multiple blocks/frames per cluster. + Write meta-seek information (seek heads). + +2004-09-09 Scott Wheeler + + * gst/gstplaybin.c: (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_set_property), (gst_play_bin_get_property), + (gen_audio_element), (gen_audio_element): + Add a volume element / property to the pipeline. + +2004-09-07 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_blend_buffers): + Copy timestamps from the master pad to the output buffers. + +2004-09-03 Thomas Vander Stichele + + * ext/raw1394/gstdv1394src.c: + throw errors when applicable + +2004-09-01 Arwed v. Merkatz + + * gst/matroska/ebml-ids.h: + * gst/matroska/ebml-read.c: (gst_ebml_read_date): + * gst/matroska/ebml-write.c: (gst_ebml_write_date): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_finish): + automatically convert unix time <-> ebml time when reading/writing + a date, use gst_ebml_write_uint to write CUETIME, + not gst_ebml_write_date. + * gst/matroska/matroska-ids.h: + * gst/matroska/matroska-mux.c: (gst_matroska_mux_create_uid), + (gst_matroska_mux_reset), (gst_matroska_mux_audio_pad_link), + (gst_matroska_mux_track_header), (gst_matroska_mux_start), + (gst_matroska_mux_write_data): + Write track and segment UIDs, write muxing date, write + TRACKDEFAULTDURATION for TTA audio, write BLOCKDURATION if known. + Create cues for audio only files. + +2004-08-31 Ronald S. Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): + Re-commit ALSA switches. + * gst/adder/gstadder.c: (gst_adder_loop): + 64-bit fix (#151416). + * gst/debug/progressreport.c: (gst_progressreport_report): + 64-bit fix (#151419). + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_contents): + 64-bit fix (#151420). + * gst/playback/test3.c: (update_scale): + 64-bit fix (#151421). + +2004-08-31 Thomas Vander Stichele + + * configure.ac: + bump nano to cvs + +=== release 0.8.4 === + +2004-08-02 Thomas Vander Stichele + + * configure.ac: releasing 0.8.4, "Alias" + +2004-08-31 Thomas Vander Stichele + + * ext/theora/Makefile.am: + fix makefile. Fixes #151462. + +2004-08-30 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_free), (gst_fdset_wait): + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_remove_client_link), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write): + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_init_send): + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init_receive): + Fix some memory leaks. + +2004-08-30 Thomas Vander Stichele + + Patch by: David Schleef + + * configure.ac: + * sys/Makefile.am: + rename our detection macro for V4L2. Fixes #151236. + +2004-08-30 Thomas Vander Stichele + + Patch by: David Schleef + + * configure.ac: + check to define LAMEPRESET. Fixes #151232. + +2004-08-27 David Schleef + + * sys/glsink/glimagesink.c: (gst_glimagesink_ximage_put), + (gst_glimagesink_xwindow_new), (gst_glimagesink_xcontext_get), + (gst_glimagesink_fixate): Move local variable declarations to + make gcc-2.95 happy. + +2004-08-27 Thomas Vander Stichele + + * configure.ac: + bump nano for prerelease + +2004-08-27 David Schleef + + * sys/sunaudio/Makefile.am: Add sunaudiosrc patch from Bala + * sys/sunaudio/gstsunaudiosrc.c: + * sys/sunaudio/gstsunaudiosrc.h: + +2004-08-27 Arwed v. Merkatz + + * gst/matroska/ebml-read.c: (gst_ebml_peed_id), (gst_ebml_read_element_id), + handle EOS correctly + * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_link): + * gst/matroska/matroska-mux.h: + added BITMAPINFOHEADER structure, mux video/x-divx and video/x-xvid in + VFW compatibility mode + +2004-08-27 Thomas Vander Stichele + + patch by: Zaheer Abbas Merali + + * ext/ogg/gstoggmux.c: + * ext/vorbis/vorbisenc.c: + * ext/vorbis/vorbisenc.h: + handle NEWMEDIA + +2004-08-26 Arwed v. Merkatz + + * gst/matroska/ebml-write.c: (gst_ebml_write_float), + fix byte order reversion on little endian machines. + * gst/matroska/matroska-mux.c: (audiosink_templ), + (gst_matroska_mux_audio_pad_link): + add TTA codec to the list of supported codecs. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_init), + (gst_matroska_mux_start), (gst_matroska_mux_finish), + (gst_matroska_mux_write_data): + * gst/matroska/matroska-mux.h: + write segment duration correctly, write muxing app string, fixes bugs + #140897 and #140898. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_loop), + wait for all pads to be negotiated before starting to mux. + +2004-08-26 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_init), (gst_lame_chain): + * ext/lame/gstlame.h: + Added new media support to lame + +2004-08-25 Arwed v. Merkatz + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup), + send vorbis headers at the beginning of a stream, fixes bug #141554. + Interpret BLOCKDURATION and set buffer duration accordingly, fixes + bug #148950. + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps), + (gst_matroska_demux_plugin_init): + * gst/matroska/matroska-ids.h: + enable demuxing of TTA audio streams, fixes bug #148951. + * gst/typefind/gsttypefindfunctions.c: (tta_type_find), (plugin_init), + enable typefinding for TTA audio files, fixes bug #148711. + * ext/xvid/gstxviddec.c: (gst_xviddec_chain), + set XVID_LOWDELAY flag for decoding so xvid always returns an image, + fixes playback of packed bitstream and xvid with bframes, bug #135407. + +2004-08-24 Sebastien Cote + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), + (gst_riff_read_element_data), (gst_riff_read_seek), + (gst_riff_read_skip): fix infinite loop in wavparse, fixes bug + #144616, patch reviewed by Ronald and committed by Christophe Fergeau + + +2004-08-23 Iain + + * ext/mad/gstid3tag.c (gst_mad_id3_to_tag_list): Special case COMM + tags. They appear to be handled differently to normal. + (tag_list_to_id3_tag_foreach): Ditto. + +2004-08-22 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): + Make sure we never send -1 granulepos. + +2004-08-20 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_loop): + I will accept bitchslappings with non sharp objects. + +2004-08-20 Zaheer Abbas Merali + + * configure.ac: + Clean up the test for lame presets + +2004-08-19 Zaheer Abbas Merali + + * configure.ac: + * ext/lame/Makefile.am: + * ext/lame/gstlame.c: (gst_lame_class_init), + (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): + Only enable lame presets if version of lame has presets in API + +2004-08-19 Jan Schmidt + * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_get): + * gst/udp/gstudpsrc.h: + Don't call gst_pad_push in a get function. Fixes #150449 + +2004-08-18 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_free), (gst_fdset_set_mode), + (gst_fdset_get_mode), (gst_fdset_add_fd), (gst_fdset_remove_fd), + (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), + (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), + (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), + (gst_fdset_wait): + * gst/tcp/gstfdset.h: + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write): + * gst/tcp/gstmultifdsink.h: + Some extra checks in gstfdset. + Only use send() when the fd is a socket. Don't try to + read from write only fds. + +2004-08-18 Wim Taymans + + * gst/tcp/gstfdset.c: (gst_fdset_add_fd), (gst_fdset_remove_fd), + (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), + (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), + (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), + (gst_fdset_wait): + Add more locking and bounds checking. + +2004-08-18 Wim Taymans + + * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_wait): + Realloc test fdset in the lock and right before starting + the poll call. Bump the limit to 4096. + +2004-08-17 David Schleef + + * sys/sunaudio/Makefile.am: + * sys/sunaudio/gstsunaudio.c: Fix caps to handle full range + of rates and channels. Make debugging less obnoxious. + + Patch from Balamurali Viswanathan implementing a mixer for + Sun audio. (bug #144091): + * sys/sunaudio/gstsunelement.c: + * sys/sunaudio/gstsunelement.h: + * sys/sunaudio/gstsunmixer.c: + * sys/sunaudio/gstsunmixer.h: + +2004-08-17 Zaheer Abbas Merali + + * gst/audioscale/gstaudioscale.c: + * gst/audioscale/gstaudioscale.h: + made audioscale resample from any sample rate to any sample rate + +2004-08-17 Thomas Vander Stichele + + * ext/libpng/gstpngdec.c: + error out on unsupported types + +2004-08-17 Iain + + * ext/flac/gstflacenc.c (gst_flacenc_update_quality): Only set the + mid_side and loose_mid_side properties if its a stereo stream. + +2004-08-17 Wim Taymans + + * ext/theora/theoradec.c: (gst_theora_dec_class_init), + (theora_get_formats), (theora_dec_src_convert), + (theora_dec_sink_convert), (theora_dec_src_query), + (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): + Add a debug line. + +2004-08-17 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate), + (gst_ogg_pad_push): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), + (gst_ogg_mux_request_new_pad), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_buffer_from_page), (gst_ogg_mux_push_page), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): + Mark delta units in the muxer. + Try to decode the packet after an out-of-sync error from + libogg. + +2004-08-17 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_add), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_set_property), (gst_multifdsink_get_property): + * gst/tcp/gstmultifdsink.h: + Added option to send a keyframe to clients as the first buffer. + Make timeout property writable. + +2004-08-17 Thomas Vander Stichele + + patch by: Wim Taymans + + * gst/tcp/gstfdset.c: + * gst/tcp/gstmultifdsink.c: + fix index comparison, should include 0 + +2004-08-16 Wim Taymans + + * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_new), + (gst_fdset_add_fd), (gst_fdset_remove_fd), + (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), + (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), + (gst_fdset_wait): + copy when reallocing for poll so the select arguments don't get + changed during the call + +2004-08-16 Wim Taymans + + * ext/theora/theoraenc.c: (gst_border_mode_get_type), + (gst_theora_enc_class_init), (theora_enc_sink_link), + (theora_buffer_from_packet), (theora_enc_chain): + Fix bug where buffers were not marked as keyframes + correctly. + +2004-08-15 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_vbrmode_get_type), + (gst_lame_preset_get_type), (gst_lame_class_init): + describe the enum values for vbr mode and presets more verbosely + +2004-08-13 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_mode_get_type), + (gst_lame_quality_get_type), (gst_lame_padding_get_type), + (gst_lame_preset_get_type), (gst_lame_class_init), (gst_lame_init), + (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): + * ext/lame/gstlame.h: + add preset property to lame so it can use lame presets + +2004-08-13 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_get_property): + whoops forgot break, thanks teuf + +2004-08-13 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_vbrmode_get_type), + (gst_lame_class_init), (gst_lame_src_getcaps), + (gst_lame_sink_link), (gst_lame_init), (gst_lame_set_property), + (gst_lame_get_property), (gst_lame_setup): + * ext/lame/gstlame.h: + fix lame's broken vbr stuff, allow it to resample if need be, and also + make xing header optional + +2004-08-12 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_src_getcaps), (gst_lame_init): + added getcaps function so samplerate doesnt get fixated to silly values + +2004-08-12 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_src_link): + revert previous fix + +2004-08-12 Johan Dahlin + + * sys/v4l/gstv4lelement.c (gst_v4l_iface_supported): Remove bogus + checks. Doesn't matter what state we are in. Interfaces are a + compile time thing, not runtime. It also broke the python bindings. + +2004-08-12 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_src_link): + made source pad link function check if sinkpad is ok..fixes the problem + where core fixates the output rate of lame stupidly + +2004-08-12 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_fixate): + * sys/v4l/v4l_calls.c: + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_set_capture): + fix fixate function to handle nonsimple caps. + remove bogus check in _link + cleanups + +2004-08-12 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_init): + set default compression ratio parameter to 0.0 so bitrate parameter + works :) + +2004-08-11 David Schleef + + * gst/tcp/gstfdset.c: Fix compile problem on OS/X. + +2004-08-11 David Schleef + + * gst/mpeg1sys/gstmpeg1systemencode.c: Oops, this was correct + before. + +2004-08-11 David Schleef + + * gst-libs/gst/video/videosink.h: Change copyright block to LGPL. + +2004-08-11 David Schleef + + * ext/pango/gsttextoverlay.c: Add copyright block and fix plugin + license field + * gst-libs/gst/idct/Makefile.am: Remove mmx/sse code + * gst-libs/gst/video/gstvideosink.c: Change copyright block to + LGPL. + * gst/auparse/gstauparse.c: Fix plugin license field. + * gst/monoscope/gstmonoscope.c: Fix plugin license field. + * gst/mpeg1sys/gstmpeg1systemencode.c: Fix plugin license field. + * gst/rtp/gstrtp.c: Fix plugin license field. + +2004-08-11 Wim Taymans + + * gst/tcp/Makefile.am: + * gst/tcp/gstfdset.c: (gst_fdset_mode_get_type), (nearest_pow), + (ensure_size), (gst_fdset_new), (gst_fdset_free), + (gst_fdset_set_mode), (gst_fdset_get_mode), (gst_fdset_add_fd), + (gst_fdset_remove_fd), (gst_fdset_fd_ctl_write), + (gst_fdset_fd_ctl_read), (gst_fdset_fd_has_closed), + (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), + (gst_fdset_fd_can_write), (gst_fdset_wait): + * gst/tcp/gstfdset.h: + * gst/tcp/gstmultifdsink.c: (gst_unit_type_get_type), + (gst_multifdsink_class_init), (gst_multifdsink_init), + (gst_multifdsink_add), (gst_multifdsink_remove), + (gst_multifdsink_clear), (gst_multifdsink_get_stats), + (gst_multifdsink_remove_client_link), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_caps), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), + (gst_multifdsink_get_property), (gst_multifdsink_init_send), + (gst_multifdsink_close): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_handle_wait), (gst_tcpserversink_init_send), + (gst_tcpserversink_close): + * gst/tcp/gsttcpserversink.h: + Abstracted away the select call, implemented poll (yes we ran into + the 1024 limit in production). + +2004-08-11 Thomas Vander Stichele + + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcpplugin.c: + improve debuggging, remove assert + +2004-08-10 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_unit_type_get_type), + (gst_client_status_get_type), (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_remove_client_link), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), + (gst_multifdsink_get_property): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcp-marshal.list: + Starting to prepare for specifying buffer time in other units + than buffers. Expose remove reason in signal. + +2004-08-10 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_clear), + (gst_multifdsink_remove_client_link), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), + (gst_multifdsink_chain), (gst_multifdsink_close): + * gst/tcp/gstmultifdsink.h: + Added more debugging info. Changed the way clients are + removed from the lists. Fixed a bug where a bad file descriptor + could cause many clients to be removed. + +2004-08-06 Benjamin Otte + + * gst/videotestsrc/gstvideotestsrc.c: (generate_capslist): + allow all pixel-aspect-ratios, not just 1:1 + +2004-08-09 David Schleef + + * sys/glsink/ARB_multitexture.h: Remove old files. + * sys/glsink/EXT_paletted_texture.h: + * sys/glsink/NV_register_combiners.h: + * sys/glsink/gstgl_nvimage.c: + * sys/glsink/gstgl_pdrimage.c: + * sys/glsink/gstgl_rgbimage.c: + * sys/glsink/gstglsink.c: + * sys/glsink/gstglsink.h: + * sys/glsink/gstglxwindow.c: + * sys/glsink/regcomb_yuvrgb.c: + +2004-08-09 David Schleef + + Patch from Gernot Ziegler rewriting the + GL sink plugin. (Bug #147302) + + * configure.ac: Test for OpenGL + * sys/Makefile.am: Use test for OpenGL + * sys/glsink/Makefile.am: + * sys/glsink/glimagesink.c: rewrite + * sys/glsink/glimagesink.h: rewrite + +2004-08-09 David Schleef + + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_base_init): Only allow + sane framerates. + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): same + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): same + * testsuite/gst-lint: Test for G_GUINT64_FORMAT usage near gettext. + +2004-08-09 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): + Do a bit more logging, make the client_read code more robust. + +2004-08-09 Thomas Vander Stichele + + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_init_source), + (gst_jpegdec_fill_input_buffer), (gst_jpegdec_skip_input_data), + (gst_jpegdec_resync_to_restart), (gst_jpegdec_term_source), + (gst_jpegdec_init), (gst_jpegdec_chain): + * gst/multipart/multipartdemux.c: (gst_multipart_demux_init), + (gst_multipart_demux_chain), (gst_multipart_demux_change_state): + cleanups, debugging fixes and memleak plugging + +2004-08-09 Wim Taymans + + * ext/theora/theoradec.c: (gst_theora_dec_class_init), + (theora_get_formats), (theora_dec_src_convert), + (theora_dec_sink_convert), (theora_dec_src_query), + (theora_dec_src_event), (theora_dec_event), (theora_dec_chain), + (theora_dec_change_state): + Don't crash on missing header packets. + +2004-08-09 Thomas Vander Stichele + + * po/LINGUAS: + * po/sq.po: + Added Albanian translation (Laurent Dhima) + * po/cs.po: + updated + +2004-08-09 Thomas Vander Stichele + + * ext/lame/gstlame.c: + fix/add debugging + +2004-08-09 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: + * sys/xvimage/xvimagesink.c: + assign all TOO_LAZY's to a real category. Thanks to Warthy Warthog. + +2004-08-06 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): + Make sure we don't try to read more from a client that what + ioctl says us or we deadlock. + +2004-08-05 Thomas Vander Stichele + + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_src_link), + (gst_videotestsrc_change_state), (gst_videotestsrc_src_query), + (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): + decouple running_time and n_frames so it can handle changing + framerate while running + +2004-08-05 Thomas Vander Stichele + + * po/nl.po: + * po/sv.po: + updated translations + +2004-08-04 Benjamin Otte + + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_get_capslist), (generate_capslist), + (plugin_init): + generate the list of supported caps at startup and reuse it instead + of always generating it + +2004-07-30 Benjamin Otte + + * gst/multipart/multipartmux.c: (gst_multipart_mux_pad_link): + whoops, last checkin broke normal build + +2004-08-03 Benjamin Otte + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_get_volume), + (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), + (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), + (gst_alsa_mixer_get_option): + * ext/dvdnav/dvdnavsrc.c: (dvdnav_get_event_name), + (dvdnavsrc_print_event): + * ext/ogg/gstoggdemux.c: (_find_chain_process), (gst_ogg_print): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_pad_link), + (gst_ogg_mux_pad_unlink): + * gst/multipart/multipartmux.c: (gst_multipart_mux_pad_link), + (gst_multipart_mux_pad_unlink): + * gst/videofilter/gstvideobalance.c: + (gst_videobalance_colorbalance_set_value): + * gst/videomixer/videomixer.c: (gst_videomixer_pad_link), + (gst_videomixer_pad_unlink): + * po/uk.po: + * sys/oss/gstossmixer.c: + * sys/v4l/gstv4lcolorbalance.c: + * sys/v4l/gstv4ltuner.c: + * sys/v4l/v4lsrc_calls.c: + * sys/v4l2/gstv4l2colorbalance.c: + * sys/v4l2/gstv4l2tuner.c: + compile fixes for --disable-gst-debug, G_DISABLE_ASSERT and friends + +2004-08-03 Benjamin Otte + + * examples/dynparams/filter.c: (ui_control_create): + * examples/gstplay/player.c: (print_tag): + * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad): + * ext/gdk_pixbuf/gstgdkanimation.c: + (gst_gdk_animation_iter_may_advance): + * ext/jack/gstjack.c: (gst_jack_request_new_pad): + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list), + (tag_list_to_id3_tag_foreach), (gst_id3_tag_handle_event): + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_tag_value): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value): + * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): + * gst-libs/gst/media-info/media-info-test.c: (print_tag): + * gst/sine/demo-dparams.c: (main): + * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): + * testsuite/alsa/formats.c: (create_pipeline): + * testsuite/alsa/sinesrc.c: (sinesrc_force_caps), (sinesrc_get): + fixes for G_DISABLE_ASSERT and friends + * gst/typefind/gsttypefindfunctions.c: (aac_type_find), + (mp3_type_frame_length_from_header), (mp3_type_find), + (plugin_init): + require mp3 typefinding to have at least MIN_HEADERS valid headers + add typefinding for AAC adts files + +2004-08-04 Jan Schmidt + + * sys/ximage/ximagesink.c: + (gst_ximagesink_calculate_pixel_aspect_ratio): + * sys/xvimage/xvimagesink.c: + (gst_xvimagesink_calculate_pixel_aspect_ratio): + Make sure we calculate pixel-aspect-ratio using floating point maths + +2004-08-03 Thomas Vander Stichele + + * po/uk.po: + updated translation + +2004-08-03 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get): + add debugging for display PAR calculation + +2004-08-02 David Schleef + + * configure.ac: Fix mikmod CFLAGS. + +2004-07-27 Benjamin Otte + + * gst/audioscale/gstaudioscale.c: + - fix templates to only support S16, it's the only format that works + - make caps nego code use try_set_caps_nonfixed and fixation instead + of try_set_caps twice, which is not nice for autopluggers + - change rank to secondary, so autopluggers can pick it up after + audioconvert + +2004-08-02 Iain + + * gst/interleave/interleave.c (interleave_init), + (interleave_request_new_pad), + (interleave_pad_removed), + (interleave_buffered_loop): Use the real pad count, not the artificial + one. + +2004-08-02 Thomas Vander Stichele + + * configure.ac: bump nano back to development + +=== release 0.8.3 === + +2004-08-02 Thomas Vander Stichele + + * configure.ac: releasing 0.8.3, "Water" + +2004-08-02 Thomas Vander Stichele + + * sys/xvimage/xvimagesink.c: + (gst_xvimagesink_calculate_pixel_aspect_ratio), + (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_sink_link), + (gst_xvimagesink_change_state), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), + (gst_xvimagesink_init), (gst_xvimagesink_class_init): + * sys/xvimage/xvimagesink.h: + apply similar PAR fixes as to ximagesink + +2004-08-02 Thomas Vander Stichele + + patch from: Benjamin Otte + + * ext/lame/gstlame.c: (gst_lame_src_link), (gst_lame_init): + add link function to lame. Fixes #148986. + +2004-08-02 Johan Dahlin + + * gst/multipart/multipartmux.c (gst_multipart_mux_next_buffer): + fix debugging log + +2004-07-30 David Schleef + + * gst/videomixer/Makefile.am: Fix things that should have been + fixed in the last checkin. + +2004-07-30 David Schleef + + * gst/multipart/Makefile.am: Fix things that should have been + fixed in the last checkin. + +2004-07-30 David Schleef + + * testsuite/multifilesink/Makefile.am: Fix unused variable. + +2004-07-30 Thomas Vander Stichele + + * configure.ac: + bump nano for prerelease + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/nl.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + updates + +2004-07-30 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_remove), + (gst_multifdsink_clear), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): + * gst/tcp/gstmultifdsink.h: + Recover from a select with a bad file descriptor by removing + the client. + +2004-07-30 Thomas Vander Stichele + + * configure.ac: + fix requirement of core + * gst-libs/gst/play/play.c: (gst_play_error_plugin), + (gst_play_pipeline_setup): + don't use colorspace element. do use hermescolorspace element. + make macro to get a colorspace element. + mark strings for translation. + * po/POTFILES.in: + add play.c + * po/af.po: + * po/az.po: + * po/cs.po: + * po/en_GB.po: + * po/hu.po: + * po/nl.po: + * po/sr.po: + * po/sv.po: + * po/uk.po: + update translations + +2004-07-30 Zaheer Abbas Merali + + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init): + fix default for newmedia flag + +2004-07-30 Wim Taymans + + * ext/theora/theoradec.c: (gst_theora_dec_class_init), + (gst_theora_dec_init), (theora_get_formats), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain), (theora_dec_set_property), + (theora_dec_get_property): + * ext/theora/theoraenc.c: (gst_border_mode_get_type), + (gst_theora_enc_class_init), (gst_theora_enc_init), + (theora_enc_sink_link), (theora_enc_chain), + (theora_enc_set_property), (theora_enc_get_property): + Added cropping option to theora decoder. + Added border option to theora encoder. + +2004-07-30 Zaheer Abbas Merali + + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), + (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), + (gst_pngenc_set_property): + * ext/libpng/gstpngenc.h: + Added newmedia support to pngenc so now gst-launch-0.8 videotestsrc ! ffmpegcolorspace ! pngenc snapshot=false newmedia=true ! multifilesink location=blah%d.png works as expected + +2004-07-30 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_enc_chain), + (theora_enc_set_property), (theora_enc_get_property): + Fix encoding of non-multiple-of-16 video. + +2004-07-29 David Schleef + + * configure.ac: make test for audiofile more strict + +2004-07-25 Benjamin Otte + + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + give different names to typefind functions + +2004-07-28 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_calculate_pixel_aspect_ratio), + (gst_ximagesink_xcontext_get), (gst_ximagesink_getcaps), + (gst_ximagesink_sink_link), (gst_ximagesink_change_state), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_set_property), + (gst_ximagesink_get_property), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: + allocate PAR's dynamically. + use autodetected PAR if no object-set PAR is given. + add workaround for directfb's X not setting physical size. + fix to xvimagesink will follow tomorrow. + +2004-07-28 Zaheer Abbas Merali + + * ext/lame/gstlame.c: (gst_lame_chain): send tag events downstream + * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type), + (gst_shout2send_get_type), (gst_shout2send_set_clock), + (gst_shout2send_class_init), (gst_shout2send_init), + (set_shout_metadata), (gst_shout2send_set_metadata), + (gst_shout2send_chain), (gst_shout2send_set_property), + (gst_shout2send_get_property), (gst_shout2send_connect), + (gst_shout2send_change_state): + * ext/shout2/gstshout2.h: + - fix for sending mp3 audio to icecast2 server, if pad link function not + called before PAUSED state + - added option to use GStreamer clock sync (as opposed to libshout's own sync) + - added tagging support for mp3 audio broadcasted + * gst/monoscope/gstmonoscope.c: (gst_monoscope_class_init): + debug info + +2004-07-28 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), + (gst_ogg_demux_push): + Return query failure when we don't know the length of + an ogg stream insteda of returning TRUE with a bogus value. + +2004-07-28 Wim Taymans + + * ext/theora/theoradec.c: (theora_get_formats), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain): + Don't screw up the 1 Chroma for 1 luma sample situation when we + have an odd offset/width by adding a black border in those cases. + +2004-07-28 Wim Taymans + + * ext/theora/theoradec.c: (theora_get_formats), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain): + * ext/theora/theoraenc.c: (theora_enc_sink_link): + Added first attempt at cropping of the image as required by the + theora spec. We need more properties in the caps (offset_x, + offset_y,stride) to implement this correctly. + +2004-07-28 Jan Schmidt + + * ext/dvdnav/README: + Update the README to use dvddemux + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_getcaps): + Ensure getcaps returns a subset of the template caps + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_base_init), + (gst_mpeg2subt_init): + Ensure getcaps returns a subset of the template caps + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), + (gst_dvd_demux_init), (gst_dvd_demux_get_video_stream), + (gst_dvd_demux_get_subpicture_stream), + (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_set_cur_subpicture): + * gst/mpegstream/gstdvddemux.h: + Set the explicit caps on the current_video pad before pushing + anything + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream): + Free caps used to gst_pad_set_explicit_caps, which takes a const + GstCaps * + +2004-07-28 Thomas Vander Stichele + + * configure.ac: update GStreamer requirement to 0.8.4 because of + GstFraction. + +2004-07-28 Wim Taymans + + * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt), + (gst_wavparse_handle_seek), (gst_wavparse_srcpad_event): + Add the pad to the element after setting up the caps. This + makes it a lot easier to autoplug. + +2004-07-27 Steve Lhomme + + * gst/median/gstmedian.c: + * gst/mpeg2subt/gstmpeg2subt.c: + * gst/mpegaudioparse/gstmpegaudioparse.c: + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegpacketize.c: + * gst/rtjpeg/gstrtjpeg.c: + * gst/rtjpeg/gstrtjpegdec.c: + * gst/rtjpeg/gstrtjpegenc.c: + * gst/sine/gstsinesrc.c: + * gst/smooth/gstsmooth.c: + * gst/smpte/gstsmpte.c: + * gst/smpte/gstsmpte.h: + * gst/stereo/gststereo.c: + * gst/videofilter/gstgamma.c: + * gst/videofilter/gstvideobalance.c: + * gst/videofilter/gstvideofilter.c: + * gst/videofilter/gstvideoflip.c: + * gst/videoscale/gstvideoscale.c: + * gst/videoscale/videoscale.c: + * gst/videotestsrc/gstvideotestsrc.c: + * gst/videotestsrc/videotestsrc.c: + * gst/wavenc/gstwavenc.c: + * gst/wavparse/gstwavparse.c: + fix local includes and 64 bits constants + +2004-07-27 Steve Lhomme + + * win32/gst.sln: + * gst-libs/gst/*/*.vcproj: + * gst/*/*.vcproj: + more working plugins + +2004-07-27 Zaheer Abbas Merali + + * testsuite/alsa/Makefile.am: + * testsuite/alsa/srcstate.c: + add test for alsasrc changing state + +2004-07-27 Zaheer Abbas Merali + + * gst/silence/gstsilence.c: (gst_silence_init), (gst_silence_link), + (gst_silence_get): + * gst/silence/gstsilence.h: + fix silence generation for 16bit raw audio + +2004-07-27 Thomas Vander Stichele + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_metadata), + (gst_matroska_demux_video_caps), (gst_matroska_demux_plugin_init): + * gst/mpegaudio/common.c: + * gst/videoscale/gstvideoscale.c: (gst_videoscale_class_init), + (gst_videoscale_getcaps), (gst_videoscale_link), + (gst_videoscale_src_fixate), (gst_videoscale_init), + (gst_videoscale_finalize): + * gst/videoscale/gstvideoscale.h: + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_get_capslist): + * gst/wavenc/gstwavenc.c: + * sys/oss/gstossmixer.c: (fill_labels): + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_handle_xevents), + (gst_ximagesink_calculate_pixel_aspect_ratio), + (gst_ximagesink_xcontext_get), (gst_ximagesink_fixate), + (gst_ximagesink_getcaps), (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), + (gst_ximagesink_set_property), (gst_ximagesink_get_property), + (gst_ximagesink_init), (gst_ximagesink_class_init): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: + (gst_xvimagesink_calculate_pixel_aspect_ratio), + (gst_xvimagesink_xcontext_get), (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), + (gst_xvimagesink_init), (gst_xvimagesink_class_init): + * sys/xvimage/xvimagesink.h: + first batch of pixel aspect ratio commits. + +2004-07-27 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_class_init), (gst_ffmpegcolorspace_chain): + * gst/ffmpegcolorspace/imgconvert.c: (avpicture_fill): + handle stride, needs work if we want to move stride handling + upstream, but works correctly for our purposes. + +2004-07-27 Thomas Vander Stichele + + * gst/videoscale/README: + add testing examples + * gst/videoscale/gstvideoscale.c: (gst_videoscale_link), + (gst_videoscale_chain): + * gst/videoscale/videoscale.c: (gst_videoscale_setup), + (gst_videoscale_get_size): + add get_size function that handles stride like videotestsrc. + fixes conversion for YUV formats for as much as I can test them. + +2004-07-27 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_xvimage_put): + further cleanups, logging, error handling and synchronizing + +2004-07-27 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), + (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_property), + (gst_videomixer_pad_set_property), + (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_init), + (gst_video_mixer_background_get_type), (gst_videomixer_get_type), + (gst_videomixer_class_init), (gst_videomixer_init), + (gst_videomixer_getcaps), (gst_videomixer_request_new_pad), + (gst_videomixer_blend_ayuv_i420), (pad_zorder_compare), + (gst_videomixer_sort_pads), (gst_videomixer_fill_checker), + (gst_videomixer_fill_color), (gst_videomixer_fill_queues), + (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), + (gst_videomixer_loop), (plugin_init): + Be a nicer negotiation citizen and provide a getcaps function on + the srcpad. This also fixes a crash when resizing. + +2004-07-27 Julien MOUTTE + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new): Some fixes to image size calculation. + +2004-07-27 Wim Taymans + + * ext/libpng/gstpngdec.c: (gst_pngdec_src_getcaps): + * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), + (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), + (gst_pngenc_set_property): + * ext/libpng/gstpngenc.h: + Added snapshot property to pngenc. + removed g_print from pngdec + +2004-07-27 Steve Lhomme + + * gst/ac3parse/ac3parse.vcproj + * gst/adder/adder.vcproj + * gst/alpha/alpha.vcproj + * gst/alpha/alphacolor.vcproj + * gst/asfdemux/asf.vcproj + * gst/audioconvert/audioconvert.vcproj + * gst/audiorate/audiorate.vcproj + * gst/audioscale/audioscale.vcproj + * gst/auparse/auparse.vcproj + * gst/avi/avi.vcproj + * gst/cdxaparse/cdxaparse.vcproj + * gst/chart/chart.vcproj + * gst/colorspace/colorspace.vcproj + * gst/cutter/cutter.vcproj + * gst/debug/debug.vcproj + * gst/debug/efence.vcproj + * gst/debug/navigationtest.vcproj + * gst/deinterlace/deinterlace.vcproj + * gst/effectv/effectv.vcproj + * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj + * gst/filter/filter.vcproj + * gst/flx/flxdec.vcproj + * gst/goom/goom.vcproj + * gst/interleave/interleave.vcproj + * gst/law/alaw.vcproj + * gst/law/mulaw.vcproj + * gst/matroska/matroska.vcproj + * gst/median/median.vcproj + * gst/mixmatrix/mixmatrix.vcproj + * gst/mpeg1sys/mpeg1systemencode.vcproj + * gst/mpeg1videoparse/mp1videoparse.vcproj + * gst/mpeg2sub/mpeg2subt.vcproj + * gst/mpegaudio/mpegaudio.vcproj + * gst/mpegaudioparse/mpegaudioparse.vcproj + * gst/mpegstream/mpegstream.vcproj + * gst/multifilesink/multifilesink.vcproj + * gst/multipart/multipart.vcproj + * gst/oneton/oneton.vcproj + * gst/overlay/overlay.vcproj + * gst/passthrough/passthrough.vcproj + * gst/qtdemux/qtdemux.vcproj + * gst/realmedia/rmdemux.vcproj + * gst/rtjpeg/rtjpeg.vcproj + * gst/rtp/rtp.vcproj + * gst/silence/silence.vcproj + * gst/sine/sinesrc.vcproj + * gst/smooth/smooth.vcproj + * gst/smpte/smpte.vcproj + * gst/spectrum/spectrum.vcproj + * gst/speed/speed.vcproj + * gst/stereo/stereo.vcproj + * gst/switch/switch.vcproj + * gst/tags/tagedit.vcproj + * gst/tcp/tcp.vcproj + * gst/typefind/typefindfunctions.vcproj + * gst/udp/udp.vcproj + * gst/videobox/videobox.vcproj + * gst/videocrop/videocrop.vcproj + * gst/videodrop/videodrop.vcproj + * gst/videofilter/gamma.vcproj + * gst/videofilter/videobalance.vcproj + * gst/videofilter/videofilter.vcproj + * gst/videofilter/videoflip.vcproj + * gst/videoflip/videoflip.vcproj + * gst/videomixer/videomixer.vcproj + * gst/videorate/videorate.vcproj + * gst/videoscale/videoscale.vcproj + * gst/videotestsrc/videotestsrc.vcproj + * gst/virtualdub/virtualdub.vcproj + * gst/volenv/volenv.vcproj + * gst/volume/volume.vcproj + * gst/wavenc/wavenc.vcproj + * gst/wavparse/wavparse.vcproj + * gst/y4m/y4menc.vcproj + * gst-libs/gst/audio/audio.vcproj + * gst-libs/gst/audio/audiofilter.vcproj + * gst-libs/gst/colorbalance/colorbalance.vcproj + * gst-libs/gst/idct/idtc.vcproj + * gst-libs/gst/media-info/media-info.vcproj + * gst-libs/gst/mixer/mixer.vcproj + * gst-libs/gst/navigation/navigation.vcproj + * gst-libs/gst/play/play.vcproj + * gst-libs/gst/propertyprobe/propertyprobe.vcproj + * gst-libs/gst/resample/resample.vcproj + * gst-libs/gst/riff/riff.vcproj + * gst-libs/gst/tuner/tuner.vcproj + * gst-libs/gst/video/video.vcproj + * gst-libs/gst/xoverlay/xoverlay.vcproj + avoid problems with math.h, fix release dependancy + rename GStreamer-0.8.lib to libgstreamer.lib + +2004-07-27 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate): When + the atom is not available we have to unlock the mutex. Fixes #148023 + +2004-07-26 Steve Lhomme + + * gst-libs/gst/media-info/media-info.h: + issue for a vararg macro with MSVC + +2004-07-26 Steve Lhomme + + * gst/effectv/effectv.vcproj + * gst-libs/gst/idct/idct.vcproj: + * gst-libs/gst/media-info/media-info.vcproj: + * gst-libs/gst/navigation/navigation.vcproj: + * gst-libs/gst/propertyprobe/propertyprobe.vcproj: + * gst-libs/gst/video/video.vcproj: + * gst-libs/gst/xoverlay/xoverlay.vcproj: + fixes for build problems + +2004-07-26 Steve Lhomme + + * gst-libs/gst/audio/audio.def: + * gst-libs/gst/audio/riff.def: + add some definitions needed by plugins + +2004-07-26 Steve Lhomme + + * gst/asfdemux/gstasfmux.c + Fix some 64 bits constants to be glib friendly + +2004-07-26 Steve Lhomme + + * gst/ac3parse/gstac3parse.c + * gst/audioscale/gstaudioscale.c + * gst/auparse/gstauparse.c + * gst/colorspace/gstcolorspace.c + * gst/colorspace/yuv2rgb.h + local include fixes + +2004-07-26 Steve Lhomme + + * win32/gst.sln + add more plugins to the build + +2004-07-26 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new): Some more fixes to image size calculation. + +2004-07-26 Thomas Vander Stichele + + * gst/level/gstlevel.c: (gst_level_link), (gst_level_chain), + (gst_level_set_property), (gst_level_get_property), + (gst_level_base_init), (gst_level_class_init): + add debugging categories. cleanups. + +2004-07-26 Thomas Vander Stichele + + * gst/videoscale/videoscale.c: (gst_videoscale_setup), + (gst_videoscale_planar411), (gst_videoscale_planar400), + (gst_videoscale_packed422), (gst_videoscale_packed422rev), + (gst_videoscale_scale_nearest_str1), + (gst_videoscale_scale_nearest_str2), + (gst_videoscale_scale_nearest_str4), + (gst_videoscale_scale_nearest_16bit), + (gst_videoscale_scale_nearest_24bit): + fixed stride issues + tested with 320x240 -> 321, 322, 324 x240 + tested with YV12, I420, YUY2, UYVY + fixed packed422rev (don't think it could have worked before) + by testing with UYVY + +2004-07-26 Benjamin Otte + + * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_init), + (gst_lame_chain), (gst_lame_setup), (gst_lame_change_state), + (plugin_init): + add debugging category, add error checks like checking return values + of setup calls, make sure it still works after + PLAYING=>NULL=>PLAYING, fix encoding of mono streams + +2004-07-26 Wim Taymans + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), + (gst_mpeg_demux_get_audio_stream), + (gst_mpeg_demux_process_private): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_send_data): + Check for error codes from the negotiation functions. Make sure + we really set the pad caps when a new pad is created. + +2004-07-26 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_caps_to_pix_fmt): + * gst/ffmpegcolorspace/gstffmpegcodecmap.h: + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_pad_link): + don't make function do two things at the same time without reason. + +2004-07-26 Steve Lhomme + + * gst/ac3parse/ac3parse.vcproj + * gst/adder/adder.vcproj + * gst/alpha/alpha.vcproj + * gst/alpha/alphacolor.vcproj + * gst/asfdemux/asf.vcproj + * gst/audioconvert/audioconvert.vcproj + * gst/audiorate/audiorate.vcproj + * gst/audioscale/audioscale.vcproj + * gst/auparse/auparse.vcproj + * gst/avi/avi.vcproj + * gst/cdxaparse/cdxaparse.vcproj + * gst/chart/chart.vcproj + * gst/colorspace/colorspace.vcproj + * gst/cutter/cutter.vcproj + * gst/debug/debug.vcproj + * gst/debug/efence.vcproj + * gst/debug/navigationtest.vcproj + * gst/deinterlace/deinterlace.vcproj + * gst/effectv/effectv.vcproj + * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj + * gst/filter/filter.vcproj + * gst/flx/flxdec.vcproj + * gst/goom/goom.vcproj + * gst/interleave/interleave.vcproj + * gst/law/alaw.vcproj + * gst/law/mulaw.vcproj + * gst/matroska/matroska.vcproj + * gst/median/median.vcproj + * gst/mixmatrix/mixmatrix.vcproj + * gst/mpeg1sys/mpeg1systemencode.vcproj + * gst/mpeg1videoparse/mp1videoparse.vcproj + * gst/mpeg2sub/mpeg2subt.vcproj + * gst/mpegaudio/mpegaudio.vcproj + * gst/mpegaudioparse/mpegaudioparse.vcproj + * gst/mpegstream/mpegstream.vcproj + * gst/multifilesink/multifilesink.vcproj + * gst/multipart/multipart.vcproj + * gst/oneton/oneton.vcproj + * gst/overlay/overlay.vcproj + * gst/passthrough/passthrough.vcproj + * gst/qtdemux/qtdemux.vcproj + * gst/realmedia/rmdemux.vcproj + * gst/rtjpeg/rtjpeg.vcproj + * gst/rtp/rtp.vcproj + * gst/silence/silence.vcproj + * gst/sine/sinesrc.vcproj + * gst/smooth/smooth.vcproj + * gst/smpte/smpte.vcproj + * gst/spectrum/spectrum.vcproj + * gst/speed/speed.vcproj + * gst/stereo/stereo.vcproj + * gst/switch/switch.vcproj + * gst/tags/tagedit.vcproj + * gst/tcp/tcp.vcproj + * gst/typefind/typefindfunctions.vcproj + * gst/udp/udp.vcproj + * gst/videobox/videobox.vcproj + * gst/videocrop/videocrop.vcproj + * gst/videodrop/videodrop.vcproj + * gst/videofilter/gamma.vcproj + * gst/videofilter/videobalance.vcproj + * gst/videofilter/videofilter.vcproj + * gst/videofilter/videoflip.vcproj + * gst/videoflip/videoflip.vcproj + * gst/videomixer/videomixer.vcproj + * gst/videorate/videorate.vcproj + * gst/videoscale/videoscale.vcproj + * gst/videotestsrc/videotestsrc.vcproj + * gst/virtualdub/virtualdub.vcproj + * gst/volenv/volenv.vcproj + * gst/volume/volume.vcproj + * gst/wavenc/wavenc.vcproj + * gst/wavparse/wavparse.vcproj + * gst/y4m/y4menc.vcproj + more plugins supported under windows + +2004-07-26 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_ximage_put), (gst_ximagesink_renegotiate_size), + (gst_ximagesink_chain), (gst_ximagesink_buffer_alloc): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc): + Add debugging statements. Use the sizes as returned by the + *CreateImage calls. + +2004-07-26 Johan Dahlin + + * gst/tcp/gsttcpclientsrc.c (gst_tcpclientsrc_get): Make sure that + the pad is negotiated. + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c (gst_ffmpegcolorspace_chain): Ditto + +2004-07-26 Steve Lhomme + + * gst-libs/gst/colorbalance/colorbalance.vcproj: + * gst-libs/gst/idct/idct.vcproj: + * gst-libs/gst/media-info/media-info.vcproj: + * gst-libs/gst/mixer/mixer.vcproj: + * gst-libs/gst/navigation/navigation.vcproj: + * gst-libs/gst/play/play.vcproj: + * gst-libs/gst/propertyprobe/propertyprobe.vcproj: + * gst-libs/gst/resample/resample.vcproj: + * gst-libs/gst/tuner/tuner.vcproj: + * gst-libs/gst/video/video.vcproj: + * gst-libs/gst/xoverlay/xoverlay.vcproj: + more plugins supported under windows + +2004-07-25 Iain + + * gst/wavparse/gstwavparse.c (gst_wavparse_fmt): Set the caps on the + pad now rather than when the pad is created because state changes wipe + explicit caps (fixes #148043). + +2004-07-25 Sebastien Cote + + reviewed by Benjamin Otte + + * ext/mad/gstmad.c: + fix mad plugin crashing on Sun (fixes #148289) + +2004-07-25 Steve Lhomme + + * gst/avi/avi.def: + * gst/avi/avi.vcproj: + * gst/matroska/matroska.def: + * gst/matroska/matroska.vcproj: + remove unused .def files + +2004-07-25 Steve Lhomme + + * gst-libs/gst/audio/gstaudiofilter.c: + Clean the local include + +2004-07-25 Steve Lhomme + + * win32/gst.sln: + * gst-libs/gst/audio/audio.def: + * gst-libs/gst/audio/audio.vcproj: + * gst-libs/gst/audio/audiofilter.vcproj: + * gst-libs/gst/audio/riff.def: + * gst-libs/gst/audio/riff.vcproj: + * gst-libs/gst/gst-libs.def: + * gst-libs/gst/gst-libs.vcproj: + * gst/avi/avi.vcproj: + * gst/avi/avi.vcproj: + Copy the files where needed after building, cleaner projects + +2004-07-25 Steve Lhomme + + * gst/matroska/ebml-write.c: + Fix some 64 bits constants to be glib friendly + +2004-07-24 Steve Lhomme + + * win32/gst.sln: + * gst-libs/gst/gst-libs.def: + * gst-libs/gst/gst-libs.vcproj: + * gst/matroska/matroska.def: + * gst/matroska/matroska.vcproj: + Add the preliminary canvas to build plugins on Win32 + +2004-07-23 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + don't enfore negotiation from source side, it breaks + sinesrc ! audioconvert ! osssink + +2004-07-22 David Schleef + + * gst/typefind/gsttypefindfunctions.c: (plugin_init): Add typefind + for ELF files, since they can easily be recognized as audio/mpeg. + (bug #147441) + +2004-07-22 Thomas Vander Stichele + + * gst/videoscale/videoscale.c: (gst_videoscale_setup), + (gst_videoscale_planar411), (gst_videoscale_scale_nearest_32bit), + (gst_videoscale_scale_nearest_24bit), + (gst_videoscale_scale_nearest_16bit): + fix 16bit and 24bit for stride (24bit might need testing) + don't pretend we do more than one algorithm + +2004-07-22 Zaheer Abbas Merali + + * configure.ac: + * gst/Makefile.am: + * gst/multifilesink/Makefile.am: + * gst/multifilesink/gstmultifilesink.c: + (gst_multifilesink_get_formats), + (gst_multifilesink_get_query_types), (_do_init), + (gst_multifilesink_base_init), (gst_multifilesink_class_init), + (gst_multifilesink_init), (gst_multifilesink_dispose), + (gst_multifilesink_set_location), (gst_multifilesink_set_property), + (gst_multifilesink_get_property), (gst_multifilesink_open_file), + (gst_multifilesink_close_file), (gst_multifilesink_next_file), + (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), + (gst_multifilesink_chain), (gst_multifilesink_change_state), + (gst_multifilesink_uri_get_type), + (gst_multifilesink_uri_get_protocols), + (gst_multifilesink_uri_get_uri), (gst_multifilesink_uri_set_uri), + (gst_multifilesink_uri_handler_init), (plugin_init): + * gst/multifilesink/gstmultifilesink.h: + * testsuite/Makefile.am: + * testsuite/multifilesink/Makefile.am: + * testsuite/multifilesink/fakesrc_test.c: (gst_newmedia_base_init), + (gst_newmedia_class_init), (gst_newmedia_init), + (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), + (newfile_signal), (test_signal), (main): + multifilesink plugin for creating new files every time a new media + discontinuity event occurs + +2004-07-22 Wim Taymans + + * gst/alpha/Makefile.am: + * gst/alpha/gstalphacolor.c: (gst_alpha_color_get_type), + (gst_alpha_color_base_init), (gst_alpha_color_class_init), + (gst_alpha_color_init), (gst_alpha_color_set_property), + (gst_alpha_color_get_property), (gst_alpha_color_sink_link), + (transform), (gst_alpha_color_chain), + (gst_alpha_color_change_state), (plugin_init): + Stupid plugin to to RGBA to AYUV conversion because none of + the colorspace plugins can handle that yet. + +2004-07-22 Wim Taymans + + * examples/seeking/seek.c: (update_scale), (main): + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_is_dynamic), + (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), + (gst_decode_bin_init), (gst_decode_bin_dispose), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (no_more_pads), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (queue_overrun), + (gen_preroll_element), (remove_prerolls), (unknown_type), + (no_more_pads), (new_stream), (setup_source), + (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), + (play_base_eos), (gst_play_base_bin_change_state), + (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybin.c: (gen_video_element), + (gen_audio_element): + * gst/playback/gststreaminfo.h: + More playback updates, attempt to fix things after the state change + breakage. + +2004-07-22 Thomas Vander Stichele + + * gst/videoscale/videoscale.c: (gst_videoscale_planar411), + (gst_videoscale_scale_nearest_16bit): + comment algorithm + +2004-07-22 Thomas Vander Stichele + + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_class_init), (gst_videotestsrc_src_link), + (gst_videotestsrc_init), (gst_videotestsrc_get), + (gst_videotestsrc_set_pattern), (gst_videotestsrc_set_property), + (gst_videotestsrc_get_property): + * gst/videotestsrc/gstvideotestsrc.h: + * gst/videotestsrc/videotestsrc.c: + * gst/videotestsrc/videotestsrc.h: + cleanup and commenting + +2004-07-21 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init), + (gst_ogg_demux_get_formats), (gst_ogg_demux_src_query), + (gst_ogg_demux_src_event), (gst_ogg_demux_src_convert), + (gst_ogg_demux_handle_event), (gst_ogg_demux_seek_before), + (_find_chain_get_unknown_part), (_find_streams_check), + (gst_ogg_demux_push), (gst_ogg_pad_push): + * ext/theora/theoradec.c: (theora_get_formats), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), + (vorbis_dec_convert), (vorbis_dec_src_query), + (vorbis_dec_src_event), (vorbis_dec_event): + More seeking fixes, oggdemux now supports seeking to time and + uses the downstream element to convert granulepos to time. + Seeking in theora-only ogg files now works. + +2004-07-21 Wim Taymans + + * ext/theora/theoradec.c: (gst_theora_dec_init), + (theora_get_formats), (theora_get_event_masks), + (theora_get_query_types), (theora_dec_src_convert), + (theora_dec_sink_convert), (theora_dec_src_query), + (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), + (vorbis_get_event_masks), (vorbis_get_query_types), + (gst_vorbis_dec_init), (vorbis_dec_convert), + (vorbis_dec_src_query), (vorbis_dec_src_event), (vorbis_dec_event): + Added query/convert/formats functions to vorbis and theora decoders + so that the outside world can use them too. Fixed seeking on an + ogg/theora/vorbis file by disabling the seeking seeking on the + theora srcpad. + +2004-07-21 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_renegotiate_size), (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id): Optimize + images creation for both elements. We don't create the image on caps + nego or renego, we just destroy the internal one if present if it does + not match the needs. The chain function takes care of creating a new + image when needed. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_xwindow_id): Additionally xvimage now contains + the image format information. The buffer pool checks for the context + image format and discard images with different formats. + * sys/xvimage/xvimagesink.h: Adding im_format in the xvimage structure. + +2004-07-21 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_chain): + no point in doing any chaining if the pad we want to push from + isn't usable. + +2004-07-20 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data): + Fix double end-to-native symbol conversion (#148021). + +2004-07-20 David Schleef + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate): + Don't use an Atom that doesn't exist. + +2004-07-20 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer): + * gst/tcp/gstmultifdsink.h: + More multifdsink stats. Avoid deadlock by releasing locks + before sending out a signal. + +2004-07-20 Thomas Vander Stichele + + * po/LINGUAS: + * po/hu.po: + added Hungarian translation (Laszlo Dvornik) + +2004-07-20 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer): + * gst/tcp/gsttcp-marshal.list: + Fixed the stupid marshal definition. + +2004-07-20 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_add), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_queue_buffer), (gst_multifdsink_chain), + (gst_multifdsink_set_property), (gst_multifdsink_get_property), + (gst_multifdsink_init_send): + * gst/tcp/gstmultifdsink.h: + Added more stats, added timeout for a client, fixed some typos + and added some comments. + +2004-07-20 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_add), (gst_multifdsink_get_stats), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_write): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcp-marshal.list: + Added get_stats method that returns a GValueArray of + stats values. + +2004-07-19 Benjamin Otte + + * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): + make sure longname, description and author are valid UTF-8 + +2004-07-19 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_change_state), + (gst_ximagesink_set_property): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state), + (gst_xvimagesink_set_property): + make sure SYNCHRONOUS is respected after getting the X context + +2004-07-18 Thomas Vander Stichele + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_src_event), + (gst_matroska_demux_parse_blockgroup): + * gst/matroska/matroska-ids.h: + add BlockReference tag and ignore it to clear out log. + ignore NAVIGATION events to clear out log. + +2004-07-18 Thomas Vander Stichele + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), + (gst_matroska_demux_add_stream): + * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init): + add debug categories + +2004-07-16 Wim Taymans + + * ext/libpng/Makefile.am: + * ext/libpng/gstpng.c: (plugin_init): + * ext/libpng/gstpngdec.c: (user_error_fn), (user_warning_fn), + (gst_pngdec_get_type), (gst_pngdec_base_init), + (gst_pngdec_class_init), (gst_pngdec_sinklink), (gst_pngdec_init), + (gst_pngdec_src_getcaps), (user_read_data), (gst_pngdec_chain): + * ext/libpng/gstpngdec.h: + Added png decoder. + +2004-07-16 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), + (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), + (gst_ximagesink_ximage_destroy), (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_buffer_free), + (gst_ximagesink_buffer_alloc): + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc): + * sys/xvimage/xvimagesink.h: Getting the 2 video sinks synchronized + again. Using internal data pointer of the x(v)image to store image's + data to be coherent with the buffer alloc mechanism. Investigated the + image destruction code to be sure that everything gets freed correctly. + +2004-07-16 Wim Taymans + + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data), + (gst_riff_read_strf_auds_with_data): + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): + Make sure we don't create 0 sized subbuffers in riff-read. + Signal the no more pads signal after reading the avi header. + +2004-07-16 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_is_dynamic), + (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), + (gst_decode_bin_init), (gst_decode_bin_dispose), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (no_more_pads), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (gst_decode_bin_change_state), (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (queue_overrun), + (gen_preroll_element), (remove_prerolls), (unknown_type), + (no_more_pads), (new_stream), (setup_source), + (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), + (play_base_eos), (gst_play_base_bin_change_state), + (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + Better error recovery. Added configurable preroll queue size. Faster + detection of no-more-pads. + +2004-07-16 Wim Taymans + + * gst-libs/gst/video/video.h: + Added 32 bits RGBA. Not sure if we should use another mime-type + for alpha rgb. Currently the presence of the alpha_mask property + signals an alpha channel. + +2004-07-16 Wim Taymans + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): + FPS seems to be 0.0 to MAX everywhere else. + +2004-07-15 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + mp42/mp43 (no caps) exist too. + * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): + Set pixel_width/height; we've got them in-caps. + * gst/typefind/gsttypefindfunctions.c: (plugin_init): + * gst/wavparse/gstwavparse.c: (plugin_init): + Both are valid primary. + * sys/oss/gstossmixer.c: + Remove i18n hack and enable translations. + +2004-07-15 Benjamin Otte + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy): + fix for non-shm xv. Original patch by Tim Ringenbach (fixes #147248) + +2004-07-15 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio), + (gst_alsa_sw_params_dump), (gst_alsa_hw_params_dump), + (gst_alsa_close_audio): + disable some of the debugging code for now. Writing debugging to a + buffer is broken in current alsalib releases. + +2004-07-12 Benjamin Otte + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer): + use bufferpools + +2004-07-14 Thomas Vander Stichele + + * ext/theora/theoradec.c: (gst_theora_dec_class_init), + (theora_dec_src_query), (theora_dec_event): + * ext/theora/theoraenc.c: (gst_theora_enc_class_init): + add debugging categories. Remove \n's. + +2004-07-13 Johan Dahlin + + * gst/playback/gstplaybin.c (gst_play_bin_set_property) + (gst_play_bin_get_property): Impl. + +2004-07-13 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_seek_before): + When trying to find the stream length, seek back N pages + instead of just one, where N is the number of streams in + the current chain. + +2004-07-13 Wim Taymans + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_audio_caps_with_data), + (gst_riff_create_audio_caps), + (gst_riff_create_audio_template_caps): + * gst-libs/gst/riff/riff-media.h: + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data), + (gst_riff_read_strf_auds_with_data), (gst_riff_read_strf_auds): + * gst-libs/gst/riff/riff-read.h: + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), + (gst_avi_demux_add_stream): + Set codec_data on caps for avidemuxer. + +2004-07-12 David Schleef + + * configure.ac: Fix test for Objective C + +2004-07-12 Jan Schmidt + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_get_capslist), + (gst_gdk_pixbuf_chain): + Add svg and pcx to template caps, and ensure that getcaps returns a + subset of the template caps. + Copy each row manually for output, as gdkpixbuf may pad the + rowstride to a 32-bit word boundary. + +2004-07-12 Wim Taymans + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps), + (gst_riff_create_video_template_caps): + Fix the template caps to include some more media types. + +2004-07-12 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (print_feature), (gst_decode_bin_init), + (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), + (try_to_link_1), (new_pad), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (gst_decode_bin_change_state), (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (queue_overrun), + (gen_preroll_element), (remove_prerolls), (no_more_pads), + (new_stream), (setup_source), (gst_play_base_bin_set_property), + (gst_play_base_bin_get_property), (play_base_eos), + (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (gst_play_bin_set_property), + (gst_play_bin_get_property), (gen_video_element), + (gen_audio_element), (remove_sinks), (setup_sinks), + (gst_play_bin_change_state), (gst_play_bin_get_event_masks), + (gst_play_bin_send_event), (gst_play_bin_get_formats), + (gst_play_bin_convert), (gst_play_bin_get_query_types), + (gst_play_bin_query), (plugin_init): + * gst/playback/test4.c: (main): + More fixes on reusing of the element. + +2004-07-11 Benjamin Otte + + * ext/mad/gstmad.c: (normal_seek): + allow seeking for other methods than just SET + +2004-07-11 Andy Wingo + + * gst/audioconvert/gstaudioconvert.c (gst_audio_convert_link): For + float, "any" caps -> buffer_frames=[0,MAX]. + + * gst/interleave/interleave.c (interleave_getcaps): Seems the core + doesn't intersect our caps with the template any more. Do it + ourselves. + (interleave_buffered_loop): Use g_newa instead of malloc/free. + +2004-07-09 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (print_feature), (gst_decode_bin_init), + (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), + (try_to_link_1), (new_pad), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (gst_decode_bin_change_state), (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (queue_overrun), + (gen_preroll_element), (remove_prerolls), (no_more_pads), + (new_stream), (setup_source), (gst_play_base_bin_set_property), + (gst_play_base_bin_get_property), (play_base_eos), + (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (gst_play_bin_set_property), + (gst_play_bin_get_property), (gen_video_element), + (gen_audio_element), (remove_sinks), (setup_sinks), + (gst_play_bin_change_state), (gst_play_bin_get_event_masks), + (gst_play_bin_send_event), (gst_play_bin_get_formats), + (gst_play_bin_convert), (gst_play_bin_get_query_types), + (gst_play_bin_query), (plugin_init): + * gst/playback/test4.c: (main): + Work on object reuse and seeking. + +2004-07-09 Wim Taymans + + * examples/seeking/seek.c: (iterate): + Don't consume all CPU in the idle loop. + +2004-07-09 Wim Taymans + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_new_output_pad), + (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_process_private): + Add pad to element *after* setting the pad functions so that + the scheduler can use the correct ones. + +2004-07-09 Wim Taymans + + * ext/theora/theoradec.c: (theora_dec_from_granulepos), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_chain): + Sync to keyframe after seek + +2004-07-09 Thomas Vander Stichele + + * ext/alsa/gstalsa.c: (gst_alsa_change_state): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), + (gst_alsa_sink_loop), (gst_alsa_sink_change_state): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_change_state): + * ext/libvisual/visual.c: (gst_visual_change_state): + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_change_state): + * ext/theora/theoradec.c: (theora_dec_change_state): + * ext/theora/theoraenc.c: (theora_enc_change_state): + * ext/vorbis/vorbisdec.c: (vorbis_dec_change_state): + * gst-libs/gst/navigation/navigation.c: + * gst/adder/gstadder.c: (gst_adder_change_state): + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain), + (gst_audio_convert_get_buffer): + * gst/multipart/multipartdemux.c: + (gst_multipart_demux_change_state): + * gst/playback/gstdecodebin.c: (gst_decode_bin_change_state): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): + * gst/playback/gstplaybin.c: (gst_play_bin_change_state): + * gst/videoscale/gstvideoscale.c: + (gst_videoscale_handle_src_event): + * gst/volume/gstvolume.c: (volume_chain_int16): + don't assert in state change, this should be done by the base + GstElement class. + various debugging fixes. + +2004-07-08 Thomas Vander Stichele + + * configure.ac: + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), + (gst_play_dispose), (gst_play_set_location), + (gst_play_set_data_src), (gst_play_set_video_sink), + (gst_play_set_audio_sink), (gst_play_set_visualization), + (gst_play_connect_visualization), (gst_play_get_sink_element), + (gst_play_get_all_by_interface): + * gst-libs/gst/play/play.h: + add new method to get elements implementing an interface. + add various error logging + +2004-07-08 Wim Taymans + + * examples/seeking/seek.c: (make_dv_pipeline), (make_avi_pipeline), + (make_mpeg_pipeline), (make_mpegnt_pipeline), + (make_playerbin_pipeline), (query_durations_elems), + (query_durations_pads), (query_positions_elems), + (query_positions_pads), (update_scale), (iterate), (stop_seek), + (main): + Added playbin seeking example. + +2004-07-08 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_set_location), + (gst_play_set_data_src), (gst_play_set_video_sink), + (gst_play_set_audio_sink), (gst_play_set_visualization), + (gst_play_connect_visualization), (gst_play_get_framerate): + use a macro to look up elements from hash table + +2004-07-08 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), + (gst_play_get_length_callback), (gst_play_set_location), + (gst_play_seek_to_time), (gst_play_set_data_src), + (gst_play_set_video_sink), (gst_play_set_audio_sink), + (gst_play_set_visualization), (gst_play_connect_visualization), + (gst_play_get_sink_element): + - add debugging info + - fix looking up sink elements by iterating over complete caps + - put everything except for source and autoplugger in a complete bin + +2004-07-08 Thomas Vander Stichele + + * ext/alsa/gstalsa.c: (gst_alsa_drain_audio): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_flush_one_pad), + (gst_alsa_sink_check_event), (gst_alsa_sink_mmap), + (gst_alsa_sink_write), (gst_alsa_sink_loop): + * ext/alsa/gstalsasink.h: + - add debugging info + - clean up schizophrenia of data/buffer/event + - fix double event unref error + +2004-07-08 Wim Taymans + + * gst/playback/Makefile.am: + Add headers to noinst + +2004-07-08 Thomas Vander Stichele + + * tools/gst-launch-ext-m.m: + * tools/gst-launch-ext.1.in: + convert to the third millenium + +2004-07-07 David Schleef + + * sys/dxr3/Makefile.am: noinst_SOURCES should be nodist_SOURCES + +2004-07-07 Wim Taymans + + * gst/playback/Makefile.am: + * gst/playback/README: + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (print_feature), (gst_decode_bin_init), + (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), + (try_to_link_1), (new_pad), (close_link), (type_found), + (gst_decode_bin_set_property), (gst_decode_bin_get_property), + (plugin_init): + * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), + (gst_play_base_bin_class_init), (gst_play_base_bin_init), + (gst_play_base_bin_dispose), (rebuild_pipeline), (queue_overrun), + (gen_preroll_element), (no_more_pads), (new_stream), + (setup_source), (gst_play_base_bin_set_property), + (gst_play_base_bin_get_property), (gst_play_base_bin_change_state), + (gst_play_base_bin_add_element), + (gst_play_base_bin_remove_element), + (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), + (gst_play_base_bin_unlink_stream), + (gst_play_base_bin_get_streaminfo): + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (gst_play_bin_set_property), + (gst_play_bin_get_property), (gen_video_element), + (gen_audio_element), (setup_sinks), (gst_play_bin_change_state), + (gst_play_bin_get_event_masks), (gst_play_bin_send_event), + (gst_play_bin_get_formats), (gst_play_bin_convert), + (gst_play_bin_get_query_types), (gst_play_bin_query), + (plugin_init): + * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), + (gst_stream_info_get_type), (gst_stream_info_class_init), + (gst_stream_info_init), (gst_stream_info_new), + (gst_stream_info_dispose), (gst_stream_info_set_property), + (gst_stream_info_get_property): + * gst/playback/gststreaminfo.h: + * gst/playback/test.c: (gen_video_element), (gen_audio_element), + (main): + * gst/playback/test2.c: (main): + * gst/playback/test3.c: (update_scale), (main): + More playbin fixes. Added README. Do better element filtering. + Added base class to preroll media. Added test apps. + +2004-07-07 Thomas Vander Stichele + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_flush_decoder): + * ext/mpeg2dec/gstmpeg2dec.h: + various debugging improvements. Reset stream to next picture + instead of sequence header, otherwise seeks cannot work. + +2004-07-07 Wim Taymans + + * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type), + (gst_video_box_class_init), (gst_video_box_set_property), + (gst_video_box_i420), (gst_video_box_ayuv), (gst_video_box_chain): + Use pad_alloc where possible. + +2004-07-07 Wim Taymans + + * sys/oss/gstosselement.c: (gst_osselement_reset), + (gst_osselement_parse_caps): + * sys/oss/gstosselement.h: + * sys/oss/gstosssrc.c: (gst_osssrc_get): + Fix offset on osssrc. + +2004-07-07 Wim Taymans + + * ext/theora/theora.c: (plugin_init): + * ext/theora/theoradec.c: (theora_dec_from_granulepos), + (theora_dec_src_query), (theora_dec_chain): + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_buffer_from_packet), + (theora_push_packet), (theora_enc_chain): + Fix theora granulepos calculation. + Fix overflow in duration/position calculation. + Bump rank to PRIMARY for theoradec. + Use granulepos of last packet to calculate position. + Set keyframe flag on buffers when needed. + +2004-07-06 David Schleef + + * gst/playback/Makefile.am: 'test' in bin_PROGRAMS? Are you + serious? (Fixed, obviously.) + +2004-07-06 Thomas Vander Stichele + + * po/LINGUAS: + * po/cs.po: + added Czech translation (Miloslav Trmac) + +2004-07-05 Wim Taymans + + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (gst_decode_bin_init), (gst_decode_bin_dispose), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (close_link), (type_found), (gst_decode_bin_set_property), + (gst_decode_bin_get_property), (gst_decode_bin_get_event_masks), + (gst_decode_bin_send_event), (gst_decode_bin_get_formats), + (gst_decode_bin_convert), (gst_decode_bin_get_query_types), + (gst_decode_bin_query), (plugin_init): + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (rebuild_pipeline), (get_audio_element), + (get_video_element), (new_pad), (setup_source), + (gst_play_bin_set_property), (gst_play_bin_get_property), + (gst_play_bin_change_state), (gst_play_bin_add_element), + (gst_play_bin_remove_element), (gst_play_bin_get_event_masks), + (gst_play_bin_send_event), (gst_play_bin_get_formats), + (gst_play_bin_convert), (gst_play_bin_get_query_types), + (gst_play_bin_query), (gst_play_bin_get_clock), (plugin_init): + * gst/playback/test.c: (main): + More fixes, cleaned up playbin, make it use decodebin. Added + threaded property to playbin. + +2004-07-05 Wim Taymans + + * configure.ac: + * gst/playback/Makefile.am: + * gst/playback/decodetest.c: (main): + * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), + (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), + (compare_ranks), (gst_decode_bin_init), (gst_decode_bin_dispose), + (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), + (close_link), (type_found), (gst_decode_bin_set_property), + (gst_decode_bin_get_property), (gst_decode_bin_change_state), + (gst_decode_bin_get_event_masks), (gst_decode_bin_send_event), + (gst_decode_bin_get_formats), (gst_decode_bin_convert), + (gst_decode_bin_get_query_types), (gst_decode_bin_query), + (plugin_init): + * gst/playback/gstplaybin.c: (gst_play_bin_get_type), + (gst_play_bin_class_init), (gst_play_bin_init), + (gst_play_bin_dispose), (gen_default_output), (rebuild_pipeline), + (collect_sink_pads), (find_compatibles), (close_pad_link), + (try_to_link_1), (new_pad), (close_link), (type_found), + (setup_source), (gst_play_bin_set_property), + (gst_play_bin_get_property), (gst_play_bin_factory_filter), + (compare_ranks), (gst_play_bin_collect_factories), + (gst_play_bin_change_state), (gst_play_bin_add_element), + (gst_play_bin_remove_element), (gst_play_bin_get_event_masks), + (gst_play_bin_send_event), (gst_play_bin_get_formats), + (gst_play_bin_convert), (gst_play_bin_get_query_types), + (gst_play_bin_query), (gst_play_bin_get_clock), (plugin_init): + * gst/playback/test.c: (main): + Added some playback helper elements and some test apps, very alpha + still. + +2004-07-04 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_xrun_recovery): + only restart audio when we indeed have an xrun to fix repeated + xruns. Fix suggested by Giuliano Pochini. + +2004-07-03 David Schleef + + * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper): Disable + call to gst_debug_log() if debugging is disabled (bug #145118) + +2004-07-03 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_xrun_recovery): + use our own functions for restarting the alsa device. + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + I should apply patches myself - use MIN for the third argument, not + the second, this fixes seeking + +2004-07-02 David Schleef + + * ext/flac/gstflacdec.c: (gst_flacdec_class_init), + (gst_flacdec_write): Actually, GST_PAD_CAPS() has nothing to + do with the logic. + +2004-07-02 David Schleef + + * ext/flac/gstflacdec.c: (gst_flacdec_write): Set duration on + output buffers. Fix logic mistake. (bug #144866) + +2004-07-02 David Schleef + + * gst-libs/gst/xoverlay/Makefile.am: xoverlay no longer depends + on X. (bug #144753) + +2004-07-02 David Schleef + + * gst/wavenc/gstwavenc.c: (gst_wavenc_setup), + (gst_wavenc_stop_file): Switch to GST_WRITE_UINT32_LE macros + (bug #144624) + * sys/oss/gstosselement.c: (gst_osselement_probe_caps), + (gst_osselement_rate_probe_check): Add another workaround for + buggy drivers (bug #145336) + +2004-07-02 David Schleef + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_handle_client_write): + Most systems don't have MSG_NOSIGNAL. + +2004-07-02 Thomas Vander Stichele + + * Makefile.am: + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + (hopefully) fix both install and dist and make error message useful. + needs testing across automakes. + +2004-07-02 Benjamin Otte + + * ext/ogg/gstogg.c: (plugin_init): + we require bytestream now + * ext/ogg/gstoggdemux.c: + huge diff to implement chain setup in a fast and generic way. This + improves tag reading and startup of huge files (read: Theora videos) + quite a bit. It probably contains bugs, too, so please test. + Seeking is not improved to the fast method. + +2004-06-29 Wim Taymans + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + * ext/ogg/gstoggmux.c: + Fix memleak in oggdemux when running unconnected pads. + doc update in mux, start working on keyframe mode. + +2004-06-29 Benjamin Otte + + * sys/oss/gstosssink.c: + * sys/oss/gstosssrc.c: + advertise correct template caps - we indeed do non-native endianness + and 8bit audio has no endianness + * sys/ximage/ximagesink.c: (gst_ximagesink_getcaps): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_getcaps): + avoid (wrong) duplications in getcaps function and return + template caps + +2004-06-29 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), + (gst_multifdsink_class_init), (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_clear), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_caps), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_thread), + (gst_multifdsink_init_send), (gst_multifdsink_close): + Fix wrong GList iteration that could crash the server when + more then 2 clients disconnect at the same time. Read all the + pending commands in one batch to recover from command storms under + very heavy load. + +2004-06-28 Wim Taymans + + * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), + (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_property), + (gst_videomixer_pad_set_property), + (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_init), + (gst_video_mixer_background_get_type), (gst_videomixer_get_type), + (gst_videomixer_class_init), (gst_videomixer_init), + (gst_videomixer_request_new_pad), (gst_videomixer_blend_ayuv_i420), + (pad_zorder_compare), (gst_videomixer_sort_pads), + (gst_videomixer_fill_checker), (gst_videomixer_fill_color), + (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), + (gst_videomixer_update_queues), (gst_videomixer_loop), + (plugin_init): + Avoid divide by zero, choose masterpad as the pad with the highest + framerate. + +2004-06-27 Julien Moutte + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), + (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), + (gst_xvimagesink_xwindow_new): I prefer locking the mutex in the + function directly. We might want to call it from somewhere else one day. + +2004-06-27 Julien Moutte + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), + (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), + (gst_xvimagesink_xwindow_new): Trying to fix the random behaviour of + window decorations. + +2004-06-27 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), + (gst_dvdec_video_getcaps), (gst_dvdec_video_link), + (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state), + (gst_dvdec_set_property), (gst_dvdec_get_property): + * ext/dv/gstdvdec.h: + Implement drop_factor property to lower the framerate with + a factor. + +2004-06-27 Thomas Vander Stichele + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + unbreak Company's fix that didn't install the -enum.h files + +2004-06-27 Wim Taymans + + * ext/dv/gstdvdec.c: (gst_dvdec_push), (gst_dvdec_loop), + (gst_dvdec_change_state): + * ext/dv/gstdvdec.h: + Fix timestamp, duration and offset of the buffers. + +2004-06-27 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), + (gst_multifdsink_class_init), (gst_multifdsink_add), + (gst_multifdsink_remove), (gst_multifdsink_clear), + (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_caps), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_thread), + (gst_multifdsink_init_send), (gst_multifdsink_close): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcpserversink.c: + (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_handle_select), (gst_tcpserversink_close): + More multifdsink fixes, more recovery policy fixes. + Removed stupid g_print + +2004-06-26 Wim Taymans + + * gst/tcp/Makefile.am: + * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), + (gst_multifdsink_get_type), (gst_multifdsink_base_init), + (gst_multifdsink_class_init), (gst_multifdsink_init), + (gst_multifdsink_debug_fdset), (gst_multifdsink_client_remove), + (gst_multifdsink_handle_client_read), + (gst_multifdsink_client_queue_data), + (gst_multifdsink_client_queue_caps), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_handle_client_write), + (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), + (gst_multifdsink_handle_clients), (gst_multifdsink_thread), + (gst_multifdsink_chain), (gst_multifdsink_set_property), + (gst_multifdsink_get_property), (gst_multifdsink_init_send), + (gst_multifdsink_close), (gst_multifdsink_change_state): + * gst/tcp/gstmultifdsink.h: + * gst/tcp/gsttcpplugin.c: (plugin_init): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_get_type), + (gst_tcpserversink_class_init), (gst_tcpserversink_init), + (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_handle_select), + (gst_tcpserversink_set_property), (gst_tcpserversink_get_property), + (gst_tcpserversink_init_send), (gst_tcpserversink_close): + * gst/tcp/gsttcpserversink.h: + Added multifdsink, made tcpserversink a subclass of fdsink, removed + one of the locks, added recovery policy to multifdsink. + +2004-06-26 Thomas Vander Stichele + + * gst/videorate/gstvideorate.c: (gst_videorate_chain): + fix decision for when getting frames with same timestamp + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), + (gst_v4lsrc_get), (gst_v4lsrc_set_property), + (gst_v4lsrc_get_property): + * sys/v4l/gstv4lsrc.h: + add latency offset property + +2004-06-26 Thomas Vander Stichele + + * gst/videorate/gstvideorate.c: (gst_videorate_chain), + (plugin_init): + fix debugging. add category. + +2004-06-25 Thomas Vander Stichele + + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + fix wrong offsets + +2004-06-25 Thomas Vander Stichele + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), + (gst_alsa_src_get_time), (gst_alsa_src_loop), + (gst_alsa_src_change_state): + return a time that is in sync with the element's processing + +2004-06-25 Wim Taymans + + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_client_remove), + (gst_tcpserversink_handle_client_read), + (gst_tcpserversink_client_queue_data), + (gst_tcpserversink_client_queue_caps), + (gst_tcpserversink_client_queue_buffer), + (gst_tcpserversink_handle_client_write), + (gst_tcpserversink_queue_buffer), + (gst_tcpserversink_handle_clients), (gst_tcpserversink_thread), + (gst_tcpserversink_chain), (gst_tcpserversink_set_property), + (gst_tcpserversink_get_property), (gst_tcpserversink_init_send), + (gst_tcpserversink_close): + * gst/tcp/gsttcpserversink.h: + Serversink rewrite. Really do non blocking writes to clients and + maintain an internal queue to handle slower clients while not + disturbing fast clients. + +2004-06-25 Thomas Vander Stichele + + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): + better debug, don't override OFFSET and OFFSET_END + +2004-06-25 Iain + + * gst-libs/gst/media-info/media-info-priv.c (gmi_set_mime): Add + name=source for the wavparse pipeline. + +2004-06-24 Johan Dahlin + + * ext/theora/theoraenc.c (theora_enc_chain): Call + gst_pad_try_set_caps instead of gst_pad_set_explicit_caps so the + streamheader caps are set correctly. + +2004-06-24 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (raw_caps_factory), + (gst_vorbisenc_setup), (gst_vorbisenc_set_property): + respect minimum bitrate; same could be done for max bitrate + +2004-06-24 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (raw_caps_factory), + (gst_vorbisenc_setup): + fix sample rate range + +2004-06-24 Thomas Vander Stichele + + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_class_init), + (gst_oggvorbisenc_setup): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_class_init), + (gst_vorbisenc_setup): + resolve ambiguities in code and description + +2004-06-24 Wim Taymans + + * ext/alsa/gstalsa.c: (gst_alsa_start), (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), + (gst_alsa_src_update_avail), (gst_alsa_src_loop): + Use alsa trigger_tstamp to get the timestamp of the first + sample in the buffer for more precise sync. Some cleanups. + +2004-06-24 Wim Taymans + + * gst/audiorate/gstaudiorate.c: (gst_audiorate_link), + (gst_audiorate_init), (gst_audiorate_chain), + (gst_audiorate_set_property), (gst_audiorate_get_property): + * gst/videorate/gstvideorate.c: (gst_videorate_class_init), + (gst_videorate_chain): + Added some logging, fixed an overflow bug in videorate. + +2004-06-24 Benjamin Otte + + * ext/kio/Makefile.am: + fix for builddir != srcdir and distcheck + +2004-06-24 Benjamin Otte + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + * gst/tcp/Makefile.am: + * sys/dxr3/Makefile.am: + don't include -enumtypes.[ch] or -marshal.[ch] files in the disted + tarball. + Also add all *.list files that were missing. + * Makefile.am: + add a distcheck hook to ensure the above doesn't happen again. + +2004-06-23 David I. Lehn + + * ext/Makefile.am: s/DTS_DIR=dvdread/DTS_DIR=dts/ + +2004-06-23 Colin Walters + + * m4/Makefile.am: Distribute gst-fionread.m4. + +2004-06-23 Thomas Vander Stichele + + * configure.ac: back to dev + +2004-06-23 Wim Taymans + + * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start), + (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), + (gst_alsa_sink_loop), (gst_alsa_sink_get_time): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), + (gst_alsa_src_get_time), (gst_alsa_src_update_avail), + (gst_alsa_src_loop): + Add clock to alsasrc. Take new capture timestamp when + restarting after an overrun. Split up some functions between + alsasrc and alsasink. + +=== release 0.8.2 === + +2004-06-23 Thomas Vander Stichele + + * ext/alsa/gstalsa.c: (gst_alsa_init), (gst_alsa_dispose), + (gst_alsa_change_state), (gst_alsa_update_avail), + (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + merge back changes from release + +2004-06-23 Wim Taymans + + * gst/audiorate/gstaudiorate.c: (gst_audiorate_class_init), + (gst_audiorate_init), (gst_audiorate_chain), + (gst_audiorate_set_property), (gst_audiorate_get_property): + Implement sample dropping and notify + +2004-06-22 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_buffer_from_packet), + (theora_push_packet), (theora_enc_chain): + Some cleanups, make sure the timestamps are correct. + +2004-06-22 Wim Taymans + + * ext/alsa/gstalsa.c: (gst_alsa_get_time), (gst_alsa_clock_update), + (gst_alsa_change_state), (gst_alsa_update_avail), + (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + Cleanups, take queued samples into account when reporting + the time. + +2004-06-22 Wim Taymans + + * gst/videorate/gstvideorate.c: (gst_videorate_class_init), + (gst_videorate_init): + Initialize the property as well. + +2004-06-22 Wim Taymans + + * gst/videorate/gstvideorate.c: (gst_videorate_class_init), + (gst_videorate_init), (gst_videorate_chain), + (gst_videorate_set_property), (gst_videorate_get_property): + Add property to make videorate silent. + Add property to prefer new frames over old ones. + +2004-06-22 Zaheer Abbas Merali + + * sys/osxvideo/Makefile.am: + Workaround so that the osxvideo .so file gets linked with the + Cocoa, OpenGL and QuickTime frameworks + +2004-06-22 Zaheer Abbas Merali + + * sys/osxaudio/Makefile.am: + Workaround so that the osxaudio .so file gets linked with the + CoreAudio framework + +2004-06-22 Zaheer Abbas Merali + + * configure.ac: + Whoops, my fault...fixed build issues + +2004-06-22 Zaheer Abbas Merali + + * configure.ac: + Add objective-c support if running in Darwin/Mac OS X + * sys/Makefile.am: + * sys/osxvideo: + * sys/osxvideo/Makefile.am: + * sys/osxvideo/osxvideosink.h: + * sys/osxvideo/osxvideosink.m: + * sys/osxvideo/cocoawindow.h: + * sys/osxvideo/cocoawindow.m: + Add osxvideosink, a cocoa-based osx video sink + + +2004-06-19 Jan Schmidt + * ext/dvdnav/gst-dvd: + Grab the gconf key from the right spot + * gst/debug/gstnavseek.c: (gst_navseek_init), + (gst_navseek_segseek), (gst_navseek_handle_src_event), + (gst_navseek_chain): + * gst/debug/gstnavseek.h: + Add 's', 'e' and 'l' keypresses to navseek to define the start,end + and loop parameters of a segment seek. + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_init), + (gst_videotestsrc_get_event_masks), + (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): + * gst/videotestsrc/gstvideotestsrc.h: + Add seeking support to videotestsrc + Initialise the timestamp_offset variable. + +2004-06-18 Wim Taymans + + * ext/sidplay/gstsiddec.cc: + Fix negotiation and set correct end offset. + +2004-06-18 Thomas Vander Stichele + + * configure.ac: branch and prerelease + +2004-06-17 Thomas Vander Stichele + + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init), + (gst_tcpclientsrc_getcaps), (gst_tcpclientsrc_get), + (gst_tcpclientsrc_init_receive): + * gst/tcp/gsttcpclientsrc.h: + read caps when connecting to server for GDP so we set them correctly + +2004-06-17 Thomas Vander Stichele + + * gst/videorate/gstvideorate.c: (gst_videorate_chain): + notify drops and duplicates + * gst/videoscale/videoscale.c: (videoscale_get_structure): + no good reason to limit ourselves to 100x100 + +2004-06-17 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), + (gst_v4lsrc_open), (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps), + (gst_v4lsrc_get), (gst_v4lsrc_set_property), + (gst_v4lsrc_get_property): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), + (gst_v4l_open), (gst_v4l_get_picture), (gst_v4l_get_audio), + (gst_v4l_set_audio): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_grab_frame), + (gst_v4lsrc_try_capture): + * sys/v4l/v4lsrc_calls.h: + change try_palette to more general try_capture + add autoprobe option so we can turn off autoprobing + various fixes + +2004-06-17 Thomas Vander Stichele + + * configure.ac: + add videorate + * sys/ximage/ximagesink.c: (gst_ximagesink_finalize), + (gst_ximagesink_class_init): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_finalize), + (gst_xvimagesink_class_init): + run them as finalize, not dispose, since dispose can be invoked + multiple times + +2004-06-17 Wim Taymans + + * ext/alsa/gstalsa.c: (gst_alsa_init), (gst_alsa_dispose), + (gst_alsa_get_time), (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsaclock.c: (gst_alsa_clock_get_type): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), (gst_alsa_src_loop), + (gst_alsa_src_change_state): + * ext/alsa/gstalsasrc.h: + Make the xrun code timestamp and offset the buffers correctly. + moved the clock to the base class, use alsa methods to get time. + Do correct timestamping on outgoing buffers. + +2004-06-17 Wim Taymans + + * gst/audiorate/Makefile.am: + * gst/audiorate/gstaudiorate.c: (gst_audiorate_get_type), + (gst_audiorate_base_init), (gst_audiorate_class_init), + (gst_audiorate_link), (gst_audiorate_init), (gst_audiorate_chain), + (gst_audiorate_set_property), (gst_audiorate_get_property), + (gst_audiorate_change_state), (plugin_init): + Added an audiorate converter that fills in gaps. + +2004-06-17 Johan Dahlin + + * ext/tcp/*: Revert Zaheer changes, to make things actually work again. + +2004-06-16 Wim Taymans + + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), + (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), + (gst_v4lsrc_get), (gst_v4lsrc_set_property), + (gst_v4lsrc_get_property): + * sys/v4l/gstv4lsrc.h: + Added a copy mode to v4lsrc where it will output a copied version + of its internal hardware buffer. + Fix the wrong FLAG_SET usage. The flags are integers, not bits, you + can't | them. + +2004-06-16 Wim Taymans + + * sys/oss/gstosssrc.c: (gst_osssrc_get): + Timestamp fixes. + +2004-06-16 Wim Taymans + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), + (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), + (gst_v4lsrc_get), (gst_v4lsrc_set_property), + (gst_v4lsrc_get_property): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): + Added a sync mode enum property to control v4lsrc timestamp method + Removed the use-fixed-fps property and moved functionality in + the enum. + Don't error on an error value from v4l-conf, it might not always + be a real error. + +2004-06-16 Wim Taymans + + * gst/videorate/Makefile.am: + * gst/videorate/gstvideorate.c: (gst_videorate_get_type), + (gst_videorate_base_init), (gst_videorate_class_init), + (gst_videorate_getcaps), (gst_videorate_link), + (gst_videorate_init), (gst_videorate_chain), + (gst_videorate_set_property), (gst_videorate_get_property), + (gst_videorate_change_state), (plugin_init): + Added a video timestamp corrector. + +2004-06-15 Zaheer Abbas Merali + + fixed a potential leak with previous commit + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): + +2004-06-15 Zaheer Abbas Merali + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): + Added missing refcount, fixes bug #144425 + Cheers Tim for finding the bug + +2004-06-15 Thomas Vander Stichele + + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l/gstv4lcolorbalance.c: + * sys/v4l/gstv4lcolorbalance.h: + * sys/v4l/gstv4lelement.c: + * sys/v4l/gstv4lelement.h: + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): + * sys/v4l/gstv4lmjpegsink.h: + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): + * sys/v4l/gstv4lmjpegsrc.h: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps_list), + (gst_v4lsrc_get_fps), (gst_v4lsrc_srcconnect), + (gst_v4lsrc_getcaps), (gst_v4lsrc_get): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/gstv4ltuner.c: + * sys/v4l/gstv4ltuner.h: + * sys/v4l/gstv4lxoverlay.c: + * sys/v4l/gstv4lxoverlay.h: + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay), + (gst_v4l_set_window), (gst_v4l_enable_overlay): + * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), + (gst_v4l_open), (gst_v4l_get_picture), (gst_v4l_get_audio), + (gst_v4l_set_audio): + * sys/v4l/v4l_calls.h: + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), + (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_sync_frame), + (gst_v4lmjpegsink_set_buffer), (gst_v4lmjpegsink_set_playback), + (gst_v4lmjpegsink_playback_init), + (gst_v4lmjpegsink_playback_start), (gst_v4lmjpegsink_get_buffer), + (gst_v4lmjpegsink_play_frame), (gst_v4lmjpegsink_wait_frame), + (gst_v4lmjpegsink_playback_stop), + (gst_v4lmjpegsink_playback_deinit): + * sys/v4l/v4lmjpegsink_calls.h: + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame), + (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_buffer), + (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), + (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_capture_start), + (gst_v4lmjpegsrc_grab_frame), (gst_v4lmjpegsrc_requeue_frame), + (gst_v4lmjpegsrc_capture_stop), (gst_v4lmjpegsrc_capture_deinit): + * sys/v4l/v4lmjpegsrc_calls.h: + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), + (gst_v4lsrc_sync_frame), (gst_v4lsrc_set_capture), + (gst_v4lsrc_capture_init), (gst_v4lsrc_capture_start), + (gst_v4lsrc_grab_frame), (gst_v4lsrc_requeue_frame), + (gst_v4lsrc_capture_stop), (gst_v4lsrc_capture_deinit), + (gst_v4lsrc_try_palette): + * sys/v4l/v4lsrc_calls.h: + bunch of paranoia cleanups + +2004-06-14 David Schleef + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_init), + (cdparanoia_get), (cdparanoia_open), (cdparanoia_change_state): + Send discont events and change timestamps appropriately when + we get a seek event. (bug #144240) + * ext/cdparanoia/gstcdparanoia.h: + +2004-06-14 Benjamin Otte + + * ext/alsa/gstalsa.c: Use snd_pcm_hw_params_set_rate _near instead of + snd_pcm_hw_params_set_rate since the latter fails for no good + reason on some setups. + +2004-06-14 David Schleef + + * gst/volume/demo.c: (value_changed_callback): exp10() is not + standard. Thank you for playing. + +2004-06-14 Wim Taymans + + * gst/ffmpegcolorspace/imgconvert.c: (img_convert): + Patch 1.3 broke the ordering of the colorspace info and + made the plugin basically work by coincidence, reordered + the info. + +2004-06-14 Thomas Vander Stichele + + * ext/lame/gstlame.c: + * ext/mad/gstmad.c: + sync caps. Make sure mad can only output a list of rates, not + a full range. In the future, have three caps lists for each of the + mpeg versions. Change mpegversion to a double as well. + +2004-06-14 Thomas Vander Stichele + + * gst/volume/.cvsignore: + * gst/volume/Makefile.am: + * gst/volume/demo.c: (value_changed_callback), (idler), + (setup_gui), (main): + added small demo app + +2004-06-13 Jan Schmidt + * ext/esd/esdsink.c: (gst_esdsink_change_state): + * ext/esd/esdsink.h: + Close the esd connection on pause, because esd will just wait - + blocking all other esd clients indefinitely. + +2004-06-12 Christophe Fergeau + + * gst/tags/gstvorbistag.c: replaced a g_warning which I added in my + previous commit with GST_DEBUG + +2004-06-12 Thomas Vander Stichele + + * configure.ac: + add a header check for a dvdread header in dvdnav. Fixes #133002 + +2004-06-12 Zaheer Abbas Merali + + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_init_send): + * gst/tcp/gsttcpclientsink.h: + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init_receive): + * gst/tcp/gsttcpclientsrc.h: + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init), + (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_init_send): + * gst/tcp/gsttcpserversink.h: + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_init_receive): + * gst/tcp/gsttcpserversrc.h: + Modified the tcp plugins so they are portable (IPv4,IPv6, any future + version of IP) + +2004-06-12 Zaheer Abbas Merali + + * configure.ac: + Added ogg library so that OSX detects libtheora properly + +2004-06-11 Wim Taymans + + * ext/theora/theoradec.c: (theora_dec_chain), + (theora_dec_change_state): + Don't try to decode frames before we received a keyframe. + +2004-06-11 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init), + (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop), + (gst_ogg_mux_get_property), (gst_ogg_mux_set_property): + Added property to set the maximum delay of a page. + +2004-06-10 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init), + (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop), + (gst_ogg_mux_get_property), (gst_ogg_mux_set_property): + Added max-delay property to control the maximum amount + of data to put in one page. + +2004-06-10 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (gst_theora_enc_init), (theora_enc_sink_link), + (theora_buffer_from_packet), (theora_enc_set_property), + (theora_enc_get_property): + Set duration on encoded buffer, added some more properties + +2004-06-10 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), + (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), + (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): + * ext/theora/theoraenc.c: (theora_enc_chain): + Fix refcounting bugs + +2004-06-10 Ronald Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), + (gst_asf_demux_loop), (gst_asf_demux_process_file), + (gst_asf_demux_process_data), (gst_asf_demux_handle_data), + (gst_asf_demux_process_object), (gst_asf_demux_get_stream), + (gst_asf_demux_process_chunk), (gst_asf_demux_handle_sink_event), + (gst_asf_demux_handle_src_event), (gst_asf_demux_handle_src_query), + (gst_asf_demux_change_state): + * gst/asfdemux/gstasfdemux.h: + You know Chimaira? "I - HATE - EVERYTHING". Yeah, that's what this + feels like. I think we should set a new requirement for demuxers + from now on to implement sane loop functions, data loops, query + and seek functions before first commit into CVS. And this commit + fixes all of the above. + +2004-06-10 Christophe Fergeau + + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add): make sure parsed + vorbis comments are properly encoded in UTF-8 before adding them + to a GstTagList + +2004-06-09 Benjamin Otte + + * ext/alsa/gstalsa.c: (add_channels): + handle min <= max correctly + * ext/alsa/gstalsa.c: (gst_alsa_fixate_to_mimetype), + (gst_alsa_fixate_field_nearest_int), (gst_alsa_fixate): + add fixation functions so we fixate correctly. No preferring of alaw + anymore because it's the first structure. + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsa.c: (gst_alsa_sw_params_dump), + (gst_alsa_hw_params_dump): + add functions to ease debugging in alsalib + * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), + (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), + (gst_alsa_start_audio): + only specify hw params if we really setup a format (fixes #134007 - + or at least works around it) + +2004-06-09 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), + (gst_ogg_mux_next_buffer), (gst_ogg_mux_buffer_from_page), + (gst_ogg_mux_push_page), (gst_ogg_mux_get_headers), + (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_send_headers), + (gst_ogg_mux_loop): + Use stream caps to setup the initial pages in the ogg stream. + Correctly set the streamheader caps on the srcpad. + +2004-06-09 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps_list), + (gst_v4lsrc_get_fps), (gst_v4lsrc_srcconnect), + (gst_v4lsrc_getcaps): + * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), + (gst_v4l_get_picture), (gst_v4l_get_audio), (gst_v4l_set_audio): + add querying of fps lists for webcams. Negotiating to a framerate + now works. + +2004-06-08 Thomas Vander Stichele + + * ext/theora/theoraenc.c: (theora_buffer_from_packet), + (theora_push_buffer), (theora_push_packet), + (theora_set_header_on_caps), (theora_enc_chain): + mark buffers and put on streamheader, raw theora streaming + now works too, whee + +2004-06-08 Thomas Vander Stichele + + * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_header), + (gst_tcp_gdp_read_caps): + do a looping read for caps and GDP headers too + +2004-06-08 Thomas Vander Stichele + + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_get): + return EOS instead of NULL in _get + +2004-06-08 Wim Taymans + + * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_header), + (gst_tcp_gdp_read_caps), (gst_tcp_gdp_write_header), + (gst_tcp_gdp_write_caps): + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_gdp_read_caps), + (gst_tcpserversrc_gdp_read_header), (gst_tcpserversrc_get): + Memory leak fixes + +2004-06-08 Thomas Vander Stichele + + * ext/vorbis/Makefile.am: + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisparse.c: (gst_vorbis_parse_base_init), + (gst_vorbis_parse_class_init), (gst_vorbis_parse_init), + (vorbis_parse_set_header_on_caps), (vorbis_parse_chain), + (vorbis_parse_change_state): + * ext/vorbis/vorbisparse.h: + adding a vorbisparse element that marks the buffers, streaming + raw vorbis using GDP now works, whee + +2004-06-08 Wim Taymans + + * ext/jpeg/Makefile.am: + * ext/jpeg/README: + * ext/jpeg/gstjpeg.c: (plugin_init): + * ext/jpeg/gstsmokedec.c: (gst_smokedec_get_type), + (gst_smokedec_base_init), (gst_smokedec_class_init), + (gst_smokedec_init), (gst_smokedec_link), (gst_smokedec_chain): + * ext/jpeg/gstsmokedec.h: + * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_get_type), + (gst_smokeenc_base_init), (gst_smokeenc_class_init), + (gst_smokeenc_init), (gst_smokeenc_getcaps), (gst_smokeenc_link), + (gst_smokeenc_resync), (gst_smokeenc_chain), + (gst_smokeenc_set_property), (gst_smokeenc_get_property): + * ext/jpeg/gstsmokeenc.h: + * ext/jpeg/smokecodec.c: (smokecodec_init_destination), + (smokecodec_flush_destination), (smokecodec_term_destination), + (smokecodec_init_source), (smokecodec_fill_input_buffer), + (smokecodec_skip_input_data), (smokecodec_resync_to_restart), + (smokecodec_term_source), (smokecodec_encode_new), + (smokecodec_decode_new), (smokecodec_info_free), + (smokecodec_set_quality), (smokecodec_get_quality), + (smokecodec_set_threshold), (smokecodec_get_threshold), + (smokecodec_set_bitrate), (smokecodec_get_bitrate), + (find_best_size), (abs_diff), (put), (smokecodec_encode), + (smokecodec_parse_header), (smokecodec_decode): + * ext/jpeg/smokecodec.h: + Added a new simple jpeg based codec + +2004-06-08 Wim Taymans + + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_loop): + Fix memory leak + +2004-06-08 Thomas Vander Stichele + + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_client_remove), + (gst_tcpserversink_handle_client_read), (gst_tcp_buffer_write), + (gst_tcpserversink_handle_client_write), (gst_tcpserversink_chain), + (gst_tcpserversink_init_send), (gst_tcpserversink_close): + * gst/tcp/gsttcpserversink.h: + take streamheader into account + +2004-06-08 Thomas Vander Stichele + + * gst/level/Makefile.am: + * gst/level/gstlevel.c: (gst_level_class_init): + clean up marshal generation + +2004-06-08 Thomas Vander Stichele + + * gst/tcp/Makefile.am: + * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_get_type), + (gst_tcpclientsink_class_init), (gst_tcpclientsink_init), + (gst_tcpclientsink_set_property), (gst_tcpclientsink_get_property): + * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), + (gst_tcpclientsrc_init), (gst_tcpclientsrc_set_property), + (gst_tcpclientsrc_get_property): + * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), + (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), + (gst_tcpserversink_handle_client_read), + (gst_tcpserversink_handle_client_write), + (gst_tcpserversink_set_property), (gst_tcpserversink_get_property): + * gst/tcp/gsttcpserversink.h: + add signals client-added and client-removed + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init), + (gst_tcpserversrc_init), (gst_tcpserversrc_set_property), + (gst_tcpserversrc_get_property): + uniformized, change default protocol to NONE + * gst/tcp/gsttcp-marshal.list: added +2004-06-07 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + handle discont events if they happen before caps nego + +2004-06-07 Wim Taymans + + * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), + (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), + (gst_multipart_demux_plugin_init): + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_init), (gst_multipart_mux_loop), + (gst_multipart_mux_change_state): + Small updates, fix a memleak + +2004-06-07 Stephane Loeuillet + + * configure.ac: OSS portability + * ext/arts/gst_arts.c: idem + * sys/oss/gstosselement.c: idem + * sys/oss/gstossmixer.c: idem + * sys/oss/gstosssink.c: idem + * sys/oss/gstosssrc.c: idem + * sys/oss/oss_probe.c: idem + - check for soundcard.h in different places for some BSD + +2004-06-07 Jan Schmidt + + * AUTHORS: + Add me to the authors file + * configure.ac: + Increase the libdv requirement to >= version 0.100 + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), + (gst_dvdec_src_query), (gst_dvdec_handle_sink_event), + (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state): + * ext/dv/gstdvdec.h: + Add support for the new_media flag when sending DISCONT events + Make the querying work when video pad is not linked + +2004-06-07 Tim-Philipp Müller + + reviewed by Benjamin Otte + + * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_init): + create a NULL-initialized array of pads, so we don't think they + exist already. (fixes #143130) + +2004-06-07 Benjamin Otte + + * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_init), + (mixmatrix_resize), (gst_mixmatrix_set_all_caps), + (gst_mixmatrix_request_new_pad), (gst_mixmatrix_loop): + don't use // coments + +2004-06-07 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_samples_to_timestamp): + cast to GstClockTime to get higher granularity + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + use gst_element_set_time_delay to get the exact time + * ext/mad/gstmad.c: (gst_mad_chain): + use the negotiated rate instead of the current frame's rate which + might be wrong because of bit errors. This avoids emitting totally + bogus timestamps and screwing sync. + (fixes #143454) + +2004-06-07 Tim-Philipp Müller + + reviewed by Benjamin Otte + + * gst/adder/gstadder.c: (gst_adder_loop): + properly error out when no negotiation has happened yet. (fixes + #143032) + +2004-06-06 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): + forward correctly transformed offset in discont events. Based on + patch by Arwed v. Merkatz. (fixes #142851) + +2004-06-06 David Schleef + + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: that's + G_HAVE_GNUC_VARARGS, not G_HAVE_GNU_VARARGS. Should fix compile + problems on several systems. + +2004-06-06 Benjamin Otte + + * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init): + use explicit caps on the srcpad + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + properly error out if caps couldn't be set (fixes #142764) + +2004-06-06 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), + (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), + (gst_alsa_start_audio): + - don't call set_periods_integer anymore, it breaks the + configuration randomly + - call snd_pcm_hw_params_set_access directly instead of using masks + - don't fail if the sw_params can't be set, just use the default + params and hope it works. Alsalib has weird issues when you touch + sw_params and does no proper error reporting about what failed. + * ext/alsa/gstalsa.c: (gst_alsa_open_audio), + (gst_alsa_close_audio): + make our alsa debugging go via gst debugging and not conditionally + defined + * ext/alsa/gstalsa.h: + add ALSA_DEBUG_FLUSH macro + * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper), + (plugin_init): + wrap alsa errors to be printed via the gst debugging system and not + spammed to stderr + +2004-06-04 Ronald Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), + (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), + (gst_qtdemux_handle_sink_event), (gst_qtdemux_change_state), + (gst_qtdemux_loop_header), (qtdemux_dump_mvhd), + (qtdemux_parse_trak): + * gst/qtdemux/qtdemux.h: + Bitch. Also known as seeking, querying & co. + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), + (gst_osssink_change_state): + * sys/oss/gstosssink.h: + Resyncing is for weenies, this hack is no longer needed and was + broken anyway (since it - unintendedly - always leaves resync to + TRUE). + +2004-06-05 Andrew Turner + + * gst/tcp/gsttcp.c: portability (Solaris 10/FreeBSD) + * gst/tcp/gsttcpclientsrc.h: idem + - define MSG_NOSIGNAL if not done + - include unistd.h for off_t + (fixes #143749) + +2004-06-05 Benjamin Otte + + * configure.ac: + * ext/kio/Makefile.am: + check for qt's moc preprocessor explicitly and use it + +2004-06-03 Thomas Vander Stichele + + * gst/tcp/gsttcp.c: (gst_tcp_socket_write): + don't get a signal for EPIPE on socket writes + (somebody check if this works on other platforms) + +2004-06-02 Thomas Vander Stichele + + * ext/alsa/gstalsaclock.c: (gst_alsa_clock_get_type): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + check error condition on available samples correctly + +2004-06-02 Thomas Vander Stichele + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_get_time): + avoid a segfault + * gst/tcp/gsttcp.c: (gst_tcp_socket_write), (gst_tcp_socket_read), + (gst_tcp_gdp_read_header), (gst_tcp_gdp_read_caps): + * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_gdp_read_caps), + (gst_tcpserversrc_gdp_read_header): + use ssize_t over size_t since the former is signed and thus the + check for error codes can work + +2004-06-02 Wim Taymans + + reviewed by: Johan + + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_loop): + Oops + +2004-06-02 Wim Taymans + + * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), + (gst_multipart_mux_init), (gst_multipart_mux_loop), + (gst_multipart_mux_get_property), (gst_multipart_mux_set_property), + (gst_multipart_mux_change_state): + Added configurable boundary specifier, added the value as a + caps field as well. + +2004-06-02 Zaheer Abbas Merali + + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpclientsrc.h: + * gst/tcp/gsttcpserversrc.c: + - portability fix, to compile on OSX + (fixes #143146) + + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosrc.c: + - compilation warnings on OSX + (fixes #143153) + +2004-06-02 Stephane Loeuillet + + * ext/vorbis/vorbisdec.c : sign warning fixes + + * gst-libs/gst/mixer/mixertrack.c : + do no use defines which are glib 2.4 specific + +2004-06-01 Christophe Fergeau + + * ext/flac/gstflactag.c: strip ending framing bit from vorbiscomment + buffer since libflac doesn't expect it (reports a sync error when + it encounters that) + + +2004-06-01 Owen Fraser-Green + + * gst-libs/gst/mixer/mixertrack.h: Changed struct syntax + * gst-libs/gst/mixer/mixertrack.c: + (gst_mixer_track_get_property), (get_mixer_track_init), + (get_mixer_track_get_property): Added property accessors + * gst-libs/gst/mixer/mixeroptions.h: Changed struct syntax + * gst-libs/gst/mixer/mixeroptions.c: + (gst_mixer_options_get_values): Added + * gst-libs/gst/mixer/mixer.h: Changed GstMixerClass syntax + * gst-libs/gst/mixer/mixer.c: Fixed comment + + +2004-06-01 Thomas Vander Stichele + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio): + improve error messages on open + + +2004-06-01 Thomas Vander Stichele + + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): + check if v4l-conf is in path + +2004-06-01 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: (gmi_set_mime): + change assert to a more readable error message + +2004-05-31 Stephane Loeuillet + + * gst-libs/gst/tuner/tunerchannel.h: + - add a freq_multiplicator field to make the conversion + between internal frequency unit and Hz + * sys/v4l/gstv4lelement.c: + * sys/v4l2/gstv4l2element.c: + - change default video device to /dev/video0 + * sys/v4l/v4l_calls.c: + * sys/v4l2/v4l2_calls.c: + - we only expose frequency to the user in Hz instead of + bastard v4lX unit (either 62.5kHz or 62.5Hz) + +2004-05-31 Jan Schmidt + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + Initialise b_o_s and e_o_s variables + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + Add some unusual fourcc's from mplayer avi's + * gst/multipart/multipartmux.c: (gst_multipart_mux_plugin_init): + Make the muxer have rank GST_RANK_NONE, so it doesn't mess up + autoplugging. + +2004-05-28 Wim Taymans + + * configure.ac: + * gst/alpha/Makefile.am: + * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), + (gst_alpha_get_type), (gst_alpha_base_init), + (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), + (gst_alpha_get_property), (gst_alpha_sink_link), (gst_alpha_add), + (gst_alpha_chroma_key), (gst_alpha_chain), + (gst_alpha_change_state), (plugin_init): + A plugin to add an alpha channel to I420 video. Can optionally do + chroma keying. + * gst/multipart/Makefile.am: + * gst/multipart/multipart.c: (plugin_init): + * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), + (gst_multipart_demux_class_init), (gst_multipart_demux_init), + (gst_multipart_demux_finalize), (gst_multipart_demux_handle_event), + (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), + (gst_multipart_demux_change_state), + (gst_multipart_demux_plugin_init): + * gst/multipart/multipartmux.c: (gst_multipart_mux_get_type), + (gst_multipart_mux_base_init), (gst_multipart_mux_class_init), + (gst_multipart_mux_get_sink_event_masks), (gst_multipart_mux_init), + (gst_multipart_mux_sinkconnect), (gst_multipart_mux_pad_link), + (gst_multipart_mux_pad_unlink), + (gst_multipart_mux_request_new_pad), + (gst_multipart_mux_handle_src_event), + (gst_multipart_mux_next_buffer), (gst_multipart_mux_compare_pads), + (gst_multipart_mux_queue_pads), (gst_multipart_mux_loop), + (gst_multipart_mux_get_property), (gst_multipart_mux_set_property), + (gst_multipart_mux_change_state), (gst_multipart_mux_plugin_init): + A Multipart demuxer/muxer. Not sure if it violates specs. Used to + send multipart jpeg images to a browser. + * gst/videobox/Makefile.am: + * gst/videobox/README: + * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type), + (gst_video_box_get_type), (gst_video_box_base_init), + (gst_video_box_class_init), (gst_video_box_init), + (gst_video_box_set_property), (gst_video_box_get_property), + (gst_video_box_sink_link), (gst_video_box_i420), + (gst_video_box_ayuv), (gst_video_box_chain), + (gst_video_box_change_state), (plugin_init): + Crops or adds borders around an image. can do alpha channel + borders as well. + * gst/videomixer/Makefile.am: + * gst/videomixer/README: + * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), + (gst_videomixer_pad_base_init), (gst_videomixer_pad_class_init), + (gst_videomixer_pad_get_sink_event_masks), + (gst_videomixer_pad_get_property), + (gst_videomixer_pad_set_property), + (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_link), + (gst_videomixer_pad_unlink), (gst_videomixer_pad_init), + (gst_video_mixer_background_get_type), (gst_videomixer_get_type), + (gst_videomixer_base_init), (gst_videomixer_class_init), + (gst_videomixer_init), (gst_videomixer_request_new_pad), + (gst_videomixer_handle_src_event), + (gst_videomixer_blend_ayuv_i420), (gst_videomixer_fill_checker), + (gst_videomixer_fill_color), (gst_videomixer_fill_queues), + (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), + (gst_videomixer_loop), (gst_videomixer_get_property), + (gst_videomixer_set_property), (gst_videomixer_change_state), + (plugin_init): + Generic video mixer plugin, can handle multiple inputs all with + different framerates and video sizes. Is fully alpha channel + aware. + +2004-05-27 Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + Select first track as master track. Not sure how else to handle + that... + * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer): + Discard discont events. Should fix #142962. + +2004-05-26 Ronald Bultje + + * ext/alsa/Makefile.am: + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_interface_init), + (gst_alsa_mixer_build_list), (gst_alsa_mixer_get_volume), + (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), + (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), + (gst_alsa_mixer_get_option): + * ext/alsa/gstalsamixer.h: + * ext/alsa/gstalsamixeroptions.c: + (gst_alsa_mixer_options_get_type), + (gst_alsa_mixer_options_class_init), (gst_alsa_mixer_options_init), + (gst_alsa_mixer_options_new): + * ext/alsa/gstalsamixeroptions.h: + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): + * ext/alsa/gstalsamixertrack.h: + Add enumerations (as GstMixerOptions). Make correct distinction + between input/output tracks. Add capture/playback private flag. + Use flag to decide on whether to set capture or playback volumes + or switches. Use playback and record switches. + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/mixer/mixer-marshal.list: + * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init), + (gst_mixer_set_option), (gst_mixer_get_option), + (gst_mixer_mute_toggled), (gst_mixer_record_toggled), + (gst_mixer_volume_changed), (gst_mixer_option_changed): + * gst-libs/gst/mixer/mixer.h: + * gst-libs/gst/mixer/mixeroptions.c: (gst_mixer_options_get_type), + (gst_mixer_options_class_init), (gst_mixer_options_init), + (gst_mixer_options_dispose): + * gst-libs/gst/mixer/mixeroptions.h: + Add GstMixerOptions. + * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): + Rename Audio Mixer to OSS Mixer (similar to Alsa Mixer). Fix + broken device detection on computers with multiple OSS sound + cards. + +2004-05-26 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): + fixate nicely even when the peer is not negotiating + +2004-05-25 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_parse_caps): + make sure we don't allow depth > width + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): + fixate endianness to G_BYTE_ORDER as default + * gst/audioscale/gstaudioscale.c: + we don't handle another endianness as host-endianness + +2004-05-25 David Schleef + + * gst/ffmpegcolorspace/mem.c: malloc() is in stdlib.h, not malloc.h + +2004-05-24 Benjamin Otte + + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_sinkconnect), + (gst_oggvorbisenc_setup): + properly fail when we can't setup the vorbis encoder due to + unsupported settings + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_sinkconnect), + (gst_vorbisenc_setup): + same + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + fix case where warnings occured when one pad was unlinked while the + other's link function was called + +2004-05-24 Thomas Vander Stichele + + * gst/tcp/Makefile.am: + use GST_ENABLE_NEW + +2004-05-24 Benjamin Otte + + * gst-libs/gst/resample/private.h: + don't use optimizations that are #if 0'ed + +2004-05-24 Wim Taymans + + * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): + Fix potential division by zero error and hopefully get + the position query right to get correct timestamps on avi + audio. + +2004-05-24 Wim Taymans + + * gst/videoscale/videoscale.c: (gst_videoscale_scale_nearest), + (gst_videoscale_scale_nearest_str2), + (gst_videoscale_scale_nearest_str4), + (gst_videoscale_scale_nearest_32bit), + (gst_videoscale_scale_nearest_24bit), + (gst_videoscale_scale_nearest_16bit): + Fix the scaling algorithm and avoid a buffer overflow. + removed the while loop in the scaling function as it + was used for point sampling only. + +2004-05-24 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_get_type), + (gst_id3_tag_class_init), (gst_id3_tag_init), + (gst_id3_tag_set_property), (gst_id3_tag_get_tag_to_render), + (gst_id3_tag_handle_event), (gst_id3_tag_do_caps_nego), + (gst_id3_tag_send_tag_event): + lots of fixes to make id3mux work and id3demux work correctly + +2004-05-24 Stephane Loeuillet + + * ext/Makefile.am: + add rules to build shout2send (was removed by accident + when this module was no more marked experimental/broken) + +2004-05-24 Zaheer Abbas Merali + + * ext/shout2/gstshout2.c: + * ext/shout2/gstshout2.h: + adding a "connection problem" signal to shout2send + (fixes #142954) + +2004-05-21 Thomas Vander Stichele + + * ext/kio/kioreceiver.cpp: + * ext/kio/kioreceiver.h: + fix sign comparison issues + +2004-05-21 Stephane Loeuillet + + * gst/cdxaparse/gstcdxaparse.c: + * gst/cdxaparse/gstcdxaparse.h: + some renaming + add some checks/sanity + prepare for seek addition + + * sys/sunaudio/gstsunaudio.c: + remove exported dupe init function + +2004-05-21 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_get_formats), + (gst_dvdec_src_convert), (gst_dvdec_sink_convert): + Fix format conversion and position querying. + * gst/debug/progressreport.c: (gst_progressreport_report): + Don't output a bogus total value that we didn't query. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): + Always set XV_AUTOPAINT_COLORKEY to true. Fixes xvimagesink showing + only a blank window after xine has been used. + +2004-05-21 Thomas Vander Stichele + + * m4/as-arts.m4: + sync with upstream version to fix test on FC2 + readd with -ko to preserve Id header + +2004-05-20 Stephane Loeuillet + + * configure.ac: + test for FIONREAD ioctl in sys/filio.h for Solaris compat. + * gst/tcp/gsttcpclientsrc.c: idem + * gst/tcp/gsttcpserversink.c: idem + * gst/tcp/gsttcpserversrc.c: idem + * m4/gst-fionread.m4: idem + + * sys/sunaudio/gstsunaudio.c: change category to Sink/Audio + + * configure.ac: enable speex plugin for speex 1.1.5+ + * ext/speex/gstspeexenc.c: fix cast warning + + * ext/esd/README: fix typo + +2004-05-20 David Schleef + + * configure.ac: Minor cosmetic change to convince the buildbot to + reautogen. + * sys/sunaudio/gstsunaudio.c: (gst_sunaudiosink_class_init), + (gst_sunaudiosink_init), (gst_sunaudiosink_getcaps), + (gst_sunaudiosink_pad_link), (gst_sunaudiosink_chain), + (gst_sunaudiosink_setparams), (gst_sunaudiosink_open), + (gst_sunaudiosink_close), (gst_sunaudiosink_change_state), + (gst_sunaudiosink_set_property), (gst_sunaudiosink_get_property): + More hacking. Plays audio now. + +2004-05-20 David Schleef + + * configure.ac: + * sys/Makefile.am: + +2004-05-20 David Schleef + + * sys/osxaudio/Makefile.am: New OS X audio plugin by Zaheer Abbas Merali + * sys/osxaudio/gstosxaudio.c: + * sys/osxaudio/gstosxaudioelement.c: + * sys/osxaudio/gstosxaudioelement.h: + * sys/osxaudio/gstosxaudiosink.c: + * sys/osxaudio/gstosxaudiosink.h: + * sys/osxaudio/gstosxaudiosrc.c: + * sys/osxaudio/gstosxaudiosrc.h: + +2004-05-20 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_set_header_on_caps), + (gst_vorbisenc_chain): + put the codec headers on the caps as streamheader as well as + pushing them out + +2004-05-20 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (vorbis_granule_time_copy), + (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_push_buffer), + (gst_vorbisenc_push_packet), (gst_vorbisenc_chain): + split up push_packet into two functions + +2004-05-20 Thomas Vander Stichele + + * gst/tcp/.cvsignore: + ignore enums + * gst/tcp/Makefile.am: + * gst/tcp/README: + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcp.h: + * gst/tcp/gsttcpclientsink.c: + * gst/tcp/gsttcpclientsink.h: + * gst/tcp/gsttcpclientsrc.c: + * gst/tcp/gsttcpclientsrc.h: + * gst/tcp/gsttcpplugin.c: + * gst/tcp/gsttcpserversink.c: + * gst/tcp/gsttcpserversink.h: + * gst/tcp/gsttcpserversrc.c: + * gst/tcp/gsttcpserversrc.h: + add new tcp elements + +2004-05-19 Wim Taymans + + * gst/law/mulaw-conversion.c: (mulaw_encode): + Fix overflow bug in ulaw encoding. + +2004-05-19 Benjamin Otte + + * ext/mad/gstmad.c: (gst_mad_handle_event): + don't unref the event twice + +2004-05-19 Benjamin Otte + + * configure.ac: + remove -Wno-sign-compare + +2004-05-19 Benjamin Otte + + * configure.ac: + remove -DG_DISABLE_DEPRECATED. It's not usable without workarounds + if you want to work against glib 2.2 and 2.4 + +2004-05-19 Thomas Vander Stichele + + * gst/tcp/Makefile.am: + * gst/tcp/gsttcp.c: + * gst/tcp/gsttcp.h: + * gst/tcp/gsttcpsink.h: + * gst/tcp/gsttcpsrc.h: + gsttcp -> gsttcpplugin + CVS surgery in preparation for tcp merge + +2004-05-19 Benjamin Otte + + * gst/debug/tests.c: (md5_get_value): + fix segfault on gst-inspect + +2004-05-19 Benjamin Otte + + * gst/debug/testplugin.c: + * gst/debug/tests.c: + * gst/debug/tests.h: + add new extensible and configurable testing element. Current tests + include buffer count, stream length, timestamp/duration matching and + md5. + * gst/debug/Makefile.am: + * gst/debug/gstdebug.c: (plugin_init): + add infrastructure for new element + +2004-05-19 Johan Dahlin + + * ext/dv/gstdvdec.c (gst_dvdec_quality_get_type): Add proper + ending of the array. Fixes gst-inspect segfault on ppc. + +2004-05-19 Stephane Loeuillet + + * ext/dirac/gstdiracdec.cc : change category to Codec/Decoder/Video + + * m4/a52.m4 : don't fix a test that should fail with current a52dec lib + +2004-05-18 David Schleef + + * gst/ffmpegcolorspace/imgconvert.c: (img_convert): Fixes for + warnings (bugs, actually) noticed by gcc but not forte. + +2004-05-18 David Schleef + + * sys/sunaudio/Makefile.am: + * sys/sunaudio/gstsunaudio.c: New sunaudiosink + +2004-05-18 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), + (gst_qtdemux_loop_header): Patch from dcm@acm.org (David Moore) + to allow qtdemux to use non-seekable streams. (bug #142272) + +2004-05-18 David Schleef + + * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16), + (gst_resample_sinc_ft_float): Remove use of static temporary + buffer. This code was obviously not supposed to last long, but + it's stuck in our ABI, so it required a little hack to make it + ABI-compatible. Fixes #142585. + * gst-libs/gst/resample/resample.h: same. + +2004-05-18 David Schleef + + * configure.ac: Add sunaudio + * examples/Makefile.am: make gstplay depend on gconf + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Remove c99-isms + * gst/ffmpegcolorspace/imgconvert.c: (build_rgb_palette), + (convert_table_lookup), (img_convert): remove c99-isms + * gst/ffmpegcolorspace/imgconvert_template.h: make a constant + unsigned, to fix a warning on Solaris + * gst/mpeg1sys/systems.c: bcopy->memcpy + * gst/rtjpeg/RTjpeg.c: (RTjpeg_yuvrgb8): bcopy->memcpy + * sys/Makefile.am: Add sunaudio + +2004-05-18 Wim Taymans + + * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), (gst_ogg_mux_init), + (gst_ogg_mux_sinkconnect), (gst_ogg_mux_request_new_pad), + (gst_ogg_mux_next_buffer), (gst_ogg_mux_push_page), + (gst_ogg_mux_compare_pads), (gst_ogg_mux_queue_pads), + (gst_ogg_mux_loop): + Fix an ugly memleak where the muxer didn't flush enough ogg + pages. This also resulted in badly muxed ogg files. + +2004-05-18 Stephane Loeuillet + + * gst/asfdemux/asfheaders.c : + * gst/asfdemux/asfheaders.h : + * gst/asfdemux/gstasfdemux.c : + - fix ASF_OBJ_PADDING guid + - add 3 new object guids (language list, metadata, + extended stream properties) + - add a function to parse extended header objects + +2004-05-18 Benjamin Otte + + * sys/oss/gstosselement.c: (gst_osselement_sync_parms): + remove leftover debugging g_print + +2004-05-17 Ronald Bultje + + * ext/mad/gstmad.c: (gst_mad_handle_event): + Fix for when the first format in a discont event is not a + byte-based one. Should fix #137710. + +2004-05-18 Stephane Loeuillet + + * m4/a52.m4 : fix compilation with -Wall -Werror + * m4/libfame.m4 : idem + * m4/libmikmod.m4 : idem + +2004-05-17 Benjamin Otte + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): + signal the new tags before giving up the reference + +2004-05-17 Benjamin Otte + + * ext/shout2/gstshout2.c: + use application/ogg instead of application/x-ogg (patch by Patrick + Guimond, fixes #142432) + * sys/oss/gstosselement.c: (gst_osselement_reset), + (gst_osselement_sync_parms): + don't set fragment size unless specified (fixes #142493) + +2004-05-17 Stephane Loeuillet + + * configure.ac : fix compilation of v4l2src with "-Wall -Werror" + fixes #142664 + +2004-05-17 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + compute offsets correctly for internal buffers so timestamps are set + correctly when we can't seek. Also handle cases where there are no + offsets. (based on a patch by David Moore, fixes #142507) + +2004-05-17 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + use correct variable when determining amount of data to skip so we + don't skip into the void and segfault + +2004-05-16 Benjamin Otte + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): + Hi, I'm a memleak + +2004-05-16 Stephane Loeuillet + + * gst/asfdemux/gstasfdemux.c: + - fix a mem leak and always propagate tags + - add WMV3 to known video codecs (but no decoder yet) + - replace "surplus data" at end of audio header for what + it is : codec specific data + - fix a typo + +2004-05-16 Arwed v. Merkatz + + reviewed by: Ronald Bultje + + * gst-libs/gst/audio/audioclock.c: + Fix wrong return type (#142205). + +2004-05-16 Ronald Bultje + + * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_init): + Ignore CRCs by default (fixes #142566). + +2004-05-16 Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open), + (gst_alsa_mixer_close), (gst_alsa_mixer_supported), + (gst_alsa_mixer_build_list), (gst_alsa_mixer_free_list), + (gst_alsa_mixer_change_state), (gst_alsa_mixer_list_tracks), + (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), + (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record): + Fix for cases where we fail to attach to a mixer. + +2004-05-16 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): + Don't touch events after not owning them anymore. + * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), + (gst_wavparse_fmt), (gst_wavparse_other), + (gst_wavparse_handle_seek), (gst_wavparse_loop), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query), + (gst_wavparse_srcpad_event): + * gst/wavparse/gstwavparse.h: + Add seeking, fix querying. + +2004-05-16 Stephane Loeuillet + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): + - process comments even if they don't end with \0\0 + g_convert would ignore them if present and works well without them + +2004-05-16 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_caps), (gst_alsa_get_caps): + simplify caps + +2004-05-16 Benjamin Otte + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): + don't write to memory we might not write to - g_convert does that + for us anyway (fixes #142613) + (gst_asf_demux_audio_caps): + comment out gst_util_dump_mem + +2004-05-16 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + compute correct expected timestamps after seek (broken since + last commit) + * ext/gdk_pixbuf/pixbufscale.c: (pixbufscale_init): + rename element and debugging category to gdkpixbufscale + +2004-05-16 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + add error checking to snd_pcm_delay and remove duplicate call to + snd_pcm_delay that caused issues (see inline code comments) + * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): + make more readable and fix return value when snd_pcm_delay fails + (fixes #142586) + +2004-05-15 Jan Schmidt + * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_method_get_type), + (gst_pixbufscale_get_type), (gst_pixbufscale_base_init), + (gst_pixbufscale_class_init), (gst_pixbufscale_getcaps), + (gst_pixbufscale_link), (gst_pixbufscale_init), + (gst_pixbufscale_handle_src_event), (pixbufscale_scale), + (gst_pixbufscale_chain), (gst_pixbufscale_set_property), + (gst_pixbufscale_get_property), (pixbufscale_init): + * ext/gdk_pixbuf/pixbufscale.h: + Add these files I forgot earlier + +2004-05-15 Jan Schmidt + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): + * ext/gdk_pixbuf/gstgdkpixbuf.h: + Add new pixbufscale element to scale RGB video + using gdk_pixbuf, because gdk_pixbuf does BILINEAR + and HYPER interpolation correctly. + * ext/theora/theoraenc.c: (theora_enc_chain), + Discard buffer and return if explicit caps could not be set + (theora_enc_get_property): + Make _get return kbps for the bitrate consistent with + the _set function. + + +2004-05-14 Benjamin Otte + + * ext/libvisual/visual.c: (gst_visual_chain): + add missing visual_audio_analyze + +2004-05-14 David Schleef + + * ext/esd/esdsink.c: (gst_esdsink_chain): Fix crash when ESD + is killed while we're playing. + * gst/qtdemux/qtdemux.c: (qtdemux_parse): call + gst_element_no_more_pads(). + +2004-05-14 Stephane Loeuillet + + * gst-libs/gst/riff/riff-read.c : + - fix INFO tag extraction in RIFF/AVI files + because gst_event_unref (event) also freed taglist + - avoid a mem leak + +2004-05-13 Stephane Loeuillet + + * ext/mad/gstid3tag.c : move from "Codec/(Dem/M)uxer" to "Codec/(Dem/M)uxer/Audio" + * gst/wavenc/gstwavenc.c : move from "Codec/Encoder/Audio" to "Codec/Muxer/Audio" + + * gst/auparse/gstauparse.c : + - add code (commented for now) to support audio/x-adpcm on src pad + (we have no decoder for those layout yet) + + * gst/cdxaparse/gstcdxaparse.c : + * gst/cdxaparse/gstcdxaparse.h : + - partial rewrite using RiffRead (ripped iain's wavparse code) + + * gst/rtp/gstrtpL16enc.c : typo + * gst/rtp/gstrtpgsmenc.c : typo + +2004-05-13 Benjamin Otte + + * configure.ac: + check for exact version of libvisual, it's not supposed to be + API/ABI stable yet + +2004-05-13 Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push): + signal no-more-pads + +2004-05-13 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_src_convert) + Report which format was used for GST_FORMAT_DEFAULT + * gst/debug/Makefile.am: + * gst/debug/gstdebug.c: (plugin_init): + * gst/debug/progressreport.c: (gst_progressreport_base_init), + (gst_progressreport_class_init), (gst_progressreport_init), + (gst_progressreport_report), (gst_progressreport_set_property), + (gst_progressreport_get_property), (gst_progressreport_chain), + (gst_progressreport_plugin_init): + Add progressreport element for testing. + +2004-05-13 Thomas Vander Stichele + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_change_state): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_playback_init): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_init): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init), + (gst_v4lsrc_grab_frame): + add more debugging + send a discont at start + +2004-05-12 Colin Walters + + * gst/asfdemux/gstasfdemux.c (gst_asf_demux_process_segment): Avoid + inflooping if we can't find a chunk. Or in other words, don't blow + chunks if we don't have a chunk to blow. + +2004-05-13 Jan Schmidt + * ext/audiofile/gstafsrc.c: (gst_afsrc_get): + Remove old debug output + * ext/dv/gstdvdec.c: (gst_dvdec_quality_get_type), + (gst_dvdec_class_init), (gst_dvdec_loop), (gst_dvdec_change_state), + (gst_dvdec_set_property), (gst_dvdec_get_property): + Change the quality setting to an enum, so it works from gst-launch + Don't renegotiate a non-linked pad. Allows audio only decoding. + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_getcaps), + (gst_deinterlace_link), (gst_deinterlace_init): + * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), + (gst_videodrop_link): + Some caps negotiation fixes + +2004-05-12 Stephane Loeuillet + + * ext/tarkin/gsttarkin.c : + - Change RANK from NONE to PRIMARY + * ext/gdk_pixbuf/gstgdkpixbuf.c : + - Change RANK from NONE to MARGINAL + * ext/divx/gstdivxenc.c : + - Change RANK from PRIMARY to NONE (encoder/spider issue) + +2004-05-12 Thomas Vander Stichele + + * ext/vorbis/vorbisenc.c: (vorbis_granule_time_copy), + (gst_vorbisenc_push_packet): + copy a function that was added between 1.0 and 1.0.1 until we + depend on worthwhile features of post-1.0 + +2004-05-12 Benjamin Otte + + * configure.ac: + enable shout2 by default + * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type), + (gst_shout2send_base_init), (gst_shout2send_init), + (gst_shout2send_connect), (gst_shout2send_change_state): + * ext/shout2/gstshout2.h: + make this work again. Based on a patch by Zaheer Abbas Merali (fixes + #142262) + * ext/theora/theora.c: (plugin_init): + don't set rank on encoders + +2004-05-11 Jeremy Simon + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): + Use codec_data property instead of flag1 and flag2 for wma + +2004-05-11 Stephane Loeuillet + + * gst/cdxaparse/gstcdxaparse.c : + - Add mpegversion to CAPS to make it link + - Rank is as GST_RANK_SECONDARY instead of NONE + * gst/auparse/gstauparse.c : + - Document all audio encoding we can encounter from Solaris 9 + headers and libsndfile information. + - Increase max. rate from 48000 to 192000 (to match other elements) + - Don't try to play junk data between header and samples + +2004-05-11 Benjamin Otte + + * ext/libvisual/visual.c: (gst_visual_getcaps): + use the right caps depending on endianness (I hope) + * ext/ogg/gstoggmux.c: (gst_ogg_mux_plugin_init): + use GST_RANK_NONE for all non-decoding elements or spider gets + mighty confused + +2004-05-11 Ronald Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): + Fix some odd cases and fix BE metadata parsing of unicode16 text. + +2004-05-11 Benjamin Otte + + * gst/switch/gstswitch.c: (gst_switch_release_pad), + (gst_switch_request_new_pad), (gst_switch_poll_sinkpads), + (gst_switch_loop), (gst_switch_get_type): + whoever that was: DO NOT IMPORT PRIVATE SYMBOLS THAT ARE NOT IN + HEADERS. Had to be said. + +2004-05-10 David Schleef + + * configure.ac: Add prototype Dirac support. + * ext/Makefile.am: + * ext/dirac/Makefile.am: + * ext/dirac/gstdirac.cc: + * ext/dirac/gstdiracdec.cc: + +2004-05-10 Ronald Bultje + + * gst/auparse/gstauparse.c: (gst_auparse_class_init), + (gst_auparse_init), (gst_auparse_chain), + (gst_auparse_change_state): + Hack around spider. Remove me some day please. + +2004-05-10 Ronald Bultje + + * gst/auparse/gstauparse.c: (gst_auparse_chain): + Fix for some uninitialized variables in previous patch, also + makes it work. Fixes #142286 while we're at it. + +2004-05-11 Stephane Loeuillet + + * gst/auparse/gstauparse.c: + fixes a-law, adds mu-law, linear pcm (8,16,24,32), ieee (32, 64) + only unsupported formats are ADPCM/CCITT G.72x + reviewed by Ronald + * gst-libs/gst/audio/audio.h: adds 24bit depth to PCM (x-raw-int) + +2004-05-10 Wim Taymans + + * ext/vorbis/Makefile.am: + * ext/vorbis/README: + * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_formats), + (oggvorbisenc_get_type), (vorbis_caps_factory), (raw_caps_factory), + (gst_oggvorbisenc_base_init), (gst_oggvorbisenc_class_init), + (gst_oggvorbisenc_sinkconnect), (gst_oggvorbisenc_convert_src), + (gst_oggvorbisenc_convert_sink), + (gst_oggvorbisenc_get_query_types), (gst_oggvorbisenc_src_query), + (gst_oggvorbisenc_init), (gst_oggvorbisenc_get_tag_value), + (gst_oggvorbisenc_metadata_set1), (gst_oggvorbisenc_set_metadata), + (get_constraints_string), (update_start_message), + (gst_oggvorbisenc_setup), (gst_oggvorbisenc_write_page), + (gst_oggvorbisenc_chain), (gst_oggvorbisenc_get_property), + (gst_oggvorbisenc_set_property), (gst_oggvorbisenc_change_state): + * ext/vorbis/oggvorbisenc.h: + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisenc.c: (vorbis_caps_factory), + (raw_caps_factory), (gst_vorbisenc_class_init), + (gst_vorbisenc_init), (gst_vorbisenc_setup), + (gst_vorbisenc_push_packet), (gst_vorbisenc_chain), + (gst_vorbisenc_get_property), (gst_vorbisenc_set_property): + * ext/vorbis/vorbisenc.h: + Added a raw vorbis encoder to be used with the oggmuxer. + We still need the old encoder for some gnome applications, + read the README to find out how that works. + The raw encoder is called "rawvorbisenc" until 0.9. + +2004-05-10 Wim Taymans + + * ext/ogg/gstogg.c: (plugin_init): + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_plugin_init), + (gst_ogg_print): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), + (gst_ogg_mux_base_init), (gst_ogg_mux_class_init), + (gst_ogg_mux_get_sink_event_masks), (gst_ogg_mux_init), + (gst_ogg_mux_sinkconnect), (gst_ogg_mux_pad_link), + (gst_ogg_mux_pad_unlink), (gst_ogg_mux_request_new_pad), + (gst_ogg_mux_handle_src_event), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_push_page), (gst_ogg_mux_compare_pads), + (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop), + (gst_ogg_mux_get_property), (gst_ogg_mux_set_property), + (gst_ogg_mux_change_state), (gst_ogg_mux_plugin_init): + Added an ogg muxer. + Small typo fixes in the demuxer. + +2004-05-10 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_push_packet), (theora_enc_chain), + (theora_enc_change_state), (theora_enc_set_property), + (theora_enc_get_property): + Mark the last packet with an EOS flag which is not really needed + in gstreamer. + Do some better video framerate initialisation. + Update the buffer timestamp. + +2004-05-10 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_change_state): + Return the result of the parent state change call + +2004-05-10 Stephane Loeuillet + + * gst/law/alaw.c : alawdec should be registered with type ALAWDEC, not ALAWENC + * gst/law/alaw-decode.c : put audio/x-alaw on pads, instead of audio/x-mulaw + * gst/law/alaw-encode.c : (idem) + * ext/a52dec/gsta52dec.c : mark audio/a52, audio/ac3 as deprecated in a comment + * gst/ac3parse/gstac3parse.c : audio/ac3 => audio/x-ac3 + * gst/realmedia/rmdemux.c : audio/a52 => audio/x-ac3 + +2004-05-09 Benjamin Otte + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + don't use a fixed buffer size when writing variable length data to + it. Fixes memory corruption and makes alsasrc work + +2004-05-09 Ronald Bultje + + * ext/gnomevfs/gstgnomevfssink.c: + (_gst_boolean_allow_overwrite_accumulator), + (gst_gnomevfssink_class_init), (gst_gnomevfssink_open_file): + Run glib's default signal handler (??) in RUN_CLEANUP rather than + RUN_LAST, and don't use that to set the accumulator value because + then it's always FALSE. + +2004-05-09 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_audio_caps), + (gst_riff_create_audio_template_caps): + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): + Fix for unaligned RIFF files (i.e. where all the chunks together + in a LIST chunk are not of the same size as the size given in + the LIST chunk header). Fixes several odd WAVE files. Also fix + ADPCM (block_align property) in audio, so that wavparse based + on this works now as it used to stand-alone. + +2004-05-09 Edward Hervey + + reviewed by Benjamin Otte + + * ext/a52dec/gsta52dec.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: (gst_faad_base_init): + * ext/ivorbis/vorbisfile.c: + * ext/lame/gstlame.c: + * ext/libfame/gstlibfame.c: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): + * ext/sidplay/gstsiddec.cc: + * ext/speex/gstspeexdec.c: + * ext/speex/gstspeexenc.c: + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + correct klasses. Mostly s,Codec/(Audio|Video),\1/Codec, + (fixes #142193) + +2004-05-08 Ronald Bultje + + * ext/alsa/gstalsa.c: (device_list), + (gst_alsa_class_probe_devices): + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open): + Fix alsa oddness in mixer after the combination of using mixer + in source/sink elements and using hw:x,y instead of just hw:x. + +2004-05-09 Benjamin Otte + + * gst/wavparse/gstwavparse.c: (gst_wavparse_destroy_sourcepad), + (gst_wavparse_create_sourcepad): + make PAUSED=>READY=>PAUSED=READY work by not destroying NULL + sourcepads + +2004-05-09 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + allow discont events before caps nego + +2004-05-08 Benjamin Otte + + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + don't leak events + +2004-05-08 Benjamin Otte + + * gst/level/gstlevel.c: (gst_level_link), (gst_level_chain), + (gst_level_change_state), (gst_level_init): + * gst/level/gstlevel.h: + figure out if we're initialized directly instead of keeping a + variable that's wrong in 90% of cases + don't initialize pads and then leak them and use a new unitialized + pad. (fixes #142084) + these were bugs so n00bish I didn't find them for an hour :/ + +2004-05-08 Iain + + * gst/wavparse/gstwavparse.[ch]: Rewrote to use RiffRead instead. + * gst-libs/gst/riff/riff-read.c (gst_riff_read_peek_head): Unstatic it + (gst_riff_read_element_data): Ditto, and added a got_bytes argument to + return the length that was read. + (gst_riff_read_strf_auds): Allow fmt tags as well. + +2004-05-07 David Schleef + + * ext/faad/gstfaad.c: (gst_faad_sinkconnect): HACK to correct + signed char assumption in faad.h. + +2004-05-07 Ronald Bultje + + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps): + Missing break, detected by Daniel Gazard . + +2004-05-07 Colin Walters + + * gst/volume/gstvolume.c (gst_volume_dispose): Unref dpman. + * ext/flac/gstflacdec.c (gst_flacdec_dispose): Add dispose + function. + * gst/audioscale/gstaudioscale.c (gst_audioscale_dispose): + Add dispose function. + +2004-05-08 Jan Schmidt + * ext/dv/gstdvdec.c: (gst_dvdec_video_link): + Fix caps nego and pad templates. RGB mode caps should + work now. + * ext/dvdnav/gst-dvd: + Move mpeg2dec inside the thread because otherwise the + queue rejects cap changes mid-stream + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_get_type), + (gst_mpeg2dec_flush_decoder): + For mpeg2dec > 0.4.0, call the flush function instead of + manually extracting all in-flight frames. + * ext/raw1394/gstdv1394src.c: (gst_dv1394src_factory), + (gst_dv1394src_init), (gst_dv1394src_iso_receive): + Change mime type video/dv go video/x-dv to match the + rest of gst-plugins + +2004-05-07 Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_type), + (gst_alsa_sink_class_init): + * ext/alsa/gstalsasink.h: + * ext/alsa/gstalsasrc.c: (gst_alsa_src_get_type), + (gst_alsa_src_class_init): + * ext/alsa/gstalsasrc.h: + Make alsasink/src a subclass of alsamixer so that mixer stuff + shows up in gst-rec. Needs some finetuning. + +2004-05-05 Benjamin Otte + + * ext/lame/gstlame.c: (gst_lame_chain): + simplify + * ext/mad/gstmad.c: (gst_mad_handle_event): + fix event leak + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): + be able to detect mp3 files < 4096 bytes + +2004-05-06 Wim Taymans + + * ext/theora/theoraenc.c: (gst_theora_enc_class_init), + (theora_enc_sink_link), (theora_push_packet), (theora_enc_chain), + (theora_enc_set_property), (theora_enc_get_property): + Also encode the first frame, cleanup some code. + +2004-05-06 Wim Taymans + + * ext/mpeg2enc/gstmpeg2enc.cc: + Forward events first before deciding that negotiation was + not performed. + +2004-05-06 Wim Taymans + + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + First process the events before deciding that negotiation + was not performed. + +2004-05-06 Wim Taymans + + * ext/theora/Makefile.am: + * ext/theora/theora.c: (plugin_init): + * ext/theora/theoradec.c: (theora_dec_change_state): + * ext/theora/theoraenc.c: (gst_theora_enc_base_init), + (gst_theora_enc_class_init), (gst_theora_enc_init), + (theora_enc_sink_link), (theora_enc_event), (theora_push_packet), + (theora_enc_chain), (theora_enc_change_state), + (theora_enc_set_property), (theora_enc_get_property): + Added a theora encoder, grouped the encoder and decoder into the + same plugin. + +2004-05-05 Thomas Vander Stichele + + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), + (gst_jpegenc_chain): + fix DURATION on outgoing buffers + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_sink_event): + debug using time formats + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_sink_link): + windows with width/height 0 generate X errors, so don't allow them + +2004-05-05 Wim Taymans + + * ext/mpeg2dec/gstmpeg2dec.c: (src_templ), + (gst_mpeg2dec_base_init), (gst_mpeg2dec_init), + (gst_mpeg2dec_negotiate_format): + * ext/mpeg2dec/gstmpeg2dec.h: + removed the static pad template so that we can add the + more accurate framerate value to the caps. + + +2004-05-04 Benjamin Otte + + * configure.ac: + check for kdemacros.h, too (should fix #141821) + * ext/vorbis/vorbisdec.c: (vorbis_dec_event), (vorbis_dec_chain): + don't crash if no header was sent, but nicely error out (fixes part + of #141554) + +2004-05-04 Wim Taymans + + * ext/mpeg2enc/gstmpeg2enc.cc: (gst_mpeg2enc_dispose): call the + parent dispose function to avoid segfault on destroy. + +2004-05-04 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (plugin_init): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_sink_link): + clean up debugging caps + also recreate xvimage when format has changed + +2004-05-04 Benjamin Otte + + * ext/libvisual/Makefile.am: + * ext/libvisual/visual.c: (gst_visual_class_init), + (gst_visual_init), (gst_visual_dispose), (gst_visual_getcaps), + (gst_visual_srclink), (gst_visual_chain), + (gst_visual_change_state), (plugin_init): + use a GstAdapter to correctly adapt buffer sizes - allows using a + framerate + +2004-05-03 Thomas Vander Stichele + + * sys/v4l/gstv4lelement.h: + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps), (gst_v4lsrc_getcaps), + (gst_v4lsrc_buffer_free): + * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), + (gst_v4lsrc_sync_frame), (gst_v4lsrc_grab_frame), + (gst_v4lsrc_requeue_frame): + move some debugging categories around + query for fps index and set accordingly if found + +2004-05-03 Stephane Loeuillet + + * ext/lame/gstlame.c: + correct defaults that lame_init puts out of range + +2004-05-03 Thomas Vander Stichele + + * ext/divx/gstdivxenc.c: (gst_divxenc_get_type), + (gst_divxenc_class_init): + fix range since -1 is the default + * gst/mpeg1sys/gstmpeg1systemencode.c: + (gst_mpeg1_system_encode_get_type), (gst_system_encode_multiplex): + * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_get_type), + (gst_rtjpegdec_chain): + * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_get_type), + (gst_rtjpegenc_chain): + * sys/qcam/gstqcamsrc.c: (gst_autoexp_mode_get_type), + (gst_qcamsrc_get_type), (gst_qcamsrc_change_state): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_get_type): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get_type): + * sys/v4l/gstv4lsrc.c: + * sys/v4l/v4l_calls.c: (gst_v4l_open): + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_playback_init): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_init): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init): + * sys/vcd/vcdsrc.c: (vcdsrc_get_type), (vcdsrc_get): + remove gst_info calls + +2004-05-03 Thomas Vander Stichele + + * Makefile.am: + * po/af.po: + * po/az.po: + * po/en_GB.po: + * po/nl.po: + * po/sr.po: + * po/sv.po: + Updated translations + +2004-05-03 Thomas Vander Stichele + + * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): + refactor/comment code + +2004-05-02 Ronald Bultje + + * gst/asfdemux/Makefile.am: + * gst/asfdemux/asfheaders.c: + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_get_type), + (gst_asf_demux_base_init), (gst_asf_demux_process_comment), + (gst_asf_demux_setup_pad): + * gst/asfdemux/gstasfdemux.h: + * gst/asfdemux/gstasfmux.c: + * gst/asfdemux/gstasfmux.h: + Add tagging support to demuxer, split out registration in its own + file instead of in demux (hacky), and prevent having some tables + in our memory multiple times (in asfheaders.h). + +2004-05-01 Ronald Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_metadata): + * gst/matroska/matroska-ids.h: + Basic tag reading support. + +2004-04-30 Ronald Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): + Really detect ac-3 audio. + * gst/typefind/gsttypefindfunctions.c: (matroska_type_find): + really detect matroska files (off-by-1). + +2004-04-30 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_type_get), + (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_dump_co64), + (qtdemux_dump_unknown), (qtdemux_parse_tree), (qtdemux_parse_udta), + (qtdemux_tag_add), (get_size), (gst_qtdemux_handle_esds): More qtdemux + hackage -- parse a lot more atoms, extract a few tags. One might even + mistake this for tag support. Maybe it is. + * gst/qtdemux/qtdemux.h: + +2004-04-30 Colin Walters + + * ext/alsa/gstalsasink.c (gst_alsa_sink_mmap): Plug a memleak. + +2004-04-30 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_getcaps): + remove broken nego fix + +2004-04-30 Benjamin Otte + + * configure.ac: + * ext/Makefile.am: + * ext/libvisual/Makefile.am: + * ext/libvisual/visual.c: + add initial support for libvisual (http://libvisual.sourceforge.net) + libvisual is still quite alpha, so expect crashes in there :) + +2004-04-29 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse), + (qtdemux_parse_trak), (get_size), (gst_qtdemux_handle_esds): Hacked + up qtdemux to make it spit out codec_data. Do _not_ look at this + code; you will no longer respect me. + +2004-04-29 Stephane Loeuillet + + * ext/alsa/gstalsa.c : (gst_alsa_class_probe_devices) + * ext/alsa/gstalsa.h : + change alsa pcm device discovery to find more than 1 device + per card. code review by Ronald. + +2004-04-29 David Schleef + + * sys/oss/gstosselement.c: (gst_osselement_rate_probe_check): + Add a check for a driver bug on FreeBSD. (bug #140565) + +2004-04-29 Thomas Vander Stichele + + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_get_type): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), + (gst_jpegenc_getcaps): + move format setting to inner loop + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_getcaps): + use GST_PAD_CAPS if available so that we use already negotiated + caps + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse_moov), (qtdemux_parse): + extra debugging + * sys/qcam/qcam-Linux.c: (qc_lock_wait), (qc_unlock): + * sys/qcam/qcam-os.c: (qc_lock_wait), (qc_unlock): + move hardcoded path to DEFINE + +2004-04-28 David Schleef + + * gst/speed/gstspeed.c: (speed_parse_caps): Fix caps parsing. + (bug #140064) + +2004-04-28 Ronald Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): + Don't probe for playback device if we're a source element. Fixes + #139658. + +2004-04-29 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), + (gst_id3_tag_chain): + rewrite buffer offset + +2004-04-28 Ronald Bultje + + * configure.ac: + * ext/Makefile.am: + * ext/dts/Makefile.am: + * ext/dts/gstdtsdec.c: (gst_dtsdec_get_type), + (gst_dtsdec_base_init), (gst_dtsdec_class_init), (gst_dtsdec_init), + (gst_dtsdec_channels), (gst_dtsdec_renegotiate), + (gst_dtsdec_handle_event), (gst_dtsdec_update_streaminfo), + (gst_dtsdec_loop), (gst_dtsdec_change_state), + (gst_dtsdec_set_property), (gst_dtsdec_get_property), + (plugin_init): + * ext/dts/gstdtsdec.h: + New DTS decoder. + * ext/faad/gstfaad.c: (gst_faad_sinkconnect), + (gst_faad_srcconnect): + Add ESDS atom handling (.m4a). + +2004-04-27 Ronald Bultje + + * ext/divx/gstdivxdec.c: (plugin_init): + Remove comment that makes no sense. + * ext/mad/gstid3tag.c: (gst_id3_tag_set_property): + Fix for obvious typo that resulted in warnings during gst-register. + * ext/xvid/gstxviddec.c: (gst_xviddec_src_link), + (gst_xviddec_sink_link): + Fix caps negotiation a bit better. + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + We call this 'codec_data', not 'esds'. + +2004-04-27 Benjamin Otte + + * gst/monoscope/gstmonoscope.c: + make sure we only provide 256x128 + * gst/monoscope/monoscope.c: (monoscope_init): + assert size of 256x128 + +2004-04-27 Thomas Vander Stichele + + * Makefile.am: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_fixate), + (gst_v4lsrc_getcaps), (gst_v4lsrc_buffer_free): + fixate to max width and height of device + +2004-04-27 Thomas Vander Stichele + + * Makefile.am: + * sys/v4l/gstv4l.c: + * sys/v4l/gstv4lsrc.c: + * sys/v4l/v4l_calls.c: + * sys/v4l/v4lsrc_calls.c: + fix for qc-usb driver which fakes having more than one buffer + by handing the same buffer twice, which confused GStreamer's/v4lsrc + buffer_free override + add debugging + +2004-04-27 Thomas Vander Stichele + + * Makefile.am: + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_class_init), (gst_videotestsrc_change_state), + (gst_videotestsrc_init), (gst_videotestsrc_get), + (gst_videotestsrc_set_property), (gst_videotestsrc_get_property): + * gst/videotestsrc/gstvideotestsrc.h: + add num-buffers property + + 2004-04-26 Benjamin Otte + + * ext/mad/gstid3tag.c: (plugin_init): + set id3mux rank to NONE so it doesn't confuse spider + require audio/mpeg,mpegversion=1 in id3mux + +2004-04-26 Benjamin Otte + + * configure.ac: + detect faad correctly as non-working if it's indeed non-working + +2004-04-26 Thomas Vander Stichele + + * Makefile.am: + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), + (gst_jpegenc_class_init), (gst_jpegenc_getcaps): + fix _getcaps so it only negotiates to its supported format + +2004-04-25 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): + fix memleak + +2004-04-23 Benjamin Otte + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): + audio/x-raw-int with height rules! not. Now it's depth. + +2004-04-22 Ronald Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_create_sourcepad), + (gst_wavparse_parse_fmt), (gst_wavparse_handle_sink_event), + (gst_wavparse_loop): + Missing variable initialization. Add handling of DVI ADPCM. Fix + mis-parsing of LIST chunks. This works around a bug where we mis- + parse non-aligning LIST chunks (so LIST chunks where the contents + don't align with the actual LIST size). The correct fix is to use + rifflib, I'm not going to fix wavparse - too much work. All this + fixes #104878. + +2004-04-22 Zaheer Abbas Merali + + reviewed by Benjamin Otte + + * ext/shout/gstshout.c: (gst_icecastsend_change_state): + fix shoutcast not working (fixes #140844) + +2004-04-22 Benjamin Otte + + * ext/hermes/gsthermescolorspace.c: + (gst_hermes_colorspace_caps_remove_format_info): + * gst/colorspace/gstcolorspace.c: + (gst_colorspace_caps_remove_format_info): + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_caps_remove_format_info): + s/gst_caps_simplify/gst_caps_do_simplify/ + +2004-04-22 Benjamin Otte + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + mpegversion is an int + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init): + don't try to create pad templates with NULL caps, use any caps + instead. + +2004-04-20 David Schleef + + * ext/sdl/Makefile.am: Link against libgstinterfaces, not + libgstxoverlay. jmmv@menta.net (Julio M. Merino Vidal) + (bug #140384) + +2004-04-20 Daniel Gazard + + reviewed by David Schleef + + * ext/mad/gstid3tag.c: Add stdlib.h + * gst/rtp/gstrtpgsmenc.c: same + * gst/tags/gstid3tag.c: same + * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Fix GST_DISABLE_LOADSAVE + * gst/tcp/gsttcpsink.c: (gst_tcpsink_sink_link): Adjust + GST_DISABLE_LOADSAVE use. + * gst/udp/gstudpsink.c: (gst_udpsink_sink_link): Likewise. + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get): Likewise. + * ext/gnomevfs/gstgnomevfssrc.c: Include (needed by + atol(3)). + * sys/oss/gstosselement.h: Include (needed for dev_t). + * gst/tags/gstvorbistag.c: Include (needed by + strtoul(3)). + * gst/rtp/gstrtpL16enc.c: Include (needed by random(3)). + * ext/mad/Makefile.am: (libgstmad_la_CFLAGS): Add $(MAD_CFLAGS) + $(ID3_CFLAGS). + * ext/libfame/Makefile.am: (libgstlibfame_la_CFLAGS): Add + $(LIBFAME_CFLAGS). + +2004-04-20 David Schleef + + * gst/realmedia/rmdemux.c: This was supposed to part of the + last checkin. Same idea. + +2004-04-20 Daniel Gazard + + reviewed by David Schleef + + * configure.ac: bump required gstreamer version to 0.8.1.1 + because of following changes [--ds] + + * gst-libs/gst/riff/riff-read.c: Include gst/gstutils.h. + (gst_riff_peek_head, gst_riff_peek_list, gst_riff_read_list) + (gst_riff_read_header): Use GST_READ_UINT* + macros to access possibly unaligned memory. + + * gst/typefind/gsttypefindfunctions.c: Include gst/gstutils.h. + (mp3_type_find): Use GST_READ_UINT* + macros to access possibly unaligned memory. + (mp3_type_find, mpeg1_parse_header, qt_type_find) + (speex_type_find): Likewise + + * gst/tags/gstvorbistag.c: (ADVANCE): Likewise + + * gst/qtdemux/qtdemux.c: Include stdlib.h (needed by realloc). + (QTDEMUX_GUINT32_GET, QTDEMUX_GUINT16_GET, QTDEMUX_FP32_GET) + (QTDEMUX_FP16_GET, QTDEMUX_FOURCC_GET) + (gst_qtdemux_loop_header, gst_qtdemux_loop_header) + (qtdemux_node_dump_foreach, qtdemux_tree_get_child_by_type) + (qtdemux_tree_get_sibling_by_type): Use GST_READ_UINT* + macros to access possibly unaligned memory. + + * gst/mpegstream/gstmpegpacketize.c: (parse_generic, parse_chunk): + Likewise. + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead) + (gst_mpeg_demux_parse_packet, gst_mpeg_demux_parse_pes): Likewise. + + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + Likewise. + + * gst/mpeg2sub/gstmpeg2subt.c: (GST_BUFFER_DATA) + (gst_mpeg2subt_chain_subtitle): Likewise. + + * gst/mpeg1videoparse/gstmp1videoparse.c: (mp1videoparse_parse_seq) + (gst_mp1videoparse_time_code, gst_mp1videoparse_real_chain): + Likewise. + + * gst/mpeg1sys/buffer.c: (mpeg1mux_buffer_update_audio_info): + Likewise. + + * gst/cdxaparse/gstcdxaparse.c: (gst_bytestream_peek_bytes): + Likewise. + + * gst/asfdemux/gstasfdemux.c: (_read_var_length, _read_uint): + Likewise. + +2004-04-20 Thomas Vander Stichele + + * configure.ac: + update required version of GStreamer because of GST_TIME_FORMAT + +2004-04-20 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_init): + remove leftover g_print + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + don't try setting only a subset of the caps. We don't want to kill + autoplugging on purpose + +2004-04-20 Thomas Vander Stichele + + * sys/ximage/ximagesink.c: (plugin_init): + * sys/xvimage/xvimagesink.c: (plugin_init): + add debugging categories + +2004-04-20 Thomas Vander Stichele + + * po/en_GB.po: + * po/LINGUAS: + Adding en_GB translation (Gareth Owen) + +2004-04-20 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (qtdemux_parse), (qtdemux_type_get), (qtdemux_dump_mvhd), + (qtdemux_dump_tkhd), (qtdemux_dump_stsd), (qtdemux_dump_unknown), + (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): + A number of new features and hacks to extract the esds atom and + put it into the caps. (bug #137724) + +2004-04-19 David Schleef + + * gconf/Makefile.am: Fix for non-GNU make + * gst-libs/gst/Makefile.am: Change directory order to handle + GstPlay linking with gstinterfaces + * gst-libs/gst/audio/make_filter: make use of tr portable + * gst-libs/gst/play/Makefile.am: Add intended \ + * gst-libs/gst/xwindowlistener/xwindowlistener.c: + (gst_xwin_set_clips): Switch to ISO variadic macro. Use a + function prototype instead of void *. + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Switch to ISO variadic + macro. + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_chain): wrap NULL in GST_ELEMENT_ERROR call + * gst/videofilter/make_filter: make use of tr portable + * pkgconfig/Makefile.am: Remove GNU extension in Makefile target + +2004-04-19 Thomas Vander Stichele + + * po/LINGUAS: + * po/uk.po: + Added Ukrainian translation (Maxim V. Dziumanenko) + +2004-04-18 Ronald Bultje + + * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), (gst_gsmdec_getcaps), + (gst_gsmdec_link), (gst_gsmdec_chain): + Fix capsnego, simplify chain function slightly. + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Add GSM. + +2004-04-18 Ronald Bultje + + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_destroy_sourcepad), (gst_wavparse_create_sourcepad), + (gst_wavparse_parse_fmt), (gst_wavparse_change_state): + Hack to make wavparse work with spider (always -> sometimes pad). + Fixes #135862 && #140411. + +2004-04-18 Benjamin Otte + + * sys/oss/gstosselement.c: (gst_osselement_sync_parms), + (gst_osselement_rate_probe_check), + (gst_osselement_rate_check_rate), (gst_osselement_rate_add_rate): + get rid of \n in debug output + +2004-04-17 Iain + + * gst/wavparse/gstwavparse.c (gst_wavparse_loop): Allow all events, + not just EOS. + +2004-04-17 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_get_type), + (gst_id3_tag_class_init), (gst_id3_tag_get_caps), + (gst_id3_tag_add_src_pad), (gst_id3_tag_init), + (gst_id3_tag_set_property), (gst_id3_tag_do_caps_nego), + (gst_id3_tag_src_link), (gst_id3_tag_chain), + (gst_id3_tag_change_state), (plugin_init): + deprecate id3tag element and replace with id3demux/id3mux. + great side effect: this ugly file is now even uglier, yay! + * ext/mad/gstmad.h: + remove non-available function + update for new get_type + +2004-04-17 Benjamin Otte + + * configure.ac: + require mpeg2dec >= 0.4.0 + +2004-04-17 Benjamin Otte + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), + (gst_xvimagesink_set_xwindow_id): + call GST_ELEMENT_ERROR whenever get_xcontext fails. Includes + assorted cleanup fixes. + +2004-04-16 David Schleef + + * sys/ximage/ximagesink.h: Compile fix for FreeBSD. (bug #140268) + * sys/xvimage/xvimagesink.h: same + +2004-04-16 Thomas Vander Stichele + + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file): + Fix GST_ELEMENT_ERROR with (NULL) + +2004-04-15 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data): + Add div[3456] as fourccs for DivX 3 (fixes #140137). + +2004-04-15 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: + (gst_riff_create_video_caps_with_data), + (gst_riff_create_video_caps), (gst_riff_create_audio_caps), + (gst_riff_create_video_template_caps), + (gst_riff_create_audio_template_caps): + * gst-libs/gst/riff/riff-media.h: + * gst-libs/gst/riff/riff-read.c: + (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_vids): + * gst-libs/gst/riff/riff-read.h: + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + Add MS RLE support. I added some functions to read out strf chunks + into strf chunks and the data behind it. This is usually color + palettes (as in RLE, but also in 8-bit RGB). Also use those during + caps creation. Lastly, add ADPCM (similar to wavparse - which + should eventually be rifflib based). + * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), + (gst_matroska_demux_init), (gst_matroska_demux_reset): + * gst/matroska/matroska-demux.h: + Remove placeholders for some prehistoric tagging system. Didn't add + support for any tag system really anyway. + * gst/qtdemux/qtdemux.c: + Add support for audio/x-m4a (MPEG-4) through spider. + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), + (gst_wavparse_loop): + ADPCM support (#135862). Increase max. buffer size because we + cannot split buffers for ADPCM (screws references) and I've seen + files with 2048 byte chunks. 4096 seems safe for now. + +2004-04-15 Thomas Vander Stichele + + * configure.ac: bump nano to 1 + +=== release 0.8.1 === + +2004-04-15 Thomas Vander Stichele + + * configure.ac: releasing 0.8.1, "Comforting Sounds" + +2004-04-14 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): + Fix typo in divxversion (3 instead of 4 for "DIVX" fourcc). + Fixes #140058 + +2004-04-14 Thomas Vander Stichele + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_plugin_init): + lower rank of dvddemux so that it's not used for mpeg playback. + +2004-04-14 Benjamin Otte + + * configure.ac: + save libs correctly when checking mad + +2004-04-14 Thomas Vander Stichele + + * ext/mad/gstid3tag.c: (plugin_init): + lower rank of id3tag as proposed by Benjamin. Fixes #139926. + +2004-04-13 David Schleef + + * common/m4/gst-feature.m4: Call -config scripts with + --plugin-libs if it is supported. + * gst/avi/gstavimux.c: (gst_avimux_vidsinkconnect): sequences of + JPEG images are image/jpeg. + * gst/debug/Makefile.am: + * gst/debug/negotiation.c: (gst_negotiation_class_init), + (gst_negotiation_getcaps), (gst_negotiation_pad_link), + (gst_negotiation_update_caps), (gst_negotiation_get_property), + (gst_negotiation_plugin_init): Add a property that acts like + filter caps. + * testsuite/gst-lint: Move license checking to be a standard + test. + +2004-04-13 David Schleef + + * gst/avi/gstavidemux.c: (gst_avi_demux_reset): Fix memleak. + patch from Sebastien Cote (bug #139958) + +2004-04-13 Thomas Vander Stichele + + * examples/gstplay/Makefile.am: + * examples/gstplay/player.c: (main): + make the commandline player example use gconf settings + +2004-04-13 Thomas Vander Stichele + + * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init), + (gst_cacasink_sinkconnect), (gst_cacasink_init), + (gst_cacasink_chain), (gst_cacasink_open), (gst_cacasink_close): + init/end library during state transition, not object + creation/disposal. get rid of custom dispose handler. + + +2004-04-12 Christian Schaller + + * sys/oss/gstosselement.c: s/lstat/stat/ from freeBSD, since it can + be a symlink + +2004-04-11 Ronald Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_data): + Handle JUNK chunks inside data section. Prevents warnings. + +2004-04-11 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), + (gst_riff_create_video_template_caps): + Add MS video v1. + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), + (gst_avi_demux_stream_data): + Add support for "rec-list" chunks. + +2004-04-11 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): + Fix another codecname mismatch. + +2004-04-11 Ronald Bultje + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): + Fix divx caps mismatch and move from video/x-jpeg to image/jpeg + so that MJPEG plays back. + +2004-04-10 Ronald Bultje + + * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), + (gst_mp1videoparse_real_chain), (gst_mp1videoparse_change_state): + * gst/mpeg1videoparse/gstmp1videoparse.h: + Fix for some slight mis-cuts in buffer parsing, and for some + potential overflows or faults-causers. Adds disconts. Also fixes + #139105 while we're at it. + +2004-04-10 Ronald Bultje + + * configure.ac: + * sys/v4l2/gstv4l2element.h: + Workaround for missing struct v4l2_buffer declaration in Suse 9 + and Mandrake 10 linux/videodev2.h header file (#135919). + +2004-04-10 Ronald Bultje + + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file): + Bail out if no filename was given. + +2004-04-10 Ronald Bultje + + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps), + (gst_v4l2_fourcc_from_structure): + Add Y41B/Y42B YUV formats (see #125732), fix Y41P (was typo'ed to + Y41B somewhere). + +2004-04-09 Benjamin Otte + + * ext/gnomevfs/gstgnomevfssink.c: + (_gst_boolean_allow_overwrite_accumulator), + (gst_gnomevfssink_class_init): + fix erase signal - if any handler returns false the file will not be + overwritten. If no handler is connected, the file will not be + overwritten either. + renamed signal to "allow-overwrite" + * ext/mad/gstid3tag.c: (tag_list_to_id3_tag_foreach): + free string when adding it to ID3 failed + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + unref event when done + * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): + free caps + * gst/typefind/gsttypefindfunctions.c: + (mpeg_video_stream_type_find): + fix invalid read + +2004-04-08 David Schleef + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_register): Change rank to PRIMARY. + +2004-04-08 David Schleef + + * gst/colorspace/gstcolorspace.c: Don't advertise a conversion + we don't support (bug #139532) + +2004-04-07 Thomas Vander Stichele + + * ext/mad/gstmad.c: (gst_mad_handle_event), + (gst_mad_check_caps_reset), (gst_mad_chain), + (gst_mad_change_state): + only set explicit caps if they haven't been set before for + this stream. MPEG-audio sample rate/channels aren't allowed + to change in-stream. + Fixes #139382 + +2004-04-06 Ronald Bultje + + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_base_init), + (_gst_boolean_did_something_accumulator), + (gst_gnomevfssink_class_init), (gst_gnomevfssink_dispose), + (gst_gnomevfssink_init), (gst_gnomevfssink_set_property), + (gst_gnomevfssink_get_property), (gst_gnomevfssink_open_file), + (gst_gnomevfssink_close_file), (gst_gnomevfssink_chain), + (gst_gnomevfssink_change_state): + Fix erase signal. Don't erase by default. Remove handoff signal. + Remove erase property. Don't segfault. General cleanup. + +2004-04-07 Benjamin Otte + + * gst-libs/gst/gconf/test-gconf.c: (main): + add missing gst_init + +2004-04-07 Benjamin Otte + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_dispose): + free the mutexes, too + +2004-04-07 Benjamin Otte + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_dispose): + actually free the URI string + * ext/mad/gstid3tag.c: (gst_id3_tag_src_event): + compute offset correctly when passing discont events + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): + don't leak discont events + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps): + add some missing breaks so caps aren't copied randomly + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream): + if we realloc memory, we better use it + +2004-04-06 Benjamin Otte + + * ext/mad/gstmad.c: (normal_seek): + fix GST_FORMAT_TIME usage + +2004-04-05 David Schleef + + * ext/kio/kiosrc.cpp: Undefine KDE_DEPRECATED so we can use + a deprecated function (hack!) + +2004-04-05 Benjamin Otte + + * ext/esd/esdmon.c: (gst_esdmon_get): + fix nonterminated vararg and memleak + +2004-04-05 Benjamin Otte + + * ext/ladspa/gstladspa.c: (gst_ladspa_class_init), + (gst_ladspa_init), (gst_ladspa_force_src_caps), + (gst_ladspa_set_property), (gst_ladspa_get_property), + (gst_ladspa_instantiate), (gst_ladspa_activate), + (gst_ladspa_deactivate), (gst_ladspa_loop), (gst_ladspa_chain): + clean up debugging + +2004-04-05 Stefan Kost + + reviewed by Benjamin Otte + + * ext/ladspa/gstladspa.c: (gst_ladspa_class_init): + check for broken LADSPA parameters (fixes #138635) + +2004-04-05 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_getcaps): + advertise buffer-frames correctly on sinkpads + +2004-04-05 Thomas Vander Stichele + + * ext/mad/gstmad.c: (gst_mad_get_type), (gst_mad_layer_get_type), + (gst_mad_mode_get_type), (gst_mad_emphasis_get_type), + (gst_mad_get_event_masks), (gst_mad_get_query_types), (index_seek), + (normal_seek), (gst_mad_src_event), (gst_mad_handle_event), + (gst_mad_check_caps_reset), (gst_mad_chain): + add more debugging, only reset caps when we're not in error state + +2004-04-05 Thomas Vander Stichele + + * ext/mad/gstmad.c: add debugging category, comment + cleanups + +2004-04-05 Julio M. Merino Vidal + + reviewed by Benjamin Otte + + * configure.ac: + fix == in test(1) operator + +2004-04-05 Julio M. Merino Vidal + + reviewed by Benjamin Otte + + * configure.ac: + fix --export-symblos-regex to a working regex. + +2004-04-04 Benjamin Otte + + * sys/oss/.cvsignore: + add for oss_probe + +2004-04-03 Tim-Phillip Müller + + reviewed by Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): + add missing 'new_media' argument (fixes #138168) + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_handle_seek_event): + add vararg terminator (fixes #138169) + +2004-04-02 David Schleef + + * ext/gdk_pixbuf/Makefile.am: Make sure gstgdkanimation.h is + disted (bug #138914) + +2004-04-01 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_change_state), + (gst_alsa_close_audio): + handle case better where a soundcard can't pause + * ext/ogg/gstoggdemux.c: + don't crash when we get events but don't have pads yet + +2004-04-01 Thomas Vander Stichele + + * sys/oss/gstosselement.c: (gst_osselement_probe_caps): + throw an error if we couldn't probe any caps. + +2004-04-01 Jan Schmidt + + * ext/dvdnav/gst-dvd: + Add a really simple sample DVD player + +2004-04-01 Jan Schmidt + + * ext/a52dec/gsta52dec.c: (gst_a52dec_get_type), (gst_a52dec_init), + (gst_a52dec_push), (gst_a52dec_handle_event), + (gst_a52dec_update_streaminfo), (gst_a52dec_loop), + (gst_a52dec_change_state): + * ext/a52dec/gsta52dec.h: + Use a debug category, Output timestamps correctly + Emit tag info, Handle events, tell liba52dec about cpu + capabilities so it can use MMX etc. + * ext/dv/gstdvdec.c: (gst_dvdec_loop), (gst_dvdec_change_state): + Fix a crasher accessing invalid memory + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), + (dvdnavsrc_update_highlight), (dvdnavsrc_loop), + (dvdnavsrc_get_event_mask), (dvdnav_handle_navigation_event), + (dvdnavsrc_event), (dvdnavsrc_get_formats), (dvdnavsrc_convert), + (dvdnavsrc_query): + Some support for byte-format seeking. + Small fixes for still frames and menu button overlays + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_get_type), + (gst_mpeg2dec_alloc_buffer): + Use a debug category. Adjust the report level of several items to + LOG. Call mpeg2_custom_fbuf to mark our buffers as 'custom buffers' + so it doesn't lose the GstBuffer pointer + * gst/debug/Makefile.am: + * gst/debug/gstdebug.c: (plugin_init): + * gst/debug/gstnavseek.c: (gst_navseek_get_type), + (gst_navseek_base_init), (gst_navseek_class_init), + (gst_navseek_init), (gst_navseek_seek), + (gst_navseek_handle_src_event), (gst_navseek_set_property), + (gst_navseek_get_property), (gst_navseek_chain), + (gst_navseek_plugin_init): + * gst/debug/gstnavseek.h: + Add the navseek debug element for seeking back and forth in a + video stream using arrow keys. + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_get_type), + (gst_mpeg2subt_base_init), (gst_mpeg2subt_class_init), + (gst_mpeg2subt_init), (gst_mpeg2subt_finalize), + (gst_mpeg2subt_getcaps_video), (gst_mpeg2subt_link_video), + (gst_mpeg2subt_handle_video), (gst_mpeg2subt_src_event), + (gst_mpeg2subt_parse_header), (gst_get_nibble), + (gst_setup_palette), (gst_get_rle_code), (gst_draw_rle_line), + (gst_merge_uv_data), (gst_mpeg2subt_merge_title), + (gst_update_still_frame), (gst_mpeg2subt_handle_subtitle), + (gst_mpeg2subt_handle_dvd_event), (gst_mpeg2subt_loop): + * gst/mpeg2sub/gstmpeg2subt.h: + Pretty much a complete rewrite. Now a loopbased element. May still + require work to properly synchronise subtitle buffers. + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private), + (gst_dvd_demux_send_subbuffer): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): + Don't attempt to create subbuffers of size 0 + Reduce a couple of error outputs to warnings. + * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect), + (gst_y4mencode_chain): + Output the y4m frame header correctly. + +2004-04-01 Thomas Vander Stichele + + * gst/adder/gstadder.c: (gst_adder_get_type), (gst_adder_loop): + throw errors instead of allowing SIGFPE + +2004-04-01 Thomas Vander Stichele + + * gst-libs/gst/gconf/gconf.c: (gst_gconf_get_string), + (gst_gconf_render_bin_from_key): + leak plugging and style fixing + +2004-03-31 David Schleef + + * gst/audioscale/gstaudioscale.c: (gst_audioscale_expand_value), + (gst_audioscale_getcaps): Fix getcaps to expand and union lists. + (bug #138225) + * gst/debug/Makefile.am: + * gst/debug/breakmydata.c: (gst_break_my_data_plugin_init): + * gst/debug/gstdebug.c: (plugin_init): Merge elements into one + plugin. + * gst/debug/negotiation.c: (gst_gst_negotiation_get_type), + (gst_negotiation_base_init), (gst_negotiation_class_init), + (gst_negotiation_init), (gst_negotiation_getcaps), + (gst_negotiation_pad_link), (gst_negotiation_chain), + (gst_negotiation_set_property), (gst_negotiation_get_property), + (gst_negotiation_plugin_init): New element to talk about random + negotiation things happening in a pipeline. + +2004-03-31 Thomas Vander Stichele + + * gst/adder/gstadder.c: (gst_adder_get_type), (gst_adder_loop): + fix integer addition with help of Stefan Kost + +2004-03-31 Thomas Vander Stichele + + * po/nl.po: updated Dutch translation (Elros Cyriatan) + +2004-03-30 David Schleef + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer), + (gst_mpeg2dec_negotiate_format): Handle Y42B-format MPEG + video, patch from Matthew.Spencer@eu.sony.com (Matthew Spencer) + (bug #137504) + * ext/mpeg2dec/gstmpeg2dec.h: + +2004-03-30 David Schleef + + * ext/gdk_pixbuf/Makefile.am: Remove spurious rules. (bug #136527) + +2004-03-30 David Schleef + + * tools/gst-launch-ext-m.m: Applied patch from gnome@flyn.org (W. + Michael Petullo) to handle .mov + +2004-03-30 Benjamin Otte + + * sys/oss/gstosselement.c: (gst_osselement_probe_caps), + (gst_osselement_rate_check_rate): + probe caps correctly for sound cards that only support one format + +2004-03-30 Benjamin Otte + + * ext/kio/kiosrc.cpp: (process_events): + update handling event processing if inside KDE - untested + +2004-03-29 David Schleef + + * ext/hermes/gsthermescolorspace.c: (plugin_init): decrease rank + by 2 to not interfere with other colorspaces. + * ext/pango/gsttextoverlay.c: (plugin_init): change rank to NONE + * gst/colorspace/gstcolorspace.c: (plugin_init): decrease rank by + one to not interfere with ffmpeg_colorspace. + +2004-03-29 David Schleef + + * ext/alsa/gstalsa.c: (gst_alsa_fixate): Don't fixate fields that + aren't in the caps. + * gst/sine/gstsinesrc.c: change rate caps to [1,MAX] + * gst/videocrop/gstvideocrop.c: (plugin_init): Change rank to NONE. + +2004-03-30 Benjamin Otte + + * gst-libs/gst/riff/riff-media.c: + fail on error, don't try to set stuff on NULL caps + +2004-03-30 Benjamin Otte + + * configure.ac: + * ext/Makefile.am: + * ext/kio/Makefile.am: + * ext/kio/kioreceiver.cpp: + * ext/kio/kioreceiver.h: + * ext/kio/kiosrc.cpp: + * ext/kio/kiosrc.h: + add experimental kiosrc plugin + * ext/alsa/gstalsaplugin.c: (plugin_init): + initialize debugging category only when we're sure registering the + plugins worked. + +2004-03-29 Thomas Vander Stichele + + * examples/gstplay/player.c: (main): + * gst-libs/gst/play/play.c: (gst_play_class_init), + (gst_play_set_location), (gst_play_set_data_src), + (gst_play_set_video_sink), (gst_play_set_audio_sink), + (gst_play_set_visualization), (gst_play_connect_visualization): + check return values of element_set_state and return FALSE where + failed + +2004-03-29 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): + try harder to check if an event is really a discont + +2004-03-29 Thomas Vander Stichele + + * po/LINGUAS: adding Azerbaijani (Mətin Əmirov) + * po/az.po: + +2004-03-28 Benjamin Otte + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), + (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): + get rid of non-standard "..." ranges in case statements. + +2004-03-27 Martin Soto + + * gst/mpegstream/gstmpegdemux.c: + * gst/mpegstream/gstmpegdemux.h: Complete overhaul. All DVD + specific functionality split to the new dvddemux element. + * gst/mpegstream/gstdvddemux.c: + * gst/mpegstream/gstdvddemux.h: New demultiplexer for DVD (VOB) + streams, derived from mpegdemux. + * gst/mpegstream/gstmpegparse.c: Discontinuity handling cleaned + up. SCR based timestamp rewriting can be turned off (will probably + completely disappear soon). + * ext/dvdnav/dvdnavsrc.c: Changes resulting from a few months + hacking. General cleanup. All printf statements replaced by + debugging messages. Almost complete libdvdnav support. + (dvdnavsrc_class_init): Got rid of unnecessary signals (replaced + by events. New properties for audio and subpicture languages. + (dvdnavsrc_update_highlight): Now uses events. + (dvdnavsrc_user_op): Cleaned up. + (dvdnavsrc_get): Renamed to dvdnavsrc_loop (element is now loop + based). Lots of cleanup, and propper support for most libdvdnav + events. + (dvdnavsrc_make_dvd_event): New function. + (dvdnavsrc_make_dvd_nav_packet_event): New function. + (dvdnavsrc_make_clut_change_event): New function. + +2004-03-26 Benjamin Otte + + * gst/typefind/gsttypefindfunctions.c: (theora_type_find): + fix bug where typefinding would claim it's theora whenever less then + 7 bytes of data were available + +2004-03-25 Ronald Bultje + + * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_link), + (gst_alawdec_base_init), (gst_alawdec_class_init), + (gst_alawdec_init), (gst_alawdec_chain): + * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_link), + (gst_alawenc_base_init), (gst_alawenc_class_init), + (gst_alawenc_init), (gst_alawenc_chain): + * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_link), + (gst_mulawdec_base_init), (gst_mulawdec_class_init), + (gst_mulawdec_init), (gst_mulawdec_chain): + * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_link), + (gst_mulawenc_base_init), (gst_mulawenc_class_init), + (gst_mulawenc_init), (gst_mulawenc_chain): + Fix capsnego in all four, remove the unused property functions and + simplify the chain functions slightly. I guess we could use macros + or something similar for those, since the code is so similar, but + I'm currently too lazy... + +2004-03-24 David Schleef + + * sys/oss/gstosselement.c: (gst_osselement_sync_parms), + (gst_osselement_close_audio), (gst_osselement_probe_caps), + (gst_osselement_get_format_structure), + (gst_osselement_rate_probe_check), (gst_osselement_rate_add_range), + (gst_osselement_rate_check_rate), (gst_osselement_rate_add_rate), + (gst_osselement_rate_int_compare): Add code to handle rate probing + (bug #120883) + * sys/oss/gstosselement.h: same + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_getcaps): + Use rate probing provided by osselement. + * sys/oss/gstosssrc.c: (gst_osssrc_init), (gst_osssrc_getcaps): same + +2004-03-24 Ronald Bultje + + * ext/xvid/gstxvidenc.c: (gst_xvidenc_set_property), + (gst_xvidenc_get_property): + ulong/int mess-up. + +2004-03-24 David Schleef + + * ext/speex/gstspeexdec.c: (gst_speexdec_base_init), + (gst_speexdec_init): + * ext/speex/gstspeexenc.c: (gst_speexenc_base_init), + (gst_speexenc_init): Create the pad template correctly (from + the static pad template, not a NULL pointer.) + +2004-03-25 Benjamin Otte + + * gst/debug/Makefile.am: + * gst/debug/breakmydata.c: + add element that quasi-randomly changes bytes in the stream. + Intended use is robustness checking of demuxers and decoders in + media tests. + +2004-03-24 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio), + (gst_alsa_probe_hw_params): + * ext/alsa/gstalsa.h: + debugging output fixes + +2004-03-24 Benjamin Otte + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_set_property): + don't g_return_if_fail if element is PLAYING, fail silently as every + other element. + * gst/effectv/gstquark.c: (gst_quarktv_chain): + only fix needed for cast lvalue issues in gst-plugins + * gst/volenv/gstvolenv.c: (gst_volenv_init): + add proxy_getcaps + +2004-03-24 Benjamin Otte + + * gst/level/gstlevel.c: (gst_level_init): + add proxying getcaps function, so level doesn't advertise impossible + caps + +2004-03-24 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (gst_qtdemux_loop_header), (qtdemux_parse_moov), (qtdemux_parse), + (qtdemux_node_dump_foreach), (qtdemux_dump_mvhd), + (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), + (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), + (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), + (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), + (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), + (qtdemux_parse_tree), (qtdemux_parse_trak): Fix debugging + messages. Divide the chunk size by the compression ratio + (needed for MACE audio) + +2004-03-23 Ronald Bultje + + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + Fix buffer overflow read error. + +2004-03-23 Ronald Bultje + + * ext/alsa/gstalsa.h: + Remove unused entry. + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): + Add cinepak. + * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), + (gst_videodrop_link), (gst_videodrop_chain): + Fix, sort of. Was horribly broken with new capsnego. Bah... + +2004-03-23 Jeremy Simon + + * gst/typefind/gsttypefindfunctions.c: (ape_type_find), + (plugin_init): + Add a monkeysaudio typefind function + +2004-03-23 Johan Dahlin + + * gst-libs/gst/play/play.c (gst_play_audio_fixate) + (gst_play_video_fixate): Check so the structure has the field + before trying to fixate them, this makes it possible to have + fakesinks for video and audio output without printing errors on + the output console. + +2004-03-22 David Schleef + + * sys/oss/Makefile.am: + * sys/oss/oss_probe.c: (main), (probe_check), (add_range), + (check_rate), (add_rate): Rate probing test app. + +2004-03-21 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), + (_fixate_caps_to_int), (gst_audio_convert_fixate): + add a fixation function that pretty much does the right thing (fixes + #137556) + +2004-03-20 David I. Lehn + + * configure.ac: GST_PACKAGE default: s/GStreamer/GStreamer Plugins/ + +2004-03-20 Tim-Phillip Müller + + reviewed by: Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + terminate gst_event_new_discontinuous correctly (fixes parts of + #137711) + +2004-03-19 David Schleef + + * gst-libs/gst/Makefile.am: Enable xoverlay unconditionally, + since it doesn't depend on X, and it's part of our ABI. + +2004-03-19 Iain + + * gst/interleave/deinterleave.c (deinterleave_sink_link): Use the + is_int in the structure, not the local variable. + +2004-03-19 David Schleef + + * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_change_state), + (gst_rfbsrc_init), (gst_rfbsrc_getcaps), (gst_rfbsrc_fixate), + (gst_rfbsrc_link), (gst_rfbsrc_paint_rect), (gst_rfbsrc_get): + Improvements in caps negotiation. + +2004-03-18 Thomas Vander Stichele + + * po/LINGUAS: + * po/af.po: + adding Afrikaans (Petri Jooste) + +2004-03-18 Thomas Vander Stichele + + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_chain): + throw error instead of g_critical (#137588) + +2004-03-18 Thomas Vander Stichele + + * Makefile.am: + * configure.ac: + dist common and m4 correctly + * po/sv.po: + +2004-03-17 David Schleef + + * pkgconfig/gstreamer-media-info.pc.in: Add Version. + (bug #137348) + +2004-03-17 Thomas Vander Stichele + + * po/LINGUAS: + * po/sv.po: + adding Swedish translation (Christian Rose) + +2004-03-17 Thomas Vander Stichele + + * Makefile.am: use release.mak + +2004-03-16 Thomas Vander Stichele + + * common/ChangeLog: + * common/gst-autogen.sh: + add some explanation about the version detection + * configure.ac: + fix X check + +2004-03-16 Thomas Vander Stichele + + * configure.ac: bump nano to 1 + +=== release 0.8.0 === + +2004-03-16 Thomas Vander Stichele + + * configure.ac: release 0.8.0, "Pharmaceutical Itch" + +2004-03-16 Thomas Vander Stichele + + * configure.ac: + update libtool version + * gst-libs/gst/media-info/Makefile.am: + actually use libtool version + +2004-03-15 Thomas Vander Stichele + + * configure.ac: fix speex detection to work with 1.0 but not 1.1 + +2004-03-15 Thomas Vander Stichele + + * configure.ac: + * gst-plugins.spec.in: + * pkgconfig/Makefile.am: + * pkgconfig/gstreamer-gconf-uninstalled.pc.in: + * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: + * pkgconfig/gstreamer-libs-uninstalled.pc.in: + * pkgconfig/gstreamer-libs.pc.in: + * pkgconfig/gstreamer-media-info-uninstalled.pc.in: + * pkgconfig/gstreamer-play-uninstalled.pc.in: + * pkgconfig/gstreamer-plugins-uninstalled.pc.in: + * pkgconfig/gstreamer-plugins.pc.in: + remove @VERSION@ from some of the pc files since core and plugins + are decoupled. + created gstreamer-plugins.pc as it's a better name, but keeping + -libs around for now to get fixes upstream done first. + +2004-03-15 Julien MOUTTE + + * gst-libs/gst/play/play.c: (gst_play_get_framerate), + (gst_play_get_sink_element): First draft of gst_play_get_framerate. + * gst-libs/gst/play/play.h: + +2004-03-15 Thomas Vander Stichele + + * *.c, *.cc: don't mix tabs and spaces + +2004-03-15 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): + use the new ffmpegcolorspace + * gst-plugins.spec.in: + package new colorspace and media-info + * configure.ac: + * pkgconfig/Makefile.am: + fix some more disting issues + * pkgconfig/gstreamer-media-info-uninstalled.pc.in: + * pkgconfig/gstreamer-media-info.pc.in: + generate media-info pc files + +2004-03-15 Johan Dahlin + + * *.h: Revert indenting + +2004-03-15 Thomas Vander Stichele + + * configure.ac: + adding ffmpegcolorspace element + * gst/ffmpegcolorspace/Makefile.am: + * gst/ffmpegcolorspace/avcodec.h: + * gst/ffmpegcolorspace/common.h: + * gst/ffmpegcolorspace/dsputil.c: (dsputil_static_init): + * gst/ffmpegcolorspace/dsputil.h: + * gst/ffmpegcolorspace/gstffmpeg.c: (plugin_init): + * gst/ffmpegcolorspace/gstffmpegcodecmap.c: + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_pix_fmt_to_caps), + (gst_ffmpeg_caps_to_pix_fmt): + * gst/ffmpegcolorspace/gstffmpegcodecmap.h: + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcolorspace_caps_remove_format_info), + (gst_ffmpegcolorspace_getcaps), (gst_ffmpegcolorspace_pad_link), + (gst_ffmpegcolorspace_get_type), (gst_ffmpegcolorspace_base_init), + (gst_ffmpegcolorspace_class_init), (gst_ffmpegcolorspace_init), + (gst_ffmpegcolorspace_chain), (gst_ffmpegcolorspace_change_state), + (gst_ffmpegcolorspace_set_property), + (gst_ffmpegcolorspace_get_property), + (gst_ffmpegcolorspace_register): + * gst/ffmpegcolorspace/imgconvert.c: + (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), + (avcodec_get_pix_fmt), (avpicture_fill), (avpicture_layout), + (avpicture_get_size), (avcodec_get_pix_fmt_loss), + (avg_bits_per_pixel), (avcodec_find_best_pix_fmt1), + (avcodec_find_best_pix_fmt), (img_copy_plane), (img_copy), + (yuv422_to_yuv420p), (yuv422_to_yuv422p), (yuv422p_to_yuv422), + (C_JPEG_TO_CCIR), (img_convert_init), (img_apply_table), + (shrink41), (shrink21), (shrink12), (shrink22), (shrink44), + (grow21_line), (grow41_line), (grow21), (grow22), (grow41), + (grow44), (conv411), (gif_clut_index), (build_rgb_palette), + (bitcopy_n), (mono_to_gray), (monowhite_to_gray), + (monoblack_to_gray), (gray_to_mono), (gray_to_monowhite), + (gray_to_monoblack), (avpicture_alloc), (avpicture_free), + (is_yuv_planar), (img_convert), (get_alpha_info_pal8), + (img_get_alpha_info), (deinterlace_line), + (deinterlace_line_inplace), (deinterlace_bottom_field), + (deinterlace_bottom_field_inplace), (avpicture_deinterlace): + * gst/ffmpegcolorspace/imgconvert_template.h: + * gst/ffmpegcolorspace/mem.c: (av_malloc), (av_realloc), (av_free): + * gst/ffmpegcolorspace/mmx.h: + * gst/ffmpegcolorspace/utils.c: (avcodec_init): + adding ffmpegcolorspace element supplied by Ronald after cleaning + up and pulling in the right bits of upstream source. + I'm sure a better C/compiler wizard could do some cleaning up (for + example use GLIB's malloc stuff), but as a first pass this + works very well + +2004-03-15 Thomas Vander Stichele + + * ext/alsa/gstalsa.h: + I assume Ronald forgot to commit the change to have cardname + as a struct member. Expect some public spanking at the next + opportunity. + +2004-03-15 Ronald Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_get_property), + (gst_alsa_open_audio), (gst_alsa_close_audio): + * ext/alsa/gstalsa.c: + Don't open the device if we're a mixer (= padless). + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_class_init), + (gst_alsa_mixer_init), (gst_alsa_mixer_open), + (gst_alsa_mixer_close), (gst_alsa_mixer_change_state): + Open mixer during state change rather than during object + initialization. Also, get a device name. Currently in a somewhat + hackish fashion, but I didn't really find something better. + +2004-03-14 Thomas Vander Stichele + + * *.c, *.h: run gst-indent + +2004-03-14 Benjamin Otte + + * gst/modplug/gstmodplug.cc: + * gst/modplug/gstmodplug.h: + set correct timestamps on outgoing buffers + +2004-03-14 Benjamin Otte + + * gst/modplug/gstmodplug.cc: + handle events - don't do crap when a discont arrives that's not + necessary + This allows correct loading and playback of mods in Rhythmbox + +2004-03-14 Benjamin Otte + + * configure.ac: + * gst-libs/gst/gconf/Makefile.am: + * pkgconfig/Makefile.am: + move gstreamer-gconf pkgconfig files to pkgconfig/ dir. Make sure + they get rebuilt properly + * configure.ac: + when checking for vorbis, try pkgconfig first. + * gst/modplug/gstmodplug.cc: + add fixate function + +2004-03-14 Ronald Bultje + + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): + Fix for obvious mistake, where we first shift the offset and then + read a samplesize element assuming the old offset. Note that this + part still has something weird, i.e. my movies containing those + don't actually play well, but at least there's something that looks + like sound now. + +2004-03-14 Jan Schmidt + * gst/typefind/gsttypefindfunctions.c: (speex_type_find), + (plugin_init): + Add a typefind function for speex format + +2004-03-13 Ronald Bultje + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps), + (gst_asf_demux_setup_pad): + Use 25fps as our "fake" fps value (marked for fixage in 0.9.x) + instead of 0. Reason is simple: some elements have a fps range + of 1-max instead of 0-max. So now ASF video actually works. + +2004-03-13 Thomas Vander Stichele + + * po/LINGUAS: + * po/sr.po: + adding serbian as a language + +2004-03-13 Benjamin Otte + + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + return taglist correctly from _get function, don't gst_pad_push it. + (fixes #137042) + +2004-03-13 Jan Schmidt + * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): + +2004-03-13 Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_free_list): + * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_class_init), + (gst_alsa_mixer_track_new): + * ext/alsa/gstalsamixertrack.h: + Fix ancient leftovers... MixerTrack is a GObject. + +2004-03-13 Ronald Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): + * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): + Don't block during probing... + +2004-03-12 Ronald Bultje + + * ext/alsa/gstalsa.c: (gst_alsa_get_type), (gst_alsa_class_init), + (gst_alsa_get_property), (gst_alsa_probe_get_properties), + (gst_alsa_class_probe_devices), (gst_alsa_class_list_devices), + (gst_alsa_probe_probe_property), (gst_alsa_probe_needs_probe), + (gst_alsa_probe_get_values), (gst_alsa_probe_interface_init), + (gst_alsa_open_audio), (gst_alsa_close_audio): + * ext/alsa/gstalsa.h: + Add propertyprobe interface implementation, add some device-name + property, all this so that it looks good in gnome-volume-control. + +2004-03-12 David Schleef + + * configure.ac: the Hermes library controls hermescolorspace, not + colorspace. + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), + (gst_mpeg2dec_init): minor pet peeve: disable code with #ifdef, + not /* */ + * ext/sdl/sdlvideosink.c: Change XID to unsigned long. + * ext/sdl/sdlvideosink.h: ditto. + * gst/colorspace/gstcolorspace.c: Fix old comments about Hermes + +2004-03-12 Benjamin Otte + + * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_set_xwindow_id), + (gst_x_overlay_got_xwindow_id): + * gst-libs/gst/xoverlay/xoverlay.h: + replace XID with unsigned long to get rid of the xlibs dependency in + XOverlay (fixes #137004) + +2004-03-13 Jan Schmidt + * gst/effectv/gstaging.c: (gst_agingtv_base_init), + (gst_agingtv_setup): + * gst/effectv/gstdice.c: (gst_dicetv_get_type), + (gst_dicetv_base_init), (gst_dicetv_class_init), + (gst_dicetv_setup), (gst_dicetv_init), (gst_dicetv_draw): + * gst/effectv/gstedge.c: (gst_edgetv_get_type), + (gst_edgetv_base_init), (gst_edgetv_class_init), (gst_edgetv_init), + (gst_edgetv_setup), (gst_edgetv_rgb32): + * gst/effectv/gsteffectv.c: + * gst/effectv/gstquark.c: (gst_quarktv_link), (gst_quarktv_init), + (gst_quarktv_set_property): + * gst/effectv/gstrev.c: (gst_revtv_get_type), + (gst_revtv_base_init), (gst_revtv_class_init), (gst_revtv_init), + (gst_revtv_setup), (gst_revtv_rgb32): + * gst/effectv/gstshagadelic.c: (gst_shagadelictv_get_type), + (gst_shagadelictv_base_init), (gst_shagadelictv_class_init), + (gst_shagadelictv_init), (gst_shagadelictv_setup), + (gst_shagadelictv_rgb32): + * gst/effectv/gstvertigo.c: (gst_vertigotv_get_type), + (gst_vertigotv_base_init), (gst_vertigotv_class_init), + (gst_vertigotv_setup), (gst_vertigotv_init), (gst_vertigotv_rgb32): + * gst/effectv/gstwarp.c: + Port everything that can be ported to videofilter and fix up the caps. + Can someone with a big-endian machine please check these? + +2004-03-10 Ronald Bultje + + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_get_time), + (gst_osssink_chain), (gst_osssink_change_state): + Latest fixes for A/V sync, audio playback and such. This is about + all... MPEG playback issues are mostly related to the async build- + up of MPEG files, I cannot fix that. Use basicgthread to solve it. + +2004-03-10 Thomas Vander Stichele + + patch from: Stephane Loeuillet + + * configure.ac: + use pkg-config for some libraries, falling back to the old .m4 way + (fixes #131270) + * m4/libdv.m4: + removed + +2004-03-10 Thomas Vander Stichele + + * configure.ac: + * tools/Makefile.am: + * tools/Makefile.in: + * tools/gst-launch-ext-m.m: + * tools/gst-launch-ext.1.in: + * tools/gst-visualise-m.m: + * tools/gst-visualise.1: + * tools/gst-visualise.1.in: + reorganizing generation of script tools + +2004-03-10 Ronald Bultje + + * ext/divx/gstdivxdec.c: + Downgrade priority. We prefer ffdec_mpeg4. + * ext/faad/gstfaad.c: (gst_faad_srcgetcaps), (gst_faad_srcconnect), + (gst_faad_chain), (gst_faad_change_state): + Fix capsnego. Doesn't work for some sounds because we don't have + a 5:1 to stereo element. + * ext/xvid/gstxvid.c: (plugin_init): + Add priority. + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), + (gst_osssink_change_state): + Add discont handling. + +2004-03-09 Colin Walters + + * gst/audioconvert/gstaudioconvert.c: Fix typo in width 8 + conversion. + +2004-03-09 Benjamin Otte + + * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): + the signals take 2 arguments + +2004-03-09 David Schleef + + * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad), + (gst_alsa_fixate): Add fixate function. (bug #136686) + * ext/alsa/gstalsa.h: + * ext/alsa/gstalsasink.c: (gst_alsa_sink_init): + +2004-03-09 Benjamin Otte + + * ext/mikmod/gstmikmod.c: (gst_mikmod_init), (gst_mikmod_loop), + (gst_mikmod_change_state): + * ext/mikmod/gstmikmod.h: + make mikmod's loop function not loop infinitely and call + gst_element_yield anymore + * gst/modplug/gstmodplug.cc: + fix pad negotiation (fixes #136590) + +2004-03-09 David Schleef + + * ext/lcs/Makefile.am: Fix so that the lcs colorspace plugin + doesn't conflict with the internal colorspace plugin. + * gst-libs/gst/audio/make_filter: Use `` instead of $() to + satisfy the crappy-ass shell shipped by a certain vendor. + * gst/videofilter/make_filter: same (bug #135299) + +2004-03-09 Thomas Vander Stichele + + * configure.ac: bump nano to 1 + +=== release 0.7.6 === + +2004-03-09 Thomas Vander Stichele + + * configure.in: releasing 0.7.6, "There" + +2004-03-09 Thomas Vander Stichele + + * pkgconfig/gstreamer-play-uninstalled.pc.in: + * pkgconfig/gstreamer-play.pc.in: + synchronize the two + +2004-03-09 Thomas Vander Stichele + + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_base_init), + (cdparanoia_open), (cdparanoia_event): + fix/add error handling + * po/POTFILES.in: + add cdparanoia source + * tools/Makefile.am: + make scripts executable + +2004-03-09 Thomas Vander Stichele + + * configure.ac: + * ext/vorbis/Makefile.am: + * sys/Makefile.am: + remove id3types, vorbisfile and xvideosink from the build (#133783) + +2004-03-08 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): + Fix metadata read crash (#136537). + +2004-03-08 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: (gmi_set_mime): + * gst-libs/gst/media-info/media-info.c: (gst_media_info_read): + adding mime types, fixing the one-stop function + +2004-03-08 Christian Schaller + + * ext/nas/nassink.c and /ext/nas/nassink.h: + More NAS love from Arwed von Merkatz + So lets all sing 'Can you feel the NAS tonight' + +2004-03-08 Christian Schaller + + * tools/gst-launch-ext.in: + Replace vorbisfile with oggdemux/vorbisdec/audioconvert + +2004-03-08 Thomas Vander Stichele + + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), + (gst_mpeg2dec_init): + remove the user_data pad for now, because it is being used in + fixating causing MPEG playback to fixate on 1000 Hz for playback. + If someone knows how to fix this properly, please do. + +2004-03-08 Thomas Vander Stichele + + * sys/oss/gstosssink.c: (gst_osssink_get_delay), + (gst_osssink_get_time): + add a warning, IMO this won't get triggered anymore, remove later + +2004-03-07 David Schleef + + * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Added Cinepak + format (bug #136470) + +2004-03-07 Thomas Vander Stichele + + * gst-libs/Makefile.am: + * gst-libs/gst/media-info/Makefile.am: + * gst-libs/gst/media-info/media-info-priv.c: (found_tag_callback), + (error_callback), (gst_media_info_error_create), + (gst_media_info_error_element), (gmip_init), (gmip_reset), + (gmi_clear_decoder), (gmip_find_type_pre), (gmip_find_type): + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/media-info/media-info-test.c: (main): + * gst-libs/gst/media-info/media-info.c: (gst_media_info_init), + (gst_media_info_class_init), (gst_media_info_instance_init), + (gst_media_info_set_source), (gst_media_info_read_with_idler), + (gst_media_info_read_idler), (gst_media_info_read): + * gst-libs/gst/media-info/media-info.h: + fixed, should work now + +2004-03-07 Christian Schaller + + * ext/nas/nassink.c: + A bunch of NAS fixes from Arwed von Merkatz + +2004-03-06 Ronald Bultje + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), + (qtdemux_parse_trak): + Fix crash (j might be greater than n_samples, in which case we're + writing outside the allocated space for the array) and memleak. + +2004-03-06 Ronald Bultje + + * sys/oss/gstosssink.c: (gst_osssink_chain): + And another caller that couldn't handle delay < 0 (unsigned + integer overflow). Video now continues playing on an audio + buffer underrun, and the clock continues working. Audio still + stalls. + +2004-03-06 Ronald Bultje + + * sys/oss/gstosssink.c: (gst_osssink_get_delay), + (gst_osssink_get_time): + get_delay() may return values lower than 0. In those cases, we + should not actually cast to *unsigned* int64, that will break + stuff horribly. In my case, it screwed up A/V sync in movies + in totem rather badly. + +2004-03-06 Christophe Fergeau + + * ext/faac/gstfaac.c: (gst_faac_chain): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/libpng/gstpngenc.c: (user_write_data): + * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_chain_subtitle): + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): + Fix several misuse of gst_buffer_merge (it doesn't take ownership + of any buffer), should fix some leaks. I hope I didn't unref buffers + that shouldn't be... + +2004-03-06 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: (have_type_callback), + (deep_notify_callback), (tag_flag_score), (found_tag_callback), + (error_callback), (gmi_reset), (gmi_seek_to_track), + (gmi_get_decoder), (gmi_set_mime), (gmip_find_type_pre), + (gmip_find_type_post), (gmip_find_stream_post), + (gmip_find_track_streaminfo_post): + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/media-info/media-info-test.c: (print_tag), + (info_print), (main): + * gst-libs/gst/media-info/media-info.c: + (gst_media_info_error_create), (gst_media_info_error_element), + (gst_media_info_instance_init), (gst_media_info_get_property), + (gst_media_info_new), (gst_media_info_set_source), + (gst_media_info_read_idler), (gst_media_info_read): + * gst-libs/gst/media-info/media-info.h: + first pass at making this work again. This seems to work on + tagged ogg/vorbis and mp3 files. + +2004-03-06 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + fix huge leak: gst_buffer_merge doesn't unref the first argument + itself. + +2004-03-06 Thomas Vander Stichele + + * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_update_info): + report layer/mode/emphasis + +2004-03-06 Christophe Fergeau + + * ext/mad/gstmad.c: (gst_mad_chain): fixed caps leak + +2004-03-06 Thomas Vander Stichele + + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_new): + signal serial + +2004-03-06 Thomas Vander Stichele + + * ext/vorbis/vorbis.c: (plugin_init): + * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), + (gst_vorbis_dec_init), (vorbis_dec_event): + add debug category + make vorbisdec handle _BYTE and _TIME queries + +2004-03-06 Christophe Fergeau + + * ext/mad/gstmad.c: (gst_mad_chain): send the average bitrate read + from the xing header + +2004-03-06 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_getcaps), + (gst_audio_convert_link), (gst_audio_convert_change_state), + (gst_audio_convert_buffer_from_default_format): + do conversions from/to float correctly, fix some caps nego errors, + export correct supported caps in template and getcaps, use correct + caps in try_set_caps functions + +2004-03-06 Christophe Fergeau + + For some reason, I only committed a ChangeLog entry yesterday and + not the corresponding code... + * ext/mad/gstmad.c: Fix detection of Xing headers + * gst/tags/gstid3tag.c: Changes to support TLEN tags + +2004-03-06 Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_get_pad_by_pad), + (gst_ogg_demux_src_query): + make sure to handle the case where there's no current chain + gracefully. + +2004-03-05 David Schleef + + * ext/aalib/gstaasink.c: (gst_aasink_fixate), (gst_aasink_init): + Add fixate function. (bug #131128) + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_init), + (gst_sdlvideosink_fixate): Add fixate function. + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + Fix attempt to print a non-pointer using GST_PTR_FORMAT. + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt): + Fix missing break that was causing ulaw to be interpreted as + raw int. + +2004-03-05 David Schleef + + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): + Fix code that ignores return value of gst_buffer_merge(). + (bug #114560) + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_descramble_segment): + * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): same + * testsuite/gst-lint: Check for above. + +2004-03-05 David Schleef + + * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Check for unfixed + caps and throw an element error. (bug #136334) + +2004-03-05 David Schleef + + * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_srcgetcaps), + (gst_faad_chain): Fix negotiation. + * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_handle_src_event): Add + key and button events. + * gst-libs/gst/floatcast/floatcast.h: Fix a minor bug in this + dung heap of code. + * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: gstgconf + depends on gconf + * gst-libs/gst/gconf/gstreamer-gconf.pc.in: same + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), + (gst_play_video_fixate), (gst_play_audio_fixate): Add a fixate + function to encourage better negotiation, particularly between + audioconvert and osssink. + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain): + * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Make some debugging + more important. + * gst/typefind/gsttypefindfunctions.c: Fix mistake in flash + typefinding. + * gst/vbidec/vbiscreen.c: Add glib header + * pkgconfig/gstreamer-play.pc.in: Depends on gst-interfaces. + +2004-03-06 Christophe Fergeau + + * ext/mad/gstmad.c: Fix detection of Xing headers + * gst/tags/gstid3tag.c: Changes to support TLEN tags + +2004-03-06 Thomas Vander Stichele + + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), + (gst_wavparse_pad_convert), (gst_wavparse_pad_query): + debug updates + +2004-03-06 Christophe Fergeau + + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + * ext/mad/gstmad.c: (gst_mad_init), (is_xhead), + (mpg123_parse_xing_header), (gst_mad_chain): parse Xing header in vbr + files, and report the parsed length as a GST_TAG_DURATION tag. + * gst/tags/gstid3tag.c: support TLEN (duration) tag + +2004-03-05 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_channels): + convert channels correctly. convert correctly to unsigned. + +2004-03-05 Julien MOUTTE + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state): Check if + we have a window before clearing it. + +2004-03-05 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_change_state): Check if we + have a window before clearing it. + +2004-03-05 Thomas Vander Stichele + + * gconf/gstreamer.schemas.in: + * gst-libs/gst/gconf/Makefile.am: + version installation path the same way as for 0.6 + * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: + * pkgconfig/gstreamer-libs-uninstalled.pc.in: + * pkgconfig/gstreamer-play-uninstalled.pc.in: + remove comment that was fixed + +2004-03-05 David Schleef + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_formats), + (gst_qtdemux_src_convert), (gst_qtdemux_get_src_query_types), + (gst_qtdemux_get_event_mask), (gst_qtdemux_handle_src_query), + (gst_qtdemux_handle_src_event), (gst_qtdemux_add_stream): + Add prototype code for handling seeking and querying. + +2004-03-04 Ronald Bultje + + * examples/gstplay/player.c: (main): + Initialize variables to NULL. Prevents a segfault because the + (uninitialized) variable is not NULL, resulting in a crash on + trying to reach error->message. + +2004-03-05 Benjamin Otte + + * gst/audioconvert/gstaudioconvert.c: + (gst_audio_convert_buffer_to_default_format): + make float=>int conversion work correctly even in cornercases. + +2004-03-04 David I. Lehn + + * debian/README.Debian: + * debian/build-deps: + * debian/changelog: + * debian/control: + * debian/control.in: + * debian/copyright: + * debian/gstreamer-a52dec.files: + * debian/gstreamer-aa.files: + * debian/gstreamer-alsa.files: + * debian/gstreamer-alsa.manpages: + * debian/gstreamer-arts.files: + * debian/gstreamer-artsd.files: + * debian/gstreamer-audiofile.files: + * debian/gstreamer-avifile.files: + * debian/gstreamer-cdparanoia.files: + * debian/gstreamer-colorspace.files: + * debian/gstreamer-doc.files: + * debian/gstreamer-dv.files: + * debian/gstreamer-dvd.files: + * debian/gstreamer-esd.files: + * debian/gstreamer-festival.files: + * debian/gstreamer-flac.files: + * debian/gstreamer-gconf.conffiles: + * debian/gstreamer-gconf.files: + * debian/gstreamer-gconf.postinst: + * debian/gstreamer-gnomevfs.files: + * debian/gstreamer-gsm.files: + * debian/gstreamer-http.files: + * debian/gstreamer-jack.files: + * debian/gstreamer-jpeg.files: + * debian/gstreamer-mad.files: + * debian/gstreamer-mikmod.files: + * debian/gstreamer-misc.files: + * debian/gstreamer-mpeg2dec.files: + * debian/gstreamer-oss.files: + * debian/gstreamer-plugin-apps.files: + * debian/gstreamer-plugin-apps.manpages: + * debian/gstreamer-plugin-libs-dev.files: + * debian/gstreamer-plugin-libs.files: + * debian/gstreamer-plugin-template.postinst: + * debian/gstreamer-plugin-template.postrm: + * debian/gstreamer-sdl.files: + * debian/gstreamer-sid.files: + * debian/gstreamer-vorbis.files: + * debian/gstreamer-x.files: + * debian/mk.control: + * debian/rules: + Debian package info not maintained here. + +2004-03-04 Thomas Vander Stichele + + * ext/aalib/gstaasink.c: (gst_aasink_class_init): + * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init): + * ext/divx/gstdivxenc.c: (gst_divxenc_class_init): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init): + * ext/gsm/gstgsmenc.c: (gst_gsmenc_class_init): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init): + * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): + * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): + * ext/xvid/gstxvidenc.c: (gst_xvidenc_class_init): + * gst-libs/gst/colorbalance/colorbalance.c: + (gst_color_balance_class_init): + * gst-libs/gst/colorbalance/colorbalancechannel.c: + (gst_color_balance_channel_class_init): + * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): + * gst-libs/gst/play/play.c: (gst_play_class_init): + * gst-libs/gst/propertyprobe/propertyprobe.c: + (gst_property_probe_iface_init): + * gst-libs/gst/tuner/tuner.c: (gst_tuner_class_init): + * gst-libs/gst/tuner/tunerchannel.c: + (gst_tuner_channel_class_init): + * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_base_init): + * gst/cutter/gstcutter.c: (gst_cutter_class_init): + * gst/effectv/gstvertigo.c: (gst_vertigotv_class_init): + * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init): + fix signals to use - instead of _ + * ext/libcaca/gstcacasink.h: + * ext/sdl/sdlvideosink.h: + fix header rename + +2004-03-04 David Schleef + + * testsuite/gst-lint: Add a check for bad signal names. + +2004-03-04 + + reviewed by David Schleef + + * gst/videofilter/gstgamma.c: (gst_gamma_rgb32): Fix typo that + modified the alpha channel and caused a warning. (bug #136192) + +2004-04-03 Christian Schaller + + * gst-plugins.spec.in: + Change names of plugins to actually be correct. Try to keep things + alphabetical to avoid getting beat up by Thomas + +2004-03-03 Julien MOUTTE + + * gst-libs/gst/gconf/gconf.c: (gst_gconf_get_default_video_sink): + Using ximagesink as a default if no gconf key found. We should + probably consider using alsasink instead of osssink for the audio + part. + +2004-03-02 Thomas Vander Stichele + + * configure.ac: + fix --with-plugins, don't think it ever worked before + * gst-plugins.spec.in: + even more updates + +2004-03-01 Ronald Bultje + + * ext/sdl/sdlvideosink.h: + * sys/ximage/ximagesink.h: + * sys/xvideo/xvideosink.h: + * sys/xvimage/xvimagesink.h: + Fix for move of gstvideosink.h -> videosink.h. + +2004-03-02 Thomas Vander Stichele + + * gst-libs/gst/xwindowlistener/Makefile.am: + this is a plugin library, not a library + +2004-03-01 David Schleef + + * AUTHORS: Added some names. Add yourself if you're still + missing. + +2004-03-01 David Schleef + + * MAINTAINERS: Add + +2004-03-01 Thomas Vander Stichele + + * gst-plugins.spec.in: clean up spec file + +2004-03-01 Thomas Vander Stichele + + * gst-libs/gst/video/Makefile.am: + * gst-libs/gst/video/gstvideosink.c: + * gst-libs/gst/video/gstvideosink.h: + rename gstvideosink.h to videosink.h to match other headers + * gst/mixmatrix/Makefile.am: + fix plugin filename + * gst/tags/Makefile.am: fix plugin filename + +2004-03-01 Thomas Vander Stichele + + * gst/tags/Makefile.am: fix plugin filename + +2004-03-01 Thomas Vander Stichele + + * examples/gstplay/player.c: (got_time_tick), (main): + add error handler + display time_tick more readably + * gst/mixmatrix/Makefile.am: + fix plugin file name + +2004-02-29 Christophe Fergeau + + * sys/oss/gstosselement.c: (gst_osselement_probe), + (device_combination_append), (gst_osselement_class_probe_devices): + * sys/oss/gstosselement.h: + Reworked enumeration of oss dsps and mixers so that gst-mixer works + on my system using alsa oss emulation, fixes bug #135597 + +2004-02-29 Ronald Bultje + + * gst/videodrop/gstvideodrop.c: (gst_videodrop_init), + (gst_videodrop_chain), (gst_videodrop_change_state): + * gst/videodrop/gstvideodrop.h: + Work based on timestamp of input data, not based on the expected + framerate from the input. The consequence is that this element now + not only scales framerates, but also functions as a framerate + corrector or framerate stabilizer/constantizer. + +2004-02-27 David Schleef + + patches from jmmv@menta.net (Julio M. Merino Vidal) + + * gst/interleave/deinterleave.c: (deinterleave_chain): Fix + GST_ELEMENT_ERROR call (bug #135634) + * gst/interleave/interleave.c: (interleave_buffered_loop), + (interleave_bytestream_loop): Don't use alloca() (bug #135640) + * sys/cdrom/gstcdplayer_ioctl_bsd.h: Fix ioctls on NetBSD (bug #135645) + * sys/oss/gstosssink.c: (gst_osssink_get_delay), + (gst_osssink_chain): Fix ioctls on NetBSD. (bug #135644) + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_sync_next_frame), + (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), + (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_requeue_frame): + Fix GST_ELEMENT_ERROR call. + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_try_palette): Fix + GST_ELEMENT_ERROR call. + +2004-02-27 Benjamin Otte + + * gst-libs/gst/audio/audio.h: + add macro to make sure header isn't included twice + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): + don't use gst_buffer_free + * gst/playondemand/filter.func: + don't use gst_data_free. Free data only once. + +2004-02-26 David Schleef + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + * gst/level/Makefile.am: -marshal.[ch] and -enum.[ch] files + should not be disted, -marshal.h files should not be installed, + and -enum.h files _should_ be installed. Fix to make this the + case. + +=== release 0.7.5 === + +2004-02-26 Thomas Vander Stichele + + * configure.ac: release 0.7.5, "Under The Sea" + +2004-02-25 Thomas Vander Stichele + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), + (gst_audio_convert_change_state), (gst_audio_convert_get_buffer): + * gst/videoscale/gstvideoscale.c: + * sys/oss/gstosselement.c: (gst_osselement_sync_parms): + assorted debug/warning fixes + +2004-02-25 Thomas Vander Stichele + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps), + (gst_videoscale_init), (gst_videoscale_chain), + (gst_videoscale_set_property), (plugin_init): + * gst/videoscale/gstvideoscale.h: + * gst/videoscale/videoscale.c: (gst_videoscale_setup), + (gst_videoscale_scale_rgb), (gst_videoscale_planar411), + (gst_videoscale_planar400), (gst_videoscale_packed422), + (gst_videoscale_packed422rev), (gst_videoscale_32bit), + (gst_videoscale_24bit), (gst_videoscale_16bit), + (gst_videoscale_bilinear), (gst_videoscale_bicubic), + (gst_videoscale_scale_plane_slow), + (gst_videoscale_scale_point_sample), + (gst_videoscale_scale_nearest), + (gst_videoscale_scale_nearest_str2), + (gst_videoscale_scale_nearest_str4), + (gst_videoscale_scale_nearest_32bit), + (gst_videoscale_scale_nearest_24bit), + (gst_videoscale_scale_nearest_16bit): + add debugging category and use it properly + fix use of GST_PTR_FORMAT + +2004-02-25 Andy Wingo + + * gst/interleave/interleave.c (interleave_buffered_loop): Always + push only when channel->buffer is NULL. Prevents segfaults doing + the state change after a nonlocal exit, like a scheme exception. + + * gst/audioconvert/gstaudioconvert.c (gst_audio_convert_getcaps): + Handle the case where the intersected caps is empty. + +2004-02-25 Thomas Vander Stichele + + * gst/law/mulaw-decode.c: (mulawdec_link): + * gst/law/mulaw.c: (plugin_init): + fix mulawdec so it actually works again + +2004-02-24 Arwed v. Merkatz + + reviewed by: David Schleef + + * gst/videofilter/gstgamma.c: (gst_gamma_class_init), + (gst_gamma_init), (gst_gamma_set_property), + (gst_gamma_get_property), (gst_gamma_calculate_tables), + (gst_gamma_rgb24), (gst_gamma_rgb32): Adds gamma correction + for RGB, with separate r g and b correction factors. (#131167) + +2004-02-24 Thomas Vander Stichele + + * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): + only signal tags for bitrate if they're > 0 (#134894) + +2004-02-24 David Schleef + + * gst/qtdemux/qtdemux.c: (plugin_init), (gst_qtdemux_loop_header), + (qtdemux_parse_moov), (qtdemux_parse), (qtdemux_node_dump_foreach), + (qtdemux_dump_mvhd), (qtdemux_dump_tkhd), (qtdemux_dump_elst), + (qtdemux_dump_mdhd), (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), + (qtdemux_dump_dref), (qtdemux_dump_stsd), (qtdemux_dump_stts), + (qtdemux_dump_stss), (qtdemux_dump_stsc), (qtdemux_dump_stsz), + (qtdemux_dump_stco), (qtdemux_dump_co64), (qtdemux_dump_dcom), + (qtdemux_dump_cmvd), (qtdemux_parse_tree), (qtdemux_parse_trak): + Cleanups. Convert g_prints to GST_LOGs. Add qtdemux debug + category. Attempt to fix timestamp calculation. + +2004-02-24 Johan Dahlin + + * gst-libs/gst/gconf/gconf.c: Add \n to g_print error messages + +2004-02-23 Thomas Vander Stichele + + * configure.ac: + * gconf/Makefile.am: + * gconf/gstreamer.schemas: + * gst-libs/gst/gconf/Makefile.am: + * gst-libs/gst/gconf/gconf.c: + version gconf schemas and install locations + +2004-02-23 Benjamin Otte + + * ext/xine/xineinput.c: (gst_xine_input_dispose): + (gst_xine_input_subclass_init): + call parent dispose. + change pad template for CD reader correctly + * ext/xine/Makefile.am: + * ext/xine/gstxine.h: + * ext/xine/xine.c: (plugin_init): + * ext/xine/xineaudiosink.c: + wrap audio sinks, too + * gst-libs/gst/resample/private.h: + * gst-libs/gst/resample/resample.c: (gst_resample_init), + (gst_resample_reinit), (gst_resample_scale), + (gst_resample_nearest_s16), (gst_resample_bilinear_s16), + (gst_resample_sinc_slow_s16), (gst_resample_sinc_s16), + (gst_resample_sinc_ft_s16), (gst_resample_nearest_float), + (gst_resample_bilinear_float), (gst_resample_sinc_slow_float), + (gst_resample_sinc_float), (gst_resample_sinc_ft_float): + * gst-libs/gst/resample/resample.h: + * gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type), + (gst_audioscale_class_init), (gst_audioscale_link), + (gst_audioscale_get_buffer), (gst_audioscale_init), + (gst_audioscale_chain), (gst_audioscale_set_property), + (gst_audioscale_get_property): + * gst/audioscale/gstaudioscale.h: + s/resample_*/gst_resample_*/i to not clobber namespaces + +2004-02-23 Julien MOUTTE + + * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), + (gst_riff_create_audio_caps), (gst_riff_create_iavs_caps), + (gst_riff_create_video_template_caps), + (gst_riff_create_audio_template_caps), + (gst_riff_create_iavs_template_caps): + * gst-libs/gst/riff/riff-media.h: + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), + (gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream), + (gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream): + * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), + (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), + (gst_matroska_demux_plugin_init): First batch implementing audio and + video codec tags in demuxers. + +2004-02-22 Benjamin Otte + + * ext/xine/Makefile.am: + * ext/xine/gstxine.h: + * ext/xine/xine.c: (plugin_init): + * ext/xine/xineinput.c: + add input plugin wrapper. Playback from files, http, mms and cdda + works. + * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): + remove leftover G_GNUC_UNUSED + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_stream), + (gst_asf_demux_identify_guid): + improve debugging output + +2004-02-22 Benjamin Otte + + reported by: Padraig O'Briain + + * autogen.sh: + replace test -e with test -x for mkinstalldirs to be more portable. + (fixes #134816) + +2004-02-22 Benjamin Otte + + reported by: Stefan Kost + + * gst/audioconvert/gstaudioconvert.c: (plugin_init): + set rank to PRIMARY + * gst/volume/gstvolume.c: (plugin_init): + set rank to NONE + fixes #134960 + +2004-02-22 Julio M. Merino Vidal + + reviewed by Benjamin Otte + + * ext/flac/gstflacenc.c: (gst_flacenc_chain): + escape NULL strings in GST_ELEMENT_ERROR properly (fixes #135116) + +2004-02-22 Benjamin Otte + + * configure.ac: + export [_]*{gst,Gst,GST}.* symbols from plugins + +2004-02-22 Christophe Fergeau + + reviewed by: Benjamin Otte + + * ext/lame/gstlame.c: (add_one_tag): + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value), + (gst_vorbisenc_metadata_set1): + * gst/tags/gstid3tag.c: + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add): + apply fixes from bugs #135042 (lame can't write tags) and #133817 + (add GST_ALBUM_VOLUME_{COUNT,NUMBER} tags) + +2004-02-22 Ramon Garcia + + * configure.ac: Export only gst_plugin_desc from plugins. + Note that this change only makes any effect with Linux using libtool + 1.5.2 or higher. Otherwise it is silently ignored, but it would build + fine. And don't try to have several versions of libtool in different + directories. + +2004-02-20 Andy Wingo + + * gst/intfloat/, gst/oneton: Removed, replaced by audioconvert and + interleave respectively. + + * gst/interleave/deinterleave.c: New plugin: deinterleave + (replaces on oneton). + * gst/interleave/interleave.c: New plugin: interleave. + * gst/interleave/plugin.h: Support file. + * gst/interleave/plugin.c: Support file. + + * configure.ac: Remove intfloat and oneton, add interleave. + + * ext/sndfile/gstsf.c: Handle events better. + + * gst/audioconvert/gstaudioconvert.c: Change to support int2float + and float2int operation. int2float has scheduling problems as + noted in in2float_chain. + +2004-02-20 Benjamin Otte + + * ext/xine/Makefile.am: + * ext/xine/gstxine.h: + * ext/xine/xine.c: + * ext/xine/xineaudiodec.c: + * ext/xine/xinecaps.c: + add first version of xine plugin wrapper. Currently only wraps the + QDM2 win32 DLL, and even that only in proof-of-concept quality. + * configure.ac: + * ext/Makefile.am: + add xine plugin wrapper, disabled by default. Use --enable-xine to + build. Note that it'll segfault on gst-register if you don't remove + the goom and tvtime post plugins from xine. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), + (qtdemux_parse), (qtdemux_parse_trak), (qtdemux_audio_caps): + add extradata parsing for QDM2. + change around debugging prints. + +2004-02-19 Benjamin Otte + + * ext/lame/gstlame.c: (gst_lame_chain): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): + use gst_tag_list_insert when you want to insert tags + +2004-02-18 David Schleef + + * configure.ac: Move massink to gst-rotten + * ext/Makefile.am: + * ext/mas/Makefile.am: + * ext/mas/massink.c: + * ext/mas/massink.h: + +2004-02-18 David Schleef + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): Disable gdk_pixbuf + typefinding, since it seems to be worse than nothing. + * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Add ftyp + atom to recognize .mp4 and .m4a files as video/quicktime. + +2004-02-18 David Schleef + + * gst/sine/demo-dparams.c: (quit_live), + (dynparm_log_value_changed), (dynparm_value_changed), (main): + Use double dparams, not float. + * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), + (gst_sinesrc_init): Change sync default to FALSE, since multiple + sync'd elements don't really work correctly. + * gst/volume/gstvolume.c: (volume_class_init), (volume_init), + (volume_update_volume), (volume_get_property): Change dparam + to double. + +2004-02-18 Julien MOUTTE + + * sys/ximage/ximagesink.c: + (gst_ximagesink_xwindow_update_geometry), + (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), + (gst_ximagesink_change_state), (gst_ximagesink_expose), + (gst_ximagesink_init): Rework the way software video scaling works. So + now we check on each chain call if the video frames are feeling the + window. If not we try to renegotiate caps. On failure we memorize that + and we won't try again for that PLAYING sessions. + * sys/ximage/ximagesink.h: Adding a boolean to store the caps renego + failure. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): initialize the + synchronous flag. + +2004-02-18 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): + break up _link so we can give a better debug message for errors + +2004-02-18 Thomas Vander Stichele + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): + set up debug category + +2004-02-18 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_handle_xevents), (gst_ximagesink_expose): Reorganizing + the way renegotiation work. The event handling function is not taking + care of external windows and renegotiate method check for pad flags + NEGOTIATING. Should fix : #133209 + +2004-02-17 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_expose): Checking if the + pad is negotiating before trying renegotiation. + +2004-02-17 Thomas Vander Stichele + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find): + pass on all possible mime types as typefind hints + +2004-02-17 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new): Fix a + possible SHM leak if we crash. All other apps using XShm are doing + that. + +2004-02-17 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_expose): Renegotiate size on expose. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_expose): Update window + size on expose. + +2004-02-16 Benjamin Otte + + * testsuite/alsa/sinesrc.c: + cosmetic fix to fix compile issue with gcc 2.95.4 + +2004-02-16 Julien MOUTTE + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio), + (gst_alsa_timestamp_to_bytes): Alsa should trigger an error if it + failed opening the audio device. + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_ximage_destroy), (gst_ximagesink_ximage_put), + (gst_ximagesink_xwindow_new), (gst_ximagesink_xwindow_destroy), + (gst_ximagesink_xwindow_resize), (gst_ximagesink_xwindow_clear), + (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), + (gst_ximagesink_xcontext_get), (gst_ximagesink_xcontext_clear), + (gst_ximagesink_change_state), (gst_ximagesink_chain), + (gst_ximagesink_set_xwindow_id): Clearing window in READY TO PAUSED. + Removing some useless g_return_if_fail like wingo suggested. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xvimage_put), + (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), + (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_xwindow_clear), + (gst_xvimagesink_update_colorbalance), + (gst_xvimagesink_handle_xevents), (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_xcontext_clear), + (gst_xvimagesink_get_fourcc_from_caps), + (gst_xvimagesink_change_state), (gst_xvimagesink_chain), + (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_colorbalance_list_channels), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value): Clearing window in READY TO + PAUSED. Removing some useless g_return_if_fail like wingo suggested. + +2004-02-16 Thomas Vander Stichele + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain): + throw error when not negotiated instead of asserting + +2004-02-15 Julien MOUTTE + + * gst/switch/gstswitch.c: (gst_switch_loop): More fixes for + correct data refcounting. + +2004-02-15 Julien MOUTTE + + * gst/switch/gstswitch.c: (gst_switch_change_state), + (gst_switch_class_init): Cleaning the sinkpads correctly on state + change, mostly the EOS flag. + +2004-02-15 Julien MOUTTE + + * examples/gstplay/player.c: (got_eos), (main): Adding some + output for debugging. + * gst-libs/gst/play/play.c: (gst_play_state_change): Stop our + timeouts if we go to any state different from PLAYING. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): Fix some + more EOS bugs in riff lib. + +2004-02-14 Julien MOUTTE + + * gst-libs/gst/play/play.c: (gst_play_connect_visualization): Disable + visualization until i find a way to fix switch correctly. + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): Fix a bug when + EOS arrives. + * gst/switch/gstswitch.c: (gst_switch_release_pad), + (gst_switch_request_new_pad), (gst_switch_poll_sinkpads), + (gst_switch_loop), (gst_switch_dispose), (gst_switch_class_init): + Reworked switch to get a more correct behaviour with events and refing + of data stored in sinkpads. + * gst/switch/gstswitch.h: Adding an eos flag for every sinkpad so that + we don't pull from a pad in EOS. + +2004-02-14 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + remove v1 tag even if we can't read it (makes sure we don't detect + it again) + +2004-02-14 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_pcm_wait), + (gst_alsa_xrun_recovery): + * ext/alsa/gstalsa.h: + try xrun recovery when wait failed. Make xrun recovery function + return TRUE/FALSE to indicate success. (might fix #134354) + +2004-02-13 David Schleef + + * gst/sine/demo-dparams.c: (dynparm_log_value_changed), + (dynparm_value_changed), (main): Convert from float to double. + * gst/sine/gstsinesrc.c: (gst_sinesrc_init): same. + +2004-02-13 David Schleef + + * gst/silence/gstsilence.c: (gst_silence_class_init), + (gst_silence_set_clock), (gst_silence_get), + (gst_silence_set_property), (gst_silence_get_property): + * gst/silence/gstsilence.h: Add sync property. + * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), + (gst_sinesrc_init), (gst_sinesrc_set_clock), (gst_sinesrc_get), + (gst_sinesrc_set_property), (gst_sinesrc_get_property): + * gst/sine/gstsinesrc.h: Add sync property. + +2004-02-13 David Schleef + + * gst/intfloat/gstint2float.c: (conv_f32_s16), + (gst_int2float_chain_gint16): Change stdint usage to glib types. + +2004-02-13 Thomas Vander Stichele + + * configure.ac: + * ext/Makefile.am: + * gst-libs/ext/Makefile.am: + move ffmpeg plugin to gst-ffmpeg module + +2004-02-13 Thomas Vander Stichele + + * configure.ac: use GST_ARCH to detect architecture + +2004-02-12 Julien MOUTTE + + * gst/vbidec/vbiscreen.c: Fixing thomasvs fixes. Missing header. + +2004-02-12 Thomas Vander Stichele + + * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): + classify LADSPA plugins based on number of src/sink pads + (#133663, Stefan Kost) + * gst/sine/gstsinesrc.c: (gst_sinesrc_init): + fix dparams registration + (#133528, Stefan Kost) + * gst/vbidec/vbiscreen.c: (vbiscreen_set_current_cell): + fix use of isprint and use g_ascii_isprint instead + (#133316, Stefan Kost) + +2004-02-11 David Schleef + + Convert a few inner loops to use liboil. This is currently + optional, and is only enabled if liboil is present (duh!). + * configure.ac: Check for liboil-0.1 + * gst/intfloat/Makefile.am: + * gst/intfloat/gstint2float.c: (conv_f32_s16), (scalarmult_f32), + (gst_int2float_chain_gint16): + * gst/videofilter/Makefile.am: + * gst/videofilter/gstvideobalance.c: (gst_videobalance_class_init), + (tablelookup_u8), (gst_videobalance_planar411): + * gst/videotestsrc/Makefile.am: + * gst/videotestsrc/gstvideotestsrc.c: (plugin_init): + * gst/videotestsrc/videotestsrc.c: (splat_u8), (paint_hline_YUY2), + (paint_hline_IYU2), (paint_hline_str4), (paint_hline_str3), + (paint_hline_RGB565), (paint_hline_xRGB1555): + +2004-02-11 David Schleef + + * ext/lcs/gstcolorspace.c: (colorspace_find_lcs_format), + (gst_colorspace_caps_get_fourcc), (colorspace_setup_converter), + (gst_colorspace_getcaps), (gst_colorspace_link), + (gst_colorspace_base_init), (gst_colorspace_init), + (gst_colorspace_chain), (gst_colorspace_change_state), + (plugin_init): Merge Ronald's patch (bug #117897) and update + for new caps and negotiation. Seems to work, although it + shows off bugs in lcs. + +2004-02-11 David Schleef + + * ext/alsa/Makefile.am: Fix linking against libgstinterfaces. + (bug #133886) Noticed by bugs@leroutier.net (Stephane LOEUILLET) + +2004-02-11 David Schleef + + * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init), + (gst_rfbsrc_change_state), (gst_rfbsrc_init), + (gst_rfbsrc_set_property), (gst_rfbsrc_get_property): + Add server and port properties + +2004-02-11 Thomas Vander Stichele + + * m4/a52.m4: + * m4/aalib.m4: + * m4/as-ffmpeg.m4: + * m4/as-liblame.m4: + * m4/as-slurp-ffmpeg.m4: + * m4/check-libheader.m4: + * m4/esd.m4: + * m4/freetype2.m4: + * m4/gconf-2.m4: + * m4/glib.m4: + * m4/gst-alsa.m4: + * m4/gst-artsc.m4: + * m4/gst-ivorbis.m4: + * m4/gst-matroska.m4: + * m4/gst-sdl.m4: + * m4/gst-shout2.m4: + * m4/gst-sid.m4: + * m4/gtk.m4: + * m4/libdv.m4: + * m4/libfame.m4: + * m4/libmikmod.m4: + * m4/ogg.m4: + * m4/vorbis.m4: + fix underquotedness of macros (#133800) + * m4/as-avifile.m4: + * m4/xmms.m4: + removed because no longer used + +2004-02-11 Thomas Vander Stichele + + * configure.ac: + require gettext 0.11.5 so ulonglong.m4 gets checked out and copied + by autopoint (fixes #132996) + +2004-02-11 Benjamin Otte + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_base_init): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_base_init): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init): + * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_base_init): + fix memleaks + +2004-02-11 David Schleef + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), + (gst_gdk_pixbuf_chain): Fix logic bug causing spurious errors. + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_base_init), + (gst_jpegdec_init), (gst_jpegdec_chain): Fix negotiation. + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_base_init), + (gst_jpegenc_class_init), (gst_jpegenc_init), + (gst_jpegenc_getcaps), (gst_jpegenc_link), (gst_jpegenc_resync), + (gst_jpegenc_chain), (gst_jpegenc_set_property), + (gst_jpegenc_get_property): Fix negotiation. Add some properties. + * ext/jpeg/gstjpegenc.h: Fix negotiation. + +2004-02-10 Benjamin Otte + + * ext/mikmod/gstmikmod.c: (gst_mikmod_init), + (gst_mikmod_srcfixate), (gst_mikmod_srclink), (gst_mikmod_loop): + * ext/mikmod/gstmikmod.h: + fix caps negotiation in mikmod + * ext/ogg/gstoggdemux.c: (gst_ogg_print): + output debug information + +2004-02-08 Benjamin Otte + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/navigation/Makefile.am: + * gst-libs/gst/xoverlay/Makefile.am: + remove unused GST_OPT_CFLAGS from Makefiles + include X_CFLAGS and X_LIBS in xoverlay. (#131948) + +2004-02-07 David Schleef + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_handle_event): Don't + push events to pads that haven't been created (#133508) + +2004-02-07 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), + (gst_dvdec_sink_convert), (gst_dvdec_handle_sink_event), + (gst_dvdec_video_getcaps), (gst_dvdec_video_link), + (gst_dvdec_loop), (gst_dvdec_change_state): + Second attempt at committing a working dvdec element. + +2004-02-06 David Schleef + + Build fixes for OS X: (see #129600) + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strh), + (gst_riff_read_strf_vids), (gst_riff_read_strf_auds), + (gst_riff_read_strf_iavs): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), + (gst_avi_demux_stream_odml): + * gst/playondemand/Makefile.am: + * gst/rtp/rtp-packet.c: + +2004-02-05 David Schleef + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_loop): Revert + last change, because it Just Doesn't Compile. + +2004-02-05 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_chain): + skip undecodable id3v2 tag instead of keeping it + +2004-02-05 David Schleef + + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): + Unref leaked buffer. (Noticed by Ronald) + +2004-02-05 David I. Lehn + + * pkgconfig/gstreamer-libs-uninstalled.pc.in: + Sync requires with other checks. >= vs =. + +2004-02-06 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_video_getcaps), + (gst_dvdec_video_link), (gst_dvdec_loop): + * ext/dv/gstdvdec.h: + rework the caps negotiation so that dvdec works again instead + of just segfaulting. + +=== release 0.7.4 === + +2004-02-06 Thomas Vander Stichele + + * NEWS: GStreamer Plugins 0.7.4 "For Great Justice" released + * configure.ac: changed for release + +2004-02-05 Thomas Vander Stichele + + * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: + * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: + * pkgconfig/gstreamer-libs-uninstalled.pc.in: + * pkgconfig/gstreamer-play-uninstalled.pc.in: + reworked patch by David Lehn to fix libdir and includedir for + uninstalled libraries + removed play and gconf from gstreamer-libs since they have their + own pkgconfig files + +2004-02-04 David Schleef + + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt): Fix a caps + memleak. + +2004-02-05 Benjamin Otte + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): + use correct GST_TAG_ENCODER tag + +2004-02-05 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_change_state): + be sure to stop the clock when going to paused + * sys/oss/gstosssink.c: (gst_osssink_change_state): + reset number of transmitted when going to ready. + fixes #132935 + +2004-02-05 Charles Schmidt + + reviewed by Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + extract track count (fixes #133410) + +2004-02-04 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_do_caps_nego): + that should be !=, not == (fixes #132519) + +2004-02-04 David Schleef + + Make sure set_explicit_caps() is called before adding pad. + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + * gst/id3/gstid3types.c: (gst_id3types_loop): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): + +2004-02-04 Thomas Vander Stichele + + * configure.ac: + bump nano to 2, first prerelease + put back AM_PROG_LIBTOOL + +2004-02-04 Thomas Vander Stichele + + * testsuite/alsa/Makefile.am: + these are user test apps, not automatic testsuite tests + +2004-02-04 David Schleef + + Convert GST_DEBUG_CAPS() to GST_DEBUG(): + * gst/mpeg1videoparse/gstmp1videoparse.c: + (mp1videoparse_parse_seq): + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): + * sys/xvideo/gstxwindow.c: (_gst_xwindow_new): + * sys/xvideo/xvideosink.c: (gst_xvideosink_sinkconnect), + (gst_xvideosink_getcaps): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): + * testsuite/gst-lint: more tests + +2004-02-04 David Schleef + + Replace use of GST_PAD_FORMATS_FUNCTION() and similar macros + with the code that they would expand to. + * ext/flac/gstflacdec.c: (gst_flacdec_get_src_formats), + (gst_flacdec_get_src_query_types), + (gst_flacdec_get_src_event_masks): + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get_formats), + (gst_gnomevfssrc_get_query_types), + (gst_gnomevfssrc_get_event_mask): + +2004-02-04 Benjamin Otte + + * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), + (gst_sinesrc_dispose): + fix memleak by properly disposing sinesrc + +2004-02-04 Julien MOUTTE + + * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_expose): + * gst-libs/gst/xoverlay/xoverlay.h: Adding the _expose method to tell + an overlay to redraw the image because it has been exposed. + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy), + (gst_ximagesink_ximage_put), (gst_ximagesink_expose), + (gst_ximagesink_xoverlay_init), (gst_ximagesink_init): + * sys/ximage/ximagesink.h: Implement expose method from XOverlay + interface + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_xvimage_put), (gst_xvimagesink_expose), + (gst_xvimagesink_xoverlay_init), (gst_xvimagesink_init): + * sys/xvimage/xvimagesink.h: Implement expose method from XOverlay + interface + +2004-02-03 Benjamin Otte + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find): + more memleak fixage + +2004-02-03 Benjamin Otte + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): + * gst/typefind/gsttypefindfunctions.c: + fix memleaks shown by gst-typefind + +2004-02-03 Thomas Vander Stichele + + * common/glib-gen.mak: + add hack rule to touch .Plo files + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/tuner/Makefile.am: + remove glib_root variable + +2004-02-03 Benjamin Otte + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream): + set explicit caps before adding the element, so the autopluggers can + plug correctly. + * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), + (mpeg2_sys_type_find), (mpeg1_sys_type_find), + (mpeg_video_type_find), (mpeg_video_stream_type_find), + (dv_type_find): + fix memleaks in typefind functions. gst_type_find_suggest takes a const + argument. + +2004-02-03 Thomas Vander Stichele + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/colorbalance/colorbalance-marshal.list: + * gst-libs/gst/colorbalance/colorbalance.c: + * gst-libs/gst/colorbalance/colorbalance.h: + * gst-libs/gst/colorbalance/colorbalancemarshal.list: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/mixer/mixer-marshal.list: + * gst-libs/gst/mixer/mixer.c: + * gst-libs/gst/mixer/mixer.h: + * gst-libs/gst/mixer/mixermarshal.list: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/play/play.h: + * gst-libs/gst/tuner/Makefile.am: + * gst-libs/gst/tuner/tuner-marshal.list: + * gst-libs/gst/tuner/tuner.c: + * gst-libs/gst/tuner/tuner.h: + * gst-libs/gst/tuner/tunermarshal.list: + use new glib-gen.mak snippet to clean up Makefile.am + fix various bugs in Makefile.am's + +2004-02-03 Benjamin Otte + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain): + handle chain parsing correctly in the multichain case + * ext/theora/theoradec.c: (gst_theora_dec_init), (_theora_ilog), + (theora_dec_from_granulepos), (theora_dec_to_granulepos), + (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), + (theora_dec_chain): + handle events and queries correctly + +2004-02-03 David I. Lehn + + * .cvsignore: + Ignore generated file _stdint.h. + +2004-02-03 David I. Lehn + + * gst-libs/gst/colorbalance/Makefile.am: + * gst-libs/gst/colorbalance/colorbalance.h: + * gst-libs/gst/mixer/Makefile.am: + * gst-libs/gst/mixer/mixer.h: + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/play/play.h: + * gst-libs/gst/tuner/Makefile.am: + * gst-libs/gst/tuner/tuner.h: + Generate enum type code with glib-mkenums. + * gst-libs/gst/colorbalance/.cvsignore: + * gst-libs/gst/mixer/.cvsignore: + * gst-libs/gst/play/.cvsignore: + * gst-libs/gst/tuner/.cvsignore: + Ignore generated files. + +2004-02-03 David I. Lehn + + * gst-libs/gst/audio/.cvsignore: + Ignore generated file. + * gst-libs/gst/audio/Makefile.am: + Do not install example filter. + +2004-02-03 David I. Lehn + + * examples/switch/.cvsignore: + Ignore generated file. + +2004-02-03 Benjamin Otte + + * common/m4/ax_create_stdint_h.m4: + * configure.ac: + add AX_CREATE_STDINT_H to get correct type definitions for a52dec in + _stdint.h. + * Makefile.am: + remove generated _stdint.h in DISTCLEANFILES + * ext/a52dec/gsta52dec.c: + include _stdint.h for a52dec. (should fix #133064) + +2004-02-02 Jeremy Simon + + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add), + (gst_tag_to_vorbis_comments): + Add replaygain support to vorbistag + +2004-02-02 Jeremy Simon + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_to_extradata): + Fix SVQ3 caps flag properties + Use glib macro for bytes swap + +2004-02-02 Thomas Vander Stichele + + * ext/audiofile/gstafsink.c: (gst_afsink_plugin_init): + * ext/audiofile/gstafsrc.c: (gst_afsrc_plugin_init): + * ext/gnomevfs/gstgnomevfs.c: (plugin_init): + * ext/sndfile/gstsf.c: (plugin_init): + * gst/avi/gstavi.c: (plugin_init): + * sys/dxr3/dxr3init.c: (plugin_init): + * sys/oss/gstossaudio.c: (plugin_init): + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l2/gstv4l2.c: (plugin_init): + remove textdomain calls + * po/nl.po: + update Dutch translation + +2004-02-02 Julien MOUTTE + + * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), + (gst_play_set_audio_sink): Moving volume in the audio thread for + instantaneous volume change. Maybe i will add another volume in front + of visualization later, not sure yet though. + +2004-02-02 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), + (gst_ximagesink_handle_xevents): Better X events handling, only take + the latest events for configure and motion. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): same. + +2004-02-02 Jon Trowbridge + + reviewed by: David Schleef + + Fix memory leaks: + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_register): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_register): + +2004-02-02 David Schleef + + code cleanup. Change bzero() to memset(). Remove duplicate ; at ends + of lines. + * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_event): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/xvid/gstxviddec.c: (gst_xviddec_src_link): + * gst-libs/gst/play/play.c: (gst_play_get_sink_element): + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): + * gst/effectv/gstedge.c: (gst_edgetv_sinkconnect): + * gst/effectv/gstvertigo.c: (gst_vertigotv_sinkconnect): + * gst/intfloat/float22int.c: (gst_float2_2_int_getcaps), + (gst_float2_2_int_link): + * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_chain_subtitle): + * gst/rtjpeg/RTjpeg.c: (RTjpeg_init_mcompress): + * gst/tcp/gsttcpsink.c: (gst_tcpsink_init_send): + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_init_receive): + * gst/udp/gstudpsink.c: (gst_udpsink_init_send): + * gst/udp/gstudpsrc.c: (gst_udpsrc_init_receive): + * sys/v4l/gstv4lelement.c: (gst_v4lelement_init): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture): + * testsuite/gst-lint: Add tests for bzero and ;; + +2004-02-02 David Schleef + + * gst/debug/efence.c: Add fallback if MAP_ANONYMOUS isn't defined. + +2004-02-02 Thomas Vander Stichele + + * ext/aalib/gstaasink.c: (gst_aasink_open): + * ext/alsa/gstalsa.c: (gst_alsa_link), (gst_alsa_xrun_recovery): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + * ext/audiofile/gstafsink.c: (gst_afsink_open_file), + (gst_afsink_close_file): + * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), + (gst_afsrc_close_file): + * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): + * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): + * ext/dv/gstdvdec.c: (gst_dvdec_loop): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_user_op), (dvdnavsrc_get): + * ext/esd/esdmon.c: (gst_esdmon_get): + * ext/esd/esdsink.c: (gst_esdsink_chain), (gst_esdsink_open_audio): + * ext/faac/gstfaac.c: (gst_faac_chain): + * ext/faad/gstfaad.c: (gst_faad_chain): + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_loop): + * ext/flac/gstflacdec.c: (gst_flacdec_error_callback), + (gst_flacdec_loop): + * ext/flac/gstflacenc.c: (gst_flacenc_chain): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), + (gst_gnomevfssink_close_file): + * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init), + (gst_gnomevfssrc_open_file): + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): + * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_chain): + * ext/lcs/gstcolorspace.c: (gst_colorspace_srcconnect_func): + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), + (gst_id3_tag_do_typefind), (gst_id3_tag_chain): + * ext/mad/gstmad.c: (gst_mad_chain): + * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mplex/gstmplex.cc: + * ext/mplex/gstmplexibitstream.cc: + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain), + (gst_ogg_demux_push): + * ext/raw1394/gstdv1394src.c: + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_lock), + (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create): + * ext/sndfile/gstsf.c: (gst_sf_open_file), (gst_sf_close_file), + (gst_sf_loop): + * ext/speex/gstspeexenc.c: (gst_speexenc_chain): + * ext/swfdec/gstswfdec.c: (gst_swfdec_loop): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_chain): + * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_chain): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): + * ext/vorbis/vorbisfile.c: (gst_vorbisfile_loop): + * ext/xvid/gstxviddec.c: (gst_xviddec_setup), (gst_xviddec_chain): + * ext/xvid/gstxvidenc.c: (gst_xvidenc_setup), (gst_xvidenc_chain): + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), + (gst_riff_read_element_data), (gst_riff_read_seek), + (gst_riff_peek_list), (gst_riff_read_list), (gst_riff_read_header): + * gst/adder/gstadder.c: (gst_adder_loop): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment), + (gst_asf_demux_process_stream), (gst_asf_demux_get_stream): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_init), + (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): + * gst/avi/gstavimux.c: (gst_avimux_stop_file): + * gst/flx/gstflxdec.c: (gst_flxdec_loop): + * gst/goom/gstgoom.c: (gst_goom_chain): + * gst/id3/gstid3types.c: (gst_id3types_loop): + * gst/intfloat/float22int.c: (gst_float2_2_int_chain): + * gst/intfloat/gstfloat2int.c: (gst_float2int_loop): + * gst/intfloat/gstint2float.c: (gst_int2float_chain_gint16): + * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_read_element_data), + (gst_ebml_read_seek), (gst_ebml_read_uint), (gst_ebml_read_sint), + (gst_ebml_read_float), (gst_ebml_read_header): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_blockgroup): + * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): + * gst/oneton/gstoneton.c: (gst_oneton_chain): + * gst/silence/gstsilence.c: (gst_silence_get): + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + * gst/smpte/gstsmpte.c: (gst_smpte_loop): + * gst/speed/gstspeed.c: (speed_loop): + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + * gst/volenv/gstvolenv.c: (gst_volenv_chain): + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), + (gst_wavparse_loop): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_open), + (dxr3audiosink_set_mode_pcm), (dxr3audiosink_set_mode_ac3), + (dxr3audiosink_close): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_open), (dxr3spusink_close): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_open), + (dxr3videosink_close), (dxr3videosink_write_data): + * sys/oss/gstosselement.c: (gst_osselement_open_audio): + * sys/oss/gstosssink.c: (gst_osssink_chain): + * sys/oss/gstosssrc.c: (gst_osssrc_get): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_buffer_free): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_buffer_free): + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay), + (gst_v4l_set_window), (gst_v4l_enable_overlay): + * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities), (gst_v4l_open), + (gst_v4l_set_chan_norm), (gst_v4l_get_signal), + (gst_v4l_get_frequency), (gst_v4l_set_frequency), + (gst_v4l_get_picture), (gst_v4l_set_picture), (gst_v4l_get_audio), + (gst_v4l_set_audio): + * sys/v4l/v4l_calls.h: + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), + (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_set_playback), + (gst_v4lmjpegsink_playback_init), + (gst_v4lmjpegsink_playback_start): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), + (gst_v4lsrc_sync_frame), (gst_v4lsrc_capture_init), + (gst_v4lsrc_requeue_frame), (gst_v4lsrc_try_palette): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get): + * sys/v4l2/v4l2-overlay_calls.c: (gst_v4l2_set_display), + (gst_v4l2_set_window), (gst_v4l2_enable_overlay): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_get_norm), + (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), + (gst_v4l2_get_output), (gst_v4l2_set_output), + (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), + (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), + (gst_v4l2_set_attribute): + * sys/v4l2/v4l2_calls.h: + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), + (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), + (gst_v4l2src_capture_stop): + * sys/vcd/vcdsrc.c: (vcdsrc_open_file): + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), + (gst_ximagesink_chain): + * sys/xvideo/xvideosink.c: (gst_xvideosink_buffer_new), + (gst_xvideosink_sinkconnect), (gst_xvideosink_chain), + (gst_xvideosink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_chain): + +2004-02-02 Thomas Vander Stichele + + * gst/volume/gstvolume.c: (gst_volume_set_volume), + (gst_volume_get_volume), (volume_class_init), (volume_init), + (volume_chain_int16), (volume_update_volume): + * gst/volume/gstvolume.h: + make code more readable by removing magic numbers + make mixer interface export 0-100 range + make it internally map to 0.0-1.0 range so users don't distort + output by putting the sliders at full volume + +2004-02-02 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_tick_callback), + (gst_play_state_change), (gst_play_seek_to_time): + block the tick callback for 0.5 secs after doing a seek + +2004-02-02 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_new): + check for GError + +2004-02-01 Julien MOUTTE + + * gst-libs/gst/play/play.c: (gst_play_seek_to_time), + (gst_play_new): Accepting NULL GError, blocking time tick while seeking. + * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), + (gst_ximagesink_chain), (gst_ximagesink_init): s/sinkconnect/sink_link + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), + (gst_xvimagesink_chain), (gst_xvimagesink_init): s/sinkconnect/sink_link + +2004-02-01 Thomas Vander Stichele + + * configure.ac: + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + check for a function added in vorbis 1.1 + +2004-01-31 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start), + (gst_alsa_drain_audio), (gst_alsa_stop_audio): + really start/stop clock only on PLAYING <=> PAUSED + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + remove \n from debugging lines + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain): + make it work when seeking does not + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + reset on DISCONT + +2004-01-31 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start): + start clock on PAUSED=>PLAYING, not later + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + extract correct time for different discont formats + (gst_alsa_sink_get_time): + don't segfault when no format is negotiated yet, just return 0 + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), + (gst_ogg_demux_handle_event), (gst_ogg_demux_push), + (gst_ogg_pad_push): + handle flush and discont events correctly + * ext/vorbis/vorbisdec.c: (vorbis_dec_event), (vorbis_dec_chain): + handle discont events correctly + +2004-01-31 Thomas Vander Stichele + + * gst-libs/gst/play/play.c: (gst_play_error_quark), + (gst_play_error_create), (gst_play_error_plugin), + (gst_play_pipeline_setup), (gst_play_init), (gst_play_new): + * gst-libs/gst/play/play.h: + add error handling during creation + * examples/gstplay/player.c: (main): + use new gst_play_new + + +2004-01-31 Benjamin Otte + + * ext/theora/theoradec.c: (theora_dec_chain): + make comments work + * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query), + (vorbis_dec_src_event), (vorbis_dec_chain): + add encoder tag, fix tag reading to be more error tolerant, change + BITRATE to NOMINAL_BITRATE, add debugging, don't unref events after + gst_pad_event_default. + * gst/tags/gstvorbistag.c: + (gst_tag_list_from_vorbiscomment_buffer): + undefine function specific define at end of function + +2004-01-31 Jeremy Simon + + * ext/flac/gstflac.c: (plugin_init): + * ext/flac/gstflacdec.c: (gst_flacdec_class_init): + * ext/flac/gstflacdec.h: + * ext/flac/gstflacenc.h: + Fix typos + +2004-01-30 David I. Lehn + + * examples/gstplay/player.c: s/gstplay.h/play.h/ + +2004-01-30 Thomas Vander Stichele + + * gst-libs/gst/play/Makefile.am: + * gst-libs/gst/play/gstplay.c: + * gst-libs/gst/play/gstplay.h: + * gst-libs/gst/play/play.c: + more surgery, operation complete + +2004-01-30 Thomas Vander Stichele + + * gst-libs/gst/play/play.old.c: + * gst-libs/gst/play/play.old.h: + after CVS surgery by moving, remove + * gst-libs/gst/play/playpipelines.c: + remove + + * gst/intfloat/float22int.c: (gst_float2_2_int_chain): + add negotiation error + +2004-01-30 Thomas Vander Stichele + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), + (gst_ogg_demux_push): + add some seeking debug info + send a flush when seeking + +2004-01-30 Benjamin Otte + + * configure.ac: + use AC_C_INLINE + * configure.ac: + * ext/Makefile.am: + * ext/theora/Makefile.am: + * ext/theora/theoradec.c: + add theora video decoder. Does just do simple decoding for now and + has been tested against Theora cvs only. It only works when theora + is compiled with --enable-static. + * ext/vorbis/vorbisdec.c: (vorbis_dec_event): + always reset packetno on DISCONT + +2004-01-30 Ronald Bultje + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): + Fix audio. + +2004-01-30 Ronald Bultje + + * gst/mpegaudioparse/gstmpegaudioparse.c: + (mp3_type_frame_length_from_header): + Fix header parsing - stolen from ffmpeg (thank you! :) ). + +2004-01-30 Ronald Bultje + + * ext/esd/esdsink.c: (gst_esdsink_init): + Since we have static pad template caps, we don't need to negotiate; + either the core errors out or we know the format. + +2004-01-30 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), + (gst_riff_read_seek): + * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), + (gst_ebml_read_seek): + Fix event handling. + +2004-01-30 Benjamin Otte + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): + removee video/x-theora from vp3 decoder, it doesn't handle raw + theora streams + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init): + fix bug with finalizing element that never went to PAUSED + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query): + length and position queries were swapped + * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init), + (vorbis_dec_from_granulepos), (vorbis_dec_src_query), + (vorbis_dec_src_event): + implement querying time and bytes + +2004-01-30 Thomas Vander Stichele + + * just about every source file: + gst_element_error -> GST_ELEMENT_ERROR + +2004-01-29 Julien MOUTTE + + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get): Fixing seeking + emiting FLUSH and even before DISCONT. + * gst-libs/gst/play/gstplay.c: (gst_play_seek_to_time): Fix seeking to + get the best instant seeking as possible yay! + +2004-01-29 Ronald Bultje + + * gst/mpeg1videoparse/gstmp1videoparse.c: + (gst_mp1videoparse_real_chain): + Committed wrong version last week... Grr... Didn't notice until now. + +2004-01-29 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_new): Emit the + have_xwindow_id signal in xwindow_create. + +2004-01-29 Benjamin Otte + + * ext/ogg/gstoggdemux.c: + lots of changes - mainly support for chained bitstreams, seeking, + querying and bugfixes of course + * ext/vorbis/Makefile.am: + * ext/vorbis/vorbisdec.c: + * ext/vorbis/vorbisdec.h: + add vorbisdec raw vorbis decoder + * ext/vorbis/vorbis.c: (plugin_init): + register vorbisdec as PRIMARY, vorbisfile as SECONDARY + * gst/intfloat/Makefile.am: + * gst/intfloat/float22int.c: + * gst/intfloat/float22int.h: + * gst/intfloat/gstintfloatconvert.c: (plugin_init): + add float2intnew plugin. It converts multichannel interleaved float to + multichannel interleaved int. The name should probably be changed. + * gst/typefind/gsttypefindfunctions.c: (theora_type_find), + (plugin_init): + add typefinding for raw theora video so oggdemux can detect it. + +2004-01-28 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_seek_to_time): seek on video + sink element first. + * gst/videoscale/gstvideoscale.c: + (gst_videoscale_handle_src_event): Fixing src event handler. + +2004-01-28 Ronald Bultje + + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), + (gst_v4lsrc_open), (gst_v4lsrc_close), + (gst_v4lsrc_palette_to_caps), (gst_v4lsrc_srcconnect), + (gst_v4lsrc_getcaps), (gst_v4lsrc_set_clock): + * sys/v4l/gstv4lsrc.h: + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_start), + (gst_v4lsrc_grab_frame), (gst_v4lsrc_capture_stop): + Implement resizing... Hack. But that's why v4l is b0rked... + +2004-01-28 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), + (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), + (gst_ximagesink_ximage_put), (gst_ximagesink_xwindow_new), + (gst_ximagesink_xwindow_destroy): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), + (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), + (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_xcontext_get): Removing some useless debugs messages, + correctly cleaning the image created to check xshm calls on succes, + added a lot of XSync calls in X11 functions, and fixed a segfault when + no image format was defined before negotiation happened. + +2004-01-28 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_query_func): + use gst_element_get_time to get correct time + +2004-01-28 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), + (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_destroy), + (gst_ximagesink_xcontext_get), (gst_ximagesink_class_init): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xerror), + (gst_xvimagesink_check_xshm_calls), + (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xcontext_get): Our + X plugins are now able to detect that XShm calls will fail even if the + server claims that it has XShm support (remote displays most of the + time). We then log the error as a GST_DEBUG and set use_shm to FALSE + so that we use non XShm functions. This feature is almost useless for + xvimagesink as Xv is not supported on remote displays anyway, but + it might happen than even on the local display XShm calls fail. + +2004-01-27 David Schleef + + * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_init), + (gst_esdsink_link), (gst_esdsink_get_time), (gst_esdsink_chain), + (gst_esdsink_change_state): Fix sync issues in esdsink. Also + changed esdsink to only use 44100,16,2, since esd sucks at rate + conversion and esdsink has had difficulty negotiating. + +2004-01-27 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_tick_callback), + (gst_play_seek_to_time): Fixing the way to get current position. + +2004-01-27 Benjamin Otte + + * sys/oss/gstosssink.c: (gst_osssink_sink_query): + use gst_element_get_time to get correct time + +2004-01-27 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_set_location): The easiest + fix ever... Inverting 2 lines of code make spider autoplug correctly + tagged mp3 ! + +2004-01-27 David Schleef + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + Use gst_pad_try_set_caps_nonfixed(). + +2004-01-27 David Schleef + + * gst/ac3parse/gstac3parse.c: update to checklist 5 + * gst/adder/gstadder.c: rewrite negotiation. update to checklist 5 + * gst/audioconvert/gstaudioconvert.c: update to checklist 5 + * gst/audioscale/gstaudioscale.c: same + * gst/auparse/gstauparse.c: same + * gst/avi/gstavidemux.c: same + +2004-01-27 Benjamin Otte + + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_sink_event): + stop processing after EOS + +2004-01-27 Benjamin Otte + + * gst/asfdemux/asfheaders.h: + * gst/asfdemux/gstasfdemux.c: + * gst/asfdemux/gstasfmux.c: (gst_asfmux_put_guid), + (gst_asfmux_put_string), (gst_asfmux_put_wav_header), + (gst_asfmux_put_vid_header), (gst_asfmux_put_bmp_header): + lot's of fixes to make data extraction simpler and get the code + architecture and compiler independant. Add debugging category + * gst/goom/gstgoom.c: (gst_goom_change_state): + reset channel count on PAUSED=>READY, not READY=>PAUSED + +2004-01-26 Colin Walters + + * ext/gnomevfs/gstgnomevfssrc.c (gst_gnomevfssrc_get): Remove ugly + code to pull a bigger buffer in iradio mode. This as a side effect + makes typefinding work. + +2004-01-26 Jeremy Simon + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_extradata): + Fix SVQ3 decoding on PPC + +2004-01-26 Julien MOUTTE + + * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Dunno how + that one managed to stay there... Fixed. + +2004-01-26 Jeremy Simon + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_to_extradata), (gst_ffmpeg_caps_to_pixfmt): + * gst/qtdemux/qtdemux.c: (plugin_init), (qtdemux_parse_trak), + (qtdemux_video_caps): + * gst/qtdemux/qtdemux.h: + Add SVQ3 specific flags to qtdemux and ffmpeg + +2004-01-26 Benjamin Otte + + * gst-libs/gst/audio/audio.h: + remove buffer-frames from audio caps + * gst/audioconvert/gstaudioconvert.c: + fix plugin to really work. + +2004-01-25 Ronald Bultje + + * gst-libs/gst/mixer/mixer.c: + * gst-libs/gst/propertyprobe/propertyprobe.c: + * gst-libs/gst/tuner/tuner.c: (gst_tuner_find_norm_by_name), + (gst_tuner_find_channel_by_name): + * gst-libs/gst/tuner/tuner.h: + Add gtk-doc style comments. Also fix a function name. + +2004-01-25 Ronald Bultje + + * ext/divx/gstdivxdec.c: (gst_divxdec_init), + (gst_divxdec_negotiate): + Fix for new capsnego - also fixes gst-player with divxdec. + +2004-01-25 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), + (gst_play_identity_handoff), (gst_play_set_location), + (gst_play_set_visualization), (gst_play_connect_visualization): Another + try in visualization implementation. Still have an issue with switch + blocking when pulling from video_queue and only audio comes out of + spider. + * gst/switch/gstswitch.c: (gst_switch_release_pad), + (gst_switch_poll_sinkpads), (gst_switch_class_init): Implementing pad + release method. And check if the pad is usable before pulling. + +2004-01-25 Ronald Bultje + + * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose), + (gst_videobalance_init), + (gst_videobalance_colorbalance_list_channels), + (gst_videobalance_colorbalance_set_value), + (gst_videobalance_colorbalance_get_value), + (gst_videobalance_update_properties), + (gst_videobalance_update_tables_planar411), + (gst_videobalance_planar411): + * gst/videofilter/gstvideobalance.h: + Implement lookup-tables. +/- 10x faster. + +2004-01-25 Ronald Bultje + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), + (gst_avi_demux_stream_odml), (gst_avi_demux_stream_index): + The index reading was broken. The rest worked fine, but the whole + goal of my rewrite was to make avidemux readable, and this was + not at all readable. Please use typed variables. + +2004-01-25 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): + Additional pad usability check. + * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), + (mp1videoparse_find_next_gop), (gst_mp1videoparse_time_code), + (gst_mp1videoparse_real_chain): + Fix MPEG video stream parsing. The original plugin had several + issues, including not timestamping streams where the source was + not timestamped (this happens with PTS values in mpeg system + streams, but MPEG video is also a valid stream on its own so + that needs timestamps too). We use the display time code for that + for now. Also, if one incoming buffer contains multiple valid + frames, we push them all on correctly now, including proper EOS + handling. Lastly, several potential segfaults were fixed, and we + properly sync on new sequence/gop headers to include them in next, + not previous frames (since they're header for the next frame, not + the previous). Also see #119206. + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain), + (bpf_from_header): + Move caps setting so we only do it after finding several valid + MPEG-1 fraes sequentially, not right after the first one (which + might be coincidental). + * gst/typefind/gsttypefindfunctions.c: (mpeg1_sys_type_find), + (mpeg_video_type_find), (mpeg_video_stream_type_find), + (plugin_init): + Add unsynced MPEG video stream typefinding, and change some + probability values so we detect streams rightly. The idea is as + follows: I can have an unsynced system stream which contains + video. In the current code, I would randomly get a type for either + system or video stream type found, because the probabilities are + being calculated rather randomly. I now use fixed values, so we + always prefer system stream if that was found (and that is how it + should be). If no system stream was found, we can still identity the stream as video-only. + +2004-01-23 Benjamin Otte + + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), + (gst_avi_demux_stream_odml), (gst_avi_demux_stream_index): + don't write to buffer. Extract data without the need of + __attribute__ ((packed)) + +2004-01-23 Ronald Bultje + + * gst/typefind/gsttypefindfunctions.c: (mpeg1_parse_header), + (mpeg1_sys_type_find): + Fix MPEG-1 stream typefinding. + +2004-01-23 Ronald Bultje + + * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find): + Fix typefinding for MPEG-1 system streams, similar to MPEG-2. + +2004-01-23 Thomas Vander Stichele + + * ext/esd/esdsink.c: (gst_esdsink_open_audio): + * ext/esd/gstesd.c: (plugin_init): + private debugging, better error reporting + +2004-01-23 Ronald Bultje + + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_class_init), + (gst_riff_read_init), (gst_riff_read_change_state): + * gst-libs/gst/riff/riff-read.h: + Remove stuff fromold metadata system. + +2004-01-23 Ronald Bultje + + * ext/ogg/gstoggdemux.c: + Fix wrong file comment. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): + Add metadata reading properly. + +2004-01-23 Thomas Vander Stichele + + * ext/Makefile.am: + Fix nas DIST_SUBDIRS + Uraeus: + Fix bug where make distcheck doesn't get run on adding stuff to + the build. + +2004-01-23 Ronald Bultje + + * ext/divx/gstdivxdec.c: (gst_divxdec_init), (gst_divxdec_setup): + * ext/divx/gstdivxdec.h: + Fix divx3 ("msmpeg4") playback using divxdec. + +2004-01-23 Benjamin Otte + + * gst/typefind/gsttypefindfunctions.c: + (mp3_type_frame_length_from_header): fix bug in length computation + (mp3_type_find): improve debugging output + +2004-01-23 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), + (gst_play_set_location), (gst_play_seek_to_time), + (gst_play_set_audio_sink), (gst_play_set_visualization), + (gst_play_connect_visualization), (gst_play_get_sink_element): Reworked + the pipeline from scratch. Visualization is back and switch went out as + i realized it was not possible to use the way i wanted. + * sys/ximage/ximagesink.c: (gst_ximagesink_imagepool_clear), + (gst_ximagesink_change_state), (gst_ximagesink_dispose): Move xcontext + clearing in state change from READY to NULL. So that one can clean the + X ressources keeping the element. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_imagepool_clear), (gst_xvimagesink_change_state), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value), + (gst_xvimagesink_set_property), (gst_xvimagesink_dispose), + (gst_xvimagesink_init): Same xcontext cleaning than ximagesink in state + change from READY to NULL and fixed some stupid bugs in colorbalance + get/set values. Also added the following feature : when nobody tries to + set some values to the colorbalance levels before the xcontext is + grabbed, then when creating channels list from Xv attributes we set the + internal values to the Xv defaults. This way we handle buggy Xv drivers + that set default hue values far from the middle of the range (Thanks + to Jon Trowbridge for pointing that issue). + * sys/xvimage/xvimagesink.h: Adding a cb_changed boolean to know if + colorbalance levels have been set before xcontext is grabbed. + +2004-01-22 Ronald Bultje + + * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): + Fix the ossmixer case where we shouldn't open /dev/dsp* because + it might block operations (which is bad for a mixer). + +2004-01-22 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: (have_type_callback), + (deep_notify_callback), (gmi_set_decoder), (gmi_clear_decoder), + (gmip_find_type_pre): + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/media-info/media-info.c: + (gst_media_info_instance_init), (gst_media_info_read_idler): + add fakesink to get caps on decoder src pad again + fix callback prototype to match new have_type signal signature + +2004-01-22 Thomas Vander Stichele + + * gst/adder/gstadder.c: (gst_adder_link): + fix non-compile and cut-n-paste code + +2004-01-21 David Schleef + + * ext/swfdec/gstswfdec.c: (gst_swfdec_video_getcaps), + (gst_swfdec_video_link), (copy_image), (gst_swfdec_loop), + (gst_swfdec_init), (gst_swfdec_change_state): + * ext/swfdec/gstswfdec.h: + Fix negotiation. + * gst/adder/gstadder.c: (gst_adder_link), (gst_adder_init), + (gst_adder_request_new_pad): Fix negotiation. + * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_src_fixate): + Add a fixate function. + * gst/intfloat/gstfloat2int.c: + * gst/intfloat/gstfloat2int.h: + * gst/intfloat/gstint2float.c: + * gst/intfloat/gstint2float.h: + Completely rewrite the negotiation. Doesn't quite work yet, + due to some buffer-frames problem. + +2004-01-21 Thomas Vander Stichele + + * ext/gnomevfs/gstgnomevfssrc.c: + * sys/v4l2/v4l2_calls.h: + fix includes for distcheck + +2004-01-21 Christian Schaller + + * ext/nas/ + Add libnas (network audio system) plugin, patch from Arwed von Merkatz + based on earlier patch from Laurent Vivier + +2004-01-20 Jeremy Simon + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_extradata): + Fix wma caps property + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): + Fix typo (flags1 and flags2) + +2004-01-20 Thomas Vander Stichele + + * gst-libs/gst/media-info/media-info-priv.c: + (deep_notify_callback), (gmi_seek_to_track), (gmi_get_decoder), + (gmip_find_type_pre), (gmip_find_type), (gmip_find_stream_post), + (gmip_find_stream), (gmip_find_track_metadata), + (gmip_find_track_streaminfo_post), (gmip_find_track_streaminfo), + (gmip_find_track_format): + * gst-libs/gst/media-info/media-info-priv.h: + * gst-libs/gst/media-info/media-info-test.c: (main): + * gst-libs/gst/media-info/media-info.c: (gst_media_info_init), + (gst_media_info_read_idler), (gst_media_info_read): + * gst-libs/gst/media-info/media-info.h: + register debugging category and use it for debugging + +2004-01-20 Thomas Vander Stichele + + * ext/vorbis/vorbisfile.c: (gst_vorbisfile_update_streaminfo), + (gst_vorbisfile_new_link): + signal streaminfo through tags + +2004-01-20 Ronald Bultje + + * ext/mplex/gstmplex.cc: + * ext/mplex/gstmplexibitstream.cc: + g++ doesn't like NULL in our i18n/error macros, should be + either (NULL) or (""). + +2004-01-20 Ronald Bultje + + * sys/dxr3/dxr3audiosink.c: + * sys/dxr3/dxr3init.c: + * sys/dxr3/dxr3spusink.c: (dxr3spusink_close): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_close): + Fix more error error error errors (missing includes here). + +2004-01-20 Ronald Bultje + + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + fix thomas' error errors. + +2004-01-20 Thomas Vander Stichele + + * ext/mpeg2enc/gstmpeg2enc.cc: + fix error errors. + +2004-01-20 Ronald Bultje + + * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): + * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): + Fix for new error system. + +2004-01-20 Thomas Vander Stichele + + * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): + fix for new error reporting + +2004-01-20 David Schleef + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), + (gst_ximagesink_xcontext_get), (gst_ximagesink_getcaps), + (gst_ximagesink_set_xwindow_id): Change to using a framerate + of [1,100] instead of [0,MAX], since 0 isn't handled correctly, + and neither is 100+, most likely. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), + (gst_xvimagesink_getcaps): same + +2004-01-19 Benjamin Otte + + * configure.ac: + Up version requirement to 2.0.3 (not yet released) to avoid symbol + clashes with ffmpeg. + +2004-01-20 Julien MOUTTE + + * gst/switch/gstswitch.c: (gst_switch_request_new_pad), + (gst_switch_init): Fixed switch element : proxying link and setting + caps from src to sink on request. + +2004-01-19 Thomas Vander Stichele + + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): + * sys/v4l2/v4l2-overlay_calls.c: (gst_v4l2_set_display), + (gst_v4l2_set_window), (gst_v4l2_enable_overlay): + fix element_error + +2004-01-19 Thomas Vander Stichele + + * sys/v4l/v4l_calls.h: + * sys/v4l2/v4l2_calls.h: + element_error fixes + +2004-01-19 Thomas Vander Stichele + + * gst-libs/gst/gst-i18n-plugin.h: + add locale.h + remove config.h inclusion + +2004-01-19 Thomas Vander Stichele + + * autogen.sh: + adding autopoint invocation + * Makefile.am: + * configure.ac: + * gst-libs/gst/gettext.h: + adding gettext bits + * ext/audiofile/gstafsink.c: (gst_afsink_plugin_init): + * ext/audiofile/gstafsrc.c: (gst_afsrc_plugin_init): + * ext/gnomevfs/gstgnomevfs.c: (plugin_init): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), + (gst_gnomevfssink_close_file): + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_open_file): + * ext/sndfile/gstsf.c: (gst_sf_loop), (plugin_init): + * gst-libs/gst/gst-i18n-plugin.h: + * gst/avi/gstavi.c: (plugin_init): + * sys/dxr3/dxr3init.c: (plugin_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_write_data): + * sys/oss/gstossaudio.c: (plugin_init): + * sys/oss/gstosselement.c: (gst_osselement_open_audio): + * sys/v4l/gstv4l.c: (plugin_init): + * sys/v4l/v4l_calls.c: (gst_v4l_open): + * sys/v4l2/gstv4l2.c: (plugin_init): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_get_norm), (gst_v4l2_set_norm), + (gst_v4l2_get_input), (gst_v4l2_set_input), (gst_v4l2_get_output), + (gst_v4l2_set_output), (gst_v4l2_get_frequency), + (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), + (gst_v4l2_get_attribute), (gst_v4l2_set_attribute): + make sure locale and translation domain are set + fix translated strings + * po/.cvsignore: + * po/LINGUAS: + * po/Makevars: + * po/POTFILES.in: + * po/nl.po: + put translation files into place + * sys/xvideo/imagetest.c: (main): + * ext/dv/demo-play.c: (main): + fix unnecessary translations + +2004-01-19 Thomas Vander Stichele + + * ext/sndfile/gstsf.c: + * gst/avi/gstavimux.c: + * ext/audiofile/gstafsink.c: + * ext/audiofile/gstafsrc.c: + * ext/gnomevfs/gstgnomevfssink.c: + * ext/gnomevfs/gstgnomevfssrc.c: + * sys/oss/gstosselement.c: + * sys/v4l/v4l_calls.h: + fix i18n include + +2004-01-19 Thomas Vander Stichele + + * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), + (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_get_norm), + (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), + (gst_v4l2_get_output), (gst_v4l2_set_output), + (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), + (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), + (gst_v4l2_set_attribute): + update to new error handling + +2004-01-19 Thomas Vander Stichele + + * ext/sidplay/gstsiddec.cc: + * gst/modplug/gstmodplug.cc: + parenthese NULL because C++ seems angry about it + +2004-01-19 Thomas Vander Stichele + + * gst-libs/gst/gst-i18n-plugin.h: + add skeleton i18n stuff, but needs to be further implemented + +2004-01-18 Thomas Vander Stichele + + * examples/gstplay/player.c: (main): + * ext/aalib/gstaasink.c: (gst_aasink_open): + * ext/alsa/gstalsa.c: (gst_alsa_link), (gst_alsa_xrun_recovery): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): + * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): + * ext/audiofile/gstafsink.c: (gst_afsink_open_file), + (gst_afsink_close_file): + * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), + (gst_afsrc_close_file): + * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): + * ext/dv/gstdvdec.c: (gst_dvdec_loop): + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_user_op), (dvdnavsrc_get): + * ext/esd/esdmon.c: (gst_esdmon_get): + * ext/esd/esdsink.c: (gst_esdsink_chain): + * ext/faac/gstfaac.c: (gst_faac_chain): + * ext/faad/gstfaad.c: (gst_faad_chain): + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_loop): + * ext/flac/gstflacdec.c: (gst_flacdec_error_callback), + (gst_flacdec_loop): + * ext/flac/gstflacenc.c: (gst_flacenc_chain): + * ext/flac/gstflactag.c: (gst_flac_tag_chain): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): + * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), + (gst_gnomevfssink_close_file): + * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init), + (gst_gnomevfssrc_open_file): + * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): + * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_chain): + * ext/lcs/gstcolorspace.c: (gst_colorspace_srcconnect_func): + * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), + (gst_id3_tag_do_typefind), (gst_id3_tag_chain): + * ext/mad/gstmad.c: (gst_mad_chain): + * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): + * ext/mpeg2dec/gstmpeg2dec.c: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + * ext/mplex/gstmplex.cc: + * ext/mplex/gstmplexibitstream.cc: + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain), + (gst_ogg_demux_push), (gst_ogg_pad_push): + * ext/raw1394/gstdv1394src.c: + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_lock), + (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create): + * ext/sidplay/gstsiddec.cc: + * ext/sndfile/gstsf.c: (gst_sf_open_file), (gst_sf_close_file), + (gst_sf_loop): + * ext/speex/gstspeexenc.c: (gst_speexenc_chain): + * ext/tarkin/gsttarkindec.c: (gst_tarkindec_chain): + * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_chain): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): + * ext/vorbis/vorbisfile.c: (gst_vorbisfile_loop): + * ext/xvid/gstxviddec.c: (gst_xviddec_setup), (gst_xviddec_chain): + * ext/xvid/gstxvidenc.c: (gst_xvidenc_setup), (gst_xvidenc_chain): + * gst-libs/gst/Makefile.am: + * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), + (gst_riff_read_element_data), (gst_riff_read_seek), + (gst_riff_peek_list), (gst_riff_read_list), (gst_riff_read_header): + * gst/adder/gstadder.c: (gst_adder_parse_caps), (gst_adder_loop): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment), + (gst_asf_demux_process_stream), (gst_asf_demux_get_stream): + * gst/avi/gstavidemux.c: (gst_avi_demux_stream_init), + (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): + * gst/avi/gstavimux.c: (gst_avimux_stop_file): + * gst/flx/gstflxdec.c: (gst_flxdec_loop): + * gst/goom/gstgoom.c: (gst_goom_chain): + * gst/id3/gstid3types.c: (gst_id3types_loop): + * gst/intfloat/gstfloat2int.c: (gst_float2int_loop): + * gst/intfloat/gstint2float.c: (gst_int2float_chain_gint16): + * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), + (gst_ebml_read_element_length), (gst_ebml_read_element_data), + (gst_ebml_read_seek), (gst_ebml_read_uint), (gst_ebml_read_sint), + (gst_ebml_read_float), (gst_ebml_read_header): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), + (gst_matroska_demux_parse_blockgroup): + * gst/modplug/gstmodplug.cc: + * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): + * gst/oneton/gstoneton.c: (gst_oneton_chain): + * gst/silence/gstsilence.c: (gst_silence_get): + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + * gst/smpte/gstsmpte.c: (gst_smpte_loop): + * gst/speed/gstspeed.c: (speed_loop): + * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + * gst/volenv/gstvolenv.c: (gst_volenv_chain): + * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): + * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), + (gst_wavparse_loop): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_open), + (dxr3audiosink_set_mode_pcm), (dxr3audiosink_set_mode_ac3), + (dxr3audiosink_close): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_open), (dxr3spusink_close): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_open), + (dxr3videosink_close), (dxr3videosink_write_data): + * sys/oss/gstosselement.c: (gst_osselement_open_audio): + * sys/oss/gstosselement.h: + * sys/oss/gstosssink.c: (gst_osssink_get_type), (gst_osssink_init), + (gst_osssink_chain): + * sys/oss/gstosssrc.c: (gst_osssrc_get): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_buffer_free): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_buffer_free): + * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_window), + (gst_v4l_enable_overlay): + * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities), (gst_v4l_open), + (gst_v4l_set_chan_norm), (gst_v4l_get_signal), + (gst_v4l_get_frequency), (gst_v4l_set_frequency), + (gst_v4l_get_picture), (gst_v4l_set_picture), (gst_v4l_get_audio), + (gst_v4l_set_audio): + * sys/v4l/v4l_calls.h: + * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), + (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_set_playback), + (gst_v4lmjpegsink_playback_init), + (gst_v4lmjpegsink_playback_start): + * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame), + (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_capture), + (gst_v4lmjpegsrc_set_capture_m), (gst_v4lmjpegsrc_capture_init), + (gst_v4lmjpegsrc_requeue_frame): + * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), + (gst_v4lsrc_sync_frame), (gst_v4lsrc_capture_init), + (gst_v4lsrc_requeue_frame), (gst_v4lsrc_try_palette): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get): + * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), + (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), + (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), + (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), + (gst_v4l2src_capture_stop): + * sys/vcd/vcdsrc.c: (vcdsrc_open_file): + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), + (gst_ximagesink_chain): + * sys/xvideo/xvideosink.c: (gst_xvideosink_buffer_new), + (gst_xvideosink_sinkconnect), (gst_xvideosink_chain), + (gst_xvideosink_xwindow_new): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_chain): + use new error signal, function and categories + +2004-01-18 Jeremy Simon + + * configure.ac: + * ext/Makefile.am: + * ext/musicbrainz/gsttrm.c: + * ext/musicbrainz/gsttrm.h: + * ext/musicbrainz/Makefile.am: + Add a trm plugin + +2004-01-18 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_set_property), + (gst_ximagesink_get_property), (gst_ximagesink_class_init): Adding + synchronous property for debugging. + * sys/ximage/ximagesink.h: Adding the synchronous boolean flag. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_set_property): Moving a pointer declaration to a + smaller block, fixing indent. + +2004-01-16 David Schleef + + * gst/videofilter/gstvideobalance.c: Fix regression; changing a + property affects the video stream. + * sys/xvimage/xvimagesink.c: + * sys/xvimage/xvimagesink.h: + Add synchronous property for debugging. Should probably be + disabled in non-CVS builds. Make sure that the Xv attribute + exists before we set it (crash!). Fix a silly float bug that + caused colorbalance to just not work. + +2004-01-17 Christian Schaller + + * tools/gst-launch-ext.in - update for new plugins + +2004-01-16 David Schleef + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): Fix use of + already-freed caps. + +2994-01-16 Christian Schaller + + * Update spec for new colorspace plugin and libcaca plugin + * Fix compilation of libcaca plugin (clock -> id) + +2004-01-16 Julien MOUTTE + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_update_colorbalance), + (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), + (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value), + (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), + (gst_xvimagesink_init), (gst_xvimagesink_class_init): Implementing + correct colorbalance properties. They can now be set when the element + is still in NULL state. The values will be committed to the Xv Port + when xcontext is initialized. + * sys/xvimage/xvimagesink.h: Added hue, saturation, contrast, + brightness int values in the GstXvImagesink structure. + +2004-01-16 Ronald Bultje + + * gst-libs/gst/Makefile.am: + restructure so having local patches works easier. + +2004-01-16 Ronald Bultje + + * ext/mpeg2enc/Makefile.am: + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + Bugfix with respect to EOS handling. + +2004-01-16 Ronald Bultje + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): + Link with right caps (else, it segfaults). + * ext/mplex/gstmplexjob.cc: + Fix for slight API change in 1.6.1.93 release of mjpegtools. + +2004-01-15 David Schleef + + * gst-libs/gst/audio/Makefile.am: + Add gstaudiofiltertemplate.c and building of gstaudiofilterexample.c + from the template. + * gst-libs/gst/audio/gstaudiofilter.c: + * gst-libs/gst/audio/gstaudiofilter.h: + Add bytes_per_sample and size and n_samples calculation. + * gst-libs/gst/audio/gstaudiofilterexample.c: + Remove, now autogenerated. + * gst-libs/gst/audio/gstaudiofiltertemplate.c: + Moved from gstaudiofilterexample, object name changed, code added + so that it actually works. + * gst-libs/gst/audio/make_filter: + Script to build an audiofilter subclass from the template. + * gst/colorspace/Makefile.am: + * gst/colorspace/yuv2yuv.c: + Remove file, since it's GPL, and we don't use it. + +2004-01-15 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Making both of + them use the buffer free function to test how the buffer was allocated. + +2004-01-15 David Schleef + + * ext/esd/esdsink.c: (gst_esdsink_class_init): Remove property + that handles osssink fallback. + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init), + (gst_audio_convert_getcaps): + * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): + Add audio/x-qdm2 for QDM2 audio. + * gst/sine/gstsinesrc.c: (gst_sinesrc_get): + * gst/sine/gstsinesrc.h: Add example of how to implement tags. + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): + Decrease minimum size to 16x16. + * gst/wavparse/gstwavparse.c: + Convert disabled pad template caps to new caps. + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_chain): Throw element error when display cannot + be opened. Increase minimum framerate to 1.0. Check the data + free function on a buffer to make sure it is the type we expect + before manipulating it. + +2004-01-15 Julien MOUTTE + + * gst/videofilter/gstvideobalance.c: (gst_videobalance_init), + (gst_videobalance_colorbalance_set_value): Implement passthru if + settings are in the middle. + * tools/gst-launch-ext.in: Stop using xvideosink, use ximagesink. + +2004-01-15 Ronald Bultje + + * gst/videofilter/Makefile.am: + * gst/volume/Makefile.am: + Since we use videofilter symbols, link to it. + +2004-01-15 Julien MOUTTE + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_interface_init): Setting + mixer interface type to HARDWARE. + * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): Adding a default + type to SOFTWARE. + * gst-libs/gst/mixer/mixer.h: Adding mixer interface type and macro. + * gst-libs/gst/mixer/mixertrack.h: Adding mixertrack flag SOFTWARE. + * gst/volume/gstvolume.c: (gst_volume_interface_supported), + (gst_volume_interface_init), (gst_volume_list_tracks), + (gst_volume_set_volume), (gst_volume_get_volume), + (gst_volume_set_mute), (gst_volume_mixer_init), + (gst_volume_dispose), (gst_volume_get_type), (volume_class_init), + (volume_init): Implementing mixer interface. + * gst/volume/gstvolume.h: Adding tracklist for mixer interface. + * sys/oss/gstosselement.c: (gst_osselement_get_type), + (gst_osselement_change_state): Removing some trailing commas in + structures. + * sys/oss/gstossmixer.c: (gst_ossmixer_interface_init): Setting mixer + interface type to HARDWARE. + * sys/v4l/gstv4lcolorbalance.c: + (gst_v4l_color_balance_interface_init): Setting colorbalance interface + type to HARDWARE. + * sys/v4l2/gstv4l2colorbalance.c: + (gst_v4l2_color_balance_interface_init): Setting colorbalance + interface type to HARDWARE. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): use exactly the + same code than ximagesink for event handling. + +2004-01-15 Ronald Bultje + + * ext/snapshot/Makefile.am: + * ext/snapshot/gstsnapshot.c: (gst_snapshot_sinkconnect), + (gst_snapshot_chain): + * ext/snapshot/gstsnapshot.h: + This has to be a joke... Snapshot should be connected to a tee, + colorspace element before it and EOS after that, where the other + src of the tee receives normal data. + The current way is *wrong*. + +2004-01-15 Ronald Bultje + + * ext/hermes/gsthermescolorspace.c: + Fix another compile error. Same as below. + +2004-01-15 Ronald Bultje + + * gst/colorspace/gstcolorspace.c: + * gst/colorspace/yuv2yuv.c: (gst_colorspace_yuy2_to_i420), + (gst_colorspace_i420_to_yv12): + Fix compiling... Didn't test if it actually works. + +2004-01-15 David Schleef + + * configure.ac: + * gst/colorspace/Makefile.am: + * gst/colorspace/gstcolorspace.c: + * gst/colorspace/gstcolorspace.h: + * gst/colorspace/yuv2rgb.c: + * gst/colorspace/yuv2rgb.h: + Duplicate the ext/hermes colorspace plugin, and remove Hermes + code and GPL code. Fix for new caps negotiation. Rewrite + much of the format handling code, and some of the conversion + code. Basically, rewrote almost everything. This element + handles I420, YV12 to RGB conversions. + * ext/hermes/Makefile.am: + * ext/hermes/gsthermescolorspace.c: + Rename colorspace to hermescolorspace. Fix negotiation issues. + Remove non-Hermes related code. This element handles lots of + RGB to RGB conversions, but no YUV. + * ext/hermes/gstcolorspace.c: + * ext/hermes/gstcolorspace.h: + * ext/hermes/rgb2yuv.c: + * ext/hermes/yuv2rgb.c: + * ext/hermes/yuv2rgb.h: + * ext/hermes/yuv2rgb_mmx16.s: + * ext/hermes/yuv2yuv.c: + * ext/hermes/yuv2yuv.h: + Remove old code. + +2004-01-14 Colin Walters + + * ext/mad/gstid3tag.c (gst_id3_tag_chain): Don't nego caps if + they've already been. + +2004-01-15 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_do_caps_nego): + assume tag mode when pad is not connected + +2004-01-15 Benjamin Otte + + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + Don't update the time of the clock + (gst_alsa_sink_loop): + sync to the clock given to alsasink, not the own clock + * sys/oss/gstosssink.c: (gst_osssink_chain): + sync to the clock + (gst_osssink_change_state): + activate the clock + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): + remove bogus code that made DISCONT events unhandled + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps): + explicitly case to double in _set_simple. (fixes 2nd warning in bug + #131502) + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_read_object_header), + (gst_asf_demux_handle_sink_event), (gst_asf_demux_audio_caps), + (gst_asf_demux_add_audio_stream), (gst_asf_demux_video_caps): + convert g_warning because of wrong asf data to GST_WARNINGs (fixes + 2nd warning in bug #131502) + +2004-01-14 Julien MOUTTE + + * gst/videofilter/gstvideobalance.c: (gst_videobalance_init), + (gst_videobalance_colorbalance_set_value), + (gst_videobalance_colorbalance_get_value): Fixing videobalance ranges + for colorbalance interface implementation. + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), + (gst_ximagesink_set_property), (gst_ximagesink_get_property), + (gst_ximagesink_dispose), (gst_ximagesink_init), + (gst_ximagesink_class_init): Adding DISPLAY property. + * sys/ximage/ximagesink.h: Adding display_name to store display. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), + (gst_xvimagesink_dispose), (gst_xvimagesink_init), + (gst_xvimagesink_class_init): Adding DISPLAY property and colorbalance + properties (they still need polishing though for gst-launch use : no + xcontext yet, i ll do that tomorrow). + * sys/xvimage/xvimagesink.h: Adding display_name to store display. + +2004-01-14 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), + (gst_play_set_location), (gst_play_set_visualization): Preparing + switch integration, adding videobalance in the pipeline. + +2004-01-14 Julien MOUTTE + + * gst-libs/gst/colorbalance/colorbalance.c: + (gst_color_balance_class_init): Adding a default type. + * gst-libs/gst/colorbalance/colorbalance.h: Adding a macro to access + the type. + * gst/videofilter/gstvideobalance.c: (gst_videobalance_get_type), + (gst_videobalance_dispose), (gst_videobalance_class_init), + (gst_videobalance_init), (gst_videobalance_interface_supported), + (gst_videobalance_interface_init), + (gst_videobalance_colorbalance_list_channels), + (gst_videobalance_colorbalance_set_value), + (gst_videobalance_colorbalance_get_value), + (gst_videobalance_colorbalance_init): Implementing colorbalance + interface. + * gst/videofilter/gstvideobalance.h: Adding colorbalance channels + list. + * sys/ximage/ximagesink.c: (gst_ximagesink_set_xwindow_id): Fixing a + bug which was triggering a BadAccess X error when setting an overlay + before pad was really negotiated. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_colorbalance_init): + Using the colorbalance type macro. + +2004-01-14 Benjamin Otte + + * ext/flac/gstflacenc.c: (gst_flacenc_set_metadata), + (gst_flacenc_chain): + handle tags correctly + * gst/tags/gstid3tag.c: (gst_tag_list_new_from_id3v1): + extract ID3v1 tags correctly + +2004-01-14 Ronald Bultje + + * gst/typefind/gsttypefindfunctions.c: (matroska_type_find), + (plugin_init): + Improve matroska typefinding for odd-typed headers... + +2004-01-14 Ronald Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): + Fix for using incremental number on padnames. + +2004-01-14 Ronald Bultje + + * ext/divx/gstdivxdec.c: + * ext/divx/gstdivxenc.c: + Set category to divx4linux instead of divx (too generic). + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_parse_fmt), (gst_wavparse_handle_sink_event), + (gst_wavparse_loop), (gst_wavparse_change_state): + * gst/wavparse/gstwavparse.h: + fix parsing of WAV files with non-standard fmt-tag size and fix + skipping of unrecognized chunks... Someone please fix this thing + to use rifflib so all this is automated. + * sys/v4l/Makefile.am: + * sys/v4l2/Makefile.am: + Add X_CFLAGS because we depend on X (for overlay). + +2004-01-14 Jan Schmidt + + * ext/mpeg2dec/gstmpeg2dec.c: + Don't issue a timestamp unless we tagged the frame + with a PTS. + +2004-01-14 Benjamin Otte + + * gst-libs/gst/play/gstplay.c: (gst_play_tick_callback): + Query the audio element to get the time, not the clock. We're + interested in the element's time here. + +2004-01-14 Benjamin Otte + + * ext/aalib/gstaasink.c: (gst_aasink_chain): + * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): + * ext/esd/esdsink.c: (gst_esdsink_chain): + * ext/libcaca/gstcacasink.c: (gst_cacasink_chain): + * ext/mas/massink.c: (gst_massink_chain): + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_chain): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_index), + (gst_matroska_demux_parse_metadata): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop), + (gst_mpeg_parse_release_locks): + * gst/tcp/gsttcpsink.c: (gst_tcpsink_chain): + * gst/udp/gstudpsink.c: (gst_udpsink_chain): + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), + (gst_osssink_change_state): + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvideo/xvideosink.c: (gst_xvideosink_chain), + (gst_xvideosink_release_locks): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): + use element time. + * ext/alsa/gstalsaclock.c: (gst_alsa_clock_start), + (gst_alsa_clock_stop): + * gst-libs/gst/audio/audioclock.c: (gst_audio_clock_set_active), + (gst_audio_clock_get_internal_time): + simplify for use with new clocking code. + * testsuite/alsa/Makefile.am: + * testsuite/alsa/sinesrc.c: (sinesrc_init), (sinesrc_force_caps): + fix testsuite for new caps system + +2004-01-14 Benjamin Otte + + * ext/flac/gstflacdec.c: (gst_flacdec_update_metadata): + * ext/flac/gstflacenc.c: (add_one_tag): + length is already host endian, no need to convert. Fixes playback of + tagged files on PPC. (bug #128384) + +2004-01-13 Julien MOUTTE + + * gst-libs/gst/colorbalance/colorbalance.h: Adding a type to the + colorbalance interface stating if it is hardware based or software + based. + * gst/videofilter/gstvideobalance.c: (gst_videobalance_planar411): + Removing a trailing comma. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_colorbalance_init): Integrating a patch from Jon + Trowbridge querying Xv adaptor for min/max value as + the documentation seems to be wrong on the -1000 to 1000 interval. + +2004-01-12 David Schleef + + * gst/debug/efence.c: (gst_efence_init), (gst_efence_chain), + (gst_efence_buffer_alloc), (gst_fenced_buffer_new), + (gst_fenced_buffer_default_free), (gst_fenced_buffer_default_copy): + Fix negotiation. Add a bufferalloc function for the sink pad, + and generally clean up some of the code. + +2004-01-12 Julien MOUTTE + + * gst-libs/gst/colorbalance/colorbalancechannel.c: + (gst_color_balance_channel_dispose): Adding safety check in dispose + method. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_xcontext_clear), + (gst_xvimagesink_interface_supported), + (gst_xvimagesink_colorbalance_list_channels), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value), + (gst_xvimagesink_colorbalance_init), (gst_xvimagesink_get_type): + Adding colorbalance interface support to set XV parameters such as + HUE, BRIGHTNESS, CONTRAST, SATURATION. + * sys/xvimage/xvimagesink.h: Adding the channels list for colorbalance + interface. + +2004-01-12 Thomas Vander Stichele + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_get_type), + (gst_audio_convert_class_init), (gst_audioconvert_getcaps), + (gst_audio_convert_init), (gst_audio_convert_set_property), + (gst_audio_convert_get_property), (gst_audio_convert_chain), + (gst_audio_convert_link), + (gst_audio_convert_buffer_to_default_format), + (gst_audio_convert_buffer_from_default_format), (plugin_init): + - implement _getcaps and use it + - improve linking + - remove float caps since no float conversion is actually done + - remove properties and arguments that were to be used for rate + conversion + +2004-01-12 Thomas Vander Stichele + + * gst-libs/gst/audio/audio.c: (_gst_audio_structure_set_list), + (gst_audio_structure_set_int): + * gst-libs/gst/audio/audio.h: + add helper functions for _getcaps matching the standard audio + templates + +2004-01-12 David Schleef + + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): + Test that pad is negotiated before getting its caps. + +2004-01-12 Julien MOUTTE + + * gst-libs/gst/play/gstplay.c: (gst_play_get_sink_element): When + analyzing the pads of an element the bin is mostly in READY state so + no caps were negotiated. This helper function needs to work with + _get_caps directly then. I was not freeing them though, added that to + fix the mem leak. + +2004-01-12 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_chain): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Fixing the + direct put buffers detection. I prefer checking GST_BUFFER_PRIVATE + than the free_func. + +2004-01-12 Thomas Vander Stichele + + * sys/oss/gstossaudio.c: (plugin_init): + * sys/oss/gstosselement.c: (gst_osselement_sync_parms): + * sys/oss/gstosselement.h: + make an oss debugging category + make failure more descriptive + +2004-01-11 David Schleef + + * ext/ffmpeg/gstffmpeg.c: + * ext/ffmpeg/gstffmpegcodecmap.c: + * ext/ffmpeg/gstffmpegdec.c: + * ext/ffmpeg/gstffmpegenc.c: + * ext/ffmpeg/gstffmpegprotocol.c: + * ext/gdk_pixbuf/gstgdkanimation.c: + * ext/jpeg/gstjpeg.c: + * ext/libpng/gstpng.c: + * ext/mpeg2dec/perftest.c: + * ext/speex/gstspeex.c: + * gst-libs/gst/resample/dtos.c: + * gst/intfloat/gstintfloatconvert.c: + * gst/oneton/gstoneton.c: + * gst/rtjpeg/RTjpeg.c: + * gst/rtp/gstrtp.c: + * sys/dxr3/dxr3init.c: + * sys/glsink/gstgl_nvimage.c: + * sys/glsink/gstgl_pdrimage.c: + * sys/glsink/gstglsink.c: + * testsuite/gst-lint: + Make sure everybody wraps #include "config.h" in #ifdef HAVE_CONFIG_H + +2004-01-11 David Schleef + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_set_caps): + * ext/faac/gstfaac.c: (gst_faac_sinkconnect): + * ext/gdk_pixbuf/gstgdkanimation.c: + (gst_gdk_animation_iter_create_pixbuf): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), + (gst_gdk_pixbuf_chain): + * ext/gdk_pixbuf/gstgdkpixbuf.h: + * ext/jack/gstjack.c: (gst_jack_change_state): + * ext/xvid/gstxviddec.c: (gst_xviddec_sink_link): + * gst-libs/gst/play/gstplay.c: (gst_play_get_sink_element): + * gst-libs/gst/play/play.c: (gst_play_get_sink_element): + * gst/videofilter/gstvideofilter.c: + (gst_videofilter_set_output_size): + Remove all usage of gst_pad_get_caps(), and replace it with + gst_pad_get_allowed_caps() or gst_pad_get_negotiated_cap(). + +2004-01-11 David Schleef + + * configure.ac: + * ext/Makefile.am: Fixes to make ext/libcaca compile. + * ext/divx/gstdivxdec.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), + (gst_gdk_pixbuf_init), (gst_gdk_pixbuf_chain): Make gdkpixbufdec + handle images that span multiple buffers. Now work with both + filesrc ! gdkpixbufdec and qtdemux ! gdkpixbufdec. + * ext/gdk_pixbuf/gstgdkpixbuf.h: + * ext/libcaca/gstcacasink.h: Fixes needed due to recent + video/video.h changes + * ext/xvid/gstxvid.c: (gst_xvid_csp_to_caps): same + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), + (gst_v4lmjpegsrc_buffer_free): Use buffer free function instead + of GstData free function. + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): + same. + +2004-01-12 Benjamin Otte + + * sys/v4l2/gstv4l2element.c: (gst_v4l2element_class_init), + (gst_v4l2element_dispose), (gst_v4l2element_set_property), + (gst_v4l2element_get_property): + * sys/v4l2/v4l2_calls.c: (gst_v4l2_set_defaults), (gst_v4l2_open): + add norm, channel and frequency properties. + * sys/v4l2/gstv4l2tuner.c: + fixes for tuner interface changes + * sys/v4l2/gstv4l2element.h: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2src_calls.c: + * sys/v4l2/v4l2src_calls.h: + rework v4l2src to work with saa1734 cards and allow mmaped buffers. + +2004-01-12 Benjamin Otte + + * gst-libs/gst/tuner/tuner.c: (gst_tuner_class_init), + (gst_tuner_find_norm_by_name), (gst_v4l2_find_channel_by_name), + (gst_tuner_channel_changed), (gst_tuner_norm_changed), + (gst_tuner_frequency_changed), (gst_tuner_signal_changed): + * gst-libs/gst/tuner/tuner.h: + GObjects aren't const. + Add find_by_name functions. + Add checks to _changed functions. + * sys/v4l/gstv4ltuner.c: (gst_v4l_tuner_get_channel), + (gst_v4l_tuner_get_norm): + Fixes for above. + +2004-01-12 Benjamin Otte + + * gst-libs/gst/video/video.h: + Fix caps template names to be understandable. + Prefix everything with GST_VIDEO. + * ext/aalib/gstaasink.c: + * ext/divx/gstdivxdec.c: + * ext/divx/gstdivxenc.c: + * ext/gdk_pixbuf/gstgdkpixbuf.c: + * ext/hermes/gstcolorspace.c: (gst_colorspace_base_init): + * ext/jpeg/gstjpegdec.c: (raw_caps_factory): + * ext/jpeg/gstjpegenc.c: (raw_caps_factory): + * ext/libcaca/gstcacasink.c: + * ext/libpng/gstpngenc.c: (raw_caps_factory): + * ext/snapshot/gstsnapshot.c: + * ext/swfdec/gstswfdec.c: + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + * gst/chart/gstchart.c: + * gst/deinterlace/gstdeinterlace.c: + * gst/effectv/gsteffectv.c: + * gst/flx/gstflxdec.c: (gst_flxdec_loop): + * gst/goom/gstgoom.c: + * gst/median/gstmedian.c: + * gst/monoscope/gstmonoscope.c: (gst_monoscope_init), + (gst_monoscope_srcconnect), (gst_monoscope_chain): + * gst/overlay/gstoverlay.c: + * gst/smooth/gstsmooth.c: + * gst/smpte/gstsmpte.c: + * gst/synaesthesia/gstsynaesthesia.c: + * gst/videocrop/gstvideocrop.c: + * gst/videodrop/gstvideodrop.c: + * gst/y4m/gsty4mencode.c: + * sys/qcam/gstqcamsrc.c: + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps): + Make them work with new video.h file. + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): + Make it work with new buffer allocation system. + +2004-01-11 Julien MOUTTE + + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): Fixing the + pad_alloc_buffer implementation to use ->srcpad + * ext/hermes/gstcolorspace.c: (gst_colorspace_chain): Fixing the + pad_alloc_buffer implementation to use ->srcpad + * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Fixing the + pad_alloc_buffer implementation to use ->srcpad + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_chain), (gst_ximagesink_buffer_free), + (gst_ximagesink_buffer_alloc): Now only use GST_BUFFER_PRIVATE to keep + a reference to everything we need. + * sys/ximage/ximagesink.h: adding a reference to the sink in the image. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), + (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), + (gst_xvimagesink_buffer_alloc): Now only use GST_BUFFER_PRIVATE to keep + a reference to everything we need. + * sys/xvimage/xvimagesink.h: adding a reference to the sink in the image + +2004-01-11 David Schleef + + * ext/divx/gstdivxenc.c: remove bogus gst_caps_is_fixed() test + * gst/debug/efence.c: (gst_efence_chain), (gst_fenced_buffer_new), + (gst_fenced_buffer_default_copy): Fix for rename of buffer private + structure members. + * gst/effectv/gstwarp.c: (gst_warptv_setup): Don't reset the time + value during a resize/renegotiation. + * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): use + gst_pad_alloc_buffer(); + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), + (gst_v4lmjpegsrc_buffer_free): Fix for rename of buffer private + structure members. + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): + Fix for rename of buffer private structure members. + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): + Fix for rename of buffer private structure members. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): + Fix for rename of buffer private structure members. + +2004-01-11 Arwed v. Merkatz + + reviewed by: David Schleef + + * gst/videofilter/Makefile.am: + * gst/videofilter/gstgamma.c: Gamma correction filter. Modified + from the patch by ds to fit in with recent make_filter changes. + +2004-01-11 Julien MOUTTE + + * configure.ac: Adding examples/switch/Makefile + * examples/Makefile.am: Adding examples/switch + * examples/switch/Makefile.am: Adding switcher example. + * examples/switch/switcher.c: (got_eos), (idle_iterate), + (switch_timer), (main): Adding an example demonstrating switch usage + with 2 videotestsrc showing different patterns. + * gst/switch/gstswitch.c: (gst_switch_request_new_pad), + (gst_switch_init): Fixing switch with the new caps system. + +2004-01-11 Benjamin Otte + + * gst-libs/gst/video/video.h: + Fix 32bit caps. Issue remaining: The macro names are chosen poorly. + They should probably be like + GST_VIDEO_PAD_TEMPLATE_CAPS_{RGB,BGR,RGBx,BGRx}. + +2004-01-11 Benjamin Otte + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (qtdemux_parse_trak): + fix audio chunk size/timestamp calculation + +2004-01-11 Benjamin Otte + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): + fix SVQ3 caps + +2004-01-11 Steve Baker + + * gst/effectv/gstaging.c: (gst_agingtv_get_type), + (gst_agingtv_base_init), (gst_agingtv_class_init), + (gst_agingtv_init), (gst_agingtv_setup), (gst_agingtv_rgb32), + (gst_agingtv_set_property), (gst_agingtv_get_property): + Port agingTV to videofilter + +2004-01-09 Julien MOUTTE + + * ext/hermes/gstcolorspace.c: (gst_colorspace_chain): + Implementing gst_pad_alloc_buffer to use optimized buffer allocation. + +2004-01-09 Julien MOUTTE + + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): + Implementing gst_pad_alloc_buffer to use optimized buffer allocation. + * gst-libs/gst/xoverlay/xoverlay.c: + (gst_x_overlay_got_desired_size): Updating doc for the xid being 0. + * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): + Implementing gst_pad_alloc_buffer to use optimized buffer allocation. + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + Implementing gst_pad_alloc_buffer to use optimized buffer allocation. + * sys/ximage/ximagesink.c: (gst_ximagesink_chain), + (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): Implementing + the bufferalloc_function to replace bufferpools, fixing the XOverlay + interface implementation to handle xid being 0 and fix some bugs + triggered by Benjamin's testcase. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc), + (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): Implementing + the bufferalloc_function to replace bufferpools, fixing the XOverlay + interface implementation to handle xid being 0 and fix some bugs + triggered by Benjamin's testcase. + +2004-01-09 David Schleef + + * ext/librfb/gstrfbsrc.c: Hacking. Added actual decoding and + mouse pointer events. It works. + +2004-01-09 Ronald Bultje + + * ext/divx/gstdivxenc.c: (gst_divxenc_init): + Use explicit caps - fix capsnego. + * ext/xvid/gstxviddec.c: + * ext/xvid/gstxvidenc.c: + Remove macro-inside-macro which caused compile errors. + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_header): + Error out if it's not a RIFF file. Else we error out without + gst_element_error() which is not good... + +2004-01-08 David Schleef + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): + Fix pad_link function to handle formats that ffmpeg returns + as multiple caps structures. + * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): + Only complain if source buffer is _smaller_ than expected. + * gst/videoscale/gstvideoscale.c: (gst_videoscale_init), + (gst_videoscale_handle_src_event): Resize navigation events + when passing them upstream. + * gst/videotestsrc/gstvideotestsrc.c: + * gst/videotestsrc/gstvideotestsrc.h: + * gst/videotestsrc/videotestsrc.c: + * gst/videotestsrc/videotestsrc.h: + Rewrite many of the buffer painting functions to handle odd + sizes (for many formats, size%4!=0 or size%8!=0). Most have + been verified to work with my video card. + * testsuite/gst-lint: Add check for elements calling + gst_pad_get_caps() instead of gst_pad_get_allowed_caps(). + +2004-01-08 David Schleef + + * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), + (gst_videodrop_link), (gst_videodrop_init): Fix negotiation. + +2004-01-08 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents): A + configure event is not emiting the desired size signal. That fixes + aspect ratio issues with gst-player. + +2004-01-08 Ronald Bultje + + * gst/median/gstmedian.c: (gst_median_link), (gst_median_init): + Fix capsnego. + +2004-01-08 Julien MOUTTE + + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_create): Using XOverlay + public method to fire size signal. + +2004-01-07 Julien MOUTTE + + * examples/gstplay/Makefile.am: Adding the interface library. + * gst-libs/gst/play/Makefile.am: Adding the interface library. + * gst-libs/gst/play/gstplay.c: (gst_play_set_video_sink): Connecting to the XOverlay size signal instead of GstVideoSink. + * gst-libs/gst/play/gstplay.h: Including the XOverlay interface to check + GST_IS_X_OVERLAY before signal connect. + * gst-libs/gst/video/gstvideosink.c: (gst_videosink_class_init): + Removing the have_video_size signal. + * gst-libs/gst/video/gstvideosink.h: Removing the have_video_size signal + and associated public method. + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), + (gst_ximagesink_sinkconnect): Using XOverlay public method to fire size + signal. + * sys/xvideo/xvideosink.c: (gst_xvideosink_sinkconnect), + (gst_xvideosink_xwindow_new): Using XOverlay public method to fire size + signal. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sinkconnect): + Using XOverlay public method to fire size signal. + +2004-01-07 David Schleef + + * gst/videofilter/Makefile.am: + * gst/videofilter/gstvideotemplate.c: + * gst/videofilter/make_filter: + Create gstvideoexample.c in a srcdir!=builddir friendly way. + Convert make_filter to /bin/sh script. + +2004-01-07 Thomas Vander Stichele + + * gst/modplug/gstmodplug.cc: fix element description + +2004-01-07 Julien MOUTTE + + * examples/gstplay/player.c: (got_time_tick), (got_stream_length), + (got_video_size): Adding some new lines in g_print calls. + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), + (gst_ximagesink_xwindow_destroy), (gst_ximagesink_xwindow_resize), + (gst_ximagesink_handle_xevents), (gst_ximagesink_fixate), + (gst_ximagesink_sinkconnect), (gst_ximagesink_change_state), + (gst_ximagesink_chain), (gst_ximagesink_buffer_new), + (gst_ximagesink_set_xwindow_id), (gst_ximagesink_get_desired_size): + Complete code review, reverting some stuff i disagree with, adding + some fixes : time synchronization on invalid timestamps, renegotiation + of private window. + * sys/ximage/ximagesink.h: + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_destroy), + (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_handle_xevents), + (gst_xvimagesink_get_xv_support), (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_fixate), (gst_xvimagesink_sinkconnect), + (gst_xvimagesink_change_state), (gst_xvimagesink_chain), + (gst_xvimagesink_buffer_new), + (gst_xvimagesink_navigation_send_event), + (gst_xvimagesink_set_xwindow_id), + (gst_xvimagesink_get_desired_size), + (gst_xvimagesink_xoverlay_init): Complete code review, reverting some + stuff i disagree with, adding some fixes : Renegotiation of private + window, implementing get_desired_size. + +2004-01-07 Ronald Bultje + + * ext/audiofile/gstafsink.c: (gst_afsink_init), (gst_afsink_chain), + (gst_afsink_handle_event): + * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init): + * gst/avi/gstavimux.c: (gst_avimux_request_new_pad): + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_init): + Fix for instantiate-test (see core). Also remove dead code from + jpegenc (which still needs fixing, but that's lower on my TODO + list...). + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): + Never return NULL as caps. + +2004-01-07 David Schleef + + * configure.ac: + * ext/Makefile.am: + * ext/librfb/Makefile.am: + * ext/librfb/gstrfbsrc.c: + New source plugin based on librfb-0.1. RFB (remote framebuffer) + is the protocol used by VNC. + +2004-01-07 David Schleef + + * gst/videofilter/gstvideotemplate.c: + * gst/videofilter/gstvideotemplate.h: + * gst/videofilter/make_filter: + Merge videotemplate header into source file. + * gst/effectv/Makefile.am: + * gst/effectv/gsteffectv.c: (plugin_init): + * gst/effectv/gstwarp.c: + Make warpTV a subclass of videofilter. + +2004-01-07 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): + Add guard against invalid utf-8 conversions in mad. Just in case. + +2004-01-07 Benjamin Otte + + * sys/oss/gstosssink.c: (gst_osssink_sink_fixate): + Fix for bug shown by poisoning + +2004-01-06 Ronald Bultje + + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), + (gst_v4lmjpegsrc_buffer_free): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps), + (gst_v4lsrc_srcconnect), (gst_v4lsrc_getcaps), (gst_v4lsrc_get), + (gst_v4lsrc_buffer_free): + Fix for removed bufferpools. + +2004-01-07 Jan Schmidt + + * ext/dv/gstdvdec.c: (gst_dvdec_loop): + Fix caps negotiation. + + * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init), + (dvdnavsrc_update_buttoninfo), (dvdnavsrc_get), + (dvdnavsrc_get_event_mask), (dvdnav_handle_navigation_event), + (dvdnavsrc_event): + * ext/mpeg2dec/gstmpeg2dec.c: + * gst-libs/gst/navigation/navigation.c: + (gst_navigation_send_key_event), (gst_navigation_send_mouse_event): + * gst-libs/gst/navigation/navigation.h: + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_handle_src_event): + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): + Super-simple first version of mouse and keyboard events. Clicking + on a DVD menu now works, although it may not take you where you + expected. + + * gst/sine/gstsinesrc.c: (gst_sinesrc_src_fixate): + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_src_fixate): + These fixate functions were broken - they never actually + fixated :) + +2004-01-06 Ronald Bultje + + * ext/shout/gstshout.c: (gst_icecastsend_base_init), + (gst_icecastsend_init): + fix for new caps system. + * gst-libs/gst/mixer/mixertrack.h: + * sys/oss/gstossmixer.c: (gst_ossmixer_build_list): + Add 'master track' flag (for tools like ACME that only want to + change the main volume). + +2004-01-07 Jan Schmidt + + * ext/xvid/gstxvid.c: (gst_xvid_structure_to_csp), + (gst_xvid_csp_to_caps): + * ext/xvid/gstxviddec.c: (gst_xviddec_src_getcaps): + * ext/xvid/gstxvidenc.c: + ifdef out ARGB type when it isn't available + in xvidcore 1.0.0beta2 + +2004-01-06 Ronald Bultje + + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): + When we have received a new SCR right in the first buffer after + a seek (so in the same cycle that handles the discont), we should + handle the buffer instead of unreffing it, else we lose data. + +2004-01-06 Iain + + * gst/intfloat/gstint2float.c (gst_int2float_link): Set the + buffer-frames caps too. + + * gst/oneton/gstoneton.c (gst_oneton_sink_connect): Only create the new + caps that we need, don't destroy them all and rebuild them. And when + creating src pads, use the src pad template rather than the sink... + +2004-01-05 Ronald Bultje + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): + Add pad to element *after* setting functions such as event handler. + Without this, the scheduler (opt) will link pads, set the event + handler from the default event function (dispatcher in gstpad.c) + and *after* that, we will set our own event function, which will + thus never be used (and thus mpegdemux doesn't handle events). + +2004-01-04 David Schleef + + Fix the fixate functions to handle new prototype: + * gst/sine/gstsinesrc.c: (gst_sinesrc_src_fixate): + * gst/videotestsrc/gstvideotestsrc.c: + (gst_videotestsrc_src_fixate): + * sys/oss/gstosssink.c: (gst_osssink_sink_fixate): + * sys/ximage/ximagesink.c: (gst_ximagesink_fixate): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_fixate): + +2004-01-04 Benjamin Otte + + * sys/ximage/ximagesink.h: + * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), + (gst_ximagesink_xwindow_destroy), (gst_ximagesink_sinkconnect), + (gst_ximagesink_change_state), (gst_ximagesink_set_xwindow_id), + (gst_ximagesink_xoverlay_init): + assorted fixes to make (re)embedding work + * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect), + (gst_ximagesink_get_desired_size): + implement desired size additions to XOverlay + +2004-01-04 Benjamin Otte + + * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_base_init), + (gst_x_overlay_got_xwindow_id), (gst_x_overlay_get_desired_size), + (gst_x_overlay_got_desired_size): + * gst-libs/gst/xoverlay/xoverlay.h: + Add optional "desired size" signal and querying. + +2004-01-04 Ronald Bultje + + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix EBML-laced block parsing. Diffs are relative to previous + lace, not the first lace. Thanks to Mosu from the Matroska + team for detecting this. + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_parse_fmt), (gst_wavparse_getcaps), + (gst_wavparse_handle_sink_event), (gst_wavparse_loop), + (gst_wavparse_change_state): + * gst/wavparse/gstwavparse.h: + Quickfix for capsnego. + +2004-01-04 Ronald Bultje + + * gst/wavenc/gstwavenc.c: (set_property), (gst_wavenc_init): + Fix indenting, fix pad creation. + +2004-01-04 Ronald Bultje + + * ext/xvid/gstxviddec.c: (gst_xviddec_init), + (gst_xviddec_src_getcaps), (gst_xviddec_src_link), + (gst_xviddec_sink_link): + Implement src_getcaps() so proper size caps is negotiated. + +2004-01-04 Ronald Bultje + + * ext/flac/gstflacdec.c: (gst_flacdec_loop): + Finish flac decoder on EOS. See #116178. + +2004-01-04 Ronald Bultje + + * gst/matroska/matroska-demux.c: (gst_matroska_demux_src_getcaps), + (gst_matroska_demux_add_stream): + * gst/matroska/matroska-ids.h: + Add getcaps() function to fix capsnego... + +2004-01-04 Ronald Bultje + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), + (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): + Fix more integer overflows. Again, see #126967. + +2004-01-03 Ronald Bultje + + * ext/mpeg2dec/gstmpeg2dec.c: + Add support for mpeg2dec-0.4.0 (released two weeks ago). See + #130416. + +2004-01-03 Ronald Bultje + + * configure.ac: + * ext/xvid/gstxvid.c: (gst_xvid_init), (gst_xvid_error), + (gst_xvid_structure_to_csp), (gst_xvid_csp_to_caps): + * ext/xvid/gstxvid.h: + * ext/xvid/gstxviddec.c: (gst_xviddec_class_init), + (gst_xviddec_init), (gst_xviddec_setup), (gst_xviddec_chain), + (gst_xviddec_src_link), (gst_xviddec_sink_link), + (gst_xviddec_change_state): + * ext/xvid/gstxviddec.h: + * ext/xvid/gstxvidenc.c: (gst_xvidenc_profile_get_type), + (gst_xvidenc_base_init), (gst_xvidenc_class_init), + (gst_xvidenc_init), (gst_xvidenc_setup), (gst_xvidenc_chain), + (gst_xvidenc_link), (gst_xvidenc_set_property), + (gst_xvidenc_get_property), (gst_xvidenc_change_state): + * ext/xvid/gstxvidenc.h: + Update xvid plugin to latest xvid (1.0.0-beta3) API. + +2004-01-03 Ronald Bultje + + * gst/rtp/rtp-packet.c: + Add sys/types.h include, since OS X doesn't define in_addr_t + in netinet/in.h, like it does on Linux (see #129600). + +2004-01-03 Thomas Canty + + reviewed by: Ronald Bultje + + * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_dispose): + Correct logic of dispose function (see #129306). + +2004-01-03 Ronald Bultje + + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_pes): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init), + (gst_mpeg_parse_init): + * gst/mpegstream/gstmpegparse.h: + Remove clock (which was never provided, i.e. dead code), and + also fix integer overflows at high PTS values (see #126967). + +2004-01-03 Ronald Bultje + + * ext/flac/gstflacdec.c: + * ext/libpng/gstpngenc.h: + * ext/mikmod/gstmikmod.h: + OS X fixes (see #126628). + +2004-01-02 David Schleef + + * ext/alsa/gstalsasrc.c: (gst_alsa_src_pad_factory), + (gst_alsa_src_base_init): Remove bogus "src" request pad. + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_base_init), + (gst_mpeg_parse_class_init): Move pad template registration + to class_init, since the derived class (mpegdemux) doesn't + want them. + +2004-01-03 Ronald Bultje + + * sys/ximage/Makefile.am: + * sys/xvideo/Makefile.am: + * sys/xvimage/Makefile.am: + Move interface libs from LDFLAGS to LIBADD, fix relocation errors + after installation (see #127664). + +2004-01-02 David Schleef + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_init), + (gst_ffmpegenc_connect): Negotiation fixes. + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_negotiate_format): + Remove inappropriate gst_caps_free(). + * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): + Reenable Ronald's internal resize code, since the core handles + it correctly now. + +2004-01-02 Ronald Bultje + + * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_init): + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init), (gst_v4lsrc_init): + Fix pad template stuff. + +2004-01-02 Ronald Bultje + + * gst/matroska/ebml-read.c: (gst_ebml_read_sint): + * gst/matroska/ebml-write.c: (gst_ebml_write_sint): + fix signed integer reading/writing. + +2004-01-02 Benjamin Otte + + * ext/alsa/README: + Remove outdated document + +2004-01-03 Jan Schmidt + + * gst/cutter/gstcutter.c: (gst_cutter_init): + src pad was being created twice - oops. + +2004-01-02 Ronald Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): + Comment out internal resize. It doesn't handle the resulting + XEvent internally, does another try_set_caps() which leads to + a really nice loop. + Real fix will come when Julien and Dave are awake. ;). + +2004-01-02 Ronald Bultje + + * ext/mpeg2enc/gstmpeg2enc.cc: + fix const/nonconst compile issue. + +2004-01-02 David Schleef + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_fixate), + (gst_xvimagesink_sinkconnect), (gst_xvimagesink_init): + Add fixate function and a check for bad formats. + +2004-01-01 David Schleef + + Negotiation fixes: + * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link), + (gst_audiofilter_init): + * gst/debug/efence.c: (gst_efence_init): + * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_link), + (gst_deinterlace_init): + * gst/volume/gstvolume.c: (volume_connect): + +2004-01-01 David Schleef + + Convert elements to use gst_pad_use_explicit_caps() where + appropriate: + * ext/a52dec/gsta52dec.c: (gst_a52dec_init), (gst_a52dec_reneg): + * ext/audiofile/gstafparse.c: (gst_afparse_init), + (gst_afparse_open_file): + * ext/audiofile/gstafsrc.c: (gst_afsrc_init), + (gst_afsrc_open_file): + * ext/esd/esdmon.c: (gst_esdmon_init), (gst_esdmon_get): + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_init), + (gst_ffmpegdec_chain): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + * ext/flac/gstflacdec.c: (gst_flacdec_init), (gst_flacdec_write): + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_init), + (gst_gdk_pixbuf_chain): + * ext/jpeg/gstjpegdec.c: (gst_jpegdec_init), (gst_jpegdec_link), + (gst_jpegdec_chain): + * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): + * ext/mikmod/gstmikmod.c: (gst_mikmod_init), + (gst_mikmod_negotiate): + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), + (gst_mpeg2dec_negotiate_format): + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): + * ext/speex/gstspeexdec.c: (gst_speexdec_init), + (gst_speexdec_sinkconnect): + * ext/swfdec/gstswfdec.c: (gst_swfdec_loop), (gst_swfdec_init): + * ext/vorbis/vorbisfile.c: (gst_vorbisfile_init), + (gst_vorbisfile_new_link): + * gst/ac3parse/gstac3parse.c: (gst_ac3parse_init), + (gst_ac3parse_chain): + * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_audio_stream), + (gst_asf_demux_setup_pad): + * gst/auparse/gstauparse.c: (gst_auparse_init), + (gst_auparse_chain): + * gst/id3/gstid3types.c: (gst_id3types_loop): + * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): + * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), + (mp1videoparse_parse_seq): + * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_init), + (bpf_from_header): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), + (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_lpcm_set_caps): + * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), + (gst_mpeg_parse_send_data): + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream): + * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): + * gst/wavparse/gstwavparse.c: (gst_wavparse_init), + (gst_wavparse_parse_fmt): + +2004-01-01 Ronald Bultje + + * configure.ac: + Fix configure check for mpeg2enc. We need 1.6.1.93 instead of + 1.6.1.92, since the pkg-config file of 1.6.1.92 is borked and + it therefore uses the wrong include paths. Too bad... Note + that 1.6.1.93 is not release yet. ;). + Also add a check for mplex, which is now using the lib'ified + mplex from mjpegtools, too. + * ext/ffmpeg/gstffmpegcodecmap.c: + Add codec_tag for 3ivx/xvid. For xvid, this should fix playback + issues. I don't think ffmpeg handles 3ivx correctly, so this + probably won't work. But it won't hurt either. + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_connect), + (gst_ffmpegdec_chain): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect), + (gst_ffmpegenc_chain_audio): + Fix memleak in audio encoding. Close codec if open fails, this + calls the cleanup routines so we can re-use the context. + * ext/mpeg2enc/gstmpeg2enc.cc: + Fix pad template names/types, fix memory issue with getcaps(). + * ext/mpeg2enc/gstmpeg2encoder.cc: + * ext/mpeg2enc/gstmpeg2encoder.hh: + Fix compile issue with new caps system (const thingy). + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + * ext/mpeg2enc/gstmpeg2encpicturereader.hh: + We read a first frame right on initing, so that we have a caps + when we init the output. This caps is cached in padprivate and + read as first frame. + * ext/mplex/Makefile.am: + * ext/mplex/gstmplex.cc: + * ext/mplex/gstmplex.h: + * ext/mplex/gstmplex.hh: + * ext/mplex/gstmplexibitstream.cc: + * ext/mplex/gstmplexibitstream.hh: + * ext/mplex/gstmplexjob.cc: + * ext/mplex/gstmplexjob.hh: + * ext/mplex/gstmplexoutputstream.cc: + * ext/mplex/gstmplexoutputstream.hh: + We wrap mjpegtools mplex. So I rewrote the plugin. The old plugin + had issues, didn't do capsnego, supported only a subset of the + mplex features and required a mplex fork in our local CVS. Plus + that it worked agaist a very old mplex version. Rewriting was + faster than updating it. + * gst-libs/ext/Makefile.am: + * gst-libs/ext/mplex/INSTRUCT: + * gst-libs/ext/mplex/Makefile.am: + * gst-libs/ext/mplex/README: + * gst-libs/ext/mplex/TODO: + * gst-libs/ext/mplex/ac3strm_in.cc: + * gst-libs/ext/mplex/audiostrm.hh: + * gst-libs/ext/mplex/audiostrm_out.cc: + * gst-libs/ext/mplex/aunit.hh: + * gst-libs/ext/mplex/bits.cc: + * gst-libs/ext/mplex/bits.hh: + * gst-libs/ext/mplex/buffer.cc: + * gst-libs/ext/mplex/buffer.hh: + * gst-libs/ext/mplex/fastintfns.h: + * gst-libs/ext/mplex/format_codes.h: + * gst-libs/ext/mplex/inputstrm.cc: + * gst-libs/ext/mplex/inputstrm.hh: + * gst-libs/ext/mplex/lpcmstrm_in.cc: + * gst-libs/ext/mplex/mjpeg_logging.cc: + * gst-libs/ext/mplex/mjpeg_logging.h: + * gst-libs/ext/mplex/mjpeg_types.h: + * gst-libs/ext/mplex/mpastrm_in.cc: + * gst-libs/ext/mplex/mpegconsts.cc: + * gst-libs/ext/mplex/mpegconsts.h: + * gst-libs/ext/mplex/mplexconsts.hh: + * gst-libs/ext/mplex/multplex.cc: + * gst-libs/ext/mplex/outputstream.hh: + * gst-libs/ext/mplex/padstrm.cc: + * gst-libs/ext/mplex/padstrm.hh: + * gst-libs/ext/mplex/stillsstream.cc: + * gst-libs/ext/mplex/stillsstream.hh: + * gst-libs/ext/mplex/systems.cc: + * gst-libs/ext/mplex/systems.hh: + * gst-libs/ext/mplex/vector.cc: + * gst-libs/ext/mplex/vector.hh: + * gst-libs/ext/mplex/videostrm.hh: + * gst-libs/ext/mplex/videostrm_in.cc: + * gst-libs/ext/mplex/videostrm_out.cc: + * gst-libs/ext/mplex/yuv4mpeg.cc: + * gst-libs/ext/mplex/yuv4mpeg.h: + * gst-libs/ext/mplex/yuv4mpeg_intern.h: + * gst-libs/ext/mplex/yuv4mpeg_ratio.cc: + We don't fork mjpegtools' mplex in our CVS anymore. + * gst/avi/gstavidemux.c: (gst_avi_demux_src_getcaps), + (gst_avi_demux_add_stream): + * gst/avi/gstavidemux.h: + Add getcaps() function for proper caps nego. This makes some + parts of AVI playback/reading work. + * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): + Resize window on new capsnego. This is probably wrong, but + I'm still committing it because with current capsnego, the + first successfull capsnego is auto-fixated, therefore rounded + down to the lowest values in the caps. this results in a 16x16 + XWindow that is not reized when real capsnego finishes. + Dave, I see more cases of this, do you know a proper solution? + * tools/gst-launch-ext.in: + Fix MPEG-4 AAC (Apple iPod/iTunes) file commandline. + +2003-12-31 David Schleef + + * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get): + * gst/udp/gstudpsrc.c: (gst_udpsrc_get): + Change gst_pad_proxy_link() to gst_pad_try_set_caps() + +2003-12-30 David Schleef + + * ext/ffmpeg/gstffmpegcolorspace.c: + (gst_ffmpegcsp_caps_remove_format_info), (gst_ffmpegcsp_getcaps), + (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_init), + (gst_ffmpegcsp_chain): Negotiation fixes + * ext/mad/gstmad.c: (gst_mad_chain): Negotiation fixes + * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain), + (gst_audio_convert_link), (gst_audio_convert_channels): + * gst/audioscale/gstaudioscale.c: (gst_audioscale_getcaps), + (gst_audioscale_link), (gst_audioscale_get_buffer), + (gst_audioscale_chain): Negotiation fixes + * gst/audioscale/gstaudioscale.h: + * gst/videofilter/gstvideofilter.c: + (gst_videofilter_format_get_structure), (gst_videofilter_getcaps), + (gst_videofilter_link), (gst_videofilter_init), + (gst_videofilter_set_output_size), (gst_videofilter_setup), + (gst_videofilter_find_format_by_structure): + * gst/videofilter/gstvideofilter.h: Negotiation fixes + * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps), + (gst_videoscale_link): + * gst/videoscale/videoscale.c: (videoscale_get_structure), + (videoscale_find_by_structure), (gst_videoscale_setup): + * gst/videoscale/videoscale.h: Negotiation fixes + * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), + (gst_ximagesink_fixate), (gst_ximagesink_init): Add a fixate + function, restrict resizing to a multiple of 4 (hack until + everyone supports odd sizes correctly). + +2003-12-29 Colin Walters + + * ext/esd/esdsink.c (gst_esdsink_link): Fix typo; get depth instead of + signed. + +2003-12-30 Jan Schmidt + + * ext/sndfile/gstsf.c: (gst_sf_loop): + Fix warning about discarding const qualifier + +2003-12-27 Jeremy Simon + + * gst/cutter/gstcutter.c: + * gst/videoscale/gstvideoscale.c: + * gst/volenv/gstvolenv.c: + * gst-libs/gst/audio/audio.c: + * gst-libs/gst/video/video.c: + Fix warnings + +2003-12-27 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_open_audio): + Don't send ALSA debugging to stderr. + * ext/alsa/gstalsa.h: + Use GST_WARNING instead of g_warning when ALSA functions fail. + +2003-12-27 Benjamin Otte + + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): + Free XVAdapterInfo correctly. + +2003-12-27 Benjamin Otte + + * ext/mad/gstid3tag.c: (gst_id3_tag_add_src_pad), + (gst_id3_tag_do_caps_nego), (gst_id3_tag_src_link): + Make id3tag use correct caps nego. + +2003-12-27 Amaury Jacquot + + * ext/ivorbis/vorbis.c: + * ext/ivorbis/vorbisenc.h: + * ext/ivorbis/vorbisfile.c: + Modify so that it uses the new caps things + +2003-12-27 Benjamin Otte + + * testsuite/spider/spider1.c: (main): + * testsuite/spider/spider2.c: (main): + * testsuite/spider/spider3.c: (main): + Make tests compile again. They probably don't work. + +2003-12-24 Colin Walters + + * sys/oss/gstosssink.c (gst_osssink_sink_fixate): Return NULL if + we can't fixate the caps anymore. + +2003-12-23 David Schleef + + * gst/volume/gstvolume.c: (volume_init): Proxy getcaps. + * sys/oss/gstosssink.c: (gst_osssink_init), + (gst_osssink_sink_fixate): Add fixate function. + +2003-12-24 Ronald Bultje + + * ext/ffmpeg/gstffmpegcodecmap.c: + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_getcaps), + (gst_ffmpegcsp_srcconnect_func), (gst_ffmpegcsp_sinkconnect), + (gst_ffmpegcsp_srcconnect), (gst_ffmpegcsp_get_type), + (gst_ffmpegcsp_base_init), (gst_ffmpegcsp_class_init), + (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), + (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_set_property), + (gst_ffmpegcsp_get_property), (gst_ffmpegcsp_register): + fix typo in RGB masks, and move back to "old" colorspace + capsnego code until whoever wrote this new crap has actually + tested it so that it works. + And yes, this works, keep it that way please. + +2003-12-23 Ronald Bultje + + * ext/divx/gstdivxdec.c: (gst_divxdec_base_init), + (gst_divxdec_init), (gst_divxdec_negotiate): + * ext/divx/gstdivxdec.h: + * ext/divx/gstdivxenc.c: (gst_divxenc_base_init), + (gst_divxenc_init): + * ext/faac/gstfaac.c: (gst_faac_base_init), (gst_faac_init), + (gst_faac_sinkconnect), (gst_faac_srcconnect): + * ext/mpeg2enc/gstmpeg2enc.cc: + * ext/mpeg2enc/gstmpeg2encoder.cc: + * ext/mpeg2enc/gstmpeg2encpicturereader.cc: + * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_base_init), + (dxr3audiosink_init), (dxr3audiosink_pcm_sinklink): + * sys/dxr3/dxr3spusink.c: (dxr3spusink_base_init), + (dxr3spusink_init): + * sys/dxr3/dxr3videosink.c: (dxr3videosink_base_init), + (dxr3videosink_init): + Fix caps breakage after Dave's caps branch merge. + +2003-12-23 Ronald Bultje + + * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): + Fix for 24bpp display. + +2003-12-23 Colin Walters + + * ext/gnomevfs/gstgnomevfssink.c: Add ARG_HANDLE property that takes + a GnomeVFSHandle directly. + +2003-12-22 Benjamin Otte + + * gst/volume/Makefile.am: + * gst/volume/gstvolume.c: (volume_connect), (volume_parse_caps), + (volume_base_init), (volume_init): + Reenable volume element and fix to work with new caps stuff. + Rhythmbox needs this. + +2003-12-22 Benjamin Otte + + * gst/qtdemux/qtdemux.c: (plugin_init): + qtdemux requires bytestream + +2003-12-22 Benjamin Otte + + * ext/alsa/gstalsa.c: (gst_alsa_get_caps), (gst_alsa_link): + Fix remaining caps handling errors due to CAPS merge. + +2003-12-22 Benjamin Otte + + * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_init), + (gst_faad_sinkconnect), (gst_faad_srcgetcaps), + (gst_faad_srcconnect): + Port to new caps system. + +2003-12-21 Julien MOUTTE + + * examples/gstplay/player.c: (got_time_tick), (got_stream_length), + (got_video_size), (main): using g_print instead of g_message. + * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup): Fixing EOS + signal which was not emitted because of "switch" element added to the + bin but not connected. (Removing from the bin temporarily) + +2003-12-21 Julien MOUTTE + + * configure.ac: X_DISPLAY_MISSING is set to 1 if AC_PATH_XTRA fails to + find X development files. I don't understand the previous tests and + they fail on my debian/ppc unstable. This one works. + * examples/gstplay/player.c: (main): Set the pipeline to READY before + exiting. + * gst-libs/gst/play/gstplay.c: (gst_play_get_length_callback), + (gst_play_set_video_sink), (gst_play_set_audio_sink), + (gst_play_set_visualization): Add some safety checks in set_ methods + and state_change. This was throwing some ugly CRITICAL messages when + pipeline was getting disposed and casts were failing. + +2003-12-21 Ronald Bultje + + * configure.ac: + Improve mpeg2enc detection. This is for distributions that do + ship mjpegtools, but without mpeg2enc. Also does object check + for might there ever be ABI incompatibility. + * ext/mpeg2enc/gstmpeg2enc.cc: + Add Andrew as second maintainer (he's helping me), and also add + an error if no caps was set. This happens if I pull before capsnego + and that's something I should solve sometime else. + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix time parsing. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link), + (gst_matroska_mux_track_header): + Add caps to templates. + * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_sink_factory): + Add mpegversion=1 to prevent confusion with MPEG/AAC. + * gst/mpegstream/gstmpegdemux.c: + Remove layer since it causes warnings about unfixed caps. + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + Fix obvious typo (we error out if caps were set, we should of + course error out if *no* caps were set). + * sys/oss/gstosselement.c: (gst_osselement_convert): + Fix format conversion, we confused bits/bytes. + * sys/oss/gstosselement.h: + Improve documentation for 'bps'. + * sys/v4l/TODO: + Remove stuff about plugins that need removing - this was done + ages ago. + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init), + (gst_v4lmjpegsrc_src_convert), (gst_v4lmjpegsrc_src_query): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_src_convert), + (gst_v4lsrc_src_query): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), + (gst_v4l2src_src_convert), (gst_v4l2src_src_query): + Add get_query_types(), get_formats() and query() functions. + +2003-12-21 Thomas Vander Stichele + + * ChangeLog: moved to gstreamer/docs/random/old/ChangeLog.gst-plugins + * moved CVS to freedesktop.org + diff --git a/docs/version.entities.in b/docs/version.entities.in new file mode 100644 index 0000000..79a6898 --- /dev/null +++ b/docs/version.entities.in @@ -0,0 +1,2 @@ + + diff --git a/ext/Makefile.am b/ext/Makefile.am new file mode 100644 index 0000000..409408e --- /dev/null +++ b/ext/Makefile.am @@ -0,0 +1,180 @@ +if USE_AALIB +AALIB_DIR = aalib +else +AALIB_DIR = +endif + +if USE_ANNODEX +ANNODEX_DIR = annodex +else +ANNODEX_DIR = +endif + +if USE_CAIRO +CAIRO_DIR = cairo +else +CAIRO_DIR = +endif + +if USE_ESD +ESD_DIR = esd +else +ESD_DIR = +endif + +if USE_FLAC +FLAC_DIR = flac +else +FLAC_DIR = +endif + +if USE_GCONF +GCONF_DIR = gconf +else +GCONF_DIR = +endif + +if USE_GDK_PIXBUF +GDK_PIXBUF_DIR = gdk_pixbuf +else +GDK_PIXBUF_DIR = +endif + +if USE_HAL +HAL_DIR = hal +else +HAL_DIR = +endif + +if USE_JACK +JACK_DIR=jack +else +JACK_DIR= +endif + +if USE_JPEG +JPEG_DIR = jpeg +else +JPEG_DIR = +endif + +if USE_LIBCACA +LIBCACA_DIR = libcaca +else +LIBCACA_DIR = +endif + +if USE_LIBDV +LIBDV_DIR = dv +else +LIBDV_DIR = +endif + +# if USE_LIBMNG +# LIBMNG_DIR = libmng +# else +LIBMNG_DIR = +# endif + +if USE_LIBPNG +LIBPNG_DIR = libpng +else +LIBPNG_DIR = +endif + +# if USE_MIKMOD +# MIKMOD_DIR = mikmod +# else +MIKMOD_DIR = +# endif + +if USE_DV1394 +DV1394_DIR = raw1394 +else +DV1394_DIR = +endif + +if USE_PULSE +PULSE_DIR = pulse +else +PULSE_DIR = +endif + + +if USE_SHOUT2 +SHOUT2_DIR = shout2 +else +SHOUT2_DIR = +endif + +if USE_SOUP +SOUP_DIR=soup +else +SOUP_DIR= +endif + +if USE_SPEEX +SPEEX_DIR = speex +else +SPEEX_DIR = +endif + +if USE_TAGLIB +TAGLIB_DIR = taglib +else +TAGLIB_DIR = +endif + +if USE_WAVPACK +WAVPACK_DIR=wavpack +else +WAVPACK_DIR= +endif + +SUBDIRS = \ + $(AALIB_DIR) \ + $(ANNODEX_DIR) \ + $(CAIRO_DIR) \ + $(DV1394_DIR) \ + $(ESD_DIR) \ + $(FLAC_DIR) \ + $(GCONF_DIR) \ + $(GDK_PIXBUF_DIR) \ + $(HAL_DIR) \ + $(JACK_DIR) \ + $(JPEG_DIR) \ + $(LIBCACA_DIR) \ + $(LIBDV_DIR) \ + $(LIBMNG_DIR) \ + $(LIBPNG_DIR) \ + $(MIKMOD_DIR) \ + $(PULSE_DIR) \ + $(SHOUT2_DIR) \ + $(SOUP_DIR) \ + $(SPEEX_DIR) \ + $(TAGLIB_DIR) \ + $(WAVPACK_DIR) + +DIST_SUBDIRS = \ + aalib \ + annodex \ + cairo \ + dv \ + esd \ + flac \ + gconf \ + gdk_pixbuf \ + hal \ + jack \ + jpeg \ + libcaca \ + libpng \ + pulse \ + raw1394 \ + shout2 \ + soup \ + speex \ + taglib \ + wavpack + +include $(top_srcdir)/common/parallel-subdirs.mak diff --git a/ext/Makefile.in b/ext/Makefile.in new file mode 100644 index 0000000..ab5eeca --- /dev/null +++ b/ext/Makefile.in @@ -0,0 +1,919 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# include this at the end of $MODULE/ext/Makefile.am to force make to +# build subdirectories in parallel when make -jN is used. We will end up +# descending into all subdirectories a second time, but only after the first +# (parallel) run has finished, so it should go right through the second time. +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/common/parallel-subdirs.mak +subdir = ext +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@USE_AALIB_FALSE@AALIB_DIR = +@USE_AALIB_TRUE@AALIB_DIR = aalib +@USE_ANNODEX_FALSE@ANNODEX_DIR = +@USE_ANNODEX_TRUE@ANNODEX_DIR = annodex +@USE_CAIRO_FALSE@CAIRO_DIR = +@USE_CAIRO_TRUE@CAIRO_DIR = cairo +@USE_ESD_FALSE@ESD_DIR = +@USE_ESD_TRUE@ESD_DIR = esd +@USE_FLAC_FALSE@FLAC_DIR = +@USE_FLAC_TRUE@FLAC_DIR = flac +@USE_GCONF_FALSE@GCONF_DIR = +@USE_GCONF_TRUE@GCONF_DIR = gconf +@USE_GDK_PIXBUF_FALSE@GDK_PIXBUF_DIR = +@USE_GDK_PIXBUF_TRUE@GDK_PIXBUF_DIR = gdk_pixbuf +@USE_HAL_FALSE@HAL_DIR = +@USE_HAL_TRUE@HAL_DIR = hal +@USE_JACK_FALSE@JACK_DIR = +@USE_JACK_TRUE@JACK_DIR = jack +@USE_JPEG_FALSE@JPEG_DIR = +@USE_JPEG_TRUE@JPEG_DIR = jpeg +@USE_LIBCACA_FALSE@LIBCACA_DIR = +@USE_LIBCACA_TRUE@LIBCACA_DIR = libcaca +@USE_LIBDV_FALSE@LIBDV_DIR = +@USE_LIBDV_TRUE@LIBDV_DIR = dv + +# if USE_LIBMNG +# LIBMNG_DIR = libmng +# else +LIBMNG_DIR = +@USE_LIBPNG_FALSE@LIBPNG_DIR = +# endif +@USE_LIBPNG_TRUE@LIBPNG_DIR = libpng + +# if USE_MIKMOD +# MIKMOD_DIR = mikmod +# else +MIKMOD_DIR = +@USE_DV1394_FALSE@DV1394_DIR = +# endif +@USE_DV1394_TRUE@DV1394_DIR = raw1394 +@USE_PULSE_FALSE@PULSE_DIR = +@USE_PULSE_TRUE@PULSE_DIR = pulse +@USE_SHOUT2_FALSE@SHOUT2_DIR = +@USE_SHOUT2_TRUE@SHOUT2_DIR = shout2 +@USE_SOUP_FALSE@SOUP_DIR = +@USE_SOUP_TRUE@SOUP_DIR = soup +@USE_SPEEX_FALSE@SPEEX_DIR = +@USE_SPEEX_TRUE@SPEEX_DIR = speex +@USE_TAGLIB_FALSE@TAGLIB_DIR = +@USE_TAGLIB_TRUE@TAGLIB_DIR = taglib +@USE_WAVPACK_FALSE@WAVPACK_DIR = +@USE_WAVPACK_TRUE@WAVPACK_DIR = wavpack +SUBDIRS = \ + $(AALIB_DIR) \ + $(ANNODEX_DIR) \ + $(CAIRO_DIR) \ + $(DV1394_DIR) \ + $(ESD_DIR) \ + $(FLAC_DIR) \ + $(GCONF_DIR) \ + $(GDK_PIXBUF_DIR) \ + $(HAL_DIR) \ + $(JACK_DIR) \ + $(JPEG_DIR) \ + $(LIBCACA_DIR) \ + $(LIBDV_DIR) \ + $(LIBMNG_DIR) \ + $(LIBPNG_DIR) \ + $(MIKMOD_DIR) \ + $(PULSE_DIR) \ + $(SHOUT2_DIR) \ + $(SOUP_DIR) \ + $(SPEEX_DIR) \ + $(TAGLIB_DIR) \ + $(WAVPACK_DIR) + +DIST_SUBDIRS = \ + aalib \ + annodex \ + cairo \ + dv \ + esd \ + flac \ + gconf \ + gdk_pixbuf \ + hal \ + jack \ + jpeg \ + libcaca \ + libpng \ + pulse \ + raw1394 \ + shout2 \ + soup \ + speex \ + taglib \ + wavpack + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/parallel-subdirs.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/parallel-subdirs.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +.PHONY: independent-subdirs $(SUBDIRS) + +independent-subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@ + +all-recursive: independent-subdirs + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/aalib/Makefile.am b/ext/aalib/Makefile.am new file mode 100644 index 0000000..5820b24 --- /dev/null +++ b/ext/aalib/Makefile.am @@ -0,0 +1,9 @@ +plugin_LTLIBRARIES = libgstaasink.la + +libgstaasink_la_SOURCES = gstaasink.c +libgstaasink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AALIB_CFLAGS) +libgstaasink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(AALIB_LIBS) +libgstaasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstaasink_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstaasink.h diff --git a/ext/aalib/Makefile.in b/ext/aalib/Makefile.in new file mode 100644 index 0000000..2e9e138 --- /dev/null +++ b/ext/aalib/Makefile.in @@ -0,0 +1,805 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/aalib +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstaasink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstaasink_la_OBJECTS = libgstaasink_la-gstaasink.lo +libgstaasink_la_OBJECTS = $(am_libgstaasink_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstaasink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstaasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstaasink_la_CFLAGS) $(CFLAGS) \ + $(libgstaasink_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstaasink_la_SOURCES) +DIST_SOURCES = $(libgstaasink_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstaasink.la +libgstaasink_la_SOURCES = gstaasink.c +libgstaasink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AALIB_CFLAGS) +libgstaasink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(AALIB_LIBS) +libgstaasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstaasink_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstaasink.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/aalib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/aalib/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstaasink.la: $(libgstaasink_la_OBJECTS) $(libgstaasink_la_DEPENDENCIES) $(EXTRA_libgstaasink_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstaasink_la_LINK) -rpath $(plugindir) $(libgstaasink_la_OBJECTS) $(libgstaasink_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaasink_la-gstaasink.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstaasink_la-gstaasink.lo: gstaasink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaasink_la_CFLAGS) $(CFLAGS) -MT libgstaasink_la-gstaasink.lo -MD -MP -MF $(DEPDIR)/libgstaasink_la-gstaasink.Tpo -c -o libgstaasink_la-gstaasink.lo `test -f 'gstaasink.c' || echo '$(srcdir)/'`gstaasink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaasink_la-gstaasink.Tpo $(DEPDIR)/libgstaasink_la-gstaasink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstaasink.c' object='libgstaasink_la-gstaasink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaasink_la_CFLAGS) $(CFLAGS) -c -o libgstaasink_la-gstaasink.lo `test -f 'gstaasink.c' || echo '$(srcdir)/'`gstaasink.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/aalib/gstaasink.c b/ext/aalib/gstaasink.c new file mode 100644 index 0000000..2909dde --- /dev/null +++ b/ext/aalib/gstaasink.c @@ -0,0 +1,587 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-aasink + * @see_also: #GstCACASink + * + * Displays video as b/w ascii art. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=test.avi ! decodebin ! ffmpegcolorspace ! aasink + * ]| This pipeline renders a video to ascii art into a separate window. + * |[ + * gst-launch filesrc location=test.avi ! decodebin ! ffmpegcolorspace ! aasink driver=curses + * ]| This pipeline renders a video to ascii art into the current terminal. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstaasink.h" +#include + +/* aasink signals and args */ +enum +{ + SIGNAL_FRAME_DISPLAYED, + SIGNAL_HAVE_SIZE, + LAST_SIGNAL +}; + + +enum +{ + ARG_0, + ARG_WIDTH, + ARG_HEIGHT, + ARG_DRIVER, + ARG_DITHER, + ARG_BRIGHTNESS, + ARG_CONTRAST, + ARG_GAMMA, + ARG_INVERSION, + ARG_RANDOMVAL, + ARG_FRAMES_DISPLAYED, + ARG_FRAME_TIME +}; + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static void gst_aasink_base_init (gpointer g_class); +static void gst_aasink_class_init (GstAASinkClass * klass); +static void gst_aasink_init (GstAASink * aasink); + +static gboolean gst_aasink_setcaps (GstBaseSink * pad, GstCaps * caps); +static void gst_aasink_get_times (GstBaseSink * sink, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end); +static GstFlowReturn gst_aasink_render (GstBaseSink * basesink, + GstBuffer * buffer); + +static void gst_aasink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_aasink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstStateChangeReturn gst_aasink_change_state (GstElement * element, + GstStateChange transition); + +static GstElementClass *parent_class = NULL; +static guint gst_aasink_signals[LAST_SIGNAL] = { 0 }; + +GType +gst_aasink_get_type (void) +{ + static GType aasink_type = 0; + + if (!aasink_type) { + static const GTypeInfo aasink_info = { + sizeof (GstAASinkClass), + gst_aasink_base_init, + NULL, + (GClassInitFunc) gst_aasink_class_init, + NULL, + NULL, + sizeof (GstAASink), + 0, + (GInstanceInitFunc) gst_aasink_init, + }; + + aasink_type = + g_type_register_static (GST_TYPE_BASE_SINK, "GstAASink", &aasink_info, + 0); + } + return aasink_type; +} + +#define GST_TYPE_AADRIVERS (gst_aasink_drivers_get_type()) +static GType +gst_aasink_drivers_get_type (void) +{ + static GType driver_type = 0; + + if (!driver_type) { + GEnumValue *drivers; + const struct aa_driver *driver; + gint n_drivers; + gint i; + + for (n_drivers = 0; aa_drivers[n_drivers]; n_drivers++) { + /* count number of drivers */ + } + + drivers = g_new0 (GEnumValue, n_drivers + 1); + + for (i = 0; i < n_drivers; i++) { + driver = aa_drivers[i]; + drivers[i].value = i; + drivers[i].value_name = g_strdup (driver->name); + drivers[i].value_nick = g_utf8_strdown (driver->shortname, -1); + } + drivers[i].value = 0; + drivers[i].value_name = NULL; + drivers[i].value_nick = NULL; + + driver_type = g_enum_register_static ("GstAASinkDrivers", drivers); + } + return driver_type; +} + +#define GST_TYPE_AADITHER (gst_aasink_dither_get_type()) +static GType +gst_aasink_dither_get_type (void) +{ + static GType dither_type = 0; + + if (!dither_type) { + GEnumValue *ditherers; + gint n_ditherers; + gint i; + + for (n_ditherers = 0; aa_dithernames[n_ditherers]; n_ditherers++) { + /* count number of ditherers */ + } + + ditherers = g_new0 (GEnumValue, n_ditherers + 1); + + for (i = 0; i < n_ditherers; i++) { + ditherers[i].value = i; + ditherers[i].value_name = g_strdup (aa_dithernames[i]); + ditherers[i].value_nick = + g_strdelimit (g_strdup (aa_dithernames[i]), " _", '-'); + } + ditherers[i].value = 0; + ditherers[i].value_name = NULL; + ditherers[i].value_nick = NULL; + + dither_type = g_enum_register_static ("GstAASinkDitherers", ditherers); + } + return dither_type; +} + +static void +gst_aasink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_set_details_simple (element_class, "ASCII art video sink", + "Sink/Video", + "An ASCII art videosink", "Wim Taymans "); +} + +static void +gst_aasink_class_init (GstAASinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_aasink_set_property; + gobject_class->get_property = gst_aasink_get_property; + + /* FIXME: add long property descriptions */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH, + g_param_spec_int ("width", "width", "width", G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HEIGHT, + g_param_spec_int ("height", "height", "height", G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DRIVER, + g_param_spec_enum ("driver", "driver", "driver", GST_TYPE_AADRIVERS, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DITHER, + g_param_spec_enum ("dither", "dither", "dither", GST_TYPE_AADITHER, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BRIGHTNESS, + g_param_spec_int ("brightness", "brightness", "brightness", G_MININT, + G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CONTRAST, + g_param_spec_int ("contrast", "contrast", "contrast", G_MININT, G_MAXINT, + 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GAMMA, + g_param_spec_float ("gamma", "gamma", "gamma", 0.0, 5.0, 1.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_INVERSION, + g_param_spec_boolean ("inversion", "inversion", "inversion", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RANDOMVAL, + g_param_spec_int ("randomval", "randomval", "randomval", G_MININT, + G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAMES_DISPLAYED, + g_param_spec_int ("frames-displayed", "frames displayed", + "frames displayed", G_MININT, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAME_TIME, + g_param_spec_int ("frame-time", "frame time", "frame time", G_MININT, + G_MAXINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + gst_aasink_signals[SIGNAL_FRAME_DISPLAYED] = + g_signal_new ("frame-displayed", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAASinkClass, frame_displayed), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + gst_aasink_signals[SIGNAL_HAVE_SIZE] = + g_signal_new ("have-size", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstAASinkClass, have_size), NULL, NULL, + gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_aasink_change_state); + + gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_aasink_setcaps); + gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_aasink_get_times); + gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_aasink_render); + gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_aasink_render); +} + +static void +gst_aasink_fixate (GstPad * pad, GstCaps * caps) +{ + GstStructure *structure; + + structure = gst_caps_get_structure (caps, 0); + + gst_structure_fixate_field_nearest_int (structure, "width", 320); + gst_structure_fixate_field_nearest_int (structure, "height", 240); + gst_structure_fixate_field_nearest_fraction (structure, "framerate", 30, 1); +} + +static gboolean +gst_aasink_setcaps (GstBaseSink * basesink, GstCaps * caps) +{ + GstAASink *aasink; + GstStructure *structure; + + aasink = GST_AASINK (basesink); + + structure = gst_caps_get_structure (caps, 0); + gst_structure_get_int (structure, "width", &aasink->width); + gst_structure_get_int (structure, "height", &aasink->height); + + /* FIXME aasink->format is never set */ + g_print ("%d %d\n", aasink->width, aasink->height); + + GST_DEBUG ("aasink: setting %08lx (%" GST_FOURCC_FORMAT ")", + aasink->format, GST_FOURCC_ARGS (aasink->format)); + + g_signal_emit (G_OBJECT (aasink), gst_aasink_signals[SIGNAL_HAVE_SIZE], 0, + aasink->width, aasink->height); + + return TRUE; +} + +static void +gst_aasink_init (GstAASink * aasink) +{ + GstPad *pad; + + pad = GST_BASE_SINK_PAD (aasink); + gst_pad_set_fixatecaps_function (pad, gst_aasink_fixate); + + memcpy (&aasink->ascii_surf, &aa_defparams, + sizeof (struct aa_hardware_params)); + aasink->ascii_parms.bright = 0; + aasink->ascii_parms.contrast = 16; + aasink->ascii_parms.gamma = 1.0; + aasink->ascii_parms.dither = 0; + aasink->ascii_parms.inversion = 0; + aasink->ascii_parms.randomval = 0; + aasink->aa_driver = 0; + + aasink->width = -1; + aasink->height = -1; + +} + +static void +gst_aasink_scale (GstAASink * aasink, guchar * src, guchar * dest, + gint sw, gint sh, gint dw, gint dh) +{ + gint ypos, yinc, y; + gint xpos, xinc, x; + + g_return_if_fail ((dw != 0) && (dh != 0)); + + ypos = 0x10000; + yinc = (sh << 16) / dh; + xinc = (sw << 16) / dw; + + for (y = dh; y; y--) { + while (ypos > 0x10000) { + ypos -= 0x10000; + src += sw; + } + xpos = 0x10000; + { + guchar *destp = dest; + guchar *srcp = src; + + for (x = dw; x; x--) { + while (xpos >= 0x10000L) { + srcp++; + xpos -= 0x10000L; + } + *destp++ = *srcp; + xpos += xinc; + } + } + dest += dw; + ypos += yinc; + } +} + +static void +gst_aasink_get_times (GstBaseSink * sink, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end) +{ + *start = GST_BUFFER_TIMESTAMP (buffer); + *end = *start + GST_BUFFER_DURATION (buffer); +} + +static GstFlowReturn +gst_aasink_render (GstBaseSink * basesink, GstBuffer * buffer) +{ + GstAASink *aasink; + + aasink = GST_AASINK (basesink); + + GST_DEBUG ("render"); + + gst_aasink_scale (aasink, GST_BUFFER_DATA (buffer), /* src */ + aa_image (aasink->context), /* dest */ + aasink->width, /* sw */ + aasink->height, /* sh */ + aa_imgwidth (aasink->context), /* dw */ + aa_imgheight (aasink->context)); /* dh */ + + aa_render (aasink->context, &aasink->ascii_parms, + 0, 0, aa_imgwidth (aasink->context), aa_imgheight (aasink->context)); + aa_flush (aasink->context); + aa_getevent (aasink->context, FALSE); + + return GST_FLOW_OK; +} + + +static void +gst_aasink_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstAASink *aasink; + + aasink = GST_AASINK (object); + + switch (prop_id) { + case ARG_WIDTH: + aasink->ascii_surf.width = g_value_get_int (value); + break; + case ARG_HEIGHT: + aasink->ascii_surf.height = g_value_get_int (value); + break; + case ARG_DRIVER:{ + aasink->aa_driver = g_value_get_enum (value); + break; + } + case ARG_DITHER:{ + aasink->ascii_parms.dither = g_value_get_enum (value); + break; + } + case ARG_BRIGHTNESS:{ + aasink->ascii_parms.bright = g_value_get_int (value); + break; + } + case ARG_CONTRAST:{ + aasink->ascii_parms.contrast = g_value_get_int (value); + break; + } + case ARG_GAMMA:{ + aasink->ascii_parms.gamma = g_value_get_float (value); + break; + } + case ARG_INVERSION:{ + aasink->ascii_parms.inversion = g_value_get_boolean (value); + break; + } + case ARG_RANDOMVAL:{ + aasink->ascii_parms.randomval = g_value_get_int (value); + break; + } + default: + break; + } +} + +static void +gst_aasink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstAASink *aasink; + + aasink = GST_AASINK (object); + + switch (prop_id) { + case ARG_WIDTH:{ + g_value_set_int (value, aasink->ascii_surf.width); + break; + } + case ARG_HEIGHT:{ + g_value_set_int (value, aasink->ascii_surf.height); + break; + } + case ARG_DRIVER:{ + g_value_set_enum (value, aasink->aa_driver); + break; + } + case ARG_DITHER:{ + g_value_set_enum (value, aasink->ascii_parms.dither); + break; + } + case ARG_BRIGHTNESS:{ + g_value_set_int (value, aasink->ascii_parms.bright); + break; + } + case ARG_CONTRAST:{ + g_value_set_int (value, aasink->ascii_parms.contrast); + break; + } + case ARG_GAMMA:{ + g_value_set_float (value, aasink->ascii_parms.gamma); + break; + } + case ARG_INVERSION:{ + g_value_set_boolean (value, aasink->ascii_parms.inversion); + break; + } + case ARG_RANDOMVAL:{ + g_value_set_int (value, aasink->ascii_parms.randomval); + break; + } + case ARG_FRAMES_DISPLAYED:{ + g_value_set_int (value, aasink->frames_displayed); + break; + } + case ARG_FRAME_TIME:{ + g_value_set_int (value, aasink->frame_time / 1000000); + break; + } + default:{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } +} + +static gboolean +gst_aasink_open (GstAASink * aasink) +{ + if (!aasink->context) { + aa_recommendhidisplay (aa_drivers[aasink->aa_driver]->shortname); + + aasink->context = aa_autoinit (&aasink->ascii_surf); + if (aasink->context == NULL) { + GST_ELEMENT_ERROR (GST_ELEMENT (aasink), LIBRARY, TOO_LAZY, (NULL), + ("error opening aalib context")); + return FALSE; + } + aa_autoinitkbd (aasink->context, 0); + aa_resizehandler (aasink->context, (void *) aa_resize); + } + return TRUE; +} + +static gboolean +gst_aasink_close (GstAASink * aasink) +{ + aa_close (aasink->context); + aasink->context = NULL; + + return TRUE; +} + +static GstStateChangeReturn +gst_aasink_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + if (!gst_aasink_open (GST_AASINK (element))) + goto open_failed; + 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: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + gst_aasink_close (GST_AASINK (element)); + break; + default: + break; + } + + return ret; + +open_failed: + { + return GST_STATE_CHANGE_FAILURE; + } +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "aasink", GST_RANK_NONE, GST_TYPE_AASINK)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "aasink", + "ASCII Art video sink", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/aalib/gstaasink.h b/ext/aalib/gstaasink.h new file mode 100644 index 0000000..03bd2ea --- /dev/null +++ b/ext/aalib/gstaasink.h @@ -0,0 +1,79 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_AASINK_H__ +#define __GST_AASINK_H__ + +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#define GST_TYPE_AASINK \ + (gst_aasink_get_type()) +#define GST_AASINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AASINK,GstAASink)) +#define GST_AASINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AASINK,GstAASinkClass)) +#define GST_IS_AASINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AASINK)) +#define GST_IS_AASINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AASINK)) + +typedef struct _GstAASink GstAASink; +typedef struct _GstAASinkClass GstAASinkClass; + +struct _GstAASink { + GstBaseSink parent; + + gulong format; + gint width, height; + + gint frames_displayed; + guint64 frame_time; + + aa_context *context; + struct aa_hardware_params ascii_surf; + struct aa_renderparams ascii_parms; + aa_palette palette; + gint aa_driver; +}; + +struct _GstAASinkClass { + GstBaseSinkClass parent_class; + + /* signals */ + void (*frame_displayed) (GstElement *element); + void (*have_size) (GstElement *element, guint width, guint height); +}; + +GType gst_aasink_get_type(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __GST_AASINKE_H__ */ diff --git a/ext/annodex/Makefile.am b/ext/annodex/Makefile.am new file mode 100644 index 0000000..d20a01f --- /dev/null +++ b/ext/annodex/Makefile.am @@ -0,0 +1,19 @@ +plugin_LTLIBRARIES = libgstannodex.la + +libgstannodex_la_SOURCES = \ + gstannodex.c \ + gstcmmlutils.c \ + gstcmmldec.c \ + gstcmmlenc.c \ + gstcmmltag.c \ + gstcmmlparser.c + +libgstannodex_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) $(ANNODEX_CFLAGS) +libgstannodex_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ + $(GST_LIBS) $(ANNODEX_LIBS) $(LIBM) +libgstannodex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstannodex_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstannodex.h gstcmmlutils.h gstcmmltag.h gstcmmlparser.h \ + gstcmmldec.h gstcmmlenc.h diff --git a/ext/annodex/Makefile.in b/ext/annodex/Makefile.in new file mode 100644 index 0000000..5dc3209 --- /dev/null +++ b/ext/annodex/Makefile.in @@ -0,0 +1,863 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/annodex +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstannodex_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstannodex_la_OBJECTS = libgstannodex_la-gstannodex.lo \ + libgstannodex_la-gstcmmlutils.lo \ + libgstannodex_la-gstcmmldec.lo libgstannodex_la-gstcmmlenc.lo \ + libgstannodex_la-gstcmmltag.lo \ + libgstannodex_la-gstcmmlparser.lo +libgstannodex_la_OBJECTS = $(am_libgstannodex_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstannodex_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstannodex_la_CFLAGS) $(CFLAGS) \ + $(libgstannodex_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstannodex_la_SOURCES) +DIST_SOURCES = $(libgstannodex_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstannodex.la +libgstannodex_la_SOURCES = \ + gstannodex.c \ + gstcmmlutils.c \ + gstcmmldec.c \ + gstcmmlenc.c \ + gstcmmltag.c \ + gstcmmlparser.c + +libgstannodex_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) $(ANNODEX_CFLAGS) + +libgstannodex_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ + $(GST_LIBS) $(ANNODEX_LIBS) $(LIBM) + +libgstannodex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstannodex_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstannodex.h gstcmmlutils.h gstcmmltag.h gstcmmlparser.h \ + gstcmmldec.h gstcmmlenc.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/annodex/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/annodex/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstannodex.la: $(libgstannodex_la_OBJECTS) $(libgstannodex_la_DEPENDENCIES) $(EXTRA_libgstannodex_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstannodex_la_LINK) -rpath $(plugindir) $(libgstannodex_la_OBJECTS) $(libgstannodex_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstannodex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmldec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmlenc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmlparser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmltag.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmlutils.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstannodex_la-gstannodex.lo: gstannodex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstannodex.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstannodex.Tpo -c -o libgstannodex_la-gstannodex.lo `test -f 'gstannodex.c' || echo '$(srcdir)/'`gstannodex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstannodex.Tpo $(DEPDIR)/libgstannodex_la-gstannodex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstannodex.c' object='libgstannodex_la-gstannodex.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstannodex.lo `test -f 'gstannodex.c' || echo '$(srcdir)/'`gstannodex.c + +libgstannodex_la-gstcmmlutils.lo: gstcmmlutils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmlutils.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmlutils.Tpo -c -o libgstannodex_la-gstcmmlutils.lo `test -f 'gstcmmlutils.c' || echo '$(srcdir)/'`gstcmmlutils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmlutils.Tpo $(DEPDIR)/libgstannodex_la-gstcmmlutils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmlutils.c' object='libgstannodex_la-gstcmmlutils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmlutils.lo `test -f 'gstcmmlutils.c' || echo '$(srcdir)/'`gstcmmlutils.c + +libgstannodex_la-gstcmmldec.lo: gstcmmldec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmldec.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmldec.Tpo -c -o libgstannodex_la-gstcmmldec.lo `test -f 'gstcmmldec.c' || echo '$(srcdir)/'`gstcmmldec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmldec.Tpo $(DEPDIR)/libgstannodex_la-gstcmmldec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmldec.c' object='libgstannodex_la-gstcmmldec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmldec.lo `test -f 'gstcmmldec.c' || echo '$(srcdir)/'`gstcmmldec.c + +libgstannodex_la-gstcmmlenc.lo: gstcmmlenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmlenc.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmlenc.Tpo -c -o libgstannodex_la-gstcmmlenc.lo `test -f 'gstcmmlenc.c' || echo '$(srcdir)/'`gstcmmlenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmlenc.Tpo $(DEPDIR)/libgstannodex_la-gstcmmlenc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmlenc.c' object='libgstannodex_la-gstcmmlenc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmlenc.lo `test -f 'gstcmmlenc.c' || echo '$(srcdir)/'`gstcmmlenc.c + +libgstannodex_la-gstcmmltag.lo: gstcmmltag.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmltag.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmltag.Tpo -c -o libgstannodex_la-gstcmmltag.lo `test -f 'gstcmmltag.c' || echo '$(srcdir)/'`gstcmmltag.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmltag.Tpo $(DEPDIR)/libgstannodex_la-gstcmmltag.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmltag.c' object='libgstannodex_la-gstcmmltag.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmltag.lo `test -f 'gstcmmltag.c' || echo '$(srcdir)/'`gstcmmltag.c + +libgstannodex_la-gstcmmlparser.lo: gstcmmlparser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmlparser.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmlparser.Tpo -c -o libgstannodex_la-gstcmmlparser.lo `test -f 'gstcmmlparser.c' || echo '$(srcdir)/'`gstcmmlparser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmlparser.Tpo $(DEPDIR)/libgstannodex_la-gstcmmlparser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmlparser.c' object='libgstannodex_la-gstcmmlparser.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmlparser.lo `test -f 'gstcmmlparser.c' || echo '$(srcdir)/'`gstcmmlparser.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/annodex/gstannodex.c b/ext/annodex/gstannodex.c new file mode 100644 index 0000000..05e10c8 --- /dev/null +++ b/ext/annodex/gstannodex.c @@ -0,0 +1,167 @@ +/* + * gstannodex.c - GStreamer annodex plugin + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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 +#include +#include "gstannodex.h" +#include "gstcmmlparser.h" +#include "gstcmmlenc.h" +#include "gstcmmldec.h" + +GstClockTime +gst_annodex_granule_to_time (gint64 granulepos, gint64 granulerate_n, + gint64 granulerate_d, guint8 granuleshift) +{ + gint64 keyindex, keyoffset; + gint64 granulerate; + GstClockTime res; + + g_return_val_if_fail (granuleshift <= 64, GST_CLOCK_TIME_NONE); + + if (granulepos == -1) + return GST_CLOCK_TIME_NONE; + + if (granulepos == 0 || granulerate_n == 0 || granulerate_d == 0) + return 0; + + if (granuleshift != 0 && granuleshift != 64) { + keyindex = granulepos >> granuleshift; + keyoffset = granulepos - (keyindex << granuleshift); + granulepos = keyindex + keyoffset; + } + + /* GST_SECOND / (granulerate_n / granulerate_d) */ + granulerate = gst_util_uint64_scale (GST_SECOND, + granulerate_d, granulerate_n); + + /* granulepos * granulerate */ + res = gst_util_uint64_scale (granulepos, granulerate, 1); + + return res; +} + +GValueArray * +gst_annodex_parse_headers (const gchar * headers) +{ + GValueArray *array; + GValue val = { 0 }; + gchar *header_name = NULL; + gchar *header_value = NULL; + gchar *line, *column, *space, *tmp; + gchar **lines; + gint i = 0; + + array = g_value_array_new (0); + g_value_init (&val, G_TYPE_STRING); + + lines = g_strsplit (headers, "\r\n", 0); + line = lines[i]; + while (line != NULL && *line != '\0') { + if (line[0] == '\t' || line[0] == ' ') { + /* WSP: continuation line */ + if (header_value == NULL) + /* continuation line without a previous value */ + goto fail; + + tmp = g_strjoin (" ", header_value, g_strstrip (line), NULL); + g_free (header_value); + header_value = tmp; + } else { + if (header_name) { + g_value_take_string (&val, header_name); + g_value_array_append (array, &val); + g_value_take_string (&val, header_value); + g_value_array_append (array, &val); + } + /* search the column starting from line[1] as an header name can't be + * empty */ + column = g_strstr_len (line + 1, strlen (line) - 1, ":"); + if (column == NULL) + /* bad syntax */ + goto fail; + + if (*(space = column + 1) != ' ') + /* bad syntax */ + goto fail; + + header_name = g_strndup (line, column - line); + header_value = g_strdup (space + 1); + } + + line = lines[++i]; + } + + if (header_name) { + g_value_take_string (&val, header_name); + g_value_array_append (array, &val); + g_value_take_string (&val, header_value); + g_value_array_append (array, &val); + } + + g_value_unset (&val); + g_strfreev (lines); + + return array; + +fail: + GST_WARNING ("could not parse annodex headers"); + g_free (header_name); + g_free (header_value); + g_strfreev (lines); + g_value_array_free (array); + g_value_unset (&val); + return NULL; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_tag_register (GST_TAG_CMML_STREAM, GST_TAG_FLAG_META, + GST_TYPE_CMML_TAG_STREAM, "cmml-stream", "annodex CMML stream tag", NULL); + + gst_tag_register (GST_TAG_CMML_HEAD, GST_TAG_FLAG_META, + GST_TYPE_CMML_TAG_HEAD, "cmml-head", "annodex CMML head tag", NULL); + + gst_tag_register (GST_TAG_CMML_CLIP, GST_TAG_FLAG_META, + GST_TYPE_CMML_TAG_CLIP, "cmml-clip", "annodex CMML clip tag", NULL); + + gst_cmml_parser_init (); + + if (!gst_cmml_enc_plugin_init (plugin)) + return FALSE; + + if (!gst_cmml_dec_plugin_init (plugin)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "annodex", + "annodex stream manipulation (info about annodex: http://www.annodex.net)", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/annodex/gstannodex.h b/ext/annodex/gstannodex.h new file mode 100644 index 0000000..ca35e36 --- /dev/null +++ b/ext/annodex/gstannodex.h @@ -0,0 +1,34 @@ +/* + * gstannodex.h - GStreamer annodex utility functions + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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_ANNODEX_H__ +#define __GST_ANNODEX_H__ + +#include + +GstClockTime gst_annodex_granule_to_time (gint64 granulepos, + gint64 granulerate_n, gint64 granulerate_d, guint8 granuleshift); +gchar *gst_annodex_time_to_npt (GstClockTime time); +GValueArray *gst_annodex_parse_headers (const gchar * headers); + +#endif /* __GST_ANNODEX_H__ */ diff --git a/ext/annodex/gstcmmldec.c b/ext/annodex/gstcmmldec.c new file mode 100644 index 0000000..695e992 --- /dev/null +++ b/ext/annodex/gstcmmldec.c @@ -0,0 +1,708 @@ +/* + * gstcmmldec.c - GStreamer annodex CMML decoder + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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-cmmldec + * @see_also: cmmlenc, oggdemux + * + * Cmmldec extracts a CMML document from a CMML bitstream.CMML is + * an XML markup language for time-continuous data maintained by the Annodex Foundation. + * + * + * Example pipeline + * |[ + * gst-launch -v filesrc location=annotated.ogg ! oggdemux ! cmmldec ! filesink location=annotations.cmml + * ]| + * + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include "gstannodex.h" +#include "gstcmmltag.h" +#include "gstcmmldec.h" +#include "gstcmmlutils.h" + +GST_DEBUG_CATEGORY_STATIC (cmmldec); +#define GST_CAT_DEFAULT cmmldec + +#define CMML_IDENT_HEADER_SIZE 29 + +enum +{ + ARG_0, + GST_CMML_DEC_WAIT_CLIP_END +}; + +enum +{ + LAST_SIGNAL +}; + +static GstStaticPadTemplate gst_cmml_dec_src_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("text/x-cmml, encoded = (boolean) false") + ); + +static GstStaticPadTemplate gst_cmml_dec_sink_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("text/x-cmml, encoded = (boolean) true") + ); + +/* GstCmmlDec */ +GST_BOILERPLATE (GstCmmlDec, gst_cmml_dec, GstElement, GST_TYPE_ELEMENT); +static void gst_cmml_dec_get_property (GObject * dec, guint property_id, + GValue * value, GParamSpec * pspec); +static void gst_cmml_dec_set_property (GObject * dec, guint property_id, + const GValue * value, GParamSpec * pspec); +static const GstQueryType *gst_cmml_dec_query_types (GstPad * pad); +static gboolean gst_cmml_dec_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_cmml_dec_sink_event (GstPad * pad, GstEvent * event); +static gboolean gst_cmml_dec_convert (GstPad * pad, GstFormat src_fmt, + gint64 src_val, GstFormat * dest_fmt, gint64 * dest_val); +static GstStateChangeReturn gst_cmml_dec_change_state (GstElement * element, + GstStateChange transition); +static GstFlowReturn gst_cmml_dec_chain (GstPad * pad, GstBuffer * buffer); + +static GstCmmlPacketType gst_cmml_dec_parse_packet_type (GstCmmlDec * dec, + GstBuffer * buffer); +static void gst_cmml_dec_parse_ident_header (GstCmmlDec * dec, GstBuffer * buf); +static void gst_cmml_dec_parse_first_header (GstCmmlDec * dec, GstBuffer * buf); +static void gst_cmml_dec_parse_preamble (GstCmmlDec * dec, + guchar * preamble, guchar * cmml_root_element); +static void gst_cmml_dec_parse_xml (GstCmmlDec * dec, + guchar * data, guint size); +static void gst_cmml_dec_parse_head (GstCmmlDec * dec, GstCmmlTagHead * head); +static void gst_cmml_dec_parse_clip (GstCmmlDec * dec, GstCmmlTagClip * clip); + +static GstFlowReturn gst_cmml_dec_new_buffer (GstCmmlDec * dec, + guchar * data, gint size, GstBuffer ** buffer); +static void gst_cmml_dec_push_clip (GstCmmlDec * dec, GstCmmlTagClip * clip); +static void gst_cmml_dec_send_clip_tag (GstCmmlDec * dec, + GstCmmlTagClip * clip); + +static void gst_cmml_dec_finalize (GObject * object); + +static void +gst_cmml_dec_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_cmml_dec_sink_factory); + gst_element_class_add_static_pad_template (element_class, + &gst_cmml_dec_src_factory); + gst_element_class_set_details_simple (element_class, "CMML stream decoder", + "Codec/Decoder", + "Decodes CMML streams", "Alessandro Decina "); +} + +static void +gst_cmml_dec_class_init (GstCmmlDecClass * dec_class) +{ + GObjectClass *klass = G_OBJECT_CLASS (dec_class); + + GST_ELEMENT_CLASS (klass)->change_state = gst_cmml_dec_change_state; + + klass->set_property = gst_cmml_dec_set_property; + klass->get_property = gst_cmml_dec_get_property; + klass->finalize = gst_cmml_dec_finalize; + + g_object_class_install_property (klass, GST_CMML_DEC_WAIT_CLIP_END, + g_param_spec_boolean ("wait-clip-end-time", + "Wait clip end time", + "Send a tag for a clip when the clip ends, setting its end-time. " + "Use when you need to know both clip's start-time and end-time.", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_cmml_dec_init (GstCmmlDec * dec, GstCmmlDecClass * klass) +{ + dec->sinkpad = + gst_pad_new_from_static_template (&gst_cmml_dec_sink_factory, "sink"); + gst_pad_set_chain_function (dec->sinkpad, gst_cmml_dec_chain); + gst_pad_set_query_type_function (dec->sinkpad, gst_cmml_dec_query_types); + gst_pad_set_query_function (dec->sinkpad, gst_cmml_dec_sink_query); + gst_pad_set_event_function (dec->sinkpad, gst_cmml_dec_sink_event); + gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); + + dec->srcpad = + gst_pad_new_from_static_template (&gst_cmml_dec_src_factory, "src"); + gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); + + dec->wait_clip_end = FALSE; +} + +static void +gst_cmml_dec_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + GstCmmlDec *dec = GST_CMML_DEC (object); + + switch (property_id) { + case GST_CMML_DEC_WAIT_CLIP_END: + g_value_set_boolean (value, dec->wait_clip_end); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +gst_cmml_dec_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + GstCmmlDec *dec = GST_CMML_DEC (object); + + switch (property_id) { + case GST_CMML_DEC_WAIT_CLIP_END: + dec->wait_clip_end = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (dec, property_id, pspec); + } +} + +static void +gst_cmml_dec_finalize (GObject * object) +{ + GstCmmlDec *dec = GST_CMML_DEC (object); + + if (dec->tracks) { + gst_cmml_track_list_destroy (dec->tracks); + dec->tracks = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstStateChangeReturn +gst_cmml_dec_change_state (GstElement * element, GstStateChange transition) +{ + GstCmmlDec *dec = GST_CMML_DEC (element); + GstStateChangeReturn res; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + dec->parser = gst_cmml_parser_new (GST_CMML_PARSER_DECODE); + dec->parser->user_data = dec; + dec->parser->preamble_callback = + (GstCmmlParserPreambleCallback) gst_cmml_dec_parse_preamble; + dec->parser->head_callback = + (GstCmmlParserHeadCallback) gst_cmml_dec_parse_head; + dec->parser->clip_callback = + (GstCmmlParserClipCallback) gst_cmml_dec_parse_clip; + dec->major = -1; + dec->minor = -1; + dec->granulerate_n = -1; + dec->granulerate_d = -1; + dec->granuleshift = 0; + dec->granulepos = 0; + dec->flow_return = GST_FLOW_OK; + dec->sent_root = FALSE; + dec->tracks = gst_cmml_track_list_new (); + break; + default: + break; + } + + res = parent_class->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_cmml_parser_free (dec->parser); + gst_cmml_track_list_destroy (dec->tracks); + dec->tracks = NULL; + break; + default: + break; + } + + return res; +} + +static const GstQueryType * +gst_cmml_dec_query_types (GstPad * pad) +{ + static const GstQueryType query_types[] = { + GST_QUERY_CONVERT, + 0 + }; + + return query_types; +} + +static gboolean +gst_cmml_dec_sink_query (GstPad * pad, GstQuery * query) +{ + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + res = gst_cmml_dec_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val); + if (res) + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + break; + } + default: + break; + } + + return res; +} + +static gboolean +gst_cmml_dec_convert (GstPad * pad, + GstFormat src_fmt, gint64 src_val, GstFormat * dest_fmt, gint64 * dest_val) +{ + GstCmmlDec *dec = GST_CMML_DEC (GST_PAD_PARENT (pad)); + gboolean res = FALSE; + + switch (src_fmt) { + case GST_FORMAT_DEFAULT: + switch (*dest_fmt) { + case GST_FORMAT_TIME: + { + *dest_val = gst_annodex_granule_to_time (src_val, dec->granulerate_n, + dec->granulerate_d, dec->granuleshift); + res = TRUE; + break; + } + default: + break; + } + break; + default: + break; + } + + return res; +} + +static gboolean +gst_cmml_dec_sink_event (GstPad * pad, GstEvent * event) +{ + GstCmmlDec *dec = GST_CMML_DEC (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + { + GstBuffer *buffer; + GstCmmlTagClip *clip; + GList *clips, *walk; + + GST_INFO_OBJECT (dec, "got EOS, flushing clips"); + + /* since we output a clip when the next one in the same track is found, on + * EOS we need to output the last clip (if any) of every track + */ + clips = gst_cmml_track_list_get_clips (dec->tracks); + for (walk = clips; walk; walk = g_list_next (walk)) { + clip = GST_CMML_TAG_CLIP (walk->data); + gst_cmml_dec_push_clip (dec, clip); + if (dec->wait_clip_end) { + clip->end_time = dec->timestamp; + gst_cmml_dec_send_clip_tag (dec, clip); + } + } + g_list_free (clips); + + /* send the cmml end tag */ + dec->flow_return = gst_cmml_dec_new_buffer (dec, + (guchar *) "", strlen (""), &buffer); + + if (dec->flow_return == GST_FLOW_OK) + dec->flow_return = gst_pad_push (dec->srcpad, buffer); + if (dec->flow_return == GST_FLOW_NOT_LINKED) + dec->flow_return = GST_FLOW_OK; /* Ignore NOT_LINKED */ + + break; + } + default: + break; + } + + return gst_pad_event_default (pad, event); +} + +static GstFlowReturn +gst_cmml_dec_chain (GstPad * pad, GstBuffer * buffer) +{ + GstCmmlDec *dec = GST_CMML_DEC (GST_PAD_PARENT (pad)); + GstCmmlPacketType packet; + + if (GST_BUFFER_SIZE (buffer) == 0) { + /* the EOS page could be empty */ + dec->flow_return = GST_FLOW_OK; + goto done; + } + + dec->granulepos = GST_BUFFER_OFFSET_END (buffer); + dec->timestamp = gst_annodex_granule_to_time (dec->granulepos, + dec->granulerate_n, dec->granulerate_d, dec->granuleshift); + + /* identify the packet type */ + packet = gst_cmml_dec_parse_packet_type (dec, buffer); + + /* handle the packet. the handler will set dec->flow_return */ + switch (packet) { + case GST_CMML_PACKET_IDENT_HEADER: + if (dec->sent_root == FALSE) + /* don't parse the ident again in case of seeking to the beginning */ + gst_cmml_dec_parse_ident_header (dec, buffer); + break; + case GST_CMML_PACKET_FIRST_HEADER: + if (dec->sent_root == FALSE) + /* don't parse the xml preamble if it has already been parsed because it + * would error out, so seeking to the beginning would fail */ + gst_cmml_dec_parse_first_header (dec, buffer); + break; + case GST_CMML_PACKET_SECOND_HEADER: + case GST_CMML_PACKET_CLIP: + gst_cmml_dec_parse_xml (dec, + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + break; + case GST_CMML_PACKET_UNKNOWN: + default: + GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("unknown packet type")); + dec->flow_return = GST_FLOW_ERROR; + } + +done: + gst_buffer_unref (buffer); + return dec->flow_return; +} + +/* finds the packet type of the buffer + */ +static GstCmmlPacketType +gst_cmml_dec_parse_packet_type (GstCmmlDec * dec, GstBuffer * buffer) +{ + GstCmmlPacketType packet_type = GST_CMML_PACKET_UNKNOWN; + gchar *data = (gchar *) GST_BUFFER_DATA (buffer); + guint size = GST_BUFFER_SIZE (buffer); + + if (size >= 8 && !memcmp (data, "CMML\0\0\0\0", 8)) { + packet_type = GST_CMML_PACKET_IDENT_HEADER; + } else if (size >= 5) { + if (!strncmp (data, "srcpad, GST_BUFFER_OFFSET_NONE, + size, gst_static_pad_template_get_caps (&gst_cmml_dec_src_factory), + buffer); + + if (res == GST_FLOW_OK) { + if (data) + memcpy (GST_BUFFER_DATA (*buffer), data, size); + GST_BUFFER_TIMESTAMP (*buffer) = dec->timestamp; + } else if (res == GST_FLOW_NOT_LINKED) { + GST_DEBUG_OBJECT (dec, "alloc function return NOT-LINKED, ignoring"); + } else { + GST_WARNING_OBJECT (dec, "alloc function returned error %s", + gst_flow_get_name (res)); + } + + return res; +} + +/* parses the first CMML packet (the ident header) + */ +static void +gst_cmml_dec_parse_ident_header (GstCmmlDec * dec, GstBuffer * buffer) +{ + guint8 *data = GST_BUFFER_DATA (buffer); + + /* the ident header has a fixed length */ + if (GST_BUFFER_SIZE (buffer) != CMML_IDENT_HEADER_SIZE) { + GST_ELEMENT_ERROR (dec, STREAM, DECODE, + (NULL), ("wrong ident header size: %d", GST_BUFFER_SIZE (buffer))); + dec->flow_return = GST_FLOW_ERROR; + + return; + } + + data += 8; + dec->major = GST_READ_UINT16_LE (data); + data += 2; + dec->minor = GST_READ_UINT16_LE (data); + data += 2; + dec->granulerate_n = GST_READ_UINT64_LE (data); + data += 8; + dec->granulerate_d = GST_READ_UINT64_LE (data); + data += 8; + dec->granuleshift = GST_READ_UINT8 (data); + + GST_INFO_OBJECT (dec, "bitstream initialized " + "(major: %" G_GINT16_FORMAT " minor: %" G_GINT16_FORMAT + " granulerate_n: %" G_GINT64_FORMAT " granulerate_d: %" G_GINT64_FORMAT + " granuleshift: %d)", + dec->major, dec->minor, + dec->granulerate_n, dec->granulerate_d, dec->granuleshift); + + dec->flow_return = GST_FLOW_OK; +} + +/* parses the first secondary header. + * the first secondary header contains the xml version, the doctype and the + * optional "cmml" processing instruction. + */ +static void +gst_cmml_dec_parse_first_header (GstCmmlDec * dec, GstBuffer * buffer) +{ + gst_cmml_dec_parse_xml (dec, + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + + /* if there is a processing instruction, gst_cmml_dec_parse_preamble + * will be triggered. Otherwise we need to call it manually. + */ + if (dec->flow_return == GST_FLOW_OK && !dec->sent_root) { + guchar *preamble = (guchar *) g_strndup ((gchar *) GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); + + gst_cmml_dec_parse_preamble (dec, preamble, (guchar *) ""); + g_free (preamble); + } +} + +/* feeds data into the cmml parser. + */ +static void +gst_cmml_dec_parse_xml (GstCmmlDec * dec, guchar * data, guint size) +{ + GError *err = NULL; + + if (!gst_cmml_parser_parse_chunk (dec->parser, (gchar *) data, size, &err)) { + GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("%s", err->message)); + g_error_free (err); + dec->flow_return = GST_FLOW_ERROR; + } +} + +static void +gst_cmml_dec_parse_preamble (GstCmmlDec * dec, guchar * preamble, + guchar * root_element) +{ + GstBuffer *buffer; + guchar *encoded_preamble; + + encoded_preamble = (guchar *) g_strconcat ((gchar *) preamble, + (gchar *) root_element, NULL); + + /* send the root element to the internal parser */ + gst_cmml_dec_parse_xml (dec, root_element, strlen ((gchar *) root_element)); + dec->sent_root = TRUE; + + /* push the root element */ + dec->flow_return = gst_cmml_dec_new_buffer (dec, + encoded_preamble, strlen ((gchar *) encoded_preamble), &buffer); + if (dec->flow_return == GST_FLOW_OK) { + dec->flow_return = gst_pad_push (dec->srcpad, buffer); + } + + if (dec->flow_return == GST_FLOW_OK) { + GST_INFO_OBJECT (dec, "preamble parsed"); + } + + g_free (encoded_preamble); + return; +} + +/* outputs the cmml head element and send TITLE and CMML_HEAD tags. + * This callback is registered with dec->parser. It is called when the + * head element is parsed. + */ +static void +gst_cmml_dec_parse_head (GstCmmlDec * dec, GstCmmlTagHead * head) +{ + GstTagList *tags; + GValue str_val = { 0 }, title_val = { + 0}; + guchar *head_str; + GstBuffer *buffer; + + GST_DEBUG_OBJECT (dec, "found CMML head (title: %s base: %s)", + head->title, head->base); + + /* create the GST_TAG_TITLE tag */ + g_value_init (&str_val, G_TYPE_STRING); + g_value_init (&title_val, gst_tag_get_type (GST_TAG_TITLE)); + g_value_set_string (&str_val, (gchar *) head->title); + g_value_transform (&str_val, &title_val); + + tags = gst_tag_list_new (); + gst_tag_list_add_values (tags, GST_TAG_MERGE_APPEND, + GST_TAG_TITLE, &title_val, NULL); + gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_CMML_HEAD, head, NULL); + gst_element_found_tags_for_pad (GST_ELEMENT (dec), dec->srcpad, tags); + + g_value_unset (&str_val); + g_value_unset (&title_val); + + head_str = gst_cmml_parser_tag_head_to_string (dec->parser, head); + + dec->flow_return = gst_cmml_dec_new_buffer (dec, + head_str, strlen ((gchar *) head_str), &buffer); + g_free (head_str); + if (dec->flow_return == GST_FLOW_OK) + dec->flow_return = gst_pad_push (dec->srcpad, buffer); + if (dec->flow_return == GST_FLOW_NOT_LINKED) + dec->flow_return = GST_FLOW_OK; /* Ignore NOT_LINKED */ +} + +/* send a TAG_MESSAGE event for a clip */ +static void +gst_cmml_dec_send_clip_tag (GstCmmlDec * dec, GstCmmlTagClip * clip) +{ + GstTagList *tags; + + GST_DEBUG_OBJECT (dec, "sending clip tag %s", clip->id); + + tags = gst_tag_list_new (); + gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_CMML_CLIP, clip, NULL); + gst_element_found_tags_for_pad (GST_ELEMENT (dec), dec->srcpad, tags); +} + +/* push the string representation of a clip */ +static void +gst_cmml_dec_push_clip (GstCmmlDec * dec, GstCmmlTagClip * clip) +{ + GstBuffer *buffer; + guchar *clip_str; + + GST_DEBUG_OBJECT (dec, "pushing clip %s", clip->id); + + clip_str = gst_cmml_parser_tag_clip_to_string (dec->parser, clip); + dec->flow_return = gst_cmml_dec_new_buffer (dec, + clip_str, strlen ((gchar *) clip_str), &buffer); + if (dec->flow_return == GST_FLOW_OK) + dec->flow_return = gst_pad_push (dec->srcpad, buffer); + if (dec->flow_return == GST_FLOW_NOT_LINKED) + dec->flow_return = GST_FLOW_OK; /* Ignore NOT_LINKED */ + + g_free (clip_str); +} + +/* decode a clip tag + * this callback is registered with dec->parser. It is called whenever a + * clip is parsed. + */ +static void +gst_cmml_dec_parse_clip (GstCmmlDec * dec, GstCmmlTagClip * clip) +{ + GstCmmlTagClip *prev_clip; + + dec->flow_return = GST_FLOW_OK; + + if (clip->empty) + GST_INFO_OBJECT (dec, "parsing empty clip"); + else + GST_INFO_OBJECT (dec, "parsing clip (id: %s)", clip->id); + + clip->start_time = dec->timestamp; + if (clip->start_time == GST_CLOCK_TIME_NONE) { + GST_ELEMENT_ERROR (dec, STREAM, DECODE, + (NULL), ("invalid clip start time")); + + dec->flow_return = GST_FLOW_ERROR; + return; + } + + /* get the last clip in the current track */ + prev_clip = gst_cmml_track_list_get_track_last_clip (dec->tracks, + (gchar *) clip->track); + if (prev_clip) { + /* output the previous clip */ + if (clip->empty) + /* the current clip marks the end of the previous one */ + prev_clip->end_time = clip->start_time; + + gst_cmml_dec_push_clip (dec, prev_clip); + } + + if (dec->wait_clip_end) { + /* now it's time to send the tag for the previous clip */ + if (prev_clip) { + prev_clip->end_time = clip->start_time; + gst_cmml_dec_send_clip_tag (dec, prev_clip); + } + } else if (!clip->empty) { + /* send the tag for the current clip */ + gst_cmml_dec_send_clip_tag (dec, clip); + } + + if (prev_clip) + gst_cmml_track_list_del_clip (dec->tracks, prev_clip); + + if (!clip->empty) + if (!gst_cmml_track_list_has_clip (dec->tracks, clip)) + gst_cmml_track_list_add_clip (dec->tracks, clip); +} + +gboolean +gst_cmml_dec_plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "cmmldec", GST_RANK_PRIMARY, + GST_TYPE_CMML_DEC)) + return FALSE; + + GST_DEBUG_CATEGORY_INIT (cmmldec, "cmmldec", 0, + "annodex CMML decoding element"); + + return TRUE; +} diff --git a/ext/annodex/gstcmmldec.h b/ext/annodex/gstcmmldec.h new file mode 100644 index 0000000..27a6c55 --- /dev/null +++ b/ext/annodex/gstcmmldec.h @@ -0,0 +1,98 @@ +/* + * gstcmmldec.h - GStreamer annodex CMML decoder + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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_CMML_DEC_H__ +#define __GST_CMML_DEC_H__ + +#include +#include +#include + +#include "gstcmmlparser.h" + +/* GstCmmlDec */ +#define GST_TYPE_CMML_DEC (gst_cmml_dec_get_type()) +#define GST_CMML_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CMML_DEC, GstCmmlDec)) +#define GST_CMML_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CMML_DEC, GstCmmlDecClass)) +#define GST_IS_CMML_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_CMML_DEC)) +#define GST_IS_CMML_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CMML_DEC)) +#define GST_CMML_DEC_GET_CLASS(klass) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CMML_DEC, GstCmmlDecClass)) + +typedef struct _GstCmmlDec GstCmmlDec; +typedef struct _GstCmmlDecClass GstCmmlDecClass; +typedef enum _GstCmmlPacketType GstCmmlPacketType; + +enum _GstCmmlPacketType +{ + GST_CMML_PACKET_UNKNOWN, + GST_CMML_PACKET_IDENT_HEADER, + GST_CMML_PACKET_FIRST_HEADER, + GST_CMML_PACKET_SECOND_HEADER, + GST_CMML_PACKET_CLIP +}; + +struct _GstCmmlDec +{ + GstElement element; + + /* element part */ + GstPad *sinkpad; + GstPad *srcpad; + + /* bitstream part */ + gint16 major; /* bitstream version major */ + gint16 minor; /* bitstream version minor */ + gint64 granulerate_n; /* bitrstream granulerate numerator */ + gint64 granulerate_d; /* bitstream granulerate denominator */ + gint8 granuleshift; /* bitstreamgranuleshift */ + gint64 granulepos; /* bitstream granule position */ + GstClockTime timestamp; /* timestamp of the last buffer */ + + /* decoder part */ + GstCmmlParser *parser; /* cmml parser */ + gboolean sent_root; + GstFlowReturn flow_return; /* _chain return value */ + gboolean wait_clip_end; /* when TRUE, the GST_TAG_MESSAGE for a + * clip is sent when the next clip (or EOS) + * is found, so that the clip end-time is + * known. This is useful for pre-extracting + * the clips. + */ + GHashTable *tracks; +}; + +struct _GstCmmlDecClass +{ + GstElementClass parent_class; +}; + +GType gst_cmml_dec_get_type (void); + +gboolean gst_cmml_dec_plugin_init (GstPlugin * plugin); + +#endif /* __GST_CMML_DEC_H__ */ diff --git a/ext/annodex/gstcmmlenc.c b/ext/annodex/gstcmmlenc.c new file mode 100644 index 0000000..7bdfc1e --- /dev/null +++ b/ext/annodex/gstcmmlenc.c @@ -0,0 +1,631 @@ +/* + * gstcmmlenc.c - GStreamer CMML encoder + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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-cmmlenc + * @see_also: cmmldec, oggmux + * + * Cmmlenc encodes a CMML document into a CMML stream. CMML is + * an XML markup language for time-continuous data maintained by the Annodex Foundation. + * + * + * Example pipeline + * |[ + * gst-launch -v filesrc location=annotations.cmml ! cmmlenc ! oggmux name=mux ! filesink location=annotated.ogg + * ]| + * + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "gstcmmlenc.h" +#include "gstannodex.h" + +GST_DEBUG_CATEGORY_STATIC (cmmlenc); +#define GST_CAT_DEFAULT cmmlenc + +#define CMML_IDENT_HEADER_SIZE 29 + +enum +{ + ARG_0, + GST_CMML_ENC_GRANULERATE_N, + GST_CMML_ENC_GRANULERATE_D, + GST_CMML_ENC_GRANULESHIFT +}; + +enum +{ + LAST_SIGNAL +}; + +static GstStaticPadTemplate gst_cmml_enc_src_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("text/x-cmml, encoded = (boolean) true") + ); + +static GstStaticPadTemplate gst_cmml_enc_sink_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("text/x-cmml, encoded = (boolean) false") + ); + +GST_BOILERPLATE (GstCmmlEnc, gst_cmml_enc, GstElement, GST_TYPE_ELEMENT); +static void gst_cmml_enc_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec); +static void gst_cmml_enc_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec); +static gboolean gst_cmml_enc_sink_event (GstPad * pad, GstEvent * event); +static GstStateChangeReturn gst_cmml_enc_change_state (GstElement * element, + GstStateChange transition); +static GstFlowReturn gst_cmml_enc_chain (GstPad * pad, GstBuffer * buffer); +static void gst_cmml_enc_parse_preamble (GstCmmlEnc * enc, + guchar * preamble, guchar * processing_instruction); +static void gst_cmml_enc_parse_end_tag (GstCmmlEnc * enc); +static void gst_cmml_enc_parse_tag_head (GstCmmlEnc * enc, + GstCmmlTagHead * head); +static void gst_cmml_enc_parse_tag_clip (GstCmmlEnc * enc, + GstCmmlTagClip * tag); +static GstFlowReturn gst_cmml_enc_new_buffer (GstCmmlEnc * enc, + guchar * data, gint size, GstBuffer ** buffer); +static GstFlowReturn gst_cmml_enc_push_clip (GstCmmlEnc * enc, + GstCmmlTagClip * clip, GstClockTime prev_clip_time); +static GstFlowReturn gst_cmml_enc_push (GstCmmlEnc * enc, GstBuffer * buffer); + +static void gst_cmml_enc_finalize (GObject * object); + +static void +gst_cmml_enc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_cmml_enc_sink_factory); + gst_element_class_add_static_pad_template (element_class, + &gst_cmml_enc_src_factory); + gst_element_class_set_details_simple (element_class, "CMML streams encoder", + "Codec/Encoder", + "Encodes CMML streams", "Alessandro Decina "); +} + +static void +gst_cmml_enc_class_init (GstCmmlEncClass * enc_class) +{ + GObjectClass *klass = G_OBJECT_CLASS (enc_class); + + klass->get_property = gst_cmml_enc_get_property; + klass->set_property = gst_cmml_enc_set_property; + klass->finalize = gst_cmml_enc_finalize; + + g_object_class_install_property (klass, GST_CMML_ENC_GRANULERATE_N, + g_param_spec_int64 ("granule-rate-numerator", + "Granulerate numerator", + "Granulerate numerator", + 0, G_MAXINT64, 1000, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_ENC_GRANULERATE_D, + g_param_spec_int64 ("granule-rate-denominator", + "Granulerate denominator", + "Granulerate denominator", + 0, G_MAXINT64, 1, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_ENC_GRANULESHIFT, + g_param_spec_uchar ("granule-shift", + "Granuleshift", + "The number of lower bits to use for partitioning a granule position", + 0, 64, 32, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + GST_ELEMENT_CLASS (klass)->change_state = gst_cmml_enc_change_state; +} + +static void +gst_cmml_enc_init (GstCmmlEnc * enc, GstCmmlEncClass * klass) +{ + enc->sinkpad = + gst_pad_new_from_static_template (&gst_cmml_enc_sink_factory, "sink"); + gst_pad_set_chain_function (enc->sinkpad, gst_cmml_enc_chain); + gst_pad_set_event_function (enc->sinkpad, gst_cmml_enc_sink_event); + gst_element_add_pad (GST_ELEMENT (enc), enc->sinkpad); + + enc->srcpad = + gst_pad_new_from_static_template (&gst_cmml_enc_src_factory, "src"); + gst_element_add_pad (GST_ELEMENT (enc), enc->srcpad); + + enc->major = 3; + enc->minor = 0; +} + +static void +gst_cmml_enc_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + GstCmmlEnc *enc = GST_CMML_ENC (object); + + switch (property_id) { + case GST_CMML_ENC_GRANULERATE_N: + /* XXX: may need to flush clips */ + enc->granulerate_n = g_value_get_int64 (value); + break; + case GST_CMML_ENC_GRANULERATE_D: + enc->granulerate_d = g_value_get_int64 (value); + break; + case GST_CMML_ENC_GRANULESHIFT: + enc->granuleshift = g_value_get_uchar (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +gst_cmml_enc_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + GstCmmlEnc *enc = GST_CMML_ENC (object); + + switch (property_id) { + case GST_CMML_ENC_GRANULERATE_N: + g_value_set_int64 (value, enc->granulerate_n); + break; + case GST_CMML_ENC_GRANULERATE_D: + g_value_set_int64 (value, enc->granulerate_d); + break; + case GST_CMML_ENC_GRANULESHIFT: + g_value_set_uchar (value, enc->granuleshift); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +gst_cmml_enc_finalize (GObject * object) +{ + GstCmmlEnc *enc = GST_CMML_ENC (object); + + if (enc->tracks) { + gst_cmml_track_list_destroy (enc->tracks); + enc->tracks = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstStateChangeReturn +gst_cmml_enc_change_state (GstElement * element, GstStateChange transition) +{ + GstCmmlEnc *enc = GST_CMML_ENC (element); + GstStateChangeReturn res; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + enc->parser = gst_cmml_parser_new (GST_CMML_PARSER_ENCODE); + enc->parser->user_data = enc; + enc->parser->preamble_callback = + (GstCmmlParserPreambleCallback) gst_cmml_enc_parse_preamble; + enc->parser->head_callback = + (GstCmmlParserHeadCallback) gst_cmml_enc_parse_tag_head; + enc->parser->clip_callback = + (GstCmmlParserClipCallback) gst_cmml_enc_parse_tag_clip; + enc->parser->cmml_end_callback = + (GstCmmlParserCmmlEndCallback) gst_cmml_enc_parse_end_tag; + enc->tracks = gst_cmml_track_list_new (); + enc->sent_headers = FALSE; + enc->sent_eos = FALSE; + enc->flow_return = GST_FLOW_OK; + break; + default: + break; + } + + res = parent_class->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + { + gst_cmml_track_list_destroy (enc->tracks); + enc->tracks = NULL; + g_free (enc->preamble); + enc->preamble = NULL; + gst_cmml_parser_free (enc->parser); + break; + } + default: + break; + } + + return res; +} + +static gboolean +gst_cmml_enc_sink_event (GstPad * pad, GstEvent * event) +{ + GstCmmlEnc *enc = GST_CMML_ENC (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + { + if (!enc->sent_eos) + gst_cmml_enc_parse_end_tag (enc); + + break; + } + default: + break; + } + + return gst_pad_event_default (pad, event); +} + +static GstFlowReturn +gst_cmml_enc_new_buffer (GstCmmlEnc * enc, + guchar * data, gint size, GstBuffer ** buffer) +{ + GstFlowReturn res; + + res = gst_pad_alloc_buffer (enc->srcpad, GST_BUFFER_OFFSET_NONE, size, + NULL, buffer); + if (res == GST_FLOW_OK) { + if (data) + memcpy (GST_BUFFER_DATA (*buffer), data, size); + } else { + GST_WARNING_OBJECT (enc, "alloc function returned error %s", + gst_flow_get_name (res)); + } + + return res; +} + +static GstCaps * +gst_cmml_enc_set_header_on_caps (GstCmmlEnc * enc, GstCaps * caps, + GstBuffer * ident, GstBuffer * preamble, GstBuffer * head) +{ + GValue array = { 0 }; + GValue value = { 0 }; + GstStructure *structure; + GstBuffer *buffer; + + caps = gst_caps_make_writable (caps); + structure = gst_caps_get_structure (caps, 0); + + g_value_init (&array, GST_TYPE_ARRAY); + g_value_init (&value, GST_TYPE_BUFFER); + + /* Make copies of header buffers to avoid circular references */ + buffer = gst_buffer_copy (ident); + gst_value_set_buffer (&value, buffer); + gst_value_array_append_value (&array, &value); + gst_buffer_unref (buffer); + + buffer = gst_buffer_copy (preamble); + gst_value_set_buffer (&value, buffer); + gst_value_array_append_value (&array, &value); + gst_buffer_unref (buffer); + + buffer = gst_buffer_copy (head); + gst_value_set_buffer (&value, buffer); + gst_value_array_append_value (&array, &value); + gst_buffer_unref (buffer); + + GST_BUFFER_FLAG_SET (ident, GST_BUFFER_FLAG_IN_CAPS); + GST_BUFFER_FLAG_SET (preamble, GST_BUFFER_FLAG_IN_CAPS); + GST_BUFFER_FLAG_SET (head, GST_BUFFER_FLAG_IN_CAPS); + + gst_structure_set_value (structure, "streamheader", &array); + + g_value_unset (&value); + g_value_unset (&array); + + return caps; +} + +/* create a CMML ident header buffer + */ +static GstFlowReturn +gst_cmml_enc_new_ident_header (GstCmmlEnc * enc, GstBuffer ** buffer) +{ + guint8 ident_header[CMML_IDENT_HEADER_SIZE]; + guint8 *wptr = ident_header; + + memcpy (wptr, "CMML\0\0\0\0", 8); + wptr += 8; + GST_WRITE_UINT16_LE (wptr, enc->major); + wptr += 2; + GST_WRITE_UINT16_LE (wptr, enc->minor); + wptr += 2; + GST_WRITE_UINT64_LE (wptr, enc->granulerate_n); + wptr += 8; + GST_WRITE_UINT64_LE (wptr, enc->granulerate_d); + wptr += 8; + *wptr = enc->granuleshift; + + return gst_cmml_enc_new_buffer (enc, + (guchar *) & ident_header, CMML_IDENT_HEADER_SIZE, buffer); +} + +/* parse the CMML preamble */ +static void +gst_cmml_enc_parse_preamble (GstCmmlEnc * enc, + guchar * preamble, guchar * processing_instruction) +{ + GST_INFO_OBJECT (enc, "parsing preamble"); + + /* save the preamble: it will be pushed when the head tag is found */ + enc->preamble = (guchar *) g_strconcat ((gchar *) preamble, + (gchar *) processing_instruction, NULL); +} + +/* parse the CMML end tag */ +static void +gst_cmml_enc_parse_end_tag (GstCmmlEnc * enc) +{ + GstBuffer *buffer; + + GST_INFO_OBJECT (enc, "parsing end tag"); + + /* push an empty buffer to signal EOS */ + enc->flow_return = gst_cmml_enc_new_buffer (enc, NULL, 0, &buffer); + if (enc->flow_return == GST_FLOW_OK) { + /* set granulepos 0 on EOS */ + GST_BUFFER_OFFSET_END (buffer) = 0; + enc->flow_return = gst_cmml_enc_push (enc, buffer); + enc->sent_eos = TRUE; + } + + return; +} + +/* encode the CMML head tag and push the CMML headers + */ +static void +gst_cmml_enc_parse_tag_head (GstCmmlEnc * enc, GstCmmlTagHead * head) +{ + GList *headers = NULL; + GList *walk; + guchar *head_string; + GstCaps *caps; + GstBuffer *ident_buf, *preamble_buf, *head_buf; + GstBuffer *buffer; + + if (enc->preamble == NULL) + goto flow_unexpected; + + GST_INFO_OBJECT (enc, "parsing head tag"); + + enc->flow_return = gst_cmml_enc_new_ident_header (enc, &ident_buf); + if (enc->flow_return != GST_FLOW_OK) + goto alloc_error; + headers = g_list_append (headers, ident_buf); + + enc->flow_return = gst_cmml_enc_new_buffer (enc, + enc->preamble, strlen ((gchar *) enc->preamble), &preamble_buf); + if (enc->flow_return != GST_FLOW_OK) + goto alloc_error; + headers = g_list_append (headers, preamble_buf); + + head_string = gst_cmml_parser_tag_head_to_string (enc->parser, head); + enc->flow_return = gst_cmml_enc_new_buffer (enc, + head_string, strlen ((gchar *) head_string), &head_buf); + g_free (head_string); + if (enc->flow_return != GST_FLOW_OK) + goto alloc_error; + headers = g_list_append (headers, head_buf); + + caps = gst_pad_get_caps (enc->srcpad); + caps = gst_cmml_enc_set_header_on_caps (enc, caps, + ident_buf, preamble_buf, head_buf); + + while (headers) { + buffer = GST_BUFFER (headers->data); + /* set granulepos 0 on headers */ + GST_BUFFER_OFFSET_END (buffer) = 0; + gst_buffer_set_caps (buffer, caps); + + enc->flow_return = gst_cmml_enc_push (enc, buffer); + headers = g_list_delete_link (headers, headers); + + if (enc->flow_return != GST_FLOW_OK) + goto push_error; + } + + gst_caps_unref (caps); + + enc->sent_headers = TRUE; + return; + +flow_unexpected: + GST_ELEMENT_ERROR (enc, STREAM, ENCODE, + (NULL), ("got head tag before preamble")); + enc->flow_return = GST_FLOW_ERROR; + return; +push_error: + gst_caps_unref (caps); + /* fallthrough */ +alloc_error: + for (walk = headers; walk; walk = walk->next) + gst_buffer_unref (GST_BUFFER (walk->data)); + g_list_free (headers); + return; +} + +/* encode a CMML clip tag + * remove the start and end attributes (GstCmmlParser does this itself) and + * push the tag with the timestamp of its start attribute. If the tag has the + * end attribute, create a new empty clip and encode it. + */ +static void +gst_cmml_enc_parse_tag_clip (GstCmmlEnc * enc, GstCmmlTagClip * clip) +{ + GstCmmlTagClip *prev_clip; + GstClockTime prev_clip_time = GST_CLOCK_TIME_NONE; + + /* this can happen if there's a programming error (eg user forgets to set + * the start-time property) or if one of the gst_cmml_clock_time_from_* + * overflows in GstCmmlParser */ + if (clip->start_time == GST_CLOCK_TIME_NONE) { + GST_ELEMENT_ERROR (enc, STREAM, ENCODE, + (NULL), ("invalid start time for clip (%s)", clip->id)); + enc->flow_return = GST_FLOW_ERROR; + + return; + } + + /* get the previous clip's start time to encode the current granulepos */ + prev_clip = gst_cmml_track_list_get_track_last_clip (enc->tracks, + (gchar *) clip->track); + if (prev_clip) { + prev_clip_time = prev_clip->start_time; + if (prev_clip_time > clip->start_time) { + GST_ELEMENT_ERROR (enc, STREAM, ENCODE, + (NULL), ("previous clip start time > current clip (%s) start time", + clip->id)); + enc->flow_return = GST_FLOW_ERROR; + return; + } + + /* we don't need the prev clip anymore */ + gst_cmml_track_list_del_clip (enc->tracks, prev_clip); + } + + /* add the current clip to the tracklist */ + gst_cmml_track_list_add_clip (enc->tracks, clip); + + enc->flow_return = gst_cmml_enc_push_clip (enc, clip, prev_clip_time); +} + +static GstFlowReturn +gst_cmml_enc_push_clip (GstCmmlEnc * enc, GstCmmlTagClip * clip, + GstClockTime prev_clip_time) +{ + GstFlowReturn res; + GstBuffer *buffer; + gchar *clip_string; + gint64 granulepos; + + /* encode the clip */ + clip_string = + (gchar *) gst_cmml_parser_tag_clip_to_string (enc->parser, clip); + + res = gst_cmml_enc_new_buffer (enc, + (guchar *) clip_string, strlen (clip_string), &buffer); + g_free (clip_string); + if (res != GST_FLOW_OK) + goto done; + + GST_INFO_OBJECT (enc, "encoding clip" + "(start-time: %" GST_TIME_FORMAT " end-time: %" GST_TIME_FORMAT, + GST_TIME_ARGS (clip->start_time), GST_TIME_ARGS (clip->end_time)); + + /* set the granulepos */ + granulepos = gst_cmml_clock_time_to_granule (prev_clip_time, clip->start_time, + enc->granulerate_n, enc->granulerate_d, enc->granuleshift); + if (granulepos == -1) { + gst_buffer_unref (buffer); + goto granule_overflow; + } + + GST_BUFFER_OFFSET (buffer) = clip->start_time; + GST_BUFFER_OFFSET_END (buffer) = granulepos; + GST_BUFFER_TIMESTAMP (buffer) = clip->start_time; + + res = gst_cmml_enc_push (enc, buffer); + if (res != GST_FLOW_OK) + goto done; + + if (clip->end_time != GST_CLOCK_TIME_NONE) { + /* create a new empty clip for the same cmml track starting at end_time + */ + GObject *end_clip = g_object_new (GST_TYPE_CMML_TAG_CLIP, + "start-time", clip->end_time, "track", clip->track, NULL); + + /* encode the empty end clip */ + gst_cmml_enc_push_clip (enc, GST_CMML_TAG_CLIP (end_clip), + clip->start_time); + g_object_unref (end_clip); + } +done: + return res; + +granule_overflow: + GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL), ("granulepos overflow")); + return GST_FLOW_ERROR; +} + +static GstFlowReturn +gst_cmml_enc_push (GstCmmlEnc * enc, GstBuffer * buffer) +{ + GstFlowReturn res; + + res = gst_pad_push (enc->srcpad, buffer); + if (res != GST_FLOW_OK) + GST_WARNING_OBJECT (enc, "push returned: %s", gst_flow_get_name (res)); + + return res; +} + +static GstFlowReturn +gst_cmml_enc_chain (GstPad * pad, GstBuffer * buffer) +{ + GError *err = NULL; + GstCmmlEnc *enc = GST_CMML_ENC (GST_PAD_PARENT (pad)); + + /* the CMML handlers registered with enc->parser will override this when + * encoding/pushing the buffers downstream + */ + enc->flow_return = GST_FLOW_OK; + + if (!gst_cmml_parser_parse_chunk (enc->parser, + (gchar *) GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), &err)) { + GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL), ("%s", err->message)); + g_error_free (err); + enc->flow_return = GST_FLOW_ERROR; + } + + gst_buffer_unref (buffer); + return enc->flow_return; +} + +gboolean +gst_cmml_enc_plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "cmmlenc", GST_RANK_NONE, + GST_TYPE_CMML_ENC)) + return FALSE; + + GST_DEBUG_CATEGORY_INIT (cmmlenc, "cmmlenc", 0, + "annodex cmml decoding element"); + + return TRUE; +} diff --git a/ext/annodex/gstcmmlenc.h b/ext/annodex/gstcmmlenc.h new file mode 100644 index 0000000..4f28e4c --- /dev/null +++ b/ext/annodex/gstcmmlenc.h @@ -0,0 +1,79 @@ +/* + * gstcmmlenc.h - GStreamer CMML encoder + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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_CMML_ENC_H__ +#define __GST_CMML_ENC_H__ + +#define GST_TYPE_CMML_ENC (gst_cmml_enc_get_type()) +#define GST_CMML_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CMML_ENC, GstCmmlEnc)) +#define GST_CMML_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CMML_ENC, GstCmmlEncClass)) +#define GST_IS_CMML_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_CMML_ENC)) +#define GST_IS_CMML_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CMML_ENC)) +#define GST_CMML_ENC_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CMML_ENC, GstCmmlEncClass)) + +#include +#include + +#include "gstcmmlparser.h" +#include "gstcmmlutils.h" + +typedef struct _GstCmmlEnc GstCmmlEnc; +typedef struct _GstCmmlEncClass GstCmmlEncClass; + +struct _GstCmmlEnc +{ + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; + + gint16 major; + gint16 minor; + gint64 granulerate_n; + gint64 granulerate_d; + gint8 granuleshift; + + GstCmmlParser *parser; + gboolean streaming; + GHashTable *tracks; + GstFlowReturn flow_return; + guchar *preamble; + gboolean sent_headers; + gboolean sent_eos; +}; + +struct _GstCmmlEncClass +{ + GstElementClass parent_class; +}; + +GType gst_cmml_enc_get_type (void); + +gboolean gst_cmml_enc_plugin_init (GstPlugin * plugin); + +#endif /* __GST_CMML_ENC_H__ */ diff --git a/ext/annodex/gstcmmlparser.c b/ext/annodex/gstcmmlparser.c new file mode 100644 index 0000000..0e2f7cd --- /dev/null +++ b/ext/annodex/gstcmmlparser.c @@ -0,0 +1,648 @@ +/* + * gstcmmlparser.c - GStreamer CMML document parser + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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 +#include +#include + +#include "gstcmmlparser.h" +#include "gstannodex.h" +#include "gstcmmlutils.h" + +GST_DEBUG_CATEGORY_STATIC (cmmlparser); +#define GST_CAT_DEFAULT cmmlparser + +static void gst_cmml_parser_generic_error (void *ctx, const char *msg, ...); +static xmlNodePtr gst_cmml_parser_new_node (GstCmmlParser * parser, + const gchar * name, ...); +static void +gst_cmml_parser_parse_start_element_ns (xmlParserCtxt * ctxt, + const xmlChar * name, const xmlChar * prefix, const xmlChar * URI, + int nb_preferences, const xmlChar ** namespaces, + int nb_attributes, int nb_defaulted, const xmlChar ** attributes); +static void gst_cmml_parser_parse_end_element_ns (xmlParserCtxt * ctxt, + const xmlChar * name, const xmlChar * prefix, const xmlChar * URI); +static void gst_cmml_parser_parse_processing_instruction (xmlParserCtxtPtr ctxt, + const xmlChar * target, const xmlChar * data); +static void gst_cmml_parser_meta_to_string (GstCmmlParser * parser, + xmlNodePtr parent, GValueArray * meta); + +/* initialize the parser */ +void +gst_cmml_parser_init (void) +{ + GST_DEBUG_CATEGORY_INIT (cmmlparser, "cmmlparser", 0, "annodex CMML parser"); + + xmlGenericError = gst_cmml_parser_generic_error; +} + +/* create a new CMML parser + */ +GstCmmlParser * +gst_cmml_parser_new (GstCmmlParserMode mode) +{ + GstCmmlParser *parser = g_malloc (sizeof (GstCmmlParser)); + + parser->mode = mode; + parser->context = xmlCreatePushParserCtxt (NULL, NULL, + NULL, 0, "cmml-bitstream"); + xmlCtxtUseOptions (parser->context, XML_PARSE_NONET | XML_PARSE_NOERROR); + parser->context->_private = parser; + parser->context->sax->startElementNs = + (startElementNsSAX2Func) gst_cmml_parser_parse_start_element_ns; + parser->context->sax->endElementNs = + (endElementNsSAX2Func) gst_cmml_parser_parse_end_element_ns; + parser->context->sax->processingInstruction = (processingInstructionSAXFunc) + gst_cmml_parser_parse_processing_instruction; + parser->preamble_callback = NULL; + parser->cmml_end_callback = NULL; + parser->stream_callback = NULL; + parser->head_callback = NULL; + parser->clip_callback = NULL; + parser->user_data = NULL; + + return parser; +} + +/* free a CMML parser instance + */ +void +gst_cmml_parser_free (GstCmmlParser * parser) +{ + if (parser) { + xmlFreeDoc (parser->context->myDoc); + xmlFreeParserCtxt (parser->context); + g_free (parser); + } +} + +/* parse an xml chunk + * + * returns false if the xml is invalid + */ +gboolean +gst_cmml_parser_parse_chunk (GstCmmlParser * parser, + const gchar * data, guint size, GError ** err) +{ + gint xmlres; + + xmlres = xmlParseChunk (parser->context, data, size, 0); + if (xmlres != XML_ERR_OK) { + xmlErrorPtr xml_error = xmlCtxtGetLastError (parser->context); + + GST_DEBUG ("Error occurred decoding chunk %s", data); + g_set_error (err, + GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, "%s", xml_error->message); + return FALSE; + } + + return TRUE; +} + +/* convert an xmlNodePtr to a string + */ +static guchar * +gst_cmml_parser_node_to_string (GstCmmlParser * parser, xmlNodePtr node) +{ + xmlBufferPtr xml_buffer; + xmlDocPtr doc; + guchar *str; + + if (parser) + doc = parser->context->myDoc; + else + doc = NULL; + + xml_buffer = xmlBufferCreate (); + xmlNodeDump (xml_buffer, doc, node, 0, 0); + str = xmlStrndup (xml_buffer->content, xml_buffer->use); + xmlBufferFree (xml_buffer); + + return str; +} + +guchar * +gst_cmml_parser_tag_stream_to_string (GstCmmlParser * parser, + GstCmmlTagStream * stream) +{ + xmlNodePtr node; + xmlNodePtr import; + guchar *ret; + + node = gst_cmml_parser_new_node (parser, "stream", NULL); + if (stream->timebase) + xmlSetProp (node, (xmlChar *) "timebase", stream->timebase); + + if (stream->utc) + xmlSetProp (node, (xmlChar *) "utc", stream->utc); + + if (stream->imports) { + gint i; + GValue *val; + + for (i = 0; i < stream->imports->n_values; ++i) { + val = g_value_array_get_nth (stream->imports, i); + import = gst_cmml_parser_new_node (parser, "import", + "src", g_value_get_string (val), NULL); + xmlAddChild (node, import); + } + } + + ret = gst_cmml_parser_node_to_string (parser, node); + + xmlUnlinkNode (node); + xmlFreeNode (node); + + return ret; +} + +/* convert a GstCmmlTagHead to its string representation + */ +guchar * +gst_cmml_parser_tag_head_to_string (GstCmmlParser * parser, + GstCmmlTagHead * head) +{ + xmlNodePtr node; + xmlNodePtr tmp; + guchar *ret; + + node = gst_cmml_parser_new_node (parser, "head", NULL); + if (head->title) { + tmp = gst_cmml_parser_new_node (parser, "title", NULL); + xmlNodeSetContent (tmp, head->title); + xmlAddChild (node, tmp); + } + + if (head->base) { + tmp = gst_cmml_parser_new_node (parser, "base", "uri", head->base, NULL); + xmlAddChild (node, tmp); + } + + if (head->meta) + gst_cmml_parser_meta_to_string (parser, node, head->meta); + + ret = gst_cmml_parser_node_to_string (parser, node); + + xmlUnlinkNode (node); + xmlFreeNode (node); + + return ret; +} + +/* convert a GstCmmlTagClip to its string representation + */ +guchar * +gst_cmml_parser_tag_clip_to_string (GstCmmlParser * parser, + GstCmmlTagClip * clip) +{ + xmlNodePtr node; + xmlNodePtr tmp; + guchar *ret; + + node = gst_cmml_parser_new_node (parser, "clip", + "id", clip->id, "track", clip->track, NULL); + /* add the anchor element */ + if (clip->anchor_href) { + tmp = gst_cmml_parser_new_node (parser, "a", + "href", clip->anchor_href, NULL); + if (clip->anchor_text) + xmlNodeSetContent (tmp, clip->anchor_text); + + xmlAddChild (node, tmp); + } + /* add the img element */ + if (clip->img_src) { + tmp = gst_cmml_parser_new_node (parser, "img", + "src", clip->img_src, "alt", clip->img_alt, NULL); + + xmlAddChild (node, tmp); + } + /* add the desc element */ + if (clip->desc_text) { + tmp = gst_cmml_parser_new_node (parser, "desc", NULL); + xmlNodeSetContent (tmp, clip->desc_text); + + xmlAddChild (node, tmp); + } + /* add the meta elements */ + if (clip->meta) + gst_cmml_parser_meta_to_string (parser, node, clip->meta); + + if (parser->mode == GST_CMML_PARSER_DECODE) { + gchar *time_str; + + time_str = gst_cmml_clock_time_to_npt (clip->start_time); + if (time_str == NULL) + goto fail; + + xmlSetProp (node, (xmlChar *) "start", (xmlChar *) time_str); + g_free (time_str); + + if (clip->end_time != GST_CLOCK_TIME_NONE) { + time_str = gst_cmml_clock_time_to_npt (clip->end_time); + if (time_str == NULL) + goto fail; + + xmlSetProp (node, (xmlChar *) "end", (xmlChar *) time_str); + g_free (time_str); + } + } + + ret = gst_cmml_parser_node_to_string (parser, node); + + xmlUnlinkNode (node); + xmlFreeNode (node); + + return ret; +fail: + xmlUnlinkNode (node); + xmlFreeNode (node); + return NULL; +} + +guchar * +gst_cmml_parser_tag_object_to_string (GstCmmlParser * parser, GObject * tag) +{ + guchar *tag_string = NULL; + GType tag_type = G_OBJECT_TYPE (tag); + + if (tag_type == GST_TYPE_CMML_TAG_STREAM) + tag_string = gst_cmml_parser_tag_stream_to_string (parser, + GST_CMML_TAG_STREAM (tag)); + else if (tag_type == GST_TYPE_CMML_TAG_HEAD) + tag_string = gst_cmml_parser_tag_head_to_string (parser, + GST_CMML_TAG_HEAD (tag)); + else if (tag_type == GST_TYPE_CMML_TAG_CLIP) + tag_string = gst_cmml_parser_tag_clip_to_string (parser, + GST_CMML_TAG_CLIP (tag)); + else + g_warning ("could not convert object to cmml"); + + return tag_string; +} + +/*** private section ***/ + +/* create a new node + * + * helper to create a node and set its attributes + */ +static xmlNodePtr +gst_cmml_parser_new_node (GstCmmlParser * parser, const gchar * name, ...) +{ + va_list args; + xmlNodePtr node; + xmlChar *prop_name, *prop_value; + + node = xmlNewNode (NULL, (xmlChar *) name); + + va_start (args, name); + + prop_name = va_arg (args, xmlChar *); + while (prop_name != NULL) { + prop_value = va_arg (args, xmlChar *); + if (prop_value != NULL) + xmlSetProp (node, prop_name, prop_value); + + prop_name = va_arg (args, xmlChar *); + } + va_end (args); + + return node; +} + +/* get the last node of the stream + * + * returns the last node at depth 1 (if any) or the root node + */ +static xmlNodePtr +gst_cmml_parser_get_last_element (GstCmmlParser * parser) +{ + xmlNodePtr node; + + node = xmlDocGetRootElement (parser->context->myDoc); + if (!node) { + g_warning ("no last cmml element"); + return NULL; + } + + if (node->children) + node = xmlGetLastChild (node); + + return node; +} + +static void +gst_cmml_parser_parse_preamble (GstCmmlParser * parser, + const guchar * attributes) +{ + gchar *preamble; + gchar *element; + const gchar *version; + const gchar *encoding; + const gchar *standalone; + xmlDocPtr doc; + + doc = parser->context->myDoc; + + version = doc->version ? (gchar *) doc->version : "1.0"; + encoding = doc->encoding ? (gchar *) doc->encoding : "UTF-8"; + standalone = doc->standalone ? "yes" : "no"; + + preamble = g_strdup_printf ("\n" + "\n", version, encoding, standalone); + + if (attributes == NULL) + attributes = (guchar *) ""; + + if (parser->mode == GST_CMML_PARSER_ENCODE) + element = g_strdup_printf ("", attributes); + else + element = g_strdup_printf ("", attributes); + + parser->preamble_callback (parser->user_data, + (guchar *) preamble, (guchar *) element); + + g_free (preamble); + g_free (element); +} + +/* parse the cmml stream tag */ +static void +gst_cmml_parser_parse_stream (GstCmmlParser * parser, xmlNodePtr stream) +{ + GstCmmlTagStream *stream_tag; + GValue str_val = { 0 }; + xmlNodePtr walk; + guchar *timebase; + + g_value_init (&str_val, G_TYPE_STRING); + + /* read the timebase and utc attributes */ + timebase = xmlGetProp (stream, (xmlChar *) "timebase"); + if (timebase == NULL) + timebase = (guchar *) g_strdup ("0"); + + stream_tag = g_object_new (GST_TYPE_CMML_TAG_STREAM, + "timebase", timebase, NULL); + g_free (timebase); + + stream_tag->utc = xmlGetProp (stream, (xmlChar *) "utc"); + + /* walk the children nodes */ + for (walk = stream->children; walk; walk = walk->next) { + /* for every import tag add its src attribute to stream_tag->imports */ + if (!xmlStrcmp (walk->name, (xmlChar *) "import")) { + g_value_take_string (&str_val, + (gchar *) xmlGetProp (walk, (xmlChar *) "src")); + + if (stream_tag->imports == NULL) + stream_tag->imports = g_value_array_new (0); + + g_value_array_append (stream_tag->imports, &str_val); + } + } + g_value_unset (&str_val); + + parser->stream_callback (parser->user_data, stream_tag); + g_object_unref (stream_tag); +} + +/* parse the cmml head tag */ +static void +gst_cmml_parser_parse_head (GstCmmlParser * parser, xmlNodePtr head) +{ + GstCmmlTagHead *head_tag; + xmlNodePtr walk; + GValue str_val = { 0 }; + + head_tag = g_object_new (GST_TYPE_CMML_TAG_HEAD, NULL); + + g_value_init (&str_val, G_TYPE_STRING); + + /* Parse the content of the node and setup the GST_TAG_CMML_HEAD tag. + * Create a GST_TAG_TITLE when we find the title element. + */ + for (walk = head->children; walk; walk = walk->next) { + if (!xmlStrcmp (walk->name, (xmlChar *) "title")) { + head_tag->title = xmlNodeGetContent (walk); + } else if (!xmlStrcmp (walk->name, (xmlChar *) "base")) { + head_tag->base = xmlGetProp (walk, (xmlChar *) "uri"); + } else if (!xmlStrcmp (walk->name, (xmlChar *) "meta")) { + if (head_tag->meta == NULL) + head_tag->meta = g_value_array_new (0); + /* add a pair name, content to the meta value array */ + g_value_take_string (&str_val, + (gchar *) xmlGetProp (walk, (xmlChar *) "name")); + g_value_array_append (head_tag->meta, &str_val); + g_value_take_string (&str_val, + (gchar *) xmlGetProp (walk, (xmlChar *) "content")); + g_value_array_append (head_tag->meta, &str_val); + } + } + g_value_unset (&str_val); + + parser->head_callback (parser->user_data, head_tag); + g_object_unref (head_tag); +} + +/* parse a cmml clip tag */ +static void +gst_cmml_parser_parse_clip (GstCmmlParser * parser, xmlNodePtr clip) +{ + GstCmmlTagClip *clip_tag; + GValue str_val = { 0 }; + guchar *id, *track, *start, *end; + xmlNodePtr walk; + GstClockTime start_time = GST_CLOCK_TIME_NONE; + GstClockTime end_time = GST_CLOCK_TIME_NONE; + + start = xmlGetProp (clip, (xmlChar *) "start"); + if (parser->mode == GST_CMML_PARSER_ENCODE && start == NULL) + /* XXX: validate the document */ + return; + + id = xmlGetProp (clip, (xmlChar *) "id"); + track = xmlGetProp (clip, (xmlChar *) "track"); + end = xmlGetProp (clip, (xmlChar *) "end"); + + if (track == NULL) + track = (guchar *) g_strdup ("default"); + + if (start) { + if (!strncmp ((gchar *) start, "smpte", 5)) + start_time = gst_cmml_clock_time_from_smpte ((gchar *) start); + else + start_time = gst_cmml_clock_time_from_npt ((gchar *) start); + } + + if (end) { + if (!strncmp ((gchar *) end, "smpte", 5)) + start_time = gst_cmml_clock_time_from_smpte ((gchar *) end); + else + end_time = gst_cmml_clock_time_from_npt ((gchar *) end); + } + + clip_tag = g_object_new (GST_TYPE_CMML_TAG_CLIP, "id", id, + "track", track, "start-time", start_time, "end-time", end_time, NULL); + + g_free (id); + g_free (track); + g_free (start); + g_free (end); + + g_value_init (&str_val, G_TYPE_STRING); + + /* parse the children */ + for (walk = clip->children; walk; walk = walk->next) { + /* the clip is not empty */ + clip_tag->empty = FALSE; + + if (!xmlStrcmp (walk->name, (xmlChar *) "a")) { + clip_tag->anchor_href = xmlGetProp (walk, (xmlChar *) "href"); + clip_tag->anchor_text = xmlNodeGetContent (walk); + } else if (!xmlStrcmp (walk->name, (xmlChar *) "img")) { + clip_tag->img_src = xmlGetProp (walk, (xmlChar *) "src"); + clip_tag->img_alt = xmlGetProp (walk, (xmlChar *) "alt"); + } else if (!xmlStrcmp (walk->name, (xmlChar *) "desc")) { + clip_tag->desc_text = xmlNodeGetContent (walk); + } else if (!xmlStrcmp (walk->name, (xmlChar *) "meta")) { + if (clip_tag->meta == NULL) + clip_tag->meta = g_value_array_new (0); + /* add a pair name, content to the meta value array */ + g_value_take_string (&str_val, + (char *) xmlGetProp (walk, (xmlChar *) "name")); + g_value_array_append (clip_tag->meta, &str_val); + g_value_take_string (&str_val, + (char *) xmlGetProp (walk, (xmlChar *) "content")); + g_value_array_append (clip_tag->meta, &str_val); + } + } + g_value_unset (&str_val); + + parser->clip_callback (parser->user_data, clip_tag); + g_object_unref (clip_tag); +} + +void +gst_cmml_parser_meta_to_string (GstCmmlParser * parser, + xmlNodePtr parent, GValueArray * array) +{ + gint i; + xmlNodePtr node; + GValue *name, *content; + + for (i = 0; i < array->n_values - 1; i += 2) { + name = g_value_array_get_nth (array, i); + content = g_value_array_get_nth (array, i + 1); + node = gst_cmml_parser_new_node (parser, "meta", + "name", g_value_get_string (name), + "content", g_value_get_string (content), NULL); + xmlAddChild (parent, node); + } +} + +static void +gst_cmml_parser_generic_error (void *ctx, const char *msg, ...) +{ +#ifndef GST_DISABLE_GST_DEBUG + va_list varargs; + + va_start (varargs, msg); + gst_debug_log_valist (GST_CAT_DEFAULT, GST_LEVEL_WARNING, + "", "", 0, NULL, msg, varargs); + va_end (varargs); +#endif /* GST_DISABLE_GST_DEBUG */ +} + +/* sax handler called when an element start tag is found + * this is used to parse the cmml start tag + */ +static void +gst_cmml_parser_parse_start_element_ns (xmlParserCtxt * ctxt, + const xmlChar * name, const xmlChar * prefix, const xmlChar * URI, + int nb_preferences, const xmlChar ** namespaces, + int nb_attributes, int nb_defaulted, const xmlChar ** attributes) +{ + GstCmmlParser *parser = (GstCmmlParser *) ctxt->_private; + + xmlSAX2StartElementNs (ctxt, name, prefix, URI, nb_preferences, namespaces, + nb_attributes, nb_defaulted, attributes); + + if (parser->mode == GST_CMML_PARSER_ENCODE) + if (!xmlStrcmp (name, (xmlChar *) "cmml")) + if (parser->preamble_callback) + /* FIXME: parse attributes */ + gst_cmml_parser_parse_preamble (parser, NULL); +} + +/* sax processing instruction handler + * used to parse the cmml processing instruction + */ +static void +gst_cmml_parser_parse_processing_instruction (xmlParserCtxtPtr ctxt, + const xmlChar * target, const xmlChar * data) +{ + GstCmmlParser *parser = (GstCmmlParser *) ctxt->_private; + + xmlSAX2ProcessingInstruction (ctxt, target, data); + + if (parser->mode == GST_CMML_PARSER_DECODE) + if (!xmlStrcmp (target, (xmlChar *) "cmml")) + if (parser->preamble_callback) + gst_cmml_parser_parse_preamble (parser, data); +} + +/* sax handler called when an xml end tag is found + * used to parse the stream, head and clip nodes + */ +static void +gst_cmml_parser_parse_end_element_ns (xmlParserCtxt * ctxt, + const xmlChar * name, const xmlChar * prefix, const xmlChar * URI) +{ + xmlNodePtr node; + GstCmmlParser *parser = (GstCmmlParser *) ctxt->_private; + + xmlSAX2EndElementNs (ctxt, name, prefix, URI); + + if (!xmlStrcmp (name, (xmlChar *) "clip")) { + if (parser->clip_callback) { + node = gst_cmml_parser_get_last_element (parser); + gst_cmml_parser_parse_clip (parser, node); + } + } else if (!xmlStrcmp (name, (xmlChar *) "cmml")) { + if (parser->cmml_end_callback) + parser->cmml_end_callback (parser->user_data); + } else if (!xmlStrcmp (name, (xmlChar *) "stream")) { + if (parser->stream_callback) { + node = gst_cmml_parser_get_last_element (parser); + gst_cmml_parser_parse_stream (parser, node); + } + } else if (!xmlStrcmp (name, (xmlChar *) "head")) { + if (parser->head_callback) { + node = gst_cmml_parser_get_last_element (parser); + gst_cmml_parser_parse_head (parser, node); + } + } +} diff --git a/ext/annodex/gstcmmlparser.h b/ext/annodex/gstcmmlparser.h new file mode 100644 index 0000000..89c2bff --- /dev/null +++ b/ext/annodex/gstcmmlparser.h @@ -0,0 +1,92 @@ +/* + * gstcmmlparser.h - GStreamer CMML document parser + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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_CMML_PARSER_H__ +#define __GST_CMML_PARSER_H__ + +#include +#include + +#include "gstcmmltag.h" + +typedef struct _GstCmmlParser GstCmmlParser; +typedef enum _GstCmmlParserMode GstCmmlParserMode; + +typedef void (*GstCmmlParserPreambleCallback) (void *user_data, + const guchar * xml_preamble, const guchar * cmml_attrs); + +typedef void (*GstCmmlParserCmmlEndCallback) (void *user_data); + +typedef void (*GstCmmlParserStreamCallback) (void *user_data, + GstCmmlTagStream * stream); + +typedef void (*GstCmmlParserHeadCallback) (void *user_data, + GstCmmlTagHead * head); + +typedef void (*GstCmmlParserClipCallback) (void *user_data, + GstCmmlTagClip * clip); + +enum _GstCmmlParserMode +{ + GST_CMML_PARSER_ENCODE, + GST_CMML_PARSER_DECODE +}; + +struct _GstCmmlParser +{ + GstCmmlParserMode mode; + + xmlParserCtxtPtr context; + + const gchar *preamble; + guint preamble_size; + + void *user_data; + GstCmmlParserPreambleCallback preamble_callback; + GstCmmlParserStreamCallback stream_callback; + GstCmmlParserCmmlEndCallback cmml_end_callback; + GstCmmlParserHeadCallback head_callback; + GstCmmlParserClipCallback clip_callback; +}; + +void gst_cmml_parser_init (void); + +GstCmmlParser *gst_cmml_parser_new (GstCmmlParserMode mode); +void gst_cmml_parser_free (GstCmmlParser * parser); + +gboolean gst_cmml_parser_parse_chunk (GstCmmlParser * parser, + const gchar * data, guint size, GError ** error); + +guchar *gst_cmml_parser_tag_stream_to_string (GstCmmlParser * parser, + GstCmmlTagStream * stream); + +guchar *gst_cmml_parser_tag_head_to_string (GstCmmlParser * parser, + GstCmmlTagHead * head); + +guchar *gst_cmml_parser_tag_clip_to_string (GstCmmlParser * parser, + GstCmmlTagClip * clip); + +guchar *gst_cmml_parser_tag_object_to_string (GstCmmlParser * parser, + GObject * tag); + +#endif /* __GST_CMML_PARSER_H__ */ diff --git a/ext/annodex/gstcmmltag.c b/ext/annodex/gstcmmltag.c new file mode 100644 index 0000000..2cf5d5f --- /dev/null +++ b/ext/annodex/gstcmmltag.c @@ -0,0 +1,579 @@ +/* + * gstcmmltags.c - GStreamer CMML tag support + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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 + +#include "gstcmmlparser.h" +#include "gstcmmltag.h" +#include "gstannodex.h" + +enum +{ + ARG_0, + GST_CMML_TAG_STREAM_TIMEBASE, + GST_CMML_TAG_STREAM_UTC, + GST_CMML_TAG_STREAM_IMPORTS, + GST_CMML_TAG_HEAD_TITLE, + GST_CMML_TAG_HEAD_BASE, + GST_CMML_TAG_HEAD_META, + GST_CMML_TAG_CLIP_EMPTY, + GST_CMML_TAG_CLIP_ID, + GST_CMML_TAG_CLIP_TRACK, + GST_CMML_TAG_CLIP_START_TIME, + GST_CMML_TAG_CLIP_END_TIME, + GST_CMML_TAG_CLIP_ANCHOR_HREF, + GST_CMML_TAG_CLIP_ANCHOR_TEXT, + GST_CMML_TAG_CLIP_IMG_SRC, + GST_CMML_TAG_CLIP_IMG_ALT, + GST_CMML_TAG_CLIP_DESC_TEXT, + GST_CMML_TAG_CLIP_META, +}; + +G_DEFINE_TYPE (GstCmmlTagStream, gst_cmml_tag_stream, G_TYPE_OBJECT); +static void gst_cmml_tag_stream_finalize (GObject * object); +static void gst_cmml_tag_stream_set_property (GObject * object, + guint property_id, const GValue * value, GParamSpec * pspec); +static void gst_cmml_tag_stream_get_property (GObject * object, + guint property_id, GValue * value, GParamSpec * pspec); +static void gst_cmml_tag_stream_value_from_string_value (const GValue * src, + GValue * dest); + +G_DEFINE_TYPE (GstCmmlTagHead, gst_cmml_tag_head, G_TYPE_OBJECT); +static void gst_cmml_tag_head_finalize (GObject * object); +static void gst_cmml_tag_head_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec); +static void gst_cmml_tag_head_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec); +static void gst_cmml_tag_head_value_from_string_value (const GValue * src, + GValue * dest); + +G_DEFINE_TYPE (GstCmmlTagClip, gst_cmml_tag_clip, G_TYPE_OBJECT); +static void gst_cmml_tag_clip_finalize (GObject * object); +static void gst_cmml_tag_clip_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec); +static void gst_cmml_tag_clip_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec); + +static void gst_cmml_tag_clip_value_from_string_value (const GValue * src, + GValue * dest); + +static void set_object_on_value (GObject * object, GValue * dest); + +static const gchar default_preamble[] = + ""; + +/* Stream tag */ +static void +gst_cmml_tag_stream_class_init (GstCmmlTagStreamClass * stream_class) +{ + GObjectClass *klass = G_OBJECT_CLASS (stream_class); + + klass->set_property = gst_cmml_tag_stream_set_property; + klass->get_property = gst_cmml_tag_stream_get_property; + klass->finalize = gst_cmml_tag_stream_finalize; + + g_object_class_install_property (klass, GST_CMML_TAG_STREAM_TIMEBASE, + g_param_spec_string ("base-time", + "Base time", + "Playback time (in seconds) of the first data packet", + "0", G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_STREAM_UTC, + g_param_spec_string ("calendar-base-time", + "Calendar base time", + "Date and wall-clock time (expressed as UTC time in the format " + "YYYYMMDDTHHMMSS.sssZ) associated with the base-time", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_STREAM_IMPORTS, + g_param_spec_value_array ("input-streams", + "Input streams", + "List of input streams that compose this bitstream", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_value_register_transform_func (G_TYPE_STRING, GST_TYPE_CMML_TAG_STREAM, + gst_cmml_tag_stream_value_from_string_value); +} + +static void +gst_cmml_tag_stream_init (GstCmmlTagStream * stream) +{ +} + +static void +gst_cmml_tag_stream_finalize (GObject * object) +{ + GstCmmlTagStream *stream = GST_CMML_TAG_STREAM (object); + + g_free (stream->timebase); + g_free (stream->utc); + if (stream->imports) + g_value_array_free (stream->imports); + + if (G_OBJECT_CLASS (gst_cmml_tag_stream_parent_class)->finalize) + G_OBJECT_CLASS (gst_cmml_tag_stream_parent_class)->finalize (object); +} + +static void +gst_cmml_tag_stream_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + GstCmmlTagStream *stream = GST_CMML_TAG_STREAM (object); + + switch (property_id) { + case GST_CMML_TAG_STREAM_TIMEBASE: + g_free (stream->timebase); + stream->timebase = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_STREAM_UTC: + g_free (stream->utc); + stream->utc = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_STREAM_IMPORTS: + { + GValueArray *va = g_value_get_boxed (value); + + if (stream->imports) + g_value_array_free (stream->imports); + stream->imports = va != NULL ? g_value_array_copy (va) : NULL; + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + + +static void +gst_cmml_tag_stream_value_from_string_value (const GValue * src, GValue * dest) +{ + GstCmmlParser *parser; + const gchar *str; + guint size; + + parser = gst_cmml_parser_new (GST_CMML_PARSER_DECODE); + parser->user_data = dest; + parser->stream_callback = (GstCmmlParserStreamCallback) set_object_on_value; + gst_cmml_parser_parse_chunk (parser, + default_preamble, strlen (default_preamble), NULL); + + str = g_value_get_string (src); + size = strlen (str); + gst_cmml_parser_parse_chunk (parser, str, size, NULL); + + gst_cmml_parser_free (parser); +} + +static void +gst_cmml_tag_stream_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + GstCmmlTagStream *stream = GST_CMML_TAG_STREAM (object); + + switch (property_id) { + case GST_CMML_TAG_STREAM_TIMEBASE: + g_value_set_string (value, (gchar *) stream->timebase); + break; + case GST_CMML_TAG_STREAM_UTC: + g_value_set_string (value, (gchar *) stream->utc); + break; + case GST_CMML_TAG_STREAM_IMPORTS: + g_value_set_boxed (value, stream->imports); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +/* Head tag */ +static void +gst_cmml_tag_head_class_init (GstCmmlTagHeadClass * head_class) +{ + GObjectClass *klass = G_OBJECT_CLASS (head_class); + + klass->set_property = gst_cmml_tag_head_set_property; + klass->get_property = gst_cmml_tag_head_get_property; + klass->finalize = gst_cmml_tag_head_finalize; + + g_object_class_install_property (klass, GST_CMML_TAG_HEAD_TITLE, + g_param_spec_string ("title", + "Title", + "Title of the bitstream", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_HEAD_BASE, + g_param_spec_string ("base-uri", + "Base URI", + "Base URI of the bitstream. All relative URIs are relative to this", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_HEAD_META, + g_param_spec_value_array ("meta", + "Meta annotations", + "Meta annotations for the complete Annodex bitstream", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_value_register_transform_func (G_TYPE_STRING, GST_TYPE_CMML_TAG_HEAD, + gst_cmml_tag_head_value_from_string_value); +} + +static void +gst_cmml_tag_head_init (GstCmmlTagHead * head) +{ +} + +static void +gst_cmml_tag_head_finalize (GObject * object) +{ + GstCmmlTagHead *head = GST_CMML_TAG_HEAD (object); + + g_free (head->title); + g_free (head->base); + if (head->meta) + g_value_array_free (head->meta); + + if (G_OBJECT_CLASS (gst_cmml_tag_head_parent_class)->finalize) + G_OBJECT_CLASS (gst_cmml_tag_head_parent_class)->finalize (object); +} + +static void +gst_cmml_tag_head_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + GstCmmlTagHead *head = GST_CMML_TAG_HEAD (object); + + switch (property_id) { + case GST_CMML_TAG_HEAD_TITLE: + g_free (head->title); + head->title = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_HEAD_BASE: + g_free (head->base); + head->base = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_HEAD_META: + { + GValueArray *va = g_value_get_boxed (value); + + if (head->meta) + g_value_array_free (head->meta); + head->meta = va != NULL ? g_value_array_copy (va) : NULL; + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +gst_cmml_tag_head_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + GstCmmlTagHead *head = GST_CMML_TAG_HEAD (object); + + switch (property_id) { + case GST_CMML_TAG_HEAD_TITLE: + g_value_set_string (value, (gchar *) head->title); + break; + case GST_CMML_TAG_HEAD_BASE: + g_value_set_string (value, (gchar *) head->base); + break; + case GST_CMML_TAG_HEAD_META: + g_value_set_boxed (value, head->meta); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +gst_cmml_tag_head_value_from_string_value (const GValue * src, GValue * dest) +{ + GstCmmlParser *parser; + const gchar *str; + guint size; + + parser = gst_cmml_parser_new (GST_CMML_PARSER_DECODE); + parser->user_data = dest; + parser->head_callback = (GstCmmlParserHeadCallback) set_object_on_value; + gst_cmml_parser_parse_chunk (parser, + default_preamble, strlen (default_preamble), NULL); + + str = g_value_get_string (src); + size = strlen (str); + gst_cmml_parser_parse_chunk (parser, str, size, NULL); + + gst_cmml_parser_free (parser); +} + +/* Clip tag */ +static void +gst_cmml_tag_clip_class_init (GstCmmlTagClipClass * clip_class) +{ + GObjectClass *klass = G_OBJECT_CLASS (clip_class); + + klass->set_property = gst_cmml_tag_clip_set_property; + klass->get_property = gst_cmml_tag_clip_get_property; + klass->finalize = gst_cmml_tag_clip_finalize; + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_EMPTY, + g_param_spec_boolean ("empty", + "Empty clip flag", + "An empty clip only marks the end of the previous clip", + TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_ID, + g_param_spec_string ("id", + "Clip id", + "Id of the clip", NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_TRACK, + g_param_spec_string ("track", + "Track number", + "The track this clip belongs to", + "default", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_START_TIME, + g_param_spec_uint64 ("start-time", + "Start time", + "The start time (in seconds) of the clip", + 0, G_MAXUINT64, GST_CLOCK_TIME_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_END_TIME, + g_param_spec_uint64 ("end-time", + "End time", + "The end time (in seconds) of the clip (only set if extract-mode=true)", + 0, G_MAXUINT64, GST_CLOCK_TIME_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_ANCHOR_HREF, + g_param_spec_string ("anchor-uri", + "Anchor URI", + "The location of a Web resource closely connected to the clip", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_ANCHOR_TEXT, + g_param_spec_string ("anchor-text", + "Anchor text", + "A short description of the resource pointed by anchor-uri", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_IMG_SRC, + g_param_spec_string ("img-uri", + "Image URI", + "The URI of a representative image for the clip", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_IMG_ALT, + g_param_spec_string ("img-alt", + "Image alternative text", + "Alternative text to be displayed instead of the image " + "specified in img-uri", NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_DESC_TEXT, + g_param_spec_string ("description", + "Description", + "A textual description of the content of the clip", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (klass, GST_CMML_TAG_CLIP_META, + g_param_spec_value_array ("meta", + "Meta annotations", + "Meta annotations for the clip", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_value_register_transform_func (G_TYPE_STRING, GST_TYPE_CMML_TAG_CLIP, + gst_cmml_tag_clip_value_from_string_value); +} + +static void +gst_cmml_tag_clip_init (GstCmmlTagClip * clip) +{ +} + +static void +gst_cmml_tag_clip_finalize (GObject * object) +{ + GstCmmlTagClip *clip = GST_CMML_TAG_CLIP (object); + + g_free (clip->id); + g_free (clip->track); + g_free (clip->anchor_href); + g_free (clip->anchor_text); + g_free (clip->img_src); + g_free (clip->img_alt); + g_free (clip->desc_text); + if (clip->meta) + g_value_array_free (clip->meta); + + if (G_OBJECT_CLASS (gst_cmml_tag_clip_parent_class)->finalize) + G_OBJECT_CLASS (gst_cmml_tag_clip_parent_class)->finalize (object); +} + +static void +gst_cmml_tag_clip_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + GstCmmlTagClip *clip = GST_CMML_TAG_CLIP (object); + + switch (property_id) { + case GST_CMML_TAG_CLIP_EMPTY: + clip->empty = g_value_get_boolean (value); + break; + case GST_CMML_TAG_CLIP_ID: + g_free (clip->id); + clip->id = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_CLIP_TRACK: + g_free (clip->track); + clip->track = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_CLIP_START_TIME: + clip->start_time = g_value_get_uint64 (value); + break; + case GST_CMML_TAG_CLIP_END_TIME: + clip->end_time = g_value_get_uint64 (value); + break; + case GST_CMML_TAG_CLIP_ANCHOR_HREF: + g_free (clip->anchor_href); + clip->anchor_href = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_CLIP_ANCHOR_TEXT: + g_free (clip->anchor_text); + clip->anchor_text = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_CLIP_IMG_SRC: + g_free (clip->img_src); + clip->img_src = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_CLIP_IMG_ALT: + g_free (clip->img_alt); + clip->img_alt = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_CLIP_DESC_TEXT: + g_free (clip->desc_text); + clip->desc_text = (guchar *) g_value_dup_string (value); + break; + case GST_CMML_TAG_CLIP_META: + { + GValueArray *va = (GValueArray *) g_value_get_boxed (value); + + if (clip->meta) + g_value_array_free (clip->meta); + + clip->meta = va != NULL ? g_value_array_copy (va) : NULL; + + break; + } + } +} + +static void +gst_cmml_tag_clip_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + GstCmmlTagClip *clip = GST_CMML_TAG_CLIP (object); + + switch (property_id) { + case GST_CMML_TAG_CLIP_EMPTY: + g_value_set_boolean (value, clip->empty); + break; + case GST_CMML_TAG_CLIP_ID: + g_value_set_string (value, (gchar *) clip->id); + break; + case GST_CMML_TAG_CLIP_TRACK: + g_value_set_string (value, (gchar *) clip->track); + break; + case GST_CMML_TAG_CLIP_START_TIME: + g_value_set_uint64 (value, clip->start_time); + break; + case GST_CMML_TAG_CLIP_END_TIME: + g_value_set_uint64 (value, clip->end_time); + break; + case GST_CMML_TAG_CLIP_ANCHOR_HREF: + g_value_set_string (value, (gchar *) clip->anchor_href); + break; + case GST_CMML_TAG_CLIP_ANCHOR_TEXT: + g_value_set_string (value, (gchar *) clip->anchor_text); + break; + case GST_CMML_TAG_CLIP_IMG_SRC: + g_value_set_string (value, (gchar *) clip->img_src); + break; + case GST_CMML_TAG_CLIP_IMG_ALT: + g_value_set_string (value, (gchar *) clip->img_alt); + break; + case GST_CMML_TAG_CLIP_DESC_TEXT: + g_value_set_string (value, (gchar *) clip->desc_text); + break; + case GST_CMML_TAG_CLIP_META: + g_value_set_boxed (value, clip->meta); + break; + } +} + +static void +gst_cmml_tag_clip_value_from_string_value (const GValue * src, GValue * dest) +{ + GstCmmlParser *parser; + const gchar *str; + guint size; + + parser = gst_cmml_parser_new (GST_CMML_PARSER_DECODE); + parser->user_data = dest; + parser->clip_callback = (GstCmmlParserClipCallback) set_object_on_value; + + gst_cmml_parser_parse_chunk (parser, default_preamble, + strlen (default_preamble), NULL); + + str = g_value_get_string (src); + size = strlen (str); + + gst_cmml_parser_parse_chunk (parser, str, size, NULL); + + gst_cmml_parser_free (parser); +} + +static void +set_object_on_value (GObject * tag, GValue * dest) +{ + g_value_take_object (dest, tag); +} diff --git a/ext/annodex/gstcmmltag.h b/ext/annodex/gstcmmltag.h new file mode 100644 index 0000000..e8c9bbb --- /dev/null +++ b/ext/annodex/gstcmmltag.h @@ -0,0 +1,133 @@ +/* + * gstcmmltag.h - GStreamer annodex CMML tag support + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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_CMML_TAG_H__ +#define __GST_CMML_TAG_H__ + +#include + +/* GstCmmlTagStream */ +#define GST_TYPE_CMML_TAG_STREAM (gst_cmml_tag_stream_get_type ()) +#define GST_CMML_TAG_STREAM(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + GST_TYPE_CMML_TAG_STREAM, GstCmmlTagStream)) +#define GST_CMML_TAG_STREAM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + GST_TYPE_CMML_TAG_STREAM, GstCmmlTagStreamClass)) +#define GST_CMML_TAG_STREAM_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + GST_TYPE_CMML_TAG_STREAM, GstCmmlTagStreamClass)) + +/* GstCmmlTagHead */ +#define GST_TYPE_CMML_TAG_HEAD (gst_cmml_tag_head_get_type ()) +#define GST_CMML_TAG_HEAD(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CMML_TAG_HEAD, GstCmmlTagHead)) +#define GST_CMML_TAG_HEAD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CMML_TAG_HEAD, GstCmmlTagHeadClass)) +#define GST_CMML_TAG_HEAD_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + GST_TYPE_CMML_TAG_HEAD, GstCmmlTagHeadClass)) + +/* GstCmmlTagClip */ +#define GST_TYPE_CMML_TAG_CLIP (gst_cmml_tag_clip_get_type ()) +#define GST_CMML_TAG_CLIP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CMML_TAG_CLIP, GstCmmlTagClip)) +#define GST_CMML_TAG_CLIP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CMML_TAG_CLIP, GstCmmlTagClipClass)) +#define GST_CMML_TAG_CLIP_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + GST_TYPE_CMML_TAG_CLIP, GstCmmlTagClipClass)) + +typedef struct _GstCmmlTagStream GstCmmlTagStream; +typedef struct _GstCmmlTagStreamClass GstCmmlTagStreamClass; +typedef struct _GstCmmlTagHead GstCmmlTagHead; +typedef struct _GstCmmlTagHeadClass GstCmmlTagHeadClass; +typedef struct _GstCmmlTagClip GstCmmlTagClip; +typedef struct _GstCmmlTagClipClass GstCmmlTagClipClass; + +struct _GstCmmlTagStream { + GObject object; + + guchar *timebase; + guchar *utc; + + GValueArray *imports; +}; + +struct _GstCmmlTagStreamClass { + GObjectClass parent_class; +}; + +struct _GstCmmlTagHead { + GObject object; + + guchar *title; /* title of the media */ + guchar *base; + GValueArray *meta; /* metadata attached to the media. + * The elements are positioned in key-value + * pairs ie (key, content, key2, content2, + * ...) + */ +}; + +struct _GstCmmlTagHeadClass { + GObjectClass parent_class; +}; + +struct _GstCmmlTagClip { + GObject object; + + gboolean empty; /* empty flag. An empty clip marks the + * end of the previous clip. + */ + + guchar *id; /* clip id */ + guchar *track; /* clip track */ + + GstClockTime start_time; /* clip start time */ + GstClockTime end_time; /* clip end time */ + + guchar *anchor_href; /* anchor href URI */ + guchar *anchor_text; /* anchor text */ + + guchar *img_src; /* image URI */ + guchar *img_alt; /* image alternative text */ + + guchar *desc_text; /* clip description */ + + GValueArray *meta; /* metadata attached to the clip + * The elements are positioned in key-value + * pairs ie (key, content, key2, content2, + * ...) + */ +}; + +struct _GstCmmlTagClipClass { + GObjectClass parent_class; +}; + +GType gst_cmml_tag_stream_get_type (void); +GType gst_cmml_tag_head_get_type (void); +GType gst_cmml_tag_clip_get_type (void); + +#endif /* __GST_CMML_TAG_H__ */ diff --git a/ext/annodex/gstcmmlutils.c b/ext/annodex/gstcmmlutils.c new file mode 100644 index 0000000..a66b3f0 --- /dev/null +++ b/ext/annodex/gstcmmlutils.c @@ -0,0 +1,388 @@ +/* + * gstcmmlutils.c - GStreamer CMML utility functions + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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 "gstcmmlutils.h" + +#include +#include +#include + +typedef struct +{ + GList *clips; + gpointer user_data; +} GstCmmlTrack; + +GstClockTime +gst_cmml_clock_time_from_npt (const gchar * time) +{ + GstClockTime res; + gint fields; + gint hours = 0; + gint minutes = 0; + gint seconds = 0; + gint mseconds = 0; + GstClockTime hours_t = 0, seconds_t = 0; + + if (!strncmp (time, "npt:", 4)) + time += 4; + + /* parse npt-hhmmss */ + fields = sscanf (time, "%d:%d:%d.%d", &hours, &minutes, &seconds, &mseconds); + if (fields == 4) { + if (hours < 0 || (guint) minutes > 59 || (guint) seconds > 59) + goto bad_input; + + hours_t = gst_util_uint64_scale (hours, GST_SECOND * 3600, 1); + if (hours_t == G_MAXUINT64) + goto overflow; + + seconds_t = seconds * GST_SECOND; + } else { + guint64 u64seconds; + + /* parse npt-sec */ + hours_t = 0; + minutes = 0; + fields = sscanf (time, "%" G_GUINT64_FORMAT ".%d", &u64seconds, &mseconds); + if (seconds < 0) + goto bad_input; + + seconds_t = gst_util_uint64_scale_int (u64seconds, GST_SECOND, 1); + if (seconds_t == G_MAXUINT64) + goto overflow; + } + + if ((guint) mseconds > 999) + goto bad_input; + + res = (minutes * 60) * GST_SECOND + mseconds * GST_MSECOND; + if (G_MAXUINT64 - hours_t - seconds_t < res) + goto overflow; + + res += hours_t + seconds_t; + + return res; + +bad_input: +overflow: + return GST_CLOCK_TIME_NONE; +} + +GstClockTime +gst_cmml_clock_time_from_smpte (const gchar * time) +{ + GstClockTime res; + GstClockTime hours_t; + gint hours, minutes, seconds; + gdouble framerate; + gfloat frames; + gint fields; + + if (!strncmp (time, "smpte-24:", 9)) { + framerate = 24.0; + time += 9; + } else if (!strncmp (time, "smpte-24-drop:", 14)) { + framerate = 23.976; + time += 14; + } else if (!strncmp (time, "smpte-25:", 9)) { + framerate = 25.0; + time += 9; + } else if (!strncmp (time, "smpte-30:", 9)) { + framerate = 30.0; + time += 9; + } else if (!strncmp (time, "smpte-30-drop:", 14)) { + framerate = 29.976; + time += 14; + } else if (!strncmp (time, "smpte-50:", 9)) { + framerate = 50.0; + time += 9; + } else if (!strncmp (time, "smpte-60:", 9)) { + framerate = 60.0; + time += 9; + } else if (!strncmp (time, "smpte-60-drop:", 14)) { + framerate = 59.94; + time += 14; + } else { + return GST_CLOCK_TIME_NONE; + } + + fields = sscanf (time, "%d:%d:%d:%f", &hours, &minutes, &seconds, &frames); + if (fields == 4) { + if (hours < 0 || (guint) minutes > 59 || (guint) seconds > 59 || + frames < 0 || frames > ceil (framerate)) { + res = GST_CLOCK_TIME_NONE; + } else { + hours_t = gst_util_uint64_scale (hours, GST_SECOND * 3600, 1); + if (hours_t == G_MAXUINT64) + goto overflow; + + res = ((minutes * 60) + seconds + (frames / framerate)) + * GST_SECOND; + if (G_MAXUINT64 - hours_t < res) + goto overflow; + + res = hours_t + res; + } + } else { + res = GST_CLOCK_TIME_NONE; + } + + return res; +overflow: + return GST_CLOCK_TIME_NONE; +} + +gchar * +gst_cmml_clock_time_to_npt (const GstClockTime time) +{ + guint seconds, hours, minutes, mseconds; + gchar *res; + + g_return_val_if_fail (time != GST_CLOCK_TIME_NONE, NULL); + + hours = time / (GST_SECOND * 3600); + minutes = (time / ((GST_SECOND * 60)) % 60); + seconds = (time / GST_SECOND) % 60; + mseconds = (time % GST_SECOND) / GST_MSECOND; + + if (mseconds < 100) + mseconds *= 10; + + res = g_strdup_printf ("%u:%02u:%02u.%03u", + hours, minutes, seconds, mseconds); + + return res; +} + +gint64 +gst_cmml_clock_time_to_granule (GstClockTime prev_time, + GstClockTime current_time, gint64 granulerate_n, gint64 granulerate_d, + guint8 granuleshift) +{ + guint64 keyindex, keyoffset, granulepos, maxoffset; + gint64 granulerate; + + g_return_val_if_fail (granulerate_d != 0, -1); + g_return_val_if_fail (granuleshift > 0, -1); + g_return_val_if_fail (granuleshift <= 64, -1); + + if (prev_time == GST_CLOCK_TIME_NONE) + prev_time = 0; + + if (prev_time > current_time) + return -1; + + /* GST_SECOND / (granulerate_n / granulerate_d) */ + granulerate = gst_util_uint64_scale (GST_SECOND, + granulerate_d, granulerate_n); + + prev_time = prev_time / granulerate; + + /* granuleshift == 64 should be a << 0 shift, which is defined */ + maxoffset = ((guint64) 1 << (64 - granuleshift)) - 1; + if (prev_time > maxoffset) + /* we need more than 64 - granuleshift bits to encode prev_time */ + goto overflow; + + keyindex = prev_time << granuleshift; + + keyoffset = (current_time / granulerate) - prev_time; + /* make sure we don't shift to the limits of the types as this is undefined. */ + if (granuleshift == 64) + maxoffset = G_MAXUINT64; + else + maxoffset = ((guint64) 1 << granuleshift) - 1; + + if (keyoffset > maxoffset) + /* we need more than granuleshift bits to encode prev_time - current_time */ + goto overflow; + + granulepos = keyindex + keyoffset; + + return granulepos; + +overflow: + return -1; +} + +/* track list */ +GHashTable * +gst_cmml_track_list_new (void) +{ + return g_hash_table_new (g_str_hash, g_str_equal); +} + +static gboolean +gst_cmml_track_list_destroy_track (gchar * key, + GstCmmlTrack * track, gpointer user_data) +{ + GList *walk; + + for (walk = track->clips; walk; walk = g_list_next (walk)) + g_object_unref (G_OBJECT (walk->data)); + + g_free (key); + g_list_free (track->clips); + g_free (track); + + return TRUE; +} + +void +gst_cmml_track_list_destroy (GHashTable * tracks) +{ + g_hash_table_foreach_remove (tracks, + (GHRFunc) gst_cmml_track_list_destroy_track, NULL); + g_hash_table_destroy (tracks); +} + +static gint +gst_cmml_track_list_compare_clips (GstCmmlTagClip * a, GstCmmlTagClip * b) +{ + if (a->start_time < b->start_time) + return -1; + + return 1; +} + +void +gst_cmml_track_list_add_clip (GHashTable * tracks, GstCmmlTagClip * clip) +{ + gpointer key, value; + GstCmmlTrack *track; + gchar *track_name; + + g_return_if_fail (clip->track != NULL); + + if (g_hash_table_lookup_extended (tracks, clip->track, &key, &value)) { + track_name = (gchar *) key; + track = (GstCmmlTrack *) value; + } else { + track_name = g_strdup ((gchar *) clip->track); + track = g_new0 (GstCmmlTrack, 1); + g_hash_table_insert (tracks, track_name, track); + } + + /* add clip to the tracklist */ + track->clips = g_list_insert_sorted (track->clips, g_object_ref (clip), + (GCompareFunc) gst_cmml_track_list_compare_clips); +} + +gboolean +gst_cmml_track_list_del_clip (GHashTable * tracks, GstCmmlTagClip * clip) +{ + GstCmmlTrack *track; + GList *link; + gboolean res = FALSE; + + g_return_val_if_fail (clip->track != NULL, FALSE); + + track = g_hash_table_lookup (tracks, clip->track); + if (track) { + link = g_list_find (track->clips, clip); + if (link) { + g_object_unref (G_OBJECT (link->data)); + track->clips = g_list_delete_link (track->clips, link); + res = TRUE; + } + } + + return res; +} + +gboolean +gst_cmml_track_list_has_clip (GHashTable * tracks, GstCmmlTagClip * clip) +{ + GstCmmlTrack *track; + GList *walk; + GstCmmlTagClip *tmp; + gboolean res = FALSE; + + track = g_hash_table_lookup (tracks, (gchar *) clip->track); + if (track) { + for (walk = track->clips; walk; walk = g_list_next (walk)) { + tmp = GST_CMML_TAG_CLIP (walk->data); + if (tmp->start_time == clip->start_time) { + res = TRUE; + break; + } + } + } + + return res; +} + +static gboolean +gst_cmml_track_list_merge_track (gchar * track_name, + GstCmmlTrack * track, GList ** list) +{ + GList *walk; + GstCmmlTagClip *cur; + + for (walk = track->clips; walk; walk = g_list_next (walk)) { + cur = GST_CMML_TAG_CLIP (walk->data); + *list = g_list_insert_sorted (*list, cur, + (GCompareFunc) gst_cmml_track_list_compare_clips); + } + + return TRUE; +} + +GList * +gst_cmml_track_list_get_track_clips (GHashTable * tracks, + const gchar * track_name) +{ + GstCmmlTrack *track; + + g_return_val_if_fail (track_name != NULL, NULL); + + track = g_hash_table_lookup (tracks, track_name); + return track ? track->clips : NULL; +} + +GList * +gst_cmml_track_list_get_clips (GHashTable * tracks) +{ + GList *list = NULL; + + g_hash_table_foreach (tracks, + (GHFunc) gst_cmml_track_list_merge_track, &list); + return list; +} + +GstCmmlTagClip * +gst_cmml_track_list_get_track_last_clip (GHashTable * tracks, + const gchar * track_name) +{ + GstCmmlTrack *track; + GList *res = NULL; + + g_return_val_if_fail (track_name != NULL, NULL); + + track = g_hash_table_lookup (tracks, track_name); + if (track && track->clips) + res = g_list_last (track->clips); + + return res ? GST_CMML_TAG_CLIP (res->data) : NULL; +} diff --git a/ext/annodex/gstcmmlutils.h b/ext/annodex/gstcmmlutils.h new file mode 100644 index 0000000..5aa2416 --- /dev/null +++ b/ext/annodex/gstcmmlutils.h @@ -0,0 +1,53 @@ +/* + * gstcmmlutils.h - GStreamer CMML utility functions + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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_CMML_CLOCK_TIME_H__ +#define __GST_CMML_CLOCK_TIME_H__ + +#include +#include "gstcmmltag.h" + +/* time utils */ +GstClockTime gst_cmml_clock_time_from_npt (const gchar * time); +GstClockTime gst_cmml_clock_time_from_smpte (const gchar * time); +gchar * gst_cmml_clock_time_to_npt (const GstClockTime time); +gint64 gst_cmml_clock_time_to_granule (GstClockTime prev_time, + GstClockTime current_time, gint64 granulerate_n, gint64 granulerate_d, + guint8 granuleshift); + +/* tracklist */ +GHashTable * gst_cmml_track_list_new (void); +void gst_cmml_track_list_destroy (GHashTable * tracks); +void gst_cmml_track_list_add_clip (GHashTable * tracks, GstCmmlTagClip * clip); +gboolean gst_cmml_track_list_del_clip (GHashTable * tracks, + GstCmmlTagClip * clip); +gboolean gst_cmml_track_list_has_clip (GHashTable * tracks, + GstCmmlTagClip * clip); +GstCmmlTagClip * gst_cmml_track_list_get_track_last_clip (GHashTable * tracks, + const gchar * track_name); +GList * gst_cmml_track_list_get_track_clips (GHashTable * tracks, + const gchar * track_name); +GList * gst_cmml_track_list_get_clips (GHashTable * tracks); +void gst_cmml_track_list_set_track_data (GHashTable * tracks, gpointer data); +gpointer gst_cmml_track_list_get_track_data (GHashTable * tracks); +#endif /* __GST_CMML_CLOCK_TIME_H__ */ diff --git a/ext/cairo/Makefile.am b/ext/cairo/Makefile.am new file mode 100644 index 0000000..7fa8fdc --- /dev/null +++ b/ext/cairo/Makefile.am @@ -0,0 +1,45 @@ +plugin_LTLIBRARIES = libgstcairo.la + +if USE_CAIRO_GOBJECT +glib_enum_define = GST_CAIRO +glib_gen_prefix = gst_cairo +glib_gen_basename = gstcairo + +include $(top_srcdir)/common/gst-glib-gen.mak + +built_sources = gstcairo-marshal.c +built_headers = gstcairo-marshal.h + +BUILT_SOURCES = $(built_sources) $(built_headers) + +gstcairo_gobject_dep_sources = gstcairooverlay.c +gstcairo_gobject_dep_headers = gstcairooverlay.h + +CLEANFILES = $(BUILT_SOURCES) +endif + +noinst_HEADERS = \ + gsttimeoverlay.h \ + gsttextoverlay.h \ + gstcairorender.h \ + $(gstcairo_gobject_dep_headers) +libgstcairo_la_SOURCES = \ + gstcairo.c \ + gsttimeoverlay.c \ + gsttextoverlay.c \ + gstcairorender.c \ + $(gstcairo_gobject_dep_sources) +nodist_libgstcairo_la_SOURCES = \ + $(built_sources) +libgstcairo_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) $(CAIRO_CFLAGS) $(CAIRO_GOBJECT_CFLAGS) +libgstcairo_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(CAIRO_LIBS) $(CAIRO_GOBJECT_LIBS) $(LIBM) +libgstcairo_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstcairo_la_LIBTOOLFLAGS = --tag=disable-static + +EXTRA_DIST = gstcairo-marshal.list + diff --git a/ext/cairo/Makefile.in b/ext/cairo/Makefile.in new file mode 100644 index 0000000..84b71b4 --- /dev/null +++ b/ext/cairo/Makefile.in @@ -0,0 +1,942 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# these are the variables your Makefile.am should set +# the example is based on the colorbalance interface + +#glib_enum_headers=$(colorbalance_headers) +#glib_enum_define=GST_COLOR_BALANCE +#glib_gen_prefix=gst_color_balance +#glib_gen_basename=colorbalance + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/common/gst-glib-gen.mak +subdir = ext/cairo +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstcairo_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__libgstcairo_la_SOURCES_DIST = gstcairo.c gsttimeoverlay.c \ + gsttextoverlay.c gstcairorender.c gstcairooverlay.c +@USE_CAIRO_GOBJECT_TRUE@am__objects_1 = \ +@USE_CAIRO_GOBJECT_TRUE@ libgstcairo_la-gstcairooverlay.lo +am_libgstcairo_la_OBJECTS = libgstcairo_la-gstcairo.lo \ + libgstcairo_la-gsttimeoverlay.lo \ + libgstcairo_la-gsttextoverlay.lo \ + libgstcairo_la-gstcairorender.lo $(am__objects_1) +@USE_CAIRO_GOBJECT_TRUE@am__objects_2 = \ +@USE_CAIRO_GOBJECT_TRUE@ libgstcairo_la-gstcairo-marshal.lo +nodist_libgstcairo_la_OBJECTS = $(am__objects_2) +libgstcairo_la_OBJECTS = $(am_libgstcairo_la_OBJECTS) \ + $(nodist_libgstcairo_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstcairo_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstcairo_la_CFLAGS) $(CFLAGS) \ + $(libgstcairo_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstcairo_la_SOURCES) $(nodist_libgstcairo_la_SOURCES) +DIST_SOURCES = $(am__libgstcairo_la_SOURCES_DIST) +am__noinst_HEADERS_DIST = gsttimeoverlay.h gsttextoverlay.h \ + gstcairorender.h gstcairooverlay.h +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstcairo.la +@USE_CAIRO_GOBJECT_TRUE@glib_enum_define = GST_CAIRO +@USE_CAIRO_GOBJECT_TRUE@glib_gen_prefix = gst_cairo +@USE_CAIRO_GOBJECT_TRUE@glib_gen_basename = gstcairo +@USE_CAIRO_GOBJECT_TRUE@enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") +@USE_CAIRO_GOBJECT_TRUE@built_sources = gstcairo-marshal.c +@USE_CAIRO_GOBJECT_TRUE@built_headers = gstcairo-marshal.h +@USE_CAIRO_GOBJECT_TRUE@BUILT_SOURCES = $(built_sources) $(built_headers) +@USE_CAIRO_GOBJECT_TRUE@gstcairo_gobject_dep_sources = gstcairooverlay.c +@USE_CAIRO_GOBJECT_TRUE@gstcairo_gobject_dep_headers = gstcairooverlay.h +@USE_CAIRO_GOBJECT_TRUE@CLEANFILES = $(BUILT_SOURCES) +noinst_HEADERS = \ + gsttimeoverlay.h \ + gsttextoverlay.h \ + gstcairorender.h \ + $(gstcairo_gobject_dep_headers) + +libgstcairo_la_SOURCES = \ + gstcairo.c \ + gsttimeoverlay.c \ + gsttextoverlay.c \ + gstcairorender.c \ + $(gstcairo_gobject_dep_sources) + +nodist_libgstcairo_la_SOURCES = \ + $(built_sources) + +libgstcairo_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) $(CAIRO_CFLAGS) $(CAIRO_GOBJECT_CFLAGS) + +libgstcairo_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(CAIRO_LIBS) $(CAIRO_GOBJECT_LIBS) $(LIBM) + +libgstcairo_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstcairo_la_LIBTOOLFLAGS = --tag=disable-static +EXTRA_DIST = gstcairo-marshal.list +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/gst-glib-gen.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/cairo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/cairo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/gst-glib-gen.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstcairo.la: $(libgstcairo_la_OBJECTS) $(libgstcairo_la_DEPENDENCIES) $(EXTRA_libgstcairo_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstcairo_la_LINK) -rpath $(plugindir) $(libgstcairo_la_OBJECTS) $(libgstcairo_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gstcairo-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gstcairo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gstcairooverlay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gstcairorender.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gsttextoverlay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gsttimeoverlay.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstcairo_la-gstcairo.lo: gstcairo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gstcairo.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gstcairo.Tpo -c -o libgstcairo_la-gstcairo.lo `test -f 'gstcairo.c' || echo '$(srcdir)/'`gstcairo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gstcairo.Tpo $(DEPDIR)/libgstcairo_la-gstcairo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcairo.c' object='libgstcairo_la-gstcairo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gstcairo.lo `test -f 'gstcairo.c' || echo '$(srcdir)/'`gstcairo.c + +libgstcairo_la-gsttimeoverlay.lo: gsttimeoverlay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gsttimeoverlay.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gsttimeoverlay.Tpo -c -o libgstcairo_la-gsttimeoverlay.lo `test -f 'gsttimeoverlay.c' || echo '$(srcdir)/'`gsttimeoverlay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gsttimeoverlay.Tpo $(DEPDIR)/libgstcairo_la-gsttimeoverlay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttimeoverlay.c' object='libgstcairo_la-gsttimeoverlay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gsttimeoverlay.lo `test -f 'gsttimeoverlay.c' || echo '$(srcdir)/'`gsttimeoverlay.c + +libgstcairo_la-gsttextoverlay.lo: gsttextoverlay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gsttextoverlay.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gsttextoverlay.Tpo -c -o libgstcairo_la-gsttextoverlay.lo `test -f 'gsttextoverlay.c' || echo '$(srcdir)/'`gsttextoverlay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gsttextoverlay.Tpo $(DEPDIR)/libgstcairo_la-gsttextoverlay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttextoverlay.c' object='libgstcairo_la-gsttextoverlay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gsttextoverlay.lo `test -f 'gsttextoverlay.c' || echo '$(srcdir)/'`gsttextoverlay.c + +libgstcairo_la-gstcairorender.lo: gstcairorender.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gstcairorender.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gstcairorender.Tpo -c -o libgstcairo_la-gstcairorender.lo `test -f 'gstcairorender.c' || echo '$(srcdir)/'`gstcairorender.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gstcairorender.Tpo $(DEPDIR)/libgstcairo_la-gstcairorender.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcairorender.c' object='libgstcairo_la-gstcairorender.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gstcairorender.lo `test -f 'gstcairorender.c' || echo '$(srcdir)/'`gstcairorender.c + +libgstcairo_la-gstcairooverlay.lo: gstcairooverlay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gstcairooverlay.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gstcairooverlay.Tpo -c -o libgstcairo_la-gstcairooverlay.lo `test -f 'gstcairooverlay.c' || echo '$(srcdir)/'`gstcairooverlay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gstcairooverlay.Tpo $(DEPDIR)/libgstcairo_la-gstcairooverlay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcairooverlay.c' object='libgstcairo_la-gstcairooverlay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gstcairooverlay.lo `test -f 'gstcairooverlay.c' || echo '$(srcdir)/'`gstcairooverlay.c + +libgstcairo_la-gstcairo-marshal.lo: gstcairo-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gstcairo-marshal.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gstcairo-marshal.Tpo -c -o libgstcairo_la-gstcairo-marshal.lo `test -f 'gstcairo-marshal.c' || echo '$(srcdir)/'`gstcairo-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gstcairo-marshal.Tpo $(DEPDIR)/libgstcairo_la-gstcairo-marshal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcairo-marshal.c' object='libgstcairo_la-gstcairo-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gstcairo-marshal.lo `test -f 'gstcairo-marshal.c' || echo '$(srcdir)/'`gstcairo-marshal.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# these are all the rules generating the relevant files +@USE_CAIRO_GOBJECT_TRUE@$(glib_gen_basename)-marshal.h: $(glib_gen_basename)-marshal.list +@USE_CAIRO_GOBJECT_TRUE@ $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_gen_prefix)_marshal $^ > $(glib_gen_basename)-marshal.h.tmp && \ +@USE_CAIRO_GOBJECT_TRUE@ mv $(glib_gen_basename)-marshal.h.tmp $(glib_gen_basename)-marshal.h + +@USE_CAIRO_GOBJECT_TRUE@$(glib_gen_basename)-marshal.c: $(glib_gen_basename)-marshal.list +@USE_CAIRO_GOBJECT_TRUE@ $(AM_V_GEN)echo "#include \"$(glib_gen_basename)-marshal.h\"" >> $(glib_gen_basename)-marshal.c.tmp && \ +@USE_CAIRO_GOBJECT_TRUE@ glib-genmarshal --body --prefix=$(glib_gen_prefix)_marshal $^ >> $(glib_gen_basename)-marshal.c.tmp && \ +@USE_CAIRO_GOBJECT_TRUE@ mv $(glib_gen_basename)-marshal.c.tmp $(glib_gen_basename)-marshal.c + +@USE_CAIRO_GOBJECT_TRUE@$(glib_gen_basename)-enumtypes.h: $(glib_enum_headers) +@USE_CAIRO_GOBJECT_TRUE@ $(AM_V_GEN)glib-mkenums \ +@USE_CAIRO_GOBJECT_TRUE@ --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ +@USE_CAIRO_GOBJECT_TRUE@ --fprod "\n/* enumerations from \"@filename@\" */\n" \ +@USE_CAIRO_GOBJECT_TRUE@ --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ +@USE_CAIRO_GOBJECT_TRUE@ --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ +@USE_CAIRO_GOBJECT_TRUE@ $^ > $@ + +@USE_CAIRO_GOBJECT_TRUE@$(glib_gen_basename)-enumtypes.c: $(glib_enum_headers) +@USE_CAIRO_GOBJECT_TRUE@ @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi +@USE_CAIRO_GOBJECT_TRUE@ $(AM_V_GEN)glib-mkenums \ +@USE_CAIRO_GOBJECT_TRUE@ --fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \ +@USE_CAIRO_GOBJECT_TRUE@ --fprod "\n/* enumerations from \"@filename@\" */" \ +@USE_CAIRO_GOBJECT_TRUE@ --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ +@USE_CAIRO_GOBJECT_TRUE@ --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ +@USE_CAIRO_GOBJECT_TRUE@ --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ +@USE_CAIRO_GOBJECT_TRUE@ $^ > $@ + +# a hack rule to make sure .Plo files exist because they get include'd +# from Makefile's +@USE_CAIRO_GOBJECT_TRUE@.deps/%-marshal.Plo: +@USE_CAIRO_GOBJECT_TRUE@ @touch $@ + +@USE_CAIRO_GOBJECT_TRUE@.deps/%-enumtypes.Plo: +@USE_CAIRO_GOBJECT_TRUE@ @touch $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/cairo/gstcairo-marshal.list b/ext/cairo/gstcairo-marshal.list new file mode 100644 index 0000000..b637870 --- /dev/null +++ b/ext/cairo/gstcairo-marshal.list @@ -0,0 +1,2 @@ +VOID:BOXED,UINT64,UINT64 +VOID:BOXED diff --git a/ext/cairo/gstcairo.c b/ext/cairo/gstcairo.c new file mode 100644 index 0000000..5d4c323 --- /dev/null +++ b/ext/cairo/gstcairo.c @@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003,2004> David Schleef + * + * 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 +#include +#include + +#ifdef HAVE_CAIRO_GOBJECT +#include +#endif + +#include +#include + +GST_DEBUG_CATEGORY (cairo_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_element_register (plugin, "cairotextoverlay", GST_RANK_NONE, + GST_TYPE_CAIRO_TEXT_OVERLAY); + gst_element_register (plugin, "cairotimeoverlay", GST_RANK_NONE, + GST_TYPE_CAIRO_TIME_OVERLAY); +#ifdef HAVE_CAIRO_GOBJECT + gst_element_register (plugin, "cairooverlay", GST_RANK_NONE, + GST_TYPE_CAIRO_OVERLAY); +#endif + gst_element_register (plugin, "cairorender", GST_RANK_SECONDARY, + GST_TYPE_CAIRO_RENDER); + + GST_DEBUG_CATEGORY_INIT (cairo_debug, "cairo", 0, "Cairo elements"); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "cairo", + "Cairo-based elements", plugin_init, VERSION, + GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/cairo/gstcairooverlay.c b/ext/cairo/gstcairooverlay.c new file mode 100644 index 0000000..a19aed6 --- /dev/null +++ b/ext/cairo/gstcairooverlay.c @@ -0,0 +1,250 @@ +/* GStreamer + * Copyright (C) <2011> Jon Nordby + * + * 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-cairooverlay + * + * cairooverlay renders an overlay using a application provided render function. + * + * The full example can be found in tests/examples/cairo/cairo_overlay.c + * + * Example code + * |[ + * + * #include <gst/gst.h> + * #include <gst/video/video.h> + * + * ... + * + * typedef struct { + * gboolean valid; + * int width; + * int height; + * } CairoOverlayState; + * + * ... + * + * static void + * prepare_overlay (GstElement * overlay, GstCaps * caps, gpointer user_data) + * { + * CairoOverlayState *state = (CairoOverlayState *)user_data; + * + * gst_video_format_parse_caps (caps, NULL, &state->width, &state->height); + * state->valid = TRUE; + * } + * + * static void + * draw_overlay (GstElement * overlay, cairo_t * cr, guint64 timestamp, + * guint64 duration, gpointer user_data) + * { + * CairoOverlayState *s = (CairoOverlayState *)user_data; + * double scale; + * + * if (!s->valid) + * return; + * + * scale = 2*(((timestamp/(int)1e7) % 70)+30)/100.0; + * cairo_translate(cr, s->width/2, (s->height/2)-30); + * cairo_scale (cr, scale, scale); + * + * cairo_move_to (cr, 0, 0); + * cairo_curve_to (cr, 0,-30, -50,-30, -50,0); + * cairo_curve_to (cr, -50,30, 0,35, 0,60 ); + * cairo_curve_to (cr, 0,35, 50,30, 50,0 ); * + * cairo_curve_to (cr, 50,-30, 0,-30, 0,0 ); + * cairo_set_source_rgba (cr, 0.9, 0.0, 0.1, 0.7); + * cairo_fill (cr); + * } + * + * ... + * + * cairo_overlay = gst_element_factory_make ("cairooverlay", "overlay"); + * + * g_signal_connect (cairo_overlay, "draw", G_CALLBACK (draw_overlay), + * overlay_state); + * g_signal_connect (cairo_overlay, "caps-changed", + * G_CALLBACK (prepare_overlay), overlay_state); + * ... + * + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcairooverlay.h" +#include "gstcairo-marshal.h" + +#include + +#include + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define TEMPLATE_CAPS GST_VIDEO_CAPS_BGRx " ; " GST_VIDEO_CAPS_BGRA " ; " +#else +#define TEMPLATE_CAPS GST_VIDEO_CAPS_xRGB " ; " GST_VIDEO_CAPS_ARGB " ; " + +#endif + +static GstStaticPadTemplate gst_cairo_overlay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (TEMPLATE_CAPS) + ); + +static GstStaticPadTemplate gst_cairo_overlay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (TEMPLATE_CAPS) + ); + + +GST_BOILERPLATE (GstCairoOverlay, gst_cairo_overlay, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +enum +{ + SIGNAL_DRAW, + SIGNAL_CAPS_CHANGED, + N_SIGNALS +}; + +static guint gst_cairo_overlay_signals[N_SIGNALS]; + +static gboolean +gst_cairo_overlay_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstCairoOverlay *overlay = GST_CAIRO_OVERLAY (btrans); + gboolean ret; + + ret = + gst_video_format_parse_caps (incaps, &overlay->format, &overlay->width, + &overlay->height); + if (G_UNLIKELY (!ret)) + return FALSE; + + g_signal_emit (overlay, gst_cairo_overlay_signals[SIGNAL_CAPS_CHANGED], 0, + incaps, NULL); + + return ret; +} + +static GstFlowReturn +gst_cairo_overlay_transform_ip (GstBaseTransform * btrans, GstBuffer * buf) +{ + + GstCairoOverlay *overlay = GST_CAIRO_OVERLAY (btrans); + cairo_surface_t *surface; + cairo_t *cr; + cairo_format_t format; + + format = (overlay->format == GST_VIDEO_FORMAT_ARGB + || overlay->format == GST_VIDEO_FORMAT_BGRA) ? + CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24; + + surface = + cairo_image_surface_create_for_data (GST_BUFFER_DATA (buf), format, + overlay->width, overlay->height, overlay->width * 4); + if (G_UNLIKELY (!surface)) + return GST_FLOW_ERROR; + + cr = cairo_create (surface); + if (G_UNLIKELY (!cr)) { + cairo_surface_destroy (surface); + return GST_FLOW_ERROR; + } + + g_signal_emit (overlay, gst_cairo_overlay_signals[SIGNAL_DRAW], 0, + cr, GST_BUFFER_TIMESTAMP (buf), GST_BUFFER_DURATION (buf), NULL); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + return GST_FLOW_OK; +} + +static void +gst_cairo_overlay_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Cairo overlay", + "Filter/Editor/Video", + "Render overlay on a video stream using Cairo", + "Jon Nordby "); + + gst_element_class_add_static_pad_template (element_class, + &gst_cairo_overlay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_cairo_overlay_src_template); +} + +static void +gst_cairo_overlay_class_init (GstCairoOverlayClass * klass) +{ + GstBaseTransformClass *trans_class; + + trans_class = (GstBaseTransformClass *) klass; + + trans_class->set_caps = gst_cairo_overlay_set_caps; + trans_class->transform_ip = gst_cairo_overlay_transform_ip; + + /** + * GstCairoOverlay::draw: + * @overlay: Overlay element emitting the signal. + * @cr: Cairo context to draw to. + * @timestamp: Timestamp (see #GstClockTime) of the current buffer. + * @duration: Duration (see #GstClockTime) of the current buffer. + * + * This signal is emitted when the overlay should be drawn. + */ + gst_cairo_overlay_signals[SIGNAL_DRAW] = + g_signal_new ("draw", + G_TYPE_FROM_CLASS (klass), + 0, + 0, + NULL, + NULL, + gst_cairo_marshal_VOID__BOXED_UINT64_UINT64, + G_TYPE_NONE, 3, CAIRO_GOBJECT_TYPE_CONTEXT, G_TYPE_UINT64, G_TYPE_UINT64); + + /** + * GstCairoOverlay::caps-changed: + * @overlay: Overlay element emitting the signal. + * @caps: The #GstCaps of the element. + * + * This signal is emitted when the caps of the element has changed. + */ + gst_cairo_overlay_signals[SIGNAL_CAPS_CHANGED] = + g_signal_new ("caps-changed", + G_TYPE_FROM_CLASS (klass), + 0, + 0, + NULL, NULL, gst_cairo_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_CAPS); +} + +static void +gst_cairo_overlay_init (GstCairoOverlay * overlay, GstCairoOverlayClass * klass) +{ +} diff --git a/ext/cairo/gstcairooverlay.h b/ext/cairo/gstcairooverlay.h new file mode 100644 index 0000000..0c1ad27 --- /dev/null +++ b/ext/cairo/gstcairooverlay.h @@ -0,0 +1,63 @@ +/* GStreamer + * Copyright (C) <2011> Jon Nordby + * + * 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_CAIRO_OVERLAY_H__ +#define __GST_CAIRO_OVERLAY_H__ + +#include +#include +#include + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_CAIRO_OVERLAY \ + (gst_cairo_overlay_get_type()) +#define GST_CAIRO_OVERLAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAIRO_OVERLAY,GstCairoOverlay)) +#define GST_CAIRO_OVERLAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAIRO_OVERLAY,GstCairoOverlayClass)) +#define GST_IS_CAIRO_OVERLAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAIRO_OVERLAY)) +#define GST_IS_CAIRO_OVERLAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAIRO_OVERLAY)) + +typedef struct _GstCairoOverlay GstCairoOverlay; +typedef struct _GstCairoOverlayClass GstCairoOverlayClass; + +struct _GstCairoOverlay { + GstVideoFilter parent_instance; + + /* < private > */ + GstVideoFormat format; + gint width; + gint height; +}; + +struct _GstCairoOverlayClass { + GstVideoFilterClass parent_class; +}; + +GType gst_cairo_overlay_get_type(void); + +G_END_DECLS + +#endif /* __GST_CAIRO_OVERLAY_H__ */ diff --git a/ext/cairo/gstcairorender.c b/ext/cairo/gstcairorender.c new file mode 100644 index 0000000..870ac17 --- /dev/null +++ b/ext/cairo/gstcairorender.c @@ -0,0 +1,383 @@ +/* GStreamer + * + * Copyright (C) 2006-2009 Lutz Mueller + * + * 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-cairorender + * + * cairorender encodes a video stream into PDF, SVG, PNG or Postscript + * + * + * Example launch line + * |[ + * gst-launch videotestsrc num-buffers=3 ! cairorender ! "application/pdf" ! filesink location=test.pdf + * ]| + * + */ + +#include "gstcairorender.h" + +#include +#include +#ifdef CAIRO_HAS_PS_SURFACE +#include +#endif +#ifdef CAIRO_HAS_PDF_SURFACE +#include +#endif +#ifdef CAIRO_HAS_SVG_SURFACE +#include +#endif + +#include + +#include + +GST_DEBUG_CATEGORY_STATIC (cairo_render_debug); +#define GST_CAT_DEFAULT cairo_render_debug + +static gboolean +gst_cairo_render_event (GstPad * pad, GstEvent * e) +{ + GstCairoRender *c = GST_CAIRO_RENDER (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (e)) { + case GST_EVENT_EOS: + if (c->surface) + cairo_surface_finish (c->surface); + break; + default: + break; + } + return gst_pad_event_default (pad, e); +} + +static cairo_status_t +write_func (void *closure, const unsigned char *data, unsigned int length) +{ + GstCairoRender *c = GST_CAIRO_RENDER (closure); + GstBuffer *buf; + GstFlowReturn r; + + buf = gst_buffer_new (); + gst_buffer_set_data (buf, (guint8 *) data, length); + gst_buffer_set_caps (buf, GST_PAD_CAPS (c->src)); + if ((r = gst_pad_push (c->src, buf)) != GST_FLOW_OK) { + GST_DEBUG_OBJECT (c, "Could not pass on buffer: %s.", + gst_flow_get_name (r)); + return CAIRO_STATUS_WRITE_ERROR; + } + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +read_buffer (void *closure, unsigned char *data, unsigned int length) +{ + GstBuffer *buf = GST_BUFFER (closure); + + if (GST_BUFFER_OFFSET (buf) + length > GST_BUFFER_SIZE (buf)) + return CAIRO_STATUS_READ_ERROR; + memcpy (data, GST_BUFFER_DATA (buf) + GST_BUFFER_OFFSET (buf), length); + GST_BUFFER_OFFSET (buf) += length; + return CAIRO_STATUS_SUCCESS; +} + +static gboolean +gst_cairo_render_push_surface (GstCairoRender * c, cairo_surface_t * surface) +{ + cairo_status_t s = 0; + cairo_t *cr; + + if (!c->surface) { + s = cairo_surface_write_to_png_stream (surface, write_func, c); + cairo_surface_destroy (surface); + if (s != CAIRO_STATUS_SUCCESS) { + GST_DEBUG_OBJECT (c, "Could not create PNG stream: %s.", + cairo_status_to_string (s)); + return FALSE; + } + return TRUE; + } + + cr = cairo_create (c->surface); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_show_page (cr); + cairo_destroy (cr); + cairo_surface_destroy (surface); + return (TRUE); +} + +static GstFlowReturn +gst_cairo_render_chain (GstPad * pad, GstBuffer * buf) +{ + GstCairoRender *c = GST_CAIRO_RENDER (GST_PAD_PARENT (pad)); + cairo_surface_t *s; + gboolean success; + + if (G_UNLIKELY (c->width <= 0 || c->height <= 0 || c->stride <= 0)) + return GST_FLOW_NOT_NEGOTIATED; + + if (c->png) { + GST_BUFFER_OFFSET (buf) = 0; + s = cairo_image_surface_create_from_png_stream (read_buffer, buf); + } else { + if (c->format == CAIRO_FORMAT_ARGB32) { + guint i, j; + guint8 *data = GST_BUFFER_DATA (buf); + + buf = gst_buffer_make_writable (buf); + + /* Cairo ARGB is pre-multiplied with the alpha + * value, i.e. 0x80008000 is half transparent + * green + */ + for (i = 0; i < c->height; i++) { + for (j = 0; j < c->width; j++) { +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + guint8 alpha = data[3]; + + data[0] = (data[0] * alpha) >> 8; + data[1] = (data[1] * alpha) >> 8; + data[2] = (data[2] * alpha) >> 8; +#else + guint8 alpha = data[0]; + + data[1] = (data[1] * alpha) >> 8; + data[2] = (data[2] * alpha) >> 8; + data[3] = (data[3] * alpha) >> 8; +#endif + data += 4; + } + } + } + + s = cairo_image_surface_create_for_data (GST_BUFFER_DATA (buf), + c->format, c->width, c->height, c->stride); + } + + success = gst_cairo_render_push_surface (c, s); + gst_buffer_unref (buf); + return success ? GST_FLOW_OK : GST_FLOW_ERROR; +} + +static gboolean +gst_cairo_render_setcaps_sink (GstPad * pad, GstCaps * caps) +{ + GstCairoRender *c = GST_CAIRO_RENDER (GST_PAD_PARENT (pad)); + GstStructure *s = gst_caps_get_structure (caps, 0); + const gchar *mime = gst_structure_get_name (s); + gint fps_n = 0, fps_d = 1; + gint w, h; + + GST_DEBUG_OBJECT (c, "Got caps (%s).", mime); + if ((c->png = !strcmp (mime, "image/png"))) + return TRUE; + + /* Width and height */ + if (!gst_structure_get_int (s, "width", &c->width) || + !gst_structure_get_int (s, "height", &c->height)) { + GST_ERROR_OBJECT (c, "Invalid caps"); + return FALSE; + } + + /* Colorspace */ + if (!strcmp (mime, "video/x-raw-yuv") || !strcmp (mime, "video/x-raw-grey")) { + c->format = CAIRO_FORMAT_A8; + c->stride = GST_ROUND_UP_4 (c->width); + } else if (!strcmp (mime, "video/x-raw-rgb")) { + gint bpp; + + if (!gst_structure_get_int (s, "bpp", &bpp)) { + GST_ERROR_OBJECT (c, "Invalid caps"); + return FALSE; + } + + c->format = (bpp == 32) ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24; + c->stride = 4 * c->width; + } else { + GST_DEBUG_OBJECT (c, "Unknown mime type '%s'.", mime); + return FALSE; + } + + /* Framerate */ + gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d); + + /* Create output caps */ + caps = gst_pad_get_allowed_caps (c->src); + caps = gst_caps_make_writable (caps); + gst_caps_truncate (caps); + s = gst_caps_get_structure (caps, 0); + mime = gst_structure_get_name (s); + gst_structure_set (s, "height", G_TYPE_INT, c->height, "width", G_TYPE_INT, + c->width, "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL); + + if (c->surface) { + cairo_surface_destroy (c->surface); + c->surface = NULL; + } + + w = c->width; + h = c->height; + + GST_DEBUG_OBJECT (c, "Setting src caps %" GST_PTR_FORMAT, caps); + gst_pad_set_caps (c->src, caps); + +#if CAIRO_HAS_PS_SURFACE + if (!strcmp (mime, "application/postscript")) { + c->surface = cairo_ps_surface_create_for_stream (write_func, c, w, h); + } else +#endif +#if CAIRO_HAS_PDF_SURFACE + if (!strcmp (mime, "application/pdf")) { + c->surface = cairo_pdf_surface_create_for_stream (write_func, c, w, h); + } else +#endif +#if CAIRO_HAS_SVG_SURFACE + if (!strcmp (mime, "image/svg+xml")) { + c->surface = cairo_svg_surface_create_for_stream (write_func, c, w, h); + } else +#endif + { + gst_caps_unref (caps); + return FALSE; + } + + gst_caps_unref (caps); + + return TRUE; +} + + +#define SIZE_CAPS "width = (int) [ 1, MAX], height = (int) [ 1, MAX] " +#if CAIRO_HAS_PDF_SURFACE +#define PDF_CAPS "application/pdf, " SIZE_CAPS +#else +#define PDF_CAPS +#endif +#if CAIRO_HAS_PDF_SURFACE && (CAIRO_HAS_PS_SURFACE || CAIRO_HAS_SVG_SURFACE || CAIRO_HAS_PNG_FUNCTIONS) +#define JOIN1 ";" +#else +#define JOIN1 +#endif +#if CAIRO_HAS_PS_SURFACE +#define PS_CAPS "application/postscript, " SIZE_CAPS +#else +#define PS_CAPS +#endif +#if (CAIRO_HAS_PDF_SURFACE || CAIRO_HAS_PS_SURFACE) && (CAIRO_HAS_SVG_SURFACE || CAIRO_HAS_PNG_FUNCTIONS) +#define JOIN2 ";" +#else +#define JOIN2 +#endif +#if CAIRO_HAS_SVG_SURFACE +#define SVG_CAPS "image/svg+xml, " SIZE_CAPS +#else +#define SVG_CAPS +#endif +#if (CAIRO_HAS_PDF_SURFACE || CAIRO_HAS_PS_SURFACE || CAIRO_HAS_SVG_SURFACE) && CAIRO_HAS_PNG_FUNCTIONS +#define JOIN3 ";" +#else +#define JOIN3 +#endif +#if CAIRO_HAS_PNG_FUNCTIONS +#define PNG_CAPS "image/png, " SIZE_CAPS +#define PNG_CAPS2 "; image/png, " SIZE_CAPS +#else +#define PNG_CAPS +#define PNG_CAPS2 +#endif + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define ARGB_CAPS GST_VIDEO_CAPS_BGRx " ; " GST_VIDEO_CAPS_BGRA " ; " +#else +#define ARGB_CAPS GST_VIDEO_CAPS_xRGB " ; " GST_VIDEO_CAPS_ARGB " ; " +#endif +static GstStaticPadTemplate t_src = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, + GST_STATIC_CAPS (PDF_CAPS JOIN1 PS_CAPS JOIN2 SVG_CAPS JOIN3 PNG_CAPS)); +static GstStaticPadTemplate t_snk = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (ARGB_CAPS + GST_VIDEO_CAPS_YUV ("Y800") " ; " + "video/x-raw-gray, " + "bpp = 8, " + "depth = 8, " + "width = " GST_VIDEO_SIZE_RANGE ", " + "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = " GST_VIDEO_FPS_RANGE + PNG_CAPS2)); + +GST_BOILERPLATE (GstCairoRender, gst_cairo_render, GstElement, + GST_TYPE_ELEMENT); + +static void +gst_cairo_render_init (GstCairoRender * c, GstCairoRenderClass * klass) +{ + /* The sink */ + c->snk = gst_pad_new_from_static_template (&t_snk, "sink"); + gst_pad_set_event_function (c->snk, gst_cairo_render_event); + gst_pad_set_chain_function (c->snk, gst_cairo_render_chain); + gst_pad_set_setcaps_function (c->snk, gst_cairo_render_setcaps_sink); + gst_pad_use_fixed_caps (c->snk); + gst_element_add_pad (GST_ELEMENT (c), c->snk); + + /* The source */ + c->src = gst_pad_new_from_static_template (&t_src, "src"); + gst_pad_use_fixed_caps (c->src); + gst_element_add_pad (GST_ELEMENT (c), c->src); + + c->width = 0; + c->height = 0; + c->stride = 0; +} + +static void +gst_cairo_render_base_init (gpointer g_class) +{ + GstElementClass *ec = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (ec, "Cairo encoder", + "Codec/Encoder", "Encodes streams using Cairo", + "Lutz Mueller "); + gst_element_class_add_static_pad_template (ec, &t_snk); + gst_element_class_add_static_pad_template (ec, &t_src); +} + +static void +gst_cairo_render_finalize (GObject * object) +{ + GstCairoRender *c = GST_CAIRO_RENDER (object); + + if (c->surface) { + cairo_surface_destroy (c->surface); + c->surface = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_cairo_render_class_init (GstCairoRenderClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = gst_cairo_render_finalize; + + GST_DEBUG_CATEGORY_INIT (cairo_render_debug, "cairo_render", 0, + "Cairo encoder"); +} diff --git a/ext/cairo/gstcairorender.h b/ext/cairo/gstcairorender.h new file mode 100644 index 0000000..3f1000e --- /dev/null +++ b/ext/cairo/gstcairorender.h @@ -0,0 +1,63 @@ +/* cairorender: CAIRO plugin for GStreamer + * + * Copyright (C) 2006-2009 Lutz Mueller + * + * 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_CAIRO_RENDER_H_ +#define __GST_CAIRO_RENDER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_CAIRO_RENDER (gst_cairo_render_get_type()) +#define GST_CAIRO_RENDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAIRO_RENDER,GstCairoRender)) +#define GST_CAIRO_RENDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAIRO_RENDER,GstCairoRenderClass)) + +typedef struct _GstCairoRender GstCairoRender; +typedef struct _GstCairoRenderClass GstCairoRenderClass; + +struct _GstCairoRender +{ + GstElement parent; + + GstPad *snk, *src; + + /* < private > */ + + /* Source */ + cairo_surface_t *surface; + gint width, height, stride; + + /* Sink */ + gint64 offset, duration; + gboolean png; + cairo_format_t format; +}; + +struct _GstCairoRenderClass +{ + GstElementClass parent_class; +}; + +GType gst_cairo_render_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __GST_CAIRO_RENDER_H__ */ diff --git a/ext/cairo/gsttextoverlay.c b/ext/cairo/gsttextoverlay.c new file mode 100644 index 0000000..8cb39cc --- /dev/null +++ b/ext/cairo/gsttextoverlay.c @@ -0,0 +1,1042 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * + * 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-cairotextoverlay + * + * cairotextoverlay renders the text on top of the video frames. + * + * + * Example launch line + * |[ + * gst-launch videotestsrc ! cairotextoverlay text="hello" ! autovideosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "gsttextoverlay.h" + +#include + +/* FIXME: + * - calculating the position of the shading rectangle is + * not really right (try with text "L"), to say the least. + * Seems to work at least with latin script though. + * - check final x/y position and text width/height so that + * we don't do out-of-memory access when blitting the text. + * Also, we do not want to blit over the right or left margin. + * - what about text with newline characters? Cairo doesn't deal + * with that (we'd need to fix text_height usage for that as well) + * - upstream caps renegotiation, ie. when video window gets resized + */ + +GST_DEBUG_CATEGORY_EXTERN (cairo_debug); +#define GST_CAT_DEFAULT cairo_debug + +enum +{ + ARG_0, + ARG_TEXT, + ARG_SHADING, + ARG_VALIGN, + ARG_HALIGN, + ARG_XPAD, + ARG_YPAD, + ARG_DELTAX, + ARG_DELTAY, + ARG_SILENT, + ARG_FONT_DESC +}; + +#define DEFAULT_YPAD 25 +#define DEFAULT_XPAD 25 +#define DEFAULT_FONT "sans" +#define DEFAULT_SILENT FALSE + +#define GST_CAIRO_TEXT_OVERLAY_DEFAULT_SCALE 20.0 + +static GstStaticPadTemplate cairo_text_overlay_src_template_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static GstStaticPadTemplate video_sink_template_factory = +GST_STATIC_PAD_TEMPLATE ("video_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static GstStaticPadTemplate text_sink_template_factory = +GST_STATIC_PAD_TEMPLATE ("text_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("text/plain") + ); + +static void gst_text_overlay_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static GstStateChangeReturn gst_text_overlay_change_state (GstElement * element, + GstStateChange transition); +static GstCaps *gst_text_overlay_getcaps (GstPad * pad); +static gboolean gst_text_overlay_setcaps (GstPad * pad, GstCaps * caps); +static GstPadLinkReturn gst_text_overlay_text_pad_linked (GstPad * pad, + GstPad * peer); +static void gst_text_overlay_text_pad_unlinked (GstPad * pad); +static GstFlowReturn gst_text_overlay_collected (GstCollectPads * pads, + gpointer data); +static void gst_text_overlay_finalize (GObject * object); +static void gst_text_overlay_font_init (GstCairoTextOverlay * overlay); +static gboolean gst_text_overlay_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_text_overlay_video_event (GstPad * pad, GstEvent * event); + +/* These macros are adapted from videotestsrc.c */ +#define I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) +#define I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) +#define I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(I420_Y_ROWSTRIDE(width)))/2) + +#define I420_Y_OFFSET(w,h) (0) +#define I420_U_OFFSET(w,h) (I420_Y_OFFSET(w,h)+(I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) +#define I420_V_OFFSET(w,h) (I420_U_OFFSET(w,h)+(I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +#define I420_SIZE(w,h) (I420_V_OFFSET(w,h)+(I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +GST_BOILERPLATE (GstCairoTextOverlay, gst_text_overlay, GstElement, + GST_TYPE_ELEMENT); + +static void +gst_text_overlay_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &cairo_text_overlay_src_template_factory); + gst_element_class_add_static_pad_template (element_class, + &video_sink_template_factory); + gst_element_class_add_static_pad_template (element_class, + &text_sink_template_factory); + + gst_element_class_set_details_simple (element_class, "Text overlay", + "Filter/Editor/Video", + "Adds text strings on top of a video buffer", + "David Schleef "); +} + +static void +gst_text_overlay_class_init (GstCairoTextOverlayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_text_overlay_finalize; + gobject_class->set_property = gst_text_overlay_set_property; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_text_overlay_change_state); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEXT, + g_param_spec_string ("text", "text", + "Text to be display.", "", + G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SHADING, + g_param_spec_boolean ("shaded-background", "shaded background", + "Whether to shade the background under the text area", FALSE, + G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VALIGN, + g_param_spec_string ("valign", "vertical alignment", + "Vertical alignment of the text. " + "Can be either 'baseline', 'bottom', or 'top'", + "baseline", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HALIGN, + g_param_spec_string ("halign", "horizontal alignment", + "Horizontal alignment of the text. " + "Can be either 'left', 'right', or 'center'", + "center", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_XPAD, + g_param_spec_int ("xpad", "horizontal paddding", + "Horizontal paddding when using left/right alignment", + G_MININT, G_MAXINT, DEFAULT_XPAD, + G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_YPAD, + g_param_spec_int ("ypad", "vertical padding", + "Vertical padding when using top/bottom alignment", + G_MININT, G_MAXINT, DEFAULT_YPAD, + G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DELTAX, + g_param_spec_int ("deltax", "X position modifier", + "Shift X position to the left or to the right. Unit is pixels.", + G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DELTAY, + g_param_spec_int ("deltay", "Y position modifier", + "Shift Y position up or down. Unit is pixels.", + G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FONT_DESC, + g_param_spec_string ("font-desc", "font description", + "Pango font description of font " + "to be used for rendering. " + "See documentation of " + "pango_font_description_from_string" + " for syntax.", "", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + /* FIXME 0.11: rename to "visible" or "text-visible" or "render-text" */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT, + g_param_spec_boolean ("silent", "silent", + "Whether to render the text string", + DEFAULT_SILENT, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_text_overlay_finalize (GObject * object) +{ + GstCairoTextOverlay *overlay = GST_CAIRO_TEXT_OVERLAY (object); + + gst_collect_pads_stop (overlay->collect); + gst_object_unref (overlay->collect); + + g_free (overlay->text_fill_image); + g_free (overlay->text_outline_image); + + g_free (overlay->default_text); + g_free (overlay->font); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_text_overlay_init (GstCairoTextOverlay * overlay, + GstCairoTextOverlayClass * klass) +{ + /* video sink */ + overlay->video_sinkpad = + gst_pad_new_from_static_template (&video_sink_template_factory, + "video_sink"); + gst_pad_set_getcaps_function (overlay->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_text_overlay_getcaps)); + gst_pad_set_setcaps_function (overlay->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_text_overlay_setcaps)); + gst_element_add_pad (GST_ELEMENT (overlay), overlay->video_sinkpad); + + /* text sink */ + overlay->text_sinkpad = + gst_pad_new_from_static_template (&text_sink_template_factory, + "text_sink"); + gst_pad_set_link_function (overlay->text_sinkpad, + GST_DEBUG_FUNCPTR (gst_text_overlay_text_pad_linked)); + gst_pad_set_unlink_function (overlay->text_sinkpad, + GST_DEBUG_FUNCPTR (gst_text_overlay_text_pad_unlinked)); + gst_element_add_pad (GST_ELEMENT (overlay), overlay->text_sinkpad); + + /* (video) source */ + overlay->srcpad = + gst_pad_new_from_static_template + (&cairo_text_overlay_src_template_factory, "src"); + gst_pad_set_getcaps_function (overlay->srcpad, + GST_DEBUG_FUNCPTR (gst_text_overlay_getcaps)); + gst_pad_set_event_function (overlay->srcpad, + GST_DEBUG_FUNCPTR (gst_text_overlay_src_event)); + gst_element_add_pad (GST_ELEMENT (overlay), overlay->srcpad); + + overlay->halign = GST_CAIRO_TEXT_OVERLAY_HALIGN_CENTER; + overlay->valign = GST_CAIRO_TEXT_OVERLAY_VALIGN_BASELINE; + overlay->xpad = DEFAULT_XPAD; + overlay->ypad = DEFAULT_YPAD; + overlay->deltax = 0; + overlay->deltay = 0; + + overlay->default_text = g_strdup (""); + overlay->need_render = TRUE; + + overlay->font = g_strdup (DEFAULT_FONT); + gst_text_overlay_font_init (overlay); + + overlay->silent = DEFAULT_SILENT; + + overlay->fps_n = 0; + overlay->fps_d = 1; + + overlay->collect = gst_collect_pads_new (); + + gst_collect_pads_set_function (overlay->collect, + GST_DEBUG_FUNCPTR (gst_text_overlay_collected), overlay); + + overlay->video_collect_data = gst_collect_pads_add_pad (overlay->collect, + overlay->video_sinkpad, sizeof (GstCollectData)); + + /* 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. Nicked from avimux. */ + overlay->collect_event = + (GstPadEventFunction) GST_PAD_EVENTFUNC (overlay->video_sinkpad); + gst_pad_set_event_function (overlay->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_text_overlay_video_event)); + + /* text pad will be added when it is linked */ + overlay->text_collect_data = NULL; +} + +static void +gst_text_overlay_font_init (GstCairoTextOverlay * overlay) +{ + cairo_font_extents_t font_extents; + cairo_surface_t *surface; + cairo_t *cr; + gchar *font_desc, *sep; + + font_desc = g_ascii_strdown (overlay->font, -1); + + /* cairo_select_font_face() does not parse the size at the end, so we have + * to do that ourselves; same for slate and weight */ + sep = MAX (strrchr (font_desc, ' '), strrchr (font_desc, ',')); + if (sep != NULL && g_strtod (sep, NULL) > 0.0) { + /* there may be a suffix such as 'px', but we just ignore that for now */ + overlay->scale = g_strtod (sep, NULL); + } else { + overlay->scale = GST_CAIRO_TEXT_OVERLAY_DEFAULT_SCALE; + } + if (strstr (font_desc, "bold")) + overlay->weight = CAIRO_FONT_WEIGHT_BOLD; + else + overlay->weight = CAIRO_FONT_WEIGHT_NORMAL; + + if (strstr (font_desc, "italic")) + overlay->slant = CAIRO_FONT_SLANT_ITALIC; + else if (strstr (font_desc, "oblique")) + overlay->slant = CAIRO_FONT_SLANT_OBLIQUE; + else + overlay->slant = CAIRO_FONT_SLANT_NORMAL; + + GST_LOG_OBJECT (overlay, "Font desc: '%s', scale=%f, weight=%d, slant=%d", + overlay->font, overlay->scale, overlay->weight, overlay->slant); + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 256, 256); + cr = cairo_create (surface); + + cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); + cairo_set_font_size (cr, overlay->scale); + + /* this has a static leak: + * http://lists.freedesktop.org/archives/cairo/2007-May/010623.html + */ + cairo_font_extents (cr, &font_extents); + overlay->font_height = GST_ROUND_UP_2 ((guint) font_extents.height); + overlay->need_render = TRUE; + + cairo_destroy (cr); + cairo_surface_destroy (surface); + g_free (font_desc); +} + +static void +gst_text_overlay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstCairoTextOverlay *overlay = GST_CAIRO_TEXT_OVERLAY (object); + + GST_OBJECT_LOCK (overlay); + + switch (prop_id) { + case ARG_TEXT:{ + g_free (overlay->default_text); + overlay->default_text = g_value_dup_string (value); + break; + } + case ARG_SHADING:{ + overlay->want_shading = g_value_get_boolean (value); + break; + } + case ARG_VALIGN:{ + const gchar *s = g_value_get_string (value); + + if (g_ascii_strcasecmp (s, "baseline") == 0) + overlay->valign = GST_CAIRO_TEXT_OVERLAY_VALIGN_BASELINE; + else if (g_ascii_strcasecmp (s, "bottom") == 0) + overlay->valign = GST_CAIRO_TEXT_OVERLAY_VALIGN_BOTTOM; + else if (g_ascii_strcasecmp (s, "top") == 0) + overlay->valign = GST_CAIRO_TEXT_OVERLAY_VALIGN_TOP; + else + g_warning ("Invalid 'valign' property value: %s", s); + break; + } + case ARG_HALIGN:{ + const gchar *s = g_value_get_string (value); + + if (g_ascii_strcasecmp (s, "left") == 0) + overlay->halign = GST_CAIRO_TEXT_OVERLAY_HALIGN_LEFT; + else if (g_ascii_strcasecmp (s, "right") == 0) + overlay->halign = GST_CAIRO_TEXT_OVERLAY_HALIGN_RIGHT; + else if (g_ascii_strcasecmp (s, "center") == 0) + overlay->halign = GST_CAIRO_TEXT_OVERLAY_HALIGN_CENTER; + else + g_warning ("Invalid 'halign' property value: %s", s); + break; + } + case ARG_XPAD:{ + overlay->xpad = g_value_get_int (value); + break; + } + case ARG_YPAD:{ + overlay->ypad = g_value_get_int (value); + break; + } + case ARG_DELTAX:{ + overlay->deltax = g_value_get_int (value); + break; + } + case ARG_DELTAY:{ + overlay->deltay = g_value_get_int (value); + break; + } + case ARG_FONT_DESC:{ + g_free (overlay->font); + overlay->font = g_value_dup_string (value); + if (overlay->font == NULL) + overlay->font = g_strdup (DEFAULT_FONT); + gst_text_overlay_font_init (overlay); + break; + } + case ARG_SILENT: + overlay->silent = g_value_get_boolean (value); + break; + default:{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } + + overlay->need_render = TRUE; + + GST_OBJECT_UNLOCK (overlay); +} + +static void +gst_text_overlay_render_text (GstCairoTextOverlay * overlay, + const gchar * text, gint textlen) +{ + cairo_text_extents_t extents; + cairo_surface_t *surface; + cairo_t *cr; + gchar *string; + double x, y; + + if (overlay->silent) { + GST_DEBUG_OBJECT (overlay, "Silent mode, not rendering"); + return; + } + + if (textlen < 0) + textlen = strlen (text); + + if (!overlay->need_render) { + GST_DEBUG ("Using previously rendered text."); + g_return_if_fail (overlay->text_fill_image != NULL); + g_return_if_fail (overlay->text_outline_image != NULL); + return; + } + + string = g_strndup (text, textlen); + GST_DEBUG ("Rendering text '%s' on cairo RGBA surface", string); + + overlay->text_fill_image = + g_realloc (overlay->text_fill_image, + 4 * overlay->width * overlay->font_height); + + surface = cairo_image_surface_create_for_data (overlay->text_fill_image, + CAIRO_FORMAT_ARGB32, overlay->width, overlay->font_height, + overlay->width * 4); + + cr = cairo_create (surface); + + cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); + cairo_set_font_size (cr, overlay->scale); + + cairo_save (cr); + cairo_rectangle (cr, 0, 0, overlay->width, overlay->font_height); + cairo_set_source_rgba (cr, 0, 0, 0, 1.0); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_text_extents (cr, string, &extents); + cairo_set_source_rgba (cr, 1, 1, 1, 1.0); + + switch (overlay->halign) { + case GST_CAIRO_TEXT_OVERLAY_HALIGN_LEFT: + x = overlay->xpad; + break; + case GST_CAIRO_TEXT_OVERLAY_HALIGN_CENTER: + x = (overlay->width - extents.width) / 2; + break; + case GST_CAIRO_TEXT_OVERLAY_HALIGN_RIGHT: + x = overlay->width - extents.width - overlay->xpad; + break; + default: + x = 0; + } + x += overlay->deltax; + + overlay->text_x0 = x; + overlay->text_x1 = x + extents.x_advance; + + overlay->text_dy = (extents.height + extents.y_bearing); + y = overlay->font_height - overlay->text_dy; + + cairo_move_to (cr, x, y); + cairo_show_text (cr, string); + cairo_restore (cr); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + /* ----------- */ + + overlay->text_outline_image = + g_realloc (overlay->text_outline_image, + 4 * overlay->width * overlay->font_height); + + surface = cairo_image_surface_create_for_data (overlay->text_outline_image, + CAIRO_FORMAT_ARGB32, overlay->width, overlay->font_height, + overlay->width * 4); + + cr = cairo_create (surface); + + cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); + cairo_set_font_size (cr, overlay->scale); + + cairo_save (cr); + cairo_rectangle (cr, 0, 0, overlay->width, overlay->font_height); + cairo_set_source_rgba (cr, 0, 0, 0, 1.0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_move_to (cr, x, y); + cairo_set_source_rgba (cr, 1, 1, 1, 1.0); + cairo_set_line_width (cr, 1.0); + cairo_text_path (cr, string); + cairo_stroke (cr); + cairo_restore (cr); + + g_free (string); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + overlay->need_render = FALSE; +} + +static GstCaps * +gst_text_overlay_getcaps (GstPad * pad) +{ + GstCairoTextOverlay *overlay; + GstPad *otherpad; + GstCaps *caps; + + overlay = GST_CAIRO_TEXT_OVERLAY (gst_pad_get_parent (pad)); + + if (pad == overlay->srcpad) + otherpad = overlay->video_sinkpad; + else + otherpad = overlay->srcpad; + + /* we can do what the peer can */ + caps = gst_pad_peer_get_caps (otherpad); + if (caps) { + GstCaps *temp; + const GstCaps *templ; + + GST_DEBUG_OBJECT (pad, "peer caps %" GST_PTR_FORMAT, caps); + + /* filtered against our padtemplate */ + templ = gst_pad_get_pad_template_caps (otherpad); + GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ); + temp = gst_caps_intersect (caps, templ); + GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp); + gst_caps_unref (caps); + /* this is what we can do */ + caps = temp; + } else { + /* no peer, our padtemplate is enough then */ + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + } + + GST_DEBUG_OBJECT (overlay, "returning %" GST_PTR_FORMAT, caps); + + gst_object_unref (overlay); + + return caps; +} + +/* FIXME: upstream nego (e.g. when the video window is resized) */ + +static gboolean +gst_text_overlay_setcaps (GstPad * pad, GstCaps * caps) +{ + GstCairoTextOverlay *overlay; + GstStructure *structure; + gboolean ret = FALSE; + const GValue *fps; + + if (!GST_PAD_IS_SINK (pad)) + return TRUE; + + g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE); + + overlay = GST_CAIRO_TEXT_OVERLAY (gst_pad_get_parent (pad)); + + overlay->width = 0; + overlay->height = 0; + structure = gst_caps_get_structure (caps, 0); + fps = gst_structure_get_value (structure, "framerate"); + + if (gst_structure_get_int (structure, "width", &overlay->width) && + gst_structure_get_int (structure, "height", &overlay->height) && + fps != NULL) { + ret = gst_pad_set_caps (overlay->srcpad, caps); + } + + overlay->fps_n = gst_value_get_fraction_numerator (fps); + overlay->fps_d = gst_value_get_fraction_denominator (fps); + + gst_object_unref (overlay); + + return ret; +} + +static GstPadLinkReturn +gst_text_overlay_text_pad_linked (GstPad * pad, GstPad * peer) +{ + GstCairoTextOverlay *overlay; + + overlay = GST_CAIRO_TEXT_OVERLAY (GST_PAD_PARENT (pad)); + + GST_DEBUG_OBJECT (overlay, "Text pad linked"); + + if (overlay->text_collect_data == NULL) { + overlay->text_collect_data = gst_collect_pads_add_pad (overlay->collect, + overlay->text_sinkpad, sizeof (GstCollectData)); + } + + overlay->need_render = TRUE; + + return GST_PAD_LINK_OK; +} + +static void +gst_text_overlay_text_pad_unlinked (GstPad * pad) +{ + GstCairoTextOverlay *overlay; + + /* don't use gst_pad_get_parent() here, will deadlock */ + overlay = GST_CAIRO_TEXT_OVERLAY (GST_PAD_PARENT (pad)); + + GST_DEBUG_OBJECT (overlay, "Text pad unlinked"); + + if (overlay->text_collect_data) { + gst_collect_pads_remove_pad (overlay->collect, overlay->text_sinkpad); + overlay->text_collect_data = NULL; + } + + overlay->need_render = TRUE; +} + +#define BOX_SHADING_VAL -80 +#define BOX_XPAD 6 +#define BOX_YPAD 6 + +static inline void +gst_text_overlay_shade_y (GstCairoTextOverlay * overlay, guchar * dest, + guint dest_stride, gint y0, gint y1) +{ + gint i, j, x0, x1; + + x0 = CLAMP (overlay->text_x0 - BOX_XPAD, 0, overlay->width); + x1 = CLAMP (overlay->text_x1 + BOX_XPAD, 0, overlay->width); + + y0 = CLAMP (y0 - BOX_YPAD, 0, overlay->height); + y1 = CLAMP (y1 + BOX_YPAD, 0, overlay->height); + + for (i = y0; i < y1; ++i) { + for (j = x0; j < x1; ++j) { + gint y = dest[(i * dest_stride) + j] + BOX_SHADING_VAL; + + dest[(i * dest_stride) + j] = CLAMP (y, 0, 255); + } + } +} + +static inline void +gst_text_overlay_blit_1 (GstCairoTextOverlay * overlay, guchar * dest, + guchar * text_image, gint val, guint dest_stride, gint y0) +{ + gint i, j; + gint x, a, y; + gint y1; + + y = val; + y0 = MIN (y0, overlay->height); + y1 = MIN (y0 + overlay->font_height, overlay->height); + + for (i = y0; i < y1; i++) { + for (j = 0; j < overlay->width; j++) { + x = dest[i * dest_stride + j]; + a = text_image[4 * ((i - y0) * overlay->width + j) + 1]; + dest[i * dest_stride + j] = (y * a + x * (255 - a)) / 255; + } + } +} + +static inline void +gst_text_overlay_blit_sub2x2 (GstCairoTextOverlay * overlay, guchar * dest, + guchar * text_image, gint val, guint dest_stride, gint y0) +{ + gint i, j; + gint x, a, y; + gint y1; + + y0 = MIN (y0, overlay->height); + y1 = MIN (y0 + overlay->font_height, overlay->height); + + y = val; + + for (i = y0; i < y1; i += 2) { + for (j = 0; j < overlay->width; j += 2) { + x = dest[(i / 2) * dest_stride + j / 2]; + a = (text_image[4 * ((i - y0) * overlay->width + j) + 1] + + text_image[4 * ((i - y0) * overlay->width + j + 1) + 1] + + text_image[4 * ((i - y0 + 1) * overlay->width + j) + 1] + + text_image[4 * ((i - y0 + 1) * overlay->width + j + 1) + 1] + 2) / 4; + dest[(i / 2) * dest_stride + j / 2] = (y * a + x * (255 - a)) / 255; + } + } +} + + +static GstFlowReturn +gst_text_overlay_push_frame (GstCairoTextOverlay * overlay, + GstBuffer * video_frame) +{ + guchar *y, *u, *v; + gint ypos; + + video_frame = gst_buffer_make_writable (video_frame); + + switch (overlay->valign) { + case GST_CAIRO_TEXT_OVERLAY_VALIGN_BOTTOM: + ypos = overlay->height - overlay->font_height - overlay->ypad; + break; + case GST_CAIRO_TEXT_OVERLAY_VALIGN_BASELINE: + ypos = overlay->height - (overlay->font_height - overlay->text_dy) + - overlay->ypad; + break; + case GST_CAIRO_TEXT_OVERLAY_VALIGN_TOP: + ypos = overlay->ypad; + break; + default: + ypos = overlay->ypad; + break; + } + + ypos += overlay->deltay; + + y = GST_BUFFER_DATA (video_frame); + u = y + I420_U_OFFSET (overlay->width, overlay->height); + v = y + I420_V_OFFSET (overlay->width, overlay->height); + + /* shaded background box */ + if (overlay->want_shading) { + gst_text_overlay_shade_y (overlay, + y, I420_Y_ROWSTRIDE (overlay->width), + ypos + overlay->text_dy, ypos + overlay->font_height); + } + + /* blit outline text on video image */ + gst_text_overlay_blit_1 (overlay, + y, + overlay->text_outline_image, 0, I420_Y_ROWSTRIDE (overlay->width), ypos); + gst_text_overlay_blit_sub2x2 (overlay, + u, + overlay->text_outline_image, 128, I420_U_ROWSTRIDE (overlay->width), + ypos); + gst_text_overlay_blit_sub2x2 (overlay, v, overlay->text_outline_image, 128, + I420_V_ROWSTRIDE (overlay->width), ypos); + + /* blit text on video image */ + gst_text_overlay_blit_1 (overlay, + y, + overlay->text_fill_image, 255, I420_Y_ROWSTRIDE (overlay->width), ypos); + gst_text_overlay_blit_sub2x2 (overlay, + u, + overlay->text_fill_image, 128, I420_U_ROWSTRIDE (overlay->width), ypos); + gst_text_overlay_blit_sub2x2 (overlay, + v, + overlay->text_fill_image, 128, I420_V_ROWSTRIDE (overlay->width), ypos); + + return gst_pad_push (overlay->srcpad, video_frame); +} + +static void +gst_text_overlay_pop_video (GstCairoTextOverlay * overlay) +{ + GstBuffer *buf; + + buf = gst_collect_pads_pop (overlay->collect, overlay->video_collect_data); + g_return_if_fail (buf != NULL); + gst_buffer_unref (buf); +} + +static void +gst_text_overlay_pop_text (GstCairoTextOverlay * overlay) +{ + GstBuffer *buf; + + if (overlay->text_collect_data) { + buf = gst_collect_pads_pop (overlay->collect, overlay->text_collect_data); + g_return_if_fail (buf != NULL); + gst_buffer_unref (buf); + } + + overlay->need_render = TRUE; +} + +/* This function is called when there is data on all pads */ +static GstFlowReturn +gst_text_overlay_collected (GstCollectPads * pads, gpointer data) +{ + GstCairoTextOverlay *overlay; + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime now, txt_end, frame_end; + GstBuffer *video_frame = NULL; + GstBuffer *text_buf = NULL; + gchar *text; + gint text_len; + + overlay = GST_CAIRO_TEXT_OVERLAY (data); + + GST_DEBUG ("Collecting"); + + video_frame = gst_collect_pads_peek (overlay->collect, + overlay->video_collect_data); + + /* send EOS if video stream EOSed regardless of text stream */ + if (video_frame == NULL) { + GST_DEBUG ("Video stream at EOS"); + if (overlay->text_collect_data) { + text_buf = gst_collect_pads_pop (overlay->collect, + overlay->text_collect_data); + } + gst_pad_push_event (overlay->srcpad, gst_event_new_eos ()); + ret = GST_FLOW_UNEXPECTED; + goto done; + } + + if (GST_BUFFER_TIMESTAMP (video_frame) == GST_CLOCK_TIME_NONE) { + g_warning ("%s: video frame has invalid timestamp", G_STRLOC); + } + + now = GST_BUFFER_TIMESTAMP (video_frame); + + if (GST_BUFFER_DURATION (video_frame) != GST_CLOCK_TIME_NONE) { + frame_end = now + GST_BUFFER_DURATION (video_frame); + } else if (overlay->fps_n > 0) { + frame_end = now + gst_util_uint64_scale_int (GST_SECOND, + overlay->fps_d, overlay->fps_n); + } else { + /* magic value, does not really matter since texts + * tend to span quite a few frames in practice anyway */ + frame_end = now + GST_SECOND / 25; + } + + GST_DEBUG ("Got video frame: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT, + GST_TIME_ARGS (now), GST_TIME_ARGS (frame_end)); + + /* text pad not linked? */ + if (overlay->text_collect_data == NULL) { + GST_DEBUG ("Text pad not linked, rendering default text: '%s'", + GST_STR_NULL (overlay->default_text)); + if (overlay->default_text && *overlay->default_text != '\0') { + gst_text_overlay_render_text (overlay, overlay->default_text, -1); + ret = gst_text_overlay_push_frame (overlay, video_frame); + } else { + ret = gst_pad_push (overlay->srcpad, video_frame); + } + gst_text_overlay_pop_video (overlay); + video_frame = NULL; + goto done; + } + + text_buf = gst_collect_pads_peek (overlay->collect, + overlay->text_collect_data); + + /* just push the video frame if the text stream has EOSed */ + if (text_buf == NULL) { + GST_DEBUG ("Text pad EOSed, just pushing video frame as is"); + ret = gst_pad_push (overlay->srcpad, video_frame); + gst_text_overlay_pop_video (overlay); + video_frame = NULL; + goto done; + } + + /* if the text buffer isn't stamped right, pop it off the + * queue and display it for the current video frame only */ + if (GST_BUFFER_TIMESTAMP (text_buf) == GST_CLOCK_TIME_NONE || + GST_BUFFER_DURATION (text_buf) == GST_CLOCK_TIME_NONE) { + GST_WARNING ("Got text buffer with invalid time stamp or duration"); + gst_text_overlay_pop_text (overlay); + GST_BUFFER_TIMESTAMP (text_buf) = now; + GST_BUFFER_DURATION (text_buf) = frame_end - now; + } + + txt_end = GST_BUFFER_TIMESTAMP (text_buf) + GST_BUFFER_DURATION (text_buf); + + GST_DEBUG ("Got text buffer: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (text_buf)), GST_TIME_ARGS (txt_end)); + + /* if the text buffer is too old, pop it off the + * queue and return so we get a new one next time */ + if (txt_end < now) { + GST_DEBUG ("Text buffer too old, popping off the queue"); + gst_text_overlay_pop_text (overlay); + ret = GST_FLOW_OK; + goto done; + } + + /* if the video frame ends before the text even starts, + * just push it out as is and pop it off the queue */ + if (frame_end < GST_BUFFER_TIMESTAMP (text_buf)) { + GST_DEBUG ("Video buffer before text, pushing out and popping off queue"); + ret = gst_pad_push (overlay->srcpad, video_frame); + gst_text_overlay_pop_video (overlay); + video_frame = NULL; + goto done; + } + + /* text duration overlaps video frame duration */ + text = g_strndup ((gchar *) GST_BUFFER_DATA (text_buf), + GST_BUFFER_SIZE (text_buf)); + g_strdelimit (text, "\n\r\t", ' '); + text_len = strlen (text); + + if (text_len > 0) { + GST_DEBUG ("Rendering text '%*s'", text_len, text);; + gst_text_overlay_render_text (overlay, text, text_len); + } else { + GST_DEBUG ("No text to render (empty buffer)"); + gst_text_overlay_render_text (overlay, " ", 1); + } + + g_free (text); + + gst_text_overlay_pop_video (overlay); + ret = gst_text_overlay_push_frame (overlay, video_frame); + video_frame = NULL; + goto done; + +done: + { + if (text_buf) + gst_buffer_unref (text_buf); + + if (video_frame) + gst_buffer_unref (video_frame); + + return ret; + } +} + +static gboolean +gst_text_overlay_src_event (GstPad * pad, GstEvent * event) +{ + GstCairoTextOverlay *overlay = + GST_CAIRO_TEXT_OVERLAY (gst_pad_get_parent (pad)); + gboolean ret = TRUE; + + /* forward events to the video sink, and, if it is linked, the text sink */ + if (overlay->text_collect_data) { + gst_event_ref (event); + ret &= gst_pad_push_event (overlay->text_sinkpad, event); + } + ret &= gst_pad_push_event (overlay->video_sinkpad, event); + + gst_object_unref (overlay); + return ret; +} + +static gboolean +gst_text_overlay_video_event (GstPad * pad, GstEvent * event) +{ + gboolean ret = FALSE; + GstCairoTextOverlay *overlay = NULL; + + overlay = GST_CAIRO_TEXT_OVERLAY (gst_pad_get_parent (pad)); + + if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { + GST_DEBUG_OBJECT (overlay, + "received new segment on video sink pad, forwarding"); + gst_event_ref (event); + gst_pad_push_event (overlay->srcpad, event); + } + + /* now GstCollectPads can take care of the rest, e.g. EOS */ + ret = overlay->collect_event (pad, event); + gst_object_unref (overlay); + return ret; +} + +static GstStateChangeReturn +gst_text_overlay_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstCairoTextOverlay *overlay = GST_CAIRO_TEXT_OVERLAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_collect_pads_start (overlay->collect); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + /* need to unblock the collectpads before calling the + * parent change_state so that streaming can finish */ + gst_collect_pads_stop (overlay->collect); + break; + default: + break; + } + + ret = parent_class->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + return ret; + + switch (transition) { + default: + break; + } + + return ret; +} diff --git a/ext/cairo/gsttextoverlay.h b/ext/cairo/gsttextoverlay.h new file mode 100644 index 0000000..dbb2154 --- /dev/null +++ b/ext/cairo/gsttextoverlay.h @@ -0,0 +1,90 @@ + +#ifndef __GST_CAIRO_TEXT_OVERLAY_H__ +#define __GST_CAIRO_TEXT_OVERLAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_CAIRO_TEXT_OVERLAY (gst_text_overlay_get_type()) +#define GST_CAIRO_TEXT_OVERLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ + GST_TYPE_CAIRO_TEXT_OVERLAY, GstCairoTextOverlay)) +#define GST_CAIRO_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ + GST_TYPE_CAIRO_TEXT_OVERLAY, GstCairoTextOverlayClass)) +#define GST_CAIRO_TEXT_OVERLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\ + GST_TYPE_CAIRO_TEXT_OVERLAY, GstCairoTextOverlayClass)) +#define GST_IS_CAIRO_TEXT_OVERLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ + GST_TYPE_CAIRO_TEXT_OVERLAY)) +#define GST_IS_CAIRO_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ + GST_TYPE_CAIRO_TEXT_OVERLAY)) + +typedef struct _GstCairoTextOverlay GstCairoTextOverlay; +typedef struct _GstCairoTextOverlayClass GstCairoTextOverlayClass; + +typedef enum _GstCairoTextOverlayVAlign GstCairoTextOverlayVAlign; +typedef enum _GstCairoTextOverlayHAlign GstCairoTextOverlayHAlign; + +enum _GstCairoTextOverlayVAlign { + GST_CAIRO_TEXT_OVERLAY_VALIGN_BASELINE, + GST_CAIRO_TEXT_OVERLAY_VALIGN_BOTTOM, + GST_CAIRO_TEXT_OVERLAY_VALIGN_TOP +}; + +enum _GstCairoTextOverlayHAlign { + GST_CAIRO_TEXT_OVERLAY_HALIGN_LEFT, + GST_CAIRO_TEXT_OVERLAY_HALIGN_CENTER, + GST_CAIRO_TEXT_OVERLAY_HALIGN_RIGHT +}; + + +struct _GstCairoTextOverlay { + GstElement element; + + GstPad *video_sinkpad; + GstPad *text_sinkpad; + GstPad *srcpad; + + GstCollectPads *collect; + GstCollectData *video_collect_data; + GstCollectData *text_collect_data; + GstPadEventFunction collect_event; + + gint width; + gint height; + gint fps_n; + gint fps_d; + + GstCairoTextOverlayVAlign valign; + GstCairoTextOverlayHAlign halign; + gint xpad; + gint ypad; + gint deltax; + gint deltay; + gchar *default_text; + gboolean want_shading; + + guchar *text_fill_image; + guchar *text_outline_image; + gint font_height; + gint text_x0, text_x1; /* start/end x position of text */ + gint text_dy; + + gboolean need_render; + + gchar *font; + gint slant; + gint weight; + gdouble scale; + gboolean silent; +}; + +struct _GstCairoTextOverlayClass { + GstElementClass parent_class; +}; + +GType gst_text_overlay_get_type (void); + +G_END_DECLS + +#endif /* __GST_CAIRO_TEXT_OVERLAY_H */ diff --git a/ext/cairo/gsttimeoverlay.c b/ext/cairo/gsttimeoverlay.c new file mode 100644 index 0000000..10973b1 --- /dev/null +++ b/ext/cairo/gsttimeoverlay.c @@ -0,0 +1,316 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * + * 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-cairotimeoverlay + * + * cairotimeoverlay renders the buffer timestamp for each frame on top of + * the frame. + * + * + * Example launch line + * |[ + * gst-launch videotestsrc ! cairotimeoverlay ! autovideosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include + +#include + +#include + +#include + +static GstStaticPadTemplate gst_cairo_time_overlay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static GstStaticPadTemplate gst_cairo_time_overlay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static GstBaseTransformClass *parent_class = NULL; + +static void +gst_cairo_time_overlay_update_font_height (GstCairoTimeOverlay * timeoverlay) +{ + gint width, height; + cairo_surface_t *font_surface; + cairo_t *font_cairo; + cairo_font_extents_t font_extents; + + width = timeoverlay->width; + height = timeoverlay->height; + + font_surface = + cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + font_cairo = cairo_create (font_surface); + cairo_surface_destroy (font_surface); + font_surface = NULL; + + cairo_select_font_face (font_cairo, "monospace", 0, 0); + cairo_set_font_size (font_cairo, 20); + cairo_font_extents (font_cairo, &font_extents); + timeoverlay->text_height = font_extents.height; + GST_DEBUG_OBJECT (timeoverlay, "font height is %f", font_extents.height); + cairo_destroy (font_cairo); + font_cairo = NULL; +} + +static gboolean +gst_cairo_time_overlay_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstCairoTimeOverlay *filter = GST_CAIRO_TIME_OVERLAY (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + gst_cairo_time_overlay_update_font_height (filter); + ret = TRUE; + } + + return ret; +} + +/* Useful macros */ +#define GST_VIDEO_I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) +#define GST_VIDEO_I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) +#define GST_VIDEO_I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(GST_VIDEO_I420_Y_ROWSTRIDE(width)))/2) + +#define GST_VIDEO_I420_Y_OFFSET(w,h) (0) +#define GST_VIDEO_I420_U_OFFSET(w,h) (GST_VIDEO_I420_Y_OFFSET(w,h)+(GST_VIDEO_I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) +#define GST_VIDEO_I420_V_OFFSET(w,h) (GST_VIDEO_I420_U_OFFSET(w,h)+(GST_VIDEO_I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +#define GST_VIDEO_I420_SIZE(w,h) (GST_VIDEO_I420_V_OFFSET(w,h)+(GST_VIDEO_I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +static gboolean +gst_cairo_time_overlay_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, + guint * size) +{ + GstCairoTimeOverlay *filter; + GstStructure *structure; + gboolean ret = FALSE; + gint width, height; + + filter = GST_CAIRO_TIME_OVERLAY (btrans); + + structure = gst_caps_get_structure (caps, 0); + + if (gst_structure_get_int (structure, "width", &width) && + gst_structure_get_int (structure, "height", &height)) { + *size = GST_VIDEO_I420_SIZE (width, height); + ret = TRUE; + GST_DEBUG_OBJECT (filter, "our frame size is %d bytes (%dx%d)", *size, + width, height); + } + + return ret; +} + +static char * +gst_cairo_time_overlay_print_smpte_time (guint64 time) +{ + int hours; + int minutes; + int seconds; + int ms; + double x; + + x = rint (gst_util_guint64_to_gdouble (time + 500000) * 1e-6); + + hours = floor (x / (60 * 60 * 1000)); + x -= hours * 60 * 60 * 1000; + minutes = floor (x / (60 * 1000)); + x -= minutes * 60 * 1000; + seconds = floor (x / (1000)); + x -= seconds * 1000; + ms = rint (x); + + return g_strdup_printf ("%02d:%02d:%02d.%03d", hours, minutes, seconds, ms); +} + + +static GstFlowReturn +gst_cairo_time_overlay_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstCairoTimeOverlay *timeoverlay; + int width; + int height; + int b_width; + int stride_y, stride_u, stride_v; + char *string; + int i, j; + unsigned char *image; + cairo_text_extents_t extents; + guint8 *dest, *src; + cairo_surface_t *font_surface; + cairo_t *text_cairo; + GstFlowReturn ret = GST_FLOW_OK; + + timeoverlay = GST_CAIRO_TIME_OVERLAY (trans); + + gst_buffer_copy_metadata (out, in, GST_BUFFER_COPY_TIMESTAMPS); + + src = GST_BUFFER_DATA (in); + dest = GST_BUFFER_DATA (out); + + width = timeoverlay->width; + height = timeoverlay->height; + + /* create surface for font rendering */ + /* FIXME: preparation of the surface could also be done once when settings + * change */ + image = g_malloc (4 * width * timeoverlay->text_height); + + font_surface = + cairo_image_surface_create_for_data (image, CAIRO_FORMAT_ARGB32, width, + timeoverlay->text_height, width * 4); + text_cairo = cairo_create (font_surface); + cairo_surface_destroy (font_surface); + font_surface = NULL; + + /* we draw a rectangle because the compositing on the buffer below + * doesn't do alpha */ + cairo_save (text_cairo); + cairo_rectangle (text_cairo, 0, 0, width, timeoverlay->text_height); + cairo_set_source_rgba (text_cairo, 0, 0, 0, 1); + cairo_set_operator (text_cairo, CAIRO_OPERATOR_SOURCE); + cairo_fill (text_cairo); + cairo_restore (text_cairo); + + string = gst_cairo_time_overlay_print_smpte_time (GST_BUFFER_TIMESTAMP (in)); + cairo_save (text_cairo); + cairo_select_font_face (text_cairo, "monospace", 0, 0); + cairo_set_font_size (text_cairo, 20); + cairo_text_extents (text_cairo, string, &extents); + cairo_set_source_rgb (text_cairo, 1, 1, 1); + cairo_move_to (text_cairo, 0, timeoverlay->text_height - 2); + cairo_show_text (text_cairo, string); + g_free (string); + + cairo_restore (text_cairo); + + /* blend width; should retain a max text width so it doesn't jitter */ + b_width = extents.width; + if (b_width > width) + b_width = width; + + stride_y = GST_VIDEO_I420_Y_ROWSTRIDE (width); + stride_u = GST_VIDEO_I420_U_ROWSTRIDE (width); + stride_v = GST_VIDEO_I420_V_ROWSTRIDE (width); + + memcpy (dest, src, GST_BUFFER_SIZE (in)); + for (i = 0; i < timeoverlay->text_height; i++) { + for (j = 0; j < b_width; j++) { + ((unsigned char *) dest)[i * stride_y + j] = + image[(i * width + j) * 4 + 0]; + } + } + for (i = 0; i < timeoverlay->text_height / 2; i++) { + memset (dest + GST_VIDEO_I420_U_OFFSET (width, height) + i * stride_u, 128, + b_width / 2); + memset (dest + GST_VIDEO_I420_V_OFFSET (width, height) + i * stride_v, 128, + b_width / 2); + } + + cairo_destroy (text_cairo); + text_cairo = NULL; + g_free (image); + + return ret; +} + +static void +gst_cairo_time_overlay_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Time overlay", + "Filter/Editor/Video", + "Overlays the time on a video stream", "David Schleef "); + + gst_element_class_add_static_pad_template (element_class, + &gst_cairo_time_overlay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_cairo_time_overlay_src_template); +} + +static void +gst_cairo_time_overlay_class_init (gpointer klass, gpointer class_data) +{ + GstBaseTransformClass *trans_class; + + trans_class = (GstBaseTransformClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_cairo_time_overlay_set_caps); + trans_class->get_unit_size = + GST_DEBUG_FUNCPTR (gst_cairo_time_overlay_get_unit_size); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_cairo_time_overlay_transform); +} + +static void +gst_cairo_time_overlay_init (GTypeInstance * instance, gpointer g_class) +{ +} + +GType +gst_cairo_time_overlay_get_type (void) +{ + static GType cairo_time_overlay_type = 0; + + if (!cairo_time_overlay_type) { + static const GTypeInfo cairo_time_overlay_info = { + sizeof (GstCairoTimeOverlayClass), + gst_cairo_time_overlay_base_init, + NULL, + gst_cairo_time_overlay_class_init, + NULL, + NULL, + sizeof (GstCairoTimeOverlay), + 0, + gst_cairo_time_overlay_init, + }; + + cairo_time_overlay_type = g_type_register_static (GST_TYPE_BASE_TRANSFORM, + "GstCairoTimeOverlay", &cairo_time_overlay_info, 0); + } + return cairo_time_overlay_type; +} diff --git a/ext/cairo/gsttimeoverlay.h b/ext/cairo/gsttimeoverlay.h new file mode 100644 index 0000000..ff0936e --- /dev/null +++ b/ext/cairo/gsttimeoverlay.h @@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_CAIRO_TIME_OVERLAY_H__ +#define __GST_CAIRO_TIME_OVERLAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_CAIRO_TIME_OVERLAY \ + (gst_cairo_time_overlay_get_type()) +#define GST_CAIRO_TIME_OVERLAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAIRO_TIME_OVERLAY,GstCairoTimeOverlay)) +#define GST_CAIRO_TIME_OVERLAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAIRO_TIME_OVERLAY,GstCairoTimeOverlayClass)) +#define GST_IS_CAIRO_TIME_OVERLAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAIRO_TIME_OVERLAY)) +#define GST_IS_CAIRO_TIME_OVERLAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAIRO_TIME_OVERLAY)) + +typedef struct _GstCairoTimeOverlay { + GstBaseTransform basetransform; + + gint width, height; + + cairo_surface_t *surface; + cairo_t *cr; + int text_height; + +} GstCairoTimeOverlay; + +typedef struct _GstCairoTimeOverlayClass { + GstBaseTransformClass parent_class; +} GstCairoTimeOverlayClass; + +GType gst_cairo_time_overlay_get_type(void); + +G_END_DECLS + +#endif /* __GST_CAIRO_TIME_OVERLAY_H__ */ diff --git a/ext/dv/Makefile.am b/ext/dv/Makefile.am new file mode 100644 index 0000000..e63154d --- /dev/null +++ b/ext/dv/Makefile.am @@ -0,0 +1,20 @@ +plugin_LTLIBRARIES = libgstdv.la + +libgstdv_la_SOURCES = gstdv.c gstdvdec.c gstdvdemux.c gstsmptetimecode.c +libgstdv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBDV_CFLAGS) +libgstdv_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(LIBDV_LIBS) +libgstdv_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstdv_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstdvdemux.h gstdvdec.h gstsmptetimecode.h + +EXTRA_DIST = NOTES + +noinst_PROGRAMS = smpte_test + +smpte_test_SOURCES = smpte_test.c gstsmptetimecode.c +smpte_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(LIBDV_CFLAGS) +smpte_test_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) + diff --git a/ext/dv/Makefile.in b/ext/dv/Makefile.in new file mode 100644 index 0000000..bb9c93e --- /dev/null +++ b/ext/dv/Makefile.in @@ -0,0 +1,890 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = smpte_test$(EXEEXT) +subdir = ext/dv +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstdv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstdv_la_OBJECTS = libgstdv_la-gstdv.lo libgstdv_la-gstdvdec.lo \ + libgstdv_la-gstdvdemux.lo libgstdv_la-gstsmptetimecode.lo +libgstdv_la_OBJECTS = $(am_libgstdv_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstdv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstdv_la_CFLAGS) $(CFLAGS) $(libgstdv_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +PROGRAMS = $(noinst_PROGRAMS) +am_smpte_test_OBJECTS = smpte_test-smpte_test.$(OBJEXT) \ + smpte_test-gstsmptetimecode.$(OBJEXT) +smpte_test_OBJECTS = $(am_smpte_test_OBJECTS) +smpte_test_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +smpte_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(smpte_test_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstdv_la_SOURCES) $(smpte_test_SOURCES) +DIST_SOURCES = $(libgstdv_la_SOURCES) $(smpte_test_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstdv.la +libgstdv_la_SOURCES = gstdv.c gstdvdec.c gstdvdemux.c gstsmptetimecode.c +libgstdv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBDV_CFLAGS) +libgstdv_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(LIBDV_LIBS) + +libgstdv_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstdv_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstdvdemux.h gstdvdec.h gstsmptetimecode.h +EXTRA_DIST = NOTES +smpte_test_SOURCES = smpte_test.c gstsmptetimecode.c +smpte_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(LIBDV_CFLAGS) +smpte_test_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/dv/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/dv/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstdv.la: $(libgstdv_la_OBJECTS) $(libgstdv_la_DEPENDENCIES) $(EXTRA_libgstdv_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstdv_la_LINK) -rpath $(plugindir) $(libgstdv_la_OBJECTS) $(libgstdv_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +smpte_test$(EXEEXT): $(smpte_test_OBJECTS) $(smpte_test_DEPENDENCIES) $(EXTRA_smpte_test_DEPENDENCIES) + @rm -f smpte_test$(EXEEXT) + $(AM_V_CCLD)$(smpte_test_LINK) $(smpte_test_OBJECTS) $(smpte_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdv_la-gstdv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdv_la-gstdvdec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdv_la-gstdvdemux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdv_la-gstsmptetimecode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smpte_test-gstsmptetimecode.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smpte_test-smpte_test.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstdv_la-gstdv.lo: gstdv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -MT libgstdv_la-gstdv.lo -MD -MP -MF $(DEPDIR)/libgstdv_la-gstdv.Tpo -c -o libgstdv_la-gstdv.lo `test -f 'gstdv.c' || echo '$(srcdir)/'`gstdv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdv_la-gstdv.Tpo $(DEPDIR)/libgstdv_la-gstdv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdv.c' object='libgstdv_la-gstdv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -c -o libgstdv_la-gstdv.lo `test -f 'gstdv.c' || echo '$(srcdir)/'`gstdv.c + +libgstdv_la-gstdvdec.lo: gstdvdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -MT libgstdv_la-gstdvdec.lo -MD -MP -MF $(DEPDIR)/libgstdv_la-gstdvdec.Tpo -c -o libgstdv_la-gstdvdec.lo `test -f 'gstdvdec.c' || echo '$(srcdir)/'`gstdvdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdv_la-gstdvdec.Tpo $(DEPDIR)/libgstdv_la-gstdvdec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdvdec.c' object='libgstdv_la-gstdvdec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -c -o libgstdv_la-gstdvdec.lo `test -f 'gstdvdec.c' || echo '$(srcdir)/'`gstdvdec.c + +libgstdv_la-gstdvdemux.lo: gstdvdemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -MT libgstdv_la-gstdvdemux.lo -MD -MP -MF $(DEPDIR)/libgstdv_la-gstdvdemux.Tpo -c -o libgstdv_la-gstdvdemux.lo `test -f 'gstdvdemux.c' || echo '$(srcdir)/'`gstdvdemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdv_la-gstdvdemux.Tpo $(DEPDIR)/libgstdv_la-gstdvdemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdvdemux.c' object='libgstdv_la-gstdvdemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -c -o libgstdv_la-gstdvdemux.lo `test -f 'gstdvdemux.c' || echo '$(srcdir)/'`gstdvdemux.c + +libgstdv_la-gstsmptetimecode.lo: gstsmptetimecode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -MT libgstdv_la-gstsmptetimecode.lo -MD -MP -MF $(DEPDIR)/libgstdv_la-gstsmptetimecode.Tpo -c -o libgstdv_la-gstsmptetimecode.lo `test -f 'gstsmptetimecode.c' || echo '$(srcdir)/'`gstsmptetimecode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdv_la-gstsmptetimecode.Tpo $(DEPDIR)/libgstdv_la-gstsmptetimecode.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmptetimecode.c' object='libgstdv_la-gstsmptetimecode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -c -o libgstdv_la-gstsmptetimecode.lo `test -f 'gstsmptetimecode.c' || echo '$(srcdir)/'`gstsmptetimecode.c + +smpte_test-smpte_test.o: smpte_test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -MT smpte_test-smpte_test.o -MD -MP -MF $(DEPDIR)/smpte_test-smpte_test.Tpo -c -o smpte_test-smpte_test.o `test -f 'smpte_test.c' || echo '$(srcdir)/'`smpte_test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/smpte_test-smpte_test.Tpo $(DEPDIR)/smpte_test-smpte_test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smpte_test.c' object='smpte_test-smpte_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -c -o smpte_test-smpte_test.o `test -f 'smpte_test.c' || echo '$(srcdir)/'`smpte_test.c + +smpte_test-smpte_test.obj: smpte_test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -MT smpte_test-smpte_test.obj -MD -MP -MF $(DEPDIR)/smpte_test-smpte_test.Tpo -c -o smpte_test-smpte_test.obj `if test -f 'smpte_test.c'; then $(CYGPATH_W) 'smpte_test.c'; else $(CYGPATH_W) '$(srcdir)/smpte_test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/smpte_test-smpte_test.Tpo $(DEPDIR)/smpte_test-smpte_test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smpte_test.c' object='smpte_test-smpte_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -c -o smpte_test-smpte_test.obj `if test -f 'smpte_test.c'; then $(CYGPATH_W) 'smpte_test.c'; else $(CYGPATH_W) '$(srcdir)/smpte_test.c'; fi` + +smpte_test-gstsmptetimecode.o: gstsmptetimecode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -MT smpte_test-gstsmptetimecode.o -MD -MP -MF $(DEPDIR)/smpte_test-gstsmptetimecode.Tpo -c -o smpte_test-gstsmptetimecode.o `test -f 'gstsmptetimecode.c' || echo '$(srcdir)/'`gstsmptetimecode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/smpte_test-gstsmptetimecode.Tpo $(DEPDIR)/smpte_test-gstsmptetimecode.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmptetimecode.c' object='smpte_test-gstsmptetimecode.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -c -o smpte_test-gstsmptetimecode.o `test -f 'gstsmptetimecode.c' || echo '$(srcdir)/'`gstsmptetimecode.c + +smpte_test-gstsmptetimecode.obj: gstsmptetimecode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -MT smpte_test-gstsmptetimecode.obj -MD -MP -MF $(DEPDIR)/smpte_test-gstsmptetimecode.Tpo -c -o smpte_test-gstsmptetimecode.obj `if test -f 'gstsmptetimecode.c'; then $(CYGPATH_W) 'gstsmptetimecode.c'; else $(CYGPATH_W) '$(srcdir)/gstsmptetimecode.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/smpte_test-gstsmptetimecode.Tpo $(DEPDIR)/smpte_test-gstsmptetimecode.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmptetimecode.c' object='smpte_test-gstsmptetimecode.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -c -o smpte_test-gstsmptetimecode.obj `if test -f 'gstsmptetimecode.c'; then $(CYGPATH_W) 'gstsmptetimecode.c'; else $(CYGPATH_W) '$(srcdir)/gstsmptetimecode.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + clean-pluginLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS clean-pluginLTLIBRARIES \ + ctags distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pluginLTLIBRARIES install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/dv/NOTES b/ext/dv/NOTES new file mode 100644 index 0000000..8421159 --- /dev/null +++ b/ext/dv/NOTES @@ -0,0 +1,13 @@ +Packets come from 1394 480 bytes at a time. This is not a video segment +length. This causes problems, since a packet boundary crossing a video +segment can split a video segment if we lose an iso packet. We can +recover from this, sorta, with significant changes to the parser. We have +to deal with the idea that a) some macroblocks just don't exist (we have +zero's for them) and b) when any of the 5 macroblocks doesn't exist, we +can't do pass 3. + +Since things are bitstream-based, we can deal with this, but we have to +add a layer of code that tries to save time (maybe) by not decoding things +that don't exist. Not sure how this is gonna work with the parse code +being based on video segments, and not easily splittable into +macroblock-level parsing (or is it?). diff --git a/ext/dv/gstdv.c b/ext/dv/gstdv.c new file mode 100644 index 0000000..970c5d1 --- /dev/null +++ b/ext/dv/gstdv.c @@ -0,0 +1,48 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * <2005> Wim Taymans + * + * 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 "gstdvdec.h" +#include "gstdvdemux.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + dv_init (0, 0); + + if (!gst_element_register (plugin, "dvdemux", GST_RANK_PRIMARY, + gst_dvdemux_get_type ())) + return FALSE; + + if (!gst_element_register (plugin, "dvdec", GST_RANK_MARGINAL, + gst_dvdec_get_type ())) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "dv", + "DV demuxer and decoder based on libdv (libdv.sf.net)", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/dv/gstdvdec.c b/ext/dv/gstdvdec.c new file mode 100644 index 0000000..e425744 --- /dev/null +++ b/ext/dv/gstdvdec.c @@ -0,0 +1,617 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * <2005> Wim Taymans + * + * 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-dvdec + * + * dvdec decodes DV video into raw video. The element expects a full DV frame + * as input, which is 120000 bytes for NTSC and 144000 for PAL video. + * + * This element can perform simple frame dropping with the #GstDVDec:drop-factor + * property. Setting this property to a value N > 1 will only decode every + * Nth frame. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=test.dv ! dvdemux name=demux ! dvdec ! xvimagesink + * ]| This pipeline decodes and renders the raw DV stream to a videosink. + * + * + * Last reviewed on 2006-02-28 (0.10.3) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include + +#include "gstdvdec.h" + +/* sizes of one input buffer */ +#define NTSC_HEIGHT 480 +#define NTSC_BUFFER 120000 +#define NTSC_FRAMERATE_NUMERATOR 30000 +#define NTSC_FRAMERATE_DENOMINATOR 1001 + +#define PAL_HEIGHT 576 +#define PAL_BUFFER 144000 +#define PAL_FRAMERATE_NUMERATOR 25 +#define PAL_FRAMERATE_DENOMINATOR 1 + +#define PAL_NORMAL_PAR_X 59 +#define PAL_NORMAL_PAR_Y 54 +#define PAL_WIDE_PAR_X 118 +#define PAL_WIDE_PAR_Y 81 + +#define NTSC_NORMAL_PAR_X 10 +#define NTSC_NORMAL_PAR_Y 11 +#define NTSC_WIDE_PAR_X 40 +#define NTSC_WIDE_PAR_Y 33 + +#define DV_DEFAULT_QUALITY DV_QUALITY_BEST +#define DV_DEFAULT_DECODE_NTH 1 + +GST_DEBUG_CATEGORY_STATIC (dvdec_debug); +#define GST_CAT_DEFAULT dvdec_debug + +enum +{ + PROP_0, + PROP_CLAMP_LUMA, + PROP_CLAMP_CHROMA, + PROP_QUALITY, + PROP_DECODE_NTH +}; + +const gint qualities[] = { + DV_QUALITY_DC, + DV_QUALITY_AC_1, + DV_QUALITY_AC_2, + DV_QUALITY_DC | DV_QUALITY_COLOR, + DV_QUALITY_AC_1 | DV_QUALITY_COLOR, + DV_QUALITY_AC_2 | DV_QUALITY_COLOR +}; + +static GstStaticPadTemplate sink_temp = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-dv, systemstream = (boolean) false") + ); + +static GstStaticPadTemplate src_temp = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-yuv, " + "format = (fourcc) YUY2, " + "width = (int) 720, " + "framerate = (fraction) [ 1/1, 60/1 ];" + "video/x-raw-rgb, " + "bpp = (int) 32, " + "depth = (int) 24, " + "endianness = (int) " G_STRINGIFY (G_BIG_ENDIAN) ", " + "red_mask = (int) 0x0000ff00, " + "green_mask = (int) 0x00ff0000, " + "blue_mask = (int) 0xff000000, " + "width = (int) 720, " + "framerate = (fraction) [ 1/1, 60/1 ];" + "video/x-raw-rgb, " + "bpp = (int) 24, " + "depth = (int) 24, " + "endianness = (int) " G_STRINGIFY (G_BIG_ENDIAN) ", " + "red_mask = (int) 0x00ff0000, " + "green_mask = (int) 0x0000ff00, " + "blue_mask = (int) 0x000000ff, " + "width = (int) 720, " "framerate = (fraction) [ 1/1, 60/1 ]") + ); + +#define GST_TYPE_DVDEC_QUALITY (gst_dvdec_quality_get_type()) +static GType +gst_dvdec_quality_get_type (void) +{ + static GType qtype = 0; + + if (qtype == 0) { + static const GEnumValue values[] = { + {0, "Monochrome, DC (Fastest)", "fastest"}, + {1, "Monochrome, first AC coefficient", "monochrome-ac"}, + {2, "Monochrome, highest quality", "monochrome-best"}, + {3, "Colour, DC, fastest", "colour-fastest"}, + {4, "Colour, using only the first AC coefficient", "colour-ac"}, + {5, "Highest quality colour decoding", "best"}, + {0, NULL, NULL}, + }; + + qtype = g_enum_register_static ("GstDVDecQualityEnum", values); + } + return qtype; +} + +GST_BOILERPLATE (GstDVDec, gst_dvdec, GstElement, GST_TYPE_ELEMENT); + +static void gst_dvdec_finalize (GObject * object); +static gboolean gst_dvdec_sink_setcaps (GstPad * pad, GstCaps * caps); +static GstFlowReturn gst_dvdec_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_dvdec_sink_event (GstPad * pad, GstEvent * event); + +static GstStateChangeReturn gst_dvdec_change_state (GstElement * element, + GstStateChange transition); + +static void gst_dvdec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_dvdec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +gst_dvdec_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &sink_temp); + gst_element_class_add_static_pad_template (element_class, &src_temp); + + gst_element_class_set_details_simple (element_class, "DV video decoder", + "Codec/Decoder/Video", + "Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net)", + "Erik Walthinsen ," "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (dvdec_debug, "dvdec", 0, "DV decoding element"); +} + +static void +gst_dvdec_class_init (GstDVDecClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_dvdec_finalize; + gobject_class->set_property = gst_dvdec_set_property; + gobject_class->get_property = gst_dvdec_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CLAMP_LUMA, + g_param_spec_boolean ("clamp-luma", "Clamp luma", "Clamp luma", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CLAMP_CHROMA, + g_param_spec_boolean ("clamp-chroma", "Clamp chroma", "Clamp chroma", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QUALITY, + g_param_spec_enum ("quality", "Quality", "Decoding quality", + GST_TYPE_DVDEC_QUALITY, DV_DEFAULT_QUALITY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DECODE_NTH, + g_param_spec_int ("drop-factor", "Drop Factor", "Only decode Nth frame", + 1, G_MAXINT, DV_DEFAULT_DECODE_NTH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = gst_dvdec_change_state; +} + +static void +gst_dvdec_init (GstDVDec * dvdec, GstDVDecClass * g_class) +{ + dvdec->sinkpad = gst_pad_new_from_static_template (&sink_temp, "sink"); + gst_pad_set_setcaps_function (dvdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvdec_sink_setcaps)); + gst_pad_set_chain_function (dvdec->sinkpad, gst_dvdec_chain); + gst_pad_set_event_function (dvdec->sinkpad, gst_dvdec_sink_event); + gst_element_add_pad (GST_ELEMENT (dvdec), dvdec->sinkpad); + + dvdec->srcpad = gst_pad_new_from_static_template (&src_temp, "src"); + gst_pad_use_fixed_caps (dvdec->srcpad); + gst_element_add_pad (GST_ELEMENT (dvdec), dvdec->srcpad); + + dvdec->framerate_numerator = 0; + dvdec->framerate_denominator = 0; + dvdec->wide = FALSE; + dvdec->drop_factor = 1; + + dvdec->clamp_luma = FALSE; + dvdec->clamp_chroma = FALSE; + dvdec->quality = DV_DEFAULT_QUALITY; + dvdec->segment = gst_segment_new (); +} + +static void +gst_dvdec_finalize (GObject * object) +{ + GstDVDec *dvdec = GST_DVDEC (object); + + gst_segment_free (dvdec->segment); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_dvdec_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstDVDec *dvdec; + GstStructure *s; + const GValue *par = NULL, *rate = NULL; + + dvdec = GST_DVDEC (gst_pad_get_parent (pad)); + + /* first parse the caps */ + s = gst_caps_get_structure (caps, 0); + + /* we allow framerate and PAR to be overwritten. framerate is mandatory. */ + if (!(rate = gst_structure_get_value (s, "framerate"))) + goto no_framerate; + par = gst_structure_get_value (s, "pixel-aspect-ratio"); + + if (par) { + dvdec->par_x = gst_value_get_fraction_numerator (par); + dvdec->par_y = gst_value_get_fraction_denominator (par); + dvdec->need_par = FALSE; + } else { + dvdec->par_x = 0; + dvdec->par_y = 0; + dvdec->need_par = TRUE; + } + dvdec->framerate_numerator = gst_value_get_fraction_numerator (rate); + dvdec->framerate_denominator = gst_value_get_fraction_denominator (rate); + dvdec->sink_negotiated = TRUE; + dvdec->src_negotiated = FALSE; + + gst_object_unref (dvdec); + + return TRUE; + + /* ERRORS */ +no_framerate: + { + GST_DEBUG_OBJECT (dvdec, "no framerate specified in caps"); + gst_object_unref (dvdec); + return FALSE; + } +} + +static gboolean +gst_dvdec_src_negotiate (GstDVDec * dvdec) +{ + GstCaps *othercaps; + + /* no PAR was specified in input, derive from encoded data */ + if (dvdec->need_par) { + if (dvdec->PAL) { + if (dvdec->wide) { + dvdec->par_x = PAL_WIDE_PAR_X; + dvdec->par_y = PAL_WIDE_PAR_Y; + } else { + dvdec->par_x = PAL_NORMAL_PAR_X; + dvdec->par_y = PAL_NORMAL_PAR_Y; + } + } else { + if (dvdec->wide) { + dvdec->par_x = NTSC_WIDE_PAR_X; + dvdec->par_y = NTSC_WIDE_PAR_Y; + } else { + dvdec->par_x = NTSC_NORMAL_PAR_X; + dvdec->par_y = NTSC_NORMAL_PAR_Y; + } + } + GST_DEBUG_OBJECT (dvdec, "Inferred PAR %d/%d from video format", + dvdec->par_x, dvdec->par_y); + } + + /* ignoring rgb, bgr0 for now */ + dvdec->bpp = 2; + + othercaps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_STR_FOURCC ("YUY2"), + "width", G_TYPE_INT, 720, + "height", G_TYPE_INT, dvdec->height, + "framerate", GST_TYPE_FRACTION, dvdec->framerate_numerator, + dvdec->framerate_denominator, + "pixel-aspect-ratio", GST_TYPE_FRACTION, dvdec->par_x, + dvdec->par_y, "interlaced", G_TYPE_BOOLEAN, dvdec->interlaced, NULL); + + gst_pad_set_caps (dvdec->srcpad, othercaps); + gst_caps_unref (othercaps); + + dvdec->src_negotiated = TRUE; + + return TRUE; +} + +static gboolean +gst_dvdec_sink_event (GstPad * pad, GstEvent * event) +{ + GstDVDec *dvdec; + gboolean res = TRUE; + + dvdec = GST_DVDEC (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_segment_init (dvdec->segment, GST_FORMAT_UNDEFINED); + break; + case GST_EVENT_NEWSEGMENT:{ + gboolean update; + gdouble rate, applied_rate; + GstFormat format; + gint64 start, stop, position; + + gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, + &format, &start, &stop, &position); + + GST_DEBUG_OBJECT (dvdec, "Got NEWSEGMENT [%" GST_TIME_FORMAT + " - %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "]", + GST_TIME_ARGS (start), GST_TIME_ARGS (stop), + GST_TIME_ARGS (position)); + + gst_segment_set_newsegment_full (dvdec->segment, update, rate, + applied_rate, format, start, stop, position); + break; + } + default: + break; + } + + res = gst_pad_push_event (dvdec->srcpad, event); + + return res; +} + +static GstFlowReturn +gst_dvdec_chain (GstPad * pad, GstBuffer * buf) +{ + GstDVDec *dvdec; + guint8 *inframe; + guint8 *outframe; + guint8 *outframe_ptrs[3]; + gint outframe_pitches[3]; + GstBuffer *outbuf; + GstFlowReturn ret = GST_FLOW_OK; + guint length; + gint64 cstart, cstop; + gboolean PAL, wide; + + dvdec = GST_DVDEC (gst_pad_get_parent (pad)); + inframe = GST_BUFFER_DATA (buf); + + /* buffer should be at least the size of one NTSC frame, this should + * be enough to decode the header. */ + if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < NTSC_BUFFER)) + goto wrong_size; + + /* preliminary dropping. unref and return if outside of configured segment */ + if ((dvdec->segment->format == GST_FORMAT_TIME) && + (!(gst_segment_clip (dvdec->segment, GST_FORMAT_TIME, + GST_BUFFER_TIMESTAMP (buf), + GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf), + &cstart, &cstop)))) + goto dropping; + + if (G_UNLIKELY (dv_parse_header (dvdec->decoder, inframe) < 0)) + goto parse_header_error; + + /* get size */ + PAL = dv_system_50_fields (dvdec->decoder); + wide = dv_format_wide (dvdec->decoder); + + /* check the buffer is of right size after we know if we are + * dealing with PAL or NTSC */ + length = (PAL ? PAL_BUFFER : NTSC_BUFFER); + if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < length)) + goto wrong_size; + + dv_parse_packs (dvdec->decoder, inframe); + + if (dvdec->video_offset % dvdec->drop_factor != 0) + goto skip; + + /* renegotiate on change */ + if (PAL != dvdec->PAL || wide != dvdec->wide) { + dvdec->src_negotiated = FALSE; + dvdec->PAL = PAL; + dvdec->wide = wide; + } + + dvdec->height = (dvdec->PAL ? PAL_HEIGHT : NTSC_HEIGHT); + + dvdec->interlaced = !dv_is_progressive (dvdec->decoder); + + /* negotiate if not done yet */ + if (!dvdec->src_negotiated) { + if (!gst_dvdec_src_negotiate (dvdec)) + goto not_negotiated; + } + + ret = + gst_pad_alloc_buffer_and_set_caps (dvdec->srcpad, 0, + (720 * dvdec->height) * dvdec->bpp, + GST_PAD_CAPS (dvdec->srcpad), &outbuf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto no_buffer; + + outframe = GST_BUFFER_DATA (outbuf); + + outframe_ptrs[0] = outframe; + outframe_pitches[0] = 720 * dvdec->bpp; + + /* the rest only matters for YUY2 */ + if (dvdec->bpp < 3) { + outframe_ptrs[1] = outframe_ptrs[0] + 720 * dvdec->height; + outframe_ptrs[2] = outframe_ptrs[1] + 360 * dvdec->height; + + outframe_pitches[1] = dvdec->height / 2; + outframe_pitches[2] = outframe_pitches[1]; + } + + GST_DEBUG_OBJECT (dvdec, "decoding and pushing buffer"); + dv_decode_full_frame (dvdec->decoder, inframe, + e_dv_color_yuv, outframe_ptrs, outframe_pitches); + + GST_BUFFER_FLAG_UNSET (outbuf, GST_VIDEO_BUFFER_TFF); + + GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buf); + GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_END (buf); + GST_BUFFER_TIMESTAMP (outbuf) = cstart; + GST_BUFFER_DURATION (outbuf) = cstop - cstart; + + ret = gst_pad_push (dvdec->srcpad, outbuf); + +skip: + dvdec->video_offset++; + +done: + gst_buffer_unref (buf); + gst_object_unref (dvdec); + + return ret; + + /* ERRORS */ +wrong_size: + { + GST_ELEMENT_ERROR (dvdec, STREAM, DECODE, + (NULL), ("Input buffer too small")); + ret = GST_FLOW_ERROR; + goto done; + } +parse_header_error: + { + GST_ELEMENT_ERROR (dvdec, STREAM, DECODE, + (NULL), ("Error parsing DV header")); + ret = GST_FLOW_ERROR; + goto done; + } +not_negotiated: + { + GST_DEBUG_OBJECT (dvdec, "could not negotiate output"); + ret = GST_FLOW_NOT_NEGOTIATED; + goto done; + } +no_buffer: + { + GST_DEBUG_OBJECT (dvdec, "could not allocate buffer"); + goto done; + } + +dropping: + { + GST_DEBUG_OBJECT (dvdec, + "dropping buffer since it's out of the configured segment"); + goto done; + } +} + +static GstStateChangeReturn +gst_dvdec_change_state (GstElement * element, GstStateChange transition) +{ + GstDVDec *dvdec = GST_DVDEC (element); + GstStateChangeReturn ret; + + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + dvdec->decoder = + dv_decoder_new (0, dvdec->clamp_luma, dvdec->clamp_chroma); + dvdec->decoder->quality = qualities[dvdec->quality]; + dv_set_error_log (dvdec->decoder, NULL); + gst_segment_init (dvdec->segment, GST_FORMAT_UNDEFINED); + dvdec->src_negotiated = FALSE; + dvdec->sink_negotiated = FALSE; + /* + * Enable this function call when libdv2 0.100 or higher is more + * common + */ + /* dv_set_quality (dvdec->decoder, qualities [dvdec->quality]); */ + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + default: + break; + } + + ret = parent_class->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + dv_decoder_free (dvdec->decoder); + dvdec->decoder = NULL; + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +static void +gst_dvdec_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstDVDec *dvdec = GST_DVDEC (object); + + switch (prop_id) { + case PROP_CLAMP_LUMA: + dvdec->clamp_luma = g_value_get_boolean (value); + break; + case PROP_CLAMP_CHROMA: + dvdec->clamp_chroma = g_value_get_boolean (value); + break; + case PROP_QUALITY: + dvdec->quality = g_value_get_enum (value); + if ((dvdec->quality < 0) || (dvdec->quality > 5)) + dvdec->quality = 0; + break; + case PROP_DECODE_NTH: + dvdec->drop_factor = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_dvdec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstDVDec *dvdec = GST_DVDEC (object); + + switch (prop_id) { + case PROP_CLAMP_LUMA: + g_value_set_boolean (value, dvdec->clamp_luma); + break; + case PROP_CLAMP_CHROMA: + g_value_set_boolean (value, dvdec->clamp_chroma); + break; + case PROP_QUALITY: + g_value_set_enum (value, dvdec->quality); + break; + case PROP_DECODE_NTH: + g_value_set_int (value, dvdec->drop_factor); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/ext/dv/gstdvdec.h b/ext/dv/gstdvdec.h new file mode 100644 index 0000000..de8481d --- /dev/null +++ b/ext/dv/gstdvdec.h @@ -0,0 +1,95 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_DVDEC_H__ +#define __GST_DVDEC_H__ + + +#include +#include + + +G_BEGIN_DECLS + + +#define GST_TYPE_DVDEC \ + (gst_dvdec_get_type()) +#define GST_DVDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DVDEC,GstDVDec)) +#define GST_DVDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DVDEC,GstDVDecClass)) +#define GST_IS_DVDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DVDEC)) +#define GST_IS_DVDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVDEC)) + + +typedef struct _GstDVDec GstDVDec; +typedef struct _GstDVDecClass GstDVDecClass; + + +struct _GstDVDec { + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; + + dv_decoder_t *decoder; + gboolean clamp_luma; + gboolean clamp_chroma; + gint quality; + + gboolean PAL; + gboolean interlaced; + gboolean wide; + gint frame_len; + + /* input caps */ + gboolean sink_negotiated; + gint framerate_numerator; + gint framerate_denominator; + gint height; + gint par_x; + gint par_y; + gboolean need_par; + + /* negotiated output */ + dv_color_space_t space; + gint bpp; + gboolean src_negotiated; + + gint video_offset; + gint drop_factor; + + GstSegment *segment; +}; + +struct _GstDVDecClass { + GstElementClass parent_class; +}; + + +GType gst_dvdec_get_type (void); + + +G_END_DECLS + + +#endif /* __GST_DVDEC_H__ */ diff --git a/ext/dv/gstdvdemux.c b/ext/dv/gstdvdemux.c new file mode 100644 index 0000000..467ebe5 --- /dev/null +++ b/ext/dv/gstdvdemux.c @@ -0,0 +1,1908 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * <2005> Wim Taymans + * + * 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 + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include + +#include +#include "gstdvdemux.h" +#include "gstsmptetimecode.h" + +/** + * SECTION:element-dvdemux + * + * dvdemux splits raw DV into its audio and video components. The audio will be + * decoded raw samples and the video will be encoded DV video. + * + * This element can operate in both push and pull mode depending on the + * capabilities of the upstream peer. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=test.dv ! dvdemux name=demux ! queue ! audioconvert ! alsasink demux. ! queue ! dvdec ! xvimagesink + * ]| This pipeline decodes and renders the raw DV stream to an audio and a videosink. + * + * + * Last reviewed on 2006-02-27 (0.10.3) + */ + +/* DV output has two modes, normal and wide. The resolution is the same in both + * cases: 720 pixels wide by 576 pixels tall in PAL format, and 720x480 for + * NTSC. + * + * Each of the modes has its own pixel aspect ratio, which is fixed in practice + * by ITU-R BT.601 (also known as "CCIR-601" or "Rec.601"). Or so claims a + * reference that I culled from the reliable "internet", + * http://www.mir.com/DMG/aspect.html. Normal PAL is 59/54 and normal NTSC is + * 10/11. Because the pixel resolution is the same for both cases, we can get + * the pixel aspect ratio for wide recordings by multiplying by the ratio of + * display aspect ratios, 16/9 (for wide) divided by 4/3 (for normal): + * + * Wide NTSC: 10/11 * (16/9)/(4/3) = 40/33 + * Wide PAL: 59/54 * (16/9)/(4/3) = 118/81 + * + * However, the pixel resolution coming out of a DV source does not combine with + * the standard pixel aspect ratios to give a proper display aspect ratio. An + * image 480 pixels tall, with a 4:3 display aspect ratio, will be 768 pixels + * wide. But, if we take the normal PAL aspect ratio of 59/54, and multiply it + * with the width of the DV image (720 pixels), we get 786.666..., which is + * nonintegral and too wide. The camera is not outputting a 4:3 image. + * + * If the video sink for this stream has fixed dimensions (such as for + * fullscreen playback, or for a java applet in a web page), you then have two + * choices. Either you show the whole image, but pad the image with black + * borders on the top and bottom (like watching a widescreen video on a 4:3 + * device), or you crop the video to the proper ratio. Apparently the latter is + * the standard practice. + * + * For its part, GStreamer is concerned with accuracy and preservation of + * information. This element outputs the 720x576 or 720x480 video that it + * recieves, noting the proper aspect ratio. This should not be a problem for + * windowed applications, which can change size to fit the video. Applications + * with fixed size requirements should decide whether to crop or pad which + * an element such as videobox can do. + */ + +#define NTSC_HEIGHT 480 +#define NTSC_BUFFER 120000 +#define NTSC_FRAMERATE_NUMERATOR 30000 +#define NTSC_FRAMERATE_DENOMINATOR 1001 + +#define PAL_HEIGHT 576 +#define PAL_BUFFER 144000 +#define PAL_FRAMERATE_NUMERATOR 25 +#define PAL_FRAMERATE_DENOMINATOR 1 + +#define PAL_NORMAL_PAR_X 59 +#define PAL_NORMAL_PAR_Y 54 +#define PAL_WIDE_PAR_X 118 +#define PAL_WIDE_PAR_Y 81 + +#define NTSC_NORMAL_PAR_X 10 +#define NTSC_NORMAL_PAR_Y 11 +#define NTSC_WIDE_PAR_X 40 +#define NTSC_WIDE_PAR_Y 33 + +GST_DEBUG_CATEGORY_STATIC (dvdemux_debug); +#define GST_CAT_DEFAULT dvdemux_debug + +static GstStaticPadTemplate sink_temp = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-dv, systemstream = (boolean) true") + ); + +static GstStaticPadTemplate video_src_temp = GST_STATIC_PAD_TEMPLATE ("video", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("video/x-dv, systemstream = (boolean) false") + ); + +static GstStaticPadTemplate audio_src_temp = GST_STATIC_PAD_TEMPLATE ("audio", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("audio/x-raw-int, " + "depth = (int) 16, " + "width = (int) 16, " + "signed = (boolean) TRUE, " + "channels = (int) {2, 4}, " + "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " + "rate = (int) { 32000, 44100, 48000 }") + ); + + +GST_BOILERPLATE (GstDVDemux, gst_dvdemux, GstElement, GST_TYPE_ELEMENT); + +static void gst_dvdemux_finalize (GObject * object); + +/* query functions */ +static const GstQueryType *gst_dvdemux_get_src_query_types (GstPad * pad); +static gboolean gst_dvdemux_src_query (GstPad * pad, GstQuery * query); +static const GstQueryType *gst_dvdemux_get_sink_query_types (GstPad * pad); +static gboolean gst_dvdemux_sink_query (GstPad * pad, GstQuery * query); + +/* convert functions */ +static gboolean gst_dvdemux_sink_convert (GstDVDemux * demux, + GstFormat src_format, gint64 src_value, GstFormat * dest_format, + gint64 * dest_value); +static gboolean gst_dvdemux_src_convert (GstDVDemux * demux, GstPad * pad, + GstFormat src_format, gint64 src_value, GstFormat * dest_format, + gint64 * dest_value); + +/* event functions */ +static gboolean gst_dvdemux_send_event (GstElement * element, GstEvent * event); +static gboolean gst_dvdemux_handle_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_dvdemux_handle_sink_event (GstPad * pad, GstEvent * event); + +/* scheduling functions */ +static void gst_dvdemux_loop (GstPad * pad); +static GstFlowReturn gst_dvdemux_flush (GstDVDemux * dvdemux); +static GstFlowReturn gst_dvdemux_chain (GstPad * pad, GstBuffer * buffer); + +/* state change functions */ +static gboolean gst_dvdemux_sink_activate (GstPad * sinkpad); +static gboolean gst_dvdemux_sink_activate_push (GstPad * sinkpad, + gboolean active); +static gboolean gst_dvdemux_sink_activate_pull (GstPad * sinkpad, + gboolean active); +static GstStateChangeReturn gst_dvdemux_change_state (GstElement * element, + GstStateChange transition); + +static void +gst_dvdemux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &sink_temp); + gst_element_class_add_static_pad_template (element_class, + &video_src_temp); + gst_element_class_add_static_pad_template (element_class, + &audio_src_temp); + + gst_element_class_set_details_simple (element_class, + "DV system stream demuxer", "Codec/Demuxer", + "Uses libdv to separate DV audio from DV video (libdv.sourceforge.net)", + "Erik Walthinsen , Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (dvdemux_debug, "dvdemux", 0, "DV demuxer element"); +} + +static void +gst_dvdemux_class_init (GstDVDemuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_dvdemux_finalize; + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_dvdemux_change_state); + gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_dvdemux_send_event); +} + +static void +gst_dvdemux_init (GstDVDemux * dvdemux, GstDVDemuxClass * g_class) +{ + gint i; + + dvdemux->sinkpad = gst_pad_new_from_static_template (&sink_temp, "sink"); + /* we can operate in pull and push mode so we install + * a custom activate function */ + gst_pad_set_activate_function (dvdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvdemux_sink_activate)); + /* the function to activate in push mode */ + gst_pad_set_activatepush_function (dvdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvdemux_sink_activate_push)); + /* the function to activate in pull mode */ + gst_pad_set_activatepull_function (dvdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvdemux_sink_activate_pull)); + /* for push mode, this is the chain function */ + gst_pad_set_chain_function (dvdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvdemux_chain)); + /* handling events (in push mode only) */ + gst_pad_set_event_function (dvdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvdemux_handle_sink_event)); + /* query functions */ + gst_pad_set_query_function (dvdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvdemux_sink_query)); + gst_pad_set_query_type_function (dvdemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_dvdemux_get_sink_query_types)); + + /* now add the pad */ + gst_element_add_pad (GST_ELEMENT (dvdemux), dvdemux->sinkpad); + + dvdemux->adapter = gst_adapter_new (); + + /* we need 4 temp buffers for audio decoding which are of a static + * size and which we can allocate here */ + for (i = 0; i < 4; i++) { + dvdemux->audio_buffers[i] = + (gint16 *) g_malloc (DV_AUDIO_MAX_SAMPLES * sizeof (gint16)); + } +} + +static void +gst_dvdemux_finalize (GObject * object) +{ + GstDVDemux *dvdemux; + gint i; + + dvdemux = GST_DVDEMUX (object); + + g_object_unref (dvdemux->adapter); + + /* clean up temp audio buffers */ + for (i = 0; i < 4; i++) { + g_free (dvdemux->audio_buffers[i]); + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* reset to default values before starting streaming */ +static void +gst_dvdemux_reset (GstDVDemux * dvdemux) +{ + dvdemux->frame_offset = 0; + dvdemux->audio_offset = 0; + dvdemux->video_offset = 0; + dvdemux->framecount = 0; + g_atomic_int_set (&dvdemux->found_header, 0); + dvdemux->frame_len = -1; + dvdemux->need_segment = FALSE; + dvdemux->new_media = FALSE; + dvdemux->framerate_numerator = 0; + dvdemux->framerate_denominator = 0; + dvdemux->height = 0; + dvdemux->frequency = 0; + dvdemux->channels = 0; + dvdemux->wide = FALSE; + gst_segment_init (&dvdemux->byte_segment, GST_FORMAT_BYTES); + gst_segment_init (&dvdemux->time_segment, GST_FORMAT_TIME); +} + +static GstPad * +gst_dvdemux_add_pad (GstDVDemux * dvdemux, GstStaticPadTemplate * template) +{ + gboolean no_more_pads; + GstPad *pad; + + pad = gst_pad_new_from_static_template (template, template->name_template); + + gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_dvdemux_src_query)); + + gst_pad_set_query_type_function (pad, + GST_DEBUG_FUNCPTR (gst_dvdemux_get_src_query_types)); + gst_pad_set_event_function (pad, + GST_DEBUG_FUNCPTR (gst_dvdemux_handle_src_event)); + gst_pad_use_fixed_caps (pad); + gst_pad_set_active (pad, TRUE); + gst_element_add_pad (GST_ELEMENT (dvdemux), pad); + + no_more_pads = + (dvdemux->videosrcpad != NULL && template == &audio_src_temp) || + (dvdemux->audiosrcpad != NULL && template == &video_src_temp); + + if (no_more_pads) + gst_element_no_more_pads (GST_ELEMENT (dvdemux)); + + gst_pad_push_event (pad, gst_event_new_new_segment (FALSE, + dvdemux->byte_segment.rate, GST_FORMAT_TIME, + dvdemux->time_segment.start, dvdemux->time_segment.stop, + dvdemux->time_segment.start)); + + if (no_more_pads) { + gst_element_found_tags (GST_ELEMENT (dvdemux), + gst_tag_list_new_full (GST_TAG_CONTAINER_FORMAT, "DV", NULL)); + } + + return pad; +} + +static void +gst_dvdemux_remove_pads (GstDVDemux * dvdemux) +{ + if (dvdemux->videosrcpad) { + gst_element_remove_pad (GST_ELEMENT (dvdemux), dvdemux->videosrcpad); + dvdemux->videosrcpad = NULL; + } + if (dvdemux->audiosrcpad) { + gst_element_remove_pad (GST_ELEMENT (dvdemux), dvdemux->audiosrcpad); + dvdemux->audiosrcpad = NULL; + } +} + +static gboolean +gst_dvdemux_src_convert (GstDVDemux * dvdemux, GstPad * pad, + GstFormat src_format, gint64 src_value, GstFormat * dest_format, + gint64 * dest_value) +{ + gboolean res = TRUE; + + if (*dest_format == src_format || src_value == -1) { + *dest_value = src_value; + goto done; + } + + if (dvdemux->frame_len <= 0) + goto error; + + if (dvdemux->decoder == NULL) + goto error; + + GST_INFO_OBJECT (pad, + "src_value:%" G_GINT64_FORMAT ", src_format:%d, dest_format:%d", + src_value, src_format, *dest_format); + + switch (src_format) { + case GST_FORMAT_BYTES: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + if (pad == dvdemux->videosrcpad) + *dest_value = src_value / dvdemux->frame_len; + else if (pad == dvdemux->audiosrcpad) + *dest_value = src_value / (2 * dvdemux->channels); + break; + case GST_FORMAT_TIME: + *dest_format = GST_FORMAT_TIME; + if (pad == dvdemux->videosrcpad) + *dest_value = gst_util_uint64_scale (src_value, + GST_SECOND * dvdemux->framerate_denominator, + dvdemux->frame_len * dvdemux->framerate_numerator); + else if (pad == dvdemux->audiosrcpad) + *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, + 2 * dvdemux->frequency * dvdemux->channels); + break; + default: + res = FALSE; + } + break; + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_BYTES: + if (pad == dvdemux->videosrcpad) + *dest_value = gst_util_uint64_scale (src_value, + dvdemux->frame_len * dvdemux->framerate_numerator, + dvdemux->framerate_denominator * GST_SECOND); + else if (pad == dvdemux->audiosrcpad) + *dest_value = gst_util_uint64_scale_int (src_value, + 2 * dvdemux->frequency * dvdemux->channels, GST_SECOND); + break; + case GST_FORMAT_DEFAULT: + if (pad == dvdemux->videosrcpad) { + if (src_value) + *dest_value = gst_util_uint64_scale (src_value, + dvdemux->framerate_numerator, + dvdemux->framerate_denominator * GST_SECOND); + else + *dest_value = 0; + } else if (pad == dvdemux->audiosrcpad) { + *dest_value = gst_util_uint64_scale (src_value, + dvdemux->frequency, GST_SECOND); + } + break; + default: + res = FALSE; + } + break; + case GST_FORMAT_DEFAULT: + switch (*dest_format) { + case GST_FORMAT_TIME: + if (pad == dvdemux->videosrcpad) { + *dest_value = gst_util_uint64_scale (src_value, + GST_SECOND * dvdemux->framerate_denominator, + dvdemux->framerate_numerator); + } else if (pad == dvdemux->audiosrcpad) { + if (src_value) + *dest_value = gst_util_uint64_scale (src_value, + GST_SECOND, dvdemux->frequency); + else + *dest_value = 0; + } + break; + case GST_FORMAT_BYTES: + if (pad == dvdemux->videosrcpad) { + *dest_value = src_value * dvdemux->frame_len; + } else if (pad == dvdemux->audiosrcpad) { + *dest_value = src_value * 2 * dvdemux->channels; + } + break; + default: + res = FALSE; + } + break; + default: + res = FALSE; + } + +done: + GST_INFO_OBJECT (pad, + "Result : dest_format:%d, dest_value:%" G_GINT64_FORMAT ", res:%d", + *dest_format, *dest_value, res); + return res; + + /* ERRORS */ +error: + { + GST_INFO ("source conversion failed"); + return FALSE; + } +} + +static gboolean +gst_dvdemux_sink_convert (GstDVDemux * dvdemux, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value) +{ + gboolean res = TRUE; + + GST_DEBUG_OBJECT (dvdemux, "%d -> %d", src_format, *dest_format); + GST_INFO_OBJECT (dvdemux, + "src_value:%" G_GINT64_FORMAT ", src_format:%d, dest_format:%d", + src_value, src_format, *dest_format); + + if (*dest_format == GST_FORMAT_DEFAULT) + *dest_format = GST_FORMAT_TIME; + + if (*dest_format == src_format || src_value == -1) { + *dest_value = src_value; + goto done; + } + + if (dvdemux->frame_len <= 0) + goto error; + + switch (src_format) { + case GST_FORMAT_BYTES: + switch (*dest_format) { + case GST_FORMAT_TIME: + { + guint64 frame; + + /* get frame number, rounds down so don't combine this + * line and the next line. */ + frame = src_value / dvdemux->frame_len; + + *dest_value = gst_util_uint64_scale (frame, + GST_SECOND * dvdemux->framerate_denominator, + dvdemux->framerate_numerator); + break; + } + default: + res = FALSE; + } + break; + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_BYTES: + { + guint64 frame; + + /* calculate the frame */ + frame = + gst_util_uint64_scale (src_value, dvdemux->framerate_numerator, + dvdemux->framerate_denominator * GST_SECOND); + + /* calculate the offset from the rounded frame */ + *dest_value = frame * dvdemux->frame_len; + break; + } + default: + res = FALSE; + } + break; + default: + res = FALSE; + } + GST_INFO_OBJECT (dvdemux, + "Result : dest_format:%d, dest_value:%" G_GINT64_FORMAT ", res:%d", + *dest_format, *dest_value, res); + +done: + return res; + +error: + { + GST_INFO_OBJECT (dvdemux, "sink conversion failed"); + return FALSE; + } +} + +static const GstQueryType * +gst_dvdemux_get_src_query_types (GstPad * pad) +{ + static const GstQueryType src_query_types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_CONVERT, + 0 + }; + + return src_query_types; +} + +static gboolean +gst_dvdemux_src_query (GstPad * pad, GstQuery * query) +{ + gboolean res = TRUE; + GstDVDemux *dvdemux; + + dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + gint64 cur; + + /* get target format */ + gst_query_parse_position (query, &format, NULL); + + /* bring the position to the requested format. */ + if (!(res = gst_dvdemux_src_convert (dvdemux, pad, + GST_FORMAT_TIME, dvdemux->time_segment.last_stop, + &format, &cur))) + goto error; + gst_query_set_position (query, format, cur); + break; + } + case GST_QUERY_DURATION: + { + GstFormat format; + GstFormat format2; + gint64 end; + + /* First ask the peer in the original format */ + if (!gst_pad_peer_query (dvdemux->sinkpad, query)) { + /* get target format */ + gst_query_parse_duration (query, &format, NULL); + + /* change query to bytes to perform on peer */ + gst_query_set_duration (query, GST_FORMAT_BYTES, -1); + + /* Now ask the peer in BYTES format and try to convert */ + if (!gst_pad_peer_query (dvdemux->sinkpad, query)) { + goto error; + } + + /* get peer total length */ + gst_query_parse_duration (query, NULL, &end); + + /* convert end to requested format */ + if (end != -1) { + format2 = format; + if (!(res = gst_dvdemux_sink_convert (dvdemux, + GST_FORMAT_BYTES, end, &format2, &end))) { + goto error; + } + gst_query_set_duration (query, format, end); + } + } + break; + } + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if (!(res = + gst_dvdemux_src_convert (dvdemux, pad, src_fmt, src_val, + &dest_fmt, &dest_val))) + goto error; + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + gst_object_unref (dvdemux); + + return res; + + /* ERRORS */ +error: + { + gst_object_unref (dvdemux); + GST_DEBUG ("error source query"); + return FALSE; + } +} + +static const GstQueryType * +gst_dvdemux_get_sink_query_types (GstPad * pad) +{ + static const GstQueryType sink_query_types[] = { + GST_QUERY_CONVERT, + 0 + }; + + return sink_query_types; +} + +static gboolean +gst_dvdemux_sink_query (GstPad * pad, GstQuery * query) +{ + gboolean res = TRUE; + GstDVDemux *dvdemux; + + dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if (!(res = + gst_dvdemux_sink_convert (dvdemux, src_fmt, src_val, &dest_fmt, + &dest_val))) + goto error; + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + gst_object_unref (dvdemux); + + return res; + + /* ERRORS */ +error: + { + gst_object_unref (dvdemux); + GST_DEBUG ("error handling sink query"); + return FALSE; + } +} + +/* takes ownership of the event */ +static gboolean +gst_dvdemux_push_event (GstDVDemux * dvdemux, GstEvent * event) +{ + gboolean res = FALSE; + + if (dvdemux->videosrcpad) { + gst_event_ref (event); + res |= gst_pad_push_event (dvdemux->videosrcpad, event); + } + + if (dvdemux->audiosrcpad) + res |= gst_pad_push_event (dvdemux->audiosrcpad, event); + else + gst_event_unref (event); + + return res; +} + +static gboolean +gst_dvdemux_handle_sink_event (GstPad * pad, GstEvent * event) +{ + GstDVDemux *dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); + gboolean res = TRUE; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_START: + /* we are not blocking on anything exect the push() calls + * to the peer which will be unblocked by forwarding the + * event.*/ + res = gst_dvdemux_push_event (dvdemux, event); + break; + case GST_EVENT_FLUSH_STOP: + gst_adapter_clear (dvdemux->adapter); + GST_DEBUG ("cleared adapter"); + gst_segment_init (&dvdemux->byte_segment, GST_FORMAT_BYTES); + gst_segment_init (&dvdemux->time_segment, GST_FORMAT_TIME); + res = gst_dvdemux_push_event (dvdemux, event); + break; + case GST_EVENT_NEWSEGMENT: + { + gboolean update; + gdouble rate; + GstFormat format; + gint64 start, stop, time; + + /* parse byte start and stop positions */ + gst_event_parse_new_segment (event, &update, &rate, &format, + &start, &stop, &time); + + switch (format) { + case GST_FORMAT_BYTES: + gst_segment_set_newsegment (&dvdemux->byte_segment, update, + rate, format, start, stop, time); + + /* the update can always be sent */ + if (update) { + GstEvent *update; + + update = gst_event_new_new_segment (TRUE, + dvdemux->time_segment.rate, dvdemux->time_segment.format, + dvdemux->time_segment.start, dvdemux->time_segment.last_stop, + dvdemux->time_segment.time); + + gst_dvdemux_push_event (dvdemux, update); + } else { + /* and queue a SEGMENT before sending the next set of buffers, we + * cannot convert to time yet as we might not know the size of the + * frames, etc.. */ + dvdemux->need_segment = TRUE; + } + gst_event_unref (event); + break; + case GST_FORMAT_TIME: + gst_segment_set_newsegment (&dvdemux->time_segment, update, + rate, format, start, stop, time); + + /* and we can just forward this time event */ + res = gst_dvdemux_push_event (dvdemux, event); + break; + default: + gst_event_unref (event); + /* cannot accept this format */ + res = FALSE; + break; + } + break; + } + case GST_EVENT_EOS: + /* flush any pending data, should be nothing left. */ + gst_dvdemux_flush (dvdemux); + /* forward event */ + res = gst_dvdemux_push_event (dvdemux, event); + /* and clear the adapter */ + gst_adapter_clear (dvdemux->adapter); + break; + default: + res = gst_dvdemux_push_event (dvdemux, event); + break; + } + + gst_object_unref (dvdemux); + + return res; +} + +/* convert a pair of values on the given srcpad */ +static gboolean +gst_dvdemux_convert_src_pair (GstDVDemux * dvdemux, GstPad * pad, + GstFormat src_format, gint64 src_start, gint64 src_stop, + GstFormat dst_format, gint64 * dst_start, gint64 * dst_stop) +{ + gboolean res; + + GST_INFO ("starting conversion of start"); + /* bring the format to time on srcpad. */ + if (!(res = gst_dvdemux_src_convert (dvdemux, pad, + src_format, src_start, &dst_format, dst_start))) { + goto done; + } + GST_INFO ("Finished conversion of start: %" G_GINT64_FORMAT, *dst_start); + + GST_INFO ("starting conversion of stop"); + /* bring the format to time on srcpad. */ + if (!(res = gst_dvdemux_src_convert (dvdemux, pad, + src_format, src_stop, &dst_format, dst_stop))) { + /* could not convert seek format to time offset */ + goto done; + } + GST_INFO ("Finished conversion of stop: %" G_GINT64_FORMAT, *dst_stop); +done: + return res; +} + +/* convert a pair of values on the sinkpad */ +static gboolean +gst_dvdemux_convert_sink_pair (GstDVDemux * dvdemux, + GstFormat src_format, gint64 src_start, gint64 src_stop, + GstFormat dst_format, gint64 * dst_start, gint64 * dst_stop) +{ + gboolean res; + + GST_INFO ("starting conversion of start"); + /* bring the format to time on srcpad. */ + if (!(res = gst_dvdemux_sink_convert (dvdemux, + src_format, src_start, &dst_format, dst_start))) { + goto done; + } + GST_INFO ("Finished conversion of start: %" G_GINT64_FORMAT, *dst_start); + + GST_INFO ("starting conversion of stop"); + /* bring the format to time on srcpad. */ + if (!(res = gst_dvdemux_sink_convert (dvdemux, + src_format, src_stop, &dst_format, dst_stop))) { + /* could not convert seek format to time offset */ + goto done; + } + GST_INFO ("Finished conversion of stop: %" G_GINT64_FORMAT, *dst_stop); +done: + return res; +} + +/* convert a pair of values on the srcpad to a pair of + * values on the sinkpad + */ +static gboolean +gst_dvdemux_convert_src_to_sink (GstDVDemux * dvdemux, GstPad * pad, + GstFormat src_format, gint64 src_start, gint64 src_stop, + GstFormat dst_format, gint64 * dst_start, gint64 * dst_stop) +{ + GstFormat conv; + gboolean res; + + conv = GST_FORMAT_TIME; + /* convert to TIME intermediate format */ + if (!(res = gst_dvdemux_convert_src_pair (dvdemux, pad, + src_format, src_start, src_stop, conv, dst_start, dst_stop))) { + /* could not convert format to time offset */ + goto done; + } + /* convert to dst format on sinkpad */ + if (!(res = gst_dvdemux_convert_sink_pair (dvdemux, + conv, *dst_start, *dst_stop, dst_format, dst_start, dst_stop))) { + /* could not convert format to time offset */ + goto done; + } +done: + return res; +} + +#if 0 +static gboolean +gst_dvdemux_convert_segment (GstDVDemux * dvdemux, GstSegment * src, + GstSegment * dest) +{ + dest->rate = src->rate; + dest->abs_rate = src->abs_rate; + dest->flags = src->flags; + + return TRUE; +} +#endif + +/* handle seek in push base mode. + * + * Convert the time seek to a bytes seek and send it + * upstream + * Does not take ownership of the event. + */ +static gboolean +gst_dvdemux_handle_push_seek (GstDVDemux * dvdemux, GstPad * pad, + GstEvent * event) +{ + gboolean res = FALSE; + gdouble rate; + GstSeekFlags flags; + GstFormat format; + GstSeekType cur_type, stop_type; + gint64 cur, stop; + gint64 start_position, end_position; + GstEvent *newevent; + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + /* First try if upstream can handle time based seeks */ + if (format == GST_FORMAT_TIME) + res = gst_pad_push_event (dvdemux->sinkpad, gst_event_ref (event)); + + if (!res) { + /* we convert the start/stop on the srcpad to the byte format + * on the sinkpad and forward the event */ + res = gst_dvdemux_convert_src_to_sink (dvdemux, pad, + format, cur, stop, GST_FORMAT_BYTES, &start_position, &end_position); + if (!res) + goto done; + + /* now this is the updated seek event on bytes */ + newevent = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, + cur_type, start_position, stop_type, end_position); + + res = gst_pad_push_event (dvdemux->sinkpad, newevent); + } +done: + return res; +} + +/* position ourselves to the configured segment, used in pull mode. + * The input segment is in TIME format. We convert the time values + * to bytes values into our byte_segment which we use to pull data from + * the sinkpad peer. + */ +static gboolean +gst_dvdemux_do_seek (GstDVDemux * demux, GstSegment * segment) +{ + gboolean res; + GstFormat format; + + /* position to value configured is last_stop, this will round down + * to the byte position where the frame containing the given + * timestamp can be found. */ + format = GST_FORMAT_BYTES; + res = gst_dvdemux_sink_convert (demux, + segment->format, segment->last_stop, + &format, &demux->byte_segment.last_stop); + if (!res) + goto done; + + /* update byte segment start */ + gst_dvdemux_sink_convert (demux, + segment->format, segment->start, &format, &demux->byte_segment.start); + + /* update byte segment stop */ + gst_dvdemux_sink_convert (demux, + segment->format, segment->stop, &format, &demux->byte_segment.stop); + + /* update byte segment time */ + gst_dvdemux_sink_convert (demux, + segment->format, segment->time, &format, &demux->byte_segment.time); + + /* calculate current frame number */ + format = GST_FORMAT_DEFAULT; + gst_dvdemux_src_convert (demux, demux->videosrcpad, + segment->format, segment->start, &format, &demux->video_offset); + + /* calculate current audio number */ + format = GST_FORMAT_DEFAULT; + gst_dvdemux_src_convert (demux, demux->audiosrcpad, + segment->format, segment->start, &format, &demux->audio_offset); + + /* every DV frame corresponts with one video frame */ + demux->frame_offset = demux->video_offset; + +done: + return res; +} + +/* handle seek in pull base mode. + * + * Does not take ownership of the event. + */ +static gboolean +gst_dvdemux_handle_pull_seek (GstDVDemux * demux, GstPad * pad, + GstEvent * event) +{ + gboolean res; + gdouble rate; + GstFormat format; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + gint64 cur, stop; + gboolean flush; + gboolean update; + GstSegment seeksegment; + + GST_DEBUG_OBJECT (demux, "doing seek"); + + /* first bring the event format to TIME, our native format + * to perform the seek on */ + if (event) { + GstFormat conv; + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + /* can't seek backwards yet */ + if (rate <= 0.0) + goto wrong_rate; + + /* convert input format to TIME */ + conv = GST_FORMAT_TIME; + if (!(gst_dvdemux_convert_src_pair (demux, pad, + format, cur, stop, conv, &cur, &stop))) + goto no_format; + + format = GST_FORMAT_TIME; + } else { + flags = 0; + } + + flush = flags & GST_SEEK_FLAG_FLUSH; + + /* send flush start */ + if (flush) + gst_dvdemux_push_event (demux, gst_event_new_flush_start ()); + else + gst_pad_pause_task (demux->sinkpad); + + /* grab streaming lock, this should eventually be possible, either + * because the task is paused or our streaming thread stopped + * because our peer is flushing. */ + GST_PAD_STREAM_LOCK (demux->sinkpad); + + /* make copy into temp structure, we can only update the main one + * when the subclass actually could to the seek. */ + memcpy (&seeksegment, &demux->time_segment, sizeof (GstSegment)); + + /* now configure the seek segment */ + if (event) { + gst_segment_set_seek (&seeksegment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + } + + GST_DEBUG_OBJECT (demux, "segment configured from %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT ", position %" G_GINT64_FORMAT, + seeksegment.start, seeksegment.stop, seeksegment.last_stop); + + /* do the seek, segment.last_stop contains new position. */ + res = gst_dvdemux_do_seek (demux, &seeksegment); + + /* and prepare to continue streaming */ + if (flush) { + /* send flush stop, peer will accept data and events again. We + * are not yet providing data as we still have the STREAM_LOCK. */ + gst_dvdemux_push_event (demux, gst_event_new_flush_stop ()); + } else if (res && demux->running) { + /* we are running the current segment and doing a non-flushing seek, + * close the segment first based on the last_stop. */ + GST_DEBUG_OBJECT (demux, "closing running segment %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, demux->time_segment.start, + demux->time_segment.last_stop); + + gst_dvdemux_push_event (demux, + gst_event_new_new_segment (TRUE, + demux->time_segment.rate, demux->time_segment.format, + demux->time_segment.start, demux->time_segment.last_stop, + demux->time_segment.time)); + } + + /* if successfull seek, we update our real segment and push + * out the new segment. */ + if (res) { + memcpy (&demux->time_segment, &seeksegment, sizeof (GstSegment)); + + if (demux->time_segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT_CAST (demux), + gst_message_new_segment_start (GST_OBJECT_CAST (demux), + demux->time_segment.format, demux->time_segment.last_stop)); + } + if ((stop = demux->time_segment.stop) == -1) + stop = demux->time_segment.duration; + + GST_INFO_OBJECT (demux, + "Saving newsegment event to be sent in streaming thread"); + + if (demux->pending_segment) + gst_event_unref (demux->pending_segment); + + demux->pending_segment = gst_event_new_new_segment (FALSE, + demux->time_segment.rate, demux->time_segment.format, + demux->time_segment.last_stop, stop, demux->time_segment.time); + + demux->need_segment = FALSE; + } + + demux->running = TRUE; + /* and restart the task in case it got paused explicitely or by + * the FLUSH_START event we pushed out. */ + gst_pad_start_task (demux->sinkpad, (GstTaskFunction) gst_dvdemux_loop, + demux->sinkpad); + + /* and release the lock again so we can continue streaming */ + GST_PAD_STREAM_UNLOCK (demux->sinkpad); + + return TRUE; + + /* ERRORS */ +wrong_rate: + { + GST_DEBUG_OBJECT (demux, "negative playback rate %lf not supported.", rate); + return FALSE; + } +no_format: + { + GST_DEBUG_OBJECT (demux, "cannot convert to TIME format, seek aborted."); + return FALSE; + } +} + +static gboolean +gst_dvdemux_send_event (GstElement * element, GstEvent * event) +{ + GstDVDemux *dvdemux = GST_DVDEMUX (element); + gboolean res = FALSE; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + { + /* checking header and configuring the seek must be atomic */ + GST_OBJECT_LOCK (dvdemux); + if (g_atomic_int_get (&dvdemux->found_header) == 0) { + GstEvent **event_p; + + event_p = &dvdemux->seek_event; + + /* We don't have pads yet. Keep the event. */ + GST_INFO_OBJECT (dvdemux, "Keeping the seek event for later"); + + gst_event_replace (event_p, event); + GST_OBJECT_UNLOCK (dvdemux); + + res = TRUE; + } else { + GST_OBJECT_UNLOCK (dvdemux); + + if (dvdemux->seek_handler) { + res = dvdemux->seek_handler (dvdemux, dvdemux->videosrcpad, event); + gst_event_unref (event); + } + } + break; + } + default: + res = GST_ELEMENT_CLASS (parent_class)->send_event (element, event); + break; + } + + return res; +} + +/* handle an event on the source pad, it's most likely a seek */ +static gboolean +gst_dvdemux_handle_src_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstDVDemux *dvdemux; + + dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + /* seek handler is installed based on scheduling mode */ + if (dvdemux->seek_handler) + res = dvdemux->seek_handler (dvdemux, pad, event); + else + res = FALSE; + break; + case GST_EVENT_QOS: + /* we can't really (yet) do QoS */ + res = FALSE; + break; + case GST_EVENT_NAVIGATION: + /* no navigation either... */ + res = FALSE; + break; + default: + res = gst_pad_push_event (dvdemux->sinkpad, event); + event = NULL; + break; + } + if (event) + gst_event_unref (event); + + gst_object_unref (dvdemux); + + return res; +} + +/* does not take ownership of buffer */ +static GstFlowReturn +gst_dvdemux_demux_audio (GstDVDemux * dvdemux, GstBuffer * buffer, + guint64 duration) +{ + gint num_samples; + GstFlowReturn ret; + const guint8 *data; + + data = GST_BUFFER_DATA (buffer); + + dv_decode_full_audio (dvdemux->decoder, data, dvdemux->audio_buffers); + + if (G_LIKELY ((num_samples = dv_get_num_samples (dvdemux->decoder)) > 0)) { + gint16 *a_ptr; + gint i, j; + GstBuffer *outbuf; + gint frequency, channels; + + if (G_UNLIKELY (dvdemux->audiosrcpad == NULL)) + dvdemux->audiosrcpad = gst_dvdemux_add_pad (dvdemux, &audio_src_temp); + + /* get initial format or check if format changed */ + frequency = dv_get_frequency (dvdemux->decoder); + channels = dv_get_num_channels (dvdemux->decoder); + + if (G_UNLIKELY ((frequency != dvdemux->frequency) + || (channels != dvdemux->channels))) { + GstCaps *caps; + + dvdemux->frequency = frequency; + dvdemux->channels = channels; + + /* and set new caps */ + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, frequency, + "depth", G_TYPE_INT, 16, + "width", G_TYPE_INT, 16, + "signed", G_TYPE_BOOLEAN, TRUE, + "channels", G_TYPE_INT, channels, + "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); + gst_pad_set_caps (dvdemux->audiosrcpad, caps); + gst_caps_unref (caps); + } + + outbuf = gst_buffer_new_and_alloc (num_samples * + sizeof (gint16) * dvdemux->channels); + + a_ptr = (gint16 *) GST_BUFFER_DATA (outbuf); + + for (i = 0; i < num_samples; i++) { + for (j = 0; j < dvdemux->channels; j++) { + *(a_ptr++) = dvdemux->audio_buffers[j][i]; + } + } + + GST_DEBUG ("pushing audio %" GST_TIME_FORMAT, + GST_TIME_ARGS (dvdemux->time_segment.last_stop)); + + GST_BUFFER_TIMESTAMP (outbuf) = dvdemux->time_segment.last_stop; + GST_BUFFER_DURATION (outbuf) = duration; + GST_BUFFER_OFFSET (outbuf) = dvdemux->audio_offset; + dvdemux->audio_offset += num_samples; + GST_BUFFER_OFFSET_END (outbuf) = dvdemux->audio_offset; + + if (dvdemux->new_media) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (dvdemux->audiosrcpad)); + + ret = gst_pad_push (dvdemux->audiosrcpad, outbuf); + } else { + /* no samples */ + ret = GST_FLOW_OK; + } + + return ret; +} + +/* takes ownership of buffer */ +static GstFlowReturn +gst_dvdemux_demux_video (GstDVDemux * dvdemux, GstBuffer * buffer, + guint64 duration) +{ + GstBuffer *outbuf; + gint height; + gboolean wide; + GstFlowReturn ret = GST_FLOW_OK; + + if (G_UNLIKELY (dvdemux->videosrcpad == NULL)) + dvdemux->videosrcpad = gst_dvdemux_add_pad (dvdemux, &video_src_temp); + + /* get params */ + /* framerate is already up-to-date */ + height = dvdemux->decoder->height; + wide = dv_format_wide (dvdemux->decoder); + + /* see if anything changed */ + if (G_UNLIKELY ((dvdemux->height != height) || dvdemux->wide != wide)) { + GstCaps *caps; + gint par_x, par_y; + + dvdemux->height = height; + dvdemux->wide = wide; + + if (dvdemux->decoder->system == e_dv_system_625_50) { + if (wide) { + par_x = PAL_WIDE_PAR_X; + par_y = PAL_WIDE_PAR_Y; + } else { + par_x = PAL_NORMAL_PAR_X; + par_y = PAL_NORMAL_PAR_Y; + } + } else { + if (wide) { + par_x = NTSC_WIDE_PAR_X; + par_y = NTSC_WIDE_PAR_Y; + } else { + par_x = NTSC_NORMAL_PAR_X; + par_y = NTSC_NORMAL_PAR_Y; + } + } + + caps = gst_caps_new_simple ("video/x-dv", + "systemstream", G_TYPE_BOOLEAN, FALSE, + "width", G_TYPE_INT, 720, + "height", G_TYPE_INT, height, + "framerate", GST_TYPE_FRACTION, dvdemux->framerate_numerator, + dvdemux->framerate_denominator, + "pixel-aspect-ratio", GST_TYPE_FRACTION, par_x, par_y, NULL); + gst_pad_set_caps (dvdemux->videosrcpad, caps); + gst_caps_unref (caps); + } + + /* takes ownership of buffer here, we just need to modify + * the metadata. */ + outbuf = gst_buffer_make_metadata_writable (buffer); + + GST_BUFFER_TIMESTAMP (outbuf) = dvdemux->time_segment.last_stop; + GST_BUFFER_OFFSET (outbuf) = dvdemux->video_offset; + GST_BUFFER_OFFSET_END (outbuf) = dvdemux->video_offset + 1; + GST_BUFFER_DURATION (outbuf) = duration; + + if (dvdemux->new_media) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (dvdemux->videosrcpad)); + + GST_DEBUG ("pushing video %" GST_TIME_FORMAT, + GST_TIME_ARGS (dvdemux->time_segment.last_stop)); + + ret = gst_pad_push (dvdemux->videosrcpad, outbuf); + + dvdemux->video_offset++; + + return ret; +} + +static int +get_ssyb_offset (int dif, int ssyb) +{ + int offset; + + offset = dif * 12000; /* to dif */ + offset += 80 * (1 + (ssyb / 6)); /* to subcode pack */ + offset += 3; /* past header */ + offset += 8 * (ssyb % 6); /* to ssyb */ + + return offset; +} + +static gboolean +gst_dvdemux_get_timecode (GstDVDemux * dvdemux, GstBuffer * buffer, + GstSMPTETimeCode * timecode) +{ + guint8 *data = GST_BUFFER_DATA (buffer); + int offset; + int dif; + int n_difs = dvdemux->decoder->num_dif_seqs; + + for (dif = 0; dif < n_difs; dif++) { + offset = get_ssyb_offset (dif, 3); + if (data[offset + 3] == 0x13) { + timecode->frames = ((data[offset + 4] >> 4) & 0x3) * 10 + + (data[offset + 4] & 0xf); + timecode->seconds = ((data[offset + 5] >> 4) & 0x3) * 10 + + (data[offset + 5] & 0xf); + timecode->minutes = ((data[offset + 6] >> 4) & 0x3) * 10 + + (data[offset + 6] & 0xf); + timecode->hours = ((data[offset + 7] >> 4) & 0x3) * 10 + + (data[offset + 7] & 0xf); + GST_DEBUG ("got timecode %" GST_SMPTE_TIME_CODE_FORMAT, + GST_SMPTE_TIME_CODE_ARGS (timecode)); + return TRUE; + } + } + + return FALSE; +} + +static gboolean +gst_dvdemux_is_new_media (GstDVDemux * dvdemux, GstBuffer * buffer) +{ + guint8 *data = GST_BUFFER_DATA (buffer); + int aaux_offset; + int dif; + int n_difs; + + n_difs = dvdemux->decoder->num_dif_seqs; + + for (dif = 0; dif < n_difs; dif++) { + if (dif & 1) { + aaux_offset = (dif * 12000) + (6 + 16 * 1) * 80 + 3; + } else { + aaux_offset = (dif * 12000) + (6 + 16 * 4) * 80 + 3; + } + if (data[aaux_offset + 0] == 0x51) { + if ((data[aaux_offset + 2] & 0x80) == 0) + return TRUE; + } + } + + return FALSE; +} + +/* takes ownership of buffer */ +static GstFlowReturn +gst_dvdemux_demux_frame (GstDVDemux * dvdemux, GstBuffer * buffer) +{ + GstClockTime next_ts; + GstFlowReturn aret, vret, ret; + guint8 *data; + guint64 duration; + GstSMPTETimeCode timecode; + int frame_number; + + if (G_UNLIKELY (dvdemux->need_segment)) { + GstEvent *event; + GstFormat format; + + /* convert to time and store as start/end_timestamp */ + format = GST_FORMAT_TIME; + if (!(gst_dvdemux_convert_sink_pair (dvdemux, + GST_FORMAT_BYTES, dvdemux->byte_segment.start, + dvdemux->byte_segment.stop, format, + &dvdemux->time_segment.start, &dvdemux->time_segment.stop))) + goto segment_error; + + dvdemux->time_segment.rate = dvdemux->byte_segment.rate; + dvdemux->time_segment.abs_rate = dvdemux->byte_segment.abs_rate; + dvdemux->time_segment.last_stop = dvdemux->time_segment.start; + + /* calculate current frame number */ + format = GST_FORMAT_DEFAULT; + if (!(gst_dvdemux_src_convert (dvdemux, dvdemux->videosrcpad, + GST_FORMAT_TIME, dvdemux->time_segment.start, + &format, &dvdemux->frame_offset))) + goto segment_error; + + GST_DEBUG_OBJECT (dvdemux, "sending segment start: %" GST_TIME_FORMAT + ", stop: %" GST_TIME_FORMAT ", time: %" GST_TIME_FORMAT, + GST_TIME_ARGS (dvdemux->time_segment.start), + GST_TIME_ARGS (dvdemux->time_segment.stop), + GST_TIME_ARGS (dvdemux->time_segment.start)); + + event = gst_event_new_new_segment (FALSE, dvdemux->byte_segment.rate, + GST_FORMAT_TIME, dvdemux->time_segment.start, + dvdemux->time_segment.stop, dvdemux->time_segment.start); + gst_dvdemux_push_event (dvdemux, event); + + dvdemux->need_segment = FALSE; + } + + gst_dvdemux_get_timecode (dvdemux, buffer, &timecode); + gst_smpte_time_code_get_frame_number ( + (dvdemux->decoder->system == e_dv_system_625_50) ? + GST_SMPTE_TIME_CODE_SYSTEM_25 : GST_SMPTE_TIME_CODE_SYSTEM_30, + &frame_number, &timecode); + + next_ts = gst_util_uint64_scale_int ( + (dvdemux->frame_offset + 1) * GST_SECOND, + dvdemux->framerate_denominator, dvdemux->framerate_numerator); + duration = next_ts - dvdemux->time_segment.last_stop; + + data = GST_BUFFER_DATA (buffer); + + dv_parse_packs (dvdemux->decoder, data); + dvdemux->new_media = FALSE; + if (gst_dvdemux_is_new_media (dvdemux, buffer) && + dvdemux->frames_since_new_media > 2) { + dvdemux->new_media = TRUE; + dvdemux->frames_since_new_media = 0; + } + dvdemux->frames_since_new_media++; + + /* does not take ownership of buffer */ + aret = ret = gst_dvdemux_demux_audio (dvdemux, buffer, duration); + if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED)) { + gst_buffer_unref (buffer); + goto done; + } + + /* takes ownership of buffer */ + vret = ret = gst_dvdemux_demux_video (dvdemux, buffer, duration); + if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED)) + goto done; + + /* if both are not linked, we stop */ + if (G_UNLIKELY (aret == GST_FLOW_NOT_LINKED && vret == GST_FLOW_NOT_LINKED)) { + ret = GST_FLOW_NOT_LINKED; + goto done; + } + + gst_segment_set_last_stop (&dvdemux->time_segment, GST_FORMAT_TIME, next_ts); + dvdemux->frame_offset++; + + /* check for the end of the segment */ + if (dvdemux->time_segment.stop != -1 && next_ts > dvdemux->time_segment.stop) + ret = GST_FLOW_UNEXPECTED; + else + ret = GST_FLOW_OK; + +done: + return ret; + + /* ERRORS */ +segment_error: + { + GST_DEBUG ("error generating new_segment event"); + gst_buffer_unref (buffer); + return GST_FLOW_ERROR; + } +} + +/* flush any remaining data in the adapter, used in chain based scheduling mode */ +static GstFlowReturn +gst_dvdemux_flush (GstDVDemux * dvdemux) +{ + GstFlowReturn ret = GST_FLOW_OK; + + while (gst_adapter_available (dvdemux->adapter) >= dvdemux->frame_len) { + const guint8 *data; + gint length; + + /* get the accumulated bytes */ + data = gst_adapter_peek (dvdemux->adapter, dvdemux->frame_len); + + /* parse header to know the length and other params */ + if (G_UNLIKELY (dv_parse_header (dvdemux->decoder, data) < 0)) + goto parse_header_error; + + /* after parsing the header we know the length of the data */ + length = dvdemux->frame_len = dvdemux->decoder->frame_size; + if (dvdemux->decoder->system == e_dv_system_625_50) { + dvdemux->framerate_numerator = PAL_FRAMERATE_NUMERATOR; + dvdemux->framerate_denominator = PAL_FRAMERATE_DENOMINATOR; + } else { + dvdemux->framerate_numerator = NTSC_FRAMERATE_NUMERATOR; + dvdemux->framerate_denominator = NTSC_FRAMERATE_DENOMINATOR; + } + g_atomic_int_set (&dvdemux->found_header, 1); + + /* let demux_video set the height, it needs to detect when things change so + * it can reset caps */ + + /* if we still have enough for a frame, start decoding */ + if (G_LIKELY (gst_adapter_available (dvdemux->adapter) >= length)) { + GstBuffer *buffer; + + data = gst_adapter_take (dvdemux->adapter, length); + + /* create buffer for the remainder of the code */ + buffer = gst_buffer_new (); + GST_BUFFER_DATA (buffer) = (guint8 *) data; + GST_BUFFER_SIZE (buffer) = length; + GST_BUFFER_MALLOCDATA (buffer) = (guint8 *) data; + + /* and decode the buffer, takes ownership */ + ret = gst_dvdemux_demux_frame (dvdemux, buffer); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto done; + } + } +done: + return ret; + + /* ERRORS */ +parse_header_error: + { + GST_ELEMENT_ERROR (dvdemux, STREAM, DECODE, + (NULL), ("Error parsing DV header")); + return GST_FLOW_ERROR; + } +} + +/* streaming operation: + * + * accumulate data until we have a frame, then decode. + */ +static GstFlowReturn +gst_dvdemux_chain (GstPad * pad, GstBuffer * buffer) +{ + GstDVDemux *dvdemux; + GstFlowReturn ret; + GstClockTime timestamp; + + dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); + + /* a discontinuity in the stream, we need to get rid of + * accumulated data in the adapter and assume a new frame + * starts after the discontinuity */ + if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))) + gst_adapter_clear (dvdemux->adapter); + + /* a timestamp always should be respected */ + timestamp = GST_BUFFER_TIMESTAMP (buffer); + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + gst_segment_set_last_stop (&dvdemux->time_segment, GST_FORMAT_TIME, + timestamp); + /* FIXME, adjust frame_offset and other counters */ + } + + gst_adapter_push (dvdemux->adapter, buffer); + + /* Apparently dv_parse_header can read from the body of the frame + * too, so it needs more than header_size bytes. Wacky! + */ + if (G_UNLIKELY (dvdemux->frame_len == -1)) { + /* if we don't know the length of a frame, we assume it is + * the NTSC_BUFFER length, as this is enough to figure out + * if this is PAL or NTSC */ + dvdemux->frame_len = NTSC_BUFFER; + } + + /* and try to flush pending frames */ + ret = gst_dvdemux_flush (dvdemux); + + gst_object_unref (dvdemux); + + return ret; +} + +/* pull based operation. + * + * Read header first to figure out the frame size. Then read + * and decode full frames. + */ +static void +gst_dvdemux_loop (GstPad * pad) +{ + GstFlowReturn ret; + GstDVDemux *dvdemux; + GstBuffer *buffer = NULL; + const guint8 *data; + + dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); + + if (G_UNLIKELY (g_atomic_int_get (&dvdemux->found_header) == 0)) { + GST_DEBUG_OBJECT (dvdemux, "pulling first buffer"); + /* pull in NTSC sized buffer to figure out the frame + * length */ + ret = gst_pad_pull_range (dvdemux->sinkpad, + dvdemux->byte_segment.last_stop, NTSC_BUFFER, &buffer); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto pause; + + /* check buffer size, don't want to read small buffers */ + if (G_UNLIKELY (GST_BUFFER_SIZE (buffer) < NTSC_BUFFER)) + goto small_buffer; + + data = GST_BUFFER_DATA (buffer); + + /* parse header to know the length and other params */ + if (G_UNLIKELY (dv_parse_header (dvdemux->decoder, data) < 0)) + goto parse_header_error; + + /* after parsing the header we know the length of the data */ + dvdemux->frame_len = dvdemux->decoder->frame_size; + if (dvdemux->decoder->system == e_dv_system_625_50) { + dvdemux->framerate_numerator = PAL_FRAMERATE_NUMERATOR; + dvdemux->framerate_denominator = PAL_FRAMERATE_DENOMINATOR; + } else { + dvdemux->framerate_numerator = NTSC_FRAMERATE_NUMERATOR; + dvdemux->framerate_denominator = NTSC_FRAMERATE_DENOMINATOR; + } + dvdemux->need_segment = TRUE; + + /* see if we need to read a larger part */ + if (dvdemux->frame_len != NTSC_BUFFER) { + gst_buffer_unref (buffer); + buffer = NULL; + } + + { + GstEvent *event; + + /* setting header and prrforming the seek must be atomic */ + GST_OBJECT_LOCK (dvdemux); + /* got header now */ + g_atomic_int_set (&dvdemux->found_header, 1); + + /* now perform pending seek if any. */ + event = dvdemux->seek_event; + if (event) + gst_event_ref (event); + GST_OBJECT_UNLOCK (dvdemux); + + if (event) { + if (!gst_dvdemux_handle_pull_seek (dvdemux, dvdemux->videosrcpad, + event)) { + GST_ELEMENT_WARNING (dvdemux, STREAM, DECODE, (NULL), + ("Error perfoming initial seek")); + } + gst_event_unref (event); + + /* and we need to pull a new buffer in all cases. */ + if (buffer) { + gst_buffer_unref (buffer); + buffer = NULL; + } + } + } + } + + + if (G_UNLIKELY (dvdemux->pending_segment)) { + + /* now send the newsegment */ + GST_DEBUG_OBJECT (dvdemux, "Sending newsegment from"); + + gst_dvdemux_push_event (dvdemux, dvdemux->pending_segment); + dvdemux->pending_segment = NULL; + } + + if (G_LIKELY (buffer == NULL)) { + GST_DEBUG_OBJECT (dvdemux, "pulling buffer at offset %" G_GINT64_FORMAT, + dvdemux->byte_segment.last_stop); + + ret = gst_pad_pull_range (dvdemux->sinkpad, + dvdemux->byte_segment.last_stop, dvdemux->frame_len, &buffer); + if (ret != GST_FLOW_OK) + goto pause; + + /* check buffer size, don't want to read small buffers */ + if (GST_BUFFER_SIZE (buffer) < dvdemux->frame_len) + goto small_buffer; + } + /* and decode the buffer */ + ret = gst_dvdemux_demux_frame (dvdemux, buffer); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto pause; + + /* and position ourselves for the next buffer */ + dvdemux->byte_segment.last_stop += dvdemux->frame_len; + +done: + gst_object_unref (dvdemux); + + return; + + /* ERRORS */ +parse_header_error: + { + GST_ELEMENT_ERROR (dvdemux, STREAM, DECODE, + (NULL), ("Error parsing DV header")); + gst_buffer_unref (buffer); + dvdemux->running = FALSE; + gst_pad_pause_task (dvdemux->sinkpad); + gst_dvdemux_push_event (dvdemux, gst_event_new_eos ()); + goto done; + } +small_buffer: + { + GST_ELEMENT_ERROR (dvdemux, STREAM, DECODE, + (NULL), ("Error reading buffer")); + gst_buffer_unref (buffer); + dvdemux->running = FALSE; + gst_pad_pause_task (dvdemux->sinkpad); + gst_dvdemux_push_event (dvdemux, gst_event_new_eos ()); + goto done; + } +pause: + { + GST_INFO_OBJECT (dvdemux, "pausing task, %s", gst_flow_get_name (ret)); + dvdemux->running = FALSE; + gst_pad_pause_task (dvdemux->sinkpad); + if (ret == GST_FLOW_UNEXPECTED) { + GST_LOG_OBJECT (dvdemux, "got eos"); + /* perform EOS logic */ + if (dvdemux->time_segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT (dvdemux), + gst_message_new_segment_done (GST_OBJECT_CAST (dvdemux), + dvdemux->time_segment.format, dvdemux->time_segment.last_stop)); + } else { + gst_dvdemux_push_event (dvdemux, gst_event_new_eos ()); + } + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + /* for fatal errors or not-linked we post an error message */ + GST_ELEMENT_ERROR (dvdemux, STREAM, FAILED, + (NULL), ("streaming stopped, reason %s", gst_flow_get_name (ret))); + gst_dvdemux_push_event (dvdemux, gst_event_new_eos ()); + } + goto done; + } +} + +static gboolean +gst_dvdemux_sink_activate_push (GstPad * sinkpad, gboolean active) +{ + GstDVDemux *demux = GST_DVDEMUX (gst_pad_get_parent (sinkpad)); + + if (active) { + demux->seek_handler = gst_dvdemux_handle_push_seek; + } else { + demux->seek_handler = NULL; + } + gst_object_unref (demux); + + return TRUE; +} + +static gboolean +gst_dvdemux_sink_activate_pull (GstPad * sinkpad, gboolean active) +{ + GstDVDemux *demux = GST_DVDEMUX (gst_pad_get_parent (sinkpad)); + + if (active) { + demux->running = TRUE; + demux->seek_handler = gst_dvdemux_handle_pull_seek; + gst_pad_start_task (sinkpad, (GstTaskFunction) gst_dvdemux_loop, sinkpad); + } else { + demux->seek_handler = NULL; + gst_pad_stop_task (sinkpad); + demux->running = FALSE; + } + + gst_object_unref (demux); + + return TRUE; +}; + +/* decide on push or pull based scheduling */ +static gboolean +gst_dvdemux_sink_activate (GstPad * sinkpad) +{ + gboolean ret; + + if (gst_pad_check_pull_range (sinkpad)) + ret = gst_pad_activate_pull (sinkpad, TRUE); + else + ret = gst_pad_activate_push (sinkpad, TRUE); + + return ret; +}; + +static GstStateChangeReturn +gst_dvdemux_change_state (GstElement * element, GstStateChange transition) +{ + GstDVDemux *dvdemux = GST_DVDEMUX (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + dvdemux->decoder = dv_decoder_new (0, FALSE, FALSE); + dv_set_error_log (dvdemux->decoder, NULL); + gst_dvdemux_reset (dvdemux); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + default: + break; + } + + ret = parent_class->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_adapter_clear (dvdemux->adapter); + dv_decoder_free (dvdemux->decoder); + dvdemux->decoder = NULL; + + gst_dvdemux_remove_pads (dvdemux); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + { + GstEvent **event_p; + + event_p = &dvdemux->seek_event; + gst_event_replace (event_p, NULL); + if (dvdemux->pending_segment) + gst_event_unref (dvdemux->pending_segment); + dvdemux->pending_segment = NULL; + break; + } + default: + break; + } + return ret; +} diff --git a/ext/dv/gstdvdemux.h b/ext/dv/gstdvdemux.h new file mode 100644 index 0000000..9a4173d --- /dev/null +++ b/ext/dv/gstdvdemux.h @@ -0,0 +1,98 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_DVDEMUX_H__ +#define __GST_DVDEMUX_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_DVDEMUX \ + (gst_dvdemux_get_type()) +#define GST_DVDEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DVDEMUX,GstDVDemux)) +#define GST_DVDEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DVDEMUX,GstDVDemuxClass)) +#define GST_IS_DVDEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DVDEMUX)) +#define GST_IS_DVDEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVDEMUX)) + + +typedef struct _GstDVDemux GstDVDemux; +typedef struct _GstDVDemuxClass GstDVDemuxClass; + +typedef gboolean (*GstDVDemuxSeekHandler) (GstDVDemux *demux, GstPad * pad, GstEvent * event); + + +struct _GstDVDemux { + GstElement element; + + GstPad *sinkpad; + GstPad *videosrcpad; + GstPad *audiosrcpad; + + dv_decoder_t *decoder; + + GstAdapter *adapter; + gint frame_len; + + /* video params */ + gint framerate_numerator; + gint framerate_denominator; + gint height; + gboolean wide; + /* audio params */ + gint frequency; + gint channels; + + gint framecount; + + gint64 frame_offset; + gint64 audio_offset; + gint64 video_offset; + + GstDVDemuxSeekHandler seek_handler; + GstSegment byte_segment; + GstSegment time_segment; + gboolean running; + gboolean need_segment; + gboolean new_media; + int frames_since_new_media; + + gint found_header; /* ATOMIC */ + GstEvent *seek_event; + GstEvent *pending_segment; + + gint16 *audio_buffers[4]; +}; + +struct _GstDVDemuxClass { + GstElementClass parent_class; +}; + +GType gst_dvdemux_get_type (void); + +G_END_DECLS + +#endif /* __GST_DVDEMUX_H__ */ diff --git a/ext/dv/gstsmptetimecode.c b/ext/dv/gstsmptetimecode.c new file mode 100644 index 0000000..40a36d3 --- /dev/null +++ b/ext/dv/gstsmptetimecode.c @@ -0,0 +1,240 @@ +/* GStreamer + * Copyright (C) 2009 David A. Schleef + * + * 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. + */ + +/* + * Utility functions for handing SMPTE Time Codes, as described in + * SMPTE Standard 12M-1999. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstsmptetimecode.h" + +#define NTSC_FRAMES_PER_10_MINS (10*60*30 - 10*2 + 2) +#define NTSC_FRAMES_PER_HOUR (6*NTSC_FRAMES_PER_10_MINS) + +/** + * gst_smpte_time_code_from_frame_number: + * @system: SMPTE Time Code system + * @time_code: pointer to time code structure + * @frame_number: integer frame number + * + * Converts a frame number to a time code. + * + * Returns: TRUE if the conversion was successful + */ +gboolean +gst_smpte_time_code_from_frame_number (GstSMPTETimeCodeSystem system, + GstSMPTETimeCode * time_code, int frame_number) +{ + int ten_mins; + int n; + + g_return_val_if_fail (time_code != NULL, FALSE); + g_return_val_if_fail (GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID (system), FALSE); + + time_code->hours = 99; + time_code->minutes = 99; + time_code->seconds = 99; + time_code->frames = 99; + + if (frame_number < 0) + return FALSE; + + switch (system) { + case GST_SMPTE_TIME_CODE_SYSTEM_30: + if (frame_number >= 24 * NTSC_FRAMES_PER_HOUR) + return FALSE; + + ten_mins = frame_number / NTSC_FRAMES_PER_10_MINS; + frame_number -= ten_mins * NTSC_FRAMES_PER_10_MINS; + + time_code->hours = ten_mins / 6; + time_code->minutes = 10 * (ten_mins % 6); + + if (frame_number < 2) { + /* treat the first two frames of each ten minutes specially */ + time_code->seconds = 0; + time_code->frames = frame_number; + } else { + n = (frame_number - 2) / (60 * 30 - 2); + time_code->minutes += n; + frame_number -= n * (60 * 30 - 2); + + time_code->seconds = frame_number / 30; + time_code->frames = frame_number % 30; + } + break; + case GST_SMPTE_TIME_CODE_SYSTEM_25: + if (frame_number >= 24 * 60 * 60 * 25) + return FALSE; + + time_code->frames = frame_number % 25; + frame_number /= 25; + time_code->seconds = frame_number % 60; + frame_number /= 60; + time_code->minutes = frame_number % 60; + frame_number /= 60; + time_code->hours = frame_number; + break; + case GST_SMPTE_TIME_CODE_SYSTEM_24: + if (frame_number >= 24 * 60 * 60 * 24) + return FALSE; + + time_code->frames = frame_number % 24; + frame_number /= 24; + time_code->seconds = frame_number % 60; + frame_number /= 60; + time_code->minutes = frame_number % 60; + frame_number /= 60; + time_code->hours = frame_number; + break; + } + + return TRUE; +} + +/** + * gst_smpte_time_code_is_valid: + * @system: SMPTE Time Code system + * @time_code: pointer to time code structure + * + * Checks that the time code represents a valid time code. + * + * Returns: TRUE if the time code is valid + */ +gboolean +gst_smpte_time_code_is_valid (GstSMPTETimeCodeSystem system, + GstSMPTETimeCode * time_code) +{ + g_return_val_if_fail (time_code != NULL, FALSE); + g_return_val_if_fail (GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID (system), FALSE); + + if (time_code->hours < 0 || time_code->hours >= 24) + return FALSE; + if (time_code->minutes < 0 || time_code->minutes >= 60) + return FALSE; + if (time_code->seconds < 0 || time_code->seconds >= 60) + return FALSE; + if (time_code->frames < 0) + return FALSE; + + switch (system) { + case GST_SMPTE_TIME_CODE_SYSTEM_30: + if (time_code->frames >= 30) + return FALSE; + if (time_code->frames >= 2 || time_code->seconds > 0) + return TRUE; + if (time_code->minutes % 10 != 0) + return FALSE; + break; + case GST_SMPTE_TIME_CODE_SYSTEM_25: + if (time_code->frames >= 25) + return FALSE; + break; + case GST_SMPTE_TIME_CODE_SYSTEM_24: + if (time_code->frames >= 24) + return FALSE; + break; + } + return TRUE; +} + +/** + * gst_smpte_time_get_frame_number: + * @system: SMPTE Time Code system + * @frame_number: pointer to frame number + * @time_code: pointer to time code structure + * + * Converts the time code structure to a linear frame number. + * + * Returns: TRUE if the time code could be converted + */ +gboolean +gst_smpte_time_code_get_frame_number (GstSMPTETimeCodeSystem system, + int *frame_number, GstSMPTETimeCode * time_code) +{ + int frame = 0; + + g_return_val_if_fail (GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID (system), FALSE); + g_return_val_if_fail (time_code != NULL, FALSE); + + if (!gst_smpte_time_code_is_valid (system, time_code)) { + return FALSE; + } + + switch (system) { + case GST_SMPTE_TIME_CODE_SYSTEM_30: + frame = time_code->hours * NTSC_FRAMES_PER_HOUR; + frame += (time_code->minutes / 10) * NTSC_FRAMES_PER_10_MINS; + frame += (time_code->minutes % 10) * (30 * 60 - 2); + frame += time_code->seconds * 30; + break; + case GST_SMPTE_TIME_CODE_SYSTEM_25: + time_code->frames = + 25 * ((time_code->hours * 60 + time_code->minutes) * 60 + + time_code->seconds); + break; + case GST_SMPTE_TIME_CODE_SYSTEM_24: + time_code->frames = + 24 * ((time_code->hours * 60 + time_code->minutes) * 60 + + time_code->seconds); + break; + } + frame += time_code->frames; + + if (frame_number) { + *frame_number = frame; + } + + return TRUE; +} + +/** + * gst_smpte_time_get_timestamp: + * @system: SMPTE Time Code system + * @time_code: pointer to time code structure + * + * Converts the time code structure to a timestamp. + * + * Returns: Time stamp for time code, or GST_CLOCK_TIME_NONE if time + * code is invalid. + */ +GstClockTime +gst_smpte_time_code_get_timestamp (GstSMPTETimeCodeSystem system, + GstSMPTETimeCode * time_code) +{ + int frame_number; + + g_return_val_if_fail (GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID (system), + GST_CLOCK_TIME_NONE); + g_return_val_if_fail (time_code != NULL, GST_CLOCK_TIME_NONE); + + if (gst_smpte_time_code_get_frame_number (system, &frame_number, time_code)) { + static int framerate_n[3] = { 3000, 25, 24 }; + static int framerate_d[3] = { 1001, 1, 1 }; + + return gst_util_uint64_scale (frame_number, + GST_SECOND * framerate_d[system], framerate_n[system]); + } + + return GST_CLOCK_TIME_NONE; +} diff --git a/ext/dv/gstsmptetimecode.h b/ext/dv/gstsmptetimecode.h new file mode 100644 index 0000000..cdda03e --- /dev/null +++ b/ext/dv/gstsmptetimecode.h @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) 2009 David A. Schleef + * + * 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_SMPTE_TIME_CODE_H_ +#define _GST_SMPTE_TIME_CODE_H_ + +#include + +G_BEGIN_DECLS + +typedef struct _GstSMPTETimeCode GstSMPTETimeCode; + +/** + * GstSMPTETimeCode: + * @GST_SMPTE_TIME_CODE_SYSTEM_30: 29.97 frame per second system (NTSC) + * @GST_SMPTE_TIME_CODE_SYSTEM_25: 25 frame per second system (PAL) + * @GST_SMPTE_TIME_CODE_SYSTEM_24: 24 frame per second system + * + * Enum value representing SMPTE Time Code system. + */ +typedef enum { + GST_SMPTE_TIME_CODE_SYSTEM_30 = 0, + GST_SMPTE_TIME_CODE_SYSTEM_25, + GST_SMPTE_TIME_CODE_SYSTEM_24 +} GstSMPTETimeCodeSystem; + +struct _GstSMPTETimeCode { + int hours; + int minutes; + int seconds; + int frames; +}; + +#define GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID(x) \ + ((x) >= GST_SMPTE_TIME_CODE_SYSTEM_30 && (x) <= GST_SMPTE_TIME_CODE_SYSTEM_24) + +#define GST_SMPTE_TIME_CODE_FORMAT "02d:%02d:%02d:%02d" +#define GST_SMPTE_TIME_CODE_ARGS(timecode) \ + (timecode)->hours, (timecode)->minutes, \ + (timecode)->seconds, (timecode)->frames + +gboolean gst_smpte_time_code_is_valid (GstSMPTETimeCodeSystem system, + GstSMPTETimeCode *time_code); +gboolean gst_smpte_time_code_from_frame_number (GstSMPTETimeCodeSystem system, + GstSMPTETimeCode *time_code, int frame_number); +gboolean gst_smpte_time_code_get_frame_number (GstSMPTETimeCodeSystem system, + int *frame_number, GstSMPTETimeCode *time_code); +GstClockTime gst_smpte_time_code_get_timestamp (GstSMPTETimeCodeSystem system, + GstSMPTETimeCode *time_code); + +G_END_DECLS + +#endif + diff --git a/ext/dv/smpte_test.c b/ext/dv/smpte_test.c new file mode 100644 index 0000000..f18113c --- /dev/null +++ b/ext/dv/smpte_test.c @@ -0,0 +1,81 @@ + +#include "config.h" + +#include "gstsmptetimecode.h" + +#include + +#define NTSC_FRAMES_PER_10_MINS (10*60*30 - 10*2 + 2) +#define NTSC_FRAMES_PER_HOUR (6*NTSC_FRAMES_PER_10_MINS) + + +int +main (int argc, char *argv[]) +{ + GstSMPTETimeCode tc; + int i; + int min; + + for (min = 0; min < 3; min++) { + g_print ("--- minute %d ---\n", min); + for (i = min * 60 * 30 - 5; i <= min * 60 * 30 + 5; i++) { + gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, + i); + g_print ("%d %02d:%02d:%02d:%02d\n", i, tc.hours, tc.minutes, tc.seconds, + tc.frames); + } + } + + for (min = 9; min < 12; min++) { + g_print ("--- minute %d ---\n", min); + for (i = min * 60 * 30 - 5 - 18; i <= min * 60 * 30 + 5 - 18; i++) { + gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, + i); + g_print ("%d %02d:%02d:%02d:%02d\n", i, tc.hours, tc.minutes, tc.seconds, + tc.frames); + } + } + + for (min = -1; min < 2; min++) { + int offset = NTSC_FRAMES_PER_HOUR; + + g_print ("--- minute %d ---\n", min); + for (i = offset + min * 60 * 30 - 5; i <= offset + min * 60 * 30 + 5; i++) { + gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, + i); + g_print ("%d %02d:%02d:%02d:%02d\n", i, tc.hours, tc.minutes, tc.seconds, + tc.frames); + } + } + + for (min = 0; min < 1; min++) { + int offset = NTSC_FRAMES_PER_HOUR; + + g_print ("--- minute %d ---\n", min); + for (i = 24 * offset - 5; i <= 24 * offset + 5; i++) { + gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, + i); + g_print ("%d %02d:%02d:%02d:%02d\n", i, tc.hours, tc.minutes, tc.seconds, + tc.frames); + } + } + + for (i = 0; i < 24 * NTSC_FRAMES_PER_HOUR; i++) { + int fn; + int ret; + + gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, + i); + + ret = gst_smpte_time_code_get_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, + &fn, &tc); + if (!ret) { + g_print ("bad valid at %d\n", i); + } + if (fn != i) { + g_print ("index mismatch %d != %d\n", fn, i); + } + } + + return 0; +} diff --git a/ext/esd/Makefile.am b/ext/esd/Makefile.am new file mode 100644 index 0000000..a7a1464 --- /dev/null +++ b/ext/esd/Makefile.am @@ -0,0 +1,14 @@ +plugin_LTLIBRARIES = libgstesd.la + +libgstesd_la_SOURCES = esdsink.c gstesd.c +libgstesd_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ESD_CFLAGS) +libgstesd_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(ESD_LIBS) +libgstesd_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstesd_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = esdsink.h esdmon.h +EXTRA_DIST = diff --git a/ext/esd/Makefile.in b/ext/esd/Makefile.in new file mode 100644 index 0000000..0d5be60 --- /dev/null +++ b/ext/esd/Makefile.in @@ -0,0 +1,821 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/esd +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstesd_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstesd_la_OBJECTS = libgstesd_la-esdsink.lo \ + libgstesd_la-gstesd.lo +libgstesd_la_OBJECTS = $(am_libgstesd_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstesd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstesd_la_CFLAGS) $(CFLAGS) \ + $(libgstesd_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstesd_la_SOURCES) +DIST_SOURCES = $(libgstesd_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstesd.la +libgstesd_la_SOURCES = esdsink.c gstesd.c +libgstesd_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ESD_CFLAGS) +libgstesd_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(ESD_LIBS) + +libgstesd_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstesd_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = esdsink.h esdmon.h +EXTRA_DIST = +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/esd/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/esd/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstesd.la: $(libgstesd_la_OBJECTS) $(libgstesd_la_DEPENDENCIES) $(EXTRA_libgstesd_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstesd_la_LINK) -rpath $(plugindir) $(libgstesd_la_OBJECTS) $(libgstesd_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstesd_la-esdsink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstesd_la-gstesd.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstesd_la-esdsink.lo: esdsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstesd_la_CFLAGS) $(CFLAGS) -MT libgstesd_la-esdsink.lo -MD -MP -MF $(DEPDIR)/libgstesd_la-esdsink.Tpo -c -o libgstesd_la-esdsink.lo `test -f 'esdsink.c' || echo '$(srcdir)/'`esdsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstesd_la-esdsink.Tpo $(DEPDIR)/libgstesd_la-esdsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='esdsink.c' object='libgstesd_la-esdsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstesd_la_CFLAGS) $(CFLAGS) -c -o libgstesd_la-esdsink.lo `test -f 'esdsink.c' || echo '$(srcdir)/'`esdsink.c + +libgstesd_la-gstesd.lo: gstesd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstesd_la_CFLAGS) $(CFLAGS) -MT libgstesd_la-gstesd.lo -MD -MP -MF $(DEPDIR)/libgstesd_la-gstesd.Tpo -c -o libgstesd_la-gstesd.lo `test -f 'gstesd.c' || echo '$(srcdir)/'`gstesd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstesd_la-gstesd.Tpo $(DEPDIR)/libgstesd_la-gstesd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstesd.c' object='libgstesd_la-gstesd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstesd_la_CFLAGS) $(CFLAGS) -c -o libgstesd_la-gstesd.lo `test -f 'gstesd.c' || echo '$(srcdir)/'`gstesd.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/esd/esdmon.h b/ext/esd/esdmon.h new file mode 100644 index 0000000..50fc7ee --- /dev/null +++ b/ext/esd/esdmon.h @@ -0,0 +1,77 @@ +/* GStreamer + * Copyright (C) <2001,2002> Richard Boulton + * + * Based on example.c: + * Copyright (C) <1999> Erik Walthinsen + * + * 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_ESDMON_H__ +#define __GST_ESDMON_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ESDMON \ + (gst_esdmon_get_type()) +#define GST_ESDMON(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ESDMON,GstEsdmon)) +#define GST_ESDMON_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ESDMON,GstEsdmonClass)) +#define GST_IS_ESDMON(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ESDMON)) +#define GST_IS_ESDMON_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDMON)) + +typedef enum { + GST_ESDMON_OPEN = (GST_ELEMENT_FLAG_LAST << 0), + GST_ESDMON_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2) +} GstEsdSrcFlags; + +typedef struct _GstEsdmon GstEsdmon; +typedef struct _GstEsdmonClass GstEsdmonClass; + +struct _GstEsdmon { + GstElement element; + + GstPad *srcpad; + + gchar* host; + + int fd; + + gint depth; + gint channels; + gint frequency; + + guint64 basetime; + guint64 samples_since_basetime; + guint64 curoffset; + guint64 bytes_per_read; +}; + +struct _GstEsdmonClass { + GstElementClass parent_class; +}; + +GType gst_esdmon_get_type (void); + +G_END_DECLS + +#endif /* __GST_ESDMON_H__ */ + diff --git a/ext/esd/esdsink.c b/ext/esd/esdsink.c new file mode 100644 index 0000000..6dfb364 --- /dev/null +++ b/ext/esd/esdsink.c @@ -0,0 +1,468 @@ +/* GStreamer + * Copyright (C) <2005> Arwed v. Merkatz + * + * Roughly based on the gstreamer 0.8 esdsink plugin: + * Copyright (C) <2001> Richard Boulton + * + * esdsink.c: an EsounD audio sink + * + * 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-esdsink + * @see_also: #GstAlsaSink, #GstAutoAudioSink + * + * This element outputs sound to an already-running Enlightened Sound Daemon + * (ESound Daemon, esd). Note that a sound daemon will never be auto-spawned + * through this element (regardless of the system configuration), since this + * is actively prevented by the element. If you must use esd, you need to + * make sure it is started automatically with your session or otherwise. + * + * TODO: insert some comments about how sucky esd is and that all the cool + * kids use pulseaudio or whatever these days. + * + * + * Example launch line + * |[ + * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! audioresample ! esdsink + * ]| play an Ogg/Vorbis audio file via esd + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "esdsink.h" +#include +#include +#include + +#include + +/* wtay: from my esd.h (debian unstable libesd0-dev 0.2.36-3) */ +#ifndef ESD_MAX_WRITE_SIZE +#define ESD_MAX_WRITE_SIZE (21 * 4096) +#endif + +GST_DEBUG_CATEGORY_EXTERN (esd_debug); +#define GST_CAT_DEFAULT esd_debug + +enum +{ + PROP_0, + PROP_HOST +}; + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, 2 ]; " + "audio/x-raw-int, " + "signed = (boolean) { true, false }, " + "width = (int) 8, " + "depth = (int) 8, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") + ); + +static void gst_esdsink_finalize (GObject * object); + +static GstCaps *gst_esdsink_getcaps (GstBaseSink * bsink); + +static gboolean gst_esdsink_open (GstAudioSink * asink); +static gboolean gst_esdsink_close (GstAudioSink * asink); +static gboolean gst_esdsink_prepare (GstAudioSink * asink, + GstRingBufferSpec * spec); +static gboolean gst_esdsink_unprepare (GstAudioSink * asink); +static guint gst_esdsink_write (GstAudioSink * asink, gpointer data, + guint length); +static guint gst_esdsink_delay (GstAudioSink * asink); +static void gst_esdsink_reset (GstAudioSink * asink); + +static void gst_esdsink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_esdsink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +GST_BOILERPLATE (GstEsdSink, gst_esdsink, GstAudioSink, GST_TYPE_AUDIO_SINK); + +static void +gst_esdsink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_set_details_simple (element_class, "Esound audio sink", + "Sink/Audio", + "Plays audio to an esound server", + "Arwed von Merkatz "); +} + +static void +gst_esdsink_class_init (GstEsdSinkClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSinkClass *gstbasesink_class; + GstAudioSinkClass *gstaudiosink_class; + + gobject_class = (GObjectClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gstaudiosink_class = (GstAudioSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_esdsink_finalize; + + gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_esdsink_getcaps); + + gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_esdsink_open); + gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_esdsink_close); + gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_esdsink_prepare); + gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_esdsink_unprepare); + gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_esdsink_write); + gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_esdsink_delay); + gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_esdsink_reset); + + gobject_class->set_property = gst_esdsink_set_property; + gobject_class->get_property = gst_esdsink_get_property; + + /* default value is filled in the _init method */ + g_object_class_install_property (gobject_class, PROP_HOST, + g_param_spec_string ("host", "Host", + "The host running the esound daemon", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_esdsink_init (GstEsdSink * esdsink, GstEsdSinkClass * klass) +{ + esdsink->fd = -1; + esdsink->ctrl_fd = -1; + esdsink->host = g_strdup (g_getenv ("ESPEAKER")); +} + +static void +gst_esdsink_finalize (GObject * object) +{ + GstEsdSink *esdsink = GST_ESDSINK (object); + + gst_caps_replace (&esdsink->cur_caps, NULL); + g_free (esdsink->host); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstCaps * +gst_esdsink_getcaps (GstBaseSink * bsink) +{ + GstEsdSink *esdsink; + + esdsink = GST_ESDSINK (bsink); + + /* no fd, we're done with the template caps */ + if (esdsink->ctrl_fd < 0 || esdsink->cur_caps == NULL) { + GST_LOG_OBJECT (esdsink, "getcaps called, returning template caps"); + return NULL; + } + + GST_LOG_OBJECT (esdsink, "returning %" GST_PTR_FORMAT, esdsink->cur_caps); + + return gst_caps_ref (esdsink->cur_caps); +} + +static gboolean +gst_esdsink_open (GstAudioSink * asink) +{ + esd_server_info_t *server_info; + GstPadTemplate *pad_template; + GstEsdSink *esdsink; + gchar *saved_env; + gint i; + + esdsink = GST_ESDSINK (asink); + + GST_DEBUG_OBJECT (esdsink, "open"); + + /* ensure libesd doesn't auto-spawn a sound daemon if none is running yet */ + saved_env = g_strdup (g_getenv ("ESD_NO_SPAWN")); + g_setenv ("ESD_NO_SPAWN", "1", TRUE); + + /* now try to connect to any existing/running sound daemons */ + esdsink->ctrl_fd = esd_open_sound (esdsink->host); + + /* and restore the previous state */ + if (saved_env != NULL) { + g_setenv ("ESD_NO_SPAWN", saved_env, TRUE); + } else { + g_unsetenv ("ESD_NO_SPAWN"); + } + g_free (saved_env); + + if (esdsink->ctrl_fd < 0) + goto couldnt_connect; + + /* get server info */ + server_info = esd_get_server_info (esdsink->ctrl_fd); + if (!server_info) + goto no_server_info; + + GST_INFO_OBJECT (esdsink, "got server info rate: %i", server_info->rate); + + pad_template = gst_static_pad_template_get (&sink_factory); + esdsink->cur_caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); + gst_object_unref (pad_template); + + for (i = 0; i < esdsink->cur_caps->structs->len; i++) { + GstStructure *s; + + s = gst_caps_get_structure (esdsink->cur_caps, i); + gst_structure_set (s, "rate", G_TYPE_INT, server_info->rate, NULL); + } + + esd_free_server_info (server_info); + + GST_INFO_OBJECT (esdsink, "server caps: %" GST_PTR_FORMAT, esdsink->cur_caps); + + return TRUE; + + /* ERRORS */ +couldnt_connect: + { + GST_ELEMENT_ERROR (esdsink, RESOURCE, OPEN_WRITE, + (_("Could not establish connection to sound server")), + ("can't open connection to esound server")); + return FALSE; + } +no_server_info: + { + GST_ELEMENT_ERROR (esdsink, RESOURCE, OPEN_WRITE, + (_("Failed to query sound server capabilities")), + ("couldn't get server info!")); + return FALSE; + } +} + +static gboolean +gst_esdsink_close (GstAudioSink * asink) +{ + GstEsdSink *esdsink = GST_ESDSINK (asink); + + GST_DEBUG_OBJECT (esdsink, "close"); + + gst_caps_replace (&esdsink->cur_caps, NULL); + esd_close (esdsink->ctrl_fd); + esdsink->ctrl_fd = -1; + + return TRUE; +} + +static gboolean +gst_esdsink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) +{ + GstEsdSink *esdsink = GST_ESDSINK (asink); + esd_format_t esdformat; + + /* Name used by esound for this connection. */ + const char connname[] = "GStreamer"; + + GST_DEBUG_OBJECT (esdsink, "prepare"); + + /* Bitmap describing audio format. */ + esdformat = ESD_STREAM | ESD_PLAY; + + switch (spec->depth) { + case 8: + esdformat |= ESD_BITS8; + break; + case 16: + esdformat |= ESD_BITS16; + break; + default: + goto unsupported_depth; + } + + switch (spec->channels) { + case 1: + esdformat |= ESD_MONO; + break; + case 2: + esdformat |= ESD_STEREO; + break; + default: + goto unsupported_channels; + } + + GST_INFO_OBJECT (esdsink, + "attempting to open data connection to esound server"); + + esdsink->fd = + esd_play_stream (esdformat, spec->rate, esdsink->host, connname); + + if ((esdsink->fd < 0) || (esdsink->ctrl_fd < 0)) + goto cannot_open; + + esdsink->rate = spec->rate; + + spec->segsize = ESD_BUF_SIZE; + spec->segtotal = (ESD_MAX_WRITE_SIZE / spec->segsize); + + /* FIXME: this is wrong for signed ints (and the + * audioringbuffers should do it for us anyway) */ + spec->silence_sample[0] = 0; + spec->silence_sample[1] = 0; + spec->silence_sample[2] = 0; + spec->silence_sample[3] = 0; + + GST_INFO_OBJECT (esdsink, "successfully opened connection to esound server"); + + return TRUE; + + /* ERRORS */ +unsupported_depth: + { + GST_ELEMENT_ERROR (esdsink, STREAM, WRONG_TYPE, (NULL), + ("can't handle sample depth of %d, only 8 or 16 supported", + spec->depth)); + return FALSE; + } +unsupported_channels: + { + GST_ELEMENT_ERROR (esdsink, STREAM, WRONG_TYPE, (NULL), + ("can't handle %d channels, only 1 or 2 supported", spec->channels)); + return FALSE; + } +cannot_open: + { + GST_ELEMENT_ERROR (esdsink, RESOURCE, OPEN_WRITE, + (_("Could not establish connection to sound server")), + ("can't open connection to esound server")); + return FALSE; + } +} + +static gboolean +gst_esdsink_unprepare (GstAudioSink * asink) +{ + GstEsdSink *esdsink = GST_ESDSINK (asink); + + if ((esdsink->fd < 0) && (esdsink->ctrl_fd < 0)) + return TRUE; + + close (esdsink->fd); + esdsink->fd = -1; + + GST_INFO_OBJECT (esdsink, "closed sound device"); + + return TRUE; +} + + +static guint +gst_esdsink_write (GstAudioSink * asink, gpointer data, guint length) +{ + GstEsdSink *esdsink = GST_ESDSINK (asink); + gint to_write = 0; + + to_write = length; + + while (to_write > 0) { + int done; + + done = write (esdsink->fd, data, to_write); + + if (done < 0) + goto write_error; + + to_write -= done; + data = (char *) data + done; + } + return length; + + /* ERRORS */ +write_error: + { + GST_ELEMENT_ERROR (esdsink, RESOURCE, WRITE, + ("Failed to write data to the esound daemon"), GST_ERROR_SYSTEM); + return -1; + } +} + +static guint +gst_esdsink_delay (GstAudioSink * asink) +{ + GstEsdSink *esdsink = GST_ESDSINK (asink); + guint latency; + + latency = esd_get_latency (esdsink->ctrl_fd); + + if (latency == (guint) - 1) { + GST_WARNING_OBJECT (asink, "couldn't get latency"); + return 0; + } + + /* latency is measured in samples at a rate of 44100, this + * cannot overflow. */ + latency = latency * G_GINT64_CONSTANT (44100) / esdsink->rate; + + GST_DEBUG_OBJECT (asink, "got latency: %u", latency); + + return latency; +} + +static void +gst_esdsink_reset (GstAudioSink * asink) +{ + GST_DEBUG_OBJECT (asink, "reset called"); +} + +static void +gst_esdsink_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstEsdSink *esdsink = GST_ESDSINK (object); + + switch (prop_id) { + case PROP_HOST: + g_free (esdsink->host); + esdsink->host = g_value_dup_string (value); + break; + default: + break; + } +} + +static void +gst_esdsink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstEsdSink *esdsink = GST_ESDSINK (object); + + switch (prop_id) { + case PROP_HOST: + g_value_set_string (value, esdsink->host); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/ext/esd/esdsink.h b/ext/esd/esdsink.h new file mode 100644 index 0000000..2e69ea8 --- /dev/null +++ b/ext/esd/esdsink.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <2005> Arwed v. Merkatz + * + * esdsink.h: an EsounD audio sink + * + * 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_ESDSINK_H__ +#define __GST_ESDSINK_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ESDSINK \ + (gst_esdsink_get_type()) +#define GST_ESDSINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ESDSINK,GstEsdSink)) +#define GST_ESDSINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ESDSINK,GstEsdSinkClass)) +#define GST_IS_ESDSINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ESDSINK)) +#define GST_IS_ESDSINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDSINK)) + +typedef struct _GstEsdSink GstEsdSink; +typedef struct _GstEsdSinkClass GstEsdSinkClass; + +struct _GstEsdSink { + GstAudioSink sink; + + int fd; + int ctrl_fd; + gchar *host; + + guint rate; + GstCaps *cur_caps; +}; + +struct _GstEsdSinkClass { + GstAudioSinkClass parent_class; +}; + +GType gst_esdsink_get_type (void); + +G_END_DECLS + +#endif /* __GST_ESDSINK_H__ */ diff --git a/ext/esd/gstesd.c b/ext/esd/gstesd.c new file mode 100644 index 0000000..dc65001 --- /dev/null +++ b/ext/esd/gstesd.c @@ -0,0 +1,60 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David A. Schleef + * + * 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 "esdsink.h" +#if 0 +#include "esdmon.h" +#endif + +#include "gst/gst-i18n-plugin.h" + +GST_DEBUG_CATEGORY (esd_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "esdsink", GST_RANK_MARGINAL, + GST_TYPE_ESDSINK)) + return FALSE; + +#if 0 + if (!gst_element_register (plugin, "esdmon", GST_RANK_NONE, GST_TYPE_ESDMON)) + return FALSE; +#endif + + GST_DEBUG_CATEGORY_INIT (esd_debug, "esd", 0, "ESounD elements"); + +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "esdsink", + "ESD Element Plugins", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/flac/Makefile.am b/ext/flac/Makefile.am new file mode 100644 index 0000000..89805a3 --- /dev/null +++ b/ext/flac/Makefile.am @@ -0,0 +1,13 @@ +plugin_LTLIBRARIES = libgstflac.la + +libgstflac_la_SOURCES = gstflac.c gstflacdec.c gstflacenc.c gstflactag.c +libgstflac_la_CFLAGS = -DGST_USE_UNSTABLE_API \ + $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(FLAC_CFLAGS) +libgstflac_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(FLAC_LIBS) +libgstflac_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstflac_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstflacenc.h gstflacdec.h gstflactag.h diff --git a/ext/flac/Makefile.in b/ext/flac/Makefile.in new file mode 100644 index 0000000..e02be9a --- /dev/null +++ b/ext/flac/Makefile.in @@ -0,0 +1,838 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/flac +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstflac_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstflac_la_OBJECTS = libgstflac_la-gstflac.lo \ + libgstflac_la-gstflacdec.lo libgstflac_la-gstflacenc.lo \ + libgstflac_la-gstflactag.lo +libgstflac_la_OBJECTS = $(am_libgstflac_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstflac_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstflac_la_CFLAGS) $(CFLAGS) \ + $(libgstflac_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstflac_la_SOURCES) +DIST_SOURCES = $(libgstflac_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstflac.la +libgstflac_la_SOURCES = gstflac.c gstflacdec.c gstflacenc.c gstflactag.c +libgstflac_la_CFLAGS = -DGST_USE_UNSTABLE_API \ + $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(FLAC_CFLAGS) + +libgstflac_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(FLAC_LIBS) + +libgstflac_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstflac_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstflacenc.h gstflacdec.h gstflactag.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/flac/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/flac/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstflac.la: $(libgstflac_la_OBJECTS) $(libgstflac_la_DEPENDENCIES) $(EXTRA_libgstflac_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstflac_la_LINK) -rpath $(plugindir) $(libgstflac_la_OBJECTS) $(libgstflac_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflac_la-gstflac.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflac_la-gstflacdec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflac_la-gstflacenc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflac_la-gstflactag.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstflac_la-gstflac.lo: gstflac.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -MT libgstflac_la-gstflac.lo -MD -MP -MF $(DEPDIR)/libgstflac_la-gstflac.Tpo -c -o libgstflac_la-gstflac.lo `test -f 'gstflac.c' || echo '$(srcdir)/'`gstflac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflac_la-gstflac.Tpo $(DEPDIR)/libgstflac_la-gstflac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflac.c' object='libgstflac_la-gstflac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -c -o libgstflac_la-gstflac.lo `test -f 'gstflac.c' || echo '$(srcdir)/'`gstflac.c + +libgstflac_la-gstflacdec.lo: gstflacdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -MT libgstflac_la-gstflacdec.lo -MD -MP -MF $(DEPDIR)/libgstflac_la-gstflacdec.Tpo -c -o libgstflac_la-gstflacdec.lo `test -f 'gstflacdec.c' || echo '$(srcdir)/'`gstflacdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflac_la-gstflacdec.Tpo $(DEPDIR)/libgstflac_la-gstflacdec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflacdec.c' object='libgstflac_la-gstflacdec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -c -o libgstflac_la-gstflacdec.lo `test -f 'gstflacdec.c' || echo '$(srcdir)/'`gstflacdec.c + +libgstflac_la-gstflacenc.lo: gstflacenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -MT libgstflac_la-gstflacenc.lo -MD -MP -MF $(DEPDIR)/libgstflac_la-gstflacenc.Tpo -c -o libgstflac_la-gstflacenc.lo `test -f 'gstflacenc.c' || echo '$(srcdir)/'`gstflacenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflac_la-gstflacenc.Tpo $(DEPDIR)/libgstflac_la-gstflacenc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflacenc.c' object='libgstflac_la-gstflacenc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -c -o libgstflac_la-gstflacenc.lo `test -f 'gstflacenc.c' || echo '$(srcdir)/'`gstflacenc.c + +libgstflac_la-gstflactag.lo: gstflactag.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -MT libgstflac_la-gstflactag.lo -MD -MP -MF $(DEPDIR)/libgstflac_la-gstflactag.Tpo -c -o libgstflac_la-gstflactag.lo `test -f 'gstflactag.c' || echo '$(srcdir)/'`gstflactag.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflac_la-gstflactag.Tpo $(DEPDIR)/libgstflac_la-gstflactag.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflactag.c' object='libgstflac_la-gstflactag.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -c -o libgstflac_la-gstflactag.lo `test -f 'gstflactag.c' || echo '$(srcdir)/'`gstflactag.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/flac/gstflac.c b/ext/flac/gstflac.c new file mode 100644 index 0000000..e093e71 --- /dev/null +++ b/ext/flac/gstflac.c @@ -0,0 +1,60 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 "gstflacenc.h" +#include "gstflacdec.h" +#include "gstflactag.h" + +#include +#include + +static gboolean +plugin_init (GstPlugin * plugin) +{ +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif + + if (!gst_element_register (plugin, "flacenc", GST_RANK_PRIMARY, + GST_TYPE_FLAC_ENC)) + return FALSE; + if (!gst_element_register (plugin, "flacdec", GST_RANK_PRIMARY, + GST_TYPE_FLAC_DEC)) + return FALSE; + if (!gst_element_register (plugin, "flactag", GST_RANK_PRIMARY, + gst_flac_tag_get_type ())) + return FALSE; + + gst_tag_register_musicbrainz_tags (); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "flac", + "The FLAC Lossless compressor Codec", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c new file mode 100644 index 0000000..10f8916 --- /dev/null +++ b/ext/flac/gstflacdec.c @@ -0,0 +1,2176 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Tim-Philipp Müller + * Copyright (C) <2006> Jan Schmidt + * + * 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-flacdec + * @see_also: #GstFlacEnc + * + * flacdec decodes FLAC streams. + * FLAC + * is a Free Lossless Audio Codec. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=media/small/dark.441-16-s.flac ! flacdec ! audioconvert ! audioresample ! autoaudiosink + * ]| + * |[ + * gst-launch gnomevfssrc location=http://gstreamer.freedesktop.org/media/small/dark.441-16-s.flac ! flacdec ! audioconvert ! audioresample ! queue min-threshold-buffers=10 ! autoaudiosink + * ]| + * + */ + +/* TODO: add seeking when operating chain-based with unframed input */ +/* FIXME: demote/remove granulepos handling and make more time-centric */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +#include "gstflacdec.h" +#include +#include +#include +#include +#include + +/* Taken from http://flac.sourceforge.net/format.html#frame_header */ +static const GstAudioChannelPosition channel_positions[8][8] = { + {GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}, + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, + /* FIXME: 7/8 channel layouts are not defined in the FLAC specs */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT} +}; + +GST_DEBUG_CATEGORY_STATIC (flacdec_debug); +#define GST_CAT_DEFAULT flacdec_debug + +static void gst_flac_dec_finalize (GObject * object); +static void gst_flac_dec_loop (GstPad * pad); + +static GstStateChangeReturn gst_flac_dec_change_state (GstElement * element, + GstStateChange transition); +static const GstQueryType *gst_flac_dec_get_src_query_types (GstPad * pad); +static const GstQueryType *gst_flac_dec_get_sink_query_types (GstPad * pad); +static gboolean gst_flac_dec_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_flac_dec_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_flac_dec_convert_src (GstPad * pad, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static gboolean gst_flac_dec_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_flac_dec_sink_activate (GstPad * sinkpad); +static gboolean gst_flac_dec_sink_activate_pull (GstPad * sinkpad, + gboolean active); +static gboolean gst_flac_dec_sink_activate_push (GstPad * sinkpad, + gboolean active); +static gboolean gst_flac_dec_sink_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_flac_dec_chain (GstPad * pad, GstBuffer * buf); + +static void gst_flac_dec_reset_decoders (GstFlacDec * flacdec); +static void gst_flac_dec_setup_decoder (GstFlacDec * flacdec); + +static FLAC__StreamDecoderReadStatus +gst_flac_dec_read_seekable (const FLAC__StreamDecoder * decoder, + FLAC__byte buffer[], size_t * bytes, void *client_data); +static FLAC__StreamDecoderReadStatus +gst_flac_dec_read_stream (const FLAC__StreamDecoder * decoder, + FLAC__byte buffer[], size_t * bytes, void *client_data); +static FLAC__StreamDecoderSeekStatus +gst_flac_dec_seek (const FLAC__StreamDecoder * decoder, + FLAC__uint64 position, void *client_data); +static FLAC__StreamDecoderTellStatus +gst_flac_dec_tell (const FLAC__StreamDecoder * decoder, + FLAC__uint64 * position, void *client_data); +static FLAC__StreamDecoderLengthStatus +gst_flac_dec_length (const FLAC__StreamDecoder * decoder, + FLAC__uint64 * length, void *client_data); +static FLAC__bool gst_flac_dec_eof (const FLAC__StreamDecoder * decoder, + void *client_data); +static FLAC__StreamDecoderWriteStatus +gst_flac_dec_write_stream (const FLAC__StreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * const buffer[], void *client_data); +static void gst_flac_dec_metadata_cb (const FLAC__StreamDecoder * + decoder, const FLAC__StreamMetadata * metadata, void *client_data); +static void gst_flac_dec_error_cb (const FLAC__StreamDecoder * + decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + +GST_BOILERPLATE (GstFlacDec, gst_flac_dec, GstElement, GST_TYPE_ELEMENT); + +/* FIXME 0.11: Use width=32 for all depths and let audioconvert + * handle the conversions instead of doing it ourself. + */ +#define GST_FLAC_DEC_SRC_CAPS \ + "audio/x-raw-int, " \ + "endianness = (int) BYTE_ORDER, " \ + "signed = (boolean) true, " \ + "width = (int) { 8, 16, 32 }, " \ + "depth = (int) [ 4, 32 ], " \ + "rate = (int) [ 1, 655350 ], " \ + "channels = (int) [ 1, 8 ]" + +static GstStaticPadTemplate flac_dec_src_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_FLAC_DEC_SRC_CAPS)); +static GstStaticPadTemplate flac_dec_sink_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-flac") + ); + +static void +gst_flac_dec_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &flac_dec_src_factory); + gst_element_class_add_static_pad_template (element_class, + &flac_dec_sink_factory); + gst_element_class_set_details_simple (element_class, "FLAC audio decoder", + "Codec/Decoder/Audio", + "Decodes FLAC lossless audio streams", "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (flacdec_debug, "flacdec", 0, "flac decoder"); +} + +static void +gst_flac_dec_class_init (GstFlacDecClass * klass) +{ + GstElementClass *gstelement_class; + GObjectClass *gobject_class; + + gstelement_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = gst_flac_dec_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_flac_dec_change_state); +} + +static void +gst_flac_dec_init (GstFlacDec * flacdec, GstFlacDecClass * klass) +{ + flacdec->sinkpad = + gst_pad_new_from_static_template (&flac_dec_sink_factory, "sink"); + gst_pad_set_activate_function (flacdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_sink_activate)); + gst_pad_set_activatepull_function (flacdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_sink_activate_pull)); + gst_pad_set_activatepush_function (flacdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_sink_activate_push)); + gst_pad_set_query_type_function (flacdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_get_sink_query_types)); + gst_pad_set_query_function (flacdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_sink_query)); + gst_pad_set_event_function (flacdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_sink_event)); + gst_pad_set_chain_function (flacdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_chain)); + gst_element_add_pad (GST_ELEMENT (flacdec), flacdec->sinkpad); + + flacdec->srcpad = + gst_pad_new_from_static_template (&flac_dec_src_factory, "src"); + gst_pad_set_query_type_function (flacdec->srcpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_get_src_query_types)); + gst_pad_set_query_function (flacdec->srcpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_src_query)); + gst_pad_set_event_function (flacdec->srcpad, + GST_DEBUG_FUNCPTR (gst_flac_dec_src_event)); + gst_pad_use_fixed_caps (flacdec->srcpad); + gst_element_add_pad (GST_ELEMENT (flacdec), flacdec->srcpad); + + gst_flac_dec_reset_decoders (flacdec); +} + +static void +gst_flac_dec_reset_decoders (GstFlacDec * flacdec) +{ + /* Clean up the decoder */ + if (flacdec->decoder) { + FLAC__stream_decoder_delete (flacdec->decoder); + flacdec->decoder = NULL; + } + + if (flacdec->adapter) { + gst_adapter_clear (flacdec->adapter); + g_object_unref (flacdec->adapter); + flacdec->adapter = NULL; + } + + if (flacdec->close_segment) { + gst_event_unref (flacdec->close_segment); + flacdec->close_segment = NULL; + } + if (flacdec->start_segment) { + gst_event_unref (flacdec->start_segment); + flacdec->start_segment = NULL; + } + if (flacdec->tags) { + gst_tag_list_free (flacdec->tags); + flacdec->tags = NULL; + } + if (flacdec->pending) { + gst_buffer_unref (flacdec->pending); + flacdec->pending = NULL; + } + + flacdec->segment.last_stop = 0; + flacdec->offset = 0; + flacdec->init = TRUE; +} + +static void +gst_flac_dec_setup_decoder (GstFlacDec * dec) +{ + gst_flac_dec_reset_decoders (dec); + + dec->tags = gst_tag_list_new (); + gst_tag_list_add (dec->tags, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, "FLAC", NULL); + + dec->adapter = gst_adapter_new (); + + dec->decoder = FLAC__stream_decoder_new (); + + /* no point calculating since it's never checked here */ + FLAC__stream_decoder_set_md5_checking (dec->decoder, false); + FLAC__stream_decoder_set_metadata_respond (dec->decoder, + FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__stream_decoder_set_metadata_respond (dec->decoder, + FLAC__METADATA_TYPE_PICTURE); +} + +static void +gst_flac_dec_finalize (GObject * object) +{ + GstFlacDec *flacdec; + + flacdec = GST_FLAC_DEC (object); + + gst_flac_dec_reset_decoders (flacdec); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static gboolean +gst_flac_dec_update_metadata (GstFlacDec * flacdec, + const FLAC__StreamMetadata * metadata) +{ + GstTagList *list; + guint num, i; + + if (flacdec->tags) + list = flacdec->tags; + else + flacdec->tags = list = gst_tag_list_new (); + + num = metadata->data.vorbis_comment.num_comments; + GST_DEBUG_OBJECT (flacdec, "%u tag(s) found", num); + + for (i = 0; i < num; ++i) { + gchar *vc, *name, *value; + + vc = g_strndup ((gchar *) metadata->data.vorbis_comment.comments[i].entry, + metadata->data.vorbis_comment.comments[i].length); + + if (gst_tag_parse_extended_comment (vc, &name, NULL, &value, TRUE)) { + GST_DEBUG_OBJECT (flacdec, "%s : %s", name, value); + if (value && strlen (value)) + gst_vorbis_tag_add (list, name, value); + g_free (name); + g_free (value); + } + + g_free (vc); + } + + return TRUE; +} + +/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ +static const guint8 crc8_table[256] = { + 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, + 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, + 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, + 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, + 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, + 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, + 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, + 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, + 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, + 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, + 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, + 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, + 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, + 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, + 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, + 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, + 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, + 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, + 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, + 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, + 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, + 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, + 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, + 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, + 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, + 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, + 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, + 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, + 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, + 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, + 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, + 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 +}; + +static guint8 +gst_flac_calculate_crc8 (guint8 * data, guint length) +{ + guint8 crc = 0; + + while (length--) { + crc = crc8_table[crc ^ *data]; + ++data; + } + + return crc; +} + +static gboolean +gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size, + gint64 * last_sample_num) +{ + guint headerlen; + guint sr_from_end = 0; /* can be 0, 8 or 16 */ + guint bs_from_end = 0; /* can be 0, 8 or 16 */ + guint32 val = 0; + guint8 bs, sr, ca, ss, pb; + + if (size < 10) + return FALSE; + + /* sync */ + if (data[0] != 0xFF || (data[1] & 0xFC) != 0xF8) + return FALSE; + if (data[1] & 1) { + GST_WARNING_OBJECT (flacdec, "Variable block size FLAC unsupported"); + return FALSE; + } + + bs = (data[2] & 0xF0) >> 4; /* blocksize marker */ + sr = (data[2] & 0x0F); /* samplerate marker */ + ca = (data[3] & 0xF0) >> 4; /* channel assignment */ + ss = (data[3] & 0x0F) >> 1; /* sample size marker */ + pb = (data[3] & 0x01); /* padding bit */ + + GST_LOG_OBJECT (flacdec, + "got sync, bs=%x,sr=%x,ca=%x,ss=%x,pb=%x", bs, sr, ca, ss, pb); + + if (bs == 0 || sr == 0x0F || ca >= 0x0B || ss == 0x03 || ss == 0x07) { + return FALSE; + } + + /* read block size from end of header? */ + if (bs == 6) + bs_from_end = 8; + else if (bs == 7) + bs_from_end = 16; + + /* read sample rate from end of header? */ + if (sr == 0x0C) + sr_from_end = 8; + else if (sr == 0x0D || sr == 0x0E) + sr_from_end = 16; + + /* FIXME: This is can be 36 bit if variable block size is used, + * fortunately not encoder supports this yet and we check for that + * above. + */ + val = (guint32) g_utf8_get_char_validated ((gchar *) data + 4, -1); + + if (val == (guint32) - 1 || val == (guint32) - 2) { + GST_LOG_OBJECT (flacdec, "failed to read sample/frame"); + return FALSE; + } + + headerlen = 4 + g_unichar_to_utf8 ((gunichar) val, NULL) + + (bs_from_end / 8) + (sr_from_end / 8); + + if (gst_flac_calculate_crc8 (data, headerlen) != data[headerlen]) { + GST_LOG_OBJECT (flacdec, "invalid checksum"); + return FALSE; + } + + if (flacdec->min_blocksize == flacdec->max_blocksize) { + *last_sample_num = (val + 1) * flacdec->min_blocksize; + } else { + *last_sample_num = 0; /* FIXME: + length of last block in samples */ + } + + /* FIXME: only valid for fixed block size streams */ + GST_DEBUG_OBJECT (flacdec, "frame number: %" G_GINT64_FORMAT, + *last_sample_num); + + if (flacdec->sample_rate > 0 && *last_sample_num != 0) { + GST_DEBUG_OBJECT (flacdec, "last sample %" G_GINT64_FORMAT " = %" + GST_TIME_FORMAT, *last_sample_num, + GST_TIME_ARGS (*last_sample_num * GST_SECOND / flacdec->sample_rate)); + } + + return TRUE; +} + +#define SCANBLOCK_SIZE (64*1024) + +static void +gst_flac_dec_scan_for_last_block (GstFlacDec * flacdec, gint64 * samples) +{ + GstFormat format = GST_FORMAT_BYTES; + gint64 file_size, offset; + + GST_INFO_OBJECT (flacdec, "total number of samples unknown, scanning file"); + + if (!gst_pad_query_peer_duration (flacdec->sinkpad, &format, &file_size)) { + GST_WARNING_OBJECT (flacdec, "failed to query upstream size!"); + return; + } + + if (flacdec->min_blocksize != flacdec->max_blocksize) { + GST_WARNING_OBJECT (flacdec, "scanning for last sample only works " + "for FLAC files with constant blocksize"); + return; + } + + GST_DEBUG_OBJECT (flacdec, "upstream size: %" G_GINT64_FORMAT, file_size); + + offset = file_size - 1; + while (offset >= MAX (SCANBLOCK_SIZE / 2, file_size / 2)) { + GstFlowReturn flow; + GstBuffer *buf = NULL; + guint8 *data; + guint size; + + /* divide by 2 = not very sophisticated way to deal with overlapping */ + offset -= SCANBLOCK_SIZE / 2; + GST_LOG_OBJECT (flacdec, "looking for frame at %" G_GINT64_FORMAT + "-%" G_GINT64_FORMAT, offset, offset + SCANBLOCK_SIZE); + + flow = gst_pad_pull_range (flacdec->sinkpad, offset, SCANBLOCK_SIZE, &buf); + if (flow != GST_FLOW_OK) { + GST_DEBUG_OBJECT (flacdec, "flow = %s", gst_flow_get_name (flow)); + return; + } + + size = GST_BUFFER_SIZE (buf); + data = GST_BUFFER_DATA (buf); + + while (size > 16) { + if (gst_flac_dec_scan_got_frame (flacdec, data, size, samples)) { + GST_DEBUG_OBJECT (flacdec, "frame sync at offset %" G_GINT64_FORMAT, + offset + GST_BUFFER_SIZE (buf) - size); + gst_buffer_unref (buf); + return; + } + ++data; + --size; + } + + gst_buffer_unref (buf); + } +} + +static void +gst_flac_extract_picture_buffer (GstFlacDec * dec, + const FLAC__StreamMetadata * metadata) +{ + FLAC__StreamMetadata_Picture picture; + GstTagList *tags; + + g_return_if_fail (metadata->type == FLAC__METADATA_TYPE_PICTURE); + + GST_LOG_OBJECT (dec, "Got PICTURE block"); + picture = metadata->data.picture; + + GST_DEBUG_OBJECT (dec, "declared MIME type is: '%s'", + GST_STR_NULL (picture.mime_type)); + GST_DEBUG_OBJECT (dec, "image data is %u bytes", picture.data_length); + + tags = gst_tag_list_new (); + + gst_tag_list_add_id3_image (tags, (guint8 *) picture.data, + picture.data_length, picture.type); + + if (!gst_tag_list_is_empty (tags)) { + gst_element_found_tags_for_pad (GST_ELEMENT (dec), dec->srcpad, tags); + } else { + GST_DEBUG_OBJECT (dec, "problem parsing PICTURE block, skipping"); + gst_tag_list_free (tags); + } +} + +static void +gst_flac_dec_metadata_cb (const FLAC__StreamDecoder * decoder, + const FLAC__StreamMetadata * metadata, void *client_data) +{ + GstFlacDec *flacdec = GST_FLAC_DEC (client_data); + + GST_LOG_OBJECT (flacdec, "metadata type: %d", metadata->type); + + switch (metadata->type) { + case FLAC__METADATA_TYPE_STREAMINFO:{ + gint64 samples; + guint depth; + + samples = metadata->data.stream_info.total_samples; + + flacdec->min_blocksize = metadata->data.stream_info.min_blocksize; + flacdec->max_blocksize = metadata->data.stream_info.max_blocksize; + flacdec->sample_rate = metadata->data.stream_info.sample_rate; + flacdec->depth = depth = metadata->data.stream_info.bits_per_sample; + flacdec->channels = metadata->data.stream_info.channels; + + if (depth < 9) + flacdec->width = 8; + else if (depth < 17) + flacdec->width = 16; + else + flacdec->width = 32; + + GST_DEBUG_OBJECT (flacdec, "blocksize: min=%u, max=%u", + flacdec->min_blocksize, flacdec->max_blocksize); + GST_DEBUG_OBJECT (flacdec, "sample rate: %u, channels: %u", + flacdec->sample_rate, flacdec->channels); + GST_DEBUG_OBJECT (flacdec, "depth: %u, width: %u", flacdec->depth, + flacdec->width); + + /* Only scan for last block in pull-mode, since it uses pull_range() */ + if (samples == 0 && !flacdec->streaming) { + gst_flac_dec_scan_for_last_block (flacdec, &samples); + } + + GST_DEBUG_OBJECT (flacdec, "total samples = %" G_GINT64_FORMAT, samples); + + /* in framed mode the demuxer/parser upstream has already pushed a + * newsegment event in TIME format which we've passed on */ + if (samples > 0 && !flacdec->framed) { + gint64 duration; + + gst_segment_set_duration (&flacdec->segment, GST_FORMAT_DEFAULT, + samples); + + /* convert duration to time */ + duration = gst_util_uint64_scale_int (samples, GST_SECOND, + flacdec->sample_rate); + + /* fixme, at this time we could seek to the queued seek event if we have + * any */ + if (flacdec->start_segment) + gst_event_unref (flacdec->start_segment); + flacdec->start_segment = + gst_event_new_new_segment_full (FALSE, + flacdec->segment.rate, flacdec->segment.applied_rate, + GST_FORMAT_TIME, 0, duration, 0); + } + break; + } + case FLAC__METADATA_TYPE_PICTURE:{ + gst_flac_extract_picture_buffer (flacdec, metadata); + break; + } + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + gst_flac_dec_update_metadata (flacdec, metadata); + break; + default: + break; + } +} + +static void +gst_flac_dec_error_cb (const FLAC__StreamDecoder * d, + FLAC__StreamDecoderErrorStatus status, void *client_data) +{ + const gchar *error; + GstFlacDec *dec; + + dec = GST_FLAC_DEC (client_data); + + switch (status) { + case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC: + /* Ignore this error and keep processing */ + return; + case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER: + error = "bad header"; + break; + case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH: + error = "CRC mismatch"; + break; + default: + error = "unknown error"; + break; + } + + GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("%s (%d)", error, status)); + dec->last_flow = GST_FLOW_ERROR; +} + +static FLAC__StreamDecoderSeekStatus +gst_flac_dec_seek (const FLAC__StreamDecoder * decoder, + FLAC__uint64 position, void *client_data) +{ + GstFlacDec *flacdec; + + flacdec = GST_FLAC_DEC (client_data); + + GST_DEBUG_OBJECT (flacdec, "seek %" G_GUINT64_FORMAT, (guint64) position); + flacdec->offset = position; + + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +} + +static FLAC__StreamDecoderTellStatus +gst_flac_dec_tell (const FLAC__StreamDecoder * decoder, + FLAC__uint64 * position, void *client_data) +{ + GstFlacDec *flacdec; + + flacdec = GST_FLAC_DEC (client_data); + + *position = flacdec->offset; + + GST_DEBUG_OBJECT (flacdec, "tell %" G_GINT64_FORMAT, (gint64) * position); + + return FLAC__STREAM_DECODER_TELL_STATUS_OK; +} + +static FLAC__StreamDecoderLengthStatus +gst_flac_dec_length (const FLAC__StreamDecoder * decoder, + FLAC__uint64 * length, void *client_data) +{ + GstFlacDec *flacdec; + GstFormat fmt = GST_FORMAT_BYTES; + gint64 len = -1; + + flacdec = GST_FLAC_DEC (client_data); + + if (!gst_pad_query_peer_duration (flacdec->sinkpad, &fmt, &len) || + (fmt != GST_FORMAT_BYTES || len == -1)) + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + + *length = len; + + GST_DEBUG_OBJECT (flacdec, "encoded byte length %" G_GINT64_FORMAT, + (gint64) * length); + + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; +} + +static FLAC__bool +gst_flac_dec_eof (const FLAC__StreamDecoder * decoder, void *client_data) +{ + GstFlacDec *flacdec; + GstFormat fmt; + GstPad *peer; + gboolean ret = FALSE; + gint64 len; + + flacdec = GST_FLAC_DEC (client_data); + + if (!(peer = gst_pad_get_peer (flacdec->sinkpad))) { + GST_WARNING_OBJECT (flacdec, "no peer pad, returning EOF"); + return TRUE; + } + + fmt = GST_FORMAT_BYTES; + if (gst_pad_query_duration (peer, &fmt, &len) && fmt == GST_FORMAT_BYTES && + len != -1 && flacdec->offset >= len) { + GST_DEBUG_OBJECT (flacdec, + "offset=%" G_GINT64_FORMAT ", len=%" G_GINT64_FORMAT + ", returning EOF", flacdec->offset, len); + ret = TRUE; + } + + gst_object_unref (peer); + + return ret; +} + +static FLAC__StreamDecoderReadStatus +gst_flac_dec_read_seekable (const FLAC__StreamDecoder * decoder, + FLAC__byte buffer[], size_t * bytes, void *client_data) +{ + GstFlowReturn flow; + GstFlacDec *flacdec; + GstBuffer *buf; + + flacdec = GST_FLAC_DEC (client_data); + + flow = gst_pad_pull_range (flacdec->sinkpad, flacdec->offset, *bytes, &buf); + + GST_PAD_STREAM_LOCK (flacdec->sinkpad); + flacdec->pull_flow = flow; + GST_PAD_STREAM_UNLOCK (flacdec->sinkpad); + + if (G_UNLIKELY (flow != GST_FLOW_OK)) { + GST_INFO_OBJECT (flacdec, "pull_range flow: %s", gst_flow_get_name (flow)); + if (flow == GST_FLOW_UNEXPECTED) + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + else + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } + + GST_DEBUG_OBJECT (flacdec, "Read %d bytes at %" G_GUINT64_FORMAT, + GST_BUFFER_SIZE (buf), flacdec->offset); + memcpy (buffer, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + *bytes = GST_BUFFER_SIZE (buf); + gst_buffer_unref (buf); + flacdec->offset += *bytes; + + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +} + +static FLAC__StreamDecoderReadStatus +gst_flac_dec_read_stream (const FLAC__StreamDecoder * decoder, + FLAC__byte buffer[], size_t * bytes, void *client_data) +{ + GstFlacDec *dec = GST_FLAC_DEC (client_data); + guint len; + + len = MIN (gst_adapter_available (dec->adapter), *bytes); + + if (len == 0) { + GST_LOG_OBJECT (dec, "0 bytes available at the moment"); + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } + + GST_LOG_OBJECT (dec, "feeding %u bytes to decoder (available=%u, bytes=%u)", + len, gst_adapter_available (dec->adapter), (guint) * bytes); + gst_adapter_copy (dec->adapter, buffer, 0, len); + *bytes = len; + + gst_adapter_flush (dec->adapter, len); + + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +} + +static FLAC__StreamDecoderWriteStatus +gst_flac_dec_write (GstFlacDec * flacdec, const FLAC__Frame * frame, + const FLAC__int32 * const buffer[]) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *outbuf; + guint depth = frame->header.bits_per_sample; + guint width; + guint sample_rate = frame->header.sample_rate; + guint channels = frame->header.channels; + guint samples = frame->header.blocksize; + guint j, i; + GstClockTime next; + + GST_LOG_OBJECT (flacdec, "samples in frame header: %d", samples); + + /* if a DEFAULT segment is configured, don't send samples past the end + * of the segment */ + if (flacdec->segment.format == GST_FORMAT_DEFAULT && + flacdec->segment.stop != -1 && + flacdec->segment.last_stop >= 0 && + flacdec->segment.last_stop + samples > flacdec->segment.stop) { + samples = flacdec->segment.stop - flacdec->segment.last_stop; + GST_DEBUG_OBJECT (flacdec, + "clipping last buffer to %d samples because of segment", samples); + } + + switch (depth) { + case 8: + width = 8; + break; + case 12: + case 16: + width = 16; + break; + case 20: + case 24: + case 32: + width = 32; + break; + case 0: + if (flacdec->depth < 4 || flacdec->depth > 32) { + GST_ERROR_OBJECT (flacdec, "unsupported depth %d from STREAMINFO", + flacdec->depth); + ret = GST_FLOW_ERROR; + goto done; + } + + depth = flacdec->depth; + if (depth < 9) + width = 8; + else if (depth < 17) + width = 16; + else + width = 32; + + break; + default: + GST_ERROR_OBJECT (flacdec, "unsupported depth %d", depth); + ret = GST_FLOW_ERROR; + goto done; + } + + if (sample_rate == 0) { + if (flacdec->sample_rate != 0) { + sample_rate = flacdec->sample_rate; + } else { + GST_ERROR_OBJECT (flacdec, "unknown sample rate"); + ret = GST_FLOW_ERROR; + goto done; + } + } + + if (!GST_PAD_CAPS (flacdec->srcpad)) { + GstCaps *caps; + + GST_DEBUG_OBJECT (flacdec, "Negotiating %d Hz @ %d channels", + frame->header.sample_rate, channels); + + caps = gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, width, + "depth", G_TYPE_INT, depth, + "rate", G_TYPE_INT, frame->header.sample_rate, + "channels", G_TYPE_INT, channels, NULL); + + if (channels > 2) { + GstStructure *s = gst_caps_get_structure (caps, 0); + + gst_audio_set_channel_positions (s, channel_positions[channels - 1]); + } + + flacdec->depth = depth; + flacdec->width = width; + flacdec->channels = channels; + flacdec->sample_rate = sample_rate; + + gst_pad_set_caps (flacdec->srcpad, caps); + gst_caps_unref (caps); + } + + if (flacdec->close_segment) { + GST_DEBUG_OBJECT (flacdec, "pushing close segment"); + gst_pad_push_event (flacdec->srcpad, flacdec->close_segment); + flacdec->close_segment = NULL; + } + if (flacdec->start_segment) { + GST_DEBUG_OBJECT (flacdec, "pushing start segment"); + gst_pad_push_event (flacdec->srcpad, flacdec->start_segment); + flacdec->start_segment = NULL; + } + + if (flacdec->tags) { + gst_element_found_tags_for_pad (GST_ELEMENT (flacdec), flacdec->srcpad, + flacdec->tags); + flacdec->tags = NULL; + } + + if (flacdec->pending) { + GST_DEBUG_OBJECT (flacdec, + "pushing pending samples at offset %" G_GINT64_FORMAT " (%" + GST_TIME_FORMAT " + %" GST_TIME_FORMAT ")", + GST_BUFFER_OFFSET (flacdec->pending), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (flacdec->pending)), + GST_TIME_ARGS (GST_BUFFER_DURATION (flacdec->pending))); + /* Pending buffer was always allocated from the seeking thread, + * which means it wasn't gst_buffer_alloc'd. Do so now to let + * downstream negotiation work on older basetransform */ + ret = gst_pad_alloc_buffer_and_set_caps (flacdec->srcpad, + GST_BUFFER_OFFSET (flacdec->pending), + GST_BUFFER_SIZE (flacdec->pending), + GST_BUFFER_CAPS (flacdec->pending), &outbuf); + if (ret == GST_FLOW_OK) { + gst_pad_push (flacdec->srcpad, flacdec->pending); + gst_buffer_unref (outbuf); + } + + outbuf = flacdec->pending = NULL; + flacdec->segment.last_stop += flacdec->pending_samples; + flacdec->pending_samples = 0; + } + + if (flacdec->seeking) { + GST_DEBUG_OBJECT (flacdec, "a pad_alloc would block here, do normal alloc"); + outbuf = gst_buffer_new_and_alloc (samples * channels * (width / 8)); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (flacdec->srcpad)); + GST_BUFFER_OFFSET (outbuf) = flacdec->segment.last_stop; + } else { + GST_LOG_OBJECT (flacdec, "alloc_buffer_and_set_caps"); + ret = gst_pad_alloc_buffer_and_set_caps (flacdec->srcpad, + flacdec->segment.last_stop, samples * channels * (width / 8), + GST_PAD_CAPS (flacdec->srcpad), &outbuf); + + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (flacdec, "gst_pad_alloc_buffer() returned %s", + gst_flow_get_name (ret)); + goto done; + } + } + + if (flacdec->cur_granulepos != GST_BUFFER_OFFSET_NONE) { + /* this should be fine since it should be one flac frame per ogg packet */ + /* note the + 1, as the granpos is the presentation time of the last sample, + whereas the last stop represents the end time of that sample */ + flacdec->segment.last_stop = flacdec->cur_granulepos - samples + 1; + GST_LOG_OBJECT (flacdec, "granulepos = %" G_GINT64_FORMAT ", samples = %u", + flacdec->cur_granulepos, samples); + } + + GST_BUFFER_TIMESTAMP (outbuf) = + gst_util_uint64_scale_int (flacdec->segment.last_stop, GST_SECOND, + frame->header.sample_rate); + + /* get next timestamp to calculate the duration */ + next = gst_util_uint64_scale_int (flacdec->segment.last_stop + samples, + GST_SECOND, frame->header.sample_rate); + + GST_BUFFER_DURATION (outbuf) = next - GST_BUFFER_TIMESTAMP (outbuf); + + if (width == 8) { + gint8 *outbuffer = (gint8 *) GST_BUFFER_DATA (outbuf); + + for (i = 0; i < samples; i++) { + for (j = 0; j < channels; j++) { + *outbuffer++ = (gint8) buffer[j][i]; + } + } + } else if (width == 16) { + gint16 *outbuffer = (gint16 *) GST_BUFFER_DATA (outbuf); + + for (i = 0; i < samples; i++) { + for (j = 0; j < channels; j++) { + *outbuffer++ = (gint16) buffer[j][i]; + } + } + } else if (width == 32) { + gint32 *outbuffer = (gint32 *) GST_BUFFER_DATA (outbuf); + + for (i = 0; i < samples; i++) { + for (j = 0; j < channels; j++) { + *outbuffer++ = (gint32) buffer[j][i]; + } + } + } else { + g_assert_not_reached (); + } + + if (!flacdec->seeking) { + GST_DEBUG_OBJECT (flacdec, "pushing %d samples at offset %" G_GINT64_FORMAT + " (%" GST_TIME_FORMAT " + %" GST_TIME_FORMAT ")", + samples, GST_BUFFER_OFFSET (outbuf), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf))); + + if (flacdec->discont) { + GST_DEBUG_OBJECT (flacdec, "marking discont"); + outbuf = gst_buffer_make_metadata_writable (outbuf); + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + flacdec->discont = FALSE; + } + ret = gst_pad_push (flacdec->srcpad, outbuf); + GST_DEBUG_OBJECT (flacdec, "returned %s", gst_flow_get_name (ret)); + flacdec->segment.last_stop += samples; + } else { + GST_DEBUG_OBJECT (flacdec, + "not pushing %d samples at offset %" G_GINT64_FORMAT + " (in seek)", samples, GST_BUFFER_OFFSET (outbuf)); + gst_buffer_replace (&flacdec->pending, outbuf); + gst_buffer_unref (outbuf); + flacdec->pending_samples = samples; + ret = GST_FLOW_OK; + } + + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (flacdec, "gst_pad_push() returned %s", + gst_flow_get_name (ret)); + } + +done: + + + /* we act on the flow return value later in the loop function, as we don't + * want to mess up the internal decoder state by returning ABORT when the + * error is in fact non-fatal (like a pad in flushing mode) and we want + * to continue later. So just pretend everything's dandy and act later. */ + flacdec->last_flow = ret; + + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +static FLAC__StreamDecoderWriteStatus +gst_flac_dec_write_stream (const FLAC__StreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * const buffer[], void *client_data) +{ + return gst_flac_dec_write (GST_FLAC_DEC (client_data), frame, buffer); +} + +static void +gst_flac_dec_loop (GstPad * sinkpad) +{ + GstFlacDec *flacdec; + FLAC__StreamDecoderState s; + FLAC__StreamDecoderInitStatus is; + + flacdec = GST_FLAC_DEC (GST_OBJECT_PARENT (sinkpad)); + + GST_LOG_OBJECT (flacdec, "entering loop"); + + if (flacdec->eos) { + GST_DEBUG_OBJECT (flacdec, "Seeked after end of file"); + + if (flacdec->close_segment) { + GST_DEBUG_OBJECT (flacdec, "pushing close segment"); + gst_pad_push_event (flacdec->srcpad, flacdec->close_segment); + flacdec->close_segment = NULL; + } + if (flacdec->start_segment) { + GST_DEBUG_OBJECT (flacdec, "pushing start segment"); + gst_pad_push_event (flacdec->srcpad, flacdec->start_segment); + flacdec->start_segment = NULL; + } + + if (flacdec->tags) { + gst_element_found_tags_for_pad (GST_ELEMENT (flacdec), flacdec->srcpad, + flacdec->tags); + flacdec->tags = NULL; + } + + if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) == 0) { + goto eos_and_pause; + } else { + goto segment_done_and_pause; + } + } + + if (flacdec->init) { + GST_DEBUG_OBJECT (flacdec, "initializing new decoder"); + is = FLAC__stream_decoder_init_stream (flacdec->decoder, + gst_flac_dec_read_seekable, gst_flac_dec_seek, gst_flac_dec_tell, + gst_flac_dec_length, gst_flac_dec_eof, gst_flac_dec_write_stream, + gst_flac_dec_metadata_cb, gst_flac_dec_error_cb, flacdec); + if (is != FLAC__STREAM_DECODER_INIT_STATUS_OK) + goto analyze_state; + + /* FLAC__seekable_decoder_process_metadata (flacdec->decoder); */ + flacdec->init = FALSE; + } + + flacdec->cur_granulepos = GST_BUFFER_OFFSET_NONE; + + flacdec->last_flow = GST_FLOW_OK; + + GST_LOG_OBJECT (flacdec, "processing single"); + FLAC__stream_decoder_process_single (flacdec->decoder); + +analyze_state: + + GST_LOG_OBJECT (flacdec, "done processing, checking encoder state"); + s = FLAC__stream_decoder_get_state (flacdec->decoder); + switch (s) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + case FLAC__STREAM_DECODER_READ_METADATA: + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + case FLAC__STREAM_DECODER_READ_FRAME: + { + GST_DEBUG_OBJECT (flacdec, "everything ok"); + + if (flacdec->last_flow < GST_FLOW_UNEXPECTED || + flacdec->last_flow == GST_FLOW_NOT_LINKED) { + GST_ELEMENT_ERROR (flacdec, STREAM, FAILED, + (_("Internal data stream error.")), + ("stream stopped, reason %s", + gst_flow_get_name (flacdec->last_flow))); + goto eos_and_pause; + } else if (flacdec->last_flow == GST_FLOW_UNEXPECTED) { + goto eos_and_pause; + } else if (flacdec->last_flow != GST_FLOW_OK) { + goto pause; + } + + /* check if we're at the end of a configured segment */ + if (flacdec->segment.stop != -1 && + flacdec->segment.last_stop > 0 && + flacdec->segment.last_stop >= flacdec->segment.stop) { + GST_DEBUG_OBJECT (flacdec, "reached end of the configured segment"); + + if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) == 0) { + goto eos_and_pause; + } else { + goto segment_done_and_pause; + } + + g_assert_not_reached (); + } + + return; + } + + case FLAC__STREAM_DECODER_END_OF_STREAM:{ + GST_DEBUG_OBJECT (flacdec, "EOS"); + FLAC__stream_decoder_reset (flacdec->decoder); + + if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) != 0) { + if (flacdec->segment.duration > 0) { + flacdec->segment.stop = flacdec->segment.duration; + } else { + flacdec->segment.stop = flacdec->segment.last_stop; + } + goto segment_done_and_pause; + } + + goto eos_and_pause; + } + + /* gst_flac_dec_read_seekable() returned ABORTED */ + case FLAC__STREAM_DECODER_ABORTED: + { + GST_INFO_OBJECT (flacdec, "read aborted: last pull_range flow = %s", + gst_flow_get_name (flacdec->pull_flow)); + if (flacdec->pull_flow == GST_FLOW_WRONG_STATE) { + /* it seems we need to flush the decoder here to reset the decoder + * state after the abort for FLAC__stream_decoder_seek_absolute() + * to work properly */ + GST_DEBUG_OBJECT (flacdec, "flushing decoder to reset decoder state"); + FLAC__stream_decoder_flush (flacdec->decoder); + goto pause; + } + /* fall through */ + } + case FLAC__STREAM_DECODER_OGG_ERROR: + case FLAC__STREAM_DECODER_SEEK_ERROR: + case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR: + case FLAC__STREAM_DECODER_UNINITIALIZED: + default:{ + /* fixme: this error sucks -- should try to figure out when/if an more + specific error was already sent via the callback */ + GST_ELEMENT_ERROR (flacdec, STREAM, DECODE, (NULL), + ("%s", FLAC__StreamDecoderStateString[s])); + goto eos_and_pause; + } + } + + return; + +segment_done_and_pause: + { + gint64 stop_time; + + stop_time = gst_util_uint64_scale_int (flacdec->segment.stop, + GST_SECOND, flacdec->sample_rate); + + GST_DEBUG_OBJECT (flacdec, "posting SEGMENT_DONE message, stop time %" + GST_TIME_FORMAT, GST_TIME_ARGS (stop_time)); + + gst_element_post_message (GST_ELEMENT (flacdec), + gst_message_new_segment_done (GST_OBJECT (flacdec), + GST_FORMAT_TIME, stop_time)); + + goto pause; + } +eos_and_pause: + { + GST_DEBUG_OBJECT (flacdec, "sending EOS event"); + flacdec->running = FALSE; + gst_pad_push_event (flacdec->srcpad, gst_event_new_eos ()); + /* fall through to pause */ + } +pause: + { + GST_DEBUG_OBJECT (flacdec, "pausing"); + gst_pad_pause_task (sinkpad); + return; + } +} + +static gboolean +gst_flac_dec_sink_event (GstPad * pad, GstEvent * event) +{ + GstFlacDec *dec; + gboolean res; + + dec = GST_FLAC_DEC (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP:{ + if (dec->init == FALSE) { + FLAC__stream_decoder_flush (dec->decoder); + gst_adapter_clear (dec->adapter); + } + res = gst_pad_push_event (dec->srcpad, event); + break; + } + case GST_EVENT_NEWSEGMENT:{ + GstFormat fmt; + gboolean update; + gdouble rate, applied_rate; + gint64 cur, stop, time; + + gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, + &fmt, &cur, &stop, &time); + + if (fmt == GST_FORMAT_TIME) { + GstFormat dformat = GST_FORMAT_DEFAULT; + + GST_DEBUG_OBJECT (dec, "newsegment event in TIME format => framed"); + dec->framed = TRUE; + res = gst_pad_push_event (dec->srcpad, event); + + /* this won't work for the first newsegment event though ... */ + if (gst_flac_dec_convert_src (dec->srcpad, GST_FORMAT_TIME, cur, + &dformat, &cur) && cur != -1 && + gst_flac_dec_convert_src (dec->srcpad, GST_FORMAT_TIME, stop, + &dformat, &stop) && stop != -1) { + gst_segment_set_newsegment_full (&dec->segment, update, rate, + applied_rate, dformat, cur, stop, time); + GST_DEBUG_OBJECT (dec, "segment %" GST_SEGMENT_FORMAT, &dec->segment); + } else { + GST_WARNING_OBJECT (dec, "couldn't convert time => samples"); + } + } else if (fmt == GST_FORMAT_BYTES || TRUE) { + GST_DEBUG_OBJECT (dec, "newsegment event in %s format => not framed", + gst_format_get_name (fmt)); + dec->framed = FALSE; + + /* prepare generic newsegment event, for some reason our metadata + * callback where we usually set this up is not being called in + * push mode */ + if (dec->start_segment) + gst_event_unref (dec->start_segment); + dec->start_segment = gst_event_new_new_segment (FALSE, 1.0, + GST_FORMAT_TIME, 0, -1, 0); + + gst_event_unref (event); + res = TRUE; + } + break; + } + case GST_EVENT_EOS:{ + GST_LOG_OBJECT (dec, "EOS, with %u bytes available in adapter", + gst_adapter_available (dec->adapter)); + if (dec->init == FALSE) { + if (gst_adapter_available (dec->adapter) > 0) { + FLAC__stream_decoder_process_until_end_of_stream (dec->decoder); + } + FLAC__stream_decoder_flush (dec->decoder); + } + gst_adapter_clear (dec->adapter); + res = gst_pad_push_event (dec->srcpad, event); + break; + } + default: + res = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (dec); + + return res; +} + +static gboolean +gst_flac_dec_chain_parse_headers (GstFlacDec * dec) +{ + guint8 marker[4]; + guint avail, off; + + avail = gst_adapter_available (dec->adapter); + if (avail < 4) + return FALSE; + + gst_adapter_copy (dec->adapter, marker, 0, 4); + if (strncmp ((const gchar *) marker, "fLaC", 4) != 0) { + GST_ERROR_OBJECT (dec, "Unexpected header, expected fLaC header"); + return TRUE; /* abort header parsing */ + } + + GST_DEBUG_OBJECT (dec, "fLaC header : len 4 @ %7u", 0); + + off = 4; + while (avail > (off + 1 + 3)) { + gboolean is_last; + guint8 mb_hdr[4]; + guint len, block_type; + + gst_adapter_copy (dec->adapter, mb_hdr, off, 4); + + is_last = ((mb_hdr[0] & 0x80) == 0x80); + block_type = mb_hdr[0] & 0x7f; + len = GST_READ_UINT24_BE (mb_hdr + 1); + GST_DEBUG_OBJECT (dec, "Metadata block type %u: len %7u + 4 @ %7u%s", + block_type, len, off, (is_last) ? " (last)" : ""); + off += 4 + len; + + if (is_last) + break; + + if (off >= avail) { + GST_LOG_OBJECT (dec, "Need more data: next offset %u > avail %u", off, + avail); + return FALSE; + } + } + + /* want metadata blocks plus at least one frame */ + return (off + FLAC__MAX_BLOCK_SIZE >= avail); +} + +static GstFlowReturn +gst_flac_dec_chain (GstPad * pad, GstBuffer * buf) +{ + FLAC__StreamDecoderInitStatus s; + GstFlacDec *dec; + gboolean got_audio_frame; + + dec = GST_FLAC_DEC (GST_PAD_PARENT (pad)); + + GST_LOG_OBJECT (dec, + "buffer with ts=%" GST_TIME_FORMAT ", offset=%" G_GINT64_FORMAT + ", end_offset=%" G_GINT64_FORMAT ", size=%u", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_BUFFER_OFFSET (buf), + GST_BUFFER_OFFSET_END (buf), GST_BUFFER_SIZE (buf)); + + if (dec->init) { + GST_DEBUG_OBJECT (dec, "initializing decoder"); + s = FLAC__stream_decoder_init_stream (dec->decoder, + gst_flac_dec_read_stream, NULL, NULL, NULL, NULL, + gst_flac_dec_write_stream, gst_flac_dec_metadata_cb, + gst_flac_dec_error_cb, dec); + if (s != FLAC__STREAM_DECODER_INIT_STATUS_OK) { + GST_ELEMENT_ERROR (GST_ELEMENT (dec), LIBRARY, INIT, (NULL), (NULL)); + return GST_FLOW_ERROR; + } + GST_DEBUG_OBJECT (dec, "initialized (framed=%d)", dec->framed); + dec->init = FALSE; + } else if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) { + /* Clear the adapter and the decoder */ + gst_adapter_clear (dec->adapter); + FLAC__stream_decoder_flush (dec->decoder); + } + + if (dec->framed) { + gint64 unused; + + /* check if this is a flac audio frame (rather than a header or junk) */ + got_audio_frame = gst_flac_dec_scan_got_frame (dec, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf), &unused); + + /* oggdemux will set granulepos in OFFSET_END instead of timestamp */ + if (G_LIKELY (got_audio_frame)) { + /* old oggdemux for now */ + if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + dec->cur_granulepos = GST_BUFFER_OFFSET_END (buf); + } else { + GstFormat dformat = GST_FORMAT_DEFAULT; + + /* upstream (e.g. demuxer) presents us time, + * convert to default samples */ + gst_flac_dec_convert_src (dec->srcpad, GST_FORMAT_TIME, + GST_BUFFER_TIMESTAMP (buf), &dformat, &dec->segment.last_stop); + dec->cur_granulepos = GST_BUFFER_OFFSET_NONE; + } + } + } else { + dec->cur_granulepos = GST_BUFFER_OFFSET_NONE; + got_audio_frame = TRUE; + } + + gst_adapter_push (dec->adapter, buf); + buf = NULL; + + dec->last_flow = GST_FLOW_OK; + + if (!dec->framed) { + if (G_UNLIKELY (!dec->got_headers)) { + if (!gst_flac_dec_chain_parse_headers (dec)) { + GST_LOG_OBJECT (dec, "don't have metadata blocks yet, need more data"); + goto out; + } + GST_INFO_OBJECT (dec, "have all metadata blocks now"); + dec->got_headers = TRUE; + } + + /* wait until we have at least 64kB because libflac's StreamDecoder + * interface is a bit dumb it seems (if we don't have as much data as + * it wants it will call our read callback repeatedly and the only + * way to stop that is to error out or EOS, which will affect the + * decoder state). And the decoder seems to always ask for MAX_BLOCK_SIZE + * bytes rather than the max. block size from the header). Requiring + * MAX_BLOCK_SIZE bytes here should make sure it always gets enough data + * to decode at least one block */ + while (gst_adapter_available (dec->adapter) >= FLAC__MAX_BLOCK_SIZE && + dec->last_flow == GST_FLOW_OK) { + GST_LOG_OBJECT (dec, "%u bytes available", + gst_adapter_available (dec->adapter)); + if (!FLAC__stream_decoder_process_single (dec->decoder)) { + GST_DEBUG_OBJECT (dec, "process_single failed"); + break; + } + + if (FLAC__stream_decoder_get_state (dec->decoder) == + FLAC__STREAM_DECODER_ABORTED) { + GST_WARNING_OBJECT (dec, "Read callback caused internal abort"); + dec->last_flow = GST_FLOW_ERROR; + break; + } + } + } else if (dec->framed && got_audio_frame) { + /* framed - there should always be enough data to decode something */ + GST_LOG_OBJECT (dec, "%u bytes available", + gst_adapter_available (dec->adapter)); + if (G_UNLIKELY (!dec->got_headers)) { + /* The first time we get audio data, we know we got all the headers. + * We then loop until all the metadata is processed, then do an extra + * "process_single" step for the audio frame. */ + GST_DEBUG_OBJECT (dec, + "First audio frame, ensuring all metadata is processed"); + if (!FLAC__stream_decoder_process_until_end_of_metadata (dec->decoder)) { + GST_DEBUG_OBJECT (dec, "process_until_end_of_metadata failed"); + } + GST_DEBUG_OBJECT (dec, + "All metadata is now processed, reading to process audio data"); + dec->got_headers = TRUE; + } + if (!FLAC__stream_decoder_process_single (dec->decoder)) { + GST_DEBUG_OBJECT (dec, "process_single failed"); + } + } else { + GST_DEBUG_OBJECT (dec, "don't have all headers yet"); + } + +out: + + return dec->last_flow; +} + +static gboolean +gst_flac_dec_convert_sink (GstFlacDec * dec, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value) +{ + gboolean res = TRUE; + + if (dec->width == 0 || dec->channels == 0 || dec->sample_rate == 0) { + /* no frame decoded yet */ + GST_DEBUG_OBJECT (dec, "cannot convert: not set up yet"); + return FALSE; + } + + switch (src_format) { + case GST_FORMAT_BYTES:{ + res = FALSE; + break; + } + case GST_FORMAT_DEFAULT: + switch (*dest_format) { + case GST_FORMAT_BYTES: + res = FALSE; + break; + case GST_FORMAT_TIME: + /* granulepos = sample */ + *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, + dec->sample_rate); + break; + default: + res = FALSE; + break; + } + break; + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_BYTES: + res = FALSE; + break; + case GST_FORMAT_DEFAULT: + *dest_value = gst_util_uint64_scale_int (src_value, + dec->sample_rate, GST_SECOND); + break; + default: + res = FALSE; + break; + } + break; + default: + res = FALSE; + break; + } + return res; +} + +static const GstQueryType * +gst_flac_dec_get_sink_query_types (GstPad * pad) +{ + static const GstQueryType types[] = { + GST_QUERY_CONVERT, + 0, + }; + + return types; +} + +static gboolean +gst_flac_dec_sink_query (GstPad * pad, GstQuery * query) +{ + GstFlacDec *dec; + gboolean res = FALSE; + + dec = GST_FLAC_DEC (gst_pad_get_parent (pad)); + + GST_LOG_OBJECT (dec, "%s query", GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONVERT:{ + GstFormat src_fmt, dest_fmt; + + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, NULL); + + res = gst_flac_dec_convert_sink (dec, src_fmt, src_val, &dest_fmt, + &dest_val); + + if (res) { + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + } + GST_LOG_OBJECT (dec, "conversion %s", (res) ? "ok" : "FAILED"); + break; + } + + default:{ + res = gst_pad_query_default (pad, query); + break; + } + } + + gst_object_unref (dec); + return res; +} + +static gboolean +gst_flac_dec_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) +{ + GstFlacDec *flacdec = GST_FLAC_DEC (GST_PAD_PARENT (pad)); + gboolean res = TRUE; + guint bytes_per_sample; + guint scale = 1; + + if (flacdec->width == 0 || flacdec->channels == 0 || + flacdec->sample_rate == 0) { + /* no frame decoded yet */ + GST_DEBUG_OBJECT (flacdec, "cannot convert: not set up yet"); + return FALSE; + } + + bytes_per_sample = flacdec->channels * (flacdec->width / 8); + + switch (src_format) { + case GST_FORMAT_BYTES:{ + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_value = + gst_util_uint64_scale_int (src_value, 1, bytes_per_sample); + break; + case GST_FORMAT_TIME: + { + gint byterate = bytes_per_sample * flacdec->sample_rate; + + *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, + byterate); + break; + } + default: + res = FALSE; + } + break; + } + case GST_FORMAT_DEFAULT: + switch (*dest_format) { + case GST_FORMAT_BYTES: + *dest_value = src_value * bytes_per_sample; + break; + case GST_FORMAT_TIME: + *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, + flacdec->sample_rate); + break; + default: + res = FALSE; + } + break; + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_BYTES: + scale = bytes_per_sample; + case GST_FORMAT_DEFAULT: + *dest_value = gst_util_uint64_scale_int_round (src_value, + scale * flacdec->sample_rate, GST_SECOND); + break; + default: + res = FALSE; + } + break; + default: + res = FALSE; + } + return res; +} + +static const GstQueryType * +gst_flac_dec_get_src_query_types (GstPad * pad) +{ + static const GstQueryType types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_CONVERT, + GST_QUERY_SEEKING, + 0, + }; + + return types; +} + +static gboolean +gst_flac_dec_src_query (GstPad * pad, GstQuery * query) +{ + GstFlacDec *flacdec; + gboolean res = TRUE; + GstPad *peer; + + flacdec = GST_FLAC_DEC (gst_pad_get_parent (pad)); + peer = gst_pad_get_peer (flacdec->sinkpad); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION:{ + GstFormat fmt; + gint64 pos; + + gst_query_parse_position (query, &fmt, NULL); + + /* there might be a demuxer in front of us who can handle this */ + if (fmt == GST_FORMAT_TIME && (res = gst_pad_query (peer, query))) + break; + + if (fmt != GST_FORMAT_DEFAULT) { + if (!gst_flac_dec_convert_src (flacdec->srcpad, GST_FORMAT_DEFAULT, + flacdec->segment.last_stop, &fmt, &pos)) { + GST_DEBUG_OBJECT (flacdec, "failed to convert position into %s " + "format", gst_format_get_name (fmt)); + res = FALSE; + goto done; + } + } else { + pos = flacdec->segment.last_stop; + } + + gst_query_set_position (query, fmt, pos); + + GST_DEBUG_OBJECT (flacdec, "returning position %" G_GUINT64_FORMAT + " (format: %s)", pos, gst_format_get_name (fmt)); + + res = TRUE; + break; + } + + case GST_QUERY_DURATION:{ + GstFormat fmt; + gint64 len; + + gst_query_parse_duration (query, &fmt, NULL); + + /* try any demuxers or parsers before us first */ + if ((fmt == GST_FORMAT_TIME || fmt == GST_FORMAT_DEFAULT) && + peer != NULL && gst_pad_query (peer, query)) { + gst_query_parse_duration (query, NULL, &len); + GST_DEBUG_OBJECT (flacdec, "peer returned duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (len)); + res = TRUE; + goto done; + } + + if (flacdec->segment.duration == 0 || flacdec->segment.duration == -1) { + GST_DEBUG_OBJECT (flacdec, "duration not known yet"); + res = FALSE; + goto done; + } + + /* convert total number of samples to request format */ + if (fmt != GST_FORMAT_DEFAULT) { + if (!gst_flac_dec_convert_src (flacdec->srcpad, GST_FORMAT_DEFAULT, + flacdec->segment.duration, &fmt, &len)) { + GST_DEBUG_OBJECT (flacdec, "failed to convert duration into %s " + "format", gst_format_get_name (fmt)); + res = FALSE; + goto done; + } + } else { + len = flacdec->segment.duration; + } + + gst_query_set_duration (query, fmt, len); + + GST_DEBUG_OBJECT (flacdec, "returning duration %" G_GUINT64_FORMAT + " (format: %s)", len, gst_format_get_name (fmt)); + + res = TRUE; + break; + } + + case GST_QUERY_CONVERT:{ + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, NULL); + + res = gst_flac_dec_convert_src (pad, src_fmt, src_val, &dest_fmt, + &dest_val); + + if (res) { + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + } + + break; + } + case GST_QUERY_SEEKING:{ + GstFormat fmt; + gboolean seekable = FALSE; + + res = TRUE; + /* If upstream can handle the query we're done */ + seekable = gst_pad_peer_query (flacdec->sinkpad, query); + if (seekable) + gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL); + if (seekable) + goto done; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if ((fmt != GST_FORMAT_TIME && fmt != GST_FORMAT_DEFAULT) || + flacdec->streaming) { + gst_query_set_seeking (query, fmt, FALSE, -1, -1); + } else { + gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1); + } + break; + } + + default:{ + res = gst_pad_query_default (pad, query); + break; + } + } + +done: + + if (peer) + gst_object_unref (peer); + + gst_object_unref (flacdec); + + return res; +} + +static gboolean +gst_flac_dec_handle_seek_event (GstFlacDec * flacdec, GstEvent * event) +{ + FLAC__bool seek_ok; + GstSeekFlags seek_flags; + GstSeekType start_type; + GstSeekType stop_type; + GstSegment segment; + GstFormat seek_format; + gboolean only_update = FALSE; + gboolean flush; + gdouble rate; + gint64 start, last_stop; + gint64 stop; + + if (flacdec->streaming) { + GST_DEBUG_OBJECT (flacdec, "seeking in streaming mode not implemented yet"); + return FALSE; + } + + gst_event_parse_seek (event, &rate, &seek_format, &seek_flags, &start_type, + &start, &stop_type, &stop); + + if (seek_format != GST_FORMAT_DEFAULT && seek_format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (flacdec, + "seeking is only supported in TIME or DEFAULT format"); + return FALSE; + } + + if (rate < 0.0) { + GST_DEBUG_OBJECT (flacdec, + "only forward playback supported, rate %f not allowed", rate); + return FALSE; + } + + if (seek_format != GST_FORMAT_DEFAULT) { + GstFormat target_format = GST_FORMAT_DEFAULT; + + if (start_type != GST_SEEK_TYPE_NONE && + !gst_flac_dec_convert_src (flacdec->srcpad, seek_format, start, + &target_format, &start)) { + GST_DEBUG_OBJECT (flacdec, "failed to convert start to DEFAULT format"); + return FALSE; + } + + if (stop_type != GST_SEEK_TYPE_NONE && + !gst_flac_dec_convert_src (flacdec->srcpad, seek_format, stop, + &target_format, &stop)) { + GST_DEBUG_OBJECT (flacdec, "failed to convert stop to DEFAULT format"); + return FALSE; + } + } + + /* Check if we seeked after the end of file */ + if (start_type != GST_SEEK_TYPE_NONE && flacdec->segment.duration > 0 && + start >= flacdec->segment.duration) { + flacdec->eos = TRUE; + } else { + flacdec->eos = FALSE; + } + + flush = ((seek_flags & GST_SEEK_FLAG_FLUSH) == GST_SEEK_FLAG_FLUSH); + + if (flush) { + /* flushing seek, clear the pipeline of stuff, we need a newsegment after + * this. */ + GST_DEBUG_OBJECT (flacdec, "flushing"); + gst_pad_push_event (flacdec->sinkpad, gst_event_new_flush_start ()); + gst_pad_push_event (flacdec->srcpad, gst_event_new_flush_start ()); + } else { + /* non flushing seek, pause the task */ + GST_DEBUG_OBJECT (flacdec, "stopping task"); + gst_pad_stop_task (flacdec->sinkpad); + } + + /* acquire the stream lock, this either happens when the streaming thread + * stopped because of the flush or when the task is paused after the loop + * function finished an iteration, which can never happen when it's blocked + * downstream in PAUSED, for example */ + GST_PAD_STREAM_LOCK (flacdec->sinkpad); + + /* start seek with clear state to avoid seeking thread pushing segments/data. + * Note current state may have some pending, + * e.g. multi-sink seek leads to immediate subsequent seek events */ + if (flacdec->start_segment) { + gst_event_unref (flacdec->start_segment); + flacdec->start_segment = NULL; + } + gst_buffer_replace (&flacdec->pending, NULL); + flacdec->pending_samples = 0; + + /* save a segment copy until we know the seek worked. The idea is that + * when the seek fails, we want to restore with what we were doing. */ + segment = flacdec->segment; + + /* update the segment with the seek values, last_stop will contain the new + * position we should seek to */ + gst_segment_set_seek (&flacdec->segment, rate, GST_FORMAT_DEFAULT, + seek_flags, start_type, start, stop_type, stop, &only_update); + + GST_DEBUG_OBJECT (flacdec, + "configured segment: [%" G_GINT64_FORMAT "-%" G_GINT64_FORMAT + "] = [%" GST_TIME_FORMAT "-%" GST_TIME_FORMAT "]", + flacdec->segment.start, flacdec->segment.stop, + GST_TIME_ARGS (flacdec->segment.start * GST_SECOND / + flacdec->sample_rate), + GST_TIME_ARGS (flacdec->segment.stop * GST_SECOND / + flacdec->sample_rate)); + + GST_DEBUG_OBJECT (flacdec, "performing seek to sample %" G_GINT64_FORMAT, + flacdec->segment.last_stop); + + /* flush sinkpad again because we need to pull and push buffers while doing + * the seek */ + if (flush) { + GST_DEBUG_OBJECT (flacdec, "flushing stop"); + gst_pad_push_event (flacdec->sinkpad, gst_event_new_flush_stop ()); + gst_pad_push_event (flacdec->srcpad, gst_event_new_flush_stop ()); + } + + /* mark ourselves as seeking because the above lines will trigger some + * callbacks that need to behave differently when seeking */ + flacdec->seeking = TRUE; + + if (!flacdec->eos) { + GST_LOG_OBJECT (flacdec, "calling seek_absolute"); + seek_ok = FLAC__stream_decoder_seek_absolute (flacdec->decoder, + flacdec->segment.last_stop); + GST_LOG_OBJECT (flacdec, "done with seek_absolute, seek_ok=%d", seek_ok); + } else { + GST_LOG_OBJECT (flacdec, "not seeking, seeked after end of file"); + seek_ok = TRUE; + } + + flacdec->seeking = FALSE; + + GST_DEBUG_OBJECT (flacdec, "performed seek to sample %" G_GINT64_FORMAT, + flacdec->segment.last_stop); + + if (!seek_ok) { + GST_WARNING_OBJECT (flacdec, "seek failed"); + /* seek failed, restore the segment and start streaming again with + * the previous segment values */ + flacdec->segment = segment; + } else if (!flush && flacdec->running) { + /* we are running the current segment and doing a non-flushing seek, + * close the segment first based on the last_stop. */ + GST_DEBUG_OBJECT (flacdec, "closing running segment %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, segment.start, segment.last_stop); + + /* convert the old segment values to time to close the old segment */ + start = gst_util_uint64_scale_int (segment.start, GST_SECOND, + flacdec->sample_rate); + last_stop = + gst_util_uint64_scale_int (segment.last_stop, GST_SECOND, + flacdec->sample_rate); + + /* queue the segment for sending in the stream thread, start and time are + * always the same. */ + if (flacdec->close_segment) + gst_event_unref (flacdec->close_segment); + flacdec->close_segment = + gst_event_new_new_segment_full (TRUE, + segment.rate, segment.applied_rate, GST_FORMAT_TIME, + start, last_stop, start); + } + + if (seek_ok) { + /* seek succeeded, flacdec->segment contains the new positions */ + GST_DEBUG_OBJECT (flacdec, "seek successful"); + } + + /* convert the (new) segment values to time, we will need them to generate the + * new segment events. */ + start = gst_util_uint64_scale_int (flacdec->segment.start, GST_SECOND, + flacdec->sample_rate); + last_stop = gst_util_uint64_scale_int (flacdec->segment.last_stop, GST_SECOND, + flacdec->sample_rate); + + /* for deriving a stop position for the playback segment from the seek + * segment, we must take the duration when the stop is not set */ + if (flacdec->segment.stop != -1) + stop = gst_util_uint64_scale_int (flacdec->segment.stop, GST_SECOND, + flacdec->sample_rate); + else + stop = gst_util_uint64_scale_int (flacdec->segment.duration, GST_SECOND, + flacdec->sample_rate); + + /* notify start of new segment when we were asked to do so. */ + if (flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) { + /* last_stop contains the position we start from */ + gst_element_post_message (GST_ELEMENT (flacdec), + gst_message_new_segment_start (GST_OBJECT (flacdec), + GST_FORMAT_TIME, last_stop)); + } + + /* if the seek was ok or (when it failed) we are flushing, we need to send out + * a new segment. If we did not flush and the seek failed, we simply do + * nothing here and continue where we were. */ + if (seek_ok || flush) { + GST_DEBUG_OBJECT (flacdec, "Creating newsegment from %" GST_TIME_FORMAT + " to %" GST_TIME_FORMAT, GST_TIME_ARGS (last_stop), + GST_TIME_ARGS (stop)); + /* now replace the old segment so that we send it in the stream thread the + * next time it is scheduled. */ + if (flacdec->start_segment) + gst_event_unref (flacdec->start_segment); + flacdec->start_segment = + gst_event_new_new_segment_full (FALSE, + flacdec->segment.rate, flacdec->segment.applied_rate, GST_FORMAT_TIME, + last_stop, stop, last_stop); + } + + /* we'll generate a discont on the next buffer */ + flacdec->discont = TRUE; + /* the task is running again now */ + flacdec->running = TRUE; + gst_pad_start_task (flacdec->sinkpad, + (GstTaskFunction) gst_flac_dec_loop, flacdec->sinkpad); + + GST_PAD_STREAM_UNLOCK (flacdec->sinkpad); + + return seek_ok; +} + +static gboolean +gst_flac_dec_src_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstFlacDec *flacdec; + + flacdec = GST_FLAC_DEC (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK:{ + GST_DEBUG_OBJECT (flacdec, "received seek event %p", event); + /* first, see if we're before a demuxer that + * might handle the seek for us */ + gst_event_ref (event); + res = gst_pad_event_default (pad, event); + /* if not, try to handle it ourselves */ + if (!res) { + GST_DEBUG_OBJECT (flacdec, "default failed, handling ourselves"); + res = gst_flac_dec_handle_seek_event (flacdec, event); + } + gst_event_unref (event); + break; + } + default: + res = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (flacdec); + + return res; +} + +static gboolean +gst_flac_dec_sink_activate (GstPad * sinkpad) +{ + if (gst_pad_check_pull_range (sinkpad)) + return gst_pad_activate_pull (sinkpad, TRUE); + + return gst_pad_activate_push (sinkpad, TRUE); +} + +static gboolean +gst_flac_dec_sink_activate_push (GstPad * sinkpad, gboolean active) +{ + GstFlacDec *dec = GST_FLAC_DEC (GST_OBJECT_PARENT (sinkpad)); + + if (active) { + gst_flac_dec_setup_decoder (dec); + dec->streaming = TRUE; + dec->got_headers = FALSE; + } + return TRUE; +} + +static gboolean +gst_flac_dec_sink_activate_pull (GstPad * sinkpad, gboolean active) +{ + gboolean res; + + if (active) { + GstFlacDec *flacdec; + + flacdec = GST_FLAC_DEC (GST_PAD_PARENT (sinkpad)); + + flacdec->offset = 0; + gst_flac_dec_setup_decoder (flacdec); + flacdec->running = TRUE; + flacdec->streaming = FALSE; + + res = gst_pad_start_task (sinkpad, (GstTaskFunction) gst_flac_dec_loop, + sinkpad); + } else { + res = gst_pad_stop_task (sinkpad); + } + return res; +} + +static GstStateChangeReturn +gst_flac_dec_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstFlacDec *flacdec = GST_FLAC_DEC (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + flacdec->eos = FALSE; + flacdec->seeking = FALSE; + flacdec->channels = 0; + flacdec->depth = 0; + flacdec->width = 0; + flacdec->sample_rate = 0; + gst_segment_init (&flacdec->segment, GST_FORMAT_DEFAULT); + 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_segment_init (&flacdec->segment, GST_FORMAT_UNDEFINED); + gst_flac_dec_reset_decoders (flacdec); + break; + default: + break; + } + + return ret; +} diff --git a/ext/flac/gstflacdec.h b/ext/flac/gstflacdec.h new file mode 100644 index 0000000..835bdbd --- /dev/null +++ b/ext/flac/gstflacdec.h @@ -0,0 +1,101 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_FLAC_DEC_H__ +#define __GST_FLAC_DEC_H__ + + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_FLAC_DEC gst_flac_dec_get_type() +#define GST_FLAC_DEC(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, GST_TYPE_FLAC_DEC, GstFlacDec) +#define GST_FLAC_DEC_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, GST_TYPE_FLAC_DEC, GstFlacDecClass) +#define GST_IS_FLAC_DEC(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, GST_TYPE_FLAC_DEC) +#define GST_IS_FLAC_DEC_CLASS(klass) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_FLAC_DEC) + +typedef struct _GstFlacDec GstFlacDec; +typedef struct _GstFlacDecClass GstFlacDecClass; + +struct _GstFlacDec { + GstElement element; + + /* < private > */ + + FLAC__StreamDecoder *decoder; + GstAdapter *adapter; + gboolean framed; + gboolean streaming; + + gboolean got_headers; /* if we've parsed the headers (unframed push mode only) */ + + GstPad *sinkpad; + GstPad *srcpad; + + gboolean init; + + guint64 offset; /* current byte offset of input */ + + gboolean seeking; /* set to TRUE while seeking to make sure we + * don't push any buffers in the write callback + * until we are actually at the new position */ + + gboolean eos; /* set to TRUE if seeked after the end of file */ + + GstSegment segment; /* the currently configured segment, in + * samples/audio frames (DEFAULT format) */ + gboolean running; + gboolean discont; + GstBuffer *pending; /* pending buffer, produced in seek */ + guint pending_samples; + GstEvent *close_segment; + GstEvent *start_segment; + GstTagList *tags; + + GstFlowReturn pull_flow; /* last flow from pull_range */ /* STREAM_LOCK */ + + GstFlowReturn last_flow; /* the last flow return received from either + * gst_pad_push or gst_pad_buffer_alloc */ + + gint channels; + gint depth; + gint width; + gint sample_rate; + + /* from the stream info, needed for scanning */ + guint16 min_blocksize; + guint16 max_blocksize; + + gint64 cur_granulepos; /* only used in framed mode (flac-in-ogg) */ +}; + +struct _GstFlacDecClass { + GstElementClass parent_class; +}; + +GType gst_flac_dec_get_type (void); + +G_END_DECLS + +#endif /* __GST_FLAC_DEC_H__ */ diff --git a/ext/flac/gstflacenc.c b/ext/flac/gstflacenc.c new file mode 100644 index 0000000..6a7e1c0 --- /dev/null +++ b/ext/flac/gstflacenc.c @@ -0,0 +1,1399 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-flacenc + * @see_also: #GstFlacDec + * + * flacenc encodes FLAC streams. + * FLAC + * is a Free Lossless Audio Codec. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc num-buffers=100 ! flacenc ! filesink location=beep.flac + * ]| + * + */ + +/* TODO: - We currently don't handle discontinuities in the stream in a useful + * way and instead rely on the developer plugging in audiorate if + * the stream contains discontinuities. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include + +#include +#include +#include +#include +#include + +/* Taken from http://flac.sourceforge.net/format.html#frame_header */ +static const GstAudioChannelPosition channel_positions[8][8] = { + {GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}, + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, + /* FIXME: 7/8 channel layouts are not defined in the FLAC specs */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT} +}; + +#define FLAC_SINK_CAPS \ + "audio/x-raw-int, " \ + "endianness = (int) BYTE_ORDER, " \ + "signed = (boolean) TRUE, " \ + "width = (int) 8, " \ + "depth = (int) 8, " \ + "rate = (int) [ 1, 655350 ], " \ + "channels = (int) [ 1, 8 ]; " \ + "audio/x-raw-int, " \ + "endianness = (int) BYTE_ORDER, " \ + "signed = (boolean) TRUE, " \ + "width = (int) 16, " \ + "depth = (int) { 12, 16 }, " \ + "rate = (int) [ 1, 655350 ], " \ + "channels = (int) [ 1, 8 ]; " \ + "audio/x-raw-int, " \ + "endianness = (int) BYTE_ORDER, " \ + "signed = (boolean) TRUE, " \ + "width = (int) 32, " \ + "depth = (int) { 20, 24 }, " \ + "rate = (int) [ 1, 655350 ], " \ + "channels = (int) [ 1, 8 ]" + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-flac") + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (FLAC_SINK_CAPS) + ); + +enum +{ + PROP_0, + PROP_QUALITY, + PROP_STREAMABLE_SUBSET, + PROP_MID_SIDE_STEREO, + PROP_LOOSE_MID_SIDE_STEREO, + PROP_BLOCKSIZE, + PROP_MAX_LPC_ORDER, + PROP_QLP_COEFF_PRECISION, + PROP_QLP_COEFF_PREC_SEARCH, + PROP_ESCAPE_CODING, + PROP_EXHAUSTIVE_MODEL_SEARCH, + PROP_MIN_RESIDUAL_PARTITION_ORDER, + PROP_MAX_RESIDUAL_PARTITION_ORDER, + PROP_RICE_PARAMETER_SEARCH_DIST, + PROP_PADDING, + PROP_SEEKPOINTS +}; + +GST_DEBUG_CATEGORY_STATIC (flacenc_debug); +#define GST_CAT_DEFAULT flacenc_debug + + +#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 (GstFlacEnc, gst_flac_enc, GstAudioEncoder, + GST_TYPE_AUDIO_ENCODER, _do_init); + +static gboolean gst_flac_enc_start (GstAudioEncoder * enc); +static gboolean gst_flac_enc_stop (GstAudioEncoder * enc); +static gboolean gst_flac_enc_set_format (GstAudioEncoder * enc, + GstAudioInfo * info); +static GstFlowReturn gst_flac_enc_handle_frame (GstAudioEncoder * enc, + GstBuffer * in_buf); +static GstCaps *gst_flac_enc_getcaps (GstAudioEncoder * enc); +static gboolean gst_flac_enc_sink_event (GstAudioEncoder * enc, + GstEvent * event); + +static void gst_flac_enc_finalize (GObject * object); + +static gboolean gst_flac_enc_update_quality (GstFlacEnc * flacenc, + gint quality); +static void gst_flac_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_flac_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static FLAC__StreamEncoderWriteStatus +gst_flac_enc_write_callback (const FLAC__StreamEncoder * encoder, + const FLAC__byte buffer[], size_t bytes, + unsigned samples, unsigned current_frame, void *client_data); +static FLAC__StreamEncoderSeekStatus +gst_flac_enc_seek_callback (const FLAC__StreamEncoder * encoder, + FLAC__uint64 absolute_byte_offset, void *client_data); +static FLAC__StreamEncoderTellStatus +gst_flac_enc_tell_callback (const FLAC__StreamEncoder * encoder, + FLAC__uint64 * absolute_byte_offset, void *client_data); + +typedef struct +{ + gboolean exhaustive_model_search; + gboolean escape_coding; + gboolean mid_side; + gboolean loose_mid_side; + guint qlp_coeff_precision; + gboolean qlp_coeff_prec_search; + guint min_residual_partition_order; + guint max_residual_partition_order; + guint rice_parameter_search_dist; + guint max_lpc_order; + guint blocksize; +} +GstFlacEncParams; + +static const GstFlacEncParams flacenc_params[] = { + {FALSE, FALSE, FALSE, FALSE, 0, FALSE, 2, 2, 0, 0, 1152}, + {FALSE, FALSE, TRUE, TRUE, 0, FALSE, 2, 2, 0, 0, 1152}, + {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 0, 3, 0, 0, 1152}, + {FALSE, FALSE, FALSE, FALSE, 0, FALSE, 3, 3, 0, 6, 4608}, + {FALSE, FALSE, TRUE, TRUE, 0, FALSE, 3, 3, 0, 8, 4608}, + {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 3, 3, 0, 8, 4608}, + {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 0, 4, 0, 8, 4608}, + {TRUE, FALSE, TRUE, FALSE, 0, FALSE, 0, 6, 0, 8, 4608}, + {TRUE, FALSE, TRUE, FALSE, 0, FALSE, 0, 6, 0, 12, 4608}, + {TRUE, TRUE, TRUE, FALSE, 0, FALSE, 0, 16, 0, 32, 4608}, +}; + +#define DEFAULT_QUALITY 5 +#define DEFAULT_PADDING 0 +#define DEFAULT_SEEKPOINTS 0 + +#define GST_TYPE_FLAC_ENC_QUALITY (gst_flac_enc_quality_get_type ()) +static GType +gst_flac_enc_quality_get_type (void) +{ + static GType qtype = 0; + + if (qtype == 0) { + static const GEnumValue values[] = { + {0, "0 - Fastest compression", "0"}, + {1, "1", "1"}, + {2, "2", "2"}, + {3, "3", "3"}, + {4, "4", "4"}, + {5, "5 - Default", "5"}, + {6, "6", "6"}, + {7, "7", "7"}, + {8, "8 - Highest compression", "8"}, + {9, "9 - Insane", "9"}, + {0, NULL, NULL} + }; + + qtype = g_enum_register_static ("GstFlacEncQuality", values); + } + return qtype; +} + +static void +gst_flac_enc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "FLAC audio encoder", + "Codec/Encoder/Audio", + "Encodes audio with the FLAC lossless audio encoder", + "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (flacenc_debug, "flacenc", 0, + "Flac encoding element"); +} + +static void +gst_flac_enc_class_init (GstFlacEncClass * klass) +{ + GObjectClass *gobject_class; + GstAudioEncoderClass *base_class; + + gobject_class = (GObjectClass *) klass; + base_class = (GstAudioEncoderClass *) (klass); + + gobject_class->set_property = gst_flac_enc_set_property; + gobject_class->get_property = gst_flac_enc_get_property; + gobject_class->finalize = gst_flac_enc_finalize; + + base_class->start = GST_DEBUG_FUNCPTR (gst_flac_enc_start); + base_class->stop = GST_DEBUG_FUNCPTR (gst_flac_enc_stop); + base_class->set_format = GST_DEBUG_FUNCPTR (gst_flac_enc_set_format); + base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_flac_enc_handle_frame); + base_class->getcaps = GST_DEBUG_FUNCPTR (gst_flac_enc_getcaps); + base_class->event = GST_DEBUG_FUNCPTR (gst_flac_enc_sink_event); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QUALITY, + g_param_spec_enum ("quality", + "Quality", + "Speed versus compression tradeoff", + GST_TYPE_FLAC_ENC_QUALITY, DEFAULT_QUALITY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_STREAMABLE_SUBSET, g_param_spec_boolean ("streamable-subset", + "Streamable subset", + "true to limit encoder to generating a Subset stream, else false", + TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MID_SIDE_STEREO, + g_param_spec_boolean ("mid-side-stereo", "Do mid side stereo", + "Do mid side stereo (only for stereo input)", + flacenc_params[DEFAULT_QUALITY].mid_side, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_LOOSE_MID_SIDE_STEREO, g_param_spec_boolean ("loose-mid-side-stereo", + "Loose mid side stereo", "Loose mid side stereo", + flacenc_params[DEFAULT_QUALITY].loose_mid_side, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BLOCKSIZE, + g_param_spec_uint ("blocksize", "Blocksize", "Blocksize in samples", + FLAC__MIN_BLOCK_SIZE, FLAC__MAX_BLOCK_SIZE, + flacenc_params[DEFAULT_QUALITY].blocksize, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_LPC_ORDER, + g_param_spec_uint ("max-lpc-order", "Max LPC order", + "Max LPC order; 0 => use only fixed predictors", 0, + FLAC__MAX_LPC_ORDER, flacenc_params[DEFAULT_QUALITY].max_lpc_order, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_QLP_COEFF_PRECISION, g_param_spec_uint ("qlp-coeff-precision", + "QLP coefficients precision", + "Precision in bits of quantized linear-predictor coefficients; 0 = automatic", + 0, 32, flacenc_params[DEFAULT_QUALITY].qlp_coeff_precision, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_QLP_COEFF_PREC_SEARCH, g_param_spec_boolean ("qlp-coeff-prec-search", + "Do QLP coefficients precision search", + "false = use qlp_coeff_precision, " + "true = search around qlp_coeff_precision, take best", + flacenc_params[DEFAULT_QUALITY].qlp_coeff_prec_search, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ESCAPE_CODING, + g_param_spec_boolean ("escape-coding", "Do Escape coding", + "search for escape codes in the entropy coding stage " + "for slightly better compression", + flacenc_params[DEFAULT_QUALITY].escape_coding, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_EXHAUSTIVE_MODEL_SEARCH, + g_param_spec_boolean ("exhaustive-model-search", + "Do exhaustive model search", + "do exhaustive search of LP coefficient quantization (expensive!)", + flacenc_params[DEFAULT_QUALITY].exhaustive_model_search, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_MIN_RESIDUAL_PARTITION_ORDER, + g_param_spec_uint ("min-residual-partition-order", + "Min residual partition order", + "Min residual partition order (above 4 doesn't usually help much)", 0, + 16, flacenc_params[DEFAULT_QUALITY].min_residual_partition_order, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_MAX_RESIDUAL_PARTITION_ORDER, + g_param_spec_uint ("max-residual-partition-order", + "Max residual partition order", + "Max residual partition order (above 4 doesn't usually help much)", 0, + 16, flacenc_params[DEFAULT_QUALITY].max_residual_partition_order, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_RICE_PARAMETER_SEARCH_DIST, + g_param_spec_uint ("rice-parameter-search-dist", + "rice_parameter_search_dist", + "0 = try only calc'd parameter k; else try all [k-dist..k+dist] " + "parameters, use best", 0, FLAC__MAX_RICE_PARTITION_ORDER, + flacenc_params[DEFAULT_QUALITY].rice_parameter_search_dist, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GstFlacEnc:padding + * + * Write a PADDING block with this length in bytes + * + * Since: 0.10.16 + **/ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_PADDING, + g_param_spec_uint ("padding", + "Padding", + "Write a PADDING block with this length in bytes", 0, G_MAXUINT, + DEFAULT_PADDING, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GstFlacEnc:seekpoints + * + * Write a SEEKTABLE block with a specific number of seekpoints + * or with a specific interval spacing. + * + * Since: 0.10.18 + **/ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_SEEKPOINTS, + g_param_spec_int ("seekpoints", + "Seekpoints", + "Add SEEKTABLE metadata (if > 0, number of entries, if < 0, interval in sec)", + -G_MAXINT, G_MAXINT, + DEFAULT_SEEKPOINTS, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_flac_enc_init (GstFlacEnc * flacenc, GstFlacEncClass * klass) +{ + GstAudioEncoder *enc = GST_AUDIO_ENCODER (flacenc); + + flacenc->encoder = FLAC__stream_encoder_new (); + gst_flac_enc_update_quality (flacenc, DEFAULT_QUALITY); + + /* arrange granulepos marking (and required perfect ts) */ + gst_audio_encoder_set_mark_granule (enc, TRUE); + gst_audio_encoder_set_perfect_timestamp (enc, TRUE); +} + +static void +gst_flac_enc_finalize (GObject * object) +{ + GstFlacEnc *flacenc = GST_FLAC_ENC (object); + + FLAC__stream_encoder_delete (flacenc->encoder); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_flac_enc_start (GstAudioEncoder * enc) +{ + GstFlacEnc *flacenc = GST_FLAC_ENC (enc); + + GST_DEBUG_OBJECT (enc, "start"); + flacenc->stopped = TRUE; + flacenc->got_headers = FALSE; + flacenc->last_flow = GST_FLOW_OK; + flacenc->offset = 0; + flacenc->channels = 0; + flacenc->depth = 0; + flacenc->sample_rate = 0; + flacenc->eos = FALSE; + flacenc->tags = gst_tag_list_new (); + + return TRUE; +} + +static gboolean +gst_flac_enc_stop (GstAudioEncoder * enc) +{ + GstFlacEnc *flacenc = GST_FLAC_ENC (enc); + + GST_DEBUG_OBJECT (enc, "stop"); + gst_tag_list_free (flacenc->tags); + flacenc->tags = NULL; + if (FLAC__stream_encoder_get_state (flacenc->encoder) != + FLAC__STREAM_ENCODER_UNINITIALIZED) { + flacenc->stopped = TRUE; + FLAC__stream_encoder_finish (flacenc->encoder); + } + if (flacenc->meta) { + FLAC__metadata_object_delete (flacenc->meta[0]); + + if (flacenc->meta[1]) + FLAC__metadata_object_delete (flacenc->meta[1]); + + if (flacenc->meta[2]) + FLAC__metadata_object_delete (flacenc->meta[2]); + + g_free (flacenc->meta); + flacenc->meta = NULL; + } + g_list_foreach (flacenc->headers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (flacenc->headers); + flacenc->headers = NULL; + + gst_tag_setter_reset_tags (GST_TAG_SETTER (enc)); + + return TRUE; +} + +static void +add_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) +{ + GList *comments; + GList *it; + GstFlacEnc *flacenc = GST_FLAC_ENC (user_data); + + /* IMAGE and PREVIEW_IMAGE tags are already written + * differently, no need to store them inside the + * vorbiscomments too */ + if (strcmp (tag, GST_TAG_IMAGE) == 0 + || strcmp (tag, GST_TAG_PREVIEW_IMAGE) == 0) + return; + + comments = gst_tag_to_vorbis_comments (list, tag); + for (it = comments; it != NULL; it = it->next) { + FLAC__StreamMetadata_VorbisComment_Entry commment_entry; + + commment_entry.length = strlen (it->data); + commment_entry.entry = it->data; + FLAC__metadata_object_vorbiscomment_insert_comment (flacenc->meta[0], + flacenc->meta[0]->data.vorbis_comment.num_comments, + commment_entry, TRUE); + g_free (it->data); + } + g_list_free (comments); +} + +static void +gst_flac_enc_set_metadata (GstFlacEnc * flacenc, guint64 total_samples) +{ + const GstTagList *user_tags; + GstTagList *copy; + gint entries = 1; + gint n_images, n_preview_images; + + g_return_if_fail (flacenc != NULL); + user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (flacenc)); + if ((flacenc->tags == NULL) && (user_tags == NULL)) { + return; + } + copy = gst_tag_list_merge (user_tags, flacenc->tags, + gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (flacenc))); + n_images = gst_tag_list_get_tag_size (copy, GST_TAG_IMAGE); + n_preview_images = gst_tag_list_get_tag_size (copy, GST_TAG_PREVIEW_IMAGE); + + flacenc->meta = + g_new0 (FLAC__StreamMetadata *, 3 + n_images + n_preview_images); + + flacenc->meta[0] = + FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT); + gst_tag_list_foreach (copy, add_one_tag, flacenc); + + if (n_images + n_preview_images > 0) { + GstBuffer *buffer; + GstCaps *caps; + GstStructure *structure; + GstTagImageType image_type = GST_TAG_IMAGE_TYPE_NONE; + gint i; + + for (i = 0; i < n_images + n_preview_images; i++) { + if (i < n_images) { + if (!gst_tag_list_get_buffer_index (copy, GST_TAG_IMAGE, i, &buffer)) + continue; + } else { + if (!gst_tag_list_get_buffer_index (copy, GST_TAG_PREVIEW_IMAGE, + i - n_images, &buffer)) + continue; + } + + flacenc->meta[entries] = + FLAC__metadata_object_new (FLAC__METADATA_TYPE_PICTURE); + + caps = gst_buffer_get_caps (buffer); + structure = gst_caps_get_structure (caps, 0); + + gst_structure_get (structure, "image-type", GST_TYPE_TAG_IMAGE_TYPE, + &image_type, NULL); + /* Convert to ID3v2 APIC image type */ + if (image_type == GST_TAG_IMAGE_TYPE_NONE) + image_type = (i < n_images) ? 0x00 : 0x01; + else + image_type = image_type + 2; + + FLAC__metadata_object_picture_set_data (flacenc->meta[entries], + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), TRUE); + /* FIXME: There's no way to set the picture type in libFLAC */ + flacenc->meta[entries]->data.picture.type = image_type; + FLAC__metadata_object_picture_set_mime_type (flacenc->meta[entries], + (char *) gst_structure_get_name (structure), TRUE); + + gst_caps_unref (caps); + gst_buffer_unref (buffer); + entries++; + } + } + + if (flacenc->seekpoints && total_samples != GST_CLOCK_TIME_NONE) { + gboolean res; + guint samples; + + flacenc->meta[entries] = + FLAC__metadata_object_new (FLAC__METADATA_TYPE_SEEKTABLE); + if (flacenc->seekpoints > 0) { + res = + FLAC__metadata_object_seektable_template_append_spaced_points + (flacenc->meta[entries], flacenc->seekpoints, total_samples); + } else { + samples = -flacenc->seekpoints * flacenc->sample_rate; + res = + FLAC__metadata_object_seektable_template_append_spaced_points_by_samples + (flacenc->meta[entries], samples, total_samples); + } + if (!res) { + GST_DEBUG_OBJECT (flacenc, "adding seekpoint template %d failed", + flacenc->seekpoints); + FLAC__metadata_object_delete (flacenc->meta[1]); + flacenc->meta[entries] = NULL; + } else { + entries++; + } + } else if (flacenc->seekpoints && total_samples == GST_CLOCK_TIME_NONE) { + GST_WARNING_OBJECT (flacenc, "total time unknown; can not add seekpoints"); + } + + if (flacenc->padding > 0) { + flacenc->meta[entries] = + FLAC__metadata_object_new (FLAC__METADATA_TYPE_PADDING); + flacenc->meta[entries]->length = flacenc->padding; + entries++; + } + + if (FLAC__stream_encoder_set_metadata (flacenc->encoder, + flacenc->meta, entries) != true) + g_warning ("Dude, i'm already initialized!"); + + gst_tag_list_free (copy); +} + +static void +gst_flac_enc_caps_append_structure_with_widths (GstCaps * caps, + GstStructure * s) +{ + GstStructure *tmp; + GValue list = { 0, }; + GValue depth = { 0, }; + + + tmp = gst_structure_copy (s); + gst_structure_set (tmp, "width", G_TYPE_INT, 8, "depth", G_TYPE_INT, 8, NULL); + gst_caps_append_structure (caps, tmp); + + tmp = gst_structure_copy (s); + + g_value_init (&depth, G_TYPE_INT); + g_value_init (&list, GST_TYPE_LIST); + g_value_set_int (&depth, 12); + gst_value_list_append_value (&list, &depth); + g_value_set_int (&depth, 16); + gst_value_list_append_value (&list, &depth); + + gst_structure_set (tmp, "width", G_TYPE_INT, 16, NULL); + gst_structure_set_value (tmp, "depth", &list); + gst_caps_append_structure (caps, tmp); + + g_value_reset (&list); + + tmp = s; + + g_value_set_int (&depth, 20); + gst_value_list_append_value (&list, &depth); + g_value_set_int (&depth, 24); + gst_value_list_append_value (&list, &depth); + + gst_structure_set (tmp, "width", G_TYPE_INT, 32, NULL); + gst_structure_set_value (tmp, "depth", &list); + gst_caps_append_structure (caps, tmp); + + g_value_unset (&list); + g_value_unset (&depth); +} + +static GstCaps * +gst_flac_enc_getcaps (GstAudioEncoder * enc) +{ + GstCaps *ret = NULL, *caps = NULL; + GstPad *pad; + + pad = GST_AUDIO_ENCODER_SINK_PAD (enc); + + GST_OBJECT_LOCK (pad); + + if (GST_PAD_CAPS (pad)) { + ret = gst_caps_ref (GST_PAD_CAPS (pad)); + } else { + gint i, c; + + ret = gst_caps_new_empty (); + + gst_flac_enc_caps_append_structure_with_widths (ret, + gst_structure_new ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "rate", GST_TYPE_INT_RANGE, 1, 655350, + "channels", GST_TYPE_INT_RANGE, 1, 2, NULL)); + + for (i = 3; i <= 8; i++) { + GValue positions = { 0, }; + GValue pos = { 0, }; + GstStructure *s; + + g_value_init (&positions, GST_TYPE_ARRAY); + g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION); + + for (c = 0; c < i; c++) { + g_value_set_enum (&pos, channel_positions[i - 1][c]); + gst_value_array_append_value (&positions, &pos); + } + g_value_unset (&pos); + + s = gst_structure_new ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "rate", GST_TYPE_INT_RANGE, 1, 655350, + "channels", G_TYPE_INT, i, NULL); + gst_structure_set_value (s, "channel-positions", &positions); + g_value_unset (&positions); + + gst_flac_enc_caps_append_structure_with_widths (ret, s); + } + } + + GST_OBJECT_UNLOCK (pad); + + GST_DEBUG_OBJECT (pad, "Return caps %" GST_PTR_FORMAT, ret); + + caps = gst_audio_encoder_proxy_getcaps (enc, ret); + gst_caps_unref (ret); + + return caps; +} + +static guint64 +gst_flac_enc_query_peer_total_samples (GstFlacEnc * flacenc, GstPad * pad) +{ + GstFormat fmt = GST_FORMAT_DEFAULT; + gint64 duration; + + GST_DEBUG_OBJECT (flacenc, "querying peer for DEFAULT format duration"); + if (gst_pad_query_peer_duration (pad, &fmt, &duration) + && fmt == GST_FORMAT_DEFAULT && duration != GST_CLOCK_TIME_NONE) + goto done; + + fmt = GST_FORMAT_TIME; + GST_DEBUG_OBJECT (flacenc, "querying peer for TIME format duration"); + + if (gst_pad_query_peer_duration (pad, &fmt, &duration) && + fmt == GST_FORMAT_TIME && duration != GST_CLOCK_TIME_NONE) { + GST_DEBUG_OBJECT (flacenc, "peer reported duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (duration)); + duration = GST_CLOCK_TIME_TO_FRAMES (duration, flacenc->sample_rate); + + goto done; + } + + GST_DEBUG_OBJECT (flacenc, "Upstream reported no total samples"); + return GST_CLOCK_TIME_NONE; + +done: + GST_DEBUG_OBJECT (flacenc, + "Upstream reported %" G_GUINT64_FORMAT " total samples", duration); + + return duration; +} + +static gboolean +gst_flac_enc_set_format (GstAudioEncoder * enc, GstAudioInfo * info) +{ + GstFlacEnc *flacenc; + guint64 total_samples = GST_CLOCK_TIME_NONE; + FLAC__StreamEncoderInitStatus init_status; + GstCaps *caps; + + flacenc = GST_FLAC_ENC (enc); + + /* if configured again, means something changed, can't handle that */ + if (FLAC__stream_encoder_get_state (flacenc->encoder) != + FLAC__STREAM_ENCODER_UNINITIALIZED) + goto encoder_already_initialized; + + flacenc->channels = GST_AUDIO_INFO_CHANNELS (info); + flacenc->width = GST_AUDIO_INFO_WIDTH (info); + flacenc->depth = GST_AUDIO_INFO_DEPTH (info); + flacenc->sample_rate = GST_AUDIO_INFO_RATE (info); + + caps = gst_caps_new_simple ("audio/x-flac", + "channels", G_TYPE_INT, flacenc->channels, + "rate", G_TYPE_INT, flacenc->sample_rate, NULL); + + if (!gst_pad_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), caps)) + goto setting_src_caps_failed; + + gst_caps_unref (caps); + + total_samples = gst_flac_enc_query_peer_total_samples (flacenc, + GST_AUDIO_ENCODER_SINK_PAD (enc)); + + FLAC__stream_encoder_set_bits_per_sample (flacenc->encoder, flacenc->depth); + FLAC__stream_encoder_set_sample_rate (flacenc->encoder, flacenc->sample_rate); + FLAC__stream_encoder_set_channels (flacenc->encoder, flacenc->channels); + + if (total_samples != GST_CLOCK_TIME_NONE) + FLAC__stream_encoder_set_total_samples_estimate (flacenc->encoder, + MIN (total_samples, G_GUINT64_CONSTANT (0x0FFFFFFFFF))); + + gst_flac_enc_set_metadata (flacenc, total_samples); + + /* callbacks clear to go now; + * write callbacks receives headers during init */ + flacenc->stopped = FALSE; + + init_status = FLAC__stream_encoder_init_stream (flacenc->encoder, + gst_flac_enc_write_callback, gst_flac_enc_seek_callback, + gst_flac_enc_tell_callback, NULL, flacenc); + if (init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) + goto failed_to_initialize; + + /* no special feedback to base class; should provide all available samples */ + + return TRUE; + +encoder_already_initialized: + { + g_warning ("flac already initialized -- fixme allow this"); + gst_object_unref (flacenc); + return FALSE; + } +setting_src_caps_failed: + { + GST_DEBUG_OBJECT (flacenc, + "Couldn't set caps on source pad: %" GST_PTR_FORMAT, caps); + gst_caps_unref (caps); + gst_object_unref (flacenc); + return FALSE; + } +failed_to_initialize: + { + GST_ELEMENT_ERROR (flacenc, LIBRARY, INIT, (NULL), + ("could not initialize encoder (wrong parameters?)")); + gst_object_unref (flacenc); + return FALSE; + } +} + +static gboolean +gst_flac_enc_update_quality (GstFlacEnc * flacenc, gint quality) +{ + flacenc->quality = quality; + +#define DO_UPDATE(name, val, str) \ + G_STMT_START { \ + if (FLAC__stream_encoder_get_##name (flacenc->encoder) != \ + flacenc_params[quality].val) { \ + FLAC__stream_encoder_set_##name (flacenc->encoder, \ + flacenc_params[quality].val); \ + g_object_notify (G_OBJECT (flacenc), str); \ + } \ + } G_STMT_END + + g_object_freeze_notify (G_OBJECT (flacenc)); + + if (flacenc->channels == 2 || flacenc->channels == 0) { + DO_UPDATE (do_mid_side_stereo, mid_side, "mid_side_stereo"); + DO_UPDATE (loose_mid_side_stereo, loose_mid_side, "loose_mid_side"); + } + + DO_UPDATE (blocksize, blocksize, "blocksize"); + DO_UPDATE (max_lpc_order, max_lpc_order, "max_lpc_order"); + DO_UPDATE (qlp_coeff_precision, qlp_coeff_precision, "qlp_coeff_precision"); + DO_UPDATE (do_qlp_coeff_prec_search, qlp_coeff_prec_search, + "qlp_coeff_prec_search"); + DO_UPDATE (do_escape_coding, escape_coding, "escape_coding"); + DO_UPDATE (do_exhaustive_model_search, exhaustive_model_search, + "exhaustive_model_search"); + DO_UPDATE (min_residual_partition_order, min_residual_partition_order, + "min_residual_partition_order"); + DO_UPDATE (max_residual_partition_order, max_residual_partition_order, + "max_residual_partition_order"); + DO_UPDATE (rice_parameter_search_dist, rice_parameter_search_dist, + "rice_parameter_search_dist"); + +#undef DO_UPDATE + + g_object_thaw_notify (G_OBJECT (flacenc)); + + return TRUE; +} + +static FLAC__StreamEncoderSeekStatus +gst_flac_enc_seek_callback (const FLAC__StreamEncoder * encoder, + FLAC__uint64 absolute_byte_offset, void *client_data) +{ + GstFlacEnc *flacenc; + GstPad *peerpad; + + flacenc = GST_FLAC_ENC (client_data); + + if (flacenc->stopped) + return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; + + if ((peerpad = gst_pad_get_peer (GST_AUDIO_ENCODER_SRC_PAD (flacenc)))) { + GstEvent *event = gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_BYTES, + absolute_byte_offset, GST_BUFFER_OFFSET_NONE, 0); + gboolean ret = gst_pad_send_event (peerpad, event); + + gst_object_unref (peerpad); + + if (ret) { + GST_DEBUG ("Seek to %" G_GUINT64_FORMAT " %s", + (guint64) absolute_byte_offset, "succeeded"); + } else { + GST_DEBUG ("Seek to %" G_GUINT64_FORMAT " %s", + (guint64) absolute_byte_offset, "failed"); + return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; + } + } else { + GST_DEBUG ("Seek to %" G_GUINT64_FORMAT " failed (no peer pad)", + (guint64) absolute_byte_offset); + } + + flacenc->offset = absolute_byte_offset; + return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; +} + +static void +notgst_value_array_append_buffer (GValue * array_val, GstBuffer * buf) +{ + GValue value = { 0, }; + + g_value_init (&value, GST_TYPE_BUFFER); + /* copy buffer to avoid problems with circular refcounts */ + buf = gst_buffer_copy (buf); + /* again, for good measure */ + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); + gst_value_set_buffer (&value, buf); + gst_buffer_unref (buf); + gst_value_array_append_value (array_val, &value); + g_value_unset (&value); +} + +#define HDR_TYPE_STREAMINFO 0 +#define HDR_TYPE_VORBISCOMMENT 4 + +static GstFlowReturn +gst_flac_enc_process_stream_headers (GstFlacEnc * enc) +{ + GstBuffer *vorbiscomment = NULL; + GstBuffer *streaminfo = NULL; + GstBuffer *marker = NULL; + GValue array = { 0, }; + GstCaps *caps; + GList *l; + GstFlowReturn ret = GST_FLOW_OK; + + caps = gst_caps_new_simple ("audio/x-flac", + "channels", G_TYPE_INT, enc->channels, + "rate", G_TYPE_INT, enc->sample_rate, NULL); + + for (l = enc->headers; l != NULL; l = l->next) { + const guint8 *data; + guint size; + + /* mark buffers so oggmux will ignore them if it already muxed the + * header buffers from the streamheaders field in the caps */ + l->data = gst_buffer_make_metadata_writable (GST_BUFFER (l->data)); + GST_BUFFER_FLAG_SET (GST_BUFFER (l->data), GST_BUFFER_FLAG_IN_CAPS); + + data = GST_BUFFER_DATA (GST_BUFFER_CAST (l->data)); + size = GST_BUFFER_SIZE (GST_BUFFER_CAST (l->data)); + + /* find initial 4-byte marker which we need to skip later on */ + if (size == 4 && memcmp (data, "fLaC", 4) == 0) { + marker = GST_BUFFER_CAST (l->data); + } else if (size > 1 && (data[0] & 0x7f) == HDR_TYPE_STREAMINFO) { + streaminfo = GST_BUFFER_CAST (l->data); + } else if (size > 1 && (data[0] & 0x7f) == HDR_TYPE_VORBISCOMMENT) { + vorbiscomment = GST_BUFFER_CAST (l->data); + } + } + + if (marker == NULL || streaminfo == NULL || vorbiscomment == NULL) { + GST_WARNING_OBJECT (enc, "missing header %p %p %p, muxing into container " + "formats may be broken", marker, streaminfo, vorbiscomment); + goto push_headers; + } + + g_value_init (&array, GST_TYPE_ARRAY); + + /* add marker including STREAMINFO header */ + { + GstBuffer *buf; + guint16 num; + + /* minus one for the marker that is merged with streaminfo here */ + num = g_list_length (enc->headers) - 1; + + buf = gst_buffer_new_and_alloc (13 + GST_BUFFER_SIZE (streaminfo)); + GST_BUFFER_DATA (buf)[0] = 0x7f; + memcpy (GST_BUFFER_DATA (buf) + 1, "FLAC", 4); + GST_BUFFER_DATA (buf)[5] = 0x01; /* mapping version major */ + GST_BUFFER_DATA (buf)[6] = 0x00; /* mapping version minor */ + GST_BUFFER_DATA (buf)[7] = (num & 0xFF00) >> 8; + GST_BUFFER_DATA (buf)[8] = (num & 0x00FF) >> 0; + memcpy (GST_BUFFER_DATA (buf) + 9, "fLaC", 4); + memcpy (GST_BUFFER_DATA (buf) + 13, GST_BUFFER_DATA (streaminfo), + GST_BUFFER_SIZE (streaminfo)); + notgst_value_array_append_buffer (&array, buf); + gst_buffer_unref (buf); + } + + /* add VORBISCOMMENT header */ + notgst_value_array_append_buffer (&array, vorbiscomment); + + /* add other headers, if there are any */ + for (l = enc->headers; l != NULL; l = l->next) { + if (GST_BUFFER_CAST (l->data) != marker && + GST_BUFFER_CAST (l->data) != streaminfo && + GST_BUFFER_CAST (l->data) != vorbiscomment) { + notgst_value_array_append_buffer (&array, GST_BUFFER_CAST (l->data)); + } + } + + gst_structure_set_value (gst_caps_get_structure (caps, 0), + "streamheader", &array); + g_value_unset (&array); + +push_headers: + + /* push header buffers; update caps, so when we push the first buffer the + * negotiated caps will change to caps that include the streamheader field */ + for (l = enc->headers; l != NULL; l = l->next) { + GstBuffer *buf; + + buf = GST_BUFFER (l->data); + gst_buffer_set_caps (buf, caps); + GST_LOG_OBJECT (enc, "Pushing header buffer, size %u bytes", + GST_BUFFER_SIZE (buf)); + GST_MEMDUMP_OBJECT (enc, "header buffer", GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + ret = gst_pad_push (GST_AUDIO_ENCODER_SRC_PAD (enc), buf); + l->data = NULL; + } + g_list_free (enc->headers); + enc->headers = NULL; + + gst_caps_unref (caps); + + return ret; +} + +static FLAC__StreamEncoderWriteStatus +gst_flac_enc_write_callback (const FLAC__StreamEncoder * encoder, + const FLAC__byte buffer[], size_t bytes, + unsigned samples, unsigned current_frame, void *client_data) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstFlacEnc *flacenc; + GstBuffer *outbuf; + + flacenc = GST_FLAC_ENC (client_data); + + if (flacenc->stopped) + return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; + + outbuf = gst_buffer_new_and_alloc (bytes); + memcpy (GST_BUFFER_DATA (outbuf), buffer, bytes); + + /* we assume libflac passes us stuff neatly framed */ + if (!flacenc->got_headers) { + if (samples == 0) { + GST_DEBUG_OBJECT (flacenc, "Got header, queueing (%u bytes)", + (guint) bytes); + flacenc->headers = g_list_append (flacenc->headers, outbuf); + /* note: it's important that we increase our byte offset */ + goto out; + } else { + GST_INFO_OBJECT (flacenc, "Non-header packet, we have all headers now"); + ret = gst_flac_enc_process_stream_headers (flacenc); + flacenc->got_headers = TRUE; + } + } + + if (flacenc->got_headers && samples == 0) { + /* header fixup, push downstream directly */ + GST_DEBUG_OBJECT (flacenc, "Fixing up headers at pos=%" G_GUINT64_FORMAT + ", size=%u", flacenc->offset, (guint) bytes); + GST_MEMDUMP_OBJECT (flacenc, "Presumed header fragment", + GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf)); + gst_buffer_set_caps (outbuf, + GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (flacenc))); + ret = gst_pad_push (GST_AUDIO_ENCODER_SRC_PAD (flacenc), outbuf); + } else { + /* regular frame data, pass to base class */ + GST_LOG ("Pushing buffer: ts=%" GST_TIME_FORMAT ", samples=%u, size=%u, " + "pos=%" G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + samples, (guint) bytes, flacenc->offset); + ret = gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (flacenc), + outbuf, samples); + } + + if (ret != GST_FLOW_OK) + GST_DEBUG_OBJECT (flacenc, "flow: %s", gst_flow_get_name (ret)); + + flacenc->last_flow = ret; + +out: + flacenc->offset += bytes; + + if (ret != GST_FLOW_OK) + return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; + + return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; +} + +static FLAC__StreamEncoderTellStatus +gst_flac_enc_tell_callback (const FLAC__StreamEncoder * encoder, + FLAC__uint64 * absolute_byte_offset, void *client_data) +{ + GstFlacEnc *flacenc = GST_FLAC_ENC (client_data); + + *absolute_byte_offset = flacenc->offset; + + return FLAC__STREAM_ENCODER_TELL_STATUS_OK; +} + +static gboolean +gst_flac_enc_sink_event (GstAudioEncoder * enc, GstEvent * event) +{ + GstFlacEnc *flacenc; + GstTagList *taglist; + gboolean ret = FALSE; + + flacenc = GST_FLAC_ENC (enc); + + GST_DEBUG ("Received %s event on sinkpad", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT:{ + GstFormat format; + gint64 start, stream_time; + + if (flacenc->offset == 0) { + gst_event_parse_new_segment (event, NULL, NULL, &format, &start, NULL, + &stream_time); + } else { + start = -1; + stream_time = -1; + } + + if (start > 0) { + if (flacenc->offset > 0) + GST_DEBUG ("Not handling mid-stream newsegment event"); + else + GST_DEBUG ("Not handling newsegment event with non-zero start"); + } else { + GstEvent *e = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + 0, -1, 0); + + ret = gst_pad_push_event (GST_AUDIO_ENCODER_SRC_PAD (enc), e); + } + + if (stream_time > 0) { + GST_DEBUG ("Not handling non-zero stream time"); + } + + /* don't push it downstream, we'll generate our own via seek to 0 */ + gst_event_unref (event); + ret = TRUE; + break; + } + case GST_EVENT_EOS: + flacenc->eos = TRUE; + break; + case GST_EVENT_TAG: + if (flacenc->tags) { + gst_event_parse_tag (event, &taglist); + gst_tag_list_insert (flacenc->tags, taglist, + gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (flacenc))); + } else { + g_assert_not_reached (); + } + break; + default: + break; + } + + return ret; +} + +static GstFlowReturn +gst_flac_enc_handle_frame (GstAudioEncoder * enc, GstBuffer * buffer) +{ + GstFlacEnc *flacenc; + FLAC__int32 *data; + gulong insize; + gint samples, width; + gulong i; + FLAC__bool res; + + flacenc = GST_FLAC_ENC (enc); + + /* base class ensures configuration */ + g_return_val_if_fail (flacenc->depth != 0, GST_FLOW_NOT_NEGOTIATED); + + width = flacenc->width; + + if (G_UNLIKELY (!buffer)) { + if (flacenc->eos) { + FLAC__stream_encoder_finish (flacenc->encoder); + } else { + /* can't handle intermittent draining/resyncing */ + GST_ELEMENT_WARNING (flacenc, STREAM, FORMAT, (NULL), + ("Stream discontinuity detected. " + "The output may have wrong timestamps, " + "consider using audiorate to handle discontinuities")); + } + return flacenc->last_flow; + } + + insize = GST_BUFFER_SIZE (buffer); + samples = insize / (width >> 3); + + data = g_malloc (samples * sizeof (FLAC__int32)); + + if (width == 8) { + gint8 *indata = (gint8 *) GST_BUFFER_DATA (buffer); + + for (i = 0; i < samples; i++) + data[i] = (FLAC__int32) indata[i]; + } else if (width == 16) { + gint16 *indata = (gint16 *) GST_BUFFER_DATA (buffer); + + for (i = 0; i < samples; i++) + data[i] = (FLAC__int32) indata[i]; + } else if (width == 32) { + gint32 *indata = (gint32 *) GST_BUFFER_DATA (buffer); + + for (i = 0; i < samples; i++) + data[i] = (FLAC__int32) indata[i]; + } else { + g_assert_not_reached (); + } + + res = FLAC__stream_encoder_process_interleaved (flacenc->encoder, + (const FLAC__int32 *) data, samples / flacenc->channels); + + g_free (data); + + if (!res) { + if (flacenc->last_flow == GST_FLOW_OK) + return GST_FLOW_ERROR; + else + return flacenc->last_flow; + } + + return GST_FLOW_OK; +} + +static void +gst_flac_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstFlacEnc *this = GST_FLAC_ENC (object); + + GST_OBJECT_LOCK (this); + + switch (prop_id) { + case PROP_QUALITY: + gst_flac_enc_update_quality (this, g_value_get_enum (value)); + break; + case PROP_STREAMABLE_SUBSET: + FLAC__stream_encoder_set_streamable_subset (this->encoder, + g_value_get_boolean (value)); + break; + case PROP_MID_SIDE_STEREO: + FLAC__stream_encoder_set_do_mid_side_stereo (this->encoder, + g_value_get_boolean (value)); + break; + case PROP_LOOSE_MID_SIDE_STEREO: + FLAC__stream_encoder_set_loose_mid_side_stereo (this->encoder, + g_value_get_boolean (value)); + break; + case PROP_BLOCKSIZE: + FLAC__stream_encoder_set_blocksize (this->encoder, + g_value_get_uint (value)); + break; + case PROP_MAX_LPC_ORDER: + FLAC__stream_encoder_set_max_lpc_order (this->encoder, + g_value_get_uint (value)); + break; + case PROP_QLP_COEFF_PRECISION: + FLAC__stream_encoder_set_qlp_coeff_precision (this->encoder, + g_value_get_uint (value)); + break; + case PROP_QLP_COEFF_PREC_SEARCH: + FLAC__stream_encoder_set_do_qlp_coeff_prec_search (this->encoder, + g_value_get_boolean (value)); + break; + case PROP_ESCAPE_CODING: + FLAC__stream_encoder_set_do_escape_coding (this->encoder, + g_value_get_boolean (value)); + break; + case PROP_EXHAUSTIVE_MODEL_SEARCH: + FLAC__stream_encoder_set_do_exhaustive_model_search (this->encoder, + g_value_get_boolean (value)); + break; + case PROP_MIN_RESIDUAL_PARTITION_ORDER: + FLAC__stream_encoder_set_min_residual_partition_order (this->encoder, + g_value_get_uint (value)); + break; + case PROP_MAX_RESIDUAL_PARTITION_ORDER: + FLAC__stream_encoder_set_max_residual_partition_order (this->encoder, + g_value_get_uint (value)); + break; + case PROP_RICE_PARAMETER_SEARCH_DIST: + FLAC__stream_encoder_set_rice_parameter_search_dist (this->encoder, + g_value_get_uint (value)); + break; + case PROP_PADDING: + this->padding = g_value_get_uint (value); + break; + case PROP_SEEKPOINTS: + this->seekpoints = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (this); +} + +static void +gst_flac_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstFlacEnc *this = GST_FLAC_ENC (object); + + GST_OBJECT_LOCK (this); + + switch (prop_id) { + case PROP_QUALITY: + g_value_set_enum (value, this->quality); + break; + case PROP_STREAMABLE_SUBSET: + g_value_set_boolean (value, + FLAC__stream_encoder_get_streamable_subset (this->encoder)); + break; + case PROP_MID_SIDE_STEREO: + g_value_set_boolean (value, + FLAC__stream_encoder_get_do_mid_side_stereo (this->encoder)); + break; + case PROP_LOOSE_MID_SIDE_STEREO: + g_value_set_boolean (value, + FLAC__stream_encoder_get_loose_mid_side_stereo (this->encoder)); + break; + case PROP_BLOCKSIZE: + g_value_set_uint (value, + FLAC__stream_encoder_get_blocksize (this->encoder)); + break; + case PROP_MAX_LPC_ORDER: + g_value_set_uint (value, + FLAC__stream_encoder_get_max_lpc_order (this->encoder)); + break; + case PROP_QLP_COEFF_PRECISION: + g_value_set_uint (value, + FLAC__stream_encoder_get_qlp_coeff_precision (this->encoder)); + break; + case PROP_QLP_COEFF_PREC_SEARCH: + g_value_set_boolean (value, + FLAC__stream_encoder_get_do_qlp_coeff_prec_search (this->encoder)); + break; + case PROP_ESCAPE_CODING: + g_value_set_boolean (value, + FLAC__stream_encoder_get_do_escape_coding (this->encoder)); + break; + case PROP_EXHAUSTIVE_MODEL_SEARCH: + g_value_set_boolean (value, + FLAC__stream_encoder_get_do_exhaustive_model_search (this->encoder)); + break; + case PROP_MIN_RESIDUAL_PARTITION_ORDER: + g_value_set_uint (value, + FLAC__stream_encoder_get_min_residual_partition_order + (this->encoder)); + break; + case PROP_MAX_RESIDUAL_PARTITION_ORDER: + g_value_set_uint (value, + FLAC__stream_encoder_get_max_residual_partition_order + (this->encoder)); + break; + case PROP_RICE_PARAMETER_SEARCH_DIST: + g_value_set_uint (value, + FLAC__stream_encoder_get_rice_parameter_search_dist (this->encoder)); + break; + case PROP_PADDING: + g_value_set_uint (value, this->padding); + break; + case PROP_SEEKPOINTS: + g_value_set_int (value, this->seekpoints); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (this); +} diff --git a/ext/flac/gstflacenc.h b/ext/flac/gstflacenc.h new file mode 100644 index 0000000..9084892 --- /dev/null +++ b/ext/flac/gstflacenc.h @@ -0,0 +1,79 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_FLAC_ENC_H__ +#define __GST_FLAC_ENC_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_FLAC_ENC (gst_flac_enc_get_type()) +#define GST_FLAC_ENC(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, GST_TYPE_FLAC_ENC, GstFlacEnc) +#define GST_FLAC_ENC_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, GST_TYPE_FLAC_ENC, GstFlacEncClass) +#define GST_IS_FLAC_ENC(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, GST_TYPE_FLAC_ENC) +#define GST_IS_FLAC_ENC_CLASS(klass) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_FLAC_ENC) + +typedef struct _GstFlacEnc GstFlacEnc; +typedef struct _GstFlacEncClass GstFlacEncClass; + +struct _GstFlacEnc { + GstAudioEncoder element; + + /* < private > */ + + GstFlowReturn last_flow; /* save flow from last push so we can pass the + * correct flow return upstream in case the push + * fails for some reason */ + + guint64 offset; + gint channels; + gint width; + gint depth; + gint sample_rate; + gint quality; + gboolean stopped; + guint padding; + gint seekpoints; + + FLAC__StreamEncoder *encoder; + + FLAC__StreamMetadata **meta; + + GstTagList * tags; + + gboolean eos; + /* queue headers until we have them all so we can add streamheaders to caps */ + gboolean got_headers; + GList *headers; +}; + +struct _GstFlacEncClass { + GstAudioEncoderClass parent_class; +}; + +GType gst_flac_enc_get_type(void); + +G_END_DECLS + +#endif /* __GST_FLAC_ENC_H__ */ diff --git a/ext/flac/gstflactag.c b/ext/flac/gstflactag.c new file mode 100644 index 0000000..ff06ce9 --- /dev/null +++ b/ext/flac/gstflactag.c @@ -0,0 +1,490 @@ +/* GStreamer + * Copyright (C) 2003 Christophe Fergeau + * Copyright (C) 2008 Jonathan Matthew + * Copyright (C) 2008 Sebastian Dröge + * + * gstflactag.c: plug-in for reading/modifying vorbis comments in flac files + * + * 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-flactag + * @see_also: #flacenc, #flacdec, #GstTagSetter + * + * The flactag element can change the tag contained within a raw + * FLAC stream. Specifically, it modifies the comments header packet + * of the FLAC stream. + * + * Applications can set the tags to write using the #GstTagSetter interface. + * Tags contained withing the FLAC bitstream will be picked up + * automatically (and merged according to the merge mode set via the tag + * setter interface). + * + * + * Example pipelines + * |[ + * gst-launch -v filesrc location=foo.flac ! flactag ! filesink location=bar.flac + * ]| This element is not useful with gst-launch, because it does not support + * setting the tags on a #GstTagSetter interface. Conceptually, the element + * will usually be used in this order though. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "gstflactag.h" + +GST_DEBUG_CATEGORY_STATIC (flactag_debug); +#define GST_CAT_DEFAULT flactag_debug + +/* elementfactory information */ +static GstStaticPadTemplate flac_tag_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-flac") + ); + +static GstStaticPadTemplate flac_tag_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-flac") + ); + +/* signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 + /* FILL ME */ +}; + +static void gst_flac_tag_dispose (GObject * object); + +static GstFlowReturn gst_flac_tag_chain (GstPad * pad, GstBuffer * buffer); + +static GstStateChangeReturn gst_flac_tag_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_flac_tag_sink_setcaps (GstPad * pad, GstCaps * caps); + +static void +gst_flac_tag_setup_interfaces (GType flac_tag_type) +{ + static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; + + g_type_add_interface_static (flac_tag_type, GST_TYPE_TAG_SETTER, + &tag_setter_info); +} + +GST_BOILERPLATE_FULL (GstFlacTag, gst_flac_tag, GstElement, GST_TYPE_ELEMENT, + gst_flac_tag_setup_interfaces); + +static void +gst_flac_tag_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "FLAC tagger", + "Formatter/Metadata", + "Rewrite tags in a FLAC file", "Christophe Fergeau "); + + gst_element_class_add_static_pad_template (element_class, + &flac_tag_sink_template); + gst_element_class_add_static_pad_template (element_class, + &flac_tag_src_template); + + GST_DEBUG_CATEGORY_INIT (flactag_debug, "flactag", 0, "flac tag rewriter"); +} + +static void +gst_flac_tag_class_init (GstFlacTagClass * klass) +{ + GstElementClass *gstelement_class; + GObjectClass *gobject_class; + + gstelement_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->dispose = gst_flac_tag_dispose; + gstelement_class->change_state = gst_flac_tag_change_state; +} + +static void +gst_flac_tag_dispose (GObject * object) +{ + GstFlacTag *tag = GST_FLAC_TAG (object); + + if (tag->adapter) { + g_object_unref (tag->adapter); + tag->adapter = NULL; + } + if (tag->vorbiscomment) { + gst_buffer_unref (tag->vorbiscomment); + tag->vorbiscomment = NULL; + } + if (tag->tags) { + gst_tag_list_free (tag->tags); + tag->tags = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + + +static void +gst_flac_tag_init (GstFlacTag * tag, GstFlacTagClass * klass) +{ + /* create the sink and src pads */ + tag->sinkpad = + gst_pad_new_from_static_template (&flac_tag_sink_template, "sink"); + gst_pad_set_chain_function (tag->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_tag_chain)); + gst_pad_set_setcaps_function (tag->sinkpad, + GST_DEBUG_FUNCPTR (gst_flac_tag_sink_setcaps)); + gst_element_add_pad (GST_ELEMENT (tag), tag->sinkpad); + + tag->srcpad = + gst_pad_new_from_static_template (&flac_tag_src_template, "src"); + gst_element_add_pad (GST_ELEMENT (tag), tag->srcpad); + + tag->adapter = gst_adapter_new (); +} + +static gboolean +gst_flac_tag_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstFlacTag *tag = GST_FLAC_TAG (GST_PAD_PARENT (pad)); + + return gst_pad_set_caps (tag->srcpad, caps); +} + +#define FLAC_MAGIC "fLaC" +#define FLAC_MAGIC_SIZE (sizeof (FLAC_MAGIC) - 1) + +static GstFlowReturn +gst_flac_tag_chain (GstPad * pad, GstBuffer * buffer) +{ + GstFlacTag *tag; + GstFlowReturn ret; + + ret = GST_FLOW_OK; + tag = GST_FLAC_TAG (gst_pad_get_parent (pad)); + + gst_adapter_push (tag->adapter, buffer); + + /* Initial state, we don't even know if we are dealing with a flac file */ + if (tag->state == GST_FLAC_TAG_STATE_INIT) { + GstBuffer *id_buffer; + + if (gst_adapter_available (tag->adapter) < sizeof (FLAC_MAGIC)) + goto cleanup; + + id_buffer = gst_adapter_take_buffer (tag->adapter, FLAC_MAGIC_SIZE); + GST_DEBUG_OBJECT (tag, "looking for " FLAC_MAGIC " identifier"); + if (memcmp (GST_BUFFER_DATA (id_buffer), FLAC_MAGIC, FLAC_MAGIC_SIZE) == 0) { + + GST_DEBUG_OBJECT (tag, "pushing " FLAC_MAGIC " identifier buffer"); + gst_buffer_set_caps (id_buffer, GST_PAD_CAPS (tag->srcpad)); + ret = gst_pad_push (tag->srcpad, id_buffer); + if (ret != GST_FLOW_OK) + goto cleanup; + + tag->state = GST_FLAC_TAG_STATE_METADATA_BLOCKS; + } else { + /* FIXME: does that work well with FLAC files containing ID3v2 tags ? */ + gst_buffer_unref (id_buffer); + GST_ELEMENT_ERROR (tag, STREAM, WRONG_TYPE, (NULL), (NULL)); + ret = GST_FLOW_ERROR; + } + } + + + /* The fLaC magic string has been skipped, try to detect the beginning + * of a metadata block + */ + if (tag->state == GST_FLAC_TAG_STATE_METADATA_BLOCKS) { + guint size; + guint type; + gboolean is_last; + const guint8 *block_header; + + g_assert (tag->metadata_block_size == 0); + g_assert (tag->metadata_last_block == FALSE); + + /* The header of a flac metadata block is 4 bytes long: + * 1st bit: indicates whether this is the last metadata info block + * 7 next bits: 4 if vorbis comment block + * 24 next bits: size of the metadata to follow (big endian) + */ + if (gst_adapter_available (tag->adapter) < 4) + goto cleanup; + + block_header = gst_adapter_peek (tag->adapter, 4); + + is_last = ((block_header[0] & 0x80) == 0x80); + type = block_header[0] & 0x7F; + size = (block_header[1] << 16) + | (block_header[2] << 8) + | block_header[3]; + + /* The 4 bytes long header isn't included in the metadata size */ + tag->metadata_block_size = size + 4; + tag->metadata_last_block = is_last; + + GST_DEBUG_OBJECT (tag, + "got metadata block: %d bytes, type %d, is vorbiscomment: %d, is last: %d", + size, type, (type == 0x04), is_last); + + /* Metadata blocks of type 4 are vorbis comment blocks */ + if (type == 0x04) { + tag->state = GST_FLAC_TAG_STATE_VC_METADATA_BLOCK; + } else { + tag->state = GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK; + } + } + + + /* Reads a metadata block */ + if ((tag->state == GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK) || + (tag->state == GST_FLAC_TAG_STATE_VC_METADATA_BLOCK)) { + GstBuffer *metadata_buffer; + + if (gst_adapter_available (tag->adapter) < tag->metadata_block_size) + goto cleanup; + + metadata_buffer = gst_adapter_take_buffer (tag->adapter, + tag->metadata_block_size); + /* clear the is-last flag, as the last metadata block will + * be the vorbis comment block which we will build ourselves. + */ + GST_BUFFER_DATA (metadata_buffer)[0] &= (~0x80); + + if (tag->state == GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK) { + GST_DEBUG_OBJECT (tag, "pushing metadata block buffer"); + gst_buffer_set_caps (metadata_buffer, GST_PAD_CAPS (tag->srcpad)); + ret = gst_pad_push (tag->srcpad, metadata_buffer); + if (ret != GST_FLOW_OK) + goto cleanup; + } else { + tag->vorbiscomment = metadata_buffer; + } + tag->metadata_block_size = 0; + tag->state = GST_FLAC_TAG_STATE_METADATA_NEXT_BLOCK; + } + + /* This state is mainly used to be able to stop as soon as we read + * a vorbiscomment block from the flac file if we are in an only output + * tags mode + */ + if (tag->state == GST_FLAC_TAG_STATE_METADATA_NEXT_BLOCK) { + /* Check if in the previous iteration we read a vorbis comment metadata + * block, and stop now if the user only wants to read tags + */ + if (tag->vorbiscomment != NULL) { + /* We found some tags, try to parse them and notify the other elements + * that we encountered some tags + */ + GST_DEBUG_OBJECT (tag, "emitting vorbiscomment tags"); + tag->tags = gst_tag_list_from_vorbiscomment_buffer (tag->vorbiscomment, + GST_BUFFER_DATA (tag->vorbiscomment), 4, NULL); + if (tag->tags != NULL) { + gst_element_found_tags (GST_ELEMENT (tag), + gst_tag_list_copy (tag->tags)); + } + + gst_buffer_unref (tag->vorbiscomment); + tag->vorbiscomment = NULL; + } + + /* Skip to next state */ + if (tag->metadata_last_block == FALSE) { + tag->state = GST_FLAC_TAG_STATE_METADATA_BLOCKS; + } else { + tag->state = GST_FLAC_TAG_STATE_ADD_VORBIS_COMMENT; + } + } + + + /* Creates a vorbis comment block from the metadata which was set + * on the gstreamer element, and add it to the flac stream + */ + if (tag->state == GST_FLAC_TAG_STATE_ADD_VORBIS_COMMENT) { + GstBuffer *buffer; + gint size; + const GstTagList *user_tags; + GstTagList *merged_tags; + + /* merge the tag lists */ + user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (tag)); + if (user_tags != NULL) { + merged_tags = gst_tag_list_merge (user_tags, tag->tags, + gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (tag))); + } else { + merged_tags = gst_tag_list_copy (tag->tags); + } + + if (merged_tags == NULL) { + /* If we get a NULL list of tags, we must generate a padding block + * which is marked as the last metadata block, otherwise we'll + * end up with a corrupted flac file. + */ + GST_WARNING_OBJECT (tag, "No tags found"); + buffer = gst_buffer_new_and_alloc (12); + if (buffer == NULL) { + GST_ELEMENT_ERROR (tag, CORE, TOO_LAZY, (NULL), + ("Error creating 12-byte buffer for padding block")); + ret = GST_FLOW_ERROR; + goto cleanup; + } + memset (GST_BUFFER_DATA (buffer), 0, GST_BUFFER_SIZE (buffer)); + GST_BUFFER_DATA (buffer)[0] = 0x81; /* 0x80 = Last metadata block, + * 0x01 = padding block + */ + } else { + guchar header[4]; + + memset (header, 0, sizeof (header)); + header[0] = 0x84; /* 0x80 = Last metadata block, + * 0x04 = vorbiscomment block + */ + buffer = gst_tag_list_to_vorbiscomment_buffer (merged_tags, header, + sizeof (header), NULL); + GST_DEBUG_OBJECT (tag, "Writing tags %" GST_PTR_FORMAT, merged_tags); + gst_tag_list_free (merged_tags); + if (buffer == NULL) { + GST_ELEMENT_ERROR (tag, CORE, TAG, (NULL), + ("Error converting tag list to vorbiscomment buffer")); + ret = GST_FLOW_ERROR; + goto cleanup; + } + size = GST_BUFFER_SIZE (buffer) - 4; + if ((size > 0xFFFFFF) || (size < 0)) { + /* FLAC vorbis comment blocks are limited to 2^24 bytes, + * while the vorbis specs allow more than that. Shouldn't + * be a real world problem though + */ + GST_ELEMENT_ERROR (tag, CORE, TAG, (NULL), + ("Vorbis comment of size %d too long", size)); + ret = GST_FLOW_ERROR; + goto cleanup; + } + + /* Get rid of the framing bit at the end of the vorbiscomment buffer + * if it exists since libFLAC seems to lose sync because of this + * bit in gstflacdec + */ + if (GST_BUFFER_DATA (buffer)[GST_BUFFER_SIZE (buffer) - 1] == 1) { + GstBuffer *sub; + + sub = gst_buffer_create_sub (buffer, 0, GST_BUFFER_SIZE (buffer) - 1); + gst_buffer_unref (buffer); + buffer = sub; + } + } + + /* The 4 byte metadata block header isn't accounted for in the total + * size of the metadata block + */ + size = GST_BUFFER_SIZE (buffer) - 4; + + GST_BUFFER_DATA (buffer)[1] = ((size & 0xFF0000) >> 16); + GST_BUFFER_DATA (buffer)[2] = ((size & 0x00FF00) >> 8); + GST_BUFFER_DATA (buffer)[3] = (size & 0x0000FF); + GST_DEBUG_OBJECT (tag, "pushing %d byte vorbiscomment buffer", + GST_BUFFER_SIZE (buffer)); + gst_buffer_set_caps (buffer, GST_PAD_CAPS (tag->srcpad)); + ret = gst_pad_push (tag->srcpad, buffer); + if (ret != GST_FLOW_OK) { + goto cleanup; + } + tag->state = GST_FLAC_TAG_STATE_AUDIO_DATA; + } + + /* The metadata blocks have been read, now we are reading audio data */ + if (tag->state == GST_FLAC_TAG_STATE_AUDIO_DATA) { + GstBuffer *buffer; + guint avail; + + avail = gst_adapter_available (tag->adapter); + if (avail > 0) { + buffer = gst_adapter_take_buffer (tag->adapter, avail); + gst_buffer_set_caps (buffer, GST_PAD_CAPS (tag->srcpad)); + ret = gst_pad_push (tag->srcpad, buffer); + } + } + +cleanup: + gst_object_unref (tag); + + return ret; +} + + +static GstStateChangeReturn +gst_flac_tag_change_state (GstElement * element, GstStateChange transition) +{ + GstFlacTag *tag; + + tag = GST_FLAC_TAG (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: + /* do something to get out of the chain function faster */ + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_adapter_clear (tag->adapter); + if (tag->vorbiscomment) { + gst_buffer_unref (tag->vorbiscomment); + tag->vorbiscomment = NULL; + } + if (tag->tags) { + gst_tag_list_free (tag->tags); + tag->tags = NULL; + } + tag->metadata_block_size = 0; + tag->metadata_last_block = FALSE; + tag->state = GST_FLAC_TAG_STATE_INIT; + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + } + + return parent_class->change_state (element, transition); +} diff --git a/ext/flac/gstflactag.h b/ext/flac/gstflactag.h new file mode 100644 index 0000000..a6f90f5 --- /dev/null +++ b/ext/flac/gstflactag.h @@ -0,0 +1,78 @@ +/* GStreamer + * Copyright (C) 2003 Christophe Fergeau + * Copyright (C) 2008 Jonathan Matthew + * Copyright (C) 2008 Sebastian Dröge + * + * gstflactag.c: plug-in for reading/modifying vorbis comments in flac files + * + * 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_FLAC_TAG_H +#define GST_FLAC_TAG_H + +#include +#include + +#define GST_TYPE_FLAC_TAG (gst_flac_tag_get_type()) +#define GST_FLAC_TAG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLAC_TAG, GstFlacTag)) +#define GST_FLAC_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLAC_TAG, GstFlacTag)) +#define GST_IS_FLAC_TAG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLAC_TAG)) +#define GST_IS_FLAC_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLAC_TAG)) + +typedef struct _GstFlacTag GstFlacTag; +typedef struct _GstFlacTagClass GstFlacTagClass; + +typedef enum +{ + GST_FLAC_TAG_STATE_INIT, + GST_FLAC_TAG_STATE_METADATA_BLOCKS, + GST_FLAC_TAG_STATE_METADATA_NEXT_BLOCK, + GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK, + GST_FLAC_TAG_STATE_VC_METADATA_BLOCK, + GST_FLAC_TAG_STATE_ADD_VORBIS_COMMENT, + GST_FLAC_TAG_STATE_AUDIO_DATA +} +GstFlacTagState; + +struct _GstFlacTag +{ + GstElement element; + + /* < private > */ + + /* pads */ + GstPad *sinkpad; + GstPad *srcpad; + + GstFlacTagState state; + + GstAdapter *adapter; + GstBuffer *vorbiscomment; + GstTagList *tags; + + guint metadata_block_size; + gboolean metadata_last_block; +}; + +struct _GstFlacTagClass +{ + GstElementClass parent_class; +}; + +GType gst_flac_tag_get_type (void); + +#endif /* GST_FLAC_TAG_H */ diff --git a/ext/gconf/Makefile.am b/ext/gconf/Makefile.am new file mode 100644 index 0000000..0f1cffb --- /dev/null +++ b/ext/gconf/Makefile.am @@ -0,0 +1,27 @@ +plugin_LTLIBRARIES = libgstgconfelements.la + +libgstgconfelements_la_SOURCES = \ + gstgconfaudiosink.c \ + gstgconfaudiosrc.c \ + gstgconfelements.c \ + gstgconfvideosink.c \ + gstgconfvideosrc.c \ + gstswitchsink.c \ + gstswitchsrc.c \ + gstgconf.c + +DIR_CFLAGS = -DGST_GCONF_DIR=\"/system/gstreamer/@GST_MAJORMINOR@\" +libgstgconfelements_la_CFLAGS = $(GST_CFLAGS) $(GCONF_CFLAGS) $(DIR_CFLAGS) +libgstgconfelements_la_LIBADD = $(GST_LIBS) $(GCONF_LIBS) +libgstgconfelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstgconfelements_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + gstgconfaudiosink.h \ + gstgconfaudiosrc.h \ + gstgconfelements.h \ + gstgconfvideosink.h \ + gstgconfvideosrc.h \ + gstswitchsink.h \ + gstswitchsrc.h \ + gstgconf.h diff --git a/ext/gconf/Makefile.in b/ext/gconf/Makefile.in new file mode 100644 index 0000000..ebcd7e1 --- /dev/null +++ b/ext/gconf/Makefile.in @@ -0,0 +1,888 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/gconf +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstgconfelements_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstgconfelements_la_OBJECTS = \ + libgstgconfelements_la-gstgconfaudiosink.lo \ + libgstgconfelements_la-gstgconfaudiosrc.lo \ + libgstgconfelements_la-gstgconfelements.lo \ + libgstgconfelements_la-gstgconfvideosink.lo \ + libgstgconfelements_la-gstgconfvideosrc.lo \ + libgstgconfelements_la-gstswitchsink.lo \ + libgstgconfelements_la-gstswitchsrc.lo \ + libgstgconfelements_la-gstgconf.lo +libgstgconfelements_la_OBJECTS = $(am_libgstgconfelements_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstgconfelements_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) \ + $(libgstgconfelements_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstgconfelements_la_SOURCES) +DIST_SOURCES = $(libgstgconfelements_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstgconfelements.la +libgstgconfelements_la_SOURCES = \ + gstgconfaudiosink.c \ + gstgconfaudiosrc.c \ + gstgconfelements.c \ + gstgconfvideosink.c \ + gstgconfvideosrc.c \ + gstswitchsink.c \ + gstswitchsrc.c \ + gstgconf.c + +DIR_CFLAGS = -DGST_GCONF_DIR=\"/system/gstreamer/@GST_MAJORMINOR@\" +libgstgconfelements_la_CFLAGS = $(GST_CFLAGS) $(GCONF_CFLAGS) $(DIR_CFLAGS) +libgstgconfelements_la_LIBADD = $(GST_LIBS) $(GCONF_LIBS) +libgstgconfelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstgconfelements_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + gstgconfaudiosink.h \ + gstgconfaudiosrc.h \ + gstgconfelements.h \ + gstgconfvideosink.h \ + gstgconfvideosrc.h \ + gstswitchsink.h \ + gstswitchsrc.h \ + gstgconf.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/gconf/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/gconf/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstgconfelements.la: $(libgstgconfelements_la_OBJECTS) $(libgstgconfelements_la_DEPENDENCIES) $(EXTRA_libgstgconfelements_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstgconfelements_la_LINK) -rpath $(plugindir) $(libgstgconfelements_la_OBJECTS) $(libgstgconfelements_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfaudiosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfaudiosrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfelements.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfvideosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfvideosrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstswitchsink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstswitchsrc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstgconfelements_la-gstgconfaudiosink.lo: gstgconfaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosink.Tpo -c -o libgstgconfelements_la-gstgconfaudiosink.lo `test -f 'gstgconfaudiosink.c' || echo '$(srcdir)/'`gstgconfaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosink.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfaudiosink.c' object='libgstgconfelements_la-gstgconfaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfaudiosink.lo `test -f 'gstgconfaudiosink.c' || echo '$(srcdir)/'`gstgconfaudiosink.c + +libgstgconfelements_la-gstgconfaudiosrc.lo: gstgconfaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosrc.Tpo -c -o libgstgconfelements_la-gstgconfaudiosrc.lo `test -f 'gstgconfaudiosrc.c' || echo '$(srcdir)/'`gstgconfaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosrc.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfaudiosrc.c' object='libgstgconfelements_la-gstgconfaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfaudiosrc.lo `test -f 'gstgconfaudiosrc.c' || echo '$(srcdir)/'`gstgconfaudiosrc.c + +libgstgconfelements_la-gstgconfelements.lo: gstgconfelements.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfelements.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfelements.Tpo -c -o libgstgconfelements_la-gstgconfelements.lo `test -f 'gstgconfelements.c' || echo '$(srcdir)/'`gstgconfelements.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfelements.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfelements.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfelements.c' object='libgstgconfelements_la-gstgconfelements.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfelements.lo `test -f 'gstgconfelements.c' || echo '$(srcdir)/'`gstgconfelements.c + +libgstgconfelements_la-gstgconfvideosink.lo: gstgconfvideosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfvideosink.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfvideosink.Tpo -c -o libgstgconfelements_la-gstgconfvideosink.lo `test -f 'gstgconfvideosink.c' || echo '$(srcdir)/'`gstgconfvideosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfvideosink.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfvideosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfvideosink.c' object='libgstgconfelements_la-gstgconfvideosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfvideosink.lo `test -f 'gstgconfvideosink.c' || echo '$(srcdir)/'`gstgconfvideosink.c + +libgstgconfelements_la-gstgconfvideosrc.lo: gstgconfvideosrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfvideosrc.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfvideosrc.Tpo -c -o libgstgconfelements_la-gstgconfvideosrc.lo `test -f 'gstgconfvideosrc.c' || echo '$(srcdir)/'`gstgconfvideosrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfvideosrc.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfvideosrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfvideosrc.c' object='libgstgconfelements_la-gstgconfvideosrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfvideosrc.lo `test -f 'gstgconfvideosrc.c' || echo '$(srcdir)/'`gstgconfvideosrc.c + +libgstgconfelements_la-gstswitchsink.lo: gstswitchsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstswitchsink.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstswitchsink.Tpo -c -o libgstgconfelements_la-gstswitchsink.lo `test -f 'gstswitchsink.c' || echo '$(srcdir)/'`gstswitchsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstswitchsink.Tpo $(DEPDIR)/libgstgconfelements_la-gstswitchsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstswitchsink.c' object='libgstgconfelements_la-gstswitchsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstswitchsink.lo `test -f 'gstswitchsink.c' || echo '$(srcdir)/'`gstswitchsink.c + +libgstgconfelements_la-gstswitchsrc.lo: gstswitchsrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstswitchsrc.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstswitchsrc.Tpo -c -o libgstgconfelements_la-gstswitchsrc.lo `test -f 'gstswitchsrc.c' || echo '$(srcdir)/'`gstswitchsrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstswitchsrc.Tpo $(DEPDIR)/libgstgconfelements_la-gstswitchsrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstswitchsrc.c' object='libgstgconfelements_la-gstswitchsrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstswitchsrc.lo `test -f 'gstswitchsrc.c' || echo '$(srcdir)/'`gstswitchsrc.c + +libgstgconfelements_la-gstgconf.lo: gstgconf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconf.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconf.Tpo -c -o libgstgconfelements_la-gstgconf.lo `test -f 'gstgconf.c' || echo '$(srcdir)/'`gstgconf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconf.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconf.c' object='libgstgconfelements_la-gstgconf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconf.lo `test -f 'gstgconf.c' || echo '$(srcdir)/'`gstgconf.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/gconf/gstgconf.c b/ext/gconf/gstgconf.c new file mode 100644 index 0000000..eee80c9 --- /dev/null +++ b/ext/gconf/gstgconf.c @@ -0,0 +1,304 @@ +/* GStreamer + * nf_get_default_audio_sink + * Copyright (C) <2002> Thomas Vander Stichele + * Copyright (C) <2006> Jürg Billeter + * + * 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 library handles interaction with GConf + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstgconf.h" +#include "gstgconfelements.h" /* for debug category */ + +#ifndef GST_GCONF_DIR +#error "GST_GCONF_DIR is not defined !" +#endif + +static GConfClient *_gst_gconf_client = NULL; /* GConf connection */ + + +/* internal functions */ + +static GConfClient * +gst_gconf_get_client (void) +{ + if (!_gst_gconf_client) + _gst_gconf_client = gconf_client_get_default (); + + return _gst_gconf_client; +} + +/* external functions */ + +/** + * gst_gconf_get_string: + * @key: a #gchar corresponding to the key you want to get. + * + * Get GConf key @key's string value. + * + * Returns: a newly allocated #gchar string containing @key's value, + * or NULL in the case of an error.. + */ +gchar * +gst_gconf_get_string (const gchar * key) +{ + GError *error = NULL; + gchar *value = NULL; + gchar *full_key; + + if (!g_str_has_prefix (key, GST_GCONF_DIR)) + full_key = g_strdup_printf ("%s/%s", GST_GCONF_DIR, key); + else + full_key = g_strdup (key); + + value = gconf_client_get_string (gst_gconf_get_client (), full_key, &error); + g_free (full_key); + + if (error) { + g_warning ("gst_gconf_get_string: error: %s\n", error->message); + g_error_free (error); + return NULL; + } + + return value; +} + +const gchar * +gst_gconf_get_key_for_sink_profile (GstGConfProfile profile) +{ + switch (profile) { + case GCONF_PROFILE_SOUNDS: + return GST_GCONF_DIR "/" GST_GCONF_AUDIOSINK_KEY; + case GCONF_PROFILE_MUSIC: + return GST_GCONF_DIR "/" GST_GCONF_MUSIC_AUDIOSINK_KEY; + case GCONF_PROFILE_CHAT: + return GST_GCONF_DIR "/" GST_GCONF_CHAT_AUDIOSINK_KEY; + default: + break; + } + + g_return_val_if_reached (GST_GCONF_DIR "/" GST_GCONF_AUDIOSINK_KEY); +} + +/** + * gst_gconf_set_string: + * @key: a #gchar corresponding to the key you want to set. + * @value: a #gchar containing key value. + * + * Set GConf key @key to string value @value. + */ +void +gst_gconf_set_string (const gchar * key, const gchar * value) +{ + GError *error = NULL; + gchar *full_key; + + if (!g_str_has_prefix (key, GST_GCONF_DIR)) + full_key = g_strdup_printf ("%s/%s", GST_GCONF_DIR, key); + else + full_key = g_strdup (key); + + gconf_client_set_string (gst_gconf_get_client (), full_key, value, &error); + if (error) { + GST_ERROR ("gst_gconf_set_string: error: %s\n", error->message); + g_error_free (error); + } + g_free (full_key); +} + +/** + * gst_gconf_render_bin_from_key: + * @key: a #gchar string corresponding to a GConf key. + * + * Render bin from GConf key @key. + * + * Returns: a #GstElement containing the rendered bin. + */ +GstElement * +gst_gconf_render_bin_from_key (const gchar * key) +{ + GstElement *bin = NULL; + gchar *value; + + value = gst_gconf_get_string (key); + + GST_LOG ("%s = %s", GST_STR_NULL (key), GST_STR_NULL (value)); + + if (value) { + GError *err = NULL; + + bin = gst_parse_bin_from_description (value, TRUE, &err); + if (err) { + GST_ERROR ("gconf: error creating bin '%s': %s", value, err->message); + g_error_free (err); + } + + g_free (value); + } + return bin; +} + +/** + * gst_gconf_render_bin_with_default: + * @bin: a #gchar string describing the pipeline to construct. + * @default_sink: an element to use as default if the given pipeline fails to construct. + * + * Render bin from description @bin using @default_sink element as a fallback. + * + * Returns: a #GstElement containing the rendered bin. + */ +GstElement * +gst_gconf_render_bin_with_default (const gchar * bin, + const gchar * default_sink) +{ + GstElement *ret = NULL; + GError *err = NULL; + + if (bin != NULL) + ret = gst_parse_bin_from_description (bin, TRUE, &err); + + if (ret == NULL || err != NULL) { + if (err) { + GST_DEBUG ("Could not create audio sink from GConf settings: %s", + err->message); + g_error_free (err); + } else { + GST_DEBUG ("Could not create audio sink from GConf settings"); + } + + ret = gst_element_factory_make (default_sink, NULL); + + if (!ret) + g_warning + ("Could not build GConf audio sink and the replacement %s doesn't work", + DEFAULT_AUDIOSINK); + } + + return ret; +} + +/** + * gst_gconf_get_default_video_sink: + * + * Render video output bin from GStreamer GConf key : "default/videosink". + * If key is invalid, the default video sink for the platform is used + * (typically xvimagesink or ximagesink). + * + * Returns: a #GstElement containing the video output bin, or NULL if + * everything failed. + */ +GstElement * +gst_gconf_get_default_video_sink (void) +{ + GstElement *ret = gst_gconf_render_bin_from_key (GST_GCONF_VIDEOSINK_KEY); + + if (!ret) { + ret = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL); + + if (!ret) + g_warning ("No GConf default video sink key and %s doesn't work", + DEFAULT_VIDEOSINK); + } + + return ret; +} + +/** + * gst_gconf_get_default_audio_src: + * + * Render audio acquisition bin from GStreamer GConf key : "default/audiosrc". + * If key is invalid, the default audio source for the plaform is used. + * (typically osssrc or sunaudiosrc). + * + * Returns: a #GstElement containing the audio source bin, or NULL if + * everything failed. + */ +GstElement * +gst_gconf_get_default_audio_src (void) +{ + GstElement *ret = gst_gconf_render_bin_from_key (GST_GCONF_AUDIOSRC_KEY); + + if (!ret) { + ret = gst_element_factory_make (DEFAULT_AUDIOSRC, NULL); + + if (!ret) + g_warning ("No GConf default audio src key and %s doesn't work", + DEFAULT_AUDIOSRC); + } + + return ret; +} + +/** + * gst_gconf_get_default_video_src: + * + * Render video acquisition bin from GStreamer GConf key : + * "default/videosrc". If key is invalid, the default video source + * for the platform is used (typically videotestsrc). + * + * Returns: a #GstElement containing the video source bin, or NULL if + * everything failed. + */ +GstElement * +gst_gconf_get_default_video_src (void) +{ + GstElement *ret = gst_gconf_render_bin_from_key (GST_GCONF_VIDEOSRC_KEY); + + if (!ret) { + ret = gst_element_factory_make (DEFAULT_VIDEOSRC, NULL); + + if (!ret) + g_warning ("No GConf default video src key and %s doesn't work", + DEFAULT_VIDEOSRC); + } + + return ret; +} + +/** + * gst_gconf_get_default_visualization_element: + * + * Render visualization bin from GStreamer GConf key : "default/visualization". + * If key is invalid, the default visualization element is used. + * + * Returns: a #GstElement containing the visualization bin, or NULL if + * everything failed. + */ +GstElement * +gst_gconf_get_default_visualization_element (void) +{ + GstElement *ret = gst_gconf_render_bin_from_key ("default/visualization"); + + if (!ret) { + ret = gst_element_factory_make (DEFAULT_VISUALIZER, NULL); + + if (!ret) + g_warning + ("No GConf default visualization plugin key and %s doesn't work", + DEFAULT_VISUALIZER); + } + + return ret; +} diff --git a/ext/gconf/gstgconf.h b/ext/gconf/gstgconf.h new file mode 100644 index 0000000..b1153e9 --- /dev/null +++ b/ext/gconf/gstgconf.h @@ -0,0 +1,66 @@ +/* GStreamer + * Copyright (C) <2002> Thomas Vander Stichele + * Copyright (C) <2006> Jürg Billeter + * + * 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_GCONF_H +#define GST_GCONF_H + +/* + * this library handles interaction with GConf + */ + +#include +#include + +G_BEGIN_DECLS + +#define GST_GCONF_AUDIOSRC_KEY "default/audiosrc" +#define GST_GCONF_AUDIOSINK_KEY "default/audiosink" +#define GST_GCONF_MUSIC_AUDIOSINK_KEY "default/musicaudiosink" +#define GST_GCONF_CHAT_AUDIOSINK_KEY "default/chataudiosink" +#define GST_GCONF_VIDEOSRC_KEY "default/videosrc" +#define GST_GCONF_VIDEOSINK_KEY "default/videosink" + +typedef enum +{ + GCONF_PROFILE_SOUNDS, + GCONF_PROFILE_MUSIC, + GCONF_PROFILE_CHAT, + GCONF_PROFILE_NONE /* Internal value only */ +} GstGConfProfile; + +gchar * gst_gconf_get_string (const gchar *key); +void gst_gconf_set_string (const gchar *key, + const gchar *value); + +const gchar * gst_gconf_get_key_for_sink_profile (GstGConfProfile profile); + +GstElement * gst_gconf_render_bin_from_key (const gchar *key); +GstElement * gst_gconf_render_bin_with_default (const gchar *bin, + const gchar *default_sink); + +GstElement * gst_gconf_get_default_video_sink (void); +GstElement * gst_gconf_get_default_audio_sink (int profile); +GstElement * gst_gconf_get_default_video_src (void); +GstElement * gst_gconf_get_default_audio_src (void); +GstElement * gst_gconf_get_default_visualization_element (void); + +G_END_DECLS + +#endif /* GST_GCONF_H */ diff --git a/ext/gconf/gstgconfaudiosink.c b/ext/gconf/gstgconfaudiosink.c new file mode 100644 index 0000000..d60f2be --- /dev/null +++ b/ext/gconf/gstgconfaudiosink.c @@ -0,0 +1,310 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Jürg Billeter + * + * 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-gconfaudiosink + * + * This element outputs sound to the audiosink that has been configured in + * GConf by the user. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=foo.ogg ! decodebin ! audioconvert ! audioresample ! gconfaudiosink + * ]| Play on configured audiosink + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstgconfelements.h" +#include "gstgconfaudiosink.h" + +static void gst_gconf_audio_sink_dispose (GObject * object); +static void gst_gconf_audio_sink_finalize (GstGConfAudioSink * sink); +static void cb_change_child (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data); +static GstStateChangeReturn +gst_gconf_audio_sink_change_state (GstElement * element, + GstStateChange transition); +static void gst_gconf_switch_profile (GstGConfAudioSink * sink, + GstGConfProfile profile); + +enum +{ + PROP_0, + PROP_PROFILE +}; + +GST_BOILERPLATE (GstGConfAudioSink, gst_gconf_audio_sink, GstSwitchSink, + GST_TYPE_SWITCH_SINK); + +static void gst_gconf_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_gconf_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +gst_gconf_audio_sink_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (eklass, "GConf audio sink", + "Sink/Audio", + "Audio sink embedding the GConf-settings for audio output", + "Jan Schmidt "); +} + +#define GST_TYPE_GCONF_PROFILE (gst_gconf_profile_get_type()) +static GType +gst_gconf_profile_get_type (void) +{ + static GType gconf_profile_type = 0; + static const GEnumValue gconf_profiles[] = { + {GCONF_PROFILE_SOUNDS, "Sound Events", "sounds"}, + {GCONF_PROFILE_MUSIC, "Music and Movies", "music"}, + {GCONF_PROFILE_CHAT, "Audio/Video Conferencing", "chat"}, + {0, NULL, NULL} + }; + + if (!gconf_profile_type) { + gconf_profile_type = + g_enum_register_static ("GstGConfProfile", gconf_profiles); + } + return gconf_profile_type; +} + +static void +gst_gconf_audio_sink_class_init (GstGConfAudioSinkClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + oklass->set_property = gst_gconf_audio_sink_set_property; + oklass->get_property = gst_gconf_audio_sink_get_property; + oklass->dispose = gst_gconf_audio_sink_dispose; + oklass->finalize = (GObjectFinalizeFunc) gst_gconf_audio_sink_finalize; + eklass->change_state = gst_gconf_audio_sink_change_state; + + g_object_class_install_property (oklass, PROP_PROFILE, + g_param_spec_enum ("profile", "Profile", "Profile", + GST_TYPE_GCONF_PROFILE, GCONF_PROFILE_SOUNDS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_gconf_audio_sink_reset (GstGConfAudioSink * sink) +{ + gst_switch_sink_set_child (GST_SWITCH_SINK (sink), NULL); + + g_free (sink->gconf_str); + sink->gconf_str = NULL; +} + +static void +gst_gconf_audio_sink_init (GstGConfAudioSink * sink, + GstGConfAudioSinkClass * g_class) +{ + gst_gconf_audio_sink_reset (sink); + + sink->client = gconf_client_get_default (); + gconf_client_add_dir (sink->client, GST_GCONF_DIR "/default", + GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + + gst_gconf_switch_profile (sink, GCONF_PROFILE_SOUNDS); +} + +static void +gst_gconf_audio_sink_dispose (GObject * object) +{ + GstGConfAudioSink *sink = GST_GCONF_AUDIO_SINK (object); + + if (sink->client) { + gst_gconf_switch_profile (sink, GCONF_PROFILE_NONE); + g_object_unref (G_OBJECT (sink->client)); + sink->client = NULL; + } + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static void +gst_gconf_audio_sink_finalize (GstGConfAudioSink * sink) +{ + g_free (sink->gconf_str); + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, ((GObject *) (sink))); +} + +static gboolean +do_change_child (GstGConfAudioSink * sink) +{ + const gchar *key; + gchar *new_gconf_str; + GstElement *new_kid; + + if (sink->profile == GCONF_PROFILE_NONE) + return FALSE; /* Can't switch to a 'NONE' sink */ + + key = gst_gconf_get_key_for_sink_profile (sink->profile); + new_gconf_str = gst_gconf_get_string (key); + + GST_LOG_OBJECT (sink, "old gconf string: %s", GST_STR_NULL (sink->gconf_str)); + GST_LOG_OBJECT (sink, "new gconf string: %s", GST_STR_NULL (new_gconf_str)); + + if (new_gconf_str != NULL && sink->gconf_str != NULL && + (strlen (new_gconf_str) == 0 || + strcmp (sink->gconf_str, new_gconf_str) == 0)) { + g_free (new_gconf_str); + GST_DEBUG_OBJECT (sink, + "GConf key was updated, but it didn't change. Ignoring"); + return TRUE; + } + + GST_DEBUG_OBJECT (sink, "GConf key changed: '%s' to '%s'", + GST_STR_NULL (sink->gconf_str), GST_STR_NULL (new_gconf_str)); + + GST_DEBUG_OBJECT (sink, "Creating new child for profile %d", sink->profile); + new_kid = + gst_gconf_render_bin_with_default (new_gconf_str, DEFAULT_AUDIOSINK); + + if (new_kid == NULL) { + GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), + ("Failed to render audio sink from GConf")); + goto fail; + } + + if (!gst_switch_sink_set_child (GST_SWITCH_SINK (sink), new_kid)) { + GST_WARNING_OBJECT (sink, "Failed to update child element"); + goto fail; + } + + g_free (sink->gconf_str); + sink->gconf_str = new_gconf_str; + + GST_DEBUG_OBJECT (sink, "done changing gconf audio sink"); + + return TRUE; + +fail: + g_free (new_gconf_str); + return FALSE; +} + +static void +gst_gconf_switch_profile (GstGConfAudioSink * sink, GstGConfProfile profile) +{ + if (sink->client == NULL) + return; + + if (sink->notify_id) { + GST_DEBUG_OBJECT (sink, "Unsubscribing old key %s for profile %d", + gst_gconf_get_key_for_sink_profile (sink->profile), sink->profile); + gconf_client_notify_remove (sink->client, sink->notify_id); + sink->notify_id = 0; + } + + sink->profile = profile; + if (profile != GCONF_PROFILE_NONE) { + const gchar *key = gst_gconf_get_key_for_sink_profile (sink->profile); + + GST_DEBUG_OBJECT (sink, "Subscribing to key %s for profile %d", + key, profile); + sink->notify_id = gconf_client_notify_add (sink->client, key, + cb_change_child, sink, NULL, NULL); + } +} + +static void +gst_gconf_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstGConfAudioSink *sink; + + sink = GST_GCONF_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_PROFILE: + gst_gconf_switch_profile (sink, g_value_get_enum (value)); + break; + default: + break; + } +} + +static void +gst_gconf_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstGConfAudioSink *sink; + + sink = GST_GCONF_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_PROFILE: + g_value_set_enum (value, sink->profile); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +cb_change_child (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data) +{ + do_change_child (GST_GCONF_AUDIO_SINK (data)); +} + +static GstStateChangeReturn +gst_gconf_audio_sink_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstGConfAudioSink *sink = GST_GCONF_AUDIO_SINK (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!do_change_child (sink)) { + gst_gconf_audio_sink_reset (sink); + return GST_STATE_CHANGE_FAILURE; + } + break; + default: + break; + } + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_SUCCESS); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + gst_gconf_audio_sink_reset (sink); + break; + default: + break; + } + + return ret; +} diff --git a/ext/gconf/gstgconfaudiosink.h b/ext/gconf/gstgconfaudiosink.h new file mode 100644 index 0000000..2d730f3 --- /dev/null +++ b/ext/gconf/gstgconfaudiosink.h @@ -0,0 +1,62 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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_GCONF_AUDIO_SINK_H__ +#define __GST_GCONF_AUDIO_SINK_H__ + +#include +#include +#include "gstswitchsink.h" + +G_BEGIN_DECLS + +#define GST_TYPE_GCONF_AUDIO_SINK \ + (gst_gconf_audio_sink_get_type ()) +#define GST_GCONF_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_AUDIO_SINK, \ + GstGConfAudioSink)) +#define GST_GCONF_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_AUDIO_SINK, \ + GstGConfAudioSinkClass)) +#define GST_IS_GCONF_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_AUDIO_SINK)) +#define GST_IS_GCONF_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_AUDIO_SINK)) + +typedef struct _GstGConfAudioSink { + GstSwitchSink parent; + + /* explicit pointers to stuff used */ + GConfClient *client; + GstGConfProfile profile; + guint notify_id; + + /* Current gconf string */ + gchar *gconf_str; +} GstGConfAudioSink; + +typedef struct _GstGConfAudioSinkClass { + GstSwitchSinkClass parent_class; +} GstGConfAudioSinkClass; + +GType gst_gconf_audio_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_GCONF_AUDIO_SINK_H__ */ diff --git a/ext/gconf/gstgconfaudiosrc.c b/ext/gconf/gstgconfaudiosrc.c new file mode 100644 index 0000000..2fdd61f --- /dev/null +++ b/ext/gconf/gstgconfaudiosrc.c @@ -0,0 +1,210 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2005 Tim-Philipp Müller + * + * 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-gconfaudiosrc + * @see_also: #GstAlsaSrc, #GstAutoAudioSrc + * + * This element records sound from the audiosink that has been configured in + * GConf by the user. + * + * + * Example launch line + * |[ + * gst-launch gconfaudiosrc ! audioconvert ! wavenc ! filesink location=record.wav + * ]| Record from configured audioinput + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstgconfelements.h" +#include "gstgconfaudiosrc.h" + +static void gst_gconf_audio_src_dispose (GObject * object); +static void gst_gconf_audio_src_finalize (GstGConfAudioSrc * src); +static void cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data); +static GstStateChangeReturn +gst_gconf_audio_src_change_state (GstElement * element, + GstStateChange transition); + +GST_BOILERPLATE (GstGConfAudioSrc, gst_gconf_audio_src, GstSwitchSrc, + GST_TYPE_SWITCH_SRC); + +static void +gst_gconf_audio_src_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (eklass, "GConf audio source", + "Source/Audio", + "Audio source embedding the GConf-settings for audio input", + "GStreamer maintainers "); +} + +static void +gst_gconf_audio_src_class_init (GstGConfAudioSrcClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + oklass->dispose = gst_gconf_audio_src_dispose; + oklass->finalize = (GObjectFinalizeFunc) gst_gconf_audio_src_finalize; + eklass->change_state = gst_gconf_audio_src_change_state; +} + +/* + * Hack to make negotiation work. + */ + +static gboolean +gst_gconf_audio_src_reset (GstGConfAudioSrc * src) +{ + gst_switch_src_set_child (GST_SWITCH_SRC (src), NULL); + + g_free (src->gconf_str); + src->gconf_str = NULL; + return TRUE; +} + +static void +gst_gconf_audio_src_init (GstGConfAudioSrc * src, + GstGConfAudioSrcClass * g_class) +{ + gst_gconf_audio_src_reset (src); + + src->client = gconf_client_get_default (); + gconf_client_add_dir (src->client, GST_GCONF_DIR, + GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + src->gconf_notify_id = gconf_client_notify_add (src->client, + GST_GCONF_DIR "/" GST_GCONF_AUDIOSRC_KEY, + cb_toggle_element, src, NULL, NULL); +} + +static void +gst_gconf_audio_src_dispose (GObject * object) +{ + GstGConfAudioSrc *src = GST_GCONF_AUDIO_SRC (object); + + if (src->client) { + if (src->gconf_notify_id) { + gconf_client_notify_remove (src->client, src->gconf_notify_id); + src->gconf_notify_id = 0; + } + + g_object_unref (G_OBJECT (src->client)); + src->client = NULL; + } + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static void +gst_gconf_audio_src_finalize (GstGConfAudioSrc * src) +{ + g_free (src->gconf_str); + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, ((GObject *) (src))); +} + +static gboolean +do_toggle_element (GstGConfAudioSrc * src) +{ + GstElement *new_kid; + gchar *new_gconf_str; + + new_gconf_str = gst_gconf_get_string (GST_GCONF_AUDIOSRC_KEY); + if (new_gconf_str != NULL && src->gconf_str != NULL && + (strlen (new_gconf_str) == 0 || + strcmp (src->gconf_str, new_gconf_str) == 0)) { + g_free (new_gconf_str); + GST_DEBUG_OBJECT (src, "GConf key was updated, but it didn't change"); + return TRUE; + } + + GST_DEBUG_OBJECT (src, "GConf key changed: '%s' to '%s'", + GST_STR_NULL (src->gconf_str), GST_STR_NULL (new_gconf_str)); + + GST_DEBUG_OBJECT (src, "Creating new kid"); + if (!(new_kid = gst_gconf_get_default_audio_src ())) { + GST_ELEMENT_ERROR (src, LIBRARY, SETTINGS, (NULL), + ("Failed to render audio src from GConf")); + return FALSE; + } + + if (!gst_switch_src_set_child (GST_SWITCH_SRC (src), new_kid)) { + GST_WARNING_OBJECT (src, "Failed to update child element"); + goto fail; + } + + g_free (src->gconf_str); + src->gconf_str = new_gconf_str; + + GST_DEBUG_OBJECT (src, "done changing gconf audio src"); + + return TRUE; +fail: + g_free (new_gconf_str); + return FALSE; +} + +static void +cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data) +{ + do_toggle_element (GST_GCONF_AUDIO_SRC (data)); +} + +static GstStateChangeReturn +gst_gconf_audio_src_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstGConfAudioSrc *src = GST_GCONF_AUDIO_SRC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!do_toggle_element (src)) { + gst_gconf_audio_src_reset (src); + return GST_STATE_CHANGE_FAILURE; + } + break; + default: + break; + } + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_SUCCESS); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + if (!gst_gconf_audio_src_reset (src)) + ret = GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + return ret; +} diff --git a/ext/gconf/gstgconfaudiosrc.h b/ext/gconf/gstgconfaudiosrc.h new file mode 100644 index 0000000..40fb94b --- /dev/null +++ b/ext/gconf/gstgconfaudiosrc.h @@ -0,0 +1,57 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2005 Tim-Philipp Müller + * + * 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_GCONF_AUDIO_SRC_H__ +#define __GST_GCONF_AUDIO_SRC_H__ + +#include +#include + +#include "gstswitchsrc.h" + +G_BEGIN_DECLS + +#define GST_TYPE_GCONF_AUDIO_SRC (gst_gconf_audio_src_get_type ()) +#define GST_GCONF_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_AUDIO_SRC, GstGConfAudioSrc)) +#define GST_GCONF_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_AUDIO_SRC, GstGConfAudioSrcClass)) +#define GST_IS_GCONF_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_AUDIO_SRC)) +#define GST_IS_GCONF_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_AUDIO_SRC)) + +typedef struct _GstGConfAudioSrc { + GstSwitchSrc parent; + + /* explicit pointers to stuff used */ + GConfClient *client; + + guint gconf_notify_id; + + /* Current gconf string */ + gchar *gconf_str; +} GstGConfAudioSrc; + +typedef struct _GstGConfAudioSrcClass { + GstSwitchSrcClass parent_class; +} GstGConfAudioSrcClass; + +GType gst_gconf_audio_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_GCONF_AUDIO_SRC_H__ */ diff --git a/ext/gconf/gstgconfelements.c b/ext/gconf/gstgconfelements.c new file mode 100644 index 0000000..06f0113 --- /dev/null +++ b/ext/gconf/gstgconfelements.c @@ -0,0 +1,59 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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 + +#include "gstgconfelements.h" + +#include "gstgconfaudiosink.h" +#include "gstgconfaudiosrc.h" +#include "gstgconfvideosink.h" +#include "gstgconfvideosrc.h" + +GST_DEBUG_CATEGORY (gconf_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gconf_debug, "gconf", 0, + "GConf/GStreamer audio/video output wrapper elements"); + + if (!gst_element_register (plugin, "gconfvideosink", + GST_RANK_NONE, GST_TYPE_GCONF_VIDEO_SINK) || + !gst_element_register (plugin, "gconfvideosrc", + GST_RANK_NONE, GST_TYPE_GCONF_VIDEO_SRC) || + !gst_element_register (plugin, "gconfaudiosink", + GST_RANK_NONE, GST_TYPE_GCONF_AUDIO_SINK) || + !gst_element_register (plugin, "gconfaudiosrc", + GST_RANK_NONE, GST_TYPE_GCONF_AUDIO_SRC)) { + return FALSE; + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "gconfelements", + "elements wrapping the GStreamer/GConf audio/video output settings", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/gconf/gstgconfelements.h b/ext/gconf/gstgconfelements.h new file mode 100644 index 0000000..872b2f2 --- /dev/null +++ b/ext/gconf/gstgconfelements.h @@ -0,0 +1,28 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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_GCONF_ELEMENTS_H__ +#define __GST_GCONF_ELEMENTS_H__ + +#include "gstgconf.h" + +GST_DEBUG_CATEGORY_EXTERN (gconf_debug); +#define GST_CAT_DEFAULT gconf_debug + +#endif /* __GST_GCONF_ELEMENTS_H__ */ diff --git a/ext/gconf/gstgconfvideosink.c b/ext/gconf/gstgconfvideosink.c new file mode 100644 index 0000000..10fe90d --- /dev/null +++ b/ext/gconf/gstgconfvideosink.c @@ -0,0 +1,210 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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-gconfvideosink + * + * This element outputs video to the videosink that has been configured in + * GConf by the user. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=foo.ogg ! decodebin ! ffmpegcolorspace ! gconfvideosink + * ]| Play on configured videosink + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstgconfelements.h" +#include "gstgconfvideosink.h" + +static void gst_gconf_video_sink_dispose (GObject * object); +static void gst_gconf_video_sink_finalize (GstGConfVideoSink * sink); +static void cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data); +static GstStateChangeReturn +gst_gconf_video_sink_change_state (GstElement * element, + GstStateChange transition); + +GST_BOILERPLATE (GstGConfVideoSink, gst_gconf_video_sink, GstSwitchSink, + GST_TYPE_SWITCH_SINK); + +static void +gst_gconf_video_sink_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (eklass, "GConf video sink", + "Sink/Video", + "Video sink embedding the GConf-settings for video output", + "GStreamer maintainers "); +} + +static void +gst_gconf_video_sink_class_init (GstGConfVideoSinkClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + oklass->dispose = gst_gconf_video_sink_dispose; + oklass->finalize = (GObjectFinalizeFunc) gst_gconf_video_sink_finalize; + eklass->change_state = gst_gconf_video_sink_change_state; +} + +/* + * Hack to make negotiation work. + */ + +static void +gst_gconf_video_sink_reset (GstGConfVideoSink * sink) +{ + gst_switch_sink_set_child (GST_SWITCH_SINK (sink), NULL); + + g_free (sink->gconf_str); + sink->gconf_str = NULL; +} + +static void +gst_gconf_video_sink_init (GstGConfVideoSink * sink, + GstGConfVideoSinkClass * g_class) +{ + gst_gconf_video_sink_reset (sink); + + sink->client = gconf_client_get_default (); + gconf_client_add_dir (sink->client, GST_GCONF_DIR, + GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + sink->notify_id = gconf_client_notify_add (sink->client, + GST_GCONF_DIR "/" GST_GCONF_VIDEOSINK_KEY, + cb_toggle_element, sink, NULL, NULL); +} + +static void +gst_gconf_video_sink_dispose (GObject * object) +{ + GstGConfVideoSink *sink = GST_GCONF_VIDEO_SINK (object); + + if (sink->client) { + if (sink->notify_id != 0) + gconf_client_notify_remove (sink->client, sink->notify_id); + + g_object_unref (G_OBJECT (sink->client)); + sink->client = NULL; + } + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static void +gst_gconf_video_sink_finalize (GstGConfVideoSink * sink) +{ + g_free (sink->gconf_str); + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, ((GObject *) (sink))); +} + +static gboolean +do_change_child (GstGConfVideoSink * sink) +{ + gchar *new_gconf_str; + GstElement *new_kid; + + new_gconf_str = gst_gconf_get_string (GST_GCONF_VIDEOSINK_KEY); + + GST_LOG_OBJECT (sink, "old gconf string: %s", GST_STR_NULL (sink->gconf_str)); + GST_LOG_OBJECT (sink, "new gconf string: %s", GST_STR_NULL (new_gconf_str)); + + if (new_gconf_str != NULL && sink->gconf_str != NULL && + (strlen (new_gconf_str) == 0 || + strcmp (sink->gconf_str, new_gconf_str) == 0)) { + g_free (new_gconf_str); + GST_DEBUG_OBJECT (sink, + "GConf key was updated, but it didn't change. Ignoring"); + return TRUE; + } + + GST_DEBUG_OBJECT (sink, "GConf key changed: '%s' to '%s'", + GST_STR_NULL (sink->gconf_str), GST_STR_NULL (new_gconf_str)); + + GST_DEBUG_OBJECT (sink, "Creating new kid"); + if (!(new_kid = gst_gconf_get_default_video_sink ())) { + GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), + ("Failed to render video sink from GConf")); + return FALSE; + } + + if (!gst_switch_sink_set_child (GST_SWITCH_SINK (sink), new_kid)) { + GST_WARNING_OBJECT (sink, "Failed to update child element"); + goto fail; + } + + g_free (sink->gconf_str); + sink->gconf_str = new_gconf_str; + + GST_DEBUG_OBJECT (sink, "done changing gconf video sink"); + + return TRUE; + +fail: + g_free (new_gconf_str); + return FALSE; +} + +static void +cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data) +{ + do_change_child (GST_GCONF_VIDEO_SINK (data)); +} + +static GstStateChangeReturn +gst_gconf_video_sink_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstGConfVideoSink *sink = GST_GCONF_VIDEO_SINK (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!do_change_child (sink)) { + gst_gconf_video_sink_reset (sink); + return GST_STATE_CHANGE_FAILURE; + } + break; + default: + break; + } + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_SUCCESS); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + gst_gconf_video_sink_reset (sink); + break; + default: + break; + } + + return ret; +} diff --git a/ext/gconf/gstgconfvideosink.h b/ext/gconf/gstgconfvideosink.h new file mode 100644 index 0000000..faaa0a8 --- /dev/null +++ b/ext/gconf/gstgconfvideosink.h @@ -0,0 +1,64 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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_GCONF_VIDEO_SINK_H__ +#define __GST_GCONF_VIDEO_SINK_H__ + +#include +#include + +#include "gstswitchsink.h" + +G_BEGIN_DECLS + +#define GST_TYPE_GCONF_VIDEO_SINK \ + (gst_gconf_video_sink_get_type ()) +#define GST_GCONF_VIDEO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_VIDEO_SINK, \ + GstGConfVideoSink)) +#define GST_GCONF_VIDEO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_VIDEO_SINK, \ + GstGConfVideoSinkClass)) +#define GST_IS_GCONF_VIDEO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_VIDEO_SINK)) +#define GST_IS_GCONF_VIDEO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_VIDEO_SINK)) + +typedef struct _GstGConfVideoSink { + GstSwitchSink parent; + + /* explicit pointers to stuff used */ + GConfClient *client; + + /* gconf notify id */ + guint notify_id; + + /* Current gconf string */ + gchar *gconf_str; +} GstGConfVideoSink; + +typedef struct _GstGConfVideoSinkClass { + GstSwitchSinkClass parent_class; +} GstGConfVideoSinkClass; + +GType gst_gconf_video_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_GCONF_VIDEO_SINK_H__ */ diff --git a/ext/gconf/gstgconfvideosrc.c b/ext/gconf/gstgconfvideosrc.c new file mode 100644 index 0000000..2d9d5df --- /dev/null +++ b/ext/gconf/gstgconfvideosrc.c @@ -0,0 +1,209 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2005 Tim-Philipp Müller + * + * 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-gconfvideosrc + * @see_also: #GstAlsaSrc, #GstAutoVideoSrc + * + * This element records video from the videosink that has been configured in + * GConf by the user. + * + * + * Example launch line + * |[ + * gst-launch gconfvideosrc ! theoraenc ! oggmux ! filesink location=record.ogg + * ]| Record from configured videoinput + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstgconfelements.h" +#include "gstgconfvideosrc.h" + +static void gst_gconf_video_src_dispose (GObject * object); +static void gst_gconf_video_src_finalize (GstGConfVideoSrc * src); +static void cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data); +static GstStateChangeReturn +gst_gconf_video_src_change_state (GstElement * element, + GstStateChange transition); + +GST_BOILERPLATE (GstGConfVideoSrc, gst_gconf_video_src, GstSwitchSrc, + GST_TYPE_SWITCH_SRC); + +static void +gst_gconf_video_src_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (eklass, "GConf video source", + "Source/Video", + "Video source embedding the GConf-settings for video input", + "GStreamer maintainers "); +} + +static void +gst_gconf_video_src_class_init (GstGConfVideoSrcClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + oklass->dispose = gst_gconf_video_src_dispose; + oklass->finalize = (GObjectFinalizeFunc) gst_gconf_video_src_finalize; + eklass->change_state = gst_gconf_video_src_change_state; +} + +/* + * Hack to make negotiation work. + */ + +static gboolean +gst_gconf_video_src_reset (GstGConfVideoSrc * src) +{ + gst_switch_src_set_child (GST_SWITCH_SRC (src), NULL); + + g_free (src->gconf_str); + src->gconf_str = NULL; + + return TRUE; +} + +static void +gst_gconf_video_src_init (GstGConfVideoSrc * src, + GstGConfVideoSrcClass * g_class) +{ + gst_gconf_video_src_reset (src); + + src->client = gconf_client_get_default (); + gconf_client_add_dir (src->client, GST_GCONF_DIR, + GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + src->notify_id = gconf_client_notify_add (src->client, + GST_GCONF_DIR "/" GST_GCONF_VIDEOSRC_KEY, + cb_toggle_element, src, NULL, NULL); +} + +static void +gst_gconf_video_src_dispose (GObject * object) +{ + GstGConfVideoSrc *src = GST_GCONF_VIDEO_SRC (object); + + if (src->client) { + if (src->notify_id != 0) + gconf_client_notify_remove (src->client, src->notify_id); + + g_object_unref (G_OBJECT (src->client)); + src->client = NULL; + } + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static void +gst_gconf_video_src_finalize (GstGConfVideoSrc * src) +{ + g_free (src->gconf_str); + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, ((GObject *) (src))); +} + +static gboolean +do_toggle_element (GstGConfVideoSrc * src) +{ + GstElement *new_kid; + gchar *new_gconf_str; + + new_gconf_str = gst_gconf_get_string (GST_GCONF_VIDEOSRC_KEY); + if (new_gconf_str != NULL && src->gconf_str != NULL && + (strlen (new_gconf_str) == 0 || + strcmp (src->gconf_str, new_gconf_str) == 0)) { + g_free (new_gconf_str); + GST_DEBUG_OBJECT (src, "GConf key was updated, but it didn't change"); + return TRUE; + } + + GST_DEBUG_OBJECT (src, "GConf key changed: '%s' to '%s'", + GST_STR_NULL (src->gconf_str), GST_STR_NULL (new_gconf_str)); + + GST_DEBUG_OBJECT (src, "Creating new kid"); + if (!(new_kid = gst_gconf_get_default_video_src ())) { + GST_ELEMENT_ERROR (src, LIBRARY, SETTINGS, (NULL), + ("Failed to render video src from GConf")); + return FALSE; + } + + if (!gst_switch_src_set_child (GST_SWITCH_SRC (src), new_kid)) { + GST_WARNING_OBJECT (src, "Failed to update child element"); + goto fail; + } + + g_free (src->gconf_str); + src->gconf_str = new_gconf_str; + + GST_DEBUG_OBJECT (src, "done changing gconf video src"); + + return TRUE; +fail: + g_free (new_gconf_str); + return FALSE; +} + +static void +cb_toggle_element (GConfClient * client, + guint connection_id, GConfEntry * entry, gpointer data) +{ + do_toggle_element (GST_GCONF_VIDEO_SRC (data)); +} + +static GstStateChangeReturn +gst_gconf_video_src_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstGConfVideoSrc *src = GST_GCONF_VIDEO_SRC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!do_toggle_element (src)) { + gst_gconf_video_src_reset (src); + return GST_STATE_CHANGE_FAILURE; + } + break; + default: + break; + } + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_SUCCESS); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + if (!gst_gconf_video_src_reset (src)) + ret = GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + return ret; +} diff --git a/ext/gconf/gstgconfvideosrc.h b/ext/gconf/gstgconfvideosrc.h new file mode 100644 index 0000000..5c8300d --- /dev/null +++ b/ext/gconf/gstgconfvideosrc.h @@ -0,0 +1,58 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2005 Tim-Philipp Müller + * + * 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_GCONF_VIDEO_SRC_H__ +#define __GST_GCONF_VIDEO_SRC_H__ + +#include +#include + +#include "gstswitchsrc.h" + +G_BEGIN_DECLS + +#define GST_TYPE_GCONF_VIDEO_SRC (gst_gconf_video_src_get_type ()) +#define GST_GCONF_VIDEO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_VIDEO_SRC, GstGConfVideoSrc)) +#define GST_GCONF_VIDEO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_VIDEO_SRC, GstGConfVideoSrcClass)) +#define GST_IS_GCONF_VIDEO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_VIDEO_SRC)) +#define GST_IS_GCONF_VIDEO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_VIDEO_SRC)) + +typedef struct _GstGConfVideoSrc { + GstSwitchSrc parent; + + /* explicit pointers to stuff used */ + GConfClient *client; + + /* gconf key notification id */ + guint notify_id; + + /* Current gconf string */ + gchar *gconf_str; +} GstGConfVideoSrc; + +typedef struct _GstGConfVideoSrcClass { + GstSwitchSrcClass parent_class; +} GstGConfVideoSrcClass; + +GType gst_gconf_video_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_GCONF_VIDEO_SRC_H__ */ diff --git a/ext/gconf/gstswitchsink.c b/ext/gconf/gstswitchsink.c new file mode 100644 index 0000000..da31df2 --- /dev/null +++ b/ext/gconf/gstswitchsink.c @@ -0,0 +1,269 @@ +/* GStreamer + * Copyright (c) 2005 Ronald S. Bultje + * Copyright (c) 2006 Jürg Billeter + * Copyright (c) 2007 Jan Schmidt + * + * 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 + +#include "gstswitchsink.h" + +GST_DEBUG_CATEGORY_STATIC (switch_debug); +#define GST_CAT_DEFAULT switch_debug + +static void gst_switch_sink_dispose (GObject * object); +static GstStateChangeReturn +gst_switch_sink_change_state (GstElement * element, GstStateChange transition); + +enum +{ + PROP_0 +}; + +GST_BOILERPLATE (GstSwitchSink, gst_switch_sink, GstBin, GST_TYPE_BIN); + +static void +gst_switch_sink_base_init (gpointer klass) +{ + GST_DEBUG_CATEGORY_INIT (switch_debug, "switchsink", 0, "switchsink element"); +} + +static void +gst_switch_sink_class_init (GstSwitchSinkClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + GstPadTemplate *child_pad_templ; + + oklass->dispose = gst_switch_sink_dispose; + eklass->change_state = gst_switch_sink_change_state; + + /* Provide a default pad template if the child didn't */ + child_pad_templ = gst_element_class_get_pad_template (eklass, "sink"); + if (child_pad_templ == NULL) { + gst_element_class_add_static_pad_template (eklass, &sink_template); + } +} + +static gboolean +gst_switch_sink_reset (GstSwitchSink * sink) +{ + /* this will install fakesink if no other child has been set, + * otherwise we rely on the subclass to know when to unset its + * custom kid */ + if (sink->kid == NULL) { + return gst_switch_sink_set_child (sink, NULL); + } + + return TRUE; +} + +static void +gst_switch_sink_init (GstSwitchSink * sink, GstSwitchSinkClass * g_class) +{ + GstElementClass *eklass = GST_ELEMENT_GET_CLASS (sink); + GstPadTemplate *templ; + + templ = gst_element_class_get_pad_template (eklass, "sink"); + sink->pad = gst_ghost_pad_new_no_target_from_template ("sink", templ); + gst_element_add_pad (GST_ELEMENT (sink), sink->pad); + + gst_switch_sink_reset (sink); + + GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); +} + +static void +gst_switch_sink_dispose (GObject * object) +{ + GstSwitchSink *sink = GST_SWITCH_SINK (object); + GstObject *new_kid, *kid; + + GST_OBJECT_LOCK (sink); + new_kid = GST_OBJECT_CAST (sink->new_kid); + sink->new_kid = NULL; + + kid = GST_OBJECT_CAST (sink->kid); + sink->kid = NULL; + GST_OBJECT_UNLOCK (sink); + + gst_object_replace (&new_kid, NULL); + gst_object_replace (&kid, NULL); + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static gboolean +gst_switch_sink_commit_new_kid (GstSwitchSink * sink) +{ + GstPad *targetpad; + GstState kid_state; + GstElement *new_kid, *old_kid; + gboolean is_fakesink = FALSE; + GstBus *bus; + + /* need locking around member accesses */ + GST_OBJECT_LOCK (sink); + /* If we're currently changing state, set the child to the next state + * we're transitioning too, rather than our current state which is + * about to change */ + if (GST_STATE_NEXT (sink) != GST_STATE_VOID_PENDING) + kid_state = GST_STATE_NEXT (sink); + else + kid_state = GST_STATE (sink); + + new_kid = sink->new_kid ? gst_object_ref (sink->new_kid) : NULL; + sink->new_kid = NULL; + GST_OBJECT_UNLOCK (sink); + + /* Fakesink by default if NULL is passed as the new child */ + if (new_kid == NULL) { + GST_DEBUG_OBJECT (sink, "Replacing kid with fakesink"); + new_kid = gst_element_factory_make ("fakesink", "testsink"); + if (new_kid == NULL) { + GST_ERROR_OBJECT (sink, "Failed to create fakesink"); + return FALSE; + } + /* Add a reference, as it would if the element came from sink->new_kid */ + gst_object_ref (new_kid); + g_object_set (new_kid, "sync", TRUE, NULL); + is_fakesink = TRUE; + } else { + GST_DEBUG_OBJECT (sink, "Setting new kid"); + } + + /* set temporary bus of our own to catch error messages from the child + * (could we just set our own bus on it, or would the state change messages + * from the not-yet-added element confuse the state change algorithm? Let's + * play it safe for now) */ + bus = gst_bus_new (); + gst_element_set_bus (new_kid, bus); + gst_object_unref (bus); + + if (gst_element_set_state (new_kid, kid_state) == GST_STATE_CHANGE_FAILURE) { + GstMessage *msg; + + /* check if child posted an error message and if so re-post it on our bus + * so that the application gets to see a decent error and not our generic + * fallback error message which is completely indecipherable to the user */ + msg = gst_bus_pop_filtered (GST_ELEMENT_BUS (new_kid), GST_MESSAGE_ERROR); + if (msg) { + GST_INFO_OBJECT (sink, "Forwarding kid error: %" GST_PTR_FORMAT, msg); + gst_element_post_message (GST_ELEMENT (sink), msg); + } + GST_ELEMENT_ERROR (sink, CORE, STATE_CHANGE, (NULL), + ("Failed to set state on new child.")); + gst_element_set_bus (new_kid, NULL); + gst_object_unref (new_kid); + return FALSE; + } + gst_element_set_bus (new_kid, NULL); + gst_bin_add (GST_BIN (sink), new_kid); + + /* Now, replace the existing child */ + GST_OBJECT_LOCK (sink); + old_kid = sink->kid; + sink->kid = new_kid; + /* Mark whether a custom kid or fakesink has been installed */ + sink->have_kid = !is_fakesink; + GST_OBJECT_UNLOCK (sink); + + /* kill old element */ + if (old_kid) { + GST_DEBUG_OBJECT (sink, "Removing old kid %" GST_PTR_FORMAT, old_kid); + gst_element_set_state (old_kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (sink), old_kid); + gst_object_unref (old_kid); + /* Don't lose the SINK flag */ + GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); + } + + /* re-attach ghostpad */ + GST_DEBUG_OBJECT (sink, "Creating new ghostpad"); + targetpad = gst_element_get_static_pad (sink->kid, "sink"); + gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); + gst_object_unref (targetpad); + GST_DEBUG_OBJECT (sink, "done changing child of switchsink"); + + /* FIXME: Push new-segment info and pre-roll buffer(s) into the kid */ + + return TRUE; +} + +gboolean +gst_switch_sink_set_child (GstSwitchSink * sink, GstElement * new_kid) +{ + GstState cur, next; + GstElement **p_kid; + + /* Nothing to do if clearing the child and we've already installed fakesink */ + if (new_kid == NULL && sink->kid != NULL && sink->have_kid == FALSE) + return TRUE; + + /* Store the new kid to be committed later */ + GST_OBJECT_LOCK (sink); + cur = GST_STATE (sink); + next = GST_STATE_NEXT (sink); + p_kid = &sink->new_kid; + gst_object_replace ((GstObject **) p_kid, (GstObject *) new_kid); + GST_OBJECT_UNLOCK (sink); + if (new_kid) + gst_object_unref (new_kid); + + /* Sometime, it would be lovely to allow sink changes even when + * already running, but this involves sending an appropriate new-segment + * and possibly prerolling etc */ + /* FIXME: Block the pad and replace the kid when it completes */ + if (cur > GST_STATE_READY || next == GST_STATE_PAUSED) { + GST_DEBUG_OBJECT (sink, + "Switch-sink is already running. Ignoring change of child."); + gst_object_unref (new_kid); + return TRUE; + } + + return gst_switch_sink_commit_new_kid (sink); +} + +static GstStateChangeReturn +gst_switch_sink_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstSwitchSink *sink = GST_SWITCH_SINK (element); + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_SUCCESS); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + if (!gst_switch_sink_reset (sink)) + ret = GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + return ret; +} diff --git a/ext/gconf/gstswitchsink.h b/ext/gconf/gstswitchsink.h new file mode 100644 index 0000000..556e755 --- /dev/null +++ b/ext/gconf/gstswitchsink.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (c) 2005 Ronald S. Bultje + * Copyright (c) 2007 Jan Schmidt + * + * 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_SWITCH_SINK_H__ +#define __GST_SWITCH_SINK_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SWITCH_SINK \ + (gst_switch_sink_get_type ()) +#define GST_SWITCH_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SWITCH_SINK, \ + GstSwitchSink)) +#define GST_SWITCH_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SWITCH_SINK, \ + GstSwitchSinkClass)) +#define GST_IS_SWITCH_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SWITCH_SINK)) +#define GST_IS_SWITCH_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SWITCH_SINK)) + +typedef struct _GstSwitchSink { + GstBin parent; + + GstElement *kid; + GstElement *new_kid; + GstPad *pad; + + /* If a custom child has been set... */ + gboolean have_kid; +} GstSwitchSink; + +typedef struct _GstSwitchSinkClass { + GstBinClass parent_class; +} GstSwitchSinkClass; + +GType gst_switch_sink_get_type (void); + +gboolean gst_switch_sink_set_child (GstSwitchSink *ssink, GstElement *new_kid); + +G_END_DECLS + +#endif /* __GST_SWITCH_SINK_H__ */ diff --git a/ext/gconf/gstswitchsrc.c b/ext/gconf/gstswitchsrc.c new file mode 100644 index 0000000..664e0bd --- /dev/null +++ b/ext/gconf/gstswitchsrc.c @@ -0,0 +1,261 @@ +/* GStreamer + * Copyright (c) 2005 Ronald S. Bultje + * Copyright (c) 2006 Jürg Billeter + * Copyright (c) 2007 Jan Schmidt + * Copyright (c) 2010 Sebastian Dröge + * + * 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 + +#include "gstswitchsrc.h" + +GST_DEBUG_CATEGORY_STATIC (switch_debug); +#define GST_CAT_DEFAULT switch_debug + +static void gst_switch_src_dispose (GObject * object); +static GstStateChangeReturn +gst_switch_src_change_state (GstElement * element, GstStateChange transition); + +GST_BOILERPLATE (GstSwitchSrc, gst_switch_src, GstBin, GST_TYPE_BIN); + +static void +gst_switch_src_base_init (gpointer klass) +{ + GST_DEBUG_CATEGORY_INIT (switch_debug, "switchsrc", 0, "switchsrc element"); +} + +static void +gst_switch_src_class_init (GstSwitchSrcClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + GstPadTemplate *child_pad_templ; + + oklass->dispose = gst_switch_src_dispose; + eklass->change_state = gst_switch_src_change_state; + + /* Provide a default pad template if the child didn't */ + child_pad_templ = gst_element_class_get_pad_template (eklass, "src"); + if (child_pad_templ == NULL) { + gst_element_class_add_static_pad_template (eklass, &src_template); + } +} + +static gboolean +gst_switch_src_reset (GstSwitchSrc * src) +{ + /* this will install fakesrc if no other child has been set, + * otherwise we rely on the subclass to know when to unset its + * custom kid */ + if (src->kid == NULL) { + return gst_switch_src_set_child (src, NULL); + } + + return TRUE; +} + +static void +gst_switch_src_init (GstSwitchSrc * src, GstSwitchSrcClass * g_class) +{ + GstElementClass *eklass = GST_ELEMENT_GET_CLASS (src); + GstPadTemplate *templ; + + templ = gst_element_class_get_pad_template (eklass, "src"); + src->pad = gst_ghost_pad_new_no_target_from_template ("src", templ); + gst_element_add_pad (GST_ELEMENT (src), src->pad); + + gst_switch_src_reset (src); + + GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); +} + +static void +gst_switch_src_dispose (GObject * object) +{ + GstSwitchSrc *src = GST_SWITCH_SRC (object); + GstObject *new_kid, *kid; + + GST_OBJECT_LOCK (src); + new_kid = GST_OBJECT_CAST (src->new_kid); + src->new_kid = NULL; + + kid = GST_OBJECT_CAST (src->kid); + src->kid = NULL; + GST_OBJECT_UNLOCK (src); + + gst_object_replace (&new_kid, NULL); + gst_object_replace (&kid, NULL); + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static gboolean +gst_switch_src_commit_new_kid (GstSwitchSrc * src) +{ + GstPad *targetpad; + GstState kid_state; + GstElement *new_kid, *old_kid; + gboolean is_fakesrc = FALSE; + GstBus *bus; + + /* need locking around member accesses */ + GST_OBJECT_LOCK (src); + /* If we're currently changing state, set the child to the next state + * we're transitioning too, rather than our current state which is + * about to change */ + if (GST_STATE_NEXT (src) != GST_STATE_VOID_PENDING) + kid_state = GST_STATE_NEXT (src); + else + kid_state = GST_STATE (src); + + new_kid = src->new_kid ? gst_object_ref (src->new_kid) : NULL; + src->new_kid = NULL; + GST_OBJECT_UNLOCK (src); + + /* Fakesrc by default if NULL is passed as the new child */ + if (new_kid == NULL) { + GST_DEBUG_OBJECT (src, "Replacing kid with fakesrc"); + new_kid = gst_element_factory_make ("fakesrc", "testsrc"); + if (new_kid == NULL) { + GST_ERROR_OBJECT (src, "Failed to create fakesrc"); + return FALSE; + } + /* Add a reference, as it would if the element came from src->new_kid */ + gst_object_ref (new_kid); + is_fakesrc = TRUE; + } else { + GST_DEBUG_OBJECT (src, "Setting new kid"); + } + + /* set temporary bus of our own to catch error messages from the child + * (could we just set our own bus on it, or would the state change messages + * from the not-yet-added element confuse the state change algorithm? Let's + * play it safe for now) */ + bus = gst_bus_new (); + gst_element_set_bus (new_kid, bus); + gst_object_unref (bus); + + if (gst_element_set_state (new_kid, kid_state) == GST_STATE_CHANGE_FAILURE) { + GstMessage *msg; + + /* check if child posted an error message and if so re-post it on our bus + * so that the application gets to see a decent error and not our generic + * fallback error message which is completely indecipherable to the user */ + msg = gst_bus_pop_filtered (GST_ELEMENT_BUS (new_kid), GST_MESSAGE_ERROR); + if (msg) { + GST_INFO_OBJECT (src, "Forwarding kid error: %" GST_PTR_FORMAT, msg); + gst_element_post_message (GST_ELEMENT (src), msg); + } + GST_ELEMENT_ERROR (src, CORE, STATE_CHANGE, (NULL), + ("Failed to set state on new child.")); + gst_element_set_bus (new_kid, NULL); + gst_object_unref (new_kid); + return FALSE; + } + gst_element_set_bus (new_kid, NULL); + gst_bin_add (GST_BIN (src), new_kid); + + /* Now, replace the existing child */ + GST_OBJECT_LOCK (src); + old_kid = src->kid; + src->kid = new_kid; + /* Mark whether a custom kid or fakesrc has been installed */ + src->have_kid = !is_fakesrc; + GST_OBJECT_UNLOCK (src); + + /* kill old element */ + if (old_kid) { + GST_DEBUG_OBJECT (src, "Removing old kid %" GST_PTR_FORMAT, old_kid); + gst_element_set_state (old_kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (src), old_kid); + gst_object_unref (old_kid); + /* Don't lose the SOURCE flag */ + GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); + } + + /* re-attach ghostpad */ + GST_DEBUG_OBJECT (src, "Creating new ghostpad"); + targetpad = gst_element_get_static_pad (src->kid, "src"); + gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); + gst_object_unref (targetpad); + GST_DEBUG_OBJECT (src, "done changing child of switchsrc"); + + return TRUE; +} + +gboolean +gst_switch_src_set_child (GstSwitchSrc * src, GstElement * new_kid) +{ + GstState cur, next; + GstElement **p_kid; + + /* Nothing to do if clearing the child and we've already installed fakesrc */ + if (new_kid == NULL && src->kid != NULL && src->have_kid == FALSE) + return TRUE; + + /* Store the new kid to be committed later */ + GST_OBJECT_LOCK (src); + cur = GST_STATE (src); + next = GST_STATE_NEXT (src); + p_kid = &src->new_kid; + gst_object_replace ((GstObject **) p_kid, (GstObject *) new_kid); + GST_OBJECT_UNLOCK (src); + if (new_kid) + gst_object_unref (new_kid); + + /* Sometime, it would be lovely to allow src changes even when + * already running */ + /* FIXME: Block the pad and replace the kid when it completes */ + if (cur > GST_STATE_READY || next == GST_STATE_PAUSED) { + GST_DEBUG_OBJECT (src, + "Switch-src is already running. Ignoring change of child."); + gst_object_unref (new_kid); + return TRUE; + } + + return gst_switch_src_commit_new_kid (src); +} + +static GstStateChangeReturn +gst_switch_src_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstSwitchSrc *src = GST_SWITCH_SRC (element); + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_SUCCESS); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + if (!gst_switch_src_reset (src)) + ret = GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + return ret; +} diff --git a/ext/gconf/gstswitchsrc.h b/ext/gconf/gstswitchsrc.h new file mode 100644 index 0000000..6c550ad --- /dev/null +++ b/ext/gconf/gstswitchsrc.h @@ -0,0 +1,57 @@ +/* GStreamer + * + * Copyright (c) 2005 Ronald S. Bultje + * Copyright (c) 2005 Tim-Philipp Müller + * Copyright (c) 2007 Jan Schmidt + * Copyright (c) 2010 Sebastian Dröge + * + * 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_SWITCH_SRC_H__ +#define __GST_SWITCH_SRC_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SWITCH_SRC (gst_switch_src_get_type ()) +#define GST_SWITCH_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SWITCH_SRC, GstSwitchSrc)) +#define GST_SWITCH_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SWITCH_SRC, GstSwitchSrcClass)) +#define GST_IS_SWITCH_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SWITCH_SRC)) +#define GST_IS_SWITCH_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SWITCH_SRC)) + +typedef struct _GstSwitchSrc { + GstBin parent; + + GstElement *kid; + GstElement *new_kid; + GstPad *pad; + + /* If a custom child has been set... */ + gboolean have_kid; +} GstSwitchSrc; + +typedef struct _GstSwitchSrcClass { + GstBinClass parent_class; +} GstSwitchSrcClass; + +GType gst_switch_src_get_type (void); +gboolean gst_switch_src_set_child (GstSwitchSrc *ssrc, GstElement *new_kid); + +G_END_DECLS + +#endif /* __GST_SWITCH_SRC_H__ */ diff --git a/ext/gdk_pixbuf/Makefile.am b/ext/gdk_pixbuf/Makefile.am new file mode 100644 index 0000000..cf5265c --- /dev/null +++ b/ext/gdk_pixbuf/Makefile.am @@ -0,0 +1,19 @@ +plugin_LTLIBRARIES = libgstgdkpixbuf.la + +libgstgdkpixbuf_la_SOURCES = gstgdkpixbuf.c gstgdkpixbufsink.c pixbufscale.c +libgstgdkpixbuf_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) $(GDK_PIXBUF_CFLAGS) +libgstgdkpixbuf_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) $(GDK_PIXBUF_LIBS) +libgstgdkpixbuf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstgdkpixbuf_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + gstgdkpixbuf.h \ + gstgdkpixbufsink.h \ + pixbufscale.h \ + gstgdkanimation.h diff --git a/ext/gdk_pixbuf/Makefile.in b/ext/gdk_pixbuf/Makefile.in new file mode 100644 index 0000000..72f8caa --- /dev/null +++ b/ext/gdk_pixbuf/Makefile.in @@ -0,0 +1,837 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/gdk_pixbuf +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstgdkpixbuf_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstgdkpixbuf_la_OBJECTS = libgstgdkpixbuf_la-gstgdkpixbuf.lo \ + libgstgdkpixbuf_la-gstgdkpixbufsink.lo \ + libgstgdkpixbuf_la-pixbufscale.lo +libgstgdkpixbuf_la_OBJECTS = $(am_libgstgdkpixbuf_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstgdkpixbuf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) \ + $(libgstgdkpixbuf_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstgdkpixbuf_la_SOURCES) +DIST_SOURCES = $(libgstgdkpixbuf_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstgdkpixbuf.la +libgstgdkpixbuf_la_SOURCES = gstgdkpixbuf.c gstgdkpixbufsink.c pixbufscale.c +libgstgdkpixbuf_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) $(GDK_PIXBUF_CFLAGS) + +libgstgdkpixbuf_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) $(GDK_PIXBUF_LIBS) + +libgstgdkpixbuf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstgdkpixbuf_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + gstgdkpixbuf.h \ + gstgdkpixbufsink.h \ + pixbufscale.h \ + gstgdkanimation.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/gdk_pixbuf/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/gdk_pixbuf/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstgdkpixbuf.la: $(libgstgdkpixbuf_la_OBJECTS) $(libgstgdkpixbuf_la_DEPENDENCIES) $(EXTRA_libgstgdkpixbuf_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstgdkpixbuf_la_LINK) -rpath $(plugindir) $(libgstgdkpixbuf_la_OBJECTS) $(libgstgdkpixbuf_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbufsink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdkpixbuf_la-pixbufscale.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstgdkpixbuf_la-gstgdkpixbuf.lo: gstgdkpixbuf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -MT libgstgdkpixbuf_la-gstgdkpixbuf.lo -MD -MP -MF $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbuf.Tpo -c -o libgstgdkpixbuf_la-gstgdkpixbuf.lo `test -f 'gstgdkpixbuf.c' || echo '$(srcdir)/'`gstgdkpixbuf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbuf.Tpo $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbuf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgdkpixbuf.c' object='libgstgdkpixbuf_la-gstgdkpixbuf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -c -o libgstgdkpixbuf_la-gstgdkpixbuf.lo `test -f 'gstgdkpixbuf.c' || echo '$(srcdir)/'`gstgdkpixbuf.c + +libgstgdkpixbuf_la-gstgdkpixbufsink.lo: gstgdkpixbufsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -MT libgstgdkpixbuf_la-gstgdkpixbufsink.lo -MD -MP -MF $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbufsink.Tpo -c -o libgstgdkpixbuf_la-gstgdkpixbufsink.lo `test -f 'gstgdkpixbufsink.c' || echo '$(srcdir)/'`gstgdkpixbufsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbufsink.Tpo $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbufsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgdkpixbufsink.c' object='libgstgdkpixbuf_la-gstgdkpixbufsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -c -o libgstgdkpixbuf_la-gstgdkpixbufsink.lo `test -f 'gstgdkpixbufsink.c' || echo '$(srcdir)/'`gstgdkpixbufsink.c + +libgstgdkpixbuf_la-pixbufscale.lo: pixbufscale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -MT libgstgdkpixbuf_la-pixbufscale.lo -MD -MP -MF $(DEPDIR)/libgstgdkpixbuf_la-pixbufscale.Tpo -c -o libgstgdkpixbuf_la-pixbufscale.lo `test -f 'pixbufscale.c' || echo '$(srcdir)/'`pixbufscale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdkpixbuf_la-pixbufscale.Tpo $(DEPDIR)/libgstgdkpixbuf_la-pixbufscale.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pixbufscale.c' object='libgstgdkpixbuf_la-pixbufscale.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -c -o libgstgdkpixbuf_la-pixbufscale.lo `test -f 'pixbufscale.c' || echo '$(srcdir)/'`pixbufscale.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/gdk_pixbuf/gstgdkanimation.h b/ext/gdk_pixbuf/gstgdkanimation.h new file mode 100644 index 0000000..b6b2529 --- /dev/null +++ b/ext/gdk_pixbuf/gstgdkanimation.h @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2003 Benjamin Otte + * + * 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_LOADER_H__ +#define __GST_LOADER_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +/* how many bytes we need to have available before we dare to start a new iteration */ +#define GST_GDK_BUFFER_SIZE (102400) +/* how far behind we need to be before we attempt to seek */ +#define GST_GDK_MAX_DELAY_TO_SEEK (GST_SECOND / 4) + + +#define GST_TYPE_GDK_ANIMATION (gst_gdk_animation_get_type()) +#define GST_GDK_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDK_ANIMATION,GstGdkAnimation)) +#define GST_GDK_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDK_ANIMATION,GstGdkAnimationClass)) +#define GST_IS_GDK_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_ANIMATION)) +#define GST_IS_GDK_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_ANIMATION)) + +typedef struct _GstGdkAnimation GstGdkAnimation; +typedef struct _GstGdkAnimationClass GstGdkAnimationClass; + +typedef struct _GstGdkAnimationIter GstGdkAnimationIter; +typedef struct _GstGdkAnimationIterClass GstGdkAnimationIterClass; + +struct _GstGdkAnimation +{ + GdkPixbufAnimation parent; + + /* name of temporary buffer file */ + gchar * temp_location; + /* file descriptor to temporary file or 0 if we're done writing */ + int temp_fd; + + /* size of image */ + gint width; + gint height; + gint bpp; + /* static image we use */ + GdkPixbuf * pixbuf; +}; + +struct _GstGdkAnimationClass +{ + GdkPixbufAnimationClass parent_class; +}; + +GType gst_gdk_animation_get_type (void); + +GstGdkAnimation * gst_gdk_animation_new (GError **error); + +gboolean gst_gdk_animation_add_data (GstGdkAnimation * ani, + const guint8 * data, + guint size); +void gst_gdk_animation_done_adding (GstGdkAnimation * ani); + + +#define GST_TYPE_GDK_ANIMATION_ITER (gst_gdk_animation_iter_get_type ()) +#define GST_GDK_ANIMATION_ITER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GST_TYPE_GDK_ANIMATION_ITER, GstGdkAnimationIter)) +#define GST_IS_GDK_ANIMATION_ITER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GST_TYPE_GDK_ANIMATION_ITER)) + +#define GST_GDK_ANIMATION_ITER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GDK_ANIMATION_ITER, GstGdkAnimationIterClass)) +#define GST_IS_GDK_ANIMATION_ITER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GDK_ANIMATION_ITER)) +#define GST_GDK_ANIMATION_ITER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GDK_ANIMATION_ITER, GstGdkAnimationIterClass)) + +struct _GstGdkAnimationIter { + GdkPixbufAnimationIter parent; + + /* our animation */ + GstGdkAnimation * ani; + /* start timeval */ + GTimeVal start; + /* timestamp of last buffer */ + GstClockTime last_timestamp; + + /* pipeline we're using */ + GstElement * pipeline; + gboolean eos; + gboolean just_seeked; + + /* current image and the buffers containing the data */ + GdkPixbuf * pixbuf; + GQueue * buffers; +}; + +struct _GstGdkAnimationIterClass { + GdkPixbufAnimationIterClass parent_class; +}; + +GType gst_gdk_animation_iter_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __GST_GDK_ANIMATION_H__ */ diff --git a/ext/gdk_pixbuf/gstgdkpixbuf.c b/ext/gdk_pixbuf/gstgdkpixbuf.c new file mode 100644 index 0000000..0a09400 --- /dev/null +++ b/ext/gdk_pixbuf/gstgdkpixbuf.c @@ -0,0 +1,558 @@ +/* GStreamer GdkPixbuf-based image decoder + * Copyright (C) 1999-2001 Erik Walthinsen + * Copyright (C) 2003 David A. Schleef + * + * 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 +#include +#include +#include + +#include "gstgdkpixbuf.h" +#include "gstgdkpixbufsink.h" +#include "pixbufscale.h" + +GST_DEBUG_CATEGORY_STATIC (gst_gdk_pixbuf_debug); +#define GST_CAT_DEFAULT gst_gdk_pixbuf_debug + +enum +{ + ARG_0, + ARG_SILENT /* FIXME 0.11: remove */ +}; + +static GstStaticPadTemplate gst_gdk_pixbuf_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/png; " + /* "image/jpeg; " disabled because we can't handle MJPEG */ + "image/gif; " + "image/x-icon; " + "application/x-navi-animation; " + "image/x-cmu-raster; " + "image/x-sun-raster; " + "image/x-pixmap; " + "image/tiff; " + "image/x-portable-anymap; " + "image/x-portable-bitmap; " + "image/x-portable-graymap; " + "image/x-portable-pixmap; " + "image/bmp; " + "image/x-bmp; " + "image/x-MS-bmp; " + "image/vnd.wap.wbmp; " "image/x-bitmap; " "image/x-tga; " + "image/x-pcx; image/svg; image/svg+xml") + ); + +static GstStaticPadTemplate gst_gdk_pixbuf_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB "; " GST_VIDEO_CAPS_RGBA) + ); + +static void gst_gdk_pixbuf_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_gdk_pixbuf_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstStateChangeReturn +gst_gdk_pixbuf_change_state (GstElement * element, GstStateChange transition); +static GstFlowReturn gst_gdk_pixbuf_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_gdk_pixbuf_sink_event (GstPad * pad, GstEvent * event); + +#ifdef enable_typefind +static void gst_gdk_pixbuf_type_find (GstTypeFind * tf, gpointer ignore); +#endif + +GST_BOILERPLATE (GstGdkPixbuf, gst_gdk_pixbuf, GstElement, GST_TYPE_ELEMENT); + +static gboolean +gst_gdk_pixbuf_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstGdkPixbuf *filter; + const GValue *framerate; + GstStructure *s; + + filter = GST_GDK_PIXBUF (GST_PAD_PARENT (pad)); + s = gst_caps_get_structure (caps, 0); + + if ((framerate = gst_structure_get_value (s, "framerate")) != NULL) { + filter->framerate_numerator = gst_value_get_fraction_numerator (framerate); + filter->framerate_denominator = + gst_value_get_fraction_denominator (framerate); + GST_DEBUG_OBJECT (filter, "got framerate of %d/%d fps => packetized mode", + filter->framerate_numerator, filter->framerate_denominator); + } else { + filter->framerate_numerator = 0; + filter->framerate_denominator = 1; + GST_DEBUG_OBJECT (filter, "no framerate, assuming single image"); + } + + return TRUE; +} + +static GstCaps * +gst_gdk_pixbuf_get_capslist (void) +{ + GSList *slist; + GSList *slist0; + GstCaps *capslist = NULL; + GstCaps *return_caps = NULL; + GstCaps *tmpl_caps; + + capslist = gst_caps_new_empty (); + slist0 = gdk_pixbuf_get_formats (); + + for (slist = slist0; slist; slist = g_slist_next (slist)) { + GdkPixbufFormat *pixbuf_format; + char **mimetypes; + char **mimetype; + + pixbuf_format = slist->data; + mimetypes = gdk_pixbuf_format_get_mime_types (pixbuf_format); + + for (mimetype = mimetypes; *mimetype; mimetype++) { + gst_caps_append_structure (capslist, gst_structure_new (*mimetype, NULL)); + } + g_strfreev (mimetypes); + } + g_slist_free (slist0); + + tmpl_caps = gst_static_caps_get (&gst_gdk_pixbuf_sink_template.static_caps); + return_caps = gst_caps_intersect (capslist, tmpl_caps); + + gst_caps_unref (tmpl_caps); + gst_caps_unref (capslist); + return return_caps; +} + +static GstCaps * +gst_gdk_pixbuf_sink_getcaps (GstPad * pad) +{ + return gst_gdk_pixbuf_get_capslist (); +} + +static void +gst_gdk_pixbuf_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_gdk_pixbuf_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_gdk_pixbuf_sink_template); + gst_element_class_set_details_simple (element_class, + "GdkPixbuf image decoder", "Codec/Decoder/Image", + "Decodes images in a video stream using GdkPixbuf", + "David A. Schleef , Renato Filho "); +} + +/* initialize the plugin's class */ +static void +gst_gdk_pixbuf_class_init (GstGdkPixbufClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->set_property = gst_gdk_pixbuf_set_property; + gobject_class->get_property = gst_gdk_pixbuf_get_property; + + g_object_class_install_property (gobject_class, ARG_SILENT, + g_param_spec_boolean ("silent", "Silent", + "Produce verbose output ? (deprecated)", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_change_state); +} + +static void +gst_gdk_pixbuf_init (GstGdkPixbuf * filter, GstGdkPixbufClass * klass) +{ + filter->sinkpad = + gst_pad_new_from_static_template (&gst_gdk_pixbuf_sink_template, "sink"); + gst_pad_set_setcaps_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_setcaps)); + gst_pad_set_getcaps_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_getcaps)); + gst_pad_set_chain_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_chain)); + gst_pad_set_event_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_event)); + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + + filter->srcpad = + gst_pad_new_from_static_template (&gst_gdk_pixbuf_src_template, "src"); + gst_pad_use_fixed_caps (filter->srcpad); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + + filter->last_timestamp = GST_CLOCK_TIME_NONE; + filter->pixbuf_loader = NULL; +} + +static GstFlowReturn +gst_gdk_pixbuf_flush (GstGdkPixbuf * filter) +{ + GstBuffer *outbuf; + GdkPixbuf *pixbuf; + int y; + guint8 *out_pix; + guint8 *in_pix; + int in_rowstride; + GstFlowReturn ret; + GstCaps *caps = NULL; + gint n_channels; + + pixbuf = gdk_pixbuf_loader_get_pixbuf (filter->pixbuf_loader); + if (pixbuf == NULL) + goto no_pixbuf; + + if (filter->image_size == 0) { + filter->width = gdk_pixbuf_get_width (pixbuf); + filter->height = gdk_pixbuf_get_height (pixbuf); + filter->rowstride = gdk_pixbuf_get_rowstride (pixbuf); + filter->image_size = filter->rowstride * filter->height; + + n_channels = gdk_pixbuf_get_n_channels (pixbuf); + switch (n_channels) { + case 3: + caps = gst_caps_from_string (GST_VIDEO_CAPS_RGB); + break; + case 4: + caps = gst_caps_from_string (GST_VIDEO_CAPS_RGBA); + break; + default: + goto channels_not_supported; + } + + gst_caps_set_simple (caps, + "width", G_TYPE_INT, filter->width, + "height", G_TYPE_INT, filter->height, + "framerate", GST_TYPE_FRACTION, filter->framerate_numerator, + filter->framerate_denominator, NULL); + + GST_DEBUG ("Set size to %dx%d", filter->width, filter->height); + gst_pad_set_caps (filter->srcpad, caps); + gst_caps_unref (caps); + } + + ret = gst_pad_alloc_buffer_and_set_caps (filter->srcpad, + GST_BUFFER_OFFSET_NONE, + filter->image_size, GST_PAD_CAPS (filter->srcpad), &outbuf); + + if (ret != GST_FLOW_OK) + goto no_buffer; + + GST_BUFFER_TIMESTAMP (outbuf) = filter->last_timestamp; + GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE; + + in_pix = gdk_pixbuf_get_pixels (pixbuf); + in_rowstride = gdk_pixbuf_get_rowstride (pixbuf); + out_pix = GST_BUFFER_DATA (outbuf); + + /* FIXME, last line might not have rowstride pixels */ + for (y = 0; y < filter->height; y++) { + memcpy (out_pix, in_pix, filter->rowstride); + in_pix += in_rowstride; + out_pix += filter->rowstride; + } + + GST_DEBUG ("pushing... %d bytes", GST_BUFFER_SIZE (outbuf)); + ret = gst_pad_push (filter->srcpad, outbuf); + + if (ret != GST_FLOW_OK) + GST_DEBUG_OBJECT (filter, "flow: %s", gst_flow_get_name (ret)); + + return ret; + + /* ERRORS */ +no_pixbuf: + { + GST_ELEMENT_ERROR (filter, STREAM, DECODE, (NULL), ("error geting pixbuf")); + return GST_FLOW_ERROR; + } +channels_not_supported: + { + GST_ELEMENT_ERROR (filter, STREAM, DECODE, (NULL), + ("%d channels not supported", n_channels)); + return GST_FLOW_ERROR; + } +no_buffer: + { + GST_DEBUG ("Failed to create outbuffer - %s", gst_flow_get_name (ret)); + return ret; + } +} + +static gboolean +gst_gdk_pixbuf_sink_event (GstPad * pad, GstEvent * event) +{ + GstFlowReturn res = GST_FLOW_OK; + gboolean ret = TRUE; + GstGdkPixbuf *pixbuf; + + pixbuf = GST_GDK_PIXBUF (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + if (pixbuf->pixbuf_loader != NULL) { + gdk_pixbuf_loader_close (pixbuf->pixbuf_loader, NULL); + res = gst_gdk_pixbuf_flush (pixbuf); + g_object_unref (G_OBJECT (pixbuf->pixbuf_loader)); + pixbuf->pixbuf_loader = NULL; + /* as long as we don't have flow returns for event functions we need + * to post an error here, or the application might never know that + * things failed */ + if (res != GST_FLOW_OK && res != GST_FLOW_WRONG_STATE) { + GST_ELEMENT_ERROR (pixbuf, STREAM, FAILED, (NULL), + ("Flow: %s", gst_flow_get_name (res))); + } + } + break; + case GST_EVENT_NEWSEGMENT: + case GST_EVENT_FLUSH_STOP: + if (pixbuf->pixbuf_loader != NULL) { + gdk_pixbuf_loader_close (pixbuf->pixbuf_loader, NULL); + g_object_unref (G_OBJECT (pixbuf->pixbuf_loader)); + pixbuf->pixbuf_loader = NULL; + } + break; + default: + break; + } + + if (res == GST_FLOW_OK) { + ret = gst_pad_event_default (pad, event); + } else { + ret = FALSE; + } + + gst_object_unref (pixbuf); + + return ret; +} + +static GstFlowReturn +gst_gdk_pixbuf_chain (GstPad * pad, GstBuffer * buf) +{ + GstGdkPixbuf *filter; + GstFlowReturn ret = GST_FLOW_OK; + GError *error = NULL; + GstClockTime timestamp; + guint8 *data; + guint size; + + filter = GST_GDK_PIXBUF (gst_pad_get_parent (pad)); + + timestamp = GST_BUFFER_TIMESTAMP (buf); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) + filter->last_timestamp = timestamp; + + GST_LOG_OBJECT (filter, "buffer with ts: %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (filter->pixbuf_loader == NULL) + filter->pixbuf_loader = gdk_pixbuf_loader_new (); + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + GST_LOG_OBJECT (filter, "Writing buffer size %d", size); + if (!gdk_pixbuf_loader_write (filter->pixbuf_loader, data, size, &error)) + goto error; + + /* packetised mode? */ + if (filter->framerate_numerator != 0) { + gdk_pixbuf_loader_close (filter->pixbuf_loader, NULL); + ret = gst_gdk_pixbuf_flush (filter); + g_object_unref (filter->pixbuf_loader); + filter->pixbuf_loader = NULL; + } + + gst_buffer_unref (buf); + gst_object_unref (filter); + + return ret; + + /* ERRORS */ +error: + { + GST_ELEMENT_ERROR (filter, STREAM, DECODE, (NULL), + ("gdk_pixbuf_loader_write error: %s", error->message)); + g_error_free (error); + gst_buffer_unref (buf); + gst_object_unref (filter); + return GST_FLOW_ERROR; + } +} + +static void +gst_gdk_pixbuf_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + switch (prop_id) { + case ARG_SILENT: + /* filter->silent = g_value_get_boolean (value); */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_gdk_pixbuf_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + switch (prop_id) { + case ARG_SILENT: + /* g_value_set_boolean (value, filter->silent); */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_gdk_pixbuf_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstGdkPixbuf *dec = GST_GDK_PIXBUF (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + /* default to single image mode, setcaps function might not be called */ + dec->framerate_numerator = 0; + dec->framerate_denominator = 1; + 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: + dec->framerate_numerator = 0; + dec->framerate_denominator = 0; + break; + default: + break; + } + + return ret; +} + +#define GST_GDK_PIXBUF_TYPE_FIND_SIZE 1024 + +#ifdef enable_typefind +static void +gst_gdk_pixbuf_type_find (GstTypeFind * tf, gpointer ignore) +{ + guint8 *data; + GdkPixbufLoader *pixbuf_loader; + GdkPixbufFormat *format; + + data = gst_type_find_peek (tf, 0, GST_GDK_PIXBUF_TYPE_FIND_SIZE); + if (data == NULL) + return; + + GST_DEBUG ("creating new loader"); + + pixbuf_loader = gdk_pixbuf_loader_new (); + + gdk_pixbuf_loader_write (pixbuf_loader, data, GST_GDK_PIXBUF_TYPE_FIND_SIZE, + NULL); + + format = gdk_pixbuf_loader_get_format (pixbuf_loader); + + if (format != NULL) { + GstCaps *caps; + gchar **p; + gchar **mlist = gdk_pixbuf_format_get_mime_types (format); + + for (p = mlist; *p; ++p) { + GST_DEBUG ("suggesting mime type %s", *p); + caps = gst_caps_new_simple (*p, NULL); + gst_type_find_suggest (tf, GST_TYPE_FIND_MINIMUM, caps); + gst_caps_free (caps); + } + g_strfreev (mlist); + } + + GST_DEBUG ("closing pixbuf loader, hope it doesn't hang ..."); + /* librsvg 2.4.x has a bug where it triggers an endless loop in trying + to close a gzip that's not an svg; fixed upstream but no good way + to work around it */ + gdk_pixbuf_loader_close (pixbuf_loader, NULL); + GST_DEBUG ("closed pixbuf loader"); + g_object_unref (G_OBJECT (pixbuf_loader)); +} +#endif + +/* entry point to initialize the plug-in + * initialize the plug-in itself + * register the element factories and pad templates + * register the features + */ +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_gdk_pixbuf_debug, "gdkpixbuf", 0, + "gdk pixbuf loader"); + + if (!gst_element_register (plugin, "gdkpixbufdec", GST_RANK_SECONDARY, + GST_TYPE_GDK_PIXBUF)) + return FALSE; + +#ifdef enable_typefind + gst_type_find_register (plugin, "image/*", GST_RANK_MARGINAL, + gst_gdk_pixbuf_type_find, NULL, GST_CAPS_ANY, NULL); +#endif + + if (!gst_element_register (plugin, "gdkpixbufsink", GST_RANK_NONE, + GST_TYPE_GDK_PIXBUF_SINK)) + return FALSE; + + if (!pixbufscale_init (plugin)) + return FALSE; + + /* plugin initialisation succeeded */ + return TRUE; +} + + +/* this is the structure that gst-register looks for + * so keep the name plugin_desc, or you cannot get your plug-in registered */ +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "gdkpixbuf", + "GdkPixbuf-based image decoder, scaler and sink", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/gdk_pixbuf/gstgdkpixbuf.h b/ext/gdk_pixbuf/gstgdkpixbuf.h new file mode 100644 index 0000000..a4c6ee5 --- /dev/null +++ b/ext/gdk_pixbuf/gstgdkpixbuf.h @@ -0,0 +1,70 @@ +/* GStreamer GdkPixbuf-based image decoder + * Copyright (C) 1999-2001 Erik Walthinsen + * Copyright (C) 2003 David A. Schleef + * + * 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_GDK_PIXBUF_H__ +#define __GST_GDK_PIXBUF_H__ + +#include + +G_BEGIN_DECLS + +/* #define's don't like whitespacey bits */ +#define GST_TYPE_GDK_PIXBUF \ + (gst_gdk_pixbuf_get_type()) +#define GST_GDK_PIXBUF(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDK_PIXBUF,GstGdkPixbuf)) +#define GST_GDK_PIXBUF_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDK_PIXBUF,GstGdkPixbufClass)) +#define GST_IS_GDK_PIXBUF(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_PIXBUF)) +#define GST_IS_GDK_PIXBUF_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_PIXBUF)) + +typedef struct _GstGdkPixbuf GstGdkPixbuf; +typedef struct _GstGdkPixbufClass GstGdkPixbufClass; + +struct _GstGdkPixbuf +{ + GstElement element; + + GstPad *sinkpad, *srcpad; + + GstClockTime last_timestamp; + GdkPixbufLoader *pixbuf_loader; + + int width; + int height; + int rowstride; + unsigned int image_size; + + gint framerate_numerator; + gint framerate_denominator; +}; + +struct _GstGdkPixbufClass +{ + GstElementClass parent_class; +}; + +static GType gst_gdk_pixbuf_get_type (void); + +G_END_DECLS + +#endif /* __GST_GDK_PIXBUF_H__ */ diff --git a/ext/gdk_pixbuf/gstgdkpixbufsink.c b/ext/gdk_pixbuf/gstgdkpixbufsink.c new file mode 100644 index 0000000..2c2714e --- /dev/null +++ b/ext/gdk_pixbuf/gstgdkpixbufsink.c @@ -0,0 +1,426 @@ +/* GStreamer GdkPixbuf sink + * Copyright (C) 2006-2008 Tim-Philipp Müller + * + * 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 free software; you can redistribute it and/or + * 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-gdkpixbufsink + * @Since: 0.10.8 + * + * This sink element takes RGB or RGBA images as input and wraps them into + * #GdkPixbuf objects, for easy saving to file via the + * GdkPixbuf library API or displaying in Gtk+ applications (e.g. using + * the #GtkImage widget). + * + * There are two ways to use this element and obtain the #GdkPixbuf objects + * created: + * + * + * Watching for element messages named "preroll-pixbuf" + * or "pixbuf" on the bus, which + * will be posted whenever an image would usually be rendered. See below for + * more details on these messages and how to extract the pixbuf object + * contained in them. + * + * + * Retrieving the current pixbuf via the #GstGdkPixbufSink:last-pixbuf property + * when needed. + * + * + * + * The primary purpose of this element is to abstract away the #GstBuffer to + * #GdkPixbuf conversion. Other than that it's very similar to the fakesink + * element. + * + * This element is meant for easy no-hassle video snapshotting. It is not + * suitable for video playback or video display at high framerates. Use + * ximagesink, xvimagesink or some other suitable video sink in connection + * with the #GstXOverlay interface instead if you want to do video playback. + * + * + * Message details + * As mentioned above, this element will by default post element messages + * containing structures named "preroll-pixbuf" + * or "pixbuf" on the bus (this + * can be disabled by setting the #GstGdkPixbufSink:post-messages property + * to #FALSE though). The element message structure has the following fields: + * + * + * "pixbuf": the #GdkPixbuf object + * + * + * "pixel-aspect-ratio": the pixel aspect + * ratio (PAR) of the input image (this field contains a #GstFraction); the + * PAR is usually 1:1 for images, but is often something non-1:1 in the case + * of video input. In this case the image may be distorted and you may need + * to rescale it accordingly before saving it to file or displaying it. This + * can easily be done using gdk_pixbuf_scale() (the reason this is not done + * automatically is that the application will often scale the image anyway + * according to the size of the output window, in which case it is much more + * efficient to only scale once rather than twice). You can put a videoscale + * element and a capsfilter element with + * video/x-raw-rgb,pixel-aspect-ratio=(fraction)1/1 caps + * in front of this element to make sure the pixbufs always have a 1:1 PAR. + * + * + * + * + * + * Example pipeline + * |[ + * gst-launch -m -v videotestsrc num-buffers=1 ! gdkpixbufsink + * ]| Process one single test image as pixbuf (note that the output you see will + * be slightly misleading. The message structure does contain a valid pixbuf + * object even if the structure string says '(NULL)'). + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstgdkpixbufsink.h" + +#include + +#define DEFAULT_SEND_MESSAGES TRUE +#define DEFAULT_POST_MESSAGES TRUE + +enum +{ + PROP_0, + PROP_SEND_MESSAGES, + PROP_POST_MESSAGES, + PROP_LAST_PIXBUF, + PROP_LAST +}; + + +GST_BOILERPLATE (GstGdkPixbufSink, gst_gdk_pixbuf_sink, GstVideoSink, + GST_TYPE_VIDEO_SINK); + +static void gst_gdk_pixbuf_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_gdk_pixbuf_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_gdk_pixbuf_sink_start (GstBaseSink * basesink); +static gboolean gst_gdk_pixbuf_sink_stop (GstBaseSink * basesink); +static gboolean gst_gdk_pixbuf_sink_set_caps (GstBaseSink * basesink, + GstCaps * caps); +static GstFlowReturn gst_gdk_pixbuf_sink_render (GstBaseSink * bsink, + GstBuffer * buf); +static GstFlowReturn gst_gdk_pixbuf_sink_preroll (GstBaseSink * bsink, + GstBuffer * buf); +static GdkPixbuf *gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (GstGdkPixbufSink * + sink, GstBuffer * buf); + +#define WxH ", width = (int) [ 16, 4096 ], height = (int) [ 16, 4096 ]" + +static GstStaticPadTemplate pixbufsink_sink_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB WxH ";" GST_VIDEO_CAPS_RGBA WxH)); + +static void +gst_gdk_pixbuf_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "GdkPixbuf sink", + "Sink/Video", "Output images as GdkPixbuf objects in bus messages", + "Tim-Philipp Müller "); + + gst_element_class_add_static_pad_template (element_class, + &pixbufsink_sink_factory); +} + +static void +gst_gdk_pixbuf_sink_class_init (GstGdkPixbufSinkClass * klass) +{ + GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = gst_gdk_pixbuf_sink_set_property; + gobject_class->get_property = gst_gdk_pixbuf_sink_get_property; + + /* FIXME 0.11, remove in favour of post-messages */ + g_object_class_install_property (gobject_class, PROP_SEND_MESSAGES, + g_param_spec_boolean ("send-messages", "Send Messages", + "Whether to post messages containing pixbufs on the bus " + " (deprecated, use post-messages)", + DEFAULT_SEND_MESSAGES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstGdkPixbuf:post-messages: + * + * Post messages on the bus containing pixbufs. + * + * Since: 0.10.17 + */ + g_object_class_install_property (gobject_class, PROP_POST_MESSAGES, + g_param_spec_boolean ("post-messages", "Post Messages", + "Whether to post messages containing pixbufs on the bus", + DEFAULT_POST_MESSAGES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_LAST_PIXBUF, + g_param_spec_object ("last-pixbuf", "Last Pixbuf", + "Last GdkPixbuf object rendered", GDK_TYPE_PIXBUF, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + basesink_class->start = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_start); + basesink_class->stop = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_stop); + basesink_class->render = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_render); + basesink_class->preroll = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_preroll); + basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_set_caps); +} + +static void +gst_gdk_pixbuf_sink_init (GstGdkPixbufSink * sink, + GstGdkPixbufSinkClass * klass) +{ + sink->par_n = 0; + sink->par_d = 0; + sink->has_alpha = FALSE; + sink->last_pixbuf = NULL; + sink->post_messages = DEFAULT_POST_MESSAGES; + + /* we're not a real video sink, we just derive from GstVideoSink in case + * anything interesting is added to it in future */ + gst_base_sink_set_max_lateness (GST_BASE_SINK (sink), -1); + gst_base_sink_set_qos_enabled (GST_BASE_SINK (sink), FALSE); +} + + +static gboolean +gst_gdk_pixbuf_sink_start (GstBaseSink * basesink) +{ + GST_LOG_OBJECT (basesink, "start"); + + return TRUE; +} + +static gboolean +gst_gdk_pixbuf_sink_stop (GstBaseSink * basesink) +{ + GstGdkPixbufSink *sink = GST_GDK_PIXBUF_SINK (basesink); + + GST_VIDEO_SINK_WIDTH (sink) = 0; + GST_VIDEO_SINK_HEIGHT (sink) = 0; + + sink->par_n = 0; + sink->par_d = 0; + sink->has_alpha = FALSE; + + if (sink->last_pixbuf) { + g_object_unref (sink->last_pixbuf); + sink->last_pixbuf = NULL; + } + + GST_LOG_OBJECT (sink, "stop"); + + return TRUE; +} + +static gboolean +gst_gdk_pixbuf_sink_set_caps (GstBaseSink * basesink, GstCaps * caps) +{ + GstGdkPixbufSink *sink = GST_GDK_PIXBUF_SINK (basesink); + GstVideoFormat fmt; + gint w, h, par_n, par_d; + + GST_LOG_OBJECT (sink, "caps: %" GST_PTR_FORMAT, caps); + + if (!gst_video_format_parse_caps (caps, &fmt, &w, &h)) { + GST_WARNING_OBJECT (sink, "parse_caps failed"); + return FALSE; + } + + if (!gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d)) { + GST_LOG_OBJECT (sink, "no pixel aspect ratio"); + return FALSE; + } + + g_assert ((fmt == GST_VIDEO_FORMAT_RGB && + gst_video_format_get_pixel_stride (fmt, 0) == 3) || + (fmt == GST_VIDEO_FORMAT_RGBA && + gst_video_format_get_pixel_stride (fmt, 0) == 4)); + + GST_VIDEO_SINK_WIDTH (sink) = w; + GST_VIDEO_SINK_HEIGHT (sink) = h; + + sink->rowstride = gst_video_format_get_row_stride (fmt, 0, w); + sink->has_alpha = (fmt == GST_VIDEO_FORMAT_RGBA); + + sink->par_n = par_n; + sink->par_d = par_d; + + GST_INFO_OBJECT (sink, "format : %d", fmt); + GST_INFO_OBJECT (sink, "width x height : %d x %d", w, h); + GST_INFO_OBJECT (sink, "pixel-aspect-ratio : %d/%d", par_n, par_d); + + return TRUE; +} + +static void +gst_gdk_pixbuf_sink_pixbuf_destroy_notify (guchar * pixels, GstBuffer * buf) +{ + gst_buffer_unref (buf); +} + +static GdkPixbuf * +gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (GstGdkPixbufSink * sink, + GstBuffer * buf) +{ + GdkPixbuf *pix = NULL; + gint minsize, bytes_per_pixel; + + g_return_val_if_fail (GST_VIDEO_SINK_WIDTH (sink) > 0, NULL); + g_return_val_if_fail (GST_VIDEO_SINK_HEIGHT (sink) > 0, NULL); + + bytes_per_pixel = (sink->has_alpha) ? 4 : 3; + + /* last row needn't have row padding */ + minsize = (sink->rowstride * (GST_VIDEO_SINK_HEIGHT (sink) - 1)) + + (bytes_per_pixel * GST_VIDEO_SINK_WIDTH (sink)); + + g_return_val_if_fail (GST_BUFFER_SIZE (buf) >= minsize, NULL); + + pix = gdk_pixbuf_new_from_data (GST_BUFFER_DATA (buf), + GDK_COLORSPACE_RGB, sink->has_alpha, 8, GST_VIDEO_SINK_WIDTH (sink), + GST_VIDEO_SINK_HEIGHT (sink), sink->rowstride, + (GdkPixbufDestroyNotify) gst_gdk_pixbuf_sink_pixbuf_destroy_notify, + gst_buffer_ref (buf)); + + return pix; +} + +static GstFlowReturn +gst_gdk_pixbuf_sink_handle_buffer (GstBaseSink * basesink, GstBuffer * buf, + const gchar * msg_name) +{ + GstGdkPixbufSink *sink; + GdkPixbuf *pixbuf; + gboolean do_post; + + sink = GST_GDK_PIXBUF_SINK (basesink); + + pixbuf = gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (sink, buf); + + GST_OBJECT_LOCK (sink); + + do_post = sink->post_messages; + + if (sink->last_pixbuf) + g_object_unref (sink->last_pixbuf); + + sink->last_pixbuf = pixbuf; /* take ownership */ + + GST_OBJECT_UNLOCK (sink); + + if (G_UNLIKELY (pixbuf == NULL)) + goto error; + + if (do_post) { + GstStructure *s; + GstMessage *msg; + + /* it's okay to keep using pixbuf here, we can be sure no one is going to + * unref or change sink->last_pixbuf before we return from this function. + * The structure will take its own ref to the pixbuf. */ + s = gst_structure_new (msg_name, + "pixbuf", GDK_TYPE_PIXBUF, pixbuf, + "pixel-aspect-ratio", GST_TYPE_FRACTION, sink->par_n, sink->par_d, + NULL); + + msg = gst_message_new_element (GST_OBJECT_CAST (sink), s); + gst_element_post_message (GST_ELEMENT_CAST (sink), msg); + } + + g_object_notify (G_OBJECT (sink), "last-pixbuf"); + + return GST_FLOW_OK; + +/* ERRORS */ +error: + { + /* This shouldn't really happen */ + GST_ELEMENT_ERROR (sink, LIBRARY, FAILED, + ("Couldn't create pixbuf from RGB image."), + ("Probably not enough free memory")); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_gdk_pixbuf_sink_preroll (GstBaseSink * basesink, GstBuffer * buf) +{ + return gst_gdk_pixbuf_sink_handle_buffer (basesink, buf, "preroll-pixbuf"); +} + +static GstFlowReturn +gst_gdk_pixbuf_sink_render (GstBaseSink * basesink, GstBuffer * buf) +{ + return gst_gdk_pixbuf_sink_handle_buffer (basesink, buf, "pixbuf"); +} + +static void +gst_gdk_pixbuf_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstGdkPixbufSink *sink; + + sink = GST_GDK_PIXBUF_SINK (object); + + switch (prop_id) { + case PROP_SEND_MESSAGES: + case PROP_POST_MESSAGES: + GST_OBJECT_LOCK (sink); + sink->post_messages = g_value_get_boolean (value); + GST_OBJECT_UNLOCK (sink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_gdk_pixbuf_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstGdkPixbufSink *sink; + + sink = GST_GDK_PIXBUF_SINK (object); + + switch (prop_id) { + case PROP_SEND_MESSAGES: + case PROP_POST_MESSAGES: + GST_OBJECT_LOCK (sink); + g_value_set_boolean (value, sink->post_messages); + GST_OBJECT_UNLOCK (sink); + break; + case PROP_LAST_PIXBUF: + GST_OBJECT_LOCK (sink); + g_value_set_object (value, sink->last_pixbuf); + GST_OBJECT_UNLOCK (sink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/ext/gdk_pixbuf/gstgdkpixbufsink.h b/ext/gdk_pixbuf/gstgdkpixbufsink.h new file mode 100644 index 0000000..b0eff5e --- /dev/null +++ b/ext/gdk_pixbuf/gstgdkpixbufsink.h @@ -0,0 +1,75 @@ +/* GStreamer GdkPixbuf sink + * Copyright (C) 2006-2008 Tim-Philipp Müller + * + * 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_GDK_PIXBUF_SINK_H +#define GST_GDK_PIXBUF_SINK_H + +#include + +#include + +#include + +#define GST_TYPE_GDK_PIXBUF_SINK (gst_gdk_pixbuf_sink_get_type()) +#define GST_GDK_PIXBUF_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDK_PIXBUF_SINK,GstGdkPixbufSink)) +#define GST_GDK_PIXBUF_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDK_PIXBUF_SINK,GstGdkPixbufSinkClass)) +#define GST_IS_GDK_PIXBUF_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_PIXBUF_SINK)) +#define GST_IS_GDK_PIXBUF_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_PIXBUF_SINK)) + +typedef struct _GstGdkPixbufSink GstGdkPixbufSink; +typedef struct _GstGdkPixbufSinkClass GstGdkPixbufSinkClass; + +/** + * GstGdkPixbufSink: + * + * Opaque element structure. + */ +struct _GstGdkPixbufSink +{ + GstVideoSink basesink; + + /*< private >*/ + + /* current caps */ + gint width; + gint height; + gint rowstride; + gint par_n; + gint par_d; + gboolean has_alpha; + + /* properties */ + gboolean post_messages; + GdkPixbuf * last_pixbuf; +}; + +/** + * GstGdkPixbufSinkClass: + * + * Opaque element class structure. + */ +struct _GstGdkPixbufSinkClass +{ + GstVideoSinkClass basesinkclass; +}; + +GType gst_gdk_pixbuf_sink_get_type (void); + +#endif /* GST_GDK_PIXBUF_SINK_H */ + diff --git a/ext/gdk_pixbuf/pixbufscale.c b/ext/gdk_pixbuf/pixbufscale.c new file mode 100644 index 0000000..ba98f62 --- /dev/null +++ b/ext/gdk_pixbuf/pixbufscale.c @@ -0,0 +1,483 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2004> Jan Schmidt + * Copyright (C) <2004> Tim-Philipp Mueller + * + * 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 +#include +#include + +#define ROUND_UP_2(x) (((x)+1)&~1) +#define ROUND_UP_4(x) (((x)+3)&~3) +#define ROUND_UP_8(x) (((x)+7)&~7) + +/* These match the ones gstffmpegcolorspace uses (Tim) */ +#define GST_RGB24_ROWSTRIDE(width) (ROUND_UP_4 ((width)*3)) +#define GST_RGB24_SIZE(width,height) ((height)*GST_RGB24_ROWSTRIDE(width)) + + +GST_DEBUG_CATEGORY_STATIC (pixbufscale_debug); +#define GST_CAT_DEFAULT pixbufscale_debug + +/* GstPixbufScale signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, + ARG_METHOD + /* FILL ME */ +}; + +static GstStaticPadTemplate gst_pixbufscale_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB) + ); + +static GstStaticPadTemplate gst_pixbufscale_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB) + ); + +#define GST_TYPE_PIXBUFSCALE_METHOD (gst_pixbufscale_method_get_type()) +static GType +gst_pixbufscale_method_get_type (void) +{ + static GType pixbufscale_method_type = 0; + static const GEnumValue pixbufscale_methods[] = { + {GST_PIXBUFSCALE_NEAREST, "0", "Nearest Neighbour"}, + {GST_PIXBUFSCALE_TILES, "1", "Tiles"}, + {GST_PIXBUFSCALE_BILINEAR, "2", "Bilinear"}, + {GST_PIXBUFSCALE_HYPER, "3", "Hyper"}, + {0, NULL, NULL}, + }; + + if (!pixbufscale_method_type) { + pixbufscale_method_type = + g_enum_register_static ("GstPixbufScaleMethod", pixbufscale_methods); + } + return pixbufscale_method_type; +} + +static void gst_pixbufscale_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_pixbufscale_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_pixbufscale_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps); +static gboolean gst_pixbufscale_set_caps (GstBaseTransform * trans, + GstCaps * in, GstCaps * out); +static gboolean gst_pixbufscale_get_unit_size (GstBaseTransform * trans, + GstCaps * caps, guint * size); +static void gst_pixbufscale_fixate_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); +static GstFlowReturn gst_pixbufscale_transform (GstBaseTransform * trans, + GstBuffer * in, GstBuffer * out); +static gboolean gst_pixbufscale_handle_src_event (GstPad * pad, + GstEvent * event); + + +static gboolean parse_caps (GstCaps * caps, gint * width, gint * height); + +GST_BOILERPLATE (GstPixbufScale, gst_pixbufscale, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void +gst_pixbufscale_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "GdkPixbuf image scaler", + "Filter/Effect/Video", "Resizes video", + "Jan Schmidt , " + "Wim Taymans , " + "Renato Filho "); + + gst_element_class_add_static_pad_template (element_class, + &gst_pixbufscale_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_pixbufscale_sink_template); +} + +static void +gst_pixbufscale_class_init (GstPixbufScaleClass * klass) +{ + GObjectClass *gobject_class; + GstBaseTransformClass *trans_class; + + gobject_class = (GObjectClass *) klass; + trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_pixbufscale_set_property; + gobject_class->get_property = gst_pixbufscale_get_property; + + g_object_class_install_property (gobject_class, + ARG_METHOD, + g_param_spec_enum ("method", "method", "method", + GST_TYPE_PIXBUFSCALE_METHOD, GST_PIXBUFSCALE_BILINEAR, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_pixbufscale_transform_caps); + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_pixbufscale_set_caps); + trans_class->get_unit_size = + GST_DEBUG_FUNCPTR (gst_pixbufscale_get_unit_size); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_pixbufscale_transform); + trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_pixbufscale_fixate_caps); + trans_class->passthrough_on_same_caps = TRUE; + + parent_class = g_type_class_peek_parent (klass); +} + +static void +gst_pixbufscale_init (GstPixbufScale * pixbufscale, + GstPixbufScaleClass * kclass) +{ + GstBaseTransform *trans; + + GST_DEBUG_OBJECT (pixbufscale, "_init"); + trans = GST_BASE_TRANSFORM (pixbufscale); + + gst_pad_set_event_function (trans->srcpad, gst_pixbufscale_handle_src_event); + + pixbufscale->method = GST_PIXBUFSCALE_TILES; + pixbufscale->gdk_method = GDK_INTERP_TILES; +} + +static void +gst_pixbufscale_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstPixbufScale *src; + + g_return_if_fail (GST_IS_PIXBUFSCALE (object)); + src = GST_PIXBUFSCALE (object); + + switch (prop_id) { + case ARG_METHOD: + src->method = g_value_get_enum (value); + switch (src->method) { + case GST_PIXBUFSCALE_NEAREST: + src->gdk_method = GDK_INTERP_NEAREST; + break; + case GST_PIXBUFSCALE_TILES: + src->gdk_method = GDK_INTERP_TILES; + break; + case GST_PIXBUFSCALE_BILINEAR: + src->gdk_method = GDK_INTERP_BILINEAR; + break; + case GST_PIXBUFSCALE_HYPER: + src->gdk_method = GDK_INTERP_HYPER; + break; + } + break; + default: + break; + } +} + +static void +gst_pixbufscale_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstPixbufScale *src; + + g_return_if_fail (GST_IS_PIXBUFSCALE (object)); + src = GST_PIXBUFSCALE (object); + + switch (prop_id) { + case ARG_METHOD: + g_value_set_enum (value, src->method); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static GstCaps * +gst_pixbufscale_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps) +{ + GstCaps *ret; + int i; + + ret = gst_caps_copy (caps); + + for (i = 0; i < gst_caps_get_size (ret); i++) { + GstStructure *structure = gst_caps_get_structure (ret, i); + + gst_structure_set (structure, + "width", GST_TYPE_INT_RANGE, 16, 4096, + "height", GST_TYPE_INT_RANGE, 16, 4096, NULL); + gst_structure_remove_field (structure, "pixel-aspect-ratio"); + } + + GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, ret); + return ret; +} + +static gboolean +parse_caps (GstCaps * caps, gint * width, gint * height) +{ + gboolean ret; + GstStructure *structure; + + structure = gst_caps_get_structure (caps, 0); + ret = gst_structure_get_int (structure, "width", width); + ret &= gst_structure_get_int (structure, "height", height); + + return ret; +} + +static gboolean +gst_pixbufscale_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out) +{ + GstPixbufScale *pixbufscale; + gboolean ret; + + pixbufscale = GST_PIXBUFSCALE (trans); + ret = parse_caps (in, &pixbufscale->from_width, &pixbufscale->from_height); + ret &= parse_caps (out, &pixbufscale->to_width, &pixbufscale->to_height); + if (!ret) + goto done; + + pixbufscale->from_stride = GST_ROUND_UP_4 (pixbufscale->from_width * 3); + pixbufscale->from_buf_size = + pixbufscale->from_stride * pixbufscale->from_height; + + pixbufscale->to_stride = GST_ROUND_UP_4 (pixbufscale->to_width * 3); + pixbufscale->to_buf_size = pixbufscale->to_stride * pixbufscale->to_height; + + GST_DEBUG_OBJECT (pixbufscale, "from=%dx%d, size %d -> to=%dx%d, size %d", + pixbufscale->from_width, pixbufscale->from_height, + pixbufscale->from_buf_size, pixbufscale->to_width, pixbufscale->to_height, + pixbufscale->to_buf_size); + +done: + return ret; +} + + +static gboolean +gst_pixbufscale_get_unit_size (GstBaseTransform * trans, + GstCaps * caps, guint * size) +{ + gint width, height; + + g_assert (size); + + if (!parse_caps (caps, &width, &height)) + return FALSE; + + *size = GST_ROUND_UP_4 (width * 3) * height; + + return TRUE; +} + +static void +gst_pixbufscale_fixate_caps (GstBaseTransform * base, GstPadDirection direction, + GstCaps * caps, GstCaps * othercaps) +{ + GstStructure *ins, *outs; + const GValue *from_par, *to_par; + + g_return_if_fail (gst_caps_is_fixed (caps)); + + GST_DEBUG_OBJECT (base, "trying to fixate othercaps %" GST_PTR_FORMAT + " based on caps %" GST_PTR_FORMAT, othercaps, caps); + + ins = gst_caps_get_structure (caps, 0); + outs = gst_caps_get_structure (othercaps, 0); + + from_par = gst_structure_get_value (ins, "pixel-aspect-ratio"); + to_par = gst_structure_get_value (outs, "pixel-aspect-ratio"); + + if (from_par && to_par) { + GValue to_ratio = { 0, }; /* w/h of output video */ + int from_w, from_h, from_par_n, from_par_d, to_par_n, to_par_d; + int count = 0, w = 0, h = 0, num, den; + + /* if both width and height are already fixed, we can't do anything + * * about it anymore */ + if (gst_structure_get_int (outs, "width", &w)) + ++count; + if (gst_structure_get_int (outs, "height", &h)) + ++count; + if (count == 2) { + GST_DEBUG_OBJECT (base, "dimensions already set to %dx%d, not fixating", + w, h); + return; + } + + gst_structure_get_int (ins, "width", &from_w); + gst_structure_get_int (ins, "height", &from_h); + from_par_n = gst_value_get_fraction_numerator (from_par); + from_par_d = gst_value_get_fraction_denominator (from_par); + to_par_n = gst_value_get_fraction_numerator (to_par); + to_par_d = gst_value_get_fraction_denominator (to_par); + + g_value_init (&to_ratio, GST_TYPE_FRACTION); + gst_value_set_fraction (&to_ratio, from_w * from_par_n * to_par_d, + from_h * from_par_d * to_par_n); + num = gst_value_get_fraction_numerator (&to_ratio); + den = gst_value_get_fraction_denominator (&to_ratio); + GST_DEBUG_OBJECT (base, + "scaling input with %dx%d and PAR %d/%d to output PAR %d/%d", + from_w, from_h, from_par_n, from_par_d, to_par_n, to_par_d); + GST_DEBUG_OBJECT (base, + "resulting output should respect ratio of %d/%d", num, den); + + /* now find a width x height that respects this display ratio. + * * prefer those that have one of w/h the same as the incoming video + * * using wd / hd = num / den */ + + /* start with same height, because of interlaced video */ + /* check hd / den is an integer scale factor, and scale wd with the PAR */ + if (from_h % den == 0) { + GST_DEBUG_OBJECT (base, "keeping video height"); + h = from_h; + w = h * num / den; + } else if (from_w % num == 0) { + GST_DEBUG_OBJECT (base, "keeping video width"); + w = from_w; + h = w * den / num; + } else { + GST_DEBUG_OBJECT (base, "approximating but keeping video height"); + h = from_h; + w = h * num / den; + } + GST_DEBUG_OBJECT (base, "scaling to %dx%d", w, h); + /* now fixate */ + gst_structure_fixate_field_nearest_int (outs, "width", w); + gst_structure_fixate_field_nearest_int (outs, "height", h); + } else { + gint width, height; + + if (gst_structure_get_int (ins, "width", &width)) { + if (gst_structure_has_field (outs, "width")) { + gst_structure_fixate_field_nearest_int (outs, "width", width); + } + } + if (gst_structure_get_int (ins, "height", &height)) { + if (gst_structure_has_field (outs, "height")) { + gst_structure_fixate_field_nearest_int (outs, "height", height); + } + } + } + + GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, othercaps); +} + +static GstFlowReturn +gst_pixbufscale_transform (GstBaseTransform * trans, + GstBuffer * in, GstBuffer * out) +{ + GstPixbufScale *scale; + GdkPixbuf *src_pixbuf, *dest_pixbuf; + + scale = GST_PIXBUFSCALE (trans); + + src_pixbuf = + gdk_pixbuf_new_from_data (GST_BUFFER_DATA (in), GDK_COLORSPACE_RGB, FALSE, + 8, scale->from_width, scale->from_height, + GST_RGB24_ROWSTRIDE (scale->from_width), NULL, NULL); + + dest_pixbuf = + gdk_pixbuf_new_from_data (GST_BUFFER_DATA (out), GDK_COLORSPACE_RGB, + FALSE, 8, scale->to_width, scale->to_height, + GST_RGB24_ROWSTRIDE (scale->to_width), NULL, NULL); + + gdk_pixbuf_scale (src_pixbuf, dest_pixbuf, 0, 0, + scale->to_width, + scale->to_height, 0, 0, + (double) scale->to_width / scale->from_width, + (double) scale->to_height / scale->from_height, scale->gdk_method); + + g_object_unref (src_pixbuf); + g_object_unref (dest_pixbuf); + + return GST_FLOW_OK; +} + +static gboolean +gst_pixbufscale_handle_src_event (GstPad * pad, GstEvent * event) +{ + GstPixbufScale *pixbufscale; + gboolean ret; + double a; + GstStructure *structure; + + pixbufscale = GST_PIXBUFSCALE (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (pixbufscale, "handling %s event", + GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NAVIGATION: + event = + GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event))); + + structure = (GstStructure *) gst_event_get_structure (event); + if (gst_structure_get_double (structure, "pointer_x", &a)) { + gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, + a * pixbufscale->from_width / pixbufscale->to_width, NULL); + } + if (gst_structure_get_double (structure, "pointer_y", &a)) { + gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, + a * pixbufscale->from_height / pixbufscale->to_height, NULL); + } + break; + default: + break; + } + + ret = gst_pad_event_default (pad, event); + + gst_object_unref (pixbufscale); + + return ret; +} + +gboolean +pixbufscale_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "gdkpixbufscale", GST_RANK_NONE, + GST_TYPE_PIXBUFSCALE)) + return FALSE; + + GST_DEBUG_CATEGORY_INIT (pixbufscale_debug, "gdkpixbufscale", 0, + "pixbufscale element"); + + return TRUE; +} diff --git a/ext/gdk_pixbuf/pixbufscale.h b/ext/gdk_pixbuf/pixbufscale.h new file mode 100644 index 0000000..3e40477 --- /dev/null +++ b/ext/gdk_pixbuf/pixbufscale.h @@ -0,0 +1,84 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2004> Jan Schmidt + * Copyright (C) <2004> Tim-Philipp Mueller + * + * 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_PIXBUFSCALE_H__ +#define __GST_PIXBUFSCALE_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_PIXBUFSCALE \ + (gst_pixbufscale_get_type()) +#define GST_PIXBUFSCALE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PIXBUFSCALE,GstPixbufScale)) +#define GST_PIXBUFSCALE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PIXBUFSCALE,GstPixbufScaleClass)) +#define GST_IS_PIXBUFSCALE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PIXBUFSCALE)) +#define GST_IS_PIXBUFSCALE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PIXBUFSCALE)) + +typedef enum { + GST_PIXBUFSCALE_NEAREST, + GST_PIXBUFSCALE_TILES, + GST_PIXBUFSCALE_BILINEAR, + GST_PIXBUFSCALE_HYPER +} GstPixbufScaleMethod; + + +typedef struct _GstPixbufScale GstPixbufScale; +typedef struct _GstPixbufScaleClass GstPixbufScaleClass; + +struct _GstPixbufScale { + GstBaseTransform element; + + /* video state */ + gint to_width; + gint to_height; + gint from_width; + gint from_height; + gboolean passthru; + + GstPixbufScaleMethod method; + GdkInterpType gdk_method; + + /* private */ + gint from_buf_size; + gint from_stride; + gint to_buf_size; + gint to_stride; +}; + +struct _GstPixbufScaleClass { + GstBaseTransformClass parent_class; +}; + +GType gst_pixbufscale_get_type(void); + +gboolean pixbufscale_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_PIXBUFSCALE_H__ */ diff --git a/ext/hal/Makefile.am b/ext/hal/Makefile.am new file mode 100644 index 0000000..8862aeb --- /dev/null +++ b/ext/hal/Makefile.am @@ -0,0 +1,18 @@ +plugin_LTLIBRARIES = libgsthalelements.la + +libgsthalelements_la_SOURCES = \ + gsthalaudiosink.c \ + gsthalaudiosrc.c \ + gsthalelements.c \ + hal.c + +libgsthalelements_la_CFLAGS = $(GST_CFLAGS) $(HAL_CFLAGS) +libgsthalelements_la_LIBADD = $(GST_LIBS) $(HAL_LIBS) +libgsthalelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgsthalelements_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + gsthalaudiosink.h \ + gsthalaudiosrc.h \ + gsthalelements.h \ + hal.h diff --git a/ext/hal/Makefile.in b/ext/hal/Makefile.in new file mode 100644 index 0000000..7a67203 --- /dev/null +++ b/ext/hal/Makefile.in @@ -0,0 +1,843 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/hal +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgsthalelements_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgsthalelements_la_OBJECTS = \ + libgsthalelements_la-gsthalaudiosink.lo \ + libgsthalelements_la-gsthalaudiosrc.lo \ + libgsthalelements_la-gsthalelements.lo \ + libgsthalelements_la-hal.lo +libgsthalelements_la_OBJECTS = $(am_libgsthalelements_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgsthalelements_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgsthalelements_la_CFLAGS) $(CFLAGS) \ + $(libgsthalelements_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgsthalelements_la_SOURCES) +DIST_SOURCES = $(libgsthalelements_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgsthalelements.la +libgsthalelements_la_SOURCES = \ + gsthalaudiosink.c \ + gsthalaudiosrc.c \ + gsthalelements.c \ + hal.c + +libgsthalelements_la_CFLAGS = $(GST_CFLAGS) $(HAL_CFLAGS) +libgsthalelements_la_LIBADD = $(GST_LIBS) $(HAL_LIBS) +libgsthalelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgsthalelements_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + gsthalaudiosink.h \ + gsthalaudiosrc.h \ + gsthalelements.h \ + hal.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/hal/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/hal/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgsthalelements.la: $(libgsthalelements_la_OBJECTS) $(libgsthalelements_la_DEPENDENCIES) $(EXTRA_libgsthalelements_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgsthalelements_la_LINK) -rpath $(plugindir) $(libgsthalelements_la_OBJECTS) $(libgsthalelements_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthalelements_la-gsthalaudiosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthalelements_la-gsthalaudiosrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthalelements_la-gsthalelements.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthalelements_la-hal.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgsthalelements_la-gsthalaudiosink.lo: gsthalaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -MT libgsthalelements_la-gsthalaudiosink.lo -MD -MP -MF $(DEPDIR)/libgsthalelements_la-gsthalaudiosink.Tpo -c -o libgsthalelements_la-gsthalaudiosink.lo `test -f 'gsthalaudiosink.c' || echo '$(srcdir)/'`gsthalaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthalelements_la-gsthalaudiosink.Tpo $(DEPDIR)/libgsthalelements_la-gsthalaudiosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthalaudiosink.c' object='libgsthalelements_la-gsthalaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -c -o libgsthalelements_la-gsthalaudiosink.lo `test -f 'gsthalaudiosink.c' || echo '$(srcdir)/'`gsthalaudiosink.c + +libgsthalelements_la-gsthalaudiosrc.lo: gsthalaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -MT libgsthalelements_la-gsthalaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgsthalelements_la-gsthalaudiosrc.Tpo -c -o libgsthalelements_la-gsthalaudiosrc.lo `test -f 'gsthalaudiosrc.c' || echo '$(srcdir)/'`gsthalaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthalelements_la-gsthalaudiosrc.Tpo $(DEPDIR)/libgsthalelements_la-gsthalaudiosrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthalaudiosrc.c' object='libgsthalelements_la-gsthalaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -c -o libgsthalelements_la-gsthalaudiosrc.lo `test -f 'gsthalaudiosrc.c' || echo '$(srcdir)/'`gsthalaudiosrc.c + +libgsthalelements_la-gsthalelements.lo: gsthalelements.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -MT libgsthalelements_la-gsthalelements.lo -MD -MP -MF $(DEPDIR)/libgsthalelements_la-gsthalelements.Tpo -c -o libgsthalelements_la-gsthalelements.lo `test -f 'gsthalelements.c' || echo '$(srcdir)/'`gsthalelements.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthalelements_la-gsthalelements.Tpo $(DEPDIR)/libgsthalelements_la-gsthalelements.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthalelements.c' object='libgsthalelements_la-gsthalelements.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -c -o libgsthalelements_la-gsthalelements.lo `test -f 'gsthalelements.c' || echo '$(srcdir)/'`gsthalelements.c + +libgsthalelements_la-hal.lo: hal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -MT libgsthalelements_la-hal.lo -MD -MP -MF $(DEPDIR)/libgsthalelements_la-hal.Tpo -c -o libgsthalelements_la-hal.lo `test -f 'hal.c' || echo '$(srcdir)/'`hal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthalelements_la-hal.Tpo $(DEPDIR)/libgsthalelements_la-hal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hal.c' object='libgsthalelements_la-hal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -c -o libgsthalelements_la-hal.lo `test -f 'hal.c' || echo '$(srcdir)/'`hal.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/hal/gsthalaudiosink.c b/ext/hal/gsthalaudiosink.c new file mode 100644 index 0000000..88fac00 --- /dev/null +++ b/ext/hal/gsthalaudiosink.c @@ -0,0 +1,250 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Jürg Billeter + * + * 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-halaudiosink + * + * HalAudioSink allows access to output of sound devices by specifying the + * corresponding persistent Unique Device Id (UDI) from the Hardware Abstraction + * Layer (HAL) in the #GstHalAudioSink:udi property. + * It currently always embeds alsasink or osssink as HAL doesn't support other + * sound systems yet. You can also specify the UDI of a device that has ALSA or + * OSS subdevices. If both are present ALSA is preferred. + * + * + * Examples + * |[ + * hal-find-by-property --key alsa.type --string playback + * ]| list the UDIs of all your ALSA output devices + * |[ + * gst-launch -v audiotestsrc ! halaudiosink udi=/org/freedesktop/Hal/devices/pci_8086_27d8_alsa_playback_0 + * ]| test your soundcard by playing a test signal on the specified sound device. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gsthalelements.h" +#include "gsthalaudiosink.h" + +static void gst_hal_audio_sink_dispose (GObject * object); +static GstStateChangeReturn +gst_hal_audio_sink_change_state (GstElement * element, + GstStateChange transition); + +enum +{ + PROP_0, + PROP_UDI +}; + +GST_BOILERPLATE (GstHalAudioSink, gst_hal_audio_sink, GstBin, GST_TYPE_BIN); + +static void gst_hal_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_hal_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +gst_hal_audio_sink_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + gst_element_class_add_static_pad_template (eklass, &sink_template); + gst_element_class_set_details_simple (eklass, "HAL audio sink", + "Sink/Audio", + "Audio sink for sound device access via HAL", + "Jürg Billeter "); +} + +static void +gst_hal_audio_sink_class_init (GstHalAudioSinkClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + oklass->set_property = gst_hal_audio_sink_set_property; + oklass->get_property = gst_hal_audio_sink_get_property; + oklass->dispose = gst_hal_audio_sink_dispose; + eklass->change_state = gst_hal_audio_sink_change_state; + + g_object_class_install_property (oklass, PROP_UDI, + g_param_spec_string ("udi", + "UDI", "Unique Device Id", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +/* + * Hack to make negotiation work. + */ + +static void +gst_hal_audio_sink_reset (GstHalAudioSink * sink) +{ + GstPad *targetpad; + + /* fakesink */ + if (sink->kid) { + gst_element_set_state (sink->kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (sink), sink->kid); + } + sink->kid = gst_element_factory_make ("fakesink", "testsink"); + gst_bin_add (GST_BIN (sink), sink->kid); + + targetpad = gst_element_get_static_pad (sink->kid, "sink"); + gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); + gst_object_unref (targetpad); +} + +static void +gst_hal_audio_sink_init (GstHalAudioSink * sink, GstHalAudioSinkClass * g_class) +{ + sink->pad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (sink), sink->pad); + + gst_hal_audio_sink_reset (sink); +} + +static void +gst_hal_audio_sink_dispose (GObject * object) +{ + GstHalAudioSink *sink = GST_HAL_AUDIO_SINK (object); + + if (sink->udi) { + g_free (sink->udi); + sink->udi = NULL; + } + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static gboolean +do_toggle_element (GstHalAudioSink * sink) +{ + GstPad *targetpad; + + /* kill old element */ + if (sink->kid) { + GST_DEBUG_OBJECT (sink, "Removing old kid"); + gst_element_set_state (sink->kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (sink), sink->kid); + sink->kid = NULL; + } + + GST_DEBUG_OBJECT (sink, "Creating new kid"); + if (!sink->udi) + GST_INFO_OBJECT (sink, "No UDI set for device, using default one"); + + if (!(sink->kid = gst_hal_get_audio_sink (sink->udi))) { + GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), + ("Failed to render audio sink from Hal")); + return FALSE; + } + gst_element_set_state (sink->kid, GST_STATE (sink)); + gst_bin_add (GST_BIN (sink), sink->kid); + + /* re-attach ghostpad */ + GST_DEBUG_OBJECT (sink, "Creating new ghostpad"); + targetpad = gst_element_get_static_pad (sink->kid, "sink"); + gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); + gst_object_unref (targetpad); + GST_DEBUG_OBJECT (sink, "done changing hal audio sink"); + + return TRUE; +} + +static void +gst_hal_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstHalAudioSink *this = GST_HAL_AUDIO_SINK (object); + + GST_OBJECT_LOCK (this); + + switch (prop_id) { + case PROP_UDI: + if (this->udi) + g_free (this->udi); + this->udi = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (this); +} + +static void +gst_hal_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstHalAudioSink *this = GST_HAL_AUDIO_SINK (object); + + GST_OBJECT_LOCK (this); + + switch (prop_id) { + case PROP_UDI: + g_value_set_string (value, this->udi); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (this); +} + +static GstStateChangeReturn +gst_hal_audio_sink_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstHalAudioSink *sink = GST_HAL_AUDIO_SINK (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!do_toggle_element (sink)) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_SUCCESS); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + gst_hal_audio_sink_reset (sink); + break; + default: + break; + } + + return ret; +} diff --git a/ext/hal/gsthalaudiosink.h b/ext/hal/gsthalaudiosink.h new file mode 100644 index 0000000..3f07fde --- /dev/null +++ b/ext/hal/gsthalaudiosink.h @@ -0,0 +1,58 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Jürg Billeter + * + * 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_HAL_AUDIO_SINK_H__ +#define __GST_HAL_AUDIO_SINK_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_HAL_AUDIO_SINK \ + (gst_hal_audio_sink_get_type ()) +#define GST_HAL_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_HAL_AUDIO_SINK, \ + GstHalAudioSink)) +#define GST_HAL_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_HAL_AUDIO_SINK, \ + GstHalAudioSinkClass)) +#define GST_IS_HAL_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_HAL_AUDIO_SINK)) +#define GST_IS_HAL_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_HAL_AUDIO_SINK)) + +typedef struct _GstHalAudioSink { + GstBin parent; + + /* explicit pointers to stuff used */ + gchar *udi; + GstElement *kid; + GstPad *pad; +} GstHalAudioSink; + +typedef struct _GstHalAudioSinkClass { + GstBinClass parent_class; +} GstHalAudioSinkClass; + +GType gst_hal_audio_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_HAL_AUDIO_SINK_H__ */ diff --git a/ext/hal/gsthalaudiosrc.c b/ext/hal/gsthalaudiosrc.c new file mode 100644 index 0000000..339a767 --- /dev/null +++ b/ext/hal/gsthalaudiosrc.c @@ -0,0 +1,251 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2005 Tim-Philipp Müller + * (c) 2006 Jürg Billeter + * + * 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-halaudiosrc + * + * HalAudioSrc allows access to input of sound devices by specifying the + * corresponding persistent Unique Device Id (UDI) from the Hardware Abstraction + * Layer (HAL) in the #GstHalAudioSrc:udi property. + * It currently always embeds alsasrc or osssrc as HAL doesn't support other + * sound systems yet. You can also specify the UDI of a device that has ALSA or + * OSS subdevices. If both are present ALSA is preferred. + * + * + * Examples + * |[ + * hal-find-by-property --key alsa.type --string capture + * ]| list the UDIs of all your ALSA input devices + * |[ + * gst-launch -v halaudiosrc udi=/org/freedesktop/Hal/devices/pci_8086_27d8_alsa_capture_0 ! autoaudiosink + * ]| You should now hear yourself with a small delay if you have a microphone + * connected to the specified sound device. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gsthalelements.h" +#include "gsthalaudiosrc.h" + +static void gst_hal_audio_src_dispose (GObject * object); +static GstStateChangeReturn +gst_hal_audio_src_change_state (GstElement * element, + GstStateChange transition); + +enum +{ + PROP_0, + PROP_UDI +}; + +GST_BOILERPLATE (GstHalAudioSrc, gst_hal_audio_src, GstBin, GST_TYPE_BIN); + +static void gst_hal_audio_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_hal_audio_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +gst_hal_audio_src_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + gst_element_class_add_static_pad_template (eklass, &src_template); + gst_element_class_set_details_simple (eklass, "HAL audio source", + "Source/Audio", + "Audio source for sound device access via HAL", + "Jürg Billeter "); +} + +static void +gst_hal_audio_src_class_init (GstHalAudioSrcClass * klass) +{ + GObjectClass *oklass = G_OBJECT_CLASS (klass); + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + oklass->set_property = gst_hal_audio_src_set_property; + oklass->get_property = gst_hal_audio_src_get_property; + oklass->dispose = gst_hal_audio_src_dispose; + eklass->change_state = gst_hal_audio_src_change_state; + + g_object_class_install_property (oklass, PROP_UDI, + g_param_spec_string ("udi", + "UDI", "Unique Device Id", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +/* + * Hack to make negotiation work. + */ + +static void +gst_hal_audio_src_reset (GstHalAudioSrc * src) +{ + GstPad *targetpad; + + /* fakesrc */ + if (src->kid) { + gst_element_set_state (src->kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (src), src->kid); + } + src->kid = gst_element_factory_make ("fakesrc", "testsrc"); + gst_bin_add (GST_BIN (src), src->kid); + + targetpad = gst_element_get_static_pad (src->kid, "src"); + gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); + gst_object_unref (targetpad); +} + +static void +gst_hal_audio_src_init (GstHalAudioSrc * src, GstHalAudioSrcClass * g_class) +{ + src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (src), src->pad); + + gst_hal_audio_src_reset (src); +} + +static void +gst_hal_audio_src_dispose (GObject * object) +{ + GstHalAudioSrc *src = GST_HAL_AUDIO_SRC (object); + + if (src->udi) { + g_free (src->udi); + src->udi = NULL; + } + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static gboolean +do_toggle_element (GstHalAudioSrc * src) +{ + GstPad *targetpad; + + /* kill old element */ + if (src->kid) { + GST_DEBUG_OBJECT (src, "Removing old kid"); + gst_element_set_state (src->kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (src), src->kid); + src->kid = NULL; + } + + GST_DEBUG_OBJECT (src, "Creating new kid"); + if (!src->udi) + GST_INFO_OBJECT (src, "No UDI set for device, using default one"); + + if (!(src->kid = gst_hal_get_audio_src (src->udi))) { + GST_ELEMENT_ERROR (src, LIBRARY, SETTINGS, (NULL), + ("Failed to render audio source from Hal")); + return FALSE; + } + gst_element_set_state (src->kid, GST_STATE (src)); + gst_bin_add (GST_BIN (src), src->kid); + + /* re-attach ghostpad */ + GST_DEBUG_OBJECT (src, "Creating new ghostpad"); + targetpad = gst_element_get_static_pad (src->kid, "src"); + gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); + gst_object_unref (targetpad); + GST_DEBUG_OBJECT (src, "done changing hal audio source"); + + return TRUE; +} + +static void +gst_hal_audio_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstHalAudioSrc *this = GST_HAL_AUDIO_SRC (object); + + GST_OBJECT_LOCK (this); + + switch (prop_id) { + case PROP_UDI: + if (this->udi) + g_free (this->udi); + this->udi = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (this); +} + +static void +gst_hal_audio_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstHalAudioSrc *this = GST_HAL_AUDIO_SRC (object); + + GST_OBJECT_LOCK (this); + + switch (prop_id) { + case PROP_UDI: + g_value_set_string (value, this->udi); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (this); +} + +static GstStateChangeReturn +gst_hal_audio_src_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstHalAudioSrc *src = GST_HAL_AUDIO_SRC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!do_toggle_element (src)) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_SUCCESS); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + gst_hal_audio_src_reset (src); + break; + default: + break; + } + + return ret; +} diff --git a/ext/hal/gsthalaudiosrc.h b/ext/hal/gsthalaudiosrc.h new file mode 100644 index 0000000..7afdadd --- /dev/null +++ b/ext/hal/gsthalaudiosrc.h @@ -0,0 +1,52 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2005 Tim-Philipp Müller + * (c) 2006 Jürg Billeter + * + * 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_HAL_AUDIO_SRC_H__ +#define __GST_HAL_AUDIO_SRC_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_HAL_AUDIO_SRC (gst_hal_audio_src_get_type ()) +#define GST_HAL_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_HAL_AUDIO_SRC, GstHalAudioSrc)) +#define GST_HAL_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_HAL_AUDIO_SRC, GstHalAudioSrcClass)) +#define GST_IS_HAL_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_HAL_AUDIO_SRC)) +#define GST_IS_HAL_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_HAL_AUDIO_SRC)) + +typedef struct _GstHalAudioSrc { + GstBin parent; + + /* explicit pointers to stuff used */ + gchar *udi; + GstElement *kid; + GstPad *pad; +} GstHalAudioSrc; + +typedef struct _GstHalAudioSrcClass { + GstBinClass parent_class; +} GstHalAudioSrcClass; + +GType gst_hal_audio_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_HAL_AUDIO_SRC_H__ */ diff --git a/ext/hal/gsthalelements.c b/ext/hal/gsthalelements.c new file mode 100644 index 0000000..dd5122a --- /dev/null +++ b/ext/hal/gsthalelements.c @@ -0,0 +1,54 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Jürg Billeter + * + * 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 + +#include "gsthalelements.h" + +#include "gsthalaudiosink.h" +#include "gsthalaudiosrc.h" + +GST_DEBUG_CATEGORY (hal_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (hal_debug, "hal", 0, + "HAL/GStreamer audio input/output wrapper elements"); + + if (!gst_element_register (plugin, "halaudiosink", + GST_RANK_NONE, GST_TYPE_HAL_AUDIO_SINK) || + !gst_element_register (plugin, "halaudiosrc", + GST_RANK_NONE, GST_TYPE_HAL_AUDIO_SRC)) { + return FALSE; + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "halelements", + "elements wrapping the GStreamer/HAL audio input/output devices", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/hal/gsthalelements.h b/ext/hal/gsthalelements.h new file mode 100644 index 0000000..6a9462f --- /dev/null +++ b/ext/hal/gsthalelements.h @@ -0,0 +1,29 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Ronald S. Bultje + * + * 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_HAL_ELEMENTS_H__ +#define __GST_HAL_ELEMENTS_H__ + +#include + +GST_DEBUG_CATEGORY_EXTERN (hal_debug); +#define GST_CAT_DEFAULT hal_debug + +#endif /* __GST_HAL_ELEMENTS_H__ */ diff --git a/ext/hal/hal.c b/ext/hal/hal.c new file mode 100644 index 0000000..6957f56 --- /dev/null +++ b/ext/hal/hal.c @@ -0,0 +1,397 @@ +/* GStreamer + * Copyright (C) <2002> Thomas Vander Stichele + * Copyright (C) <2006> Jürg Billeter + * Copyright (C) <2007> Sebastian Dröge + * + * 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 library handles interaction with Hal + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "hal.h" + +GST_DEBUG_CATEGORY_EXTERN (hal_debug); + +#define GST_CAT_DEFAULT hal_debug + +/* compat for older libhal */ +#ifndef LIBHAL_FREE_DBUS_ERROR +#define LIBHAL_FREE_DBUS_ERROR(e) dbus_error_free (e) +#endif + +/* + * gst_hal_get_alsa_element: + * @ctx: a #LibHalContext which should be used for querying HAL. + * @udi: a #gchar corresponding to the UDI you want to get. + * @device_type: a #GstHalDeviceType specifying the wanted device type. + * + * Get Hal UDI @udi's string value. + * + * Returns: a newly allocated #gchar string containing the appropriate pipeline + * for UDI @udi, or NULL in the case of an error.. + */ +static gchar * +gst_hal_get_alsa_element (LibHalContext * ctx, const gchar * udi, + GstHalDeviceType device_type) +{ + char *type, *string = NULL; + const char *element = NULL; + DBusError error; + + dbus_error_init (&error); + + if (!libhal_device_query_capability (ctx, udi, "alsa", &error)) { + if (dbus_error_is_set (&error)) { + GST_DEBUG ("Failed querying %s for alsa capability: %s: %s", + udi, error.name, error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + } else { + GST_DEBUG ("UDI %s has no alsa capability", udi); + } + return NULL; + } + + type = libhal_device_get_property_string (ctx, udi, "alsa.type", &error); + + if (dbus_error_is_set (&error)) { + GST_DEBUG ("UDI %s has alsa capabilities but no alsa.type property: %s, %s", + udi, error.name, error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + return NULL; + } else if (!type) { + GST_DEBUG ("UDI %s has empty alsa.type property", udi); + return NULL; + } + + if (strcmp (type, "playback") == 0 && device_type == GST_HAL_AUDIOSINK) + element = "alsasink"; + else if (strcmp (type, "capture") == 0 && device_type == GST_HAL_AUDIOSRC) + element = "alsasrc"; + + libhal_free_string (type); + + if (element) { + int card, device; + + card = libhal_device_get_property_int (ctx, udi, "alsa.card", &error); + if (dbus_error_is_set (&error)) { + GST_DEBUG ("UDI %s has no alsa.card property: %s: %s", udi, error.name, + error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + return NULL; + } else if (card == -1) { + GST_DEBUG ("UDI %s has no alsa.card property", udi); + return NULL; + } + + device = libhal_device_get_property_int (ctx, udi, "alsa.device", &error); + if (dbus_error_is_set (&error)) { + GST_DEBUG ("UDI %s has no alsa.device property: %s: %s", udi, error.name, + error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + return NULL; + } else if (device == -1) { + GST_DEBUG ("UDI %s has no alsa.device property", udi); + return NULL; + } + + /* This is a bit dodgy, since it makes lots of assumptions about the way + * alsa is set up. In any case, only munge the device string for playback */ + if (strcmp (element, "alsasink") == 0 && device == 0) { + /* handle default device specially to use + * dmix, dsnoop, and softvol if appropriate */ + string = g_strdup_printf ("%s device=default:%d", element, card); + } else { + string = + g_strdup_printf ("%s device=plughw:%d,%d", element, card, device); + } + } + + return string; +} + +/* + * gst_hal_get_oss_element: + * @ctx: a #LibHalContext which should be used for querying HAL. + * @udi: a #gchar corresponding to the UDI you want to get. + * @device_type: a #GstHalDeviceType specifying the wanted device type. + * + * Get Hal UDI @udi's string value. + * + * Returns: a newly allocated #gchar string containing the appropriate pipeline + * for UDI @udi, or NULL in the case of an error.. + */ +static gchar * +gst_hal_get_oss_element (LibHalContext * ctx, const gchar * udi, + GstHalDeviceType device_type) +{ + char *type, *string = NULL; + const char *element = NULL; + DBusError error; + + dbus_error_init (&error); + + if (!libhal_device_query_capability (ctx, udi, "oss", &error)) { + if (dbus_error_is_set (&error)) { + GST_DEBUG ("Failed querying %s for oss capability: %s: %s", udi, + error.name, error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + } else { + GST_DEBUG ("UDI %s has no oss capability", udi); + } + return NULL; + } + + type = libhal_device_get_property_string (ctx, udi, "oss.type", &error); + if (dbus_error_is_set (&error)) { + GST_DEBUG ("UDI %s has oss capabilities but no oss.type property: %s, %s", + udi, error.name, error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + return NULL; + } else if (!type) { + GST_DEBUG ("UDI %s has empty oss.type property", udi); + return NULL; + } + + if (strcmp (type, "pcm") == 0) { + if (device_type == GST_HAL_AUDIOSINK) + element = "osssink"; + else if (device_type == GST_HAL_AUDIOSRC) + element = "osssrc"; + } + libhal_free_string (type); + + if (element) { + char *device = NULL; + + device = + libhal_device_get_property_string (ctx, udi, "oss.device_file", &error); + if (dbus_error_is_set (&error)) { + GST_DEBUG + ("UDI %s has oss capabilities but no oss.device_file property: %s, %s", + udi, error.name, error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + return NULL; + } else if (!device) { + GST_DEBUG ("UDI %s has empty oss.device_file property", udi); + return NULL; + } + + string = g_strdup_printf ("%s device=%s", element, device); + libhal_free_string (device); + } + + return string; +} + +/* + * gst_hal_get_string: + * @udi: a #gchar corresponding to the UDI you want to get. + * @device_type: a #GstHalDeviceType specifying the wanted device type. + * + * Get Hal UDI @udi's string value. + * + * Returns: a newly allocated #gchar string containing the appropriate pipeline + * for UDI @udi, or NULL in the case of an error.. + */ +static gchar * +gst_hal_get_string (const gchar * udi, GstHalDeviceType device_type) +{ + DBusError error; + LibHalContext *ctx; + char *string = NULL; + + /* Don't query HAL for NULL UDIs. Passing NULL as UDI to HAL gives + * an assertion failure in D-Bus when running with + * DBUS_FATAL_WARNINGS=1. */ + if (!udi) + return NULL; + + dbus_error_init (&error); + + ctx = libhal_ctx_new (); + /* Should only happen on OOM */ + g_return_val_if_fail (ctx != NULL, NULL); + + if (!libhal_ctx_set_dbus_connection (ctx, dbus_bus_get (DBUS_BUS_SYSTEM, + &error))) { + GST_DEBUG ("Unable to set DBus connection: %s: %s", error.name, + error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + goto ctx_free; + } + + if (!libhal_ctx_init (ctx, &error)) { + GST_DEBUG ("Unable to set init HAL context: %s: %s", error.name, + error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + goto ctx_free; + } + + /* Now first check if UDI is an alsa device, then oss and then + * check the childs of the given device. If there are alsa and oss + * children the first alsa one is used. */ + + string = gst_hal_get_alsa_element (ctx, udi, device_type); + + if (!string) + string = gst_hal_get_oss_element (ctx, udi, device_type); + + if (!string) { + int num_childs; + char **childs = NULL; + + /* now try if one of the direct subdevices supports ALSA or OSS */ + childs = + libhal_manager_find_device_string_match (ctx, "info.parent", udi, + &num_childs, &error); + if (dbus_error_is_set (&error)) { + GST_DEBUG ("Unable to retrieve childs of %s: %s: %s", udi, error.name, + error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + goto ctx_shutdown; + } + + if (childs && num_childs > 0) { + int i; + char *alsa_string = NULL, *oss_string = NULL; + + for (i = 0; i < num_childs && !alsa_string; i++) { + alsa_string = gst_hal_get_alsa_element (ctx, childs[i], device_type); + + if (!oss_string) + oss_string = gst_hal_get_oss_element (ctx, childs[i], device_type); + } + + if (alsa_string) { + string = alsa_string; + g_free (oss_string); + } else if (oss_string) { + string = oss_string; + } + } + libhal_free_string_array (childs); + } + +ctx_shutdown: + if (!libhal_ctx_shutdown (ctx, &error)) { + GST_DEBUG ("Closing connection to HAL failed: %s: %s", error.name, + error.message); + LIBHAL_FREE_DBUS_ERROR (&error); + } + +ctx_free: + libhal_ctx_free (ctx); + + if (string == NULL) { + GST_WARNING ("Problem finding a HAL audio device for udi %s", udi); + } else { + GST_INFO ("Using %s", string); + } + + return string; +} + +/* external functions */ + +/** + * gst_hal_render_bin_from_udi: + * @udi: a #gchar string corresponding to a Hal UDI. + * + * Render bin from Hal UDI @udi. + * + * Returns: a #GstElement containing the rendered bin. + */ +GstElement * +gst_hal_render_bin_from_udi (const gchar * udi, GstHalDeviceType type) +{ + GstElement *bin = NULL; + gchar *value; + + value = gst_hal_get_string (udi, type); + if (value) + bin = gst_parse_bin_from_description (value, TRUE, NULL); + g_free (value); + return bin; +} + +/** + * gst_hal_get_audio_sink: + * @udi: a #gchar string corresponding to a Hal UDI. + * + * Render audio output bin from GStreamer Hal UDI. + * If no device with the specified UDI exists or @udi is NULL, + * the default audio sink for the platform is used + * (typically alsasink, osssink or sunaudiosink). + * + * Returns: a #GstElement containing the audio output bin, or NULL if + * everything failed. + */ +GstElement * +gst_hal_get_audio_sink (const gchar * udi) +{ + GstElement *ret = NULL; + + if (udi) + ret = gst_hal_render_bin_from_udi (udi, GST_HAL_AUDIOSINK); + + if (!ret) { + ret = gst_element_factory_make (DEFAULT_AUDIOSINK, NULL); + + if (!ret) + GST_ERROR ("Hal audio sink and %s don't work", DEFAULT_AUDIOSINK); + } + + return ret; +} + +/** + * gst_hal_get_audio_src: + * @udi: a #gchar string corresponding to a Hal UDI. + * + * Render audio acquisition bin from GStreamer Hal UDI. + * If no device with the specified UDI exists or @udi is NULL, + * the default audio source for the plaform is used + * (typically alsasrc, osssrc or sunaudiosrc). + * + * Returns: a #GstElement containing the audio source bin, or NULL if + * everything failed. + */ +GstElement * +gst_hal_get_audio_src (const gchar * udi) +{ + GstElement *ret = NULL; + + if (udi) + ret = gst_hal_render_bin_from_udi (udi, GST_HAL_AUDIOSRC); + + if (!ret) { + ret = gst_element_factory_make (DEFAULT_AUDIOSRC, NULL); + + if (!ret) + GST_ERROR ("Hal audio src and %s don't work", DEFAULT_AUDIOSRC); + } + + return ret; +} diff --git a/ext/hal/hal.h b/ext/hal/hal.h new file mode 100644 index 0000000..9cc5aed --- /dev/null +++ b/ext/hal/hal.h @@ -0,0 +1,48 @@ +/* GStreamer + * Copyright (C) <2002> Thomas Vander Stichele + * Copyright (C) <2006> Jürg Billeter + * + * 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_HAL_H +#define GST_HAL_H + +/* + * this library handles interaction with Hal + */ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef enum +{ + GST_HAL_AUDIOSINK, + GST_HAL_AUDIOSRC +} GstHalDeviceType; + +GstElement *gst_hal_render_bin_from_udi (const gchar * udi, + GstHalDeviceType type); + +GstElement *gst_hal_get_audio_sink (const gchar * udi); +GstElement *gst_hal_get_audio_src (const gchar * udi); + +G_END_DECLS + +#endif /* GST_HAL_H */ diff --git a/ext/jack/Makefile.am b/ext/jack/Makefile.am new file mode 100644 index 0000000..cf77899 --- /dev/null +++ b/ext/jack/Makefile.am @@ -0,0 +1,10 @@ + +plugin_LTLIBRARIES = libgstjack.la + +libgstjack_la_SOURCES = gstjackutil.c gstjack.c gstjackaudiosrc.c gstjackaudiosink.c gstjackaudioclient.c +libgstjack_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(JACK_CFLAGS) +libgstjack_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(JACK_LIBS) +libgstjack_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstjack_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstjackutil.h gstjackaudiosrc.h gstjackaudiosink.h gstjackaudioclient.h gstjack.h gstjackringbuffer.h diff --git a/ext/jack/Makefile.in b/ext/jack/Makefile.in new file mode 100644 index 0000000..5c4f09f --- /dev/null +++ b/ext/jack/Makefile.in @@ -0,0 +1,840 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/jack +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstjack_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstjack_la_OBJECTS = libgstjack_la-gstjackutil.lo \ + libgstjack_la-gstjack.lo libgstjack_la-gstjackaudiosrc.lo \ + libgstjack_la-gstjackaudiosink.lo \ + libgstjack_la-gstjackaudioclient.lo +libgstjack_la_OBJECTS = $(am_libgstjack_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstjack_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstjack_la_CFLAGS) $(CFLAGS) \ + $(libgstjack_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstjack_la_SOURCES) +DIST_SOURCES = $(libgstjack_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstjack.la +libgstjack_la_SOURCES = gstjackutil.c gstjack.c gstjackaudiosrc.c gstjackaudiosink.c gstjackaudioclient.c +libgstjack_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(JACK_CFLAGS) +libgstjack_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(JACK_LIBS) +libgstjack_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstjack_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstjackutil.h gstjackaudiosrc.h gstjackaudiosink.h gstjackaudioclient.h gstjack.h gstjackringbuffer.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/jack/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/jack/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstjack.la: $(libgstjack_la_OBJECTS) $(libgstjack_la_DEPENDENCIES) $(EXTRA_libgstjack_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstjack_la_LINK) -rpath $(plugindir) $(libgstjack_la_OBJECTS) $(libgstjack_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjackaudioclient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjackaudiosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjackaudiosrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjackutil.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstjack_la-gstjackutil.lo: gstjackutil.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjackutil.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjackutil.Tpo -c -o libgstjack_la-gstjackutil.lo `test -f 'gstjackutil.c' || echo '$(srcdir)/'`gstjackutil.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjackutil.Tpo $(DEPDIR)/libgstjack_la-gstjackutil.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjackutil.c' object='libgstjack_la-gstjackutil.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjackutil.lo `test -f 'gstjackutil.c' || echo '$(srcdir)/'`gstjackutil.c + +libgstjack_la-gstjack.lo: gstjack.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjack.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjack.Tpo -c -o libgstjack_la-gstjack.lo `test -f 'gstjack.c' || echo '$(srcdir)/'`gstjack.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjack.Tpo $(DEPDIR)/libgstjack_la-gstjack.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjack.c' object='libgstjack_la-gstjack.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjack.lo `test -f 'gstjack.c' || echo '$(srcdir)/'`gstjack.c + +libgstjack_la-gstjackaudiosrc.lo: gstjackaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjackaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjackaudiosrc.Tpo -c -o libgstjack_la-gstjackaudiosrc.lo `test -f 'gstjackaudiosrc.c' || echo '$(srcdir)/'`gstjackaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjackaudiosrc.Tpo $(DEPDIR)/libgstjack_la-gstjackaudiosrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjackaudiosrc.c' object='libgstjack_la-gstjackaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjackaudiosrc.lo `test -f 'gstjackaudiosrc.c' || echo '$(srcdir)/'`gstjackaudiosrc.c + +libgstjack_la-gstjackaudiosink.lo: gstjackaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjackaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjackaudiosink.Tpo -c -o libgstjack_la-gstjackaudiosink.lo `test -f 'gstjackaudiosink.c' || echo '$(srcdir)/'`gstjackaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjackaudiosink.Tpo $(DEPDIR)/libgstjack_la-gstjackaudiosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjackaudiosink.c' object='libgstjack_la-gstjackaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjackaudiosink.lo `test -f 'gstjackaudiosink.c' || echo '$(srcdir)/'`gstjackaudiosink.c + +libgstjack_la-gstjackaudioclient.lo: gstjackaudioclient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjackaudioclient.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjackaudioclient.Tpo -c -o libgstjack_la-gstjackaudioclient.lo `test -f 'gstjackaudioclient.c' || echo '$(srcdir)/'`gstjackaudioclient.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjackaudioclient.Tpo $(DEPDIR)/libgstjack_la-gstjackaudioclient.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjackaudioclient.c' object='libgstjack_la-gstjackaudioclient.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjackaudioclient.lo `test -f 'gstjackaudioclient.c' || echo '$(srcdir)/'`gstjackaudioclient.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/jack/gstjack.c b/ext/jack/gstjack.c new file mode 100644 index 0000000..8180afb --- /dev/null +++ b/ext/jack/gstjack.c @@ -0,0 +1,97 @@ +/* GStreamer Jack plugins + * Copyright (C) 2006 Wim Taymans + * + * 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 "gstjackaudiosrc.h" +#include "gstjackaudiosink.h" + +GType +gst_jack_connect_get_type (void) +{ + static volatile gsize jack_connect_type = 0; + + if (g_once_init_enter (&jack_connect_type)) { + static const GEnumValue jack_connect_enums[] = { + {GST_JACK_CONNECT_NONE, + "Don't automatically connect ports to physical ports", "none"}, + {GST_JACK_CONNECT_AUTO, + "Automatically connect ports to physical ports", "auto"}, + {GST_JACK_CONNECT_AUTO_FORCED, + "Automatically connect ports to as many physical ports as possible", + "auto-forced"}, + {0, NULL, NULL}, + }; + GType tmp = g_enum_register_static ("GstJackConnect", jack_connect_enums); + g_once_init_leave (&jack_connect_type, tmp); + } + return (GType) jack_connect_type; +} + + +static gpointer +gst_jack_client_copy (gpointer jclient) +{ + return jclient; +} + + +static void +gst_jack_client_free (gpointer jclient) +{ + return; +} + + +GType +gst_jack_client_get_type (void) +{ + static volatile gsize jack_client_type = 0; + + if (g_once_init_enter (&jack_client_type)) { + /* hackish, but makes it show up nicely in gst-inspect */ + GType tmp = g_boxed_type_register_static ("JackClient", + (GBoxedCopyFunc) gst_jack_client_copy, + (GBoxedFreeFunc) gst_jack_client_free); + g_once_init_leave (&jack_client_type, tmp); + } + + return (GType) jack_client_type; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "jackaudiosrc", GST_RANK_PRIMARY, + GST_TYPE_JACK_AUDIO_SRC)) + return FALSE; + if (!gst_element_register (plugin, "jackaudiosink", GST_RANK_PRIMARY, + GST_TYPE_JACK_AUDIO_SINK)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "jack", + "JACK audio elements", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/jack/gstjack.h b/ext/jack/gstjack.h new file mode 100644 index 0000000..d923866 --- /dev/null +++ b/ext/jack/gstjack.h @@ -0,0 +1,55 @@ +/* GStreamer + * Copyright (C) 2006 Wim Taymans + * + * gstjack.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _GST_JACK_H_ +#define _GST_JACK_H_ + + +/** + * GstJackConnect: + * @GST_JACK_CONNECT_NONE: Don't automatically connect to physical ports. + * In this mode, the element will accept any number of input channels and will + * create (but not connect) an output port for each channel. + * @GST_JACK_CONNECT_AUTO: In this mode, the element will try to connect each + * output port to a random physical jack input pin. The sink will + * expose the number of physical channels on its pad caps. + * @GST_JACK_CONNECT_AUTO_FORCED: In this mode, the element will try to connect each + * output port to a random physical jack input pin. The element will accept any number + * of input channels. + * + * Specify how the output ports will be connected. + */ + +typedef enum { + GST_JACK_CONNECT_NONE, + GST_JACK_CONNECT_AUTO, + GST_JACK_CONNECT_AUTO_FORCED +} GstJackConnect; + +typedef jack_default_audio_sample_t sample_t; + +#define GST_TYPE_JACK_CONNECT (gst_jack_connect_get_type()) +#define GST_TYPE_JACK_CLIENT (gst_jack_client_get_type ()) + +GType gst_jack_client_get_type(void); +GType gst_jack_connect_get_type(void); + +#endif // _GST_JACK_H_ diff --git a/ext/jack/gstjackaudioclient.c b/ext/jack/gstjackaudioclient.c new file mode 100644 index 0000000..2bb3555 --- /dev/null +++ b/ext/jack/gstjackaudioclient.c @@ -0,0 +1,527 @@ +/* GStreamer + * Copyright (C) 2006 Wim Taymans + * + * gstjackaudioclient.c: jack audio client implementation + * + * 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 + +#include "gstjackaudioclient.h" + +#include + +GST_DEBUG_CATEGORY_STATIC (gst_jack_audio_client_debug); +#define GST_CAT_DEFAULT gst_jack_audio_client_debug + +void +gst_jack_audio_client_init (void) +{ + GST_DEBUG_CATEGORY_INIT (gst_jack_audio_client_debug, "jackclient", 0, + "jackclient helpers"); +} + +/* a list of global connections indexed by id and server. */ +G_LOCK_DEFINE_STATIC (connections_lock); +static GList *connections; + +/* the connection to a server */ +typedef struct +{ + gint refcount; + GMutex *lock; + GCond *flush_cond; + + /* id/server pair and the connection */ + gchar *id; + gchar *server; + jack_client_t *client; + + /* lists of GstJackAudioClients */ + gint n_clients; + GList *src_clients; + GList *sink_clients; +} GstJackAudioConnection; + +/* an object sharing a jack_client_t connection. */ +struct _GstJackAudioClient +{ + GstJackAudioConnection *conn; + + GstJackClientType type; + gboolean active; + gboolean deactivate; + + void (*shutdown) (void *arg); + JackProcessCallback process; + JackBufferSizeCallback buffer_size; + JackSampleRateCallback sample_rate; + gpointer user_data; +}; + +typedef jack_default_audio_sample_t sample_t; + +typedef struct +{ + jack_nframes_t nframes; + gpointer user_data; +} JackCB; + +static int +jack_process_cb (jack_nframes_t nframes, void *arg) +{ + GstJackAudioConnection *conn = (GstJackAudioConnection *) arg; + GList *walk; + int res = 0; + + g_mutex_lock (conn->lock); + /* call sources first, then sinks. Sources will either push data into the + * ringbuffer of the sinks, which will then pull the data out of it, or + * sinks will pull the data from the sources. */ + for (walk = conn->src_clients; walk; walk = g_list_next (walk)) { + GstJackAudioClient *client = (GstJackAudioClient *) walk->data; + + /* only call active clients */ + if ((client->active || client->deactivate) && client->process) { + res = client->process (nframes, client->user_data); + if (client->deactivate) { + client->deactivate = FALSE; + g_cond_signal (conn->flush_cond); + } + } + } + for (walk = conn->sink_clients; walk; walk = g_list_next (walk)) { + GstJackAudioClient *client = (GstJackAudioClient *) walk->data; + + /* only call active clients */ + if ((client->active || client->deactivate) && client->process) { + res = client->process (nframes, client->user_data); + if (client->deactivate) { + client->deactivate = FALSE; + g_cond_signal (conn->flush_cond); + } + } + } + g_mutex_unlock (conn->lock); + + return res; +} + +/* we error out */ +static int +jack_sample_rate_cb (jack_nframes_t nframes, void *arg) +{ + return 0; +} + +/* we error out */ +static int +jack_buffer_size_cb (jack_nframes_t nframes, void *arg) +{ + return 0; +} + +static void +jack_shutdown_cb (void *arg) +{ + GstJackAudioConnection *conn = (GstJackAudioConnection *) arg; + GList *walk; + + GST_DEBUG ("disconnect client %s from server %s", conn->id, + GST_STR_NULL (conn->server)); + + g_mutex_lock (conn->lock); + for (walk = conn->src_clients; walk; walk = g_list_next (walk)) { + GstJackAudioClient *client = (GstJackAudioClient *) walk->data; + + if (client->shutdown) + client->shutdown (client->user_data); + } + for (walk = conn->sink_clients; walk; walk = g_list_next (walk)) { + GstJackAudioClient *client = (GstJackAudioClient *) walk->data; + + if (client->shutdown) + client->shutdown (client->user_data); + } + g_mutex_unlock (conn->lock); +} + +typedef struct +{ + const gchar *id; + const gchar *server; +} FindData; + +static gint +connection_find (GstJackAudioConnection * conn, FindData * data) +{ + /* id's must match */ + if (strcmp (conn->id, data->id)) + return 1; + + /* both the same or NULL */ + if (conn->server == data->server) + return 0; + + /* we cannot compare NULL */ + if (conn->server == NULL || data->server == NULL) + return 1; + + if (strcmp (conn->server, data->server)) + return 1; + + return 0; +} + +/* make a connection with @id and @server. Returns NULL on failure with the + * status set. */ +static GstJackAudioConnection * +gst_jack_audio_make_connection (const gchar * id, const gchar * server, + jack_client_t * jclient, jack_status_t * status) +{ + GstJackAudioConnection *conn; + jack_options_t options; + gint res; + + *status = 0; + + GST_DEBUG ("new client %s, connecting to server %s", id, + GST_STR_NULL (server)); + + /* never start a server */ + options = JackNoStartServer; + /* if we have a servername, use it */ + if (server != NULL) + options |= JackServerName; + /* open the client */ + if (jclient == NULL) + jclient = jack_client_open (id, options, status, server); + if (jclient == NULL) + goto could_not_open; + + /* now create object */ + conn = g_new (GstJackAudioConnection, 1); + conn->refcount = 1; + conn->lock = g_mutex_new (); + conn->flush_cond = g_cond_new (); + conn->id = g_strdup (id); + conn->server = g_strdup (server); + conn->client = jclient; + conn->n_clients = 0; + conn->src_clients = NULL; + conn->sink_clients = NULL; + + /* set our callbacks */ + jack_set_process_callback (jclient, jack_process_cb, conn); + /* these callbacks cause us to error */ + jack_set_buffer_size_callback (jclient, jack_buffer_size_cb, conn); + jack_set_sample_rate_callback (jclient, jack_sample_rate_cb, conn); + jack_on_shutdown (jclient, jack_shutdown_cb, conn); + + /* all callbacks are set, activate the client */ + if ((res = jack_activate (jclient))) + goto could_not_activate; + + GST_DEBUG ("opened connection %p", conn); + + return conn; + + /* ERRORS */ +could_not_open: + { + GST_DEBUG ("failed to open jack client, %d", *status); + return NULL; + } +could_not_activate: + { + GST_ERROR ("Could not activate client (%d)", res); + *status = JackFailure; + g_mutex_free (conn->lock); + g_free (conn->id); + g_free (conn->server); + g_free (conn); + return NULL; + } +} + +static GstJackAudioConnection * +gst_jack_audio_get_connection (const gchar * id, const gchar * server, + jack_client_t * jclient, jack_status_t * status) +{ + GstJackAudioConnection *conn; + GList *found; + FindData data; + + GST_DEBUG ("getting connection for id %s, server %s", id, + GST_STR_NULL (server)); + + data.id = id; + data.server = server; + + G_LOCK (connections_lock); + found = + g_list_find_custom (connections, &data, (GCompareFunc) connection_find); + if (found != NULL && jclient != NULL) { + /* we found it, increase refcount and return it */ + conn = (GstJackAudioConnection *) found->data; + conn->refcount++; + + GST_DEBUG ("found connection %p", conn); + } else { + /* make new connection */ + conn = gst_jack_audio_make_connection (id, server, jclient, status); + if (conn != NULL) { + GST_DEBUG ("created connection %p", conn); + /* add to list on success */ + connections = g_list_prepend (connections, conn); + } else { + GST_WARNING ("could not create connection"); + } + } + G_UNLOCK (connections_lock); + + return conn; +} + +static void +gst_jack_audio_unref_connection (GstJackAudioConnection * conn) +{ + gint res; + gboolean zero; + + GST_DEBUG ("unref connection %p refcnt %d", conn, conn->refcount); + + G_LOCK (connections_lock); + conn->refcount--; + if ((zero = (conn->refcount == 0))) { + GST_DEBUG ("closing connection %p", conn); + /* remove from list, we can release the mutex after removing the connection + * from the list because after that, nobody can access the connection anymore. */ + connections = g_list_remove (connections, conn); + } + G_UNLOCK (connections_lock); + + /* if we are zero, close and cleanup the connection */ + if (zero) { + /* don't use conn->lock here. two reasons: + * + * 1) its not necessary: jack_deactivate() will not return until the JACK thread + * associated with this connection is cleaned up by a thread join, hence + * no more callbacks can occur or be in progress. + * + * 2) it would deadlock anyway, because jack_deactivate() will sleep + * waiting for the JACK thread, and can thus cause deadlock in + * jack_process_cb() + */ + if ((res = jack_deactivate (conn->client))) { + /* we only warn, this means the server is probably shut down and the client + * is gone anyway. */ + GST_WARNING ("Could not deactivate Jack client (%d)", res); + } + /* close connection */ + if ((res = jack_client_close (conn->client))) { + /* we assume the client is gone. */ + GST_WARNING ("close failed (%d)", res); + } + + /* free resources */ + g_mutex_free (conn->lock); + g_cond_free (conn->flush_cond); + g_free (conn->id); + g_free (conn->server); + g_free (conn); + } +} + +static void +gst_jack_audio_connection_add_client (GstJackAudioConnection * conn, + GstJackAudioClient * client) +{ + g_mutex_lock (conn->lock); + switch (client->type) { + case GST_JACK_CLIENT_SOURCE: + conn->src_clients = g_list_append (conn->src_clients, client); + conn->n_clients++; + break; + case GST_JACK_CLIENT_SINK: + conn->sink_clients = g_list_append (conn->sink_clients, client); + conn->n_clients++; + break; + default: + g_warning ("trying to add unknown client type"); + break; + } + g_mutex_unlock (conn->lock); +} + +static void +gst_jack_audio_connection_remove_client (GstJackAudioConnection * conn, + GstJackAudioClient * client) +{ + g_mutex_lock (conn->lock); + switch (client->type) { + case GST_JACK_CLIENT_SOURCE: + conn->src_clients = g_list_remove (conn->src_clients, client); + conn->n_clients--; + break; + case GST_JACK_CLIENT_SINK: + conn->sink_clients = g_list_remove (conn->sink_clients, client); + conn->n_clients--; + break; + default: + g_warning ("trying to remove unknown client type"); + break; + } + g_mutex_unlock (conn->lock); +} + +/** + * gst_jack_audio_client_get: + * @id: the client id + * @server: the server to connect to or NULL for the default server + * @type: the client type + * @shutdown: a callback when the jack server shuts down + * @process: a callback when samples are available + * @buffer_size: a callback when the buffer_size changes + * @sample_rate: a callback when the sample_rate changes + * @user_data: user data passed to the callbacks + * @status: pointer to hold the jack status code in case of errors + * + * Get the jack client connection for @id and @server. Connections to the same + * @id and @server will receive the same physical Jack client connection and + * will therefore be scheduled in the same process callback. + * + * Returns: a #GstJackAudioClient. + */ +GstJackAudioClient * +gst_jack_audio_client_new (const gchar * id, const gchar * server, + jack_client_t * jclient, GstJackClientType type, + void (*shutdown) (void *arg), JackProcessCallback process, + JackBufferSizeCallback buffer_size, JackSampleRateCallback sample_rate, + gpointer user_data, jack_status_t * status) +{ + GstJackAudioClient *client; + GstJackAudioConnection *conn; + + g_return_val_if_fail (id != NULL, NULL); + g_return_val_if_fail (status != NULL, NULL); + + /* first get a connection for the id/server pair */ + conn = gst_jack_audio_get_connection (id, server, jclient, status); + if (conn == NULL) + goto no_connection; + + GST_INFO ("new client %s", id); + + /* make new client using the connection */ + client = g_new (GstJackAudioClient, 1); + client->active = client->deactivate = FALSE; + client->conn = conn; + client->type = type; + client->shutdown = shutdown; + client->process = process; + client->buffer_size = buffer_size; + client->sample_rate = sample_rate; + client->user_data = user_data; + + /* add the client to the connection */ + gst_jack_audio_connection_add_client (conn, client); + + return client; + + /* ERRORS */ +no_connection: + { + GST_DEBUG ("Could not get server connection (%d)", *status); + return NULL; + } +} + +/** + * gst_jack_audio_client_free: + * @client: a #GstJackAudioClient + * + * Free the resources used by @client. + */ +void +gst_jack_audio_client_free (GstJackAudioClient * client) +{ + GstJackAudioConnection *conn; + + g_return_if_fail (client != NULL); + + GST_INFO ("free client"); + + conn = client->conn; + + /* remove from connection first so that it's not scheduled anymore after this + * call */ + gst_jack_audio_connection_remove_client (conn, client); + gst_jack_audio_unref_connection (conn); + + g_free (client); +} + +/** + * gst_jack_audio_client_get_client: + * @client: a #GstJackAudioClient + * + * Get the jack audio client for @client. This function is used to perform + * operations on the jack server from this client. + * + * Returns: The jack audio client. + */ +jack_client_t * +gst_jack_audio_client_get_client (GstJackAudioClient * client) +{ + g_return_val_if_fail (client != NULL, NULL); + + /* no lock needed, the connection and the client does not change + * once the client is created. */ + return client->conn->client; +} + +/** + * gst_jack_audio_client_set_active: + * @client: a #GstJackAudioClient + * @active: new mode for the client + * + * Activate or deactive @client. When a client is activated it will receive + * callbacks when data should be processed. + * + * Returns: 0 if all ok. + */ +gint +gst_jack_audio_client_set_active (GstJackAudioClient * client, gboolean active) +{ + g_return_val_if_fail (client != NULL, -1); + + /* make sure that we are not dispatching the client */ + g_mutex_lock (client->conn->lock); + if (client->active && !active) { + /* we need to process once more to flush the port */ + client->deactivate = TRUE; + + /* need to wait for process_cb run once more */ + while (client->deactivate) + g_cond_wait (client->conn->flush_cond, client->conn->lock); + } + client->active = active; + g_mutex_unlock (client->conn->lock); + + return 0; +} diff --git a/ext/jack/gstjackaudioclient.h b/ext/jack/gstjackaudioclient.h new file mode 100644 index 0000000..5fb7e35 --- /dev/null +++ b/ext/jack/gstjackaudioclient.h @@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) 2006 Wim Taymans + * + * gstjackaudioclient.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_JACK_AUDIO_CLIENT_H__ +#define __GST_JACK_AUDIO_CLIENT_H__ + +#include + +#include + +G_BEGIN_DECLS + +typedef enum +{ + GST_JACK_CLIENT_SOURCE, + GST_JACK_CLIENT_SINK +} GstJackClientType; + +typedef struct _GstJackAudioClient GstJackAudioClient; + +void gst_jack_audio_client_init (void); + + +GstJackAudioClient * gst_jack_audio_client_new (const gchar *id, const gchar *server, + jack_client_t *jclient, + GstJackClientType type, + void (*shutdown) (void *arg), + JackProcessCallback process, + JackBufferSizeCallback buffer_size, + JackSampleRateCallback sample_rate, + gpointer user_data, + jack_status_t *status); +void gst_jack_audio_client_free (GstJackAudioClient *client); + +jack_client_t * gst_jack_audio_client_get_client (GstJackAudioClient *client); + +gboolean gst_jack_audio_client_set_active (GstJackAudioClient *client, gboolean active); + +G_END_DECLS + +#endif /* __GST_JACK_AUDIO_CLIENT_H__ */ diff --git a/ext/jack/gstjackaudiosink.c b/ext/jack/gstjackaudiosink.c new file mode 100644 index 0000000..078ca24 --- /dev/null +++ b/ext/jack/gstjackaudiosink.c @@ -0,0 +1,903 @@ +/* GStreamer + * Copyright (C) 2006 Wim Taymans + * + * gstjackaudiosink.c: jack audio sink implementation + * + * 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-jackaudiosink + * @see_also: #GstBaseAudioSink, #GstRingBuffer + * + * A Sink that outputs data to Jack ports. + * + * It will create N Jack ports named out_<name>_<num> where + * <name> is the element name and <num> is starting from 1. + * Each port corresponds to a gstreamer channel. + * + * The samplerate as exposed on the caps is always the same as the samplerate of + * the jack server. + * + * When the #GstJackAudioSink:connect property is set to auto, this element + * will try to connect each output port to a random physical jack input pin. In + * this mode, the sink will expose the number of physical channels on its pad + * caps. + * + * When the #GstJackAudioSink:connect property is set to none, the element will + * accept any number of input channels and will create (but not connect) an + * output port for each channel. + * + * The element will generate an error when the Jack server is shut down when it + * was PAUSED or PLAYING. This element does not support dynamic rate and buffer + * size changes at runtime. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc ! jackaudiosink + * ]| Play a sine wave to using jack. + * + * + * Last reviewed on 2006-11-30 (0.10.4) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "gstjackaudiosink.h" +#include "gstjackringbuffer.h" + +GST_DEBUG_CATEGORY_STATIC (gst_jack_audio_sink_debug); +#define GST_CAT_DEFAULT gst_jack_audio_sink_debug + +static gboolean +gst_jack_audio_sink_allocate_channels (GstJackAudioSink * sink, gint channels) +{ + jack_client_t *client; + + client = gst_jack_audio_client_get_client (sink->client); + + /* remove ports we don't need */ + while (sink->port_count > channels) { + jack_port_unregister (client, sink->ports[--sink->port_count]); + } + + /* alloc enough output ports */ + sink->ports = g_realloc (sink->ports, sizeof (jack_port_t *) * channels); + sink->buffers = g_realloc (sink->buffers, sizeof (sample_t *) * channels); + + /* create an output port for each channel */ + while (sink->port_count < channels) { + gchar *name; + + /* port names start from 1 and are local to the element */ + name = + g_strdup_printf ("out_%s_%d", GST_ELEMENT_NAME (sink), + sink->port_count + 1); + sink->ports[sink->port_count] = + jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, 0); + if (sink->ports[sink->port_count] == NULL) + return FALSE; + + sink->port_count++; + + g_free (name); + } + return TRUE; +} + +static void +gst_jack_audio_sink_free_channels (GstJackAudioSink * sink) +{ + gint res, i = 0; + jack_client_t *client; + + client = gst_jack_audio_client_get_client (sink->client); + + /* get rid of all ports */ + while (sink->port_count) { + GST_LOG_OBJECT (sink, "unregister port %d", i); + if ((res = jack_port_unregister (client, sink->ports[i++]))) { + GST_DEBUG_OBJECT (sink, "unregister of port failed (%d)", res); + } + sink->port_count--; + } + g_free (sink->ports); + sink->ports = NULL; + g_free (sink->buffers); + sink->buffers = NULL; +} + +/* ringbuffer abstract base class */ +static GType +gst_jack_ring_buffer_get_type (void) +{ + static volatile gsize ringbuffer_type = 0; + + if (g_once_init_enter (&ringbuffer_type)) { + static const GTypeInfo ringbuffer_info = { + sizeof (GstJackRingBufferClass), + NULL, + NULL, + (GClassInitFunc) gst_jack_ring_buffer_class_init, + NULL, + NULL, + sizeof (GstJackRingBuffer), + 0, + (GInstanceInitFunc) gst_jack_ring_buffer_init, + NULL + }; + GType tmp = g_type_register_static (GST_TYPE_RING_BUFFER, + "GstJackAudioSinkRingBuffer", &ringbuffer_info, 0); + g_once_init_leave (&ringbuffer_type, tmp); + } + + return (GType) ringbuffer_type; +} + +static void +gst_jack_ring_buffer_class_init (GstJackRingBufferClass * klass) +{ + GstRingBufferClass *gstringbuffer_class; + + gstringbuffer_class = (GstRingBufferClass *) klass; + + ring_parent_class = g_type_class_peek_parent (klass); + + gstringbuffer_class->open_device = + GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_open_device); + gstringbuffer_class->close_device = + GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_close_device); + gstringbuffer_class->acquire = + GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_acquire); + gstringbuffer_class->release = + GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_release); + gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start); + gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_pause); + gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start); + gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_stop); + + gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_delay); +} + +/* this is the callback of jack. This should RT-safe. + */ +static int +jack_process_cb (jack_nframes_t nframes, void *arg) +{ + GstJackAudioSink *sink; + GstRingBuffer *buf; + gint readseg, len; + guint8 *readptr; + gint i, j, flen, channels; + sample_t *data; + + buf = GST_RING_BUFFER_CAST (arg); + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + channels = buf->spec.channels; + + /* get target buffers */ + for (i = 0; i < channels; i++) { + sink->buffers[i] = + (sample_t *) jack_port_get_buffer (sink->ports[i], nframes); + } + + if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) { + flen = len / channels; + + /* the number of samples must be exactly the segment size */ + if (nframes * sizeof (sample_t) != flen) + goto wrong_size; + + GST_DEBUG_OBJECT (sink, "copy %d frames: %p, %d bytes, %d channels", + nframes, readptr, flen, channels); + data = (sample_t *) readptr; + + /* the samples in the ringbuffer have the channels interleaved, we need to + * deinterleave into the jack target buffers */ + for (i = 0; i < nframes; i++) { + for (j = 0; j < channels; j++) { + sink->buffers[j][i] = *data++; + } + } + + /* clear written samples in the ringbuffer */ + gst_ring_buffer_clear (buf, readseg); + + /* we wrote one segment */ + gst_ring_buffer_advance (buf, 1); + } else { + GST_DEBUG_OBJECT (sink, "write %d frames silence", nframes); + /* We are not allowed to read from the ringbuffer, write silence to all + * jack output buffers */ + for (i = 0; i < channels; i++) { + memset (sink->buffers[i], 0, nframes * sizeof (sample_t)); + } + } + return 0; + + /* ERRORS */ +wrong_size: + { + GST_ERROR_OBJECT (sink, "nbytes (%d) != flen (%d)", + (gint) (nframes * sizeof (sample_t)), flen); + return 1; + } +} + +/* we error out */ +static int +jack_sample_rate_cb (jack_nframes_t nframes, void *arg) +{ + GstJackAudioSink *sink; + GstJackRingBuffer *abuf; + + abuf = GST_JACK_RING_BUFFER_CAST (arg); + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg)); + + if (abuf->sample_rate != -1 && abuf->sample_rate != nframes) + goto not_supported; + + return 0; + + /* ERRORS */ +not_supported: + { + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, + (NULL), ("Jack changed the sample rate, which is not supported")); + return 1; + } +} + +/* we error out */ +static int +jack_buffer_size_cb (jack_nframes_t nframes, void *arg) +{ + GstJackAudioSink *sink; + GstJackRingBuffer *abuf; + + abuf = GST_JACK_RING_BUFFER_CAST (arg); + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg)); + + if (abuf->buffer_size != -1 && abuf->buffer_size != nframes) + goto not_supported; + + return 0; + + /* ERRORS */ +not_supported: + { + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, + (NULL), ("Jack changed the buffer size, which is not supported")); + return 1; + } +} + +static void +jack_shutdown_cb (void *arg) +{ + GstJackAudioSink *sink; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg)); + + GST_DEBUG_OBJECT (sink, "shutdown"); + + GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, + (NULL), ("Jack server shutdown")); +} + +static void +gst_jack_ring_buffer_init (GstJackRingBuffer * buf, + GstJackRingBufferClass * g_class) +{ + buf->channels = -1; + buf->buffer_size = -1; + buf->sample_rate = -1; +} + +/* the _open_device method should make a connection with the server + */ +static gboolean +gst_jack_ring_buffer_open_device (GstRingBuffer * buf) +{ + GstJackAudioSink *sink; + jack_status_t status = 0; + const gchar *name; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (sink, "open"); + + if (sink->client_name) { + name = sink->client_name; + } else { + name = g_get_application_name (); + } + if (!name) + name = "GStreamer"; + + sink->client = gst_jack_audio_client_new (name, sink->server, + sink->jclient, + GST_JACK_CLIENT_SINK, + jack_shutdown_cb, + jack_process_cb, jack_buffer_size_cb, jack_sample_rate_cb, buf, &status); + if (sink->client == NULL) + goto could_not_open; + + GST_DEBUG_OBJECT (sink, "opened"); + + return TRUE; + + /* ERRORS */ +could_not_open: + { + if (status & JackServerFailed) { + GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, + (_("Jack server not found")), + ("Cannot connect to the Jack server (status %d)", status)); + } else { + GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, + (NULL), ("Jack client open error (status %d)", status)); + } + return FALSE; + } +} + +/* close the connection with the server + */ +static gboolean +gst_jack_ring_buffer_close_device (GstRingBuffer * buf) +{ + GstJackAudioSink *sink; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (sink, "close"); + + gst_jack_audio_sink_free_channels (sink); + gst_jack_audio_client_free (sink->client); + sink->client = NULL; + + return TRUE; +} + +/* allocate a buffer and setup resources to process the audio samples of + * the format as specified in @spec. + * + * We allocate N jack ports, one for each channel. If we are asked to + * automatically make a connection with physical ports, we connect as many + * ports as there are physical ports, leaving leftover ports unconnected. + * + * It is assumed that samplerate and number of channels are acceptable since our + * getcaps method will always provide correct values. If unacceptable caps are + * received for some reason, we fail here. + */ +static gboolean +gst_jack_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec) +{ + GstJackAudioSink *sink; + GstJackRingBuffer *abuf; + const char **ports; + gint sample_rate, buffer_size; + gint i, channels, res; + jack_client_t *client; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + abuf = GST_JACK_RING_BUFFER_CAST (buf); + + GST_DEBUG_OBJECT (sink, "acquire"); + + client = gst_jack_audio_client_get_client (sink->client); + + /* sample rate must be that of the server */ + sample_rate = jack_get_sample_rate (client); + if (sample_rate != spec->rate) + goto wrong_samplerate; + + channels = spec->channels; + + if (!gst_jack_audio_sink_allocate_channels (sink, channels)) + goto out_of_ports; + + buffer_size = jack_get_buffer_size (client); + + /* the segment size in bytes, this is large enough to hold a buffer of 32bit floats + * for all channels */ + spec->segsize = buffer_size * sizeof (gfloat) * channels; + spec->latency_time = gst_util_uint64_scale (spec->segsize, + (GST_SECOND / GST_USECOND), spec->rate * spec->bytes_per_sample); + /* segtotal based on buffer-time latency */ + spec->segtotal = spec->buffer_time / spec->latency_time; + if (spec->segtotal < 2) { + spec->segtotal = 2; + spec->buffer_time = spec->latency_time * spec->segtotal; + } + + GST_DEBUG_OBJECT (sink, "buffer time: %" G_GINT64_FORMAT " usec", + spec->buffer_time); + GST_DEBUG_OBJECT (sink, "latency time: %" G_GINT64_FORMAT " usec", + spec->latency_time); + GST_DEBUG_OBJECT (sink, "buffer_size %d, segsize %d, segtotal %d", + buffer_size, spec->segsize, spec->segtotal); + + /* allocate the ringbuffer memory now */ + buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize); + memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data)); + + if ((res = gst_jack_audio_client_set_active (sink->client, TRUE))) + goto could_not_activate; + + /* if we need to automatically connect the ports, do so now. We must do this + * after activating the client. */ + if (sink->connect == GST_JACK_CONNECT_AUTO + || sink->connect == GST_JACK_CONNECT_AUTO_FORCED) { + /* find all the physical input ports. A physical input port is a port + * associated with a hardware device. Someone needs connect to a physical + * port in order to hear something. */ + ports = jack_get_ports (client, NULL, NULL, + JackPortIsPhysical | JackPortIsInput); + if (ports == NULL) { + /* no ports? fine then we don't do anything except for posting a warning + * message. */ + GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL), + ("No physical input ports found, leaving ports unconnected")); + goto done; + } + + for (i = 0; i < channels; i++) { + /* stop when all input ports are exhausted */ + if (ports[i] == NULL) { + /* post a warning that we could not connect all ports */ + GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL), + ("No more physical ports, leaving some ports unconnected")); + break; + } + GST_DEBUG_OBJECT (sink, "try connecting to %s", + jack_port_name (sink->ports[i])); + /* connect the port to a physical port */ + res = jack_connect (client, jack_port_name (sink->ports[i]), ports[i]); + if (res != 0 && res != EEXIST) + goto cannot_connect; + } + free (ports); + } +done: + + abuf->sample_rate = sample_rate; + abuf->buffer_size = buffer_size; + abuf->channels = spec->channels; + + return TRUE; + + /* ERRORS */ +wrong_samplerate: + { + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), + ("Wrong samplerate, server is running at %d and we received %d", + sample_rate, spec->rate)); + return FALSE; + } +out_of_ports: + { + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), + ("Cannot allocate more Jack ports")); + return FALSE; + } +could_not_activate: + { + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), + ("Could not activate client (%d:%s)", res, g_strerror (res))); + return FALSE; + } +cannot_connect: + { + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), + ("Could not connect output ports to physical ports (%d:%s)", + res, g_strerror (res))); + free (ports); + return FALSE; + } +} + +/* function is called with LOCK */ +static gboolean +gst_jack_ring_buffer_release (GstRingBuffer * buf) +{ + GstJackAudioSink *sink; + GstJackRingBuffer *abuf; + gint res; + + abuf = GST_JACK_RING_BUFFER_CAST (buf); + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (sink, "release"); + + if ((res = gst_jack_audio_client_set_active (sink->client, FALSE))) { + /* we only warn, this means the server is probably shut down and the client + * is gone anyway. */ + GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL), + ("Could not deactivate Jack client (%d)", res)); + } + + abuf->channels = -1; + abuf->buffer_size = -1; + abuf->sample_rate = -1; + + /* free the buffer */ + gst_buffer_unref (buf->data); + buf->data = NULL; + + return TRUE; +} + +static gboolean +gst_jack_ring_buffer_start (GstRingBuffer * buf) +{ + GstJackAudioSink *sink; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (sink, "start"); + + return TRUE; +} + +static gboolean +gst_jack_ring_buffer_pause (GstRingBuffer * buf) +{ + GstJackAudioSink *sink; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (sink, "pause"); + + return TRUE; +} + +static gboolean +gst_jack_ring_buffer_stop (GstRingBuffer * buf) +{ + GstJackAudioSink *sink; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (sink, "stop"); + + return TRUE; +} + +#if defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7) +static guint +gst_jack_ring_buffer_delay (GstRingBuffer * buf) +{ + GstJackAudioSink *sink; + guint i, res = 0; + jack_latency_range_t range; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + for (i = 0; i < sink->port_count; i++) { + jack_port_get_latency_range (sink->ports[i], JackPlaybackLatency, &range); + if (range.max > res) + res = range.max; + } + + GST_LOG_OBJECT (sink, "delay %u", res); + + return res; +} +#else /* !(defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7)) */ +static guint +gst_jack_ring_buffer_delay (GstRingBuffer * buf) +{ + GstJackAudioSink *sink; + guint i, res = 0; + guint latency; + jack_client_t *client; + + sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + client = gst_jack_audio_client_get_client (sink->client); + + for (i = 0; i < sink->port_count; i++) { + latency = jack_port_get_total_latency (client, sink->ports[i]); + if (latency > res) + res = latency; + } + + GST_LOG_OBJECT (sink, "delay %u", res); + + return res; +} +#endif + +static GstStaticPadTemplate jackaudiosink_sink_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "endianness = (int) BYTE_ORDER, " + "width = (int) 32, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") + ); + +/* AudioSink signals and args */ +enum +{ + /* FILL ME */ + SIGNAL_LAST +}; + +#define DEFAULT_PROP_CONNECT GST_JACK_CONNECT_AUTO +#define DEFAULT_PROP_SERVER NULL +#define DEFAULT_PROP_CLIENT_NAME NULL + +enum +{ + PROP_0, + PROP_CONNECT, + PROP_SERVER, + PROP_CLIENT, + PROP_CLIENT_NAME, + PROP_LAST +}; + +#define _do_init(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_jack_audio_sink_debug, "jacksink", 0, "jacksink element"); + +GST_BOILERPLATE_FULL (GstJackAudioSink, gst_jack_audio_sink, GstBaseAudioSink, + GST_TYPE_BASE_AUDIO_SINK, _do_init); + +static void gst_jack_audio_sink_dispose (GObject * object); +static void gst_jack_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_jack_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_jack_audio_sink_getcaps (GstBaseSink * bsink); +static GstRingBuffer *gst_jack_audio_sink_create_ringbuffer (GstBaseAudioSink * + sink); + +static void +gst_jack_audio_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Audio Sink (Jack)", + "Sink/Audio", "Output audio to a JACK server", + "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &jackaudiosink_sink_factory); +} + +static void +gst_jack_audio_sink_class_init (GstJackAudioSinkClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSinkClass *gstbasesink_class; + GstBaseAudioSinkClass *gstbaseaudiosink_class; + + gobject_class = (GObjectClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; + + gobject_class->dispose = gst_jack_audio_sink_dispose; + gobject_class->get_property = gst_jack_audio_sink_get_property; + gobject_class->set_property = gst_jack_audio_sink_set_property; + + g_object_class_install_property (gobject_class, PROP_CONNECT, + g_param_spec_enum ("connect", "Connect", + "Specify how the output ports will be connected", + GST_TYPE_JACK_CONNECT, DEFAULT_PROP_CONNECT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_SERVER, + g_param_spec_string ("server", "Server", + "The Jack server to connect to (NULL = default)", + DEFAULT_PROP_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstJackAudioSink:client-name + * + * The client name to use. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_CLIENT_NAME, + g_param_spec_string ("client-name", "Client name", + "The client name of the Jack instance (NULL = default)", + DEFAULT_PROP_CLIENT_NAME, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_CLIENT, + g_param_spec_boxed ("client", "JackClient", "Handle for jack client", + GST_TYPE_JACK_CLIENT, + GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_jack_audio_sink_getcaps); + + gstbaseaudiosink_class->create_ringbuffer = + GST_DEBUG_FUNCPTR (gst_jack_audio_sink_create_ringbuffer); + + /* ref class from a thread-safe context to work around missing bit of + * thread-safety in GObject */ + g_type_class_ref (GST_TYPE_JACK_RING_BUFFER); + + gst_jack_audio_client_init (); +} + +static void +gst_jack_audio_sink_init (GstJackAudioSink * sink, + GstJackAudioSinkClass * g_class) +{ + sink->connect = DEFAULT_PROP_CONNECT; + sink->server = g_strdup (DEFAULT_PROP_SERVER); + sink->jclient = NULL; + sink->ports = NULL; + sink->port_count = 0; + sink->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME); + sink->buffers = NULL; +} + +static void +gst_jack_audio_sink_dispose (GObject * object) +{ + GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (object); + + gst_caps_replace (&sink->caps, NULL); + + if (sink->client_name != NULL) { + g_free (sink->client_name); + sink->client_name = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_jack_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstJackAudioSink *sink; + + sink = GST_JACK_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_CLIENT_NAME: + g_free (sink->client_name); + sink->client_name = g_value_dup_string (value); + break; + case PROP_CONNECT: + sink->connect = g_value_get_enum (value); + break; + case PROP_SERVER: + g_free (sink->server); + sink->server = g_value_dup_string (value); + break; + case PROP_CLIENT: + if (GST_STATE (sink) == GST_STATE_NULL || + GST_STATE (sink) == GST_STATE_READY) { + sink->jclient = g_value_get_boxed (value); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_jack_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstJackAudioSink *sink; + + sink = GST_JACK_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_CLIENT_NAME: + g_value_set_string (value, sink->client_name); + break; + case PROP_CONNECT: + g_value_set_enum (value, sink->connect); + break; + case PROP_SERVER: + g_value_set_string (value, sink->server); + break; + case PROP_CLIENT: + g_value_set_boxed (value, sink->jclient); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_jack_audio_sink_getcaps (GstBaseSink * bsink) +{ + GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (bsink); + const char **ports; + gint min, max; + gint rate; + jack_client_t *client; + + if (sink->client == NULL) + goto no_client; + + client = gst_jack_audio_client_get_client (sink->client); + + if (sink->connect == GST_JACK_CONNECT_AUTO) { + /* get a port count, this is the number of channels we can automatically + * connect. */ + ports = jack_get_ports (client, NULL, NULL, + JackPortIsPhysical | JackPortIsInput); + max = 0; + if (ports != NULL) { + for (; ports[max]; max++); + free (ports); + } else + max = 0; + } else { + /* we allow any number of pads, something else is going to connect the + * pads. */ + max = G_MAXINT; + } + min = MIN (1, max); + + rate = jack_get_sample_rate (client); + + GST_DEBUG_OBJECT (sink, "got %d-%d ports, samplerate: %d", min, max, rate); + + if (!sink->caps) { + sink->caps = gst_caps_new_simple ("audio/x-raw-float", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "width", G_TYPE_INT, 32, + "rate", G_TYPE_INT, rate, + "channels", GST_TYPE_INT_RANGE, min, max, NULL); + } + GST_INFO_OBJECT (sink, "returning caps %" GST_PTR_FORMAT, sink->caps); + + return gst_caps_ref (sink->caps); + + /* ERRORS */ +no_client: + { + GST_DEBUG_OBJECT (sink, "device not open, using template caps"); + /* base class will get template caps for us when we return NULL */ + return NULL; + } +} + +static GstRingBuffer * +gst_jack_audio_sink_create_ringbuffer (GstBaseAudioSink * sink) +{ + GstRingBuffer *buffer; + + buffer = g_object_new (GST_TYPE_JACK_RING_BUFFER, NULL); + GST_DEBUG_OBJECT (sink, "created ringbuffer @%p", buffer); + + return buffer; +} diff --git a/ext/jack/gstjackaudiosink.h b/ext/jack/gstjackaudiosink.h new file mode 100644 index 0000000..db5fc28 --- /dev/null +++ b/ext/jack/gstjackaudiosink.h @@ -0,0 +1,80 @@ +/* GStreamer + * Copyright (C) 2006 Wim Taymans + * + * gstjacksink.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_JACK_AUDIO_SINK_H__ +#define __GST_JACK_AUDIO_SINK_H__ + +#include + +#include +#include + +#include "gstjack.h" +#include "gstjackaudioclient.h" + +G_BEGIN_DECLS + +#define GST_TYPE_JACK_AUDIO_SINK (gst_jack_audio_sink_get_type()) +#define GST_JACK_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JACK_AUDIO_SINK,GstJackAudioSink)) +#define GST_JACK_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JACK_AUDIO_SINK,GstJackAudioSinkClass)) +#define GST_JACK_AUDIO_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_JACK_AUDIO_SINK,GstJackAudioSinkClass)) +#define GST_IS_JACK_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JACK_AUDIO_SINK)) +#define GST_IS_JACK_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JACK_AUDIO_SINK)) + +typedef struct _GstJackAudioSink GstJackAudioSink; +typedef struct _GstJackAudioSinkClass GstJackAudioSinkClass; + +/** + * GstJackAudioSink: + * + * Opaque #GstJackAudioSink. + */ +struct _GstJackAudioSink { + GstBaseAudioSink element; + + /*< private >*/ + /* cached caps */ + GstCaps *caps; + + /* properties */ + GstJackConnect connect; + gchar *server; + jack_client_t *jclient; + gchar *client_name; + + /* our client */ + GstJackAudioClient *client; + + /* our ports */ + jack_port_t **ports; + int port_count; + sample_t **buffers; +}; + +struct _GstJackAudioSinkClass { + GstBaseAudioSinkClass parent_class; +}; + +GType gst_jack_audio_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_JACK_AUDIO_SINK_H__ */ diff --git a/ext/jack/gstjackaudiosrc.c b/ext/jack/gstjackaudiosrc.c new file mode 100644 index 0000000..3c37970 --- /dev/null +++ b/ext/jack/gstjackaudiosrc.c @@ -0,0 +1,924 @@ +/* GStreamer + * Copyright (C) 2008 Tristan Matthews + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** + * SECTION:element-jackaudiosrc + * @see_also: #GstBaseAudioSrc, #GstRingBuffer + * + * A Src that inputs data from Jack ports. + * + * It will create N Jack ports named in_<name>_<num> where + * <name> is the element name and <num> is starting from 1. + * Each port corresponds to a gstreamer channel. + * + * The samplerate as exposed on the caps is always the same as the samplerate of + * the jack server. + * + * When the #GstJackAudioSrc:connect property is set to auto, this element + * will try to connect each input port to a random physical jack output pin. + * + * When the #GstJackAudioSrc:connect property is set to none, the element will + * accept any number of output channels and will create (but not connect) an + * input port for each channel. + * + * The element will generate an error when the Jack server is shut down when it + * was PAUSED or PLAYING. This element does not support dynamic rate and buffer + * size changes at runtime. + * + * + * Example launch line + * |[ + * gst-launch jackaudiosrc connect=0 ! jackaudiosink connect=0 + * ]| Get audio input into gstreamer from jack. + * + * + * Last reviewed on 2008-07-22 (0.10.4) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "gstjackaudiosrc.h" +#include "gstjackringbuffer.h" +#include "gstjackutil.h" + +GST_DEBUG_CATEGORY_STATIC (gst_jack_audio_src_debug); +#define GST_CAT_DEFAULT gst_jack_audio_src_debug + +static gboolean +gst_jack_audio_src_allocate_channels (GstJackAudioSrc * src, gint channels) +{ + jack_client_t *client; + + client = gst_jack_audio_client_get_client (src->client); + + /* remove ports we don't need */ + while (src->port_count > channels) + jack_port_unregister (client, src->ports[--src->port_count]); + + /* alloc enough input ports */ + src->ports = g_realloc (src->ports, sizeof (jack_port_t *) * channels); + src->buffers = g_realloc (src->buffers, sizeof (sample_t *) * channels); + + /* create an input port for each channel */ + while (src->port_count < channels) { + gchar *name; + + /* port names start from 1 and are local to the element */ + name = + g_strdup_printf ("in_%s_%d", GST_ELEMENT_NAME (src), + src->port_count + 1); + src->ports[src->port_count] = + jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE, + JackPortIsInput, 0); + if (src->ports[src->port_count] == NULL) + return FALSE; + + src->port_count++; + + g_free (name); + } + return TRUE; +} + +static void +gst_jack_audio_src_free_channels (GstJackAudioSrc * src) +{ + gint res, i = 0; + jack_client_t *client; + + client = gst_jack_audio_client_get_client (src->client); + + /* get rid of all ports */ + while (src->port_count) { + GST_LOG_OBJECT (src, "unregister port %d", i); + if ((res = jack_port_unregister (client, src->ports[i++]))) + GST_DEBUG_OBJECT (src, "unregister of port failed (%d)", res); + + src->port_count--; + } + g_free (src->ports); + src->ports = NULL; + g_free (src->buffers); + src->buffers = NULL; +} + +/* ringbuffer abstract base class */ +static GType +gst_jack_ring_buffer_get_type (void) +{ + static volatile gsize ringbuffer_type = 0; + + if (g_once_init_enter (&ringbuffer_type)) { + static const GTypeInfo ringbuffer_info = { sizeof (GstJackRingBufferClass), + NULL, + NULL, + (GClassInitFunc) gst_jack_ring_buffer_class_init, + NULL, + NULL, + sizeof (GstJackRingBuffer), + 0, + (GInstanceInitFunc) gst_jack_ring_buffer_init, + NULL + }; + GType tmp = g_type_register_static (GST_TYPE_RING_BUFFER, + "GstJackAudioSrcRingBuffer", &ringbuffer_info, 0); + g_once_init_leave (&ringbuffer_type, tmp); + } + + return (GType) ringbuffer_type; +} + +static void +gst_jack_ring_buffer_class_init (GstJackRingBufferClass * klass) +{ + GstRingBufferClass *gstringbuffer_class; + + gstringbuffer_class = (GstRingBufferClass *) klass; + + ring_parent_class = g_type_class_peek_parent (klass); + + gstringbuffer_class->open_device = + GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_open_device); + gstringbuffer_class->close_device = + GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_close_device); + gstringbuffer_class->acquire = + GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_acquire); + gstringbuffer_class->release = + GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_release); + gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start); + gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_pause); + gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start); + gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_stop); + + gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_delay); +} + +/* this is the callback of jack. This should be RT-safe. + * Writes samples from the jack input port's buffer to the gst ring buffer. + */ +static int +jack_process_cb (jack_nframes_t nframes, void *arg) +{ + GstJackAudioSrc *src; + GstRingBuffer *buf; + gint len; + guint8 *writeptr; + gint writeseg; + gint channels, i, j, flen; + sample_t *data; + + buf = GST_RING_BUFFER_CAST (arg); + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + channels = buf->spec.channels; + + /* get input buffers */ + for (i = 0; i < channels; i++) + src->buffers[i] = + (sample_t *) jack_port_get_buffer (src->ports[i], nframes); + + if (gst_ring_buffer_prepare_read (buf, &writeseg, &writeptr, &len)) { + flen = len / channels; + + /* the number of samples must be exactly the segment size */ + if (nframes * sizeof (sample_t) != flen) + goto wrong_size; + + /* the samples in the jack input buffers have to be interleaved into the + * ringbuffer */ + data = (sample_t *) writeptr; + for (i = 0; i < nframes; ++i) + for (j = 0; j < channels; ++j) + *data++ = src->buffers[j][i]; + + GST_DEBUG ("copy %d frames: %p, %d bytes, %d channels", nframes, writeptr, + len / channels, channels); + + /* we wrote one segment */ + gst_ring_buffer_advance (buf, 1); + } + return 0; + + /* ERRORS */ +wrong_size: + { + GST_ERROR_OBJECT (src, "nbytes (%d) != flen (%d)", + (gint) (nframes * sizeof (sample_t)), flen); + return 1; + } +} + +/* we error out */ +static int +jack_sample_rate_cb (jack_nframes_t nframes, void *arg) +{ + GstJackAudioSrc *src; + GstJackRingBuffer *abuf; + + abuf = GST_JACK_RING_BUFFER_CAST (arg); + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (arg)); + + if (abuf->sample_rate != -1 && abuf->sample_rate != nframes) + goto not_supported; + + return 0; + + /* ERRORS */ +not_supported: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, + (NULL), ("Jack changed the sample rate, which is not supported")); + return 1; + } +} + +/* we error out */ +static int +jack_buffer_size_cb (jack_nframes_t nframes, void *arg) +{ + GstJackAudioSrc *src; + GstJackRingBuffer *abuf; + + abuf = GST_JACK_RING_BUFFER_CAST (arg); + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (arg)); + + if (abuf->buffer_size != -1 && abuf->buffer_size != nframes) + goto not_supported; + + return 0; + + /* ERRORS */ +not_supported: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, + (NULL), ("Jack changed the buffer size, which is not supported")); + return 1; + } +} + +static void +jack_shutdown_cb (void *arg) +{ + GstJackAudioSrc *src; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (arg)); + + GST_DEBUG_OBJECT (src, "shutdown"); + + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, + (NULL), ("Jack server shutdown")); +} + +static void +gst_jack_ring_buffer_init (GstJackRingBuffer * buf, + GstJackRingBufferClass * g_class) +{ + buf->channels = -1; + buf->buffer_size = -1; + buf->sample_rate = -1; +} + +/* the _open_device method should make a connection with the server +*/ +static gboolean +gst_jack_ring_buffer_open_device (GstRingBuffer * buf) +{ + GstJackAudioSrc *src; + jack_status_t status = 0; + const gchar *name; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (src, "open"); + + if (src->client_name) { + name = src->client_name; + } else { + name = g_get_application_name (); + } + if (!name) + name = "GStreamer"; + + src->client = gst_jack_audio_client_new (name, src->server, + src->jclient, + GST_JACK_CLIENT_SOURCE, + jack_shutdown_cb, + jack_process_cb, jack_buffer_size_cb, jack_sample_rate_cb, buf, &status); + if (src->client == NULL) + goto could_not_open; + + GST_DEBUG_OBJECT (src, "opened"); + + return TRUE; + + /* ERRORS */ +could_not_open: + { + if (status & (JackServerFailed | JackFailure)) { + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, + (_("Jack server not found")), + ("Cannot connect to the Jack server (status %d)", status)); + } else { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + (NULL), ("Jack client open error (status %d)", status)); + } + return FALSE; + } +} + +/* close the connection with the server +*/ +static gboolean +gst_jack_ring_buffer_close_device (GstRingBuffer * buf) +{ + GstJackAudioSrc *src; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (src, "close"); + + gst_jack_audio_src_free_channels (src); + gst_jack_audio_client_free (src->client); + src->client = NULL; + + return TRUE; +} + + +/* allocate a buffer and setup resources to process the audio samples of + * the format as specified in @spec. + * + * We allocate N jack ports, one for each channel. If we are asked to + * automatically make a connection with physical ports, we connect as many + * ports as there are physical ports, leaving leftover ports unconnected. + * + * It is assumed that samplerate and number of channels are acceptable since our + * getcaps method will always provide correct values. If unacceptable caps are + * received for some reason, we fail here. + */ +static gboolean +gst_jack_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec) +{ + GstJackAudioSrc *src; + GstJackRingBuffer *abuf; + const char **ports; + gint sample_rate, buffer_size; + gint i, channels, res; + jack_client_t *client; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + abuf = GST_JACK_RING_BUFFER_CAST (buf); + + GST_DEBUG_OBJECT (src, "acquire"); + + client = gst_jack_audio_client_get_client (src->client); + + /* sample rate must be that of the server */ + sample_rate = jack_get_sample_rate (client); + if (sample_rate != spec->rate) + goto wrong_samplerate; + + channels = spec->channels; + + if (!gst_jack_audio_src_allocate_channels (src, channels)) + goto out_of_ports; + + gst_jack_set_layout_on_caps (&spec->caps, channels); + + buffer_size = jack_get_buffer_size (client); + + /* the segment size in bytes, this is large enough to hold a buffer of 32bit floats + * for all channels */ + spec->segsize = buffer_size * sizeof (gfloat) * channels; + spec->latency_time = gst_util_uint64_scale (spec->segsize, + (GST_SECOND / GST_USECOND), spec->rate * spec->bytes_per_sample); + /* segtotal based on buffer-time latency */ + spec->segtotal = spec->buffer_time / spec->latency_time; + if (spec->segtotal < 2) { + spec->segtotal = 2; + spec->buffer_time = spec->latency_time * spec->segtotal; + } + + GST_DEBUG_OBJECT (src, "buffer time: %" G_GINT64_FORMAT " usec", + spec->buffer_time); + GST_DEBUG_OBJECT (src, "latency time: %" G_GINT64_FORMAT " usec", + spec->latency_time); + GST_DEBUG_OBJECT (src, "buffer_size %d, segsize %d, segtotal %d", + buffer_size, spec->segsize, spec->segtotal); + + /* allocate the ringbuffer memory now */ + buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize); + memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data)); + + if ((res = gst_jack_audio_client_set_active (src->client, TRUE))) + goto could_not_activate; + + /* if we need to automatically connect the ports, do so now. We must do this + * after activating the client. */ + if (src->connect == GST_JACK_CONNECT_AUTO + || src->connect == GST_JACK_CONNECT_AUTO_FORCED) { + /* find all the physical output ports. A physical output port is a port + * associated with a hardware device. Someone needs connect to a physical + * port in order to capture something. */ + ports = + jack_get_ports (client, NULL, NULL, + JackPortIsPhysical | JackPortIsOutput); + if (ports == NULL) { + /* no ports? fine then we don't do anything except for posting a warning + * message. */ + GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL), + ("No physical output ports found, leaving ports unconnected")); + goto done; + } + + for (i = 0; i < channels; i++) { + /* stop when all output ports are exhausted */ + if (ports[i] == NULL) { + /* post a warning that we could not connect all ports */ + GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL), + ("No more physical ports, leaving some ports unconnected")); + break; + } + GST_DEBUG_OBJECT (src, "try connecting to %s", + jack_port_name (src->ports[i])); + + /* connect the physical port to a port */ + res = jack_connect (client, ports[i], jack_port_name (src->ports[i])); + if (res != 0 && res != EEXIST) + goto cannot_connect; + } + free (ports); + } +done: + + abuf->sample_rate = sample_rate; + abuf->buffer_size = buffer_size; + abuf->channels = spec->channels; + + return TRUE; + + /* ERRORS */ +wrong_samplerate: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Wrong samplerate, server is running at %d and we received %d", + sample_rate, spec->rate)); + return FALSE; + } +out_of_ports: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Cannot allocate more Jack ports")); + return FALSE; + } +could_not_activate: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Could not activate client (%d:%s)", res, g_strerror (res))); + return FALSE; + } +cannot_connect: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Could not connect input ports to physical ports (%d:%s)", + res, g_strerror (res))); + free (ports); + return FALSE; + } +} + +/* function is called with LOCK */ +static gboolean +gst_jack_ring_buffer_release (GstRingBuffer * buf) +{ + GstJackAudioSrc *src; + GstJackRingBuffer *abuf; + gint res; + + abuf = GST_JACK_RING_BUFFER_CAST (buf); + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (src, "release"); + + if ((res = gst_jack_audio_client_set_active (src->client, FALSE))) { + /* we only warn, this means the server is probably shut down and the client + * is gone anyway. */ + GST_ELEMENT_WARNING (src, RESOURCE, CLOSE, (NULL), + ("Could not deactivate Jack client (%d)", res)); + } + + abuf->channels = -1; + abuf->buffer_size = -1; + abuf->sample_rate = -1; + + /* free the buffer */ + gst_buffer_unref (buf->data); + buf->data = NULL; + + return TRUE; +} + +static gboolean +gst_jack_ring_buffer_start (GstRingBuffer * buf) +{ + GstJackAudioSrc *src; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (src, "start"); + + return TRUE; +} + +static gboolean +gst_jack_ring_buffer_pause (GstRingBuffer * buf) +{ + GstJackAudioSrc *src; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (src, "pause"); + + return TRUE; +} + +static gboolean +gst_jack_ring_buffer_stop (GstRingBuffer * buf) +{ + GstJackAudioSrc *src; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + GST_DEBUG_OBJECT (src, "stop"); + + return TRUE; +} + +#if defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7) +static guint +gst_jack_ring_buffer_delay (GstRingBuffer * buf) +{ + GstJackAudioSrc *src; + guint i, res = 0; + jack_latency_range_t range; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + for (i = 0; i < src->port_count; i++) { + jack_port_get_latency_range (src->ports[i], JackCaptureLatency, &range); + if (range.max > res) + res = range.max; + } + + GST_DEBUG_OBJECT (src, "delay %u", res); + + return res; +} +#else /* !(defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7)) */ +static guint +gst_jack_ring_buffer_delay (GstRingBuffer * buf) +{ + GstJackAudioSrc *src; + guint i, res = 0; + guint latency; + jack_client_t *client; + + src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + client = gst_jack_audio_client_get_client (src->client); + + for (i = 0; i < src->port_count; i++) { + latency = jack_port_get_total_latency (client, src->ports[i]); + if (latency > res) + res = latency; + } + + GST_DEBUG_OBJECT (src, "delay %u", res); + + return res; +} +#endif + +/* Audiosrc signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_PROP_CONNECT GST_JACK_CONNECT_AUTO +#define DEFAULT_PROP_SERVER NULL +#define DEFAULT_PROP_CLIENT_NAME NULL + +enum +{ + PROP_0, + PROP_CONNECT, + PROP_SERVER, + PROP_CLIENT, + PROP_CLIENT_NAME, + PROP_LAST +}; + + +/* the capabilities of the inputs and outputs. + * + * describe the real formats here. + */ + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "endianness = (int) BYTE_ORDER, " + "width = (int) 32, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") + ); + +#define _do_init(bla) \ + GST_DEBUG_CATEGORY_INIT(gst_jack_audio_src_debug, "jacksrc", 0, "jacksrc element"); + +GST_BOILERPLATE_FULL (GstJackAudioSrc, gst_jack_audio_src, GstBaseAudioSrc, + GST_TYPE_BASE_AUDIO_SRC, _do_init); + +static void gst_jack_audio_src_dispose (GObject * object); +static void gst_jack_audio_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_jack_audio_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_jack_audio_src_getcaps (GstBaseSrc * bsrc); +static GstRingBuffer *gst_jack_audio_src_create_ringbuffer (GstBaseAudioSrc * + src); + +/* GObject vmethod implementations */ + +static void +gst_jack_audio_src_base_init (gpointer gclass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_set_details_simple (element_class, "Audio Source (Jack)", + "Source/Audio", "Captures audio from a JACK server", + "Tristan Matthews "); +} + +/* initialize the jack_audio_src's class */ +static void +gst_jack_audio_src_class_init (GstJackAudioSrcClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + GstBaseAudioSrcClass *gstbaseaudiosrc_class; + + gobject_class = (GObjectClass *) klass; + + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass; + + gobject_class->dispose = gst_jack_audio_src_dispose; + gobject_class->set_property = gst_jack_audio_src_set_property; + gobject_class->get_property = gst_jack_audio_src_get_property; + + g_object_class_install_property (gobject_class, PROP_CONNECT, + g_param_spec_enum ("connect", "Connect", + "Specify how the input ports will be connected", + GST_TYPE_JACK_CONNECT, DEFAULT_PROP_CONNECT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_SERVER, + g_param_spec_string ("server", "Server", + "The Jack server to connect to (NULL = default)", + DEFAULT_PROP_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstJackAudioSrc:client-name + * + * The client name to use. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_CLIENT_NAME, + g_param_spec_string ("client-name", "Client name", + "The client name of the Jack instance (NULL = default)", + DEFAULT_PROP_CLIENT_NAME, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_CLIENT, + g_param_spec_boxed ("client", "JackClient", "Handle for jack client", + GST_TYPE_JACK_CLIENT, + GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_jack_audio_src_getcaps); + gstbaseaudiosrc_class->create_ringbuffer = + GST_DEBUG_FUNCPTR (gst_jack_audio_src_create_ringbuffer); + + /* ref class from a thread-safe context to work around missing bit of + * thread-safety in GObject */ + g_type_class_ref (GST_TYPE_JACK_RING_BUFFER); + + gst_jack_audio_client_init (); +} + +/* initialize the new element + * instantiate pads and add them to element + * set pad calback functions + * initialize instance structure + */ +static void +gst_jack_audio_src_init (GstJackAudioSrc * src, GstJackAudioSrcClass * gclass) +{ + //gst_base_src_set_live(GST_BASE_SRC (src), TRUE); + src->connect = DEFAULT_PROP_CONNECT; + src->server = g_strdup (DEFAULT_PROP_SERVER); + src->jclient = NULL; + src->ports = NULL; + src->port_count = 0; + src->buffers = NULL; + src->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME); +} + +static void +gst_jack_audio_src_dispose (GObject * object) +{ + GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (object); + + gst_caps_replace (&src->caps, NULL); + + if (src->client_name != NULL) { + g_free (src->client_name); + src->client_name = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_jack_audio_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (object); + + switch (prop_id) { + case PROP_CLIENT_NAME: + g_free (src->client_name); + src->client_name = g_value_dup_string (value); + break; + case PROP_CONNECT: + src->connect = g_value_get_enum (value); + break; + case PROP_SERVER: + g_free (src->server); + src->server = g_value_dup_string (value); + break; + case PROP_CLIENT: + if (GST_STATE (src) == GST_STATE_NULL || + GST_STATE (src) == GST_STATE_READY) { + src->jclient = g_value_get_boxed (value); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_jack_audio_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (object); + + switch (prop_id) { + case PROP_CLIENT_NAME: + g_value_set_string (value, src->client_name); + break; + case PROP_CONNECT: + g_value_set_enum (value, src->connect); + break; + case PROP_SERVER: + g_value_set_string (value, src->server); + break; + case PROP_CLIENT: + g_value_set_boxed (value, src->jclient); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_jack_audio_src_getcaps (GstBaseSrc * bsrc) +{ + GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (bsrc); + const char **ports; + gint min, max; + gint rate; + jack_client_t *client; + + if (src->client == NULL) + goto no_client; + + client = gst_jack_audio_client_get_client (src->client); + + if (src->connect == GST_JACK_CONNECT_AUTO) { + /* get a port count, this is the number of channels we can automatically + * connect. */ + ports = jack_get_ports (client, NULL, NULL, + JackPortIsPhysical | JackPortIsOutput); + max = 0; + if (ports != NULL) { + for (; ports[max]; max++); + + free (ports); + } else + max = 0; + } else { + /* we allow any number of pads, something else is going to connect the + * pads. */ + max = G_MAXINT; + } + min = MIN (1, max); + + rate = jack_get_sample_rate (client); + + GST_DEBUG_OBJECT (src, "got %d-%d ports, samplerate: %d", min, max, rate); + + if (!src->caps) { + src->caps = gst_caps_new_simple ("audio/x-raw-float", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "width", G_TYPE_INT, 32, + "rate", G_TYPE_INT, rate, + "channels", GST_TYPE_INT_RANGE, min, max, NULL); + } + GST_INFO_OBJECT (src, "returning caps %" GST_PTR_FORMAT, src->caps); + + return gst_caps_ref (src->caps); + + /* ERRORS */ +no_client: + { + GST_DEBUG_OBJECT (src, "device not open, using template caps"); + /* base class will get template caps for us when we return NULL */ + return NULL; + } +} + +static GstRingBuffer * +gst_jack_audio_src_create_ringbuffer (GstBaseAudioSrc * src) +{ + GstRingBuffer *buffer; + + buffer = g_object_new (GST_TYPE_JACK_RING_BUFFER, NULL); + GST_DEBUG_OBJECT (src, "created ringbuffer @%p", buffer); + + return buffer; +} diff --git a/ext/jack/gstjackaudiosrc.h b/ext/jack/gstjackaudiosrc.h new file mode 100644 index 0000000..b69a4d6 --- /dev/null +++ b/ext/jack/gstjackaudiosrc.h @@ -0,0 +1,98 @@ +/* GStreamer + * Copyright (C) 2008 Tristan Matthews + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_JACK_AUDIO_SRC_H__ +#define __GST_JACK_AUDIO_SRC_H__ + +#include + +#include +#include + +#include "gstjackaudioclient.h" +#include "gstjack.h" + +G_BEGIN_DECLS + +#define GST_TYPE_JACK_AUDIO_SRC (gst_jack_audio_src_get_type()) +#define GST_JACK_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JACK_AUDIO_SRC,GstJackAudioSrc)) +#define GST_JACK_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JACK_AUDIO_SRC,GstJackAudioSrcClass)) +#define GST_JACK_AUDIO_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_JACK_AUDIO_SRC,GstJackAudioSrcClass)) +#define GST_IS_JACK_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JACK_AUDIO_SRC)) +#define GST_IS_JACK_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JACK_AUDIO_SRC)) + +typedef struct _GstJackAudioSrc GstJackAudioSrc; +typedef struct _GstJackAudioSrcClass GstJackAudioSrcClass; + +struct _GstJackAudioSrc +{ + GstBaseAudioSrc src; + + /*< private >*/ + /* cached caps */ + GstCaps *caps; + + /* properties */ + GstJackConnect connect; + gchar *server; + jack_client_t *jclient; + gchar *client_name; + + /* our client */ + GstJackAudioClient *client; + + /* our ports */ + jack_port_t **ports; + int port_count; + sample_t **buffers; +}; + +struct _GstJackAudioSrcClass +{ + GstBaseAudioSrcClass parent_class; +}; + +GType gst_jack_audio_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_JACK_AUDIO_SRC_H__ */ diff --git a/ext/jack/gstjackringbuffer.h b/ext/jack/gstjackringbuffer.h new file mode 100644 index 0000000..266fdfa --- /dev/null +++ b/ext/jack/gstjackringbuffer.h @@ -0,0 +1,88 @@ +/* + * GStreamer + * Copyright (C) 2006 Wim Taymans + * Copyright (C) 2008 Tristan Matthews + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_JACK_RING_BUFFER_H__ +#define __GST_JACK_RING_BUFFER_H__ + +#define GST_TYPE_JACK_RING_BUFFER (gst_jack_ring_buffer_get_type()) +#define GST_JACK_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JACK_RING_BUFFER,GstJackRingBuffer)) +#define GST_JACK_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JACK_RING_BUFFER,GstJackRingBufferClass)) +#define GST_JACK_RING_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_JACK_RING_BUFFER,GstJackRingBufferClass)) +#define GST_JACK_RING_BUFFER_CAST(obj) ((GstJackRingBuffer *)obj) +#define GST_IS_JACK_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JACK_RING_BUFFER)) +#define GST_IS_JACK_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JACK_RING_BUFFER)) + +typedef struct _GstJackRingBuffer GstJackRingBuffer; +typedef struct _GstJackRingBufferClass GstJackRingBufferClass; + +struct _GstJackRingBuffer +{ + GstRingBuffer object; + + gint sample_rate; + gint buffer_size; + gint channels; +}; + +struct _GstJackRingBufferClass +{ + GstRingBufferClass parent_class; +}; + +static void gst_jack_ring_buffer_class_init(GstJackRingBufferClass * klass); +static void gst_jack_ring_buffer_init(GstJackRingBuffer * ringbuffer, + GstJackRingBufferClass * klass); + +static GstRingBufferClass *ring_parent_class = NULL; + +static gboolean gst_jack_ring_buffer_open_device(GstRingBuffer * buf); +static gboolean gst_jack_ring_buffer_close_device(GstRingBuffer * buf); +static gboolean gst_jack_ring_buffer_acquire(GstRingBuffer * buf,GstRingBufferSpec * spec); +static gboolean gst_jack_ring_buffer_release(GstRingBuffer * buf); +static gboolean gst_jack_ring_buffer_start(GstRingBuffer * buf); +static gboolean gst_jack_ring_buffer_pause(GstRingBuffer * buf); +static gboolean gst_jack_ring_buffer_stop(GstRingBuffer * buf); +static guint gst_jack_ring_buffer_delay(GstRingBuffer * buf); + +#endif diff --git a/ext/jack/gstjackutil.c b/ext/jack/gstjackutil.c new file mode 100644 index 0000000..cde84d8 --- /dev/null +++ b/ext/jack/gstjackutil.c @@ -0,0 +1,114 @@ +/* GStreamer Jack utility functions + * Copyright (C) 2010 Tristan Matthews + * + * 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 "gstjackutil.h" +#include + +static const GstAudioChannelPosition default_positions[8][8] = { + /* 1 channel */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_MONO, + }, + /* 2 channels */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + }, + /* 3 channels (2.1) */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_LFE, /* or FRONT_CENTER for 3.0? */ + }, + /* 4 channels (4.0 or 3.1?) */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + }, + /* 5 channels */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + }, + /* 6 channels */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + }, + /* 7 channels */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, + }, + /* 8 channels */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + } +}; + + +/* if channels are less than or equal to 8, we set a default layout, + * otherwise set layout to an array of GST_AUDIO_CHANNEL_POSITION_NONE */ +void +gst_jack_set_layout_on_caps (GstCaps ** caps, gint channels) +{ + int c; + GValue pos = { 0 }; + GValue chanpos = { 0 }; + gst_caps_unref (*caps); + + if (channels <= 8) { + g_assert (channels >= 1); + gst_audio_set_channel_positions (gst_caps_get_structure (*caps, 0), + default_positions[channels - 1]); + } else { + g_value_init (&chanpos, GST_TYPE_ARRAY); + g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION); + for (c = 0; c < channels; c++) { + g_value_set_enum (&pos, GST_AUDIO_CHANNEL_POSITION_NONE); + gst_value_array_append_value (&chanpos, &pos); + } + g_value_unset (&pos); + gst_structure_set_value (gst_caps_get_structure (*caps, 0), + "channel-positions", &chanpos); + g_value_unset (&chanpos); + } + gst_caps_ref (*caps); +} diff --git a/ext/jack/gstjackutil.h b/ext/jack/gstjackutil.h new file mode 100644 index 0000000..e330afd --- /dev/null +++ b/ext/jack/gstjackutil.h @@ -0,0 +1,30 @@ +/* GStreamer + * Copyright (C) 2010 Tristan Matthews + * + * gstjackutil.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _GST_JACK_UTIL_H_ +#define _GST_JACK_UTIL_H_ + +#include + +void +gst_jack_set_layout_on_caps (GstCaps **caps, gint channels); + +#endif // _GST_JACK_UTIL_H_ diff --git a/ext/jpeg/Makefile.am b/ext/jpeg/Makefile.am new file mode 100644 index 0000000..a72f12f --- /dev/null +++ b/ext/jpeg/Makefile.am @@ -0,0 +1,21 @@ +plugin_LTLIBRARIES = libgstjpeg.la + +libgstjpeg_la_SOURCES = \ + gstjpeg.c \ + gstjpegenc.c \ + gstjpegdec.c \ + gstsmokeenc.c \ + smokecodec.c \ + gstsmokedec.c + +libgstjpeg_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstjpeg_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(JPEG_LIBS) $(LIBM) +libgstjpeg_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstjpeg_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + gstjpeg.h \ + gstjpegdec.h gstjpegenc.h \ + gstsmokeenc.h gstsmokedec.h \ + smokecodec.h smokeformat.h diff --git a/ext/jpeg/Makefile.in b/ext/jpeg/Makefile.in new file mode 100644 index 0000000..3cc176c --- /dev/null +++ b/ext/jpeg/Makefile.in @@ -0,0 +1,863 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/jpeg +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstjpeg_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstjpeg_la_OBJECTS = libgstjpeg_la-gstjpeg.lo \ + libgstjpeg_la-gstjpegenc.lo libgstjpeg_la-gstjpegdec.lo \ + libgstjpeg_la-gstsmokeenc.lo libgstjpeg_la-smokecodec.lo \ + libgstjpeg_la-gstsmokedec.lo +libgstjpeg_la_OBJECTS = $(am_libgstjpeg_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstjpeg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstjpeg_la_CFLAGS) $(CFLAGS) \ + $(libgstjpeg_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstjpeg_la_SOURCES) +DIST_SOURCES = $(libgstjpeg_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstjpeg.la +libgstjpeg_la_SOURCES = \ + gstjpeg.c \ + gstjpegenc.c \ + gstjpegdec.c \ + gstsmokeenc.c \ + smokecodec.c \ + gstsmokedec.c + +libgstjpeg_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstjpeg_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(JPEG_LIBS) $(LIBM) + +libgstjpeg_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstjpeg_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + gstjpeg.h \ + gstjpegdec.h gstjpegenc.h \ + gstsmokeenc.h gstsmokedec.h \ + smokecodec.h smokeformat.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/jpeg/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/jpeg/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstjpeg.la: $(libgstjpeg_la_OBJECTS) $(libgstjpeg_la_DEPENDENCIES) $(EXTRA_libgstjpeg_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstjpeg_la_LINK) -rpath $(plugindir) $(libgstjpeg_la_OBJECTS) $(libgstjpeg_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstjpeg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstjpegdec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstjpegenc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstsmokedec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstsmokeenc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-smokecodec.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstjpeg_la-gstjpeg.lo: gstjpeg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstjpeg.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstjpeg.Tpo -c -o libgstjpeg_la-gstjpeg.lo `test -f 'gstjpeg.c' || echo '$(srcdir)/'`gstjpeg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstjpeg.Tpo $(DEPDIR)/libgstjpeg_la-gstjpeg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjpeg.c' object='libgstjpeg_la-gstjpeg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstjpeg.lo `test -f 'gstjpeg.c' || echo '$(srcdir)/'`gstjpeg.c + +libgstjpeg_la-gstjpegenc.lo: gstjpegenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstjpegenc.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstjpegenc.Tpo -c -o libgstjpeg_la-gstjpegenc.lo `test -f 'gstjpegenc.c' || echo '$(srcdir)/'`gstjpegenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstjpegenc.Tpo $(DEPDIR)/libgstjpeg_la-gstjpegenc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjpegenc.c' object='libgstjpeg_la-gstjpegenc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstjpegenc.lo `test -f 'gstjpegenc.c' || echo '$(srcdir)/'`gstjpegenc.c + +libgstjpeg_la-gstjpegdec.lo: gstjpegdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstjpegdec.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstjpegdec.Tpo -c -o libgstjpeg_la-gstjpegdec.lo `test -f 'gstjpegdec.c' || echo '$(srcdir)/'`gstjpegdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstjpegdec.Tpo $(DEPDIR)/libgstjpeg_la-gstjpegdec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjpegdec.c' object='libgstjpeg_la-gstjpegdec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstjpegdec.lo `test -f 'gstjpegdec.c' || echo '$(srcdir)/'`gstjpegdec.c + +libgstjpeg_la-gstsmokeenc.lo: gstsmokeenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstsmokeenc.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstsmokeenc.Tpo -c -o libgstjpeg_la-gstsmokeenc.lo `test -f 'gstsmokeenc.c' || echo '$(srcdir)/'`gstsmokeenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstsmokeenc.Tpo $(DEPDIR)/libgstjpeg_la-gstsmokeenc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmokeenc.c' object='libgstjpeg_la-gstsmokeenc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstsmokeenc.lo `test -f 'gstsmokeenc.c' || echo '$(srcdir)/'`gstsmokeenc.c + +libgstjpeg_la-smokecodec.lo: smokecodec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-smokecodec.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-smokecodec.Tpo -c -o libgstjpeg_la-smokecodec.lo `test -f 'smokecodec.c' || echo '$(srcdir)/'`smokecodec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-smokecodec.Tpo $(DEPDIR)/libgstjpeg_la-smokecodec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smokecodec.c' object='libgstjpeg_la-smokecodec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-smokecodec.lo `test -f 'smokecodec.c' || echo '$(srcdir)/'`smokecodec.c + +libgstjpeg_la-gstsmokedec.lo: gstsmokedec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstsmokedec.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstsmokedec.Tpo -c -o libgstjpeg_la-gstsmokedec.lo `test -f 'gstsmokedec.c' || echo '$(srcdir)/'`gstsmokedec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstsmokedec.Tpo $(DEPDIR)/libgstjpeg_la-gstsmokedec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmokedec.c' object='libgstjpeg_la-gstsmokedec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstsmokedec.lo `test -f 'gstsmokedec.c' || echo '$(srcdir)/'`gstsmokedec.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/jpeg/README b/ext/jpeg/README new file mode 100644 index 0000000..ffa1d0c --- /dev/null +++ b/ext/jpeg/README @@ -0,0 +1,20 @@ +The Smoke Codec +--------------- + +This is a very simple compression algorithm I was toying with when doing a +Java based player. Decoding a JPEG in Java has acceptable speed so this codec +tries to exploit that feature. The algorithm first compares the last and the +new image and finds all 16x16 blocks that have a squared difference bigger than +a configurable threshold. Then all these blocks are compressed into an NxM JPEG. +The quality of the JPEG is inversely proportional to the number of blocks, this +way, the picture quality degrades with heavy motion scenes but the bitrate stays +more or less constant. +Decoding decompresses the JPEG and then updates the old picture with the new +blocks. + + +TODO: +---- +- make format extensible +- motion vectors +- do some real bitrate control diff --git a/ext/jpeg/gstjpeg.c b/ext/jpeg/gstjpeg.c new file mode 100644 index 0000000..b9d6e04 --- /dev/null +++ b/ext/jpeg/gstjpeg.c @@ -0,0 +1,77 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 +#endif + +#include + +#include + +#include "gstjpeg.h" +#include "gstjpegdec.h" +#include "gstjpegenc.h" +#include "gstsmokeenc.h" +#include "gstsmokedec.h" + +GType +gst_idct_method_get_type (void) +{ + static GType idct_method_type = 0; + static const GEnumValue idct_method[] = { + {JDCT_ISLOW, "Slow but accurate integer algorithm", "islow"}, + {JDCT_IFAST, "Faster, less accurate integer method", "ifast"}, + {JDCT_FLOAT, "Floating-point: accurate, fast on fast HW", "float"}, + {0, NULL, NULL}, + }; + + if (!idct_method_type) { + idct_method_type = g_enum_register_static ("GstIDCTMethod", idct_method); + } + return idct_method_type; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + + if (!gst_element_register (plugin, "jpegenc", GST_RANK_PRIMARY, + GST_TYPE_JPEGENC)) + return FALSE; + + if (!gst_element_register (plugin, "jpegdec", GST_RANK_PRIMARY, + GST_TYPE_JPEG_DEC)) + return FALSE; + + if (!gst_element_register (plugin, "smokeenc", GST_RANK_PRIMARY, + GST_TYPE_SMOKEENC)) + return FALSE; + + if (!gst_element_register (plugin, "smokedec", GST_RANK_PRIMARY, + GST_TYPE_SMOKEDEC)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "jpeg", + "JPeg plugin library", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/jpeg/gstjpeg.h b/ext/jpeg/gstjpeg.h new file mode 100644 index 0000000..8b20199 --- /dev/null +++ b/ext/jpeg/gstjpeg.h @@ -0,0 +1,35 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_JPEG_H__ +#define __GST_JPEG_H__ + +#include + +G_BEGIN_DECLS + + +#define GST_TYPE_IDCT_METHOD (gst_idct_method_get_type()) +GType gst_idct_method_get_type (void); + + +G_END_DECLS + +#endif /* __GST_JPEG_H__ */ diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c new file mode 100644 index 0000000..18cf20d --- /dev/null +++ b/ext/jpeg/gstjpegdec.c @@ -0,0 +1,1873 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> Tim-Philipp Müller + * + * 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-jpegdec + * + * Decodes jpeg images. + * + * + * Example launch line + * |[ + * gst-launch -v v4l2src ! jpegdec ! ffmpegcolorspace ! xvimagesink + * ]| The above pipeline reads a motion JPEG stream from a v4l2 camera + * and renders it to the screen. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include "gstjpegdec.h" +#include "gstjpeg.h" +#include +#include "gst/gst-i18n-plugin.h" +#include + +#define MIN_WIDTH 1 +#define MAX_WIDTH 65535 +#define MIN_HEIGHT 1 +#define MAX_HEIGHT 65535 + +#define CINFO_GET_JPEGDEC(cinfo_ptr) \ + (((struct GstJpegDecSourceMgr*)((cinfo_ptr)->src))->dec) + +#define JPEG_DEFAULT_IDCT_METHOD JDCT_FASTEST +#define JPEG_DEFAULT_MAX_ERRORS 0 + +enum +{ + PROP_0, + PROP_IDCT_METHOD, + PROP_MAX_ERRORS +}; + +/* *INDENT-OFF* */ +static GstStaticPadTemplate gst_jpeg_dec_src_pad_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") "; " + GST_VIDEO_CAPS_RGB "; " GST_VIDEO_CAPS_BGR "; " + GST_VIDEO_CAPS_RGBx "; " GST_VIDEO_CAPS_xRGB "; " + GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_xBGR "; " + GST_VIDEO_CAPS_GRAY8) + ); +/* *INDENT-ON* */ + +/* FIXME: sof-marker is for IJG libjpeg 8, should be different for 6.2 */ +static GstStaticPadTemplate gst_jpeg_dec_sink_pad_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/jpeg, " + "width = (int) [ " G_STRINGIFY (MIN_WIDTH) ", " G_STRINGIFY (MAX_WIDTH) + " ], " "height = (int) [ " G_STRINGIFY (MIN_HEIGHT) ", " + G_STRINGIFY (MAX_HEIGHT) " ], framerate = (fraction) [ 0/1, MAX ], " + "sof-marker = (int) { 0, 1, 2, 5, 6, 7, 9, 10, 13, 14 }") + ); + +GST_DEBUG_CATEGORY_STATIC (jpeg_dec_debug); +#define GST_CAT_DEFAULT jpeg_dec_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE); + +/* These macros are adapted from videotestsrc.c + * and/or gst-plugins/gst/games/gstvideoimage.c */ +#define I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) +#define I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) +#define I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(I420_Y_ROWSTRIDE(width)))/2) + +#define I420_Y_OFFSET(w,h) (0) +#define I420_U_OFFSET(w,h) (I420_Y_OFFSET(w,h)+(I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) +#define I420_V_OFFSET(w,h) (I420_U_OFFSET(w,h)+(I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +#define I420_SIZE(w,h) (I420_V_OFFSET(w,h)+(I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +static GstElementClass *parent_class; /* NULL */ + +static void gst_jpeg_dec_base_init (gpointer g_class); +static void gst_jpeg_dec_class_init (GstJpegDecClass * klass); +static void gst_jpeg_dec_init (GstJpegDec * jpegdec); + +static void gst_jpeg_dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_jpeg_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_jpeg_dec_setcaps (GstPad * pad, GstCaps * caps); +static GstCaps *gst_jpeg_dec_getcaps (GstPad * pad); +static gboolean gst_jpeg_dec_sink_event (GstPad * pad, GstEvent * event); +static gboolean gst_jpeg_dec_src_event (GstPad * pad, GstEvent * event); +static GstStateChangeReturn gst_jpeg_dec_change_state (GstElement * element, + GstStateChange transition); +static void gst_jpeg_dec_update_qos (GstJpegDec * dec, gdouble proportion, + GstClockTimeDiff diff, GstClockTime ts); +static void gst_jpeg_dec_reset_qos (GstJpegDec * dec); +static void gst_jpeg_dec_read_qos (GstJpegDec * dec, gdouble * proportion, + GstClockTime * time); + +GType +gst_jpeg_dec_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo jpeg_dec_info = { + sizeof (GstJpegDecClass), + (GBaseInitFunc) gst_jpeg_dec_base_init, + NULL, + (GClassInitFunc) gst_jpeg_dec_class_init, + NULL, + NULL, + sizeof (GstJpegDec), + 0, + (GInstanceInitFunc) gst_jpeg_dec_init, + }; + + type = g_type_register_static (GST_TYPE_ELEMENT, "GstJpegDec", + &jpeg_dec_info, 0); + } + return type; +} + +static void +gst_jpeg_dec_finalize (GObject * object) +{ + GstJpegDec *dec = GST_JPEG_DEC (object); + + jpeg_destroy_decompress (&dec->cinfo); + + g_object_unref (dec->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_jpeg_dec_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_jpeg_dec_src_pad_template); + gst_element_class_add_static_pad_template (element_class, + &gst_jpeg_dec_sink_pad_template); + gst_element_class_set_details_simple (element_class, "JPEG image decoder", + "Codec/Decoder/Image", + "Decode images from JPEG format", "Wim Taymans "); +} + +static void +gst_jpeg_dec_class_init (GstJpegDecClass * klass) +{ + GstElementClass *gstelement_class; + GObjectClass *gobject_class; + + gstelement_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_jpeg_dec_finalize; + gobject_class->set_property = gst_jpeg_dec_set_property; + gobject_class->get_property = gst_jpeg_dec_get_property; + + g_object_class_install_property (gobject_class, PROP_IDCT_METHOD, + g_param_spec_enum ("idct-method", "IDCT Method", + "The IDCT algorithm to use", GST_TYPE_IDCT_METHOD, + JPEG_DEFAULT_IDCT_METHOD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstJpegDec:max-errors + * + * Error out after receiving N consecutive decoding errors + * (-1 = never error out, 0 = automatic, 1 = fail on first error, etc.) + * + * Since: 0.10.27 + **/ + g_object_class_install_property (gobject_class, PROP_MAX_ERRORS, + g_param_spec_int ("max-errors", "Maximum Consecutive Decoding Errors", + "Error out after receiving N consecutive decoding errors " + "(-1 = never fail, 0 = automatic, 1 = fail on first error)", + -1, G_MAXINT, JPEG_DEFAULT_MAX_ERRORS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_jpeg_dec_change_state); + + GST_DEBUG_CATEGORY_INIT (jpeg_dec_debug, "jpegdec", 0, "JPEG decoder"); + GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE"); +} + +static void +gst_jpeg_dec_clear_error (GstJpegDec * dec) +{ + g_free (dec->error_msg); + dec->error_msg = NULL; + dec->error_line = 0; + dec->error_func = NULL; +} + +static void +gst_jpeg_dec_set_error_va (GstJpegDec * dec, const gchar * func, gint line, + const gchar * debug_msg_format, va_list args) +{ +#ifndef GST_DISABLE_GST_DEBUG + gst_debug_log_valist (GST_CAT_DEFAULT, GST_LEVEL_WARNING, __FILE__, func, + line, (GObject *) dec, debug_msg_format, args); +#endif + + g_free (dec->error_msg); + if (debug_msg_format) + dec->error_msg = g_strdup_vprintf (debug_msg_format, args); + else + dec->error_msg = NULL; + + dec->error_line = line; + dec->error_func = func; +} + +static void +gst_jpeg_dec_set_error (GstJpegDec * dec, const gchar * func, gint line, + const gchar * debug_msg_format, ...) +{ + va_list va; + + va_start (va, debug_msg_format); + gst_jpeg_dec_set_error_va (dec, func, line, debug_msg_format, va); + va_end (va); +} + +static GstFlowReturn +gst_jpeg_dec_post_error_or_warning (GstJpegDec * dec) +{ + GstFlowReturn ret; + int max_errors; + + ++dec->error_count; + max_errors = g_atomic_int_get (&dec->max_errors); + + if (max_errors < 0) { + ret = GST_FLOW_OK; + } else if (max_errors == 0) { + /* FIXME: do something more clever in "automatic mode" */ + if (dec->packetized) { + ret = (dec->error_count < 3) ? GST_FLOW_OK : GST_FLOW_ERROR; + } else { + ret = GST_FLOW_ERROR; + } + } else { + ret = (dec->error_count < max_errors) ? GST_FLOW_OK : GST_FLOW_ERROR; + } + + GST_INFO_OBJECT (dec, "decoding error %d/%d (%s)", dec->error_count, + max_errors, (ret == GST_FLOW_OK) ? "ignoring error" : "erroring out"); + + gst_element_message_full (GST_ELEMENT (dec), + (ret == GST_FLOW_OK) ? GST_MESSAGE_WARNING : GST_MESSAGE_ERROR, + GST_STREAM_ERROR, GST_STREAM_ERROR_DECODE, + g_strdup (_("Failed to decode JPEG image")), dec->error_msg, + __FILE__, dec->error_func, dec->error_line); + + dec->error_msg = NULL; + gst_jpeg_dec_clear_error (dec); + return ret; +} + +static boolean +gst_jpeg_dec_fill_input_buffer (j_decompress_ptr cinfo) +{ + GstJpegDec *dec; + guint av; + + dec = CINFO_GET_JPEGDEC (cinfo); + g_return_val_if_fail (dec != NULL, FALSE); + + av = gst_adapter_available_fast (dec->adapter); + GST_DEBUG_OBJECT (dec, "fill_input_buffer: fast av=%u, remaining=%u", av, + dec->rem_img_len); + + if (av == 0) { + GST_DEBUG_OBJECT (dec, "Out of data"); + return FALSE; + } + + if (dec->rem_img_len < av) + av = dec->rem_img_len; + dec->rem_img_len -= av; + + g_free (dec->cur_buf); + dec->cur_buf = gst_adapter_take (dec->adapter, av); + + cinfo->src->next_input_byte = dec->cur_buf; + cinfo->src->bytes_in_buffer = av; + + return TRUE; +} + +static void +gst_jpeg_dec_init_source (j_decompress_ptr cinfo) +{ + GST_LOG_OBJECT (CINFO_GET_JPEGDEC (cinfo), "init_source"); +} + + +static void +gst_jpeg_dec_skip_input_data (j_decompress_ptr cinfo, glong num_bytes) +{ + GstJpegDec *dec = CINFO_GET_JPEGDEC (cinfo); + + GST_DEBUG_OBJECT (dec, "skip %ld bytes", num_bytes); + + if (num_bytes > 0 && cinfo->src->bytes_in_buffer >= num_bytes) { + cinfo->src->next_input_byte += (size_t) num_bytes; + cinfo->src->bytes_in_buffer -= (size_t) num_bytes; + } else if (num_bytes > 0) { + gint available; + + num_bytes -= cinfo->src->bytes_in_buffer; + cinfo->src->next_input_byte += (size_t) cinfo->src->bytes_in_buffer; + cinfo->src->bytes_in_buffer = 0; + + available = gst_adapter_available (dec->adapter); + if (available < num_bytes || available < dec->rem_img_len) { + GST_WARNING_OBJECT (dec, "Less bytes to skip than available in the " + "adapter or the remaining image length %ld < %d or %u", + num_bytes, available, dec->rem_img_len); + } + num_bytes = MIN (MIN (num_bytes, available), dec->rem_img_len); + gst_adapter_flush (dec->adapter, num_bytes); + dec->rem_img_len -= num_bytes; + } +} + +static boolean +gst_jpeg_dec_resync_to_restart (j_decompress_ptr cinfo, gint desired) +{ + GST_LOG_OBJECT (CINFO_GET_JPEGDEC (cinfo), "resync_to_start"); + return TRUE; +} + +static void +gst_jpeg_dec_term_source (j_decompress_ptr cinfo) +{ + GST_LOG_OBJECT (CINFO_GET_JPEGDEC (cinfo), "term_source"); + return; +} + +METHODDEF (void) + gst_jpeg_dec_my_output_message (j_common_ptr cinfo) +{ + return; /* do nothing */ +} + +METHODDEF (void) + gst_jpeg_dec_my_emit_message (j_common_ptr cinfo, int msg_level) +{ + /* GST_LOG_OBJECT (CINFO_GET_JPEGDEC (&cinfo), "msg_level=%d", msg_level); */ + return; +} + +METHODDEF (void) + gst_jpeg_dec_my_error_exit (j_common_ptr cinfo) +{ + struct GstJpegDecErrorMgr *err_mgr = (struct GstJpegDecErrorMgr *) cinfo->err; + + (*cinfo->err->output_message) (cinfo); + longjmp (err_mgr->setjmp_buffer, 1); +} + +static void +gst_jpeg_dec_init (GstJpegDec * dec) +{ + GST_DEBUG ("initializing"); + + /* create the sink and src pads */ + dec->sinkpad = + gst_pad_new_from_static_template (&gst_jpeg_dec_sink_pad_template, + "sink"); + gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); + gst_pad_set_setcaps_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_jpeg_dec_setcaps)); + gst_pad_set_getcaps_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_jpeg_dec_getcaps)); + gst_pad_set_chain_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_jpeg_dec_chain)); + gst_pad_set_event_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_jpeg_dec_sink_event)); + + dec->srcpad = + gst_pad_new_from_static_template (&gst_jpeg_dec_src_pad_template, "src"); + gst_pad_set_event_function (dec->srcpad, + GST_DEBUG_FUNCPTR (gst_jpeg_dec_src_event)); + gst_pad_use_fixed_caps (dec->srcpad); + gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); + + /* setup jpeglib */ + memset (&dec->cinfo, 0, sizeof (dec->cinfo)); + memset (&dec->jerr, 0, sizeof (dec->jerr)); + dec->cinfo.err = jpeg_std_error (&dec->jerr.pub); + dec->jerr.pub.output_message = gst_jpeg_dec_my_output_message; + dec->jerr.pub.emit_message = gst_jpeg_dec_my_emit_message; + dec->jerr.pub.error_exit = gst_jpeg_dec_my_error_exit; + + jpeg_create_decompress (&dec->cinfo); + + dec->cinfo.src = (struct jpeg_source_mgr *) &dec->jsrc; + dec->cinfo.src->init_source = gst_jpeg_dec_init_source; + dec->cinfo.src->fill_input_buffer = gst_jpeg_dec_fill_input_buffer; + dec->cinfo.src->skip_input_data = gst_jpeg_dec_skip_input_data; + dec->cinfo.src->resync_to_restart = gst_jpeg_dec_resync_to_restart; + dec->cinfo.src->term_source = gst_jpeg_dec_term_source; + dec->jsrc.dec = dec; + + /* init properties */ + dec->idct_method = JPEG_DEFAULT_IDCT_METHOD; + dec->max_errors = JPEG_DEFAULT_MAX_ERRORS; + + dec->adapter = gst_adapter_new (); +} + +static gboolean +gst_jpeg_dec_ensure_header (GstJpegDec * dec) +{ + gint av; + gint offset; + + av = gst_adapter_available (dec->adapter); + /* we expect at least 4 bytes, first of which start marker */ + offset = gst_adapter_masked_scan_uint32 (dec->adapter, 0xffffff00, 0xffd8ff00, + 0, av); + if (G_UNLIKELY (offset < 0)) { + GST_DEBUG_OBJECT (dec, "No JPEG header in current buffer"); + /* not found */ + if (av > 4) + gst_adapter_flush (dec->adapter, av - 4); + return FALSE; + } + + if (offset > 0) { + GST_LOG_OBJECT (dec, "Skipping %u bytes.", offset); + gst_adapter_flush (dec->adapter, offset); + } + GST_DEBUG_OBJECT (dec, "Found JPEG header"); + + return TRUE; +} + +static inline gboolean +gst_jpeg_dec_parse_tag_has_entropy_segment (guint8 tag) +{ + if (tag == 0xda || (tag >= 0xd0 && tag <= 0xd7)) + return TRUE; + return FALSE; +} + +/* returns image length in bytes if parsed successfully, + * otherwise 0 if more data needed, + * if < 0 the absolute value needs to be flushed */ +static gint +gst_jpeg_dec_parse_image_data (GstJpegDec * dec) +{ + guint size; + gboolean resync; + GstAdapter *adapter = dec->adapter; + gint offset, noffset; + + size = gst_adapter_available (adapter); + + /* we expect at least 4 bytes, first of which start marker */ + if (gst_adapter_masked_scan_uint32 (adapter, 0xffff0000, 0xffd80000, 0, 4)) + return 0; + + GST_DEBUG ("Parsing jpeg image data (%u bytes)", size); + + GST_DEBUG ("Parse state: offset=%d, resync=%d, entropy len=%d", + dec->parse_offset, dec->parse_resync, dec->parse_entropy_len); + + /* offset is 2 less than actual offset; + * - adapter needs at least 4 bytes for scanning, + * - start and end marker ensure at least that much + */ + /* resume from state offset */ + offset = dec->parse_offset; + + while (1) { + guint frame_len; + guint32 value; + + noffset = + gst_adapter_masked_scan_uint32_peek (adapter, 0x0000ff00, 0x0000ff00, + offset, size - offset, &value); + /* lost sync if 0xff marker not where expected */ + if ((resync = (noffset != offset))) { + GST_DEBUG ("Lost sync at 0x%08x, resyncing", offset + 2); + } + /* may have marker, but could have been resyncng */ + resync = resync || dec->parse_resync; + /* Skip over extra 0xff */ + while ((noffset >= 0) && ((value & 0xff) == 0xff)) { + noffset++; + noffset = + gst_adapter_masked_scan_uint32_peek (adapter, 0x0000ff00, 0x0000ff00, + noffset, size - noffset, &value); + } + /* enough bytes left for marker? (we need 0xNN after the 0xff) */ + if (noffset < 0) { + GST_DEBUG ("at end of input and no EOI marker found, need more data"); + goto need_more_data; + } + + /* now lock on the marker we found */ + offset = noffset; + value = value & 0xff; + if (value == 0xd9) { + GST_DEBUG ("0x%08x: EOI marker", offset + 2); + /* clear parse state */ + dec->parse_resync = FALSE; + dec->parse_offset = 0; + return (offset + 4); + } else if (value == 0xd8) { + /* Skip this frame if we found another SOI marker */ + GST_DEBUG ("0x%08x: SOI marker before EOI, skipping", offset + 2); + dec->parse_resync = FALSE; + dec->parse_offset = 0; + return -(offset + 2); + } + + + if (value >= 0xd0 && value <= 0xd7) + frame_len = 0; + else { + /* peek tag and subsequent length */ + if (offset + 2 + 4 > size) + goto need_more_data; + else + gst_adapter_masked_scan_uint32_peek (adapter, 0x0, 0x0, offset + 2, 4, + &frame_len); + frame_len = frame_len & 0xffff; + } + GST_DEBUG ("0x%08x: tag %02x, frame_len=%u", offset + 2, value, frame_len); + /* the frame length includes the 2 bytes for the length; here we want at + * least 2 more bytes at the end for an end marker */ + if (offset + 2 + 2 + frame_len + 2 > size) { + goto need_more_data; + } + + if (gst_jpeg_dec_parse_tag_has_entropy_segment (value)) { + guint eseglen = dec->parse_entropy_len; + + GST_DEBUG ("0x%08x: finding entropy segment length", offset + 2); + noffset = offset + 2 + frame_len + dec->parse_entropy_len; + while (1) { + noffset = gst_adapter_masked_scan_uint32_peek (adapter, 0x0000ff00, + 0x0000ff00, noffset, size - noffset, &value); + if (noffset < 0) { + /* need more data */ + dec->parse_entropy_len = size - offset - 4 - frame_len - 2; + goto need_more_data; + } + if ((value & 0xff) != 0x00) { + eseglen = noffset - offset - frame_len - 2; + break; + } + noffset++; + } + dec->parse_entropy_len = 0; + frame_len += eseglen; + GST_DEBUG ("entropy segment length=%u => frame_len=%u", eseglen, + frame_len); + } + if (resync) { + /* check if we will still be in sync if we interpret + * this as a sync point and skip this frame */ + noffset = offset + frame_len + 2; + noffset = gst_adapter_masked_scan_uint32 (adapter, 0x0000ff00, 0x0000ff00, + noffset, 4); + if (noffset < 0) { + /* ignore and continue resyncing until we hit the end + * of our data or find a sync point that looks okay */ + offset++; + continue; + } + GST_DEBUG ("found sync at 0x%x", offset + 2); + } + + offset += frame_len + 2; + } + + /* EXITS */ +need_more_data: + { + dec->parse_offset = offset; + dec->parse_resync = resync; + return 0; + } +} + +/* shamelessly ripped from jpegutils.c in mjpegtools */ +static void +add_huff_table (j_decompress_ptr dinfo, + JHUFF_TBL ** htblptr, const UINT8 * bits, const UINT8 * val) +/* Define a Huffman table */ +{ + int nsymbols, len; + + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table ((j_common_ptr) dinfo); + + g_assert (*htblptr); + + /* Copy the number-of-symbols-of-each-code-length counts */ + memcpy ((*htblptr)->bits, bits, sizeof ((*htblptr)->bits)); + + /* Validate the counts. We do this here mainly so we can copy the right + * number of symbols from the val[] array, without risking marching off + * the end of memory. jchuff.c will do a more thorough test later. + */ + nsymbols = 0; + for (len = 1; len <= 16; len++) + nsymbols += bits[len]; + if (nsymbols < 1 || nsymbols > 256) + g_error ("jpegutils.c: add_huff_table failed badly. "); + + memcpy ((*htblptr)->huffval, val, nsymbols * sizeof (UINT8)); +} + + + +static void +std_huff_tables (j_decompress_ptr dinfo) +/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ +/* IMPORTANT: these are only valid for 8-bit data precision! */ +{ + static const UINT8 bits_dc_luminance[17] = + { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + static const UINT8 val_dc_luminance[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 bits_dc_chrominance[17] = + { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; + static const UINT8 val_dc_chrominance[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 bits_ac_luminance[17] = + { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; + static const UINT8 val_ac_luminance[] = + { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa + }; + + static const UINT8 bits_ac_chrominance[17] = + { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; + static const UINT8 val_ac_chrominance[] = + { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa + }; + + add_huff_table (dinfo, &dinfo->dc_huff_tbl_ptrs[0], + bits_dc_luminance, val_dc_luminance); + add_huff_table (dinfo, &dinfo->ac_huff_tbl_ptrs[0], + bits_ac_luminance, val_ac_luminance); + add_huff_table (dinfo, &dinfo->dc_huff_tbl_ptrs[1], + bits_dc_chrominance, val_dc_chrominance); + add_huff_table (dinfo, &dinfo->ac_huff_tbl_ptrs[1], + bits_ac_chrominance, val_ac_chrominance); +} + + + +static void +guarantee_huff_tables (j_decompress_ptr dinfo) +{ + if ((dinfo->dc_huff_tbl_ptrs[0] == NULL) && + (dinfo->dc_huff_tbl_ptrs[1] == NULL) && + (dinfo->ac_huff_tbl_ptrs[0] == NULL) && + (dinfo->ac_huff_tbl_ptrs[1] == NULL)) { + GST_DEBUG ("Generating standard Huffman tables for this frame."); + std_huff_tables (dinfo); + } +} + +static gboolean +gst_jpeg_dec_setcaps (GstPad * pad, GstCaps * caps) +{ + GstStructure *s; + GstJpegDec *dec; + const GValue *framerate; + + dec = GST_JPEG_DEC (GST_OBJECT_PARENT (pad)); + s = gst_caps_get_structure (caps, 0); + + if ((framerate = gst_structure_get_value (s, "framerate")) != NULL) { + dec->framerate_numerator = gst_value_get_fraction_numerator (framerate); + dec->framerate_denominator = gst_value_get_fraction_denominator (framerate); + dec->packetized = TRUE; + GST_DEBUG ("got framerate of %d/%d fps => packetized mode", + dec->framerate_numerator, dec->framerate_denominator); + } + + /* do not extract width/height here. we do that in the chain + * function on a per-frame basis (including the line[] array + * setup) */ + + /* But we can take the framerate values and set them on the src pad */ + + return TRUE; +} + +static GstCaps * +gst_jpeg_dec_getcaps (GstPad * pad) +{ + GstJpegDec *dec; + GstCaps *caps; + GstPad *peer; + + dec = GST_JPEG_DEC (GST_OBJECT_PARENT (pad)); + + if (GST_PAD_CAPS (pad)) + return gst_caps_ref (GST_PAD_CAPS (pad)); + + peer = gst_pad_get_peer (dec->srcpad); + + if (peer) { + GstCaps *peer_caps; + const GstCaps *templ_caps; + GstStructure *s; + guint i, n; + + peer_caps = gst_pad_get_caps (peer); + + /* Translate peercaps to image/jpeg */ + peer_caps = gst_caps_make_writable (peer_caps); + n = gst_caps_get_size (peer_caps); + for (i = 0; i < n; i++) { + s = gst_caps_get_structure (peer_caps, i); + + gst_structure_set_name (s, "image/jpeg"); + } + + templ_caps = gst_pad_get_pad_template_caps (pad); + caps = gst_caps_intersect_full (peer_caps, templ_caps, + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (peer_caps); + gst_object_unref (peer); + } else { + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + } + + return caps; +} + + +/* yuk */ +static void +hresamplecpy1 (guint8 * dest, const guint8 * src, guint len) +{ + gint i; + + for (i = 0; i < len; ++i) { + /* equivalent to: dest[i] = src[i << 1] */ + *dest = *src; + ++dest; + ++src; + ++src; + } +} + +static void +gst_jpeg_dec_free_buffers (GstJpegDec * dec) +{ + gint i; + + for (i = 0; i < 16; i++) { + g_free (dec->idr_y[i]); + g_free (dec->idr_u[i]); + g_free (dec->idr_v[i]); + dec->idr_y[i] = NULL; + dec->idr_u[i] = NULL; + dec->idr_v[i] = NULL; + } + + dec->idr_width_allocated = 0; +} + +static inline gboolean +gst_jpeg_dec_ensure_buffers (GstJpegDec * dec, guint maxrowbytes) +{ + gint i; + + if (G_LIKELY (dec->idr_width_allocated == maxrowbytes)) + return TRUE; + + /* FIXME: maybe just alloc one or three blocks altogether? */ + for (i = 0; i < 16; i++) { + dec->idr_y[i] = g_try_realloc (dec->idr_y[i], maxrowbytes); + dec->idr_u[i] = g_try_realloc (dec->idr_u[i], maxrowbytes); + dec->idr_v[i] = g_try_realloc (dec->idr_v[i], maxrowbytes); + + if (G_UNLIKELY (!dec->idr_y[i] || !dec->idr_u[i] || !dec->idr_v[i])) { + GST_WARNING_OBJECT (dec, "out of memory, i=%d, bytes=%u", i, maxrowbytes); + return FALSE; + } + } + + dec->idr_width_allocated = maxrowbytes; + GST_LOG_OBJECT (dec, "allocated temp memory, %u bytes/row", maxrowbytes); + return TRUE; +} + +static void +gst_jpeg_dec_decode_grayscale (GstJpegDec * dec, guchar * base[1], + guint width, guint height, guint pstride, guint rstride) +{ + guchar *rows[16]; + guchar **scanarray[1] = { rows }; + gint i, j, k; + gint lines; + + GST_DEBUG_OBJECT (dec, "indirect decoding of grayscale"); + + if (G_UNLIKELY (!gst_jpeg_dec_ensure_buffers (dec, GST_ROUND_UP_32 (width)))) + return; + + memcpy (rows, dec->idr_y, 16 * sizeof (gpointer)); + + i = 0; + while (i < height) { + lines = jpeg_read_raw_data (&dec->cinfo, scanarray, DCTSIZE); + if (G_LIKELY (lines > 0)) { + for (j = 0; (j < DCTSIZE) && (i < height); j++, i++) { + gint p; + + p = 0; + for (k = 0; k < width; k++) { + base[0][p] = rows[j][k]; + p += pstride; + } + base[0] += rstride; + } + } else { + GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0"); + } + } +} + +static void +gst_jpeg_dec_decode_rgb (GstJpegDec * dec, guchar * base[3], + guint width, guint height, guint pstride, guint rstride) +{ + guchar *r_rows[16], *g_rows[16], *b_rows[16]; + guchar **scanarray[3] = { r_rows, g_rows, b_rows }; + gint i, j, k; + gint lines; + + GST_DEBUG_OBJECT (dec, "indirect decoding of RGB"); + + if (G_UNLIKELY (!gst_jpeg_dec_ensure_buffers (dec, GST_ROUND_UP_32 (width)))) + return; + + memcpy (r_rows, dec->idr_y, 16 * sizeof (gpointer)); + memcpy (g_rows, dec->idr_u, 16 * sizeof (gpointer)); + memcpy (b_rows, dec->idr_v, 16 * sizeof (gpointer)); + + i = 0; + while (i < height) { + lines = jpeg_read_raw_data (&dec->cinfo, scanarray, DCTSIZE); + if (G_LIKELY (lines > 0)) { + for (j = 0; (j < DCTSIZE) && (i < height); j++, i++) { + gint p; + + p = 0; + for (k = 0; k < width; k++) { + base[0][p] = r_rows[j][k]; + base[1][p] = g_rows[j][k]; + base[2][p] = b_rows[j][k]; + p += pstride; + } + base[0] += rstride; + base[1] += rstride; + base[2] += rstride; + } + } else { + GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0"); + } + } +} + +static void +gst_jpeg_dec_decode_indirect (GstJpegDec * dec, guchar * base[3], + guchar * last[3], guint width, guint height, gint r_v, gint r_h, gint comp) +{ + guchar *y_rows[16], *u_rows[16], *v_rows[16]; + guchar **scanarray[3] = { y_rows, u_rows, v_rows }; + gint i, j, k; + gint lines; + + GST_DEBUG_OBJECT (dec, + "unadvantageous width or r_h, taking slow route involving memcpy"); + + if (G_UNLIKELY (!gst_jpeg_dec_ensure_buffers (dec, GST_ROUND_UP_32 (width)))) + return; + + memcpy (y_rows, dec->idr_y, 16 * sizeof (gpointer)); + memcpy (u_rows, dec->idr_u, 16 * sizeof (gpointer)); + memcpy (v_rows, dec->idr_v, 16 * sizeof (gpointer)); + + /* fill chroma components for grayscale */ + if (comp == 1) { + GST_DEBUG_OBJECT (dec, "grayscale, filling chroma"); + for (i = 0; i < 16; i++) { + memset (u_rows[i], GST_ROUND_UP_32 (width), 0x80); + memset (v_rows[i], GST_ROUND_UP_32 (width), 0x80); + } + } + + for (i = 0; i < height; i += r_v * DCTSIZE) { + lines = jpeg_read_raw_data (&dec->cinfo, scanarray, r_v * DCTSIZE); + if (G_LIKELY (lines > 0)) { + for (j = 0, k = 0; j < (r_v * DCTSIZE); j += r_v, k++) { + if (G_LIKELY (base[0] <= last[0])) { + memcpy (base[0], y_rows[j], I420_Y_ROWSTRIDE (width)); + base[0] += I420_Y_ROWSTRIDE (width); + } + if (r_v == 2) { + if (G_LIKELY (base[0] <= last[0])) { + memcpy (base[0], y_rows[j + 1], I420_Y_ROWSTRIDE (width)); + base[0] += I420_Y_ROWSTRIDE (width); + } + } + if (G_LIKELY (base[1] <= last[1] && base[2] <= last[2])) { + if (r_h == 2) { + memcpy (base[1], u_rows[k], I420_U_ROWSTRIDE (width)); + memcpy (base[2], v_rows[k], I420_V_ROWSTRIDE (width)); + } else if (r_h == 1) { + hresamplecpy1 (base[1], u_rows[k], I420_U_ROWSTRIDE (width)); + hresamplecpy1 (base[2], v_rows[k], I420_V_ROWSTRIDE (width)); + } else { + /* FIXME: implement (at least we avoid crashing by doing nothing) */ + } + } + + if (r_v == 2 || (k & 1) != 0) { + base[1] += I420_U_ROWSTRIDE (width); + base[2] += I420_V_ROWSTRIDE (width); + } + } + } else { + GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0"); + } + } +} + +#ifndef GST_DISABLE_GST_DEBUG +static inline void +dump_lines (guchar * base[3], guchar ** line[3], int v_samp0, int width) +{ + int j; + + for (j = 0; j < (v_samp0 * DCTSIZE); ++j) { + GST_LOG ("[%02d] %5d %5d %5d", j, + (line[0][j] >= base[0]) ? + (int) (line[0][j] - base[0]) / I420_Y_ROWSTRIDE (width) : -1, + (line[1][j] >= base[1]) ? + (int) (line[1][j] - base[1]) / I420_U_ROWSTRIDE (width) : -1, + (line[2][j] >= base[2]) ? + (int) (line[2][j] - base[2]) / I420_V_ROWSTRIDE (width) : -1); + } +} +#endif + +static GstFlowReturn +gst_jpeg_dec_decode_direct (GstJpegDec * dec, guchar * base[3], + guchar * last[3], guint width, guint height) +{ + guchar **line[3]; /* the jpeg line buffer */ + guchar *y[4 * DCTSIZE] = { NULL, }; /* alloc enough for the lines */ + guchar *u[4 * DCTSIZE] = { NULL, }; /* r_v will be <4 */ + guchar *v[4 * DCTSIZE] = { NULL, }; + gint i, j; + gint lines, v_samp[3]; + + line[0] = y; + line[1] = u; + line[2] = v; + + v_samp[0] = dec->cinfo.comp_info[0].v_samp_factor; + v_samp[1] = dec->cinfo.comp_info[1].v_samp_factor; + v_samp[2] = dec->cinfo.comp_info[2].v_samp_factor; + + if (G_UNLIKELY (v_samp[0] > 2 || v_samp[1] > 2 || v_samp[2] > 2)) + goto format_not_supported; + + /* let jpeglib decode directly into our final buffer */ + GST_DEBUG_OBJECT (dec, "decoding directly into output buffer"); + + for (i = 0; i < height; i += v_samp[0] * DCTSIZE) { + for (j = 0; j < (v_samp[0] * DCTSIZE); ++j) { + /* Y */ + line[0][j] = base[0] + (i + j) * I420_Y_ROWSTRIDE (width); + if (G_UNLIKELY (line[0][j] > last[0])) + line[0][j] = last[0]; + /* U */ + if (v_samp[1] == v_samp[0]) { + line[1][j] = base[1] + ((i + j) / 2) * I420_U_ROWSTRIDE (width); + } else if (j < (v_samp[1] * DCTSIZE)) { + line[1][j] = base[1] + ((i / 2) + j) * I420_U_ROWSTRIDE (width); + } + if (G_UNLIKELY (line[1][j] > last[1])) + line[1][j] = last[1]; + /* V */ + if (v_samp[2] == v_samp[0]) { + line[2][j] = base[2] + ((i + j) / 2) * I420_V_ROWSTRIDE (width); + } else if (j < (v_samp[2] * DCTSIZE)) { + line[2][j] = base[2] + ((i / 2) + j) * I420_V_ROWSTRIDE (width); + } + if (G_UNLIKELY (line[2][j] > last[2])) + line[2][j] = last[2]; + } + + /* dump_lines (base, line, v_samp[0], width); */ + + lines = jpeg_read_raw_data (&dec->cinfo, line, v_samp[0] * DCTSIZE); + if (G_UNLIKELY (!lines)) { + GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0"); + } + } + return GST_FLOW_OK; + +format_not_supported: + { + gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, + "Unsupported subsampling schema: v_samp factors: %u %u %u", + v_samp[0], v_samp[1], v_samp[2]); + return GST_FLOW_ERROR; + } +} + +static void +gst_jpeg_dec_update_qos (GstJpegDec * dec, gdouble proportion, + GstClockTimeDiff diff, GstClockTime ts) +{ + GST_OBJECT_LOCK (dec); + dec->proportion = proportion; + if (G_LIKELY (ts != GST_CLOCK_TIME_NONE)) { + if (G_UNLIKELY (diff > 0)) + dec->earliest_time = ts + 2 * diff + dec->qos_duration; + else + dec->earliest_time = ts + diff; + } else { + dec->earliest_time = GST_CLOCK_TIME_NONE; + } + GST_OBJECT_UNLOCK (dec); +} + +static void +gst_jpeg_dec_reset_qos (GstJpegDec * dec) +{ + gst_jpeg_dec_update_qos (dec, 0.5, 0, GST_CLOCK_TIME_NONE); +} + +static void +gst_jpeg_dec_read_qos (GstJpegDec * dec, gdouble * proportion, + GstClockTime * time) +{ + GST_OBJECT_LOCK (dec); + *proportion = dec->proportion; + *time = dec->earliest_time; + GST_OBJECT_UNLOCK (dec); +} + +/* Perform qos calculations before decoding the next frame. Returns TRUE if the + * frame should be decoded, FALSE if the frame can be dropped entirely */ +static gboolean +gst_jpeg_dec_do_qos (GstJpegDec * dec, GstClockTime timestamp) +{ + GstClockTime qostime, earliest_time; + gdouble proportion; + + /* no timestamp, can't do QoS => decode frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { + GST_LOG_OBJECT (dec, "invalid timestamp, can't do QoS, decode frame"); + return TRUE; + } + + /* get latest QoS observation values */ + gst_jpeg_dec_read_qos (dec, &proportion, &earliest_time); + + /* skip qos if we have no observation (yet) => decode frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { + GST_LOG_OBJECT (dec, "no observation yet, decode frame"); + return TRUE; + } + + /* qos is done on running time */ + qostime = gst_segment_to_running_time (&dec->segment, GST_FORMAT_TIME, + timestamp); + + /* see how our next timestamp relates to the latest qos timestamp */ + GST_LOG_OBJECT (dec, "qostime %" GST_TIME_FORMAT ", earliest %" + GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); + + if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { + GST_DEBUG_OBJECT (dec, "we are late, drop frame"); + return FALSE; + } + + GST_LOG_OBJECT (dec, "decode frame"); + return TRUE; +} + +static void +gst_jpeg_dec_negotiate (GstJpegDec * dec, gint width, gint height, gint clrspc) +{ + GstCaps *caps; + GstVideoFormat format; + + if (G_UNLIKELY (width == dec->caps_width && height == dec->caps_height && + dec->framerate_numerator == dec->caps_framerate_numerator && + dec->framerate_denominator == dec->caps_framerate_denominator && + clrspc == dec->clrspc)) + return; + + /* framerate == 0/1 is a still frame */ + if (dec->framerate_denominator == 0) { + dec->framerate_numerator = 0; + dec->framerate_denominator = 1; + } + + /* calculate or assume an average frame duration for QoS purposes */ + GST_OBJECT_LOCK (dec); + if (dec->framerate_numerator != 0) { + dec->qos_duration = gst_util_uint64_scale (GST_SECOND, + dec->framerate_denominator, dec->framerate_numerator); + } else { + /* if not set just use 25fps */ + dec->qos_duration = gst_util_uint64_scale (GST_SECOND, 1, 25); + } + GST_OBJECT_UNLOCK (dec); + + if (dec->cinfo.jpeg_color_space == JCS_RGB) { + gint i; + GstCaps *allowed_caps; + + GST_DEBUG_OBJECT (dec, "selecting RGB format"); + /* retrieve allowed caps, and find the first one that reasonably maps + * to the parameters of the colourspace */ + caps = gst_pad_get_allowed_caps (dec->srcpad); + if (!caps) { + GST_DEBUG_OBJECT (dec, "... but no peer, using template caps"); + /* need to copy because get_allowed_caps returns a ref, + * and get_pad_template_caps doesn't */ + caps = gst_caps_copy (gst_pad_get_pad_template_caps (dec->srcpad)); + } + /* avoid lists of fourcc, etc */ + allowed_caps = gst_caps_normalize (caps); + gst_caps_unref (caps); + caps = NULL; + GST_LOG_OBJECT (dec, "allowed source caps %" GST_PTR_FORMAT, allowed_caps); + + for (i = 0; i < gst_caps_get_size (allowed_caps); i++) { + if (caps) + gst_caps_unref (caps); + caps = gst_caps_copy_nth (allowed_caps, i); + /* sigh, ds and _parse_caps need fixed caps for parsing, fixate */ + gst_pad_fixate_caps (dec->srcpad, caps); + GST_LOG_OBJECT (dec, "checking caps %" GST_PTR_FORMAT, caps); + if (!gst_video_format_parse_caps (caps, &format, NULL, NULL)) + continue; + /* we'll settle for the first (preferred) downstream rgb format */ + if (gst_video_format_is_rgb (format)) + break; + /* default fall-back */ + format = GST_VIDEO_FORMAT_RGB; + } + if (caps) + gst_caps_unref (caps); + gst_caps_unref (allowed_caps); + caps = gst_video_format_new_caps (format, width, height, + dec->framerate_numerator, dec->framerate_denominator, 1, 1); + dec->outsize = gst_video_format_get_size (format, width, height); + /* some format info */ + dec->offset[0] = + gst_video_format_get_component_offset (format, 0, width, height); + dec->offset[1] = + gst_video_format_get_component_offset (format, 1, width, height); + dec->offset[2] = + gst_video_format_get_component_offset (format, 2, width, height); + /* equal for all components */ + dec->stride = gst_video_format_get_row_stride (format, 0, width); + dec->inc = gst_video_format_get_pixel_stride (format, 0); + } else if (dec->cinfo.jpeg_color_space == JCS_GRAYSCALE) { + /* TODO is anything else then 8bit supported in jpeg? */ + format = GST_VIDEO_FORMAT_GRAY8; + caps = gst_video_format_new_caps (format, width, height, + dec->framerate_numerator, dec->framerate_denominator, 1, 1); + dec->outsize = gst_video_format_get_size (format, width, height); + dec->offset[0] = + gst_video_format_get_component_offset (format, 0, width, height); + dec->stride = gst_video_format_get_row_stride (format, 0, width); + dec->inc = gst_video_format_get_pixel_stride (format, 0); + } else { + /* go for plain and simple I420 */ + /* TODO other YUV cases ? */ + caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), + "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, + "framerate", GST_TYPE_FRACTION, dec->framerate_numerator, + dec->framerate_denominator, NULL); + dec->outsize = I420_SIZE (width, height); + } + + GST_DEBUG_OBJECT (dec, "setting caps %" GST_PTR_FORMAT, caps); + GST_DEBUG_OBJECT (dec, "max_v_samp_factor=%d", dec->cinfo.max_v_samp_factor); + GST_DEBUG_OBJECT (dec, "max_h_samp_factor=%d", dec->cinfo.max_h_samp_factor); + + gst_pad_set_caps (dec->srcpad, caps); + gst_caps_unref (caps); + + dec->caps_width = width; + dec->caps_height = height; + dec->caps_framerate_numerator = dec->framerate_numerator; + dec->caps_framerate_denominator = dec->framerate_denominator; +} + +static GstFlowReturn +gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstJpegDec *dec; + GstBuffer *outbuf = NULL; +#ifndef GST_DISABLE_GST_DEBUG + guchar *data; +#endif + guchar *outdata; + guchar *base[3], *last[3]; + gint img_len; + guint outsize; + gint width, height; + gint r_h, r_v; + guint code, hdr_ok; + GstClockTime timestamp, duration; + + dec = GST_JPEG_DEC (GST_PAD_PARENT (pad)); + + timestamp = GST_BUFFER_TIMESTAMP (buf); + duration = GST_BUFFER_DURATION (buf); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) + dec->next_ts = timestamp; + + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_DEBUG_OBJECT (dec, "buffer has DISCONT flag set"); + dec->discont = TRUE; + if (!dec->packetized && gst_adapter_available (dec->adapter)) { + GST_WARNING_OBJECT (dec, "DISCONT buffer in non-packetized mode, bad"); + gst_adapter_clear (dec->adapter); + } + } + + gst_adapter_push (dec->adapter, buf); + buf = NULL; + + /* If we are non-packetized and know the total incoming size in bytes, + * just wait until we have enough before doing any processing. */ + + if (!dec->packetized && (dec->segment.format == GST_FORMAT_BYTES) && + (dec->segment.stop != -1) && + (gst_adapter_available (dec->adapter) < dec->segment.stop)) { + /* We assume that non-packetized input in bytes is *one* single jpeg image */ + GST_DEBUG ("Non-packetized mode. Got %d bytes, need %" G_GINT64_FORMAT, + gst_adapter_available (dec->adapter), dec->segment.stop); + goto need_more_data; + } + +again: + if (!gst_jpeg_dec_ensure_header (dec)) + goto need_more_data; + + /* If we know that each input buffer contains data + * for a whole jpeg image (e.g. MJPEG streams), just + * do some sanity checking instead of parsing all of + * the jpeg data */ + if (dec->packetized) { + img_len = gst_adapter_available (dec->adapter); + } else { + /* Parse jpeg image to handle jpeg input that + * is not aligned to buffer boundaries */ + img_len = gst_jpeg_dec_parse_image_data (dec); + + if (img_len == 0) { + goto need_more_data; + } else if (img_len < 0) { + gst_adapter_flush (dec->adapter, -img_len); + goto again; + } + } + + dec->rem_img_len = img_len; + + GST_LOG_OBJECT (dec, "image size = %u", img_len); + + /* QoS: if we're too late anyway, skip decoding */ + if (dec->packetized && !gst_jpeg_dec_do_qos (dec, timestamp)) + goto skip_decoding; + +#ifndef GST_DISABLE_GST_DEBUG + data = (guint8 *) gst_adapter_peek (dec->adapter, 4); + GST_LOG_OBJECT (dec, "reading header %02x %02x %02x %02x", data[0], data[1], + data[2], data[3]); +#endif + + gst_jpeg_dec_fill_input_buffer (&dec->cinfo); + + if (setjmp (dec->jerr.setjmp_buffer)) { + code = dec->jerr.pub.msg_code; + + if (code == JERR_INPUT_EOF) { + GST_DEBUG ("jpeg input EOF error, we probably need more data"); + goto need_more_data; + } + goto decode_error; + } + + /* read header */ + hdr_ok = jpeg_read_header (&dec->cinfo, TRUE); + if (G_UNLIKELY (hdr_ok != JPEG_HEADER_OK)) { + GST_WARNING_OBJECT (dec, "reading the header failed, %d", hdr_ok); + } + + GST_LOG_OBJECT (dec, "num_components=%d", dec->cinfo.num_components); + GST_LOG_OBJECT (dec, "jpeg_color_space=%d", dec->cinfo.jpeg_color_space); + + if (!dec->cinfo.num_components || !dec->cinfo.comp_info) + goto components_not_supported; + + r_h = dec->cinfo.comp_info[0].h_samp_factor; + r_v = dec->cinfo.comp_info[0].v_samp_factor; + + GST_LOG_OBJECT (dec, "r_h = %d, r_v = %d", r_h, r_v); + + if (dec->cinfo.num_components > 3) + goto components_not_supported; + + /* verify color space expectation to avoid going *boom* or bogus output */ + if (dec->cinfo.jpeg_color_space != JCS_YCbCr && + dec->cinfo.jpeg_color_space != JCS_GRAYSCALE && + dec->cinfo.jpeg_color_space != JCS_RGB) + goto unsupported_colorspace; + +#ifndef GST_DISABLE_GST_DEBUG + { + gint i; + + for (i = 0; i < dec->cinfo.num_components; ++i) { + GST_LOG_OBJECT (dec, "[%d] h_samp_factor=%d, v_samp_factor=%d, cid=%d", + i, dec->cinfo.comp_info[i].h_samp_factor, + dec->cinfo.comp_info[i].v_samp_factor, + dec->cinfo.comp_info[i].component_id); + } + } +#endif + + /* prepare for raw output */ + dec->cinfo.do_fancy_upsampling = FALSE; + dec->cinfo.do_block_smoothing = FALSE; + dec->cinfo.out_color_space = dec->cinfo.jpeg_color_space; + dec->cinfo.dct_method = dec->idct_method; + dec->cinfo.raw_data_out = TRUE; + + GST_LOG_OBJECT (dec, "starting decompress"); + guarantee_huff_tables (&dec->cinfo); + if (!jpeg_start_decompress (&dec->cinfo)) { + GST_WARNING_OBJECT (dec, "failed to start decompression cycle"); + } + + /* sanity checks to get safe and reasonable output */ + switch (dec->cinfo.jpeg_color_space) { + case JCS_GRAYSCALE: + if (dec->cinfo.num_components != 1) + goto invalid_yuvrgbgrayscale; + break; + case JCS_RGB: + if (dec->cinfo.num_components != 3 || dec->cinfo.max_v_samp_factor > 1 || + dec->cinfo.max_h_samp_factor > 1) + goto invalid_yuvrgbgrayscale; + break; + case JCS_YCbCr: + if (dec->cinfo.num_components != 3 || + r_v > 2 || r_v < dec->cinfo.comp_info[0].v_samp_factor || + r_v < dec->cinfo.comp_info[1].v_samp_factor || + r_h < dec->cinfo.comp_info[0].h_samp_factor || + r_h < dec->cinfo.comp_info[1].h_samp_factor) + goto invalid_yuvrgbgrayscale; + break; + default: + g_assert_not_reached (); + break; + } + + width = dec->cinfo.output_width; + height = dec->cinfo.output_height; + + if (G_UNLIKELY (width < MIN_WIDTH || width > MAX_WIDTH || + height < MIN_HEIGHT || height > MAX_HEIGHT)) + goto wrong_size; + + gst_jpeg_dec_negotiate (dec, width, height, dec->cinfo.jpeg_color_space); + + ret = gst_pad_alloc_buffer_and_set_caps (dec->srcpad, GST_BUFFER_OFFSET_NONE, + dec->outsize, GST_PAD_CAPS (dec->srcpad), &outbuf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto alloc_failed; + + outdata = GST_BUFFER_DATA (outbuf); + outsize = GST_BUFFER_SIZE (outbuf); + + GST_LOG_OBJECT (dec, "width %d, height %d, buffer size %d, required size %d", + width, height, outsize, dec->outsize); + + GST_BUFFER_TIMESTAMP (outbuf) = dec->next_ts; + + if (dec->packetized && GST_CLOCK_TIME_IS_VALID (dec->next_ts)) { + if (GST_CLOCK_TIME_IS_VALID (duration)) { + /* use duration from incoming buffer for outgoing buffer */ + dec->next_ts += duration; + } else if (dec->framerate_numerator != 0) { + duration = gst_util_uint64_scale (GST_SECOND, + dec->framerate_denominator, dec->framerate_numerator); + dec->next_ts += duration; + } else { + duration = GST_CLOCK_TIME_NONE; + dec->next_ts = GST_CLOCK_TIME_NONE; + } + } else { + duration = GST_CLOCK_TIME_NONE; + dec->next_ts = GST_CLOCK_TIME_NONE; + } + GST_BUFFER_DURATION (outbuf) = duration; + + if (dec->cinfo.jpeg_color_space == JCS_RGB) { + base[0] = outdata + dec->offset[0]; + base[1] = outdata + dec->offset[1]; + base[2] = outdata + dec->offset[2]; + gst_jpeg_dec_decode_rgb (dec, base, width, height, dec->inc, dec->stride); + } else if (dec->cinfo.jpeg_color_space == JCS_GRAYSCALE) { + base[0] = outdata + dec->offset[0]; + gst_jpeg_dec_decode_grayscale (dec, base, width, height, dec->inc, + dec->stride); + } else { + /* mind the swap, jpeglib outputs blue chroma first + * ensonic: I see no swap? + */ + base[0] = outdata + I420_Y_OFFSET (width, height); + base[1] = outdata + I420_U_OFFSET (width, height); + base[2] = outdata + I420_V_OFFSET (width, height); + + /* make sure we don't make jpeglib write beyond our buffer, + * which might happen if (height % (r_v*DCTSIZE)) != 0 */ + last[0] = base[0] + (I420_Y_ROWSTRIDE (width) * (height - 1)); + last[1] = + base[1] + (I420_U_ROWSTRIDE (width) * ((GST_ROUND_UP_2 (height) / 2) - + 1)); + last[2] = + base[2] + (I420_V_ROWSTRIDE (width) * ((GST_ROUND_UP_2 (height) / 2) - + 1)); + + GST_LOG_OBJECT (dec, "decompressing (reqired scanline buffer height = %u)", + dec->cinfo.rec_outbuf_height); + + /* For some widths jpeglib requires more horizontal padding than I420 + * provides. In those cases we need to decode into separate buffers and then + * copy over the data into our final picture buffer, otherwise jpeglib might + * write over the end of a line into the beginning of the next line, + * resulting in blocky artifacts on the left side of the picture. */ + if (G_UNLIKELY (width % (dec->cinfo.max_h_samp_factor * DCTSIZE) != 0 + || dec->cinfo.comp_info[0].h_samp_factor != 2 + || dec->cinfo.comp_info[1].h_samp_factor != 1 + || dec->cinfo.comp_info[2].h_samp_factor != 1)) { + GST_CAT_LOG_OBJECT (GST_CAT_PERFORMANCE, dec, + "indirect decoding using extra buffer copy"); + gst_jpeg_dec_decode_indirect (dec, base, last, width, height, r_v, r_h, + dec->cinfo.num_components); + } else { + ret = gst_jpeg_dec_decode_direct (dec, base, last, width, height); + + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto decode_direct_failed; + } + } + + GST_LOG_OBJECT (dec, "decompressing finished"); + jpeg_finish_decompress (&dec->cinfo); + + /* Clipping */ + if (dec->segment.format == GST_FORMAT_TIME) { + gint64 start, stop, clip_start, clip_stop; + + GST_LOG_OBJECT (dec, "Attempting clipping"); + + start = GST_BUFFER_TIMESTAMP (outbuf); + if (GST_BUFFER_DURATION (outbuf) == GST_CLOCK_TIME_NONE) + stop = start; + else + stop = start + GST_BUFFER_DURATION (outbuf); + + if (gst_segment_clip (&dec->segment, GST_FORMAT_TIME, + start, stop, &clip_start, &clip_stop)) { + GST_LOG_OBJECT (dec, "Clipping start to %" GST_TIME_FORMAT, + GST_TIME_ARGS (clip_start)); + GST_BUFFER_TIMESTAMP (outbuf) = clip_start; + if (GST_BUFFER_DURATION (outbuf) != GST_CLOCK_TIME_NONE) { + GST_LOG_OBJECT (dec, "Clipping duration to %" GST_TIME_FORMAT, + GST_TIME_ARGS (clip_stop - clip_start)); + GST_BUFFER_DURATION (outbuf) = clip_stop - clip_start; + } + } else + goto drop_buffer; + } + + /* reset error count on successful decode */ + dec->error_count = 0; + + ++dec->good_count; + + GST_LOG_OBJECT (dec, "pushing buffer (ts=%" GST_TIME_FORMAT ", dur=%" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf))); + + ret = gst_pad_push (dec->srcpad, outbuf); + +skip_decoding: +done: + gst_adapter_flush (dec->adapter, dec->rem_img_len); + +exit: + + if (G_UNLIKELY (ret == GST_FLOW_ERROR)) { + jpeg_abort_decompress (&dec->cinfo); + ret = gst_jpeg_dec_post_error_or_warning (dec); + } + + return ret; + + /* special cases */ +need_more_data: + { + GST_LOG_OBJECT (dec, "we need more data"); + if (outbuf) { + gst_buffer_unref (outbuf); + outbuf = NULL; + } + ret = GST_FLOW_OK; + goto exit; + } + /* ERRORS */ +wrong_size: + { + gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, + "Picture is too small or too big (%ux%u)", width, height); + ret = GST_FLOW_ERROR; + goto done; + } +decode_error: + { + gchar err_msg[JMSG_LENGTH_MAX]; + + dec->jerr.pub.format_message ((j_common_ptr) (&dec->cinfo), err_msg); + + gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, + "Decode error #%u: %s", code, err_msg); + + if (outbuf) { + gst_buffer_unref (outbuf); + outbuf = NULL; + } + ret = GST_FLOW_ERROR; + goto done; + } +decode_direct_failed: + { + /* already posted an error message */ + jpeg_abort_decompress (&dec->cinfo); + gst_buffer_replace (&outbuf, NULL); + goto done; + } +alloc_failed: + { + const gchar *reason; + + reason = gst_flow_get_name (ret); + + GST_DEBUG_OBJECT (dec, "failed to alloc buffer, reason %s", reason); + /* Reset for next time */ + jpeg_abort_decompress (&dec->cinfo); + if (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_WRONG_STATE && + ret != GST_FLOW_NOT_LINKED) { + gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, + "Buffer allocation failed, reason: %s", reason); + } + goto exit; + } +drop_buffer: + { + GST_WARNING_OBJECT (dec, "Outgoing buffer is outside configured segment"); + gst_buffer_unref (outbuf); + ret = GST_FLOW_OK; + goto exit; + } +components_not_supported: + { + gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, + "number of components not supported: %d (max 3)", + dec->cinfo.num_components); + ret = GST_FLOW_ERROR; + goto done; + } +unsupported_colorspace: + { + gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, + "Picture has unknown or unsupported colourspace"); + ret = GST_FLOW_ERROR; + goto done; + } +invalid_yuvrgbgrayscale: + { + gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, + "Picture is corrupt or unhandled YUV/RGB/grayscale layout"); + ret = GST_FLOW_ERROR; + goto done; + } +} + +static gboolean +gst_jpeg_dec_src_event (GstPad * pad, GstEvent * event) +{ + GstJpegDec *dec; + gboolean res; + + dec = GST_JPEG_DEC (gst_pad_get_parent (pad)); + if (G_UNLIKELY (dec == NULL)) { + gst_event_unref (event); + return FALSE; + } + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS:{ + GstClockTimeDiff diff; + GstClockTime timestamp; + gdouble proportion; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + gst_jpeg_dec_update_qos (dec, proportion, diff, timestamp); + break; + } + default: + break; + } + + res = gst_pad_push_event (dec->sinkpad, event); + + gst_object_unref (dec); + return res; +} + +static gboolean +gst_jpeg_dec_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean ret = TRUE; + GstJpegDec *dec = GST_JPEG_DEC (GST_OBJECT_PARENT (pad)); + + GST_DEBUG_OBJECT (dec, "event : %s", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + GST_DEBUG_OBJECT (dec, "Aborting decompress"); + jpeg_abort_decompress (&dec->cinfo); + gst_segment_init (&dec->segment, GST_FORMAT_UNDEFINED); + gst_adapter_clear (dec->adapter); + g_free (dec->cur_buf); + dec->cur_buf = NULL; + dec->parse_offset = 0; + dec->parse_entropy_len = 0; + dec->parse_resync = FALSE; + gst_jpeg_dec_reset_qos (dec); + break; + case GST_EVENT_NEWSEGMENT:{ + gboolean update; + gdouble rate, applied_rate; + GstFormat format; + gint64 start, stop, position; + + gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, + &format, &start, &stop, &position); + + GST_DEBUG_OBJECT (dec, "Got NEWSEGMENT [%" GST_TIME_FORMAT + " - %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "]", + GST_TIME_ARGS (start), GST_TIME_ARGS (stop), + GST_TIME_ARGS (position)); + + gst_segment_set_newsegment_full (&dec->segment, update, rate, + applied_rate, format, start, stop, position); + + break; + } + default: + break; + } + + ret = gst_pad_push_event (dec->srcpad, event); + + return ret; +} + +static void +gst_jpeg_dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstJpegDec *dec; + + dec = GST_JPEG_DEC (object); + + switch (prop_id) { + case PROP_IDCT_METHOD: + dec->idct_method = g_value_get_enum (value); + break; + case PROP_MAX_ERRORS: + g_atomic_int_set (&dec->max_errors, g_value_get_int (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_jpeg_dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstJpegDec *dec; + + dec = GST_JPEG_DEC (object); + + switch (prop_id) { + case PROP_IDCT_METHOD: + g_value_set_enum (value, dec->idct_method); + break; + case PROP_MAX_ERRORS: + g_value_set_int (value, g_atomic_int_get (&dec->max_errors)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_jpeg_dec_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstJpegDec *dec; + + dec = GST_JPEG_DEC (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + dec->error_count = 0; + dec->good_count = 0; + dec->framerate_numerator = 0; + dec->framerate_denominator = 1; + dec->caps_framerate_numerator = dec->caps_framerate_denominator = 0; + dec->caps_width = -1; + dec->caps_height = -1; + dec->clrspc = -1; + dec->packetized = FALSE; + dec->next_ts = 0; + dec->discont = TRUE; + dec->parse_offset = 0; + dec->parse_entropy_len = 0; + dec->parse_resync = FALSE; + dec->cur_buf = NULL; + gst_segment_init (&dec->segment, GST_FORMAT_UNDEFINED); + gst_jpeg_dec_reset_qos (dec); + 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_PAUSED_TO_READY: + gst_adapter_clear (dec->adapter); + g_free (dec->cur_buf); + dec->cur_buf = NULL; + gst_jpeg_dec_free_buffers (dec); + break; + default: + break; + } + + return ret; +} diff --git a/ext/jpeg/gstjpegdec.h b/ext/jpeg/gstjpegdec.h new file mode 100644 index 0000000..7daf7b6 --- /dev/null +++ b/ext/jpeg/gstjpegdec.h @@ -0,0 +1,150 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_JPEG_DEC_H__ +#define __GST_JPEG_DEC_H__ + + +#include +#include +#include +#include + +/* this is a hack hack hack to get around jpeglib header bugs... */ +#ifdef HAVE_STDLIB_H +# undef HAVE_STDLIB_H +#endif +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_JPEG_DEC \ + (gst_jpeg_dec_get_type()) +#define GST_JPEG_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JPEG_DEC,GstJpegDec)) +#define GST_JPEG_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JPEG_DEC,GstJpegDecClass)) +#define GST_IS_JPEG_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JPEG_DEC)) +#define GST_IS_JPEG_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JPEG_DEC)) + +typedef struct _GstJpegDec GstJpegDec; +typedef struct _GstJpegDecClass GstJpegDecClass; + +struct GstJpegDecErrorMgr { + struct jpeg_error_mgr pub; /* public fields */ + jmp_buf setjmp_buffer; +}; + +struct GstJpegDecSourceMgr { + struct jpeg_source_mgr pub; /* public fields */ + GstJpegDec *dec; +}; + +/* Can't use GstBaseTransform, because GstBaseTransform + * doesn't handle the N buffers in, 1 buffer out case, + * but only the 1-in 1-out case */ +struct _GstJpegDec { + GstElement element; + + /* pads */ + GstPad *sinkpad; + GstPad *srcpad; + + GstAdapter *adapter; + + guint8 *cur_buf; + + /* TRUE if each input buffer contains a whole jpeg image */ + gboolean packetized; + + /* the (expected) timestamp of the next frame */ + guint64 next_ts; + + GstSegment segment; + + /* TRUE if the next output buffer should have the DISCONT flag set */ + gboolean discont; + + /* QoS stuff *//* with LOCK */ + gdouble proportion; + GstClockTime earliest_time; + GstClockTime qos_duration; + + /* video state */ + gint framerate_numerator; + gint framerate_denominator; + + /* negotiated state */ + gint caps_framerate_numerator; + gint caps_framerate_denominator; + gint caps_width; + gint caps_height; + gint outsize; + gint clrspc; + + gint offset[3]; + gint stride; + gint inc; + + /* parse state */ + gint parse_offset; + gint parse_entropy_len; + gint parse_resync; + + /* properties */ + gint idct_method; + gint max_errors; /* ATOMIC */ + + /* current error (the message is the debug message) */ + gchar *error_msg; + int error_line; + const gchar *error_func; + + /* number of errors since start or last successfully decoded image */ + guint error_count; + + /* number of successfully decoded images since start */ + guint good_count; + + struct jpeg_decompress_struct cinfo; + struct GstJpegDecErrorMgr jerr; + struct GstJpegDecSourceMgr jsrc; + + /* arrays for indirect decoding */ + gboolean idr_width_allocated; + guchar *idr_y[16],*idr_u[16],*idr_v[16]; + /* current (parsed) image size */ + guint rem_img_len; +}; + +struct _GstJpegDecClass { + GstElementClass parent_class; +}; + +GType gst_jpeg_dec_get_type(void); + + +G_END_DECLS + + +#endif /* __GST_JPEG_DEC_H__ */ diff --git a/ext/jpeg/gstjpegenc.c b/ext/jpeg/gstjpegenc.c new file mode 100644 index 0000000..c44cb2e --- /dev/null +++ b/ext/jpeg/gstjpegenc.c @@ -0,0 +1,744 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-jpegenc + * + * Encodes jpeg images. + * + * + * Example launch line + * |[ + * gst-launch videotestsrc num-buffers=50 ! video/x-raw-yuv, framerate='(fraction)'5/1 ! jpegenc ! avimux ! filesink location=mjpeg.avi + * ]| a pipeline to mux 5 JPEG frames per second into a 10 sec. long motion jpeg + * avi. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include "gstjpegenc.h" +#include "gstjpeg.h" +#include + +/* experimental */ +/* setting smoothig seems to have no effect in libjepeg +#define ENABLE_SMOOTHING 1 +*/ + +GST_DEBUG_CATEGORY_STATIC (jpegenc_debug); +#define GST_CAT_DEFAULT jpegenc_debug + +#define JPEG_DEFAULT_QUALITY 85 +#define JPEG_DEFAULT_SMOOTHING 0 +#define JPEG_DEFAULT_IDCT_METHOD JDCT_FASTEST + +/* JpegEnc signals and args */ +enum +{ + FRAME_ENCODED, + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_QUALITY, + PROP_SMOOTHING, + PROP_IDCT_METHOD +}; + +static void gst_jpegenc_reset (GstJpegEnc * enc); +static void gst_jpegenc_base_init (gpointer g_class); +static void gst_jpegenc_class_init (GstJpegEnc * klass); +static void gst_jpegenc_init (GstJpegEnc * jpegenc); +static void gst_jpegenc_finalize (GObject * object); + +static GstFlowReturn gst_jpegenc_chain (GstPad * pad, GstBuffer * buf); +static gboolean gst_jpegenc_setcaps (GstPad * pad, GstCaps * caps); +static GstCaps *gst_jpegenc_getcaps (GstPad * pad); + +static void gst_jpegenc_resync (GstJpegEnc * jpegenc); +static void gst_jpegenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_jpegenc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstStateChangeReturn gst_jpegenc_change_state (GstElement * element, + GstStateChange transition); + + +static GstElementClass *parent_class = NULL; +static guint gst_jpegenc_signals[LAST_SIGNAL] = { 0 }; + +GType +gst_jpegenc_get_type (void) +{ + static GType jpegenc_type = 0; + + if (!jpegenc_type) { + static const GTypeInfo jpegenc_info = { + sizeof (GstJpegEnc), + (GBaseInitFunc) gst_jpegenc_base_init, + NULL, + (GClassInitFunc) gst_jpegenc_class_init, + NULL, + NULL, + sizeof (GstJpegEnc), + 0, + (GInstanceInitFunc) gst_jpegenc_init, + }; + + jpegenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstJpegEnc", &jpegenc_info, + 0); + } + return jpegenc_type; +} + +/* *INDENT-OFF* */ +static GstStaticPadTemplate gst_jpegenc_sink_pad_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV + ("{ I420, YV12, YUY2, UYVY, Y41B, Y42B, YVYU, Y444 }") "; " + GST_VIDEO_CAPS_RGB "; " GST_VIDEO_CAPS_BGR "; " + GST_VIDEO_CAPS_RGBx "; " GST_VIDEO_CAPS_xRGB "; " + GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_xBGR "; " + GST_VIDEO_CAPS_GRAY8) + ); +/* *INDENT-ON* */ + +static GstStaticPadTemplate gst_jpegenc_src_pad_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/jpeg, " + "width = (int) [ 16, 65535 ], " + "height = (int) [ 16, 65535 ], " "framerate = (fraction) [ 0/1, MAX ]") + ); + +static void +gst_jpegenc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_jpegenc_sink_pad_template); + gst_element_class_add_static_pad_template (element_class, + &gst_jpegenc_src_pad_template); + gst_element_class_set_details_simple (element_class, "JPEG image encoder", + "Codec/Encoder/Image", + "Encode images in JPEG format", "Wim Taymans "); +} + +static void +gst_jpegenc_class_init (GstJpegEnc * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gst_jpegenc_signals[FRAME_ENCODED] = + g_signal_new ("frame-encoded", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstJpegEncClass, frame_encoded), NULL, + NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + gobject_class->set_property = gst_jpegenc_set_property; + gobject_class->get_property = gst_jpegenc_get_property; + + + g_object_class_install_property (gobject_class, PROP_QUALITY, + g_param_spec_int ("quality", "Quality", "Quality of encoding", + 0, 100, JPEG_DEFAULT_QUALITY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + +#ifdef ENABLE_SMOOTHING + /* disabled, since it doesn't seem to work */ + g_object_class_install_property (gobject_class, PROP_SMOOTHING, + g_param_spec_int ("smoothing", "Smoothing", "Smoothing factor", + 0, 100, JPEG_DEFAULT_SMOOTHING, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +#endif + + g_object_class_install_property (gobject_class, PROP_IDCT_METHOD, + g_param_spec_enum ("idct-method", "IDCT Method", + "The IDCT algorithm to use", GST_TYPE_IDCT_METHOD, + JPEG_DEFAULT_IDCT_METHOD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = gst_jpegenc_change_state; + + gobject_class->finalize = gst_jpegenc_finalize; + + GST_DEBUG_CATEGORY_INIT (jpegenc_debug, "jpegenc", 0, + "JPEG encoding element"); +} + +static void +gst_jpegenc_init_destination (j_compress_ptr cinfo) +{ + GST_DEBUG ("gst_jpegenc_chain: init_destination"); +} + +static boolean +gst_jpegenc_flush_destination (j_compress_ptr cinfo) +{ + GstBuffer *overflow_buffer; + guint32 old_buffer_size; + GstJpegEnc *jpegenc = (GstJpegEnc *) (cinfo->client_data); + GstFlowReturn ret; + + GST_DEBUG_OBJECT (jpegenc, + "gst_jpegenc_chain: flush_destination: buffer too small"); + + /* Our output buffer wasn't big enough. + * Make a new buffer that's twice the size, */ + old_buffer_size = GST_BUFFER_SIZE (jpegenc->output_buffer); + ret = gst_pad_alloc_buffer_and_set_caps (jpegenc->srcpad, + GST_BUFFER_OFFSET_NONE, old_buffer_size * 2, + GST_PAD_CAPS (jpegenc->srcpad), &overflow_buffer); + /* handle here if needed */ + if (ret != GST_FLOW_OK) { + overflow_buffer = gst_buffer_new_and_alloc (old_buffer_size * 2); + gst_buffer_set_caps (overflow_buffer, GST_PAD_CAPS (jpegenc->srcpad)); + } + + memcpy (GST_BUFFER_DATA (overflow_buffer), + GST_BUFFER_DATA (jpegenc->output_buffer), old_buffer_size); + + gst_buffer_copy_metadata (overflow_buffer, jpegenc->output_buffer, + GST_BUFFER_COPY_TIMESTAMPS); + + /* drop it into place, */ + gst_buffer_unref (jpegenc->output_buffer); + jpegenc->output_buffer = overflow_buffer; + + /* and last, update libjpeg on where to work. */ + jpegenc->jdest.next_output_byte = + GST_BUFFER_DATA (jpegenc->output_buffer) + old_buffer_size; + jpegenc->jdest.free_in_buffer = + GST_BUFFER_SIZE (jpegenc->output_buffer) - old_buffer_size; + + return TRUE; +} + +static void +gst_jpegenc_term_destination (j_compress_ptr cinfo) +{ + GstJpegEnc *jpegenc = (GstJpegEnc *) (cinfo->client_data); + GST_DEBUG_OBJECT (jpegenc, "gst_jpegenc_chain: term_source"); + + /* Trim the buffer size and push it. */ + GST_BUFFER_SIZE (jpegenc->output_buffer) = + GST_BUFFER_SIZE (jpegenc->output_buffer) - jpegenc->jdest.free_in_buffer; + + g_signal_emit (G_OBJECT (jpegenc), gst_jpegenc_signals[FRAME_ENCODED], 0); + + jpegenc->last_ret = gst_pad_push (jpegenc->srcpad, jpegenc->output_buffer); + jpegenc->output_buffer = NULL; +} + +static void +gst_jpegenc_init (GstJpegEnc * jpegenc) +{ + /* create the sink and src pads */ + jpegenc->sinkpad = + gst_pad_new_from_static_template (&gst_jpegenc_sink_pad_template, "sink"); + gst_pad_set_chain_function (jpegenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_jpegenc_chain)); + gst_pad_set_getcaps_function (jpegenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_jpegenc_getcaps)); + gst_pad_set_setcaps_function (jpegenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_jpegenc_setcaps)); + gst_element_add_pad (GST_ELEMENT (jpegenc), jpegenc->sinkpad); + + jpegenc->srcpad = + gst_pad_new_from_static_template (&gst_jpegenc_src_pad_template, "src"); + gst_pad_use_fixed_caps (jpegenc->srcpad); + gst_element_add_pad (GST_ELEMENT (jpegenc), jpegenc->srcpad); + + /* reset the initial video state */ + jpegenc->width = -1; + jpegenc->height = -1; + + /* setup jpeglib */ + memset (&jpegenc->cinfo, 0, sizeof (jpegenc->cinfo)); + memset (&jpegenc->jerr, 0, sizeof (jpegenc->jerr)); + jpegenc->cinfo.err = jpeg_std_error (&jpegenc->jerr); + jpeg_create_compress (&jpegenc->cinfo); + + jpegenc->jdest.init_destination = gst_jpegenc_init_destination; + jpegenc->jdest.empty_output_buffer = gst_jpegenc_flush_destination; + jpegenc->jdest.term_destination = gst_jpegenc_term_destination; + jpegenc->cinfo.dest = &jpegenc->jdest; + jpegenc->cinfo.client_data = jpegenc; + + /* init properties */ + jpegenc->quality = JPEG_DEFAULT_QUALITY; + jpegenc->smoothing = JPEG_DEFAULT_SMOOTHING; + jpegenc->idct_method = JPEG_DEFAULT_IDCT_METHOD; + + gst_jpegenc_reset (jpegenc); +} + +static void +gst_jpegenc_reset (GstJpegEnc * enc) +{ + gint i, j; + + g_free (enc->line[0]); + g_free (enc->line[1]); + g_free (enc->line[2]); + enc->line[0] = NULL; + enc->line[1] = NULL; + enc->line[2] = NULL; + for (i = 0; i < 3; i++) { + for (j = 0; j < 4 * DCTSIZE; j++) { + g_free (enc->row[i][j]); + enc->row[i][j] = NULL; + } + } + + enc->width = -1; + enc->height = -1; + enc->format = GST_VIDEO_FORMAT_UNKNOWN; + enc->fps_den = enc->par_den = 0; + enc->height = enc->width = 0; +} + +static void +gst_jpegenc_finalize (GObject * object) +{ + GstJpegEnc *filter = GST_JPEGENC (object); + + jpeg_destroy_compress (&filter->cinfo); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstCaps * +gst_jpegenc_getcaps (GstPad * pad) +{ + GstJpegEnc *jpegenc = GST_JPEGENC (gst_pad_get_parent (pad)); + GstCaps *caps, *othercaps; + const GstCaps *templ; + gint i, j; + GstStructure *structure = NULL; + + /* we want to proxy properties like width, height and framerate from the + other end of the element */ + + othercaps = gst_pad_peer_get_caps_reffed (jpegenc->srcpad); + if (othercaps == NULL || + gst_caps_is_empty (othercaps) || gst_caps_is_any (othercaps)) { + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + goto done; + } + + caps = gst_caps_new_empty (); + templ = gst_pad_get_pad_template_caps (pad); + + for (i = 0; i < gst_caps_get_size (templ); i++) { + /* pick fields from peer caps */ + for (j = 0; j < gst_caps_get_size (othercaps); j++) { + GstStructure *s = gst_caps_get_structure (othercaps, j); + const GValue *val; + + structure = gst_structure_copy (gst_caps_get_structure (templ, i)); + if ((val = gst_structure_get_value (s, "width"))) + gst_structure_set_value (structure, "width", val); + if ((val = gst_structure_get_value (s, "height"))) + gst_structure_set_value (structure, "height", val); + if ((val = gst_structure_get_value (s, "framerate"))) + gst_structure_set_value (structure, "framerate", val); + + gst_caps_merge_structure (caps, structure); + } + } + +done: + + gst_caps_replace (&othercaps, NULL); + gst_object_unref (jpegenc); + + return caps; +} + +static gboolean +gst_jpegenc_setcaps (GstPad * pad, GstCaps * caps) +{ + GstJpegEnc *enc = GST_JPEGENC (gst_pad_get_parent (pad)); + GstVideoFormat format; + gint width, height; + gint fps_num, fps_den; + gint par_num, par_den; + gint i; + GstCaps *othercaps; + gboolean ret; + + /* get info from caps */ + if (!gst_video_format_parse_caps (caps, &format, &width, &height)) + goto refuse_caps; + /* optional; pass along if present */ + fps_num = fps_den = -1; + par_num = par_den = -1; + gst_video_parse_caps_framerate (caps, &fps_num, &fps_den); + gst_video_parse_caps_pixel_aspect_ratio (caps, &par_num, &par_den); + + if (width == enc->width && height == enc->height && enc->format == format + && fps_num == enc->fps_num && fps_den == enc->fps_den + && par_num == enc->par_num && par_den == enc->par_den) + return TRUE; + + /* store input description */ + enc->format = format; + enc->width = width; + enc->height = height; + enc->fps_num = fps_num; + enc->fps_den = fps_den; + enc->par_num = par_num; + enc->par_den = par_den; + + /* prepare a cached image description */ + enc->channels = 3 + (gst_video_format_has_alpha (format) ? 1 : 0); + /* ... but any alpha is disregarded in encoding */ + if (gst_video_format_is_gray (format)) + enc->channels = 1; + else + enc->channels = 3; + enc->h_max_samp = 0; + enc->v_max_samp = 0; + for (i = 0; i < enc->channels; ++i) { + enc->cwidth[i] = gst_video_format_get_component_width (format, i, width); + enc->cheight[i] = gst_video_format_get_component_height (format, i, height); + enc->offset[i] = gst_video_format_get_component_offset (format, i, width, + height); + enc->stride[i] = gst_video_format_get_row_stride (format, i, width); + enc->inc[i] = gst_video_format_get_pixel_stride (format, i); + enc->h_samp[i] = GST_ROUND_UP_4 (width) / enc->cwidth[i]; + enc->h_max_samp = MAX (enc->h_max_samp, enc->h_samp[i]); + enc->v_samp[i] = GST_ROUND_UP_4 (height) / enc->cheight[i]; + enc->v_max_samp = MAX (enc->v_max_samp, enc->v_samp[i]); + } + /* samp should only be 1, 2 or 4 */ + g_assert (enc->h_max_samp <= 4); + g_assert (enc->v_max_samp <= 4); + /* now invert */ + /* maximum is invariant, as one of the components should have samp 1 */ + for (i = 0; i < enc->channels; ++i) { + enc->h_samp[i] = enc->h_max_samp / enc->h_samp[i]; + enc->v_samp[i] = enc->v_max_samp / enc->v_samp[i]; + } + enc->planar = (enc->inc[0] == 1 && enc->inc[1] == 1 && enc->inc[2] == 1); + + othercaps = gst_caps_copy (gst_pad_get_pad_template_caps (enc->srcpad)); + gst_caps_set_simple (othercaps, + "width", G_TYPE_INT, enc->width, "height", G_TYPE_INT, enc->height, NULL); + if (enc->fps_den > 0) + gst_caps_set_simple (othercaps, + "framerate", GST_TYPE_FRACTION, enc->fps_num, enc->fps_den, NULL); + if (enc->par_den > 0) + gst_caps_set_simple (othercaps, + "pixel-aspect-ratio", GST_TYPE_FRACTION, enc->par_num, enc->par_den, + NULL); + + ret = gst_pad_set_caps (enc->srcpad, othercaps); + gst_caps_unref (othercaps); + + if (ret) + gst_jpegenc_resync (enc); + + gst_object_unref (enc); + + return ret; + + /* ERRORS */ +refuse_caps: + { + GST_WARNING_OBJECT (enc, "refused caps %" GST_PTR_FORMAT, caps); + gst_object_unref (enc); + return FALSE; + } +} + +static void +gst_jpegenc_resync (GstJpegEnc * jpegenc) +{ + gint width, height; + gint i, j; + + GST_DEBUG_OBJECT (jpegenc, "resync"); + + jpegenc->cinfo.image_width = width = jpegenc->width; + jpegenc->cinfo.image_height = height = jpegenc->height; + jpegenc->cinfo.input_components = jpegenc->channels; + + GST_DEBUG_OBJECT (jpegenc, "width %d, height %d", width, height); + GST_DEBUG_OBJECT (jpegenc, "format %d", jpegenc->format); + + if (gst_video_format_is_rgb (jpegenc->format)) { + GST_DEBUG_OBJECT (jpegenc, "RGB"); + jpegenc->cinfo.in_color_space = JCS_RGB; + } else if (gst_video_format_is_gray (jpegenc->format)) { + GST_DEBUG_OBJECT (jpegenc, "gray"); + jpegenc->cinfo.in_color_space = JCS_GRAYSCALE; + } else { + GST_DEBUG_OBJECT (jpegenc, "YUV"); + jpegenc->cinfo.in_color_space = JCS_YCbCr; + } + + /* input buffer size as max output */ + jpegenc->bufsize = gst_video_format_get_size (jpegenc->format, width, height); + jpeg_set_defaults (&jpegenc->cinfo); + jpegenc->cinfo.raw_data_in = TRUE; + /* duh, libjpeg maps RGB to YUV ... and don't expect some conversion */ + if (jpegenc->cinfo.in_color_space == JCS_RGB) + jpeg_set_colorspace (&jpegenc->cinfo, JCS_RGB); + + GST_DEBUG_OBJECT (jpegenc, "h_max_samp=%d, v_max_samp=%d", + jpegenc->h_max_samp, jpegenc->v_max_samp); + /* image dimension info */ + for (i = 0; i < jpegenc->channels; i++) { + GST_DEBUG_OBJECT (jpegenc, "comp %i: h_samp=%d, v_samp=%d", i, + jpegenc->h_samp[i], jpegenc->v_samp[i]); + jpegenc->cinfo.comp_info[i].h_samp_factor = jpegenc->h_samp[i]; + jpegenc->cinfo.comp_info[i].v_samp_factor = jpegenc->v_samp[i]; + g_free (jpegenc->line[i]); + jpegenc->line[i] = g_new (guchar *, jpegenc->v_max_samp * DCTSIZE); + if (!jpegenc->planar) { + for (j = 0; j < jpegenc->v_max_samp * DCTSIZE; j++) { + g_free (jpegenc->row[i][j]); + jpegenc->row[i][j] = g_malloc (width); + jpegenc->line[i][j] = jpegenc->row[i][j]; + } + } + } + + /* guard against a potential error in gst_jpegenc_term_destination + which occurs iff bufsize % 4 < free_space_remaining */ + jpegenc->bufsize = GST_ROUND_UP_4 (jpegenc->bufsize); + + jpeg_suppress_tables (&jpegenc->cinfo, TRUE); + + GST_DEBUG_OBJECT (jpegenc, "resync done"); +} + +static GstFlowReturn +gst_jpegenc_chain (GstPad * pad, GstBuffer * buf) +{ + GstFlowReturn ret; + GstJpegEnc *jpegenc; + guchar *data; + gulong size; + guint height; + guchar *base[3], *end[3]; + gint i, j, k; + + jpegenc = GST_JPEGENC (GST_OBJECT_PARENT (pad)); + + if (G_UNLIKELY (jpegenc->width <= 0 || jpegenc->height <= 0)) + goto not_negotiated; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + GST_LOG_OBJECT (jpegenc, "got buffer of %lu bytes", size); + + ret = + gst_pad_alloc_buffer_and_set_caps (jpegenc->srcpad, + GST_BUFFER_OFFSET_NONE, jpegenc->bufsize, GST_PAD_CAPS (jpegenc->srcpad), + &jpegenc->output_buffer); + + if (ret != GST_FLOW_OK) + goto done; + + gst_buffer_copy_metadata (jpegenc->output_buffer, buf, + GST_BUFFER_COPY_TIMESTAMPS); + + height = jpegenc->height; + + for (i = 0; i < jpegenc->channels; i++) { + base[i] = data + jpegenc->offset[i]; + end[i] = base[i] + jpegenc->cheight[i] * jpegenc->stride[i]; + } + + jpegenc->jdest.next_output_byte = GST_BUFFER_DATA (jpegenc->output_buffer); + jpegenc->jdest.free_in_buffer = GST_BUFFER_SIZE (jpegenc->output_buffer); + + /* prepare for raw input */ +#if JPEG_LIB_VERSION >= 70 + jpegenc->cinfo.do_fancy_downsampling = FALSE; +#endif + jpegenc->cinfo.smoothing_factor = jpegenc->smoothing; + jpegenc->cinfo.dct_method = jpegenc->idct_method; + jpeg_set_quality (&jpegenc->cinfo, jpegenc->quality, TRUE); + jpeg_start_compress (&jpegenc->cinfo, TRUE); + + GST_LOG_OBJECT (jpegenc, "compressing"); + + if (jpegenc->planar) { + for (i = 0; i < height; i += jpegenc->v_max_samp * DCTSIZE) { + for (k = 0; k < jpegenc->channels; k++) { + for (j = 0; j < jpegenc->v_samp[k] * DCTSIZE; j++) { + jpegenc->line[k][j] = base[k]; + if (base[k] + jpegenc->stride[k] < end[k]) + base[k] += jpegenc->stride[k]; + } + } + jpeg_write_raw_data (&jpegenc->cinfo, jpegenc->line, + jpegenc->v_max_samp * DCTSIZE); + } + } else { + for (i = 0; i < height; i += jpegenc->v_max_samp * DCTSIZE) { + for (k = 0; k < jpegenc->channels; k++) { + for (j = 0; j < jpegenc->v_samp[k] * DCTSIZE; j++) { + guchar *src, *dst; + gint l; + + /* ouch, copy line */ + src = base[k]; + dst = jpegenc->line[k][j]; + for (l = jpegenc->cwidth[k]; l > 0; l--) { + *dst = *src; + src += jpegenc->inc[k]; + dst++; + } + if (base[k] + jpegenc->stride[k] < end[k]) + base[k] += jpegenc->stride[k]; + } + } + jpeg_write_raw_data (&jpegenc->cinfo, jpegenc->line, + jpegenc->v_max_samp * DCTSIZE); + } + } + + /* This will ensure that gst_jpegenc_term_destination is called; we push + the final output buffer from there */ + jpeg_finish_compress (&jpegenc->cinfo); + GST_LOG_OBJECT (jpegenc, "compressing done"); + +done: + gst_buffer_unref (buf); + + return ret; + +/* ERRORS */ +not_negotiated: + { + GST_WARNING_OBJECT (jpegenc, "no input format set (no caps on buffer)"); + ret = GST_FLOW_NOT_NEGOTIATED; + goto done; + } +} + +static void +gst_jpegenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstJpegEnc *jpegenc = GST_JPEGENC (object); + + GST_OBJECT_LOCK (jpegenc); + + switch (prop_id) { + case PROP_QUALITY: + jpegenc->quality = g_value_get_int (value); + break; +#ifdef ENABLE_SMOOTHING + case PROP_SMOOTHING: + jpegenc->smoothing = g_value_get_int (value); + break; +#endif + case PROP_IDCT_METHOD: + jpegenc->idct_method = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (jpegenc); +} + +static void +gst_jpegenc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstJpegEnc *jpegenc = GST_JPEGENC (object); + + GST_OBJECT_LOCK (jpegenc); + + switch (prop_id) { + case PROP_QUALITY: + g_value_set_int (value, jpegenc->quality); + break; +#ifdef ENABLE_SMOOTHING + case PROP_SMOOTHING: + g_value_set_int (value, jpegenc->smoothing); + break; +#endif + case PROP_IDCT_METHOD: + g_value_set_enum (value, jpegenc->idct_method); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (jpegenc); +} + +static GstStateChangeReturn +gst_jpegenc_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstJpegEnc *filter = GST_JPEGENC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + GST_DEBUG_OBJECT (element, "setting line buffers"); + filter->line[0] = NULL; + filter->line[1] = NULL; + filter->line[2] = NULL; + 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_jpegenc_reset (filter); + break; + default: + break; + } + + return ret; +} diff --git a/ext/jpeg/gstjpegenc.h b/ext/jpeg/gstjpegenc.h new file mode 100644 index 0000000..f7a3ef0 --- /dev/null +++ b/ext/jpeg/gstjpegenc.h @@ -0,0 +1,109 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_JPEGENC_H__ +#define __GST_JPEGENC_H__ + + +#include +#include +/* this is a hack hack hack to get around jpeglib header bugs... */ +#ifdef HAVE_STDLIB_H +# undef HAVE_STDLIB_H +#endif +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_JPEGENC \ + (gst_jpegenc_get_type()) +#define GST_JPEGENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JPEGENC,GstJpegEnc)) +#define GST_JPEGENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JPEGENC,GstJpegEncClass)) +#define GST_IS_JPEGENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JPEGENC)) +#define GST_IS_JPEGENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JPEGENC)) + +typedef struct _GstJpegEnc GstJpegEnc; +typedef struct _GstJpegEncClass GstJpegEncClass; + +#define GST_JPEG_ENC_MAX_COMPONENT 4 + +struct _GstJpegEnc +{ + GstElement element; + + /* pads */ + GstPad *sinkpad, *srcpad; + + /* stream/image properties */ + GstVideoFormat format; + gint width; + gint height; + gint channels; + gint fps_num, fps_den; + gint par_num, par_den; + /* standard video_format indexed */ + gint stride[GST_JPEG_ENC_MAX_COMPONENT]; + gint offset[GST_JPEG_ENC_MAX_COMPONENT]; + gint inc[GST_JPEG_ENC_MAX_COMPONENT]; + gint cwidth[GST_JPEG_ENC_MAX_COMPONENT]; + gint cheight[GST_JPEG_ENC_MAX_COMPONENT]; + gint h_samp[GST_JPEG_ENC_MAX_COMPONENT]; + gint v_samp[GST_JPEG_ENC_MAX_COMPONENT]; + gint h_max_samp; + gint v_max_samp; + gboolean planar; + /* the video buffer */ + gint bufsize; + /* the jpeg line buffer */ + guchar **line[3]; + /* indirect encoding line buffers */ + guchar *row[3][4 * DCTSIZE]; + + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + struct jpeg_destination_mgr jdest; + + /* properties */ + gint quality; + gint smoothing; + gint idct_method; + + /* cached return state for any problems that may occur in callbacks */ + GstFlowReturn last_ret; + + GstBuffer *output_buffer; +}; + +struct _GstJpegEncClass +{ + GstElementClass parent_class; + + /* signals */ + void (*frame_encoded) (GstElement * element); +}; + +GType gst_jpegenc_get_type (void); + +G_END_DECLS +#endif /* __GST_JPEGENC_H__ */ diff --git a/ext/jpeg/gstsmokedec.c b/ext/jpeg/gstsmokedec.c new file mode 100644 index 0000000..6e38bb9 --- /dev/null +++ b/ext/jpeg/gstsmokedec.c @@ -0,0 +1,332 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-smokedec + * + * Decodes images in smoke format. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +/*#define DEBUG_ENABLED*/ +#include "gstsmokedec.h" +#include + +GST_DEBUG_CATEGORY_STATIC (smokedec_debug); +#define GST_CAT_DEFAULT smokedec_debug + +/* SmokeDec signals and args */ +enum +{ + LAST_SIGNAL +}; + +enum +{ + PROP_0 +}; + +static void gst_smokedec_base_init (gpointer g_class); +static void gst_smokedec_class_init (GstSmokeDec * klass); +static void gst_smokedec_init (GstSmokeDec * smokedec); +static void gst_smokedec_finalize (GObject * object); + +static GstStateChangeReturn +gst_smokedec_change_state (GstElement * element, GstStateChange transition); + +static GstFlowReturn gst_smokedec_chain (GstPad * pad, GstBuffer * buf); + +static GstElementClass *parent_class = NULL; + +/*static guint gst_smokedec_signals[LAST_SIGNAL] = { 0 }; */ + +GType +gst_smokedec_get_type (void) +{ + static GType smokedec_type = 0; + + if (!smokedec_type) { + static const GTypeInfo smokedec_info = { + sizeof (GstSmokeDecClass), + gst_smokedec_base_init, + NULL, + (GClassInitFunc) gst_smokedec_class_init, + NULL, + NULL, + sizeof (GstSmokeDec), + 0, + (GInstanceInitFunc) gst_smokedec_init, + }; + + smokedec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSmokeDec", &smokedec_info, + 0); + } + return smokedec_type; +} + +static GstStaticPadTemplate gst_smokedec_src_pad_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static GstStaticPadTemplate gst_smokedec_sink_pad_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-smoke, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0/1, MAX ]") + ); + +static void +gst_smokedec_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_smokedec_src_pad_template); + gst_element_class_add_static_pad_template (element_class, + &gst_smokedec_sink_pad_template); + gst_element_class_set_details_simple (element_class, "Smoke video decoder", + "Codec/Decoder/Video", + "Decode video from Smoke format", "Wim Taymans "); +} + +static void +gst_smokedec_class_init (GstSmokeDec * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_smokedec_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_smokedec_change_state); + + GST_DEBUG_CATEGORY_INIT (smokedec_debug, "smokedec", 0, "Smoke decoder"); +} + +static void +gst_smokedec_init (GstSmokeDec * smokedec) +{ + GST_DEBUG_OBJECT (smokedec, "gst_smokedec_init: initializing"); + /* create the sink and src pads */ + + smokedec->sinkpad = + gst_pad_new_from_static_template (&gst_smokedec_sink_pad_template, + "sink"); + gst_pad_set_chain_function (smokedec->sinkpad, gst_smokedec_chain); + gst_element_add_pad (GST_ELEMENT (smokedec), smokedec->sinkpad); + + smokedec->srcpad = + gst_pad_new_from_static_template (&gst_smokedec_src_pad_template, "src"); + gst_pad_use_fixed_caps (smokedec->srcpad); + gst_element_add_pad (GST_ELEMENT (smokedec), smokedec->srcpad); + + smokecodec_decode_new (&smokedec->info); +} + +static void +gst_smokedec_finalize (GObject * object) +{ + GstSmokeDec *dec = GST_SMOKEDEC (object); + + smokecodec_info_free (dec->info); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstFlowReturn +gst_smokedec_chain (GstPad * pad, GstBuffer * buf) +{ + GstSmokeDec *smokedec; + guint8 *data, *outdata; + gulong size, outsize; + GstBuffer *outbuf; + SmokeCodecFlags flags; + GstClockTime time; + guint width, height; + guint fps_num, fps_denom; + gint smokeret; + GstFlowReturn ret; + + smokedec = GST_SMOKEDEC (gst_pad_get_parent (pad)); + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + time = GST_BUFFER_TIMESTAMP (buf); + + if (size < 1) + goto too_small; + + GST_LOG_OBJECT (smokedec, "got buffer of %lu bytes", size); + + /* have the ID packet. */ + if (data[0] == SMOKECODEC_TYPE_ID) { + smokeret = smokecodec_parse_id (smokedec->info, data, size); + if (smokeret != SMOKECODEC_OK) + goto header_error; + + ret = GST_FLOW_OK; + goto done; + } + + /* now handle data packets */ + GST_DEBUG_OBJECT (smokedec, "reading header %08lx", *(gulong *) data); + smokecodec_parse_header (smokedec->info, data, size, &flags, &width, &height, + &fps_num, &fps_denom); + + if (smokedec->height != height || smokedec->width != width || + smokedec->fps_num != fps_num || smokedec->fps_denom != fps_denom) { + GstCaps *caps; + + GST_DEBUG_OBJECT (smokedec, "parameter change: %dx%d @ %d/%dfps", + width, height, fps_num, fps_denom); + + smokedec->height = height; + smokedec->width = width; + + caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + "framerate", GST_TYPE_FRACTION, fps_num, fps_denom, NULL); + + gst_pad_set_caps (smokedec->srcpad, caps); + gst_caps_unref (caps); + } + + if (smokedec->need_keyframe) { + if (!(flags & SMOKECODEC_KEYFRAME)) + goto keyframe_skip; + + smokedec->need_keyframe = FALSE; + } + + outsize = width * height + width * height / 2; + outbuf = gst_buffer_new_and_alloc (outsize); + outdata = GST_BUFFER_DATA (outbuf); + + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale_int (GST_SECOND, fps_denom, fps_num); + GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buf); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokedec->srcpad)); + + if (time == GST_CLOCK_TIME_NONE) { + if (GST_BUFFER_OFFSET (buf) == -1) { + time = smokedec->next_time; + } else { + time = GST_BUFFER_OFFSET (buf) * GST_BUFFER_DURATION (outbuf); + } + } + GST_BUFFER_TIMESTAMP (outbuf) = time; + if (time != -1) + smokedec->next_time = time + GST_BUFFER_DURATION (outbuf); + else + smokedec->next_time = -1; + + smokeret = smokecodec_decode (smokedec->info, data, size, outdata); + if (smokeret != SMOKECODEC_OK) + goto decode_error; + + GST_DEBUG_OBJECT (smokedec, "gst_smokedec_chain: sending buffer"); + ret = gst_pad_push (smokedec->srcpad, outbuf); + +done: + gst_buffer_unref (buf); + gst_object_unref (smokedec); + + return ret; + + /* ERRORS */ +too_small: + { + GST_ELEMENT_ERROR (smokedec, STREAM, DECODE, + (NULL), ("Input buffer too small")); + ret = GST_FLOW_ERROR; + goto done; + } +header_error: + { + GST_ELEMENT_ERROR (smokedec, STREAM, DECODE, + (NULL), ("Could not parse smoke header, reason: %d", smokeret)); + ret = GST_FLOW_ERROR; + goto done; + } +keyframe_skip: + { + GST_DEBUG_OBJECT (smokedec, "dropping buffer while waiting for keyframe"); + ret = GST_FLOW_OK; + goto done; + } +decode_error: + { + GST_ELEMENT_ERROR (smokedec, STREAM, DECODE, + (NULL), ("Could not decode smoke frame, reason: %d", smokeret)); + ret = GST_FLOW_ERROR; + goto done; + } +} + +static GstStateChangeReturn +gst_smokedec_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstSmokeDec *dec; + + dec = GST_SMOKEDEC (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + /* reset the initial video state */ + dec->format = -1; + dec->width = -1; + dec->height = -1; + dec->fps_num = -1; + dec->fps_denom = -1; + dec->next_time = 0; + 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_PAUSED_TO_READY: + break; + default: + break; + } + + return ret; +} diff --git a/ext/jpeg/gstsmokedec.h b/ext/jpeg/gstsmokedec.h new file mode 100644 index 0000000..ffece2b --- /dev/null +++ b/ext/jpeg/gstsmokedec.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_SMOKEDEC_H__ +#define __GST_SMOKEDEC_H__ + + +#include +#include "smokecodec.h" + +G_BEGIN_DECLS + +#define GST_TYPE_SMOKEDEC \ + (gst_smokedec_get_type()) +#define GST_SMOKEDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMOKEDEC,GstSmokeDec)) +#define GST_SMOKEDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMOKEDEC,GstSmokeDecClass)) +#define GST_IS_SMOKEDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMOKEDEC)) +#define GST_IS_SMOKEDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMOKEDEC)) + +typedef struct _GstSmokeDec GstSmokeDec; +typedef struct _GstSmokeDecClass GstSmokeDecClass; + +struct _GstSmokeDec { + GstElement element; + + /* pads */ + GstPad *sinkpad,*srcpad; + + /* video state */ + gint format; + gint width; + gint height; + gint fps_num; + gint fps_denom; + GstClockTime next_time; + + SmokeCodecInfo *info; + + gint threshold; + gint quality; + gint smoothing; + + gboolean need_keyframe; +}; + +struct _GstSmokeDecClass { + GstElementClass parent_class; +}; + +GType gst_smokedec_get_type(void); + +G_END_DECLS + +#endif /* __GST_SMOKEDEC_H__ */ diff --git a/ext/jpeg/gstsmokeenc.c b/ext/jpeg/gstsmokeenc.c new file mode 100644 index 0000000..5bd4d99 --- /dev/null +++ b/ext/jpeg/gstsmokeenc.c @@ -0,0 +1,509 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-smokeenc + * + * Encodes images in smoke format. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include "gstsmokeenc.h" +#include + +GST_DEBUG_CATEGORY_STATIC (smokeenc_debug); +#define GST_CAT_DEFAULT smokeenc_debug + + +/* SmokeEnc signals and args */ +enum +{ + FRAME_ENCODED, + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_PROP_MIN_QUALITY 10 +#define DEFAULT_PROP_MAX_QUALITY 85 +#define DEFAULT_PROP_THRESHOLD 3000 +#define DEFAULT_PROP_KEYFRAME 20 + +enum +{ + PROP_0, + PROP_MIN_QUALITY, + PROP_MAX_QUALITY, + PROP_THRESHOLD, + PROP_KEYFRAME + /* FILL ME */ +}; + +static void gst_smokeenc_base_init (gpointer g_class); +static void gst_smokeenc_class_init (GstSmokeEnc * klass); +static void gst_smokeenc_init (GstSmokeEnc * smokeenc); +static void gst_smokeenc_finalize (GObject * object); + +static GstStateChangeReturn +gst_smokeenc_change_state (GstElement * element, GstStateChange transition); + +static GstFlowReturn gst_smokeenc_chain (GstPad * pad, GstBuffer * buf); +static GstCaps *gst_smokeenc_getcaps (GstPad * pad); +static gboolean gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps); + +static gboolean gst_smokeenc_resync (GstSmokeEnc * smokeenc); +static void gst_smokeenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_smokeenc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstElementClass *parent_class = NULL; + +GType +gst_smokeenc_get_type (void) +{ + static GType smokeenc_type = 0; + + if (!smokeenc_type) { + static const GTypeInfo smokeenc_info = { + sizeof (GstSmokeEncClass), + (GBaseInitFunc) gst_smokeenc_base_init, + NULL, + (GClassInitFunc) gst_smokeenc_class_init, + NULL, + NULL, + sizeof (GstSmokeEnc), + 0, + (GInstanceInitFunc) gst_smokeenc_init, + }; + + smokeenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSmokeEnc", &smokeenc_info, + 0); + } + return smokeenc_type; +} + +static GstStaticPadTemplate gst_smokeenc_sink_pad_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static GstStaticPadTemplate gst_smokeenc_src_pad_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-smoke, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0/1, MAX ]") + ); + +static void +gst_smokeenc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_smokeenc_sink_pad_template); + gst_element_class_add_static_pad_template (element_class, + &gst_smokeenc_src_pad_template); + gst_element_class_set_details_simple (element_class, "Smoke video encoder", + "Codec/Encoder/Video", + "Encode images into the Smoke format", "Wim Taymans "); +} + +static void +gst_smokeenc_class_init (GstSmokeEnc * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_smokeenc_finalize; + gobject_class->set_property = gst_smokeenc_set_property; + gobject_class->get_property = gst_smokeenc_get_property; + + g_object_class_install_property (gobject_class, PROP_MIN_QUALITY, + g_param_spec_int ("qmin", "Qmin", "Minimum quality", + 0, 100, DEFAULT_PROP_MIN_QUALITY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_MAX_QUALITY, + g_param_spec_int ("qmax", "Qmax", "Maximum quality", + 0, 100, DEFAULT_PROP_MAX_QUALITY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_THRESHOLD, + g_param_spec_int ("threshold", "Threshold", "Motion estimation threshold", + 0, 100000000, DEFAULT_PROP_THRESHOLD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_KEYFRAME, + g_param_spec_int ("keyframe", "Keyframe", + "Insert keyframe every N frames", 1, 100000, + DEFAULT_PROP_KEYFRAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_smokeenc_change_state); + + GST_DEBUG_CATEGORY_INIT (smokeenc_debug, "smokeenc", 0, + "Smoke encoding element"); +} + +static void +gst_smokeenc_init (GstSmokeEnc * smokeenc) +{ + /* create the sink and src pads */ + smokeenc->sinkpad = + gst_pad_new_from_static_template (&gst_smokeenc_sink_pad_template, + "sink"); + gst_pad_set_chain_function (smokeenc->sinkpad, gst_smokeenc_chain); + gst_pad_set_getcaps_function (smokeenc->sinkpad, gst_smokeenc_getcaps); + gst_pad_set_setcaps_function (smokeenc->sinkpad, gst_smokeenc_setcaps); + gst_element_add_pad (GST_ELEMENT (smokeenc), smokeenc->sinkpad); + + smokeenc->srcpad = + gst_pad_new_from_static_template (&gst_smokeenc_src_pad_template, "src"); + gst_pad_set_getcaps_function (smokeenc->srcpad, gst_smokeenc_getcaps); + gst_pad_use_fixed_caps (smokeenc->srcpad); + gst_element_add_pad (GST_ELEMENT (smokeenc), smokeenc->srcpad); + + smokeenc->min_quality = DEFAULT_PROP_MIN_QUALITY; + smokeenc->max_quality = DEFAULT_PROP_MAX_QUALITY; + smokeenc->threshold = DEFAULT_PROP_THRESHOLD; + smokeenc->keyframe = DEFAULT_PROP_KEYFRAME; +} + +static void +gst_smokeenc_finalize (GObject * object) +{ + GstSmokeEnc *enc = GST_SMOKEENC (object); + + if (enc->info) + smokecodec_info_free (enc->info); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstCaps * +gst_smokeenc_getcaps (GstPad * pad) +{ + GstSmokeEnc *smokeenc = GST_SMOKEENC (gst_pad_get_parent (pad)); + GstPad *otherpad; + GstCaps *result, *caps; + const GstCaps *tcaps; + const char *name; + int i; + GstStructure *structure = NULL; + + /* we want to proxy properties like width, height and framerate from the + other end of the element */ + otherpad = (pad == smokeenc->srcpad) ? smokeenc->sinkpad : smokeenc->srcpad; + + /* get template caps, we always need this to fiter the peer caps */ + tcaps = gst_pad_get_pad_template_caps (otherpad); + + /* get any constraints on the peer pad */ + caps = gst_pad_peer_get_caps (otherpad); + + if (caps == NULL) + caps = gst_caps_copy (tcaps); + else + caps = gst_caps_make_writable (caps); + + /* intersect with the template */ + result = gst_caps_intersect (caps, tcaps); + gst_caps_unref (caps); + + if (pad == smokeenc->srcpad) { + name = "video/x-smoke"; + } else { + name = "video/x-raw-yuv"; + } + + /* we can only copy width, height, framerate from one side to the other */ + for (i = 0; i < gst_caps_get_size (result); i++) { + structure = gst_caps_get_structure (result, i); + + gst_structure_set_name (structure, name); + gst_structure_remove_field (structure, "format"); + /* ... but for the sink pad, we only do I420 anyway, so add that */ + if (pad == smokeenc->sinkpad) { + gst_structure_set (structure, "format", GST_TYPE_FOURCC, + GST_STR_FOURCC ("I420"), NULL); + } + } + + gst_object_unref (smokeenc); + + return result; +} + +static gboolean +gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps) +{ + GstSmokeEnc *smokeenc; + GstStructure *structure; + const GValue *framerate; + gboolean ret; + GstCaps *srccaps; + + smokeenc = GST_SMOKEENC (gst_pad_get_parent (pad)); + + structure = gst_caps_get_structure (caps, 0); + framerate = gst_structure_get_value (structure, "framerate"); + if (framerate) { + smokeenc->fps_num = gst_value_get_fraction_numerator (framerate); + smokeenc->fps_denom = gst_value_get_fraction_denominator (framerate); + } else { + smokeenc->fps_num = 0; + smokeenc->fps_denom = 1; + } + + gst_structure_get_int (structure, "width", &smokeenc->width); + gst_structure_get_int (structure, "height", &smokeenc->height); + + if ((smokeenc->width & 0x0f) != 0 || (smokeenc->height & 0x0f) != 0) + goto width_or_height_notx16; + + if (!gst_smokeenc_resync (smokeenc)) + goto init_failed; + + srccaps = gst_caps_new_simple ("video/x-smoke", + "width", G_TYPE_INT, smokeenc->width, + "height", G_TYPE_INT, smokeenc->height, + "framerate", GST_TYPE_FRACTION, smokeenc->fps_num, smokeenc->fps_denom, + NULL); + + ret = gst_pad_set_caps (smokeenc->srcpad, srccaps); + gst_caps_unref (srccaps); + + gst_object_unref (smokeenc); + + return ret; + +width_or_height_notx16: + { + GST_WARNING_OBJECT (smokeenc, "width and height must be multiples of 16" + ", %dx%d not allowed", smokeenc->width, smokeenc->height); + gst_object_unref (smokeenc); + return FALSE; + } +init_failed: + { + GST_WARNING_OBJECT (smokeenc, "could not init decoder"); + gst_object_unref (smokeenc); + return FALSE; + } +} + +static gboolean +gst_smokeenc_resync (GstSmokeEnc * smokeenc) +{ + int ret; + + GST_DEBUG ("resync: %dx%d@%d/%dfps", smokeenc->width, smokeenc->height, + smokeenc->fps_num, smokeenc->fps_denom); + + if (smokeenc->info) + smokecodec_info_free (smokeenc->info); + + ret = smokecodec_encode_new (&smokeenc->info, smokeenc->width, + smokeenc->height, smokeenc->fps_num, smokeenc->fps_denom); + + if (ret != SMOKECODEC_OK) + goto init_failed; + + smokecodec_set_quality (smokeenc->info, smokeenc->min_quality, + smokeenc->max_quality); + + GST_DEBUG ("resync done"); + return TRUE; + + /* ERRORS */ +init_failed: + { + GST_WARNING_OBJECT (smokeenc, "smokecodec_encode_new() failed: %d", ret); + return FALSE; + } +} + +static GstFlowReturn +gst_smokeenc_chain (GstPad * pad, GstBuffer * buf) +{ + GstSmokeEnc *smokeenc; + guchar *data, *outdata; + gulong size; + gint outsize; + guint encsize; + GstBuffer *outbuf; + SmokeCodecFlags flags; + GstFlowReturn ret; + + smokeenc = GST_SMOKEENC (GST_OBJECT_PARENT (pad)); + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + GST_LOG_OBJECT (smokeenc, "got buffer of %lu bytes", size); + + if (smokeenc->need_header) { + outbuf = gst_buffer_new_and_alloc (256); + outdata = GST_BUFFER_DATA (outbuf); + + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); + GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); + + smokecodec_encode_id (smokeenc->info, outdata, &encsize); + + GST_BUFFER_SIZE (outbuf) = encsize; + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokeenc->srcpad)); + + ret = gst_pad_push (smokeenc->srcpad, outbuf); + if (ret != GST_FLOW_OK) + goto done; + + smokeenc->need_header = FALSE; + } + + encsize = outsize = smokeenc->width * smokeenc->height * 3; + outbuf = gst_buffer_new_and_alloc (outsize); + outdata = GST_BUFFER_DATA (outbuf); + + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale_int (GST_SECOND, smokeenc->fps_denom, + smokeenc->fps_num); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokeenc->srcpad)); + + flags = 0; + if ((smokeenc->frame % smokeenc->keyframe) == 0) { + flags |= SMOKECODEC_KEYFRAME; + } + smokecodec_set_quality (smokeenc->info, smokeenc->min_quality, + smokeenc->max_quality); + smokecodec_set_threshold (smokeenc->info, smokeenc->threshold); + smokecodec_encode (smokeenc->info, data, flags, outdata, &encsize); + gst_buffer_unref (buf); + + GST_BUFFER_SIZE (outbuf) = encsize; + GST_BUFFER_OFFSET (outbuf) = smokeenc->frame; + GST_BUFFER_OFFSET_END (outbuf) = smokeenc->frame + 1; + + ret = gst_pad_push (smokeenc->srcpad, outbuf); + + smokeenc->frame++; + +done: + + return ret; +} + +static void +gst_smokeenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSmokeEnc *smokeenc; + + g_return_if_fail (GST_IS_SMOKEENC (object)); + smokeenc = GST_SMOKEENC (object); + + switch (prop_id) { + case PROP_MIN_QUALITY: + smokeenc->min_quality = g_value_get_int (value); + break; + case PROP_MAX_QUALITY: + smokeenc->max_quality = g_value_get_int (value); + break; + case PROP_THRESHOLD: + smokeenc->threshold = g_value_get_int (value); + break; + case PROP_KEYFRAME: + smokeenc->keyframe = g_value_get_int (value); + break; + default: + break; + } +} + +static void +gst_smokeenc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstSmokeEnc *smokeenc; + + g_return_if_fail (GST_IS_SMOKEENC (object)); + smokeenc = GST_SMOKEENC (object); + + switch (prop_id) { + case PROP_MIN_QUALITY: + g_value_set_int (value, smokeenc->min_quality); + break; + case PROP_MAX_QUALITY: + g_value_set_int (value, smokeenc->max_quality); + break; + case PROP_THRESHOLD: + g_value_set_int (value, smokeenc->threshold); + break; + case PROP_KEYFRAME: + g_value_set_int (value, smokeenc->keyframe); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_smokeenc_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstSmokeEnc *enc; + + enc = GST_SMOKEENC (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + /* reset the initial video state */ + enc->width = 0; + enc->height = 0; + enc->frame = 0; + enc->need_header = TRUE; + 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_PAUSED_TO_READY: + break; + default: + break; + } + + return ret; +} diff --git a/ext/jpeg/gstsmokeenc.h b/ext/jpeg/gstsmokeenc.h new file mode 100644 index 0000000..08516ff --- /dev/null +++ b/ext/jpeg/gstsmokeenc.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_SMOKEENC_H__ +#define __GST_SMOKEENC_H__ + + +#include +#include "smokecodec.h" + +G_BEGIN_DECLS + +#define GST_TYPE_SMOKEENC \ + (gst_smokeenc_get_type()) +#define GST_SMOKEENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMOKEENC,GstSmokeEnc)) +#define GST_SMOKEENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMOKEENC,GstSmokeEncClass)) +#define GST_IS_SMOKEENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMOKEENC)) +#define GST_IS_SMOKEENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMOKEENC)) + +typedef struct _GstSmokeEnc GstSmokeEnc; +typedef struct _GstSmokeEncClass GstSmokeEncClass; + +struct _GstSmokeEnc { + GstElement element; + + /* pads */ + GstPad *sinkpad,*srcpad; + + /* video state */ + gint format; + gint width; + gint height; + gint frame; + gint keyframe; + gint fps_num, fps_denom; + + SmokeCodecInfo *info; + + gint threshold; + gint min_quality; + gint max_quality; + + gboolean need_header; +}; + +struct _GstSmokeEncClass { + GstElementClass parent_class; +}; + +GType gst_smokeenc_get_type(void); + +G_END_DECLS + +#endif /* __GST_SMOKEENC_H__ */ diff --git a/ext/jpeg/smokecodec.c b/ext/jpeg/smokecodec.c new file mode 100644 index 0000000..98adf60 --- /dev/null +++ b/ext/jpeg/smokecodec.c @@ -0,0 +1,709 @@ +/* Smoke codec + * Copyright (C) <2004> Wim Taymans + * + * 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 +#include +#include +#include + +/* this is a hack hack hack to get around jpeglib header bugs... */ +#ifdef HAVE_STDLIB_H +# undef HAVE_STDLIB_H +#endif +#include + +#include "smokecodec.h" +#include "smokeformat.h" + +#include + +struct _SmokeCodecInfo +{ + unsigned int width; + unsigned int height; + unsigned int fps_num; + unsigned int fps_denom; + + unsigned int minquality; + unsigned int maxquality; + unsigned int bitrate; + unsigned int threshold; + + unsigned int refdec; + + unsigned char **line[3]; + unsigned char *compbuf[3]; + + struct jpeg_error_mgr jerr; + + struct jpeg_compress_struct cinfo; + struct jpeg_destination_mgr jdest; + + struct jpeg_decompress_struct dinfo; + struct jpeg_source_mgr jsrc; + + int need_keyframe; + unsigned char *reference; +}; + +static void +smokecodec_init_destination (j_compress_ptr cinfo) +{ +} + +static boolean +smokecodec_flush_destination (j_compress_ptr cinfo) +{ + return 1; +} + +static void +smokecodec_term_destination (j_compress_ptr cinfo) +{ +} + +static void +smokecodec_init_source (j_decompress_ptr cinfo) +{ +} + +static boolean +smokecodec_fill_input_buffer (j_decompress_ptr cinfo) +{ + return 1; +} + +static void +smokecodec_skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ +} + +static boolean +smokecodec_resync_to_restart (j_decompress_ptr cinfo, int desired) +{ + return 1; +} + +static void +smokecodec_term_source (j_decompress_ptr cinfo) +{ +} + + +int +smokecodec_encode_new (SmokeCodecInfo ** info, + const unsigned int width, + const unsigned int height, + const unsigned int fps_num, const unsigned int fps_denom) +{ + SmokeCodecInfo *newinfo; + int i, j; + unsigned char *base[3]; + + if (!info) + return SMOKECODEC_NULLPTR; + if ((width & 0xf) || (height & 0xf)) + return SMOKECODEC_WRONGSIZE; + + newinfo = malloc (sizeof (SmokeCodecInfo)); + if (!newinfo) { + return SMOKECODEC_NOMEM; + } + newinfo->width = width; + newinfo->height = height; + newinfo->fps_num = fps_num; + newinfo->fps_denom = fps_denom; + + /* setup jpeglib */ + memset (&newinfo->cinfo, 0, sizeof (newinfo->cinfo)); + memset (&newinfo->jerr, 0, sizeof (newinfo->jerr)); + newinfo->cinfo.err = jpeg_std_error (&newinfo->jerr); + jpeg_create_compress (&newinfo->cinfo); + newinfo->cinfo.input_components = 3; + jpeg_set_defaults (&newinfo->cinfo); + + newinfo->cinfo.dct_method = JDCT_FASTEST; + + /* prepare for raw input */ +#if JPEG_LIB_VERSION >= 70 + newinfo->cinfo.do_fancy_downsampling = FALSE; +#endif + + newinfo->cinfo.raw_data_in = TRUE; + newinfo->cinfo.in_color_space = JCS_YCbCr; + newinfo->cinfo.comp_info[0].h_samp_factor = 2; + newinfo->cinfo.comp_info[0].v_samp_factor = 2; + newinfo->cinfo.comp_info[1].h_samp_factor = 1; + newinfo->cinfo.comp_info[1].v_samp_factor = 1; + newinfo->cinfo.comp_info[2].h_samp_factor = 1; + newinfo->cinfo.comp_info[2].v_samp_factor = 1; + + newinfo->line[0] = malloc (DCTSIZE * 2 * sizeof (char *)); + newinfo->line[1] = malloc (DCTSIZE * sizeof (char *)); + newinfo->line[2] = malloc (DCTSIZE * sizeof (char *)); + base[0] = newinfo->compbuf[0] = malloc (256 * 2 * DCTSIZE * 2 * DCTSIZE); + base[1] = newinfo->compbuf[1] = malloc (256 * DCTSIZE * DCTSIZE); + base[2] = newinfo->compbuf[2] = malloc (256 * DCTSIZE * DCTSIZE); + + for (i = 0, j = 0; i < 2 * DCTSIZE; i += 2, j++) { + newinfo->line[0][i] = base[0]; + base[0] += 2 * DCTSIZE * 256; + newinfo->line[0][i + 1] = base[0]; + base[0] += 2 * DCTSIZE * 256; + newinfo->line[1][j] = base[1]; + base[1] += DCTSIZE * 256; + newinfo->line[2][j] = base[2]; + base[2] += DCTSIZE * 256; + } + + newinfo->jdest.init_destination = smokecodec_init_destination; + newinfo->jdest.empty_output_buffer = smokecodec_flush_destination; + newinfo->jdest.term_destination = smokecodec_term_destination; + newinfo->cinfo.dest = &newinfo->jdest; + + jpeg_suppress_tables (&newinfo->cinfo, FALSE); + + memset (&newinfo->dinfo, 0, sizeof (newinfo->dinfo)); + newinfo->dinfo.err = jpeg_std_error (&newinfo->jerr); + jpeg_create_decompress (&newinfo->dinfo); + + newinfo->jsrc.init_source = smokecodec_init_source; + newinfo->jsrc.fill_input_buffer = smokecodec_fill_input_buffer; + newinfo->jsrc.skip_input_data = smokecodec_skip_input_data; + newinfo->jsrc.resync_to_restart = smokecodec_resync_to_restart; + newinfo->jsrc.term_source = smokecodec_term_source; + newinfo->dinfo.src = &newinfo->jsrc; + + newinfo->need_keyframe = 1; + newinfo->threshold = 4000; + newinfo->minquality = 10; + newinfo->maxquality = 85; + newinfo->reference = malloc (3 * (width * height) / 2); + newinfo->refdec = 0; + + *info = newinfo; + + return SMOKECODEC_OK; +} + +int +smokecodec_decode_new (SmokeCodecInfo ** info) +{ + return smokecodec_encode_new (info, 16, 16, 1, 1); +} + +int +smokecodec_info_free (SmokeCodecInfo * info) +{ + free (info->line[0]); + free (info->line[1]); + free (info->line[2]); + free (info->compbuf[0]); + free (info->compbuf[1]); + free (info->compbuf[2]); + free (info->reference); + jpeg_destroy_compress (&info->cinfo); + jpeg_destroy_decompress (&info->dinfo); + free (info); + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_set_quality (SmokeCodecInfo * info, + const unsigned int min, const unsigned int max) +{ + info->minquality = min; + info->maxquality = max; + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_get_quality (SmokeCodecInfo * info, + unsigned int *min, unsigned int *max) +{ + *min = info->minquality; + *max = info->maxquality; + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_set_threshold (SmokeCodecInfo * info, const unsigned int threshold) +{ + info->threshold = threshold; + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_get_threshold (SmokeCodecInfo * info, unsigned int *threshold) +{ + *threshold = info->threshold; + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_set_bitrate (SmokeCodecInfo * info, const unsigned int bitrate) +{ + info->bitrate = bitrate; + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_get_bitrate (SmokeCodecInfo * info, unsigned int *bitrate) +{ + *bitrate = info->bitrate; + + return SMOKECODEC_OK; +} + +static void +find_best_size (int blocks, unsigned int *width, unsigned int *height) +{ + int sqchng; + int w, h; + int best, bestw; + int free; + + sqchng = ceil (sqrt (blocks)); + w = sqchng; + h = sqchng; + + GST_DEBUG ("guess: %d %d", w, h); + + free = w * h - blocks; + best = free; + bestw = w; + + while (w < 256) { + GST_DEBUG ("current: %d %d", w, h); + if (free < best) { + best = free; + bestw = w; + if (free == 0) + break; + } + // if we cannot reduce the height, increase width + if (free < w) { + w++; + free += h; + } + // reduce height while possible + while (free >= w) { + h--; + free -= w; + } + } + *width = bestw; + *height = (blocks + best) / bestw; +} + +static int +abs_diff (const unsigned char *in1, const unsigned char *in2, const int stride) +{ + int s; + int i, j, diff; + + s = 0; + + for (i = 0; i < 2 * DCTSIZE; i++) { + for (j = 0; j < 2 * DCTSIZE; j++) { + diff = in1[j] - in2[j]; + s += diff * diff; + } + in1 += stride; + in2 += stride; + } + return s; +} + +static void +put (const unsigned char *src, unsigned char *dest, + int width, int height, int srcstride, int deststride) +{ + int i, j; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[j] = src[j]; + } + src += srcstride; + dest += deststride; + } +} + +/* encoding */ +SmokeCodecResult +smokecodec_encode_id (SmokeCodecInfo * info, + unsigned char *out, unsigned int *outsize) +{ + int i; + + *out++ = SMOKECODEC_TYPE_ID; + for (i = 0; i < strlen (SMOKECODEC_ID_STRING); i++) { + *out++ = SMOKECODEC_ID_STRING[i]; + } + *out++ = 0; + *out++ = 1; + *out++ = 0; + + *outsize = 9; + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_encode (SmokeCodecInfo * info, + const unsigned char *in, + SmokeCodecFlags flags, unsigned char *out, unsigned int *outsize) +{ + unsigned int i, j, s; + const unsigned char *ip; + unsigned char *op; + unsigned int blocks, encoding; + unsigned int size; + unsigned int width, height; + unsigned int blocks_w, blocks_h; + unsigned int threshold; + unsigned int max; + + if (info->need_keyframe) { + flags |= SMOKECODEC_KEYFRAME; + info->need_keyframe = 0; + } + + if (flags & SMOKECODEC_KEYFRAME) + threshold = 0; + else + threshold = info->threshold; + + ip = in; + op = info->reference; + + width = info->width; + height = info->height; + + blocks_w = width / (DCTSIZE * 2); + blocks_h = height / (DCTSIZE * 2); + + max = blocks_w * blocks_h; + + out[IDX_TYPE] = SMOKECODEC_TYPE_DATA; + +#define STORE16(var, pos, x) \ + var[pos] = (x >> 8); \ + var[pos+1] = (x & 0xff); +#define STORE32(var, pos, x) \ + var[pos] = ((x >> 24) & 0xff); \ + var[pos+1] = ((x >> 16) & 0xff); \ + var[pos+2] = ((x >> 8) & 0xff); \ + var[pos+3] = (x & 0xff); + + /* write dimension */ + STORE16 (out, IDX_WIDTH, width); + STORE16 (out, IDX_HEIGHT, height); + + /* write framerate */ + STORE32 (out, IDX_FPS_NUM, info->fps_num); + STORE32 (out, IDX_FPS_DENOM, info->fps_denom); + + if (!(flags & SMOKECODEC_KEYFRAME)) { + int block = 0; + + blocks = 0; + for (i = 0; i < height; i += 2 * DCTSIZE) { + for (j = 0; j < width; j += 2 * DCTSIZE) { + s = abs_diff (ip, op, width); + if (s >= threshold) { + STORE16 (out, blocks * 2 + IDX_BLOCKS, block); + blocks++; + } + + ip += 2 * DCTSIZE; + op += 2 * DCTSIZE; + block++; + } + ip += (2 * DCTSIZE - 1) * width; + op += (2 * DCTSIZE - 1) * width; + } + if (blocks == max) { + flags |= SMOKECODEC_KEYFRAME; + blocks = 0; + encoding = max; + } else { + encoding = blocks; + } + } else { + blocks = 0; + encoding = max; + } + STORE16 (out, IDX_NUM_BLOCKS, blocks); + out[IDX_FLAGS] = (flags & 0xff); + + GST_DEBUG ("blocks %d, encoding %d", blocks, encoding); + + info->jdest.next_output_byte = &out[blocks * 2 + OFFS_PICT]; + info->jdest.free_in_buffer = (*outsize) - OFFS_PICT; + + if (encoding > 0) { + int quality; + + if (!(flags & SMOKECODEC_KEYFRAME)) + find_best_size (encoding, &blocks_w, &blocks_h); + + GST_DEBUG ("best: %d %d", blocks_w, blocks_h); + + info->cinfo.image_width = blocks_w * DCTSIZE * 2; + info->cinfo.image_height = blocks_h * DCTSIZE * 2; + + if (flags & SMOKECODEC_KEYFRAME) { + quality = (info->maxquality * 60) / 100; + } else { + quality = + info->maxquality - ((info->maxquality - + info->minquality) * blocks) / max; + } + + GST_DEBUG ("set q %d %d %d", quality, encoding, max); + jpeg_set_quality (&info->cinfo, quality, TRUE); + GST_DEBUG ("start"); + jpeg_start_compress (&info->cinfo, TRUE); + + for (i = 0; i < encoding; i++) { + int pos; + int x, y; + + if (flags & SMOKECODEC_KEYFRAME) + pos = i; + else + pos = (out[i * 2 + IDX_BLOCKS] << 8) | (out[i * 2 + IDX_BLOCKS + 1]); + + x = pos % (width / (DCTSIZE * 2)); + y = pos / (width / (DCTSIZE * 2)); + + ip = in + (x * (DCTSIZE * 2)) + (y * (DCTSIZE * 2) * width); + op = info->compbuf[0] + (i % blocks_w) * (DCTSIZE * 2); + put (ip, op, 2 * DCTSIZE, 2 * DCTSIZE, width, 256 * (DCTSIZE * 2)); + + ip = in + width * height + (x * DCTSIZE) + (y * DCTSIZE * width / 2); + op = info->compbuf[1] + (i % blocks_w) * (DCTSIZE); + put (ip, op, DCTSIZE, DCTSIZE, width / 2, 256 * DCTSIZE); + + ip = in + 5 * (width * height) / 4 + (x * DCTSIZE) + + (y * DCTSIZE * width / 2); + op = info->compbuf[2] + (i % blocks_w) * (DCTSIZE); + put (ip, op, DCTSIZE, DCTSIZE, width / 2, 256 * DCTSIZE); + + if ((i % blocks_w) == (blocks_w - 1) || (i == encoding - 1)) { + GST_DEBUG ("write %d", pos); + jpeg_write_raw_data (&info->cinfo, info->line, 2 * DCTSIZE); + } + } + GST_DEBUG ("finish"); + jpeg_finish_compress (&info->cinfo); + } + + size = ((((*outsize) - OFFS_PICT - info->jdest.free_in_buffer) + 3) & ~3); + STORE16 (out, IDX_SIZE, size); + + *outsize = size + blocks * 2 + OFFS_PICT; + GST_DEBUG ("outsize %d", *outsize); + + // and decode in reference frame again + if (info->refdec) { + smokecodec_decode (info, out, *outsize, info->reference); + } else { + memcpy (info->reference, in, 3 * (width * height) / 2); + } + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_parse_id (SmokeCodecInfo * info, + const unsigned char *in, const unsigned int insize) +{ + int i; + + if (insize < 4 + strlen (SMOKECODEC_ID_STRING)) { + return SMOKECODEC_WRONGVERSION; + } + + if (*in++ != SMOKECODEC_TYPE_ID) + return SMOKECODEC_ERROR; + + for (i = 0; i < strlen (SMOKECODEC_ID_STRING); i++) { + if (*in++ != SMOKECODEC_ID_STRING[i]) + return SMOKECODEC_ERROR; + } + if (*in++ != 0 || *in++ != 1 || *in++ != 0) + return SMOKECODEC_ERROR; + + return SMOKECODEC_OK; +} + +#define READ16(var, pos, x) \ + x = var[pos]<<8 | var[pos+1]; + +#define READ32(var, pos, x) \ + x = var[pos]<<24 | var[pos+1]<<16 | \ + var[pos+2]<<8 | var[pos+3]; + +/* decoding */ +SmokeCodecResult +smokecodec_parse_header (SmokeCodecInfo * info, + const unsigned char *in, + const unsigned int insize, + SmokeCodecFlags * flags, + unsigned int *width, + unsigned int *height, unsigned int *fps_num, unsigned int *fps_denom) +{ + + READ16 (in, IDX_WIDTH, *width); + READ16 (in, IDX_HEIGHT, *height); + *flags = in[IDX_FLAGS]; + READ32 (in, IDX_FPS_NUM, *fps_num); + READ32 (in, IDX_FPS_DENOM, *fps_denom); + + if (info->width != *width || + info->height != *height || + info->fps_num != *fps_num || info->fps_denom != *fps_denom) { + GST_DEBUG ("new width: %d %d", *width, *height); + + info->reference = realloc (info->reference, 3 * ((*width) * (*height)) / 2); + info->width = *width; + info->height = *height; + info->fps_num = *fps_num; + info->fps_denom = *fps_denom; + } + + return SMOKECODEC_OK; +} + +SmokeCodecResult +smokecodec_decode (SmokeCodecInfo * info, + const unsigned char *in, const unsigned int insize, unsigned char *out) +{ + unsigned int width, height; + unsigned int fps_num, fps_denom; + SmokeCodecFlags flags; + int i, j; + int blocks_w, blocks_h; + int blockptr; + int blocks, decoding; + const unsigned char *ip; + unsigned char *op; + int res; + + smokecodec_parse_header (info, in, insize, &flags, &width, &height, + &fps_num, &fps_denom); + + READ16 (in, IDX_NUM_BLOCKS, blocks); + GST_DEBUG ("blocks %d", blocks); + + if (flags & SMOKECODEC_KEYFRAME) + decoding = width / (DCTSIZE * 2) * height / (DCTSIZE * 2); + else + decoding = blocks; + + if (decoding > 0) { + info->jsrc.next_input_byte = &in[blocks * 2 + OFFS_PICT]; + info->jsrc.bytes_in_buffer = insize - (blocks * 2 + OFFS_PICT); + + GST_DEBUG ("header %02x %d", in[blocks * 2 + OFFS_PICT], insize); + res = jpeg_read_header (&info->dinfo, TRUE); + GST_DEBUG ("header %d %d %d", res, info->dinfo.image_width, + info->dinfo.image_height); + + blocks_w = info->dinfo.image_width / (2 * DCTSIZE); + blocks_h = info->dinfo.image_height / (2 * DCTSIZE); + + info->dinfo.output_width = info->dinfo.image_width; + info->dinfo.output_height = info->dinfo.image_height; + + GST_DEBUG ("start"); + info->dinfo.do_fancy_upsampling = FALSE; + info->dinfo.do_block_smoothing = FALSE; + info->dinfo.out_color_space = JCS_YCbCr; + info->dinfo.dct_method = JDCT_IFAST; + info->dinfo.raw_data_out = TRUE; + jpeg_start_decompress (&info->dinfo); + + blockptr = 0; + + for (i = 0; i < blocks_h; i++) { + GST_DEBUG ("read"); + jpeg_read_raw_data (&info->dinfo, info->line, 2 * DCTSIZE); + + GST_DEBUG ("copy %d", blocks_w); + for (j = 0; j < blocks_w; j++) { + int pos; + int x, y; + + if (flags & SMOKECODEC_KEYFRAME) + pos = blockptr; + else + READ16 (in, blockptr * 2 + IDX_BLOCKS, pos); + + x = pos % (width / (DCTSIZE * 2)); + y = pos / (width / (DCTSIZE * 2)); + + GST_DEBUG ("block %d %d %d", pos, x, y); + + ip = info->compbuf[0] + j * (DCTSIZE * 2); + op = info->reference + (x * (DCTSIZE * 2)) + + (y * (DCTSIZE * 2) * width); + put (ip, op, 2 * DCTSIZE, 2 * DCTSIZE, 256 * (DCTSIZE * 2), width); + + ip = info->compbuf[1] + j * (DCTSIZE); + op = info->reference + width * height + (x * DCTSIZE) + + (y * DCTSIZE * width / 2); + put (ip, op, DCTSIZE, DCTSIZE, 256 * DCTSIZE, width / 2); + + ip = info->compbuf[2] + j * (DCTSIZE); + op = info->reference + 5 * (width * height) / 4 + (x * DCTSIZE) + + (y * DCTSIZE * width / 2); + put (ip, op, DCTSIZE, DCTSIZE, 256 * DCTSIZE, width / 2); + + GST_DEBUG ("block done %d %d %d", pos, x, y); + blockptr++; + if (blockptr >= decoding) + break; + } + } + GST_DEBUG ("finish"); + jpeg_finish_decompress (&info->dinfo); + } + + GST_DEBUG ("copy"); + if (out != info->reference) + memcpy (out, info->reference, 3 * (width * height) / 2); + GST_DEBUG ("copy done"); + + return SMOKECODEC_OK; +} diff --git a/ext/jpeg/smokecodec.h b/ext/jpeg/smokecodec.h new file mode 100644 index 0000000..a44d9bb --- /dev/null +++ b/ext/jpeg/smokecodec.h @@ -0,0 +1,119 @@ +/* Smoke Codec + * Copyright (C) <2004> Wim Taymans + * + * 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 __SMOKECODEC_H__ +#define __SMOKECODEC_H__ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +typedef struct _SmokeCodecInfo SmokeCodecInfo; + +typedef enum { + SMOKECODEC_WRONGVERSION = -5, + SMOKECODEC_WRONGSIZE = -4, + SMOKECODEC_ERROR = -3, + SMOKECODEC_NOMEM = -2, + SMOKECODEC_NULLPTR = -1, + SMOKECODEC_OK = 0 +} SmokeCodecResult; + +typedef enum { + SMOKECODEC_KEYFRAME = (1<<0), + SMOKECODEC_MOTION_VECTORS = (1<<1) +} SmokeCodecFlags; + +#define SMOKECODEC_ID_STRING "smoke" + +typedef enum { + SMOKECODEC_TYPE_ID = 0x80, + SMOKECODEC_TYPE_COMMENT = 0x81, + SMOKECODEC_TYPE_EXTRA = 0x83, + SMOKECODEC_TYPE_DATA = 0x40 +} SmokePacketType; + +/* init */ +int smokecodec_encode_new (SmokeCodecInfo **info, + const unsigned int width, + const unsigned int height, + const unsigned int fps_num, + const unsigned int fps_denom); + +int smokecodec_decode_new (SmokeCodecInfo **info); + +int smokecodec_info_free (SmokeCodecInfo * info); + +/* config */ +SmokeCodecResult smokecodec_set_quality (SmokeCodecInfo *info, + const unsigned int min, + const unsigned int max); +SmokeCodecResult smokecodec_get_quality (SmokeCodecInfo *info, + unsigned int *min, + unsigned int *max); + +SmokeCodecResult smokecodec_set_threshold (SmokeCodecInfo *info, + const unsigned int threshold); +SmokeCodecResult smokecodec_get_threshold (SmokeCodecInfo *info, + unsigned int *threshold); + +SmokeCodecResult smokecodec_set_bitrate (SmokeCodecInfo *info, + const unsigned int bitrate); +SmokeCodecResult smokecodec_get_bitrate (SmokeCodecInfo *info, + unsigned int *bitrate); + +/* encoding */ +SmokeCodecResult smokecodec_encode_id (SmokeCodecInfo *info, + unsigned char *out, + unsigned int *outsize); + +SmokeCodecResult smokecodec_encode (SmokeCodecInfo *info, + const unsigned char *in, + SmokeCodecFlags flags, + unsigned char *out, + unsigned int *outsize); + +/* decoding */ +SmokeCodecResult smokecodec_parse_id (SmokeCodecInfo *info, + const unsigned char *in, + const unsigned int insize); + +SmokeCodecResult smokecodec_parse_header (SmokeCodecInfo *info, + const unsigned char *in, + const unsigned int insize, + SmokeCodecFlags *flags, + unsigned int *width, + unsigned int *height, + unsigned int *fps_num, + unsigned int *fps_denom); + +SmokeCodecResult smokecodec_decode (SmokeCodecInfo *info, + const unsigned char *in, + const unsigned int insize, + unsigned char *out); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __SMOKECODEC_H__ */ diff --git a/ext/jpeg/smokeformat.h b/ext/jpeg/smokeformat.h new file mode 100644 index 0000000..1511934 --- /dev/null +++ b/ext/jpeg/smokeformat.h @@ -0,0 +1,46 @@ +/* Smoke Codec + * Copyright (C) <2004> Wim Taymans + * + * 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 __SMOKEFORMAT_H__ +#define __SMOKEFORMAT_H__ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define IDX_TYPE 0 +#define IDX_WIDTH 1 +#define IDX_HEIGHT 3 +#define IDX_FPS_NUM 5 +#define IDX_FPS_DENOM 9 +#define IDX_FLAGS 13 +#define IDX_NUM_BLOCKS 14 +#define IDX_SIZE 16 +#define IDX_BLOCKS 18 +#define OFFS_PICT 18 + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __SMOKEFORMAT_H__ */ diff --git a/ext/libcaca/Makefile.am b/ext/libcaca/Makefile.am new file mode 100644 index 0000000..e44c048 --- /dev/null +++ b/ext/libcaca/Makefile.am @@ -0,0 +1,16 @@ +plugin_LTLIBRARIES = libgstcacasink.la + +libgstcacasink_la_SOURCES = gstcacasink.c +libgstcacasink_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(LIBCACA_CFLAGS) +libgstcacasink_la_LIBADD = \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(LIBCACA_LIBS) +libgstcacasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstcacasink_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstcacasink.h diff --git a/ext/libcaca/Makefile.in b/ext/libcaca/Makefile.in new file mode 100644 index 0000000..d12e274 --- /dev/null +++ b/ext/libcaca/Makefile.in @@ -0,0 +1,814 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/libcaca +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstcacasink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstcacasink_la_OBJECTS = libgstcacasink_la-gstcacasink.lo +libgstcacasink_la_OBJECTS = $(am_libgstcacasink_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstcacasink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstcacasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstcacasink_la_CFLAGS) $(CFLAGS) \ + $(libgstcacasink_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstcacasink_la_SOURCES) +DIST_SOURCES = $(libgstcacasink_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstcacasink.la +libgstcacasink_la_SOURCES = gstcacasink.c +libgstcacasink_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(LIBCACA_CFLAGS) + +libgstcacasink_la_LIBADD = \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(LIBCACA_LIBS) + +libgstcacasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstcacasink_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstcacasink.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/libcaca/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/libcaca/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstcacasink.la: $(libgstcacasink_la_OBJECTS) $(libgstcacasink_la_DEPENDENCIES) $(EXTRA_libgstcacasink_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstcacasink_la_LINK) -rpath $(plugindir) $(libgstcacasink_la_OBJECTS) $(libgstcacasink_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcacasink_la-gstcacasink.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstcacasink_la-gstcacasink.lo: gstcacasink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcacasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcacasink_la_CFLAGS) $(CFLAGS) -MT libgstcacasink_la-gstcacasink.lo -MD -MP -MF $(DEPDIR)/libgstcacasink_la-gstcacasink.Tpo -c -o libgstcacasink_la-gstcacasink.lo `test -f 'gstcacasink.c' || echo '$(srcdir)/'`gstcacasink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcacasink_la-gstcacasink.Tpo $(DEPDIR)/libgstcacasink_la-gstcacasink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcacasink.c' object='libgstcacasink_la-gstcacasink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcacasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcacasink_la_CFLAGS) $(CFLAGS) -c -o libgstcacasink_la-gstcacasink.lo `test -f 'gstcacasink.c' || echo '$(srcdir)/'`gstcacasink.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/libcaca/gstcacasink.c b/ext/libcaca/gstcacasink.c new file mode 100644 index 0000000..5c3a589 --- /dev/null +++ b/ext/libcaca/gstcacasink.c @@ -0,0 +1,426 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-cacasink + * @see_also: #GstAASink + * + * Displays video as color ascii art. + * + * + * Example launch line + * |[ + * CACA_GEOMETRY=160x60 CACA_FONT=5x7 gst-launch filesrc location=test.avi ! decodebin ! ffmpegcolorspace ! cacasink + * ]| This pipeline renders a video to ascii art into a separate window using a + * small font and specifying the ascii resolution. + * |[ + * CACA_DRIVER=ncurses gst-launch filesrc location=test.avi ! decodebin ! ffmpegcolorspace ! cacasink + * ]| This pipeline renders a video to ascii art into the current terminal. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstcacasink.h" + +#define GST_CACA_DEFAULT_SCREEN_WIDTH 80 +#define GST_CACA_DEFAULT_SCREEN_HEIGHT 25 +#define GST_CACA_DEFAULT_BPP 24 +#define GST_CACA_DEFAULT_RED_MASK GST_VIDEO_BYTE1_MASK_32_INT +#define GST_CACA_DEFAULT_GREEN_MASK GST_VIDEO_BYTE2_MASK_32_INT +#define GST_CACA_DEFAULT_BLUE_MASK GST_VIDEO_BYTE3_MASK_32_INT + +//#define GST_CACA_DEFAULT_RED_MASK R_MASK_32_REVERSE_INT +//#define GST_CACA_DEFAULT_GREEN_MASK G_MASK_32_REVERSE_INT +//#define GST_CACA_DEFAULT_BLUE_MASK B_MASK_32_REVERSE_INT + +/* cacasink signals and args */ +enum +{ + LAST_SIGNAL +}; + + +enum +{ + ARG_0, + ARG_SCREEN_WIDTH, + ARG_SCREEN_HEIGHT, + ARG_DITHER, + ARG_ANTIALIASING +}; + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_RGB_16 ";" GST_VIDEO_CAPS_RGB_15) + ); + +static void gst_cacasink_base_init (gpointer g_class); +static void gst_cacasink_class_init (GstCACASinkClass * klass); +static void gst_cacasink_init (GstCACASink * cacasink); + +static gboolean gst_cacasink_setcaps (GstBaseSink * pad, GstCaps * caps); +static void gst_cacasink_get_times (GstBaseSink * sink, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end); +static GstFlowReturn gst_cacasink_render (GstBaseSink * basesink, + GstBuffer * buffer); + +static void gst_cacasink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_cacasink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstStateChangeReturn gst_cacasink_change_state (GstElement * element, + GstStateChange transition); + +static GstElementClass *parent_class = NULL; + +GType +gst_cacasink_get_type (void) +{ + static GType cacasink_type = 0; + + if (!cacasink_type) { + static const GTypeInfo cacasink_info = { + sizeof (GstCACASinkClass), + gst_cacasink_base_init, + NULL, + (GClassInitFunc) gst_cacasink_class_init, + NULL, + NULL, + sizeof (GstCACASink), + 0, + (GInstanceInitFunc) gst_cacasink_init, + }; + + cacasink_type = + g_type_register_static (GST_TYPE_BASE_SINK, "GstCACASink", + &cacasink_info, 0); + } + return cacasink_type; +} + +#define GST_TYPE_CACADITHER (gst_cacasink_dither_get_type()) +static GType +gst_cacasink_dither_get_type (void) +{ + static GType dither_type = 0; + + static const GEnumValue dither_types[] = { + {CACA_DITHERING_NONE, "No dithering", "none"}, + {CACA_DITHERING_ORDERED2, "Ordered 2x2 Bayer dithering", "2x2"}, + {CACA_DITHERING_ORDERED4, "Ordered 4x4 Bayer dithering", "4x4"}, + {CACA_DITHERING_ORDERED8, "Ordered 8x8 Bayer dithering", "8x8"}, + {CACA_DITHERING_RANDOM, "Random dithering", "random"}, + {0, NULL, NULL}, + }; + + if (!dither_type) { + dither_type = g_enum_register_static ("GstCACASinkDithering", dither_types); + } + return dither_type; +} + +static void +gst_cacasink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "A colored ASCII art video sink", "Sink/Video", + "A colored ASCII art videosink", "Zeeshan Ali "); + gst_element_class_add_static_pad_template (element_class, + &sink_template); +} + +static void +gst_cacasink_class_init (GstCACASinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_cacasink_set_property; + gobject_class->get_property = gst_cacasink_get_property; + gstelement_class->change_state = gst_cacasink_change_state; + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SCREEN_WIDTH, + g_param_spec_int ("screen-width", "Screen Width", + "The width of the screen", 0, G_MAXINT, GST_CACA_DEFAULT_SCREEN_WIDTH, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SCREEN_HEIGHT, + g_param_spec_int ("screen-height", "Screen Height", + "The height of the screen", 0, G_MAXINT, + GST_CACA_DEFAULT_SCREEN_HEIGHT, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DITHER, + g_param_spec_enum ("dither", "Dither Type", "Set type of Dither", + GST_TYPE_CACADITHER, CACA_DITHERING_NONE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ANTIALIASING, + g_param_spec_boolean ("anti-aliasing", "Anti Aliasing", + "Enables Anti-Aliasing", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_cacasink_setcaps); + gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_cacasink_get_times); + gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_cacasink_render); + gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_cacasink_render); +} + +static void +gst_cacasink_get_times (GstBaseSink * sink, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end) +{ + *start = GST_BUFFER_TIMESTAMP (buffer); + *end = *start + GST_BUFFER_DURATION (buffer); +} + +static gboolean +gst_cacasink_setcaps (GstBaseSink * basesink, GstCaps * caps) +{ + GstCACASink *cacasink; + GstStructure *structure; + gint endianness; + + cacasink = GST_CACASINK (basesink); + + structure = gst_caps_get_structure (caps, 0); + gst_structure_get_int (structure, "width", &(cacasink->width)); + gst_structure_get_int (structure, "height", &(cacasink->height)); + gst_structure_get_int (structure, "endianness", &endianness); + gst_structure_get_int (structure, "bpp", (int *) &cacasink->bpp); + gst_structure_get_int (structure, "red_mask", (int *) &cacasink->red_mask); + gst_structure_get_int (structure, "green_mask", + (int *) &cacasink->green_mask); + gst_structure_get_int (structure, "blue_mask", (int *) &cacasink->blue_mask); + + if (cacasink->bpp == 24) { + cacasink->red_mask = GUINT32_FROM_BE (cacasink->red_mask) >> 8; + cacasink->green_mask = GUINT32_FROM_BE (cacasink->green_mask) >> 8; + cacasink->blue_mask = GUINT32_FROM_BE (cacasink->blue_mask) >> 8; + } + + else if (cacasink->bpp == 32) { + cacasink->red_mask = GUINT32_FROM_BE (cacasink->red_mask); + cacasink->green_mask = GUINT32_FROM_BE (cacasink->green_mask); + cacasink->blue_mask = GUINT32_FROM_BE (cacasink->blue_mask); + } + + else if (cacasink->bpp == 16) { + if (endianness == G_BIG_ENDIAN) { + cacasink->red_mask = GUINT16_FROM_BE (cacasink->red_mask); + cacasink->green_mask = GUINT16_FROM_BE (cacasink->green_mask); + cacasink->blue_mask = GUINT16_FROM_BE (cacasink->blue_mask); + } else { + cacasink->red_mask = GUINT16_FROM_LE (cacasink->red_mask); + cacasink->green_mask = GUINT16_FROM_LE (cacasink->green_mask); + cacasink->blue_mask = GUINT16_FROM_LE (cacasink->blue_mask); + } + } + + if (cacasink->bitmap) { + caca_free_bitmap (cacasink->bitmap); + } + + cacasink->bitmap = caca_create_bitmap (cacasink->bpp, + cacasink->width, + cacasink->height, + GST_ROUND_UP_4 (cacasink->width * cacasink->bpp / 8), + cacasink->red_mask, cacasink->green_mask, cacasink->blue_mask, 0); + + if (!cacasink->bitmap) { + return FALSE; + } + + return TRUE; +} + +static void +gst_cacasink_init (GstCACASink * cacasink) +{ + cacasink->screen_width = GST_CACA_DEFAULT_SCREEN_WIDTH; + cacasink->screen_height = GST_CACA_DEFAULT_SCREEN_HEIGHT; + cacasink->bpp = GST_CACA_DEFAULT_BPP; + cacasink->red_mask = GST_CACA_DEFAULT_RED_MASK; + cacasink->green_mask = GST_CACA_DEFAULT_GREEN_MASK; + cacasink->blue_mask = GST_CACA_DEFAULT_BLUE_MASK; +} + +static GstFlowReturn +gst_cacasink_render (GstBaseSink * basesink, GstBuffer * buffer) +{ + GstCACASink *cacasink = GST_CACASINK (basesink); + + GST_DEBUG ("render"); + + caca_clear (); + caca_draw_bitmap (0, 0, cacasink->screen_width - 1, + cacasink->screen_height - 1, cacasink->bitmap, GST_BUFFER_DATA (buffer)); + caca_refresh (); + + return GST_FLOW_OK; +} + +static void +gst_cacasink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstCACASink *cacasink; + + g_return_if_fail (GST_IS_CACASINK (object)); + + cacasink = GST_CACASINK (object); + + switch (prop_id) { + case ARG_DITHER:{ + cacasink->dither = g_value_get_enum (value); + caca_set_dithering (cacasink->dither + CACA_DITHERING_NONE); + break; + } + case ARG_ANTIALIASING:{ + cacasink->antialiasing = g_value_get_boolean (value); + if (cacasink->antialiasing) { + caca_set_feature (CACA_ANTIALIASING_MAX); + } else { + caca_set_feature (CACA_ANTIALIASING_MIN); + } + break; + } + default: + break; + } +} + +static void +gst_cacasink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstCACASink *cacasink; + + cacasink = GST_CACASINK (object); + + switch (prop_id) { + case ARG_SCREEN_WIDTH:{ + g_value_set_int (value, cacasink->screen_width); + break; + } + case ARG_SCREEN_HEIGHT:{ + g_value_set_int (value, cacasink->screen_height); + break; + } + case ARG_DITHER:{ + g_value_set_enum (value, cacasink->dither); + break; + } + case ARG_ANTIALIASING:{ + g_value_set_boolean (value, cacasink->antialiasing); + break; + } + default:{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } +} + +static gboolean +gst_cacasink_open (GstCACASink * cacasink) +{ + cacasink->bitmap = NULL; + + if (caca_init () < 0) { + GST_ELEMENT_ERROR (cacasink, RESOURCE, OPEN_WRITE, (NULL), + ("caca_init() failed")); + return FALSE; + } + + cacasink->screen_width = caca_get_width (); + cacasink->screen_height = caca_get_height (); + cacasink->antialiasing = TRUE; + caca_set_feature (CACA_ANTIALIASING_MAX); + cacasink->dither = 0; + caca_set_dithering (CACA_DITHERING_NONE); + + return TRUE; +} + +static void +gst_cacasink_close (GstCACASink * cacasink) +{ + if (cacasink->bitmap) { + caca_free_bitmap (cacasink->bitmap); + cacasink->bitmap = NULL; + } + caca_end (); +} + +static GstStateChangeReturn +gst_cacasink_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + if (!gst_cacasink_open (GST_CACASINK (element))) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_cacasink_close (GST_CACASINK (element)); + break; + default: + break; + } + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "cacasink", GST_RANK_NONE, + GST_TYPE_CACASINK)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "cacasink", + "Colored ASCII Art video sink", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/libcaca/gstcacasink.h b/ext/libcaca/gstcacasink.h new file mode 100644 index 0000000..580567a --- /dev/null +++ b/ext/libcaca/gstcacasink.h @@ -0,0 +1,72 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_CACASINK_H__ +#define __GST_CACASINK_H__ + +#include +#include +#include + +#include +#ifdef CACA_API_VERSION_1 +# include +#endif + +G_BEGIN_DECLS + +#define GST_TYPE_CACASINK \ + (gst_cacasink_get_type()) +#define GST_CACASINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CACASINK,GstCACASink)) +#define GST_CACASINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CACASINK,GstCACASinkClass)) +#define GST_IS_CACASINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CACASINK)) +#define GST_IS_CACASINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CACASINK)) + +typedef struct _GstCACASink GstCACASink; +typedef struct _GstCACASinkClass GstCACASinkClass; + +struct _GstCACASink { + GstBaseSink parent; + + gint width, height; + gint screen_width, screen_height; + guint bpp; + guint dither; + gboolean antialiasing; + guint red_mask, green_mask, blue_mask; + + struct caca_bitmap *bitmap; +}; + +struct _GstCACASinkClass { + GstBaseSinkClass parent_class; + + /* signals */ +}; + +GType gst_cacasink_get_type(void); + +G_END_DECLS + +#endif /* __GST_CACASINK_H__ */ diff --git a/ext/libpng/Makefile.am b/ext/libpng/Makefile.am new file mode 100644 index 0000000..bce5b1a --- /dev/null +++ b/ext/libpng/Makefile.am @@ -0,0 +1,10 @@ +plugin_LTLIBRARIES = libgstpng.la + +libgstpng_la_SOURCES = gstpng.c gstpngenc.c gstpngdec.c +libgstpng_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(LIBPNG_CFLAGS) +libgstpng_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ + $(GST_LIBS) $(LIBPNG_LIBS) +libgstpng_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstpng_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstpngdec.h gstpngenc.h diff --git a/ext/libpng/Makefile.in b/ext/libpng/Makefile.in new file mode 100644 index 0000000..960a341 --- /dev/null +++ b/ext/libpng/Makefile.in @@ -0,0 +1,824 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/libpng +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstpng_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstpng_la_OBJECTS = libgstpng_la-gstpng.lo \ + libgstpng_la-gstpngenc.lo libgstpng_la-gstpngdec.lo +libgstpng_la_OBJECTS = $(am_libgstpng_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstpng_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstpng_la_CFLAGS) $(CFLAGS) \ + $(libgstpng_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstpng_la_SOURCES) +DIST_SOURCES = $(libgstpng_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstpng.la +libgstpng_la_SOURCES = gstpng.c gstpngenc.c gstpngdec.c +libgstpng_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(LIBPNG_CFLAGS) +libgstpng_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ + $(GST_LIBS) $(LIBPNG_LIBS) + +libgstpng_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstpng_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstpngdec.h gstpngenc.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/libpng/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/libpng/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstpng.la: $(libgstpng_la_OBJECTS) $(libgstpng_la_DEPENDENCIES) $(EXTRA_libgstpng_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstpng_la_LINK) -rpath $(plugindir) $(libgstpng_la_OBJECTS) $(libgstpng_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpng_la-gstpng.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpng_la-gstpngdec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpng_la-gstpngenc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstpng_la-gstpng.lo: gstpng.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -MT libgstpng_la-gstpng.lo -MD -MP -MF $(DEPDIR)/libgstpng_la-gstpng.Tpo -c -o libgstpng_la-gstpng.lo `test -f 'gstpng.c' || echo '$(srcdir)/'`gstpng.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpng_la-gstpng.Tpo $(DEPDIR)/libgstpng_la-gstpng.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstpng.c' object='libgstpng_la-gstpng.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -c -o libgstpng_la-gstpng.lo `test -f 'gstpng.c' || echo '$(srcdir)/'`gstpng.c + +libgstpng_la-gstpngenc.lo: gstpngenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -MT libgstpng_la-gstpngenc.lo -MD -MP -MF $(DEPDIR)/libgstpng_la-gstpngenc.Tpo -c -o libgstpng_la-gstpngenc.lo `test -f 'gstpngenc.c' || echo '$(srcdir)/'`gstpngenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpng_la-gstpngenc.Tpo $(DEPDIR)/libgstpng_la-gstpngenc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstpngenc.c' object='libgstpng_la-gstpngenc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -c -o libgstpng_la-gstpngenc.lo `test -f 'gstpngenc.c' || echo '$(srcdir)/'`gstpngenc.c + +libgstpng_la-gstpngdec.lo: gstpngdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -MT libgstpng_la-gstpngdec.lo -MD -MP -MF $(DEPDIR)/libgstpng_la-gstpngdec.Tpo -c -o libgstpng_la-gstpngdec.lo `test -f 'gstpngdec.c' || echo '$(srcdir)/'`gstpngdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpng_la-gstpngdec.Tpo $(DEPDIR)/libgstpng_la-gstpngdec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstpngdec.c' object='libgstpng_la-gstpngdec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -c -o libgstpng_la-gstpngdec.lo `test -f 'gstpngdec.c' || echo '$(srcdir)/'`gstpngdec.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/libpng/gstpng.c b/ext/libpng/gstpng.c new file mode 100644 index 0000000..6a91915 --- /dev/null +++ b/ext/libpng/gstpng.c @@ -0,0 +1,47 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * Filter: + * Copyright (C) 2000 Donald A. Graft + * + * 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 +#endif + +#include +#include + +#include "gstpngdec.h" +#include "gstpngenc.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "pngdec", GST_RANK_PRIMARY, + GST_TYPE_PNGDEC)) + return FALSE; + + if (!gst_element_register (plugin, "pngenc", GST_RANK_PRIMARY, + GST_TYPE_PNGENC)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "png", + "PNG plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN) diff --git a/ext/libpng/gstpngdec.c b/ext/libpng/gstpngdec.c new file mode 100644 index 0000000..4a2b547 --- /dev/null +++ b/ext/libpng/gstpngdec.c @@ -0,0 +1,898 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-pngdec + * + * Decodes png images. If there is no framerate set on sink caps, it sends EOS + * after the first picture. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstpngdec.h" + +#include +#include +#include +#include + +GST_DEBUG_CATEGORY_STATIC (pngdec_debug); +#define GST_CAT_DEFAULT pngdec_debug + +static void gst_pngdec_base_init (gpointer g_class); +static void gst_pngdec_class_init (GstPngDecClass * klass); +static void gst_pngdec_init (GstPngDec * pngdec); + +static gboolean gst_pngdec_libpng_init (GstPngDec * pngdec); +static gboolean gst_pngdec_libpng_clear (GstPngDec * pngdec); + +static GstStateChangeReturn gst_pngdec_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_pngdec_sink_activate_push (GstPad * sinkpad, + gboolean active); +static gboolean gst_pngdec_sink_activate_pull (GstPad * sinkpad, + gboolean active); +static gboolean gst_pngdec_sink_activate (GstPad * sinkpad); + +static GstFlowReturn gst_pngdec_caps_create_and_set (GstPngDec * pngdec); + +static void gst_pngdec_task (GstPad * pad); +static GstFlowReturn gst_pngdec_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_pngdec_sink_event (GstPad * pad, GstEvent * event); +static gboolean gst_pngdec_sink_setcaps (GstPad * pad, GstCaps * caps); + +static GstElementClass *parent_class = NULL; + +GType +gst_pngdec_get_type (void) +{ + static GType pngdec_type = 0; + + if (!pngdec_type) { + static const GTypeInfo pngdec_info = { + sizeof (GstPngDecClass), + gst_pngdec_base_init, + NULL, + (GClassInitFunc) gst_pngdec_class_init, + NULL, + NULL, + sizeof (GstPngDec), + 0, + (GInstanceInitFunc) gst_pngdec_init, + }; + + pngdec_type = g_type_register_static (GST_TYPE_ELEMENT, "GstPngDec", + &pngdec_info, 0); + } + return pngdec_type; +} + +static GstStaticPadTemplate gst_pngdec_src_pad_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB ";" + GST_VIDEO_CAPS_ARGB_64) + ); + +static GstStaticPadTemplate gst_pngdec_sink_pad_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/png") + ); + +static void +gst_pngdec_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_pngdec_src_pad_template); + gst_element_class_add_static_pad_template (element_class, + &gst_pngdec_sink_pad_template); + gst_element_class_set_details_simple (element_class, "PNG image decoder", + "Codec/Decoder/Image", + "Decode a png video frame to a raw image", + "Wim Taymans "); +} + +static void +gst_pngdec_class_init (GstPngDecClass * klass) +{ + GstElementClass *gstelement_class; + + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gstelement_class->change_state = gst_pngdec_change_state; + + GST_DEBUG_CATEGORY_INIT (pngdec_debug, "pngdec", 0, "PNG image decoder"); +} + +static void +gst_pngdec_init (GstPngDec * pngdec) +{ + pngdec->sinkpad = + gst_pad_new_from_static_template (&gst_pngdec_sink_pad_template, "sink"); + gst_pad_set_activate_function (pngdec->sinkpad, gst_pngdec_sink_activate); + gst_pad_set_activatepush_function (pngdec->sinkpad, + gst_pngdec_sink_activate_push); + gst_pad_set_activatepull_function (pngdec->sinkpad, + gst_pngdec_sink_activate_pull); + gst_pad_set_chain_function (pngdec->sinkpad, gst_pngdec_chain); + gst_pad_set_event_function (pngdec->sinkpad, gst_pngdec_sink_event); + gst_pad_set_setcaps_function (pngdec->sinkpad, gst_pngdec_sink_setcaps); + gst_element_add_pad (GST_ELEMENT (pngdec), pngdec->sinkpad); + + pngdec->srcpad = + gst_pad_new_from_static_template (&gst_pngdec_src_pad_template, "src"); + gst_pad_use_fixed_caps (pngdec->srcpad); + gst_element_add_pad (GST_ELEMENT (pngdec), pngdec->srcpad); + + pngdec->buffer_out = NULL; + pngdec->png = NULL; + pngdec->info = NULL; + pngdec->endinfo = NULL; + pngdec->setup = FALSE; + + pngdec->color_type = -1; + pngdec->width = -1; + pngdec->height = -1; + pngdec->bpp = -1; + pngdec->fps_n = 0; + pngdec->fps_d = 1; + + pngdec->in_timestamp = GST_CLOCK_TIME_NONE; + pngdec->in_duration = GST_CLOCK_TIME_NONE; + + gst_segment_init (&pngdec->segment, GST_FORMAT_UNDEFINED); + + pngdec->image_ready = FALSE; +} + +static void +user_error_fn (png_structp png_ptr, png_const_charp error_msg) +{ + GST_ERROR ("%s", error_msg); +} + +static void +user_warning_fn (png_structp png_ptr, png_const_charp warning_msg) +{ + GST_WARNING ("%s", warning_msg); +} + +static void +user_info_callback (png_structp png_ptr, png_infop info) +{ + GstPngDec *pngdec = NULL; + GstFlowReturn ret = GST_FLOW_OK; + size_t buffer_size; + GstBuffer *buffer = NULL; + + pngdec = GST_PNGDEC (png_get_io_ptr (png_ptr)); + + GST_LOG ("info ready"); + + /* Generate the caps and configure */ + ret = gst_pngdec_caps_create_and_set (pngdec); + if (ret != GST_FLOW_OK) { + goto beach; + } + + /* Allocate output buffer */ + pngdec->rowbytes = png_get_rowbytes (pngdec->png, pngdec->info); + if (pngdec->rowbytes > (G_MAXUINT32 - 3) + || pngdec->height > G_MAXUINT32 / pngdec->rowbytes) { + ret = GST_FLOW_ERROR; + goto beach; + } + pngdec->rowbytes = GST_ROUND_UP_4 (pngdec->rowbytes); + buffer_size = pngdec->height * pngdec->rowbytes; + + ret = + gst_pad_alloc_buffer_and_set_caps (pngdec->srcpad, GST_BUFFER_OFFSET_NONE, + buffer_size, GST_PAD_CAPS (pngdec->srcpad), &buffer); + if (ret != GST_FLOW_OK) { + goto beach; + } + + pngdec->buffer_out = buffer; + +beach: + pngdec->ret = ret; +} + +static void +user_endrow_callback (png_structp png_ptr, png_bytep new_row, + png_uint_32 row_num, int pass) +{ + GstPngDec *pngdec = NULL; + + pngdec = GST_PNGDEC (png_get_io_ptr (png_ptr)); + + /* FIXME: implement interlaced pictures */ + + /* If buffer_out doesn't exist, it means buffer_alloc failed, which + * will already have set the return code */ + if (GST_IS_BUFFER (pngdec->buffer_out)) { + size_t offset = row_num * pngdec->rowbytes; + + GST_LOG ("got row %u, copying in buffer %p at offset %" G_GSIZE_FORMAT, + (guint) row_num, pngdec->buffer_out, offset); + memcpy (GST_BUFFER_DATA (pngdec->buffer_out) + offset, new_row, + pngdec->rowbytes); + pngdec->ret = GST_FLOW_OK; + } +} + +static gboolean +buffer_clip (GstPngDec * dec, GstBuffer * buffer) +{ + gboolean res = TRUE; + gint64 cstart, cstop; + + + if ((!GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer))) || + (!GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DURATION (buffer))) || + (dec->segment.format != GST_FORMAT_TIME)) + goto beach; + + cstart = GST_BUFFER_TIMESTAMP (buffer); + cstop = GST_BUFFER_DURATION (buffer); + + if ((res = gst_segment_clip (&dec->segment, GST_FORMAT_TIME, + cstart, cstart + cstop, &cstart, &cstop))) { + GST_BUFFER_TIMESTAMP (buffer) = cstart; + GST_BUFFER_DURATION (buffer) = cstop - cstart; + } + +beach: + return res; +} + +static void +user_end_callback (png_structp png_ptr, png_infop info) +{ + GstPngDec *pngdec = NULL; + + pngdec = GST_PNGDEC (png_get_io_ptr (png_ptr)); + + GST_LOG_OBJECT (pngdec, "and we are done reading this image"); + + if (!pngdec->buffer_out) + return; + + if (GST_CLOCK_TIME_IS_VALID (pngdec->in_timestamp)) + GST_BUFFER_TIMESTAMP (pngdec->buffer_out) = pngdec->in_timestamp; + if (GST_CLOCK_TIME_IS_VALID (pngdec->in_duration)) + GST_BUFFER_DURATION (pngdec->buffer_out) = pngdec->in_duration; + + /* buffer clipping */ + if (buffer_clip (pngdec, pngdec->buffer_out)) { + /* Push our buffer and then EOS if needed */ + GST_LOG_OBJECT (pngdec, "pushing buffer with ts=%" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (pngdec->buffer_out))); + + pngdec->ret = gst_pad_push (pngdec->srcpad, pngdec->buffer_out); + } else { + GST_LOG_OBJECT (pngdec, "dropped decoded buffer"); + gst_buffer_unref (pngdec->buffer_out); + } + pngdec->buffer_out = NULL; + pngdec->image_ready = TRUE; +} + +static void +user_read_data (png_structp png_ptr, png_bytep data, png_size_t length) +{ + GstPngDec *pngdec; + GstBuffer *buffer; + GstFlowReturn ret = GST_FLOW_OK; + guint size; + + pngdec = GST_PNGDEC (png_get_io_ptr (png_ptr)); + + GST_LOG ("reading %" G_GSIZE_FORMAT " bytes of data at offset %d", length, + pngdec->offset); + + ret = gst_pad_pull_range (pngdec->sinkpad, pngdec->offset, length, &buffer); + if (ret != GST_FLOW_OK) + goto pause; + + size = GST_BUFFER_SIZE (buffer); + + if (size != length) + goto short_buffer; + + memcpy (data, GST_BUFFER_DATA (buffer), size); + + gst_buffer_unref (buffer); + + pngdec->offset += length; + + return; + + /* ERRORS */ +pause: + { + GST_INFO_OBJECT (pngdec, "pausing task, reason %s", + gst_flow_get_name (ret)); + gst_pad_pause_task (pngdec->sinkpad); + if (ret == GST_FLOW_UNEXPECTED) { + gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); + } else if (ret < GST_FLOW_UNEXPECTED || ret == GST_FLOW_NOT_LINKED) { + GST_ELEMENT_ERROR (pngdec, STREAM, FAILED, + (_("Internal data stream error.")), + ("stream stopped, reason %s", gst_flow_get_name (ret))); + gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); + } + png_error (png_ptr, "Internal data stream error."); + return; + } +short_buffer: + { + gst_buffer_unref (buffer); + GST_ELEMENT_ERROR (pngdec, STREAM, FAILED, + (_("Internal data stream error.")), + ("Read %u, needed %" G_GSIZE_FORMAT "bytes", size, length)); + ret = GST_FLOW_ERROR; + goto pause; + } +} + +static GstFlowReturn +gst_pngdec_caps_create_and_set (GstPngDec * pngdec) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstCaps *caps = NULL, *res = NULL; + GstPadTemplate *templ = NULL; + gint bpc = 0, color_type; + png_uint_32 width, height; + + g_return_val_if_fail (GST_IS_PNGDEC (pngdec), GST_FLOW_ERROR); + + /* Get bits per channel */ + bpc = png_get_bit_depth (pngdec->png, pngdec->info); + if (bpc > 8) { + /* Add alpha channel if 16-bit depth */ + png_set_add_alpha (pngdec->png, 0xffff, PNG_FILLER_BEFORE); + png_set_swap (pngdec->png); + } + + /* Get Color type */ + color_type = png_get_color_type (pngdec->png, pngdec->info); + +#if 0 + /* We used to have this HACK to reverse the outgoing bytes, but the problem + * that originally required the hack seems to have been in ffmpegcolorspace's + * RGBA descriptions. It doesn't seem needed now that's fixed, but might + * still be needed on big-endian systems, I'm not sure. J.S. 6/7/2007 */ + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_bgr (pngdec->png); +#endif + + /* Gray scale converted to RGB and upscaled to 8 bits */ + if ((color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || + (color_type == PNG_COLOR_TYPE_GRAY)) { + GST_LOG_OBJECT (pngdec, "converting grayscale png to RGB"); + png_set_gray_to_rgb (pngdec->png); + if (bpc < 8) { /* Convert to 8 bits */ + GST_LOG_OBJECT (pngdec, "converting grayscale image to 8 bits"); +#if PNG_LIBPNG_VER < 10400 + png_set_gray_1_2_4_to_8 (pngdec->png); +#else + png_set_expand_gray_1_2_4_to_8 (pngdec->png); +#endif + } + } + + /* Palette converted to RGB */ + if (color_type == PNG_COLOR_TYPE_PALETTE) { + GST_LOG_OBJECT (pngdec, "converting palette png to RGB"); + png_set_palette_to_rgb (pngdec->png); + } + + /* Update the info structure */ + png_read_update_info (pngdec->png, pngdec->info); + + /* Get IHDR header again after transformation settings */ + + png_get_IHDR (pngdec->png, pngdec->info, &width, &height, + &bpc, &pngdec->color_type, NULL, NULL, NULL); + + pngdec->width = width; + pngdec->height = height; + + GST_LOG_OBJECT (pngdec, "this is a %dx%d PNG image", pngdec->width, + pngdec->height); + + switch (pngdec->color_type) { + case PNG_COLOR_TYPE_RGB: + GST_LOG_OBJECT (pngdec, "we have no alpha channel, depth is 24 bits"); + pngdec->bpp = 3 * bpc; + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + GST_LOG_OBJECT (pngdec, "we have an alpha channel, depth is 32 bits"); + pngdec->bpp = 4 * bpc; + break; + default: + GST_ELEMENT_ERROR (pngdec, STREAM, NOT_IMPLEMENTED, (NULL), + ("pngdec does not support this color type")); + ret = GST_FLOW_NOT_SUPPORTED; + goto beach; + } + + caps = gst_caps_new_simple ("video/x-raw-rgb", + "width", G_TYPE_INT, pngdec->width, + "height", G_TYPE_INT, pngdec->height, + "bpp", G_TYPE_INT, pngdec->bpp, + "framerate", GST_TYPE_FRACTION, pngdec->fps_n, pngdec->fps_d, NULL); + + templ = gst_static_pad_template_get (&gst_pngdec_src_pad_template); + + res = gst_caps_intersect (caps, gst_pad_template_get_caps (templ)); + + gst_caps_unref (caps); + gst_object_unref (templ); + + if (!gst_pad_set_caps (pngdec->srcpad, res)) + ret = GST_FLOW_NOT_NEGOTIATED; + + GST_DEBUG_OBJECT (pngdec, "our caps %" GST_PTR_FORMAT, res); + + gst_caps_unref (res); + + /* Push a newsegment event */ + if (pngdec->need_newsegment) { + gst_pad_push_event (pngdec->srcpad, + gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0)); + pngdec->need_newsegment = FALSE; + } + +beach: + return ret; +} + +static void +gst_pngdec_task (GstPad * pad) +{ + GstPngDec *pngdec; + GstBuffer *buffer = NULL; + size_t buffer_size = 0; + gint i = 0; + png_bytep *rows, inp; + png_uint_32 rowbytes; + GstFlowReturn ret = GST_FLOW_OK; + + pngdec = GST_PNGDEC (GST_OBJECT_PARENT (pad)); + + GST_LOG_OBJECT (pngdec, "read frame"); + + /* Let libpng come back here on error */ + if (setjmp (png_jmpbuf (pngdec->png))) { + ret = GST_FLOW_ERROR; + goto pause; + } + + /* Set reading callback */ + png_set_read_fn (pngdec->png, pngdec, user_read_data); + + /* Read info */ + png_read_info (pngdec->png, pngdec->info); + + /* Generate the caps and configure */ + ret = gst_pngdec_caps_create_and_set (pngdec); + if (ret != GST_FLOW_OK) { + goto pause; + } + + /* Allocate output buffer */ + rowbytes = png_get_rowbytes (pngdec->png, pngdec->info); + if (rowbytes > (G_MAXUINT32 - 3) || pngdec->height > G_MAXUINT32 / rowbytes) { + ret = GST_FLOW_ERROR; + goto pause; + } + rowbytes = GST_ROUND_UP_4 (rowbytes); + buffer_size = pngdec->height * rowbytes; + ret = + gst_pad_alloc_buffer_and_set_caps (pngdec->srcpad, GST_BUFFER_OFFSET_NONE, + buffer_size, GST_PAD_CAPS (pngdec->srcpad), &buffer); + if (ret != GST_FLOW_OK) + goto pause; + + rows = (png_bytep *) g_malloc (sizeof (png_bytep) * pngdec->height); + + inp = GST_BUFFER_DATA (buffer); + + for (i = 0; i < pngdec->height; i++) { + rows[i] = inp; + inp += rowbytes; + } + + /* Read the actual picture */ + png_read_image (pngdec->png, rows); + g_free (rows); + + /* Push the raw RGB frame */ + ret = gst_pad_push (pngdec->srcpad, buffer); + if (ret != GST_FLOW_OK) + goto pause; + + /* And we are done */ + gst_pad_pause_task (pngdec->sinkpad); + gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); + return; + +pause: + { + GST_INFO_OBJECT (pngdec, "pausing task, reason %s", + gst_flow_get_name (ret)); + gst_pad_pause_task (pngdec->sinkpad); + if (ret == GST_FLOW_UNEXPECTED) { + gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + GST_ELEMENT_ERROR (pngdec, STREAM, FAILED, + (_("Internal data stream error.")), + ("stream stopped, reason %s", gst_flow_get_name (ret))); + gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); + } + } +} + +static GstFlowReturn +gst_pngdec_chain (GstPad * pad, GstBuffer * buffer) +{ + GstPngDec *pngdec; + GstFlowReturn ret = GST_FLOW_OK; + + pngdec = GST_PNGDEC (gst_pad_get_parent (pad)); + + GST_LOG_OBJECT (pngdec, "Got buffer, size=%u", GST_BUFFER_SIZE (buffer)); + + if (G_UNLIKELY (!pngdec->setup)) + goto not_configured; + + /* Something is going wrong in our callbacks */ + ret = pngdec->ret; + if (G_UNLIKELY (ret != GST_FLOW_OK)) { + GST_WARNING_OBJECT (pngdec, "we have a pending return code of %d", ret); + goto beach; + } + + /* Let libpng come back here on error */ + if (setjmp (png_jmpbuf (pngdec->png))) { + GST_WARNING_OBJECT (pngdec, "error during decoding"); + ret = GST_FLOW_ERROR; + goto beach; + } + + pngdec->in_timestamp = GST_BUFFER_TIMESTAMP (buffer); + pngdec->in_duration = GST_BUFFER_DURATION (buffer); + + /* Progressive loading of the PNG image */ + png_process_data (pngdec->png, pngdec->info, GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); + + if (pngdec->image_ready) { + if (pngdec->framed) { + /* Reset ourselves for the next frame */ + gst_pngdec_libpng_clear (pngdec); + gst_pngdec_libpng_init (pngdec); + GST_LOG_OBJECT (pngdec, "setting up callbacks for next frame"); + png_set_progressive_read_fn (pngdec->png, pngdec, + user_info_callback, user_endrow_callback, user_end_callback); + } else { + GST_LOG_OBJECT (pngdec, "sending EOS"); + pngdec->ret = gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); + } + pngdec->image_ready = FALSE; + } + + /* grab new return code */ + ret = pngdec->ret; + + /* And release the buffer */ + gst_buffer_unref (buffer); + +beach: + gst_object_unref (pngdec); + + return ret; + + /* ERRORS */ +not_configured: + { + GST_LOG_OBJECT (pngdec, "we are not configured yet"); + ret = GST_FLOW_WRONG_STATE; + goto beach; + } +} + +static gboolean +gst_pngdec_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstStructure *s; + GstPngDec *pngdec; + gint num, denom; + + pngdec = GST_PNGDEC (gst_pad_get_parent (pad)); + + s = gst_caps_get_structure (caps, 0); + if (gst_structure_get_fraction (s, "framerate", &num, &denom)) { + GST_DEBUG_OBJECT (pngdec, "framed input"); + pngdec->framed = TRUE; + pngdec->fps_n = num; + pngdec->fps_d = denom; + } else { + GST_DEBUG_OBJECT (pngdec, "single picture input"); + pngdec->framed = FALSE; + pngdec->fps_n = 0; + pngdec->fps_d = 1; + } + + gst_object_unref (pngdec); + return TRUE; +} + +static gboolean +gst_pngdec_sink_event (GstPad * pad, GstEvent * event) +{ + GstPngDec *pngdec; + gboolean res; + + pngdec = GST_PNGDEC (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT:{ + gdouble rate, arate; + gboolean update; + gint64 start, stop, position; + GstFormat fmt; + + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &fmt, + &start, &stop, &position); + + gst_segment_set_newsegment_full (&pngdec->segment, update, rate, arate, + fmt, start, stop, position); + + GST_LOG_OBJECT (pngdec, "NEWSEGMENT (%s)", gst_format_get_name (fmt)); + + if (fmt == GST_FORMAT_TIME) { + pngdec->need_newsegment = FALSE; + res = gst_pad_push_event (pngdec->srcpad, event); + } else { + gst_event_unref (event); + res = TRUE; + } + break; + } + case GST_EVENT_FLUSH_STOP: + { + gst_pngdec_libpng_clear (pngdec); + gst_pngdec_libpng_init (pngdec); + png_set_progressive_read_fn (pngdec->png, pngdec, + user_info_callback, user_endrow_callback, user_end_callback); + pngdec->ret = GST_FLOW_OK; + gst_segment_init (&pngdec->segment, GST_FORMAT_UNDEFINED); + res = gst_pad_push_event (pngdec->srcpad, event); + break; + } + case GST_EVENT_EOS: + { + GST_LOG_OBJECT (pngdec, "EOS"); + gst_pngdec_libpng_clear (pngdec); + pngdec->ret = GST_FLOW_UNEXPECTED; + res = gst_pad_push_event (pngdec->srcpad, event); + break; + } + default: + res = gst_pad_push_event (pngdec->srcpad, event); + break; + } + + gst_object_unref (pngdec); + return res; +} + + +/* Clean up the libpng structures */ +static gboolean +gst_pngdec_libpng_clear (GstPngDec * pngdec) +{ + png_infopp info = NULL, endinfo = NULL; + + g_return_val_if_fail (GST_IS_PNGDEC (pngdec), FALSE); + + GST_LOG ("cleaning up libpng structures"); + + if (pngdec->info) { + info = &pngdec->info; + } + + if (pngdec->endinfo) { + endinfo = &pngdec->endinfo; + } + + if (pngdec->png) { + png_destroy_read_struct (&(pngdec->png), info, endinfo); + pngdec->png = NULL; + pngdec->info = NULL; + pngdec->endinfo = NULL; + } + + pngdec->bpp = pngdec->color_type = pngdec->height = pngdec->width = -1; + pngdec->offset = 0; + pngdec->rowbytes = 0; + pngdec->buffer_out = NULL; + + pngdec->setup = FALSE; + + pngdec->in_timestamp = GST_CLOCK_TIME_NONE; + pngdec->in_duration = GST_CLOCK_TIME_NONE; + + return TRUE; +} + +static gboolean +gst_pngdec_libpng_init (GstPngDec * pngdec) +{ + g_return_val_if_fail (GST_IS_PNGDEC (pngdec), FALSE); + + if (pngdec->setup) + return TRUE; + + GST_LOG ("init libpng structures"); + + /* initialize png struct stuff */ + pngdec->png = png_create_read_struct (PNG_LIBPNG_VER_STRING, + (png_voidp) NULL, user_error_fn, user_warning_fn); + + if (pngdec->png == NULL) + goto init_failed; + + pngdec->info = png_create_info_struct (pngdec->png); + if (pngdec->info == NULL) + goto info_failed; + + pngdec->endinfo = png_create_info_struct (pngdec->png); + if (pngdec->endinfo == NULL) + goto endinfo_failed; + + pngdec->setup = TRUE; + + return TRUE; + + /* ERRORS */ +init_failed: + { + GST_ELEMENT_ERROR (pngdec, LIBRARY, INIT, (NULL), + ("Failed to initialize png structure")); + return FALSE; + } +info_failed: + { + gst_pngdec_libpng_clear (pngdec); + GST_ELEMENT_ERROR (pngdec, LIBRARY, INIT, (NULL), + ("Failed to initialize info structure")); + return FALSE; + } +endinfo_failed: + { + gst_pngdec_libpng_clear (pngdec); + GST_ELEMENT_ERROR (pngdec, LIBRARY, INIT, (NULL), + ("Failed to initialize endinfo structure")); + return FALSE; + } +} + +static GstStateChangeReturn +gst_pngdec_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstPngDec *pngdec; + + pngdec = GST_PNGDEC (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_pngdec_libpng_init (pngdec); + pngdec->need_newsegment = TRUE; + pngdec->framed = FALSE; + pngdec->ret = GST_FLOW_OK; + gst_segment_init (&pngdec->segment, GST_FORMAT_UNDEFINED); + break; + default: + break; + } + + ret = parent_class->change_state (element, transition); + if (ret != GST_STATE_CHANGE_SUCCESS) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_pngdec_libpng_clear (pngdec); + break; + default: + break; + } + + return ret; +} + +/* this function gets called when we activate ourselves in push mode. */ +static gboolean +gst_pngdec_sink_activate_push (GstPad * sinkpad, gboolean active) +{ + GstPngDec *pngdec; + + pngdec = GST_PNGDEC (GST_OBJECT_PARENT (sinkpad)); + + pngdec->ret = GST_FLOW_OK; + + if (active) { + /* Let libpng come back here on error */ + if (setjmp (png_jmpbuf (pngdec->png))) + goto setup_failed; + + GST_LOG ("setting up progressive loading callbacks"); + png_set_progressive_read_fn (pngdec->png, pngdec, + user_info_callback, user_endrow_callback, user_end_callback); + } + return TRUE; + +setup_failed: + { + GST_LOG ("failed setting up libpng jmpbuf"); + gst_pngdec_libpng_clear (pngdec); + return FALSE; + } +} + +/* 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_pngdec_sink_activate_pull (GstPad * sinkpad, gboolean active) +{ + if (active) { + return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_pngdec_task, + sinkpad); + } else { + return gst_pad_stop_task (sinkpad); + } +} + +/* this function is called when the pad is activated and should start + * processing data. + * + * We check if we can do random access to decide if we work push or + * pull based. + */ +static gboolean +gst_pngdec_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); + } +} diff --git a/ext/libpng/gstpngdec.h b/ext/libpng/gstpngdec.h new file mode 100644 index 0000000..439b293 --- /dev/null +++ b/ext/libpng/gstpngdec.h @@ -0,0 +1,84 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_PNGDEC_H__ +#define __GST_PNGDEC_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_PNGDEC (gst_pngdec_get_type()) +#define GST_PNGDEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PNGDEC,GstPngDec)) +#define GST_PNGDEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PNGDEC,GstPngDecClass)) +#define GST_IS_PNGDEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PNGDEC)) +#define GST_IS_PNGDEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PNGDEC)) + +typedef struct _GstPngDec GstPngDec; +typedef struct _GstPngDecClass GstPngDecClass; + +struct _GstPngDec +{ + GstElement element; + + GstPad *sinkpad, *srcpad; + + gboolean need_newsegment; + + /* Progressive */ + GstBuffer *buffer_out; + GstFlowReturn ret; + png_uint_32 rowbytes; + + /* Pull range */ + gint offset; + + png_structp png; + png_infop info; + png_infop endinfo; + gboolean setup; + + gint width; + gint height; + gint bpp; + gint color_type; + gint fps_n; + gint fps_d; + + /* Chain */ + gboolean framed; + GstClockTime in_timestamp; + GstClockTime in_duration; + + GstSegment segment; + gboolean image_ready; +}; + +struct _GstPngDecClass +{ + GstElementClass parent_class; +}; + +GType gst_pngdec_get_type(void); + +G_END_DECLS + +#endif /* __GST_PNGDEC_H__ */ diff --git a/ext/libpng/gstpngenc.c b/ext/libpng/gstpngenc.c new file mode 100644 index 0000000..30986cd --- /dev/null +++ b/ext/libpng/gstpngenc.c @@ -0,0 +1,432 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * Filter: + * Copyright (C) 2000 Donald A. Graft + * + * 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-pngenc + * + * Encodes png images. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include "gstpngenc.h" +#include +#include + +GST_DEBUG_CATEGORY_STATIC (pngenc_debug); +#define GST_CAT_DEFAULT pngenc_debug + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_SNAPSHOT TRUE +/* #define DEFAULT_NEWMEDIA FALSE */ +#define DEFAULT_COMPRESSION_LEVEL 6 + +enum +{ + ARG_0, + ARG_SNAPSHOT, +/* ARG_NEWMEDIA, */ + ARG_COMPRESSION_LEVEL +}; + +static GstStaticPadTemplate pngenc_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/png, " + "width = (int) [ 16, 1000000 ], " + "height = (int) [ 16, 1000000 ], " "framerate = " GST_VIDEO_FPS_RANGE) + ); + +static GstStaticPadTemplate pngenc_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB ";" + GST_VIDEO_CAPS_GRAY8) + ); + +/* static GstElementClass *parent_class = NULL; */ + +GST_BOILERPLATE (GstPngEnc, gst_pngenc, GstElement, GST_TYPE_ELEMENT); + +static void gst_pngenc_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_pngenc_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_pngenc_chain (GstPad * pad, GstBuffer * data); + +static void +user_error_fn (png_structp png_ptr, png_const_charp error_msg) +{ + g_warning ("%s", error_msg); +} + +static void +user_warning_fn (png_structp png_ptr, png_const_charp warning_msg) +{ + g_warning ("%s", warning_msg); +} + +static void +gst_pngenc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template + (element_class, &pngenc_sink_template); + gst_element_class_add_static_pad_template + (element_class, &pngenc_src_template); + gst_element_class_set_details_simple (element_class, "PNG image encoder", + "Codec/Encoder/Image", + "Encode a video frame to a .png image", + "Jeremy SIMON "); +} + +static void +gst_pngenc_class_init (GstPngEncClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->get_property = gst_pngenc_get_property; + gobject_class->set_property = gst_pngenc_set_property; + + g_object_class_install_property (gobject_class, ARG_SNAPSHOT, + g_param_spec_boolean ("snapshot", "Snapshot", + "Send EOS after encoding a frame, useful for snapshots", + DEFAULT_SNAPSHOT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + +/* g_object_class_install_property (gobject_class, ARG_NEWMEDIA, */ +/* g_param_spec_boolean ("newmedia", "newmedia", */ +/* "Send new media discontinuity after encoding each frame", */ +/* DEFAULT_NEWMEDIA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); */ + + g_object_class_install_property (gobject_class, ARG_COMPRESSION_LEVEL, + g_param_spec_uint ("compression-level", "compression-level", + "PNG compression level", + Z_NO_COMPRESSION, Z_BEST_COMPRESSION, + DEFAULT_COMPRESSION_LEVEL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (pngenc_debug, "pngenc", 0, "PNG image encoder"); +} + + +static gboolean +gst_pngenc_setcaps (GstPad * pad, GstCaps * caps) +{ + GstPngEnc *pngenc; + GstVideoFormat format; + int fps_n, fps_d; + GstCaps *pcaps; + gboolean ret; + + pngenc = GST_PNGENC (gst_pad_get_parent (pad)); + + ret = gst_video_format_parse_caps (caps, &format, + &pngenc->width, &pngenc->height); + if (G_LIKELY (ret)) + ret = gst_video_parse_caps_framerate (caps, &fps_n, &fps_d); + + if (G_UNLIKELY (!ret)) + goto done; + + switch (format) { + case GST_VIDEO_FORMAT_RGBA: + pngenc->png_color_type = PNG_COLOR_TYPE_RGBA; + break; + case GST_VIDEO_FORMAT_RGB: + pngenc->png_color_type = PNG_COLOR_TYPE_RGB; + break; + case GST_VIDEO_FORMAT_GRAY8: + pngenc->png_color_type = PNG_COLOR_TYPE_GRAY; + break; + default: + ret = FALSE; + goto done; + } + + if (G_UNLIKELY (pngenc->width < 16 || pngenc->width > 1000000 || + pngenc->height < 16 || pngenc->height > 1000000)) { + ret = FALSE; + goto done; + } + + pngenc->stride = gst_video_format_get_row_stride (format, 0, pngenc->width); + + pcaps = gst_caps_new_simple ("image/png", + "width", G_TYPE_INT, pngenc->width, + "height", G_TYPE_INT, pngenc->height, + "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL); + + ret = gst_pad_set_caps (pngenc->srcpad, pcaps); + + gst_caps_unref (pcaps); + + /* Fall-through. */ +done: + if (G_UNLIKELY (!ret)) { + pngenc->width = 0; + pngenc->height = 0; + } + + gst_object_unref (pngenc); + + return ret; +} + +static void +gst_pngenc_init (GstPngEnc * pngenc, GstPngEncClass * g_class) +{ + /* sinkpad */ + pngenc->sinkpad = gst_pad_new_from_static_template + (&pngenc_sink_template, "sink"); + gst_pad_set_chain_function (pngenc->sinkpad, gst_pngenc_chain); + /* gst_pad_set_link_function (pngenc->sinkpad, gst_pngenc_sinklink); */ + /* gst_pad_set_getcaps_function (pngenc->sinkpad, gst_pngenc_sink_getcaps); */ + gst_pad_set_setcaps_function (pngenc->sinkpad, gst_pngenc_setcaps); + gst_element_add_pad (GST_ELEMENT (pngenc), pngenc->sinkpad); + + /* srcpad */ + pngenc->srcpad = gst_pad_new_from_static_template + (&pngenc_src_template, "src"); + /* pngenc->srcpad = gst_pad_new ("src", GST_PAD_SRC); */ + /* gst_pad_set_getcaps_function (pngenc->srcpad, gst_pngenc_src_getcaps); */ + /* gst_pad_set_setcaps_function (pngenc->srcpad, gst_pngenc_setcaps); */ + gst_element_add_pad (GST_ELEMENT (pngenc), pngenc->srcpad); + + /* init settings */ + pngenc->png_struct_ptr = NULL; + pngenc->png_info_ptr = NULL; + + pngenc->snapshot = DEFAULT_SNAPSHOT; +/* pngenc->newmedia = FALSE; */ + pngenc->compression_level = DEFAULT_COMPRESSION_LEVEL; +} + +static void +user_flush_data (png_structp png_ptr G_GNUC_UNUSED) +{ +} + +static void +user_write_data (png_structp png_ptr, png_bytep data, png_uint_32 length) +{ + GstPngEnc *pngenc; + + pngenc = (GstPngEnc *) png_get_io_ptr (png_ptr); + + if (pngenc->written + length >= GST_BUFFER_SIZE (pngenc->buffer_out)) { + GST_ERROR_OBJECT (pngenc, "output buffer bigger than the input buffer!?"); + png_error (png_ptr, "output buffer bigger than the input buffer!?"); + + /* never reached */ + return; + } + + memcpy (GST_BUFFER_DATA (pngenc->buffer_out) + pngenc->written, data, length); + pngenc->written += length; +} + +static GstFlowReturn +gst_pngenc_chain (GstPad * pad, GstBuffer * buf) +{ + GstPngEnc *pngenc; + gint row_index; + png_byte **row_pointers; + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *encoded_buf = NULL; + + pngenc = GST_PNGENC (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (pngenc, "BEGINNING"); + + if (G_UNLIKELY (pngenc->width <= 0 || pngenc->height <= 0)) { + ret = GST_FLOW_NOT_NEGOTIATED; + goto done; + } + + if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < pngenc->height * pngenc->stride)) { + gst_buffer_unref (buf); + GST_ELEMENT_ERROR (pngenc, STREAM, FORMAT, (NULL), + ("Provided input buffer is too small, caps problem?")); + ret = GST_FLOW_ERROR; + goto done; + } + + /* initialize png struct stuff */ + pngenc->png_struct_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, + (png_voidp) NULL, user_error_fn, user_warning_fn); + if (pngenc->png_struct_ptr == NULL) { + gst_buffer_unref (buf); + GST_ELEMENT_ERROR (pngenc, LIBRARY, INIT, (NULL), + ("Failed to initialize png structure")); + ret = GST_FLOW_ERROR; + goto done; + } + + pngenc->png_info_ptr = png_create_info_struct (pngenc->png_struct_ptr); + if (!pngenc->png_info_ptr) { + gst_buffer_unref (buf); + png_destroy_write_struct (&(pngenc->png_struct_ptr), (png_infopp) NULL); + GST_ELEMENT_ERROR (pngenc, LIBRARY, INIT, (NULL), + ("Failed to initialize the png info structure")); + ret = GST_FLOW_ERROR; + goto done; + } + + /* non-0 return is from a longjmp inside of libpng */ + if (setjmp (png_jmpbuf (pngenc->png_struct_ptr)) != 0) { + gst_buffer_unref (buf); + png_destroy_write_struct (&pngenc->png_struct_ptr, &pngenc->png_info_ptr); + GST_ELEMENT_ERROR (pngenc, LIBRARY, FAILED, (NULL), + ("returning from longjmp")); + ret = GST_FLOW_ERROR; + goto done; + } + + png_set_filter (pngenc->png_struct_ptr, 0, + PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE); + png_set_compression_level (pngenc->png_struct_ptr, pngenc->compression_level); + + png_set_IHDR (pngenc->png_struct_ptr, + pngenc->png_info_ptr, + pngenc->width, + pngenc->height, + 8, + pngenc->png_color_type, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + png_set_write_fn (pngenc->png_struct_ptr, pngenc, + (png_rw_ptr) user_write_data, user_flush_data); + + row_pointers = g_new (png_byte *, pngenc->height); + + for (row_index = 0; row_index < pngenc->height; row_index++) { + row_pointers[row_index] = GST_BUFFER_DATA (buf) + + (row_index * pngenc->stride); + } + + /* allocate the output buffer */ + pngenc->buffer_out = + gst_buffer_new_and_alloc (pngenc->height * pngenc->stride); + pngenc->written = 0; + + png_write_info (pngenc->png_struct_ptr, pngenc->png_info_ptr); + png_write_image (pngenc->png_struct_ptr, row_pointers); + png_write_end (pngenc->png_struct_ptr, NULL); + + g_free (row_pointers); + + encoded_buf = gst_buffer_create_sub (pngenc->buffer_out, 0, pngenc->written); + + png_destroy_info_struct (pngenc->png_struct_ptr, &pngenc->png_info_ptr); + png_destroy_write_struct (&pngenc->png_struct_ptr, (png_infopp) NULL); + gst_buffer_copy_metadata (encoded_buf, buf, GST_BUFFER_COPY_TIMESTAMPS); + gst_buffer_unref (buf); + gst_buffer_set_caps (encoded_buf, GST_PAD_CAPS (pngenc->srcpad)); + + if ((ret = gst_pad_push (pngenc->srcpad, encoded_buf)) != GST_FLOW_OK) + goto done; + + if (pngenc->snapshot) { + GstEvent *event; + + GST_DEBUG_OBJECT (pngenc, "snapshot mode, sending EOS"); + /* send EOS event, since a frame has been pushed out */ + event = gst_event_new_eos (); + + gst_pad_push_event (pngenc->srcpad, event); + ret = GST_FLOW_UNEXPECTED; + } + +done: + GST_DEBUG_OBJECT (pngenc, "END, ret:%d", ret); + + if (pngenc->buffer_out != NULL) { + gst_buffer_unref (pngenc->buffer_out); + pngenc->buffer_out = NULL; + } + + gst_object_unref (pngenc); + return ret; +} + + +static void +gst_pngenc_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstPngEnc *pngenc; + + pngenc = GST_PNGENC (object); + + switch (prop_id) { + case ARG_SNAPSHOT: + g_value_set_boolean (value, pngenc->snapshot); + break; +/* case ARG_NEWMEDIA: */ +/* g_value_set_boolean (value, pngenc->newmedia); */ +/* break; */ + case ARG_COMPRESSION_LEVEL: + g_value_set_uint (value, pngenc->compression_level); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static void +gst_pngenc_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstPngEnc *pngenc; + + pngenc = GST_PNGENC (object); + + switch (prop_id) { + case ARG_SNAPSHOT: + pngenc->snapshot = g_value_get_boolean (value); + break; +/* case ARG_NEWMEDIA: */ +/* pngenc->newmedia = g_value_get_boolean (value); */ +/* break; */ + case ARG_COMPRESSION_LEVEL: + pngenc->compression_level = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/ext/libpng/gstpngenc.h b/ext/libpng/gstpngenc.h new file mode 100644 index 0000000..792a7c9 --- /dev/null +++ b/ext/libpng/gstpngenc.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_PNGENC_H__ +#define __GST_PNGENC_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#define GST_TYPE_PNGENC (gst_pngenc_get_type()) +#define GST_PNGENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PNGENC,GstPngEnc)) +#define GST_PNGENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PNGENC,GstPngEncClass)) +#define GST_IS_PNGENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PNGENC)) +#define GST_IS_PNGENC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PNGENC)) + +typedef struct _GstPngEnc GstPngEnc; +typedef struct _GstPngEncClass GstPngEncClass; + +struct _GstPngEnc +{ + GstElement element; + + GstPad *sinkpad, *srcpad; + GstBuffer *buffer_out; + guint written; + + png_structp png_struct_ptr; + png_infop png_info_ptr; + + gint png_color_type; + gint width; + gint height; + gint stride; + guint compression_level; + + gboolean snapshot; + gboolean newmedia; +}; + +struct _GstPngEncClass +{ + GstElementClass parent_class; +}; + +GType gst_pngenc_get_type(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __GST_PNGENC_H__ */ diff --git a/ext/pulse/Makefile.am b/ext/pulse/Makefile.am new file mode 100644 index 0000000..2438f5e --- /dev/null +++ b/ext/pulse/Makefile.am @@ -0,0 +1,29 @@ +plugin_LTLIBRARIES = libgstpulse.la + +libgstpulse_la_SOURCES = \ + plugin.c \ + pulsemixer.c \ + pulsemixerctrl.c \ + pulsemixertrack.c \ + pulseprobe.c \ + pulsesink.c \ + pulseaudiosink.c \ + pulsesrc.c \ + pulseutil.c + +libgstpulse_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(PULSE_CFLAGS) +libgstpulse_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ + -lgstinterfaces-$(GST_MAJORMINOR) -lgstpbutils-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(PULSE_LIBS) +libgstpulse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstpulse_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + pulsemixerctrl.h \ + pulsemixer.h \ + pulsemixertrack.h \ + pulseprobe.h \ + pulsesink.h \ + pulsesrc.h \ + pulseutil.h + diff --git a/ext/pulse/Makefile.in b/ext/pulse/Makefile.in new file mode 100644 index 0000000..5bdbb98 --- /dev/null +++ b/ext/pulse/Makefile.in @@ -0,0 +1,895 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/pulse +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstpulse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstpulse_la_OBJECTS = libgstpulse_la-plugin.lo \ + libgstpulse_la-pulsemixer.lo libgstpulse_la-pulsemixerctrl.lo \ + libgstpulse_la-pulsemixertrack.lo libgstpulse_la-pulseprobe.lo \ + libgstpulse_la-pulsesink.lo libgstpulse_la-pulseaudiosink.lo \ + libgstpulse_la-pulsesrc.lo libgstpulse_la-pulseutil.lo +libgstpulse_la_OBJECTS = $(am_libgstpulse_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstpulse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstpulse_la_CFLAGS) $(CFLAGS) \ + $(libgstpulse_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstpulse_la_SOURCES) +DIST_SOURCES = $(libgstpulse_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstpulse.la +libgstpulse_la_SOURCES = \ + plugin.c \ + pulsemixer.c \ + pulsemixerctrl.c \ + pulsemixertrack.c \ + pulseprobe.c \ + pulsesink.c \ + pulseaudiosink.c \ + pulsesrc.c \ + pulseutil.c + +libgstpulse_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(PULSE_CFLAGS) +libgstpulse_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ + -lgstinterfaces-$(GST_MAJORMINOR) -lgstpbutils-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(PULSE_LIBS) + +libgstpulse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstpulse_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + pulsemixerctrl.h \ + pulsemixer.h \ + pulsemixertrack.h \ + pulseprobe.h \ + pulsesink.h \ + pulsesrc.h \ + pulseutil.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/pulse/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/pulse/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstpulse.la: $(libgstpulse_la_OBJECTS) $(libgstpulse_la_DEPENDENCIES) $(EXTRA_libgstpulse_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstpulse_la_LINK) -rpath $(plugindir) $(libgstpulse_la_OBJECTS) $(libgstpulse_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-plugin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulseaudiosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsemixer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsemixerctrl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsemixertrack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulseprobe.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsesink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsesrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulseutil.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstpulse_la-plugin.lo: plugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-plugin.Tpo -c -o libgstpulse_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-plugin.Tpo $(DEPDIR)/libgstpulse_la-plugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstpulse_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c + +libgstpulse_la-pulsemixer.lo: pulsemixer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsemixer.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsemixer.Tpo -c -o libgstpulse_la-pulsemixer.lo `test -f 'pulsemixer.c' || echo '$(srcdir)/'`pulsemixer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsemixer.Tpo $(DEPDIR)/libgstpulse_la-pulsemixer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsemixer.c' object='libgstpulse_la-pulsemixer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsemixer.lo `test -f 'pulsemixer.c' || echo '$(srcdir)/'`pulsemixer.c + +libgstpulse_la-pulsemixerctrl.lo: pulsemixerctrl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsemixerctrl.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsemixerctrl.Tpo -c -o libgstpulse_la-pulsemixerctrl.lo `test -f 'pulsemixerctrl.c' || echo '$(srcdir)/'`pulsemixerctrl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsemixerctrl.Tpo $(DEPDIR)/libgstpulse_la-pulsemixerctrl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsemixerctrl.c' object='libgstpulse_la-pulsemixerctrl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsemixerctrl.lo `test -f 'pulsemixerctrl.c' || echo '$(srcdir)/'`pulsemixerctrl.c + +libgstpulse_la-pulsemixertrack.lo: pulsemixertrack.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsemixertrack.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsemixertrack.Tpo -c -o libgstpulse_la-pulsemixertrack.lo `test -f 'pulsemixertrack.c' || echo '$(srcdir)/'`pulsemixertrack.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsemixertrack.Tpo $(DEPDIR)/libgstpulse_la-pulsemixertrack.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsemixertrack.c' object='libgstpulse_la-pulsemixertrack.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsemixertrack.lo `test -f 'pulsemixertrack.c' || echo '$(srcdir)/'`pulsemixertrack.c + +libgstpulse_la-pulseprobe.lo: pulseprobe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulseprobe.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulseprobe.Tpo -c -o libgstpulse_la-pulseprobe.lo `test -f 'pulseprobe.c' || echo '$(srcdir)/'`pulseprobe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulseprobe.Tpo $(DEPDIR)/libgstpulse_la-pulseprobe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulseprobe.c' object='libgstpulse_la-pulseprobe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulseprobe.lo `test -f 'pulseprobe.c' || echo '$(srcdir)/'`pulseprobe.c + +libgstpulse_la-pulsesink.lo: pulsesink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsesink.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsesink.Tpo -c -o libgstpulse_la-pulsesink.lo `test -f 'pulsesink.c' || echo '$(srcdir)/'`pulsesink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsesink.Tpo $(DEPDIR)/libgstpulse_la-pulsesink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsesink.c' object='libgstpulse_la-pulsesink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsesink.lo `test -f 'pulsesink.c' || echo '$(srcdir)/'`pulsesink.c + +libgstpulse_la-pulseaudiosink.lo: pulseaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulseaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulseaudiosink.Tpo -c -o libgstpulse_la-pulseaudiosink.lo `test -f 'pulseaudiosink.c' || echo '$(srcdir)/'`pulseaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulseaudiosink.Tpo $(DEPDIR)/libgstpulse_la-pulseaudiosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulseaudiosink.c' object='libgstpulse_la-pulseaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulseaudiosink.lo `test -f 'pulseaudiosink.c' || echo '$(srcdir)/'`pulseaudiosink.c + +libgstpulse_la-pulsesrc.lo: pulsesrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsesrc.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsesrc.Tpo -c -o libgstpulse_la-pulsesrc.lo `test -f 'pulsesrc.c' || echo '$(srcdir)/'`pulsesrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsesrc.Tpo $(DEPDIR)/libgstpulse_la-pulsesrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsesrc.c' object='libgstpulse_la-pulsesrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsesrc.lo `test -f 'pulsesrc.c' || echo '$(srcdir)/'`pulsesrc.c + +libgstpulse_la-pulseutil.lo: pulseutil.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulseutil.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulseutil.Tpo -c -o libgstpulse_la-pulseutil.lo `test -f 'pulseutil.c' || echo '$(srcdir)/'`pulseutil.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulseutil.Tpo $(DEPDIR)/libgstpulse_la-pulseutil.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulseutil.c' object='libgstpulse_la-pulseutil.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulseutil.lo `test -f 'pulseutil.c' || echo '$(srcdir)/'`pulseutil.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/pulse/plugin.c b/ext/pulse/plugin.c new file mode 100644 index 0000000..04c014f --- /dev/null +++ b/ext/pulse/plugin.c @@ -0,0 +1,70 @@ +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; 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 + +#include "pulsesink.h" +#include "pulsesrc.h" +#include "pulsemixer.h" + +GST_DEBUG_CATEGORY (pulse_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif + + if (!gst_element_register (plugin, "pulsesink", GST_RANK_PRIMARY + 10, + GST_TYPE_PULSESINK)) + return FALSE; + + if (!gst_element_register (plugin, "pulsesrc", GST_RANK_PRIMARY + 10, + GST_TYPE_PULSESRC)) + return FALSE; + +#ifdef HAVE_PULSE_1_0 + if (!gst_element_register (plugin, "pulseaudiosink", GST_RANK_MARGINAL - 1, + GST_TYPE_PULSE_AUDIO_SINK)) + return FALSE; +#endif + + if (!gst_element_register (plugin, "pulsemixer", GST_RANK_NONE, + GST_TYPE_PULSEMIXER)) + return FALSE; + + GST_DEBUG_CATEGORY_INIT (pulse_debug, "pulse", 0, "PulseAudio elements"); + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "pulseaudio", + "PulseAudio plugin library", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/pulse/pulseaudiosink.c b/ext/pulse/pulseaudiosink.c new file mode 100644 index 0000000..cd9f7d9 --- /dev/null +++ b/ext/pulse/pulseaudiosink.c @@ -0,0 +1,938 @@ +/*-*- Mode: C; c-basic-offset: 2 -*-*/ + +/* GStreamer pulseaudio plugin + * + * Copyright (c) 2011 Intel Corporation + * 2011 Collabora + * 2011 Arun Raghavan + * 2011 Sebastian Dröge + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +/** + * SECTION:element-pulseaudiosink + * @see_also: pulsesink, pulsesrc, pulsemixer + * + * This element outputs audio to a + * PulseAudio sound server via + * the @pulsesink element. It transparently takes care of passing compressed + * format as-is if the sink supports it, decoding if necessary, and changes + * to supported formats at runtime. + * + * + * Example pipelines + * |[ + * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! pulseaudiosink + * ]| Decode and play an Ogg/Vorbis file. + * |[ + * gst-launch -v filesrc location=test.mp3 ! mp3parse ! pulseaudiosink stream-properties="props,media.title=test" + * ]| Play an MP3 file on a sink that supports decoding directly, plug in a + * decoder if/when required. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_PULSE_1_0 + +#include +#include +#include + +#include +#include "pulsesink.h" + +GST_DEBUG_CATEGORY (pulseaudiosink_debug); +#define GST_CAT_DEFAULT (pulseaudiosink_debug) + +#define GST_PULSE_AUDIO_SINK_LOCK(obj) G_STMT_START { \ + GST_LOG_OBJECT (obj, \ + "locking from thread %p", \ + g_thread_self ()); \ + g_mutex_lock (GST_PULSE_AUDIO_SINK_CAST(obj)->lock); \ + GST_LOG_OBJECT (obj, \ + "locked from thread %p", \ + g_thread_self ()); \ +} G_STMT_END + +#define GST_PULSE_AUDIO_SINK_UNLOCK(obj) G_STMT_START { \ + GST_LOG_OBJECT (obj, \ + "unlocking from thread %p", \ + g_thread_self ()); \ + g_mutex_unlock (GST_PULSE_AUDIO_SINK_CAST(obj)->lock); \ +} G_STMT_END + +typedef struct +{ + GstBin parent; + GMutex *lock; + + GstPad *sinkpad; + GstPad *sink_proxypad; + GstPadEventFunction sinkpad_old_eventfunc; + GstPadEventFunction proxypad_old_eventfunc; + + GstPulseSink *psink; + GstElement *dbin2; + + GstSegment segment; + + guint event_probe_id; + gulong pad_added_id; + + gboolean format_lost; +} GstPulseAudioSink; + +typedef struct +{ + GstBinClass parent_class; + guint n_prop_own; + guint n_prop_total; +} GstPulseAudioSinkClass; + +static void gst_pulse_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_pulse_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_pulse_audio_sink_dispose (GObject * object); +static gboolean gst_pulse_audio_sink_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_pulse_audio_sink_sink_event (GstPad * pad, + GstEvent * event); +static gboolean gst_pulse_audio_sink_sink_acceptcaps (GstPad * pad, + GstCaps * caps); +static gboolean gst_pulse_audio_sink_sink_setcaps (GstPad * pad, + GstCaps * caps); +static GstStateChangeReturn +gst_pulse_audio_sink_change_state (GstElement * element, + GstStateChange transition); + +static void +gst_pulse_audio_sink_do_init (GType type) +{ + GST_DEBUG_CATEGORY_INIT (pulseaudiosink_debug, "pulseaudiosink", 0, + "Bin that wraps pulsesink for handling compressed formats"); +} + +GST_BOILERPLATE_FULL (GstPulseAudioSink, gst_pulse_audio_sink, GstBin, + GST_TYPE_BIN, gst_pulse_audio_sink_do_init); + +static GstStaticPadTemplate sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + GST_STATIC_CAPS (PULSE_SINK_TEMPLATE_CAPS)); + +static void +gst_pulse_audio_sink_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + + gst_element_class_set_details_simple (element_class, + "Bin wrapping pulsesink", "Sink/Audio/Bin", + "Correctly handles sink changes when streaming compressed formats to " + "pulsesink", "Arun Raghavan "); +} + +static GParamSpec * +param_spec_copy (GParamSpec * spec) +{ + const char *name, *nick, *blurb; + GParamFlags flags; + + name = g_param_spec_get_name (spec); + nick = g_param_spec_get_nick (spec); + blurb = g_param_spec_get_blurb (spec); + flags = spec->flags; + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_BOOLEAN) { + return g_param_spec_boolean (name, nick, blurb, + G_PARAM_SPEC_BOOLEAN (spec)->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_BOXED) { + return g_param_spec_boxed (name, nick, blurb, spec->value_type, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_CHAR) { + GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (spec); + return g_param_spec_char (name, nick, blurb, cspec->minimum, + cspec->maximum, cspec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_DOUBLE) { + GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (spec); + return g_param_spec_double (name, nick, blurb, dspec->minimum, + dspec->maximum, dspec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_ENUM) { + return g_param_spec_enum (name, nick, blurb, spec->value_type, + G_PARAM_SPEC_ENUM (spec)->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_FLAGS) { + return g_param_spec_flags (name, nick, blurb, spec->value_type, + G_PARAM_SPEC_ENUM (spec)->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_FLOAT) { + GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (spec); + return g_param_spec_double (name, nick, blurb, fspec->minimum, + fspec->maximum, fspec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_GTYPE) { + return g_param_spec_gtype (name, nick, blurb, + G_PARAM_SPEC_GTYPE (spec)->is_a_type, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_INT) { + GParamSpecInt *ispec = G_PARAM_SPEC_INT (spec); + return g_param_spec_int (name, nick, blurb, ispec->minimum, + ispec->maximum, ispec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_INT64) { + GParamSpecInt64 *ispec = G_PARAM_SPEC_INT64 (spec); + return g_param_spec_int64 (name, nick, blurb, ispec->minimum, + ispec->maximum, ispec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_LONG) { + GParamSpecLong *lspec = G_PARAM_SPEC_LONG (spec); + return g_param_spec_long (name, nick, blurb, lspec->minimum, + lspec->maximum, lspec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_OBJECT) { + return g_param_spec_object (name, nick, blurb, spec->value_type, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_PARAM) { + return g_param_spec_param (name, nick, blurb, spec->value_type, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_POINTER) { + return g_param_spec_pointer (name, nick, blurb, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_STRING) { + return g_param_spec_string (name, nick, blurb, + G_PARAM_SPEC_STRING (spec)->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_UCHAR) { + GParamSpecUChar *cspec = G_PARAM_SPEC_UCHAR (spec); + return g_param_spec_uchar (name, nick, blurb, cspec->minimum, + cspec->maximum, cspec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_UINT) { + GParamSpecUInt *ispec = G_PARAM_SPEC_UINT (spec); + return g_param_spec_uint (name, nick, blurb, ispec->minimum, + ispec->maximum, ispec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_UINT64) { + GParamSpecUInt64 *ispec = G_PARAM_SPEC_UINT64 (spec); + return g_param_spec_uint64 (name, nick, blurb, ispec->minimum, + ispec->maximum, ispec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_ULONG) { + GParamSpecULong *lspec = G_PARAM_SPEC_ULONG (spec); + return g_param_spec_ulong (name, nick, blurb, lspec->minimum, + lspec->maximum, lspec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_UNICHAR) { + return g_param_spec_unichar (name, nick, blurb, + G_PARAM_SPEC_UNICHAR (spec)->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_VARIANT) { + GParamSpecVariant *vspec = G_PARAM_SPEC_VARIANT (spec); + return g_param_spec_variant (name, nick, blurb, vspec->type, + vspec->default_value, flags); + } + + if (G_PARAM_SPEC_TYPE (spec) == GST_TYPE_PARAM_MINI_OBJECT) { + return gst_param_spec_mini_object (name, nick, blurb, spec->value_type, + flags); + } + + g_warning ("Unknown param type %ld for '%s'", + (long) G_PARAM_SPEC_TYPE (spec), name); + g_assert_not_reached (); +} + +static void +gst_pulse_audio_sink_class_init (GstPulseAudioSinkClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *element_class = (GstElementClass *) klass; + GstPulseSinkClass *psink_class = + GST_PULSESINK_CLASS (g_type_class_ref (GST_TYPE_PULSESINK)); + GParamSpec **specs; + guint n, i, j; + + gobject_class->get_property = gst_pulse_audio_sink_get_property; + gobject_class->set_property = gst_pulse_audio_sink_set_property; + gobject_class->dispose = gst_pulse_audio_sink_dispose; + element_class->change_state = + GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_change_state); + + /* Find out how many properties we already have */ + specs = g_object_class_list_properties (gobject_class, &klass->n_prop_own); + g_free (specs); + + /* Proxy pulsesink's properties */ + specs = g_object_class_list_properties (G_OBJECT_CLASS (psink_class), &n); + for (i = 0, j = klass->n_prop_own; i < n; i++) { + if (g_object_class_find_property (gobject_class, + g_param_spec_get_name (specs[i]))) { + /* We already inherited this property from a parent, skip */ + j--; + } else { + g_object_class_install_property (gobject_class, i + j + 1, + param_spec_copy (specs[i])); + } + } + + klass->n_prop_total = i + j; + + g_free (specs); + g_type_class_unref (psink_class); +} + +static GstPad * +get_proxypad (GstPad * sinkpad) +{ + GstIterator *iter = NULL; + GstPad *proxypad = NULL; + + iter = gst_pad_iterate_internal_links (sinkpad); + if (iter) { + if (gst_iterator_next (iter, (gpointer) & proxypad) != GST_ITERATOR_OK) + proxypad = NULL; + gst_iterator_free (iter); + } + + return proxypad; +} + +static void +post_missing_element_message (GstPulseAudioSink * pbin, const gchar * name) +{ + GstMessage *msg; + + msg = gst_missing_element_message_new (GST_ELEMENT_CAST (pbin), name); + gst_element_post_message (GST_ELEMENT_CAST (pbin), msg); +} + +static void +notify_cb (GObject * selector, GParamSpec * pspec, GstPulseAudioSink * pbin) +{ + g_object_notify (G_OBJECT (pbin), g_param_spec_get_name (pspec)); +} + +static void +gst_pulse_audio_sink_init (GstPulseAudioSink * pbin, + GstPulseAudioSinkClass * klass) +{ + GstPadTemplate *template; + GstPad *pad = NULL; + GParamSpec **specs; + GString *prop; + guint i; + + pbin->lock = g_mutex_new (); + + gst_segment_init (&pbin->segment, GST_FORMAT_UNDEFINED); + + pbin->psink = GST_PULSESINK (gst_element_factory_make ("pulsesink", + "pulseaudiosink-sink")); + g_assert (pbin->psink != NULL); + + if (!gst_bin_add (GST_BIN (pbin), GST_ELEMENT (pbin->psink))) { + GST_ERROR_OBJECT (pbin, "Failed to add pulsesink to bin"); + goto error; + } + + pad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); + template = gst_static_pad_template_get (&sink_template); + pbin->sinkpad = gst_ghost_pad_new_from_template ("sink", pad, template); + gst_object_unref (template); + + pbin->sinkpad_old_eventfunc = GST_PAD_EVENTFUNC (pbin->sinkpad); + gst_pad_set_event_function (pbin->sinkpad, + GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_sink_event)); + gst_pad_set_setcaps_function (pbin->sinkpad, + GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_sink_setcaps)); + gst_pad_set_acceptcaps_function (pbin->sinkpad, + GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_sink_acceptcaps)); + + gst_element_add_pad (GST_ELEMENT (pbin), pbin->sinkpad); + + if (!(pbin->sink_proxypad = get_proxypad (pbin->sinkpad))) + GST_ERROR_OBJECT (pbin, "Failed to get proxypad of srcpad"); + else { + pbin->proxypad_old_eventfunc = GST_PAD_EVENTFUNC (pbin->sink_proxypad); + gst_pad_set_event_function (pbin->sink_proxypad, + GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_src_event)); + } + + /* Now proxy all the notify::* signals */ + specs = g_object_class_list_properties (G_OBJECT_CLASS (klass), &i); + prop = g_string_sized_new (30); + + for (i--; i >= klass->n_prop_own; i--) { + g_string_printf (prop, "notify::%s", g_param_spec_get_name (specs[i])); + g_signal_connect (pbin->psink, prop->str, G_CALLBACK (notify_cb), pbin); + } + + g_string_free (prop, TRUE); + g_free (specs); + + pbin->format_lost = FALSE; + +out: + if (pad) + gst_object_unref (pad); + + return; + +error: + if (pbin->psink) + gst_object_unref (pbin->psink); + goto out; +} + +static void +gst_pulse_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (object); + GstPulseAudioSinkClass *klass = + GST_PULSE_AUDIO_SINK_CLASS (G_OBJECT_GET_CLASS (object)); + + g_return_if_fail (prop_id <= klass->n_prop_total); + + g_object_set_property (G_OBJECT (pbin->psink), g_param_spec_get_name (pspec), + value); +} + +static void +gst_pulse_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (object); + GstPulseAudioSinkClass *klass = + GST_PULSE_AUDIO_SINK_CLASS (G_OBJECT_GET_CLASS (object)); + + g_return_if_fail (prop_id <= klass->n_prop_total); + + g_object_get_property (G_OBJECT (pbin->psink), g_param_spec_get_name (pspec), + value); +} + +static void +gst_pulse_audio_sink_free_dbin2 (GstPulseAudioSink * pbin) +{ + g_signal_handler_disconnect (pbin->dbin2, pbin->pad_added_id); + gst_element_set_state (pbin->dbin2, GST_STATE_NULL); + + gst_bin_remove (GST_BIN (pbin), pbin->dbin2); + + pbin->dbin2 = NULL; +} + +static void +gst_pulse_audio_sink_dispose (GObject * object) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (object); + + if (pbin->lock) { + g_mutex_free (pbin->lock); + pbin->lock = NULL; + } + + if (pbin->sink_proxypad) { + gst_object_unref (pbin->sink_proxypad); + pbin->sink_proxypad = NULL; + } + + if (pbin->dbin2) { + g_signal_handler_disconnect (pbin->dbin2, pbin->pad_added_id); + pbin->dbin2 = NULL; + } + + pbin->sinkpad = NULL; + pbin->psink = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static gboolean +gst_pulse_audio_sink_update_sinkpad (GstPulseAudioSink * pbin, GstPad * sinkpad) +{ + gboolean ret; + + ret = gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (pbin->sinkpad), sinkpad); + + if (!ret) + GST_WARNING_OBJECT (pbin, "Could not update ghostpad target"); + + return ret; +} + +static void +distribute_running_time (GstElement * element, const GstSegment * segment) +{ + GstEvent *event; + GstPad *pad; + + pad = gst_element_get_static_pad (element, "sink"); + + /* FIXME: Some decoders collect newsegments and send them out at once, making + * them lose accumulator events (and thus making dbin2_event_probe() hard to + * do right if we're sending these as well. We can get away with not sending + * these at the moment, but this should be fixed! */ +#if 0 + if (segment->accum) { + event = gst_event_new_new_segment_full (FALSE, segment->rate, + segment->applied_rate, segment->format, 0, segment->accum, 0); + gst_pad_send_event (pad, event); + } +#endif + + event = gst_event_new_new_segment_full (FALSE, segment->rate, + segment->applied_rate, segment->format, + segment->start, segment->stop, segment->time); + gst_pad_send_event (pad, event); + + gst_object_unref (pad); +} + +static gboolean +dbin2_event_probe (GstPad * pad, GstMiniObject * obj, gpointer data) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (data); + GstEvent *event = GST_EVENT (obj); + + if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { + GST_DEBUG_OBJECT (pbin, "Got newsegment - dropping"); + gst_pad_remove_event_probe (pad, pbin->event_probe_id); + return FALSE; + } + + return TRUE; +} + +static void +pad_added_cb (GstElement * dbin2, GstPad * pad, gpointer * data) +{ + GstPulseAudioSink *pbin; + GstPad *sinkpad = NULL; + + pbin = GST_PULSE_AUDIO_SINK (data); + sinkpad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); + + GST_PULSE_AUDIO_SINK_LOCK (pbin); + if (gst_pad_link (pad, sinkpad) != GST_PAD_LINK_OK) + GST_ERROR_OBJECT (pbin, "Failed to link decodebin2 to pulsesink"); + else + GST_DEBUG_OBJECT (pbin, "Linked new pad to pulsesink"); + GST_PULSE_AUDIO_SINK_UNLOCK (pbin); + + gst_object_unref (sinkpad); +} + +/* Called with pbin lock held */ +static void +gst_pulse_audio_sink_add_dbin2 (GstPulseAudioSink * pbin) +{ + GstPad *sinkpad = NULL; + + g_assert (pbin->dbin2 == NULL); + + pbin->dbin2 = gst_element_factory_make ("decodebin2", "pulseaudiosink-dbin2"); + + if (!pbin->dbin2) { + post_missing_element_message (pbin, "decodebin2"); + GST_ELEMENT_WARNING (pbin, CORE, MISSING_PLUGIN, + (_("Missing element '%s' - check your GStreamer installation."), + "decodebin2"), ("audio playback might fail")); + goto out; + } + + if (!gst_bin_add (GST_BIN (pbin), pbin->dbin2)) { + GST_ERROR_OBJECT (pbin, "Failed to add decodebin2 to bin"); + goto out; + } + + pbin->pad_added_id = g_signal_connect (pbin->dbin2, "pad-added", + G_CALLBACK (pad_added_cb), pbin); + + if (!gst_element_sync_state_with_parent (pbin->dbin2)) { + GST_ERROR_OBJECT (pbin, "Failed to set decodebin2 to parent state"); + goto out; + } + + /* Trap the newsegment events that we feed the decodebin and discard them */ + sinkpad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); + pbin->event_probe_id = gst_pad_add_event_probe_full (sinkpad, + G_CALLBACK (dbin2_event_probe), gst_object_ref (pbin), + (GDestroyNotify) gst_object_unref); + gst_object_unref (sinkpad); + sinkpad = NULL; + + GST_DEBUG_OBJECT (pbin, "Distributing running time to decodebin"); + distribute_running_time (pbin->dbin2, &pbin->segment); + + sinkpad = gst_element_get_static_pad (pbin->dbin2, "sink"); + + gst_pulse_audio_sink_update_sinkpad (pbin, sinkpad); + +out: + if (sinkpad) + gst_object_unref (sinkpad); +} + +static void +update_eac3_alignment (GstPulseAudioSink * pbin) +{ + GstCaps *caps = gst_pad_peer_get_caps_reffed (pbin->sinkpad); + GstStructure *st; + + if (!caps) + return; + + st = gst_caps_get_structure (caps, 0); + + if (g_str_equal (gst_structure_get_name (st), "audio/x-eac3")) { + GstStructure *event_st = gst_structure_new ("ac3parse-set-alignment", + "alignment", G_TYPE_STRING, pbin->dbin2 ? "frame" : "iec61937", NULL); + + if (!gst_pad_push_event (pbin->sinkpad, + gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, event_st))) + GST_WARNING_OBJECT (pbin->sinkpad, "Could not update alignment"); + } + + gst_caps_unref (caps); +} + +static void +proxypad_blocked_cb (GstPad * pad, gboolean blocked, gpointer data) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (data); + GstCaps *caps; + GstPad *sinkpad = NULL; + + if (!blocked) { + /* Unblocked, don't need to do anything */ + GST_DEBUG_OBJECT (pbin, "unblocked"); + return; + } + + GST_DEBUG_OBJECT (pbin, "blocked"); + + GST_PULSE_AUDIO_SINK_LOCK (pbin); + + if (!pbin->format_lost) { + sinkpad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); + + if (GST_PAD_CAPS (pbin->sinkpad)) { + /* See if we already got caps on our sinkpad */ + caps = gst_caps_ref (GST_PAD_CAPS (pbin->sinkpad)); + } else { + /* We haven't, so get caps from upstream */ + caps = gst_pad_get_caps_reffed (pad); + } + + if (gst_pad_accept_caps (sinkpad, caps)) { + if (pbin->dbin2) { + GST_DEBUG_OBJECT (pbin, "Removing decodebin"); + gst_pulse_audio_sink_free_dbin2 (pbin); + gst_pulse_audio_sink_update_sinkpad (pbin, sinkpad); + } else + GST_DEBUG_OBJECT (pbin, "Doing nothing"); + + gst_caps_unref (caps); + gst_object_unref (sinkpad); + goto done; + } + /* pulsesink doesn't accept the incoming caps, so add a decodebin + * (potentially after removing the existing once, since decodebin2 can't + * renegotiate). */ + } else { + /* Format lost, proceed to try plugging a decodebin */ + pbin->format_lost = FALSE; + } + + if (pbin->dbin2 != NULL) { + /* decodebin2 doesn't support reconfiguration, so throw this one away and + * create a new one. */ + gst_pulse_audio_sink_free_dbin2 (pbin); + } + + GST_DEBUG_OBJECT (pbin, "Adding decodebin"); + gst_pulse_audio_sink_add_dbin2 (pbin); + +done: + update_eac3_alignment (pbin); + + gst_pad_set_blocked_async_full (pad, FALSE, proxypad_blocked_cb, + gst_object_ref (pbin), (GDestroyNotify) gst_object_unref); + + GST_PULSE_AUDIO_SINK_UNLOCK (pbin); +} + +static gboolean +gst_pulse_audio_sink_src_event (GstPad * pad, GstEvent * event) +{ + GstPulseAudioSink *pbin = NULL; + GstPad *ghostpad = NULL; + gboolean ret = FALSE; + + ghostpad = GST_PAD_CAST (gst_pad_get_parent (pad)); + if (G_UNLIKELY (!ghostpad)) { + GST_WARNING_OBJECT (pad, "Could not get ghostpad"); + goto out; + } + + pbin = GST_PULSE_AUDIO_SINK (gst_pad_get_parent (ghostpad)); + if (G_UNLIKELY (!pbin)) { + GST_WARNING_OBJECT (pad, "Could not get pulseaudiosink"); + goto out; + } + + if (G_UNLIKELY (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_UPSTREAM) && + (gst_event_has_name (event, "pulse-format-lost") || + gst_event_has_name (event, "pulse-sink-changed"))) { + g_return_val_if_fail (pad->mode != GST_ACTIVATE_PULL, FALSE); + + GST_PULSE_AUDIO_SINK_LOCK (pbin); + if (gst_event_has_name (event, "pulse-format-lost")) + pbin->format_lost = TRUE; + + if (!gst_pad_is_blocked (pad)) + gst_pad_set_blocked_async_full (pad, TRUE, proxypad_blocked_cb, + gst_object_ref (pbin), (GDestroyNotify) gst_object_unref); + GST_PULSE_AUDIO_SINK_UNLOCK (pbin); + + ret = TRUE; + } else if (pbin->proxypad_old_eventfunc) { + ret = pbin->proxypad_old_eventfunc (pad, event); + event = NULL; + } + +out: + if (ghostpad) + gst_object_unref (ghostpad); + if (pbin) + gst_object_unref (pbin); + if (event) + gst_event_unref (event); + + return ret; +} + +static gboolean +gst_pulse_audio_sink_sink_event (GstPad * pad, GstEvent * event) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (gst_pad_get_parent (pad)); + gboolean ret; + + ret = pbin->sinkpad_old_eventfunc (pad, gst_event_ref (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time; + gboolean update; + + GST_PULSE_AUDIO_SINK_LOCK (pbin); + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + + GST_DEBUG_OBJECT (pbin, + "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT + ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT, + update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop), + GST_TIME_ARGS (time)); + + if (format == GST_FORMAT_TIME) { + /* Store the values for feeding to sub-elements */ + gst_segment_set_newsegment_full (&pbin->segment, update, + rate, arate, format, start, stop, time); + } else { + GST_WARNING_OBJECT (pbin, "Got a non-TIME format segment"); + gst_segment_init (&pbin->segment, GST_FORMAT_TIME); + } + GST_PULSE_AUDIO_SINK_UNLOCK (pbin); + + break; + } + + case GST_EVENT_FLUSH_STOP: + GST_PULSE_AUDIO_SINK_LOCK (pbin); + gst_segment_init (&pbin->segment, GST_FORMAT_UNDEFINED); + GST_PULSE_AUDIO_SINK_UNLOCK (pbin); + break; + + default: + break; + } + + gst_object_unref (pbin); + gst_event_unref (event); + + return ret; +} + +/* The bin's acceptcaps should be exactly equivalent to a pulsesink that is + * connected to a sink that supports all the formats in template caps. This + * means that upstream will have to have everything possibly upto a parser + * plugged and we plugin a decoder whenever required. */ +static gboolean +gst_pulse_audio_sink_sink_acceptcaps (GstPad * pad, GstCaps * caps) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (gst_pad_get_parent (pad)); + GstRingBufferSpec spec = { 0 }; + const GstStructure *st; + GstCaps *pad_caps = NULL; + gboolean ret = FALSE; + + pad_caps = gst_pad_get_caps_reffed (pad); + if (!pad_caps || !gst_caps_can_intersect (pad_caps, caps)) + goto out; + + /* If we've not got fixed caps, creating a stream might fail, so let's just + * return from here with default acceptcaps behaviour */ + if (!gst_caps_is_fixed (caps)) + goto out; + + spec.latency_time = GST_BASE_AUDIO_SINK (pbin->psink)->latency_time; + if (!gst_ring_buffer_parse_caps (&spec, caps)) + goto out; + + /* Make sure non-raw input is framed (one frame per buffer) and can be + * payloaded */ + st = gst_caps_get_structure (caps, 0); + + if (!g_str_has_prefix (gst_structure_get_name (st), "audio/x-raw")) { + gboolean framed = FALSE, parsed = FALSE; + + gst_structure_get_boolean (st, "framed", &framed); + gst_structure_get_boolean (st, "parsed", &parsed); + if ((!framed && !parsed) || gst_audio_iec61937_frame_size (&spec) <= 0) + goto out; + } + + ret = TRUE; + +out: + if (pad_caps) + gst_caps_unref (pad_caps); + + gst_object_unref (pbin); + + return ret; +} + +static gboolean +gst_pulse_audio_sink_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (gst_pad_get_parent (pad)); + gboolean ret = TRUE; + + GST_PULSE_AUDIO_SINK_LOCK (pbin); + + if (!gst_pad_is_blocked (pbin->sinkpad)) + gst_pad_set_blocked_async_full (pbin->sink_proxypad, TRUE, + proxypad_blocked_cb, gst_object_ref (pbin), + (GDestroyNotify) gst_object_unref); + + GST_PULSE_AUDIO_SINK_UNLOCK (pbin); + + gst_object_unref (pbin); + + return ret; +} + +static GstStateChangeReturn +gst_pulse_audio_sink_change_state (GstElement * element, + GstStateChange transition) +{ + GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + /* Nothing to do for upward transitions */ + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_PULSE_AUDIO_SINK_LOCK (pbin); + if (gst_pad_is_blocked (pbin->sinkpad)) { + gst_pad_set_blocked_async_full (pbin->sink_proxypad, FALSE, + proxypad_blocked_cb, gst_object_ref (pbin), + (GDestroyNotify) gst_object_unref); + } + GST_PULSE_AUDIO_SINK_UNLOCK (pbin); + break; + + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret != GST_STATE_CHANGE_SUCCESS) { + GST_DEBUG_OBJECT (pbin, "Base class returned %d on state change", ret); + goto out; + } + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_PULSE_AUDIO_SINK_LOCK (pbin); + gst_segment_init (&pbin->segment, GST_FORMAT_UNDEFINED); + + if (pbin->dbin2) { + GstPad *pad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), + "sink"); + + gst_pulse_audio_sink_free_dbin2 (pbin); + gst_pulse_audio_sink_update_sinkpad (pbin, pad); + + gst_object_unref (pad); + + } + GST_PULSE_AUDIO_SINK_UNLOCK (pbin); + + break; + + default: + break; + } + +out: + return ret; +} + +#endif /* HAVE_PULSE_1_0 */ diff --git a/ext/pulse/pulsemixer.c b/ext/pulse/pulsemixer.c new file mode 100644 index 0000000..96468ce --- /dev/null +++ b/ext/pulse/pulsemixer.c @@ -0,0 +1,282 @@ +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +/** + * SECTION:element-pulsemixer + * @see_also: pulsesrc, pulsesink + * + * This element lets you adjust sound input and output levels for the + * PulseAudio sound server. It supports the GstMixer interface, which can be + * used to obtain a list of available mixer tracks. Set the mixer element to + * READY state before using the GstMixer interface on it. + * + * + * Example pipelines + * + * pulsemixer can't be used in a sensible way in gst-launch. + * + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "pulsemixer.h" + +enum +{ + PROP_SERVER = 1, + PROP_DEVICE, + PROP_DEVICE_NAME +}; + +GST_DEBUG_CATEGORY_EXTERN (pulse_debug); +#define GST_CAT_DEFAULT pulse_debug + +static void gst_pulsemixer_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_pulsemixer_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_pulsemixer_finalize (GObject * object); + +static GstStateChangeReturn gst_pulsemixer_change_state (GstElement * element, + GstStateChange transition); + +static void gst_pulsemixer_init_interfaces (GType type); + +GST_IMPLEMENT_PULSEMIXER_CTRL_METHODS (GstPulseMixer, gst_pulsemixer); +GST_IMPLEMENT_PULSEPROBE_METHODS (GstPulseMixer, gst_pulsemixer); +GST_BOILERPLATE_FULL (GstPulseMixer, gst_pulsemixer, GstElement, + GST_TYPE_ELEMENT, gst_pulsemixer_init_interfaces); + +static gboolean +gst_pulsemixer_interface_supported (GstImplementsInterface + * iface, GType interface_type) +{ + GstPulseMixer *this = GST_PULSEMIXER (iface); + + if (interface_type == GST_TYPE_MIXER && this->mixer) + return TRUE; + + if (interface_type == GST_TYPE_PROPERTY_PROBE && this->probe) + return TRUE; + + return FALSE; +} + +static void +gst_pulsemixer_implements_interface_init (GstImplementsInterfaceClass * klass) +{ + klass->supported = gst_pulsemixer_interface_supported; +} + +static void +gst_pulsemixer_init_interfaces (GType type) +{ + static const GInterfaceInfo implements_iface_info = { + (GInterfaceInitFunc) gst_pulsemixer_implements_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo mixer_iface_info = { + (GInterfaceInitFunc) gst_pulsemixer_mixer_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo probe_iface_info = { + (GInterfaceInitFunc) gst_pulsemixer_property_probe_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, + &implements_iface_info); + g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info); + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &probe_iface_info); +} + +static void +gst_pulsemixer_base_init (gpointer g_class) +{ + gst_element_class_set_details_simple (GST_ELEMENT_CLASS (g_class), + "PulseAudio Mixer", + "Generic/Audio", + "Control sound input and output levels for PulseAudio", + "Lennart Poettering"); +} + +static void +gst_pulsemixer_class_init (GstPulseMixerClass * g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + GObjectClass *gobject_class = G_OBJECT_CLASS (g_class); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_pulsemixer_change_state); + + gobject_class->finalize = gst_pulsemixer_finalize; + gobject_class->get_property = gst_pulsemixer_get_property; + gobject_class->set_property = gst_pulsemixer_set_property; + + g_object_class_install_property (gobject_class, + PROP_SERVER, + g_param_spec_string ("server", "Server", + "The PulseAudio server to connect to", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_DEVICE, + g_param_spec_string ("device", "Device", + "The PulseAudio sink or source to control", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_pulsemixer_init (GstPulseMixer * this, GstPulseMixerClass * g_class) +{ + this->mixer = NULL; + this->server = NULL; + this->device = NULL; + + this->probe = + gst_pulseprobe_new (G_OBJECT (this), G_OBJECT_GET_CLASS (this), + PROP_DEVICE, this->device, TRUE, TRUE); +} + +static void +gst_pulsemixer_finalize (GObject * object) +{ + GstPulseMixer *this = GST_PULSEMIXER (object); + + g_free (this->server); + g_free (this->device); + + if (this->mixer) { + gst_pulsemixer_ctrl_free (this->mixer); + this->mixer = NULL; + } + + if (this->probe) { + gst_pulseprobe_free (this->probe); + this->probe = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_pulsemixer_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstPulseMixer *this = GST_PULSEMIXER (object); + + switch (prop_id) { + case PROP_SERVER: + g_free (this->server); + this->server = g_value_dup_string (value); + + if (this->probe) + gst_pulseprobe_set_server (this->probe, this->server); + + break; + + case PROP_DEVICE: + g_free (this->device); + this->device = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_pulsemixer_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstPulseMixer *this = GST_PULSEMIXER (object); + + switch (prop_id) { + case PROP_SERVER: + g_value_set_string (value, this->server); + break; + case PROP_DEVICE: + g_value_set_string (value, this->device); + break; + case PROP_DEVICE_NAME: + if (this->mixer) { + char *t = g_strdup_printf ("%s: %s", + this->mixer->type == GST_PULSEMIXER_SINK ? "Playback" : "Capture", + this->mixer->description); + g_value_take_string (value, t); + } else + g_value_set_string (value, NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_pulsemixer_change_state (GstElement * element, GstStateChange transition) +{ + GstPulseMixer *this = GST_PULSEMIXER (element); + GstStateChangeReturn res; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!this->mixer) + this->mixer = + gst_pulsemixer_ctrl_new (G_OBJECT (this), this->server, + this->device, GST_PULSEMIXER_UNKNOWN); + break; + default: + ; + } + + res = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + if (this->mixer) { + gst_pulsemixer_ctrl_free (this->mixer); + this->mixer = NULL; + } + break; + default: + ; + } + + return res; +} diff --git a/ext/pulse/pulsemixer.h b/ext/pulse/pulsemixer.h new file mode 100644 index 0000000..7ba3d2f --- /dev/null +++ b/ext/pulse/pulsemixer.h @@ -0,0 +1,68 @@ +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __GST_PULSEMIXER_H__ +#define __GST_PULSEMIXER_H__ + +#include + +#include +#include + +#include "pulsemixerctrl.h" +#include "pulseprobe.h" + +G_BEGIN_DECLS + +#define GST_TYPE_PULSEMIXER \ + (gst_pulsemixer_get_type()) +#define GST_PULSEMIXER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSEMIXER,GstPulseMixer)) +#define GST_PULSEMIXER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSEMIXER,GstPulseMixerClass)) +#define GST_IS_PULSEMIXER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSEMIXER)) +#define GST_IS_PULSEMIXER_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSEMIXER)) + +typedef struct _GstPulseMixer GstPulseMixer; +typedef struct _GstPulseMixerClass GstPulseMixerClass; + +struct _GstPulseMixer +{ + GstElement parent; + + gchar *server, *device; + + GstPulseMixerCtrl *mixer; + GstPulseProbe *probe; +}; + +struct _GstPulseMixerClass +{ + GstElementClass parent_class; +}; + +GType gst_pulsemixer_get_type (void); + +G_END_DECLS + +#endif /* __GST_PULSEMIXER_H__ */ diff --git a/ext/pulse/pulsemixerctrl.c b/ext/pulse/pulsemixerctrl.c new file mode 100644 index 0000000..220c8d0 --- /dev/null +++ b/ext/pulse/pulsemixerctrl.c @@ -0,0 +1,640 @@ +/*-*- Mode: C; c-basic-offset: 2 -*-*/ + +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; 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 + +#include "pulsemixerctrl.h" +#include "pulsemixertrack.h" +#include "pulseutil.h" + +GST_DEBUG_CATEGORY_EXTERN (pulse_debug); +#define GST_CAT_DEFAULT pulse_debug + +static void +gst_pulsemixer_ctrl_context_state_cb (pa_context * context, void *userdata) +{ + GstPulseMixerCtrl *c = GST_PULSEMIXER_CTRL (userdata); + + /* Called from the background thread! */ + + switch (pa_context_get_state (context)) { + case PA_CONTEXT_READY: + case PA_CONTEXT_TERMINATED: + case PA_CONTEXT_FAILED: + pa_threaded_mainloop_signal (c->mainloop, 0); + break; + + case PA_CONTEXT_UNCONNECTED: + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + break; + } +} + +static void +gst_pulsemixer_ctrl_sink_info_cb (pa_context * context, const pa_sink_info * i, + int eol, void *userdata) +{ + GstPulseMixerCtrl *c = userdata; + gboolean vol_chg = FALSE; + gboolean old_mute; + + /* Called from the background thread! */ + + if (c->outstandig_queries > 0) + c->outstandig_queries--; + + if (c->ignore_queries > 0 || c->time_event) { + + if (c->ignore_queries > 0) + c->ignore_queries--; + + return; + } + + if (!i && eol < 0) { + c->operation_success = FALSE; + pa_threaded_mainloop_signal (c->mainloop, 0); + return; + } + + if (eol) + return; + + g_free (c->name); + g_free (c->description); + c->name = g_strdup (i->name); + c->description = g_strdup (i->description); + c->index = i->index; + c->channel_map = i->channel_map; + vol_chg = !pa_cvolume_equal (&c->volume, &i->volume); + c->volume = i->volume; + old_mute = c->muted; + c->muted = !!i->mute; + c->type = GST_PULSEMIXER_SINK; + + if (c->track) { + GstMixerTrackFlags flags = c->track->flags; + + flags = + (flags & ~GST_MIXER_TRACK_MUTE) | (c->muted ? GST_MIXER_TRACK_MUTE : 0); + c->track->flags = flags; + } + + c->operation_success = TRUE; + pa_threaded_mainloop_signal (c->mainloop, 0); + + if (vol_chg && c->track) { + gint volumes[PA_CHANNELS_MAX]; + gint i; + for (i = 0; i < c->volume.channels; i++) + volumes[i] = (gint) (c->volume.values[i]); + GST_LOG_OBJECT (c->object, "Sending volume change notification"); + gst_mixer_volume_changed (GST_MIXER (c->object), c->track, volumes); + } + if ((c->muted != old_mute) && c->track) { + GST_LOG_OBJECT (c->object, "Sending mute toggled notification"); + gst_mixer_mute_toggled (GST_MIXER (c->object), c->track, c->muted); + } +} + +static void +gst_pulsemixer_ctrl_source_info_cb (pa_context * context, + const pa_source_info * i, int eol, void *userdata) +{ + GstPulseMixerCtrl *c = userdata; + gboolean vol_chg = FALSE; + gboolean old_mute; + + /* Called from the background thread! */ + + if (c->outstandig_queries > 0) + c->outstandig_queries--; + + if (c->ignore_queries > 0 || c->time_event) { + + if (c->ignore_queries > 0) + c->ignore_queries--; + + return; + } + + if (!i && eol < 0) { + c->operation_success = FALSE; + pa_threaded_mainloop_signal (c->mainloop, 0); + return; + } + + if (eol) + return; + + g_free (c->name); + g_free (c->description); + c->name = g_strdup (i->name); + c->description = g_strdup (i->description); + c->index = i->index; + c->channel_map = i->channel_map; + vol_chg = !pa_cvolume_equal (&c->volume, &i->volume); + c->volume = i->volume; + old_mute = c->muted; + c->muted = !!i->mute; + c->type = GST_PULSEMIXER_SOURCE; + + if (c->track) { + GstMixerTrackFlags flags = c->track->flags; + + flags = + (flags & ~GST_MIXER_TRACK_MUTE) | (c->muted ? GST_MIXER_TRACK_MUTE : 0); + c->track->flags = flags; + } + + c->operation_success = TRUE; + pa_threaded_mainloop_signal (c->mainloop, 0); + + if (vol_chg && c->track) { + gint volumes[PA_CHANNELS_MAX]; + gint i; + for (i = 0; i < c->volume.channels; i++) + volumes[i] = (gint) (c->volume.values[i]); + GST_LOG_OBJECT (c->object, "Sending volume change notification"); + gst_mixer_volume_changed (GST_MIXER (c->object), c->track, volumes); + } + if ((c->muted != old_mute) && c->track) { + GST_LOG_OBJECT (c->object, "Sending mute toggled notification"); + gst_mixer_mute_toggled (GST_MIXER (c->object), c->track, c->muted); + } +} + +static void +gst_pulsemixer_ctrl_subscribe_cb (pa_context * context, + pa_subscription_event_type_t t, uint32_t idx, void *userdata) +{ + GstPulseMixerCtrl *c = GST_PULSEMIXER_CTRL (userdata); + pa_operation *o = NULL; + + /* Called from the background thread! */ + + if (c->index != idx) + return; + + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE) + return; + + if (c->type == GST_PULSEMIXER_SINK) + o = pa_context_get_sink_info_by_index (c->context, c->index, + gst_pulsemixer_ctrl_sink_info_cb, c); + else + o = pa_context_get_source_info_by_index (c->context, c->index, + gst_pulsemixer_ctrl_source_info_cb, c); + + if (!o) { + GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", + pa_strerror (pa_context_errno (c->context))); + return; + } + + pa_operation_unref (o); + + c->outstandig_queries++; +} + +static void +gst_pulsemixer_ctrl_success_cb (pa_context * context, int success, + void *userdata) +{ + GstPulseMixerCtrl *c = (GstPulseMixerCtrl *) userdata; + + c->operation_success = !!success; + pa_threaded_mainloop_signal (c->mainloop, 0); +} + +#define CHECK_DEAD_GOTO(c, label) \ + G_STMT_START { \ + if (!(c)->context || \ + !PA_CONTEXT_IS_GOOD(pa_context_get_state((c)->context))) { \ + GST_WARNING_OBJECT ((c)->object, "Not connected: %s", \ + (c)->context ? pa_strerror(pa_context_errno((c)->context)) : "NULL"); \ + goto label; \ + } \ + } G_STMT_END + +static gboolean +gst_pulsemixer_ctrl_open (GstPulseMixerCtrl * c) +{ + int e; + gchar *name; + pa_operation *o = NULL; + + g_assert (c); + + GST_DEBUG_OBJECT (c->object, "ctrl open"); + + c->mainloop = pa_threaded_mainloop_new (); + if (!c->mainloop) + return FALSE; + + e = pa_threaded_mainloop_start (c->mainloop); + if (e < 0) + return FALSE; + + name = gst_pulse_client_name (); + + pa_threaded_mainloop_lock (c->mainloop); + + if (!(c->context = + pa_context_new (pa_threaded_mainloop_get_api (c->mainloop), name))) { + GST_WARNING_OBJECT (c->object, "Failed to create context"); + goto unlock_and_fail; + } + + pa_context_set_state_callback (c->context, + gst_pulsemixer_ctrl_context_state_cb, c); + pa_context_set_subscribe_callback (c->context, + gst_pulsemixer_ctrl_subscribe_cb, c); + + if (pa_context_connect (c->context, c->server, 0, NULL) < 0) { + GST_WARNING_OBJECT (c->object, "Failed to connect context: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + /* Wait until the context is ready */ + while (pa_context_get_state (c->context) != PA_CONTEXT_READY) { + CHECK_DEAD_GOTO (c, unlock_and_fail); + pa_threaded_mainloop_wait (c->mainloop); + } + + /* Subscribe to events */ + if (!(o = + pa_context_subscribe (c->context, + PA_SUBSCRIPTION_MASK_SINK | PA_SUBSCRIPTION_MASK_SOURCE, + gst_pulsemixer_ctrl_success_cb, c))) { + GST_WARNING_OBJECT (c->object, "Failed to subscribe to events: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + c->operation_success = FALSE; + while (pa_operation_get_state (o) != PA_OPERATION_DONE) { + CHECK_DEAD_GOTO (c, unlock_and_fail); + pa_threaded_mainloop_wait (c->mainloop); + } + + if (!c->operation_success) { + GST_WARNING_OBJECT (c->object, "Failed to subscribe to events: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + pa_operation_unref (o); + o = NULL; + + /* Get sink info */ + + if (c->type == GST_PULSEMIXER_UNKNOWN || c->type == GST_PULSEMIXER_SINK) { + GST_WARNING_OBJECT (c->object, "Get info for '%s'", c->device); + if (!(o = + pa_context_get_sink_info_by_name (c->context, c->device, + gst_pulsemixer_ctrl_sink_info_cb, c))) { + GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + c->operation_success = FALSE; + while (pa_operation_get_state (o) != PA_OPERATION_DONE) { + CHECK_DEAD_GOTO (c, unlock_and_fail); + pa_threaded_mainloop_wait (c->mainloop); + } + + pa_operation_unref (o); + o = NULL; + + if (!c->operation_success && (c->type == GST_PULSEMIXER_SINK + || pa_context_errno (c->context) != PA_ERR_NOENTITY)) { + GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + } + + if (c->type == GST_PULSEMIXER_UNKNOWN || c->type == GST_PULSEMIXER_SOURCE) { + if (!(o = + pa_context_get_source_info_by_name (c->context, c->device, + gst_pulsemixer_ctrl_source_info_cb, c))) { + GST_WARNING_OBJECT (c->object, "Failed to get source info: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + c->operation_success = FALSE; + while (pa_operation_get_state (o) != PA_OPERATION_DONE) { + CHECK_DEAD_GOTO (c, unlock_and_fail); + pa_threaded_mainloop_wait (c->mainloop); + } + + pa_operation_unref (o); + o = NULL; + + if (!c->operation_success) { + GST_WARNING_OBJECT (c->object, "Failed to get source info: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + } + + g_assert (c->type != GST_PULSEMIXER_UNKNOWN); + + c->track = gst_pulsemixer_track_new (c); + c->tracklist = g_list_append (c->tracklist, c->track); + + pa_threaded_mainloop_unlock (c->mainloop); + g_free (name); + + return TRUE; + +unlock_and_fail: + + if (o) + pa_operation_unref (o); + + if (c->mainloop) + pa_threaded_mainloop_unlock (c->mainloop); + + g_free (name); + + return FALSE; +} + +static void +gst_pulsemixer_ctrl_close (GstPulseMixerCtrl * c) +{ + g_assert (c); + + GST_DEBUG_OBJECT (c->object, "ctrl close"); + + if (c->mainloop) + pa_threaded_mainloop_stop (c->mainloop); + + if (c->context) { + pa_context_disconnect (c->context); + pa_context_unref (c->context); + c->context = NULL; + } + + if (c->mainloop) { + pa_threaded_mainloop_free (c->mainloop); + c->mainloop = NULL; + c->time_event = NULL; + } + + if (c->tracklist) { + g_list_free (c->tracklist); + c->tracklist = NULL; + } + + if (c->track) { + GST_PULSEMIXER_TRACK (c->track)->control = NULL; + g_object_unref (c->track); + c->track = NULL; + } +} + +GstPulseMixerCtrl * +gst_pulsemixer_ctrl_new (GObject * object, const gchar * server, + const gchar * device, GstPulseMixerType type) +{ + GstPulseMixerCtrl *c = NULL; + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE ((object), + GST_TYPE_MIXER), c); + + GST_DEBUG_OBJECT (object, "new mixer ctrl for %s", device); + c = g_new (GstPulseMixerCtrl, 1); + c->object = g_object_ref (object); + c->tracklist = NULL; + c->server = g_strdup (server); + c->device = g_strdup (device); + c->mainloop = NULL; + c->context = NULL; + c->track = NULL; + c->ignore_queries = c->outstandig_queries = 0; + + pa_cvolume_mute (&c->volume, PA_CHANNELS_MAX); + pa_channel_map_init (&c->channel_map); + c->muted = FALSE; + c->index = PA_INVALID_INDEX; + c->type = type; + c->name = NULL; + c->description = NULL; + + c->time_event = NULL; + c->update_volume = c->update_mute = FALSE; + + if (!(gst_pulsemixer_ctrl_open (c))) { + gst_pulsemixer_ctrl_free (c); + return NULL; + } + + return c; +} + +void +gst_pulsemixer_ctrl_free (GstPulseMixerCtrl * c) +{ + g_assert (c); + + gst_pulsemixer_ctrl_close (c); + + g_free (c->server); + g_free (c->device); + g_free (c->name); + g_free (c->description); + g_object_unref (c->object); + g_free (c); +} + +const GList * +gst_pulsemixer_ctrl_list_tracks (GstPulseMixerCtrl * c) +{ + g_assert (c); + + return c->tracklist; +} + +static void +gst_pulsemixer_ctrl_timeout_event (pa_mainloop_api * a, pa_time_event * e, + const struct timeval *tv, void *userdata) +{ + pa_operation *o; + GstPulseMixerCtrl *c = GST_PULSEMIXER_CTRL (userdata); + + if (c->update_volume) { + if (c->type == GST_PULSEMIXER_SINK) + o = pa_context_set_sink_volume_by_index (c->context, c->index, &c->volume, + NULL, NULL); + else + o = pa_context_set_source_volume_by_index (c->context, c->index, + &c->volume, NULL, NULL); + + if (!o) + GST_WARNING_OBJECT (c->object, "Failed to set device volume: %s", + pa_strerror (pa_context_errno (c->context))); + else + pa_operation_unref (o); + + c->update_volume = FALSE; + } + + if (c->update_mute) { + if (c->type == GST_PULSEMIXER_SINK) + o = pa_context_set_sink_mute_by_index (c->context, c->index, c->muted, + NULL, NULL); + else + o = pa_context_set_source_mute_by_index (c->context, c->index, c->muted, + NULL, NULL); + + if (!o) + GST_WARNING_OBJECT (c->object, "Failed to set device mute: %s", + pa_strerror (pa_context_errno (c->context))); + else + pa_operation_unref (o); + + c->update_mute = FALSE; + } + + /* Make sure that all outstanding queries are being ignored */ + c->ignore_queries = c->outstandig_queries; + + g_assert (e == c->time_event); + a->time_free (e); + c->time_event = NULL; +} + +#define UPDATE_DELAY 50000 + +static void +restart_time_event (GstPulseMixerCtrl * c) +{ + struct timeval tv; + pa_mainloop_api *api; + + g_assert (c); + + if (c->time_event) + return; + + /* Updating the volume too often will cause a lot of traffic + * when accessing a networked server. Therefore we make sure + * to update the volume only once every 50ms */ + + api = pa_threaded_mainloop_get_api (c->mainloop); + + c->time_event = + api->time_new (api, pa_timeval_add (pa_gettimeofday (&tv), UPDATE_DELAY), + gst_pulsemixer_ctrl_timeout_event, c); +} + +void +gst_pulsemixer_ctrl_set_volume (GstPulseMixerCtrl * c, GstMixerTrack * track, + gint * volumes) +{ + pa_cvolume v; + int i; + + g_assert (c); + g_assert (track == c->track); + + pa_threaded_mainloop_lock (c->mainloop); + + for (i = 0; i < c->channel_map.channels; i++) + v.values[i] = (pa_volume_t) volumes[i]; + + v.channels = c->channel_map.channels; + + c->volume = v; + c->update_volume = TRUE; + + restart_time_event (c); + + pa_threaded_mainloop_unlock (c->mainloop); +} + +void +gst_pulsemixer_ctrl_get_volume (GstPulseMixerCtrl * c, GstMixerTrack * track, + gint * volumes) +{ + int i; + + g_assert (c); + g_assert (track == c->track); + + pa_threaded_mainloop_lock (c->mainloop); + + for (i = 0; i < c->channel_map.channels; i++) + volumes[i] = c->volume.values[i]; + + pa_threaded_mainloop_unlock (c->mainloop); +} + +void +gst_pulsemixer_ctrl_set_record (GstPulseMixerCtrl * c, GstMixerTrack * track, + gboolean record) +{ + g_assert (c); + g_assert (track == c->track); +} + +void +gst_pulsemixer_ctrl_set_mute (GstPulseMixerCtrl * c, GstMixerTrack * track, + gboolean mute) +{ + g_assert (c); + g_assert (track == c->track); + + pa_threaded_mainloop_lock (c->mainloop); + + c->muted = mute; + c->update_mute = TRUE; + + if (c->track) { + GstMixerTrackFlags flags = c->track->flags; + + flags = + (flags & ~GST_MIXER_TRACK_MUTE) | (c->muted ? GST_MIXER_TRACK_MUTE : 0); + c->track->flags = flags; + } + + restart_time_event (c); + + pa_threaded_mainloop_unlock (c->mainloop); +} + +GstMixerFlags +gst_pulsemixer_ctrl_get_mixer_flags (GstPulseMixerCtrl * mixer) +{ + return GST_MIXER_FLAG_AUTO_NOTIFICATIONS; +} diff --git a/ext/pulse/pulsemixerctrl.h b/ext/pulse/pulsemixerctrl.h new file mode 100644 index 0000000..c1d1e85 --- /dev/null +++ b/ext/pulse/pulsemixerctrl.h @@ -0,0 +1,175 @@ +/*-*- Mode: C; c-basic-offset: 2 -*-*/ + +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __GST_PULSEMIXERCTRL_H__ +#define __GST_PULSEMIXERCTRL_H__ + +#include +#include + +#include +#include + +G_BEGIN_DECLS + +#define GST_PULSEMIXER_CTRL(obj) ((GstPulseMixerCtrl*)(obj)) +typedef struct _GstPulseMixerCtrl GstPulseMixerCtrl; + +typedef enum +{ + GST_PULSEMIXER_UNKNOWN, + GST_PULSEMIXER_SINK, + GST_PULSEMIXER_SOURCE +} GstPulseMixerType; + +struct _GstPulseMixerCtrl +{ + GObject *object; + + GList *tracklist; + + gchar *server, *device; + + pa_threaded_mainloop *mainloop; + pa_context *context; + + gchar *name, *description; + pa_channel_map channel_map; + + pa_cvolume volume; + gboolean muted:1; + + gboolean update_volume:1; + gboolean update_mute:1; + + gboolean operation_success:1; + + guint32 index; + GstPulseMixerType type; + + GstMixerTrack *track; + + pa_time_event *time_event; + + int outstandig_queries; + int ignore_queries; + +}; + +GstPulseMixerCtrl *gst_pulsemixer_ctrl_new (GObject *object, const gchar * server, + const gchar * device, GstPulseMixerType type); +void gst_pulsemixer_ctrl_free (GstPulseMixerCtrl * mixer); + +const GList *gst_pulsemixer_ctrl_list_tracks (GstPulseMixerCtrl * mixer); + +void gst_pulsemixer_ctrl_set_volume (GstPulseMixerCtrl * mixer, + GstMixerTrack * track, gint * volumes); +void gst_pulsemixer_ctrl_get_volume (GstPulseMixerCtrl * mixer, + GstMixerTrack * track, gint * volumes); +void gst_pulsemixer_ctrl_set_mute (GstPulseMixerCtrl * mixer, + GstMixerTrack * track, gboolean mute); +void gst_pulsemixer_ctrl_set_record (GstPulseMixerCtrl * mixer, + GstMixerTrack * track, gboolean record); +GstMixerFlags gst_pulsemixer_ctrl_get_mixer_flags (GstPulseMixerCtrl * mixer); + +#define GST_IMPLEMENT_PULSEMIXER_CTRL_METHODS(Type, interface_as_function) \ +static const GList* \ +interface_as_function ## _list_tracks (GstMixer * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_val_if_fail (this != NULL, NULL); \ + g_return_val_if_fail (this->mixer != NULL, NULL); \ + \ + return gst_pulsemixer_ctrl_list_tracks (this->mixer); \ +} \ +static void \ +interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track, \ + gint * volumes) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_pulsemixer_ctrl_set_volume (this->mixer, track, volumes); \ +} \ +static void \ +interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track, \ + gint * volumes) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_pulsemixer_ctrl_get_volume (this->mixer, track, volumes); \ +} \ +static void \ +interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track, \ + gboolean record) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_pulsemixer_ctrl_set_record (this->mixer, track, record); \ +} \ +static void \ +interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track, \ + gboolean mute) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_pulsemixer_ctrl_set_mute (this->mixer, track, mute); \ +} \ +static GstMixerFlags \ +interface_as_function ## _get_mixer_flags (GstMixer * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_val_if_fail (this != NULL, GST_MIXER_FLAG_NONE); \ + g_return_val_if_fail (this->mixer != NULL, GST_MIXER_FLAG_NONE); \ + \ + return gst_pulsemixer_ctrl_get_mixer_flags (this->mixer); \ +} \ +static void \ +interface_as_function ## _mixer_interface_init (GstMixerClass * klass) \ +{ \ + GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; \ + \ + klass->list_tracks = interface_as_function ## _list_tracks; \ + klass->set_volume = interface_as_function ## _set_volume; \ + klass->get_volume = interface_as_function ## _get_volume; \ + klass->set_mute = interface_as_function ## _set_mute; \ + klass->set_record = interface_as_function ## _set_record; \ + klass->get_mixer_flags = interface_as_function ## _get_mixer_flags; \ +} + +G_END_DECLS + +#endif diff --git a/ext/pulse/pulsemixertrack.c b/ext/pulse/pulsemixertrack.c new file mode 100644 index 0000000..981351c --- /dev/null +++ b/ext/pulse/pulsemixertrack.c @@ -0,0 +1,67 @@ +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; 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 + +#include "pulsemixertrack.h" + +GST_DEBUG_CATEGORY_EXTERN (pulse_debug); +#define GST_CAT_DEFAULT pulse_debug + +G_DEFINE_TYPE (GstPulseMixerTrack, gst_pulsemixer_track, GST_TYPE_MIXER_TRACK); + +static void +gst_pulsemixer_track_class_init (GstPulseMixerTrackClass * klass) +{ +} + +static void +gst_pulsemixer_track_init (GstPulseMixerTrack * track) +{ + track->control = NULL; +} + +GstMixerTrack * +gst_pulsemixer_track_new (GstPulseMixerCtrl * control) +{ + GstPulseMixerTrack *pulsetrack; + GstMixerTrack *track; + + pulsetrack = g_object_new (GST_TYPE_PULSEMIXER_TRACK, NULL); + pulsetrack->control = control; + + track = GST_MIXER_TRACK (pulsetrack); + track->label = g_strdup ("Master"); + track->num_channels = control->channel_map.channels; + track->flags = + (control->type == + GST_PULSEMIXER_SINK ? GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_MASTER : + GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_RECORD) | (control->muted ? + GST_MIXER_TRACK_MUTE : 0); + track->min_volume = PA_VOLUME_MUTED; + track->max_volume = PA_VOLUME_NORM; + + return track; +} diff --git a/ext/pulse/pulsemixertrack.h b/ext/pulse/pulsemixertrack.h new file mode 100644 index 0000000..5c958ed --- /dev/null +++ b/ext/pulse/pulsemixertrack.h @@ -0,0 +1,60 @@ +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __GST_PULSEMIXERTRACK_H__ +#define __GST_PULSEMIXERTRACK_H__ + +#include + +#include "pulsemixerctrl.h" + +G_BEGIN_DECLS + +#define GST_TYPE_PULSEMIXER_TRACK \ + (gst_pulsemixer_track_get_type()) +#define GST_PULSEMIXER_TRACK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_PULSEMIXER_TRACK, GstPulseMixerTrack)) +#define GST_PULSEMIXER_TRACK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_PULSEMIXER_TRACK, GstPulseMixerTrackClass)) +#define GST_IS_PULSEMIXER_TRACK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_PULSEMIXER_TRACK)) +#define GST_IS_PULSEMIXER_TRACK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_PULSEMIXER_TRACK)) + + +typedef struct _GstPulseMixerTrack +{ + GstMixerTrack parent; + GstPulseMixerCtrl *control; +} GstPulseMixerTrack; + +typedef struct _GstPulseMixerTrackClass +{ + GstMixerTrackClass parent; +} GstPulseMixerTrackClass; + +GType gst_pulsemixer_track_get_type (void); + +GstMixerTrack *gst_pulsemixer_track_new (GstPulseMixerCtrl * control); + +G_END_DECLS + +#endif diff --git a/ext/pulse/pulseprobe.c b/ext/pulse/pulseprobe.c new file mode 100644 index 0000000..6ebbfb2 --- /dev/null +++ b/ext/pulse/pulseprobe.c @@ -0,0 +1,416 @@ +/*-*- Mode: C; c-basic-offset: 2 -*-*/ + +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; 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 "pulseprobe.h" +#include "pulseutil.h" + +GST_DEBUG_CATEGORY_EXTERN (pulse_debug); +#define GST_CAT_DEFAULT pulse_debug + +static void +gst_pulseprobe_context_state_cb (pa_context * context, void *userdata) +{ + GstPulseProbe *c = (GstPulseProbe *) userdata; + + /* Called from the background thread! */ + + switch (pa_context_get_state (context)) { + case PA_CONTEXT_READY: + case PA_CONTEXT_TERMINATED: + case PA_CONTEXT_FAILED: + pa_threaded_mainloop_signal (c->mainloop, 0); + break; + + case PA_CONTEXT_UNCONNECTED: + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + break; + } +} + +static void +gst_pulseprobe_sink_info_cb (pa_context * context, const pa_sink_info * i, + int eol, void *userdata) +{ + GstPulseProbe *c = (GstPulseProbe *) userdata; + + /* Called from the background thread! */ + + if (eol || !i) { + c->operation_success = eol > 0; + pa_threaded_mainloop_signal (c->mainloop, 0); + } + + if (i) + c->devices = g_list_append (c->devices, g_strdup (i->name)); + +} + +static void +gst_pulseprobe_source_info_cb (pa_context * context, const pa_source_info * i, + int eol, void *userdata) +{ + GstPulseProbe *c = (GstPulseProbe *) userdata; + + /* Called from the background thread! */ + + if (eol || !i) { + c->operation_success = eol > 0; + pa_threaded_mainloop_signal (c->mainloop, 0); + } + + if (i) + c->devices = g_list_append (c->devices, g_strdup (i->name)); +} + +static void +gst_pulseprobe_invalidate (GstPulseProbe * c) +{ + g_list_foreach (c->devices, (GFunc) g_free, NULL); + g_list_free (c->devices); + c->devices = NULL; + c->devices_valid = FALSE; +} + +static gboolean +gst_pulseprobe_open (GstPulseProbe * c) +{ + int e; + gchar *name; + + g_assert (c); + + GST_DEBUG_OBJECT (c->object, "probe open"); + + c->mainloop = pa_threaded_mainloop_new (); + if (!c->mainloop) + return FALSE; + + e = pa_threaded_mainloop_start (c->mainloop); + if (e < 0) + return FALSE; + + name = gst_pulse_client_name (); + + pa_threaded_mainloop_lock (c->mainloop); + + if (!(c->context = + pa_context_new (pa_threaded_mainloop_get_api (c->mainloop), name))) { + GST_WARNING_OBJECT (c->object, "Failed to create context"); + goto unlock_and_fail; + } + + pa_context_set_state_callback (c->context, gst_pulseprobe_context_state_cb, + c); + + if (pa_context_connect (c->context, c->server, 0, NULL) < 0) { + GST_WARNING_OBJECT (c->object, "Failed to connect context: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + for (;;) { + pa_context_state_t state; + + state = pa_context_get_state (c->context); + + if (!PA_CONTEXT_IS_GOOD (state)) { + GST_WARNING_OBJECT (c->object, "Failed to connect context: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + if (state == PA_CONTEXT_READY) + break; + + /* Wait until the context is ready */ + pa_threaded_mainloop_wait (c->mainloop); + } + + pa_threaded_mainloop_unlock (c->mainloop); + g_free (name); + + gst_pulseprobe_invalidate (c); + + return TRUE; + +unlock_and_fail: + + if (c->mainloop) + pa_threaded_mainloop_unlock (c->mainloop); + + g_free (name); + + return FALSE; +} + +static gboolean +gst_pulseprobe_is_dead (GstPulseProbe * pulseprobe) +{ + + if (!pulseprobe->context || + !PA_CONTEXT_IS_GOOD (pa_context_get_state (pulseprobe->context))) { + const gchar *err_str = + pulseprobe->context ? + pa_strerror (pa_context_errno (pulseprobe->context)) : NULL; + + GST_ELEMENT_ERROR ((pulseprobe), RESOURCE, FAILED, + ("Disconnected: %s", err_str), (NULL)); + return TRUE; + } + + return FALSE; +} + +static gboolean +gst_pulseprobe_enumerate (GstPulseProbe * c) +{ + pa_operation *o = NULL; + + GST_DEBUG_OBJECT (c->object, "probe enumerate"); + + pa_threaded_mainloop_lock (c->mainloop); + + if (c->enumerate_sinks) { + /* Get sink info */ + + if (!(o = + pa_context_get_sink_info_list (c->context, + gst_pulseprobe_sink_info_cb, c))) { + GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + c->operation_success = FALSE; + + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + + if (gst_pulseprobe_is_dead (c)) + goto unlock_and_fail; + + pa_threaded_mainloop_wait (c->mainloop); + } + + if (!c->operation_success) { + GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + pa_operation_unref (o); + o = NULL; + } + + if (c->enumerate_sources) { + /* Get source info */ + + if (!(o = + pa_context_get_source_info_list (c->context, + gst_pulseprobe_source_info_cb, c))) { + GST_WARNING_OBJECT (c->object, "Failed to get source info: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + c->operation_success = FALSE; + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + + if (gst_pulseprobe_is_dead (c)) + goto unlock_and_fail; + + pa_threaded_mainloop_wait (c->mainloop); + } + + if (!c->operation_success) { + GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", + pa_strerror (pa_context_errno (c->context))); + goto unlock_and_fail; + } + + pa_operation_unref (o); + o = NULL; + } + + c->devices_valid = TRUE; + + pa_threaded_mainloop_unlock (c->mainloop); + + return TRUE; + +unlock_and_fail: + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (c->mainloop); + + return FALSE; +} + +static void +gst_pulseprobe_close (GstPulseProbe * c) +{ + g_assert (c); + + GST_DEBUG_OBJECT (c->object, "probe close"); + + if (c->mainloop) + pa_threaded_mainloop_stop (c->mainloop); + + if (c->context) { + pa_context_disconnect (c->context); + pa_context_set_state_callback (c->context, NULL, NULL); + pa_context_unref (c->context); + c->context = NULL; + } + + if (c->mainloop) { + pa_threaded_mainloop_free (c->mainloop); + c->mainloop = NULL; + } +} + +GstPulseProbe * +gst_pulseprobe_new (GObject * object, GObjectClass * klass, + guint prop_id, const gchar * server, gboolean sinks, gboolean sources) +{ + GstPulseProbe *c = NULL; + + c = g_new (GstPulseProbe, 1); + c->object = object; /* We don't inc the ref counter here to avoid a ref loop */ + c->server = g_strdup (server); + c->enumerate_sinks = sinks; + c->enumerate_sources = sources; + + c->mainloop = NULL; + c->context = NULL; + + c->prop_id = prop_id; + c->properties = + g_list_append (NULL, g_object_class_find_property (klass, "device")); + + c->devices = NULL; + c->devices_valid = FALSE; + + c->operation_success = FALSE; + + return c; +} + +void +gst_pulseprobe_free (GstPulseProbe * c) +{ + g_assert (c); + + gst_pulseprobe_close (c); + + g_list_free (c->properties); + g_free (c->server); + + g_list_foreach (c->devices, (GFunc) g_free, NULL); + g_list_free (c->devices); + + g_free (c); +} + +const GList * +gst_pulseprobe_get_properties (GstPulseProbe * c) +{ + return c->properties; +} + +gboolean +gst_pulseprobe_needs_probe (GstPulseProbe * c, guint prop_id, + const GParamSpec * pspec) +{ + + if (prop_id == c->prop_id) + return !c->devices_valid; + + G_OBJECT_WARN_INVALID_PROPERTY_ID (c->object, prop_id, pspec); + return FALSE; +} + +void +gst_pulseprobe_probe_property (GstPulseProbe * c, guint prop_id, + const GParamSpec * pspec) +{ + + if (prop_id != c->prop_id) { + G_OBJECT_WARN_INVALID_PROPERTY_ID (c->object, prop_id, pspec); + return; + } + + if (gst_pulseprobe_open (c)) { + gst_pulseprobe_enumerate (c); + gst_pulseprobe_close (c); + } +} + +GValueArray * +gst_pulseprobe_get_values (GstPulseProbe * c, guint prop_id, + const GParamSpec * pspec) +{ + GValueArray *array; + GValue value = { + 0 + }; + GList *item; + + if (prop_id != c->prop_id) { + G_OBJECT_WARN_INVALID_PROPERTY_ID (c->object, prop_id, pspec); + return NULL; + } + + if (!c->devices_valid) + return NULL; + + array = g_value_array_new (g_list_length (c->devices)); + g_value_init (&value, G_TYPE_STRING); + for (item = c->devices; item != NULL; item = item->next) { + GST_WARNING_OBJECT (c->object, "device found: %s", + (const gchar *) item->data); + g_value_set_string (&value, (const gchar *) item->data); + g_value_array_append (array, &value); + } + g_value_unset (&value); + + return array; +} + +void +gst_pulseprobe_set_server (GstPulseProbe * c, const gchar * server) +{ + g_assert (c); + + gst_pulseprobe_invalidate (c); + + g_free (c->server); + c->server = g_strdup (server); +} diff --git a/ext/pulse/pulseprobe.h b/ext/pulse/pulseprobe.h new file mode 100644 index 0000000..28cdbb8 --- /dev/null +++ b/ext/pulse/pulseprobe.h @@ -0,0 +1,127 @@ +/*-*- Mode: C; c-basic-offset: 2 -*-*/ + +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __GST_PULSEPROBE_H__ +#define __GST_PULSEPROBE_H__ + +#include + +G_BEGIN_DECLS + +#include +#include +#include + +typedef struct _GstPulseProbe GstPulseProbe; + +struct _GstPulseProbe +{ + GObject *object; + gchar *server; + + GList *devices; + gboolean devices_valid:1; + + gboolean operation_success:1; + + gboolean enumerate_sinks:1; + gboolean enumerate_sources:1; + + pa_threaded_mainloop *mainloop; + pa_context *context; + + GList *properties; + guint prop_id; +}; + +GstPulseProbe *gst_pulseprobe_new (GObject *object, GObjectClass * klass, + guint prop_id, const gchar * server, gboolean sinks, gboolean sources); +void gst_pulseprobe_free (GstPulseProbe * probe); + +const GList *gst_pulseprobe_get_properties (GstPulseProbe * probe); + +gboolean gst_pulseprobe_needs_probe (GstPulseProbe * probe, guint prop_id, + const GParamSpec * pspec); +void gst_pulseprobe_probe_property (GstPulseProbe * probe, guint prop_id, + const GParamSpec * pspec); +GValueArray *gst_pulseprobe_get_values (GstPulseProbe * probe, guint prop_id, + const GParamSpec * pspec); + +void gst_pulseprobe_set_server (GstPulseProbe * c, const gchar * server); + +#define GST_IMPLEMENT_PULSEPROBE_METHODS(Type, interface_as_function) \ +static const GList* \ +interface_as_function ## _get_properties(GstPropertyProbe * probe) \ +{ \ + Type *this = (Type*) probe; \ + \ + g_return_val_if_fail(this != NULL, NULL); \ + g_return_val_if_fail(this->probe != NULL, NULL); \ + \ + return gst_pulseprobe_get_properties(this->probe); \ +} \ +static gboolean \ +interface_as_function ## _needs_probe(GstPropertyProbe *probe, guint prop_id, \ + const GParamSpec *pspec) \ +{ \ + Type *this = (Type*) probe; \ + \ + g_return_val_if_fail(this != NULL, FALSE); \ + g_return_val_if_fail(this->probe != NULL, FALSE); \ + \ + return gst_pulseprobe_needs_probe(this->probe, prop_id, pspec); \ +} \ +static void \ +interface_as_function ## _probe_property(GstPropertyProbe *probe, \ + guint prop_id, const GParamSpec *pspec) \ +{ \ + Type *this = (Type*) probe; \ + \ + g_return_if_fail(this != NULL); \ + g_return_if_fail(this->probe != NULL); \ + \ + gst_pulseprobe_probe_property(this->probe, prop_id, pspec); \ +} \ +static GValueArray* \ +interface_as_function ## _get_values(GstPropertyProbe *probe, guint prop_id, \ + const GParamSpec *pspec) \ +{ \ + Type *this = (Type*) probe; \ + \ + g_return_val_if_fail(this != NULL, NULL); \ + g_return_val_if_fail(this->probe != NULL, NULL); \ + \ + return gst_pulseprobe_get_values(this->probe, prop_id, pspec); \ +} \ +static void \ +interface_as_function ## _property_probe_interface_init(GstPropertyProbeInterface *iface)\ +{ \ + iface->get_properties = interface_as_function ## _get_properties; \ + iface->needs_probe = interface_as_function ## _needs_probe; \ + iface->probe_property = interface_as_function ## _probe_property; \ + iface->get_values = interface_as_function ## _get_values; \ +} + +G_END_DECLS + +#endif diff --git a/ext/pulse/pulsesink.c b/ext/pulse/pulsesink.c new file mode 100644 index 0000000..11e9c89 --- /dev/null +++ b/ext/pulse/pulsesink.c @@ -0,0 +1,3024 @@ +/*-*- Mode: C; c-basic-offset: 2 -*-*/ + +/* GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * (c) 2009 Wim Taymans + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +/** + * SECTION:element-pulsesink + * @see_also: pulsesrc, pulsemixer + * + * This element outputs audio to a + * PulseAudio sound server. + * + * + * Example pipelines + * |[ + * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! pulsesink + * ]| Play an Ogg/Vorbis file. + * |[ + * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.4 ! pulsesink + * ]| Play a 440Hz sine wave. + * |[ + * gst-launch -v audiotestsrc ! pulsesink stream-properties="props,media.title=test" + * ]| Play a sine wave and set a stream property. The property can be checked + * with "pactl list". + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include +#include +#include +#include + +#include /* only used for GST_PLUGINS_BASE_VERSION_* */ + +#include + +#include "pulsesink.h" +#include "pulseutil.h" + +GST_DEBUG_CATEGORY_EXTERN (pulse_debug); +#define GST_CAT_DEFAULT pulse_debug + +#define DEFAULT_SERVER NULL +#define DEFAULT_DEVICE NULL +#define DEFAULT_DEVICE_NAME NULL +#define DEFAULT_VOLUME 1.0 +#define DEFAULT_MUTE FALSE +#define MAX_VOLUME 10.0 + +enum +{ + PROP_0, + PROP_SERVER, + PROP_DEVICE, + PROP_DEVICE_NAME, + PROP_VOLUME, + PROP_MUTE, + PROP_CLIENT, + PROP_STREAM_PROPERTIES, + PROP_LAST +}; + +#define GST_TYPE_PULSERING_BUFFER \ + (gst_pulseringbuffer_get_type()) +#define GST_PULSERING_BUFFER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSERING_BUFFER,GstPulseRingBuffer)) +#define GST_PULSERING_BUFFER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSERING_BUFFER,GstPulseRingBufferClass)) +#define GST_PULSERING_BUFFER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PULSERING_BUFFER, GstPulseRingBufferClass)) +#define GST_PULSERING_BUFFER_CAST(obj) \ + ((GstPulseRingBuffer *)obj) +#define GST_IS_PULSERING_BUFFER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSERING_BUFFER)) +#define GST_IS_PULSERING_BUFFER_CLASS(klass)\ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSERING_BUFFER)) + +typedef struct _GstPulseRingBuffer GstPulseRingBuffer; +typedef struct _GstPulseRingBufferClass GstPulseRingBufferClass; + +typedef struct _GstPulseContext GstPulseContext; + +/* Store the PA contexts in a hash table to allow easy sharing among + * multiple instances of the sink. Keys are $context_name@$server_name + * (strings) and values should be GstPulseContext pointers. + */ +struct _GstPulseContext +{ + pa_context *context; + GSList *ring_buffers; +}; + +static GHashTable *gst_pulse_shared_contexts = NULL; + +/* use one static main-loop for all instances + * this is needed to make the context sharing work as the contexts are + * released when releasing their parent main-loop + */ +static pa_threaded_mainloop *mainloop = NULL; +static guint mainloop_ref_ct = 0; + +/* lock for access to shared resources */ +static GMutex *pa_shared_resource_mutex = NULL; + +/* We keep a custom ringbuffer that is backed up by data allocated by + * pulseaudio. We must also overide the commit function to write into + * pulseaudio memory instead. */ +struct _GstPulseRingBuffer +{ + GstRingBuffer object; + + gchar *context_name; + gchar *stream_name; + + pa_context *context; + pa_stream *stream; + +#ifdef HAVE_PULSE_1_0 + pa_format_info *format; + guint channels; + gboolean is_pcm; +#else + pa_sample_spec sample_spec; +#endif + + void *m_data; + size_t m_towrite; + size_t m_writable; + gint64 m_offset; + gint64 m_lastoffset; + + gboolean corked:1; + gboolean in_commit:1; + gboolean paused:1; +}; +struct _GstPulseRingBufferClass +{ + GstRingBufferClass parent_class; +}; + +static GType gst_pulseringbuffer_get_type (void); +static void gst_pulseringbuffer_finalize (GObject * object); + +static GstRingBufferClass *ring_parent_class = NULL; + +static gboolean gst_pulseringbuffer_open_device (GstRingBuffer * buf); +static gboolean gst_pulseringbuffer_close_device (GstRingBuffer * buf); +static gboolean gst_pulseringbuffer_acquire (GstRingBuffer * buf, + GstRingBufferSpec * spec); +static gboolean gst_pulseringbuffer_release (GstRingBuffer * buf); +static gboolean gst_pulseringbuffer_start (GstRingBuffer * buf); +static gboolean gst_pulseringbuffer_pause (GstRingBuffer * buf); +static gboolean gst_pulseringbuffer_stop (GstRingBuffer * buf); +static void gst_pulseringbuffer_clear (GstRingBuffer * buf); +static guint gst_pulseringbuffer_commit (GstRingBuffer * buf, + guint64 * sample, guchar * data, gint in_samples, gint out_samples, + gint * accum); + +G_DEFINE_TYPE (GstPulseRingBuffer, gst_pulseringbuffer, GST_TYPE_RING_BUFFER); + +static void +gst_pulsesink_init_contexts (void) +{ + g_assert (pa_shared_resource_mutex == NULL); + pa_shared_resource_mutex = g_mutex_new (); + gst_pulse_shared_contexts = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); +} + +static void +gst_pulseringbuffer_class_init (GstPulseRingBufferClass * klass) +{ + GObjectClass *gobject_class; + GstRingBufferClass *gstringbuffer_class; + + gobject_class = (GObjectClass *) klass; + gstringbuffer_class = (GstRingBufferClass *) klass; + + ring_parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_pulseringbuffer_finalize; + + gstringbuffer_class->open_device = + GST_DEBUG_FUNCPTR (gst_pulseringbuffer_open_device); + gstringbuffer_class->close_device = + GST_DEBUG_FUNCPTR (gst_pulseringbuffer_close_device); + gstringbuffer_class->acquire = + GST_DEBUG_FUNCPTR (gst_pulseringbuffer_acquire); + gstringbuffer_class->release = + GST_DEBUG_FUNCPTR (gst_pulseringbuffer_release); + gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_start); + gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_pause); + gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_start); + gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_stop); + gstringbuffer_class->clear_all = + GST_DEBUG_FUNCPTR (gst_pulseringbuffer_clear); + + gstringbuffer_class->commit = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_commit); +} + +static void +gst_pulseringbuffer_init (GstPulseRingBuffer * pbuf) +{ + pbuf->stream_name = NULL; + pbuf->context = NULL; + pbuf->stream = NULL; + +#ifdef HAVE_PULSE_1_0 + pbuf->format = NULL; + pbuf->channels = 0; + pbuf->is_pcm = FALSE; +#else + pa_sample_spec_init (&pbuf->sample_spec); +#endif + + pbuf->m_data = NULL; + pbuf->m_towrite = 0; + pbuf->m_writable = 0; + pbuf->m_offset = 0; + pbuf->m_lastoffset = 0; + + pbuf->corked = TRUE; + pbuf->in_commit = FALSE; + pbuf->paused = FALSE; +} + +static void +gst_pulsering_destroy_stream (GstPulseRingBuffer * pbuf) +{ + if (pbuf->stream) { + + if (pbuf->m_data) { + /* drop shm memory buffer */ + pa_stream_cancel_write (pbuf->stream); + + /* reset internal variables */ + pbuf->m_data = NULL; + pbuf->m_towrite = 0; + pbuf->m_writable = 0; + pbuf->m_offset = 0; + pbuf->m_lastoffset = 0; + } +#ifdef HAVE_PULSE_1_0 + if (pbuf->format) { + pa_format_info_free (pbuf->format); + pbuf->format = NULL; + pbuf->channels = 0; + pbuf->is_pcm = FALSE; + } +#endif + + pa_stream_disconnect (pbuf->stream); + + /* Make sure we don't get any further callbacks */ + pa_stream_set_state_callback (pbuf->stream, NULL, NULL); + pa_stream_set_write_callback (pbuf->stream, NULL, NULL); + pa_stream_set_underflow_callback (pbuf->stream, NULL, NULL); + pa_stream_set_overflow_callback (pbuf->stream, NULL, NULL); + + pa_stream_unref (pbuf->stream); + pbuf->stream = NULL; + } + + g_free (pbuf->stream_name); + pbuf->stream_name = NULL; +} + +static void +gst_pulsering_destroy_context (GstPulseRingBuffer * pbuf) +{ + g_mutex_lock (pa_shared_resource_mutex); + + GST_DEBUG_OBJECT (pbuf, "destroying ringbuffer %p", pbuf); + + gst_pulsering_destroy_stream (pbuf); + + if (pbuf->context) { + pa_context_unref (pbuf->context); + pbuf->context = NULL; + } + + if (pbuf->context_name) { + GstPulseContext *pctx; + + pctx = g_hash_table_lookup (gst_pulse_shared_contexts, pbuf->context_name); + + GST_DEBUG_OBJECT (pbuf, "releasing context with name %s, pbuf=%p, pctx=%p", + pbuf->context_name, pbuf, pctx); + + if (pctx) { + pctx->ring_buffers = g_slist_remove (pctx->ring_buffers, pbuf); + if (pctx->ring_buffers == NULL) { + GST_DEBUG_OBJECT (pbuf, + "destroying final context with name %s, pbuf=%p, pctx=%p", + pbuf->context_name, pbuf, pctx); + + pa_context_disconnect (pctx->context); + + /* Make sure we don't get any further callbacks */ + pa_context_set_state_callback (pctx->context, NULL, NULL); + pa_context_set_subscribe_callback (pctx->context, NULL, NULL); + + g_hash_table_remove (gst_pulse_shared_contexts, pbuf->context_name); + + pa_context_unref (pctx->context); + g_slice_free (GstPulseContext, pctx); + } + } + g_free (pbuf->context_name); + pbuf->context_name = NULL; + } + g_mutex_unlock (pa_shared_resource_mutex); +} + +static void +gst_pulseringbuffer_finalize (GObject * object) +{ + GstPulseRingBuffer *ringbuffer; + + ringbuffer = GST_PULSERING_BUFFER_CAST (object); + + gst_pulsering_destroy_context (ringbuffer); + G_OBJECT_CLASS (ring_parent_class)->finalize (object); +} + + +#define CONTEXT_OK(c) ((c) && PA_CONTEXT_IS_GOOD (pa_context_get_state ((c)))) +#define STREAM_OK(s) ((s) && PA_STREAM_IS_GOOD (pa_stream_get_state ((s)))) + +static gboolean +gst_pulsering_is_dead (GstPulseSink * psink, GstPulseRingBuffer * pbuf, + gboolean check_stream) +{ + if (!CONTEXT_OK (pbuf->context)) + goto error; + + if (check_stream && !STREAM_OK (pbuf->stream)) + goto error; + + return FALSE; + +error: + { + const gchar *err_str = + pbuf->context ? pa_strerror (pa_context_errno (pbuf->context)) : NULL; + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("Disconnected: %s", + err_str), (NULL)); + return TRUE; + } +} + +static void +gst_pulsering_context_state_cb (pa_context * c, void *userdata) +{ + pa_context_state_t state; + pa_threaded_mainloop *mainloop = (pa_threaded_mainloop *) userdata; + + state = pa_context_get_state (c); + + GST_LOG ("got new context state %d", state); + + switch (state) { + case PA_CONTEXT_READY: + case PA_CONTEXT_TERMINATED: + case PA_CONTEXT_FAILED: + GST_LOG ("signaling"); + pa_threaded_mainloop_signal (mainloop, 0); + break; + + case PA_CONTEXT_UNCONNECTED: + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + break; + } +} + +static void +gst_pulsering_context_subscribe_cb (pa_context * c, + pa_subscription_event_type_t t, uint32_t idx, void *userdata) +{ + GstPulseSink *psink; + GstPulseContext *pctx = (GstPulseContext *) userdata; + GSList *walk; + + if (t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_CHANGE) && + t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_NEW)) + return; + + for (walk = pctx->ring_buffers; walk; walk = g_slist_next (walk)) { + GstPulseRingBuffer *pbuf = (GstPulseRingBuffer *) walk->data; + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + GST_LOG_OBJECT (psink, "type %d, idx %u", t, idx); + + if (!pbuf->stream) + continue; + + if (idx != pa_stream_get_index (pbuf->stream)) + continue; + +#ifdef HAVE_PULSE_1_0 + if (psink->device && pbuf->is_pcm && + !g_str_equal (psink->device, + pa_stream_get_device_name (pbuf->stream))) { + /* Underlying sink changed. And this is not a passthrough stream. Let's + * see if someone upstream wants to try to renegotiate. */ + GstEvent *renego; + + g_free (psink->device); + psink->device = g_strdup (pa_stream_get_device_name (pbuf->stream)); + + GST_INFO_OBJECT (psink, "emitting sink-changed"); + + renego = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, + gst_structure_new ("pulse-sink-changed", NULL)); + + if (!gst_pad_push_event (GST_BASE_SINK (psink)->sinkpad, renego)) + GST_DEBUG_OBJECT (psink, "Emitted sink-changed - nobody was listening"); + } +#endif + + /* Actually this event is also triggered when other properties of + * the stream change that are unrelated to the volume. However it is + * probably cheaper to signal the change here and check for the + * volume when the GObject property is read instead of querying it always. */ + + /* inform streaming thread to notify */ + g_atomic_int_compare_and_exchange (&psink->notify, 0, 1); + } +} + +/* will be called when the device should be opened. In this case we will connect + * to the server. We should not try to open any streams in this state. */ +static gboolean +gst_pulseringbuffer_open_device (GstRingBuffer * buf) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + GstPulseContext *pctx; + pa_mainloop_api *api; + gboolean need_unlock_shared; + + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (buf)); + pbuf = GST_PULSERING_BUFFER_CAST (buf); + + g_assert (!pbuf->stream); + g_assert (psink->client_name); + + if (psink->server) + pbuf->context_name = g_strdup_printf ("%s@%s", psink->client_name, + psink->server); + else + pbuf->context_name = g_strdup (psink->client_name); + + pa_threaded_mainloop_lock (mainloop); + + g_mutex_lock (pa_shared_resource_mutex); + need_unlock_shared = TRUE; + + pctx = g_hash_table_lookup (gst_pulse_shared_contexts, pbuf->context_name); + if (pctx == NULL) { + pctx = g_slice_new0 (GstPulseContext); + + /* get the mainloop api and create a context */ + GST_INFO_OBJECT (psink, "new context with name %s, pbuf=%p, pctx=%p", + pbuf->context_name, pbuf, pctx); + api = pa_threaded_mainloop_get_api (mainloop); + if (!(pctx->context = pa_context_new (api, pbuf->context_name))) + goto create_failed; + + pctx->ring_buffers = g_slist_prepend (pctx->ring_buffers, pbuf); + g_hash_table_insert (gst_pulse_shared_contexts, + g_strdup (pbuf->context_name), (gpointer) pctx); + /* register some essential callbacks */ + pa_context_set_state_callback (pctx->context, + gst_pulsering_context_state_cb, mainloop); + pa_context_set_subscribe_callback (pctx->context, + gst_pulsering_context_subscribe_cb, pctx); + + /* try to connect to the server and wait for completion, we don't want to + * autospawn a deamon */ + GST_LOG_OBJECT (psink, "connect to server %s", + GST_STR_NULL (psink->server)); + if (pa_context_connect (pctx->context, psink->server, + PA_CONTEXT_NOAUTOSPAWN, NULL) < 0) + goto connect_failed; + } else { + GST_INFO_OBJECT (psink, + "reusing shared context with name %s, pbuf=%p, pctx=%p", + pbuf->context_name, pbuf, pctx); + pctx->ring_buffers = g_slist_prepend (pctx->ring_buffers, pbuf); + } + + g_mutex_unlock (pa_shared_resource_mutex); + need_unlock_shared = FALSE; + + /* context created or shared okay */ + pbuf->context = pa_context_ref (pctx->context); + + for (;;) { + pa_context_state_t state; + + state = pa_context_get_state (pbuf->context); + + GST_LOG_OBJECT (psink, "context state is now %d", state); + + if (!PA_CONTEXT_IS_GOOD (state)) + goto connect_failed; + + if (state == PA_CONTEXT_READY) + break; + + /* Wait until the context is ready */ + GST_LOG_OBJECT (psink, "waiting.."); + pa_threaded_mainloop_wait (mainloop); + } + + GST_LOG_OBJECT (psink, "opened the device"); + + pa_threaded_mainloop_unlock (mainloop); + + return TRUE; + + /* ERRORS */ +unlock_and_fail: + { + if (need_unlock_shared) + g_mutex_unlock (pa_shared_resource_mutex); + gst_pulsering_destroy_context (pbuf); + pa_threaded_mainloop_unlock (mainloop); + return FALSE; + } +create_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("Failed to create context"), (NULL)); + g_slice_free (GstPulseContext, pctx); + goto unlock_and_fail; + } +connect_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("Failed to connect: %s", + pa_strerror (pa_context_errno (pctx->context))), (NULL)); + goto unlock_and_fail; + } +} + +/* close the device */ +static gboolean +gst_pulseringbuffer_close_device (GstRingBuffer * buf) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + + pbuf = GST_PULSERING_BUFFER_CAST (buf); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (buf)); + + GST_LOG_OBJECT (psink, "closing device"); + + pa_threaded_mainloop_lock (mainloop); + gst_pulsering_destroy_context (pbuf); + pa_threaded_mainloop_unlock (mainloop); + + GST_LOG_OBJECT (psink, "closed device"); + + return TRUE; +} + +static void +gst_pulsering_stream_state_cb (pa_stream * s, void *userdata) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + pa_stream_state_t state; + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + state = pa_stream_get_state (s); + GST_LOG_OBJECT (psink, "got new stream state %d", state); + + switch (state) { + case PA_STREAM_READY: + case PA_STREAM_FAILED: + case PA_STREAM_TERMINATED: + GST_LOG_OBJECT (psink, "signaling"); + pa_threaded_mainloop_signal (mainloop, 0); + break; + case PA_STREAM_UNCONNECTED: + case PA_STREAM_CREATING: + break; + } +} + +static void +gst_pulsering_stream_request_cb (pa_stream * s, size_t length, void *userdata) +{ + GstPulseSink *psink; + GstRingBuffer *rbuf; + GstPulseRingBuffer *pbuf; + + rbuf = GST_RING_BUFFER_CAST (userdata); + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + GST_LOG_OBJECT (psink, "got request for length %" G_GSIZE_FORMAT, length); + + if (pbuf->in_commit && (length >= rbuf->spec.segsize)) { + /* only signal when we are waiting in the commit thread + * and got request for atleast a segment */ + pa_threaded_mainloop_signal (mainloop, 0); + } +} + +static void +gst_pulsering_stream_underflow_cb (pa_stream * s, void *userdata) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + GST_WARNING_OBJECT (psink, "Got underflow"); +} + +static void +gst_pulsering_stream_overflow_cb (pa_stream * s, void *userdata) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + GST_WARNING_OBJECT (psink, "Got overflow"); +} + +static void +gst_pulsering_stream_latency_cb (pa_stream * s, void *userdata) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + const pa_timing_info *info; + pa_usec_t sink_usec; + + info = pa_stream_get_timing_info (s); + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + if (!info) { + GST_LOG_OBJECT (psink, "latency update (information unknown)"); + return; + } + sink_usec = info->configured_sink_usec; + + GST_LOG_OBJECT (psink, + "latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%" + G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT, + GST_TIMEVAL_TO_TIME (info->timestamp), info->write_index_corrupt, + info->write_index, info->read_index_corrupt, info->read_index, + info->sink_usec, sink_usec); +} + +static void +gst_pulsering_stream_suspended_cb (pa_stream * p, void *userdata) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + if (pa_stream_is_suspended (p)) + GST_DEBUG_OBJECT (psink, "stream suspended"); + else + GST_DEBUG_OBJECT (psink, "stream resumed"); +} + +static void +gst_pulsering_stream_started_cb (pa_stream * p, void *userdata) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + GST_DEBUG_OBJECT (psink, "stream started"); +} + +static void +gst_pulsering_stream_event_cb (pa_stream * p, const char *name, + pa_proplist * pl, void *userdata) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + if (!strcmp (name, PA_STREAM_EVENT_REQUEST_CORK)) { + /* the stream wants to PAUSE, post a message for the application. */ + GST_DEBUG_OBJECT (psink, "got request for CORK"); + gst_element_post_message (GST_ELEMENT_CAST (psink), + gst_message_new_request_state (GST_OBJECT_CAST (psink), + GST_STATE_PAUSED)); + + } else if (!strcmp (name, PA_STREAM_EVENT_REQUEST_UNCORK)) { + GST_DEBUG_OBJECT (psink, "got request for UNCORK"); + gst_element_post_message (GST_ELEMENT_CAST (psink), + gst_message_new_request_state (GST_OBJECT_CAST (psink), + GST_STATE_PLAYING)); +#ifdef HAVE_PULSE_1_0 + } else if (!strcmp (name, PA_STREAM_EVENT_FORMAT_LOST)) { + GstEvent *renego; + + if (g_atomic_int_get (&psink->format_lost)) { + /* Duplicate event before we're done reconfiguring, discard */ + return; + } + + GST_DEBUG_OBJECT (psink, "got FORMAT LOST"); + g_atomic_int_set (&psink->format_lost, 1); + psink->format_lost_time = g_ascii_strtoull (pa_proplist_gets (pl, + "stream-time"), NULL, 0) * 1000; + + g_free (psink->device); + psink->device = g_strdup (pa_proplist_gets (pl, "device")); + + renego = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, + gst_structure_new ("pulse-format-lost", NULL)); + + if (!gst_pad_push_event (GST_BASE_SINK (psink)->sinkpad, renego)) { + /* Nobody handled the format change - emit an error */ + GST_ELEMENT_ERROR (psink, STREAM, FORMAT, ("Sink format changed"), + ("Sink format changed")); + } +#endif + } else { + GST_DEBUG_OBJECT (psink, "got unknown event %s", name); + } +} + +/* Called with the mainloop locked */ +static gboolean +gst_pulsering_wait_for_stream_ready (GstPulseSink * psink, pa_stream * stream) +{ + pa_stream_state_t state; + + for (;;) { + state = pa_stream_get_state (stream); + + GST_LOG_OBJECT (psink, "stream state is now %d", state); + + if (!PA_STREAM_IS_GOOD (state)) + return FALSE; + + if (state == PA_STREAM_READY) + return TRUE; + + /* Wait until the stream is ready */ + pa_threaded_mainloop_wait (mainloop); + } +} + + +/* This method should create a new stream of the given @spec. No playback should + * start yet so we start in the corked state. */ +static gboolean +gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + pa_buffer_attr wanted; + const pa_buffer_attr *actual; + pa_channel_map channel_map; + pa_operation *o = NULL; +#ifdef HAVE_PULSE_0_9_20 + pa_cvolume v; +#endif + pa_cvolume *pv = NULL; + pa_stream_flags_t flags; + const gchar *name; + GstAudioClock *clock; +#ifdef HAVE_PULSE_1_0 + pa_format_info *formats[1]; +#ifndef GST_DISABLE_GST_DEBUG + gchar print_buf[PA_FORMAT_INFO_SNPRINT_MAX]; +#endif +#endif + + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (buf)); + pbuf = GST_PULSERING_BUFFER_CAST (buf); + + GST_LOG_OBJECT (psink, "creating sample spec"); + /* convert the gstreamer sample spec to the pulseaudio format */ +#ifdef HAVE_PULSE_1_0 + if (!gst_pulse_fill_format_info (spec, &pbuf->format, &pbuf->channels)) + goto invalid_spec; + pbuf->is_pcm = pa_format_info_is_pcm (pbuf->format); +#else + if (!gst_pulse_fill_sample_spec (spec, &pbuf->sample_spec)) + goto invalid_spec; +#endif + + pa_threaded_mainloop_lock (mainloop); + + /* we need a context and a no stream */ + g_assert (pbuf->context); + g_assert (!pbuf->stream); + + /* enable event notifications */ + GST_LOG_OBJECT (psink, "subscribing to context events"); + if (!(o = pa_context_subscribe (pbuf->context, + PA_SUBSCRIPTION_MASK_SINK_INPUT, NULL, NULL))) + goto subscribe_failed; + + pa_operation_unref (o); + + /* initialize the channel map */ +#ifdef HAVE_PULSE_1_0 + if (pbuf->is_pcm && gst_pulse_gst_to_channel_map (&channel_map, spec)) + pa_format_info_set_channel_map (pbuf->format, &channel_map); +#else + gst_pulse_gst_to_channel_map (&channel_map, spec); +#endif + + /* find a good name for the stream */ + if (psink->stream_name) + name = psink->stream_name; + else + name = "Playback Stream"; + + /* create a stream */ +#ifdef HAVE_PULSE_1_0 + formats[0] = pbuf->format; + if (!(pbuf->stream = pa_stream_new_extended (pbuf->context, name, formats, 1, + psink->proplist))) + goto stream_failed; +#else + GST_LOG_OBJECT (psink, "creating stream with name %s", name); + if (!(pbuf->stream = pa_stream_new_with_proplist (pbuf->context, name, + &pbuf->sample_spec, &channel_map, psink->proplist))) + goto stream_failed; +#endif + + /* install essential callbacks */ + pa_stream_set_state_callback (pbuf->stream, + gst_pulsering_stream_state_cb, pbuf); + pa_stream_set_write_callback (pbuf->stream, + gst_pulsering_stream_request_cb, pbuf); + pa_stream_set_underflow_callback (pbuf->stream, + gst_pulsering_stream_underflow_cb, pbuf); + pa_stream_set_overflow_callback (pbuf->stream, + gst_pulsering_stream_overflow_cb, pbuf); + pa_stream_set_latency_update_callback (pbuf->stream, + gst_pulsering_stream_latency_cb, pbuf); + pa_stream_set_suspended_callback (pbuf->stream, + gst_pulsering_stream_suspended_cb, pbuf); + pa_stream_set_started_callback (pbuf->stream, + gst_pulsering_stream_started_cb, pbuf); + pa_stream_set_event_callback (pbuf->stream, + gst_pulsering_stream_event_cb, pbuf); + + /* buffering requirements. When setting prebuf to 0, the stream will not pause + * when we cause an underrun, which causes time to continue. */ + memset (&wanted, 0, sizeof (wanted)); + wanted.tlength = spec->segtotal * spec->segsize; + wanted.maxlength = -1; + wanted.prebuf = 0; + wanted.minreq = spec->segsize; + + GST_INFO_OBJECT (psink, "tlength: %d", wanted.tlength); + GST_INFO_OBJECT (psink, "maxlength: %d", wanted.maxlength); + GST_INFO_OBJECT (psink, "prebuf: %d", wanted.prebuf); + GST_INFO_OBJECT (psink, "minreq: %d", wanted.minreq); + +#ifdef HAVE_PULSE_0_9_20 + /* configure volume when we changed it, else we leave the default */ + if (psink->volume_set) { + GST_LOG_OBJECT (psink, "have volume of %f", psink->volume); + pv = &v; +#ifdef HAVE_PULSE_1_0 + if (pbuf->is_pcm) + gst_pulse_cvolume_from_linear (pv, pbuf->channels, psink->volume); + else { + GST_DEBUG_OBJECT (psink, "passthrough stream, not setting volume"); + pv = NULL; + } +#else + gst_pulse_cvolume_from_linear (pv, pbuf->sample_spec.channels, + psink->volume); +#endif + } else { + pv = NULL; + } +#endif + + /* construct the flags */ + flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | + PA_STREAM_ADJUST_LATENCY | PA_STREAM_START_CORKED; + + if (psink->mute_set && psink->mute) + flags |= PA_STREAM_START_MUTED; + + /* we always start corked (see flags above) */ + pbuf->corked = TRUE; + + /* try to connect now */ + GST_LOG_OBJECT (psink, "connect for playback to device %s", + GST_STR_NULL (psink->device)); + if (pa_stream_connect_playback (pbuf->stream, psink->device, + &wanted, flags, pv, NULL) < 0) + goto connect_failed; + + /* our clock will now start from 0 again */ + clock = GST_AUDIO_CLOCK (GST_BASE_AUDIO_SINK (psink)->provided_clock); + gst_audio_clock_reset (clock, 0); + + if (!gst_pulsering_wait_for_stream_ready (psink, pbuf->stream)) + goto connect_failed; + +#ifdef HAVE_PULSE_1_0 + g_free (psink->device); + psink->device = g_strdup (pa_stream_get_device_name (pbuf->stream)); + +#ifndef GST_DISABLE_GST_DEBUG + pa_format_info_snprint (print_buf, sizeof (print_buf), + pa_stream_get_format_info (pbuf->stream)); + GST_INFO_OBJECT (psink, "negotiated to: %s", print_buf); +#endif +#endif + + /* After we passed the volume off of to PA we never want to set it + again, since it is PA's job to save/restore volumes. */ + psink->volume_set = psink->mute_set = FALSE; + + GST_LOG_OBJECT (psink, "stream is acquired now"); + + /* get the actual buffering properties now */ + actual = pa_stream_get_buffer_attr (pbuf->stream); + + GST_INFO_OBJECT (psink, "tlength: %d (wanted: %d)", actual->tlength, + wanted.tlength); + GST_INFO_OBJECT (psink, "maxlength: %d", actual->maxlength); + GST_INFO_OBJECT (psink, "prebuf: %d", actual->prebuf); + GST_INFO_OBJECT (psink, "minreq: %d (wanted %d)", actual->minreq, + wanted.minreq); + + spec->segsize = actual->minreq; + spec->segtotal = actual->tlength / spec->segsize; + + pa_threaded_mainloop_unlock (mainloop); + + return TRUE; + + /* ERRORS */ +unlock_and_fail: + { + gst_pulsering_destroy_stream (pbuf); + pa_threaded_mainloop_unlock (mainloop); + + return FALSE; + } +invalid_spec: + { + GST_ELEMENT_ERROR (psink, RESOURCE, SETTINGS, + ("Invalid sample specification."), (NULL)); + return FALSE; + } +subscribe_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_context_subscribe() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock_and_fail; + } +stream_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("Failed to create stream: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock_and_fail; + } +connect_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("Failed to connect stream: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock_and_fail; + } +} + +/* free the stream that we acquired before */ +static gboolean +gst_pulseringbuffer_release (GstRingBuffer * buf) +{ + GstPulseRingBuffer *pbuf; + + pbuf = GST_PULSERING_BUFFER_CAST (buf); + + pa_threaded_mainloop_lock (mainloop); + gst_pulsering_destroy_stream (pbuf); + pa_threaded_mainloop_unlock (mainloop); + +#ifdef HAVE_PULSE_1_0 + { + GstPulseSink *psink; + + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + g_atomic_int_set (&psink->format_lost, FALSE); + psink->format_lost_time = GST_CLOCK_TIME_NONE; + } +#endif + + return TRUE; +} + +static void +gst_pulsering_success_cb (pa_stream * s, int success, void *userdata) +{ + pa_threaded_mainloop_signal (mainloop, 0); +} + +/* update the corked state of a stream, must be called with the mainloop + * lock */ +static gboolean +gst_pulsering_set_corked (GstPulseRingBuffer * pbuf, gboolean corked, + gboolean wait) +{ + pa_operation *o = NULL; + GstPulseSink *psink; + gboolean res = FALSE; + + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + +#ifdef HAVE_PULSE_1_0 + if (g_atomic_int_get (&psink->format_lost)) { + /* Sink format changed, stream's gone so fake being paused */ + return TRUE; + } +#endif + + GST_DEBUG_OBJECT (psink, "setting corked state to %d", corked); + if (pbuf->corked != corked) { + if (!(o = pa_stream_cork (pbuf->stream, corked, + gst_pulsering_success_cb, pbuf))) + goto cork_failed; + + while (wait && pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait (mainloop); + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) + goto server_dead; + } + pbuf->corked = corked; + } else { + GST_DEBUG_OBJECT (psink, "skipping, already in requested state"); + } + res = TRUE; + +cleanup: + if (o) + pa_operation_unref (o); + + return res; + + /* ERRORS */ +server_dead: + { + GST_DEBUG_OBJECT (psink, "the server is dead"); + goto cleanup; + } +cork_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_stream_cork() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto cleanup; + } +} + +static void +gst_pulseringbuffer_clear (GstRingBuffer * buf) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + pa_operation *o = NULL; + + pbuf = GST_PULSERING_BUFFER_CAST (buf); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + pa_threaded_mainloop_lock (mainloop); + GST_DEBUG_OBJECT (psink, "clearing"); + if (pbuf->stream) { + /* don't wait for the flush to complete */ + if ((o = pa_stream_flush (pbuf->stream, NULL, pbuf))) + pa_operation_unref (o); + } + pa_threaded_mainloop_unlock (mainloop); +} + +/* called from pulse with the mainloop lock */ +static void +mainloop_enter_defer_cb (pa_mainloop_api * api, void *userdata) +{ + GstPulseSink *pulsesink = GST_PULSESINK (userdata); + GstMessage *message; + GValue val = { 0 }; + + g_value_init (&val, G_TYPE_POINTER); + g_value_set_pointer (&val, g_thread_self ()); + + GST_DEBUG_OBJECT (pulsesink, "posting ENTER stream status"); + message = gst_message_new_stream_status (GST_OBJECT (pulsesink), + GST_STREAM_STATUS_TYPE_ENTER, GST_ELEMENT (pulsesink)); + gst_message_set_stream_status_object (message, &val); + + gst_element_post_message (GST_ELEMENT (pulsesink), message); + + g_return_if_fail (pulsesink->defer_pending); + pulsesink->defer_pending--; + pa_threaded_mainloop_signal (mainloop, 0); +} + +/* start/resume playback ASAP, we don't uncork here but in the commit method */ +static gboolean +gst_pulseringbuffer_start (GstRingBuffer * buf) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + + pbuf = GST_PULSERING_BUFFER_CAST (buf); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + pa_threaded_mainloop_lock (mainloop); + + GST_DEBUG_OBJECT (psink, "scheduling stream status"); + psink->defer_pending++; + pa_mainloop_api_once (pa_threaded_mainloop_get_api (mainloop), + mainloop_enter_defer_cb, psink); + + GST_DEBUG_OBJECT (psink, "starting"); + pbuf->paused = FALSE; + + /* EOS needs running clock */ + if (GST_BASE_SINK_CAST (psink)->eos || + g_atomic_int_get (&GST_BASE_AUDIO_SINK (psink)->abidata. + ABI.eos_rendering)) + gst_pulsering_set_corked (pbuf, FALSE, FALSE); + + pa_threaded_mainloop_unlock (mainloop); + + return TRUE; +} + +/* pause/stop playback ASAP */ +static gboolean +gst_pulseringbuffer_pause (GstRingBuffer * buf) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + gboolean res; + + pbuf = GST_PULSERING_BUFFER_CAST (buf); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + pa_threaded_mainloop_lock (mainloop); + GST_DEBUG_OBJECT (psink, "pausing and corking"); + /* make sure the commit method stops writing */ + pbuf->paused = TRUE; + res = gst_pulsering_set_corked (pbuf, TRUE, TRUE); + if (pbuf->in_commit) { + /* we are waiting in a commit, signal */ + GST_DEBUG_OBJECT (psink, "signal commit"); + pa_threaded_mainloop_signal (mainloop, 0); + } + pa_threaded_mainloop_unlock (mainloop); + + return res; +} + +/* called from pulse with the mainloop lock */ +static void +mainloop_leave_defer_cb (pa_mainloop_api * api, void *userdata) +{ + GstPulseSink *pulsesink = GST_PULSESINK (userdata); + GstMessage *message; + GValue val = { 0 }; + + g_value_init (&val, G_TYPE_POINTER); + g_value_set_pointer (&val, g_thread_self ()); + + GST_DEBUG_OBJECT (pulsesink, "posting LEAVE stream status"); + message = gst_message_new_stream_status (GST_OBJECT (pulsesink), + GST_STREAM_STATUS_TYPE_LEAVE, GST_ELEMENT (pulsesink)); + gst_message_set_stream_status_object (message, &val); + gst_element_post_message (GST_ELEMENT (pulsesink), message); + + g_return_if_fail (pulsesink->defer_pending); + pulsesink->defer_pending--; + pa_threaded_mainloop_signal (mainloop, 0); +} + +/* stop playback, we flush everything. */ +static gboolean +gst_pulseringbuffer_stop (GstRingBuffer * buf) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + gboolean res = FALSE; + pa_operation *o = NULL; + + pbuf = GST_PULSERING_BUFFER_CAST (buf); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + pa_threaded_mainloop_lock (mainloop); + + pbuf->paused = TRUE; + res = gst_pulsering_set_corked (pbuf, TRUE, TRUE); + + /* Inform anyone waiting in _commit() call that it shall wakeup */ + if (pbuf->in_commit) { + GST_DEBUG_OBJECT (psink, "signal commit thread"); + pa_threaded_mainloop_signal (mainloop, 0); + } +#ifdef HAVE_PULSE_1_0 + if (g_atomic_int_get (&psink->format_lost)) { + /* Don't try to flush, the stream's probably gone by now */ + res = TRUE; + goto cleanup; + } +#endif + + /* then try to flush, it's not fatal when this fails */ + GST_DEBUG_OBJECT (psink, "flushing"); + if ((o = pa_stream_flush (pbuf->stream, gst_pulsering_success_cb, pbuf))) { + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + GST_DEBUG_OBJECT (psink, "wait for completion"); + pa_threaded_mainloop_wait (mainloop); + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) + goto server_dead; + } + GST_DEBUG_OBJECT (psink, "flush completed"); + } + res = TRUE; + +cleanup: + if (o) { + pa_operation_cancel (o); + pa_operation_unref (o); + } + + GST_DEBUG_OBJECT (psink, "scheduling stream status"); + psink->defer_pending++; + pa_mainloop_api_once (pa_threaded_mainloop_get_api (mainloop), + mainloop_leave_defer_cb, psink); + + pa_threaded_mainloop_unlock (mainloop); + + return res; + + /* ERRORS */ +server_dead: + { + GST_DEBUG_OBJECT (psink, "the server is dead"); + goto cleanup; + } +} + +/* in_samples >= out_samples, rate > 1.0 */ +#define FWD_UP_SAMPLES(s,se,d,de) \ +G_STMT_START { \ + guint8 *sb = s, *db = d; \ + while (s <= se && d < de) { \ + memcpy (d, s, bps); \ + s += bps; \ + *accum += outr; \ + if ((*accum << 1) >= inr) { \ + *accum -= inr; \ + d += bps; \ + } \ + } \ + in_samples -= (s - sb)/bps; \ + out_samples -= (d - db)/bps; \ + GST_DEBUG ("fwd_up end %d/%d",*accum,*toprocess); \ +} G_STMT_END + +/* out_samples > in_samples, for rates smaller than 1.0 */ +#define FWD_DOWN_SAMPLES(s,se,d,de) \ +G_STMT_START { \ + guint8 *sb = s, *db = d; \ + while (s <= se && d < de) { \ + memcpy (d, s, bps); \ + d += bps; \ + *accum += inr; \ + if ((*accum << 1) >= outr) { \ + *accum -= outr; \ + s += bps; \ + } \ + } \ + in_samples -= (s - sb)/bps; \ + out_samples -= (d - db)/bps; \ + GST_DEBUG ("fwd_down end %d/%d",*accum,*toprocess); \ +} G_STMT_END + +#define REV_UP_SAMPLES(s,se,d,de) \ +G_STMT_START { \ + guint8 *sb = se, *db = d; \ + while (s <= se && d < de) { \ + memcpy (d, se, bps); \ + se -= bps; \ + *accum += outr; \ + while (d < de && (*accum << 1) >= inr) { \ + *accum -= inr; \ + d += bps; \ + } \ + } \ + in_samples -= (sb - se)/bps; \ + out_samples -= (d - db)/bps; \ + GST_DEBUG ("rev_up end %d/%d",*accum,*toprocess); \ +} G_STMT_END + +#define REV_DOWN_SAMPLES(s,se,d,de) \ +G_STMT_START { \ + guint8 *sb = se, *db = d; \ + while (s <= se && d < de) { \ + memcpy (d, se, bps); \ + d += bps; \ + *accum += inr; \ + while (s <= se && (*accum << 1) >= outr) { \ + *accum -= outr; \ + se -= bps; \ + } \ + } \ + in_samples -= (sb - se)/bps; \ + out_samples -= (d - db)/bps; \ + GST_DEBUG ("rev_down end %d/%d",*accum,*toprocess); \ +} G_STMT_END + +/* our custom commit function because we write into the buffer of pulseaudio + * instead of keeping our own buffer */ +static guint +gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample, + guchar * data, gint in_samples, gint out_samples, gint * accum) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + guint result; + guint8 *data_end; + gboolean reverse; + gint *toprocess; + gint inr, outr, bps; + gint64 offset; + guint bufsize; + + pbuf = GST_PULSERING_BUFFER_CAST (buf); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + /* FIXME post message rather than using a signal (as mixer interface) */ + if (g_atomic_int_compare_and_exchange (&psink->notify, 1, 0)) { + g_object_notify (G_OBJECT (psink), "volume"); + g_object_notify (G_OBJECT (psink), "mute"); + } + + /* make sure the ringbuffer is started */ + if (G_UNLIKELY (g_atomic_int_get (&buf->state) != + GST_RING_BUFFER_STATE_STARTED)) { + /* see if we are allowed to start it */ + if (G_UNLIKELY (g_atomic_int_get (&buf->abidata.ABI.may_start) == FALSE)) + goto no_start; + + GST_DEBUG_OBJECT (buf, "start!"); + if (!gst_ring_buffer_start (buf)) + goto start_failed; + } + + pa_threaded_mainloop_lock (mainloop); + + GST_DEBUG_OBJECT (psink, "entering commit"); + pbuf->in_commit = TRUE; + + bps = buf->spec.bytes_per_sample; + bufsize = buf->spec.segsize * buf->spec.segtotal; + + /* our toy resampler for trick modes */ + reverse = out_samples < 0; + out_samples = ABS (out_samples); + + if (in_samples >= out_samples) + toprocess = &in_samples; + else + toprocess = &out_samples; + + inr = in_samples - 1; + outr = out_samples - 1; + + GST_DEBUG_OBJECT (psink, "in %d, out %d", inr, outr); + + /* data_end points to the last sample we have to write, not past it. This is + * needed to properly handle reverse playback: it points to the last sample. */ + data_end = data + (bps * inr); + +#ifdef HAVE_PULSE_1_0 + if (g_atomic_int_get (&psink->format_lost)) { + /* Sink format changed, drop the data and hope upstream renegotiates */ + goto fake_done; + } +#endif + + if (pbuf->paused) + goto was_paused; + + /* offset is in bytes */ + offset = *sample * bps; + + while (*toprocess > 0) { + size_t avail; + guint towrite; + + GST_LOG_OBJECT (psink, + "need to write %d samples at offset %" G_GINT64_FORMAT, *toprocess, + offset); + + if (offset != pbuf->m_lastoffset) + GST_LOG_OBJECT (psink, "discontinuity, offset is %" G_GINT64_FORMAT ", " + "last offset was %" G_GINT64_FORMAT, offset, pbuf->m_lastoffset); + + towrite = out_samples * bps; + + /* Wait for at least segsize bytes to become available */ + if (towrite > buf->spec.segsize) + towrite = buf->spec.segsize; + + if ((pbuf->m_writable < towrite) || (offset != pbuf->m_lastoffset)) { + /* if no room left or discontinuity in offset, + we need to flush data and get a new buffer */ + + /* flush the buffer if possible */ + if ((pbuf->m_data != NULL) && (pbuf->m_towrite > 0)) { + + GST_LOG_OBJECT (psink, + "flushing %u samples at offset %" G_GINT64_FORMAT, + (guint) pbuf->m_towrite / bps, pbuf->m_offset); + + if (pa_stream_write (pbuf->stream, (uint8_t *) pbuf->m_data, + pbuf->m_towrite, NULL, pbuf->m_offset, PA_SEEK_ABSOLUTE) < 0) { + goto write_failed; + } + } + pbuf->m_towrite = 0; + pbuf->m_offset = offset; /* keep track of current offset */ + + /* get a buffer to write in for now on */ + for (;;) { + pbuf->m_writable = pa_stream_writable_size (pbuf->stream); + +#ifdef HAVE_PULSE_1_0 + if (g_atomic_int_get (&psink->format_lost)) { + /* Sink format changed, give up and hope upstream renegotiates */ + goto fake_done; + } +#endif + + if (pbuf->m_writable == (size_t) - 1) + goto writable_size_failed; + + pbuf->m_writable /= bps; + pbuf->m_writable *= bps; /* handle only complete samples */ + + if (pbuf->m_writable >= towrite) + break; + + /* see if we need to uncork because we have no free space */ + if (pbuf->corked) { + if (!gst_pulsering_set_corked (pbuf, FALSE, FALSE)) + goto uncork_failed; + } + + /* we can't write segsize bytes, wait a bit */ + GST_LOG_OBJECT (psink, "waiting for free space"); + pa_threaded_mainloop_wait (mainloop); + + if (pbuf->paused) + goto was_paused; + } + + /* Recalculate what we can write in the next chunk */ + towrite = out_samples * bps; + if (pbuf->m_writable > towrite) + pbuf->m_writable = towrite; + + GST_LOG_OBJECT (psink, "requesting %" G_GSIZE_FORMAT " bytes of " + "shared memory", pbuf->m_writable); + + if (pa_stream_begin_write (pbuf->stream, &pbuf->m_data, + &pbuf->m_writable) < 0) { + GST_LOG_OBJECT (psink, "pa_stream_begin_write() failed"); + goto writable_size_failed; + } + + GST_LOG_OBJECT (psink, "got %" G_GSIZE_FORMAT " bytes of shared memory", + pbuf->m_writable); + + } + + if (towrite > pbuf->m_writable) + towrite = pbuf->m_writable; + avail = towrite / bps; + + GST_LOG_OBJECT (psink, "writing %u samples at offset %" G_GUINT64_FORMAT, + (guint) avail, offset); + +#ifdef HAVE_PULSE_1_0 + /* No trick modes for passthrough streams */ + if (G_UNLIKELY (!pbuf->is_pcm && (inr != outr || reverse))) { + GST_WARNING_OBJECT (psink, "Passthrough stream can't run in trick mode"); + goto unlock_and_fail; + } +#endif + + if (G_LIKELY (inr == outr && !reverse)) { + /* no rate conversion, simply write out the samples */ + /* copy the data into internal buffer */ + + memcpy ((guint8 *) pbuf->m_data + pbuf->m_towrite, data, towrite); + pbuf->m_towrite += towrite; + pbuf->m_writable -= towrite; + + data += towrite; + in_samples -= avail; + out_samples -= avail; + } else { + guint8 *dest, *d, *d_end; + + /* write into the PulseAudio shm buffer */ + dest = d = (guint8 *) pbuf->m_data + pbuf->m_towrite; + d_end = d + towrite; + + if (!reverse) { + if (inr >= outr) + /* forward speed up */ + FWD_UP_SAMPLES (data, data_end, d, d_end); + else + /* forward slow down */ + FWD_DOWN_SAMPLES (data, data_end, d, d_end); + } else { + if (inr >= outr) + /* reverse speed up */ + REV_UP_SAMPLES (data, data_end, d, d_end); + else + /* reverse slow down */ + REV_DOWN_SAMPLES (data, data_end, d, d_end); + } + /* see what we have left to write */ + towrite = (d - dest); + pbuf->m_towrite += towrite; + pbuf->m_writable -= towrite; + + avail = towrite / bps; + } + + /* flush the buffer if it's full */ + if ((pbuf->m_data != NULL) && (pbuf->m_towrite > 0) + && (pbuf->m_writable == 0)) { + GST_LOG_OBJECT (psink, "flushing %u samples at offset %" G_GINT64_FORMAT, + (guint) pbuf->m_towrite / bps, pbuf->m_offset); + + if (pa_stream_write (pbuf->stream, (uint8_t *) pbuf->m_data, + pbuf->m_towrite, NULL, pbuf->m_offset, PA_SEEK_ABSOLUTE) < 0) { + goto write_failed; + } + pbuf->m_towrite = 0; + pbuf->m_offset = offset + towrite; /* keep track of current offset */ + } + + *sample += avail; + offset += avail * bps; + pbuf->m_lastoffset = offset; + + /* check if we need to uncork after writing the samples */ + if (pbuf->corked) { + const pa_timing_info *info; + + if ((info = pa_stream_get_timing_info (pbuf->stream))) { + GST_LOG_OBJECT (psink, + "read_index at %" G_GUINT64_FORMAT ", offset %" G_GINT64_FORMAT, + info->read_index, offset); + + /* we uncork when the read_index is too far behind the offset we need + * to write to. */ + if (info->read_index + bufsize <= offset) { + if (!gst_pulsering_set_corked (pbuf, FALSE, FALSE)) + goto uncork_failed; + } + } else { + GST_LOG_OBJECT (psink, "no timing info available yet"); + } + } + } + +#ifdef HAVE_PULSE_1_0 +fake_done: +#endif + /* we consumed all samples here */ + data = data_end + bps; + + pbuf->in_commit = FALSE; + pa_threaded_mainloop_unlock (mainloop); + +done: + result = inr - ((data_end - data) / bps); + GST_LOG_OBJECT (psink, "wrote %d samples", result); + + return result; + + /* ERRORS */ +unlock_and_fail: + { + pbuf->in_commit = FALSE; + GST_LOG_OBJECT (psink, "we are reset"); + pa_threaded_mainloop_unlock (mainloop); + goto done; + } +no_start: + { + GST_LOG_OBJECT (psink, "we can not start"); + return 0; + } +start_failed: + { + GST_LOG_OBJECT (psink, "failed to start the ringbuffer"); + return 0; + } +uncork_failed: + { + pbuf->in_commit = FALSE; + GST_ERROR_OBJECT (psink, "uncork failed"); + pa_threaded_mainloop_unlock (mainloop); + goto done; + } +was_paused: + { + pbuf->in_commit = FALSE; + GST_LOG_OBJECT (psink, "we are paused"); + pa_threaded_mainloop_unlock (mainloop); + goto done; + } +writable_size_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_stream_writable_size() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock_and_fail; + } +write_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_stream_write() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock_and_fail; + } +} + +/* write pending local samples, must be called with the mainloop lock */ +static void +gst_pulsering_flush (GstPulseRingBuffer * pbuf) +{ + GstPulseSink *psink; + + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + GST_DEBUG_OBJECT (psink, "entering flush"); + + /* flush the buffer if possible */ + if (pbuf->stream && (pbuf->m_data != NULL) && (pbuf->m_towrite > 0)) { +#ifndef GST_DISABLE_GST_DEBUG + gint bps; + + bps = (GST_RING_BUFFER_CAST (pbuf))->spec.bytes_per_sample; + GST_LOG_OBJECT (psink, + "flushing %u samples at offset %" G_GINT64_FORMAT, + (guint) pbuf->m_towrite / bps, pbuf->m_offset); +#endif + + if (pa_stream_write (pbuf->stream, (uint8_t *) pbuf->m_data, + pbuf->m_towrite, NULL, pbuf->m_offset, PA_SEEK_ABSOLUTE) < 0) { + goto write_failed; + } + + pbuf->m_towrite = 0; + pbuf->m_offset += pbuf->m_towrite; /* keep track of current offset */ + } + +done: + return; + + /* ERRORS */ +write_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_stream_write() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto done; + } +} + +static void gst_pulsesink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_pulsesink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_pulsesink_finalize (GObject * object); + +static gboolean gst_pulsesink_event (GstBaseSink * sink, GstEvent * event); + +static GstStateChangeReturn gst_pulsesink_change_state (GstElement * element, + GstStateChange transition); + +static void gst_pulsesink_init_interfaces (GType type); + +GST_IMPLEMENT_PULSEPROBE_METHODS (GstPulseSink, gst_pulsesink); + +#define _do_init(type) \ + gst_pulsesink_init_contexts (); \ + gst_pulsesink_init_interfaces (type); + +GST_BOILERPLATE_FULL (GstPulseSink, gst_pulsesink, GstBaseAudioSink, + GST_TYPE_BASE_AUDIO_SINK, _do_init); + +static gboolean +gst_pulsesink_interface_supported (GstImplementsInterface * + iface, GType interface_type) +{ + GstPulseSink *this = GST_PULSESINK_CAST (iface); + + if (interface_type == GST_TYPE_PROPERTY_PROBE && this->probe) + return TRUE; + if (interface_type == GST_TYPE_STREAM_VOLUME) + return TRUE; + + return FALSE; +} + +static void +gst_pulsesink_implements_interface_init (GstImplementsInterfaceClass * klass) +{ + klass->supported = gst_pulsesink_interface_supported; +} + +static void +gst_pulsesink_init_interfaces (GType type) +{ + static const GInterfaceInfo implements_iface_info = { + (GInterfaceInitFunc) gst_pulsesink_implements_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo probe_iface_info = { + (GInterfaceInitFunc) gst_pulsesink_property_probe_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo svol_iface_info = { + NULL, NULL, NULL + }; + + g_type_add_interface_static (type, GST_TYPE_STREAM_VOLUME, &svol_iface_info); + g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, + &implements_iface_info); + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &probe_iface_info); +} + +static void +gst_pulsesink_base_init (gpointer g_class) +{ + static GstStaticPadTemplate pad_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (PULSE_SINK_TEMPLATE_CAPS)); + + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "PulseAudio Audio Sink", + "Sink/Audio", "Plays audio to a PulseAudio server", "Lennart Poettering"); + gst_element_class_add_static_pad_template (element_class, &pad_template); +} + +static GstRingBuffer * +gst_pulsesink_create_ringbuffer (GstBaseAudioSink * sink) +{ + GstRingBuffer *buffer; + + GST_DEBUG_OBJECT (sink, "creating ringbuffer"); + buffer = g_object_new (GST_TYPE_PULSERING_BUFFER, NULL); + GST_DEBUG_OBJECT (sink, "created ringbuffer @%p", buffer); + + return buffer; +} + +static GstBuffer * +gst_pulsesink_payload (GstBaseAudioSink * sink, GstBuffer * buf) +{ + switch (sink->ringbuffer->spec.type) { + case GST_BUFTYPE_AC3: + case GST_BUFTYPE_EAC3: + case GST_BUFTYPE_DTS: + case GST_BUFTYPE_MPEG: + { + /* FIXME: alloc memory from PA if possible */ + gint framesize = gst_audio_iec61937_frame_size (&sink->ringbuffer->spec); + GstBuffer *out; + + if (framesize <= 0) + return NULL; + + out = gst_buffer_new_and_alloc (framesize); + + if (!gst_audio_iec61937_payload (GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf), GST_BUFFER_DATA (out), + GST_BUFFER_SIZE (out), &sink->ringbuffer->spec)) { + gst_buffer_unref (out); + return NULL; + } + + gst_buffer_copy_metadata (out, buf, GST_BUFFER_COPY_ALL); + return out; + } + + default: + return gst_buffer_ref (buf); + } +} + +static void +gst_pulsesink_class_init (GstPulseSinkClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass); + GstBaseSinkClass *bc; + GstBaseAudioSinkClass *gstaudiosink_class = GST_BASE_AUDIO_SINK_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + gchar *clientname; + + gobject_class->finalize = gst_pulsesink_finalize; + gobject_class->set_property = gst_pulsesink_set_property; + gobject_class->get_property = gst_pulsesink_get_property; + + gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_pulsesink_event); + + /* restore the original basesink pull methods */ + bc = g_type_class_peek (GST_TYPE_BASE_SINK); + gstbasesink_class->activate_pull = GST_DEBUG_FUNCPTR (bc->activate_pull); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_pulsesink_change_state); + + gstaudiosink_class->create_ringbuffer = + GST_DEBUG_FUNCPTR (gst_pulsesink_create_ringbuffer); + gstaudiosink_class->payload = GST_DEBUG_FUNCPTR (gst_pulsesink_payload); + + /* Overwrite GObject fields */ + g_object_class_install_property (gobject_class, + PROP_SERVER, + g_param_spec_string ("server", "Server", + "The PulseAudio server to connect to", DEFAULT_SERVER, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "The PulseAudio sink device to connect to", DEFAULT_DEVICE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_VOLUME, + g_param_spec_double ("volume", "Volume", + "Linear volume of this stream, 1.0=100%", 0.0, MAX_VOLUME, + DEFAULT_VOLUME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_MUTE, + g_param_spec_boolean ("mute", "Mute", + "Mute state of this stream", DEFAULT_MUTE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstPulseSink:client + * + * The PulseAudio client name to use. + * + * Since: 0.10.25 + */ + clientname = gst_pulse_client_name (); + g_object_class_install_property (gobject_class, + PROP_CLIENT, + g_param_spec_string ("client", "Client", + "The PulseAudio client name to use", clientname, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_READY)); + g_free (clientname); + + /** + * GstPulseSink:stream-properties + * + * List of pulseaudio stream properties. A list of defined properties can be + * found in the pulseaudio api docs. + * + * Below is an example for registering as a music application to pulseaudio. + * |[ + * GstStructure *props; + * + * props = gst_structure_from_string ("props,media.role=music", NULL); + * g_object_set (pulse, "stream-properties", props, NULL); + * gst_structure_free + * ]| + * + * Since: 0.10.26 + */ + g_object_class_install_property (gobject_class, + PROP_STREAM_PROPERTIES, + g_param_spec_boxed ("stream-properties", "stream properties", + "list of pulseaudio stream properties", + GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +/* returns the current time of the sink ringbuffer */ +static GstClockTime +gst_pulsesink_get_time (GstClock * clock, GstBaseAudioSink * sink) +{ + GstPulseSink *psink; + GstPulseRingBuffer *pbuf; + pa_usec_t time; + + if (!sink->ringbuffer || !sink->ringbuffer->acquired) + return GST_CLOCK_TIME_NONE; + + pbuf = GST_PULSERING_BUFFER_CAST (sink->ringbuffer); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + +#ifdef HAVE_PULSE_1_0 + if (g_atomic_int_get (&psink->format_lost)) { + /* Stream was lost in a format change, it'll get set up again once + * upstream renegotiates */ + return psink->format_lost_time; + } +#endif + + pa_threaded_mainloop_lock (mainloop); + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) + goto server_dead; + + /* if we don't have enough data to get a timestamp, just return NONE, which + * will return the last reported time */ + if (pa_stream_get_time (pbuf->stream, &time) < 0) { + GST_DEBUG_OBJECT (psink, "could not get time"); + time = GST_CLOCK_TIME_NONE; + } else + time *= 1000; + pa_threaded_mainloop_unlock (mainloop); + + GST_LOG_OBJECT (psink, "current time is %" GST_TIME_FORMAT, + GST_TIME_ARGS (time)); + + return time; + + /* ERRORS */ +server_dead: + { + GST_DEBUG_OBJECT (psink, "the server is dead"); + pa_threaded_mainloop_unlock (mainloop); + + return GST_CLOCK_TIME_NONE; + } +} + +static void +gst_pulsesink_sink_info_cb (pa_context * c, const pa_sink_info * i, int eol, + void *userdata) +{ + GstPulseRingBuffer *pbuf; + GstPulseSink *psink; +#ifdef HAVE_PULSE_1_0 + GList *l; + guint8 j; +#endif + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + if (!i) + goto done; + + g_free (psink->device_description); + psink->device_description = g_strdup (i->description); + +#ifdef HAVE_PULSE_1_0 + g_mutex_lock (psink->sink_formats_lock); + + for (l = g_list_first (psink->sink_formats); l; l = g_list_next (l)) + pa_format_info_free ((pa_format_info *) l->data); + + g_list_free (psink->sink_formats); + psink->sink_formats = NULL; + + for (j = 0; j < i->n_formats; j++) + psink->sink_formats = g_list_prepend (psink->sink_formats, + pa_format_info_copy (i->formats[j])); + + g_mutex_unlock (psink->sink_formats_lock); +#endif + +done: + pa_threaded_mainloop_signal (mainloop, 0); +} + +#ifdef HAVE_PULSE_1_0 +/* NOTE: If you're making changes here, see if pulseaudiosink acceptcaps also + * needs to be changed accordingly. */ +static gboolean +gst_pulsesink_pad_acceptcaps (GstPad * pad, GstCaps * caps) +{ + GstPulseSink *psink = GST_PULSESINK (gst_pad_get_parent_element (pad)); + GstPulseRingBuffer *pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK + (psink)->ringbuffer); + GstCaps *pad_caps; + GstStructure *st; + gboolean ret = FALSE; + + GstRingBufferSpec spec = { 0 }; + pa_stream *stream = NULL; + pa_operation *o = NULL; + pa_channel_map channel_map; + pa_stream_flags_t flags; + pa_format_info *format = NULL, *formats[1]; + guint channels; + + pad_caps = gst_pad_get_caps_reffed (pad); + if (pad_caps) { + ret = gst_caps_can_intersect (pad_caps, caps); + gst_caps_unref (pad_caps); + } + + /* Either template caps didn't match, or we're still in NULL state */ + if (!ret || !pbuf->context) + goto done; + + /* If we've not got fixed caps, creating a stream might fail, so let's just + * return from here with default acceptcaps behaviour */ + if (!gst_caps_is_fixed (caps)) + goto done; + + ret = FALSE; + + pa_threaded_mainloop_lock (mainloop); + + spec.latency_time = GST_BASE_AUDIO_SINK (psink)->latency_time; + if (!gst_ring_buffer_parse_caps (&spec, caps)) + goto out; + + if (!gst_pulse_fill_format_info (&spec, &format, &channels)) + goto out; + + /* Make sure input is framed (one frame per buffer) and can be payloaded */ + if (!pa_format_info_is_pcm (format)) { + gboolean framed = FALSE, parsed = FALSE; + st = gst_caps_get_structure (caps, 0); + + gst_structure_get_boolean (st, "framed", &framed); + gst_structure_get_boolean (st, "parsed", &parsed); + if ((!framed && !parsed) || gst_audio_iec61937_frame_size (&spec) <= 0) + goto out; + } + + /* initialize the channel map */ + if (pa_format_info_is_pcm (format) && + gst_pulse_gst_to_channel_map (&channel_map, &spec)) + pa_format_info_set_channel_map (format, &channel_map); + + if (pbuf->stream) { + /* We're already in PAUSED or above, so just reuse this stream to query + * sink formats and use those. */ + GList *i; + + if (!(o = pa_context_get_sink_info_by_name (pbuf->context, psink->device, + gst_pulsesink_sink_info_cb, pbuf))) + goto info_failed; + + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait (mainloop); + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) + goto out; + } + + g_mutex_lock (psink->sink_formats_lock); + for (i = g_list_first (psink->sink_formats); i; i = g_list_next (i)) { + if (pa_format_info_is_compatible ((pa_format_info *) i->data, format)) { + ret = TRUE; + break; + } + } + g_mutex_unlock (psink->sink_formats_lock); + } else { + /* We're in READY, let's connect a stream to see if the format is + * accpeted by whatever sink we're routed to */ + formats[0] = format; + + if (!(stream = pa_stream_new_extended (pbuf->context, "pulsesink probe", + formats, 1, psink->proplist))) + goto out; + + /* construct the flags */ + flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | + PA_STREAM_ADJUST_LATENCY | PA_STREAM_START_CORKED; + + pa_stream_set_state_callback (stream, gst_pulsering_stream_state_cb, pbuf); + + if (pa_stream_connect_playback (stream, psink->device, NULL, flags, NULL, + NULL) < 0) + goto out; + + ret = gst_pulsering_wait_for_stream_ready (psink, stream); + } + +out: + if (format) + pa_format_info_free (format); + + if (o) + pa_operation_unref (o); + + if (stream) { + pa_stream_set_state_callback (stream, NULL, NULL); + pa_stream_disconnect (stream); + pa_stream_unref (stream); + } + + pa_threaded_mainloop_unlock (mainloop); + +done: + gst_object_unref (psink); + return ret; + +info_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_context_get_sink_input_info() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto out; + } +} +#endif + +static void +gst_pulsesink_init (GstPulseSink * pulsesink, GstPulseSinkClass * klass) +{ + pulsesink->server = NULL; + pulsesink->device = NULL; + pulsesink->device_description = NULL; + pulsesink->client_name = gst_pulse_client_name (); + +#ifdef HAVE_PULSE_1_0 + pulsesink->sink_formats_lock = g_mutex_new (); + pulsesink->sink_formats = NULL; +#endif + + pulsesink->volume = DEFAULT_VOLUME; + pulsesink->volume_set = FALSE; + + pulsesink->mute = DEFAULT_MUTE; + pulsesink->mute_set = FALSE; + + pulsesink->notify = 0; + +#ifdef HAVE_PULSE_1_0 + g_atomic_int_set (&pulsesink->format_lost, FALSE); + pulsesink->format_lost_time = GST_CLOCK_TIME_NONE; +#endif + + pulsesink->properties = NULL; + pulsesink->proplist = NULL; + + /* override with a custom clock */ + if (GST_BASE_AUDIO_SINK (pulsesink)->provided_clock) + gst_object_unref (GST_BASE_AUDIO_SINK (pulsesink)->provided_clock); + + GST_BASE_AUDIO_SINK (pulsesink)->provided_clock = + gst_audio_clock_new ("GstPulseSinkClock", + (GstAudioClockGetTimeFunc) gst_pulsesink_get_time, pulsesink); + +#ifdef HAVE_PULSE_1_0 + gst_pad_set_acceptcaps_function (GST_BASE_SINK (pulsesink)->sinkpad, + GST_DEBUG_FUNCPTR (gst_pulsesink_pad_acceptcaps)); +#endif + + /* TRUE for sinks, FALSE for sources */ + pulsesink->probe = gst_pulseprobe_new (G_OBJECT (pulsesink), + G_OBJECT_GET_CLASS (pulsesink), PROP_DEVICE, pulsesink->device, + TRUE, FALSE); +} + +static void +gst_pulsesink_finalize (GObject * object) +{ + GstPulseSink *pulsesink = GST_PULSESINK_CAST (object); +#ifdef HAVE_PULSE_1_0 + GList *i; +#endif + + g_free (pulsesink->server); + g_free (pulsesink->device); + g_free (pulsesink->device_description); + g_free (pulsesink->client_name); + +#ifdef HAVE_PULSE_1_0 + for (i = g_list_first (pulsesink->sink_formats); i; i = g_list_next (i)) + pa_format_info_free ((pa_format_info *) i->data); + + g_list_free (pulsesink->sink_formats); + g_mutex_free (pulsesink->sink_formats_lock); +#endif + + if (pulsesink->properties) + gst_structure_free (pulsesink->properties); + if (pulsesink->proplist) + pa_proplist_free (pulsesink->proplist); + + if (pulsesink->probe) { + gst_pulseprobe_free (pulsesink->probe); + pulsesink->probe = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_pulsesink_set_volume (GstPulseSink * psink, gdouble volume) +{ + pa_cvolume v; + pa_operation *o = NULL; + GstPulseRingBuffer *pbuf; + uint32_t idx; + + if (!mainloop) + goto no_mainloop; + + pa_threaded_mainloop_lock (mainloop); + + GST_DEBUG_OBJECT (psink, "setting volume to %f", volume); + + pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); + if (pbuf == NULL || pbuf->stream == NULL) + goto no_buffer; + + if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX) + goto no_index; + +#ifdef HAVE_PULSE_1_0 + if (pbuf->is_pcm) + gst_pulse_cvolume_from_linear (&v, pbuf->channels, volume); + else + /* FIXME: this will eventually be superceded by checks to see if the volume + * is readable/writable */ + goto unlock; +#else + gst_pulse_cvolume_from_linear (&v, pbuf->sample_spec.channels, volume); +#endif + + if (!(o = pa_context_set_sink_input_volume (pbuf->context, idx, + &v, NULL, NULL))) + goto volume_failed; + + /* We don't really care about the result of this call */ +unlock: + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (mainloop); + + return; + + /* ERRORS */ +no_mainloop: + { + psink->volume = volume; + psink->volume_set = TRUE; + + GST_DEBUG_OBJECT (psink, "we have no mainloop"); + return; + } +no_buffer: + { + psink->volume = volume; + psink->volume_set = TRUE; + + GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); + goto unlock; + } +no_index: + { + GST_DEBUG_OBJECT (psink, "we don't have a stream index"); + goto unlock; + } +volume_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_stream_set_sink_input_volume() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock; + } +} + +static void +gst_pulsesink_set_mute (GstPulseSink * psink, gboolean mute) +{ + pa_operation *o = NULL; + GstPulseRingBuffer *pbuf; + uint32_t idx; + + if (!mainloop) + goto no_mainloop; + + pa_threaded_mainloop_lock (mainloop); + + GST_DEBUG_OBJECT (psink, "setting mute state to %d", mute); + + pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); + if (pbuf == NULL || pbuf->stream == NULL) + goto no_buffer; + + if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX) + goto no_index; + + if (!(o = pa_context_set_sink_input_mute (pbuf->context, idx, + mute, NULL, NULL))) + goto mute_failed; + + /* We don't really care about the result of this call */ +unlock: + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (mainloop); + + return; + + /* ERRORS */ +no_mainloop: + { + psink->mute = mute; + psink->mute_set = TRUE; + + GST_DEBUG_OBJECT (psink, "we have no mainloop"); + return; + } +no_buffer: + { + psink->mute = mute; + psink->mute_set = TRUE; + + GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); + goto unlock; + } +no_index: + { + GST_DEBUG_OBJECT (psink, "we don't have a stream index"); + goto unlock; + } +mute_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_stream_set_sink_input_mute() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock; + } +} + +static void +gst_pulsesink_sink_input_info_cb (pa_context * c, const pa_sink_input_info * i, + int eol, void *userdata) +{ + GstPulseRingBuffer *pbuf; + GstPulseSink *psink; + + pbuf = GST_PULSERING_BUFFER_CAST (userdata); + psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); + + if (!i) + goto done; + + if (!pbuf->stream) + goto done; + + /* If the index doesn't match our current stream, + * it implies we just recreated the stream (caps change) + */ + if (i->index == pa_stream_get_index (pbuf->stream)) { + psink->volume = pa_sw_volume_to_linear (pa_cvolume_max (&i->volume)); + psink->mute = i->mute; + } + +done: + pa_threaded_mainloop_signal (mainloop, 0); +} + +static gdouble +gst_pulsesink_get_volume (GstPulseSink * psink) +{ + GstPulseRingBuffer *pbuf; + pa_operation *o = NULL; + gdouble v = DEFAULT_VOLUME; + uint32_t idx; + + if (!mainloop) + goto no_mainloop; + + pa_threaded_mainloop_lock (mainloop); + + pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); + if (pbuf == NULL || pbuf->stream == NULL) + goto no_buffer; + + if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX) + goto no_index; + + if (!(o = pa_context_get_sink_input_info (pbuf->context, idx, + gst_pulsesink_sink_input_info_cb, pbuf))) + goto info_failed; + + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait (mainloop); + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) + goto unlock; + } + +unlock: + v = psink->volume; + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (mainloop); + + if (v > MAX_VOLUME) { + GST_WARNING_OBJECT (psink, "Clipped volume from %f to %f", v, MAX_VOLUME); + v = MAX_VOLUME; + } + + return v; + + /* ERRORS */ +no_mainloop: + { + v = psink->volume; + GST_DEBUG_OBJECT (psink, "we have no mainloop"); + return v; + } +no_buffer: + { + GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); + goto unlock; + } +no_index: + { + GST_DEBUG_OBJECT (psink, "we don't have a stream index"); + goto unlock; + } +info_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_context_get_sink_input_info() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock; + } +} + +static gboolean +gst_pulsesink_get_mute (GstPulseSink * psink) +{ + GstPulseRingBuffer *pbuf; + pa_operation *o = NULL; + uint32_t idx; + gboolean mute = FALSE; + + if (!mainloop) + goto no_mainloop; + + pa_threaded_mainloop_lock (mainloop); + mute = psink->mute; + + pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); + if (pbuf == NULL || pbuf->stream == NULL) + goto no_buffer; + + if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX) + goto no_index; + + if (!(o = pa_context_get_sink_input_info (pbuf->context, idx, + gst_pulsesink_sink_input_info_cb, pbuf))) + goto info_failed; + + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait (mainloop); + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) + goto unlock; + } + +unlock: + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (mainloop); + + return mute; + + /* ERRORS */ +no_mainloop: + { + mute = psink->mute; + GST_DEBUG_OBJECT (psink, "we have no mainloop"); + return mute; + } +no_buffer: + { + GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); + goto unlock; + } +no_index: + { + GST_DEBUG_OBJECT (psink, "we don't have a stream index"); + goto unlock; + } +info_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_context_get_sink_input_info() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock; + } +} + +static gchar * +gst_pulsesink_device_description (GstPulseSink * psink) +{ + GstPulseRingBuffer *pbuf; + pa_operation *o = NULL; + gchar *t; + + if (!mainloop) + goto no_mainloop; + + pa_threaded_mainloop_lock (mainloop); + pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); + if (pbuf == NULL) + goto no_buffer; + + if (!(o = pa_context_get_sink_info_by_name (pbuf->context, + psink->device, gst_pulsesink_sink_info_cb, pbuf))) + goto info_failed; + + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait (mainloop); + if (gst_pulsering_is_dead (psink, pbuf, FALSE)) + goto unlock; + } + +unlock: + if (o) + pa_operation_unref (o); + + t = g_strdup (psink->device_description); + pa_threaded_mainloop_unlock (mainloop); + + return t; + + /* ERRORS */ +no_mainloop: + { + GST_DEBUG_OBJECT (psink, "we have no mainloop"); + return NULL; + } +no_buffer: + { + GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); + goto unlock; + } +info_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_context_get_sink_info_by_index() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock; + } +} + +static void +gst_pulsesink_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstPulseSink *pulsesink = GST_PULSESINK_CAST (object); + + switch (prop_id) { + case PROP_SERVER: + g_free (pulsesink->server); + pulsesink->server = g_value_dup_string (value); + if (pulsesink->probe) + gst_pulseprobe_set_server (pulsesink->probe, pulsesink->server); + break; + case PROP_DEVICE: + g_free (pulsesink->device); + pulsesink->device = g_value_dup_string (value); + break; + case PROP_VOLUME: + gst_pulsesink_set_volume (pulsesink, g_value_get_double (value)); + break; + case PROP_MUTE: + gst_pulsesink_set_mute (pulsesink, g_value_get_boolean (value)); + break; + case PROP_CLIENT: + g_free (pulsesink->client_name); + if (!g_value_get_string (value)) { + GST_WARNING_OBJECT (pulsesink, + "Empty PulseAudio client name not allowed. Resetting to default value"); + pulsesink->client_name = gst_pulse_client_name (); + } else + pulsesink->client_name = g_value_dup_string (value); + break; + case PROP_STREAM_PROPERTIES: + if (pulsesink->properties) + gst_structure_free (pulsesink->properties); + pulsesink->properties = + gst_structure_copy (gst_value_get_structure (value)); + if (pulsesink->proplist) + pa_proplist_free (pulsesink->proplist); + pulsesink->proplist = gst_pulse_make_proplist (pulsesink->properties); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_pulsesink_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + + GstPulseSink *pulsesink = GST_PULSESINK_CAST (object); + + switch (prop_id) { + case PROP_SERVER: + g_value_set_string (value, pulsesink->server); + break; + case PROP_DEVICE: + g_value_set_string (value, pulsesink->device); + break; + case PROP_DEVICE_NAME: + g_value_take_string (value, gst_pulsesink_device_description (pulsesink)); + break; + case PROP_VOLUME: + g_value_set_double (value, gst_pulsesink_get_volume (pulsesink)); + break; + case PROP_MUTE: + g_value_set_boolean (value, gst_pulsesink_get_mute (pulsesink)); + break; + case PROP_CLIENT: + g_value_set_string (value, pulsesink->client_name); + break; + case PROP_STREAM_PROPERTIES: + gst_value_set_structure (value, pulsesink->properties); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_pulsesink_change_title (GstPulseSink * psink, const gchar * t) +{ + pa_operation *o = NULL; + GstPulseRingBuffer *pbuf; + + pa_threaded_mainloop_lock (mainloop); + + pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); + + if (pbuf == NULL || pbuf->stream == NULL) + goto no_buffer; + + g_free (pbuf->stream_name); + pbuf->stream_name = g_strdup (t); + + if (!(o = pa_stream_set_name (pbuf->stream, pbuf->stream_name, NULL, NULL))) + goto name_failed; + + /* We're not interested if this operation failed or not */ +unlock: + + if (o) + pa_operation_unref (o); + pa_threaded_mainloop_unlock (mainloop); + + return; + + /* ERRORS */ +no_buffer: + { + GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); + goto unlock; + } +name_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_stream_set_name() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock; + } +} + +static void +gst_pulsesink_change_props (GstPulseSink * psink, GstTagList * l) +{ + static const gchar *const map[] = { + GST_TAG_TITLE, PA_PROP_MEDIA_TITLE, + + /* might get overriden in the next iteration by GST_TAG_ARTIST */ + GST_TAG_PERFORMER, PA_PROP_MEDIA_ARTIST, + + GST_TAG_ARTIST, PA_PROP_MEDIA_ARTIST, + GST_TAG_LANGUAGE_CODE, PA_PROP_MEDIA_LANGUAGE, + GST_TAG_LOCATION, PA_PROP_MEDIA_FILENAME, + /* We might add more here later on ... */ + NULL + }; + pa_proplist *pl = NULL; + const gchar *const *t; + gboolean empty = TRUE; + pa_operation *o = NULL; + GstPulseRingBuffer *pbuf; + + pl = pa_proplist_new (); + + for (t = map; *t; t += 2) { + gchar *n = NULL; + + if (gst_tag_list_get_string (l, *t, &n)) { + + if (n && *n) { + pa_proplist_sets (pl, *(t + 1), n); + empty = FALSE; + } + + g_free (n); + } + } + if (empty) + goto finish; + + pa_threaded_mainloop_lock (mainloop); + pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); + if (pbuf == NULL || pbuf->stream == NULL) + goto no_buffer; + + if (!(o = pa_stream_proplist_update (pbuf->stream, PA_UPDATE_REPLACE, + pl, NULL, NULL))) + goto update_failed; + + /* We're not interested if this operation failed or not */ +unlock: + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (mainloop); + +finish: + + if (pl) + pa_proplist_free (pl); + + return; + + /* ERRORS */ +no_buffer: + { + GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); + goto unlock; + } +update_failed: + { + GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, + ("pa_stream_proplist_update() failed: %s", + pa_strerror (pa_context_errno (pbuf->context))), (NULL)); + goto unlock; + } +} + +static void +gst_pulsesink_flush_ringbuffer (GstPulseSink * psink) +{ + GstPulseRingBuffer *pbuf; + + pa_threaded_mainloop_lock (mainloop); + + pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); + + if (pbuf == NULL || pbuf->stream == NULL) + goto no_buffer; + + gst_pulsering_flush (pbuf); + + /* Uncork if we haven't already (happens when waiting to get enough data + * to send out the first time) */ + if (pbuf->corked) + gst_pulsering_set_corked (pbuf, FALSE, FALSE); + + /* We're not interested if this operation failed or not */ +unlock: + pa_threaded_mainloop_unlock (mainloop); + + return; + + /* ERRORS */ +no_buffer: + { + GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); + goto unlock; + } +} + +static gboolean +gst_pulsesink_event (GstBaseSink * sink, GstEvent * event) +{ + GstPulseSink *pulsesink = GST_PULSESINK_CAST (sink); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG:{ + gchar *title = NULL, *artist = NULL, *location = NULL, *description = + NULL, *t = NULL, *buf = NULL; + GstTagList *l; + + gst_event_parse_tag (event, &l); + + gst_tag_list_get_string (l, GST_TAG_TITLE, &title); + gst_tag_list_get_string (l, GST_TAG_ARTIST, &artist); + gst_tag_list_get_string (l, GST_TAG_LOCATION, &location); + gst_tag_list_get_string (l, GST_TAG_DESCRIPTION, &description); + + if (!artist) + gst_tag_list_get_string (l, GST_TAG_PERFORMER, &artist); + + if (title && artist) + /* TRANSLATORS: 'song title' by 'artist name' */ + t = buf = g_strdup_printf (_("'%s' by '%s'"), g_strstrip (title), + g_strstrip (artist)); + else if (title) + t = g_strstrip (title); + else if (description) + t = g_strstrip (description); + else if (location) + t = g_strstrip (location); + + if (t) + gst_pulsesink_change_title (pulsesink, t); + + g_free (title); + g_free (artist); + g_free (location); + g_free (description); + g_free (buf); + + gst_pulsesink_change_props (pulsesink, l); + + break; + } + case GST_EVENT_EOS: + gst_pulsesink_flush_ringbuffer (pulsesink); + break; + default: + ; + } + + return GST_BASE_SINK_CLASS (parent_class)->event (sink, event); +} + +static void +gst_pulsesink_release_mainloop (GstPulseSink * psink) +{ + if (!mainloop) + return; + + pa_threaded_mainloop_lock (mainloop); + while (psink->defer_pending) { + GST_DEBUG_OBJECT (psink, "waiting for stream status message emission"); + pa_threaded_mainloop_wait (mainloop); + } + pa_threaded_mainloop_unlock (mainloop); + + g_mutex_lock (pa_shared_resource_mutex); + mainloop_ref_ct--; + if (!mainloop_ref_ct) { + GST_INFO_OBJECT (psink, "terminating pa main loop thread"); + pa_threaded_mainloop_stop (mainloop); + pa_threaded_mainloop_free (mainloop); + mainloop = NULL; + } + g_mutex_unlock (pa_shared_resource_mutex); +} + +static GstStateChangeReturn +gst_pulsesink_change_state (GstElement * element, GstStateChange transition) +{ + GstPulseSink *pulsesink = GST_PULSESINK (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + g_mutex_lock (pa_shared_resource_mutex); + if (!mainloop_ref_ct) { + GST_INFO_OBJECT (element, "new pa main loop thread"); + if (!(mainloop = pa_threaded_mainloop_new ())) + goto mainloop_failed; + if (pa_threaded_mainloop_start (mainloop) < 0) { + pa_threaded_mainloop_free (mainloop); + goto mainloop_start_failed; + } + mainloop_ref_ct = 1; + g_mutex_unlock (pa_shared_resource_mutex); + } else { + GST_INFO_OBJECT (element, "reusing pa main loop thread"); + mainloop_ref_ct++; + g_mutex_unlock (pa_shared_resource_mutex); + } + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_element_post_message (element, + gst_message_new_clock_provide (GST_OBJECT_CAST (element), + GST_BASE_AUDIO_SINK (pulsesink)->provided_clock, TRUE)); + break; + + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + goto state_failure; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + /* format_lost is reset in release() in baseaudiosink */ + gst_element_post_message (element, + gst_message_new_clock_lost (GST_OBJECT_CAST (element), + GST_BASE_AUDIO_SINK (pulsesink)->provided_clock)); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + gst_pulsesink_release_mainloop (pulsesink); + break; + default: + break; + } + + return ret; + + /* ERRORS */ +mainloop_failed: + { + g_mutex_unlock (pa_shared_resource_mutex); + GST_ELEMENT_ERROR (pulsesink, RESOURCE, FAILED, + ("pa_threaded_mainloop_new() failed"), (NULL)); + return GST_STATE_CHANGE_FAILURE; + } +mainloop_start_failed: + { + g_mutex_unlock (pa_shared_resource_mutex); + GST_ELEMENT_ERROR (pulsesink, RESOURCE, FAILED, + ("pa_threaded_mainloop_start() failed"), (NULL)); + return GST_STATE_CHANGE_FAILURE; + } +state_failure: + { + if (transition == GST_STATE_CHANGE_NULL_TO_READY) { + /* Clear the PA mainloop if baseaudiosink failed to open the ring_buffer */ + g_assert (mainloop); + gst_pulsesink_release_mainloop (pulsesink); + } + return ret; + } +} diff --git a/ext/pulse/pulsesink.h b/ext/pulse/pulsesink.h new file mode 100644 index 0000000..340b481 --- /dev/null +++ b/ext/pulse/pulsesink.h @@ -0,0 +1,182 @@ +/*-*- Mode: C; c-basic-offset: 2 -*-*/ + +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __GST_PULSESINK_H__ +#define __GST_PULSESINK_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include + +#include "pulseprobe.h" + +G_BEGIN_DECLS + +#define GST_TYPE_PULSESINK \ + (gst_pulsesink_get_type()) +#define GST_PULSESINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSESINK,GstPulseSink)) +#define GST_PULSESINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSESINK,GstPulseSinkClass)) +#define GST_IS_PULSESINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSESINK)) +#define GST_IS_PULSESINK_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSESINK)) +#define GST_PULSESINK_CAST(obj) \ + ((GstPulseSink *)(obj)) + +typedef struct _GstPulseSink GstPulseSink; +typedef struct _GstPulseSinkClass GstPulseSinkClass; + +struct _GstPulseSink +{ + GstBaseAudioSink sink; + + gchar *server, *device, *stream_name, *client_name; + gchar *device_description; + + GstPulseProbe *probe; + + gdouble volume; + gboolean volume_set:1; + gboolean mute:1; + gboolean mute_set:1; + + guint defer_pending; + + gint notify; /* atomic */ + + const gchar *pa_version; + + GstStructure *properties; + pa_proplist *proplist; + +#ifdef HAVE_PULSE_1_0 + GMutex *sink_formats_lock; + GList *sink_formats; + volatile gint format_lost; + GstClockTime format_lost_time; +#endif +}; + +struct _GstPulseSinkClass +{ + GstBaseAudioSinkClass parent_class; +}; + +GType gst_pulsesink_get_type (void); + +#if (G_BYTE_ORDER == G_LITTLE_ENDIAN) +# define ENDIANNESS "LITTLE_ENDIAN, BIG_ENDIAN" +#else +# define ENDIANNESS "BIG_ENDIAN, LITTLE_ENDIAN" +#endif + +#define _PULSE_SINK_CAPS_COMMON \ + "audio/x-raw-int, " \ + "endianness = (int) { " ENDIANNESS " }, " \ + "signed = (boolean) TRUE, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 32 ];" \ + "audio/x-raw-float, " \ + "endianness = (int) { " ENDIANNESS " }, " \ + "width = (int) 32, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 32 ];" \ + "audio/x-raw-int, " \ + "endianness = (int) { " ENDIANNESS " }, " \ + "signed = (boolean) TRUE, " \ + "width = (int) 32, " \ + "depth = (int) 32, " \ + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];" \ + "audio/x-raw-int, " \ + "signed = (boolean) FALSE, " \ + "width = (int) 8, " \ + "depth = (int) 8, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 32 ];" \ + "audio/x-alaw, " \ + "rate = (int) [ 1, MAX], " \ + "channels = (int) [ 1, 32 ];" \ + "audio/x-mulaw, " \ + "rate = (int) [ 1, MAX], " "channels = (int) [ 1, 32 ];" \ + "audio/x-raw-int, " \ + "endianness = (int) { " ENDIANNESS " }, " \ + "signed = (boolean) TRUE, " \ + "width = (int) 24, " \ + "depth = (int) 24, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 32 ];" \ + "audio/x-raw-int, " \ + "endianness = (int) { " ENDIANNESS " }, " \ + "signed = (boolean) TRUE, " \ + "width = (int) 32, " \ + "depth = (int) 24, " \ + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];" + +#ifdef HAVE_PULSE_1_0 +#define _PULSE_SINK_CAPS_1_0 \ + "audio/x-ac3, framed = (boolean) true;" \ + "audio/x-eac3, framed = (boolean) true; " \ + "audio/x-dts, framed = (boolean) true, " \ + "block-size = (int) { 512, 1024, 2048 }; " \ + "audio/mpeg, mpegversion = (int) 1, " \ + "mpegaudioversion = (int) [ 1, 2 ], parsed = (boolean) true;" +#else +#define _PULSE_SINK_CAPS_1_0 "" +#endif + +#define PULSE_SINK_TEMPLATE_CAPS \ + _PULSE_SINK_CAPS_COMMON \ + _PULSE_SINK_CAPS_1_0 + +#ifdef HAVE_PULSE_1_0 + +#define GST_TYPE_PULSE_AUDIO_SINK \ + (gst_pulse_audio_sink_get_type()) +#define GST_PULSE_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSE_AUDIO_SINK,GstPulseAudioSink)) +#define GST_PULSE_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSE_AUDIO_SINK,GstPulseAudioSinkClass)) +#define GST_IS_PULSE_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSE_AUDIO_SINK)) +#define GST_IS_PULSE_AUDIO_SINK_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSE_AUDIO_SINK)) +#define GST_PULSE_AUDIO_SINK_CAST(obj) \ + ((GstPulseAudioSink *)(obj)) + +GType gst_pulse_audio_sink_get_type (void); + +#endif /* HAVE_PULSE_1_0 */ + +G_END_DECLS + +#endif /* __GST_PULSESINK_H__ */ diff --git a/ext/pulse/pulsesrc.c b/ext/pulse/pulsesrc.c new file mode 100644 index 0000000..12e5282 --- /dev/null +++ b/ext/pulse/pulsesrc.c @@ -0,0 +1,1750 @@ +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +/** + * SECTION:element-pulsesrc + * @see_also: pulsesink, pulsemixer + * + * This element captures audio from a + * PulseAudio sound server. + * + * + * Example pipelines + * |[ + * gst-launch -v pulsesrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=alsasrc.ogg + * ]| Record from a sound card using pulseaudio and encode to Ogg/Vorbis. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include +#ifdef HAVE_PULSE_1_0 +#include +#endif + +#include "pulsesrc.h" +#include "pulseutil.h" +#include "pulsemixerctrl.h" + +GST_DEBUG_CATEGORY_EXTERN (pulse_debug); +#define GST_CAT_DEFAULT pulse_debug + +#define DEFAULT_SERVER NULL +#define DEFAULT_DEVICE NULL +#define DEFAULT_DEVICE_NAME NULL + +#ifdef HAVE_PULSE_1_0 +#define DEFAULT_VOLUME 1.0 +#define DEFAULT_MUTE FALSE +#define MAX_VOLUME 10.0 +#endif + +enum +{ + PROP_0, + PROP_SERVER, + PROP_DEVICE, + PROP_DEVICE_NAME, + PROP_CLIENT, + PROP_STREAM_PROPERTIES, + PROP_SOURCE_OUTPUT_INDEX, +#ifdef HAVE_PULSE_1_0 + PROP_VOLUME, + PROP_MUTE, +#endif + PROP_LAST +}; + +static void gst_pulsesrc_destroy_stream (GstPulseSrc * pulsesrc); +static void gst_pulsesrc_destroy_context (GstPulseSrc * pulsesrc); + +static void gst_pulsesrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_pulsesrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_pulsesrc_finalize (GObject * object); + +static gboolean gst_pulsesrc_open (GstAudioSrc * asrc); + +static gboolean gst_pulsesrc_close (GstAudioSrc * asrc); + +static gboolean gst_pulsesrc_prepare (GstAudioSrc * asrc, + GstRingBufferSpec * spec); + +static gboolean gst_pulsesrc_unprepare (GstAudioSrc * asrc); + +static guint gst_pulsesrc_read (GstAudioSrc * asrc, gpointer data, + guint length); +static guint gst_pulsesrc_delay (GstAudioSrc * asrc); + +static void gst_pulsesrc_reset (GstAudioSrc * src); + +static gboolean gst_pulsesrc_negotiate (GstBaseSrc * basesrc); + +static GstStateChangeReturn gst_pulsesrc_change_state (GstElement * + element, GstStateChange transition); + +static void gst_pulsesrc_init_interfaces (GType type); + +#if (G_BYTE_ORDER == G_LITTLE_ENDIAN) +# define ENDIANNESS "LITTLE_ENDIAN, BIG_ENDIAN" +#else +# define ENDIANNESS "BIG_ENDIAN, LITTLE_ENDIAN" +#endif + +GST_IMPLEMENT_PULSEMIXER_CTRL_METHODS (GstPulseSrc, gst_pulsesrc); +GST_IMPLEMENT_PULSEPROBE_METHODS (GstPulseSrc, gst_pulsesrc); +GST_BOILERPLATE_FULL (GstPulseSrc, gst_pulsesrc, GstAudioSrc, + GST_TYPE_AUDIO_SRC, gst_pulsesrc_init_interfaces); + +static gboolean +gst_pulsesrc_interface_supported (GstImplementsInterface * + iface, GType interface_type) +{ + GstPulseSrc *this = GST_PULSESRC_CAST (iface); + + if (interface_type == GST_TYPE_MIXER && this->mixer) + return TRUE; + + if (interface_type == GST_TYPE_PROPERTY_PROBE && this->probe) + return TRUE; + +#ifdef HAVE_PULSE_1_0 + if (interface_type == GST_TYPE_STREAM_VOLUME) + return TRUE; +#endif + + return FALSE; +} + +static void +gst_pulsesrc_implements_interface_init (GstImplementsInterfaceClass * klass) +{ + klass->supported = gst_pulsesrc_interface_supported; +} + +static void +gst_pulsesrc_init_interfaces (GType type) +{ +#ifdef HAVE_PULSE_1_0 + static const GInterfaceInfo svol_iface_info = { + NULL, NULL, NULL, + }; +#endif + static const GInterfaceInfo implements_iface_info = { + (GInterfaceInitFunc) gst_pulsesrc_implements_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo mixer_iface_info = { + (GInterfaceInitFunc) gst_pulsesrc_mixer_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo probe_iface_info = { + (GInterfaceInitFunc) gst_pulsesrc_property_probe_interface_init, + NULL, + NULL, + }; + +#ifdef HAVE_PULSE_1_0 + g_type_add_interface_static (type, GST_TYPE_STREAM_VOLUME, &svol_iface_info); +#endif + g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, + &implements_iface_info); + g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info); + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &probe_iface_info); +} + +static void +gst_pulsesrc_base_init (gpointer g_class) +{ + + static GstStaticPadTemplate pad_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) { " ENDIANNESS " }, " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, 32 ];" + "audio/x-raw-float, " + "endianness = (int) { " ENDIANNESS " }, " + "width = (int) 32, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, 32 ];" + "audio/x-raw-int, " + "endianness = (int) { " ENDIANNESS " }, " + "signed = (boolean) TRUE, " + "width = (int) 32, " + "depth = (int) 32, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, 32 ];" + "audio/x-raw-int, " + "signed = (boolean) FALSE, " + "width = (int) 8, " + "depth = (int) 8, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, 32 ];" + "audio/x-alaw, " + "rate = (int) [ 1, MAX], " + "channels = (int) [ 1, 32 ];" + "audio/x-mulaw, " + "rate = (int) [ 1, MAX], " "channels = (int) [ 1, 32 ]") + ); + + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "PulseAudio Audio Source", + "Source/Audio", + "Captures audio from a PulseAudio server", "Lennart Poettering"); + gst_element_class_add_static_pad_template (element_class, &pad_template); +} + +static void +gst_pulsesrc_class_init (GstPulseSrcClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstAudioSrcClass *gstaudiosrc_class = GST_AUDIO_SRC_CLASS (klass); + GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + gchar *clientname; + + gobject_class->finalize = gst_pulsesrc_finalize; + gobject_class->set_property = gst_pulsesrc_set_property; + gobject_class->get_property = gst_pulsesrc_get_property; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_pulsesrc_change_state); + + gstbasesrc_class->negotiate = GST_DEBUG_FUNCPTR (gst_pulsesrc_negotiate); + + gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_pulsesrc_open); + gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_pulsesrc_close); + gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_pulsesrc_prepare); + gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_pulsesrc_unprepare); + gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_pulsesrc_read); + gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_pulsesrc_delay); + gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_pulsesrc_reset); + + /* Overwrite GObject fields */ + g_object_class_install_property (gobject_class, + PROP_SERVER, + g_param_spec_string ("server", "Server", + "The PulseAudio server to connect to", DEFAULT_SERVER, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "The PulseAudio source device to connect to", DEFAULT_DEVICE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + clientname = gst_pulse_client_name (); + /** + * GstPulseSrc:client + * + * The PulseAudio client name to use. + * + * Since: 0.10.27 + */ + g_object_class_install_property (gobject_class, + PROP_CLIENT, + g_param_spec_string ("client", "Client", + "The PulseAudio client_name_to_use", clientname, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_READY)); + g_free (clientname); + + /** + * GstPulseSrc:stream-properties + * + * List of pulseaudio stream properties. A list of defined properties can be + * found in the pulseaudio api docs. + * + * Below is an example for registering as a music application to pulseaudio. + * |[ + * GstStructure *props; + * + * props = gst_structure_from_string ("props,media.role=music", NULL); + * g_object_set (pulse, "stream-properties", props, NULL); + * gst_structure_free (props); + * ]| + * + * Since: 0.10.26 + */ + g_object_class_install_property (gobject_class, + PROP_STREAM_PROPERTIES, + g_param_spec_boxed ("stream-properties", "stream properties", + "list of pulseaudio stream properties", + GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstPulseSrc:source-output-index + * + * The index of the PulseAudio source output corresponding to this element. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, + PROP_SOURCE_OUTPUT_INDEX, + g_param_spec_uint ("source-output-index", "source output index", + "The index of the PulseAudio source output corresponding to this " + "record stream", 0, G_MAXUINT, PA_INVALID_INDEX, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + +#ifdef HAVE_PULSE_1_0 + /** + * GstPulseSrc:volume + * + * The volume of the record stream. Only works when using PulseAudio 1.0 or + * later. + * + * Since: 0.10.36 + */ + g_object_class_install_property (gobject_class, + PROP_VOLUME, g_param_spec_double ("volume", "Volume", + "Linear volume of this stream, 1.0=100%", + 0.0, MAX_VOLUME, DEFAULT_VOLUME, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstPulseSrc:mute + * + * Whether the stream is muted or not. Only works when using PulseAudio 1.0 + * or later. + * + * Since: 0.10.36 + */ + g_object_class_install_property (gobject_class, + PROP_MUTE, g_param_spec_boolean ("mute", "Mute", + "Mute state of this stream", + DEFAULT_MUTE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +#endif +} + +static void +gst_pulsesrc_init (GstPulseSrc * pulsesrc, GstPulseSrcClass * klass) +{ + pulsesrc->server = NULL; + pulsesrc->device = NULL; + pulsesrc->client_name = gst_pulse_client_name (); + pulsesrc->device_description = NULL; + + pulsesrc->context = NULL; + pulsesrc->stream = NULL; + pulsesrc->source_output_idx = PA_INVALID_INDEX; + + pulsesrc->read_buffer = NULL; + pulsesrc->read_buffer_length = 0; + + pa_sample_spec_init (&pulsesrc->sample_spec); + + pulsesrc->operation_success = FALSE; + pulsesrc->paused = FALSE; + pulsesrc->in_read = FALSE; + +#ifdef HAVE_PULSE_1_0 + pulsesrc->volume = DEFAULT_VOLUME; + pulsesrc->volume_set = FALSE; + + pulsesrc->mute = DEFAULT_MUTE; + pulsesrc->mute_set = FALSE; + + pulsesrc->notify = 0; +#endif + + pulsesrc->mixer = NULL; + + pulsesrc->properties = NULL; + pulsesrc->proplist = NULL; + + pulsesrc->probe = gst_pulseprobe_new (G_OBJECT (pulsesrc), G_OBJECT_GET_CLASS (pulsesrc), PROP_DEVICE, pulsesrc->server, FALSE, TRUE); /* FALSE for sinks, TRUE for sources */ + + /* this should be the default but it isn't yet */ + gst_base_audio_src_set_slave_method (GST_BASE_AUDIO_SRC (pulsesrc), + GST_BASE_AUDIO_SRC_SLAVE_SKEW); +} + +static void +gst_pulsesrc_destroy_stream (GstPulseSrc * pulsesrc) +{ + if (pulsesrc->stream) { + pa_stream_disconnect (pulsesrc->stream); + pa_stream_unref (pulsesrc->stream); + pulsesrc->stream = NULL; + pulsesrc->source_output_idx = PA_INVALID_INDEX; + g_object_notify (G_OBJECT (pulsesrc), "source-output-index"); + } + + g_free (pulsesrc->device_description); + pulsesrc->device_description = NULL; +} + +static void +gst_pulsesrc_destroy_context (GstPulseSrc * pulsesrc) +{ + + gst_pulsesrc_destroy_stream (pulsesrc); + + if (pulsesrc->context) { + pa_context_disconnect (pulsesrc->context); + + /* Make sure we don't get any further callbacks */ + pa_context_set_state_callback (pulsesrc->context, NULL, NULL); +#ifdef HAVE_PULSE_1_0 + pa_context_set_subscribe_callback (pulsesrc->context, NULL, NULL); +#endif + + pa_context_unref (pulsesrc->context); + + pulsesrc->context = NULL; + } +} + +static void +gst_pulsesrc_finalize (GObject * object) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (object); + + g_free (pulsesrc->server); + g_free (pulsesrc->device); + g_free (pulsesrc->client_name); + + if (pulsesrc->properties) + gst_structure_free (pulsesrc->properties); + if (pulsesrc->proplist) + pa_proplist_free (pulsesrc->proplist); + + if (pulsesrc->mixer) { + gst_pulsemixer_ctrl_free (pulsesrc->mixer); + pulsesrc->mixer = NULL; + } + + if (pulsesrc->probe) { + gst_pulseprobe_free (pulsesrc->probe); + pulsesrc->probe = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +#define CONTEXT_OK(c) ((c) && PA_CONTEXT_IS_GOOD (pa_context_get_state ((c)))) +#define STREAM_OK(s) ((s) && PA_STREAM_IS_GOOD (pa_stream_get_state ((s)))) + +static gboolean +gst_pulsesrc_is_dead (GstPulseSrc * pulsesrc, gboolean check_stream) +{ + if (!CONTEXT_OK (pulsesrc->context)) + goto error; + + if (check_stream && !STREAM_OK (pulsesrc->stream)) + goto error; + + return FALSE; + +error: + { + const gchar *err_str = pulsesrc->context ? + pa_strerror (pa_context_errno (pulsesrc->context)) : NULL; + GST_ELEMENT_ERROR ((pulsesrc), RESOURCE, FAILED, ("Disconnected: %s", + err_str), (NULL)); + return TRUE; + } +} + +static void +gst_pulsesrc_source_info_cb (pa_context * c, const pa_source_info * i, int eol, + void *userdata) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); + + if (!i) + goto done; + + g_free (pulsesrc->device_description); + pulsesrc->device_description = g_strdup (i->description); + +done: + pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); +} + +static gchar * +gst_pulsesrc_device_description (GstPulseSrc * pulsesrc) +{ + pa_operation *o = NULL; + gchar *t; + + if (!pulsesrc->mainloop) + goto no_mainloop; + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + + if (!(o = pa_context_get_source_info_by_name (pulsesrc->context, + pulsesrc->device, gst_pulsesrc_source_info_cb, pulsesrc))) { + + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_stream_get_source_info() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock; + } + + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + + if (gst_pulsesrc_is_dead (pulsesrc, FALSE)) + goto unlock; + + pa_threaded_mainloop_wait (pulsesrc->mainloop); + } + +unlock: + + if (o) + pa_operation_unref (o); + + t = g_strdup (pulsesrc->device_description); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return t; + +no_mainloop: + { + GST_DEBUG_OBJECT (pulsesrc, "have no mainloop"); + return NULL; + } +} + +#ifdef HAVE_PULSE_1_0 +static void +gst_pulsesrc_source_output_info_cb (pa_context * c, + const pa_source_output_info * i, int eol, void *userdata) +{ + GstPulseSrc *psrc; + + psrc = GST_PULSESRC_CAST (userdata); + + if (!i) + goto done; + + /* If the index doesn't match our current stream, + * it implies we just recreated the stream (caps change) + */ + if (i->index == psrc->source_output_idx) { + psrc->volume = pa_sw_volume_to_linear (pa_cvolume_max (&i->volume)); + psrc->mute = i->mute; + } + +done: + pa_threaded_mainloop_signal (psrc->mainloop, 0); +} + +static gdouble +gst_pulsesrc_get_stream_volume (GstPulseSrc * pulsesrc) +{ + pa_operation *o = NULL; + gdouble v; + + if (!pulsesrc->mainloop) + goto no_mainloop; + + if (pulsesrc->source_output_idx == PA_INVALID_INDEX) + goto no_index; + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + + if (!(o = pa_context_get_source_output_info (pulsesrc->context, + pulsesrc->source_output_idx, gst_pulsesrc_source_output_info_cb, + pulsesrc))) + goto info_failed; + + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait (pulsesrc->mainloop); + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) + goto unlock; + } + +unlock: + v = pulsesrc->volume; + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + if (v > MAX_VOLUME) { + GST_WARNING_OBJECT (pulsesrc, "Clipped volume from %f to %f", v, + MAX_VOLUME); + v = MAX_VOLUME; + } + + return v; + + /* ERRORS */ +no_mainloop: + { + v = pulsesrc->volume; + GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); + return v; + } +no_index: + { + v = pulsesrc->volume; + GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); + return v; + } +info_failed: + { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_context_get_source_output_info() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock; + } +} + +static gboolean +gst_pulsesrc_get_stream_mute (GstPulseSrc * pulsesrc) +{ + pa_operation *o = NULL; + gboolean mute; + + if (!pulsesrc->mainloop) + goto no_mainloop; + + if (pulsesrc->source_output_idx == PA_INVALID_INDEX) + goto no_index; + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + + if (!(o = pa_context_get_source_output_info (pulsesrc->context, + pulsesrc->source_output_idx, gst_pulsesrc_source_output_info_cb, + pulsesrc))) + goto info_failed; + + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait (pulsesrc->mainloop); + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) + goto unlock; + } + +unlock: + mute = pulsesrc->mute; + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return mute; + + /* ERRORS */ +no_mainloop: + { + mute = pulsesrc->mute; + GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); + return mute; + } +no_index: + { + mute = pulsesrc->mute; + GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); + return mute; + } +info_failed: + { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_context_get_source_output_info() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock; + } +} + +static void +gst_pulsesrc_set_stream_volume (GstPulseSrc * pulsesrc, gdouble volume) +{ + pa_cvolume v; + pa_operation *o = NULL; + + if (!pulsesrc->mainloop) + goto no_mainloop; + + if (!pulsesrc->source_output_idx) + goto no_index; + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + + GST_DEBUG_OBJECT (pulsesrc, "setting volume to %f", volume); + + gst_pulse_cvolume_from_linear (&v, pulsesrc->sample_spec.channels, volume); + + if (!(o = pa_context_set_source_output_volume (pulsesrc->context, + pulsesrc->source_output_idx, &v, NULL, NULL))) + goto volume_failed; + + /* We don't really care about the result of this call */ +unlock: + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return; + + /* ERRORS */ +no_mainloop: + { + pulsesrc->volume = volume; + pulsesrc->volume_set = TRUE; + GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); + return; + } +no_index: + { + pulsesrc->volume = volume; + pulsesrc->volume_set = TRUE; + GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); + return; + } +volume_failed: + { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_stream_set_source_output_volume() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock; + } +} + +static void +gst_pulsesrc_set_stream_mute (GstPulseSrc * pulsesrc, gboolean mute) +{ + pa_operation *o = NULL; + + if (!pulsesrc->mainloop) + goto no_mainloop; + + if (!pulsesrc->source_output_idx) + goto no_index; + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + + GST_DEBUG_OBJECT (pulsesrc, "setting mute state to %d", mute); + + if (!(o = pa_context_set_source_output_mute (pulsesrc->context, + pulsesrc->source_output_idx, mute, NULL, NULL))) + goto mute_failed; + + /* We don't really care about the result of this call */ +unlock: + + if (o) + pa_operation_unref (o); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return; + + /* ERRORS */ +no_mainloop: + { + pulsesrc->mute = mute; + pulsesrc->mute_set = TRUE; + GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); + return; + } +no_index: + { + pulsesrc->mute = mute; + pulsesrc->mute_set = TRUE; + GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); + return; + } +mute_failed: + { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_stream_set_source_output_mute() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock; + } +} +#endif + +static void +gst_pulsesrc_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (object); + + switch (prop_id) { + case PROP_SERVER: + g_free (pulsesrc->server); + pulsesrc->server = g_value_dup_string (value); + if (pulsesrc->probe) + gst_pulseprobe_set_server (pulsesrc->probe, pulsesrc->server); + break; + case PROP_DEVICE: + g_free (pulsesrc->device); + pulsesrc->device = g_value_dup_string (value); + break; + case PROP_CLIENT: + g_free (pulsesrc->client_name); + if (!g_value_get_string (value)) { + GST_WARNING_OBJECT (pulsesrc, + "Empty PulseAudio client name not allowed. Resetting to default value"); + pulsesrc->client_name = gst_pulse_client_name (); + } else + pulsesrc->client_name = g_value_dup_string (value); + break; + case PROP_STREAM_PROPERTIES: + if (pulsesrc->properties) + gst_structure_free (pulsesrc->properties); + pulsesrc->properties = + gst_structure_copy (gst_value_get_structure (value)); + if (pulsesrc->proplist) + pa_proplist_free (pulsesrc->proplist); + pulsesrc->proplist = gst_pulse_make_proplist (pulsesrc->properties); + break; +#ifdef HAVE_PULSE_1_0 + case PROP_VOLUME: + gst_pulsesrc_set_stream_volume (pulsesrc, g_value_get_double (value)); + break; + case PROP_MUTE: + gst_pulsesrc_set_stream_mute (pulsesrc, g_value_get_boolean (value)); + break; +#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_pulsesrc_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (object); + + switch (prop_id) { + case PROP_SERVER: + g_value_set_string (value, pulsesrc->server); + break; + case PROP_DEVICE: + g_value_set_string (value, pulsesrc->device); + break; + case PROP_DEVICE_NAME: + g_value_take_string (value, gst_pulsesrc_device_description (pulsesrc)); + break; + case PROP_CLIENT: + g_value_set_string (value, pulsesrc->client_name); + break; + case PROP_STREAM_PROPERTIES: + gst_value_set_structure (value, pulsesrc->properties); + break; + case PROP_SOURCE_OUTPUT_INDEX: + g_value_set_uint (value, pulsesrc->source_output_idx); + break; +#ifdef HAVE_PULSE_1_0 + case PROP_VOLUME: + g_value_set_double (value, gst_pulsesrc_get_stream_volume (pulsesrc)); + break; + case PROP_MUTE: + g_value_set_boolean (value, gst_pulsesrc_get_stream_mute (pulsesrc)); + break; +#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_pulsesrc_context_state_cb (pa_context * c, void *userdata) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); + + switch (pa_context_get_state (c)) { + case PA_CONTEXT_READY: + case PA_CONTEXT_TERMINATED: + case PA_CONTEXT_FAILED: + pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); + break; + + case PA_CONTEXT_UNCONNECTED: + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + break; + } +} + +static void +gst_pulsesrc_stream_state_cb (pa_stream * s, void *userdata) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); + + switch (pa_stream_get_state (s)) { + + case PA_STREAM_READY: + case PA_STREAM_FAILED: + case PA_STREAM_TERMINATED: + pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); + break; + + case PA_STREAM_UNCONNECTED: + case PA_STREAM_CREATING: + break; + } +} + +static void +gst_pulsesrc_stream_request_cb (pa_stream * s, size_t length, void *userdata) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); + + GST_LOG_OBJECT (pulsesrc, "got request for length %" G_GSIZE_FORMAT, length); + + if (pulsesrc->in_read) { + /* only signal when reading */ + pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); + } +} + +static void +gst_pulsesrc_stream_latency_update_cb (pa_stream * s, void *userdata) +{ + const pa_timing_info *info; + pa_usec_t source_usec; + + info = pa_stream_get_timing_info (s); + + if (!info) { + GST_LOG_OBJECT (GST_PULSESRC_CAST (userdata), + "latency update (information unknown)"); + return; + } + source_usec = info->configured_source_usec; + + GST_LOG_OBJECT (GST_PULSESRC_CAST (userdata), + "latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%" + G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT, + GST_TIMEVAL_TO_TIME (info->timestamp), info->write_index_corrupt, + info->write_index, info->read_index_corrupt, info->read_index, + info->source_usec, source_usec); +} + +static void +gst_pulsesrc_stream_underflow_cb (pa_stream * s, void *userdata) +{ + GST_WARNING_OBJECT (GST_PULSESRC_CAST (userdata), "Got underflow"); +} + +static void +gst_pulsesrc_stream_overflow_cb (pa_stream * s, void *userdata) +{ + GST_WARNING_OBJECT (GST_PULSESRC_CAST (userdata), "Got overflow"); +} + +#ifdef HAVE_PULSE_1_0 +static void +gst_pulsesrc_context_subscribe_cb (pa_context * c, + pa_subscription_event_type_t t, uint32_t idx, void *userdata) +{ + GstPulseSrc *psrc = GST_PULSESRC (userdata); + + if (t != (PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_CHANGE) + && t != (PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_NEW)) + return; + + if (idx != psrc->source_output_idx) + return; + + /* Actually this event is also triggered when other properties of the stream + * change that are unrelated to the volume. However it is probably cheaper to + * signal the change here and check for the volume when the GObject property + * is read instead of querying it always. */ + + /* inform streaming thread to notify */ + g_atomic_int_compare_and_exchange (&psrc->notify, 0, 1); +} +#endif + +static gboolean +gst_pulsesrc_open (GstAudioSrc * asrc) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + + g_assert (!pulsesrc->context); + g_assert (!pulsesrc->stream); + + GST_DEBUG_OBJECT (pulsesrc, "opening device"); + + if (!(pulsesrc->context = + pa_context_new (pa_threaded_mainloop_get_api (pulsesrc->mainloop), + pulsesrc->client_name))) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to create context"), + (NULL)); + goto unlock_and_fail; + } + + pa_context_set_state_callback (pulsesrc->context, + gst_pulsesrc_context_state_cb, pulsesrc); +#ifdef HAVE_PULSE_1_0 + pa_context_set_subscribe_callback (pulsesrc->context, + gst_pulsesrc_context_subscribe_cb, pulsesrc); +#endif + + GST_DEBUG_OBJECT (pulsesrc, "connect to server %s", + GST_STR_NULL (pulsesrc->server)); + + if (pa_context_connect (pulsesrc->context, pulsesrc->server, 0, NULL) < 0) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to connect: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + + for (;;) { + pa_context_state_t state; + + state = pa_context_get_state (pulsesrc->context); + + if (!PA_CONTEXT_IS_GOOD (state)) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to connect: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + + if (state == PA_CONTEXT_READY) + break; + + /* Wait until the context is ready */ + pa_threaded_mainloop_wait (pulsesrc->mainloop); + } + GST_DEBUG_OBJECT (pulsesrc, "connected"); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return TRUE; + + /* ERRORS */ +unlock_and_fail: + { + gst_pulsesrc_destroy_context (pulsesrc); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return FALSE; + } +} + +static gboolean +gst_pulsesrc_close (GstAudioSrc * asrc) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + gst_pulsesrc_destroy_context (pulsesrc); + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return TRUE; +} + +static gboolean +gst_pulsesrc_unprepare (GstAudioSrc * asrc) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + gst_pulsesrc_destroy_stream (pulsesrc); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + pulsesrc->read_buffer = NULL; + pulsesrc->read_buffer_length = 0; + + return TRUE; +} + +static guint +gst_pulsesrc_read (GstAudioSrc * asrc, gpointer data, guint length) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); + size_t sum = 0; + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + pulsesrc->in_read = TRUE; + +#ifdef HAVE_PULSE_1_0 + if (g_atomic_int_compare_and_exchange (&pulsesrc->notify, 1, 0)) { + g_object_notify (G_OBJECT (pulsesrc), "volume"); + g_object_notify (G_OBJECT (pulsesrc), "mute"); + } +#endif + + if (pulsesrc->paused) + goto was_paused; + + while (length > 0) { + size_t l; + + GST_LOG_OBJECT (pulsesrc, "reading %u bytes", length); + + /*check if we have a leftover buffer */ + if (!pulsesrc->read_buffer) { + for (;;) { + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) + goto unlock_and_fail; + + /* read all available data, we keep a pointer to the data and the length + * and take from it what we need. */ + if (pa_stream_peek (pulsesrc->stream, &pulsesrc->read_buffer, + &pulsesrc->read_buffer_length) < 0) + goto peek_failed; + + GST_LOG_OBJECT (pulsesrc, "have data of %" G_GSIZE_FORMAT " bytes", + pulsesrc->read_buffer_length); + + /* if we have data, process if */ + if (pulsesrc->read_buffer && pulsesrc->read_buffer_length) + break; + + /* now wait for more data to become available */ + GST_LOG_OBJECT (pulsesrc, "waiting for data"); + pa_threaded_mainloop_wait (pulsesrc->mainloop); + + if (pulsesrc->paused) + goto was_paused; + } + } + + l = pulsesrc->read_buffer_length > + length ? length : pulsesrc->read_buffer_length; + + memcpy (data, pulsesrc->read_buffer, l); + + pulsesrc->read_buffer = (const guint8 *) pulsesrc->read_buffer + l; + pulsesrc->read_buffer_length -= l; + + data = (guint8 *) data + l; + length -= l; + sum += l; + + if (pulsesrc->read_buffer_length <= 0) { + /* we copied all of the data, drop it now */ + if (pa_stream_drop (pulsesrc->stream) < 0) + goto drop_failed; + + /* reset pointer to data */ + pulsesrc->read_buffer = NULL; + pulsesrc->read_buffer_length = 0; + } + } + + pulsesrc->in_read = FALSE; + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return sum; + + /* ERRORS */ +was_paused: + { + GST_LOG_OBJECT (pulsesrc, "we are paused"); + goto unlock_and_fail; + } +peek_failed: + { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_stream_peek() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } +drop_failed: + { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_stream_drop() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } +unlock_and_fail: + { + pulsesrc->in_read = FALSE; + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return (guint) - 1; + } +} + +/* return the delay in samples */ +static guint +gst_pulsesrc_delay (GstAudioSrc * asrc) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); + pa_usec_t t; + int negative, res; + guint result; + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) + goto server_dead; + + /* get the latency, this can fail when we don't have a latency update yet. + * We don't want to wait for latency updates here but we just return 0. */ + res = pa_stream_get_latency (pulsesrc->stream, &t, &negative); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + if (res < 0) { + GST_DEBUG_OBJECT (pulsesrc, "could not get latency"); + result = 0; + } else { + if (negative) + result = 0; + else + result = (guint) ((t * pulsesrc->sample_spec.rate) / 1000000LL); + } + return result; + + /* ERRORS */ +server_dead: + { + GST_DEBUG_OBJECT (pulsesrc, "the server is dead"); + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + return 0; + } +} + +static gboolean +gst_pulsesrc_create_stream (GstPulseSrc * pulsesrc, GstCaps * caps) +{ + pa_channel_map channel_map; + GstStructure *s; + gboolean need_channel_layout = FALSE; + GstRingBufferSpec spec; + const gchar *name; + + memset (&spec, 0, sizeof (GstRingBufferSpec)); + spec.latency_time = GST_SECOND; + if (!gst_ring_buffer_parse_caps (&spec, caps)) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, SETTINGS, + ("Can't parse caps."), (NULL)); + goto fail; + } + /* Keep the refcount of the caps at 1 to make them writable */ + gst_caps_unref (spec.caps); + + if (!gst_pulse_fill_sample_spec (&spec, &pulsesrc->sample_spec)) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, SETTINGS, + ("Invalid sample specification."), (NULL)); + goto fail; + } + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + + if (!pulsesrc->context) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Bad context"), (NULL)); + goto unlock_and_fail; + } + + s = gst_caps_get_structure (caps, 0); + if (!gst_structure_has_field (s, "channel-layout") || + !gst_pulse_gst_to_channel_map (&channel_map, &spec)) { + if (spec.channels == 1) + pa_channel_map_init_mono (&channel_map); + else if (spec.channels == 2) + pa_channel_map_init_stereo (&channel_map); + else + need_channel_layout = TRUE; + } + + name = "Record Stream"; + if (pulsesrc->proplist) { + if (!(pulsesrc->stream = pa_stream_new_with_proplist (pulsesrc->context, + name, &pulsesrc->sample_spec, + (need_channel_layout) ? NULL : &channel_map, + pulsesrc->proplist))) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("Failed to create stream: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + } else if (!(pulsesrc->stream = pa_stream_new (pulsesrc->context, + name, &pulsesrc->sample_spec, + (need_channel_layout) ? NULL : &channel_map))) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("Failed to create stream: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + + if (need_channel_layout) { + const pa_channel_map *m = pa_stream_get_channel_map (pulsesrc->stream); + + gst_pulse_channel_map_to_gst (m, &spec); + caps = spec.caps; + } + + GST_DEBUG_OBJECT (pulsesrc, "Caps are %" GST_PTR_FORMAT, caps); + + pa_stream_set_state_callback (pulsesrc->stream, gst_pulsesrc_stream_state_cb, + pulsesrc); + pa_stream_set_read_callback (pulsesrc->stream, gst_pulsesrc_stream_request_cb, + pulsesrc); + pa_stream_set_underflow_callback (pulsesrc->stream, + gst_pulsesrc_stream_underflow_cb, pulsesrc); + pa_stream_set_overflow_callback (pulsesrc->stream, + gst_pulsesrc_stream_overflow_cb, pulsesrc); + pa_stream_set_latency_update_callback (pulsesrc->stream, + gst_pulsesrc_stream_latency_update_cb, pulsesrc); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return TRUE; + +unlock_and_fail: + gst_pulsesrc_destroy_stream (pulsesrc); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + +fail: + return FALSE; +} + +/* This is essentially gst_base_src_negotiate_default() but the caps + * are guaranteed to have a channel layout for > 2 channels + */ +static gboolean +gst_pulsesrc_negotiate (GstBaseSrc * basesrc) +{ + GstCaps *thiscaps; + GstCaps *caps = NULL; + GstCaps *peercaps = NULL; + gboolean result = FALSE; + + /* first see what is possible on our source pad */ + thiscaps = gst_pad_get_caps_reffed (GST_BASE_SRC_PAD (basesrc)); + GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps); + /* nothing or anything is allowed, we're done */ + if (thiscaps == NULL || gst_caps_is_any (thiscaps)) + goto no_nego_needed; + + /* get the peer caps */ + peercaps = gst_pad_peer_get_caps_reffed (GST_BASE_SRC_PAD (basesrc)); + GST_DEBUG_OBJECT (basesrc, "caps of peer: %" GST_PTR_FORMAT, peercaps); + if (peercaps) { + /* get intersection */ + caps = gst_caps_intersect (thiscaps, peercaps); + GST_DEBUG_OBJECT (basesrc, "intersect: %" GST_PTR_FORMAT, caps); + gst_caps_unref (thiscaps); + gst_caps_unref (peercaps); + } else { + /* no peer, work with our own caps then */ + caps = thiscaps; + } + if (caps) { + /* take first (and best, since they are sorted) possibility */ + caps = gst_caps_make_writable (caps); + gst_caps_truncate (caps); + + /* now fixate */ + if (!gst_caps_is_empty (caps)) { + gst_pad_fixate_caps (GST_BASE_SRC_PAD (basesrc), caps); + GST_DEBUG_OBJECT (basesrc, "fixated to: %" GST_PTR_FORMAT, caps); + + if (gst_caps_is_any (caps)) { + /* hmm, still anything, so element can do anything and + * nego is not needed */ + result = TRUE; + } else if (gst_caps_is_fixed (caps)) { + /* yay, fixed caps, use those then */ + result = gst_pulsesrc_create_stream (GST_PULSESRC_CAST (basesrc), caps); + if (result) + result = gst_pad_set_caps (GST_BASE_SRC_PAD (basesrc), caps); + } + } + gst_caps_unref (caps); + } + return result; + +no_nego_needed: + { + GST_DEBUG_OBJECT (basesrc, "no negotiation needed"); + if (thiscaps) + gst_caps_unref (thiscaps); + return TRUE; + } +} + +static gboolean +gst_pulsesrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) +{ + pa_buffer_attr wanted; + const pa_buffer_attr *actual; + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); + pa_stream_flags_t flags; +#ifdef HAVE_PULSE_1_0 + pa_operation *o; +#endif + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + +#ifdef HAVE_PULSE_1_0 + /* enable event notifications */ + GST_LOG_OBJECT (pulsesrc, "subscribing to context events"); + if (!(o = pa_context_subscribe (pulsesrc->context, + PA_SUBSCRIPTION_MASK_SINK_INPUT, NULL, NULL))) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_context_subscribe() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + + pa_operation_unref (o); +#endif + + wanted.maxlength = -1; + wanted.tlength = -1; + wanted.prebuf = 0; + wanted.minreq = -1; + wanted.fragsize = spec->segsize; + + GST_INFO_OBJECT (pulsesrc, "maxlength: %d", wanted.maxlength); + GST_INFO_OBJECT (pulsesrc, "tlength: %d", wanted.tlength); + GST_INFO_OBJECT (pulsesrc, "prebuf: %d", wanted.prebuf); + GST_INFO_OBJECT (pulsesrc, "minreq: %d", wanted.minreq); + GST_INFO_OBJECT (pulsesrc, "fragsize: %d", wanted.fragsize); + + flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | + PA_STREAM_NOT_MONOTONIC | PA_STREAM_ADJUST_LATENCY | + PA_STREAM_START_CORKED; + +#ifdef HAVE_PULSE_1_0 + if (pulsesrc->mute_set && pulsesrc->mute) + flags |= PA_STREAM_START_MUTED; +#endif + + if (pa_stream_connect_record (pulsesrc->stream, pulsesrc->device, &wanted, + flags) < 0) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("Failed to connect stream: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + + pulsesrc->corked = TRUE; + + for (;;) { + pa_stream_state_t state; + + state = pa_stream_get_state (pulsesrc->stream); + + if (!PA_STREAM_IS_GOOD (state)) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("Failed to connect stream: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + + if (state == PA_STREAM_READY) + break; + + /* Wait until the stream is ready */ + pa_threaded_mainloop_wait (pulsesrc->mainloop); + } + + /* store the source output index so it can be accessed via a property */ + pulsesrc->source_output_idx = pa_stream_get_index (pulsesrc->stream); + g_object_notify (G_OBJECT (pulsesrc), "source-output-index"); + +#ifdef HAVE_PULSE_1_0 + if (pulsesrc->volume_set) { + gst_pulsesrc_set_stream_volume (pulsesrc, pulsesrc->volume); + pulsesrc->volume_set = FALSE; + } +#endif + + /* get the actual buffering properties now */ + actual = pa_stream_get_buffer_attr (pulsesrc->stream); + + GST_INFO_OBJECT (pulsesrc, "maxlength: %d", actual->maxlength); + GST_INFO_OBJECT (pulsesrc, "tlength: %d (wanted: %d)", + actual->tlength, wanted.tlength); + GST_INFO_OBJECT (pulsesrc, "prebuf: %d", actual->prebuf); + GST_INFO_OBJECT (pulsesrc, "minreq: %d (wanted %d)", actual->minreq, + wanted.minreq); + GST_INFO_OBJECT (pulsesrc, "fragsize: %d (wanted %d)", + actual->fragsize, wanted.fragsize); + + if (actual->fragsize >= wanted.fragsize) { + spec->segsize = actual->fragsize; + } else { + spec->segsize = actual->fragsize * (wanted.fragsize / actual->fragsize); + } + spec->segtotal = actual->maxlength / spec->segsize; + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + + return TRUE; + +unlock_and_fail: + { + gst_pulsesrc_destroy_stream (pulsesrc); + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); + return FALSE; + } +} + +static void +gst_pulsesrc_success_cb (pa_stream * s, int success, void *userdata) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); + + pulsesrc->operation_success = ! !success; + pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); +} + +static void +gst_pulsesrc_reset (GstAudioSrc * asrc) +{ + GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); + pa_operation *o = NULL; + + pa_threaded_mainloop_lock (pulsesrc->mainloop); + GST_DEBUG_OBJECT (pulsesrc, "reset"); + + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) + goto unlock_and_fail; + + if (!(o = + pa_stream_flush (pulsesrc->stream, gst_pulsesrc_success_cb, + pulsesrc))) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, + ("pa_stream_flush() failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + + pulsesrc->paused = TRUE; + /* Inform anyone waiting in _write() call that it shall wakeup */ + if (pulsesrc->in_read) { + pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); + } + + pulsesrc->operation_success = FALSE; + while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) + goto unlock_and_fail; + + pa_threaded_mainloop_wait (pulsesrc->mainloop); + } + + if (!pulsesrc->operation_success) { + GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Flush failed: %s", + pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); + goto unlock_and_fail; + } + +unlock_and_fail: + + if (o) { + pa_operation_cancel (o); + pa_operation_unref (o); + } + + pa_threaded_mainloop_unlock (pulsesrc->mainloop); +} + +/* update the corked state of a stream, must be called with the mainloop + * lock */ +static gboolean +gst_pulsesrc_set_corked (GstPulseSrc * psrc, gboolean corked, gboolean wait) +{ + pa_operation *o = NULL; + gboolean res = FALSE; + + GST_DEBUG_OBJECT (psrc, "setting corked state to %d", corked); + if (psrc->corked != corked) { + if (!(o = pa_stream_cork (psrc->stream, corked, + gst_pulsesrc_success_cb, psrc))) + goto cork_failed; + + while (wait && pa_operation_get_state (o) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait (psrc->mainloop); + if (gst_pulsesrc_is_dead (psrc, TRUE)) + goto server_dead; + } + psrc->corked = corked; + } else { + GST_DEBUG_OBJECT (psrc, "skipping, already in requested state"); + } + res = TRUE; + +cleanup: + if (o) + pa_operation_unref (o); + + return res; + + /* ERRORS */ +server_dead: + { + GST_DEBUG_OBJECT (psrc, "the server is dead"); + goto cleanup; + } +cork_failed: + { + GST_ELEMENT_ERROR (psrc, RESOURCE, FAILED, + ("pa_stream_cork() failed: %s", + pa_strerror (pa_context_errno (psrc->context))), (NULL)); + goto cleanup; + } +} + +/* start/resume playback ASAP */ +static gboolean +gst_pulsesrc_play (GstPulseSrc * psrc) +{ + pa_threaded_mainloop_lock (psrc->mainloop); + GST_DEBUG_OBJECT (psrc, "playing"); + psrc->paused = FALSE; + gst_pulsesrc_set_corked (psrc, FALSE, FALSE); + pa_threaded_mainloop_unlock (psrc->mainloop); + + return TRUE; +} + +/* pause/stop playback ASAP */ +static gboolean +gst_pulsesrc_pause (GstPulseSrc * psrc) +{ + pa_threaded_mainloop_lock (psrc->mainloop); + GST_DEBUG_OBJECT (psrc, "pausing"); + /* make sure the commit method stops writing */ + psrc->paused = TRUE; + if (psrc->in_read) { + /* we are waiting in a read, signal */ + GST_DEBUG_OBJECT (psrc, "signal read"); + pa_threaded_mainloop_signal (psrc->mainloop, 0); + } + pa_threaded_mainloop_unlock (psrc->mainloop); + + return TRUE; +} + +static GstStateChangeReturn +gst_pulsesrc_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstPulseSrc *this = GST_PULSESRC_CAST (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!(this->mainloop = pa_threaded_mainloop_new ())) + goto mainloop_failed; + if (pa_threaded_mainloop_start (this->mainloop) < 0) { + pa_threaded_mainloop_free (this->mainloop); + this->mainloop = NULL; + goto mainloop_start_failed; + } + + if (!this->mixer) + this->mixer = + gst_pulsemixer_ctrl_new (G_OBJECT (this), this->server, + this->device, GST_PULSEMIXER_SOURCE); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + /* uncork and start recording */ + gst_pulsesrc_play (this); + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + /* stop recording ASAP by corking */ + pa_threaded_mainloop_lock (this->mainloop); + GST_DEBUG_OBJECT (this, "corking"); + gst_pulsesrc_set_corked (this, TRUE, FALSE); + pa_threaded_mainloop_unlock (this->mainloop); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + /* now make sure we get out of the _read method */ + gst_pulsesrc_pause (this); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + if (this->mixer) { + gst_pulsemixer_ctrl_free (this->mixer); + this->mixer = NULL; + } + + if (this->mainloop) + pa_threaded_mainloop_stop (this->mainloop); + + gst_pulsesrc_destroy_context (this); + + if (this->mainloop) { + pa_threaded_mainloop_free (this->mainloop); + this->mainloop = NULL; + } + break; + default: + break; + } + + return ret; + + /* ERRORS */ +mainloop_failed: + { + GST_ELEMENT_ERROR (this, RESOURCE, FAILED, + ("pa_threaded_mainloop_new() failed"), (NULL)); + return GST_STATE_CHANGE_FAILURE; + } +mainloop_start_failed: + { + GST_ELEMENT_ERROR (this, RESOURCE, FAILED, + ("pa_threaded_mainloop_start() failed"), (NULL)); + return GST_STATE_CHANGE_FAILURE; + } +} diff --git a/ext/pulse/pulsesrc.h b/ext/pulse/pulsesrc.h new file mode 100644 index 0000000..655417f --- /dev/null +++ b/ext/pulse/pulsesrc.h @@ -0,0 +1,102 @@ +/*-*- Mode: C; c-basic-offset: 2 -*-*/ + +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __GST_PULSESRC_H__ +#define __GST_PULSESRC_H__ + +#include +#include + +#include +#include + +#include "pulsemixerctrl.h" +#include "pulseprobe.h" + +G_BEGIN_DECLS + +#define GST_TYPE_PULSESRC \ + (gst_pulsesrc_get_type()) +#define GST_PULSESRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSESRC,GstPulseSrc)) +#define GST_PULSESRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSESRC,GstPulseSrcClass)) +#define GST_IS_PULSESRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSESRC)) +#define GST_IS_PULSESRC_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSESRC)) +#define GST_PULSESRC_CAST(obj) \ + ((GstPulseSrc *)(obj)) + +typedef struct _GstPulseSrc GstPulseSrc; +typedef struct _GstPulseSrcClass GstPulseSrcClass; + +struct _GstPulseSrc +{ + GstAudioSrc src; + + gchar *server, *device, *client_name; + + pa_threaded_mainloop *mainloop; + + pa_context *context; + pa_stream *stream; + guint32 source_output_idx; + + pa_sample_spec sample_spec; + + const void *read_buffer; + size_t read_buffer_length; + + gchar *device_description; + GstPulseMixerCtrl *mixer; + GstPulseProbe *probe; + +#ifdef HAVE_PULSE_1_0 + gdouble volume; + gboolean volume_set:1; + gboolean mute:1; + gboolean mute_set:1; + + gint notify; /* atomic */ +#endif + + gboolean corked:1; + gboolean operation_success:1; + gboolean paused:1; + gboolean in_read:1; + + GstStructure *properties; + pa_proplist *proplist; +}; + +struct _GstPulseSrcClass +{ + GstAudioSrcClass parent_class; +}; + +GType gst_pulsesrc_get_type (void); + +G_END_DECLS + +#endif /* __GST_PULSESRC_H__ */ diff --git a/ext/pulse/pulseutil.c b/ext/pulse/pulseutil.c new file mode 100644 index 0000000..0d8af79 --- /dev/null +++ b/ext/pulse/pulseutil.c @@ -0,0 +1,337 @@ +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; 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 "pulseutil.h" +#include + +#ifdef HAVE_UNISTD_H +# include /* getpid on UNIX */ +#endif +#ifdef HAVE_PROCESS_H +# include /* getpid on win32 */ +#endif + +static const pa_channel_position_t gst_pos_to_pa[GST_AUDIO_CHANNEL_POSITION_NUM] + = { + [GST_AUDIO_CHANNEL_POSITION_FRONT_MONO] = PA_CHANNEL_POSITION_MONO, + [GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT] = PA_CHANNEL_POSITION_FRONT_LEFT, + [GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT] = PA_CHANNEL_POSITION_FRONT_RIGHT, + [GST_AUDIO_CHANNEL_POSITION_REAR_CENTER] = PA_CHANNEL_POSITION_REAR_CENTER, + [GST_AUDIO_CHANNEL_POSITION_REAR_LEFT] = PA_CHANNEL_POSITION_REAR_LEFT, + [GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT] = PA_CHANNEL_POSITION_REAR_RIGHT, + [GST_AUDIO_CHANNEL_POSITION_LFE] = PA_CHANNEL_POSITION_LFE, + [GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER] = PA_CHANNEL_POSITION_FRONT_CENTER, + [GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] = + PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, + [GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] = + PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, + [GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT] = PA_CHANNEL_POSITION_SIDE_LEFT, + [GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT] = PA_CHANNEL_POSITION_SIDE_RIGHT, + [GST_AUDIO_CHANNEL_POSITION_NONE] = PA_CHANNEL_POSITION_INVALID +}; + +/* All index are increased by one because PA_CHANNEL_POSITION_INVALID == -1 */ +static const GstAudioChannelPosition + pa_to_gst_pos[GST_AUDIO_CHANNEL_POSITION_NUM] + = { + [PA_CHANNEL_POSITION_MONO + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO, + [PA_CHANNEL_POSITION_FRONT_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + [PA_CHANNEL_POSITION_FRONT_RIGHT + 1] = + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + [PA_CHANNEL_POSITION_REAR_CENTER + 1] = + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, + [PA_CHANNEL_POSITION_REAR_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + [PA_CHANNEL_POSITION_REAR_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + [PA_CHANNEL_POSITION_LFE + 1] = GST_AUDIO_CHANNEL_POSITION_LFE, + [PA_CHANNEL_POSITION_FRONT_CENTER + 1] = + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + [PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER + 1] = + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, + [PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER + 1] = + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, + [PA_CHANNEL_POSITION_SIDE_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + [PA_CHANNEL_POSITION_SIDE_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + [PA_CHANNEL_POSITION_INVALID + 1] = GST_AUDIO_CHANNEL_POSITION_NONE, +}; + +gboolean +gst_pulse_fill_sample_spec (GstRingBufferSpec * spec, pa_sample_spec * ss) +{ + + if (spec->format == GST_MU_LAW && spec->width == 8) + ss->format = PA_SAMPLE_ULAW; + else if (spec->format == GST_A_LAW && spec->width == 8) + ss->format = PA_SAMPLE_ALAW; + else if (spec->format == GST_U8 && spec->width == 8) + ss->format = PA_SAMPLE_U8; + else if (spec->format == GST_S16_LE && spec->width == 16) + ss->format = PA_SAMPLE_S16LE; + else if (spec->format == GST_S16_BE && spec->width == 16) + ss->format = PA_SAMPLE_S16BE; + else if (spec->format == GST_FLOAT32_LE && spec->width == 32) + ss->format = PA_SAMPLE_FLOAT32LE; + else if (spec->format == GST_FLOAT32_BE && spec->width == 32) + ss->format = PA_SAMPLE_FLOAT32BE; + else if (spec->format == GST_S32_LE && spec->width == 32) + ss->format = PA_SAMPLE_S32LE; + else if (spec->format == GST_S32_BE && spec->width == 32) + ss->format = PA_SAMPLE_S32BE; + else if (spec->format == GST_S24_3LE && spec->width == 24) + ss->format = PA_SAMPLE_S24LE; + else if (spec->format == GST_S24_3BE && spec->width == 24) + ss->format = PA_SAMPLE_S24BE; + else if (spec->format == GST_S24_LE && spec->width == 32) + ss->format = PA_SAMPLE_S24_32LE; + else if (spec->format == GST_S24_BE && spec->width == 32) + ss->format = PA_SAMPLE_S24_32BE; + else + return FALSE; + + ss->channels = spec->channels; + ss->rate = spec->rate; + + if (!pa_sample_spec_valid (ss)) + return FALSE; + + return TRUE; +} + +#ifdef HAVE_PULSE_1_0 +gboolean +gst_pulse_fill_format_info (GstRingBufferSpec * spec, pa_format_info ** f, + guint * channels) +{ + pa_format_info *format; + pa_sample_format_t sf = PA_SAMPLE_INVALID; + + format = pa_format_info_new (); + + if (spec->format == GST_MU_LAW && spec->width == 8) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_ULAW; + } else if (spec->format == GST_A_LAW && spec->width == 8) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_ALAW; + } else if (spec->format == GST_U8 && spec->width == 8) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_U8; + } else if (spec->format == GST_S16_LE && spec->width == 16) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_S16LE; + } else if (spec->format == GST_S16_BE && spec->width == 16) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_S16BE; + } else if (spec->format == GST_FLOAT32_LE && spec->width == 32) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_FLOAT32LE; + } else if (spec->format == GST_FLOAT32_BE && spec->width == 32) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_FLOAT32BE; + } else if (spec->format == GST_S32_LE && spec->width == 32) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_S32LE; + } else if (spec->format == GST_S32_BE && spec->width == 32) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_S32BE; + } else if (spec->format == GST_S24_3LE && spec->width == 24) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_S24LE; + } else if (spec->format == GST_S24_3BE && spec->width == 24) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_S24BE; + } else if (spec->format == GST_S24_LE && spec->width == 32) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_S24_32LE; + } else if (spec->format == GST_S24_BE && spec->width == 32) { + format->encoding = PA_ENCODING_PCM; + sf = PA_SAMPLE_S24_32BE; + } else if (spec->format == GST_AC3) { + format->encoding = PA_ENCODING_AC3_IEC61937; + } else if (spec->format == GST_EAC3) { + format->encoding = PA_ENCODING_EAC3_IEC61937; + } else if (spec->format == GST_DTS) { + format->encoding = PA_ENCODING_DTS_IEC61937; + } else if (spec->format == GST_MPEG) { + format->encoding = PA_ENCODING_MPEG_IEC61937; + } else { + goto fail; + } + + if (format->encoding == PA_ENCODING_PCM) { + pa_format_info_set_sample_format (format, sf); + pa_format_info_set_channels (format, spec->channels); + } + + pa_format_info_set_rate (format, spec->rate); + + if (!pa_format_info_valid (format)) + goto fail; + + *f = format; + *channels = spec->channels; + + return TRUE; + +fail: + if (format) + pa_format_info_free (format); + return FALSE; +} +#endif + +/* PATH_MAX is not defined everywhere, e.g. on GNU Hurd */ +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + +gchar * +gst_pulse_client_name (void) +{ + gchar buf[PATH_MAX]; + + const char *c; + + if ((c = g_get_application_name ())) + return g_strdup (c); + else if (pa_get_binary_name (buf, sizeof (buf))) + return g_strdup (buf); + else + return g_strdup_printf ("GStreamer-pid-%lu", (gulong) getpid ()); +} + +pa_channel_map * +gst_pulse_gst_to_channel_map (pa_channel_map * map, + const GstRingBufferSpec * spec) +{ + int i; + GstAudioChannelPosition *pos; + + pa_channel_map_init (map); + + if (!(pos = + gst_audio_get_channel_positions (gst_caps_get_structure (spec->caps, + 0)))) { + return NULL; + } + + for (i = 0; i < spec->channels; i++) { + if (pos[i] == GST_AUDIO_CHANNEL_POSITION_NONE) { + /* no valid mappings for these channels */ + g_free (pos); + return NULL; + } else if (pos[i] < GST_AUDIO_CHANNEL_POSITION_NUM) + map->map[i] = gst_pos_to_pa[pos[i]]; + else + map->map[i] = PA_CHANNEL_POSITION_INVALID; + } + + g_free (pos); + map->channels = spec->channels; + + if (!pa_channel_map_valid (map)) { + return NULL; + } + + return map; +} + +GstRingBufferSpec * +gst_pulse_channel_map_to_gst (const pa_channel_map * map, + GstRingBufferSpec * spec) +{ + int i; + GstAudioChannelPosition *pos; + gboolean invalid = FALSE; + + g_return_val_if_fail (map->channels == spec->channels, NULL); + + pos = g_new0 (GstAudioChannelPosition, spec->channels + 1); + + for (i = 0; i < spec->channels; i++) { + if (map->map[i] == PA_CHANNEL_POSITION_INVALID) { + invalid = TRUE; + break; + } else if ((int) map->map[i] < (int) GST_AUDIO_CHANNEL_POSITION_NUM) { + pos[i] = pa_to_gst_pos[map->map[i] + 1]; + } else { + invalid = TRUE; + break; + } + } + + if (!invalid && !gst_audio_check_channel_positions (pos, spec->channels)) + invalid = TRUE; + + if (invalid) { + for (i = 0; i < spec->channels; i++) + pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE; + } + + gst_audio_set_channel_positions (gst_caps_get_structure (spec->caps, 0), pos); + + g_free (pos); + + return spec; +} + +void +gst_pulse_cvolume_from_linear (pa_cvolume * v, unsigned channels, + gdouble volume) +{ + pa_cvolume_set (v, channels, pa_sw_volume_from_linear (volume)); +} + +static gboolean +make_proplist_item (GQuark field_id, const GValue * value, gpointer user_data) +{ + pa_proplist *p = (pa_proplist *) user_data; + gchar *prop_id = (gchar *) g_quark_to_string (field_id); + + /* http://0pointer.de/lennart/projects/pulseaudio/doxygen/proplist_8h.html */ + + /* match prop id */ + + /* check type */ + switch (G_VALUE_TYPE (value)) { + case G_TYPE_STRING: + pa_proplist_sets (p, prop_id, g_value_get_string (value)); + break; + default: + GST_WARNING ("unmapped property type %s", G_VALUE_TYPE_NAME (value)); + break; + } + + return TRUE; +} + +pa_proplist * +gst_pulse_make_proplist (const GstStructure * properties) +{ + pa_proplist *proplist = pa_proplist_new (); + + /* iterate the structure and fill the proplist */ + gst_structure_foreach (properties, make_proplist_item, proplist); + return proplist; +} diff --git a/ext/pulse/pulseutil.h b/ext/pulse/pulseutil.h new file mode 100644 index 0000000..4adfeb1 --- /dev/null +++ b/ext/pulse/pulseutil.h @@ -0,0 +1,52 @@ +/* + * GStreamer pulseaudio plugin + * + * Copyright (c) 2004-2008 Lennart Poettering + * + * gst-pulse is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * gst-pulse 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 gst-pulse; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#ifndef __GST_PULSEUTIL_H__ +#define __GST_PULSEUTIL_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +gboolean gst_pulse_fill_sample_spec (GstRingBufferSpec * spec, + pa_sample_spec * ss); +#ifdef HAVE_PULSE_1_0 +gboolean gst_pulse_fill_format_info (GstRingBufferSpec * spec, + pa_format_info ** f, guint * channels); +#endif + +gchar *gst_pulse_client_name (void); + +pa_channel_map *gst_pulse_gst_to_channel_map (pa_channel_map * map, + const GstRingBufferSpec * spec); + +GstRingBufferSpec *gst_pulse_channel_map_to_gst (const pa_channel_map * map, + GstRingBufferSpec * spec); + +void gst_pulse_cvolume_from_linear (pa_cvolume *v, unsigned channels, gdouble volume); + +pa_proplist *gst_pulse_make_proplist (const GstStructure *properties); + +#endif diff --git a/ext/raw1394/Makefile.am b/ext/raw1394/Makefile.am new file mode 100644 index 0000000..ae55f86 --- /dev/null +++ b/ext/raw1394/Makefile.am @@ -0,0 +1,29 @@ +plugin_LTLIBRARIES = libgst1394.la + +if USE_LIBIEC61883 +hdvsource = gsthdv1394src.c +hdvheaders = gsthdv1394src.h +else +hdvsource = +hdvheaders = +endif + +libgst1394_la_SOURCES = \ + gst1394.c gst1394probe.c gstdv1394src.c $(hdvsource) \ + gst1394clock.c +libgst1394_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(DV1394_CFLAGS) +libgst1394_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(DV1394_LIBS) +libgst1394_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgst1394_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstdv1394src.h gst1394probe.h $(hdvheaders) \ + gst1394clock.h + diff --git a/ext/raw1394/Makefile.in b/ext/raw1394/Makefile.in new file mode 100644 index 0000000..0b4e7ac --- /dev/null +++ b/ext/raw1394/Makefile.in @@ -0,0 +1,864 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/raw1394 +DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgst1394_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__libgst1394_la_SOURCES_DIST = gst1394.c gst1394probe.c \ + gstdv1394src.c gsthdv1394src.c gst1394clock.c +@USE_LIBIEC61883_TRUE@am__objects_1 = libgst1394_la-gsthdv1394src.lo +am_libgst1394_la_OBJECTS = libgst1394_la-gst1394.lo \ + libgst1394_la-gst1394probe.lo libgst1394_la-gstdv1394src.lo \ + $(am__objects_1) libgst1394_la-gst1394clock.lo +libgst1394_la_OBJECTS = $(am_libgst1394_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgst1394_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgst1394_la_CFLAGS) $(CFLAGS) \ + $(libgst1394_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgst1394_la_SOURCES) +DIST_SOURCES = $(am__libgst1394_la_SOURCES_DIST) +am__noinst_HEADERS_DIST = gstdv1394src.h gst1394probe.h \ + gsthdv1394src.h gst1394clock.h +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgst1394.la +@USE_LIBIEC61883_FALSE@hdvsource = +@USE_LIBIEC61883_TRUE@hdvsource = gsthdv1394src.c +@USE_LIBIEC61883_FALSE@hdvheaders = +@USE_LIBIEC61883_TRUE@hdvheaders = gsthdv1394src.h +libgst1394_la_SOURCES = \ + gst1394.c gst1394probe.c gstdv1394src.c $(hdvsource) \ + gst1394clock.c + +libgst1394_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(DV1394_CFLAGS) + +libgst1394_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(DV1394_LIBS) + +libgst1394_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgst1394_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstdv1394src.h gst1394probe.h $(hdvheaders) \ + gst1394clock.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/raw1394/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/raw1394/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgst1394.la: $(libgst1394_la_OBJECTS) $(libgst1394_la_DEPENDENCIES) $(EXTRA_libgst1394_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgst1394_la_LINK) -rpath $(plugindir) $(libgst1394_la_OBJECTS) $(libgst1394_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gst1394.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gst1394clock.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gst1394probe.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gstdv1394src.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gsthdv1394src.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgst1394_la-gst1394.lo: gst1394.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gst1394.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gst1394.Tpo -c -o libgst1394_la-gst1394.lo `test -f 'gst1394.c' || echo '$(srcdir)/'`gst1394.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gst1394.Tpo $(DEPDIR)/libgst1394_la-gst1394.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst1394.c' object='libgst1394_la-gst1394.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gst1394.lo `test -f 'gst1394.c' || echo '$(srcdir)/'`gst1394.c + +libgst1394_la-gst1394probe.lo: gst1394probe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gst1394probe.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gst1394probe.Tpo -c -o libgst1394_la-gst1394probe.lo `test -f 'gst1394probe.c' || echo '$(srcdir)/'`gst1394probe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gst1394probe.Tpo $(DEPDIR)/libgst1394_la-gst1394probe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst1394probe.c' object='libgst1394_la-gst1394probe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gst1394probe.lo `test -f 'gst1394probe.c' || echo '$(srcdir)/'`gst1394probe.c + +libgst1394_la-gstdv1394src.lo: gstdv1394src.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gstdv1394src.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gstdv1394src.Tpo -c -o libgst1394_la-gstdv1394src.lo `test -f 'gstdv1394src.c' || echo '$(srcdir)/'`gstdv1394src.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gstdv1394src.Tpo $(DEPDIR)/libgst1394_la-gstdv1394src.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdv1394src.c' object='libgst1394_la-gstdv1394src.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gstdv1394src.lo `test -f 'gstdv1394src.c' || echo '$(srcdir)/'`gstdv1394src.c + +libgst1394_la-gsthdv1394src.lo: gsthdv1394src.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gsthdv1394src.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gsthdv1394src.Tpo -c -o libgst1394_la-gsthdv1394src.lo `test -f 'gsthdv1394src.c' || echo '$(srcdir)/'`gsthdv1394src.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gsthdv1394src.Tpo $(DEPDIR)/libgst1394_la-gsthdv1394src.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthdv1394src.c' object='libgst1394_la-gsthdv1394src.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gsthdv1394src.lo `test -f 'gsthdv1394src.c' || echo '$(srcdir)/'`gsthdv1394src.c + +libgst1394_la-gst1394clock.lo: gst1394clock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gst1394clock.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gst1394clock.Tpo -c -o libgst1394_la-gst1394clock.lo `test -f 'gst1394clock.c' || echo '$(srcdir)/'`gst1394clock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gst1394clock.Tpo $(DEPDIR)/libgst1394_la-gst1394clock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst1394clock.c' object='libgst1394_la-gst1394clock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gst1394clock.lo `test -f 'gst1394clock.c' || echo '$(srcdir)/'`gst1394clock.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/raw1394/gst1394.c b/ext/raw1394/gst1394.c new file mode 100644 index 0000000..dafeb73 --- /dev/null +++ b/ext/raw1394/gst1394.c @@ -0,0 +1,51 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 + + +#include "gstdv1394src.h" +#ifdef HAVE_LIBIEC61883 +#include "gsthdv1394src.h" +#endif + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "dv1394src", GST_RANK_NONE, + GST_TYPE_DV1394SRC)) + return FALSE; +#ifdef HAVE_LIBIEC61883 + if (!gst_element_register (plugin, "hdv1394src", GST_RANK_NONE, + GST_TYPE_HDV1394SRC)) + return FALSE; +#endif + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "1394", + "Source for video data via IEEE1394 interface", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/raw1394/gst1394clock.c b/ext/raw1394/gst1394clock.c new file mode 100644 index 0000000..0505c8c --- /dev/null +++ b/ext/raw1394/gst1394clock.c @@ -0,0 +1,154 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * Copyright (C) 2009 David Schleef + * + * gst1394clock.c: Clock for use by IEEE 1394 plugins + * + * 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 "gst1394clock.h" + +GST_DEBUG_CATEGORY_STATIC (gst_1394_clock_debug); +#define GST_CAT_DEFAULT gst_1394_clock_debug + +static void gst_1394_clock_class_init (Gst1394ClockClass * klass); +static void gst_1394_clock_init (Gst1394Clock * clock); + +static GstClockTime gst_1394_clock_get_internal_time (GstClock * clock); + +static GstSystemClockClass *parent_class = NULL; + +/* static guint gst_1394_clock_signals[LAST_SIGNAL] = { 0 }; */ + +GType +gst_1394_clock_get_type (void) +{ + static GType clock_type = 0; + + if (!clock_type) { + static const GTypeInfo clock_info = { + sizeof (Gst1394ClockClass), + NULL, + NULL, + (GClassInitFunc) gst_1394_clock_class_init, + NULL, + NULL, + sizeof (Gst1394Clock), + 4, + (GInstanceInitFunc) gst_1394_clock_init, + NULL + }; + + clock_type = g_type_register_static (GST_TYPE_SYSTEM_CLOCK, "Gst1394Clock", + &clock_info, 0); + } + return clock_type; +} + + +static void +gst_1394_clock_class_init (Gst1394ClockClass * klass) +{ + GstClockClass *gstclock_class; + + gstclock_class = (GstClockClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gstclock_class->get_internal_time = gst_1394_clock_get_internal_time; + + GST_DEBUG_CATEGORY_INIT (gst_1394_clock_debug, "1394clock", 0, "1394clock"); +} + +static void +gst_1394_clock_init (Gst1394Clock * clock) +{ + GST_OBJECT_FLAG_SET (clock, GST_CLOCK_FLAG_CAN_SET_MASTER); +} + +/** + * gst_1394_clock_new: + * @name: the name of the clock + * + * Create a new #Gst1394Clock instance. + * + * Returns: a new #Gst1394Clock + */ +Gst1394Clock * +gst_1394_clock_new (const gchar * name) +{ + Gst1394Clock *_1394clock = + GST_1394_CLOCK (g_object_new (GST_TYPE_1394_CLOCK, "name", name, NULL)); + + return _1394clock; +} + +static GstClockTime +gst_1394_clock_get_internal_time (GstClock * clock) +{ + Gst1394Clock *_1394clock; + GstClockTime result; + guint32 cycle_timer; + guint64 local_time; + + _1394clock = GST_1394_CLOCK_CAST (clock); + + if (_1394clock->handle != NULL) { + GST_OBJECT_LOCK (clock); + raw1394_read_cycle_timer (_1394clock->handle, &cycle_timer, &local_time); + + if (cycle_timer < _1394clock->cycle_timer_lo) { + GST_LOG_OBJECT (clock, "overflow %u to %u", + _1394clock->cycle_timer_lo, cycle_timer); + + _1394clock->cycle_timer_hi++; + } + _1394clock->cycle_timer_lo = cycle_timer; + + /* get the seconds from the cycleSeconds counter */ + result = (((((guint64) _1394clock->cycle_timer_hi) << 32) | + cycle_timer) >> 25) * GST_SECOND; + /* add the microseconds from the cycleCount counter */ + result += (((cycle_timer >> 12) & 0x1fff) * 125) * GST_USECOND; + + GST_LOG_OBJECT (clock, "result %" GST_TIME_FORMAT, GST_TIME_ARGS (result)); + GST_OBJECT_UNLOCK (clock); + } else { + result = GST_CLOCK_TIME_NONE; + } + + return result; +} + +void +gst_1394_clock_set_handle (Gst1394Clock * clock, raw1394handle_t handle) +{ + clock->handle = handle; + clock->cycle_timer_lo = 0; + clock->cycle_timer_hi = 0; +} + +void +gst_1394_clock_unset_handle (Gst1394Clock * clock) +{ + clock->handle = NULL; +} diff --git a/ext/raw1394/gst1394clock.h b/ext/raw1394/gst1394clock.h new file mode 100644 index 0000000..ab7594d --- /dev/null +++ b/ext/raw1394/gst1394clock.h @@ -0,0 +1,77 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2005 Wim Taymans + * Copyright (C) 2009 David Schleef + * + * gst1394clock.h: Clock for use by the IEEE 1394 + * + * 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_1394_CLOCK_H__ +#define __GST_1394_CLOCK_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_1394_CLOCK \ + (gst_1394_clock_get_type()) +#define GST_1394_CLOCK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_1394_CLOCK,Gst1394Clock)) +#define GST_1394_CLOCK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_1394_CLOCK,Gst1394ClockClass)) +#define GST_IS_1394_CLOCK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_1394_CLOCK)) +#define GST_IS_1394_CLOCK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_1394_CLOCK)) +#define GST_1394_CLOCK_CAST(obj) \ + ((Gst1394Clock*)(obj)) + +typedef struct _Gst1394Clock Gst1394Clock; +typedef struct _Gst1394ClockClass Gst1394ClockClass; + +/** + * Gst1394Clock: + * @clock: parent #GstSystemClock + * + * Opaque #Gst1394Clock. + */ +struct _Gst1394Clock { + GstSystemClock clock; + + raw1394handle_t handle; + + guint32 cycle_timer_lo; + guint32 cycle_timer_hi; +}; + +struct _Gst1394ClockClass { + GstSystemClockClass parent_class; +}; + +GType gst_1394_clock_get_type (void); +Gst1394Clock* gst_1394_clock_new (const gchar *name); +void gst_1394_clock_set_handle (Gst1394Clock *clock, + raw1394handle_t handle); +void gst_1394_clock_unset_handle (Gst1394Clock *clock); + +G_END_DECLS + +#endif /* __GST_1394_CLOCK_H__ */ diff --git a/ext/raw1394/gst1394probe.c b/ext/raw1394/gst1394probe.c new file mode 100644 index 0000000..ee51ba0 --- /dev/null +++ b/ext/raw1394/gst1394probe.c @@ -0,0 +1,140 @@ +/* GStreamer + * Copyright (C) 2007 Julien Puydt + * + * 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 +#include +#include +#include + +#include + +#include "gst1394probe.h" +#include "gst/interfaces/propertyprobe.h" + +static GValueArray * +gst_1394_get_guid_array (void) +{ + GValueArray *result = NULL; + raw1394handle_t handle = NULL; + int num_ports = 0; + int port = 0; + int num_nodes = 0; + int node = 0; + rom1394_directory directory; + GValue value = { 0, }; + + handle = raw1394_new_handle (); + + if (handle == NULL) + return NULL; + + num_ports = raw1394_get_port_info (handle, NULL, 0); + for (port = 0; port < num_ports; port++) { + if (raw1394_set_port (handle, port) >= 0) { + num_nodes = raw1394_get_nodecount (handle); + for (node = 0; node < num_nodes; node++) { + rom1394_get_directory (handle, node, &directory); + if (rom1394_get_node_type (&directory) == ROM1394_NODE_TYPE_AVC && + avc1394_check_subunit_type (handle, node, + AVC1394_SUBUNIT_TYPE_VCR)) { + if (result == NULL) + result = g_value_array_new (3); /* looks like a sensible default */ + g_value_init (&value, G_TYPE_UINT64); + g_value_set_uint64 (&value, rom1394_get_guid (handle, node)); + g_value_array_append (result, &value); + g_value_unset (&value); + } + } + } + } + + return result; +} + +static const GList * +gst_1394_property_probe_get_properties (GstPropertyProbe * probe) +{ + static GList *result = NULL; + GObjectClass *klass = NULL; + GParamSpec *spec = NULL; + + if (result == NULL) { + klass = G_OBJECT_GET_CLASS (probe); + spec = g_object_class_find_property (klass, "guid"); + result = g_list_append (result, spec); + } + + return result; +} + +static void +gst_1394_property_probe_probe_property (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec) +{ + if (!g_str_equal (pspec->name, "guid")) + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); +} + +static gboolean +gst_1394_property_probe_needs_probe (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec) +{ + return TRUE; +} + +static GValueArray * +gst_1394_property_probe_get_values (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec) +{ + GValueArray *result = NULL; + + if (!g_str_equal (pspec->name, "guid")) { + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + return NULL; + } + + result = gst_1394_get_guid_array (); + + if (result == NULL) + GST_LOG_OBJECT (probe, "No guid found"); + + return result; +} + +static void +gst_1394_property_probe_interface_init (GstPropertyProbeInterface * iface) +{ + iface->get_properties = gst_1394_property_probe_get_properties; + iface->probe_property = gst_1394_property_probe_probe_property; + iface->needs_probe = gst_1394_property_probe_needs_probe; + iface->get_values = gst_1394_property_probe_get_values; +} + +void +gst_1394_type_add_property_probe_interface (GType type) +{ + static const GInterfaceInfo probe_iface_info = { + (GInterfaceInitFunc) gst_1394_property_probe_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &probe_iface_info); +} diff --git a/ext/raw1394/gst1394probe.h b/ext/raw1394/gst1394probe.h new file mode 100644 index 0000000..8436e70 --- /dev/null +++ b/ext/raw1394/gst1394probe.h @@ -0,0 +1,32 @@ +/* GStreamer + * Copyright (C) 2007 Julien Puydt + * + * 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_1394_PROBE_H +#define GST_1394_PROBE_H + +#include + +G_BEGIN_DECLS + +void gst_1394_type_add_property_probe_interface (GType type); + +G_END_DECLS + +#endif /* __GST_1394_PROBE_H */ + diff --git a/ext/raw1394/gstdv1394src.c b/ext/raw1394/gstdv1394src.c new file mode 100644 index 0000000..1a3cae6 --- /dev/null +++ b/ext/raw1394/gstdv1394src.c @@ -0,0 +1,1134 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * <2000> Daniel Fischer + * <2004> Wim Taymans + * <2006> Zaheer Abbas Merali + * + * 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-dv1394src + * + * Read DV (digital video) data from firewire port. + * + * + * Example launch line + * |[ + * gst-launch dv1394src ! queue ! dvdemux name=d ! queue ! dvdec ! xvimagesink d. ! queue ! alsasink + * ]| This pipeline captures from the firewire port and displays it (might need + * format converters for audio/video). + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#ifdef HAVE_LIBIEC61883 +#include +#endif + +#include + +#include "gstdv1394src.h" +#include "gst1394probe.h" +#include "gst1394clock.h" + + +#define CONTROL_STOP 'S' /* stop the select call */ +#define CONTROL_SOCKETS(src) src->control_sock +#define WRITE_SOCKET(src) src->control_sock[1] +#define READ_SOCKET(src) src->control_sock[0] + +#define SEND_COMMAND(src, command) \ +G_STMT_START { \ + int G_GNUC_UNUSED _res; unsigned char c; c = command; \ + _res = write (WRITE_SOCKET(src), &c, 1); \ +} G_STMT_END + +#define READ_COMMAND(src, command, res) \ +G_STMT_START { \ + res = read(READ_SOCKET(src), &command, 1); \ +} G_STMT_END + + +GST_DEBUG_CATEGORY_STATIC (dv1394src_debug); +#define GST_CAT_DEFAULT (dv1394src_debug) + +#define PAL_FRAMESIZE 144000 +#define PAL_FRAMERATE 25 + +#define NTSC_FRAMESIZE 120000 +#define NTSC_FRAMERATE 30 + +enum +{ + SIGNAL_FRAME_DROPPED, + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_PORT -1 +#define DEFAULT_CHANNEL 63 +#define DEFAULT_CONSECUTIVE 1 +#define DEFAULT_SKIP 0 +#define DEFAULT_DROP_INCOMPLETE TRUE +#define DEFAULT_USE_AVC TRUE +#define DEFAULT_GUID 0 + +enum +{ + PROP_0, + PROP_PORT, + PROP_CHANNEL, + PROP_CONSECUTIVE, + PROP_SKIP, + PROP_DROP_INCOMPLETE, + PROP_USE_AVC, + PROP_GUID, + PROP_DEVICE_NAME +}; + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-dv, " + "format = (string) { NTSC, PAL }, " "systemstream = (boolean) true") + ); + +static void gst_dv1394src_uri_handler_init (gpointer g_iface, + gpointer iface_data); + +static void gst_dv1394src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_dv1394src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_dv1394src_dispose (GObject * object); + +static GstClock *gst_dv1394src_provide_clock (GstElement * element); +static GstStateChangeReturn gst_dv1394_src_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_dv1394src_start (GstBaseSrc * bsrc); +static gboolean gst_dv1394src_stop (GstBaseSrc * bsrc); +static gboolean gst_dv1394src_unlock (GstBaseSrc * bsrc); + +static GstFlowReturn gst_dv1394src_create (GstPushSrc * psrc, GstBuffer ** buf); + +static gboolean gst_dv1394src_query (GstBaseSrc * src, GstQuery * query); +static void gst_dv1394src_update_device_name (GstDV1394Src * src); + +static void +_do_init (GType type) +{ + static const GInterfaceInfo urihandler_info = { + gst_dv1394src_uri_handler_init, + NULL, + NULL, + }; + g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); + + gst_1394_type_add_property_probe_interface (type); + + GST_DEBUG_CATEGORY_INIT (dv1394src_debug, "dv1394src", 0, + "DV firewire source"); +} + +GST_BOILERPLATE_FULL (GstDV1394Src, gst_dv1394src, GstPushSrc, + GST_TYPE_PUSH_SRC, _do_init); + + +static guint gst_dv1394src_signals[LAST_SIGNAL] = { 0 }; + + +static void +gst_dv1394src_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + + gst_element_class_set_details_simple (element_class, + "Firewire (1394) DV video source", "Source/Video", + "Source for DV video data from firewire port", + "Erik Walthinsen , " + "Daniel Fischer , " "Wim Taymans , " + "Zaheer Abbas Merali "); +} + +static void +gst_dv1394src_class_init (GstDV1394SrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSrcClass *gstbasesrc_class; + GstPushSrcClass *gstpushsrc_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; + + gobject_class->set_property = gst_dv1394src_set_property; + gobject_class->get_property = gst_dv1394src_get_property; + gobject_class->dispose = gst_dv1394src_dispose; + + gstelement_class->provide_clock = gst_dv1394src_provide_clock; + gstelement_class->change_state = gst_dv1394_src_change_state; + + gst_dv1394src_signals[SIGNAL_FRAME_DROPPED] = + g_signal_new ("frame-dropped", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDV1394SrcClass, frame_dropped), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, + g_param_spec_int ("port", "Port", "Port number (-1 automatic)", + -1, 16, DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CHANNEL, + g_param_spec_int ("channel", "Channel", "Channel number for listening", + 0, 64, DEFAULT_CHANNEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CONSECUTIVE, + g_param_spec_int ("consecutive", "consecutive frames", + "send n consecutive frames after skipping", 1, G_MAXINT, + DEFAULT_CONSECUTIVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SKIP, + g_param_spec_int ("skip", "skip frames", "skip n frames", + 0, G_MAXINT, DEFAULT_SKIP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DROP_INCOMPLETE, + g_param_spec_boolean ("drop-incomplete", "drop incomplete", + "drop incomplete frames", DEFAULT_DROP_INCOMPLETE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_USE_AVC, + g_param_spec_boolean ("use-avc", "Use AV/C", "Use AV/C VTR control", + DEFAULT_USE_AVC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_GUID, + g_param_spec_uint64 ("guid", "GUID", + "select one of multiple DV devices by its GUID. use a hexadecimal " + "like 0xhhhhhhhhhhhhhhhh. (0 = no guid)", 0, G_MAXUINT64, + DEFAULT_GUID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstDV1394Src:device-name + * + * Descriptive name of the currently opened device + * + * Since: 0.10.7 + **/ + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "device name", + "user-friendly name of the device", "Default", + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + gstbasesrc_class->negotiate = NULL; + gstbasesrc_class->start = gst_dv1394src_start; + gstbasesrc_class->stop = gst_dv1394src_stop; + gstbasesrc_class->unlock = gst_dv1394src_unlock; + gstbasesrc_class->query = gst_dv1394src_query; + + gstpushsrc_class->create = gst_dv1394src_create; +} + +static void +gst_dv1394src_init (GstDV1394Src * dv1394src, GstDV1394SrcClass * klass) +{ + GstPad *srcpad = GST_BASE_SRC_PAD (dv1394src); + + gst_base_src_set_live (GST_BASE_SRC (dv1394src), TRUE); + gst_base_src_set_format (GST_BASE_SRC (dv1394src), GST_FORMAT_TIME); + gst_base_src_set_do_timestamp (GST_BASE_SRC (dv1394src), TRUE); + gst_pad_use_fixed_caps (srcpad); + + dv1394src->port = DEFAULT_PORT; + dv1394src->channel = DEFAULT_CHANNEL; + + dv1394src->consecutive = DEFAULT_CONSECUTIVE; + dv1394src->skip = DEFAULT_SKIP; + dv1394src->drop_incomplete = DEFAULT_DROP_INCOMPLETE; + dv1394src->use_avc = DEFAULT_USE_AVC; + dv1394src->guid = DEFAULT_GUID; + dv1394src->uri = g_strdup_printf ("dv://%d", dv1394src->port); + dv1394src->device_name = g_strdup_printf ("Default"); + + READ_SOCKET (dv1394src) = -1; + WRITE_SOCKET (dv1394src) = -1; + + /* initialized when first header received */ + dv1394src->frame_size = 0; + + dv1394src->buf = NULL; + dv1394src->frame = NULL; + dv1394src->frame_sequence = 0; + + dv1394src->provided_clock = gst_1394_clock_new ("dv1394clock"); +} + +static void +gst_dv1394src_dispose (GObject * object) +{ + GstDV1394Src *src = GST_DV1394SRC (object); + + if (src->provided_clock) { + g_object_unref (src->provided_clock); + } + + g_free (src->uri); + src->uri = NULL; + + g_free (src->device_name); + src->device_name = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_dv1394src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstDV1394Src *filter = GST_DV1394SRC (object); + + switch (prop_id) { + case PROP_PORT: + filter->port = g_value_get_int (value); + g_free (filter->uri); + filter->uri = g_strdup_printf ("dv://%d", filter->port); + break; + case PROP_CHANNEL: + filter->channel = g_value_get_int (value); + break; + case PROP_SKIP: + filter->skip = g_value_get_int (value); + break; + case PROP_CONSECUTIVE: + filter->consecutive = g_value_get_int (value); + break; + case PROP_DROP_INCOMPLETE: + filter->drop_incomplete = g_value_get_boolean (value); + break; + case PROP_USE_AVC: + filter->use_avc = g_value_get_boolean (value); + break; + case PROP_GUID: + filter->guid = g_value_get_uint64 (value); + gst_dv1394src_update_device_name (filter); + break; + default: + break; + } +} + +static void +gst_dv1394src_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstDV1394Src *filter = GST_DV1394SRC (object); + + switch (prop_id) { + case PROP_PORT: + g_value_set_int (value, filter->port); + break; + case PROP_CHANNEL: + g_value_set_int (value, filter->channel); + break; + case PROP_SKIP: + g_value_set_int (value, filter->skip); + break; + case PROP_CONSECUTIVE: + g_value_set_int (value, filter->consecutive); + break; + case PROP_DROP_INCOMPLETE: + g_value_set_boolean (value, filter->drop_incomplete); + break; + case PROP_USE_AVC: + g_value_set_boolean (value, filter->use_avc); + break; + case PROP_GUID: + g_value_set_uint64 (value, filter->guid); + break; + case PROP_DEVICE_NAME: + g_value_set_string (value, filter->device_name); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstClock * +gst_dv1394src_provide_clock (GstElement * element) +{ + GstDV1394Src *dv1394src = GST_DV1394SRC (element); + + return GST_CLOCK_CAST (gst_object_ref (dv1394src->provided_clock)); +} + +static GstStateChangeReturn +gst_dv1394_src_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstDV1394Src *src = GST_DV1394SRC (element); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + gst_element_post_message (element, + gst_message_new_clock_lost (GST_OBJECT_CAST (element), + GST_CLOCK_CAST (src->provided_clock))); + 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_PLAYING: + gst_element_post_message (element, + gst_message_new_clock_provide (GST_OBJECT_CAST (element), + GST_CLOCK_CAST (src->provided_clock), TRUE)); + break; + default: + break; + } + + return ret; +} + +#ifdef HAVE_LIBIEC61883 +static GstDV1394Src * +gst_dv1394src_from_raw1394handle (raw1394handle_t handle) +{ + iec61883_dv_t dv = (iec61883_dv_t) raw1394_get_userdata (handle); + iec61883_dv_fb_t dv_fb = + (iec61883_dv_fb_t) iec61883_dv_get_callback_data (dv); + return GST_DV1394SRC (iec61883_dv_fb_get_callback_data (dv_fb)); +} +#else /* HAVE_LIBIEC61883 */ +static GstDV1394Src * +gst_dv1394src_from_raw1394handle (raw1394handle_t handle) +{ + return GST_DV1394SRC (raw1394_get_userdata (handle)); +} +#endif /* HAVE_LIBIEC61883 */ + +#ifdef HAVE_LIBIEC61883 +static int +gst_dv1394src_iec61883_receive (unsigned char *data, int len, + int complete, void *cbdata) +{ + GstDV1394Src *dv1394src = GST_DV1394SRC (cbdata); + + if (G_UNLIKELY (!GST_PAD_CAPS (GST_BASE_SRC_PAD (dv1394src)))) { + GstCaps *caps; + unsigned char *p = data; + + // figure format (NTSC/PAL) + if (p[3] & 0x80) { + // PAL + dv1394src->frame_size = PAL_FRAMESIZE; + dv1394src->frame_rate = PAL_FRAMERATE; + GST_DEBUG ("PAL data"); + caps = gst_caps_new_simple ("video/x-dv", + "format", G_TYPE_STRING, "PAL", + "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + } else { + // NTSC (untested) + dv1394src->frame_size = NTSC_FRAMESIZE; + dv1394src->frame_rate = NTSC_FRAMERATE; + GST_DEBUG + ("NTSC data [untested] - please report success/failure to "); + caps = gst_caps_new_simple ("video/x-dv", + "format", G_TYPE_STRING, "NTSC", + "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + } + gst_pad_set_caps (GST_BASE_SRC_PAD (dv1394src), caps); + gst_caps_unref (caps); + } + + dv1394src->frame = NULL; + if (G_LIKELY ((dv1394src->frame_sequence + 1) % (dv1394src->skip + + dv1394src->consecutive) < dv1394src->consecutive)) { + if (complete && len == dv1394src->frame_size) { + guint8 *bufdata; + GstBuffer *buf; + + buf = gst_buffer_new_and_alloc (dv1394src->frame_size); + + GST_BUFFER_OFFSET (buf) = dv1394src->frame_sequence; + bufdata = GST_BUFFER_DATA (buf); + memcpy (bufdata, data, len); + dv1394src->buf = buf; + } + } + dv1394src->frame_sequence++; + return 0; +} + +#else +static int +gst_dv1394src_iso_receive (raw1394handle_t handle, int channel, size_t len, + quadlet_t * data) +{ + GstDV1394Src *dv1394src = gst_dv1394src_from_raw1394handle (handle); + + if (len > 16) { + /* + the following code taken from kino-0.51 (Dan Dennedy/Charles Yates) + Kindly relicensed under the LGPL. See the commit log for version 1.6 of + this file in CVS. + */ + unsigned char *p = (unsigned char *) &data[3]; + + int section_type = p[0] >> 5; /* section type is in bits 5 - 7 */ + int dif_sequence = p[1] >> 4; /* dif sequence number is in bits 4 - 7 */ + int dif_block = p[2]; + + /* if we are at the beginning of a frame, + we set buf=frame, and alloc a new buffer for frame + */ + if (section_type == 0 && dif_sequence == 0) { // dif header + if (!GST_PAD_CAPS (GST_BASE_SRC_PAD (dv1394src))) { + GstCaps *caps; + + // figure format (NTSC/PAL) + if (p[3] & 0x80) { + // PAL + dv1394src->frame_size = PAL_FRAMESIZE; + dv1394src->frame_rate = PAL_FRAMERATE; + GST_DEBUG ("PAL data"); + caps = gst_caps_new_simple ("video/x-dv", + "format", G_TYPE_STRING, "PAL", + "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + } else { + // NTSC (untested) + dv1394src->frame_size = NTSC_FRAMESIZE; + dv1394src->frame_rate = NTSC_FRAMERATE; + GST_DEBUG + ("NTSC data [untested] - please report success/failure to "); + caps = gst_caps_new_simple ("video/x-dv", + "format", G_TYPE_STRING, "NTSC", + "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + } + gst_pad_set_caps (GST_BASE_SRC_PAD (dv1394src), caps); + gst_caps_unref (caps); + } + // drop last frame when not complete + if (!dv1394src->drop_incomplete + || dv1394src->bytes_in_frame == dv1394src->frame_size) { + dv1394src->buf = dv1394src->frame; + } else { + GST_INFO_OBJECT (GST_ELEMENT (dv1394src), "incomplete frame dropped"); + g_signal_emit (G_OBJECT (dv1394src), + gst_dv1394src_signals[SIGNAL_FRAME_DROPPED], 0); + if (dv1394src->frame) { + gst_buffer_unref (dv1394src->frame); + } + } + if ((dv1394src->frame_sequence + 1) % (dv1394src->skip + + dv1394src->consecutive) < dv1394src->consecutive) { + GstBuffer *buf; + gint64 i64; + + buf = gst_buffer_new_and_alloc (dv1394src->frame_size); + + /* fill in offset, duration, timestamp */ + GST_BUFFER_OFFSET (buf) = dv1394src->frame_sequence; + dv1394src->frame = buf; + } + dv1394src->frame_sequence++; + dv1394src->bytes_in_frame = 0; + } + + if (dv1394src->frame != NULL) { + guint8 *data = GST_BUFFER_DATA (dv1394src->frame); + + switch (section_type) { + case 0: /* 1 Header block */ + /* p[3] |= 0x80; // hack to force PAL data */ + memcpy (data + dif_sequence * 150 * 80, p, 480); + break; + + case 1: /* 2 Subcode blocks */ + memcpy (data + dif_sequence * 150 * 80 + (1 + dif_block) * 80, p, + 480); + break; + + case 2: /* 3 VAUX blocks */ + memcpy (data + dif_sequence * 150 * 80 + (3 + dif_block) * 80, p, + 480); + break; + + case 3: /* 9 Audio blocks interleaved with video */ + memcpy (data + dif_sequence * 150 * 80 + (6 + dif_block * 16) * 80, p, + 480); + break; + + case 4: /* 135 Video blocks interleaved with audio */ + memcpy (data + dif_sequence * 150 * 80 + (7 + (dif_block / 15) + + dif_block) * 80, p, 480); + break; + + default: /* we can't handle any other data */ + break; + } + dv1394src->bytes_in_frame += 480; + } + } + + return 0; +} +#endif +/* + * When an ieee1394 bus reset happens, usually a device has been removed + * or added. We send a message on the message bus with the node count + * and whether the capture device used in this element connected, disconnected + * or was unchanged + * Message structure: + * nodecount - integer with number of nodes on bus + * current-device-change - integer (1 if device connected, 0 if no change to + * current device status, -1 if device disconnected) + */ +static int +gst_dv1394src_bus_reset (raw1394handle_t handle, unsigned int generation) +{ + GstDV1394Src *src; + gint nodecount; + GstMessage *message; + GstStructure *structure; + gint current_device_change; + gint i; + + src = gst_dv1394src_from_raw1394handle (handle); + + GST_INFO_OBJECT (src, "have bus reset"); + + /* update generation - told to do so by docs */ + raw1394_update_generation (handle, generation); + nodecount = raw1394_get_nodecount (handle); + /* allocate memory for portinfo */ + + /* current_device_change is -1 if camera disconnected, 0 if other device + * connected or 1 if camera has now connected */ + current_device_change = -1; + for (i = 0; i < nodecount; i++) { + if (src->guid == rom1394_get_guid (handle, i)) { + /* Camera is with us */ + GST_DEBUG ("Camera is with us"); + if (!src->connected) { + current_device_change = 1; + src->connected = TRUE; + } else + current_device_change = 0; + } + } + if (src->connected && current_device_change == -1) { + GST_DEBUG ("Camera has disconnected"); + src->connected = FALSE; + } else if (!src->connected && current_device_change == -1) { + GST_DEBUG ("Camera is still not with us"); + current_device_change = 0; + } + + structure = gst_structure_new ("ieee1394-bus-reset", "nodecount", G_TYPE_INT, + nodecount, "current-device-change", G_TYPE_INT, current_device_change, + NULL); + message = gst_message_new_element (GST_OBJECT (src), structure); + gst_element_post_message (GST_ELEMENT (src), message); + + return 0; +} + +static GstFlowReturn +gst_dv1394src_create (GstPushSrc * psrc, GstBuffer ** buf) +{ + GstDV1394Src *dv1394src = GST_DV1394SRC (psrc); + GstCaps *caps; + struct pollfd pollfds[2]; + + pollfds[0].fd = raw1394_get_fd (dv1394src->handle); + pollfds[0].events = POLLIN | POLLERR | POLLHUP | POLLPRI; + pollfds[1].fd = READ_SOCKET (dv1394src); + pollfds[1].events = POLLIN | POLLERR | POLLHUP | POLLPRI; + + if (G_UNLIKELY (dv1394src->buf)) { + /* maybe we had an error before, and there's a stale buffer? */ + gst_buffer_unref (dv1394src->buf); + dv1394src->buf = NULL; + } + + while (TRUE) { + int res = poll (pollfds, 2, -1); + + if (G_UNLIKELY (res < 0)) { + if (errno == EAGAIN || errno == EINTR) + continue; + else + goto error_while_polling; + } + + if (G_UNLIKELY (pollfds[1].revents)) { + char command; + + if (pollfds[1].revents & POLLIN) + READ_COMMAND (dv1394src, command, res); + + goto told_to_stop; + } else if (G_LIKELY (pollfds[0].revents & POLLIN)) { + /* shouldn't block in theory */ + raw1394_loop_iterate (dv1394src->handle); + + if (dv1394src->buf) + break; + } + } + + g_assert (dv1394src->buf); + + caps = gst_pad_get_caps (GST_BASE_SRC_PAD (psrc)); + gst_buffer_set_caps (dv1394src->buf, caps); + gst_caps_unref (caps); + + *buf = dv1394src->buf; + dv1394src->buf = NULL; + return GST_FLOW_OK; + +error_while_polling: + { + GST_ELEMENT_ERROR (dv1394src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); + return GST_FLOW_UNEXPECTED; + } +told_to_stop: + { + GST_DEBUG_OBJECT (dv1394src, "told to stop, shutting down"); + return GST_FLOW_WRONG_STATE; + } +} + +static int +gst_dv1394src_discover_avc_node (GstDV1394Src * src) +{ + int node = -1; + int i, j = 0; + int m = src->num_ports; + + if (src->port >= 0) { + /* search on explicit port */ + j = src->port; + m = j + 1; + } + + /* loop over all our ports */ + for (; j < m && node == -1; j++) { + raw1394handle_t handle; + struct raw1394_portinfo pinf[16]; + + /* open the port */ + handle = raw1394_new_handle (); + if (!handle) { + GST_WARNING ("raw1394 - failed to get handle: %s.\n", strerror (errno)); + continue; + } + if (raw1394_get_port_info (handle, pinf, 16) < 0) { + GST_WARNING ("raw1394 - failed to get port info: %s.\n", + strerror (errno)); + goto next; + } + + /* tell raw1394 which host adapter to use */ + if (raw1394_set_port (handle, j) < 0) { + GST_WARNING ("raw1394 - failed to set set port: %s.\n", strerror (errno)); + goto next; + } + + /* now loop over all the nodes */ + for (i = 0; i < raw1394_get_nodecount (handle); i++) { + /* are we looking for an explicit GUID ? */ + if (src->guid != 0) { + if (src->guid == rom1394_get_guid (handle, i)) { + node = i; + src->port = j; + g_free (src->uri); + src->uri = g_strdup_printf ("dv://%d", src->port); + break; + } + } else { + rom1394_directory rom_dir; + + /* select first AV/C Tape Recorder Player node */ + if (rom1394_get_directory (handle, i, &rom_dir) < 0) { + GST_WARNING ("error reading config rom directory for node %d\n", i); + continue; + } + if ((rom1394_get_node_type (&rom_dir) == ROM1394_NODE_TYPE_AVC) && + avc1394_check_subunit_type (handle, i, AVC1394_SUBUNIT_TYPE_VCR)) { + node = i; + src->port = j; + src->guid = rom1394_get_guid (handle, i); + g_free (src->uri); + src->uri = g_strdup_printf ("dv://%d", src->port); + g_free (src->device_name); + src->device_name = g_strdup (rom_dir.label); + break; + } + rom1394_free_directory (&rom_dir); + } + } + next: + raw1394_destroy_handle (handle); + } + return node; +} + +static gboolean +gst_dv1394src_start (GstBaseSrc * bsrc) +{ + GstDV1394Src *src = GST_DV1394SRC (bsrc); + int control_sock[2]; + + src->connected = FALSE; + + if (socketpair (PF_UNIX, SOCK_STREAM, 0, control_sock) < 0) + goto socket_pair; + + READ_SOCKET (src) = control_sock[0]; + WRITE_SOCKET (src) = control_sock[1]; + + fcntl (READ_SOCKET (src), F_SETFL, O_NONBLOCK); + fcntl (WRITE_SOCKET (src), F_SETFL, O_NONBLOCK); + + src->handle = raw1394_new_handle (); + + if (!src->handle) { + if (errno == EACCES) + goto permission_denied; + else if (errno == ENOENT) + goto not_found; + else + goto no_handle; + } + + src->num_ports = raw1394_get_port_info (src->handle, src->pinfo, 16); + + if (src->num_ports == 0) + goto no_ports; + + if (src->use_avc || src->port == -1) + src->avc_node = gst_dv1394src_discover_avc_node (src); + + /* lets destroy handle and create one on port + this is more reliable than setting port on + the existing handle */ + raw1394_destroy_handle (src->handle); + src->handle = raw1394_new_handle_on_port (src->port); + if (!src->handle) + goto cannot_set_port; + + raw1394_set_userdata (src->handle, src); + raw1394_set_bus_reset_handler (src->handle, gst_dv1394src_bus_reset); + +#ifdef HAVE_LIBIEC61883 + if ((src->iec61883dv = + iec61883_dv_fb_init (src->handle, + gst_dv1394src_iec61883_receive, src)) == NULL) + goto cannot_initialise_dv; + +#else + raw1394_set_iso_handler (src->handle, src->channel, + gst_dv1394src_iso_receive); +#endif + + GST_DEBUG_OBJECT (src, "successfully opened up 1394 connection"); + src->connected = TRUE; + +#ifdef HAVE_LIBIEC61883 + if (iec61883_dv_fb_start (src->iec61883dv, src->channel) != 0) + goto cannot_start; +#else + if (raw1394_start_iso_rcv (src->handle, src->channel) < 0) + goto cannot_start; +#endif + + if (src->use_avc) { + raw1394handle_t avc_handle = raw1394_new_handle_on_port (src->port); + + /* start the VCR */ + if (avc_handle) { + if (!avc1394_vcr_is_recording (avc_handle, src->avc_node) + && avc1394_vcr_is_playing (avc_handle, src->avc_node) + != AVC1394_VCR_OPERAND_PLAY_FORWARD) + avc1394_vcr_play (avc_handle, src->avc_node); + raw1394_destroy_handle (avc_handle); + } else { + GST_WARNING_OBJECT (src, "Starting VCR via avc1394 failed: %s", + g_strerror (errno)); + } + } + + gst_1394_clock_set_handle (src->provided_clock, src->handle); + + return TRUE; + +socket_pair: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), + GST_ERROR_SYSTEM); + return FALSE; + } +permission_denied: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); + return FALSE; + } +not_found: + { + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), GST_ERROR_SYSTEM); + return FALSE; + } +no_handle: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), + ("can't get raw1394 handle (%s)", g_strerror (errno))); + return FALSE; + } +no_ports: + { + raw1394_destroy_handle (src->handle); + src->handle = NULL; + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), + ("no ports available for raw1394")); + return FALSE; + } +cannot_set_port: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("can't set 1394 port %d", src->port)); + return FALSE; + } +cannot_start: + { + raw1394_destroy_handle (src->handle); + src->handle = NULL; +#ifdef HAVE_LIBIEC61883 + iec61883_dv_fb_close (src->iec61883dv); + src->iec61883dv = NULL; +#endif + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("can't start 1394 iso receive")); + return FALSE; + } +#ifdef HAVE_LIBIEC61883 +cannot_initialise_dv: + { + raw1394_destroy_handle (src->handle); + src->handle = NULL; + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("can't initialise iec61883 dv")); + return FALSE; + } +#endif +} + +static gboolean +gst_dv1394src_stop (GstBaseSrc * bsrc) +{ + GstDV1394Src *src = GST_DV1394SRC (bsrc); + + close (READ_SOCKET (src)); + close (WRITE_SOCKET (src)); + READ_SOCKET (src) = -1; + WRITE_SOCKET (src) = -1; +#ifdef HAVE_LIBIEC61883 + iec61883_dv_fb_close (src->iec61883dv); +#else + raw1394_stop_iso_rcv (src->handle, src->channel); +#endif + + if (src->use_avc) { + raw1394handle_t avc_handle = raw1394_new_handle_on_port (src->port); + + /* pause and stop the VCR */ + if (avc_handle) { + if (!avc1394_vcr_is_recording (avc_handle, src->avc_node) + && (avc1394_vcr_is_playing (avc_handle, src->avc_node) + != AVC1394_VCR_OPERAND_PLAY_FORWARD_PAUSE)) + avc1394_vcr_pause (avc_handle, src->avc_node); + avc1394_vcr_stop (avc_handle, src->avc_node); + raw1394_destroy_handle (avc_handle); + } else { + GST_WARNING_OBJECT (src, "Starting VCR via avc1394 failed: %s", + g_strerror (errno)); + } + } + + gst_1394_clock_unset_handle (src->provided_clock); + + raw1394_destroy_handle (src->handle); + + return TRUE; +} + +static gboolean +gst_dv1394src_unlock (GstBaseSrc * bsrc) +{ + GstDV1394Src *src = GST_DV1394SRC (bsrc); + + SEND_COMMAND (src, CONTROL_STOP); + + return TRUE; +} + +static gboolean +gst_dv1394src_query (GstBaseSrc * basesrc, GstQuery * query) +{ + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + gst_query_set_latency (query, TRUE, GST_SECOND / 25, GST_CLOCK_TIME_NONE); + } + break; + default: + goto not_supported; + } + + return TRUE; + +not_supported: + return GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); +} + +static void +gst_dv1394src_update_device_name (GstDV1394Src * src) +{ + raw1394handle_t handle; + gint portcount, port, nodecount, node; + rom1394_directory directory; + + g_free (src->device_name); + src->device_name = NULL; + + GST_LOG_OBJECT (src, "updating device name for current GUID"); + + handle = raw1394_new_handle (); + + if (handle == NULL) + goto gethandle_failed; + + portcount = raw1394_get_port_info (handle, NULL, 0); + for (port = 0; port < portcount; port++) { + if (raw1394_set_port (handle, port) >= 0) { + nodecount = raw1394_get_nodecount (handle); + for (node = 0; node < nodecount; node++) { + if (src->guid == rom1394_get_guid (handle, node)) { + if (rom1394_get_directory (handle, node, &directory) >= 0) { + g_free (src->device_name); + src->device_name = g_strdup (directory.label); + rom1394_free_directory (&directory); + goto done; + } else { + GST_WARNING ("error reading rom directory for node %d", node); + } + } + } + } + } + + src->device_name = g_strdup ("Unknown"); /* FIXME: translate? */ + +done: + + raw1394_destroy_handle (handle); + return; + +/* ERRORS */ +gethandle_failed: + { + GST_WARNING ("failed to get raw1394 handle: %s", g_strerror (errno)); + src->device_name = g_strdup ("Unknown"); /* FIXME: translate? */ + return; + } +} + +/*** GSTURIHANDLER INTERFACE *************************************************/ + +static guint +gst_dv1394src_uri_get_type (void) +{ + return GST_URI_SRC; +} + +static gchar ** +gst_dv1394src_uri_get_protocols (void) +{ + static gchar *protocols[] = { (char *) "dv", NULL }; + + return protocols; +} + +static const gchar * +gst_dv1394src_uri_get_uri (GstURIHandler * handler) +{ + GstDV1394Src *gst_dv1394src = GST_DV1394SRC (handler); + + return gst_dv1394src->uri; +} + +static gboolean +gst_dv1394src_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + gchar *protocol, *location; + gboolean ret = TRUE; + GstDV1394Src *gst_dv1394src = GST_DV1394SRC (handler); + + protocol = gst_uri_get_protocol (uri); + if (strcmp (protocol, "dv") != 0) { + g_free (protocol); + return FALSE; + } + g_free (protocol); + + location = gst_uri_get_location (uri); + if (location && *location != '\0') + gst_dv1394src->port = strtol (location, NULL, 10); + else + gst_dv1394src->port = DEFAULT_PORT; + g_free (location); + g_free (gst_dv1394src->uri); + gst_dv1394src->uri = g_strdup_printf ("dv://%d", gst_dv1394src->port); + + return ret; +} + +static void +gst_dv1394src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_dv1394src_uri_get_type; + iface->get_protocols = gst_dv1394src_uri_get_protocols; + iface->get_uri = gst_dv1394src_uri_get_uri; + iface->set_uri = gst_dv1394src_uri_set_uri; +} diff --git a/ext/raw1394/gstdv1394src.h b/ext/raw1394/gstdv1394src.h new file mode 100644 index 0000000..bf9a3e0 --- /dev/null +++ b/ext/raw1394/gstdv1394src.h @@ -0,0 +1,101 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_GST1394_H__ +#define __GST_GST1394_H__ + + +#include +#include +#include "gst1394clock.h" + +#include +#ifdef HAVE_LIBIEC61883 +#include +#endif + +G_BEGIN_DECLS + +#define GST_TYPE_DV1394SRC \ + (gst_dv1394src_get_type()) +#define GST_DV1394SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DV1394SRC,GstDV1394Src)) +#define GST_DV1394SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DV1394SRC,GstDV1394SrcClass)) +#define GST_IS_DV1394SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DV1394SRC)) +#define GST_IS_DV1394SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DV1394SRC)) + +typedef struct _GstDV1394Src GstDV1394Src; +typedef struct _GstDV1394SrcClass GstDV1394SrcClass; + +struct _GstDV1394Src { + GstPushSrc element; + + // consecutive=2, skip=4 will skip 4 frames, then let 2 consecutive ones thru + gint consecutive; + gint skip; + gboolean drop_incomplete; + + gint num_ports; + gint port; + gint channel; + octlet_t guid; + gint avc_node; + gboolean use_avc; + + struct raw1394_portinfo pinfo[16]; + raw1394handle_t handle; + + GstBuffer *buf; + + GstBuffer *frame; + guint frame_size; + guint frame_rate; + guint bytes_in_frame; + guint frame_sequence; + + int control_sock[2]; + + gchar *uri; + + gchar *device_name; + + gboolean connected; + #ifdef HAVE_LIBIEC61883 + iec61883_dv_fb_t iec61883dv; + #endif + + Gst1394Clock *provided_clock; +}; + +struct _GstDV1394SrcClass { + GstPushSrcClass parent_class; + + /* signal */ + void (*frame_dropped) (GstElement *elem); +}; + +GType gst_dv1394src_get_type(void); + +G_END_DECLS + +#endif /* __GST_GST1394_H__ */ diff --git a/ext/raw1394/gsthdv1394src.c b/ext/raw1394/gsthdv1394src.c new file mode 100644 index 0000000..33ef11e --- /dev/null +++ b/ext/raw1394/gsthdv1394src.c @@ -0,0 +1,844 @@ +/* GStreamer + * Copyright (C) <2008> Edward Hervey + * + * 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-hdv1394src + * + * Read MPEG-TS data from firewire port. + * + * + * Example launch line + * |[ + * gst-launch hdv1394src ! queue ! decodebin name=d ! queue ! xvimagesink d. ! queue ! alsasink + * ]| captures from the firewire port and plays the streams. + * |[ + * gst-launch hdv1394src ! queue ! filesink location=mydump.ts + * ]| capture to a disk file + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include "gsthdv1394src.h" +#include "gst1394probe.h" + + +#define CONTROL_STOP 'S' /* stop the select call */ +#define CONTROL_SOCKETS(src) src->control_sock +#define WRITE_SOCKET(src) src->control_sock[1] +#define READ_SOCKET(src) src->control_sock[0] + +#define SEND_COMMAND(src, command) \ +G_STMT_START { \ + int G_GNUC_UNUSED _res; unsigned char c; c = command; \ + _res = write (WRITE_SOCKET(src), &c, 1); \ +} G_STMT_END + +#define READ_COMMAND(src, command, res) \ +G_STMT_START { \ + res = read(READ_SOCKET(src), &command, 1); \ +} G_STMT_END + + +GST_DEBUG_CATEGORY_STATIC (hdv1394src_debug); +#define GST_CAT_DEFAULT (hdv1394src_debug) + +#define DEFAULT_PORT -1 +#define DEFAULT_CHANNEL 63 +#define DEFAULT_USE_AVC TRUE +#define DEFAULT_GUID 0 + +enum +{ + PROP_0, + PROP_PORT, + PROP_CHANNEL, + PROP_USE_AVC, + PROP_GUID, + PROP_DEVICE_NAME +}; + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS + ("video/mpegts,systemstream=(boolean)true,packetsize=(int)188") + ); + +static void gst_hdv1394src_uri_handler_init (gpointer g_iface, + gpointer iface_data); + +static void gst_hdv1394src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_hdv1394src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_hdv1394src_dispose (GObject * object); + +static gboolean gst_hdv1394src_start (GstBaseSrc * bsrc); +static gboolean gst_hdv1394src_stop (GstBaseSrc * bsrc); +static gboolean gst_hdv1394src_unlock (GstBaseSrc * bsrc); + +static GstFlowReturn gst_hdv1394src_create (GstPushSrc * psrc, + GstBuffer ** buf); + +static void gst_hdv1394src_update_device_name (GstHDV1394Src * src); + +static void +_do_init (GType type) +{ + static const GInterfaceInfo urihandler_info = { + gst_hdv1394src_uri_handler_init, + NULL, + NULL, + }; + g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); + + gst_1394_type_add_property_probe_interface (type); + + GST_DEBUG_CATEGORY_INIT (hdv1394src_debug, "hdv1394src", 0, + "MPEG-TS firewire source"); +} + +GST_BOILERPLATE_FULL (GstHDV1394Src, gst_hdv1394src, GstPushSrc, + GST_TYPE_PUSH_SRC, _do_init); + + +static void +gst_hdv1394src_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + + gst_element_class_set_details_simple (element_class, + "Firewire (1394) HDV video source", "Source/Video", + "Source for MPEG-TS video data from firewire port", + "Edward Hervey "); +} + +static void +gst_hdv1394src_class_init (GstHDV1394SrcClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + GstPushSrcClass *gstpushsrc_class; + + gobject_class = (GObjectClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; + + gobject_class->set_property = gst_hdv1394src_set_property; + gobject_class->get_property = gst_hdv1394src_get_property; + gobject_class->dispose = gst_hdv1394src_dispose; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, + g_param_spec_int ("port", "Port", "Port number (-1 automatic)", + -1, 16, DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CHANNEL, + g_param_spec_int ("channel", "Channel", "Channel number for listening", + 0, 64, DEFAULT_CHANNEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_USE_AVC, + g_param_spec_boolean ("use-avc", "Use AV/C", "Use AV/C VTR control", + DEFAULT_USE_AVC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_GUID, + g_param_spec_uint64 ("guid", "GUID", + "select one of multiple DV devices by its GUID. use a hexadecimal " + "like 0xhhhhhhhhhhhhhhhh. (0 = no guid)", 0, G_MAXUINT64, + DEFAULT_GUID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstHDV1394Src:device-name + * + * Descriptive name of the currently opened device + * + * Since: 0.10.7 + **/ + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "device name", + "user-friendly name of the device", "Default", + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + gstbasesrc_class->negotiate = NULL; + gstbasesrc_class->start = gst_hdv1394src_start; + gstbasesrc_class->stop = gst_hdv1394src_stop; + gstbasesrc_class->unlock = gst_hdv1394src_unlock; + + gstpushsrc_class->create = gst_hdv1394src_create; +} + +static void +gst_hdv1394src_init (GstHDV1394Src * dv1394src, GstHDV1394SrcClass * klass) +{ + GstPad *srcpad = GST_BASE_SRC_PAD (dv1394src); + + gst_base_src_set_live (GST_BASE_SRC (dv1394src), TRUE); + gst_pad_use_fixed_caps (srcpad); + + dv1394src->port = DEFAULT_PORT; + dv1394src->channel = DEFAULT_CHANNEL; + + dv1394src->use_avc = DEFAULT_USE_AVC; + dv1394src->guid = DEFAULT_GUID; + dv1394src->uri = g_strdup_printf ("hdv://%d", dv1394src->port); + dv1394src->device_name = g_strdup_printf ("Default"); + + READ_SOCKET (dv1394src) = -1; + WRITE_SOCKET (dv1394src) = -1; + + dv1394src->frame_sequence = 0; +} + +static void +gst_hdv1394src_dispose (GObject * object) +{ + GstHDV1394Src *src = GST_HDV1394SRC (object); + + g_free (src->uri); + src->uri = NULL; + + g_free (src->device_name); + src->device_name = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_hdv1394src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstHDV1394Src *filter = GST_HDV1394SRC (object); + + switch (prop_id) { + case PROP_PORT: + filter->port = g_value_get_int (value); + g_free (filter->uri); + filter->uri = g_strdup_printf ("hdv://%d", filter->port); + break; + case PROP_CHANNEL: + filter->channel = g_value_get_int (value); + break; + case PROP_USE_AVC: + filter->use_avc = g_value_get_boolean (value); + break; + case PROP_GUID: + filter->guid = g_value_get_uint64 (value); + gst_hdv1394src_update_device_name (filter); + break; + default: + break; + } +} + +static void +gst_hdv1394src_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstHDV1394Src *filter = GST_HDV1394SRC (object); + + switch (prop_id) { + case PROP_PORT: + g_value_set_int (value, filter->port); + break; + case PROP_CHANNEL: + g_value_set_int (value, filter->channel); + break; + case PROP_USE_AVC: + g_value_set_boolean (value, filter->use_avc); + break; + case PROP_GUID: + g_value_set_uint64 (value, filter->guid); + break; + case PROP_DEVICE_NAME: + g_value_set_string (value, filter->device_name); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstHDV1394Src * +gst_hdv1394src_from_raw1394handle (raw1394handle_t handle) +{ + iec61883_mpeg2_t mpeg2 = (iec61883_mpeg2_t) raw1394_get_userdata (handle); + return GST_HDV1394SRC (iec61883_mpeg2_get_callback_data (mpeg2)); +} + +/* Within one loop iteration (which may call _receive() many times), it seems + * as though '*data' will always be different. + * + * We can therefore assume that any '*data' given to us will stay allocated until + * the next loop iteration. + */ + +static int +gst_hdv1394src_iec61883_receive (unsigned char *data, int len, + unsigned int dropped, void *cbdata) +{ + GstHDV1394Src *dv1394src = GST_HDV1394SRC (cbdata); + + GST_LOG ("data:%p, len:%d, dropped:%d", data, len, dropped); + + /* error out if we don't have enough room ! */ + if (G_UNLIKELY (dv1394src->outoffset > (2048 * 188 - len))) + return -1; + + if (G_LIKELY (len == IEC61883_MPEG2_TSP_SIZE)) { + memcpy ((guint8 *) dv1394src->outdata + dv1394src->outoffset, data, len); + dv1394src->outoffset += len; + } + dv1394src->frame_sequence++; + return 0; +} + +/* + * When an ieee1394 bus reset happens, usually a device has been removed + * or added. We send a message on the message bus with the node count + * and whether the capture device used in this element connected, disconnected + * or was unchanged + * Message structure: + * nodecount - integer with number of nodes on bus + * current-device-change - integer (1 if device connected, 0 if no change to + * current device status, -1 if device disconnected) + */ +static int +gst_hdv1394src_bus_reset (raw1394handle_t handle, unsigned int generation) +{ + GstHDV1394Src *src; + gint nodecount; + GstMessage *message; + GstStructure *structure; + gint current_device_change; + gint i; + + src = gst_hdv1394src_from_raw1394handle (handle); + + GST_INFO_OBJECT (src, "have bus reset"); + + /* update generation - told to do so by docs */ + raw1394_update_generation (handle, generation); + nodecount = raw1394_get_nodecount (handle); + /* allocate memory for portinfo */ + + /* current_device_change is -1 if camera disconnected, 0 if other device + * connected or 1 if camera has now connected */ + current_device_change = -1; + for (i = 0; i < nodecount; i++) { + if (src->guid == rom1394_get_guid (handle, i)) { + /* Camera is with us */ + GST_DEBUG ("Camera is with us"); + if (!src->connected) { + current_device_change = 1; + src->connected = TRUE; + } else + current_device_change = 0; + } + } + if (src->connected && current_device_change == -1) { + GST_DEBUG ("Camera has disconnected"); + src->connected = FALSE; + } else if (!src->connected && current_device_change == -1) { + GST_DEBUG ("Camera is still not with us"); + current_device_change = 0; + } + + structure = gst_structure_new ("ieee1394-bus-reset", "nodecount", G_TYPE_INT, + nodecount, "current-device-change", G_TYPE_INT, current_device_change, + NULL); + message = gst_message_new_element (GST_OBJECT (src), structure); + gst_element_post_message (GST_ELEMENT (src), message); + + return 0; +} + +static GstFlowReturn +gst_hdv1394src_create (GstPushSrc * psrc, GstBuffer ** buf) +{ + GstHDV1394Src *dv1394src = GST_HDV1394SRC (psrc); + GstCaps *caps; + struct pollfd pollfds[2]; + + pollfds[0].fd = raw1394_get_fd (dv1394src->handle); + pollfds[0].events = POLLIN | POLLERR | POLLHUP | POLLPRI; + pollfds[1].fd = READ_SOCKET (dv1394src); + pollfds[1].events = POLLIN | POLLERR | POLLHUP | POLLPRI; + + /* allocate a 2048 samples buffer */ + dv1394src->outdata = g_malloc (2048 * 188); + dv1394src->outoffset = 0; + + GST_DEBUG ("Create..."); + + while (TRUE) { + int res = poll (pollfds, 2, -1); + + GST_LOG ("res:%d", res); + + if (G_UNLIKELY (res < 0)) { + if (errno == EAGAIN || errno == EINTR) + continue; + else + goto error_while_polling; + } + + if (G_UNLIKELY (pollfds[1].revents)) { + char command; + + if (pollfds[1].revents & POLLIN) + READ_COMMAND (dv1394src, command, res); + + goto told_to_stop; + } else if (G_LIKELY (pollfds[0].revents & POLLIN)) { + int pt; + + pt = dv1394src->frame_sequence; + /* shouldn't block in theory */ + GST_LOG ("Iterating ! (%d)", dv1394src->frame_sequence); + raw1394_loop_iterate (dv1394src->handle); + GST_LOG ("After iteration : %d (diff:%d)", + dv1394src->frame_sequence, dv1394src->frame_sequence - pt); + if (dv1394src->outoffset) + break; + } + } + + g_assert (dv1394src->outoffset); + + GST_LOG ("We have some frames (%u bytes)", (guint) dv1394src->outoffset); + + /* Create the buffer */ + *buf = gst_buffer_new (); + GST_BUFFER_DATA (*buf) = dv1394src->outdata; + GST_BUFFER_MALLOCDATA (*buf) = dv1394src->outdata; + GST_BUFFER_SIZE (*buf) = dv1394src->outoffset; + dv1394src->outdata = NULL; + dv1394src->outoffset = 0; + + caps = gst_pad_get_caps (GST_BASE_SRC_PAD (psrc)); + gst_buffer_set_caps (*buf, caps); + gst_caps_unref (caps); + + return GST_FLOW_OK; + +error_while_polling: + { + GST_ELEMENT_ERROR (dv1394src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); + return GST_FLOW_UNEXPECTED; + } +told_to_stop: + { + GST_DEBUG_OBJECT (dv1394src, "told to stop, shutting down"); + return GST_FLOW_WRONG_STATE; + } +} + +static int +gst_hdv1394src_discover_avc_node (GstHDV1394Src * src) +{ + int node = -1; + int i, j = 0; + int m = src->num_ports; + + if (src->port >= 0) { + /* search on explicit port */ + j = src->port; + m = j + 1; + } + + /* loop over all our ports */ + for (; j < m && node == -1; j++) { + raw1394handle_t handle; + struct raw1394_portinfo pinf[16]; + + /* open the port */ + handle = raw1394_new_handle (); + if (!handle) { + GST_WARNING ("raw1394 - failed to get handle: %s.\n", strerror (errno)); + continue; + } + if (raw1394_get_port_info (handle, pinf, 16) < 0) { + GST_WARNING ("raw1394 - failed to get port info: %s.\n", + strerror (errno)); + goto next; + } + + /* tell raw1394 which host adapter to use */ + if (raw1394_set_port (handle, j) < 0) { + GST_WARNING ("raw1394 - failed to set set port: %s.\n", strerror (errno)); + goto next; + } + + /* now loop over all the nodes */ + for (i = 0; i < raw1394_get_nodecount (handle); i++) { + /* are we looking for an explicit GUID ? */ + if (src->guid != 0) { + if (src->guid == rom1394_get_guid (handle, i)) { + node = i; + src->port = j; + g_free (src->uri); + src->uri = g_strdup_printf ("dv://%d", src->port); + break; + } + } else { + rom1394_directory rom_dir; + + /* select first AV/C Tape Recorder Player node */ + if (rom1394_get_directory (handle, i, &rom_dir) < 0) { + GST_WARNING ("error reading config rom directory for node %d\n", i); + continue; + } + if ((rom1394_get_node_type (&rom_dir) == ROM1394_NODE_TYPE_AVC) && + avc1394_check_subunit_type (handle, i, AVC1394_SUBUNIT_TYPE_VCR)) { + node = i; + src->port = j; + src->guid = rom1394_get_guid (handle, i); + g_free (src->uri); + src->uri = g_strdup_printf ("dv://%d", src->port); + g_free (src->device_name); + src->device_name = g_strdup (rom_dir.label); + break; + } + rom1394_free_directory (&rom_dir); + } + } + next: + raw1394_destroy_handle (handle); + } + return node; +} + +static gboolean +gst_hdv1394src_start (GstBaseSrc * bsrc) +{ + GstHDV1394Src *src = GST_HDV1394SRC (bsrc); + int control_sock[2]; + + src->connected = FALSE; + + if (socketpair (PF_UNIX, SOCK_STREAM, 0, control_sock) < 0) + goto socket_pair; + + READ_SOCKET (src) = control_sock[0]; + WRITE_SOCKET (src) = control_sock[1]; + + fcntl (READ_SOCKET (src), F_SETFL, O_NONBLOCK); + fcntl (WRITE_SOCKET (src), F_SETFL, O_NONBLOCK); + + src->handle = raw1394_new_handle (); + + if (!src->handle) { + if (errno == EACCES) + goto permission_denied; + else if (errno == ENOENT) + goto not_found; + else + goto no_handle; + } + + src->num_ports = raw1394_get_port_info (src->handle, src->pinfo, 16); + + if (src->num_ports == 0) + goto no_ports; + + if (src->use_avc || src->port == -1) + src->avc_node = gst_hdv1394src_discover_avc_node (src); + + /* lets destroy handle and create one on port + this is more reliable than setting port on + the existing handle */ + raw1394_destroy_handle (src->handle); + src->handle = raw1394_new_handle_on_port (src->port); + if (!src->handle) + goto cannot_set_port; + + raw1394_set_userdata (src->handle, src); + raw1394_set_bus_reset_handler (src->handle, gst_hdv1394src_bus_reset); + + if ((src->iec61883mpeg2 = + iec61883_mpeg2_recv_init (src->handle, + gst_hdv1394src_iec61883_receive, src)) == NULL) + goto cannot_initialise_dv; + +#if 0 + raw1394_set_iso_handler (src->handle, src->channel, + gst_hdv1394src_iso_receive); +#endif + + GST_DEBUG_OBJECT (src, "successfully opened up 1394 connection"); + src->connected = TRUE; + + if (iec61883_mpeg2_recv_start (src->iec61883mpeg2, src->channel) != 0) + goto cannot_start; +#if 0 + if (raw1394_start_iso_rcv (src->handle, src->channel) < 0) + goto cannot_start; +#endif + + if (src->use_avc) { + raw1394handle_t avc_handle = raw1394_new_handle_on_port (src->port); + + GST_LOG ("We have an avc_handle"); + + /* start the VCR */ + if (avc_handle) { + if (!avc1394_vcr_is_recording (avc_handle, src->avc_node) + && avc1394_vcr_is_playing (avc_handle, src->avc_node) + != AVC1394_VCR_OPERAND_PLAY_FORWARD) { + GST_LOG ("Calling avc1394_vcr_play()"); + avc1394_vcr_play (avc_handle, src->avc_node); + } + raw1394_destroy_handle (avc_handle); + } else { + GST_WARNING_OBJECT (src, "Starting VCR via avc1394 failed: %s", + g_strerror (errno)); + } + } + + return TRUE; + +socket_pair: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), + GST_ERROR_SYSTEM); + return FALSE; + } +permission_denied: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); + return FALSE; + } +not_found: + { + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), GST_ERROR_SYSTEM); + return FALSE; + } +no_handle: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), + ("can't get raw1394 handle (%s)", g_strerror (errno))); + return FALSE; + } +no_ports: + { + raw1394_destroy_handle (src->handle); + src->handle = NULL; + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), + ("no ports available for raw1394")); + return FALSE; + } +cannot_set_port: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("can't set 1394 port %d", src->port)); + return FALSE; + } +cannot_start: + { + raw1394_destroy_handle (src->handle); + src->handle = NULL; + iec61883_mpeg2_close (src->iec61883mpeg2); + src->iec61883mpeg2 = NULL; + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("can't start 1394 iso receive")); + return FALSE; + } +cannot_initialise_dv: + { + raw1394_destroy_handle (src->handle); + src->handle = NULL; + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("can't initialise iec61883 hdv")); + return FALSE; + } +} + +static gboolean +gst_hdv1394src_stop (GstBaseSrc * bsrc) +{ + GstHDV1394Src *src = GST_HDV1394SRC (bsrc); + + close (READ_SOCKET (src)); + close (WRITE_SOCKET (src)); + READ_SOCKET (src) = -1; + WRITE_SOCKET (src) = -1; + + iec61883_mpeg2_close (src->iec61883mpeg2); +#if 0 + raw1394_stop_iso_rcv (src->handle, src->channel); +#endif + + if (src->use_avc) { + raw1394handle_t avc_handle = raw1394_new_handle_on_port (src->port); + + /* pause and stop the VCR */ + if (avc_handle) { + if (!avc1394_vcr_is_recording (avc_handle, src->avc_node) + && (avc1394_vcr_is_playing (avc_handle, src->avc_node) + != AVC1394_VCR_OPERAND_PLAY_FORWARD_PAUSE)) + avc1394_vcr_pause (avc_handle, src->avc_node); + avc1394_vcr_stop (avc_handle, src->avc_node); + raw1394_destroy_handle (avc_handle); + } else { + GST_WARNING_OBJECT (src, "Starting VCR via avc1394 failed: %s", + g_strerror (errno)); + } + } + + raw1394_destroy_handle (src->handle); + + return TRUE; +} + +static gboolean +gst_hdv1394src_unlock (GstBaseSrc * bsrc) +{ + GstHDV1394Src *src = GST_HDV1394SRC (bsrc); + + SEND_COMMAND (src, CONTROL_STOP); + + return TRUE; +} + +static void +gst_hdv1394src_update_device_name (GstHDV1394Src * src) +{ + raw1394handle_t handle; + gint portcount, port, nodecount, node; + rom1394_directory directory; + + g_free (src->device_name); + src->device_name = NULL; + + GST_LOG_OBJECT (src, "updating device name for current GUID"); + + handle = raw1394_new_handle (); + + if (handle == NULL) + goto gethandle_failed; + + portcount = raw1394_get_port_info (handle, NULL, 0); + for (port = 0; port < portcount; port++) { + if (raw1394_set_port (handle, port) >= 0) { + nodecount = raw1394_get_nodecount (handle); + for (node = 0; node < nodecount; node++) { + if (src->guid == rom1394_get_guid (handle, node)) { + if (rom1394_get_directory (handle, node, &directory) >= 0) { + g_free (src->device_name); + src->device_name = g_strdup (directory.label); + rom1394_free_directory (&directory); + goto done; + } else { + GST_WARNING ("error reading rom directory for node %d", node); + } + } + } + } + } + + src->device_name = g_strdup ("Unknown"); /* FIXME: translate? */ + +done: + + raw1394_destroy_handle (handle); + return; + +/* ERRORS */ +gethandle_failed: + { + GST_WARNING ("failed to get raw1394 handle: %s", g_strerror (errno)); + src->device_name = g_strdup ("Unknown"); /* FIXME: translate? */ + return; + } +} + +/*** GSTURIHANDLER INTERFACE *************************************************/ + +static guint +gst_hdv1394src_uri_get_type (void) +{ + return GST_URI_SRC; +} + +static gchar ** +gst_hdv1394src_uri_get_protocols (void) +{ + static gchar *protocols[] = { (char *) "hdv", NULL }; + + return protocols; +} + +static const gchar * +gst_hdv1394src_uri_get_uri (GstURIHandler * handler) +{ + GstHDV1394Src *gst_hdv1394src = GST_HDV1394SRC (handler); + + return gst_hdv1394src->uri; +} + +static gboolean +gst_hdv1394src_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + gchar *protocol, *location; + gboolean ret = TRUE; + GstHDV1394Src *gst_hdv1394src = GST_HDV1394SRC (handler); + + protocol = gst_uri_get_protocol (uri); + if (strcmp (protocol, "hdv") != 0) { + g_free (protocol); + return FALSE; + } + g_free (protocol); + + location = gst_uri_get_location (uri); + if (location && *location != '\0') + gst_hdv1394src->port = strtol (location, NULL, 10); + else + gst_hdv1394src->port = DEFAULT_PORT; + g_free (location); + g_free (gst_hdv1394src->uri); + gst_hdv1394src->uri = g_strdup_printf ("hdv://%d", gst_hdv1394src->port); + + return ret; +} + +static void +gst_hdv1394src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_hdv1394src_uri_get_type; + iface->get_protocols = gst_hdv1394src_uri_get_protocols; + iface->get_uri = gst_hdv1394src_uri_get_uri; + iface->set_uri = gst_hdv1394src_uri_set_uri; +} diff --git a/ext/raw1394/gsthdv1394src.h b/ext/raw1394/gsthdv1394src.h new file mode 100644 index 0000000..a6014a4 --- /dev/null +++ b/ext/raw1394/gsthdv1394src.h @@ -0,0 +1,85 @@ +/* GStreamer + * Copyright (C) <2008> Edward Hervey + * + * 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_GSTHDV1394_H__ +#define __GST_GSTHDV1394_H__ + + +#include +#include + +#include +#ifdef HAVE_LIBIEC61883 +#include +#endif + +G_BEGIN_DECLS + +#define GST_TYPE_HDV1394SRC \ + (gst_hdv1394src_get_type()) +#define GST_HDV1394SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_HDV1394SRC,GstHDV1394Src)) +#define GST_HDV1394SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_HDV1394SRC,GstHDV1394SrcClass)) +#define GST_IS_HDV1394SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_HDV1394SRC)) +#define GST_IS_HDV1394SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_HDV1394SRC)) + +typedef struct _GstHDV1394Src GstHDV1394Src; +typedef struct _GstHDV1394SrcClass GstHDV1394SrcClass; + +struct _GstHDV1394Src { + GstPushSrc element; + + gint num_ports; + gint port; + gint channel; + octlet_t guid; + gint avc_node; + gboolean use_avc; + + struct raw1394_portinfo pinfo[16]; + raw1394handle_t handle; + + gpointer outdata; + gsize outoffset; + guint frame_size; + guint frame_sequence; + + int control_sock[2]; + + gchar *uri; + + gchar *device_name; + + gboolean connected; + iec61883_mpeg2_t iec61883mpeg2; +}; + +struct _GstHDV1394SrcClass { + GstPushSrcClass parent_class; +}; + +GType gst_hdv1394src_get_type(void); + +G_END_DECLS + +#endif /* __GST_GST1394_H__ */ diff --git a/ext/shout2/Makefile.am b/ext/shout2/Makefile.am new file mode 100644 index 0000000..4cb3f7c --- /dev/null +++ b/ext/shout2/Makefile.am @@ -0,0 +1,9 @@ +plugin_LTLIBRARIES = libgstshout2.la + +libgstshout2_la_SOURCES = gstshout2.c +libgstshout2_la_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SHOUT2_CFLAGS) +libgstshout2_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(SHOUT2_LIBS) +libgstshout2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstshout2_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstshout2.h diff --git a/ext/shout2/Makefile.in b/ext/shout2/Makefile.in new file mode 100644 index 0000000..cebe633 --- /dev/null +++ b/ext/shout2/Makefile.in @@ -0,0 +1,805 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/shout2 +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstshout2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstshout2_la_OBJECTS = libgstshout2_la-gstshout2.lo +libgstshout2_la_OBJECTS = $(am_libgstshout2_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstshout2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstshout2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstshout2_la_CFLAGS) $(CFLAGS) \ + $(libgstshout2_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstshout2_la_SOURCES) +DIST_SOURCES = $(libgstshout2_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstshout2.la +libgstshout2_la_SOURCES = gstshout2.c +libgstshout2_la_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SHOUT2_CFLAGS) +libgstshout2_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(SHOUT2_LIBS) +libgstshout2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstshout2_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstshout2.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/shout2/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/shout2/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstshout2.la: $(libgstshout2_la_OBJECTS) $(libgstshout2_la_DEPENDENCIES) $(EXTRA_libgstshout2_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstshout2_la_LINK) -rpath $(plugindir) $(libgstshout2_la_OBJECTS) $(libgstshout2_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstshout2_la-gstshout2.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstshout2_la-gstshout2.lo: gstshout2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstshout2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstshout2_la_CFLAGS) $(CFLAGS) -MT libgstshout2_la-gstshout2.lo -MD -MP -MF $(DEPDIR)/libgstshout2_la-gstshout2.Tpo -c -o libgstshout2_la-gstshout2.lo `test -f 'gstshout2.c' || echo '$(srcdir)/'`gstshout2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstshout2_la-gstshout2.Tpo $(DEPDIR)/libgstshout2_la-gstshout2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstshout2.c' object='libgstshout2_la-gstshout2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstshout2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstshout2_la_CFLAGS) $(CFLAGS) -c -o libgstshout2_la-gstshout2.lo `test -f 'gstshout2.c' || echo '$(srcdir)/'`gstshout2.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/shout2/gstshout2.c b/ext/shout2/gstshout2.c new file mode 100644 index 0000000..c1bfcc2 --- /dev/null +++ b/ext/shout2/gstshout2.c @@ -0,0 +1,852 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Tim-Philipp Müller + * Copyright (C) <2012> Ralph Giles + * + * 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 "gstshout2.h" +#include +#include + +#include "gst/gst-i18n-plugin.h" + +GST_DEBUG_CATEGORY_STATIC (shout2_debug); +#define GST_CAT_DEFAULT shout2_debug + + +enum +{ + SIGNAL_CONNECTION_PROBLEM, /* 0.11 FIXME: remove this */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, + ARG_IP, /* the ip of the server */ + ARG_PORT, /* the encoder port number on the server */ + ARG_PASSWORD, /* the encoder password on the server */ + ARG_USERNAME, /* the encoder username on the server */ + ARG_PUBLIC, /* is this stream public? */ + ARG_STREAMNAME, /* Name of the stream */ + ARG_DESCRIPTION, /* Description of the stream */ + ARG_GENRE, /* Genre of the stream */ + + ARG_PROTOCOL, /* Protocol to connect with */ + + ARG_MOUNT, /* mountpoint of stream (icecast only) */ + ARG_URL /* Url of stream (I'm guessing) */ +}; + +#define DEFAULT_IP "127.0.0.1" +#define DEFAULT_PORT 8000 +#define DEFAULT_PASSWORD "hackme" +#define DEFAULT_USERNAME "source" +#define DEFAULT_PUBLIC FALSE +#define DEFAULT_STREAMNAME "" +#define DEFAULT_DESCRIPTION "" +#define DEFAULT_GENRE "" +#define DEFAULT_MOUNT "" +#define DEFAULT_URL "" +#define DEFAULT_PROTOCOL SHOUT2SEND_PROTOCOL_HTTP + +static GstElementClass *parent_class = NULL; + +#ifdef SHOUT_FORMAT_WEBM +#define WEBM_CAPS "; video/webm" +#else +#define WEBM_CAPS "" +#endif +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/ogg; " + "audio/mpeg, mpegversion = (int) 1, layer = (int) [ 1, 3 ]" WEBM_CAPS)); + +static void gst_shout2send_class_init (GstShout2sendClass * klass); +static void gst_shout2send_base_init (GstShout2sendClass * klass); +static void gst_shout2send_init (GstShout2send * shout2send); +static void gst_shout2send_finalize (GstShout2send * shout2send); + +static gboolean gst_shout2send_event (GstBaseSink * sink, GstEvent * event); +static gboolean gst_shout2send_unlock (GstBaseSink * basesink); +static gboolean gst_shout2send_unlock_stop (GstBaseSink * basesink); +static GstFlowReturn gst_shout2send_render (GstBaseSink * sink, + GstBuffer * buffer); +static gboolean gst_shout2send_start (GstBaseSink * basesink); +static gboolean gst_shout2send_stop (GstBaseSink * basesink); + +static void gst_shout2send_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_shout2send_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_shout2send_setcaps (GstPad * pad, GstCaps * caps); + +static guint gst_shout2send_signals[LAST_SIGNAL] = { 0 }; + +#define GST_TYPE_SHOUT_PROTOCOL (gst_shout2send_protocol_get_type()) +static GType +gst_shout2send_protocol_get_type (void) +{ + static GType shout2send_protocol_type = 0; + static const GEnumValue shout2send_protocol[] = { + {SHOUT2SEND_PROTOCOL_XAUDIOCAST, + "Xaudiocast Protocol (icecast 1.3.x)", "xaudiocast"}, + {SHOUT2SEND_PROTOCOL_ICY, "Icy Protocol (ShoutCast)", "icy"}, + {SHOUT2SEND_PROTOCOL_HTTP, "Http Protocol (icecast 2.x)", "http"}, + {0, NULL, NULL}, + }; + + if (!shout2send_protocol_type) { + shout2send_protocol_type = + g_enum_register_static ("GstShout2SendProtocol", shout2send_protocol); + } + + + return shout2send_protocol_type; +} + +GType +gst_shout2send_get_type (void) +{ + static GType shout2send_type = 0; + + if (!shout2send_type) { + static const GTypeInfo shout2send_info = { + sizeof (GstShout2sendClass), + (GBaseInitFunc) gst_shout2send_base_init, + NULL, + (GClassInitFunc) gst_shout2send_class_init, + NULL, + NULL, + sizeof (GstShout2send), + 0, + (GInstanceInitFunc) gst_shout2send_init, + }; + + static const GInterfaceInfo tag_setter_info = { + NULL, + NULL, + NULL + }; + + shout2send_type = + g_type_register_static (GST_TYPE_BASE_SINK, "GstShout2send", + &shout2send_info, 0); + + g_type_add_interface_static (shout2send_type, GST_TYPE_TAG_SETTER, + &tag_setter_info); + + } + return shout2send_type; +} + +static void +gst_shout2send_base_init (GstShout2sendClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_set_details_simple (element_class, "Icecast network sink", + "Sink/Network", "Sends data to an icecast server", + "Wim Taymans , " + "Pedro Corte-Real , " + "Zaheer Abbas Merali "); + + GST_DEBUG_CATEGORY_INIT (shout2_debug, "shout2", 0, "shout2send element"); +} + +static void +gst_shout2send_class_init (GstShout2sendClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSinkClass *gstbasesink_class; + + gobject_class = (GObjectClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_shout2send_set_property; + gobject_class->get_property = gst_shout2send_get_property; + gobject_class->finalize = (GObjectFinalizeFunc) gst_shout2send_finalize; + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_IP, + g_param_spec_string ("ip", "ip", "ip", DEFAULT_IP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PORT, + g_param_spec_int ("port", "port", "port", 1, G_MAXUSHORT, DEFAULT_PORT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PASSWORD, + g_param_spec_string ("password", "password", "password", DEFAULT_PASSWORD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_USERNAME, + g_param_spec_string ("username", "username", "username", DEFAULT_USERNAME, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /* metadata */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PUBLIC, + g_param_spec_boolean ("public", "public", + "If the stream should be listed on the server's stream directory", + DEFAULT_PUBLIC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STREAMNAME, + g_param_spec_string ("streamname", "streamname", "name of the stream", + DEFAULT_STREAMNAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DESCRIPTION, + g_param_spec_string ("description", "description", "description", + DEFAULT_DESCRIPTION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GENRE, + g_param_spec_string ("genre", "genre", "genre", DEFAULT_GENRE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PROTOCOL, + g_param_spec_enum ("protocol", "protocol", "Connection Protocol to use", + GST_TYPE_SHOUT_PROTOCOL, DEFAULT_PROTOCOL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + + /* icecast only */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MOUNT, + g_param_spec_string ("mount", "mount", "mount", DEFAULT_MOUNT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_URL, + g_param_spec_string ("url", "url", "url", DEFAULT_URL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /* signals */ + gst_shout2send_signals[SIGNAL_CONNECTION_PROBLEM] = + g_signal_new ("connection-problem", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_CLEANUP, G_STRUCT_OFFSET (GstShout2sendClass, + connection_problem), NULL, NULL, g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); + + gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_shout2send_start); + gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_shout2send_stop); + gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_shout2send_unlock); + gstbasesink_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_shout2send_unlock_stop); + gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_shout2send_render); + gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_shout2send_event); +} + +static void +gst_shout2send_init (GstShout2send * shout2send) +{ + gst_base_sink_set_sync (GST_BASE_SINK (shout2send), FALSE); + + gst_pad_set_setcaps_function (GST_BASE_SINK_PAD (shout2send), + GST_DEBUG_FUNCPTR (gst_shout2send_setcaps)); + + shout2send->timer = gst_poll_new_timer (); + + shout2send->ip = g_strdup (DEFAULT_IP); + shout2send->port = DEFAULT_PORT; + shout2send->password = g_strdup (DEFAULT_PASSWORD); + shout2send->username = g_strdup (DEFAULT_USERNAME); + shout2send->streamname = g_strdup (DEFAULT_STREAMNAME); + shout2send->description = g_strdup (DEFAULT_DESCRIPTION); + shout2send->genre = g_strdup (DEFAULT_GENRE); + shout2send->mount = g_strdup (DEFAULT_MOUNT); + shout2send->url = g_strdup (DEFAULT_URL); + shout2send->protocol = DEFAULT_PROTOCOL; + shout2send->ispublic = DEFAULT_PUBLIC; + + shout2send->tags = gst_tag_list_new (); + shout2send->conn = NULL; + shout2send->audio_format = SHOUT_FORMAT_VORBIS; + shout2send->connected = FALSE; + shout2send->songmetadata = NULL; + shout2send->songartist = NULL; + shout2send->songtitle = NULL; +} + +static void +gst_shout2send_finalize (GstShout2send * shout2send) +{ + g_free (shout2send->ip); + g_free (shout2send->password); + g_free (shout2send->username); + g_free (shout2send->streamname); + g_free (shout2send->description); + g_free (shout2send->genre); + g_free (shout2send->mount); + g_free (shout2send->url); + + gst_tag_list_free (shout2send->tags); + + gst_poll_free (shout2send->timer); + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (shout2send)); +} + +static void +set_shout_metadata (const GstTagList * list, const gchar * tag, + gpointer user_data) +{ + GstShout2send *shout2send = (GstShout2send *) user_data; + char **shout_metadata = &(shout2send->songmetadata); + char **song_artist = &(shout2send->songartist); + char **song_title = &(shout2send->songtitle); + + gchar *value; + + GST_DEBUG ("tag: %s being added", tag); + if (strcmp (tag, GST_TAG_ARTIST) == 0) { + if (gst_tag_get_type (tag) == G_TYPE_STRING) { + if (!gst_tag_list_get_string (list, tag, &value)) { + GST_DEBUG ("Error reading \"%s\" tag value", tag); + return; + } + + if (*song_artist != NULL) + g_free (*song_artist); + + *song_artist = g_strdup (value); + } + } else if (strcmp (tag, GST_TAG_TITLE) == 0) { + if (gst_tag_get_type (tag) == G_TYPE_STRING) { + if (!gst_tag_list_get_string (list, tag, &value)) { + GST_DEBUG ("Error reading \"%s\" tag value", tag); + return; + } + + if (*song_title != NULL) + g_free (*song_title); + + *song_title = g_strdup (value); + } + } + + if (*shout_metadata != NULL) + g_free (*shout_metadata); + + + if (*song_title && *song_artist) { + *shout_metadata = g_strdup_printf ("%s - %s", *song_artist, *song_title); + } else if (*song_title && *song_artist == NULL) { + *shout_metadata = g_strdup_printf ("Unknown - %s", *song_title); + } else if (*song_title == NULL && *song_artist) { + *shout_metadata = g_strdup_printf ("%s - Unknown", *song_artist); + } else { + *shout_metadata = g_strdup_printf ("Unknown - Unknown"); + } + + GST_LOG ("shout metadata is now: %s", *shout_metadata); +} + +#if 0 +static void +gst_shout2send_set_metadata (GstShout2send * shout2send) +{ + const GstTagList *user_tags; + GstTagList *copy; + char *tempmetadata; + shout_metadata_t *pmetadata; + + g_return_if_fail (shout2send != NULL); + user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (shout2send)); + if ((shout2send->tags == NULL) && (user_tags == NULL)) { + return; + } + copy = gst_tag_list_merge (user_tags, shout2send->tags, + gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (shout2send))); + /* lets get the artist and song tags */ + tempmetadata = NULL; + gst_tag_list_foreach ((GstTagList *) copy, set_shout_metadata, + (gpointer) & tempmetadata); + if (tempmetadata) { + pmetadata = shout_metadata_new (); + shout_metadata_add (pmetadata, "song", tempmetadata); + shout_set_metadata (shout2send->conn, pmetadata); + shout_metadata_free (pmetadata); + } + + gst_tag_list_free (copy); +} +#endif + + +static gboolean +gst_shout2send_event (GstBaseSink * sink, GstEvent * event) +{ + GstShout2send *shout2send; + gboolean ret = TRUE; + + shout2send = GST_SHOUT2SEND (sink); + + GST_LOG_OBJECT (shout2send, "got %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG:{ + /* vorbis audio doesnt need metadata setting on the icecast level, only mp3 */ + if (shout2send->tags && shout2send->audio_format == SHOUT_FORMAT_MP3) { + GstTagList *list; + + gst_event_parse_tag (event, &list); + GST_DEBUG_OBJECT (shout2send, "tags=%" GST_PTR_FORMAT, list); + gst_tag_list_insert (shout2send->tags, + list, + gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (shout2send))); + /* lets get the artist and song tags */ + gst_tag_list_foreach ((GstTagList *) list, + set_shout_metadata, shout2send); + if (shout2send->songmetadata && shout2send->connected) { + shout_metadata_t *pmetadata; + + GST_DEBUG_OBJECT (shout2send, "metadata now: %s", + shout2send->songmetadata); + + pmetadata = shout_metadata_new (); + shout_metadata_add (pmetadata, "song", shout2send->songmetadata); + shout_set_metadata (shout2send->conn, pmetadata); + shout_metadata_free (pmetadata); + } + } + break; + } + default:{ + GST_LOG_OBJECT (shout2send, "let base class handle event"); + if (GST_BASE_SINK_CLASS (parent_class)->event) { + event = gst_event_ref (event); + ret = GST_BASE_SINK_CLASS (parent_class)->event (sink, event); + } + break; + } + } + + return ret; +} + +static gboolean +gst_shout2send_start (GstBaseSink * basesink) +{ + GstShout2send *sink = GST_SHOUT2SEND (basesink); + const gchar *cur_prop; + gshort proto = 3; + gchar *version_string; + + GST_DEBUG_OBJECT (sink, "starting"); + + sink->conn = shout_new (); + + switch (sink->protocol) { + case SHOUT2SEND_PROTOCOL_XAUDIOCAST: + proto = SHOUT_PROTOCOL_XAUDIOCAST; + break; + case SHOUT2SEND_PROTOCOL_ICY: + proto = SHOUT_PROTOCOL_ICY; + break; + case SHOUT2SEND_PROTOCOL_HTTP: + proto = SHOUT_PROTOCOL_HTTP; + break; + } + + cur_prop = "protocol"; + GST_DEBUG_OBJECT (sink, "setting protocol: %d", sink->protocol); + if (shout_set_protocol (sink->conn, proto) != SHOUTERR_SUCCESS) + goto set_failed; + + /* --- FIXME: shout requires an ip, and fails if it is given a host. */ + /* may want to put convert_to_ip(shout2send->ip) here */ + cur_prop = "ip"; + GST_DEBUG_OBJECT (sink, "setting ip: %s", sink->ip); + if (shout_set_host (sink->conn, sink->ip) != SHOUTERR_SUCCESS) + goto set_failed; + + cur_prop = "port"; + GST_DEBUG_OBJECT (sink, "setting port: %u", sink->port); + if (shout_set_port (sink->conn, sink->port) != SHOUTERR_SUCCESS) + goto set_failed; + + cur_prop = "password"; + GST_DEBUG_OBJECT (sink, "setting password: %s", sink->password); + if (shout_set_password (sink->conn, sink->password) != SHOUTERR_SUCCESS) + goto set_failed; + + cur_prop = "public"; + GST_DEBUG_OBJECT (sink, "setting %s: %u", cur_prop, sink->ispublic); + if (shout_set_public (sink->conn, + (sink->ispublic ? 1 : 0)) != SHOUTERR_SUCCESS) + goto set_failed; + + cur_prop = "streamname"; + GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, sink->streamname); + if (shout_set_name (sink->conn, sink->streamname) != SHOUTERR_SUCCESS) + goto set_failed; + + cur_prop = "description"; + GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, sink->description); + if (shout_set_description (sink->conn, sink->description) != SHOUTERR_SUCCESS) + goto set_failed; + + cur_prop = "genre"; + GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, sink->genre); + if (shout_set_genre (sink->conn, sink->genre) != SHOUTERR_SUCCESS) + goto set_failed; + + cur_prop = "mount"; + GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, sink->mount); + if (shout_set_mount (sink->conn, sink->mount) != SHOUTERR_SUCCESS) + goto set_failed; + + cur_prop = "username"; + GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, "source"); + if (shout_set_user (sink->conn, sink->username) != SHOUTERR_SUCCESS) + goto set_failed; + + version_string = gst_version_string (); + cur_prop = "agent"; + GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, version_string); + if (shout_set_agent (sink->conn, version_string) != SHOUTERR_SUCCESS) { + g_free (version_string); + goto set_failed; + } + + g_free (version_string); + return TRUE; + +/* ERROR */ +set_failed: + { + GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), + ("Error setting %s: %s", cur_prop, shout_get_error (sink->conn))); + return FALSE; + } +} + +static gboolean +gst_shout2send_connect (GstShout2send * sink) +{ + const char *format = + (sink->audio_format == SHOUT_FORMAT_VORBIS) ? "vorbis" : + ((sink->audio_format == SHOUT_FORMAT_MP3) ? "mp3" : "unknown"); +#ifdef SHOUT_FORMAT_WEBM + if (sink->audio_format == SHOUT_FORMAT_WEBM) + format = "webm"; +#endif + GST_DEBUG_OBJECT (sink, "Connection format is: %s", format); + + if (shout_set_format (sink->conn, sink->audio_format) != SHOUTERR_SUCCESS) + goto could_not_set_format; + + if (shout_open (sink->conn) != SHOUTERR_SUCCESS) + goto could_not_connect; + + GST_DEBUG_OBJECT (sink, "connected to server"); + sink->connected = TRUE; + + /* let's set metadata */ + if (sink->songmetadata) { + shout_metadata_t *pmetadata; + + GST_DEBUG_OBJECT (sink, "shout metadata now: %s", sink->songmetadata); + pmetadata = shout_metadata_new (); + shout_metadata_add (pmetadata, "song", sink->songmetadata); + shout_set_metadata (sink->conn, pmetadata); + shout_metadata_free (pmetadata); + } + + return TRUE; + +/* ERRORS */ +could_not_set_format: + { + GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), + ("Error setting connection format: %s", shout_get_error (sink->conn))); + return FALSE; + } + +could_not_connect: + { + GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, + (_("Could not connect to server")), + ("shout_open() failed: err=%s", shout_get_error (sink->conn))); + g_signal_emit (sink, gst_shout2send_signals[SIGNAL_CONNECTION_PROBLEM], 0, + shout_get_errno (sink->conn)); + return FALSE; + } +} + +static gboolean +gst_shout2send_stop (GstBaseSink * basesink) +{ + GstShout2send *sink = GST_SHOUT2SEND (basesink); + + if (sink->conn) { + if (sink->connected) + shout_close (sink->conn); + shout_free (sink->conn); + sink->conn = NULL; + } + + if (sink->songmetadata) { + g_free (sink->songmetadata); + sink->songmetadata = NULL; + } + + sink->connected = FALSE; + + return TRUE; +} + +static gboolean +gst_shout2send_unlock (GstBaseSink * basesink) +{ + GstShout2send *sink; + + sink = GST_SHOUT2SEND (basesink); + + GST_DEBUG_OBJECT (basesink, "unlock"); + gst_poll_set_flushing (sink->timer, TRUE); + + return TRUE; +} + +static gboolean +gst_shout2send_unlock_stop (GstBaseSink * basesink) +{ + GstShout2send *sink; + + sink = GST_SHOUT2SEND (basesink); + + GST_DEBUG_OBJECT (basesink, "unlock_stop"); + gst_poll_set_flushing (sink->timer, FALSE); + + return TRUE; +} + +static GstFlowReturn +gst_shout2send_render (GstBaseSink * basesink, GstBuffer * buf) +{ + GstShout2send *sink; + glong ret; + gint delay; + GstFlowReturn fret; + + sink = GST_SHOUT2SEND (basesink); + + /* presumably we connect here because we need to know the format before + * we can set up the connection, which we don't know yet in _start() */ + if (!sink->connected) { + if (!gst_shout2send_connect (sink)) + return GST_FLOW_ERROR; + } + + delay = shout_delay (sink->conn); + + if (delay > 0) { + GST_LOG_OBJECT (sink, "waiting %d msec", delay); + if (gst_poll_wait (sink->timer, GST_MSECOND * delay) == -1) { + GST_LOG_OBJECT (sink, "unlocked"); + + fret = gst_base_sink_wait_preroll (basesink); + if (fret != GST_FLOW_OK) + return fret; + } + } else { + GST_LOG_OBJECT (sink, "we're %d msec late", -delay); + } + + GST_LOG_OBJECT (sink, "sending %u bytes of data", GST_BUFFER_SIZE (buf)); + ret = shout_send (sink->conn, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + if (ret != SHOUTERR_SUCCESS) + goto send_error; + + return GST_FLOW_OK; + +/* ERRORS */ +send_error: + { + GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, (NULL), + ("shout_send() failed: %s", shout_get_error (sink->conn))); + g_signal_emit (sink, gst_shout2send_signals[SIGNAL_CONNECTION_PROBLEM], 0, + shout_get_errno (sink->conn)); + return GST_FLOW_ERROR; + } +} + +static void +gst_shout2send_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstShout2send *shout2send; + + shout2send = GST_SHOUT2SEND (object); + switch (prop_id) { + + case ARG_IP: + if (shout2send->ip) + g_free (shout2send->ip); + shout2send->ip = g_strdup (g_value_get_string (value)); + break; + case ARG_PORT: + shout2send->port = g_value_get_int (value); + break; + case ARG_PASSWORD: + if (shout2send->password) + g_free (shout2send->password); + shout2send->password = g_strdup (g_value_get_string (value)); + break; + case ARG_USERNAME: + if (shout2send->username) + g_free (shout2send->username); + shout2send->username = g_strdup (g_value_get_string (value)); + break; + case ARG_PUBLIC: + shout2send->ispublic = g_value_get_boolean (value); + break; + case ARG_STREAMNAME: /* Name of the stream */ + if (shout2send->streamname) + g_free (shout2send->streamname); + shout2send->streamname = g_strdup (g_value_get_string (value)); + break; + case ARG_DESCRIPTION: /* Description of the stream */ + if (shout2send->description) + g_free (shout2send->description); + shout2send->description = g_strdup (g_value_get_string (value)); + break; + case ARG_GENRE: /* Genre of the stream */ + if (shout2send->genre) + g_free (shout2send->genre); + shout2send->genre = g_strdup (g_value_get_string (value)); + break; + case ARG_PROTOCOL: /* protocol to connect with */ + shout2send->protocol = g_value_get_enum (value); + break; + case ARG_MOUNT: /* mountpoint of stream (icecast only) */ + if (shout2send->mount) + g_free (shout2send->mount); + shout2send->mount = g_strdup (g_value_get_string (value)); + break; + case ARG_URL: /* Url of the stream (I'm guessing) */ + if (shout2send->url) + g_free (shout2send->url); + shout2send->url = g_strdup (g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_shout2send_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstShout2send *shout2send; + + shout2send = GST_SHOUT2SEND (object); + switch (prop_id) { + + case ARG_IP: + g_value_set_string (value, shout2send->ip); + break; + case ARG_PORT: + g_value_set_int (value, shout2send->port); + break; + case ARG_PASSWORD: + g_value_set_string (value, shout2send->password); + break; + case ARG_USERNAME: + g_value_set_string (value, shout2send->username); + break; + case ARG_PUBLIC: + g_value_set_boolean (value, shout2send->ispublic); + break; + case ARG_STREAMNAME: /* Name of the stream */ + g_value_set_string (value, shout2send->streamname); + break; + case ARG_DESCRIPTION: /* Description of the stream */ + g_value_set_string (value, shout2send->description); + break; + case ARG_GENRE: /* Genre of the stream */ + g_value_set_string (value, shout2send->genre); + break; + case ARG_PROTOCOL: /* protocol to connect with */ + g_value_set_enum (value, shout2send->protocol); + break; + case ARG_MOUNT: /* mountpoint of stream (icecast only) */ + g_value_set_string (value, shout2send->mount); + break; + case ARG_URL: /* Url of stream (I'm guessing) */ + g_value_set_string (value, shout2send->url); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_shout2send_setcaps (GstPad * pad, GstCaps * caps) +{ + const gchar *mimetype; + GstShout2send *shout2send; + gboolean ret = TRUE; + + shout2send = GST_SHOUT2SEND (GST_OBJECT_PARENT (pad)); + + mimetype = gst_structure_get_name (gst_caps_get_structure (caps, 0)); + + GST_DEBUG_OBJECT (shout2send, "mimetype of caps given is: %s", mimetype); + + if (!strcmp (mimetype, "audio/mpeg")) { + shout2send->audio_format = SHOUT_FORMAT_MP3; + } else if (!strcmp (mimetype, "application/ogg")) { + shout2send->audio_format = SHOUT_FORMAT_VORBIS; +#ifdef SHOUT_FORMAT_WEBM + } else if (!strcmp (mimetype, "video/webm")) { + shout2send->audio_format = SHOUT_FORMAT_WEBM; +#endif + } else { + ret = FALSE; + } + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + + return gst_element_register (plugin, "shout2send", GST_RANK_NONE, + GST_TYPE_SHOUT2SEND); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "shout2send", + "Sends data to an icecast server using libshout2", + plugin_init, + VERSION, "LGPL", "libshout2", "http://www.icecast.org/download.html") diff --git a/ext/shout2/gstshout2.h b/ext/shout2/gstshout2.h new file mode 100644 index 0000000..1e3cd5b --- /dev/null +++ b/ext/shout2/gstshout2.h @@ -0,0 +1,97 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_SHOUT2SEND_H__ +#define __GST_SHOUT2SEND_H__ + +#include +#include +#include + +G_BEGIN_DECLS + + /* Protocol type enum */ +typedef enum { + SHOUT2SEND_PROTOCOL_XAUDIOCAST = 1, + SHOUT2SEND_PROTOCOL_ICY, + SHOUT2SEND_PROTOCOL_HTTP +} GstShout2SendProtocol; + + +/* Definition of structure storing data for this element. */ +typedef struct _GstShout2send GstShout2send; +struct _GstShout2send { + GstBaseSink parent; + + GstShout2SendProtocol protocol; + + GstPoll *timer; + + shout_t *conn; + + gchar *ip; + guint port; + gchar *password; + gchar *username; + gchar *streamname; + gchar *description; + gchar *genre; + gchar *mount; + gchar *url; + gboolean connected; + gboolean ispublic; + gchar *songmetadata; + gchar *songartist; + gchar *songtitle; + guint16 audio_format; + + GstTagList* tags; +}; + + + +/* Standard definition defining a class for this element. */ +typedef struct _GstShout2sendClass GstShout2sendClass; +struct _GstShout2sendClass { + GstBaseSinkClass parent_class; + + /* signal callbacks */ + void (*connection_problem) (GstElement *element,guint errno); +}; + +/* Standard macros for defining types for this element. */ +#define GST_TYPE_SHOUT2SEND \ + (gst_shout2send_get_type()) +#define GST_SHOUT2SEND(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SHOUT2SEND,GstShout2send)) +#define GST_SHOUT2SEND_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SHOUT2SEND,GstShout2sendClass)) +#define GST_IS_SHOUT2SEND(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SHOUT2SEND)) +#define GST_IS_SHOUT2SEND_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SHOUT2SEND)) + +/* Standard function returning type information. */ +GType gst_shout2send_get_type(void); + + +G_END_DECLS + +#endif /* __GST_SHOUT2SEND_H__ */ diff --git a/ext/soup/Makefile.am b/ext/soup/Makefile.am new file mode 100644 index 0000000..6916b17 --- /dev/null +++ b/ext/soup/Makefile.am @@ -0,0 +1,10 @@ +plugin_LTLIBRARIES = libgstsouphttpsrc.la + +libgstsouphttpsrc_la_SOURCES = gstsouphttpsrc.c gstsouphttpclientsink.c gstsoup.c + +libgstsouphttpsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SOUP_CFLAGS) +libgstsouphttpsrc_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(SOUP_LIBS) +libgstsouphttpsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstsouphttpsrc_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstsouphttpsrc.h gstsouphttpclientsink.h diff --git a/ext/soup/Makefile.in b/ext/soup/Makefile.in new file mode 100644 index 0000000..bbb13ad --- /dev/null +++ b/ext/soup/Makefile.in @@ -0,0 +1,824 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/soup +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstsouphttpsrc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstsouphttpsrc_la_OBJECTS = \ + libgstsouphttpsrc_la-gstsouphttpsrc.lo \ + libgstsouphttpsrc_la-gstsouphttpclientsink.lo \ + libgstsouphttpsrc_la-gstsoup.lo +libgstsouphttpsrc_la_OBJECTS = $(am_libgstsouphttpsrc_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstsouphttpsrc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) \ + $(libgstsouphttpsrc_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstsouphttpsrc_la_SOURCES) +DIST_SOURCES = $(libgstsouphttpsrc_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstsouphttpsrc.la +libgstsouphttpsrc_la_SOURCES = gstsouphttpsrc.c gstsouphttpclientsink.c gstsoup.c +libgstsouphttpsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SOUP_CFLAGS) +libgstsouphttpsrc_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(SOUP_LIBS) +libgstsouphttpsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstsouphttpsrc_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstsouphttpsrc.h gstsouphttpclientsink.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/soup/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/soup/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstsouphttpsrc.la: $(libgstsouphttpsrc_la_OBJECTS) $(libgstsouphttpsrc_la_DEPENDENCIES) $(EXTRA_libgstsouphttpsrc_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstsouphttpsrc_la_LINK) -rpath $(plugindir) $(libgstsouphttpsrc_la_OBJECTS) $(libgstsouphttpsrc_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsouphttpsrc_la-gstsoup.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpclientsink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpsrc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstsouphttpsrc_la-gstsouphttpsrc.lo: gstsouphttpsrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -MT libgstsouphttpsrc_la-gstsouphttpsrc.lo -MD -MP -MF $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpsrc.Tpo -c -o libgstsouphttpsrc_la-gstsouphttpsrc.lo `test -f 'gstsouphttpsrc.c' || echo '$(srcdir)/'`gstsouphttpsrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpsrc.Tpo $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpsrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsouphttpsrc.c' object='libgstsouphttpsrc_la-gstsouphttpsrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -c -o libgstsouphttpsrc_la-gstsouphttpsrc.lo `test -f 'gstsouphttpsrc.c' || echo '$(srcdir)/'`gstsouphttpsrc.c + +libgstsouphttpsrc_la-gstsouphttpclientsink.lo: gstsouphttpclientsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -MT libgstsouphttpsrc_la-gstsouphttpclientsink.lo -MD -MP -MF $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpclientsink.Tpo -c -o libgstsouphttpsrc_la-gstsouphttpclientsink.lo `test -f 'gstsouphttpclientsink.c' || echo '$(srcdir)/'`gstsouphttpclientsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpclientsink.Tpo $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpclientsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsouphttpclientsink.c' object='libgstsouphttpsrc_la-gstsouphttpclientsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -c -o libgstsouphttpsrc_la-gstsouphttpclientsink.lo `test -f 'gstsouphttpclientsink.c' || echo '$(srcdir)/'`gstsouphttpclientsink.c + +libgstsouphttpsrc_la-gstsoup.lo: gstsoup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -MT libgstsouphttpsrc_la-gstsoup.lo -MD -MP -MF $(DEPDIR)/libgstsouphttpsrc_la-gstsoup.Tpo -c -o libgstsouphttpsrc_la-gstsoup.lo `test -f 'gstsoup.c' || echo '$(srcdir)/'`gstsoup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsouphttpsrc_la-gstsoup.Tpo $(DEPDIR)/libgstsouphttpsrc_la-gstsoup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsoup.c' object='libgstsouphttpsrc_la-gstsoup.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -c -o libgstsouphttpsrc_la-gstsoup.lo `test -f 'gstsoup.c' || echo '$(srcdir)/'`gstsoup.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/soup/gstsoup.c b/ext/soup/gstsoup.c new file mode 100644 index 0000000..de71df8 --- /dev/null +++ b/ext/soup/gstsoup.c @@ -0,0 +1,47 @@ +/* GStreamer + * Copyright (C) 2007-2008 Wouter Cloetens + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstsouphttpsrc.h" +#include "gstsouphttpclientsink.h" + + +static gboolean +plugin_init (GstPlugin * plugin) +{ +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif + + gst_element_register (plugin, "souphttpsrc", GST_RANK_PRIMARY, + GST_TYPE_SOUP_HTTP_SRC); + gst_element_register (plugin, "souphttpclientsink", GST_RANK_NONE, + GST_TYPE_SOUP_HTTP_CLIENT_SINK); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "soup", + "libsoup HTTP client src/sink", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/soup/gstsouphttpclientsink.c b/ext/soup/gstsouphttpclientsink.c new file mode 100644 index 0000000..dc9e941 --- /dev/null +++ b/ext/soup/gstsouphttpclientsink.c @@ -0,0 +1,765 @@ +/* GStreamer + * Copyright (C) 2011 David Schleef + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Suite 500, + * Boston, MA 02110-1335, USA. + */ +/** + * SECTION:element-gstsouphttpclientsink + * + * The souphttpclientsink element sends pipeline data to an HTTP server + * using HTTP PUT commands. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc num-buffers=300 ! theoraenc ! oggmux ! + * souphttpclientsink location=http://server/filename.ogv + * ]| + * + * This example encodes 10 seconds of video and sends it to the HTTP + * server "server" using HTTP PUT commands. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "gstsouphttpclientsink.h" + +#include + +GST_DEBUG_CATEGORY_STATIC (souphttpclientsink_dbg); +#define GST_CAT_DEFAULT souphttpclientsink_dbg + +/* prototypes */ + + +static void gst_soup_http_client_sink_set_property (GObject * object, + guint property_id, const GValue * value, GParamSpec * pspec); +static void gst_soup_http_client_sink_get_property (GObject * object, + guint property_id, GValue * value, GParamSpec * pspec); +static void gst_soup_http_client_sink_dispose (GObject * object); +static void gst_soup_http_client_sink_finalize (GObject * object); + +static gboolean gst_soup_http_client_sink_set_caps (GstBaseSink * sink, + GstCaps * caps); +static void gst_soup_http_client_sink_get_times (GstBaseSink * sink, + GstBuffer * buffer, GstClockTime * start, GstClockTime * end); +static gboolean gst_soup_http_client_sink_start (GstBaseSink * sink); +static gboolean gst_soup_http_client_sink_stop (GstBaseSink * sink); +static gboolean gst_soup_http_client_sink_unlock (GstBaseSink * sink); +static gboolean gst_soup_http_client_sink_event (GstBaseSink * sink, + GstEvent * event); +static GstFlowReturn gst_soup_http_client_sink_preroll (GstBaseSink * sink, + GstBuffer * buffer); +static GstFlowReturn gst_soup_http_client_sink_render (GstBaseSink * sink, + GstBuffer * buffer); + +static void free_buffer_list (GList * list); +static void gst_soup_http_client_sink_reset (GstSoupHttpClientSink * + souphttpsink); +static void authenticate (SoupSession * session, SoupMessage * msg, + SoupAuth * auth, gboolean retrying, gpointer user_data); +static void callback (SoupSession * session, SoupMessage * msg, + gpointer user_data); +static gboolean gst_soup_http_client_sink_set_proxy (GstSoupHttpClientSink * + souphttpsink, const gchar * uri); + +enum +{ + PROP_0, + PROP_LOCATION, + PROP_USER_AGENT, + PROP_AUTOMATIC_REDIRECT, + PROP_PROXY, + PROP_USER_ID, + PROP_USER_PW, + PROP_PROXY_ID, + PROP_PROXY_PW, + PROP_COOKIES, + PROP_SESSION +}; + +#define DEFAULT_USER_AGENT "GStreamer souphttpclientsink " + +/* pad templates */ + +static GstStaticPadTemplate gst_soup_http_client_sink_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + +/* class initialization */ + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (souphttpclientsink_dbg, "souphttpclientsink", 0, \ + "souphttpclientsink element"); + +GST_BOILERPLATE_FULL (GstSoupHttpClientSink, gst_soup_http_client_sink, + GstBaseSink, GST_TYPE_BASE_SINK, DEBUG_INIT); + +static void +gst_soup_http_client_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_soup_http_client_sink_sink_template); + + gst_element_class_set_details_simple (element_class, "HTTP client sink", + "Generic", "Sends streams to HTTP server via PUT", + "David Schleef "); +} + +static void +gst_soup_http_client_sink_class_init (GstSoupHttpClientSinkClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstBaseSinkClass *base_sink_class = GST_BASE_SINK_CLASS (klass); + + gobject_class->set_property = gst_soup_http_client_sink_set_property; + gobject_class->get_property = gst_soup_http_client_sink_get_property; + gobject_class->dispose = gst_soup_http_client_sink_dispose; + gobject_class->finalize = gst_soup_http_client_sink_finalize; + base_sink_class->set_caps = + GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_set_caps); + if (0) + base_sink_class->get_times = + GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_get_times); + base_sink_class->start = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_start); + base_sink_class->stop = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_stop); + base_sink_class->unlock = + GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_unlock); + base_sink_class->event = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_event); + if (0) + base_sink_class->preroll = + GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_preroll); + base_sink_class->render = + GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_render); + + g_object_class_install_property (gobject_class, + PROP_LOCATION, + g_param_spec_string ("location", "Location", + "URI to send to", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_USER_AGENT, + g_param_spec_string ("user-agent", "User-Agent", + "Value of the User-Agent HTTP request header field", + DEFAULT_USER_AGENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_AUTOMATIC_REDIRECT, + g_param_spec_boolean ("automatic-redirect", "automatic-redirect", + "Automatically follow HTTP redirects (HTTP Status Code 3xx)", + TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_PROXY, + g_param_spec_string ("proxy", "Proxy", + "HTTP proxy server URI", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_USER_ID, + g_param_spec_string ("user-id", "user-id", + "user id for authentication", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_USER_PW, + g_param_spec_string ("user-pw", "user-pw", + "user password for authentication", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROXY_ID, + g_param_spec_string ("proxy-id", "proxy-id", + "user id for proxy authentication", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROXY_PW, + g_param_spec_string ("proxy-pw", "proxy-pw", + "user password for proxy authentication", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SESSION, + g_param_spec_object ("session", "session", + "SoupSession object to use for communication", + SOUP_TYPE_SESSION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_COOKIES, + g_param_spec_boxed ("cookies", "Cookies", "HTTP request cookies", + G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + +} + +static void +gst_soup_http_client_sink_init (GstSoupHttpClientSink * souphttpsink, + GstSoupHttpClientSinkClass * souphttpsink_class) +{ + const char *proxy; + + souphttpsink->mutex = g_mutex_new (); + souphttpsink->cond = g_cond_new (); + + souphttpsink->location = NULL; + souphttpsink->automatic_redirect = TRUE; + souphttpsink->user_agent = g_strdup (DEFAULT_USER_AGENT); + souphttpsink->user_id = NULL; + souphttpsink->user_pw = NULL; + souphttpsink->proxy_id = NULL; + souphttpsink->proxy_pw = NULL; + souphttpsink->prop_session = NULL; + souphttpsink->timeout = 1; + proxy = g_getenv ("http_proxy"); + if (proxy && !gst_soup_http_client_sink_set_proxy (souphttpsink, proxy)) { + GST_WARNING_OBJECT (souphttpsink, + "The proxy in the http_proxy env var (\"%s\") cannot be parsed.", + proxy); + } + + gst_soup_http_client_sink_reset (souphttpsink); +} + +static void +gst_soup_http_client_sink_reset (GstSoupHttpClientSink * souphttpsink) +{ + g_free (souphttpsink->reason_phrase); + souphttpsink->reason_phrase = NULL; + souphttpsink->status_code = 0; + souphttpsink->offset = 0; + +} + +static gboolean +gst_soup_http_client_sink_set_proxy (GstSoupHttpClientSink * souphttpsink, + const gchar * uri) +{ + if (souphttpsink->proxy) { + soup_uri_free (souphttpsink->proxy); + souphttpsink->proxy = NULL; + } + if (g_str_has_prefix (uri, "http://")) { + souphttpsink->proxy = soup_uri_new (uri); + } else { + gchar *new_uri = g_strconcat ("http://", uri, NULL); + + souphttpsink->proxy = soup_uri_new (new_uri); + g_free (new_uri); + } + + return TRUE; +} + +void +gst_soup_http_client_sink_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (object); + + g_mutex_lock (souphttpsink->mutex); + switch (property_id) { + case PROP_SESSION: + if (souphttpsink->prop_session) { + g_object_unref (souphttpsink->prop_session); + } + souphttpsink->prop_session = g_value_dup_object (value); + break; + case PROP_LOCATION: + g_free (souphttpsink->location); + souphttpsink->location = g_value_dup_string (value); + souphttpsink->offset = 0; + break; + case PROP_USER_AGENT: + g_free (souphttpsink->user_agent); + souphttpsink->user_agent = g_value_dup_string (value); + break; + case PROP_AUTOMATIC_REDIRECT: + souphttpsink->automatic_redirect = g_value_get_boolean (value); + break; + case PROP_USER_ID: + g_free (souphttpsink->user_id); + souphttpsink->user_id = g_value_dup_string (value); + break; + case PROP_USER_PW: + g_free (souphttpsink->user_pw); + souphttpsink->user_pw = g_value_dup_string (value); + break; + case PROP_PROXY_ID: + g_free (souphttpsink->proxy_id); + souphttpsink->proxy_id = g_value_dup_string (value); + break; + case PROP_PROXY_PW: + g_free (souphttpsink->proxy_pw); + souphttpsink->proxy_pw = g_value_dup_string (value); + break; + case PROP_PROXY: + { + const gchar *proxy; + + proxy = g_value_get_string (value); + + if (proxy == NULL) { + GST_WARNING ("proxy property cannot be NULL"); + goto done; + } + if (!gst_soup_http_client_sink_set_proxy (souphttpsink, proxy)) { + GST_WARNING ("badly formatted proxy URI"); + goto done; + } + break; + } + case PROP_COOKIES: + g_strfreev (souphttpsink->cookies); + souphttpsink->cookies = g_strdupv (g_value_get_boxed (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +done: + g_mutex_unlock (souphttpsink->mutex); +} + +void +gst_soup_http_client_sink_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (object); + + switch (property_id) { + case PROP_SESSION: + g_value_set_object (value, souphttpsink->prop_session); + break; + case PROP_LOCATION: + g_value_set_string (value, souphttpsink->location); + break; + case PROP_AUTOMATIC_REDIRECT: + g_value_set_boolean (value, souphttpsink->automatic_redirect); + break; + case PROP_USER_AGENT: + g_value_set_string (value, souphttpsink->user_agent); + break; + case PROP_USER_ID: + g_value_set_string (value, souphttpsink->user_id); + break; + case PROP_USER_PW: + g_value_set_string (value, souphttpsink->user_pw); + break; + case PROP_PROXY_ID: + g_value_set_string (value, souphttpsink->proxy_id); + break; + case PROP_PROXY_PW: + g_value_set_string (value, souphttpsink->proxy_pw); + break; + case PROP_PROXY: + if (souphttpsink->proxy == NULL) + g_value_set_static_string (value, ""); + else { + char *proxy = soup_uri_to_string (souphttpsink->proxy, FALSE); + + g_value_set_string (value, proxy); + g_free (proxy); + } + break; + case PROP_COOKIES: + g_value_set_boxed (value, g_strdupv (souphttpsink->cookies)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +void +gst_soup_http_client_sink_dispose (GObject * object) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (object); + + /* clean up as possible. may be called multiple times */ + if (souphttpsink->prop_session) + g_object_unref (souphttpsink->prop_session); + souphttpsink->prop_session = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +void +gst_soup_http_client_sink_finalize (GObject * object) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (object); + + /* clean up object here */ + + g_free (souphttpsink->user_agent); + g_free (souphttpsink->user_id); + g_free (souphttpsink->user_pw); + g_free (souphttpsink->proxy_id); + g_free (souphttpsink->proxy_pw); + if (souphttpsink->proxy) + soup_uri_free (souphttpsink->proxy); + g_free (souphttpsink->location); + + g_cond_free (souphttpsink->cond); + g_mutex_free (souphttpsink->mutex); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + + +static gboolean +gst_soup_http_client_sink_set_caps (GstBaseSink * sink, GstCaps * caps) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); + GstStructure *structure; + const GValue *value_array; + int i, n; + + structure = gst_caps_get_structure (caps, 0); + value_array = gst_structure_get_value (structure, "streamheader"); + if (value_array) { + free_buffer_list (souphttpsink->streamheader_buffers); + souphttpsink->streamheader_buffers = NULL; + + n = gst_value_array_get_size (value_array); + for (i = 0; i < n; i++) { + const GValue *value; + GstBuffer *buffer; + value = gst_value_array_get_value (value_array, i); + buffer = GST_BUFFER (gst_value_get_buffer (value)); + souphttpsink->streamheader_buffers = + g_list_append (souphttpsink->streamheader_buffers, + gst_buffer_ref (buffer)); + } + } + + return TRUE; +} + +static void +gst_soup_http_client_sink_get_times (GstBaseSink * sink, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end) +{ + +} + +static gboolean +thread_ready_idle_cb (gpointer data) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (data); + + GST_LOG_OBJECT (souphttpsink, "thread ready"); + + g_mutex_lock (souphttpsink->mutex); + g_cond_signal (souphttpsink->cond); + g_mutex_unlock (souphttpsink->mutex); + + return FALSE; /* only run once */ +} + +static gpointer +thread_func (gpointer ptr) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (ptr); + + GST_DEBUG ("thread start"); + + g_main_loop_run (souphttpsink->loop); + + GST_DEBUG ("thread quit"); + + return NULL; +} + +static gboolean +gst_soup_http_client_sink_start (GstBaseSink * sink) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); + + if (souphttpsink->prop_session) { + souphttpsink->session = souphttpsink->prop_session; + } else { + GSource *source; + GError *error = NULL; + + souphttpsink->context = g_main_context_new (); + + /* set up idle source to signal when the main loop is running and + * it's safe for ::stop() to call g_main_loop_quit() */ + source = g_idle_source_new (); + g_source_set_callback (source, thread_ready_idle_cb, sink, NULL); + g_source_attach (source, souphttpsink->context); + g_source_unref (source); + + souphttpsink->loop = g_main_loop_new (souphttpsink->context, TRUE); + + g_mutex_lock (souphttpsink->mutex); + + /* FIXME: error handling */ +#if !GLIB_CHECK_VERSION (2, 31, 0) + souphttpsink->thread = g_thread_create (thread_func, souphttpsink, + TRUE, &error); +#else + souphttpsink->thread = g_thread_try_new ("souphttpclientsink-thread", + thread_func, souphttpsink, &error); +#endif + + GST_LOG_OBJECT (souphttpsink, "waiting for main loop thread to start up"); + g_cond_wait (souphttpsink->cond, souphttpsink->mutex); + g_mutex_unlock (souphttpsink->mutex); + GST_LOG_OBJECT (souphttpsink, "main loop thread running"); + + souphttpsink->session = + soup_session_async_new_with_options (SOUP_SESSION_ASYNC_CONTEXT, + souphttpsink->context, SOUP_SESSION_USER_AGENT, + souphttpsink->user_agent, SOUP_SESSION_TIMEOUT, souphttpsink->timeout, + NULL); + + //soup_session_add_feature (souphttpsink->session, + // SOUP_SESSION_FEATURE (soup_logger_new (SOUP_LOGGER_LOG_BODY, 100))); + + g_signal_connect (souphttpsink->session, "authenticate", + G_CALLBACK (authenticate), souphttpsink); + } + + return TRUE; +} + +static gboolean +gst_soup_http_client_sink_stop (GstBaseSink * sink) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); + + GST_DEBUG ("stop"); + + if (souphttpsink->prop_session == NULL) { + soup_session_abort (souphttpsink->session); + g_object_unref (souphttpsink->session); + } + + if (souphttpsink->loop) { + g_main_loop_quit (souphttpsink->loop); + g_thread_join (souphttpsink->thread); + g_main_loop_unref (souphttpsink->loop); + souphttpsink->loop = NULL; + } + if (souphttpsink->context) { + g_main_context_unref (souphttpsink->context); + souphttpsink->context = NULL; + } + + gst_soup_http_client_sink_reset (souphttpsink); + + return TRUE; +} + +static gboolean +gst_soup_http_client_sink_unlock (GstBaseSink * sink) +{ + GST_DEBUG ("unlock"); + + return TRUE; +} + +static gboolean +gst_soup_http_client_sink_event (GstBaseSink * sink, GstEvent * event) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); + + GST_DEBUG_OBJECT (souphttpsink, "event"); + + if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) { + GST_DEBUG_OBJECT (souphttpsink, "got eos"); + g_mutex_lock (souphttpsink->mutex); + while (souphttpsink->message) { + GST_DEBUG_OBJECT (souphttpsink, "waiting"); + g_cond_wait (souphttpsink->cond, souphttpsink->mutex); + } + g_mutex_unlock (souphttpsink->mutex); + GST_DEBUG_OBJECT (souphttpsink, "finished eos"); + } + + return TRUE; +} + +static GstFlowReturn +gst_soup_http_client_sink_preroll (GstBaseSink * sink, GstBuffer * buffer) +{ + GST_DEBUG ("preroll"); + + return GST_FLOW_OK; +} + +static void +free_buffer_list (GList * list) +{ + GList *g; + for (g = list; g; g = g_list_next (g)) { + GstBuffer *buffer = g->data; + gst_buffer_unref (buffer); + } + g_list_free (list); +} + +static void +send_message_locked (GstSoupHttpClientSink * souphttpsink) +{ + GList *g; + guint64 n; + + if (souphttpsink->queued_buffers == NULL || souphttpsink->message) { + return; + } + + /* If the URI went away, drop all these buffers */ + if (souphttpsink->location == NULL) { + free_buffer_list (souphttpsink->queued_buffers); + souphttpsink->queued_buffers = NULL; + return; + } + + souphttpsink->message = soup_message_new ("PUT", souphttpsink->location); + + n = 0; + if (souphttpsink->offset == 0) { + for (g = souphttpsink->streamheader_buffers; g; g = g_list_next (g)) { + GstBuffer *buffer = g->data; + soup_message_body_append (souphttpsink->message->request_body, + SOUP_MEMORY_STATIC, GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); + n += GST_BUFFER_SIZE (buffer); + } + } + + for (g = souphttpsink->queued_buffers; g; g = g_list_next (g)) { + GstBuffer *buffer = g->data; + if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_IN_CAPS)) { + soup_message_body_append (souphttpsink->message->request_body, + SOUP_MEMORY_STATIC, GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); + n += GST_BUFFER_SIZE (buffer); + } + } + + if (souphttpsink->offset != 0) { + char *s; + s = g_strdup_printf ("bytes %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT "/*", + souphttpsink->offset, souphttpsink->offset + n - 1); + soup_message_headers_append (souphttpsink->message->request_headers, + "Content-Range", s); + g_free (s); + } + + if (n == 0) { + free_buffer_list (souphttpsink->queued_buffers); + souphttpsink->queued_buffers = NULL; + g_object_unref (souphttpsink->message); + souphttpsink->message = NULL; + return; + } + + souphttpsink->sent_buffers = souphttpsink->queued_buffers; + souphttpsink->queued_buffers = NULL; + + GST_DEBUG_OBJECT (souphttpsink, + "queue message %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT, + souphttpsink->offset, n); + soup_session_queue_message (souphttpsink->session, souphttpsink->message, + callback, souphttpsink); + + souphttpsink->offset += n; +} + +static gboolean +send_message (GstSoupHttpClientSink * souphttpsink) +{ + g_mutex_lock (souphttpsink->mutex); + send_message_locked (souphttpsink); + g_mutex_unlock (souphttpsink->mutex); + + return FALSE; +} + +static void +callback (SoupSession * session, SoupMessage * msg, gpointer user_data) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (user_data); + + GST_DEBUG_OBJECT (souphttpsink, "callback status=%d %s", + msg->status_code, msg->reason_phrase); + + g_mutex_lock (souphttpsink->mutex); + g_cond_signal (souphttpsink->cond); + souphttpsink->message = NULL; + + if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { + souphttpsink->status_code = msg->status_code; + souphttpsink->reason_phrase = g_strdup (msg->reason_phrase); + g_mutex_unlock (souphttpsink->mutex); + return; + } + + free_buffer_list (souphttpsink->sent_buffers); + souphttpsink->sent_buffers = NULL; + + send_message_locked (souphttpsink); + g_mutex_unlock (souphttpsink->mutex); +} + +static GstFlowReturn +gst_soup_http_client_sink_render (GstBaseSink * sink, GstBuffer * buffer) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); + GSource *source; + gboolean wake; + + if (souphttpsink->status_code != 0) { + /* FIXME we should allow a moderate amount of retries. */ + GST_ELEMENT_ERROR (souphttpsink, RESOURCE, WRITE, + ("Could not write to HTTP URI"), + ("error: %d %s", souphttpsink->status_code, + souphttpsink->reason_phrase)); + return GST_FLOW_ERROR; + } + + g_mutex_lock (souphttpsink->mutex); + if (souphttpsink->location != NULL) { + wake = (souphttpsink->queued_buffers == NULL); + souphttpsink->queued_buffers = + g_list_append (souphttpsink->queued_buffers, gst_buffer_ref (buffer)); + + if (wake) { + source = g_idle_source_new (); + g_source_set_callback (source, (GSourceFunc) (send_message), + souphttpsink, NULL); + g_source_attach (source, souphttpsink->context); + g_source_unref (source); + } + } + g_mutex_unlock (souphttpsink->mutex); + + return GST_FLOW_OK; +} + +static void +authenticate (SoupSession * session, SoupMessage * msg, + SoupAuth * auth, gboolean retrying, gpointer user_data) +{ + GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (user_data); + + if (!retrying) { + if (souphttpsink->user_id && souphttpsink->user_pw) { + soup_auth_authenticate (auth, + souphttpsink->user_id, souphttpsink->user_pw); + } + } +} diff --git a/ext/soup/gstsouphttpclientsink.h b/ext/soup/gstsouphttpclientsink.h new file mode 100644 index 0000000..fab1430 --- /dev/null +++ b/ext/soup/gstsouphttpclientsink.h @@ -0,0 +1,81 @@ +/* GStreamer + * Copyright (C) 2011 David Schleef + * + * 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_SOUP_HTTP_CLIENT_SINK_H_ +#define _GST_SOUP_HTTP_CLIENT_SINK_H_ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SOUP_HTTP_CLIENT_SINK (gst_soup_http_client_sink_get_type()) +#define GST_SOUP_HTTP_CLIENT_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SOUP_HTTP_CLIENT_SINK,GstSoupHttpClientSink)) +#define GST_SOUP_HTTP_CLIENT_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SOUP_HTTP_CLIENT_SINK,GstSoupHttpClientSinkClass)) +#define GST_IS_SOUP_HTTP_CLIENT_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SOUP_HTTP_CLIENT_SINK)) +#define GST_IS_SOUP_HTTP_CLIENT_SINK_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SOUP_HTTP_CLIENT_SINK)) + +typedef struct _GstSoupHttpClientSink GstSoupHttpClientSink; +typedef struct _GstSoupHttpClientSinkClass GstSoupHttpClientSinkClass; + +struct _GstSoupHttpClientSink +{ + GstBaseSink base_souphttpsink; + + GMutex *mutex; + GCond *cond; + GMainContext *context; + GMainLoop *loop; + GThread *thread; + SoupMessage *message; + SoupSession *session; + GList *queued_buffers; + GList *sent_buffers; + GList *streamheader_buffers; + + int status_code; + char *reason_phrase; + + guint64 offset; + int timeout; + + /* properties */ + SoupSession *prop_session; + char *location; + char *user_id; + char *user_pw; + SoupURI *proxy; + char *proxy_id; + char *proxy_pw; + char *user_agent; + gboolean automatic_redirect; + gchar **cookies; + +}; + +struct _GstSoupHttpClientSinkClass +{ + GstBaseSinkClass base_souphttpsink_class; +}; + +GType gst_soup_http_client_sink_get_type (void); + +G_END_DECLS + +#endif diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c new file mode 100644 index 0000000..a31746d --- /dev/null +++ b/ext/soup/gstsouphttpsrc.c @@ -0,0 +1,1676 @@ +/* GStreamer + * Copyright (C) 2007-2008 Wouter Cloetens + * + * 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 + */ + +/** + * SECTION:element-souphttpsrc + * + * This plugin reads data from a remote location specified by a URI. + * Supported protocols are 'http', 'https'. + * + * An HTTP proxy must be specified by its URL. + * If the "http_proxy" environment variable is set, its value is used. + * If built with libsoup's GNOME integration features, the GNOME proxy + * configuration will be used, or failing that, proxy autodetection. + * The #GstSoupHTTPSrc:proxy property can be used to override the default. + * + * In case the #GstSoupHTTPSrc:iradio-mode property is set and the location is + * an HTTP resource, souphttpsrc will send special Icecast HTTP headers to the + * server to request additional Icecast meta-information. + * If the server is not an Icecast server, it will behave as if the + * #GstSoupHTTPSrc:iradio-mode property were not set. If it is, souphttpsrc will + * output data with a media type of application/x-icy, in which case you will + * need to use the #ICYDemux element as follow-up element to extract the Icecast + * metadata and to determine the underlying media type. + * + * + * Example launch line + * |[ + * gst-launch -v souphttpsrc location=https://some.server.org/index.html + * ! filesink location=/home/joe/server.html + * ]| The above pipeline reads a web page from a server using the HTTPS protocol + * and writes it to a local file. + * |[ + * gst-launch -v souphttpsrc user-agent="FooPlayer 0.99 beta" + * automatic-redirect=false proxy=http://proxy.intranet.local:8080 + * location=http://music.foobar.com/demo.mp3 ! mad ! audioconvert + * ! audioresample ! alsasink + * ]| The above pipeline will read and decode and play an mp3 file from a + * web server using the HTTP protocol. If the server sends redirects, + * the request fails instead of following the redirect. The specified + * HTTP proxy server is used. The User-Agent HTTP request header + * is set to a custom string instead of "GStreamer souphttpsrc." + * |[ + * gst-launch -v souphttpsrc location=http://10.11.12.13/mjpeg + * do-timestamp=true ! multipartdemux + * ! image/jpeg,width=640,height=480 ! matroskamux + * ! filesink location=mjpeg.mkv + * ]| The above pipeline reads a motion JPEG stream from an IP camera + * using the HTTP protocol, encoded as mime/multipart image/jpeg + * parts, and writes a Matroska motion JPEG file. The width and + * height properties are set in the caps to provide the Matroska + * multiplexer with the information to set this in the header. + * Timestamps are set on the buffers as they arrive from the camera. + * These are used by the mime/multipart demultiplexer to emit timestamps + * on the JPEG-encoded video frame buffers. This allows the Matroska + * multiplexer to timestamp the frames in the resulting file. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#ifdef HAVE_STDLIB_H +#include /* atoi() */ +#endif +#include +#include +#ifdef HAVE_LIBSOUP_GNOME +#include +#else +#include +#endif +#include "gstsouphttpsrc.h" + +#include + +#define SEEK_CHANGES +GST_DEBUG_CATEGORY_STATIC (souphttpsrc_debug); +#define GST_CAT_DEFAULT souphttpsrc_debug + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +enum +{ + PROP_0, + PROP_LOCATION, + PROP_IS_LIVE, + PROP_USER_AGENT, + PROP_AUTOMATIC_REDIRECT, + PROP_PROXY, + PROP_USER_ID, + PROP_USER_PW, + PROP_PROXY_ID, + PROP_PROXY_PW, + PROP_COOKIES, + PROP_IRADIO_MODE, + PROP_IRADIO_NAME, + PROP_IRADIO_GENRE, + PROP_IRADIO_URL, + PROP_IRADIO_TITLE, + PROP_TIMEOUT, +#ifdef SEEK_CHANGES + PROP_EXTRA_HEADERS, + PROP_BLOCKSIZE, +#else + PROP_EXTRA_HEADERS +#endif +}; + +#define DEFAULT_USER_AGENT "GStreamer souphttpsrc " + +static void gst_soup_http_src_uri_handler_init (gpointer g_iface, + gpointer iface_data); +static void gst_soup_http_src_finalize (GObject * gobject); + +static void gst_soup_http_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_soup_http_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_soup_http_src_create (GstPushSrc * psrc, + GstBuffer ** outbuf); +static gboolean gst_soup_http_src_start (GstBaseSrc * bsrc); +static gboolean gst_soup_http_src_stop (GstBaseSrc * bsrc); +static gboolean gst_soup_http_src_get_size (GstBaseSrc * bsrc, guint64 * size); +static gboolean gst_soup_http_src_is_seekable (GstBaseSrc * bsrc); +static gboolean gst_soup_http_src_do_seek (GstBaseSrc * bsrc, + GstSegment * segment); +static gboolean gst_soup_http_src_query (GstBaseSrc * bsrc, GstQuery * query); +static gboolean gst_soup_http_src_unlock (GstBaseSrc * bsrc); +static gboolean gst_soup_http_src_unlock_stop (GstBaseSrc * bsrc); +static gboolean gst_soup_http_src_set_location (GstSoupHTTPSrc * src, + const gchar * uri); +static gboolean gst_soup_http_src_set_proxy (GstSoupHTTPSrc * src, + const gchar * uri); +static char *gst_soup_http_src_unicodify (const char *str); +static gboolean gst_soup_http_src_build_message (GstSoupHTTPSrc * src); +static void gst_soup_http_src_cancel_message (GstSoupHTTPSrc * src); +static void gst_soup_http_src_queue_message (GstSoupHTTPSrc * src); +static gboolean gst_soup_http_src_add_range_header (GstSoupHTTPSrc * src, + guint64 offset); +static void gst_soup_http_src_session_unpause_message (GstSoupHTTPSrc * src); +static void gst_soup_http_src_session_pause_message (GstSoupHTTPSrc * src); +static void gst_soup_http_src_session_close (GstSoupHTTPSrc * src); +static void gst_soup_http_src_parse_status (SoupMessage * msg, + GstSoupHTTPSrc * src); +static void gst_soup_http_src_chunk_free (gpointer gstbuf); +static SoupBuffer *gst_soup_http_src_chunk_allocator (SoupMessage * msg, + gsize max_len, gpointer user_data); +static void gst_soup_http_src_got_chunk_cb (SoupMessage * msg, + SoupBuffer * chunk, GstSoupHTTPSrc * src); +static void gst_soup_http_src_response_cb (SoupSession * session, + SoupMessage * msg, GstSoupHTTPSrc * src); +static void gst_soup_http_src_got_headers_cb (SoupMessage * msg, + GstSoupHTTPSrc * src); +static void gst_soup_http_src_got_body_cb (SoupMessage * msg, + GstSoupHTTPSrc * src); +static void gst_soup_http_src_finished_cb (SoupMessage * msg, + GstSoupHTTPSrc * src); +static void gst_soup_http_src_authenticate_cb (SoupSession * session, + SoupMessage * msg, SoupAuth * auth, gboolean retrying, + GstSoupHTTPSrc * src); + +static void +_do_init (GType type) +{ + static const GInterfaceInfo urihandler_info = { + gst_soup_http_src_uri_handler_init, + NULL, + NULL + }; + + g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); + + GST_DEBUG_CATEGORY_INIT (souphttpsrc_debug, "souphttpsrc", 0, + "SOUP HTTP src"); +} + +GST_BOILERPLATE_FULL (GstSoupHTTPSrc, gst_soup_http_src, GstPushSrc, + GST_TYPE_PUSH_SRC, _do_init); + +static void +gst_soup_http_src_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &srctemplate); + + gst_element_class_set_details_simple (element_class, "HTTP client source", + "Source/Network", + "Receive data as a client over the network via HTTP using SOUP", + "Wouter Cloetens "); +} + +static void +gst_soup_http_src_class_init (GstSoupHTTPSrcClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + GstPushSrcClass *gstpushsrc_class; + + gobject_class = (GObjectClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; + + gobject_class->set_property = gst_soup_http_src_set_property; + gobject_class->get_property = gst_soup_http_src_get_property; + gobject_class->finalize = gst_soup_http_src_finalize; + + g_object_class_install_property (gobject_class, + PROP_LOCATION, + g_param_spec_string ("location", "Location", + "Location to read from", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_USER_AGENT, + g_param_spec_string ("user-agent", "User-Agent", + "Value of the User-Agent HTTP request header field", + DEFAULT_USER_AGENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_AUTOMATIC_REDIRECT, + g_param_spec_boolean ("automatic-redirect", "automatic-redirect", + "Automatically follow HTTP redirects (HTTP Status Code 3xx)", + TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_PROXY, + g_param_spec_string ("proxy", "Proxy", + "HTTP proxy server URI", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_USER_ID, + g_param_spec_string ("user-id", "user-id", + "HTTP location URI user id for authentication", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_USER_PW, + g_param_spec_string ("user-pw", "user-pw", + "HTTP location URI user password for authentication", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROXY_ID, + g_param_spec_string ("proxy-id", "proxy-id", + "HTTP proxy URI user id for authentication", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROXY_PW, + g_param_spec_string ("proxy-pw", "proxy-pw", + "HTTP proxy URI user password for authentication", "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_COOKIES, + g_param_spec_boxed ("cookies", "Cookies", "HTTP request cookies", + G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_IS_LIVE, + g_param_spec_boolean ("is-live", "is-live", "Act like a live source", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_TIMEOUT, + g_param_spec_uint ("timeout", "timeout", + "Value in seconds to timeout a blocking I/O (0 = No timeout).", 0, + 3600, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_EXTRA_HEADERS, + g_param_spec_boxed ("extra-headers", "Extra Headers", + "Extra headers to append to the HTTP request", + GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + +#ifdef SEEK_CHANGES + g_object_class_install_property (gobject_class, PROP_BLOCKSIZE, + g_param_spec_int64 ("blocksize", "blocksize", + "Size of each buffer downloaded from libsoup", + -1, G_MAXUINT, 4096, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +#endif + /* icecast stuff */ + g_object_class_install_property (gobject_class, + PROP_IRADIO_MODE, + g_param_spec_boolean ("iradio-mode", + "iradio-mode", + "Enable internet radio mode (extraction of shoutcast/icecast metadata)", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_IRADIO_NAME, + g_param_spec_string ("iradio-name", + "iradio-name", "Name of the stream", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_IRADIO_GENRE, + g_param_spec_string ("iradio-genre", + "iradio-genre", "Genre of the stream", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_IRADIO_URL, + g_param_spec_string ("iradio-url", + "iradio-url", + "Homepage URL for radio stream", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_IRADIO_TITLE, + g_param_spec_string ("iradio-title", + "iradio-title", + "Name of currently playing song", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_soup_http_src_start); + gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_soup_http_src_stop); + gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_soup_http_src_unlock); + gstbasesrc_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_soup_http_src_unlock_stop); + gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_soup_http_src_get_size); + gstbasesrc_class->is_seekable = + GST_DEBUG_FUNCPTR (gst_soup_http_src_is_seekable); + gstbasesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_soup_http_src_do_seek); + gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_soup_http_src_query); + + gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_soup_http_src_create); +} + +static void +gst_soup_http_src_reset (GstSoupHTTPSrc * src) +{ + src->interrupted = FALSE; + src->retry = FALSE; + src->have_size = FALSE; + src->seekable = FALSE; + src->read_position = 0; + src->request_position = 0; + src->content_size = 0; + +#ifdef SEEK_CHANGES + src->file_size = 0; +#endif + gst_caps_replace (&src->src_caps, NULL); + g_free (src->iradio_name); + src->iradio_name = NULL; + g_free (src->iradio_genre); + src->iradio_genre = NULL; + g_free (src->iradio_url); + src->iradio_url = NULL; + g_free (src->iradio_title); + src->iradio_title = NULL; +} + +static void +gst_soup_http_src_init (GstSoupHTTPSrc * src, GstSoupHTTPSrcClass * g_class) +{ + const gchar *proxy; + + src->location = NULL; + src->automatic_redirect = TRUE; + src->user_agent = g_strdup (DEFAULT_USER_AGENT); + src->user_id = NULL; + src->user_pw = NULL; + src->proxy_id = NULL; + src->proxy_pw = NULL; + src->cookies = NULL; + src->iradio_mode = FALSE; + src->loop = NULL; + src->context = NULL; + src->session = NULL; + src->msg = NULL; +#ifdef SEEK_CHANGES + src->file_size = 0; + src->range_size = 0; +#endif + proxy = g_getenv ("http_proxy"); + if (proxy && !gst_soup_http_src_set_proxy (src, proxy)) { + GST_WARNING_OBJECT (src, + "The proxy in the http_proxy env var (\"%s\") cannot be parsed.", + proxy); + } + + gst_soup_http_src_reset (src); +} + +static void +gst_soup_http_src_finalize (GObject * gobject) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (gobject); + + GST_DEBUG_OBJECT (src, "finalize"); + + g_free (src->location); + g_free (src->user_agent); + if (src->proxy != NULL) { + soup_uri_free (src->proxy); + } + g_free (src->user_id); + g_free (src->user_pw); + g_free (src->proxy_id); + g_free (src->proxy_pw); + g_strfreev (src->cookies); + + G_OBJECT_CLASS (parent_class)->finalize (gobject); +} + +static void +gst_soup_http_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (object); + + switch (prop_id) { + case PROP_LOCATION: + { + const gchar *location; + + location = g_value_get_string (value); + + if (location == NULL) { + GST_WARNING ("location property cannot be NULL"); + goto done; + } + if (!gst_soup_http_src_set_location (src, location)) { + GST_WARNING ("badly formatted location"); + goto done; + } + break; + } + case PROP_USER_AGENT: + if (src->user_agent) + g_free (src->user_agent); + src->user_agent = g_value_dup_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_PROXY: + { + const gchar *proxy; + + proxy = g_value_get_string (value); + + if (proxy == NULL) { + GST_WARNING ("proxy property cannot be NULL"); + goto done; + } + if (!gst_soup_http_src_set_proxy (src, proxy)) { + GST_WARNING ("badly formatted proxy URI"); + goto done; + } + break; + } + case PROP_COOKIES: + { +#ifdef GST_EXT_SOUP_MODIFICATION + char **array; +#endif + g_strfreev (src->cookies); + src->cookies = g_strdupv (g_value_get_boxed (value)); +#ifdef GST_EXT_SOUP_MODIFICATION + if ((array = src->cookies) != NULL) { + while (*array != NULL) { + soup_cookie_jar_add_cookie (src->cookie_jar, + soup_cookie_parse (*array++, NULL)); + } + } +#endif + break; + } + case PROP_IS_LIVE: + gst_base_src_set_live (GST_BASE_SRC (src), g_value_get_boolean (value)); + break; + case PROP_USER_ID: + if (src->user_id) + g_free (src->user_id); + src->user_id = g_value_dup_string (value); + break; + case PROP_USER_PW: + if (src->user_pw) + g_free (src->user_pw); + src->user_pw = g_value_dup_string (value); + break; + case PROP_PROXY_ID: + if (src->proxy_id) + g_free (src->proxy_id); + src->proxy_id = g_value_dup_string (value); + break; + case PROP_PROXY_PW: + if (src->proxy_pw) + g_free (src->proxy_pw); + src->proxy_pw = g_value_dup_string (value); + break; + case PROP_TIMEOUT: + src->timeout = g_value_get_uint (value); + break; + case PROP_EXTRA_HEADERS:{ + const GstStructure *s = gst_value_get_structure (value); + + if (src->extra_headers) + gst_structure_free (src->extra_headers); + + src->extra_headers = s ? gst_structure_copy (s) : NULL; + break; + } +#ifdef SEEK_CHANGES + case PROP_BLOCKSIZE:{ + src->range_size = g_value_get_int64 (value); + break; + } +#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +done: + return; +} + +static void +gst_soup_http_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (object); + + switch (prop_id) { + case PROP_LOCATION: + g_value_set_string (value, src->location); + break; + case PROP_USER_AGENT: + g_value_set_string (value, src->user_agent); + break; + case PROP_AUTOMATIC_REDIRECT: + g_value_set_boolean (value, src->automatic_redirect); + break; + case PROP_PROXY: + if (src->proxy == NULL) + g_value_set_static_string (value, ""); + else { + char *proxy = soup_uri_to_string (src->proxy, FALSE); + + g_value_set_string (value, proxy); + g_free (proxy); + } + break; + case PROP_COOKIES: + { +#ifdef GST_EXT_SOUP_MODIFICATION + GSList *cookie_list, *c; + gchar **cookies, **array; + + cookies = NULL; + if ((cookie_list = soup_cookie_jar_all_cookies (src->cookie_jar)) != NULL) { + cookies = g_new0 (gchar *, g_slist_length(cookie_list) + 1); + array = cookies; + for (c = cookie_list; c; c = c->next) { + *array++ = soup_cookie_to_set_cookie_header ((SoupCookie *)(c->data)); + } + soup_cookies_free (cookie_list); + } + g_value_set_boxed (value, cookies); +#else + g_value_set_boxed (value, g_strdupv (src->cookies)); +#endif + break; + } + case PROP_IS_LIVE: + g_value_set_boolean (value, gst_base_src_is_live (GST_BASE_SRC (src))); + break; + case PROP_IRADIO_MODE: + g_value_set_boolean (value, src->iradio_mode); + break; + case PROP_IRADIO_NAME: + g_value_set_string (value, src->iradio_name); + break; + case PROP_IRADIO_GENRE: + g_value_set_string (value, src->iradio_genre); + break; + case PROP_IRADIO_URL: + g_value_set_string (value, src->iradio_url); + break; + case PROP_IRADIO_TITLE: + g_value_set_string (value, src->iradio_title); + break; + case PROP_USER_ID: + g_value_set_string (value, src->user_id); + break; + case PROP_USER_PW: + g_value_set_string (value, src->user_pw); + break; + case PROP_PROXY_ID: + g_value_set_string (value, src->proxy_id); + break; + case PROP_PROXY_PW: + g_value_set_string (value, src->proxy_pw); + break; + case PROP_TIMEOUT: + g_value_set_uint (value, src->timeout); + break; + case PROP_EXTRA_HEADERS: + gst_value_set_structure (value, src->extra_headers); + break; +#ifdef SEEK_CHANGES + case PROP_BLOCKSIZE: + g_value_set_int64 (value, src->range_size); + break; +#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gchar * +gst_soup_http_src_unicodify (const gchar * str) +{ + const gchar *env_vars[] = { "GST_ICY_TAG_ENCODING", + "GST_TAG_ENCODING", NULL + }; + + return gst_tag_freeform_string_to_utf8 (str, -1, env_vars); +} + +static void +gst_soup_http_src_cancel_message (GstSoupHTTPSrc * src) +{ + if (src->msg != NULL) { + src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_CANCELLED; + soup_session_cancel_message (src->session, src->msg, SOUP_STATUS_CANCELLED); + } + src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE; + src->msg = NULL; +} + +static void +gst_soup_http_src_queue_message (GstSoupHTTPSrc * src) +{ + soup_session_queue_message (src->session, src->msg, + (SoupSessionCallback) gst_soup_http_src_response_cb, src); + src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_QUEUED; +} + +static gboolean +gst_soup_http_src_add_range_header (GstSoupHTTPSrc * src, guint64 offset) +{ + gchar buf[64]; + + gint rc; + + soup_message_headers_remove (src->msg->request_headers, "Range"); + +#ifdef GST_EXT_SOUP_MODIFICATION + /* Note : Some http server could not handle Range header in the middle of playing. + * Need to add Range header at first for seeking properly. + */ + rc = g_snprintf (buf, sizeof (buf), "bytes=%" G_GUINT64_FORMAT "-", offset); + if (rc > sizeof (buf) || rc < 0) + return FALSE; + soup_message_headers_append (src->msg->request_headers, "Range", buf); +#else + if (offset) { + rc = g_snprintf (buf, sizeof (buf), "bytes=%" G_GUINT64_FORMAT "-", offset); + if (rc > sizeof (buf) || rc < 0) + return FALSE; + soup_message_headers_append (src->msg->request_headers, "Range", buf); + } +#endif + src->read_position = offset; + return TRUE; +} + +static gboolean +_append_extra_header (GQuark field_id, const GValue * value, gpointer user_data) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (user_data); + const gchar *field_name = g_quark_to_string (field_id); + gchar *field_content = NULL; + + if (G_VALUE_TYPE (value) == G_TYPE_STRING) { + field_content = g_value_dup_string (value); + } else { + GValue dest = { 0, }; + + g_value_init (&dest, G_TYPE_STRING); + if (g_value_transform (value, &dest)) { + field_content = g_value_dup_string (&dest); + } + } + + if (field_content == NULL) { + GST_ERROR_OBJECT (src, "extra-headers field '%s' contains no value " + "or can't be converted to a string", field_name); + return FALSE; + } + + GST_DEBUG_OBJECT (src, "Appending extra header: \"%s: %s\"", field_name, + field_content); + soup_message_headers_append (src->msg->request_headers, field_name, + field_content); + + g_free (field_content); + + return TRUE; +} + +static gboolean +_append_extra_headers (GQuark field_id, const GValue * value, + gpointer user_data) +{ + if (G_VALUE_TYPE (value) == GST_TYPE_ARRAY) { + guint n = gst_value_array_get_size (value); + guint i; + + for (i = 0; i < n; i++) { + const GValue *v = gst_value_array_get_value (value, i); + + if (!_append_extra_header (field_id, v, user_data)) + return FALSE; + } + } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) { + guint n = gst_value_list_get_size (value); + guint i; + + for (i = 0; i < n; i++) { + const GValue *v = gst_value_list_get_value (value, i); + + if (!_append_extra_header (field_id, v, user_data)) + return FALSE; + } + } else { + return _append_extra_header (field_id, value, user_data); + } + + return TRUE; +} + + +static gboolean +gst_soup_http_src_add_extra_headers (GstSoupHTTPSrc * src) +{ + if (!src->extra_headers) + return TRUE; + + return gst_structure_foreach (src->extra_headers, _append_extra_headers, src); +} + + +static void +gst_soup_http_src_session_unpause_message (GstSoupHTTPSrc * src) +{ + soup_session_unpause_message (src->session, src->msg); +} + +static void +gst_soup_http_src_session_pause_message (GstSoupHTTPSrc * src) +{ + soup_session_pause_message (src->session, src->msg); +} + +static void +gst_soup_http_src_session_close (GstSoupHTTPSrc * src) +{ + if (src->session) { + soup_session_abort (src->session); /* This unrefs the message. */ + g_object_unref (src->session); + src->session = NULL; + src->msg = NULL; + } +} + +static void +gst_soup_http_src_authenticate_cb (SoupSession * session, SoupMessage * msg, + SoupAuth * auth, gboolean retrying, GstSoupHTTPSrc * src) +{ + if (!retrying) { + /* First time authentication only, if we fail and are called again with retry true fall through */ + if (msg->status_code == SOUP_STATUS_UNAUTHORIZED) { + if (src->user_id && src->user_pw) + soup_auth_authenticate (auth, src->user_id, src->user_pw); + } else if (msg->status_code == SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED) { + if (src->proxy_id && src->proxy_pw) + soup_auth_authenticate (auth, src->proxy_id, src->proxy_pw); + } + } +} + +static void +gst_soup_http_src_headers_foreach (const gchar * name, const gchar * val, + gpointer src) +{ + GST_DEBUG_OBJECT (src, " %s: %s", name, val); +} + +static void +gst_soup_http_src_got_headers_cb (SoupMessage * msg, GstSoupHTTPSrc * src) +{ + const char *value; + GstTagList *tag_list; + GstBaseSrc *basesrc; + guint64 newsize; +#ifdef SEEK_CHANGES + goffset start = 0, end = 0, total_length = 0; +#endif + GHashTable *params = NULL; +#ifdef GST_EXT_SOUP_MODIFICATION + gint idx = 0; + const char* blackTypes[] = {"application/xml", "text/html"}; +#endif + + GST_DEBUG_OBJECT (src, "got headers:"); + soup_message_headers_foreach (msg->response_headers, + gst_soup_http_src_headers_foreach, src); + + if (msg->status_code == 407 && src->proxy_id && src->proxy_pw) + return; + + if (src->automatic_redirect && SOUP_STATUS_IS_REDIRECTION (msg->status_code)) { +#ifdef GST_EXT_SOUP_MODIFICATION + value = soup_message_headers_get (msg->response_headers, "Location"); + gst_soup_http_src_set_location (src, value); + GST_DEBUG_OBJECT (src, "%u redirect to \"%s\"", msg->status_code, value); +#else + GST_DEBUG_OBJECT (src, "%u redirect to \"%s\"", msg->status_code, + soup_message_headers_get (msg->response_headers, "Location")); +#endif + return; + } + + if (msg->status_code == SOUP_STATUS_UNAUTHORIZED) + return; + + src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING; + + /* Parse Content-Length. */ + if (soup_message_headers_get_encoding (msg->response_headers) == + SOUP_ENCODING_CONTENT_LENGTH) { + newsize = src->request_position + + soup_message_headers_get_content_length (msg->response_headers); + if (!src->have_size || (src->content_size != newsize)) { + src->content_size = newsize; +#ifdef SEEK_CHANGES + if(!src->file_size) + src->file_size = newsize; +#endif + src->have_size = TRUE; + src->seekable = TRUE; + GST_DEBUG_OBJECT (src, "size = %" G_GUINT64_FORMAT, src->content_size); + + basesrc = GST_BASE_SRC_CAST (src); + gst_segment_set_duration (&basesrc->segment, GST_FORMAT_BYTES, + src->content_size); + gst_element_post_message (GST_ELEMENT (src), + gst_message_new_duration (GST_OBJECT (src), GST_FORMAT_BYTES, + src->content_size)); + } +#ifdef SEEK_CHANGES + soup_message_headers_get_content_range(msg->response_headers, &start, &end, &total_length); + if(total_length > 0) + { + src->file_size = total_length; + GST_DEBUG_OBJECT (src, "size = %" G_GUINT64_FORMAT, src->file_size); + basesrc = GST_BASE_SRC_CAST (src); + gst_segment_set_duration (&basesrc->segment, GST_FORMAT_BYTES, + src->file_size); + gst_element_post_message (GST_ELEMENT (src), + gst_message_new_duration (GST_OBJECT (src), GST_FORMAT_BYTES, + src->file_size)); + } +#endif + } + + /* Icecast stuff */ + tag_list = gst_tag_list_new (); + + if ((value = + soup_message_headers_get (msg->response_headers, + "icy-metaint")) != NULL) { + gint icy_metaint = atoi (value); + + GST_DEBUG_OBJECT (src, "icy-metaint: %s (parsed: %d)", value, icy_metaint); + if (icy_metaint > 0) { + if (src->src_caps) + gst_caps_unref (src->src_caps); + + src->src_caps = gst_caps_new_simple ("application/x-icy", + "metadata-interval", G_TYPE_INT, icy_metaint, NULL); + } + } + if ((value = + soup_message_headers_get_content_type (msg->response_headers, + ¶ms)) != NULL) { + GST_DEBUG_OBJECT (src, "Content-Type: %s", value); + +#ifdef GST_EXT_SOUP_MODIFICATION + for (idx = 0; idx < (sizeof(blackTypes) / sizeof(char *)); idx++) { + if (!g_ascii_strcasecmp(value, blackTypes[idx])) { + GST_DEBUG_OBJECT (src, "blackType: %s", blackTypes[idx]); + GST_ELEMENT_ERROR(src, STREAM, WRONG_TYPE, (0), (0)); + src->ret = GST_FLOW_ERROR; + } + } +#endif + + if (g_ascii_strcasecmp (value, "audio/L16") == 0) { + gint channels = 2; + gint rate = 44100; + char *param; + + if (src->src_caps) + gst_caps_unref (src->src_caps); + + param = g_hash_table_lookup (params, "channels"); + if (param != NULL) + channels = atol (param); + + param = g_hash_table_lookup (params, "rate"); + if (param != NULL) + rate = atol (param); + + src->src_caps = gst_caps_new_simple ("audio/x-raw-int", + "channels", G_TYPE_INT, channels, + "rate", G_TYPE_INT, rate, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "signed", G_TYPE_BOOLEAN, TRUE, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL); + } else { + /* Set the Content-Type field on the caps */ + if (src->src_caps) + gst_caps_set_simple (src->src_caps, "content-type", G_TYPE_STRING, + value, NULL); + } + } + + if (params != NULL) + g_hash_table_destroy (params); + + if ((value = + soup_message_headers_get (msg->response_headers, + "icy-name")) != NULL) { + g_free (src->iradio_name); + src->iradio_name = gst_soup_http_src_unicodify (value); + if (src->iradio_name) { + g_object_notify (G_OBJECT (src), "iradio-name"); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_ORGANIZATION, + src->iradio_name, NULL); + } + } + if ((value = + soup_message_headers_get (msg->response_headers, + "icy-genre")) != NULL) { + g_free (src->iradio_genre); + src->iradio_genre = gst_soup_http_src_unicodify (value); + if (src->iradio_genre) { + g_object_notify (G_OBJECT (src), "iradio-genre"); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_GENRE, + src->iradio_genre, NULL); + } + } + if ((value = soup_message_headers_get (msg->response_headers, "icy-url")) + != NULL) { + g_free (src->iradio_url); + src->iradio_url = gst_soup_http_src_unicodify (value); + if (src->iradio_url) { + g_object_notify (G_OBJECT (src), "iradio-url"); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_LOCATION, + src->iradio_url, NULL); + } + } + if (!gst_tag_list_is_empty (tag_list)) { + GST_DEBUG_OBJECT (src, + "calling gst_element_found_tags with %" GST_PTR_FORMAT, tag_list); + gst_element_found_tags (GST_ELEMENT_CAST (src), tag_list); + } else { + gst_tag_list_free (tag_list); + } + + /* Handle HTTP errors. */ + gst_soup_http_src_parse_status (msg, src); + + /* Check if Range header was respected. */ + if (src->ret == GST_FLOW_CUSTOM_ERROR && + src->read_position && msg->status_code != SOUP_STATUS_PARTIAL_CONTENT) { + src->seekable = FALSE; + GST_ELEMENT_ERROR (src, RESOURCE, SEEK, + (_("Server does not support seeking.")), + ("Server does not accept Range HTTP header, URL: %s", src->location)); + src->ret = GST_FLOW_ERROR; + } +} + +/* Have body. Signal EOS. */ +static void +gst_soup_http_src_got_body_cb (SoupMessage * msg, GstSoupHTTPSrc * src) +{ + if (G_UNLIKELY (msg != src->msg)) { + GST_DEBUG_OBJECT (src, "got body, but not for current message"); + return; + } + if (G_UNLIKELY (src->session_io_status != + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING)) { + /* Probably a redirect. */ + return; + } + GST_DEBUG_OBJECT (src, "got body"); + src->ret = GST_FLOW_UNEXPECTED; + if (src->loop) + g_main_loop_quit (src->loop); + gst_soup_http_src_session_pause_message (src); +} + +/* Finished. Signal EOS. */ +static void +gst_soup_http_src_finished_cb (SoupMessage * msg, GstSoupHTTPSrc * src) +{ + if (G_UNLIKELY (msg != src->msg)) { + GST_DEBUG_OBJECT (src, "finished, but not for current message"); + return; + } + GST_DEBUG_OBJECT (src, "finished"); + src->ret = GST_FLOW_UNEXPECTED; + if (src->session_io_status == GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_CANCELLED) { + /* gst_soup_http_src_cancel_message() triggered this; probably a seek + * that occurred in the QUEUEING state; i.e. before the connection setup + * was complete. Do nothing */ + } else if (src->session_io_status == + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING && src->read_position > 0) { + /* The server disconnected while streaming. Reconnect and seeking to the + * last location. */ + src->retry = TRUE; + src->ret = GST_FLOW_CUSTOM_ERROR; + } else if (G_UNLIKELY (src->session_io_status != + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING)) { + /* FIXME: reason_phrase is not translated, add proper error message */ + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, + ("%s", msg->reason_phrase), + ("libsoup status code %d", msg->status_code)); + } + if (src->loop) + g_main_loop_quit (src->loop); +} + +/* Buffer lifecycle management. + * + * gst_soup_http_src_create() runs the GMainLoop for this element, to let + * Soup take control. + * A GstBuffer is allocated in gst_soup_http_src_chunk_allocator() and + * associated with a SoupBuffer. + * Soup reads HTTP data in the GstBuffer's data buffer. + * The gst_soup_http_src_got_chunk_cb() is then called with the SoupBuffer. + * That sets gst_soup_http_src_create()'s return argument to the GstBuffer, + * increments its refcount (to 2), pauses the flow of data from the HTTP + * source to prevent gst_soup_http_src_got_chunk_cb() from being called + * again and breaks out of the GMainLoop. + * Because the SOUP_MESSAGE_OVERWRITE_CHUNKS flag is set, Soup frees the + * SoupBuffer and calls gst_soup_http_src_chunk_free(), which decrements the + * refcount (to 1). + * gst_soup_http_src_create() returns the GstBuffer. It will be freed by a + * downstream element. + * If Soup fails to read HTTP data, it does not call + * gst_soup_http_src_got_chunk_cb(), but still frees the SoupBuffer and + * calls gst_soup_http_src_chunk_free(), which decrements the GstBuffer's + * refcount to 0, freeing it. + */ + +static void +gst_soup_http_src_chunk_free (gpointer gstbuf) +{ + gst_buffer_unref (GST_BUFFER_CAST (gstbuf)); +} + +static SoupBuffer * +gst_soup_http_src_chunk_allocator (SoupMessage * msg, gsize max_len, + gpointer user_data) +{ + GstSoupHTTPSrc *src = (GstSoupHTTPSrc *) user_data; + GstBaseSrc *basesrc = GST_BASE_SRC_CAST (src); + GstBuffer *gstbuf; + SoupBuffer *soupbuf; + gsize length; + GstFlowReturn rc; + + if (max_len) + length = MIN (basesrc->blocksize, max_len); + else + length = basesrc->blocksize; + GST_DEBUG_OBJECT (src, "alloc %" G_GSIZE_FORMAT " bytes <= %" G_GSIZE_FORMAT, + length, max_len); + + + rc = gst_pad_alloc_buffer (GST_BASE_SRC_PAD (basesrc), + GST_BUFFER_OFFSET_NONE, length, + src->src_caps ? src->src_caps : + GST_PAD_CAPS (GST_BASE_SRC_PAD (basesrc)), &gstbuf); + if (G_UNLIKELY (rc != GST_FLOW_OK)) { + /* Failed to allocate buffer. Stall SoupSession and return error code + * to create(). */ + src->ret = rc; + g_main_loop_quit (src->loop); + return NULL; + } + + soupbuf = soup_buffer_new_with_owner (GST_BUFFER_DATA (gstbuf), length, + gstbuf, gst_soup_http_src_chunk_free); + + return soupbuf; +} + +static void +gst_soup_http_src_got_chunk_cb (SoupMessage * msg, SoupBuffer * chunk, + GstSoupHTTPSrc * src) +{ + GstBaseSrc *basesrc; + guint64 new_position; + + if (G_UNLIKELY (msg != src->msg)) { + GST_DEBUG_OBJECT (src, "got chunk, but not for current message"); + return; + } + if (G_UNLIKELY (src->session_io_status != + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING)) { + /* Probably a redirect. */ + return; + } + basesrc = GST_BASE_SRC_CAST (src); + GST_DEBUG_OBJECT (src, "got chunk of %" G_GSIZE_FORMAT " bytes", + chunk->length); + + /* Extract the GstBuffer from the SoupBuffer and set its fields. */ + *src->outbuf = GST_BUFFER_CAST (soup_buffer_get_owner (chunk)); + + GST_BUFFER_SIZE (*src->outbuf) = chunk->length; + GST_BUFFER_OFFSET (*src->outbuf) = basesrc->segment.last_stop; + + gst_buffer_set_caps (*src->outbuf, + (src->src_caps) ? src->src_caps : + GST_PAD_CAPS (GST_BASE_SRC_PAD (basesrc))); + + gst_buffer_ref (*src->outbuf); + + new_position = src->read_position + chunk->length; + if (G_LIKELY (src->request_position == src->read_position)) + src->request_position = new_position; + src->read_position = new_position; + + src->ret = GST_FLOW_OK; + g_main_loop_quit (src->loop); + gst_soup_http_src_session_pause_message (src); +} + +static void +gst_soup_http_src_response_cb (SoupSession * session, SoupMessage * msg, + GstSoupHTTPSrc * src) +{ + if (G_UNLIKELY (msg != src->msg)) { + GST_DEBUG_OBJECT (src, "got response %d: %s, but not for current message", + msg->status_code, msg->reason_phrase); + return; + } + if (G_UNLIKELY (src->session_io_status != + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING) + && SOUP_STATUS_IS_REDIRECTION (msg->status_code)) { + /* Ignore redirections. */ + return; + } + GST_DEBUG_OBJECT (src, "got response %d: %s", msg->status_code, + msg->reason_phrase); + if (src->session_io_status == GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING && + src->read_position > 0) { + /* The server disconnected while streaming. Reconnect and seeking to the + * last location. */ + src->retry = TRUE; + } else + gst_soup_http_src_parse_status (msg, src); + /* The session's SoupMessage object expires after this callback returns. */ + src->msg = NULL; + g_main_loop_quit (src->loop); +} + +#define SOUP_HTTP_SRC_ERROR(src,soup_msg,cat,code,error_message) \ + GST_ELEMENT_ERROR ((src), cat, code, ("%s", error_message), \ + ("%s (%d), URL: %s", (soup_msg)->reason_phrase, \ + (soup_msg)->status_code, (src)->location)); + +static void +gst_soup_http_src_parse_status (SoupMessage * msg, GstSoupHTTPSrc * src) +{ + if (SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)) { + switch (msg->status_code) { + case SOUP_STATUS_CANT_RESOLVE: + case SOUP_STATUS_CANT_RESOLVE_PROXY: + SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, NOT_FOUND, + _("Could not resolve server name.")); + src->ret = GST_FLOW_ERROR; + break; + case SOUP_STATUS_CANT_CONNECT: + case SOUP_STATUS_CANT_CONNECT_PROXY: + SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, OPEN_READ, + _("Could not establish connection to server.")); + src->ret = GST_FLOW_ERROR; + break; + case SOUP_STATUS_SSL_FAILED: + SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, OPEN_READ, + _("Secure connection setup failed.")); + src->ret = GST_FLOW_ERROR; + break; + case SOUP_STATUS_IO_ERROR: + SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, READ, + _("A network error occured, or the server closed the connection " + "unexpectedly.")); + src->ret = GST_FLOW_ERROR; + break; + case SOUP_STATUS_MALFORMED: + SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, READ, + _("Server sent bad data.")); + src->ret = GST_FLOW_ERROR; + break; + case SOUP_STATUS_CANCELLED: + /* No error message when interrupted by program. */ + break; + } + } else if (SOUP_STATUS_IS_CLIENT_ERROR (msg->status_code) || + SOUP_STATUS_IS_REDIRECTION (msg->status_code) || + SOUP_STATUS_IS_SERVER_ERROR (msg->status_code)) { + /* Report HTTP error. */ + /* FIXME: reason_phrase is not translated and not suitable for user + * error dialog according to libsoup documentation. + * FIXME: error code (OPEN_READ vs. READ) should depend on http status? */ + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + ("%s", msg->reason_phrase), + ("%s (%d), URL: %s", msg->reason_phrase, msg->status_code, + src->location)); + src->ret = GST_FLOW_ERROR; + } +} + +static gboolean +gst_soup_http_src_build_message (GstSoupHTTPSrc * src) +{ + src->msg = soup_message_new (SOUP_METHOD_GET, src->location); + if (!src->msg) { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + ("Error parsing URL."), ("URL: %s", src->location)); + return FALSE; + } + src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE; + soup_message_headers_append (src->msg->request_headers, "Connection", + "close"); + if (src->iradio_mode) { + soup_message_headers_append (src->msg->request_headers, "icy-metadata", + "1"); + } + if (src->cookies) { + gchar **cookie; +#ifdef GST_EXT_SOUP_MODIFICATION + SoupURI *uri; + SoupCookie *cookie_parsed; + gchar *header; + + uri = soup_uri_new (src->location); + for (cookie = src->cookies; *cookie != NULL; cookie++) { + if ((cookie_parsed = soup_cookie_parse (*cookie, uri)) != NULL) { + header = soup_cookie_to_cookie_header (cookie_parsed); + soup_message_headers_append (src->msg->request_headers, "Cookie", + header); + g_free (header); + soup_cookie_free (cookie_parsed); + } + } + soup_uri_free (uri); +#else + for (cookie = src->cookies; *cookie != NULL; cookie++) { + soup_message_headers_append (src->msg->request_headers, "Cookie", + *cookie); + } +#endif + } + soup_message_headers_append (src->msg->request_headers, + "transferMode.dlna.org", "Streaming"); + src->retry = FALSE; + + g_signal_connect (src->msg, "got_headers", + G_CALLBACK (gst_soup_http_src_got_headers_cb), src); + g_signal_connect (src->msg, "got_body", + G_CALLBACK (gst_soup_http_src_got_body_cb), src); + g_signal_connect (src->msg, "finished", + G_CALLBACK (gst_soup_http_src_finished_cb), src); + g_signal_connect (src->msg, "got_chunk", + G_CALLBACK (gst_soup_http_src_got_chunk_cb), src); + soup_message_set_flags (src->msg, SOUP_MESSAGE_OVERWRITE_CHUNKS | + (src->automatic_redirect ? 0 : SOUP_MESSAGE_NO_REDIRECT)); + soup_message_set_chunk_allocator (src->msg, + gst_soup_http_src_chunk_allocator, src, NULL); +#ifdef SEEK_CHANGES + //gst_soup_http_src_add_range_header (src, src->request_position); + if(src->range_size > 0) + soup_message_headers_set_range(src->msg->request_headers, src->request_position, (src->request_position+src->range_size-1)); + else { + gst_soup_http_src_add_range_header (src, src->request_position); + gst_soup_http_src_add_extra_headers (src); + GST_DEBUG_OBJECT (src, "request headers:"); + soup_message_headers_foreach (src->msg->request_headers,gst_soup_http_src_headers_foreach, src); + } +#else + gst_soup_http_src_add_range_header (src, src->request_position); + + gst_soup_http_src_add_extra_headers (src); + + GST_DEBUG_OBJECT (src, "request headers:"); + soup_message_headers_foreach (src->msg->request_headers, + gst_soup_http_src_headers_foreach, src); +#endif + + return TRUE; +} + +static GstFlowReturn +gst_soup_http_src_create (GstPushSrc * psrc, GstBuffer ** outbuf) +{ + GstSoupHTTPSrc *src; + + src = GST_SOUP_HTTP_SRC (psrc); + + if (src->msg && (src->request_position != src->read_position)) { +#ifdef SEEK_CHANGES + if (src->file_size != 0 && src->request_position >= src->file_size) { +#else + if (src->content_size != 0 && src->request_position >= src->content_size) { +#endif + GST_WARNING_OBJECT (src, "Seeking behind the end of file -- EOS"); + return GST_FLOW_UNEXPECTED; + } else if (src->session_io_status == + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE) { + gst_soup_http_src_add_range_header (src, src->request_position); + } else { + GST_DEBUG_OBJECT (src, "Seek from position %" G_GUINT64_FORMAT + " to %" G_GUINT64_FORMAT ": requeueing connection request", + src->read_position, src->request_position); +#ifndef SEEK_CHANGES + gst_soup_http_src_cancel_message (src); +#endif + } + } +#ifdef SEEK_CHANGES + if(src->msg && src->seeked) { + GST_DEBUG_OBJECT (src, "seeking to offset start %llu end %llu", src->request_position, (src->request_position+src->range_size-1)); + if(src->msg) { + soup_session_cancel_message (src->session, src->msg, SOUP_STATUS_OK); + src->msg = NULL; + if (!gst_soup_http_src_build_message (src)) + return GST_FLOW_ERROR; + } + soup_session_queue_message (src->session, src->msg, (SoupSessionCallback) gst_soup_http_src_response_cb, src); + src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_QUEUED; + src->read_position = src->request_position; + if(src->range_size > 0) src->content_size = src->request_position+src->range_size-1; + else src->content_size = src->file_size; + } + src->seeked = FALSE; +#endif + if (!src->msg) + if (!gst_soup_http_src_build_message (src)) + return GST_FLOW_ERROR; + + src->ret = GST_FLOW_CUSTOM_ERROR; + src->outbuf = outbuf; + do { + if (src->interrupted) { + GST_DEBUG_OBJECT (src, "interrupted"); + break; + } + if (src->retry) { + GST_DEBUG_OBJECT (src, "Reconnecting"); + if (!gst_soup_http_src_build_message (src)) + return GST_FLOW_ERROR; + src->retry = FALSE; + continue; + } + if (!src->msg) { + GST_DEBUG_OBJECT (src, "EOS reached"); + break; + } + + switch (src->session_io_status) { + case GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE: + GST_DEBUG_OBJECT (src, "Queueing connection request"); + gst_soup_http_src_queue_message (src); + break; + case GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_QUEUED: + break; + case GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING: + gst_soup_http_src_session_unpause_message (src); + break; + case GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_CANCELLED: + /* Impossible. */ + break; + } + + if (src->ret == GST_FLOW_CUSTOM_ERROR) + g_main_loop_run (src->loop); + } while (src->ret == GST_FLOW_CUSTOM_ERROR); + + if (src->ret == GST_FLOW_CUSTOM_ERROR) + src->ret = GST_FLOW_UNEXPECTED; + return src->ret; +} + +static gboolean +gst_soup_http_src_start (GstBaseSrc * bsrc) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc); + + GST_DEBUG_OBJECT (src, "start(\"%s\")", src->location); + + if (!src->location) { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (_("No URL set.")), + ("Missing location property")); + return FALSE; + } + + src->context = g_main_context_new (); + + src->loop = g_main_loop_new (src->context, TRUE); + if (!src->loop) { + GST_ELEMENT_ERROR (src, LIBRARY, INIT, + (NULL), ("Failed to start GMainLoop")); + g_main_context_unref (src->context); + return FALSE; + } + + if (src->proxy == NULL) { + src->session = + soup_session_async_new_with_options (SOUP_SESSION_ASYNC_CONTEXT, + src->context, SOUP_SESSION_USER_AGENT, src->user_agent, + SOUP_SESSION_TIMEOUT, src->timeout, +#ifdef HAVE_LIBSOUP_GNOME + SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_PROXY_RESOLVER_GNOME, +#endif + NULL); + } else { + src->session = + soup_session_async_new_with_options (SOUP_SESSION_ASYNC_CONTEXT, + src->context, SOUP_SESSION_PROXY_URI, src->proxy, + SOUP_SESSION_TIMEOUT, src->timeout, + SOUP_SESSION_USER_AGENT, src->user_agent, NULL); + } + + if (!src->session) { + GST_ELEMENT_ERROR (src, LIBRARY, INIT, + (NULL), ("Failed to create async session")); + return FALSE; + } + +#ifdef GST_EXT_SOUP_MODIFICATION + soup_session_add_feature_by_type (src->session, SOUP_TYPE_COOKIE_JAR); + src->cookie_jar = SOUP_COOKIE_JAR (soup_session_get_feature (src->session, SOUP_TYPE_COOKIE_JAR)); +#endif + + g_signal_connect (src->session, "authenticate", + G_CALLBACK (gst_soup_http_src_authenticate_cb), src); + return TRUE; +} + +static gboolean +gst_soup_http_src_stop (GstBaseSrc * bsrc) +{ + GstSoupHTTPSrc *src; + + src = GST_SOUP_HTTP_SRC (bsrc); + GST_DEBUG_OBJECT (src, "stop()"); + gst_soup_http_src_session_close (src); + if (src->loop) { + g_main_loop_unref (src->loop); + g_main_context_unref (src->context); + src->loop = NULL; + src->context = NULL; + } + if (src->extra_headers) { + gst_structure_free (src->extra_headers); + src->extra_headers = NULL; + } + + gst_soup_http_src_reset (src); + return TRUE; +} + +/* Interrupt a blocking request. */ +static gboolean +gst_soup_http_src_unlock (GstBaseSrc * bsrc) +{ + GstSoupHTTPSrc *src; + + src = GST_SOUP_HTTP_SRC (bsrc); + GST_DEBUG_OBJECT (src, "unlock()"); + + src->interrupted = TRUE; + if (src->loop) + g_main_loop_quit (src->loop); + return TRUE; +} + +/* Interrupt interrupt. */ +static gboolean +gst_soup_http_src_unlock_stop (GstBaseSrc * bsrc) +{ + GstSoupHTTPSrc *src; + + src = GST_SOUP_HTTP_SRC (bsrc); + GST_DEBUG_OBJECT (src, "unlock_stop()"); + + src->interrupted = FALSE; + return TRUE; +} + +static gboolean +gst_soup_http_src_get_size (GstBaseSrc * bsrc, guint64 * size) +{ + GstSoupHTTPSrc *src; + + src = GST_SOUP_HTTP_SRC (bsrc); + + if (src->have_size) { +#ifdef SEEK_CHANGES + GST_DEBUG_OBJECT (src, "get_size() = %" G_GUINT64_FORMAT, + src->file_size); + *size = src->file_size; +#else + GST_DEBUG_OBJECT (src, "get_size() = %" G_GUINT64_FORMAT, + src->content_size); + *size = src->content_size; +#endif + return TRUE; + } + GST_DEBUG_OBJECT (src, "get_size() = FALSE"); + return FALSE; +} + +static gboolean +gst_soup_http_src_is_seekable (GstBaseSrc * bsrc) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc); + + return src->seekable; +} + +static gboolean +gst_soup_http_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc); + + GST_DEBUG_OBJECT (src, "do_seek(%" G_GUINT64_FORMAT ")", segment->start); + +#ifdef SEEK_CHANGES + src->seeked = TRUE; +#endif + if (src->read_position == segment->start) { + GST_DEBUG_OBJECT (src, "Seeking to current read position"); + return TRUE; + } + + if (!src->seekable) { + GST_WARNING_OBJECT (src, "Not seekable"); + return FALSE; + } + + if (segment->rate < 0.0 || segment->format != GST_FORMAT_BYTES) { + GST_WARNING_OBJECT (src, "Invalid seek segment"); + return FALSE; + } + +#ifdef SEEK_CHANGES + if (src->content_size != 0 && segment->start >= src->file_size) { +#else + if (src->content_size != 0 && segment->start >= src->content_size) { +#endif + GST_WARNING_OBJECT (src, "Seeking behind end of file, will go to EOS soon"); + } + + /* Wait for create() to handle the jump in offset. */ + src->request_position = segment->start; + return TRUE; +} + +static gboolean +gst_soup_http_src_query (GstBaseSrc * bsrc, GstQuery * query) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc); + gboolean ret; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_URI: + gst_query_set_uri (query, src->location); + ret = TRUE; + break; + default: + ret = FALSE; + break; + } + + if (!ret) + ret = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query); + + return ret; +} + +static gboolean +gst_soup_http_src_set_location (GstSoupHTTPSrc * src, const gchar * uri) +{ + if (src->location) { + g_free (src->location); + src->location = NULL; + } + src->location = g_strdup (uri); + + return TRUE; +} + +static gboolean +gst_soup_http_src_set_proxy (GstSoupHTTPSrc * src, const gchar * uri) +{ + if (src->proxy) { + soup_uri_free (src->proxy); + src->proxy = NULL; + } + if (g_str_has_prefix (uri, "http://")) { + src->proxy = soup_uri_new (uri); + } else { + gchar *new_uri = g_strconcat ("http://", uri, NULL); + + src->proxy = soup_uri_new (new_uri); + g_free (new_uri); + } + + return TRUE; +} + +static guint +gst_soup_http_src_uri_get_type (void) +{ + return GST_URI_SRC; +} + +static gchar ** +gst_soup_http_src_uri_get_protocols (void) +{ + static const gchar *protocols[] = { "http", "https", NULL }; + return (gchar **) protocols; +} + +static const gchar * +gst_soup_http_src_uri_get_uri (GstURIHandler * handler) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (handler); + + return src->location; +} + +static gboolean +gst_soup_http_src_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (handler); + + return gst_soup_http_src_set_location (src, uri); +} + +static void +gst_soup_http_src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_soup_http_src_uri_get_type; + iface->get_protocols = gst_soup_http_src_uri_get_protocols; + iface->get_uri = gst_soup_http_src_uri_get_uri; + iface->set_uri = gst_soup_http_src_uri_set_uri; +} diff --git a/ext/soup/gstsouphttpsrc.h b/ext/soup/gstsouphttpsrc.h new file mode 100644 index 0000000..95bbc0c --- /dev/null +++ b/ext/soup/gstsouphttpsrc.h @@ -0,0 +1,107 @@ +/* GStreamer + * Copyright (C) 2007-2008 Wouter Cloetens + * + * 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 + */ + +#ifndef __GST_SOUP_HTTP_SRC_H__ +#define __GST_SOUP_HTTP_SRC_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#include + +#define GST_TYPE_SOUP_HTTP_SRC \ + (gst_soup_http_src_get_type()) +#define GST_SOUP_HTTP_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SOUP_HTTP_SRC,GstSoupHTTPSrc)) +#define GST_SOUP_HTTP_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + GST_TYPE_SOUP_HTTP_SRC,GstSoupHTTPSrcClass)) +#define GST_IS_SOUP_HTTP_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SOUP_HTTP_SRC)) +#define GST_IS_SOUP_HTTP_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SOUP_HTTP_SRC)) + +typedef struct _GstSoupHTTPSrc GstSoupHTTPSrc; +typedef struct _GstSoupHTTPSrcClass GstSoupHTTPSrcClass; + +typedef enum { + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE, + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_QUEUED, + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING, + GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_CANCELLED, +} GstSoupHTTPSrcSessionIOStatus; + +struct _GstSoupHTTPSrc { + GstPushSrc element; + + gchar *location; /* Full URI. */ + gchar *user_agent; /* User-Agent HTTP header. */ + gboolean automatic_redirect; /* Follow redirects. */ + SoupURI *proxy; /* HTTP proxy URI. */ + gchar *user_id; /* Authentication user id for location URI. */ + gchar *user_pw; /* Authentication user password for location URI. */ + gchar *proxy_id; /* Authentication user id for proxy URI. */ + gchar *proxy_pw; /* Authentication user password for proxy URI. */ + gchar **cookies; /* HTTP request cookies. */ + GMainContext *context; /* I/O context. */ + GMainLoop *loop; /* Event loop. */ + SoupSession *session; /* Async context. */ + GstSoupHTTPSrcSessionIOStatus session_io_status; + /* Async I/O status. */ + SoupMessage *msg; /* Request message. */ + GstFlowReturn ret; /* Return code from callback. */ + GstBuffer **outbuf; /* Return buffer allocated by callback. */ + gboolean interrupted; /* Signal unlock(). */ + gboolean retry; /* Should attempt to reconnect. */ + + gboolean have_size; /* Received and parsed Content-Length + header. */ + guint64 file_size; + gint64 range_size; + guint64 content_size; /* Value of Content-Length header. */ + guint64 read_position; /* Current position. */ + gboolean seekable; /* FALSE if the server does not support + Range. */ + guint64 request_position; /* Seek to this position. */ + gboolean seeked; + + /* Shoutcast/icecast metadata extraction handling. */ + gboolean iradio_mode; + GstCaps *src_caps; + gchar *iradio_name; + gchar *iradio_genre; + gchar *iradio_url; + gchar *iradio_title; + + GstStructure *extra_headers; + + guint timeout; +#ifdef GST_EXT_SOUP_MODIFICATION + SoupCookieJar *cookie_jar; +#endif +}; + +struct _GstSoupHTTPSrcClass { + GstPushSrcClass parent_class; +}; + +GType gst_soup_http_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_SOUP_HTTP_SRC_H__ */ + diff --git a/ext/speex/Makefile.am b/ext/speex/Makefile.am new file mode 100644 index 0000000..fe55237 --- /dev/null +++ b/ext/speex/Makefile.am @@ -0,0 +1,18 @@ +plugin_LTLIBRARIES = libgstspeex.la + +libgstspeex_la_SOURCES = gstspeex.c gstspeexdec.c gstspeexenc.c +libgstspeex_la_CFLAGS = -DGST_USE_UNSTABLE_API \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(SPEEX_CFLAGS) +libgstspeex_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgsttag-$(GST_MAJORMINOR) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(SPEEX_LIBS) +libgstspeex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBM) +libgstspeex_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstspeexenc.h gstspeexdec.h diff --git a/ext/speex/Makefile.in b/ext/speex/Makefile.in new file mode 100644 index 0000000..8f5bcef --- /dev/null +++ b/ext/speex/Makefile.in @@ -0,0 +1,834 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/speex +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstspeex_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstspeex_la_OBJECTS = libgstspeex_la-gstspeex.lo \ + libgstspeex_la-gstspeexdec.lo libgstspeex_la-gstspeexenc.lo +libgstspeex_la_OBJECTS = $(am_libgstspeex_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstspeex_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstspeex_la_CFLAGS) $(CFLAGS) \ + $(libgstspeex_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstspeex_la_SOURCES) +DIST_SOURCES = $(libgstspeex_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstspeex.la +libgstspeex_la_SOURCES = gstspeex.c gstspeexdec.c gstspeexenc.c +libgstspeex_la_CFLAGS = -DGST_USE_UNSTABLE_API \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(SPEEX_CFLAGS) + +libgstspeex_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgsttag-$(GST_MAJORMINOR) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(SPEEX_LIBS) + +libgstspeex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBM) +libgstspeex_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstspeexenc.h gstspeexdec.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/speex/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/speex/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstspeex.la: $(libgstspeex_la_OBJECTS) $(libgstspeex_la_DEPENDENCIES) $(EXTRA_libgstspeex_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstspeex_la_LINK) -rpath $(plugindir) $(libgstspeex_la_OBJECTS) $(libgstspeex_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstspeex_la-gstspeex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstspeex_la-gstspeexdec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstspeex_la-gstspeexenc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstspeex_la-gstspeex.lo: gstspeex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -MT libgstspeex_la-gstspeex.lo -MD -MP -MF $(DEPDIR)/libgstspeex_la-gstspeex.Tpo -c -o libgstspeex_la-gstspeex.lo `test -f 'gstspeex.c' || echo '$(srcdir)/'`gstspeex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstspeex_la-gstspeex.Tpo $(DEPDIR)/libgstspeex_la-gstspeex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstspeex.c' object='libgstspeex_la-gstspeex.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -c -o libgstspeex_la-gstspeex.lo `test -f 'gstspeex.c' || echo '$(srcdir)/'`gstspeex.c + +libgstspeex_la-gstspeexdec.lo: gstspeexdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -MT libgstspeex_la-gstspeexdec.lo -MD -MP -MF $(DEPDIR)/libgstspeex_la-gstspeexdec.Tpo -c -o libgstspeex_la-gstspeexdec.lo `test -f 'gstspeexdec.c' || echo '$(srcdir)/'`gstspeexdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstspeex_la-gstspeexdec.Tpo $(DEPDIR)/libgstspeex_la-gstspeexdec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstspeexdec.c' object='libgstspeex_la-gstspeexdec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -c -o libgstspeex_la-gstspeexdec.lo `test -f 'gstspeexdec.c' || echo '$(srcdir)/'`gstspeexdec.c + +libgstspeex_la-gstspeexenc.lo: gstspeexenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -MT libgstspeex_la-gstspeexenc.lo -MD -MP -MF $(DEPDIR)/libgstspeex_la-gstspeexenc.Tpo -c -o libgstspeex_la-gstspeexenc.lo `test -f 'gstspeexenc.c' || echo '$(srcdir)/'`gstspeexenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstspeex_la-gstspeexenc.Tpo $(DEPDIR)/libgstspeex_la-gstspeexenc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstspeexenc.c' object='libgstspeex_la-gstspeexenc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -c -o libgstspeex_la-gstspeexenc.lo `test -f 'gstspeexenc.c' || echo '$(srcdir)/'`gstspeexenc.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/speex/gstspeex.c b/ext/speex/gstspeex.c new file mode 100644 index 0000000..3cd7cbf --- /dev/null +++ b/ext/speex/gstspeex.c @@ -0,0 +1,49 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 +#endif + +#include "gstspeexdec.h" +#include "gstspeexenc.h" + +#include + +static gboolean +plugin_init (GstPlugin * plugin) +{ + + if (!gst_element_register (plugin, "speexenc", GST_RANK_PRIMARY, + GST_TYPE_SPEEX_ENC)) + return FALSE; + + if (!gst_element_register (plugin, "speexdec", GST_RANK_PRIMARY, + GST_TYPE_SPEEX_DEC)) + return FALSE; + + gst_tag_register_musicbrainz_tags (); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "speex", + "Speex plugin library", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/speex/gstspeexdec.c b/ext/speex/gstspeexdec.c new file mode 100644 index 0000000..e1d80b6 --- /dev/null +++ b/ext/speex/gstspeexdec.c @@ -0,0 +1,549 @@ +/* GStreamer + * Copyright (C) 2004 Wim Taymans + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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-speexdec + * @see_also: speexenc, oggdemux + * + * This element decodes a Speex stream to raw integer audio. + * Speex is a royalty-free + * audio codec maintained by the Xiph.org + * Foundation. + * + * + * Example pipelines + * |[ + * gst-launch -v filesrc location=speex.ogg ! oggdemux ! speexdec ! audioconvert ! audioresample ! alsasink + * ]| Decode an Ogg/Speex file. To create an Ogg/Speex file refer to the + * documentation of speexenc. + * + * + * Last reviewed on 2006-04-05 (0.10.2) + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gstspeexdec.h" +#include +#include +#include + +GST_DEBUG_CATEGORY_STATIC (speexdec_debug); +#define GST_CAT_DEFAULT speexdec_debug + +#define DEFAULT_ENH TRUE + +enum +{ + ARG_0, + ARG_ENH +}; + +static GstStaticPadTemplate speex_dec_src_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 6000, 48000 ], " + "channels = (int) [ 1, 2 ], " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) true, " "width = (int) 16, " "depth = (int) 16") + ); + +static GstStaticPadTemplate speex_dec_sink_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-speex") + ); + +GST_BOILERPLATE (GstSpeexDec, gst_speex_dec, GstAudioDecoder, + GST_TYPE_AUDIO_DECODER); + + +static gboolean gst_speex_dec_start (GstAudioDecoder * dec); +static gboolean gst_speex_dec_stop (GstAudioDecoder * dec); +static gboolean gst_speex_dec_set_format (GstAudioDecoder * bdec, + GstCaps * caps); +static GstFlowReturn gst_speex_dec_handle_frame (GstAudioDecoder * dec, + GstBuffer * buffer); + +static void gst_speex_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_speex_dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static void +gst_speex_dec_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &speex_dec_src_factory); + gst_element_class_add_static_pad_template (element_class, + &speex_dec_sink_factory); + gst_element_class_set_details_simple (element_class, "Speex audio decoder", + "Codec/Decoder/Audio", + "decode speex streams to audio", "Wim Taymans "); +} + +static void +gst_speex_dec_class_init (GstSpeexDecClass * klass) +{ + GObjectClass *gobject_class; + GstAudioDecoderClass *base_class; + + gobject_class = (GObjectClass *) klass; + base_class = (GstAudioDecoderClass *) klass; + + gobject_class->set_property = gst_speex_dec_set_property; + gobject_class->get_property = gst_speex_dec_get_property; + + base_class->start = GST_DEBUG_FUNCPTR (gst_speex_dec_start); + base_class->stop = GST_DEBUG_FUNCPTR (gst_speex_dec_stop); + base_class->set_format = GST_DEBUG_FUNCPTR (gst_speex_dec_set_format); + base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_speex_dec_handle_frame); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ENH, + g_param_spec_boolean ("enh", "Enh", "Enable perceptual enhancement", + DEFAULT_ENH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (speexdec_debug, "speexdec", 0, + "speex decoding element"); +} + +static void +gst_speex_dec_reset (GstSpeexDec * dec) +{ + dec->packetno = 0; + dec->frame_size = 0; + dec->frame_duration = 0; + dec->mode = NULL; + free (dec->header); + dec->header = NULL; + speex_bits_destroy (&dec->bits); + + gst_buffer_replace (&dec->streamheader, NULL); + gst_buffer_replace (&dec->vorbiscomment, NULL); + + if (dec->stereo) { + speex_stereo_state_destroy (dec->stereo); + dec->stereo = NULL; + } + + if (dec->state) { + speex_decoder_destroy (dec->state); + dec->state = NULL; + } +} + +static void +gst_speex_dec_init (GstSpeexDec * dec, GstSpeexDecClass * g_class) +{ + dec->enh = DEFAULT_ENH; + + gst_speex_dec_reset (dec); +} + +static gboolean +gst_speex_dec_start (GstAudioDecoder * dec) +{ + GstSpeexDec *sd = GST_SPEEX_DEC (dec); + + GST_DEBUG_OBJECT (dec, "start"); + gst_speex_dec_reset (sd); + + /* we know about concealment */ + gst_audio_decoder_set_plc_aware (dec, TRUE); + + return TRUE; +} + +static gboolean +gst_speex_dec_stop (GstAudioDecoder * dec) +{ + GstSpeexDec *sd = GST_SPEEX_DEC (dec); + + GST_DEBUG_OBJECT (dec, "stop"); + gst_speex_dec_reset (sd); + + return TRUE; +} + +static GstFlowReturn +gst_speex_dec_parse_header (GstSpeexDec * dec, GstBuffer * buf) +{ + GstCaps *caps; + + /* get the header */ + dec->header = speex_packet_to_header ((char *) GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + + if (!dec->header) + goto no_header; + + if (dec->header->mode >= SPEEX_NB_MODES || dec->header->mode < 0) + goto mode_too_old; + + dec->mode = speex_lib_get_mode (dec->header->mode); + + /* initialize the decoder */ + dec->state = speex_decoder_init (dec->mode); + if (!dec->state) + goto init_failed; + + speex_decoder_ctl (dec->state, SPEEX_SET_ENH, &dec->enh); + speex_decoder_ctl (dec->state, SPEEX_GET_FRAME_SIZE, &dec->frame_size); + + if (dec->header->nb_channels != 1) { + dec->stereo = speex_stereo_state_init (); + dec->callback.callback_id = SPEEX_INBAND_STEREO; + dec->callback.func = speex_std_stereo_request_handler; + dec->callback.data = dec->stereo; + speex_decoder_ctl (dec->state, SPEEX_SET_HANDLER, &dec->callback); + } + + speex_decoder_ctl (dec->state, SPEEX_SET_SAMPLING_RATE, &dec->header->rate); + + dec->frame_duration = gst_util_uint64_scale_int (dec->frame_size, + GST_SECOND, dec->header->rate); + + speex_bits_init (&dec->bits); + + /* set caps */ + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, dec->header->rate, + "channels", G_TYPE_INT, dec->header->nb_channels, + "signed", G_TYPE_BOOLEAN, TRUE, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, NULL); + + if (!gst_pad_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), caps)) + goto nego_failed; + + gst_caps_unref (caps); + return GST_FLOW_OK; + + /* ERRORS */ +no_header: + { + GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, + (NULL), ("couldn't read header")); + return GST_FLOW_ERROR; + } +mode_too_old: + { + GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, + (NULL), + ("Mode number %d does not (yet/any longer) exist in this version", + dec->header->mode)); + return GST_FLOW_ERROR; + } +init_failed: + { + GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, + (NULL), ("couldn't initialize decoder")); + return GST_FLOW_ERROR; + } +nego_failed: + { + GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, + (NULL), ("couldn't negotiate format")); + gst_caps_unref (caps); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static GstFlowReturn +gst_speex_dec_parse_comments (GstSpeexDec * dec, GstBuffer * buf) +{ + GstTagList *list; + gchar *ver, *encoder = NULL; + + list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, &encoder); + + if (!list) { + GST_WARNING_OBJECT (dec, "couldn't decode comments"); + list = gst_tag_list_new (); + } + + if (encoder) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_ENCODER, encoder, NULL); + } + + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, "Speex", NULL); + + ver = g_strndup (dec->header->speex_version, SPEEX_HEADER_VERSION_LENGTH); + g_strstrip (ver); + + if (ver != NULL && *ver != '\0') { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_ENCODER_VERSION, ver, NULL); + } + + if (dec->header->bitrate > 0) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_BITRATE, (guint) dec->header->bitrate, NULL); + } + + GST_INFO_OBJECT (dec, "tags: %" GST_PTR_FORMAT, list); + + gst_element_found_tags_for_pad (GST_ELEMENT (dec), + GST_AUDIO_DECODER_SRC_PAD (dec), list); + + g_free (encoder); + g_free (ver); + + return GST_FLOW_OK; +} + +static gboolean +gst_speex_dec_set_format (GstAudioDecoder * bdec, GstCaps * caps) +{ + GstSpeexDec *dec = GST_SPEEX_DEC (bdec); + gboolean ret = TRUE; + GstStructure *s; + const GValue *streamheader; + + s = gst_caps_get_structure (caps, 0); + if ((streamheader = gst_structure_get_value (s, "streamheader")) && + G_VALUE_HOLDS (streamheader, GST_TYPE_ARRAY) && + gst_value_array_get_size (streamheader) >= 2) { + const GValue *header, *vorbiscomment; + GstBuffer *buf; + GstFlowReturn res = GST_FLOW_OK; + + header = gst_value_array_get_value (streamheader, 0); + if (header && G_VALUE_HOLDS (header, GST_TYPE_BUFFER)) { + buf = gst_value_get_buffer (header); + res = gst_speex_dec_parse_header (dec, buf); + if (res != GST_FLOW_OK) + goto done; + gst_buffer_replace (&dec->streamheader, buf); + } + + vorbiscomment = gst_value_array_get_value (streamheader, 1); + if (vorbiscomment && G_VALUE_HOLDS (vorbiscomment, GST_TYPE_BUFFER)) { + buf = gst_value_get_buffer (vorbiscomment); + res = gst_speex_dec_parse_comments (dec, buf); + if (res != GST_FLOW_OK) + goto done; + gst_buffer_replace (&dec->vorbiscomment, buf); + } + } + +done: + return ret; +} + +static GstFlowReturn +gst_speex_dec_parse_data (GstSpeexDec * dec, GstBuffer * buf) +{ + GstFlowReturn res = GST_FLOW_OK; + gint i, fpp; + guint size; + guint8 *data; + SpeexBits *bits; + + if (!dec->frame_duration) + goto not_negotiated; + + if (G_LIKELY (GST_BUFFER_SIZE (buf))) { + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* send data to the bitstream */ + speex_bits_read_from (&dec->bits, (char *) data, size); + + fpp = dec->header->frames_per_packet; + bits = &dec->bits; + + GST_DEBUG_OBJECT (dec, "received buffer of size %u, fpp %d, %d bits", + size, fpp, speex_bits_remaining (bits)); + } else { + /* FIXME ? actually consider how much concealment is needed */ + /* concealment data, pass NULL as the bits parameters */ + GST_DEBUG_OBJECT (dec, "creating concealment data"); + fpp = dec->header->frames_per_packet; + bits = NULL; + } + + /* now decode each frame, catering for unknown number of them (e.g. rtp) */ + for (i = 0; i < fpp; i++) { + GstBuffer *outbuf; + gint16 *out_data; + gint ret; + + GST_LOG_OBJECT (dec, "decoding frame %d/%d, %d bits remaining", i, fpp, + bits ? speex_bits_remaining (bits) : -1); + + res = + gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), + GST_BUFFER_OFFSET_NONE, dec->frame_size * dec->header->nb_channels * 2, + GST_PAD_CAPS (GST_AUDIO_DECODER_SRC_PAD (dec)), &outbuf); + + if (res != GST_FLOW_OK) { + GST_DEBUG_OBJECT (dec, "buf alloc flow: %s", gst_flow_get_name (res)); + return res; + } + + out_data = (gint16 *) GST_BUFFER_DATA (outbuf); + + ret = speex_decode_int (dec->state, bits, out_data); + if (ret == -1) { + /* uh? end of stream */ + if (fpp == 0 && speex_bits_remaining (bits) < 8) { + /* if we did not know how many frames to expect, then we get this + at the end if there are leftover bits to pad to the next byte */ + GST_DEBUG_OBJECT (dec, "Discarding leftover bits"); + } else { + GST_WARNING_OBJECT (dec, "Unexpected end of stream found"); + } + gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), NULL, 1); + gst_buffer_unref (outbuf); + } else if (ret == -2) { + GST_WARNING_OBJECT (dec, "Decoding error: corrupted stream?"); + gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), NULL, 1); + gst_buffer_unref (outbuf); + } + + if (bits && speex_bits_remaining (bits) < 0) { + GST_WARNING_OBJECT (dec, "Decoding overflow: corrupted stream?"); + gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), NULL, 1); + gst_buffer_unref (outbuf); + } + if (dec->header->nb_channels == 2) + speex_decode_stereo_int (out_data, dec->frame_size, dec->stereo); + + res = gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), outbuf, 1); + + if (res != GST_FLOW_OK) { + GST_DEBUG_OBJECT (dec, "flow: %s", gst_flow_get_name (res)); + break; + } + } + + return res; + + /* ERRORS */ +not_negotiated: + { + GST_ELEMENT_ERROR (dec, CORE, NEGOTIATION, (NULL), + ("decoder not initialized")); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static GstFlowReturn +gst_speex_dec_handle_frame (GstAudioDecoder * bdec, GstBuffer * buf) +{ + GstFlowReturn res; + GstSpeexDec *dec; + + /* no fancy draining */ + if (G_UNLIKELY (!buf)) + return GST_FLOW_OK; + + dec = GST_SPEEX_DEC (bdec); + + /* If we have the streamheader and vorbiscomment from the caps already + * ignore them here */ + if (dec->streamheader && dec->vorbiscomment) { + if (GST_BUFFER_SIZE (dec->streamheader) == GST_BUFFER_SIZE (buf) + && memcmp (GST_BUFFER_DATA (dec->streamheader), GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)) == 0) { + GST_DEBUG_OBJECT (dec, "found streamheader"); + gst_audio_decoder_finish_frame (bdec, NULL, 1); + res = GST_FLOW_OK; + } else if (GST_BUFFER_SIZE (dec->vorbiscomment) == GST_BUFFER_SIZE (buf) + && memcmp (GST_BUFFER_DATA (dec->vorbiscomment), GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)) == 0) { + GST_DEBUG_OBJECT (dec, "found vorbiscomments"); + gst_audio_decoder_finish_frame (bdec, NULL, 1); + res = GST_FLOW_OK; + } else { + res = gst_speex_dec_parse_data (dec, buf); + } + } else { + /* Otherwise fall back to packet counting and assume that the + * first two packets are the headers. */ + switch (dec->packetno) { + case 0: + GST_DEBUG_OBJECT (dec, "counted streamheader"); + res = gst_speex_dec_parse_header (dec, buf); + gst_audio_decoder_finish_frame (bdec, NULL, 1); + break; + case 1: + GST_DEBUG_OBJECT (dec, "counted vorbiscomments"); + res = gst_speex_dec_parse_comments (dec, buf); + gst_audio_decoder_finish_frame (bdec, NULL, 1); + break; + default: + { + res = gst_speex_dec_parse_data (dec, buf); + break; + } + } + } + + dec->packetno++; + + return res; +} + +static void +gst_speex_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstSpeexDec *speexdec; + + speexdec = GST_SPEEX_DEC (object); + + switch (prop_id) { + case ARG_ENH: + g_value_set_boolean (value, speexdec->enh); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_speex_dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSpeexDec *speexdec; + + speexdec = GST_SPEEX_DEC (object); + + switch (prop_id) { + case ARG_ENH: + speexdec->enh = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/ext/speex/gstspeexdec.h b/ext/speex/gstspeexdec.h new file mode 100644 index 0000000..8187af8 --- /dev/null +++ b/ext/speex/gstspeexdec.h @@ -0,0 +1,80 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_SPEEX_DEC_H__ +#define __GST_SPEEX_DEC_H__ + +#include +#include + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SPEEX_DEC \ + (gst_speex_dec_get_type()) +#define GST_SPEEX_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPEEX_DEC,GstSpeexDec)) +#define GST_SPEEX_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPEEX_DEC,GstSpeexDecClass)) +#define GST_IS_SPEEX_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPEEX_DEC)) +#define GST_IS_SPEEX_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEX_DEC)) + +typedef struct _GstSpeexDec GstSpeexDec; +typedef struct _GstSpeexDecClass GstSpeexDecClass; + +struct _GstSpeexDec { + GstAudioDecoder element; + + void *state; + SpeexStereoState *stereo; +#ifdef SPEEX_1_0 + SpeexMode *mode; +#else + const SpeexMode *mode; +#endif + SpeexHeader *header; + SpeexCallback callback; + SpeexBits bits; + + gboolean enh; + + gint frame_size; + GstClockTime frame_duration; + guint64 packetno; + + GstBuffer *streamheader; + GstBuffer *vorbiscomment; +}; + +struct _GstSpeexDecClass { + GstAudioDecoderClass parent_class; +}; + +GType gst_speex_dec_get_type (void); + +G_END_DECLS + +#endif /* __GST_SPEEX_DEC_H__ */ diff --git a/ext/speex/gstspeexenc.c b/ext/speex/gstspeexenc.c new file mode 100644 index 0000000..b866e5c --- /dev/null +++ b/ext/speex/gstspeexenc.c @@ -0,0 +1,850 @@ +/* GStreamer Speex Encoder + * Copyright (C) <1999> Erik Walthinsen + * + * 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-speexenc + * @see_also: speexdec, oggmux + * + * This element encodes audio as a Speex stream. + * Speex is a royalty-free + * audio codec maintained by the Xiph.org + * Foundation. + * + * + * Example pipelines + * |[ + * gst-launch audiotestsrc num-buffers=100 ! speexenc ! oggmux ! filesink location=beep.ogg + * ]| Encode an Ogg/Speex file. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "gstspeexenc.h" + +GST_DEBUG_CATEGORY_STATIC (speexenc_debug); +#define GST_CAT_DEFAULT speexenc_debug + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 6000, 48000 ], " + "channels = (int) [ 1, 2 ], " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-speex, " + "rate = (int) [ 6000, 48000 ], " "channels = (int) [ 1, 2]") + ); + +#define DEFAULT_QUALITY 8.0 +#define DEFAULT_BITRATE 0 +#define DEFAULT_MODE GST_SPEEX_ENC_MODE_AUTO +#define DEFAULT_VBR FALSE +#define DEFAULT_ABR 0 +#define DEFAULT_VAD FALSE +#define DEFAULT_DTX FALSE +#define DEFAULT_COMPLEXITY 3 +#define DEFAULT_NFRAMES 1 + +enum +{ + PROP_0, + PROP_QUALITY, + PROP_BITRATE, + PROP_MODE, + PROP_VBR, + PROP_ABR, + PROP_VAD, + PROP_DTX, + PROP_COMPLEXITY, + PROP_NFRAMES, + PROP_LAST_MESSAGE +}; + +#define GST_TYPE_SPEEX_ENC_MODE (gst_speex_enc_mode_get_type()) +static GType +gst_speex_enc_mode_get_type (void) +{ + static GType speex_enc_mode_type = 0; + static const GEnumValue speex_enc_modes[] = { + {GST_SPEEX_ENC_MODE_AUTO, "Auto", "auto"}, + {GST_SPEEX_ENC_MODE_UWB, "Ultra Wide Band", "uwb"}, + {GST_SPEEX_ENC_MODE_WB, "Wide Band", "wb"}, + {GST_SPEEX_ENC_MODE_NB, "Narrow Band", "nb"}, + {0, NULL, NULL}, + }; + if (G_UNLIKELY (speex_enc_mode_type == 0)) { + speex_enc_mode_type = g_enum_register_static ("GstSpeexEncMode", + speex_enc_modes); + } + return speex_enc_mode_type; +} + +static void gst_speex_enc_finalize (GObject * object); + +static gboolean gst_speex_enc_setup (GstSpeexEnc * enc); + +static void gst_speex_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_speex_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_speex_enc_encode (GstSpeexEnc * enc, GstBuffer * buf); + +static gboolean gst_speex_enc_start (GstAudioEncoder * enc); +static gboolean gst_speex_enc_stop (GstAudioEncoder * enc); +static gboolean gst_speex_enc_set_format (GstAudioEncoder * enc, + GstAudioInfo * info); +static GstFlowReturn gst_speex_enc_handle_frame (GstAudioEncoder * enc, + GstBuffer * in_buf); +static gboolean gst_speex_enc_sink_event (GstAudioEncoder * enc, + GstEvent * event); +static GstFlowReturn +gst_speex_enc_pre_push (GstAudioEncoder * benc, GstBuffer ** buffer); + +static void +gst_speex_enc_setup_interfaces (GType speexenc_type) +{ + static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; + + g_type_add_interface_static (speexenc_type, GST_TYPE_TAG_SETTER, + &tag_setter_info); + + GST_DEBUG_CATEGORY_INIT (speexenc_debug, "speexenc", 0, "Speex encoder"); +} + +GST_BOILERPLATE_FULL (GstSpeexEnc, gst_speex_enc, GstAudioEncoder, + GST_TYPE_AUDIO_ENCODER, gst_speex_enc_setup_interfaces); + +static void +gst_speex_enc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_set_details_simple (element_class, "Speex audio encoder", + "Codec/Encoder/Audio", + "Encodes audio in Speex format", "Wim Taymans "); +} + +static void +gst_speex_enc_class_init (GstSpeexEncClass * klass) +{ + GObjectClass *gobject_class; + GstAudioEncoderClass *base_class; + + gobject_class = (GObjectClass *) klass; + base_class = (GstAudioEncoderClass *) klass; + + gobject_class->set_property = gst_speex_enc_set_property; + gobject_class->get_property = gst_speex_enc_get_property; + + base_class->start = GST_DEBUG_FUNCPTR (gst_speex_enc_start); + base_class->stop = GST_DEBUG_FUNCPTR (gst_speex_enc_stop); + base_class->set_format = GST_DEBUG_FUNCPTR (gst_speex_enc_set_format); + base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_speex_enc_handle_frame); + base_class->event = GST_DEBUG_FUNCPTR (gst_speex_enc_sink_event); + base_class->pre_push = GST_DEBUG_FUNCPTR (gst_speex_enc_pre_push); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QUALITY, + g_param_spec_float ("quality", "Quality", "Encoding quality", + 0.0, 10.0, DEFAULT_QUALITY, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BITRATE, + g_param_spec_int ("bitrate", "Encoding Bit-rate", + "Specify an encoding bit-rate (in bps). (0 = automatic)", + 0, G_MAXINT, DEFAULT_BITRATE, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", "The encoding mode", + GST_TYPE_SPEEX_ENC_MODE, GST_SPEEX_ENC_MODE_AUTO, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VBR, + g_param_spec_boolean ("vbr", "VBR", + "Enable variable bit-rate", DEFAULT_VBR, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ABR, + g_param_spec_int ("abr", "ABR", + "Enable average bit-rate (0 = disabled)", + 0, G_MAXINT, DEFAULT_ABR, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VAD, + g_param_spec_boolean ("vad", "VAD", + "Enable voice activity detection", DEFAULT_VAD, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DTX, + g_param_spec_boolean ("dtx", "DTX", + "Enable discontinuous transmission", DEFAULT_DTX, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_COMPLEXITY, + g_param_spec_int ("complexity", "Complexity", + "Set encoding complexity", + 0, G_MAXINT, DEFAULT_COMPLEXITY, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_NFRAMES, + g_param_spec_int ("nframes", "NFrames", + "Number of frames per buffer", + 0, G_MAXINT, DEFAULT_NFRAMES, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LAST_MESSAGE, + g_param_spec_string ("last-message", "last-message", + "The last status message", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + gobject_class->finalize = gst_speex_enc_finalize; +} + +static void +gst_speex_enc_finalize (GObject * object) +{ + GstSpeexEnc *enc; + + enc = GST_SPEEX_ENC (object); + + g_free (enc->last_message); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_speex_enc_init (GstSpeexEnc * enc, GstSpeexEncClass * klass) +{ + GstAudioEncoder *benc = GST_AUDIO_ENCODER (enc); + + /* arrange granulepos marking (and required perfect ts) */ + gst_audio_encoder_set_mark_granule (benc, TRUE); + gst_audio_encoder_set_perfect_timestamp (benc, TRUE); +} + +static gboolean +gst_speex_enc_start (GstAudioEncoder * benc) +{ + GstSpeexEnc *enc = GST_SPEEX_ENC (benc); + + GST_DEBUG_OBJECT (enc, "start"); + speex_bits_init (&enc->bits); + enc->tags = gst_tag_list_new (); + enc->header_sent = FALSE; + + return TRUE; +} + +static gboolean +gst_speex_enc_stop (GstAudioEncoder * benc) +{ + GstSpeexEnc *enc = GST_SPEEX_ENC (benc); + + GST_DEBUG_OBJECT (enc, "stop"); + enc->header_sent = FALSE; + if (enc->state) { + speex_encoder_destroy (enc->state); + enc->state = NULL; + } + speex_bits_destroy (&enc->bits); + gst_tag_list_free (enc->tags); + enc->tags = NULL; + g_slist_foreach (enc->headers, (GFunc) gst_buffer_unref, NULL); + enc->headers = NULL; + + gst_tag_setter_reset_tags (GST_TAG_SETTER (enc)); + + return TRUE; +} + +static gint64 +gst_speex_enc_get_latency (GstSpeexEnc * enc) +{ + /* See the Speex manual section "Latency and algorithmic delay" */ + if (enc->rate == 8000) + return 30 * GST_MSECOND; + else + return 34 * GST_MSECOND; +} + +static gboolean +gst_speex_enc_set_format (GstAudioEncoder * benc, GstAudioInfo * info) +{ + GstSpeexEnc *enc; + + enc = GST_SPEEX_ENC (benc); + + enc->channels = GST_AUDIO_INFO_CHANNELS (info); + enc->rate = GST_AUDIO_INFO_RATE (info); + + /* handle reconfigure */ + if (enc->state) { + speex_encoder_destroy (enc->state); + enc->state = NULL; + } + + if (!gst_speex_enc_setup (enc)) + return FALSE; + + /* feedback to base class */ + gst_audio_encoder_set_latency (benc, + gst_speex_enc_get_latency (enc), gst_speex_enc_get_latency (enc)); + gst_audio_encoder_set_lookahead (benc, enc->lookahead); + + if (enc->nframes == 0) { + /* as many frames as available input allows */ + gst_audio_encoder_set_frame_samples_min (benc, enc->frame_size); + gst_audio_encoder_set_frame_samples_max (benc, enc->frame_size); + gst_audio_encoder_set_frame_max (benc, 0); + } else { + /* exactly as many frames as configured */ + gst_audio_encoder_set_frame_samples_min (benc, + enc->frame_size * enc->nframes); + gst_audio_encoder_set_frame_samples_max (benc, + enc->frame_size * enc->nframes); + gst_audio_encoder_set_frame_max (benc, 1); + } + + return TRUE; +} + +static GstBuffer * +gst_speex_enc_create_metadata_buffer (GstSpeexEnc * enc) +{ + const GstTagList *user_tags; + GstTagList *merged_tags; + GstBuffer *comments = NULL; + + user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (enc)); + + GST_DEBUG_OBJECT (enc, "upstream tags = %" GST_PTR_FORMAT, enc->tags); + GST_DEBUG_OBJECT (enc, "user-set tags = %" GST_PTR_FORMAT, user_tags); + + /* gst_tag_list_merge() will handle NULL for either or both lists fine */ + merged_tags = gst_tag_list_merge (user_tags, enc->tags, + gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (enc))); + + if (merged_tags == NULL) + merged_tags = gst_tag_list_new (); + + GST_DEBUG_OBJECT (enc, "merged tags = %" GST_PTR_FORMAT, merged_tags); + comments = gst_tag_list_to_vorbiscomment_buffer (merged_tags, NULL, + 0, "Encoded with GStreamer Speexenc"); + gst_tag_list_free (merged_tags); + + GST_BUFFER_OFFSET (comments) = 0; + GST_BUFFER_OFFSET_END (comments) = 0; + + return comments; +} + +static void +gst_speex_enc_set_last_msg (GstSpeexEnc * enc, const gchar * msg) +{ + g_free (enc->last_message); + enc->last_message = g_strdup (msg); + GST_WARNING_OBJECT (enc, "%s", msg); + g_object_notify (G_OBJECT (enc), "last-message"); +} + +static gboolean +gst_speex_enc_setup (GstSpeexEnc * enc) +{ + switch (enc->mode) { + case GST_SPEEX_ENC_MODE_UWB: + GST_LOG_OBJECT (enc, "configuring for requested UWB mode"); + enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_UWB); + break; + case GST_SPEEX_ENC_MODE_WB: + GST_LOG_OBJECT (enc, "configuring for requested WB mode"); + enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_WB); + break; + case GST_SPEEX_ENC_MODE_NB: + GST_LOG_OBJECT (enc, "configuring for requested NB mode"); + enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_NB); + break; + case GST_SPEEX_ENC_MODE_AUTO: + /* fall through */ + GST_LOG_OBJECT (enc, "finding best mode"); + default: + break; + } + + if (enc->rate > 25000) { + if (enc->mode == GST_SPEEX_ENC_MODE_AUTO) { + GST_LOG_OBJECT (enc, "selected UWB mode for samplerate %d", enc->rate); + enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_UWB); + } else { + if (enc->speex_mode != speex_lib_get_mode (SPEEX_MODEID_UWB)) { + gst_speex_enc_set_last_msg (enc, + "Warning: suggest to use ultra wide band mode for this rate"); + } + } + } else if (enc->rate > 12500) { + if (enc->mode == GST_SPEEX_ENC_MODE_AUTO) { + GST_LOG_OBJECT (enc, "selected WB mode for samplerate %d", enc->rate); + enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_WB); + } else { + if (enc->speex_mode != speex_lib_get_mode (SPEEX_MODEID_WB)) { + gst_speex_enc_set_last_msg (enc, + "Warning: suggest to use wide band mode for this rate"); + } + } + } else { + if (enc->mode == GST_SPEEX_ENC_MODE_AUTO) { + GST_LOG_OBJECT (enc, "selected NB mode for samplerate %d", enc->rate); + enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_NB); + } else { + if (enc->speex_mode != speex_lib_get_mode (SPEEX_MODEID_NB)) { + gst_speex_enc_set_last_msg (enc, + "Warning: suggest to use narrow band mode for this rate"); + } + } + } + + if (enc->rate != 8000 && enc->rate != 16000 && enc->rate != 32000) { + gst_speex_enc_set_last_msg (enc, + "Warning: speex is optimized for 8, 16 and 32 KHz"); + } + + speex_init_header (&enc->header, enc->rate, 1, enc->speex_mode); + enc->header.frames_per_packet = enc->nframes; + enc->header.vbr = enc->vbr; + enc->header.nb_channels = enc->channels; + + /*Initialize Speex encoder */ + enc->state = speex_encoder_init (enc->speex_mode); + + speex_encoder_ctl (enc->state, SPEEX_GET_FRAME_SIZE, &enc->frame_size); + speex_encoder_ctl (enc->state, SPEEX_SET_COMPLEXITY, &enc->complexity); + speex_encoder_ctl (enc->state, SPEEX_SET_SAMPLING_RATE, &enc->rate); + + if (enc->vbr) + speex_encoder_ctl (enc->state, SPEEX_SET_VBR_QUALITY, &enc->quality); + else { + gint tmp = floor (enc->quality); + + speex_encoder_ctl (enc->state, SPEEX_SET_QUALITY, &tmp); + } + if (enc->bitrate) { + if (enc->quality >= 0.0 && enc->vbr) { + gst_speex_enc_set_last_msg (enc, + "Warning: bitrate option is overriding quality"); + } + speex_encoder_ctl (enc->state, SPEEX_SET_BITRATE, &enc->bitrate); + } + if (enc->vbr) { + gint tmp = 1; + + speex_encoder_ctl (enc->state, SPEEX_SET_VBR, &tmp); + } else if (enc->vad) { + gint tmp = 1; + + speex_encoder_ctl (enc->state, SPEEX_SET_VAD, &tmp); + } + + if (enc->dtx) { + gint tmp = 1; + + speex_encoder_ctl (enc->state, SPEEX_SET_DTX, &tmp); + } + + if (enc->dtx && !(enc->vbr || enc->abr || enc->vad)) { + gst_speex_enc_set_last_msg (enc, + "Warning: dtx is useless without vad, vbr or abr"); + } else if ((enc->vbr || enc->abr) && (enc->vad)) { + gst_speex_enc_set_last_msg (enc, + "Warning: vad is already implied by vbr or abr"); + } + + if (enc->abr) { + speex_encoder_ctl (enc->state, SPEEX_SET_ABR, &enc->abr); + } + + speex_encoder_ctl (enc->state, SPEEX_GET_LOOKAHEAD, &enc->lookahead); + + GST_LOG_OBJECT (enc, "we have frame size %d, lookahead %d", enc->frame_size, + enc->lookahead); + + return TRUE; +} + +/* push out the buffer */ +static GstFlowReturn +gst_speex_enc_push_buffer (GstSpeexEnc * enc, GstBuffer * buffer) +{ + guint size; + + size = GST_BUFFER_SIZE (buffer); + GST_DEBUG_OBJECT (enc, "pushing output buffer of size %u", size); + + gst_buffer_set_caps (buffer, GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc))); + return gst_pad_push (GST_AUDIO_ENCODER_SRC_PAD (enc), buffer); +} + +static gboolean +gst_speex_enc_sink_event (GstAudioEncoder * benc, GstEvent * event) +{ + GstSpeexEnc *enc; + + enc = GST_SPEEX_ENC (benc); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG: + { + if (enc->tags) { + GstTagList *list; + + gst_event_parse_tag (event, &list); + gst_tag_list_insert (enc->tags, list, + gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (enc))); + } else { + g_assert_not_reached (); + } + break; + } + default: + break; + } + + /* we only peeked, let base class handle it */ + return FALSE; +} + +static GstFlowReturn +gst_speex_enc_encode (GstSpeexEnc * enc, GstBuffer * buf) +{ + gint frame_size = enc->frame_size; + gint bytes = frame_size * 2 * enc->channels, samples, size; + gint outsize, written, dtx_ret = 0; + guint8 *data, *data0 = NULL; + GstBuffer *outbuf; + GstFlowReturn ret = GST_FLOW_OK; + + if (G_LIKELY (buf)) { + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + if (G_UNLIKELY (size % bytes)) { + GST_DEBUG_OBJECT (enc, "draining; adding silence samples"); + size = ((size / bytes) + 1) * bytes; + data0 = data = g_malloc0 (size); + memcpy (data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + } + } else { + GST_DEBUG_OBJECT (enc, "nothing to drain"); + goto done; + } + + samples = size / (2 * enc->channels); + speex_bits_reset (&enc->bits); + + /* FIXME what about dropped samples if DTS enabled ?? */ + + while (size) { + GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)", frame_size, bytes); + + if (enc->channels == 2) { + speex_encode_stereo_int ((gint16 *) data, frame_size, &enc->bits); + } + dtx_ret += speex_encode_int (enc->state, (gint16 *) data, &enc->bits); + + data += bytes; + size -= bytes; + } + + speex_bits_insert_terminator (&enc->bits); + outsize = speex_bits_nbytes (&enc->bits); + + ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), + GST_BUFFER_OFFSET_NONE, outsize, + GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc)), &outbuf); + + if ((GST_FLOW_OK != ret)) + goto done; + + written = speex_bits_write (&enc->bits, + (gchar *) GST_BUFFER_DATA (outbuf), outsize); + + if (G_UNLIKELY (written < outsize)) { + GST_ERROR_OBJECT (enc, "short write: %d < %d bytes", written, outsize); + GST_BUFFER_SIZE (outbuf) = written; + } else if (G_UNLIKELY (written > outsize)) { + GST_ERROR_OBJECT (enc, "overrun: %d > %d bytes", written, outsize); + } + + if (!dtx_ret) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP); + + ret = gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), + outbuf, samples); + +done: + g_free (data0); + return ret; +} + +/* + * (really really) FIXME: move into core (dixit tpm) + */ +/** + * _gst_caps_set_buffer_array: + * @caps: a #GstCaps + * @field: field in caps to set + * @buf: header buffers + * + * Adds given buffers to an array of buffers set as the given @field + * on the given @caps. List of buffer arguments must be NULL-terminated. + * + * Returns: input caps with a streamheader field added, or NULL if some error + */ +static GstCaps * +_gst_caps_set_buffer_array (GstCaps * caps, const gchar * field, + GstBuffer * buf, ...) +{ + GstStructure *structure = NULL; + va_list va; + GValue array = { 0 }; + GValue value = { 0 }; + + g_return_val_if_fail (caps != NULL, NULL); + g_return_val_if_fail (gst_caps_is_fixed (caps), NULL); + g_return_val_if_fail (field != NULL, NULL); + + caps = gst_caps_make_writable (caps); + structure = gst_caps_get_structure (caps, 0); + + g_value_init (&array, GST_TYPE_ARRAY); + + va_start (va, buf); + /* put buffers in a fixed list */ + while (buf) { + g_assert (gst_buffer_is_metadata_writable (buf)); + + /* mark buffer */ + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); + + g_value_init (&value, GST_TYPE_BUFFER); + buf = gst_buffer_copy (buf); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); + gst_value_set_buffer (&value, buf); + gst_buffer_unref (buf); + gst_value_array_append_value (&array, &value); + g_value_unset (&value); + + buf = va_arg (va, GstBuffer *); + } + + gst_structure_set_value (structure, field, &array); + g_value_unset (&array); + + return caps; +} + +static GstFlowReturn +gst_speex_enc_handle_frame (GstAudioEncoder * benc, GstBuffer * buf) +{ + GstSpeexEnc *enc; + GstFlowReturn ret = GST_FLOW_OK; + + enc = GST_SPEEX_ENC (benc); + + if (!enc->header_sent) { + /* Speex streams begin with two headers; the initial header (with + most of the codec setup parameters) which is mandated by the Ogg + bitstream spec. The second header holds any comment fields. + We merely need to make the headers, then pass them to libspeex + one at a time; libspeex handles the additional Ogg bitstream + constraints */ + GstBuffer *buf1, *buf2; + GstCaps *caps; + guchar *data; + gint data_len; + + /* create header buffer */ + data = (guint8 *) speex_header_to_packet (&enc->header, &data_len); + buf1 = gst_buffer_new (); + GST_BUFFER_DATA (buf1) = GST_BUFFER_MALLOCDATA (buf1) = data; + GST_BUFFER_SIZE (buf1) = data_len; + GST_BUFFER_OFFSET_END (buf1) = 0; + GST_BUFFER_OFFSET (buf1) = 0; + + /* create comment buffer */ + buf2 = gst_speex_enc_create_metadata_buffer (enc); + + /* mark and put on caps */ + caps = gst_caps_new_simple ("audio/x-speex", "rate", G_TYPE_INT, enc->rate, + "channels", G_TYPE_INT, enc->channels, NULL); + caps = _gst_caps_set_buffer_array (caps, "streamheader", buf1, buf2, NULL); + + /* negotiate with these caps */ + GST_DEBUG_OBJECT (enc, "here are the caps: %" GST_PTR_FORMAT, caps); + + gst_buffer_set_caps (buf1, caps); + gst_buffer_set_caps (buf2, caps); + gst_pad_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), caps); + gst_caps_unref (caps); + + /* push out buffers */ + /* store buffers for later pre_push sending */ + g_slist_foreach (enc->headers, (GFunc) gst_buffer_unref, NULL); + enc->headers = NULL; + GST_DEBUG_OBJECT (enc, "storing header buffers"); + enc->headers = g_slist_prepend (enc->headers, buf2); + enc->headers = g_slist_prepend (enc->headers, buf1); + + enc->header_sent = TRUE; + } + + GST_DEBUG_OBJECT (enc, "received buffer %p of %u bytes", buf, + buf ? GST_BUFFER_SIZE (buf) : 0); + + ret = gst_speex_enc_encode (enc, buf); + + return ret; +} + +static GstFlowReturn +gst_speex_enc_pre_push (GstAudioEncoder * benc, GstBuffer ** buffer) +{ + GstSpeexEnc *enc; + GstFlowReturn ret = GST_FLOW_OK; + + enc = GST_SPEEX_ENC (benc); + + /* FIXME 0.11 ? get rid of this special ogg stuff and have it + * put and use 'codec data' in caps like anything else, + * with all the usual out-of-band advantage etc */ + if (G_UNLIKELY (enc->headers)) { + GSList *header = enc->headers; + + /* try to push all of these, if we lose one, might as well lose all */ + while (header) { + if (ret == GST_FLOW_OK) + ret = gst_speex_enc_push_buffer (enc, header->data); + else + gst_speex_enc_push_buffer (enc, header->data); + header = g_slist_next (header); + } + + g_slist_free (enc->headers); + enc->headers = NULL; + } + + return ret; +} + +static void +gst_speex_enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstSpeexEnc *enc; + + enc = GST_SPEEX_ENC (object); + + switch (prop_id) { + case PROP_QUALITY: + g_value_set_float (value, enc->quality); + break; + case PROP_BITRATE: + g_value_set_int (value, enc->bitrate); + break; + case PROP_MODE: + g_value_set_enum (value, enc->mode); + break; + case PROP_VBR: + g_value_set_boolean (value, enc->vbr); + break; + case PROP_ABR: + g_value_set_int (value, enc->abr); + break; + case PROP_VAD: + g_value_set_boolean (value, enc->vad); + break; + case PROP_DTX: + g_value_set_boolean (value, enc->dtx); + break; + case PROP_COMPLEXITY: + g_value_set_int (value, enc->complexity); + break; + case PROP_NFRAMES: + g_value_set_int (value, enc->nframes); + break; + case PROP_LAST_MESSAGE: + g_value_set_string (value, enc->last_message); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_speex_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSpeexEnc *enc; + + enc = GST_SPEEX_ENC (object); + + switch (prop_id) { + case PROP_QUALITY: + enc->quality = g_value_get_float (value); + break; + case PROP_BITRATE: + enc->bitrate = g_value_get_int (value); + break; + case PROP_MODE: + enc->mode = g_value_get_enum (value); + break; + case PROP_VBR: + enc->vbr = g_value_get_boolean (value); + break; + case PROP_ABR: + enc->abr = g_value_get_int (value); + break; + case PROP_VAD: + enc->vad = g_value_get_boolean (value); + break; + case PROP_DTX: + enc->dtx = g_value_get_boolean (value); + break; + case PROP_COMPLEXITY: + enc->complexity = g_value_get_int (value); + break; + case PROP_NFRAMES: + enc->nframes = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/ext/speex/gstspeexenc.h b/ext/speex/gstspeexenc.h new file mode 100644 index 0000000..5cf5cd8 --- /dev/null +++ b/ext/speex/gstspeexenc.h @@ -0,0 +1,102 @@ +/* GStreamer Speex Encoder + * Copyright (C) <1999> Erik Walthinsen + * + * 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_SPEEX_ENC_H__ +#define __GST_SPEEX_ENC_H__ + + +#include +#include + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SPEEX_ENC \ + (gst_speex_enc_get_type()) +#define GST_SPEEX_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPEEX_ENC,GstSpeexEnc)) +#define GST_SPEEX_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPEEX_ENC,GstSpeexEncClass)) +#define GST_IS_SPEEX_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPEEX_ENC)) +#define GST_IS_SPEEX_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEX_ENC)) + +typedef enum +{ + GST_SPEEX_ENC_MODE_AUTO, + GST_SPEEX_ENC_MODE_UWB, + GST_SPEEX_ENC_MODE_WB, + GST_SPEEX_ENC_MODE_NB +} GstSpeexMode; + +typedef struct _GstSpeexEnc GstSpeexEnc; +typedef struct _GstSpeexEncClass GstSpeexEncClass; + +struct _GstSpeexEnc { + GstAudioEncoder element; + + SpeexBits bits; + SpeexHeader header; +#ifdef SPEEX_1_0 + SpeexMode *speex_mode; +#else + const SpeexMode *speex_mode; +#endif + void *state; + + /* properties */ + GstSpeexMode mode; + gfloat quality; + gint bitrate; + gboolean vbr; + gint abr; + gboolean vad; + gboolean dtx; + gint complexity; + gint nframes; + gchar *last_message; + + gint channels; + gint rate; + + gboolean header_sent; + GSList *headers; + + GstTagList *tags; + + gint frame_size; + gint lookahead; + + guint8 *comments; + gint comment_len; +}; + +struct _GstSpeexEncClass { + GstAudioEncoderClass parent_class; +}; + +GType gst_speex_enc_get_type (void); + +G_END_DECLS + +#endif /* __GST_SPEEXENC_H__ */ diff --git a/ext/taglib/Makefile.am b/ext/taglib/Makefile.am new file mode 100644 index 0000000..75459c5 --- /dev/null +++ b/ext/taglib/Makefile.am @@ -0,0 +1,19 @@ +plugin_LTLIBRARIES = libgsttaglib.la + +libgsttaglib_la_SOURCES = gsttaglibmux.c gstid3v2mux.cc gstapev2mux.cc +libgsttaglib_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(TAGLIB_CFLAGS) +libgsttaglib_la_CXXFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CXXFLAGS) \ + $(TAGLIB_CXXFLAGS) +libgsttaglib_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ + $(GST_LIBS) \ + $(TAGLIB_LIBS) +libgsttaglib_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgsttaglib_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gsttaglibmux.h gstid3v2mux.h gstapev2mux.h diff --git a/ext/taglib/Makefile.in b/ext/taglib/Makefile.in new file mode 100644 index 0000000..4d907c2 --- /dev/null +++ b/ext/taglib/Makefile.in @@ -0,0 +1,872 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/taglib +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgsttaglib_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgsttaglib_la_OBJECTS = libgsttaglib_la-gsttaglibmux.lo \ + libgsttaglib_la-gstid3v2mux.lo libgsttaglib_la-gstapev2mux.lo +libgsttaglib_la_OBJECTS = $(am_libgsttaglib_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgsttaglib_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CXXLD) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) \ + $(libgsttaglib_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgsttaglib_la_SOURCES) +DIST_SOURCES = $(libgsttaglib_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgsttaglib.la +libgsttaglib_la_SOURCES = gsttaglibmux.c gstid3v2mux.cc gstapev2mux.cc +libgsttaglib_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(TAGLIB_CFLAGS) + +libgsttaglib_la_CXXFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CXXFLAGS) \ + $(TAGLIB_CXXFLAGS) + +libgsttaglib_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ + $(GST_LIBS) \ + $(TAGLIB_LIBS) + +libgsttaglib_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgsttaglib_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gsttaglibmux.h gstid3v2mux.h gstapev2mux.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .cc .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/taglib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/taglib/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgsttaglib.la: $(libgsttaglib_la_OBJECTS) $(libgsttaglib_la_DEPENDENCIES) $(EXTRA_libgsttaglib_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libgsttaglib_la_LINK) -rpath $(plugindir) $(libgsttaglib_la_OBJECTS) $(libgsttaglib_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttaglib_la-gstapev2mux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttaglib_la-gstid3v2mux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttaglib_la-gsttaglibmux.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgsttaglib_la-gsttaglibmux.lo: gsttaglibmux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CFLAGS) $(CFLAGS) -MT libgsttaglib_la-gsttaglibmux.lo -MD -MP -MF $(DEPDIR)/libgsttaglib_la-gsttaglibmux.Tpo -c -o libgsttaglib_la-gsttaglibmux.lo `test -f 'gsttaglibmux.c' || echo '$(srcdir)/'`gsttaglibmux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttaglib_la-gsttaglibmux.Tpo $(DEPDIR)/libgsttaglib_la-gsttaglibmux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttaglibmux.c' object='libgsttaglib_la-gsttaglibmux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CFLAGS) $(CFLAGS) -c -o libgsttaglib_la-gsttaglibmux.lo `test -f 'gsttaglibmux.c' || echo '$(srcdir)/'`gsttaglibmux.c + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +libgsttaglib_la-gstid3v2mux.lo: gstid3v2mux.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) -MT libgsttaglib_la-gstid3v2mux.lo -MD -MP -MF $(DEPDIR)/libgsttaglib_la-gstid3v2mux.Tpo -c -o libgsttaglib_la-gstid3v2mux.lo `test -f 'gstid3v2mux.cc' || echo '$(srcdir)/'`gstid3v2mux.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttaglib_la-gstid3v2mux.Tpo $(DEPDIR)/libgsttaglib_la-gstid3v2mux.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gstid3v2mux.cc' object='libgsttaglib_la-gstid3v2mux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) -c -o libgsttaglib_la-gstid3v2mux.lo `test -f 'gstid3v2mux.cc' || echo '$(srcdir)/'`gstid3v2mux.cc + +libgsttaglib_la-gstapev2mux.lo: gstapev2mux.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) -MT libgsttaglib_la-gstapev2mux.lo -MD -MP -MF $(DEPDIR)/libgsttaglib_la-gstapev2mux.Tpo -c -o libgsttaglib_la-gstapev2mux.lo `test -f 'gstapev2mux.cc' || echo '$(srcdir)/'`gstapev2mux.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttaglib_la-gstapev2mux.Tpo $(DEPDIR)/libgsttaglib_la-gstapev2mux.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gstapev2mux.cc' object='libgsttaglib_la-gstapev2mux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) -c -o libgsttaglib_la-gstapev2mux.lo `test -f 'gstapev2mux.cc' || echo '$(srcdir)/'`gstapev2mux.cc + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/taglib/gstapev2mux.cc b/ext/taglib/gstapev2mux.cc new file mode 100644 index 0000000..c99a31f --- /dev/null +++ b/ext/taglib/gstapev2mux.cc @@ -0,0 +1,373 @@ +/* GStreamer taglib-based APEv2 muxer + * Copyright (C) 2006 Christophe Fergeau + * Copyright (C) 2006 Tim-Philipp Müller + * Copyright (C) 2006 Sebastian Dröge + * + * 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-apev2mux + * @see_also: #GstTagSetter + * + * This element adds APEv2 tags to the beginning of a stream using the taglib + * library. + * + * 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). + * + * + * Example pipelines + * |[ + * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! apev2mux ! filesink location=foo.mp3 + * ]| A pipeline that transcodes a file from Ogg/Vorbis to mp3 format with an + * APEv2 that contains the same as the the Ogg/Vorbis file. Make sure the + * Ogg/Vorbis file actually has comments to preserve. + * |[ + * gst-launch -m filesrc location=foo.mp3 ! apedemux ! fakesink silent=TRUE 2> /dev/null | grep taglist + * ]| Verify that tags have been written. + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gstapev2mux.h" + +#include + +#include +#include + +using namespace TagLib; + +GST_DEBUG_CATEGORY_STATIC (gst_apev2_mux_debug); +#define GST_CAT_DEFAULT gst_apev2_mux_debug + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-apetag")); + +GST_BOILERPLATE (GstApev2Mux, gst_apev2_mux, GstTagLibMux, + GST_TYPE_TAG_LIB_MUX); + +static GstBuffer *gst_apev2_mux_render_tag (GstTagLibMux * mux, + GstTagList * taglist); + +static void +gst_apev2_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, + "TagLib-based APEv2 Muxer", "Formatter/Metadata", + "Adds an APEv2 header to the beginning of files using taglib", + "Sebastian Dröge "); + + GST_DEBUG_CATEGORY_INIT (gst_apev2_mux_debug, "apev2mux", 0, + "taglib-based APEv2 tag muxer"); +} + +static void +gst_apev2_mux_class_init (GstApev2MuxClass * klass) +{ + GST_TAG_LIB_MUX_CLASS (klass)->render_tag = + GST_DEBUG_FUNCPTR (gst_apev2_mux_render_tag); +} + +static void +gst_apev2_mux_init (GstApev2Mux * apev2mux, GstApev2MuxClass * apev2mux_class) +{ + /* nothing to do */ +} + +static void +add_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) +{ + APE::Tag * apev2tag = (APE::Tag *) user_data; + gboolean result; + + /* FIXME: if there are several values set for the same tag, this won't + * work, only the first value will be taken into account + */ + if (strcmp (tag, GST_TAG_TITLE) == 0) { + const char *title; + + result = gst_tag_list_peek_string_index (list, tag, 0, &title); + if (result != FALSE) { + GST_DEBUG ("Setting title to %s", title); + apev2tag->setTitle (String (title, String::UTF8)); + } + } else if (strcmp (tag, GST_TAG_ALBUM) == 0) { + const char *album; + + result = gst_tag_list_peek_string_index (list, tag, 0, &album); + if (result != FALSE) { + GST_DEBUG ("Setting album to %s", album); + apev2tag->setAlbum (String (album, String::UTF8)); + } + } else if (strcmp (tag, GST_TAG_ARTIST) == 0) { + const char *artist; + + result = gst_tag_list_peek_string_index (list, tag, 0, &artist); + if (result != FALSE) { + GST_DEBUG ("Setting artist to %s", artist); + apev2tag->setArtist (String (artist, String::UTF8)); + } + } else if (strcmp (tag, GST_TAG_COMPOSER) == 0) { + const char *composer; + + result = gst_tag_list_peek_string_index (list, tag, 0, &composer); + if (result != FALSE) { + GST_DEBUG ("Setting composer to %s", composer); + apev2tag->addValue (String ("COMPOSER", String::UTF8), + String (composer, String::UTF8)); + } + } else if (strcmp (tag, GST_TAG_GENRE) == 0) { + const char *genre; + + result = gst_tag_list_peek_string_index (list, tag, 0, &genre); + if (result != FALSE) { + GST_DEBUG ("Setting genre to %s", genre); + apev2tag->setGenre (String (genre, String::UTF8)); + } + } else if (strcmp (tag, GST_TAG_COMMENT) == 0) { + const char *comment; + + result = gst_tag_list_peek_string_index (list, tag, 0, &comment); + if (result != FALSE) { + GST_DEBUG ("Setting comment to %s", comment); + apev2tag->setComment (String (comment, String::UTF8)); + } + } else if (strcmp (tag, GST_TAG_DATE) == 0) { + GDate *date; + + result = gst_tag_list_get_date_index (list, tag, 0, &date); + if (result != FALSE) { + GDateYear year; + + year = g_date_get_year (date); + GST_DEBUG ("Setting track year to %d", year); + apev2tag->setYear (year); + g_date_free (date); + } + } else if (strcmp (tag, GST_TAG_TRACK_NUMBER) == 0) { + guint track_number; + + result = gst_tag_list_get_uint_index (list, tag, 0, &track_number); + if (result != FALSE) { + guint total_tracks; + + result = gst_tag_list_get_uint_index (list, GST_TAG_TRACK_COUNT, + 0, &total_tracks); + if (result) { + gchar *tag_str; + + tag_str = g_strdup_printf ("%d/%d", track_number, total_tracks); + GST_DEBUG ("Setting track number to %s", tag_str); + apev2tag->addValue (String ("TRACK", String::UTF8), + String (tag_str, String::UTF8), true); + g_free (tag_str); + } else { + GST_DEBUG ("Setting track number to %d", track_number); + apev2tag->setTrack (track_number); + } + } + } else if (strcmp (tag, GST_TAG_TRACK_COUNT) == 0) { + guint n; + + if (gst_tag_list_get_uint_index (list, GST_TAG_TRACK_NUMBER, 0, &n)) { + GST_DEBUG ("track-count handled with track-number, skipping"); + } else if (gst_tag_list_get_uint_index (list, GST_TAG_TRACK_COUNT, 0, &n)) { + gchar *tag_str; + + tag_str = g_strdup_printf ("0/%d", n); + GST_DEBUG ("Setting track number to %s", tag_str); + apev2tag->addValue (String ("TRACK", String::UTF8), + String (tag_str, String::UTF8), true); + g_free (tag_str); + } +#if 0 + } else if (strcmp (tag, GST_TAG_ALBUM_VOLUME_NUMBER) == 0) { + guint volume_number; + + result = gst_tag_list_get_uint_index (list, tag, 0, &volume_number); + + if (result != FALSE) { + guint volume_count; + gchar *tag_str; + + result = gst_tag_list_get_uint_index (list, GST_TAG_ALBUM_VOLUME_COUNT, + 0, &volume_count); + + if (result) { + tag_str = g_strdup_printf ("CD %d/%d", volume_number, volume_count); + } else { + tag_str = g_strdup_printf ("CD %d", volume_number); + } + + GST_DEBUG ("Setting album number to %s", tag_str); + + apev2tag->addValue (String ("MEDIA", String::UTF8), + String (tag_str, String::UTF8), true); + g_free (tag_str); + } + } else if (strcmp (tag, GST_TAG_ALBUM_VOLUME_COUNT) == 0) { + guint n; + + if (gst_tag_list_get_uint_index (list, GST_TAG_ALBUM_VOLUME_NUMBER, 0, &n)) { + GST_DEBUG ("volume-count handled with volume-number, skipping"); + } else if (gst_tag_list_get_uint_index (list, GST_TAG_ALBUM_VOLUME_COUNT, + 0, &n)) { + gchar *tag_str; + + tag_str = g_strdup_printf ("CD 0/%u", n); + GST_DEBUG ("Setting album volume number/count to %s", tag_str); + + apev2tag->addValue (String ("MEDIA", String::UTF8), + String (tag_str, String::UTF8), true); + g_free (tag_str); + } +#endif + } else if (strcmp (tag, GST_TAG_COPYRIGHT) == 0) { + const gchar *copyright; + + result = gst_tag_list_peek_string_index (list, tag, 0, ©right); + + if (result != FALSE) { + GST_DEBUG ("Setting copyright to %s", copyright); + apev2tag->addValue (String ("COPYRIGHT", String::UTF8), + String (copyright, String::UTF8), true); + } + } else if (strcmp (tag, GST_TAG_LOCATION) == 0) { + const gchar *location; + + result = gst_tag_list_peek_string_index (list, tag, 0, &location); + + if (result != FALSE) { + GST_DEBUG ("Setting location to %s", location); + apev2tag->addValue (String ("FILE", String::UTF8), + String (location, String::UTF8), true); + } + } else if (strcmp (tag, GST_TAG_ISRC) == 0) { + const gchar *isrc; + + result = gst_tag_list_peek_string_index (list, tag, 0, &isrc); + + if (result != FALSE) { + GST_DEBUG ("Setting ISRC to %s", isrc); + apev2tag->addValue (String ("ISRC", String::UTF8), + String (isrc, String::UTF8), true); + } + } else if (strcmp (tag, GST_TAG_TRACK_GAIN) == 0) { + gdouble value; + + result = gst_tag_list_get_double_index (list, tag, 0, &value); + + if (result != FALSE) { + gchar *track_gain = (gchar *) g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); + + track_gain = g_ascii_dtostr (track_gain, G_ASCII_DTOSTR_BUF_SIZE, value); + GST_DEBUG ("Setting track gain to %s", track_gain); + apev2tag->addValue (String ("REPLAYGAIN_TRACK_GAIN", + String::UTF8), String (track_gain, String::UTF8), true); + g_free (track_gain); + } + } else if (strcmp (tag, GST_TAG_TRACK_PEAK) == 0) { + gdouble value; + + result = gst_tag_list_get_double_index (list, tag, 0, &value); + + if (result != FALSE) { + gchar *track_peak = (gchar *) g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); + + track_peak = g_ascii_dtostr (track_peak, G_ASCII_DTOSTR_BUF_SIZE, value); + GST_DEBUG ("Setting track peak to %s", track_peak); + apev2tag->addValue (String ("REPLAYGAIN_TRACK_PEAK", + String::UTF8), String (track_peak, String::UTF8), true); + g_free (track_peak); + } + } else if (strcmp (tag, GST_TAG_ALBUM_GAIN) == 0) { + gdouble value; + + result = gst_tag_list_get_double_index (list, tag, 0, &value); + + if (result != FALSE) { + gchar *album_gain = (gchar *) g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); + + album_gain = g_ascii_dtostr (album_gain, G_ASCII_DTOSTR_BUF_SIZE, value); + GST_DEBUG ("Setting album gain to %s", album_gain); + apev2tag->addValue (String ("REPLAYGAIN_ALBUM_GAIN", + String::UTF8), String (album_gain, String::UTF8), true); + g_free (album_gain); + } + } else if (strcmp (tag, GST_TAG_ALBUM_PEAK) == 0) { + gdouble value; + + result = gst_tag_list_get_double_index (list, tag, 0, &value); + + if (result != FALSE) { + gchar *album_peak = (gchar *) g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); + + album_peak = g_ascii_dtostr (album_peak, G_ASCII_DTOSTR_BUF_SIZE, value); + GST_DEBUG ("Setting album peak to %s", album_peak); + apev2tag->addValue (String ("REPLAYGAIN_ALBUM_PEAK", + String::UTF8), String (album_peak, String::UTF8), true); + g_free (album_peak); + } + } else { + GST_WARNING ("Unsupported tag: %s", tag); + } +} + +static GstBuffer * +gst_apev2_mux_render_tag (GstTagLibMux * mux, GstTagList * taglist) +{ + APE::Tag apev2tag; + ByteVector rendered_tag; + GstBuffer *buf; + guint tag_size; + + /* Render the tag */ + gst_tag_list_foreach (taglist, add_one_tag, &apev2tag); + + rendered_tag = apev2tag.render (); + tag_size = rendered_tag.size (); + + GST_LOG_OBJECT (mux, "tag size = %d bytes", tag_size); + + /* Create buffer with tag */ + buf = gst_buffer_new_and_alloc (tag_size); + memcpy (GST_BUFFER_DATA (buf), rendered_tag.data (), tag_size); + gst_buffer_set_caps (buf, GST_PAD_CAPS (mux->srcpad)); + + return buf; +} + +gboolean +gst_apev2_mux_plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "apev2mux", GST_RANK_NONE, + GST_TYPE_APEV2_MUX)) + return FALSE; + + return TRUE; +} diff --git a/ext/taglib/gstapev2mux.h b/ext/taglib/gstapev2mux.h new file mode 100644 index 0000000..8dd9333 --- /dev/null +++ b/ext/taglib/gstapev2mux.h @@ -0,0 +1,55 @@ +/* GStreamer taglib-based APEv2 muxer + * Copyright (C) 2006 Christophe Fergeau + * Copyright (C) 2006 Tim-Philipp Müller + * Copyright (C) 2006 Sebastian Dröge + * + * 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_APEV2_MUX_H +#define GST_APEV2_MUX_H + +#include "gsttaglibmux.h" + +G_BEGIN_DECLS + +typedef struct _GstApev2Mux GstApev2Mux; +typedef struct _GstApev2MuxClass GstApev2MuxClass; + +struct _GstApev2Mux { + GstTagLibMux taglibmux; +}; + +struct _GstApev2MuxClass { + GstTagLibMuxClass taglibmux_class; +}; + +#define GST_TYPE_APEV2_MUX \ + (gst_apev2_mux_get_type()) +#define GST_APEV2_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_APEV2_MUX,GstApev2Mux)) +#define GST_APEV2_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_APEV2_MUX,GstApev2MuxClass)) +#define GST_IS_APEV2_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_APEV2_MUX)) +#define GST_IS_APEV2_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_APEV2_MUX)) + +GType gst_apev2_mux_get_type (void); + +G_END_DECLS + +#endif /* GST_APEV2_MUX_H */ diff --git a/ext/taglib/gstid3v2mux.cc b/ext/taglib/gstid3v2mux.cc new file mode 100644 index 0000000..2b5042e --- /dev/null +++ b/ext/taglib/gstid3v2mux.cc @@ -0,0 +1,775 @@ +/* GStreamer taglib-based ID3v2 muxer + * Copyright (C) 2006 Christophe Fergeau + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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-id3v2mux + * @see_also: #GstID3Demux, #GstTagSetter + * + * This element adds ID3v2 tags to the beginning of a stream using the taglib + * library. More precisely, the tags written are ID3 version 2.4.0 tags (which + * means in practice that some hardware players or outdated programs might not + * be able to read them properly). + * + * 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). + * + * + * Example pipelines + * |[ + * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! id3v2mux ! filesink location=foo.mp3 + * ]| A pipeline that transcodes a file from Ogg/Vorbis to mp3 format with an + * ID3v2 that contains the same 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> /dev/null | grep taglist + * ]| Verify that tags have been written. + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gstid3v2mux.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace TagLib; + +GST_DEBUG_CATEGORY_STATIC (gst_id3v2_mux_debug); +#define GST_CAT_DEFAULT gst_id3v2_mux_debug + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-id3")); + + +GST_BOILERPLATE (GstId3v2Mux, gst_id3v2_mux, GstTagLibMux, + GST_TYPE_TAG_LIB_MUX); + +static GstBuffer *gst_id3v2_mux_render_tag (GstTagLibMux * mux, + GstTagList * taglist); + +static void +gst_id3v2_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, + "TagLib-based ID3v2 Muxer", "Formatter/Metadata", + "Adds an ID3v2 header to the beginning of MP3 files using taglib", + "Christophe Fergeau "); + + GST_DEBUG_CATEGORY_INIT (gst_id3v2_mux_debug, "id3v2mux", 0, + "taglib-based ID3v2 tag muxer"); +} + +static void +gst_id3v2_mux_class_init (GstId3v2MuxClass * klass) +{ + GST_TAG_LIB_MUX_CLASS (klass)->render_tag = + GST_DEBUG_FUNCPTR (gst_id3v2_mux_render_tag); +} + +static void +gst_id3v2_mux_init (GstId3v2Mux * id3v2mux, GstId3v2MuxClass * id3v2mux_class) +{ + /* nothing to do */ +} + +#if 0 +static void +add_one_txxx_tag (ID3v2::Tag * id3v2tag, const gchar * key, const gchar * val) +{ + ID3v2::UserTextIdentificationFrame * frame; + + if (val == NULL) + return; + + GST_DEBUG ("Setting %s to %s", key, val); + frame = new ID3v2::UserTextIdentificationFrame (String::UTF8); + id3v2tag->addFrame (frame); + frame->setDescription (key); + frame->setText (val); +} +#endif + +typedef void (*GstId3v2MuxAddTagFunc) (ID3v2::Tag * id3v2tag, + const GstTagList * list, + const gchar * tag, guint num_tags, const gchar * data); + +static void +add_encoder_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, + const gchar * tag, guint num_tags, const gchar * unused) +{ + TagLib::StringList string_list; + guint n; + + /* ENCODER_VERSION is either handled with the ENCODER tag or not at all */ + if (strcmp (tag, GST_TAG_ENCODER_VERSION) == 0) + return; + + 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); + string_list.append (String (s, String::UTF8)); + g_free (s); + g_free (encoder); + } + } + + if (!string_list.isEmpty ()) { + ID3v2::TextIdentificationFrame * f; + + f = new ID3v2::TextIdentificationFrame ("TSSE", String::UTF8); + id3v2tag->addFrame (f); + f->setText (string_list); + } else { + GST_WARNING ("Empty list for tag %s, skipping", tag); + } +} + +static void +add_date_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, + const gchar * tag, guint num_tags, const gchar * unused) +{ + TagLib::StringList string_list; + guint n; + + GST_LOG ("Adding date frame"); + + 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); + string_list.append (String (s, String::UTF8)); + g_free (s); + } else { + GST_WARNING ("invalid year %u, skipping", year); + } + + g_date_free (date); + } + } + + if (!string_list.isEmpty ()) { + ID3v2::TextIdentificationFrame * f; + + f = new ID3v2::TextIdentificationFrame ("TDRC", String::UTF8); + id3v2tag->addFrame (f); + f->setText (string_list); + } else { + GST_WARNING ("Empty list for tag %s, skipping", tag); + } +} + +static void +add_count_or_num_tag (ID3v2::Tag * 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)) { + ID3v2::TextIdentificationFrame * frame; + 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); + frame = new ID3v2::TextIdentificationFrame (frame_id, String::UTF8); + id3v2tag->addFrame (frame); + frame->setText (tag_str); + 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)) { + ID3v2::TextIdentificationFrame * frame; + gchar *tag_str; + + tag_str = g_strdup_printf ("0/%u", count); + GST_DEBUG ("Setting %s to %s (frame_id = %s)", tag, tag_str, frame_id); + frame = new ID3v2::TextIdentificationFrame (frame_id, String::UTF8); + id3v2tag->addFrame (frame); + frame->setText (tag_str); + g_free (tag_str); + } + } + + if (num_tags > 1) { + GST_WARNING ("more than one %s, can only handle one", tag); + } +} + +static void +add_unique_file_id_tag (ID3v2::Tag * 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) { + ID3v2::UniqueFileIdentifierFrame * frame; + + GST_LOG ("Adding %s (%s): %s", tag, origin, id_str); + frame = new ID3v2::UniqueFileIdentifierFrame (origin, id_str); + id3v2tag->addFrame (frame); + g_free (id_str); + } +} + +static void +add_musicbrainz_tag (ID3v2::Tag * 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) { + ID3v2::UserTextIdentificationFrame * frame; + gchar *id_str; + + if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) { + GST_DEBUG ("Setting '%s' to '%s'", mb_ids[idx].spec_id, 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 */ + frame = new ID3v2::UserTextIdentificationFrame (String::Latin1); + id3v2tag->addFrame (frame); + frame->setDescription (mb_ids[idx].spec_id); + frame->setText (id_str); + + frame = new ID3v2::UserTextIdentificationFrame (String::Latin1); + id3v2tag->addFrame (frame); + frame->setDescription (mb_ids[idx].realworld_id); + frame->setText (id_str); + + g_free (id_str); + } + } +} + +static void +add_id3v2frame_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, + const gchar * tag, guint num_tags, const gchar * frame_id) +{ + ID3v2::FrameFactory * factory = ID3v2::FrameFactory::instance (); + guint i; + + for (i = 0; i < num_tags; ++i) { + ID3v2::Frame * frame; + 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); + if (s && gst_structure_get_int (s, "version", &version) && version > 0) { + ByteVector bytes ((char *) GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + + GST_DEBUG ("Injecting ID3v2.%u frame %u/%u of length %u and type %" + GST_PTR_FORMAT, version, i, num_tags, GST_BUFFER_SIZE (buf), s); + + frame = factory->createFrame (bytes, (TagLib::uint) version); + if (frame) + id3v2tag->addFrame (frame); + } + } + } +} + +static void +add_image_tag (ID3v2::Tag * 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) { + ID3v2::AttachedPictureFrame * frame; + const gchar *desc; + + if (strcmp (mime_type, "text/uri-list") == 0) + mime_type = "-->"; + + frame = new ID3v2::AttachedPictureFrame (); + + GST_DEBUG ("Attaching picture of %u bytes and mime type %s", + GST_BUFFER_SIZE (image), mime_type); + + id3v2tag->addFrame (frame); + frame->setPicture (ByteVector ((const char *) GST_BUFFER_DATA (image), + GST_BUFFER_SIZE (image))); + frame->setTextEncoding (String::UTF8); + frame->setMimeType (mime_type); + + desc = gst_structure_get_string (s, "image-description"); + frame->setDescription ((desc) ? desc : ""); + + /* FIXME set image type properly from caps */ + if (strcmp (tag, GST_TAG_PREVIEW_IMAGE) == 0) { + frame->setType (ID3v2::AttachedPictureFrame::FileIcon); + } else { + frame->setType (ID3v2::AttachedPictureFrame::Other); + } + } + } 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_comment_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, + const gchar * tag, guint num_tags, const gchar * unused) +{ + TagLib::StringList string_list; + 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) { + ID3v2::CommentsFrame * f; + gchar *desc = NULL, *val = NULL, *lang = NULL; + + f = new ID3v2::CommentsFrame (String::UTF8); + + if (strcmp (tag, GST_TAG_COMMENT) == 0 || + !gst_tag_parse_extended_comment (s, &desc, &lang, &val, TRUE)) { + /* create dummy description to allow for multiple comment frames + * (taglib will drop comment frames if descriptions are not unique) */ + desc = g_strdup_printf ("c%u", n); + val = g_strdup (s); + } + + GST_LOG ("%s[%u] = '%s' (%s|%s|%s)", tag, n, s, GST_STR_NULL (desc), + GST_STR_NULL (lang), GST_STR_NULL (val)); + + f->setDescription (desc); + f->setText (val); + if (lang) { + f->setLanguage (lang); + } + + g_free (lang); + g_free (desc); + g_free (val); + + id3v2tag->addFrame (f); + } + g_free (s); + } +} + +static void +add_text_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, + const gchar * tag, guint num_tags, const gchar * frame_id) +{ + ID3v2::TextIdentificationFrame * f; + TagLib::StringList string_list; + guint n; + + GST_LOG ("Adding '%s' frame", frame_id); + for (n = 0; n < num_tags; ++n) { + gchar *s = NULL; + + if (gst_tag_list_get_string_index (list, tag, n, &s) && s != NULL) { + GST_LOG ("%s: %s[%u] = '%s'", frame_id, tag, n, s); + string_list.append (String (s, String::UTF8)); + g_free (s); + } + } + + if (!string_list.isEmpty ()) { + f = new ID3v2::TextIdentificationFrame (frame_id, String::UTF8); + id3v2tag->addFrame (f); + f->setText (string_list); + } else { + GST_WARNING ("Empty list for tag %s, skipping", tag); + } +} + +static void +add_uri_tag (ID3v2::Tag * 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)) { + ID3v2::FrameFactory * factory = ID3v2::FrameFactory::instance (); + ID3v2::Frame * frame; + char *data; + + data = g_new0 (char, 10 + url_len); + + memcpy (data, frame_id, 4); + memcpy (data + 4, ID3v2::SynchData::fromUInt (url_len).data (), 4); + memcpy (data + 10, url, url_len); + ByteVector bytes (data, 10 + url_len); + + g_free (data); + + frame = factory->createFrame (bytes, (TagLib::uint) 4); + if (frame) { + id3v2tag->addFrame (frame); + + GST_LOG ("%s: %s = '%s'", frame_id, tag, url); + } + } else { + GST_WARNING ("Tag %s does not contain a valid URI (%s)", tag, url); + } + + g_free (url); + } +} + +static void +add_relative_volume_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, + const gchar * tag, guint num_tags, const gchar * frame_id) +{ + const char *gain_tag_name; + const char *peak_tag_name; + gdouble peak_val; + gdouble gain_val; + ID3v2::RelativeVolumeFrame * frame; + + frame = new ID3v2::RelativeVolumeFrame (); + + /* 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; + frame->setIdentification ("track"); + GST_DEBUG ("adding track relative-volume frame"); + } else { + gain_tag_name = GST_TAG_ALBUM_GAIN; + peak_tag_name = GST_TAG_ALBUM_PEAK; + frame->setIdentification ("album"); + 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) { + ID3v2::RelativeVolumeFrame::PeakVolume encoded_peak; + short peak_int; + + 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); + frame->setVolumeAdjustment (gain_val); + } + + /* copying mutagen: always write as 16 bits for sanity. */ + peak_int = (short)(peak_val * G_MAXSHORT); + encoded_peak.bitsRepresentingPeak = 16; + encoded_peak.peakVolume = ByteVector::fromShort(peak_int, true); + GST_DEBUG ("setting peak value %g", peak_val); + frame->setPeakVolume(encoded_peak); + + } else { + gst_tag_list_get_double (list, tag, &gain_val); + GST_DEBUG ("setting volume adjustment %g", gain_val); + frame->setVolumeAdjustment (gain_val); + + 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"); + delete frame; + return; + } + } + + id3v2tag->addFrame (frame); +} + +static void +add_bpm_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, + const gchar * tag, guint num_tags, const gchar * frame_id) +{ + gdouble bpm; + + if (gst_tag_list_get_double_index (list, tag, 0, &bpm)) { + ID3v2::TextIdentificationFrame * frame; + gchar *tag_str; + + tag_str = g_strdup_printf ("%u", (guint)bpm); + + GST_DEBUG ("Setting %s to %s", tag, tag_str); + frame = new ID3v2::TextIdentificationFrame ("TBPM", String::UTF8); + id3v2tag->addFrame (frame); + frame->setText (tag_str); + g_free (tag_str); + } +} + +/* 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 GstId3v2MuxAddTagFunc func; + const gchar data[5]; +} add_funcs[] = { + { + GST_TAG_ARTIST, add_text_tag, "TPE1"}, { + GST_TAG_ALBUM_ARTIST, add_text_tag, "TPE2"}, { + 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"}, { + GST_TAG_COMMENT, add_comment_tag, ""}, { + GST_TAG_EXTENDED_COMMENT, add_comment_tag, ""}, { + GST_TAG_DATE, add_date_tag, ""}, { + GST_TAG_IMAGE, add_image_tag, ""}, { + GST_TAG_PREVIEW_IMAGE, add_image_tag, ""}, { + GST_ID3_DEMUX_TAG_ID3V2_FRAME, add_id3v2frame_tag, ""}, { + 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, ""}, { + GST_TAG_ARTIST_SORTNAME, add_text_tag, "TSOP"}, { + GST_TAG_ALBUM_SORTNAME, add_text_tag, "TSOA"}, { + GST_TAG_TITLE_SORTNAME, add_text_tag, "TSOT"}, { + 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"}, { + GST_TAG_ENCODER, add_encoder_tag, ""}, { + GST_TAG_ENCODER_VERSION, add_encoder_tag, ""}, { + GST_TAG_COPYRIGHT_URI, add_uri_tag, "WCOP"}, { + GST_TAG_LICENSE_URI, add_uri_tag, "WCOP"}, { + GST_TAG_TRACK_PEAK, add_relative_volume_tag, ""}, { + GST_TAG_TRACK_GAIN, add_relative_volume_tag, ""}, { + GST_TAG_ALBUM_PEAK, add_relative_volume_tag, ""}, { + GST_TAG_ALBUM_GAIN, add_relative_volume_tag, ""}, { + GST_TAG_BEATS_PER_MINUTE, add_bpm_tag, ""} +}; + + +static void +foreach_add_tag (const GstTagList * list, const gchar * tag, gpointer userdata) +{ + ID3v2::Tag * id3v2tag = (ID3v2::Tag *) userdata; + TagLib::StringList string_list; + 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); + } +} + +static GstBuffer * +gst_id3v2_mux_render_tag (GstTagLibMux * mux, GstTagList * taglist) +{ + ID3v2::Tag id3v2tag; + ByteVector rendered_tag; + GstBuffer *buf; + guint tag_size; + + /* write all strings as UTF-8 by default */ + TagLib::ID3v2::FrameFactory::instance ()-> + setDefaultTextEncoding (TagLib::String::UTF8); + + /* Render the tag */ + gst_tag_list_foreach (taglist, foreach_add_tag, &id3v2tag); + +#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 + + rendered_tag = id3v2tag.render (); + tag_size = rendered_tag.size (); + + GST_LOG_OBJECT (mux, "tag size = %d bytes", tag_size); + + /* Create buffer with tag */ + buf = gst_buffer_new_and_alloc (tag_size); + memcpy (GST_BUFFER_DATA (buf), rendered_tag.data (), tag_size); + gst_buffer_set_caps (buf, GST_PAD_CAPS (mux->srcpad)); + + return buf; +} + +gboolean +gst_id3v2_mux_plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "id3v2mux", GST_RANK_NONE, + GST_TYPE_ID3V2_MUX)) + return FALSE; + + gst_tag_register_musicbrainz_tags (); + + return TRUE; +} diff --git a/ext/taglib/gstid3v2mux.h b/ext/taglib/gstid3v2mux.h new file mode 100644 index 0000000..9d47d30 --- /dev/null +++ b/ext/taglib/gstid3v2mux.h @@ -0,0 +1,54 @@ +/* GStreamer taglib-based ID3v2 muxer + * Copyright (C) 2006 Christophe Fergeau + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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_ID3V2_MUX_H +#define GST_ID3V2_MUX_H + +#include "gsttaglibmux.h" + +G_BEGIN_DECLS + +typedef struct _GstId3v2Mux GstId3v2Mux; +typedef struct _GstId3v2MuxClass GstId3v2MuxClass; + +struct _GstId3v2Mux { + GstTagLibMux taglibmux; +}; + +struct _GstId3v2MuxClass { + GstTagLibMuxClass taglibmux_class; +}; + +#define GST_TYPE_ID3V2_MUX \ + (gst_id3v2_mux_get_type()) +#define GST_ID3V2_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ID3V2_MUX,GstId3v2Mux)) +#define GST_ID3V2_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ID3V2_MUX,GstId3v2MuxClass)) +#define GST_IS_ID3V2_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ID3V2_MUX)) +#define GST_IS_ID3V2_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ID3V2_MUX)) + +GType gst_id3v2_mux_get_type (void); + +G_END_DECLS + +#endif /* GST_ID3V2_MUX_H */ diff --git a/ext/taglib/gsttaglibmux.c b/ext/taglib/gsttaglibmux.c new file mode 100644 index 0000000..094bec1 --- /dev/null +++ b/ext/taglib/gsttaglibmux.c @@ -0,0 +1,402 @@ +/* GStreamer taglib-based muxer base class + * Copyright (C) 2006 Christophe Fergeau + * Copyright (C) 2006 Tim-Philipp Müller + * Copyright (C) 2006 Sebastian Dröge + + * 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 +#endif + +#include +#include +#include + +#include "gsttaglibmux.h" + +GST_DEBUG_CATEGORY_STATIC (gst_tag_lib_mux_debug); +#define GST_CAT_DEFAULT gst_tag_lib_mux_debug + +static GstStaticPadTemplate gst_tag_lib_mux_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("ANY")); + +static void +gst_tag_lib_mux_iface_init (GType taglib_type) +{ + static const GInterfaceInfo tag_setter_info = { + NULL, + NULL, + NULL + }; + + g_type_add_interface_static (taglib_type, GST_TYPE_TAG_SETTER, + &tag_setter_info); +} + +GST_BOILERPLATE_FULL (GstTagLibMux, gst_tag_lib_mux, + GstElement, GST_TYPE_ELEMENT, gst_tag_lib_mux_iface_init); + + +static GstStateChangeReturn +gst_tag_lib_mux_change_state (GstElement * element, GstStateChange transition); +static GstFlowReturn gst_tag_lib_mux_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_tag_lib_mux_sink_event (GstPad * pad, GstEvent * event); + +static void +gst_tag_lib_mux_finalize (GObject * obj) +{ + GstTagLibMux *mux = GST_TAG_LIB_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; + } + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_tag_lib_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_tag_lib_mux_sink_template); + + GST_DEBUG_CATEGORY_INIT (gst_tag_lib_mux_debug, "taglibmux", 0, + "taglib-based muxer"); +} + +static void +gst_tag_lib_mux_class_init (GstTagLibMuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_tag_lib_mux_finalize; + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_tag_lib_mux_change_state); +} + +static void +gst_tag_lib_mux_init (GstTagLibMux * mux, GstTagLibMuxClass * 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_lib_mux_sink_template, "sink"); + gst_pad_set_chain_function (mux->sinkpad, + GST_DEBUG_FUNCPTR (gst_tag_lib_mux_chain)); + gst_pad_set_event_function (mux->sinkpad, + GST_DEBUG_FUNCPTR (gst_tag_lib_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_tag = TRUE; +} + +static GstBuffer * +gst_tag_lib_mux_render_tag (GstTagLibMux * mux) +{ + GstTagLibMuxClass *klass; + GstTagMergeMode merge_mode; + GstTagSetter *tagsetter; + GstBuffer *buffer; + const GstTagList *tagsetter_tags; + GstTagList *taglist; + GstEvent *event; + + tagsetter = GST_TAG_SETTER (mux); + + 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); + + taglist = gst_tag_list_merge (tagsetter_tags, mux->event_tags, merge_mode); + + GST_LOG_OBJECT (mux, "final tags: %" GST_PTR_FORMAT, taglist); + + klass = GST_TAG_LIB_MUX_CLASS (G_OBJECT_GET_CLASS (mux)); + + if (klass->render_tag == NULL) + goto no_vfunc; + + buffer = klass->render_tag (mux, taglist); + + if (buffer == NULL) + goto render_error; + + mux->tag_size = GST_BUFFER_SIZE (buffer); + GST_LOG_OBJECT (mux, "tag size = %" G_GSIZE_FORMAT " bytes", mux->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 no need to unref it */ + event = gst_event_new_tag (taglist); + gst_pad_push_event (mux->srcpad, event); + + GST_BUFFER_OFFSET (buffer) = 0; + + return buffer; + +no_vfunc: + { + GST_ERROR_OBJECT (mux, "Subclass does not implement render_tag vfunc!"); + gst_tag_list_free (taglist); + return NULL; + } + +render_error: + { + GST_ERROR_OBJECT (mux, "Failed to render tag"); + gst_tag_list_free (taglist); + return NULL; + } +} + +static GstEvent * +gst_tag_lib_mux_adjust_event_offsets (GstTagLibMux * 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->tag_size; + if (stop != -1) + stop += mux->tag_size; + if (cur != -1) + cur += mux->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->tag_size); + + return gst_event_new_new_segment (TRUE, 1.0, format, start, stop, cur); +} + +static GstFlowReturn +gst_tag_lib_mux_chain (GstPad * pad, GstBuffer * buffer) +{ + GstTagLibMux *mux = GST_TAG_LIB_MUX (GST_OBJECT_PARENT (pad)); + + if (mux->render_tag) { + GstFlowReturn ret; + GstBuffer *tag_buffer; + + GST_INFO_OBJECT (mux, "Adding tags to stream"); + tag_buffer = gst_tag_lib_mux_render_tag (mux); + if (tag_buffer == NULL) + goto no_tag_buffer; + ret = gst_pad_push (mux->srcpad, tag_buffer); + 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) { + GST_DEBUG_OBJECT (mux, "sending cached newsegment event"); + gst_pad_push_event (mux->srcpad, + gst_tag_lib_mux_adjust_event_offsets (mux, mux->newsegment_ev)); + gst_event_unref (mux->newsegment_ev); + mux->newsegment_ev = NULL; + } else { + /* upstream sent no newsegment event or only one in a non-BYTE format */ + } + + mux->render_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->tag_size); + GST_BUFFER_OFFSET (buffer) += mux->tag_size; + } + + gst_buffer_set_caps (buffer, GST_PAD_CAPS (mux->srcpad)); + return gst_pad_push (mux->srcpad, buffer); + +/* ERRORS */ +no_tag_buffer: + { + GST_ELEMENT_ERROR (mux, LIBRARY, ENCODE, (NULL), (NULL)); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_tag_lib_mux_sink_event (GstPad * pad, GstEvent * event) +{ + GstTagLibMux *mux; + gboolean result; + + mux = GST_TAG_LIB_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_tag */ + gst_event_unref (event); + result = TRUE; + break; + } + case GST_EVENT_NEWSEGMENT:{ + GstFormat fmt; + + gst_event_parse_new_segment (event, NULL, NULL, &fmt, NULL, 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_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_lib_mux_adjust_event_offsets (mux, event)); + gst_event_unref (event); + } + event = NULL; + result = TRUE; + break; + } + default: + result = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (mux); + + return result; +} + + +static GstStateChangeReturn +gst_tag_lib_mux_change_state (GstElement * element, GstStateChange transition) +{ + GstTagLibMux *mux; + GstStateChangeReturn result; + + mux = GST_TAG_LIB_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->tag_size = 0; + mux->render_tag = TRUE; + break; + } + default: + break; + } + + return result; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return (gst_id3v2_mux_plugin_init (plugin) + && gst_apev2_mux_plugin_init (plugin)); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "taglib", + "Tag writing plug-in based on taglib", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/ext/taglib/gsttaglibmux.h b/ext/taglib/gsttaglibmux.h new file mode 100644 index 0000000..d26ff30 --- /dev/null +++ b/ext/taglib/gsttaglibmux.h @@ -0,0 +1,71 @@ +/* GStreamer taglib-based muxer base class + * Copyright (C) 2006 Christophe Fergeau + * Copyright (C) 2006 Tim-Philipp Müller + + * 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_LIB_MUX_H +#define GST_TAG_LIB_MUX_H + +#include + +G_BEGIN_DECLS + +typedef struct _GstTagLibMux GstTagLibMux; +typedef struct _GstTagLibMuxClass GstTagLibMuxClass; + +/* Definition of structure storing data for this element. */ +struct _GstTagLibMux { + GstElement element; + + GstPad *srcpad; + GstPad *sinkpad; + GstTagList *event_tags; /* tags received from upstream elements */ + gsize tag_size; + gboolean render_tag; + + GstEvent *newsegment_ev; /* cached newsegment event from upstream */ +}; + +/* Standard definition defining a class for this element. */ +struct _GstTagLibMuxClass { + GstElementClass parent_class; + + /* vfuncs */ + GstBuffer * (*render_tag) (GstTagLibMux * mux, GstTagList * tag_list); +}; + +/* Standard macros for defining types for this element. */ +#define GST_TYPE_TAG_LIB_MUX \ + (gst_tag_lib_mux_get_type()) +#define GST_TAG_LIB_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TAG_LIB_MUX,GstTagLibMux)) +#define GST_TAG_LIB_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TAG_LIB_MUX,GstTagLibMuxClass)) +#define GST_IS_TAG_LIB_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TAG_LIB_MUX)) +#define GST_IS_TAG_LIB_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TAG_LIB_MUX)) + +/* Standard function returning type information. */ +GType gst_tag_lib_mux_get_type (void); +gboolean gst_apev2_mux_plugin_init (GstPlugin * plugin); +gboolean gst_id3v2_mux_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif diff --git a/ext/wavpack/Makefile.am b/ext/wavpack/Makefile.am new file mode 100644 index 0000000..70d2431 --- /dev/null +++ b/ext/wavpack/Makefile.am @@ -0,0 +1,24 @@ +plugin_LTLIBRARIES = libgstwavpack.la + +libgstwavpack_la_SOURCES = \ + gstwavpack.c \ + gstwavpackcommon.c \ + gstwavpackparse.c \ + gstwavpackdec.c \ + gstwavpackenc.c \ + gstwavpackstreamreader.c + +libgstwavpack_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(WAVPACK_CFLAGS) +libgstwavpack_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(WAVPACK_LIBS) +libgstwavpack_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstwavpack_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + gstwavpackparse.h \ + gstwavpackdec.h \ + gstwavpackenc.h \ + gstwavpackcommon.h \ + gstwavpackstreamreader.h + diff --git a/ext/wavpack/Makefile.in b/ext/wavpack/Makefile.in new file mode 100644 index 0000000..4eb1dd1 --- /dev/null +++ b/ext/wavpack/Makefile.in @@ -0,0 +1,868 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = ext/wavpack +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstwavpack_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstwavpack_la_OBJECTS = libgstwavpack_la-gstwavpack.lo \ + libgstwavpack_la-gstwavpackcommon.lo \ + libgstwavpack_la-gstwavpackparse.lo \ + libgstwavpack_la-gstwavpackdec.lo \ + libgstwavpack_la-gstwavpackenc.lo \ + libgstwavpack_la-gstwavpackstreamreader.lo +libgstwavpack_la_OBJECTS = $(am_libgstwavpack_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstwavpack_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstwavpack_la_CFLAGS) $(CFLAGS) \ + $(libgstwavpack_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstwavpack_la_SOURCES) +DIST_SOURCES = $(libgstwavpack_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstwavpack.la +libgstwavpack_la_SOURCES = \ + gstwavpack.c \ + gstwavpackcommon.c \ + gstwavpackparse.c \ + gstwavpackdec.c \ + gstwavpackenc.c \ + gstwavpackstreamreader.c + +libgstwavpack_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(WAVPACK_CFLAGS) + +libgstwavpack_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(WAVPACK_LIBS) + +libgstwavpack_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstwavpack_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + gstwavpackparse.h \ + gstwavpackdec.h \ + gstwavpackenc.h \ + gstwavpackcommon.h \ + gstwavpackstreamreader.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/wavpack/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu ext/wavpack/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstwavpack.la: $(libgstwavpack_la_OBJECTS) $(libgstwavpack_la_DEPENDENCIES) $(EXTRA_libgstwavpack_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstwavpack_la_LINK) -rpath $(plugindir) $(libgstwavpack_la_OBJECTS) $(libgstwavpack_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackcommon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackdec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackenc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackparse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackstreamreader.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstwavpack_la-gstwavpack.lo: gstwavpack.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpack.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpack.Tpo -c -o libgstwavpack_la-gstwavpack.lo `test -f 'gstwavpack.c' || echo '$(srcdir)/'`gstwavpack.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpack.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpack.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpack.c' object='libgstwavpack_la-gstwavpack.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpack.lo `test -f 'gstwavpack.c' || echo '$(srcdir)/'`gstwavpack.c + +libgstwavpack_la-gstwavpackcommon.lo: gstwavpackcommon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackcommon.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackcommon.Tpo -c -o libgstwavpack_la-gstwavpackcommon.lo `test -f 'gstwavpackcommon.c' || echo '$(srcdir)/'`gstwavpackcommon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackcommon.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackcommon.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackcommon.c' object='libgstwavpack_la-gstwavpackcommon.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackcommon.lo `test -f 'gstwavpackcommon.c' || echo '$(srcdir)/'`gstwavpackcommon.c + +libgstwavpack_la-gstwavpackparse.lo: gstwavpackparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackparse.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackparse.Tpo -c -o libgstwavpack_la-gstwavpackparse.lo `test -f 'gstwavpackparse.c' || echo '$(srcdir)/'`gstwavpackparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackparse.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackparse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackparse.c' object='libgstwavpack_la-gstwavpackparse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackparse.lo `test -f 'gstwavpackparse.c' || echo '$(srcdir)/'`gstwavpackparse.c + +libgstwavpack_la-gstwavpackdec.lo: gstwavpackdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackdec.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackdec.Tpo -c -o libgstwavpack_la-gstwavpackdec.lo `test -f 'gstwavpackdec.c' || echo '$(srcdir)/'`gstwavpackdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackdec.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackdec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackdec.c' object='libgstwavpack_la-gstwavpackdec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackdec.lo `test -f 'gstwavpackdec.c' || echo '$(srcdir)/'`gstwavpackdec.c + +libgstwavpack_la-gstwavpackenc.lo: gstwavpackenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackenc.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackenc.Tpo -c -o libgstwavpack_la-gstwavpackenc.lo `test -f 'gstwavpackenc.c' || echo '$(srcdir)/'`gstwavpackenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackenc.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackenc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackenc.c' object='libgstwavpack_la-gstwavpackenc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackenc.lo `test -f 'gstwavpackenc.c' || echo '$(srcdir)/'`gstwavpackenc.c + +libgstwavpack_la-gstwavpackstreamreader.lo: gstwavpackstreamreader.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackstreamreader.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackstreamreader.Tpo -c -o libgstwavpack_la-gstwavpackstreamreader.lo `test -f 'gstwavpackstreamreader.c' || echo '$(srcdir)/'`gstwavpackstreamreader.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackstreamreader.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackstreamreader.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackstreamreader.c' object='libgstwavpack_la-gstwavpackstreamreader.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackstreamreader.lo `test -f 'gstwavpackstreamreader.c' || echo '$(srcdir)/'`gstwavpackstreamreader.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ext/wavpack/gstwavpack.c b/ext/wavpack/gstwavpack.c new file mode 100644 index 0000000..b01f443 --- /dev/null +++ b/ext/wavpack/gstwavpack.c @@ -0,0 +1,56 @@ +/* GStreamer wavpack plugin + * (c) 2004 Arwed v. Merkatz + * + * gstwavpack.c: plugin loader + * + * 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 + +#include "gstwavpackparse.h" +#include "gstwavpackdec.h" +#include "gstwavpackenc.h" + +/* debug category for common code */ +GST_DEBUG_CATEGORY (wavpack_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (wavpack_debug, "wavpack", 0, "Wavpack elements"); + +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif + + return (gst_wavpack_parse_plugin_init (plugin) + && gst_wavpack_dec_plugin_init (plugin) + && gst_wavpack_enc_plugin_init (plugin)); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "wavpack", + "Wavpack lossless/lossy audio format handling", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/wavpack/gstwavpackcommon.c b/ext/wavpack/gstwavpackcommon.c new file mode 100644 index 0000000..252b64c --- /dev/null +++ b/ext/wavpack/gstwavpackcommon.c @@ -0,0 +1,282 @@ +/* GStreamer Wavpack plugin + * Copyright (c) 2005 Arwed v. Merkatz + * Copyright (c) 1998 - 2005 Conifer Software + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackcommon.c: common helper functions + * + * 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 "gstwavpackcommon.h" +#include + +#include +#include + +GST_DEBUG_CATEGORY_EXTERN (wavpack_debug); +#define GST_CAT_DEFAULT wavpack_debug + +gboolean +gst_wavpack_read_header (WavpackHeader * header, guint8 * buf) +{ + g_memmove (header, buf, sizeof (WavpackHeader)); + +#ifndef WAVPACK_OLD_API + WavpackLittleEndianToNative (header, (char *) WavpackHeaderFormat); +#else + little_endian_to_native (header, WavpackHeaderFormat); +#endif + + return (memcmp (header->ckID, "wvpk", 4) == 0); +} + +/* inspired by the original one in wavpack */ +gboolean +gst_wavpack_read_metadata (GstWavpackMetadata * wpmd, guint8 * header_data, + guint8 ** p_data) +{ + WavpackHeader hdr; + guint8 *end; + + gst_wavpack_read_header (&hdr, header_data); + end = header_data + hdr.ckSize + 8; + + if (end - *p_data < 2) + return FALSE; + + wpmd->id = GST_READ_UINT8 (*p_data); + wpmd->byte_length = 2 * (guint) GST_READ_UINT8 (*p_data + 1); + + *p_data += 2; + + if ((wpmd->id & ID_LARGE) == ID_LARGE) { + guint extra; + + wpmd->id &= ~ID_LARGE; + + if (end - *p_data < 2) + return FALSE; + + extra = GST_READ_UINT16_LE (*p_data); + wpmd->byte_length += (extra << 9); + *p_data += 2; + } + + if ((wpmd->id & ID_ODD_SIZE) == ID_ODD_SIZE) { + wpmd->id &= ~ID_ODD_SIZE; + --wpmd->byte_length; + } + + if (wpmd->byte_length > 0) { + if (end - *p_data < wpmd->byte_length + (wpmd->byte_length & 1)) { + wpmd->data = NULL; + return FALSE; + } + + wpmd->data = *p_data; + *p_data += wpmd->byte_length + (wpmd->byte_length & 1); + } else { + wpmd->data = NULL; + } + + return TRUE; +} + +gint +gst_wavpack_get_default_channel_mask (gint nchannels) +{ + gint channel_mask = 0; + + /* Set the default channel mask for the given number of channels. + * It's the same as for WAVE_FORMAT_EXTENDED: + * http://www.microsoft.com/whdc/device/audio/multichaud.mspx + */ + switch (nchannels) { + case 11: + channel_mask |= 0x00400; + channel_mask |= 0x00200; + case 9: + channel_mask |= 0x00100; + case 8: + channel_mask |= 0x00080; + channel_mask |= 0x00040; + case 6: + channel_mask |= 0x00020; + channel_mask |= 0x00010; + case 4: + channel_mask |= 0x00008; + case 3: + channel_mask |= 0x00004; + case 2: + channel_mask |= 0x00002; + channel_mask |= 0x00001; + break; + case 1: + /* For mono use front center */ + channel_mask |= 0x00004; + break; + } + + return channel_mask; +} + +static const struct +{ + const guint32 ms_mask; + const GstAudioChannelPosition gst_pos; +} layout_mapping[] = { + { + 0x00001, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, { + 0x00002, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, { + 0x00004, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, { + 0x00008, GST_AUDIO_CHANNEL_POSITION_LFE}, { + 0x00010, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT}, { + 0x00020, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { + 0x00040, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER}, { + 0x00080, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, { + 0x00100, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, { + 0x00200, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT}, { + 0x00400, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, { + 0x00800, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_CENTER */ + { + 0x01000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_LEFT */ + { + 0x02000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_CENTER */ + { + 0x04000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_RIGHT */ + { + 0x08000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_BACK_LEFT */ + { + 0x10000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_BACK_CENTER */ + { + 0x20000, GST_AUDIO_CHANNEL_POSITION_INVALID} /* TOP_BACK_RIGHT */ +}; + +#define MAX_CHANNEL_POSITIONS G_N_ELEMENTS (layout_mapping) + +gboolean +gst_wavpack_set_channel_layout (GstCaps * caps, gint layout) +{ + GstAudioChannelPosition pos[MAX_CHANNEL_POSITIONS]; + GstStructure *s; + gint num_channels, i, p; + + s = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (s, "channels", &num_channels)) + g_return_val_if_reached (FALSE); + + if (num_channels == 1 && layout == 0x00004) { + pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO; + gst_audio_set_channel_positions (s, pos); + return TRUE; + } + + p = 0; + for (i = 0; i < MAX_CHANNEL_POSITIONS; ++i) { + if ((layout & layout_mapping[i].ms_mask) != 0) { + if (p >= num_channels) { + GST_WARNING ("More bits set in the channel layout map than there " + "are channels! Broken file"); + return FALSE; + } + if (layout_mapping[i].gst_pos == GST_AUDIO_CHANNEL_POSITION_INVALID) { + GST_WARNING ("Unsupported channel position (mask 0x%08x) in channel " + "layout map - ignoring those channels", layout_mapping[i].ms_mask); + /* what to do? just ignore it and let downstream deal with a channel + * layout that has INVALID positions in it for now ... */ + } + pos[p] = layout_mapping[i].gst_pos; + ++p; + } + } + + if (p != num_channels) { + GST_WARNING ("Only %d bits set in the channel layout map, but there are " + "supposed to be %d channels! Broken file", p, num_channels); + return FALSE; + } + + gst_audio_set_channel_positions (s, pos); + return TRUE; +} + +GstAudioChannelPosition * +gst_wavpack_get_default_channel_positions (gint nchannels) +{ + GstAudioChannelPosition *pos = g_new (GstAudioChannelPosition, nchannels); + gint i; + + if (nchannels == 1) { + pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER; + return pos; + } + + for (i = 0; i < nchannels; i++) + pos[i] = layout_mapping[i].gst_pos; + + return pos; +} + +gint +gst_wavpack_get_channel_mask_from_positions (GstAudioChannelPosition * pos, + gint nchannels) +{ + gint channel_mask = 0; + gint i, j; + + if (nchannels == 1 && pos[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_MONO) { + channel_mask = 0x00000004; + return channel_mask; + } + + /* FIXME: not exactly efficient but otherwise we need an inverse + * mapping table too */ + for (i = 0; i < nchannels; i++) { + for (j = 0; j < MAX_CHANNEL_POSITIONS; j++) { + if (pos[i] == layout_mapping[j].gst_pos) { + channel_mask |= layout_mapping[j].ms_mask; + break; + } + } + } + + return channel_mask; +} + +gboolean +gst_wavpack_set_channel_mapping (GstAudioChannelPosition * pos, gint nchannels, + gint8 * channel_mapping) +{ + gint i, j; + gboolean ret = TRUE; + + for (i = 0; i < nchannels; i++) { + for (j = 0; j < MAX_CHANNEL_POSITIONS; j++) { + if (pos[i] == layout_mapping[j].gst_pos) { + channel_mapping[i] = j; + ret &= (i == j); + break; + } + } + } + + return !ret; +} diff --git a/ext/wavpack/gstwavpackcommon.h b/ext/wavpack/gstwavpackcommon.h new file mode 100644 index 0000000..6a9e516 --- /dev/null +++ b/ext/wavpack/gstwavpackcommon.h @@ -0,0 +1,75 @@ +/* GStreamer Wavpack plugin + * Copyright (c) 2005 Arwed v. Merkatz + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackcommon.h: common helper functions + * + * 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_WAVPACK_COMMON_H__ +#define __GST_WAVPACK_COMMON_H__ + +#include +#include +#include + +typedef struct +{ + guint32 byte_length; + guint8 *data; + guint8 id; +} GstWavpackMetadata; + +#define ID_UNIQUE 0x3f +#define ID_OPTIONAL_DATA 0x20 +#define ID_ODD_SIZE 0x40 +#define ID_LARGE 0x80 + +#define ID_DUMMY 0x0 +#define ID_ENCODER_INFO 0x1 +#define ID_DECORR_TERMS 0x2 +#define ID_DECORR_WEIGHTS 0x3 +#define ID_DECORR_SAMPLES 0x4 +#define ID_ENTROPY_VARS 0x5 +#define ID_HYBRID_PROFILE 0x6 +#define ID_SHAPING_WEIGHTS 0x7 +#define ID_FLOAT_INFO 0x8 +#define ID_INT32_INFO 0x9 +#define ID_WV_BITSTREAM 0xa +#define ID_WVC_BITSTREAM 0xb +#define ID_WVX_BITSTREAM 0xc +#define ID_CHANNEL_INFO 0xd + +#define ID_RIFF_HEADER (ID_OPTIONAL_DATA | 0x1) +#define ID_RIFF_TRAILER (ID_OPTIONAL_DATA | 0x2) +#define ID_REPLAY_GAIN (ID_OPTIONAL_DATA | 0x3) +#define ID_CUESHEET (ID_OPTIONAL_DATA | 0x4) +#define ID_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0x5) +#define ID_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x6) +#define ID_SAMPLE_RATE (ID_OPTIONAL_DATA | 0x7) + + +gboolean gst_wavpack_read_header (WavpackHeader * header, guint8 * buf); +gboolean gst_wavpack_read_metadata (GstWavpackMetadata * meta, + guint8 * header_data, guint8 ** p_data); +gint gst_wavpack_get_default_channel_mask (gint nchannels); +gboolean gst_wavpack_set_channel_layout (GstCaps * caps, gint layout); +GstAudioChannelPosition *gst_wavpack_get_default_channel_positions (gint nchannels); +gint gst_wavpack_get_channel_mask_from_positions (GstAudioChannelPosition *pos, gint nchannels); +gboolean gst_wavpack_set_channel_mapping (GstAudioChannelPosition *pos, gint nchannels, gint8 *channel_mapping); + +#endif diff --git a/ext/wavpack/gstwavpackdec.c b/ext/wavpack/gstwavpackdec.c new file mode 100644 index 0000000..4ba242d --- /dev/null +++ b/ext/wavpack/gstwavpackdec.c @@ -0,0 +1,512 @@ +/* GStreamer Wavpack plugin + * Copyright (c) 2005 Arwed v. Merkatz + * Copyright (c) 2006 Edward Hervey + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackdec.c: raw Wavpack bitstream decoder + * + * 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-wavpackdec + * + * WavpackDec decodes framed (for example by the WavpackParse element) + * Wavpack streams and decodes them to raw audio. + * Wavpack is an open-source + * audio codec that features both lossless and lossy encoding. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=test.wv ! wavpackparse ! wavpackdec ! audioconvert ! audioresample ! autoaudiosink + * ]| This pipeline decodes the Wavpack file test.wv into raw audio buffers and + * tries to play it back using an automatically found audio sink. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include +#include + +#include +#include "gstwavpackdec.h" +#include "gstwavpackcommon.h" +#include "gstwavpackstreamreader.h" + + +#define WAVPACK_DEC_MAX_ERRORS 16 + +GST_DEBUG_CATEGORY_STATIC (gst_wavpack_dec_debug); +#define GST_CAT_DEFAULT gst_wavpack_dec_debug + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wavpack, " + "width = (int) [ 1, 32 ], " + "channels = (int) [ 1, 8 ], " + "rate = (int) [ 6000, 192000 ], " "framed = (boolean) true") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "width = (int) 32, " + "depth = (int) [ 1, 32 ], " + "channels = (int) [ 1, 8 ], " + "rate = (int) [ 6000, 192000 ], " + "endianness = (int) BYTE_ORDER, " "signed = (boolean) true") + ); + +static GstFlowReturn gst_wavpack_dec_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_wavpack_dec_sink_set_caps (GstPad * pad, GstCaps * caps); +static gboolean gst_wavpack_dec_sink_event (GstPad * pad, GstEvent * event); +static void gst_wavpack_dec_finalize (GObject * object); +static GstStateChangeReturn gst_wavpack_dec_change_state (GstElement * element, + GstStateChange transition); +static void gst_wavpack_dec_post_tags (GstWavpackDec * dec); + +GST_BOILERPLATE (GstWavpackDec, gst_wavpack_dec, GstElement, GST_TYPE_ELEMENT); + +static void +gst_wavpack_dec_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_set_details_simple (element_class, "Wavpack audio decoder", + "Codec/Decoder/Audio", + "Decodes Wavpack audio data", + "Arwed v. Merkatz , " + "Sebastian Dröge "); +} + +static void +gst_wavpack_dec_class_init (GstWavpackDecClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_wavpack_dec_change_state); + gobject_class->finalize = gst_wavpack_dec_finalize; +} + +static void +gst_wavpack_dec_reset (GstWavpackDec * dec) +{ + dec->wv_id.buffer = NULL; + dec->wv_id.position = dec->wv_id.length = 0; + + dec->error_count = 0; + + dec->channels = 0; + dec->channel_mask = 0; + dec->sample_rate = 0; + dec->depth = 0; + + gst_segment_init (&dec->segment, GST_FORMAT_TIME); + dec->next_block_index = 0; +} + +static void +gst_wavpack_dec_init (GstWavpackDec * dec, GstWavpackDecClass * gklass) +{ + dec->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); + gst_pad_set_chain_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_dec_chain)); + gst_pad_set_setcaps_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_dec_sink_set_caps)); + gst_pad_set_event_function (dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_dec_sink_event)); + gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); + + dec->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); + gst_pad_use_fixed_caps (dec->srcpad); + gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); + + dec->context = NULL; + dec->stream_reader = gst_wavpack_stream_reader_new (); + + gst_wavpack_dec_reset (dec); +} + +static void +gst_wavpack_dec_finalize (GObject * object) +{ + GstWavpackDec *dec = GST_WAVPACK_DEC (object); + + g_free (dec->stream_reader); + dec->stream_reader = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_wavpack_dec_sink_set_caps (GstPad * pad, GstCaps * caps) +{ + GstWavpackDec *dec = GST_WAVPACK_DEC (gst_pad_get_parent (pad)); + GstStructure *structure = gst_caps_get_structure (caps, 0); + + /* Check if we can set the caps here already */ + if (gst_structure_get_int (structure, "channels", &dec->channels) && + gst_structure_get_int (structure, "rate", &dec->sample_rate) && + gst_structure_get_int (structure, "width", &dec->depth)) { + GstCaps *caps; + GstAudioChannelPosition *pos; + + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, dec->sample_rate, + "channels", G_TYPE_INT, dec->channels, + "depth", G_TYPE_INT, dec->depth, + "width", G_TYPE_INT, 32, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + + /* If we already have the channel layout set from upstream + * take this */ + if (gst_structure_has_field (structure, "channel-positions")) { + pos = gst_audio_get_channel_positions (structure); + if (pos != NULL && dec->channels > 2) { + GstStructure *new_str = gst_caps_get_structure (caps, 0); + + gst_audio_set_channel_positions (new_str, pos); + dec->channel_mask = + gst_wavpack_get_channel_mask_from_positions (pos, dec->channels); + } + + if (pos != NULL) + g_free (pos); + } + + GST_DEBUG_OBJECT (dec, "setting caps %" GST_PTR_FORMAT, caps); + + /* should always succeed */ + gst_pad_set_caps (dec->srcpad, caps); + gst_caps_unref (caps); + + /* send GST_TAG_AUDIO_CODEC and GST_TAG_BITRATE tags before something + * is decoded or after the format has changed */ + gst_wavpack_dec_post_tags (dec); + } + + gst_object_unref (dec); + + return TRUE; +} + +static void +gst_wavpack_dec_post_tags (GstWavpackDec * dec) +{ + GstTagList *list; + GstFormat format_time = GST_FORMAT_TIME, format_bytes = GST_FORMAT_BYTES; + gint64 duration, size; + + list = gst_tag_list_new (); + + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, "Wavpack", NULL); + + /* try to estimate the average bitrate */ + if (gst_pad_query_peer_duration (dec->sinkpad, &format_bytes, &size) && + gst_pad_query_peer_duration (dec->sinkpad, &format_time, &duration) && + size > 0 && duration > 0) { + guint64 bitrate; + + bitrate = gst_util_uint64_scale (size, 8 * GST_SECOND, duration); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, + (guint) bitrate, NULL); + } + + gst_element_post_message (GST_ELEMENT (dec), + gst_message_new_tag (GST_OBJECT (dec), list)); +} + +static GstFlowReturn +gst_wavpack_dec_chain (GstPad * pad, GstBuffer * buf) +{ + GstWavpackDec *dec; + GstBuffer *outbuf = NULL; + GstFlowReturn ret = GST_FLOW_OK; + WavpackHeader wph; + int32_t decoded, unpacked_size; + gboolean format_changed; + + dec = GST_WAVPACK_DEC (GST_PAD_PARENT (pad)); + + /* check input, we only accept framed input with complete chunks */ + if (GST_BUFFER_SIZE (buf) < sizeof (WavpackHeader)) + goto input_not_framed; + + if (!gst_wavpack_read_header (&wph, GST_BUFFER_DATA (buf))) + goto invalid_header; + + if (GST_BUFFER_SIZE (buf) < wph.ckSize + 4 * 1 + 4) + goto input_not_framed; + + if (!(wph.flags & INITIAL_BLOCK)) + goto input_not_framed; + + dec->wv_id.buffer = GST_BUFFER_DATA (buf); + dec->wv_id.length = GST_BUFFER_SIZE (buf); + dec->wv_id.position = 0; + + /* create a new wavpack context if there is none yet but if there + * was already one (i.e. caps were set on the srcpad) check whether + * the new one has the same caps */ + if (!dec->context) { + gchar error_msg[80]; + + dec->context = WavpackOpenFileInputEx (dec->stream_reader, + &dec->wv_id, NULL, error_msg, OPEN_STREAMING, 0); + + if (!dec->context) { + GST_WARNING ("Couldn't decode buffer: %s", error_msg); + dec->error_count++; + if (dec->error_count <= WAVPACK_DEC_MAX_ERRORS) { + goto out; /* just return OK for now */ + } else { + goto decode_error; + } + } + } + + g_assert (dec->context != NULL); + + dec->error_count = 0; + + format_changed = + (dec->sample_rate != WavpackGetSampleRate (dec->context)) || + (dec->channels != WavpackGetNumChannels (dec->context)) || + (dec->depth != WavpackGetBitsPerSample (dec->context)) || +#ifdef WAVPACK_OLD_API + (dec->channel_mask != dec->context->config.channel_mask); +#else + (dec->channel_mask != WavpackGetChannelMask (dec->context)); +#endif + + if (!GST_PAD_CAPS (dec->srcpad) || format_changed) { + GstCaps *caps; + gint channel_mask; + + dec->sample_rate = WavpackGetSampleRate (dec->context); + dec->channels = WavpackGetNumChannels (dec->context); + dec->depth = WavpackGetBitsPerSample (dec->context); + + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, dec->sample_rate, + "channels", G_TYPE_INT, dec->channels, + "depth", G_TYPE_INT, dec->depth, + "width", G_TYPE_INT, 32, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + +#ifdef WAVPACK_OLD_API + channel_mask = dec->context->config.channel_mask; +#else + channel_mask = WavpackGetChannelMask (dec->context); +#endif + if (channel_mask == 0) + channel_mask = gst_wavpack_get_default_channel_mask (dec->channels); + + dec->channel_mask = channel_mask; + + /* Only set the channel layout for more than two channels + * otherwise things break unfortunately */ + if (channel_mask != 0 && dec->channels > 2) + if (!gst_wavpack_set_channel_layout (caps, channel_mask)) + GST_WARNING_OBJECT (dec, "Failed to set channel layout"); + + GST_DEBUG_OBJECT (dec, "setting caps %" GST_PTR_FORMAT, caps); + + /* should always succeed */ + gst_pad_set_caps (dec->srcpad, caps); + gst_caps_unref (caps); + + /* send GST_TAG_AUDIO_CODEC and GST_TAG_BITRATE tags before something + * is decoded or after the format has changed */ + gst_wavpack_dec_post_tags (dec); + } + + /* alloc output buffer */ + unpacked_size = 4 * wph.block_samples * dec->channels; + ret = gst_pad_alloc_buffer (dec->srcpad, GST_BUFFER_OFFSET (buf), + unpacked_size, GST_PAD_CAPS (dec->srcpad), &outbuf); + + if (ret != GST_FLOW_OK) + goto out; + + gst_buffer_copy_metadata (outbuf, buf, GST_BUFFER_COPY_TIMESTAMPS); + + /* If we got a DISCONT buffer forward the flag. Nothing else + * has to be done as libwavpack doesn't store state between + * Wavpack blocks */ + if (GST_BUFFER_IS_DISCONT (buf) || dec->next_block_index != wph.block_index) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + + dec->next_block_index = wph.block_index + wph.block_samples; + + /* decode */ + decoded = WavpackUnpackSamples (dec->context, + (int32_t *) GST_BUFFER_DATA (outbuf), wph.block_samples); + if (decoded != wph.block_samples) + goto decode_error; + + if ((outbuf = gst_audio_buffer_clip (outbuf, &dec->segment, + dec->sample_rate, 4 * dec->channels))) { + GST_LOG_OBJECT (dec, "pushing buffer with time %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf))); + ret = gst_pad_push (dec->srcpad, outbuf); + } + +out: + + if (G_UNLIKELY (ret != GST_FLOW_OK)) { + GST_DEBUG_OBJECT (dec, "flow: %s", gst_flow_get_name (ret)); + } + + gst_buffer_unref (buf); + + return ret; + +/* ERRORS */ +input_not_framed: + { + GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("Expected framed input")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +invalid_header: + { + GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("Invalid wavpack header")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +decode_error: + { + const gchar *reason = "unknown"; + + if (dec->context) { +#ifdef WAVPACK_OLD_API + reason = dec->context->error_message; +#else + reason = WavpackGetErrorMessage (dec->context); +#endif + } else { + reason = "couldn't create decoder context"; + } + GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), + ("Failed to decode wavpack stream: %s", reason)); + if (outbuf) + gst_buffer_unref (outbuf); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_wavpack_dec_sink_event (GstPad * pad, GstEvent * event) +{ + GstWavpackDec *dec = GST_WAVPACK_DEC (gst_pad_get_parent (pad)); + + GST_LOG_OBJECT (dec, "Received %s event", GST_EVENT_TYPE_NAME (event)); + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT:{ + GstFormat fmt; + gboolean is_update; + gint64 start, end, base; + gdouble rate; + + gst_event_parse_new_segment (event, &is_update, &rate, &fmt, &start, + &end, &base); + if (fmt == GST_FORMAT_TIME) { + GST_DEBUG ("Got NEWSEGMENT event in GST_FORMAT_TIME, passing on (%" + GST_TIME_FORMAT " - %" GST_TIME_FORMAT ")", GST_TIME_ARGS (start), + GST_TIME_ARGS (end)); + gst_segment_set_newsegment (&dec->segment, is_update, rate, fmt, + start, end, base); + } else { + gst_segment_init (&dec->segment, GST_FORMAT_TIME); + } + break; + } + default: + break; + } + + gst_object_unref (dec); + return gst_pad_event_default (pad, event); +} + +static GstStateChangeReturn +gst_wavpack_dec_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstWavpackDec *dec = GST_WAVPACK_DEC (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: + if (dec->context) { + WavpackCloseFile (dec->context); + dec->context = NULL; + } + + gst_wavpack_dec_reset (dec); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +gboolean +gst_wavpack_dec_plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "wavpackdec", + GST_RANK_PRIMARY, GST_TYPE_WAVPACK_DEC)) + return FALSE; + GST_DEBUG_CATEGORY_INIT (gst_wavpack_dec_debug, "wavpack_dec", 0, + "Wavpack decoder"); + return TRUE; +} diff --git a/ext/wavpack/gstwavpackdec.h b/ext/wavpack/gstwavpackdec.h new file mode 100644 index 0000000..eb6e4c3 --- /dev/null +++ b/ext/wavpack/gstwavpackdec.h @@ -0,0 +1,80 @@ +/* GStreamer Wavpack plugin + * Copyright (c) 2004 Arwed v. Merkatz + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackdec.h: raw Wavpack bitstream decoder + * + * 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_WAVPACK_DEC_H__ +#define __GST_WAVPACK_DEC_H__ + +#include + +#include + +#include "gstwavpackstreamreader.h" + +G_BEGIN_DECLS +#define GST_TYPE_WAVPACK_DEC \ + (gst_wavpack_dec_get_type()) +#define GST_WAVPACK_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVPACK_DEC,GstWavpackDec)) +#define GST_WAVPACK_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVPACK_DEC,GstWavpackDecClass)) +#define GST_IS_WAVPACK_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVPACK_DEC)) +#define GST_IS_WAVPACK_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVPACK_DEC)) +typedef struct _GstWavpackDec GstWavpackDec; +typedef struct _GstWavpackDecClass GstWavpackDecClass; + +struct _GstWavpackDec +{ + GstElement element; + + /*< private > */ + GstPad *sinkpad; + GstPad *srcpad; + + WavpackContext *context; + WavpackStreamReader *stream_reader; + + read_id wv_id; + + GstSegment segment; /* used for clipping, TIME format */ + guint32 next_block_index; + + gint sample_rate; + gint depth; + gint channels; + gint channel_mask; + + gint error_count; +}; + +struct _GstWavpackDecClass +{ + GstElementClass parent; +}; + +GType gst_wavpack_dec_get_type (void); + +gboolean gst_wavpack_dec_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_WAVPACK_DEC_H__ */ diff --git a/ext/wavpack/gstwavpackenc.c b/ext/wavpack/gstwavpackenc.c new file mode 100644 index 0000000..a22dd23 --- /dev/null +++ b/ext/wavpack/gstwavpackenc.c @@ -0,0 +1,1049 @@ +/* GStreamer Wavpack encoder plugin + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackdec.c: Wavpack audio encoder + * + * 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-wavpackenc + * + * WavpackEnc encodes raw audio into a framed Wavpack stream. + * Wavpack is an open-source + * audio codec that features both lossless and lossy encoding. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc num-buffers=500 ! audioconvert ! wavpackenc ! filesink location=sinewave.wv + * ]| This pipeline encodes audio from audiotestsrc into a Wavpack file. The audioconvert element is needed + * as the Wavpack encoder only accepts input with 32 bit width (and every depth between 1 and 32 bits). + * |[ + * gst-launch cdda://1 ! audioconvert ! wavpackenc ! filesink location=track1.wv + * ]| This pipeline encodes audio from an audio CD into a Wavpack file using + * lossless encoding (the file output will be fairly large). + * |[ + * gst-launch cdda://1 ! audioconvert ! wavpackenc bitrate=128000 ! filesink location=track1.wv + * ]| This pipeline encodes audio from an audio CD into a Wavpack file using + * lossy encoding at a certain bitrate (the file will be fairly small). + * + */ + +/* + * TODO: - add 32 bit float mode. CONFIG_FLOAT_DATA + */ + +#include +#include +#include + +#include +#include "gstwavpackenc.h" +#include "gstwavpackcommon.h" + +static GstFlowReturn gst_wavpack_enc_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_wavpack_enc_sink_set_caps (GstPad * pad, GstCaps * caps); +static int gst_wavpack_enc_push_block (void *id, void *data, int32_t count); +static gboolean gst_wavpack_enc_sink_event (GstPad * pad, GstEvent * event); +static GstStateChangeReturn gst_wavpack_enc_change_state (GstElement * element, + GstStateChange transition); +static void gst_wavpack_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_wavpack_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +enum +{ + ARG_0, + ARG_MODE, + ARG_BITRATE, + ARG_BITSPERSAMPLE, + ARG_CORRECTION_MODE, + ARG_MD5, + ARG_EXTRA_PROCESSING, + ARG_JOINT_STEREO_MODE +}; + +GST_DEBUG_CATEGORY_STATIC (gst_wavpack_enc_debug); +#define GST_CAT_DEFAULT gst_wavpack_enc_debug + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "width = (int) 32, " + "depth = (int) [ 1, 32], " + "endianness = (int) BYTE_ORDER, " + "channels = (int) [ 1, 8 ], " + "rate = (int) [ 6000, 192000 ]," "signed = (boolean) TRUE") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wavpack, " + "width = (int) [ 1, 32 ], " + "channels = (int) [ 1, 2 ], " + "rate = (int) [ 6000, 192000 ], " "framed = (boolean) TRUE") + ); + +static GstStaticPadTemplate wvcsrc_factory = GST_STATIC_PAD_TEMPLATE ("wvcsrc", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("audio/x-wavpack-correction, " "framed = (boolean) TRUE") + ); + +enum +{ + GST_WAVPACK_ENC_MODE_VERY_FAST = 0, + GST_WAVPACK_ENC_MODE_FAST, + GST_WAVPACK_ENC_MODE_DEFAULT, + GST_WAVPACK_ENC_MODE_HIGH, + GST_WAVPACK_ENC_MODE_VERY_HIGH +}; + +#define GST_TYPE_WAVPACK_ENC_MODE (gst_wavpack_enc_mode_get_type ()) +static GType +gst_wavpack_enc_mode_get_type (void) +{ + static GType qtype = 0; + + if (qtype == 0) { + static const GEnumValue values[] = { +#if 0 + /* Very Fast Compression is not supported yet, but will be supported + * in future wavpack versions */ + {GST_WAVPACK_ENC_MODE_VERY_FAST, "Very Fast Compression", "veryfast"}, +#endif + {GST_WAVPACK_ENC_MODE_FAST, "Fast Compression", "fast"}, + {GST_WAVPACK_ENC_MODE_DEFAULT, "Normal Compression", "normal"}, + {GST_WAVPACK_ENC_MODE_HIGH, "High Compression", "high"}, +#ifndef WAVPACK_OLD_API + {GST_WAVPACK_ENC_MODE_VERY_HIGH, "Very High Compression", "veryhigh"}, +#endif + {0, NULL, NULL} + }; + + qtype = g_enum_register_static ("GstWavpackEncMode", values); + } + return qtype; +} + +enum +{ + GST_WAVPACK_CORRECTION_MODE_OFF = 0, + GST_WAVPACK_CORRECTION_MODE_ON, + GST_WAVPACK_CORRECTION_MODE_OPTIMIZED +}; + +#define GST_TYPE_WAVPACK_ENC_CORRECTION_MODE (gst_wavpack_enc_correction_mode_get_type ()) +static GType +gst_wavpack_enc_correction_mode_get_type (void) +{ + static GType qtype = 0; + + if (qtype == 0) { + static const GEnumValue values[] = { + {GST_WAVPACK_CORRECTION_MODE_OFF, "Create no correction file", "off"}, + {GST_WAVPACK_CORRECTION_MODE_ON, "Create correction file", "on"}, + {GST_WAVPACK_CORRECTION_MODE_OPTIMIZED, + "Create optimized correction file", "optimized"}, + {0, NULL, NULL} + }; + + qtype = g_enum_register_static ("GstWavpackEncCorrectionMode", values); + } + return qtype; +} + +enum +{ + GST_WAVPACK_JS_MODE_AUTO = 0, + GST_WAVPACK_JS_MODE_LEFT_RIGHT, + GST_WAVPACK_JS_MODE_MID_SIDE +}; + +#define GST_TYPE_WAVPACK_ENC_JOINT_STEREO_MODE (gst_wavpack_enc_joint_stereo_mode_get_type ()) +static GType +gst_wavpack_enc_joint_stereo_mode_get_type (void) +{ + static GType qtype = 0; + + if (qtype == 0) { + static const GEnumValue values[] = { + {GST_WAVPACK_JS_MODE_AUTO, "auto", "auto"}, + {GST_WAVPACK_JS_MODE_LEFT_RIGHT, "left/right", "leftright"}, + {GST_WAVPACK_JS_MODE_MID_SIDE, "mid/side", "midside"}, + {0, NULL, NULL} + }; + + qtype = g_enum_register_static ("GstWavpackEncJSMode", values); + } + return qtype; +} + +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 (GstWavpackEnc, gst_wavpack_enc, GstElement, + GST_TYPE_ELEMENT, _do_init); + +static void +gst_wavpack_enc_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + /* add pad templates */ + gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, + &wvcsrc_factory); + + /* set element details */ + gst_element_class_set_details_simple (element_class, "Wavpack audio encoder", + "Codec/Encoder/Audio", + "Encodes audio with the Wavpack lossless/lossy audio codec", + "Sebastian Dröge "); +} + + +static void +gst_wavpack_enc_class_init (GstWavpackEncClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + /* set state change handler */ + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_wavpack_enc_change_state); + + /* set property handlers */ + gobject_class->set_property = gst_wavpack_enc_set_property; + gobject_class->get_property = gst_wavpack_enc_get_property; + + /* install all properties */ + g_object_class_install_property (gobject_class, ARG_MODE, + g_param_spec_enum ("mode", "Encoding mode", + "Speed versus compression tradeoff.", + GST_TYPE_WAVPACK_ENC_MODE, GST_WAVPACK_ENC_MODE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Try to encode with this average bitrate (bits/sec). " + "This enables lossy encoding, values smaller than 24000 disable it again.", + 0, 9600000, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_BITSPERSAMPLE, + g_param_spec_double ("bits-per-sample", "Bits per sample", + "Try to encode with this amount of bits per sample. " + "This enables lossy encoding, values smaller than 2.0 disable it again.", + 0.0, 24.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_CORRECTION_MODE, + g_param_spec_enum ("correction-mode", "Correction stream mode", + "Use this mode for the correction stream. Only works in lossy mode!", + GST_TYPE_WAVPACK_ENC_CORRECTION_MODE, GST_WAVPACK_CORRECTION_MODE_OFF, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_MD5, + g_param_spec_boolean ("md5", "MD5", + "Store MD5 hash of raw samples within the file.", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_EXTRA_PROCESSING, + g_param_spec_uint ("extra-processing", "Extra processing", + "Use better but slower filters for better compression/quality.", + 0, 6, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_JOINT_STEREO_MODE, + g_param_spec_enum ("joint-stereo-mode", "Joint-Stereo mode", + "Use this joint-stereo mode.", GST_TYPE_WAVPACK_ENC_JOINT_STEREO_MODE, + GST_WAVPACK_JS_MODE_AUTO, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_wavpack_enc_reset (GstWavpackEnc * enc) +{ + /* close and free everything stream related if we already did something */ + if (enc->wp_context) { + WavpackCloseFile (enc->wp_context); + enc->wp_context = NULL; + } + if (enc->wp_config) { + g_free (enc->wp_config); + enc->wp_config = NULL; + } + if (enc->first_block) { + g_free (enc->first_block); + enc->first_block = NULL; + } + enc->first_block_size = 0; + if (enc->md5_context) { + g_checksum_free (enc->md5_context); + enc->md5_context = NULL; + } + + if (enc->pending_buffer) { + gst_buffer_unref (enc->pending_buffer); + enc->pending_buffer = NULL; + enc->pending_offset = 0; + } + + /* reset the last returns to GST_FLOW_OK. This is only set to something else + * while WavpackPackSamples() or more specific gst_wavpack_enc_push_block() + * so not valid anymore */ + enc->srcpad_last_return = enc->wvcsrcpad_last_return = GST_FLOW_OK; + + /* reset stream information */ + enc->samplerate = 0; + enc->depth = 0; + enc->channels = 0; + enc->channel_mask = 0; + enc->need_channel_remap = FALSE; + + enc->timestamp_offset = GST_CLOCK_TIME_NONE; + enc->next_ts = GST_CLOCK_TIME_NONE; +} + +static void +gst_wavpack_enc_init (GstWavpackEnc * enc, GstWavpackEncClass * gclass) +{ + enc->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); + gst_pad_set_setcaps_function (enc->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_enc_sink_set_caps)); + gst_pad_set_chain_function (enc->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_enc_chain)); + gst_pad_set_event_function (enc->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_enc_sink_event)); + gst_element_add_pad (GST_ELEMENT (enc), enc->sinkpad); + + /* setup src pad */ + enc->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); + gst_element_add_pad (GST_ELEMENT (enc), enc->srcpad); + + /* initialize object attributes */ + enc->wp_config = NULL; + enc->wp_context = NULL; + enc->first_block = NULL; + enc->md5_context = NULL; + gst_wavpack_enc_reset (enc); + + enc->wv_id.correction = FALSE; + enc->wv_id.wavpack_enc = enc; + enc->wv_id.passthrough = FALSE; + enc->wvc_id.correction = TRUE; + enc->wvc_id.wavpack_enc = enc; + enc->wvc_id.passthrough = FALSE; + + /* set default values of params */ + enc->mode = GST_WAVPACK_ENC_MODE_DEFAULT; + enc->bitrate = 0; + enc->bps = 0.0; + enc->correction_mode = GST_WAVPACK_CORRECTION_MODE_OFF; + enc->md5 = FALSE; + enc->extra_processing = 0; + enc->joint_stereo_mode = GST_WAVPACK_JS_MODE_AUTO; +} + +static gboolean +gst_wavpack_enc_sink_set_caps (GstPad * pad, GstCaps * caps) +{ + GstWavpackEnc *enc = GST_WAVPACK_ENC (gst_pad_get_parent (pad)); + GstStructure *structure = gst_caps_get_structure (caps, 0); + GstAudioChannelPosition *pos; + + if (!gst_structure_get_int (structure, "channels", &enc->channels) || + !gst_structure_get_int (structure, "rate", &enc->samplerate) || + !gst_structure_get_int (structure, "depth", &enc->depth)) { + GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL), + ("got invalid caps: %" GST_PTR_FORMAT, caps)); + gst_object_unref (enc); + return FALSE; + } + + pos = gst_audio_get_channel_positions (structure); + /* If one channel is NONE they'll be all undefined */ + if (pos != NULL && pos[0] == GST_AUDIO_CHANNEL_POSITION_NONE) { + g_free (pos); + pos = NULL; + } + + if (pos == NULL) { + GST_ELEMENT_ERROR (enc, STREAM, FORMAT, (NULL), + ("input has no valid channel layout")); + + gst_object_unref (enc); + return FALSE; + } + + enc->channel_mask = + gst_wavpack_get_channel_mask_from_positions (pos, enc->channels); + enc->need_channel_remap = + gst_wavpack_set_channel_mapping (pos, enc->channels, + enc->channel_mapping); + g_free (pos); + + /* set fixed src pad caps now that we know what we will get */ + caps = gst_caps_new_simple ("audio/x-wavpack", + "channels", G_TYPE_INT, enc->channels, + "rate", G_TYPE_INT, enc->samplerate, + "width", G_TYPE_INT, enc->depth, "framed", G_TYPE_BOOLEAN, TRUE, NULL); + + if (!gst_wavpack_set_channel_layout (caps, enc->channel_mask)) + GST_WARNING_OBJECT (enc, "setting channel layout failed"); + + if (!gst_pad_set_caps (enc->srcpad, caps)) { + GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL), + ("setting caps failed: %" GST_PTR_FORMAT, caps)); + gst_caps_unref (caps); + gst_object_unref (enc); + return FALSE; + } + gst_pad_use_fixed_caps (enc->srcpad); + + gst_caps_unref (caps); + gst_object_unref (enc); + return TRUE; +} + +static void +gst_wavpack_enc_set_wp_config (GstWavpackEnc * enc) +{ + enc->wp_config = g_new0 (WavpackConfig, 1); + /* set general stream informations in the WavpackConfig */ + enc->wp_config->bytes_per_sample = GST_ROUND_UP_8 (enc->depth) / 8; + enc->wp_config->bits_per_sample = enc->depth; + enc->wp_config->num_channels = enc->channels; + enc->wp_config->channel_mask = enc->channel_mask; + enc->wp_config->sample_rate = enc->samplerate; + + /* + * Set parameters in WavpackConfig + */ + + /* Encoding mode */ + switch (enc->mode) { +#if 0 + case GST_WAVPACK_ENC_MODE_VERY_FAST: + enc->wp_config->flags |= CONFIG_VERY_FAST_FLAG; + enc->wp_config->flags |= CONFIG_FAST_FLAG; + break; +#endif + case GST_WAVPACK_ENC_MODE_FAST: + enc->wp_config->flags |= CONFIG_FAST_FLAG; + break; + case GST_WAVPACK_ENC_MODE_DEFAULT: + break; + case GST_WAVPACK_ENC_MODE_HIGH: + enc->wp_config->flags |= CONFIG_HIGH_FLAG; + break; +#ifndef WAVPACK_OLD_API + case GST_WAVPACK_ENC_MODE_VERY_HIGH: + enc->wp_config->flags |= CONFIG_HIGH_FLAG; + enc->wp_config->flags |= CONFIG_VERY_HIGH_FLAG; + break; +#endif + } + + /* Bitrate, enables lossy mode */ + if (enc->bitrate) { + enc->wp_config->flags |= CONFIG_HYBRID_FLAG; + enc->wp_config->flags |= CONFIG_BITRATE_KBPS; + enc->wp_config->bitrate = enc->bitrate / 1000.0; + } else if (enc->bps) { + enc->wp_config->flags |= CONFIG_HYBRID_FLAG; + enc->wp_config->bitrate = enc->bps; + } + + /* Correction Mode, only in lossy mode */ + if (enc->wp_config->flags & CONFIG_HYBRID_FLAG) { + if (enc->correction_mode > GST_WAVPACK_CORRECTION_MODE_OFF) { + GstCaps *caps = gst_caps_new_simple ("audio/x-wavpack-correction", + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + + enc->wvcsrcpad = + gst_pad_new_from_static_template (&wvcsrc_factory, "wvcsrc"); + + /* try to add correction src pad, don't set correction mode on failure */ + GST_DEBUG_OBJECT (enc, "Adding correction pad with caps %" + GST_PTR_FORMAT, caps); + if (!gst_pad_set_caps (enc->wvcsrcpad, caps)) { + enc->correction_mode = 0; + GST_WARNING_OBJECT (enc, "setting correction caps failed"); + } else { + gst_pad_use_fixed_caps (enc->wvcsrcpad); + gst_pad_set_active (enc->wvcsrcpad, TRUE); + gst_element_add_pad (GST_ELEMENT (enc), enc->wvcsrcpad); + enc->wp_config->flags |= CONFIG_CREATE_WVC; + if (enc->correction_mode == GST_WAVPACK_CORRECTION_MODE_OPTIMIZED) { + enc->wp_config->flags |= CONFIG_OPTIMIZE_WVC; + } + } + gst_caps_unref (caps); + } + } else { + if (enc->correction_mode > GST_WAVPACK_CORRECTION_MODE_OFF) { + enc->correction_mode = 0; + GST_WARNING_OBJECT (enc, "setting correction mode only has " + "any effect if a bitrate is provided."); + } + } + gst_element_no_more_pads (GST_ELEMENT (enc)); + + /* MD5, setup MD5 context */ + if ((enc->md5) && !(enc->md5_context)) { + enc->wp_config->flags |= CONFIG_MD5_CHECKSUM; + enc->md5_context = g_checksum_new (G_CHECKSUM_MD5); + } + + /* Extra encode processing */ + if (enc->extra_processing) { + enc->wp_config->flags |= CONFIG_EXTRA_MODE; + enc->wp_config->xmode = enc->extra_processing; + } + + /* Joint stereo mode */ + switch (enc->joint_stereo_mode) { + case GST_WAVPACK_JS_MODE_AUTO: + break; + case GST_WAVPACK_JS_MODE_LEFT_RIGHT: + enc->wp_config->flags |= CONFIG_JOINT_OVERRIDE; + enc->wp_config->flags &= ~CONFIG_JOINT_STEREO; + break; + case GST_WAVPACK_JS_MODE_MID_SIDE: + enc->wp_config->flags |= (CONFIG_JOINT_OVERRIDE | CONFIG_JOINT_STEREO); + break; + } +} + +static int +gst_wavpack_enc_push_block (void *id, void *data, int32_t count) +{ + GstWavpackEncWriteID *wid = (GstWavpackEncWriteID *) id; + GstWavpackEnc *enc = GST_WAVPACK_ENC (wid->wavpack_enc); + GstFlowReturn *flow; + GstBuffer *buffer; + GstPad *pad; + guchar *block = (guchar *) data; + + pad = (wid->correction) ? enc->wvcsrcpad : enc->srcpad; + flow = + (wid->correction) ? &enc->wvcsrcpad_last_return : &enc-> + srcpad_last_return; + + *flow = gst_pad_alloc_buffer_and_set_caps (pad, GST_BUFFER_OFFSET_NONE, + count, GST_PAD_CAPS (pad), &buffer); + + if (*flow != GST_FLOW_OK) { + GST_WARNING_OBJECT (enc, "flow on %s:%s = %s", + GST_DEBUG_PAD_NAME (pad), gst_flow_get_name (*flow)); + return FALSE; + } + + g_memmove (GST_BUFFER_DATA (buffer), block, count); + + if (count > sizeof (WavpackHeader) && memcmp (block, "wvpk", 4) == 0) { + /* if it's a Wavpack block set buffer timestamp and duration, etc */ + WavpackHeader wph; + + GST_LOG_OBJECT (enc, "got %d bytes of encoded wavpack %sdata", + count, (wid->correction) ? "correction " : ""); + + gst_wavpack_read_header (&wph, block); + + /* Only set when pushing the first buffer again, in that case + * we don't want to delay the buffer or push newsegment events + */ + if (!wid->passthrough) { + /* Only push complete blocks */ + if (enc->pending_buffer == NULL) { + enc->pending_buffer = buffer; + enc->pending_offset = wph.block_index; + } else if (enc->pending_offset == wph.block_index) { + enc->pending_buffer = gst_buffer_join (enc->pending_buffer, buffer); + } else { + GST_ERROR ("Got incomplete block, dropping"); + gst_buffer_unref (enc->pending_buffer); + enc->pending_buffer = buffer; + enc->pending_offset = wph.block_index; + } + + if (!(wph.flags & FINAL_BLOCK)) + return TRUE; + + buffer = enc->pending_buffer; + enc->pending_buffer = NULL; + enc->pending_offset = 0; + + /* if it's the first wavpack block, send a NEW_SEGMENT event */ + if (wph.block_index == 0) { + gst_pad_push_event (pad, + gst_event_new_new_segment (FALSE, + 1.0, GST_FORMAT_TIME, 0, GST_BUFFER_OFFSET_NONE, 0)); + + /* save header for later reference, so we can re-send it later on + * EOS with fixed up values for total sample count etc. */ + if (enc->first_block == NULL && !wid->correction) { + enc->first_block = + g_memdup (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + enc->first_block_size = GST_BUFFER_SIZE (buffer); + } + } + } + + /* set buffer timestamp, duration, offset, offset_end from + * the wavpack header */ + GST_BUFFER_TIMESTAMP (buffer) = enc->timestamp_offset + + gst_util_uint64_scale_int (GST_SECOND, wph.block_index, + enc->samplerate); + GST_BUFFER_DURATION (buffer) = + gst_util_uint64_scale_int (GST_SECOND, wph.block_samples, + enc->samplerate); + GST_BUFFER_OFFSET (buffer) = wph.block_index; + GST_BUFFER_OFFSET_END (buffer) = wph.block_index + wph.block_samples; + } else { + /* if it's something else set no timestamp and duration on the buffer */ + GST_DEBUG_OBJECT (enc, "got %d bytes of unknown data", count); + + GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; + } + + /* push the buffer and forward errors */ + GST_DEBUG_OBJECT (enc, "pushing buffer with %d bytes", + GST_BUFFER_SIZE (buffer)); + *flow = gst_pad_push (pad, buffer); + + if (*flow != GST_FLOW_OK) { + GST_WARNING_OBJECT (enc, "flow on %s:%s = %s", + GST_DEBUG_PAD_NAME (pad), gst_flow_get_name (*flow)); + return FALSE; + } + + return TRUE; +} + +static void +gst_wavpack_enc_fix_channel_order (GstWavpackEnc * enc, gint32 * data, + gint nsamples) +{ + gint i, j; + gint32 tmp[8]; + + for (i = 0; i < nsamples / enc->channels; i++) { + for (j = 0; j < enc->channels; j++) { + tmp[enc->channel_mapping[j]] = data[j]; + } + for (j = 0; j < enc->channels; j++) { + data[j] = tmp[j]; + } + data += enc->channels; + } +} + +static GstFlowReturn +gst_wavpack_enc_chain (GstPad * pad, GstBuffer * buf) +{ + GstWavpackEnc *enc = GST_WAVPACK_ENC (gst_pad_get_parent (pad)); + uint32_t sample_count = GST_BUFFER_SIZE (buf) / 4; + GstFlowReturn ret; + + /* reset the last returns to GST_FLOW_OK. This is only set to something else + * while WavpackPackSamples() or more specific gst_wavpack_enc_push_block() + * so not valid anymore */ + enc->srcpad_last_return = enc->wvcsrcpad_last_return = GST_FLOW_OK; + + GST_DEBUG ("got %u raw samples", sample_count); + + /* check if we already have a valid WavpackContext, otherwise make one */ + if (!enc->wp_context) { + /* create raw context */ + enc->wp_context = + WavpackOpenFileOutput (gst_wavpack_enc_push_block, &enc->wv_id, + (enc->correction_mode > 0) ? &enc->wvc_id : NULL); + if (!enc->wp_context) { + GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL), + ("error creating Wavpack context")); + gst_object_unref (enc); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } + + /* set the WavpackConfig according to our parameters */ + gst_wavpack_enc_set_wp_config (enc); + + /* set the configuration to the context now that we know everything + * and initialize the encoder */ + if (!WavpackSetConfiguration (enc->wp_context, + enc->wp_config, (uint32_t) (-1)) + || !WavpackPackInit (enc->wp_context)) { + GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, (NULL), + ("error setting up wavpack encoding context")); + WavpackCloseFile (enc->wp_context); + gst_object_unref (enc); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } + GST_DEBUG ("setup of encoding context successfull"); + } + + /* Save the timestamp of the first buffer. This will be later + * used as offset for all following buffers */ + if (enc->timestamp_offset == GST_CLOCK_TIME_NONE) { + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + enc->timestamp_offset = GST_BUFFER_TIMESTAMP (buf); + enc->next_ts = GST_BUFFER_TIMESTAMP (buf); + } else { + enc->timestamp_offset = 0; + enc->next_ts = 0; + } + } + + /* Check if we have a continous stream, if not drop some samples or the buffer or + * insert some silence samples */ + if (enc->next_ts != GST_CLOCK_TIME_NONE && + GST_BUFFER_TIMESTAMP (buf) < enc->next_ts) { + guint64 diff = enc->next_ts - GST_BUFFER_TIMESTAMP (buf); + guint64 diff_bytes; + + GST_WARNING_OBJECT (enc, "Buffer is older than previous " + "timestamp + duration (%" GST_TIME_FORMAT "< %" GST_TIME_FORMAT + "), cannot handle. Clipping buffer.", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (enc->next_ts)); + + diff_bytes = + GST_CLOCK_TIME_TO_FRAMES (diff, enc->samplerate) * enc->channels * 2; + if (diff_bytes >= GST_BUFFER_SIZE (buf)) { + gst_buffer_unref (buf); + return GST_FLOW_OK; + } + buf = gst_buffer_make_metadata_writable (buf); + GST_BUFFER_DATA (buf) += diff_bytes; + GST_BUFFER_SIZE (buf) -= diff_bytes; + + GST_BUFFER_TIMESTAMP (buf) += diff; + if (GST_BUFFER_DURATION_IS_VALID (buf)) + GST_BUFFER_DURATION (buf) -= diff; + } + + /* Allow a diff of at most 5 ms */ + if (enc->next_ts != GST_CLOCK_TIME_NONE + && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + if (GST_BUFFER_TIMESTAMP (buf) != enc->next_ts && + GST_BUFFER_TIMESTAMP (buf) - enc->next_ts > 5 * GST_MSECOND) { + GST_WARNING_OBJECT (enc, + "Discontinuity detected: %" G_GUINT64_FORMAT " > %" G_GUINT64_FORMAT, + GST_BUFFER_TIMESTAMP (buf) - enc->next_ts, 5 * GST_MSECOND); + + WavpackFlushSamples (enc->wp_context); + enc->timestamp_offset += (GST_BUFFER_TIMESTAMP (buf) - enc->next_ts); + } + } + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf) + && GST_BUFFER_DURATION_IS_VALID (buf)) + enc->next_ts = GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf); + else + enc->next_ts = GST_CLOCK_TIME_NONE; + + if (enc->need_channel_remap) { + buf = gst_buffer_make_writable (buf); + gst_wavpack_enc_fix_channel_order (enc, (gint32 *) GST_BUFFER_DATA (buf), + sample_count); + } + + /* if we want to append the MD5 sum to the stream update it here + * with the current raw samples */ + if (enc->md5) { + g_checksum_update (enc->md5_context, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + } + + /* encode and handle return values from encoding */ + if (WavpackPackSamples (enc->wp_context, (int32_t *) GST_BUFFER_DATA (buf), + sample_count / enc->channels)) { + GST_DEBUG ("encoding samples successful"); + ret = GST_FLOW_OK; + } else { + if ((enc->srcpad_last_return == GST_FLOW_RESEND) || + (enc->wvcsrcpad_last_return == GST_FLOW_RESEND)) { + ret = GST_FLOW_RESEND; + } else if ((enc->srcpad_last_return == GST_FLOW_OK) || + (enc->wvcsrcpad_last_return == GST_FLOW_OK)) { + ret = GST_FLOW_OK; + } else if ((enc->srcpad_last_return == GST_FLOW_NOT_LINKED) && + (enc->wvcsrcpad_last_return == GST_FLOW_NOT_LINKED)) { + ret = GST_FLOW_NOT_LINKED; + } else if ((enc->srcpad_last_return == GST_FLOW_WRONG_STATE) && + (enc->wvcsrcpad_last_return == GST_FLOW_WRONG_STATE)) { + ret = GST_FLOW_WRONG_STATE; + } else { + GST_ELEMENT_ERROR (enc, LIBRARY, ENCODE, (NULL), + ("encoding samples failed")); + ret = GST_FLOW_ERROR; + } + } + + gst_buffer_unref (buf); + gst_object_unref (enc); + return ret; +} + +static void +gst_wavpack_enc_rewrite_first_block (GstWavpackEnc * enc) +{ + GstEvent *event = gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_BYTES, + 0, GST_BUFFER_OFFSET_NONE, 0); + gboolean ret; + + g_return_if_fail (enc); + g_return_if_fail (enc->first_block); + + /* update the sample count in the first block */ + WavpackUpdateNumSamples (enc->wp_context, enc->first_block); + + /* try to seek to the beginning of the output */ + ret = gst_pad_push_event (enc->srcpad, event); + if (ret) { + /* try to rewrite the first block */ + GST_DEBUG_OBJECT (enc, "rewriting first block ..."); + enc->wv_id.passthrough = TRUE; + ret = gst_wavpack_enc_push_block (&enc->wv_id, + enc->first_block, enc->first_block_size); + enc->wv_id.passthrough = FALSE; + } else { + GST_WARNING_OBJECT (enc, "rewriting of first block failed. " + "Seeking to first block failed!"); + } +} + +static gboolean +gst_wavpack_enc_sink_event (GstPad * pad, GstEvent * event) +{ + GstWavpackEnc *enc = GST_WAVPACK_ENC (gst_pad_get_parent (pad)); + gboolean ret = TRUE; + + GST_DEBUG ("Received %s event on sinkpad", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + /* Encode all remaining samples and flush them to the src pads */ + WavpackFlushSamples (enc->wp_context); + + /* Drop all remaining data, this is no complete block otherwise + * it would've been pushed already */ + if (enc->pending_buffer) { + gst_buffer_unref (enc->pending_buffer); + enc->pending_buffer = NULL; + enc->pending_offset = 0; + } + + /* write the MD5 sum if we have to write one */ + if ((enc->md5) && (enc->md5_context)) { + guint8 md5_digest[16]; + gsize digest_len = sizeof (md5_digest); + + g_checksum_get_digest (enc->md5_context, md5_digest, &digest_len); + if (digest_len == sizeof (md5_digest)) + WavpackStoreMD5Sum (enc->wp_context, md5_digest); + else + GST_WARNING_OBJECT (enc, "Calculating MD5 digest failed"); + } + + /* Try to rewrite the first frame with the correct sample number */ + if (enc->first_block) + gst_wavpack_enc_rewrite_first_block (enc); + + /* close the context if not already happened */ + if (enc->wp_context) { + WavpackCloseFile (enc->wp_context); + enc->wp_context = NULL; + } + + ret = gst_pad_event_default (pad, event); + break; + case GST_EVENT_NEWSEGMENT: + if (enc->wp_context) { + GST_WARNING_OBJECT (enc, "got NEWSEGMENT after encoding " + "already started"); + } + /* drop NEWSEGMENT events, we create our own when pushing + * the first buffer to the pads */ + gst_event_unref (event); + ret = TRUE; + break; + default: + ret = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (enc); + return ret; +} + +static GstStateChangeReturn +gst_wavpack_enc_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstWavpackEnc *enc = GST_WAVPACK_ENC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + /* set the last returned GstFlowReturns of the two pads to GST_FLOW_OK + * as they're only set to something else in WavpackPackSamples() or more + * specific gst_wavpack_enc_push_block() and nothing happened there yet */ + enc->srcpad_last_return = enc->wvcsrcpad_last_return = GST_FLOW_OK; + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + 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_wavpack_enc_reset (enc); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +static void +gst_wavpack_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWavpackEnc *enc = GST_WAVPACK_ENC (object); + + switch (prop_id) { + case ARG_MODE: + enc->mode = g_value_get_enum (value); + break; + case ARG_BITRATE:{ + guint val = g_value_get_uint (value); + + if ((val >= 24000) && (val <= 9600000)) { + enc->bitrate = val; + enc->bps = 0.0; + } else { + enc->bitrate = 0; + enc->bps = 0.0; + } + break; + } + case ARG_BITSPERSAMPLE:{ + gdouble val = g_value_get_double (value); + + if ((val >= 2.0) && (val <= 24.0)) { + enc->bps = val; + enc->bitrate = 0; + } else { + enc->bps = 0.0; + enc->bitrate = 0; + } + break; + } + case ARG_CORRECTION_MODE: + enc->correction_mode = g_value_get_enum (value); + break; + case ARG_MD5: + enc->md5 = g_value_get_boolean (value); + break; + case ARG_EXTRA_PROCESSING: + enc->extra_processing = g_value_get_uint (value); + break; + case ARG_JOINT_STEREO_MODE: + enc->joint_stereo_mode = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_wavpack_enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstWavpackEnc *enc = GST_WAVPACK_ENC (object); + + switch (prop_id) { + case ARG_MODE: + g_value_set_enum (value, enc->mode); + break; + case ARG_BITRATE: + if (enc->bps == 0.0) { + g_value_set_uint (value, enc->bitrate); + } else { + g_value_set_uint (value, 0); + } + break; + case ARG_BITSPERSAMPLE: + if (enc->bitrate == 0) { + g_value_set_double (value, enc->bps); + } else { + g_value_set_double (value, 0.0); + } + break; + case ARG_CORRECTION_MODE: + g_value_set_enum (value, enc->correction_mode); + break; + case ARG_MD5: + g_value_set_boolean (value, enc->md5); + break; + case ARG_EXTRA_PROCESSING: + g_value_set_uint (value, enc->extra_processing); + break; + case ARG_JOINT_STEREO_MODE: + g_value_set_enum (value, enc->joint_stereo_mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_wavpack_enc_plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "wavpackenc", + GST_RANK_NONE, GST_TYPE_WAVPACK_ENC)) + return FALSE; + + GST_DEBUG_CATEGORY_INIT (gst_wavpack_enc_debug, "wavpack_enc", 0, + "Wavpack encoder"); + + return TRUE; +} diff --git a/ext/wavpack/gstwavpackenc.h b/ext/wavpack/gstwavpackenc.h new file mode 100644 index 0000000..d2df844 --- /dev/null +++ b/ext/wavpack/gstwavpackenc.h @@ -0,0 +1,104 @@ +/* GStreamer Wavpack encoder plugin + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackenc.h: Wavpack audio encoder + * + * 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_WAVPACK_ENC_H__ +#define __GST_WAVPACK_ENC_H__ + +#include + +#include + +G_BEGIN_DECLS +#define GST_TYPE_WAVPACK_ENC \ + (gst_wavpack_enc_get_type()) +#define GST_WAVPACK_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVPACK_ENC,GstWavpackEnc)) +#define GST_WAVPACK_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVPACK_ENC,GstWavpackEnc)) +#define GST_IS_WAVPACK_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVPACK_ENC)) +#define GST_IS_WAVPACK_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVPACK_ENC)) +typedef struct _GstWavpackEnc GstWavpackEnc; +typedef struct _GstWavpackEncClass GstWavpackEncClass; + +typedef struct +{ + gboolean correction; + GstWavpackEnc *wavpack_enc; + gboolean passthrough; +} GstWavpackEncWriteID; + + +struct _GstWavpackEnc +{ + GstElement element; + + /*< private > */ + GstPad *sinkpad, *srcpad; + GstPad *wvcsrcpad; + + GstFlowReturn srcpad_last_return; + GstFlowReturn wvcsrcpad_last_return; + + WavpackConfig *wp_config; + WavpackContext *wp_context; + + gint samplerate; + gint channels; + gint channel_mask; + gint8 channel_mapping[8]; + gboolean need_channel_remap; + gint depth; + + GstWavpackEncWriteID wv_id; + GstWavpackEncWriteID wvc_id; + + guint mode; + guint bitrate; + gdouble bps; + guint correction_mode; + gboolean md5; + GChecksum *md5_context; + guint extra_processing; + guint joint_stereo_mode; + + void *first_block; + int32_t first_block_size; + + GstBuffer *pending_buffer; + gint32 pending_offset; + + GstClockTime timestamp_offset; + GstClockTime next_ts; +}; + +struct _GstWavpackEncClass +{ + GstElementClass parent; +}; + +GType gst_wavpack_enc_get_type (void); + +gboolean gst_wavpack_enc_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_WAVPACK_ENC_H__ */ diff --git a/ext/wavpack/gstwavpackparse.c b/ext/wavpack/gstwavpackparse.c new file mode 100644 index 0000000..e1ff785 --- /dev/null +++ b/ext/wavpack/gstwavpackparse.c @@ -0,0 +1,1344 @@ +/* GStreamer wavpack plugin + * Copyright (c) 2005 Arwed v. Merkatz + * Copyright (c) 2006 Tim-Philipp Müller + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackparse.c: wavpack file parser + * + * 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-wavpackparse + * + * WavpackParse takes raw, unframed Wavpack streams and splits them into + * single Wavpack chunks with information like bit depth and the position + * in the stream. + * Wavpack is an open-source + * audio codec that features both lossless and lossy encoding. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=test.wv ! wavpackparse ! wavpackdec ! fakesink + * ]| This pipeline decodes the Wavpack file test.wv into raw audio buffers. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include + +#include +#include + +#include +#include "gstwavpackparse.h" +#include "gstwavpackstreamreader.h" +#include "gstwavpackcommon.h" + +GST_DEBUG_CATEGORY_STATIC (gst_wavpack_parse_debug); +#define GST_CAT_DEFAULT gst_wavpack_parse_debug + +static inline GstWavpackParseIndexEntry * +gst_wavpack_parse_index_entry_new (void) +{ + return g_slice_new (GstWavpackParseIndexEntry); +} + +static inline void +gst_wavpack_parse_index_entry_free (GstWavpackParseIndexEntry * entry) +{ + g_slice_free (GstWavpackParseIndexEntry, entry); +} + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wavpack, " + "framed = (boolean) false; " + "audio/x-wavpack-correction, " "framed = (boolean) false") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("audio/x-wavpack, " + "width = (int) [ 1, 32 ], " + "channels = (int) [ 1, 8 ], " + "rate = (int) [ 6000, 192000 ], " "framed = (boolean) true") + ); + +static GstStaticPadTemplate wvc_src_factory = GST_STATIC_PAD_TEMPLATE ("wvcsrc", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("audio/x-wavpack-correction, " "framed = (boolean) true") + ); + +static gboolean gst_wavpack_parse_sink_activate (GstPad * sinkpad); + +static gboolean +gst_wavpack_parse_sink_activate_pull (GstPad * sinkpad, gboolean active); + +static void gst_wavpack_parse_loop (GstElement * element); + +static GstStateChangeReturn gst_wavpack_parse_change_state (GstElement * + element, GstStateChange transition); +static void gst_wavpack_parse_reset (GstWavpackParse * parse); + +static gint64 gst_wavpack_parse_get_upstream_length (GstWavpackParse * wvparse); + +static GstBuffer *gst_wavpack_parse_pull_buffer (GstWavpackParse * wvparse, + gint64 offset, guint size, GstFlowReturn * flow); +static GstFlowReturn gst_wavpack_parse_chain (GstPad * pad, GstBuffer * buf); + +GST_BOILERPLATE (GstWavpackParse, gst_wavpack_parse, GstElement, + GST_TYPE_ELEMENT); + +static void +gst_wavpack_parse_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, + &wvc_src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "Wavpack parser", + "Codec/Demuxer/Audio", + "Parses Wavpack files", + "Arwed v. Merkatz , " + "Sebastian Dröge "); +} + +static void +gst_wavpack_parse_finalize (GObject * object) +{ + gst_wavpack_parse_reset (GST_WAVPACK_PARSE (object)); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_wavpack_parse_class_init (GstWavpackParseClass * klass) +{ + GObjectClass *gobject_class; + + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_wavpack_parse_finalize; + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_wavpack_parse_change_state); +} + +static GstWavpackParseIndexEntry * +gst_wavpack_parse_index_get_last_entry (GstWavpackParse * wvparse) +{ + g_assert (wvparse->entries != NULL); + + return wvparse->entries->data; +} + +static GstWavpackParseIndexEntry * +gst_wavpack_parse_index_get_entry_from_sample (GstWavpackParse * wvparse, + gint64 sample_offset) +{ + gint i; + + GSList *node; + + if (wvparse->entries == NULL) + return NULL; + + for (node = wvparse->entries, i = 0; node; node = node->next, i++) { + GstWavpackParseIndexEntry *entry; + + entry = node->data; + + GST_LOG_OBJECT (wvparse, "Index entry %03u: sample %" G_GINT64_FORMAT " @" + " byte %" G_GINT64_FORMAT, i, entry->sample_offset, entry->byte_offset); + + if (entry->sample_offset <= sample_offset && + sample_offset < entry->sample_offset_end) { + GST_LOG_OBJECT (wvparse, "found match"); + return entry; + } + + /* as the list is sorted and we first look at the latest entry + * we can abort searching for an entry if the sample we want is + * after the latest one */ + if (sample_offset >= entry->sample_offset_end) + break; + } + GST_LOG_OBJECT (wvparse, "no match in index"); + return NULL; +} + +static void +gst_wavpack_parse_index_append_entry (GstWavpackParse * wvparse, + gint64 byte_offset, gint64 sample_offset, gint64 num_samples) +{ + GstWavpackParseIndexEntry *entry; + + /* do we have this one already? */ + if (wvparse->entries) { + entry = gst_wavpack_parse_index_get_last_entry (wvparse); + if (entry->byte_offset >= byte_offset + || entry->sample_offset >= sample_offset) + return; + } + + GST_LOG_OBJECT (wvparse, "Adding index entry %8" G_GINT64_FORMAT " - %" + GST_TIME_FORMAT " @ offset 0x%08" G_GINT64_MODIFIER "x", sample_offset, + GST_TIME_ARGS (gst_util_uint64_scale_int (sample_offset, + GST_SECOND, wvparse->samplerate)), byte_offset); + + entry = gst_wavpack_parse_index_entry_new (); + entry->byte_offset = byte_offset; + entry->sample_offset = sample_offset; + entry->sample_offset_end = sample_offset + num_samples; + wvparse->entries = g_slist_prepend (wvparse->entries, entry); +} + +static void +gst_wavpack_parse_reset (GstWavpackParse * parse) +{ + parse->total_samples = G_GINT64_CONSTANT (-1); + parse->samplerate = 0; + parse->channels = 0; + + gst_segment_init (&parse->segment, GST_FORMAT_UNDEFINED); + parse->next_block_index = 0; + + parse->current_offset = 0; + parse->need_newsegment = TRUE; + parse->discont = TRUE; + parse->upstream_length = -1; + + if (parse->entries) { + g_slist_foreach (parse->entries, (GFunc) gst_wavpack_parse_index_entry_free, + NULL); + g_slist_free (parse->entries); + parse->entries = NULL; + } + + if (parse->adapter) { + gst_adapter_clear (parse->adapter); + g_object_unref (parse->adapter); + parse->adapter = NULL; + } + + if (parse->srcpad != NULL) { + gboolean res; + + GST_DEBUG_OBJECT (parse, "Removing src pad"); + res = gst_element_remove_pad (GST_ELEMENT (parse), parse->srcpad); + g_return_if_fail (res != FALSE); + gst_object_unref (parse->srcpad); + parse->srcpad = NULL; + } + + g_list_foreach (parse->queued_events, (GFunc) gst_mini_object_unref, NULL); + g_list_free (parse->queued_events); + parse->queued_events = NULL; + + if (parse->pending_buffer) + gst_buffer_unref (parse->pending_buffer); + + parse->pending_buffer = NULL; +} + +static const GstQueryType * +gst_wavpack_parse_get_src_query_types (GstPad * pad) +{ + static const GstQueryType types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_SEEKING, + 0 + }; + + return types; +} + +static gboolean +gst_wavpack_parse_src_query (GstPad * pad, GstQuery * query) +{ + GstWavpackParse *parse = GST_WAVPACK_PARSE (gst_pad_get_parent (pad)); + + GstFormat format; + + gboolean ret = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION:{ + gint64 cur; + + guint rate; + + GST_OBJECT_LOCK (parse); + cur = parse->segment.last_stop; + rate = parse->samplerate; + GST_OBJECT_UNLOCK (parse); + + if (rate == 0) { + GST_DEBUG_OBJECT (parse, "haven't read header yet"); + break; + } + + gst_query_parse_position (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME: + cur = gst_util_uint64_scale_int (cur, GST_SECOND, rate); + gst_query_set_position (query, GST_FORMAT_TIME, cur); + ret = TRUE; + break; + case GST_FORMAT_DEFAULT: + gst_query_set_position (query, GST_FORMAT_DEFAULT, cur); + ret = TRUE; + break; + default: + GST_DEBUG_OBJECT (parse, "cannot handle position query in " + "%s format. Forwarding upstream.", gst_format_get_name (format)); + ret = gst_pad_query_default (pad, query); + break; + } + break; + } + case GST_QUERY_DURATION:{ + gint64 len; + + guint rate; + + GST_OBJECT_LOCK (parse); + rate = parse->samplerate; + len = parse->total_samples; + GST_OBJECT_UNLOCK (parse); + + if (rate == 0) { + GST_DEBUG_OBJECT (parse, "haven't read header yet"); + break; + } + + gst_query_parse_duration (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME: + if (len != G_GINT64_CONSTANT (-1)) + len = gst_util_uint64_scale_int (len, GST_SECOND, rate); + gst_query_set_duration (query, GST_FORMAT_TIME, len); + ret = TRUE; + break; + case GST_FORMAT_DEFAULT: + gst_query_set_duration (query, GST_FORMAT_DEFAULT, len); + ret = TRUE; + break; + default: + GST_DEBUG_OBJECT (parse, "cannot handle duration query in " + "%s format. Forwarding upstream.", gst_format_get_name (format)); + ret = gst_pad_query_default (pad, query); + break; + } + break; + } + case GST_QUERY_SEEKING:{ + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + if (format == GST_FORMAT_TIME || format == GST_FORMAT_DEFAULT) { + gboolean seekable; + + gint64 duration = -1; + + /* only fails if we didn't read the headers yet and can't say + * anything about our seeking capabilities */ + if (!gst_pad_query_duration (pad, &format, &duration)) + break; + + /* can't seek in streaming mode yet */ + GST_OBJECT_LOCK (parse); + seekable = (parse->adapter == NULL); + GST_OBJECT_UNLOCK (parse); + + gst_query_set_seeking (query, format, seekable, 0, duration); + ret = TRUE; + } + break; + } + default:{ + ret = gst_pad_query_default (pad, query); + break; + } + } + + gst_object_unref (parse); + return ret; + +} + +/* returns TRUE on success, with byte_offset set to the offset of the + * wavpack chunk containing the sample requested. start_sample will be + * set to the first sample in the chunk starting at byte_offset. + * Scanning from the last known header offset to the wanted position + * when seeking forward isn't very clever, but seems fast enough in + * practice and has the nice side effect of populating our index + * table */ +static gboolean +gst_wavpack_parse_scan_to_find_sample (GstWavpackParse * parse, + gint64 sample, gint64 * byte_offset, gint64 * start_sample) +{ + GstWavpackParseIndexEntry *entry; + + GstFlowReturn ret; + + gint64 off = 0; + + /* first, check if we have to scan at all */ + entry = gst_wavpack_parse_index_get_entry_from_sample (parse, sample); + if (entry) { + *byte_offset = entry->byte_offset; + *start_sample = entry->sample_offset; + GST_LOG_OBJECT (parse, "Found index entry: sample %" G_GINT64_FORMAT + " @ offset %" G_GINT64_FORMAT, entry->sample_offset, + entry->byte_offset); + return TRUE; + } + + GST_LOG_OBJECT (parse, "No matching entry in index, scanning file ..."); + + /* if we have an index, we can start scanning from the last known offset + * in there, after all we know our wanted sample is not in the index */ + if (parse->entries) { + GstWavpackParseIndexEntry *entry; + + entry = gst_wavpack_parse_index_get_last_entry (parse); + off = entry->byte_offset; + } + + /* now scan forward until we find the chunk we're looking for or hit EOS */ + do { + WavpackHeader header; + + GstBuffer *buf; + + buf = gst_wavpack_parse_pull_buffer (parse, off, sizeof (WavpackHeader), + &ret); + + if (buf == NULL) + break; + + gst_wavpack_read_header (&header, GST_BUFFER_DATA (buf)); + gst_buffer_unref (buf); + + if (header.flags & INITIAL_BLOCK) + gst_wavpack_parse_index_append_entry (parse, off, header.block_index, + header.block_samples); + else + continue; + + if (header.block_index <= sample && + sample < (header.block_index + header.block_samples)) { + *byte_offset = off; + *start_sample = header.block_index; + return TRUE; + } + + off += header.ckSize + 8; + } while (1); + + GST_DEBUG_OBJECT (parse, "scan failed: %s (off=0x%08" G_GINT64_MODIFIER "x)", + gst_flow_get_name (ret), off); + + return FALSE; +} + +static gboolean +gst_wavpack_parse_send_newsegment (GstWavpackParse * wvparse, gboolean update) +{ + GstSegment *s = &wvparse->segment; + + gboolean ret; + + gint64 stop_time = -1; + + gint64 start_time = 0; + + gint64 cur_pos_time; + + gint64 diff; + + /* segment is in DEFAULT format, but we want to send a TIME newsegment */ + start_time = gst_util_uint64_scale_int (s->start, GST_SECOND, + wvparse->samplerate); + + if (s->stop != -1) { + stop_time = gst_util_uint64_scale_int (s->stop, GST_SECOND, + wvparse->samplerate); + } + + GST_DEBUG_OBJECT (wvparse, "sending newsegment from %" GST_TIME_FORMAT + " to %" GST_TIME_FORMAT, GST_TIME_ARGS (start_time), + GST_TIME_ARGS (stop_time)); + + /* after a seek, s->last_stop will point to a chunk boundary, ie. from + * which sample we will start sending data again, while s->start will + * point to the sample we actually want to seek to and want to start + * playing right after the seek. Adjust clock-time for the difference + * so we start playing from start_time */ + cur_pos_time = gst_util_uint64_scale_int (s->last_stop, GST_SECOND, + wvparse->samplerate); + diff = start_time - cur_pos_time; + + ret = gst_pad_push_event (wvparse->srcpad, + gst_event_new_new_segment (update, s->rate, GST_FORMAT_TIME, + start_time, stop_time, start_time - diff)); + + return ret; +} + +static gboolean +gst_wavpack_parse_handle_seek_event (GstWavpackParse * wvparse, + GstEvent * event) +{ + GstSeekFlags seek_flags; + + GstSeekType start_type; + + GstSeekType stop_type; + + GstSegment segment; + + GstFormat format; + + gboolean only_update; + + gboolean flush, ret; + + gdouble speed; + + gint64 stop; + + gint64 start; /* sample we want to seek to */ + + gint64 byte_offset; /* byte offset the chunk we seek to starts at */ + + gint64 chunk_start; /* first sample in chunk we seek to */ + + guint rate; + + gint64 last_stop; + + if (wvparse->adapter) { + GST_DEBUG_OBJECT (wvparse, "seeking in streaming mode not implemented yet"); + return FALSE; + } + + gst_event_parse_seek (event, &speed, &format, &seek_flags, &start_type, + &start, &stop_type, &stop); + + if (format != GST_FORMAT_DEFAULT && format != GST_FORMAT_TIME) { + GST_DEBUG ("seeking is only supported in TIME or DEFAULT format"); + return FALSE; + } + + if (speed < 0.0) { + GST_DEBUG ("only forward playback supported, rate %f not allowed", speed); + return FALSE; + } + + GST_OBJECT_LOCK (wvparse); + + rate = wvparse->samplerate; + if (rate == 0) { + GST_OBJECT_UNLOCK (wvparse); + GST_DEBUG ("haven't read header yet"); + return FALSE; + } + + /* figure out the last position we need to play. If it's configured (stop != + * -1), use that, else we play until the total duration of the file */ + if (stop == -1) + stop = wvparse->segment.duration; + + /* convert from time to samples if necessary */ + if (format == GST_FORMAT_TIME) { + if (start_type != GST_SEEK_TYPE_NONE) + start = gst_util_uint64_scale_int (start, rate, GST_SECOND); + if (stop_type != GST_SEEK_TYPE_NONE) + stop = gst_util_uint64_scale_int (stop, rate, GST_SECOND); + } + + if (start < 0) { + GST_OBJECT_UNLOCK (wvparse); + GST_DEBUG_OBJECT (wvparse, "Invalid start sample %" G_GINT64_FORMAT, start); + return FALSE; + } + + flush = ((seek_flags & GST_SEEK_FLAG_FLUSH) != 0); + + /* operate on segment copy until we know the seek worked */ + segment = wvparse->segment; + + gst_segment_set_seek (&segment, speed, GST_FORMAT_DEFAULT, + seek_flags, start_type, start, stop_type, stop, &only_update); + +#if 0 + if (only_update) { + wvparse->segment = segment; + gst_wavpack_parse_send_newsegment (wvparse, TRUE); + goto done; + } +#endif + + gst_pad_push_event (wvparse->sinkpad, gst_event_new_flush_start ()); + + if (flush) { + gst_pad_push_event (wvparse->srcpad, gst_event_new_flush_start ()); + } else { + gst_pad_pause_task (wvparse->sinkpad); + } + + GST_PAD_STREAM_LOCK (wvparse->sinkpad); + + /* Save current position */ + last_stop = wvparse->segment.last_stop; + + gst_pad_push_event (wvparse->sinkpad, gst_event_new_flush_stop ()); + + if (flush) { + gst_pad_push_event (wvparse->srcpad, gst_event_new_flush_stop ()); + } + + GST_DEBUG_OBJECT (wvparse, "Performing seek to %" GST_TIME_FORMAT " sample %" + G_GINT64_FORMAT, GST_TIME_ARGS (segment.start * GST_SECOND / rate), + start); + + ret = gst_wavpack_parse_scan_to_find_sample (wvparse, segment.start, + &byte_offset, &chunk_start); + + if (ret) { + GST_DEBUG_OBJECT (wvparse, "new offset: %" G_GINT64_FORMAT, byte_offset); + wvparse->current_offset = byte_offset; + /* we want to send a newsegment event with the actual seek position + * as start, even though our first buffer might start before the + * configured segment. We leave it up to the decoder or sink to crop + * the output buffers accordingly */ + wvparse->segment = segment; + wvparse->segment.last_stop = chunk_start; + wvparse->need_newsegment = TRUE; + wvparse->discont = (last_stop != chunk_start) ? TRUE : FALSE; + + /* if we're doing a segment seek, post a SEGMENT_START message */ + if (wvparse->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT_CAST (wvparse), + gst_message_new_segment_start (GST_OBJECT_CAST (wvparse), + wvparse->segment.format, wvparse->segment.last_stop)); + } + } else { + GST_DEBUG_OBJECT (wvparse, "seek failed: don't know where to seek to"); + } + + GST_PAD_STREAM_UNLOCK (wvparse->sinkpad); + GST_OBJECT_UNLOCK (wvparse); + + gst_pad_start_task (wvparse->sinkpad, + (GstTaskFunction) gst_wavpack_parse_loop, wvparse); + + return ret; +} + +static gboolean +gst_wavpack_parse_sink_event (GstPad * pad, GstEvent * event) +{ + GstWavpackParse *parse; + + gboolean ret = TRUE; + + parse = GST_WAVPACK_PARSE (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP:{ + if (parse->adapter) { + gst_adapter_clear (parse->adapter); + } + if (parse->pending_buffer) { + gst_buffer_unref (parse->pending_buffer); + parse->pending_buffer = NULL; + parse->pending_offset = 0; + } + ret = gst_pad_push_event (parse->srcpad, event); + break; + } + case GST_EVENT_NEWSEGMENT:{ + parse->need_newsegment = TRUE; + gst_event_unref (event); + ret = TRUE; + break; + } + case GST_EVENT_EOS:{ + if (parse->adapter) { + /* remove all bytes that are left in the adapter after EOS. They can't + * be a complete Wavpack block and we can't do anything with them */ + gst_adapter_clear (parse->adapter); + } + if (parse->pending_buffer) { + gst_buffer_unref (parse->pending_buffer); + parse->pending_buffer = NULL; + parse->pending_offset = 0; + } + ret = gst_pad_push_event (parse->srcpad, event); + break; + } + default:{ + /* stream lock is recursive, should be fine for all events */ + GST_PAD_STREAM_LOCK (pad); + if (parse->srcpad == NULL) { + parse->queued_events = g_list_append (parse->queued_events, event); + } else { + ret = gst_pad_push_event (parse->srcpad, event); + } + GST_PAD_STREAM_UNLOCK (pad); + } + } + + + gst_object_unref (parse); + return ret; +} + +static gboolean +gst_wavpack_parse_src_event (GstPad * pad, GstEvent * event) +{ + GstWavpackParse *parse; + + gboolean ret; + + parse = GST_WAVPACK_PARSE (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + ret = gst_wavpack_parse_handle_seek_event (parse, event); + break; + default: + ret = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (parse); + return ret; +} + +static void +gst_wavpack_parse_init (GstWavpackParse * parse, GstWavpackParseClass * gclass) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (parse); + + GstPadTemplate *tmpl; + + tmpl = gst_element_class_get_pad_template (klass, "sink"); + parse->sinkpad = gst_pad_new_from_template (tmpl, "sink"); + + gst_pad_set_activate_function (parse->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_parse_sink_activate)); + gst_pad_set_activatepull_function (parse->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_parse_sink_activate_pull)); + gst_pad_set_event_function (parse->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_parse_sink_event)); + gst_pad_set_chain_function (parse->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavpack_parse_chain)); + + gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad); + + parse->srcpad = NULL; + gst_wavpack_parse_reset (parse); +} + +static gint64 +gst_wavpack_parse_get_upstream_length (GstWavpackParse * parse) +{ + gint64 length = -1; + + GstFormat format = GST_FORMAT_BYTES; + + if (!gst_pad_query_peer_duration (parse->sinkpad, &format, &length)) { + length = -1; + } else { + GST_DEBUG ("upstream length: %" G_GINT64_FORMAT, length); + } + return length; +} + +static GstBuffer * +gst_wavpack_parse_pull_buffer (GstWavpackParse * wvparse, gint64 offset, + guint size, GstFlowReturn * flow) +{ + GstFlowReturn flow_ret; + + GstBuffer *buf = NULL; + + if (offset + size > wvparse->upstream_length) { + wvparse->upstream_length = gst_wavpack_parse_get_upstream_length (wvparse); + if (offset + size > wvparse->upstream_length) { + GST_DEBUG_OBJECT (wvparse, "EOS: %" G_GINT64_FORMAT " + %u > %" + G_GINT64_FORMAT, offset, size, wvparse->upstream_length); + flow_ret = GST_FLOW_UNEXPECTED; + goto done; + } + } + + flow_ret = gst_pad_pull_range (wvparse->sinkpad, offset, size, &buf); + + if (flow_ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (wvparse, "pull_range (%" G_GINT64_FORMAT ", %u) " + "failed, flow: %s", offset, size, gst_flow_get_name (flow_ret)); + buf = NULL; + goto done; + } + + if (GST_BUFFER_SIZE (buf) < size) { + GST_DEBUG_OBJECT (wvparse, "Short read at offset %" G_GINT64_FORMAT + ", got only %u of %u bytes", offset, GST_BUFFER_SIZE (buf), size); + gst_buffer_unref (buf); + buf = NULL; + flow_ret = GST_FLOW_UNEXPECTED; + } + +done: + if (flow) + *flow = flow_ret; + return buf; +} + +static gboolean +gst_wavpack_parse_create_src_pad (GstWavpackParse * wvparse, GstBuffer * buf, + WavpackHeader * header) +{ + GstWavpackMetadata meta; + + GstCaps *caps = NULL; + + guchar *bufptr; + + g_assert (wvparse->srcpad == NULL); + + bufptr = GST_BUFFER_DATA (buf) + sizeof (WavpackHeader); + + while (gst_wavpack_read_metadata (&meta, GST_BUFFER_DATA (buf), &bufptr)) { + switch (meta.id) { + case ID_WVC_BITSTREAM:{ + caps = gst_caps_new_simple ("audio/x-wavpack-correction", + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + wvparse->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_GET_CLASS (wvparse), "wvcsrc"), "wvcsrc"); + break; + } + case ID_WV_BITSTREAM: + case ID_WVX_BITSTREAM:{ + WavpackStreamReader *stream_reader = gst_wavpack_stream_reader_new (); + + WavpackContext *wpc; + + gchar error_msg[80]; + + read_id rid; + + gint channel_mask; + + rid.buffer = GST_BUFFER_DATA (buf); + rid.length = GST_BUFFER_SIZE (buf); + rid.position = 0; + + wpc = + WavpackOpenFileInputEx (stream_reader, &rid, NULL, error_msg, 0, 0); + + if (!wpc) + return FALSE; + + wvparse->samplerate = WavpackGetSampleRate (wpc); + wvparse->channels = WavpackGetNumChannels (wpc); + wvparse->total_samples = + (header->total_samples == + 0xffffffff) ? G_GINT64_CONSTANT (-1) : header->total_samples; + + caps = gst_caps_new_simple ("audio/x-wavpack", + "width", G_TYPE_INT, WavpackGetBitsPerSample (wpc), + "channels", G_TYPE_INT, wvparse->channels, + "rate", G_TYPE_INT, wvparse->samplerate, + "framed", G_TYPE_BOOLEAN, TRUE, NULL); +#ifdef WAVPACK_OLD_API + channel_mask = wpc->config.channel_mask; +#else + channel_mask = WavpackGetChannelMask (wpc); +#endif + if (channel_mask == 0) + channel_mask = + gst_wavpack_get_default_channel_mask (wvparse->channels); + + if (channel_mask != 0) { + if (!gst_wavpack_set_channel_layout (caps, channel_mask)) { + GST_WARNING_OBJECT (wvparse, "Failed to set channel layout"); + gst_caps_unref (caps); + caps = NULL; + WavpackCloseFile (wpc); + g_free (stream_reader); + break; + } + } + + wvparse->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_GET_CLASS (wvparse), "src"), "src"); + WavpackCloseFile (wpc); + g_free (stream_reader); + break; + } + default:{ + GST_LOG_OBJECT (wvparse, "unhandled ID: 0x%02x", meta.id); + break; + } + } + if (caps != NULL) + break; + } + + if (caps == NULL || wvparse->srcpad == NULL) + return FALSE; + + GST_DEBUG_OBJECT (wvparse, "Added src pad with caps %" GST_PTR_FORMAT, caps); + + gst_pad_set_query_function (wvparse->srcpad, + GST_DEBUG_FUNCPTR (gst_wavpack_parse_src_query)); + gst_pad_set_query_type_function (wvparse->srcpad, + GST_DEBUG_FUNCPTR (gst_wavpack_parse_get_src_query_types)); + gst_pad_set_event_function (wvparse->srcpad, + GST_DEBUG_FUNCPTR (gst_wavpack_parse_src_event)); + + gst_pad_set_caps (wvparse->srcpad, caps); + gst_caps_unref (caps); + gst_pad_use_fixed_caps (wvparse->srcpad); + + gst_object_ref (wvparse->srcpad); + gst_pad_set_active (wvparse->srcpad, TRUE); + gst_element_add_pad (GST_ELEMENT (wvparse), wvparse->srcpad); + gst_element_no_more_pads (GST_ELEMENT (wvparse)); + + return TRUE; +} + +static GstFlowReturn +gst_wavpack_parse_push_buffer (GstWavpackParse * wvparse, GstBuffer * buf, + WavpackHeader * header) +{ + GstFlowReturn ret; + wvparse->current_offset += header->ckSize + 8; + + wvparse->segment.last_stop = header->block_index; + + if (wvparse->need_newsegment) { + if (gst_wavpack_parse_send_newsegment (wvparse, FALSE)) + wvparse->need_newsegment = FALSE; + } + + /* send any queued events */ + if (wvparse->queued_events) { + GList *l; + + for (l = wvparse->queued_events; l != NULL; l = l->next) { + gst_pad_push_event (wvparse->srcpad, GST_EVENT (l->data)); + } + g_list_free (wvparse->queued_events); + wvparse->queued_events = NULL; + } + + if (wvparse->pending_buffer == NULL) { + wvparse->pending_buffer = buf; + wvparse->pending_offset = header->block_index; + } else if (wvparse->pending_offset == header->block_index) { + wvparse->pending_buffer = gst_buffer_join (wvparse->pending_buffer, buf); + } else { + GST_ERROR ("Got incomplete block, dropping"); + gst_buffer_unref (wvparse->pending_buffer); + wvparse->pending_buffer = buf; + wvparse->pending_offset = header->block_index; + } + + if (!(header->flags & FINAL_BLOCK)) + return GST_FLOW_OK; + + buf = wvparse->pending_buffer; + wvparse->pending_buffer = NULL; + + GST_BUFFER_TIMESTAMP (buf) = gst_util_uint64_scale_int (header->block_index, + GST_SECOND, wvparse->samplerate); + GST_BUFFER_DURATION (buf) = gst_util_uint64_scale_int (header->block_samples, + GST_SECOND, wvparse->samplerate); + GST_BUFFER_OFFSET (buf) = header->block_index; + GST_BUFFER_OFFSET_END (buf) = header->block_index + header->block_samples; + + if (wvparse->discont || wvparse->next_block_index != header->block_index) { + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + wvparse->discont = FALSE; + } + + wvparse->next_block_index = header->block_index + header->block_samples; + + gst_buffer_set_caps (buf, GST_PAD_CAPS (wvparse->srcpad)); + + GST_LOG_OBJECT (wvparse, "Pushing buffer with time %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + ret = gst_pad_push (wvparse->srcpad, buf); + + wvparse->segment.last_stop = wvparse->next_block_index; + + return ret; +} + +static guint8 * +gst_wavpack_parse_find_marker (guint8 * buf, guint size) +{ + int i; + + guint8 *ret = NULL; + + if (G_UNLIKELY (size < 4)) + return NULL; + + for (i = 0; i < size - 4; i++) { + if (memcmp (buf + i, "wvpk", 4) == 0) { + ret = buf + i; + break; + } + } + return ret; +} + +static GstFlowReturn +gst_wavpack_parse_resync_loop (GstWavpackParse * parse, WavpackHeader * header) +{ + GstFlowReturn flow_ret = GST_FLOW_UNEXPECTED; + + GstBuffer *buf = NULL; + + /* loop until we have a frame header or reach the end of the stream */ + while (1) { + guint8 *data, *marker; + + guint len, size; + + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + + if (parse->upstream_length == 0 || + parse->upstream_length <= parse->current_offset) { + parse->upstream_length = gst_wavpack_parse_get_upstream_length (parse); + if (parse->upstream_length == 0 || + parse->upstream_length <= parse->current_offset) { + break; + } + } + + len = MIN (parse->upstream_length - parse->current_offset, 2048); + + GST_LOG_OBJECT (parse, "offset: %" G_GINT64_FORMAT, parse->current_offset); + + buf = gst_wavpack_parse_pull_buffer (parse, parse->current_offset, + len, &flow_ret); + + /* whatever the problem is, there's nothing more for us to do for now */ + if (flow_ret != GST_FLOW_OK) + break; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* not enough data for a header? */ + if (size < sizeof (WavpackHeader)) + break; + + /* got a header right where we are at now? */ + if (gst_wavpack_read_header (header, data)) + break; + + /* nope, let's see if we can find one */ + marker = gst_wavpack_parse_find_marker (data + 1, size - 1); + + if (marker) { + parse->current_offset += marker - data; + /* do one more loop iteration to make sure we pull enough + * data for a full header, we'll bail out then */ + } else { + parse->current_offset += len - 4; + } + } + + if (buf) + gst_buffer_unref (buf); + + return flow_ret; +} + +static void +gst_wavpack_parse_loop (GstElement * element) +{ + GstWavpackParse *parse = GST_WAVPACK_PARSE (element); + + GstFlowReturn flow_ret; + WavpackHeader header = { {0,}, 0, }; + GstBuffer *buf = NULL; + + flow_ret = gst_wavpack_parse_resync_loop (parse, &header); + + if (flow_ret != GST_FLOW_OK) + goto pause; + + GST_LOG_OBJECT (parse, "Read header at offset %" G_GINT64_FORMAT + ": chunk size = %u+8", parse->current_offset, header.ckSize); + + buf = gst_wavpack_parse_pull_buffer (parse, parse->current_offset, + header.ckSize + 8, &flow_ret); + + if (flow_ret != GST_FLOW_OK) + goto pause; + + if (parse->srcpad == NULL) { + if (!gst_wavpack_parse_create_src_pad (parse, buf, &header)) { + GST_ERROR_OBJECT (parse, "Failed to create src pad"); + flow_ret = GST_FLOW_ERROR; + goto pause; + } + } + if (header.flags & INITIAL_BLOCK) + gst_wavpack_parse_index_append_entry (parse, parse->current_offset, + header.block_index, header.block_samples); + + flow_ret = gst_wavpack_parse_push_buffer (parse, buf, &header); + if (flow_ret != GST_FLOW_OK) + goto pause; + + return; + +pause: + { + const gchar *reason = gst_flow_get_name (flow_ret); + + GST_LOG_OBJECT (parse, "pausing task, reason %s", reason); + gst_pad_pause_task (parse->sinkpad); + + if (flow_ret == GST_FLOW_UNEXPECTED && parse->srcpad) { + if (parse->segment.flags & GST_SEEK_FLAG_SEGMENT) { + GstClockTime stop; + + GST_LOG_OBJECT (parse, "Sending segment done"); + + if ((stop = parse->segment.stop) == -1) + stop = parse->segment.duration; + + gst_element_post_message (GST_ELEMENT_CAST (parse), + gst_message_new_segment_done (GST_OBJECT_CAST (parse), + parse->segment.format, stop)); + } else { + GST_LOG_OBJECT (parse, "Sending EOS, at end of stream"); + gst_pad_push_event (parse->srcpad, gst_event_new_eos ()); + } + } else if (flow_ret == GST_FLOW_NOT_LINKED + || flow_ret < GST_FLOW_UNEXPECTED) { + GST_ELEMENT_ERROR (parse, STREAM, FAILED, + (_("Internal data stream error.")), ("stream stopped, reason %s", + reason)); + if (parse->srcpad) + gst_pad_push_event (parse->srcpad, gst_event_new_eos ()); + } + return; + } +} + +static gboolean +gst_wavpack_parse_resync_adapter (GstAdapter * adapter) +{ + const guint8 *buf, *marker; + + guint avail = gst_adapter_available (adapter); + + if (avail < 4) + return FALSE; + + /* if the marker is at the beginning don't do the expensive search */ + buf = gst_adapter_peek (adapter, 4); + if (memcmp (buf, "wvpk", 4) == 0) + return TRUE; + + if (avail == 4) + return FALSE; + + /* search for the marker in the complete content of the adapter */ + buf = gst_adapter_peek (adapter, avail); + if (buf && (marker = gst_wavpack_parse_find_marker ((guint8 *) buf, avail))) { + gst_adapter_flush (adapter, marker - buf); + return TRUE; + } + + /* flush everything except the last 4 bytes. they could contain + * the start of a new marker */ + gst_adapter_flush (adapter, avail - 4); + + return FALSE; +} + +static GstFlowReturn +gst_wavpack_parse_chain (GstPad * pad, GstBuffer * buf) +{ + GstWavpackParse *wvparse = GST_WAVPACK_PARSE (GST_PAD_PARENT (pad)); + + GstFlowReturn ret = GST_FLOW_OK; + + WavpackHeader wph; + + const guint8 *tmp_buf; + + if (!wvparse->adapter) { + wvparse->adapter = gst_adapter_new (); + } + + if (GST_BUFFER_IS_DISCONT (buf)) { + gst_adapter_clear (wvparse->adapter); + wvparse->discont = TRUE; + } + + gst_adapter_push (wvparse->adapter, buf); + + if (gst_adapter_available (wvparse->adapter) < sizeof (WavpackHeader)) + return ret; + + if (!gst_wavpack_parse_resync_adapter (wvparse->adapter)) + return ret; + + tmp_buf = gst_adapter_peek (wvparse->adapter, sizeof (WavpackHeader)); + gst_wavpack_read_header (&wph, (guint8 *) tmp_buf); + + while (gst_adapter_available (wvparse->adapter) >= wph.ckSize + 4 * 1 + 4) { + GstBuffer *outbuf = + gst_adapter_take_buffer (wvparse->adapter, wph.ckSize + 4 * 1 + 4); + + if (!outbuf) + return GST_FLOW_ERROR; + + if (wvparse->srcpad == NULL) { + if (!gst_wavpack_parse_create_src_pad (wvparse, outbuf, &wph)) { + GST_ERROR_OBJECT (wvparse, "Failed to create src pad"); + ret = GST_FLOW_ERROR; + break; + } + } + + ret = gst_wavpack_parse_push_buffer (wvparse, outbuf, &wph); + + if (ret != GST_FLOW_OK) + break; + + if (gst_adapter_available (wvparse->adapter) >= sizeof (WavpackHeader)) { + tmp_buf = gst_adapter_peek (wvparse->adapter, sizeof (WavpackHeader)); + + if (!gst_wavpack_parse_resync_adapter (wvparse->adapter)) + break; + + gst_wavpack_read_header (&wph, (guint8 *) tmp_buf); + } + } + + return ret; +} + +static GstStateChangeReturn +gst_wavpack_parse_change_state (GstElement * element, GstStateChange transition) +{ + GstWavpackParse *wvparse = GST_WAVPACK_PARSE (element); + + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_segment_init (&wvparse->segment, GST_FORMAT_DEFAULT); + wvparse->segment.last_stop = 0; + default: + break; + } + + if (GST_ELEMENT_CLASS (parent_class)->change_state) + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_wavpack_parse_reset (wvparse); + break; + default: + break; + } + + return ret; +} + +static gboolean +gst_wavpack_parse_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); + } +} + +static gboolean +gst_wavpack_parse_sink_activate_pull (GstPad * sinkpad, gboolean active) +{ + gboolean result; + + if (active) { + result = gst_pad_start_task (sinkpad, + (GstTaskFunction) gst_wavpack_parse_loop, GST_PAD_PARENT (sinkpad)); + } else { + result = gst_pad_stop_task (sinkpad); + } + + return result; +} + +gboolean +gst_wavpack_parse_plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "wavpackparse", + GST_RANK_PRIMARY, GST_TYPE_WAVPACK_PARSE)) { + return FALSE; + } + + GST_DEBUG_CATEGORY_INIT (gst_wavpack_parse_debug, "wavpack_parse", 0, + "Wavpack file parser"); + + return TRUE; +} diff --git a/ext/wavpack/gstwavpackparse.h b/ext/wavpack/gstwavpackparse.h new file mode 100644 index 0000000..60504a7 --- /dev/null +++ b/ext/wavpack/gstwavpackparse.h @@ -0,0 +1,97 @@ +/* GStreamer wavpack plugin + * (c) 2005 Arwed v. Merkatz + * + * gstwavpackparse.h: wavpack file parser + * + * 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_WAVPACK_PARSE_H__ +#define __GST_WAVPACK_PARSE_H__ + +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_WAVPACK_PARSE \ + (gst_wavpack_parse_get_type()) +#define GST_WAVPACK_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVPACK_PARSE,GstWavpackParse)) +#define GST_WAVPACK_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVPACK_PARSE,GstWavpackParseClass)) +#define GST_IS_WAVPACK_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVPACK_PARSE)) +#define GST_IS_WAVPACK_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVPACK_PARSE)) +typedef struct _GstWavpackParse GstWavpackParse; +typedef struct _GstWavpackParseClass GstWavpackParseClass; +typedef struct _GstWavpackParseIndexEntry GstWavpackParseIndexEntry; + +struct _GstWavpackParseIndexEntry +{ + gint64 byte_offset; /* byte offset of this chunk */ + gint64 sample_offset; /* first sample in this chunk */ + gint64 sample_offset_end; /* first sample in next chunk */ +}; + +struct _GstWavpackParse +{ + GstElement element; + + /*< private > */ + GstPad *sinkpad; + GstPad *srcpad; + + guint samplerate; + guint channels; + gint64 total_samples; + + gboolean need_newsegment; + gboolean discont; + + gint64 current_offset; /* byte offset on sink pad */ + gint64 upstream_length; /* length of file in bytes */ + + GstSegment segment; /* the currently configured segment, in + * samples/audio frames (DEFAULT format) */ + + GstBuffer *pending_buffer; + gint32 pending_offset; + guint32 next_block_index; + + GstAdapter *adapter; /* when operating chain-based, otherwise NULL */ + + /* List of GstWavpackParseIndexEntry structs, mapping known + * sample offsets to byte offsets. Is kept increasing without + * gaps (ie. append only and consecutive entries must always + * map to consecutive chunks in the file). */ + GSList *entries; + + /* Queued events (e.g. tag events we receive before we create the src pad) */ + GList *queued_events; /* STREAM_LOCK */ +}; + +struct _GstWavpackParseClass +{ + GstElementClass parent; +}; + +GType gst_wavpack_parse_get_type (void); + +gboolean gst_wavpack_parse_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_WAVPACK_PARSE_H__ */ diff --git a/ext/wavpack/gstwavpackstreamreader.c b/ext/wavpack/gstwavpackstreamreader.c new file mode 100644 index 0000000..074a2e7 --- /dev/null +++ b/ext/wavpack/gstwavpackstreamreader.c @@ -0,0 +1,124 @@ +/* GStreamer Wavpack plugin + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackstreamreader.c: stream reader used for decoding + * + * 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 +#include +#include + +#include "gstwavpackstreamreader.h" + +GST_DEBUG_CATEGORY_EXTERN (wavpack_debug); +#define GST_CAT_DEFAULT wavpack_debug + +static int32_t +gst_wavpack_stream_reader_read_bytes (void *id, void *data, int32_t bcount) +{ + read_id *rid = (read_id *) id; + uint32_t left = rid->length - rid->position; + uint32_t to_read = MIN (left, bcount); + + GST_DEBUG ("Trying to read %d of %d bytes from position %d", bcount, + rid->length, rid->position); + + if (to_read > 0) { + g_memmove (data, rid->buffer + rid->position, to_read); + rid->position += to_read; + return to_read; + } else { + GST_WARNING ("Couldn't read %d bytes", bcount); + return 0; + } +} + +static uint32_t +gst_wavpack_stream_reader_get_pos (void *id) +{ + GST_DEBUG ("Returning position %d", ((read_id *) id)->position); + return ((read_id *) id)->position; +} + +static int +gst_wavpack_stream_reader_set_pos_abs (void *id, uint32_t pos) +{ + GST_WARNING ("Should not be called: tried to set absolute position to %d", + pos); + return -1; +} + +static int +gst_wavpack_stream_reader_set_pos_rel (void *id, int32_t delta, int mode) +{ + GST_WARNING ("Should not be called: tried to set relative position to %d" + " with mode %d", delta, mode); + return -1; +} + +static int +gst_wavpack_stream_reader_push_back_byte (void *id, int c) +{ + read_id *rid = (read_id *) id; + + GST_DEBUG ("Pushing back one byte: 0x%x", c); + + rid->position -= 1; + if (rid->position < 0) + rid->position = 0; + return rid->position; +} + +static uint32_t +gst_wavpack_stream_reader_get_length (void *id) +{ + GST_DEBUG ("Returning length %d", ((read_id *) id)->length); + + return ((read_id *) id)->length; +} + +static int +gst_wavpack_stream_reader_can_seek (void *id) +{ + GST_DEBUG ("Can't seek"); + return FALSE; +} + +static int32_t +gst_wavpack_stream_reader_write_bytes (void *id, void *data, int32_t bcount) +{ + GST_WARNING ("Should not be called, tried to write %d bytes", bcount); + return 0; +} + +WavpackStreamReader * +gst_wavpack_stream_reader_new (void) +{ + WavpackStreamReader *stream_reader = + (WavpackStreamReader *) g_malloc0 (sizeof (WavpackStreamReader)); + stream_reader->read_bytes = gst_wavpack_stream_reader_read_bytes; + stream_reader->get_pos = gst_wavpack_stream_reader_get_pos; + stream_reader->set_pos_abs = gst_wavpack_stream_reader_set_pos_abs; + stream_reader->set_pos_rel = gst_wavpack_stream_reader_set_pos_rel; + stream_reader->push_back_byte = gst_wavpack_stream_reader_push_back_byte; + stream_reader->get_length = gst_wavpack_stream_reader_get_length; + stream_reader->can_seek = gst_wavpack_stream_reader_can_seek; + stream_reader->write_bytes = gst_wavpack_stream_reader_write_bytes; + + return stream_reader; +} diff --git a/ext/wavpack/gstwavpackstreamreader.h b/ext/wavpack/gstwavpackstreamreader.h new file mode 100644 index 0000000..713b4c1 --- /dev/null +++ b/ext/wavpack/gstwavpackstreamreader.h @@ -0,0 +1,36 @@ +/* GStreamer Wavpack plugin + * Copyright (c) 2006 Sebastian Dröge + * + * gstwavpackstreamreader.h: stream reader used for decoding + * + * 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_WAVPACK_STREAM_READER_H__ +#define __GST_WAVPACK_STREAM_READER_H__ + +#include + +typedef struct +{ + guint8 *buffer; + uint32_t length; + uint32_t position; +} read_id; + +WavpackStreamReader *gst_wavpack_stream_reader_new (void); + +#endif diff --git a/gconf/Makefile.am b/gconf/Makefile.am new file mode 100644 index 0000000..5129c00 --- /dev/null +++ b/gconf/Makefile.am @@ -0,0 +1,31 @@ +GST_SCHEMA_FILES = gstreamer-@GST_MAJORMINOR@.schemas + +if USE_GCONF +schemadir = @GCONF_SCHEMA_FILE_DIR@ +schema_DATA = $(GST_SCHEMA_FILES) +endif + +gstreamer-@GST_MAJORMINOR@.schemas: gstreamer.schemas + cp gstreamer.schemas gstreamer-@GST_MAJORMINOR@.schemas + +if USE_GCONF +if GCONF_SCHEMAS_INSTALL +install-data-local: + @GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) \ + --makefile-install-rule $(builddir)/$(schema_DATA) || \ + (echo ;\ + echo "*****************************************************"; \ + echo "Installation of schemas failed, install them manually"; \ + echo "*****************************************************";) + @true +else +install-data-local: + @echo "***************************************************************" + @echo "Not installing schemas, disabled with --disable-schemas-install" + @echo "***************************************************************" + @true +endif +endif # USE_GCONF + +CLEANFILES = $(GST_SCHEMA_FILES) +EXTRA_DIST = $(GST_SCHEMA_FILES) diff --git a/gconf/Makefile.in b/gconf/Makefile.in new file mode 100644 index 0000000..d9d53b2 --- /dev/null +++ b/gconf/Makefile.in @@ -0,0 +1,683 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gconf +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/gstreamer.schemas.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = gstreamer.schemas +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(schemadir)" +DATA = $(schema_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +GST_SCHEMA_FILES = gstreamer-@GST_MAJORMINOR@.schemas +@USE_GCONF_TRUE@schemadir = @GCONF_SCHEMA_FILE_DIR@ +@USE_GCONF_TRUE@schema_DATA = $(GST_SCHEMA_FILES) +CLEANFILES = $(GST_SCHEMA_FILES) +EXTRA_DIST = $(GST_SCHEMA_FILES) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gconf/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gconf/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +gstreamer.schemas: $(top_builddir)/config.status $(srcdir)/gstreamer.schemas.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-schemaDATA: $(schema_DATA) + @$(NORMAL_INSTALL) + test -z "$(schemadir)" || $(MKDIR_P) "$(DESTDIR)$(schemadir)" + @list='$(schema_DATA)'; test -n "$(schemadir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(schemadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(schemadir)" || exit $$?; \ + done + +uninstall-schemaDATA: + @$(NORMAL_UNINSTALL) + @list='$(schema_DATA)'; test -n "$(schemadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(schemadir)'; $(am__uninstall_files_from_dir) +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(schemadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +@USE_GCONF_FALSE@install-data-local: +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local install-schemaDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-schemaDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-schemaDATA install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am uninstall uninstall-am uninstall-schemaDATA + + +gstreamer-@GST_MAJORMINOR@.schemas: gstreamer.schemas + cp gstreamer.schemas gstreamer-@GST_MAJORMINOR@.schemas + +@GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@install-data-local: +@GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ @GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) \ +@GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ --makefile-install-rule $(builddir)/$(schema_DATA) || \ +@GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ (echo ;\ +@GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ echo "*****************************************************"; \ +@GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ echo "Installation of schemas failed, install them manually"; \ +@GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ echo "*****************************************************";) +@GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ @true +@GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@install-data-local: +@GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@ @echo "***************************************************************" +@GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@ @echo "Not installing schemas, disabled with --disable-schemas-install" +@GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@ @echo "***************************************************************" +@GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@ @true + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gconf/gstreamer-0.10.schemas b/gconf/gstreamer-0.10.schemas new file mode 100644 index 0000000..d889571 --- /dev/null +++ b/gconf/gstreamer-0.10.schemas @@ -0,0 +1,191 @@ + + + + /schemas/system/gstreamer/0.10/default/audiosink + /system/gstreamer/0.10/default/audiosink + gstreamer + string + autoaudiosink + + default GStreamer audiosink + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/0.10/default/audiosink_description + /system/gstreamer/0.10/default/audiosink_description + gstreamer + string + Default + + description for default GStreamer audiosink + Describes the selected output element. + + + + /schemas/system/gstreamer/0.10/default/musicaudiosink + /system/gstreamer/0.10/default/musicaudiosink + gstreamer + string + autoaudiosink + + GStreamer audiosink for Music and Movies + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/0.10/default/musicaudiosink_description + /system/gstreamer/0.10/default/musicaudiosink_description + gstreamer + string + Default + + description for GStreamer audiosink for Music and Movies + Describes the selected output element for Music and Movies. + + + + /schemas/system/gstreamer/0.10/default/chataudiosink + /system/gstreamer/0.10/default/chataudiosink + gstreamer + string + autoaudiosink + + GStreamer audiosink for Audio/Video Conferencing + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/0.10/default/chataudiosink_description + /system/gstreamer/0.10/default/chataudiosink_description + gstreamer + string + Default + + description for GStreamer audiosink for Audio/Video Conferencing + Describes the selected output element for Audio/Video Conferencing. + + + + /schemas/system/gstreamer/0.10/default/audiosink_description + /system/gstreamer/0.10/default/audiosink_description + gstreamer + string + Default + + description for default GStreamer audiosink + Describes the selected output element. + + + + /schemas/system/gstreamer/0.10/default/musicaudiosink + /system/gstreamer/0.10/default/musicaudiosink + gstreamer + string + autoaudiosink + + GStreamer audiosink for Music and Movies + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/0.10/default/musicaudiosink_description + /system/gstreamer/0.10/default/musicaudiosink_description + gstreamer + string + Default + + description for GStreamer audiosink for Music and Movies + Describes the selected output element for Music and Movies. + + + + /schemas/system/gstreamer/0.10/default/chataudiosink + /system/gstreamer/0.10/default/chataudiosink + gstreamer + string + autoaudiosink + + GStreamer audiosink for Audio/Video Conferencing + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/0.10/default/chataudiosink_description + /system/gstreamer/0.10/default/chataudiosink_description + gstreamer + string + Default + + description for GStreamer audiosink for Audio/Video Conferencing + Describes the selected output element for Audio/Video Conferencing. + + + + /schemas/system/gstreamer/0.10/default/videosink + /system/gstreamer/0.10/default/videosink + gstreamer + string + autovideosink + + default GStreamer videosink + GStreamer can play video using any number of output elements. Some possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. The videosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/0.10/default/audiosrc + /system/gstreamer/0.10/default/audiosrc + gstreamer + string + alsasrc + + default GStreamer audio source + GStreamer can record audio using any number of input elements. Some possible choices are osssrc, esdsrc and alsasrc. The audio source can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/0.10/default/audiosrc_description + /system/gstreamer/0.10/default/audiosrc_description + gstreamer + string + Default + + description for default GStreamer audiosrc + Describes the selected input element. + + + + /schemas/system/gstreamer/0.10/default/audiosrc_description + /system/gstreamer/0.10/default/audiosrc_description + gstreamer + string + Default + + description for default GStreamer audiosrc + Describes the selected input element. + + + + /schemas/system/gstreamer/0.10/default/videosrc + /system/gstreamer/0.10/default/videosrc + gstreamer + string + v4l2src + + default GStreamer video source + GStreamer can record video from any number of input elements. Some possible choices are v4lsrc and videotestsrc. The video source can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/0.10/default/visualization + /system/gstreamer/0.10/default/visualization + gstreamer + string + goom + + default GStreamer visualization plugin + GStreamer can put visualization plugins in a pipeline to transform audio stream in video frames. Default is goom but more visualization plugins will be ported soon. The visualization plugin can be a partial pipeline instead of just one element. + + + + diff --git a/gconf/gstreamer.schemas.in b/gconf/gstreamer.schemas.in new file mode 100644 index 0000000..bc1ff44 --- /dev/null +++ b/gconf/gstreamer.schemas.in @@ -0,0 +1,191 @@ + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosink + /system/gstreamer/@GST_MAJORMINOR@/default/audiosink + gstreamer + string + @DEFAULT_AUDIOSINK@ + + default GStreamer audiosink + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosink_description + /system/gstreamer/@GST_MAJORMINOR@/default/audiosink_description + gstreamer + string + Default + + description for default GStreamer audiosink + Describes the selected output element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink + /system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink + gstreamer + string + @DEFAULT_AUDIOSINK@ + + GStreamer audiosink for Music and Movies + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink_description + /system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink_description + gstreamer + string + Default + + description for GStreamer audiosink for Music and Movies + Describes the selected output element for Music and Movies. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink + /system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink + gstreamer + string + @DEFAULT_AUDIOSINK@ + + GStreamer audiosink for Audio/Video Conferencing + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink_description + /system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink_description + gstreamer + string + Default + + description for GStreamer audiosink for Audio/Video Conferencing + Describes the selected output element for Audio/Video Conferencing. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosink_description + /system/gstreamer/@GST_MAJORMINOR@/default/audiosink_description + gstreamer + string + Default + + description for default GStreamer audiosink + Describes the selected output element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink + /system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink + gstreamer + string + @DEFAULT_AUDIOSINK@ + + GStreamer audiosink for Music and Movies + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink_description + /system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink_description + gstreamer + string + Default + + description for GStreamer audiosink for Music and Movies + Describes the selected output element for Music and Movies. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink + /system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink + gstreamer + string + @DEFAULT_AUDIOSINK@ + + GStreamer audiosink for Audio/Video Conferencing + GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink_description + /system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink_description + gstreamer + string + Default + + description for GStreamer audiosink for Audio/Video Conferencing + Describes the selected output element for Audio/Video Conferencing. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/videosink + /system/gstreamer/@GST_MAJORMINOR@/default/videosink + gstreamer + string + @DEFAULT_VIDEOSINK@ + + default GStreamer videosink + GStreamer can play video using any number of output elements. Some possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. The videosink can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosrc + /system/gstreamer/@GST_MAJORMINOR@/default/audiosrc + gstreamer + string + @DEFAULT_AUDIOSRC@ + + default GStreamer audio source + GStreamer can record audio using any number of input elements. Some possible choices are osssrc, esdsrc and alsasrc. The audio source can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosrc_description + /system/gstreamer/@GST_MAJORMINOR@/default/audiosrc_description + gstreamer + string + Default + + description for default GStreamer audiosrc + Describes the selected input element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosrc_description + /system/gstreamer/@GST_MAJORMINOR@/default/audiosrc_description + gstreamer + string + Default + + description for default GStreamer audiosrc + Describes the selected input element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/videosrc + /system/gstreamer/@GST_MAJORMINOR@/default/videosrc + gstreamer + string + @DEFAULT_VIDEOSRC@ + + default GStreamer video source + GStreamer can record video from any number of input elements. Some possible choices are v4lsrc and videotestsrc. The video source can be a partial pipeline instead of just one element. + + + + /schemas/system/gstreamer/@GST_MAJORMINOR@/default/visualization + /system/gstreamer/@GST_MAJORMINOR@/default/visualization + gstreamer + string + @DEFAULT_VISUALIZER@ + + default GStreamer visualization plugin + GStreamer can put visualization plugins in a pipeline to transform audio stream in video frames. Default is goom but more visualization plugins will be ported soon. The visualization plugin can be a partial pipeline instead of just one element. + + + + diff --git a/gst-libs/gst/gettext.h b/gst-libs/gst/gettext.h new file mode 100644 index 0000000..59902b3 --- /dev/null +++ b/gst-libs/gst/gettext.h @@ -0,0 +1,69 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. + + This program 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, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#ifdef ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/gst-libs/gst/glib-compat-private.h b/gst-libs/gst/glib-compat-private.h new file mode 100644 index 0000000..b9248e6 --- /dev/null +++ b/gst-libs/gst/glib-compat-private.h @@ -0,0 +1,135 @@ +/* + * glib-compat.c + * Functions copied from glib 2.10 + * + * Copyright 2005 David Schleef + * + * 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 __GLIB_COMPAT_PRIVATE_H__ +#define __GLIB_COMPAT_PRIVATE_H__ + +#include + +G_BEGIN_DECLS + +#if !GLIB_CHECK_VERSION(2,25,0) + +#if defined (_MSC_VER) && !defined(_WIN64) +typedef struct _stat32 GStatBuf; +#else +typedef struct stat GStatBuf; +#endif + +#endif + +#if GLIB_CHECK_VERSION(2,26,0) +#define GLIB_HAS_GDATETIME +#endif + +/* See bug #651514 */ +#if GLIB_CHECK_VERSION(2,29,5) +#define G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE(a,b,c) \ + g_atomic_pointer_compare_and_exchange ((a),(b),(c)) +#define G_ATOMIC_INT_COMPARE_AND_EXCHANGE(a,b,c) \ + g_atomic_int_compare_and_exchange ((a),(b),(c)) +#else +#define G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE(a,b,c) \ + g_atomic_pointer_compare_and_exchange ((volatile gpointer *)(a),(b),(c)) +#define G_ATOMIC_INT_COMPARE_AND_EXCHANGE(a,b,c) \ + g_atomic_int_compare_and_exchange ((volatile int *)(a),(b),(c)) +#endif + +/* See bug #651514 */ +#if GLIB_CHECK_VERSION(2,29,5) +#define G_ATOMIC_INT_ADD(a,b) g_atomic_int_add ((a),(b)) +#else +#define G_ATOMIC_INT_ADD(a,b) g_atomic_int_exchange_and_add ((a),(b)) +#endif + +/* copies */ + +#if GLIB_CHECK_VERSION (2, 31, 0) +#define g_mutex_new gst_g_mutex_new +static inline GMutex * +gst_g_mutex_new (void) +{ + GMutex *mutex = g_slice_new (GMutex); + g_mutex_init (mutex); + return mutex; +} +#define g_mutex_free gst_g_mutex_free +static inline void +gst_g_mutex_free (GMutex *mutex) +{ + g_mutex_clear (mutex); + g_slice_free (GMutex, mutex); +} +#define g_static_rec_mutex_init gst_g_static_rec_mutex_init +static inline void +gst_g_static_rec_mutex_init (GStaticRecMutex *mutex) +{ + static const GStaticRecMutex init_mutex = G_STATIC_REC_MUTEX_INIT; + + *mutex = init_mutex; +} +#define g_cond_new gst_g_cond_new +static inline GCond * +gst_g_cond_new (void) +{ + GCond *cond = g_slice_new (GCond); + g_cond_init (cond); + return cond; +} +#define g_cond_free gst_g_cond_free +static inline void +gst_g_cond_free (GCond *cond) +{ + g_cond_clear (cond); + g_slice_free (GCond, cond); +} +#define g_cond_timed_wait gst_g_cond_timed_wait +static inline gboolean +gst_g_cond_timed_wait (GCond *cond, GMutex *mutex, GTimeVal *abs_time) +{ + gint64 end_time; + + if (abs_time == NULL) { + g_cond_wait (cond, mutex); + return TRUE; + } + + end_time = abs_time->tv_sec; + end_time *= 1000000; + end_time += abs_time->tv_usec; + + /* would be nice if we had clock_rtoffset, but that didn't seem to + * make it into the kernel yet... + */ + /* if CLOCK_MONOTONIC is not defined then g_get_montonic_time() and + * g_get_real_time() are returning the same clock and we'd add ~0 + */ + end_time += g_get_monotonic_time () - g_get_real_time (); + return g_cond_wait_until (cond, mutex, end_time); +} +#endif /* GLIB_CHECK_VERSION (2, 31, 0) */ + +/* adaptations */ + +G_END_DECLS + +#endif diff --git a/gst-libs/gst/gst-i18n-plugin.h b/gst-libs/gst/gst-i18n-plugin.h new file mode 100644 index 0000000..fe597d2 --- /dev/null +++ b/gst-libs/gst/gst-i18n-plugin.h @@ -0,0 +1,47 @@ +/* GStreamer + * Copyright (C) 2004 Thomas Vander Stichele + * + * gst-i18n-plugins.h: internationalization macros for the GStreamer plugins + * + * 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_I18N_PLUGIN_H__ +#define __GST_I18N_PLUGIN_H__ + +#ifndef GETTEXT_PACKAGE +#error You must define GETTEXT_PACKAGE before including this header. +#endif + +#ifdef ENABLE_NLS + +#include + +#include "gettext.h" /* included with gettext distribution and copied */ + +/* we want to use shorthand _() for translating and N_() for marking */ +#define _(String) dgettext (GETTEXT_PACKAGE, String) +#define N_(String) gettext_noop (String) +/* FIXME: if we need it, we can add Q_ as well, like in glib */ + +#else +#define _(String) String +#define N_(String) String +#define ngettext(Singular,Plural,Count) ((Count>1)?Plural:Singular) + +#endif + +#endif /* __GST_I18N_PLUGIN_H__ */ diff --git a/gst-plugins-good.doap b/gst-plugins-good.doap new file mode 100644 index 0000000..02c2cd7 --- /dev/null +++ b/gst-plugins-good.doap @@ -0,0 +1,395 @@ + + + GStreamer Good Plug-ins + gst-plugins-good + + 2005-09-06 + +a set of good-quality plug-ins under our preferred license, LGPL + + +GStreamer Good Plug-ins is a set of plug-ins that we consider to have good +quality code and correct functionality, under our preferred license (LGPL for +the plug-in code, LGPL or LGPL-compatible for the supporting library). + + + + + + C + + + + + + + + + + + + + 0.10.31 + 0.10 + Faster + 2012-02-20 + + + + + + + + + 0.10.30 + 0.10 + Adagio + 2011-06-15 + + + + + + + + 0.10.29 + 0.10 + Soft Cheese Enthusiast + 2011-05-10 + + + + + + + + 0.10.28 + 0.10 + Inconvenienced by the Solar System + 2011-03-08 + + + + + + + + 0.10.27 + 0.10 + Some Kind of Temporal Blend + 2011-01-21 + + + + + + + + 0.10.26 + 0.10 + Escapades + 2010-12-01 + + + + + + + + 0.10.25 + 0.10 + Woe to You Oh Earth and Sea + 2010-09-02 + + + + + + + + 0.10.24 + 0.10 + Taking Liberties + 2010-07-15 + + + + + + + + 0.10.23 + 0.10 + Stylish Kids in Riot + 2010-05-30 + + + + + + + + 0.10.22 + 0.10 + Square One + 2010-04-27 + + + + + + + + 0.10.21 + 0.10 + Lemons + 2010-03-08 + + + + + + + + 0.10.20 + 0.10 + Lemonade + 2010-03-08 + + + + + + + + 0.10.19 + 0.10 + Closer to the Edit + 2010-03-06 + + + + + + + + 0.10.18 + 0.10 + Short Circuit + 2010-02-10 + + + + + + + + 0.10.17 + 0.10 + They used to sparkle + 2009-11-17 + + + + + + + + 0.10.16 + 0.10 + Secret Handshakes + 2009-08-28 + + + + + + + + 0.10.15 + 0.10 + I've been up all night + 2009-05-20 + + + + + + + + 0.10.14 + 0.10 + Disaffected Affectation + 2009-02-19 + + + + + + + + 0.10.13 + 0.10 + Blatant Discouragement + 2009-01-22 + + + + + + + + 0.10.12 + 0.10 + Taken Under Advisement + 2009-01-22 + + + + + + + + 0.10.11 + 0.10 + Secondary Consideration + 2008-10-24 + + + + + + + + 0.10.10 + 0.10 + Barely Moving + 2008-08-26 + + + + + + + + 0.10.9 + 0.10 + Steam Train Rolling + 2008-07-31 + + + + + + + + 0.10.8 + 0.10 + One For The Money + 2008-04-24 + + + + + + + + 0.10.7 + 0.10 + Red Door Black + 2008-01-20 + + + + + + + + 0.10.6 + 0.10 + Wobble Board + 2007-06-19 + + + + + + + + 0.10.5 + 0.10 + The Path of Thorns + 2006-12-21 + + + + + + + + 0.10.4 + 0.10 + Dear Leader + 2006-08-14 + + + + + + + + 0.10.3 + 0.10 + Desplazado + 2006-05-04 + + + + + + + + 0.10.2 + 0.10 + Papa was a rolling stone + 2006-02-09 + + + + + + + + 0.10.1 + 0.10 + Li + 2006-01-13 + + + + + + + + 0.10.0 + 0.10 + Abondance + 2005-12-05 + + + + + + + + Wim Taymans + 0d93fde052812d51a05fd86de9bdbf674423daa2 + + + + diff --git a/gst-plugins-good.manifest b/gst-plugins-good.manifest new file mode 100755 index 0000000..a76fdba --- /dev/null +++ b/gst-plugins-good.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/gst-plugins-good.spec.in b/gst-plugins-good.spec.in new file mode 100644 index 0000000..8ed8950 --- /dev/null +++ b/gst-plugins-good.spec.in @@ -0,0 +1,174 @@ +%define majorminor @GST_MAJORMINOR@ +%define gstreamer gstreamer + +%define gst_minver 0.10.0 + +Name: %{gstreamer}-plugins-good +Version: @VERSION@ +Release: @PACKAGE_VERSION_RELEASE@.gst +Summary: GStreamer plug-ins with good code and licensing + +Group: Applications/Multimedia +License: LGPL +URL: http://gstreamer.freedesktop.org/ +Vendor: GStreamer Backpackers Team +Source: http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +Requires: %{gstreamer} >= %{gst_minver} +BuildRequires: %{gstreamer}-devel >= %{gst_minver} + +BuildRequires: gcc-c++ + +@USE_ESD_TRUE@BuildRequires: esound-devel >= 0.2.8 +@USE_ESD_TRUE@Obsoletes: gstreamer-esd +@USE_ESD_TRUE@ +@USE_ESD_TRUE@Provides: gstreamer-audiosrc +@USE_ESD_TRUE@Provides: gstreamer-audiosink +@USE_FLAC_TRUE@BuildRequires: flac-devel >= 1.0.3 +@USE_GCONF_TRUE@BuildRequires: GConf2-devel +@USE_JPEG_TRUE@BuildRequires: libjpeg-turbo-devel +@USE_LIBCACA_TRUE@BuildRequires: libcaca-devel +@USE_LIBDV_TRUE@BuildRequires: libdv-devel +@USE_LIBPNG_TRUE@BuildRequires: libpng-devel >= 1.2.0 +@USE_OSS_TRUE@BuildRequires: glibc-devel +@USE_SPEEX_TRUE@BuildRequires: speex-devel +@USE_HAL_TRUE@BuildRequires: hal-devel +@USE_SHOUT2_TRUE@BuildRequires: libshout-devel >= 2.0 +@USE_AALIB_TRUE@BuildRequires: aalib-devel >= 1.3 +@USE_AALIB_TRUE@Provides: gstreamer-aasink = %{version}-%{release} +@USE_PULSE_TRUE@BuildRequires: pulseaudio-libs-devel +@USE_DV1394_TRUE@BuildRequires: libavc1394-devel +@USE_DV1394_TRUE@BuildRequires: libdc1394-devel +@USE_DV1394_TRUE@BuildRequires: libiec61883-devel +@USE_DV1394_TRUE@BuildRequires: libraw1394-devel + +%description +GStreamer is a streaming media framework, based on graphs of filters which +operate on media data. Applications using this library can do anything +from real-time sound processing to playing videos, and just about anything +else media-related. Its plugin-based architecture means that new data +types or processing capabilities can be added simply by installing new +plug-ins. + +%prep +%setup -q -n gst-plugins-good-%{version} +%build +%configure \ + --enable-debug \ + --enable-DEBUG + +make %{?_smp_mflags} + +%install +rm -rf $RPM_BUILD_ROOT + +export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 +%makeinstall +unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL + +# Clean out files that should not be part of the rpm. +rm -f $RPM_BUILD_ROOT%{_libdir}/gstreamer-%{majorminor}/*.la +rm -f $RPM_BUILD_ROOT%{_libdir}/gstreamer-%{majorminor}/*.a +rm -f $RPM_BUILD_ROOT%{_libdir}/*.a +rm -f $RPM_BUILD_ROOT%{_libdir}/*.la + +%find_lang gst-plugins-good-%{majorminor} + +%clean +rm -rf $RPM_BUILD_ROOT + +%post +@USE_GCONF_TRUE@export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` +@USE_GCONF_TRUE@gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/gstreamer-%{majorminor}.schemas > /dev/null + +%files -f gst-plugins-good-%{majorminor}.lang +%defattr(-, root, root) +%doc AUTHORS COPYING README REQUIREMENTS gst-plugins-good.doap +%{_datadir}/gstreamer-%{majorminor}/presets/GstIirEqualizer10Bands.prs +%{_datadir}/gstreamer-%{majorminor}/presets/GstIirEqualizer3Bands.prs + +# non-core plugins without external dependencies +%{_libdir}/gstreamer-%{majorminor}/libgstalaw.so +%{_libdir}/gstreamer-%{majorminor}/libgstalpha.so +%{_libdir}/gstreamer-%{majorminor}/libgstautodetect.so +%{_libdir}/gstreamer-%{majorminor}/libgstavi.so +%{_libdir}/gstreamer-%{majorminor}/libgsteffectv.so +%{_libdir}/gstreamer-%{majorminor}/libgstgoom.so +%{_libdir}/gstreamer-%{majorminor}/libgstlevel.so +%{_libdir}/gstreamer-%{majorminor}/libgstefence.so +%{_libdir}/gstreamer-%{majorminor}/libgstmulaw.so +%{_libdir}/gstreamer-%{majorminor}/libgstisomp4.so +%{_libdir}/gstreamer-%{majorminor}/libgstrtp.so +%{_libdir}/gstreamer-%{majorminor}/libgstrtpmanager.so +%{_libdir}/gstreamer-%{majorminor}/libgstrtsp.so +%{_libdir}/gstreamer-%{majorminor}/libgstsmpte.so +%{_libdir}/gstreamer-%{majorminor}/libgstudp.so +%{_libdir}/gstreamer-%{majorminor}/libgstvideobox.so +%{_libdir}/gstreamer-%{majorminor}/libgstwavenc.so +%{_libdir}/gstreamer-%{majorminor}/libgstwavparse.so +%{_libdir}/gstreamer-%{majorminor}/libgstauparse.so +%{_libdir}/gstreamer-%{majorminor}/libgstdebug.so +%{_libdir}/gstreamer-%{majorminor}/libgstnavigationtest.so +%{_libdir}/gstreamer-%{majorminor}/libgstalphacolor.so +@USE_CAIRO_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstcairo.so +%{_libdir}/gstreamer-%{majorminor}/libgstflxdec.so +%{_libdir}/gstreamer-%{majorminor}/libgstmatroska.so +%{_libdir}/gstreamer-%{majorminor}/libgstvideomixer.so +%{_libdir}/gstreamer-%{majorminor}/libgstcutter.so +%{_libdir}/gstreamer-%{majorminor}/libgstmultipart.so +%{_libdir}/gstreamer-%{majorminor}/libgstid3demux.so +@USE_GDK_PIXBUF_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstgdkpixbuf.so +%{_libdir}/gstreamer-%{majorminor}/libgstapetag.so +%{_libdir}/gstreamer-%{majorminor}/libgstannodex.so +%{_libdir}/gstreamer-%{majorminor}/libgstvideocrop.so +%{_libdir}/gstreamer-%{majorminor}/libgsticydemux.so +%{_libdir}/gstreamer-%{majorminor}/libgsttaglib.so +%{_libdir}/gstreamer-%{majorminor}/libgstximagesrc.so +%{_libdir}/gstreamer-%{majorminor}/libgstaudiofx.so +%{_libdir}/gstreamer-%{majorminor}/libgstequalizer.so +%{_libdir}/gstreamer-%{majorminor}/libgstmultifile.so +%{_libdir}/gstreamer-%{majorminor}/libgstspectrum.so +%{_libdir}/gstreamer-%{majorminor}/libgstgoom2k1.so +%{_libdir}/gstreamer-%{majorminor}/libgstinterleave.so +%{_libdir}/gstreamer-%{majorminor}/libgstreplaygain.so +%{_libdir}/gstreamer-%{majorminor}/libgstdeinterlace.so +%{_libdir}/gstreamer-%{majorminor}/libgstflv.so +%{_libdir}/gstreamer-%{majorminor}/libgsty4menc.so +%{_libdir}/gstreamer-%{majorminor}/libgstoss4audio.so +%{_libdir}/gstreamer-%{majorminor}/libgstimagefreeze.so +%{_libdir}/gstreamer-%{majorminor}/libgstshapewipe.so +%{_libdir}/gstreamer-%{majorminor}/libgstvideofilter.so +%{_libdir}/gstreamer-%{majorminor}/libgstaudioparsers.so + +# sys plugins +@USE_GST_V4L2_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstvideo4linux2.so + +# gstreamer-plugins with external dependencies but in the main package +@USE_LIBCACA_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstcacasink.so +@USE_ESD_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstesd.so +@USE_FLAC_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstflac.so +@USE_JACK_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstjack.so +@USE_JPEG_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstjpeg.so +@USE_LIBPNG_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstpng.so +@USE_OSS_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstossaudio.so +@USE_SPEEX_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstspeex.so +@USE_GCONF_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstgconfelements.so +@USE_HAL_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgsthalelements.so +@USE_SHOUT2_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstshout2.so +@USE_AALIB_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstaasink.so +@USE_LIBDV_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstdv.so +@USE_DV1394_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgst1394.so +@USE_WAVPACK_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstwavpack.so +@USE_SOUP_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstsouphttpsrc.so +@USE_PULSE_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstpulse.so + +# schema files +@USE_GCONF_TRUE@%{_sysconfdir}/gconf/schemas/gstreamer-%{majorminor}.schemas + +%changelog +* Tue Jun 12 2007 Jan Schmidt +- wavpack and qtdemux have moved from bad + +* Fri Sep 02 2005 Thomas Vander Stichele +- clean up for splitup diff --git a/gst/Makefile.am b/gst/Makefile.am new file mode 100644 index 0000000..f25a56d --- /dev/null +++ b/gst/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = $(GST_PLUGINS_SELECTED) +DIST_SUBDIRS = $(GST_PLUGINS_ALL) + +include $(top_srcdir)/common/parallel-subdirs.mak diff --git a/gst/Makefile.in b/gst/Makefile.in new file mode 100644 index 0000000..3796579 --- /dev/null +++ b/gst/Makefile.in @@ -0,0 +1,823 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# include this at the end of $MODULE/ext/Makefile.am to force make to +# build subdirectories in parallel when make -jN is used. We will end up +# descending into all subdirectories a second time, but only after the first +# (parallel) run has finished, so it should go right through the second time. +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/common/parallel-subdirs.mak +subdir = gst +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(GST_PLUGINS_SELECTED) +DIST_SUBDIRS = $(GST_PLUGINS_ALL) +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/parallel-subdirs.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/parallel-subdirs.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +.PHONY: independent-subdirs $(SUBDIRS) + +independent-subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@ + +all-recursive: independent-subdirs + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/alpha/Makefile.am b/gst/alpha/Makefile.am new file mode 100644 index 0000000..dcd88ae --- /dev/null +++ b/gst/alpha/Makefile.am @@ -0,0 +1,33 @@ +plugin_LTLIBRARIES = libgstalpha.la libgstalphacolor.la + +libgstalpha_la_SOURCES = gstalpha.c +libgstalpha_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstalpha_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_CONTROLLER_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) +libgstalpha_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstalpha_la_LIBTOOLFLAGS = --tag=disable-static + +libgstalphacolor_la_SOURCES = gstalphacolor.c +libgstalphacolor_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstalphacolor_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) +libgstalphacolor_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstalphacolor_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstalpha.h gstalphacolor.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstalpha -:SHARED libgstalpha \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstalpha_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstalpha_la_CFLAGS) \ + -:LDFLAGS $(libgstalpha_la_LDFLAGS) \ + $(libgstalpha_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/alpha/Makefile.in b/gst/alpha/Makefile.in new file mode 100644 index 0000000..5809748 --- /dev/null +++ b/gst/alpha/Makefile.in @@ -0,0 +1,852 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/alpha +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstalpha_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstalpha_la_OBJECTS = libgstalpha_la-gstalpha.lo +libgstalpha_la_OBJECTS = $(am_libgstalpha_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstalpha_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstalpha_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstalpha_la_CFLAGS) $(CFLAGS) \ + $(libgstalpha_la_LDFLAGS) $(LDFLAGS) -o $@ +libgstalphacolor_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstalphacolor_la_OBJECTS = libgstalphacolor_la-gstalphacolor.lo +libgstalphacolor_la_OBJECTS = $(am_libgstalphacolor_la_OBJECTS) +libgstalphacolor_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstalphacolor_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstalphacolor_la_CFLAGS) $(CFLAGS) \ + $(libgstalphacolor_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstalpha_la_SOURCES) $(libgstalphacolor_la_SOURCES) +DIST_SOURCES = $(libgstalpha_la_SOURCES) \ + $(libgstalphacolor_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstalpha.la libgstalphacolor.la +libgstalpha_la_SOURCES = gstalpha.c +libgstalpha_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) + +libgstalpha_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_CONTROLLER_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) + +libgstalpha_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstalpha_la_LIBTOOLFLAGS = --tag=disable-static +libgstalphacolor_la_SOURCES = gstalphacolor.c +libgstalphacolor_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) $(GST_CFLAGS) + +libgstalphacolor_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) + +libgstalphacolor_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstalphacolor_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstalpha.h gstalphacolor.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/alpha/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/alpha/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstalpha.la: $(libgstalpha_la_OBJECTS) $(libgstalpha_la_DEPENDENCIES) $(EXTRA_libgstalpha_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstalpha_la_LINK) -rpath $(plugindir) $(libgstalpha_la_OBJECTS) $(libgstalpha_la_LIBADD) $(LIBS) +libgstalphacolor.la: $(libgstalphacolor_la_OBJECTS) $(libgstalphacolor_la_DEPENDENCIES) $(EXTRA_libgstalphacolor_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstalphacolor_la_LINK) -rpath $(plugindir) $(libgstalphacolor_la_OBJECTS) $(libgstalphacolor_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalpha_la-gstalpha.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalphacolor_la-gstalphacolor.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstalpha_la-gstalpha.lo: gstalpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalpha_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalpha_la_CFLAGS) $(CFLAGS) -MT libgstalpha_la-gstalpha.lo -MD -MP -MF $(DEPDIR)/libgstalpha_la-gstalpha.Tpo -c -o libgstalpha_la-gstalpha.lo `test -f 'gstalpha.c' || echo '$(srcdir)/'`gstalpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalpha_la-gstalpha.Tpo $(DEPDIR)/libgstalpha_la-gstalpha.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstalpha.c' object='libgstalpha_la-gstalpha.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalpha_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalpha_la_CFLAGS) $(CFLAGS) -c -o libgstalpha_la-gstalpha.lo `test -f 'gstalpha.c' || echo '$(srcdir)/'`gstalpha.c + +libgstalphacolor_la-gstalphacolor.lo: gstalphacolor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalphacolor_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalphacolor_la_CFLAGS) $(CFLAGS) -MT libgstalphacolor_la-gstalphacolor.lo -MD -MP -MF $(DEPDIR)/libgstalphacolor_la-gstalphacolor.Tpo -c -o libgstalphacolor_la-gstalphacolor.lo `test -f 'gstalphacolor.c' || echo '$(srcdir)/'`gstalphacolor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalphacolor_la-gstalphacolor.Tpo $(DEPDIR)/libgstalphacolor_la-gstalphacolor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstalphacolor.c' object='libgstalphacolor_la-gstalphacolor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalphacolor_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalphacolor_la_CFLAGS) $(CFLAGS) -c -o libgstalphacolor_la-gstalphacolor.lo `test -f 'gstalphacolor.c' || echo '$(srcdir)/'`gstalphacolor.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstalpha -:SHARED libgstalpha \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstalpha_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstalpha_la_CFLAGS) \ + -:LDFLAGS $(libgstalpha_la_LDFLAGS) \ + $(libgstalpha_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/alpha/gstalpha.c b/gst/alpha/gstalpha.c new file mode 100644 index 0000000..f4d0cce --- /dev/null +++ b/gst/alpha/gstalpha.c @@ -0,0 +1,2654 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2007> Wim Taymans + * Copyright (C) <2007> Edward Hervey + * Copyright (C) <2007> Jan Schmidt + * + * 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-alpha + * + * The alpha element adds an alpha channel to a video stream. The values + * of the alpha channel can be either be set to a constant or can be + * dynamically calculated via chroma keying, e.g. blue can be set as + * the transparent color. + * + * Sample pipeline: + * |[ + * gst-launch videotestsrc pattern=smpte75 ! alpha method=green ! \ + * videomixer name=mixer ! ffmpegcolorspace ! autovideosink \ + * videotestsrc pattern=snow ! mixer. + * ]| This pipeline adds a alpha channel to the SMPTE color bars + * with green as the transparent color and mixes the output with + * a snow video stream. + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstalpha.h" + +#include +#include +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +/* Generated by -bad/ext/cog/generate_tables */ +static const int cog_ycbcr_to_rgb_matrix_8bit_hdtv[] = { + 298, 0, 459, -63514, + 298, -55, -136, 19681, + 298, 541, 0, -73988, +}; + +static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { + 298, 0, 409, -57068, + 298, -100, -208, 34707, + 298, 516, 0, -70870, +}; + +static const gint cog_rgb_to_ycbcr_matrix_8bit_hdtv[] = { + 47, 157, 16, 4096, + -26, -87, 112, 32768, + 112, -102, -10, 32768, +}; + +static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { + 66, 129, 25, 4096, + -38, -74, 112, 32768, + 112, -94, -18, 32768, +}; + +static const gint cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit[] = { + 256, -30, -53, 10600, + 0, 261, 29, -4367, + 0, 19, 262, -3289, +}; + +static const gint cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit[] = { + 256, 25, 49, -9536, + 0, 253, -28, 3958, + 0, -19, 252, 2918, +}; + +/* Alpha signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_METHOD ALPHA_METHOD_SET +#define DEFAULT_ALPHA 1.0 +#define DEFAULT_TARGET_R 0 +#define DEFAULT_TARGET_G 255 +#define DEFAULT_TARGET_B 0 +#define DEFAULT_ANGLE 20.0 +#define DEFAULT_NOISE_LEVEL 2.0 +#define DEFAULT_BLACK_SENSITIVITY 100 +#define DEFAULT_WHITE_SENSITIVITY 100 +#define DEFAULT_PREFER_PASSTHROUGH FALSE + +enum +{ + PROP_0, + PROP_METHOD, + PROP_ALPHA, + PROP_TARGET_R, + PROP_TARGET_G, + PROP_TARGET_B, + PROP_ANGLE, + PROP_NOISE_LEVEL, + PROP_BLACK_SENSITIVITY, + PROP_WHITE_SENSITIVITY, + PROP_PREFER_PASSTHROUGH, + PROP_LAST +}; + +static GstStaticPadTemplate gst_alpha_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA + ";" GST_VIDEO_CAPS_YUV ("Y444") + ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR + ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR + ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") + ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("UYVY") + ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") + ";" GST_VIDEO_CAPS_YUV ("Y41B")) + ); + +static GstStaticPadTemplate gst_alpha_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") + ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR + ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") + ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR + ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR + ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") + ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("UYVY") + ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") + ";" GST_VIDEO_CAPS_YUV ("Y41B") + ) + ); + +static GstStaticCaps gst_alpha_alpha_caps = + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") + ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" + GST_VIDEO_CAPS_RGBA); + +/* FIXME: why do we need our own lock for this? */ +#if !GLIB_CHECK_VERSION (2, 31, 0) +#define GST_ALPHA_LOCK(alpha) G_STMT_START { \ + GST_LOG_OBJECT (alpha, "Locking alpha from thread %p", g_thread_self ()); \ + g_static_mutex_lock (&alpha->lock); \ + GST_LOG_OBJECT (alpha, "Locked alpha from thread %p", g_thread_self ()); \ +} G_STMT_END + +#define GST_ALPHA_UNLOCK(alpha) G_STMT_START { \ + GST_LOG_OBJECT (alpha, "Unlocking alpha from thread %p", g_thread_self ()); \ + g_static_mutex_unlock (&alpha->lock); \ +} G_STMT_END +#else +#define GST_ALPHA_LOCK(alpha) G_STMT_START { \ + GST_LOG_OBJECT (alpha, "Locking alpha from thread %p", g_thread_self ()); \ + g_mutex_lock (&alpha->lock); \ + GST_LOG_OBJECT (alpha, "Locked alpha from thread %p", g_thread_self ()); \ +} G_STMT_END + +#define GST_ALPHA_UNLOCK(alpha) G_STMT_START { \ + GST_LOG_OBJECT (alpha, "Unlocking alpha from thread %p", g_thread_self ()); \ + g_mutex_unlock (&alpha->lock); \ +} G_STMT_END +#endif + +static gboolean gst_alpha_start (GstBaseTransform * trans); +static gboolean gst_alpha_get_unit_size (GstBaseTransform * btrans, + GstCaps * caps, guint * size); +static GstCaps *gst_alpha_transform_caps (GstBaseTransform * btrans, + GstPadDirection direction, GstCaps * caps); +static gboolean gst_alpha_set_caps (GstBaseTransform * btrans, + GstCaps * incaps, GstCaps * outcaps); +static GstFlowReturn gst_alpha_transform (GstBaseTransform * btrans, + GstBuffer * in, GstBuffer * out); +static void gst_alpha_before_transform (GstBaseTransform * btrans, + GstBuffer * buf); + +static void gst_alpha_init_params (GstAlpha * alpha); +static gboolean gst_alpha_set_process_function (GstAlpha * alpha); + +static void gst_alpha_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_alpha_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_alpha_finalize (GObject * object); + +GST_BOILERPLATE (GstAlpha, gst_alpha, GstVideoFilter, GST_TYPE_VIDEO_FILTER); + +#define GST_TYPE_ALPHA_METHOD (gst_alpha_method_get_type()) +static GType +gst_alpha_method_get_type (void) +{ + static GType alpha_method_type = 0; + static const GEnumValue alpha_method[] = { + {ALPHA_METHOD_SET, "Set/adjust alpha channel", "set"}, + {ALPHA_METHOD_GREEN, "Chroma Key green", "green"}, + {ALPHA_METHOD_BLUE, "Chroma Key blue", "blue"}, + {ALPHA_METHOD_CUSTOM, "Chroma Key on target_r/g/b", "custom"}, + {0, NULL, NULL}, + }; + + if (!alpha_method_type) { + alpha_method_type = g_enum_register_static ("GstAlphaMethod", alpha_method); + } + return alpha_method_type; +} + +static void +gst_alpha_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Alpha filter", + "Filter/Effect/Video", + "Adds an alpha channel to video - uniform or via chroma-keying", + "Wim Taymans \n" + "Edward Hervey \n" + "Jan Schmidt "); + + gst_element_class_add_static_pad_template (element_class, + &gst_alpha_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_alpha_src_template); + + GST_DEBUG_CATEGORY_INIT (gst_alpha_debug, "alpha", 0, + "alpha - Element for adding alpha channel to streams"); +} + +static void +gst_alpha_class_init (GstAlphaClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *btrans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_alpha_set_property; + gobject_class->get_property = gst_alpha_get_property; + gobject_class->finalize = gst_alpha_finalize; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_METHOD, + g_param_spec_enum ("method", "Method", + "How the alpha channels should be created", GST_TYPE_ALPHA_METHOD, + DEFAULT_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ALPHA, + g_param_spec_double ("alpha", "Alpha", "The value for the alpha channel", + 0.0, 1.0, DEFAULT_ALPHA, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TARGET_R, + g_param_spec_uint ("target-r", "Target Red", "The Red target", 0, 255, + DEFAULT_TARGET_R, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TARGET_G, + g_param_spec_uint ("target-g", "Target Green", "The Green target", 0, 255, + DEFAULT_TARGET_G, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TARGET_B, + g_param_spec_uint ("target-b", "Target Blue", "The Blue target", 0, 255, + DEFAULT_TARGET_B, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ANGLE, + g_param_spec_float ("angle", "Angle", "Size of the colorcube to change", + 0.0, 90.0, DEFAULT_ANGLE, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_NOISE_LEVEL, + g_param_spec_float ("noise-level", "Noise Level", "Size of noise radius", + 0.0, 64.0, DEFAULT_NOISE_LEVEL, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_BLACK_SENSITIVITY, g_param_spec_uint ("black-sensitivity", + "Black Sensitivity", "Sensitivity to dark colors", 0, 128, + DEFAULT_BLACK_SENSITIVITY, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_WHITE_SENSITIVITY, g_param_spec_uint ("white-sensitivity", + "Sensitivity", "Sensitivity to bright colors", 0, 128, + DEFAULT_WHITE_SENSITIVITY, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_PREFER_PASSTHROUGH, g_param_spec_boolean ("prefer-passthrough", + "Prefer Passthrough", + "Don't do any processing for alpha=1.0 if possible", + DEFAULT_PREFER_PASSTHROUGH, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + btrans_class->start = GST_DEBUG_FUNCPTR (gst_alpha_start); + btrans_class->transform = GST_DEBUG_FUNCPTR (gst_alpha_transform); + btrans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_alpha_before_transform); + btrans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_alpha_get_unit_size); + btrans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_alpha_transform_caps); + btrans_class->set_caps = GST_DEBUG_FUNCPTR (gst_alpha_set_caps); +} + +static void +gst_alpha_init (GstAlpha * alpha, GstAlphaClass * klass) +{ + alpha->alpha = DEFAULT_ALPHA; + alpha->method = DEFAULT_METHOD; + alpha->target_r = DEFAULT_TARGET_R; + alpha->target_g = DEFAULT_TARGET_G; + alpha->target_b = DEFAULT_TARGET_B; + alpha->angle = DEFAULT_ANGLE; + alpha->noise_level = DEFAULT_NOISE_LEVEL; + alpha->black_sensitivity = DEFAULT_BLACK_SENSITIVITY; + alpha->white_sensitivity = DEFAULT_WHITE_SENSITIVITY; + +#if !GLIB_CHECK_VERSION (2, 31, 0) + g_static_mutex_init (&alpha->lock); +#else + g_mutex_init (&alpha->lock); +#endif +} + +static void +gst_alpha_finalize (GObject * object) +{ + GstAlpha *alpha = GST_ALPHA (object); + +#if !GLIB_CHECK_VERSION (2, 31, 0) + g_static_mutex_free (&alpha->lock); +#else + g_mutex_clear (&alpha->lock); +#endif + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_alpha_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAlpha *alpha = GST_ALPHA (object); + gboolean reconfigure = FALSE; + + GST_ALPHA_LOCK (alpha); + switch (prop_id) { + case PROP_METHOD:{ + gint method = g_value_get_enum (value); + + reconfigure = (method != alpha->method) && (method == ALPHA_METHOD_SET + || alpha->method == ALPHA_METHOD_SET) && (alpha->alpha == 1.0) + && (alpha->prefer_passthrough); + alpha->method = method; + + switch (alpha->method) { + case ALPHA_METHOD_GREEN: + alpha->target_r = 0; + alpha->target_g = 255; + alpha->target_b = 0; + break; + case ALPHA_METHOD_BLUE: + alpha->target_r = 0; + alpha->target_g = 0; + alpha->target_b = 255; + break; + default: + break; + } + gst_alpha_set_process_function (alpha); + gst_alpha_init_params (alpha); + break; + } + case PROP_ALPHA:{ + gdouble a = g_value_get_double (value); + + reconfigure = (a != alpha->alpha) && (a == 1.0 || alpha->alpha == 1.0) + && (alpha->method == ALPHA_METHOD_SET) && (alpha->prefer_passthrough); + alpha->alpha = a; + break; + } + case PROP_TARGET_R: + alpha->target_r = g_value_get_uint (value); + gst_alpha_init_params (alpha); + break; + case PROP_TARGET_G: + alpha->target_g = g_value_get_uint (value); + gst_alpha_init_params (alpha); + break; + case PROP_TARGET_B: + alpha->target_b = g_value_get_uint (value); + gst_alpha_init_params (alpha); + break; + case PROP_ANGLE: + alpha->angle = g_value_get_float (value); + gst_alpha_init_params (alpha); + break; + case PROP_NOISE_LEVEL: + alpha->noise_level = g_value_get_float (value); + gst_alpha_init_params (alpha); + break; + case PROP_BLACK_SENSITIVITY: + alpha->black_sensitivity = g_value_get_uint (value); + break; + case PROP_WHITE_SENSITIVITY: + alpha->white_sensitivity = g_value_get_uint (value); + break; + case PROP_PREFER_PASSTHROUGH:{ + gboolean prefer_passthrough = g_value_get_boolean (value); + + reconfigure = ((! !prefer_passthrough) != (! !alpha->prefer_passthrough)) + && (alpha->method == ALPHA_METHOD_SET) && (alpha->alpha == 1.0); + alpha->prefer_passthrough = prefer_passthrough; + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + if (reconfigure) + gst_base_transform_reconfigure (GST_BASE_TRANSFORM_CAST (alpha)); + + GST_ALPHA_UNLOCK (alpha); +} + +static void +gst_alpha_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstAlpha *alpha = GST_ALPHA (object); + + switch (prop_id) { + case PROP_METHOD: + g_value_set_enum (value, alpha->method); + break; + case PROP_ALPHA: + g_value_set_double (value, alpha->alpha); + break; + case PROP_TARGET_R: + g_value_set_uint (value, alpha->target_r); + break; + case PROP_TARGET_G: + g_value_set_uint (value, alpha->target_g); + break; + case PROP_TARGET_B: + g_value_set_uint (value, alpha->target_b); + break; + case PROP_ANGLE: + g_value_set_float (value, alpha->angle); + break; + case PROP_NOISE_LEVEL: + g_value_set_float (value, alpha->noise_level); + break; + case PROP_BLACK_SENSITIVITY: + g_value_set_uint (value, alpha->black_sensitivity); + break; + case PROP_WHITE_SENSITIVITY: + g_value_set_uint (value, alpha->white_sensitivity); + break; + case PROP_PREFER_PASSTHROUGH: + g_value_set_boolean (value, alpha->prefer_passthrough); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_alpha_get_unit_size (GstBaseTransform * btrans, + GstCaps * caps, guint * size) +{ + GstVideoFormat format; + gint width, height; + + if (!gst_video_format_parse_caps (caps, &format, &width, &height)) + return FALSE; + + *size = gst_video_format_get_size (format, width, height); + + GST_DEBUG_OBJECT (btrans, "unit size = %d for format %d w %d height %d", + *size, format, width, height); + + return TRUE; +} + +static GstCaps * +gst_alpha_transform_caps (GstBaseTransform * btrans, + GstPadDirection direction, GstCaps * caps) +{ + GstAlpha *alpha = GST_ALPHA (btrans); + GstCaps *ret, *tmp, *tmp2; + GstStructure *structure; + gint i; + + tmp = gst_caps_new_empty (); + + GST_ALPHA_LOCK (alpha); + for (i = 0; i < gst_caps_get_size (caps); i++) { + structure = gst_structure_copy (gst_caps_get_structure (caps, i)); + + gst_structure_remove_field (structure, "format"); + gst_structure_remove_field (structure, "endianness"); + gst_structure_remove_field (structure, "depth"); + gst_structure_remove_field (structure, "bpp"); + gst_structure_remove_field (structure, "red_mask"); + gst_structure_remove_field (structure, "green_mask"); + gst_structure_remove_field (structure, "blue_mask"); + gst_structure_remove_field (structure, "alpha_mask"); + gst_structure_remove_field (structure, "color-matrix"); + gst_structure_remove_field (structure, "chroma-site"); + + gst_structure_set_name (structure, "video/x-raw-yuv"); + gst_caps_append_structure (tmp, gst_structure_copy (structure)); + gst_structure_set_name (structure, "video/x-raw-rgb"); + gst_caps_append_structure (tmp, structure); + } + + if (direction == GST_PAD_SINK) { + tmp2 = gst_static_caps_get (&gst_alpha_alpha_caps); + ret = gst_caps_intersect (tmp, tmp2); + gst_caps_unref (tmp); + gst_caps_unref (tmp2); + tmp = ret; + ret = NULL; + + if (alpha->prefer_passthrough && alpha->method == ALPHA_METHOD_SET + && alpha->alpha == 1.0) { + ret = gst_caps_copy (caps); + gst_caps_append (ret, tmp); + tmp = NULL; + } else { + ret = tmp; + tmp = NULL; + } + } else { + ret = tmp; + tmp = NULL; + } + + GST_DEBUG_OBJECT (alpha, + "Transformed %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, caps, ret); + + GST_ALPHA_UNLOCK (alpha); + + return ret; +} + +static gboolean +gst_alpha_set_caps (GstBaseTransform * btrans, + GstCaps * incaps, GstCaps * outcaps) +{ + GstAlpha *alpha = GST_ALPHA (btrans); + const gchar *matrix; + gboolean passthrough; + + GST_ALPHA_LOCK (alpha); + + if (!gst_video_format_parse_caps (incaps, &alpha->in_format, + &alpha->width, &alpha->height) || + !gst_video_format_parse_caps (outcaps, &alpha->out_format, + &alpha->width, &alpha->height)) { + GST_WARNING_OBJECT (alpha, + "Failed to parse caps %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, incaps, + outcaps); + GST_ALPHA_UNLOCK (alpha); + return FALSE; + } + + matrix = gst_video_parse_caps_color_matrix (incaps); + alpha->in_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; + + matrix = gst_video_parse_caps_color_matrix (outcaps); + alpha->out_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; + + passthrough = alpha->prefer_passthrough && + alpha->in_format == alpha->out_format && alpha->in_sdtv == alpha->out_sdtv + && alpha->method == ALPHA_METHOD_SET && alpha->alpha == 1.0; + + GST_DEBUG_OBJECT (alpha, + "Setting caps %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT + " (passthrough: %d)", incaps, outcaps, passthrough); + gst_base_transform_set_passthrough (btrans, passthrough); + + if (!gst_alpha_set_process_function (alpha) && !passthrough) { + GST_WARNING_OBJECT (alpha, + "No processing function for this caps and no passthrough mode"); + GST_ALPHA_UNLOCK (alpha); + return FALSE; + } + + gst_alpha_init_params (alpha); + + GST_ALPHA_UNLOCK (alpha); + + return TRUE; +} + +/* based on http://www.cs.utah.edu/~michael/chroma/ + */ +static inline gint +chroma_keying_yuv (gint a, gint * y, gint * u, + gint * v, gint cr, gint cb, gint smin, gint smax, guint8 accept_angle_tg, + guint8 accept_angle_ctg, guint8 one_over_kc, guint8 kfgy_scale, gint8 kg, + guint noise_level2) +{ + gint tmp, tmp1; + gint x1, y1; + gint x, z; + gint b_alpha; + + /* too dark or too bright, keep alpha */ + if (*y < smin || *y > smax) + return a; + + /* Convert foreground to XZ coords where X direction is defined by + the key color */ + tmp = ((*u) * cb + (*v) * cr) >> 7; + x = CLAMP (tmp, -128, 127); + tmp = ((*v) * cb - (*u) * cr) >> 7; + z = CLAMP (tmp, -128, 127); + + /* WARNING: accept angle should never be set greater than "somewhat less + than 90 degrees" to avoid dealing with negative/infinite tg. In reality, + 80 degrees should be enough if foreground is reasonable. If this seems + to be a problem, go to alternative ways of checking point position + (scalar product or line equations). This angle should not be too small + either to avoid infinite ctg (used to suppress foreground without use of + division) */ + + tmp = (x * accept_angle_tg) >> 4; + tmp = MIN (tmp, 127); + + if (abs (z) > tmp) { + /* keep foreground Kfg = 0 */ + return a; + } + /* Compute Kfg (implicitly) and Kbg, suppress foreground in XZ coord + according to Kfg */ + tmp = (z * accept_angle_ctg) >> 4; + tmp = CLAMP (tmp, -128, 127); + x1 = abs (tmp); + y1 = z; + + tmp1 = x - x1; + tmp1 = MAX (tmp1, 0); + b_alpha = (tmp1 * one_over_kc) / 2; + b_alpha = 255 - CLAMP (b_alpha, 0, 255); + b_alpha = (a * b_alpha) >> 8; + + tmp = (tmp1 * kfgy_scale) >> 4; + tmp1 = MIN (tmp, 255); + + *y = (*y < tmp1) ? 0 : *y - tmp1; + + /* Convert suppressed foreground back to CbCr */ + tmp = (x1 * cb - y1 * cr) >> 7; + *u = CLAMP (tmp, -128, 127); + + tmp = (x1 * cr + y1 * cb) >> 7; + *v = CLAMP (tmp, -128, 127); + + /* Deal with noise. For now, a circle around the key color with + radius of noise_level treated as exact key color. Introduces + sharp transitions. + */ + tmp = z * z + (x - kg) * (x - kg); + tmp = MIN (tmp, 0xffff); + + if (tmp < noise_level2) + b_alpha = 0; + + return b_alpha; +} + +#define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8) + +static void +gst_alpha_set_argb_ayuv (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); + gint i, j; + gint matrix[12]; + gint y, u, v; + gint o[4]; + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 3, width, + height); + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[2] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[3] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + memcpy (matrix, + alpha->out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[0] = (src[o[0]] * s_alpha) >> 8; + + y = APPLY_MATRIX (matrix, 0, src[o[1]], src[o[2]], src[o[3]]); + u = APPLY_MATRIX (matrix, 1, src[o[1]], src[o[2]], src[o[3]]); + v = APPLY_MATRIX (matrix, 2, src[o[1]], src[o[2]], src[o[3]]); + + dest[1] = y; + dest[2] = u; + dest[3] = v; + + dest += 4; + src += 4; + } + } +} + +static void +gst_alpha_chroma_key_argb_ayuv (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint i, j; + gint a, y, u, v; + gint r, g, b; + gint smin, smax; + gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + gint matrix[12]; + gint o[4]; + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 3, width, + height); + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[2] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[3] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + smin = 128 - alpha->black_sensitivity; + smax = 128 + alpha->white_sensitivity; + + memcpy (matrix, + alpha->out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = (src[o[0]] * pa) >> 8; + r = src[o[1]]; + g = src[o[2]]; + b = src[o[3]]; + + y = APPLY_MATRIX (matrix, 0, r, g, b); + u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; + v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + dest[0] = a; + dest[1] = y; + dest[2] = u; + dest[3] = v; + + src += 4; + dest += 4; + } + } +} + +static void +gst_alpha_set_argb_argb (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); + gint i, j; + gint p[4], o[4]; + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 3, width, + height); + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[2] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[3] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[p[0]] = (src[o[0]] * s_alpha) >> 8; + + dest[p[1]] = src[o[1]]; + dest[p[2]] = src[o[2]]; + dest[p[3]] = src[o[3]]; + + dest += 4; + src += 4; + } + } +} + +static void +gst_alpha_chroma_key_argb_argb (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint i, j; + gint a, y, u, v; + gint r, g, b; + gint smin, smax; + gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + gint matrix[12], matrix2[12]; + gint p[4], o[4]; + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 3, width, + height); + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[2] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[3] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + smin = 128 - alpha->black_sensitivity; + smax = 128 + alpha->white_sensitivity; + + memcpy (matrix, cog_rgb_to_ycbcr_matrix_8bit_sdtv, 12 * sizeof (gint)); + memcpy (matrix2, cog_ycbcr_to_rgb_matrix_8bit_sdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = (src[o[0]] * pa) >> 8; + r = src[o[1]]; + g = src[o[2]]; + b = src[o[3]]; + + y = APPLY_MATRIX (matrix, 0, r, g, b); + u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; + v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + r = APPLY_MATRIX (matrix2, 0, y, u, v); + g = APPLY_MATRIX (matrix2, 1, y, u, v); + b = APPLY_MATRIX (matrix2, 2, y, u, v); + + dest[p[0]] = a; + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + src += 4; + dest += 4; + } + } +} + +static void +gst_alpha_set_ayuv_argb (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); + gint y, x; + gint matrix[12]; + gint r, g, b; + gint p[4]; + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + memcpy (matrix, + alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + dest[p[0]] = (src[0] * s_alpha) >> 8; + + r = APPLY_MATRIX (matrix, 0, src[1], src[2], src[3]); + g = APPLY_MATRIX (matrix, 1, src[1], src[2], src[3]); + b = APPLY_MATRIX (matrix, 2, src[1], src[2], src[3]); + + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + dest += 4; + src += 4; + } + } +} + +static void +gst_alpha_chroma_key_ayuv_argb (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint i, j; + gint a, y, u, v; + gint r, g, b; + gint smin, smax; + gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + gint matrix[12]; + gint p[4]; + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + smin = 128 - alpha->black_sensitivity; + smax = 128 + alpha->white_sensitivity; + + memcpy (matrix, + alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = (src[0] * pa) >> 8; + y = src[1]; + u = src[2] - 128; + v = src[3] - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + + dest[p[0]] = a; + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + src += 4; + dest += 4; + } + } +} + +static void +gst_alpha_set_ayuv_ayuv (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); + gint y, x; + + if (alpha->in_sdtv == alpha->out_sdtv) { + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + dest[0] = (src[0] * s_alpha) >> 8; + dest[1] = src[1]; + dest[2] = src[2]; + dest[3] = src[3]; + + dest += 4; + src += 4; + } + } + } else { + gint matrix[12]; + + memcpy (matrix, + alpha->out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + dest[0] = (src[0] * s_alpha) >> 8; + dest[1] = APPLY_MATRIX (matrix, 0, src[1], src[2], src[3]); + dest[2] = APPLY_MATRIX (matrix, 1, src[1], src[2], src[3]); + dest[3] = APPLY_MATRIX (matrix, 2, src[1], src[2], src[3]); + + dest += 4; + src += 4; + } + } + } +} + +static void +gst_alpha_chroma_key_ayuv_ayuv (const guint8 * src, guint8 * dest, + gint width, gint height, GstAlpha * alpha) +{ + gint i, j; + gint a, y, u, v; + gint smin, smax; + gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + + smin = 128 - alpha->black_sensitivity; + smax = 128 + alpha->white_sensitivity; + + if (alpha->in_sdtv == alpha->out_sdtv) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = (src[0] * pa) >> 8; + y = src[1]; + u = src[2] - 128; + v = src[3] - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + dest[0] = a; + dest[1] = y; + dest[2] = u; + dest[3] = v; + + src += 4; + dest += 4; + } + } + } else { + gint matrix[12]; + + memcpy (matrix, + alpha->out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = (src[0] * pa) >> 8; + y = APPLY_MATRIX (matrix, 0, src[1], src[2], src[3]); + u = APPLY_MATRIX (matrix, 1, src[1], src[2], src[3]) - 128; + v = APPLY_MATRIX (matrix, 2, src[1], src[2], src[3]) - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + dest[0] = a; + dest[1] = y; + dest[2] = u; + dest[3] = v; + + src += 4; + dest += 4; + } + } + } +} + +static void +gst_alpha_set_rgb_ayuv (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint s_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + gint i, j; + gint matrix[12]; + gint y, u, v; + gint o[3]; + gint bpp; + + bpp = gst_video_format_get_pixel_stride (alpha->in_format, 0); + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[2] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + memcpy (matrix, + alpha->out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[0] = s_alpha; + + y = APPLY_MATRIX (matrix, 0, src[o[0]], src[o[1]], src[o[2]]); + u = APPLY_MATRIX (matrix, 1, src[o[0]], src[o[1]], src[o[2]]); + v = APPLY_MATRIX (matrix, 2, src[o[0]], src[o[1]], src[o[2]]); + + dest[1] = y; + dest[2] = u; + dest[3] = v; + + dest += 4; + src += bpp; + } + } +} + +static void +gst_alpha_chroma_key_rgb_ayuv (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint i, j; + gint a, y, u, v; + gint r, g, b; + gint smin, smax; + gint pa = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + gint matrix[12]; + gint o[3]; + gint bpp; + + bpp = gst_video_format_get_pixel_stride (alpha->in_format, 0); + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[2] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + smin = 128 - alpha->black_sensitivity; + smax = 128 + alpha->white_sensitivity; + + memcpy (matrix, + alpha->out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = pa; + r = src[o[0]]; + g = src[o[1]]; + b = src[o[2]]; + + y = APPLY_MATRIX (matrix, 0, r, g, b); + u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; + v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + dest[0] = a; + dest[1] = y; + dest[2] = u; + dest[3] = v; + + src += bpp; + dest += 4; + } + } +} + +static void +gst_alpha_set_rgb_argb (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint s_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + gint i, j; + gint p[4], o[3]; + gint bpp; + + bpp = gst_video_format_get_pixel_stride (alpha->in_format, 0); + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[2] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[p[0]] = s_alpha; + + dest[p[1]] = src[o[0]]; + dest[p[2]] = src[o[1]]; + dest[p[3]] = src[o[2]]; + + dest += 4; + src += bpp; + } + } +} + +static void +gst_alpha_chroma_key_rgb_argb (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint i, j; + gint a, y, u, v; + gint r, g, b; + gint smin, smax; + gint pa = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + gint matrix[12], matrix2[12]; + gint p[4], o[3]; + gint bpp; + + bpp = gst_video_format_get_pixel_stride (alpha->in_format, 0); + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[2] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + smin = 128 - alpha->black_sensitivity; + smax = 128 + alpha->white_sensitivity; + + memcpy (matrix, cog_rgb_to_ycbcr_matrix_8bit_sdtv, 12 * sizeof (gint)); + memcpy (matrix2, cog_ycbcr_to_rgb_matrix_8bit_sdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = pa; + r = src[o[0]]; + g = src[o[1]]; + b = src[o[2]]; + + y = APPLY_MATRIX (matrix, 0, r, g, b); + u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; + v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + r = APPLY_MATRIX (matrix2, 0, y, u, v); + g = APPLY_MATRIX (matrix2, 1, y, u, v); + b = APPLY_MATRIX (matrix2, 2, y, u, v); + + dest[p[0]] = a; + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + src += bpp; + dest += 4; + } + } +} + +static void +gst_alpha_set_planar_yuv_ayuv (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint b_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + const guint8 *srcY, *srcY_tmp; + const guint8 *srcU, *srcU_tmp; + const guint8 *srcV, *srcV_tmp; + gint i, j; + gint y_stride, uv_stride; + gint v_subs, h_subs; + + y_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); + uv_stride = gst_video_format_get_row_stride (alpha->in_format, 1, width); + + srcY_tmp = srcY = src; + srcU_tmp = srcU = + src + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + srcV_tmp = srcV = + src + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + v_subs = h_subs = 2; + break; + case GST_VIDEO_FORMAT_Y444: + v_subs = h_subs = 1; + break; + case GST_VIDEO_FORMAT_Y42B: + v_subs = 1; + h_subs = 2; + break; + case GST_VIDEO_FORMAT_Y41B: + v_subs = 1; + h_subs = 4; + break; + default: + g_assert_not_reached (); + return; + } + + if (alpha->in_sdtv == alpha->out_sdtv) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[0] = b_alpha; + dest[1] = srcY[0]; + dest[2] = srcU[0]; + dest[3] = srcV[0]; + + dest += 4; + srcY++; + if ((j + 1) % h_subs == 0) { + srcU++; + srcV++; + } + } + + srcY_tmp = srcY = srcY_tmp + y_stride; + if ((i + 1) % v_subs == 0) { + srcU_tmp = srcU = srcU_tmp + uv_stride; + srcV_tmp = srcV = srcV_tmp + uv_stride; + } else { + srcU = srcU_tmp; + srcV = srcV_tmp; + } + } + } else { + gint matrix[12]; + gint a, y, u, v; + + memcpy (matrix, + alpha->out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = b_alpha; + y = srcY[0]; + u = srcU[0]; + v = srcV[0]; + + dest[0] = a; + dest[1] = APPLY_MATRIX (matrix, 0, y, u, v); + dest[2] = APPLY_MATRIX (matrix, 1, y, u, v); + dest[3] = APPLY_MATRIX (matrix, 2, y, u, v); + + dest += 4; + srcY++; + if ((j + 1) % h_subs == 0) { + srcU++; + srcV++; + } + } + + srcY_tmp = srcY = srcY_tmp + y_stride; + if ((i + 1) % v_subs == 0) { + srcU_tmp = srcU = srcU_tmp + uv_stride; + srcV_tmp = srcV = srcV_tmp + uv_stride; + } else { + srcU = srcU_tmp; + srcV = srcV_tmp; + } + } + } +} + +static void +gst_alpha_chroma_key_planar_yuv_ayuv (const guint8 * src, guint8 * dest, + gint width, gint height, GstAlpha * alpha) +{ + gint b_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + const guint8 *srcY, *srcY_tmp; + const guint8 *srcU, *srcU_tmp; + const guint8 *srcV, *srcV_tmp; + gint i, j; + gint a, y, u, v; + gint y_stride, uv_stride; + gint v_subs, h_subs; + gint smin = 128 - alpha->black_sensitivity; + gint smax = 128 + alpha->white_sensitivity; + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + + y_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); + uv_stride = gst_video_format_get_row_stride (alpha->in_format, 1, width); + + srcY_tmp = srcY = src; + srcU_tmp = srcU = + src + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + srcV_tmp = srcV = + src + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + v_subs = h_subs = 2; + break; + case GST_VIDEO_FORMAT_Y444: + v_subs = h_subs = 1; + break; + case GST_VIDEO_FORMAT_Y42B: + v_subs = 1; + h_subs = 2; + break; + case GST_VIDEO_FORMAT_Y41B: + v_subs = 1; + h_subs = 4; + break; + default: + g_assert_not_reached (); + return; + } + + if (alpha->in_sdtv == alpha->out_sdtv) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = b_alpha; + y = srcY[0]; + u = srcU[0] - 128; + v = srcV[0] - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, + smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + dest[0] = a; + dest[1] = y; + dest[2] = u; + dest[3] = v; + + dest += 4; + srcY++; + if ((j + 1) % h_subs == 0) { + srcU++; + srcV++; + } + } + + srcY_tmp = srcY = srcY_tmp + y_stride; + if ((i + 1) % v_subs == 0) { + srcU_tmp = srcU = srcU_tmp + uv_stride; + srcV_tmp = srcV = srcV_tmp + uv_stride; + } else { + srcU = srcU_tmp; + srcV = srcV_tmp; + } + } + } else { + gint matrix[12]; + + memcpy (matrix, + alpha->out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = b_alpha; + y = APPLY_MATRIX (matrix, 0, srcY[0], srcU[0], srcV[0]); + u = APPLY_MATRIX (matrix, 1, srcY[0], srcU[0], srcV[0]) - 128; + v = APPLY_MATRIX (matrix, 2, srcY[0], srcU[0], srcV[0]) - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, + smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + dest[0] = a; + dest[1] = y; + dest[2] = u + 128; + dest[3] = v + 128; + + dest += 4; + srcY++; + if ((j + 1) % h_subs == 0) { + srcU++; + srcV++; + } + } + + srcY_tmp = srcY = srcY_tmp + y_stride; + if ((i + 1) % v_subs == 0) { + srcU_tmp = srcU = srcU_tmp + uv_stride; + srcV_tmp = srcV = srcV_tmp + uv_stride; + } else { + srcU = srcU_tmp; + srcV = srcV_tmp; + } + } + } +} + +static void +gst_alpha_set_planar_yuv_argb (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint b_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + const guint8 *srcY, *srcY_tmp; + const guint8 *srcU, *srcU_tmp; + const guint8 *srcV, *srcV_tmp; + gint i, j; + gint y_stride, uv_stride; + gint v_subs, h_subs; + gint matrix[12]; + gint a, y, u, v; + gint r, g, b; + gint p[4]; + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + y_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); + uv_stride = gst_video_format_get_row_stride (alpha->in_format, 1, width); + + srcY_tmp = srcY = src; + srcU_tmp = srcU = + src + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + srcV_tmp = srcV = + src + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + v_subs = h_subs = 2; + break; + case GST_VIDEO_FORMAT_Y444: + v_subs = h_subs = 1; + break; + case GST_VIDEO_FORMAT_Y42B: + v_subs = 1; + h_subs = 2; + break; + case GST_VIDEO_FORMAT_Y41B: + v_subs = 1; + h_subs = 4; + break; + default: + g_assert_not_reached (); + return; + } + + memcpy (matrix, + alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = b_alpha; + y = srcY[0]; + u = srcU[0]; + v = srcV[0]; + + dest[p[0]] = a; + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + dest += 4; + srcY++; + if ((j + 1) % h_subs == 0) { + srcU++; + srcV++; + } + } + + srcY_tmp = srcY = srcY_tmp + y_stride; + if ((i + 1) % v_subs == 0) { + srcU_tmp = srcU = srcU_tmp + uv_stride; + srcV_tmp = srcV = srcV_tmp + uv_stride; + } else { + srcU = srcU_tmp; + srcV = srcV_tmp; + } + } +} + +static void +gst_alpha_chroma_key_planar_yuv_argb (const guint8 * src, guint8 * dest, + gint width, gint height, GstAlpha * alpha) +{ + gint b_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + const guint8 *srcY, *srcY_tmp; + const guint8 *srcU, *srcU_tmp; + const guint8 *srcV, *srcV_tmp; + gint i, j; + gint a, y, u, v; + gint r, g, b; + gint y_stride, uv_stride; + gint v_subs, h_subs; + gint smin = 128 - alpha->black_sensitivity; + gint smax = 128 + alpha->white_sensitivity; + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + gint matrix[12]; + gint p[4]; + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + y_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); + uv_stride = gst_video_format_get_row_stride (alpha->in_format, 1, width); + + srcY_tmp = srcY = src; + srcU_tmp = srcU = + src + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + srcV_tmp = srcV = + src + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + v_subs = h_subs = 2; + break; + case GST_VIDEO_FORMAT_Y444: + v_subs = h_subs = 1; + break; + case GST_VIDEO_FORMAT_Y42B: + v_subs = 1; + h_subs = 2; + break; + case GST_VIDEO_FORMAT_Y41B: + v_subs = 1; + h_subs = 4; + break; + default: + g_assert_not_reached (); + return; + } + + memcpy (matrix, + alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + a = b_alpha; + y = srcY[0]; + u = srcU[0] - 128; + v = srcV[0] - 128; + + a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, + smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + u += 128; + v += 128; + + dest[p[0]] = a; + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + dest += 4; + srcY++; + if ((j + 1) % h_subs == 0) { + srcU++; + srcV++; + } + } + + srcY_tmp = srcY = srcY_tmp + y_stride; + if ((i + 1) % v_subs == 0) { + srcU_tmp = srcU = srcU_tmp + uv_stride; + srcV_tmp = srcV = srcV_tmp + uv_stride; + } else { + srcU = srcU_tmp; + srcV = srcV_tmp; + } + } +} + +static void +gst_alpha_set_packed_422_ayuv (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint s_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + gint i, j; + gint y, u, v; + gint p[4]; /* Y U Y V */ + gint src_stride; + const guint8 *src_tmp; + + src_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); + + p[0] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + p[2] = p[0] + 2; + p[1] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + if (alpha->in_sdtv != alpha->out_sdtv) { + gint matrix[12]; + + memcpy (matrix, + alpha->in_sdtv ? cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit : + cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + src_tmp = src; + + for (j = 0; j < width - 1; j += 2) { + dest[0] = s_alpha; + dest[4] = s_alpha; + + y = APPLY_MATRIX (matrix, 0, src[p[0]], src[p[1]], src[p[3]]); + u = APPLY_MATRIX (matrix, 1, src[p[0]], src[p[1]], src[p[3]]); + v = APPLY_MATRIX (matrix, 2, src[p[0]], src[p[1]], src[p[3]]); + + dest[1] = y; + dest[2] = u; + dest[3] = v; + + y = APPLY_MATRIX (matrix, 0, src[p[2]], src[p[1]], src[p[3]]); + u = APPLY_MATRIX (matrix, 1, src[p[2]], src[p[1]], src[p[3]]); + v = APPLY_MATRIX (matrix, 2, src[p[2]], src[p[1]], src[p[3]]); + + dest[5] = y; + dest[6] = u; + dest[7] = v; + + dest += 8; + src += 4; + } + + if (j == width - 1) { + dest[0] = s_alpha; + + y = APPLY_MATRIX (matrix, 0, src[p[0]], src[p[1]], src[p[3]]); + u = APPLY_MATRIX (matrix, 1, src[p[0]], src[p[1]], src[p[3]]); + v = APPLY_MATRIX (matrix, 2, src[p[0]], src[p[1]], src[p[3]]); + + dest[1] = y; + dest[2] = u; + dest[3] = v; + + dest += 4; + } + + src = src_tmp + src_stride; + } + } else { + for (i = 0; i < height; i++) { + src_tmp = src; + + for (j = 0; j < width - 1; j += 2) { + dest[0] = s_alpha; + dest[4] = s_alpha; + + y = src[p[0]]; + u = src[p[1]]; + v = src[p[3]];; + + dest[1] = y; + dest[2] = u; + dest[3] = v; + + y = src[p[2]]; + + dest[5] = y; + dest[6] = u; + dest[7] = v; + + dest += 8; + src += 4; + } + + if (j == width - 1) { + dest[0] = s_alpha; + + y = src[p[0]]; + u = src[p[1]]; + v = src[p[3]];; + + dest[1] = y; + dest[2] = u; + dest[3] = v; + + dest += 4; + } + + src = src_tmp + src_stride; + } + } +} + +static void +gst_alpha_chroma_key_packed_422_ayuv (const guint8 * src, guint8 * dest, + gint width, gint height, GstAlpha * alpha) +{ + gint i, j; + gint a, y, u, v; + gint smin, smax; + gint pa = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + gint p[4]; /* Y U Y V */ + gint src_stride; + const guint8 *src_tmp; + + src_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); + + p[0] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + p[2] = p[0] + 2; + p[1] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + smin = 128 - alpha->black_sensitivity; + smax = 128 + alpha->white_sensitivity; + + if (alpha->in_sdtv != alpha->out_sdtv) { + gint matrix[12]; + + memcpy (matrix, + alpha->in_sdtv ? cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit : + cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + src_tmp = src; + + for (j = 0; j < width - 1; j += 2) { + y = APPLY_MATRIX (matrix, 0, src[p[0]], src[p[1]], src[p[3]]); + u = APPLY_MATRIX (matrix, 1, src[p[0]], src[p[1]], src[p[3]]) - 128; + v = APPLY_MATRIX (matrix, 2, src[p[0]], src[p[1]], src[p[3]]) - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + dest[0] = a; + dest[1] = y; + dest[2] = u + 128; + dest[3] = v + 128; + + y = APPLY_MATRIX (matrix, 0, src[p[2]], src[p[1]], src[p[3]]); + u = APPLY_MATRIX (matrix, 1, src[p[2]], src[p[1]], src[p[3]]) - 128; + v = APPLY_MATRIX (matrix, 2, src[p[2]], src[p[1]], src[p[3]]) - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + dest[4] = a; + dest[5] = y; + dest[6] = u + 128; + dest[7] = v + 128; + + dest += 8; + src += 4; + } + + if (j == width - 1) { + y = APPLY_MATRIX (matrix, 0, src[p[0]], src[p[1]], src[p[3]]); + u = APPLY_MATRIX (matrix, 1, src[p[0]], src[p[1]], src[p[3]]) - 128; + v = APPLY_MATRIX (matrix, 2, src[p[0]], src[p[1]], src[p[3]]) - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + dest[0] = a; + dest[1] = y; + dest[2] = u + 128; + dest[3] = v + 128; + + dest += 4; + } + + src = src_tmp + src_stride; + } + } else { + for (i = 0; i < height; i++) { + src_tmp = src; + + for (j = 0; j < width - 1; j += 2) { + y = src[p[0]]; + u = src[p[1]] - 128; + v = src[p[3]] - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + dest[0] = a; + dest[1] = y; + dest[2] = u + 128; + dest[3] = v + 128; + + y = src[p[2]]; + u = src[p[1]] - 128; + v = src[p[3]] - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + dest[4] = a; + dest[5] = y; + dest[6] = u + 128; + dest[7] = v + 128; + + dest += 8; + src += 4; + } + + if (j == width - 1) { + y = src[p[0]]; + u = src[p[1]] - 128; + v = src[p[3]] - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + + dest[0] = a; + dest[1] = y; + dest[2] = u + 128; + dest[3] = v + 128; + + dest += 4; + } + + src = src_tmp + src_stride; + } + } +} + +static void +gst_alpha_set_packed_422_argb (const guint8 * src, guint8 * dest, gint width, + gint height, GstAlpha * alpha) +{ + gint s_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + gint i, j; + gint p[4], o[4]; + gint src_stride; + const guint8 *src_tmp; + gint matrix[12]; + gint r, g, b; + + src_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[2] = o[0] + 2; + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[3] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + memcpy (matrix, + alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); + + for (i = 0; i < height; i++) { + src_tmp = src; + + for (j = 0; j < width - 1; j += 2) { + r = APPLY_MATRIX (matrix, 0, src[o[0]], src[o[1]], src[o[3]]); + g = APPLY_MATRIX (matrix, 1, src[o[0]], src[o[1]], src[o[3]]); + b = APPLY_MATRIX (matrix, 2, src[o[0]], src[o[1]], src[o[3]]); + + dest[p[0]] = s_alpha; + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + r = APPLY_MATRIX (matrix, 0, src[o[2]], src[o[1]], src[o[3]]); + g = APPLY_MATRIX (matrix, 1, src[o[2]], src[o[1]], src[o[3]]); + b = APPLY_MATRIX (matrix, 2, src[o[2]], src[o[1]], src[o[3]]); + + dest[4 + p[0]] = s_alpha; + dest[4 + p[1]] = CLAMP (r, 0, 255); + dest[4 + p[2]] = CLAMP (g, 0, 255); + dest[4 + p[3]] = CLAMP (b, 0, 255); + + dest += 8; + src += 4; + } + + if (j == width - 1) { + r = APPLY_MATRIX (matrix, 0, src[o[0]], src[o[1]], src[o[3]]); + g = APPLY_MATRIX (matrix, 1, src[o[0]], src[o[1]], src[o[3]]); + b = APPLY_MATRIX (matrix, 2, src[o[0]], src[o[1]], src[o[3]]); + + dest[p[0]] = s_alpha; + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + dest += 4; + } + + src = src_tmp + src_stride; + } +} + +static void +gst_alpha_chroma_key_packed_422_argb (const guint8 * src, guint8 * dest, + gint width, gint height, GstAlpha * alpha) +{ + gint i, j; + gint a, y, u, v; + gint r, g, b; + gint smin, smax; + gint pa = CLAMP ((gint) (alpha->alpha * 255), 0, 255); + gint8 cb = alpha->cb, cr = alpha->cr; + gint8 kg = alpha->kg; + guint8 accept_angle_tg = alpha->accept_angle_tg; + guint8 accept_angle_ctg = alpha->accept_angle_ctg; + guint8 one_over_kc = alpha->one_over_kc; + guint8 kfgy_scale = alpha->kfgy_scale; + guint noise_level2 = alpha->noise_level2; + gint p[4], o[4]; + gint src_stride; + const guint8 *src_tmp; + gint matrix[12]; + + src_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); + + o[0] = + gst_video_format_get_component_offset (alpha->in_format, 0, width, + height); + o[2] = o[0] + 2; + o[1] = + gst_video_format_get_component_offset (alpha->in_format, 1, width, + height); + o[3] = + gst_video_format_get_component_offset (alpha->in_format, 2, width, + height); + + p[0] = + gst_video_format_get_component_offset (alpha->out_format, 3, width, + height); + p[1] = + gst_video_format_get_component_offset (alpha->out_format, 0, width, + height); + p[2] = + gst_video_format_get_component_offset (alpha->out_format, 1, width, + height); + p[3] = + gst_video_format_get_component_offset (alpha->out_format, 2, width, + height); + + memcpy (matrix, + alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); + + smin = 128 - alpha->black_sensitivity; + smax = 128 + alpha->white_sensitivity; + + for (i = 0; i < height; i++) { + src_tmp = src; + + for (j = 0; j < width - 1; j += 2) { + y = src[o[0]]; + u = src[o[1]] - 128; + v = src[o[3]] - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + u += 128; + v += 128; + + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + + dest[p[0]] = a; + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + y = src[o[2]]; + u = src[o[1]] - 128; + v = src[o[3]] - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + u += 128; + v += 128; + + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + + dest[4 + p[0]] = a; + dest[4 + p[1]] = CLAMP (r, 0, 255); + dest[4 + p[2]] = CLAMP (g, 0, 255); + dest[4 + p[3]] = CLAMP (b, 0, 255); + + dest += 8; + src += 4; + } + + if (j == width - 1) { + y = src[o[0]]; + u = src[o[1]] - 128; + v = src[o[3]] - 128; + + a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, + smin, smax, accept_angle_tg, accept_angle_ctg, + one_over_kc, kfgy_scale, kg, noise_level2); + u += 128; + v += 128; + + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + + dest[p[0]] = a; + dest[p[1]] = CLAMP (r, 0, 255); + dest[p[2]] = CLAMP (g, 0, 255); + dest[p[3]] = CLAMP (b, 0, 255); + + dest += 4; + } + + src = src_tmp + src_stride; + } +} + +/* Protected with the alpha lock */ +static void +gst_alpha_init_params (GstAlpha * alpha) +{ + gfloat kgl; + gfloat tmp; + gfloat tmp1, tmp2; + gfloat y; + const gint *matrix; + + /* RGB->RGB: convert to SDTV YUV, chroma keying, convert back + * YUV->RGB: chroma keying, convert to RGB + * RGB->YUV: convert to YUV, chroma keying + * YUV->YUV: convert matrix, chroma keying + */ + if (gst_video_format_is_rgb (alpha->in_format) + && gst_video_format_is_rgb (alpha->out_format)) + matrix = cog_rgb_to_ycbcr_matrix_8bit_sdtv; + else if (gst_video_format_is_yuv (alpha->in_format) + && gst_video_format_is_rgb (alpha->out_format)) + matrix = + (alpha->in_sdtv) ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv; + else if (gst_video_format_is_rgb (alpha->in_format) + && gst_video_format_is_yuv (alpha->out_format)) + matrix = + (alpha->out_sdtv) ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv; + else /* yuv -> yuv */ + matrix = + (alpha->out_sdtv) ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv; + + y = (matrix[0] * ((gint) alpha->target_r) + + matrix[1] * ((gint) alpha->target_g) + + matrix[2] * ((gint) alpha->target_b) + matrix[3]) >> 8; + /* Cb,Cr without offset here because the chroma keying + * works with them being in range [-128,127] + */ + tmp1 = + (matrix[4] * ((gint) alpha->target_r) + + matrix[5] * ((gint) alpha->target_g) + + matrix[6] * ((gint) alpha->target_b)) >> 8; + tmp2 = + (matrix[8] * ((gint) alpha->target_r) + + matrix[9] * ((gint) alpha->target_g) + + matrix[10] * ((gint) alpha->target_b)) >> 8; + + kgl = sqrt (tmp1 * tmp1 + tmp2 * tmp2); + alpha->cb = 127 * (tmp1 / kgl); + alpha->cr = 127 * (tmp2 / kgl); + + tmp = 15 * tan (M_PI * alpha->angle / 180); + tmp = MIN (tmp, 255); + alpha->accept_angle_tg = tmp; + tmp = 15 / tan (M_PI * alpha->angle / 180); + tmp = MIN (tmp, 255); + alpha->accept_angle_ctg = tmp; + tmp = 1 / (kgl); + alpha->one_over_kc = 255 * 2 * tmp - 255; + tmp = 15 * y / kgl; + tmp = MIN (tmp, 255); + alpha->kfgy_scale = tmp; + alpha->kg = MIN (kgl, 127); + + alpha->noise_level2 = alpha->noise_level * alpha->noise_level; +} + +/* Protected with the alpha lock */ +static gboolean +gst_alpha_set_process_function (GstAlpha * alpha) +{ + alpha->process = NULL; + + switch (alpha->method) { + case ALPHA_METHOD_SET: + switch (alpha->out_format) { + case GST_VIDEO_FORMAT_AYUV: + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_AYUV: + alpha->process = gst_alpha_set_ayuv_ayuv; + break; + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y41B: + alpha->process = gst_alpha_set_planar_yuv_ayuv; + break; + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_YVYU: + case GST_VIDEO_FORMAT_UYVY: + alpha->process = gst_alpha_set_packed_422_ayuv; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + alpha->process = gst_alpha_set_argb_ayuv; + break; + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + alpha->process = gst_alpha_set_rgb_ayuv; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_AYUV: + alpha->process = gst_alpha_set_ayuv_argb; + break; + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y41B: + alpha->process = gst_alpha_set_planar_yuv_argb; + break; + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_YVYU: + case GST_VIDEO_FORMAT_UYVY: + alpha->process = gst_alpha_set_packed_422_argb; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + alpha->process = gst_alpha_set_argb_argb; + break; + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + alpha->process = gst_alpha_set_rgb_argb; + break; + default: + break; + } + break; + break; + default: + break; + } + break; + case ALPHA_METHOD_GREEN: + case ALPHA_METHOD_BLUE: + case ALPHA_METHOD_CUSTOM: + switch (alpha->out_format) { + case GST_VIDEO_FORMAT_AYUV: + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_AYUV: + alpha->process = gst_alpha_chroma_key_ayuv_ayuv; + break; + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y41B: + alpha->process = gst_alpha_chroma_key_planar_yuv_ayuv; + break; + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_YVYU: + case GST_VIDEO_FORMAT_UYVY: + alpha->process = gst_alpha_chroma_key_packed_422_ayuv; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + alpha->process = gst_alpha_chroma_key_argb_ayuv; + break; + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + alpha->process = gst_alpha_chroma_key_rgb_ayuv; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_AYUV: + alpha->process = gst_alpha_chroma_key_ayuv_argb; + break; + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y41B: + alpha->process = gst_alpha_chroma_key_planar_yuv_argb; + break; + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_YVYU: + case GST_VIDEO_FORMAT_UYVY: + alpha->process = gst_alpha_chroma_key_packed_422_argb; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + alpha->process = gst_alpha_chroma_key_argb_argb; + break; + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + alpha->process = gst_alpha_chroma_key_rgb_argb; + break; + default: + break; + } + break; + break; + default: + break; + } + break; + default: + break; + } + return alpha->process != NULL; +} + +static gboolean +gst_alpha_start (GstBaseTransform * btrans) +{ + GstAlpha *alpha = GST_ALPHA (btrans); + + GST_ALPHA_LOCK (alpha); + gst_alpha_init_params (alpha); + GST_ALPHA_UNLOCK (alpha); + + return TRUE; +} + +static void +gst_alpha_before_transform (GstBaseTransform * btrans, GstBuffer * buf) +{ + GstAlpha *alpha = GST_ALPHA (btrans); + GstClockTime timestamp; + + timestamp = gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, + GST_BUFFER_TIMESTAMP (buf)); + GST_LOG ("Got stream time of %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); + if (GST_CLOCK_TIME_IS_VALID (timestamp)) + gst_object_sync_values (G_OBJECT (alpha), timestamp); +} + +static GstFlowReturn +gst_alpha_transform (GstBaseTransform * btrans, GstBuffer * in, GstBuffer * out) +{ + GstAlpha *alpha = GST_ALPHA (btrans); + gint width, height; + + GST_ALPHA_LOCK (alpha); + + if (G_UNLIKELY (!alpha->process)) { + GST_ERROR_OBJECT (alpha, "Not negotiated yet"); + GST_ALPHA_UNLOCK (alpha); + return GST_FLOW_NOT_NEGOTIATED; + } + + width = alpha->width; + height = alpha->height; + + alpha->process (GST_BUFFER_DATA (in), + GST_BUFFER_DATA (out), width, height, alpha); + + GST_ALPHA_UNLOCK (alpha); + + return GST_FLOW_OK; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_controller_init (NULL, NULL); + + return gst_element_register (plugin, "alpha", GST_RANK_NONE, GST_TYPE_ALPHA); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "alpha", + "adds an alpha channel to video - constant or via chroma-keying", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/alpha/gstalpha.h b/gst/alpha/gstalpha.h new file mode 100644 index 0000000..5de966e --- /dev/null +++ b/gst/alpha/gstalpha.h @@ -0,0 +1,121 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2007> Wim Taymans + * Copyright (C) <2007> Edward Hervey + * Copyright (C) <2007> Jan Schmidt + * + * 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_ALPHA_H__ +#define __GST_ALPHA_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ALPHA \ + (gst_alpha_get_type()) +#define GST_ALPHA(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALPHA,GstAlpha)) +#define GST_ALPHA_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALPHA,GstAlphaClass)) +#define GST_IS_ALPHA(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALPHA)) +#define GST_IS_ALPHA_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALPHA)) + +typedef struct _GstAlpha GstAlpha; +typedef struct _GstAlphaClass GstAlphaClass; + +/** + * GstAlphaMethod: + * @ALPHA_METHOD_SET: Set/adjust alpha channel + * @ALPHA_METHOD_GREEN: Chroma Key green + * @ALPHA_METHOD_BLUE: Chroma Key blue + * @ALPHA_METHOD_CUSTOM: Chroma Key on target_r/g/b + */ +typedef enum +{ + ALPHA_METHOD_SET, + ALPHA_METHOD_GREEN, + ALPHA_METHOD_BLUE, + ALPHA_METHOD_CUSTOM, +} +GstAlphaMethod; + +GST_DEBUG_CATEGORY_STATIC (gst_alpha_debug); +#define GST_CAT_DEFAULT gst_alpha_debug + +struct _GstAlpha +{ + GstVideoFilter parent; + + /* */ + + /* caps */ +#if !GLIB_CHECK_VERSION (2, 31, 0) + GStaticMutex lock; +#else + GMutex lock; +#endif + + GstVideoFormat in_format, out_format; + gint width, height; + gboolean in_sdtv, out_sdtv; + + /* properties */ + gdouble alpha; + + guint target_r; + guint target_g; + guint target_b; + + GstAlphaMethod method; + + gfloat angle; + gfloat noise_level; + guint black_sensitivity; + guint white_sensitivity; + + gboolean prefer_passthrough; + + /* processing function */ + void (*process) (const guint8 *src, guint8 *dest, gint width, gint height, GstAlpha *alpha); + + /* precalculated values for chroma keying */ + gint8 cb, cr; + gint8 kg; + guint8 accept_angle_tg; + guint8 accept_angle_ctg; + guint8 one_over_kc; + guint8 kfgy_scale; + guint noise_level2; +}; + +struct _GstAlphaClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_alpha_get_type (void); + +G_END_DECLS + +#endif /* __GST_ALPHA_H__ */ diff --git a/gst/alpha/gstalphacolor.c b/gst/alpha/gstalphacolor.c new file mode 100644 index 0000000..3c9b37d --- /dev/null +++ b/gst/alpha/gstalphacolor.c @@ -0,0 +1,672 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-alphacolor + * + * The alphacolor element does memory-efficient (in-place) colourspace + * conversion from RGBA to AYUV or AYUV to RGBA while preserving the + * alpha channel. + * + * Sample pipeline: + * |[ + * gst-launch videotestsrc ! "video/x-raw-yuv,format=(fourcc)AYUV" ! \ + * alphacolor ! "video/x-raw-rgb" ! ffmpegcolorspace ! autovideosink + * ]| + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstalphacolor.h" + +#include +#include + +#include + +GST_DEBUG_CATEGORY_STATIC (alpha_color_debug); +#define GST_CAT_DEFAULT alpha_color_debug + +/* elementfactory information */ +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";" + GST_VIDEO_CAPS_YUV ("AYUV")) + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";" + GST_VIDEO_CAPS_YUV ("AYUV")) + ); + +GST_BOILERPLATE (GstAlphaColor, gst_alpha_color, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +static GstCaps *gst_alpha_color_transform_caps (GstBaseTransform * btrans, + GstPadDirection direction, GstCaps * caps); +static gboolean gst_alpha_color_set_caps (GstBaseTransform * btrans, + GstCaps * incaps, GstCaps * outcaps); +static GstFlowReturn gst_alpha_color_transform_ip (GstBaseTransform * btrans, + GstBuffer * inbuf); + +static void +gst_alpha_color_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Alpha color filter", + "Filter/Converter/Video", + "ARGB from/to AYUV colorspace conversion preserving the alpha channel", + "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); +} + +static void +gst_alpha_color_class_init (GstAlphaColorClass * klass) +{ + GstBaseTransformClass *gstbasetransform_class = + (GstBaseTransformClass *) klass; + + gstbasetransform_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_alpha_color_transform_caps); + gstbasetransform_class->set_caps = + GST_DEBUG_FUNCPTR (gst_alpha_color_set_caps); + gstbasetransform_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_alpha_color_transform_ip); + + GST_DEBUG_CATEGORY_INIT (alpha_color_debug, "alphacolor", 0, + "ARGB<->AYUV colorspace conversion preserving the alpha channels"); +} + +static void +gst_alpha_color_init (GstAlphaColor * alpha, GstAlphaColorClass * g_class) +{ + GstBaseTransform *btrans = GST_BASE_TRANSFORM (alpha); + + btrans->always_in_place = TRUE; +} + +static GstCaps * +gst_alpha_color_transform_caps (GstBaseTransform * btrans, + GstPadDirection direction, GstCaps * caps) +{ + const GstCaps *tmpl_caps = NULL; + GstCaps *result = NULL, *local_caps = NULL; + guint i; + + local_caps = gst_caps_new_empty (); + + for (i = 0; i < gst_caps_get_size (caps); i++) { + GstStructure *structure = + gst_structure_copy (gst_caps_get_structure (caps, i)); + + /* Remove any specific parameter from the structure */ + gst_structure_remove_field (structure, "format"); + gst_structure_remove_field (structure, "endianness"); + gst_structure_remove_field (structure, "depth"); + gst_structure_remove_field (structure, "bpp"); + gst_structure_remove_field (structure, "red_mask"); + gst_structure_remove_field (structure, "green_mask"); + gst_structure_remove_field (structure, "blue_mask"); + gst_structure_remove_field (structure, "alpha_mask"); + gst_structure_remove_field (structure, "color-matrix"); + gst_structure_remove_field (structure, "chroma-site"); + + gst_structure_set_name (structure, "video/x-raw-rgb"); + gst_caps_append_structure (local_caps, gst_structure_copy (structure)); + gst_structure_set_name (structure, "video/x-raw-yuv"); + gst_caps_append_structure (local_caps, structure); + } + + /* Get the appropriate template */ + if (direction == GST_PAD_SINK) { + tmpl_caps = gst_static_pad_template_get_caps (&src_template); + } else if (direction == GST_PAD_SRC) { + tmpl_caps = gst_static_pad_template_get_caps (&sink_template); + } + + /* Intersect with our template caps */ + result = gst_caps_intersect (local_caps, tmpl_caps); + + gst_caps_unref (local_caps); + gst_caps_do_simplify (result); + + GST_LOG_OBJECT (btrans, "transformed %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT, + caps, result); + + return result; +} + +/* Generated by -bad/ext/cog/generate_tables */ +static const int cog_ycbcr_to_rgb_matrix_8bit_hdtv[] = { + 298, 0, 459, -63514, + 298, -55, -136, 19681, + 298, 541, 0, -73988, +}; + +static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { + 298, 0, 409, -57068, + 298, -100, -208, 34707, + 298, 516, 0, -70870, +}; + +static const gint cog_rgb_to_ycbcr_matrix_8bit_hdtv[] = { + 47, 157, 16, 4096, + -26, -87, 112, 32768, + 112, -102, -10, 32768, +}; + +static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { + 66, 129, 25, 4096, + -38, -74, 112, 32768, + 112, -94, -18, 32768, +}; + +static const gint cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit[] = { + 256, -30, -53, 10600, + 0, 261, 29, -4367, + 0, 19, 262, -3289, +}; + +static const gint cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit[] = { + 256, 25, 49, -9536, + 0, 253, -28, 3958, + 0, -19, 252, 2918, +}; + +#define DEFINE_ARGB_AYUV_FUNCTIONS(name, A, R, G, B) \ +static void \ +transform_##name##_ayuv (guint8 * data, gint size, const gint *matrix) \ +{ \ + gint y, u, v; \ + gint yc[4]; \ + gint uc[4]; \ + gint vc[4]; \ + \ + memcpy (yc, matrix, 4 * sizeof (gint)); \ + memcpy (uc, matrix + 4, 4 * sizeof (gint)); \ + memcpy (vc, matrix + 8, 4 * sizeof (gint)); \ + \ + while (size > 0) { \ + y = (data[R] * yc[0] + data[G] * yc[1] + data[B] * yc[2] + yc[3]) >> 8; \ + u = (data[R] * uc[0] + data[G] * uc[1] + data[B] * uc[2] + uc[3]) >> 8; \ + v = (data[R] * vc[0] + data[G] * vc[1] + data[B] * vc[2] + vc[3]) >> 8; \ + \ + data[0] = data[A]; \ + data[1] = y; \ + data[2] = u; \ + data[3] = v; \ + \ + data += 4; \ + size -= 4; \ + } \ +} \ +\ +static void \ +transform_ayuv_##name (guint8 * data, gint size, const gint *matrix) \ +{ \ + gint r, g, b; \ + gint rc[4]; \ + gint gc[4]; \ + gint bc[4]; \ + \ + memcpy (rc, matrix, 4 * sizeof (gint)); \ + memcpy (gc, matrix + 4, 4 * sizeof (gint)); \ + memcpy (bc, matrix + 8, 4 * sizeof (gint)); \ + \ + while (size > 0) { \ + r = (data[1] * rc[0] + data[2] * rc[1] + data[3] * rc[2] + rc[3]) >> 8; \ + g = (data[1] * gc[0] + data[2] * gc[1] + data[3] * gc[2] + gc[3]) >> 8; \ + b = (data[1] * bc[0] + data[2] * bc[1] + data[3] * bc[2] + bc[3]) >> 8; \ + \ + data[A] = data[0]; \ + data[R] = CLAMP (r, 0, 255); \ + data[G] = CLAMP (g, 0, 255); \ + data[B] = CLAMP (b, 0, 255); \ + \ + data += 4; \ + size -= 4; \ + } \ +} + +DEFINE_ARGB_AYUV_FUNCTIONS (rgba, 3, 0, 1, 2); +DEFINE_ARGB_AYUV_FUNCTIONS (bgra, 3, 2, 1, 0); +DEFINE_ARGB_AYUV_FUNCTIONS (argb, 0, 1, 2, 3); +DEFINE_ARGB_AYUV_FUNCTIONS (abgr, 0, 3, 2, 1); + +static void +transform_ayuv_ayuv (guint8 * data, gint size, const gint * matrix) +{ + gint y, u, v; + gint yc[4]; + gint uc[4]; + gint vc[4]; + + if (matrix == NULL) + return; + + memcpy (yc, matrix, 4 * sizeof (gint)); + memcpy (uc, matrix + 4, 4 * sizeof (gint)); + memcpy (vc, matrix + 8, 4 * sizeof (gint)); + + while (size > 0) { + y = (data[1] * yc[0] + data[2] * yc[1] + data[3] * yc[2] + yc[3]) >> 8; + u = (data[1] * uc[0] + data[2] * uc[1] + data[3] * uc[2] + uc[3]) >> 8; + v = (data[1] * vc[0] + data[2] * vc[1] + data[3] * vc[2] + vc[3]) >> 8; + + data[1] = y; + data[2] = u; + data[3] = v; + + data += 4; + size -= 4; + } +} + +static void +transform_argb_bgra (guint8 * data, gint size, const gint * matrix) +{ + gint r, g, b; + + while (size > 0) { + r = data[1]; + g = data[2]; + b = data[3]; + + data[3] = data[0]; + data[0] = b; + data[1] = g; + data[2] = r; + + data += 4; + size -= 4; + } +} + +#define transform_abgr_rgba transform_argb_bgra + +static void +transform_argb_abgr (guint8 * data, gint size, const gint * matrix) +{ + gint r, g, b; + + while (size > 0) { + r = data[1]; + g = data[2]; + b = data[3]; + + /* data[0] = data[0]; */ + data[1] = b; + data[2] = g; + data[3] = r; + + data += 4; + size -= 4; + } +} + +#define transform_abgr_argb transform_argb_abgr + +static void +transform_rgba_bgra (guint8 * data, gint size, const gint * matrix) +{ + gint r, g, b; + + while (size > 0) { + r = data[0]; + g = data[1]; + b = data[2]; + + /* data[3] = data[3] */ ; + data[0] = b; + data[1] = g; + data[2] = r; + + data += 4; + size -= 4; + } +} + +#define transform_bgra_rgba transform_rgba_bgra + +static void +transform_argb_rgba (guint8 * data, gint size, const gint * matrix) +{ + gint r, g, b; + + while (size > 0) { + r = data[1]; + g = data[2]; + b = data[3]; + + data[3] = data[0]; + data[0] = r; + data[1] = g; + data[2] = b; + + data += 4; + size -= 4; + } +} + +#define transform_abgr_bgra transform_argb_rgba + +static void +transform_bgra_argb (guint8 * data, gint size, const gint * matrix) +{ + gint r, g, b; + + while (size > 0) { + r = data[2]; + g = data[1]; + b = data[0]; + + data[0] = data[3]; + data[1] = r; + data[2] = g; + data[3] = b; + + data += 4; + size -= 4; + } +} + +#define transform_rgba_abgr transform_bgra_argb + +static void +transform_rgba_argb (guint8 * data, gint size, const gint * matrix) +{ + gint r, g, b; + + while (size > 0) { + r = data[0]; + g = data[1]; + b = data[2]; + + data[0] = data[3]; + data[1] = r; + data[2] = g; + data[3] = b; + + data += 4; + size -= 4; + } +} + +#define transform_bgra_abgr transform_rgba_argb + +static gboolean +gst_alpha_color_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstAlphaColor *alpha = GST_ALPHA_COLOR (btrans); + gboolean ret; + gint w, h; + gint w2, h2; + GstVideoFormat in_format, out_format; + const gchar *matrix; + gboolean in_sdtv, out_sdtv; + + alpha->process = NULL; + alpha->matrix = NULL; + + ret = gst_video_format_parse_caps (incaps, &in_format, &w, &h); + ret &= gst_video_format_parse_caps (outcaps, &out_format, &w2, &h2); + + if (!ret || w != w2 || h != h2) { + GST_DEBUG_OBJECT (alpha, "incomplete or invalid caps!"); + return FALSE; + } + + matrix = gst_video_parse_caps_color_matrix (incaps); + in_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; + matrix = gst_video_parse_caps_color_matrix (outcaps); + out_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; + + alpha->in_format = in_format; + alpha->out_format = out_format; + alpha->width = w; + alpha->height = h; + + switch (alpha->in_format) { + case GST_VIDEO_FORMAT_ARGB: + switch (alpha->out_format) { + case GST_VIDEO_FORMAT_ARGB: + alpha->process = NULL; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_BGRA: + alpha->process = transform_argb_bgra; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_ABGR: + alpha->process = transform_argb_abgr; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_RGBA: + alpha->process = transform_argb_rgba; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_AYUV: + alpha->process = transform_argb_ayuv; + alpha->matrix = + out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv; + break; + default: + alpha->process = NULL; + alpha->matrix = NULL; + break; + } + break; + case GST_VIDEO_FORMAT_BGRA: + switch (alpha->out_format) { + case GST_VIDEO_FORMAT_BGRA: + alpha->process = NULL; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_ARGB: + alpha->process = transform_bgra_argb; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_ABGR: + alpha->process = transform_bgra_abgr; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_RGBA: + alpha->process = transform_bgra_rgba; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_AYUV: + alpha->process = transform_bgra_ayuv; + alpha->matrix = + out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv; + break; + default: + alpha->process = NULL; + alpha->matrix = NULL; + break; + } + break; + case GST_VIDEO_FORMAT_ABGR: + switch (alpha->out_format) { + case GST_VIDEO_FORMAT_ABGR: + alpha->process = NULL; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_RGBA: + alpha->process = transform_abgr_rgba; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_ARGB: + alpha->process = transform_abgr_argb; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_BGRA: + alpha->process = transform_abgr_bgra; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_AYUV: + alpha->process = transform_abgr_ayuv; + alpha->matrix = + out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv; + break; + default: + alpha->process = NULL; + alpha->matrix = NULL; + break; + } + break; + case GST_VIDEO_FORMAT_RGBA: + switch (alpha->out_format) { + case GST_VIDEO_FORMAT_RGBA: + alpha->process = NULL; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_ARGB: + alpha->process = transform_rgba_argb; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_ABGR: + alpha->process = transform_rgba_abgr; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_BGRA: + alpha->process = transform_rgba_bgra; + alpha->matrix = NULL; + break; + case GST_VIDEO_FORMAT_AYUV: + alpha->process = transform_rgba_ayuv; + alpha->matrix = + out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv; + break; + default: + alpha->process = NULL; + alpha->matrix = NULL; + break; + } + break; + case GST_VIDEO_FORMAT_AYUV: + switch (alpha->out_format) { + case GST_VIDEO_FORMAT_AYUV: + if (in_sdtv == out_sdtv) { + alpha->process = transform_ayuv_ayuv; + alpha->matrix = NULL; + } else { + alpha->process = transform_ayuv_ayuv; + alpha->matrix = + out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit; + } + break; + case GST_VIDEO_FORMAT_ARGB: + alpha->process = transform_ayuv_argb; + alpha->matrix = + in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv; + break; + case GST_VIDEO_FORMAT_BGRA: + alpha->process = transform_ayuv_bgra; + alpha->matrix = + in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv; + break; + case GST_VIDEO_FORMAT_ABGR: + alpha->process = transform_ayuv_abgr; + alpha->matrix = + in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv; + break; + case GST_VIDEO_FORMAT_RGBA: + alpha->process = transform_ayuv_rgba; + alpha->matrix = + in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv; + break; + default: + alpha->process = NULL; + alpha->matrix = NULL; + break; + } + break; + default: + alpha->process = NULL; + alpha->matrix = NULL; + break; + } + + if (in_format == out_format && in_sdtv == out_sdtv) + gst_base_transform_set_passthrough (btrans, TRUE); + else if (!alpha->process) + return FALSE; + + return TRUE; +} + +static GstFlowReturn +gst_alpha_color_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf) +{ + GstAlphaColor *alpha = GST_ALPHA_COLOR (btrans); + + if (G_UNLIKELY (GST_BUFFER_SIZE (inbuf) != 4 * alpha->width * alpha->height)) { + GST_ERROR_OBJECT (alpha, "Invalid buffer size (was %u, expected %u)", + GST_BUFFER_SIZE (inbuf), alpha->width * alpha->height); + return GST_FLOW_ERROR; + } + + if (gst_base_transform_is_passthrough (btrans)) + return GST_FLOW_OK; + + if (G_UNLIKELY (!alpha->process)) { + GST_ERROR_OBJECT (alpha, "Not negotiated yet"); + return GST_FLOW_NOT_NEGOTIATED; + } + + /* Transform in place */ + alpha->process (GST_BUFFER_DATA (inbuf), GST_BUFFER_SIZE (inbuf), + alpha->matrix); + + return GST_FLOW_OK; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "alphacolor", GST_RANK_NONE, + GST_TYPE_ALPHA_COLOR); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "alphacolor", + "RGBA from/to AYUV colorspace conversion preserving the alpha channel", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/alpha/gstalphacolor.h b/gst/alpha/gstalphacolor.h new file mode 100644 index 0000000..636d832 --- /dev/null +++ b/gst/alpha/gstalphacolor.h @@ -0,0 +1,60 @@ +/* GStreamer alphacolor element + * Copyright (C) 2005 Wim Taymans + * + * 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_ALPHA_COLOR_H_ +#define _GST_ALPHA_COLOR_H_ + +#include +#include + +#define GST_TYPE_ALPHA_COLOR \ + (gst_alpha_color_get_type()) +#define GST_ALPHA_COLOR(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALPHA_COLOR,GstAlphaColor)) +#define GST_ALPHA_COLOR_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALPHA_COLOR,GstAlphaColorClass)) +#define GST_IS_ALPHA_COLOR(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALPHA_COLOR)) +#define GST_IS_ALPHA_COLOR_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALPHA_COLOR)) + +typedef struct _GstAlphaColor GstAlphaColor; +typedef struct _GstAlphaColorClass GstAlphaColorClass; + +struct _GstAlphaColor +{ + GstVideoFilter parent; + + /*< private >*/ + /* caps */ + GstVideoFormat in_format, out_format; + gint width, height; + + void (*process) (guint8 * data, gint size, const gint * matrix); + const gint *matrix; +}; + +struct _GstAlphaColorClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_alpha_color_get_type (void); + +#endif /* _GST_ALPHA_COLOR_H_ */ diff --git a/gst/apetag/Makefile.am b/gst/apetag/Makefile.am new file mode 100644 index 0000000..54950f2 --- /dev/null +++ b/gst/apetag/Makefile.am @@ -0,0 +1,30 @@ +plugin_LTLIBRARIES = libgstapetag.la + +libgstapetag_la_SOURCES = gstapedemux.c +libgstapetag_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) +libgstapetag_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@\ + $(GST_BASE_LIBS) \ + $(GST_LIBS) +libgstapetag_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstapetag_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstapedemux.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstapetag -:SHARED libgstapetag \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstapetag_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstapetag_la_CFLAGS) \ + -:LDFLAGS $(libgstapetag_la_LDFLAGS) \ + $(libgstapetag_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/apetag/Makefile.in b/gst/apetag/Makefile.in new file mode 100644 index 0000000..7f5c58c --- /dev/null +++ b/gst/apetag/Makefile.in @@ -0,0 +1,828 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/apetag +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstapetag_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstapetag_la_OBJECTS = libgstapetag_la-gstapedemux.lo +libgstapetag_la_OBJECTS = $(am_libgstapetag_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstapetag_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstapetag_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstapetag_la_CFLAGS) $(CFLAGS) \ + $(libgstapetag_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstapetag_la_SOURCES) +DIST_SOURCES = $(libgstapetag_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstapetag.la +libgstapetag_la_SOURCES = gstapedemux.c +libgstapetag_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) + +libgstapetag_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@\ + $(GST_BASE_LIBS) \ + $(GST_LIBS) + +libgstapetag_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstapetag_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstapedemux.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/apetag/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/apetag/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstapetag.la: $(libgstapetag_la_OBJECTS) $(libgstapetag_la_DEPENDENCIES) $(EXTRA_libgstapetag_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstapetag_la_LINK) -rpath $(plugindir) $(libgstapetag_la_OBJECTS) $(libgstapetag_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapetag_la-gstapedemux.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstapetag_la-gstapedemux.lo: gstapedemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapetag_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapetag_la_CFLAGS) $(CFLAGS) -MT libgstapetag_la-gstapedemux.lo -MD -MP -MF $(DEPDIR)/libgstapetag_la-gstapedemux.Tpo -c -o libgstapetag_la-gstapedemux.lo `test -f 'gstapedemux.c' || echo '$(srcdir)/'`gstapedemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapetag_la-gstapedemux.Tpo $(DEPDIR)/libgstapetag_la-gstapedemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstapedemux.c' object='libgstapetag_la-gstapedemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapetag_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapetag_la_CFLAGS) $(CFLAGS) -c -o libgstapetag_la-gstapedemux.lo `test -f 'gstapedemux.c' || echo '$(srcdir)/'`gstapedemux.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstapetag -:SHARED libgstapetag \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstapetag_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstapetag_la_CFLAGS) \ + -:LDFLAGS $(libgstapetag_la_LDFLAGS) \ + $(libgstapetag_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/apetag/gstapedemux.c b/gst/apetag/gstapedemux.c new file mode 100644 index 0000000..c139ead --- /dev/null +++ b/gst/apetag/gstapedemux.c @@ -0,0 +1,436 @@ +/* GStreamer APEv1/2 tag reader + * Copyright (C) 2004 Ronald Bultje + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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-apedemux + * + * apedemux accepts data streams with APE tags at the start or at the end + * (or both). The mime type of the data between the tag blocks is detected + * using typefind functions, and the appropriate output mime type set on + * outgoing buffers. + * + * The element is only able to read APE tags at the end of a stream from + * a seekable stream, ie. when get_range mode is supported by the upstream + * elements. If get_range operation is available, apedemux makes it available + * downstream. This means that elements which require get_range mode, such as + * wavparse or musepackdec, can operate on files containing APE tag + * information. + * + * + * Example launch line + * |[ + * gst-launch -t filesrc location=file.mpc ! apedemux ! fakesink + * ]| This pipeline should read any available APE tag information and output it. + * The contents of the file inside the APE tag regions should be detected, and + * the appropriate mime type set on buffers produced from apedemux. + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "gstapedemux.h" + +#include +#include + +#define APE_VERSION_MAJOR(ver) ((ver)/1000) + +GST_DEBUG_CATEGORY_STATIC (apedemux_debug); +#define GST_CAT_DEFAULT (apedemux_debug) + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-apetag") + ); + +static gboolean gst_ape_demux_identify_tag (GstTagDemux * demux, + GstBuffer * buffer, gboolean start_tag, guint * tag_size); +static GstTagDemuxResult gst_ape_demux_parse_tag (GstTagDemux * demux, + GstBuffer * buffer, gboolean start_tag, guint * tag_size, + GstTagList ** tags); + +GST_BOILERPLATE (GstApeDemux, gst_ape_demux, GstTagDemux, GST_TYPE_TAG_DEMUX); + +static void +gst_ape_demux_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "APE tag demuxer", + "Codec/Demuxer/Metadata", + "Read and output APE tags while demuxing the contents", + "Tim-Philipp Müller "); + + GST_DEBUG_CATEGORY_INIT (apedemux_debug, "apedemux", 0, + "GStreamer APE tag demuxer"); +} + +static void +gst_ape_demux_class_init (GstApeDemuxClass * klass) +{ + GstTagDemuxClass *tagdemux_class; + + tagdemux_class = GST_TAG_DEMUX_CLASS (klass); + + tagdemux_class->identify_tag = GST_DEBUG_FUNCPTR (gst_ape_demux_identify_tag); + tagdemux_class->parse_tag = GST_DEBUG_FUNCPTR (gst_ape_demux_parse_tag); + + /* no need for a merge function, the default behaviour to prefer start + * tags (APEv2) over end tags (usually APEv1, but could theoretically also + * be APEv2) is fine */ + + tagdemux_class->min_start_size = 32; + tagdemux_class->min_end_size = 32; +} + +static void +gst_ape_demux_init (GstApeDemux * apedemux, GstApeDemuxClass * gclass) +{ + /* nothing to do here */ +} + +static const struct _GstApeDemuxTagTableEntry +{ + const gchar *ape_tag; + const gchar *gst_tag; +} tag_table[] = { + { + "replaygain_track_gain", GST_TAG_TRACK_GAIN}, { + "replaygain_track_peak", GST_TAG_TRACK_PEAK}, { + "replaygain_album_gain", GST_TAG_ALBUM_GAIN}, { + "replaygain_album_peak", GST_TAG_ALBUM_PEAK}, { + "title", GST_TAG_TITLE}, { + "artist", GST_TAG_ARTIST}, { + "album", GST_TAG_ALBUM}, { + "composer", GST_TAG_COMPOSER}, { + "comment", GST_TAG_COMMENT}, { + "comments", GST_TAG_COMMENT}, { + "copyright", GST_TAG_COPYRIGHT}, { + "genre", GST_TAG_GENRE}, { + "isrc", GST_TAG_ISRC}, { + "disc", GST_TAG_ALBUM_VOLUME_NUMBER}, { + "disk", GST_TAG_ALBUM_VOLUME_NUMBER}, { + "discnumber", GST_TAG_ALBUM_VOLUME_NUMBER}, { + "disknumber", GST_TAG_ALBUM_VOLUME_NUMBER}, { + "track", GST_TAG_TRACK_NUMBER}, { + "tracknumber", GST_TAG_TRACK_NUMBER}, { + "year", GST_TAG_DATE}, { + "file", GST_TAG_LOCATION} +}; + +static gboolean +ape_demux_get_gst_tag_from_tag (const gchar * ape_tag, + const gchar ** gst_tag, GType * gst_tag_type) +{ + gint i; + + for (i = 0; i < G_N_ELEMENTS (tag_table); ++i) { + if (g_ascii_strcasecmp (tag_table[i].ape_tag, ape_tag) == 0) { + *gst_tag = tag_table[i].gst_tag; + *gst_tag_type = gst_tag_get_type (tag_table[i].gst_tag); + GST_LOG ("Mapped APE tag '%s' to GStreamer tag '%s'", ape_tag, *gst_tag); + return TRUE; + } + } + + GST_WARNING ("Could not map APE tag '%s' to a GStreamer tag", ape_tag); + return FALSE; +} + +static GstTagList * +ape_demux_parse_tags (const guint8 * data, gint size) +{ + GstTagList *taglist = gst_tag_list_new (); + + GST_LOG ("Reading tags from chunk of size %u bytes", size); + + /* get rid of header/footer */ + if (size >= 32 && memcmp (data, "APETAGEX", 8) == 0) { + data += 32; + size -= 32; + } + if (size > 32 && memcmp (data + size - 32, "APETAGEX", 8) == 0) { + size -= 32; + } + + /* read actual tags - at least 10 bytes for tag header */ + while (size >= 10) { + guint len, n = 8; + gchar *tag, *val; + const gchar *gst_tag; + GType gst_tag_type; + + /* find tag type and size */ + len = GST_READ_UINT32_LE (data); + while (n < size && data[n] != 0x0) + n++; + if (n == size) + break; + g_assert (data[n] == 0x0); + n++; + if (size - n < len) + break; + + /* If the tag is empty, skip to the next one */ + if (len == 0) + goto next_tag; + + /* read */ + tag = g_strndup ((gchar *) data + 8, n - 9); + val = g_strndup ((gchar *) data + n, len); + + GST_LOG ("tag [%s], val[%s]", tag, val); + + /* special-case 'media' tag, could be e.g. "CD 1/2" */ + if (g_ascii_strcasecmp (tag, "media") == 0) { + gchar *sp, *sp2; + + g_free (tag); + tag = g_strdup ("discnumber"); + /* get rid of the medium in front */ + sp = strchr (val, ' '); + while (sp != NULL && (sp2 = strchr (sp + 1, ' ')) != NULL) + sp = sp2; + if (sp) { + g_memmove (val, sp + 1, strlen (sp + 1) + 1); + } + } + + if (ape_demux_get_gst_tag_from_tag (tag, &gst_tag, &gst_tag_type)) { + GValue v = { 0, }; + + switch (gst_tag_type) { + case G_TYPE_INT:{ + gint v_int; + + if (sscanf (val, "%d", &v_int) == 1) { + g_value_init (&v, G_TYPE_INT); + g_value_set_int (&v, v_int); + } + break; + } + case G_TYPE_UINT:{ + guint v_uint, count; + + if (strcmp (gst_tag, GST_TAG_TRACK_NUMBER) == 0) { + gint dummy; + + if (sscanf (val, "%u", &v_uint) == 1 && v_uint > 0) { + g_value_init (&v, G_TYPE_UINT); + g_value_set_uint (&v, v_uint); + } + GST_LOG ("checking for track count: %s", val); + /* might be 0/N or -1/N to specify that there is only a count */ + if (sscanf (val, "%d/%u", &dummy, &count) == 2 && count > 0) { + gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, + GST_TAG_TRACK_COUNT, count, NULL); + } + } else if (strcmp (gst_tag, GST_TAG_ALBUM_VOLUME_NUMBER) == 0) { + gint dummy; + + if (sscanf (val, "%u", &v_uint) == 1 && v_uint > 0) { + g_value_init (&v, G_TYPE_UINT); + g_value_set_uint (&v, v_uint); + } + GST_LOG ("checking for volume count: %s", val); + /* might be 0/N or -1/N to specify that there is only a count */ + if (sscanf (val, "%d/%u", &dummy, &count) == 2 && count > 0) { + gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, + GST_TAG_ALBUM_VOLUME_COUNT, count, NULL); + } + } else if (sscanf (val, "%u", &v_uint) == 1) { + g_value_init (&v, G_TYPE_UINT); + g_value_set_uint (&v, v_uint); + } + break; + } + case G_TYPE_STRING:{ + g_value_init (&v, G_TYPE_STRING); + g_value_set_string (&v, val); + break; + } + case G_TYPE_DOUBLE:{ + gdouble v_double; + gchar *endptr; + + /* floating point strings can be "4,123" or "4.123" depending on + * the locale. We need to be able to parse and read either version + * no matter what our current locale is */ + g_strdelimit (val, ",", '.'); + v_double = g_ascii_strtod (val, &endptr); + if (endptr != val) { + g_value_init (&v, G_TYPE_DOUBLE); + g_value_set_double (&v, v_double); + } + + break; + } + default:{ + if (gst_tag_type == GST_TYPE_DATE) { + gint v_int; + + if (sscanf (val, "%d", &v_int) == 1) { + GDate *date = g_date_new_dmy (1, 1, v_int); + + g_value_init (&v, GST_TYPE_DATE); + gst_value_set_date (&v, date); + g_date_free (date); + } + } else { + GST_WARNING ("Unhandled tag type '%s' for tag '%s'", + g_type_name (gst_tag_type), gst_tag); + } + break; + } + } + if (G_VALUE_TYPE (&v) != 0) { + gst_tag_list_add_values (taglist, GST_TAG_MERGE_APPEND, + gst_tag, &v, NULL); + g_value_unset (&v); + } + } + GST_DEBUG ("Read tag %s: %s", tag, val); + g_free (tag); + g_free (val); + + /* move data pointer */ + next_tag: + size -= len + n; + data += len + n; + } + + GST_DEBUG ("Taglist: %" GST_PTR_FORMAT, taglist); + return taglist; +} + +static gboolean +gst_ape_demux_identify_tag (GstTagDemux * demux, GstBuffer * buffer, + gboolean start_tag, guint * tag_size) +{ + if (memcmp (GST_BUFFER_DATA (buffer), "APETAGEX", 8) != 0) { + GST_DEBUG_OBJECT (demux, "No APETAGEX marker at %s - not an APE file", + (start_tag) ? "start" : "end"); + return FALSE; + } + + *tag_size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buffer) + 12); + + /* size is without header, so add 32 to account for that */ + *tag_size += 32; + + return TRUE; +} + +static GstTagDemuxResult +gst_ape_demux_parse_tag (GstTagDemux * demux, GstBuffer * buffer, + gboolean start_tag, guint * tag_size, GstTagList ** tags) +{ + const guint8 *data; + const guint8 *footer; + gboolean have_header; + gboolean end_tag = !start_tag; + GstCaps *sink_caps; + guint version, footer_size; + + GST_LOG_OBJECT (demux, "Parsing buffer of size %u", GST_BUFFER_SIZE (buffer)); + + data = GST_BUFFER_DATA (buffer); + footer = GST_BUFFER_DATA (buffer) + GST_BUFFER_SIZE (buffer) - 32; + + GST_LOG_OBJECT (demux, "Checking for footer at offset 0x%04x", + (guint) (footer - data)); + if (footer > data && memcmp (footer, "APETAGEX", 8) == 0) { + GST_DEBUG_OBJECT (demux, "Found footer"); + footer_size = 32; + } else { + GST_DEBUG_OBJECT (demux, "No footer"); + footer_size = 0; + } + + /* APE tags at the end must have a footer */ + if (end_tag && footer_size == 0) { + GST_WARNING_OBJECT (demux, "Tag at end of file without footer!"); + return GST_TAG_DEMUX_RESULT_BROKEN_TAG; + } + + /* don't trust the header/footer flags, better detect them ourselves */ + have_header = (memcmp (data, "APETAGEX", 8) == 0); + + if (start_tag && !have_header) { + GST_DEBUG_OBJECT (demux, "Tag at beginning of file without header!"); + return GST_TAG_DEMUX_RESULT_BROKEN_TAG; + } + + if (end_tag && !have_header) { + GST_DEBUG_OBJECT (demux, "Tag at end of file has no header (APEv1)"); + *tag_size -= 32; /* adjust tag size */ + } + + if (have_header) { + version = GST_READ_UINT32_LE (data + 8); + } else { + version = GST_READ_UINT32_LE (footer + 8); + } + + /* skip header */ + if (have_header) { + data += 32; + } + + GST_DEBUG_OBJECT (demux, "APE tag with version %u, size %u at offset 0x%08" + G_GINT64_MODIFIER "x", version, *tag_size, + GST_BUFFER_OFFSET (buffer) + ((have_header) ? 0 : 32)); + + if (APE_VERSION_MAJOR (version) != 1 && APE_VERSION_MAJOR (version) != 2) { + GST_WARNING ("APE tag is version %u.%03u, but decoder only supports " + "v1 or v2. Ignoring.", APE_VERSION_MAJOR (version), version % 1000); + return GST_TAG_DEMUX_RESULT_OK; + } + + *tags = ape_demux_parse_tags (data, *tag_size - footer_size); + + sink_caps = gst_static_pad_template_get_caps (&sink_factory); + gst_pb_utils_add_codec_description_to_tag_list (*tags, + GST_TAG_CONTAINER_FORMAT, sink_caps); + gst_caps_unref (sink_caps); + + return GST_TAG_DEMUX_RESULT_OK; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "apedemux", + GST_RANK_PRIMARY, GST_TYPE_APE_DEMUX); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "apetag", + "APEv1/2 tag reader", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/apetag/gstapedemux.h b/gst/apetag/gstapedemux.h new file mode 100644 index 0000000..3378e5b --- /dev/null +++ b/gst/apetag/gstapedemux.h @@ -0,0 +1,52 @@ +/* GStreamer APEv1/2 tag reader + * Copyright (C) 2004 Ronald Bultje + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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_APE_DEMUX_H__ +#define __GST_APE_DEMUX_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_APE_DEMUX (gst_ape_demux_get_type()) +#define GST_APE_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_APE_DEMUX,GstApeDemux)) +#define GST_APE_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_APE_DEMUX,GstApeDemuxClass)) +#define GST_IS_APE_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_APE_DEMUX)) +#define GST_IS_APE_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_APE_DEMUX)) + +typedef struct _GstApeDemux GstApeDemux; +typedef struct _GstApeDemuxClass GstApeDemuxClass; + +struct _GstApeDemux +{ + GstTagDemux tagdemux; +}; + +struct _GstApeDemuxClass +{ + GstTagDemuxClass parent_class; +}; + +GType gst_ape_demux_get_type (void); + +G_END_DECLS + +#endif /* __GST_APE_DEMUX_H__ */ + diff --git a/gst/audiofx/Makefile.am b/gst/audiofx/Makefile.am new file mode 100644 index 0000000..c943e20 --- /dev/null +++ b/gst/audiofx/Makefile.am @@ -0,0 +1,66 @@ +# plugindir is set in configure + +plugin_LTLIBRARIES = libgstaudiofx.la + +# sources used to compile this plug-in +libgstaudiofx_la_SOURCES = audiofx.c\ + audiopanorama.c \ + audioinvert.c \ + audioamplify.c \ + audiodynamic.c \ + audiokaraoke.c \ + audiofxbaseiirfilter.c \ + audiocheblimit.c \ + audiochebband.c \ + audioiirfilter.c \ + audiofxbasefirfilter.c \ + audiowsincband.c \ + audiowsinclimit.c \ + audiofirfilter.c \ + audioecho.c + +# flags used to compile this plugin +libgstaudiofx_la_CFLAGS = $(GST_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) +libgstaudiofx_la_LIBADD = $(GST_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_CONTROLLER_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-$(GST_MAJORMINOR) \ + -lgstfft-$(GST_MAJORMINOR) \ + $(LIBM) +libgstaudiofx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstaudiofx_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = audiopanorama.h \ + audioinvert.h \ + audioamplify.h \ + audiodynamic.h \ + audiokaraoke.h \ + audiofxbaseiirfilter.h \ + audiocheblimit.h \ + audiochebband.h \ + audioiirfilter.h \ + audiofxbasefirfilter.h \ + audiowsincband.h \ + audiowsinclimit.h \ + audiofirfilter.h \ + audioecho.h \ + math_compat.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstaudiofx -:SHARED libgstaudiofx \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstaudiofx_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudiofx_la_CFLAGS) \ + -:LDFLAGS $(libgstaudiofx_la_LDFLAGS) \ + $(libgstaudiofx_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/audiofx/Makefile.in b/gst/audiofx/Makefile.in new file mode 100644 index 0000000..6bccb89 --- /dev/null +++ b/gst/audiofx/Makefile.in @@ -0,0 +1,995 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# plugindir is set in configure + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/audiofx +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstaudiofx_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstaudiofx_la_OBJECTS = libgstaudiofx_la-audiofx.lo \ + libgstaudiofx_la-audiopanorama.lo \ + libgstaudiofx_la-audioinvert.lo \ + libgstaudiofx_la-audioamplify.lo \ + libgstaudiofx_la-audiodynamic.lo \ + libgstaudiofx_la-audiokaraoke.lo \ + libgstaudiofx_la-audiofxbaseiirfilter.lo \ + libgstaudiofx_la-audiocheblimit.lo \ + libgstaudiofx_la-audiochebband.lo \ + libgstaudiofx_la-audioiirfilter.lo \ + libgstaudiofx_la-audiofxbasefirfilter.lo \ + libgstaudiofx_la-audiowsincband.lo \ + libgstaudiofx_la-audiowsinclimit.lo \ + libgstaudiofx_la-audiofirfilter.lo \ + libgstaudiofx_la-audioecho.lo +libgstaudiofx_la_OBJECTS = $(am_libgstaudiofx_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstaudiofx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) \ + $(libgstaudiofx_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstaudiofx_la_SOURCES) +DIST_SOURCES = $(libgstaudiofx_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstaudiofx.la + +# sources used to compile this plug-in +libgstaudiofx_la_SOURCES = audiofx.c\ + audiopanorama.c \ + audioinvert.c \ + audioamplify.c \ + audiodynamic.c \ + audiokaraoke.c \ + audiofxbaseiirfilter.c \ + audiocheblimit.c \ + audiochebband.c \ + audioiirfilter.c \ + audiofxbasefirfilter.c \ + audiowsincband.c \ + audiowsinclimit.c \ + audiofirfilter.c \ + audioecho.c + + +# flags used to compile this plugin +libgstaudiofx_la_CFLAGS = $(GST_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) + +libgstaudiofx_la_LIBADD = $(GST_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_CONTROLLER_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-$(GST_MAJORMINOR) \ + -lgstfft-$(GST_MAJORMINOR) \ + $(LIBM) + +libgstaudiofx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstaudiofx_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = audiopanorama.h \ + audioinvert.h \ + audioamplify.h \ + audiodynamic.h \ + audiokaraoke.h \ + audiofxbaseiirfilter.h \ + audiocheblimit.h \ + audiochebband.h \ + audioiirfilter.h \ + audiofxbasefirfilter.h \ + audiowsincband.h \ + audiowsinclimit.h \ + audiofirfilter.h \ + audioecho.h \ + math_compat.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/audiofx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/audiofx/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstaudiofx.la: $(libgstaudiofx_la_OBJECTS) $(libgstaudiofx_la_DEPENDENCIES) $(EXTRA_libgstaudiofx_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstaudiofx_la_LINK) -rpath $(plugindir) $(libgstaudiofx_la_OBJECTS) $(libgstaudiofx_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audioamplify.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiochebband.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiocheblimit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiodynamic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audioecho.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiofirfilter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiofx.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiofxbasefirfilter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiofxbaseiirfilter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audioiirfilter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audioinvert.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiokaraoke.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiopanorama.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiowsincband.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiowsinclimit.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstaudiofx_la-audiofx.lo: audiofx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiofx.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiofx.Tpo -c -o libgstaudiofx_la-audiofx.lo `test -f 'audiofx.c' || echo '$(srcdir)/'`audiofx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiofx.Tpo $(DEPDIR)/libgstaudiofx_la-audiofx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiofx.c' object='libgstaudiofx_la-audiofx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiofx.lo `test -f 'audiofx.c' || echo '$(srcdir)/'`audiofx.c + +libgstaudiofx_la-audiopanorama.lo: audiopanorama.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiopanorama.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiopanorama.Tpo -c -o libgstaudiofx_la-audiopanorama.lo `test -f 'audiopanorama.c' || echo '$(srcdir)/'`audiopanorama.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiopanorama.Tpo $(DEPDIR)/libgstaudiofx_la-audiopanorama.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiopanorama.c' object='libgstaudiofx_la-audiopanorama.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiopanorama.lo `test -f 'audiopanorama.c' || echo '$(srcdir)/'`audiopanorama.c + +libgstaudiofx_la-audioinvert.lo: audioinvert.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audioinvert.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audioinvert.Tpo -c -o libgstaudiofx_la-audioinvert.lo `test -f 'audioinvert.c' || echo '$(srcdir)/'`audioinvert.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audioinvert.Tpo $(DEPDIR)/libgstaudiofx_la-audioinvert.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audioinvert.c' object='libgstaudiofx_la-audioinvert.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audioinvert.lo `test -f 'audioinvert.c' || echo '$(srcdir)/'`audioinvert.c + +libgstaudiofx_la-audioamplify.lo: audioamplify.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audioamplify.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audioamplify.Tpo -c -o libgstaudiofx_la-audioamplify.lo `test -f 'audioamplify.c' || echo '$(srcdir)/'`audioamplify.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audioamplify.Tpo $(DEPDIR)/libgstaudiofx_la-audioamplify.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audioamplify.c' object='libgstaudiofx_la-audioamplify.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audioamplify.lo `test -f 'audioamplify.c' || echo '$(srcdir)/'`audioamplify.c + +libgstaudiofx_la-audiodynamic.lo: audiodynamic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiodynamic.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiodynamic.Tpo -c -o libgstaudiofx_la-audiodynamic.lo `test -f 'audiodynamic.c' || echo '$(srcdir)/'`audiodynamic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiodynamic.Tpo $(DEPDIR)/libgstaudiofx_la-audiodynamic.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiodynamic.c' object='libgstaudiofx_la-audiodynamic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiodynamic.lo `test -f 'audiodynamic.c' || echo '$(srcdir)/'`audiodynamic.c + +libgstaudiofx_la-audiokaraoke.lo: audiokaraoke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiokaraoke.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiokaraoke.Tpo -c -o libgstaudiofx_la-audiokaraoke.lo `test -f 'audiokaraoke.c' || echo '$(srcdir)/'`audiokaraoke.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiokaraoke.Tpo $(DEPDIR)/libgstaudiofx_la-audiokaraoke.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiokaraoke.c' object='libgstaudiofx_la-audiokaraoke.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiokaraoke.lo `test -f 'audiokaraoke.c' || echo '$(srcdir)/'`audiokaraoke.c + +libgstaudiofx_la-audiofxbaseiirfilter.lo: audiofxbaseiirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiofxbaseiirfilter.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiofxbaseiirfilter.Tpo -c -o libgstaudiofx_la-audiofxbaseiirfilter.lo `test -f 'audiofxbaseiirfilter.c' || echo '$(srcdir)/'`audiofxbaseiirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiofxbaseiirfilter.Tpo $(DEPDIR)/libgstaudiofx_la-audiofxbaseiirfilter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiofxbaseiirfilter.c' object='libgstaudiofx_la-audiofxbaseiirfilter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiofxbaseiirfilter.lo `test -f 'audiofxbaseiirfilter.c' || echo '$(srcdir)/'`audiofxbaseiirfilter.c + +libgstaudiofx_la-audiocheblimit.lo: audiocheblimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiocheblimit.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiocheblimit.Tpo -c -o libgstaudiofx_la-audiocheblimit.lo `test -f 'audiocheblimit.c' || echo '$(srcdir)/'`audiocheblimit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiocheblimit.Tpo $(DEPDIR)/libgstaudiofx_la-audiocheblimit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiocheblimit.c' object='libgstaudiofx_la-audiocheblimit.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiocheblimit.lo `test -f 'audiocheblimit.c' || echo '$(srcdir)/'`audiocheblimit.c + +libgstaudiofx_la-audiochebband.lo: audiochebband.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiochebband.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiochebband.Tpo -c -o libgstaudiofx_la-audiochebband.lo `test -f 'audiochebband.c' || echo '$(srcdir)/'`audiochebband.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiochebband.Tpo $(DEPDIR)/libgstaudiofx_la-audiochebband.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiochebband.c' object='libgstaudiofx_la-audiochebband.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiochebband.lo `test -f 'audiochebband.c' || echo '$(srcdir)/'`audiochebband.c + +libgstaudiofx_la-audioiirfilter.lo: audioiirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audioiirfilter.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audioiirfilter.Tpo -c -o libgstaudiofx_la-audioiirfilter.lo `test -f 'audioiirfilter.c' || echo '$(srcdir)/'`audioiirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audioiirfilter.Tpo $(DEPDIR)/libgstaudiofx_la-audioiirfilter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audioiirfilter.c' object='libgstaudiofx_la-audioiirfilter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audioiirfilter.lo `test -f 'audioiirfilter.c' || echo '$(srcdir)/'`audioiirfilter.c + +libgstaudiofx_la-audiofxbasefirfilter.lo: audiofxbasefirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiofxbasefirfilter.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiofxbasefirfilter.Tpo -c -o libgstaudiofx_la-audiofxbasefirfilter.lo `test -f 'audiofxbasefirfilter.c' || echo '$(srcdir)/'`audiofxbasefirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiofxbasefirfilter.Tpo $(DEPDIR)/libgstaudiofx_la-audiofxbasefirfilter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiofxbasefirfilter.c' object='libgstaudiofx_la-audiofxbasefirfilter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiofxbasefirfilter.lo `test -f 'audiofxbasefirfilter.c' || echo '$(srcdir)/'`audiofxbasefirfilter.c + +libgstaudiofx_la-audiowsincband.lo: audiowsincband.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiowsincband.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiowsincband.Tpo -c -o libgstaudiofx_la-audiowsincband.lo `test -f 'audiowsincband.c' || echo '$(srcdir)/'`audiowsincband.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiowsincband.Tpo $(DEPDIR)/libgstaudiofx_la-audiowsincband.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiowsincband.c' object='libgstaudiofx_la-audiowsincband.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiowsincband.lo `test -f 'audiowsincband.c' || echo '$(srcdir)/'`audiowsincband.c + +libgstaudiofx_la-audiowsinclimit.lo: audiowsinclimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiowsinclimit.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiowsinclimit.Tpo -c -o libgstaudiofx_la-audiowsinclimit.lo `test -f 'audiowsinclimit.c' || echo '$(srcdir)/'`audiowsinclimit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiowsinclimit.Tpo $(DEPDIR)/libgstaudiofx_la-audiowsinclimit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiowsinclimit.c' object='libgstaudiofx_la-audiowsinclimit.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiowsinclimit.lo `test -f 'audiowsinclimit.c' || echo '$(srcdir)/'`audiowsinclimit.c + +libgstaudiofx_la-audiofirfilter.lo: audiofirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiofirfilter.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiofirfilter.Tpo -c -o libgstaudiofx_la-audiofirfilter.lo `test -f 'audiofirfilter.c' || echo '$(srcdir)/'`audiofirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiofirfilter.Tpo $(DEPDIR)/libgstaudiofx_la-audiofirfilter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiofirfilter.c' object='libgstaudiofx_la-audiofirfilter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiofirfilter.lo `test -f 'audiofirfilter.c' || echo '$(srcdir)/'`audiofirfilter.c + +libgstaudiofx_la-audioecho.lo: audioecho.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audioecho.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audioecho.Tpo -c -o libgstaudiofx_la-audioecho.lo `test -f 'audioecho.c' || echo '$(srcdir)/'`audioecho.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audioecho.Tpo $(DEPDIR)/libgstaudiofx_la-audioecho.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audioecho.c' object='libgstaudiofx_la-audioecho.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audioecho.lo `test -f 'audioecho.c' || echo '$(srcdir)/'`audioecho.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstaudiofx -:SHARED libgstaudiofx \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstaudiofx_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudiofx_la_CFLAGS) \ + -:LDFLAGS $(libgstaudiofx_la_LDFLAGS) \ + $(libgstaudiofx_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/audiofx/audioamplify.c b/gst/audiofx/audioamplify.c new file mode 100644 index 0000000..5316c96 --- /dev/null +++ b/gst/audiofx/audioamplify.c @@ -0,0 +1,504 @@ +/* + * GStreamer + * Copyright (C) 2007 Sebastian Dröge + * Copyright (C) 2006 Stefan Kost + * + * 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-audioamplify + * + * Amplifies an audio stream by a given factor and allows the selection of different clipping modes. + * The difference between the clipping modes is best evaluated by testing. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc wave=saw ! audioamplify amplification=1.5 ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audioamplify amplification=1.5 method=wrap-negative ! alsasink + * gst-launch audiotestsrc wave=saw ! audioconvert ! audioamplify amplification=1.5 method=wrap-positive ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "audioamplify.h" + +#define GST_CAT_DEFAULT gst_audio_amplify_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_AMPLIFICATION, + PROP_CLIPPING_METHOD +}; + +enum +{ + METHOD_CLIP = 0, + METHOD_WRAP_NEGATIVE, + METHOD_WRAP_POSITIVE, + METHOD_NOCLIP, + NUM_METHODS +}; + +#define GST_TYPE_AUDIO_AMPLIFY_CLIPPING_METHOD (gst_audio_amplify_clipping_method_get_type ()) +static GType +gst_audio_amplify_clipping_method_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {METHOD_CLIP, "Normal clipping (default)", "clip"}, + {METHOD_WRAP_NEGATIVE, + "Push overdriven values back from the opposite side", + "wrap-negative"}, + {METHOD_WRAP_POSITIVE, "Push overdriven values back from the same side", + "wrap-positive"}, + {METHOD_NOCLIP, "No clipping", "none"}, + {0, NULL, NULL} + }; + + /* FIXME 0.11: rename to GstAudioAmplifyClippingMethod */ + gtype = g_enum_register_static ("GstAudioPanoramaClippingMethod", values); + } + return gtype; +} + +#define ALLOWED_CAPS \ + "audio/x-raw-int," \ + " depth=(int)8," \ + " width=(int)8," \ + " endianness=(int)BYTE_ORDER," \ + " signed=(bool)TRUE," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]; " \ + "audio/x-raw-int," \ + " depth=(int)16," \ + " width=(int)16," \ + " endianness=(int)BYTE_ORDER," \ + " signed=(bool)TRUE," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]; " \ + "audio/x-raw-int," \ + " depth=(int)32," \ + " width=(int)32," \ + " endianness=(int)BYTE_ORDER," \ + " signed=(bool)TRUE," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]; " \ + "audio/x-raw-float," \ + " width=(int){32,64}," \ + " endianness=(int)BYTE_ORDER," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]" + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_amplify_debug, "audioamplify", 0, "audioamplify element"); + +GST_BOILERPLATE_FULL (GstAudioAmplify, gst_audio_amplify, GstAudioFilter, + GST_TYPE_AUDIO_FILTER, DEBUG_INIT); + +static gboolean gst_audio_amplify_set_process_function (GstAudioAmplify * + filter, gint clipping, gint format, gint width); +static void gst_audio_amplify_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_amplify_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_audio_amplify_setup (GstAudioFilter * filter, + GstRingBufferSpec * format); +static GstFlowReturn gst_audio_amplify_transform_ip (GstBaseTransform * base, + GstBuffer * buf); + +#define MIN_gint8 G_MININT8 +#define MAX_gint8 G_MAXINT8 +#define MIN_gint16 G_MININT16 +#define MAX_gint16 G_MAXINT16 +#define MIN_gint32 G_MININT32 +#define MAX_gint32 G_MAXINT32 + +#define MAKE_INT_FUNCS(type,largetype) \ +static void \ +gst_audio_amplify_transform_##type##_clip (GstAudioAmplify * filter, \ + void * data, guint num_samples) \ +{ \ + type *d = data; \ + \ + while (num_samples--) { \ + largetype val = *d * filter->amplification; \ + *d++ = CLAMP (val, MIN_##type, MAX_##type); \ + } \ +} \ +static void \ +gst_audio_amplify_transform_##type##_wrap_negative (GstAudioAmplify * filter, \ + void * data, guint num_samples) \ +{ \ + type *d = data; \ + \ + while (num_samples--) { \ + largetype val = *d * filter->amplification; \ + if (val > MAX_##type) \ + val = MIN_##type + (val - MIN_##type) % ((largetype) MAX_##type + 1 - \ + MIN_##type); \ + else if (val < MIN_##type) \ + val = MAX_##type - (MAX_##type - val) % ((largetype) MAX_##type + 1 - \ + MIN_##type); \ + *d++ = val; \ + } \ +} \ +static void \ +gst_audio_amplify_transform_##type##_wrap_positive (GstAudioAmplify * filter, \ + void * data, guint num_samples) \ +{ \ + type *d = data; \ + \ + while (num_samples--) { \ + largetype val = *d * filter->amplification; \ + do { \ + if (val > MAX_##type) \ + val = MAX_##type - (val - MAX_##type); \ + else if (val < MIN_##type) \ + val = MIN_##type + (MIN_##type - val); \ + else \ + break; \ + } while (1); \ + *d++ = val; \ + } \ +} \ +static void \ +gst_audio_amplify_transform_##type##_noclip (GstAudioAmplify * filter, \ + void * data, guint num_samples) \ +{ \ + type *d = data; \ + \ + while (num_samples--) \ + *d++ *= filter->amplification; \ +} + +#define MAKE_FLOAT_FUNCS(type) \ +static void \ +gst_audio_amplify_transform_##type##_clip (GstAudioAmplify * filter, \ + void * data, guint num_samples) \ +{ \ + type *d = data; \ + \ + while (num_samples--) { \ + type val = *d* filter->amplification; \ + *d++ = CLAMP (val, -1.0, +1.0); \ + } \ +} \ +static void \ +gst_audio_amplify_transform_##type##_wrap_negative (GstAudioAmplify * \ + filter, void * data, guint num_samples) \ +{ \ + type *d = data; \ + \ + while (num_samples--) { \ + type val = *d * filter->amplification; \ + do { \ + if (val > 1.0) \ + val = -1.0 + (val - 1.0); \ + else if (val < -1.0) \ + val = 1.0 - (1.0 - val); \ + else \ + break; \ + } while (1); \ + *d++ = val; \ + } \ +} \ +static void \ +gst_audio_amplify_transform_##type##_wrap_positive (GstAudioAmplify * filter, \ + void * data, guint num_samples) \ +{ \ + type *d = data; \ + \ + while (num_samples--) { \ + type val = *d* filter->amplification; \ + do { \ + if (val > 1.0) \ + val = 1.0 - (val - 1.0); \ + else if (val < -1.0) \ + val = -1.0 + (-1.0 - val); \ + else \ + break; \ + } while (1); \ + *d++ = val; \ + } \ +} \ +static void \ +gst_audio_amplify_transform_##type##_noclip (GstAudioAmplify * filter, \ + void * data, guint num_samples) \ +{ \ + type *d = data; \ + \ + while (num_samples--) \ + *d++ *= filter->amplification; \ +} + +/* *INDENT-OFF* */ +MAKE_INT_FUNCS (gint8,gint) +MAKE_INT_FUNCS (gint16,gint) +MAKE_INT_FUNCS (gint32,gint64) +MAKE_FLOAT_FUNCS (gfloat) +MAKE_FLOAT_FUNCS (gdouble) +/* *INDENT-ON* */ + +/* GObject vmethod implementations */ + +static void +gst_audio_amplify_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstCaps *caps; + + gst_element_class_set_details_simple (element_class, "Audio amplifier", + "Filter/Effect/Audio", + "Amplifies an audio stream by a given factor", + "Sebastian Dröge "); + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), + caps); + gst_caps_unref (caps); +} + +static void +gst_audio_amplify_class_init (GstAudioAmplifyClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + gobject_class->set_property = gst_audio_amplify_set_property; + gobject_class->get_property = gst_audio_amplify_get_property; + + g_object_class_install_property (gobject_class, PROP_AMPLIFICATION, + g_param_spec_float ("amplification", "Amplification", + "Factor of amplification", -G_MAXFLOAT, G_MAXFLOAT, + 1.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GstAudioAmplify:clipping-method + * + * Clipping method: clip mode set values higher than the maximum to the + * maximum. The wrap-negative mode pushes those values back from the + * opposite side, wrap-positive pushes them back from the same side. + * + **/ + g_object_class_install_property (gobject_class, PROP_CLIPPING_METHOD, + g_param_spec_enum ("clipping-method", "Clipping method", + "Selects how to handle values higher than the maximum", + GST_TYPE_AUDIO_AMPLIFY_CLIPPING_METHOD, METHOD_CLIP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_AUDIO_FILTER_CLASS (klass)->setup = + GST_DEBUG_FUNCPTR (gst_audio_amplify_setup); + GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = + GST_DEBUG_FUNCPTR (gst_audio_amplify_transform_ip); +} + +static void +gst_audio_amplify_init (GstAudioAmplify * filter, GstAudioAmplifyClass * klass) +{ + filter->amplification = 1.0; + gst_audio_amplify_set_process_function (filter, METHOD_CLIP, + GST_BUFTYPE_LINEAR, 16); + gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); + gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); +} + +static GstAudioAmplifyProcessFunc +gst_audio_amplify_process_function (gint clipping, gint format, gint width) +{ + static const struct process + { + gint format; + gint width; + gint clipping; + GstAudioAmplifyProcessFunc func; + } process[] = { + { + GST_BUFTYPE_FLOAT, 32, METHOD_CLIP, + gst_audio_amplify_transform_gfloat_clip}, { + GST_BUFTYPE_FLOAT, 32, METHOD_WRAP_NEGATIVE, + gst_audio_amplify_transform_gfloat_wrap_negative}, { + GST_BUFTYPE_FLOAT, 32, METHOD_WRAP_POSITIVE, + gst_audio_amplify_transform_gfloat_wrap_positive}, { + GST_BUFTYPE_FLOAT, 32, METHOD_NOCLIP, + gst_audio_amplify_transform_gfloat_noclip}, { + GST_BUFTYPE_FLOAT, 64, METHOD_CLIP, + gst_audio_amplify_transform_gdouble_clip}, { + GST_BUFTYPE_FLOAT, 64, METHOD_WRAP_NEGATIVE, + gst_audio_amplify_transform_gdouble_wrap_negative}, { + GST_BUFTYPE_FLOAT, 64, METHOD_WRAP_POSITIVE, + gst_audio_amplify_transform_gdouble_wrap_positive}, { + GST_BUFTYPE_FLOAT, 64, METHOD_NOCLIP, + gst_audio_amplify_transform_gdouble_noclip}, { + GST_BUFTYPE_LINEAR, 8, METHOD_CLIP, gst_audio_amplify_transform_gint8_clip}, { + GST_BUFTYPE_LINEAR, 8, METHOD_WRAP_NEGATIVE, + gst_audio_amplify_transform_gint8_wrap_negative}, { + GST_BUFTYPE_LINEAR, 8, METHOD_WRAP_POSITIVE, + gst_audio_amplify_transform_gint8_wrap_positive}, { + GST_BUFTYPE_LINEAR, 8, METHOD_NOCLIP, + gst_audio_amplify_transform_gint8_noclip}, { + GST_BUFTYPE_LINEAR, 16, METHOD_CLIP, + gst_audio_amplify_transform_gint16_clip}, { + GST_BUFTYPE_LINEAR, 16, METHOD_WRAP_NEGATIVE, + gst_audio_amplify_transform_gint16_wrap_negative}, { + GST_BUFTYPE_LINEAR, 16, METHOD_WRAP_POSITIVE, + gst_audio_amplify_transform_gint16_wrap_positive}, { + GST_BUFTYPE_LINEAR, 16, METHOD_NOCLIP, + gst_audio_amplify_transform_gint16_noclip}, { + GST_BUFTYPE_LINEAR, 32, METHOD_CLIP, + gst_audio_amplify_transform_gint32_clip}, { + GST_BUFTYPE_LINEAR, 32, METHOD_WRAP_NEGATIVE, + gst_audio_amplify_transform_gint32_wrap_negative}, { + GST_BUFTYPE_LINEAR, 32, METHOD_WRAP_POSITIVE, + gst_audio_amplify_transform_gint32_wrap_positive}, { + GST_BUFTYPE_LINEAR, 32, METHOD_NOCLIP, + gst_audio_amplify_transform_gint32_noclip}, { + 0, 0, 0, NULL} + }; + const struct process *p; + + for (p = process; p->func; p++) + if (p->format == format && p->width == width && p->clipping == clipping) + return p->func; + return NULL; +} + +static gboolean +gst_audio_amplify_set_process_function (GstAudioAmplify * filter, gint + clipping_method, gint format, gint width) +{ + GstAudioAmplifyProcessFunc process; + + /* set processing function */ + + process = gst_audio_amplify_process_function (clipping_method, format, width); + if (!process) { + GST_DEBUG ("wrong format"); + return FALSE; + } + + filter->process = process; + filter->clipping_method = clipping_method; + filter->format = format; + filter->width = width; + + return TRUE; +} + +static void +gst_audio_amplify_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioAmplify *filter = GST_AUDIO_AMPLIFY (object); + + switch (prop_id) { + case PROP_AMPLIFICATION: + filter->amplification = g_value_get_float (value); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), + filter->amplification == 1.0); + break; + case PROP_CLIPPING_METHOD: + gst_audio_amplify_set_process_function (filter, g_value_get_enum (value), + filter->format, filter->width); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_amplify_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioAmplify *filter = GST_AUDIO_AMPLIFY (object); + + switch (prop_id) { + case PROP_AMPLIFICATION: + g_value_set_float (value, filter->amplification); + break; + case PROP_CLIPPING_METHOD: + g_value_set_enum (value, filter->clipping_method); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstAudioFilter vmethod implementations */ +static gboolean +gst_audio_amplify_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioAmplify *filter = GST_AUDIO_AMPLIFY (base); + + return gst_audio_amplify_set_process_function (filter, + filter->clipping_method, format->type, format->width); +} + +/* GstBaseTransform vmethod implementations */ +static GstFlowReturn +gst_audio_amplify_transform_ip (GstBaseTransform * base, GstBuffer * buf) +{ + GstAudioAmplify *filter = GST_AUDIO_AMPLIFY (base); + guint num_samples; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + num_samples = + GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); + + if (gst_base_transform_is_passthrough (base) || + G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) + return GST_FLOW_OK; + + filter->process (filter, GST_BUFFER_DATA (buf), num_samples); + + return GST_FLOW_OK; +} diff --git a/gst/audiofx/audioamplify.h b/gst/audiofx/audioamplify.h new file mode 100644 index 0000000..b28f38b --- /dev/null +++ b/gst/audiofx/audioamplify.h @@ -0,0 +1,63 @@ +/* + * GStreamer + * Copyright (C) 2007 Sebastian Dröge + * Copyright (C) 2006 Stefan Kost + * + * 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_AUDIO_AMPLIFY_H__ +#define __GST_AUDIO_AMPLIFY_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_AUDIO_AMPLIFY (gst_audio_amplify_get_type()) +#define GST_AUDIO_AMPLIFY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_AMPLIFY,GstAudioAmplify)) +#define GST_IS_AUDIO_AMPLIFY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_AMPLIFY)) +#define GST_AUDIO_AMPLIFY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_AMPLIFY,GstAudioAmplifyClass)) +#define GST_IS_AUDIO_AMPLIFY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_AMPLIFY)) +#define GST_AUDIO_AMPLIFY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_AMPLIFY,GstAudioAmplifyClass)) +typedef struct _GstAudioAmplify GstAudioAmplify; +typedef struct _GstAudioAmplifyClass GstAudioAmplifyClass; + +typedef void (*GstAudioAmplifyProcessFunc) (GstAudioAmplify *, void *, guint); + +struct _GstAudioAmplify +{ + GstAudioFilter audiofilter; + + gfloat amplification; + + /* < private > */ + GstAudioAmplifyProcessFunc process; + gint clipping_method; + gint format; + gint width; +}; + +struct _GstAudioAmplifyClass +{ + GstAudioFilterClass parent; +}; + +GType gst_audio_amplify_get_type (void); + +G_END_DECLS +#endif /* __GST_AUDIO_AMPLIFY_H__ */ diff --git a/gst/audiofx/audiochebband.c b/gst/audiofx/audiochebband.c new file mode 100644 index 0000000..08c1acf --- /dev/null +++ b/gst/audiofx/audiochebband.c @@ -0,0 +1,668 @@ +/* + * GStreamer + * Copyright (C) 2007-2009 Sebastian Dröge + * + * 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. + */ + +/* + * Chebyshev type 1 filter design based on + * "The Scientist and Engineer's Guide to DSP", Chapter 20. + * http://www.dspguide.com/ + * + * For type 2 and Chebyshev filters in general read + * http://en.wikipedia.org/wiki/Chebyshev_filter + * + * Transformation from lowpass to bandpass/bandreject: + * http://docs.dewresearch.com/DspHelp/html/IDH_LinearSystems_LowpassToBandPassZ.htm + * http://docs.dewresearch.com/DspHelp/html/IDH_LinearSystems_LowpassToBandStopZ.htm + * + */ + +/** + * SECTION:element-audiochebband + * + * Attenuates all frequencies outside (bandpass) or inside (bandreject) of a frequency + * band. The number of poles and the ripple parameter control the rolloff. + * + * This element has the advantage over the windowed sinc bandpass and bandreject filter that it is + * much faster and produces almost as good results. It's only disadvantages are the highly + * non-linear phase and the slower rolloff compared to a windowed sinc filter with a large kernel. + * + * For type 1 the ripple parameter specifies how much ripple in dB is allowed in the passband, i.e. + * some frequencies in the passband will be amplified by that value. A higher ripple value will allow + * a faster rolloff. + * + * For type 2 the ripple parameter specifies the stopband attenuation. In the stopband the gain will + * be at most this value. A lower ripple value will allow a faster rolloff. + * + * As a special case, a Chebyshev type 1 filter with no ripple is a Butterworth filter. + * + * + * Be warned that a too large number of poles can produce noise. The most poles are possible with + * a cutoff frequency at a quarter of the sampling rate. + * + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiochebband mode=band-pass lower-frequency=1000 upper-frequenc=6000 poles=4 ! audioconvert ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiochebband mode=band-reject lower-frequency=1000 upper-frequency=4000 ripple=0.2 ! audioconvert ! alsasink + * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiochebband mode=band-pass lower-frequency=1000 upper-frequency=4000 type=2 ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include + +#include "math_compat.h" + +#include "audiochebband.h" + +#include "gst/glib-compat-private.h" + +#define GST_CAT_DEFAULT gst_audio_cheb_band_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + PROP_0, + PROP_MODE, + PROP_TYPE, + PROP_LOWER_FREQUENCY, + PROP_UPPER_FREQUENCY, + PROP_RIPPLE, + PROP_POLES +}; + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_cheb_band_debug, "audiochebband", 0, "audiochebband element"); + +GST_BOILERPLATE_FULL (GstAudioChebBand, gst_audio_cheb_band, + GstAudioFXBaseIIRFilter, GST_TYPE_AUDIO_FX_BASE_IIR_FILTER, DEBUG_INIT); + +static void gst_audio_cheb_band_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_audio_cheb_band_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_audio_cheb_band_finalize (GObject * object); + +static gboolean gst_audio_cheb_band_setup (GstAudioFilter * filter, + GstRingBufferSpec * format); + +enum +{ + MODE_BAND_PASS = 0, + MODE_BAND_REJECT +}; + +#define GST_TYPE_AUDIO_CHEBYSHEV_FREQ_BAND_MODE (gst_audio_cheb_band_mode_get_type ()) +static GType +gst_audio_cheb_band_mode_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {MODE_BAND_PASS, "Band pass (default)", + "band-pass"}, + {MODE_BAND_REJECT, "Band reject", + "band-reject"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioChebBandMode", values); + } + return gtype; +} + +/* GObject vmethod implementations */ + +static void +gst_audio_cheb_band_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (element_class, + "Band pass & band reject filter", "Filter/Effect/Audio", + "Chebyshev band pass and band reject filter", + "Sebastian Dröge "); +} + +static void +gst_audio_cheb_band_class_init (GstAudioChebBandClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; + + gobject_class->set_property = gst_audio_cheb_band_set_property; + gobject_class->get_property = gst_audio_cheb_band_get_property; + gobject_class->finalize = gst_audio_cheb_band_finalize; + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Low pass or high pass mode", GST_TYPE_AUDIO_CHEBYSHEV_FREQ_BAND_MODE, + MODE_BAND_PASS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_TYPE, + g_param_spec_int ("type", "Type", "Type of the chebychev filter", 1, 2, 1, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + /* FIXME: Don't use the complete possible range but restrict the upper boundary + * so automatically generated UIs can use a slider without */ + g_object_class_install_property (gobject_class, PROP_LOWER_FREQUENCY, + g_param_spec_float ("lower-frequency", "Lower frequency", + "Start frequency of the band (Hz)", 0.0, 100000.0, + 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_UPPER_FREQUENCY, + g_param_spec_float ("upper-frequency", "Upper frequency", + "Stop frequency of the band (Hz)", 0.0, 100000.0, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_RIPPLE, + g_param_spec_float ("ripple", "Ripple", "Amount of ripple (dB)", 0.0, + 200.0, 0.25, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + /* FIXME: What to do about this upper boundary? With a frequencies near + * rate/4 32 poles are completely possible, with frequencies very low + * or very high 16 poles already produces only noise */ + g_object_class_install_property (gobject_class, PROP_POLES, + g_param_spec_int ("poles", "Poles", + "Number of poles to use, will be rounded up to the next multiply of four", + 4, 32, 4, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_cheb_band_setup); +} + +static void +gst_audio_cheb_band_init (GstAudioChebBand * filter, + GstAudioChebBandClass * klass) +{ + filter->lower_frequency = filter->upper_frequency = 0.0; + filter->mode = MODE_BAND_PASS; + filter->type = 1; + filter->poles = 4; + filter->ripple = 0.25; + + filter->lock = g_mutex_new (); +} + +static void +generate_biquad_coefficients (GstAudioChebBand * filter, + gint p, gdouble * a0, gdouble * a1, gdouble * a2, gdouble * a3, + gdouble * a4, gdouble * b1, gdouble * b2, gdouble * b3, gdouble * b4) +{ + gint np = filter->poles / 2; + gdouble ripple = filter->ripple; + + /* pole location in s-plane */ + gdouble rp, ip; + + /* zero location in s-plane */ + gdouble iz = 0.0; + + /* transfer function coefficients for the z-plane */ + gdouble x0, x1, x2, y1, y2; + gint type = filter->type; + + /* Calculate pole location for lowpass at frequency 1 */ + { + gdouble angle = (G_PI / 2.0) * (2.0 * p - 1) / np; + + rp = -sin (angle); + ip = cos (angle); + } + + /* If we allow ripple, move the pole from the unit + * circle to an ellipse and keep cutoff at frequency 1 */ + if (ripple > 0 && type == 1) { + gdouble es, vx; + + es = sqrt (pow (10.0, ripple / 10.0) - 1.0); + + vx = (1.0 / np) * asinh (1.0 / es); + rp = rp * sinh (vx); + ip = ip * cosh (vx); + } else if (type == 2) { + gdouble es, vx; + + es = sqrt (pow (10.0, ripple / 10.0) - 1.0); + vx = (1.0 / np) * asinh (es); + rp = rp * sinh (vx); + ip = ip * cosh (vx); + } + + /* Calculate inverse of the pole location to move from + * type I to type II */ + if (type == 2) { + gdouble mag2 = rp * rp + ip * ip; + + rp /= mag2; + ip /= mag2; + } + + /* Calculate zero location for frequency 1 on the + * unit circle for type 2 */ + if (type == 2) { + gdouble angle = G_PI / (np * 2.0) + ((p - 1) * G_PI) / (np); + gdouble mag2; + + iz = cos (angle); + mag2 = iz * iz; + iz /= mag2; + } + + /* Convert from s-domain to z-domain by + * using the bilinear Z-transform, i.e. + * substitute s by (2/t)*((z-1)/(z+1)) + * with t = 2 * tan(0.5). + */ + if (type == 1) { + gdouble t, m, d; + + t = 2.0 * tan (0.5); + m = rp * rp + ip * ip; + d = 4.0 - 4.0 * rp * t + m * t * t; + + x0 = (t * t) / d; + x1 = 2.0 * x0; + x2 = x0; + y1 = (8.0 - 2.0 * m * t * t) / d; + y2 = (-4.0 - 4.0 * rp * t - m * t * t) / d; + } else { + gdouble t, m, d; + + t = 2.0 * tan (0.5); + m = rp * rp + ip * ip; + d = 4.0 - 4.0 * rp * t + m * t * t; + + x0 = (t * t * iz * iz + 4.0) / d; + x1 = (-8.0 + 2.0 * iz * iz * t * t) / d; + x2 = x0; + y1 = (8.0 - 2.0 * m * t * t) / d; + y2 = (-4.0 - 4.0 * rp * t - m * t * t) / d; + } + + /* Convert from lowpass at frequency 1 to either bandpass + * or band reject. + * + * For bandpass substitute z^(-1) with: + * + * -2 -1 + * -z + alpha * z - beta + * ---------------------------- + * -2 -1 + * beta * z - alpha * z + 1 + * + * alpha = (2*a*b)/(1+b) + * beta = (b-1)/(b+1) + * a = cos((w1 + w0)/2) / cos((w1 - w0)/2) + * b = tan(1/2) * cot((w1 - w0)/2) + * + * For bandreject substitute z^(-1) with: + * + * -2 -1 + * z - alpha * z + beta + * ---------------------------- + * -2 -1 + * beta * z - alpha * z + 1 + * + * alpha = (2*a)/(1+b) + * beta = (1-b)/(1+b) + * a = cos((w1 + w0)/2) / cos((w1 - w0)/2) + * b = tan(1/2) * tan((w1 - w0)/2) + * + */ + { + gdouble a, b, d; + gdouble alpha, beta; + gdouble w0 = + 2.0 * G_PI * (filter->lower_frequency / + GST_AUDIO_FILTER (filter)->format.rate); + gdouble w1 = + 2.0 * G_PI * (filter->upper_frequency / + GST_AUDIO_FILTER (filter)->format.rate); + + if (filter->mode == MODE_BAND_PASS) { + a = cos ((w1 + w0) / 2.0) / cos ((w1 - w0) / 2.0); + b = tan (1.0 / 2.0) / tan ((w1 - w0) / 2.0); + + alpha = (2.0 * a * b) / (1.0 + b); + beta = (b - 1.0) / (b + 1.0); + + d = 1.0 + beta * (y1 - beta * y2); + + *a0 = (x0 + beta * (-x1 + beta * x2)) / d; + *a1 = (alpha * (-2.0 * x0 + x1 + beta * x1 - 2.0 * beta * x2)) / d; + *a2 = + (-x1 - beta * beta * x1 + 2.0 * beta * (x0 + x2) + + alpha * alpha * (x0 - x1 + x2)) / d; + *a3 = (alpha * (x1 + beta * (-2.0 * x0 + x1) - 2.0 * x2)) / d; + *a4 = (beta * (beta * x0 - x1) + x2) / d; + *b1 = (alpha * (2.0 + y1 + beta * y1 - 2.0 * beta * y2)) / d; + *b2 = + (-y1 - beta * beta * y1 - alpha * alpha * (1.0 + y1 - y2) + + 2.0 * beta * (-1.0 + y2)) / d; + *b3 = (alpha * (y1 + beta * (2.0 + y1) - 2.0 * y2)) / d; + *b4 = (-beta * beta - beta * y1 + y2) / d; + } else { + a = cos ((w1 + w0) / 2.0) / cos ((w1 - w0) / 2.0); + b = tan (1.0 / 2.0) * tan ((w1 - w0) / 2.0); + + alpha = (2.0 * a) / (1.0 + b); + beta = (1.0 - b) / (1.0 + b); + + d = -1.0 + beta * (beta * y2 + y1); + + *a0 = (-x0 - beta * x1 - beta * beta * x2) / d; + *a1 = (alpha * (2.0 * x0 + x1 + beta * x1 + 2.0 * beta * x2)) / d; + *a2 = + (-x1 - beta * beta * x1 - 2.0 * beta * (x0 + x2) - + alpha * alpha * (x0 + x1 + x2)) / d; + *a3 = (alpha * (x1 + beta * (2.0 * x0 + x1) + 2.0 * x2)) / d; + *a4 = (-beta * beta * x0 - beta * x1 - x2) / d; + *b1 = (alpha * (-2.0 + y1 + beta * y1 + 2.0 * beta * y2)) / d; + *b2 = + -(y1 + beta * beta * y1 + 2.0 * beta * (-1.0 + y2) + + alpha * alpha * (-1.0 + y1 + y2)) / d; + *b3 = (alpha * (beta * (-2.0 + y1) + y1 + 2.0 * y2)) / d; + *b4 = -(-beta * beta + beta * y1 + y2) / d; + } + } +} + +static void +generate_coefficients (GstAudioChebBand * filter) +{ + if (GST_AUDIO_FILTER (filter)->format.rate == 0) { + gdouble *a = g_new0 (gdouble, 1); + + a[0] = 1.0; + gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER + (filter), a, 1, NULL, 0); + GST_LOG_OBJECT (filter, "rate was not set yet"); + return; + } + + if (filter->upper_frequency <= filter->lower_frequency) { + gdouble *a = g_new0 (gdouble, 1); + + a[0] = (filter->mode == MODE_BAND_PASS) ? 0.0 : 1.0; + gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER + (filter), a, 1, NULL, 0); + + GST_LOG_OBJECT (filter, "frequency band had no or negative dimension"); + return; + } + + if (filter->upper_frequency > GST_AUDIO_FILTER (filter)->format.rate / 2) { + filter->upper_frequency = GST_AUDIO_FILTER (filter)->format.rate / 2; + GST_LOG_OBJECT (filter, "clipped upper frequency to nyquist frequency"); + } + + if (filter->lower_frequency < 0.0) { + filter->lower_frequency = 0.0; + GST_LOG_OBJECT (filter, "clipped lower frequency to 0.0"); + } + + /* Calculate coefficients for the chebyshev filter */ + { + gint np = filter->poles; + gdouble *a, *b; + gint i, p; + + a = g_new0 (gdouble, np + 5); + b = g_new0 (gdouble, np + 5); + + /* Calculate transfer function coefficients */ + a[4] = 1.0; + b[4] = 1.0; + + for (p = 1; p <= np / 4; p++) { + gdouble a0, a1, a2, a3, a4, b1, b2, b3, b4; + gdouble *ta = g_new0 (gdouble, np + 5); + gdouble *tb = g_new0 (gdouble, np + 5); + + generate_biquad_coefficients (filter, p, &a0, &a1, &a2, &a3, &a4, &b1, + &b2, &b3, &b4); + + memcpy (ta, a, sizeof (gdouble) * (np + 5)); + memcpy (tb, b, sizeof (gdouble) * (np + 5)); + + /* add the new coefficients for the new two poles + * to the cascade by multiplication of the transfer + * functions */ + for (i = 4; i < np + 5; i++) { + a[i] = + a0 * ta[i] + a1 * ta[i - 1] + a2 * ta[i - 2] + a3 * ta[i - 3] + + a4 * ta[i - 4]; + b[i] = + tb[i] - b1 * tb[i - 1] - b2 * tb[i - 2] - b3 * tb[i - 3] - + b4 * tb[i - 4]; + } + g_free (ta); + g_free (tb); + } + + /* Move coefficients to the beginning of the array + * and multiply the b coefficients with -1 to move from + * the transfer function's coefficients to the difference + * equation's coefficients */ + b[4] = 0.0; + for (i = 0; i <= np; i++) { + a[i] = a[i + 4]; + b[i] = -b[i + 4]; + } + + /* Normalize to unity gain at frequency 0 and frequency + * 0.5 for bandreject and unity gain at band center frequency + * for bandpass */ + if (filter->mode == MODE_BAND_REJECT) { + /* gain is sqrt(H(0)*H(0.5)) */ + + gdouble gain1 = + gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, + 1.0, 0.0); + gdouble gain2 = + gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, + -1.0, 0.0); + + gain1 = sqrt (gain1 * gain2); + + for (i = 0; i <= np; i++) { + a[i] /= gain1; + } + } else { + /* gain is H(wc), wc = center frequency */ + + gdouble w1 = + 2.0 * G_PI * (filter->lower_frequency / + GST_AUDIO_FILTER (filter)->format.rate); + gdouble w2 = + 2.0 * G_PI * (filter->upper_frequency / + GST_AUDIO_FILTER (filter)->format.rate); + gdouble w0 = (w2 + w1) / 2.0; + gdouble zr = cos (w0), zi = sin (w0); + gdouble gain = + gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, zr, + zi); + + for (i = 0; i <= np; i++) { + a[i] /= gain; + } + } + + gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER + (filter), a, np + 1, b, np + 1); + + GST_LOG_OBJECT (filter, + "Generated IIR coefficients for the Chebyshev filter"); + GST_LOG_OBJECT (filter, + "mode: %s, type: %d, poles: %d, lower-frequency: %.2f Hz, upper-frequency: %.2f Hz, ripple: %.2f dB", + (filter->mode == MODE_BAND_PASS) ? "band-pass" : "band-reject", + filter->type, filter->poles, filter->lower_frequency, + filter->upper_frequency, filter->ripple); + + GST_LOG_OBJECT (filter, "%.2f dB gain @ 0Hz", + 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, + np + 1, 1.0, 0.0))); + { + gdouble w1 = + 2.0 * G_PI * (filter->lower_frequency / + GST_AUDIO_FILTER (filter)->format.rate); + gdouble w2 = + 2.0 * G_PI * (filter->upper_frequency / + GST_AUDIO_FILTER (filter)->format.rate); + gdouble w0 = (w2 + w1) / 2.0; + gdouble zr, zi; + + zr = cos (w1); + zi = sin (w1); + GST_LOG_OBJECT (filter, "%.2f dB gain @ %dHz", + 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, + b, np + 1, zr, zi)), (int) filter->lower_frequency); + zr = cos (w0); + zi = sin (w0); + GST_LOG_OBJECT (filter, "%.2f dB gain @ %dHz", + 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, + b, np + 1, zr, zi)), + (int) ((filter->lower_frequency + filter->upper_frequency) / 2.0)); + zr = cos (w2); + zi = sin (w2); + GST_LOG_OBJECT (filter, "%.2f dB gain @ %dHz", + 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, + b, np + 1, zr, zi)), (int) filter->upper_frequency); + } + GST_LOG_OBJECT (filter, "%.2f dB gain @ %dHz", + 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, + np + 1, -1.0, 0.0)), + GST_AUDIO_FILTER (filter)->format.rate / 2); + } +} + +static void +gst_audio_cheb_band_finalize (GObject * object) +{ + GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (object); + + g_mutex_free (filter->lock); + filter->lock = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_audio_cheb_band_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (object); + + switch (prop_id) { + case PROP_MODE: + g_mutex_lock (filter->lock); + filter->mode = g_value_get_enum (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_TYPE: + g_mutex_lock (filter->lock); + filter->type = g_value_get_int (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_LOWER_FREQUENCY: + g_mutex_lock (filter->lock); + filter->lower_frequency = g_value_get_float (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_UPPER_FREQUENCY: + g_mutex_lock (filter->lock); + filter->upper_frequency = g_value_get_float (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_RIPPLE: + g_mutex_lock (filter->lock); + filter->ripple = g_value_get_float (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_POLES: + g_mutex_lock (filter->lock); + filter->poles = GST_ROUND_UP_4 (g_value_get_int (value)); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_cheb_band_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, filter->mode); + break; + case PROP_TYPE: + g_value_set_int (value, filter->type); + break; + case PROP_LOWER_FREQUENCY: + g_value_set_float (value, filter->lower_frequency); + break; + case PROP_UPPER_FREQUENCY: + g_value_set_float (value, filter->upper_frequency); + break; + case PROP_RIPPLE: + g_value_set_float (value, filter->ripple); + break; + case PROP_POLES: + g_value_set_int (value, filter->poles); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstAudioFilter vmethod implementations */ + +static gboolean +gst_audio_cheb_band_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (base); + + generate_coefficients (filter); + + return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); +} diff --git a/gst/audiofx/audiochebband.h b/gst/audiofx/audiochebband.h new file mode 100644 index 0000000..3261032 --- /dev/null +++ b/gst/audiofx/audiochebband.h @@ -0,0 +1,64 @@ +/* + * GStreamer + * Copyright (C) 2007-2009 Sebastian Dröge + * + * 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_AUDIO_CHEB_BAND_H__ +#define __GST_AUDIO_CHEB_BAND_H__ + +#include +#include +#include +#include + +#include "audiofxbaseiirfilter.h" + +G_BEGIN_DECLS +#define GST_TYPE_AUDIO_CHEB_BAND (gst_audio_cheb_band_get_type()) +#define GST_AUDIO_CHEB_BAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_CHEB_BAND,GstAudioChebBand)) +#define GST_IS_AUDIO_CHEB_BAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_CHEB_BAND)) +#define GST_AUDIO_CHEB_BAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_CHEB_BAND,GstAudioChebBandClass)) +#define GST_IS_AUDIO_CHEB_BAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_CHEB_BAND)) +#define GST_AUDIO_CHEB_BAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_CHEB_BAND,GstAudioChebBandClass)) +typedef struct _GstAudioChebBand GstAudioChebBand; +typedef struct _GstAudioChebBandClass GstAudioChebBandClass; + +struct _GstAudioChebBand +{ + GstAudioFXBaseIIRFilter parent; + + gint mode; + gint type; + gint poles; + gfloat lower_frequency; + gfloat upper_frequency; + gfloat ripple; + + /* < private > */ + GMutex *lock; +}; + +struct _GstAudioChebBandClass +{ + GstAudioFXBaseIIRFilterClass parent; +}; + +GType gst_audio_cheb_band_get_type (void); + +G_END_DECLS +#endif /* __GST_AUDIO_CHEB_BAND_H__ */ diff --git a/gst/audiofx/audiocheblimit.c b/gst/audiofx/audiocheblimit.c new file mode 100644 index 0000000..b7bb90b --- /dev/null +++ b/gst/audiofx/audiocheblimit.c @@ -0,0 +1,570 @@ +/* + * GStreamer + * Copyright (C) 2007-2009 Sebastian Dröge + * + * 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. + */ + +/* + * Chebyshev type 1 filter design based on + * "The Scientist and Engineer's Guide to DSP", Chapter 20. + * http://www.dspguide.com/ + * + * For type 2 and Chebyshev filters in general read + * http://en.wikipedia.org/wiki/Chebyshev_filter + * + */ + +/** + * SECTION:element-audiocheblimit + * + * Attenuates all frequencies above the cutoff frequency (low-pass) or all frequencies below the + * cutoff frequency (high-pass). The number of poles and the ripple parameter control the rolloff. + * + * This element has the advantage over the windowed sinc lowpass and highpass filter that it is + * much faster and produces almost as good results. It's only disadvantages are the highly + * non-linear phase and the slower rolloff compared to a windowed sinc filter with a large kernel. + * + * For type 1 the ripple parameter specifies how much ripple in dB is allowed in the passband, i.e. + * some frequencies in the passband will be amplified by that value. A higher ripple value will allow + * a faster rolloff. + * + * For type 2 the ripple parameter specifies the stopband attenuation. In the stopband the gain will + * be at most this value. A lower ripple value will allow a faster rolloff. + * + * As a special case, a Chebyshev type 1 filter with no ripple is a Butterworth filter. + * + * + * Be warned that a too large number of poles can produce noise. The most poles are possible with + * a cutoff frequency at a quarter of the sampling rate. + * + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiocheblimit mode=low-pass cutoff=1000 poles=4 ! audioconvert ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiocheblimit mode=high-pass cutoff=400 ripple=0.2 ! audioconvert ! alsasink + * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiocheblimit mode=low-pass cutoff=800 type=2 ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include + +#include "math_compat.h" + +#include "audiocheblimit.h" + +#include "gst/glib-compat-private.h" + +#define GST_CAT_DEFAULT gst_audio_cheb_limit_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + PROP_0, + PROP_MODE, + PROP_TYPE, + PROP_CUTOFF, + PROP_RIPPLE, + PROP_POLES +}; + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_cheb_limit_debug, "audiocheblimit", 0, "audiocheblimit element"); + +GST_BOILERPLATE_FULL (GstAudioChebLimit, + gst_audio_cheb_limit, GstAudioFXBaseIIRFilter, + GST_TYPE_AUDIO_FX_BASE_IIR_FILTER, DEBUG_INIT); + +static void gst_audio_cheb_limit_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_audio_cheb_limit_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_audio_cheb_limit_finalize (GObject * object); + +static gboolean gst_audio_cheb_limit_setup (GstAudioFilter * filter, + GstRingBufferSpec * format); + +enum +{ + MODE_LOW_PASS = 0, + MODE_HIGH_PASS +}; + +#define GST_TYPE_AUDIO_CHEBYSHEV_FREQ_LIMIT_MODE (gst_audio_cheb_limit_mode_get_type ()) +static GType +gst_audio_cheb_limit_mode_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {MODE_LOW_PASS, "Low pass (default)", + "low-pass"}, + {MODE_HIGH_PASS, "High pass", + "high-pass"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioChebLimitMode", values); + } + return gtype; +} + +/* GObject vmethod implementations */ + +static void +gst_audio_cheb_limit_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (element_class, + "Low pass & high pass filter", + "Filter/Effect/Audio", + "Chebyshev low pass and high pass filter", + "Sebastian Dröge "); +} + +static void +gst_audio_cheb_limit_class_init (GstAudioChebLimitClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; + + gobject_class->set_property = gst_audio_cheb_limit_set_property; + gobject_class->get_property = gst_audio_cheb_limit_get_property; + gobject_class->finalize = gst_audio_cheb_limit_finalize; + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Low pass or high pass mode", + GST_TYPE_AUDIO_CHEBYSHEV_FREQ_LIMIT_MODE, MODE_LOW_PASS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_TYPE, + g_param_spec_int ("type", "Type", "Type of the chebychev filter", 1, 2, 1, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + /* FIXME: Don't use the complete possible range but restrict the upper boundary + * so automatically generated UIs can use a slider without */ + g_object_class_install_property (gobject_class, PROP_CUTOFF, + g_param_spec_float ("cutoff", "Cutoff", "Cut off frequency (Hz)", 0.0, + 100000.0, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_RIPPLE, + g_param_spec_float ("ripple", "Ripple", "Amount of ripple (dB)", 0.0, + 200.0, 0.25, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + /* FIXME: What to do about this upper boundary? With a cutoff frequency of + * rate/4 32 poles are completely possible, with a cutoff frequency very low + * or very high 16 poles already produces only noise */ + g_object_class_install_property (gobject_class, PROP_POLES, + g_param_spec_int ("poles", "Poles", + "Number of poles to use, will be rounded up to the next even number", + 2, 32, 4, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_cheb_limit_setup); +} + +static void +gst_audio_cheb_limit_init (GstAudioChebLimit * filter, + GstAudioChebLimitClass * klass) +{ + filter->cutoff = 0.0; + filter->mode = MODE_LOW_PASS; + filter->type = 1; + filter->poles = 4; + filter->ripple = 0.25; + + filter->lock = g_mutex_new (); +} + +static void +generate_biquad_coefficients (GstAudioChebLimit * filter, + gint p, gdouble * a0, gdouble * a1, gdouble * a2, + gdouble * b1, gdouble * b2) +{ + gint np = filter->poles; + gdouble ripple = filter->ripple; + + /* pole location in s-plane */ + gdouble rp, ip; + + /* zero location in s-plane */ + gdouble iz = 0.0; + + /* transfer function coefficients for the z-plane */ + gdouble x0, x1, x2, y1, y2; + gint type = filter->type; + + /* Calculate pole location for lowpass at frequency 1 */ + { + gdouble angle = (G_PI / 2.0) * (2.0 * p - 1) / np; + + rp = -sin (angle); + ip = cos (angle); + } + + /* If we allow ripple, move the pole from the unit + * circle to an ellipse and keep cutoff at frequency 1 */ + if (ripple > 0 && type == 1) { + gdouble es, vx; + + es = sqrt (pow (10.0, ripple / 10.0) - 1.0); + + vx = (1.0 / np) * asinh (1.0 / es); + rp = rp * sinh (vx); + ip = ip * cosh (vx); + } else if (type == 2) { + gdouble es, vx; + + es = sqrt (pow (10.0, ripple / 10.0) - 1.0); + vx = (1.0 / np) * asinh (es); + rp = rp * sinh (vx); + ip = ip * cosh (vx); + } + + /* Calculate inverse of the pole location to convert from + * type I to type II */ + if (type == 2) { + gdouble mag2 = rp * rp + ip * ip; + + rp /= mag2; + ip /= mag2; + } + + /* Calculate zero location for frequency 1 on the + * unit circle for type 2 */ + if (type == 2) { + gdouble angle = G_PI / (np * 2.0) + ((p - 1) * G_PI) / (np); + gdouble mag2; + + iz = cos (angle); + mag2 = iz * iz; + iz /= mag2; + } + + /* Convert from s-domain to z-domain by + * using the bilinear Z-transform, i.e. + * substitute s by (2/t)*((z-1)/(z+1)) + * with t = 2 * tan(0.5). + */ + if (type == 1) { + gdouble t, m, d; + + t = 2.0 * tan (0.5); + m = rp * rp + ip * ip; + d = 4.0 - 4.0 * rp * t + m * t * t; + + x0 = (t * t) / d; + x1 = 2.0 * x0; + x2 = x0; + y1 = (8.0 - 2.0 * m * t * t) / d; + y2 = (-4.0 - 4.0 * rp * t - m * t * t) / d; + } else { + gdouble t, m, d; + + t = 2.0 * tan (0.5); + m = rp * rp + ip * ip; + d = 4.0 - 4.0 * rp * t + m * t * t; + + x0 = (t * t * iz * iz + 4.0) / d; + x1 = (-8.0 + 2.0 * iz * iz * t * t) / d; + x2 = x0; + y1 = (8.0 - 2.0 * m * t * t) / d; + y2 = (-4.0 - 4.0 * rp * t - m * t * t) / d; + } + + /* Convert from lowpass at frequency 1 to either lowpass + * or highpass. + * + * For lowpass substitute z^(-1) with: + * -1 + * z - k + * ------------ + * -1 + * 1 - k * z + * + * k = sin((1-w)/2) / sin((1+w)/2) + * + * For highpass substitute z^(-1) with: + * + * -1 + * -z - k + * ------------ + * -1 + * 1 + k * z + * + * k = -cos((1+w)/2) / cos((1-w)/2) + * + */ + { + gdouble k, d; + gdouble omega = + 2.0 * G_PI * (filter->cutoff / GST_AUDIO_FILTER (filter)->format.rate); + + if (filter->mode == MODE_LOW_PASS) + k = sin ((1.0 - omega) / 2.0) / sin ((1.0 + omega) / 2.0); + else + k = -cos ((omega + 1.0) / 2.0) / cos ((omega - 1.0) / 2.0); + + d = 1.0 + y1 * k - y2 * k * k; + *a0 = (x0 + k * (-x1 + k * x2)) / d; + *a1 = (x1 + k * k * x1 - 2.0 * k * (x0 + x2)) / d; + *a2 = (x0 * k * k - x1 * k + x2) / d; + *b1 = (2.0 * k + y1 + y1 * k * k - 2.0 * y2 * k) / d; + *b2 = (-k * k - y1 * k + y2) / d; + + if (filter->mode == MODE_HIGH_PASS) { + *a1 = -*a1; + *b1 = -*b1; + } + } +} + +static void +generate_coefficients (GstAudioChebLimit * filter) +{ + if (GST_AUDIO_FILTER (filter)->format.rate == 0) { + gdouble *a = g_new0 (gdouble, 1); + + a[0] = 1.0; + gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER + (filter), a, 1, NULL, 0); + + GST_LOG_OBJECT (filter, "rate was not set yet"); + return; + } + + if (filter->cutoff >= GST_AUDIO_FILTER (filter)->format.rate / 2.0) { + gdouble *a = g_new0 (gdouble, 1); + + a[0] = (filter->mode == MODE_LOW_PASS) ? 1.0 : 0.0; + gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER + (filter), a, 1, NULL, 0); + GST_LOG_OBJECT (filter, "cutoff was higher than nyquist frequency"); + return; + } else if (filter->cutoff <= 0.0) { + gdouble *a = g_new0 (gdouble, 1); + + a[0] = (filter->mode == MODE_LOW_PASS) ? 0.0 : 1.0; + gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER + (filter), a, 1, NULL, 0); + GST_LOG_OBJECT (filter, "cutoff is lower than zero"); + return; + } + + /* Calculate coefficients for the chebyshev filter */ + { + gint np = filter->poles; + gdouble *a, *b; + gint i, p; + + a = g_new0 (gdouble, np + 3); + b = g_new0 (gdouble, np + 3); + + /* Calculate transfer function coefficients */ + a[2] = 1.0; + b[2] = 1.0; + + for (p = 1; p <= np / 2; p++) { + gdouble a0, a1, a2, b1, b2; + gdouble *ta = g_new0 (gdouble, np + 3); + gdouble *tb = g_new0 (gdouble, np + 3); + + generate_biquad_coefficients (filter, p, &a0, &a1, &a2, &b1, &b2); + + memcpy (ta, a, sizeof (gdouble) * (np + 3)); + memcpy (tb, b, sizeof (gdouble) * (np + 3)); + + /* add the new coefficients for the new two poles + * to the cascade by multiplication of the transfer + * functions */ + for (i = 2; i < np + 3; i++) { + a[i] = a0 * ta[i] + a1 * ta[i - 1] + a2 * ta[i - 2]; + b[i] = tb[i] - b1 * tb[i - 1] - b2 * tb[i - 2]; + } + g_free (ta); + g_free (tb); + } + + /* Move coefficients to the beginning of the array + * and multiply the b coefficients with -1 to move from + * the transfer function's coefficients to the difference + * equation's coefficients */ + b[2] = 0.0; + for (i = 0; i <= np; i++) { + a[i] = a[i + 2]; + b[i] = -b[i + 2]; + } + + /* Normalize to unity gain at frequency 0 for lowpass + * and frequency 0.5 for highpass */ + { + gdouble gain; + + if (filter->mode == MODE_LOW_PASS) + gain = + gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, + 1.0, 0.0); + else + gain = + gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, + -1.0, 0.0); + + for (i = 0; i <= np; i++) { + a[i] /= gain; + } + } + + gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER + (filter), a, np + 1, b, np + 1); + + GST_LOG_OBJECT (filter, + "Generated IIR coefficients for the Chebyshev filter"); + GST_LOG_OBJECT (filter, + "mode: %s, type: %d, poles: %d, cutoff: %.2f Hz, ripple: %.2f dB", + (filter->mode == MODE_LOW_PASS) ? "low-pass" : "high-pass", + filter->type, filter->poles, filter->cutoff, filter->ripple); + GST_LOG_OBJECT (filter, "%.2f dB gain @ 0 Hz", + 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, + np + 1, 1.0, 0.0))); + +#ifndef GST_DISABLE_GST_DEBUG + { + gdouble wc = + 2.0 * G_PI * (filter->cutoff / + GST_AUDIO_FILTER (filter)->format.rate); + gdouble zr = cos (wc), zi = sin (wc); + + GST_LOG_OBJECT (filter, "%.2f dB gain @ %d Hz", + 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, + b, np + 1, zr, zi)), (int) filter->cutoff); + } +#endif + + GST_LOG_OBJECT (filter, "%.2f dB gain @ %d Hz", + 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, + np + 1, -1.0, 0.0)), + GST_AUDIO_FILTER (filter)->format.rate / 2); + } +} + +static void +gst_audio_cheb_limit_finalize (GObject * object) +{ + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); + + g_mutex_free (filter->lock); + filter->lock = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_audio_cheb_limit_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); + + switch (prop_id) { + case PROP_MODE: + g_mutex_lock (filter->lock); + filter->mode = g_value_get_enum (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_TYPE: + g_mutex_lock (filter->lock); + filter->type = g_value_get_int (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_CUTOFF: + g_mutex_lock (filter->lock); + filter->cutoff = g_value_get_float (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_RIPPLE: + g_mutex_lock (filter->lock); + filter->ripple = g_value_get_float (value); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + case PROP_POLES: + g_mutex_lock (filter->lock); + filter->poles = GST_ROUND_UP_2 (g_value_get_int (value)); + generate_coefficients (filter); + g_mutex_unlock (filter->lock); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_cheb_limit_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, filter->mode); + break; + case PROP_TYPE: + g_value_set_int (value, filter->type); + break; + case PROP_CUTOFF: + g_value_set_float (value, filter->cutoff); + break; + case PROP_RIPPLE: + g_value_set_float (value, filter->ripple); + break; + case PROP_POLES: + g_value_set_int (value, filter->poles); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstAudioFilter vmethod implementations */ + +static gboolean +gst_audio_cheb_limit_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (base); + + generate_coefficients (filter); + + return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); +} diff --git a/gst/audiofx/audiocheblimit.h b/gst/audiofx/audiocheblimit.h new file mode 100644 index 0000000..6f79852 --- /dev/null +++ b/gst/audiofx/audiocheblimit.h @@ -0,0 +1,66 @@ +/* + * GStreamer + * Copyright (C) 2007-2009 Sebastian Dröge + * + * 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_AUDIO_CHEB_LIMIT_H__ +#define __GST_AUDIO_CHEB_LIMIT_H__ + +#include +#include +#include +#include + +#include "audiofxbaseiirfilter.h" + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_CHEB_LIMIT (gst_audio_cheb_limit_get_type()) +#define GST_AUDIO_CHEB_LIMIT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_CHEB_LIMIT,GstAudioChebLimit)) +#define GST_IS_AUDIO_CHEB_LIMIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_CHEB_LIMIT)) +#define GST_AUDIO_CHEB_LIMIT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_CHEB_LIMIT,GstAudioChebLimitClass)) +#define GST_IS_AUDIO_CHEB_LIMIT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_CHEB_LIMIT)) +#define GST_AUDIO_CHEB_LIMIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_CHEB_LIMIT,GstAudioChebLimitClass)) + +typedef struct _GstAudioChebLimit GstAudioChebLimit; +typedef struct _GstAudioChebLimitClass GstAudioChebLimitClass; + +struct _GstAudioChebLimit +{ + GstAudioFXBaseIIRFilter parent; + + gint mode; + gint type; + gint poles; + gfloat cutoff; + gfloat ripple; + + /* < private > */ + GMutex *lock; +}; + +struct _GstAudioChebLimitClass +{ + GstAudioFXBaseIIRFilterClass parent; +}; + +GType gst_audio_cheb_limit_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIO_CHEB_LIMIT_H__ */ diff --git a/gst/audiofx/audiodynamic.c b/gst/audiofx/audiodynamic.c new file mode 100644 index 0000000..33871d2 --- /dev/null +++ b/gst/audiofx/audiodynamic.c @@ -0,0 +1,720 @@ +/* + * GStreamer + * Copyright (C) 2007 Sebastian Dröge + * + * 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-audiodynamic + * + * This element can act as a compressor or expander. A compressor changes the + * amplitude of all samples above a specific threshold with a specific ratio, + * a expander does the same for all samples below a specific threshold. If + * soft-knee mode is selected the ratio is applied smoothly. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc wave=saw ! audiodynamic characteristics=soft-knee mode=compressor threshold=0.5 rate=0.5 ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiodynamic characteristics=hard-knee mode=expander threshold=0.2 rate=4.0 ! alsasink + * gst-launch audiotestsrc wave=saw ! audioconvert ! audiodynamic ! audioconvert ! alsasink + * ]| + * + */ + +/* TODO: Implement attack and release parameters */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "audiodynamic.h" + +#define GST_CAT_DEFAULT gst_audio_dynamic_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_CHARACTERISTICS, + PROP_MODE, + PROP_THRESHOLD, + PROP_RATIO +}; + +#define ALLOWED_CAPS \ + "audio/x-raw-int," \ + " depth=(int)16," \ + " width=(int)16," \ + " endianness=(int)BYTE_ORDER," \ + " signed=(bool)TRUE," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]; " \ + "audio/x-raw-float," \ + " width=(int)32," \ + " endianness=(int)BYTE_ORDER," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]" + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_dynamic_debug, "audiodynamic", 0, "audiodynamic element"); + +GST_BOILERPLATE_FULL (GstAudioDynamic, gst_audio_dynamic, GstAudioFilter, + GST_TYPE_AUDIO_FILTER, DEBUG_INIT); + +static void gst_audio_dynamic_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_dynamic_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_audio_dynamic_setup (GstAudioFilter * filter, + GstRingBufferSpec * format); +static GstFlowReturn gst_audio_dynamic_transform_ip (GstBaseTransform * base, + GstBuffer * buf); + +static void +gst_audio_dynamic_transform_hard_knee_compressor_int (GstAudioDynamic * filter, + gint16 * data, guint num_samples); +static void +gst_audio_dynamic_transform_hard_knee_compressor_float (GstAudioDynamic * + filter, gfloat * data, guint num_samples); +static void +gst_audio_dynamic_transform_soft_knee_compressor_int (GstAudioDynamic * filter, + gint16 * data, guint num_samples); +static void +gst_audio_dynamic_transform_soft_knee_compressor_float (GstAudioDynamic * + filter, gfloat * data, guint num_samples); +static void gst_audio_dynamic_transform_hard_knee_expander_int (GstAudioDynamic + * filter, gint16 * data, guint num_samples); +static void +gst_audio_dynamic_transform_hard_knee_expander_float (GstAudioDynamic * filter, + gfloat * data, guint num_samples); +static void gst_audio_dynamic_transform_soft_knee_expander_int (GstAudioDynamic + * filter, gint16 * data, guint num_samples); +static void +gst_audio_dynamic_transform_soft_knee_expander_float (GstAudioDynamic * filter, + gfloat * data, guint num_samples); + +static GstAudioDynamicProcessFunc process_functions[] = { + (GstAudioDynamicProcessFunc) + gst_audio_dynamic_transform_hard_knee_compressor_int, + (GstAudioDynamicProcessFunc) + gst_audio_dynamic_transform_hard_knee_compressor_float, + (GstAudioDynamicProcessFunc) + gst_audio_dynamic_transform_soft_knee_compressor_int, + (GstAudioDynamicProcessFunc) + gst_audio_dynamic_transform_soft_knee_compressor_float, + (GstAudioDynamicProcessFunc) + gst_audio_dynamic_transform_hard_knee_expander_int, + (GstAudioDynamicProcessFunc) + gst_audio_dynamic_transform_hard_knee_expander_float, + (GstAudioDynamicProcessFunc) + gst_audio_dynamic_transform_soft_knee_expander_int, + (GstAudioDynamicProcessFunc) + gst_audio_dynamic_transform_soft_knee_expander_float +}; + +enum +{ + CHARACTERISTICS_HARD_KNEE = 0, + CHARACTERISTICS_SOFT_KNEE +}; + +#define GST_TYPE_AUDIO_DYNAMIC_CHARACTERISTICS (gst_audio_dynamic_characteristics_get_type ()) +static GType +gst_audio_dynamic_characteristics_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {CHARACTERISTICS_HARD_KNEE, "Hard Knee (default)", + "hard-knee"}, + {CHARACTERISTICS_SOFT_KNEE, "Soft Knee (smooth)", + "soft-knee"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioDynamicCharacteristics", values); + } + return gtype; +} + +enum +{ + MODE_COMPRESSOR = 0, + MODE_EXPANDER +}; + +#define GST_TYPE_AUDIO_DYNAMIC_MODE (gst_audio_dynamic_mode_get_type ()) +static GType +gst_audio_dynamic_mode_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {MODE_COMPRESSOR, "Compressor (default)", + "compressor"}, + {MODE_EXPANDER, "Expander", "expander"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioDynamicMode", values); + } + return gtype; +} + +static gboolean +gst_audio_dynamic_set_process_function (GstAudioDynamic * filter) +{ + gint func_index; + + func_index = (filter->mode == MODE_COMPRESSOR) ? 0 : 4; + func_index += (filter->characteristics == CHARACTERISTICS_HARD_KNEE) ? 0 : 2; + func_index += + (GST_AUDIO_FILTER (filter)->format.type == GST_BUFTYPE_FLOAT) ? 1 : 0; + + if (func_index >= 0 && func_index < 8) { + filter->process = process_functions[func_index]; + return TRUE; + } + + return FALSE; +} + +/* GObject vmethod implementations */ + +static void +gst_audio_dynamic_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstCaps *caps; + + gst_element_class_set_details_simple (element_class, + "Dynamic range controller", "Filter/Effect/Audio", + "Compressor and Expander", "Sebastian Dröge "); + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), + caps); + gst_caps_unref (caps); +} + +static void +gst_audio_dynamic_class_init (GstAudioDynamicClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + gobject_class->set_property = gst_audio_dynamic_set_property; + gobject_class->get_property = gst_audio_dynamic_get_property; + + g_object_class_install_property (gobject_class, PROP_CHARACTERISTICS, + g_param_spec_enum ("characteristics", "Characteristics", + "Selects whether the ratio should be applied smooth (soft-knee) " + "or hard (hard-knee).", + GST_TYPE_AUDIO_DYNAMIC_CHARACTERISTICS, CHARACTERISTICS_HARD_KNEE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Selects whether the filter should work on loud samples (compressor) or" + "quiet samples (expander).", + GST_TYPE_AUDIO_DYNAMIC_MODE, MODE_COMPRESSOR, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_THRESHOLD, + g_param_spec_float ("threshold", "Threshold", + "Threshold until the filter is activated", 0.0, 1.0, + 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RATIO, + g_param_spec_float ("ratio", "Ratio", + "Ratio that should be applied", 0.0, G_MAXFLOAT, + 1.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + GST_AUDIO_FILTER_CLASS (klass)->setup = + GST_DEBUG_FUNCPTR (gst_audio_dynamic_setup); + GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = + GST_DEBUG_FUNCPTR (gst_audio_dynamic_transform_ip); +} + +static void +gst_audio_dynamic_init (GstAudioDynamic * filter, GstAudioDynamicClass * klass) +{ + filter->ratio = 1.0; + filter->threshold = 0.0; + filter->characteristics = CHARACTERISTICS_HARD_KNEE; + filter->mode = MODE_COMPRESSOR; + gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); + gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); +} + +static void +gst_audio_dynamic_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (object); + + switch (prop_id) { + case PROP_CHARACTERISTICS: + filter->characteristics = g_value_get_enum (value); + gst_audio_dynamic_set_process_function (filter); + break; + case PROP_MODE: + filter->mode = g_value_get_enum (value); + gst_audio_dynamic_set_process_function (filter); + break; + case PROP_THRESHOLD: + filter->threshold = g_value_get_float (value); + break; + case PROP_RATIO: + filter->ratio = g_value_get_float (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_dynamic_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (object); + + switch (prop_id) { + case PROP_CHARACTERISTICS: + g_value_set_enum (value, filter->characteristics); + break; + case PROP_MODE: + g_value_set_enum (value, filter->mode); + break; + case PROP_THRESHOLD: + g_value_set_float (value, filter->threshold); + break; + case PROP_RATIO: + g_value_set_float (value, filter->ratio); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstAudioFilter vmethod implementations */ + +static gboolean +gst_audio_dynamic_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (base); + gboolean ret = TRUE; + + ret = gst_audio_dynamic_set_process_function (filter); + + return ret; +} + +static void +gst_audio_dynamic_transform_hard_knee_compressor_int (GstAudioDynamic * filter, + gint16 * data, guint num_samples) +{ + glong val; + glong thr_p = filter->threshold * G_MAXINT16; + glong thr_n = filter->threshold * G_MININT16; + + /* Nothing to do for us if ratio is 1.0 or if the threshold + * equals 1.0. */ + if (filter->threshold == 1.0 || filter->ratio == 1.0) + return; + + for (; num_samples; num_samples--) { + val = *data; + + if (val > thr_p) { + val = thr_p + (val - thr_p) * filter->ratio; + } else if (val < thr_n) { + val = thr_n + (val - thr_n) * filter->ratio; + } + *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); + } +} + +static void +gst_audio_dynamic_transform_hard_knee_compressor_float (GstAudioDynamic * + filter, gfloat * data, guint num_samples) +{ + gdouble val, threshold = filter->threshold; + + /* Nothing to do for us if ratio == 1.0. + * As float values can be above 1.0 we have to do something + * if threshold is greater than 1.0. */ + if (filter->ratio == 1.0) + return; + + for (; num_samples; num_samples--) { + val = *data; + + if (val > threshold) { + val = threshold + (val - threshold) * filter->ratio; + } else if (val < -threshold) { + val = -threshold + (val + threshold) * filter->ratio; + } + *data++ = (gfloat) val; + } +} + +static void +gst_audio_dynamic_transform_soft_knee_compressor_int (GstAudioDynamic * filter, + gint16 * data, guint num_samples) +{ + glong val; + glong thr_p = filter->threshold * G_MAXINT16; + glong thr_n = filter->threshold * G_MININT16; + gdouble a_p, b_p, c_p; + gdouble a_n, b_n, c_n; + + /* Nothing to do for us if ratio is 1.0 or if the threshold + * equals 1.0. */ + if (filter->threshold == 1.0 || filter->ratio == 1.0) + return; + + /* We build a 2nd degree polynomial here for + * values greater than threshold or small than + * -threshold with: + * f(t) = t, f'(t) = 1, f'(m) = r + * => + * a = (1-r)/(2*(t-m)) + * b = (r*t - m)/(t-m) + * c = t * (1 - b - a*t) + * f(x) = ax^2 + bx + c + */ + + /* shouldn't happen because this would only be the case + * for threshold == 1.0 which we catch above */ + g_assert (thr_p - G_MAXINT16 != 0); + g_assert (thr_n - G_MININT != 0); + + a_p = (1 - filter->ratio) / (2 * (thr_p - G_MAXINT16)); + b_p = (filter->ratio * thr_p - G_MAXINT16) / (thr_p - G_MAXINT16); + c_p = thr_p * (1 - b_p - a_p * thr_p); + a_n = (1 - filter->ratio) / (2 * (thr_n - G_MININT16)); + b_n = (filter->ratio * thr_n - G_MININT16) / (thr_n - G_MININT16); + c_n = thr_n * (1 - b_n - a_n * thr_n); + + for (; num_samples; num_samples--) { + val = *data; + + if (val > thr_p) { + val = a_p * val * val + b_p * val + c_p; + } else if (val < thr_n) { + val = a_n * val * val + b_n * val + c_n; + } + *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); + } +} + +static void +gst_audio_dynamic_transform_soft_knee_compressor_float (GstAudioDynamic * + filter, gfloat * data, guint num_samples) +{ + gdouble val; + gdouble threshold = filter->threshold; + gdouble a_p, b_p, c_p; + gdouble a_n, b_n, c_n; + + /* Nothing to do for us if ratio == 1.0. + * As float values can be above 1.0 we have to do something + * if threshold is greater than 1.0. */ + if (filter->ratio == 1.0) + return; + + /* We build a 2nd degree polynomial here for + * values greater than threshold or small than + * -threshold with: + * f(t) = t, f'(t) = 1, f'(m) = r + * => + * a = (1-r)/(2*(t-m)) + * b = (r*t - m)/(t-m) + * c = t * (1 - b - a*t) + * f(x) = ax^2 + bx + c + */ + + /* FIXME: If treshold is the same as the maximum + * we need to raise it a bit to prevent + * division by zero. */ + if (threshold == 1.0) + threshold = 1.0 + 0.00001; + + a_p = (1.0 - filter->ratio) / (2.0 * (threshold - 1.0)); + b_p = (filter->ratio * threshold - 1.0) / (threshold - 1.0); + c_p = threshold * (1.0 - b_p - a_p * threshold); + a_n = (1.0 - filter->ratio) / (2.0 * (-threshold + 1.0)); + b_n = (-filter->ratio * threshold + 1.0) / (-threshold + 1.0); + c_n = -threshold * (1.0 - b_n + a_n * threshold); + + for (; num_samples; num_samples--) { + val = *data; + + if (val > 1.0) { + val = 1.0 + (val - 1.0) * filter->ratio; + } else if (val > threshold) { + val = a_p * val * val + b_p * val + c_p; + } else if (val < -1.0) { + val = -1.0 + (val + 1.0) * filter->ratio; + } else if (val < -threshold) { + val = a_n * val * val + b_n * val + c_n; + } + *data++ = (gfloat) val; + } +} + +static void +gst_audio_dynamic_transform_hard_knee_expander_int (GstAudioDynamic * filter, + gint16 * data, guint num_samples) +{ + glong val; + glong thr_p = filter->threshold * G_MAXINT16; + glong thr_n = filter->threshold * G_MININT16; + gdouble zero_p, zero_n; + + /* Nothing to do for us here if threshold equals 0.0 + * or ratio equals 1.0 */ + if (filter->threshold == 0.0 || filter->ratio == 1.0) + return; + + /* zero crossing of our function */ + if (filter->ratio != 0.0) { + zero_p = thr_p - thr_p / filter->ratio; + zero_n = thr_n - thr_n / filter->ratio; + } else { + zero_p = zero_n = 0.0; + } + + if (zero_p < 0.0) + zero_p = 0.0; + if (zero_n > 0.0) + zero_n = 0.0; + + for (; num_samples; num_samples--) { + val = *data; + + if (val < thr_p && val > zero_p) { + val = filter->ratio * val + thr_p * (1 - filter->ratio); + } else if ((val <= zero_p && val > 0) || (val >= zero_n && val < 0)) { + val = 0; + } else if (val > thr_n && val < zero_n) { + val = filter->ratio * val + thr_n * (1 - filter->ratio); + } + *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); + } +} + +static void +gst_audio_dynamic_transform_hard_knee_expander_float (GstAudioDynamic * filter, + gfloat * data, guint num_samples) +{ + gdouble val, threshold = filter->threshold, zero; + + /* Nothing to do for us here if threshold equals 0.0 + * or ratio equals 1.0 */ + if (filter->threshold == 0.0 || filter->ratio == 1.0) + return; + + /* zero crossing of our function */ + if (filter->ratio != 0.0) + zero = threshold - threshold / filter->ratio; + else + zero = 0.0; + + if (zero < 0.0) + zero = 0.0; + + for (; num_samples; num_samples--) { + val = *data; + + if (val < threshold && val > zero) { + val = filter->ratio * val + threshold * (1.0 - filter->ratio); + } else if ((val <= zero && val > 0.0) || (val >= -zero && val < 0.0)) { + val = 0.0; + } else if (val > -threshold && val < -zero) { + val = filter->ratio * val - threshold * (1.0 - filter->ratio); + } + *data++ = (gfloat) val; + } +} + +static void +gst_audio_dynamic_transform_soft_knee_expander_int (GstAudioDynamic * filter, + gint16 * data, guint num_samples) +{ + glong val; + glong thr_p = filter->threshold * G_MAXINT16; + glong thr_n = filter->threshold * G_MININT16; + gdouble zero_p, zero_n; + gdouble a_p, b_p, c_p; + gdouble a_n, b_n, c_n; + + /* Nothing to do for us here if threshold equals 0.0 + * or ratio equals 1.0 */ + if (filter->threshold == 0.0 || filter->ratio == 1.0) + return; + + /* zero crossing of our function */ + zero_p = (thr_p * (filter->ratio - 1.0)) / (1.0 + filter->ratio); + zero_n = (thr_n * (filter->ratio - 1.0)) / (1.0 + filter->ratio); + + if (zero_p < 0.0) + zero_p = 0.0; + if (zero_n > 0.0) + zero_n = 0.0; + + /* shouldn't happen as this would only happen + * with threshold == 0.0 */ + g_assert (thr_p != 0); + g_assert (thr_n != 0); + + /* We build a 2n degree polynomial here for values between + * 0 and threshold or 0 and -threshold with: + * f(t) = t, f'(t) = 1, f(z) = 0, f'(z) = r + * z between 0 and t + * => + * a = (1 - r^2) / (4 * t) + * b = (1 + r^2) / 2 + * c = t * (1.0 - b - a*t) + * f(x) = ax^2 + bx + c */ + a_p = (1.0 - filter->ratio * filter->ratio) / (4.0 * thr_p); + b_p = (1.0 + filter->ratio * filter->ratio) / 2.0; + c_p = thr_p * (1.0 - b_p - a_p * thr_p); + a_n = (1.0 - filter->ratio * filter->ratio) / (4.0 * thr_n); + b_n = (1.0 + filter->ratio * filter->ratio) / 2.0; + c_n = thr_n * (1.0 - b_n - a_n * thr_n); + + for (; num_samples; num_samples--) { + val = *data; + + if (val < thr_p && val > zero_p) { + val = a_p * val * val + b_p * val + c_p; + } else if ((val <= zero_p && val > 0) || (val >= zero_n && val < 0)) { + val = 0; + } else if (val > thr_n && val < zero_n) { + val = a_n * val * val + b_n * val + c_n; + } + *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); + } +} + +static void +gst_audio_dynamic_transform_soft_knee_expander_float (GstAudioDynamic * filter, + gfloat * data, guint num_samples) +{ + gdouble val; + gdouble threshold = filter->threshold; + gdouble zero; + gdouble a_p, b_p, c_p; + gdouble a_n, b_n, c_n; + + /* Nothing to do for us here if threshold equals 0.0 + * or ratio equals 1.0 */ + if (filter->threshold == 0.0 || filter->ratio == 1.0) + return; + + /* zero crossing of our function */ + zero = (threshold * (filter->ratio - 1.0)) / (1.0 + filter->ratio); + + if (zero < 0.0) + zero = 0.0; + + /* shouldn't happen as this only happens with + * threshold == 0.0 */ + g_assert (threshold != 0.0); + + /* We build a 2n degree polynomial here for values between + * 0 and threshold or 0 and -threshold with: + * f(t) = t, f'(t) = 1, f(z) = 0, f'(z) = r + * z between 0 and t + * => + * a = (1 - r^2) / (4 * t) + * b = (1 + r^2) / 2 + * c = t * (1.0 - b - a*t) + * f(x) = ax^2 + bx + c */ + a_p = (1.0 - filter->ratio * filter->ratio) / (4.0 * threshold); + b_p = (1.0 + filter->ratio * filter->ratio) / 2.0; + c_p = threshold * (1.0 - b_p - a_p * threshold); + a_n = (1.0 - filter->ratio * filter->ratio) / (-4.0 * threshold); + b_n = (1.0 + filter->ratio * filter->ratio) / 2.0; + c_n = -threshold * (1.0 - b_n + a_n * threshold); + + for (; num_samples; num_samples--) { + val = *data; + + if (val < threshold && val > zero) { + val = a_p * val * val + b_p * val + c_p; + } else if ((val <= zero && val > 0.0) || (val >= -zero && val < 0.0)) { + val = 0.0; + } else if (val > -threshold && val < -zero) { + val = a_n * val * val + b_n * val + c_n; + } + *data++ = (gfloat) val; + } +} + +/* GstBaseTransform vmethod implementations */ +static GstFlowReturn +gst_audio_dynamic_transform_ip (GstBaseTransform * base, GstBuffer * buf) +{ + GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (base); + guint num_samples; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + num_samples = + GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); + + if (gst_base_transform_is_passthrough (base) || + G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) + return GST_FLOW_OK; + + filter->process (filter, GST_BUFFER_DATA (buf), num_samples); + + return GST_FLOW_OK; +} diff --git a/gst/audiofx/audiodynamic.h b/gst/audiofx/audiodynamic.h new file mode 100644 index 0000000..66cf9b1 --- /dev/null +++ b/gst/audiofx/audiodynamic.h @@ -0,0 +1,65 @@ +/* + * GStreamer + * Copyright (C) 2007 Sebastian Dröge + * + * 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_AUDIO_DYNAMIC_H__ +#define __GST_AUDIO_DYNAMIC_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_DYNAMIC (gst_audio_dynamic_get_type()) +#define GST_AUDIO_DYNAMIC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_DYNAMIC,GstAudioDynamic)) +#define GST_IS_AUDIO_DYNAMIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_DYNAMIC)) +#define GST_AUDIO_DYNAMIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_DYNAMIC,GstAudioDynamicClass)) +#define GST_IS_AUDIO_DYNAMIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_DYNAMIC)) +#define GST_AUDIO_DYNAMIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_DYNAMIC,GstAudioDynamicClass)) +typedef struct _GstAudioDynamic GstAudioDynamic; +typedef struct _GstAudioDynamicClass GstAudioDynamicClass; + +typedef void (*GstAudioDynamicProcessFunc) (GstAudioDynamic *, guint8 *, guint); + +struct _GstAudioDynamic +{ + GstAudioFilter audiofilter; + + gfloat degree; + + /* < private > */ + GstAudioDynamicProcessFunc process; + gint characteristics; + gint mode; + gfloat threshold; + gfloat ratio; +}; + +struct _GstAudioDynamicClass +{ + GstAudioFilterClass parent; +}; + +GType gst_audio_dynamic_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIO_DYNAMIC_H__ */ diff --git a/gst/audiofx/audioecho.c b/gst/audiofx/audioecho.c new file mode 100644 index 0000000..9064619 --- /dev/null +++ b/gst/audiofx/audioecho.c @@ -0,0 +1,402 @@ +/* + * GStreamer + * Copyright (C) 2009 Sebastian Dröge + * + * 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-audioecho + * @Since: 0.10.14 + * + * audioecho adds an echo or (simple) reverb effect to an audio stream. The echo + * delay, intensity and the percentage of feedback can be configured. + * + * For getting an echo effect you have to set the delay to a larger value, + * for example 200ms and more. Everything below will result in a simple + * reverb effect, which results in a slightly metallic sound. + * + * Use the max-delay property to set the maximum amount of delay that + * will be used. This can only be set before going to the PAUSED or PLAYING + * state and will be set to the current delay by default. + * + * + * Example launch line + * |[ + * gst-launch filesrc location="melo1.ogg" ! audioconvert ! audioecho delay=500000000 intensity=0.6 feedback=0.4 ! audioconvert ! autoaudiosink + * gst-launch filesrc location="melo1.ogg" ! decodebin ! audioconvert ! audioecho delay=50000000 intensity=0.6 feedback=0.4 ! audioconvert ! autoaudiosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "audioecho.h" + +#define GST_CAT_DEFAULT gst_audio_echo_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + PROP_0, + PROP_DELAY, + PROP_MAX_DELAY, + PROP_INTENSITY, + PROP_FEEDBACK +}; + +#define ALLOWED_CAPS \ + "audio/x-raw-float," \ + " width=(int) { 32, 64 }, " \ + " endianness=(int)BYTE_ORDER," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]" + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_echo_debug, "audioecho", 0, "audioecho element"); + +GST_BOILERPLATE_FULL (GstAudioEcho, gst_audio_echo, GstAudioFilter, + GST_TYPE_AUDIO_FILTER, DEBUG_INIT); + +static void gst_audio_echo_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_echo_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_audio_echo_finalize (GObject * object); + +static gboolean gst_audio_echo_setup (GstAudioFilter * self, + GstRingBufferSpec * format); +static gboolean gst_audio_echo_stop (GstBaseTransform * base); +static GstFlowReturn gst_audio_echo_transform_ip (GstBaseTransform * base, + GstBuffer * buf); + +static void gst_audio_echo_transform_float (GstAudioEcho * self, + gfloat * data, guint num_samples); +static void gst_audio_echo_transform_double (GstAudioEcho * self, + gdouble * data, guint num_samples); + +/* GObject vmethod implementations */ + +static void +gst_audio_echo_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstCaps *caps; + + gst_element_class_set_details_simple (element_class, "Audio echo", + "Filter/Effect/Audio", + "Adds an echo or reverb effect to an audio stream", + "Sebastian Dröge "); + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), + caps); + gst_caps_unref (caps); +} + +static void +gst_audio_echo_class_init (GstAudioEchoClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *basetransform_class = (GstBaseTransformClass *) klass; + GstAudioFilterClass *audioself_class = (GstAudioFilterClass *) klass; + + gobject_class->set_property = gst_audio_echo_set_property; + gobject_class->get_property = gst_audio_echo_get_property; + gobject_class->finalize = gst_audio_echo_finalize; + + g_object_class_install_property (gobject_class, PROP_DELAY, + g_param_spec_uint64 ("delay", "Delay", + "Delay of the echo in nanoseconds", 1, G_MAXUINT64, + 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS + | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_MAX_DELAY, + g_param_spec_uint64 ("max-delay", "Maximum Delay", + "Maximum delay of the echo in nanoseconds" + " (can't be changed in PLAYING or PAUSED state)", + 1, G_MAXUINT64, 1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_READY)); + + g_object_class_install_property (gobject_class, PROP_INTENSITY, + g_param_spec_float ("intensity", "Intensity", + "Intensity of the echo", 0.0, 1.0, + 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS + | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_FEEDBACK, + g_param_spec_float ("feedback", "Feedback", + "Amount of feedback", 0.0, 1.0, + 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS + | GST_PARAM_CONTROLLABLE)); + + audioself_class->setup = GST_DEBUG_FUNCPTR (gst_audio_echo_setup); + basetransform_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_audio_echo_transform_ip); + basetransform_class->stop = GST_DEBUG_FUNCPTR (gst_audio_echo_stop); +} + +static void +gst_audio_echo_init (GstAudioEcho * self, GstAudioEchoClass * klass) +{ + self->delay = 1; + self->max_delay = 1; + self->intensity = 0.0; + self->feedback = 0.0; + + gst_base_transform_set_in_place (GST_BASE_TRANSFORM (self), TRUE); +} + +static void +gst_audio_echo_finalize (GObject * object) +{ + GstAudioEcho *self = GST_AUDIO_ECHO (object); + + g_free (self->buffer); + self->buffer = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_audio_echo_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioEcho *self = GST_AUDIO_ECHO (object); + + switch (prop_id) { + case PROP_DELAY:{ + guint64 max_delay, delay; + + GST_BASE_TRANSFORM_LOCK (self); + delay = g_value_get_uint64 (value); + max_delay = self->max_delay; + + if (delay > max_delay && GST_STATE (self) > GST_STATE_READY) { + GST_WARNING_OBJECT (self, "New delay (%" GST_TIME_FORMAT ") " + "is larger than maximum delay (%" GST_TIME_FORMAT ")", + GST_TIME_ARGS (delay), GST_TIME_ARGS (max_delay)); + self->delay = max_delay; + } else { + self->delay = delay; + self->max_delay = MAX (delay, max_delay); + } + GST_BASE_TRANSFORM_UNLOCK (self); + } + break; + case PROP_MAX_DELAY:{ + guint64 max_delay, delay; + + GST_BASE_TRANSFORM_LOCK (self); + max_delay = g_value_get_uint64 (value); + delay = self->delay; + + if (GST_STATE (self) > GST_STATE_READY) { + GST_ERROR_OBJECT (self, "Can't change maximum delay in" + " PLAYING or PAUSED state"); + } else { + self->delay = delay; + self->max_delay = max_delay; + } + GST_BASE_TRANSFORM_UNLOCK (self); + } + break; + case PROP_INTENSITY:{ + GST_BASE_TRANSFORM_LOCK (self); + self->intensity = g_value_get_float (value); + GST_BASE_TRANSFORM_UNLOCK (self); + } + break; + case PROP_FEEDBACK:{ + GST_BASE_TRANSFORM_LOCK (self); + self->feedback = g_value_get_float (value); + GST_BASE_TRANSFORM_UNLOCK (self); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_echo_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioEcho *self = GST_AUDIO_ECHO (object); + + switch (prop_id) { + case PROP_DELAY: + GST_BASE_TRANSFORM_LOCK (self); + g_value_set_uint64 (value, self->delay); + GST_BASE_TRANSFORM_UNLOCK (self); + break; + case PROP_MAX_DELAY: + GST_BASE_TRANSFORM_LOCK (self); + g_value_set_uint64 (value, self->max_delay); + GST_BASE_TRANSFORM_UNLOCK (self); + break; + case PROP_INTENSITY: + GST_BASE_TRANSFORM_LOCK (self); + g_value_set_float (value, self->intensity); + GST_BASE_TRANSFORM_UNLOCK (self); + break; + case PROP_FEEDBACK: + GST_BASE_TRANSFORM_LOCK (self); + g_value_set_float (value, self->feedback); + GST_BASE_TRANSFORM_UNLOCK (self); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstAudioFilter vmethod implementations */ + +static gboolean +gst_audio_echo_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioEcho *self = GST_AUDIO_ECHO (base); + gboolean ret = TRUE; + + if (format->type == GST_BUFTYPE_FLOAT && format->width == 32) + self->process = (GstAudioEchoProcessFunc) + gst_audio_echo_transform_float; + else if (format->type == GST_BUFTYPE_FLOAT && format->width == 64) + self->process = (GstAudioEchoProcessFunc) + gst_audio_echo_transform_double; + else + ret = FALSE; + + g_free (self->buffer); + self->buffer = NULL; + self->buffer_pos = 0; + self->buffer_size = 0; + self->buffer_size_frames = 0; + + return ret; +} + +static gboolean +gst_audio_echo_stop (GstBaseTransform * base) +{ + GstAudioEcho *self = GST_AUDIO_ECHO (base); + + g_free (self->buffer); + self->buffer = NULL; + self->buffer_pos = 0; + self->buffer_size = 0; + self->buffer_size_frames = 0; + + return TRUE; +} + +#define TRANSFORM_FUNC(name, type) \ +static void \ +gst_audio_echo_transform_##name (GstAudioEcho * self, \ + type * data, guint num_samples) \ +{ \ + type *buffer = (type *) self->buffer; \ + guint channels = GST_AUDIO_FILTER (self)->format.channels; \ + guint rate = GST_AUDIO_FILTER (self)->format.rate; \ + guint i, j; \ + guint echo_index = self->buffer_size_frames - self->delay_frames; \ + gdouble echo_off = ((((gdouble) self->delay) * rate) / GST_SECOND) - self->delay_frames; \ + \ + if (echo_off < 0.0) \ + echo_off = 0.0; \ + \ + num_samples /= channels; \ + \ + for (i = 0; i < num_samples; i++) { \ + guint echo0_index = ((echo_index + self->buffer_pos) % self->buffer_size_frames) * channels; \ + guint echo1_index = ((echo_index + self->buffer_pos +1) % self->buffer_size_frames) * channels; \ + guint rbout_index = (self->buffer_pos % self->buffer_size_frames) * channels; \ + for (j = 0; j < channels; j++) { \ + gdouble in = data[i*channels + j]; \ + gdouble echo0 = buffer[echo0_index + j]; \ + gdouble echo1 = buffer[echo1_index + j]; \ + gdouble echo = echo0 + (echo1-echo0)*echo_off; \ + type out = in + self->intensity * echo; \ + \ + data[i*channels + j] = out; \ + \ + buffer[rbout_index + j] = in + self->feedback * echo; \ + } \ + self->buffer_pos = (self->buffer_pos + 1) % self->buffer_size_frames; \ + } \ +} + +TRANSFORM_FUNC (float, gfloat); +TRANSFORM_FUNC (double, gdouble); + +/* GstBaseTransform vmethod implementations */ +static GstFlowReturn +gst_audio_echo_transform_ip (GstBaseTransform * base, GstBuffer * buf) +{ + GstAudioEcho *self = GST_AUDIO_ECHO (base); + guint num_samples; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (self, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (self), stream_time); + + num_samples = + GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (self)->format.width / 8); + + if (self->buffer == NULL) { + guint width, rate, channels; + + width = GST_AUDIO_FILTER (self)->format.width / 8; + rate = GST_AUDIO_FILTER (self)->format.rate; + channels = GST_AUDIO_FILTER (self)->format.channels; + + self->delay_frames = + MAX (gst_util_uint64_scale (self->delay, rate, GST_SECOND), 1); + self->buffer_size_frames = + MAX (gst_util_uint64_scale (self->max_delay, rate, GST_SECOND), 1); + + self->buffer_size = self->buffer_size_frames * width * channels; + self->buffer = g_try_malloc0 (self->buffer_size); + self->buffer_pos = 0; + + if (self->buffer == NULL) { + GST_ERROR_OBJECT (self, "Failed to allocate %u bytes", self->buffer_size); + return GST_FLOW_ERROR; + } + } + + self->process (self, GST_BUFFER_DATA (buf), num_samples); + + return GST_FLOW_OK; +} diff --git a/gst/audiofx/audioecho.h b/gst/audiofx/audioecho.h new file mode 100644 index 0000000..9722d7d --- /dev/null +++ b/gst/audiofx/audioecho.h @@ -0,0 +1,69 @@ +/* + * GStreamer + * Copyright (C) 2009 Sebastian Dröge + * + * 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_AUDIO_ECHO_H__ +#define __GST_AUDIO_ECHO_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_ECHO (gst_audio_echo_get_type()) +#define GST_AUDIO_ECHO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_ECHO,GstAudioEcho)) +#define GST_IS_AUDIO_ECHO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_ECHO)) +#define GST_AUDIO_ECHO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_ECHO,GstAudioEchoClass)) +#define GST_IS_AUDIO_ECHO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_ECHO)) +#define GST_AUDIO_ECHO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_ECHO,GstAudioEchoClass)) +typedef struct _GstAudioEcho GstAudioEcho; +typedef struct _GstAudioEchoClass GstAudioEchoClass; + +typedef void (*GstAudioEchoProcessFunc) (GstAudioEcho *, guint8 *, guint); + +struct _GstAudioEcho +{ + GstAudioFilter audiofilter; + + guint64 delay; + guint64 max_delay; + gfloat intensity; + gfloat feedback; + + /* < private > */ + GstAudioEchoProcessFunc process; + guint delay_frames; + guint8 *buffer; + guint buffer_pos; + guint buffer_size; + guint buffer_size_frames; +}; + +struct _GstAudioEchoClass +{ + GstAudioFilterClass parent; +}; + +GType gst_audio_echo_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIO_ECHO_H__ */ diff --git a/gst/audiofx/audiofirfilter.c b/gst/audiofx/audiofirfilter.c new file mode 100644 index 0000000..bd5a51b --- /dev/null +++ b/gst/audiofx/audiofirfilter.c @@ -0,0 +1,266 @@ +/* + * GStreamer + * Copyright (C) 2009 Sebastian Dröge + * + * 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-audiofirfilter + * + * audiofirfilter implements a generic audio FIR filter. Before usage the + * "kernel" property has to be set to the filter kernel that should be + * used and the "latency" property has to be set to the latency (in samples) + * that is introduced by the filter kernel. Setting a latency of n samples + * will lead to the first n samples being dropped from the output and + * n samples added to the end. + * + * The filter kernel describes the impulse response of the filter. To + * calculate the frequency response of the filter you have to calculate + * the Fourier Transform of the impulse response. + * + * To change the filter kernel whenever the sampling rate changes the + * "rate-changed" signal can be used. This should be done for most + * FIR filters as they're depending on the sampling rate. + * + * + * Example application + * |[ + * + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "audiofirfilter.h" + +#include "gst/glib-compat-private.h" + +#define GST_CAT_DEFAULT gst_audio_fir_filter_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + SIGNAL_RATE_CHANGED, + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_KERNEL, + PROP_LATENCY +}; + +static guint gst_audio_fir_filter_signals[LAST_SIGNAL] = { 0, }; + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_fir_filter_debug, "audiofirfilter", 0, \ + "Generic audio FIR filter plugin"); + +GST_BOILERPLATE_FULL (GstAudioFIRFilter, gst_audio_fir_filter, GstAudioFilter, + GST_TYPE_AUDIO_FX_BASE_FIR_FILTER, DEBUG_INIT); + +static void gst_audio_fir_filter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_fir_filter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_audio_fir_filter_finalize (GObject * object); + +static gboolean gst_audio_fir_filter_setup (GstAudioFilter * base, + GstRingBufferSpec * format); + +/* Element class */ +static void +gst_audio_fir_filter_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "Audio FIR filter", "Filter/Effect/Audio", + "Generic audio FIR filter with custom filter kernel", + "Sebastian Dröge "); +} + +static void +gst_audio_fir_filter_class_init (GstAudioFIRFilterClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; + + gobject_class->set_property = gst_audio_fir_filter_set_property; + gobject_class->get_property = gst_audio_fir_filter_get_property; + gobject_class->finalize = gst_audio_fir_filter_finalize; + + g_object_class_install_property (gobject_class, PROP_KERNEL, + g_param_spec_value_array ("kernel", "Filter Kernel", + "Filter kernel for the FIR filter", + g_param_spec_double ("Element", "Filter Kernel Element", + "Element of the filter kernel", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS), + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_LATENCY, + g_param_spec_uint64 ("latency", "Latecy", + "Filter latency in samples", + 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_fir_filter_setup); + + /** + * GstAudioFIRFilter::rate-changed: + * @filter: the filter on which the signal is emitted + * @rate: the new sampling rate + * + * Will be emitted when the sampling rate changes. The callbacks + * will be called from the streaming thread and processing will + * stop until the event is handled. + */ + gst_audio_fir_filter_signals[SIGNAL_RATE_CHANGED] = + g_signal_new ("rate-changed", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAudioFIRFilterClass, rate_changed), + NULL, NULL, gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); +} + +static void +gst_audio_fir_filter_update_kernel (GstAudioFIRFilter * self, GValueArray * va) +{ + gdouble *kernel; + guint i; + + if (va) { + if (self->kernel) + g_value_array_free (self->kernel); + + self->kernel = va; + } + + kernel = g_new (gdouble, self->kernel->n_values); + + for (i = 0; i < self->kernel->n_values; i++) { + GValue *v = g_value_array_get_nth (self->kernel, i); + kernel[i] = g_value_get_double (v); + } + + gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self), + kernel, self->kernel->n_values, self->latency); +} + +static void +gst_audio_fir_filter_init (GstAudioFIRFilter * self, + GstAudioFIRFilterClass * g_class) +{ + GValue v = { 0, }; + GValueArray *va; + + self->latency = 0; + va = g_value_array_new (1); + + g_value_init (&v, G_TYPE_DOUBLE); + g_value_set_double (&v, 1.0); + g_value_array_append (va, &v); + g_value_unset (&v); + gst_audio_fir_filter_update_kernel (self, va); + + self->lock = g_mutex_new (); +} + +/* GstAudioFilter vmethod implementations */ + +/* get notified of caps and plug in the correct process function */ +static gboolean +gst_audio_fir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioFIRFilter *self = GST_AUDIO_FIR_FILTER (base); + + if (self->rate != format->rate) { + g_signal_emit (G_OBJECT (self), + gst_audio_fir_filter_signals[SIGNAL_RATE_CHANGED], 0, format->rate); + self->rate = format->rate; + } + + return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); +} + +static void +gst_audio_fir_filter_finalize (GObject * object) +{ + GstAudioFIRFilter *self = GST_AUDIO_FIR_FILTER (object); + + g_mutex_free (self->lock); + self->lock = NULL; + + if (self->kernel) + g_value_array_free (self->kernel); + self->kernel = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_audio_fir_filter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioFIRFilter *self = GST_AUDIO_FIR_FILTER (object); + + g_return_if_fail (GST_IS_AUDIO_FIR_FILTER (self)); + + switch (prop_id) { + case PROP_KERNEL: + g_mutex_lock (self->lock); + /* update kernel already pushes residues */ + gst_audio_fir_filter_update_kernel (self, g_value_dup_boxed (value)); + g_mutex_unlock (self->lock); + break; + case PROP_LATENCY: + g_mutex_lock (self->lock); + self->latency = g_value_get_uint64 (value); + gst_audio_fir_filter_update_kernel (self, NULL); + g_mutex_unlock (self->lock); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_fir_filter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioFIRFilter *self = GST_AUDIO_FIR_FILTER (object); + + switch (prop_id) { + case PROP_KERNEL: + g_value_set_boxed (value, self->kernel); + break; + case PROP_LATENCY: + g_value_set_uint64 (value, self->latency); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/audiofx/audiofirfilter.h b/gst/audiofx/audiofirfilter.h new file mode 100644 index 0000000..d1d896c --- /dev/null +++ b/gst/audiofx/audiofirfilter.h @@ -0,0 +1,72 @@ +/* + * GStreamer + * Copyright (C) 2009 Sebastian Dröge + * + * 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_AUDIO_FIR_FILTER_H__ +#define __GST_AUDIO_FIR_FILTER_H__ + +#include +#include + +#include "audiofxbasefirfilter.h" + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_FIR_FILTER \ + (gst_audio_fir_filter_get_type()) +#define GST_AUDIO_FIR_FILTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_FIR_FILTER,GstAudioFIRFilter)) +#define GST_AUDIO_FIR_FILTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_FIR_FILTER,GstAudioFIRFilterClass)) +#define GST_IS_AUDIO_FIR_FILTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_FIR_FILTER)) +#define GST_IS_AUDIO_FIR_FILTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_FIR_FILTER)) + +typedef struct _GstAudioFIRFilter GstAudioFIRFilter; +typedef struct _GstAudioFIRFilterClass GstAudioFIRFilterClass; + +/** + * GstAudioFIRFilter: + * + * Opaque data structure. + */ +struct _GstAudioFIRFilter { + GstAudioFXBaseFIRFilter parent; + + GValueArray *kernel; + guint64 latency; + + /* < private > */ + GMutex *lock; + gint rate; +}; + +struct _GstAudioFIRFilterClass { + GstAudioFXBaseFIRFilterClass parent; + + void (*rate_changed) (GstElement * element, gint rate); +}; + +GType gst_audio_fir_filter_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIO_FIR_FILTER_H__ */ diff --git a/gst/audiofx/audiofx.c b/gst/audiofx/audiofx.c new file mode 100644 index 0000000..a268724 --- /dev/null +++ b/gst/audiofx/audiofx.c @@ -0,0 +1,82 @@ +/* + * GStreamer + * Copyright (C) 2006 Stefan Kost + * + * 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 +#include + +#include "audiopanorama.h" +#include "audioinvert.h" +#include "audiokaraoke.h" +#include "audioamplify.h" +#include "audiodynamic.h" +#include "audiocheblimit.h" +#include "audiochebband.h" +#include "audioiirfilter.h" +#include "audiowsincband.h" +#include "audiowsinclimit.h" +#include "audiofirfilter.h" +#include "audioecho.h" + +/* entry point to initialize the plug-in + * initialize the plug-in itself + * register the element factories and pad templates + * register the features + */ +static gboolean +plugin_init (GstPlugin * plugin) +{ + /* initialize gst controller library */ + gst_controller_init (NULL, NULL); + + return (gst_element_register (plugin, "audiopanorama", GST_RANK_NONE, + GST_TYPE_AUDIO_PANORAMA) && + gst_element_register (plugin, "audioinvert", GST_RANK_NONE, + GST_TYPE_AUDIO_INVERT) && + gst_element_register (plugin, "audiokaraoke", GST_RANK_NONE, + GST_TYPE_AUDIO_KARAOKE) && + gst_element_register (plugin, "audioamplify", GST_RANK_NONE, + GST_TYPE_AUDIO_AMPLIFY) && + gst_element_register (plugin, "audiodynamic", GST_RANK_NONE, + GST_TYPE_AUDIO_DYNAMIC) && + gst_element_register (plugin, "audiocheblimit", GST_RANK_NONE, + GST_TYPE_AUDIO_CHEB_LIMIT) && + gst_element_register (plugin, "audiochebband", GST_RANK_NONE, + GST_TYPE_AUDIO_CHEB_BAND) && + gst_element_register (plugin, "audioiirfilter", GST_RANK_NONE, + GST_TYPE_AUDIO_IIR_FILTER) && + gst_element_register (plugin, "audiowsinclimit", GST_RANK_NONE, + GST_TYPE_AUDIO_WSINC_LIMIT) && + gst_element_register (plugin, "audiowsincband", GST_RANK_NONE, + GST_TYPE_AUDIO_WSINC_BAND) && + gst_element_register (plugin, "audiofirfilter", GST_RANK_NONE, + GST_TYPE_AUDIO_FIR_FILTER) && + gst_element_register (plugin, "audioecho", GST_RANK_NONE, + GST_TYPE_AUDIO_ECHO)); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "audiofx", + "Audio effects plugin", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/audiofx/audiofxbasefirfilter.c b/gst/audiofx/audiofxbasefirfilter.c new file mode 100644 index 0000000..ac1b148 --- /dev/null +++ b/gst/audiofx/audiofxbasefirfilter.c @@ -0,0 +1,1092 @@ +/* -*- c-basic-offset: 2 -*- + * + * GStreamer + * Copyright (C) 1999-2001 Erik Walthinsen + * 2006 Dreamlab Technologies Ltd. + * 2007-2009 Sebastian Dröge + * + * 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 +#include +#include +#include +#include + +/* FIXME: Remove this once we depend on gst-plugins-base 0.10.26 */ +#ifndef GST_AUDIO_FILTER_CAST +#define GST_AUDIO_FILTER_CAST(obj) ((GstAudioFilter *) (obj)) +#endif + +#include "audiofxbasefirfilter.h" + +#define GST_CAT_DEFAULT gst_audio_fx_base_fir_filter_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +#define ALLOWED_CAPS \ + "audio/x-raw-float, " \ + " width = (int) { 32, 64 }, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) [ 1, MAX ], " \ + " channels = (int) [ 1, MAX ]" + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_fx_base_fir_filter_debug, "audiofxbasefirfilter", 0, \ + "FIR filter base class"); + +/* Switch from time-domain to FFT convolution for kernels >= this */ +#define FFT_THRESHOLD 32 + +enum +{ + PROP_0 = 0, + PROP_LOW_LATENCY, + PROP_DRAIN_ON_CHANGES +}; + +#define DEFAULT_LOW_LATENCY FALSE +#define DEFAULT_DRAIN_ON_CHANGES TRUE + +GST_BOILERPLATE_FULL (GstAudioFXBaseFIRFilter, gst_audio_fx_base_fir_filter, + GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); + +static GstFlowReturn gst_audio_fx_base_fir_filter_transform (GstBaseTransform * + base, GstBuffer * inbuf, GstBuffer * outbuf); +static gboolean gst_audio_fx_base_fir_filter_start (GstBaseTransform * base); +static gboolean gst_audio_fx_base_fir_filter_stop (GstBaseTransform * base); +static gboolean gst_audio_fx_base_fir_filter_event (GstBaseTransform * base, + GstEvent * event); +static gboolean gst_audio_fx_base_fir_filter_transform_size (GstBaseTransform * + base, GstPadDirection direction, GstCaps * caps, guint size, + GstCaps * othercaps, guint * othersize); +static gboolean gst_audio_fx_base_fir_filter_setup (GstAudioFilter * base, + GstRingBufferSpec * format); + +static gboolean gst_audio_fx_base_fir_filter_query (GstPad * pad, + GstQuery * query); +static const GstQueryType *gst_audio_fx_base_fir_filter_query_type (GstPad * + pad); + +/* + * The code below calculates the linear convolution: + * + * y[t] = \sum_{u=0}^{M-1} x[t - u] * h[u] + * + * where y is the output, x is the input, M is the length + * of the filter kernel and h is the filter kernel. For x + * holds: x[t] == 0 \forall t < 0. + * + * The runtime complexity of this is O (M) per sample. + * + */ +#define DEFINE_PROCESS_FUNC(width,ctype) \ +static guint \ +process_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, g##ctype * dst, guint input_samples) \ +{ \ + gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; \ + TIME_DOMAIN_CONVOLUTION_BODY (channels); \ +} + +#define DEFINE_PROCESS_FUNC_FIXED_CHANNELS(width,channels,ctype) \ +static guint \ +process_##channels##_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, g##ctype * dst, guint input_samples) \ +{ \ + TIME_DOMAIN_CONVOLUTION_BODY (channels); \ +} + +#define TIME_DOMAIN_CONVOLUTION_BODY(channels) G_STMT_START { \ + gint kernel_length = self->kernel_length; \ + gint i, j, k, l; \ + gint res_start; \ + gint from_input; \ + gint off; \ + gdouble *buffer = self->buffer; \ + gdouble *kernel = self->kernel; \ + guint buffer_length = self->buffer_length; \ + \ + if (!buffer) { \ + self->buffer_length = buffer_length = kernel_length * channels; \ + self->buffer = buffer = g_new0 (gdouble, self->buffer_length); \ + } \ + \ + /* convolution */ \ + for (i = 0; i < input_samples; i++) { \ + dst[i] = 0.0; \ + k = i % channels; \ + l = i / channels; \ + from_input = MIN (l, kernel_length-1); \ + off = l * channels + k; \ + for (j = 0; j <= from_input; j++) { \ + dst[i] += src[off] * kernel[j]; \ + off -= channels; \ + } \ + /* j == from_input && off == (l - j) * channels + k */ \ + off += kernel_length * channels; \ + for (; j < kernel_length; j++) { \ + dst[i] += buffer[off] * kernel[j]; \ + off -= channels; \ + } \ + } \ + \ + /* copy the tail of the current input buffer to the residue, while \ + * keeping parts of the residue if the input buffer is smaller than \ + * the kernel length */ \ + /* from now on take kernel length as length over all channels */ \ + kernel_length *= channels; \ + if (input_samples < kernel_length) \ + res_start = kernel_length - input_samples; \ + else \ + res_start = 0; \ + \ + for (i = 0; i < res_start; i++) \ + buffer[i] = buffer[i + input_samples]; \ + /* i == res_start */ \ + for (; i < kernel_length; i++) \ + buffer[i] = src[input_samples - kernel_length + i]; \ + \ + self->buffer_fill += kernel_length - res_start; \ + if (self->buffer_fill > kernel_length) \ + self->buffer_fill = kernel_length; \ + \ + return input_samples / channels; \ +} G_STMT_END + +DEFINE_PROCESS_FUNC (32, float); +DEFINE_PROCESS_FUNC (64, double); + +DEFINE_PROCESS_FUNC_FIXED_CHANNELS (32, 1, float); +DEFINE_PROCESS_FUNC_FIXED_CHANNELS (64, 1, double); + +DEFINE_PROCESS_FUNC_FIXED_CHANNELS (32, 2, float); +DEFINE_PROCESS_FUNC_FIXED_CHANNELS (64, 2, double); + +#undef TIME_DOMAIN_CONVOLUTION_BODY +#undef DEFINE_PROCESS_FUNC +#undef DEFINE_PROCESS_FUNC_FIXED_CHANNELS + +/* This implements FFT convolution and uses the overlap-save algorithm. + * See http://cnx.org/content/m12022/latest/ or your favorite + * digital signal processing book for details. + * + * In every pass the following is calculated: + * + * y = IFFT (FFT(x) * FFT(h)) + * + * where y is the output in the time domain, x the + * input and h the filter kernel. * is the multiplication + * of complex numbers. + * + * Due to the circular convolution theorem this + * gives in the time domain: + * + * y[t] = \sum_{u=0}^{M-1} x[t - u] * h[u] + * + * where y is the output, M is the kernel length, + * x the periodically extended[0] input and h the + * filter kernel. + * + * ([0] Periodically extended means: ) + * ( x[t] = x[t+kN] \forall k \in Z ) + * ( where N is the length of x ) + * + * This means: + * - Obviously x and h need to be of the same size for the FFT + * - The first M-1 output values are useless because they're + * built from 1 up to M-1 values from the end of the input + * (circular convolusion!). + * - The last M-1 input values are only used for 1 up to M-1 + * output values, i.e. they need to be used again in the + * next pass for the first M-1 input values. + * + * => The first pass needs M-1 zeroes at the beginning of the + * input and the last M-1 input values of every pass need to + * be used as the first M-1 input values of the next pass. + * + * => x must be larger than h to give a useful number of output + * samples and h needs to be padded by zeroes at the end to give + * it virtually the same size as x (by M we denote the number of + * non-padding samples of h). If len(x)==len(h)==M only 1 output + * sample would be calculated per pass, len(x)==2*len(h) would + * give M+1 output samples, etc. Usually a factor between 4 and 8 + * gives a low number of operations per output samples (see website + * given above). + * + * Overall this gives a runtime complexity per sample of + * + * ( N log N ) + * O ( --------- ) compared to O (M) for the direct calculation. + * ( N - M + 1 ) + */ +#define DEFINE_FFT_PROCESS_FUNC(width,ctype) \ +static guint \ +process_fft_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, \ + g##ctype * dst, guint input_samples) \ +{ \ + gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; \ + FFT_CONVOLUTION_BODY (channels); \ +} + +#define DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS(width,channels,ctype) \ +static guint \ +process_fft_##channels##_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, \ + g##ctype * dst, guint input_samples) \ +{ \ + FFT_CONVOLUTION_BODY (channels); \ +} + +#define FFT_CONVOLUTION_BODY(channels) G_STMT_START { \ + gint i, j; \ + guint pass; \ + guint kernel_length = self->kernel_length; \ + guint block_length = self->block_length; \ + guint buffer_length = self->buffer_length; \ + guint real_buffer_length = buffer_length + kernel_length - 1; \ + guint buffer_fill = self->buffer_fill; \ + GstFFTF64 *fft = self->fft; \ + GstFFTF64 *ifft = self->ifft; \ + GstFFTF64Complex *frequency_response = self->frequency_response; \ + GstFFTF64Complex *fft_buffer = self->fft_buffer; \ + guint frequency_response_length = self->frequency_response_length; \ + gdouble *buffer = self->buffer; \ + guint generated = 0; \ + gdouble re, im; \ + \ + if (!fft_buffer) \ + self->fft_buffer = fft_buffer = \ + g_new (GstFFTF64Complex, frequency_response_length); \ + \ + /* Buffer contains the time domain samples of input data for one chunk \ + * plus some more space for the inverse FFT below. \ + * \ + * The samples are put at offset kernel_length, the inverse FFT \ + * overwrites everthing from offset 0 to length-kernel_length+1, keeping \ + * the last kernel_length-1 samples for copying to the next processing \ + * step. \ + */ \ + if (!buffer) { \ + self->buffer_length = buffer_length = block_length; \ + real_buffer_length = buffer_length + kernel_length - 1; \ + \ + self->buffer = buffer = g_new0 (gdouble, real_buffer_length * channels); \ + \ + /* Beginning has kernel_length-1 zeroes at the beginning */ \ + self->buffer_fill = buffer_fill = kernel_length - 1; \ + } \ + \ + g_assert (self->buffer_length == block_length); \ + \ + while (input_samples) { \ + pass = MIN (buffer_length - buffer_fill, input_samples); \ + \ + /* Deinterleave channels */ \ + for (i = 0; i < pass; i++) { \ + for (j = 0; j < channels; j++) { \ + buffer[real_buffer_length * j + buffer_fill + kernel_length - 1 + i] = \ + src[i * channels + j]; \ + } \ + } \ + buffer_fill += pass; \ + src += channels * pass; \ + input_samples -= pass; \ + \ + /* If we don't have a complete buffer go out */ \ + if (buffer_fill < buffer_length) \ + break; \ + \ + for (j = 0; j < channels; j++) { \ + /* Calculate FFT of input block */ \ + gst_fft_f64_fft (fft, \ + buffer + real_buffer_length * j + kernel_length - 1, fft_buffer); \ + \ + /* Complex multiplication of input and filter spectrum */ \ + for (i = 0; i < frequency_response_length; i++) { \ + re = fft_buffer[i].r; \ + im = fft_buffer[i].i; \ + \ + fft_buffer[i].r = \ + re * frequency_response[i].r - \ + im * frequency_response[i].i; \ + fft_buffer[i].i = \ + re * frequency_response[i].i + \ + im * frequency_response[i].r; \ + } \ + \ + /* Calculate inverse FFT of the result */ \ + gst_fft_f64_inverse_fft (ifft, fft_buffer, \ + buffer + real_buffer_length * j); \ + \ + /* Copy all except the first kernel_length-1 samples to the output */ \ + for (i = 0; i < buffer_length - kernel_length + 1; i++) { \ + dst[i * channels + j] = \ + buffer[real_buffer_length * j + kernel_length - 1 + i]; \ + } \ + \ + /* Copy the last kernel_length-1 samples to the beginning for the next block */ \ + for (i = 0; i < kernel_length - 1; i++) { \ + buffer[real_buffer_length * j + kernel_length - 1 + i] = \ + buffer[real_buffer_length * j + buffer_length + i]; \ + } \ + } \ + \ + generated += buffer_length - kernel_length + 1; \ + dst += channels * (buffer_length - kernel_length + 1); \ + \ + /* The the first kernel_length-1 samples are there already */ \ + buffer_fill = kernel_length - 1; \ + } \ + \ + /* Write back cached buffer_fill value */ \ + self->buffer_fill = buffer_fill; \ + \ + return generated; \ +} G_STMT_END + +DEFINE_FFT_PROCESS_FUNC (32, float); +DEFINE_FFT_PROCESS_FUNC (64, double); + +DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS (32, 1, float); +DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS (64, 1, double); + +DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS (32, 2, float); +DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS (64, 2, double); + +#undef FFT_CONVOLUTION_BODY +#undef DEFINE_FFT_PROCESS_FUNC +#undef DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS + +/* Element class */ +static void + gst_audio_fx_base_fir_filter_calculate_frequency_response + (GstAudioFXBaseFIRFilter * self) +{ + gst_fft_f64_free (self->fft); + self->fft = NULL; + gst_fft_f64_free (self->ifft); + self->ifft = NULL; + g_free (self->frequency_response); + self->frequency_response_length = 0; + g_free (self->fft_buffer); + self->fft_buffer = NULL; + + if (self->kernel && self->kernel_length >= FFT_THRESHOLD + && !self->low_latency) { + guint block_length, i; + gdouble *kernel_tmp, *kernel = self->kernel; + + /* We process 4 * kernel_length samples per pass in FFT mode */ + block_length = 4 * self->kernel_length; + block_length = gst_fft_next_fast_length (block_length); + self->block_length = block_length; + + kernel_tmp = g_new0 (gdouble, block_length); + memcpy (kernel_tmp, kernel, self->kernel_length * sizeof (gdouble)); + + self->fft = gst_fft_f64_new (block_length, FALSE); + self->ifft = gst_fft_f64_new (block_length, TRUE); + self->frequency_response_length = block_length / 2 + 1; + self->frequency_response = + g_new (GstFFTF64Complex, self->frequency_response_length); + gst_fft_f64_fft (self->fft, kernel_tmp, self->frequency_response); + g_free (kernel_tmp); + + /* Normalize to make sure IFFT(FFT(x)) == x */ + for (i = 0; i < self->frequency_response_length; i++) { + self->frequency_response[i].r /= block_length; + self->frequency_response[i].i /= block_length; + } + } +} + +/* Must be called with base transform lock! */ +static void +gst_audio_fx_base_fir_filter_select_process_function (GstAudioFXBaseFIRFilter * + self, gint width, gint channels) +{ + if (width == 32 && self->fft && !self->low_latency) { + if (channels == 1) + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_1_32; + else if (channels == 2) + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_2_32; + else + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_32; + } else if (width == 64 && self->fft && !self->low_latency) { + if (channels == 1) + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_1_64; + else if (channels == 2) + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_2_64; + else + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_64; + } else if (width == 32) { + if (channels == 1) + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_1_32; + else if (channels == 2) + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_2_32; + else + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_32; + } else if (width == 64) { + if (channels == 1) + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_1_64; + else if (channels == 2) + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_2_64; + else + self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_64; + } else { + self->process = NULL; + } +} + +static void +gst_audio_fx_base_fir_filter_dispose (GObject * object) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (object); + + g_free (self->buffer); + self->buffer = NULL; + self->buffer_length = 0; + + g_free (self->kernel); + self->kernel = NULL; + + gst_fft_f64_free (self->fft); + self->fft = NULL; + gst_fft_f64_free (self->ifft); + self->ifft = NULL; + + g_free (self->frequency_response); + self->frequency_response = NULL; + + g_free (self->fft_buffer); + self->fft_buffer = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_audio_fx_base_fir_filter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (object); + + switch (prop_id) { + case PROP_LOW_LATENCY:{ + gboolean low_latency; + + if (GST_STATE (self) >= GST_STATE_PAUSED) { + g_warning ("Changing the \"low-latency\" property " + "is only allowed in states < PAUSED"); + return; + } + + GST_BASE_TRANSFORM_LOCK (self); + low_latency = g_value_get_boolean (value); + + if (self->low_latency != low_latency) { + self->low_latency = low_latency; + gst_audio_fx_base_fir_filter_calculate_frequency_response (self); + gst_audio_fx_base_fir_filter_select_process_function (self, + GST_AUDIO_FILTER_CAST (self)->format.width, + GST_AUDIO_FILTER_CAST (self)->format.channels); + } + GST_BASE_TRANSFORM_UNLOCK (self); + break; + } + case PROP_DRAIN_ON_CHANGES:{ + GST_BASE_TRANSFORM_LOCK (self); + self->drain_on_changes = g_value_get_boolean (value); + GST_BASE_TRANSFORM_UNLOCK (self); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_fx_base_fir_filter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (object); + + switch (prop_id) { + case PROP_LOW_LATENCY: + g_value_set_boolean (value, self->low_latency); + break; + case PROP_DRAIN_ON_CHANGES: + g_value_set_boolean (value, self->drain_on_changes); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_fx_base_fir_filter_base_init (gpointer g_class) +{ + GstCaps *caps; + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (g_class), + caps); + gst_caps_unref (caps); +} + +static void +gst_audio_fx_base_fir_filter_class_init (GstAudioFXBaseFIRFilterClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; + + gobject_class->dispose = gst_audio_fx_base_fir_filter_dispose; + gobject_class->set_property = gst_audio_fx_base_fir_filter_set_property; + gobject_class->get_property = gst_audio_fx_base_fir_filter_get_property; + + /** + * GstAudioFXBaseFIRFilter::low-latency: + * + * Work in low-latency mode. This mode is much slower for large filter sizes + * but the latency is always only the pre-latency of the filter. + * + * Since: 0.10.18 + */ + g_object_class_install_property (gobject_class, PROP_LOW_LATENCY, + g_param_spec_boolean ("low-latency", "Low latency", + "Operate in low latency mode. This mode is slower but the " + "latency will only be the filter pre-latency. " + "Can only be changed in states < PAUSED!", DEFAULT_LOW_LATENCY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstAudioFXBaseFIRFilter::drain-on-changes: + * + * Whether the filter should be drained when its coeficients change + * + * Note: Currently this only works if the kernel size is not changed! + * Support for drainless kernel size changes will be added in the future. + * + * Since: 0.10.18 + */ + g_object_class_install_property (gobject_class, PROP_DRAIN_ON_CHANGES, + g_param_spec_boolean ("drain-on-changes", "Drain on changes", + "Drains the filter when its coeficients change", + DEFAULT_DRAIN_ON_CHANGES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->transform = + GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_transform); + trans_class->start = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_start); + trans_class->stop = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_stop); + trans_class->event = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_event); + trans_class->transform_size = + GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_transform_size); + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_setup); +} + +static void +gst_audio_fx_base_fir_filter_init (GstAudioFXBaseFIRFilter * self, + GstAudioFXBaseFIRFilterClass * g_class) +{ + self->kernel = NULL; + self->buffer = NULL; + self->buffer_length = 0; + + self->start_ts = GST_CLOCK_TIME_NONE; + self->start_off = GST_BUFFER_OFFSET_NONE; + self->nsamples_out = 0; + self->nsamples_in = 0; + + self->low_latency = DEFAULT_LOW_LATENCY; + self->drain_on_changes = DEFAULT_DRAIN_ON_CHANGES; + + gst_pad_set_query_function (GST_BASE_TRANSFORM (self)->srcpad, + gst_audio_fx_base_fir_filter_query); + gst_pad_set_query_type_function (GST_BASE_TRANSFORM (self)->srcpad, + gst_audio_fx_base_fir_filter_query_type); +} + +void +gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter * self) +{ + GstBuffer *outbuf; + GstFlowReturn res; + gint rate = GST_AUDIO_FILTER_CAST (self)->format.rate; + gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; + gint width = GST_AUDIO_FILTER_CAST (self)->format.width / 8; + gint outsize, outsamples; + guint8 *in, *out; + + if (channels == 0 || rate == 0 || self->nsamples_in == 0) { + self->buffer_fill = 0; + g_free (self->buffer); + self->buffer = NULL; + return; + } + + /* Calculate the number of samples and their memory size that + * should be pushed from the residue */ + outsamples = self->nsamples_in - (self->nsamples_out - self->latency); + if (outsamples <= 0) { + self->buffer_fill = 0; + g_free (self->buffer); + self->buffer = NULL; + return; + } + outsize = outsamples * channels * width; + + if (!self->fft || self->low_latency) { + gint64 diffsize, diffsamples; + + /* Process the difference between latency and residue length samples + * to start at the actual data instead of starting at the zeros before + * when we only got one buffer smaller than latency */ + diffsamples = + ((gint64) self->latency) - ((gint64) self->buffer_fill) / channels; + if (diffsamples > 0) { + diffsize = diffsamples * channels * width; + in = g_new0 (guint8, diffsize); + out = g_new0 (guint8, diffsize); + self->nsamples_out += self->process (self, in, out, diffsamples); + g_free (in); + g_free (out); + } + + res = gst_pad_alloc_buffer (GST_BASE_TRANSFORM_CAST (self)->srcpad, + GST_BUFFER_OFFSET_NONE, outsize, + GST_PAD_CAPS (GST_BASE_TRANSFORM_CAST (self)->srcpad), &outbuf); + + if (G_UNLIKELY (res != GST_FLOW_OK)) { + GST_WARNING_OBJECT (self, "failed allocating buffer of %d bytes", + outsize); + self->buffer_fill = 0; + return; + } + + /* Convolve the residue with zeros to get the actual remaining data */ + in = g_new0 (guint8, outsize); + self->nsamples_out += + self->process (self, in, GST_BUFFER_DATA (outbuf), outsamples); + g_free (in); + } else { + guint gensamples = 0; + guint8 *data; + + outbuf = gst_buffer_new_and_alloc (outsize); + data = GST_BUFFER_DATA (outbuf); + + while (gensamples < outsamples) { + guint step_insamples = self->block_length - self->buffer_fill; + guint8 *zeroes = g_new0 (guint8, step_insamples * channels * width); + guint8 *out = g_new (guint8, self->block_length * channels * width); + guint step_gensamples; + + step_gensamples = self->process (self, zeroes, out, step_insamples); + g_free (zeroes); + + memcpy (data + gensamples * width, out, MIN (step_gensamples, + outsamples - gensamples) * width); + gensamples += MIN (step_gensamples, outsamples - gensamples); + + g_free (out); + } + self->nsamples_out += gensamples; + } + + /* Set timestamp, offset, etc from the values we + * saved when processing the regular buffers */ + if (GST_CLOCK_TIME_IS_VALID (self->start_ts)) + GST_BUFFER_TIMESTAMP (outbuf) = self->start_ts; + else + GST_BUFFER_TIMESTAMP (outbuf) = 0; + GST_BUFFER_TIMESTAMP (outbuf) += + gst_util_uint64_scale_int (self->nsamples_out - outsamples - + self->latency, GST_SECOND, rate); + + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale_int (outsamples, GST_SECOND, rate); + + if (self->start_off != GST_BUFFER_OFFSET_NONE) { + GST_BUFFER_OFFSET (outbuf) = + self->start_off + self->nsamples_out - outsamples - self->latency; + GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET (outbuf) + outsamples; + } + + GST_DEBUG_OBJECT (self, "Pushing residue buffer of size %d with timestamp: %" + GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %" + G_GUINT64_FORMAT ", offset_end: %" G_GUINT64_FORMAT ", nsamples_out: %d", + GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf), + GST_BUFFER_OFFSET_END (outbuf), outsamples); + + res = gst_pad_push (GST_BASE_TRANSFORM_CAST (self)->srcpad, outbuf); + + if (G_UNLIKELY (res != GST_FLOW_OK)) { + GST_WARNING_OBJECT (self, "failed to push residue"); + } + + self->buffer_fill = 0; +} + +/* GstAudioFilter vmethod implementations */ + +/* get notified of caps and plug in the correct process function */ +static gboolean +gst_audio_fx_base_fir_filter_setup (GstAudioFilter * base, + GstRingBufferSpec * format) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); + + if (self->buffer) { + gst_audio_fx_base_fir_filter_push_residue (self); + g_free (self->buffer); + self->buffer = NULL; + self->buffer_fill = 0; + self->buffer_length = 0; + self->start_ts = GST_CLOCK_TIME_NONE; + self->start_off = GST_BUFFER_OFFSET_NONE; + self->nsamples_out = 0; + self->nsamples_in = 0; + } + + gst_audio_fx_base_fir_filter_select_process_function (self, format->width, + format->channels); + + return (self->process != NULL); +} + +/* GstBaseTransform vmethod implementations */ + +static gboolean +gst_audio_fx_base_fir_filter_transform_size (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, guint size, GstCaps * othercaps, + guint * othersize) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); + guint blocklen; + GstStructure *s; + gint width, channels; + + if (!self->fft || self->low_latency || direction == GST_PAD_SRC) { + *othersize = size; + return TRUE; + } + + s = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (s, "width", &width) || + !gst_structure_get_int (s, "channels", &channels)) + return FALSE; + + width /= 8; + + size /= width * channels; + + blocklen = self->block_length - self->kernel_length + 1; + *othersize = ((size + blocklen - 1) / blocklen) * blocklen; + + *othersize *= width * channels; + + return TRUE; +} + +static GstFlowReturn +gst_audio_fx_base_fir_filter_transform (GstBaseTransform * base, + GstBuffer * inbuf, GstBuffer * outbuf) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); + GstClockTime timestamp, expected_timestamp; + gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; + gint rate = GST_AUDIO_FILTER_CAST (self)->format.rate; + gint width = GST_AUDIO_FILTER_CAST (self)->format.width / 8; + guint input_samples = (GST_BUFFER_SIZE (inbuf) / width) / channels; + guint output_samples = (GST_BUFFER_SIZE (outbuf) / width) / channels; + guint generated_samples; + guint64 output_offset; + gint64 diff = 0; + GstClockTime stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (outbuf); + + if (!GST_CLOCK_TIME_IS_VALID (timestamp) + && !GST_CLOCK_TIME_IS_VALID (self->start_ts)) { + GST_ERROR_OBJECT (self, "Invalid timestamp"); + return GST_FLOW_ERROR; + } + + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (self, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (self), stream_time); + + g_return_val_if_fail (self->kernel != NULL, GST_FLOW_ERROR); + g_return_val_if_fail (channels != 0, GST_FLOW_ERROR); + + if (GST_CLOCK_TIME_IS_VALID (self->start_ts)) + expected_timestamp = + self->start_ts + gst_util_uint64_scale_int (self->nsamples_in, + GST_SECOND, rate); + else + expected_timestamp = GST_CLOCK_TIME_NONE; + + /* Reset the residue if already existing on discont buffers */ + if (GST_BUFFER_IS_DISCONT (inbuf) + || (GST_CLOCK_TIME_IS_VALID (expected_timestamp) + && (ABS (GST_CLOCK_DIFF (timestamp, + expected_timestamp) > 5 * GST_MSECOND)))) { + GST_DEBUG_OBJECT (self, "Discontinuity detected - flushing"); + if (GST_CLOCK_TIME_IS_VALID (expected_timestamp)) + gst_audio_fx_base_fir_filter_push_residue (self); + self->buffer_fill = 0; + g_free (self->buffer); + self->buffer = NULL; + self->start_ts = timestamp; + self->start_off = GST_BUFFER_OFFSET (inbuf); + self->nsamples_out = 0; + self->nsamples_in = 0; + } else if (!GST_CLOCK_TIME_IS_VALID (self->start_ts)) { + self->start_ts = timestamp; + self->start_off = GST_BUFFER_OFFSET (inbuf); + } + + self->nsamples_in += input_samples; + + generated_samples = + self->process (self, GST_BUFFER_DATA (inbuf), GST_BUFFER_DATA (outbuf), + input_samples); + + g_assert (generated_samples <= output_samples); + self->nsamples_out += generated_samples; + if (generated_samples == 0) + return GST_BASE_TRANSFORM_FLOW_DROPPED; + + /* Calculate the number of samples we can push out now without outputting + * latency zeros in the beginning */ + diff = ((gint64) self->nsamples_out) - ((gint64) self->latency); + if (diff < 0) { + return GST_BASE_TRANSFORM_FLOW_DROPPED; + } else if (diff < generated_samples) { + gint64 tmp = diff; + diff = generated_samples - diff; + generated_samples = tmp; + GST_BUFFER_DATA (outbuf) += diff * width * channels; + } + GST_BUFFER_SIZE (outbuf) = generated_samples * width * channels; + + output_offset = self->nsamples_out - self->latency - generated_samples; + GST_BUFFER_TIMESTAMP (outbuf) = + self->start_ts + gst_util_uint64_scale_int (output_offset, GST_SECOND, + rate); + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale_int (output_samples, GST_SECOND, rate); + if (self->start_off != GST_BUFFER_OFFSET_NONE) { + GST_BUFFER_OFFSET (outbuf) = self->start_off + output_offset; + GST_BUFFER_OFFSET_END (outbuf) = + GST_BUFFER_OFFSET (outbuf) + generated_samples; + } else { + GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE; + GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE; + } + + GST_DEBUG_OBJECT (self, "Pushing buffer of size %d with timestamp: %" + GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %" + G_GUINT64_FORMAT ", offset_end: %" G_GUINT64_FORMAT ", nsamples_out: %d", + GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf), + GST_BUFFER_OFFSET_END (outbuf), generated_samples); + + return GST_FLOW_OK; +} + +static gboolean +gst_audio_fx_base_fir_filter_start (GstBaseTransform * base) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); + + self->buffer_fill = 0; + g_free (self->buffer); + self->buffer = NULL; + self->start_ts = GST_CLOCK_TIME_NONE; + self->start_off = GST_BUFFER_OFFSET_NONE; + self->nsamples_out = 0; + self->nsamples_in = 0; + + return TRUE; +} + +static gboolean +gst_audio_fx_base_fir_filter_stop (GstBaseTransform * base) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); + + g_free (self->buffer); + self->buffer = NULL; + self->buffer_length = 0; + + return TRUE; +} + +static gboolean +gst_audio_fx_base_fir_filter_query (GstPad * pad, GstQuery * query) +{ + GstAudioFXBaseFIRFilter *self = + GST_AUDIO_FX_BASE_FIR_FILTER (gst_pad_get_parent (pad)); + gboolean res = TRUE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + GstClockTime min, max; + gboolean live; + guint64 latency; + GstPad *peer; + gint rate = GST_AUDIO_FILTER (self)->format.rate; + + if (rate == 0) { + res = FALSE; + } else if ((peer = gst_pad_get_peer (GST_BASE_TRANSFORM (self)->sinkpad))) { + if ((res = gst_pad_query (peer, query))) { + 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)); + + if (self->fft && !self->low_latency) + latency = self->block_length - self->kernel_length + 1; + else + latency = self->latency; + + /* add our own latency */ + latency = gst_util_uint64_scale_round (latency, GST_SECOND, rate); + + GST_DEBUG_OBJECT (self, "Our latency: %" + GST_TIME_FORMAT, GST_TIME_ARGS (latency)); + + min += latency; + if (max != GST_CLOCK_TIME_NONE) + 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); + } + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + gst_object_unref (self); + return res; +} + +static const GstQueryType * +gst_audio_fx_base_fir_filter_query_type (GstPad * pad) +{ + static const GstQueryType types[] = { + GST_QUERY_LATENCY, + 0 + }; + + return types; +} + +static gboolean +gst_audio_fx_base_fir_filter_event (GstBaseTransform * base, GstEvent * event) +{ + GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + gst_audio_fx_base_fir_filter_push_residue (self); + self->start_ts = GST_CLOCK_TIME_NONE; + self->start_off = GST_BUFFER_OFFSET_NONE; + self->nsamples_out = 0; + self->nsamples_in = 0; + break; + default: + break; + } + + return GST_BASE_TRANSFORM_CLASS (parent_class)->event (base, event); +} + +void +gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter * self, + gdouble * kernel, guint kernel_length, guint64 latency) +{ + gboolean latency_changed; + + g_return_if_fail (kernel != NULL); + g_return_if_fail (self != NULL); + + GST_BASE_TRANSFORM_LOCK (self); + + latency_changed = (self->latency != latency + || (!self->low_latency && self->kernel_length < FFT_THRESHOLD + && kernel_length >= FFT_THRESHOLD) + || (!self->low_latency && self->kernel_length >= FFT_THRESHOLD + && kernel_length < FFT_THRESHOLD)); + + /* FIXME: If the latency changes, the buffer size changes too and we + * have to drain in any case until this is fixed in the future */ + if (self->buffer && (!self->drain_on_changes || latency_changed)) { + gst_audio_fx_base_fir_filter_push_residue (self); + self->start_ts = GST_CLOCK_TIME_NONE; + self->start_off = GST_BUFFER_OFFSET_NONE; + self->nsamples_out = 0; + self->nsamples_in = 0; + self->buffer_fill = 0; + } + + g_free (self->kernel); + if (!self->drain_on_changes || latency_changed) { + g_free (self->buffer); + self->buffer = NULL; + self->buffer_fill = 0; + self->buffer_length = 0; + } + + self->kernel = kernel; + self->kernel_length = kernel_length; + + gst_audio_fx_base_fir_filter_calculate_frequency_response (self); + gst_audio_fx_base_fir_filter_select_process_function (self, + GST_AUDIO_FILTER_CAST (self)->format.width, + GST_AUDIO_FILTER_CAST (self)->format.channels); + + if (latency_changed) { + self->latency = latency; + gst_element_post_message (GST_ELEMENT (self), + gst_message_new_latency (GST_OBJECT (self))); + } + + GST_BASE_TRANSFORM_UNLOCK (self); +} diff --git a/gst/audiofx/audiofxbasefirfilter.h b/gst/audiofx/audiofxbasefirfilter.h new file mode 100644 index 0000000..c9eeb1b --- /dev/null +++ b/gst/audiofx/audiofxbasefirfilter.h @@ -0,0 +1,99 @@ +/* -*- c-basic-offset: 2 -*- + * + * GStreamer + * Copyright (C) 1999-2001 Erik Walthinsen + * 2006 Dreamlab Technologies Ltd. + * 2009 Sebastian Dröge + * + * 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_AUDIO_FX_BASE_FIR_FILTER_H__ +#define __GST_AUDIO_FX_BASE_FIR_FILTER_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_FX_BASE_FIR_FILTER \ + (gst_audio_fx_base_fir_filter_get_type()) +#define GST_AUDIO_FX_BASE_FIR_FILTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_FX_BASE_FIR_FILTER,GstAudioFXBaseFIRFilter)) +#define GST_AUDIO_FX_BASE_FIR_FILTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_FX_BASE_FIR_FILTER,GstAudioFXBaseFIRFilterClass)) +#define GST_IS_AUDIO_FX_BASE_FIR_FILTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_FX_BASE_FIR_FILTER)) +#define GST_IS_AUDIO_FX_BASE_FIR_FILTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_FX_BASE_FIR_FILTER)) + +typedef struct _GstAudioFXBaseFIRFilter GstAudioFXBaseFIRFilter; +typedef struct _GstAudioFXBaseFIRFilterClass GstAudioFXBaseFIRFilterClass; + +typedef guint (*GstAudioFXBaseFIRFilterProcessFunc) (GstAudioFXBaseFIRFilter *, const guint8 *, guint8 *, guint); + +/** + * GstAudioFXBaseFIRFilter: + * + * Opaque data structure. + */ +struct _GstAudioFXBaseFIRFilter { + GstAudioFilter element; + + /* properties */ + gdouble *kernel; /* filter kernel -- time domain */ + guint kernel_length; /* length of the filter kernel -- time domain */ + + guint64 latency; /* pre-latency of the filter kernel */ + gboolean low_latency; /* work in slower low latency mode */ + + gboolean drain_on_changes; /* If the filter should be drained when + * coeficients change */ + + /* < private > */ + GstAudioFXBaseFIRFilterProcessFunc process; + + gdouble *buffer; /* buffer for storing samples of previous buffers */ + guint buffer_fill; /* fill level of buffer */ + guint buffer_length; /* length of the buffer -- meaning depends on processing mode */ + + /* FFT convolution specific data */ + GstFFTF64 *fft; + GstFFTF64 *ifft; + GstFFTF64Complex *frequency_response; /* filter kernel -- frequency domain */ + guint frequency_response_length; /* length of filter kernel -- frequency domain */ + GstFFTF64Complex *fft_buffer; /* FFT buffer, has the length of the frequency response */ + guint block_length; /* Length of the processing blocks -- time domain */ + + GstClockTime start_ts; /* start timestamp after a discont */ + guint64 start_off; /* start offset after a discont */ + guint64 nsamples_out; /* number of output samples since last discont */ + guint64 nsamples_in; /* number of input samples since last discont */ +}; + +struct _GstAudioFXBaseFIRFilterClass { + GstAudioFilterClass parent_class; +}; + +GType gst_audio_fx_base_fir_filter_get_type (void); +void gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter *filter, gdouble *kernel, guint kernel_length, guint64 latency); +void gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter *filter); + +G_END_DECLS + +#endif /* __GST_AUDIO_FX_BASE_FIR_FILTER_H__ */ diff --git a/gst/audiofx/audiofxbaseiirfilter.c b/gst/audiofx/audiofxbaseiirfilter.c new file mode 100644 index 0000000..0b0fc34 --- /dev/null +++ b/gst/audiofx/audiofxbaseiirfilter.c @@ -0,0 +1,406 @@ +/* + * GStreamer + * Copyright (C) 2007-2009 Sebastian Dröge + * + * 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 +#include +#include +#include +#include + +#include + +#include "audiofxbaseiirfilter.h" + +#define GST_CAT_DEFAULT gst_audio_fx_base_iir_filter_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +#define ALLOWED_CAPS \ + "audio/x-raw-float," \ + " width = (int) { 32, 64 }, " \ + " endianness = (int) BYTE_ORDER," \ + " rate = (int) [ 1, MAX ]," \ + " channels = (int) [ 1, MAX ]" + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_fx_base_iir_filter_debug, "audiofxbaseiirfilter", 0, "Audio IIR Filter Base Class"); + +GST_BOILERPLATE_FULL (GstAudioFXBaseIIRFilter, + gst_audio_fx_base_iir_filter, GstAudioFilter, GST_TYPE_AUDIO_FILTER, + DEBUG_INIT); + +static gboolean gst_audio_fx_base_iir_filter_setup (GstAudioFilter * filter, + GstRingBufferSpec * format); +static GstFlowReturn +gst_audio_fx_base_iir_filter_transform_ip (GstBaseTransform * base, + GstBuffer * buf); +static gboolean gst_audio_fx_base_iir_filter_stop (GstBaseTransform * base); + +static void process_64 (GstAudioFXBaseIIRFilter * filter, + gdouble * data, guint num_samples); +static void process_32 (GstAudioFXBaseIIRFilter * filter, + gfloat * data, guint num_samples); + +/* GObject vmethod implementations */ + +static void +gst_audio_fx_base_iir_filter_base_init (gpointer klass) +{ + GstCaps *caps; + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), + caps); + gst_caps_unref (caps); +} + +static void +gst_audio_fx_base_iir_filter_dispose (GObject * object) +{ + GstAudioFXBaseIIRFilter *filter = GST_AUDIO_FX_BASE_IIR_FILTER (object); + + if (filter->a) { + g_free (filter->a); + filter->a = NULL; + } + + if (filter->b) { + g_free (filter->b); + filter->b = NULL; + } + + if (filter->channels) { + GstAudioFXBaseIIRFilterChannelCtx *ctx; + guint i; + + for (i = 0; i < filter->nchannels; i++) { + ctx = &filter->channels[i]; + g_free (ctx->x); + g_free (ctx->y); + } + + g_free (filter->channels); + filter->channels = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_audio_fx_base_iir_filter_class_init (GstAudioFXBaseIIRFilterClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; + + gobject_class->dispose = gst_audio_fx_base_iir_filter_dispose; + + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_fx_base_iir_filter_setup); + + trans_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_audio_fx_base_iir_filter_transform_ip); + trans_class->stop = GST_DEBUG_FUNCPTR (gst_audio_fx_base_iir_filter_stop); +} + +static void +gst_audio_fx_base_iir_filter_init (GstAudioFXBaseIIRFilter * filter, + GstAudioFXBaseIIRFilterClass * klass) +{ + gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); + + filter->a = NULL; + filter->na = 0; + filter->b = NULL; + filter->nb = 0; + filter->channels = NULL; + filter->nchannels = 0; +} + +/* Evaluate the transfer function that corresponds to the IIR + * coefficients at zr + zi*I and return the magnitude */ +gdouble +gst_audio_fx_base_iir_filter_calculate_gain (gdouble * a, guint na, gdouble * b, + guint nb, gdouble zr, gdouble zi) +{ + gdouble sum_ar, sum_ai; + gdouble sum_br, sum_bi; + gdouble gain_r, gain_i; + + gdouble sum_r_old; + gdouble sum_i_old; + + gint i; + + sum_ar = 0.0; + sum_ai = 0.0; + for (i = na - 1; i >= 0; i--) { + sum_r_old = sum_ar; + sum_i_old = sum_ai; + + sum_ar = (sum_r_old * zr - sum_i_old * zi) + a[i]; + sum_ai = (sum_r_old * zi + sum_i_old * zr) + 0.0; + } + + sum_br = 0.0; + sum_bi = 0.0; + for (i = nb - 1; i >= 0; i--) { + sum_r_old = sum_br; + sum_i_old = sum_bi; + + sum_br = (sum_r_old * zr - sum_i_old * zi) - b[i]; + sum_bi = (sum_r_old * zi + sum_i_old * zr) - 0.0; + } + sum_br += 1.0; + sum_bi += 0.0; + + gain_r = + (sum_ar * sum_br + sum_ai * sum_bi) / (sum_br * sum_br + sum_bi * sum_bi); + gain_i = + (sum_ai * sum_br - sum_ar * sum_bi) / (sum_br * sum_br + sum_bi * sum_bi); + + return (sqrt (gain_r * gain_r + gain_i * gain_i)); +} + +void +gst_audio_fx_base_iir_filter_set_coefficients (GstAudioFXBaseIIRFilter * filter, + gdouble * a, guint na, gdouble * b, guint nb) +{ + guint i; + + g_return_if_fail (GST_IS_AUDIO_FX_BASE_IIR_FILTER (filter)); + + GST_BASE_TRANSFORM_LOCK (filter); + + g_free (filter->a); + g_free (filter->b); + + filter->a = filter->b = NULL; + + if (filter->channels) { + GstAudioFXBaseIIRFilterChannelCtx *ctx; + gboolean free = (na != filter->na || nb != filter->nb); + + for (i = 0; i < filter->nchannels; i++) { + ctx = &filter->channels[i]; + + if (free) + g_free (ctx->x); + else + memset (ctx->x, 0, filter->na * sizeof (gdouble)); + + if (free) + g_free (ctx->y); + else + memset (ctx->y, 0, filter->nb * sizeof (gdouble)); + } + + g_free (filter->channels); + filter->channels = NULL; + } + + filter->na = na; + filter->nb = nb; + + filter->a = a; + filter->b = b; + + if (filter->nchannels && !filter->channels) { + GstAudioFXBaseIIRFilterChannelCtx *ctx; + + filter->channels = + g_new0 (GstAudioFXBaseIIRFilterChannelCtx, filter->nchannels); + for (i = 0; i < filter->nchannels; i++) { + ctx = &filter->channels[i]; + + ctx->x = g_new0 (gdouble, filter->na); + ctx->y = g_new0 (gdouble, filter->nb); + } + } + + GST_BASE_TRANSFORM_UNLOCK (filter); +} + +/* GstAudioFilter vmethod implementations */ + +static gboolean +gst_audio_fx_base_iir_filter_setup (GstAudioFilter * base, + GstRingBufferSpec * format) +{ + GstAudioFXBaseIIRFilter *filter = GST_AUDIO_FX_BASE_IIR_FILTER (base); + gboolean ret = TRUE; + + if (format->width == 32) + filter->process = (GstAudioFXBaseIIRFilterProcessFunc) + process_32; + else if (format->width == 64) + filter->process = (GstAudioFXBaseIIRFilterProcessFunc) + process_64; + else + ret = FALSE; + + if (format->channels != filter->nchannels) { + guint i; + GstAudioFXBaseIIRFilterChannelCtx *ctx; + + if (filter->channels) { + + for (i = 0; i < filter->nchannels; i++) { + ctx = &filter->channels[i]; + + g_free (ctx->x); + g_free (ctx->y); + } + + g_free (filter->channels); + filter->channels = NULL; + } + + filter->nchannels = format->channels; + + filter->channels = + g_new0 (GstAudioFXBaseIIRFilterChannelCtx, filter->nchannels); + for (i = 0; i < filter->nchannels; i++) { + ctx = &filter->channels[i]; + + ctx->x = g_new0 (gdouble, filter->na); + ctx->y = g_new0 (gdouble, filter->nb); + } + } + + return ret; +} + +static inline gdouble +process (GstAudioFXBaseIIRFilter * filter, + GstAudioFXBaseIIRFilterChannelCtx * ctx, gdouble x0) +{ + gdouble val = filter->a[0] * x0; + gint i, j; + + for (i = 1, j = ctx->x_pos; i < filter->na; i++) { + val += filter->a[i] * ctx->x[j]; + j--; + if (j < 0) + j = filter->na - 1; + } + + for (i = 1, j = ctx->y_pos; i < filter->nb; i++) { + val += filter->b[i] * ctx->y[j]; + j--; + if (j < 0) + j = filter->nb - 1; + } + + if (ctx->x) { + ctx->x_pos++; + if (ctx->x_pos >= filter->na) + ctx->x_pos = 0; + ctx->x[ctx->x_pos] = x0; + } + if (ctx->y) { + ctx->y_pos++; + if (ctx->y_pos >= filter->nb) + ctx->y_pos = 0; + + ctx->y[ctx->y_pos] = val; + } + + return val; +} + +#define DEFINE_PROCESS_FUNC(width,ctype) \ +static void \ +process_##width (GstAudioFXBaseIIRFilter * filter, \ + g##ctype * data, guint num_samples) \ +{ \ + gint i, j, channels = GST_AUDIO_FILTER (filter)->format.channels; \ + gdouble val; \ + \ + for (i = 0; i < num_samples / channels; i++) { \ + for (j = 0; j < channels; j++) { \ + val = process (filter, &filter->channels[j], *data); \ + *data++ = val; \ + } \ + } \ +} + +DEFINE_PROCESS_FUNC (32, float); +DEFINE_PROCESS_FUNC (64, double); + +#undef DEFINE_PROCESS_FUNC + +/* GstBaseTransform vmethod implementations */ +static GstFlowReturn +gst_audio_fx_base_iir_filter_transform_ip (GstBaseTransform * base, + GstBuffer * buf) +{ + GstAudioFXBaseIIRFilter *filter = GST_AUDIO_FX_BASE_IIR_FILTER (base); + guint num_samples; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + num_samples = + GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); + + if (gst_base_transform_is_passthrough (base)) + return GST_FLOW_OK; + + g_return_val_if_fail (filter->a != NULL, GST_FLOW_ERROR); + + filter->process (filter, GST_BUFFER_DATA (buf), num_samples); + + return GST_FLOW_OK; +} + + +static gboolean +gst_audio_fx_base_iir_filter_stop (GstBaseTransform * base) +{ + GstAudioFXBaseIIRFilter *filter = GST_AUDIO_FX_BASE_IIR_FILTER (base); + guint channels = GST_AUDIO_FILTER (filter)->format.channels; + GstAudioFXBaseIIRFilterChannelCtx *ctx; + guint i; + + /* Reset the history of input and output values if + * already existing */ + if (channels && filter->channels) { + for (i = 0; i < channels; i++) { + ctx = &filter->channels[i]; + g_free (ctx->x); + g_free (ctx->y); + } + g_free (filter->channels); + } + filter->channels = NULL; + + return TRUE; +} diff --git a/gst/audiofx/audiofxbaseiirfilter.h b/gst/audiofx/audiofxbaseiirfilter.h new file mode 100644 index 0000000..0534343 --- /dev/null +++ b/gst/audiofx/audiofxbaseiirfilter.h @@ -0,0 +1,77 @@ +/* + * GStreamer + * Copyright (C) 2007-2009 Sebastian Dröge + * + * 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_AUDIO_FX_BASE_IIR_FILTER_H__ +#define __GST_AUDIO_FX_BASE_IIR_FILTER_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_FX_BASE_IIR_FILTER (gst_audio_fx_base_iir_filter_get_type()) +#define GST_AUDIO_FX_BASE_IIR_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_FX_BASE_IIR_FILTER,GstAudioFXBaseIIRFilter)) +#define GST_IS_AUDIO_FX_BASE_IIR_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_FX_BASE_IIR_FILTER)) +#define GST_AUDIO_FX_BASE_IIR_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_FX_BASE_IIR_FILTER,GstAudioFXBaseIIRFilterClass)) +#define GST_IS_AUDIO_FX_BASE_IIR_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_FX_BASE_IIR_FILTER)) +#define GST_AUDIO_FX_BASE_IIR_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_FX_BASE_IIR_FILTER,GstAudioFXBaseIIRFilterClass)) +typedef struct _GstAudioFXBaseIIRFilter GstAudioFXBaseIIRFilter; +typedef struct _GstAudioFXBaseIIRFilterClass GstAudioFXBaseIIRFilterClass; + +typedef void (*GstAudioFXBaseIIRFilterProcessFunc) (GstAudioFXBaseIIRFilter *, guint8 *, guint); + +typedef struct +{ + gdouble *x; + gint x_pos; + gdouble *y; + gint y_pos; +} GstAudioFXBaseIIRFilterChannelCtx; + +struct _GstAudioFXBaseIIRFilter +{ + GstAudioFilter audiofilter; + + /* < private > */ + GstAudioFXBaseIIRFilterProcessFunc process; + + gboolean have_coeffs; + gdouble *a; + guint na; + gdouble *b; + guint nb; + GstAudioFXBaseIIRFilterChannelCtx *channels; + guint nchannels; +}; + +struct _GstAudioFXBaseIIRFilterClass +{ + GstAudioFilterClass parent; +}; + +GType gst_audio_fx_base_iir_filter_get_type (void); +void gst_audio_fx_base_iir_filter_set_coefficients (GstAudioFXBaseIIRFilter *filter, gdouble *a, guint na, gdouble *b, guint nb); +gdouble gst_audio_fx_base_iir_filter_calculate_gain (gdouble *a, guint na, gdouble *b, guint nb, gdouble zr, gdouble zi); + +G_END_DECLS + +#endif /* __GST_AUDIO_FX_BASE_IIR_FILTER_H__ */ diff --git a/gst/audiofx/audioiirfilter.c b/gst/audiofx/audioiirfilter.c new file mode 100644 index 0000000..ff5f9ca --- /dev/null +++ b/gst/audiofx/audioiirfilter.c @@ -0,0 +1,287 @@ +/* + * GStreamer + * Copyright (C) 2009 Sebastian Dröge + * + * 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-audioiirfilter + * + * audioiirfilter implements a generic audio IIR filter. Before usage the + * "a" and "b" properties have to be set to the filter coefficients that + * should be used. + * + * The filter coefficients describe the numerator and denominator of the + * transfer function. + * + * To change the filter coefficients whenever the sampling rate changes the + * "rate-changed" signal can be used. This should be done for most + * IIR filters as they're depending on the sampling rate. + * + * + * Example application + * |[ + * + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "audioiirfilter.h" + +#include "gst/glib-compat-private.h" + +#define GST_CAT_DEFAULT gst_audio_iir_filter_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + SIGNAL_RATE_CHANGED, + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_A, + PROP_B +}; + +static guint gst_audio_iir_filter_signals[LAST_SIGNAL] = { 0, }; + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_iir_filter_debug, "audioiirfilter", 0, \ + "Generic audio IIR filter plugin"); + +GST_BOILERPLATE_FULL (GstAudioIIRFilter, gst_audio_iir_filter, GstAudioFilter, + GST_TYPE_AUDIO_FX_BASE_IIR_FILTER, DEBUG_INIT); + +static void gst_audio_iir_filter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_iir_filter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_audio_iir_filter_finalize (GObject * object); + +static gboolean gst_audio_iir_filter_setup (GstAudioFilter * base, + GstRingBufferSpec * format); + +/* Element class */ +static void +gst_audio_iir_filter_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "Audio IIR filter", "Filter/Effect/Audio", + "Generic audio IIR filter with custom filter kernel", + "Sebastian Dröge "); +} + +static void +gst_audio_iir_filter_class_init (GstAudioIIRFilterClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; + + gobject_class->set_property = gst_audio_iir_filter_set_property; + gobject_class->get_property = gst_audio_iir_filter_get_property; + gobject_class->finalize = gst_audio_iir_filter_finalize; + + g_object_class_install_property (gobject_class, PROP_A, + g_param_spec_value_array ("a", "A", + "Filter coefficients (numerator of transfer function)", + g_param_spec_double ("Coefficient", "Filter Coefficient", + "Filter coefficient", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS), + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_B, + g_param_spec_value_array ("b", "B", + "Filter coefficients (denominator of transfer function)", + g_param_spec_double ("Coefficient", "Filter Coefficient", + "Filter coefficient", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS), + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_iir_filter_setup); + + /** + * GstAudioIIRFilter::rate-changed: + * @filter: the filter on which the signal is emitted + * @rate: the new sampling rate + * + * Will be emitted when the sampling rate changes. The callbacks + * will be called from the streaming thread and processing will + * stop until the event is handled. + */ + gst_audio_iir_filter_signals[SIGNAL_RATE_CHANGED] = + g_signal_new ("rate-changed", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAudioIIRFilterClass, rate_changed), + NULL, NULL, gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); +} + +static void +gst_audio_iir_filter_update_coefficients (GstAudioIIRFilter * self, + GValueArray * va, GValueArray * vb) +{ + gdouble *a = NULL, *b = NULL; + guint i; + + if (va) { + if (self->a) + g_value_array_free (self->a); + + self->a = va; + } + if (vb) { + if (self->b) + g_value_array_free (self->b); + + self->b = vb; + } + + if (self->a && self->a->n_values > 0) { + a = g_new (gdouble, self->a->n_values); + + for (i = 0; i < self->a->n_values; i++) { + GValue *v = g_value_array_get_nth (self->a, i); + a[i] = g_value_get_double (v); + } + } + + if (self->b && self->b->n_values > 0) { + b = g_new (gdouble, self->b->n_values); + for (i = 0; i < self->b->n_values; i++) { + GValue *v = g_value_array_get_nth (self->b, i); + b[i] = g_value_get_double (v); + } + } + + gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER + (self), a, (self->a) ? self->a->n_values : 0, b, + (self->b) ? self->b->n_values : 0); +} + +static void +gst_audio_iir_filter_init (GstAudioIIRFilter * self, + GstAudioIIRFilterClass * g_class) +{ + GValue v = { 0, }; + GValueArray *a, *b; + + a = g_value_array_new (1); + + g_value_init (&v, G_TYPE_DOUBLE); + g_value_set_double (&v, 1.0); + g_value_array_append (a, &v); + g_value_unset (&v); + + b = NULL; + gst_audio_iir_filter_update_coefficients (self, a, b); + + self->lock = g_mutex_new (); +} + +/* GstAudioFilter vmethod implementations */ + +/* get notified of caps and plug in the correct process function */ +static gboolean +gst_audio_iir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioIIRFilter *self = GST_AUDIO_IIR_FILTER (base); + + if (self->rate != format->rate) { + g_signal_emit (G_OBJECT (self), + gst_audio_iir_filter_signals[SIGNAL_RATE_CHANGED], 0, format->rate); + self->rate = format->rate; + } + + return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); +} + +static void +gst_audio_iir_filter_finalize (GObject * object) +{ + GstAudioIIRFilter *self = GST_AUDIO_IIR_FILTER (object); + + g_mutex_free (self->lock); + self->lock = NULL; + + if (self->a) + g_value_array_free (self->a); + self->a = NULL; + if (self->b) + g_value_array_free (self->b); + self->b = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_audio_iir_filter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioIIRFilter *self = GST_AUDIO_IIR_FILTER (object); + + g_return_if_fail (GST_IS_AUDIO_IIR_FILTER (self)); + + switch (prop_id) { + case PROP_A: + g_mutex_lock (self->lock); + gst_audio_iir_filter_update_coefficients (self, g_value_dup_boxed (value), + NULL); + g_mutex_unlock (self->lock); + break; + case PROP_B: + g_mutex_lock (self->lock); + gst_audio_iir_filter_update_coefficients (self, NULL, + g_value_dup_boxed (value)); + g_mutex_unlock (self->lock); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_iir_filter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioIIRFilter *self = GST_AUDIO_IIR_FILTER (object); + + switch (prop_id) { + case PROP_A: + g_value_set_boxed (value, self->a); + break; + case PROP_B: + g_value_set_boxed (value, self->b); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/audiofx/audioiirfilter.h b/gst/audiofx/audioiirfilter.h new file mode 100644 index 0000000..607edf2 --- /dev/null +++ b/gst/audiofx/audioiirfilter.h @@ -0,0 +1,71 @@ +/* + * GStreamer + * Copyright (C) 2009 Sebastian Dröge + * + * 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_AUDIO_IIR_FILTER_H__ +#define __GST_AUDIO_IIR_FILTER_H__ + +#include +#include + +#include "audiofxbaseiirfilter.h" + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_IIR_FILTER \ + (gst_audio_iir_filter_get_type()) +#define GST_AUDIO_IIR_FILTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_IIR_FILTER,GstAudioIIRFilter)) +#define GST_AUDIO_IIR_FILTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_IIR_FILTER,GstAudioIIRFilterClass)) +#define GST_IS_AUDIO_IIR_FILTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_IIR_FILTER)) +#define GST_IS_AUDIO_IIR_FILTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_IIR_FILTER)) + +typedef struct _GstAudioIIRFilter GstAudioIIRFilter; +typedef struct _GstAudioIIRFilterClass GstAudioIIRFilterClass; + +/** + * GstAudioIIRFilter: + * + * Opaque data structure. + */ +struct _GstAudioIIRFilter { + GstAudioFXBaseIIRFilter parent; + + GValueArray *a, *b; + + /* < private > */ + GMutex *lock; + gint rate; +}; + +struct _GstAudioIIRFilterClass { + GstAudioFXBaseIIRFilterClass parent; + + void (*rate_changed) (GstElement * element, gint rate); +}; + +GType gst_audio_iir_filter_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIO_IIR_FILTER_H__ */ diff --git a/gst/audiofx/audioinvert.c b/gst/audiofx/audioinvert.c new file mode 100644 index 0000000..c0a7da4 --- /dev/null +++ b/gst/audiofx/audioinvert.c @@ -0,0 +1,260 @@ +/* + * GStreamer + * Copyright (C) 2007 Sebastian Dröge + * Copyright (C) 2006 Stefan Kost + * + * 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-audioinvert + * + * Swaps upper and lower half of audio samples. Mixing an inverted sample on top of + * the original with a slight delay can produce effects that sound like resonance. + * Creating a stereo sample from a mono source, with one channel inverted produces wide-stereo sounds. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc wave=saw ! audioinvert invert=0.4 ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audioinvert invert=0.4 ! alsasink + * gst-launch audiotestsrc wave=saw ! audioconvert ! audioinvert invert=0.4 ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "audioinvert.h" + +#define GST_CAT_DEFAULT gst_audio_invert_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_DEGREE +}; + +#define ALLOWED_CAPS \ + "audio/x-raw-int," \ + " depth=(int)16," \ + " width=(int)16," \ + " endianness=(int)BYTE_ORDER," \ + " signed=(bool)TRUE," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]; " \ + "audio/x-raw-float," \ + " width=(int)32," \ + " endianness=(int)BYTE_ORDER," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]" + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_invert_debug, "audioinvert", 0, "audioinvert element"); + +GST_BOILERPLATE_FULL (GstAudioInvert, gst_audio_invert, GstAudioFilter, + GST_TYPE_AUDIO_FILTER, DEBUG_INIT); + +static void gst_audio_invert_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_invert_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_audio_invert_setup (GstAudioFilter * filter, + GstRingBufferSpec * format); +static GstFlowReturn gst_audio_invert_transform_ip (GstBaseTransform * base, + GstBuffer * buf); + +static void gst_audio_invert_transform_int (GstAudioInvert * filter, + gint16 * data, guint num_samples); +static void gst_audio_invert_transform_float (GstAudioInvert * filter, + gfloat * data, guint num_samples); + +/* GObject vmethod implementations */ + +static void +gst_audio_invert_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstCaps *caps; + + gst_element_class_set_details_simple (element_class, "Audio inversion", + "Filter/Effect/Audio", + "Swaps upper and lower half of audio samples", + "Sebastian Dröge "); + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), + caps); + gst_caps_unref (caps); +} + +static void +gst_audio_invert_class_init (GstAudioInvertClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + gobject_class->set_property = gst_audio_invert_set_property; + gobject_class->get_property = gst_audio_invert_get_property; + + g_object_class_install_property (gobject_class, PROP_DEGREE, + g_param_spec_float ("degree", "Degree", + "Degree of inversion", 0.0, 1.0, + 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + GST_AUDIO_FILTER_CLASS (klass)->setup = + GST_DEBUG_FUNCPTR (gst_audio_invert_setup); + GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = + GST_DEBUG_FUNCPTR (gst_audio_invert_transform_ip); +} + +static void +gst_audio_invert_init (GstAudioInvert * filter, GstAudioInvertClass * klass) +{ + filter->degree = 0.0; + gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); + gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); +} + +static void +gst_audio_invert_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioInvert *filter = GST_AUDIO_INVERT (object); + + switch (prop_id) { + case PROP_DEGREE: + filter->degree = g_value_get_float (value); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), + filter->degree == 0.0); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_invert_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioInvert *filter = GST_AUDIO_INVERT (object); + + switch (prop_id) { + case PROP_DEGREE: + g_value_set_float (value, filter->degree); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstAudioFilter vmethod implementations */ + +static gboolean +gst_audio_invert_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioInvert *filter = GST_AUDIO_INVERT (base); + gboolean ret = TRUE; + + if (format->type == GST_BUFTYPE_FLOAT && format->width == 32) + filter->process = (GstAudioInvertProcessFunc) + gst_audio_invert_transform_float; + else if (format->type == GST_BUFTYPE_LINEAR && format->width == 16) + filter->process = (GstAudioInvertProcessFunc) + gst_audio_invert_transform_int; + else + ret = FALSE; + + return ret; +} + +static void +gst_audio_invert_transform_int (GstAudioInvert * filter, + gint16 * data, guint num_samples) +{ + gint i; + gfloat dry = 1.0 - filter->degree; + glong val; + + for (i = 0; i < num_samples; i++) { + val = (*data) * dry + (-1 - (*data)) * filter->degree; + *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); + } +} + +static void +gst_audio_invert_transform_float (GstAudioInvert * filter, + gfloat * data, guint num_samples) +{ + gint i; + gfloat dry = 1.0 - filter->degree; + glong val; + + for (i = 0; i < num_samples; i++) { + val = (*data) * dry - (*data) * filter->degree; + *data++ = val; + } +} + +/* GstBaseTransform vmethod implementations */ +static GstFlowReturn +gst_audio_invert_transform_ip (GstBaseTransform * base, GstBuffer * buf) +{ + GstAudioInvert *filter = GST_AUDIO_INVERT (base); + guint num_samples; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + num_samples = + GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); + + if (gst_base_transform_is_passthrough (base) || + G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) + return GST_FLOW_OK; + + filter->process (filter, GST_BUFFER_DATA (buf), num_samples); + + return GST_FLOW_OK; +} diff --git a/gst/audiofx/audioinvert.h b/gst/audiofx/audioinvert.h new file mode 100644 index 0000000..b0d841a --- /dev/null +++ b/gst/audiofx/audioinvert.h @@ -0,0 +1,60 @@ +/* + * GStreamer + * Copyright (C) 2007 Sebastian Dröge + * Copyright (C) 2006 Stefan Kost + * + * 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_AUDIO_INVERT_H__ +#define __GST_AUDIO_INVERT_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_AUDIO_INVERT (gst_audio_invert_get_type()) +#define GST_AUDIO_INVERT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_INVERT,GstAudioInvert)) +#define GST_IS_AUDIO_INVERT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_INVERT)) +#define GST_AUDIO_INVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_INVERT,GstAudioInvertClass)) +#define GST_IS_AUDIO_INVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_INVERT)) +#define GST_AUDIO_INVERT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_INVERT,GstAudioInvertClass)) +typedef struct _GstAudioInvert GstAudioInvert; +typedef struct _GstAudioInvertClass GstAudioInvertClass; + +typedef void (*GstAudioInvertProcessFunc) (GstAudioInvert *, guint8 *, guint); + +struct _GstAudioInvert +{ + GstAudioFilter audiofilter; + + gfloat degree; + + /* < private > */ + GstAudioInvertProcessFunc process; +}; + +struct _GstAudioInvertClass +{ + GstAudioFilterClass parent; +}; + +GType gst_audio_invert_get_type (void); + +G_END_DECLS +#endif /* __GST_AUDIO_INVERT_H__ */ diff --git a/gst/audiofx/audiokaraoke.c b/gst/audiofx/audiokaraoke.c new file mode 100644 index 0000000..c6fb93e --- /dev/null +++ b/gst/audiofx/audiokaraoke.c @@ -0,0 +1,363 @@ +/* + * GStreamer + * Copyright (C) 2008 Wim Taymans + * + * 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-audiokaraoke + * + * Remove the voice from audio by filtering the center channel. + * This plugin is useful for karaoke applications. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audiokaraoke ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include +#include +#include + +#include "audiokaraoke.h" + +#define GST_CAT_DEFAULT gst_audio_karaoke_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_LEVEL 1.0 +#define DEFAULT_MONO_LEVEL 1.0 +#define DEFAULT_FILTER_BAND 220.0 +#define DEFAULT_FILTER_WIDTH 100.0 + +enum +{ + PROP_0, + PROP_LEVEL, + PROP_MONO_LEVEL, + PROP_FILTER_BAND, + PROP_FILTER_WIDTH, + PROP_LAST +}; + +#define ALLOWED_CAPS \ + "audio/x-raw-int," \ + " depth=(int)16," \ + " width=(int)16," \ + " endianness=(int)BYTE_ORDER," \ + " signed=(bool)TRUE," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]; " \ + "audio/x-raw-float," \ + " width=(int)32," \ + " endianness=(int)BYTE_ORDER," \ + " rate=(int)[1,MAX]," \ + " channels=(int)[1,MAX]" + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_karaoke_debug, "audiokaraoke", 0, "audiokaraoke element"); + +GST_BOILERPLATE_FULL (GstAudioKaraoke, gst_audio_karaoke, GstAudioFilter, + GST_TYPE_AUDIO_FILTER, DEBUG_INIT); + +static void gst_audio_karaoke_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_karaoke_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_audio_karaoke_setup (GstAudioFilter * filter, + GstRingBufferSpec * format); +static GstFlowReturn gst_audio_karaoke_transform_ip (GstBaseTransform * base, + GstBuffer * buf); + +static void gst_audio_karaoke_transform_int (GstAudioKaraoke * filter, + gint16 * data, guint num_samples); +static void gst_audio_karaoke_transform_float (GstAudioKaraoke * filter, + gfloat * data, guint num_samples); + +/* GObject vmethod implementations */ + +static void +gst_audio_karaoke_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstCaps *caps; + + gst_element_class_set_details_simple (element_class, "AudioKaraoke", + "Filter/Effect/Audio", + "Removes voice from sound", "Wim Taymans "); + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), + caps); + gst_caps_unref (caps); +} + +static void +gst_audio_karaoke_class_init (GstAudioKaraokeClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + gobject_class->set_property = gst_audio_karaoke_set_property; + gobject_class->get_property = gst_audio_karaoke_get_property; + + g_object_class_install_property (gobject_class, PROP_LEVEL, + g_param_spec_float ("level", "Level", + "Level of the effect (1.0 = full)", 0.0, 1.0, DEFAULT_LEVEL, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_MONO_LEVEL, + g_param_spec_float ("mono-level", "Mono Level", + "Level of the mono channel (1.0 = full)", 0.0, 1.0, DEFAULT_LEVEL, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_FILTER_BAND, + g_param_spec_float ("filter-band", "Filter Band", + "The Frequency band of the filter", 0.0, 441.0, DEFAULT_FILTER_BAND, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_FILTER_WIDTH, + g_param_spec_float ("filter-width", "Filter Width", + "The Frequency width of the filter", 0.0, 100.0, DEFAULT_FILTER_WIDTH, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + GST_AUDIO_FILTER_CLASS (klass)->setup = + GST_DEBUG_FUNCPTR (gst_audio_karaoke_setup); + GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = + GST_DEBUG_FUNCPTR (gst_audio_karaoke_transform_ip); +} + +static void +gst_audio_karaoke_init (GstAudioKaraoke * filter, GstAudioKaraokeClass * klass) +{ + gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); + gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); + + filter->level = DEFAULT_LEVEL; + filter->mono_level = DEFAULT_MONO_LEVEL; + filter->filter_band = DEFAULT_FILTER_BAND; + filter->filter_width = DEFAULT_FILTER_WIDTH; +} + +static void +update_filter (GstAudioKaraoke * filter, gint rate) +{ + gfloat A, B, C; + + if (rate == 0) + return; + + C = exp (-2 * G_PI * filter->filter_width / rate); + B = -4 * C / (1 + C) * cos (2 * G_PI * filter->filter_band / rate); + A = sqrt (1 - B * B / (4 * C)) * (1 - C); + + filter->A = A; + filter->B = B; + filter->C = C; + filter->y1 = 0.0; + filter->y2 = 0.0; +} + +static void +gst_audio_karaoke_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioKaraoke *filter; + + filter = GST_AUDIO_KARAOKE (object); + + switch (prop_id) { + case PROP_LEVEL: + filter->level = g_value_get_float (value); + break; + case PROP_MONO_LEVEL: + filter->mono_level = g_value_get_float (value); + break; + case PROP_FILTER_BAND: + filter->filter_band = g_value_get_float (value); + update_filter (filter, filter->rate); + break; + case PROP_FILTER_WIDTH: + filter->filter_width = g_value_get_float (value); + update_filter (filter, filter->rate); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_karaoke_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioKaraoke *filter; + + filter = GST_AUDIO_KARAOKE (object); + + switch (prop_id) { + case PROP_LEVEL: + g_value_set_float (value, filter->level); + break; + case PROP_MONO_LEVEL: + g_value_set_float (value, filter->mono_level); + break; + case PROP_FILTER_BAND: + g_value_set_float (value, filter->filter_band); + break; + case PROP_FILTER_WIDTH: + g_value_set_float (value, filter->filter_width); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstAudioFilter vmethod implementations */ + +static gboolean +gst_audio_karaoke_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioKaraoke *filter = GST_AUDIO_KARAOKE (base); + gboolean ret = TRUE; + + filter->channels = format->channels; + filter->rate = format->rate; + + if (format->type == GST_BUFTYPE_FLOAT && format->width == 32) + filter->process = (GstAudioKaraokeProcessFunc) + gst_audio_karaoke_transform_float; + else if (format->type == GST_BUFTYPE_LINEAR && format->width == 16) + filter->process = (GstAudioKaraokeProcessFunc) + gst_audio_karaoke_transform_int; + else + ret = FALSE; + + update_filter (filter, format->rate); + + return ret; +} + +static void +gst_audio_karaoke_transform_int (GstAudioKaraoke * filter, + gint16 * data, guint num_samples) +{ + gint i, l, r, o, x; + gint channels; + gdouble y; + gint level; + + channels = filter->channels; + level = filter->level * 256; + + for (i = 0; i < num_samples; i += channels) { + /* get left and right inputs */ + l = data[i]; + r = data[i + 1]; + /* do filtering */ + x = (l + r) / 2; + y = (filter->A * x - filter->B * filter->y1) - filter->C * filter->y2; + filter->y2 = filter->y1; + filter->y1 = y; + /* filter mono signal */ + o = (int) (y * filter->mono_level); + o = CLAMP (o, G_MININT16, G_MAXINT16); + o = (o * level) >> 8; + /* now cut the center */ + x = l - ((r * level) >> 8) + o; + r = r - ((l * level) >> 8) + o; + data[i] = CLAMP (x, G_MININT16, G_MAXINT16); + data[i + 1] = CLAMP (r, G_MININT16, G_MAXINT16); + } +} + +static void +gst_audio_karaoke_transform_float (GstAudioKaraoke * filter, + gfloat * data, guint num_samples) +{ + gint i; + gint channels; + gdouble l, r, o; + gdouble y; + + channels = filter->channels; + + for (i = 0; i < num_samples; i += channels) { + /* get left and right inputs */ + l = data[i]; + r = data[i + 1]; + /* do filtering */ + y = (filter->A * ((l + r) / 2.0) - filter->B * filter->y1) - + filter->C * filter->y2; + filter->y2 = filter->y1; + filter->y1 = y; + /* filter mono signal */ + o = y * filter->mono_level * filter->level; + /* now cut the center */ + data[i] = l - (r * filter->level) + o; + data[i + 1] = r - (l * filter->level) + o; + } +} + +/* GstBaseTransform vmethod implementations */ +static GstFlowReturn +gst_audio_karaoke_transform_ip (GstBaseTransform * base, GstBuffer * buf) +{ + GstAudioKaraoke *filter = GST_AUDIO_KARAOKE (base); + guint num_samples; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + num_samples = + GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); + + if (gst_base_transform_is_passthrough (base) || + G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) + return GST_FLOW_OK; + + filter->process (filter, GST_BUFFER_DATA (buf), num_samples); + + return GST_FLOW_OK; +} diff --git a/gst/audiofx/audiokaraoke.h b/gst/audiofx/audiokaraoke.h new file mode 100644 index 0000000..727fafa --- /dev/null +++ b/gst/audiofx/audiokaraoke.h @@ -0,0 +1,70 @@ +/* + * GStreamer + * Copyright (C) 2008 Wim Taymans + * + * 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_AUDIO_KARAOKE_H__ +#define __GST_AUDIO_KARAOKE_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_AUDIO_KARAOKE (gst_audio_karaoke_get_type()) +#define GST_AUDIO_KARAOKE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_KARAOKE,GstAudioKaraoke)) +#define GST_IS_AUDIO_KARAOKE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_KARAOKE)) +#define GST_AUDIO_KARAOKE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_KARAOKE,GstAudioKaraokeClass)) +#define GST_IS_AUDIO_KARAOKE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_KARAOKE)) +#define GST_AUDIO_KARAOKE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_KARAOKE,GstAudioKaraokeClass)) +typedef struct _GstAudioKaraoke GstAudioKaraoke; +typedef struct _GstAudioKaraokeClass GstAudioKaraokeClass; + +typedef void (*GstAudioKaraokeProcessFunc) (GstAudioKaraoke *, guint8 *, guint); + +struct _GstAudioKaraoke +{ + GstAudioFilter audiofilter; + + gint channels; + gint rate; + + /* properties */ + gfloat level; + gfloat mono_level; + gfloat filter_band; + gfloat filter_width; + + /* filter coef */ + gfloat A, B, C; + gfloat y1, y2; + + /* < private > */ + GstAudioKaraokeProcessFunc process; +}; + +struct _GstAudioKaraokeClass +{ + GstAudioFilterClass parent; +}; + +GType gst_audio_karaoke_get_type (void); + +G_END_DECLS +#endif /* __GST_AUDIO_KARAOKE_H__ */ diff --git a/gst/audiofx/audiopanorama.c b/gst/audiofx/audiopanorama.c new file mode 100644 index 0000000..f64eaa4 --- /dev/null +++ b/gst/audiofx/audiopanorama.c @@ -0,0 +1,680 @@ +/* + * GStreamer + * Copyright (C) 2006 Stefan Kost + * Copyright (C) 2006 Sebastian Dröge + * + * 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-audiopanorama + * + * Stereo panorama effect with controllable pan position. One can choose between the default psychoacoustic panning method, + * which keeps the same perceived loudness, and a simple panning method that just controls the volume on one channel. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc wave=saw ! audiopanorama panorama=-1.00 ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiopanorama panorama=-1.00 ! alsasink + * gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama panorama=-1.00 ! audioconvert ! alsasink + * gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama method=simple panorama=-0.50 ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "audiopanorama.h" + +#define GST_CAT_DEFAULT gst_audio_panorama_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_PANORAMA, + PROP_METHOD +}; + +enum +{ + METHOD_PSYCHOACOUSTIC = 0, + METHOD_SIMPLE, + NUM_METHODS +}; + +#define GST_TYPE_AUDIO_PANORAMA_METHOD (gst_audio_panorama_method_get_type ()) +static GType +gst_audio_panorama_method_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {METHOD_PSYCHOACOUSTIC, "Psychoacoustic Panning (default)", + "psychoacoustic"}, + {METHOD_SIMPLE, "Simple Panning", "simple"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioPanoramaMethod", values); + } + return gtype; +} + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, 2 ], " + "endianness = (int) BYTE_ORDER, " "width = (int) 32; " + "audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, 2 ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) true") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) 2, " + "endianness = (int) BYTE_ORDER, " "width = (int) 32; " + "audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) 2, " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) true") + ); + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_panorama_debug, "audiopanorama", 0, "audiopanorama element"); + +GST_BOILERPLATE_FULL (GstAudioPanorama, gst_audio_panorama, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); + +static void gst_audio_panorama_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_panorama_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_audio_panorama_get_unit_size (GstBaseTransform * base, + GstCaps * caps, guint * size); +static GstCaps *gst_audio_panorama_transform_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps); +static gboolean gst_audio_panorama_set_caps (GstBaseTransform * base, + GstCaps * incaps, GstCaps * outcaps); + +static void gst_audio_panorama_transform_m2s_int (GstAudioPanorama * filter, + gint16 * idata, gint16 * odata, guint num_samples); +static void gst_audio_panorama_transform_s2s_int (GstAudioPanorama * filter, + gint16 * idata, gint16 * odata, guint num_samples); +static void gst_audio_panorama_transform_m2s_float (GstAudioPanorama * filter, + gfloat * idata, gfloat * odata, guint num_samples); +static void gst_audio_panorama_transform_s2s_float (GstAudioPanorama * filter, + gfloat * idata, gfloat * odata, guint num_samples); + +static void gst_audio_panorama_transform_m2s_int_simple (GstAudioPanorama * + filter, gint16 * idata, gint16 * odata, guint num_samples); +static void gst_audio_panorama_transform_s2s_int_simple (GstAudioPanorama * + filter, gint16 * idata, gint16 * odata, guint num_samples); +static void gst_audio_panorama_transform_m2s_float_simple (GstAudioPanorama * + filter, gfloat * idata, gfloat * odata, guint num_samples); +static void gst_audio_panorama_transform_s2s_float_simple (GstAudioPanorama * + filter, gfloat * idata, gfloat * odata, guint num_samples); + +static GstFlowReturn gst_audio_panorama_transform (GstBaseTransform * base, + GstBuffer * inbuf, GstBuffer * outbuf); + + +/* Table with processing functions: [channels][format][method] */ +static GstAudioPanoramaProcessFunc panorama_process_functions[2][2][2] = { + { + {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_m2s_int, + (GstAudioPanoramaProcessFunc) + gst_audio_panorama_transform_m2s_int_simple}, + {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_m2s_float, + (GstAudioPanoramaProcessFunc) + gst_audio_panorama_transform_m2s_float_simple} + }, + { + {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_s2s_int, + (GstAudioPanoramaProcessFunc) + gst_audio_panorama_transform_s2s_int_simple}, + {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_s2s_float, + (GstAudioPanoramaProcessFunc) + gst_audio_panorama_transform_s2s_float_simple} + } +}; + +/* GObject vmethod implementations */ + +static void +gst_audio_panorama_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_set_details_simple (element_class, "Stereo positioning", + "Filter/Effect/Audio", + "Positions audio streams in the stereo panorama", + "Stefan Kost "); +} + +static void +gst_audio_panorama_class_init (GstAudioPanoramaClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + gobject_class->set_property = gst_audio_panorama_set_property; + gobject_class->get_property = gst_audio_panorama_get_property; + + g_object_class_install_property (gobject_class, PROP_PANORAMA, + g_param_spec_float ("panorama", "Panorama", + "Position in stereo panorama (-1.0 left -> 1.0 right)", -1.0, 1.0, + 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + /** + * GstAudioPanorama:method + * + * Panning method: psychoacoustic mode keeps the same perceived loudness, + * while simple mode just controls the volume of one channel. It's merely + * a matter of taste which method should be chosen. + * + * Since: 0.10.6 + **/ + g_object_class_install_property (gobject_class, PROP_METHOD, + g_param_spec_enum ("method", "Panning method", + "Psychoacoustic mode keeps same perceived loudness, " + "simple mode just controls volume of one channel.", + GST_TYPE_AUDIO_PANORAMA_METHOD, METHOD_PSYCHOACOUSTIC, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_BASE_TRANSFORM_CLASS (klass)->get_unit_size = + GST_DEBUG_FUNCPTR (gst_audio_panorama_get_unit_size); + GST_BASE_TRANSFORM_CLASS (klass)->transform_caps = + GST_DEBUG_FUNCPTR (gst_audio_panorama_transform_caps); + GST_BASE_TRANSFORM_CLASS (klass)->set_caps = + GST_DEBUG_FUNCPTR (gst_audio_panorama_set_caps); + GST_BASE_TRANSFORM_CLASS (klass)->transform = + GST_DEBUG_FUNCPTR (gst_audio_panorama_transform); +} + +static void +gst_audio_panorama_init (GstAudioPanorama * filter, + GstAudioPanoramaClass * klass) +{ + + filter->panorama = 0; + filter->method = METHOD_PSYCHOACOUSTIC; + filter->width = 0; + filter->channels = 0; + filter->format_float = FALSE; + filter->process = NULL; + + gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); +} + +static gboolean +gst_audio_panorama_set_process_function (GstAudioPanorama * filter) +{ + gint channel_index, format_index, method_index; + + /* set processing function */ + channel_index = filter->channels - 1; + if (channel_index > 1 || channel_index < 0) { + filter->process = NULL; + return FALSE; + } + + format_index = (filter->format_float) ? 1 : 0; + + method_index = filter->method; + if (method_index >= NUM_METHODS || method_index < 0) + method_index = METHOD_PSYCHOACOUSTIC; + + filter->process = + panorama_process_functions[channel_index][format_index][method_index]; + return TRUE; +} + +static void +gst_audio_panorama_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioPanorama *filter = GST_AUDIO_PANORAMA (object); + + switch (prop_id) { + case PROP_PANORAMA: + filter->panorama = g_value_get_float (value); + break; + case PROP_METHOD: + filter->method = g_value_get_enum (value); + gst_audio_panorama_set_process_function (filter); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_panorama_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioPanorama *filter = GST_AUDIO_PANORAMA (object); + + switch (prop_id) { + case PROP_PANORAMA: + g_value_set_float (value, filter->panorama); + break; + case PROP_METHOD: + g_value_set_enum (value, filter->method); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstBaseTransform vmethod implementations */ + +static gboolean +gst_audio_panorama_get_unit_size (GstBaseTransform * base, GstCaps * caps, + guint * size) +{ + gint width, channels; + GstStructure *structure; + gboolean ret; + + g_assert (size); + + /* this works for both float and int */ + structure = gst_caps_get_structure (caps, 0); + ret = gst_structure_get_int (structure, "width", &width); + ret &= gst_structure_get_int (structure, "channels", &channels); + + *size = width * channels / 8; + + return ret; +} + +static GstCaps * +gst_audio_panorama_transform_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps) +{ + GstCaps *res; + GstStructure *structure; + + /* transform caps gives one single caps so we can just replace + * the channel property with our range. */ + res = gst_caps_copy (caps); + structure = gst_caps_get_structure (res, 0); + if (direction == GST_PAD_SRC) { + GST_INFO ("allow 1-2 channels"); + gst_structure_set (structure, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); + } else { + GST_INFO ("allow 2 channels"); + gst_structure_set (structure, "channels", G_TYPE_INT, 2, NULL); + } + + return res; +} + +static gboolean +gst_audio_panorama_set_caps (GstBaseTransform * base, GstCaps * incaps, + GstCaps * outcaps) +{ + GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base); + const GstStructure *structure; + gboolean ret; + gint width; + const gchar *fmt; + + /*GST_INFO ("incaps are %" GST_PTR_FORMAT, incaps); */ + + structure = gst_caps_get_structure (incaps, 0); + ret = gst_structure_get_int (structure, "channels", &filter->channels); + if (!ret) + goto no_channels; + + ret = gst_structure_get_int (structure, "width", &width); + if (!ret) + goto no_width; + filter->width = width / 8; + + fmt = gst_structure_get_name (structure); + if (!strcmp (fmt, "audio/x-raw-int")) + filter->format_float = FALSE; + else + filter->format_float = TRUE; + + GST_DEBUG ("try to process %s input with %d channels", fmt, filter->channels); + + ret = gst_audio_panorama_set_process_function (filter); + + if (!ret) + GST_WARNING ("can't process input with %d channels", filter->channels); + + return ret; + +no_channels: + GST_DEBUG ("no channels in caps"); + return ret; +no_width: + GST_DEBUG ("no width in caps"); + return ret; +} + +/* psychoacoustic processing functions */ +static void +gst_audio_panorama_transform_m2s_int (GstAudioPanorama * filter, gint16 * idata, + gint16 * odata, guint num_samples) +{ + guint i; + gdouble val; + glong lval, rval; + gdouble rpan, lpan; + + /* pan: -1.0 0.0 1.0 + * lpan: 1.0 0.5 0.0 + * rpan: 0.0 0.5 1.0 + * + * FIXME: we should use -3db (1/sqtr(2)) for 50:50 + */ + rpan = (gdouble) (filter->panorama + 1.0) / 2.0; + lpan = 1.0 - rpan; + + for (i = 0; i < num_samples; i++) { + val = (gdouble) * idata++; + + lval = (glong) (val * lpan); + rval = (glong) (val * rpan); + + *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16); + *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16); + } +} + +static void +gst_audio_panorama_transform_s2s_int (GstAudioPanorama * filter, gint16 * idata, + gint16 * odata, guint num_samples) +{ + guint i; + glong lval, rval; + gdouble lival, rival; + gdouble lrpan, llpan, rrpan, rlpan; + + /* pan: -1.0 0.0 1.0 + * llpan: 1.0 1.0 0.0 + * lrpan: 1.0 0.0 0.0 + * rrpan: 0.0 1.0 1.0 + * rlpan: 0.0 0.0 1.0 + */ + if (filter->panorama > 0) { + rlpan = (gdouble) filter->panorama; + llpan = 1.0 - rlpan; + lrpan = 0.0; + rrpan = 1.0; + } else { + rrpan = (gdouble) (1.0 + filter->panorama); + lrpan = 1.0 - rrpan; + rlpan = 0.0; + llpan = 1.0; + } + + for (i = 0; i < num_samples; i++) { + lival = (gdouble) * idata++; + rival = (gdouble) * idata++; + + lval = lival * llpan + rival * lrpan; + rval = lival * rlpan + rival * rrpan; + + *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16); + *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16); + } +} + +static void +gst_audio_panorama_transform_m2s_float (GstAudioPanorama * filter, + gfloat * idata, gfloat * odata, guint num_samples) +{ + guint i; + gfloat val; + gdouble rpan, lpan; + + /* pan: -1.0 0.0 1.0 + * lpan: 1.0 0.5 0.0 + * rpan: 0.0 0.5 1.0 + * + * FIXME: we should use -3db (1/sqtr(2)) for 50:50 + */ + rpan = (gdouble) (filter->panorama + 1.0) / 2.0; + lpan = 1.0 - rpan; + + for (i = 0; i < num_samples; i++) { + val = *idata++; + + *odata++ = val * lpan; + *odata++ = val * rpan; + } +} + +static void +gst_audio_panorama_transform_s2s_float (GstAudioPanorama * filter, + gfloat * idata, gfloat * odata, guint num_samples) +{ + guint i; + gfloat lival, rival; + gdouble lrpan, llpan, rrpan, rlpan; + + /* pan: -1.0 0.0 1.0 + * llpan: 1.0 1.0 0.0 + * lrpan: 1.0 0.0 0.0 + * rrpan: 0.0 1.0 1.0 + * rlpan: 0.0 0.0 1.0 + */ + if (filter->panorama > 0) { + rlpan = (gdouble) filter->panorama; + llpan = 1.0 - rlpan; + lrpan = 0.0; + rrpan = 1.0; + } else { + rrpan = (gdouble) (1.0 + filter->panorama); + lrpan = 1.0 - rrpan; + rlpan = 0.0; + llpan = 1.0; + } + + for (i = 0; i < num_samples; i++) { + lival = *idata++; + rival = *idata++; + + *odata++ = lival * llpan + rival * lrpan; + *odata++ = lival * rlpan + rival * rrpan; + } +} + +/* simple processing functions */ +static void +gst_audio_panorama_transform_m2s_int_simple (GstAudioPanorama * filter, + gint16 * idata, gint16 * odata, guint num_samples) +{ + guint i; + gdouble pan; + glong lval, rval; + + if (filter->panorama > 0.0) { + pan = 1.0 - filter->panorama; + for (i = 0; i < num_samples; i++) { + rval = *idata++; + lval = (glong) ((gdouble) rval * pan); + + *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16); + *odata++ = (gint16) rval; + } + } else { + pan = 1.0 + filter->panorama; + for (i = 0; i < num_samples; i++) { + lval = *idata++; + rval = (glong) ((gdouble) lval * pan); + + *odata++ = (gint16) lval; + *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16); + } + } +} + +static void +gst_audio_panorama_transform_s2s_int_simple (GstAudioPanorama * filter, + gint16 * idata, gint16 * odata, guint num_samples) +{ + guint i; + glong lval, rval; + gdouble lival, rival, pan; + + if (filter->panorama > 0.0) { + pan = 1.0 - filter->panorama; + for (i = 0; i < num_samples; i++) { + lival = (gdouble) * idata++; + rival = (gdouble) * idata++; + + lval = (glong) (lival * pan); + rval = (glong) rival; + + *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16); + *odata++ = (gint16) rval; + } + } else { + pan = 1.0 + filter->panorama; + for (i = 0; i < num_samples; i++) { + lival = (gdouble) * idata++; + rival = (gdouble) * idata++; + + lval = (glong) lival; + rval = (glong) (rival * pan); + + *odata++ = (gint16) lval; + *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16); + } + } +} + +static void +gst_audio_panorama_transform_m2s_float_simple (GstAudioPanorama * filter, + gfloat * idata, gfloat * odata, guint num_samples) +{ + guint i; + gfloat val, pan; + + if (filter->panorama > 0.0) { + pan = 1.0 - filter->panorama; + for (i = 0; i < num_samples; i++) { + val = *idata++; + + *odata++ = val * pan; + *odata++ = val; + } + } else { + pan = 1.0 + filter->panorama; + for (i = 0; i < num_samples; i++) { + val = *idata++; + + *odata++ = val; + *odata++ = val * pan; + } + } +} + +static void +gst_audio_panorama_transform_s2s_float_simple (GstAudioPanorama * filter, + gfloat * idata, gfloat * odata, guint num_samples) +{ + guint i; + gfloat lival, rival, pan; + + if (filter->panorama > 0.0) { + pan = 1.0 - filter->panorama; + for (i = 0; i < num_samples; i++) { + lival = *idata++; + rival = *idata++; + + *odata++ = lival * pan; + *odata++ = rival; + } + } else { + pan = 1.0 + filter->panorama; + for (i = 0; i < num_samples; i++) { + lival = *idata++; + rival = *idata++; + + *odata++ = lival; + *odata++ = rival * pan; + } + } +} + +/* this function does the actual processing + */ +static GstFlowReturn +gst_audio_panorama_transform (GstBaseTransform * base, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base); + guint num_samples = GST_BUFFER_SIZE (outbuf) / (2 * filter->width); + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (inbuf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP))) { + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP); + memset (GST_BUFFER_DATA (outbuf), 0, GST_BUFFER_SIZE (outbuf)); + return GST_FLOW_OK; + } + + filter->process (filter, GST_BUFFER_DATA (inbuf), + GST_BUFFER_DATA (outbuf), num_samples); + + return GST_FLOW_OK; +} diff --git a/gst/audiofx/audiopanorama.h b/gst/audiofx/audiopanorama.h new file mode 100644 index 0000000..b3cd183 --- /dev/null +++ b/gst/audiofx/audiopanorama.h @@ -0,0 +1,62 @@ +/* + * GStreamer + * Copyright (C) 2006 Stefan Kost + * + * 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_AUDIO_PANORAMA_H__ +#define __GST_AUDIO_PANORAMA_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_PANORAMA (gst_audio_panorama_get_type()) +#define GST_AUDIO_PANORAMA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_PANORAMA,GstAudioPanorama)) +#define GST_IS_AUDIO_PANORAMA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_PANORAMA)) +#define GST_AUDIO_PANORAMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_PANORAMA,GstAudioPanoramaClass)) +#define GST_IS_AUDIO_PANORAMA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_PANORAMA)) +#define GST_AUDIO_PANORAMA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_PANORAMA,GstAudioPanoramaClass)) + +typedef struct _GstAudioPanorama GstAudioPanorama; +typedef struct _GstAudioPanoramaClass GstAudioPanoramaClass; + +typedef void (*GstAudioPanoramaProcessFunc)(GstAudioPanorama*, guint8*, guint8*, guint); + +struct _GstAudioPanorama { + GstBaseTransform element; + + gfloat panorama; + + /* < private > */ + GstAudioPanoramaProcessFunc process; + gint channels; + gboolean format_float; + gint width; + gint method; +}; + +struct _GstAudioPanoramaClass { + GstBaseTransformClass parent_class; +}; + +GType gst_audio_panorama_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIO_PANORAMA_H__ */ diff --git a/gst/audiofx/audiowsincband.c b/gst/audiofx/audiowsincband.c new file mode 100644 index 0000000..3f94988 --- /dev/null +++ b/gst/audiofx/audiowsincband.c @@ -0,0 +1,485 @@ +/* -*- c-basic-offset: 2 -*- + * + * GStreamer + * Copyright (C) 1999-2001 Erik Walthinsen + * 2006 Dreamlab Technologies Ltd. + * 2007-2009 Sebastian Dröge + * + * 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 windowed sinc filter is taken from the freely downloadable DSP book, + * "The Scientist and Engineer's Guide to Digital Signal Processing", + * chapter 16 + * available at http://www.dspguide.com/ + * + * For the window functions see + * http://en.wikipedia.org/wiki/Window_function + */ + +/** + * SECTION:element-audiowsincband + * + * Attenuates all frequencies outside (bandpass) or inside (bandreject) of a frequency + * band. The length parameter controls the rolloff, the window parameter + * controls rolloff and stopband attenuation. The Hamming window provides a faster rolloff but a bit + * worse stopband attenuation, the other way around for the Blackman window. + * + * This element has the advantage over the Chebyshev bandpass and bandreject filter that it has + * a much better rolloff when using a larger kernel size and almost linear phase. The only + * disadvantage is the much slower execution time with larger kernels. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiosincband mode=band-pass lower-frequency=3000 upper-frequency=10000 length=501 window=blackman ! audioconvert ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiowsincband mode=band-reject lower-frequency=59 upper-frequency=61 length=10001 window=hamming ! audioconvert ! alsasink + * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiowsincband mode=band-pass lower-frequency=1000 upper-frequency=2000 length=31 ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "audiowsincband.h" + +#include "gst/glib-compat-private.h" + +#define GST_CAT_DEFAULT gst_gst_audio_wsincband_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + PROP_0, + PROP_LENGTH, + PROP_LOWER_FREQUENCY, + PROP_UPPER_FREQUENCY, + PROP_MODE, + PROP_WINDOW +}; + +enum +{ + MODE_BAND_PASS = 0, + MODE_BAND_REJECT +}; + +#define GST_TYPE_AUDIO_WSINC_BAND_MODE (gst_gst_audio_wsincband_mode_get_type ()) +static GType +gst_gst_audio_wsincband_mode_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {MODE_BAND_PASS, "Band pass (default)", + "band-pass"}, + {MODE_BAND_REJECT, "Band reject", + "band-reject"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioWSincBandMode", values); + } + return gtype; +} + +enum +{ + WINDOW_HAMMING = 0, + WINDOW_BLACKMAN, + WINDOW_GAUSSIAN, + WINDOW_COSINE, + WINDOW_HANN +}; + +#define GST_TYPE_AUDIO_WSINC_BAND_WINDOW (gst_gst_audio_wsincband_window_get_type ()) +static GType +gst_gst_audio_wsincband_window_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {WINDOW_HAMMING, "Hamming window (default)", + "hamming"}, + {WINDOW_BLACKMAN, "Blackman window", + "blackman"}, + {WINDOW_GAUSSIAN, "Gaussian window", + "gaussian"}, + {WINDOW_COSINE, "Cosine window", + "cosine"}, + {WINDOW_HANN, "Hann window", + "hann"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioWSincBandWindow", values); + } + return gtype; +} + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_gst_audio_wsincband_debug, "audiowsincband", 0, \ + "Band-pass and Band-reject Windowed sinc filter plugin"); + +GST_BOILERPLATE_FULL (GstAudioWSincBand, gst_audio_wsincband, GstAudioFilter, + GST_TYPE_AUDIO_FX_BASE_FIR_FILTER, DEBUG_INIT); + +static void gst_audio_wsincband_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_wsincband_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_audio_wsincband_finalize (GObject * object); + +static gboolean gst_audio_wsincband_setup (GstAudioFilter * base, + GstRingBufferSpec * format); + + +#define POW2(x) (x)*(x) + +/* Element class */ +static void +gst_audio_wsincband_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "Band pass & band reject filter", "Filter/Effect/Audio", + "Band pass and band reject windowed sinc filter", + "Thomas Vander Stichele , " + "Steven W. Smith, " + "Dreamlab Technologies Ltd. , " + "Sebastian Dröge "); +} + +static void +gst_audio_wsincband_class_init (GstAudioWSincBandClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; + + gobject_class->set_property = gst_audio_wsincband_set_property; + gobject_class->get_property = gst_audio_wsincband_get_property; + gobject_class->finalize = gst_audio_wsincband_finalize; + + /* FIXME: Don't use the complete possible range but restrict the upper boundary + * so automatically generated UIs can use a slider */ + g_object_class_install_property (gobject_class, PROP_LOWER_FREQUENCY, + g_param_spec_float ("lower-frequency", "Lower Frequency", + "Cut-off lower frequency (Hz)", 0.0, 100000.0, 0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_UPPER_FREQUENCY, + g_param_spec_float ("upper-frequency", "Upper Frequency", + "Cut-off upper frequency (Hz)", 0.0, 100000.0, 0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_LENGTH, + g_param_spec_int ("length", "Length", + "Filter kernel length, will be rounded to the next odd number", 3, + 256000, 101, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Band pass or band reject mode", GST_TYPE_AUDIO_WSINC_BAND_MODE, + MODE_BAND_PASS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_WINDOW, + g_param_spec_enum ("window", "Window", + "Window function to use", GST_TYPE_AUDIO_WSINC_BAND_WINDOW, + WINDOW_HAMMING, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_wsincband_setup); +} + +static void +gst_audio_wsincband_init (GstAudioWSincBand * self, + GstAudioWSincBandClass * g_class) +{ + self->kernel_length = 101; + self->lower_frequency = 0.0; + self->upper_frequency = 0.0; + self->mode = MODE_BAND_PASS; + self->window = WINDOW_HAMMING; + + self->lock = g_mutex_new (); +} + +static void +gst_audio_wsincband_build_kernel (GstAudioWSincBand * self) +{ + gint i = 0; + gdouble sum = 0.0; + gint len = 0; + gdouble *kernel_lp, *kernel_hp; + gdouble w; + gdouble *kernel; + + len = self->kernel_length; + + if (GST_AUDIO_FILTER (self)->format.rate == 0) { + GST_DEBUG ("rate not set yet"); + return; + } + + if (GST_AUDIO_FILTER (self)->format.channels == 0) { + GST_DEBUG ("channels not set yet"); + return; + } + + /* Clamp frequencies */ + self->lower_frequency = + CLAMP (self->lower_frequency, 0.0, + GST_AUDIO_FILTER (self)->format.rate / 2); + self->upper_frequency = + CLAMP (self->upper_frequency, 0.0, + GST_AUDIO_FILTER (self)->format.rate / 2); + if (self->lower_frequency > self->upper_frequency) { + gint tmp = self->lower_frequency; + + self->lower_frequency = self->upper_frequency; + self->upper_frequency = tmp; + } + + GST_DEBUG ("gst_audio_wsincband: initializing filter kernel of length %d " + "with lower frequency %.2lf Hz " + ", upper frequency %.2lf Hz for mode %s", + len, self->lower_frequency, self->upper_frequency, + (self->mode == MODE_BAND_PASS) ? "band-pass" : "band-reject"); + + /* fill the lp kernel */ + w = 2 * G_PI * (self->lower_frequency / GST_AUDIO_FILTER (self)->format.rate); + kernel_lp = g_new (gdouble, len); + for (i = 0; i < len; ++i) { + if (i == (len - 1) / 2.0) + kernel_lp[i] = w; + else + kernel_lp[i] = sin (w * (i - (len - 1) / 2.0)) / (i - (len - 1) / 2.0); + + /* windowing */ + switch (self->window) { + case WINDOW_HAMMING: + kernel_lp[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / (len - 1))); + break; + case WINDOW_BLACKMAN: + kernel_lp[i] *= (0.42 - 0.5 * cos (2 * G_PI * i / (len - 1)) + + 0.08 * cos (4 * G_PI * i / (len - 1))); + break; + case WINDOW_GAUSSIAN: + kernel_lp[i] *= exp (-0.5 * POW2 (3.0 / len * (2 * i - (len - 1)))); + break; + case WINDOW_COSINE: + kernel_lp[i] *= cos (G_PI * i / (len - 1) - G_PI / 2); + break; + case WINDOW_HANN: + kernel_lp[i] *= 0.5 * (1 - cos (2 * G_PI * i / (len - 1))); + break; + } + } + + /* normalize for unity gain at DC */ + sum = 0.0; + for (i = 0; i < len; ++i) + sum += kernel_lp[i]; + for (i = 0; i < len; ++i) + kernel_lp[i] /= sum; + + /* fill the hp kernel */ + w = 2 * G_PI * (self->upper_frequency / GST_AUDIO_FILTER (self)->format.rate); + kernel_hp = g_new (gdouble, len); + for (i = 0; i < len; ++i) { + if (i == (len - 1) / 2.0) + kernel_hp[i] = w; + else + kernel_hp[i] = sin (w * (i - (len - 1) / 2.0)) / (i - (len - 1) / 2.0); + + /* Windowing */ + switch (self->window) { + case WINDOW_HAMMING: + kernel_hp[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / (len - 1))); + break; + case WINDOW_BLACKMAN: + kernel_hp[i] *= (0.42 - 0.5 * cos (2 * G_PI * i / (len - 1)) + + 0.08 * cos (4 * G_PI * i / (len - 1))); + break; + case WINDOW_GAUSSIAN: + kernel_hp[i] *= exp (-0.5 * POW2 (3.0 / len * (2 * i - (len - 1)))); + break; + case WINDOW_COSINE: + kernel_hp[i] *= cos (G_PI * i / (len - 1) - G_PI / 2); + break; + case WINDOW_HANN: + kernel_hp[i] *= 0.5 * (1 - cos (2 * G_PI * i / (len - 1))); + break; + } + } + + /* normalize for unity gain at DC */ + sum = 0.0; + for (i = 0; i < len; ++i) + sum += kernel_hp[i]; + for (i = 0; i < len; ++i) + kernel_hp[i] /= sum; + + /* do spectral inversion to go from lowpass to highpass */ + for (i = 0; i < len; ++i) + kernel_hp[i] = -kernel_hp[i]; + if (len % 2 == 1) { + kernel_hp[(len - 1) / 2] += 1.0; + } else { + kernel_hp[len / 2 - 1] += 0.5; + kernel_hp[len / 2] += 0.5; + } + + /* combine the two kernels */ + kernel = g_new (gdouble, len); + + for (i = 0; i < len; ++i) + kernel[i] = kernel_lp[i] + kernel_hp[i]; + + /* free the helper kernels */ + g_free (kernel_lp); + g_free (kernel_hp); + + /* do spectral inversion to go from bandreject to bandpass + * if specified */ + if (self->mode == MODE_BAND_PASS) { + for (i = 0; i < len; ++i) + kernel[i] = -kernel[i]; + kernel[len / 2] += 1; + } + + gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self), + kernel, self->kernel_length, (len - 1) / 2); +} + +/* GstAudioFilter vmethod implementations */ + +/* get notified of caps and plug in the correct process function */ +static gboolean +gst_audio_wsincband_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (base); + + gst_audio_wsincband_build_kernel (self); + + return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); +} + +static void +gst_audio_wsincband_finalize (GObject * object) +{ + GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (object); + + g_mutex_free (self->lock); + self->lock = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_audio_wsincband_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (object); + + g_return_if_fail (GST_IS_AUDIO_WSINC_BAND (self)); + + switch (prop_id) { + case PROP_LENGTH:{ + gint val; + + g_mutex_lock (self->lock); + val = g_value_get_int (value); + if (val % 2 == 0) + val++; + + if (val != self->kernel_length) { + gst_audio_fx_base_fir_filter_push_residue (GST_AUDIO_FX_BASE_FIR_FILTER + (self)); + self->kernel_length = val; + gst_audio_wsincband_build_kernel (self); + } + g_mutex_unlock (self->lock); + break; + } + case PROP_LOWER_FREQUENCY: + g_mutex_lock (self->lock); + self->lower_frequency = g_value_get_float (value); + gst_audio_wsincband_build_kernel (self); + g_mutex_unlock (self->lock); + break; + case PROP_UPPER_FREQUENCY: + g_mutex_lock (self->lock); + self->upper_frequency = g_value_get_float (value); + gst_audio_wsincband_build_kernel (self); + g_mutex_unlock (self->lock); + break; + case PROP_MODE: + g_mutex_lock (self->lock); + self->mode = g_value_get_enum (value); + gst_audio_wsincband_build_kernel (self); + g_mutex_unlock (self->lock); + break; + case PROP_WINDOW: + g_mutex_lock (self->lock); + self->window = g_value_get_enum (value); + gst_audio_wsincband_build_kernel (self); + g_mutex_unlock (self->lock); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_wsincband_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (object); + + switch (prop_id) { + case PROP_LENGTH: + g_value_set_int (value, self->kernel_length); + break; + case PROP_LOWER_FREQUENCY: + g_value_set_float (value, self->lower_frequency); + break; + case PROP_UPPER_FREQUENCY: + g_value_set_float (value, self->upper_frequency); + break; + case PROP_MODE: + g_value_set_enum (value, self->mode); + break; + case PROP_WINDOW: + g_value_set_enum (value, self->window); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/audiofx/audiowsincband.h b/gst/audiofx/audiowsincband.h new file mode 100644 index 0000000..b0dea00 --- /dev/null +++ b/gst/audiofx/audiowsincband.h @@ -0,0 +1,80 @@ +/* -*- c-basic-offset: 2 -*- + * + * GStreamer + * Copyright (C) 1999-2001 Erik Walthinsen + * 2006 Dreamlab Technologies Ltd. + * 2007-2009 Sebastian Dröge + * + * 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 windowed sinc filter is taken from the freely downloadable DSP book, + * "The Scientist and Engineer's Guide to Digital Signal Processing", + * chapter 16 + * available at http://www.dspguide.com/ + * + */ + +#ifndef __GST_AUDIO_WSINC_BAND_H__ +#define __GST_AUDIO_WSINC_BAND_H__ + +#include +#include + +#include "audiofxbasefirfilter.h" + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_WSINC_BAND \ + (gst_audio_wsincband_get_type()) +#define GST_AUDIO_WSINC_BAND(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_WSINC_BAND,GstAudioWSincBand)) +#define GST_AUDIO_WSINC_BAND_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_WSINC_BAND,GstAudioWSincBandClass)) +#define GST_IS_AUDIO_WSINC_BAND(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_WSINC_BAND)) +#define GST_IS_AUDIO_WSINC_BAND_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_WSINC_BAND)) + +typedef struct _GstAudioWSincBand GstAudioWSincBand; +typedef struct _GstAudioWSincBandClass GstAudioWSincBandClass; + +/** + * GstAudioWSincBand: + * + * Opaque data structure. + */ +struct _GstAudioWSincBand { + GstAudioFXBaseFIRFilter parent; + + gint mode; + gint window; + gfloat lower_frequency, upper_frequency; + gint kernel_length; /* length of the filter kernel */ + + /* < private > */ + GMutex *lock; +}; + +struct _GstAudioWSincBandClass { + GstAudioFilterClass parent; +}; + +GType gst_audio_wsincband_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIO_WSINC_BAND_H__ */ diff --git a/gst/audiofx/audiowsinclimit.c b/gst/audiofx/audiowsinclimit.c new file mode 100644 index 0000000..ad60569 --- /dev/null +++ b/gst/audiofx/audiowsinclimit.c @@ -0,0 +1,409 @@ +/* -*- c-basic-offset: 2 -*- + * + * GStreamer + * Copyright (C) 1999-2001 Erik Walthinsen + * 2006 Dreamlab Technologies Ltd. + * 2007-2009 Sebastian Dröge + * + * 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 windowed sinc filter is taken from the freely downloadable DSP book, + * "The Scientist and Engineer's Guide to Digital Signal Processing", + * chapter 16 + * available at http://www.dspguide.com/ + * + * For the window functions see + * http://en.wikipedia.org/wiki/Window_function + */ + +/** + * SECTION:element-audiowsinclimit + * + * Attenuates all frequencies above the cutoff frequency (low-pass) or all frequencies below the + * cutoff frequency (high-pass). The length parameter controls the rolloff, the window parameter + * controls rolloff and stopband attenuation. The Hamming window provides a faster rolloff but a bit + * worse stopband attenuation, the other way around for the Blackman window. + * + * This element has the advantage over the Chebyshev lowpass and highpass filter that it has + * a much better rolloff when using a larger kernel size and almost linear phase. The only + * disadvantage is the much slower execution time with larger kernels. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiowsinclimit mode=low-pass frequency=1000 length=501 ! audioconvert ! alsasink + * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiowsinclimit mode=high-pass frequency=15000 length=501 ! audioconvert ! alsasink + * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiowsinclimit mode=low-pass frequency=1000 length=10001 window=blackman ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "audiowsinclimit.h" + +#include "gst/glib-compat-private.h" + +#define GST_CAT_DEFAULT gst_audio_wsinclimit_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + PROP_0, + PROP_LENGTH, + PROP_FREQUENCY, + PROP_MODE, + PROP_WINDOW +}; + +enum +{ + MODE_LOW_PASS = 0, + MODE_HIGH_PASS +}; + +#define GST_TYPE_AUDIO_WSINC_LIMIT_MODE (gst_audio_wsinclimit_mode_get_type ()) +static GType +gst_audio_wsinclimit_mode_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {MODE_LOW_PASS, "Low pass (default)", + "low-pass"}, + {MODE_HIGH_PASS, "High pass", + "high-pass"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioWSincLimitMode", values); + } + return gtype; +} + +enum +{ + WINDOW_HAMMING = 0, + WINDOW_BLACKMAN, + WINDOW_GAUSSIAN, + WINDOW_COSINE, + WINDOW_HANN +}; + +#define GST_TYPE_AUDIO_WSINC_LIMIT_WINDOW (gst_audio_wsinclimit_window_get_type ()) +static GType +gst_audio_wsinclimit_window_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {WINDOW_HAMMING, "Hamming window (default)", + "hamming"}, + {WINDOW_BLACKMAN, "Blackman window", + "blackman"}, + {WINDOW_GAUSSIAN, "Gaussian window", + "gaussian"}, + {WINDOW_COSINE, "Cosine window", + "cosine"}, + {WINDOW_HANN, "Hann window", + "hann"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstAudioWSincLimitWindow", values); + } + return gtype; +} + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_audio_wsinclimit_debug, "audiowsinclimit", 0, \ + "Low-pass and High-pass Windowed sinc filter plugin"); + +GST_BOILERPLATE_FULL (GstAudioWSincLimit, gst_audio_wsinclimit, GstAudioFilter, + GST_TYPE_AUDIO_FX_BASE_FIR_FILTER, DEBUG_INIT); + +static void gst_audio_wsinclimit_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_audio_wsinclimit_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_audio_wsinclimit_finalize (GObject * object); + +static gboolean gst_audio_wsinclimit_setup (GstAudioFilter * base, + GstRingBufferSpec * format); + + +#define POW2(x) (x)*(x) + +/* Element class */ + +static void +gst_audio_wsinclimit_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "Low pass & high pass filter", "Filter/Effect/Audio", + "Low pass and high pass windowed sinc filter", + "Thomas Vander Stichele , " + "Steven W. Smith, " + "Dreamlab Technologies Ltd. , " + "Sebastian Dröge "); +} + +static void +gst_audio_wsinclimit_class_init (GstAudioWSincLimitClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; + + gobject_class->set_property = gst_audio_wsinclimit_set_property; + gobject_class->get_property = gst_audio_wsinclimit_get_property; + gobject_class->finalize = gst_audio_wsinclimit_finalize; + + /* FIXME: Don't use the complete possible range but restrict the upper boundary + * so automatically generated UIs can use a slider */ + g_object_class_install_property (gobject_class, PROP_FREQUENCY, + g_param_spec_float ("cutoff", "Cutoff", + "Cut-off Frequency (Hz)", 0.0, 100000.0, 0.0, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_LENGTH, + g_param_spec_int ("length", "Length", + "Filter kernel length, will be rounded to the next odd number", + 3, 256000, 101, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Low pass or high pass mode", GST_TYPE_AUDIO_WSINC_LIMIT_MODE, + MODE_LOW_PASS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_WINDOW, + g_param_spec_enum ("window", "Window", + "Window function to use", GST_TYPE_AUDIO_WSINC_LIMIT_WINDOW, + WINDOW_HAMMING, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_wsinclimit_setup); +} + +static void +gst_audio_wsinclimit_init (GstAudioWSincLimit * self, + GstAudioWSincLimitClass * g_class) +{ + self->mode = MODE_LOW_PASS; + self->window = WINDOW_HAMMING; + self->kernel_length = 101; + self->cutoff = 0.0; + + self->lock = g_mutex_new (); +} + +static void +gst_audio_wsinclimit_build_kernel (GstAudioWSincLimit * self) +{ + gint i = 0; + gdouble sum = 0.0; + gint len = 0; + gdouble w; + gdouble *kernel = NULL; + + len = self->kernel_length; + + if (GST_AUDIO_FILTER (self)->format.rate == 0) { + GST_DEBUG ("rate not set yet"); + return; + } + + if (GST_AUDIO_FILTER (self)->format.channels == 0) { + GST_DEBUG ("channels not set yet"); + return; + } + + /* Clamp cutoff frequency between 0 and the nyquist frequency */ + self->cutoff = + CLAMP (self->cutoff, 0.0, GST_AUDIO_FILTER (self)->format.rate / 2); + + GST_DEBUG ("gst_audio_wsinclimit_: initializing filter kernel of length %d " + "with cutoff %.2lf Hz " + "for mode %s", + len, self->cutoff, + (self->mode == MODE_LOW_PASS) ? "low-pass" : "high-pass"); + + /* fill the kernel */ + w = 2 * G_PI * (self->cutoff / GST_AUDIO_FILTER (self)->format.rate); + + kernel = g_new (gdouble, len); + + for (i = 0; i < len; ++i) { + if (i == (len - 1) / 2.0) + kernel[i] = w; + else + kernel[i] = sin (w * (i - (len - 1) / 2)) / (i - (len - 1) / 2.0); + + /* windowing */ + switch (self->window) { + case WINDOW_HAMMING: + kernel[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / (len - 1))); + break; + case WINDOW_BLACKMAN: + kernel[i] *= (0.42 - 0.5 * cos (2 * G_PI * i / (len - 1)) + + 0.08 * cos (4 * G_PI * i / (len - 1))); + break; + case WINDOW_GAUSSIAN: + kernel[i] *= exp (-0.5 * POW2 (3.0 / len * (2 * i - (len - 1)))); + break; + case WINDOW_COSINE: + kernel[i] *= cos (G_PI * i / (len - 1) - G_PI / 2); + break; + case WINDOW_HANN: + kernel[i] *= 0.5 * (1 - cos (2 * G_PI * i / (len - 1))); + break; + } + } + + /* normalize for unity gain at DC */ + for (i = 0; i < len; ++i) + sum += kernel[i]; + for (i = 0; i < len; ++i) + kernel[i] /= sum; + + /* convert to highpass if specified */ + if (self->mode == MODE_HIGH_PASS) { + for (i = 0; i < len; ++i) + kernel[i] = -kernel[i]; + + if (len % 2 == 1) { + kernel[(len - 1) / 2] += 1.0; + } else { + kernel[len / 2 - 1] += 0.5; + kernel[len / 2] += 0.5; + } + } + + gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self), + kernel, self->kernel_length, (len - 1) / 2); +} + +/* GstAudioFilter vmethod implementations */ + +/* get notified of caps and plug in the correct process function */ +static gboolean +gst_audio_wsinclimit_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (base); + + gst_audio_wsinclimit_build_kernel (self); + + return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); +} + +static void +gst_audio_wsinclimit_finalize (GObject * object) +{ + GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (object); + + g_mutex_free (self->lock); + self->lock = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_audio_wsinclimit_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (object); + + g_return_if_fail (GST_IS_AUDIO_WSINC_LIMIT (self)); + + switch (prop_id) { + case PROP_LENGTH:{ + gint val; + + g_mutex_lock (self->lock); + val = g_value_get_int (value); + if (val % 2 == 0) + val++; + + if (val != self->kernel_length) { + gst_audio_fx_base_fir_filter_push_residue (GST_AUDIO_FX_BASE_FIR_FILTER + (self)); + self->kernel_length = val; + gst_audio_wsinclimit_build_kernel (self); + } + g_mutex_unlock (self->lock); + break; + } + case PROP_FREQUENCY: + g_mutex_lock (self->lock); + self->cutoff = g_value_get_float (value); + gst_audio_wsinclimit_build_kernel (self); + g_mutex_unlock (self->lock); + break; + case PROP_MODE: + g_mutex_lock (self->lock); + self->mode = g_value_get_enum (value); + gst_audio_wsinclimit_build_kernel (self); + g_mutex_unlock (self->lock); + break; + case PROP_WINDOW: + g_mutex_lock (self->lock); + self->window = g_value_get_enum (value); + gst_audio_wsinclimit_build_kernel (self); + g_mutex_unlock (self->lock); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_audio_wsinclimit_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (object); + + switch (prop_id) { + case PROP_LENGTH: + g_value_set_int (value, self->kernel_length); + break; + case PROP_FREQUENCY: + g_value_set_float (value, self->cutoff); + break; + case PROP_MODE: + g_value_set_enum (value, self->mode); + break; + case PROP_WINDOW: + g_value_set_enum (value, self->window); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/audiofx/audiowsinclimit.h b/gst/audiofx/audiowsinclimit.h new file mode 100644 index 0000000..1a67169 --- /dev/null +++ b/gst/audiofx/audiowsinclimit.h @@ -0,0 +1,80 @@ +/* -*- c-basic-offset: 2 -*- + * + * GStreamer + * Copyright (C) 1999-2001 Erik Walthinsen + * 2006 Dreamlab Technologies Ltd. + * 2007-2009 Sebastian Dröge + * + * 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 windowed sinc filter is taken from the freely downloadable DSP book, + * "The Scientist and Engineer's Guide to Digital Signal Processing", + * chapter 16 + * available at http://www.dspguide.com/ + * + */ + +#ifndef __GST_AUDIO_WSINC_LIMIT_H__ +#define __GST_AUDIO_WSINC_LIMIT_H__ + +#include +#include + +#include "audiofxbasefirfilter.h" + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIO_WSINC_LIMIT \ + (gst_audio_wsinclimit_get_type()) +#define GST_AUDIO_WSINC_LIMIT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_WSINC_LIMIT,GstAudioWSincLimit)) +#define GST_AUDIO_WSINC_LIMIT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_WSINC_LIMIT,GstAudioWSincLimitClass)) +#define GST_IS_AUDIO_WSINC_LIMIT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_WSINC_LIMIT)) +#define GST_IS_AUDIO_WSINC_LIMIT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_WSINC_LIMIT)) + +typedef struct _GstAudioWSincLimit GstAudioWSincLimit; +typedef struct _GstAudioWSincLimitClass GstAudioWSincLimitClass; + +/** + * GstAudioWSincLimit: + * + * Opaque data structure. + */ +struct _GstAudioWSincLimit { + GstAudioFXBaseFIRFilter parent; + + gint mode; + gint window; + gfloat cutoff; + gint kernel_length; + + /* < private > */ + GMutex *lock; +}; + +struct _GstAudioWSincLimitClass { + GstAudioFXBaseFIRFilterClass parent; +}; + +GType gst_audio_wsinclimit_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIO_WSINC_LIMIT_H__ */ diff --git a/gst/audiofx/math_compat.h b/gst/audiofx/math_compat.h new file mode 100644 index 0000000..8729698 --- /dev/null +++ b/gst/audiofx/math_compat.h @@ -0,0 +1,55 @@ +/* + * GStreamer + * Copyright (C) 2008 Sebastian Dröge + * + * 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 __MATH_COMPAT_H__ +#define __MATH_COMPAT_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifndef HAVE_ASINH +static inline gdouble +asinh (gdouble x) +{ + return log(x + sqrt (x * x + 1)); +} +#endif + +#ifndef HAVE_SINH +static inline gdouble +sinh (gdouble x) +{ + return 0.5 * (exp (x) - exp (-x)); +} +#endif + +#ifndef HAVE_COSH +static inline gdouble +cosh (gdouble x) +{ + return 0.5 * (exp (x) + exp (-x)); +} +#endif + +#endif /* __MATH_COMPAT_H__ */ diff --git a/gst/audioparsers/Makefile.am b/gst/audioparsers/Makefile.am new file mode 100644 index 0000000..22bc81f --- /dev/null +++ b/gst/audioparsers/Makefile.am @@ -0,0 +1,18 @@ +plugin_LTLIBRARIES = libgstaudioparsers.la + +libgstaudioparsers_la_SOURCES = \ + gstaacparse.c gstamrparse.c gstac3parse.c \ + gstdcaparse.c gstflacparse.c gstmpegaudioparse.c \ + plugin.c + +libgstaudioparsers_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstaudioparsers_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) +libgstaudioparsers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstaudioparsers_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstaacparse.h gstamrparse.h gstac3parse.h \ + gstdcaparse.h gstflacparse.h gstmpegaudioparse.h diff --git a/gst/audioparsers/Makefile.in b/gst/audioparsers/Makefile.in new file mode 100644 index 0000000..93b2caf --- /dev/null +++ b/gst/audioparsers/Makefile.in @@ -0,0 +1,872 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/audioparsers +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstaudioparsers_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstaudioparsers_la_OBJECTS = \ + libgstaudioparsers_la-gstaacparse.lo \ + libgstaudioparsers_la-gstamrparse.lo \ + libgstaudioparsers_la-gstac3parse.lo \ + libgstaudioparsers_la-gstdcaparse.lo \ + libgstaudioparsers_la-gstflacparse.lo \ + libgstaudioparsers_la-gstmpegaudioparse.lo \ + libgstaudioparsers_la-plugin.lo +libgstaudioparsers_la_OBJECTS = $(am_libgstaudioparsers_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstaudioparsers_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) \ + $(libgstaudioparsers_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstaudioparsers_la_SOURCES) +DIST_SOURCES = $(libgstaudioparsers_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstaudioparsers.la +libgstaudioparsers_la_SOURCES = \ + gstaacparse.c gstamrparse.c gstac3parse.c \ + gstdcaparse.c gstflacparse.c gstmpegaudioparse.c \ + plugin.c + +libgstaudioparsers_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) + +libgstaudioparsers_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) + +libgstaudioparsers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstaudioparsers_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstaacparse.h gstamrparse.h gstac3parse.h \ + gstdcaparse.h gstflacparse.h gstmpegaudioparse.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/audioparsers/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/audioparsers/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstaudioparsers.la: $(libgstaudioparsers_la_OBJECTS) $(libgstaudioparsers_la_DEPENDENCIES) $(EXTRA_libgstaudioparsers_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstaudioparsers_la_LINK) -rpath $(plugindir) $(libgstaudioparsers_la_OBJECTS) $(libgstaudioparsers_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstaacparse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstac3parse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstamrparse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstdcaparse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstflacparse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstmpegaudioparse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-plugin.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstaudioparsers_la-gstaacparse.lo: gstaacparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstaacparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstaacparse.Tpo -c -o libgstaudioparsers_la-gstaacparse.lo `test -f 'gstaacparse.c' || echo '$(srcdir)/'`gstaacparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstaacparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstaacparse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstaacparse.c' object='libgstaudioparsers_la-gstaacparse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstaacparse.lo `test -f 'gstaacparse.c' || echo '$(srcdir)/'`gstaacparse.c + +libgstaudioparsers_la-gstamrparse.lo: gstamrparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstamrparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstamrparse.Tpo -c -o libgstaudioparsers_la-gstamrparse.lo `test -f 'gstamrparse.c' || echo '$(srcdir)/'`gstamrparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstamrparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstamrparse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstamrparse.c' object='libgstaudioparsers_la-gstamrparse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstamrparse.lo `test -f 'gstamrparse.c' || echo '$(srcdir)/'`gstamrparse.c + +libgstaudioparsers_la-gstac3parse.lo: gstac3parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstac3parse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstac3parse.Tpo -c -o libgstaudioparsers_la-gstac3parse.lo `test -f 'gstac3parse.c' || echo '$(srcdir)/'`gstac3parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstac3parse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstac3parse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstac3parse.c' object='libgstaudioparsers_la-gstac3parse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstac3parse.lo `test -f 'gstac3parse.c' || echo '$(srcdir)/'`gstac3parse.c + +libgstaudioparsers_la-gstdcaparse.lo: gstdcaparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstdcaparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstdcaparse.Tpo -c -o libgstaudioparsers_la-gstdcaparse.lo `test -f 'gstdcaparse.c' || echo '$(srcdir)/'`gstdcaparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstdcaparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstdcaparse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdcaparse.c' object='libgstaudioparsers_la-gstdcaparse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstdcaparse.lo `test -f 'gstdcaparse.c' || echo '$(srcdir)/'`gstdcaparse.c + +libgstaudioparsers_la-gstflacparse.lo: gstflacparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstflacparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstflacparse.Tpo -c -o libgstaudioparsers_la-gstflacparse.lo `test -f 'gstflacparse.c' || echo '$(srcdir)/'`gstflacparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstflacparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstflacparse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflacparse.c' object='libgstaudioparsers_la-gstflacparse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstflacparse.lo `test -f 'gstflacparse.c' || echo '$(srcdir)/'`gstflacparse.c + +libgstaudioparsers_la-gstmpegaudioparse.lo: gstmpegaudioparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstmpegaudioparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstmpegaudioparse.Tpo -c -o libgstaudioparsers_la-gstmpegaudioparse.lo `test -f 'gstmpegaudioparse.c' || echo '$(srcdir)/'`gstmpegaudioparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstmpegaudioparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstmpegaudioparse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmpegaudioparse.c' object='libgstaudioparsers_la-gstmpegaudioparse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstmpegaudioparse.lo `test -f 'gstmpegaudioparse.c' || echo '$(srcdir)/'`gstmpegaudioparse.c + +libgstaudioparsers_la-plugin.lo: plugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-plugin.Tpo -c -o libgstaudioparsers_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-plugin.Tpo $(DEPDIR)/libgstaudioparsers_la-plugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstaudioparsers_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/audioparsers/gstaacparse.c b/gst/audioparsers/gstaacparse.c new file mode 100644 index 0000000..b1dca6c --- /dev/null +++ b/gst/audioparsers/gstaacparse.c @@ -0,0 +1,925 @@ +/* GStreamer AAC parser plugin + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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-aacparse + * @short_description: AAC parser + * @see_also: #GstAmrParse + * + * This is an AAC parser which handles both ADIF and ADTS stream formats. + * + * As ADIF format is not framed, it is not seekable and stream duration cannot + * be determined either. However, ADTS format AAC clips can be seeked, and parser + * can also estimate playback position and clip duration. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=abc.aac ! aacparse ! faad ! audioresample ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstaacparse.h" + + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "framed = (boolean) true, " "mpegversion = (int) { 2, 4 }, " + "stream-format = (string) { raw, adts, adif };")); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, mpegversion = (int) { 2, 4 };")); + +GST_DEBUG_CATEGORY_STATIC (aacparse_debug); +#define GST_CAT_DEFAULT aacparse_debug + + +#define ADIF_MAX_SIZE 40 /* Should be enough */ +#define ADTS_MAX_SIZE 10 /* Should be enough */ + +#ifdef GST_EXT_AACPARSER_MODIFICATION /* to get more accurate duration */ +#define AAC_MAX_ESTIMATE_DURATION_BUF (1024 * 1024) /* use first 1 Mbyte */ +#define AAC_SAMPLE_PER_FRAME 1024 +#endif + +#define AAC_FRAME_DURATION(parse) (GST_SECOND/parse->frames_per_sec) + +static gboolean gst_aac_parse_start (GstBaseParse * parse); +static gboolean gst_aac_parse_stop (GstBaseParse * parse); + +static gboolean gst_aac_parse_sink_setcaps (GstBaseParse * parse, + GstCaps * caps); +static GstCaps *gst_aac_parse_sink_getcaps (GstBaseParse * parse); + +static gboolean gst_aac_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * size, gint * skipsize); + +static GstFlowReturn gst_aac_parse_parse_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); + +#define _do_init(bla) \ + GST_DEBUG_CATEGORY_INIT (aacparse_debug, "aacparse", 0, \ + "AAC audio stream parser"); + +GST_BOILERPLATE_FULL (GstAacParse, gst_aac_parse, GstBaseParse, + GST_TYPE_BASE_PARSE, _do_init); + +static inline gint +gst_aac_parse_get_sample_rate_from_index (guint sr_idx) +{ + static const guint aac_sample_rates[] = { 96000, 88200, 64000, 48000, 44100, + 32000, 24000, 22050, 16000, 12000, 11025, 8000 + }; + + if (sr_idx < G_N_ELEMENTS (aac_sample_rates)) + return aac_sample_rates[sr_idx]; + GST_WARNING ("Invalid sample rate index %u", sr_idx); + return 0; +} + +/** + * gst_aac_parse_base_init: + * @klass: #GstElementClass. + * + */ +static void +gst_aac_parse_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, + "AAC audio stream parser", "Codec/Parser/Audio", + "Advanced Audio Coding parser", "Stefan Kost "); +} + + +/** + * gst_aac_parse_class_init: + * @klass: #GstAacParseClass. + * + */ +static void +gst_aac_parse_class_init (GstAacParseClass * klass) +{ + GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + + parse_class->start = GST_DEBUG_FUNCPTR (gst_aac_parse_start); + parse_class->stop = GST_DEBUG_FUNCPTR (gst_aac_parse_stop); + parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_setcaps); + parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_getcaps); + parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_parse_frame); + parse_class->check_valid_frame = + GST_DEBUG_FUNCPTR (gst_aac_parse_check_valid_frame); +} + + +/** + * gst_aac_parse_init: + * @aacparse: #GstAacParse. + * @klass: #GstAacParseClass. + * + */ +static void +gst_aac_parse_init (GstAacParse * aacparse, GstAacParseClass * klass) +{ + GST_DEBUG ("initialized"); +#ifdef GST_EXT_AACPARSER_MODIFICATION /* to get more correct duration */ + aacparse->first_frame = TRUE; +#endif +} + + +/** + * gst_aac_parse_set_src_caps: + * @aacparse: #GstAacParse. + * @sink_caps: (proposed) caps of sink pad + * + * Set source pad caps according to current knowledge about the + * audio stream. + * + * Returns: TRUE if caps were successfully set. + */ +static gboolean +gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps) +{ + GstStructure *s; + GstCaps *src_caps = NULL; + gboolean res = FALSE; + const gchar *stream_format; + + GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps); + if (sink_caps) + src_caps = gst_caps_copy (sink_caps); + else + src_caps = gst_caps_new_simple ("audio/mpeg", NULL); + + gst_caps_set_simple (src_caps, "framed", G_TYPE_BOOLEAN, TRUE, + "mpegversion", G_TYPE_INT, aacparse->mpegversion, NULL); + + switch (aacparse->header_type) { + case DSPAAC_HEADER_NONE: + stream_format = "raw"; + break; + case DSPAAC_HEADER_ADTS: + stream_format = "adts"; + break; + case DSPAAC_HEADER_ADIF: + stream_format = "adif"; + break; + default: + stream_format = NULL; + } + + s = gst_caps_get_structure (src_caps, 0); + if (aacparse->sample_rate > 0) + gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL); + if (aacparse->channels > 0) + gst_structure_set (s, "channels", G_TYPE_INT, aacparse->channels, NULL); + if (stream_format) + gst_structure_set (s, "stream-format", G_TYPE_STRING, stream_format, NULL); + + GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps); + + res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps); + gst_caps_unref (src_caps); + return res; +} + + +/** + * gst_aac_parse_sink_setcaps: + * @sinkpad: GstPad + * @caps: GstCaps + * + * Implementation of "set_sink_caps" vmethod in #GstBaseParse class. + * + * Returns: TRUE on success. + */ +static gboolean +gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps) +{ + GstAacParse *aacparse; + GstStructure *structure; + gchar *caps_str; + const GValue *value; + + aacparse = GST_AAC_PARSE (parse); + structure = gst_caps_get_structure (caps, 0); + caps_str = gst_caps_to_string (caps); + + GST_DEBUG_OBJECT (aacparse, "setcaps: %s", caps_str); + g_free (caps_str); + + /* This is needed at least in case of RTP + * Parses the codec_data information to get ObjectType, + * number of channels and samplerate */ + value = gst_structure_get_value (structure, "codec_data"); + if (value) { + GstBuffer *buf = gst_value_get_buffer (value); + + if (buf) { + const guint8 *buffer = GST_BUFFER_DATA (buf); + guint sr_idx; + + sr_idx = ((buffer[0] & 0x07) << 1) | ((buffer[1] & 0x80) >> 7); + aacparse->object_type = (buffer[0] & 0xf8) >> 3; + aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx); + aacparse->channels = (buffer[1] & 0x78) >> 3; + aacparse->header_type = DSPAAC_HEADER_NONE; + aacparse->mpegversion = 4; + aacparse->frame_samples = (buffer[1] & 4) ? 960 : 1024; + + GST_DEBUG ("codec_data: object_type=%d, sample_rate=%d, channels=%d, " + "samples=%d", aacparse->object_type, aacparse->sample_rate, + aacparse->channels, aacparse->frame_samples); + + /* arrange for metadata and get out of the way */ + gst_aac_parse_set_src_caps (aacparse, caps); + gst_base_parse_set_passthrough (parse, TRUE); + } else + return FALSE; + + /* caps info overrides */ + gst_structure_get_int (structure, "rate", &aacparse->sample_rate); + gst_structure_get_int (structure, "channels", &aacparse->channels); + } else { + gst_base_parse_set_passthrough (parse, FALSE); + } + + return TRUE; +} + + +/** + * gst_aac_parse_adts_get_frame_len: + * @data: block of data containing an ADTS header. + * + * This function calculates ADTS frame length from the given header. + * + * Returns: size of the ADTS frame. + */ +static inline guint +gst_aac_parse_adts_get_frame_len (const guint8 * data) +{ + return ((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] & 0xe0) >> 5); +} + + +/** + * gst_aac_parse_check_adts_frame: + * @aacparse: #GstAacParse. + * @data: Data to be checked. + * @avail: Amount of data passed. + * @framesize: If valid ADTS frame was found, this will be set to tell the + * found frame size in bytes. + * @needed_data: If frame was not found, this may be set to tell how much + * more data is needed in the next round to detect the frame + * reliably. This may happen when a frame header candidate + * is found but it cannot be guaranteed to be the header without + * peeking the following data. + * + * Check if the given data contains contains ADTS frame. The algorithm + * will examine ADTS frame header and calculate the frame size. Also, another + * consecutive ADTS frame header need to be present after the found frame. + * Otherwise the data is not considered as a valid ADTS frame. However, this + * "extra check" is omitted when EOS has been received. In this case it is + * enough when data[0] contains a valid ADTS header. + * + * This function may set the #needed_data to indicate that a possible frame + * candidate has been found, but more data (#needed_data bytes) is needed to + * be absolutely sure. When this situation occurs, FALSE will be returned. + * + * When a valid frame is detected, this function will use + * gst_base_parse_set_min_frame_size() function from #GstBaseParse class + * to set the needed bytes for next frame.This way next data chunk is already + * of correct size. + * + * Returns: TRUE if the given data contains a valid ADTS header. + */ +static gboolean +gst_aac_parse_check_adts_frame (GstAacParse * aacparse, + const guint8 * data, const guint avail, gboolean drain, + guint * framesize, guint * needed_data) +{ + if (G_UNLIKELY (avail < 2)) + return FALSE; + + if ((data[0] == 0xff) && ((data[1] & 0xf6) == 0xf0)) { + *framesize = gst_aac_parse_adts_get_frame_len (data); + + /* In EOS mode this is enough. No need to examine the data further. + We also relax the check when we have sync, on the assumption that + if we're not looking at random data, we have a much higher chance + to get the correct sync, and this avoids losing two frames when + a single bit corruption happens. */ + if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) { + return TRUE; + } + + if (*framesize + ADTS_MAX_SIZE > avail) { + /* We have found a possible frame header candidate, but can't be + sure since we don't have enough data to check the next frame */ + GST_DEBUG ("NEED MORE DATA: we need %d, available %d", + *framesize + ADTS_MAX_SIZE, avail); + *needed_data = *framesize + ADTS_MAX_SIZE; + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), + *framesize + ADTS_MAX_SIZE); + return FALSE; + } + + if ((data[*framesize] == 0xff) && ((data[*framesize + 1] & 0xf6) == 0xf0)) { + guint nextlen = gst_aac_parse_adts_get_frame_len (data + (*framesize)); + + GST_LOG ("ADTS frame found, len: %d bytes", *framesize); + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), + nextlen + ADTS_MAX_SIZE); + return TRUE; + } + } + return FALSE; +} + +/* caller ensure sufficient data */ +static inline void +gst_aac_parse_parse_adts_header (GstAacParse * aacparse, const guint8 * data, + gint * rate, gint * channels, gint * object, gint * version) +{ + + if (rate) { + gint sr_idx = (data[2] & 0x3c) >> 2; + + *rate = gst_aac_parse_get_sample_rate_from_index (sr_idx); + } + if (channels) + *channels = ((data[2] & 0x01) << 2) | ((data[3] & 0xc0) >> 6); + + if (version) + *version = (data[1] & 0x08) ? 2 : 4; + if (object) + *object = (data[2] & 0xc0) >> 6; +} + +/** + * gst_aac_parse_detect_stream: + * @aacparse: #GstAacParse. + * @data: A block of data that needs to be examined for stream characteristics. + * @avail: Size of the given datablock. + * @framesize: If valid stream was found, this will be set to tell the + * first frame size in bytes. + * @skipsize: If valid stream was found, this will be set to tell the first + * audio frame position within the given data. + * + * Examines the given piece of data and try to detect the format of it. It + * checks for "ADIF" header (in the beginning of the clip) and ADTS frame + * header. If the stream is detected, TRUE will be returned and #framesize + * is set to indicate the found frame size. Additionally, #skipsize might + * be set to indicate the number of bytes that need to be skipped, a.k.a. the + * position of the frame inside given data chunk. + * + * Returns: TRUE on success. + */ +static gboolean +gst_aac_parse_detect_stream (GstAacParse * aacparse, + const guint8 * data, const guint avail, gboolean drain, + guint * framesize, gint * skipsize) +{ + gboolean found = FALSE; + guint need_data = 0; + guint i = 0; + + GST_DEBUG_OBJECT (aacparse, "Parsing header data"); + + /* FIXME: No need to check for ADIF if we are not in the beginning of the + stream */ + + /* Can we even parse the header? */ + if (avail < ADTS_MAX_SIZE) + return FALSE; + + for (i = 0; i < avail - 4; i++) { + if (((data[i] == 0xff) && ((data[i + 1] & 0xf6) == 0xf0)) || + strncmp ((char *) data + i, "ADIF", 4) == 0) { + found = TRUE; + + if (i) { + /* Trick: tell the parent class that we didn't find the frame yet, + but make it skip 'i' amount of bytes. Next time we arrive + here we have full frame in the beginning of the data. */ + *skipsize = i; + return FALSE; + } + break; + } + } + if (!found) { + if (i) + *skipsize = i; + return FALSE; + } + + if (gst_aac_parse_check_adts_frame (aacparse, data, avail, drain, + framesize, &need_data)) { + gint rate, channels; + + GST_INFO ("ADTS ID: %d, framesize: %d", (data[1] & 0x08) >> 3, *framesize); + + aacparse->header_type = DSPAAC_HEADER_ADTS; + gst_aac_parse_parse_adts_header (aacparse, data, &rate, &channels, + &aacparse->object_type, &aacparse->mpegversion); + + gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate, + aacparse->frame_samples, 2, 2); + + GST_DEBUG ("ADTS: samplerate %d, channels %d, objtype %d, version %d", + rate, channels, aacparse->object_type, aacparse->mpegversion); + + gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE); + + return TRUE; + } else if (need_data) { + /* This tells the parent class not to skip any data */ + *skipsize = 0; + return FALSE; + } + + if (avail < ADIF_MAX_SIZE) + return FALSE; + + if (memcmp (data + i, "ADIF", 4) == 0) { + const guint8 *adif; + int skip_size = 0; + int bitstream_type; + int sr_idx; + + aacparse->header_type = DSPAAC_HEADER_ADIF; + aacparse->mpegversion = 4; + + /* Skip the "ADIF" bytes */ + adif = data + i + 4; + + /* copyright string */ + if (adif[0] & 0x80) + skip_size += 9; /* skip 9 bytes */ + + bitstream_type = adif[0 + skip_size] & 0x10; + aacparse->bitrate = + ((unsigned int) (adif[0 + skip_size] & 0x0f) << 19) | + ((unsigned int) adif[1 + skip_size] << 11) | + ((unsigned int) adif[2 + skip_size] << 3) | + ((unsigned int) adif[3 + skip_size] & 0xe0); + + /* CBR */ + if (bitstream_type == 0) { +#if 0 + /* Buffer fullness parsing. Currently not needed... */ + guint num_elems = 0; + guint fullness = 0; + + num_elems = (adif[3 + skip_size] & 0x1e); + GST_INFO ("ADIF num_config_elems: %d", num_elems); + + fullness = ((unsigned int) (adif[3 + skip_size] & 0x01) << 19) | + ((unsigned int) adif[4 + skip_size] << 11) | + ((unsigned int) adif[5 + skip_size] << 3) | + ((unsigned int) (adif[6 + skip_size] & 0xe0) >> 5); + + GST_INFO ("ADIF buffer fullness: %d", fullness); +#endif + aacparse->object_type = ((adif[6 + skip_size] & 0x01) << 1) | + ((adif[7 + skip_size] & 0x80) >> 7); + sr_idx = (adif[7 + skip_size] & 0x78) >> 3; + } + /* VBR */ + else { + aacparse->object_type = (adif[4 + skip_size] & 0x18) >> 3; + sr_idx = ((adif[4 + skip_size] & 0x07) << 1) | + ((adif[5 + skip_size] & 0x80) >> 7); + } + + /* FIXME: This gives totally wrong results. Duration calculation cannot + be based on this */ + aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx); + + /* baseparse is not given any fps, + * so it will give up on timestamps, seeking, etc */ + + /* FIXME: Can we assume this? */ + aacparse->channels = 2; + + GST_INFO ("ADIF: br=%d, samplerate=%d, objtype=%d", + aacparse->bitrate, aacparse->sample_rate, aacparse->object_type); + + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 512); + + /* arrange for metadata and get out of the way */ + gst_aac_parse_set_src_caps (aacparse, + GST_PAD_CAPS (GST_BASE_PARSE_SINK_PAD (aacparse))); + + /* not syncable, not easily seekable (unless we push data from start */ + gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (aacparse), FALSE); + gst_base_parse_set_passthrough (GST_BASE_PARSE_CAST (aacparse), TRUE); + gst_base_parse_set_average_bitrate (GST_BASE_PARSE_CAST (aacparse), 0); + + *framesize = avail; + return TRUE; + } + + /* This should never happen */ + return FALSE; +} + + +/** + * gst_aac_parse_check_valid_frame: + * @parse: #GstBaseParse. + * @buffer: #GstBuffer. + * @framesize: If the buffer contains a valid frame, its size will be put here + * @skipsize: How much data parent class should skip in order to find the + * frame header. + * + * Implementation of "check_valid_frame" vmethod in #GstBaseParse class. + * + * Returns: TRUE if buffer contains a valid frame. + */ +static gboolean +gst_aac_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * framesize, gint * skipsize) +{ + const guint8 *data; + GstAacParse *aacparse; + gboolean ret = FALSE; + gboolean lost_sync; + GstBuffer *buffer; + + aacparse = GST_AAC_PARSE (parse); + buffer = frame->buffer; + data = GST_BUFFER_DATA (buffer); + + lost_sync = GST_BASE_PARSE_LOST_SYNC (parse); + + if (aacparse->header_type == DSPAAC_HEADER_ADIF || + aacparse->header_type == DSPAAC_HEADER_NONE) { + /* There is nothing to parse */ + *framesize = GST_BUFFER_SIZE (buffer); + ret = TRUE; + + } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED || lost_sync) { + + ret = gst_aac_parse_detect_stream (aacparse, data, GST_BUFFER_SIZE (buffer), + GST_BASE_PARSE_DRAINING (parse), framesize, skipsize); + + } else if (aacparse->header_type == DSPAAC_HEADER_ADTS) { + guint needed_data = 1024; + + ret = gst_aac_parse_check_adts_frame (aacparse, data, + GST_BUFFER_SIZE (buffer), GST_BASE_PARSE_DRAINING (parse), + framesize, &needed_data); + + if (!ret) { + GST_DEBUG ("buffer didn't contain valid frame"); + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), + needed_data); + } + + } else { + GST_DEBUG ("buffer didn't contain valid frame"); + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), + ADTS_MAX_SIZE); + } + + return ret; +} + + +#ifdef GST_EXT_AACPARSER_MODIFICATION /* to get more correct duration */ +/** + * get_aac_parse_get_adts_framelength: + * @data: #GstBufferData. + * @offset: #GstBufferData offset + * + * Implementation to get adts framelength by using first some frame. + * + * Returns: frame size + */ +int get_aac_parse_get_adts_frame_length (const unsigned char* data, gint64 offset) +{ + const gint adts_header_length_no_crc = 7; + const gint adts_header_length_with_crc = 9; + gint frame_size = 0; + gint protection_absent; + gint head_size; + + /* check of syncword */ + if ((data[offset+0] != 0xff) || ((data[offset+1] & 0xf6) != 0xf0)) { + return 0; + } + + /* check of protection absent */ + protection_absent = (data[offset+1] & 0x01); + + /*check of frame length */ + frame_size = (data[offset+3] & 0x3) << 11 | data[offset+4] << 3 | data[offset+5] >> 5; + + /* check of header size */ + /* protectionAbsent is 0 if there is CRC */ + head_size = protection_absent ? adts_header_length_no_crc : adts_header_length_with_crc; + if (head_size > frame_size) { + GST_ERROR("return frame length as 0 (frameSize %u < headSize %u)", frame_size, head_size); + return 0; + } + + return frame_size; +} + +/** + * gst_aac_parse_estimate_duration: + * @parse: #GstBaseParse. + * + * Implementation to get estimated total duration by using first some frame. + * + * Returns: TRUE if we can get estimated total duraion + */ +static gboolean +gst_aac_parse_estimate_duration (GstBaseParse * parse) +{ + GstFlowReturn res = GST_FLOW_OK; + gint64 pull_size = 0, file_size = 0, offset = 0, num_frames=0, duration=0; + guint profile = 0, sample_rate_index = 0, sample_rate = 0, channel = 0; + guint frame_size = 0, frame_duration_us = 0, estimated_bitrate = 0; + GstClockTime estimated_duration = GST_CLOCK_TIME_NONE; + GstBuffer *buffer = NULL; + guint8 *buf = NULL; + gint i = 0; + GstActivateMode pad_mode = GST_ACTIVATE_NONE; + GstAacParse *aacparse; + + aacparse = GST_AAC_PARSE (parse); + GST_LOG_OBJECT (aacparse, "gst_aac_parse_estimate_duration enter"); + +#ifdef GST_EXT_BASEPARSER_MODIFICATION /* check baseparse define these fuction */ + gst_base_parse_get_pad_mode(parse, &pad_mode); + if (pad_mode != GST_ACTIVATE_PULL) { + GST_INFO_OBJECT (aacparse, "aac parser is not pull mode. can not estimate duration"); + return FALSE; + } + + gst_base_parse_get_upstream_size (parse, &file_size); +#else + GST_WARNING_OBJECT (aacparse, "baseparser does not define get private param functions"); + return FALSE; +#endif + + if (file_size < ADIF_MAX_SIZE) { + GST_ERROR_OBJECT (aacparse, "file size is too short"); + return FALSE; + } + + pull_size = MIN(file_size, AAC_MAX_ESTIMATE_DURATION_BUF); + + res = gst_pad_pull_range (parse->sinkpad, 0, pull_size, &buffer); + if (res != GST_FLOW_OK) { + GST_ERROR_OBJECT (aacparse, "gst_pad_pull_range failed!"); + return FALSE; + } + + buf = GST_BUFFER_DATA(buffer); + + for (i = 0; i < pull_size; i ++) { + if ((buf[i] == 0xff) && ((buf[i+1] & 0xf6) == 0xf0)) { /* aac sync word */ + profile = (buf[i+2] >> 6) & 0x3; + sample_rate_index = (buf[i+2] >> 2) & 0xf; + sample_rate = gst_aac_parse_get_sample_rate_from_index(sample_rate_index); + channel = (buf[i+2] & 0x1) << 2 | (buf[i+3] >> 6); + + GST_INFO_OBJECT (aacparse, "found sync. aac sample_rate=%d, channel=%d", sample_rate, channel); + + /* count number of frames */ + while (offset < pull_size) { + if ((frame_size = get_aac_parse_get_adts_frame_length(buf, i + offset)) == 0) { + GST_ERROR_OBJECT (aacparse, "framesize error at offset %"G_GINT64_FORMAT, offset); + break; + } + offset += frame_size; + num_frames++; + } /* while */ + + /* if we can got full file, we can calculate the accurate duration */ + if (pull_size == file_size) { + gfloat duration_for_one_frame = 0; + GstClockTime calculated_duration = GST_CLOCK_TIME_NONE; + + GST_INFO_OBJECT (aacparse, "we got total file (%d bytes). do not estimate but make Accurate total duration.", pull_size); + + duration_for_one_frame = (gfloat)AAC_SAMPLE_PER_FRAME / (gfloat)sample_rate; + calculated_duration = num_frames * duration_for_one_frame * 1000 * 1000 * 1000; + + GST_INFO_OBJECT (aacparse, "duration_for_one_frame %f ms", duration_for_one_frame); + GST_INFO_OBJECT (aacparse, "calculated duration = %"GST_TIME_FORMAT, GST_TIME_ARGS(calculated_duration)); + gst_base_parse_set_duration (parse, GST_FORMAT_TIME, calculated_duration, 0); /* 0 means disable estimate */ + + } else { + GST_INFO_OBJECT (aacparse, "we got %d bytes in total file (%"G_GINT64_FORMAT + "). can not make accurate duration but Estimate.", pull_size, file_size); + frame_duration_us = (1024 * 1000000ll + (sample_rate - 1)) / sample_rate; + duration = num_frames * frame_duration_us; + + estimated_bitrate = (gint)((gfloat)(offset * 8) / (gfloat)(duration / 1000)); + estimated_duration = (GstClockTime)((file_size * 8) / (estimated_bitrate * 1000)) * GST_SECOND; + + GST_INFO_OBJECT (aacparse, "number of frame = %"G_GINT64_FORMAT, num_frames); + GST_INFO_OBJECT (aacparse, "duration = %"G_GINT64_FORMAT, duration / 1000000); + GST_INFO_OBJECT (aacparse, "byte = %"G_GINT64_FORMAT, offset); + GST_INFO_OBJECT (aacparse, "estimated bitrate = %d bps", estimated_bitrate); + GST_INFO_OBJECT (aacparse, "estimated duration = %"GST_TIME_FORMAT, GST_TIME_ARGS(estimated_duration)); + + gst_base_parse_set_average_bitrate (parse, estimated_bitrate * 1000); + /* set update_interval as duration(sec)/2 */ + gst_base_parse_set_duration (parse, GST_FORMAT_TIME, estimated_duration, (gint)(duration/2)); + } + + break; + } + } + + gst_buffer_unref (buffer); + return TRUE; +} +#endif + + +/** + * gst_aac_parse_parse_frame: + * @parse: #GstBaseParse. + * @buffer: #GstBuffer. + * + * Implementation of "parse_frame" vmethod in #GstBaseParse class. + * + * Also determines frame overhead. + * ADTS streams have a 7 byte header in each frame. MP4 and ADIF streams don't have + * a per-frame header. + * + * We're making a couple of simplifying assumptions: + * + * 1. We count Program Configuration Elements rather than searching for them + * in the streams to discount them - the overhead is negligible. + * + * 2. We ignore CRC. This has a worst-case impact of (num_raw_blocks + 1)*16 + * bits, which should still not be significant enough to warrant the + * additional parsing through the headers + * + * Returns: GST_FLOW_OK if frame was successfully parsed and can be pushed + * forward. Otherwise appropriate error is returned. + */ +static GstFlowReturn +gst_aac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + GstAacParse *aacparse; + GstBuffer *buffer; + GstFlowReturn ret = GST_FLOW_OK; + gint rate, channels; + + aacparse = GST_AAC_PARSE (parse); + buffer = frame->buffer; + + if (G_UNLIKELY (aacparse->header_type != DSPAAC_HEADER_ADTS)) + return ret; + + /* see above */ + frame->overhead = 7; + + gst_aac_parse_parse_adts_header (aacparse, GST_BUFFER_DATA (buffer), + &rate, &channels, NULL, NULL); + GST_LOG_OBJECT (aacparse, "rate: %d, chans: %d", rate, channels); + + if (G_UNLIKELY (rate != aacparse->sample_rate + || channels != aacparse->channels)) { + aacparse->sample_rate = rate; + aacparse->channels = channels; + + if (!gst_aac_parse_set_src_caps (aacparse, + GST_PAD_CAPS (GST_BASE_PARSE (aacparse)->sinkpad))) { + /* If linking fails, we need to return appropriate error */ + ret = GST_FLOW_NOT_LINKED; + } + + gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), + aacparse->sample_rate, aacparse->frame_samples, 2, 2); + } + +#ifdef GST_EXT_AACPARSER_MODIFICATION /* to get more correct duration */ + if (aacparse->first_frame == TRUE) { + gboolean ret = FALSE; + aacparse->first_frame = FALSE; + + ret = gst_aac_parse_estimate_duration(parse); + if (!ret) { + GST_WARNING_OBJECT (aacparse, "can not estimate total duration"); + } + } +#endif + + return ret; +} + + +/** + * gst_aac_parse_start: + * @parse: #GstBaseParse. + * + * Implementation of "start" vmethod in #GstBaseParse class. + * + * Returns: TRUE if startup succeeded. + */ +static gboolean +gst_aac_parse_start (GstBaseParse * parse) +{ + GstAacParse *aacparse; + + aacparse = GST_AAC_PARSE (parse); + GST_DEBUG ("start"); + aacparse->frame_samples = 1024; + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE); + return TRUE; +} + + +/** + * gst_aac_parse_stop: + * @parse: #GstBaseParse. + * + * Implementation of "stop" vmethod in #GstBaseParse class. + * + * Returns: TRUE is stopping succeeded. + */ +static gboolean +gst_aac_parse_stop (GstBaseParse * parse) +{ + GST_DEBUG ("stop"); + return TRUE; +} + +static GstCaps * +gst_aac_parse_sink_getcaps (GstBaseParse * parse) +{ + GstCaps *peercaps; + GstCaps *res; + + peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); + if (peercaps) { + guint i, n; + + /* Remove the framed field */ + peercaps = gst_caps_make_writable (peercaps); + n = gst_caps_get_size (peercaps); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (peercaps, i); + + gst_structure_remove_field (s, "framed"); + } + + res = + gst_caps_intersect_full (peercaps, + gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (peercaps); + } else { + res = + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD + (parse))); + } + + return res; +} diff --git a/gst/audioparsers/gstaacparse.h b/gst/audioparsers/gstaacparse.h new file mode 100644 index 0000000..71584bc --- /dev/null +++ b/gst/audioparsers/gstaacparse.h @@ -0,0 +1,100 @@ +/* GStreamer AAC parser + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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_AAC_PARSE_H__ +#define __GST_AAC_PARSE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AAC_PARSE \ + (gst_aac_parse_get_type()) +#define GST_AAC_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AAC_PARSE, GstAacParse)) +#define GST_AAC_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AAC_PARSE, GstAacParseClass)) +#define GST_IS_AAC_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AAC_PARSE)) +#define GST_IS_AAC_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AAC_PARSE)) + + +/** + * GstAacHeaderType: + * @DSPAAC_HEADER_NOT_PARSED: Header not parsed yet. + * @DSPAAC_HEADER_UNKNOWN: Unknown (not recognized) header. + * @DSPAAC_HEADER_ADIF: ADIF header found. + * @DSPAAC_HEADER_ADTS: ADTS header found. + * @DSPAAC_HEADER_NONE: Raw stream, no header. + * + * Type header enumeration set in #header_type. + */ +typedef enum { + DSPAAC_HEADER_NOT_PARSED, + DSPAAC_HEADER_UNKNOWN, + DSPAAC_HEADER_ADIF, + DSPAAC_HEADER_ADTS, + DSPAAC_HEADER_NONE +} GstAacHeaderType; + + +typedef struct _GstAacParse GstAacParse; +typedef struct _GstAacParseClass GstAacParseClass; + +/** + * GstAacParse: + * + * The opaque GstAacParse data structure. + */ +struct _GstAacParse { + GstBaseParse element; + + /* Stream type -related info */ + gint object_type; + gint bitrate; + gint sample_rate; + gint channels; + gint mpegversion; + gint frame_samples; + +#ifdef GST_EXT_AACPARSER_MODIFICATION + gboolean first_frame; /* estimate duration once at the first time */ +#endif + GstAacHeaderType header_type; +}; + +/** + * GstAacParseClass: + * @parent_class: Element parent class. + * + * The opaque GstAacParseClass data structure. + */ +struct _GstAacParseClass { + GstBaseParseClass parent_class; +}; + +GType gst_aac_parse_get_type (void); + +G_END_DECLS + +#endif /* __GST_AAC_PARSE_H__ */ diff --git a/gst/audioparsers/gstac3parse.c b/gst/audioparsers/gstac3parse.c new file mode 100644 index 0000000..6fa4658 --- /dev/null +++ b/gst/audioparsers/gstac3parse.c @@ -0,0 +1,701 @@ +/* GStreamer AC3 parser + * Copyright (C) 2009 Tim-Philipp Müller + * Copyright (C) 2009 Mark Nauwelaerts + * Copyright (C) 2009 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + * + * 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-ac3parse + * @short_description: AC3 parser + * @see_also: #GstAmrParse, #GstAACParse + * + * This is an AC3 parser. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=abc.ac3 ! ac3parse ! a52dec ! audioresample ! audioconvert ! autoaudiosink + * ]| + * + */ + +/* TODO: + * - add support for audio/x-private1-ac3 as well + * - should accept framed and unframed input (needs decodebin fixes first) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstac3parse.h" +#include +#include + +GST_DEBUG_CATEGORY_STATIC (ac3_parse_debug); +#define GST_CAT_DEFAULT ac3_parse_debug + +static const struct +{ + const guint bit_rate; /* nominal bit rate */ + const guint frame_size[3]; /* frame size for 32kHz, 44kHz, and 48kHz */ +} frmsizcod_table[38] = { + { + 32, { + 64, 69, 96}}, { + 32, { + 64, 70, 96}}, { + 40, { + 80, 87, 120}}, { + 40, { + 80, 88, 120}}, { + 48, { + 96, 104, 144}}, { + 48, { + 96, 105, 144}}, { + 56, { + 112, 121, 168}}, { + 56, { + 112, 122, 168}}, { + 64, { + 128, 139, 192}}, { + 64, { + 128, 140, 192}}, { + 80, { + 160, 174, 240}}, { + 80, { + 160, 175, 240}}, { + 96, { + 192, 208, 288}}, { + 96, { + 192, 209, 288}}, { + 112, { + 224, 243, 336}}, { + 112, { + 224, 244, 336}}, { + 128, { + 256, 278, 384}}, { + 128, { + 256, 279, 384}}, { + 160, { + 320, 348, 480}}, { + 160, { + 320, 349, 480}}, { + 192, { + 384, 417, 576}}, { + 192, { + 384, 418, 576}}, { + 224, { + 448, 487, 672}}, { + 224, { + 448, 488, 672}}, { + 256, { + 512, 557, 768}}, { + 256, { + 512, 558, 768}}, { + 320, { + 640, 696, 960}}, { + 320, { + 640, 697, 960}}, { + 384, { + 768, 835, 1152}}, { + 384, { + 768, 836, 1152}}, { + 448, { + 896, 975, 1344}}, { + 448, { + 896, 976, 1344}}, { + 512, { + 1024, 1114, 1536}}, { + 512, { + 1024, 1115, 1536}}, { + 576, { + 1152, 1253, 1728}}, { + 576, { + 1152, 1254, 1728}}, { + 640, { + 1280, 1393, 1920}}, { + 640, { + 1280, 1394, 1920}} +}; + +static const guint fscod_rates[4] = { 48000, 44100, 32000, 0 }; +static const guint acmod_chans[8] = { 2, 1, 2, 3, 3, 4, 4, 5 }; +static const guint numblks[4] = { 1, 2, 3, 6 }; + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-ac3, framed = (boolean) true, " + " channels = (int) [ 1, 6 ], rate = (int) [ 8000, 48000 ], " + " alignment = (string) { iec61937, frame}; " + "audio/x-eac3, framed = (boolean) true, " + " channels = (int) [ 1, 6 ], rate = (int) [ 8000, 48000 ], " + " alignment = (string) { iec61937, frame}; ")); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-ac3; " "audio/x-eac3; " "audio/ac3")); + +static void gst_ac3_parse_finalize (GObject * object); + +static gboolean gst_ac3_parse_start (GstBaseParse * parse); +static gboolean gst_ac3_parse_stop (GstBaseParse * parse); +static gboolean gst_ac3_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * size, gint * skipsize); +static GstFlowReturn gst_ac3_parse_parse_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); +static gboolean gst_ac3_parse_src_event (GstBaseParse * parse, + GstEvent * event); +static GstCaps *gst_ac3_parse_get_sink_caps (GstBaseParse * parse); + +GST_BOILERPLATE (GstAc3Parse, gst_ac3_parse, GstBaseParse, GST_TYPE_BASE_PARSE); + +static void +gst_ac3_parse_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, + "AC3 audio stream parser", "Codec/Parser/Converter/Audio", + "AC3 parser", "Tim-Philipp Müller "); +} + +static void +gst_ac3_parse_class_init (GstAc3ParseClass * klass) +{ + GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + GST_DEBUG_CATEGORY_INIT (ac3_parse_debug, "ac3parse", 0, + "AC3 audio stream parser"); + + object_class->finalize = gst_ac3_parse_finalize; + + parse_class->start = GST_DEBUG_FUNCPTR (gst_ac3_parse_start); + parse_class->stop = GST_DEBUG_FUNCPTR (gst_ac3_parse_stop); + parse_class->check_valid_frame = + GST_DEBUG_FUNCPTR (gst_ac3_parse_check_valid_frame); + parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_ac3_parse_parse_frame); + parse_class->src_event = GST_DEBUG_FUNCPTR (gst_ac3_parse_src_event); + parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_ac3_parse_get_sink_caps); +} + +static void +gst_ac3_parse_reset (GstAc3Parse * ac3parse) +{ + ac3parse->channels = -1; + ac3parse->sample_rate = -1; + ac3parse->blocks = -1; + ac3parse->eac = FALSE; + g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_NONE); +} + +static void +gst_ac3_parse_init (GstAc3Parse * ac3parse, GstAc3ParseClass * klass) +{ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (ac3parse), 6); + gst_ac3_parse_reset (ac3parse); +} + +static void +gst_ac3_parse_finalize (GObject * object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_ac3_parse_start (GstBaseParse * parse) +{ + GstAc3Parse *ac3parse = GST_AC3_PARSE (parse); + + GST_DEBUG_OBJECT (parse, "starting"); + + gst_ac3_parse_reset (ac3parse); + + return TRUE; +} + +static gboolean +gst_ac3_parse_stop (GstBaseParse * parse) +{ + GST_DEBUG_OBJECT (parse, "stopping"); + + return TRUE; +} + +static void +gst_ac3_parse_set_alignment (GstAc3Parse * ac3parse, gboolean eac) +{ + GstCaps *caps; + GstStructure *st; + const gchar *str = NULL; + int i; + + if (G_LIKELY (!eac)) + goto done; + + caps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (ac3parse)); + + if (!caps) + goto done; + + for (i = 0; i < gst_caps_get_size (caps); i++) { + st = gst_caps_get_structure (caps, i); + + if (!g_str_equal (gst_structure_get_name (st), "audio/x-eac3")) + continue; + + if ((str = gst_structure_get_string (st, "alignment"))) { + if (g_str_equal (str, "iec61937")) { + g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_IEC61937); + GST_DEBUG_OBJECT (ac3parse, "picked iec61937 alignment"); + } else if (g_str_equal (str, "frame") == 0) { + g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); + GST_DEBUG_OBJECT (ac3parse, "picked frame alignment"); + } else { + g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); + GST_WARNING_OBJECT (ac3parse, "unknown alignment: %s", str); + } + break; + } + } + + if (caps) + gst_caps_unref (caps); + +done: + /* default */ + if (ac3parse->align == GST_AC3_PARSE_ALIGN_NONE) { + g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); + GST_DEBUG_OBJECT (ac3parse, "picked syncframe alignment"); + } +} + +static gboolean +gst_ac3_parse_frame_header_ac3 (GstAc3Parse * ac3parse, GstBuffer * buf, + gint skip, guint * frame_size, guint * rate, guint * chans, guint * blks, + guint * sid) +{ + GstBitReader bits = GST_BIT_READER_INIT_FROM_BUFFER (buf); + guint8 fscod, frmsizcod, bsid, acmod, lfe_on, rate_scale; + + GST_LOG_OBJECT (ac3parse, "parsing ac3"); + + gst_bit_reader_skip_unchecked (&bits, skip * 8); + + gst_bit_reader_skip_unchecked (&bits, 16 + 16); + fscod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); + frmsizcod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 6); + + if (G_UNLIKELY (fscod == 3 || frmsizcod >= G_N_ELEMENTS (frmsizcod_table))) { + GST_DEBUG_OBJECT (ac3parse, "bad fscod=%d frmsizcod=%d", fscod, frmsizcod); + return FALSE; + } + + bsid = gst_bit_reader_get_bits_uint8_unchecked (&bits, 5); + gst_bit_reader_skip_unchecked (&bits, 3); /* bsmod */ + acmod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 3); + + /* spec not quite clear here: decoder should decode if less than 8, + * but seemingly only defines 6 and 8 cases */ + /* Files with 9 and 10 happen, and seem to comply with the <= 8 + format, so let them through. The spec says nothing about 9 and 10 */ + if (bsid > 10) { + GST_DEBUG_OBJECT (ac3parse, "unexpected bsid=%d", bsid); + return FALSE; + } else if (bsid != 8 && bsid != 6) { + GST_DEBUG_OBJECT (ac3parse, "undefined bsid=%d", bsid); + } + + if ((acmod & 0x1) && (acmod != 0x1)) /* 3 front channels */ + gst_bit_reader_skip_unchecked (&bits, 2); + if ((acmod & 0x4)) /* if a surround channel exists */ + gst_bit_reader_skip_unchecked (&bits, 2); + if (acmod == 0x2) /* if in 2/0 mode */ + gst_bit_reader_skip_unchecked (&bits, 2); + + lfe_on = gst_bit_reader_get_bits_uint8_unchecked (&bits, 1); + + /* 6/8->0, 9->1, 10->2, + see http://matroska.org/technical/specs/codecid/index.html */ + rate_scale = (CLAMP (bsid, 8, 10) - 8); + + if (frame_size) + *frame_size = frmsizcod_table[frmsizcod].frame_size[fscod] * 2; + if (rate) + *rate = fscod_rates[fscod] >> rate_scale; + if (chans) + *chans = acmod_chans[acmod] + lfe_on; + if (blks) + *blks = 6; + if (sid) + *sid = 0; + + return TRUE; +} + +static gboolean +gst_ac3_parse_frame_header_eac3 (GstAc3Parse * ac3parse, GstBuffer * buf, + gint skip, guint * frame_size, guint * rate, guint * chans, guint * blks, + guint * sid) +{ + GstBitReader bits = GST_BIT_READER_INIT_FROM_BUFFER (buf); + guint16 frmsiz, sample_rate, blocks; + guint8 strmtyp, fscod, fscod2, acmod, lfe_on, strmid, numblkscod; + + GST_LOG_OBJECT (ac3parse, "parsing e-ac3"); + + gst_bit_reader_skip_unchecked (&bits, skip * 8); + + gst_bit_reader_skip_unchecked (&bits, 16); + strmtyp = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); /* strmtyp */ + if (G_UNLIKELY (strmtyp == 3)) { + GST_DEBUG_OBJECT (ac3parse, "bad strmtyp %d", strmtyp); + return FALSE; + } + + strmid = gst_bit_reader_get_bits_uint8_unchecked (&bits, 3); /* substreamid */ + frmsiz = gst_bit_reader_get_bits_uint16_unchecked (&bits, 11); /* frmsiz */ + fscod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); /* fscod */ + if (fscod == 3) { + fscod2 = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); /* fscod2 */ + if (G_UNLIKELY (fscod2 == 3)) { + GST_DEBUG_OBJECT (ac3parse, "invalid fscod2"); + return FALSE; + } + sample_rate = fscod_rates[fscod2] / 2; + blocks = 6; + } else { + numblkscod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); /* numblkscod */ + sample_rate = fscod_rates[fscod]; + blocks = numblks[numblkscod]; + } + + acmod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 3); /* acmod */ + lfe_on = gst_bit_reader_get_bits_uint8_unchecked (&bits, 1); /* lfeon */ + + gst_bit_reader_skip_unchecked (&bits, 5); /* bsid */ + + if (frame_size) + *frame_size = (frmsiz + 1) * 2; + if (rate) + *rate = sample_rate; + if (chans) + *chans = acmod_chans[acmod] + lfe_on; + if (blks) + *blks = blocks; + if (sid) + *sid = (strmtyp & 0x1) << 3 | strmid; + + return TRUE; +} + +static gboolean +gst_ac3_parse_frame_header (GstAc3Parse * parse, GstBuffer * buf, gint skip, + guint * framesize, guint * rate, guint * chans, guint * blocks, + guint * sid, gboolean * eac) +{ + GstBitReader bits = GST_BIT_READER_INIT_FROM_BUFFER (buf); + guint16 sync; + guint8 bsid; + + GST_MEMDUMP_OBJECT (parse, "AC3 frame sync", GST_BUFFER_DATA (buf), 16); + + gst_bit_reader_skip_unchecked (&bits, skip * 8); + + sync = gst_bit_reader_get_bits_uint16_unchecked (&bits, 16); + gst_bit_reader_skip_unchecked (&bits, 16 + 8); + bsid = gst_bit_reader_peek_bits_uint8_unchecked (&bits, 5); + + if (G_UNLIKELY (sync != 0x0b77)) + return FALSE; + + GST_LOG_OBJECT (parse, "bsid = %d", bsid); + + if (bsid <= 10) { + if (eac) + *eac = FALSE; + return gst_ac3_parse_frame_header_ac3 (parse, buf, skip, framesize, rate, + chans, blocks, sid); + } else if (bsid <= 16) { + if (eac) + *eac = TRUE; + return gst_ac3_parse_frame_header_eac3 (parse, buf, skip, framesize, rate, + chans, blocks, sid); + } else { + GST_DEBUG_OBJECT (parse, "unexpected bsid %d", bsid); + return FALSE; + } +} + +static gboolean +gst_ac3_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * framesize, gint * skipsize) +{ + GstAc3Parse *ac3parse = GST_AC3_PARSE (parse); + GstBuffer *buf = frame->buffer; + GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buf); + gint off; + gboolean lost_sync, draining, eac, more = FALSE; + guint frmsiz, blocks, sid; + gint have_blocks = 0; + + if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < 6)) + return FALSE; + + off = gst_byte_reader_masked_scan_uint32 (&reader, 0xffff0000, 0x0b770000, + 0, GST_BUFFER_SIZE (buf)); + + GST_LOG_OBJECT (parse, "possible sync at buffer offset %d", off); + + /* didn't find anything that looks like a sync word, skip */ + if (off < 0) { + *skipsize = GST_BUFFER_SIZE (buf) - 3; + return FALSE; + } + + /* possible frame header, but not at offset 0? skip bytes before sync */ + if (off > 0) { + *skipsize = off; + return FALSE; + } + + /* make sure the values in the frame header look sane */ + if (!gst_ac3_parse_frame_header (ac3parse, buf, 0, &frmsiz, NULL, NULL, + &blocks, &sid, &eac)) { + *skipsize = off + 2; + return FALSE; + } + + *framesize = frmsiz; + + if (G_UNLIKELY (g_atomic_int_get (&ac3parse->align) == + GST_AC3_PARSE_ALIGN_NONE)) + gst_ac3_parse_set_alignment (ac3parse, eac); + + GST_LOG_OBJECT (parse, "got frame"); + + lost_sync = GST_BASE_PARSE_LOST_SYNC (parse); + draining = GST_BASE_PARSE_DRAINING (parse); + + if (g_atomic_int_get (&ac3parse->align) == GST_AC3_PARSE_ALIGN_IEC61937) { + /* We need 6 audio blocks from each substream, so we keep going forwards + * till we have it */ + + g_assert (blocks > 0); + GST_LOG_OBJECT (ac3parse, "Need %d frames before pushing", 6 / blocks); + + if (sid != 0) { + /* We need the first substream to be the one with id 0 */ + GST_LOG_OBJECT (ac3parse, "Skipping till we find sid 0"); + *skipsize = off + 2; + return FALSE; + } + + *framesize = 0; + + /* Loop till we have 6 blocks per substream */ + for (have_blocks = 0; !more && have_blocks < 6; have_blocks += blocks) { + /* Loop till we get one frame from each substream */ + do { + *framesize += frmsiz; + + if (!gst_byte_reader_skip (&reader, frmsiz) || + GST_BUFFER_SIZE (buf) < (*framesize + 6)) { + more = TRUE; + break; + } + + if (!gst_ac3_parse_frame_header (ac3parse, buf, *framesize, &frmsiz, + NULL, NULL, NULL, &sid, &eac)) { + *skipsize = off + 2; + return FALSE; + } + } while (sid); + } + + /* We're now at the next frame, so no need to skip if resyncing */ + frmsiz = 0; + } + + if (lost_sync && !draining) { + guint16 word = 0; + + GST_DEBUG_OBJECT (ac3parse, "resyncing; checking next frame syncword"); + + if (more || !gst_byte_reader_skip (&reader, frmsiz) || + !gst_byte_reader_get_uint16_be (&reader, &word)) { + GST_DEBUG_OBJECT (ac3parse, "... but not sufficient data"); + gst_base_parse_set_min_frame_size (parse, *framesize + 6); + *skipsize = 0; + return FALSE; + } else { + if (word != 0x0b77) { + GST_DEBUG_OBJECT (ac3parse, "0x%x not OK", word); + *skipsize = off + 2; + return FALSE; + } else { + /* ok, got sync now, let's assume constant frame size */ + gst_base_parse_set_min_frame_size (parse, *framesize); + } + } + } + + return TRUE; +} + +static GstFlowReturn +gst_ac3_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + GstAc3Parse *ac3parse = GST_AC3_PARSE (parse); + GstBuffer *buf = frame->buffer; + guint fsize, rate, chans, blocks, sid; + gboolean eac, update_rate = FALSE; + + if (!gst_ac3_parse_frame_header (ac3parse, buf, 0, &fsize, &rate, &chans, + &blocks, &sid, &eac)) + goto broken_header; + + GST_LOG_OBJECT (parse, "size: %u, blocks: %u, rate: %u, chans: %u", fsize, + blocks, rate, chans); + + if (G_UNLIKELY (sid)) { + /* dependent frame, no need to (ac)count for or consider further */ + GST_LOG_OBJECT (parse, "sid: %d", sid); + frame->flags |= GST_BASE_PARSE_FRAME_FLAG_NO_FRAME; + /* TODO maybe also mark as DELTA_UNIT, + * if that does not surprise baseparse elsewhere */ + /* occupies same time space as previous base frame */ + if (G_LIKELY (GST_BUFFER_TIMESTAMP (buf) >= GST_BUFFER_DURATION (buf))) + GST_BUFFER_TIMESTAMP (buf) -= GST_BUFFER_DURATION (buf); + /* only return if we already arranged for caps */ + if (G_LIKELY (ac3parse->sample_rate > 0)) + return GST_FLOW_OK; + } + + if (G_UNLIKELY (ac3parse->sample_rate != rate || ac3parse->channels != chans + || ac3parse->eac != eac)) { + GstCaps *caps = gst_caps_new_simple (eac ? "audio/x-eac3" : "audio/x-ac3", + "framed", G_TYPE_BOOLEAN, TRUE, "rate", G_TYPE_INT, rate, + "channels", G_TYPE_INT, chans, NULL); + gst_caps_set_simple (caps, "alignment", G_TYPE_STRING, + g_atomic_int_get (&ac3parse->align) == GST_AC3_PARSE_ALIGN_IEC61937 ? + "iec61937" : "frame", NULL); + gst_buffer_set_caps (buf, caps); + gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps); + gst_caps_unref (caps); + + ac3parse->sample_rate = rate; + ac3parse->channels = chans; + ac3parse->eac = eac; + + update_rate = TRUE; + } + + if (G_UNLIKELY (ac3parse->blocks != blocks)) { + ac3parse->blocks = blocks; + + update_rate = TRUE; + } + + if (G_UNLIKELY (update_rate)) + gst_base_parse_set_frame_rate (parse, rate, 256 * blocks, 2, 2); + + return GST_FLOW_OK; + +/* ERRORS */ +broken_header: + { + /* this really shouldn't ever happen */ + GST_ELEMENT_ERROR (parse, STREAM, DECODE, (NULL), (NULL)); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_ac3_parse_src_event (GstBaseParse * parse, GstEvent * event) +{ + GstAc3Parse *ac3parse = GST_AC3_PARSE (parse); + + if (G_UNLIKELY (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_UPSTREAM) && + gst_event_has_name (event, "ac3parse-set-alignment")) { + const GstStructure *st = gst_event_get_structure (event); + const gchar *align = gst_structure_get_string (st, "alignment"); + + if (g_str_equal (align, "iec61937")) { + GST_DEBUG_OBJECT (ac3parse, "Switching to iec61937 alignment"); + g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_IEC61937); + } else if (g_str_equal (align, "frame")) { + GST_DEBUG_OBJECT (ac3parse, "Switching to frame alignment"); + g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); + } else { + g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); + GST_WARNING_OBJECT (ac3parse, "Got unknown alignment request (%s) " + "reverting to frame alignment.", + gst_structure_get_string (st, "alignment")); + } + + gst_event_unref (event); + return TRUE; + } + + return GST_BASE_PARSE_CLASS (parent_class)->src_event (parse, event); +} + +static GstCaps * +gst_ac3_parse_get_sink_caps (GstBaseParse * parse) +{ + GstCaps *peercaps; + GstCaps *res; + + peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); + if (peercaps) { + guint i, n; + + /* Remove the framed and alignment field. We can convert + * between different alignments. */ + peercaps = gst_caps_make_writable (peercaps); + n = gst_caps_get_size (peercaps); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (peercaps, i); + + gst_structure_remove_field (s, "framed"); + gst_structure_remove_field (s, "alignment"); + } + + res = + gst_caps_intersect_full (peercaps, + gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (peercaps); + } else { + res = + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD + (parse))); + } + + return res; +} diff --git a/gst/audioparsers/gstac3parse.h b/gst/audioparsers/gstac3parse.h new file mode 100644 index 0000000..545419f --- /dev/null +++ b/gst/audioparsers/gstac3parse.h @@ -0,0 +1,81 @@ +/* GStreamer AC3 parser + * Copyright (C) 2009 Tim-Philipp Müller + * Copyright (C) 2009 Mark Nauwelaerts + * Copyright (C) 2009 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + * + * 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_AC3_PARSE_H__ +#define __GST_AC3_PARSE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AC3_PARSE \ + (gst_ac3_parse_get_type()) +#define GST_AC3_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AC3_PARSE, GstAc3Parse)) +#define GST_AC3_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AC3_PARSE, GstAc3ParseClass)) +#define GST_IS_AC3_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AC3_PARSE)) +#define GST_IS_AC3_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AC3_PARSE)) + +typedef struct _GstAc3Parse GstAc3Parse; +typedef struct _GstAc3ParseClass GstAc3ParseClass; + +enum { + GST_AC3_PARSE_ALIGN_NONE, + GST_AC3_PARSE_ALIGN_FRAME, + GST_AC3_PARSE_ALIGN_IEC61937, +}; + +/** + * GstAc3Parse: + * + * The opaque GstAc3Parse object + */ +struct _GstAc3Parse { + GstBaseParse baseparse; + + /*< private >*/ + gint sample_rate; + gint channels; + gint blocks; + gboolean eac; + volatile gint align; +}; + +/** + * GstAc3ParseClass: + * @parent_class: Element parent class. + * + * The opaque GstAc3ParseClass data structure. + */ +struct _GstAc3ParseClass { + GstBaseParseClass baseparse_class; +}; + +GType gst_ac3_parse_get_type (void); + +G_END_DECLS + +#endif /* __GST_AC3_PARSE_H__ */ diff --git a/gst/audioparsers/gstamrparse.c b/gst/audioparsers/gstamrparse.c new file mode 100644 index 0000000..298fd73 --- /dev/null +++ b/gst/audioparsers/gstamrparse.c @@ -0,0 +1,605 @@ +/* GStreamer Adaptive Multi-Rate parser plugin + * Copyright (C) 2006 Edgard Lima + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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-amrparse + * @short_description: AMR parser + * @see_also: #GstAmrnbDec, #GstAmrnbEnc + * + * This is an AMR parser capable of handling both narrow-band and wideband + * formats. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=abc.amr ! amrparse ! amrdec ! audioresample ! audioconvert ! alsasink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstamrparse.h" + + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/AMR, " "rate = (int) 8000, " "channels = (int) 1;" + "audio/AMR-WB, " "rate = (int) 16000, " "channels = (int) 1;") + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-amr-nb-sh; audio/x-amr-wb-sh")); + +GST_DEBUG_CATEGORY_STATIC (amrparse_debug); +#define GST_CAT_DEFAULT amrparse_debug + +static const gint block_size_nb[16] = + { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 }; + +static const gint block_size_wb[16] = + { 17, 23, 32, 36, 40, 46, 50, 58, 60, 5, -1, -1, -1, -1, 0, 0 }; + +/* AMR has a "hardcoded" framerate of 50fps */ +#define AMR_FRAMES_PER_SECOND 50 +#define AMR_FRAME_DURATION (GST_SECOND/AMR_FRAMES_PER_SECOND) +#define AMR_MIME_HEADER_SIZE 9 + +static gboolean gst_amr_parse_start (GstBaseParse * parse); +static gboolean gst_amr_parse_stop (GstBaseParse * parse); + +static gboolean gst_amr_parse_sink_setcaps (GstBaseParse * parse, + GstCaps * caps); +static GstCaps *gst_amr_parse_sink_getcaps (GstBaseParse * parse); + +static gboolean gst_amr_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * framesize, gint * skipsize); + +static GstFlowReturn gst_amr_parse_parse_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); + +#ifdef GST_EXT_AMRPARSER_MODIFICATION /* make full amr index table when seek */ +static gboolean gst_amr_parse_src_eventfunc (GstBaseParse * parse, GstEvent * event); + +#define AMR_MAX_PULL_RANGE_BUF (5 * 1024 * 1024) /* 5 mbyte */ +#endif + +#define _do_init(bla) \ + GST_DEBUG_CATEGORY_INIT (amrparse_debug, "amrparse", 0, \ + "AMR-NB audio stream parser"); + +GST_BOILERPLATE_FULL (GstAmrParse, gst_amr_parse, GstBaseParse, + GST_TYPE_BASE_PARSE, _do_init); + +/** + * gst_amr_parse_base_init: + * @klass: #GstElementClass. + * + */ +static void +gst_amr_parse_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, + "AMR audio stream parser", "Codec/Parser/Audio", + "Adaptive Multi-Rate audio parser", + "Ronald Bultje "); +} + + +/** + * gst_amr_parse_class_init: + * @klass: GstAmrParseClass. + * + */ +static void +gst_amr_parse_class_init (GstAmrParseClass * klass) +{ + GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + + parse_class->start = GST_DEBUG_FUNCPTR (gst_amr_parse_start); + parse_class->stop = GST_DEBUG_FUNCPTR (gst_amr_parse_stop); + parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_amr_parse_sink_setcaps); + parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_amr_parse_sink_getcaps); + parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_amr_parse_parse_frame); + parse_class->check_valid_frame = + GST_DEBUG_FUNCPTR (gst_amr_parse_check_valid_frame); + +#ifdef GST_EXT_AMRPARSER_MODIFICATION /* make full amr index table when seek */ + parse_class->src_event = gst_amr_parse_src_eventfunc; +#endif +} + + +/** + * gst_amr_parse_init: + * @amrparse: #GstAmrParse + * @klass: #GstAmrParseClass. + * + */ +static void +gst_amr_parse_init (GstAmrParse * amrparse, GstAmrParseClass * klass) +{ + /* init rest */ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (amrparse), 62); + GST_DEBUG ("initialized"); + +} + + +/** + * gst_amr_parse_set_src_caps: + * @amrparse: #GstAmrParse. + * + * Set source pad caps according to current knowledge about the + * audio stream. + * + * Returns: TRUE if caps were successfully set. + */ +static gboolean +gst_amr_parse_set_src_caps (GstAmrParse * amrparse) +{ + GstCaps *src_caps = NULL; + gboolean res = FALSE; + + if (amrparse->wide) { + GST_DEBUG_OBJECT (amrparse, "setting srcpad caps to AMR-WB"); + src_caps = gst_caps_new_simple ("audio/AMR-WB", + "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 16000, NULL); + } else { + GST_DEBUG_OBJECT (amrparse, "setting srcpad caps to AMR-NB"); + /* Max. size of NB frame is 31 bytes, so we can set the min. frame + size to 32 (+1 for next frame header) */ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (amrparse), 32); + src_caps = gst_caps_new_simple ("audio/AMR", + "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL); + } + gst_pad_use_fixed_caps (GST_BASE_PARSE (amrparse)->srcpad); + res = gst_pad_set_caps (GST_BASE_PARSE (amrparse)->srcpad, src_caps); + gst_caps_unref (src_caps); + return res; +} + + +/** + * gst_amr_parse_sink_setcaps: + * @sinkpad: GstPad + * @caps: GstCaps + * + * Returns: TRUE on success. + */ +static gboolean +gst_amr_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps) +{ + GstAmrParse *amrparse; + GstStructure *structure; + const gchar *name; + + amrparse = GST_AMR_PARSE (parse); + structure = gst_caps_get_structure (caps, 0); + name = gst_structure_get_name (structure); + + GST_DEBUG_OBJECT (amrparse, "setcaps: %s", name); + + if (!strncmp (name, "audio/x-amr-wb-sh", 17)) { + amrparse->block_size = block_size_wb; + amrparse->wide = 1; + } else if (!strncmp (name, "audio/x-amr-nb-sh", 17)) { + amrparse->block_size = block_size_nb; + amrparse->wide = 0; + } else { + GST_WARNING ("Unknown caps"); + return FALSE; + } + + amrparse->need_header = FALSE; + gst_base_parse_set_frame_rate (GST_BASE_PARSE (amrparse), 50, 1, 2, 2); + gst_amr_parse_set_src_caps (amrparse); + return TRUE; +} + +/** + * gst_amr_parse_parse_header: + * @amrparse: #GstAmrParse + * @data: Header data to be parsed. + * @skipsize: Output argument where the frame size will be stored. + * + * Check if the given data contains an AMR mime header. + * + * Returns: TRUE on success. + */ +static gboolean +gst_amr_parse_parse_header (GstAmrParse * amrparse, + const guint8 * data, gint * skipsize) +{ + GST_DEBUG_OBJECT (amrparse, "Parsing header data"); + + if (!memcmp (data, "#!AMR-WB\n", 9)) { + GST_DEBUG_OBJECT (amrparse, "AMR-WB detected"); + amrparse->block_size = block_size_wb; + amrparse->wide = TRUE; + *skipsize = amrparse->header = 9; + } else if (!memcmp (data, "#!AMR\n", 6)) { + GST_DEBUG_OBJECT (amrparse, "AMR-NB detected"); + amrparse->block_size = block_size_nb; + amrparse->wide = FALSE; + *skipsize = amrparse->header = 6; + } else + return FALSE; + + gst_amr_parse_set_src_caps (amrparse); + return TRUE; +} + + +/** + * gst_amr_parse_check_valid_frame: + * @parse: #GstBaseParse. + * @buffer: #GstBuffer. + * @framesize: Output variable where the found frame size is put. + * @skipsize: Output variable which tells how much data needs to be skipped + * until a frame header is found. + * + * Implementation of "check_valid_frame" vmethod in #GstBaseParse class. + * + * Returns: TRUE if the given data contains valid frame. + */ +static gboolean +gst_amr_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * framesize, gint * skipsize) +{ + GstBuffer *buffer; + const guint8 *data; + gint fsize, mode, dsize; + GstAmrParse *amrparse; + + amrparse = GST_AMR_PARSE (parse); + buffer = frame->buffer; + data = GST_BUFFER_DATA (buffer); + dsize = GST_BUFFER_SIZE (buffer); + + GST_LOG ("buffer: %d bytes", dsize); + + if (amrparse->need_header) { + if (dsize >= AMR_MIME_HEADER_SIZE && + gst_amr_parse_parse_header (amrparse, data, skipsize)) { + amrparse->need_header = FALSE; + gst_base_parse_set_frame_rate (GST_BASE_PARSE (amrparse), 50, 1, 2, 2); + } else { + GST_WARNING ("media doesn't look like a AMR format"); + } + /* We return FALSE, so this frame won't get pushed forward. Instead, + the "skip" value is set, so next time we will receive a valid frame. */ + return FALSE; + } + + /* Does this look like a possible frame header candidate? */ + if ((data[0] & 0x83) == 0) { + /* Yep. Retrieve the frame size */ + mode = (data[0] >> 3) & 0x0F; + fsize = amrparse->block_size[mode] + 1; /* +1 for the header byte */ + + /* We recognize this data as a valid frame when: + * - We are in sync. There is no need for extra checks then + * - We are in EOS. There might not be enough data to check next frame + * - Sync is lost, but the following data after this frame seem + * to contain a valid header as well (and there is enough data to + * perform this check) + */ + if (fsize) { + gboolean found = FALSE; + + /* in sync, no further check */ + if (!GST_BASE_PARSE_LOST_SYNC (parse)) { + found = TRUE; + } else if (dsize > fsize) { + /* enough data, check for next sync */ + if ((data[fsize] & 0x83) == 0) + found = TRUE; + } else if (GST_BASE_PARSE_DRAINING (parse)) { + /* not enough, but draining, so ok */ + found = TRUE; + } else { + /* indicate we need not skip, but need more data */ + *skipsize = 0; + *framesize = fsize + 1; + } + if (found) { + *framesize = fsize; + return TRUE; + } + } + } + + GST_LOG ("sync lost"); + return FALSE; +} + + +/** + * gst_amr_parse_parse_frame: + * @parse: #GstBaseParse. + * @buffer: #GstBuffer. + * + * Implementation of "parse" vmethod in #GstBaseParse class. + * + * Returns: #GstFlowReturn defining the parsing status. + */ +static GstFlowReturn +gst_amr_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + return GST_FLOW_OK; +} + + +/** + * gst_amr_parse_start: + * @parse: #GstBaseParse. + * + * Implementation of "start" vmethod in #GstBaseParse class. + * + * Returns: TRUE on success. + */ +static gboolean +gst_amr_parse_start (GstBaseParse * parse) +{ + GstAmrParse *amrparse; + + amrparse = GST_AMR_PARSE (parse); + GST_DEBUG ("start"); + amrparse->need_header = TRUE; + amrparse->header = 0; + return TRUE; +} + + +/** + * gst_amr_parse_stop: + * @parse: #GstBaseParse. + * + * Implementation of "stop" vmethod in #GstBaseParse class. + * + * Returns: TRUE on success. + */ +static gboolean +gst_amr_parse_stop (GstBaseParse * parse) +{ + GstAmrParse *amrparse; + + amrparse = GST_AMR_PARSE (parse); + GST_DEBUG ("stop"); + amrparse->need_header = TRUE; + amrparse->header = 0; + return TRUE; +} + +static GstCaps * +gst_amr_parse_sink_getcaps (GstBaseParse * parse) +{ + GstCaps *peercaps; + GstCaps *res; + + peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); + if (peercaps) { + guint i, n; + + /* Rename structure names */ + peercaps = gst_caps_make_writable (peercaps); + n = gst_caps_get_size (peercaps); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (peercaps, i); + + if (gst_structure_has_name (s, "audio/AMR")) + gst_structure_set_name (s, "audio/x-amr-nb-sh"); + else + gst_structure_set_name (s, "audio/x-amr-wb-sh"); + } + + res = + gst_caps_intersect_full (peercaps, + gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (peercaps); + } else { + res = + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD + (parse))); + } + + return res; +} + + +#ifdef GST_EXT_AMRPARSER_MODIFICATION /* make full amr index table when seek */ +/** + * gst_amr_parse_src_eventfunc: + * @parse: #GstBaseParse. #event + * + * before baseparse handles seek event, make full amr index table. + * + * Returns: TRUE on success. + */ +static gboolean +gst_amr_parse_src_eventfunc (GstBaseParse * parse, GstEvent * event) +{ + gboolean handled = FALSE; + GstAmrParse *amrparse; + amrparse = GST_AMR_PARSE (parse); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + { + GstFlowReturn res = GST_FLOW_OK; + gint64 base_offset = 0, sync_offset = 0, cur = 0; + gint32 frame_count = 1; /* do not add first frame because it is already in index table */ + gint64 total_file_size = 0, start_offset = 0; + GstClockTime current_ts = GST_CLOCK_TIME_NONE; + GstActivateMode pad_mode = GST_ACTIVATE_NONE; + +#ifdef GST_EXT_BASEPARSER_MODIFICATION /* check baseparse define these fuction */ + gst_base_parse_get_pad_mode(parse, &pad_mode); + if (pad_mode != GST_ACTIVATE_PULL) { + GST_INFO_OBJECT (amrparse, "arm parser is not pull mode. amr parser can not make index table."); + return FALSE; + } + gst_base_parse_get_upstream_size(parse, &total_file_size); + gst_base_parse_get_index_last_offset(parse, &start_offset); + gst_base_parse_get_index_last_ts(parse, ¤t_ts); +#else + GST_WARNING_OBJECT (amrparse, "baseparser does not define get private param functions. can not make index table here."); + break; +#endif + + GST_LOG_OBJECT (amrparse, "gst_amr_parse_src_eventfunc GST_EVENT_SEEK enter"); + + if (total_file_size == 0 || start_offset >= total_file_size) { + GST_ERROR("last index offset %d is larger than file size %d", start_offset, total_file_size); + break; + } + + gst_event_parse_seek (event, NULL, NULL, NULL, NULL, &cur, NULL, NULL); + if (cur <= current_ts) { + GST_INFO_OBJECT (amrparse, "seek to %"GST_TIME_FORMAT" within index table %"GST_TIME_FORMAT". do not make index table", + GST_TIME_ARGS(cur), GST_TIME_ARGS(current_ts)); + break; + } else { + GST_INFO_OBJECT (amrparse, "seek to %"GST_TIME_FORMAT" without index table %"GST_TIME_FORMAT". make index table", + GST_TIME_ARGS(cur), GST_TIME_ARGS(current_ts)); + } + + GST_INFO_OBJECT (amrparse, "make AMR Index Table. file_size = %"G_GINT64_FORMAT" last idx offset=%"G_GINT64_FORMAT + ", last idx ts=%"GST_TIME_FORMAT, total_file_size, start_offset, GST_TIME_ARGS(current_ts)); + + base_offset = start_offset; /* set base by start offset */ + + + /* STEP 1: MAX_PULL_RANGE_BUF cycle */ + while (total_file_size - base_offset >= AMR_MAX_PULL_RANGE_BUF) { + gint64 offset = 0; + GstBuffer *buffer = NULL; + guint8 *buf = NULL; + + GST_INFO_OBJECT (amrparse, "gst_pad_pull_range %d bytes (from %"G_GINT64_FORMAT") use max size", AMR_MAX_PULL_RANGE_BUF, base_offset); + res = gst_pad_pull_range (parse->sinkpad, base_offset, + base_offset + AMR_MAX_PULL_RANGE_BUF, &buffer); + if (res != GST_FLOW_OK) { + GST_ERROR_OBJECT (amrparse, "gst_pad_pull_range failed!"); + break; + } + + buf = GST_BUFFER_DATA(buffer); + + while (offset <= AMR_MAX_PULL_RANGE_BUF) { + gint mode = 0, frame_size = 0; + + if (buf != NULL && ((buf[offset] & 0x83) == 0)) { + mode = (buf[offset] >> 3) & 0x0F; + frame_size = amrparse->block_size[mode] + 1; /* +1 for the header byte */ + + if (frame_count % 50 == 0) { /* 1 sec == 50 frames. we make idx per sec */ +// gst_base_parse_add_index_entry (parse, base_offset +offset - (amrparse->wide ? 9 : 6), current_ts, TRUE, TRUE); /* force */ + gst_base_parse_add_index_entry (parse, base_offset +offset, current_ts, TRUE, TRUE); /* force */ + GST_DEBUG_OBJECT (amrparse, "Adding index ts=%"GST_TIME_FORMAT" offset %"G_GINT64_FORMAT, + GST_TIME_ARGS(current_ts), base_offset + offset); + } + + current_ts += 20 * 1000 * 1000; /* each frame is 20ms */ + offset += frame_size; + frame_count++; + } else { + GST_WARNING_OBJECT (amrparse, "we lost sync"); + offset++; + } + } /* while */ + base_offset = base_offset + offset; + gst_buffer_unref (buffer); + } /* end MAX buffer cycle */ + + + /* STEP 2: Remain Buffer cycle */ + if (total_file_size - base_offset > 0) { + gint64 offset = 0; + GstBuffer *buffer = NULL; + guint8 *buf = NULL; + + GST_INFO_OBJECT (amrparse, "gst_pad_pull_range %"G_GINT64_FORMAT" bytes (from %"G_GINT64_FORMAT") use remain_buf size", + total_file_size - base_offset, base_offset); + res = gst_pad_pull_range (parse->sinkpad, base_offset, + total_file_size, &buffer); + if (res != GST_FLOW_OK) { + GST_ERROR ("gst_pad_pull_range failed!"); + break; + } + + buf = GST_BUFFER_DATA(buffer); + + while (base_offset + offset < total_file_size) { + gint mode = 0, frame_size = 0; + + if (buf != NULL && ((buf[offset] & 0x83) == 0)) { + mode = (buf[offset] >> 3) & 0x0F; + frame_size = amrparse->block_size[mode] + 1; /* +1 for the header byte */ + + if (frame_count % 50 == 0) { /* 1 sec == 50 frames. we make idx per sec */ + gst_base_parse_add_index_entry (parse, base_offset +offset, current_ts, TRUE, TRUE); /* force */ + GST_DEBUG_OBJECT (amrparse, "Adding index ts=%"GST_TIME_FORMAT" offset %"G_GINT64_FORMAT, + GST_TIME_ARGS(current_ts), base_offset + offset); + } + + current_ts += 20 * 1000 * 1000; /* each frame is 20ms */ + offset += frame_size; + frame_count++; + } else { + GST_WARNING_OBJECT (amrparse, "we lost sync"); + offset++; + } + } /* while */ + + gst_buffer_unref (buffer); + } /* end remain_buf buffer cycle */ + + GST_LOG_OBJECT (amrparse, "gst_amr_parse_src_eventfunc GST_EVENT_SEEK leave"); + } + break; + + default: + break; + } + + /* call baseparse src_event function to handle event */ + handled = GST_BASE_PARSE_CLASS (parent_class)->src_event (parse, event); + + return handled; +} +#endif \ No newline at end of file diff --git a/gst/audioparsers/gstamrparse.h b/gst/audioparsers/gstamrparse.h new file mode 100644 index 0000000..86a26e0 --- /dev/null +++ b/gst/audioparsers/gstamrparse.h @@ -0,0 +1,82 @@ +/* GStreamer Adaptive Multi-Rate parser + * Copyright (C) 2004 Ronald Bultje + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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_AMR_PARSE_H__ +#define __GST_AMR_PARSE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AMR_PARSE \ + (gst_amr_parse_get_type()) +#define GST_AMR_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMR_PARSE, GstAmrParse)) +#define GST_AMR_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMR_PARSE, GstAmrParseClass)) +#define GST_IS_AMR_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMR_PARSE)) +#define GST_IS_AMR_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMR_PARSE)) + + +typedef struct _GstAmrParse GstAmrParse; +typedef struct _GstAmrParseClass GstAmrParseClass; + +/** + * GstAmrParse: + * @element: the parent element. + * @block_size: Pointer to frame size lookup table. + * @need_header: Tells whether the MIME header should be read in the beginning. + * @wide: Wideband mode. + * @eos: Indicates the EOS situation. Set when EOS event is received. + * @sync: Tells whether the parser is in sync. + * @framecount: Total amount of frames handled. + * @bytecount: Total amount of bytes handled. + * @ts: Timestamp of the current media. + * + * The opaque GstAacParse data structure. + */ +struct _GstAmrParse { + GstBaseParse element; + const gint *block_size; + gboolean need_header; + gint header; + gboolean wide; +}; + +/** + * GstAmrParseClass: + * @parent_class: Element parent class. + * + * The opaque GstAmrParseClass data structure. + */ +struct _GstAmrParseClass { + GstBaseParseClass parent_class; +}; + +GType gst_amr_parse_get_type (void); + +G_END_DECLS + +#endif /* __GST_AMR_PARSE_H__ */ diff --git a/gst/audioparsers/gstdcaparse.c b/gst/audioparsers/gstdcaparse.c new file mode 100644 index 0000000..c34d83e --- /dev/null +++ b/gst/audioparsers/gstdcaparse.c @@ -0,0 +1,486 @@ +/* GStreamer DCA parser + * Copyright (C) 2010 Tim-Philipp Müller + * + * 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-dcaparse + * @short_description: DCA (DTS Coherent Acoustics) parser + * @see_also: #GstAmrParse, #GstAACParse, #GstAc3Parse + * + * This is a DCA (DTS Coherent Acoustics) parser. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=abc.dts ! dcaparse ! dtsdec ! audioresample ! audioconvert ! autoaudiosink + * ]| + * + */ + +/* TODO: + * - should accept framed and unframed input (needs decodebin fixes first) + * - seeking in raw .dts files doesn't seem to work, but duration estimate ok + * + * - if frames have 'odd' durations, the frame durations (plus timestamps) + * aren't adjusted up occasionally to make up for rounding error gaps. + * (e.g. if 512 samples per frame @ 48kHz = 10.666666667 ms/frame) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstdcaparse.h" +#include +#include + +GST_DEBUG_CATEGORY_STATIC (dca_parse_debug); +#define GST_CAT_DEFAULT dca_parse_debug + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-dts," + " framed = (boolean) true," + " channels = (int) [ 1, 8 ]," + " rate = (int) [ 8000, 192000 ]," + " depth = (int) { 14, 16 }," + " endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " + " block-size = (int) [ 1, MAX], " " frame-size = (int) [ 1, MAX]")); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-dts")); + +static void gst_dca_parse_finalize (GObject * object); + +static gboolean gst_dca_parse_start (GstBaseParse * parse); +static gboolean gst_dca_parse_stop (GstBaseParse * parse); +static gboolean gst_dca_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * size, gint * skipsize); +static GstFlowReturn gst_dca_parse_parse_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); +static GstCaps *gst_dca_parse_get_sink_caps (GstBaseParse * parse); + +GST_BOILERPLATE (GstDcaParse, gst_dca_parse, GstBaseParse, GST_TYPE_BASE_PARSE); + +static void +gst_dca_parse_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, + "DTS Coherent Acoustics audio stream parser", "Codec/Parser/Audio", + "DCA parser", "Tim-Philipp Müller "); +} + +static void +gst_dca_parse_class_init (GstDcaParseClass * klass) +{ + GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + GST_DEBUG_CATEGORY_INIT (dca_parse_debug, "dcaparse", 0, + "DCA audio stream parser"); + + object_class->finalize = gst_dca_parse_finalize; + + parse_class->start = GST_DEBUG_FUNCPTR (gst_dca_parse_start); + parse_class->stop = GST_DEBUG_FUNCPTR (gst_dca_parse_stop); + parse_class->check_valid_frame = + GST_DEBUG_FUNCPTR (gst_dca_parse_check_valid_frame); + parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_dca_parse_parse_frame); + parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_dca_parse_get_sink_caps); +} + +static void +gst_dca_parse_reset (GstDcaParse * dcaparse) +{ + dcaparse->channels = -1; + dcaparse->rate = -1; + dcaparse->depth = -1; + dcaparse->endianness = -1; + dcaparse->block_size = -1; + dcaparse->frame_size = -1; + dcaparse->last_sync = 0; +} + +static void +gst_dca_parse_init (GstDcaParse * dcaparse, GstDcaParseClass * klass) +{ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (dcaparse), + DCA_MIN_FRAMESIZE); + gst_dca_parse_reset (dcaparse); +} + +static void +gst_dca_parse_finalize (GObject * object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_dca_parse_start (GstBaseParse * parse) +{ + GstDcaParse *dcaparse = GST_DCA_PARSE (parse); + + GST_DEBUG_OBJECT (parse, "starting"); + + gst_dca_parse_reset (dcaparse); + + return TRUE; +} + +static gboolean +gst_dca_parse_stop (GstBaseParse * parse) +{ + GST_DEBUG_OBJECT (parse, "stopping"); + + return TRUE; +} + +static gboolean +gst_dca_parse_parse_header (GstDcaParse * dcaparse, + const GstByteReader * reader, guint * frame_size, + guint * sample_rate, guint * channels, guint * depth, + gint * endianness, guint * num_blocks, guint * samples_per_block, + gboolean * terminator) +{ + static const int sample_rates[16] = { 0, 8000, 16000, 32000, 0, 0, 11025, + 22050, 44100, 0, 0, 12000, 24000, 48000, 96000, 192000 + }; + static const guint8 channels_table[16] = { 1, 2, 2, 2, 2, 3, 3, 4, 4, 5, + 6, 6, 6, 7, 8, 8 + }; + GstByteReader r = *reader; + guint16 hdr[8]; + guint32 marker; + guint chans, lfe, i; + + if (gst_byte_reader_get_remaining (&r) < (4 + sizeof (hdr))) + return FALSE; + + marker = gst_byte_reader_peek_uint32_be_unchecked (&r); + + /* raw big endian or 14-bit big endian */ + if (marker == 0x7FFE8001 || marker == 0x1FFFE800) { + for (i = 0; i < G_N_ELEMENTS (hdr); ++i) + hdr[i] = gst_byte_reader_get_uint16_be_unchecked (&r); + } else + /* raw little endian or 14-bit little endian */ + if (marker == 0xFE7F0180 || marker == 0xFF1F00E8) { + for (i = 0; i < G_N_ELEMENTS (hdr); ++i) + hdr[i] = gst_byte_reader_get_uint16_le_unchecked (&r); + } else { + return FALSE; + } + + GST_LOG_OBJECT (dcaparse, "dts sync marker 0x%08x at offset %u", marker, + gst_byte_reader_get_pos (reader)); + + /* 14-bit mode */ + if (marker == 0x1FFFE800 || marker == 0xFF1F00E8) { + if ((hdr[2] & 0xFFF0) != 0x07F0) + return FALSE; + /* discard top 2 bits (2 void), shift in 2 */ + hdr[0] = (hdr[0] << 2) | ((hdr[1] >> 12) & 0x0003); + /* discard top 4 bits (2 void, 2 shifted into hdr[0]), shift in 4 etc. */ + hdr[1] = (hdr[1] << 4) | ((hdr[2] >> 10) & 0x000F); + hdr[2] = (hdr[2] << 6) | ((hdr[3] >> 8) & 0x003F); + hdr[3] = (hdr[3] << 8) | ((hdr[4] >> 6) & 0x00FF); + hdr[4] = (hdr[4] << 10) | ((hdr[5] >> 4) & 0x03FF); + hdr[5] = (hdr[5] << 12) | ((hdr[6] >> 2) & 0x0FFF); + hdr[6] = (hdr[6] << 14) | ((hdr[7] >> 0) & 0x3FFF); + g_assert (hdr[0] == 0x7FFE && hdr[1] == 0x8001); + } + + GST_LOG_OBJECT (dcaparse, "frame header: %04x%04x%04x%04x", + hdr[2], hdr[3], hdr[4], hdr[5]); + + *terminator = (hdr[2] & 0x80) ? FALSE : TRUE; + *samples_per_block = ((hdr[2] >> 10) & 0x1f) + 1; + *num_blocks = ((hdr[2] >> 2) & 0x7F) + 1; + *frame_size = (((hdr[2] & 0x03) << 12) | (hdr[3] >> 4)) + 1; + chans = ((hdr[3] & 0x0F) << 2) | (hdr[4] >> 14); + *sample_rate = sample_rates[(hdr[4] >> 10) & 0x0F]; + lfe = (hdr[5] >> 9) & 0x03; + + GST_TRACE_OBJECT (dcaparse, "frame size %u, num_blocks %u, rate %u, " + "samples per block %u", *frame_size, *num_blocks, *sample_rate, + *samples_per_block); + + if (*num_blocks < 6 || *frame_size < 96 || *sample_rate == 0) + return FALSE; + + if (marker == 0x1FFFE800 || marker == 0xFF1F00E8) + *frame_size = (*frame_size * 16) / 14; /* FIXME: round up? */ + + if (chans < G_N_ELEMENTS (channels_table)) + *channels = channels_table[chans] + ((lfe) ? 1 : 0); + else + *channels = 0; + + if (depth) + *depth = (marker == 0x1FFFE800 || marker == 0xFF1F00E8) ? 14 : 16; + if (endianness) + *endianness = (marker == 0xFE7F0180 || marker == 0xFF1F00E8) ? + G_LITTLE_ENDIAN : G_BIG_ENDIAN; + + GST_TRACE_OBJECT (dcaparse, "frame size %u, channels %u, rate %u, " + "num_blocks %u, samples_per_block %u", *frame_size, *channels, + *sample_rate, *num_blocks, *samples_per_block); + + return TRUE; +} + +static gint +gst_dca_parse_find_sync (GstDcaParse * dcaparse, GstByteReader * reader, + const GstBuffer * buf, guint32 * sync) +{ + guint32 best_sync = 0; + guint best_offset = G_MAXUINT; + gint off; + + /* FIXME: verify syncs via _parse_header() here already */ + + /* Raw little endian */ + off = gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0xfe7f0180, + 0, GST_BUFFER_SIZE (buf)); + if (off >= 0 && off < best_offset) { + best_offset = off; + best_sync = 0xfe7f0180; + } + + /* Raw big endian */ + off = gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x7ffe8001, + 0, GST_BUFFER_SIZE (buf)); + if (off >= 0 && off < best_offset) { + best_offset = off; + best_sync = 0x7ffe8001; + } + + /* FIXME: check next 2 bytes as well for 14-bit formats (but then don't + * forget to adjust the *skipsize= in _check_valid_frame() */ + + /* 14-bit little endian */ + off = gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0xff1f00e8, + 0, GST_BUFFER_SIZE (buf)); + if (off >= 0 && off < best_offset) { + best_offset = off; + best_sync = 0xff1f00e8; + } + + /* 14-bit big endian */ + off = gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x1fffe800, + 0, GST_BUFFER_SIZE (buf)); + if (off >= 0 && off < best_offset) { + best_offset = off; + best_sync = 0x1fffe800; + } + + if (best_offset == G_MAXUINT) + return -1; + + *sync = best_sync; + return best_offset; +} + +static gboolean +gst_dca_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * framesize, gint * skipsize) +{ + GstDcaParse *dcaparse = GST_DCA_PARSE (parse); + GstBuffer *buf = frame->buffer; + GstByteReader r = GST_BYTE_READER_INIT_FROM_BUFFER (buf); + gboolean parser_draining; + gboolean parser_in_sync; + gboolean terminator; + guint32 sync = 0; + guint size, rate, chans, num_blocks, samples_per_block; + gint off = -1; + + if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < 16)) + return FALSE; + + parser_in_sync = !GST_BASE_PARSE_LOST_SYNC (parse); + + if (G_LIKELY (parser_in_sync && dcaparse->last_sync != 0)) { + off = gst_byte_reader_masked_scan_uint32 (&r, 0xffffffff, + dcaparse->last_sync, 0, GST_BUFFER_SIZE (buf)); + } + + if (G_UNLIKELY (off < 0)) { + off = gst_dca_parse_find_sync (dcaparse, &r, buf, &sync); + } + + /* didn't find anything that looks like a sync word, skip */ + if (off < 0) { + *skipsize = GST_BUFFER_SIZE (buf) - 3; + GST_DEBUG_OBJECT (dcaparse, "no sync, skipping %d bytes", *skipsize); + return FALSE; + } + + GST_LOG_OBJECT (parse, "possible sync %08x at buffer offset %d", sync, off); + + /* possible frame header, but not at offset 0? skip bytes before sync */ + if (off > 0) { + *skipsize = off; + return FALSE; + } + + /* make sure the values in the frame header look sane */ + if (!gst_dca_parse_parse_header (dcaparse, &r, &size, &rate, &chans, NULL, + NULL, &num_blocks, &samples_per_block, &terminator)) { + *skipsize = 4; + return FALSE; + } + + GST_LOG_OBJECT (parse, "got frame, sync %08x, size %u, rate %d, channels %d", + sync, size, rate, chans); + + *framesize = size; + + dcaparse->last_sync = sync; + + parser_draining = GST_BASE_PARSE_DRAINING (parse); + + if (!parser_in_sync && !parser_draining) { + /* check for second frame to be sure */ + GST_DEBUG_OBJECT (dcaparse, "resyncing; checking next frame syncword"); + if (GST_BUFFER_SIZE (buf) >= (size + 16)) { + guint s2, r2, c2, n2, s3; + gboolean t; + + GST_MEMDUMP ("buf", GST_BUFFER_DATA (buf), size + 16); + gst_byte_reader_init_from_buffer (&r, buf); + gst_byte_reader_skip_unchecked (&r, size); + + if (!gst_dca_parse_parse_header (dcaparse, &r, &s2, &r2, &c2, NULL, NULL, + &n2, &s3, &t)) { + GST_DEBUG_OBJECT (dcaparse, "didn't find second syncword"); + *skipsize = 4; + return FALSE; + } + + /* ok, got sync now, let's assume constant frame size */ + gst_base_parse_set_min_frame_size (parse, size); + } else { + /* FIXME: baseparse always seems to hand us buffers of min_frame_size + * bytes, which is unhelpful here */ + GST_LOG_OBJECT (dcaparse, "next sync out of reach (%u < %u)", + GST_BUFFER_SIZE (buf), size + 16); + /* *skipsize = 0; */ + /* return FALSE; */ + } + } + + return TRUE; +} + +static GstFlowReturn +gst_dca_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + GstDcaParse *dcaparse = GST_DCA_PARSE (parse); + GstBuffer *buf = frame->buffer; + GstByteReader r = GST_BYTE_READER_INIT_FROM_BUFFER (buf); + guint size, rate, chans, depth, block_size, num_blocks, samples_per_block; + gint endianness; + gboolean terminator; + + if (!gst_dca_parse_parse_header (dcaparse, &r, &size, &rate, &chans, &depth, + &endianness, &num_blocks, &samples_per_block, &terminator)) + goto broken_header; + + block_size = num_blocks * samples_per_block; + + if (G_UNLIKELY (dcaparse->rate != rate || dcaparse->channels != chans + || dcaparse->depth != depth || dcaparse->endianness != endianness + || (!terminator && dcaparse->block_size != block_size) + || (size != dcaparse->frame_size))) { + GstCaps *caps; + + caps = gst_caps_new_simple ("audio/x-dts", + "framed", G_TYPE_BOOLEAN, TRUE, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, chans, + "endianness", G_TYPE_INT, endianness, "depth", G_TYPE_INT, depth, + "block-size", G_TYPE_INT, block_size, "frame-size", G_TYPE_INT, size, + NULL); + gst_buffer_set_caps (buf, caps); + gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps); + gst_caps_unref (caps); + + dcaparse->rate = rate; + dcaparse->channels = chans; + dcaparse->depth = depth; + dcaparse->endianness = endianness; + dcaparse->block_size = block_size; + dcaparse->frame_size = size; + + gst_base_parse_set_frame_rate (parse, rate, block_size, 0, 0); + } + + return GST_FLOW_OK; + +/* ERRORS */ +broken_header: + { + /* this really shouldn't ever happen */ + GST_ELEMENT_ERROR (parse, STREAM, DECODE, (NULL), (NULL)); + return GST_FLOW_ERROR; + } +} + +static GstCaps * +gst_dca_parse_get_sink_caps (GstBaseParse * parse) +{ + GstCaps *peercaps; + GstCaps *res; + + peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); + if (peercaps) { + guint i, n; + + /* Remove the framed field */ + peercaps = gst_caps_make_writable (peercaps); + n = gst_caps_get_size (peercaps); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (peercaps, i); + + gst_structure_remove_field (s, "framed"); + } + + res = + gst_caps_intersect_full (peercaps, + gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (peercaps); + } else { + res = + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD + (parse))); + } + + return res; +} diff --git a/gst/audioparsers/gstdcaparse.h b/gst/audioparsers/gstdcaparse.h new file mode 100644 index 0000000..b3e066b --- /dev/null +++ b/gst/audioparsers/gstdcaparse.h @@ -0,0 +1,78 @@ +/* GStreamer DCA parser + * Copyright (C) 2010 Tim-Philipp Müller + * + * 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_DCA_PARSE_H__ +#define __GST_DCA_PARSE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_DCA_PARSE \ + (gst_dca_parse_get_type()) +#define GST_DCA_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DCA_PARSE, GstDcaParse)) +#define GST_DCA_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DCA_PARSE, GstDcaParseClass)) +#define GST_IS_DCA_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DCA_PARSE)) +#define GST_IS_DCA_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DCA_PARSE)) + +#define DCA_MIN_FRAMESIZE 96 +#define DCA_MAX_FRAMESIZE 18725 /* 16384*16/14 */ + +typedef struct _GstDcaParse GstDcaParse; +typedef struct _GstDcaParseClass GstDcaParseClass; + +/** + * GstDcaParse: + * + * The opaque GstDcaParse object + */ +struct _GstDcaParse { + GstBaseParse baseparse; + + /*< private >*/ + gint rate; + gint channels; + gint depth; + gint endianness; + gint block_size; + gint frame_size; + + guint32 last_sync; +}; + +/** + * GstDcaParseClass: + * @parent_class: Element parent class. + * + * The opaque GstDcaParseClass data structure. + */ +struct _GstDcaParseClass { + GstBaseParseClass baseparse_class; +}; + +GType gst_dca_parse_get_type (void); + +G_END_DECLS + +#endif /* __GST_DCA_PARSE_H__ */ diff --git a/gst/audioparsers/gstflacparse.c b/gst/audioparsers/gstflacparse.c new file mode 100644 index 0000000..9cfdb98 --- /dev/null +++ b/gst/audioparsers/gstflacparse.c @@ -0,0 +1,1467 @@ +/* GStreamer + * + * Copyright (C) 2008 Sebastian Dröge . + * Copyright (C) 2009 Mark Nauwelaerts + * Copyright (C) 2009 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + * + * 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-flacparse + * @see_also: flacdec, oggdemux, vorbisparse + * + * The flacparse element will parse the header packets of the FLAC + * stream and put them as the streamheader in the caps. This is used in the + * multifdsink case where you want to stream live FLAC streams to multiple + * clients, each client has to receive the streamheaders first before they can + * consume the FLAC packets. + * + * This element also makes sure that the buffers that it pushes out are properly + * timestamped and that their offset and offset_end are set. The buffers that + * flacparse outputs have all of the metadata that oggmux expects to receive, + * which allows you to (for example) remux an ogg/flac or convert a native FLAC + * format file to an ogg bitstream. + * + * + * Example pipelines + * |[ + * gst-launch -v filesrc location=sine.flac ! flacparse ! identity \ + * ! oggmux ! filesink location=sine-remuxed.ogg + * ]| This pipeline converts a native FLAC format file to an ogg bitstream. + * It also illustrates that the streamheader is set in the caps, and that each + * buffer has the timestamp, duration, offset, and offset_end set. + * + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstflacparse.h" + +#include +#include +#include + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (flacparse_debug); +#define GST_CAT_DEFAULT flacparse_debug + +/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ +static const guint8 crc8_table[256] = { + 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, + 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, + 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, + 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, + 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, + 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, + 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, + 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, + 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, + 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, + 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, + 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, + 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, + 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, + 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, + 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, + 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, + 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, + 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, + 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, + 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, + 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, + 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, + 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, + 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, + 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, + 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, + 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, + 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, + 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, + 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, + 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 +}; + +static guint8 +gst_flac_calculate_crc8 (const guint8 * data, guint length) +{ + guint8 crc = 0; + + while (length--) { + crc = crc8_table[crc ^ *data]; + ++data; + } + + return crc; +} + +/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ +static const guint16 crc16_table[256] = { + 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, + 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, + 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, + 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, + 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, + 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, + 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, + 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, + 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, + 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, + 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, + 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, + 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, + 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, + 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, + 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, + 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, + 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, + 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, + 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, + 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, + 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, + 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, + 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, + 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, + 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, + 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, + 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, + 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, + 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, + 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, + 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 +}; + +static guint16 +gst_flac_calculate_crc16 (const guint8 * data, guint length) +{ + guint16 crc = 0; + + while (length--) { + crc = ((crc << 8) ^ crc16_table[(crc >> 8) ^ *data]) & 0xffff; + data++; + } + + return crc; +} + +enum +{ + PROP_0, + PROP_CHECK_FRAME_CHECKSUMS +}; + +#define DEFAULT_CHECK_FRAME_CHECKSUMS FALSE + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-flac, framed = (boolean) true, " + "channels = (int) [ 1, 8 ], " "rate = (int) [ 1, 655350 ]") + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-flac") + ); + +static void gst_flac_parse_finalize (GObject * object); +static void gst_flac_parse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_flac_parse_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_flac_parse_start (GstBaseParse * parse); +static gboolean gst_flac_parse_stop (GstBaseParse * parse); +static gboolean gst_flac_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * framesize, gint * skipsize); +static GstFlowReturn gst_flac_parse_parse_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); +static GstFlowReturn gst_flac_parse_pre_push_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); +static gboolean gst_flac_parse_convert (GstBaseParse * parse, + GstFormat src_format, gint64 src_value, GstFormat dest_format, + gint64 * dest_value); +static GstCaps *gst_flac_parse_get_sink_caps (GstBaseParse * parse); + +GST_BOILERPLATE (GstFlacParse, gst_flac_parse, GstBaseParse, + GST_TYPE_BASE_PARSE); + +static void +gst_flac_parse_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "FLAC audio parser", + "Codec/Parser/Audio", + "Parses audio with the FLAC lossless audio codec", + "Sebastian Dröge "); + + GST_DEBUG_CATEGORY_INIT (flacparse_debug, "flacparse", 0, + "Flac parser element"); +} + +static void +gst_flac_parse_class_init (GstFlacParseClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstBaseParseClass *baseparse_class = GST_BASE_PARSE_CLASS (klass); + + gobject_class->finalize = gst_flac_parse_finalize; + gobject_class->set_property = gst_flac_parse_set_property; + gobject_class->get_property = gst_flac_parse_get_property; + + g_object_class_install_property (gobject_class, PROP_CHECK_FRAME_CHECKSUMS, + g_param_spec_boolean ("check-frame-checksums", "Check Frame Checksums", + "Check the overall checksums of every frame", + DEFAULT_CHECK_FRAME_CHECKSUMS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + baseparse_class->start = GST_DEBUG_FUNCPTR (gst_flac_parse_start); + baseparse_class->stop = GST_DEBUG_FUNCPTR (gst_flac_parse_stop); + baseparse_class->check_valid_frame = + GST_DEBUG_FUNCPTR (gst_flac_parse_check_valid_frame); + baseparse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_flac_parse_parse_frame); + baseparse_class->pre_push_frame = + GST_DEBUG_FUNCPTR (gst_flac_parse_pre_push_frame); + baseparse_class->convert = GST_DEBUG_FUNCPTR (gst_flac_parse_convert); + baseparse_class->get_sink_caps = + GST_DEBUG_FUNCPTR (gst_flac_parse_get_sink_caps); +} + +static void +gst_flac_parse_init (GstFlacParse * flacparse, GstFlacParseClass * klass) +{ + flacparse->check_frame_checksums = DEFAULT_CHECK_FRAME_CHECKSUMS; +} + +static void +gst_flac_parse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (object); + + switch (prop_id) { + case PROP_CHECK_FRAME_CHECKSUMS: + flacparse->check_frame_checksums = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_flac_parse_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (object); + + switch (prop_id) { + case PROP_CHECK_FRAME_CHECKSUMS: + g_value_set_boolean (value, flacparse->check_frame_checksums); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_flac_parse_finalize (GObject * object) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (object); + + if (flacparse->tags) { + gst_tag_list_free (flacparse->tags); + flacparse->tags = NULL; + } + + g_list_foreach (flacparse->headers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (flacparse->headers); + flacparse->headers = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_flac_parse_start (GstBaseParse * parse) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (parse); + + flacparse->state = GST_FLAC_PARSE_STATE_INIT; + flacparse->min_blocksize = 0; + flacparse->max_blocksize = 0; + flacparse->min_framesize = 0; + flacparse->max_framesize = 0; + + flacparse->upstream_length = -1; + + flacparse->samplerate = 0; + flacparse->channels = 0; + flacparse->bps = 0; + flacparse->total_samples = 0; + + flacparse->offset = GST_CLOCK_TIME_NONE; + flacparse->blocking_strategy = 0; + flacparse->block_size = 0; + flacparse->sample_number = 0; + flacparse->strategy_checked = FALSE; + + /* "fLaC" marker */ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), 4); + + /* inform baseclass we can come up with ts, based on counters in packets */ + gst_base_parse_set_has_timing_info (GST_BASE_PARSE_CAST (flacparse), TRUE); + gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (flacparse), TRUE); + + return TRUE; +} + +static gboolean +gst_flac_parse_stop (GstBaseParse * parse) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (parse); + + if (flacparse->tags) { + gst_tag_list_free (flacparse->tags); + flacparse->tags = NULL; + } + + g_list_foreach (flacparse->headers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (flacparse->headers); + flacparse->headers = NULL; + + return TRUE; +} + +static const guint8 sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 0 }; + +static const guint16 blocksize_table[16] = { + 0, 192, 576 << 0, 576 << 1, 576 << 2, 576 << 3, 0, 0, + 256 << 0, 256 << 1, 256 << 2, 256 << 3, 256 << 4, 256 << 5, 256 << 6, + 256 << 7, +}; + +static const guint32 sample_rate_table[16] = { + 0, + 88200, 176400, 192000, + 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000, + 0, 0, 0, 0, +}; + +typedef enum +{ + FRAME_HEADER_VALID, + FRAME_HEADER_INVALID, + FRAME_HEADER_MORE_DATA +} FrameHeaderCheckReturn; + +static FrameHeaderCheckReturn +gst_flac_parse_frame_header_is_valid (GstFlacParse * flacparse, + const guint8 * data, guint size, gboolean set, guint16 * block_size_ret) +{ + GstBitReader reader = GST_BIT_READER_INIT (data, size); + guint8 blocking_strategy; + guint16 block_size; + guint32 samplerate = 0; + guint64 sample_number; + guint8 channels, bps; + guint8 tmp = 0; + guint8 actual_crc, expected_crc = 0; + + /* Skip 14 bit sync code */ + gst_bit_reader_skip_unchecked (&reader, 14); + + /* Must be 0 */ + if (gst_bit_reader_get_bits_uint8_unchecked (&reader, 1) != 0) + goto error; + + /* 0 == fixed block size, 1 == variable block size */ + blocking_strategy = gst_bit_reader_get_bits_uint8_unchecked (&reader, 1); + if (flacparse->force_variable_block_size) + blocking_strategy = 1; + + /* block size index, calculation of the real blocksize below */ + block_size = gst_bit_reader_get_bits_uint16_unchecked (&reader, 4); + if (block_size == 0) + goto error; + + /* sample rate index, calculation of the real samplerate below */ + samplerate = gst_bit_reader_get_bits_uint16_unchecked (&reader, 4); + if (samplerate == 0x0f) + goto error; + + /* channel assignment */ + channels = gst_bit_reader_get_bits_uint8_unchecked (&reader, 4); + if (channels < 8) { + channels++; + } else if (channels <= 10) { + channels = 2; + } else if (channels > 10) { + goto error; + } + if (flacparse->channels && flacparse->channels != channels) + goto error; + + /* bits per sample */ + bps = gst_bit_reader_get_bits_uint8_unchecked (&reader, 3); + if (bps == 0x03 || bps == 0x07) { + goto error; + } else if (bps == 0 && flacparse->bps == 0) { + goto need_streaminfo; + } + bps = sample_size_table[bps]; + if (flacparse->bps && bps != flacparse->bps) + goto error; + + /* reserved, must be 0 */ + if (gst_bit_reader_get_bits_uint8_unchecked (&reader, 1) != 0) + goto error; + + /* read "utf8" encoded sample/frame number */ + { + gint len = 0; + + len = gst_bit_reader_get_bits_uint8_unchecked (&reader, 8); + + /* This is slightly faster than a loop */ + if (!(len & 0x80)) { + sample_number = len; + len = 0; + } else if ((len & 0xc0) && !(len & 0x20)) { + sample_number = len & 0x1f; + len = 1; + } else if ((len & 0xe0) && !(len & 0x10)) { + sample_number = len & 0x0f; + len = 2; + } else if ((len & 0xf0) && !(len & 0x08)) { + sample_number = len & 0x07; + len = 3; + } else if ((len & 0xf8) && !(len & 0x04)) { + sample_number = len & 0x03; + len = 4; + } else if ((len & 0xfc) && !(len & 0x02)) { + sample_number = len & 0x01; + len = 5; + } else if ((len & 0xfe) && !(len & 0x01)) { + sample_number = len & 0x0; + len = 6; + } else { + goto error; + } + + if ((blocking_strategy == 0 && len > 5) || + (blocking_strategy == 1 && len > 6)) + goto error; + + while (len > 0) { + if (!gst_bit_reader_get_bits_uint8 (&reader, &tmp, 8)) + goto need_more_data; + + if ((tmp & 0xc0) != 0x80) + goto error; + + sample_number <<= 6; + sample_number |= (tmp & 0x3f); + len--; + } + } + + /* calculate real blocksize from the blocksize index */ + if (block_size == 0) { + goto error; + } else if (block_size == 6) { + if (!gst_bit_reader_get_bits_uint16 (&reader, &block_size, 8)) + goto need_more_data; + block_size++; + } else if (block_size == 7) { + if (!gst_bit_reader_get_bits_uint16 (&reader, &block_size, 16)) + goto need_more_data; + block_size++; + } else { + block_size = blocksize_table[block_size]; + } + + /* calculate the real samplerate from the samplerate index */ + if (samplerate == 0 && flacparse->samplerate == 0) { + goto need_streaminfo; + } else if (samplerate < 12) { + samplerate = sample_rate_table[samplerate]; + } else if (samplerate == 12) { + if (!gst_bit_reader_get_bits_uint32 (&reader, &samplerate, 8)) + goto need_more_data; + samplerate *= 1000; + } else if (samplerate == 13) { + if (!gst_bit_reader_get_bits_uint32 (&reader, &samplerate, 16)) + goto need_more_data; + } else if (samplerate == 14) { + if (!gst_bit_reader_get_bits_uint32 (&reader, &samplerate, 16)) + goto need_more_data; + samplerate *= 10; + } + + if (flacparse->samplerate && flacparse->samplerate != samplerate) + goto error; + + /* check crc-8 for the header */ + if (!gst_bit_reader_get_bits_uint8 (&reader, &expected_crc, 8)) + goto need_more_data; + + actual_crc = + gst_flac_calculate_crc8 (data, + (gst_bit_reader_get_pos (&reader) / 8) - 1); + if (actual_crc != expected_crc) + goto error; + + /* Sanity check sample number against blocking strategy, as it seems + some files claim fixed block size but supply sample numbers, + rather than block numbers. */ + if (blocking_strategy == 0 && flacparse->block_size != 0) { + if (!flacparse->strategy_checked) { + if (block_size == sample_number) { + GST_WARNING_OBJECT (flacparse, "This file claims fixed block size, " + "but seems to be lying: assuming variable block size"); + flacparse->force_variable_block_size = TRUE; + blocking_strategy = 1; + } + flacparse->strategy_checked = TRUE; + } + } + + /* + The FLAC format documentation says: + The "blocking strategy" bit determines how to calculate the sample number + of the first sample in the frame. If the bit is 0 (fixed-blocksize), the + frame header encodes the frame number as above, and the frame's starting + sample number will be the frame number times the blocksize. If it is 1 + (variable-blocksize), the frame header encodes the frame's starting + sample number itself. (In the case of a fixed-blocksize stream, only the + last block may be shorter than the stream blocksize; its starting sample + number will be calculated as the frame number times the previous frame's + blocksize, or zero if it is the first frame). + + Therefore, when in fixed block size mode, we only update the block size + the first time, then reuse that block size for subsequent calls. + This will also fix a timestamp problem with the last block's timestamp + being miscalculated by scaling the block number by a "wrong" block size. + */ + if (blocking_strategy == 0) { + if (flacparse->block_size != 0) { + /* after first block */ + if (flacparse->block_size != block_size) { + /* TODO: can we know we're on the last frame, to avoid warning ? */ + GST_WARNING_OBJECT (flacparse, "Block size is not constant"); + block_size = flacparse->block_size; + } + } + } + + if (set) { + flacparse->block_size = block_size; + if (!flacparse->samplerate) + flacparse->samplerate = samplerate; + if (!flacparse->bps) + flacparse->bps = bps; + if (!flacparse->blocking_strategy) + flacparse->blocking_strategy = blocking_strategy; + if (!flacparse->channels) + flacparse->channels = channels; + if (!flacparse->sample_number) + flacparse->sample_number = sample_number; + + GST_DEBUG_OBJECT (flacparse, + "Parsed frame at offset %" G_GUINT64_FORMAT ":\n" "Block size: %u\n" + "Sample/Frame number: %" G_GUINT64_FORMAT, flacparse->offset, + flacparse->block_size, flacparse->sample_number); + } + + if (block_size_ret) + *block_size_ret = block_size; + + return FRAME_HEADER_VALID; + +need_streaminfo: + GST_ERROR_OBJECT (flacparse, "Need STREAMINFO"); + return FRAME_HEADER_INVALID; +error: + return FRAME_HEADER_INVALID; + +need_more_data: + return FRAME_HEADER_MORE_DATA; +} + +static gboolean +gst_flac_parse_frame_is_valid (GstFlacParse * flacparse, + GstBaseParseFrame * frame, guint * ret) +{ + GstBuffer *buffer; + const guint8 *data; + guint max, size, remaining; + guint i, search_start, search_end; + FrameHeaderCheckReturn header_ret; + guint16 block_size; + + buffer = frame->buffer; + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + if (size < flacparse->min_framesize) + goto need_more; + + header_ret = + gst_flac_parse_frame_header_is_valid (flacparse, data, size, TRUE, + &block_size); + if (header_ret == FRAME_HEADER_INVALID) { + *ret = 0; + return FALSE; + } else if (header_ret == FRAME_HEADER_MORE_DATA) { + goto need_more; + } + + /* mind unknown framesize */ + search_start = MAX (2, flacparse->min_framesize); + if (flacparse->max_framesize) + search_end = MIN (size, flacparse->max_framesize + 9 + 2); + else + search_end = size; + search_end -= 2; + + remaining = size; + + for (i = search_start; i < search_end; i++, remaining--) { + if ((GST_READ_UINT16_BE (data + i) & 0xfffe) == 0xfff8) { + header_ret = + gst_flac_parse_frame_header_is_valid (flacparse, data + i, remaining, + FALSE, NULL); + if (header_ret == FRAME_HEADER_VALID) { + if (flacparse->check_frame_checksums) { + guint16 actual_crc = gst_flac_calculate_crc16 (data, i - 2); + guint16 expected_crc = GST_READ_UINT16_BE (data + i - 2); + + if (actual_crc != expected_crc) + continue; + } + *ret = i; + flacparse->block_size = block_size; + return TRUE; + } else if (header_ret == FRAME_HEADER_MORE_DATA) { + goto need_more; + } + } + } + + /* For the last frame output everything to the end */ + if (G_UNLIKELY (GST_BASE_PARSE_DRAINING (flacparse))) { + if (flacparse->check_frame_checksums) { + guint16 actual_crc = gst_flac_calculate_crc16 (data, size - 2); + guint16 expected_crc = GST_READ_UINT16_BE (data + size - 2); + + if (actual_crc == expected_crc) { + *ret = size; + flacparse->block_size = block_size; + return TRUE; + } + } else { + *ret = size; + flacparse->block_size = block_size; + return TRUE; + } + } + +need_more: + max = flacparse->max_framesize + 16; + if (max == 16) + max = 1 << 24; + *ret = MIN (size + 4096, max); + return FALSE; +} + +static gboolean +gst_flac_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * framesize, gint * skipsize) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (parse); + GstBuffer *buffer = frame->buffer; + const guint8 *data = GST_BUFFER_DATA (buffer); + + if (G_UNLIKELY (GST_BUFFER_SIZE (buffer) < 4)) + return FALSE; + + if (flacparse->state == GST_FLAC_PARSE_STATE_INIT) { + if (memcmp (GST_BUFFER_DATA (buffer), "fLaC", 4) == 0) { + GST_DEBUG_OBJECT (flacparse, "fLaC marker found"); + *framesize = 4; + return TRUE; + } else if (data[0] == 0xff && (data[1] >> 2) == 0x3e) { + GST_DEBUG_OBJECT (flacparse, "Found headerless FLAC"); + /* Minimal size of a frame header */ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), 9); + flacparse->state = GST_FLAC_PARSE_STATE_GENERATE_HEADERS; + *skipsize = 0; + return FALSE; + } else { + GST_DEBUG_OBJECT (flacparse, "fLaC marker not found"); + return FALSE; + } + } else if (flacparse->state == GST_FLAC_PARSE_STATE_HEADERS) { + guint size = 4 + ((data[1] << 16) | (data[2] << 8) | (data[3])); + + GST_DEBUG_OBJECT (flacparse, "Found metadata block of size %u", size); + *framesize = size; + return TRUE; + } else { + if ((GST_READ_UINT16_BE (data) & 0xfffe) == 0xfff8) { + gboolean ret; + guint next; + + flacparse->offset = GST_BUFFER_OFFSET (buffer); + flacparse->blocking_strategy = 0; + flacparse->sample_number = 0; + + GST_DEBUG_OBJECT (flacparse, "Found sync code"); + ret = gst_flac_parse_frame_is_valid (flacparse, frame, &next); + if (ret) { + *framesize = next; + return TRUE; + } else { + /* If we're at EOS and the frame was not valid, drop it! */ + if (G_UNLIKELY (GST_BASE_PARSE_DRAINING (flacparse))) { + GST_WARNING_OBJECT (flacparse, "EOS"); + return FALSE; + } + + if (next == 0) { + } else if (next > GST_BUFFER_SIZE (buffer)) { + GST_DEBUG_OBJECT (flacparse, "Requesting %u bytes", next); + *skipsize = 0; + gst_base_parse_set_min_frame_size (parse, next); + return FALSE; + } else { + GST_ERROR_OBJECT (flacparse, + "Giving up on invalid frame (%d bytes)", + GST_BUFFER_SIZE (buffer)); + return FALSE; + } + } + } else { + GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer); + gint off; + + off = + gst_byte_reader_masked_scan_uint32 (&reader, 0xfffc0000, 0xfff80000, + 0, GST_BUFFER_SIZE (buffer)); + + if (off > 0) { + GST_DEBUG_OBJECT (parse, "Possible sync at buffer offset %d", off); + *skipsize = off; + return FALSE; + } else { + GST_DEBUG_OBJECT (flacparse, "Sync code not found"); + *skipsize = GST_BUFFER_SIZE (buffer) - 3; + return FALSE; + } + } + } + + return FALSE; +} + +static gboolean +gst_flac_parse_handle_streaminfo (GstFlacParse * flacparse, GstBuffer * buffer) +{ + GstBitReader reader = GST_BIT_READER_INIT_FROM_BUFFER (buffer); + + if (GST_BUFFER_SIZE (buffer) != 4 + 34) { + GST_ERROR_OBJECT (flacparse, "Invalid metablock size for STREAMINFO: %u", + GST_BUFFER_SIZE (buffer)); + return FALSE; + } + + /* Skip metadata block header */ + gst_bit_reader_skip (&reader, 32); + + if (!gst_bit_reader_get_bits_uint16 (&reader, &flacparse->min_blocksize, 16)) + goto error; + if (flacparse->min_blocksize < 16) { + GST_WARNING_OBJECT (flacparse, "Invalid minimum block size: %u", + flacparse->min_blocksize); + } + + if (!gst_bit_reader_get_bits_uint16 (&reader, &flacparse->max_blocksize, 16)) + goto error; + if (flacparse->max_blocksize < 16) { + GST_WARNING_OBJECT (flacparse, "Invalid maximum block size: %u", + flacparse->max_blocksize); + } + + if (!gst_bit_reader_get_bits_uint32 (&reader, &flacparse->min_framesize, 24)) + goto error; + if (!gst_bit_reader_get_bits_uint32 (&reader, &flacparse->max_framesize, 24)) + goto error; + + if (!gst_bit_reader_get_bits_uint32 (&reader, &flacparse->samplerate, 20)) + goto error; + if (flacparse->samplerate == 0) { + GST_ERROR_OBJECT (flacparse, "Invalid sample rate 0"); + return FALSE; + } + + if (!gst_bit_reader_get_bits_uint8 (&reader, &flacparse->channels, 3)) + goto error; + flacparse->channels++; + if (flacparse->channels > 8) { + GST_ERROR_OBJECT (flacparse, "Invalid number of channels %u", + flacparse->channels); + return FALSE; + } + + if (!gst_bit_reader_get_bits_uint8 (&reader, &flacparse->bps, 5)) + goto error; + flacparse->bps++; + + if (!gst_bit_reader_get_bits_uint64 (&reader, &flacparse->total_samples, 36)) + goto error; + if (flacparse->total_samples) { + gst_base_parse_set_duration (GST_BASE_PARSE (flacparse), + GST_FORMAT_DEFAULT, flacparse->total_samples, 0); + } + + GST_DEBUG_OBJECT (flacparse, "STREAMINFO:\n" + "\tmin/max blocksize: %u/%u,\n" + "\tmin/max framesize: %u/%u,\n" + "\tsamplerate: %u,\n" + "\tchannels: %u,\n" + "\tbits per sample: %u,\n" + "\ttotal samples: %" G_GUINT64_FORMAT, + flacparse->min_blocksize, flacparse->max_blocksize, + flacparse->min_framesize, flacparse->max_framesize, + flacparse->samplerate, + flacparse->channels, flacparse->bps, flacparse->total_samples); + + return TRUE; + +error: + GST_ERROR_OBJECT (flacparse, "Failed to read data"); + return FALSE; +} + +static gboolean +gst_flac_parse_handle_vorbiscomment (GstFlacParse * flacparse, + GstBuffer * buffer) +{ + flacparse->tags = gst_tag_list_from_vorbiscomment_buffer (buffer, + GST_BUFFER_DATA (buffer), 4, NULL); + + if (flacparse->tags == NULL) { + GST_ERROR_OBJECT (flacparse, "Invalid vorbiscomment block"); + } else if (gst_tag_list_is_empty (flacparse->tags)) { + gst_tag_list_free (flacparse->tags); + flacparse->tags = NULL; + } + + return TRUE; +} + +static gboolean +gst_flac_parse_handle_picture (GstFlacParse * flacparse, GstBuffer * buffer) +{ + GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer); + const guint8 *data = GST_BUFFER_DATA (buffer); + guint32 img_len = 0, img_type = 0; + guint32 img_mimetype_len = 0, img_description_len = 0; + + if (!gst_byte_reader_skip (&reader, 4)) + goto error; + + if (!gst_byte_reader_get_uint32_be (&reader, &img_type)) + goto error; + + if (!gst_byte_reader_get_uint32_be (&reader, &img_mimetype_len)) + goto error; + if (!gst_byte_reader_skip (&reader, img_mimetype_len)) + goto error; + + if (!gst_byte_reader_get_uint32_be (&reader, &img_description_len)) + goto error; + if (!gst_byte_reader_skip (&reader, img_description_len)) + goto error; + + if (!gst_byte_reader_skip (&reader, 4 * 4)) + goto error; + + if (!gst_byte_reader_get_uint32_be (&reader, &img_len)) + goto error; + + if (!flacparse->tags) + flacparse->tags = gst_tag_list_new (); + + gst_tag_list_add_id3_image (flacparse->tags, + data + gst_byte_reader_get_pos (&reader), img_len, img_type); + + if (gst_tag_list_is_empty (flacparse->tags)) { + gst_tag_list_free (flacparse->tags); + flacparse->tags = NULL; + } + + return TRUE; + +error: + GST_ERROR_OBJECT (flacparse, "Error reading data"); + return FALSE; +} + +static gboolean +gst_flac_parse_handle_seektable (GstFlacParse * flacparse, GstBuffer * buffer) +{ + + GST_DEBUG_OBJECT (flacparse, "storing seektable"); + /* only store for now; + * offset of the first frame is needed to get real info */ + flacparse->seektable = gst_buffer_ref (buffer); + + return TRUE; +} + +static void +gst_flac_parse_process_seektable (GstFlacParse * flacparse, gint64 boffset) +{ + GstByteReader br; + gint64 offset = 0, samples = 0; + + GST_DEBUG_OBJECT (flacparse, + "parsing seektable; base offset %" G_GINT64_FORMAT, boffset); + + if (boffset <= 0) + goto done; + + gst_byte_reader_init_from_buffer (&br, flacparse->seektable); + /* skip header */ + if (!gst_byte_reader_skip (&br, 4)) + goto done; + + /* seekpoints */ + while (gst_byte_reader_get_remaining (&br)) { + if (!gst_byte_reader_get_int64_be (&br, &samples)) + break; + if (!gst_byte_reader_get_int64_be (&br, &offset)) + break; + if (!gst_byte_reader_skip (&br, 2)) + break; + + GST_LOG_OBJECT (flacparse, "samples %" G_GINT64_FORMAT " -> offset %" + G_GINT64_FORMAT, samples, offset); + + /* sanity check */ + if (G_LIKELY (offset > 0 && samples > 0)) { + gst_base_parse_add_index_entry (GST_BASE_PARSE (flacparse), + boffset + offset, gst_util_uint64_scale (samples, GST_SECOND, + flacparse->samplerate), TRUE, FALSE); + } + } + +done: + gst_buffer_unref (flacparse->seektable); + flacparse->seektable = NULL; +} + +static void +_value_array_append_buffer (GValue * array_val, GstBuffer * buf) +{ + GValue value = { 0, }; + + g_value_init (&value, GST_TYPE_BUFFER); + /* copy buffer to avoid problems with circular refcounts */ + buf = gst_buffer_copy (buf); + /* again, for good measure */ + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); + gst_value_set_buffer (&value, buf); + gst_buffer_unref (buf); + gst_value_array_append_value (array_val, &value); + g_value_unset (&value); +} + +static gboolean +gst_flac_parse_handle_headers (GstFlacParse * flacparse) +{ + GstBuffer *vorbiscomment = NULL; + GstBuffer *streaminfo = NULL; + GstBuffer *marker = NULL; + GValue array = { 0, }; + GstCaps *caps; + GList *l; + gboolean res = TRUE; + + caps = gst_caps_new_simple ("audio/x-flac", + "channels", G_TYPE_INT, flacparse->channels, + "framed", G_TYPE_BOOLEAN, TRUE, + "rate", G_TYPE_INT, flacparse->samplerate, NULL); + + if (!flacparse->headers) + goto push_headers; + + for (l = flacparse->headers; l; l = l->next) { + GstBuffer *header = l->data; + const guint8 *data = GST_BUFFER_DATA (header); + guint size = GST_BUFFER_SIZE (header); + + GST_BUFFER_FLAG_SET (header, GST_BUFFER_FLAG_IN_CAPS); + + if (size == 4 && memcmp (data, "fLaC", 4) == 0) { + marker = header; + } else if (size > 1 && (data[0] & 0x7f) == 0) { + streaminfo = header; + } else if (size > 1 && (data[0] & 0x7f) == 4) { + vorbiscomment = header; + } + } + + if (marker == NULL || streaminfo == NULL || vorbiscomment == NULL) { + GST_WARNING_OBJECT (flacparse, + "missing header %p %p %p, muxing into container " + "formats may be broken", marker, streaminfo, vorbiscomment); + goto push_headers; + } + + g_value_init (&array, GST_TYPE_ARRAY); + + /* add marker including STREAMINFO header */ + { + GstBuffer *buf; + guint16 num; + + /* minus one for the marker that is merged with streaminfo here */ + num = g_list_length (flacparse->headers) - 1; + + buf = gst_buffer_new_and_alloc (13 + GST_BUFFER_SIZE (streaminfo)); + GST_BUFFER_DATA (buf)[0] = 0x7f; + memcpy (GST_BUFFER_DATA (buf) + 1, "FLAC", 4); + GST_BUFFER_DATA (buf)[5] = 0x01; /* mapping version major */ + GST_BUFFER_DATA (buf)[6] = 0x00; /* mapping version minor */ + GST_BUFFER_DATA (buf)[7] = (num & 0xFF00) >> 8; + GST_BUFFER_DATA (buf)[8] = (num & 0x00FF) >> 0; + memcpy (GST_BUFFER_DATA (buf) + 9, "fLaC", 4); + memcpy (GST_BUFFER_DATA (buf) + 13, GST_BUFFER_DATA (streaminfo), + GST_BUFFER_SIZE (streaminfo)); + _value_array_append_buffer (&array, buf); + gst_buffer_unref (buf); + } + + /* add VORBISCOMMENT header */ + _value_array_append_buffer (&array, vorbiscomment); + + /* add other headers, if there are any */ + for (l = flacparse->headers; l; l = l->next) { + if (GST_BUFFER_CAST (l->data) != marker && + GST_BUFFER_CAST (l->data) != streaminfo && + GST_BUFFER_CAST (l->data) != vorbiscomment) { + _value_array_append_buffer (&array, GST_BUFFER_CAST (l->data)); + } + } + + gst_structure_set_value (gst_caps_get_structure (caps, 0), + "streamheader", &array); + g_value_unset (&array); + +push_headers: + + gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (GST_BASE_PARSE (flacparse)), caps); + gst_caps_unref (caps); + + /* push header buffers; update caps, so when we push the first buffer the + * negotiated caps will change to caps that include the streamheader field */ + while (flacparse->headers) { + GstBuffer *buf = GST_BUFFER (flacparse->headers->data); + GstFlowReturn ret; + GstBaseParseFrame frame; + + flacparse->headers = + g_list_delete_link (flacparse->headers, flacparse->headers); + buf = gst_buffer_make_metadata_writable (buf); + gst_buffer_set_caps (buf, + GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (GST_BASE_PARSE (flacparse)))); + + /* init, set and give away frame */ + gst_base_parse_frame_init (&frame); + frame.buffer = buf; + frame.overhead = -1; + ret = gst_base_parse_push_frame (GST_BASE_PARSE (flacparse), &frame); + if (ret != GST_FLOW_OK) { + res = FALSE; + break; + } + } + g_list_foreach (flacparse->headers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (flacparse->headers); + flacparse->headers = NULL; + + return res; +} + +static gboolean +gst_flac_parse_generate_headers (GstFlacParse * flacparse) +{ + GstBuffer *marker, *streaminfo, *vorbiscomment; + guint8 *data; + + marker = gst_buffer_new_and_alloc (4); + memcpy (GST_BUFFER_DATA (marker), "fLaC", 4); + GST_BUFFER_TIMESTAMP (marker) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (marker) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET (marker) = 0; + GST_BUFFER_OFFSET_END (marker) = 0; + flacparse->headers = g_list_append (flacparse->headers, marker); + + streaminfo = gst_buffer_new_and_alloc (4 + 34); + data = GST_BUFFER_DATA (streaminfo); + memset (data, 0, 4 + 34); + + /* metadata block header */ + data[0] = 0x00; /* is_last = 0; type = 0; */ + data[1] = 0x00; /* length = 34; */ + data[2] = 0x00; + data[3] = 0x22; + + /* streaminfo */ + + data[4] = (flacparse->block_size >> 8) & 0xff; /* min blocksize = blocksize; */ + data[5] = (flacparse->block_size) & 0xff; + data[6] = (flacparse->block_size >> 8) & 0xff; /* max blocksize = blocksize; */ + data[7] = (flacparse->block_size) & 0xff; + + data[8] = 0x00; /* min framesize = 0; */ + data[9] = 0x00; + data[10] = 0x00; + data[11] = 0x00; /* max framesize = 0; */ + data[12] = 0x00; + data[13] = 0x00; + + data[14] = (flacparse->samplerate >> 12) & 0xff; + data[15] = (flacparse->samplerate >> 4) & 0xff; + data[16] = (flacparse->samplerate >> 0) & 0xf0; + + data[16] |= (flacparse->channels - 1) << 1; + + data[16] |= ((flacparse->bps - 1) >> 4) & 0x01; + data[17] = (((flacparse->bps - 1)) & 0x0f) << 4; + + { + gint64 duration; + GstFormat fmt = GST_FORMAT_TIME; + + if (gst_pad_query_peer_duration (GST_BASE_PARSE_SINK_PAD (GST_BASE_PARSE + (flacparse)), &fmt, &duration) && fmt == GST_FORMAT_TIME) { + duration = GST_CLOCK_TIME_TO_FRAMES (duration, flacparse->samplerate); + + data[17] |= (duration >> 32) & 0xff; + data[18] |= (duration >> 24) & 0xff; + data[19] |= (duration >> 16) & 0xff; + data[20] |= (duration >> 8) & 0xff; + data[21] |= (duration >> 0) & 0xff; + } + } + /* MD5 = 0; */ + + GST_BUFFER_TIMESTAMP (streaminfo) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (streaminfo) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET (streaminfo) = 0; + GST_BUFFER_OFFSET_END (streaminfo) = 0; + flacparse->headers = g_list_append (flacparse->headers, streaminfo); + + /* empty vorbiscomment */ + { + GstTagList *taglist = gst_tag_list_new (); + guchar header[4]; + guint size; + + header[0] = 0x84; /* is_last = 1; type = 4; */ + + vorbiscomment = + gst_tag_list_to_vorbiscomment_buffer (taglist, header, + sizeof (header), NULL); + gst_tag_list_free (taglist); + + /* Get rid of framing bit */ + if (GST_BUFFER_DATA (vorbiscomment)[GST_BUFFER_SIZE (vorbiscomment) - + 1] == 1) { + GstBuffer *sub; + + sub = + gst_buffer_create_sub (vorbiscomment, 0, + GST_BUFFER_SIZE (vorbiscomment) - 1); + gst_buffer_unref (vorbiscomment); + vorbiscomment = sub; + } + + size = GST_BUFFER_SIZE (vorbiscomment) - 4; + GST_BUFFER_DATA (vorbiscomment)[1] = ((size & 0xFF0000) >> 16); + GST_BUFFER_DATA (vorbiscomment)[2] = ((size & 0x00FF00) >> 8); + GST_BUFFER_DATA (vorbiscomment)[3] = (size & 0x0000FF); + + GST_BUFFER_TIMESTAMP (vorbiscomment) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (vorbiscomment) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET (vorbiscomment) = 0; + GST_BUFFER_OFFSET_END (vorbiscomment) = 0; + flacparse->headers = g_list_append (flacparse->headers, vorbiscomment); + } + + return TRUE; +} + +static GstFlowReturn +gst_flac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (parse); + GstBuffer *buffer = frame->buffer; + const guint8 *data = GST_BUFFER_DATA (buffer); + + if (flacparse->state == GST_FLAC_PARSE_STATE_INIT) { + GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET (buffer) = 0; + GST_BUFFER_OFFSET_END (buffer) = 0; + + /* 32 bits metadata block */ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), 4); + flacparse->state = GST_FLAC_PARSE_STATE_HEADERS; + + flacparse->headers = + g_list_append (flacparse->headers, gst_buffer_ref (buffer)); + + return GST_BASE_PARSE_FLOW_DROPPED; + } else if (flacparse->state == GST_FLAC_PARSE_STATE_HEADERS) { + gboolean is_last = ((data[0] & 0x80) == 0x80); + guint type = (data[0] & 0x7F); + + if (type == 127) { + GST_WARNING_OBJECT (flacparse, "Invalid metadata block type"); + return GST_BASE_PARSE_FLOW_DROPPED; + } + + GST_DEBUG_OBJECT (flacparse, "Handling metadata block of type %u", type); + + switch (type) { + case 0: /* STREAMINFO */ + if (!gst_flac_parse_handle_streaminfo (flacparse, buffer)) + return GST_FLOW_ERROR; + break; + case 3: /* SEEKTABLE */ + if (!gst_flac_parse_handle_seektable (flacparse, buffer)) + return GST_FLOW_ERROR; + break; + case 4: /* VORBIS_COMMENT */ + if (!gst_flac_parse_handle_vorbiscomment (flacparse, buffer)) + return GST_FLOW_ERROR; + break; + case 6: /* PICTURE */ + if (!gst_flac_parse_handle_picture (flacparse, buffer)) + return GST_FLOW_ERROR; + break; + case 1: /* PADDING */ + case 2: /* APPLICATION */ + case 5: /* CUESHEET */ + default: /* RESERVED */ + break; + } + + GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET (buffer) = 0; + GST_BUFFER_OFFSET_END (buffer) = 0; + + flacparse->headers = + g_list_append (flacparse->headers, gst_buffer_ref (buffer)); + + if (is_last) { + if (!gst_flac_parse_handle_headers (flacparse)) + return GST_FLOW_ERROR; + + /* Minimal size of a frame header */ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), MAX (9, + flacparse->min_framesize)); + flacparse->state = GST_FLAC_PARSE_STATE_DATA; + } + + /* DROPPED because we pushed already or will push all headers manually */ + return GST_BASE_PARSE_FLOW_DROPPED; + } else { + if (flacparse->offset != GST_BUFFER_OFFSET (buffer)) { + FrameHeaderCheckReturn ret; + + flacparse->offset = GST_BUFFER_OFFSET (buffer); + ret = + gst_flac_parse_frame_header_is_valid (flacparse, + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), TRUE, NULL); + if (ret != FRAME_HEADER_VALID) { + GST_ERROR_OBJECT (flacparse, + "Baseclass didn't provide a complete frame"); + return GST_FLOW_ERROR; + } + } + + if (flacparse->block_size == 0) { + GST_ERROR_OBJECT (flacparse, "Unparsed frame"); + return GST_FLOW_ERROR; + } + + if (flacparse->seektable) + gst_flac_parse_process_seektable (flacparse, GST_BUFFER_OFFSET (buffer)); + + if (flacparse->state == GST_FLAC_PARSE_STATE_GENERATE_HEADERS) { + if (flacparse->blocking_strategy == 1) { + GST_WARNING_OBJECT (flacparse, + "Generating headers for variable blocksize streams not supported"); + + if (!gst_flac_parse_handle_headers (flacparse)) + return GST_FLOW_ERROR; + } else { + GST_DEBUG_OBJECT (flacparse, "Generating headers"); + + if (!gst_flac_parse_generate_headers (flacparse)) + return GST_FLOW_ERROR; + + if (!gst_flac_parse_handle_headers (flacparse)) + return GST_FLOW_ERROR; + } + flacparse->state = GST_FLAC_PARSE_STATE_DATA; + } + + /* also cater for oggmux metadata */ + if (flacparse->blocking_strategy == 0) { + GST_BUFFER_TIMESTAMP (buffer) = + gst_util_uint64_scale (flacparse->sample_number, + flacparse->block_size * GST_SECOND, flacparse->samplerate); + GST_BUFFER_OFFSET_END (buffer) = + flacparse->sample_number * flacparse->block_size + + flacparse->block_size; + } else { + GST_BUFFER_TIMESTAMP (buffer) = + gst_util_uint64_scale (flacparse->sample_number, GST_SECOND, + flacparse->samplerate); + GST_BUFFER_OFFSET_END (buffer) = + flacparse->sample_number + flacparse->block_size; + } + GST_BUFFER_OFFSET (buffer) = + gst_util_uint64_scale (GST_BUFFER_OFFSET_END (buffer), GST_SECOND, + flacparse->samplerate); + GST_BUFFER_DURATION (buffer) = + GST_BUFFER_OFFSET (buffer) - GST_BUFFER_TIMESTAMP (buffer); + + /* To simplify, we just assume that it's a fixed size header and ignore + * subframe headers. The first could lead us to being off by 88 bits and + * the second even less, so the total inaccuracy is negligible. */ + frame->overhead = 7; + + /* Minimal size of a frame header */ + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), MAX (9, + flacparse->min_framesize)); + + flacparse->offset = -1; + flacparse->blocking_strategy = 0; + flacparse->sample_number = 0; + return GST_FLOW_OK; + } +} + +static GstFlowReturn +gst_flac_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (parse); + + /* Push tags */ + if (flacparse->tags) { + gst_element_found_tags (GST_ELEMENT (flacparse), flacparse->tags); + flacparse->tags = NULL; + } + + frame->flags |= GST_BASE_PARSE_FRAME_FLAG_CLIP; + + return GST_FLOW_OK; +} + +static gboolean +gst_flac_parse_convert (GstBaseParse * parse, + GstFormat src_format, gint64 src_value, GstFormat dest_format, + gint64 * dest_value) +{ + GstFlacParse *flacparse = GST_FLAC_PARSE (parse); + + if (flacparse->samplerate > 0) { + if (src_format == GST_FORMAT_DEFAULT && dest_format == GST_FORMAT_TIME) { + if (src_value != -1) + *dest_value = + gst_util_uint64_scale (src_value, GST_SECOND, + flacparse->samplerate); + else + *dest_value = -1; + return TRUE; + } else if (src_format == GST_FORMAT_TIME && + dest_format == GST_FORMAT_DEFAULT) { + if (src_value != -1) + *dest_value = + gst_util_uint64_scale (src_value, flacparse->samplerate, + GST_SECOND); + else + *dest_value = -1; + return TRUE; + } + } + + return GST_BASE_PARSE_CLASS (parent_class)->convert (parse, src_format, + src_value, dest_format, dest_value); +} + +static GstCaps * +gst_flac_parse_get_sink_caps (GstBaseParse * parse) +{ + GstCaps *peercaps; + GstCaps *res; + + peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); + if (peercaps) { + guint i, n; + + /* Remove the framed field */ + peercaps = gst_caps_make_writable (peercaps); + n = gst_caps_get_size (peercaps); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (peercaps, i); + + gst_structure_remove_field (s, "framed"); + } + + res = + gst_caps_intersect_full (peercaps, + gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (peercaps); + } else { + res = + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD + (parse))); + } + + return res; +} diff --git a/gst/audioparsers/gstflacparse.h b/gst/audioparsers/gstflacparse.h new file mode 100644 index 0000000..ebdc1b9 --- /dev/null +++ b/gst/audioparsers/gstflacparse.h @@ -0,0 +1,95 @@ +/* GStreamer + * + * Copyright (C) 2008 Sebastian Dröge . + * Copyright (C) 2009 Mark Nauwelaerts + * Copyright (C) 2009 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + * + * 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_FLAC_PARSE_H__ +#define __GST_FLAC_PARSE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_FLAC_PARSE (gst_flac_parse_get_type()) +#define GST_FLAC_PARSE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLAC_PARSE,GstFlacParse)) +#define GST_FLAC_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLAC_PARSE,GstFlacParseClass)) +#define GST_FLAC_PARSE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_FLAC_PARSE,GstFlacParseClass)) +#define GST_IS_FLAC_PARSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLAC_PARSE)) +#define GST_IS_FLAC_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLAC_PARSE)) +#define GST_FLAC_PARSE_CAST(obj) ((GstFlacParse *)(obj)) + +typedef struct _GstFlacParse GstFlacParse; +typedef struct _GstFlacParseClass GstFlacParseClass; + +typedef enum { + GST_FLAC_PARSE_STATE_INIT, + GST_FLAC_PARSE_STATE_HEADERS, + GST_FLAC_PARSE_STATE_GENERATE_HEADERS, + GST_FLAC_PARSE_STATE_DATA +} GstFlacParseState; + +typedef struct { + guint8 type; +} GstFlacParseSubFrame; + +struct _GstFlacParse { + GstBaseParse parent; + + /* Properties */ + gboolean check_frame_checksums; + + GstFlacParseState state; + + gint64 upstream_length; + + /* STREAMINFO content */ + guint16 min_blocksize, max_blocksize; + guint32 min_framesize, max_framesize; + guint32 samplerate; + guint8 channels; + guint8 bps; + guint64 total_samples; + + /* Current frame */ + guint64 offset; + guint8 blocking_strategy; + guint16 block_size; + guint64 sample_number; + gboolean strategy_checked; + + GstTagList *tags; + + GList *headers; + GstBuffer *seektable; + + gboolean force_variable_block_size; +}; + +struct _GstFlacParseClass { + GstBaseParseClass parent_class; +}; + +GType gst_flac_parse_get_type (void); + +G_END_DECLS + +#endif /* __GST_FLAC_PARSE_H__ */ diff --git a/gst/audioparsers/gstmpegaudioparse.c b/gst/audioparsers/gstmpegaudioparse.c new file mode 100644 index 0000000..6b627e2 --- /dev/null +++ b/gst/audioparsers/gstmpegaudioparse.c @@ -0,0 +1,1318 @@ +/* GStreamer MPEG audio parser + * Copyright (C) 2006-2007 Jan Schmidt + * Copyright (C) 2010 Mark Nauwelaerts + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + * + * 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-mpegaudioparse + * @short_description: MPEG audio parser + * @see_also: #GstAmrParse, #GstAACParse + * + * Parses and frames mpeg1 audio streams. Provides seeking. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=test.mp3 ! mpegaudioparse ! mad ! autoaudiosink + * ]| + * + */ + +/* FIXME: we should make the base class (GstBaseParse) aware of the + * XING seek table somehow, so it can use it properly for things like + * accurate seeks. Currently it can only do a lookup via the convert function, + * but then doesn't know what the result represents exactly. One could either + * add a vfunc for index lookup, or just make mpegaudioparse populate the + * base class's index via the API provided. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstmpegaudioparse.h" +#include + +GST_DEBUG_CATEGORY_STATIC (mpeg_audio_parse_debug); +#define GST_CAT_DEFAULT mpeg_audio_parse_debug + +#define MPEG_AUDIO_CHANNEL_MODE_UNKNOWN -1 +#define MPEG_AUDIO_CHANNEL_MODE_STEREO 0 +#define MPEG_AUDIO_CHANNEL_MODE_JOINT_STEREO 1 +#define MPEG_AUDIO_CHANNEL_MODE_DUAL_CHANNEL 2 +#define MPEG_AUDIO_CHANNEL_MODE_MONO 3 + +#define CRC_UNKNOWN -1 +#define CRC_PROTECTED 0 +#define CRC_NOT_PROTECTED 1 + +#define XING_FRAMES_FLAG 0x0001 +#define XING_BYTES_FLAG 0x0002 +#define XING_TOC_FLAG 0x0004 +#define XING_VBR_SCALE_FLAG 0x0008 + +#define MIN_FRAME_SIZE 6 + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + "mpegaudioversion = (int) [ 1, 3], " + "rate = (int) [ 8000, 48000 ], " + "channels = (int) [ 1, 2 ], " "parsed=(boolean) true") + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, mpegversion = (int) 1") + ); + +static void gst_mpeg_audio_parse_finalize (GObject * object); + +static gboolean gst_mpeg_audio_parse_start (GstBaseParse * parse); +static gboolean gst_mpeg_audio_parse_stop (GstBaseParse * parse); +static gboolean gst_mpeg_audio_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * size, gint * skipsize); +static GstFlowReturn gst_mpeg_audio_parse_parse_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); +static GstFlowReturn gst_mpeg_audio_parse_pre_push_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); +static gboolean gst_mpeg_audio_parse_convert (GstBaseParse * parse, + GstFormat src_format, gint64 src_value, + GstFormat dest_format, gint64 * dest_value); +static GstCaps *gst_mpeg_audio_parse_get_sink_caps (GstBaseParse * parse); + +GST_BOILERPLATE (GstMpegAudioParse, gst_mpeg_audio_parse, GstBaseParse, + GST_TYPE_BASE_PARSE); + +#define GST_TYPE_MPEG_AUDIO_CHANNEL_MODE \ + (gst_mpeg_audio_channel_mode_get_type()) + +static const GEnumValue mpeg_audio_channel_mode[] = { + {MPEG_AUDIO_CHANNEL_MODE_UNKNOWN, "Unknown", "unknown"}, + {MPEG_AUDIO_CHANNEL_MODE_MONO, "Mono", "mono"}, + {MPEG_AUDIO_CHANNEL_MODE_DUAL_CHANNEL, "Dual Channel", "dual-channel"}, + {MPEG_AUDIO_CHANNEL_MODE_JOINT_STEREO, "Joint Stereo", "joint-stereo"}, + {MPEG_AUDIO_CHANNEL_MODE_STEREO, "Stereo", "stereo"}, + {0, NULL, NULL}, +}; + +static GType +gst_mpeg_audio_channel_mode_get_type (void) +{ + static GType mpeg_audio_channel_mode_type = 0; + + if (!mpeg_audio_channel_mode_type) { + mpeg_audio_channel_mode_type = + g_enum_register_static ("GstMpegAudioChannelMode", + mpeg_audio_channel_mode); + } + return mpeg_audio_channel_mode_type; +} + +static const gchar * +gst_mpeg_audio_channel_mode_get_nick (gint mode) +{ + guint i; + for (i = 0; i < G_N_ELEMENTS (mpeg_audio_channel_mode); i++) { + if (mpeg_audio_channel_mode[i].value == mode) + return mpeg_audio_channel_mode[i].value_nick; + } + return NULL; +} + +static void +gst_mpeg_audio_parse_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, "MPEG1 Audio Parser", + "Codec/Parser/Audio", + "Parses and frames mpeg1 audio streams (levels 1-3), provides seek", + "Jan Schmidt ," + "Mark Nauwelaerts "); +} + +static void +gst_mpeg_audio_parse_class_init (GstMpegAudioParseClass * klass) +{ + GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + GST_DEBUG_CATEGORY_INIT (mpeg_audio_parse_debug, "mpegaudioparse", 0, + "MPEG1 audio stream parser"); + + object_class->finalize = gst_mpeg_audio_parse_finalize; + + parse_class->start = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_start); + parse_class->stop = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_stop); + parse_class->check_valid_frame = + GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_check_valid_frame); + parse_class->parse_frame = + GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_parse_frame); + parse_class->pre_push_frame = + GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_pre_push_frame); + parse_class->convert = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_convert); + parse_class->get_sink_caps = + GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_get_sink_caps); + + /* register tags */ +#define GST_TAG_CRC "has-crc" +#define GST_TAG_MODE "channel-mode" + + gst_tag_register (GST_TAG_CRC, GST_TAG_FLAG_META, G_TYPE_BOOLEAN, + "has crc", "Using CRC", NULL); + gst_tag_register (GST_TAG_MODE, GST_TAG_FLAG_ENCODED, G_TYPE_STRING, + "channel mode", "MPEG audio channel mode", NULL); + + g_type_class_ref (GST_TYPE_MPEG_AUDIO_CHANNEL_MODE); +} + +static void +gst_mpeg_audio_parse_reset (GstMpegAudioParse * mp3parse) +{ + mp3parse->channels = -1; + mp3parse->rate = -1; + mp3parse->sent_codec_tag = FALSE; + mp3parse->last_posted_crc = CRC_UNKNOWN; + mp3parse->last_posted_channel_mode = MPEG_AUDIO_CHANNEL_MODE_UNKNOWN; + + mp3parse->hdr_bitrate = 0; + + mp3parse->xing_flags = 0; + mp3parse->xing_bitrate = 0; + mp3parse->xing_frames = 0; + mp3parse->xing_total_time = 0; + mp3parse->xing_bytes = 0; + mp3parse->xing_vbr_scale = 0; + memset (mp3parse->xing_seek_table, 0, 100); + memset (mp3parse->xing_seek_table_inverse, 0, 256); + + mp3parse->vbri_bitrate = 0; + mp3parse->vbri_frames = 0; + mp3parse->vbri_total_time = 0; + mp3parse->vbri_bytes = 0; + mp3parse->vbri_seek_points = 0; + g_free (mp3parse->vbri_seek_table); + mp3parse->vbri_seek_table = NULL; + + mp3parse->encoder_delay = 0; + mp3parse->encoder_padding = 0; +} + +static void +gst_mpeg_audio_parse_init (GstMpegAudioParse * mp3parse, + GstMpegAudioParseClass * klass) +{ + gst_mpeg_audio_parse_reset (mp3parse); +} + +static void +gst_mpeg_audio_parse_finalize (GObject * object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_mpeg_audio_parse_start (GstBaseParse * parse) +{ + GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); + + gst_base_parse_set_min_frame_size (GST_BASE_PARSE (mp3parse), MIN_FRAME_SIZE); + GST_DEBUG_OBJECT (parse, "starting"); + + gst_mpeg_audio_parse_reset (mp3parse); + + return TRUE; +} + +static gboolean +gst_mpeg_audio_parse_stop (GstBaseParse * parse) +{ + GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); + + GST_DEBUG_OBJECT (parse, "stopping"); + + gst_mpeg_audio_parse_reset (mp3parse); + + return TRUE; +} + +static const guint mp3types_bitrates[2][3][16] = { + { + {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,} + }, + { + {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,} + }, +}; + +static const guint mp3types_freqs[3][3] = { {44100, 48000, 32000}, +{22050, 24000, 16000}, +{11025, 12000, 8000} +}; + +static inline guint +mp3_type_frame_length_from_header (GstMpegAudioParse * mp3parse, guint32 header, + guint * put_version, guint * put_layer, guint * put_channels, + guint * put_bitrate, guint * put_samplerate, guint * put_mode, + guint * put_crc) +{ + guint length; + gulong mode, samplerate, bitrate, layer, channels, padding, crc; + gulong version; + gint lsf, mpg25; + + if (header & (1 << 20)) { + lsf = (header & (1 << 19)) ? 0 : 1; + mpg25 = 0; + } else { + lsf = 1; + mpg25 = 1; + } + + version = 1 + lsf + mpg25; + + layer = 4 - ((header >> 17) & 0x3); + + crc = (header >> 16) & 0x1; + + bitrate = (header >> 12) & 0xF; + bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000; + /* The caller has ensured we have a valid header, so bitrate can't be + zero here. */ + g_assert (bitrate != 0); + + samplerate = (header >> 10) & 0x3; + samplerate = mp3types_freqs[lsf + mpg25][samplerate]; + + padding = (header >> 9) & 0x1; + + mode = (header >> 6) & 0x3; + channels = (mode == 3) ? 1 : 2; + + switch (layer) { + case 1: + length = 4 * ((bitrate * 12) / samplerate + padding); + break; + case 2: + length = (bitrate * 144) / samplerate + padding; + break; + default: + case 3: + length = (bitrate * 144) / (samplerate << lsf) + padding; + break; + } + + GST_DEBUG_OBJECT (mp3parse, "Calculated mp3 frame length of %u bytes", + length); + GST_DEBUG_OBJECT (mp3parse, "samplerate = %lu, bitrate = %lu, version = %lu, " + "layer = %lu, channels = %lu, mode = %s", samplerate, bitrate, version, + layer, channels, gst_mpeg_audio_channel_mode_get_nick (mode)); + + if (put_version) + *put_version = version; + if (put_layer) + *put_layer = layer; + if (put_channels) + *put_channels = channels; + if (put_bitrate) + *put_bitrate = bitrate; + if (put_samplerate) + *put_samplerate = samplerate; + if (put_mode) + *put_mode = mode; + if (put_crc) + *put_crc = crc; + + return length; +} + +/* Minimum number of consecutive, valid-looking frames to consider + * for resyncing */ +#define MIN_RESYNC_FRAMES 3 + +/* Perform extended validation to check that subsequent headers match + * the first header given here in important characteristics, to avoid + * false sync. We look for a minimum of MIN_RESYNC_FRAMES consecutive + * frames to match their major characteristics. + * + * If at_eos is set to TRUE, we just check that we don't find any invalid + * frames in whatever data is available, rather than requiring a full + * MIN_RESYNC_FRAMES of data. + * + * Returns TRUE if we've seen enough data to validate or reject the frame. + * If TRUE is returned, then *valid contains TRUE if it validated, or false + * if we decided it was false sync. + * If FALSE is returned, then *valid contains minimum needed data. + */ +static gboolean +gst_mp3parse_validate_extended (GstMpegAudioParse * mp3parse, GstBuffer * buf, + guint32 header, int bpf, gboolean at_eos, gint * valid) +{ + guint32 next_header; + const guint8 *data; + guint available; + int frames_found = 1; + int offset = bpf; + + available = GST_BUFFER_SIZE (buf); + data = GST_BUFFER_DATA (buf); + + while (frames_found < MIN_RESYNC_FRAMES) { + /* Check if we have enough data for all these frames, plus the next + frame header. */ + if (available < offset + 4) { + if (at_eos) { + /* Running out of data at EOS is fine; just accept it */ + *valid = TRUE; + return TRUE; + } else { + *valid = offset + 4; + return FALSE; + } + } + + next_header = GST_READ_UINT32_BE (data + offset); + GST_DEBUG_OBJECT (mp3parse, "At %d: header=%08X, header2=%08X, bpf=%d", + offset, (unsigned int) header, (unsigned int) next_header, bpf); + +/* mask the bits which are allowed to differ between frames */ +#define HDRMASK ~((0xF << 12) /* bitrate */ | \ + (0x1 << 9) /* padding */ | \ + (0xf << 4) /* mode|mode extension */ | \ + (0xf)) /* copyright|emphasis */ + + if ((next_header & HDRMASK) != (header & HDRMASK)) { + /* If any of the unmasked bits don't match, then it's not valid */ + GST_DEBUG_OBJECT (mp3parse, "next header doesn't match " + "(header=%08X (%08X), header2=%08X (%08X), bpf=%d)", + (guint) header, (guint) header & HDRMASK, (guint) next_header, + (guint) next_header & HDRMASK, bpf); + *valid = FALSE; + return TRUE; + } else if ((((next_header >> 12) & 0xf) == 0) || + (((next_header >> 12) & 0xf) == 0xf)) { + /* The essential parts were the same, but the bitrate held an + invalid value - also reject */ + GST_DEBUG_OBJECT (mp3parse, "next header invalid (bitrate)"); + *valid = FALSE; + return TRUE; + } + + bpf = mp3_type_frame_length_from_header (mp3parse, next_header, + NULL, NULL, NULL, NULL, NULL, NULL, NULL); + + offset += bpf; + frames_found++; + } + + *valid = TRUE; + return TRUE; +} + +static gboolean +gst_mpeg_audio_parse_head_check (GstMpegAudioParse * mp3parse, + unsigned long head) +{ + GST_DEBUG_OBJECT (mp3parse, "checking mp3 header 0x%08lx", head); + /* if it's not a valid sync */ + if ((head & 0xffe00000) != 0xffe00000) { + GST_WARNING_OBJECT (mp3parse, "invalid sync"); + return FALSE; + } + /* if it's an invalid MPEG version */ + if (((head >> 19) & 3) == 0x1) { + GST_WARNING_OBJECT (mp3parse, "invalid MPEG version: 0x%lx", + (head >> 19) & 3); + return FALSE; + } + /* if it's an invalid layer */ + if (!((head >> 17) & 3)) { + GST_WARNING_OBJECT (mp3parse, "invalid layer: 0x%lx", (head >> 17) & 3); + return FALSE; + } + /* if it's an invalid bitrate */ + if (((head >> 12) & 0xf) == 0x0) { + GST_WARNING_OBJECT (mp3parse, "invalid bitrate: 0x%lx." + "Free format files are not supported yet", (head >> 12) & 0xf); + return FALSE; + } + if (((head >> 12) & 0xf) == 0xf) { + GST_WARNING_OBJECT (mp3parse, "invalid bitrate: 0x%lx", (head >> 12) & 0xf); + return FALSE; + } + /* if it's an invalid samplerate */ + if (((head >> 10) & 0x3) == 0x3) { + GST_WARNING_OBJECT (mp3parse, "invalid samplerate: 0x%lx", + (head >> 10) & 0x3); + return FALSE; + } + + if ((head & 0x3) == 0x2) { + /* Ignore this as there are some files with emphasis 0x2 that can + * be played fine. See BGO #537235 */ + GST_WARNING_OBJECT (mp3parse, "invalid emphasis: 0x%lx", head & 0x3); + } + + return TRUE; +} + +static gboolean +gst_mpeg_audio_parse_check_valid_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, guint * framesize, gint * skipsize) +{ + GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); + GstBuffer *buf = frame->buffer; + GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buf); + gint off, bpf; + gboolean lost_sync, draining, valid, caps_change; + guint32 header; + guint bitrate, layer, rate, channels, version, mode, crc; + + if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < 6)) + return FALSE; + + off = gst_byte_reader_masked_scan_uint32 (&reader, 0xffe00000, 0xffe00000, + 0, GST_BUFFER_SIZE (buf)); + + GST_LOG_OBJECT (parse, "possible sync at buffer offset %d", off); + + /* didn't find anything that looks like a sync word, skip */ + if (off < 0) { + *skipsize = GST_BUFFER_SIZE (buf) - 3; + return FALSE; + } + + /* possible frame header, but not at offset 0? skip bytes before sync */ + if (off > 0) { + *skipsize = off; + return FALSE; + } + + /* make sure the values in the frame header look sane */ + header = GST_READ_UINT32_BE (GST_BUFFER_DATA (buf)); + if (!gst_mpeg_audio_parse_head_check (mp3parse, header)) { + *skipsize = 1; + return FALSE; + } + + GST_LOG_OBJECT (parse, "got frame"); + + bpf = mp3_type_frame_length_from_header (mp3parse, header, + &version, &layer, &channels, &bitrate, &rate, &mode, &crc); + g_assert (bpf != 0); + + if (channels != mp3parse->channels || rate != mp3parse->rate || + layer != mp3parse->layer || version != mp3parse->version) + caps_change = TRUE; + else + caps_change = FALSE; + + lost_sync = GST_BASE_PARSE_LOST_SYNC (parse); + draining = GST_BASE_PARSE_DRAINING (parse); + + if (!draining && (lost_sync || caps_change)) { + if (!gst_mp3parse_validate_extended (mp3parse, buf, header, bpf, draining, + &valid)) { + /* not enough data */ + gst_base_parse_set_min_frame_size (parse, valid); + *skipsize = 0; + return FALSE; + } else { + if (!valid) { + *skipsize = off + 2; + return FALSE; + } + } + } else if (draining && lost_sync && caps_change && mp3parse->rate > 0) { + /* avoid caps jitter that we can't be sure of */ + *skipsize = off + 2; + return FALSE; + } + + /* restore default minimum */ + gst_base_parse_set_min_frame_size (parse, MIN_FRAME_SIZE); + + *framesize = bpf; + return TRUE; +} + +static void +gst_mpeg_audio_parse_handle_first_frame (GstMpegAudioParse * mp3parse, + GstBuffer * buf) +{ + const guint32 xing_id = 0x58696e67; /* 'Xing' in hex */ + const guint32 info_id = 0x496e666f; /* 'Info' in hex - found in LAME CBR files */ + const guint32 vbri_id = 0x56425249; /* 'VBRI' in hex */ + const guint32 lame_id = 0x4c414d45; /* 'LAME' in hex */ + gint offset_xing, offset_vbri; + guint64 avail; + gint64 upstream_total_bytes = 0; + GstFormat fmt = GST_FORMAT_BYTES; + guint32 read_id_xing = 0, read_id_vbri = 0; + const guint8 *data; + guint bitrate; + + if (mp3parse->sent_codec_tag) + return; + + /* Check first frame for Xing info */ + if (mp3parse->version == 1) { /* MPEG-1 file */ + if (mp3parse->channels == 1) + offset_xing = 0x11; + else + offset_xing = 0x20; + } else { /* MPEG-2 header */ + if (mp3parse->channels == 1) + offset_xing = 0x09; + else + offset_xing = 0x11; + } + + /* The VBRI tag is always at offset 0x20 */ + offset_vbri = 0x20; + + /* Skip the 4 bytes of the MP3 header too */ + offset_xing += 4; + offset_vbri += 4; + + /* Check if we have enough data to read the Xing header */ + avail = GST_BUFFER_SIZE (buf); + data = GST_BUFFER_DATA (buf); + + if (avail >= offset_xing + 4) { + read_id_xing = GST_READ_UINT32_BE (data + offset_xing); + } + if (avail >= offset_vbri + 4) { + read_id_vbri = GST_READ_UINT32_BE (data + offset_vbri); + } + + /* obtain real upstream total bytes */ + fmt = GST_FORMAT_BYTES; + if (!gst_pad_query_peer_duration (GST_BASE_PARSE_SINK_PAD (GST_BASE_PARSE + (mp3parse)), &fmt, &upstream_total_bytes)) + upstream_total_bytes = 0; + + if (read_id_xing == xing_id || read_id_xing == info_id) { + guint32 xing_flags; + guint bytes_needed = offset_xing + 8; + gint64 total_bytes; + GstClockTime total_time; + + GST_DEBUG_OBJECT (mp3parse, "Found Xing header marker 0x%x", xing_id); + + /* Move data after Xing header */ + data += offset_xing + 4; + + /* Read 4 base bytes of flags, big-endian */ + xing_flags = GST_READ_UINT32_BE (data); + data += 4; + if (xing_flags & XING_FRAMES_FLAG) + bytes_needed += 4; + if (xing_flags & XING_BYTES_FLAG) + bytes_needed += 4; + if (xing_flags & XING_TOC_FLAG) + bytes_needed += 100; + if (xing_flags & XING_VBR_SCALE_FLAG) + bytes_needed += 4; + if (avail < bytes_needed) { + GST_DEBUG_OBJECT (mp3parse, + "Not enough data to read Xing header (need %d)", bytes_needed); + return; + } + + GST_DEBUG_OBJECT (mp3parse, "Reading Xing header"); + mp3parse->xing_flags = xing_flags; + + if (xing_flags & XING_FRAMES_FLAG) { + mp3parse->xing_frames = GST_READ_UINT32_BE (data); + if (mp3parse->xing_frames == 0) { + GST_WARNING_OBJECT (mp3parse, + "Invalid number of frames in Xing header"); + mp3parse->xing_flags &= ~XING_FRAMES_FLAG; + } else { + mp3parse->xing_total_time = gst_util_uint64_scale (GST_SECOND, + (guint64) (mp3parse->xing_frames) * (mp3parse->spf), + mp3parse->rate); + } + + data += 4; + } else { + mp3parse->xing_frames = 0; + mp3parse->xing_total_time = 0; + } + + if (xing_flags & XING_BYTES_FLAG) { + mp3parse->xing_bytes = GST_READ_UINT32_BE (data); + if (mp3parse->xing_bytes == 0) { + GST_WARNING_OBJECT (mp3parse, "Invalid number of bytes in Xing header"); + mp3parse->xing_flags &= ~XING_BYTES_FLAG; + } + data += 4; + } else { + mp3parse->xing_bytes = 0; + } + + /* If we know the upstream size and duration, compute the + * total bitrate, rounded up to the nearest kbit/sec */ + if ((total_time = mp3parse->xing_total_time) && + (total_bytes = mp3parse->xing_bytes)) { + mp3parse->xing_bitrate = gst_util_uint64_scale (total_bytes, + 8 * GST_SECOND, total_time); + mp3parse->xing_bitrate += 500; + mp3parse->xing_bitrate -= mp3parse->xing_bitrate % 1000; + } + + if (xing_flags & XING_TOC_FLAG) { + int i, percent = 0; + guchar *table = mp3parse->xing_seek_table; + guchar old = 0, new; + guint first; + + first = data[0]; + GST_DEBUG_OBJECT (mp3parse, + "Subtracting initial offset of %d bytes from Xing TOC", first); + + /* xing seek table: percent time -> 1/256 bytepos */ + for (i = 0; i < 100; i++) { + new = data[i] - first; + if (old > new) { + GST_WARNING_OBJECT (mp3parse, "Skipping broken Xing TOC"); + mp3parse->xing_flags &= ~XING_TOC_FLAG; + goto skip_toc; + } + mp3parse->xing_seek_table[i] = old = new; + } + + /* build inverse table: 1/256 bytepos -> 1/100 percent time */ + for (i = 0; i < 256; i++) { + while (percent < 99 && table[percent + 1] <= i) + percent++; + + if (table[percent] == i) { + mp3parse->xing_seek_table_inverse[i] = percent * 100; + } else if (table[percent] < i && percent < 99) { + gdouble fa, fb, fx; + gint a = percent, b = percent + 1; + + fa = table[a]; + fb = table[b]; + fx = (b - a) / (fb - fa) * (i - fa) + a; + mp3parse->xing_seek_table_inverse[i] = (guint16) (fx * 100); + } else if (percent == 99) { + gdouble fa, fb, fx; + gint a = percent, b = 100; + + fa = table[a]; + fb = 256.0; + fx = (b - a) / (fb - fa) * (i - fa) + a; + mp3parse->xing_seek_table_inverse[i] = (guint16) (fx * 100); + } + } + skip_toc: + data += 100; + } else { + memset (mp3parse->xing_seek_table, 0, 100); + memset (mp3parse->xing_seek_table_inverse, 0, 256); + } + + if (xing_flags & XING_VBR_SCALE_FLAG) { + mp3parse->xing_vbr_scale = GST_READ_UINT32_BE (data); + data += 4; + } else + mp3parse->xing_vbr_scale = 0; + + GST_DEBUG_OBJECT (mp3parse, "Xing header reported %u frames, time %" + GST_TIME_FORMAT ", %u bytes, vbr scale %u", mp3parse->xing_frames, + GST_TIME_ARGS (mp3parse->xing_total_time), mp3parse->xing_bytes, + mp3parse->xing_vbr_scale); + + /* check for truncated file */ + if (upstream_total_bytes && mp3parse->xing_bytes && + mp3parse->xing_bytes * 0.8 > upstream_total_bytes) { + GST_WARNING_OBJECT (mp3parse, "File appears to have been truncated; " + "invalidating Xing header duration and size"); + mp3parse->xing_flags &= ~XING_BYTES_FLAG; + mp3parse->xing_flags &= ~XING_FRAMES_FLAG; + } + + /* Optional LAME tag? */ + if (avail - bytes_needed >= 36 && GST_READ_UINT32_BE (data) == lame_id) { + gchar lame_version[10] = { 0, }; + guint tag_rev; + guint32 encoder_delay, encoder_padding; + + memcpy (lame_version, data, 9); + data += 9; + tag_rev = data[0] >> 4; + GST_DEBUG_OBJECT (mp3parse, "Found LAME tag revision %d created by '%s'", + tag_rev, lame_version); + + /* Skip all the information we're not interested in */ + data += 12; + /* Encoder delay and end padding */ + encoder_delay = GST_READ_UINT24_BE (data); + encoder_delay >>= 12; + encoder_padding = GST_READ_UINT24_BE (data); + encoder_padding &= 0x000fff; + + mp3parse->encoder_delay = encoder_delay; + mp3parse->encoder_padding = encoder_padding; + + GST_DEBUG_OBJECT (mp3parse, "Encoder delay %u, encoder padding %u", + encoder_delay, encoder_padding); + } + } + + if (read_id_vbri == vbri_id) { + gint64 total_bytes, total_frames; + GstClockTime total_time; + guint16 nseek_points; + + GST_DEBUG_OBJECT (mp3parse, "Found VBRI header marker 0x%x", vbri_id); + + if (avail < offset_vbri + 26) { + GST_DEBUG_OBJECT (mp3parse, + "Not enough data to read VBRI header (need %d)", offset_vbri + 26); + return; + } + + GST_DEBUG_OBJECT (mp3parse, "Reading VBRI header"); + + /* Move data after VBRI header */ + data += offset_vbri + 4; + + if (GST_READ_UINT16_BE (data) != 0x0001) { + GST_WARNING_OBJECT (mp3parse, + "Unsupported VBRI version 0x%x", GST_READ_UINT16_BE (data)); + return; + } + data += 2; + + /* Skip encoder delay */ + data += 2; + + /* Skip quality */ + data += 2; + + total_bytes = GST_READ_UINT32_BE (data); + if (total_bytes != 0) + mp3parse->vbri_bytes = total_bytes; + data += 4; + + total_frames = GST_READ_UINT32_BE (data); + if (total_frames != 0) { + mp3parse->vbri_frames = total_frames; + mp3parse->vbri_total_time = gst_util_uint64_scale (GST_SECOND, + (guint64) (mp3parse->vbri_frames) * (mp3parse->spf), mp3parse->rate); + } + data += 4; + + /* If we know the upstream size and duration, compute the + * total bitrate, rounded up to the nearest kbit/sec */ + if ((total_time = mp3parse->vbri_total_time) && + (total_bytes = mp3parse->vbri_bytes)) { + mp3parse->vbri_bitrate = gst_util_uint64_scale (total_bytes, + 8 * GST_SECOND, total_time); + mp3parse->vbri_bitrate += 500; + mp3parse->vbri_bitrate -= mp3parse->vbri_bitrate % 1000; + } + + nseek_points = GST_READ_UINT16_BE (data); + data += 2; + + if (nseek_points > 0) { + guint scale, seek_bytes, seek_frames; + gint i; + + mp3parse->vbri_seek_points = nseek_points; + + scale = GST_READ_UINT16_BE (data); + data += 2; + + seek_bytes = GST_READ_UINT16_BE (data); + data += 2; + + seek_frames = GST_READ_UINT16_BE (data); + + if (scale == 0 || seek_bytes == 0 || seek_bytes > 4 || seek_frames == 0) { + GST_WARNING_OBJECT (mp3parse, "Unsupported VBRI seek table"); + goto out_vbri; + } + + if (avail < offset_vbri + 26 + nseek_points * seek_bytes) { + GST_WARNING_OBJECT (mp3parse, + "Not enough data to read VBRI seek table (need %d)", + offset_vbri + 26 + nseek_points * seek_bytes); + goto out_vbri; + } + + if (seek_frames * nseek_points < total_frames - seek_frames || + seek_frames * nseek_points > total_frames + seek_frames) { + GST_WARNING_OBJECT (mp3parse, + "VBRI seek table doesn't cover the complete file"); + goto out_vbri; + } + + if (avail < offset_vbri + 26) { + GST_DEBUG_OBJECT (mp3parse, + "Not enough data to read VBRI header (need %d)", + offset_vbri + 26 + nseek_points * seek_bytes); + return; + } + + data = GST_BUFFER_DATA (buf); + data += offset_vbri + 26; + + /* VBRI seek table: frame/seek_frames -> byte */ + mp3parse->vbri_seek_table = g_new (guint32, nseek_points); + if (seek_bytes == 4) + for (i = 0; i < nseek_points; i++) { + mp3parse->vbri_seek_table[i] = GST_READ_UINT32_BE (data) * scale; + data += 4; + } else if (seek_bytes == 3) + for (i = 0; i < nseek_points; i++) { + mp3parse->vbri_seek_table[i] = GST_READ_UINT24_BE (data) * scale; + data += 3; + } else if (seek_bytes == 2) + for (i = 0; i < nseek_points; i++) { + mp3parse->vbri_seek_table[i] = GST_READ_UINT16_BE (data) * scale; + data += 2; + } else /* seek_bytes == 1 */ + for (i = 0; i < nseek_points; i++) { + mp3parse->vbri_seek_table[i] = GST_READ_UINT8 (data) * scale; + data += 1; + } + } + out_vbri: + + GST_DEBUG_OBJECT (mp3parse, "VBRI header reported %u frames, time %" + GST_TIME_FORMAT ", bytes %u", mp3parse->vbri_frames, + GST_TIME_ARGS (mp3parse->vbri_total_time), mp3parse->vbri_bytes); + + /* check for truncated file */ + if (upstream_total_bytes && mp3parse->vbri_bytes && + mp3parse->vbri_bytes * 0.8 > upstream_total_bytes) { + GST_WARNING_OBJECT (mp3parse, "File appears to have been truncated; " + "invalidating VBRI header duration and size"); + mp3parse->vbri_valid = FALSE; + } else { + mp3parse->vbri_valid = TRUE; + } + } else { + GST_DEBUG_OBJECT (mp3parse, + "Xing, LAME or VBRI header not found in first frame"); + } + + /* set duration if tables provided a valid one */ + if (mp3parse->xing_flags & XING_FRAMES_FLAG) { + gst_base_parse_set_duration (GST_BASE_PARSE (mp3parse), GST_FORMAT_TIME, + mp3parse->xing_total_time, 0); + } + if (mp3parse->vbri_total_time != 0 && mp3parse->vbri_valid) { + gst_base_parse_set_duration (GST_BASE_PARSE (mp3parse), GST_FORMAT_TIME, + mp3parse->vbri_total_time, 0); + } + + /* tell baseclass how nicely we can seek, and a bitrate if one found */ + /* FIXME: fill index with seek table */ +#if 0 + seekable = GST_BASE_PARSE_SEEK_DEFAULT; + if ((mp3parse->xing_flags & XING_TOC_FLAG) && mp3parse->xing_bytes && + mp3parse->xing_total_time) + seekable = GST_BASE_PARSE_SEEK_TABLE; + + if (mp3parse->vbri_seek_table && mp3parse->vbri_bytes && + mp3parse->vbri_total_time) + seekable = GST_BASE_PARSE_SEEK_TABLE; +#endif + + if (mp3parse->xing_bitrate) + bitrate = mp3parse->xing_bitrate; + else if (mp3parse->vbri_bitrate) + bitrate = mp3parse->vbri_bitrate; + else + bitrate = 0; + + gst_base_parse_set_average_bitrate (GST_BASE_PARSE (mp3parse), bitrate); +} + +static GstFlowReturn +gst_mpeg_audio_parse_parse_frame (GstBaseParse * parse, + GstBaseParseFrame * frame) +{ + GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); + GstBuffer *buf = frame->buffer; + guint bitrate, layer, rate, channels, version, mode, crc; + + g_return_val_if_fail (GST_BUFFER_SIZE (buf) >= 4, GST_FLOW_ERROR); + + if (!mp3_type_frame_length_from_header (mp3parse, + GST_READ_UINT32_BE (GST_BUFFER_DATA (buf)), + &version, &layer, &channels, &bitrate, &rate, &mode, &crc)) + goto broken_header; + +#ifdef GST_EXT_MPEGAUDIO_MODIFICATION + /* For Layer-2 there are some combinations of bitrate and mode which are not allowed. */ + if (version == 1 && layer == 2) { + if ((channels == 1 && bitrate >= 224 * 1000) || + (channels == 2 && (bitrate == 320 * 1000 || bitrate == 48 * 1000 || bitrate == 56 * 1000 || bitrate == 80 * 1000))) { + GST_ERROR_OBJECT (mp3parse, + "Mpeg version %d layer %d channel:%d bitrate:%d spec out!", version, layer, channels, bitrate); + goto broken_header; + } + } +#endif + + if (G_UNLIKELY (channels != mp3parse->channels || rate != mp3parse->rate || + layer != mp3parse->layer || version != mp3parse->version)) { + GstCaps *caps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 1, + "mpegaudioversion", G_TYPE_INT, version, + "layer", G_TYPE_INT, layer, + "rate", G_TYPE_INT, rate, + "channels", G_TYPE_INT, channels, "parsed", G_TYPE_BOOLEAN, TRUE, NULL); + gst_buffer_set_caps (buf, caps); + gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps); + gst_caps_unref (caps); + + mp3parse->rate = rate; + mp3parse->channels = channels; + mp3parse->layer = layer; + mp3parse->version = version; + + /* see http://www.codeproject.com/audio/MPEGAudioInfo.asp */ + if (mp3parse->layer == 1) + mp3parse->spf = 384; + else if (mp3parse->layer == 2) + mp3parse->spf = 1152; + else if (mp3parse->version == 1) { + mp3parse->spf = 1152; + } else { + /* MPEG-2 or "2.5" */ + mp3parse->spf = 576; + } + + /* lead_in: + * We start pushing 9 frames earlier (29 frames for MPEG2) than + * segment start to be able to decode the first frame we want. + * 9 (29) frames are the theoretical maximum of frames that contain + * data for the current frame (bit reservoir). + * + * lead_out: + * Some mp3 streams have an offset in the timestamps, for which we have to + * push the frame *after* the end position in order for the decoder to be + * able to decode everything up until the segment.stop position. */ + gst_base_parse_set_frame_rate (parse, mp3parse->rate, mp3parse->spf, + (version == 1) ? 10 : 30, 2); + } + + mp3parse->hdr_bitrate = bitrate; + + /* For first frame; check for seek tables and output a codec tag */ + gst_mpeg_audio_parse_handle_first_frame (mp3parse, buf); + + /* store some frame info for later processing */ + mp3parse->last_crc = crc; + mp3parse->last_mode = mode; + + return GST_FLOW_OK; + +/* ERRORS */ +broken_header: + { + /* this really shouldn't ever happen */ + GST_ELEMENT_ERROR (parse, STREAM, DECODE, (NULL), (NULL)); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_mpeg_audio_parse_time_to_bytepos (GstMpegAudioParse * mp3parse, + GstClockTime ts, gint64 * bytepos) +{ + gint64 total_bytes; + GstClockTime total_time; + + /* If XING seek table exists use this for time->byte conversion */ + if ((mp3parse->xing_flags & XING_TOC_FLAG) && + (total_bytes = mp3parse->xing_bytes) && + (total_time = mp3parse->xing_total_time)) { + gdouble fa, fb, fx; + gdouble percent = + CLAMP ((100.0 * gst_util_guint64_to_gdouble (ts)) / + gst_util_guint64_to_gdouble (total_time), 0.0, 100.0); + gint index = CLAMP (percent, 0, 99); + + fa = mp3parse->xing_seek_table[index]; + if (index < 99) + fb = mp3parse->xing_seek_table[index + 1]; + else + fb = 256.0; + + fx = fa + (fb - fa) * (percent - index); + + *bytepos = (1.0 / 256.0) * fx * total_bytes; + + return TRUE; + } + + if (mp3parse->vbri_seek_table && (total_bytes = mp3parse->vbri_bytes) && + (total_time = mp3parse->vbri_total_time)) { + gint i, j; + gdouble a, b, fa, fb; + + i = gst_util_uint64_scale (ts, mp3parse->vbri_seek_points - 1, total_time); + i = CLAMP (i, 0, mp3parse->vbri_seek_points - 1); + + a = gst_guint64_to_gdouble (gst_util_uint64_scale (i, total_time, + mp3parse->vbri_seek_points)); + fa = 0.0; + for (j = i; j >= 0; j--) + fa += mp3parse->vbri_seek_table[j]; + + if (i + 1 < mp3parse->vbri_seek_points) { + b = gst_guint64_to_gdouble (gst_util_uint64_scale (i + 1, total_time, + mp3parse->vbri_seek_points)); + fb = fa + mp3parse->vbri_seek_table[i + 1]; + } else { + b = gst_guint64_to_gdouble (total_time); + fb = total_bytes; + } + + *bytepos = fa + ((fb - fa) / (b - a)) * (gst_guint64_to_gdouble (ts) - a); + + return TRUE; + } + + return FALSE; +} + +static gboolean +gst_mpeg_audio_parse_bytepos_to_time (GstMpegAudioParse * mp3parse, + gint64 bytepos, GstClockTime * ts) +{ + gint64 total_bytes; + GstClockTime total_time; + + /* If XING seek table exists use this for byte->time conversion */ + if ((mp3parse->xing_flags & XING_TOC_FLAG) && + (total_bytes = mp3parse->xing_bytes) && + (total_time = mp3parse->xing_total_time)) { + gdouble fa, fb, fx; + gdouble pos; + gint index; + + pos = CLAMP ((bytepos * 256.0) / total_bytes, 0.0, 256.0); + index = CLAMP (pos, 0, 255); + fa = mp3parse->xing_seek_table_inverse[index]; + if (index < 255) + fb = mp3parse->xing_seek_table_inverse[index + 1]; + else + fb = 10000.0; + + fx = fa + (fb - fa) * (pos - index); + + *ts = (1.0 / 10000.0) * fx * gst_util_guint64_to_gdouble (total_time); + + return TRUE; + } + + if (mp3parse->vbri_seek_table && + (total_bytes = mp3parse->vbri_bytes) && + (total_time = mp3parse->vbri_total_time)) { + gint i = 0; + guint64 sum = 0; + gdouble a, b, fa, fb; + + do { + sum += mp3parse->vbri_seek_table[i]; + i++; + } while (i + 1 < mp3parse->vbri_seek_points + && sum + mp3parse->vbri_seek_table[i] < bytepos); + i--; + + a = gst_guint64_to_gdouble (sum); + fa = gst_guint64_to_gdouble (gst_util_uint64_scale (i, total_time, + mp3parse->vbri_seek_points)); + + if (i + 1 < mp3parse->vbri_seek_points) { + b = a + mp3parse->vbri_seek_table[i + 1]; + fb = gst_guint64_to_gdouble (gst_util_uint64_scale (i + 1, total_time, + mp3parse->vbri_seek_points)); + } else { + b = total_bytes; + fb = gst_guint64_to_gdouble (total_time); + } + + *ts = gst_gdouble_to_guint64 (fa + ((fb - fa) / (b - a)) * (bytepos - a)); + + return TRUE; + } + + return FALSE; +} + +static gboolean +gst_mpeg_audio_parse_convert (GstBaseParse * parse, GstFormat src_format, + gint64 src_value, GstFormat dest_format, gint64 * dest_value) +{ + GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); + gboolean res = FALSE; + + if (src_format == GST_FORMAT_TIME && dest_format == GST_FORMAT_BYTES) + res = + gst_mpeg_audio_parse_time_to_bytepos (mp3parse, src_value, dest_value); + else if (src_format == GST_FORMAT_BYTES && dest_format == GST_FORMAT_TIME) + res = gst_mpeg_audio_parse_bytepos_to_time (mp3parse, src_value, + (GstClockTime *) dest_value); + + /* if no tables, fall back to default estimated rate based conversion */ + if (!res) + return gst_base_parse_convert_default (parse, src_format, src_value, + dest_format, dest_value); + + return res; +} + +static GstFlowReturn +gst_mpeg_audio_parse_pre_push_frame (GstBaseParse * parse, + GstBaseParseFrame * frame) +{ + GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); + GstTagList *taglist; + + /* tag sending done late enough in hook to ensure pending events + * have already been sent */ + + if (!mp3parse->sent_codec_tag) { + gchar *codec; + + /* codec tag */ + if (mp3parse->layer == 3) { + codec = g_strdup_printf ("MPEG %d Audio, Layer %d (MP3)", + mp3parse->version, mp3parse->layer); + } else { + codec = g_strdup_printf ("MPEG %d Audio, Layer %d", + mp3parse->version, mp3parse->layer); + } + taglist = gst_tag_list_new (); + gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, codec, NULL); + if (mp3parse->hdr_bitrate > 0 && mp3parse->xing_bitrate == 0 && + mp3parse->vbri_bitrate == 0) { + /* We don't have a VBR bitrate, so post the available bitrate as + * nominal and let baseparse calculate the real bitrate */ + gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, + GST_TAG_NOMINAL_BITRATE, mp3parse->hdr_bitrate, NULL); + } + gst_element_found_tags_for_pad (GST_ELEMENT (mp3parse), + GST_BASE_PARSE_SRC_PAD (mp3parse), taglist); + g_free (codec); + + /* also signals the end of first-frame processing */ + mp3parse->sent_codec_tag = TRUE; + } + + /* we will create a taglist (if any of the parameters has changed) + * to add the tags that changed */ + taglist = NULL; + if (mp3parse->last_posted_crc != mp3parse->last_crc) { + gboolean using_crc; + + if (!taglist) { + taglist = gst_tag_list_new (); + } + mp3parse->last_posted_crc = mp3parse->last_crc; + if (mp3parse->last_posted_crc == CRC_PROTECTED) { + using_crc = TRUE; + } else { + using_crc = FALSE; + } + gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_CRC, + using_crc, NULL); + } + + if (mp3parse->last_posted_channel_mode != mp3parse->last_mode) { + if (!taglist) { + taglist = gst_tag_list_new (); + } + mp3parse->last_posted_channel_mode = mp3parse->last_mode; + + gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_MODE, + gst_mpeg_audio_channel_mode_get_nick (mp3parse->last_mode), NULL); + } + + /* if the taglist exists, we need to send it */ + if (taglist) { + gst_element_found_tags_for_pad (GST_ELEMENT (mp3parse), + GST_BASE_PARSE_SRC_PAD (mp3parse), taglist); + } + + /* usual clipping applies */ + frame->flags |= GST_BASE_PARSE_FRAME_FLAG_CLIP; + + return GST_FLOW_OK; +} + +static GstCaps * +gst_mpeg_audio_parse_get_sink_caps (GstBaseParse * parse) +{ + GstCaps *peercaps; + GstCaps *res; + + peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); + if (peercaps) { + guint i, n; + + /* Remove the parsed field */ + peercaps = gst_caps_make_writable (peercaps); + n = gst_caps_get_size (peercaps); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (peercaps, i); + + gst_structure_remove_field (s, "parsed"); + } + + res = + gst_caps_intersect_full (peercaps, + gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (peercaps); + } else { + res = + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD + (parse))); + } + + return res; +} diff --git a/gst/audioparsers/gstmpegaudioparse.h b/gst/audioparsers/gstmpegaudioparse.h new file mode 100644 index 0000000..7580001 --- /dev/null +++ b/gst/audioparsers/gstmpegaudioparse.h @@ -0,0 +1,111 @@ +/* GStreamer MPEG audio parser + * Copyright (C) 2006-2007 Jan Schmidt + * Copyright (C) 2010 Mark Nauwelaerts + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + * + * 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_MPEG_AUDIO_PARSE_H__ +#define __GST_MPEG_AUDIO_PARSE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_MPEG_AUDIO_PARSE \ + (gst_mpeg_audio_parse_get_type()) +#define GST_MPEG_AUDIO_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_MPEG_AUDIO_PARSE, GstMpegAudioParse)) +#define GST_MPEG_AUDIO_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_MPEG_AUDIO_PARSE, GstMpegAudioParseClass)) +#define GST_IS_MPEG_AUDIO_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_MPEG_AUDIO_PARSE)) +#define GST_IS_MPEG_AUDIO_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_MPEG_AUDIO_PARSE)) + +typedef struct _GstMpegAudioParse GstMpegAudioParse; +typedef struct _GstMpegAudioParseClass GstMpegAudioParseClass; + +/** + * GstMpegAudioParse: + * + * The opaque GstMpegAudioParse object + */ +struct _GstMpegAudioParse { + GstBaseParse baseparse; + + /*< private >*/ + gint rate; + gint channels; + gint layer; + gint version; + + GstClockTime max_bitreservoir; + /* samples per frame */ + gint spf; + + gboolean sent_codec_tag; + guint last_posted_bitrate; + gint last_posted_crc, last_crc; + guint last_posted_channel_mode, last_mode; + + /* Bitrate from non-vbr headers */ + guint32 hdr_bitrate; + + /* Xing info */ + guint32 xing_flags; + guint32 xing_frames; + GstClockTime xing_total_time; + guint32 xing_bytes; + /* percent -> filepos mapping */ + guchar xing_seek_table[100]; + /* filepos -> percent mapping */ + guint16 xing_seek_table_inverse[256]; + guint32 xing_vbr_scale; + guint xing_bitrate; + + /* VBRI info */ + guint32 vbri_frames; + GstClockTime vbri_total_time; + guint32 vbri_bytes; + guint vbri_bitrate; + guint vbri_seek_points; + guint32 *vbri_seek_table; + gboolean vbri_valid; + + /* LAME info */ + guint32 encoder_delay; + guint32 encoder_padding; +}; + +/** + * GstMpegAudioParseClass: + * @parent_class: Element parent class. + * + * The opaque GstMpegAudioParseClass data structure. + */ +struct _GstMpegAudioParseClass { + GstBaseParseClass baseparse_class; +}; + +GType gst_mpeg_audio_parse_get_type (void); + +G_END_DECLS + +#endif /* __GST_MPEG_AUDIO_PARSE_H__ */ diff --git a/gst/audioparsers/plugin.c b/gst/audioparsers/plugin.c new file mode 100644 index 0000000..ae8332d --- /dev/null +++ b/gst/audioparsers/plugin.c @@ -0,0 +1,57 @@ +/* GStreamer audio parsers + * Copyright (C) 2009 Tim-Philipp Müller + * + * 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 "gstaacparse.h" +#include "gstamrparse.h" +#include "gstac3parse.h" +#include "gstdcaparse.h" +#include "gstflacparse.h" +#include "gstmpegaudioparse.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret; + + ret = gst_element_register (plugin, "aacparse", + GST_RANK_PRIMARY + 1, GST_TYPE_AAC_PARSE); + ret &= gst_element_register (plugin, "amrparse", + GST_RANK_PRIMARY + 1, GST_TYPE_AMR_PARSE); + ret &= gst_element_register (plugin, "ac3parse", + GST_RANK_PRIMARY + 1, GST_TYPE_AC3_PARSE); + ret &= gst_element_register (plugin, "dcaparse", + GST_RANK_PRIMARY + 1, GST_TYPE_DCA_PARSE); + ret &= gst_element_register (plugin, "flacparse", + GST_RANK_PRIMARY + 1, GST_TYPE_FLAC_PARSE); + ret &= gst_element_register (plugin, "mpegaudioparse", + GST_RANK_PRIMARY + 2, GST_TYPE_MPEG_AUDIO_PARSE); + + return ret; +} + + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "audioparsers", + "Parsers for various audio formats", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/auparse/Makefile.am b/gst/auparse/Makefile.am new file mode 100644 index 0000000..a79fb7b --- /dev/null +++ b/gst/auparse/Makefile.am @@ -0,0 +1,23 @@ +plugin_LTLIBRARIES = libgstauparse.la + +libgstauparse_la_SOURCES = gstauparse.c +libgstauparse_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstauparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstauparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstauparse_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstauparse.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstauparse -:SHARED libgstauparse \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstauparse_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstauparse_la_CFLAGS) \ + -:LDFLAGS $(libgstauparse_la_LDFLAGS) \ + $(libgstauparse_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/auparse/Makefile.in b/gst/auparse/Makefile.in new file mode 100644 index 0000000..392cb0a --- /dev/null +++ b/gst/auparse/Makefile.in @@ -0,0 +1,819 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/auparse +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstauparse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstauparse_la_OBJECTS = libgstauparse_la-gstauparse.lo +libgstauparse_la_OBJECTS = $(am_libgstauparse_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstauparse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstauparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstauparse_la_CFLAGS) $(CFLAGS) \ + $(libgstauparse_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstauparse_la_SOURCES) +DIST_SOURCES = $(libgstauparse_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstauparse.la +libgstauparse_la_SOURCES = gstauparse.c +libgstauparse_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstauparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstauparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstauparse_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstauparse.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/auparse/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/auparse/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstauparse.la: $(libgstauparse_la_OBJECTS) $(libgstauparse_la_DEPENDENCIES) $(EXTRA_libgstauparse_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstauparse_la_LINK) -rpath $(plugindir) $(libgstauparse_la_OBJECTS) $(libgstauparse_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstauparse_la-gstauparse.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstauparse_la-gstauparse.lo: gstauparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstauparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstauparse_la_CFLAGS) $(CFLAGS) -MT libgstauparse_la-gstauparse.lo -MD -MP -MF $(DEPDIR)/libgstauparse_la-gstauparse.Tpo -c -o libgstauparse_la-gstauparse.lo `test -f 'gstauparse.c' || echo '$(srcdir)/'`gstauparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstauparse_la-gstauparse.Tpo $(DEPDIR)/libgstauparse_la-gstauparse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstauparse.c' object='libgstauparse_la-gstauparse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstauparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstauparse_la_CFLAGS) $(CFLAGS) -c -o libgstauparse_la-gstauparse.lo `test -f 'gstauparse.c' || echo '$(srcdir)/'`gstauparse.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstauparse -:SHARED libgstauparse \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstauparse_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstauparse_la_CFLAGS) \ + -:LDFLAGS $(libgstauparse_la_LDFLAGS) \ + $(libgstauparse_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/auparse/gstauparse.c b/gst/auparse/gstauparse.c new file mode 100644 index 0000000..e0cdc82 --- /dev/null +++ b/gst/auparse/gstauparse.c @@ -0,0 +1,822 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Tim-Philipp Müller + * + * 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-auparse + * + * Parses .au files mostly originating from sun os based computers. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstauparse.h" +#include + +GST_DEBUG_CATEGORY_STATIC (auparse_debug); +#define GST_CAT_DEFAULT (auparse_debug) + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-au") + ); + +#define GST_AU_PARSE_ALAW_PAD_TEMPLATE_CAPS \ + "audio/x-alaw, " \ + "rate = (int) [ 8000, 192000 ], " \ + "channels = (int) [ 1, 2 ]" + +#define GST_AU_PARSE_MULAW_PAD_TEMPLATE_CAPS \ + "audio/x-mulaw, " \ + "rate = (int) [ 8000, 192000 ], " \ + "channels = (int) [ 1, 2 ]" + +/* Nothing to decode those ADPCM streams for now */ +#define GST_AU_PARSE_ADPCM_PAD_TEMPLATE_CAPS \ + "audio/x-adpcm, " \ + "layout = (string) { g721, g722, g723_3, g723_5 }" + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS ";" + GST_AU_PARSE_ALAW_PAD_TEMPLATE_CAPS ";" + GST_AU_PARSE_MULAW_PAD_TEMPLATE_CAPS ";" + GST_AU_PARSE_ADPCM_PAD_TEMPLATE_CAPS)); + + +static void gst_au_parse_dispose (GObject * object); +static GstFlowReturn gst_au_parse_chain (GstPad * pad, GstBuffer * buf); +static GstStateChangeReturn gst_au_parse_change_state (GstElement * element, + GstStateChange transition); +static void gst_au_parse_reset (GstAuParse * auparse); +static gboolean gst_au_parse_remove_srcpad (GstAuParse * auparse); +static gboolean gst_au_parse_add_srcpad (GstAuParse * auparse, GstCaps * caps); +static gboolean gst_au_parse_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_au_parse_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_au_parse_sink_event (GstPad * pad, GstEvent * event); +static gboolean gst_au_parse_src_convert (GstAuParse * auparse, + GstFormat src_format, gint64 srcval, GstFormat dest_format, + gint64 * destval); + +GST_BOILERPLATE (GstAuParse, gst_au_parse, GstElement, GST_TYPE_ELEMENT); + +static void +gst_au_parse_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_set_details_simple (element_class, "AU audio demuxer", + "Codec/Demuxer/Audio", + "Parse an .au file into raw audio", + "Erik Walthinsen "); + + GST_DEBUG_CATEGORY_INIT (auparse_debug, "auparse", 0, ".au parser"); +} + +static void +gst_au_parse_class_init (GstAuParseClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->dispose = gst_au_parse_dispose; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_au_parse_change_state); +} + +static void +gst_au_parse_init (GstAuParse * auparse, GstAuParseClass * klass) +{ + auparse->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); + gst_pad_set_chain_function (auparse->sinkpad, + GST_DEBUG_FUNCPTR (gst_au_parse_chain)); + gst_pad_set_event_function (auparse->sinkpad, + GST_DEBUG_FUNCPTR (gst_au_parse_sink_event)); + gst_element_add_pad (GST_ELEMENT (auparse), auparse->sinkpad); + + auparse->srcpad = NULL; + auparse->adapter = gst_adapter_new (); + gst_au_parse_reset (auparse); +} + +static void +gst_au_parse_dispose (GObject * object) +{ + GstAuParse *au = GST_AU_PARSE (object); + + if (au->adapter != NULL) { + g_object_unref (au->adapter); + au->adapter = NULL; + } + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_au_parse_reset (GstAuParse * auparse) +{ + gst_au_parse_remove_srcpad (auparse); + + auparse->offset = 0; + auparse->buffer_offset = 0; + auparse->encoding = 0; + auparse->samplerate = 0; + auparse->channels = 0; + + gst_adapter_clear (auparse->adapter); + + /* gst_segment_init (&auparse->segment, GST_FORMAT_TIME); */ +} + +static gboolean +gst_au_parse_add_srcpad (GstAuParse * auparse, GstCaps * new_caps) +{ + if (auparse->src_caps && gst_caps_is_equal (new_caps, auparse->src_caps)) { + GST_LOG_OBJECT (auparse, "same caps, nothing to do"); + return TRUE; + } + + gst_caps_replace (&auparse->src_caps, new_caps); + if (auparse->srcpad != NULL) { + GST_DEBUG_OBJECT (auparse, "Changing src pad caps to %" GST_PTR_FORMAT, + auparse->src_caps); + gst_pad_set_caps (auparse->srcpad, auparse->src_caps); + } + + if (auparse->srcpad == NULL) { + auparse->srcpad = gst_pad_new_from_static_template (&src_template, "src"); + g_return_val_if_fail (auparse->srcpad != NULL, FALSE); + +#if 0 + gst_pad_set_query_type_function (auparse->srcpad, + GST_DEBUG_FUNCPTR (gst_au_parse_src_get_query_types)); +#endif + gst_pad_set_query_function (auparse->srcpad, + GST_DEBUG_FUNCPTR (gst_au_parse_src_query)); + gst_pad_set_event_function (auparse->srcpad, + GST_DEBUG_FUNCPTR (gst_au_parse_src_event)); + + gst_pad_use_fixed_caps (auparse->srcpad); + gst_pad_set_active (auparse->srcpad, TRUE); + + if (auparse->src_caps) + gst_pad_set_caps (auparse->srcpad, auparse->src_caps); + + GST_DEBUG_OBJECT (auparse, "Adding src pad with caps %" GST_PTR_FORMAT, + auparse->src_caps); + + gst_object_ref (auparse->srcpad); + if (!gst_element_add_pad (GST_ELEMENT (auparse), auparse->srcpad)) + return FALSE; + gst_element_no_more_pads (GST_ELEMENT (auparse)); + } + + return TRUE; +} + +static gboolean +gst_au_parse_remove_srcpad (GstAuParse * auparse) +{ + gboolean res = TRUE; + + if (auparse->srcpad != NULL) { + GST_DEBUG_OBJECT (auparse, "Removing src pad"); + res = gst_element_remove_pad (GST_ELEMENT (auparse), auparse->srcpad); + g_return_val_if_fail (res != FALSE, FALSE); + gst_object_unref (auparse->srcpad); + auparse->srcpad = NULL; + } + + return res; +} + +static GstFlowReturn +gst_au_parse_parse_header (GstAuParse * auparse) +{ + GstCaps *tempcaps; + guint32 size; + guint8 *head; + gchar layout[7] = { 0, }; + gint law = 0, depth = 0, ieee = 0; + + head = (guint8 *) gst_adapter_peek (auparse->adapter, 24); + g_assert (head != NULL); + + GST_DEBUG_OBJECT (auparse, "[%c%c%c%c]", head[0], head[1], head[2], head[3]); + + switch (GST_READ_UINT32_BE (head)) { + /* normal format is big endian (au is a Sparc format) */ + case 0x2e736e64:{ /* ".snd" */ + auparse->endianness = G_BIG_ENDIAN; + break; + } + /* and of course, someone had to invent a little endian + * version. Used by DEC systems. */ + case 0x646e732e: /* dns. */ + case 0x0064732e:{ /* other source say it is "dns." */ + auparse->endianness = G_LITTLE_ENDIAN; + break; + } + default:{ + goto unknown_header; + } + } + + auparse->offset = GST_READ_UINT32_BE (head + 4); + /* Do not trust size, could be set to -1 : unknown + * otherwise: filesize = size + auparse->offset + */ + size = GST_READ_UINT32_BE (head + 8); + auparse->encoding = GST_READ_UINT32_BE (head + 12); + auparse->samplerate = GST_READ_UINT32_BE (head + 16); + auparse->channels = GST_READ_UINT32_BE (head + 20); + + if (auparse->samplerate < 8000 || auparse->samplerate > 192000) + goto unsupported_sample_rate; + + if (auparse->channels < 1 || auparse->channels > 2) + goto unsupported_number_of_channels; + + GST_DEBUG_OBJECT (auparse, "offset %" G_GINT64_FORMAT ", size %u, " + "encoding %u, frequency %u, channels %u", auparse->offset, size, + auparse->encoding, auparse->samplerate, auparse->channels); + + /* Docs: + * http://www.opengroup.org/public/pubs/external/auformat.html + * http://astronomy.swin.edu.au/~pbourke/dataformats/au/ + * Solaris headers : /usr/include/audio/au.h + * libsndfile : src/au.c + * + * Samples : + * http://www.tsp.ece.mcgill.ca/MMSP/Documents/AudioFormats/AU/Samples.html + */ + + switch (auparse->encoding) { + case 1: /* 8-bit ISDN mu-law G.711 */ + law = 1; + depth = 8; + break; + case 27: /* 8-bit ISDN A-law G.711 */ + law = 2; + depth = 8; + break; + + case 2: /* 8-bit linear PCM */ + depth = 8; + break; + case 3: /* 16-bit linear PCM */ + depth = 16; + break; + case 4: /* 24-bit linear PCM */ + depth = 24; + break; + case 5: /* 32-bit linear PCM */ + depth = 32; + break; + + case 6: /* 32-bit IEEE floating point */ + ieee = 1; + depth = 32; + break; + case 7: /* 64-bit IEEE floating point */ + ieee = 1; + depth = 64; + break; + + case 23: /* 4-bit CCITT G.721 ADPCM 32kbps -> modplug/libsndfile (compressed 8-bit mu-law) */ + strcpy (layout, "g721"); + break; + case 24: /* 8-bit CCITT G.722 ADPCM -> rtp */ + strcpy (layout, "g722"); + break; + case 25: /* 3-bit CCITT G.723.3 ADPCM 24kbps -> rtp/xine/modplug/libsndfile */ + strcpy (layout, "g723_3"); + break; + case 26: /* 5-bit CCITT G.723.5 ADPCM 40kbps -> rtp/xine/modplug/libsndfile */ + strcpy (layout, "g723_5"); + break; + + case 8: /* Fragmented sample data */ + case 9: /* AU_ENCODING_NESTED */ + + case 10: /* DSP program */ + case 11: /* DSP 8-bit fixed point */ + case 12: /* DSP 16-bit fixed point */ + case 13: /* DSP 24-bit fixed point */ + case 14: /* DSP 32-bit fixed point */ + + case 16: /* AU_ENCODING_DISPLAY : non-audio display data */ + case 17: /* AU_ENCODING_MULAW_SQUELCH */ + + case 18: /* 16-bit linear with emphasis */ + case 19: /* 16-bit linear compressed (NeXT) */ + case 20: /* 16-bit linear with emphasis and compression */ + + case 21: /* Music kit DSP commands */ + case 22: /* Music kit DSP commands samples */ + + default: + goto unknown_format; + } + + if (law) { + tempcaps = + gst_caps_new_simple ((law == 1) ? "audio/x-mulaw" : "audio/x-alaw", + "rate", G_TYPE_INT, auparse->samplerate, + "channels", G_TYPE_INT, auparse->channels, NULL); + auparse->sample_size = auparse->channels; + } else if (ieee) { + tempcaps = gst_caps_new_simple ("audio/x-raw-float", + "rate", G_TYPE_INT, auparse->samplerate, + "channels", G_TYPE_INT, auparse->channels, + "endianness", G_TYPE_INT, auparse->endianness, + "width", G_TYPE_INT, depth, NULL); + auparse->sample_size = auparse->channels * depth / 8; + } else if (layout[0]) { + tempcaps = gst_caps_new_simple ("audio/x-adpcm", + "layout", G_TYPE_STRING, layout, NULL); + auparse->sample_size = 0; + } else { + tempcaps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, auparse->samplerate, + "channels", G_TYPE_INT, auparse->channels, + "endianness", G_TYPE_INT, auparse->endianness, + "depth", G_TYPE_INT, depth, "width", G_TYPE_INT, depth, + /* FIXME: signed TRUE even for 8-bit PCM? */ + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + auparse->sample_size = auparse->channels * depth / 8; + } + + GST_DEBUG_OBJECT (auparse, "sample_size=%d", auparse->sample_size); + + if (!gst_au_parse_add_srcpad (auparse, tempcaps)) + goto add_pad_failed; + + GST_DEBUG_OBJECT (auparse, "offset=%" G_GINT64_FORMAT, auparse->offset); + gst_adapter_flush (auparse->adapter, auparse->offset); + + gst_caps_unref (tempcaps); + return GST_FLOW_OK; + + /* ERRORS */ +unknown_header: + { + GST_ELEMENT_ERROR (auparse, STREAM, WRONG_TYPE, (NULL), (NULL)); + return GST_FLOW_ERROR; + } +unsupported_sample_rate: + { + GST_ELEMENT_ERROR (auparse, STREAM, FORMAT, (NULL), + ("Unsupported samplerate: %u", auparse->samplerate)); + return GST_FLOW_ERROR; + } +unsupported_number_of_channels: + { + GST_ELEMENT_ERROR (auparse, STREAM, FORMAT, (NULL), + ("Unsupported number of channels: %u", auparse->channels)); + return GST_FLOW_ERROR; + } +unknown_format: + { + GST_ELEMENT_ERROR (auparse, STREAM, FORMAT, (NULL), + ("Unsupported encoding: %u", auparse->encoding)); + return GST_FLOW_ERROR; + } +add_pad_failed: + { + GST_ELEMENT_ERROR (auparse, STREAM, FAILED, (NULL), + ("Failed to add srcpad")); + gst_caps_unref (tempcaps); + return GST_FLOW_ERROR; + } +} + +#define AU_HEADER_SIZE 24 + +static GstFlowReturn +gst_au_parse_chain (GstPad * pad, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstAuParse *auparse; + gint avail, sendnow = 0; + gint64 timestamp; + gint64 duration; + gint64 offset; + + auparse = GST_AU_PARSE (gst_pad_get_parent (pad)); + + GST_LOG_OBJECT (auparse, "got buffer of size %u", GST_BUFFER_SIZE (buf)); + + gst_adapter_push (auparse->adapter, buf); + buf = NULL; + + /* if we haven't seen any data yet... */ + if (auparse->srcpad == NULL) { + if (gst_adapter_available (auparse->adapter) < AU_HEADER_SIZE) { + GST_DEBUG_OBJECT (auparse, "need more data to parse header"); + ret = GST_FLOW_OK; + goto out; + } + + ret = gst_au_parse_parse_header (auparse); + if (ret != GST_FLOW_OK) + goto out; + + gst_pad_push_event (auparse->srcpad, + gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, + 0, GST_CLOCK_TIME_NONE, 0)); + } + + avail = gst_adapter_available (auparse->adapter); + + if (auparse->sample_size > 0) { + /* Ensure we push a buffer that's a multiple of the frame size downstream */ + sendnow = avail - (avail % auparse->sample_size); + } else { + /* It's something non-trivial (such as ADPCM), we don't understand it, so + * just push downstream and assume it will know what to do with it */ + sendnow = avail; + } + + if (sendnow > 0) { + GstBuffer *outbuf; + const guint8 *data; + gint64 pos; + + ret = gst_pad_alloc_buffer_and_set_caps (auparse->srcpad, + auparse->buffer_offset, sendnow, GST_PAD_CAPS (auparse->srcpad), + &outbuf); + + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (auparse, "pad alloc flow: %s", gst_flow_get_name (ret)); + goto out; + } + + data = gst_adapter_peek (auparse->adapter, sendnow); + memcpy (GST_BUFFER_DATA (outbuf), data, sendnow); + gst_adapter_flush (auparse->adapter, sendnow); + + pos = auparse->buffer_offset - auparse->offset; + pos = MAX (pos, 0); + + if (auparse->sample_size > 0 && auparse->samplerate > 0) { + gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, pos, + GST_FORMAT_DEFAULT, &offset); + gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, pos, + GST_FORMAT_TIME, ×tamp); + gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, + sendnow, GST_FORMAT_TIME, &duration); + + GST_BUFFER_OFFSET (outbuf) = offset; + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = duration; + } + + auparse->buffer_offset += sendnow; + + ret = gst_pad_push (auparse->srcpad, outbuf); + } + +out: + + gst_object_unref (auparse); + return ret; +} + +static gboolean +gst_au_parse_src_convert (GstAuParse * auparse, GstFormat src_format, + gint64 srcval, GstFormat dest_format, gint64 * destval) +{ + gboolean ret = TRUE; + guint samplesize, rate; + + if (dest_format == src_format) { + *destval = srcval; + return TRUE; + } + + GST_OBJECT_LOCK (auparse); + samplesize = auparse->sample_size; + rate = auparse->samplerate; + GST_OBJECT_UNLOCK (auparse); + + if (samplesize == 0 || rate == 0) { + GST_LOG_OBJECT (auparse, "cannot convert, sample_size or rate unknown"); + return FALSE; + } + + switch (src_format) { + case GST_FORMAT_BYTES: + srcval /= samplesize; + /* fallthrough */ + case GST_FORMAT_DEFAULT:{ + switch (dest_format) { + case GST_FORMAT_DEFAULT: + *destval = srcval; + break; + case GST_FORMAT_BYTES: + *destval = srcval * samplesize; + break; + case GST_FORMAT_TIME: + *destval = gst_util_uint64_scale_int (srcval, GST_SECOND, rate); + break; + default: + ret = FALSE; + break; + } + break; + } + case GST_FORMAT_TIME:{ + switch (dest_format) { + case GST_FORMAT_BYTES: + *destval = samplesize * + gst_util_uint64_scale_int (srcval, rate, GST_SECOND); + break; + case GST_FORMAT_DEFAULT: + *destval = gst_util_uint64_scale_int (srcval, rate, GST_SECOND); + break; + default: + ret = FALSE; + break; + } + break; + } + default:{ + ret = FALSE; + break; + } + } + + if (!ret) { + GST_DEBUG_OBJECT (auparse, "could not convert from %s to %s format", + gst_format_get_name (src_format), gst_format_get_name (dest_format)); + } + + return ret; +} + +static gboolean +gst_au_parse_src_query (GstPad * pad, GstQuery * query) +{ + GstAuParse *auparse; + gboolean ret = FALSE; + + auparse = GST_AU_PARSE (gst_pad_get_parent (pad)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_DURATION:{ + GstFormat bformat = GST_FORMAT_BYTES; + GstFormat format; + gint64 len, val; + + gst_query_parse_duration (query, &format, NULL); + if (!gst_pad_query_peer_duration (auparse->sinkpad, &bformat, &len)) { + GST_DEBUG_OBJECT (auparse, "failed to query upstream length"); + break; + } + GST_OBJECT_LOCK (auparse); + len -= auparse->offset; + GST_OBJECT_UNLOCK (auparse); + + ret = gst_au_parse_src_convert (auparse, bformat, len, format, &val); + + if (ret) { + gst_query_set_duration (query, format, val); + } + break; + } + case GST_QUERY_POSITION:{ + GstFormat bformat = GST_FORMAT_BYTES; + GstFormat format; + gint64 pos, val; + + gst_query_parse_position (query, &format, NULL); + if (!gst_pad_query_peer_position (auparse->sinkpad, &bformat, &pos)) { + GST_DEBUG_OBJECT (auparse, "failed to query upstream position"); + break; + } + GST_OBJECT_LOCK (auparse); + pos -= auparse->offset; + GST_OBJECT_UNLOCK (auparse); + + ret = gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, pos, + format, &val); + + if (ret) { + gst_query_set_position (query, format, val); + } + break; + } + case GST_QUERY_SEEKING:{ + GstFormat format; + + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + /* FIXME: query duration in 'format' + gst_query_set_seeking (query, format, TRUE, 0, duration); + */ + gst_query_set_seeking (query, format, TRUE, 0, GST_CLOCK_TIME_NONE); + ret = TRUE; + break; + } + default: + ret = gst_pad_query_default (pad, query); + break; + } + + gst_object_unref (auparse); + return ret; +} + +static gboolean +gst_au_parse_handle_seek (GstAuParse * auparse, GstEvent * event) +{ + GstSeekType start_type, stop_type; + GstSeekFlags flags; + GstFormat format; + gdouble rate; + gint64 start, stop; + gboolean res; + + gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, + &stop_type, &stop); + + if (format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (auparse, "only support seeks in TIME format"); + return FALSE; + } + + res = gst_au_parse_src_convert (auparse, GST_FORMAT_TIME, start, + GST_FORMAT_BYTES, &start); + + if (stop > 0) { + res = gst_au_parse_src_convert (auparse, GST_FORMAT_TIME, stop, + GST_FORMAT_BYTES, &stop); + } + + GST_INFO_OBJECT (auparse, + "seeking: %" G_GINT64_FORMAT " ... %" G_GINT64_FORMAT, start, stop); + + event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, start_type, start, + stop_type, stop); + res = gst_pad_push_event (auparse->sinkpad, event); + return res; +} + +static gboolean +gst_au_parse_sink_event (GstPad * pad, GstEvent * event) +{ + GstAuParse *auparse; + gboolean ret = TRUE; + + auparse = GST_AU_PARSE (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time, offset = 0; + gboolean update; + GstSegment segment; + GstEvent *new_event = NULL; + + gst_segment_init (&segment, GST_FORMAT_UNDEFINED); + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + gst_segment_set_newsegment_full (&segment, update, rate, arate, format, + start, stop, time); + + if (auparse->sample_size > 0) { + if (start > 0) { + offset = start; + start -= auparse->offset; + start = MAX (start, 0); + } + if (stop > 0) { + stop -= auparse->offset; + stop = MAX (stop, 0); + } + gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, start, + GST_FORMAT_TIME, &start); + gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, stop, + GST_FORMAT_TIME, &stop); + } + + if (auparse->srcpad) { + GST_INFO_OBJECT (auparse, + "new segment: %" GST_TIME_FORMAT " ... %" GST_TIME_FORMAT, + GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); + + new_event = gst_event_new_new_segment_full (update, rate, arate, + GST_FORMAT_TIME, start, stop, start); + + ret = gst_pad_push_event (auparse->srcpad, new_event); + } + + auparse->buffer_offset = offset; + + gst_event_unref (event); + break; + } + case GST_EVENT_EOS: + if (!auparse->srcpad) { + GST_ELEMENT_ERROR (auparse, STREAM, WRONG_TYPE, + ("No valid input found before end of stream"), (NULL)); + } + /* fall-through */ + default: + ret = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (auparse); + return ret; +} + +static gboolean +gst_au_parse_src_event (GstPad * pad, GstEvent * event) +{ + GstAuParse *auparse; + gboolean ret; + + auparse = GST_AU_PARSE (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + ret = gst_au_parse_handle_seek (auparse, event); + break; + default: + ret = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (auparse); + return ret; +} + +static GstStateChangeReturn +gst_au_parse_change_state (GstElement * element, GstStateChange transition) +{ + GstAuParse *auparse = GST_AU_PARSE (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + ret = parent_class->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_au_parse_reset (auparse); + default: + break; + } + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "auparse", GST_RANK_SECONDARY, + GST_TYPE_AU_PARSE)) { + return FALSE; + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "auparse", + "parses au streams", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN) diff --git a/gst/auparse/gstauparse.h b/gst/auparse/gstauparse.h new file mode 100644 index 0000000..55d13e2 --- /dev/null +++ b/gst/auparse/gstauparse.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Tim-Philipp Müller + * + * 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_AU_PARSE_H__ +#define __GST_AU_PARSE_H__ + + +#include +#include + + +G_BEGIN_DECLS + +#define GST_TYPE_AU_PARSE \ + (gst_au_parse_get_type()) +#define GST_AU_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AU_PARSE,GstAuParse)) +#define GST_AU_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AU_PARSE,GstAuParseClass)) +#define GST_IS_AU_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AU_PARSE)) +#define GST_IS_AU_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AU_PARSE)) + +typedef struct _GstAuParse GstAuParse; +typedef struct _GstAuParseClass GstAuParseClass; + +struct _GstAuParse { + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; + + GstCaps *src_caps; + + GstAdapter *adapter; + + /* GstSegment segment; */ + + gint64 offset; /* where sample data starts */ + gint64 buffer_offset; + guint sample_size; + guint encoding; + guint samplerate; + guint endianness; + guint channels; +}; + +struct _GstAuParseClass { + GstElementClass parent_class; +}; + +GType gst_au_parse_get_type (void); + +G_END_DECLS + +#endif /* __GST_AU_PARSE_H__ */ diff --git a/gst/autodetect/Makefile.am b/gst/autodetect/Makefile.am new file mode 100644 index 0000000..5bf57c7 --- /dev/null +++ b/gst/autodetect/Makefile.am @@ -0,0 +1,33 @@ +plugin_LTLIBRARIES = libgstautodetect.la + +libgstautodetect_la_SOURCES = \ + gstautoaudiosink.c \ + gstautoaudiosrc.c \ + gstautodetect.c \ + gstautovideosink.c \ + gstautovideosrc.c +libgstautodetect_la_CFLAGS = $(GST_CFLAGS) +libgstautodetect_la_LIBADD = $(GST_LIBS) +libgstautodetect_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstautodetect_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + gstautoaudiosink.h \ + gstautoaudiosrc.h \ + gstautodetect.h \ + gstautovideosink.h \ + gstautovideosrc.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstautodetect -:SHARED libgstautodetect \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstautodetect_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstautodetect_la_CFLAGS) \ + -:LDFLAGS $(libgstautodetect_la_LDFLAGS) \ + $(libgstautodetect_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/autodetect/Makefile.in b/gst/autodetect/Makefile.in new file mode 100644 index 0000000..395497d --- /dev/null +++ b/gst/autodetect/Makefile.in @@ -0,0 +1,867 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/autodetect +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstautodetect_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libgstautodetect_la_OBJECTS = \ + libgstautodetect_la-gstautoaudiosink.lo \ + libgstautodetect_la-gstautoaudiosrc.lo \ + libgstautodetect_la-gstautodetect.lo \ + libgstautodetect_la-gstautovideosink.lo \ + libgstautodetect_la-gstautovideosrc.lo +libgstautodetect_la_OBJECTS = $(am_libgstautodetect_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstautodetect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstautodetect_la_CFLAGS) $(CFLAGS) \ + $(libgstautodetect_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstautodetect_la_SOURCES) +DIST_SOURCES = $(libgstautodetect_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstautodetect.la +libgstautodetect_la_SOURCES = \ + gstautoaudiosink.c \ + gstautoaudiosrc.c \ + gstautodetect.c \ + gstautovideosink.c \ + gstautovideosrc.c + +libgstautodetect_la_CFLAGS = $(GST_CFLAGS) +libgstautodetect_la_LIBADD = $(GST_LIBS) +libgstautodetect_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstautodetect_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + gstautoaudiosink.h \ + gstautoaudiosrc.h \ + gstautodetect.h \ + gstautovideosink.h \ + gstautovideosrc.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/autodetect/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/autodetect/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstautodetect.la: $(libgstautodetect_la_OBJECTS) $(libgstautodetect_la_DEPENDENCIES) $(EXTRA_libgstautodetect_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstautodetect_la_LINK) -rpath $(plugindir) $(libgstautodetect_la_OBJECTS) $(libgstautodetect_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautoaudiosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautoaudiosrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautodetect.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautovideosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautovideosrc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstautodetect_la-gstautoaudiosink.lo: gstautoaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautoaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautoaudiosink.Tpo -c -o libgstautodetect_la-gstautoaudiosink.lo `test -f 'gstautoaudiosink.c' || echo '$(srcdir)/'`gstautoaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautoaudiosink.Tpo $(DEPDIR)/libgstautodetect_la-gstautoaudiosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautoaudiosink.c' object='libgstautodetect_la-gstautoaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautoaudiosink.lo `test -f 'gstautoaudiosink.c' || echo '$(srcdir)/'`gstautoaudiosink.c + +libgstautodetect_la-gstautoaudiosrc.lo: gstautoaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautoaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautoaudiosrc.Tpo -c -o libgstautodetect_la-gstautoaudiosrc.lo `test -f 'gstautoaudiosrc.c' || echo '$(srcdir)/'`gstautoaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautoaudiosrc.Tpo $(DEPDIR)/libgstautodetect_la-gstautoaudiosrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautoaudiosrc.c' object='libgstautodetect_la-gstautoaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautoaudiosrc.lo `test -f 'gstautoaudiosrc.c' || echo '$(srcdir)/'`gstautoaudiosrc.c + +libgstautodetect_la-gstautodetect.lo: gstautodetect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautodetect.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautodetect.Tpo -c -o libgstautodetect_la-gstautodetect.lo `test -f 'gstautodetect.c' || echo '$(srcdir)/'`gstautodetect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautodetect.Tpo $(DEPDIR)/libgstautodetect_la-gstautodetect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautodetect.c' object='libgstautodetect_la-gstautodetect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautodetect.lo `test -f 'gstautodetect.c' || echo '$(srcdir)/'`gstautodetect.c + +libgstautodetect_la-gstautovideosink.lo: gstautovideosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautovideosink.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautovideosink.Tpo -c -o libgstautodetect_la-gstautovideosink.lo `test -f 'gstautovideosink.c' || echo '$(srcdir)/'`gstautovideosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautovideosink.Tpo $(DEPDIR)/libgstautodetect_la-gstautovideosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautovideosink.c' object='libgstautodetect_la-gstautovideosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautovideosink.lo `test -f 'gstautovideosink.c' || echo '$(srcdir)/'`gstautovideosink.c + +libgstautodetect_la-gstautovideosrc.lo: gstautovideosrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautovideosrc.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautovideosrc.Tpo -c -o libgstautodetect_la-gstautovideosrc.lo `test -f 'gstautovideosrc.c' || echo '$(srcdir)/'`gstautovideosrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautovideosrc.Tpo $(DEPDIR)/libgstautodetect_la-gstautovideosrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautovideosrc.c' object='libgstautodetect_la-gstautovideosrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautovideosrc.lo `test -f 'gstautovideosrc.c' || echo '$(srcdir)/'`gstautovideosrc.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstautodetect -:SHARED libgstautodetect \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstautodetect_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstautodetect_la_CFLAGS) \ + -:LDFLAGS $(libgstautodetect_la_LDFLAGS) \ + $(libgstautodetect_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/autodetect/gstautoaudiosink.c b/gst/autodetect/gstautoaudiosink.c new file mode 100644 index 0000000..535f294 --- /dev/null +++ b/gst/autodetect/gstautoaudiosink.c @@ -0,0 +1,445 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Jan Schmidt + * + * 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-autoaudiosink + * @see_also: autovideosink, alsasink, osssink + * + * autoaudiosink is an audio sink that automatically detects an appropriate + * audio sink to use. It does so by scanning the registry for all elements + * that have Sink and Audio in the class field + * of their element information, and also have a non-zero autoplugging rank. + * + * + * Example launch line + * |[ + * gst-launch -v -m audiotestsrc ! audioconvert ! audioresample ! autoaudiosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstautoaudiosink.h" +#include "gstautodetect.h" + +/* Properties */ +enum +{ + PROP_0, + PROP_CAPS, +}; + +static GstStateChangeReturn +gst_auto_audio_sink_change_state (GstElement * element, + GstStateChange transition); +static void gst_auto_audio_sink_dispose (GstAutoAudioSink * sink); +static void gst_auto_audio_sink_clear_kid (GstAutoAudioSink * sink); +static void gst_auto_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_auto_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +GST_BOILERPLATE (GstAutoAudioSink, gst_auto_audio_sink, GstBin, GST_TYPE_BIN); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static void +gst_auto_audio_sink_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (eklass, &sink_template); + + gst_element_class_set_details_simple (eklass, "Auto audio sink", + "Sink/Audio", + "Wrapper audio sink for automatically detected audio sink", + "Jan Schmidt "); +} + +static void +gst_auto_audio_sink_class_init (GstAutoAudioSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *eklass; + + gobject_class = G_OBJECT_CLASS (klass); + eklass = GST_ELEMENT_CLASS (klass); + + gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_audio_sink_dispose; + gobject_class->set_property = gst_auto_audio_sink_set_property; + gobject_class->get_property = gst_auto_audio_sink_get_property; + + eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_audio_sink_change_state); + + /** + * GstAutoAudioSink:filter-caps + * + * This property will filter out candidate sinks that can handle the specified + * caps. By default only audio sinks that support raw floating point and + * integer audio are selected. + * + * This property can only be set before the element goes to the READY state. + * + * Since: 0.10.7 + **/ + g_object_class_install_property (gobject_class, PROP_CAPS, + g_param_spec_boxed ("filter-caps", "Filter caps", + "Filter sink candidates using these caps.", GST_TYPE_CAPS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_auto_audio_sink_dispose (GstAutoAudioSink * sink) +{ + gst_auto_audio_sink_clear_kid (sink); + + if (sink->filter_caps) + gst_caps_unref (sink->filter_caps); + sink->filter_caps = NULL; + + G_OBJECT_CLASS (parent_class)->dispose ((GObject *) sink); +} + +static void +gst_auto_audio_sink_clear_kid (GstAutoAudioSink * sink) +{ + if (sink->kid) { + gst_element_set_state (sink->kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (sink), sink->kid); + sink->kid = NULL; + /* Don't lose the SINK flag */ + GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); + } +} + +/* + * Hack to make initial linking work; ideally, this'd work even when + * no target has been assigned to the ghostpad yet. + */ +static void +gst_auto_audio_sink_reset (GstAutoAudioSink * sink) +{ + GstPad *targetpad; + + gst_auto_audio_sink_clear_kid (sink); + + /* fakesink placeholder */ + sink->kid = gst_element_factory_make ("fakesink", "tempsink"); + gst_bin_add (GST_BIN (sink), sink->kid); + + /* pad */ + targetpad = gst_element_get_static_pad (sink->kid, "sink"); + gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); + gst_object_unref (targetpad); +} + +static GstStaticCaps raw_caps = + GST_STATIC_CAPS ("audio/x-raw-int; audio/x-raw-float"); + +static void +gst_auto_audio_sink_init (GstAutoAudioSink * sink, + GstAutoAudioSinkClass * g_class) +{ + sink->pad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (sink), sink->pad); + + gst_auto_audio_sink_reset (sink); + + /* set the default raw audio caps */ + sink->filter_caps = gst_static_caps_get (&raw_caps); + + /* mark as sink */ + GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); +} + +static gboolean +gst_auto_audio_sink_factory_filter (GstPluginFeature * feature, gpointer data) +{ + guint rank; + const gchar *klass; + + /* we only care about element factories */ + if (!GST_IS_ELEMENT_FACTORY (feature)) + return FALSE; + + /* audio sinks */ + klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature)); + if (!(strstr (klass, "Sink") && strstr (klass, "Audio"))) + return FALSE; + + /* only select elements with autoplugging rank */ + rank = gst_plugin_feature_get_rank (feature); + if (rank < GST_RANK_MARGINAL) + return FALSE; + + return TRUE; +} + +static gint +gst_auto_audio_sink_compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2) +{ + gint diff; + + diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1); + if (diff != 0) + return diff; + return strcmp (gst_plugin_feature_get_name (f2), + gst_plugin_feature_get_name (f1)); +} + +static GstElement * +gst_auto_audio_sink_create_element_with_pretty_name (GstAutoAudioSink * sink, + GstElementFactory * factory) +{ + GstElement *element; + gchar *name, *marker; + + marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name); + if (g_str_has_suffix (marker, "sink")) + marker[strlen (marker) - 4] = '\0'; + if (g_str_has_prefix (marker, "gst")) + g_memmove (marker, marker + 3, strlen (marker + 3) + 1); + name = g_strdup_printf ("%s-actual-sink-%s", GST_OBJECT_NAME (sink), marker); + g_free (marker); + + element = gst_element_factory_create (factory, name); + g_free (name); + + return element; +} + +static GstElement * +gst_auto_audio_sink_find_best (GstAutoAudioSink * sink) +{ + GList *list, *item; + GstElement *choice = NULL; + GstMessage *message = NULL; + GSList *errors = NULL; + GstBus *bus = gst_bus_new (); + GstPad *el_pad = NULL; + GstCaps *el_caps = NULL; + gboolean no_match = TRUE; + + list = gst_registry_feature_filter (gst_registry_get_default (), + (GstPluginFeatureFilter) gst_auto_audio_sink_factory_filter, FALSE, sink); + list = g_list_sort (list, (GCompareFunc) gst_auto_audio_sink_compare_ranks); + + /* We don't treat sound server sinks special. Our policy is that sound + * server sinks that have a rank must not auto-spawn a daemon under any + * circumstances, so there's nothing for us to worry about here */ + GST_LOG_OBJECT (sink, "Trying to find usable audio devices ..."); + + for (item = list; item != NULL; item = item->next) { + GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); + GstElement *el; + + if ((el = gst_auto_audio_sink_create_element_with_pretty_name (sink, f))) { + GstStateChangeReturn ret; + + GST_DEBUG_OBJECT (sink, "Testing %s", GST_PLUGIN_FEATURE (f)->name); + + /* If autoaudiosink has been provided with filter caps, + * accept only sinks that match with the filter caps */ + if (sink->filter_caps) { + el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "sink"); + el_caps = gst_pad_get_caps (el_pad); + gst_object_unref (el_pad); + GST_DEBUG_OBJECT (sink, + "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, + sink->filter_caps, el_caps); + no_match = !gst_caps_can_intersect (sink->filter_caps, el_caps); + gst_caps_unref (el_caps); + + if (no_match) { + GST_DEBUG_OBJECT (sink, "Incompatible caps"); + gst_object_unref (el); + continue; + } else { + GST_DEBUG_OBJECT (sink, "Found compatible caps"); + } + } + + gst_element_set_bus (el, bus); + ret = gst_element_set_state (el, GST_STATE_READY); + if (ret == GST_STATE_CHANGE_SUCCESS) { + GST_DEBUG_OBJECT (sink, "This worked!"); + choice = el; + break; + } + + /* collect all error messages */ + while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { + GST_DEBUG_OBJECT (sink, "error message %" GST_PTR_FORMAT, message); + errors = g_slist_append (errors, message); + } + + gst_element_set_state (el, GST_STATE_NULL); + gst_object_unref (el); + } + } + + GST_DEBUG_OBJECT (sink, "done trying"); + if (!choice) { + if (errors) { + /* FIXME: we forward the first error for now; but later on it might make + * sense to actually analyse them */ + gst_message_ref (GST_MESSAGE (errors->data)); + GST_DEBUG_OBJECT (sink, "reposting message %p", errors->data); + gst_element_post_message (GST_ELEMENT (sink), GST_MESSAGE (errors->data)); + } else { + /* send warning message to application and use a fakesink */ + GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL), + ("Failed to find a usable audio sink")); + choice = gst_element_factory_make ("fakesink", "fake-audio-sink"); + if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) + g_object_set (choice, "sync", TRUE, NULL); + gst_element_set_state (choice, GST_STATE_READY); + } + } + gst_object_unref (bus); + gst_plugin_feature_list_free (list); + g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); + g_slist_free (errors); + + return choice; +} + +static gboolean +gst_auto_audio_sink_detect (GstAutoAudioSink * sink) +{ + GstElement *esink; + GstPad *targetpad; + + gst_auto_audio_sink_clear_kid (sink); + + /* find element */ + GST_DEBUG_OBJECT (sink, "Creating new kid"); + if (!(esink = gst_auto_audio_sink_find_best (sink))) + goto no_sink; + + sink->kid = esink; + /* Ensure the child is brought up to the right state to match the parent + * although it's currently always in READY and + * we're always doing NULL->READY. */ + if (GST_STATE (sink->kid) < GST_STATE (sink)) + gst_element_set_state (sink->kid, GST_STATE (sink)); + + gst_bin_add (GST_BIN (sink), esink); + + /* attach ghost pad */ + GST_DEBUG_OBJECT (sink, "Re-assigning ghostpad"); + targetpad = gst_element_get_static_pad (sink->kid, "sink"); + if (!gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad)) + goto target_failed; + + gst_object_unref (targetpad); + GST_DEBUG_OBJECT (sink, "done changing auto audio sink"); + + return TRUE; + + /* ERRORS */ +no_sink: + { + GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL), + ("Failed to find a supported audio sink")); + return FALSE; + } +target_failed: + { + GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL), + ("Failed to set target pad")); + gst_object_unref (targetpad); + return FALSE; + } +} + +static GstStateChangeReturn +gst_auto_audio_sink_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstAutoAudioSink *sink = GST_AUTO_AUDIO_SINK (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_auto_audio_sink_detect (sink)) + return GST_STATE_CHANGE_FAILURE; + 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_READY_TO_NULL: + gst_auto_audio_sink_reset (sink); + break; + default: + break; + } + + return ret; +} + +static void +gst_auto_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAutoAudioSink *sink = GST_AUTO_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_CAPS: + if (sink->filter_caps) + gst_caps_unref (sink->filter_caps); + sink->filter_caps = gst_caps_copy (gst_value_get_caps (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_auto_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAutoAudioSink *sink = GST_AUTO_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_CAPS:{ + gst_value_set_caps (value, sink->filter_caps); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/autodetect/gstautoaudiosink.h b/gst/autodetect/gstautoaudiosink.h new file mode 100644 index 0000000..2e5085f --- /dev/null +++ b/gst/autodetect/gstautoaudiosink.h @@ -0,0 +1,57 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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_AUTO_AUDIO_SINK_H__ +#define __GST_AUTO_AUDIO_SINK_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUTO_AUDIO_SINK \ + (gst_auto_audio_sink_get_type ()) +#define GST_AUTO_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AUTO_AUDIO_SINK, \ + GstAutoAudioSink)) +#define GST_AUTO_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AUTO_AUDIO_SINK, \ + GstAutoAudioSinkClass)) +#define GST_IS_AUTO_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AUTO_AUDIO_SINK)) +#define GST_IS_AUTO_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AUTO_AUDIO_SINK)) + +typedef struct _GstAutoAudioSink { + GstBin parent; + + /* explicit pointers to stuff used */ + GstPad *pad; + GstElement *kid; + GstCaps *filter_caps; +} GstAutoAudioSink; + +typedef struct _GstAutoAudioSinkClass { + GstBinClass parent_class; +} GstAutoAudioSinkClass; + +GType gst_auto_audio_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUTO_AUDIO_SINK_H__ */ diff --git a/gst/autodetect/gstautoaudiosrc.c b/gst/autodetect/gstautoaudiosrc.c new file mode 100644 index 0000000..87ba27f --- /dev/null +++ b/gst/autodetect/gstautoaudiosrc.c @@ -0,0 +1,447 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Jan Schmidt + * (c) 2008 Stefan Kost + * + * 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-autoaudiosrc + * @see_also: autovideosrc, alsasrc, osssrc + * + * autoaudiosrc is an audio source that automatically detects an appropriate + * audio source to use. It does so by scanning the registry for all elements + * that have Source and Audio in the class field + * of their element information, and also have a non-zero autoplugging rank. + * + * + * Example launch line + * |[ + * gst-launch -v -m autoaudiosrc ! audioconvert ! audioresample ! autoaudiosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstautoaudiosrc.h" +#include "gstautodetect.h" + +/* Properties */ +enum +{ + PROP_0, + PROP_CAPS, +}; + +static GstStateChangeReturn +gst_auto_audio_src_change_state (GstElement * element, + GstStateChange transition); +static void gst_auto_audio_src_dispose (GstAutoAudioSrc * src); +static void gst_auto_audio_src_clear_kid (GstAutoAudioSrc * src); +static void gst_auto_audio_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_auto_audio_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +GST_BOILERPLATE (GstAutoAudioSrc, gst_auto_audio_src, GstBin, GST_TYPE_BIN); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static void +gst_auto_audio_src_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (eklass, &src_template); + + gst_element_class_set_details_simple (eklass, "Auto audio source", + "Source/Audio", + "Wrapper audio source for automatically detected audio source", + "Jan Schmidt , " + "Stefan Kost "); +} + +static void +gst_auto_audio_src_class_init (GstAutoAudioSrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *eklass; + + gobject_class = G_OBJECT_CLASS (klass); + eklass = GST_ELEMENT_CLASS (klass); + + gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_audio_src_dispose; + gobject_class->set_property = gst_auto_audio_src_set_property; + gobject_class->get_property = gst_auto_audio_src_get_property; + + eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_audio_src_change_state); + + /** + * GstAutoAudioSrc:filter-caps + * + * This property will filter out candidate sinks that can handle the specified + * caps. By default only audio sinks that support raw floating point and + * integer audio are selected. + * + * This property can only be set before the element goes to the READY state. + * + * Since: 0.10.14 + **/ + g_object_class_install_property (gobject_class, PROP_CAPS, + g_param_spec_boxed ("filter-caps", "Filter caps", + "Filter sink candidates using these caps.", GST_TYPE_CAPS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_auto_audio_src_dispose (GstAutoAudioSrc * src) +{ + gst_auto_audio_src_clear_kid (src); + + if (src->filter_caps) + gst_caps_unref (src->filter_caps); + src->filter_caps = NULL; + + G_OBJECT_CLASS (parent_class)->dispose ((GObject *) src); +} + +static void +gst_auto_audio_src_clear_kid (GstAutoAudioSrc * src) +{ + if (src->kid) { + gst_element_set_state (src->kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (src), src->kid); + src->kid = NULL; + + /* Don't lose SOURCE flag */ + GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); + } +} + +/* + * Hack to make initial linking work; ideally, this'd work even when + * no target has been assigned to the ghostpad yet. + */ +static void +gst_auto_audio_src_reset (GstAutoAudioSrc * src) +{ + GstPad *targetpad; + + gst_auto_audio_src_clear_kid (src); + + /* fakesink placeholder */ + src->kid = gst_element_factory_make ("fakesrc", "tempsrc"); + gst_bin_add (GST_BIN (src), src->kid); + + /* pad */ + targetpad = gst_element_get_static_pad (src->kid, "src"); + gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); + gst_object_unref (targetpad); +} + +static GstStaticCaps raw_caps = + GST_STATIC_CAPS ("audio/x-raw-int; audio/x-raw-float"); + +static void +gst_auto_audio_src_init (GstAutoAudioSrc * src, GstAutoAudioSrcClass * g_class) +{ + src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (src), src->pad); + + gst_auto_audio_src_reset (src); + + /* set the default raw audio caps */ + src->filter_caps = gst_static_caps_get (&raw_caps); + + /* mark as source */ + GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); +} + +static gboolean +gst_auto_audio_src_factory_filter (GstPluginFeature * feature, gpointer data) +{ + guint rank; + const gchar *klass; + + /* we only care about element factories */ + if (!GST_IS_ELEMENT_FACTORY (feature)) + return FALSE; + + /* audio sinks */ + klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature)); + if (!(strstr (klass, "Source") && strstr (klass, "Audio"))) + return FALSE; + + /* only select elements with autoplugging rank */ + rank = gst_plugin_feature_get_rank (feature); + if (rank < GST_RANK_MARGINAL) + return FALSE; + + return TRUE; +} + +static gint +gst_auto_audio_src_compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2) +{ + gint diff; + + diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1); + if (diff != 0) + return diff; + return strcmp (gst_plugin_feature_get_name (f2), + gst_plugin_feature_get_name (f1)); +} + +static GstElement * +gst_auto_audio_src_create_element_with_pretty_name (GstAutoAudioSrc * src, + GstElementFactory * factory) +{ + GstElement *element; + gchar *name, *marker; + + marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name); + if (g_str_has_suffix (marker, "src")) + marker[strlen (marker) - 4] = '\0'; + if (g_str_has_prefix (marker, "gst")) + g_memmove (marker, marker + 3, strlen (marker + 3) + 1); + name = g_strdup_printf ("%s-actual-src-%s", GST_OBJECT_NAME (src), marker); + g_free (marker); + + element = gst_element_factory_create (factory, name); + g_free (name); + + return element; +} + +static GstElement * +gst_auto_audio_src_find_best (GstAutoAudioSrc * src) +{ + GList *list, *item; + GstElement *choice = NULL; + GstMessage *message = NULL; + GSList *errors = NULL; + GstBus *bus = gst_bus_new (); + GstPad *el_pad = NULL; + GstCaps *el_caps = NULL; + gboolean no_match = TRUE; + + list = gst_registry_feature_filter (gst_registry_get_default (), + (GstPluginFeatureFilter) gst_auto_audio_src_factory_filter, FALSE, src); + list = g_list_sort (list, (GCompareFunc) gst_auto_audio_src_compare_ranks); + + /* We don't treat sound server sources special. Our policy is that sound + * server sources that have a rank must not auto-spawn a daemon under any + * circumstances, so there's nothing for us to worry about here */ + GST_LOG_OBJECT (src, "Trying to find usable audio devices ..."); + + for (item = list; item != NULL; item = item->next) { + GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); + GstElement *el; + + if ((el = gst_auto_audio_src_create_element_with_pretty_name (src, f))) { + GstStateChangeReturn ret; + + GST_DEBUG_OBJECT (src, "Testing %s", GST_PLUGIN_FEATURE (f)->name); + + /* If autoAudioSrc has been provided with filter caps, + * accept only sources that match with the filter caps */ + if (src->filter_caps) { + el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "src"); + el_caps = gst_pad_get_caps (el_pad); + gst_object_unref (el_pad); + GST_DEBUG_OBJECT (src, + "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, + src->filter_caps, el_caps); + no_match = !gst_caps_can_intersect (src->filter_caps, el_caps); + gst_caps_unref (el_caps); + + if (no_match) { + GST_DEBUG_OBJECT (src, "Incompatible caps"); + gst_object_unref (el); + continue; + } else { + GST_DEBUG_OBJECT (src, "Found compatible caps"); + } + } + + gst_element_set_bus (el, bus); + ret = gst_element_set_state (el, GST_STATE_READY); + if (ret == GST_STATE_CHANGE_SUCCESS) { + GST_DEBUG_OBJECT (src, "This worked!"); + choice = el; + break; + } + + /* collect all error messages */ + while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { + GST_DEBUG_OBJECT (src, "error message %" GST_PTR_FORMAT, message); + errors = g_slist_append (errors, message); + } + + gst_element_set_state (el, GST_STATE_NULL); + gst_object_unref (el); + } + } + + GST_DEBUG_OBJECT (src, "done trying"); + if (!choice) { + if (errors) { + /* FIXME: we forward the first error for now; but later on it might make + * sense to actually analyse them */ + gst_message_ref (GST_MESSAGE (errors->data)); + GST_DEBUG_OBJECT (src, "reposting message %p", errors->data); + gst_element_post_message (GST_ELEMENT (src), GST_MESSAGE (errors->data)); + } else { + /* send warning message to application and use a fakesrc */ + GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL), + ("Failed to find a usable audio source")); + choice = gst_element_factory_make ("fakesrc", "fake-audio-src"); + if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) + g_object_set (choice, "sync", TRUE, NULL); + gst_element_set_state (choice, GST_STATE_READY); + } + } + gst_object_unref (bus); + gst_plugin_feature_list_free (list); + g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); + g_slist_free (errors); + + return choice; +} + +static gboolean +gst_auto_audio_src_detect (GstAutoAudioSrc * src) +{ + GstElement *esrc; + GstPad *targetpad; + + gst_auto_audio_src_clear_kid (src); + + /* find element */ + GST_DEBUG_OBJECT (src, "Creating new kid"); + if (!(esrc = gst_auto_audio_src_find_best (src))) + goto no_src; + + src->kid = esrc; + /* Ensure the child is brought up to the right state to match the parent + * although it's currently always in READY and + * we're always doing NULL->READY. */ + if (GST_STATE (src->kid) < GST_STATE (src)) + gst_element_set_state (src->kid, GST_STATE (src)); + + gst_bin_add (GST_BIN (src), esrc); + + /* attach ghost pad */ + GST_DEBUG_OBJECT (src, "Re-assigning ghostpad"); + targetpad = gst_element_get_static_pad (src->kid, "src"); + if (!gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad)) + goto target_failed; + + gst_object_unref (targetpad); + GST_DEBUG_OBJECT (src, "done changing auto audio source"); + + return TRUE; + + /* ERRORS */ +no_src: + { + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Failed to find a supported audio source")); + return FALSE; + } +target_failed: + { + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Failed to set target pad")); + gst_object_unref (targetpad); + return FALSE; + } +} + +static GstStateChangeReturn +gst_auto_audio_src_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstAutoAudioSrc *src = GST_AUTO_AUDIO_SRC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_auto_audio_src_detect (src)) + return GST_STATE_CHANGE_FAILURE; + 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_READY_TO_NULL: + gst_auto_audio_src_reset (src); + break; + default: + break; + } + + return ret; +} + +static void +gst_auto_audio_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAutoAudioSrc *src = GST_AUTO_AUDIO_SRC (object); + + switch (prop_id) { + case PROP_CAPS: + if (src->filter_caps) + gst_caps_unref (src->filter_caps); + src->filter_caps = gst_caps_copy (gst_value_get_caps (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_auto_audio_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAutoAudioSrc *src = GST_AUTO_AUDIO_SRC (object); + + switch (prop_id) { + case PROP_CAPS:{ + gst_value_set_caps (value, src->filter_caps); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/autodetect/gstautoaudiosrc.h b/gst/autodetect/gstautoaudiosrc.h new file mode 100644 index 0000000..8669627 --- /dev/null +++ b/gst/autodetect/gstautoaudiosrc.h @@ -0,0 +1,58 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2008 Stefan Kost + * + * 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_AUTO_AUDIO_SRC_H__ +#define __GST_AUTO_AUDIO_SRC_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUTO_AUDIO_SRC \ + (gst_auto_audio_src_get_type ()) +#define GST_AUTO_AUDIO_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AUTO_AUDIO_SRC, \ + GstAutoAudioSrc)) +#define GST_AUTO_AUDIO_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AUTO_AUDIO_SRC, \ + GstAutoAudioSrcClass)) +#define GST_IS_AUTO_AUDIO_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AUTO_AUDIO_SRC)) +#define GST_IS_AUTO_AUDIO_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AUTO_AUDIO_SRC)) + +typedef struct _GstAutoAudioSrc { + GstBin parent; + + /* explicit pointers to stuff used */ + GstPad *pad; + GstElement *kid; + GstCaps *filter_caps; +} GstAutoAudioSrc; + +typedef struct _GstAutoAudioSrcClass { + GstBinClass parent_class; +} GstAutoAudioSrcClass; + +GType gst_auto_audio_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUTO_AUDIO_SRC_H__ */ diff --git a/gst/autodetect/gstautodetect.c b/gst/autodetect/gstautodetect.c new file mode 100644 index 0000000..c331655 --- /dev/null +++ b/gst/autodetect/gstautodetect.c @@ -0,0 +1,54 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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 + +#include "gstautodetect.h" +#include "gstautoaudiosink.h" +#include "gstautoaudiosrc.h" +#include "gstautovideosink.h" +#include "gstautovideosrc.h" + +GST_DEBUG_CATEGORY (autodetect_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (autodetect_debug, "autodetect", 0, + "Autodetection audio/video output wrapper elements"); + + return gst_element_register (plugin, "autovideosink", + GST_RANK_NONE, GST_TYPE_AUTO_VIDEO_SINK) && + gst_element_register (plugin, "autovideosrc", + GST_RANK_NONE, GST_TYPE_AUTO_VIDEO_SRC) && + gst_element_register (plugin, "autoaudiosink", + GST_RANK_NONE, GST_TYPE_AUTO_AUDIO_SINK) && + gst_element_register (plugin, "autoaudiosrc", + GST_RANK_NONE, GST_TYPE_AUTO_AUDIO_SRC); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "autodetect", + "Plugin contains auto-detection plugins for video/audio in- and outputs", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/autodetect/gstautodetect.h b/gst/autodetect/gstautodetect.h new file mode 100644 index 0000000..d4952d7 --- /dev/null +++ b/gst/autodetect/gstautodetect.h @@ -0,0 +1,26 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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_AUTO_DETECT_H__ +#define __GST_AUTO_DETECT_H__ + +GST_DEBUG_CATEGORY_EXTERN (autodetect_debug); +#define GST_CAT_DEFAULT autodetect_debug + +#endif /* __GST_AUTO_DETECT_H__ */ diff --git a/gst/autodetect/gstautovideosink.c b/gst/autodetect/gstautovideosink.c new file mode 100644 index 0000000..d4e0419 --- /dev/null +++ b/gst/autodetect/gstautovideosink.c @@ -0,0 +1,433 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Jan Schmidt + * + * 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-autovideosink + * @see_also: autoaudiosink, ximagesink, xvimagesink, sdlvideosink + * + * autovideosink is a video sink that automatically detects an appropriate + * video sink to use. It does so by scanning the registry for all elements + * that have Sink and Video in the class field + * of their element information, and also have a non-zero autoplugging rank. + * + * + * Example launch line + * |[ + * gst-launch -v -m videotestsrc ! autovideosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstautovideosink.h" +#include "gstautodetect.h" + +/* Properties */ +enum +{ + PROP_0, + PROP_CAPS, +}; + +static GstStateChangeReturn +gst_auto_video_sink_change_state (GstElement * element, + GstStateChange transition); +static void gst_auto_video_sink_dispose (GstAutoVideoSink * sink); +static void gst_auto_video_sink_clear_kid (GstAutoVideoSink * sink); + +static void gst_auto_video_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_auto_video_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +GST_BOILERPLATE (GstAutoVideoSink, gst_auto_video_sink, GstBin, GST_TYPE_BIN); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static void +gst_auto_video_sink_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (eklass, &sink_template); + gst_element_class_set_details_simple (eklass, "Auto video sink", + "Sink/Video", + "Wrapper video sink for automatically detected video sink", + "Jan Schmidt "); +} + +static void +gst_auto_video_sink_class_init (GstAutoVideoSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_video_sink_dispose; + gobject_class->set_property = gst_auto_video_sink_set_property; + gobject_class->get_property = gst_auto_video_sink_get_property; + + eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_video_sink_change_state); + /** + * GstAutoVideoSink:filter-caps + * + * This property will filter out candidate sinks that can handle the specified + * caps. By default only video sinks that support raw rgb and yuv video + * are selected. + * + * This property can only be set before the element goes to the READY state. + * + * Since: 0.10.7 + **/ + g_object_class_install_property (gobject_class, PROP_CAPS, + g_param_spec_boxed ("filter-caps", "Filter caps", + "Filter sink candidates using these caps.", GST_TYPE_CAPS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_auto_video_sink_dispose (GstAutoVideoSink * sink) +{ + gst_auto_video_sink_clear_kid (sink); + + if (sink->filter_caps) + gst_caps_unref (sink->filter_caps); + sink->filter_caps = NULL; + + G_OBJECT_CLASS (parent_class)->dispose ((GObject *) sink); +} + +static void +gst_auto_video_sink_clear_kid (GstAutoVideoSink * sink) +{ + if (sink->kid) { + gst_element_set_state (sink->kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (sink), sink->kid); + sink->kid = NULL; + /* Don't lose the SINK flag */ + GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); + } +} + +/* + * Hack to make initial linking work; ideally, this'd work even when + * no target has been assigned to the ghostpad yet. + */ + +static void +gst_auto_video_sink_reset (GstAutoVideoSink * sink) +{ + GstPad *targetpad; + + /* Remove any existing element */ + gst_auto_video_sink_clear_kid (sink); + + /* fakesink placeholder */ + sink->kid = gst_element_factory_make ("fakesink", "tempsink"); + gst_bin_add (GST_BIN (sink), sink->kid); + + /* pad, setting this target should always work */ + targetpad = gst_element_get_static_pad (sink->kid, "sink"); + gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); + gst_object_unref (targetpad); +} + +static GstStaticCaps raw_caps = + GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb"); + +static void +gst_auto_video_sink_init (GstAutoVideoSink * sink, + GstAutoVideoSinkClass * g_class) +{ + sink->pad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (sink), sink->pad); + + gst_auto_video_sink_reset (sink); + + /* set the default raw video caps */ + sink->filter_caps = gst_static_caps_get (&raw_caps); + + /* mark as sink */ + GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); +} + +static gboolean +gst_auto_video_sink_factory_filter (GstPluginFeature * feature, gpointer data) +{ + guint rank; + const gchar *klass; + + /* we only care about element factories */ + if (!GST_IS_ELEMENT_FACTORY (feature)) + return FALSE; + + /* video sinks */ + klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature)); + if (!(strstr (klass, "Sink") && strstr (klass, "Video"))) + return FALSE; + + /* only select elements with autoplugging rank */ + rank = gst_plugin_feature_get_rank (feature); + if (rank < GST_RANK_MARGINAL) + return FALSE; + + return TRUE; +} + +static gint +gst_auto_video_sink_compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2) +{ + gint diff; + + diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1); + if (diff != 0) + return diff; + return strcmp (gst_plugin_feature_get_name (f2), + gst_plugin_feature_get_name (f1)); +} + +static GstElement * +gst_auto_video_sink_create_element_with_pretty_name (GstAutoVideoSink * sink, + GstElementFactory * factory) +{ + GstElement *element; + gchar *name, *marker; + + marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name); + if (g_str_has_suffix (marker, "sink")) + marker[strlen (marker) - 4] = '\0'; + if (g_str_has_prefix (marker, "gst")) + g_memmove (marker, marker + 3, strlen (marker + 3) + 1); + name = g_strdup_printf ("%s-actual-sink-%s", GST_OBJECT_NAME (sink), marker); + g_free (marker); + + element = gst_element_factory_create (factory, name); + g_free (name); + + return element; +} + +static GstElement * +gst_auto_video_sink_find_best (GstAutoVideoSink * sink) +{ + GList *list, *item; + GstElement *choice = NULL; + GstMessage *message = NULL; + GSList *errors = NULL; + GstBus *bus = gst_bus_new (); + GstPad *el_pad = NULL; + GstCaps *el_caps = NULL; + gboolean no_match = TRUE; + + list = gst_registry_feature_filter (gst_registry_get_default (), + (GstPluginFeatureFilter) gst_auto_video_sink_factory_filter, FALSE, sink); + list = g_list_sort (list, (GCompareFunc) gst_auto_video_sink_compare_ranks); + + GST_LOG_OBJECT (sink, "Trying to find usable video devices ..."); + + for (item = list; item != NULL; item = item->next) { + GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); + GstElement *el; + + if ((el = gst_auto_video_sink_create_element_with_pretty_name (sink, f))) { + GstStateChangeReturn ret; + + GST_DEBUG_OBJECT (sink, "Testing %s", GST_PLUGIN_FEATURE (f)->name); + + /* If autovideosink has been provided with filter caps, + * accept only sinks that match with the filter caps */ + if (sink->filter_caps) { + el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "sink"); + el_caps = gst_pad_get_caps (el_pad); + gst_object_unref (el_pad); + GST_DEBUG_OBJECT (sink, + "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, + sink->filter_caps, el_caps); + no_match = !gst_caps_can_intersect (sink->filter_caps, el_caps); + gst_caps_unref (el_caps); + + if (no_match) { + GST_DEBUG_OBJECT (sink, "Incompatible caps"); + gst_object_unref (el); + continue; + } else { + GST_DEBUG_OBJECT (sink, "Found compatible caps"); + } + } + + gst_element_set_bus (el, bus); + ret = gst_element_set_state (el, GST_STATE_READY); + if (ret == GST_STATE_CHANGE_SUCCESS) { + GST_DEBUG_OBJECT (sink, "This worked!"); + choice = el; + break; + } + + /* collect all error messages */ + while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { + GST_DEBUG_OBJECT (sink, "error message %" GST_PTR_FORMAT, message); + errors = g_slist_append (errors, message); + } + + gst_element_set_state (el, GST_STATE_NULL); + gst_object_unref (el); + } + } + + GST_DEBUG_OBJECT (sink, "done trying"); + if (!choice) { + if (errors) { + /* FIXME: we forward the first error for now; but later on it might make + * sense to actually analyse them */ + gst_message_ref (GST_MESSAGE (errors->data)); + GST_DEBUG_OBJECT (sink, "reposting message %p", errors->data); + gst_element_post_message (GST_ELEMENT (sink), GST_MESSAGE (errors->data)); + } else { + /* send warning message to application and use a fakesink */ + GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL), + ("Failed to find a usable video sink")); + choice = gst_element_factory_make ("fakesink", "fake-video-sink"); + if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) + g_object_set (choice, "sync", TRUE, NULL); + gst_element_set_state (choice, GST_STATE_READY); + } + } + gst_object_unref (bus); + gst_plugin_feature_list_free (list); + g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); + g_slist_free (errors); + + return choice; +} + +static gboolean +gst_auto_video_sink_detect (GstAutoVideoSink * sink) +{ + GstElement *esink; + GstPad *targetpad; + + gst_auto_video_sink_clear_kid (sink); + + /* find element */ + GST_DEBUG_OBJECT (sink, "Creating new kid"); + if (!(esink = gst_auto_video_sink_find_best (sink))) + goto no_sink; + + sink->kid = esink; + gst_bin_add (GST_BIN (sink), esink); + + /* attach ghost pad */ + GST_DEBUG_OBJECT (sink, "Re-assigning ghostpad"); + targetpad = gst_element_get_static_pad (sink->kid, "sink"); + if (!gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad)) + goto target_failed; + + gst_object_unref (targetpad); + GST_DEBUG_OBJECT (sink, "done changing auto video sink"); + + return TRUE; + + /* ERRORS */ +no_sink: + { + GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL), + ("Failed to find a supported video sink")); + return FALSE; + } +target_failed: + { + GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL), + ("Failed to set target pad")); + gst_object_unref (targetpad); + return FALSE; + } +} + +static GstStateChangeReturn +gst_auto_video_sink_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstAutoVideoSink *sink = GST_AUTO_VIDEO_SINK (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_auto_video_sink_detect (sink)) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + gst_auto_video_sink_reset (sink); + break; + default: + break; + } + + return ret; +} + +static void +gst_auto_video_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAutoVideoSink *sink = GST_AUTO_VIDEO_SINK (object); + + switch (prop_id) { + case PROP_CAPS: + if (sink->filter_caps) + gst_caps_unref (sink->filter_caps); + sink->filter_caps = gst_caps_copy (gst_value_get_caps (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_auto_video_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAutoVideoSink *sink = GST_AUTO_VIDEO_SINK (object); + + switch (prop_id) { + case PROP_CAPS:{ + gst_value_set_caps (value, sink->filter_caps); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/autodetect/gstautovideosink.h b/gst/autodetect/gstautovideosink.h new file mode 100644 index 0000000..9aece2b --- /dev/null +++ b/gst/autodetect/gstautovideosink.h @@ -0,0 +1,57 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * + * 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_AUTO_VIDEO_SINK_H__ +#define __GST_AUTO_VIDEO_SINK_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUTO_VIDEO_SINK \ + (gst_auto_video_sink_get_type ()) +#define GST_AUTO_VIDEO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AUTO_VIDEO_SINK, \ + GstAutoVideoSink)) +#define GST_AUTO_VIDEO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AUTO_VIDEO_SINK, \ + GstAutoVideoSinkClass)) +#define GST_IS_AUTO_VIDEO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AUTO_VIDEO_SINK)) +#define GST_IS_AUTO_VIDEO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AUTO_VIDEO_SINK)) + +typedef struct _GstAutoVideoSink { + GstBin parent; + + /* explicit pointers to stuff used */ + GstPad *pad; + GstElement *kid; + GstCaps *filter_caps; +} GstAutoVideoSink; + +typedef struct _GstAutoVideoSinkClass { + GstBinClass parent_class; +} GstAutoVideoSinkClass; + +GType gst_auto_video_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUTO_VIDEO_SINK_H__ */ diff --git a/gst/autodetect/gstautovideosrc.c b/gst/autodetect/gstautovideosrc.c new file mode 100644 index 0000000..fb7bd8a --- /dev/null +++ b/gst/autodetect/gstautovideosrc.c @@ -0,0 +1,435 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2006 Jan Schmidt + * (c) 2008 Stefan Kost + * + * 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-autovideosrc + * @see_also: autoaudiosrc, v4l2src, v4lsrc + * + * autovideosrc is a video src that automatically detects an appropriate + * video source to use. It does so by scanning the registry for all elements + * that have Source and Video in the class field + * of their element information, and also have a non-zero autoplugging rank. + * + * + * Example launch line + * |[ + * gst-launch -v -m autovideosrc ! xvimagesink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstautovideosrc.h" +#include "gstautodetect.h" + +/* Properties */ +enum +{ + PROP_0, + PROP_CAPS, +}; + +static GstStateChangeReturn +gst_auto_video_src_change_state (GstElement * element, + GstStateChange transition); +static void gst_auto_video_src_dispose (GstAutoVideoSrc * src); +static void gst_auto_video_src_clear_kid (GstAutoVideoSrc * src); + +static void gst_auto_video_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_auto_video_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +GST_BOILERPLATE (GstAutoVideoSrc, gst_auto_video_src, GstBin, GST_TYPE_BIN); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static void +gst_auto_video_src_base_init (gpointer klass) +{ + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (eklass, &src_template); + gst_element_class_set_details_simple (eklass, "Auto video source", + "Source/Video", + "Wrapper video source for automatically detected video source", + "Jan Schmidt , " + "Stefan Kost "); +} + +static void +gst_auto_video_src_class_init (GstAutoVideoSrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_video_src_dispose; + gobject_class->set_property = gst_auto_video_src_set_property; + gobject_class->get_property = gst_auto_video_src_get_property; + + eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_video_src_change_state); + + /** + * GstAutoVideoSrc:filter-caps + * + * This property will filter out candidate sources that can handle the specified + * caps. By default only video sources that support raw rgb and yuv video + * are selected. + * + * This property can only be set before the element goes to the READY state. + * + * Since: 0.10.14 + **/ + g_object_class_install_property (gobject_class, PROP_CAPS, + g_param_spec_boxed ("filter-caps", "Filter caps", + "Filter src candidates using these caps.", GST_TYPE_CAPS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_auto_video_src_dispose (GstAutoVideoSrc * src) +{ + gst_auto_video_src_clear_kid (src); + + if (src->filter_caps) + gst_caps_unref (src->filter_caps); + src->filter_caps = NULL; + + G_OBJECT_CLASS (parent_class)->dispose ((GObject *) src); +} + +static void +gst_auto_video_src_clear_kid (GstAutoVideoSrc * src) +{ + if (src->kid) { + gst_element_set_state (src->kid, GST_STATE_NULL); + gst_bin_remove (GST_BIN (src), src->kid); + src->kid = NULL; + /* Don't loose SOURCE flag */ + GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); + } +} + +/* + * Hack to make initial linking work; ideally, this'd work even when + * no target has been assigned to the ghostpad yet. + */ + +static void +gst_auto_video_src_reset (GstAutoVideoSrc * src) +{ + GstPad *targetpad; + + /* Remove any existing element */ + gst_auto_video_src_clear_kid (src); + + /* fakesrc placeholder */ + src->kid = gst_element_factory_make ("fakesrc", "tempsrc"); + gst_bin_add (GST_BIN (src), src->kid); + + /* pad */ + targetpad = gst_element_get_static_pad (src->kid, "src"); + gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); + gst_object_unref (targetpad); +} + +static GstStaticCaps raw_caps = + GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb"); + +static void +gst_auto_video_src_init (GstAutoVideoSrc * src, GstAutoVideoSrcClass * g_class) +{ + src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (src), src->pad); + + gst_auto_video_src_reset (src); + + /* set the default raw video caps */ + src->filter_caps = gst_static_caps_get (&raw_caps); + + /* mark as source */ + GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); +} + +static gboolean +gst_auto_video_src_factory_filter (GstPluginFeature * feature, gpointer data) +{ + guint rank; + const gchar *klass; + + /* we only care about element factories */ + if (!GST_IS_ELEMENT_FACTORY (feature)) + return FALSE; + + /* video sources */ + klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature)); + if (!(strstr (klass, "Source") && strstr (klass, "Video"))) + return FALSE; + + /* only select elements with autoplugging rank */ + rank = gst_plugin_feature_get_rank (feature); + if (rank < GST_RANK_MARGINAL) + return FALSE; + + return TRUE; +} + +static gint +gst_auto_video_src_compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2) +{ + gint diff; + + diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1); + if (diff != 0) + return diff; + return strcmp (gst_plugin_feature_get_name (f2), + gst_plugin_feature_get_name (f1)); +} + +static GstElement * +gst_auto_video_src_create_element_with_pretty_name (GstAutoVideoSrc * src, + GstElementFactory * factory) +{ + GstElement *element; + gchar *name, *marker; + + marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name); + if (g_str_has_suffix (marker, "src")) + marker[strlen (marker) - 4] = '\0'; + if (g_str_has_prefix (marker, "gst")) + g_memmove (marker, marker + 3, strlen (marker + 3) + 1); + name = g_strdup_printf ("%s-actual-src-%s", GST_OBJECT_NAME (src), marker); + g_free (marker); + + element = gst_element_factory_create (factory, name); + g_free (name); + + return element; +} + +static GstElement * +gst_auto_video_src_find_best (GstAutoVideoSrc * src) +{ + GList *list, *item; + GstElement *choice = NULL; + GstMessage *message = NULL; + GSList *errors = NULL; + GstBus *bus = gst_bus_new (); + GstPad *el_pad = NULL; + GstCaps *el_caps = NULL; + gboolean no_match = TRUE; + + list = gst_registry_feature_filter (gst_registry_get_default (), + (GstPluginFeatureFilter) gst_auto_video_src_factory_filter, FALSE, src); + list = g_list_sort (list, (GCompareFunc) gst_auto_video_src_compare_ranks); + + GST_LOG_OBJECT (src, "Trying to find usable video devices ..."); + + for (item = list; item != NULL; item = item->next) { + GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); + GstElement *el; + + if ((el = gst_auto_video_src_create_element_with_pretty_name (src, f))) { + GstStateChangeReturn ret; + + GST_DEBUG_OBJECT (src, "Testing %s", GST_PLUGIN_FEATURE (f)->name); + + /* If AutoVideoSrc has been provided with filter caps, + * accept only sources that match with the filter caps */ + if (src->filter_caps) { + el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "src"); + el_caps = gst_pad_get_caps (el_pad); + gst_object_unref (el_pad); + GST_DEBUG_OBJECT (src, + "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, + src->filter_caps, el_caps); + no_match = !gst_caps_can_intersect (src->filter_caps, el_caps); + gst_caps_unref (el_caps); + + if (no_match) { + GST_DEBUG_OBJECT (src, "Incompatible caps"); + gst_object_unref (el); + continue; + } else { + GST_DEBUG_OBJECT (src, "Found compatible caps"); + } + } + + gst_element_set_bus (el, bus); + ret = gst_element_set_state (el, GST_STATE_READY); + if (ret == GST_STATE_CHANGE_SUCCESS) { + GST_DEBUG_OBJECT (src, "This worked!"); + choice = el; + break; + } + + /* collect all error messages */ + while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { + GST_DEBUG_OBJECT (src, "error message %" GST_PTR_FORMAT, message); + errors = g_slist_append (errors, message); + } + + gst_element_set_state (el, GST_STATE_NULL); + gst_object_unref (el); + } + } + + GST_DEBUG_OBJECT (src, "done trying"); + if (!choice) { + if (errors) { + /* FIXME: we forward the first error for now; but later on it might make + * sense to actually analyse them */ + gst_message_ref (GST_MESSAGE (errors->data)); + GST_DEBUG_OBJECT (src, "reposting message %p", errors->data); + gst_element_post_message (GST_ELEMENT (src), GST_MESSAGE (errors->data)); + } else { + /* send warning message to application and use a fakesrc */ + GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL), + ("Failed to find a usable video source")); + choice = gst_element_factory_make ("fakesrc", "fake-video-src"); + if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) + g_object_set (choice, "sync", TRUE, NULL); + gst_element_set_state (choice, GST_STATE_READY); + } + } + gst_object_unref (bus); + gst_plugin_feature_list_free (list); + g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); + g_slist_free (errors); + + return choice; +} + +static gboolean +gst_auto_video_src_detect (GstAutoVideoSrc * src) +{ + GstElement *esrc; + GstPad *targetpad; + + gst_auto_video_src_clear_kid (src); + + /* find element */ + GST_DEBUG_OBJECT (src, "Creating new kid"); + if (!(esrc = gst_auto_video_src_find_best (src))) + goto no_src; + + src->kid = esrc; + gst_bin_add (GST_BIN (src), esrc); + + /* attach ghost pad */ + GST_DEBUG_OBJECT (src, "Re-assigning ghostpad"); + targetpad = gst_element_get_static_pad (src->kid, "src"); + if (!gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad)) + goto target_failed; + + gst_object_unref (targetpad); + GST_DEBUG_OBJECT (src, "done changing auto video source"); + + return TRUE; + + /* ERRORS */ +no_src: + { + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Failed to find a supported video source")); + return FALSE; + } +target_failed: + { + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Failed to set target pad")); + gst_object_unref (targetpad); + return FALSE; + } +} + +static GstStateChangeReturn +gst_auto_video_src_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstAutoVideoSrc *src = GST_AUTO_VIDEO_SRC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_auto_video_src_detect (src)) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + gst_auto_video_src_reset (src); + break; + default: + break; + } + + return ret; +} + +static void +gst_auto_video_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAutoVideoSrc *src = GST_AUTO_VIDEO_SRC (object); + + switch (prop_id) { + case PROP_CAPS: + if (src->filter_caps) + gst_caps_unref (src->filter_caps); + src->filter_caps = gst_caps_copy (gst_value_get_caps (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_auto_video_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAutoVideoSrc *src = GST_AUTO_VIDEO_SRC (object); + + switch (prop_id) { + case PROP_CAPS:{ + gst_value_set_caps (value, src->filter_caps); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/autodetect/gstautovideosrc.h b/gst/autodetect/gstautovideosrc.h new file mode 100644 index 0000000..d72bcd2 --- /dev/null +++ b/gst/autodetect/gstautovideosrc.h @@ -0,0 +1,58 @@ +/* GStreamer + * (c) 2005 Ronald S. Bultje + * (c) 2008 Stefan Kost + * + * 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_AUTO_VIDEO_SRC_H__ +#define __GST_AUTO_VIDEO_SRC_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUTO_VIDEO_SRC \ + (gst_auto_video_src_get_type ()) +#define GST_AUTO_VIDEO_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AUTO_VIDEO_SRC, \ + GstAutoVideoSrc)) +#define GST_AUTO_VIDEO_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AUTO_VIDEO_SRC, \ + GstAutoVideoSrcClass)) +#define GST_IS_AUTO_VIDEO_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AUTO_VIDEO_SRC)) +#define GST_IS_AUTO_VIDEO_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AUTO_VIDEO_SRC)) + +typedef struct _GstAutoVideoSrc { + GstBin parent; + + /* explicit pointers to stuff used */ + GstPad *pad; + GstElement *kid; + GstCaps *filter_caps; +} GstAutoVideoSrc; + +typedef struct _GstAutoVideoSrcClass { + GstBinClass parent_class; +} GstAutoVideoSrcClass; + +GType gst_auto_video_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUTO_VIDEO_SRC_H__ */ diff --git a/gst/avi/Makefile.am b/gst/avi/Makefile.am new file mode 100644 index 0000000..aa75eb4 --- /dev/null +++ b/gst/avi/Makefile.am @@ -0,0 +1,45 @@ +plugin_LTLIBRARIES = libgstavi.la + +libgstavi_la_SOURCES = \ + gstavi.c \ + gstavimux.c \ + gstavidemux.c \ + gstavisubtitle.c + +noinst_HEADERS = \ + avi-ids.h \ + gstavimux.h \ + gstavidemux.h \ + gstavisubtitle.h + +libgstavi_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstavi_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ + +if USE_DIVX_DRM +libgstavi_la_CFLAGS += -DDIVX_DRM +endif + +libgstavi_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstavi_la_LIBTOOLFLAGS = --tag=disable-static + +EXTRA_DIST = README + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstavi -:SHARED libgstavi \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstavi_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstavi_la_CFLAGS) \ + -:LDFLAGS $(libgstavi_la_LDFLAGS) \ + $(libgstavi_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/avi/Makefile.in b/gst/avi/Makefile.in new file mode 100644 index 0000000..45af373 --- /dev/null +++ b/gst/avi/Makefile.in @@ -0,0 +1,863 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/avi +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstavi_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstavi_la_OBJECTS = libgstavi_la-gstavi.lo \ + libgstavi_la-gstavimux.lo libgstavi_la-gstavidemux.lo \ + libgstavi_la-gstavisubtitle.lo +libgstavi_la_OBJECTS = $(am_libgstavi_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstavi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstavi_la_CFLAGS) $(CFLAGS) \ + $(libgstavi_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstavi_la_SOURCES) +DIST_SOURCES = $(libgstavi_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstavi.la +libgstavi_la_SOURCES = \ + gstavi.c \ + gstavimux.c \ + gstavidemux.c \ + gstavisubtitle.c + +noinst_HEADERS = \ + avi-ids.h \ + gstavimux.h \ + gstavidemux.h \ + gstavisubtitle.h + +libgstavi_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstavi_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ + +libgstavi_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstavi_la_LIBTOOLFLAGS = --tag=disable-static +EXTRA_DIST = README +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/avi/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/avi/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstavi.la: $(libgstavi_la_OBJECTS) $(libgstavi_la_DEPENDENCIES) $(EXTRA_libgstavi_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstavi_la_LINK) -rpath $(plugindir) $(libgstavi_la_OBJECTS) $(libgstavi_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstavi_la-gstavi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstavi_la-gstavidemux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstavi_la-gstavimux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstavi_la-gstavisubtitle.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstavi_la-gstavi.lo: gstavi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -MT libgstavi_la-gstavi.lo -MD -MP -MF $(DEPDIR)/libgstavi_la-gstavi.Tpo -c -o libgstavi_la-gstavi.lo `test -f 'gstavi.c' || echo '$(srcdir)/'`gstavi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstavi_la-gstavi.Tpo $(DEPDIR)/libgstavi_la-gstavi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavi.c' object='libgstavi_la-gstavi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -c -o libgstavi_la-gstavi.lo `test -f 'gstavi.c' || echo '$(srcdir)/'`gstavi.c + +libgstavi_la-gstavimux.lo: gstavimux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -MT libgstavi_la-gstavimux.lo -MD -MP -MF $(DEPDIR)/libgstavi_la-gstavimux.Tpo -c -o libgstavi_la-gstavimux.lo `test -f 'gstavimux.c' || echo '$(srcdir)/'`gstavimux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstavi_la-gstavimux.Tpo $(DEPDIR)/libgstavi_la-gstavimux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavimux.c' object='libgstavi_la-gstavimux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -c -o libgstavi_la-gstavimux.lo `test -f 'gstavimux.c' || echo '$(srcdir)/'`gstavimux.c + +libgstavi_la-gstavidemux.lo: gstavidemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -MT libgstavi_la-gstavidemux.lo -MD -MP -MF $(DEPDIR)/libgstavi_la-gstavidemux.Tpo -c -o libgstavi_la-gstavidemux.lo `test -f 'gstavidemux.c' || echo '$(srcdir)/'`gstavidemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstavi_la-gstavidemux.Tpo $(DEPDIR)/libgstavi_la-gstavidemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavidemux.c' object='libgstavi_la-gstavidemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -c -o libgstavi_la-gstavidemux.lo `test -f 'gstavidemux.c' || echo '$(srcdir)/'`gstavidemux.c + +libgstavi_la-gstavisubtitle.lo: gstavisubtitle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -MT libgstavi_la-gstavisubtitle.lo -MD -MP -MF $(DEPDIR)/libgstavi_la-gstavisubtitle.Tpo -c -o libgstavi_la-gstavisubtitle.lo `test -f 'gstavisubtitle.c' || echo '$(srcdir)/'`gstavisubtitle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstavi_la-gstavisubtitle.Tpo $(DEPDIR)/libgstavi_la-gstavisubtitle.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavisubtitle.c' object='libgstavi_la-gstavisubtitle.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -c -o libgstavi_la-gstavisubtitle.lo `test -f 'gstavisubtitle.c' || echo '$(srcdir)/'`gstavisubtitle.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstavi -:SHARED libgstavi \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstavi_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstavi_la_CFLAGS) \ + -:LDFLAGS $(libgstavi_la_LDFLAGS) \ + $(libgstavi_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/avi/README b/gst/avi/README new file mode 100644 index 0000000..69a08a9 --- /dev/null +++ b/gst/avi/README @@ -0,0 +1,72 @@ +The avi decoder plugins +----------------------- + +The avi decoder consists of a set of gstreamer plugins: + + - demuxer (avidemux) + - avi to gstreamer type converter (avitypes) + - windows dlls wrappers. + +the avidecoder element uses the above plugins to perform the avi +decoding. It is constructed as a custom bin which initially only has +the demuxer element in it. The demuxer has a set of padtemplates for +raw audio and video. + + (------------------------------------) + ! avidecoder ! + ! (video/raw)... + ! (----------) ! + ! ! demuxer (video/x-msvideo, auds).. + ! ! ! ! + ! -src ! ! + ! / ! (video/x-msvideo, vids).. + - src ! ! ! + ! (----------) (audio/raw)... + ! ! + (------------------------------------) + +the demuxer has a set of padtemplates for the raw avi header properties. + +The avi decoder will act on the new_pad signal of the demuxer element +and will attach an avitype plugin to the new pad. Caps negotiation will +convert the raw avi caps to the gstreamer caps. If the src pad of the +avitypes plugin are compatible with the avidecoder padtemplate, the +avitype pad is ghosted to the avidecoder bin, this is the case where no +codec is needed (for raw PCM samples, for example). + +When the avitypes caps are not compatible with one of the avidecoder +templates, a static autoplugger is used the find an element to connect +the demuxers pad to the decoders padtemplate. + +When no element could be found, an windec plugin is attached to the +demuxers pad and the avitypes plugin is removed from the decoder. + + +example: +-------- + + An avidecoder that has a video pad (decoded with windows dlls) and an + audio pad (raw PCM). + + (----------------------------------------------------------------) + ! avidecoder (--------) (------) ! + ! !avitypes! !windec! /-- (video/raw) + ! (----------) /-sink src--sink src ----- ! + ! !demuxer (video/x-msvideo, ! ! ! ! + ! ! ! auds).. (--------) (------) ! + ! -sink ! (--------) ! + ! / ! (video/x-..,!avitypes! ! + -sink ! ! vids).. ! ! ! + ! (----------) \-sink src -------------------- (audio/raw) + ! (--------) ! + (----------------------------------------------------------------) + + + +TODO +---- + +automatically generate the padtemplates from all possible avi types +found in the registry. + + diff --git a/gst/avi/avi-ids.h b/gst/avi/avi-ids.h new file mode 100644 index 0000000..7b724df --- /dev/null +++ b/gst/avi/avi-ids.h @@ -0,0 +1,78 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_AVI_H__ +#define __GST_AVI_H__ + +#include + +typedef struct _gst_riff_avih { + guint32 us_frame; /* microsec per frame */ + guint32 max_bps; /* byte/s overall */ + guint32 pad_gran; /* pad_granularity */ + guint32 flags; +/* flags values */ +#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ +#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ +#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ +#define GST_RIFF_AVIH_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames */ +#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ +#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ + guint32 tot_frames; /* # of frames (all) */ + guint32 init_frames; /* initial frames (???) */ + guint32 streams; + guint32 bufsize; /* suggested buffer size */ + guint32 width; + guint32 height; + guint32 scale; + guint32 rate; + guint32 start; + guint32 length; +} gst_riff_avih; + +/* vprp (video properties) ODML header */ +/* see ODML spec for some/more explanation */ +#define GST_RIFF_TAG_vprp GST_MAKE_FOURCC ('v','p','r','p') +#define GST_RIFF_VPRP_VIDEO_FIELDS (2) + +typedef struct _gst_riff_vprp_video_field_desc { + guint32 compressed_bm_height; + guint32 compressed_bm_width; + guint32 valid_bm_height; + guint32 valid_bm_width; + guint32 valid_bm_x_offset; + guint32 valid_bm_y_offset; + guint32 video_x_t_offset; + guint32 video_y_start; +} gst_riff_vprp_video_field_desc; + +typedef struct _gst_riff_vprp { + guint32 format_token; /* whether fields defined by standard */ + guint32 standard; /* video display standard, UNKNOWN, PAL, etc */ + guint32 vert_rate; /* vertical refresh rate */ + guint32 hor_t_total; /* width */ + guint32 vert_lines; /* height */ + guint32 aspect; /* aspect ratio high word:low word */ + guint32 width; /* active width */ + guint32 height; /* active height */ + guint32 fields; /* field count */ + gst_riff_vprp_video_field_desc field_info[GST_RIFF_VPRP_VIDEO_FIELDS]; +} gst_riff_vprp; + +#endif /* __GST_AVI_H__ */ diff --git a/gst/avi/gstavi.c b/gst/avi/gstavi.c new file mode 100644 index 0000000..38ef650 --- /dev/null +++ b/gst/avi/gstavi.c @@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * gstavi.c: plugin registering + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gst/gst-i18n-plugin.h" + +#include "gstavidemux.h" +#include "gstavimux.h" +#include "gstavisubtitle.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_riff_init (); + +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + + if (!gst_element_register (plugin, "avidemux", GST_RANK_PRIMARY, + GST_TYPE_AVI_DEMUX) || + !gst_element_register (plugin, "avimux", GST_RANK_PRIMARY, + GST_TYPE_AVI_MUX) || + !gst_element_register (plugin, "avisubtitle", GST_RANK_PRIMARY, + GST_TYPE_AVI_SUBTITLE)) { + return FALSE; + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "avi", + "AVI stream handling", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c new file mode 100644 index 0000000..6671b0d --- /dev/null +++ b/gst/avi/gstavidemux.c @@ -0,0 +1,6273 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Nokia Corporation (contact ) + * Copyright (C) <2009-2010> STEricsson + * + * 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. + */ +/* Element-Checklist-Version: 5 */ + +/** + * SECTION:element-avidemux + * + * Demuxes an .avi file into raw or compressed audio and/or video streams. + * + * This element supports both push and pull-based scheduling, depending on the + * capabilities of the upstream elements. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=test.avi ! avidemux name=demux demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! autovideosink + * ]| Play (parse and decode) an .avi file and try to output it to + * an automatically detected soundcard and videosink. If the AVI file contains + * compressed audio or video data, this will only work if you have the + * right decoder elements/plugins installed. + * + * + * Last reviewed on 2006-12-29 (0.10.6) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include + +#ifdef DIVX_DRM /* need to check to use same define */ +#include +#include +#endif + +#include "gst/riff/riff-media.h" +#include "gstavidemux.h" +#include "avi-ids.h" +#include +#include + + +#define DIV_ROUND_UP(s,v) (((s) + ((v)-1)) / (v)) + +#define GST_AVI_KEYFRAME 1 +#ifdef AVIDEMUX_MODIFICATION +#define GST_AVI_NON_KEYFRAME 0 +#endif +#define ENTRY_IS_KEYFRAME(e) ((e)->flags == GST_AVI_KEYFRAME) +#define ENTRY_SET_KEYFRAME(e) ((e)->flags = GST_AVI_KEYFRAME) +#define ENTRY_UNSET_KEYFRAME(e) ((e)->flags = 0) + + +GST_DEBUG_CATEGORY_STATIC (avidemux_debug); +#define GST_CAT_DEFAULT avidemux_debug + +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-msvideo") + ); + +#ifdef AVIDEMUX_MODIFICATION +/*Modification: Frame type enumeraions used to generat the index-table */ +typedef enum +{ + H264_NUT_UNKNOWN = 0, + H264_NUT_SLICE = 1, + H264_NUT_DPA = 2, + H264_NUT_DPB = 3, + H264_NUT_DPC = 4, + H264_NUT_IDR = 5, + H264_NUT_SEI = 6, + H264_NUT_SPS = 7, + H264_NUT_PPS = 8, + H264_NUT_AUD = 9, + H264_NUT_EOSEQ = 10, + H264_NUT_EOSTREAM = 11, + H264_NUT_FILL = 12, + H264_NUT_MIXED = 24, +} eH264NalType; +#endif + +static void gst_avi_demux_base_init (GstAviDemuxClass * klass); +static void gst_avi_demux_class_init (GstAviDemuxClass * klass); +static void gst_avi_demux_init (GstAviDemux * avi); +static void gst_avi_demux_finalize (GObject * object); + +static void gst_avi_demux_reset (GstAviDemux * avi); + +#if 0 +static const GstEventMask *gst_avi_demux_get_event_mask (GstPad * pad); +#endif +static gboolean gst_avi_demux_handle_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_avi_demux_handle_sink_event (GstPad * pad, + GstEvent * event); +static gboolean gst_avi_demux_push_event (GstAviDemux * avi, GstEvent * event); + +#if 0 +static const GstFormat *gst_avi_demux_get_src_formats (GstPad * pad); +#endif +static const GstQueryType *gst_avi_demux_get_src_query_types (GstPad * pad); +static gboolean gst_avi_demux_handle_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_avi_demux_src_convert (GstPad * pad, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); + +static gboolean gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment); +static gboolean gst_avi_demux_handle_seek (GstAviDemux * avi, GstPad * pad, + GstEvent * event); +static gboolean gst_avi_demux_handle_seek_push (GstAviDemux * avi, GstPad * pad, + GstEvent * event); +static void gst_avi_demux_loop (GstPad * pad); +static gboolean gst_avi_demux_sink_activate (GstPad * sinkpad); +static gboolean gst_avi_demux_sink_activate_pull (GstPad * sinkpad, + gboolean active); +static gboolean gst_avi_demux_activate_push (GstPad * pad, gboolean active); +static GstFlowReturn gst_avi_demux_chain (GstPad * pad, GstBuffer * buf); + +static void gst_avi_demux_set_index (GstElement * element, GstIndex * index); +static GstIndex *gst_avi_demux_get_index (GstElement * element); +static GstStateChangeReturn gst_avi_demux_change_state (GstElement * element, + GstStateChange transition); +static void gst_avi_demux_calculate_durations_from_index (GstAviDemux * avi); +static void gst_avi_demux_get_buffer_info (GstAviDemux * avi, + GstAviStream * stream, guint entry_n, GstClockTime * timestamp, + GstClockTime * ts_end, guint64 * offset, guint64 * offset_end); + +static void gst_avi_demux_parse_idit (GstAviDemux * avi, GstBuffer * buf); +#ifdef AVIDEMUX_MODIFICATION +/*Modification: Added function to find out the frame_type for index-table generation */ +static int +gst_avi_demux_find_frame_type (GstAviStream *stream, GstBuffer *buf, int *frame_type); +static void gst_avidemux_forward_trickplay (GstAviDemux * avi, GstAviStream * stream, guint64 *timestamp); +static void gst_avidemux_backward_trickplay (GstAviDemux * avi, GstAviStream * stream, guint64 *timestamp); +static GstFlowReturn gst_avidemux_seek_to_previous_keyframe (GstAviDemux *avi); +#endif + +static GstElementClass *parent_class = NULL; + +#ifdef DIVX_DRM + +typedef enum drmErrorCodes +{ + DRM_SUCCESS = 0, + DRM_NOT_AUTHORIZED, + DRM_NOT_REGISTERED, + DRM_RENTAL_EXPIRED, + DRM_GENERAL_ERROR, + DRM_NEVER_REGISTERED, +} drmErrorCodes_t; + + +#define DIVX_SDK_PLUGIN_NAME "libmm_divxsdk.so" + +static gboolean init_divx_plugin (GstAviDemux * avi) +{ + char *error; + avi->divx_handle = dlopen (DIVX_SDK_PLUGIN_NAME, RTLD_LAZY); + if (!avi->divx_handle) { + GST_ERROR ("dlopen failed [%s]", dlerror()); + return FALSE; + } + GST_DEBUG("dlopen success"); + + avi->divx_init = dlsym (avi->divx_handle, "divx_init"); + if ((error = dlerror()) != NULL) { + GST_ERROR ("[%s][%d]", __func__, __LINE__); + goto DL_ERROR; + } + + avi->divx_commit = dlsym (avi->divx_handle, "divx_commit"); + if ((error = dlerror()) != NULL) { + GST_ERROR ("[%s][%d] %p", __func__, __LINE__, avi->divx_commit); + goto DL_ERROR; + } + + avi->divx_decrypt_audio = dlsym (avi->divx_handle, "divx_decrypt_audio"); + GST_ERROR ("[%s][%d] %p", __func__, __LINE__, avi->divx_decrypt_audio); + if ((error = dlerror()) != NULL) { + goto DL_ERROR; + } + + avi->divx_prepare_video_bitstream = dlsym (avi->divx_handle, "divx_prepare_video_bitstream"); + if ((error = dlerror()) != NULL) { + GST_ERROR ("[%s][%d]", __func__, __LINE__); + goto DL_ERROR; + } + + avi->divx_finalize = dlsym (avi->divx_handle, "divx_finalize"); + if ((error = dlerror()) != NULL) { + GST_ERROR ("[%s][%d]", __func__, __LINE__); + goto DL_ERROR; + } + + return TRUE; + +DL_ERROR: + GST_ERROR ("error : %s", error); + dlclose(avi->divx_handle); + avi->divx_handle = NULL; + return FALSE; +} + + +/* ---------------------------------------------------- DIVX DRM Code : Start -----------------------------------------------------------------*/ +static gboolean +gst_avi_demux_init_divx_drm (GstAviDemux * avi, uint8_t* drm_info) +{ + int error_code = 0; + + if (init_divx_plugin (avi) == FALSE) { + GST_ERROR_OBJECT (avi, "Loading plugin failed...."); + return FALSE; + } + + avi->drmContext = avi->divx_init (drm_info, &error_code); + if (avi->drmContext) { + GST_DEBUG_OBJECT (avi,"%s init success: drmContext = %p\n", __func__, avi->drmContext); + } else { + GST_ERROR_OBJECT (avi,"%s failed to init... error code = %d \n", __func__, error_code); + return FALSE; + } + + error_code = avi->divx_commit (avi->drmContext); + if (error_code == DRM_SUCCESS) { + GST_DEBUG_OBJECT (avi,"%s commit success: drmContext = %p\n", __func__, avi->drmContext); + } else { + GST_ERROR_OBJECT (avi,"%s failed to commit... error code = %d \n", __func__, error_code); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_avi_demux_send_divx_tag (GstAviDemux * avi) +{ + gboolean ret = 0; + GstTagList *tags = NULL; + GST_ERROR_OBJECT (avi, "*********** posting divx drm tags!!!!!!!!!!!!!!!!!!"); + tags = gst_tag_list_new_full ("drm_divx", "1", NULL); + if (tags) { + ret = gst_avi_demux_push_event (avi, gst_event_new_tag (tags) ); + GST_ERROR_OBJECT (avi, "*********** posting tags returns [%d] !!!!!!!!!!!!!!!!!!", ret); + } + return ret; +} +/* ---------------------------------------------------- DIVX DRM Code : End -----------------------------------------------------------------*/ +#endif // DIVX_DRM +/* GObject methods */ + +GType +gst_avi_demux_get_type (void) +{ + static GType avi_demux_type = 0; + + if (!avi_demux_type) { + static const GTypeInfo avi_demux_info = { + sizeof (GstAviDemuxClass), + (GBaseInitFunc) gst_avi_demux_base_init, + NULL, + (GClassInitFunc) gst_avi_demux_class_init, + NULL, + NULL, + sizeof (GstAviDemux), + 0, + (GInstanceInitFunc) gst_avi_demux_init, + }; + + avi_demux_type = + g_type_register_static (GST_TYPE_ELEMENT, + "GstAviDemux", &avi_demux_info, 0); + } + + return avi_demux_type; +} + +static void +gst_avi_demux_base_init (GstAviDemuxClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstPadTemplate *videosrctempl, *audiosrctempl, *subsrctempl; + GstCaps *audcaps, *vidcaps, *subcaps; + + audcaps = gst_riff_create_audio_template_caps (); + gst_caps_append (audcaps, gst_caps_new_simple ("audio/x-avi-unknown", NULL)); + audiosrctempl = gst_pad_template_new ("audio_%02d", + GST_PAD_SRC, GST_PAD_SOMETIMES, audcaps); + + vidcaps = gst_riff_create_video_template_caps (); + gst_caps_append (vidcaps, gst_riff_create_iavs_template_caps ()); + gst_caps_append (vidcaps, gst_caps_new_simple ("video/x-avi-unknown", NULL)); + videosrctempl = gst_pad_template_new ("video_%02d", + GST_PAD_SRC, GST_PAD_SOMETIMES, vidcaps); + + subcaps = gst_caps_new_simple ("application/x-subtitle-avi", NULL); + subsrctempl = gst_pad_template_new ("subtitle_%02d", + GST_PAD_SRC, GST_PAD_SOMETIMES, subcaps); + gst_element_class_add_pad_template (element_class, audiosrctempl); + gst_element_class_add_pad_template (element_class, videosrctempl); + gst_element_class_add_pad_template (element_class, subsrctempl); + gst_element_class_add_static_pad_template (element_class, &sink_templ); + gst_object_unref (audiosrctempl); + gst_object_unref (videosrctempl); + gst_object_unref (subsrctempl); + gst_element_class_set_details_simple (element_class, "Avi demuxer", + "Codec/Demuxer", + "Demultiplex an avi file into audio and video", + "Erik Walthinsen , " + "Wim Taymans , " + "Thijs Vermeir "); +} + +static void +gst_avi_demux_class_init (GstAviDemuxClass * klass) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + GObjectClass *gobject_class = (GObjectClass *) klass; + + GST_DEBUG_CATEGORY_INIT (avidemux_debug, "avidemux", + 0, "Demuxer for AVI streams"); + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_avi_demux_finalize; + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_avi_demux_change_state); + + gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_avi_demux_set_index); + gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_avi_demux_get_index); + +#ifdef DIVX_DRM + gst_tag_register ("drm_divx", GST_TAG_FLAG_META, + G_TYPE_STRING, + _("DRM DivX"), + _("a tag that is specific to DivX DRM File"), + NULL); +#endif +} + +static void +gst_avi_demux_init (GstAviDemux * avi) +{ + avi->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink"); + gst_pad_set_activate_function (avi->sinkpad, + GST_DEBUG_FUNCPTR (gst_avi_demux_sink_activate)); + gst_pad_set_activatepull_function (avi->sinkpad, + GST_DEBUG_FUNCPTR (gst_avi_demux_sink_activate_pull)); + gst_pad_set_activatepush_function (avi->sinkpad, + GST_DEBUG_FUNCPTR (gst_avi_demux_activate_push)); + gst_pad_set_chain_function (avi->sinkpad, + GST_DEBUG_FUNCPTR (gst_avi_demux_chain)); + gst_pad_set_event_function (avi->sinkpad, + GST_DEBUG_FUNCPTR (gst_avi_demux_handle_sink_event)); + gst_element_add_pad (GST_ELEMENT_CAST (avi), avi->sinkpad); + + avi->adapter = gst_adapter_new (); + + gst_avi_demux_reset (avi); +} + +static void +gst_avi_demux_finalize (GObject * object) +{ + GstAviDemux *avi = GST_AVI_DEMUX (object); + + GST_DEBUG ("AVI: finalize"); + + g_object_unref (avi->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_avi_demux_reset_stream (GstAviDemux * avi, GstAviStream * stream) +{ + g_free (stream->strh); + g_free (stream->strf.data); + g_free (stream->name); + g_free (stream->index); + g_free (stream->indexes); +#ifdef AVIDEMUX_MODIFICATION + if (stream->trickplay_info) + g_free (stream->trickplay_info); +#endif + + if (stream->initdata) + gst_buffer_unref (stream->initdata); + if (stream->extradata) + gst_buffer_unref (stream->extradata); + if (stream->pad) { + if (stream->exposed) { + gst_pad_set_active (stream->pad, FALSE); + gst_element_remove_pad (GST_ELEMENT_CAST (avi), stream->pad); + } else + gst_object_unref (stream->pad); + } + if (stream->taglist) { + gst_tag_list_free (stream->taglist); + stream->taglist = NULL; + } + memset (stream, 0, sizeof (GstAviStream)); +} + +static void +gst_avi_demux_reset (GstAviDemux * avi) +{ + gint i; + + GST_DEBUG ("AVI: reset"); + + for (i = 0; i < avi->num_streams; i++) + gst_avi_demux_reset_stream (avi, &avi->stream[i]); + + avi->header_state = GST_AVI_DEMUX_HEADER_TAG_LIST; + avi->num_streams = 0; + avi->num_v_streams = 0; + avi->num_a_streams = 0; + avi->num_t_streams = 0; + avi->main_stream = -1; + + avi->state = GST_AVI_DEMUX_START; + avi->offset = 0; + avi->building_index = FALSE; + + avi->index_offset = 0; + g_free (avi->avih); + avi->avih = NULL; + + if (avi->element_index) + gst_object_unref (avi->element_index); + avi->element_index = NULL; + + if (avi->close_seg_event) { + gst_event_unref (avi->close_seg_event); + avi->close_seg_event = NULL; + } + if (avi->seg_event) { + gst_event_unref (avi->seg_event); + avi->seg_event = NULL; + } + if (avi->seek_event) { + gst_event_unref (avi->seek_event); + avi->seek_event = NULL; + } + + if (avi->globaltags) + gst_tag_list_free (avi->globaltags); + avi->globaltags = NULL; + + avi->got_tags = TRUE; /* we always want to push global tags */ + avi->have_eos = FALSE; + avi->seekable = TRUE; + + gst_adapter_clear (avi->adapter); + + gst_segment_init (&avi->segment, GST_FORMAT_TIME); + +#ifdef DIVX_DRM + if(avi->drmContext) + { + avi->divx_finalize (avi->drmContext); + free(avi->drmContext); + avi->drmContext = NULL; + } + + if (avi->divx_handle) + { + dlclose(avi->divx_handle); + avi->divx_handle = NULL; + } +#endif +} + + +/* GstElement methods */ + +#if 0 +static const GstFormat * +gst_avi_demux_get_src_formats (GstPad * pad) +{ + GstAviStream *stream = gst_pad_get_element_private (pad); + + static const GstFormat src_a_formats[] = { + GST_FORMAT_TIME, + GST_FORMAT_BYTES, + GST_FORMAT_DEFAULT, + 0 + }; + static const GstFormat src_v_formats[] = { + GST_FORMAT_TIME, + GST_FORMAT_DEFAULT, + 0 + }; + + return (stream->strh->type == GST_RIFF_FCC_auds ? + src_a_formats : src_v_formats); +} +#endif + +/* assumes stream->strf.auds->av_bps != 0 */ +static inline GstClockTime +avi_stream_convert_bytes_to_time_unchecked (GstAviStream * stream, + guint64 bytes) +{ + return gst_util_uint64_scale_int (bytes, GST_SECOND, + stream->strf.auds->av_bps); +} + +static inline guint64 +avi_stream_convert_time_to_bytes_unchecked (GstAviStream * stream, + GstClockTime time) +{ + return gst_util_uint64_scale_int (time, stream->strf.auds->av_bps, + GST_SECOND); +} + +/* assumes stream->strh->rate != 0 */ +static inline GstClockTime +avi_stream_convert_frames_to_time_unchecked (GstAviStream * stream, + guint64 frames) +{ + return gst_util_uint64_scale (frames, stream->strh->scale * GST_SECOND, + stream->strh->rate); +} + +static inline guint64 +avi_stream_convert_time_to_frames_unchecked (GstAviStream * stream, + GstClockTime time) +{ + return gst_util_uint64_scale (time, stream->strh->rate, + stream->strh->scale * GST_SECOND); +} + +static gboolean +gst_avi_demux_src_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value) +{ + GstAviStream *stream = gst_pad_get_element_private (pad); + gboolean res = TRUE; + + GST_LOG_OBJECT (pad, + "Received src_format:%s, src_value:%" G_GUINT64_FORMAT + ", dest_format:%s", gst_format_get_name (src_format), src_value, + gst_format_get_name (*dest_format)); + + if (G_UNLIKELY (src_format == *dest_format)) { + *dest_value = src_value; + goto done; + } + if (G_UNLIKELY (!stream->strh || !stream->strf.data)) { + res = FALSE; + goto done; + } + if (G_UNLIKELY (stream->strh->type == GST_RIFF_FCC_vids && + (src_format == GST_FORMAT_BYTES + || *dest_format == GST_FORMAT_BYTES))) { + res = FALSE; + goto done; + } + + switch (src_format) { + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_BYTES: + *dest_value = gst_util_uint64_scale_int (src_value, + stream->strf.auds->av_bps, GST_SECOND); + break; + case GST_FORMAT_DEFAULT: + *dest_value = + gst_util_uint64_scale_round (src_value, stream->strh->rate, + stream->strh->scale * GST_SECOND); + break; + default: + res = FALSE; + break; + } + break; + case GST_FORMAT_BYTES: + switch (*dest_format) { + case GST_FORMAT_TIME: + if (stream->strf.auds->av_bps != 0) { + *dest_value = avi_stream_convert_bytes_to_time_unchecked (stream, + src_value); + } else + res = FALSE; + break; + default: + res = FALSE; + break; + } + break; + case GST_FORMAT_DEFAULT: + switch (*dest_format) { + case GST_FORMAT_TIME: + *dest_value = + avi_stream_convert_frames_to_time_unchecked (stream, src_value); + break; + default: + res = FALSE; + break; + } + break; + default: + res = FALSE; + } + +done: + GST_LOG_OBJECT (pad, + "Returning res:%d dest_format:%s dest_value:%" G_GUINT64_FORMAT, res, + gst_format_get_name (*dest_format), *dest_value); + return res; +} + +static const GstQueryType * +gst_avi_demux_get_src_query_types (GstPad * pad) +{ + static const GstQueryType src_types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_SEEKING, + GST_QUERY_CONVERT, + 0 + }; + + return src_types; +} + +static gboolean +gst_avi_demux_handle_src_query (GstPad * pad, GstQuery * query) +{ + gboolean res = TRUE; + GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); + + GstAviStream *stream = gst_pad_get_element_private (pad); + + if (!stream->strh || !stream->strf.data) + return gst_pad_query_default (pad, query); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION:{ + gint64 pos = 0; + + GST_DEBUG ("pos query for stream %u: frames %u, bytes %u", + stream->num, stream->current_entry, stream->current_total); + + /* FIXME, this looks clumsy */ + if (stream->strh->type == GST_RIFF_FCC_auds) { + if (stream->is_vbr) { + /* VBR */ + pos = gst_util_uint64_scale ((gint64) stream->current_entry * + stream->strh->scale, GST_SECOND, (guint64) stream->strh->rate); + GST_DEBUG_OBJECT (avi, "VBR convert frame %u, time %" + GST_TIME_FORMAT, stream->current_entry, GST_TIME_ARGS (pos)); + } else if (stream->strf.auds->av_bps != 0) { + /* CBR */ + pos = gst_util_uint64_scale (stream->current_total, GST_SECOND, + (guint64) stream->strf.auds->av_bps); + GST_DEBUG_OBJECT (avi, + "CBR convert bytes %u, time %" GST_TIME_FORMAT, + stream->current_total, GST_TIME_ARGS (pos)); + } else if (stream->idx_n != 0 && stream->total_bytes != 0) { + /* calculate timestamps based on percentage of length */ + guint64 xlen = avi->avih->us_frame * + avi->avih->tot_frames * GST_USECOND; + + if (stream->is_vbr) { + pos = gst_util_uint64_scale (xlen, stream->current_entry, + stream->idx_n); + GST_DEBUG_OBJECT (avi, "VBR perc convert frame %u, time %" + GST_TIME_FORMAT, stream->current_entry, GST_TIME_ARGS (pos)); + } else { + pos = gst_util_uint64_scale (xlen, stream->current_total, + stream->total_bytes); + GST_DEBUG_OBJECT (avi, + "CBR perc convert bytes %u, time %" GST_TIME_FORMAT, + stream->current_total, GST_TIME_ARGS (pos)); + } + } else { + /* we don't know */ + res = FALSE; + } + } else { + if (stream->strh->rate != 0) { + pos = gst_util_uint64_scale ((guint64) stream->current_entry * + stream->strh->scale, GST_SECOND, (guint64) stream->strh->rate); + } else { + pos = stream->current_entry * avi->avih->us_frame * GST_USECOND; + } + } + if (res) { + GST_DEBUG ("pos query : %" GST_TIME_FORMAT, GST_TIME_ARGS (pos)); + gst_query_set_position (query, GST_FORMAT_TIME, pos); + } else + GST_WARNING ("pos query failed"); + break; + } + case GST_QUERY_DURATION: + { + GstFormat fmt; + GstClockTime duration; + + /* only act on audio or video streams */ + if (stream->strh->type != GST_RIFF_FCC_auds && + stream->strh->type != GST_RIFF_FCC_vids) { + res = FALSE; + break; + } + + /* take stream duration, fall back to avih duration */ + if ((duration = stream->duration) == -1) + duration = avi->duration; + + gst_query_parse_duration (query, &fmt, NULL); + + switch (fmt) { + case GST_FORMAT_TIME: + gst_query_set_duration (query, fmt, duration); + break; + case GST_FORMAT_DEFAULT: + { + gint64 dur; + GST_DEBUG_OBJECT (query, "total frames is %" G_GUINT32_FORMAT, + stream->idx_n); + + if (stream->idx_n >= 0) + gst_query_set_duration (query, fmt, stream->idx_n); + else if (gst_pad_query_convert (pad, GST_FORMAT_TIME, + duration, &fmt, &dur)) + gst_query_set_duration (query, fmt, dur); + break; + } + default: + res = FALSE; + break; + } + break; + } + case GST_QUERY_SEEKING:{ + GstFormat fmt; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if (fmt == GST_FORMAT_TIME) { + gboolean seekable = TRUE; + + if (avi->streaming) { + seekable = avi->seekable; + } + + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, + 0, stream->duration); + res = TRUE; + } + break; + } + case GST_QUERY_CONVERT:{ + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if ((res = gst_avi_demux_src_convert (pad, src_fmt, src_val, &dest_fmt, + &dest_val))) + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + else + res = gst_pad_query_default (pad, query); + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + + gst_object_unref (avi); + return res; +} + +#if 0 +static const GstEventMask * +gst_avi_demux_get_event_mask (GstPad * pad) +{ + static const GstEventMask masks[] = { + {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT}, + {0,} + }; + + return masks; +} +#endif + +static guint64 +gst_avi_demux_seek_streams (GstAviDemux * avi, guint64 offset, gboolean before) +{ + GstAviStream *stream; + GstIndexEntry *entry; + gint i; + gint64 val, min = offset; + + for (i = 0; i < avi->num_streams; i++) { + stream = &avi->stream[i]; + + entry = gst_index_get_assoc_entry (avi->element_index, stream->index_id, + before ? GST_INDEX_LOOKUP_BEFORE : GST_INDEX_LOOKUP_AFTER, + GST_ASSOCIATION_FLAG_NONE, GST_FORMAT_BYTES, offset); + + if (before) { + if (entry) { + gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &val); + GST_DEBUG_OBJECT (avi, "stream %d, previous entry at %" + G_GUINT64_FORMAT, i, val); + if (val < min) + min = val; + } + continue; + } + + if (!entry) { + GST_DEBUG_OBJECT (avi, "no position for stream %d, assuming at start", i); + stream->current_entry = 0; + stream->current_total = 0; + continue; + } + + gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &val); + GST_DEBUG_OBJECT (avi, "stream %d, next entry at %" G_GUINT64_FORMAT, + i, val); + + gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &val); + stream->current_total = val; + gst_index_entry_assoc_map (entry, GST_FORMAT_DEFAULT, &val); + stream->current_entry = val; + } + + return min; +} + +static guint +gst_avi_demux_index_entry_offset_search (GstAviIndexEntry * entry, + guint64 * offset) +{ + if (entry->offset < *offset) + return -1; + else if (entry->offset > *offset) + return 1; + return 0; +} + +static guint64 +gst_avi_demux_seek_streams_index (GstAviDemux * avi, guint64 offset, + gboolean before) +{ + GstAviStream *stream; + GstAviIndexEntry *entry; + gint i; + gint64 val, min = offset; + guint index = 0; + + for (i = 0; i < avi->num_streams; i++) { + stream = &avi->stream[i]; + + /* compensate for chunk header */ + offset += 8; + entry = + gst_util_array_binary_search (stream->index, stream->idx_n, + sizeof (GstAviIndexEntry), + (GCompareDataFunc) gst_avi_demux_index_entry_offset_search, + before ? GST_SEARCH_MODE_BEFORE : GST_SEARCH_MODE_AFTER, &offset, NULL); + offset -= 8; + + if (entry) + index = entry - stream->index; + + if (before) { + if (entry) { + val = stream->index[index].offset; + GST_DEBUG_OBJECT (avi, + "stream %d, previous entry at %" G_GUINT64_FORMAT, i, val); + if (val < min) + min = val; + } + continue; + } + + if (!entry) { + GST_DEBUG_OBJECT (avi, "no position for stream %d, assuming at start", i); + stream->current_entry = 0; + stream->current_total = 0; + continue; + } + + val = stream->index[index].offset - 8; + GST_DEBUG_OBJECT (avi, "stream %d, next entry at %" G_GUINT64_FORMAT, i, + val); + + stream->current_total = stream->index[index].total; + stream->current_entry = index; + } + + return min; +} + +#define GST_AVI_SEEK_PUSH_DISPLACE (4 * GST_SECOND) + +static gboolean +gst_avi_demux_handle_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (avi, + "have event type %s: %p on sink pad", GST_EVENT_TYPE_NAME (event), event); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time, offset = 0; + gboolean update; + GstSegment segment; + + /* some debug output */ + gst_segment_init (&segment, GST_FORMAT_UNDEFINED); + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + gst_segment_set_newsegment_full (&segment, update, rate, arate, format, + start, stop, time); + GST_DEBUG_OBJECT (avi, + "received format %d newsegment %" GST_SEGMENT_FORMAT, format, + &segment); + + /* chain will send initial newsegment after pads have been added */ + if (avi->state != GST_AVI_DEMUX_MOVI) { + GST_DEBUG_OBJECT (avi, "still starting, eating event"); + goto exit; + } + + /* we only expect a BYTE segment, e.g. following a seek */ + if (format != GST_FORMAT_BYTES) { + GST_DEBUG_OBJECT (avi, "unsupported segment format, ignoring"); + goto exit; + } + + if (avi->have_index) { + GstAviIndexEntry *entry; + guint i = 0, index = 0, k = 0; + GstAviStream *stream; + + /* compensate chunk header, stored index offset points after header */ + start += 8; + /* find which stream we're on */ + do { + stream = &avi->stream[i]; + + /* find the index for start bytes offset */ + entry = gst_util_array_binary_search (stream->index, + stream->idx_n, sizeof (GstAviIndexEntry), + (GCompareDataFunc) gst_avi_demux_index_entry_offset_search, + GST_SEARCH_MODE_AFTER, &start, NULL); + + if (entry == NULL) + continue; + index = entry - stream->index; + + /* we are on the stream with a chunk start offset closest to start */ + if (!offset || stream->index[index].offset < offset) { + offset = stream->index[index].offset; + k = i; + } + /* exact match needs no further searching */ + if (stream->index[index].offset == start) + break; + } while (++i < avi->num_streams); + start -= 8; + offset -= 8; + stream = &avi->stream[k]; + + /* so we have no idea what is to come, or where we are */ + if (!offset) { + GST_WARNING_OBJECT (avi, "insufficient index data, forcing EOS"); + goto eos; + } + + /* get the ts corresponding to start offset bytes for the stream */ + gst_avi_demux_get_buffer_info (avi, stream, index, + (GstClockTime *) & time, NULL, NULL, NULL); + } else if (avi->element_index) { + GstIndexEntry *entry; + + /* Let's check if we have an index entry for this position */ + entry = gst_index_get_assoc_entry (avi->element_index, avi->index_id, + GST_INDEX_LOOKUP_AFTER, GST_ASSOCIATION_FLAG_NONE, + GST_FORMAT_BYTES, start); + + /* we can not go where we have not yet been before ... */ + if (!entry) { + GST_WARNING_OBJECT (avi, "insufficient index data, forcing EOS"); + goto eos; + } + + gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &time); + gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &offset); + } else { + GST_WARNING_OBJECT (avi, "no index data, forcing EOS"); + goto eos; + } + + stop = GST_CLOCK_TIME_NONE; + + /* set up segment and send downstream */ + gst_segment_set_newsegment_full (&avi->segment, update, rate, arate, + GST_FORMAT_TIME, time, stop, time); + GST_DEBUG_OBJECT (avi, "Pushing newseg update %d, rate %g, " + "applied rate %g, format %d, start %" G_GINT64_FORMAT ", " + "stop %" G_GINT64_FORMAT, update, rate, arate, GST_FORMAT_TIME, + time, stop); + gst_avi_demux_push_event (avi, + gst_event_new_new_segment_full (update, rate, arate, GST_FORMAT_TIME, + time, stop, time)); + + GST_DEBUG_OBJECT (avi, "next chunk expected at %" G_GINT64_FORMAT, start); + + /* adjust state for streaming thread accordingly */ + if (avi->have_index) + gst_avi_demux_seek_streams_index (avi, offset, FALSE); + else + gst_avi_demux_seek_streams (avi, offset, FALSE); + + /* set up streaming thread */ + g_assert (offset >= start); + avi->offset = start; + avi->todrop = offset - start; + + exit: + gst_event_unref (event); + res = TRUE; + break; + eos: + /* set up for EOS */ + avi->have_eos = TRUE; + goto exit; + } + case GST_EVENT_EOS: + { + if (avi->state != GST_AVI_DEMUX_MOVI) { + gst_event_unref (event); + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, + (NULL), ("got eos and didn't receive a complete header object")); + } else if (!gst_avi_demux_push_event (avi, event)) { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, + (NULL), ("got eos but no streams (yet)")); + } + break; + } + case GST_EVENT_FLUSH_STOP: + { + gint i; + + gst_adapter_clear (avi->adapter); + avi->have_eos = FALSE; + for (i = 0; i < avi->num_streams; i++) { + avi->stream[i].last_flow = GST_FLOW_OK; + avi->stream[i].discont = TRUE; + } + /* fall through to default case so that the event gets passed downstream */ + } + default: + res = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (avi); + + return res; +} + +static gboolean +gst_avi_demux_handle_src_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (avi, + "have event type %s: %p on src pad", GST_EVENT_TYPE_NAME (event), event); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + if (!avi->streaming) { + res = gst_avi_demux_handle_seek (avi, pad, event); + } else { + res = gst_avi_demux_handle_seek_push (avi, pad, event); + } + gst_event_unref (event); + break; + case GST_EVENT_QOS: + case GST_EVENT_NAVIGATION: + res = FALSE; + gst_event_unref (event); + break; + default: + res = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (avi); + + return res; +} + +/* streaming helper (push) */ + +/* + * gst_avi_demux_peek_chunk_info: + * @avi: Avi object + * @tag: holder for tag + * @size: holder for tag size + * + * Peek next chunk info (tag and size) + * + * Returns: TRUE when one chunk info has been got + */ +static gboolean +gst_avi_demux_peek_chunk_info (GstAviDemux * avi, guint32 * tag, guint32 * size) +{ + const guint8 *data = NULL; + + if (gst_adapter_available (avi->adapter) < 8) + return FALSE; + + data = gst_adapter_peek (avi->adapter, 8); + *tag = GST_READ_UINT32_LE (data); + *size = GST_READ_UINT32_LE (data + 4); + + return TRUE; +} + +/* + * gst_avi_demux_peek_chunk: + * @avi: Avi object + * @tag: holder for tag + * @size: holder for tag size + * + * Peek enough data for one full chunk + * + * Returns: %TRUE when one chunk has been got + */ +static gboolean +gst_avi_demux_peek_chunk (GstAviDemux * avi, guint32 * tag, guint32 * size) +{ + guint32 peek_size = 0; + gint available; + + if (!gst_avi_demux_peek_chunk_info (avi, tag, size)) + goto peek_failed; + + /* size 0 -> empty data buffer would surprise most callers, + * large size -> do not bother trying to squeeze that into adapter, + * so we throw poor man's exception, which can be caught if caller really + * wants to handle 0 size chunk */ + if (!(*size) || (*size) >= (1 << 30)) + goto strange_size; + + peek_size = (*size + 1) & ~1; + available = gst_adapter_available (avi->adapter); + + GST_DEBUG_OBJECT (avi, + "Need to peek chunk of %d bytes to read chunk %" GST_FOURCC_FORMAT + ", %d bytes available", *size, GST_FOURCC_ARGS (*tag), available); + + if (available < (8 + peek_size)) + goto need_more; + + return TRUE; + + /* ERRORS */ +peek_failed: + { + GST_INFO_OBJECT (avi, "Failed to peek"); + return FALSE; + } +strange_size: + { + GST_INFO_OBJECT (avi, + "Invalid/unexpected chunk size %d for tag %" GST_FOURCC_FORMAT, *size, + GST_FOURCC_ARGS (*tag)); + /* chain should give up */ + avi->abort_buffering = TRUE; + return FALSE; + } +need_more: + { + GST_INFO_OBJECT (avi, "need more %d < %" G_GUINT32_FORMAT, + available, 8 + peek_size); + return FALSE; + } +} + +/* AVI init */ + +/* + * gst_avi_demux_parse_file_header: + * @element: caller element (used for errors/debug). + * @buf: input data to be used for parsing. + * + * "Open" a RIFF/AVI file. The buffer should be at least 12 + * bytes long. Takes ownership of @buf. + * + * Returns: TRUE if the file is a RIFF/AVI file, FALSE otherwise. + * Throws an error, caller should error out (fatal). + */ +static gboolean +gst_avi_demux_parse_file_header (GstElement * element, GstBuffer * buf) +{ + guint32 doctype; + GstClockTime stamp; + + stamp = gst_util_get_timestamp (); + + /* riff_parse posts an error */ + if (!gst_riff_parse_file_header (element, buf, &doctype)) + return FALSE; + + if (doctype != GST_RIFF_RIFF_AVI) + goto not_avi; + + stamp = gst_util_get_timestamp () - stamp; + GST_DEBUG_OBJECT (element, "header parsing took %" GST_TIME_FORMAT, + GST_TIME_ARGS (stamp)); + + return TRUE; + + /* ERRORS */ +not_avi: + { + GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), + ("File is not an AVI file: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (doctype))); + return FALSE; + } +} + +/* + * Read AVI file tag when streaming + */ +static GstFlowReturn +gst_avi_demux_stream_init_push (GstAviDemux * avi) +{ + if (gst_adapter_available (avi->adapter) >= 12) { + GstBuffer *tmp; + + tmp = gst_adapter_take_buffer (avi->adapter, 12); + + GST_DEBUG ("Parsing avi header"); + if (!gst_avi_demux_parse_file_header (GST_ELEMENT_CAST (avi), tmp)) { + return GST_FLOW_ERROR; + } + GST_DEBUG ("header ok"); + avi->offset += 12; + + avi->state = GST_AVI_DEMUX_HEADER; + } + return GST_FLOW_OK; +} + +/* + * Read AVI file tag + */ +static GstFlowReturn +gst_avi_demux_stream_init_pull (GstAviDemux * avi) +{ + GstFlowReturn res; + GstBuffer *buf = NULL; + + res = gst_pad_pull_range (avi->sinkpad, avi->offset, 12, &buf); + if (res != GST_FLOW_OK) + return res; + else if (!gst_avi_demux_parse_file_header (GST_ELEMENT_CAST (avi), buf)) + goto wrong_header; + + avi->offset += 12; + + return GST_FLOW_OK; + + /* ERRORS */ +wrong_header: + { + GST_DEBUG_OBJECT (avi, "error parsing file header"); + return GST_FLOW_ERROR; + } +} + +/* AVI header handling */ +/* + * gst_avi_demux_parse_avih: + * @avi: caller element (used for errors/debug). + * @buf: input data to be used for parsing. + * @avih: pointer to structure (filled in by function) containing + * stream information (such as flags, number of streams, etc.). + * + * Read 'avih' header. Discards buffer after use. + * + * Returns: TRUE on success, FALSE otherwise. Throws an error if + * the header is invalid. The caller should error out + * (fatal). + */ +static gboolean +gst_avi_demux_parse_avih (GstAviDemux * avi, + GstBuffer * buf, gst_riff_avih ** _avih) +{ + gst_riff_avih *avih; + + if (buf == NULL) + goto no_buffer; + + if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_avih)) + goto avih_too_small; + + avih = g_memdup (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + +#if (G_BYTE_ORDER == G_BIG_ENDIAN) + avih->us_frame = GUINT32_FROM_LE (avih->us_frame); + avih->max_bps = GUINT32_FROM_LE (avih->max_bps); + avih->pad_gran = GUINT32_FROM_LE (avih->pad_gran); + avih->flags = GUINT32_FROM_LE (avih->flags); + avih->tot_frames = GUINT32_FROM_LE (avih->tot_frames); + avih->init_frames = GUINT32_FROM_LE (avih->init_frames); + avih->streams = GUINT32_FROM_LE (avih->streams); + avih->bufsize = GUINT32_FROM_LE (avih->bufsize); + avih->width = GUINT32_FROM_LE (avih->width); + avih->height = GUINT32_FROM_LE (avih->height); + avih->scale = GUINT32_FROM_LE (avih->scale); + avih->rate = GUINT32_FROM_LE (avih->rate); + avih->start = GUINT32_FROM_LE (avih->start); + avih->length = GUINT32_FROM_LE (avih->length); +#endif + + /* debug stuff */ + GST_INFO_OBJECT (avi, "avih tag found:"); + GST_INFO_OBJECT (avi, " us_frame %u", avih->us_frame); + GST_INFO_OBJECT (avi, " max_bps %u", avih->max_bps); + GST_INFO_OBJECT (avi, " pad_gran %u", avih->pad_gran); + GST_INFO_OBJECT (avi, " flags 0x%08x", avih->flags); + GST_INFO_OBJECT (avi, " tot_frames %u", avih->tot_frames); + GST_INFO_OBJECT (avi, " init_frames %u", avih->init_frames); + GST_INFO_OBJECT (avi, " streams %u", avih->streams); + GST_INFO_OBJECT (avi, " bufsize %u", avih->bufsize); + GST_INFO_OBJECT (avi, " width %u", avih->width); + GST_INFO_OBJECT (avi, " height %u", avih->height); + GST_INFO_OBJECT (avi, " scale %u", avih->scale); + GST_INFO_OBJECT (avi, " rate %u", avih->rate); + GST_INFO_OBJECT (avi, " start %u", avih->start); + GST_INFO_OBJECT (avi, " length %u", avih->length); + + *_avih = avih; + gst_buffer_unref (buf); + + if (avih->us_frame != 0 && avih->tot_frames != 0) + avi->duration = + (guint64) avih->us_frame * (guint64) avih->tot_frames * 1000; + else + avi->duration = GST_CLOCK_TIME_NONE; + + GST_INFO_OBJECT (avi, " header duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (avi->duration)); + + return TRUE; + + /* ERRORS */ +no_buffer: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("No buffer")); + return FALSE; + } +avih_too_small: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Too small avih (%d available, %d needed)", + GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_avih))); + gst_buffer_unref (buf); + return FALSE; + } +} + +/* + * gst_avi_demux_parse_superindex: + * @avi: caller element (used for debugging/errors). + * @buf: input data to use for parsing. + * @locations: locations in the file (byte-offsets) that contain + * the actual indexes (see get_avi_demux_parse_subindex()). + * The array ends with GST_BUFFER_OFFSET_NONE. + * + * Reads superindex (openDML-2 spec stuff) from the provided data. + * + * Returns: TRUE on success, FALSE otherwise. Indexes should be skipped + * on error, but they are not fatal. + */ +static gboolean +gst_avi_demux_parse_superindex (GstAviDemux * avi, + GstBuffer * buf, guint64 ** _indexes) +{ + guint8 *data; + guint16 bpe = 16; + guint32 num, i; + guint64 *indexes; + guint size; + + *_indexes = NULL; + + size = buf ? GST_BUFFER_SIZE (buf) : 0; + if (size < 24) + goto too_small; + + data = GST_BUFFER_DATA (buf); + + /* check type of index. The opendml2 specs state that + * there should be 4 dwords per array entry. Type can be + * either frame or field (and we don't care). */ + if (GST_READ_UINT16_LE (data) != 4 || + (data[2] & 0xfe) != 0x0 || data[3] != 0x0) { + GST_WARNING_OBJECT (avi, + "Superindex for stream has unexpected " + "size_entry %d (bytes) or flags 0x%02x/0x%02x", + GST_READ_UINT16_LE (data), data[2], data[3]); + bpe = GST_READ_UINT16_LE (data) * 4; + } + num = GST_READ_UINT32_LE (&data[4]); + + GST_DEBUG_OBJECT (avi, "got %d indexes", num); + + /* this can't work out well ... */ + if (num > G_MAXUINT32 >> 1 || bpe < 8) { + goto invalid_params; + } + + indexes = g_new (guint64, num + 1); + for (i = 0; i < num; i++) { + if (size < 24 + bpe * (i + 1)) + break; + indexes[i] = GST_READ_UINT64_LE (&data[24 + bpe * i]); + GST_DEBUG_OBJECT (avi, "index %d at %" G_GUINT64_FORMAT, i, indexes[i]); + } + indexes[i] = GST_BUFFER_OFFSET_NONE; + *_indexes = indexes; + + gst_buffer_unref (buf); + + return TRUE; + + /* ERRORS */ +too_small: + { + GST_ERROR_OBJECT (avi, + "Not enough data to parse superindex (%d available, 24 needed)", size); + if (buf) + gst_buffer_unref (buf); + return FALSE; + } +invalid_params: + { + GST_ERROR_OBJECT (avi, "invalid index parameters (num = %d, bpe = %d)", + num, bpe); + if (buf) + gst_buffer_unref (buf); + return FALSE; + } +} + +/* add an entry to the index of a stream. @num should be an estimate of the + * total amount of index entries for all streams and is used to dynamically + * allocate memory for the index entries. */ +static inline gboolean +gst_avi_demux_add_index (GstAviDemux * avi, GstAviStream * stream, + guint num, GstAviIndexEntry * entry) +{ + /* ensure index memory */ + if (G_UNLIKELY (stream->idx_n >= stream->idx_max)) { + guint idx_max = stream->idx_max; + GstAviIndexEntry *new_idx; + + /* we need to make some more room */ + if (idx_max == 0) { + /* initial size guess, assume each stream has an equal amount of entries, + * overshoot with at least 8K */ + idx_max = (num / avi->num_streams) + (8192 / sizeof (GstAviIndexEntry)); + } else { + idx_max += 8192 / sizeof (GstAviIndexEntry); + GST_DEBUG_OBJECT (avi, "expanded index from %u to %u", + stream->idx_max, idx_max); + } + new_idx = g_try_renew (GstAviIndexEntry, stream->index, idx_max); + /* out of memory, if this fails stream->index is untouched. */ + if (G_UNLIKELY (!new_idx)) + return FALSE; + /* use new index */ + stream->index = new_idx; + stream->idx_max = idx_max; + } + + /* update entry total and stream stats. The entry total can be converted to + * the timestamp of the entry easily. */ + if (stream->strh->type == GST_RIFF_FCC_auds) { + gint blockalign; + + if (stream->is_vbr) { + entry->total = stream->total_blocks; + } else { + entry->total = stream->total_bytes; + } + blockalign = stream->strf.auds->blockalign; + if (blockalign > 0) + stream->total_blocks += DIV_ROUND_UP (entry->size, blockalign); + else + stream->total_blocks++; + } else { + if (stream->is_vbr) { + entry->total = stream->idx_n; + } else { + entry->total = stream->total_bytes; + } + } + stream->total_bytes += entry->size; + if (ENTRY_IS_KEYFRAME (entry)) + stream->n_keyframes++; + + /* and add */ + GST_LOG_OBJECT (avi, + "Adding stream %u, index entry %d, kf %d, size %u " + ", offset %" G_GUINT64_FORMAT ", total %" G_GUINT64_FORMAT, stream->num, + stream->idx_n, ENTRY_IS_KEYFRAME (entry), entry->size, entry->offset, + entry->total); + stream->index[stream->idx_n++] = *entry; + + return TRUE; +} + +/* given @entry_n in @stream, calculate info such as timestamps and + * offsets for the entry. */ +static void +gst_avi_demux_get_buffer_info (GstAviDemux * avi, GstAviStream * stream, + guint entry_n, GstClockTime * timestamp, GstClockTime * ts_end, + guint64 * offset, guint64 * offset_end) +{ + GstAviIndexEntry *entry; + + entry = &stream->index[entry_n]; + + if (stream->is_vbr) { + /* VBR stream next timestamp */ + if (stream->strh->type == GST_RIFF_FCC_auds) { + if (timestamp) + *timestamp = + avi_stream_convert_frames_to_time_unchecked (stream, entry->total); + if (ts_end) + *ts_end = avi_stream_convert_frames_to_time_unchecked (stream, + entry->total + 1); + } else { + if (timestamp) + *timestamp = + avi_stream_convert_frames_to_time_unchecked (stream, entry_n); + if (ts_end) + *ts_end = avi_stream_convert_frames_to_time_unchecked (stream, + entry_n + 1); + } + } else if (stream->strh->type == GST_RIFF_FCC_auds) { + /* constant rate stream */ + if (timestamp) + *timestamp = + avi_stream_convert_bytes_to_time_unchecked (stream, entry->total); + if (ts_end) + *ts_end = avi_stream_convert_bytes_to_time_unchecked (stream, + entry->total + entry->size); + } + if (stream->strh->type == GST_RIFF_FCC_vids) { + /* video offsets are the frame number */ + if (offset) + *offset = entry_n; + if (offset_end) + *offset_end = entry_n + 1; + } else { + /* no offsets for audio */ + if (offset) + *offset = -1; + if (offset_end) + *offset_end = -1; + } +} + +/* collect and debug stats about the indexes for all streams. + * This method is also responsible for filling in the stream duration + * as measured by the amount of index entries. + * + * Returns TRUE if the index is not empty, else FALSE */ +static gboolean +gst_avi_demux_do_index_stats (GstAviDemux * avi) +{ + guint total_idx = 0; + guint i; +#ifndef GST_DISABLE_GST_DEBUG + guint total_max = 0; +#endif + + /* get stream stats now */ + for (i = 0; i < avi->num_streams; i++) { + GstAviStream *stream; + + if (G_UNLIKELY (!(stream = &avi->stream[i]))) + continue; + if (G_UNLIKELY (!stream->strh)) + continue; + if (G_UNLIKELY (!stream->index || stream->idx_n == 0)) + continue; + + /* we interested in the end_ts of the last entry, which is the total + * duration of this stream */ + gst_avi_demux_get_buffer_info (avi, stream, stream->idx_n - 1, + NULL, &stream->idx_duration, NULL, NULL); + + total_idx += stream->idx_n; +#ifndef GST_DISABLE_GST_DEBUG + total_max += stream->idx_max; +#endif + GST_INFO_OBJECT (avi, "Stream %d, dur %" GST_TIME_FORMAT ", %6u entries, " + "%5u keyframes, entry size = %2u, total size = %10u, allocated %10u", + i, GST_TIME_ARGS (stream->idx_duration), stream->idx_n, + stream->n_keyframes, (guint) sizeof (GstAviIndexEntry), + (guint) (stream->idx_n * sizeof (GstAviIndexEntry)), + (guint) (stream->idx_max * sizeof (GstAviIndexEntry))); + } + total_idx *= sizeof (GstAviIndexEntry); +#ifndef GST_DISABLE_GST_DEBUG + total_max *= sizeof (GstAviIndexEntry); +#endif + GST_INFO_OBJECT (avi, "%u bytes for index vs %u ideally, %u wasted", + total_max, total_idx, total_max - total_idx); + + if (total_idx == 0) { + GST_WARNING_OBJECT (avi, "Index is empty !"); + return FALSE; + } + return TRUE; +} + +/* + * gst_avi_demux_parse_subindex: + * @avi: Avi object + * @buf: input data to use for parsing. + * @stream: stream context. + * @entries_list: a list (returned by the function) containing all the + * indexes parsed in this specific subindex. The first + * entry is also a pointer to allocated memory that needs + * to be free´ed. May be NULL if no supported indexes were + * found. + * + * Reads superindex (openDML-2 spec stuff) from the provided data. + * The buffer should contain a GST_RIFF_TAG_ix?? chunk. + * + * Returns: TRUE on success, FALSE otherwise. Errors are fatal, we + * throw an error, caller should bail out asap. + */ +static gboolean +gst_avi_demux_parse_subindex (GstAviDemux * avi, GstAviStream * stream, + GstBuffer * buf) +{ + guint8 *data; + guint16 bpe; + guint32 num, i; + guint64 baseoff; + guint size; + + if (!buf) + return TRUE; + + size = GST_BUFFER_SIZE (buf); + + /* check size */ + if (size < 24) + goto too_small; + + data = GST_BUFFER_DATA (buf); + + /* We don't support index-data yet */ + if (data[3] & 0x80) + goto not_implemented; + + /* check type of index. The opendml2 specs state that + * there should be 4 dwords per array entry. Type can be + * either frame or field (and we don't care). */ + bpe = (data[2] & 0x01) ? 12 : 8; + if (GST_READ_UINT16_LE (data) != bpe / 4 || + (data[2] & 0xfe) != 0x0 || data[3] != 0x1) { + GST_WARNING_OBJECT (avi, + "Superindex for stream %d has unexpected " + "size_entry %d (bytes) or flags 0x%02x/0x%02x", + stream->num, GST_READ_UINT16_LE (data), data[2], data[3]); + bpe = GST_READ_UINT16_LE (data) * 4; + } + num = GST_READ_UINT32_LE (&data[4]); + baseoff = GST_READ_UINT64_LE (&data[12]); + + /* If there's nothing, just return ! */ + if (num == 0) + goto empty_index; + + GST_INFO_OBJECT (avi, "Parsing subindex, nr_entries = %6d", num); + + for (i = 0; i < num; i++) { + GstAviIndexEntry entry; + + if (size < 24 + bpe * (i + 1)) + break; + + /* fill in offset and size. offset contains the keyframe flag in the + * upper bit*/ + entry.offset = baseoff + GST_READ_UINT32_LE (&data[24 + bpe * i]); + entry.size = GST_READ_UINT32_LE (&data[24 + bpe * i + 4]); + /* handle flags */ + if (stream->strh->type == GST_RIFF_FCC_auds) { + /* all audio frames are keyframes */ + ENTRY_SET_KEYFRAME (&entry); + } else { + /* else read flags */ + entry.flags = (entry.size & 0x80000000) ? 0 : GST_AVI_KEYFRAME; + } + entry.size &= ~0x80000000; + + /* and add */ + if (G_UNLIKELY (!gst_avi_demux_add_index (avi, stream, num, &entry))) + goto out_of_mem; + } + gst_buffer_unref (buf); + + return TRUE; + + /* ERRORS */ +too_small: + { + GST_ERROR_OBJECT (avi, + "Not enough data to parse subindex (%d available, 24 needed)", size); + gst_buffer_unref (buf); + return TRUE; /* continue */ + } +not_implemented: + { + GST_ELEMENT_ERROR (avi, STREAM, NOT_IMPLEMENTED, (NULL), + ("Subindex-is-data is not implemented")); + gst_buffer_unref (buf); + return FALSE; + } +empty_index: + { + GST_DEBUG_OBJECT (avi, "the index is empty"); + gst_buffer_unref (buf); + return TRUE; + } +out_of_mem: + { + GST_ELEMENT_ERROR (avi, RESOURCE, NO_SPACE_LEFT, (NULL), + ("Cannot allocate memory for %u*%u=%u bytes", + (guint) sizeof (GstAviIndexEntry), num, + (guint) sizeof (GstAviIndexEntry) * num)); + gst_buffer_unref (buf); + return FALSE; + } +} + +/* + * Create and push a flushing seek event upstream + */ +static gboolean +perform_seek_to_offset (GstAviDemux * demux, guint64 offset) +{ + GstEvent *event; + gboolean res = 0; + + GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset); + + event = + gst_event_new_seek (1.0, GST_FORMAT_BYTES, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, + GST_SEEK_TYPE_NONE, -1); + + res = gst_pad_push_event (demux->sinkpad, event); + + if (res) + demux->offset = offset; + return res; +} + +/* + * Read AVI index when streaming + */ +static gboolean +gst_avi_demux_read_subindexes_push (GstAviDemux * avi) +{ + guint32 tag = 0, size; + GstBuffer *buf = NULL; + guint odml_stream; + + GST_DEBUG_OBJECT (avi, "read subindexes for %d streams", avi->num_streams); + + if (avi->odml_subidxs[avi->odml_subidx] != avi->offset) + return FALSE; + + if (!gst_avi_demux_peek_chunk (avi, &tag, &size)) + return TRUE; + + /* this is the ODML chunk we expect */ + odml_stream = avi->odml_stream; + + if ((tag != GST_MAKE_FOURCC ('i', 'x', '0' + odml_stream / 10, + '0' + odml_stream % 10)) && + (tag != GST_MAKE_FOURCC ('0' + odml_stream / 10, + '0' + odml_stream % 10, 'i', 'x'))) { + GST_WARNING_OBJECT (avi, "Not an ix## chunk (%" GST_FOURCC_FORMAT ")", + GST_FOURCC_ARGS (tag)); + return FALSE; + } + + avi->offset += 8 + GST_ROUND_UP_2 (size); + /* flush chunk header so we get just the 'size' payload data */ + gst_adapter_flush (avi->adapter, 8); + buf = gst_adapter_take_buffer (avi->adapter, size); + + if (!gst_avi_demux_parse_subindex (avi, &avi->stream[odml_stream], buf)) + return FALSE; + + /* we parsed the index, go to next subindex */ + avi->odml_subidx++; + + if (avi->odml_subidxs[avi->odml_subidx] == GST_BUFFER_OFFSET_NONE) { + /* we reached the end of the indexes for this stream, move to the next + * stream to handle the first index */ + avi->odml_stream++; + avi->odml_subidx = 0; + + if (avi->odml_stream < avi->num_streams) { + /* there are more indexes */ + avi->odml_subidxs = avi->stream[avi->odml_stream].indexes; + } else { + /* we're done, get stream stats now */ + avi->have_index = gst_avi_demux_do_index_stats (avi); + + return TRUE; + } + } + + /* seek to next index */ + return perform_seek_to_offset (avi, avi->odml_subidxs[avi->odml_subidx]); +} + +/* + * Read AVI index + */ +static void +gst_avi_demux_read_subindexes_pull (GstAviDemux * avi) +{ + guint32 tag; + GstBuffer *buf; + gint i, n; + + GST_DEBUG_OBJECT (avi, "read subindexes for %d streams", avi->num_streams); + + for (n = 0; n < avi->num_streams; n++) { + GstAviStream *stream = &avi->stream[n]; + + if (stream->indexes == NULL) + continue; + + for (i = 0; stream->indexes[i] != GST_BUFFER_OFFSET_NONE; i++) { + if (gst_riff_read_chunk (GST_ELEMENT_CAST (avi), avi->sinkpad, + &stream->indexes[i], &tag, &buf) != GST_FLOW_OK) + continue; + else if ((tag != GST_MAKE_FOURCC ('i', 'x', '0' + stream->num / 10, + '0' + stream->num % 10)) && + (tag != GST_MAKE_FOURCC ('0' + stream->num / 10, + '0' + stream->num % 10, 'i', 'x'))) { + /* Some ODML files (created by god knows what muxer) have a ##ix format + * instead of the 'official' ix##. They are still valid though. */ + GST_WARNING_OBJECT (avi, "Not an ix## chunk (%" GST_FOURCC_FORMAT ")", + GST_FOURCC_ARGS (tag)); + gst_buffer_unref (buf); + continue; + } + + if (!gst_avi_demux_parse_subindex (avi, stream, buf)) + continue; + } + + g_free (stream->indexes); + stream->indexes = NULL; + } + /* get stream stats now */ + avi->have_index = gst_avi_demux_do_index_stats (avi); +} + +/* + * gst_avi_demux_riff_parse_vprp: + * @element: caller element (used for debugging/error). + * @buf: input data to be used for parsing, stripped from header. + * @vprp: a pointer (returned by this function) to a filled-in vprp + * structure. Caller should free it. + * + * Parses a video stream´s vprp. This function takes ownership of @buf. + * + * Returns: TRUE if parsing succeeded, otherwise FALSE. The stream + * should be skipped on error, but it is not fatal. + */ +static gboolean +gst_avi_demux_riff_parse_vprp (GstElement * element, + GstBuffer * buf, gst_riff_vprp ** _vprp) +{ + gst_riff_vprp *vprp; + gint k; + + g_return_val_if_fail (buf != NULL, FALSE); + g_return_val_if_fail (_vprp != NULL, FALSE); + + if (GST_BUFFER_SIZE (buf) < G_STRUCT_OFFSET (gst_riff_vprp, field_info)) + goto too_small; + + vprp = g_memdup (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + +#if (G_BYTE_ORDER == G_BIG_ENDIAN) + vprp->format_token = GUINT32_FROM_LE (vprp->format_token); + vprp->standard = GUINT32_FROM_LE (vprp->standard); + vprp->vert_rate = GUINT32_FROM_LE (vprp->vert_rate); + vprp->hor_t_total = GUINT32_FROM_LE (vprp->hor_t_total); + vprp->vert_lines = GUINT32_FROM_LE (vprp->vert_lines); + vprp->aspect = GUINT32_FROM_LE (vprp->aspect); + vprp->width = GUINT32_FROM_LE (vprp->width); + vprp->height = GUINT32_FROM_LE (vprp->height); + vprp->fields = GUINT32_FROM_LE (vprp->fields); +#endif + + /* size checking */ + /* calculate fields based on size */ + k = (GST_BUFFER_SIZE (buf) - G_STRUCT_OFFSET (gst_riff_vprp, field_info)) / + vprp->fields; + if (vprp->fields > k) { + GST_WARNING_OBJECT (element, + "vprp header indicated %d fields, only %d available", vprp->fields, k); + vprp->fields = k; + } + if (vprp->fields > GST_RIFF_VPRP_VIDEO_FIELDS) { + GST_WARNING_OBJECT (element, + "vprp header indicated %d fields, at most %d supported", vprp->fields, + GST_RIFF_VPRP_VIDEO_FIELDS); + vprp->fields = GST_RIFF_VPRP_VIDEO_FIELDS; + } +#if (G_BYTE_ORDER == G_BIG_ENDIAN) + for (k = 0; k < vprp->fields; k++) { + gst_riff_vprp_video_field_desc *fd; + + fd = &vprp->field_info[k]; + fd->compressed_bm_height = GUINT32_FROM_LE (fd->compressed_bm_height); + fd->compressed_bm_width = GUINT32_FROM_LE (fd->compressed_bm_width); + fd->valid_bm_height = GUINT32_FROM_LE (fd->valid_bm_height); + fd->valid_bm_width = GUINT16_FROM_LE (fd->valid_bm_width); + fd->valid_bm_x_offset = GUINT16_FROM_LE (fd->valid_bm_x_offset); + fd->valid_bm_y_offset = GUINT32_FROM_LE (fd->valid_bm_y_offset); + fd->video_x_t_offset = GUINT32_FROM_LE (fd->video_x_t_offset); + fd->video_y_start = GUINT32_FROM_LE (fd->video_y_start); + } +#endif + + /* debug */ + GST_INFO_OBJECT (element, "vprp tag found in context vids:"); + GST_INFO_OBJECT (element, " format_token %d", vprp->format_token); + GST_INFO_OBJECT (element, " standard %d", vprp->standard); + GST_INFO_OBJECT (element, " vert_rate %d", vprp->vert_rate); + GST_INFO_OBJECT (element, " hor_t_total %d", vprp->hor_t_total); + GST_INFO_OBJECT (element, " vert_lines %d", vprp->vert_lines); + GST_INFO_OBJECT (element, " aspect %d:%d", vprp->aspect >> 16, + vprp->aspect & 0xffff); + GST_INFO_OBJECT (element, " width %d", vprp->width); + GST_INFO_OBJECT (element, " height %d", vprp->height); + GST_INFO_OBJECT (element, " fields %d", vprp->fields); + for (k = 0; k < vprp->fields; k++) { + gst_riff_vprp_video_field_desc *fd; + + fd = &(vprp->field_info[k]); + GST_INFO_OBJECT (element, " field %u description:", k); + GST_INFO_OBJECT (element, " compressed_bm_height %d", + fd->compressed_bm_height); + GST_INFO_OBJECT (element, " compressed_bm_width %d", + fd->compressed_bm_width); + GST_INFO_OBJECT (element, " valid_bm_height %d", + fd->valid_bm_height); + GST_INFO_OBJECT (element, " valid_bm_width %d", fd->valid_bm_width); + GST_INFO_OBJECT (element, " valid_bm_x_offset %d", + fd->valid_bm_x_offset); + GST_INFO_OBJECT (element, " valid_bm_y_offset %d", + fd->valid_bm_y_offset); + GST_INFO_OBJECT (element, " video_x_t_offset %d", + fd->video_x_t_offset); + GST_INFO_OBJECT (element, " video_y_start %d", fd->video_y_start); + } + + gst_buffer_unref (buf); + + *_vprp = vprp; + + return TRUE; + + /* ERRORS */ +too_small: + { + GST_ERROR_OBJECT (element, + "Too small vprp (%d available, at least %d needed)", + GST_BUFFER_SIZE (buf), + (int) G_STRUCT_OFFSET (gst_riff_vprp, field_info)); + gst_buffer_unref (buf); + return FALSE; + } +} + +static void +gst_avi_demux_expose_streams (GstAviDemux * avi, gboolean force) +{ + guint i; + + GST_DEBUG_OBJECT (avi, "force : %d", force); + + for (i = 0; i < avi->num_streams; i++) { + GstAviStream *stream = &avi->stream[i]; + + if (force || stream->idx_n != 0) { + GST_LOG_OBJECT (avi, "Added pad %s with caps %" GST_PTR_FORMAT, + GST_PAD_NAME (stream->pad), GST_PAD_CAPS (stream->pad)); + gst_element_add_pad ((GstElement *) avi, stream->pad); + + if (avi->element_index) + gst_index_get_writer_id (avi->element_index, + GST_OBJECT_CAST (stream->pad), &stream->index_id); + + stream->exposed = TRUE; + if (avi->main_stream == -1) + avi->main_stream = i; + } else { + GST_WARNING_OBJECT (avi, "Stream #%d doesn't have any entry, removing it", + i); + gst_avi_demux_reset_stream (avi, stream); + } + } +} + + +#ifdef DIVX_DRM +typedef struct _gst_riff_strd { + guint32 version; + guint32 drm_size; +} gst_riff_strd; + + +static gboolean +gst_riff_parse_strd (GstAviDemux * avi, + GstBuffer * buf) +{ + g_return_val_if_fail (buf != NULL, FALSE); + + if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_strd)) + goto too_small; + + GST_DEBUG_OBJECT (avi, " version %d", ((gst_riff_strd*)GST_BUFFER_DATA(buf))->version); + GST_DEBUG_OBJECT (avi, " drm_size %d", ((gst_riff_strd*)GST_BUFFER_DATA(buf))->drm_size); + + return gst_avi_demux_init_divx_drm (avi, GST_BUFFER_DATA(buf)+sizeof(gst_riff_strd)); + + /* ERRORS */ +too_small: + { + GST_ERROR_OBJECT (avi, + "Too small strh (%d available, %d needed)", + GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_strd)); + gst_buffer_unref (buf); + return FALSE; + } +} +#endif // DIVX_DRM + + +/* buf contains LIST chunk data, and will be padded to even size, + * since some buggy files do not account for the padding of chunks + * within a LIST in the size of the LIST */ +static inline void +gst_avi_demux_roundup_list (GstAviDemux * avi, GstBuffer ** buf) +{ + gint size = GST_BUFFER_SIZE (*buf); + + if (G_UNLIKELY (size & 1)) { + GstBuffer *obuf; + + GST_DEBUG_OBJECT (avi, "rounding up dubious list size %d", size); + obuf = gst_buffer_new_and_alloc (size + 1); + memcpy (GST_BUFFER_DATA (obuf), GST_BUFFER_DATA (*buf), size); + /* assume 0 padding, at least makes outcome deterministic */ + (GST_BUFFER_DATA (obuf))[size] = 0; + gst_buffer_replace (buf, obuf); + } +} + +/* + * gst_avi_demux_parse_stream: + * @avi: calling element (used for debugging/errors). + * @buf: input buffer used to parse the stream. + * + * Parses all subchunks in a strl chunk (which defines a single + * stream). Discards the buffer after use. This function will + * increment the stream counter internally. + * + * Returns: whether the stream was identified successfully. + * Errors are not fatal. It does indicate the stream + * was skipped. + */ +static gboolean +gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf) +{ + GstAviStream *stream; + GstElementClass *klass; + GstPadTemplate *templ; + GstBuffer *sub = NULL; + guint offset = 4; + guint32 tag = 0; + gchar *codec_name = NULL, *padname = NULL; + const gchar *tag_name; + GstCaps *caps = NULL; + GstPad *pad; + GstElement *element; + gboolean got_strh = FALSE, got_strf = FALSE, got_vprp = FALSE; + gst_riff_vprp *vprp = NULL; + + element = GST_ELEMENT_CAST (avi); + + GST_DEBUG_OBJECT (avi, "Parsing stream"); + + gst_avi_demux_roundup_list (avi, &buf); + + if (avi->num_streams >= GST_AVI_DEMUX_MAX_STREAMS) { + GST_WARNING_OBJECT (avi, + "maximum no of streams (%d) exceeded, ignoring stream", + GST_AVI_DEMUX_MAX_STREAMS); + gst_buffer_unref (buf); + /* not a fatal error, let's say */ + return TRUE; + } + + stream = &avi->stream[avi->num_streams]; + + /* initial settings */ + stream->idx_duration = GST_CLOCK_TIME_NONE; + stream->hdr_duration = GST_CLOCK_TIME_NONE; + stream->duration = GST_CLOCK_TIME_NONE; + + while (gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) { + /* sub can be NULL if the chunk is empty */ + if (sub == NULL) { + GST_DEBUG_OBJECT (avi, "ignoring empty chunk %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (tag)); + continue; + } + switch (tag) { + case GST_RIFF_TAG_strh: + { + gst_riff_strh *strh; + + if (got_strh) { + GST_WARNING_OBJECT (avi, "Ignoring additional strh chunk"); + break; + } + if (!gst_riff_parse_strh (element, sub, &stream->strh)) { + /* ownership given away */ + sub = NULL; + GST_WARNING_OBJECT (avi, "Failed to parse strh chunk"); + goto fail; + } + sub = NULL; + strh = stream->strh; + /* sanity check; stream header frame rate matches global header + * frame duration */ + if (stream->strh->type == GST_RIFF_FCC_vids) { + GstClockTime s_dur; + GstClockTime h_dur = avi->avih->us_frame * GST_USECOND; + + s_dur = gst_util_uint64_scale (GST_SECOND, strh->scale, strh->rate); + GST_DEBUG_OBJECT (avi, "verifying stream framerate %d/%d, " + "frame duration = %d ms", strh->rate, strh->scale, + (gint) (s_dur / GST_MSECOND)); + if (h_dur > (10 * GST_MSECOND) && (s_dur > 10 * h_dur)) { + strh->rate = GST_SECOND / GST_USECOND; + strh->scale = h_dur / GST_USECOND; + GST_DEBUG_OBJECT (avi, "correcting stream framerate to %d/%d", + strh->rate, strh->scale); + } + } + /* determine duration as indicated by header */ + stream->hdr_duration = gst_util_uint64_scale ((guint64) strh->length * + strh->scale, GST_SECOND, (guint64) strh->rate); + GST_INFO ("Stream duration according to header: %" GST_TIME_FORMAT, + GST_TIME_ARGS (stream->hdr_duration)); + if (stream->hdr_duration == 0) + stream->hdr_duration = GST_CLOCK_TIME_NONE; + + got_strh = TRUE; + break; + } + case GST_RIFF_TAG_strf: + { + gboolean res = FALSE; + + if (got_strf) { + GST_WARNING_OBJECT (avi, "Ignoring additional strf chunk"); + break; + } + if (!got_strh) { + GST_ERROR_OBJECT (avi, "Found strf chunk before strh chunk"); + goto fail; + } + switch (stream->strh->type) { + case GST_RIFF_FCC_vids: + stream->is_vbr = TRUE; + res = gst_riff_parse_strf_vids (element, sub, + &stream->strf.vids, &stream->extradata); + sub = NULL; + GST_DEBUG_OBJECT (element, "marking video as VBR, res %d", res); + break; + case GST_RIFF_FCC_auds: + res = + gst_riff_parse_strf_auds (element, sub, &stream->strf.auds, + &stream->extradata); + sub = NULL; + if (!res) + break; + stream->is_vbr = (stream->strh->samplesize == 0) + && stream->strh->scale > 1 + && stream->strf.auds->blockalign != 1; + GST_DEBUG_OBJECT (element, "marking audio as VBR:%d, res %d", + stream->is_vbr, res); + /* we need these or we have no way to come up with timestamps */ + if ((!stream->is_vbr && !stream->strf.auds->av_bps) || + (stream->is_vbr && (!stream->strh->scale || + !stream->strh->rate))) { + GST_WARNING_OBJECT (element, + "invalid audio header, ignoring stream"); + goto fail; + } + /* some more sanity checks */ + if (stream->is_vbr) { + if (stream->strf.auds->blockalign <= 4) { + /* that would mean (too) many frames per chunk, + * so not likely set as expected */ + GST_DEBUG_OBJECT (element, + "suspicious blockalign %d for VBR audio; " + "overriding to 1 frame per chunk", + stream->strf.auds->blockalign); + /* this should top any likely value */ + stream->strf.auds->blockalign = (1 << 12); + } + } + break; + case GST_RIFF_FCC_iavs: + stream->is_vbr = TRUE; + res = gst_riff_parse_strf_iavs (element, sub, + &stream->strf.iavs, &stream->extradata); + sub = NULL; + GST_DEBUG_OBJECT (element, "marking iavs as VBR, res %d", res); + break; + case GST_RIFF_FCC_txts: + /* nothing to parse here */ + stream->is_vbr = (stream->strh->samplesize == 0) + && (stream->strh->scale > 1); + res = TRUE; + break; + default: + GST_ERROR_OBJECT (avi, + "Don´t know how to handle stream type %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (stream->strh->type)); + break; + } + if (sub) { + gst_buffer_unref (sub); + sub = NULL; + } + if (!res) + goto fail; + got_strf = TRUE; + break; + } + case GST_RIFF_TAG_vprp: + { + if (got_vprp) { + GST_WARNING_OBJECT (avi, "Ignoring additional vprp chunk"); + break; + } + if (!got_strh) { + GST_ERROR_OBJECT (avi, "Found vprp chunk before strh chunk"); + goto fail; + } + if (!got_strf) { + GST_ERROR_OBJECT (avi, "Found vprp chunk before strf chunk"); + goto fail; + } + + if (!gst_avi_demux_riff_parse_vprp (element, sub, &vprp)) { + GST_WARNING_OBJECT (avi, "Failed to parse vprp chunk"); + /* not considered fatal */ + g_free (vprp); + vprp = NULL; + } else + got_vprp = TRUE; + sub = NULL; + break; + } + case GST_RIFF_TAG_strd: +#ifdef DIVX_DRM + GST_DEBUG_OBJECT (avi, "******************* strd tag found:"); + if (gst_riff_parse_strd (avi, sub) == FALSE) { + GST_ELEMENT_ERROR(avi, STREAM, DECRYPT, + ("DivX initialization failed"), + ("gst_avi_demux_init_divx_drm() failed") ); + return FALSE; + } +#endif + + if (stream->initdata) + gst_buffer_unref (stream->initdata); + stream->initdata = sub; + sub = NULL; + break; + case GST_RIFF_TAG_strn: + g_free (stream->name); + if (sub != NULL) { + stream->name = + g_strndup ((gchar *) GST_BUFFER_DATA (sub), + (gsize) GST_BUFFER_SIZE (sub)); + gst_buffer_unref (sub); + sub = NULL; + } else { + stream->name = g_strdup (""); + } + GST_DEBUG_OBJECT (avi, "stream name: %s", stream->name); + break; + case GST_RIFF_IDIT: + gst_avi_demux_parse_idit (avi, sub); + break; + default: + if (tag == GST_MAKE_FOURCC ('i', 'n', 'd', 'x') || + tag == GST_MAKE_FOURCC ('i', 'x', '0' + avi->num_streams / 10, + '0' + avi->num_streams % 10)) { + g_free (stream->indexes); + gst_avi_demux_parse_superindex (avi, sub, &stream->indexes); + stream->superindex = TRUE; + sub = NULL; + break; + } + GST_WARNING_OBJECT (avi, + "Unknown stream header tag %" GST_FOURCC_FORMAT ", ignoring", + GST_FOURCC_ARGS (tag)); + /* fall-through */ + case GST_RIFF_TAG_JUNQ: + case GST_RIFF_TAG_JUNK: + break; + } + if (sub != NULL) { + gst_buffer_unref (sub); + sub = NULL; + } + } + + if (!got_strh) { + GST_WARNING_OBJECT (avi, "Failed to find strh chunk"); + goto fail; + } + + if (!got_strf) { + GST_WARNING_OBJECT (avi, "Failed to find strf chunk"); + goto fail; + } + + /* get class to figure out the template */ + klass = GST_ELEMENT_GET_CLASS (avi); + + /* we now have all info, let´s set up a pad and a caps and be done */ + /* create stream name + pad */ + switch (stream->strh->type) { + case GST_RIFF_FCC_vids:{ + guint32 fourcc; + + fourcc = (stream->strf.vids->compression) ? + stream->strf.vids->compression : stream->strh->fcc_handler; + padname = g_strdup_printf ("video_%02d", avi->num_v_streams); + templ = gst_element_class_get_pad_template (klass, "video_%02d"); + caps = gst_riff_create_video_caps (fourcc, stream->strh, + stream->strf.vids, stream->extradata, stream->initdata, &codec_name); + if (!caps) { + caps = gst_caps_new_simple ("video/x-avi-unknown", "fourcc", + GST_TYPE_FOURCC, fourcc, NULL); + } else if (got_vprp && vprp) { + guint32 aspect_n, aspect_d; + gint n, d; + + aspect_n = vprp->aspect >> 16; + aspect_d = vprp->aspect & 0xffff; + /* calculate the pixel aspect ratio using w/h and aspect ratio */ + n = aspect_n * stream->strf.vids->height; + d = aspect_d * stream->strf.vids->width; + if (n && d) + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + n, d, NULL); + /* very local, not needed elsewhere */ + g_free (vprp); + vprp = NULL; + } + tag_name = GST_TAG_VIDEO_CODEC; + avi->num_v_streams++; + break; + } + case GST_RIFF_FCC_auds:{ + padname = g_strdup_printf ("audio_%02d", avi->num_a_streams); + templ = gst_element_class_get_pad_template (klass, "audio_%02d"); + caps = gst_riff_create_audio_caps (stream->strf.auds->format, + stream->strh, stream->strf.auds, stream->extradata, + stream->initdata, &codec_name); + if (!caps) { + caps = gst_caps_new_simple ("audio/x-avi-unknown", "codec_id", + G_TYPE_INT, stream->strf.auds->format, NULL); + } + tag_name = GST_TAG_AUDIO_CODEC; + avi->num_a_streams++; + break; + } + case GST_RIFF_FCC_iavs:{ + guint32 fourcc = stream->strh->fcc_handler; + + padname = g_strdup_printf ("video_%02d", avi->num_v_streams); + templ = gst_element_class_get_pad_template (klass, "video_%02d"); + caps = gst_riff_create_iavs_caps (fourcc, stream->strh, + stream->strf.iavs, stream->extradata, stream->initdata, &codec_name); + if (!caps) { + caps = gst_caps_new_simple ("video/x-avi-unknown", "fourcc", + GST_TYPE_FOURCC, fourcc, NULL); + } + tag_name = GST_TAG_VIDEO_CODEC; + avi->num_v_streams++; + break; + } + case GST_RIFF_FCC_txts:{ + padname = g_strdup_printf ("subtitle_%02d", avi->num_t_streams); + templ = gst_element_class_get_pad_template (klass, "subtitle_%02d"); + caps = gst_caps_new_simple ("application/x-subtitle-avi", NULL); + tag_name = NULL; + avi->num_t_streams++; + break; + } + default: + g_return_val_if_reached (FALSE); + } + + /* no caps means no stream */ + if (!caps) { + GST_ERROR_OBJECT (element, "Did not find caps for stream %s", padname); + goto fail; + } + + GST_DEBUG_OBJECT (element, "codec-name=%s", + (codec_name ? codec_name : "NULL")); + GST_DEBUG_OBJECT (element, "caps=%" GST_PTR_FORMAT, caps); + + /* set proper settings and add it */ + if (stream->pad) + gst_object_unref (stream->pad); + pad = stream->pad = gst_pad_new_from_template (templ, padname); + g_free (padname); + + gst_pad_use_fixed_caps (pad); +#if 0 + gst_pad_set_formats_function (pad, + GST_DEBUG_FUNCPTR (gst_avi_demux_get_src_formats)); + gst_pad_set_event_mask_function (pad, + GST_DEBUG_FUNCPTR (gst_avi_demux_get_event_mask)); +#endif + gst_pad_set_event_function (pad, + GST_DEBUG_FUNCPTR (gst_avi_demux_handle_src_event)); + gst_pad_set_query_type_function (pad, + GST_DEBUG_FUNCPTR (gst_avi_demux_get_src_query_types)); + gst_pad_set_query_function (pad, + GST_DEBUG_FUNCPTR (gst_avi_demux_handle_src_query)); +#if 0 + gst_pad_set_convert_function (pad, + GST_DEBUG_FUNCPTR (gst_avi_demux_src_convert)); +#endif + + stream->num = avi->num_streams; + + stream->start_entry = 0; + stream->step_entry = 0; + stream->stop_entry = 0; + + stream->current_entry = -1; + stream->current_total = 0; + + stream->last_flow = GST_FLOW_OK; + stream->discont = TRUE; + + stream->total_bytes = 0; + stream->total_blocks = 0; + stream->n_keyframes = 0; + + stream->idx_n = 0; + stream->idx_max = 0; + + gst_pad_set_element_private (pad, stream); + avi->num_streams++; + +#ifdef AVIDEMUX_MODIFICATION + stream->trickplay_info = g_new0 (TrickPlayInfo, 1); + stream->trickplay_info->prev_kidx = 0; + stream->trickplay_info->next_kidx = 0; + stream->trickplay_info->kidxs_dur_diff = 0; +#endif + gst_pad_set_caps (pad, caps); + gst_pad_set_active (pad, TRUE); + gst_caps_unref (caps); + + /* make tags */ + if (codec_name) { + if (!stream->taglist) + stream->taglist = gst_tag_list_new (); + + avi->got_tags = TRUE; + + gst_tag_list_add (stream->taglist, GST_TAG_MERGE_APPEND, tag_name, + codec_name, NULL); + g_free (codec_name); + } + + gst_buffer_unref (buf); + + return TRUE; + + /* ERRORS */ +fail: + { + /* unref any mem that may be in use */ + if (buf) + gst_buffer_unref (buf); + if (sub) + gst_buffer_unref (sub); + g_free (vprp); + g_free (codec_name); + gst_avi_demux_reset_stream (avi, stream); + avi->num_streams++; + return FALSE; + } +} + +/* + * gst_avi_demux_parse_odml: + * @avi: calling element (used for debug/error). + * @buf: input buffer to be used for parsing. + * + * Read an openDML-2.0 extension header. Fills in the frame number + * in the avi demuxer object when reading succeeds. + */ +static void +gst_avi_demux_parse_odml (GstAviDemux * avi, GstBuffer * buf) +{ + guint32 tag = 0; + guint offset = 4; + GstBuffer *sub = NULL; + + while (gst_riff_parse_chunk (GST_ELEMENT_CAST (avi), buf, &offset, &tag, + &sub)) { + switch (tag) { + case GST_RIFF_TAG_dmlh:{ + gst_riff_dmlh dmlh, *_dmlh; + guint size; + + /* sub == NULL is possible and means an empty buffer */ + size = sub ? GST_BUFFER_SIZE (sub) : 0; + + /* check size */ + if (size < sizeof (gst_riff_dmlh)) { + GST_ERROR_OBJECT (avi, + "DMLH entry is too small (%d bytes, %d needed)", + size, (int) sizeof (gst_riff_dmlh)); + goto next; + } + _dmlh = (gst_riff_dmlh *) GST_BUFFER_DATA (sub); + dmlh.totalframes = GST_READ_UINT32_LE (&_dmlh->totalframes); + + GST_INFO_OBJECT (avi, "dmlh tag found: totalframes: %u", + dmlh.totalframes); + + avi->avih->tot_frames = dmlh.totalframes; + goto next; + } + + default: + GST_WARNING_OBJECT (avi, + "Unknown tag %" GST_FOURCC_FORMAT " in ODML header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ + case GST_RIFF_TAG_JUNQ: + case GST_RIFF_TAG_JUNK: + next: + /* skip and move to next chunk */ + if (sub) { + gst_buffer_unref (sub); + sub = NULL; + } + break; + } + } + if (buf) + gst_buffer_unref (buf); +} + +/* Index helper */ +static guint +gst_avi_demux_index_last (GstAviDemux * avi, GstAviStream * stream) +{ + return stream->idx_n; +} + +/* find a previous entry in the index with the given flags */ +static guint +gst_avi_demux_index_prev (GstAviDemux * avi, GstAviStream * stream, + guint last, gboolean keyframe) +{ + GstAviIndexEntry *entry; + guint i; + + for (i = last; i > 0; i--) { + entry = &stream->index[i - 1]; + if (!keyframe || ENTRY_IS_KEYFRAME (entry)) { + return i - 1; + } + } + return 0; +} + +static guint +gst_avi_demux_index_next (GstAviDemux * avi, GstAviStream * stream, + guint last, gboolean keyframe) +{ + GstAviIndexEntry *entry; + gint i; + + for (i = last + 1; i < stream->idx_n; i++) { + entry = &stream->index[i]; + if (!keyframe || ENTRY_IS_KEYFRAME (entry)) { + return i; + } + } + return stream->idx_n - 1; +} + +static guint +gst_avi_demux_index_entry_search (GstAviIndexEntry * entry, guint64 * total) +{ + if (entry->total < *total) + return -1; + else if (entry->total > *total) + return 1; + return 0; +} + +/* + * gst_avi_demux_index_for_time: + * @avi: Avi object + * @stream: the stream + * @time: a time position + * + * Finds the index entry which time is less or equal than the requested time. + * Try to avoid binary search when we can convert the time to an index + * position directly (for example for video frames with a fixed duration). + * + * Returns: the found position in the index. + */ +static guint +gst_avi_demux_index_for_time (GstAviDemux * avi, + GstAviStream * stream, guint64 time) +{ + guint index = -1; + guint64 total = 0; + + GST_LOG_OBJECT (avi, "search time:%" GST_TIME_FORMAT, GST_TIME_ARGS (time)); + + /* easy (and common) cases */ + if (time == 0 || stream->idx_n == 0) + return 0; + if (time >= stream->idx_duration) + return stream->idx_n - 1; + + /* figure out where we need to go. For that we convert the time to an + * index entry or we convert it to a total and then do a binary search. */ + if (stream->is_vbr) { + /* VBR stream next timestamp */ + if (stream->strh->type == GST_RIFF_FCC_auds) { + total = avi_stream_convert_time_to_frames_unchecked (stream, time); + } else { + index = avi_stream_convert_time_to_frames_unchecked (stream, time); + } + } else { + /* constant rate stream */ + total = avi_stream_convert_time_to_bytes_unchecked (stream, time); + } + + if (index == -1) { + GstAviIndexEntry *entry; + + /* no index, find index with binary search on total */ + GST_LOG_OBJECT (avi, "binary search for entry with total %" + G_GUINT64_FORMAT, total); + + entry = gst_util_array_binary_search (stream->index, + stream->idx_n, sizeof (GstAviIndexEntry), + (GCompareDataFunc) gst_avi_demux_index_entry_search, + GST_SEARCH_MODE_BEFORE, &total, NULL); + + if (entry == NULL) { + GST_LOG_OBJECT (avi, "not found, assume index 0"); + index = 0; + } else { + index = entry - stream->index; + GST_LOG_OBJECT (avi, "found at %u", index); + } + } else { + GST_LOG_OBJECT (avi, "converted time to index %u", index); + } + + return index; +} + +static inline GstAviStream * +gst_avi_demux_stream_for_id (GstAviDemux * avi, guint32 id) +{ + guint stream_nr; + GstAviStream *stream; + + /* get the stream for this entry */ + stream_nr = CHUNKID_TO_STREAMNR (id); + if (G_UNLIKELY (stream_nr >= avi->num_streams)) { + GST_WARNING_OBJECT (avi, "invalid stream nr %d", stream_nr); + return NULL; + } + stream = &avi->stream[stream_nr]; + if (G_UNLIKELY (!stream->strh)) { + GST_WARNING_OBJECT (avi, "Unhandled stream %d, skipping", stream_nr); + return NULL; + } + return stream; +} + +/* + * gst_avi_demux_parse_index: + * @avi: calling element (used for debugging/errors). + * @buf: buffer containing the full index. + * + * Read index entries from the provided buffer. + * The buffer should contain a GST_RIFF_TAG_idx1 chunk. + */ +static gboolean +gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf) +{ + guint8 *data; + guint size; + guint i, num, n; + gst_riff_index_entry *index; + GstClockTime stamp; + GstAviStream *stream; + GstAviIndexEntry entry = {0}; + guint32 id; + + if (!buf) + return FALSE; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + stamp = gst_util_get_timestamp (); + + /* see how many items in the index */ + num = size / sizeof (gst_riff_index_entry); + if (num == 0) + goto empty_list; + + GST_INFO_OBJECT (avi, "Parsing index, nr_entries = %6d", num); + + index = (gst_riff_index_entry *) data; + + /* figure out if the index is 0 based or relative to the MOVI start */ + entry.offset = GST_READ_UINT32_LE (&index[0].offset); + if (entry.offset < avi->offset) { + avi->index_offset = avi->offset + 8; + GST_DEBUG ("index_offset = %" G_GUINT64_FORMAT, avi->index_offset); + } else { + avi->index_offset = 0; + GST_DEBUG ("index is 0 based"); + } + + for (i = 0, n = 0; i < num; i++) { + id = GST_READ_UINT32_LE (&index[i].id); + entry.offset = GST_READ_UINT32_LE (&index[i].offset); + + /* some sanity checks */ + if (G_UNLIKELY (id == GST_RIFF_rec || id == 0 || + (entry.offset == 0 && n > 0))) + continue; + +#ifdef DIVX_DRM /* need to check using same define */ + if ( id == GST_MAKE_FOURCC('0','0','d','d') ) + { + GST_DEBUG("Skipping Encrypt data chunk"); + continue; + } +#endif + + /* get the stream for this entry */ + stream = gst_avi_demux_stream_for_id (avi, id); + if (G_UNLIKELY (!stream)) + continue; + + /* handle offset and size */ + entry.offset += avi->index_offset + 8; + entry.size = GST_READ_UINT32_LE (&index[i].size); + + /* handle flags */ + if (stream->strh->type == GST_RIFF_FCC_auds) { + /* all audio frames are keyframes */ + ENTRY_SET_KEYFRAME (&entry); + } else { + guint32 flags; + /* else read flags */ + flags = GST_READ_UINT32_LE (&index[i].flags); + if (flags & GST_RIFF_IF_KEYFRAME) { + ENTRY_SET_KEYFRAME (&entry); + } else { + ENTRY_UNSET_KEYFRAME (&entry); + } + } + + /* and add */ + if (G_UNLIKELY (!gst_avi_demux_add_index (avi, stream, num, &entry))) + goto out_of_mem; + + n++; + } + gst_buffer_unref (buf); + + /* get stream stats now */ + avi->have_index = gst_avi_demux_do_index_stats (avi); + + stamp = gst_util_get_timestamp () - stamp; + GST_DEBUG_OBJECT (avi, "index parsing took %" GST_TIME_FORMAT, + GST_TIME_ARGS (stamp)); + + return TRUE; + + /* ERRORS */ +empty_list: + { + GST_DEBUG_OBJECT (avi, "empty index"); + gst_buffer_unref (buf); + return FALSE; + } +out_of_mem: + { + GST_ELEMENT_ERROR (avi, RESOURCE, NO_SPACE_LEFT, (NULL), + ("Cannot allocate memory for %u*%u=%u bytes", + (guint) sizeof (GstAviIndexEntry), num, + (guint) sizeof (GstAviIndexEntry) * num)); + gst_buffer_unref (buf); + return FALSE; + } +} + +/* + * gst_avi_demux_stream_index: + * @avi: avi demuxer object. + * + * Seeks to index and reads it. + */ +static void +gst_avi_demux_stream_index (GstAviDemux * avi) +{ + GstFlowReturn res; + guint64 offset = avi->offset; + GstBuffer *buf; + guint32 tag; + guint32 size; + + GST_DEBUG ("demux stream index at offset %" G_GUINT64_FORMAT, offset); + + /* get chunk information */ + res = gst_pad_pull_range (avi->sinkpad, offset, 8, &buf); + if (res != GST_FLOW_OK) + goto pull_failed; + else if (GST_BUFFER_SIZE (buf) < 8) + goto too_small; + + /* check tag first before blindy trying to read 'size' bytes */ + tag = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); + size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf) + 4); + if (tag == GST_RIFF_TAG_LIST) { + /* this is the movi tag */ + GST_DEBUG_OBJECT (avi, "skip LIST chunk, size %" G_GUINT32_FORMAT, + (8 + GST_ROUND_UP_2 (size))); + offset += 8 + GST_ROUND_UP_2 (size); + gst_buffer_unref (buf); + res = gst_pad_pull_range (avi->sinkpad, offset, 8, &buf); + if (res != GST_FLOW_OK) + goto pull_failed; + else if (GST_BUFFER_SIZE (buf) < 8) + goto too_small; + tag = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); + size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf) + 4); + } + + if (tag != GST_RIFF_TAG_idx1) + goto no_index; + if (!size) + goto zero_index; + + gst_buffer_unref (buf); + + GST_DEBUG ("index found at offset %" G_GUINT64_FORMAT, offset); + + /* read chunk, advance offset */ + if (gst_riff_read_chunk (GST_ELEMENT_CAST (avi), + avi->sinkpad, &offset, &tag, &buf) != GST_FLOW_OK) + return; + + GST_DEBUG ("will parse index chunk size %u for tag %" + GST_FOURCC_FORMAT, GST_BUFFER_SIZE (buf), GST_FOURCC_ARGS (tag)); + + gst_avi_demux_parse_index (avi, buf); + +#ifndef GST_DISABLE_GST_DEBUG + /* debug our indexes */ + { + gint i; + GstAviStream *stream; + + for (i = 0; i < avi->num_streams; i++) { + stream = &avi->stream[i]; + GST_DEBUG_OBJECT (avi, "stream %u: %u frames, %" G_GINT64_FORMAT " bytes", + i, stream->idx_n, stream->total_bytes); + } + } +#endif + return; + + /* ERRORS */ +pull_failed: + { + GST_DEBUG_OBJECT (avi, + "pull range failed: pos=%" G_GUINT64_FORMAT " size=8", offset); + return; + } +too_small: + { + GST_DEBUG_OBJECT (avi, "Buffer is too small"); + gst_buffer_unref (buf); + return; + } +no_index: + { + GST_WARNING_OBJECT (avi, + "No index data (idx1) after movi chunk, but %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (tag)); + gst_buffer_unref (buf); + return; + } +zero_index: + { + GST_WARNING_OBJECT (avi, "Empty index data (idx1) after movi chunk"); + gst_buffer_unref (buf); + return; + } +} + +/* + * gst_avi_demux_stream_index_push: + * @avi: avi demuxer object. + * + * Read index. + */ +static void +gst_avi_demux_stream_index_push (GstAviDemux * avi) +{ + guint64 offset = avi->idx1_offset; + GstBuffer *buf; + guint32 tag; + guint32 size; + + GST_DEBUG ("demux stream index at offset %" G_GUINT64_FORMAT, offset); + + /* get chunk information */ + if (!gst_avi_demux_peek_chunk (avi, &tag, &size)) + return; + + /* check tag first before blindly trying to read 'size' bytes */ + if (tag == GST_RIFF_TAG_LIST) { + /* this is the movi tag */ + GST_DEBUG_OBJECT (avi, "skip LIST chunk, size %" G_GUINT32_FORMAT, + (8 + GST_ROUND_UP_2 (size))); + avi->idx1_offset = offset + 8 + GST_ROUND_UP_2 (size); + /* issue seek to allow chain function to handle it and return! */ + perform_seek_to_offset (avi, avi->idx1_offset); + return; + } + + if (tag != GST_RIFF_TAG_idx1) + goto no_index; + + GST_DEBUG ("index found at offset %" G_GUINT64_FORMAT, offset); + + /* flush chunk header */ + gst_adapter_flush (avi->adapter, 8); + /* read chunk payload */ + buf = gst_adapter_take_buffer (avi->adapter, size); + if (!buf) + goto pull_failed; + /* advance offset */ + offset += 8 + GST_ROUND_UP_2 (size); + + GST_DEBUG ("will parse index chunk size %u for tag %" + GST_FOURCC_FORMAT, GST_BUFFER_SIZE (buf), GST_FOURCC_ARGS (tag)); + + avi->offset = avi->first_movi_offset; + gst_avi_demux_parse_index (avi, buf); + +#ifndef GST_DISABLE_GST_DEBUG + /* debug our indexes */ + { + gint i; + GstAviStream *stream; + + for (i = 0; i < avi->num_streams; i++) { + stream = &avi->stream[i]; + GST_DEBUG_OBJECT (avi, "stream %u: %u frames, %" G_GINT64_FORMAT " bytes", + i, stream->idx_n, stream->total_bytes); + } + } +#endif + return; + + /* ERRORS */ +pull_failed: + { + GST_DEBUG_OBJECT (avi, + "taking data from adapter failed: pos=%" G_GUINT64_FORMAT " size=%u", + offset, size); + return; + } +no_index: + { + GST_WARNING_OBJECT (avi, + "No index data (idx1) after movi chunk, but %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (tag)); + return; + } +} + +/* + * gst_avi_demux_peek_tag: + * + * Returns the tag and size of the next chunk + */ +static GstFlowReturn +gst_avi_demux_peek_tag (GstAviDemux * avi, guint64 offset, guint32 * tag, + guint * size) +{ + GstFlowReturn res = GST_FLOW_OK; + GstBuffer *buf = NULL; + guint bufsize; + guint8 *bufdata; + + res = gst_pad_pull_range (avi->sinkpad, offset, 8, &buf); + if (res != GST_FLOW_OK) + goto pull_failed; + + bufsize = GST_BUFFER_SIZE (buf); + if (bufsize != 8) + goto wrong_size; + + bufdata = GST_BUFFER_DATA (buf); + + *tag = GST_READ_UINT32_LE (bufdata); + *size = GST_READ_UINT32_LE (bufdata + 4); + + GST_LOG_OBJECT (avi, "Tag[%" GST_FOURCC_FORMAT "] (size:%d) %" + G_GINT64_FORMAT " -- %" G_GINT64_FORMAT, GST_FOURCC_ARGS (*tag), + *size, offset + 8, offset + 8 + (gint64) * size); + +done: + gst_buffer_unref (buf); + + return res; + + /* ERRORS */ +pull_failed: + { + GST_DEBUG_OBJECT (avi, "pull_ranged returned %s", gst_flow_get_name (res)); + return res; + } +wrong_size: + { + GST_DEBUG_OBJECT (avi, "got %d bytes which is <> 8 bytes", bufsize); + res = GST_FLOW_ERROR; + goto done; + } +} + +/* + * gst_avi_demux_next_data_buffer: + * + * Returns the offset and size of the next buffer + * Position is the position of the buffer (after tag and size) + */ +static GstFlowReturn +gst_avi_demux_next_data_buffer (GstAviDemux * avi, guint64 * offset, + guint32 * tag, guint * size) +{ + guint64 off = *offset; + guint _size = 0; + GstFlowReturn res; + + do { + res = gst_avi_demux_peek_tag (avi, off, tag, &_size); + if (res != GST_FLOW_OK) + break; + if (*tag == GST_RIFF_TAG_LIST || *tag == GST_RIFF_TAG_RIFF) + off += 8 + 4; /* skip tag + size + subtag */ + else { + *offset = off + 8; + *size = _size; + break; + } + } while (TRUE); + + return res; +} + +/* + * gst_avi_demux_stream_scan: + * @avi: calling element (used for debugging/errors). + * + * Scan the file for all chunks to "create" a new index. + * pull-range based + */ +static gboolean +gst_avi_demux_stream_scan (GstAviDemux * avi) +{ + GstFlowReturn res; + GstAviStream *stream; + GstFormat format; + guint64 pos = 0; + guint64 length; + gint64 tmplength; + guint32 tag = 0; + guint num; + + /* FIXME: + * - implement non-seekable source support. + */ + GST_DEBUG_OBJECT (avi, "Creating index"); + + /* get the size of the file */ + format = GST_FORMAT_BYTES; + if (!gst_pad_query_peer_duration (avi->sinkpad, &format, &tmplength)) + return FALSE; + length = tmplength; + + /* guess the total amount of entries we expect */ + num = 16000; + + while (TRUE) { + GstAviIndexEntry entry; + guint size = 0; +#ifdef AVIDEMUX_MODIFICATION + gint frame_type = GST_AVI_KEYFRAME; +#endif + + /* start reading data buffers to find the id and offset */ + res = gst_avi_demux_next_data_buffer (avi, &pos, &tag, &size); + if (G_UNLIKELY (res != GST_FLOW_OK)) + break; + + /* get stream */ + stream = gst_avi_demux_stream_for_id (avi, tag); + if (G_UNLIKELY (!stream)) + goto next; +#ifdef AVIDEMUX_MODIFICATION + /* generating index table with key frames */ + if (stream->strh->type == GST_RIFF_FCC_vids) { + GstBuffer *buf = NULL; + int ret = -1; + + res = gst_pad_pull_range (avi->sinkpad, pos, size, &buf); + if (res != GST_FLOW_OK) { + gst_buffer_unref (buf); + GST_ERROR ("Pull failed....\n\n"); + break; + } + ret = gst_avi_demux_find_frame_type (stream, buf, &frame_type); + if (ret == -1) + break; + gst_buffer_unref (buf); + } + entry.flags = frame_type; +#else + /* we can't figure out the keyframes, assume they all are */ + entry.flags = GST_AVI_KEYFRAME; +#endif + entry.offset = pos; + entry.size = size; + + /* and add to the index of this stream */ + if (G_UNLIKELY (!gst_avi_demux_add_index (avi, stream, num, &entry))) + goto out_of_mem; + + next: + /* update position */ + pos += GST_ROUND_UP_2 (size); + if (G_UNLIKELY (pos > length)) { + GST_WARNING_OBJECT (avi, + "Stopping index lookup since we are further than EOF"); + break; + } + } + + /* collect stats */ + avi->have_index = gst_avi_demux_do_index_stats (avi); + + return TRUE; + + /* ERRORS */ +out_of_mem: + { + GST_ELEMENT_ERROR (avi, RESOURCE, NO_SPACE_LEFT, (NULL), + ("Cannot allocate memory for %u*%u=%u bytes", + (guint) sizeof (GstAviIndexEntry), num, + (guint) sizeof (GstAviIndexEntry) * num)); + return FALSE; + } +} + +static void +gst_avi_demux_calculate_durations_from_index (GstAviDemux * avi) +{ + guint i; + GstClockTime total; + GstAviStream *stream; + + total = GST_CLOCK_TIME_NONE; + + /* all streams start at a timestamp 0 */ + for (i = 0; i < avi->num_streams; i++) { + GstClockTime duration, hduration; + gst_riff_strh *strh; + + stream = &avi->stream[i]; + if (G_UNLIKELY (!stream || !stream->idx_n || !(strh = stream->strh))) + continue; + + /* get header duration for the stream */ + hduration = stream->hdr_duration; + /* index duration calculated during parsing */ + duration = stream->idx_duration; + + /* now pick a good duration */ + if (GST_CLOCK_TIME_IS_VALID (duration)) { + /* index gave valid duration, use that */ + GST_INFO ("Stream %p duration according to index: %" GST_TIME_FORMAT, + stream, GST_TIME_ARGS (duration)); + } else { + /* fall back to header info to calculate a duration */ + duration = hduration; + } + GST_INFO ("Setting duration of stream #%d to %" GST_TIME_FORMAT, + i, GST_TIME_ARGS (duration)); + /* set duration for the stream */ + stream->duration = duration; + + /* find total duration */ + if (total == GST_CLOCK_TIME_NONE || + (GST_CLOCK_TIME_IS_VALID (duration) && duration > total)) + total = duration; + } + + if (GST_CLOCK_TIME_IS_VALID (total) && (total > 0)) { + /* now update the duration for those streams where we had none */ + for (i = 0; i < avi->num_streams; i++) { + stream = &avi->stream[i]; + + if (!GST_CLOCK_TIME_IS_VALID (stream->duration) + || stream->duration == 0) { + stream->duration = total; + + GST_INFO ("Stream %p duration according to total: %" GST_TIME_FORMAT, + stream, GST_TIME_ARGS (total)); + } + } + } + + /* and set the total duration in the segment. */ + GST_INFO ("Setting total duration to: %" GST_TIME_FORMAT, + GST_TIME_ARGS (total)); + + gst_segment_set_duration (&avi->segment, GST_FORMAT_TIME, total); +} + +#ifdef AVIDEMUX_MODIFICATION +static void +gst_avi_demux_calculate_durations_from_strh (GstAviDemux * avi) +{ + guint i; + GstClockTime total; + GstAviStream *stream; + + total = GST_CLOCK_TIME_NONE; + + /* all streams start at a timestamp 0 */ + for (i = 0; i < avi->num_streams; i++) { + GstClockTime hduration; + gst_riff_strh *strh; + + stream = &avi->stream[i]; + + if (G_UNLIKELY (!stream || !(strh = stream->strh))) + continue; + + /* get header duration for the stream */ + hduration = stream->hdr_duration; + + /* check duration */ + if (GST_CLOCK_TIME_IS_VALID (hduration)) { + GST_INFO ("Stream %p duration according to strh: %" GST_TIME_FORMAT, + stream, GST_TIME_ARGS (hduration)); + } + + GST_INFO ("Setting duration of stream #%d to %" GST_TIME_FORMAT, + i, GST_TIME_ARGS (hduration)); + + /* set duration for the stream */ + stream->duration = hduration; + + /* find total duration */ + if (total == GST_CLOCK_TIME_NONE || + (GST_CLOCK_TIME_IS_VALID (hduration) && hduration > total)) + total = hduration; + } + + if (GST_CLOCK_TIME_IS_VALID (total) && (total > 0)) { + /* now update the duration for those streams where we had none */ + for (i = 0; i < avi->num_streams; i++) { + stream = &avi->stream[i]; + + if (!GST_CLOCK_TIME_IS_VALID (stream->duration) + || stream->duration == 0) { + stream->duration = total; + + GST_INFO ("Stream %p duration according to total: %" GST_TIME_FORMAT, + stream, GST_TIME_ARGS (total)); + } + } + } + + /* and set the total duration in the segment. */ + GST_INFO ("Setting total duration to: %" GST_TIME_FORMAT, + GST_TIME_ARGS (total)); + + gst_segment_set_duration (&avi->segment, GST_FORMAT_TIME, total); +} +#endif + +/* returns FALSE if there are no pads to deliver event to, + * otherwise TRUE (whatever the outcome of event sending), + * takes ownership of the event. */ +static gboolean +gst_avi_demux_push_event (GstAviDemux * avi, GstEvent * event) +{ + gboolean result = FALSE; + gint i; + + GST_DEBUG_OBJECT (avi, "sending %s event to %d streams", + GST_EVENT_TYPE_NAME (event), avi->num_streams); + + for (i = 0; i < avi->num_streams; i++) { + GstAviStream *stream = &avi->stream[i]; + + if (stream->pad) { + result = TRUE; + gst_pad_push_event (stream->pad, gst_event_ref (event)); + } + } + gst_event_unref (event); + return result; +} + +static void +gst_avi_demux_check_seekability (GstAviDemux * avi) +{ + GstQuery *query; + gboolean seekable = FALSE; + gint64 start = -1, stop = -1; + + query = gst_query_new_seeking (GST_FORMAT_BYTES); + if (!gst_pad_peer_query (avi->sinkpad, query)) { + GST_DEBUG_OBJECT (avi, "seeking query failed"); + goto done; + } + + gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); + + /* try harder to query upstream size if we didn't get it the first time */ + if (seekable && stop == -1) { + GstFormat fmt = GST_FORMAT_BYTES; + + GST_DEBUG_OBJECT (avi, "doing duration query to fix up unset stop"); + gst_pad_query_peer_duration (avi->sinkpad, &fmt, &stop); + } + + /* if upstream doesn't know the size, it's likely that it's not seekable in + * practice even if it technically may be seekable */ + if (seekable && (start != 0 || stop <= start)) { + GST_DEBUG_OBJECT (avi, "seekable but unknown start/stop -> disable"); + seekable = FALSE; + } + +done: + GST_INFO_OBJECT (avi, "seekable: %d (%" G_GUINT64_FORMAT " - %" + G_GUINT64_FORMAT ")", seekable, start, stop); + avi->seekable = seekable; + + gst_query_unref (query); +} + +/* + * Read AVI headers when streaming + */ +static GstFlowReturn +gst_avi_demux_stream_header_push (GstAviDemux * avi) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint32 tag = 0; + guint32 ltag = 0; + guint32 size = 0; + const guint8 *data; + GstBuffer *buf = NULL, *sub = NULL; + guint offset = 4; + gint64 stop; + gint i; + GstTagList *tags = NULL; + + GST_DEBUG ("Reading and parsing avi headers: %d", avi->header_state); + + switch (avi->header_state) { + case GST_AVI_DEMUX_HEADER_TAG_LIST: + if (gst_avi_demux_peek_chunk (avi, &tag, &size)) { + avi->offset += 8 + GST_ROUND_UP_2 (size); + if (tag != GST_RIFF_TAG_LIST) + goto header_no_list; + + gst_adapter_flush (avi->adapter, 8); + /* Find the 'hdrl' LIST tag */ + GST_DEBUG ("Reading %d bytes", size); + buf = gst_adapter_take_buffer (avi->adapter, size); + + if (GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)) != GST_RIFF_LIST_hdrl) + goto header_no_hdrl; + + /* mind padding */ + if (size & 1) + gst_adapter_flush (avi->adapter, 1); + + GST_DEBUG ("'hdrl' LIST tag found. Parsing next chunk"); + + gst_avi_demux_roundup_list (avi, &buf); + + /* the hdrl starts with a 'avih' header */ + if (!gst_riff_parse_chunk (GST_ELEMENT_CAST (avi), buf, &offset, &tag, + &sub)) + goto header_no_avih; + + if (tag != GST_RIFF_TAG_avih) + goto header_no_avih; + + if (!gst_avi_demux_parse_avih (avi, sub, &avi->avih)) + goto header_wrong_avih; + + GST_DEBUG_OBJECT (avi, "AVI header ok, reading elemnts from header"); + + /* now, read the elements from the header until the end */ + while (gst_riff_parse_chunk (GST_ELEMENT_CAST (avi), buf, &offset, &tag, + &sub)) { + /* sub can be NULL on empty tags */ + if (!sub) + continue; + + switch (tag) { + case GST_RIFF_TAG_LIST: + if (GST_BUFFER_SIZE (sub) < 4) + goto next; + + switch (GST_READ_UINT32_LE (GST_BUFFER_DATA (sub))) { + case GST_RIFF_LIST_strl: + if (!(gst_avi_demux_parse_stream (avi, sub))) { + sub = NULL; + GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL), + ("failed to parse stream, ignoring")); + goto next; + } + sub = NULL; + goto next; + case GST_RIFF_LIST_odml: + gst_avi_demux_parse_odml (avi, sub); + sub = NULL; + break; + default: + GST_WARNING_OBJECT (avi, + "Unknown list %" GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (GST_READ_UINT32_LE (GST_BUFFER_DATA + (sub)))); + /* fall-through */ + case GST_RIFF_TAG_JUNQ: + case GST_RIFF_TAG_JUNK: + goto next; + } + break; + case GST_RIFF_IDIT: + gst_avi_demux_parse_idit (avi, sub); + goto next; + default: + GST_WARNING_OBJECT (avi, + "Unknown off %d tag %" GST_FOURCC_FORMAT " in AVI header", + offset, GST_FOURCC_ARGS (tag)); + /* fall-through */ + case GST_RIFF_TAG_JUNQ: + case GST_RIFF_TAG_JUNK: + next: + /* move to next chunk */ + if (sub) + gst_buffer_unref (sub); + sub = NULL; + break; + } + } + gst_buffer_unref (buf); + GST_DEBUG ("elements parsed"); + + /* check parsed streams */ + if (avi->num_streams == 0) { + goto no_streams; + } else if (avi->num_streams != avi->avih->streams) { + GST_WARNING_OBJECT (avi, + "Stream header mentioned %d streams, but %d available", + avi->avih->streams, avi->num_streams); + } + GST_DEBUG ("Get junk and info next"); + avi->header_state = GST_AVI_DEMUX_HEADER_INFO; + } else { + /* Need more data */ + return ret; + } + /* fall-though */ + case GST_AVI_DEMUX_HEADER_INFO: + GST_DEBUG_OBJECT (avi, "skipping junk between header and data ..."); + while (TRUE) { + if (gst_adapter_available (avi->adapter) < 12) + return GST_FLOW_OK; + + data = gst_adapter_peek (avi->adapter, 12); + tag = GST_READ_UINT32_LE (data); + size = GST_READ_UINT32_LE (data + 4); + ltag = GST_READ_UINT32_LE (data + 8); + + if (tag == GST_RIFF_TAG_LIST) { + switch (ltag) { + case GST_RIFF_LIST_movi: + gst_adapter_flush (avi->adapter, 12); + if (!avi->first_movi_offset) + avi->first_movi_offset = avi->offset; + avi->offset += 12; + avi->idx1_offset = avi->offset + size - 4; + goto skipping_done; + case GST_RIFF_LIST_INFO: + GST_DEBUG ("Found INFO chunk"); + if (gst_avi_demux_peek_chunk (avi, &tag, &size)) { + GST_DEBUG ("got size %d", size); + avi->offset += 12; + gst_adapter_flush (avi->adapter, 12); + if (size > 4) { + buf = gst_adapter_take_buffer (avi->adapter, size - 4); + /* mind padding */ + if (size & 1) + gst_adapter_flush (avi->adapter, 1); + gst_riff_parse_info (GST_ELEMENT_CAST (avi), buf, &tags); + if (tags) { + if (avi->globaltags) { + gst_tag_list_insert (avi->globaltags, tags, + GST_TAG_MERGE_REPLACE); + } else { + avi->globaltags = tags; + } + } + tags = NULL; + gst_buffer_unref (buf); + + avi->offset += GST_ROUND_UP_2 (size) - 4; + } else { + GST_DEBUG ("skipping INFO LIST prefix"); + } + } else { + /* Need more data */ + return GST_FLOW_OK; + } + break; + default: + if (gst_avi_demux_peek_chunk (avi, &tag, &size)) { + avi->offset += 8 + GST_ROUND_UP_2 (size); + gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); + // ??? goto iterate; ??? + } else { + /* Need more data */ + return GST_FLOW_OK; + } + break; + } + } else { + if (gst_avi_demux_peek_chunk (avi, &tag, &size)) { + avi->offset += 8 + GST_ROUND_UP_2 (size); + gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); + //goto iterate; + } else { + /* Need more data */ + return GST_FLOW_OK; + } + } + } + break; + default: + GST_WARNING ("unhandled header state: %d", avi->header_state); + break; + } +skipping_done: + + GST_DEBUG_OBJECT (avi, "skipping done ... (streams=%u, stream[0].indexes=%p)", + avi->num_streams, avi->stream[0].indexes); + + GST_DEBUG ("Found movi chunk. Starting to stream data"); + avi->state = GST_AVI_DEMUX_MOVI; + +#ifdef AVIDEMUX_MODIFICATION + /*no indexs in push mode, but it could be get from strh chunk */ + gst_avi_demux_calculate_durations_from_strh (avi); +#else + /* no indexes in push mode, but it still sets some variables */ + gst_avi_demux_calculate_durations_from_index (avi); +#endif + + gst_avi_demux_expose_streams (avi, TRUE); + + /* prepare all streams for index 0 */ + for (i = 0; i < avi->num_streams; i++) + avi->stream[i].current_entry = 0; + + /* create initial NEWSEGMENT event */ + if ((stop = avi->segment.stop) == GST_CLOCK_TIME_NONE) + stop = avi->segment.duration; + + GST_DEBUG_OBJECT (avi, "segment stop %" G_GINT64_FORMAT, stop); + + if (avi->seg_event) + gst_event_unref (avi->seg_event); + avi->seg_event = gst_event_new_new_segment_full + (FALSE, avi->segment.rate, avi->segment.applied_rate, GST_FORMAT_TIME, + avi->segment.start, stop, avi->segment.time); + + gst_avi_demux_check_seekability (avi); + + /* at this point we know all the streams and we can signal the no more + * pads signal */ + GST_DEBUG_OBJECT (avi, "signaling no more pads"); + gst_element_no_more_pads (GST_ELEMENT_CAST (avi)); + + return GST_FLOW_OK; + + /* ERRORS */ +no_streams: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("No streams found")); + return GST_FLOW_ERROR; + } +header_no_list: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Invalid AVI header (no LIST at start): %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + return GST_FLOW_ERROR; + } +header_no_hdrl: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Invalid AVI header (no hdrl at start): %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +header_no_avih: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Invalid AVI header (no avih at start): %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + if (sub) + gst_buffer_unref (sub); + + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +header_wrong_avih: + { + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +} + +static void +gst_avi_demux_add_date_tag (GstAviDemux * avi, gint y, gint m, gint d, + gint h, gint min, gint s) +{ + GDate *date; + GstDateTime *dt; + + date = g_date_new_dmy (d, m, y); + if (!g_date_valid (date)) { + /* bogus date */ + GST_WARNING_OBJECT (avi, "Refusing to add invalid date %d-%d-%d", y, m, d); + g_date_free (date); + return; + } + + dt = gst_date_time_new_local_time (y, m, d, h, min, s); + + if (avi->globaltags == NULL) + avi->globaltags = gst_tag_list_new (); + + gst_tag_list_add (avi->globaltags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE, date, + NULL); + g_date_free (date); + if (dt) { + gst_tag_list_add (avi->globaltags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE_TIME, + dt, NULL); + gst_date_time_unref (dt); + } +} + +static void +gst_avi_demux_parse_idit_nums_only (GstAviDemux * avi, gchar * data) +{ + gint y, m, d; + gint hr = 0, min = 0, sec = 0; + gint ret; + + GST_DEBUG ("data : '%s'", data); + + ret = sscanf (data, "%d:%d:%d %d:%d:%d", &y, &m, &d, &hr, &min, &sec); + if (ret < 3) { + /* Attempt YYYY/MM/DD/ HH:MM variant (found in CASIO cameras) */ + ret = sscanf (data, "%04d/%02d/%02d/ %d:%d", &y, &m, &d, &hr, &min); + if (ret < 3) { + GST_WARNING_OBJECT (avi, "Failed to parse IDIT tag"); + return; + } + } + gst_avi_demux_add_date_tag (avi, y, m, d, hr, min, sec); +} + +static gint +get_month_num (gchar * data, guint size) +{ + if (g_ascii_strncasecmp (data, "jan", 3) == 0) { + return 1; + } else if (g_ascii_strncasecmp (data, "feb", 3) == 0) { + return 2; + } else if (g_ascii_strncasecmp (data, "mar", 3) == 0) { + return 3; + } else if (g_ascii_strncasecmp (data, "apr", 3) == 0) { + return 4; + } else if (g_ascii_strncasecmp (data, "may", 3) == 0) { + return 5; + } else if (g_ascii_strncasecmp (data, "jun", 3) == 0) { + return 6; + } else if (g_ascii_strncasecmp (data, "jul", 3) == 0) { + return 7; + } else if (g_ascii_strncasecmp (data, "aug", 3) == 0) { + return 8; + } else if (g_ascii_strncasecmp (data, "sep", 3) == 0) { + return 9; + } else if (g_ascii_strncasecmp (data, "oct", 3) == 0) { + return 10; + } else if (g_ascii_strncasecmp (data, "nov", 3) == 0) { + return 11; + } else if (g_ascii_strncasecmp (data, "dec", 3) == 0) { + return 12; + } + + return 0; +} + +static void +gst_avi_demux_parse_idit_text (GstAviDemux * avi, gchar * data) +{ + gint year, month, day; + gint hour, min, sec; + gint ret; + gchar weekday[4]; + gchar monthstr[4]; + + ret = sscanf (data, "%3s %3s %d %d:%d:%d %d", weekday, monthstr, &day, &hour, + &min, &sec, &year); + if (ret != 7) { + GST_WARNING_OBJECT (avi, "Failed to parse IDIT tag"); + return; + } + month = get_month_num (monthstr, strlen (monthstr)); + gst_avi_demux_add_date_tag (avi, year, month, day, hour, min, sec); +} + +static void +gst_avi_demux_parse_idit (GstAviDemux * avi, GstBuffer * buf) +{ + gchar *data = (gchar *) GST_BUFFER_DATA (buf); + guint size = GST_BUFFER_SIZE (buf); + gchar *safedata = NULL; + + /* + * According to: + * http://www.eden-foundation.org/products/code/film_date_stamp/index.html + * + * This tag could be in one of the below formats + * 2005:08:17 11:42:43 + * THU OCT 26 16:46:04 2006 + * Mon Mar 3 09:44:56 2008 + * + * FIXME: Our date tag doesn't include hours + */ + + /* skip eventual initial whitespace */ + while (size > 0 && g_ascii_isspace (data[0])) { + data++; + size--; + } + + if (size == 0) { + goto non_parsable; + } + + /* make a safe copy to add a \0 to the end of the string */ + safedata = g_strndup (data, size); + + /* test if the first char is a alpha or a number */ + if (g_ascii_isdigit (data[0])) { + gst_avi_demux_parse_idit_nums_only (avi, safedata); + g_free (safedata); + return; + } else if (g_ascii_isalpha (data[0])) { + gst_avi_demux_parse_idit_text (avi, safedata); + g_free (safedata); + return; + } + + g_free (safedata); + +non_parsable: + GST_WARNING_OBJECT (avi, "IDIT tag has no parsable info"); +} + +/* + * Read full AVI headers. + */ +static GstFlowReturn +gst_avi_demux_stream_header_pull (GstAviDemux * avi) +{ + GstFlowReturn res; + GstBuffer *buf, *sub = NULL; + guint32 tag; + guint offset = 4; + gint64 stop; + GstElement *element = GST_ELEMENT_CAST (avi); + GstClockTime stamp; + GstTagList *tags = NULL; + + stamp = gst_util_get_timestamp (); + + /* the header consists of a 'hdrl' LIST tag */ + res = gst_riff_read_chunk (element, avi->sinkpad, &avi->offset, &tag, &buf); + if (res != GST_FLOW_OK) + goto pull_range_failed; + else if (tag != GST_RIFF_TAG_LIST) + goto no_list; + else if (GST_BUFFER_SIZE (buf) < 4) + goto no_header; + + GST_DEBUG_OBJECT (avi, "parsing headers"); + + /* Find the 'hdrl' LIST tag */ + while (GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)) != GST_RIFF_LIST_hdrl) { + GST_LOG_OBJECT (avi, "buffer contains %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)))); + + /* Eat up */ + gst_buffer_unref (buf); + + /* read new chunk */ + res = gst_riff_read_chunk (element, avi->sinkpad, &avi->offset, &tag, &buf); + if (res != GST_FLOW_OK) + goto pull_range_failed; + else if (tag != GST_RIFF_TAG_LIST) + goto no_list; + else if (GST_BUFFER_SIZE (buf) < 4) + goto no_header; + } + + GST_DEBUG_OBJECT (avi, "hdrl LIST tag found"); + + gst_avi_demux_roundup_list (avi, &buf); + + /* the hdrl starts with a 'avih' header */ + if (!gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) + goto no_avih; + else if (tag != GST_RIFF_TAG_avih) + goto no_avih; + else if (!gst_avi_demux_parse_avih (avi, sub, &avi->avih)) + goto invalid_avih; + + GST_DEBUG_OBJECT (avi, "AVI header ok, reading elements from header"); + + /* now, read the elements from the header until the end */ + while (gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) { + /* sub can be NULL on empty tags */ + if (!sub) + continue; + + switch (tag) { + case GST_RIFF_TAG_LIST: + { + guint8 *data; + guint32 fourcc; + + if (GST_BUFFER_SIZE (sub) < 4) + goto next; + + data = GST_BUFFER_DATA (sub); + fourcc = GST_READ_UINT32_LE (data); + + switch (fourcc) { + case GST_RIFF_LIST_strl: + if (!(gst_avi_demux_parse_stream (avi, sub))) { + GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL), + ("failed to parse stream, ignoring")); + sub = NULL; +#ifdef DIVX_DRM + goto invalid_stream; +#endif + } + sub = NULL; + goto next; + case GST_RIFF_LIST_odml: + gst_avi_demux_parse_odml (avi, sub); + sub = NULL; + break; + case GST_RIFF_LIST_INFO: + GST_BUFFER_DATA (sub) = data + 4; + GST_BUFFER_SIZE (sub) -= 4; + gst_riff_parse_info (element, sub, &tags); + if (tags) { + if (avi->globaltags) { + gst_tag_list_insert (avi->globaltags, tags, + GST_TAG_MERGE_REPLACE); + } else { + avi->globaltags = tags; + } + } + tags = NULL; + break; + default: + GST_WARNING_OBJECT (avi, + "Unknown list %" GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (fourcc)); + GST_MEMDUMP_OBJECT (avi, "Unknown list", GST_BUFFER_DATA (sub), + GST_BUFFER_SIZE (sub)); + /* fall-through */ + case GST_RIFF_TAG_JUNQ: + case GST_RIFF_TAG_JUNK: + goto next; + } + break; + } + case GST_RIFF_IDIT: + gst_avi_demux_parse_idit (avi, sub); + goto next; + default: + GST_WARNING_OBJECT (avi, + "Unknown tag %" GST_FOURCC_FORMAT " in AVI header at off %d", + GST_FOURCC_ARGS (tag), offset); + GST_MEMDUMP_OBJECT (avi, "Unknown tag", GST_BUFFER_DATA (sub), + GST_BUFFER_SIZE (sub)); + /* fall-through */ + case GST_RIFF_TAG_JUNQ: + case GST_RIFF_TAG_JUNK: + next: + if (sub) + gst_buffer_unref (sub); + sub = NULL; + break; + } + } + gst_buffer_unref (buf); + GST_DEBUG ("elements parsed"); + + /* check parsed streams */ + if (avi->num_streams == 0) + goto no_streams; + else if (avi->num_streams != avi->avih->streams) { + GST_WARNING_OBJECT (avi, + "Stream header mentioned %d streams, but %d available", + avi->avih->streams, avi->num_streams); + } + + GST_DEBUG_OBJECT (avi, "skipping junk between header and data, offset=%" + G_GUINT64_FORMAT, avi->offset); + + /* Now, find the data (i.e. skip all junk between header and data) */ + do { + guint size; + guint8 *data; + guint32 tag, ltag; + + res = gst_pad_pull_range (avi->sinkpad, avi->offset, 12, &buf); + if (res != GST_FLOW_OK) { + GST_DEBUG_OBJECT (avi, "pull_range failure while looking for tags"); + goto pull_range_failed; + } else if (GST_BUFFER_SIZE (buf) < 12) { + GST_DEBUG_OBJECT (avi, "got %d bytes which is less than 12 bytes", + GST_BUFFER_SIZE (buf)); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } + + data = GST_BUFFER_DATA (buf); + + tag = GST_READ_UINT32_LE (data); + size = GST_READ_UINT32_LE (data + 4); + ltag = GST_READ_UINT32_LE (data + 8); + + GST_DEBUG ("tag %" GST_FOURCC_FORMAT ", size %u", + GST_FOURCC_ARGS (tag), size); + GST_MEMDUMP ("Tag content", data, GST_BUFFER_SIZE (buf)); + gst_buffer_unref (buf); + + switch (tag) { + case GST_RIFF_TAG_LIST:{ + switch (ltag) { + case GST_RIFF_LIST_movi: + GST_DEBUG_OBJECT (avi, + "Reached the 'movi' tag, we're done with skipping"); + goto skipping_done; + case GST_RIFF_LIST_INFO: + res = + gst_riff_read_chunk (element, avi->sinkpad, &avi->offset, &tag, + &buf); + if (res != GST_FLOW_OK) { + GST_DEBUG_OBJECT (avi, "couldn't read INFO chunk"); + goto pull_range_failed; + } + GST_DEBUG ("got size %u", GST_BUFFER_SIZE (buf)); + if (size < 4) { + GST_DEBUG ("skipping INFO LIST prefix"); + avi->offset += (4 - GST_ROUND_UP_2 (size)); + gst_buffer_unref (buf); + continue; + } + + sub = gst_buffer_create_sub (buf, 4, GST_BUFFER_SIZE (buf) - 4); + gst_riff_parse_info (element, sub, &tags); + if (tags) { + if (avi->globaltags) { + gst_tag_list_insert (avi->globaltags, tags, + GST_TAG_MERGE_REPLACE); + } else { + avi->globaltags = tags; + } + } + tags = NULL; + if (sub) { + gst_buffer_unref (sub); + sub = NULL; + } + gst_buffer_unref (buf); + /* gst_riff_read_chunk() has already advanced avi->offset */ + break; + default: + GST_WARNING_OBJECT (avi, + "Skipping unknown list tag %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (ltag)); + avi->offset += 8 + GST_ROUND_UP_2 (size); + break; + } + } + break; + default: + GST_WARNING_OBJECT (avi, "Skipping unknown tag %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (tag)); + /* Fall-through */ + case GST_MAKE_FOURCC ('J', 'U', 'N', 'Q'): + case GST_MAKE_FOURCC ('J', 'U', 'N', 'K'): + /* Only get buffer for debugging if the memdump is needed */ + if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) >= 9) { + res = gst_pad_pull_range (avi->sinkpad, avi->offset, size, &buf); + if (res != GST_FLOW_OK) { + GST_DEBUG_OBJECT (avi, "couldn't read INFO chunk"); + goto pull_range_failed; + } + GST_MEMDUMP ("Junk", GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + gst_buffer_unref (buf); + } + avi->offset += 8 + GST_ROUND_UP_2 (size); + break; + } + } while (1); +skipping_done: + + GST_DEBUG_OBJECT (avi, "skipping done ... (streams=%u, stream[0].indexes=%p)", + avi->num_streams, avi->stream[0].indexes); + + /* create or read stream index (for seeking) */ + if (avi->stream[0].indexes != NULL) { + /* we read a super index already (gst_avi_demux_parse_superindex() ) */ + gst_avi_demux_read_subindexes_pull (avi); + } + if (!avi->have_index) { + if (avi->avih->flags & GST_RIFF_AVIH_HASINDEX) + gst_avi_demux_stream_index (avi); + + /* still no index, scan */ + if (!avi->have_index) { + gst_avi_demux_stream_scan (avi); + + /* still no index.. this is a fatal error for now. + * FIXME, we should switch to plain push mode without seeking + * instead of failing. */ + if (!avi->have_index) + goto no_index; + } + } + /* use the indexes now to construct nice durations */ + gst_avi_demux_calculate_durations_from_index (avi); + + gst_avi_demux_expose_streams (avi, FALSE); + + /* create initial NEWSEGMENT event */ + if ((stop = avi->segment.stop) == GST_CLOCK_TIME_NONE) + stop = avi->segment.duration; + + GST_DEBUG_OBJECT (avi, "segment stop %" G_GINT64_FORMAT, stop); + + /* do initial seek to the default segment values */ + gst_avi_demux_do_seek (avi, &avi->segment); + + /* prepare initial segment */ + if (avi->seg_event) + gst_event_unref (avi->seg_event); + avi->seg_event = gst_event_new_new_segment_full + (FALSE, avi->segment.rate, avi->segment.applied_rate, GST_FORMAT_TIME, + avi->segment.start, stop, avi->segment.time); + + stamp = gst_util_get_timestamp () - stamp; + GST_DEBUG_OBJECT (avi, "pulling header took %" GST_TIME_FORMAT, + GST_TIME_ARGS (stamp)); + + /* at this point we know all the streams and we can signal the no more + * pads signal */ + GST_DEBUG_OBJECT (avi, "signaling no more pads"); + gst_element_no_more_pads (GST_ELEMENT_CAST (avi)); + + return GST_FLOW_OK; + + /* ERRORS */ +no_list: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Invalid AVI header (no LIST at start): %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +no_header: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Invalid AVI header (no hdrl at start): %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +no_avih: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Invalid AVI header (no avih at start): %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + if (sub) + gst_buffer_unref (sub); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +invalid_avih: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Invalid AVI header (cannot parse avih at start)")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +no_streams: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("No streams found")); + return GST_FLOW_ERROR; + } +no_index: + { + GST_WARNING ("file without or too big index"); + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("Could not get/create index")); + return GST_FLOW_ERROR; + } +pull_range_failed: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), + ("pull_range flow reading header: %s", gst_flow_get_name (res))); + return GST_FLOW_ERROR; + } +#ifdef DIVX_DRM +invalid_stream: + { + gst_buffer_unref(buf); + return GST_FLOW_ERROR; + } +#endif +} + +/* move a stream to @index */ +static void +gst_avi_demux_move_stream (GstAviDemux * avi, GstAviStream * stream, + GstSegment * segment, guint index) +{ + GST_DEBUG_OBJECT (avi, "Move stream %d to %u", stream->num, index); + + if (segment->rate < 0.0) { + guint next_key; + /* Because we don't know the frame order we need to push from the prev keyframe + * to the next keyframe. If there is a smart decoder downstream he will notice + * that there are too many encoded frames send and return UNEXPECTED when there + * are enough decoded frames to fill the segment. */ +#ifdef AVIDEMUX_MODIFICATION + next_key = gst_avi_demux_index_for_time (avi, stream, avi->seek_kf_offset); +#else + next_key = gst_avi_demux_index_next (avi, stream, index, TRUE); +#endif + + /* FIXME, we go back to 0, we should look at segment.start. We will however + * stop earlier when the see the timestamp < segment.start */ + stream->start_entry = 0; + stream->step_entry = index; + stream->current_entry = index; + stream->stop_entry = next_key; + + GST_DEBUG_OBJECT (avi, "reverse seek: start %u, step %u, stop %u", + stream->start_entry, stream->step_entry, stream->stop_entry); + } else { + stream->start_entry = index; + stream->step_entry = index; + stream->stop_entry = gst_avi_demux_index_last (avi, stream); + } + if (stream->current_entry != index) { + GST_DEBUG_OBJECT (avi, "Move DISCONT from %u to %u", + stream->current_entry, index); + stream->current_entry = index; + stream->discont = TRUE; + } + + /* update the buffer info */ + gst_avi_demux_get_buffer_info (avi, stream, index, + &stream->current_timestamp, &stream->current_ts_end, + &stream->current_offset, &stream->current_offset_end); + + GST_DEBUG_OBJECT (avi, "Moved to %u, ts %" GST_TIME_FORMAT + ", ts_end %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT + ", off_end %" G_GUINT64_FORMAT, index, + GST_TIME_ARGS (stream->current_timestamp), + GST_TIME_ARGS (stream->current_ts_end), stream->current_offset, + stream->current_offset_end); + + GST_DEBUG_OBJECT (avi, "Seeking to offset %" G_GUINT64_FORMAT, + stream->index[index].offset); +} + +/* + * Do the actual seeking. + */ +static gboolean +gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment) +{ + GstClockTime seek_time; + gboolean keyframe; + guint i, index; + GstAviStream *stream; + + seek_time = segment->last_stop; + +#ifdef AVIDEMUX_MODIFICATION + avi->seek_kf_offset = seek_time; +#endif + + keyframe = !!(segment->flags & GST_SEEK_FLAG_KEY_UNIT); + + GST_DEBUG_OBJECT (avi, "seek to: %" GST_TIME_FORMAT + " keyframe seeking:%d", GST_TIME_ARGS (seek_time), keyframe); + + /* FIXME, this code assumes the main stream with keyframes is stream 0, + * which is mostly correct... */ + stream = &avi->stream[avi->main_stream]; + + /* get the entry index for the requested position */ + index = gst_avi_demux_index_for_time (avi, stream, seek_time); + GST_DEBUG_OBJECT (avi, "Got entry %u", index); + + +#ifdef AVIDEMUX_MODIFICATION + if(segment->rate < 0.0 && index) { + /* If index is keyframe, reduce index by 1, so that we could fetch prev keyframe for video */ + /* This change is done to fix the out of segment issue when seek position is a keyframe position */ + if (ENTRY_IS_KEYFRAME (&stream->index[index])) { + index--; + } + } +#endif + + + /* check if we are already on a keyframe */ + if (!ENTRY_IS_KEYFRAME (&stream->index[index])) { + GST_DEBUG_OBJECT (avi, "not keyframe, searching back"); + /* now go to the previous keyframe, this is where we should start + * decoding from. */ + index = gst_avi_demux_index_prev (avi, stream, index, TRUE); + GST_DEBUG_OBJECT (avi, "previous keyframe at %u", index); + } + + /* move the main stream to this position */ + gst_avi_demux_move_stream (avi, stream, segment, index); + + if (keyframe) { + /* when seeking to a keyframe, we update the result seek time + * to the time of the keyframe. */ + seek_time = stream->current_timestamp; + GST_DEBUG_OBJECT (avi, "keyframe adjusted to %" GST_TIME_FORMAT, + GST_TIME_ARGS (seek_time)); + } + + /* the seek time is also the last_stop and stream time when going + * forwards */ + segment->last_stop = seek_time; + +#ifdef AVIDEMUX_MODIFICATION + /*initialization of rate params */ + stream->trickplay_info->prev_kidx =0; + stream->trickplay_info->next_kidx=0; + stream->trickplay_info->kidxs_dur_diff=0; + stream->trickplay_info->start_pos = segment->last_stop; + /* Adjust seek_time to video keyframe's timestamp so that audio can align to that position */ + if(segment->rate < 0.0) + seek_time = stream->current_timestamp; +#else + if (segment->rate > 0.0) + segment->time = seek_time; +#endif + + /* now set DISCONT and align the other streams */ + for (i = 0; i < avi->num_streams; i++) { + GstAviStream *ostream; + + ostream = &avi->stream[i]; + if ((ostream == stream) || (ostream->index == NULL)) + continue; + + /* get the entry index for the requested position */ + index = gst_avi_demux_index_for_time (avi, ostream, seek_time); + + /* move to previous keyframe */ + if (!ENTRY_IS_KEYFRAME (&ostream->index[index])) + index = gst_avi_demux_index_prev (avi, ostream, index, TRUE); + + gst_avi_demux_move_stream (avi, ostream, segment, index); + } + GST_DEBUG_OBJECT (avi, "done seek to: %" GST_TIME_FORMAT, + GST_TIME_ARGS (seek_time)); + + return TRUE; +} + +/* + * Handle seek event in pull mode. + */ +static gboolean +gst_avi_demux_handle_seek (GstAviDemux * avi, GstPad * pad, GstEvent * event) +{ + gdouble rate; + GstFormat format; + GstSeekFlags flags; + GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type; + gint64 cur = 0, stop; + gboolean flush; + gboolean update; + GstSegment seeksegment = { 0, }; + gint i; + + if (event) { + GST_DEBUG_OBJECT (avi, "doing seek with event"); + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + /* we have to have a format as the segment format. Try to convert + * if not. */ + if (format != GST_FORMAT_TIME) { + GstFormat fmt = GST_FORMAT_TIME; + gboolean res = TRUE; + + if (cur_type != GST_SEEK_TYPE_NONE) + res = gst_pad_query_convert (pad, format, cur, &fmt, &cur); + if (res && stop_type != GST_SEEK_TYPE_NONE) + res = gst_pad_query_convert (pad, format, stop, &fmt, &stop); + if (!res) + goto no_format; + + format = fmt; + } + GST_DEBUG_OBJECT (avi, + "seek requested: rate %g cur %" GST_TIME_FORMAT " stop %" + GST_TIME_FORMAT, rate, GST_TIME_ARGS (cur), GST_TIME_ARGS (stop)); + /* FIXME: can we do anything with rate!=1.0 */ + } else { + GST_DEBUG_OBJECT (avi, "doing seek without event"); + flags = 0; + rate = 1.0; + } + + /* save flush flag */ + flush = flags & GST_SEEK_FLAG_FLUSH; + + if (flush) { + GstEvent *fevent = gst_event_new_flush_start (); + + /* for a flushing seek, we send a flush_start on all pads. This will + * eventually stop streaming with a WRONG_STATE. We can thus eventually + * take the STREAM_LOCK. */ + GST_DEBUG_OBJECT (avi, "sending flush start"); + gst_avi_demux_push_event (avi, gst_event_ref (fevent)); + gst_pad_push_event (avi->sinkpad, fevent); + } else { + /* a non-flushing seek, we PAUSE the task so that we can take the + * STREAM_LOCK */ + GST_DEBUG_OBJECT (avi, "non flushing seek, pausing task"); + gst_pad_pause_task (avi->sinkpad); + } + + /* wait for streaming to stop */ + GST_DEBUG_OBJECT (avi, "wait for streaming to stop"); + GST_PAD_STREAM_LOCK (avi->sinkpad); + + /* copy segment, we need this because we still need the old + * segment when we close the current segment. */ + memcpy (&seeksegment, &avi->segment, sizeof (GstSegment)); + + if (event) { + GST_DEBUG_OBJECT (avi, "configuring seek"); + gst_segment_set_seek (&seeksegment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + } + +#ifdef AVIDEMUX_MODIFICATION + if (cur != GST_CLOCK_TIME_NONE) + gst_segment_set_last_stop (&seeksegment, GST_FORMAT_TIME, cur); +#endif + + /* do the seek, seeksegment.last_stop contains the new position, this + * actually never fails. */ + gst_avi_demux_do_seek (avi, &seeksegment); + + gst_event_replace (&avi->close_seg_event, NULL); + if (flush) { + GstEvent *fevent = gst_event_new_flush_stop (); + + GST_DEBUG_OBJECT (avi, "sending flush stop"); + gst_avi_demux_push_event (avi, gst_event_ref (fevent)); + gst_pad_push_event (avi->sinkpad, fevent); + } else if (avi->segment_running) { + /* we are running the current segment and doing a non-flushing seek, + * close the segment first based on the last_stop. */ + GST_DEBUG_OBJECT (avi, "closing running segment %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, avi->segment.start, avi->segment.last_stop); + avi->close_seg_event = gst_event_new_new_segment_full (TRUE, + avi->segment.rate, avi->segment.applied_rate, avi->segment.format, + avi->segment.start, avi->segment.last_stop, avi->segment.time); + } + + /* now update the real segment info */ + memcpy (&avi->segment, &seeksegment, sizeof (GstSegment)); + + /* post the SEGMENT_START message when we do segmented playback */ + if (avi->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT_CAST (avi), + gst_message_new_segment_start (GST_OBJECT_CAST (avi), + avi->segment.format, avi->segment.last_stop)); + } + + /* prepare for streaming again */ + if ((stop = avi->segment.stop) == GST_CLOCK_TIME_NONE) + stop = avi->segment.duration; + + /* queue the segment event for the streaming thread. */ + if (avi->seg_event) + gst_event_unref (avi->seg_event); + if (avi->segment.rate > 0.0) { + /* forwards goes from last_stop to stop */ + avi->seg_event = gst_event_new_new_segment_full (FALSE, + avi->segment.rate, avi->segment.applied_rate, avi->segment.format, + avi->segment.last_stop, stop, avi->segment.time); + } else { +#ifdef AVIDEMUX_MODIFICATION + avi->segment.start = 0; + avi->segment.time = 0; +#endif + /* reverse goes from start to last_stop */ + avi->seg_event = gst_event_new_new_segment_full (FALSE, + avi->segment.rate, avi->segment.applied_rate, avi->segment.format, + avi->segment.start, avi->segment.last_stop, avi->segment.time); + } + + if (!avi->streaming) { + avi->segment_running = TRUE; + gst_pad_start_task (avi->sinkpad, (GstTaskFunction) gst_avi_demux_loop, + avi->sinkpad); + } + /* reset the last flow and mark discont, seek is always DISCONT */ + for (i = 0; i < avi->num_streams; i++) { + GST_DEBUG_OBJECT (avi, "marking DISCONT"); + avi->stream[i].last_flow = GST_FLOW_OK; + avi->stream[i].discont = TRUE; + } + GST_PAD_STREAM_UNLOCK (avi->sinkpad); + + return TRUE; + + /* ERRORS */ +no_format: + { + GST_DEBUG_OBJECT (avi, "unsupported format given, seek aborted."); + return FALSE; + } +} + +/* + * Handle seek event in push mode. + */ +static gboolean +avi_demux_handle_seek_push (GstAviDemux * avi, GstPad * pad, GstEvent * event) +{ + gdouble rate; + GstFormat format; + GstSeekFlags flags; + GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type; + gint64 cur, stop; + gboolean keyframe; + GstAviStream *stream; + guint index; + guint n, str_num; + guint64 min_offset; + GstSegment seeksegment; + gboolean update; + + /* check we have the index */ + if (!avi->have_index) { + GST_DEBUG_OBJECT (avi, "no seek index built, seek aborted."); + return FALSE; + } else { + GST_DEBUG_OBJECT (avi, "doing push-based seek with event"); + } + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + if (format != GST_FORMAT_TIME) { + GstFormat fmt = GST_FORMAT_TIME; + gboolean res = TRUE; + + if (cur_type != GST_SEEK_TYPE_NONE) + res = gst_pad_query_convert (pad, format, cur, &fmt, &cur); + if (res && stop_type != GST_SEEK_TYPE_NONE) + res = gst_pad_query_convert (pad, format, stop, &fmt, &stop); + if (!res) { + GST_DEBUG_OBJECT (avi, "unsupported format given, seek aborted."); + return FALSE; + } + + format = fmt; + } + + /* let gst_segment handle any tricky stuff */ + GST_DEBUG_OBJECT (avi, "configuring seek"); + memcpy (&seeksegment, &avi->segment, sizeof (GstSegment)); + gst_segment_set_seek (&seeksegment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + + keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT); + cur = seeksegment.last_stop; + + GST_DEBUG_OBJECT (avi, + "Seek requested: ts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT + ", kf %u, rate %lf", GST_TIME_ARGS (cur), GST_TIME_ARGS (stop), keyframe, + rate); + + if (rate < 0) { + GST_DEBUG_OBJECT (avi, "negative rate seek not supported in push mode"); + return FALSE; + } + + /* FIXME, this code assumes the main stream with keyframes is stream 0, + * which is mostly correct... */ + str_num = avi->main_stream; + stream = &avi->stream[str_num]; + + /* get the entry index for the requested position */ + index = gst_avi_demux_index_for_time (avi, stream, cur); + GST_DEBUG_OBJECT (avi, "str %u: Found entry %u for %" GST_TIME_FORMAT, + str_num, index, GST_TIME_ARGS (cur)); + + /* check if we are already on a keyframe */ + if (!ENTRY_IS_KEYFRAME (&stream->index[index])) { + GST_DEBUG_OBJECT (avi, "Entry is not a keyframe - searching back"); + /* now go to the previous keyframe, this is where we should start + * decoding from. */ + index = gst_avi_demux_index_prev (avi, stream, index, TRUE); + GST_DEBUG_OBJECT (avi, "Found previous keyframe at %u", index); + } + + gst_avi_demux_get_buffer_info (avi, stream, index, + &stream->current_timestamp, &stream->current_ts_end, + &stream->current_offset, &stream->current_offset_end); + + /* re-use cur to be the timestamp of the seek as it _will_ be */ + cur = stream->current_timestamp; + + min_offset = stream->index[index].offset; + avi->seek_kf_offset = min_offset - 8; + + GST_DEBUG_OBJECT (avi, + "Seek to: ts %" GST_TIME_FORMAT " (on str %u, idx %u, offset %" + G_GUINT64_FORMAT ")", GST_TIME_ARGS (stream->current_timestamp), str_num, + index, min_offset); + + for (n = 0; n < avi->num_streams; n++) { + GstAviStream *str = &avi->stream[n]; + guint idx; + + if (n == avi->main_stream) + continue; + + /* get the entry index for the requested position */ + idx = gst_avi_demux_index_for_time (avi, str, cur); + GST_DEBUG_OBJECT (avi, "str %u: Found entry %u for %" GST_TIME_FORMAT, n, + idx, GST_TIME_ARGS (cur)); + + /* check if we are already on a keyframe */ + if (!ENTRY_IS_KEYFRAME (&str->index[idx])) { + GST_DEBUG_OBJECT (avi, "Entry is not a keyframe - searching back"); + /* now go to the previous keyframe, this is where we should start + * decoding from. */ + idx = gst_avi_demux_index_prev (avi, str, idx, TRUE); + GST_DEBUG_OBJECT (avi, "Found previous keyframe at %u", idx); + } + + gst_avi_demux_get_buffer_info (avi, str, idx, + &str->current_timestamp, &str->current_ts_end, + &str->current_offset, &str->current_offset_end); + + if (str->index[idx].offset < min_offset) { + min_offset = str->index[idx].offset; + GST_DEBUG_OBJECT (avi, + "Found an earlier offset at %" G_GUINT64_FORMAT ", str %u", + min_offset, n); + str_num = n; + stream = str; + index = idx; + } + } + + GST_DEBUG_OBJECT (avi, + "Seek performed: str %u, offset %" G_GUINT64_FORMAT ", idx %u, ts %" + GST_TIME_FORMAT ", ts_end %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT + ", off_end %" G_GUINT64_FORMAT, str_num, min_offset, index, + GST_TIME_ARGS (stream->current_timestamp), + GST_TIME_ARGS (stream->current_ts_end), stream->current_offset, + stream->current_offset_end); + + /* index data refers to data, not chunk header (for pull mode convenience) */ + min_offset -= 8; + GST_DEBUG_OBJECT (avi, "seeking to chunk at offset %" G_GUINT64_FORMAT, + min_offset); + + if (!perform_seek_to_offset (avi, min_offset)) { + GST_DEBUG_OBJECT (avi, "seek event failed!"); + return FALSE; + } + + return TRUE; +} + +/* + * Handle whether we can perform the seek event or if we have to let the chain + * function handle seeks to build the seek indexes first. + */ +static gboolean +gst_avi_demux_handle_seek_push (GstAviDemux * avi, GstPad * pad, + GstEvent * event) +{ + /* check for having parsed index already */ + if (!avi->have_index) { + guint64 offset = 0; + gboolean building_index; + + GST_OBJECT_LOCK (avi); + /* handle the seek event in the chain function */ + avi->state = GST_AVI_DEMUX_SEEK; + + /* copy the event */ + if (avi->seek_event) + gst_event_unref (avi->seek_event); + avi->seek_event = gst_event_ref (event); + + /* set the building_index flag so that only one thread can setup the + * structures for index seeking. */ + building_index = avi->building_index; + if (!building_index) { + avi->building_index = TRUE; + if (avi->stream[0].indexes) { + avi->odml_stream = 0; + avi->odml_subidxs = avi->stream[avi->odml_stream].indexes; + offset = avi->odml_subidxs[0]; + } else { + offset = avi->idx1_offset; + } + } + GST_OBJECT_UNLOCK (avi); + + if (!building_index) { + /* seek to the first subindex or legacy index */ + GST_INFO_OBJECT (avi, + "Seeking to legacy index/first subindex at %" G_GUINT64_FORMAT, + offset); + return perform_seek_to_offset (avi, offset); + } + + /* FIXME: we have to always return true so that we don't block the seek + * thread. + * Note: maybe it is OK to return true if we're still building the index */ + return TRUE; + } + + return avi_demux_handle_seek_push (avi, pad, event); +} + +/* + * Helper for gst_avi_demux_invert() + */ +static inline void +swap_line (guint8 * d1, guint8 * d2, guint8 * tmp, gint bytes) +{ + memcpy (tmp, d1, bytes); + memcpy (d1, d2, bytes); + memcpy (d2, tmp, bytes); +} + + +#define gst_avi_demux_is_uncompressed(fourcc) \ + (fourcc && \ + (fourcc == GST_RIFF_DIB || \ + fourcc == GST_RIFF_rgb || \ + fourcc == GST_RIFF_RGB || fourcc == GST_RIFF_RAW)) + +/* + * Invert DIB buffers... Takes existing buffer and + * returns either the buffer or a new one (with old + * one dereferenced). + * FIXME: can't we preallocate tmp? and remember stride, bpp? + */ +static GstBuffer * +gst_avi_demux_invert (GstAviStream * stream, GstBuffer * buf) +{ + GstStructure *s; + gint y, w, h; + gint bpp, stride; + guint8 *tmp = NULL; + + if (stream->strh->type != GST_RIFF_FCC_vids) + return buf; + + if (!gst_avi_demux_is_uncompressed (stream->strh->fcc_handler)) { + return buf; /* Ignore non DIB buffers */ + } + + s = gst_caps_get_structure (GST_PAD_CAPS (stream->pad), 0); + if (!gst_structure_get_int (s, "bpp", &bpp)) { + GST_WARNING ("Failed to retrieve depth from caps"); + return buf; + } + + if (stream->strf.vids == NULL) { + GST_WARNING ("Failed to retrieve vids for stream"); + return buf; + } + + h = stream->strf.vids->height; + w = stream->strf.vids->width; + stride = GST_ROUND_UP_4 (w * (bpp / 8)); + + buf = gst_buffer_make_writable (buf); + if (GST_BUFFER_SIZE (buf) < (stride * h)) { + GST_WARNING ("Buffer is smaller than reported Width x Height x Depth"); + return buf; + } + + tmp = g_malloc (stride); + + for (y = 0; y < h / 2; y++) { + swap_line (GST_BUFFER_DATA (buf) + stride * y, + GST_BUFFER_DATA (buf) + stride * (h - 1 - y), tmp, stride); + } + + g_free (tmp); + + return buf; +} + +static void +gst_avi_demux_add_assoc (GstAviDemux * avi, GstAviStream * stream, + GstClockTime timestamp, guint64 offset, gboolean keyframe) +{ + /* do not add indefinitely for open-ended streaming */ + if (G_UNLIKELY (avi->element_index && avi->seekable)) { + GST_LOG_OBJECT (avi, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT, GST_TIME_ARGS (timestamp), offset); + gst_index_add_association (avi->element_index, avi->index_id, + keyframe ? GST_ASSOCIATION_FLAG_KEY_UNIT : + GST_ASSOCIATION_FLAG_DELTA_UNIT, GST_FORMAT_TIME, timestamp, + GST_FORMAT_BYTES, offset, NULL); + /* current_entry is DEFAULT (frame #) */ + gst_index_add_association (avi->element_index, stream->index_id, + keyframe ? GST_ASSOCIATION_FLAG_KEY_UNIT : + GST_ASSOCIATION_FLAG_DELTA_UNIT, GST_FORMAT_TIME, timestamp, + GST_FORMAT_BYTES, offset, GST_FORMAT_DEFAULT, stream->current_entry, + NULL); + } +} + +/* + * Returns the aggregated GstFlowReturn. + */ +static GstFlowReturn +gst_avi_demux_combine_flows (GstAviDemux * avi, GstAviStream * stream, + GstFlowReturn ret) +{ + guint i; + gboolean unexpected = FALSE, not_linked = TRUE; + + /* store the value */ + stream->last_flow = ret; + + /* any other error that is not-linked or eos can be returned right away */ + if (G_LIKELY (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_NOT_LINKED)) + goto done; + + /* only return NOT_LINKED if all other pads returned NOT_LINKED */ + for (i = 0; i < avi->num_streams; i++) { + GstAviStream *ostream = &avi->stream[i]; + + ret = ostream->last_flow; + /* no unexpected or unlinked, return */ + if (G_LIKELY (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_NOT_LINKED)) + goto done; + + /* we check to see if we have at least 1 unexpected or all unlinked */ + unexpected |= (ret == GST_FLOW_UNEXPECTED); + not_linked &= (ret == GST_FLOW_NOT_LINKED); + } + /* when we get here, we all have unlinked or unexpected */ + if (not_linked) + ret = GST_FLOW_NOT_LINKED; + else if (unexpected) + ret = GST_FLOW_UNEXPECTED; +done: + GST_LOG_OBJECT (avi, "combined %s to return %s", + gst_flow_get_name (stream->last_flow), gst_flow_get_name (ret)); + return ret; +} + +/* move @stream to the next position in its index */ +static GstFlowReturn +gst_avi_demux_advance (GstAviDemux * avi, GstAviStream * stream, + GstFlowReturn ret) +{ + guint old_entry, new_entry; + + old_entry = stream->current_entry; + /* move forwards */ + new_entry = old_entry + 1; + + /* see if we reached the end */ + if (new_entry >= stream->stop_entry) { + if (avi->segment.rate < 0.0) { + +#ifdef AVIDEMUX_MODIFICATION + GST_DEBUG_OBJECT (avi, "backward reached stop %u", stream->stop_entry); + goto eos; +#else + if (stream->step_entry == stream->start_entry) { + /* we stepped all the way to the start, eos */ + GST_DEBUG_OBJECT (avi, "reverse reached start %u", stream->start_entry); + goto eos; + } + /* backwards, stop becomes step, find a new step */ + stream->stop_entry = stream->step_entry; + stream->step_entry = gst_avi_demux_index_prev (avi, stream, + stream->stop_entry, TRUE); + + GST_DEBUG_OBJECT (avi, + "reverse playback jump: start %u, step %u, stop %u", + stream->start_entry, stream->step_entry, stream->stop_entry); + + /* and start from the previous keyframe now */ + new_entry = stream->step_entry; +#endif + } else { + /* EOS */ + GST_DEBUG_OBJECT (avi, "forward reached stop %u", stream->stop_entry); + goto eos; + } + } + + if (new_entry != old_entry) { + stream->current_entry = new_entry; + stream->current_total = stream->index[new_entry].total; + + if (new_entry == old_entry + 1) { + GST_DEBUG_OBJECT (avi, "moved forwards from %u to %u", + old_entry, new_entry); + /* we simply moved one step forwards, reuse current info */ + stream->current_timestamp = stream->current_ts_end; + stream->current_offset = stream->current_offset_end; + gst_avi_demux_get_buffer_info (avi, stream, new_entry, + NULL, &stream->current_ts_end, NULL, &stream->current_offset_end); + } else { + /* we moved DISCONT, full update */ + gst_avi_demux_get_buffer_info (avi, stream, new_entry, + &stream->current_timestamp, &stream->current_ts_end, + &stream->current_offset, &stream->current_offset_end); + /* and MARK discont for this stream */ + stream->last_flow = GST_FLOW_OK; + stream->discont = TRUE; + GST_DEBUG_OBJECT (avi, "Moved from %u to %u, ts %" GST_TIME_FORMAT + ", ts_end %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT + ", off_end %" G_GUINT64_FORMAT, old_entry, new_entry, + GST_TIME_ARGS (stream->current_timestamp), + GST_TIME_ARGS (stream->current_ts_end), stream->current_offset, + stream->current_offset_end); + } + } + return ret; + + /* ERROR */ +eos: + { + GST_DEBUG_OBJECT (avi, "we are EOS"); + /* setting current_timestamp to -1 marks EOS */ + stream->current_timestamp = -1; + return GST_FLOW_UNEXPECTED; + } +} + +/* find the stream with the lowest current position when going forwards or with + * the highest position when going backwards, this is the stream + * we should push from next */ +static gint +gst_avi_demux_find_next (GstAviDemux * avi, gfloat rate) +{ + guint64 min_time, max_time; + guint stream_num, i; + + max_time = 0; + min_time = G_MAXUINT64; + stream_num = -1; + + for (i = 0; i < avi->num_streams; i++) { + guint64 position; + GstAviStream *stream; + + stream = &avi->stream[i]; + + /* ignore streams that finished */ + if (stream->last_flow == GST_FLOW_UNEXPECTED) + continue; + + position = stream->current_timestamp; + + /* position of -1 is EOS */ + if (position != -1) { +#ifdef AVIDEMUX_MODIFICATION + if (position < min_time) { + min_time = position; + stream_num = i; + } +#else + if (rate > 0.0 && position < min_time) { + min_time = position; + stream_num = i; + } else if (rate < 0.0 && position >= max_time) { + max_time = position; + stream_num = i; + } +#endif + } + } + return stream_num; +} + +static GstFlowReturn +gst_avi_demux_loop_data (GstAviDemux * avi) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint stream_num; + GstAviStream *stream; + gboolean processed = FALSE; + GstBuffer *buf; + guint64 offset, size; + GstClockTime timestamp, duration; + guint64 out_offset, out_offset_end; + gboolean keyframe; + GstAviIndexEntry *entry; + + do { + stream_num = gst_avi_demux_find_next (avi, avi->segment.rate); + + /* all are EOS */ + if (G_UNLIKELY (stream_num == -1)) { + GST_DEBUG_OBJECT (avi, "all streams are EOS"); + goto eos; + } + + /* we have the stream now */ + stream = &avi->stream[stream_num]; + + /* skip streams without pads */ + if (!stream->pad) { + GST_DEBUG_OBJECT (avi, "skipping entry from stream %d without pad", + stream_num); + goto next; + } + + /* get the timing info for the entry */ + timestamp = stream->current_timestamp; + duration = stream->current_ts_end - timestamp; + out_offset = stream->current_offset; + out_offset_end = stream->current_offset_end; + + /* get the entry data info */ + entry = &stream->index[stream->current_entry]; + offset = entry->offset; + size = entry->size; + keyframe = ENTRY_IS_KEYFRAME (entry); + + +#ifdef AVIDEMUX_MODIFICATION + /* Forward trickplay */ + if(avi->segment.rate > 1.0 && stream->strh->type == GST_RIFF_FCC_vids) { + gst_avidemux_forward_trickplay (avi, stream, ×tamp); + } else if(avi->segment.rate < 0.0 && stream->strh->type == GST_RIFF_FCC_vids) { + gst_avidemux_backward_trickplay (avi, stream, ×tamp); + } +#endif + + /* skip empty entries */ + if (size == 0) { + GST_DEBUG_OBJECT (avi, "Skipping entry %u (%" G_GUINT64_FORMAT ", %p)", + stream->current_entry, size, stream->pad); + goto next; + } + + if (avi->segment.rate > 0.0) { + /* only check this for fowards playback for now */ +#ifdef AVIDEMUX_MODIFICATION + if (GST_CLOCK_TIME_IS_VALID (avi->segment.stop) + && (timestamp > avi->segment.stop)) { +#else + if (keyframe && GST_CLOCK_TIME_IS_VALID (avi->segment.stop) + && (timestamp > avi->segment.stop)) { +#endif + goto eos_stop; + } + } + + GST_LOG ("reading buffer (size=%" G_GUINT64_FORMAT "), stream %d, pos %" + G_GUINT64_FORMAT " (0x%" G_GINT64_MODIFIER "x), kf %d", size, + stream_num, offset, offset, keyframe); + + /* FIXME, check large chunks and cut them up */ + + /* pull in the data */ + ret = gst_pad_pull_range (avi->sinkpad, offset, size, &buf); + if (ret != GST_FLOW_OK) + goto pull_failed; + + /* check for short buffers, this is EOS as well */ + if (GST_BUFFER_SIZE (buf) < size) + goto short_buffer; + + /* invert the picture if needed */ + buf = gst_avi_demux_invert (stream, buf); + + /* mark non-keyframes */ + if (keyframe) + GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DELTA_UNIT); + else + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); + + GST_BUFFER_TIMESTAMP (buf) = timestamp; + GST_BUFFER_DURATION (buf) = duration; + GST_BUFFER_OFFSET (buf) = out_offset; + GST_BUFFER_OFFSET_END (buf) = out_offset_end; + + /* mark discont when pending */ + if (stream->discont) { + GST_DEBUG_OBJECT (avi, "setting DISCONT flag"); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + + gst_avi_demux_add_assoc (avi, stream, timestamp, offset, keyframe); + + gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad)); + + /* update current position in the segment */ + gst_segment_set_last_stop (&avi->segment, GST_FORMAT_TIME, timestamp); +#ifdef AVIDEMUX_MODIFICATION + GST_DEBUG_OBJECT (avi, " %s : Pushing buffer of size %u, ts %" + GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT + ", off_end %" G_GUINT64_FORMAT, + stream_num ? "Audio" : "Video", GST_BUFFER_SIZE (buf), GST_TIME_ARGS (timestamp), + GST_TIME_ARGS (duration), out_offset, out_offset_end); +#else + GST_DEBUG_OBJECT (avi, "Pushing buffer of size %u, ts %" + GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT + ", off_end %" G_GUINT64_FORMAT, + GST_BUFFER_SIZE (buf), GST_TIME_ARGS (timestamp), + GST_TIME_ARGS (duration), out_offset, out_offset_end); +#endif + +#ifdef DIVX_DRM + +#define CHUNK_ID_LEN 4 +#define CHUNK_SIZE_LEN 4 +#define DD_CHUNK_DATA_LEN 10 +#define DD_CHUNK_TOTAL_LEN CHUNK_ID_LEN+CHUNK_SIZE_LEN+DD_CHUNK_DATA_LEN + + if (avi->drmContext)// this is drm + { + GstBuffer* encrypted_buf = NULL; + + if (stream->strh->type == GST_RIFF_FCC_auds) { /* Audio Stream */ + if (DRM_SUCCESS == avi->divx_decrypt_audio (avi->drmContext, GST_BUFFER_DATA(buf), GST_BUFFER_SIZE(buf))) { + GST_DEBUG_OBJECT (avi, "drmDecryptAudio() Success : buffer = %d", GST_BUFFER_SIZE(buf)); + } else { + GST_ERROR_OBJECT (avi, "drmDecryptAudio () Failed : buffer = %d", GST_BUFFER_SIZE(buf)); + } + ret = gst_pad_push (stream->pad, buf); + + } else if (stream->strh->type == GST_RIFF_FCC_vids) { /* Video Stream */ + + /* Read previous dd chunk */ + GstBuffer* dd_chunk_buf = NULL; + if (GST_FLOW_OK != gst_pad_pull_range (avi->sinkpad, + offset-(CHUNK_ID_LEN+CHUNK_SIZE_LEN+DD_CHUNK_TOTAL_LEN), + DD_CHUNK_TOTAL_LEN, &dd_chunk_buf)) { + GST_ERROR_OBJECT (avi, "pull range failed"); + } else { + guint8 tempBuffer[256] = { 0, }; + guint32 tempBufferLength = 0; + int ret; + + ret = avi->divx_prepare_video_bitstream (avi->drmContext, + GST_BUFFER_DATA(dd_chunk_buf)+(CHUNK_ID_LEN+CHUNK_SIZE_LEN), + DD_CHUNK_DATA_LEN, + tempBuffer, + &tempBufferLength ); + + if (ret == DRM_SUCCESS) { + /* Create new buffer and copy retrieved tempBuffer and original buffer to created buffer */ + encrypted_buf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE(buf)+tempBufferLength); + if (encrypted_buf) { + /* FIXME: Can be enhance merge buffer code */ + memcpy (GST_BUFFER_DATA(encrypted_buf), tempBuffer, tempBufferLength); + memcpy (GST_BUFFER_DATA(encrypted_buf)+tempBufferLength, GST_BUFFER_DATA(buf), GST_BUFFER_SIZE(buf)); + gst_buffer_copy_metadata (encrypted_buf, buf, GST_BUFFER_COPY_ALL); + + /* relase buf because we will push encrypted_buf instead of buf */ + gst_buffer_unref (buf); + } else { + GST_ERROR_OBJECT (avi, "gst_buffer_new_and_alloc() failed!!!!"); + } + } else { + GST_ERROR_OBJECT (avi, "divx_prepare_video_bitstream failed!!!! ret = [%d]", ret); + } + } + + /* Release DD-chunk Buffer */ + if (dd_chunk_buf) + gst_buffer_unref (dd_chunk_buf); + + /* Push encrypted_buf if is valid, otherwise push original buffer */ + if (encrypted_buf) + ret = gst_pad_push (stream->pad, encrypted_buf); + else + ret = gst_pad_push (stream->pad, buf); + } + } else { + /* This is normal file */ + ret = gst_pad_push (stream->pad, buf); + } +#else + ret = gst_pad_push (stream->pad, buf); +#endif // DIVX_DRM + + /* mark as processed, we increment the frame and byte counters then + * leave the while loop and return the GstFlowReturn */ + processed = TRUE; + + if (avi->segment.rate < 0) { + if (timestamp > avi->segment.stop && ret == GST_FLOW_UNEXPECTED) { + /* In reverse playback we can get a GST_FLOW_UNEXPECTED when + * we are at the end of the segment, so we just need to jump + * back to the previous section. */ + GST_DEBUG_OBJECT (avi, "downstream has reached end of segment"); + ret = GST_FLOW_OK; + } + } + next: + /* move to next item */ + ret = gst_avi_demux_advance (avi, stream, ret); + + /* combine flows */ + ret = gst_avi_demux_combine_flows (avi, stream, ret); + } while (!processed); + +beach: + return ret; + + /* special cases */ +eos: + { + GST_DEBUG_OBJECT (avi, "No samples left for any streams - EOS"); + ret = GST_FLOW_UNEXPECTED; + goto beach; + } +eos_stop: + { + GST_LOG_OBJECT (avi, "Found keyframe after segment," + " setting EOS (%" GST_TIME_FORMAT " > %" GST_TIME_FORMAT ")", + GST_TIME_ARGS (timestamp), GST_TIME_ARGS (avi->segment.stop)); + ret = GST_FLOW_UNEXPECTED; + /* move to next stream */ + goto next; + } +pull_failed: + { + GST_DEBUG_OBJECT (avi, "pull range failed: pos=%" G_GUINT64_FORMAT + " size=%" G_GUINT64_FORMAT, offset, size); + goto beach; + } +short_buffer: + { + GST_WARNING_OBJECT (avi, "Short read at offset %" G_GUINT64_FORMAT + ", only got %d/%" G_GUINT64_FORMAT " bytes (truncated file?)", offset, + GST_BUFFER_SIZE (buf), size); + gst_buffer_unref (buf); + ret = GST_FLOW_UNEXPECTED; + goto beach; + } +} + +/* + * Read data. If we have an index it delegates to + * gst_avi_demux_process_next_entry(). + */ +static GstFlowReturn +gst_avi_demux_stream_data (GstAviDemux * avi) +{ + guint32 tag = 0; + guint32 size = 0; + gint stream_nr = 0; + GstFlowReturn res = GST_FLOW_OK; + GstFormat format = GST_FORMAT_TIME; + + if (G_UNLIKELY (avi->have_eos)) { + /* Clean adapter, we're done */ + gst_adapter_clear (avi->adapter); + return GST_FLOW_UNEXPECTED; + } + + if (G_UNLIKELY (avi->todrop)) { + guint drop; + + if ((drop = gst_adapter_available (avi->adapter))) { + if (drop > avi->todrop) + drop = avi->todrop; + GST_DEBUG_OBJECT (avi, "Dropping %d bytes", drop); + gst_adapter_flush (avi->adapter, drop); + avi->todrop -= drop; + avi->offset += drop; + } + } + + /* Iterate until need more data, so adapter won't grow too much */ + while (1) { + if (G_UNLIKELY (!gst_avi_demux_peek_chunk_info (avi, &tag, &size))) { + return GST_FLOW_OK; + } + + GST_DEBUG ("Trying chunk (%" GST_FOURCC_FORMAT "), size %d", + GST_FOURCC_ARGS (tag), size); + + if (G_LIKELY ((tag & 0xff) >= '0' && (tag & 0xff) <= '9' && + ((tag >> 8) & 0xff) >= '0' && ((tag >> 8) & 0xff) <= '9')) { + GST_LOG ("Chunk ok"); + } else if ((tag & 0xffff) == (('x' << 8) | 'i')) { + GST_DEBUG ("Found sub-index tag"); + if (gst_avi_demux_peek_chunk (avi, &tag, &size) || size == 0) { + /* accept 0 size buffer here */ + avi->abort_buffering = FALSE; + GST_DEBUG (" skipping %d bytes for now", size); + gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); + } + return GST_FLOW_OK; + } else if (tag == GST_RIFF_TAG_RIFF) { + /* RIFF tags can appear in ODML files, just jump over them */ + if (gst_adapter_available (avi->adapter) >= 12) { + GST_DEBUG ("Found RIFF tag, skipping RIFF header"); + gst_adapter_flush (avi->adapter, 12); + continue; + } + return GST_FLOW_OK; + } else if (tag == GST_RIFF_TAG_idx1) { + GST_DEBUG ("Found index tag"); + if (gst_avi_demux_peek_chunk (avi, &tag, &size) || size == 0) { + /* accept 0 size buffer here */ + avi->abort_buffering = FALSE; + GST_DEBUG (" skipping %d bytes for now", size); + gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); + } + return GST_FLOW_OK; + } else if (tag == GST_RIFF_TAG_LIST) { + /* movi chunks might be grouped in rec list */ + if (gst_adapter_available (avi->adapter) >= 12) { + GST_DEBUG ("Found LIST tag, skipping LIST header"); + gst_adapter_flush (avi->adapter, 12); + continue; + } + return GST_FLOW_OK; + } else if (tag == GST_RIFF_TAG_JUNK || tag == GST_RIFF_TAG_JUNQ) { + /* rec list might contain JUNK chunks */ + GST_DEBUG ("Found JUNK tag"); + if (gst_avi_demux_peek_chunk (avi, &tag, &size) || size == 0) { + /* accept 0 size buffer here */ + avi->abort_buffering = FALSE; + GST_DEBUG (" skipping %d bytes for now", size); + gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); + } + return GST_FLOW_OK; + } else { + GST_DEBUG ("No more stream chunks, send EOS"); + avi->have_eos = TRUE; + return GST_FLOW_UNEXPECTED; + } + + if (G_UNLIKELY (!gst_avi_demux_peek_chunk (avi, &tag, &size))) { + /* supposedly one hopes to catch a nicer chunk later on ... */ + /* FIXME ?? give up here rather than possibly ending up going + * through the whole file */ + if (avi->abort_buffering) { + avi->abort_buffering = FALSE; + if (size) { + gst_adapter_flush (avi->adapter, 8); + return GST_FLOW_OK; + } + } else { + return GST_FLOW_OK; + } + } + GST_DEBUG ("chunk ID %" GST_FOURCC_FORMAT ", size %u", + GST_FOURCC_ARGS (tag), size); + + stream_nr = CHUNKID_TO_STREAMNR (tag); + + if (G_UNLIKELY (stream_nr < 0 || stream_nr >= avi->num_streams)) { + /* recoverable */ + GST_WARNING ("Invalid stream ID %d (%" GST_FOURCC_FORMAT ")", + stream_nr, GST_FOURCC_ARGS (tag)); + avi->offset += 8 + GST_ROUND_UP_2 (size); + gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); + } else { + GstAviStream *stream; + GstClockTime next_ts = 0; + GstBuffer *buf = NULL; + guint64 offset; + gboolean saw_desired_kf = stream_nr != avi->main_stream + || avi->offset >= avi->seek_kf_offset; + + if (stream_nr == avi->main_stream && avi->offset == avi->seek_kf_offset) { + GST_DEBUG_OBJECT (avi, "Desired keyframe reached"); + avi->seek_kf_offset = 0; + } + + if (saw_desired_kf) { + gst_adapter_flush (avi->adapter, 8); + /* get buffer */ + if (size) { + buf = gst_adapter_take_buffer (avi->adapter, GST_ROUND_UP_2 (size)); + /* patch the size */ + GST_BUFFER_SIZE (buf) = size; + } else { + buf = NULL; + } + } else { + GST_DEBUG_OBJECT (avi, + "Desired keyframe not yet reached, flushing chunk"); + gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); + } + + offset = avi->offset; + avi->offset += 8 + GST_ROUND_UP_2 (size); + + stream = &avi->stream[stream_nr]; + + /* set delay (if any) + if (stream->strh->init_frames == stream->current_frame && + stream->delay == 0) + stream->delay = next_ts; + */ + + /* parsing of corresponding header may have failed */ + if (G_UNLIKELY (!stream->pad)) { + GST_WARNING_OBJECT (avi, "no pad for stream ID %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (tag)); + if (buf) + gst_buffer_unref (buf); + } else { + /* get time of this buffer */ + gst_pad_query_position (stream->pad, &format, (gint64 *) & next_ts); + if (G_UNLIKELY (format != GST_FORMAT_TIME)) + goto wrong_format; + + gst_avi_demux_add_assoc (avi, stream, next_ts, offset, FALSE); + + /* increment our positions */ + stream->current_entry++; + stream->current_total += size; + + /* update current position in the segment */ + gst_segment_set_last_stop (&avi->segment, GST_FORMAT_TIME, next_ts); + + if (saw_desired_kf && buf) { + GstClockTime dur_ts = 0; + + /* invert the picture if needed */ + buf = gst_avi_demux_invert (stream, buf); + + gst_pad_query_position (stream->pad, &format, (gint64 *) & dur_ts); + if (G_UNLIKELY (format != GST_FORMAT_TIME)) + goto wrong_format; + + GST_BUFFER_TIMESTAMP (buf) = next_ts; + GST_BUFFER_DURATION (buf) = dur_ts - next_ts; + if (stream->strh->type == GST_RIFF_FCC_vids) { + GST_BUFFER_OFFSET (buf) = stream->current_entry - 1; + GST_BUFFER_OFFSET_END (buf) = stream->current_entry; + } else { + GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE; + GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE; + } + + gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad)); + GST_DEBUG_OBJECT (avi, + "Pushing buffer with time=%" GST_TIME_FORMAT ", duration %" + GST_TIME_FORMAT ", offset %" G_GUINT64_FORMAT + " and size %d over pad %s", GST_TIME_ARGS (next_ts), + GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), + GST_BUFFER_OFFSET (buf), size, GST_PAD_NAME (stream->pad)); + + /* mark discont when pending */ + if (G_UNLIKELY (stream->discont)) { + GST_DEBUG_OBJECT (avi, "Setting DISCONT"); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + res = gst_pad_push (stream->pad, buf); + buf = NULL; + + /* combine flows */ + res = gst_avi_demux_combine_flows (avi, stream, res); + if (G_UNLIKELY (res != GST_FLOW_OK)) { + GST_DEBUG ("Push failed; %s", gst_flow_get_name (res)); + return res; + } + } + } + } + } + +done: + return res; + + /* ERRORS */ +wrong_format: + { + GST_DEBUG_OBJECT (avi, "format %s != GST_FORMAT_TIME", + gst_format_get_name (format)); + res = GST_FLOW_ERROR; + goto done; + } +} + +/* + * Send pending tags. + */ +static void +push_tag_lists (GstAviDemux * avi) +{ + guint i; + GstTagList *tags; + + if (!avi->got_tags) + return; + + GST_DEBUG_OBJECT (avi, "Pushing pending tag lists"); + + for (i = 0; i < avi->num_streams; i++) { + GstAviStream *stream = &avi->stream[i]; + GstPad *pad = stream->pad; + + tags = stream->taglist; + + if (pad && tags) { + GST_DEBUG_OBJECT (pad, "Tags: %" GST_PTR_FORMAT, tags); + + gst_element_found_tags_for_pad (GST_ELEMENT_CAST (avi), pad, tags); + stream->taglist = NULL; + } + } + + if (!(tags = avi->globaltags)) + tags = gst_tag_list_new (); + + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_CONTAINER_FORMAT, "AVI", NULL); + + GST_DEBUG_OBJECT (avi, "Global tags: %" GST_PTR_FORMAT, tags); + gst_element_found_tags (GST_ELEMENT_CAST (avi), tags); + avi->globaltags = NULL; + avi->got_tags = FALSE; +} + +static void +gst_avi_demux_loop (GstPad * pad) +{ + GstFlowReturn res; + GstAviDemux *avi = GST_AVI_DEMUX (GST_PAD_PARENT (pad)); + + switch (avi->state) { + case GST_AVI_DEMUX_START: + res = gst_avi_demux_stream_init_pull (avi); + if (G_UNLIKELY (res != GST_FLOW_OK)) { + GST_WARNING ("stream_init flow: %s", gst_flow_get_name (res)); + goto pause; + } + avi->state = GST_AVI_DEMUX_HEADER; + /* fall-through */ + case GST_AVI_DEMUX_HEADER: + res = gst_avi_demux_stream_header_pull (avi); + if (G_UNLIKELY (res != GST_FLOW_OK)) { + GST_WARNING ("stream_header flow: %s", gst_flow_get_name (res)); + goto pause; + } +#ifdef DIVX_DRM + /* Send tag to decoder, so decoder can knows that this is divx drm file */ + if (avi->drmContext) + gst_avi_demux_send_divx_tag (avi); +#endif + + avi->state = GST_AVI_DEMUX_MOVI; + break; + case GST_AVI_DEMUX_MOVI: + if (G_UNLIKELY (avi->close_seg_event)) { + gst_avi_demux_push_event (avi, avi->close_seg_event); + avi->close_seg_event = NULL; + } + if (G_UNLIKELY (avi->seg_event)) { + gst_avi_demux_push_event (avi, avi->seg_event); + avi->seg_event = NULL; + } + if (G_UNLIKELY (avi->got_tags)) { + push_tag_lists (avi); + } + /* process each index entry in turn */ + res = gst_avi_demux_loop_data (avi); + +#ifdef AVIDEMUX_MODIFICATION + if (avi->segment.rate < 0.0 && res == GST_FLOW_UNEXPECTED) { + GST_DEBUG_OBJECT(avi, "Seeking to previous keyframe"); + res = gst_avidemux_seek_to_previous_keyframe (avi); + } +#endif + + /* pause when error */ + if (G_UNLIKELY (res != GST_FLOW_OK)) { + GST_INFO ("stream_movi flow: %s", gst_flow_get_name (res)); + goto pause; + } + break; + default: + GST_ERROR_OBJECT (avi, "unknown state %d", avi->state); + res = GST_FLOW_ERROR; + goto pause; + } + + return; + + /* ERRORS */ +pause:{ + + gboolean push_eos = FALSE; + GST_LOG_OBJECT (avi, "pausing task, reason %s", gst_flow_get_name (res)); + avi->segment_running = FALSE; + gst_pad_pause_task (avi->sinkpad); + + + if (res == GST_FLOW_UNEXPECTED) { + /* handle end-of-stream/segment */ + if (avi->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gint64 stop; + + if ((stop = avi->segment.stop) == -1) + stop = avi->segment.duration; + + GST_INFO_OBJECT (avi, "sending segment_done"); + +#ifdef AVIDEMUX_MODIFICATION + if (avi->segment.rate >= 0) { + /* Sending segment done at the end of segment */ + gst_element_post_message(GST_ELEMENT_CAST (avi), + gst_message_new_segment_done (GST_OBJECT_CAST (avi), GST_FORMAT_TIME, stop)); + } else { + /* Sending segment done at the start of segment */ + gst_element_post_message(GST_ELEMENT_CAST (avi), + gst_message_new_segment_done (GST_OBJECT_CAST (avi), GST_FORMAT_TIME, avi->segment.start)); + } +#else + gst_element_post_message + (GST_ELEMENT_CAST (avi), + gst_message_new_segment_done (GST_OBJECT_CAST (avi), + GST_FORMAT_TIME, stop)); +#endif + } else { + push_eos = TRUE; + } + } else if (res == GST_FLOW_NOT_LINKED || res < GST_FLOW_UNEXPECTED) { + /* for fatal errors we post an error message, wrong-state is + * not fatal because it happens due to flushes and only means + * that we should stop now. */ + GST_ELEMENT_ERROR (avi, STREAM, FAILED, + (_("Internal data stream error.")), + ("streaming stopped, reason %s", gst_flow_get_name (res))); + push_eos = TRUE; + } + if (push_eos) { + GST_INFO_OBJECT (avi, "sending eos"); + if (!gst_avi_demux_push_event (avi, gst_event_new_eos ()) && + (res == GST_FLOW_UNEXPECTED)) { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, + (NULL), ("got eos but no streams (yet)")); + } + } + } +} + + +static GstFlowReturn +gst_avi_demux_chain (GstPad * pad, GstBuffer * buf) +{ + GstFlowReturn res; + GstAviDemux *avi = GST_AVI_DEMUX (GST_PAD_PARENT (pad)); + gint i; + + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_DEBUG_OBJECT (avi, "got DISCONT"); + gst_adapter_clear (avi->adapter); + /* mark all streams DISCONT */ + for (i = 0; i < avi->num_streams; i++) + avi->stream[i].discont = TRUE; + } + + GST_DEBUG ("Store %d bytes in adapter", GST_BUFFER_SIZE (buf)); + gst_adapter_push (avi->adapter, buf); + + switch (avi->state) { + case GST_AVI_DEMUX_START: + if ((res = gst_avi_demux_stream_init_push (avi)) != GST_FLOW_OK) { + GST_WARNING ("stream_init flow: %s", gst_flow_get_name (res)); + break; + } + break; + case GST_AVI_DEMUX_HEADER: + if ((res = gst_avi_demux_stream_header_push (avi)) != GST_FLOW_OK) { + GST_WARNING ("stream_header flow: %s", gst_flow_get_name (res)); + break; + } + break; + case GST_AVI_DEMUX_MOVI: + if (G_UNLIKELY (avi->close_seg_event)) { + gst_avi_demux_push_event (avi, avi->close_seg_event); + avi->close_seg_event = NULL; + } + if (G_UNLIKELY (avi->seg_event)) { + gst_avi_demux_push_event (avi, avi->seg_event); + avi->seg_event = NULL; + } + if (G_UNLIKELY (avi->got_tags)) { + push_tag_lists (avi); + } + res = gst_avi_demux_stream_data (avi); + break; + case GST_AVI_DEMUX_SEEK: + { + GstEvent *event; + + res = GST_FLOW_OK; + + /* obtain and parse indexes */ + if (avi->stream[0].indexes && !gst_avi_demux_read_subindexes_push (avi)) + /* seek in subindex read function failed */ + goto index_failed; + + if (!avi->stream[0].indexes && !avi->have_index + && avi->avih->flags & GST_RIFF_AVIH_HASINDEX) + gst_avi_demux_stream_index_push (avi); + + if (avi->have_index) { + /* use the indexes now to construct nice durations */ + gst_avi_demux_calculate_durations_from_index (avi); + } else { + /* still parsing indexes */ + break; + } + + GST_OBJECT_LOCK (avi); + event = avi->seek_event; + avi->seek_event = NULL; + GST_OBJECT_UNLOCK (avi); + + /* calculate and perform seek */ + if (!avi_demux_handle_seek_push (avi, avi->sinkpad, event)) + goto seek_failed; + + gst_event_unref (event); + avi->state = GST_AVI_DEMUX_MOVI; + break; + } + default: + GST_ELEMENT_ERROR (avi, STREAM, FAILED, (NULL), + ("Illegal internal state")); + res = GST_FLOW_ERROR; + break; + } + + GST_DEBUG_OBJECT (avi, "state: %d res:%s", avi->state, + gst_flow_get_name (res)); + + if (G_UNLIKELY (avi->abort_buffering)) + goto abort_buffering; + + return res; + + /* ERRORS */ +index_failed: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("failed to read indexes")); + return GST_FLOW_ERROR; + } +seek_failed: + { + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("push mode seek failed")); + return GST_FLOW_ERROR; + } +abort_buffering: + { + avi->abort_buffering = FALSE; + GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("unhandled buffer size")); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_avi_demux_sink_activate (GstPad * sinkpad) +{ + if (gst_pad_check_pull_range (sinkpad)) { + GST_DEBUG ("going to pull mode"); + return gst_pad_activate_pull (sinkpad, TRUE); + } else { + GST_DEBUG ("going to push (streaming) mode"); + return gst_pad_activate_push (sinkpad, TRUE); + } +} + +static gboolean +gst_avi_demux_sink_activate_pull (GstPad * sinkpad, gboolean active) +{ + GstAviDemux *avi = GST_AVI_DEMUX (GST_OBJECT_PARENT (sinkpad)); + + if (active) { + avi->segment_running = TRUE; + avi->streaming = FALSE; + return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_avi_demux_loop, + sinkpad); + } else { + avi->segment_running = FALSE; + return gst_pad_stop_task (sinkpad); + } +} + +static gboolean +gst_avi_demux_activate_push (GstPad * pad, gboolean active) +{ + GstAviDemux *avi = GST_AVI_DEMUX (GST_OBJECT_PARENT (pad)); + + if (active) { + GST_DEBUG ("avi: activating push/chain function"); + avi->streaming = TRUE; +#if 0 + /* create index for some push based seeking if not provided */ + GST_OBJECT_LOCK (avi); + if (!avi->element_index) { + GST_DEBUG_OBJECT (avi, "creating index"); + avi->element_index = gst_index_factory_make ("memindex"); + } + GST_OBJECT_UNLOCK (avi); + /* object lock might be taken again */ + gst_index_get_writer_id (avi->element_index, GST_OBJECT_CAST (avi), + &avi->index_id); +#endif + } else { + GST_DEBUG ("avi: deactivating push/chain function"); + } + + return TRUE; +} + +static void +gst_avi_demux_set_index (GstElement * element, GstIndex * index) +{ + GstAviDemux *avi = GST_AVI_DEMUX (element); + + GST_OBJECT_LOCK (avi); + if (avi->element_index) + gst_object_unref (avi->element_index); + if (index) { + avi->element_index = gst_object_ref (index); + } else { + avi->element_index = NULL; + } + GST_OBJECT_UNLOCK (avi); + /* object lock might be taken again */ + if (index) + gst_index_get_writer_id (index, GST_OBJECT_CAST (element), &avi->index_id); + GST_DEBUG_OBJECT (avi, "Set index %" GST_PTR_FORMAT, avi->element_index); +} + +static GstIndex * +gst_avi_demux_get_index (GstElement * element) +{ + GstIndex *result = NULL; + GstAviDemux *avi = GST_AVI_DEMUX (element); + + GST_OBJECT_LOCK (avi); + if (avi->element_index) + result = gst_object_ref (avi->element_index); + GST_OBJECT_UNLOCK (avi); + + GST_DEBUG_OBJECT (avi, "Returning index %" GST_PTR_FORMAT, result); + + return result; +} + +static GstStateChangeReturn +gst_avi_demux_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstAviDemux *avi = GST_AVI_DEMUX (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + avi->streaming = FALSE; + gst_segment_init (&avi->segment, GST_FORMAT_TIME); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + goto done; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + avi->have_index = FALSE; + gst_avi_demux_reset (avi); + break; + default: + break; + } + +done: + return ret; +} +#ifdef AVIDEMUX_MODIFICATION +/*Modification: Added function to find out the frame_type for index-table generation */ + +static int +gst_avi_demux_find_frame_type (GstAviStream *stream, GstBuffer *buf, int *frame_type) +{ + unsigned char *buff = NULL; + unsigned int buff_len = 0; + + if (!stream || !buf || !frame_type) { + GST_ERROR ("Invalid arguments.."); + return -1; + } + + buff = GST_BUFFER_DATA (buf); + buff_len = GST_BUFFER_SIZE (buf); + + if ((NULL == buff) || buff_len < 5) { + GST_ERROR ("Invalid buffer..."); + return -1; + } + + switch (stream->strh->fcc_handler) { + /* mpeg stream parsing case */ + case GST_MAKE_FOURCC ('X', 'V', 'I', 'D'): + case GST_MAKE_FOURCC ('x', 'v', 'i', 'd'): + case GST_MAKE_FOURCC ('D', 'X', '5', '0'): + case GST_MAKE_FOURCC ('d', 'i', 'v', 'x'): + case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'): + case GST_MAKE_FOURCC ('B', 'L', 'Z', '0'): + case GST_MAKE_FOURCC ('F', 'M', 'P', '4'): + case GST_MAKE_FOURCC ('U', 'M', 'P', '4'): + case GST_MAKE_FOURCC ('F', 'F', 'D', 'S'): + case GST_MAKE_FOURCC ('M', 'P', 'E', 'G'): + case GST_MAKE_FOURCC ('M', 'P', 'G', 'I'): + case GST_MAKE_FOURCC ('m', 'p', 'g', '1'): + case GST_MAKE_FOURCC ('M', 'P', 'G', '1'): + case GST_MAKE_FOURCC ('P', 'I', 'M', '1'): + case GST_MAKE_FOURCC ('M', 'P', 'G', '2'): + case GST_MAKE_FOURCC ('m', 'p', 'g', '2'): + case GST_MAKE_FOURCC ('P', 'I', 'M', '2'): + case GST_MAKE_FOURCC ('D', 'V', 'R', ' '): { + int idx = 0; + gboolean found_vop_code = FALSE; + + for (idx=0; idx< (buff_len-4); idx++) { + /* Find VOP start frame which should be in every frame */ + if (buff[idx] == 0x00 && buff[idx+1] == 0x00 && buff[idx+2] == 0x01 && buff[idx+3] == 0xB6) { + GST_DEBUG ("Found VOP start code..."); + found_vop_code = TRUE; + break; + } + } + + if (!found_vop_code) { + GST_ERROR ("Invalid input stream : There isn't any VOP header"); + return -1; + } + + if ((buff[idx] == 0x00) && (buff[idx+1] == 0x00) && (buff[idx+2] == 0x01)) { + if(buff[idx+3] == 0xB6) { + switch (buff[idx+4] & 0xC0) { + case 0x00: + GST_DEBUG ("Found Key-Frame"); + *frame_type = GST_AVI_KEYFRAME; + break; + default: + GST_DEBUG ("Found Non-Key frame.. value = %x", buff[idx+4]); + *frame_type = GST_AVI_NON_KEYFRAME; + break; + } + } + } + } + break; + case GST_MAKE_FOURCC ('H', '2', '6', '3'): + case GST_MAKE_FOURCC ('h', '2', '6', '3'): + case GST_MAKE_FOURCC ('i', '2', '6', '3'): + case GST_MAKE_FOURCC ('U', '2', '6', '3'): + case GST_MAKE_FOURCC ('v', 'i', 'v', '1'): + case GST_MAKE_FOURCC ('T', '2', '6', '3'): { + /* FIXME: H263 Frame Parsing is yet to be done.*/ + *frame_type = GST_AVI_KEYFRAME; + } + break; + case GST_MAKE_FOURCC ('X', '2', '6', '4'): + case GST_MAKE_FOURCC ('x', '2', '6', '4'): + case GST_MAKE_FOURCC ('H', '2', '6', '4'): + case GST_MAKE_FOURCC ('h', '2', '6', '4'): + case GST_MAKE_FOURCC ('a', 'v', 'c', '1'): + case GST_MAKE_FOURCC ('A', 'V', 'C', '1'): { + gint idx = 0; + gint nalu_type = H264_NUT_UNKNOWN; + + /* H264 Frame Parsing */ + do { + if (buff[idx+0] == 0x00 && + buff[idx+1] == 0x00 && + ((buff [idx+2] == 0x01) || ((buff [idx+2] == 0x00) && (buff [idx+3] == 0x01)))) { + + if (buff [idx+2] == 0x01) { + nalu_type = buff[idx +3] & 0x1f; + } else if ((buff [idx+2] == 0x00) && (buff [idx+3] == 0x01)) { + nalu_type = buff[idx +4] & 0x1f; + idx++; + } + + if ((nalu_type == H264_NUT_SPS) || + (nalu_type == H264_NUT_PPS) || + (nalu_type == H264_NUT_SEI) || + (nalu_type == H264_NUT_AUD)) { + GST_LOG ("Skipping NALU SPS/PPS/SEI/AUD..."); + } else if (nalu_type == H264_NUT_IDR) { + GST_DEBUG ("Found KEY frame...\n"); + *frame_type = GST_AVI_KEYFRAME; + break; + } else if ((nalu_type == H264_NUT_SLICE) || + (nalu_type == H264_NUT_DPA) || + (nalu_type == H264_NUT_DPB) || + (nalu_type == H264_NUT_DPC) || + (nalu_type == H264_NUT_EOSEQ) || + (nalu_type == H264_NUT_EOSTREAM)) { + *frame_type = GST_AVI_NON_KEYFRAME; + break; + } else { + GST_DEBUG ("Unknown frame type, val = %d...", *frame_type); + *frame_type = GST_AVI_NON_KEYFRAME; + break; + } + } + idx++; + }while (idx < (buff_len - 4)); + } + break; + default: + //default make all frames as key frames + *frame_type = GST_AVI_KEYFRAME; + break; + } + + return 0; + +} + +static void gst_avidemux_forward_trickplay (GstAviDemux * avi, GstAviStream * stream, guint64 *timestamp) +{ + guint32 nsamples = 0; /* Number of samples between two consecutive keyframes */ + guint64 next_kindex_timestamp; + guint64 prev_kindex_timestamp; + + if (*timestamp < stream->trickplay_info->start_pos) { + GST_LOG_OBJECT (avi, "Received shown sample... not applying trickplay algo"); + return; + } + + if (stream->trickplay_info->next_kidx == 0) { + stream->trickplay_info->next_kidx = stream->trickplay_info->prev_kidx = stream->current_entry; + + /* while loop to handle multiple consecutive key frames */ + while(1) { + if((stream->trickplay_info->next_kidx +1)>=stream->idx_n) { + GST_DEBUG_OBJECT(avi,"eos"); + break; + } + + /* find previous key frame */ + stream->trickplay_info->next_kidx = gst_avi_demux_index_next(avi, stream, stream->trickplay_info->next_kidx +1, TRUE); + + /* based no.of sample between key frame and rate, drop frames */ + GST_DEBUG_OBJECT (avi, "current index :%d, next key index : %d", stream->current_entry, stream->trickplay_info->next_kidx); + + /* find no.of samples between present and previous key frames */ + nsamples = stream->trickplay_info->next_kidx - stream->trickplay_info->prev_kidx; + + /* find corresponding timestamps of present and previous keyframes */ + next_kindex_timestamp = avi_stream_convert_frames_to_time_unchecked (stream, stream->trickplay_info->next_kidx); + prev_kindex_timestamp = avi_stream_convert_frames_to_time_unchecked (stream, stream->trickplay_info->prev_kidx); + + /* find average duration between key frames */ + stream->trickplay_info->kidxs_dur_diff = (next_kindex_timestamp - prev_kindex_timestamp)/nsamples; + + stream->trickplay_info->show_samples = nsamples / avi->segment.rate; + + GST_DEBUG_OBJECT (avi, " duration between keyframes:%"GST_TIME_FORMAT, GST_TIME_ARGS(stream->trickplay_info->kidxs_dur_diff)); + + if(stream->trickplay_info->show_samples) { + GST_DEBUG_OBJECT (avi, "samples to display between two key frames = %d", + stream->trickplay_info->show_samples); + /* found no. of samples to show between key frames */ + *timestamp = avi_stream_convert_frames_to_time_unchecked (stream, stream->current_entry); + break; + } else if ((!stream->trickplay_info->show_samples) && + (stream->trickplay_info->next_kidx >= (stream->idx_n-1))){ + /* shown samples required to show between 2 key frames */ + stream->current_entry = stream->trickplay_info->next_kidx -1; /* next_kidx -1 is because advance_sample will increment */ + stream->trickplay_info->next_kidx = 0; + break; + } + } + stream->discont = TRUE; + } else { + stream->trickplay_info->show_samples--; + prev_kindex_timestamp = avi_stream_convert_frames_to_time_unchecked (stream, stream->trickplay_info->prev_kidx); + *timestamp = prev_kindex_timestamp + + (stream->current_entry - stream->trickplay_info->prev_kidx) * avi->segment.rate * stream->trickplay_info->kidxs_dur_diff; + + if (stream->trickplay_info->show_samples == 0) { + /* shown samples required to show between 2 key frames */ + GST_DEBUG_OBJECT (avi, "reached end of keyframe interval....Jumping to next key index = %d", stream->trickplay_info->next_kidx); + stream->current_entry= stream->trickplay_info->next_kidx -1; /* next_kidx -1 is because advance_sample will increment */ + stream->trickplay_info->next_kidx = 0; + stream->discont = TRUE; + } + } +} + +static void +gst_avidemux_backward_trickplay (GstAviDemux * avi, GstAviStream * stream, guint64 *timestamp) +{ + int index; + + /* backward trick play */ + GST_DEBUG_OBJECT (avi, "backward trickplay start"); + index = gst_avi_demux_index_for_time(avi,stream,avi->seek_kf_offset); + gst_avi_demux_move_stream (avi, stream, &avi->segment, index); +} + +static GstFlowReturn +gst_avidemux_seek_to_previous_keyframe (GstAviDemux *avi) +{ + guint index; + GstAviStream *stream; + GstClockTime seek_time; + int i; + guint64 time_position; + guint64 duration; + gdouble minusone = -1; + + + /* FIXME, this code assumes the main stream with keyframes is stream 0, + * which is mostly correct... */ + stream = &avi->stream[avi->main_stream]; + + if(stream->current_entry <= stream->start_entry) { + /* Video stream reached start of the clip. So stop seeking to previous and send newsegment + from _loop function, so that normal playback resumes*/ + goto eos; + } + + index = stream->current_entry; + time_position = avi_stream_convert_frames_to_time_unchecked (stream, index); + duration= stream->current_ts_end - time_position; + + if((time_position - (minusone *avi->segment.rate)*duration)>0) + time_position -= (minusone *avi->segment.rate)*duration; + else + time_position=0; + + avi->seek_kf_offset = time_position; + + GST_DEBUG_OBJECT (avi, " seek_kf_offset after:%"GST_TIME_FORMAT, GST_TIME_ARGS(avi->seek_kf_offset)); + + index = gst_avi_demux_index_for_time(avi,stream,time_position); + + index = gst_avi_demux_index_prev (avi, stream, index, TRUE); + + gst_avi_demux_move_stream (avi, stream, &avi->segment, index); + + seek_time = avi_stream_convert_frames_to_time_unchecked (stream, index); + GST_DEBUG_OBJECT (avi, " seek_time is :%"GST_TIME_FORMAT, GST_TIME_ARGS(seek_time)); + + + stream->last_flow = GST_FLOW_OK; + stream->discont = TRUE; + + /* Aligning other stream */ + for (i = 0; i < avi->num_streams; i++) { + GstAviStream *ostream; + + ostream = &avi->stream[i]; + if ((ostream == stream) || (ostream->index == NULL)) + continue; + + /* get the entry index for the requested position */ + index = gst_avi_demux_index_for_time (avi, ostream, seek_time); + + gst_avi_demux_move_stream (avi, ostream, &avi->segment, index); + + ostream->last_flow = GST_FLOW_OK; + ostream->discont = TRUE; + } + return GST_FLOW_OK; +eos: + return GST_FLOW_UNEXPECTED; + +} + +#endif + diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h new file mode 100644 index 0000000..174d8a8 --- /dev/null +++ b/gst/avi/gstavidemux.h @@ -0,0 +1,243 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Nokia Corporation (contact ) + * + * 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_AVI_DEMUX_H__ +#define __GST_AVI_DEMUX_H__ + +#include + +#include "avi-ids.h" +#include "gst/riff/riff-ids.h" +#include "gst/riff/riff-read.h" +#include + +#ifdef DIVX_DRM /* need to check using same define */ +#include +#endif + +G_BEGIN_DECLS + +#define GST_TYPE_AVI_DEMUX \ + (gst_avi_demux_get_type ()) +#define GST_AVI_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_DEMUX, GstAviDemux)) +#define GST_AVI_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_DEMUX, GstAviDemuxClass)) +#define GST_IS_AVI_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX)) +#define GST_IS_AVI_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX)) + +#define GST_AVI_DEMUX_MAX_STREAMS 16 + +#define AVIDEMUX_MODIFICATION + +#define CHUNKID_TO_STREAMNR(chunkid) \ + ((((chunkid) & 0xff) - '0') * 10 + \ + (((chunkid) >> 8) & 0xff) - '0') + + +/* new index entries 24 bytes */ +typedef struct { + guint32 flags; + guint32 size; /* bytes of the data */ + guint64 offset; /* data offset in file */ + guint64 total; /* total bytes before */ +} GstAviIndexEntry; + +#ifdef AVIDEMUX_MODIFICATION +typedef struct _TrickPlayInfo TrickPlayInfo; + +struct _TrickPlayInfo { + + gint32 next_kidx; // next Key index + gint32 prev_kidx; // Previous key index + guint64 kidxs_dur_diff; // duration between two consecutive key frames + gint32 show_samples; // samples to show between two consecutive key frames + guint64 start_pos; /* trickplay start position */ +}; +#endif + +typedef struct { + /* index of this streamcontext */ + guint num; + + /* pad*/ + GstPad *pad; + gboolean exposed; + + /* stream info and headers */ + gst_riff_strh *strh; + union { + gst_riff_strf_vids *vids; + gst_riff_strf_auds *auds; + gst_riff_strf_iavs *iavs; + gpointer data; + } strf; + GstBuffer *extradata, *initdata; + gchar *name; + + /* the start/step/stop entries */ + guint start_entry; + guint step_entry; + guint stop_entry; + +#ifdef AVIDEMUX_MODIFICATION + TrickPlayInfo *trickplay_info; +#endif + + /* current index entry */ + guint current_entry; + /* position (byte, frame, time) for current_entry */ + guint current_total; + GstClockTime current_timestamp; + GstClockTime current_ts_end; + guint64 current_offset; + guint64 current_offset_end; + + GstFlowReturn last_flow; + gboolean discont; + + /* stream length */ + guint64 total_bytes; + guint32 total_blocks; + guint n_keyframes; + /* stream length according to index */ + GstClockTime idx_duration; + /* stream length according to header */ + GstClockTime hdr_duration; + /* stream length based on header/index */ + GstClockTime duration; + + /* VBR indicator */ + gboolean is_vbr; + + /* openDML support (for files >4GB) */ + gboolean superindex; + guint64 *indexes; + + /* new indexes */ + GstAviIndexEntry *index; /* array with index entries */ + guint idx_n; /* number of entries */ + guint idx_max; /* max allocated size of entries */ + + GstTagList *taglist; + + gint index_id; +} GstAviStream; + +typedef enum { + GST_AVI_DEMUX_START, + GST_AVI_DEMUX_HEADER, + GST_AVI_DEMUX_MOVI, + GST_AVI_DEMUX_SEEK, +} GstAviDemuxState; + +typedef enum { + GST_AVI_DEMUX_HEADER_TAG_LIST, + GST_AVI_DEMUX_HEADER_AVIH, + GST_AVI_DEMUX_HEADER_ELEMENTS, + GST_AVI_DEMUX_HEADER_INFO, + GST_AVI_DEMUX_HEADER_JUNK, + GST_AVI_DEMUX_HEADER_DATA +} GstAviDemuxHeaderState; + +typedef struct _GstAviDemux { + GstElement parent; + + /* pads */ + GstPad *sinkpad; + + /* AVI decoding state */ + GstAviDemuxState state; + GstAviDemuxHeaderState header_state; + guint64 offset; + gboolean abort_buffering; + + /* when we loaded the indexes */ + gboolean have_index; + /* index offset in the file */ + guint64 index_offset; + + /* streams */ + GstAviStream stream[GST_AVI_DEMUX_MAX_STREAMS]; + guint num_streams; + guint num_v_streams; + guint num_a_streams; + guint num_t_streams; /* subtitle text streams */ + + guint main_stream; /* used for seeking */ + + /* for streaming mode */ + gboolean streaming; + gboolean have_eos; + GstAdapter *adapter; + guint todrop; + + /* some stream info for length */ + gst_riff_avih *avih; + GstClockTime duration; + + /* segment in TIME */ + GstSegment segment; + gboolean segment_running; + + /* pending tags/events */ + GstEvent *seg_event; + GstEvent *close_seg_event; + GstTagList *globaltags; + gboolean got_tags; + + /* gst index support */ + GstIndex *element_index; + gint index_id; + gboolean seekable; + +#ifdef DIVX_DRM + uint8_t* drmContext; + void *divx_handle; + uint8_t* (*divx_init) (uint8_t*, int*); + int (*divx_commit) (uint8_t *); + int (*divx_decrypt_audio) (uint8_t *, uint8_t *, uint32_t); + int (*divx_prepare_video_bitstream) (uint8_t *, uint8_t * , uint32_t , uint8_t * , uint32_t * ); + int (*divx_finalize) (uint8_t *); +#endif + + guint64 first_movi_offset; + guint64 idx1_offset; /* offset in file of list/chunk after movi */ + GstEvent *seek_event; + + gboolean building_index; + guint odml_stream; + guint odml_subidx; + guint64 *odml_subidxs; + + guint64 seek_kf_offset; /* offset of the keyframe to which we want to seek */ +} GstAviDemux; + +typedef struct _GstAviDemuxClass { + GstElementClass parent_class; +} GstAviDemuxClass; + +GType gst_avi_demux_get_type (void); + +G_END_DECLS + +#endif /* __GST_AVI_DEMUX_H__ */ diff --git a/gst/avi/gstavimux.c b/gst/avi/gstavimux.c new file mode 100644 index 0000000..fe50cef --- /dev/null +++ b/gst/avi/gstavimux.c @@ -0,0 +1,2180 @@ +/* AVI muxer plugin for GStreamer + * Copyright (C) 2002 Ronald Bultje + * (C) 2006 Mark Nauwelaerts + * + * 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 old avimuxer (by Wim Taymans) + * - xawtv's aviwriter (by Gerd Knorr) + * - mjpegtools' avilib (by Rainer Johanni) + * - openDML large-AVI docs + */ + +/** + * SECTION:element-avimux + * + * Muxes raw or compressed audio and/or video streams into an AVI file. + * + * + * Example launch lines + * (write everything in one line, without the backslash characters) + * |[ + * gst-launch videotestsrc num-buffers=250 \ + * ! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \ + * ! queue ! mux. \ + * audiotestsrc num-buffers=440 ! audioconvert \ + * ! 'audio/x-raw-int,rate=44100,channels=2' ! queue ! mux. \ + * avimux name=mux ! filesink location=test.avi + * ]| This will create an .AVI file containing an uncompressed video stream + * with a test picture and an uncompressed audio stream containing a + * test sound. + * |[ + * gst-launch videotestsrc num-buffers=250 \ + * ! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \ + * ! xvidenc ! queue ! mux. \ + * audiotestsrc num-buffers=440 ! audioconvert ! 'audio/x-raw-int,rate=44100,channels=2' \ + * ! lame ! queue ! mux. \ + * avimux name=mux ! filesink location=test.avi + * ]| This will create an .AVI file containing the same test video and sound + * as above, only that both streams will be compressed this time. This will + * only work if you have the necessary encoder elements installed of course. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gst/gst-i18n-plugin.h" +#include +#include +#include + +#include +#include + +#include "gstavimux.h" + +GST_DEBUG_CATEGORY_STATIC (avimux_debug); +#define GST_CAT_DEFAULT avimux_debug + +enum +{ + ARG_0, + ARG_BIGFILE +}; + +#define DEFAULT_BIGFILE TRUE + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-msvideo") + ); + +static GstStaticPadTemplate video_sink_factory = + GST_STATIC_PAD_TEMPLATE ("video_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("video/x-raw-yuv, " + "format = (fourcc) { YUY2, I420 }, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ]; " + "image/jpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ]; " + "video/x-divx, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ], " + "divxversion = (int) [ 3, 5 ]; " + "video/x-xvid, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ]; " + "video/x-3ivx, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ]; " + "video/x-msmpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ], " + "msmpegversion = (int) [ 41, 43 ]; " + "video/mpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ], " + "mpegversion = (int) { 1, 2, 4}, " + "systemstream = (boolean) FALSE; " + "video/x-h263, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ]; " + "video/x-h264, " + "stream-format = (string) byte-stream, " + "alignment = (string) au, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "framerate = (fraction) [ 0, MAX ]; " + "video/x-dv, " + "width = (int) 720, " + "height = (int) { 576, 480 }, " + "framerate = (fraction) [ 0, MAX ], " + "systemstream = (boolean) FALSE; " + "video/x-huffyuv, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ];" + "video/x-wmv, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ], " + "wmvversion = (int) [ 1, 3];" + "image/x-jpc, " + "width = (int) [ 1, 2147483647 ], " + "height = (int) [ 1, 2147483647 ], " + "framerate = (fraction) [ 0, MAX ];" + "video/x-vp8, " + "width = (int) [ 1, 2147483647 ], " + "height = (int) [ 1, 2147483647 ], " + "framerate = (fraction) [ 0, MAX ]") + ); + +static GstStaticPadTemplate audio_sink_factory = + GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) LITTLE_ENDIAN, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 96000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " + "audio/mpeg, " + "mpegversion = (int) 4, " + "stream-format = (string) raw, " + "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " +/*#if 0 VC6 doesn't support #if here ... + "audio/x-vorbis, " + "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " +#endif*/ + "audio/x-ac3, " + "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " + "audio/x-alaw, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]; " + "audio/x-mulaw, " + "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]; " + "audio/x-wma, " + "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ], " + "wmaversion = (int) [ 1, 2 ] ") + ); + +static void gst_avi_mux_base_init (gpointer g_class); +static void gst_avi_mux_class_init (GstAviMuxClass * klass); +static void gst_avi_mux_init (GstAviMux * avimux); +static void gst_avi_mux_pad_reset (GstAviPad * avipad, gboolean free); + +static GstFlowReturn gst_avi_mux_collect_pads (GstCollectPads * pads, + GstAviMux * avimux); +static gboolean gst_avi_mux_handle_event (GstPad * pad, GstEvent * event); +static GstPad *gst_avi_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_avi_mux_release_pad (GstElement * element, GstPad * pad); +static void gst_avi_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_avi_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static GstStateChangeReturn gst_avi_mux_change_state (GstElement * element, + GstStateChange transition); + +static GstElementClass *parent_class = NULL; + +GType +gst_avi_mux_get_type (void) +{ + static GType avimux_type = 0; + + if (!avimux_type) { + static const GTypeInfo avimux_info = { + sizeof (GstAviMuxClass), + gst_avi_mux_base_init, + NULL, + (GClassInitFunc) gst_avi_mux_class_init, + NULL, + NULL, + sizeof (GstAviMux), + 0, + (GInstanceInitFunc) gst_avi_mux_init, + }; + static const GInterfaceInfo tag_setter_info = { + NULL, + NULL, + NULL + }; + + avimux_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstAviMux", &avimux_info, 0); + g_type_add_interface_static (avimux_type, GST_TYPE_TAG_SETTER, + &tag_setter_info); + } + return avimux_type; +} + +static void +gst_avi_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, + &audio_sink_factory); + gst_element_class_add_static_pad_template (element_class, + &video_sink_factory); + + gst_element_class_set_details_simple (element_class, "Avi muxer", + "Codec/Muxer", + "Muxes audio and video into an avi stream", + "GStreamer maintainers "); + + GST_DEBUG_CATEGORY_INIT (avimux_debug, "avimux", 0, "Muxer for AVI streams"); +} + +static void +gst_avi_mux_finalize (GObject * object) +{ + GstAviMux *mux = GST_AVI_MUX (object); + GSList *node; + + /* completely free each sinkpad */ + node = mux->sinkpads; + while (node) { + GstAviPad *avipad = (GstAviPad *) node->data; + + node = node->next; + + gst_avi_mux_pad_reset (avipad, TRUE); + g_free (avipad); + } + g_slist_free (mux->sinkpads); + mux->sinkpads = NULL; + + g_free (mux->idx); + mux->idx = NULL; + + gst_object_unref (mux->collect); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_avi_mux_class_init (GstAviMuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->get_property = gst_avi_mux_get_property; + gobject_class->set_property = gst_avi_mux_set_property; + gobject_class->finalize = gst_avi_mux_finalize; + + g_object_class_install_property (gobject_class, ARG_BIGFILE, + g_param_spec_boolean ("bigfile", "Bigfile Support (>2GB)", + "Support for openDML-2.0 (big) AVI files", DEFAULT_BIGFILE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_avi_mux_request_new_pad); + gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_avi_mux_release_pad); + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_avi_mux_change_state); +} + +/* reset pad to initial state + * free - if true, release all, not only stream related, data */ +static void +gst_avi_mux_pad_reset (GstAviPad * avipad, gboolean free) +{ + /* generic part */ + memset (&(avipad->hdr), 0, sizeof (gst_riff_strh)); + + memset (&(avipad->idx[0]), 0, sizeof (avipad->idx)); + + if (free) { + g_free (avipad->tag); + avipad->tag = NULL; + g_free (avipad->idx_tag); + avipad->idx_tag = NULL; + } + + if (avipad->is_video) { + GstAviVideoPad *vidpad = (GstAviVideoPad *) avipad; + + avipad->hdr.type = GST_MAKE_FOURCC ('v', 'i', 'd', 's'); + if (vidpad->vids_codec_data) { + gst_buffer_unref (vidpad->vids_codec_data); + vidpad->vids_codec_data = NULL; + } + + if (vidpad->prepend_buffer) { + gst_buffer_unref (vidpad->prepend_buffer); + vidpad->prepend_buffer = NULL; + } + + memset (&(vidpad->vids), 0, sizeof (gst_riff_strf_vids)); + memset (&(vidpad->vprp), 0, sizeof (gst_riff_vprp)); + } else { + GstAviAudioPad *audpad = (GstAviAudioPad *) avipad; + + audpad->samples = 0; + + avipad->hdr.type = GST_MAKE_FOURCC ('a', 'u', 'd', 's'); + if (audpad->auds_codec_data) { + gst_buffer_unref (audpad->auds_codec_data); + audpad->auds_codec_data = NULL; + } + + memset (&(audpad->auds), 0, sizeof (gst_riff_strf_auds)); + } +} + +static void +gst_avi_mux_reset (GstAviMux * avimux) +{ + GSList *node, *newlist = NULL; + + /* free and reset each sinkpad */ + node = avimux->sinkpads; + while (node) { + GstAviPad *avipad = (GstAviPad *) node->data; + + node = node->next; + + gst_avi_mux_pad_reset (avipad, FALSE); + /* if this pad has collectdata, keep it, otherwise dump it completely */ + if (avipad->collect) + newlist = g_slist_append (newlist, avipad); + else { + gst_avi_mux_pad_reset (avipad, TRUE); + g_free (avipad); + } + } + + /* free the old list of sinkpads, only keep the real collecting ones */ + g_slist_free (avimux->sinkpads); + avimux->sinkpads = newlist; + + /* avi data */ + avimux->num_frames = 0; + memset (&(avimux->avi_hdr), 0, sizeof (gst_riff_avih)); + avimux->avi_hdr.max_bps = 10000000; + avimux->codec_data_size = 0; + + if (avimux->tags_snap) { + gst_tag_list_free (avimux->tags_snap); + avimux->tags_snap = NULL; + } + + g_free (avimux->idx); + avimux->idx = NULL; + + /* state info */ + avimux->write_header = TRUE; + + /* tags */ + gst_tag_setter_reset_tags (GST_TAG_SETTER (avimux)); +} + +static void +gst_avi_mux_init (GstAviMux * avimux) +{ + avimux->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); + gst_pad_use_fixed_caps (avimux->srcpad); + gst_element_add_pad (GST_ELEMENT (avimux), avimux->srcpad); + + /* property */ + avimux->enable_large_avi = DEFAULT_BIGFILE; + + avimux->collect = gst_collect_pads_new (); + gst_collect_pads_set_function (avimux->collect, + (GstCollectPadsFunction) (GST_DEBUG_FUNCPTR (gst_avi_mux_collect_pads)), + avimux); + + /* set to clean state */ + gst_avi_mux_reset (avimux); +} + +static gboolean +gst_avi_mux_vidsink_set_caps (GstPad * pad, GstCaps * vscaps) +{ + GstAviMux *avimux; + GstAviVideoPad *avipad; + GstAviCollectData *collect_pad; + GstStructure *structure; + const gchar *mimetype; + const GValue *fps, *par; + const GValue *codec_data; + gint width, height; + gint par_n, par_d; + gboolean codec_data_in_headers = TRUE; + + avimux = GST_AVI_MUX (gst_pad_get_parent (pad)); + + /* find stream data */ + collect_pad = (GstAviCollectData *) gst_pad_get_element_private (pad); + g_assert (collect_pad); + avipad = (GstAviVideoPad *) collect_pad->avipad; + g_assert (avipad); + g_assert (avipad->parent.is_video); + g_assert (avipad->parent.hdr.type == GST_MAKE_FOURCC ('v', 'i', 'd', 's')); + + GST_DEBUG_OBJECT (avimux, "%s:%s, caps=%" GST_PTR_FORMAT, + GST_DEBUG_PAD_NAME (pad), vscaps); + + structure = gst_caps_get_structure (vscaps, 0); + mimetype = gst_structure_get_name (structure); + + /* global */ + avipad->vids.size = sizeof (gst_riff_strf_vids); + avipad->vids.planes = 1; + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) { + goto refuse_caps; + } + + avipad->vids.width = width; + avipad->vids.height = height; + + fps = gst_structure_get_value (structure, "framerate"); + if (fps == NULL || !GST_VALUE_HOLDS_FRACTION (fps)) + goto refuse_caps; + + avipad->parent.hdr.rate = gst_value_get_fraction_numerator (fps); + avipad->parent.hdr.scale = gst_value_get_fraction_denominator (fps); + + /* (pixel) aspect ratio data, if any */ + par = gst_structure_get_value (structure, "pixel-aspect-ratio"); + /* only use video properties header if there is non-trivial aspect info */ + if (par && GST_VALUE_HOLDS_FRACTION (par) && + ((par_n = gst_value_get_fraction_numerator (par)) != + (par_d = gst_value_get_fraction_denominator (par)))) { + GValue to_ratio = { 0, }; + guint ratio_n, ratio_d; + + /* some fraction voodoo to obtain simplest possible ratio */ + g_value_init (&to_ratio, GST_TYPE_FRACTION); + gst_value_set_fraction (&to_ratio, width * par_n, height * par_d); + ratio_n = gst_value_get_fraction_numerator (&to_ratio); + ratio_d = gst_value_get_fraction_denominator (&to_ratio); + GST_DEBUG_OBJECT (avimux, "generating vprp data with aspect ratio %d/%d", + ratio_n, ratio_d); + /* simply fill in */ + avipad->vprp.vert_rate = avipad->parent.hdr.rate / avipad->parent.hdr.scale; + avipad->vprp.hor_t_total = width; + avipad->vprp.vert_lines = height; + avipad->vprp.aspect = (ratio_n) << 16 | (ratio_d & 0xffff); + avipad->vprp.width = width; + avipad->vprp.height = height; + avipad->vprp.fields = 1; + avipad->vprp.field_info[0].compressed_bm_height = height; + avipad->vprp.field_info[0].compressed_bm_width = width; + avipad->vprp.field_info[0].valid_bm_height = height; + avipad->vprp.field_info[0].valid_bm_width = width; + } + + if (!strcmp (mimetype, "video/x-raw-yuv")) { + guint32 format; + + gst_structure_get_fourcc (structure, "format", &format); + avipad->vids.compression = format; + switch (format) { + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + avipad->vids.bit_cnt = 16; + break; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + avipad->vids.bit_cnt = 12; + break; + } + } else { + avipad->vids.bit_cnt = 24; + avipad->vids.compression = 0; + + /* find format */ + if (!strcmp (mimetype, "video/x-huffyuv")) { + avipad->vids.compression = GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'); + } else if (!strcmp (mimetype, "image/jpeg")) { + avipad->vids.compression = GST_MAKE_FOURCC ('M', 'J', 'P', 'G'); + } else if (!strcmp (mimetype, "video/x-divx")) { + gint divxversion; + + gst_structure_get_int (structure, "divxversion", &divxversion); + switch (divxversion) { + case 3: + avipad->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', '3'); + break; + case 4: + avipad->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); + break; + case 5: + avipad->vids.compression = GST_MAKE_FOURCC ('D', 'X', '5', '0'); + break; + } + } else if (!strcmp (mimetype, "video/x-xvid")) { + avipad->vids.compression = GST_MAKE_FOURCC ('X', 'V', 'I', 'D'); + } else if (!strcmp (mimetype, "video/x-3ivx")) { + avipad->vids.compression = GST_MAKE_FOURCC ('3', 'I', 'V', '2'); + } else if (gst_structure_has_name (structure, "video/x-msmpeg")) { + gint msmpegversion; + + gst_structure_get_int (structure, "msmpegversion", &msmpegversion); + switch (msmpegversion) { + case 41: + avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'G', '4'); + break; + case 42: + avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', '4', '2'); + break; + case 43: + avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', '4', '3'); + break; + default: + GST_INFO ("unhandled msmpegversion : %d, fall back to fourcc=MPEG", + msmpegversion); + avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'E', 'G'); + break; + } + } else if (!strcmp (mimetype, "video/x-dv")) { + avipad->vids.compression = GST_MAKE_FOURCC ('D', 'V', 'S', 'D'); + } else if (!strcmp (mimetype, "video/x-h263")) { + avipad->vids.compression = GST_MAKE_FOURCC ('H', '2', '6', '3'); + } else if (!strcmp (mimetype, "video/x-h264")) { + avipad->vids.compression = GST_MAKE_FOURCC ('H', '2', '6', '4'); + } else if (!strcmp (mimetype, "video/mpeg")) { + gint mpegversion; + + gst_structure_get_int (structure, "mpegversion", &mpegversion); + + switch (mpegversion) { + case 2: + avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'G', '2'); + break; + case 4: + /* mplayer/ffmpeg might not work with DIVX, but with FMP4 */ + avipad->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); + + /* DIVX/XVID in AVI store the codec_data chunk as part of the + first data buffer. So for this case, we prepend the codec_data + blob (if any) to that first buffer */ + codec_data_in_headers = FALSE; + break; + default: + GST_INFO ("unhandled mpegversion : %d, fall back to fourcc=MPEG", + mpegversion); + avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'E', 'G'); + break; + } + } else if (!strcmp (mimetype, "video/x-wmv")) { + gint wmvversion; + + if (gst_structure_get_int (structure, "wmvversion", &wmvversion)) { + switch (wmvversion) { + case 1: + avipad->vids.compression = GST_MAKE_FOURCC ('W', 'M', 'V', '1'); + break; + case 2: + avipad->vids.compression = GST_MAKE_FOURCC ('W', 'M', 'V', '2'); + break; + case 3: + avipad->vids.compression = GST_MAKE_FOURCC ('W', 'M', 'V', '3'); + default: + break; + } + } + } else if (!strcmp (mimetype, "image/x-jpc")) { + avipad->vids.compression = GST_MAKE_FOURCC ('M', 'J', '2', 'C'); + } else if (!strcmp (mimetype, "video/x-vp8")) { + avipad->vids.compression = GST_MAKE_FOURCC ('V', 'P', '8', '0'); + } + + if (!avipad->vids.compression) + goto refuse_caps; + } + + /* codec initialization data, if any */ + codec_data = gst_structure_get_value (structure, "codec_data"); + if (codec_data) { + if (codec_data_in_headers) { + avipad->vids_codec_data = gst_value_get_buffer (codec_data); + gst_buffer_ref (avipad->vids_codec_data); + /* keep global track of size */ + avimux->codec_data_size += GST_BUFFER_SIZE (avipad->vids_codec_data); + } else { + avipad->prepend_buffer = + gst_buffer_ref (gst_value_get_buffer (codec_data)); + } + } + + avipad->parent.hdr.fcc_handler = avipad->vids.compression; + avipad->vids.image_size = avipad->vids.height * avipad->vids.width; + /* hm, maybe why avi only handles one stream well ... */ + avimux->avi_hdr.width = avipad->vids.width; + avimux->avi_hdr.height = avipad->vids.height; + avimux->avi_hdr.us_frame = 1000000. * avipad->parent.hdr.scale / + avipad->parent.hdr.rate; + + gst_object_unref (avimux); + return TRUE; + +refuse_caps: + { + GST_WARNING_OBJECT (avimux, "refused caps %" GST_PTR_FORMAT, vscaps); + gst_object_unref (avimux); + return FALSE; + } +} + +static GstFlowReturn +gst_avi_mux_audsink_scan_mpeg_audio (GstAviMux * avimux, GstAviPad * avipad, + GstBuffer * buffer) +{ + guint8 *data; + guint size; + guint spf; + guint32 header; + gulong layer; + gulong version; + gint lsf, mpg25; + + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + if (size < 4) + goto not_parsed; + + header = GST_READ_UINT32_BE (data); + + if ((header & 0xffe00000) != 0xffe00000) + goto not_parsed; + + /* thanks go to mp3parse */ + if (header & (1 << 20)) { + lsf = (header & (1 << 19)) ? 0 : 1; + mpg25 = 0; + } else { + lsf = 1; + mpg25 = 1; + } + + version = 1 + lsf + mpg25; + layer = 4 - ((header >> 17) & 0x3); + + /* see http://www.codeproject.com/audio/MPEGAudioInfo.asp */ + if (layer == 1) + spf = 384; + else if (layer == 2) + spf = 1152; + else if (version == 1) { + spf = 1152; + } else { + /* MPEG-2 or "2.5" */ + spf = 576; + } + + if (G_UNLIKELY (avipad->hdr.scale <= 1)) + avipad->hdr.scale = spf; + else if (G_UNLIKELY (avipad->hdr.scale != spf)) { + GST_WARNING_OBJECT (avimux, "input mpeg audio has varying frame size"); + goto cbr_fallback; + } + + return GST_FLOW_OK; + + /* EXITS */ +not_parsed: + { + GST_WARNING_OBJECT (avimux, "input mpeg audio is not parsed"); + /* fall-through */ + } +cbr_fallback: + { + GST_WARNING_OBJECT (avimux, "falling back to CBR muxing"); + avipad->hdr.scale = 1; + /* no need to check further */ + avipad->hook = NULL; + return GST_FLOW_OK; + } +} + +static void +gst_avi_mux_audsink_set_fields (GstAviMux * avimux, GstAviAudioPad * avipad) +{ + if (avipad->parent.hdr.scale > 1) { + /* vbr case: fixed duration per frame/chunk */ + avipad->parent.hdr.rate = avipad->auds.rate; + avipad->parent.hdr.samplesize = 0; + /* FIXME ?? some rumours say this should be largest audio chunk size */ + avipad->auds.blockalign = avipad->parent.hdr.scale; + } else { + /* by spec, hdr.rate is av_bps related, is calculated that way in stop_file, + * and reduces to sample rate in PCM like cases */ + avipad->parent.hdr.rate = avipad->auds.av_bps / avipad->auds.blockalign; + avipad->parent.hdr.samplesize = avipad->auds.blockalign; + avipad->parent.hdr.scale = 1; + } +} + +static gboolean +gst_avi_mux_audsink_set_caps (GstPad * pad, GstCaps * vscaps) +{ + GstAviMux *avimux; + GstAviAudioPad *avipad; + GstAviCollectData *collect_pad; + GstStructure *structure; + const gchar *mimetype; + const GValue *codec_data; + gint channels, rate; + + avimux = GST_AVI_MUX (gst_pad_get_parent (pad)); + + /* find stream data */ + collect_pad = (GstAviCollectData *) gst_pad_get_element_private (pad); + g_assert (collect_pad); + avipad = (GstAviAudioPad *) collect_pad->avipad; + g_assert (avipad); + g_assert (!avipad->parent.is_video); + g_assert (avipad->parent.hdr.type == GST_MAKE_FOURCC ('a', 'u', 'd', 's')); + + GST_DEBUG_OBJECT (avimux, "%s:%s, caps=%" GST_PTR_FORMAT, + GST_DEBUG_PAD_NAME (pad), vscaps); + + structure = gst_caps_get_structure (vscaps, 0); + mimetype = gst_structure_get_name (structure); + + /* we want these for all */ + if (!gst_structure_get_int (structure, "channels", &channels) || + !gst_structure_get_int (structure, "rate", &rate)) { + goto refuse_caps; + } + + avipad->auds.channels = channels; + avipad->auds.rate = rate; + + /* codec initialization data, if any */ + codec_data = gst_structure_get_value (structure, "codec_data"); + if (codec_data) { + avipad->auds_codec_data = gst_value_get_buffer (codec_data); + gst_buffer_ref (avipad->auds_codec_data); + /* keep global track of size */ + avimux->codec_data_size += GST_BUFFER_SIZE (avipad->auds_codec_data); + } + + if (!strcmp (mimetype, "audio/x-raw-int")) { + gint width, depth; + gboolean signedness; + + avipad->auds.format = GST_RIFF_WAVE_FORMAT_PCM; + + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "depth", &depth) || + !gst_structure_get_boolean (structure, "signed", &signedness)) { + GST_DEBUG_OBJECT (avimux, + "broken caps, width/depth/signed field missing"); + goto refuse_caps; + } + + /* no clear place to put different values for these while keeping to spec */ + if (width != depth) { + GST_DEBUG_OBJECT (avimux, "width must be same as depth!"); + goto refuse_caps; + } + + /* because that's the way the caps will be recreated from riff data */ + if ((width == 8 && signedness) || (width == 16 && !signedness)) { + GST_DEBUG_OBJECT (avimux, + "8-bit PCM must be unsigned, 16-bit PCM signed"); + goto refuse_caps; + } + + avipad->auds.blockalign = width; + avipad->auds.size = (width == 8) ? 8 : depth; + + /* set some more info straight */ + avipad->auds.blockalign /= 8; + avipad->auds.blockalign *= avipad->auds.channels; + avipad->auds.av_bps = avipad->auds.blockalign * avipad->auds.rate; + } else { + avipad->auds.format = 0; + /* set some defaults */ + avipad->auds.blockalign = 1; + avipad->auds.av_bps = 0; + avipad->auds.size = 16; + + if (!strcmp (mimetype, "audio/mpeg")) { + gint mpegversion; + + gst_structure_get_int (structure, "mpegversion", &mpegversion); + switch (mpegversion) { + case 1:{ + gint layer = 3; + gboolean parsed = FALSE; + + gst_structure_get_int (structure, "layer", &layer); + gst_structure_get_boolean (structure, "parsed", &parsed); + switch (layer) { + case 3: + avipad->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL3; + break; + case 1: + case 2: + avipad->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL12; + break; + } + if (parsed) { + /* treat as VBR, should also cover CBR case; + * setup hook to parse frame header and determine spf */ + avipad->parent.hook = gst_avi_mux_audsink_scan_mpeg_audio; + } else { + GST_WARNING_OBJECT (avimux, "unparsed MPEG audio input (?), " + "doing CBR muxing"); + } + break; + } + case 4: + { + GstBuffer *codec_data_buf = avipad->auds_codec_data; + const gchar *stream_format; + guint codec; + + stream_format = gst_structure_get_string (structure, "stream-format"); + if (stream_format) { + if (strcmp (stream_format, "raw") != 0) { + GST_WARNING_OBJECT (avimux, "AAC's stream format '%s' is not " + "supported, please use 'raw'", stream_format); + break; + } + } else { + GST_WARNING_OBJECT (avimux, "AAC's stream-format not specified, " + "assuming 'raw'"); + } + + /* vbr case needs some special handling */ + if (!codec_data_buf || GST_BUFFER_SIZE (codec_data_buf) < 2) { + GST_WARNING_OBJECT (avimux, "no (valid) codec_data for AAC audio"); + break; + } + avipad->auds.format = GST_RIFF_WAVE_FORMAT_AAC; + /* need to determine frame length */ + codec = GST_READ_UINT16_BE (GST_BUFFER_DATA (codec_data_buf)); + avipad->parent.hdr.scale = (codec & 0x4) ? 960 : 1024; + break; + } + } + } else if (!strcmp (mimetype, "audio/x-vorbis")) { + avipad->auds.format = GST_RIFF_WAVE_FORMAT_VORBIS3; + } else if (!strcmp (mimetype, "audio/x-ac3")) { + avipad->auds.format = GST_RIFF_WAVE_FORMAT_A52; + } else if (!strcmp (mimetype, "audio/x-alaw")) { + avipad->auds.format = GST_RIFF_WAVE_FORMAT_ALAW; + avipad->auds.size = 8; + avipad->auds.blockalign = avipad->auds.channels; + avipad->auds.av_bps = avipad->auds.blockalign * avipad->auds.rate; + } else if (!strcmp (mimetype, "audio/x-mulaw")) { + avipad->auds.format = GST_RIFF_WAVE_FORMAT_MULAW; + avipad->auds.size = 8; + avipad->auds.blockalign = avipad->auds.channels; + avipad->auds.av_bps = avipad->auds.blockalign * avipad->auds.rate; + } else if (!strcmp (mimetype, "audio/x-wma")) { + gint version; + gint bitrate; + gint block_align; + + if (gst_structure_get_int (structure, "wmaversion", &version)) { + switch (version) { + case 1: + avipad->auds.format = GST_RIFF_WAVE_FORMAT_WMAV1; + break; + case 2: + avipad->auds.format = GST_RIFF_WAVE_FORMAT_WMAV2; + break; + default: + break; + } + } + + if (avipad->auds.format != 0) { + if (gst_structure_get_int (structure, "block_align", &block_align)) { + avipad->auds.blockalign = block_align; + } + if (gst_structure_get_int (structure, "bitrate", &bitrate)) { + avipad->auds.av_bps = bitrate / 8; + } + } + } + } + + if (!avipad->auds.format) + goto refuse_caps; + + avipad->parent.hdr.fcc_handler = avipad->auds.format; + gst_avi_mux_audsink_set_fields (avimux, avipad); + + gst_object_unref (avimux); + return TRUE; + +refuse_caps: + { + GST_WARNING_OBJECT (avimux, "refused caps %" GST_PTR_FORMAT, vscaps); + gst_object_unref (avimux); + return FALSE; + } +} + + +static GstPad * +gst_avi_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) +{ + GstAviMux *avimux; + GstPad *newpad; + GstAviPad *avipad; + GstElementClass *klass; + gchar *name = NULL; + const gchar *pad_name = NULL; + GstPadSetCapsFunction setcapsfunc = NULL; + gint pad_id; + + g_return_val_if_fail (templ != NULL, NULL); + + if (templ->direction != GST_PAD_SINK) + goto wrong_direction; + + g_return_val_if_fail (GST_IS_AVI_MUX (element), NULL); + avimux = GST_AVI_MUX (element); + + if (!avimux->write_header) + goto too_late; + + klass = GST_ELEMENT_GET_CLASS (element); + + /* FIXME-0.11: use %d instead of %02d for pad_names */ + + if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { + /* don't mix named and unnamed pads, if the pad already exists we fail when + * trying to add it */ + if (req_name != NULL && sscanf (req_name, "audio_%02d", &pad_id) == 1) { + pad_name = req_name; + } else { + name = g_strdup_printf ("audio_%02d", avimux->audio_pads++); + pad_name = name; + } + setcapsfunc = GST_DEBUG_FUNCPTR (gst_avi_mux_audsink_set_caps); + + /* init pad specific data */ + avipad = g_malloc0 (sizeof (GstAviAudioPad)); + avipad->is_video = FALSE; + avipad->hdr.type = GST_MAKE_FOURCC ('a', 'u', 'd', 's'); + /* audio goes last */ + avimux->sinkpads = g_slist_append (avimux->sinkpads, avipad); + } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { + /* though streams are pretty generic and relatively self-contained, + * some video info goes in a single avi header -and therefore mux struct- + * so video restricted to one stream */ + if (avimux->video_pads > 0) + goto too_many_video_pads; + + /* setup pad */ + pad_name = "video_00"; + avimux->video_pads++; + setcapsfunc = GST_DEBUG_FUNCPTR (gst_avi_mux_vidsink_set_caps); + + /* init pad specific data */ + avipad = g_malloc0 (sizeof (GstAviVideoPad)); + avipad->is_video = TRUE; + avipad->hdr.type = GST_MAKE_FOURCC ('v', 'i', 'd', 's'); + /* video goes first */ + avimux->sinkpads = g_slist_prepend (avimux->sinkpads, avipad); + } else + goto wrong_template; + + newpad = gst_pad_new_from_template (templ, pad_name); + gst_pad_set_setcaps_function (newpad, setcapsfunc); + + g_free (name); + + avipad->collect = gst_collect_pads_add_pad (avimux->collect, + newpad, sizeof (GstAviCollectData)); + ((GstAviCollectData *) (avipad->collect))->avipad = avipad; + /* 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 */ + avimux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad); + gst_pad_set_event_function (newpad, + GST_DEBUG_FUNCPTR (gst_avi_mux_handle_event)); + + if (!gst_element_add_pad (element, newpad)) + goto pad_add_failed; + + GST_DEBUG_OBJECT (newpad, "Added new request pad"); + + return newpad; + + /* ERRORS */ +wrong_direction: + { + g_warning ("avimux: request pad that is not a SINK pad\n"); + return NULL; + } +too_late: + { + g_warning ("avimux: request pad cannot be added after streaming started\n"); + return NULL; + } +wrong_template: + { + g_warning ("avimux: this is not our template!\n"); + return NULL; + } +too_many_video_pads: + { + GST_WARNING_OBJECT (avimux, "Can only have one video stream"); + return NULL; + } +pad_add_failed: + { + GST_WARNING_OBJECT (avimux, "Adding the new pad '%s' failed", pad_name); + gst_object_unref (newpad); + return NULL; + } +} + +static void +gst_avi_mux_release_pad (GstElement * element, GstPad * pad) +{ + GstAviMux *avimux = GST_AVI_MUX (element); + GSList *node; + + node = avimux->sinkpads; + while (node) { + GstAviPad *avipad = (GstAviPad *) node->data; + + if (avipad->collect->pad == pad) { + /* pad count should not be adjusted, + * as it also represent number of streams present */ + avipad->collect = NULL; + GST_DEBUG_OBJECT (avimux, "removed pad '%s'", GST_PAD_NAME (pad)); + gst_collect_pads_remove_pad (avimux->collect, pad); + gst_element_remove_pad (element, pad); + /* if not started yet, we can remove any sign this pad ever existed */ + /* in this case _start will take care of the real pad count */ + if (avimux->write_header) { + avimux->sinkpads = g_slist_remove (avimux->sinkpads, avipad); + gst_avi_mux_pad_reset (avipad, TRUE); + g_free (avipad); + } + return; + } + + node = node->next; + } + + g_warning ("Unknown pad %s", GST_PAD_NAME (pad)); +} + +static inline guint +gst_avi_mux_start_chunk (GstByteWriter * bw, const gchar * tag, guint32 fourcc) +{ + guint chunk_offset; + + if (tag) + gst_byte_writer_put_data (bw, (const guint8 *) tag, 4); + else + gst_byte_writer_put_uint32_le (bw, fourcc); + + chunk_offset = gst_byte_writer_get_pos (bw); + /* real chunk size comes later */ + gst_byte_writer_put_uint32_le (bw, 0); + + return chunk_offset; +} + +static inline void +gst_avi_mux_end_chunk (GstByteWriter * bw, guint chunk_offset) +{ + guint size; + + size = gst_byte_writer_get_pos (bw); + + gst_byte_writer_set_pos (bw, chunk_offset); + gst_byte_writer_put_uint32_le (bw, size - chunk_offset - 4); + gst_byte_writer_set_pos (bw, size); + + /* arrange for even padding */ + if (size & 1) + gst_byte_writer_put_uint8 (bw, 0); +} + +/* maybe some of these functions should be moved to riff.h? */ + +static void +gst_avi_mux_write_tag (const GstTagList * list, const gchar * tag, + gpointer data) +{ + const struct + { + guint32 fcc; + const gchar *tag; + } rifftags[] = { + { + GST_RIFF_INFO_IARL, GST_TAG_LOCATION}, { + GST_RIFF_INFO_IART, GST_TAG_ARTIST}, { + GST_RIFF_INFO_ICMT, GST_TAG_COMMENT}, { + GST_RIFF_INFO_ICOP, GST_TAG_COPYRIGHT}, { + GST_RIFF_INFO_ICRD, GST_TAG_DATE}, { + GST_RIFF_INFO_IGNR, GST_TAG_GENRE}, { + GST_RIFF_INFO_IKEY, GST_TAG_KEYWORDS}, { + GST_RIFF_INFO_INAM, GST_TAG_TITLE}, { + GST_RIFF_INFO_ISFT, GST_TAG_ENCODER}, { + GST_RIFF_INFO_ISRC, GST_TAG_ISRC}, { + 0, NULL} + }; + gint n; + gchar *str; + GstByteWriter *bw = data; + guint chunk; + + for (n = 0; rifftags[n].fcc != 0; n++) { + if (!strcmp (rifftags[n].tag, tag) && + gst_tag_list_get_string (list, tag, &str) && str) { + chunk = gst_avi_mux_start_chunk (bw, NULL, rifftags[n].fcc); + gst_byte_writer_put_string (bw, str); + gst_avi_mux_end_chunk (bw, chunk); + g_free (str); + break; + } + } +} + +static GstBuffer * +gst_avi_mux_riff_get_avi_header (GstAviMux * avimux) +{ + const GstTagList *tags; + GstBuffer *buffer; + gint size = 0; + GstByteWriter bw; + GSList *node; + guint avih, riff, hdrl; + + GST_DEBUG_OBJECT (avimux, "creating avi header, data_size %u, idx_size %u", + avimux->data_size, avimux->idx_size); + + if (avimux->tags_snap) + tags = avimux->tags_snap; + else { + /* need to make snapshot of current state of tags to ensure the same set + * is used next time around during header rewrite at the end */ + tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (avimux)); + if (tags) + tags = avimux->tags_snap = gst_tag_list_copy (tags); + } + + gst_byte_writer_init_with_size (&bw, 1024, FALSE); + + /* avi header metadata */ + riff = gst_avi_mux_start_chunk (&bw, "RIFF", 0); + gst_byte_writer_put_data (&bw, (guint8 *) "AVI ", 4); + hdrl = gst_avi_mux_start_chunk (&bw, "LIST", 0); + gst_byte_writer_put_data (&bw, (guint8 *) "hdrl", 4); + + avih = gst_avi_mux_start_chunk (&bw, "avih", 0); + /* the AVI header itself */ + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.us_frame); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.max_bps); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.pad_gran); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.flags); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.tot_frames); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.init_frames); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.streams); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.bufsize); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.width); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.height); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.scale); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.rate); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.start); + gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.length); + gst_avi_mux_end_chunk (&bw, avih); + + /* stream data */ + node = avimux->sinkpads; + while (node) { + GstAviPad *avipad = (GstAviPad *) node->data; + GstAviVideoPad *vidpad = (GstAviVideoPad *) avipad; + GstAviAudioPad *audpad = (GstAviAudioPad *) avipad; + gint codec_size = 0; + guint strh, strl, strf, indx; + + /* stream list metadata */ + strl = gst_avi_mux_start_chunk (&bw, "LIST", 0); + gst_byte_writer_put_data (&bw, (guint8 *) "strl", 4); + + /* generic header */ + strh = gst_avi_mux_start_chunk (&bw, "strh", 0); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.type); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.fcc_handler); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.flags); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.priority); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.init_frames); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.scale); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.rate); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.start); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.length); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.bufsize); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.quality); + gst_byte_writer_put_uint32_le (&bw, avipad->hdr.samplesize); + gst_byte_writer_put_uint16_le (&bw, 0); + gst_byte_writer_put_uint16_le (&bw, 0); + gst_byte_writer_put_uint16_le (&bw, 0); + gst_byte_writer_put_uint16_le (&bw, 0); + gst_avi_mux_end_chunk (&bw, strh); + + if (avipad->is_video) { + codec_size = vidpad->vids_codec_data ? + GST_BUFFER_SIZE (vidpad->vids_codec_data) : 0; + /* the video header */ + strf = gst_avi_mux_start_chunk (&bw, "strf", 0); + /* the actual header */ + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.size + codec_size); + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.width); + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.height); + gst_byte_writer_put_uint16_le (&bw, vidpad->vids.planes); + gst_byte_writer_put_uint16_le (&bw, vidpad->vids.bit_cnt); + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.compression); + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.image_size); + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.xpels_meter); + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.ypels_meter); + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.num_colors); + gst_byte_writer_put_uint32_le (&bw, vidpad->vids.imp_colors); + if (vidpad->vids_codec_data) { + gst_byte_writer_put_data (&bw, + GST_BUFFER_DATA (vidpad->vids_codec_data), + GST_BUFFER_SIZE (vidpad->vids_codec_data)); + } + gst_avi_mux_end_chunk (&bw, strf); + + /* add video property data, mainly for aspect ratio, if any */ + if (vidpad->vprp.aspect) { + gint f; + guint vprp; + + /* let's be on the safe side */ + vidpad->vprp.fields = MIN (vidpad->vprp.fields, + GST_RIFF_VPRP_VIDEO_FIELDS); + /* the vprp header */ + vprp = gst_avi_mux_start_chunk (&bw, "vprp", 0); + /* the actual data */ + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.format_token); + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.standard); + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.vert_rate); + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.hor_t_total); + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.vert_lines); + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.aspect); + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.width); + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.height); + gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.fields); + + for (f = 0; f < vidpad->vprp.fields; ++f) { + gst_riff_vprp_video_field_desc *fd; + + fd = &(vidpad->vprp.field_info[f]); + gst_byte_writer_put_uint32_le (&bw, fd->compressed_bm_height); + gst_byte_writer_put_uint32_le (&bw, fd->compressed_bm_width); + gst_byte_writer_put_uint32_le (&bw, fd->valid_bm_height); + gst_byte_writer_put_uint32_le (&bw, fd->valid_bm_width); + gst_byte_writer_put_uint32_le (&bw, fd->valid_bm_x_offset); + gst_byte_writer_put_uint32_le (&bw, fd->valid_bm_y_offset); + gst_byte_writer_put_uint32_le (&bw, fd->video_x_t_offset); + gst_byte_writer_put_uint32_le (&bw, fd->video_y_start); + } + gst_avi_mux_end_chunk (&bw, vprp); + } + } else { + codec_size = audpad->auds_codec_data ? + GST_BUFFER_SIZE (audpad->auds_codec_data) : 0; + /* the audio header */ + strf = gst_avi_mux_start_chunk (&bw, "strf", 0); + /* the actual header */ + gst_byte_writer_put_uint16_le (&bw, audpad->auds.format); + gst_byte_writer_put_uint16_le (&bw, audpad->auds.channels); + gst_byte_writer_put_uint32_le (&bw, audpad->auds.rate); + gst_byte_writer_put_uint32_le (&bw, audpad->auds.av_bps); + gst_byte_writer_put_uint16_le (&bw, audpad->auds.blockalign); + gst_byte_writer_put_uint16_le (&bw, audpad->auds.size); + gst_byte_writer_put_uint16_le (&bw, codec_size); + if (audpad->auds_codec_data) { + gst_byte_writer_put_data (&bw, + GST_BUFFER_DATA (audpad->auds_codec_data), + GST_BUFFER_SIZE (audpad->auds_codec_data)); + } + gst_avi_mux_end_chunk (&bw, strf); + } + + /* odml superindex chunk */ + if (avipad->idx_index > 0) + indx = gst_avi_mux_start_chunk (&bw, "indx", 0); + else + indx = gst_avi_mux_start_chunk (&bw, "JUNK", 0); + gst_byte_writer_put_uint16_le (&bw, 4); /* bytes per entry */ + gst_byte_writer_put_uint8 (&bw, 0); /* index subtype */ + gst_byte_writer_put_uint8 (&bw, GST_AVI_INDEX_OF_INDEXES); /* index type */ + gst_byte_writer_put_uint32_le (&bw, avipad->idx_index); /* entries in use */ + gst_byte_writer_put_data (&bw, (guint8 *) avipad->tag, 4); /* stream id */ + gst_byte_writer_put_uint32_le (&bw, 0); /* reserved */ + gst_byte_writer_put_uint32_le (&bw, 0); /* reserved */ + gst_byte_writer_put_uint32_le (&bw, 0); /* reserved */ + gst_byte_writer_put_data (&bw, (guint8 *) avipad->idx, + GST_AVI_SUPERINDEX_COUNT * sizeof (gst_avi_superindex_entry)); + gst_avi_mux_end_chunk (&bw, indx); + + /* end strl for this stream */ + gst_avi_mux_end_chunk (&bw, strl); + + node = node->next; + } + + if (avimux->video_pads > 0) { + guint odml, dmlh; + /* odml header */ + odml = gst_avi_mux_start_chunk (&bw, "LIST", 0); + gst_byte_writer_put_data (&bw, (guint8 *) "odml", 4); + dmlh = gst_avi_mux_start_chunk (&bw, "dmlh", 0); + gst_byte_writer_put_uint32_le (&bw, avimux->total_frames); + gst_avi_mux_end_chunk (&bw, dmlh); + gst_avi_mux_end_chunk (&bw, odml); + } + + /* end hdrl */ + gst_avi_mux_end_chunk (&bw, hdrl); + + /* tags */ + if (tags) { + guint info; + + info = gst_avi_mux_start_chunk (&bw, "LIST", 0); + gst_byte_writer_put_data (&bw, (guint8 *) "INFO", 4); + + gst_tag_list_foreach (tags, gst_avi_mux_write_tag, &bw); + if (info + 8 == gst_byte_writer_get_pos (&bw)) { + /* no tags writen, remove the empty INFO LIST as it is useless + * and prevents playback in vlc */ + gst_byte_writer_set_pos (&bw, info - 4); + } else { + gst_avi_mux_end_chunk (&bw, info); + } + } + + /* pop RIFF */ + gst_avi_mux_end_chunk (&bw, riff); + + /* avi data header */ + gst_byte_writer_put_data (&bw, (guint8 *) "LIST", 4); + gst_byte_writer_put_uint32_le (&bw, avimux->data_size); + gst_byte_writer_put_data (&bw, (guint8 *) "movi", 4); + + /* now get the data */ + buffer = gst_byte_writer_reset_and_get_buffer (&bw); + + /* ... but RIFF includes more than just header */ + size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buffer) + 4); + size += 8 + avimux->data_size + avimux->idx_size; + GST_WRITE_UINT32_LE (GST_BUFFER_DATA (buffer) + 4, size); + + GST_MEMDUMP_OBJECT (avimux, "avi header", GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); + + return buffer; +} + +static GstBuffer * +gst_avi_mux_riff_get_avix_header (guint32 datax_size) +{ + GstBuffer *buffer; + guint8 *buffdata; + + buffer = gst_buffer_new_and_alloc (24); + buffdata = GST_BUFFER_DATA (buffer); + + memcpy (buffdata + 0, "RIFF", 4); + GST_WRITE_UINT32_LE (buffdata + 4, datax_size + 3 * 4); + memcpy (buffdata + 8, "AVIX", 4); + memcpy (buffdata + 12, "LIST", 4); + GST_WRITE_UINT32_LE (buffdata + 16, datax_size); + memcpy (buffdata + 20, "movi", 4); + + return buffer; +} + +static inline GstBuffer * +gst_avi_mux_riff_get_header (GstAviPad * avipad, guint32 video_frame_size) +{ + GstBuffer *buffer; + guint8 *buffdata; + + buffer = gst_buffer_new_and_alloc (8); + buffdata = GST_BUFFER_DATA (buffer); + memcpy (buffdata + 0, avipad->tag, 4); + GST_WRITE_UINT32_LE (buffdata + 4, video_frame_size); + + return buffer; +} + +/* write an odml index chunk in the movi list */ +static GstFlowReturn +gst_avi_mux_write_avix_index (GstAviMux * avimux, GstAviPad * avipad, + gchar * code, gchar * chunk, gst_avi_superindex_entry * super_index, + gint * super_index_count) +{ + GstFlowReturn res; + GstBuffer *buffer; + guint8 *buffdata, *data; + gst_riff_index_entry *entry; + gint i; + guint32 size, entry_count; + gboolean is_pcm = FALSE; + guint32 pcm_samples = 0; + + /* check if it is pcm */ + if (avipad && !avipad->is_video) { + GstAviAudioPad *audiopad = (GstAviAudioPad *) avipad; + if (audiopad->auds.format == GST_RIFF_WAVE_FORMAT_PCM) { + pcm_samples = audiopad->samples; + is_pcm = TRUE; + } + } + + /* allocate the maximum possible */ + buffer = gst_buffer_new_and_alloc (32 + 8 * avimux->idx_index); + buffdata = GST_BUFFER_DATA (buffer); + + /* general index chunk info */ + memcpy (buffdata + 0, chunk, 4); /* chunk id */ + GST_WRITE_UINT32_LE (buffdata + 4, 0); /* chunk size; fill later */ + GST_WRITE_UINT16_LE (buffdata + 8, 2); /* index entry is 2 words */ + buffdata[10] = 0; /* index subtype */ + buffdata[11] = GST_AVI_INDEX_OF_CHUNKS; /* index type: AVI_INDEX_OF_CHUNKS */ + GST_WRITE_UINT32_LE (buffdata + 12, 0); /* entries in use; fill later */ + memcpy (buffdata + 16, code, 4); /* stream to which index refers */ + GST_WRITE_UINT64_LE (buffdata + 20, avimux->avix_start); /* base offset */ + GST_WRITE_UINT32_LE (buffdata + 28, 0); /* reserved */ + buffdata += 32; + + /* now the actual index entries */ + i = avimux->idx_index; + entry = avimux->idx; + while (i > 0) { + if (memcmp (&entry->id, code, 4) == 0) { + /* enter relative offset to the data (!) */ + GST_WRITE_UINT32_LE (buffdata, GUINT32_FROM_LE (entry->offset) + 8); + /* msb is set if not (!) keyframe */ + GST_WRITE_UINT32_LE (buffdata + 4, GUINT32_FROM_LE (entry->size) + | (GUINT32_FROM_LE (entry->flags) + & GST_RIFF_IF_KEYFRAME ? 0 : 1U << 31)); + buffdata += 8; + } + i--; + entry++; + } + + /* ok, now we know the size and no of entries, fill in where needed */ + data = GST_BUFFER_DATA (buffer); + GST_BUFFER_SIZE (buffer) = size = buffdata - data; + GST_WRITE_UINT32_LE (data + 4, size - 8); + entry_count = (size - 32) / 8; + GST_WRITE_UINT32_LE (data + 12, entry_count); + + /* decorate and send */ + gst_buffer_set_caps (buffer, GST_PAD_CAPS (avimux->srcpad)); + if ((res = gst_pad_push (avimux->srcpad, buffer)) != GST_FLOW_OK) + return res; + + /* keep track of this in superindex (if room) ... */ + if (*super_index_count < GST_AVI_SUPERINDEX_COUNT) { + i = *super_index_count; + super_index[i].offset = GUINT64_TO_LE (avimux->total_data); + super_index[i].size = GUINT32_TO_LE (size); + if (is_pcm) { + super_index[i].duration = GUINT32_TO_LE (pcm_samples); + } else { + super_index[i].duration = GUINT32_TO_LE (entry_count); + } + (*super_index_count)++; + } else + GST_WARNING_OBJECT (avimux, "No more room in superindex of stream %s", + code); + + /* ... and in size */ + avimux->total_data += size; + if (avimux->is_bigfile) + avimux->datax_size += size; + else + avimux->data_size += size; + + return GST_FLOW_OK; +} + +/* some other usable functions (thankyou xawtv ;-) ) */ + +static void +gst_avi_mux_add_index (GstAviMux * avimux, GstAviPad * avipad, guint32 flags, + guint32 size) +{ + gchar *code = avipad->tag; + if (avimux->idx_index == avimux->idx_count) { + avimux->idx_count += 256; + avimux->idx = + g_realloc (avimux->idx, + avimux->idx_count * sizeof (gst_riff_index_entry)); + } + + /* in case of pcm audio, we need to count the number of samples for + * putting in the indx entries */ + if (!avipad->is_video) { + GstAviAudioPad *audiopad = (GstAviAudioPad *) avipad; + if (audiopad->auds.format == GST_RIFF_WAVE_FORMAT_PCM) { + audiopad->samples += size / audiopad->auds.blockalign; + } + } + + memcpy (&(avimux->idx[avimux->idx_index].id), code, 4); + avimux->idx[avimux->idx_index].flags = GUINT32_TO_LE (flags); + avimux->idx[avimux->idx_index].offset = GUINT32_TO_LE (avimux->idx_offset); + avimux->idx[avimux->idx_index].size = GUINT32_TO_LE (size); + avimux->idx_index++; +} + +static GstFlowReturn +gst_avi_mux_write_index (GstAviMux * avimux) +{ + GstFlowReturn res; + GstBuffer *buffer; + guint8 *buffdata; + + buffer = gst_buffer_new_and_alloc (8); + buffdata = GST_BUFFER_DATA (buffer); + memcpy (buffdata + 0, "idx1", 4); + GST_WRITE_UINT32_LE (buffdata + 4, + avimux->idx_index * sizeof (gst_riff_index_entry)); + + gst_buffer_set_caps (buffer, GST_PAD_CAPS (avimux->srcpad)); + res = gst_pad_push (avimux->srcpad, buffer); + if (res != GST_FLOW_OK) + return res; + + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = avimux->idx_index * sizeof (gst_riff_index_entry); + GST_BUFFER_DATA (buffer) = (guint8 *) avimux->idx; + GST_BUFFER_MALLOCDATA (buffer) = GST_BUFFER_DATA (buffer); + avimux->idx = NULL; /* will be free()'ed by gst_buffer_unref() */ + avimux->total_data += GST_BUFFER_SIZE (buffer) + 8; + + gst_buffer_set_caps (buffer, GST_PAD_CAPS (avimux->srcpad)); + res = gst_pad_push (avimux->srcpad, buffer); + if (res != GST_FLOW_OK) + return res; + + avimux->idx_size += avimux->idx_index * sizeof (gst_riff_index_entry) + 8; + + /* update header */ + avimux->avi_hdr.flags |= GST_RIFF_AVIH_HASINDEX; + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_avi_mux_bigfile (GstAviMux * avimux, gboolean last) +{ + GstFlowReturn res = GST_FLOW_OK; + GstBuffer *header; + GstEvent *event; + GSList *node; + + /* first some odml standard index chunks in the movi list */ + node = avimux->sinkpads; + while (node) { + GstAviPad *avipad = (GstAviPad *) node->data; + + node = node->next; + + res = gst_avi_mux_write_avix_index (avimux, avipad, avipad->tag, + avipad->idx_tag, avipad->idx, &avipad->idx_index); + if (res != GST_FLOW_OK) + return res; + } + + if (avimux->is_bigfile) { + /* search back */ + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + avimux->avix_start, GST_CLOCK_TIME_NONE, avimux->avix_start); + /* if the event succeeds */ + gst_pad_push_event (avimux->srcpad, event); + + /* rewrite AVIX header */ + header = gst_avi_mux_riff_get_avix_header (avimux->datax_size); + gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); + res = gst_pad_push (avimux->srcpad, header); + + /* go back to current location, at least try */ + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + avimux->total_data, GST_CLOCK_TIME_NONE, avimux->total_data); + gst_pad_push_event (avimux->srcpad, event); + + if (res != GST_FLOW_OK) + return res; + } else { /* write a standard index in the first riff chunk */ + res = gst_avi_mux_write_index (avimux); + /* the index data/buffer is freed by pushing it */ + avimux->idx_count = 0; + if (res != GST_FLOW_OK) + return res; + } + + avimux->avix_start = avimux->total_data; + + if (last) + return res; + + avimux->is_bigfile = TRUE; + avimux->numx_frames = 0; + avimux->datax_size = 4; /* movi tag */ + avimux->idx_index = 0; + node = avimux->sinkpads; + while (node) { + GstAviPad *avipad = (GstAviPad *) node->data; + node = node->next; + if (!avipad->is_video) { + GstAviAudioPad *audiopad = (GstAviAudioPad *) avipad; + audiopad->samples = 0; + } + } + + header = gst_avi_mux_riff_get_avix_header (0); + avimux->total_data += GST_BUFFER_SIZE (header); + /* avix_start is used as base offset for the odml index chunk */ + avimux->idx_offset = avimux->total_data - avimux->avix_start; + gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); + return gst_pad_push (avimux->srcpad, header); +} + +/* enough header blabla now, let's go on to actually writing the headers */ + +static GstFlowReturn +gst_avi_mux_start_file (GstAviMux * avimux) +{ + GstFlowReturn res; + GstBuffer *header; + GSList *node; + GstCaps *caps; + + avimux->total_data = 0; + avimux->total_frames = 0; + avimux->data_size = 4; /* movi tag */ + avimux->datax_size = 0; + avimux->num_frames = 0; + avimux->numx_frames = 0; + avimux->avix_start = 0; + + avimux->idx_index = 0; + avimux->idx_offset = 0; /* see 10 lines below */ + avimux->idx_size = 0; + avimux->idx_count = 0; + avimux->idx = NULL; + + /* state */ + avimux->write_header = FALSE; + avimux->restart = FALSE; + + /* init streams, see what we've got */ + node = avimux->sinkpads; + avimux->audio_pads = avimux->video_pads = 0; + while (node) { + GstAviPad *avipad = (GstAviPad *) node->data; + + node = node->next; + + if (!avipad->is_video) { + /* audio stream numbers must start at 1 iff there is a video stream 0; + * request_pad inserts video pad at head of list, so this test suffices */ + if (avimux->video_pads) + avimux->audio_pads++; + avipad->tag = g_strdup_printf ("%02uwb", avimux->audio_pads); + avipad->idx_tag = g_strdup_printf ("ix%02u", avimux->audio_pads); + if (!avimux->video_pads) + avimux->audio_pads++; + } else { + avipad->tag = g_strdup_printf ("%02udb", avimux->video_pads); + avipad->idx_tag = g_strdup_printf ("ix%02u", avimux->video_pads++); + } + } + + caps = gst_caps_copy (gst_pad_get_pad_template_caps (avimux->srcpad)); + gst_pad_set_caps (avimux->srcpad, caps); + gst_caps_unref (caps); + + /* let downstream know we think in BYTES and expect to do seeking later on */ + gst_pad_push_event (avimux->srcpad, + gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)); + + /* header */ + avimux->avi_hdr.streams = g_slist_length (avimux->sinkpads); + avimux->is_bigfile = FALSE; + + header = gst_avi_mux_riff_get_avi_header (avimux); + avimux->total_data += GST_BUFFER_SIZE (header); + + gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); + res = gst_pad_push (avimux->srcpad, header); + + avimux->idx_offset = avimux->total_data; + + return res; +} + +static GstFlowReturn +gst_avi_mux_stop_file (GstAviMux * avimux) +{ + GstFlowReturn res = GST_FLOW_OK; + GstEvent *event; + GstBuffer *header; + GSList *node; + + /* if bigfile, rewrite header, else write indexes */ + /* don't bail out at once if error, still try to re-write header */ + if (avimux->video_pads > 0) { + if (avimux->is_bigfile) { + res = gst_avi_mux_bigfile (avimux, TRUE); + } else { + res = gst_avi_mux_write_index (avimux); + } + } + + /* we do our best to make it interleaved at least ... */ + if (avimux->audio_pads > 0 && avimux->video_pads > 0) + avimux->avi_hdr.flags |= GST_RIFF_AVIH_ISINTERLEAVED; + + /* set rate and everything having to do with that */ + avimux->avi_hdr.max_bps = 0; + node = avimux->sinkpads; + while (node) { + GstAviPad *avipad = (GstAviPad *) node->data; + + node = node->next; + + if (!avipad->is_video) { + GstAviAudioPad *audpad = (GstAviAudioPad *) avipad; + + /* calculate bps if needed */ + if (!audpad->auds.av_bps) { + if (audpad->audio_time) { + audpad->auds.av_bps = + (GST_SECOND * audpad->audio_size) / audpad->audio_time; + /* round bps to nearest multiple of 8; + * which is much more likely to be the (cbr) bitrate in use; + * which in turn results in better timestamp calculation on playback */ + audpad->auds.av_bps = GST_ROUND_UP_8 (audpad->auds.av_bps - 4); + } else { + GST_ELEMENT_WARNING (avimux, STREAM, MUX, + (_("No or invalid input audio, AVI stream will be corrupt.")), + (NULL)); + audpad->auds.av_bps = 0; + } + } + gst_avi_mux_audsink_set_fields (avimux, audpad); + avimux->avi_hdr.max_bps += audpad->auds.av_bps; + avipad->hdr.length = gst_util_uint64_scale (audpad->audio_time, + avipad->hdr.rate, avipad->hdr.scale * GST_SECOND); + } else { + GstAviVideoPad *vidpad = (GstAviVideoPad *) avipad; + + avimux->avi_hdr.max_bps += ((vidpad->vids.bit_cnt + 7) / 8) * + (1000000. / avimux->avi_hdr.us_frame) * vidpad->vids.image_size; + avipad->hdr.length = avimux->total_frames; + } + } + + /* statistics/total_frames/... */ + avimux->avi_hdr.tot_frames = avimux->num_frames; + + /* seek and rewrite the header */ + header = gst_avi_mux_riff_get_avi_header (avimux); + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + 0, GST_CLOCK_TIME_NONE, 0); + gst_pad_push_event (avimux->srcpad, event); + + gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); + /* the first error survives */ + if (res == GST_FLOW_OK) + res = gst_pad_push (avimux->srcpad, header); + else + gst_pad_push (avimux->srcpad, header); + + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + avimux->total_data, GST_CLOCK_TIME_NONE, avimux->total_data); + gst_pad_push_event (avimux->srcpad, event); + + avimux->write_header = TRUE; + + return res; +} + +static GstFlowReturn +gst_avi_mux_restart_file (GstAviMux * avimux) +{ + GstFlowReturn res; + + if ((res = gst_avi_mux_stop_file (avimux)) != GST_FLOW_OK) + return res; + + gst_pad_push_event (avimux->srcpad, gst_event_new_eos ()); + + return gst_avi_mux_start_file (avimux); +} + +/* handle events (search) */ +static gboolean +gst_avi_mux_handle_event (GstPad * pad, GstEvent * event) +{ + GstAviMux *avimux; + gboolean ret; + + avimux = GST_AVI_MUX (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG:{ + GstTagList *list; + GstTagSetter *setter = GST_TAG_SETTER (avimux); + const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter); + + gst_event_parse_tag (event, &list); + gst_tag_setter_merge_tags (setter, list, mode); + break; + } + default: + break; + } + + /* now GstCollectPads can take care of the rest, e.g. EOS */ + ret = avimux->collect_event (pad, event); + + gst_object_unref (avimux); + + return ret; +} + +/* send extra 'padding' data */ +static GstFlowReturn +gst_avi_mux_send_pad_data (GstAviMux * avimux, gulong num_bytes) +{ + GstBuffer *buffer; + + buffer = gst_buffer_new_and_alloc (num_bytes); + memset (GST_BUFFER_DATA (buffer), 0, num_bytes); + gst_buffer_set_caps (buffer, GST_PAD_CAPS (avimux->srcpad)); + return gst_pad_push (avimux->srcpad, buffer); +} + +/* do buffer */ +static GstFlowReturn +gst_avi_mux_do_buffer (GstAviMux * avimux, GstAviPad * avipad) +{ + GstFlowReturn res; + GstBuffer *data, *header; + gulong total_size, pad_bytes = 0; + guint flags; + + data = gst_collect_pads_pop (avimux->collect, avipad->collect); + /* arrange downstream running time */ + data = gst_buffer_make_metadata_writable (data); + GST_BUFFER_TIMESTAMP (data) = + gst_segment_to_running_time (&avipad->collect->segment, + GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (data)); + + /* Prepend a special buffer to the first one for some formats */ + if (avipad->is_video) { + GstAviVideoPad *vidpad = (GstAviVideoPad *) avipad; + + if (vidpad->prepend_buffer) { + GstBuffer *newdata = gst_buffer_merge (vidpad->prepend_buffer, data); + gst_buffer_copy_metadata (newdata, data, GST_BUFFER_COPY_TIMESTAMPS); + gst_buffer_unref (data); + gst_buffer_unref (vidpad->prepend_buffer); + + data = newdata; + vidpad->prepend_buffer = NULL; + } + } + + if (avimux->restart) { + if ((res = gst_avi_mux_restart_file (avimux)) != GST_FLOW_OK) + return res; + } + + /* need to restart or start a next avix chunk ? */ + if ((avimux->is_bigfile ? avimux->datax_size : avimux->data_size) + + GST_BUFFER_SIZE (data) > GST_AVI_MAX_SIZE) { + if (avimux->enable_large_avi) { + if ((res = gst_avi_mux_bigfile (avimux, FALSE)) != GST_FLOW_OK) + return res; + } else { + if ((res = gst_avi_mux_restart_file (avimux)) != GST_FLOW_OK) + return res; + } + } + + /* get header and record some stats */ + if (GST_BUFFER_SIZE (data) & 1) { + pad_bytes = 2 - (GST_BUFFER_SIZE (data) & 1); + } + header = gst_avi_mux_riff_get_header (avipad, GST_BUFFER_SIZE (data)); + total_size = GST_BUFFER_SIZE (header) + GST_BUFFER_SIZE (data) + pad_bytes; + + if (avimux->is_bigfile) { + avimux->datax_size += total_size; + } else { + avimux->data_size += total_size; + } + + if (G_UNLIKELY (avipad->hook)) + avipad->hook (avimux, avipad, data); + + /* the suggested buffer size is the max frame size */ + if (avipad->hdr.bufsize < GST_BUFFER_SIZE (data)) + avipad->hdr.bufsize = GST_BUFFER_SIZE (data); + + if (avipad->is_video) { + avimux->total_frames++; + + if (avimux->is_bigfile) { + avimux->numx_frames++; + } else { + avimux->num_frames++; + } + + flags = 0x02; + if (!GST_BUFFER_FLAG_IS_SET (data, GST_BUFFER_FLAG_DELTA_UNIT)) + flags |= 0x10; + } else { + GstAviAudioPad *audpad = (GstAviAudioPad *) avipad; + + flags = 0; + audpad->audio_size += GST_BUFFER_SIZE (data); + audpad->audio_time += GST_BUFFER_DURATION (data); + } + + gst_avi_mux_add_index (avimux, avipad, flags, GST_BUFFER_SIZE (data)); + + /* prepare buffers for sending */ + gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); + data = gst_buffer_make_metadata_writable (data); + gst_buffer_set_caps (data, GST_PAD_CAPS (avimux->srcpad)); + + GST_LOG_OBJECT (avimux, "pushing buffers: head, data"); + + if ((res = gst_pad_push (avimux->srcpad, header)) != GST_FLOW_OK) + return res; + if ((res = gst_pad_push (avimux->srcpad, data)) != GST_FLOW_OK) + return res; + + if (pad_bytes) { + if ((res = gst_avi_mux_send_pad_data (avimux, pad_bytes)) != GST_FLOW_OK) + return res; + } + + /* if any push above fails, we're in trouble with file consistency anyway */ + avimux->total_data += total_size; + avimux->idx_offset += total_size; + + return res; +} + +/* pick the oldest buffer from the pads and push it */ +static GstFlowReturn +gst_avi_mux_do_one_buffer (GstAviMux * avimux) +{ + GstAviPad *avipad, *best_pad; + GSList *node; + GstBuffer *buffer; + GstClockTime time, best_time, delay; + + node = avimux->sinkpads; + best_pad = NULL; + best_time = GST_CLOCK_TIME_NONE; + for (; node; node = node->next) { + avipad = (GstAviPad *) node->data; + + if (!avipad->collect) + continue; + + if (!avipad->hdr.fcc_handler) + goto not_negotiated; + + buffer = gst_collect_pads_peek (avimux->collect, avipad->collect); + if (!buffer) + continue; + time = GST_BUFFER_TIMESTAMP (buffer); + gst_buffer_unref (buffer); + + /* invalid should pass */ + if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) { + time = gst_segment_to_running_time (&avipad->collect->segment, + GST_FORMAT_TIME, time); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { + GST_DEBUG_OBJECT (avimux, "clipping buffer on pad %s outside segment", + GST_PAD_NAME (avipad->collect->pad)); + buffer = gst_collect_pads_pop (avimux->collect, avipad->collect); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } + } + + delay = avipad->is_video ? GST_SECOND / 2 : 0; + + /* invalid timestamp buffers pass first, + * these are probably initialization buffers */ + if (best_pad == NULL || !GST_CLOCK_TIME_IS_VALID (time) + || (GST_CLOCK_TIME_IS_VALID (best_time) && time + delay < best_time)) { + best_pad = avipad; + best_time = time + delay; + } + } + + if (best_pad) { + GST_LOG_OBJECT (avimux, "selected pad %s with time %" GST_TIME_FORMAT, + GST_PAD_NAME (best_pad->collect->pad), GST_TIME_ARGS (best_time)); + + return gst_avi_mux_do_buffer (avimux, best_pad); + } else { + /* simply finish off the file and send EOS */ + gst_avi_mux_stop_file (avimux); + gst_pad_push_event (avimux->srcpad, gst_event_new_eos ()); + return GST_FLOW_UNEXPECTED; + } + + /* ERRORS */ +not_negotiated: + { + GST_ELEMENT_ERROR (avimux, CORE, NEGOTIATION, (NULL), + ("pad %s not negotiated", GST_PAD_NAME (avipad->collect->pad))); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static GstFlowReturn +gst_avi_mux_collect_pads (GstCollectPads * pads, GstAviMux * avimux) +{ + GstFlowReturn res; + + if (G_UNLIKELY (avimux->write_header)) { + if ((res = gst_avi_mux_start_file (avimux)) != GST_FLOW_OK) + return res; + } + + return gst_avi_mux_do_one_buffer (avimux); +} + + +static void +gst_avi_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstAviMux *avimux; + + avimux = GST_AVI_MUX (object); + + switch (prop_id) { + case ARG_BIGFILE: + g_value_set_boolean (value, avimux->enable_large_avi); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_avi_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstAviMux *avimux; + + avimux = GST_AVI_MUX (object); + + switch (prop_id) { + case ARG_BIGFILE: + avimux->enable_large_avi = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_avi_mux_change_state (GstElement * element, GstStateChange transition) +{ + GstAviMux *avimux; + GstStateChangeReturn ret; + + avimux = GST_AVI_MUX (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_collect_pads_start (avimux->collect); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_collect_pads_stop (avimux->collect); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + goto done; + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_avi_mux_reset (avimux); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + +done: + return ret; +} diff --git a/gst/avi/gstavimux.h b/gst/avi/gstavimux.h new file mode 100644 index 0000000..0d90392 --- /dev/null +++ b/gst/avi/gstavimux.h @@ -0,0 +1,197 @@ +/* AVI muxer plugin for GStreamer + * Copyright (C) 2002 Ronald Bultje + * + * 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_AVI_MUX_H__ +#define __GST_AVI_MUX_H__ + + +#include +#include +#include +#include "avi-ids.h" + +G_BEGIN_DECLS + +#define GST_TYPE_AVI_MUX \ + (gst_avi_mux_get_type()) +#define GST_AVI_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVI_MUX,GstAviMux)) +#define GST_AVI_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVI_MUX,GstAviMuxClass)) +#define GST_IS_AVI_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVI_MUX)) +#define GST_IS_AVI_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVI_MUX)) + +#define GST_AVI_INDEX_OF_INDEXES 0 +#define GST_AVI_INDEX_OF_CHUNKS 1 + +/* this allows indexing up to 64GB avi file */ +#define GST_AVI_SUPERINDEX_COUNT 32 + +/* max size */ +#define GST_AVI_MAX_SIZE 0x40000000 + +typedef struct _gst_avi_superindex_entry { + guint64 offset; + guint32 size; + guint32 duration; +} gst_avi_superindex_entry; + +typedef struct _gst_riff_strh_full { + gst_riff_strh parent; + /* rcFrame, RECT structure (struct of 4 shorts) */ + gint16 left; + gint16 top; + gint16 right; + gint16 bottom; +} gst_riff_strh_full; + +typedef struct _GstAviPad GstAviPad; +typedef struct _GstAviMux GstAviMux; +typedef struct _GstAviMuxClass GstAviMuxClass; + +typedef GstFlowReturn (*GstAviPadHook) (GstAviMux * avi, GstAviPad * avipad, + GstBuffer * buffer); + +struct _GstAviPad { + /* do not extend, link to it */ + /* is NULL if original sink request pad has been removed */ + GstCollectData *collect; + + /* type */ + gboolean is_video; + gboolean connected; + + /* chunk tag */ + gchar *tag; + + /* stream header */ + gst_riff_strh hdr; + + /* odml super indexes */ + gst_avi_superindex_entry idx[GST_AVI_SUPERINDEX_COUNT]; + gint idx_index; + gchar *idx_tag; + + /* stream specific hook */ + GstAviPadHook hook; +}; + +typedef struct _GstAviVideoPad { + GstAviPad parent; + + /* stream format */ + gst_riff_strf_vids vids; + /* extra data */ + GstBuffer *vids_codec_data; + /* ODML video properties */ + gst_riff_vprp vprp; + + GstBuffer *prepend_buffer; + +} GstAviVideoPad; + +typedef struct _GstAviAudioPad { + GstAviPad parent; + + /* stream format */ + gst_riff_strf_auds auds; + /* audio info for bps calculation */ + guint32 audio_size; + guint64 audio_time; + + /* counts the number of samples to put in indx chunk + * useful for raw audio where usually there are more than + * 1 sample in each GstBuffer */ + gint samples; + + /* extra data */ + GstBuffer *auds_codec_data; +} GstAviAudioPad; + +typedef struct _GstAviCollectData { + /* extend the CollectData */ + GstCollectData collect; + + GstAviPad *avipad; +} GstAviCollectData; + +struct _GstAviMux { + GstElement element; + + /* pads */ + GstPad *srcpad; + /* sinkpads, video first */ + GSList *sinkpads; + /* video restricted to 1 pad */ + guint video_pads, audio_pads; + GstCollectPads *collect; + GstPadEventFunction collect_event; + + /* the AVI header */ + /* still some single stream video data in mux struct */ + gst_riff_avih avi_hdr; + /* total number of (video) frames */ + guint32 total_frames; + /* amount of total data (bytes) */ + guint64 total_data; + /* amount of data (bytes) in the AVI/AVIX block; + * actually the movi list, so counted from and including the movi tag */ + guint32 data_size, datax_size; + /* num (video) frames in the AVI/AVIX block */ + guint32 num_frames, numx_frames; + /* size of hdrl list, including tag as usual */ + + /* total size of extra codec data */ + guint32 codec_data_size; + /* state info */ + gboolean write_header; + gboolean restart; + + /* tags */ + GstTagList *tags_snap; + + /* information about the AVI index ('idx') */ + gst_riff_index_entry *idx; + gint idx_index, idx_count; + /* offset of *chunk* (relative to a base offset); entered in the index */ + guint32 idx_offset; + /* size of idx1 chunk (including! chunk header and size bytes) */ + guint32 idx_size; + + /* are we a big file already? */ + gboolean is_bigfile; + guint64 avix_start; + + /* whether to use "large AVI files" or just stick to small indexed files */ + gboolean enable_large_avi; +}; + +struct _GstAviMuxClass { + GstElementClass parent_class; +}; + +GType gst_avi_mux_get_type(void); + +G_END_DECLS + + +#endif /* __GST_AVI_MUX_H__ */ diff --git a/gst/avi/gstavisubtitle.c b/gst/avi/gstavisubtitle.c new file mode 100644 index 0000000..ad1cd90 --- /dev/null +++ b/gst/avi/gstavisubtitle.c @@ -0,0 +1,383 @@ +/* GStreamer AVI GAB2 subtitle parser + * Copyright (C) <2007> Thijs Vermeir + * Copyright (C) <2007> Tim-Philipp Müller + * + * 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-avisubtitle + * + * + * + * Parses the subtitle stream from an avi file. + * + * Example launch line + * + * + * gst-launch filesrc location=subtitle.avi ! avidemux name=demux ! queue ! avisubtitle ! subparse ! textoverlay name=overlay ! ffmpegcolorspace ! autovideosink demux. ! queue ! decodebin ! overlay. + * + * This plays an avi file with a video and subtitle stream. + * + * + * + * Last reviewed on 2008-02-01 + */ + +/* example of a subtitle chunk in an avi file + * 00000000: 47 41 42 32 00 02 00 10 00 00 00 45 00 6e 00 67 GAB2.......E.n.g + * 00000010: 00 6c 00 69 00 73 00 68 00 00 00 04 00 8e 00 00 .l.i.s.h........ + * 00000020: 00 ef bb bf 31 0d 0a 30 30 3a 30 30 3a 30 30 2c ....1..00:00:00, + * 00000030: 31 30 30 20 2d 2d 3e 20 30 30 3a 30 30 3a 30 32 100 --> 00:00:02 + * 00000040: 2c 30 30 30 0d 0a 3c 62 3e 41 6e 20 55 54 46 38 ,000..An UTF8 + * 00000050: 20 53 75 62 74 69 74 6c 65 20 77 69 74 68 20 42 Subtitle with B + * 00000060: 4f 4d 3c 2f 62 3e 0d 0a 0d 0a 32 0d 0a 30 30 3a OM....2..00: + * 00000070: 30 30 3a 30 32 2c 31 30 30 20 2d 2d 3e 20 30 30 00:02,100 --> 00 + * 00000080: 3a 30 30 3a 30 34 2c 30 30 30 0d 0a 53 6f 6d 65 :00:04,000..Some + * 00000090: 74 68 69 6e 67 20 6e 6f 6e 41 53 43 49 49 20 2d thing nonASCII - + * 000000a0: 20 c2 b5 c3 b6 c3 a4 c3 bc c3 9f 0d 0a 0d 0a .............. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstavisubtitle.h" + +GST_DEBUG_CATEGORY_STATIC (avisubtitle_debug); +#define GST_CAT_DEFAULT avisubtitle_debug + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-subtitle-avi") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-subtitle") + ); + +static void gst_avi_subtitle_title_tag (GstAviSubtitle * sub, gchar * title); +static GstFlowReturn gst_avi_subtitle_chain (GstPad * pad, GstBuffer * buffer); +static GstStateChangeReturn gst_avi_subtitle_change_state (GstElement * element, + GstStateChange transition); +static gboolean gst_avi_subtitle_send_event (GstElement * element, + GstEvent * event); + +GST_BOILERPLATE (GstAviSubtitle, gst_avi_subtitle, GstElement, + GST_TYPE_ELEMENT); + +#define IS_BOM_UTF8(data) ((GST_READ_UINT32_BE(data) >> 8) == 0xEFBBBF) +#define IS_BOM_UTF16_BE(data) (GST_READ_UINT16_BE(data) == 0xFEFF) +#define IS_BOM_UTF16_LE(data) (GST_READ_UINT16_LE(data) == 0xFEFF) +#define IS_BOM_UTF32_BE(data) (GST_READ_UINT32_BE(data) == 0xFEFF) +#define IS_BOM_UTF32_LE(data) (GST_READ_UINT32_LE(data) == 0xFEFF) + +static GstBuffer * +gst_avi_subtitle_extract_file (GstAviSubtitle * sub, GstBuffer * buffer, + guint offset, guint len) +{ + const gchar *input_enc = NULL; + GstBuffer *ret = NULL; + gchar *data; + + data = (gchar *) GST_BUFFER_DATA (buffer) + offset; + + if (len >= (3 + 1) && IS_BOM_UTF8 (data) && + g_utf8_validate (data + 3, len - 3, NULL)) { + ret = gst_buffer_create_sub (buffer, offset + 3, len - 3); + } else if (len >= 2 && IS_BOM_UTF16_BE (data)) { + input_enc = "UTF-16BE"; + data += 2; + len -= 2; + } else if (len >= 2 && IS_BOM_UTF16_LE (data)) { + input_enc = "UTF-16LE"; + data += 2; + len -= 2; + } else if (len >= 4 && IS_BOM_UTF32_BE (data)) { + input_enc = "UTF-32BE"; + data += 4; + len -= 4; + } else if (len >= 4 && IS_BOM_UTF32_LE (data)) { + input_enc = "UTF-32LE"; + data += 4; + len -= 4; + } else if (g_utf8_validate (data, len, NULL)) { + /* not specified, check if it's UTF-8 */ + ret = gst_buffer_create_sub (buffer, offset, len); + } else { + /* we could fall back to gst_tag_freeform_to_utf8() here */ + GST_WARNING_OBJECT (sub, "unspecified encoding, and not UTF-8"); + return NULL; + } + + g_return_val_if_fail (ret != NULL || input_enc != NULL, NULL); + + if (input_enc) { + GError *err = NULL; + gchar *utf8; + + GST_DEBUG_OBJECT (sub, "converting subtitles from %s to UTF-8", input_enc); + utf8 = g_convert (data, len, "UTF-8", input_enc, NULL, NULL, &err); + + if (err != NULL) { + GST_WARNING_OBJECT (sub, "conversion to UTF-8 failed : %s", err->message); + g_error_free (err); + return NULL; + } + + ret = gst_buffer_new (); + GST_BUFFER_DATA (ret) = (guint8 *) utf8; + GST_BUFFER_MALLOCDATA (ret) = (guint8 *) utf8; + GST_BUFFER_SIZE (ret) = strlen (utf8); + GST_BUFFER_OFFSET (ret) = 0; + } + + GST_BUFFER_CAPS (ret) = gst_caps_new_simple ("application/x-subtitle", NULL); + return ret; +} + +/** + * gst_avi_subtitle_title_tag: + * @sub: subtitle element + * @title: the title of this subtitle stream + * + * Send an event to the srcpad of the @sub element with the title + * of the subtitle stream as a GST_TAG_TITLE + */ +static void +gst_avi_subtitle_title_tag (GstAviSubtitle * sub, gchar * title) +{ + GstTagList *temp_list = gst_tag_list_new (); + + gst_tag_list_add (temp_list, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, title, + NULL); + gst_pad_push_event (sub->src, gst_event_new_tag (temp_list)); +} + +static GstFlowReturn +gst_avi_subtitle_parse_gab2_chunk (GstAviSubtitle * sub, GstBuffer * buf) +{ + const guint8 *data; + gchar *name_utf8; + guint name_length; + guint file_length; + guint size; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* check the magic word "GAB2\0", and the next word must be 2 */ + if (size < 12 || memcmp (data, "GAB2\0\2\0", 5 + 2) != 0) + goto wrong_magic_word; + + /* read 'name' of subtitle */ + name_length = GST_READ_UINT32_LE (data + 5 + 2); + GST_LOG_OBJECT (sub, "length of name: %u", name_length); + if (size <= 17 + name_length) + goto wrong_name_length; + + name_utf8 = g_convert ((gchar *) data + 11, name_length, "UTF-8", "UTF-16LE", + NULL, NULL, NULL); + + if (name_utf8) { + GST_LOG_OBJECT (sub, "subtitle name: %s", name_utf8); + gst_avi_subtitle_title_tag (sub, name_utf8); + g_free (name_utf8); + } + + /* next word must be 4 */ + if (GST_READ_UINT16_LE (data + 11 + name_length) != 0x4) + goto wrong_fixed_word_2; + + file_length = GST_READ_UINT32_LE (data + 13 + name_length); + GST_LOG_OBJECT (sub, "length srt/ssa file: %u", file_length); + + if (size < (17 + name_length + file_length)) + goto wrong_total_length; + + /* store this, so we can send it again after a seek; note that we shouldn't + * assume all the remaining data in the chunk is subtitle data, there may + * be padding at the end for some reason, so only parse file_length bytes */ + sub->subfile = + gst_avi_subtitle_extract_file (sub, buf, 17 + name_length, file_length); + + if (sub->subfile == NULL) + goto extract_failed; + + return GST_FLOW_OK; + + /* ERRORS */ +wrong_magic_word: + { + GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), ("Wrong magic word")); + return GST_FLOW_ERROR; + } +wrong_name_length: + { + GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), + ("name doesn't fit in buffer (%d < %d)", size, 17 + name_length)); + return GST_FLOW_ERROR; + } +wrong_fixed_word_2: + { + GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), + ("wrong fixed word: expected %u, got %u", 4, + GST_READ_UINT16_LE (data + 11 + name_length))); + return GST_FLOW_ERROR; + } +wrong_total_length: + { + GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), + ("buffer size is wrong: need %d bytes, have %d bytes", + 17 + name_length + file_length, size)); + return GST_FLOW_ERROR; + } +extract_failed: + { + GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), + ("could not extract subtitles")); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_avi_subtitle_chain (GstPad * pad, GstBuffer * buffer) +{ + GstAviSubtitle *sub = GST_AVI_SUBTITLE (GST_PAD_PARENT (pad)); + GstFlowReturn ret; + + if (sub->subfile != NULL) { + GST_WARNING_OBJECT (sub, "Got more buffers than expected, dropping"); + ret = GST_FLOW_UNEXPECTED; + goto done; + } + + /* we expect exactly one buffer with the whole srt/ssa file in it */ + ret = gst_avi_subtitle_parse_gab2_chunk (sub, buffer); + if (ret != GST_FLOW_OK) + goto done; + + /* now push the subtitle data downstream */ + ret = gst_pad_push (sub->src, gst_buffer_ref (sub->subfile)); + +done: + + gst_buffer_unref (buffer); + return ret; +} + +static gboolean +gst_avi_subtitle_send_event (GstElement * element, GstEvent * event) +{ + GstAviSubtitle *avisubtitle = GST_AVI_SUBTITLE (element); + gboolean ret = FALSE; + + if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { + if (avisubtitle->subfile) { + if (gst_pad_push (avisubtitle->src, + gst_buffer_ref (avisubtitle->subfile)) == GST_FLOW_OK) + ret = TRUE; + } + } + gst_event_unref (event); + return ret; +} + +static void +gst_avi_subtitle_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + GST_DEBUG_CATEGORY_INIT (avisubtitle_debug, "avisubtitle", 0, + "parse avi subtitle stream"); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, + "Avi subtitle parser", "Codec/Parser/Subtitle", + "Parse avi subtitle stream", "Thijs Vermeir "); +} + +static void +gst_avi_subtitle_class_init (GstAviSubtitleClass * klass) +{ + GstElementClass *gstelement_class = (GstElementClass *) klass; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_avi_subtitle_change_state); + gstelement_class->send_event = + GST_DEBUG_FUNCPTR (gst_avi_subtitle_send_event); +} + +static void +gst_avi_subtitle_init (GstAviSubtitle * self, GstAviSubtitleClass * klass) +{ + GstCaps *caps; + + self->src = gst_pad_new_from_static_template (&src_template, "src"); + gst_element_add_pad (GST_ELEMENT (self), self->src); + + self->sink = gst_pad_new_from_static_template (&sink_template, "sink"); + gst_pad_set_chain_function (self->sink, + GST_DEBUG_FUNCPTR (gst_avi_subtitle_chain)); + + caps = gst_static_pad_template_get_caps (&src_template); + gst_pad_set_caps (self->src, caps); + gst_caps_unref (caps); + + gst_pad_use_fixed_caps (self->src); + gst_element_add_pad (GST_ELEMENT (self), self->sink); + + self->subfile = NULL; +} + +static GstStateChangeReturn +gst_avi_subtitle_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstAviSubtitle *sub = GST_AVI_SUBTITLE (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + case GST_STATE_CHANGE_READY_TO_PAUSED: + 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: + if (sub->subfile) { + gst_buffer_unref (sub->subfile); + sub->subfile = NULL; + } + break; + default: + break; + } + + return ret; +} diff --git a/gst/avi/gstavisubtitle.h b/gst/avi/gstavisubtitle.h new file mode 100644 index 0000000..0f8048e --- /dev/null +++ b/gst/avi/gstavisubtitle.h @@ -0,0 +1,39 @@ + +#ifndef __GSTAVISUBTITLE_H__ +#define __GSTAVISUBTITLE_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstAviSubtitle GstAviSubtitle; +typedef struct _GstAviSubtitleClass GstAviSubtitleClass; + +#define GST_TYPE_AVI_SUBTITLE (gst_avi_subtitle_get_type ()) +#define GST_AVI_SUBTITLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_SUBTITLE, GstAviSubtitle)) +#define GST_AVI_SUBTITLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_SUBTITLE, GstAviSubtitleClass)) +#define GST_IS_AVI_SUBTITLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_SUBTITLE)) +#define GST_IS_AVI_SUBTITLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_SUBTITLE)) +#define GST_AVI_SUBTITLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AVI_SUBTITLE, GstAviSubtitleClass)) + +GType gst_avi_subtitle_get_type (void); + +struct _GstAviSubtitle +{ + GstElement parent; + + GstPad *src; + GstPad *sink; + + GstBuffer *subfile; /* the complete subtitle file in one buffer */ +}; + +struct _GstAviSubtitleClass +{ + GstElementClass parent; +}; + +G_END_DECLS +#endif diff --git a/gst/cutter/Makefile.am b/gst/cutter/Makefile.am new file mode 100644 index 0000000..7524a0e --- /dev/null +++ b/gst/cutter/Makefile.am @@ -0,0 +1,25 @@ +plugin_LTLIBRARIES = libgstcutter.la + +libgstcutter_la_SOURCES = gstcutter.c +libgstcutter_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstcutter_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LIBM) +libgstcutter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstcutter_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstcutter.h filter.func + +EXTRA_DIST = README + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstcutter -:SHARED libgstcutter \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstcutter_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstcutter_la_CFLAGS) \ + -:LDFLAGS $(libgstcutter_la_LDFLAGS) \ + $(libgstcutter_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/cutter/Makefile.in b/gst/cutter/Makefile.in new file mode 100644 index 0000000..80319bf --- /dev/null +++ b/gst/cutter/Makefile.in @@ -0,0 +1,820 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/cutter +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstcutter_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstcutter_la_OBJECTS = libgstcutter_la-gstcutter.lo +libgstcutter_la_OBJECTS = $(am_libgstcutter_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstcutter_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstcutter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstcutter_la_CFLAGS) $(CFLAGS) \ + $(libgstcutter_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstcutter_la_SOURCES) +DIST_SOURCES = $(libgstcutter_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstcutter.la +libgstcutter_la_SOURCES = gstcutter.c +libgstcutter_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstcutter_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LIBM) +libgstcutter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstcutter_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstcutter.h filter.func +EXTRA_DIST = README +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/cutter/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/cutter/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstcutter.la: $(libgstcutter_la_OBJECTS) $(libgstcutter_la_DEPENDENCIES) $(EXTRA_libgstcutter_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstcutter_la_LINK) -rpath $(plugindir) $(libgstcutter_la_OBJECTS) $(libgstcutter_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcutter_la-gstcutter.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstcutter_la-gstcutter.lo: gstcutter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcutter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcutter_la_CFLAGS) $(CFLAGS) -MT libgstcutter_la-gstcutter.lo -MD -MP -MF $(DEPDIR)/libgstcutter_la-gstcutter.Tpo -c -o libgstcutter_la-gstcutter.lo `test -f 'gstcutter.c' || echo '$(srcdir)/'`gstcutter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcutter_la-gstcutter.Tpo $(DEPDIR)/libgstcutter_la-gstcutter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcutter.c' object='libgstcutter_la-gstcutter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcutter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcutter_la_CFLAGS) $(CFLAGS) -c -o libgstcutter_la-gstcutter.lo `test -f 'gstcutter.c' || echo '$(srcdir)/'`gstcutter.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstcutter -:SHARED libgstcutter \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstcutter_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstcutter_la_CFLAGS) \ + -:LDFLAGS $(libgstcutter_la_LDFLAGS) \ + $(libgstcutter_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/cutter/README b/gst/cutter/README new file mode 100644 index 0000000..fc0975e --- /dev/null +++ b/gst/cutter/README @@ -0,0 +1,38 @@ +cutter plugin by thomas + +SYNOPSIS + +This plugin emits signals when RMS level of audio signal crosses a +threshold for a given amount of time. + +As soon as the buffer's RMS is greater than the threshold value, the plugin fires a CUT_START signal. + +When the buffer's RMS level drops below the threshold value for a consecutive run length longer than the given runlength, it sends a CUT_STOP signal. + +When a pre-recording buffer is used, the plugin will delay throughput of data when it's in "silent" mode for a maximum length equal to the pre-recording buffer length. As soon as the input level crosses the threshold level, this pre-recorded buffer is flushed to the src pad (so you can actually record the audio just before the threshold crossing) after sending the signal. + +ARGUMENTS + +GstCutter::threshold + level (between 0 and 1) of threshold +GstCutter::threshold_dB + level of threshold in dB (between -inf and 0) +GstCutter::runlength + minimum length (in seconds) before plugin sends cut_stop signal +GstCutter::prelength + length of pre-recording buffer + +SIGNALS + + CUT_START + gets sent when the level of the signal goes above threshold level + CUT_STOP + gets sent when the level of the signal has been below the + threshold level for a number of consecutive iterations of which + the cumulative length is more than the runlength + +LIMITATIONS + + * RMS value is calculated over the whole data buffer, so + the time resolution is limited to the buffer length + * RMS value is calculated over all of the channels combined diff --git a/gst/cutter/filter.func b/gst/cutter/filter.func new file mode 100644 index 0000000..bdbe566 --- /dev/null +++ b/gst/cutter/filter.func @@ -0,0 +1,16 @@ +{ + guint j; + register double squaresum = 0.0; + + /* + * process data here + * input sample data enters in *in_data as 8 or 16 bit data + * samples for left and right channel are interleaved + */ + + for (j = 0; j < num_samples; j++) + squaresum += data[j] * data[j]; + + return (squaresum / (float) num_samples); +} + diff --git a/gst/cutter/gstcutter.c b/gst/cutter/gstcutter.c new file mode 100644 index 0000000..a8d95d5 --- /dev/null +++ b/gst/cutter/gstcutter.c @@ -0,0 +1,465 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) 2002,2003,2005 + * Thomas Vander Stichele + * + * 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-cutter + * + * Analyses the audio signal for periods of silence. The start and end of + * silence is signalled by bus messages named + * "cutter". + * The message's structure contains two fields: + * + * + * + * #GstClockTime + * "timestamp": + * the timestamp of the buffer that triggered the message. + * + * + * + * + * gboolean + * "above": + * %TRUE for begin of silence and %FALSE for end of silence. + * + * + * + * + * + * Example launch line + * |[ + * gst-launch -m filesrc location=foo.ogg ! decodebin ! audioconvert ! cutter ! autoaudiosink + * ]| Show cut messages. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include "gstcutter.h" +#include "math.h" + +GST_DEBUG_CATEGORY_STATIC (cutter_debug); +#define GST_CAT_DEFAULT cutter_debug + +#define CUTTER_DEFAULT_THRESHOLD_LEVEL 0.1 +#define CUTTER_DEFAULT_THRESHOLD_LENGTH (500 * GST_MSECOND) +#define CUTTER_DEFAULT_PRE_LENGTH (200 * GST_MSECOND) + +static GstStaticPadTemplate cutter_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " "signed = (boolean) true") + ); + +static GstStaticPadTemplate cutter_sink_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " "signed = (boolean) true") + ); + +enum +{ + PROP_0, + PROP_THRESHOLD, + PROP_THRESHOLD_DB, + PROP_RUN_LENGTH, + PROP_PRE_LENGTH, + PROP_LEAKY +}; + +GST_BOILERPLATE (GstCutter, gst_cutter, GstElement, GST_TYPE_ELEMENT); + +static void gst_cutter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_cutter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_cutter_chain (GstPad * pad, GstBuffer * buffer); + +static gboolean gst_cutter_get_caps (GstPad * pad, GstCutter * filter); + +static void +gst_cutter_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &cutter_src_factory); + gst_element_class_add_static_pad_template (element_class, + &cutter_sink_factory); + gst_element_class_set_details_simple (element_class, "Audio cutter", + "Filter/Editor/Audio", + "Audio Cutter to split audio into non-silent bits", + "Thomas Vander Stichele "); +} + +static void +gst_cutter_class_init (GstCutterClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_cutter_set_property; + gobject_class->get_property = gst_cutter_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_THRESHOLD, + g_param_spec_double ("threshold", "Threshold", + "Volume threshold before trigger", + -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_THRESHOLD_DB, + g_param_spec_double ("threshold-dB", "Threshold (dB)", + "Volume threshold before trigger (in dB)", + -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_RUN_LENGTH, + g_param_spec_uint64 ("run-length", "Run length", + "Length of drop below threshold before cut_stop (in nanoseconds)", + 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PRE_LENGTH, + g_param_spec_uint64 ("pre-length", "Pre-recording buffer length", + "Length of pre-recording buffer (in nanoseconds)", + 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LEAKY, + g_param_spec_boolean ("leaky", "Leaky", + "do we leak buffers when below threshold ?", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (cutter_debug, "cutter", 0, "Audio cutting"); +} + +static void +gst_cutter_init (GstCutter * filter, GstCutterClass * g_class) +{ + filter->sinkpad = + gst_pad_new_from_static_template (&cutter_sink_factory, "sink"); + filter->srcpad = + gst_pad_new_from_static_template (&cutter_src_factory, "src"); + + filter->threshold_level = CUTTER_DEFAULT_THRESHOLD_LEVEL; + filter->threshold_length = CUTTER_DEFAULT_THRESHOLD_LENGTH; + filter->silent_run_length = 0 * GST_SECOND; + filter->silent = TRUE; + filter->silent_prev = FALSE; /* previous value of silent */ + + filter->pre_length = CUTTER_DEFAULT_PRE_LENGTH; + filter->pre_run_length = 0 * GST_SECOND; + filter->pre_buffer = NULL; + filter->leaky = FALSE; + + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + gst_pad_set_chain_function (filter->sinkpad, gst_cutter_chain); + gst_pad_use_fixed_caps (filter->sinkpad); + + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + gst_pad_use_fixed_caps (filter->srcpad); +} + +static GstMessage * +gst_cutter_message_new (GstCutter * c, gboolean above, GstClockTime timestamp) +{ + GstStructure *s; + + s = gst_structure_new ("cutter", + "above", G_TYPE_BOOLEAN, above, + "timestamp", GST_TYPE_CLOCK_TIME, timestamp, NULL); + + return gst_message_new_element (GST_OBJECT (c), s); +} + +/* Calculate the Normalized Cumulative Square over a buffer of the given type + * and over all channels combined */ + +#define DEFINE_CUTTER_CALCULATOR(TYPE, RESOLUTION) \ +static void inline \ +gst_cutter_calculate_##TYPE (TYPE * in, guint num, \ + double *NCS) \ +{ \ + register int j; \ + double squaresum = 0.0; /* square sum of the integer samples */ \ + register double square = 0.0; /* Square */ \ + gdouble normalizer; /* divisor to get a [-1.0, 1.0] range */ \ + \ + *NCS = 0.0; /* Normalized Cumulative Square */ \ + \ + normalizer = (double) (1 << (RESOLUTION * 2)); \ + \ + for (j = 0; j < num; j++) \ + { \ + square = ((double) in[j]) * in[j]; \ + squaresum += square; \ + } \ + \ + \ + *NCS = squaresum / normalizer; \ +} + +DEFINE_CUTTER_CALCULATOR (gint16, 15); +DEFINE_CUTTER_CALCULATOR (gint8, 7); + + +static GstFlowReturn +gst_cutter_chain (GstPad * pad, GstBuffer * buf) +{ + GstCutter *filter; + gint16 *in_data; + guint num_samples; + gdouble NCS = 0.0; /* Normalized Cumulative Square of buffer */ + gdouble RMS = 0.0; /* RMS of signal in buffer */ + gdouble NMS = 0.0; /* Normalized Mean Square of buffer */ + GstBuffer *prebuf; /* pointer to a prebuffer element */ + + g_return_val_if_fail (pad != NULL, GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR); + g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); + + filter = GST_CUTTER (GST_OBJECT_PARENT (pad)); + g_return_val_if_fail (filter != NULL, GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_CUTTER (filter), GST_FLOW_ERROR); + + if (!filter->have_caps) { + if (!(gst_cutter_get_caps (pad, filter))) + return GST_FLOW_NOT_NEGOTIATED; + } + + in_data = (gint16 *) GST_BUFFER_DATA (buf); + GST_LOG_OBJECT (filter, "length of prerec buffer: %" GST_TIME_FORMAT, + GST_TIME_ARGS (filter->pre_run_length)); + + /* calculate mean square value on buffer */ + switch (filter->width) { + case 16: + num_samples = GST_BUFFER_SIZE (buf) / 2; + gst_cutter_calculate_gint16 (in_data, num_samples, &NCS); + NMS = NCS / num_samples; + break; + case 8: + num_samples = GST_BUFFER_SIZE (buf); + gst_cutter_calculate_gint8 ((gint8 *) in_data, num_samples, &NCS); + NMS = NCS / num_samples; + break; + default: + /* this shouldn't happen */ + g_warning ("no mean square function for width %d\n", filter->width); + break; + } + + filter->silent_prev = filter->silent; + + RMS = sqrt (NMS); + /* if RMS below threshold, add buffer length to silent run length count + * if not, reset + */ + GST_LOG_OBJECT (filter, "buffer stats: NMS %f, RMS %f, audio length %f", NMS, + RMS, + gst_guint64_to_gdouble (gst_audio_duration_from_pad_buffer + (filter->sinkpad, buf))); + if (RMS < filter->threshold_level) + filter->silent_run_length += + gst_guint64_to_gdouble (gst_audio_duration_from_pad_buffer + (filter->sinkpad, buf)); + else { + filter->silent_run_length = 0 * GST_SECOND; + filter->silent = FALSE; + } + + if (filter->silent_run_length > filter->threshold_length) + /* it has been silent long enough, flag it */ + filter->silent = TRUE; + + /* has the silent status changed ? if so, send right signal + * and, if from silent -> not silent, flush pre_record buffer + */ + if (filter->silent != filter->silent_prev) { + if (filter->silent) { + GstMessage *m = + gst_cutter_message_new (filter, FALSE, GST_BUFFER_TIMESTAMP (buf)); + GST_DEBUG_OBJECT (filter, "signaling CUT_STOP"); + gst_element_post_message (GST_ELEMENT (filter), m); + } else { + gint count = 0; + GstMessage *m = + gst_cutter_message_new (filter, TRUE, GST_BUFFER_TIMESTAMP (buf)); + + GST_DEBUG_OBJECT (filter, "signaling CUT_START"); + gst_element_post_message (GST_ELEMENT (filter), m); + /* first of all, flush current buffer */ + GST_DEBUG_OBJECT (filter, "flushing buffer of length %" GST_TIME_FORMAT, + GST_TIME_ARGS (filter->pre_run_length)); + while (filter->pre_buffer) { + prebuf = (g_list_first (filter->pre_buffer))->data; + filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); + gst_pad_push (filter->srcpad, prebuf); + ++count; + } + GST_DEBUG_OBJECT (filter, "flushed %d buffers", count); + filter->pre_run_length = 0 * GST_SECOND; + } + } + /* now check if we have to send the new buffer to the internal buffer cache + * or to the srcpad */ + if (filter->silent) { + filter->pre_buffer = g_list_append (filter->pre_buffer, buf); + filter->pre_run_length += + gst_guint64_to_gdouble (gst_audio_duration_from_pad_buffer + (filter->sinkpad, buf)); + while (filter->pre_run_length > filter->pre_length) { + prebuf = (g_list_first (filter->pre_buffer))->data; + g_assert (GST_IS_BUFFER (prebuf)); + filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); + filter->pre_run_length -= + gst_guint64_to_gdouble (gst_audio_duration_from_pad_buffer + (filter->sinkpad, prebuf)); + /* only pass buffers if we don't leak */ + if (!filter->leaky) + gst_pad_push (filter->srcpad, prebuf); + else + gst_buffer_unref (prebuf); + } + } else + gst_pad_push (filter->srcpad, buf); + + return GST_FLOW_OK; +} + + +static gboolean +gst_cutter_get_caps (GstPad * pad, GstCutter * filter) +{ + GstCaps *caps; + GstStructure *structure; + + caps = gst_pad_get_caps (pad); + if (!caps) { + GST_INFO ("no caps on pad %s:%s", GST_DEBUG_PAD_NAME (pad)); + return FALSE; + } + structure = gst_caps_get_structure (caps, 0); + gst_structure_get_int (structure, "width", &filter->width); + filter->max_sample = 1 << (filter->width - 1); /* signed */ + filter->have_caps = TRUE; + + gst_caps_unref (caps); + return TRUE; +} + + +static void +gst_cutter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstCutter *filter; + + g_return_if_fail (GST_IS_CUTTER (object)); + filter = GST_CUTTER (object); + + switch (prop_id) { + case PROP_THRESHOLD: + filter->threshold_level = g_value_get_double (value); + GST_DEBUG ("DEBUG: set threshold level to %f", filter->threshold_level); + break; + case PROP_THRESHOLD_DB: + /* set the level given in dB + * value in dB = 20 * log (value) + * values in dB < 0 result in values between 0 and 1 + */ + filter->threshold_level = pow (10, g_value_get_double (value) / 20); + GST_DEBUG_OBJECT (filter, "set threshold level to %f", + filter->threshold_level); + break; + case PROP_RUN_LENGTH: + /* set the minimum length of the silent run required */ + filter->threshold_length = + gst_guint64_to_gdouble (g_value_get_uint64 (value)); + break; + case PROP_PRE_LENGTH: + /* set the length of the pre-record block */ + filter->pre_length = gst_guint64_to_gdouble (g_value_get_uint64 (value)); + break; + case PROP_LEAKY: + /* set if the pre-record buffer is leaky or not */ + filter->leaky = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_cutter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstCutter *filter; + + g_return_if_fail (GST_IS_CUTTER (object)); + filter = GST_CUTTER (object); + + switch (prop_id) { + case PROP_RUN_LENGTH: + g_value_set_uint64 (value, filter->threshold_length); + break; + case PROP_THRESHOLD: + g_value_set_double (value, filter->threshold_level); + break; + case PROP_THRESHOLD_DB: + g_value_set_double (value, 20 * log (filter->threshold_level)); + break; + case PROP_PRE_LENGTH: + g_value_set_uint64 (value, filter->pre_length); + break; + case PROP_LEAKY: + g_value_set_boolean (value, filter->leaky); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "cutter", GST_RANK_NONE, GST_TYPE_CUTTER)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "cutter", + "Audio Cutter to split audio into non-silent bits", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/cutter/gstcutter.h b/gst/cutter/gstcutter.h new file mode 100644 index 0000000..d64c301 --- /dev/null +++ b/gst/cutter/gstcutter.h @@ -0,0 +1,86 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_CUTTER_H__ +#define __GST_CUTTER_H__ + + +#include +/* #include */ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#define GST_TYPE_CUTTER \ + (gst_cutter_get_type()) +#define GST_CUTTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUTTER,GstCutter)) +#define GST_CUTTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CUTTER,GstCutterClass)) +#define GST_IS_CUTTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUTTER)) +#define GST_IS_CUTTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CUTTER)) + +typedef struct _GstCutter GstCutter; +typedef struct _GstCutterClass GstCutterClass; + +struct _GstCutter +{ + GstElement element; + + GstPad *sinkpad, *srcpad; + + double threshold_level; /* level below which to cut */ + double threshold_length; /* how long signal has to remain + * below this level before cutting */ + + double silent_run_length; /* how long has it been below threshold ? */ + gboolean silent; + gboolean silent_prev; + + double pre_length; /* how long can the pre-record buffer be ? */ + double pre_run_length; /* how long is it currently ? */ + GList *pre_buffer; /* list of GstBuffers in pre-record buffer */ + gboolean leaky; /* do we leak an overflowing prebuffer ? */ + + gboolean have_caps; /* did we get the needed caps yet ? */ + gint width; /* bit width of data */ + long max_sample; /* maximum sample value */ +}; + +struct _GstCutterClass +{ + GstElementClass parent_class; + void (*cut_start) (GstCutter* filter); + void (*cut_stop) (GstCutter* filter); +}; + +GType gst_cutter_get_type (void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __GST_STEREO_H__ */ diff --git a/gst/debugutils/Makefile.am b/gst/debugutils/Makefile.am new file mode 100644 index 0000000..7f3edf0 --- /dev/null +++ b/gst/debugutils/Makefile.am @@ -0,0 +1,66 @@ +if GST_HAVE_MMAP +EFENCE_PLUGIN=libgstefence.la +else +EFENCE_PLUGIN= +endif + +plugin_LTLIBRARIES = $(EFENCE_PLUGIN) libgstdebug.la libgstnavigationtest.la + +noinst_HEADERS = \ + cpureport.h \ + efence.h \ + gstcapsdebug.h \ + gstcapssetter.h \ + gstnavigationtest.h \ + gstnavseek.h \ + gstpushfilesrc.h \ + gsttaginject.h \ + progressreport.h \ + tests.h + +libgstefence_la_SOURCES = efence.c +libgstefence_la_CFLAGS = $(GST_CFLAGS) +libgstefence_la_LIBADD = $(GST_LIBS) +libgstefence_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstefence_la_LIBTOOLFLAGS = --tag=disable-static + +libgstnavigationtest_la_SOURCES = gstnavigationtest.c +libgstnavigationtest_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) +libgstnavigationtest_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(LIBM) +libgstnavigationtest_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstnavigationtest_la_LIBTOOLFLAGS = --tag=disable-static + +libgstdebug_la_SOURCES = \ + gstdebug.c \ + breakmydata.c \ + gstcapsdebug.c \ + gstcapssetter.c \ + gstnavseek.c \ + gstpushfilesrc.c \ + gsttaginject.c \ + rndbuffersize.c \ + progressreport.c \ + tests.c \ + cpureport.c \ + testplugin.c + +libgstdebug_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) +libgstdebug_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstdebug_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstdebug_la_LIBTOOLFLAGS = --tag=disable-static + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstdebug -:SHARED libgstdebug \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstdebug_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstdebug_la_CFLAGS) \ + -:LDFLAGS $(libgstdebug_la_LDFLAGS) \ + $(libgstdebug_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/debugutils/Makefile.in b/gst/debugutils/Makefile.in new file mode 100644 index 0000000..16cc203 --- /dev/null +++ b/gst/debugutils/Makefile.in @@ -0,0 +1,994 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/debugutils +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstdebug_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstdebug_la_OBJECTS = libgstdebug_la-gstdebug.lo \ + libgstdebug_la-breakmydata.lo libgstdebug_la-gstcapsdebug.lo \ + libgstdebug_la-gstcapssetter.lo libgstdebug_la-gstnavseek.lo \ + libgstdebug_la-gstpushfilesrc.lo \ + libgstdebug_la-gsttaginject.lo libgstdebug_la-rndbuffersize.lo \ + libgstdebug_la-progressreport.lo libgstdebug_la-tests.lo \ + libgstdebug_la-cpureport.lo libgstdebug_la-testplugin.lo +libgstdebug_la_OBJECTS = $(am_libgstdebug_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstdebug_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstdebug_la_CFLAGS) $(CFLAGS) \ + $(libgstdebug_la_LDFLAGS) $(LDFLAGS) -o $@ +libgstefence_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libgstefence_la_OBJECTS = libgstefence_la-efence.lo +libgstefence_la_OBJECTS = $(am_libgstefence_la_OBJECTS) +libgstefence_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstefence_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstefence_la_CFLAGS) $(CFLAGS) \ + $(libgstefence_la_LDFLAGS) $(LDFLAGS) -o $@ +@GST_HAVE_MMAP_TRUE@am_libgstefence_la_rpath = -rpath $(plugindir) +libgstnavigationtest_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstnavigationtest_la_OBJECTS = \ + libgstnavigationtest_la-gstnavigationtest.lo +libgstnavigationtest_la_OBJECTS = \ + $(am_libgstnavigationtest_la_OBJECTS) +libgstnavigationtest_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstnavigationtest_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstnavigationtest_la_CFLAGS) \ + $(CFLAGS) $(libgstnavigationtest_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstdebug_la_SOURCES) $(libgstefence_la_SOURCES) \ + $(libgstnavigationtest_la_SOURCES) +DIST_SOURCES = $(libgstdebug_la_SOURCES) $(libgstefence_la_SOURCES) \ + $(libgstnavigationtest_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@GST_HAVE_MMAP_FALSE@EFENCE_PLUGIN = +@GST_HAVE_MMAP_TRUE@EFENCE_PLUGIN = libgstefence.la +plugin_LTLIBRARIES = $(EFENCE_PLUGIN) libgstdebug.la libgstnavigationtest.la +noinst_HEADERS = \ + cpureport.h \ + efence.h \ + gstcapsdebug.h \ + gstcapssetter.h \ + gstnavigationtest.h \ + gstnavseek.h \ + gstpushfilesrc.h \ + gsttaginject.h \ + progressreport.h \ + tests.h + +libgstefence_la_SOURCES = efence.c +libgstefence_la_CFLAGS = $(GST_CFLAGS) +libgstefence_la_LIBADD = $(GST_LIBS) +libgstefence_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstefence_la_LIBTOOLFLAGS = --tag=disable-static +libgstnavigationtest_la_SOURCES = gstnavigationtest.c +libgstnavigationtest_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) + +libgstnavigationtest_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(LIBM) + +libgstnavigationtest_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstnavigationtest_la_LIBTOOLFLAGS = --tag=disable-static +libgstdebug_la_SOURCES = \ + gstdebug.c \ + breakmydata.c \ + gstcapsdebug.c \ + gstcapssetter.c \ + gstnavseek.c \ + gstpushfilesrc.c \ + gsttaginject.c \ + rndbuffersize.c \ + progressreport.c \ + tests.c \ + cpureport.c \ + testplugin.c + +libgstdebug_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) +libgstdebug_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstdebug_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstdebug_la_LIBTOOLFLAGS = --tag=disable-static +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/debugutils/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/debugutils/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstdebug.la: $(libgstdebug_la_OBJECTS) $(libgstdebug_la_DEPENDENCIES) $(EXTRA_libgstdebug_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstdebug_la_LINK) -rpath $(plugindir) $(libgstdebug_la_OBJECTS) $(libgstdebug_la_LIBADD) $(LIBS) +libgstefence.la: $(libgstefence_la_OBJECTS) $(libgstefence_la_DEPENDENCIES) $(EXTRA_libgstefence_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstefence_la_LINK) $(am_libgstefence_la_rpath) $(libgstefence_la_OBJECTS) $(libgstefence_la_LIBADD) $(LIBS) +libgstnavigationtest.la: $(libgstnavigationtest_la_OBJECTS) $(libgstnavigationtest_la_DEPENDENCIES) $(EXTRA_libgstnavigationtest_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstnavigationtest_la_LINK) -rpath $(plugindir) $(libgstnavigationtest_la_OBJECTS) $(libgstnavigationtest_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-breakmydata.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-cpureport.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstcapsdebug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstcapssetter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstdebug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstnavseek.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstpushfilesrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gsttaginject.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-progressreport.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-rndbuffersize.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-testplugin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-tests.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstefence_la-efence.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnavigationtest_la-gstnavigationtest.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstdebug_la-gstdebug.lo: gstdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstdebug.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstdebug.Tpo -c -o libgstdebug_la-gstdebug.lo `test -f 'gstdebug.c' || echo '$(srcdir)/'`gstdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstdebug.Tpo $(DEPDIR)/libgstdebug_la-gstdebug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdebug.c' object='libgstdebug_la-gstdebug.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstdebug.lo `test -f 'gstdebug.c' || echo '$(srcdir)/'`gstdebug.c + +libgstdebug_la-breakmydata.lo: breakmydata.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-breakmydata.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-breakmydata.Tpo -c -o libgstdebug_la-breakmydata.lo `test -f 'breakmydata.c' || echo '$(srcdir)/'`breakmydata.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-breakmydata.Tpo $(DEPDIR)/libgstdebug_la-breakmydata.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='breakmydata.c' object='libgstdebug_la-breakmydata.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-breakmydata.lo `test -f 'breakmydata.c' || echo '$(srcdir)/'`breakmydata.c + +libgstdebug_la-gstcapsdebug.lo: gstcapsdebug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstcapsdebug.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstcapsdebug.Tpo -c -o libgstdebug_la-gstcapsdebug.lo `test -f 'gstcapsdebug.c' || echo '$(srcdir)/'`gstcapsdebug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstcapsdebug.Tpo $(DEPDIR)/libgstdebug_la-gstcapsdebug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcapsdebug.c' object='libgstdebug_la-gstcapsdebug.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstcapsdebug.lo `test -f 'gstcapsdebug.c' || echo '$(srcdir)/'`gstcapsdebug.c + +libgstdebug_la-gstcapssetter.lo: gstcapssetter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstcapssetter.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstcapssetter.Tpo -c -o libgstdebug_la-gstcapssetter.lo `test -f 'gstcapssetter.c' || echo '$(srcdir)/'`gstcapssetter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstcapssetter.Tpo $(DEPDIR)/libgstdebug_la-gstcapssetter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcapssetter.c' object='libgstdebug_la-gstcapssetter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstcapssetter.lo `test -f 'gstcapssetter.c' || echo '$(srcdir)/'`gstcapssetter.c + +libgstdebug_la-gstnavseek.lo: gstnavseek.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstnavseek.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstnavseek.Tpo -c -o libgstdebug_la-gstnavseek.lo `test -f 'gstnavseek.c' || echo '$(srcdir)/'`gstnavseek.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstnavseek.Tpo $(DEPDIR)/libgstdebug_la-gstnavseek.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstnavseek.c' object='libgstdebug_la-gstnavseek.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstnavseek.lo `test -f 'gstnavseek.c' || echo '$(srcdir)/'`gstnavseek.c + +libgstdebug_la-gstpushfilesrc.lo: gstpushfilesrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstpushfilesrc.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstpushfilesrc.Tpo -c -o libgstdebug_la-gstpushfilesrc.lo `test -f 'gstpushfilesrc.c' || echo '$(srcdir)/'`gstpushfilesrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstpushfilesrc.Tpo $(DEPDIR)/libgstdebug_la-gstpushfilesrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstpushfilesrc.c' object='libgstdebug_la-gstpushfilesrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstpushfilesrc.lo `test -f 'gstpushfilesrc.c' || echo '$(srcdir)/'`gstpushfilesrc.c + +libgstdebug_la-gsttaginject.lo: gsttaginject.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gsttaginject.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gsttaginject.Tpo -c -o libgstdebug_la-gsttaginject.lo `test -f 'gsttaginject.c' || echo '$(srcdir)/'`gsttaginject.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gsttaginject.Tpo $(DEPDIR)/libgstdebug_la-gsttaginject.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttaginject.c' object='libgstdebug_la-gsttaginject.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gsttaginject.lo `test -f 'gsttaginject.c' || echo '$(srcdir)/'`gsttaginject.c + +libgstdebug_la-rndbuffersize.lo: rndbuffersize.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-rndbuffersize.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-rndbuffersize.Tpo -c -o libgstdebug_la-rndbuffersize.lo `test -f 'rndbuffersize.c' || echo '$(srcdir)/'`rndbuffersize.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-rndbuffersize.Tpo $(DEPDIR)/libgstdebug_la-rndbuffersize.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rndbuffersize.c' object='libgstdebug_la-rndbuffersize.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-rndbuffersize.lo `test -f 'rndbuffersize.c' || echo '$(srcdir)/'`rndbuffersize.c + +libgstdebug_la-progressreport.lo: progressreport.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-progressreport.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-progressreport.Tpo -c -o libgstdebug_la-progressreport.lo `test -f 'progressreport.c' || echo '$(srcdir)/'`progressreport.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-progressreport.Tpo $(DEPDIR)/libgstdebug_la-progressreport.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='progressreport.c' object='libgstdebug_la-progressreport.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-progressreport.lo `test -f 'progressreport.c' || echo '$(srcdir)/'`progressreport.c + +libgstdebug_la-tests.lo: tests.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-tests.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-tests.Tpo -c -o libgstdebug_la-tests.lo `test -f 'tests.c' || echo '$(srcdir)/'`tests.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-tests.Tpo $(DEPDIR)/libgstdebug_la-tests.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests.c' object='libgstdebug_la-tests.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-tests.lo `test -f 'tests.c' || echo '$(srcdir)/'`tests.c + +libgstdebug_la-cpureport.lo: cpureport.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-cpureport.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-cpureport.Tpo -c -o libgstdebug_la-cpureport.lo `test -f 'cpureport.c' || echo '$(srcdir)/'`cpureport.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-cpureport.Tpo $(DEPDIR)/libgstdebug_la-cpureport.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cpureport.c' object='libgstdebug_la-cpureport.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-cpureport.lo `test -f 'cpureport.c' || echo '$(srcdir)/'`cpureport.c + +libgstdebug_la-testplugin.lo: testplugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-testplugin.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-testplugin.Tpo -c -o libgstdebug_la-testplugin.lo `test -f 'testplugin.c' || echo '$(srcdir)/'`testplugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-testplugin.Tpo $(DEPDIR)/libgstdebug_la-testplugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testplugin.c' object='libgstdebug_la-testplugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-testplugin.lo `test -f 'testplugin.c' || echo '$(srcdir)/'`testplugin.c + +libgstefence_la-efence.lo: efence.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstefence_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstefence_la_CFLAGS) $(CFLAGS) -MT libgstefence_la-efence.lo -MD -MP -MF $(DEPDIR)/libgstefence_la-efence.Tpo -c -o libgstefence_la-efence.lo `test -f 'efence.c' || echo '$(srcdir)/'`efence.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstefence_la-efence.Tpo $(DEPDIR)/libgstefence_la-efence.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='efence.c' object='libgstefence_la-efence.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstefence_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstefence_la_CFLAGS) $(CFLAGS) -c -o libgstefence_la-efence.lo `test -f 'efence.c' || echo '$(srcdir)/'`efence.c + +libgstnavigationtest_la-gstnavigationtest.lo: gstnavigationtest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnavigationtest_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnavigationtest_la_CFLAGS) $(CFLAGS) -MT libgstnavigationtest_la-gstnavigationtest.lo -MD -MP -MF $(DEPDIR)/libgstnavigationtest_la-gstnavigationtest.Tpo -c -o libgstnavigationtest_la-gstnavigationtest.lo `test -f 'gstnavigationtest.c' || echo '$(srcdir)/'`gstnavigationtest.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstnavigationtest_la-gstnavigationtest.Tpo $(DEPDIR)/libgstnavigationtest_la-gstnavigationtest.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstnavigationtest.c' object='libgstnavigationtest_la-gstnavigationtest.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnavigationtest_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnavigationtest_la_CFLAGS) $(CFLAGS) -c -o libgstnavigationtest_la-gstnavigationtest.lo `test -f 'gstnavigationtest.c' || echo '$(srcdir)/'`gstnavigationtest.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstdebug -:SHARED libgstdebug \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstdebug_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstdebug_la_CFLAGS) \ + -:LDFLAGS $(libgstdebug_la_LDFLAGS) \ + $(libgstdebug_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/debugutils/breakmydata.c b/gst/debugutils/breakmydata.c new file mode 100644 index 0000000..d04256a --- /dev/null +++ b/gst/debugutils/breakmydata.c @@ -0,0 +1,295 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * 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-breakmydata + * + * This element modifies the contents of the buffer it is passed randomly + * according to the parameters set. + * It otherwise acts as an identity. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (gst_break_my_data_debug); +#define GST_CAT_DEFAULT gst_break_my_data_debug + +#define GST_TYPE_BREAK_MY_DATA \ + (gst_break_my_data_get_type()) +#define GST_BREAK_MY_DATA(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BREAK_MY_DATA,GstBreakMyData)) +#define GST_BREAK_MY_DATA_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BREAK_MY_DATA,GstBreakMyDataClass)) +#define GST_IS_BREAK_MY_DATA(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BREAK_MY_DATA)) +#define GST_IS_BREAK_MY_DATA_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BREAK_MY_DATA)) + +enum +{ + ARG_0, + ARG_SEED, + ARG_SET_TO, + ARG_SKIP, + ARG_PROBABILITY +}; + +typedef struct _GstBreakMyData GstBreakMyData; +typedef struct _GstBreakMyDataClass GstBreakMyDataClass; + +struct _GstBreakMyData +{ + GstBaseTransform basetransform; + + GRand *rand; + guint skipped; + + guint32 seed; + gint set; + guint skip; + gdouble probability; +}; + +struct _GstBreakMyDataClass +{ + GstBaseTransformClass parent_class; +}; + +static void gst_break_my_data_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_break_my_data_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_break_my_data_transform_ip (GstBaseTransform * trans, + GstBuffer * buf); +static gboolean gst_break_my_data_stop (GstBaseTransform * trans); +static gboolean gst_break_my_data_start (GstBaseTransform * trans); + +GstStaticPadTemplate bmd_src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GstStaticPadTemplate bmd_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_break_my_data_debug, "breakmydata", 0, \ + "debugging category for breakmydata element"); + +GType gst_break_my_data_get_type (void); +GST_BOILERPLATE_FULL (GstBreakMyData, gst_break_my_data, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); + + +static void +gst_break_my_data_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (gstelement_class, + &bmd_sink_template); + gst_element_class_add_static_pad_template (gstelement_class, + &bmd_src_template); + + gst_element_class_set_details_simple (gstelement_class, "Break my data", + "Testing", + "randomly change data in the stream", "Benjamin Otte "); +} + +static void +gst_break_my_data_class_init (GstBreakMyDataClass * klass) +{ + GstBaseTransformClass *gstbasetrans_class; + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (klass); + + gobject_class->set_property = gst_break_my_data_set_property; + gobject_class->get_property = gst_break_my_data_get_property; + + g_object_class_install_property (gobject_class, ARG_SEED, + g_param_spec_uint ("seed", "seed", + "seed for randomness (initialized when going from READY to PAUSED)", + 0, G_MAXUINT32, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_SET_TO, + g_param_spec_int ("set-to", "set-to", + "set changed bytes to this value (-1 means random value", + -1, G_MAXUINT8, -1, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_SKIP, + g_param_spec_uint ("skip", "skip", + "amount of bytes skipped at the beginning of stream", + 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_PROBABILITY, + g_param_spec_double ("probability", "probability", + "probability for each byte in the buffer to be changed", 0.0, 1.0, + 0.0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + gstbasetrans_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_break_my_data_transform_ip); + gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_break_my_data_start); + gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_break_my_data_stop); +} + +static void +gst_break_my_data_init (GstBreakMyData * bmd, GstBreakMyDataClass * g_class) +{ + gst_base_transform_set_in_place (GST_BASE_TRANSFORM (bmd), TRUE); +} + +static void +gst_break_my_data_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstBreakMyData *bmd = GST_BREAK_MY_DATA (object); + + GST_OBJECT_LOCK (bmd); + + switch (prop_id) { + case ARG_SEED: + bmd->seed = g_value_get_uint (value); + break; + case ARG_SET_TO: + bmd->set = g_value_get_int (value); + break; + case ARG_SKIP: + bmd->skip = g_value_get_uint (value); + break; + case ARG_PROBABILITY: + bmd->probability = g_value_get_double (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (bmd); +} + +static void +gst_break_my_data_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstBreakMyData *bmd = GST_BREAK_MY_DATA (object); + + GST_OBJECT_LOCK (bmd); + + switch (prop_id) { + case ARG_SEED: + g_value_set_uint (value, bmd->seed); + break; + case ARG_SET_TO: + g_value_set_int (value, bmd->set); + break; + case ARG_SKIP: + g_value_set_uint (value, bmd->skip); + break; + case ARG_PROBABILITY: + g_value_set_double (value, bmd->probability); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (bmd); +} + +static GstFlowReturn +gst_break_my_data_transform_ip (GstBaseTransform * trans, GstBuffer * buf) +{ + GstBreakMyData *bmd = GST_BREAK_MY_DATA (trans); + guint i, size; + + g_return_val_if_fail (gst_buffer_is_writable (buf), GST_FLOW_ERROR); + + GST_OBJECT_LOCK (bmd); + + if (bmd->skipped < bmd->skip) { + i = bmd->skip - bmd->skipped; + } else { + i = 0; + } + + size = GST_BUFFER_SIZE (buf); + + GST_LOG_OBJECT (bmd, + "got buffer %p (size %u, timestamp %" G_GUINT64_FORMAT ", offset %" + G_GUINT64_FORMAT "", buf, size, GST_BUFFER_TIMESTAMP (buf), + GST_BUFFER_OFFSET (buf)); + + for (; i < size; i++) { + if (g_rand_double_range (bmd->rand, 0, 1.0) <= bmd->probability) { + guint8 new; + + if (bmd->set < 0) { + new = g_rand_int_range (bmd->rand, 0, 256); + } else { + new = bmd->set; + } + GST_INFO_OBJECT (bmd, "changing byte %u from 0x%02X to 0x%02X", i, + (guint) GST_READ_UINT8 (GST_BUFFER_DATA (buf) + i), + (guint) ((guint8) new)); + GST_BUFFER_DATA (buf)[i] = new; + } + } + /* don't overflow */ + bmd->skipped += MIN (G_MAXUINT - bmd->skipped, GST_BUFFER_SIZE (buf)); + + GST_OBJECT_UNLOCK (bmd); + + return GST_FLOW_OK; +} + +static gboolean +gst_break_my_data_start (GstBaseTransform * trans) +{ + GstBreakMyData *bmd = GST_BREAK_MY_DATA (trans); + + GST_OBJECT_LOCK (bmd); + bmd->rand = g_rand_new_with_seed (bmd->seed); + bmd->skipped = 0; + GST_OBJECT_UNLOCK (bmd); + + return TRUE; +} + +static gboolean +gst_break_my_data_stop (GstBaseTransform * trans) +{ + GstBreakMyData *bmd = GST_BREAK_MY_DATA (trans); + + GST_OBJECT_LOCK (bmd); + g_rand_free (bmd->rand); + bmd->rand = NULL; + GST_OBJECT_UNLOCK (bmd); + + return TRUE; +} diff --git a/gst/debugutils/cpureport.c b/gst/debugutils/cpureport.c new file mode 100644 index 0000000..b2b6808 --- /dev/null +++ b/gst/debugutils/cpureport.c @@ -0,0 +1,153 @@ +/* GStreamer Cpu Report Element + * Copyright (C) <2010> Zaheer Abbas Merali + * + * 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 +#include +#include +#include + +#include "cpureport.h" + + +enum +{ + ARG_0, +}; + +GstStaticPadTemplate cpu_report_src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GstStaticPadTemplate cpu_report_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstFlowReturn gst_cpu_report_transform_ip (GstBaseTransform * trans, + GstBuffer * buf); + +static gboolean gst_cpu_report_start (GstBaseTransform * trans); +static gboolean gst_cpu_report_stop (GstBaseTransform * trans); + +GST_BOILERPLATE (GstCpuReport, gst_cpu_report, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void +gst_cpu_report_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &cpu_report_sink_template); + gst_element_class_add_static_pad_template (element_class, + &cpu_report_src_template); + + gst_element_class_set_details_simple (element_class, "CPU report", + "Testing", + "Post cpu usage information every buffer", + "Zaheer Abbas Merali "); +} + +static void +gst_cpu_report_finalize (GObject * obj) +{ + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_cpu_report_class_init (GstCpuReportClass * g_class) +{ + GstBaseTransformClass *gstbasetrans_class; + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (g_class); + gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (g_class); + + gobject_class->finalize = gst_cpu_report_finalize; + + gstbasetrans_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_cpu_report_transform_ip); + gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_cpu_report_start); + gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_cpu_report_stop); +} + +static void +gst_cpu_report_init (GstCpuReport * report, GstCpuReportClass * g_class) +{ + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (report), TRUE); + +} + +static GstFlowReturn +gst_cpu_report_transform_ip (GstBaseTransform * trans, GstBuffer * buf) +{ + GstCpuReport *filter; + GTimeVal cur_time; + clock_t cur_cpu_time; + GstMessage *msg; + GstStructure *s; + gint64 time_taken; + + + g_get_current_time (&cur_time); + cur_cpu_time = clock (); + + filter = GST_CPU_REPORT (trans); + + + time_taken = GST_TIMEVAL_TO_TIME (cur_time) - + GST_TIMEVAL_TO_TIME (filter->last_time); + + s = gst_structure_new ("cpu-report", "cpu-time", G_TYPE_DOUBLE, + ((gdouble) (cur_cpu_time - filter->last_cpu_time)), + "actual-time", G_TYPE_INT64, time_taken, "buffer-time", G_TYPE_INT64, + GST_BUFFER_TIMESTAMP (buf), NULL); + msg = gst_message_new_element (GST_OBJECT_CAST (filter), s); + gst_element_post_message (GST_ELEMENT_CAST (filter), msg); + filter->last_time = cur_time; + filter->last_cpu_time = cur_cpu_time; + + + return GST_FLOW_OK; +} + +static gboolean +gst_cpu_report_start (GstBaseTransform * trans) +{ + GstCpuReport *filter; + + filter = GST_CPU_REPORT (trans); + + g_get_current_time (&filter->last_time); + filter->start_time = filter->last_time; + filter->last_cpu_time = clock (); + return TRUE; +} + +static gboolean +gst_cpu_report_stop (GstBaseTransform * trans) +{ + /* anything we should be doing here? */ + return TRUE; +} diff --git a/gst/debugutils/cpureport.h b/gst/debugutils/cpureport.h new file mode 100644 index 0000000..d1a0966 --- /dev/null +++ b/gst/debugutils/cpureport.h @@ -0,0 +1,58 @@ +/* GStreamer CPU Report Element + * Copyright (C) <2010> Zaheer Abbas Merali + * + * 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_CPU_REPORT_H__ +#define __GST_CPU_REPORT_H__ + +#include + +#include + +G_BEGIN_DECLS +#define GST_TYPE_CPU_REPORT \ + (gst_cpu_report_get_type()) +#define GST_CPU_REPORT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CPU_REPORT,GstCpuReport)) +#define GST_CPU_REPORT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CPU_REPORT,GstCpuReportClass)) +#define GST_IS_CPU_REPORT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CPU_REPORT)) +#define GST_IS_CPU_REPORT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CPU_REPORT)) +typedef struct _GstCpuReport GstCpuReport; +typedef struct _GstCpuReportClass GstCpuReportClass; + +struct _GstCpuReport +{ + GstBaseTransform basetransform; + + GTimeVal start_time; + GTimeVal last_time; + clock_t last_cpu_time; +}; + +struct _GstCpuReportClass +{ + GstBaseTransformClass parent_class; +}; + +GType gst_cpu_report_get_type (void); + +G_END_DECLS +#endif /* __GST_CPU_REPORT_H__ */ diff --git a/gst/debugutils/efence.c b/gst/debugutils/efence.c new file mode 100644 index 0000000..a26b31f --- /dev/null +++ b/gst/debugutils/efence.c @@ -0,0 +1,532 @@ +/* + * GStreamer + * Copyright (C) 1999-2001 Erik Walthinsen + * Copyright (C) 2002 David A. Schleef + * + * 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 + +#include +#include +#include + +#include "efence.h" + +#ifndef MAP_ANONYMOUS +#ifdef MAP_ANON +#define MAP_ANONYMOUS MAP_ANON +#else +/* assume we don't need it */ +#define MAP_ANONYMOUS 0 +#endif +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_efence_debug); +#define GST_CAT_DEFAULT gst_efence_debug + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, + ARG_FENCE_TOP +}; + +static GstStaticPadTemplate gst_efence_sink_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_efence_src_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static void gst_efence_base_init (gpointer g_class); +static void gst_efence_class_init (GstEFenceClass * klass); +static void gst_efence_init (GstEFence * filter); + +static void gst_efence_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_efence_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_efence_chain (GstPad * pad, GstBuffer * buf); +static GstFlowReturn gst_efence_getrange (GstPad * pad, guint64 offset, + guint length, GstBuffer ** buffer); +static gboolean gst_efence_checkgetrange (GstPad * pad); +static gboolean gst_efence_activate_src_pull (GstPad * pad, gboolean active); + +static GstElementClass *parent_class = NULL; + +typedef struct _GstFencedBuffer GstFencedBuffer; +struct _GstFencedBuffer +{ + GstBuffer buffer; + void *region; + unsigned int length; +}; + +GType gst_fenced_buffer_get_type (void); +static void gst_fenced_buffer_finalize (GstFencedBuffer * buf); +static GstFencedBuffer *gst_fenced_buffer_copy (const GstBuffer * buffer); +static void *gst_fenced_buffer_alloc (GstBuffer * buffer, unsigned int length, + gboolean fence_top); +static GstFlowReturn gst_efence_buffer_alloc (GstPad * pad, guint64 offset, + guint size, GstCaps * caps, GstBuffer ** buf); + +#define GST_TYPE_FENCED_BUFFER (gst_fenced_buffer_get_type()) + +#define GST_IS_FENCED_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_FENCED_BUFFER)) +#define GST_FENCED_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_FENCED_BUFFER, GstFencedBuffer)) + +GType +gst_gst_efence_get_type (void) +{ + static GType plugin_type = 0; + + if (!plugin_type) { + static const GTypeInfo plugin_info = { + sizeof (GstEFenceClass), + gst_efence_base_init, + NULL, + (GClassInitFunc) gst_efence_class_init, + NULL, + NULL, + sizeof (GstEFence), + 0, + (GInstanceInitFunc) gst_efence_init, + }; + + plugin_type = g_type_register_static (GST_TYPE_ELEMENT, + "GstEFence", &plugin_info, 0); + } + return plugin_type; +} + +static void +gst_efence_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_efence_sink_factory); + gst_element_class_add_static_pad_template (element_class, + &gst_efence_src_factory); + gst_element_class_set_details_simple (element_class, "Electric Fence", + "Testing", + "This element converts a stream of normal GStreamer buffers into a " + "stream of buffers that are allocated in such a way that out-of-bounds " + "access to data in the buffer is more likely to cause segmentation " + "faults. This allocation method is very similar to the debugging tool " + "\"Electric Fence\".", "David A. Schleef "); +} + +/* initialize the plugin's class */ +static void +gst_efence_class_init (GstEFenceClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_efence_set_property; + gobject_class->get_property = gst_efence_get_property; + + g_object_class_install_property (gobject_class, ARG_FENCE_TOP, + g_param_spec_boolean ("fence-top", "Fence Top", + "Align buffers with top of fenced region", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +/* initialize the new element + * instantiate pads and add them to element + * set functions + * initialize structure + */ +static void +gst_efence_init (GstEFence * filter) +{ + filter->sinkpad = + gst_pad_new_from_static_template (&gst_efence_sink_factory, "sink"); + gst_pad_set_getcaps_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); + gst_pad_set_setcaps_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps)); + gst_pad_set_chain_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_efence_chain)); + gst_pad_set_bufferalloc_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_efence_buffer_alloc)); + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + + filter->srcpad = + gst_pad_new_from_static_template (&gst_efence_src_factory, "src"); + gst_pad_set_getcaps_function (filter->srcpad, + GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); + gst_pad_set_setcaps_function (filter->srcpad, + GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps)); + gst_pad_set_checkgetrange_function (filter->srcpad, + GST_DEBUG_FUNCPTR (gst_efence_checkgetrange)); + gst_pad_set_getrange_function (filter->srcpad, + GST_DEBUG_FUNCPTR (gst_efence_getrange)); + gst_pad_set_activatepull_function (filter->srcpad, + GST_DEBUG_FUNCPTR (gst_efence_activate_src_pull)); + + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + + filter->fence_top = TRUE; +} + +/* chain function + * this function does the actual processing + */ + +static GstFlowReturn +gst_efence_chain (GstPad * pad, GstBuffer * buffer) +{ + GstEFence *efence; + GstBuffer *copy; + + efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); + g_return_val_if_fail (GST_IS_EFENCE (efence), GST_FLOW_ERROR); + + if (GST_IS_FENCED_BUFFER (buffer)) { + GST_DEBUG_OBJECT (efence, "Passing on existing fenced buffer with caps %" + GST_PTR_FORMAT, GST_BUFFER_CAPS (buffer)); + return gst_pad_push (efence->srcpad, buffer); + } + + copy = (GstBuffer *) gst_fenced_buffer_copy (buffer); + + GST_DEBUG_OBJECT (efence, "Pushing newly fenced buffer with caps %" + GST_PTR_FORMAT ", data=%p, size=%u", GST_BUFFER_CAPS (copy), + GST_BUFFER_DATA (copy), GST_BUFFER_SIZE (copy)); + + gst_buffer_unref (buffer); + + return gst_pad_push (efence->srcpad, copy); +} + +static GstFlowReturn +gst_efence_getrange (GstPad * pad, guint64 offset, + guint length, GstBuffer ** buffer) +{ + GstEFence *efence; + GstFlowReturn ret; + GstBuffer *ownbuf; + GstPad *peer; + + efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); + + peer = gst_pad_get_peer (efence->sinkpad); + if (!peer) + return GST_FLOW_NOT_LINKED; + + if ((ret = gst_pad_get_range (peer, offset, length, buffer)) != GST_FLOW_OK) + goto beach; + + ownbuf = (GstBuffer *) gst_fenced_buffer_copy (*buffer); + gst_buffer_unref ((GstBuffer *) * buffer); + *buffer = ownbuf; + +beach: + gst_object_unref (peer); + return ret; +} + +static gboolean +gst_efence_checkgetrange (GstPad * pad) +{ + GstEFence *efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); + + return gst_pad_check_pull_range (efence->sinkpad); +} + +static gboolean +gst_efence_activate_src_pull (GstPad * pad, gboolean active) +{ + GstEFence *efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); + + return gst_pad_activate_pull (efence->sinkpad, active); +} + +static GstFlowReturn +gst_efence_buffer_alloc (GstPad * pad, guint64 offset, + guint size, GstCaps * caps, GstBuffer ** buf) +{ + GstBuffer *buffer; + GstEFence *efence; + + g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR); + + efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); + + buffer = (GstBuffer *) gst_mini_object_new (GST_TYPE_FENCED_BUFFER); + + GST_BUFFER_DATA (buffer) = gst_fenced_buffer_alloc (buffer, size, + efence->fence_top); + GST_BUFFER_SIZE (buffer) = size; + GST_BUFFER_OFFSET (buffer) = offset; + + if (caps) + gst_buffer_set_caps (buffer, caps); + + *buf = buffer; + + GST_DEBUG_OBJECT (efence, "Allocated buffer of size %u, caps: %" + GST_PTR_FORMAT, GST_BUFFER_SIZE (buffer), GST_BUFFER_CAPS (buffer)); + + return GST_FLOW_OK; +} + +static void +gst_efence_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstEFence *filter; + + g_return_if_fail (GST_IS_EFENCE (object)); + filter = GST_EFENCE (object); + + switch (prop_id) { + case ARG_FENCE_TOP: + filter->fence_top = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_efence_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstEFence *filter; + + g_return_if_fail (GST_IS_EFENCE (object)); + filter = GST_EFENCE (object); + + switch (prop_id) { + case ARG_FENCE_TOP: + g_value_set_boolean (value, filter->fence_top); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* entry point to initialize the plug-in + * initialize the plug-in itself + * register the element factories and pad templates + * register the features + */ +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "efence", GST_RANK_NONE, GST_TYPE_EFENCE)) + return FALSE; + + GST_DEBUG_CATEGORY_INIT (gst_efence_debug, "efence", 0, + "Debug output from the efence element"); + + /* plugin initialisation succeeded */ + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "efence", + "This element converts a stream of normal GStreamer buffers into a " + "stream of buffers that are allocated in such a way that out-of-bounds " + "access to data in the buffer is more likely to cause segmentation " + "faults. This allocation method is very similar to the debugging tool " + "\"Electric Fence\".", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); + + +static GstBufferClass *fenced_buffer_parent_class = NULL; + +static void +gst_fenced_buffer_finalize (GstFencedBuffer * buffer) +{ + GstFencedBuffer *fenced_buffer; + + GST_DEBUG ("free buffer=%p", buffer); + + fenced_buffer = GST_FENCED_BUFFER (buffer); + + /* free our data */ + if (GST_BUFFER_DATA (buffer)) { + GST_DEBUG ("free region %p %d", fenced_buffer->region, + fenced_buffer->length); + munmap (fenced_buffer->region, fenced_buffer->length); + } + + GST_MINI_OBJECT_CLASS (fenced_buffer_parent_class)->finalize (GST_MINI_OBJECT + (buffer)); +} + +static GstFencedBuffer * +gst_fenced_buffer_copy (const GstBuffer * buffer) +{ + GstBuffer *copy; + void *ptr; + guint mask; + + g_return_val_if_fail (buffer != NULL, NULL); + + /* create a fresh new buffer */ + copy = (GstBuffer *) gst_mini_object_new (GST_TYPE_FENCED_BUFFER); + + /* we simply copy everything from our parent */ + ptr = gst_fenced_buffer_alloc (GST_BUFFER (copy), + GST_BUFFER_SIZE (buffer), TRUE); + memcpy (ptr, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + + /* copy relevant flags */ + mask = GST_BUFFER_FLAG_PREROLL | GST_BUFFER_FLAG_IN_CAPS | + GST_BUFFER_FLAG_DELTA_UNIT; + GST_MINI_OBJECT (copy)->flags |= GST_MINI_OBJECT (buffer)->flags & mask; + + GST_BUFFER_DATA (copy) = ptr; + GST_BUFFER_SIZE (copy) = GST_BUFFER_SIZE (buffer); + GST_BUFFER_TIMESTAMP (copy) = GST_BUFFER_TIMESTAMP (buffer); + GST_BUFFER_DURATION (copy) = GST_BUFFER_DURATION (buffer); + GST_BUFFER_OFFSET (copy) = GST_BUFFER_OFFSET (buffer); + GST_BUFFER_OFFSET_END (copy) = GST_BUFFER_OFFSET_END (buffer); + + if (GST_BUFFER_CAPS (buffer)) + GST_BUFFER_CAPS (copy) = gst_caps_ref (GST_BUFFER_CAPS (buffer)); + else + GST_BUFFER_CAPS (copy) = NULL; + + GST_DEBUG ("Copied buffer %p with ts %" GST_TIME_FORMAT + ", caps: %" GST_PTR_FORMAT, buffer, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (copy)), GST_BUFFER_CAPS (copy)); + + return GST_FENCED_BUFFER (copy); +} + +void * +gst_fenced_buffer_alloc (GstBuffer * buffer, unsigned int length, + gboolean fence_top) +{ + int alloc_size; + void *region; + GstFencedBuffer *fenced_buffer = (GstFencedBuffer *) buffer; + int page_size; + + GST_DEBUG ("buffer=%p length=%d fence_top=%d", buffer, length, fence_top); + + if (length == 0) + return NULL; + +#ifdef _SC_PAGESIZE + page_size = sysconf (_SC_PAGESIZE); +#else + page_size = getpagesize (); +#endif + + /* Allocate a complete page, and one on either side */ + alloc_size = ((length - 1) & ~(page_size - 1)) + page_size; + alloc_size += 2 * page_size; + + region = mmap (NULL, alloc_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (region == MAP_FAILED) { + g_warning ("mmap failed"); + return NULL; + } +#if 0 + munmap (region, page_size); + munmap (region + alloc_size - page_size, page_size); + + fenced_buffer->region = region + page_size; + fenced_buffer->length = alloc_size - page_size; +#else + mprotect (region, page_size, PROT_NONE); + mprotect ((char *) region + alloc_size - page_size, page_size, PROT_NONE); + + fenced_buffer->region = region; + fenced_buffer->length = alloc_size; +#endif + + GST_DEBUG ("new region %p %d", fenced_buffer->region, fenced_buffer->length); + + if (fence_top) { + int offset; + + /* Align to top of region, but force alignment to 4 bytes */ + offset = alloc_size - page_size - length; + offset &= ~0x3; + return (void *) ((char *) region + offset); + } else { + return (void *) ((char *) region + page_size); + } +} + +static void +gst_fenced_buffer_class_init (gpointer g_class, gpointer class_data) +{ + GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); + + fenced_buffer_parent_class = g_type_class_peek_parent (g_class); + + mini_object_class->finalize = + (GstMiniObjectFinalizeFunction) gst_fenced_buffer_finalize; + mini_object_class->copy = (GstMiniObjectCopyFunction) gst_fenced_buffer_copy; +} + +GType +gst_fenced_buffer_get_type (void) +{ + static GType fenced_buf_type = 0; + + if (G_UNLIKELY (!fenced_buf_type)) { + static const GTypeInfo fenced_buf_info = { + sizeof (GstBufferClass), + NULL, + NULL, + (GClassInitFunc) gst_fenced_buffer_class_init, + NULL, + NULL, + sizeof (GstFencedBuffer), + 0, + NULL, + }; + + fenced_buf_type = g_type_register_static (GST_TYPE_BUFFER, + "GstFencedBuffer", &fenced_buf_info, 0); + } + return fenced_buf_type; +} diff --git a/gst/debugutils/efence.h b/gst/debugutils/efence.h new file mode 100644 index 0000000..c2c95a4 --- /dev/null +++ b/gst/debugutils/efence.h @@ -0,0 +1,42 @@ +/* + * efence.h + */ + +#ifndef __GST_EFENCE_H__ +#define __GST_EFENCE_H__ + +#include + +G_BEGIN_DECLS +/* #define's don't like whitespacey bits */ +#define GST_TYPE_EFENCE \ + (gst_gst_efence_get_type()) +#define GST_EFENCE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_EFENCE,GstEFence)) +#define GST_EFENCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_EFENCE,GstEFenceClass)) +#define GST_IS_EFENCE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EFENCE)) +#define GST_IS_EFENCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EFENCE)) +typedef struct _GstEFence GstEFence; +typedef struct _GstEFenceClass GstEFenceClass; + +struct _GstEFence +{ + GstElement element; + + GstPad *sinkpad, *srcpad; + + gboolean fence_top; +}; + +struct _GstEFenceClass +{ + GstElementClass parent_class; +}; + +GType gst_gst_efence_get_type (void); + +G_END_DECLS +#endif /* __GST_EFENCE_H__ */ diff --git a/gst/debugutils/gstcapsdebug.c b/gst/debugutils/gstcapsdebug.c new file mode 100644 index 0000000..6bdc109 --- /dev/null +++ b/gst/debugutils/gstcapsdebug.c @@ -0,0 +1,267 @@ +/* GStreamer + * Copyright (C) 2010 David Schleef + * + * 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 +#include +#include "gstcapsdebug.h" + +GST_DEBUG_CATEGORY_STATIC (gst_caps_debug_debug); +#define GST_CAT_DEFAULT gst_caps_debug_debug + +/* prototypes */ + + +static void gst_caps_debug_dispose (GObject * object); +static void gst_caps_debug_finalize (GObject * object); + +static GstFlowReturn gst_caps_debug_sink_chain (GstPad * pad, + GstBuffer * buffer); +static GstCaps *gst_caps_debug_getcaps (GstPad * pad); +static gboolean gst_caps_debug_acceptcaps (GstPad * pad, GstCaps * caps); +static GstFlowReturn gst_caps_debug_bufferalloc (GstPad * pad, + guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); + +static GstStateChangeReturn +gst_caps_debug_change_state (GstElement * element, GstStateChange transition); + +/* pad templates */ + +static GstStaticPadTemplate gst_caps_debug_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_caps_debug_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +/* class initialization */ + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_caps_debug_debug, "capsdebug", 0, \ + "debug category for capsdebug element"); + +GST_BOILERPLATE_FULL (GstCapsDebug, gst_caps_debug, GstElement, + GST_TYPE_ELEMENT, DEBUG_INIT); + +static void +gst_caps_debug_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_caps_debug_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_caps_debug_sink_template); + + gst_element_class_set_details_simple (element_class, "Caps debug", + "Generic", "Debug caps negotiation", "David Schleef "); +} + +static void +gst_caps_debug_class_init (GstCapsDebugClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gobject_class->dispose = gst_caps_debug_dispose; + gobject_class->finalize = gst_caps_debug_finalize; + element_class->change_state = GST_DEBUG_FUNCPTR (gst_caps_debug_change_state); + +} + +static void +gst_caps_debug_init (GstCapsDebug * capsdebug, + GstCapsDebugClass * capsdebug_class) +{ + + capsdebug->srcpad = + gst_pad_new_from_static_template (&gst_caps_debug_src_template, "src"); + gst_pad_set_getcaps_function (capsdebug->srcpad, + GST_DEBUG_FUNCPTR (gst_caps_debug_getcaps)); + gst_pad_set_acceptcaps_function (capsdebug->srcpad, + GST_DEBUG_FUNCPTR (gst_caps_debug_acceptcaps)); + gst_element_add_pad (GST_ELEMENT (capsdebug), capsdebug->srcpad); + + capsdebug->sinkpad = + gst_pad_new_from_static_template (&gst_caps_debug_sink_template, "sink"); + gst_pad_set_chain_function (capsdebug->sinkpad, + GST_DEBUG_FUNCPTR (gst_caps_debug_sink_chain)); + gst_pad_set_bufferalloc_function (capsdebug->sinkpad, + GST_DEBUG_FUNCPTR (gst_caps_debug_bufferalloc)); + gst_pad_set_getcaps_function (capsdebug->sinkpad, + GST_DEBUG_FUNCPTR (gst_caps_debug_getcaps)); + gst_pad_set_acceptcaps_function (capsdebug->sinkpad, + GST_DEBUG_FUNCPTR (gst_caps_debug_acceptcaps)); + gst_element_add_pad (GST_ELEMENT (capsdebug), capsdebug->sinkpad); + +} + +void +gst_caps_debug_dispose (GObject * object) +{ + /* clean up as possible. may be called multiple times */ + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +void +gst_caps_debug_finalize (GObject * object) +{ + /* clean up object here */ + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + + +static GstStateChangeReturn +gst_caps_debug_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + return ret; +} + + +static GstFlowReturn +gst_caps_debug_sink_chain (GstPad * pad, GstBuffer * buffer) +{ + GstFlowReturn ret; + GstCapsDebug *capsdebug; + + capsdebug = GST_CAPS_DEBUG (gst_pad_get_parent (pad)); + + ret = gst_pad_push (capsdebug->srcpad, buffer); + + gst_object_unref (capsdebug); + + return ret; +} + +#define THISPAD ((pad == capsdebug->srcpad) ? "downstream" : "upstream") +#define OTHERPAD ((pad == capsdebug->srcpad) ? "upstream" : "downstream") + +static GstCaps * +gst_caps_debug_getcaps (GstPad * pad) +{ + GstCaps *caps; + GstCapsDebug *capsdebug; + gchar *s; + GstPad *otherpad; + + capsdebug = GST_CAPS_DEBUG (gst_pad_get_parent (pad)); + otherpad = + (pad == capsdebug->srcpad) ? capsdebug->sinkpad : capsdebug->srcpad; + + GST_INFO ("%s called getcaps", THISPAD); + + caps = gst_pad_peer_get_caps (otherpad); + + s = gst_caps_to_string (caps); + GST_INFO ("%s returned %s", OTHERPAD, s); + g_free (s); + + if (caps == NULL) + caps = gst_caps_new_any (); + + gst_object_unref (capsdebug); + + return caps; +} + + +static gboolean +gst_caps_debug_acceptcaps (GstPad * pad, GstCaps * caps) +{ + GstCapsDebug *capsdebug; + gchar *s; + gboolean ret; + GstPad *otherpad; + + capsdebug = GST_CAPS_DEBUG (gst_pad_get_parent (pad)); + otherpad = + (pad == capsdebug->srcpad) ? capsdebug->sinkpad : capsdebug->srcpad; + + s = gst_caps_to_string (caps); + GST_INFO ("%s called acceptcaps with %s", THISPAD, s); + g_free (s); + + ret = gst_pad_peer_accept_caps (otherpad, caps); + + GST_INFO ("%s returned %s", OTHERPAD, ret ? "TRUE" : "FALSE"); + + gst_object_unref (capsdebug); + + return ret; +} + +static GstFlowReturn +gst_caps_debug_bufferalloc (GstPad * pad, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf) +{ + GstCapsDebug *capsdebug; + gchar *s; + gchar *t; + GstFlowReturn ret; + GstPad *otherpad; + gboolean newcaps; + + capsdebug = GST_CAPS_DEBUG (gst_pad_get_parent (pad)); + otherpad = + (pad == capsdebug->srcpad) ? capsdebug->sinkpad : capsdebug->srcpad; + + newcaps = (caps != GST_PAD_CAPS (pad)); + + if (newcaps) { + s = gst_caps_to_string (caps); + GST_INFO ("%s called bufferalloc with new caps, offset=%" G_GUINT64_FORMAT + " size=%d caps=%s", THISPAD, offset, size, s); + g_free (s); + } + + ret = gst_pad_alloc_buffer_and_set_caps (otherpad, offset, size, caps, buf); + + if (newcaps) { + GST_INFO ("%s returned %s", OTHERPAD, gst_flow_get_name (ret)); + } + if (caps != GST_BUFFER_CAPS (*buf)) { + s = gst_caps_to_string (caps); + t = gst_caps_to_string (GST_BUFFER_CAPS (*buf)); + GST_INFO + ("%s returned from bufferalloc with different caps, requested=%s returned=%s", + OTHERPAD, s, t); + g_free (s); + g_free (t); + } + + gst_object_unref (capsdebug); + + return ret; +} diff --git a/gst/debugutils/gstcapsdebug.h b/gst/debugutils/gstcapsdebug.h new file mode 100644 index 0000000..1f3c070 --- /dev/null +++ b/gst/debugutils/gstcapsdebug.h @@ -0,0 +1,55 @@ +/* GStreamer + * Copyright (C) 2010 FIXME + * + * 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_CAPS_DEBUG_H_ +#define _GST_CAPS_DEBUG_H_ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_CAPS_DEBUG (gst_caps_debug_get_type()) +#define GST_CAPS_DEBUG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAPS_DEBUG,GstCapsDebug)) +#define GST_CAPS_DEBUG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAPS_DEBUG,GstCapsDebugClass)) +#define GST_IS_CAPS_DEBUG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAPS_DEBUG)) +#define GST_IS_CAPS_DEBUG_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAPS_DEBUG)) + +typedef struct _GstCapsDebug GstCapsDebug; +typedef struct _GstCapsDebugClass GstCapsDebugClass; + +struct _GstCapsDebug +{ + GstElement base_capsdebug; + + GstPad *srcpad; + GstPad *sinkpad; + +}; + +struct _GstCapsDebugClass +{ + GstElementClass base_capsdebug_class; +}; + +GType gst_caps_debug_get_type (void); + +G_END_DECLS + +#endif diff --git a/gst/debugutils/gstcapssetter.c b/gst/debugutils/gstcapssetter.c new file mode 100644 index 0000000..061da47 --- /dev/null +++ b/gst/debugutils/gstcapssetter.c @@ -0,0 +1,337 @@ +/* GStreamer Element + * Copyright (C) 2006-2009 Mark Nauwelaerts + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1307, USA. + */ + +/** + * SECTION:element-capssetter + * + * + * + * Sets or merges caps on a stream's buffers. + * That is, a buffer's caps are updated using (fields of) + * caps. Note that this may + * contain multiple structures (though not likely recommended), but each + * of these must be fixed (or will otherwise be rejected). + * + * + * If join + * is TRUE, then the incoming caps' mime-type is compared to the mime-type(s) + * of provided caps and only matching structure(s) are considered for updating. + * + * + * If replace + * is TRUE, then any caps update is preceded by clearing existing fields, + * making provided fields (as a whole) replace incoming ones. + * Otherwise, no clearing is performed, in which case provided fields are + * added/merged onto incoming caps + * + * + * Although this element might mainly serve as debug helper, + * it can also practically be used to correct a faulty pixel-aspect-ratio, + * or to modify a yuv fourcc value to effectively swap chroma components or such + * alike. + * + * + * + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcapssetter.h" + +#include + + +GST_DEBUG_CATEGORY_STATIC (caps_setter_debug); +#define GST_CAT_DEFAULT caps_setter_debug + + +/* signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_CAPS, + PROP_JOIN, + PROP_REPLACE + /* FILL ME */ +}; + +#define DEFAULT_JOIN TRUE +#define DEFAULT_REPLACE FALSE + +static GstStaticPadTemplate gst_caps_setter_src_template = +GST_STATIC_PAD_TEMPLATE (GST_BASE_TRANSFORM_SRC_NAME, + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_caps_setter_sink_template = +GST_STATIC_PAD_TEMPLATE (GST_BASE_TRANSFORM_SINK_NAME, + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + +static gboolean gst_caps_setter_transform_size (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, guint size, + GstCaps * othercaps, guint * othersize); +static GstCaps *gst_caps_setter_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps); +static GstFlowReturn gst_caps_setter_transform_ip (GstBaseTransform * btrans, + GstBuffer * in); + +static void gst_caps_setter_finalize (GObject * object); + +static void gst_caps_setter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_caps_setter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +GST_BOILERPLATE (GstCapsSetter, gst_caps_setter, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void +gst_caps_setter_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "CapsSetter", + "Generic", + "Set/merge caps on stream", + "Mark Nauwelaerts "); + + gst_element_class_add_static_pad_template (element_class, + &gst_caps_setter_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_caps_setter_src_template); +} + +static void +gst_caps_setter_class_init (GstCapsSetterClass * g_class) +{ + GObjectClass *gobject_class = (GObjectClass *) g_class; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) g_class; + + GST_DEBUG_CATEGORY_INIT (caps_setter_debug, "capssetter", 0, "capssetter"); + + gobject_class->set_property = gst_caps_setter_set_property; + gobject_class->get_property = gst_caps_setter_get_property; + + gobject_class->finalize = gst_caps_setter_finalize; + + g_object_class_install_property (gobject_class, PROP_CAPS, + g_param_spec_boxed ("caps", "Merge caps", + "Merge these caps (thereby overwriting) in the stream", + GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_JOIN, + g_param_spec_boolean ("join", "Join", + "Match incoming caps' mime-type to mime-type of provided caps", + DEFAULT_JOIN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_REPLACE, + g_param_spec_boolean ("replace", "Replace", + "Drop fields of incoming caps", DEFAULT_REPLACE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->transform_size = + GST_DEBUG_FUNCPTR (gst_caps_setter_transform_size); + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_caps_setter_transform_caps); + /* dummy seems needed */ + trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_caps_setter_transform_ip); +} + +static void +gst_caps_setter_init (GstCapsSetter * filter, GstCapsSetterClass * g_class) +{ + filter->caps = gst_caps_new_any (); + filter->join = DEFAULT_JOIN; + filter->replace = DEFAULT_REPLACE; +} + +static void +gst_caps_setter_finalize (GObject * object) +{ + GstCapsSetter *filter = GST_CAPS_SETTER (object); + + gst_caps_replace (&filter->caps, NULL); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_caps_setter_transform_size (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, guint size, + GstCaps * othercaps, guint * othersize) +{ + *othersize = size; + + return TRUE; +} + +static GstCaps * +gst_caps_setter_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps) +{ + GstCapsSetter *filter = GST_CAPS_SETTER (trans); + GstCaps *ret, *filter_caps; + GstStructure *structure, *merge; + const gchar *name; + gint i, j; + + GST_DEBUG_OBJECT (trans, "receiving caps: %" GST_PTR_FORMAT, caps); + + ret = gst_caps_copy (caps); + + /* this function is always called with a simple caps */ + if (!GST_CAPS_IS_SIMPLE (ret) || direction != GST_PAD_SINK) + return ret; + + structure = gst_caps_get_structure (ret, 0); + name = gst_structure_get_name (structure); + + GST_OBJECT_LOCK (filter); + filter_caps = gst_caps_ref (filter->caps); + GST_OBJECT_UNLOCK (filter); + + for (i = 0; i < gst_caps_get_size (filter_caps); ++i) { + merge = gst_caps_get_structure (filter_caps, i); + if (gst_structure_has_name (merge, name) || !filter->join) { + + if (!filter->join) + gst_structure_set_name (structure, gst_structure_get_name (merge)); + + if (filter->replace) + gst_structure_remove_all_fields (structure); + + for (j = 0; j < gst_structure_n_fields (merge); ++j) { + const gchar *fname; + + fname = gst_structure_nth_field_name (merge, j); + gst_structure_set_value (structure, fname, + gst_structure_get_value (merge, fname)); + } + } + } + + GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, ret); + + gst_caps_unref (filter_caps); + + return ret; +} + +static GstFlowReturn +gst_caps_setter_transform_ip (GstBaseTransform * btrans, GstBuffer * in) +{ + return GST_FLOW_OK; +} + +static gboolean +gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value, + gpointer unused) +{ + return gst_value_is_fixed (value); +} + +static void +gst_caps_setter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstCapsSetter *filter = GST_CAPS_SETTER (object); + + switch (prop_id) { + case PROP_CAPS:{ + GstCaps *new_caps; + const GstCaps *new_caps_val = gst_value_get_caps (value); + gint i; + + if (new_caps_val == NULL) { + new_caps = gst_caps_new_any (); + } else { + new_caps = gst_caps_copy (new_caps_val); + } + + for (i = 0; new_caps && (i < gst_caps_get_size (new_caps)); ++i) { + GstStructure *s; + + s = gst_caps_get_structure (new_caps, i); + if (!gst_structure_foreach (s, gst_caps_is_fixed_foreach, NULL)) { + GST_ERROR_OBJECT (filter, "rejected unfixed caps: %" GST_PTR_FORMAT, + new_caps); + gst_caps_unref (new_caps); + new_caps = NULL; + break; + } + } + + if (new_caps) { + GST_OBJECT_LOCK (filter); + gst_caps_replace (&filter->caps, new_caps); + /* drop extra ref */ + gst_caps_unref (new_caps); + GST_OBJECT_UNLOCK (filter); + + GST_DEBUG_OBJECT (filter, "set new caps %" GST_PTR_FORMAT, new_caps); + } + + /* try to activate these new caps next time around */ + gst_base_transform_reconfigure (GST_BASE_TRANSFORM (filter)); + break; + } + case PROP_JOIN: + filter->join = g_value_get_boolean (value); + break; + case PROP_REPLACE: + filter->replace = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_caps_setter_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstCapsSetter *filter = GST_CAPS_SETTER (object); + + switch (prop_id) { + case PROP_CAPS: + gst_value_set_caps (value, filter->caps); + break; + case PROP_JOIN: + g_value_set_boolean (value, filter->join); + break; + case PROP_REPLACE: + g_value_set_boolean (value, filter->replace); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/debugutils/gstcapssetter.h b/gst/debugutils/gstcapssetter.h new file mode 100644 index 0000000..246bf19 --- /dev/null +++ b/gst/debugutils/gstcapssetter.h @@ -0,0 +1,63 @@ +/* GStreamer Element + * Copyright (C) 2006-2009 Mark Nauwelaerts + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1307, USA. + */ + + +#ifndef __GST_CAPS_SETTER_H__ +#define __GST_CAPS_SETTER_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_CAPS_SETTER \ + (gst_caps_setter_get_type()) +#define GST_CAPS_SETTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAPS_SETTER,GstCapsSetter)) +#define GST_CAPS_SETTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAPS_SETTER,GstCapsSetterClass)) +#define GST_IS_CAPS_SETTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAPS_SETTER)) +#define GST_IS_CAPS_SETTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAPS_SETTER)) + +GType gst_caps_setter_get_type (void); + +typedef struct _GstCapsSetter GstCapsSetter; +typedef struct _GstCapsSetterClass GstCapsSetterClass; + +struct _GstCapsSetter +{ + GstBaseTransform parent; + + /* < private > */ + /* properties */ + GstCaps *caps; + gboolean join; + gboolean replace; +}; + + +struct _GstCapsSetterClass +{ + GstBaseTransformClass parent_class; +}; + +G_END_DECLS + +#endif /* __GST_CAPS_SETTER_H__ */ diff --git a/gst/debugutils/gstdebug.c b/gst/debugutils/gstdebug.c new file mode 100644 index 0000000..de57285 --- /dev/null +++ b/gst/debugutils/gstdebug.c @@ -0,0 +1,74 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * 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 + +GType gst_break_my_data_get_type (void); +GType gst_caps_debug_get_type (void); +GType gst_caps_setter_get_type (void); +GType gst_rnd_buffer_size_get_type (void); +GType gst_navseek_get_type (void); +GType gst_progress_report_get_type (void); +GType gst_tag_inject_get_type (void); +GType gst_test_get_type (void); +GType gst_push_file_src_get_type (void); +/* +GType gst_gst_negotiation_get_type (void); +*/ +GType gst_cpu_report_get_type (void); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "breakmydata", GST_RANK_NONE, + gst_break_my_data_get_type ()) + || !gst_element_register (plugin, "capssetter", GST_RANK_NONE, + gst_caps_setter_get_type ()) + || !gst_element_register (plugin, "rndbuffersize", GST_RANK_NONE, + gst_rnd_buffer_size_get_type ()) + || !gst_element_register (plugin, "navseek", GST_RANK_NONE, + gst_navseek_get_type ()) + || !gst_element_register (plugin, "pushfilesrc", GST_RANK_NONE, + gst_push_file_src_get_type ()) || +/* !gst_element_register (plugin, "negotiation", GST_RANK_NONE, gst_gst_negotiation_get_type ()) || */ + !gst_element_register (plugin, "progressreport", GST_RANK_NONE, + gst_progress_report_get_type ()) + || !gst_element_register (plugin, "taginject", GST_RANK_NONE, + gst_tag_inject_get_type ()) + || !gst_element_register (plugin, "testsink", GST_RANK_NONE, + gst_test_get_type ()) + || !gst_element_register (plugin, "capsdebug", GST_RANK_NONE, + gst_caps_debug_get_type ()) + || !gst_element_register (plugin, "cpureport", GST_RANK_NONE, + gst_cpu_report_get_type ())) + + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "debug", + "elements for testing and debugging", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/debugutils/gstnavigationtest.c b/gst/debugutils/gstnavigationtest.c new file mode 100644 index 0000000..6f6daea --- /dev/null +++ b/gst/debugutils/gstnavigationtest.c @@ -0,0 +1,352 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * + * 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 "gstnavigationtest.h" +#include +#include + +#include + +#ifdef _MSC_VER +#define rint(x) (floor((x)+0.5)) +#endif + +GST_DEBUG_CATEGORY_STATIC (navigationtest_debug); +#define GST_CAT_DEFAULT navigationtest_debug + +static GstStaticPadTemplate gst_navigationtest_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static GstStaticPadTemplate gst_navigationtest_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static GstVideoFilterClass *parent_class = NULL; + +static gboolean +gst_navigationtest_handle_src_event (GstPad * pad, GstEvent * event) +{ + GstNavigationtest *navtest; + const gchar *type; + + navtest = GST_NAVIGATIONTEST (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NAVIGATION: + { + const GstStructure *s = gst_event_get_structure (event); + gint fps_n, fps_d; + + fps_n = gst_value_get_fraction_numerator ((&navtest->framerate)); + fps_d = gst_value_get_fraction_denominator ((&navtest->framerate)); + + type = gst_structure_get_string (s, "event"); + if (g_str_equal (type, "mouse-move")) { + gst_structure_get_double (s, "pointer_x", &navtest->x); + gst_structure_get_double (s, "pointer_y", &navtest->y); + } else if (g_str_equal (type, "mouse-button-press")) { + ButtonClick *click = g_new (ButtonClick, 1); + + gst_structure_get_double (s, "pointer_x", &click->x); + gst_structure_get_double (s, "pointer_y", &click->y); + click->images_left = (fps_n + fps_d - 1) / fps_d; + /* green */ + click->cy = 150; + click->cu = 46; + click->cv = 21; + navtest->clicks = g_slist_prepend (navtest->clicks, click); + } else if (g_str_equal (type, "mouse-button-release")) { + ButtonClick *click = g_new (ButtonClick, 1); + + gst_structure_get_double (s, "pointer_x", &click->x); + gst_structure_get_double (s, "pointer_y", &click->y); + click->images_left = (fps_n + fps_d - 1) / fps_d; + /* red */ + click->cy = 76; + click->cu = 85; + click->cv = 255; + navtest->clicks = g_slist_prepend (navtest->clicks, click); + } + break; + } + default: + break; + } + return gst_pad_event_default (pad, event); +} + +/* Useful macros */ +#define GST_VIDEO_I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) +#define GST_VIDEO_I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) +#define GST_VIDEO_I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(GST_VIDEO_I420_Y_ROWSTRIDE(width)))/2) + +#define GST_VIDEO_I420_Y_OFFSET(w,h) (0) +#define GST_VIDEO_I420_U_OFFSET(w,h) (GST_VIDEO_I420_Y_OFFSET(w,h)+(GST_VIDEO_I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) +#define GST_VIDEO_I420_V_OFFSET(w,h) (GST_VIDEO_I420_U_OFFSET(w,h)+(GST_VIDEO_I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +#define GST_VIDEO_I420_SIZE(w,h) (GST_VIDEO_I420_V_OFFSET(w,h)+(GST_VIDEO_I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +static gboolean +gst_navigationtest_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, + guint * size) +{ + GstNavigationtest *navtest; + GstStructure *structure; + gboolean ret = FALSE; + gint width, height; + + navtest = GST_NAVIGATIONTEST (btrans); + + structure = gst_caps_get_structure (caps, 0); + + if (gst_structure_get_int (structure, "width", &width) && + gst_structure_get_int (structure, "height", &height)) { + *size = GST_VIDEO_I420_SIZE (width, height); + ret = TRUE; + GST_DEBUG_OBJECT (navtest, "our frame size is %d bytes (%dx%d)", *size, + width, height); + } + + return ret; +} + +static gboolean +gst_navigationtest_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstNavigationtest *navtest = GST_NAVIGATIONTEST (btrans); + gboolean ret = FALSE; + GstStructure *structure; + + structure = gst_caps_get_structure (incaps, 0); + + if (gst_structure_get_int (structure, "width", &navtest->width) && + gst_structure_get_int (structure, "height", &navtest->height)) { + const GValue *framerate; + + framerate = gst_structure_get_value (structure, "framerate"); + if (framerate && GST_VALUE_HOLDS_FRACTION (framerate)) { + g_value_copy (framerate, &navtest->framerate); + ret = TRUE; + } + } + + return ret; +} + +static void +draw_box_planar411 (guint8 * dest, int width, int height, int x, int y, + guint8 colory, guint8 coloru, guint8 colorv) +{ + int x1, x2, y1, y2; + guint8 *d = dest; + + if (x < 0 || y < 0 || x >= width || y >= height) + return; + + x1 = MAX (x - 5, 0); + x2 = MIN (x + 5, width); + y1 = MAX (y - 5, 0); + y2 = MIN (y + 5, height); + + for (y = y1; y < y2; y++) { + for (x = x1; x < x2; x++) { + ((guint8 *) d)[y * GST_VIDEO_I420_Y_ROWSTRIDE (width) + x] = colory; + } + } + + d = dest + GST_VIDEO_I420_U_OFFSET (width, height); + x1 /= 2; + x2 /= 2; + y1 /= 2; + y2 /= 2; + for (y = y1; y < y2; y++) { + for (x = x1; x < x2; x++) { + ((guint8 *) d)[y * GST_VIDEO_I420_U_ROWSTRIDE (width) + x] = coloru; + } + } + + d = dest + GST_VIDEO_I420_V_OFFSET (width, height); + for (y = y1; y < y2; y++) { + for (x = x1; x < x2; x++) { + ((guint8 *) d)[y * GST_VIDEO_I420_V_ROWSTRIDE (width) + x] = colorv; + } + } +} + +static GstFlowReturn +gst_navigationtest_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstNavigationtest *navtest = GST_NAVIGATIONTEST (trans); + GSList *walk; + GstFlowReturn ret = GST_FLOW_OK; + + /* do something interesting here. This simply copies the source + * to the destination. */ + gst_buffer_copy_metadata (out, in, GST_BUFFER_COPY_TIMESTAMPS); + + memcpy (GST_BUFFER_DATA (out), GST_BUFFER_DATA (in), + MIN (GST_BUFFER_SIZE (in), GST_BUFFER_SIZE (out))); + + walk = navtest->clicks; + while (walk) { + ButtonClick *click = walk->data; + + walk = g_slist_next (walk); + draw_box_planar411 (GST_BUFFER_DATA (out), navtest->width, navtest->height, + rint (click->x), rint (click->y), click->cy, click->cu, click->cv); + if (--click->images_left < 1) { + navtest->clicks = g_slist_remove (navtest->clicks, click); + g_free (click); + } + } + draw_box_planar411 (GST_BUFFER_DATA (out), navtest->width, navtest->height, + rint (navtest->x), rint (navtest->y), 0, 128, 128); + + return ret; +} + +static GstStateChangeReturn +gst_navigationtest_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstNavigationtest *navtest = GST_NAVIGATIONTEST (element); + + if (GST_ELEMENT_CLASS (parent_class)->change_state) + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + /* downwards state changes */ + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + { + g_slist_foreach (navtest->clicks, (GFunc) g_free, NULL); + g_slist_free (navtest->clicks); + navtest->clicks = NULL; + break; + } + default: + break; + } + + return ret; +} + +static void +gst_navigationtest_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Video navigation test", + "Filter/Effect/Video", + "Handle navigation events showing a black square following mouse pointer", + "David Schleef "); + + gst_element_class_add_static_pad_template (element_class, + &gst_navigationtest_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_navigationtest_src_template); +} + +static void +gst_navigationtest_class_init (gpointer klass, gpointer class_data) +{ + GstElementClass *element_class; + GstBaseTransformClass *trans_class; + + element_class = (GstElementClass *) klass; + trans_class = (GstBaseTransformClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + element_class->change_state = + GST_DEBUG_FUNCPTR (gst_navigationtest_change_state); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_navigationtest_set_caps); + trans_class->get_unit_size = + GST_DEBUG_FUNCPTR (gst_navigationtest_get_unit_size); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_navigationtest_transform); +} + +static void +gst_navigationtest_init (GTypeInstance * instance, gpointer g_class) +{ + GstNavigationtest *navtest = GST_NAVIGATIONTEST (instance); + GstBaseTransform *btrans = GST_BASE_TRANSFORM (instance); + + gst_pad_set_event_function (btrans->srcpad, + GST_DEBUG_FUNCPTR (gst_navigationtest_handle_src_event)); + + navtest->x = -1; + navtest->y = -1; + g_value_init (&navtest->framerate, GST_TYPE_FRACTION); +} + +GType +gst_navigationtest_get_type (void) +{ + static GType navigationtest_type = 0; + + if (!navigationtest_type) { + static const GTypeInfo navigationtest_info = { + sizeof (GstNavigationtestClass), + gst_navigationtest_base_init, + NULL, + gst_navigationtest_class_init, + NULL, + NULL, + sizeof (GstNavigationtest), + 0, + gst_navigationtest_init, + }; + + navigationtest_type = g_type_register_static (GST_TYPE_VIDEO_FILTER, + "GstNavigationtest", &navigationtest_info, 0); + } + return navigationtest_type; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (navigationtest_debug, "navigationtest", 0, + "navigationtest"); + + return gst_element_register (plugin, "navigationtest", GST_RANK_NONE, + GST_TYPE_NAVIGATIONTEST); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "navigationtest", + "Template for a video filter", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/debugutils/gstnavigationtest.h b/gst/debugutils/gstnavigationtest.h new file mode 100644 index 0000000..efdbb22 --- /dev/null +++ b/gst/debugutils/gstnavigationtest.h @@ -0,0 +1,68 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_NAVIGATIONTEST_H__ +#define __GST_NAVIGATIONTEST_H__ + +#include + +G_BEGIN_DECLS +#define GST_TYPE_NAVIGATIONTEST \ + (gst_navigationtest_get_type()) +#define GST_NAVIGATIONTEST(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NAVIGATIONTEST,GstNavigationtest)) +#define GST_NAVIGATIONTEST_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NAVIGATIONTEST,GstNavigationtestClass)) +#define GST_IS_NAVIGATIONTEST(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NAVIGATIONTEST)) +#define GST_IS_NAVIGATIONTEST_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NAVIGATIONTEST)) +typedef struct _GstNavigationtest GstNavigationtest; +typedef struct _GstNavigationtestClass GstNavigationtestClass; + +typedef struct +{ + gdouble x; + gdouble y; + gint images_left; + guint8 cy, cu, cv; +} ButtonClick; + +struct _GstNavigationtest +{ + GstVideoFilter videofilter; + + gint width, height; + + GValue framerate; + gdouble x, y; + + GSList *clicks; +}; + +struct _GstNavigationtestClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_navigationtest_get_type (void); + +G_END_DECLS +#endif /* __GST_NAVIGATIONTEST_H__ */ diff --git a/gst/debugutils/gstnavseek.c b/gst/debugutils/gstnavseek.c new file mode 100644 index 0000000..4ee9343 --- /dev/null +++ b/gst/debugutils/gstnavseek.c @@ -0,0 +1,399 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * + * 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 was (probably) generated from gstnavseek.c, + * gstnavseek.c,v 1.7 2003/11/08 02:48:59 dschleef Exp + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstnavseek.h" +#include +#include + +enum +{ + ARG_0, + ARG_SEEKOFFSET +}; + +GstStaticPadTemplate navseek_src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GstStaticPadTemplate navseek_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static gboolean gst_navseek_event (GstBaseTransform * trans, GstEvent * event); +static GstFlowReturn gst_navseek_transform_ip (GstBaseTransform * basetrans, + GstBuffer * buf); +static gboolean gst_navseek_handle_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_navseek_stop (GstBaseTransform * trans); +static gboolean gst_navseek_start (GstBaseTransform * trans); + +static void gst_navseek_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_navseek_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +GType gst_navseek_get_type (void); +GST_BOILERPLATE (GstNavSeek, gst_navseek, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void +gst_navseek_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &navseek_sink_template); + gst_element_class_add_static_pad_template (element_class, + &navseek_src_template); + + gst_element_class_set_details_simple (element_class, + "Seek based on left-right arrows", "Filter/Video", + "Seek based on navigation keys left-right", + "Jan Schmidt "); +} + +static void +gst_navseek_class_init (GstNavSeekClass * klass) +{ + GstBaseTransformClass *gstbasetrans_class; + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (klass); + + gobject_class->set_property = gst_navseek_set_property; + gobject_class->get_property = gst_navseek_get_property; + + g_object_class_install_property (gobject_class, + ARG_SEEKOFFSET, g_param_spec_double ("seek-offset", "Seek Offset", + "Time in seconds to seek by", 0.0, G_MAXDOUBLE, 5.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasetrans_class->event = GST_DEBUG_FUNCPTR (gst_navseek_event); + gstbasetrans_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_navseek_transform_ip); + gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_navseek_start); + gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_navseek_stop); +} + +static void +gst_navseek_init (GstNavSeek * navseek, GstNavSeekClass * g_class) +{ + gst_pad_set_event_function (GST_BASE_TRANSFORM (navseek)->srcpad, + GST_DEBUG_FUNCPTR (gst_navseek_handle_src_event)); + + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (navseek), TRUE); + + navseek->seek_offset = 5.0; + navseek->loop = FALSE; + navseek->grab_seg_start = FALSE; + navseek->grab_seg_end = FALSE; + navseek->segment_start = GST_CLOCK_TIME_NONE; + navseek->segment_end = GST_CLOCK_TIME_NONE; +} + +static void +gst_navseek_seek (GstNavSeek * navseek, gint64 offset) +{ + GstFormat peer_format = GST_FORMAT_TIME; + gboolean ret; + GstPad *peer_pad; + gint64 peer_value; + + /* Query for the current time then attempt to set to time + offset */ + peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); + ret = gst_pad_query_position (peer_pad, &peer_format, &peer_value); + + if (ret && peer_format == GST_FORMAT_TIME) { + GstEvent *event; + + peer_value += offset; + if (peer_value < 0) + peer_value = 0; + + event = gst_event_new_seek (1.0, GST_FORMAT_TIME, + GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH, + GST_SEEK_TYPE_SET, peer_value, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); + + gst_pad_send_event (peer_pad, event); + } + + gst_object_unref (peer_pad); +} + +static void +gst_navseek_change_playback_rate (GstNavSeek * navseek, gdouble rate) +{ + GstFormat peer_format = GST_FORMAT_TIME; + gboolean ret; + GstPad *peer_pad; + gint64 current_position; + + peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); + ret = gst_pad_query_position (peer_pad, &peer_format, ¤t_position); + + if (ret && peer_format == GST_FORMAT_TIME) { + GstEvent *event; + gint64 start; + gint64 stop; + + if (rate > 0.0) { + start = current_position; + stop = -1; + } else { + /* negative rate: we play from stop to start */ + start = 0; + stop = current_position; + } + + event = gst_event_new_seek (rate, GST_FORMAT_TIME, + GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SKIP, + GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop); + + gst_pad_send_event (peer_pad, event); + } +} + +static void +gst_navseek_segseek (GstNavSeek * navseek) +{ + GstEvent *event; + GstPad *peer_pad; + + if ((navseek->segment_start == GST_CLOCK_TIME_NONE) || + (navseek->segment_end == GST_CLOCK_TIME_NONE) || + (!GST_PAD_IS_LINKED (GST_BASE_TRANSFORM (navseek)->sinkpad))) { + return; + } + + if (navseek->loop) { + event = + gst_event_new_seek (1.0, GST_FORMAT_TIME, + GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_SEGMENT, + GST_SEEK_TYPE_SET, navseek->segment_start, GST_SEEK_TYPE_SET, + navseek->segment_end); + } else { + event = + gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_ACCURATE, + GST_SEEK_TYPE_SET, navseek->segment_start, GST_SEEK_TYPE_SET, + navseek->segment_end); + } + + peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); + gst_pad_send_event (peer_pad, event); + gst_object_unref (peer_pad); +} + +static void +gst_navseek_toggle_play_pause (GstNavSeek * navseek) +{ + GstStateChangeReturn sret; + GstState current, pending, state; + + sret = gst_element_get_state (GST_ELEMENT (navseek), ¤t, &pending, 0); + if (sret == GST_STATE_CHANGE_FAILURE) + return; + + state = (pending != GST_STATE_VOID_PENDING) ? pending : current; + + gst_element_post_message (GST_ELEMENT (navseek), + gst_message_new_request_state (GST_OBJECT (navseek), + (state == GST_STATE_PLAYING) ? GST_STATE_PAUSED : GST_STATE_PLAYING)); +} + +static gboolean +gst_navseek_handle_src_event (GstPad * pad, GstEvent * event) +{ + GstNavSeek *navseek; + gboolean ret = TRUE; + + navseek = GST_NAVSEEK (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NAVIGATION: + /* Check for a keyup and convert left/right to a seek event */ + { + const GstStructure *structure; + const gchar *event_type; + + structure = gst_event_get_structure (event); + g_return_val_if_fail (structure != NULL, FALSE); + + event_type = gst_structure_get_string (structure, "event"); + g_return_val_if_fail (event_type != NULL, FALSE); + + if (strcmp (event_type, "key-press") == 0) { + const gchar *key; + + key = gst_structure_get_string (structure, "key"); + g_return_val_if_fail (key != NULL, FALSE); + + if (strcmp (key, "Left") == 0) { + /* Seek backward by 5 secs */ + gst_navseek_seek (navseek, -1.0 * navseek->seek_offset * GST_SECOND); + } else if (strcmp (key, "Right") == 0) { + /* Seek forward */ + gst_navseek_seek (navseek, navseek->seek_offset * GST_SECOND); + } else if (strcmp (key, "s") == 0) { + /* Grab the next frame as the start frame of a segment */ + navseek->grab_seg_start = TRUE; + } else if (strcmp (key, "e") == 0) { + /* Grab the next frame as the end frame of a segment */ + navseek->grab_seg_end = TRUE; + } else if (strcmp (key, "l") == 0) { + /* Toggle the loop flag. If we have both start and end segment times send a seek */ + navseek->loop = !navseek->loop; + gst_navseek_segseek (navseek); + } else if (strcmp (key, "f") == 0) { + /* fast forward */ + gst_navseek_change_playback_rate (navseek, 2.0); + } else if (strcmp (key, "r") == 0) { + /* rewind */ + gst_navseek_change_playback_rate (navseek, -2.0); + } else if (strcmp (key, "n") == 0) { + /* normal speed */ + gst_navseek_change_playback_rate (navseek, 1.0); + } else if (strcmp (key, "space") == 0) { + gst_navseek_toggle_play_pause (navseek); + } + } else { + break; + } + gst_event_unref (event); + event = NULL; + } + break; + default: + break; + } + + if (event && GST_PAD_IS_LINKED (GST_BASE_TRANSFORM (navseek)->sinkpad)) { + GstPad *peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); + + ret = gst_pad_send_event (peer_pad, event); + gst_object_unref (peer_pad); + } + + return ret; +} + +static void +gst_navseek_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstNavSeek *navseek = GST_NAVSEEK (object); + + switch (prop_id) { + case ARG_SEEKOFFSET: + GST_OBJECT_LOCK (navseek); + navseek->seek_offset = g_value_get_double (value); + GST_OBJECT_UNLOCK (navseek); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_navseek_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstNavSeek *navseek = GST_NAVSEEK (object); + + switch (prop_id) { + case ARG_SEEKOFFSET: + GST_OBJECT_LOCK (navseek); + g_value_set_double (value, navseek->seek_offset); + GST_OBJECT_UNLOCK (navseek); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_navseek_event (GstBaseTransform * trans, GstEvent * event) +{ + GstNavSeek *navseek = GST_NAVSEEK (trans); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + GST_OBJECT_LOCK (navseek); + if (navseek->loop) + gst_navseek_segseek (navseek); + GST_OBJECT_UNLOCK (navseek); + break; + default: + break; + } + return GST_BASE_TRANSFORM_CLASS (parent_class)->event (trans, event); +} + +static GstFlowReturn +gst_navseek_transform_ip (GstBaseTransform * basetrans, GstBuffer * buf) +{ + GstNavSeek *navseek = GST_NAVSEEK (basetrans); + + GST_OBJECT_LOCK (navseek); + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + if (navseek->grab_seg_start) { + navseek->segment_start = GST_BUFFER_TIMESTAMP (buf); + navseek->segment_end = GST_CLOCK_TIME_NONE; + navseek->grab_seg_start = FALSE; + } + + if (navseek->grab_seg_end) { + navseek->segment_end = GST_BUFFER_TIMESTAMP (buf); + navseek->grab_seg_end = FALSE; + gst_navseek_segseek (navseek); + } + } + + GST_OBJECT_UNLOCK (navseek); + + return GST_FLOW_OK; +} + +static gboolean +gst_navseek_start (GstBaseTransform * trans) +{ + /* anything we should be doing here? */ + return TRUE; +} + +static gboolean +gst_navseek_stop (GstBaseTransform * trans) +{ + /* anything we should be doing here? */ + return TRUE; +} diff --git a/gst/debugutils/gstnavseek.h b/gst/debugutils/gstnavseek.h new file mode 100644 index 0000000..af7e9d2 --- /dev/null +++ b/gst/debugutils/gstnavseek.h @@ -0,0 +1,60 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_NAVSEEK_H__ +#define __GST_NAVSEEK_H__ + + +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_NAVSEEK \ + (gst_navseek_get_type()) +#define GST_NAVSEEK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NAVSEEK,GstNavSeek)) +#define GST_NAVSEEK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NAVSEEK,GstNavSeekClass)) +#define GST_IS_NAVSEEK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NAVSEEK)) +#define GST_IS_NAVSEEK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NAVSEEK)) +typedef struct _GstNavSeek GstNavSeek; +typedef struct _GstNavSeekClass GstNavSeekClass; + +struct _GstNavSeek +{ + GstBaseTransform basetransform; + + gdouble seek_offset; + gboolean loop; + gboolean grab_seg_start; + gboolean grab_seg_end; + GstClockTime segment_start; + GstClockTime segment_end; +}; + +struct _GstNavSeekClass +{ + GstBaseTransformClass parent_class; +}; + +G_END_DECLS +#endif /* __GST_NAVSEEK_H__ */ diff --git a/gst/debugutils/gstpushfilesrc.c b/gst/debugutils/gstpushfilesrc.c new file mode 100644 index 0000000..012ad9f --- /dev/null +++ b/gst/debugutils/gstpushfilesrc.c @@ -0,0 +1,191 @@ +/* GStreamer Push File Source + * Copyright (C) <2007> Tim-Philipp Müller + * + * 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-pushfilesrc + * @see_also: filesrc + * + * This element is only useful for debugging purposes. It implements an URI + * protocol handler for the 'pushfile' protocol and behaves like a file source + * element that cannot be activated in pull-mode. This makes it very easy to + * debug demuxers or decoders that can operate both pull and push-based in + * connection with the playbin element (which creates a source based on the + * URI passed). + * + * + * Example launch line + * |[ + * gst-launch -m playbin uri=pushfile:///home/you/some/file.ogg + * ]| This plays back the given file using playbin, with the demuxer operating + * push-based. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstpushfilesrc.h" + +#include + +GST_DEBUG_CATEGORY_STATIC (pushfilesrc_debug); +#define GST_CAT_DEFAULT pushfilesrc_debug + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static void gst_push_file_src_uri_handler_init (gpointer g_iface, + gpointer iface_data); +static void gst_file_push_src_add_uri_handler (GType type); + +GST_BOILERPLATE_FULL (GstPushFileSrc, gst_push_file_src, GstBin, GST_TYPE_BIN, + gst_file_push_src_add_uri_handler); + +static void +gst_file_push_src_add_uri_handler (GType type) +{ + static const GInterfaceInfo info = { + gst_push_file_src_uri_handler_init, + NULL, + NULL + }; + + g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &info); + GST_DEBUG_CATEGORY_INIT (pushfilesrc_debug, "pushfilesrc", 0, + "pushfilesrc element"); +} + +static void +gst_push_file_src_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &srctemplate); + + gst_element_class_set_details_simple (element_class, "Push File Source", + "Testing", + "Implements pushfile:// URI-handler for push-based file access", + "Tim-Philipp Müller "); +} + +static void +gst_push_file_src_dispose (GObject * obj) +{ + GstPushFileSrc *src = GST_PUSH_FILE_SRC (obj); + + if (src->srcpad) { + gst_element_remove_pad (GST_ELEMENT (src), src->srcpad); + src->srcpad = NULL; + } + if (src->filesrc) { + gst_bin_remove (GST_BIN (src), src->filesrc); + src->filesrc = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (obj); +} + +static void +gst_push_file_src_class_init (GstPushFileSrcClass * g_class) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (g_class); + + gobject_class->dispose = gst_push_file_src_dispose; +} + +static gboolean +gst_push_file_src_ghostpad_checkgetrange (GstPad * pad) +{ + return FALSE; +} + +static void +gst_push_file_src_init (GstPushFileSrc * src, GstPushFileSrcClass * g_class) +{ + src->filesrc = gst_element_factory_make ("filesrc", "real-filesrc"); + if (src->filesrc) { + GstPad *pad; + + gst_bin_add (GST_BIN (src), src->filesrc); + pad = gst_element_get_static_pad (src->filesrc, "src"); + g_assert (pad != NULL); + src->srcpad = gst_ghost_pad_new ("src", pad); + /* FIXME^H^HCORE: try pushfile:///foo/bar.ext ! typefind ! fakesink without + * this and watch core bugginess (some pad stays in flushing state) */ + gst_pad_set_checkgetrange_function (src->srcpad, + GST_DEBUG_FUNCPTR (gst_push_file_src_ghostpad_checkgetrange)); + gst_element_add_pad (GST_ELEMENT (src), src->srcpad); + gst_object_unref (pad); + } +} + +/*** GSTURIHANDLER INTERFACE *************************************************/ + +static GstURIType +gst_push_file_src_uri_get_type (void) +{ + return GST_URI_SRC; +} + +static gchar ** +gst_push_file_src_uri_get_protocols (void) +{ + static gchar *protocols[] = { (char *) "pushfile", NULL }; + + return protocols; +} + +static const gchar * +gst_push_file_src_uri_get_uri (GstURIHandler * handler) +{ + GstPushFileSrc *src = GST_PUSH_FILE_SRC (handler); + + if (src->filesrc == NULL) + return NULL; + + return gst_uri_handler_get_uri (GST_URI_HANDLER (src->filesrc)); +} + +static gboolean +gst_push_file_src_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + GstPushFileSrc *src = GST_PUSH_FILE_SRC (handler); + + if (src->filesrc == NULL || !g_str_has_prefix (uri, "pushfile://")) + return FALSE; + + /* skip 'push' bit */ + return gst_uri_handler_set_uri (GST_URI_HANDLER (src->filesrc), uri + 4); +} + +static void +gst_push_file_src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_push_file_src_uri_get_type; + iface->get_protocols = gst_push_file_src_uri_get_protocols; + iface->get_uri = gst_push_file_src_uri_get_uri; + iface->set_uri = gst_push_file_src_uri_set_uri; +} diff --git a/gst/debugutils/gstpushfilesrc.h b/gst/debugutils/gstpushfilesrc.h new file mode 100644 index 0000000..d933344 --- /dev/null +++ b/gst/debugutils/gstpushfilesrc.h @@ -0,0 +1,56 @@ +/* GStreamer Push File Source + * Copyright (C) <2007> Tim-Philipp Müller + * + * 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_PUSH_FILE_SRC_H__ +#define __GST_PUSH_FILE_SRC_H__ + +#include + +G_BEGIN_DECLS +#define GST_TYPE_PUSH_FILE_SRC \ + (gst_push_file_src_get_type()) +#define GST_PUSH_FILE_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PUSH_FILE_SRC,GstPushFileSrc)) +#define GST_PUSH_FILE_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PUSH_FILE_SRC,GstPushFileSrcClass)) +#define GST_IS_PUSH_FILE_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PUSH_FILE_SRC)) +#define GST_IS_PUSH_FILE_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PUSH_FILE_SRC)) +typedef struct _GstPushFileSrc GstPushFileSrc; +typedef struct _GstPushFileSrcClass GstPushFileSrcClass; + +struct _GstPushFileSrc +{ + GstBin parent; + + /*< private > */ + GstElement *filesrc; + GstPad *srcpad; +}; + +struct _GstPushFileSrcClass +{ + GstBinClass parent_class; +}; + +GType gst_push_file_src_get_type (void); + +G_END_DECLS +#endif /* __GST_PUSH_FILE_SRC_H__ */ diff --git a/gst/debugutils/gsttaginject.c b/gst/debugutils/gsttaginject.c new file mode 100644 index 0000000..20a88a5 --- /dev/null +++ b/gst/debugutils/gsttaginject.c @@ -0,0 +1,209 @@ +/* GStreamer + * Copyright (C) 2008 Stefan Kost + * + * gsttaginject.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. + */ +/** + * SECTION:element-taginject + * + * Element that injects new metadata tags, but passes incomming data through + * unmodified. + * + * + * Example launch lines + * |[ + * gst-launch audiotestsrc num-buffers=100 ! taginject tags="title=testsrc,artist=gstreamer" ! vorbisenc ! oggmux ! filesink location=test.ogg + * ]| set title and artist + * |[ + * gst-launch audiotestsrc num-buffers=100 ! taginject tags="keywords=\{\"testone\",\"audio\"\},title=\"audio testtone\"" ! vorbisenc ! oggmux ! filesink location=test.ogg + * ]| set keywords and title demonstrating quoting of special chars and handling lists + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "gsttaginject.h" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GST_DEBUG_CATEGORY_STATIC (gst_tag_inject_debug); +#define GST_CAT_DEFAULT gst_tag_inject_debug + +enum +{ + PROP_TAGS = 1 +}; + + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_tag_inject_debug, "taginject", 0, "tag inject element"); + +GST_BOILERPLATE_FULL (GstTagInject, gst_tag_inject, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); + +static void gst_tag_inject_finalize (GObject * object); +static void gst_tag_inject_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_tag_inject_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_tag_inject_transform_ip (GstBaseTransform * trans, + GstBuffer * buf); +static gboolean gst_tag_inject_start (GstBaseTransform * trans); + + +static void +gst_tag_inject_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (gstelement_class, + "TagInject", + "Generic", "inject metadata tags", "Stefan Kost "); + gst_element_class_add_static_pad_template (gstelement_class, + &srctemplate); + gst_element_class_add_static_pad_template (gstelement_class, + &sinktemplate); +} + +static void +gst_tag_inject_finalize (GObject * object) +{ + GstTagInject *self = GST_TAG_INJECT (object); + + if (self->tags) { + gst_tag_list_free (self->tags); + self->tags = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_tag_inject_class_init (GstTagInjectClass * klass) +{ + GObjectClass *gobject_class; + GstBaseTransformClass *gstbasetrans_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (klass); + + gobject_class->set_property = gst_tag_inject_set_property; + gobject_class->get_property = gst_tag_inject_get_property; + + g_object_class_install_property (gobject_class, PROP_TAGS, + g_param_spec_string ("tags", "taglist", + "List of tags to inject into the target file", + NULL, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + + gobject_class->finalize = gst_tag_inject_finalize; + + gstbasetrans_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_tag_inject_transform_ip); + + gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_tag_inject_start); +} + +static void +gst_tag_inject_init (GstTagInject * self, GstTagInjectClass * g_class) +{ + GstBaseTransform *trans = GST_BASE_TRANSFORM (self); + + gst_base_transform_set_gap_aware (trans, TRUE); + + self->tags = NULL; +} + +static GstFlowReturn +gst_tag_inject_transform_ip (GstBaseTransform * trans, GstBuffer * buf) +{ + GstTagInject *self = GST_TAG_INJECT (trans); + + if (G_UNLIKELY (!self->tags_sent)) { + self->tags_sent = TRUE; + /* send tags */ + if (self->tags && !gst_tag_list_is_empty (self->tags)) { + GST_DEBUG ("tag event :%" GST_PTR_FORMAT, self->tags); + gst_element_found_tags (GST_ELEMENT (trans), + gst_tag_list_copy (self->tags)); + } + } + + return GST_FLOW_OK; +} + +static void +gst_tag_inject_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstTagInject *self = GST_TAG_INJECT (object); + + switch (prop_id) { + case PROP_TAGS:{ + gchar *structure = + g_strdup_printf ("taglist,%s", g_value_get_string (value)); + if (!(self->tags = gst_structure_from_string (structure, NULL))) { + GST_WARNING ("unparsable taglist = '%s'", structure); + } + + /* make sure that tags will be send */ + self->tags_sent = FALSE; + g_free (structure); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_tag_inject_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + /*GstTagInject *self = GST_TAG_INJECT (object); */ + + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_tag_inject_start (GstBaseTransform * trans) +{ + GstTagInject *self = GST_TAG_INJECT (trans); + + /* we need to sent tags _transform_ip() once */ + self->tags_sent = FALSE; + + return TRUE; +} diff --git a/gst/debugutils/gsttaginject.h b/gst/debugutils/gsttaginject.h new file mode 100644 index 0000000..8e8de1e --- /dev/null +++ b/gst/debugutils/gsttaginject.h @@ -0,0 +1,66 @@ +/* GStreamer + * Copyright (C) 2008 Stefan Kost + * + * gsttaginject.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __GST_TAG_INJECT_H__ +#define __GST_TAG_INJECT_H__ + + +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_TAG_INJECT \ + (gst_tag_inject_get_type()) +#define GST_TAG_INJECT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TAG_INJECT,GstTagInject)) +#define GST_TAG_INJECT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TAG_INJECT,GstTagInjectClass)) +#define GST_IS_TAG_INJECT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TAG_INJECT)) +#define GST_IS_TAG_INJECT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TAG_INJECT)) +typedef struct _GstTagInject GstTagInject; +typedef struct _GstTagInjectClass GstTagInjectClass; + +/** + * GstTagInject: + * + * Opaque #GstTagInject data structure + */ +struct _GstTagInject +{ + GstBaseTransform element; + + /*< private > */ + GstTagList *tags; + gboolean tags_sent; +}; + +struct _GstTagInjectClass +{ + GstBaseTransformClass parent_class; +}; + +GType gst_tag_inject_get_type (void); + +G_END_DECLS +#endif /* __GST_TAG_INJECT_H__ */ diff --git a/gst/debugutils/progressreport.c b/gst/debugutils/progressreport.c new file mode 100644 index 0000000..2ef30a1 --- /dev/null +++ b/gst/debugutils/progressreport.c @@ -0,0 +1,512 @@ +/* GStreamer Progress Report Element + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) <2004> Jan Schmidt + * Copyright (C) <2006> Tim-Philipp Müller + * + * 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-progressreport + * + * The progressreport element can be put into a pipeline to report progress, + * which is done by doing upstream duration and position queries in regular + * (real-time) intervals. Both the interval and the prefered query format + * can be specified via the #GstProgressReport:update-freq and the + * #GstProgressReport:format property. + * + * Element messages containing a "progress" structure are posted on the bus + * whenever progress has been queried (since gst-plugins-good 0.10.6 only). + * + * Since the element was originally designed for debugging purposes, it will + * by default also print information about the current progress to the + * terminal. This can be prevented by setting the #GstProgressReport:silent + * property to %TRUE. + * + * This element is most useful in transcoding pipelines or other situations + * where just querying the pipeline might not lead to the wanted result. For + * progress in TIME format, the element is best placed in a 'raw stream' + * section of the pipeline (or after any demuxers/decoders/parsers). + * + * Three more things should be pointed out: firstly, the element will only + * query progress when data flow happens. If data flow is stalled for some + * reason, no progress messages will be posted. Secondly, there are other + * elements (like qtdemux, for example) that may also post "progress" element + * messages on the bus. Applications should check the source of any element + * messages they receive, if needed. Finally, applications should not take + * action on receiving notification of progress being 100%, they should only + * take action when they receive an EOS message (since the progress reported + * is in reference to an internal point of a pipeline and not the pipeline as + * a whole). + * + * + * Example launch line + * |[ + * gst-launch -m filesrc location=foo.ogg ! decodebin ! progressreport update-freq=1 ! audioconvert ! audioresample ! autoaudiosink + * ]| This shows a progress query where a duration is available. + * |[ + * gst-launch -m audiotestsrc ! progressreport update-freq=1 ! audioconvert ! autoaudiosink + * ]| This shows a progress query where no duration is available. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include "progressreport.h" + + +enum +{ + ARG_0, + ARG_UPDATE_FREQ, + ARG_SILENT, + ARG_DO_QUERY, + ARG_FORMAT +}; + +GstStaticPadTemplate progress_report_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GstStaticPadTemplate progress_report_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +#define DEFAULT_UPDATE_FREQ 5 +#define DEFAULT_SILENT FALSE +#define DEFAULT_DO_QUERY TRUE +#define DEFAULT_FORMAT "auto" + +static void gst_progress_report_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_progress_report_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_progress_report_event (GstBaseTransform * trans, + GstEvent * event); +static GstFlowReturn gst_progress_report_transform_ip (GstBaseTransform * trans, + GstBuffer * buf); + +static gboolean gst_progress_report_start (GstBaseTransform * trans); +static gboolean gst_progress_report_stop (GstBaseTransform * trans); + +GST_BOILERPLATE (GstProgressReport, gst_progress_report, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void +gst_progress_report_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &progress_report_sink_template); + gst_element_class_add_static_pad_template (element_class, + &progress_report_src_template); + + gst_element_class_set_details_simple (element_class, "Progress report", + "Testing", + "Periodically query and report on processing progress", + "Jan Schmidt "); +} + +static void +gst_progress_report_finalize (GObject * obj) +{ + GstProgressReport *filter = GST_PROGRESS_REPORT (obj); + + g_free (filter->format); + filter->format = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_progress_report_class_init (GstProgressReportClass * g_class) +{ + GstBaseTransformClass *gstbasetrans_class; + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (g_class); + gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (g_class); + + gobject_class->finalize = gst_progress_report_finalize; + gobject_class->set_property = gst_progress_report_set_property; + gobject_class->get_property = gst_progress_report_get_property; + + g_object_class_install_property (gobject_class, + ARG_UPDATE_FREQ, g_param_spec_int ("update-freq", "Update Frequency", + "Number of seconds between reports when data is flowing", 1, G_MAXINT, + DEFAULT_UPDATE_FREQ, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + ARG_SILENT, g_param_spec_boolean ("silent", + "Do not print output to stdout", "Do not print output to stdout", + DEFAULT_SILENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + ARG_DO_QUERY, g_param_spec_boolean ("do-query", + "Use a query instead of buffer metadata to determine stream position", + "Use a query instead of buffer metadata to determine stream position", + DEFAULT_DO_QUERY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + ARG_FORMAT, g_param_spec_string ("format", "format", + "Format to use for the querying", DEFAULT_FORMAT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasetrans_class->event = GST_DEBUG_FUNCPTR (gst_progress_report_event); + gstbasetrans_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_progress_report_transform_ip); + gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_progress_report_start); + gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_progress_report_stop); +} + +static void +gst_progress_report_init (GstProgressReport * report, + GstProgressReportClass * g_class) +{ + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (report), TRUE); + + report->update_freq = DEFAULT_UPDATE_FREQ; + report->silent = DEFAULT_SILENT; + report->do_query = DEFAULT_DO_QUERY; + report->format = g_strdup (DEFAULT_FORMAT); +} + +static void +gst_progress_report_post_progress (GstProgressReport * filter, + GstFormat format, gint64 current, gint64 total) +{ + GstStructure *s = NULL; + + if (current >= 0 && total > 0) { + gdouble perc; + + perc = gst_util_guint64_to_gdouble (current) * 100.0 / + gst_util_guint64_to_gdouble (total); + perc = CLAMP (perc, 0.0, 100.0); + + /* we provide a "percent" field of integer type to stay compatible + * with qtdemux, but add a second "percent-double" field for those who + * want more precision and are too lazy to calculate it themselves */ + s = gst_structure_new ("progress", "percent", G_TYPE_INT, (gint) perc, + "percent-double", G_TYPE_DOUBLE, perc, "current", G_TYPE_INT64, current, + "total", G_TYPE_INT64, total, NULL); + } else if (current >= 0) { + s = gst_structure_new ("progress", "current", G_TYPE_INT64, current, NULL); + } + + if (s) { + GST_LOG_OBJECT (filter, "posting progress message: %" GST_PTR_FORMAT, s); + gst_structure_set (s, "format", GST_TYPE_FORMAT, format, NULL); + /* can't post it right here because we're holding the object lock */ + filter->pending_msg = gst_message_new_element (GST_OBJECT_CAST (filter), s); + } +} + +static gboolean +gst_progress_report_do_query (GstProgressReport * filter, GstFormat format, + gint hh, gint mm, gint ss, GstBuffer * buf) +{ + const gchar *format_name = NULL; + GstPad *sink_pad; + gint64 cur, total; + + sink_pad = GST_BASE_TRANSFORM (filter)->sinkpad; + + GST_LOG_OBJECT (filter, "querying using format %d (%s)", format, + gst_format_get_name (format)); + + if (filter->do_query || !buf) { + GST_LOG_OBJECT (filter, "using upstream query"); + if (!gst_pad_query_peer_position (sink_pad, &format, &cur) || + !gst_pad_query_peer_duration (sink_pad, &format, &total)) { + return FALSE; + } + } else { + GstBaseTransform *base = GST_BASE_TRANSFORM (filter); + + GST_LOG_OBJECT (filter, "using buffer metadata"); + if (format == GST_FORMAT_TIME && base->have_newsegment && + base->segment.format == GST_FORMAT_TIME) { + cur = gst_segment_to_stream_time (&base->segment, format, + GST_BUFFER_TIMESTAMP (buf)); + total = base->segment.duration; + } else { + return FALSE; + } + } + + switch (format) { + case GST_FORMAT_BYTES: + format_name = "bytes"; + break; + case GST_FORMAT_BUFFERS: + format_name = "buffers"; + break; + case GST_FORMAT_PERCENT: + format_name = "percent"; + break; + case GST_FORMAT_TIME: + format_name = "seconds"; + cur /= GST_SECOND; + total /= GST_SECOND; + break; + case GST_FORMAT_DEFAULT:{ + GstCaps *caps; + + format_name = "bogounits"; + caps = GST_PAD_CAPS (GST_BASE_TRANSFORM (filter)->sinkpad); + if (caps && gst_caps_is_fixed (caps) && !gst_caps_is_any (caps)) { + GstStructure *s = gst_caps_get_structure (caps, 0); + const gchar *mime_type = gst_structure_get_name (s); + + if (g_str_has_prefix (mime_type, "video/") || + g_str_has_prefix (mime_type, "image/")) { + format_name = "frames"; + } else if (g_str_has_prefix (mime_type, "audio/")) { + format_name = "samples"; + } + } + break; + } + default:{ + const GstFormatDefinition *details; + + details = gst_format_get_details (format); + if (details) { + format_name = details->nick; + } else { + format_name = "unknown"; + } + break; + } + } + + if (!filter->silent) { + if (total > 0) { + g_print ("%s (%02d:%02d:%02d): %" G_GINT64_FORMAT " / %" + G_GINT64_FORMAT " %s (%4.1f %%)\n", GST_OBJECT_NAME (filter), hh, + mm, ss, cur, total, format_name, (gdouble) cur / total * 100.0); + } else { + g_print ("%s (%02d:%02d:%02d): %" G_GINT64_FORMAT " %s\n", + GST_OBJECT_NAME (filter), hh, mm, ss, cur, format_name); + } + } + + gst_progress_report_post_progress (filter, format, cur, total); + return TRUE; +} + +static void +gst_progress_report_report (GstProgressReport * filter, GTimeVal cur_time, + GstBuffer * buf) +{ + GstFormat try_formats[] = { GST_FORMAT_TIME, GST_FORMAT_BYTES, + GST_FORMAT_PERCENT, GST_FORMAT_BUFFERS, + GST_FORMAT_DEFAULT + }; + GstMessage *msg; + GstFormat format = GST_FORMAT_UNDEFINED; + gboolean done = FALSE; + glong run_time; + gint hh, mm, ss; + + run_time = cur_time.tv_sec - filter->start_time.tv_sec; + + hh = (run_time / 3600) % 100; + mm = (run_time / 60) % 60; + ss = (run_time % 60); + + GST_OBJECT_LOCK (filter); + + if (filter->format != NULL && strcmp (filter->format, "auto") != 0) { + format = gst_format_get_by_nick (filter->format); + } + + if (format != GST_FORMAT_UNDEFINED) { + done = gst_progress_report_do_query (filter, format, hh, mm, ss, buf); + } else { + gint i; + + for (i = 0; i < G_N_ELEMENTS (try_formats); ++i) { + done = gst_progress_report_do_query (filter, try_formats[i], hh, mm, ss, + buf); + if (done) + break; + } + } + + if (!done && !filter->silent) { + g_print ("%s (%2d:%2d:%2d): Could not query position and/or duration\n", + GST_OBJECT_NAME (filter), hh, mm, ss); + } + + msg = filter->pending_msg; + filter->pending_msg = NULL; + GST_OBJECT_UNLOCK (filter); + + if (msg) { + gst_element_post_message (GST_ELEMENT_CAST (filter), msg); + } +} + +static gboolean +gst_progress_report_event (GstBaseTransform * trans, GstEvent * event) +{ + GstProgressReport *filter; + + filter = GST_PROGRESS_REPORT (trans); + + if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) { + GTimeVal cur_time; + + g_get_current_time (&cur_time); + gst_progress_report_report (filter, cur_time, NULL); + } + return GST_BASE_TRANSFORM_CLASS (parent_class)->event (trans, event); +} + +static GstFlowReturn +gst_progress_report_transform_ip (GstBaseTransform * trans, GstBuffer * buf) +{ + GstProgressReport *filter; + gboolean need_update; + GTimeVal cur_time; + + g_get_current_time (&cur_time); + + filter = GST_PROGRESS_REPORT (trans); + + /* Check if update_freq seconds have passed since the last update */ + GST_OBJECT_LOCK (filter); + need_update = + ((cur_time.tv_sec - filter->last_report.tv_sec) >= filter->update_freq); + GST_OBJECT_UNLOCK (filter); + + if (need_update) { + gst_progress_report_report (filter, cur_time, buf); + GST_OBJECT_LOCK (filter); + filter->last_report = cur_time; + GST_OBJECT_UNLOCK (filter); + } + + return GST_FLOW_OK; +} + +static gboolean +gst_progress_report_start (GstBaseTransform * trans) +{ + GstProgressReport *filter; + + filter = GST_PROGRESS_REPORT (trans); + + g_get_current_time (&filter->last_report); + filter->start_time = filter->last_report; + + return TRUE; +} + +static gboolean +gst_progress_report_stop (GstBaseTransform * trans) +{ + /* anything we should be doing here? */ + return TRUE; +} + +static void +gst_progress_report_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstProgressReport *filter; + + filter = GST_PROGRESS_REPORT (object); + + switch (prop_id) { + case ARG_UPDATE_FREQ: + GST_OBJECT_LOCK (filter); + filter->update_freq = g_value_get_int (value); + GST_OBJECT_UNLOCK (filter); + break; + case ARG_SILENT: + GST_OBJECT_LOCK (filter); + filter->silent = g_value_get_boolean (value); + GST_OBJECT_UNLOCK (filter); + break; + case ARG_DO_QUERY: + GST_OBJECT_LOCK (filter); + filter->do_query = g_value_get_boolean (value); + GST_OBJECT_UNLOCK (filter); + break; + case ARG_FORMAT: + GST_OBJECT_LOCK (filter); + g_free (filter->format); + filter->format = g_value_dup_string (value); + if (filter->format == NULL) + filter->format = g_strdup ("auto"); + GST_OBJECT_UNLOCK (filter); + break; + default: + break; + } +} + +static void +gst_progress_report_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstProgressReport *filter; + + filter = GST_PROGRESS_REPORT (object); + + switch (prop_id) { + case ARG_UPDATE_FREQ: + GST_OBJECT_LOCK (filter); + g_value_set_int (value, filter->update_freq); + GST_OBJECT_UNLOCK (filter); + break; + case ARG_SILENT: + GST_OBJECT_LOCK (filter); + g_value_set_boolean (value, filter->silent); + GST_OBJECT_UNLOCK (filter); + break; + case ARG_DO_QUERY: + GST_OBJECT_LOCK (filter); + g_value_set_boolean (value, filter->do_query); + GST_OBJECT_UNLOCK (filter); + break; + case ARG_FORMAT: + GST_OBJECT_LOCK (filter); + g_value_set_string (value, filter->format); + GST_OBJECT_UNLOCK (filter); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/debugutils/progressreport.h b/gst/debugutils/progressreport.h new file mode 100644 index 0000000..0d50149 --- /dev/null +++ b/gst/debugutils/progressreport.h @@ -0,0 +1,67 @@ +/* GStreamer Progress Report Element + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) <2004> Jan Schmidt + * Copyright (C) <2006> Tim-Philipp Müller + * + * 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_PROGRESS_REPORT_H__ +#define __GST_PROGRESS_REPORT_H__ + +#include + +G_BEGIN_DECLS +#define GST_TYPE_PROGRESS_REPORT \ + (gst_progress_report_get_type()) +#define GST_PROGRESS_REPORT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PROGRESS_REPORT,GstProgressReport)) +#define GST_PROGRESS_REPORT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PROGRESS_REPORT,GstProgressReportClass)) +#define GST_IS_PROGRESS_REPORT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PROGRESS_REPORT)) +#define GST_IS_PROGRESS_REPORT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PROGRESS_REPORT)) +typedef struct _GstProgressReport GstProgressReport; +typedef struct _GstProgressReportClass GstProgressReportClass; + +struct _GstProgressReport +{ + GstBaseTransform basetransform; + + GstMessage *pending_msg; + + gint update_freq; + gboolean silent; + gboolean do_query; + GTimeVal start_time; + GTimeVal last_report; + + /* Format used for querying. Using a string here because the + * format might not be registered yet when the property is set */ + gchar *format; +}; + +struct _GstProgressReportClass +{ + GstBaseTransformClass parent_class; +}; + +GType gst_progress_report_get_type (void); + +G_END_DECLS +#endif /* __GST_PROGRESS_REPORT_H__ */ diff --git a/gst/debugutils/rndbuffersize.c b/gst/debugutils/rndbuffersize.c new file mode 100644 index 0000000..e6ddd1f --- /dev/null +++ b/gst/debugutils/rndbuffersize.c @@ -0,0 +1,373 @@ +/* GStreamer + * Copyright (C) 2007 Nokia Corporation (contact ) + * + * 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-rndbuffersize + * + * This element pulls buffers with random sizes from the source. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +GST_DEBUG_CATEGORY_STATIC (gst_rnd_buffer_size_debug); +#define GST_CAT_DEFAULT gst_rnd_buffer_size_debug + +#define GST_TYPE_RND_BUFFER_SIZE (gst_rnd_buffer_size_get_type()) +#define GST_RND_BUFFER_SIZE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RND_BUFFER_SIZE,GstRndBufferSize)) +#define GST_RND_BUFFER_SIZE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RND_BUFFER_SIZE,GstRndBufferSizeClass)) +#define GST_IS_RND_BUFFER_SIZE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RND_BUFFER_SIZE)) +#define GST_IS_RND_BUFFER_SIZE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RND_BUFFER_SIZE)) + +typedef struct _GstRndBufferSize GstRndBufferSize; +typedef struct _GstRndBufferSizeClass GstRndBufferSizeClass; + +struct _GstRndBufferSize +{ + GstElement parent; + + /*< private > */ + GRand *rand; + gulong seed; + glong min, max; + + GstPad *sinkpad, *srcpad; + guint64 offset; +}; + +struct _GstRndBufferSizeClass +{ + GstElementClass parent_class; +}; + +enum +{ + ARG_SEED = 1, + ARG_MINIMUM, + ARG_MAXIMUM +}; + +#define DEFAULT_SEED 0 +#define DEFAULT_MIN 1 +#define DEFAULT_MAX (8*1024) + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static void gst_rnd_buffer_size_finalize (GObject * object); +static void gst_rnd_buffer_size_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rnd_buffer_size_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_rnd_buffer_size_activate (GstPad * pad); +static gboolean gst_rnd_buffer_size_activate_pull (GstPad * pad, + gboolean active); +static void gst_rnd_buffer_size_loop (GstRndBufferSize * self); +static GstStateChangeReturn gst_rnd_buffer_size_change_state (GstElement * + element, GstStateChange transition); + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_rnd_buffer_size_debug, "rndbuffersize", 0, \ + "rndbuffersize element"); + +GType gst_rnd_buffer_size_get_type (void); +GST_BOILERPLATE_FULL (GstRndBufferSize, gst_rnd_buffer_size, GstElement, + GST_TYPE_ELEMENT, DEBUG_INIT); + + +static void +gst_rnd_buffer_size_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (gstelement_class, + &sink_template); + gst_element_class_add_static_pad_template (gstelement_class, + &src_template); + + gst_element_class_set_details_simple (gstelement_class, "Random buffer size", + "Testing", "pull random sized buffers", + "Stefan Kost "); +} + + +static void +gst_rnd_buffer_size_class_init (GstRndBufferSizeClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + gobject_class->set_property = gst_rnd_buffer_size_set_property; + gobject_class->get_property = gst_rnd_buffer_size_get_property; + gobject_class->finalize = gst_rnd_buffer_size_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_change_state); + + /* FIXME 0.11: these should all be int instead of long, to avoid bugs + * when passing these as varargs with g_object_set(), and there was no + * reason to use long in the first place here */ + g_object_class_install_property (gobject_class, ARG_SEED, + g_param_spec_ulong ("seed", "random number seed", + "seed for randomness (initialized when going from READY to PAUSED)", + 0, G_MAXUINT32, DEFAULT_SEED, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_MINIMUM, + g_param_spec_long ("min", "mininum", "mininum buffer size", + 0, G_MAXINT32, DEFAULT_MIN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_MAXIMUM, + g_param_spec_long ("max", "maximum", "maximum buffer size", + 1, G_MAXINT32, DEFAULT_MAX, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_rnd_buffer_size_init (GstRndBufferSize * self, + GstRndBufferSizeClass * g_class) +{ + self->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); + gst_pad_set_activate_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_activate)); + gst_pad_set_activatepull_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_activate_pull)); + gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); + + self->srcpad = gst_pad_new_from_static_template (&src_template, "src"); + gst_element_add_pad (GST_ELEMENT (self), self->srcpad); +} + + +static void +gst_rnd_buffer_size_finalize (GObject * object) +{ + GstRndBufferSize *self = GST_RND_BUFFER_SIZE (object); + + if (self->rand) { + g_rand_free (self->rand); + self->rand = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static void +gst_rnd_buffer_size_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRndBufferSize *self = GST_RND_BUFFER_SIZE (object); + + switch (prop_id) { + case ARG_SEED: + self->seed = g_value_get_ulong (value); + break; + case ARG_MINIMUM: + self->min = g_value_get_long (value); + break; + case ARG_MAXIMUM: + self->max = g_value_get_long (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static void +gst_rnd_buffer_size_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRndBufferSize *self = GST_RND_BUFFER_SIZE (object); + + switch (prop_id) { + case ARG_SEED: + g_value_set_ulong (value, self->seed); + break; + case ARG_MINIMUM: + g_value_set_long (value, self->min); + break; + case ARG_MAXIMUM: + g_value_set_long (value, self->max); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static gboolean +gst_rnd_buffer_size_activate (GstPad * pad) +{ + if (gst_pad_check_pull_range (pad)) { + return gst_pad_activate_pull (pad, TRUE); + } else { + GST_INFO_OBJECT (pad, "push mode not supported"); + return FALSE; + } +} + + +static gboolean +gst_rnd_buffer_size_activate_pull (GstPad * pad, gboolean active) +{ + GstRndBufferSize *self = GST_RND_BUFFER_SIZE (GST_OBJECT_PARENT (pad)); + + if (active) { + GST_INFO_OBJECT (self, "starting pull"); + return gst_pad_start_task (pad, (GstTaskFunction) gst_rnd_buffer_size_loop, + self); + } else { + GST_INFO_OBJECT (self, "stopping pull"); + return gst_pad_stop_task (pad); + } +} + + +static void +gst_rnd_buffer_size_loop (GstRndBufferSize * self) +{ + GstBuffer *buf = NULL; + GstFlowReturn ret; + guint num_bytes; + + if (G_UNLIKELY (self->min > self->max)) + goto bogus_minmax; + + if (G_UNLIKELY (self->min != self->max)) { + num_bytes = g_rand_int_range (self->rand, self->min, self->max); + } else { + num_bytes = self->min; + } + + GST_LOG_OBJECT (self, "pulling %u bytes at offset %" G_GUINT64_FORMAT, + num_bytes, self->offset); + + ret = gst_pad_pull_range (self->sinkpad, self->offset, num_bytes, &buf); + + if (ret != GST_FLOW_OK) + goto pull_failed; + + if (GST_BUFFER_SIZE (buf) < num_bytes) { + GST_WARNING_OBJECT (self, "short buffer: %u bytes", GST_BUFFER_SIZE (buf)); + } + + self->offset += GST_BUFFER_SIZE (buf); + + ret = gst_pad_push (self->srcpad, buf); + + if (ret != GST_FLOW_OK) + goto push_failed; + + return; + +pause_task: + { + GST_DEBUG_OBJECT (self, "pausing task"); + gst_pad_pause_task (self->sinkpad); + return; + } + +pull_failed: + { + if (ret == GST_FLOW_UNEXPECTED) { + GST_DEBUG_OBJECT (self, "eos"); + gst_pad_push_event (self->srcpad, gst_event_new_eos ()); + } else { + GST_WARNING_OBJECT (self, "pull_range flow: %s", gst_flow_get_name (ret)); + } + goto pause_task; + } + +push_failed: + { + GST_DEBUG_OBJECT (self, "push flow: %s", gst_flow_get_name (ret)); + if (ret == GST_FLOW_UNEXPECTED) { + GST_DEBUG_OBJECT (self, "eos"); + gst_pad_push_event (self->srcpad, gst_event_new_eos ()); + } else if (ret < GST_FLOW_UNEXPECTED || ret == GST_FLOW_NOT_LINKED) { + GST_ELEMENT_ERROR (self, STREAM, FAILED, + ("Internal data stream error."), + ("streaming stopped, reason: %s", gst_flow_get_name (ret))); + } + goto pause_task; + } + +bogus_minmax: + { + GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, + ("The minimum buffer size is smaller than the maximum buffer size."), + ("buffer sizes: max=%ld, min=%ld", self->min, self->max)); + goto pause_task; + } +} + +static GstStateChangeReturn +gst_rnd_buffer_size_change_state (GstElement * element, + GstStateChange transition) +{ + GstRndBufferSize *self = GST_RND_BUFFER_SIZE (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + self->offset = 0; + if (!self->rand) { + self->rand = g_rand_new_with_seed (self->seed); + } + 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: + if (self->rand) { + g_rand_free (self->rand); + self->rand = NULL; + } + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} diff --git a/gst/debugutils/testplugin.c b/gst/debugutils/testplugin.c new file mode 100644 index 0000000..df0be93 --- /dev/null +++ b/gst/debugutils/testplugin.c @@ -0,0 +1,313 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * 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 +#include +#include "tests.h" + +GST_DEBUG_CATEGORY_STATIC (gst_test_debug); +#define GST_CAT_DEFAULT gst_test_debug + +/* This plugin does all the tests registered in the tests.h file + */ + +#define GST_TYPE_TEST \ + (gst_test_get_type()) +#define GST_TEST(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TEST,GstTest)) +#define GST_TEST_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TEST,GstTestClass)) +#define GST_TEST_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_TEST,GstTestClass)) +#define GST_IS_TEST(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TEST)) +#define GST_IS_TEST_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TEST)) + +typedef struct _GstTest GstTest; +typedef struct _GstTestClass GstTestClass; + +struct _GstTest +{ + GstBaseSink basesink; + + gpointer tests[TESTS_COUNT]; + GValue values[TESTS_COUNT]; +}; + +struct _GstTestClass +{ + GstBaseSinkClass parent_class; + + gchar *param_names[2 * TESTS_COUNT]; +}; + +static void gst_test_finalize (GstTest * test); + +static gboolean gst_test_start (GstBaseSink * trans); +static gboolean gst_test_stop (GstBaseSink * trans); +static gboolean gst_test_sink_event (GstBaseSink * basesink, GstEvent * event); +static GstFlowReturn gst_test_render_buffer (GstBaseSink * basesink, + GstBuffer * buf); + +static void gst_test_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_test_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_test_debug, "testsink", 0, \ + "debugging category for testsink element"); + +GType gst_test_get_type (void); +GST_BOILERPLATE_FULL (GstTest, gst_test, GstBaseSink, GST_TYPE_BASE_SINK, + DEBUG_INIT); + + +static void +gst_test_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (gstelement_class, + &sinktemplate); + + gst_element_class_set_details_simple (gstelement_class, "Test plugin", + "Testing", "perform a number of tests", "Benjamin Otte "); +} + +static void +gst_test_class_init (GstTestClass * klass) +{ + GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + guint i; + + object_class->set_property = gst_test_set_property; + object_class->get_property = gst_test_get_property; + + object_class->finalize = (GObjectFinalizeFunc) gst_test_finalize; + + for (i = 0; i < TESTS_COUNT; i++) { + GParamSpec *spec; + + spec = tests[i].get_spec (&tests[i], FALSE); + klass->param_names[2 * i] = g_strdup (g_param_spec_get_name (spec)); + g_object_class_install_property (object_class, 2 * i + 1, spec); + spec = tests[i].get_spec (&tests[i], TRUE); + klass->param_names[2 * i + 1] = g_strdup (g_param_spec_get_name (spec)); + g_object_class_install_property (object_class, 2 * i + 2, spec); + } + + basesink_class->render = GST_DEBUG_FUNCPTR (gst_test_render_buffer); + basesink_class->event = GST_DEBUG_FUNCPTR (gst_test_sink_event); + basesink_class->start = GST_DEBUG_FUNCPTR (gst_test_start); + basesink_class->stop = GST_DEBUG_FUNCPTR (gst_test_stop); +} + +static void +gst_test_init (GstTest * test, GstTestClass * g_class) +{ + GstTestClass *klass; + guint i; + + klass = GST_TEST_GET_CLASS (test); + for (i = 0; i < TESTS_COUNT; i++) { + GParamSpec *spec = g_object_class_find_property (G_OBJECT_CLASS (klass), + klass->param_names[2 * i + 1]); + + g_value_init (&test->values[i], G_PARAM_SPEC_VALUE_TYPE (spec)); + } +} + +static void +gst_test_finalize (GstTest * test) +{ + guint i; + + for (i = 0; i < TESTS_COUNT; i++) { + g_value_unset (&test->values[i]); + } + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) test); +} + +static void +tests_unset (GstTest * test) +{ + guint i; + + for (i = 0; i < TESTS_COUNT; i++) { + if (test->tests[i]) { + tests[i].free (test->tests[i]); + test->tests[i] = NULL; + } + } +} + +static void +tests_set (GstTest * test) +{ + guint i; + + for (i = 0; i < TESTS_COUNT; i++) { + g_assert (test->tests[i] == NULL); + test->tests[i] = tests[i].new (&tests[i]); + } +} + +static gboolean +gst_test_sink_event (GstBaseSink * basesink, GstEvent * event) +{ + GstTestClass *klass = GST_TEST_GET_CLASS (basesink); + GstTest *test = GST_TEST (basesink); + gboolean ret = FALSE; + + switch (GST_EVENT_TYPE (event)) { +/* + case GST_EVENT_NEWSEGMENT: + if (GST_EVENT_DISCONT_NEW_MEDIA (event)) { + tests_unset (test); + tests_set (test); + } + break; +*/ + case GST_EVENT_EOS:{ + gint i; + + g_object_freeze_notify (G_OBJECT (test)); + for (i = 0; i < TESTS_COUNT; i++) { + if (test->tests[i]) { + if (!tests[i].finish (test->tests[i], &test->values[i])) { + GValue v = { 0, }; + gchar *real, *expected; + + expected = gst_value_serialize (&test->values[i]); + g_value_init (&v, G_VALUE_TYPE (&test->values[i])); + g_object_get_property (G_OBJECT (test), klass->param_names[2 * i], + &v); + real = gst_value_serialize (&v); + g_value_unset (&v); + GST_ELEMENT_ERROR (test, STREAM, FORMAT, (NULL), + ("test %s returned value \"%s\" and not expected value \"%s\"", + klass->param_names[2 * i], real, expected)); + g_free (real); + g_free (expected); + } + g_object_notify (G_OBJECT (test), klass->param_names[2 * i]); + } + } + g_object_thaw_notify (G_OBJECT (test)); + ret = TRUE; + break; + } + default: + break; + } + + return ret; +} + +static GstFlowReturn +gst_test_render_buffer (GstBaseSink * basesink, GstBuffer * buf) +{ + GstTest *test = GST_TEST (basesink); + guint i; + + for (i = 0; i < TESTS_COUNT; i++) { + if (test->tests[i]) { + tests[i].add (test->tests[i], buf); + } + } + return GST_FLOW_OK; +} + +static gboolean +gst_test_start (GstBaseSink * sink) +{ + GstTest *test = GST_TEST (sink); + + tests_set (test); + return TRUE; +} + +static gboolean +gst_test_stop (GstBaseSink * sink) +{ + GstTest *test = GST_TEST (sink); + + tests_unset (test); + return TRUE; +} + +static void +gst_test_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstTest *test = GST_TEST (object); + + if (prop_id == 0 || prop_id > 2 * TESTS_COUNT) { + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + return; + } + + if (prop_id % 2) { + /* real values can't be set */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } else { + /* expected values */ + GST_OBJECT_LOCK (test); + g_value_copy (value, &test->values[prop_id / 2 - 1]); + GST_OBJECT_UNLOCK (test); + } +} + +static void +gst_test_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstTest *test = GST_TEST (object); + guint id = (prop_id - 1) / 2; + + if (prop_id == 0 || prop_id > 2 * TESTS_COUNT) { + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + return; + } + + GST_OBJECT_LOCK (test); + + if (prop_id % 2) { + /* real values */ + tests[id].get_value (test->tests[id], value); + } else { + /* expected values */ + g_value_copy (&test->values[id], value); + } + + GST_OBJECT_UNLOCK (test); +} diff --git a/gst/debugutils/tests.c b/gst/debugutils/tests.c new file mode 100644 index 0000000..93afd0e --- /dev/null +++ b/gst/debugutils/tests.c @@ -0,0 +1,265 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * includes code based on glibc 2.2.3's crypt/md5.c, + * Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc. + * + * 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 "tests.h" +#include +#include +#include + + +/* + *** LENGTH *** + */ + +typedef struct +{ + gint64 value; +} +LengthTest; + +static GParamSpec * +length_get_spec (const GstTestInfo * info, gboolean compare_value) +{ + if (compare_value) { + return g_param_spec_int64 ("expected-length", "expected length", + "expected length of stream", -1, G_MAXINT64, -1, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT); + } else { + return g_param_spec_int64 ("length", "length", "length of stream", + -1, G_MAXINT64, -1, G_PARAM_READABLE); + } +} + +static gpointer +length_new (const GstTestInfo * info) +{ + return g_new0 (LengthTest, 1); +} + +static void +length_add (gpointer test, GstBuffer * buffer) +{ + LengthTest *t = test; + + t->value += GST_BUFFER_SIZE (buffer); +} + +static gboolean +length_finish (gpointer test, GValue * value) +{ + LengthTest *t = test; + + if (g_value_get_int64 (value) == -1) + return TRUE; + + return t->value == g_value_get_int64 (value); +} + +static void +length_get_value (gpointer test, GValue * value) +{ + LengthTest *t = test; + + g_value_set_int64 (value, t ? t->value : -1); +} + +/* + *** BUFFER COUNT *** + */ + +static GParamSpec * +buffer_count_get_spec (const GstTestInfo * info, gboolean compare_value) +{ + if (compare_value) { + return g_param_spec_int64 ("expected-buffer-count", "expected buffer count", + "expected number of buffers in stream", + -1, G_MAXINT64, -1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); + } else { + return g_param_spec_int64 ("buffer-count", "buffer count", + "number of buffers in stream", -1, G_MAXINT64, -1, G_PARAM_READABLE); + } +} + +static void +buffer_count_add (gpointer test, GstBuffer * buffer) +{ + LengthTest *t = test; + + t->value++; +} + +/* + *** TIMESTAMP / DURATION MATCHING *** + */ + +typedef struct +{ + guint64 diff; + guint count; + GstClockTime expected; +} +TimeDurTest; + +static GParamSpec * +timedur_get_spec (const GstTestInfo * info, gboolean compare_value) +{ + if (compare_value) { + return g_param_spec_int64 ("allowed-timestamp-deviation", + "allowed timestamp deviation", + "allowed average difference in usec between timestamp of next buffer " + "and expected timestamp from analyzing last buffer", + -1, G_MAXINT64, -1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); + } else { + return g_param_spec_int64 ("timestamp-deviation", + "timestamp deviation", + "average difference in usec between timestamp of next buffer " + "and expected timestamp from analyzing last buffer", + -1, G_MAXINT64, -1, G_PARAM_READABLE); + } +} + +static gpointer +timedur_new (const GstTestInfo * info) +{ + TimeDurTest *ret = g_new0 (TimeDurTest, 1); + + ret->expected = GST_CLOCK_TIME_NONE; + + return ret; +} + +static void +timedur_add (gpointer test, GstBuffer * buffer) +{ + TimeDurTest *t = test; + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) && + GST_CLOCK_TIME_IS_VALID (t->expected)) { + t->diff += labs (GST_BUFFER_TIMESTAMP (buffer) - t->expected); + t->count++; + } + if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) && + GST_BUFFER_DURATION_IS_VALID (buffer)) { + t->expected = GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer); + } else { + t->expected = GST_CLOCK_TIME_NONE; + } +} + +static gboolean +timedur_finish (gpointer test, GValue * value) +{ + TimeDurTest *t = test; + + if (g_value_get_int64 (value) == -1) + return TRUE; + + return (t->diff / MAX (1, t->count)) <= g_value_get_int64 (value); +} + +static void +timedur_get_value (gpointer test, GValue * value) +{ + TimeDurTest *t = test; + + g_value_set_int64 (value, t ? (t->diff / MAX (1, t->count)) : -1); +} + +/* + *** MD5 *** + */ + +static GParamSpec * +md5_get_spec (const GstTestInfo * info, gboolean compare_value) +{ + if (compare_value) { + return g_param_spec_string ("expected-md5", "expected md5", + "expected md5 of processing the whole data", + "---", G_PARAM_READWRITE | G_PARAM_CONSTRUCT); + } else { + return g_param_spec_string ("md5", "md5", + "md5 of processing the whole data", "---", G_PARAM_READABLE); + } +} + +static gpointer +md5_new (const GstTestInfo * info) +{ + return g_checksum_new (G_CHECKSUM_MD5); +} + +static void +md5_add (gpointer checksum, GstBuffer * buffer) +{ + g_checksum_update (checksum, GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); +} + +static gboolean +md5_finish (gpointer checksum, GValue * value) +{ + const gchar *expected, *result; + + expected = g_value_get_string (value); + result = g_checksum_get_string (checksum); + + if (g_str_equal (expected, "---")) + return TRUE; + if (g_str_equal (expected, result)) + return TRUE; + return FALSE; +} + +static void +md5_get_value (gpointer checksum, GValue * value) +{ + if (!checksum) { + g_value_set_string (value, "---"); + } else { + g_value_set_string (value, g_checksum_get_string (checksum)); + } +} + +static void +md5_free (gpointer checksum) +{ + g_checksum_free (checksum); +} + +/* + *** TESTINFO *** + */ + +const GstTestInfo tests[] = { + {length_get_spec, length_new, length_add, + length_finish, length_get_value, g_free}, + {buffer_count_get_spec, length_new, buffer_count_add, + length_finish, length_get_value, g_free}, + {timedur_get_spec, timedur_new, timedur_add, + timedur_finish, timedur_get_value, g_free}, + {md5_get_spec, md5_new, md5_add, + md5_finish, md5_get_value, md5_free} +}; diff --git a/gst/debugutils/tests.h b/gst/debugutils/tests.h new file mode 100644 index 0000000..9926af6 --- /dev/null +++ b/gst/debugutils/tests.h @@ -0,0 +1,43 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * 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 + +#ifndef __GST_TESTS_H__ +#define __GST_TESTS_H__ + + +typedef struct _GstTestInfo GstTestInfo; + +struct _GstTestInfo +{ + GParamSpec *(*get_spec) (const GstTestInfo * info, gboolean compare_value); + gpointer (*new) (const GstTestInfo * info); + void (*add) (gpointer test, GstBuffer * buffer); + gboolean (*finish) (gpointer test, GValue * value); + void (*get_value) (gpointer test, GValue * value); + void (*free) (gpointer test); +}; + +extern const GstTestInfo tests[]; +/* keep up to date! */ +#define TESTS_COUNT (4) + + +#endif /* __GST_TESTS_H__ */ diff --git a/gst/deinterlace/Makefile.am b/gst/deinterlace/Makefile.am new file mode 100644 index 0000000..fcadae9 --- /dev/null +++ b/gst/deinterlace/Makefile.am @@ -0,0 +1,68 @@ +plugin_LTLIBRARIES = libgstdeinterlace.la + +ORC_SOURCE=tvtime +include $(top_srcdir)/common/orc.mak + +libgstdeinterlace_la_SOURCES = \ + gstdeinterlace.c \ + gstdeinterlacemethod.c \ + tvtime/tomsmocomp.c \ + tvtime/greedy.c \ + tvtime/greedyh.c \ + tvtime/vfir.c \ + tvtime/weavetff.c \ + tvtime/weavebff.c \ + tvtime/weave.c \ + tvtime/linear.c \ + tvtime/linearblend.c \ + tvtime/scalerbob.c +nodist_libgstdeinterlace_la_SOURCES = $(ORC_NODIST_SOURCES) + +libgstdeinterlace_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) +libgstdeinterlace_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) +libgstdeinterlace_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstdeinterlace_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + gstdeinterlace.h \ + gstdeinterlacemethod.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 + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstdeinterlace -:SHARED libgstdeinterlace \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstdeinterlace_la_SOURCES) \ + $(nodist_libgstdeinterlace_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstdeinterlace_la_CFLAGS) \ + -:LDFLAGS $(libgstdeinterlace_la_LDFLAGS) \ + $(libgstdeinterlace_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/deinterlace/Makefile.in b/gst/deinterlace/Makefile.in new file mode 100644 index 0000000..885ea1c --- /dev/null +++ b/gst/deinterlace/Makefile.in @@ -0,0 +1,1051 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# This is a makefile.am fragment to build Orc code. +# +# Define ORC_SOURCE and then include this file, such as: +# +# ORC_SOURCE=gstadderorc +# include $(top_srcdir)/common/orc.mak +# +# This fragment will create tmp-orc.c and gstadderorc.h from +# gstadderorc.orc. +# +# When 'make dist' is run at the top level, or 'make orc-update' +# in a directory including this fragment, the generated source +# files will be copied to $(ORC_SOURCE)-dist.[ch]. These files +# should be checked in to git, since they are used if Orc is +# disabled. +# +# Note that this file defines BUILT_SOURCES, so any later usage +# of BUILT_SOURCES in the Makefile.am that includes this file +# must use '+='. +# + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/common/orc.mak +subdir = gst/deinterlace +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstdeinterlace_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstdeinterlace_la_OBJECTS = \ + libgstdeinterlace_la-gstdeinterlace.lo \ + libgstdeinterlace_la-gstdeinterlacemethod.lo \ + libgstdeinterlace_la-tomsmocomp.lo \ + libgstdeinterlace_la-greedy.lo libgstdeinterlace_la-greedyh.lo \ + libgstdeinterlace_la-vfir.lo libgstdeinterlace_la-weavetff.lo \ + libgstdeinterlace_la-weavebff.lo libgstdeinterlace_la-weave.lo \ + libgstdeinterlace_la-linear.lo \ + libgstdeinterlace_la-linearblend.lo \ + libgstdeinterlace_la-scalerbob.lo +am__objects_1 = libgstdeinterlace_la-tmp-orc.lo +nodist_libgstdeinterlace_la_OBJECTS = $(am__objects_1) +libgstdeinterlace_la_OBJECTS = $(am_libgstdeinterlace_la_OBJECTS) \ + $(nodist_libgstdeinterlace_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstdeinterlace_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) \ + $(libgstdeinterlace_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstdeinterlace_la_SOURCES) \ + $(nodist_libgstdeinterlace_la_SOURCES) +DIST_SOURCES = $(libgstdeinterlace_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstdeinterlace.la +ORC_SOURCE = tvtime +EXTRA_DIST = $(ORC_SOURCE).orc +ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h +BUILT_SOURCES = tmp-orc.c $(ORC_SOURCE).h +orcc_v_gen = $(orcc_v_gen_$(V)) +orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) +orcc_v_gen_0 = @echo " ORCC $@"; +cp_v_gen = $(cp_v_gen_$(V)) +cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) +cp_v_gen_0 = @echo " CP $@"; +libgstdeinterlace_la_SOURCES = \ + gstdeinterlace.c \ + gstdeinterlacemethod.c \ + tvtime/tomsmocomp.c \ + tvtime/greedy.c \ + tvtime/greedyh.c \ + tvtime/vfir.c \ + tvtime/weavetff.c \ + tvtime/weavebff.c \ + tvtime/weave.c \ + tvtime/linear.c \ + tvtime/linearblend.c \ + tvtime/scalerbob.c + +nodist_libgstdeinterlace_la_SOURCES = $(ORC_NODIST_SOURCES) +libgstdeinterlace_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) + +libgstdeinterlace_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) + +libgstdeinterlace_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstdeinterlace_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + gstdeinterlace.h \ + gstdeinterlacemethod.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 + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/orc.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/deinterlace/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/deinterlace/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/orc.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstdeinterlace.la: $(libgstdeinterlace_la_OBJECTS) $(libgstdeinterlace_la_DEPENDENCIES) $(EXTRA_libgstdeinterlace_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstdeinterlace_la_LINK) -rpath $(plugindir) $(libgstdeinterlace_la_OBJECTS) $(libgstdeinterlace_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-greedy.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-greedyh.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-gstdeinterlace.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-gstdeinterlacemethod.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-linear.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-linearblend.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-scalerbob.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-tmp-orc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-tomsmocomp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-vfir.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-weave.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-weavebff.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-weavetff.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstdeinterlace_la-gstdeinterlace.lo: gstdeinterlace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-gstdeinterlace.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-gstdeinterlace.Tpo -c -o libgstdeinterlace_la-gstdeinterlace.lo `test -f 'gstdeinterlace.c' || echo '$(srcdir)/'`gstdeinterlace.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-gstdeinterlace.Tpo $(DEPDIR)/libgstdeinterlace_la-gstdeinterlace.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdeinterlace.c' object='libgstdeinterlace_la-gstdeinterlace.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-gstdeinterlace.lo `test -f 'gstdeinterlace.c' || echo '$(srcdir)/'`gstdeinterlace.c + +libgstdeinterlace_la-gstdeinterlacemethod.lo: gstdeinterlacemethod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-gstdeinterlacemethod.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-gstdeinterlacemethod.Tpo -c -o libgstdeinterlace_la-gstdeinterlacemethod.lo `test -f 'gstdeinterlacemethod.c' || echo '$(srcdir)/'`gstdeinterlacemethod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-gstdeinterlacemethod.Tpo $(DEPDIR)/libgstdeinterlace_la-gstdeinterlacemethod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdeinterlacemethod.c' object='libgstdeinterlace_la-gstdeinterlacemethod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-gstdeinterlacemethod.lo `test -f 'gstdeinterlacemethod.c' || echo '$(srcdir)/'`gstdeinterlacemethod.c + +libgstdeinterlace_la-tomsmocomp.lo: tvtime/tomsmocomp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-tomsmocomp.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-tomsmocomp.Tpo -c -o libgstdeinterlace_la-tomsmocomp.lo `test -f 'tvtime/tomsmocomp.c' || echo '$(srcdir)/'`tvtime/tomsmocomp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-tomsmocomp.Tpo $(DEPDIR)/libgstdeinterlace_la-tomsmocomp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/tomsmocomp.c' object='libgstdeinterlace_la-tomsmocomp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-tomsmocomp.lo `test -f 'tvtime/tomsmocomp.c' || echo '$(srcdir)/'`tvtime/tomsmocomp.c + +libgstdeinterlace_la-greedy.lo: tvtime/greedy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-greedy.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-greedy.Tpo -c -o libgstdeinterlace_la-greedy.lo `test -f 'tvtime/greedy.c' || echo '$(srcdir)/'`tvtime/greedy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-greedy.Tpo $(DEPDIR)/libgstdeinterlace_la-greedy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/greedy.c' object='libgstdeinterlace_la-greedy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-greedy.lo `test -f 'tvtime/greedy.c' || echo '$(srcdir)/'`tvtime/greedy.c + +libgstdeinterlace_la-greedyh.lo: tvtime/greedyh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-greedyh.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-greedyh.Tpo -c -o libgstdeinterlace_la-greedyh.lo `test -f 'tvtime/greedyh.c' || echo '$(srcdir)/'`tvtime/greedyh.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-greedyh.Tpo $(DEPDIR)/libgstdeinterlace_la-greedyh.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/greedyh.c' object='libgstdeinterlace_la-greedyh.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-greedyh.lo `test -f 'tvtime/greedyh.c' || echo '$(srcdir)/'`tvtime/greedyh.c + +libgstdeinterlace_la-vfir.lo: tvtime/vfir.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-vfir.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-vfir.Tpo -c -o libgstdeinterlace_la-vfir.lo `test -f 'tvtime/vfir.c' || echo '$(srcdir)/'`tvtime/vfir.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-vfir.Tpo $(DEPDIR)/libgstdeinterlace_la-vfir.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/vfir.c' object='libgstdeinterlace_la-vfir.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-vfir.lo `test -f 'tvtime/vfir.c' || echo '$(srcdir)/'`tvtime/vfir.c + +libgstdeinterlace_la-weavetff.lo: tvtime/weavetff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-weavetff.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-weavetff.Tpo -c -o libgstdeinterlace_la-weavetff.lo `test -f 'tvtime/weavetff.c' || echo '$(srcdir)/'`tvtime/weavetff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-weavetff.Tpo $(DEPDIR)/libgstdeinterlace_la-weavetff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/weavetff.c' object='libgstdeinterlace_la-weavetff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-weavetff.lo `test -f 'tvtime/weavetff.c' || echo '$(srcdir)/'`tvtime/weavetff.c + +libgstdeinterlace_la-weavebff.lo: tvtime/weavebff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-weavebff.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-weavebff.Tpo -c -o libgstdeinterlace_la-weavebff.lo `test -f 'tvtime/weavebff.c' || echo '$(srcdir)/'`tvtime/weavebff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-weavebff.Tpo $(DEPDIR)/libgstdeinterlace_la-weavebff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/weavebff.c' object='libgstdeinterlace_la-weavebff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-weavebff.lo `test -f 'tvtime/weavebff.c' || echo '$(srcdir)/'`tvtime/weavebff.c + +libgstdeinterlace_la-weave.lo: tvtime/weave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-weave.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-weave.Tpo -c -o libgstdeinterlace_la-weave.lo `test -f 'tvtime/weave.c' || echo '$(srcdir)/'`tvtime/weave.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-weave.Tpo $(DEPDIR)/libgstdeinterlace_la-weave.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/weave.c' object='libgstdeinterlace_la-weave.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-weave.lo `test -f 'tvtime/weave.c' || echo '$(srcdir)/'`tvtime/weave.c + +libgstdeinterlace_la-linear.lo: tvtime/linear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-linear.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-linear.Tpo -c -o libgstdeinterlace_la-linear.lo `test -f 'tvtime/linear.c' || echo '$(srcdir)/'`tvtime/linear.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-linear.Tpo $(DEPDIR)/libgstdeinterlace_la-linear.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/linear.c' object='libgstdeinterlace_la-linear.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-linear.lo `test -f 'tvtime/linear.c' || echo '$(srcdir)/'`tvtime/linear.c + +libgstdeinterlace_la-linearblend.lo: tvtime/linearblend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-linearblend.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-linearblend.Tpo -c -o libgstdeinterlace_la-linearblend.lo `test -f 'tvtime/linearblend.c' || echo '$(srcdir)/'`tvtime/linearblend.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-linearblend.Tpo $(DEPDIR)/libgstdeinterlace_la-linearblend.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/linearblend.c' object='libgstdeinterlace_la-linearblend.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-linearblend.lo `test -f 'tvtime/linearblend.c' || echo '$(srcdir)/'`tvtime/linearblend.c + +libgstdeinterlace_la-scalerbob.lo: tvtime/scalerbob.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-scalerbob.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-scalerbob.Tpo -c -o libgstdeinterlace_la-scalerbob.lo `test -f 'tvtime/scalerbob.c' || echo '$(srcdir)/'`tvtime/scalerbob.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-scalerbob.Tpo $(DEPDIR)/libgstdeinterlace_la-scalerbob.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/scalerbob.c' object='libgstdeinterlace_la-scalerbob.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-scalerbob.lo `test -f 'tvtime/scalerbob.c' || echo '$(srcdir)/'`tvtime/scalerbob.c + +libgstdeinterlace_la-tmp-orc.lo: tmp-orc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-tmp-orc.Tpo -c -o libgstdeinterlace_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-tmp-orc.Tpo $(DEPDIR)/libgstdeinterlace_la-tmp-orc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tmp-orc.c' object='libgstdeinterlace_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local \ + clean-pluginLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-local clean-pluginLTLIBRARIES ctags \ + dist-hook distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pluginLTLIBRARIES install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-pluginLTLIBRARIES + + +orc-update: tmp-orc.c $(ORC_SOURCE).h + $(top_srcdir)/common/gst-indent tmp-orc.c + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h + +@HAVE_ORCC_TRUE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --implementation --include glib.h -o tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc + +@HAVE_ORCC_TRUE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --header --include glib.h -o $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_FALSE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c +@HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c + +@HAVE_ORCC_FALSE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c +@HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h + +clean-local: clean-orc +.PHONY: clean-orc +clean-orc: + rm -f tmp-orc.c $(ORC_SOURCE).h + +dist-hook: dist-hook-orc +.PHONY: dist-hook-orc + +# we try and copy updated orc -dist files below, but don't fail if it +# doesn't work as the srcdir might not be writable +dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h + $(top_srcdir)/common/gst-indent tmp-orc.c + rm -f tmp-orc.c~ + cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || true + cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || true + cp -p tmp-orc.c $(distdir)/$(ORC_SOURCE)-dist.c + cp -p $(ORC_SOURCE).h $(distdir)/$(ORC_SOURCE)-dist.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstdeinterlace -:SHARED libgstdeinterlace \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstdeinterlace_la_SOURCES) \ + $(nodist_libgstdeinterlace_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstdeinterlace_la_CFLAGS) \ + -:LDFLAGS $(libgstdeinterlace_la_LDFLAGS) \ + $(libgstdeinterlace_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/deinterlace/gstdeinterlace.c b/gst/deinterlace/gstdeinterlace.c new file mode 100644 index 0000000..a79b836 --- /dev/null +++ b/gst/deinterlace/gstdeinterlace.c @@ -0,0 +1,2695 @@ +/* + * GStreamer + * Copyright (C) 2005 Martin Eikermann + * Copyright (C) 2008-2010 Sebastian Dröge + * Copyright (C) 2011 Robert Swain + * + * 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-deinterlace + * + * deinterlace deinterlaces interlaced video frames to progressive video frames. + * For this different algorithms can be selected which will be described later. + * + * + * Example launch line + * |[ + * gst-launch -v filesrc location=/path/to/file ! decodebin2 ! ffmpegcolorspace ! deinterlace ! ffmpegcolorspace ! autovideosink + * ]| This pipeline deinterlaces a video file with the default deinterlacing options. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstdeinterlace.h" +#include "tvtime/plugins.h" + +#include + +#if HAVE_ORC +#include +#endif + +GST_DEBUG_CATEGORY_STATIC (deinterlace_debug); +#define GST_CAT_DEFAULT (deinterlace_debug) + +/* Properties */ + +#define DEFAULT_MODE GST_DEINTERLACE_MODE_AUTO +#define DEFAULT_METHOD GST_DEINTERLACE_LINEAR +#define DEFAULT_FIELDS GST_DEINTERLACE_ALL +#define DEFAULT_FIELD_LAYOUT GST_DEINTERLACE_LAYOUT_AUTO +#define DEFAULT_LOCKING GST_DEINTERLACE_LOCKING_NONE +#define DEFAULT_IGNORE_OBSCURE TRUE +#define DEFAULT_DROP_ORPHANS TRUE + +enum +{ + PROP_0, + PROP_MODE, + PROP_METHOD, + PROP_FIELDS, + PROP_FIELD_LAYOUT, + PROP_LOCKING, + PROP_IGNORE_OBSCURE, + PROP_DROP_ORPHANS, + PROP_LAST +}; + +#define GST_DEINTERLACE_BUFFER_STATE_P (1<<0) +#define GST_DEINTERLACE_BUFFER_STATE_I (1<<1) +#define GST_DEINTERLACE_BUFFER_STATE_TC_B (1<<2) +#define GST_DEINTERLACE_BUFFER_STATE_TC_T (1<<3) +#define GST_DEINTERLACE_BUFFER_STATE_TC_P (1<<4) +#define GST_DEINTERLACE_BUFFER_STATE_TC_M (1<<5) +#define GST_DEINTERLACE_BUFFER_STATE_DROP (1<<6) + +#define GST_ONE \ + (GST_DEINTERLACE_BUFFER_STATE_TC_T | GST_DEINTERLACE_BUFFER_STATE_TC_B) +#define GST_PRG \ + (GST_DEINTERLACE_BUFFER_STATE_P | GST_DEINTERLACE_BUFFER_STATE_TC_P) +#define GST_INT \ + (GST_DEINTERLACE_BUFFER_STATE_I | GST_DEINTERLACE_BUFFER_STATE_TC_M) +#define GST_DRP (GST_DEINTERLACE_BUFFER_STATE_DROP) + +#define GST_DEINTERLACE_OBSCURE_THRESHOLD 5 + +static const TelecinePattern telecine_patterns[] = { + /* 60i -> 60p or 50i -> 50p (NOTE THE WEIRD RATIOS) */ + {"1:1", 1, 2, 1, {GST_ONE,}}, + /* 60i -> 30p or 50i -> 25p */ + {"2:2", 1, 1, 1, {GST_INT,}}, + /* 60i telecine -> 24p */ + {"2:3", 5, 4, 5, {GST_PRG, GST_PRG, GST_ONE, GST_ONE, GST_PRG,}}, + {"3:2:2:3", 5, 4, 5, {GST_PRG, GST_ONE, GST_INT, GST_ONE, GST_PRG,}}, + {"2:3:3:2", 5, 4, 5, {GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_PRG,}}, + + /* The following patterns are obscure and are ignored if ignore-obscure is + * set to true. If any patterns are added above this line, check and edit + * GST_DEINTERLACE_OBSCURE_THRESHOLD */ + + /* 50i Euro pulldown -> 24p */ + {"2-11:3", 25, 24, 25, {GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, + GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, + GST_PRG, GST_PRG, GST_ONE, GST_INT, GST_INT, + GST_INT, GST_INT, GST_INT, GST_INT, GST_INT, + GST_INT, GST_INT, GST_INT, GST_ONE, GST_PRG,}}, + /* 60i (NTSC 30000/1001) -> 16p (16000/1001) */ + {"3:4-3", 15, 8, 15, {GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG, + GST_DRP, GST_PRG, GST_DRP, GST_PRG, GST_DRP, + GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG,}}, + /* 50i (PAL) -> 16p */ + {"3-7:4", 25, 16, 25, {GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP, + GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_PRG, + GST_DRP, GST_PRG, GST_DRP, GST_PRG, GST_PRG, + GST_DRP, GST_PRG, GST_PRG, GST_DRP, GST_PRG, + GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP,}}, + /* NTSC 60i -> 18p */ + {"3:3:4", 5, 3, 5, {GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG,}}, + /* NTSC 60i -> 20p */ + {"3:3", 3, 2, 3, {GST_PRG, GST_DRP, GST_PRG,}}, + /* NTSC 60i -> 27.5 */ + {"3:2-4", 11, 10, 11, {GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, + GST_PRG, GST_ONE, GST_INT, GST_INT, GST_INT, + GST_ONE,}}, + /* PAL 50i -> 27.5 */ + {"1:2-4", 9, 9, 10, {GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_INT, + GST_INT, GST_INT, GST_INT, GST_INT,}}, +}; + +static const GEnumValue methods_types[] = { + {GST_DEINTERLACE_TOMSMOCOMP, "Motion Adaptive: Motion Search", + "tomsmocomp"}, + {GST_DEINTERLACE_GREEDY_H, "Motion Adaptive: Advanced Detection", + "greedyh"}, + {GST_DEINTERLACE_GREEDY_L, "Motion Adaptive: Simple Detection", "greedyl"}, + {GST_DEINTERLACE_VFIR, "Blur Vertical", "vfir"}, + {GST_DEINTERLACE_LINEAR, "Television: Full resolution", "linear"}, + {GST_DEINTERLACE_LINEAR_BLEND, "Blur: Temporal (Do Not Use)", + "linearblend"}, + {GST_DEINTERLACE_SCALER_BOB, "Double lines", "scalerbob"}, + {GST_DEINTERLACE_WEAVE, "Weave (Do Not Use)", "weave"}, + {GST_DEINTERLACE_WEAVE_TFF, "Progressive: Top Field First (Do Not Use)", + "weavetff"}, + {GST_DEINTERLACE_WEAVE_BFF, "Progressive: Bottom Field First (Do Not Use)", + "weavebff"}, + {0, NULL, NULL}, +}; + +static const GEnumValue locking_types[] = { + {GST_DEINTERLACE_LOCKING_NONE, + "No pattern locking", "none"}, + {GST_DEINTERLACE_LOCKING_AUTO, + "Choose passive/active locking depending on whether upstream is live", + "auto"}, + {GST_DEINTERLACE_LOCKING_ACTIVE, + "Block until pattern-locked. Use accurate timestamp interpolation within a pattern repeat.", + "active"}, + {GST_DEINTERLACE_LOCKING_PASSIVE, + "Do not block. Use naïve timestamp adjustment until pattern-locked based on state history.", + "passive"}, + {0, NULL, NULL}, +}; + + +#define GST_TYPE_DEINTERLACE_METHODS (gst_deinterlace_methods_get_type ()) +static GType +gst_deinterlace_methods_get_type (void) +{ + static GType deinterlace_methods_type = 0; + + if (!deinterlace_methods_type) { + deinterlace_methods_type = + g_enum_register_static ("GstDeinterlaceMethods", methods_types); + } + return deinterlace_methods_type; +} + +#define GST_TYPE_DEINTERLACE_FIELDS (gst_deinterlace_fields_get_type ()) +static GType +gst_deinterlace_fields_get_type (void) +{ + static GType deinterlace_fields_type = 0; + + static const GEnumValue fields_types[] = { + {GST_DEINTERLACE_ALL, "All fields", "all"}, + {GST_DEINTERLACE_TF, "Top fields only", "top"}, + {GST_DEINTERLACE_BF, "Bottom fields only", "bottom"}, + {0, NULL, NULL}, + }; + + if (!deinterlace_fields_type) { + deinterlace_fields_type = + g_enum_register_static ("GstDeinterlaceFields", fields_types); + } + return deinterlace_fields_type; +} + +#define GST_TYPE_DEINTERLACE_FIELD_LAYOUT (gst_deinterlace_field_layout_get_type ()) +static GType +gst_deinterlace_field_layout_get_type (void) +{ + static GType deinterlace_field_layout_type = 0; + + static const GEnumValue field_layout_types[] = { + {GST_DEINTERLACE_LAYOUT_AUTO, "Auto detection", "auto"}, + {GST_DEINTERLACE_LAYOUT_TFF, "Top field first", "tff"}, + {GST_DEINTERLACE_LAYOUT_BFF, "Bottom field first", "bff"}, + {0, NULL, NULL}, + }; + + if (!deinterlace_field_layout_type) { + deinterlace_field_layout_type = + g_enum_register_static ("GstDeinterlaceFieldLayout", + field_layout_types); + } + return deinterlace_field_layout_type; +} + +#define GST_TYPE_DEINTERLACE_MODES (gst_deinterlace_modes_get_type ()) +static GType +gst_deinterlace_modes_get_type (void) +{ + static GType deinterlace_modes_type = 0; + + static const GEnumValue modes_types[] = { + {GST_DEINTERLACE_MODE_AUTO, "Auto detection", "auto"}, + {GST_DEINTERLACE_MODE_INTERLACED, "Force deinterlacing", "interlaced"}, + {GST_DEINTERLACE_MODE_DISABLED, "Run in passthrough mode", "disabled"}, + {0, NULL, NULL}, + }; + + if (!deinterlace_modes_type) { + deinterlace_modes_type = + g_enum_register_static ("GstDeinterlaceModes", modes_types); + } + return deinterlace_modes_type; +} + +#define GST_TYPE_DEINTERLACE_LOCKING (gst_deinterlace_locking_get_type ()) +static GType +gst_deinterlace_locking_get_type (void) +{ + static GType deinterlace_locking_type = 0; + + if (!deinterlace_locking_type) { + deinterlace_locking_type = + g_enum_register_static ("GstDeinterlaceLocking", locking_types); + } + + return deinterlace_locking_type; +} + + +#define DEINTERLACE_CAPS \ + GST_VIDEO_CAPS_YUV ("{ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }") ";" \ + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";" \ + GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";" \ + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" \ + GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx ";" \ + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR + +static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (DEINTERLACE_CAPS) + ); + +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (DEINTERLACE_CAPS) + ); + +static void gst_deinterlace_finalize (GObject * self); +static void gst_deinterlace_set_property (GObject * self, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_deinterlace_get_property (GObject * self, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_deinterlace_getcaps (GstPad * pad); +static gboolean gst_deinterlace_setcaps (GstPad * pad, GstCaps * caps); +static gboolean gst_deinterlace_sink_event (GstPad * pad, GstEvent * event); +static gboolean gst_deinterlace_sink_query (GstPad * pad, GstQuery * query); +static GstFlowReturn gst_deinterlace_chain (GstPad * pad, GstBuffer * buffer); +static GstFlowReturn gst_deinterlace_alloc_buffer (GstPad * pad, guint64 offset, + guint size, GstCaps * caps, GstBuffer ** buf); +static GstStateChangeReturn gst_deinterlace_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_deinterlace_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_deinterlace_src_query (GstPad * pad, GstQuery * query); +static const GstQueryType *gst_deinterlace_src_query_types (GstPad * pad); + +static GstFlowReturn gst_deinterlace_output_frame (GstDeinterlace * self, + gboolean flushing); +static void gst_deinterlace_reset (GstDeinterlace * self); +static void gst_deinterlace_update_qos (GstDeinterlace * self, + gdouble proportion, GstClockTimeDiff diff, GstClockTime time); +static void gst_deinterlace_reset_qos (GstDeinterlace * self); +static void gst_deinterlace_read_qos (GstDeinterlace * self, + gdouble * proportion, GstClockTime * time); + +static void gst_deinterlace_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_deinterlace_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 (GstDeinterlace, gst_deinterlace, GstElement, + GST_TYPE_ELEMENT, _do_init); + +static const struct +{ + GType (*get_type) (void); +} _method_types[] = { + { + gst_deinterlace_method_tomsmocomp_get_type}, { + gst_deinterlace_method_greedy_h_get_type}, { + gst_deinterlace_method_greedy_l_get_type}, { + gst_deinterlace_method_vfir_get_type}, { + gst_deinterlace_method_linear_get_type}, { + gst_deinterlace_method_linear_blend_get_type}, { + gst_deinterlace_method_scaler_bob_get_type}, { + gst_deinterlace_method_weave_get_type}, { + gst_deinterlace_method_weave_tff_get_type}, { + gst_deinterlace_method_weave_bff_get_type} +}; + +static void +gst_deinterlace_set_method (GstDeinterlace * self, GstDeinterlaceMethods method) +{ + GType method_type; + + GST_DEBUG_OBJECT (self, "Setting new method %d", method); + + if (self->method) { + if (self->method_id == method && + gst_deinterlace_method_supported (G_TYPE_FROM_INSTANCE (self->method), + self->format, self->width, self->height)) { + GST_DEBUG_OBJECT (self, "Reusing current method"); + return; + } + + gst_child_proxy_child_removed (GST_OBJECT (self), + GST_OBJECT (self->method)); + gst_object_unparent (GST_OBJECT (self->method)); + self->method = NULL; + } + + method_type = + _method_types[method].get_type != + NULL ? _method_types[method].get_type () : G_TYPE_INVALID; + if (method_type == G_TYPE_INVALID + || !gst_deinterlace_method_supported (method_type, self->format, + self->width, self->height)) { + GType tmp; + gint i; + + method_type = G_TYPE_INVALID; + + GST_WARNING_OBJECT (self, "Method doesn't support requested format"); + for (i = 0; i < G_N_ELEMENTS (_method_types); i++) { + if (_method_types[i].get_type == NULL) + continue; + tmp = _method_types[i].get_type (); + if (gst_deinterlace_method_supported (tmp, self->format, self->width, + self->height)) { + GST_DEBUG_OBJECT (self, "Using method %d", i); + method_type = tmp; + method = i; + break; + } + } + /* If we get here we must have invalid caps! */ + g_assert (method_type != G_TYPE_INVALID); + } + + self->method = g_object_new (method_type, "name", "method", NULL); + self->method_id = method; + + gst_object_set_parent (GST_OBJECT (self->method), GST_OBJECT (self)); + gst_child_proxy_child_added (GST_OBJECT (self), GST_OBJECT (self->method)); + + if (self->method) + gst_deinterlace_method_setup (self->method, self->format, self->width, + self->height); +} + +static gboolean +gst_deinterlace_clip_buffer (GstDeinterlace * self, GstBuffer * buffer) +{ + gboolean ret = TRUE; + GstClockTime start, stop; + gint64 cstart, cstop; + + GST_DEBUG_OBJECT (self, + "Clipping buffer to the current segment: %" GST_TIME_FORMAT " -- %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buffer))); + GST_DEBUG_OBJECT (self, "Current segment: %" GST_SEGMENT_FORMAT, + &self->segment); + + if (G_UNLIKELY (self->segment.format != GST_FORMAT_TIME)) + goto beach; + if (G_UNLIKELY (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer))) + goto beach; + + start = GST_BUFFER_TIMESTAMP (buffer); + stop = start + GST_BUFFER_DURATION (buffer); + + if (!(ret = gst_segment_clip (&self->segment, GST_FORMAT_TIME, + start, stop, &cstart, &cstop))) + goto beach; + + GST_BUFFER_TIMESTAMP (buffer) = cstart; + if (GST_CLOCK_TIME_IS_VALID (cstop)) + GST_BUFFER_DURATION (buffer) = cstop - cstart; + +beach: + if (ret) + GST_DEBUG_OBJECT (self, + "Clipped buffer to the current segment: %" GST_TIME_FORMAT " -- %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buffer))); + else + GST_DEBUG_OBJECT (self, "Buffer outside the current segment -- dropping"); + + return ret; +} + +static void +gst_deinterlace_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &src_templ); + gst_element_class_add_static_pad_template (element_class, &sink_templ); + + gst_element_class_set_details_simple (element_class, + "Deinterlacer", + "Filter/Effect/Video/Deinterlace", + "Deinterlace Methods ported from DScaler/TvTime", + "Martin Eikermann , " + "Sebastian Dröge "); +} + +static void +gst_deinterlace_class_init (GstDeinterlaceClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + GstElementClass *element_class = (GstElementClass *) klass; + + gobject_class->set_property = gst_deinterlace_set_property; + gobject_class->get_property = gst_deinterlace_get_property; + gobject_class->finalize = gst_deinterlace_finalize; + + /** + * GstDeinterlace: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_DEINTERLACE_MODES, + DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) + ); + + /** + * GstDeinterlace: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. + * + * + * + * + * tomsmocomp + * Motion Adaptive: Motion Search + * + * + * + * + * greedyh + * Motion Adaptive: Advanced Detection + * + * + * + * + * greedyl + * Motion Adaptive: Simple Detection + * + * + * + * + * vfir + * Blur vertical + * + * + * + * + * linear + * Linear interpolation + * + * + * + * + * linearblend + * Linear interpolation in time domain. Any motion causes significant + * ghosting, so this method should not be used. + * + * + * + * + * scalerbob + * Double lines + * + * + * + * + * weave + * Weave. Bad quality, do not use. + * + * + * + * + * weavetff + * Progressive: Top Field First. Bad quality, do not use. + * + * + * + * + * weavebff + * Progressive: Bottom Field First. Bad quality, do not use. + * + * + * + */ + g_object_class_install_property (gobject_class, PROP_METHOD, + g_param_spec_enum ("method", + "Method", + "Deinterlace Method", + GST_TYPE_DEINTERLACE_METHODS, + DEFAULT_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) + ); + + /** + * GstDeinterlace: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_DEINTERLACE_FIELDS, + DEFAULT_FIELDS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) + ); + + /** + * GstDeinterlace: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_DEINTERLACE_FIELD_LAYOUT, + DEFAULT_FIELD_LAYOUT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) + ); + + /** + * GstDeinterlace:locking + * + * This selects which approach to pattern locking is used which affects + * processing latency and accuracy of timestamp adjustment for telecine + * streams. + * + * Since: 0.10.31 + * + */ + g_object_class_install_property (gobject_class, PROP_LOCKING, + g_param_spec_enum ("locking", "locking", "Pattern locking mode", + GST_TYPE_DEINTERLACE_LOCKING, DEFAULT_LOCKING, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstDeinterlace:ignore-obscure + * + * This selects whether to ignore obscure/rare telecine patterns. + * NTSC 2:3 pulldown variants are the only really common patterns. + * + * Since: 0.10.31 + * + */ + g_object_class_install_property (gobject_class, PROP_IGNORE_OBSCURE, + g_param_spec_boolean ("ignore-obscure", "ignore-obscure", + "Ignore obscure telecine patterns (only consider P, I and 2:3 " + "variants).", DEFAULT_IGNORE_OBSCURE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstDeinterlace:drop-orphans + * + * This selects whether to drop orphan fields at the beginning of telecine + * patterns in active locking mode. + * + * Since: 0.10.31 + * + */ + g_object_class_install_property (gobject_class, PROP_DROP_ORPHANS, + g_param_spec_boolean ("drop-orphans", "drop-orphans", + "Drop orphan fields at the beginning of telecine patterns in " + "active locking mode.", DEFAULT_DROP_ORPHANS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + element_class->change_state = + GST_DEBUG_FUNCPTR (gst_deinterlace_change_state); +} + +static GstObject * +gst_deinterlace_child_proxy_get_child_by_index (GstChildProxy * child_proxy, + guint index) +{ + GstDeinterlace *self = GST_DEINTERLACE (child_proxy); + + g_return_val_if_fail (index == 0, NULL); + + return gst_object_ref (self->method); +} + +static guint +gst_deinterlace_child_proxy_get_children_count (GstChildProxy * child_proxy) +{ + GstDeinterlace *self = GST_DEINTERLACE (child_proxy); + + return ((self->method) ? 1 : 0); +} + +static void +gst_deinterlace_child_proxy_interface_init (gpointer g_iface, + gpointer iface_data) +{ + GstChildProxyInterface *iface = g_iface; + + iface->get_child_by_index = gst_deinterlace_child_proxy_get_child_by_index; + iface->get_children_count = gst_deinterlace_child_proxy_get_children_count; +} + +static void +gst_deinterlace_init (GstDeinterlace * self, GstDeinterlaceClass * klass) +{ + self->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink"); + gst_pad_set_chain_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_chain)); + gst_pad_set_event_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_sink_event)); + gst_pad_set_setcaps_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_setcaps)); + gst_pad_set_getcaps_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_getcaps)); + gst_pad_set_query_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_sink_query)); + gst_pad_set_bufferalloc_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_alloc_buffer)); + 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_deinterlace_src_event)); + gst_pad_set_query_type_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_src_query_types)); + gst_pad_set_query_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_src_query)); + gst_pad_set_getcaps_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_deinterlace_getcaps)); + gst_element_add_pad (GST_ELEMENT (self), self->srcpad); + + self->mode = DEFAULT_MODE; + self->user_set_method_id = DEFAULT_METHOD; + gst_deinterlace_set_method (self, self->user_set_method_id); + self->fields = DEFAULT_FIELDS; + self->field_layout = DEFAULT_FIELD_LAYOUT; + self->locking = DEFAULT_LOCKING; + self->ignore_obscure = DEFAULT_IGNORE_OBSCURE; + self->drop_orphans = DEFAULT_DROP_ORPHANS; + + self->low_latency = -1; + self->pattern = -1; + self->pattern_phase = -1; + self->pattern_count = 0; + self->output_count = 0; + self->pattern_base_ts = GST_CLOCK_TIME_NONE; + self->pattern_buf_dur = GST_CLOCK_TIME_NONE; + self->still_frame_mode = FALSE; + + gst_deinterlace_reset (self); +} + +static void +gst_deinterlace_reset_history (GstDeinterlace * self, gboolean drop_all) +{ + gint i; + + if (!drop_all) { + GST_DEBUG_OBJECT (self, "Flushing history (count %d)", self->history_count); + while (self->history_count > 0) { + if (gst_deinterlace_output_frame (self, TRUE) != GST_FLOW_OK) { + /* Encountered error, or flushing -> skip and drop all remaining */ + drop_all = TRUE; + break; + } + } + } + if (drop_all) { + GST_DEBUG_OBJECT (self, "Resetting history (count %d)", + self->history_count); + + 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, + GST_DEINTERLACE_MAX_FIELD_HISTORY * sizeof (GstDeinterlaceField)); + self->history_count = 0; + memset (self->buf_states, 0, + GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY * + sizeof (GstDeinterlaceBufferState)); + self->state_count = 0; + self->pattern_lock = FALSE; + self->pattern_refresh = TRUE; + self->cur_field_idx = -1; + + if (!self->still_frame_mode && self->last_buffer) { + gst_buffer_unref (self->last_buffer); + self->last_buffer = NULL; + } +} + +static void +gst_deinterlace_update_passthrough (GstDeinterlace * self) +{ + self->passthrough = (self->mode == GST_DEINTERLACE_MODE_DISABLED + || (!self->interlaced && self->mode != GST_DEINTERLACE_MODE_INTERLACED)); + GST_DEBUG_OBJECT (self, "Passthrough: %d", self->passthrough); +} + +static void +gst_deinterlace_reset (GstDeinterlace * self) +{ + GST_DEBUG_OBJECT (self, "Resetting internal state"); + + self->format = GST_VIDEO_FORMAT_UNKNOWN; + self->width = 0; + self->height = 0; + self->frame_size = 0; + self->fps_n = self->fps_d = 0; + self->passthrough = FALSE; + + self->reconfigure = FALSE; + if (self->new_mode != -1) + self->mode = self->new_mode; + if (self->new_fields != -1) + self->fields = self->new_fields; + self->new_mode = -1; + self->new_fields = -1; + + gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); + + if (self->request_caps) + gst_caps_unref (self->request_caps); + self->request_caps = NULL; + + gst_deinterlace_reset_history (self, TRUE); + + gst_deinterlace_reset_qos (self); + + self->need_more = FALSE; + self->have_eos = FALSE; +} + +static void +gst_deinterlace_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstDeinterlace *self; + + g_return_if_fail (GST_IS_DEINTERLACE (object)); + self = GST_DEINTERLACE (object); + + switch (prop_id) { + case PROP_MODE:{ + gint new_mode; + + GST_OBJECT_LOCK (self); + new_mode = g_value_get_enum (value); + if (self->mode != new_mode && GST_PAD_CAPS (self->srcpad)) { + self->reconfigure = TRUE; + self->new_mode = new_mode; + } else { + self->mode = new_mode; + gst_deinterlace_update_passthrough (self); + } + GST_OBJECT_UNLOCK (self); + break; + } + case PROP_METHOD: + self->user_set_method_id = g_value_get_enum (value); + gst_deinterlace_set_method (self, self->user_set_method_id); + break; + case PROP_FIELDS:{ + gint new_fields; + + GST_OBJECT_LOCK (self); + new_fields = g_value_get_enum (value); + if (self->fields != new_fields && GST_PAD_CAPS (self->srcpad)) { + self->reconfigure = TRUE; + self->new_fields = new_fields; + } else { + self->fields = new_fields; + } + GST_OBJECT_UNLOCK (self); + break; + } + case PROP_FIELD_LAYOUT: + self->field_layout = g_value_get_enum (value); + break; + case PROP_LOCKING: + self->locking = g_value_get_enum (value); + break; + case PROP_IGNORE_OBSCURE: + self->ignore_obscure = g_value_get_boolean (value); + break; + case PROP_DROP_ORPHANS: + self->drop_orphans = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec); + } + +} + +static void +gst_deinterlace_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstDeinterlace *self; + + g_return_if_fail (GST_IS_DEINTERLACE (object)); + self = GST_DEINTERLACE (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, self->mode); + break; + case PROP_METHOD: + g_value_set_enum (value, self->user_set_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; + case PROP_LOCKING: + g_value_set_enum (value, self->locking); + break; + case PROP_IGNORE_OBSCURE: + g_value_set_boolean (value, self->ignore_obscure); + break; + case PROP_DROP_ORPHANS: + g_value_set_boolean (value, self->drop_orphans); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec); + } +} + +static void +gst_deinterlace_finalize (GObject * object) +{ + GstDeinterlace *self = GST_DEINTERLACE (object); + + gst_deinterlace_reset (self); + + if (self->method) { + gst_object_unparent (GST_OBJECT (self->method)); + self->method = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_deinterlace_update_pattern_timestamps (GstDeinterlace * self) +{ + gint state_idx; + if (self->low_latency) { + /* in low-latency mode the buffer state history contains old buffer + * states as well as the current one and perhaps some future ones. + * the current buffer's state is given by the number of field pairs + * rounded up, minus 1. the below is equivalent */ + state_idx = (self->history_count - 1) >> 1; + } else { + /* in high-latency mode state_count - 1 is the current buffer's state */ + state_idx = self->state_count - 1; + } + + self->pattern_base_ts = self->buf_states[state_idx].timestamp; + self->pattern_buf_dur = + (self->buf_states[state_idx].duration * + telecine_patterns[self->pattern].ratio_d) / + telecine_patterns[self->pattern].ratio_n; + GST_DEBUG_OBJECT (self, + "Starting a new pattern repeat with base ts %" GST_TIME_FORMAT + " and dur %" GST_TIME_FORMAT, GST_TIME_ARGS (self->pattern_base_ts), + GST_TIME_ARGS (self->pattern_buf_dur)); +} + +static GstBuffer * +gst_deinterlace_pop_history (GstDeinterlace * self) +{ + GstBuffer *buffer; + + g_return_val_if_fail (self->history_count > 0, NULL); + + GST_DEBUG_OBJECT (self, "Pop last history buffer -- current history size %d", + self->history_count); + + buffer = self->field_history[self->history_count - 1].buf; + + self->history_count--; + if (self->locking != GST_DEINTERLACE_LOCKING_NONE && (!self->history_count + || GST_BUFFER_DATA (buffer) != + GST_BUFFER_DATA (self->field_history[self->history_count - 1].buf))) { + if (!self->low_latency) + self->state_count--; + if (self->pattern_lock) { + self->pattern_count++; + if (self->pattern != -1 + && self->pattern_count >= telecine_patterns[self->pattern].length) { + self->pattern_count = 0; + self->output_count = 0; + gst_deinterlace_update_pattern_timestamps (self); + } + } + } + + GST_DEBUG_OBJECT (self, "Returning buffer: %p %" GST_TIME_FORMAT + " with duration %" GST_TIME_FORMAT " and size %u", buffer, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), GST_BUFFER_SIZE (buffer)); + + return buffer; +} + +typedef enum +{ + GST_DEINTERLACE_PROGRESSIVE, + GST_DEINTERLACE_INTERLACED, + GST_DEINTERLACE_TELECINE, +} GstDeinterlaceInterlacingMethod; + +static GstDeinterlaceInterlacingMethod +gst_deinterlace_get_interlacing_method (const GstCaps * caps) +{ + GstDeinterlaceInterlacingMethod method = 0; + gboolean interlaced; + + /* check interlaced cap, defaulting to FALSE */ + if (!gst_structure_get_boolean (gst_caps_get_structure (caps, 0), + "interlaced", &interlaced)) + interlaced = FALSE; + + method = + interlaced ? GST_DEINTERLACE_INTERLACED : GST_DEINTERLACE_PROGRESSIVE; + + if (method == GST_DEINTERLACE_INTERLACED) { + const gchar *temp = + gst_structure_get_string (gst_caps_get_structure (caps, 0), + "interlacing-method"); + if (temp && g_str_equal (temp, "telecine")) + method = GST_DEINTERLACE_TELECINE; + } + + return method; +} + +static void +gst_deinterlace_get_buffer_state (GstDeinterlace * self, GstBuffer * buffer, + guint8 * state, GstDeinterlaceInterlacingMethod * i_method) +{ + GstDeinterlaceInterlacingMethod interlacing_method; + + if (!(i_method || state)) + return; + + interlacing_method = + gst_deinterlace_get_interlacing_method (GST_BUFFER_CAPS (buffer)); + + if (state) { + if (interlacing_method == GST_DEINTERLACE_TELECINE) { + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_RFF)) { + *state = GST_DEINTERLACE_BUFFER_STATE_DROP; + } else if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_ONEFIELD)) { + /* tc top if tff, tc bottom otherwise */ + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_TFF)) { + *state = GST_DEINTERLACE_BUFFER_STATE_TC_T; + } else { + *state = GST_DEINTERLACE_BUFFER_STATE_TC_B; + } + } else if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_PROGRESSIVE)) { + *state = GST_DEINTERLACE_BUFFER_STATE_TC_P; + } else { + *state = GST_DEINTERLACE_BUFFER_STATE_TC_M; + } + } else { + if (interlacing_method == GST_DEINTERLACE_INTERLACED) { + *state = GST_DEINTERLACE_BUFFER_STATE_I; + } else { + *state = GST_DEINTERLACE_BUFFER_STATE_P; + } + } + } + + if (i_method) + *i_method = interlacing_method; +} + +static void +gst_deinterlace_push_history (GstDeinterlace * self, GstBuffer * buffer) +{ + int i = 1; + GstClockTime timestamp; + GstDeinterlaceFieldLayout 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; + GstDeinterlaceInterlacingMethod interlacing_method; + guint8 buf_state; + + g_return_if_fail (self->history_count < + GST_DEINTERLACE_MAX_FIELD_HISTORY - fields_to_push); + + gst_deinterlace_get_buffer_state (self, buffer, &buf_state, + &interlacing_method); + + GST_DEBUG_OBJECT (self, + "Pushing new buffer to the history: ptr %p at %" GST_TIME_FORMAT + " with duration %" GST_TIME_FORMAT + ", size %u, state %u, interlacing method %s", GST_BUFFER_DATA (buffer), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), GST_BUFFER_SIZE (buffer), + buf_state, + interlacing_method == + GST_DEINTERLACE_TELECINE ? "TC" : interlacing_method == + GST_DEINTERLACE_INTERLACED ? "I" : "P"); + + /* move up for new state */ + memmove (&self->buf_states[1], &self->buf_states[0], + (GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY - 1) * + sizeof (GstDeinterlaceBufferState)); + self->buf_states[0].state = buf_state; + self->buf_states[0].timestamp = GST_BUFFER_TIMESTAMP (buffer); + self->buf_states[0].duration = GST_BUFFER_DURATION (buffer); + if (self->state_count < GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY) + self->state_count++; + + if (buf_state == GST_DEINTERLACE_BUFFER_STATE_DROP) { + GST_DEBUG_OBJECT (self, + "Buffer contains only unneeded repeated fields, dropping and not" + "adding to field history"); + gst_buffer_unref (buffer); + return; + } + + /* telecine does not make use of repeated fields */ + if (interlacing_method == GST_DEINTERLACE_TELECINE) + repeated = FALSE; + + for (i = GST_DEINTERLACE_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_DEINTERLACE_LAYOUT_AUTO) { + if (!self->interlaced) { + GST_WARNING_OBJECT (self, "Can't detect field layout -- assuming TFF"); + field_layout = GST_DEINTERLACE_LAYOUT_TFF; + } else if (tff) { + field_layout = GST_DEINTERLACE_LAYOUT_TFF; + } else { + field_layout = GST_DEINTERLACE_LAYOUT_BFF; + } + } + + if (field_layout == GST_DEINTERLACE_LAYOUT_TFF) { + GST_DEBUG_OBJECT (self, "Top field first"); + field1 = gst_buffer_make_metadata_writable (gst_buffer_ref (buffer)); + field1_flags = PICTURE_INTERLACED_TOP; + field2 = gst_buffer_make_metadata_writable (gst_buffer_ref (buffer)); + field2_flags = PICTURE_INTERLACED_BOTTOM; + } else { + GST_DEBUG_OBJECT (self, "Bottom field first"); + field1 = gst_buffer_make_metadata_writable (gst_buffer_ref (buffer)); + field1_flags = PICTURE_INTERLACED_BOTTOM; + field2 = gst_buffer_make_metadata_writable (gst_buffer_ref (buffer)); + field2_flags = PICTURE_INTERLACED_TOP; + } + + if (interlacing_method != GST_DEINTERLACE_TELECINE) { + /* 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[2].buf = field1; + self->field_history[2].flags = field1_flags; + + self->field_history[1].buf = field2; + self->field_history[1].flags = field2_flags; + + self->field_history[0].buf = + gst_buffer_make_metadata_writable (gst_buffer_ref (field1)); + GST_BUFFER_TIMESTAMP (self->field_history[0].buf) += + 2 * self->field_duration; + self->field_history[0].flags = field1_flags; + } else if (!onefield) { + self->field_history[1].buf = field1; + self->field_history[1].flags = field1_flags; + + self->field_history[0].buf = field2; + self->field_history[0].flags = field2_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; + self->cur_field_idx += fields_to_push; + + GST_DEBUG_OBJECT (self, "Pushed buffer -- current history size %d, index %d", + self->history_count, self->cur_field_idx); + + if (self->last_buffer) + gst_buffer_unref (self->last_buffer); + self->last_buffer = buffer; +} + +static void +gst_deinterlace_update_qos (GstDeinterlace * self, gdouble proportion, + GstClockTimeDiff diff, GstClockTime timestamp) +{ + GST_DEBUG_OBJECT (self, + "Updating QoS: proportion %lf, diff %s%" GST_TIME_FORMAT ", timestamp %" + GST_TIME_FORMAT, proportion, (diff < 0) ? "-" : "", + GST_TIME_ARGS (ABS (diff)), GST_TIME_ARGS (timestamp)); + + GST_OBJECT_LOCK (self); + self->proportion = proportion; + if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { + if (G_UNLIKELY (diff > 0)) + self->earliest_time = + timestamp + 2 * diff + ((self->fields == + GST_DEINTERLACE_ALL) ? self->field_duration : 2 * + self->field_duration); + else + self->earliest_time = timestamp + diff; + } else { + self->earliest_time = GST_CLOCK_TIME_NONE; + } + GST_OBJECT_UNLOCK (self); +} + +static void +gst_deinterlace_reset_qos (GstDeinterlace * self) +{ + gst_deinterlace_update_qos (self, 0.5, 0, GST_CLOCK_TIME_NONE); +} + +static void +gst_deinterlace_read_qos (GstDeinterlace * self, gdouble * proportion, + GstClockTime * time) +{ + GST_OBJECT_LOCK (self); + *proportion = self->proportion; + *time = self->earliest_time; + GST_OBJECT_UNLOCK (self); +} + +/* Perform qos calculations before processing the next frame. Returns TRUE if + * the frame should be processed, FALSE if the frame can be dropped entirely */ +static gboolean +gst_deinterlace_do_qos (GstDeinterlace * self, GstClockTime timestamp) +{ + GstClockTime qostime, earliest_time; + gdouble proportion; + + /* no timestamp, can't do QoS => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { + GST_LOG_OBJECT (self, "invalid timestamp, can't do QoS, process frame"); + return TRUE; + } + + /* get latest QoS observation values */ + gst_deinterlace_read_qos (self, &proportion, &earliest_time); + + /* skip qos if we have no observation (yet) => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { + GST_LOG_OBJECT (self, "no observation yet, process frame"); + return TRUE; + } + + /* qos is done on running time */ + qostime = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME, + timestamp); + + /* see how our next timestamp relates to the latest qos timestamp */ + GST_LOG_OBJECT (self, "qostime %" GST_TIME_FORMAT ", earliest %" + GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); + + if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { + GST_DEBUG_OBJECT (self, "we are late, drop frame"); + return FALSE; + } + + GST_LOG_OBJECT (self, "process frame"); + return TRUE; +} + +static gboolean +gst_deinterlace_fix_timestamps (GstDeinterlace * self, + GstDeinterlaceField * field1, GstDeinterlaceField * field2) +{ + GstDeinterlaceField *field3, *field4; + GstDeinterlaceInterlacingMethod interlacing_method; + + if (self->pattern_lock && self->pattern > -1) { + /* accurate pattern-locked timestamp adjustment */ + if (!self->pattern_count) + gst_deinterlace_update_pattern_timestamps (self); + + GST_BUFFER_TIMESTAMP (field1->buf) = + self->pattern_base_ts + self->output_count * self->pattern_buf_dur; + GST_BUFFER_DURATION (field1->buf) = self->pattern_buf_dur; + self->output_count++; + } else { + /* naive (but low-latency) timestamp adjustment based on subsequent + * fields/buffers */ + if (field2 + && GST_BUFFER_DATA (field1->buf) != GST_BUFFER_DATA (field2->buf)) { + if (GST_BUFFER_TIMESTAMP (field1->buf) + + GST_BUFFER_DURATION (field1->buf) == + GST_BUFFER_TIMESTAMP (field2->buf)) { + GST_BUFFER_TIMESTAMP (field1->buf) = + GST_BUFFER_TIMESTAMP (field2->buf) = + (GST_BUFFER_TIMESTAMP (field1->buf) + + GST_BUFFER_TIMESTAMP (field2->buf)) / 2; + } else { + GST_BUFFER_TIMESTAMP (field2->buf) = GST_BUFFER_TIMESTAMP (field1->buf); + } + } + + if (self->history_count < 3) { + GST_DEBUG_OBJECT (self, "Need more fields (have %d, need 3)", + self->history_count); + return FALSE; + } + + field3 = &self->field_history[self->history_count - 3]; + interlacing_method = + gst_deinterlace_get_interlacing_method (GST_BUFFER_CAPS (field3->buf)); + if (interlacing_method == GST_DEINTERLACE_TELECINE) { + if (self->history_count < 4) { + GST_DEBUG_OBJECT (self, "Need more fields (have %d, need 4)", + self->history_count); + return FALSE; + } + + field4 = &self->field_history[self->history_count - 4]; + if (GST_BUFFER_DATA (field3->buf) != GST_BUFFER_DATA (field4->buf)) { + /* telecine fields in separate buffers */ + GST_BUFFER_TIMESTAMP (field3->buf) = + (GST_BUFFER_TIMESTAMP (field3->buf) + + GST_BUFFER_TIMESTAMP (field4->buf)) / 2; + } + } + + GST_BUFFER_DURATION (field1->buf) = + GST_BUFFER_TIMESTAMP (field3->buf) - GST_BUFFER_TIMESTAMP (field1->buf); + } + + GST_DEBUG_OBJECT (self, + "Field 1 adjusted to ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1->buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (field1->buf))); + return TRUE; +} + +static void +gst_deinterlace_get_pattern_lock (GstDeinterlace * self, gboolean * flush_one) +{ + /* loop over all possible patterns and all possible phases + * giving each a score. the highest score gets the lock */ + /* the score is calculated as the number of matched buffers in the + * sequence starting at the phase offset with those from the history + * then the longest duration pattern match is taken. if there is more than + * one pattern matching all buffers, we take the longest pattern of those. + * matches to complete patterns are preferred. if no non-trivial pattern is + * matched, trivial patterns are tested. */ + gint i, j, k, score, pattern, phase; + const gint state_count = self->state_count; + const gint n_required = self->ignore_obscure ? + GST_DEINTERLACE_OBSCURE_THRESHOLD : + GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY; + + /* set unknown pattern as this is used in logic outside this function */ + self->pattern = -1; + + /* wait for more buffers */ + if (!self->have_eos && state_count < n_required) { + GST_DEBUG_OBJECT (self, "Need more buffers in state history - %d/%d", + state_count, n_required); + return; + } + + score = pattern = phase = -1; + + /* loop over all patterns */ + for (i = 0; i < G_N_ELEMENTS (telecine_patterns); i++) { + const guint8 length = telecine_patterns[i].length; + + if (self->ignore_obscure && i >= GST_DEINTERLACE_OBSCURE_THRESHOLD) + break; + + if (state_count < length) + continue; + + /* loop over all phases */ + for (j = 0; j < length; j++) { + /* low-latency mode looks at past buffers, high latency at future buffers */ + const gint state_idx = (self->low_latency ? length : state_count) - 1; + /* loop over history, breaking on differing buffer states */ + for (k = 0; k < length && k < state_count; k++) { + const guint8 hist = self->buf_states[state_idx - k].state; + const guint8 patt = telecine_patterns[i].states[(j + k) % length]; + if (!(hist & patt)) + break; + } + + /* make complete matches more signficant */ + if (k == length) + k += GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY; + + /* take as new best pattern if the number of matched buffers is more than + * for other patterns */ + if (k > score) { + score = k; + pattern = i; + phase = j; + if (self->low_latency) { + /* state_idx + 1 is the number of buffers yet to be pushed out + * so length - state_idx - 1 is the number of old buffers in the + * pattern */ + phase = (phase + length - state_idx - 1) % length; + } + } + } + } + + GST_DEBUG_OBJECT (self, + "Final pattern match result: pa %d, ph %d, l %d, s %d", pattern, phase, + telecine_patterns[pattern].length, score); + self->pattern = pattern; + self->pattern_phase = phase; + self->pattern_count = 0; + self->output_count = 0; + self->pattern_lock = TRUE; + + /* check for the case that the first field of the pattern is an orphan */ + if (pattern > 1 + && telecine_patterns[pattern].states[phase] & (GST_ONE | GST_INT)) { + gint i = phase, field_count = 0; + guint8 state = telecine_patterns[pattern].states[i]; + + do { + if (state & GST_ONE) { + field_count++; + } else if (!(state & GST_DRP)) { + field_count += 2; + } + i++; + i %= telecine_patterns[pattern].length; + state = telecine_patterns[pattern].states[i]; + } while (!(state & GST_PRG)); + + /* if field_count is odd, we have an orphan field at the beginning of the + * sequence + * note - don't do this in low-latency mode as we are somewhere within the + * pattern already */ + if (!self->low_latency && (*flush_one = field_count & 1)) { + GST_DEBUG_OBJECT (self, "Orphan field detected at the beginning of the " + "pattern - it will be deinterlaced."); + } + } +} + +static GstFlowReturn +gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing) +{ + GstClockTime timestamp; + GstFlowReturn ret; + gint fields_required; + GstBuffer *buf, *outbuf; + GstDeinterlaceField *field1, *field2; + GstDeinterlaceInterlacingMethod interlacing_method; + guint8 buf_state; + gboolean hl_no_lock; /* indicates high latency timestamp adjustment but no pattern lock (could be ONEF or I) */ + gboolean same_buffer; /* are field1 and field2 in the same buffer? */ + gboolean flush_one; /* used for flushing one field when in high latency mode and not locked */ + TelecinePattern pattern; + guint8 phase, count; + const GstDeinterlaceLocking locking = self->locking; + +restart: + ret = GST_FLOW_OK; + fields_required = 0; + hl_no_lock = FALSE; + same_buffer = FALSE; + flush_one = FALSE; + self->need_more = FALSE; + phase = self->pattern_phase; + count = self->pattern_count; + + if (!self->history_count) { + GST_DEBUG_OBJECT (self, "History is empty, waiting for more buffers!"); + goto need_more; + } + + field1 = &self->field_history[self->history_count - 1]; + + if (locking != GST_DEINTERLACE_LOCKING_NONE) { + if (!self->state_count) { + GST_ERROR_OBJECT (self, + "BROKEN! Fields in history + no states should not happen!"); + return GST_FLOW_ERROR; + } + + gst_deinterlace_get_buffer_state (self, field1->buf, &buf_state, + &interlacing_method); + + if (self->pattern != -1) + pattern = telecine_patterns[self->pattern]; + + /* patterns 0 and 1 are interlaced, the rest are telecine */ + if (self->pattern > 1) + interlacing_method = GST_DEINTERLACE_TELECINE; + + if (self->pattern == -1 || self->pattern_refresh + || !(buf_state & pattern.states[(phase + count) % pattern.length])) { + /* no pattern, pattern refresh set or unexpected buffer state */ + self->pattern_lock = FALSE; + self->pattern_refresh = TRUE; + + /* refresh pattern lock */ + gst_deinterlace_get_pattern_lock (self, &flush_one); + + if (self->pattern != -1) { + /* locked onto a valid pattern so refresh complete */ + GST_DEBUG_OBJECT (self, "Pattern locked! %s starting at %d", + telecine_patterns[self->pattern].nick, self->pattern_phase); + self->pattern_refresh = FALSE; + } else if (!self->low_latency) { + if (!self->pattern_lock) { + goto need_more; + } else { + hl_no_lock = TRUE; + } + } + + /* setcaps on sink and src pads */ + gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad)); + + if (flush_one && self->drop_orphans) { + GST_DEBUG_OBJECT (self, "Dropping orphan first field"); + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + goto restart; + } + } + } else { + gst_deinterlace_get_buffer_state (self, field1->buf, NULL, + &interlacing_method); + } + + same_buffer = self->history_count >= 2 + && (GST_BUFFER_DATA (field1->buf) == + GST_BUFFER_DATA (self->field_history[self->history_count - 2].buf)); + + if ((flushing && self->history_count == 1) || (flush_one + && !self->drop_orphans) || (hl_no_lock && (self->history_count == 1 + || !same_buffer))) { + GST_DEBUG_OBJECT (self, "Flushing one field using linear method"); + gst_deinterlace_set_method (self, GST_DEINTERLACE_LINEAR); + fields_required = gst_deinterlace_method_get_fields_required (self->method); + } else if (interlacing_method == GST_DEINTERLACE_TELECINE + && (self->low_latency > 0 || self->pattern != -1 || (hl_no_lock + && same_buffer + && GST_BUFFER_FLAG_IS_SET (field1->buf, + GST_VIDEO_BUFFER_PROGRESSIVE)))) { + /* telecined - we reconstruct frames by weaving pairs of fields */ + fields_required = 2; + if (!flushing && self->history_count < fields_required) { + GST_DEBUG_OBJECT (self, "Need more fields (have %d, need %d)", + self->history_count, self->cur_field_idx + fields_required); + goto need_more; + } + + field2 = &self->field_history[self->history_count - 2]; + if (!gst_deinterlace_fix_timestamps (self, field1, field2) && !flushing) + goto need_more; + + if (same_buffer) { + /* telecine progressive */ + GstBuffer *field1_buf; + + GST_DEBUG_OBJECT (self, + "Frame type: Telecine Progressive; pushing buffer as a frame"); + /* pop and push */ + self->cur_field_idx--; + field1_buf = gst_deinterlace_pop_history (self); + /* field2 is the same buffer as field1, but we need to remove it from + * the history anyway */ + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + /* set the caps from the src pad on the buffer as they should be correct */ + gst_buffer_set_caps (field1_buf, GST_PAD_CAPS (self->srcpad)); + GST_DEBUG_OBJECT (self, + "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1_buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (field1_buf)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1_buf) + + GST_BUFFER_DURATION (field1_buf))); + return gst_pad_push (self->srcpad, field1_buf); + } else { + /* telecine fields in separate buffers */ + + /* check field1 and field2 buffer caps and flags are corresponding */ + if (field1->flags == field2->flags) { + /* ERROR - fields are of same parity - what should be done here? + * perhaps deinterlace the tip field and start again? */ + GST_ERROR_OBJECT (self, "Telecine mixed with fields of same parity!"); + } + GST_DEBUG_OBJECT (self, + "Frame type: Telecine Mixed; weaving tip two fields into a frame"); + /* set method to WEAVE */ + gst_deinterlace_set_method (self, GST_DEINTERLACE_WEAVE); + } + } else if (interlacing_method == GST_DEINTERLACE_INTERLACED || (hl_no_lock + && interlacing_method == GST_DEINTERLACE_TELECINE && same_buffer + && !GST_BUFFER_FLAG_IS_SET (field1->buf, + GST_VIDEO_BUFFER_PROGRESSIVE))) { + gst_deinterlace_set_method (self, self->user_set_method_id); + fields_required = gst_deinterlace_method_get_fields_required (self->method); + if (flushing && self->history_count < fields_required) { + /* note: we already checked for flushing with history count == 1 above + * so we must have 2 or more fields in here */ + gst_deinterlace_set_method (self, GST_DEINTERLACE_VFIR); + fields_required = + gst_deinterlace_method_get_fields_required (self->method); + GST_DEBUG_OBJECT (self, "Flushing field(s) using %s method", + methods_types[self->method_id].value_nick); + } + + /* Not enough fields in the history */ + if (!flushing && self->history_count < fields_required) { + GST_DEBUG_OBJECT (self, "Need more fields (have %d, need %d)", + self->history_count, self->cur_field_idx + fields_required); + goto need_more; + } + + GST_DEBUG_OBJECT (self, + "Frame type: Interlaced; deinterlacing using %s method", + methods_types[self->method_id].value_nick); + } else { + GstBuffer *field1_buf; + + /* progressive */ + fields_required = 2; + + /* Not enough fields in the history */ + if (!flushing && self->history_count < fields_required) { + GST_DEBUG_OBJECT (self, "Need more fields (have %d, need %d)", + self->history_count, self->cur_field_idx + fields_required); + goto need_more; + } + + field2 = &self->field_history[self->history_count - 2]; + if (GST_BUFFER_DATA (field1->buf) != GST_BUFFER_DATA (field2->buf)) { + /* ERROR - next two fields in field history are not one progressive buffer - weave? */ + GST_ERROR_OBJECT (self, + "Progressive buffer but two fields at tip aren't in the same buffer!"); + } + + GST_DEBUG_OBJECT (self, + "Frame type: Progressive; pushing buffer as a frame"); + /* pop and push */ + self->cur_field_idx--; + field1_buf = gst_deinterlace_pop_history (self); + /* field2 is the same buffer as field1, but we need to remove it from the + * history anyway */ + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + GST_DEBUG_OBJECT (self, + "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1_buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (field1_buf)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1_buf) + + GST_BUFFER_DURATION (field1_buf))); + return gst_pad_push (self->srcpad, field1_buf); + } + + if (!flushing && self->cur_field_idx < 1) { + goto need_more; + } + + if (self->fields == GST_DEINTERLACE_ALL + || interlacing_method == GST_DEINTERLACE_TELECINE) + GST_DEBUG_OBJECT (self, "All fields"); + else if (self->fields == GST_DEINTERLACE_TF) + GST_DEBUG_OBJECT (self, "Top fields"); + else if (self->fields == GST_DEINTERLACE_BF) + GST_DEBUG_OBJECT (self, "Bottom fields"); + + if ((self->field_history[self->cur_field_idx].flags == PICTURE_INTERLACED_TOP + && (self->fields == GST_DEINTERLACE_TF + || interlacing_method == GST_DEINTERLACE_TELECINE)) + || self->fields == GST_DEINTERLACE_ALL) { + GST_DEBUG_OBJECT (self, "deinterlacing top field"); + + /* create new buffer */ + ret = + gst_pad_alloc_buffer (self->srcpad, GST_BUFFER_OFFSET_NONE, + self->frame_size, GST_PAD_CAPS (self->srcpad), &outbuf); + if (ret != GST_FLOW_OK) + return ret; + + if (GST_PAD_CAPS (self->srcpad) != GST_BUFFER_CAPS (outbuf) && + !gst_caps_is_equal (GST_PAD_CAPS (self->srcpad), + GST_BUFFER_CAPS (outbuf))) { + gst_caps_replace (&self->request_caps, GST_BUFFER_CAPS (outbuf)); + GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT, + self->request_caps); + + gst_buffer_unref (outbuf); + outbuf = gst_buffer_try_new_and_alloc (self->frame_size); + + if (!outbuf) + return GST_FLOW_ERROR; + + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (self->srcpad)); + } + + g_return_val_if_fail (self->history_count >= + 1 + gst_deinterlace_method_get_latency (self->method), GST_FLOW_ERROR); + + buf = + self->field_history[self->history_count - 1 - + gst_deinterlace_method_get_latency (self->method)].buf; + + if (interlacing_method != GST_DEINTERLACE_TELECINE) { + timestamp = GST_BUFFER_TIMESTAMP (buf); + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + if (self->fields == GST_DEINTERLACE_ALL) + GST_BUFFER_DURATION (outbuf) = self->field_duration; + else + GST_BUFFER_DURATION (outbuf) = 2 * self->field_duration; + } else { + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); + GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); + } + + /* Check if we need to drop the frame because of QoS */ + if (!gst_deinterlace_do_qos (self, GST_BUFFER_TIMESTAMP (buf))) { + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + gst_buffer_unref (outbuf); + outbuf = NULL; + ret = GST_FLOW_OK; + } else { + if (self->cur_field_idx < 0 && flushing) { + if (self->history_count == 1) { + gst_buffer_unref (gst_deinterlace_pop_history (self)); + goto need_more; + } + self->cur_field_idx++; + } + if (self->cur_field_idx < 0) { + goto need_more; + } + if (!flushing && self->cur_field_idx < 1) { + goto need_more; + } + + /* do magic calculus */ + gst_deinterlace_method_deinterlace_frame (self->method, + self->field_history, self->history_count, outbuf, + self->cur_field_idx); + + self->cur_field_idx--; + if (self->cur_field_idx + 1 + + gst_deinterlace_method_get_latency (self->method) + < self->history_count || flushing) { + gst_buffer_unref (gst_deinterlace_pop_history (self)); + } + + if (gst_deinterlace_clip_buffer (self, outbuf)) { + GST_DEBUG_OBJECT (self, + "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf) + + GST_BUFFER_DURATION (outbuf))); + ret = gst_pad_push (self->srcpad, outbuf); + } else { + ret = GST_FLOW_OK; + gst_buffer_unref (outbuf); + } + + outbuf = NULL; + if (ret != GST_FLOW_OK) + return ret; + if (interlacing_method == GST_DEINTERLACE_TELECINE + && self->method_id == GST_DEINTERLACE_WEAVE) { + /* pop off the second field */ + GST_DEBUG_OBJECT (self, "Removing unused field (count: %d)", + self->history_count); + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + interlacing_method = GST_DEINTERLACE_INTERLACED; + return ret; + } + } + + if (flush_one && !self->drop_orphans) { + GST_DEBUG_OBJECT (self, "Orphan field deinterlaced - reconfiguring"); + goto restart; + } + } + /* no calculation done: remove excess field */ + else if (self->field_history[self->cur_field_idx].flags == + PICTURE_INTERLACED_TOP && (self->fields == GST_DEINTERLACE_BF + && interlacing_method != GST_DEINTERLACE_TELECINE)) { + GST_DEBUG_OBJECT (self, "Removing unused top field"); + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + + if (flush_one && !self->drop_orphans) { + GST_DEBUG_OBJECT (self, "Orphan field deinterlaced - reconfiguring"); + goto restart; + } + } + + if (self->history_count < fields_required) + return ret; + + if (self->cur_field_idx < 0) + return ret; + + if (!flushing && self->cur_field_idx < 1) { + return ret; + } + + /* deinterlace bottom_field */ + if ((self->field_history[self->cur_field_idx].flags == + PICTURE_INTERLACED_BOTTOM && (self->fields == GST_DEINTERLACE_BF + || interlacing_method == GST_DEINTERLACE_TELECINE)) + || self->fields == GST_DEINTERLACE_ALL) { + GST_DEBUG_OBJECT (self, "deinterlacing bottom field"); + + /* create new buffer */ + ret = + gst_pad_alloc_buffer (self->srcpad, GST_BUFFER_OFFSET_NONE, + self->frame_size, GST_PAD_CAPS (self->srcpad), &outbuf); + if (ret != GST_FLOW_OK) + return ret; + + if (GST_PAD_CAPS (self->srcpad) != GST_BUFFER_CAPS (outbuf) && + !gst_caps_is_equal (GST_PAD_CAPS (self->srcpad), + GST_BUFFER_CAPS (outbuf))) { + gst_caps_replace (&self->request_caps, GST_BUFFER_CAPS (outbuf)); + GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT, + self->request_caps); + + gst_buffer_unref (outbuf); + outbuf = gst_buffer_try_new_and_alloc (self->frame_size); + + if (!outbuf) + return GST_FLOW_ERROR; + + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (self->srcpad)); + } + + g_return_val_if_fail (self->history_count - 1 - + gst_deinterlace_method_get_latency (self->method) >= 0, GST_FLOW_ERROR); + + buf = + self->field_history[self->history_count - 1 - + gst_deinterlace_method_get_latency (self->method)].buf; + if (interlacing_method != GST_DEINTERLACE_TELECINE) { + timestamp = GST_BUFFER_TIMESTAMP (buf); + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + if (self->fields == GST_DEINTERLACE_ALL) + GST_BUFFER_DURATION (outbuf) = self->field_duration; + else + GST_BUFFER_DURATION (outbuf) = 2 * self->field_duration; + } else { + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); + GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); + } + + /* Check if we need to drop the frame because of QoS */ + if (!gst_deinterlace_do_qos (self, GST_BUFFER_TIMESTAMP (buf))) { + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + gst_buffer_unref (outbuf); + outbuf = NULL; + ret = GST_FLOW_OK; + } else { + /* do magic calculus */ + gst_deinterlace_method_deinterlace_frame (self->method, + self->field_history, self->history_count, outbuf, + self->cur_field_idx); + + self->cur_field_idx--; + if (self->cur_field_idx + 1 + + gst_deinterlace_method_get_latency (self->method) + < self->history_count) { + gst_buffer_unref (gst_deinterlace_pop_history (self)); + } + + if (gst_deinterlace_clip_buffer (self, outbuf)) { + GST_DEBUG_OBJECT (self, + "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf) + + GST_BUFFER_DURATION (outbuf))); + ret = gst_pad_push (self->srcpad, outbuf); + } else { + ret = GST_FLOW_OK; + gst_buffer_unref (outbuf); + } + + outbuf = NULL; + if (ret != GST_FLOW_OK) + return ret; + if (interlacing_method == GST_DEINTERLACE_TELECINE + && self->method_id == GST_DEINTERLACE_WEAVE) { + /* pop off the second field */ + GST_DEBUG_OBJECT (self, "Removing unused field (count: %d)", + self->history_count); + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + interlacing_method = GST_DEINTERLACE_INTERLACED; + return ret; + } + } + + if (flush_one && !self->drop_orphans) { + GST_DEBUG_OBJECT (self, "Orphan field deinterlaced - reconfiguring"); + goto restart; + } + } + /* no calculation done: remove excess field */ + else if (self->field_history[self->cur_field_idx].flags == + PICTURE_INTERLACED_BOTTOM && (self->fields == GST_DEINTERLACE_TF + && interlacing_method != GST_DEINTERLACE_TELECINE)) { + GST_DEBUG_OBJECT (self, "Removing unused bottom field"); + self->cur_field_idx--; + gst_buffer_unref (gst_deinterlace_pop_history (self)); + + if (flush_one && !self->drop_orphans) { + GST_DEBUG_OBJECT (self, "Orphan field deinterlaced - reconfiguring"); + goto restart; + } + } + + return ret; + +need_more: + self->need_more = TRUE; + return ret; +} + +static gboolean +gst_deinterlace_get_latency (GstDeinterlace * self) +{ + if (self->locking == GST_DEINTERLACE_LOCKING_AUTO) { + gboolean res; + GstQuery *query; + + query = gst_query_new_latency (); + if ((res = gst_pad_peer_query (self->sinkpad, query))) { + gboolean is_live; + /* if upstream is live, we use low-latency passive locking mode + * else high-latency active locking mode */ + gst_query_parse_latency (query, &is_live, NULL, NULL); + GST_DEBUG_OBJECT (self, "Latency query indicates stream is %s", + is_live ? "live - using passive locking" : + "not live - using active locking"); + gst_query_unref (query); + return is_live; + } else { + /* conservatively use passive locking if the query fails */ + GST_WARNING_OBJECT (self, + "Latency query failed - fall back to using passive locking"); + gst_query_unref (query); + return TRUE; + } + } else { + return self->locking - 2; + } +} + +static GstFlowReturn +gst_deinterlace_chain (GstPad * pad, GstBuffer * buf) +{ + GstDeinterlace *self = GST_DEINTERLACE (GST_PAD_PARENT (pad)); + GstFlowReturn ret = GST_FLOW_OK; + + GST_OBJECT_LOCK (self); + if (self->reconfigure) { + if (self->new_fields != -1) + self->fields = self->new_fields; + if (self->new_mode != -1) + self->mode = self->new_mode; + self->new_mode = self->new_fields = -1; + + self->reconfigure = FALSE; + GST_OBJECT_UNLOCK (self); + if (GST_PAD_CAPS (self->srcpad)) + gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad)); + } else { + GST_OBJECT_UNLOCK (self); + } + + GST_DEBUG_OBJECT (self, + "[IN] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf))); + + if (self->still_frame_mode || self->passthrough) { + GST_DEBUG_OBJECT (self, + "Frame type: Progressive?; pushing buffer using pass-through"); + GST_DEBUG_OBJECT (self, + "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf))); + + 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_deinterlace_reset_history (self, FALSE); + } + + gst_deinterlace_push_history (self, buf); + buf = NULL; + + do { + ret = gst_deinterlace_output_frame (self, FALSE); + } while (!self->need_more && self->history_count > 0 && ret == GST_FLOW_OK); + + 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_deinterlace_getcaps (GstPad * pad) +{ + GstCaps *ret; + GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); + GstPad *otherpad; + gint len; + const GstCaps *ourcaps; + GstCaps *peercaps; + + 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) { + GST_DEBUG_OBJECT (pad, "Peer has caps %" GST_PTR_FORMAT, peercaps); + ret = gst_caps_intersect (ourcaps, peercaps); + gst_caps_unref (peercaps); + } else { + ret = gst_caps_copy (ourcaps); + } + + for (len = gst_caps_get_size (ret); len > 0; len--) { + GstStructure *s = gst_caps_get_structure (ret, len - 1); + + if (pad == self->sinkpad || self->passthrough) + gst_structure_remove_field (s, "interlaced"); + else + gst_structure_set (s, "interlaced", G_TYPE_BOOLEAN, FALSE, NULL); + + if (!self->passthrough && self->fields == GST_DEINTERLACE_ALL) { + 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); + + gst_object_unref (self); + + return ret; + +error: + GST_ERROR_OBJECT (pad, "Unable to transform peer caps"); + gst_caps_unref (ret); + return NULL; +} + +static gboolean +gst_deinterlace_setcaps (GstPad * pad, GstCaps * caps) +{ + gboolean res = TRUE; + GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); + GstCaps *srccaps; + GstDeinterlaceInterlacingMethod interlacing_method; + + if (self->locking != GST_DEINTERLACE_LOCKING_NONE) { + if (self->low_latency == -1) + self->low_latency = gst_deinterlace_get_latency (self); + + if (self->pattern_lock) { + /* refresh has been successful - we have a lock now */ + self->pattern_refresh = FALSE; + } else { + /* if we were not refreshing (!pattern_refresh) the caps have changed + * so we need to refresh and we don't have a lock anymore + * otherwise we have pattern_fresh and !pattern_lock anyway */ + self->pattern_refresh = TRUE; + self->pattern_lock = FALSE; + } + } + + res = + gst_video_format_parse_caps (caps, &self->format, &self->width, + &self->height); + res &= gst_video_parse_caps_framerate (caps, &self->fps_n, &self->fps_d); + if (pad == self->sinkpad) + res &= gst_video_format_parse_caps_interlaced (caps, &self->interlaced); + if (!res) + goto invalid_caps; + + gst_deinterlace_update_passthrough (self); + + interlacing_method = gst_deinterlace_get_interlacing_method (caps); + + if (self->pattern_lock) { + srccaps = gst_caps_copy (caps); + if (self->pattern != -1 + && G_UNLIKELY (!gst_util_fraction_multiply (self->fps_n, self->fps_d, + telecine_patterns[self->pattern].ratio_n, + telecine_patterns[self->pattern].ratio_d, &self->fps_n, + &self->fps_d))) + GST_ERROR_OBJECT (self, + "Multiplying the framerate by the telecine pattern ratio overflowed!"); + gst_caps_set_simple (srccaps, "framerate", GST_TYPE_FRACTION, self->fps_n, + self->fps_d, NULL); + } else if (self->low_latency > 0) { + if (interlacing_method == GST_DEINTERLACE_TELECINE) { + /* for initial buffers of a telecine pattern, until there is a lock we + * we output naïvely adjusted timestamps */ + srccaps = gst_caps_copy (caps); + gst_caps_set_simple (srccaps, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); + } else if (!self->passthrough && self->fields == GST_DEINTERLACE_ALL) { + gint fps_n = self->fps_n, fps_d = self->fps_d; + + if (!gst_fraction_double (&fps_n, &fps_d, FALSE)) + goto invalid_caps; + + srccaps = gst_caps_copy (caps); + + gst_caps_set_simple (srccaps, "framerate", GST_TYPE_FRACTION, fps_n, + fps_d, NULL); + } else { + srccaps = gst_caps_ref (caps); + } + } else { + /* in high latency pattern locking mode if we don't have a pattern lock, + * the sink pad caps are the best we know */ + srccaps = gst_caps_ref (caps); + } + + if (self->mode != GST_DEINTERLACE_MODE_DISABLED) { + srccaps = gst_caps_make_writable (srccaps); + gst_structure_remove_field (gst_caps_get_structure (srccaps, 0), + "interlacing-method"); + gst_caps_set_simple (srccaps, "interlaced", G_TYPE_BOOLEAN, FALSE, NULL); + } + + if (!gst_pad_set_caps (self->srcpad, srccaps)) + goto caps_not_accepted; + + self->frame_size = + gst_video_format_get_size (self->format, self->width, self->height); + + if (G_LIKELY (self->fps_n != 0)) { + self->field_duration = + gst_util_uint64_scale (GST_SECOND, self->fps_d, 2 * self->fps_n); + } else { + self->field_duration = 0; + } + + gst_deinterlace_set_method (self, self->method_id); + gst_deinterlace_method_setup (self->method, self->format, self->width, + self->height); + + GST_DEBUG_OBJECT (pad, "Sink caps: %" GST_PTR_FORMAT, caps); + GST_DEBUG_OBJECT (pad, "Src caps: %" GST_PTR_FORMAT, srccaps); + + gst_caps_unref (srccaps); + +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, srccaps); + gst_caps_unref (srccaps); + goto done; +} + +static gboolean +gst_deinterlace_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); + + GST_LOG_OBJECT (pad, "received %s event: %" GST_PTR_FORMAT, + GST_EVENT_TYPE_NAME (event), event); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat fmt; + gboolean is_update; + gint64 start, end, base; + gdouble rate, applied_rate; + + gst_event_parse_new_segment_full (event, &is_update, &rate, + &applied_rate, &fmt, &start, &end, &base); + + gst_deinterlace_reset_qos (self); + gst_deinterlace_reset_history (self, FALSE); + + if (fmt == GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (pad, + "Got NEWSEGMENT event in GST_FORMAT_TIME, passing on (%" + GST_TIME_FORMAT " - %" GST_TIME_FORMAT ")", GST_TIME_ARGS (start), + GST_TIME_ARGS (end)); + gst_segment_set_newsegment_full (&self->segment, is_update, rate, + applied_rate, fmt, start, end, base); + } else { + gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); + } + + res = gst_pad_push_event (self->srcpad, event); + break; + } + case GST_EVENT_CUSTOM_DOWNSTREAM:{ + gboolean still_state; + + if (gst_video_event_parse_still_frame (event, &still_state)) { + GST_DEBUG_OBJECT (self, "Received still frame event, state %d", + still_state); + + if (still_state) { + GstFlowReturn ret; + + GST_DEBUG_OBJECT (self, "Handling still frame"); + self->still_frame_mode = TRUE; + gst_deinterlace_reset_history (self, FALSE); + if (self->last_buffer) { + ret = + gst_pad_push (self->srcpad, gst_buffer_ref (self->last_buffer)); + GST_DEBUG_OBJECT (self, "Pushed still frame, result: %s", + gst_flow_get_name (ret)); + } else { + GST_WARNING_OBJECT (self, "No pending buffer!"); + } + } else { + GST_DEBUG_OBJECT (self, "Ending still frames"); + self->still_frame_mode = FALSE; + } + } + } + /* fall through */ + case GST_EVENT_EOS: + self->have_eos = TRUE; + gst_deinterlace_reset_history (self, FALSE); + + /* fall through */ + default: + res = gst_pad_push_event (self->srcpad, event); + break; + + case GST_EVENT_FLUSH_STOP: + if (self->still_frame_mode) { + GST_DEBUG_OBJECT (self, "Ending still frames"); + self->still_frame_mode = FALSE; + } + gst_deinterlace_reset_qos (self); + res = gst_pad_push_event (self->srcpad, event); + gst_deinterlace_reset_history (self, TRUE); + break; + } + + gst_object_unref (self); + return res; +} + +static gboolean +gst_deinterlace_sink_query (GstPad * pad, GstQuery * query) +{ + GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); + gboolean res = FALSE; + + GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + default:{ + GstPad *peer = gst_pad_get_peer (self->srcpad); + + if (peer) { + res = gst_pad_query (peer, query); + gst_object_unref (peer); + } else { + res = FALSE; + } + break; + } + } + + gst_object_unref (self); + return res; +} + +static GstStateChangeReturn +gst_deinterlace_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstDeinterlace *self = GST_DEINTERLACE (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_deinterlace_reset (self); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + default: + break; + } + + return ret; +} + +static gboolean +gst_deinterlace_src_event (GstPad * pad, GstEvent * event) +{ + GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); + gboolean res; + + GST_DEBUG_OBJECT (pad, "received %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS:{ + GstClockTimeDiff diff; + GstClockTime timestamp; + gdouble proportion; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + gst_deinterlace_update_qos (self, proportion, diff, timestamp); + } + /* fall through */ + default: + res = gst_pad_push_event (self->sinkpad, event); + break; + } + + gst_object_unref (self); + + return res; +} + +static gboolean +gst_deinterlace_src_query (GstPad * pad, GstQuery * query) +{ + GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); + gboolean res = FALSE; + + GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + if (!self->passthrough) { + 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; + + 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 = FALSE; + } + break; + } + default:{ + GstPad *peer = gst_pad_get_peer (self->sinkpad); + + if (peer) { + res = gst_pad_query (peer, query); + gst_object_unref (peer); + } else { + res = FALSE; + } + break; + } + } + + gst_object_unref (self); + return res; +} + +static const GstQueryType * +gst_deinterlace_src_query_types (GstPad * pad) +{ + static const GstQueryType types[] = { + GST_QUERY_LATENCY, + GST_QUERY_NONE + }; + return types; +} + +static GstFlowReturn +gst_deinterlace_alloc_buffer (GstPad * pad, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf) +{ + GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); + GstFlowReturn ret = GST_FLOW_OK; + + *buf = NULL; + + GST_DEBUG_OBJECT (pad, "alloc with caps %" GST_PTR_FORMAT ", size %u", caps, + size); + + if (self->still_frame_mode || self->passthrough) { + ret = gst_pad_alloc_buffer (self->srcpad, offset, size, caps, buf); + } else if (G_LIKELY (!self->request_caps)) { + *buf = gst_buffer_try_new_and_alloc (size); + if (G_UNLIKELY (!*buf)) { + ret = GST_FLOW_ERROR; + } else { + gst_buffer_set_caps (*buf, caps); + GST_BUFFER_OFFSET (*buf) = offset; + } + } else { + gint width, height; + GstVideoFormat fmt; + guint new_frame_size; + GstCaps *new_caps = gst_caps_copy (self->request_caps); + + if (self->fields == GST_DEINTERLACE_ALL) { + gint n, d; + GstStructure *s = gst_caps_get_structure (new_caps, 0); + + gst_structure_get_fraction (s, "framerate", &n, &d); + + if (!gst_fraction_double (&n, &d, TRUE)) { + gst_object_unref (self); + gst_caps_unref (new_caps); + return GST_FLOW_OK; + } + + gst_structure_set (s, "framerate", GST_TYPE_FRACTION, n, d, NULL); + } + + if (G_UNLIKELY (!gst_video_format_parse_caps (new_caps, &fmt, &width, + &height))) { + gst_object_unref (self); + gst_caps_unref (new_caps); + return GST_FLOW_OK; + } + + new_frame_size = gst_video_format_get_size (fmt, width, height); + + *buf = gst_buffer_try_new_and_alloc (new_frame_size); + if (G_UNLIKELY (!*buf)) { + ret = GST_FLOW_ERROR; + } else { + gst_buffer_set_caps (*buf, new_caps); + gst_caps_unref (self->request_caps); + self->request_caps = NULL; + gst_caps_unref (new_caps); + } + } + + gst_object_unref (self); + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (deinterlace_debug, "deinterlace", 0, "Deinterlacer"); + +#if HAVE_ORC + orc_init (); +#endif + + if (!gst_element_register (plugin, "deinterlace", GST_RANK_NONE, + GST_TYPE_DEINTERLACE)) { + return FALSE; + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "deinterlace", + "Deinterlacer", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN); diff --git a/gst/deinterlace/gstdeinterlace.h b/gst/deinterlace/gstdeinterlace.h new file mode 100644 index 0000000..a5a69a3 --- /dev/null +++ b/gst/deinterlace/gstdeinterlace.h @@ -0,0 +1,200 @@ +/* + * GStreamer + * Copyright (C) 2005 Martin Eikermann + * Copyright (C) 2008-2010 Sebastian Dröge + * + * 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 +#include + +#include "gstdeinterlacemethod.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,GstDeinterlace)) +#define GST_IS_DEINTERLACE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEINTERLACE)) +#define GST_IS_DEINTERLACE_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEINTERLACE)) + +typedef struct _GstDeinterlace GstDeinterlace; +typedef struct _GstDeinterlaceClass GstDeinterlaceClass; + +typedef enum +{ + GST_DEINTERLACE_TOMSMOCOMP, + GST_DEINTERLACE_GREEDY_H, + GST_DEINTERLACE_GREEDY_L, + GST_DEINTERLACE_VFIR, + GST_DEINTERLACE_LINEAR, + GST_DEINTERLACE_LINEAR_BLEND, + GST_DEINTERLACE_SCALER_BOB, + GST_DEINTERLACE_WEAVE, + GST_DEINTERLACE_WEAVE_TFF, + GST_DEINTERLACE_WEAVE_BFF +} GstDeinterlaceMethods; + +typedef enum +{ + GST_DEINTERLACE_ALL, /* All (missing data is interp.) */ + GST_DEINTERLACE_TF, /* Top Fields Only */ + GST_DEINTERLACE_BF /* Bottom Fields Only */ +} GstDeinterlaceFields; + +typedef enum +{ + GST_DEINTERLACE_LAYOUT_AUTO, + GST_DEINTERLACE_LAYOUT_TFF, + GST_DEINTERLACE_LAYOUT_BFF +} GstDeinterlaceFieldLayout; + +typedef enum { + GST_DEINTERLACE_MODE_AUTO, + GST_DEINTERLACE_MODE_INTERLACED, + GST_DEINTERLACE_MODE_DISABLED +} GstDeinterlaceMode; + +typedef enum +{ + GST_DEINTERLACE_LOCKING_NONE, + GST_DEINTERLACE_LOCKING_AUTO, + GST_DEINTERLACE_LOCKING_ACTIVE, + GST_DEINTERLACE_LOCKING_PASSIVE, +} GstDeinterlaceLocking; + +#define GST_DEINTERLACE_MAX_FIELD_HISTORY 10 +#define GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY 50 +/* check max field history is large enough */ +#if GST_DEINTERLACE_MAX_FIELD_HISTORY < GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY * 3 +#undef GST_DEINTERLACE_MAX_FIELD_HISTORY +#define GST_DEINTERLACE_MAX_FIELD_HISTORY (GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY * 3) +#endif + +typedef struct _TelecinePattern TelecinePattern; +struct _TelecinePattern +{ + const gchar *nick; + guint8 length; + guint8 ratio_n, ratio_d; + guint8 states[GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY]; +}; + +typedef struct _GstDeinterlaceBufferState GstDeinterlaceBufferState; +struct _GstDeinterlaceBufferState +{ + GstClockTime timestamp; + GstClockTime duration; + guint8 state; +}; + +struct _GstDeinterlace +{ + GstElement parent; + + GstPad *srcpad, *sinkpad; + + /* */ + GstDeinterlaceMode mode; + + GstDeinterlaceFieldLayout field_layout; + + GstDeinterlaceFields fields; + + /* current state (differs when flushing/inverse telecine using weave) */ + GstDeinterlaceMethods method_id; + /* property value */ + GstDeinterlaceMethods user_set_method_id; + GstDeinterlaceMethod *method; + + GstVideoFormat format; + gint width, height; /* frame width & height */ + guint frame_size; /* frame size in bytes */ + gint fps_n, fps_d; /* frame rate */ + gboolean interlaced; /* is input interlaced? */ + + gboolean passthrough; + + GstClockTime field_duration; /* Duration of one field */ + + /* 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. + */ + GstDeinterlaceField field_history[GST_DEINTERLACE_MAX_FIELD_HISTORY]; + guint history_count; + int cur_field_idx; + + /* Set to TRUE if we're in still frame mode, + i.e. just forward all buffers + */ + gboolean still_frame_mode; + + /* Last buffer that was pushed in */ + GstBuffer *last_buffer; + + /* Current segment */ + GstSegment segment; + + /* QoS stuff */ + gdouble proportion; + GstClockTime earliest_time; + + GstCaps *request_caps; + + gboolean reconfigure; + GstDeinterlaceMode new_mode; + GstDeinterlaceFields new_fields; + + GstDeinterlaceLocking locking; + gint low_latency; + gboolean drop_orphans; + gboolean ignore_obscure; + gboolean pattern_lock; + gboolean pattern_refresh; + GstDeinterlaceBufferState buf_states[GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY]; + gint state_count; + gint pattern; + guint8 pattern_phase; + guint8 pattern_count; + guint8 output_count; + GstClockTime pattern_base_ts; + GstClockTime pattern_buf_dur; + + gboolean need_more; + gboolean have_eos; +}; + +struct _GstDeinterlaceClass +{ + GstElementClass parent_class; +}; + +GType gst_deinterlace_get_type (void); + +G_END_DECLS + +#endif /* __GST_DEINTERLACE_H__ */ diff --git a/gst/deinterlace/gstdeinterlacemethod.c b/gst/deinterlace/gstdeinterlacemethod.c new file mode 100644 index 0000000..9927868 --- /dev/null +++ b/gst/deinterlace/gstdeinterlacemethod.c @@ -0,0 +1,811 @@ +/* + * GStreamer + * Copyright (C) 2008-2010 Sebastian Dröge + * + * 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 + +#include "gstdeinterlacemethod.h" + +G_DEFINE_ABSTRACT_TYPE (GstDeinterlaceMethod, gst_deinterlace_method, + GST_TYPE_OBJECT); + +gboolean +gst_deinterlace_method_supported (GType type, GstVideoFormat format, gint width, + gint height) +{ + GstDeinterlaceMethodClass *klass = + GST_DEINTERLACE_METHOD_CLASS (g_type_class_ref (type)); + gboolean ret; + + if (format == GST_VIDEO_FORMAT_UNKNOWN) + ret = TRUE; + else + ret = klass->supported (klass, format, width, height); + g_type_class_unref (klass); + + return ret; +} + +static gboolean +gst_deinterlace_method_supported_impl (GstDeinterlaceMethodClass * klass, + GstVideoFormat format, gint width, gint height) +{ + switch (format) { + case GST_VIDEO_FORMAT_YUY2: + return (klass->deinterlace_frame_yuy2 != NULL); + case GST_VIDEO_FORMAT_YVYU: + return (klass->deinterlace_frame_yvyu != NULL); + case GST_VIDEO_FORMAT_UYVY: + return (klass->deinterlace_frame_uyvy != NULL); + case GST_VIDEO_FORMAT_I420: + return (klass->deinterlace_frame_i420 != NULL); + case GST_VIDEO_FORMAT_YV12: + return (klass->deinterlace_frame_yv12 != NULL); + case GST_VIDEO_FORMAT_Y444: + return (klass->deinterlace_frame_y444 != NULL); + case GST_VIDEO_FORMAT_Y42B: + return (klass->deinterlace_frame_y42b != NULL); + case GST_VIDEO_FORMAT_Y41B: + return (klass->deinterlace_frame_y41b != NULL); + case GST_VIDEO_FORMAT_AYUV: + return (klass->deinterlace_frame_ayuv != NULL); + case GST_VIDEO_FORMAT_NV12: + return (klass->deinterlace_frame_nv12 != NULL); + case GST_VIDEO_FORMAT_NV21: + return (klass->deinterlace_frame_nv21 != NULL); + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_xRGB: + return (klass->deinterlace_frame_argb != NULL); + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_xBGR: + return (klass->deinterlace_frame_abgr != NULL); + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_RGBx: + return (klass->deinterlace_frame_rgba != NULL); + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_BGRx: + return (klass->deinterlace_frame_bgra != NULL); + case GST_VIDEO_FORMAT_RGB: + return (klass->deinterlace_frame_rgb != NULL); + case GST_VIDEO_FORMAT_BGR: + return (klass->deinterlace_frame_bgr != NULL); + default: + return FALSE; + } +} + +void +gst_deinterlace_method_setup (GstDeinterlaceMethod * self, + GstVideoFormat format, gint width, gint height) +{ + GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self); + + klass->setup (self, format, width, height); +} + +static void +gst_deinterlace_method_setup_impl (GstDeinterlaceMethod * self, + GstVideoFormat format, gint width, gint height) +{ + gint i; + GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self); + + self->format = format; + self->frame_width = width; + self->frame_height = height; + + self->deinterlace_frame = NULL; + + if (format == GST_VIDEO_FORMAT_UNKNOWN) + return; + + for (i = 0; i < 4; i++) { + self->width[i] = gst_video_format_get_component_width (format, i, width); + self->height[i] = gst_video_format_get_component_height (format, i, height); + self->offset[i] = + gst_video_format_get_component_offset (format, i, width, height); + self->row_stride[i] = gst_video_format_get_row_stride (format, i, width); + self->pixel_stride[i] = gst_video_format_get_pixel_stride (format, i); + } + + switch (format) { + case GST_VIDEO_FORMAT_YUY2: + self->deinterlace_frame = klass->deinterlace_frame_yuy2; + break; + case GST_VIDEO_FORMAT_YVYU: + self->deinterlace_frame = klass->deinterlace_frame_yvyu; + break; + case GST_VIDEO_FORMAT_UYVY: + self->deinterlace_frame = klass->deinterlace_frame_uyvy; + break; + case GST_VIDEO_FORMAT_I420: + self->deinterlace_frame = klass->deinterlace_frame_i420; + break; + case GST_VIDEO_FORMAT_YV12: + self->deinterlace_frame = klass->deinterlace_frame_yv12; + break; + case GST_VIDEO_FORMAT_Y444: + self->deinterlace_frame = klass->deinterlace_frame_y444; + break; + case GST_VIDEO_FORMAT_Y42B: + self->deinterlace_frame = klass->deinterlace_frame_y42b; + break; + case GST_VIDEO_FORMAT_Y41B: + self->deinterlace_frame = klass->deinterlace_frame_y41b; + break; + case GST_VIDEO_FORMAT_AYUV: + self->deinterlace_frame = klass->deinterlace_frame_ayuv; + break; + case GST_VIDEO_FORMAT_NV12: + self->deinterlace_frame = klass->deinterlace_frame_nv12; + break; + case GST_VIDEO_FORMAT_NV21: + self->deinterlace_frame = klass->deinterlace_frame_nv21; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_xRGB: + self->deinterlace_frame = klass->deinterlace_frame_argb; + break; + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_xBGR: + self->deinterlace_frame = klass->deinterlace_frame_abgr; + break; + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_RGBx: + self->deinterlace_frame = klass->deinterlace_frame_rgba; + break; + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_BGRx: + self->deinterlace_frame = klass->deinterlace_frame_bgra; + break; + case GST_VIDEO_FORMAT_RGB: + self->deinterlace_frame = klass->deinterlace_frame_rgb; + break; + case GST_VIDEO_FORMAT_BGR: + self->deinterlace_frame = klass->deinterlace_frame_bgr; + break; + default: + self->deinterlace_frame = NULL; + break; + } +} + +static void +gst_deinterlace_method_class_init (GstDeinterlaceMethodClass * klass) +{ + klass->setup = gst_deinterlace_method_setup_impl; + klass->supported = gst_deinterlace_method_supported_impl; +} + +static void +gst_deinterlace_method_init (GstDeinterlaceMethod * self) +{ + self->format = GST_VIDEO_FORMAT_UNKNOWN; +} + +void +gst_deinterlace_method_deinterlace_frame (GstDeinterlaceMethod * self, + const GstDeinterlaceField * history, guint history_count, + GstBuffer * outbuf, int cur_field_idx) +{ + g_assert (self->deinterlace_frame != NULL); + self->deinterlace_frame (self, history, history_count, outbuf, cur_field_idx); +} + +gint +gst_deinterlace_method_get_fields_required (GstDeinterlaceMethod * self) +{ + GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self); + + return klass->fields_required; +} + +gint +gst_deinterlace_method_get_latency (GstDeinterlaceMethod * self) +{ + GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self); + + return klass->latency; +} + +G_DEFINE_ABSTRACT_TYPE (GstDeinterlaceSimpleMethod, + gst_deinterlace_simple_method, GST_TYPE_DEINTERLACE_METHOD); + +static gboolean +gst_deinterlace_simple_method_supported (GstDeinterlaceMethodClass * mklass, + GstVideoFormat format, gint width, gint height) +{ + GstDeinterlaceSimpleMethodClass *klass = + GST_DEINTERLACE_SIMPLE_METHOD_CLASS (mklass); + + if (!GST_DEINTERLACE_METHOD_CLASS + (gst_deinterlace_simple_method_parent_class)->supported (mklass, format, + width, height)) + return FALSE; + + switch (format) { + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_xRGB: + return (klass->interpolate_scanline_argb != NULL + && klass->copy_scanline_argb != NULL); + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_RGBx: + return (klass->interpolate_scanline_rgba != NULL + && klass->copy_scanline_rgba != NULL); + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_xBGR: + return (klass->interpolate_scanline_abgr != NULL + && klass->copy_scanline_abgr != NULL); + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_BGRx: + return (klass->interpolate_scanline_bgra != NULL + && klass->copy_scanline_bgra != NULL); + case GST_VIDEO_FORMAT_RGB: + return (klass->interpolate_scanline_rgb != NULL + && klass->copy_scanline_rgb != NULL); + case GST_VIDEO_FORMAT_BGR: + return (klass->interpolate_scanline_bgr != NULL + && klass->copy_scanline_bgr != NULL); + case GST_VIDEO_FORMAT_YUY2: + return (klass->interpolate_scanline_yuy2 != NULL + && klass->copy_scanline_yuy2 != NULL); + case GST_VIDEO_FORMAT_YVYU: + return (klass->interpolate_scanline_yvyu != NULL + && klass->copy_scanline_yvyu != NULL); + case GST_VIDEO_FORMAT_UYVY: + return (klass->interpolate_scanline_uyvy != NULL + && klass->copy_scanline_uyvy != NULL); + case GST_VIDEO_FORMAT_AYUV: + return (klass->interpolate_scanline_ayuv != NULL + && klass->copy_scanline_ayuv != NULL); + case GST_VIDEO_FORMAT_NV12: + return (klass->interpolate_scanline_nv12 != NULL + && klass->copy_scanline_nv12 != NULL); + case GST_VIDEO_FORMAT_NV21: + return (klass->interpolate_scanline_nv21 != NULL + && klass->copy_scanline_nv21 != NULL); + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_Y41B: + return (klass->interpolate_scanline_planar_y != NULL + && klass->copy_scanline_planar_y != NULL && + klass->interpolate_scanline_planar_u != NULL + && klass->copy_scanline_planar_u != NULL && + klass->interpolate_scanline_planar_v != NULL + && klass->copy_scanline_planar_v != NULL); + default: + return FALSE; + } +} + +static void + gst_deinterlace_simple_method_interpolate_scanline_packed + (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m1, self->parent.row_stride[0]); +} + +static void +gst_deinterlace_simple_method_copy_scanline_packed (GstDeinterlaceSimpleMethod * + self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void +gst_deinterlace_simple_method_deinterlace_frame_packed (GstDeinterlaceMethod * + method, const GstDeinterlaceField * history, guint history_count, + GstBuffer * outbuf, gint cur_field_idx) +{ + GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); + GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self); + GstDeinterlaceScanlineData scanlines; + guint8 *dest; + const guint8 *field0, *field1, *field2, *fieldp; + guint cur_field_flags = history[cur_field_idx].flags; + gint i; + gint frame_height = self->parent.frame_height; + gint stride = self->parent.row_stride[0]; + + g_assert (self->interpolate_scanline_packed != NULL); + g_assert (self->copy_scanline_packed != NULL); + + if (cur_field_idx > 0) { + fieldp = GST_BUFFER_DATA (history[cur_field_idx - 1].buf); + } else { + fieldp = NULL; + } + + dest = GST_BUFFER_DATA (outbuf); + field0 = GST_BUFFER_DATA (history[cur_field_idx].buf); + + g_assert (dm_class->fields_required <= 4); + + if (cur_field_idx + 1 < history_count) { + field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf); + } else { + field1 = NULL; + } + + if (cur_field_idx + 2 < history_count) { + field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf); + } else { + field2 = NULL; + } + +#define CLAMP_LOW(i) (((i)<0) ? (i+2) : (i)) +#define CLAMP_HI(i) (((i)>=(frame_height)) ? (i-2) : (i)) +#define LINE(x,i) ((x) + CLAMP_HI(CLAMP_LOW(i)) * (stride)) +#define LINE2(x,i) ((x) ? LINE(x,i) : NULL) + + for (i = 0; i < frame_height; i++) { + memset (&scanlines, 0, sizeof (scanlines)); + scanlines.bottom_field = (cur_field_flags == PICTURE_INTERLACED_BOTTOM); + + if (!((i & 1) ^ scanlines.bottom_field)) { + /* copying */ + scanlines.tp = LINE2 (fieldp, i - 1); + scanlines.bp = LINE2 (fieldp, i + 1); + + scanlines.tt0 = LINE2 (field0, (i - 2 >= 0) ? i - 2 : i); + scanlines.m0 = LINE2 (field0, i); + scanlines.bb0 = LINE2 (field0, (i + 2 < frame_height ? i + 2 : i)); + + scanlines.t1 = LINE2 (field1, i - 1); + scanlines.b1 = LINE2 (field1, i + 1); + + scanlines.tt2 = LINE2 (field2, (i - 2 >= 0) ? i - 2 : i); + scanlines.m2 = LINE2 (field2, i); + scanlines.bb2 = LINE2 (field2, (i + 2 < frame_height ? i + 2 : i)); + + self->copy_scanline_packed (self, LINE (dest, i), &scanlines); + } else { + /* interpolating */ + scanlines.ttp = LINE2 (fieldp, (i - 2 >= 0) ? i - 2 : i); + scanlines.mp = LINE2 (fieldp, i); + scanlines.bbp = LINE2 (fieldp, (i + 2 < frame_height ? i + 2 : i)); + + scanlines.t0 = LINE2 (field0, i - 1); + scanlines.b0 = LINE2 (field0, i + 1); + + scanlines.tt1 = LINE2 (field1, (i - 2 >= 0) ? i - 2 : i); + scanlines.m1 = LINE2 (field1, i); + scanlines.bb1 = LINE2 (field1, (i + 2 < frame_height ? i + 2 : i)); + + scanlines.t2 = LINE2 (field2, i - 1); + scanlines.b2 = LINE2 (field2, i + 1); + + self->interpolate_scanline_packed (self, LINE (dest, i), &scanlines); + } + } +} + +static void + gst_deinterlace_simple_method_interpolate_scanline_planar_y + (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m1, self->parent.row_stride[0]); +} + +static void +gst_deinterlace_simple_method_copy_scanline_planar_y (GstDeinterlaceSimpleMethod + * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void + gst_deinterlace_simple_method_interpolate_scanline_planar_u + (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m1, self->parent.row_stride[1]); +} + +static void +gst_deinterlace_simple_method_copy_scanline_planar_u (GstDeinterlaceSimpleMethod + * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[1]); +} + +static void + gst_deinterlace_simple_method_interpolate_scanline_planar_v + (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m1, self->parent.row_stride[2]); +} + +static void +gst_deinterlace_simple_method_copy_scanline_planar_v (GstDeinterlaceSimpleMethod + * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[2]); +} + +static void + gst_deinterlace_simple_method_deinterlace_frame_planar_plane + (GstDeinterlaceSimpleMethod * self, guint8 * dest, const guint8 * field0, + const guint8 * field1, const guint8 * field2, const guint8 * fieldp, + guint cur_field_flags, + gint plane, GstDeinterlaceSimpleMethodFunction copy_scanline, + GstDeinterlaceSimpleMethodFunction interpolate_scanline) +{ + GstDeinterlaceScanlineData scanlines; + gint i; + gint frame_height = self->parent.height[plane]; + gint stride = self->parent.row_stride[plane]; + + g_assert (interpolate_scanline != NULL); + g_assert (copy_scanline != NULL); + + for (i = 0; i < frame_height; i++) { + memset (&scanlines, 0, sizeof (scanlines)); + scanlines.bottom_field = (cur_field_flags == PICTURE_INTERLACED_BOTTOM); + + if (!((i & 1) ^ scanlines.bottom_field)) { + /* copying */ + scanlines.tp = LINE2 (fieldp, i - 1); + scanlines.bp = LINE2 (fieldp, i + 1); + + scanlines.tt0 = LINE2 (field0, (i - 2 >= 0) ? i - 2 : i); + scanlines.m0 = LINE2 (field0, i); + scanlines.bb0 = LINE2 (field0, (i + 2 < frame_height ? i + 2 : i)); + + scanlines.t1 = LINE2 (field1, i - 1); + scanlines.b1 = LINE2 (field1, i + 1); + + scanlines.tt2 = LINE2 (field2, (i - 2 >= 0) ? i - 2 : i); + scanlines.m2 = LINE2 (field2, i); + scanlines.bb2 = LINE2 (field2, (i + 2 < frame_height ? i + 2 : i)); + + copy_scanline (self, LINE (dest, i), &scanlines); + } else { + /* interpolating */ + scanlines.ttp = LINE2 (fieldp, (i - 2 >= 0) ? i - 2 : i); + scanlines.mp = LINE2 (fieldp, i); + scanlines.bbp = LINE2 (fieldp, (i + 2 < frame_height ? i + 2 : i)); + + scanlines.t0 = LINE2 (field0, i - 1); + scanlines.b0 = LINE2 (field0, i + 1); + + scanlines.tt1 = LINE2 (field1, (i - 2 >= 0) ? i - 2 : i); + scanlines.m1 = LINE2 (field1, i); + scanlines.bb1 = LINE2 (field1, (i + 2 < frame_height ? i + 2 : i)); + + scanlines.t2 = LINE2 (field2, i - 1); + scanlines.b2 = LINE2 (field2, i + 1); + + interpolate_scanline (self, LINE (dest, i), &scanlines); + } + } +} + +static void +gst_deinterlace_simple_method_deinterlace_frame_planar (GstDeinterlaceMethod * + method, const GstDeinterlaceField * history, guint history_count, + GstBuffer * outbuf, gint cur_field_idx) +{ + GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); + GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self); + guint8 *out; + const guint8 *field0, *field1, *field2, *fieldp; + guint cur_field_flags = history[cur_field_idx].flags; + gint i, offset; + GstDeinterlaceSimpleMethodFunction copy_scanline; + GstDeinterlaceSimpleMethodFunction interpolate_scanline; + + g_assert (self->interpolate_scanline_planar[0] != NULL); + g_assert (self->interpolate_scanline_planar[1] != NULL); + g_assert (self->interpolate_scanline_planar[2] != NULL); + g_assert (self->copy_scanline_planar[0] != NULL); + g_assert (self->copy_scanline_planar[1] != NULL); + g_assert (self->copy_scanline_planar[2] != NULL); + + for (i = 0; i < 3; i++) { + offset = self->parent.offset[i]; + copy_scanline = self->copy_scanline_planar[i]; + interpolate_scanline = self->interpolate_scanline_planar[i]; + + out = GST_BUFFER_DATA (outbuf) + offset; + + fieldp = NULL; + if (cur_field_idx > 0) { + fieldp = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + offset; + } + + field0 = GST_BUFFER_DATA (history[cur_field_idx].buf) + offset; + + g_assert (dm_class->fields_required <= 4); + + field1 = NULL; + if (cur_field_idx + 1 < history_count) { + field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf) + offset; + } + + field2 = NULL; + if (cur_field_idx + 2 < history_count) { + field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf) + offset; + } + + gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, out, + field0, field1, field2, fieldp, cur_field_flags, i, copy_scanline, + interpolate_scanline); + } +} + +static void +gst_deinterlace_simple_method_deinterlace_frame_nv12 (GstDeinterlaceMethod * + method, const GstDeinterlaceField * history, guint history_count, + GstBuffer * outbuf, gint cur_field_idx) +{ + GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); + GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self); + guint8 *out; + const guint8 *field0, *field1, *field2, *fieldp; + guint cur_field_flags = history[cur_field_idx].flags; + gint i, offset; + + g_assert (self->interpolate_scanline_packed != NULL); + g_assert (self->copy_scanline_packed != NULL); + + for (i = 0; i < 2; i++) { + offset = self->parent.offset[i]; + + out = GST_BUFFER_DATA (outbuf) + offset; + + fieldp = NULL; + if (cur_field_idx > 0) { + fieldp = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + offset; + } + + field0 = GST_BUFFER_DATA (history[cur_field_idx].buf) + offset; + + g_assert (dm_class->fields_required <= 4); + + field1 = NULL; + if (cur_field_idx + 1 < history_count) { + field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf) + offset; + } + + field2 = NULL; + if (cur_field_idx + 2 < history_count) { + field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf) + offset; + } + + gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, out, + field0, field1, field2, fieldp, cur_field_flags, i, + self->copy_scanline_packed, self->interpolate_scanline_packed); + } +} + +static void +gst_deinterlace_simple_method_setup (GstDeinterlaceMethod * method, + GstVideoFormat format, gint width, gint height) +{ + GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); + GstDeinterlaceSimpleMethodClass *klass = + GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS (self); + + GST_DEINTERLACE_METHOD_CLASS + (gst_deinterlace_simple_method_parent_class)->setup (method, format, + width, height); + + self->interpolate_scanline_packed = NULL; + self->copy_scanline_packed = NULL; + + self->interpolate_scanline_planar[0] = NULL; + self->interpolate_scanline_planar[1] = NULL; + self->interpolate_scanline_planar[2] = NULL; + self->copy_scanline_planar[0] = NULL; + self->copy_scanline_planar[1] = NULL; + self->copy_scanline_planar[2] = NULL; + + if (format == GST_VIDEO_FORMAT_UNKNOWN) + return; + + switch (format) { + case GST_VIDEO_FORMAT_YUY2: + self->interpolate_scanline_packed = klass->interpolate_scanline_yuy2; + self->copy_scanline_packed = klass->copy_scanline_yuy2; + break; + case GST_VIDEO_FORMAT_YVYU: + self->interpolate_scanline_packed = klass->interpolate_scanline_yvyu; + self->copy_scanline_packed = klass->copy_scanline_yvyu; + break; + case GST_VIDEO_FORMAT_UYVY: + self->interpolate_scanline_packed = klass->interpolate_scanline_uyvy; + self->copy_scanline_packed = klass->copy_scanline_uyvy; + break; + case GST_VIDEO_FORMAT_AYUV: + self->interpolate_scanline_packed = klass->interpolate_scanline_ayuv; + self->copy_scanline_packed = klass->copy_scanline_ayuv; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_xRGB: + self->interpolate_scanline_packed = klass->interpolate_scanline_argb; + self->copy_scanline_packed = klass->copy_scanline_argb; + break; + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_xBGR: + self->interpolate_scanline_packed = klass->interpolate_scanline_abgr; + self->copy_scanline_packed = klass->copy_scanline_abgr; + break; + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_RGBx: + self->interpolate_scanline_packed = klass->interpolate_scanline_rgba; + self->copy_scanline_packed = klass->copy_scanline_rgba; + break; + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_BGRx: + self->interpolate_scanline_packed = klass->interpolate_scanline_bgra; + self->copy_scanline_packed = klass->copy_scanline_bgra; + break; + case GST_VIDEO_FORMAT_RGB: + self->interpolate_scanline_packed = klass->interpolate_scanline_rgb; + self->copy_scanline_packed = klass->copy_scanline_rgb; + break; + case GST_VIDEO_FORMAT_BGR: + self->interpolate_scanline_packed = klass->interpolate_scanline_bgr; + self->copy_scanline_packed = klass->copy_scanline_bgr; + break; + case GST_VIDEO_FORMAT_NV12: + self->interpolate_scanline_packed = klass->interpolate_scanline_nv12; + self->copy_scanline_packed = klass->copy_scanline_nv12; + break; + case GST_VIDEO_FORMAT_NV21: + self->interpolate_scanline_packed = klass->interpolate_scanline_nv21; + self->copy_scanline_packed = klass->copy_scanline_nv21; + break; + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_Y41B: + self->interpolate_scanline_planar[0] = + klass->interpolate_scanline_planar_y; + self->copy_scanline_planar[0] = klass->copy_scanline_planar_y; + self->interpolate_scanline_planar[1] = + klass->interpolate_scanline_planar_u; + self->copy_scanline_planar[1] = klass->copy_scanline_planar_u; + self->interpolate_scanline_planar[2] = + klass->interpolate_scanline_planar_v; + self->copy_scanline_planar[2] = klass->copy_scanline_planar_v; + break; + default: + break; + } +} + +static void +gst_deinterlace_simple_method_class_init (GstDeinterlaceSimpleMethodClass + * klass) +{ + GstDeinterlaceMethodClass *dm_class = (GstDeinterlaceMethodClass *) klass; + + dm_class->deinterlace_frame_ayuv = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_yuy2 = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_yvyu = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_uyvy = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_argb = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_abgr = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_rgba = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_bgra = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_rgb = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_bgr = + gst_deinterlace_simple_method_deinterlace_frame_packed; + dm_class->deinterlace_frame_i420 = + gst_deinterlace_simple_method_deinterlace_frame_planar; + dm_class->deinterlace_frame_yv12 = + gst_deinterlace_simple_method_deinterlace_frame_planar; + dm_class->deinterlace_frame_y444 = + gst_deinterlace_simple_method_deinterlace_frame_planar; + dm_class->deinterlace_frame_y42b = + gst_deinterlace_simple_method_deinterlace_frame_planar; + dm_class->deinterlace_frame_y41b = + gst_deinterlace_simple_method_deinterlace_frame_planar; + dm_class->deinterlace_frame_nv12 = + gst_deinterlace_simple_method_deinterlace_frame_nv12; + dm_class->deinterlace_frame_nv21 = + gst_deinterlace_simple_method_deinterlace_frame_nv12; + dm_class->fields_required = 2; + dm_class->setup = gst_deinterlace_simple_method_setup; + dm_class->supported = gst_deinterlace_simple_method_supported; + + klass->interpolate_scanline_yuy2 = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_yuy2 = + gst_deinterlace_simple_method_copy_scanline_packed; + klass->interpolate_scanline_yvyu = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_yvyu = + gst_deinterlace_simple_method_copy_scanline_packed; + klass->interpolate_scanline_ayuv = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_ayuv = + gst_deinterlace_simple_method_copy_scanline_packed; + klass->interpolate_scanline_uyvy = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_uyvy = + gst_deinterlace_simple_method_copy_scanline_packed; + klass->interpolate_scanline_nv12 = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_nv12 = + gst_deinterlace_simple_method_copy_scanline_packed; + + klass->interpolate_scanline_argb = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_argb = + gst_deinterlace_simple_method_copy_scanline_packed; + klass->interpolate_scanline_abgr = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_abgr = + gst_deinterlace_simple_method_copy_scanline_packed; + + klass->interpolate_scanline_rgba = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_rgba = + gst_deinterlace_simple_method_copy_scanline_packed; + klass->interpolate_scanline_bgra = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_bgra = + gst_deinterlace_simple_method_copy_scanline_packed; + klass->interpolate_scanline_rgb = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_rgb = gst_deinterlace_simple_method_copy_scanline_packed; + klass->interpolate_scanline_bgr = + gst_deinterlace_simple_method_interpolate_scanline_packed; + klass->copy_scanline_bgr = gst_deinterlace_simple_method_copy_scanline_packed; + + klass->interpolate_scanline_planar_y = + gst_deinterlace_simple_method_interpolate_scanline_planar_y; + klass->copy_scanline_planar_y = + gst_deinterlace_simple_method_copy_scanline_planar_y; + klass->interpolate_scanline_planar_u = + gst_deinterlace_simple_method_interpolate_scanline_planar_u; + klass->copy_scanline_planar_u = + gst_deinterlace_simple_method_copy_scanline_planar_u; + klass->interpolate_scanline_planar_v = + gst_deinterlace_simple_method_interpolate_scanline_planar_v; + klass->copy_scanline_planar_v = + gst_deinterlace_simple_method_copy_scanline_planar_v; +} + +static void +gst_deinterlace_simple_method_init (GstDeinterlaceSimpleMethod * self) +{ +} diff --git a/gst/deinterlace/gstdeinterlacemethod.h b/gst/deinterlace/gstdeinterlacemethod.h new file mode 100644 index 0000000..a50ecbd --- /dev/null +++ b/gst/deinterlace/gstdeinterlacemethod.h @@ -0,0 +1,226 @@ +/* + * GStreamer + * Copyright (C) 2008-2010 Sebastian Dröge + * + * 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_METHOD_H__ +#define __GST_DEINTERLACE_METHOD_H__ + +#include +#include + +#if defined(HAVE_GCC_ASM) && defined(HAVE_ORC) +#if defined(HAVE_CPU_I386) || defined(HAVE_CPU_X86_64) +#define BUILD_X86_ASM +#endif +#endif + +G_BEGIN_DECLS + +#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; + + +#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 in *.c */ + guint flags; +} GstDeinterlaceField; + +/* + * This structure defines the deinterlacer plugin. + */ + +typedef void (*GstDeinterlaceMethodDeinterlaceFunction) ( + GstDeinterlaceMethod *self, const GstDeinterlaceField *history, + guint history_count, GstBuffer *outbuf, int cur_field_idx); + +struct _GstDeinterlaceMethod { + GstObject parent; + + GstVideoFormat format; + gint frame_width, frame_height; + gint width[4]; + gint height[4]; + gint offset[4]; + gint row_stride[4]; + gint pixel_stride[4]; + + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame; +}; + +struct _GstDeinterlaceMethodClass { + GstObjectClass parent_class; + guint fields_required; + guint latency; + + gboolean (*supported) (GstDeinterlaceMethodClass *klass, GstVideoFormat format, gint width, gint height); + + void (*setup) (GstDeinterlaceMethod *self, GstVideoFormat format, gint width, gint height); + + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yuy2; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yvyu; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_uyvy; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_i420; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yv12; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y444; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y42b; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y41b; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_ayuv; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv12; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv21; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_argb; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_abgr; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgba; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgra; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgb; + GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgr; + + const gchar *name; + const gchar *nick; +}; + +GType gst_deinterlace_method_get_type (void); + +gboolean gst_deinterlace_method_supported (GType type, GstVideoFormat format, gint width, gint height); +void gst_deinterlace_method_setup (GstDeinterlaceMethod * self, GstVideoFormat format, gint width, gint height); +void gst_deinterlace_method_deinterlace_frame (GstDeinterlaceMethod * self, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, + int cur_field_idx); +gint gst_deinterlace_method_get_fields_required (GstDeinterlaceMethod * self); +gint gst_deinterlace_method_get_latency (GstDeinterlaceMethod * self); + +#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 { + const guint8 *ttp, *tp, *mp, *bp, *bbp; + const guint8 *tt0, *t0, *m0, *b0, *bb0; + const guint8 *tt1, *t1, *m1, *b1, *bb1; + const guint8 *tt2, *t2, *m2, *b2, *bb2; + gboolean bottom_field; +}; + +/* + * For interpolate_scanline the input is: + * + * | t-3 t-2 t-1 t t+1 + * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1 + * | TT3 | | TT1 | | TTp + * | | T2 | | T0 | + * | M3 | | M1 | | Mp + * | | B2 | | B0 | + * | BB3 | | BB1 | | BBp + * + * For copy_scanline the input is: + * + * | t-3 t-2 t-1 t t+1 + * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1 + * | | TT2 | | TT0 | + * | T3 | | T1 | | Tp + * | | M2 | | M0 | + * | B3 | | B1 | | Bp + * | | BB2 | | BB0 | + * + * All other values are NULL. + */ + +typedef void (*GstDeinterlaceSimpleMethodFunction) (GstDeinterlaceSimpleMethod *self, guint8 *out, const GstDeinterlaceScanlineData *scanlines); + +struct _GstDeinterlaceSimpleMethod { + GstDeinterlaceMethod parent; + + GstDeinterlaceSimpleMethodFunction interpolate_scanline_packed; + GstDeinterlaceSimpleMethodFunction copy_scanline_packed; + + GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar[3]; + GstDeinterlaceSimpleMethodFunction copy_scanline_planar[3]; +}; + +struct _GstDeinterlaceSimpleMethodClass { + GstDeinterlaceMethodClass parent_class; + + /* Packed formats */ + GstDeinterlaceSimpleMethodFunction interpolate_scanline_yuy2; + GstDeinterlaceSimpleMethodFunction copy_scanline_yuy2; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_yvyu; + GstDeinterlaceSimpleMethodFunction copy_scanline_yvyu; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_uyvy; + GstDeinterlaceSimpleMethodFunction copy_scanline_uyvy; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_ayuv; + GstDeinterlaceSimpleMethodFunction copy_scanline_ayuv; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_argb; + GstDeinterlaceSimpleMethodFunction copy_scanline_argb; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_abgr; + GstDeinterlaceSimpleMethodFunction copy_scanline_abgr; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgba; + GstDeinterlaceSimpleMethodFunction copy_scanline_rgba; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgra; + GstDeinterlaceSimpleMethodFunction copy_scanline_bgra; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgb; + GstDeinterlaceSimpleMethodFunction copy_scanline_rgb; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgr; + GstDeinterlaceSimpleMethodFunction copy_scanline_bgr; + + /* Semi-planar formats */ + GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv12; + GstDeinterlaceSimpleMethodFunction copy_scanline_nv12; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv21; + GstDeinterlaceSimpleMethodFunction copy_scanline_nv21; + + /* Planar formats */ + GstDeinterlaceSimpleMethodFunction copy_scanline_planar_y; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_y; + GstDeinterlaceSimpleMethodFunction copy_scanline_planar_u; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_u; + GstDeinterlaceSimpleMethodFunction copy_scanline_planar_v; + GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_v; +}; + +GType gst_deinterlace_simple_method_get_type (void); + +G_END_DECLS + +#endif /* __GST_DEINTERLACE_METHOD_H__ */ diff --git a/gst/deinterlace/tvtime-dist.c b/gst/deinterlace/tvtime-dist.c new file mode 100644 index 0000000..a278f75 --- /dev/null +++ b/gst/deinterlace/tvtime-dist.c @@ -0,0 +1,1020 @@ + +/* autogenerated from tvtime.orc */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#ifndef _ORC_INTEGER_TYPEDEFS_ +#define _ORC_INTEGER_TYPEDEFS_ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +typedef int8_t orc_int8; +typedef int16_t orc_int16; +typedef int32_t orc_int32; +typedef int64_t orc_int64; +typedef uint8_t orc_uint8; +typedef uint16_t orc_uint16; +typedef uint32_t orc_uint32; +typedef uint64_t orc_uint64; +#define ORC_UINT64_C(x) UINT64_C(x) +#elif defined(_MSC_VER) +typedef signed __int8 orc_int8; +typedef signed __int16 orc_int16; +typedef signed __int32 orc_int32; +typedef signed __int64 orc_int64; +typedef unsigned __int8 orc_uint8; +typedef unsigned __int16 orc_uint16; +typedef unsigned __int32 orc_uint32; +typedef unsigned __int64 orc_uint64; +#define ORC_UINT64_C(x) (x##Ui64) +#define inline __inline +#else +#include +typedef signed char orc_int8; +typedef short orc_int16; +typedef int orc_int32; +typedef unsigned char orc_uint8; +typedef unsigned short orc_uint16; +typedef unsigned int orc_uint32; +#if INT_MAX == LONG_MAX +typedef long long orc_int64; +typedef unsigned long long orc_uint64; +#define ORC_UINT64_C(x) (x##ULL) +#else +typedef long orc_int64; +typedef unsigned long orc_uint64; +#define ORC_UINT64_C(x) (x##UL) +#endif +#endif +typedef union +{ + orc_int16 i; + orc_int8 x2[2]; +} orc_union16; +typedef union +{ + orc_int32 i; + float f; + orc_int16 x2[2]; + orc_int8 x4[4]; +} orc_union32; +typedef union +{ + orc_int64 i; + double f; + orc_int32 x2[2]; + float x2f[2]; + orc_int16 x4[4]; +} orc_union64; +#endif +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif + +#ifndef DISABLE_ORC +#include +#endif +void deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, + const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, + const guint8 * ORC_RESTRICT s5, int n); +void deinterlace_line_linear (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); +void deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, + const guint8 * ORC_RESTRICT s3, int n); +void deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1, + const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, + const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4, + int p1, int n); + + +/* begin Orc C target preamble */ +#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) +#define ORC_ABS(a) ((a)<0 ? -(a) : (a)) +#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) +#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) +#define ORC_SB_MAX 127 +#define ORC_SB_MIN (-1-ORC_SB_MAX) +#define ORC_UB_MAX 255 +#define ORC_UB_MIN 0 +#define ORC_SW_MAX 32767 +#define ORC_SW_MIN (-1-ORC_SW_MAX) +#define ORC_UW_MAX 65535 +#define ORC_UW_MIN 0 +#define ORC_SL_MAX 2147483647 +#define ORC_SL_MIN (-1-ORC_SL_MAX) +#define ORC_UL_MAX 4294967295U +#define ORC_UL_MIN 0 +#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) +#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) +#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) +#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) +#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) +#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) +#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) +#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) +#define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56)) +#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) +#define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff)) +#define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0)) +#define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff))) +#define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0)) +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif +/* end Orc C target preamble */ + + + +/* deinterlace_line_vfir */ +#ifdef DISABLE_ORC +void +deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, + const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, + const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n) +{ + int i; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + const orc_int8 *ORC_RESTRICT ptr5; + const orc_int8 *ORC_RESTRICT ptr6; + const orc_int8 *ORC_RESTRICT ptr7; + const orc_int8 *ORC_RESTRICT ptr8; + orc_int8 var35; + orc_int8 var36; + orc_int8 var37; + orc_int8 var38; + orc_int8 var39; + orc_union16 var40; + orc_int8 var41; + orc_union16 var42; + orc_union16 var43; + orc_union16 var44; + orc_union16 var45; + orc_union16 var46; + orc_union16 var47; + orc_union16 var48; + orc_union16 var49; + orc_union16 var50; + orc_union16 var51; + orc_union16 var52; + orc_union16 var53; + orc_union16 var54; + + ptr0 = (orc_int8 *) d1; + ptr4 = (orc_int8 *) s1; + ptr5 = (orc_int8 *) s2; + ptr6 = (orc_int8 *) s3; + ptr7 = (orc_int8 *) s4; + ptr8 = (orc_int8 *) s5; + + /* 16: loadpw */ + var40.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var35 = ptr4[i]; + /* 1: convubw */ + var42.i = (orc_uint8) var35; + /* 2: loadb */ + var36 = ptr8[i]; + /* 3: convubw */ + var43.i = (orc_uint8) var36; + /* 4: addw */ + var44.i = var42.i + var43.i; + /* 5: loadb */ + var37 = ptr5[i]; + /* 6: convubw */ + var45.i = (orc_uint8) var37; + /* 7: loadb */ + var38 = ptr7[i]; + /* 8: convubw */ + var46.i = (orc_uint8) var38; + /* 9: addw */ + var47.i = var45.i + var46.i; + /* 10: shlw */ + var48.i = var47.i << 2; + /* 11: loadb */ + var39 = ptr6[i]; + /* 12: convubw */ + var49.i = (orc_uint8) var39; + /* 13: shlw */ + var50.i = var49.i << 1; + /* 14: subw */ + var51.i = var48.i - var44.i; + /* 15: addw */ + var52.i = var51.i + var50.i; + /* 17: addw */ + var53.i = var52.i + var40.i; + /* 18: shrsw */ + var54.i = var53.i >> 3; + /* 19: convsuswb */ + var41 = ORC_CLAMP_UB (var54.i); + /* 20: storeb */ + ptr0[i] = var41; + } + +} + +#else +static void +_backup_deinterlace_line_vfir (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + const orc_int8 *ORC_RESTRICT ptr5; + const orc_int8 *ORC_RESTRICT ptr6; + const orc_int8 *ORC_RESTRICT ptr7; + const orc_int8 *ORC_RESTRICT ptr8; + orc_int8 var35; + orc_int8 var36; + orc_int8 var37; + orc_int8 var38; + orc_int8 var39; + orc_union16 var40; + orc_int8 var41; + orc_union16 var42; + orc_union16 var43; + orc_union16 var44; + orc_union16 var45; + orc_union16 var46; + orc_union16 var47; + orc_union16 var48; + orc_union16 var49; + orc_union16 var50; + orc_union16 var51; + orc_union16 var52; + orc_union16 var53; + orc_union16 var54; + + ptr0 = (orc_int8 *) ex->arrays[0]; + ptr4 = (orc_int8 *) ex->arrays[4]; + ptr5 = (orc_int8 *) ex->arrays[5]; + ptr6 = (orc_int8 *) ex->arrays[6]; + ptr7 = (orc_int8 *) ex->arrays[7]; + ptr8 = (orc_int8 *) ex->arrays[8]; + + /* 16: loadpw */ + var40.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var35 = ptr4[i]; + /* 1: convubw */ + var42.i = (orc_uint8) var35; + /* 2: loadb */ + var36 = ptr8[i]; + /* 3: convubw */ + var43.i = (orc_uint8) var36; + /* 4: addw */ + var44.i = var42.i + var43.i; + /* 5: loadb */ + var37 = ptr5[i]; + /* 6: convubw */ + var45.i = (orc_uint8) var37; + /* 7: loadb */ + var38 = ptr7[i]; + /* 8: convubw */ + var46.i = (orc_uint8) var38; + /* 9: addw */ + var47.i = var45.i + var46.i; + /* 10: shlw */ + var48.i = var47.i << 2; + /* 11: loadb */ + var39 = ptr6[i]; + /* 12: convubw */ + var49.i = (orc_uint8) var39; + /* 13: shlw */ + var50.i = var49.i << 1; + /* 14: subw */ + var51.i = var48.i - var44.i; + /* 15: addw */ + var52.i = var51.i + var50.i; + /* 17: addw */ + var53.i = var52.i + var40.i; + /* 18: shrsw */ + var54.i = var53.i >> 3; + /* 19: convsuswb */ + var41 = ORC_CLAMP_UB (var54.i); + /* 20: storeb */ + ptr0[i] = var41; + } + +} + +void +deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, + const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, + const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "deinterlace_line_vfir"); + orc_program_set_backup_function (p, _backup_deinterlace_line_vfir); + orc_program_add_destination (p, 1, "d1"); + orc_program_add_source (p, 1, "s1"); + orc_program_add_source (p, 1, "s2"); + orc_program_add_source (p, 1, "s3"); + orc_program_add_source (p, 1, "s4"); + orc_program_add_source (p, 1, "s5"); + orc_program_add_constant (p, 4, 0x00000002, "c1"); + orc_program_add_constant (p, 4, 0x00000001, "c2"); + orc_program_add_constant (p, 4, 0x00000004, "c3"); + orc_program_add_constant (p, 4, 0x00000003, "c4"); + orc_program_add_temporary (p, 2, "t1"); + orc_program_add_temporary (p, 2, "t2"); + orc_program_add_temporary (p, 2, "t3"); + + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S5, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S4, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, + ORC_VAR_D1); + orc_program_append_2 (p, "shlw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "shlw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, + ORC_VAR_D1); + orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C3, + ORC_VAR_D1); + orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C4, + ORC_VAR_D1); + orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T2, + ORC_VAR_D1, ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->arrays[ORC_VAR_S2] = (void *) s2; + ex->arrays[ORC_VAR_S3] = (void *) s3; + ex->arrays[ORC_VAR_S4] = (void *) s4; + ex->arrays[ORC_VAR_S5] = (void *) s5; + + func = p->code_exec; + func (ex); +} +#endif + + +/* deinterlace_line_linear */ +#ifdef DISABLE_ORC +void +deinterlace_line_linear (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) +{ + int i; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + const orc_int8 *ORC_RESTRICT ptr5; + orc_int8 var32; + orc_int8 var33; + orc_int8 var34; + + ptr0 = (orc_int8 *) d1; + ptr4 = (orc_int8 *) s1; + ptr5 = (orc_int8 *) s2; + + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var32 = ptr4[i]; + /* 1: loadb */ + var33 = ptr5[i]; + /* 2: avgub */ + var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; + /* 3: storeb */ + ptr0[i] = var34; + } + +} + +#else +static void +_backup_deinterlace_line_linear (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + const orc_int8 *ORC_RESTRICT ptr5; + orc_int8 var32; + orc_int8 var33; + orc_int8 var34; + + ptr0 = (orc_int8 *) ex->arrays[0]; + ptr4 = (orc_int8 *) ex->arrays[4]; + ptr5 = (orc_int8 *) ex->arrays[5]; + + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var32 = ptr4[i]; + /* 1: loadb */ + var33 = ptr5[i]; + /* 2: avgub */ + var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; + /* 3: storeb */ + ptr0[i] = var34; + } + +} + +void +deinterlace_line_linear (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "deinterlace_line_linear"); + orc_program_set_backup_function (p, _backup_deinterlace_line_linear); + orc_program_add_destination (p, 1, "d1"); + orc_program_add_source (p, 1, "s1"); + orc_program_add_source (p, 1, "s2"); + + orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_S2, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->arrays[ORC_VAR_S2] = (void *) s2; + + func = p->code_exec; + func (ex); +} +#endif + + +/* deinterlace_line_linear_blend */ +#ifdef DISABLE_ORC +void +deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, + const guint8 * ORC_RESTRICT s3, int n) +{ + int i; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + const orc_int8 *ORC_RESTRICT ptr5; + const orc_int8 *ORC_RESTRICT ptr6; + orc_int8 var35; + orc_int8 var36; + orc_int8 var37; + orc_union16 var38; + orc_int8 var39; + orc_union16 var40; + orc_union16 var41; + orc_union16 var42; + orc_union16 var43; + orc_union16 var44; + orc_union16 var45; + orc_union16 var46; + orc_union16 var47; + + ptr0 = (orc_int8 *) d1; + ptr4 = (orc_int8 *) s1; + ptr5 = (orc_int8 *) s2; + ptr6 = (orc_int8 *) s3; + + /* 9: loadpw */ + var38.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var35 = ptr4[i]; + /* 1: convubw */ + var40.i = (orc_uint8) var35; + /* 2: loadb */ + var36 = ptr5[i]; + /* 3: convubw */ + var41.i = (orc_uint8) var36; + /* 4: loadb */ + var37 = ptr6[i]; + /* 5: convubw */ + var42.i = (orc_uint8) var37; + /* 6: addw */ + var43.i = var40.i + var41.i; + /* 7: addw */ + var44.i = var42.i + var42.i; + /* 8: addw */ + var45.i = var43.i + var44.i; + /* 10: addw */ + var46.i = var45.i + var38.i; + /* 11: shrsw */ + var47.i = var46.i >> 2; + /* 12: convsuswb */ + var39 = ORC_CLAMP_UB (var47.i); + /* 13: storeb */ + ptr0[i] = var39; + } + +} + +#else +static void +_backup_deinterlace_line_linear_blend (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + const orc_int8 *ORC_RESTRICT ptr5; + const orc_int8 *ORC_RESTRICT ptr6; + orc_int8 var35; + orc_int8 var36; + orc_int8 var37; + orc_union16 var38; + orc_int8 var39; + orc_union16 var40; + orc_union16 var41; + orc_union16 var42; + orc_union16 var43; + orc_union16 var44; + orc_union16 var45; + orc_union16 var46; + orc_union16 var47; + + ptr0 = (orc_int8 *) ex->arrays[0]; + ptr4 = (orc_int8 *) ex->arrays[4]; + ptr5 = (orc_int8 *) ex->arrays[5]; + ptr6 = (orc_int8 *) ex->arrays[6]; + + /* 9: loadpw */ + var38.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var35 = ptr4[i]; + /* 1: convubw */ + var40.i = (orc_uint8) var35; + /* 2: loadb */ + var36 = ptr5[i]; + /* 3: convubw */ + var41.i = (orc_uint8) var36; + /* 4: loadb */ + var37 = ptr6[i]; + /* 5: convubw */ + var42.i = (orc_uint8) var37; + /* 6: addw */ + var43.i = var40.i + var41.i; + /* 7: addw */ + var44.i = var42.i + var42.i; + /* 8: addw */ + var45.i = var43.i + var44.i; + /* 10: addw */ + var46.i = var45.i + var38.i; + /* 11: shrsw */ + var47.i = var46.i >> 2; + /* 12: convsuswb */ + var39 = ORC_CLAMP_UB (var47.i); + /* 13: storeb */ + ptr0[i] = var39; + } + +} + +void +deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1, + const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, + const guint8 * ORC_RESTRICT s3, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "deinterlace_line_linear_blend"); + orc_program_set_backup_function (p, + _backup_deinterlace_line_linear_blend); + orc_program_add_destination (p, 1, "d1"); + orc_program_add_source (p, 1, "s1"); + orc_program_add_source (p, 1, "s2"); + orc_program_add_source (p, 1, "s3"); + orc_program_add_constant (p, 4, 0x00000002, "c1"); + orc_program_add_temporary (p, 2, "t1"); + orc_program_add_temporary (p, 2, "t2"); + orc_program_add_temporary (p, 2, "t3"); + + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T3, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T3, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1, + ORC_VAR_D1, ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->arrays[ORC_VAR_S2] = (void *) s2; + ex->arrays[ORC_VAR_S3] = (void *) s3; + + func = p->code_exec; + func (ex); +} +#endif + + +/* deinterlace_line_greedy */ +#ifdef DISABLE_ORC +void +deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1, + const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, + const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4, + int p1, int n) +{ + int i; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + const orc_int8 *ORC_RESTRICT ptr5; + const orc_int8 *ORC_RESTRICT ptr6; + const orc_int8 *ORC_RESTRICT ptr7; + orc_int8 var44; + orc_int8 var45; + orc_int8 var46; + orc_int8 var47; + orc_int8 var48; + orc_int8 var49; + orc_int8 var50; + orc_int8 var51; + orc_int8 var52; + orc_int8 var53; + orc_int8 var54; + orc_int8 var55; + orc_int8 var56; + orc_int8 var57; + orc_int8 var58; + orc_int8 var59; + orc_int8 var60; + orc_int8 var61; + orc_int8 var62; + orc_int8 var63; + orc_int8 var64; + orc_int8 var65; + orc_int8 var66; + orc_int8 var67; + orc_int8 var68; + orc_int8 var69; + orc_int8 var70; + + ptr0 = (orc_int8 *) d1; + ptr4 = (orc_int8 *) s1; + ptr5 = (orc_int8 *) s2; + ptr6 = (orc_int8 *) s3; + ptr7 = (orc_int8 *) s4; + + /* 11: loadpb */ + var44 = (int) 0x00000080; /* 128 or 6.32404e-322f */ + /* 13: loadpb */ + var45 = (int) 0x00000080; /* 128 or 6.32404e-322f */ + /* 21: loadpb */ + var46 = p1; + /* 23: loadpb */ + var47 = p1; + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var49 = ptr4[i]; + /* 1: loadb */ + var50 = ptr7[i]; + /* 2: loadb */ + var51 = ptr6[i]; + /* 3: loadb */ + var52 = ptr5[i]; + /* 4: avgub */ + var53 = ((orc_uint8) var52 + (orc_uint8) var51 + 1) >> 1; + /* 5: maxub */ + var54 = ORC_MAX ((orc_uint8) var49, (orc_uint8) var53); + /* 6: minub */ + var55 = ORC_MIN ((orc_uint8) var49, (orc_uint8) var53); + /* 7: subb */ + var56 = var54 - var55; + /* 8: maxub */ + var57 = ORC_MAX ((orc_uint8) var50, (orc_uint8) var53); + /* 9: minub */ + var58 = ORC_MIN ((orc_uint8) var50, (orc_uint8) var53); + /* 10: subb */ + var59 = var57 - var58; + /* 12: xorb */ + var60 = var56 ^ var44; + /* 14: xorb */ + var61 = var59 ^ var45; + /* 15: cmpgtsb */ + var62 = (var60 > var61) ? (~0) : 0; + /* 16: andb */ + var63 = var50 & var62; + /* 17: andnb */ + var64 = (~var62) & var49; + /* 18: orb */ + var65 = var63 | var64; + /* 19: maxub */ + var66 = ORC_MAX ((orc_uint8) var52, (orc_uint8) var51); + /* 20: minub */ + var67 = ORC_MIN ((orc_uint8) var52, (orc_uint8) var51); + /* 22: addusb */ + var68 = ORC_CLAMP_UB ((orc_uint8) var66 + (orc_uint8) var46); + /* 24: subusb */ + var69 = ORC_CLAMP_UB ((orc_uint8) var67 - (orc_uint8) var47); + /* 25: minub */ + var70 = ORC_MIN ((orc_uint8) var65, (orc_uint8) var68); + /* 26: maxub */ + var48 = ORC_MAX ((orc_uint8) var70, (orc_uint8) var69); + /* 27: storeb */ + ptr0[i] = var48; + } + +} + +#else +static void +_backup_deinterlace_line_greedy (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + const orc_int8 *ORC_RESTRICT ptr5; + const orc_int8 *ORC_RESTRICT ptr6; + const orc_int8 *ORC_RESTRICT ptr7; + orc_int8 var44; + orc_int8 var45; + orc_int8 var46; + orc_int8 var47; + orc_int8 var48; + orc_int8 var49; + orc_int8 var50; + orc_int8 var51; + orc_int8 var52; + orc_int8 var53; + orc_int8 var54; + orc_int8 var55; + orc_int8 var56; + orc_int8 var57; + orc_int8 var58; + orc_int8 var59; + orc_int8 var60; + orc_int8 var61; + orc_int8 var62; + orc_int8 var63; + orc_int8 var64; + orc_int8 var65; + orc_int8 var66; + orc_int8 var67; + orc_int8 var68; + orc_int8 var69; + orc_int8 var70; + + ptr0 = (orc_int8 *) ex->arrays[0]; + ptr4 = (orc_int8 *) ex->arrays[4]; + ptr5 = (orc_int8 *) ex->arrays[5]; + ptr6 = (orc_int8 *) ex->arrays[6]; + ptr7 = (orc_int8 *) ex->arrays[7]; + + /* 11: loadpb */ + var44 = (int) 0x00000080; /* 128 or 6.32404e-322f */ + /* 13: loadpb */ + var45 = (int) 0x00000080; /* 128 or 6.32404e-322f */ + /* 21: loadpb */ + var46 = ex->params[24]; + /* 23: loadpb */ + var47 = ex->params[24]; + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var49 = ptr4[i]; + /* 1: loadb */ + var50 = ptr7[i]; + /* 2: loadb */ + var51 = ptr6[i]; + /* 3: loadb */ + var52 = ptr5[i]; + /* 4: avgub */ + var53 = ((orc_uint8) var52 + (orc_uint8) var51 + 1) >> 1; + /* 5: maxub */ + var54 = ORC_MAX ((orc_uint8) var49, (orc_uint8) var53); + /* 6: minub */ + var55 = ORC_MIN ((orc_uint8) var49, (orc_uint8) var53); + /* 7: subb */ + var56 = var54 - var55; + /* 8: maxub */ + var57 = ORC_MAX ((orc_uint8) var50, (orc_uint8) var53); + /* 9: minub */ + var58 = ORC_MIN ((orc_uint8) var50, (orc_uint8) var53); + /* 10: subb */ + var59 = var57 - var58; + /* 12: xorb */ + var60 = var56 ^ var44; + /* 14: xorb */ + var61 = var59 ^ var45; + /* 15: cmpgtsb */ + var62 = (var60 > var61) ? (~0) : 0; + /* 16: andb */ + var63 = var50 & var62; + /* 17: andnb */ + var64 = (~var62) & var49; + /* 18: orb */ + var65 = var63 | var64; + /* 19: maxub */ + var66 = ORC_MAX ((orc_uint8) var52, (orc_uint8) var51); + /* 20: minub */ + var67 = ORC_MIN ((orc_uint8) var52, (orc_uint8) var51); + /* 22: addusb */ + var68 = ORC_CLAMP_UB ((orc_uint8) var66 + (orc_uint8) var46); + /* 24: subusb */ + var69 = ORC_CLAMP_UB ((orc_uint8) var67 - (orc_uint8) var47); + /* 25: minub */ + var70 = ORC_MIN ((orc_uint8) var65, (orc_uint8) var68); + /* 26: maxub */ + var48 = ORC_MAX ((orc_uint8) var70, (orc_uint8) var69); + /* 27: storeb */ + ptr0[i] = var48; + } + +} + +void +deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1, + const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, + const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4, + int p1, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "deinterlace_line_greedy"); + orc_program_set_backup_function (p, _backup_deinterlace_line_greedy); + orc_program_add_destination (p, 1, "d1"); + orc_program_add_source (p, 1, "s1"); + orc_program_add_source (p, 1, "s2"); + orc_program_add_source (p, 1, "s3"); + orc_program_add_source (p, 1, "s4"); + orc_program_add_constant (p, 4, 0x00000080, "c1"); + orc_program_add_parameter (p, 1, "p1"); + orc_program_add_temporary (p, 1, "t1"); + orc_program_add_temporary (p, 1, "t2"); + orc_program_add_temporary (p, 1, "t3"); + orc_program_add_temporary (p, 1, "t4"); + orc_program_add_temporary (p, 1, "t5"); + orc_program_add_temporary (p, 1, "t6"); + orc_program_add_temporary (p, 1, "t7"); + orc_program_add_temporary (p, 1, "t8"); + orc_program_add_temporary (p, 1, "t9"); + orc_program_add_temporary (p, 1, "t10"); + orc_program_add_temporary (p, 1, "t11"); + orc_program_add_temporary (p, 1, "t12"); + + orc_program_append_2 (p, "loadb", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "loadb", 0, ORC_VAR_T2, ORC_VAR_S4, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "loadb", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "loadb", 0, ORC_VAR_T4, ORC_VAR_S2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "avgub", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_T3, + ORC_VAR_D1); + orc_program_append_2 (p, "maxub", 0, ORC_VAR_T8, ORC_VAR_T1, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "minub", 0, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "subb", 0, ORC_VAR_T6, ORC_VAR_T8, ORC_VAR_T9, + ORC_VAR_D1); + orc_program_append_2 (p, "maxub", 0, ORC_VAR_T8, ORC_VAR_T2, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "minub", 0, ORC_VAR_T9, ORC_VAR_T2, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "subb", 0, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_T9, + ORC_VAR_D1); + orc_program_append_2 (p, "xorb", 0, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "xorb", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "cmpgtsb", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_T7, + ORC_VAR_D1); + orc_program_append_2 (p, "andb", 0, ORC_VAR_T8, ORC_VAR_T2, ORC_VAR_T9, + ORC_VAR_D1); + orc_program_append_2 (p, "andnb", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1, + ORC_VAR_D1); + orc_program_append_2 (p, "orb", 0, ORC_VAR_T10, ORC_VAR_T8, ORC_VAR_T9, + ORC_VAR_D1); + orc_program_append_2 (p, "maxub", 0, ORC_VAR_T12, ORC_VAR_T4, ORC_VAR_T3, + ORC_VAR_D1); + orc_program_append_2 (p, "minub", 0, ORC_VAR_T11, ORC_VAR_T4, ORC_VAR_T3, + ORC_VAR_D1); + orc_program_append_2 (p, "addusb", 0, ORC_VAR_T12, ORC_VAR_T12, + ORC_VAR_P1, ORC_VAR_D1); + orc_program_append_2 (p, "subusb", 0, ORC_VAR_T11, ORC_VAR_T11, + ORC_VAR_P1, ORC_VAR_D1); + orc_program_append_2 (p, "minub", 0, ORC_VAR_T10, ORC_VAR_T10, + ORC_VAR_T12, ORC_VAR_D1); + orc_program_append_2 (p, "maxub", 0, ORC_VAR_D1, ORC_VAR_T10, ORC_VAR_T11, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->arrays[ORC_VAR_S2] = (void *) s2; + ex->arrays[ORC_VAR_S3] = (void *) s3; + ex->arrays[ORC_VAR_S4] = (void *) s4; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif diff --git a/gst/deinterlace/tvtime-dist.h b/gst/deinterlace/tvtime-dist.h new file mode 100644 index 0000000..9578a83 --- /dev/null +++ b/gst/deinterlace/tvtime-dist.h @@ -0,0 +1,80 @@ + +/* autogenerated from tvtime.orc */ + +#ifndef _TVTIME_H_ +#define _TVTIME_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + + +#ifndef _ORC_INTEGER_TYPEDEFS_ +#define _ORC_INTEGER_TYPEDEFS_ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +typedef int8_t orc_int8; +typedef int16_t orc_int16; +typedef int32_t orc_int32; +typedef int64_t orc_int64; +typedef uint8_t orc_uint8; +typedef uint16_t orc_uint16; +typedef uint32_t orc_uint32; +typedef uint64_t orc_uint64; +#define ORC_UINT64_C(x) UINT64_C(x) +#elif defined(_MSC_VER) +typedef signed __int8 orc_int8; +typedef signed __int16 orc_int16; +typedef signed __int32 orc_int32; +typedef signed __int64 orc_int64; +typedef unsigned __int8 orc_uint8; +typedef unsigned __int16 orc_uint16; +typedef unsigned __int32 orc_uint32; +typedef unsigned __int64 orc_uint64; +#define ORC_UINT64_C(x) (x##Ui64) +#define inline __inline +#else +#include +typedef signed char orc_int8; +typedef short orc_int16; +typedef int orc_int32; +typedef unsigned char orc_uint8; +typedef unsigned short orc_uint16; +typedef unsigned int orc_uint32; +#if INT_MAX == LONG_MAX +typedef long long orc_int64; +typedef unsigned long long orc_uint64; +#define ORC_UINT64_C(x) (x##ULL) +#else +typedef long orc_int64; +typedef unsigned long orc_uint64; +#define ORC_UINT64_C(x) (x##UL) +#endif +#endif +typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; +typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; +typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; +#endif +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif +void deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n); +void deinterlace_line_linear (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); +void deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); +void deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1, const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4, int p1, int n); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/gst/deinterlace/tvtime.orc b/gst/deinterlace/tvtime.orc new file mode 100644 index 0000000..44217e7 --- /dev/null +++ b/gst/deinterlace/tvtime.orc @@ -0,0 +1,109 @@ + +.function deinterlace_line_vfir +.dest 1 d1 guint8 +.source 1 s1 guint8 +.source 1 s2 guint8 +.source 1 s3 guint8 +.source 1 s4 guint8 +.source 1 s5 guint8 +.temp 2 t1 +.temp 2 t2 +.temp 2 t3 + +convubw t1, s1 +convubw t2, s5 +addw t1, t1, t2 +convubw t2, s2 +convubw t3, s4 +addw t2, t2, t3 +shlw t2, t2, 2 +convubw t3, s3 +shlw t3, t3, 1 +subw t2, t2, t1 +addw t2, t2, t3 +addw t2, t2, 4 +shrsw t2, t2, 3 +convsuswb d1, t2 + + +.function deinterlace_line_linear +.dest 1 d1 guint8 +.source 1 s1 guint8 +.source 1 s2 guint8 + +avgub d1, s1, s2 + + +.function deinterlace_line_linear_blend +.dest 1 d1 guint8 +.source 1 s1 guint8 +.source 1 s2 guint8 +.source 1 s3 guint8 +.temp 2 t1 +.temp 2 t2 +.temp 2 t3 + +convubw t1, s1 +convubw t2, s2 +convubw t3, s3 +addw t1, t1, t2 +addw t3, t3, t3 +addw t1, t1, t3 +addw t1, t1, 2 +shrsw t1, t1, 2 +convsuswb d1, t1 + + +.function deinterlace_line_greedy +.dest 1 d1 +.source 1 m0 +.source 1 t1 +.source 1 b1 +.source 1 m2 +.param 1 max_comb +.temp 1 tm0 +.temp 1 tm2 +.temp 1 tb1 +.temp 1 tt1 +.temp 1 avg +.temp 1 l2_diff +.temp 1 lp2_diff +.temp 1 t2 +.temp 1 t3 +.temp 1 best +.temp 1 min +.temp 1 max + + +loadb tm0, m0 +loadb tm2, m2 + +loadb tb1, b1 +loadb tt1, t1 +avgub avg, tt1, tb1 + +maxub t2, tm0, avg +minub t3, tm0, avg +subb l2_diff, t2, t3 + +maxub t2, tm2, avg +minub t3, tm2, avg +subb lp2_diff, t2, t3 + +xorb l2_diff, l2_diff, 0x80 +xorb lp2_diff, lp2_diff, 0x80 +cmpgtsb t3, l2_diff, lp2_diff + +andb t2, tm2, t3 +andnb t3, t3, tm0 +orb best, t2, t3 + +maxub max, tt1, tb1 +minub min, tt1, tb1 +addusb max, max, max_comb +subusb min, min, max_comb +minub best, best, max +maxub d1, best, min + + + diff --git a/gst/deinterlace/tvtime/greedy.c b/gst/deinterlace/tvtime/greedy.c new file mode 100644 index 0000000..5775132 --- /dev/null +++ b/gst/deinterlace/tvtime/greedy.c @@ -0,0 +1,250 @@ +/* + * + * GStreamer + * Copyright (c) 2000 Tom Barry All rights reserved. + * mmx.h port copyright (c) 2002 Billy Biggs . + * + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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 "gstdeinterlacemethod.h" +#include +#include "tvtime.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 +{ + GstDeinterlaceSimpleMethod parent; + + guint max_comb; +} GstDeinterlaceMethodGreedyL; + +typedef GstDeinterlaceSimpleMethodClass 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_interpolate_scanline_orc (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + guint max_comb = GST_DEINTERLACE_METHOD_GREEDY_L (self)->max_comb; + + if (scanlines->m1 == NULL || scanlines->mp == NULL) { + deinterlace_line_linear (out, scanlines->t0, scanlines->b0, + self->parent.row_stride[0]); + } else { + deinterlace_line_greedy (out, scanlines->m1, scanlines->t0, scanlines->b0, + scanlines->mp ? scanlines->mp : scanlines->m1, + max_comb, self->parent.row_stride[0]); + } +} + +static inline void +deinterlace_greedy_interpolate_scanline_orc_planar_u (GstDeinterlaceSimpleMethod + * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + guint max_comb = GST_DEINTERLACE_METHOD_GREEDY_L (self)->max_comb; + + if (scanlines->m1 == NULL || scanlines->mp == NULL) { + deinterlace_line_linear (out, scanlines->t0, scanlines->b0, + self->parent.row_stride[1]); + } else { + deinterlace_line_greedy (out, scanlines->m1, scanlines->t0, scanlines->b0, + scanlines->mp ? scanlines->mp : scanlines->m1, + max_comb, self->parent.row_stride[1]); + } +} + +static inline void +deinterlace_greedy_interpolate_scanline_orc_planar_v (GstDeinterlaceSimpleMethod + * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + guint max_comb = GST_DEINTERLACE_METHOD_GREEDY_L (self)->max_comb; + + if (scanlines->m1 == NULL || scanlines->mp == NULL) { + deinterlace_line_linear (out, scanlines->t0, scanlines->b0, + self->parent.row_stride[2]); + } else { + deinterlace_line_greedy (out, scanlines->m1, scanlines->t0, scanlines->b0, + scanlines->mp ? scanlines->mp : scanlines->m1, + max_comb, self->parent.row_stride[2]); + } +} + +static void +deinterlace_greedy_copy_scanline (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void +deinterlace_greedy_copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[1]); +} + +static void +deinterlace_greedy_copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[2]); +} + +G_DEFINE_TYPE (GstDeinterlaceMethodGreedyL, gst_deinterlace_method_greedy_l, + GST_TYPE_DEINTERLACE_SIMPLE_METHOD); + +enum +{ + PROP_0, + PROP_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 PROP_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 PROP_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; + GstDeinterlaceSimpleMethodClass *dism_class = + (GstDeinterlaceSimpleMethodClass *) klass; + GObjectClass *gobject_class = (GObjectClass *) klass; + + 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, PROP_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 = 2; + dim_class->name = "Motion Adaptive: Simple Detection"; + dim_class->nick = "greedyl"; + dim_class->latency = 1; + + dism_class->interpolate_scanline_ayuv = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_yuy2 = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_yvyu = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_uyvy = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_argb = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_abgr = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_rgba = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_bgra = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_rgb = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_bgr = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_planar_y = + deinterlace_greedy_interpolate_scanline_orc; + dism_class->interpolate_scanline_planar_u = + deinterlace_greedy_interpolate_scanline_orc_planar_u; + dism_class->interpolate_scanline_planar_v = + deinterlace_greedy_interpolate_scanline_orc_planar_v; + + dism_class->copy_scanline_ayuv = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_yuy2 = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_yvyu = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_uyvy = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_argb = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_abgr = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_rgba = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_bgra = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_rgb = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_bgr = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_planar_y = deinterlace_greedy_copy_scanline; + dism_class->copy_scanline_planar_u = + deinterlace_greedy_copy_scanline_planar_u; + dism_class->copy_scanline_planar_v = + deinterlace_greedy_copy_scanline_planar_v; +} + +static void +gst_deinterlace_method_greedy_l_init (GstDeinterlaceMethodGreedyL * self) +{ + self->max_comb = 15; +} diff --git a/gst/deinterlace/tvtime/greedyh.asm b/gst/deinterlace/tvtime/greedyh.asm new file mode 100644 index 0000000..d87b9e3 --- /dev/null +++ b/gst/deinterlace/tvtime/greedyh.asm @@ -0,0 +1,472 @@ +/* + * + * GStreamer + * Copyright (c) 2001 Tom Barry. All rights reserved. + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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 aglong 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" + +static void +FUNCT_NAME_YUY2 (GstDeinterlaceMethodGreedyH *self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) +{ + + // in tight loop some vars are accessed faster in local storage + gint64 YMask = 0x00ff00ff00ff00ffull; // to keep only luma + gint64 UVMask = 0xff00ff00ff00ff00ull; // to keep only chroma + gint64 ShiftMask = 0xfefefefefefefefeull; // to avoid shifting chroma to luma + gint64 QW256 = 0x0100010001000100ull; // 4 256's + gint64 MaxComb; + gint64 MotionThreshold; + gint64 MotionSense; + gint64 i; + glong LoopCtr; + glong oldbx; + + gint64 QW256B; + gint64 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 (width % 4 != 0) + C_FUNCT_YUY2 (self, L1, L2, L3, L2P, Dest, width); + + // 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 = width / 8 - 1; // there are LineLength / 4 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"); +} + +static void +FUNCT_NAME_UYVY (GstDeinterlaceMethodGreedyH *self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) +{ + + // in tight loop some vars are accessed faster in local storage + gint64 YMask = 0xff00ff00ff00ff00ull; // to keep only luma + gint64 UVMask = 0x00ff00ff00ff00ffull; // to keep only chroma + gint64 ShiftMask = 0xfefefefefefefefeull; // to avoid shifting chroma to luma + gint64 QW256 = 0x0100010001000100ull; // 4 256's + gint64 MaxComb; + gint64 MotionThreshold; + gint64 MotionSense; + gint64 i; + glong LoopCtr; + glong oldbx; + + gint64 QW256B; + gint64 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 (width % 4 != 0) + C_FUNCT_UYVY (self, L1, L2, L3, L2P, Dest, width); + + // 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 = width / 8 - 1; // there are LineLength / 4 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 + "psrlw $8, %%mm0\n\t" // div by 256 to get weighted avg + "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 + "psrlw $8, %%mm4\n\t" // div by 256 to get weighted avg + "pmullw %%mm7, %%mm4\n\t" // use more weave for less motion + "pand %[YMask], %%mm6\n\t" // keep only luma from calc'd value + "psrlw $8, %%mm6\n\t" // div by 256 to get weighted avg + "pmullw %%mm0, %%mm6\n\t" // use more bob for large motion + "paddusw %%mm6, %%mm4\n\t" // combine + "pand %[YMask], %%mm4\n\t" // keep only luma from calc'd value + // 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/deinterlace/tvtime/greedyh.c b/gst/deinterlace/tvtime/greedyh.c new file mode 100644 index 0000000..93da8cd --- /dev/null +++ b/gst/deinterlace/tvtime/greedyh.c @@ -0,0 +1,1078 @@ +/* + * + * GStreamer + * Copyright (C) 2004 Billy Biggs + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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 +#include + +#include +#include "plugins.h" +#include "gstdeinterlacemethod.h" +#ifdef HAVE_ORC +#include +#endif + +#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)) + +typedef struct +{ + GstDeinterlaceMethod parent; + + guint max_comb, motion_threshold, motion_sense; +} GstDeinterlaceMethodGreedyH; + +typedef void (*ScanlineFunction) (GstDeinterlaceMethodGreedyH * self, + const guint8 * L2, const guint8 * L1, const guint8 * L3, const guint8 * L2P, + guint8 * Dest, gint width); + +typedef struct +{ + GstDeinterlaceMethodClass parent_class; + ScanlineFunction scanline_yuy2; /* This is for YVYU too */ + ScanlineFunction scanline_uyvy; + ScanlineFunction scanline_ayuv; + ScanlineFunction scanline_planar_y; + ScanlineFunction scanline_planar_uv; +} GstDeinterlaceMethodGreedyHClass; + +static void +greedyh_scanline_C_ayuv (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, + const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, + gint width) +{ + gint Pos, Comp; + guint8 l1, l1_1, l3, l3_1; + guint8 avg, avg_1; + guint8 avg__1[4] = { 0, }; + guint8 avg_s; + guint8 avg_sc; + guint8 best; + guint16 mov; + guint8 out; + guint8 l2, lp2; + guint8 l2_diff, lp2_diff; + guint8 min, max; + guint max_comb = self->max_comb; + guint motion_sense = self->motion_sense; + guint motion_threshold = self->motion_threshold; + + width /= 4; + for (Pos = 0; Pos < width; Pos++) { + for (Comp = 0; Comp < 4; Comp++) { + l1 = L1[0]; + l3 = L3[0]; + + if (Pos == width - 1) { + l1_1 = l1; + l3_1 = l3; + } else { + l1_1 = L1[4]; + l3_1 = L3[4]; + } + + /* Average of L1 and L3 */ + avg = (l1 + l3) / 2; + + if (Pos == 0) { + avg__1[Comp] = avg; + } + + /* Average of next L1 and next L3 */ + avg_1 = (l1_1 + l3_1) / 2; + + /* Calculate average of one pixel forward and previous */ + avg_s = (avg__1[Comp] + avg_1) / 2; + + /* Calculate average of center and surrounding pixels */ + avg_sc = (avg + avg_s) / 2; + + /* move forward */ + avg__1[Comp] = avg; + + /* Get best L2/L2P, i.e. least diff from above average */ + l2 = L2[0]; + lp2 = L2P[0]; + + l2_diff = ABS (l2 - avg_sc); + + lp2_diff = ABS (lp2 - avg_sc); + + if (l2_diff > lp2_diff) + best = lp2; + else + best = l2; + + /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */ + max = MAX (l1, l3); + min = MIN (l1, l3); + + if (max < 256 - max_comb) + max += max_comb; + else + max = 255; + + if (min > max_comb) + min -= max_comb; + else + min = 0; + + out = CLAMP (best, min, max); + + if (Comp < 2) { + /* Do motion compensation for luma, i.e. how much + * the weave pixel differs */ + mov = ABS (l2 - lp2); + if (mov > motion_threshold) + mov -= motion_threshold; + else + mov = 0; + + mov = mov * motion_sense; + if (mov > 256) + mov = 256; + + /* Weighted sum on clipped weave pixel and average */ + out = (out * (256 - mov) + avg_sc * mov) / 256; + } + + Dest[0] = out; + + Dest += 1; + L1 += 1; + L2 += 1; + L3 += 1; + L2P += 1; + } + } +} + +static void +greedyh_scanline_C_yuy2 (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, + const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, + gint width) +{ + gint Pos; + guint8 l1_l, l1_1_l, l3_l, l3_1_l; + guint8 l1_c, l1_1_c, l3_c, l3_1_c; + guint8 avg_l, avg_c, avg_l_1, avg_c_1; + guint8 avg_l__1 = 0, avg_c__1 = 0; + guint8 avg_s_l, avg_s_c; + guint8 avg_sc_l, avg_sc_c; + guint8 best_l, best_c; + guint16 mov_l; + guint8 out_l, out_c; + guint8 l2_l, l2_c, lp2_l, lp2_c; + guint8 l2_l_diff, l2_c_diff, lp2_l_diff, lp2_c_diff; + guint8 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; + + width /= 2; + for (Pos = 0; Pos < width; Pos++) { + l1_l = L1[0]; + l1_c = L1[1]; + l3_l = L3[0]; + l3_c = L3[1]; + + if (Pos == width - 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; + } +} + +static void +greedyh_scanline_C_uyvy (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, + const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, + gint width) +{ + gint Pos; + guint8 l1_l, l1_1_l, l3_l, l3_1_l; + guint8 l1_c, l1_1_c, l3_c, l3_1_c; + guint8 avg_l, avg_c, avg_l_1, avg_c_1; + guint8 avg_l__1 = 0, avg_c__1 = 0; + guint8 avg_s_l, avg_s_c; + guint8 avg_sc_l, avg_sc_c; + guint8 best_l, best_c; + guint16 mov_l; + guint8 out_l, out_c; + guint8 l2_l, l2_c, lp2_l, lp2_c; + guint8 l2_l_diff, l2_c_diff, lp2_l_diff, lp2_c_diff; + guint8 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; + + width /= 2; + for (Pos = 0; Pos < width; Pos++) { + l1_l = L1[1]; + l1_c = L1[0]; + l3_l = L3[1]; + l3_c = L3[0]; + + if (Pos == width - 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[3]; + l1_1_c = L1[2]; + l3_1_l = L3[3]; + l3_1_c = L3[2]; + } + + /* 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[1]; + l2_c = L2[0]; + lp2_l = L2P[1]; + lp2_c = L2P[0]; + + 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[1] = out_l; + Dest[0] = out_c; + + Dest += 2; + L1 += 2; + L2 += 2; + L3 += 2; + L2P += 2; + } +} + +static void +greedyh_scanline_C_planar_y (GstDeinterlaceMethodGreedyH * self, + const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, + guint8 * Dest, gint width) +{ + gint Pos; + guint8 l1, l1_1, l3, l3_1; + guint8 avg, avg_1; + guint8 avg__1 = 0; + guint8 avg_s; + guint8 avg_sc; + guint8 best; + guint16 mov; + guint8 out; + guint8 l2, lp2; + guint8 l2_diff, lp2_diff; + guint8 min, max; + guint max_comb = self->max_comb; + guint motion_sense = self->motion_sense; + guint motion_threshold = self->motion_threshold; + + for (Pos = 0; Pos < width; Pos++) { + l1 = L1[0]; + l3 = L3[0]; + + if (Pos == width - 1) { + l1_1 = l1; + l3_1 = l3; + } else { + l1_1 = L1[1]; + l3_1 = L3[1]; + } + + /* Average of L1 and L3 */ + avg = (l1 + l3) / 2; + + if (Pos == 0) { + avg__1 = avg; + } + + /* Average of next L1 and next L3 */ + avg_1 = (l1_1 + l3_1) / 2; + + /* Calculate average of one pixel forward and previous */ + avg_s = (avg__1 + avg_1) / 2; + + /* Calculate average of center and surrounding pixels */ + avg_sc = (avg + avg_s) / 2; + + /* move forward */ + avg__1 = avg; + + /* Get best L2/L2P, i.e. least diff from above average */ + l2 = L2[0]; + lp2 = L2P[0]; + + l2_diff = ABS (l2 - avg_sc); + + lp2_diff = ABS (lp2 - avg_sc); + + if (l2_diff > lp2_diff) + best = lp2; + else + best = l2; + + /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */ + max = MAX (l1, l3); + min = MIN (l1, l3); + + if (max < 256 - max_comb) + max += max_comb; + else + max = 255; + + if (min > max_comb) + min -= max_comb; + else + min = 0; + + out = CLAMP (best, min, max); + + /* Do motion compensation for luma, i.e. how much + * the weave pixel differs */ + mov = ABS (l2 - lp2); + if (mov > motion_threshold) + mov -= motion_threshold; + else + mov = 0; + + mov = mov * motion_sense; + if (mov > 256) + mov = 256; + + /* Weighted sum on clipped weave pixel and average */ + out = (out * (256 - mov) + avg_sc * mov) / 256; + + Dest[0] = out; + + Dest += 1; + L1 += 1; + L2 += 1; + L3 += 1; + L2P += 1; + } +} + +static void +greedyh_scanline_C_planar_uv (GstDeinterlaceMethodGreedyH * self, + const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, + guint8 * Dest, gint width) +{ + gint Pos; + guint8 l1, l1_1, l3, l3_1; + guint8 avg, avg_1; + guint8 avg__1 = 0; + guint8 avg_s; + guint8 avg_sc; + guint8 best; + guint8 out; + guint8 l2, lp2; + guint8 l2_diff, lp2_diff; + guint8 min, max; + guint max_comb = self->max_comb; + + for (Pos = 0; Pos < width; Pos++) { + l1 = L1[0]; + l3 = L3[0]; + + if (Pos == width - 1) { + l1_1 = l1; + l3_1 = l3; + } else { + l1_1 = L1[1]; + l3_1 = L3[1]; + } + + /* Average of L1 and L3 */ + avg = (l1 + l3) / 2; + + if (Pos == 0) { + avg__1 = avg; + } + + /* Average of next L1 and next L3 */ + avg_1 = (l1_1 + l3_1) / 2; + + /* Calculate average of one pixel forward and previous */ + avg_s = (avg__1 + avg_1) / 2; + + /* Calculate average of center and surrounding pixels */ + avg_sc = (avg + avg_s) / 2; + + /* move forward */ + avg__1 = avg; + + /* Get best L2/L2P, i.e. least diff from above average */ + l2 = L2[0]; + lp2 = L2P[0]; + + l2_diff = ABS (l2 - avg_sc); + + lp2_diff = ABS (lp2 - avg_sc); + + if (l2_diff > lp2_diff) + best = lp2; + else + best = l2; + + /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */ + max = MAX (l1, l3); + min = MIN (l1, l3); + + if (max < 256 - max_comb) + max += max_comb; + else + max = 255; + + if (min > max_comb) + min -= max_comb; + else + min = 0; + + out = CLAMP (best, min, max); + + Dest[0] = out; + + Dest += 1; + L1 += 1; + L2 += 1; + L3 += 1; + L2P += 1; + } +} + +#ifdef BUILD_X86_ASM + +#define IS_MMXEXT +#define SIMD_TYPE MMXEXT +#define C_FUNCT_YUY2 greedyh_scanline_C_yuy2 +#define C_FUNCT_UYVY greedyh_scanline_C_uyvy +#define C_FUNCT_PLANAR_Y greedyh_scanline_C_planar_y +#define C_FUNCT_PLANAR_UV greedyh_scanline_C_planar_uv +#define FUNCT_NAME_YUY2 greedyh_scanline_MMXEXT_yuy2 +#define FUNCT_NAME_UYVY greedyh_scanline_MMXEXT_uyvy +#define FUNCT_NAME_PLANAR_Y greedyh_scanline_MMXEXT_planar_y +#define FUNCT_NAME_PLANAR_UV greedyh_scanline_MMXEXT_planar_uv +#include "greedyh.asm" +#undef SIMD_TYPE +#undef IS_MMXEXT +#undef FUNCT_NAME_YUY2 +#undef FUNCT_NAME_UYVY +#undef FUNCT_NAME_PLANAR_Y +#undef FUNCT_NAME_PLANAR_UV + +#define IS_3DNOW +#define SIMD_TYPE 3DNOW +#define FUNCT_NAME_YUY2 greedyh_scanline_3DNOW_yuy2 +#define FUNCT_NAME_UYVY greedyh_scanline_3DNOW_uyvy +#define FUNCT_NAME_PLANAR_Y greedyh_scanline_3DNOW_planar_y +#define FUNCT_NAME_PLANAR_UV greedyh_scanline_3DNOW_planar_uv +#include "greedyh.asm" +#undef SIMD_TYPE +#undef IS_3DNOW +#undef FUNCT_NAME_YUY2 +#undef FUNCT_NAME_UYVY +#undef FUNCT_NAME_PLANAR_Y +#undef FUNCT_NAME_PLANAR_UV + +#define IS_MMX +#define SIMD_TYPE MMX +#define FUNCT_NAME_YUY2 greedyh_scanline_MMX_yuy2 +#define FUNCT_NAME_UYVY greedyh_scanline_MMX_uyvy +#define FUNCT_NAME_PLANAR_Y greedyh_scanline_MMX_planar_y +#define FUNCT_NAME_PLANAR_UV greedyh_scanline_MMX_planar_uv +#include "greedyh.asm" +#undef SIMD_TYPE +#undef IS_MMX +#undef FUNCT_NAME_YUY2 +#undef FUNCT_NAME_UYVY +#undef FUNCT_NAME_PLANAR_Y +#undef FUNCT_NAME_PLANAR_UV +#undef C_FUNCT_YUY2 +#undef C_FUNCT_PLANAR_Y +#undef C_FUNCT_PLANAR_UV + +#endif + +static void +deinterlace_frame_di_greedyh_packed (GstDeinterlaceMethod * method, + const GstDeinterlaceField * history, guint history_count, + GstBuffer * outbuf, int cur_field_idx) +{ + GstDeinterlaceMethodGreedyH *self = GST_DEINTERLACE_METHOD_GREEDY_H (method); + GstDeinterlaceMethodGreedyHClass *klass = + GST_DEINTERLACE_METHOD_GREEDY_H_GET_CLASS (self); + gint InfoIsOdd = 0; + gint Line; + gint RowStride = method->row_stride[0]; + gint FieldHeight = method->frame_height / 2; + gint Pitch = method->row_stride[0] * 2; + const guint8 *L1; // ptr to Line1, of 3 + const guint8 *L2; // ptr to Line2, the weave line + const guint8 *L3; // ptr to Line3 + const guint8 *L2P; // ptr to prev Line2 + guint8 *Dest = GST_BUFFER_DATA (outbuf); + ScanlineFunction scanline; + + if (cur_field_idx + 2 > history_count || cur_field_idx < 1) { + GstDeinterlaceMethod *backup_method; + + backup_method = g_object_new (gst_deinterlace_method_linear_get_type (), + NULL); + + gst_deinterlace_method_setup (backup_method, method->format, + method->frame_width, method->frame_height); + gst_deinterlace_method_deinterlace_frame (backup_method, + history, history_count, outbuf, cur_field_idx); + + g_object_unref (backup_method); + return; + } + + cur_field_idx += 2; + + switch (method->format) { + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_YVYU: + scanline = klass->scanline_yuy2; + break; + case GST_VIDEO_FORMAT_UYVY: + scanline = klass->scanline_uyvy; + break; + case GST_VIDEO_FORMAT_AYUV: + scanline = klass->scanline_ayuv; + break; + default: + g_assert_not_reached (); + return; + } + + // 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 (history[cur_field_idx - 1].flags == PICTURE_INTERLACED_BOTTOM) { + InfoIsOdd = 1; + + L1 = GST_BUFFER_DATA (history[cur_field_idx - 2].buf); + if (history[cur_field_idx - 2].flags & PICTURE_INTERLACED_BOTTOM) + L1 += RowStride; + + L2 = GST_BUFFER_DATA (history[cur_field_idx - 1].buf); + if (history[cur_field_idx - 1].flags & PICTURE_INTERLACED_BOTTOM) + L2 += RowStride; + + L3 = L1 + Pitch; + L2P = GST_BUFFER_DATA (history[cur_field_idx - 3].buf); + if (history[cur_field_idx - 3].flags & PICTURE_INTERLACED_BOTTOM) + L2P += RowStride; + + // copy first even line + memcpy (Dest, L1, RowStride); + Dest += RowStride; + } else { + InfoIsOdd = 0; + L1 = GST_BUFFER_DATA (history[cur_field_idx - 2].buf); + if (history[cur_field_idx - 2].flags & PICTURE_INTERLACED_BOTTOM) + L1 += RowStride; + + L2 = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + Pitch; + if (history[cur_field_idx - 1].flags & PICTURE_INTERLACED_BOTTOM) + L2 += RowStride; + + L3 = L1 + Pitch; + L2P = GST_BUFFER_DATA (history[cur_field_idx - 3].buf) + Pitch; + if (history[cur_field_idx - 3].flags & PICTURE_INTERLACED_BOTTOM) + L2P += RowStride; + + // copy first even line + memcpy (Dest, L1, RowStride); + Dest += RowStride; + // then first odd line + memcpy (Dest, L1, RowStride); + Dest += RowStride; + } + + for (Line = 0; Line < (FieldHeight - 1); ++Line) { + scanline (self, L1, L2, L3, L2P, Dest, RowStride); + Dest += RowStride; + memcpy (Dest, L3, RowStride); + Dest += RowStride; + + L1 += Pitch; + L2 += Pitch; + L3 += Pitch; + L2P += Pitch; + } + + if (InfoIsOdd) { + memcpy (Dest, L2, RowStride); + } +} + +static void +deinterlace_frame_di_greedyh_planar_plane (GstDeinterlaceMethodGreedyH * self, + const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, + guint8 * Dest, gint RowStride, gint FieldHeight, gint Pitch, gint InfoIsOdd, + ScanlineFunction scanline) +{ + gint Line; + + // 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 (InfoIsOdd) { + // copy first even line + memcpy (Dest, L1, RowStride); + Dest += RowStride; + } else { + // copy first even line + memcpy (Dest, L1, RowStride); + Dest += RowStride; + // then first odd line + memcpy (Dest, L1, RowStride); + Dest += RowStride; + } + + for (Line = 0; Line < (FieldHeight - 1); ++Line) { + scanline (self, L1, L2, L3, L2P, Dest, RowStride); + Dest += RowStride; + memcpy (Dest, L3, RowStride); + Dest += RowStride; + + L1 += Pitch; + L2 += Pitch; + L3 += Pitch; + L2P += Pitch; + } + + if (InfoIsOdd) { + memcpy (Dest, L2, RowStride); + } +} + +static void +deinterlace_frame_di_greedyh_planar (GstDeinterlaceMethod * method, + const GstDeinterlaceField * history, guint history_count, + GstBuffer * outbuf, int cur_field_idx) +{ + GstDeinterlaceMethodGreedyH *self = GST_DEINTERLACE_METHOD_GREEDY_H (method); + GstDeinterlaceMethodGreedyHClass *klass = + GST_DEINTERLACE_METHOD_GREEDY_H_GET_CLASS (self); + gint InfoIsOdd; + gint RowStride; + gint FieldHeight; + gint Pitch; + const guint8 *L1; // ptr to Line1, of 3 + const guint8 *L2; // ptr to Line2, the weave line + const guint8 *L3; // ptr to Line3 + const guint8 *L2P; // ptr to prev Line2 + guint8 *Dest; + gint i; + gint Offset; + ScanlineFunction scanline; + + if (cur_field_idx + 2 > history_count || cur_field_idx < 1) { + GstDeinterlaceMethod *backup_method; + + backup_method = g_object_new (gst_deinterlace_method_linear_get_type (), + NULL); + + gst_deinterlace_method_setup (backup_method, method->format, + method->frame_width, method->frame_height); + gst_deinterlace_method_deinterlace_frame (backup_method, + history, history_count, outbuf, cur_field_idx); + + g_object_unref (backup_method); + return; + } + + cur_field_idx += 2; + + for (i = 0; i < 3; i++) { + Offset = method->offset[i]; + + InfoIsOdd = (history[cur_field_idx - 1].flags == PICTURE_INTERLACED_BOTTOM); + RowStride = method->row_stride[i]; + FieldHeight = method->height[i] / 2; + Pitch = method->row_stride[i] * 2; + + if (i == 0) + scanline = klass->scanline_planar_y; + else + scanline = klass->scanline_planar_uv; + + Dest = GST_BUFFER_DATA (outbuf) + Offset; + + L1 = GST_BUFFER_DATA (history[cur_field_idx - 2].buf) + Offset; + if (history[cur_field_idx - 2].flags & PICTURE_INTERLACED_BOTTOM) + L1 += RowStride; + + L2 = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + Offset; + if (history[cur_field_idx - 1].flags & PICTURE_INTERLACED_BOTTOM) + L2 += RowStride; + + L3 = L1 + Pitch; + L2P = GST_BUFFER_DATA (history[cur_field_idx - 3].buf) + Offset; + if (history[cur_field_idx - 3].flags & PICTURE_INTERLACED_BOTTOM) + L2P += RowStride; + + deinterlace_frame_di_greedyh_planar_plane (self, L1, L2, L3, L2P, Dest, + RowStride, FieldHeight, Pitch, InfoIsOdd, scanline); + } +} + +G_DEFINE_TYPE (GstDeinterlaceMethodGreedyH, gst_deinterlace_method_greedy_h, + GST_TYPE_DEINTERLACE_METHOD); + +enum +{ + PROP_0, + PROP_MAX_COMB, + PROP_MOTION_THRESHOLD, + PROP_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 PROP_MAX_COMB: + self->max_comb = g_value_get_uint (value); + break; + case PROP_MOTION_THRESHOLD: + self->motion_threshold = g_value_get_uint (value); + break; + case PROP_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 PROP_MAX_COMB: + g_value_set_uint (value, self->max_comb); + break; + case PROP_MOTION_THRESHOLD: + g_value_set_uint (value, self->motion_threshold); + break; + case PROP_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 = + orc_target_get_default_flags (orc_target_get_by_name ("mmx")); +#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, PROP_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, PROP_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, PROP_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->name = "Motion Adaptive: Advanced Detection"; + dim_class->nick = "greedyh"; + dim_class->latency = 1; + + dim_class->deinterlace_frame_yuy2 = deinterlace_frame_di_greedyh_packed; + dim_class->deinterlace_frame_yvyu = deinterlace_frame_di_greedyh_packed; + dim_class->deinterlace_frame_uyvy = deinterlace_frame_di_greedyh_packed; + dim_class->deinterlace_frame_ayuv = deinterlace_frame_di_greedyh_packed; + dim_class->deinterlace_frame_y444 = deinterlace_frame_di_greedyh_planar; + dim_class->deinterlace_frame_i420 = deinterlace_frame_di_greedyh_planar; + dim_class->deinterlace_frame_yv12 = deinterlace_frame_di_greedyh_planar; + dim_class->deinterlace_frame_y42b = deinterlace_frame_di_greedyh_planar; + dim_class->deinterlace_frame_y41b = deinterlace_frame_di_greedyh_planar; + +#ifdef BUILD_X86_ASM + if (cpu_flags & ORC_TARGET_MMX_MMXEXT) { + klass->scanline_yuy2 = greedyh_scanline_MMXEXT_yuy2; + klass->scanline_uyvy = greedyh_scanline_MMXEXT_uyvy; + } else if (cpu_flags & ORC_TARGET_MMX_3DNOW) { + klass->scanline_yuy2 = greedyh_scanline_3DNOW_yuy2; + klass->scanline_uyvy = greedyh_scanline_3DNOW_uyvy; + } else if (cpu_flags & ORC_TARGET_MMX_MMX) { + klass->scanline_yuy2 = greedyh_scanline_MMX_yuy2; + klass->scanline_uyvy = greedyh_scanline_MMX_uyvy; + } else { + klass->scanline_yuy2 = greedyh_scanline_C_yuy2; + klass->scanline_uyvy = greedyh_scanline_C_uyvy; + } +#else + klass->scanline_yuy2 = greedyh_scanline_C_yuy2; + klass->scanline_uyvy = greedyh_scanline_C_uyvy; +#endif + /* TODO: MMX implementation of these two */ + klass->scanline_ayuv = greedyh_scanline_C_ayuv; + klass->scanline_planar_y = greedyh_scanline_C_planar_y; + klass->scanline_planar_uv = greedyh_scanline_C_planar_uv; +} + +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/deinterlace/tvtime/greedyhmacros.h b/gst/deinterlace/tvtime/greedyhmacros.h new file mode 100644 index 0000000..6f7be93 --- /dev/null +++ b/gst/deinterlace/tvtime/greedyhmacros.h @@ -0,0 +1,83 @@ +/* + * GStreamer + * Copyright (c) 2001 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 + */ + +// 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/deinterlace/tvtime/linear.c b/gst/deinterlace/tvtime/linear.c new file mode 100644 index 0000000..05dac45 --- /dev/null +++ b/gst/deinterlace/tvtime/linear.c @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2002 Billy Biggs . + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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. + */ + +/* + * 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 "gstdeinterlacemethod.h" +#include +#ifdef HAVE_ORC +#include +#endif +#include "tvtime.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 (GstDeinterlaceSimpleMethod * self, + guint8 * out, const guint8 * s1, const guint8 * s2, gint size) +{ + deinterlace_line_linear (out, s1, s2, size); +} + +static void +deinterlace_scanline_linear_packed_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0, + self->parent.row_stride[0]); +} + +static void +deinterlace_scanline_linear_planar_y_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0, + self->parent.row_stride[0]); +} + +static void +deinterlace_scanline_linear_planar_u_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0, + self->parent.row_stride[1]); +} + +static void +deinterlace_scanline_linear_planar_v_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0, + self->parent.row_stride[2]); +} + +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; + + dim_class->fields_required = 1; + dim_class->name = "Television: Full resolution"; + dim_class->nick = "linear"; + dim_class->latency = 0; + + dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_yvyu = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_uyvy = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_ayuv = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_argb = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_abgr = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_rgba = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_bgra = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_rgb = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_bgr = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_nv12 = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_nv21 = deinterlace_scanline_linear_packed_c; + dism_class->interpolate_scanline_planar_y = + deinterlace_scanline_linear_planar_y_c; + dism_class->interpolate_scanline_planar_u = + deinterlace_scanline_linear_planar_u_c; + dism_class->interpolate_scanline_planar_v = + deinterlace_scanline_linear_planar_v_c; + +} + +static void +gst_deinterlace_method_linear_init (GstDeinterlaceMethodLinear * self) +{ +} diff --git a/gst/deinterlace/tvtime/linearblend.c b/gst/deinterlace/tvtime/linearblend.c new file mode 100644 index 0000000..189e1aa --- /dev/null +++ b/gst/deinterlace/tvtime/linearblend.c @@ -0,0 +1,214 @@ +/* + * 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 . + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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. + */ + +/* + * 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 "gstdeinterlacemethod.h" +#include +#ifdef HAVE_ORC +#include +#endif +#include "tvtime.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 (GstDeinterlaceSimpleMethod * self, + guint8 * out, const guint8 * t0, const guint8 * b0, const guint8 * m1, + gint size) +{ + if (m1 == NULL) { + deinterlace_line_linear (out, t0, b0, size); + } else { + deinterlace_line_linear_blend (out, t0, b0, m1, size); + } +} + +static void +deinterlace_scanline_linear_blend_packed_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0, + scanlines->m1, self->parent.row_stride[0]); +} + +static void +deinterlace_scanline_linear_blend_planar_y_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0, + scanlines->m1, self->parent.row_stride[0]); +} + +static void +deinterlace_scanline_linear_blend_planar_u_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0, + scanlines->m1, self->parent.row_stride[1]); +} + +static void +deinterlace_scanline_linear_blend_planar_v_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0, + scanlines->m1, self->parent.row_stride[2]); +} + +static inline void +deinterlace_scanline_linear_blend2_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const guint8 * m0, const guint8 * t1, const guint8 * b1, + gint size) +{ + if (t1 == NULL) { + memcpy (out, m0, size); + } else { + deinterlace_line_linear_blend (out, t1, b1, m0, size); + } +} + +static void +deinterlace_scanline_linear_blend2_packed_c (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1, + scanlines->b1, self->parent.row_stride[0]); +} + +static void +deinterlace_scanline_linear_blend2_planar_y_c (GstDeinterlaceSimpleMethod * + self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1, + scanlines->b1, self->parent.row_stride[0]); +} + +static void +deinterlace_scanline_linear_blend2_planar_u_c (GstDeinterlaceSimpleMethod * + self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1, + scanlines->b1, self->parent.row_stride[1]); +} + +static void +deinterlace_scanline_linear_blend2_planar_v_c (GstDeinterlaceSimpleMethod * + self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1, + scanlines->b1, self->parent.row_stride[2]); +} + +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; + + dim_class->fields_required = 2; + dim_class->name = "Blur: Temporal"; + dim_class->nick = "linearblend"; + dim_class->latency = 1; + + dism_class->interpolate_scanline_yuy2 = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_yvyu = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_uyvy = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_ayuv = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_argb = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_rgba = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_abgr = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_bgra = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_rgb = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_bgr = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_nv12 = + deinterlace_scanline_linear_blend_packed_c; + dism_class->interpolate_scanline_nv21 = + deinterlace_scanline_linear_blend_packed_c; + + dism_class->interpolate_scanline_planar_y = + deinterlace_scanline_linear_blend_planar_y_c; + dism_class->interpolate_scanline_planar_u = + deinterlace_scanline_linear_blend_planar_u_c; + dism_class->interpolate_scanline_planar_v = + deinterlace_scanline_linear_blend_planar_v_c; + + dism_class->copy_scanline_yuy2 = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_yvyu = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_uyvy = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_ayuv = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_argb = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_abgr = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_rgba = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_bgra = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_rgb = deinterlace_scanline_linear_blend2_packed_c; + dism_class->copy_scanline_bgr = deinterlace_scanline_linear_blend2_packed_c; + + dism_class->copy_scanline_planar_y = + deinterlace_scanline_linear_blend2_planar_y_c; + dism_class->copy_scanline_planar_u = + deinterlace_scanline_linear_blend2_planar_u_c; + dism_class->copy_scanline_planar_v = + deinterlace_scanline_linear_blend2_planar_v_c; + +} + +static void +gst_deinterlace_method_linear_blend_init (GstDeinterlaceMethodLinearBlend * + self) +{ +} diff --git a/gst/deinterlace/tvtime/mmx.h b/gst/deinterlace/tvtime/mmx.h new file mode 100644 index 0000000..b0e582b --- /dev/null +++ b/gst/deinterlace/tvtime/mmx.h @@ -0,0 +1,723 @@ +/* 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... +*/ +static inline 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... +*/ +static inline 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 + +#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/deinterlace/tvtime/plugins.h b/gst/deinterlace/tvtime/plugins.h new file mode 100644 index 0000000..8fb01af --- /dev/null +++ b/gst/deinterlace/tvtime/plugins.h @@ -0,0 +1,54 @@ +/* + * + * GStreamer + * Copyright (C) 2004 Billy Biggs + * Copyright (C) 2008 Sebastian Dröge + * + * 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/deinterlace/tvtime/scalerbob.c b/gst/deinterlace/tvtime/scalerbob.c new file mode 100644 index 0000000..adc285a --- /dev/null +++ b/gst/deinterlace/tvtime/scalerbob.c @@ -0,0 +1,118 @@ +/* + * Double lines + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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 "gstdeinterlacemethod.h" +#include + +#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_packed (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->t0, self->parent.row_stride[0]); +} + +static void +deinterlace_scanline_scaler_bob_planar_y (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->t0, self->parent.row_stride[0]); +} + +static void +deinterlace_scanline_scaler_bob_planar_u (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->t0, self->parent.row_stride[1]); +} + +static void +deinterlace_scanline_scaler_bob_planar_v (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->t0, self->parent.row_stride[2]); +} + +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 = 2; + dim_class->name = "Double lines"; + dim_class->nick = "scalerbob"; + dim_class->latency = 1; + + dism_class->interpolate_scanline_ayuv = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_yuy2 = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_yvyu = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_uyvy = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_nv12 = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_nv21 = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_argb = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_abgr = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_rgba = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_bgra = + deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_rgb = deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_bgr = deinterlace_scanline_scaler_bob_packed; + dism_class->interpolate_scanline_planar_y = + deinterlace_scanline_scaler_bob_planar_y; + dism_class->interpolate_scanline_planar_u = + deinterlace_scanline_scaler_bob_planar_u; + dism_class->interpolate_scanline_planar_v = + deinterlace_scanline_scaler_bob_planar_v; +} + +static void +gst_deinterlace_method_scaler_bob_init (GstDeinterlaceMethodScalerBob * self) +{ +} diff --git a/gst/deinterlace/tvtime/sse.h b/gst/deinterlace/tvtime/sse.h new file mode 100644 index 0000000..2e00ee0 --- /dev/null +++ b/gst/deinterlace/tvtime/sse.h @@ -0,0 +1,992 @@ +/* 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 + +#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/deinterlace/tvtime/tomsmocomp.c b/gst/deinterlace/tvtime/tomsmocomp.c new file mode 100644 index 0000000..280abe8 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp.c @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2004 Billy Biggs + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include +#ifdef HAVE_ORC +#include +#endif +#include "gstdeinterlacemethod.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)) + +typedef struct +{ + GstDeinterlaceMethod parent; + + guint search_effort; + gboolean strange_bob; +} GstDeinterlaceMethodTomsMoComp; + +typedef GstDeinterlaceMethodClass GstDeinterlaceMethodTomsMoCompClass; + +static void +Fieldcopy (guint8 * dest, const guint8 * src, gint count, + gint rows, gint dst_pitch, gint src_pitch) +{ + gint i; + + for (i = 0; i < rows; i++) { + memcpy (dest, src, count); + src += src_pitch; + dest += dst_pitch; + } +} + +#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 +{ + PROP_0, + PROP_SEARCH_EFFORT, + PROP_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 PROP_SEARCH_EFFORT: + self->search_effort = g_value_get_uint (value); + break; + case PROP_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 PROP_SEARCH_EFFORT: + g_value_set_uint (value, self->search_effort); + break; + case PROP_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 = + orc_target_get_default_flags (orc_target_get_by_name ("mmx")); +#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, PROP_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, PROP_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 & ORC_TARGET_MMX_MMXEXT) { + dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_MMXEXT; + dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_MMXEXT; + } else if (cpu_flags & ORC_TARGET_MMX_3DNOW) { + dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_3DNOW; + dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_3DNOW; + } else if (cpu_flags & ORC_TARGET_MMX_MMX) { + dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_MMX; + dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_MMX; + } else { + dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_C; + dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_C; + } +#else + dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_C; + dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_C; +#endif +} + +static void +gst_deinterlace_method_tomsmocomp_init (GstDeinterlaceMethodTomsMoComp * self) +{ + self->search_effort = 5; + self->strange_bob = FALSE; +} diff --git a/gst/deinterlace/tvtime/tomsmocomp/SearchLoop0A.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoop0A.inc new file mode 100644 index 0000000..b1d9aec --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoop0A.inc @@ -0,0 +1,15 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/SearchLoopBottom.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopBottom.inc new file mode 100644 index 0000000..e156035 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopBottom.inc @@ -0,0 +1,174 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA.inc new file mode 100644 index 0000000..6208fe8 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA.inc @@ -0,0 +1,11 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA8.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA8.inc new file mode 100644 index 0000000..2841c3f --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA8.inc @@ -0,0 +1,12 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/SearchLoopOddA.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA.inc new file mode 100644 index 0000000..ab5375f --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA.inc @@ -0,0 +1,10 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/SearchLoopOddA2.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA2.inc new file mode 100644 index 0000000..fd3f6fb --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA2.inc @@ -0,0 +1,5 @@ +// 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/deinterlace/tvtime/tomsmocomp/SearchLoopOddA6.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA6.inc new file mode 100644 index 0000000..cbae014 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA6.inc @@ -0,0 +1,11 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH.inc new file mode 100644 index 0000000..e59e3c7 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH.inc @@ -0,0 +1,10 @@ +// 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/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH2.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH2.inc new file mode 100644 index 0000000..cd7d812 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH2.inc @@ -0,0 +1,5 @@ +// 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/deinterlace/tvtime/tomsmocomp/SearchLoopTop.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopTop.inc new file mode 100644 index 0000000..9d6a490 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopTop.inc @@ -0,0 +1,254 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/SearchLoopVA.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopVA.inc new file mode 100644 index 0000000..3e3d19b --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopVA.inc @@ -0,0 +1,6 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/SearchLoopVAH.inc b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopVAH.inc new file mode 100644 index 0000000..33155bc --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/SearchLoopVAH.inc @@ -0,0 +1,6 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/StrangeBob.inc b/gst/deinterlace/tvtime/tomsmocomp/StrangeBob.inc new file mode 100644 index 0000000..45b4c86 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/StrangeBob.inc @@ -0,0 +1,435 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc b/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc new file mode 100644 index 0000000..f8ffe1e --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc @@ -0,0 +1,266 @@ +/* + * 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 + +static void FUNCT_NAME(GstDeinterlaceMethod *d_method, + const GstDeinterlaceField* history, guint history_count, + GstBuffer *outbuf, int cur_field_idx) +{ + GstDeinterlaceMethodTomsMoComp *self = GST_DEINTERLACE_METHOD_TOMSMOCOMP (d_method); + glong SearchEffort = self->search_effort; + gint UseStrangeBob = self->strange_bob; + gint IsOdd; + const guint8 *pWeaveSrc; + const guint8 *pWeaveSrcP; + guint8 *pWeaveDest; + const guint8 *pCopySrc; + const guint8 *pCopySrcP; + guint8 *pCopyDest; + gint src_pitch; + gint dst_pitch; + gint rowsize; + gint FldHeight; + + if (cur_field_idx + 2 > history_count || cur_field_idx < 1) { + GstDeinterlaceMethod *backup_method; + + backup_method = g_object_new (gst_deinterlace_method_linear_get_type(), + NULL); + + gst_deinterlace_method_setup (backup_method, d_method->format, + d_method->frame_width, d_method->frame_height); + gst_deinterlace_method_deinterlace_frame (backup_method, + history, history_count, outbuf, cur_field_idx); + + g_object_unref (backup_method); + return; + } + + /* double stride do address just every odd/even scanline */ + src_pitch = self->parent.row_stride[0]*2; + dst_pitch = self->parent.row_stride[0]; + rowsize = self->parent.row_stride[0]; + FldHeight = self->parent.frame_height / 2; + + pCopySrc = GST_BUFFER_DATA(history[history_count-1].buf); + if (history[history_count - 1].flags & PICTURE_INTERLACED_BOTTOM) + pCopySrc += rowsize; + pCopySrcP = GST_BUFFER_DATA(history[history_count-3].buf); + if (history[history_count - 3].flags & PICTURE_INTERLACED_BOTTOM) + pCopySrcP += rowsize; + pWeaveSrc = GST_BUFFER_DATA(history[history_count-2].buf); + if (history[history_count - 2].flags & PICTURE_INTERLACED_BOTTOM) + pWeaveSrc += rowsize; + pWeaveSrcP = GST_BUFFER_DATA(history[history_count-4].buf); + if (history[history_count - 4].flags & PICTURE_INTERLACED_BOTTOM) + pWeaveSrcP += rowsize; + + /* use bottom field and interlace top field */ + if (history[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/deinterlace/tvtime/tomsmocomp/TomsMoCompAll2.inc b/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll2.inc new file mode 100644 index 0000000..f6344ea --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll2.inc @@ -0,0 +1,243 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/WierdBob.inc b/gst/deinterlace/tvtime/tomsmocomp/WierdBob.inc new file mode 100644 index 0000000..f4bbb83 --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/WierdBob.inc @@ -0,0 +1,286 @@ +// -*- 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/deinterlace/tvtime/tomsmocomp/tomsmocompmacros.h b/gst/deinterlace/tvtime/tomsmocomp/tomsmocompmacros.h new file mode 100644 index 0000000..7e8147e --- /dev/null +++ b/gst/deinterlace/tvtime/tomsmocomp/tomsmocompmacros.h @@ -0,0 +1,164 @@ +#include +#include + +// 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/deinterlace/tvtime/vfir.c b/gst/deinterlace/tvtime/vfir.c new file mode 100644 index 0000000..6442a82 --- /dev/null +++ b/gst/deinterlace/tvtime/vfir.c @@ -0,0 +1,318 @@ +/* + * + * GStreamer + * Copyright (C) 2004 Billy Biggs + * Copyright (c) 2001, 2002, 2003 Fabrice Bellard. + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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 "gstdeinterlacemethod.h" +#include +#ifdef HAVE_ORC +#include +#endif +#include "tvtime.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_c (guint8 * dst, const guint8 * lum_m4, const guint8 * lum_m3, + const guint8 * lum_m2, const guint8 * lum_m1, const guint8 * lum, gint size) +{ + if (lum_m2 == NULL) { + deinterlace_line_linear (dst, lum_m1, lum_m3, size); + } else { + deinterlace_line_vfir (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); + } +} + +static void +deinterlace_line_packed_c (GstDeinterlaceSimpleMethod * self, guint8 * dst, + const GstDeinterlaceScanlineData * scanlines) +{ + const guint8 *lum_m4 = scanlines->tt1; + const guint8 *lum_m3 = scanlines->t0; + const guint8 *lum_m2 = scanlines->m1; + const guint8 *lum_m1 = scanlines->b0; + const guint8 *lum = scanlines->bb1; + gint size = self->parent.row_stride[0]; + + deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} + +static void +deinterlace_line_planar_y_c (GstDeinterlaceSimpleMethod * self, guint8 * dst, + const GstDeinterlaceScanlineData * scanlines) +{ + const guint8 *lum_m4 = scanlines->tt1; + const guint8 *lum_m3 = scanlines->t0; + const guint8 *lum_m2 = scanlines->m1; + const guint8 *lum_m1 = scanlines->b0; + const guint8 *lum = scanlines->bb1; + gint size = self->parent.row_stride[0]; + + deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} + +static void +deinterlace_line_planar_u_c (GstDeinterlaceSimpleMethod * self, guint8 * dst, + const GstDeinterlaceScanlineData * scanlines) +{ + const guint8 *lum_m4 = scanlines->tt1; + const guint8 *lum_m3 = scanlines->t0; + const guint8 *lum_m2 = scanlines->m1; + const guint8 *lum_m1 = scanlines->b0; + const guint8 *lum = scanlines->bb1; + gint size = self->parent.row_stride[1]; + + deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} + +static void +deinterlace_line_planar_v_c (GstDeinterlaceSimpleMethod * self, guint8 * dst, + const GstDeinterlaceScanlineData * scanlines) +{ + const guint8 *lum_m4 = scanlines->tt1; + const guint8 *lum_m3 = scanlines->t0; + const guint8 *lum_m2 = scanlines->m1; + const guint8 *lum_m1 = scanlines->b0; + const guint8 *lum = scanlines->bb1; + gint size = self->parent.row_stride[2]; + + deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} + +#undef BUILD_X86_ASM + +#ifdef BUILD_X86_ASM +#include "mmx.h" +static void +deinterlace_mmx (guint8 * dst, const guint8 * lum_m4, const guint8 * lum_m3, + const guint8 * lum_m2, const guint8 * lum_m1, const guint8 * lum, gint size) +{ + mmx_t rounder; + + 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 (; size > 3; size -= 4) { + 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 (size > 0) + deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} + +static void +deinterlace_line_packed_mmx (GstDeinterlaceSimpleMethod * self, guint8 * dst, + const GstDeinterlaceScanlineData * scanlines) +{ + const guint8 *lum_m4 = scanlines->tt1; + const guint8 *lum_m3 = scanlines->t0; + const guint8 *lum_m2 = scanlines->m1; + const guint8 *lum_m1 = scanlines->b0; + const guint8 *lum = scanlines->bb1; + gint size = self->parent.row_stride[0]; + + deinterlace_mmx (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} + +static void +deinterlace_line_planar_y_mmx (GstDeinterlaceSimpleMethod * self, guint8 * dst, + const GstDeinterlaceScanlineData * scanlines) +{ + const guint8 *lum_m4 = scanlines->tt1; + const guint8 *lum_m3 = scanlines->t0; + const guint8 *lum_m2 = scanlines->m1; + const guint8 *lum_m1 = scanlines->b0; + const guint8 *lum = scanlines->bb1; + gint size = self->parent.row_stride[0]; + + deinterlace_mmx (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} + +static void +deinterlace_line_planar_u_mmx (GstDeinterlaceSimpleMethod * self, guint8 * dst, + const GstDeinterlaceScanlineData * scanlines) +{ + const guint8 *lum_m4 = scanlines->tt1; + const guint8 *lum_m3 = scanlines->t0; + const guint8 *lum_m2 = scanlines->m1; + const guint8 *lum_m1 = scanlines->b0; + const guint8 *lum = scanlines->bb1; + gint size = self->parent.row_stride[1]; + + deinterlace_mmx (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} + +static void +deinterlace_line_planar_v_mmx (GstDeinterlaceSimpleMethod * self, guint8 * dst, + const GstDeinterlaceScanlineData * scanlines) +{ + const guint8 *lum_m4 = scanlines->tt1; + const guint8 *lum_m3 = scanlines->t0; + const guint8 *lum_m2 = scanlines->m1; + const guint8 *lum_m1 = scanlines->b0; + const guint8 *lum = scanlines->bb1; + gint size = self->parent.row_stride[2]; + + deinterlace_mmx (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); +} +#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 = + orc_target_get_default_flags (orc_target_get_by_name ("mmx")); +#endif + + dim_class->fields_required = 2; + dim_class->name = "Blur Vertical"; + dim_class->nick = "vfir"; + dim_class->latency = 1; + +#ifdef BUILD_X86_ASM + if (cpu_flags & ORC_TARGET_MMX_MMX) { + dism_class->interpolate_scanline_ayuv = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_yuy2 = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_nv21 = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_argb = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_abgr = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_rgba = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_bgra = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_rgb = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_bgr = deinterlace_line_packed_mmx; + dism_class->interpolate_scanline_planar_y = deinterlace_line_planar_y_mmx; + dism_class->interpolate_scanline_planar_u = deinterlace_line_planar_u_mmx; + dism_class->interpolate_scanline_planar_v = deinterlace_line_planar_v_mmx; + } else { + dism_class->interpolate_scanline_yuy2 = deinterlace_line_packed_c; + dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_c; + dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_c; + dism_class->interpolate_scanline_ayuv = deinterlace_line_packed_c; + dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_c; + dism_class->interpolate_scanline_nv21 = deinterlace_line_packed_c; + dism_class->interpolate_scanline_argb = deinterlace_line_packed_c; + dism_class->interpolate_scanline_abgr = deinterlace_line_packed_c; + dism_class->interpolate_scanline_rgba = deinterlace_line_packed_c; + dism_class->interpolate_scanline_bgra = deinterlace_line_packed_c; + dism_class->interpolate_scanline_rgb = deinterlace_line_packed_c; + dism_class->interpolate_scanline_bgr = deinterlace_line_packed_c; + dism_class->interpolate_scanline_planar_y = deinterlace_line_planar_y_c; + dism_class->interpolate_scanline_planar_u = deinterlace_line_planar_u_c; + dism_class->interpolate_scanline_planar_v = deinterlace_line_planar_v_c; + } +#else + dism_class->interpolate_scanline_ayuv = deinterlace_line_packed_c; + dism_class->interpolate_scanline_yuy2 = deinterlace_line_packed_c; + dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_c; + dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_c; + dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_c; + dism_class->interpolate_scanline_nv21 = deinterlace_line_packed_c; + dism_class->interpolate_scanline_argb = deinterlace_line_packed_c; + dism_class->interpolate_scanline_abgr = deinterlace_line_packed_c; + dism_class->interpolate_scanline_rgba = deinterlace_line_packed_c; + dism_class->interpolate_scanline_bgra = deinterlace_line_packed_c; + dism_class->interpolate_scanline_rgb = deinterlace_line_packed_c; + dism_class->interpolate_scanline_bgr = deinterlace_line_packed_c; + dism_class->interpolate_scanline_planar_y = deinterlace_line_planar_y_c; + dism_class->interpolate_scanline_planar_u = deinterlace_line_planar_u_c; + dism_class->interpolate_scanline_planar_v = deinterlace_line_planar_v_c; +#endif +} + +static void +gst_deinterlace_method_vfir_init (GstDeinterlaceMethodVFIR * self) +{ +} diff --git a/gst/deinterlace/tvtime/weave.c b/gst/deinterlace/tvtime/weave.c new file mode 100644 index 0000000..1501b1a --- /dev/null +++ b/gst/deinterlace/tvtime/weave.c @@ -0,0 +1,173 @@ +/* + * Weave frames + * Copyright (C) 2002 Billy Biggs . + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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. + */ + +/* + * 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 "gstdeinterlacemethod.h" +#include + +#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_packed (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->t0, self->parent.row_stride[0]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[0]); + } +} + +static void +deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->t0, self->parent.row_stride[0]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[0]); + } +} + +static void +deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->t0, self->parent.row_stride[1]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[1]); + } +} + +static void +deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->t0, self->parent.row_stride[2]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[2]); + } +} + +static void +copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void +copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void +copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[1]); +} + +static void +copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[2]); +} + +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 = 1; + + dism_class->interpolate_scanline_ayuv = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_nv21 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_bgra = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_rgb = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_bgr = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_planar_y = + deinterlace_scanline_weave_planar_y; + dism_class->interpolate_scanline_planar_u = + deinterlace_scanline_weave_planar_u; + dism_class->interpolate_scanline_planar_v = + deinterlace_scanline_weave_planar_v; + + dism_class->copy_scanline_ayuv = copy_scanline_packed; + dism_class->copy_scanline_yuy2 = copy_scanline_packed; + dism_class->copy_scanline_yvyu = copy_scanline_packed; + dism_class->copy_scanline_uyvy = copy_scanline_packed; + dism_class->copy_scanline_nv12 = copy_scanline_packed; + dism_class->copy_scanline_nv21 = copy_scanline_packed; + dism_class->copy_scanline_argb = copy_scanline_packed; + dism_class->copy_scanline_abgr = copy_scanline_packed; + dism_class->copy_scanline_rgba = copy_scanline_packed; + dism_class->copy_scanline_bgra = copy_scanline_packed; + dism_class->copy_scanline_rgb = copy_scanline_packed; + dism_class->copy_scanline_bgr = copy_scanline_packed; + dism_class->copy_scanline_planar_y = copy_scanline_planar_y; + dism_class->copy_scanline_planar_u = copy_scanline_planar_u; + dism_class->copy_scanline_planar_v = copy_scanline_planar_v; +} + +static void +gst_deinterlace_method_weave_init (GstDeinterlaceMethodWeave * self) +{ +} diff --git a/gst/deinterlace/tvtime/weavebff.c b/gst/deinterlace/tvtime/weavebff.c new file mode 100644 index 0000000..b11395c --- /dev/null +++ b/gst/deinterlace/tvtime/weavebff.c @@ -0,0 +1,174 @@ +/* + * Weave frames, bottom-field-first. + * Copyright (C) 2003 Billy Biggs . + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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. + */ + +/* + * 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 "gstdeinterlacemethod.h" +#include + +#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_packed (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->b0, self->parent.row_stride[0]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[0]); + } +} + +static void +deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->b0, self->parent.row_stride[0]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[0]); + } +} + +static void +deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->b0, self->parent.row_stride[1]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[1]); + } +} + +static void +deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->b0, self->parent.row_stride[2]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[2]); + } +} + +static void +copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void +copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void +copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[1]); +} + +static void +copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, + const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[2]); +} + +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 = 2; + dim_class->name = "Progressive: Bottom Field First"; + dim_class->nick = "weavebff"; + dim_class->latency = 1; + + dism_class->interpolate_scanline_ayuv = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_nv21 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_bgra = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_rgb = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_bgr = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_planar_y = + deinterlace_scanline_weave_planar_y; + dism_class->interpolate_scanline_planar_u = + deinterlace_scanline_weave_planar_u; + dism_class->interpolate_scanline_planar_v = + deinterlace_scanline_weave_planar_v; + + dism_class->copy_scanline_ayuv = copy_scanline_packed; + dism_class->copy_scanline_yuy2 = copy_scanline_packed; + dism_class->copy_scanline_yvyu = copy_scanline_packed; + dism_class->copy_scanline_uyvy = copy_scanline_packed; + dism_class->copy_scanline_nv12 = copy_scanline_packed; + dism_class->copy_scanline_nv21 = copy_scanline_packed; + dism_class->copy_scanline_argb = copy_scanline_packed; + dism_class->copy_scanline_abgr = copy_scanline_packed; + dism_class->copy_scanline_rgba = copy_scanline_packed; + dism_class->copy_scanline_bgra = copy_scanline_packed; + dism_class->copy_scanline_rgb = copy_scanline_packed; + dism_class->copy_scanline_bgr = copy_scanline_packed; + dism_class->copy_scanline_planar_y = copy_scanline_planar_y; + dism_class->copy_scanline_planar_u = copy_scanline_planar_u; + dism_class->copy_scanline_planar_v = copy_scanline_planar_v; +} + +static void +gst_deinterlace_method_weave_bff_init (GstDeinterlaceMethodWeaveBFF * self) +{ +} diff --git a/gst/deinterlace/tvtime/weavetff.c b/gst/deinterlace/tvtime/weavetff.c new file mode 100644 index 0000000..3c60613 --- /dev/null +++ b/gst/deinterlace/tvtime/weavetff.c @@ -0,0 +1,175 @@ +/* + * Weave frames, top-field-first. + * Copyright (C) 2003 Billy Biggs . + * Copyright (C) 2008,2010 Sebastian Dröge + * + * 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. + */ + +/* + * 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 "gstdeinterlacemethod.h" +#include + +#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_packed (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->t0, self->parent.row_stride[0]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[0]); + } +} + +static void +deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->t0, self->parent.row_stride[0]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[0]); + } +} + +static void +deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->t0, self->parent.row_stride[1]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[1]); + } +} + +static void +deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + if (scanlines->m1 == NULL) { + memcpy (out, scanlines->t0, self->parent.row_stride[2]); + } else { + memcpy (out, scanlines->m1, self->parent.row_stride[2]); + } +} + +static void +copy_scanline_packed (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void +copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[0]); +} + +static void +copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[1]); +} + +static void +copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, + guint8 * out, const GstDeinterlaceScanlineData * scanlines) +{ + memcpy (out, scanlines->m0, self->parent.row_stride[2]); +} + +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 = 2; + dim_class->name = "Progressive: Top Field First"; + dim_class->nick = "weavetff"; + dim_class->latency = 1; + + dism_class->interpolate_scanline_ayuv = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_nv21 = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_bgra = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_rgb = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_bgr = deinterlace_scanline_weave_packed; + dism_class->interpolate_scanline_planar_y = + deinterlace_scanline_weave_planar_y; + dism_class->interpolate_scanline_planar_u = + deinterlace_scanline_weave_planar_u; + dism_class->interpolate_scanline_planar_v = + deinterlace_scanline_weave_planar_v; + + dism_class->copy_scanline_ayuv = copy_scanline_packed; + dism_class->copy_scanline_yuy2 = copy_scanline_packed; + dism_class->copy_scanline_yvyu = copy_scanline_packed; + dism_class->copy_scanline_uyvy = copy_scanline_packed; + dism_class->copy_scanline_nv12 = copy_scanline_packed; + dism_class->copy_scanline_nv21 = copy_scanline_packed; + dism_class->copy_scanline_argb = copy_scanline_packed; + dism_class->copy_scanline_abgr = copy_scanline_packed; + dism_class->copy_scanline_rgba = copy_scanline_packed; + dism_class->copy_scanline_bgra = copy_scanline_packed; + dism_class->copy_scanline_rgb = copy_scanline_packed; + dism_class->copy_scanline_bgr = copy_scanline_packed; + dism_class->copy_scanline_planar_y = copy_scanline_planar_y; + dism_class->copy_scanline_planar_u = copy_scanline_planar_u; + dism_class->copy_scanline_planar_v = copy_scanline_planar_v; +} + +static void +gst_deinterlace_method_weave_tff_init (GstDeinterlaceMethodWeaveTFF * self) +{ +} diff --git a/gst/deinterlace/tvtime/x86-64_macros.inc b/gst/deinterlace/tvtime/x86-64_macros.inc new file mode 100644 index 0000000..2e9df75 --- /dev/null +++ b/gst/deinterlace/tvtime/x86-64_macros.inc @@ -0,0 +1,82 @@ +/* + * + * GStreamer + * Copyright (C) 2004 Dirk Ziegelmeier + * + * 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 + */ + +#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/effectv/Makefile.am b/gst/effectv/Makefile.am new file mode 100644 index 0000000..2fe3152 --- /dev/null +++ b/gst/effectv/Makefile.am @@ -0,0 +1,38 @@ +plugin_LTLIBRARIES = libgsteffectv.la + +libgsteffectv_la_SOURCES = \ + gsteffectv.c gstedge.c gstaging.c gstdice.c gstwarp.c \ + gstshagadelic.c gstvertigo.c gstrev.c gstquark.c gstop.c \ + gstradioac.c gststreak.c gstripple.c +libgsteffectv_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + -I$(top_srcdir)/gst/videofilter +libgsteffectv_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ + $(GST_CONTROLLER_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(LIBM) +libgsteffectv_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgsteffectv_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gsteffectv.h gstaging.h gstdice.h gstedge.h \ + gstquark.h gstrev.h gstshagadelic.h gstvertigo.h gstwarp.h gstop.h \ + gstradioac.h gststreak.h gstripple.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgsteffectv -:SHARED libgsteffectv \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgsteffectv_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsteffectv_la_CFLAGS) \ + -:LDFLAGS $(libgsteffectv_la_LDFLAGS) \ + $(libgsteffectv_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/effectv/Makefile.in b/gst/effectv/Makefile.in new file mode 100644 index 0000000..3a06acb --- /dev/null +++ b/gst/effectv/Makefile.in @@ -0,0 +1,942 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/effectv +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgsteffectv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgsteffectv_la_OBJECTS = libgsteffectv_la-gsteffectv.lo \ + libgsteffectv_la-gstedge.lo libgsteffectv_la-gstaging.lo \ + libgsteffectv_la-gstdice.lo libgsteffectv_la-gstwarp.lo \ + libgsteffectv_la-gstshagadelic.lo \ + libgsteffectv_la-gstvertigo.lo libgsteffectv_la-gstrev.lo \ + libgsteffectv_la-gstquark.lo libgsteffectv_la-gstop.lo \ + libgsteffectv_la-gstradioac.lo libgsteffectv_la-gststreak.lo \ + libgsteffectv_la-gstripple.lo +libgsteffectv_la_OBJECTS = $(am_libgsteffectv_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgsteffectv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgsteffectv_la_CFLAGS) $(CFLAGS) \ + $(libgsteffectv_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgsteffectv_la_SOURCES) +DIST_SOURCES = $(libgsteffectv_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgsteffectv.la +libgsteffectv_la_SOURCES = \ + gsteffectv.c gstedge.c gstaging.c gstdice.c gstwarp.c \ + gstshagadelic.c gstvertigo.c gstrev.c gstquark.c gstop.c \ + gstradioac.c gststreak.c gstripple.c + +libgsteffectv_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + -I$(top_srcdir)/gst/videofilter + +libgsteffectv_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ + $(GST_CONTROLLER_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(LIBM) + +libgsteffectv_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgsteffectv_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gsteffectv.h gstaging.h gstdice.h gstedge.h \ + gstquark.h gstrev.h gstshagadelic.h gstvertigo.h gstwarp.h gstop.h \ + gstradioac.h gststreak.h gstripple.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/effectv/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/effectv/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgsteffectv.la: $(libgsteffectv_la_OBJECTS) $(libgsteffectv_la_DEPENDENCIES) $(EXTRA_libgsteffectv_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgsteffectv_la_LINK) -rpath $(plugindir) $(libgsteffectv_la_OBJECTS) $(libgsteffectv_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstaging.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstdice.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstedge.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gsteffectv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstquark.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstradioac.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstrev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstripple.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstshagadelic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gststreak.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstvertigo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstwarp.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgsteffectv_la-gsteffectv.lo: gsteffectv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gsteffectv.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gsteffectv.Tpo -c -o libgsteffectv_la-gsteffectv.lo `test -f 'gsteffectv.c' || echo '$(srcdir)/'`gsteffectv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gsteffectv.Tpo $(DEPDIR)/libgsteffectv_la-gsteffectv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsteffectv.c' object='libgsteffectv_la-gsteffectv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gsteffectv.lo `test -f 'gsteffectv.c' || echo '$(srcdir)/'`gsteffectv.c + +libgsteffectv_la-gstedge.lo: gstedge.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstedge.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstedge.Tpo -c -o libgsteffectv_la-gstedge.lo `test -f 'gstedge.c' || echo '$(srcdir)/'`gstedge.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstedge.Tpo $(DEPDIR)/libgsteffectv_la-gstedge.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstedge.c' object='libgsteffectv_la-gstedge.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstedge.lo `test -f 'gstedge.c' || echo '$(srcdir)/'`gstedge.c + +libgsteffectv_la-gstaging.lo: gstaging.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstaging.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstaging.Tpo -c -o libgsteffectv_la-gstaging.lo `test -f 'gstaging.c' || echo '$(srcdir)/'`gstaging.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstaging.Tpo $(DEPDIR)/libgsteffectv_la-gstaging.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstaging.c' object='libgsteffectv_la-gstaging.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstaging.lo `test -f 'gstaging.c' || echo '$(srcdir)/'`gstaging.c + +libgsteffectv_la-gstdice.lo: gstdice.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstdice.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstdice.Tpo -c -o libgsteffectv_la-gstdice.lo `test -f 'gstdice.c' || echo '$(srcdir)/'`gstdice.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstdice.Tpo $(DEPDIR)/libgsteffectv_la-gstdice.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdice.c' object='libgsteffectv_la-gstdice.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstdice.lo `test -f 'gstdice.c' || echo '$(srcdir)/'`gstdice.c + +libgsteffectv_la-gstwarp.lo: gstwarp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstwarp.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstwarp.Tpo -c -o libgsteffectv_la-gstwarp.lo `test -f 'gstwarp.c' || echo '$(srcdir)/'`gstwarp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstwarp.Tpo $(DEPDIR)/libgsteffectv_la-gstwarp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwarp.c' object='libgsteffectv_la-gstwarp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstwarp.lo `test -f 'gstwarp.c' || echo '$(srcdir)/'`gstwarp.c + +libgsteffectv_la-gstshagadelic.lo: gstshagadelic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstshagadelic.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstshagadelic.Tpo -c -o libgsteffectv_la-gstshagadelic.lo `test -f 'gstshagadelic.c' || echo '$(srcdir)/'`gstshagadelic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstshagadelic.Tpo $(DEPDIR)/libgsteffectv_la-gstshagadelic.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstshagadelic.c' object='libgsteffectv_la-gstshagadelic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstshagadelic.lo `test -f 'gstshagadelic.c' || echo '$(srcdir)/'`gstshagadelic.c + +libgsteffectv_la-gstvertigo.lo: gstvertigo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstvertigo.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstvertigo.Tpo -c -o libgsteffectv_la-gstvertigo.lo `test -f 'gstvertigo.c' || echo '$(srcdir)/'`gstvertigo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstvertigo.Tpo $(DEPDIR)/libgsteffectv_la-gstvertigo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvertigo.c' object='libgsteffectv_la-gstvertigo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstvertigo.lo `test -f 'gstvertigo.c' || echo '$(srcdir)/'`gstvertigo.c + +libgsteffectv_la-gstrev.lo: gstrev.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstrev.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstrev.Tpo -c -o libgsteffectv_la-gstrev.lo `test -f 'gstrev.c' || echo '$(srcdir)/'`gstrev.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstrev.Tpo $(DEPDIR)/libgsteffectv_la-gstrev.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrev.c' object='libgsteffectv_la-gstrev.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstrev.lo `test -f 'gstrev.c' || echo '$(srcdir)/'`gstrev.c + +libgsteffectv_la-gstquark.lo: gstquark.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstquark.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstquark.Tpo -c -o libgsteffectv_la-gstquark.lo `test -f 'gstquark.c' || echo '$(srcdir)/'`gstquark.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstquark.Tpo $(DEPDIR)/libgsteffectv_la-gstquark.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstquark.c' object='libgsteffectv_la-gstquark.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstquark.lo `test -f 'gstquark.c' || echo '$(srcdir)/'`gstquark.c + +libgsteffectv_la-gstop.lo: gstop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstop.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstop.Tpo -c -o libgsteffectv_la-gstop.lo `test -f 'gstop.c' || echo '$(srcdir)/'`gstop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstop.Tpo $(DEPDIR)/libgsteffectv_la-gstop.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstop.c' object='libgsteffectv_la-gstop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstop.lo `test -f 'gstop.c' || echo '$(srcdir)/'`gstop.c + +libgsteffectv_la-gstradioac.lo: gstradioac.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstradioac.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstradioac.Tpo -c -o libgsteffectv_la-gstradioac.lo `test -f 'gstradioac.c' || echo '$(srcdir)/'`gstradioac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstradioac.Tpo $(DEPDIR)/libgsteffectv_la-gstradioac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstradioac.c' object='libgsteffectv_la-gstradioac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstradioac.lo `test -f 'gstradioac.c' || echo '$(srcdir)/'`gstradioac.c + +libgsteffectv_la-gststreak.lo: gststreak.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gststreak.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gststreak.Tpo -c -o libgsteffectv_la-gststreak.lo `test -f 'gststreak.c' || echo '$(srcdir)/'`gststreak.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gststreak.Tpo $(DEPDIR)/libgsteffectv_la-gststreak.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gststreak.c' object='libgsteffectv_la-gststreak.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gststreak.lo `test -f 'gststreak.c' || echo '$(srcdir)/'`gststreak.c + +libgsteffectv_la-gstripple.lo: gstripple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstripple.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstripple.Tpo -c -o libgsteffectv_la-gstripple.lo `test -f 'gstripple.c' || echo '$(srcdir)/'`gstripple.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstripple.Tpo $(DEPDIR)/libgsteffectv_la-gstripple.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstripple.c' object='libgsteffectv_la-gstripple.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstripple.lo `test -f 'gstripple.c' || echo '$(srcdir)/'`gstripple.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgsteffectv -:SHARED libgsteffectv \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgsteffectv_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsteffectv_la_CFLAGS) \ + -:LDFLAGS $(libgsteffectv_la_LDFLAGS) \ + $(libgsteffectv_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/effectv/gstaging.c b/gst/effectv/gstaging.c new file mode 100644 index 0000000..0661d02 --- /dev/null +++ b/gst/effectv/gstaging.c @@ -0,0 +1,428 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001-2002 FUKUCHI Kentarou + * + * AgingTV - film-aging effect. + * + * 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-agingtv + * + * AgingTV ages a video stream in realtime, changes the colors and adds + * scratches and dust. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! agingtv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of agingtv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstaging.h" +#include "gsteffectv.h" + +#include +#include + +static const gint dx[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; +static const gint dy[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; + +enum +{ + PROP_0 = 0, + PROP_SCRATCH_LINES, + PROP_COLOR_AGING, + PROP_PITS, + PROP_DUSTS +}; + +#define DEFAULT_SCRATCH_LINES 7 +#define DEFAULT_COLOR_AGING TRUE +#define DEFAULT_PITS TRUE +#define DEFAULT_DUSTS TRUE + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define CAPS_STR GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGBx +#else +#define CAPS_STR GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR +#endif + +static GstStaticPadTemplate gst_agingtv_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static GstStaticPadTemplate gst_agingtv_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +GST_BOILERPLATE (GstAgingTV, gst_agingtv, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +static gboolean +gst_agingtv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstAgingTV *filter = GST_AGINGTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static void +coloraging (guint32 * src, guint32 * dest, gint video_area, gint * c) +{ + guint32 a, b; + gint i; + gint c_tmp = *c; + + c_tmp -= (gint) (fastrand ()) >> 28; + if (c_tmp < 0) + c_tmp = 0; + if (c_tmp > 0x18) + c_tmp = 0x18; + + for (i = 0; i < video_area; i++) { + a = *src++; + b = (a & 0xfcfcfc) >> 2; + *dest++ = + a - b + (c_tmp | (c_tmp << 8) | (c_tmp << 16)) + + ((fastrand () >> 8) & 0x101010); + } + *c = c_tmp; +} + + +static void +scratching (scratch * scratches, gint scratch_lines, guint32 * dest, gint width, + gint height) +{ + gint i, y, y1, y2; + guint32 *p, a, b; + scratch *scratch; + + for (i = 0; i < scratch_lines; i++) { + scratch = &scratches[i]; + + if (scratch->life) { + scratch->x = scratch->x + scratch->dx; + + if (scratch->x < 0 || scratch->x > width * 256) { + scratch->life = 0; + break; + } + p = dest + (scratch->x >> 8); + if (scratch->init) { + y1 = scratch->init; + scratch->init = 0; + } else { + y1 = 0; + } + scratch->life--; + if (scratch->life) { + y2 = height; + } else { + y2 = fastrand () % height; + } + for (y = y1; y < y2; y++) { + a = *p & 0xfefeff; + a += 0x202020; + b = a & 0x1010100; + *p = a | (b - (b >> 8)); + p += width; + } + } else { + if ((fastrand () & 0xf0000000) == 0) { + scratch->life = 2 + (fastrand () >> 27); + scratch->x = fastrand () % (width * 256); + scratch->dx = ((int) fastrand ()) >> 23; + scratch->init = (fastrand () % (height - 1)) + 1; + } + } + } +} + +static void +dusts (guint32 * dest, gint width, gint height, gint * dust_interval, + gint area_scale) +{ + gint i, j; + gint dnum; + gint d, len; + guint x, y; + + if (*dust_interval == 0) { + if ((fastrand () & 0xf0000000) == 0) { + *dust_interval = fastrand () >> 29; + } + return; + } + dnum = area_scale * 4 + (fastrand () >> 27); + + for (i = 0; i < dnum; i++) { + x = fastrand () % width; + y = fastrand () % height; + d = fastrand () >> 29; + len = fastrand () % area_scale + 5; + for (j = 0; j < len; j++) { + dest[y * width + x] = 0x101010; + y += dy[d]; + x += dx[d]; + + if (y >= height || x >= width) + break; + + d = (d + fastrand () % 3 - 1) & 7; + } + } + *dust_interval = *dust_interval - 1; +} + +static void +pits (guint32 * dest, gint width, gint height, gint area_scale, + gint * pits_interval) +{ + gint i, j; + gint pnum, size, pnumscale; + guint x, y; + + pnumscale = area_scale * 2; + if (*pits_interval) { + pnum = pnumscale + (fastrand () % pnumscale); + + *pits_interval = *pits_interval - 1; + } else { + pnum = fastrand () % pnumscale; + + if ((fastrand () & 0xf8000000) == 0) { + *pits_interval = (fastrand () >> 28) + 20; + } + } + for (i = 0; i < pnum; i++) { + x = fastrand () % (width - 1); + y = fastrand () % (height - 1); + + size = fastrand () >> 28; + + for (j = 0; j < size; j++) { + x = x + fastrand () % 3 - 1; + y = y + fastrand () % 3 - 1; + + if (y >= height || x >= width) + break; + + dest[y * width + x] = 0xc0c0c0; + } + } +} + +static void +gst_agingtv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAgingTV *agingtv = GST_AGINGTV (object); + + GST_OBJECT_LOCK (agingtv); + switch (prop_id) { + case PROP_SCRATCH_LINES: + g_value_set_uint (value, agingtv->scratch_lines); + break; + case PROP_COLOR_AGING: + g_value_set_boolean (value, agingtv->color_aging); + break; + case PROP_PITS: + g_value_set_boolean (value, agingtv->pits); + break; + case PROP_DUSTS: + g_value_set_boolean (value, agingtv->dusts); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + GST_OBJECT_UNLOCK (agingtv); +} + +static void +gst_agingtv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAgingTV *agingtv = GST_AGINGTV (object); + + switch (prop_id) { + case PROP_SCRATCH_LINES: + agingtv->scratch_lines = g_value_get_uint (value); + break; + case PROP_COLOR_AGING: + agingtv->color_aging = g_value_get_boolean (value); + break; + case PROP_PITS: + agingtv->pits = g_value_get_boolean (value); + break; + case PROP_DUSTS: + agingtv->dusts = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static gboolean +gst_agingtv_start (GstBaseTransform * trans) +{ + GstAgingTV *agingtv = GST_AGINGTV (trans); + + agingtv->coloraging_state = 0x18; + agingtv->dust_interval = 0; + agingtv->pits_interval = 0; + + memset (agingtv->scratches, 0, sizeof (agingtv->scratches)); + + return TRUE; +} + +static GstFlowReturn +gst_agingtv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstAgingTV *agingtv = GST_AGINGTV (trans); + gint width, height, video_size; + guint32 *src = (guint32 *) GST_BUFFER_DATA (in); + guint32 *dest = (guint32 *) GST_BUFFER_DATA (out); + gint area_scale; + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (agingtv, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (agingtv), stream_time); + + GST_OBJECT_LOCK (agingtv); + width = agingtv->width; + height = agingtv->height; + video_size = width * height; + + area_scale = width * height / 64 / 480; + if (area_scale <= 0) + area_scale = 1; + + if (agingtv->color_aging) + coloraging (src, dest, video_size, &agingtv->coloraging_state); + else + memcpy (dest, src, GST_BUFFER_SIZE (in)); + + scratching (agingtv->scratches, agingtv->scratch_lines, dest, width, height); + if (agingtv->pits) + pits (dest, width, height, area_scale, &agingtv->pits_interval); + if (area_scale > 1 && agingtv->dusts) + dusts (dest, width, height, &agingtv->dust_interval, area_scale); + GST_OBJECT_UNLOCK (agingtv); + + return ret; +} + +static void +gst_agingtv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "AgingTV effect", + "Filter/Effect/Video", + "AgingTV adds age to video input using scratches and dust", + "Sam Lantinga "); + + gst_element_class_add_static_pad_template (element_class, + &gst_agingtv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_agingtv_src_template); +} + +static void +gst_agingtv_class_init (GstAgingTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_agingtv_set_property; + gobject_class->get_property = gst_agingtv_get_property; + + g_object_class_install_property (gobject_class, PROP_SCRATCH_LINES, + g_param_spec_uint ("scratch-lines", "Scratch Lines", + "Number of scratch lines", 0, SCRATCH_MAX, DEFAULT_SCRATCH_LINES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_COLOR_AGING, + g_param_spec_boolean ("color-aging", "Color Aging", + "Color Aging", DEFAULT_COLOR_AGING, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_PITS, + g_param_spec_boolean ("pits", "Pits", + "Pits", DEFAULT_PITS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_DUSTS, + g_param_spec_boolean ("dusts", "Dusts", + "Dusts", DEFAULT_DUSTS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_agingtv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_agingtv_transform); + trans_class->start = GST_DEBUG_FUNCPTR (gst_agingtv_start); +} + +static void +gst_agingtv_init (GstAgingTV * agingtv, GstAgingTVClass * klass) +{ + agingtv->scratch_lines = DEFAULT_SCRATCH_LINES; + agingtv->color_aging = DEFAULT_COLOR_AGING; + agingtv->pits = DEFAULT_PITS; + agingtv->dusts = DEFAULT_DUSTS; +} diff --git a/gst/effectv/gstaging.h b/gst/effectv/gstaging.h new file mode 100644 index 0000000..0ac6c8e --- /dev/null +++ b/gst/effectv/gstaging.h @@ -0,0 +1,91 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001-2002 FUKUCHI Kentarou + * + * AgingTV - film-aging effect. + * + * 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_AGING_H__ +#define __GST_AGING_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AGINGTV \ + (gst_agingtv_get_type()) +#define GST_AGINGTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AGINGTV,GstAgingTV)) +#define GST_AGINGTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AGINGTV,GstAgingTVClass)) +#define GST_IS_AGINGTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AGINGTV)) +#define GST_IS_AGINGTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AGINGTV)) + +typedef struct _scratch +{ + gint life; + gint x; + gint dx; + gint init; +} scratch; +#define SCRATCH_MAX 20 + +typedef struct _GstAgingTV GstAgingTV; +typedef struct _GstAgingTVClass GstAgingTVClass; + +struct _GstAgingTV +{ + GstVideoFilter videofilter; + + /* < private > */ + + gint width, height; + + gboolean color_aging; + gboolean pits; + gboolean dusts; + + gint coloraging_state; + + scratch scratches[SCRATCH_MAX]; + gint scratch_lines; + + gint dust_interval; + gint pits_interval; + +}; + +struct _GstAgingTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_agingtv_get_type (void); + +G_END_DECLS + +#endif /* __GST_AGING_H__ */ + diff --git a/gst/effectv/gstdice.c b/gst/effectv/gstdice.c new file mode 100644 index 0000000..a297147 --- /dev/null +++ b/gst/effectv/gstdice.c @@ -0,0 +1,325 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> Sebastian Dröge + * + * dice.c: a 'dicing' effect + * copyright (c) 2001 Sam Mertens. This code is subject to the provisions of + * the GNU Library Public License. + * + * I suppose this looks similar to PuzzleTV, but it's not. The screen is + * divided into small squares, each of which is rotated either 0, 90, 180 or + * 270 degrees. The amount of rotation for each square is chosen at random. + * + * 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-dicetv + * + * DiceTV 'dices' the screen up into many small squares, each defaulting + * to a size of 16 pixels by 16 pixels.. Each square is rotated randomly + * in one of four directions: up (no change), down (180 degrees, or + * upside down), right (90 degrees clockwise), or left (90 degrees + * counterclockwise). The direction of each square normally remains + * consistent between each frame. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! dicetv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of dicetv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstdice.h" +#include "gsteffectv.h" + +#include +#include + +#define DEFAULT_CUBE_BITS 4 +#define MAX_CUBE_BITS 5 +#define MIN_CUBE_BITS 0 + +typedef enum _dice_dir +{ + DICE_UP = 0, + DICE_RIGHT = 1, + DICE_DOWN = 2, + DICE_LEFT = 3 +} DiceDir; + +GST_BOILERPLATE (GstDiceTV, gst_dicetv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); + +static void gst_dicetv_create_map (GstDiceTV * filter); + +static GstStaticPadTemplate gst_dicetv_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";" + GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR) + ); + +static GstStaticPadTemplate gst_dicetv_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";" + GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR) + ); + +enum +{ + PROP_0, + PROP_CUBE_BITS +}; + +static gboolean +gst_dicetv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstDiceTV *filter = GST_DICETV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + g_free (filter->dicemap); + filter->dicemap = (guint8 *) g_malloc (filter->height * filter->width); + gst_dicetv_create_map (filter); + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static GstFlowReturn +gst_dicetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) +{ + GstDiceTV *filter = GST_DICETV (trans); + guint32 *src, *dest; + gint i, map_x, map_y, map_i, base, dx, dy, di; + gint video_width, g_cube_bits, g_cube_size; + gint g_map_height, g_map_width; + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime timestamp, stream_time; + const guint8 *dicemap; + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + GST_OBJECT_LOCK (filter); + video_width = filter->width; + g_cube_bits = filter->g_cube_bits; + g_cube_size = filter->g_cube_size; + g_map_height = filter->g_map_height; + g_map_width = filter->g_map_width; + + dicemap = filter->dicemap; + + map_i = 0; + for (map_y = 0; map_y < g_map_height; map_y++) { + for (map_x = 0; map_x < g_map_width; map_x++) { + base = (map_y << g_cube_bits) * video_width + (map_x << g_cube_bits); + + switch (dicemap[map_i]) { + case DICE_UP: + for (dy = 0; dy < g_cube_size; dy++) { + i = base + dy * video_width; + for (dx = 0; dx < g_cube_size; dx++) { + dest[i] = src[i]; + i++; + } + } + break; + case DICE_LEFT: + for (dy = 0; dy < g_cube_size; dy++) { + i = base + dy * video_width; + + for (dx = 0; dx < g_cube_size; dx++) { + di = base + (dx * video_width) + (g_cube_size - dy - 1); + dest[di] = src[i]; + i++; + } + } + break; + case DICE_DOWN: + for (dy = 0; dy < g_cube_size; dy++) { + di = base + dy * video_width; + i = base + (g_cube_size - dy - 1) * video_width + g_cube_size; + for (dx = 0; dx < g_cube_size; dx++) { + i--; + dest[di] = src[i]; + di++; + } + } + break; + case DICE_RIGHT: + for (dy = 0; dy < g_cube_size; dy++) { + i = base + (dy * video_width); + for (dx = 0; dx < g_cube_size; dx++) { + di = base + dy + (g_cube_size - dx - 1) * video_width; + dest[di] = src[i]; + i++; + } + } + break; + default: + g_assert_not_reached (); + break; + } + map_i++; + } + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static void +gst_dicetv_create_map (GstDiceTV * filter) +{ + gint x, y, i; + + if (filter->height <= 0 || filter->width <= 0) + return; + + filter->g_map_height = filter->height >> filter->g_cube_bits; + filter->g_map_width = filter->width >> filter->g_cube_bits; + filter->g_cube_size = 1 << filter->g_cube_bits; + + i = 0; + + for (y = 0; y < filter->g_map_height; y++) { + for (x = 0; x < filter->g_map_width; x++) { + // dicemap[i] = ((i + y) & 0x3); /* Up, Down, Left or Right */ + filter->dicemap[i] = (fastrand () >> 24) & 0x03; + i++; + } + } +} + +static void +gst_dicetv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstDiceTV *filter = GST_DICETV (object); + + switch (prop_id) { + case PROP_CUBE_BITS: + GST_OBJECT_LOCK (filter); + filter->g_cube_bits = g_value_get_int (value); + gst_dicetv_create_map (filter); + GST_OBJECT_UNLOCK (filter); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_dicetv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstDiceTV *filter = GST_DICETV (object); + + switch (prop_id) { + case PROP_CUBE_BITS: + g_value_set_int (value, filter->g_cube_bits); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_dicetv_finalize (GObject * object) +{ + GstDiceTV *filter = GST_DICETV (object); + + g_free (filter->dicemap); + filter->dicemap = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_dicetv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "DiceTV effect", + "Filter/Effect/Video", + "'Dices' the screen up into many small squares", + "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &gst_dicetv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_dicetv_src_template); +} + +static void +gst_dicetv_class_init (GstDiceTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_dicetv_set_property; + gobject_class->get_property = gst_dicetv_get_property; + gobject_class->finalize = gst_dicetv_finalize; + + g_object_class_install_property (gobject_class, PROP_CUBE_BITS, + g_param_spec_int ("square-bits", "Square Bits", "The size of the Squares", + MIN_CUBE_BITS, MAX_CUBE_BITS, DEFAULT_CUBE_BITS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_dicetv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_dicetv_transform); +} + +static void +gst_dicetv_init (GstDiceTV * filter, GstDiceTVClass * klass) +{ + filter->dicemap = NULL; + filter->g_cube_bits = DEFAULT_CUBE_BITS; + filter->g_cube_size = 0; + filter->g_map_height = 0; + filter->g_map_width = 0; +} diff --git a/gst/effectv/gstdice.h b/gst/effectv/gstdice.h new file mode 100644 index 0000000..856e995 --- /dev/null +++ b/gst/effectv/gstdice.h @@ -0,0 +1,76 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> Sebastian Dröge + * + * dice.c: a 'dicing' effect + * copyright (c) 2001 Sam Mertens. This code is subject to the provisions of + * the GNU Library Public License. + * + * I suppose this looks similar to PuzzleTV, but it's not. The screen is + * divided into small squares, each of which is rotated either 0, 90, 180 or + * 270 degrees. The amount of rotation for each square is chosen at random. + * + * 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_DICE_H__ +#define __GST_DICE_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_DICETV \ + (gst_dicetv_get_type()) +#define GST_DICETV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DICETV,GstDiceTV)) +#define GST_DICETV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DICETV,GstDiceTVClass)) +#define GST_IS_DICETV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DICETV)) +#define GST_IS_DICETV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DICETV)) + +typedef struct _GstDiceTV GstDiceTV; +typedef struct _GstDiceTVClass GstDiceTVClass; + +struct _GstDiceTV +{ + GstVideoFilter videofilter; + + /* < private > */ + + gint width, height; + guint8 *dicemap; + + gint g_cube_bits; + gint g_cube_size; + gint g_map_height; + gint g_map_width; +}; + +struct _GstDiceTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_dicetv_get_type (void); + +G_END_DECLS + +#endif /* __GST_DICE_H__ */ diff --git a/gst/effectv/gstedge.c b/gst/effectv/gstedge.c new file mode 100644 index 0000000..e41e99f --- /dev/null +++ b/gst/effectv/gstedge.c @@ -0,0 +1,263 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV: + * Copyright (C) 2001-2002 FUKUCHI Kentarou + * + * EdgeTV - detects edge and display it in good old computer way + * + * EffecTV is free software. 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-edgetv + * + * EdgeTV detects edges and display it in good old low resolution + * computer way. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! edgetv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of edgetv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstedge.h" + +#include + +GST_BOILERPLATE (GstEdgeTV, gst_edgetv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define CAPS_STR GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGBx +#else +#define CAPS_STR GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_xRGB +#endif + +static GstStaticPadTemplate gst_edgetv_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static GstStaticPadTemplate gst_edgetv_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static gboolean +gst_edgetv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstEdgeTV *edgetv = GST_EDGETV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (edgetv); + if (gst_structure_get_int (structure, "width", &edgetv->width) && + gst_structure_get_int (structure, "height", &edgetv->height)) { + guint map_size; + + edgetv->map_width = edgetv->width / 4; + edgetv->map_height = edgetv->height / 4; + edgetv->video_width_margin = edgetv->width % 4; + + map_size = edgetv->map_width * edgetv->map_height * sizeof (guint32) * 2; + + g_free (edgetv->map); + edgetv->map = (guint32 *) g_malloc0 (map_size); + ret = TRUE; + } + GST_OBJECT_UNLOCK (edgetv); + + return ret; +} + +static GstFlowReturn +gst_edgetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) +{ + GstEdgeTV *filter = GST_EDGETV (trans); + gint x, y, r, g, b; + guint32 *src, *dest; + guint32 p, q; + guint32 v0, v1, v2, v3; + gint width, map_height, map_width; + gint video_width_margin; + guint32 *map; + GstFlowReturn ret = GST_FLOW_OK; + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + GST_OBJECT_LOCK (filter); + map = filter->map; + width = filter->width; + map_height = filter->map_height; + map_width = filter->map_width; + video_width_margin = filter->video_width_margin; + src += width * 4 + 4; + dest += width * 4 + 4; + + for (y = 1; y < map_height - 1; y++) { + for (x = 1; x < map_width - 1; x++) { + p = *src; + q = *(src - 4); + + /* difference between the current pixel and left neighbor. */ + r = ((p & 0xff0000) - (q & 0xff0000)) >> 16; + g = ((p & 0xff00) - (q & 0xff00)) >> 8; + b = (p & 0xff) - (q & 0xff); + r *= r; + g *= g; + b *= b; + r = r >> 5; /* To lack the lower bit for saturated addition, */ + g = g >> 5; /* devide the value with 32, instead of 16. It is */ + b = b >> 4; /* same as `v2 &= 0xfefeff' */ + if (r > 127) + r = 127; + if (g > 127) + g = 127; + if (b > 255) + b = 255; + v2 = (r << 17) | (g << 9) | b; + + /* difference between the current pixel and upper neighbor. */ + q = *(src - width * 4); + r = ((p & 0xff0000) - (q & 0xff0000)) >> 16; + g = ((p & 0xff00) - (q & 0xff00)) >> 8; + b = (p & 0xff) - (q & 0xff); + r *= r; + g *= g; + b *= b; + r = r >> 5; + g = g >> 5; + b = b >> 4; + if (r > 127) + r = 127; + if (g > 127) + g = 127; + if (b > 255) + b = 255; + v3 = (r << 17) | (g << 9) | b; + + v0 = map[(y - 1) * map_width * 2 + x * 2]; + v1 = map[y * map_width * 2 + (x - 1) * 2 + 1]; + map[y * map_width * 2 + x * 2] = v2; + map[y * map_width * 2 + x * 2 + 1] = v3; + r = v0 + v1; + g = r & 0x01010100; + dest[0] = r | (g - (g >> 8)); + r = v0 + v3; + g = r & 0x01010100; + dest[1] = r | (g - (g >> 8)); + dest[2] = v3; + dest[3] = v3; + r = v2 + v1; + g = r & 0x01010100; + dest[width] = r | (g - (g >> 8)); + r = v2 + v3; + g = r & 0x01010100; + dest[width + 1] = r | (g - (g >> 8)); + dest[width + 2] = v3; + dest[width + 3] = v3; + dest[width * 2] = v2; + dest[width * 2 + 1] = v2; + dest[width * 2 + 2] = 0; + dest[width * 2 + 3] = 0; + dest[width * 3] = v2; + dest[width * 3 + 1] = v2; + dest[width * 3 + 2] = 0; + dest[width * 3 + 3] = 0; + + src += 4; + dest += 4; + } + src += width * 3 + 8 + video_width_margin; + dest += width * 3 + 8 + video_width_margin; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_edgetv_start (GstBaseTransform * trans) +{ + GstEdgeTV *edgetv = GST_EDGETV (trans); + + if (edgetv->map) + memset (edgetv->map, 0, + edgetv->map_width * edgetv->map_height * sizeof (guint32) * 2); + return TRUE; +} + +static void +gst_edgetv_finalize (GObject * object) +{ + GstEdgeTV *edgetv = GST_EDGETV (object); + + g_free (edgetv->map); + edgetv->map = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_edgetv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "EdgeTV effect", + "Filter/Effect/Video", + "Apply edge detect on video", "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &gst_edgetv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_edgetv_src_template); +} + +static void +gst_edgetv_class_init (GstEdgeTVClass * klass) +{ + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = gst_edgetv_finalize; + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_edgetv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_edgetv_transform); + trans_class->start = GST_DEBUG_FUNCPTR (gst_edgetv_start); +} + +static void +gst_edgetv_init (GstEdgeTV * edgetv, GstEdgeTVClass * klass) +{ +} diff --git a/gst/effectv/gstedge.h b/gst/effectv/gstedge.h new file mode 100644 index 0000000..172d597 --- /dev/null +++ b/gst/effectv/gstedge.h @@ -0,0 +1,71 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV: + * Copyright (C) 2001-2002 FUKUCHI Kentarou + * + * EdgeTV - detects edge and display it in good old computer way + * + * EffecTV is free software. 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_EDGE_H__ +#define __GST_EDGE_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_EDGETV \ + (gst_edgetv_get_type()) +#define GST_EDGETV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_EDGETV,GstEdgeTV)) +#define GST_EDGETV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_EDGETV,GstEdgeTVClass)) +#define GST_IS_EDGETV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EDGETV)) +#define GST_IS_EDGETV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EDGETV)) + +typedef struct _GstEdgeTV GstEdgeTV; +typedef struct _GstEdgeTVClass GstEdgeTVClass; + +struct _GstEdgeTV +{ + GstVideoFilter videofilter; + + /* < private > */ + + gint width, height; + gint map_width, map_height; + guint32 *map; + gint video_width_margin; +}; + +struct _GstEdgeTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_edgetv_get_type (void); + +G_END_DECLS + +#endif /* __GST_EDGE_H__ */ diff --git a/gst/effectv/gsteffectv.c b/gst/effectv/gsteffectv.c new file mode 100644 index 0000000..1615fd7 --- /dev/null +++ b/gst/effectv/gsteffectv.c @@ -0,0 +1,83 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * EffecTV: + * Copyright (C) 2001 FUKUCHI Kentarou + * + * EffecTV is free software. 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 "gsteffectv.h" +#include "gstaging.h" +#include "gstdice.h" +#include "gstedge.h" +#include "gstquark.h" +#include "gstrev.h" +#include "gstshagadelic.h" +#include "gstvertigo.h" +#include "gstwarp.h" +#include "gstop.h" +#include "gstradioac.h" +#include "gststreak.h" +#include "gstripple.h" + +struct _elements_entry +{ + const gchar *name; + GType (*type) (void); +}; + +static const struct _elements_entry _elements[] = { + {"edgetv", gst_edgetv_get_type}, + {"agingtv", gst_agingtv_get_type}, + {"dicetv", gst_dicetv_get_type}, + {"warptv", gst_warptv_get_type}, + {"shagadelictv", gst_shagadelictv_get_type}, + {"vertigotv", gst_vertigotv_get_type}, + {"revtv", gst_revtv_get_type}, + {"quarktv", gst_quarktv_get_type}, + {"optv", gst_optv_get_type}, + {"radioactv", gst_radioactv_get_type}, + {"streaktv", gst_streaktv_get_type}, + {"rippletv", gst_rippletv_get_type}, + {NULL, 0}, +}; + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gint i = 0; + + while (_elements[i].name) { + if (!gst_element_register (plugin, _elements[i].name, + GST_RANK_NONE, (_elements[i].type) ())) + return FALSE; + i++; + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "effectv", + "effect plugins from the effectv project", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/effectv/gsteffectv.h b/gst/effectv/gsteffectv.h new file mode 100644 index 0000000..a953991 --- /dev/null +++ b/gst/effectv/gsteffectv.h @@ -0,0 +1,33 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * EffecTV: + * Copyright (C) 2001 FUKUCHI Kentarou + * + * EffecTV is free software. 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 + +static inline guint +fastrand (void) +{ + static guint fastrand_val; + + return (fastrand_val = fastrand_val * 1103515245 + 12345); +} + diff --git a/gst/effectv/gstop.c b/gst/effectv/gstop.c new file mode 100644 index 0000000..29f41f6 --- /dev/null +++ b/gst/effectv/gstop.c @@ -0,0 +1,432 @@ +/* GStreamer + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001-2006 FUKUCHI Kentaro + * + * OpTV - Optical art meets real-time video effect. + * Copyright (C) 2004-2005 FUKUCHI Kentaro + * + * EffecTV is free software. 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-optv + * + * Traditional black-white optical animation is now resurrected as a + * real-time video effect. Input images are binarized and combined with + * various optical pattern. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! optv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of optv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstop.h" +#include "gsteffectv.h" + +#include +#include + +enum +{ + OP_SPIRAL1 = 0, + OP_SPIRAL2, + OP_PARABOLA, + OP_HSTRIPE +}; + +#define GST_TYPE_OPTV_MODE (gst_optv_mode_get_type()) +static GType +gst_optv_mode_get_type (void) +{ + static GType type = 0; + + static const GEnumValue enumvalue[] = { + {OP_SPIRAL1, "Maelstrom", "maelstrom"}, + {OP_SPIRAL2, "Radiation", "radiation"}, + {OP_PARABOLA, "Horizontal Stripes", + "horizontal-stripes"}, + {OP_HSTRIPE, "Vertical Stripes", "vertical-stripes"}, + {0, NULL, NULL}, + }; + + if (!type) { + type = g_enum_register_static ("GstOpTVMode", enumvalue); + } + return type; +} + +#define DEFAULT_MODE OP_SPIRAL1 +#define DEFAULT_SPEED 16 +#define DEFAULT_THRESHOLD 60 + +enum +{ + PROP_0, + PROP_MODE, + PROP_SPEED, + PROP_THRESHOLD +}; + +static guint32 palette[256]; + +GST_BOILERPLATE (GstOpTV, gst_optv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define CAPS_STR GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGBx +#else +#define CAPS_STR GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_xRGB +#endif + +static GstStaticPadTemplate gst_optv_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static GstStaticPadTemplate gst_optv_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static void +initPalette (void) +{ + gint i; + guint8 v; + + for (i = 0; i < 112; i++) { + palette[i] = 0; + palette[i + 128] = 0xffffff; + } + for (i = 0; i < 16; i++) { + v = 16 * (i + 1) - 1; + palette[i + 112] = (v << 16) | (v << 8) | v; + v = 255 - v; + palette[i + 240] = (v << 16) | (v << 8) | v; + } +} + +static void +setOpmap (gint8 * opmap[4], gint width, gint height) +{ + gint i, j, x, y; +#ifndef PS2 + gdouble xx, yy, r, at, rr; +#else + gfloat xx, yy, r, at, rr; +#endif + gint sci; + + sci = 640 / width; + i = 0; + for (y = 0; y < height; y++) { + yy = (gdouble) (y - height / 2) / width; + for (x = 0; x < width; x++) { + xx = (gdouble) x / width - 0.5; +#ifndef PS2 + r = sqrt (xx * xx + yy * yy); + at = atan2 (xx, yy); +#else + r = sqrtf (xx * xx + yy * yy); + at = atan2f (xx, yy); +#endif + + opmap[OP_SPIRAL1][i] = ((guint) + ((at / G_PI * 256) + (r * 4000))) & 255; + + j = r * 300 / 32; + rr = r * 300 - j * 32; + j *= 64; + j += (rr > 28) ? (rr - 28) * 16 : 0; + opmap[OP_SPIRAL2][i] = ((guint) + ((at / G_PI * 4096) + (r * 1600) - j)) & 255; + + opmap[OP_PARABOLA][i] = + ((guint) (yy / (xx * xx * 0.3 + 0.1) * 400)) & 255; + opmap[OP_HSTRIPE][i] = x * 8 * sci; + i++; + } + } +} + +/* Taken from effectv/image.c */ +/* Y value filters */ +static void +image_y_over (guint32 * src, guint8 * diff, gint y_threshold, gint video_area) +{ + gint i; + gint R, G, B, v; + guint8 *p = diff; + + for (i = video_area; i > 0; i--) { + R = ((*src) & 0xff0000) >> (16 - 1); + G = ((*src) & 0xff00) >> (8 - 2); + B = (*src) & 0xff; + v = y_threshold * 7 - (R + G + B); + *p = (guint8) (v >> 24); + src++; + p++; + } +} + +static GstFlowReturn +gst_optv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) +{ + GstOpTV *filter = GST_OPTV (trans); + guint32 *src, *dest; + GstFlowReturn ret = GST_FLOW_OK; + gint8 *p; + guint8 *diff; + gint x, y, width, height; + GstClockTime timestamp, stream_time; + guint8 phase; + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + if (G_UNLIKELY (filter->opmap[0] == NULL)) + return GST_FLOW_NOT_NEGOTIATED; + + GST_OBJECT_LOCK (filter); + switch (filter->mode) { + default: + case 0: + p = filter->opmap[OP_SPIRAL1]; + break; + case 1: + p = filter->opmap[OP_SPIRAL2]; + break; + case 2: + p = filter->opmap[OP_PARABOLA]; + break; + case 3: + p = filter->opmap[OP_HSTRIPE]; + break; + } + + filter->phase -= filter->speed; + + diff = filter->diff; + image_y_over (src, diff, filter->threshold, filter->width * filter->height); + height = filter->height; + width = filter->width; + phase = filter->phase; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + *dest++ = palette[(((guint8) (*p + phase)) ^ *diff++) & 255]; + p++; + } + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_optv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstOpTV *filter = GST_OPTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + gint i; + + for (i = 0; i < 4; i++) { + if (filter->opmap[i]) + g_free (filter->opmap[i]); + filter->opmap[i] = g_new (gint8, filter->width * filter->height); + } + setOpmap (filter->opmap, filter->width, filter->height); + + if (filter->diff) + g_free (filter->diff); + filter->diff = g_new (guint8, filter->width * filter->height); + + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_optv_start (GstBaseTransform * trans) +{ + GstOpTV *filter = GST_OPTV (trans); + + filter->phase = 0; + + return TRUE; +} + +static void +gst_optv_finalize (GObject * object) +{ + GstOpTV *filter = GST_OPTV (object); + + if (filter->opmap[0]) { + gint i; + + for (i = 0; i < 4; i++) { + if (filter->opmap[i]) + g_free (filter->opmap[i]); + filter->opmap[i] = NULL; + } + } + + if (filter->diff) + g_free (filter->diff); + filter->diff = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_optv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstOpTV *filter = GST_OPTV (object); + + GST_OBJECT_LOCK (filter); + switch (prop_id) { + case PROP_MODE: + filter->mode = g_value_get_enum (value); + break; + case PROP_SPEED: + filter->speed = g_value_get_int (value); + break; + case PROP_THRESHOLD: + filter->threshold = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (filter); +} + +static void +gst_optv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstOpTV *filter = GST_OPTV (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, filter->mode); + break; + case PROP_SPEED: + g_value_set_int (value, filter->speed); + break; + case PROP_THRESHOLD: + g_value_set_uint (value, filter->threshold); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_optv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "OpTV effect", + "Filter/Effect/Video", + "Optical art meets real-time video effect", + "FUKUCHI, Kentarou , " + "Sebastian Dröge "); + + gst_element_class_add_static_pad_template (element_class, + &gst_optv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_optv_src_template); +} + +static void +gst_optv_class_init (GstOpTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_optv_set_property; + gobject_class->get_property = gst_optv_get_property; + + gobject_class->finalize = gst_optv_finalize; + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Mode", GST_TYPE_OPTV_MODE, DEFAULT_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_SPEED, + g_param_spec_int ("speed", "Speed", + "Effect speed", G_MININT, G_MAXINT, DEFAULT_SPEED, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_THRESHOLD, + g_param_spec_uint ("threshold", "Threshold", + "Luma threshold", 0, G_MAXINT, DEFAULT_THRESHOLD, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_optv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_optv_transform); + trans_class->start = GST_DEBUG_FUNCPTR (gst_optv_start); + + initPalette (); +} + +static void +gst_optv_init (GstOpTV * filter, GstOpTVClass * klass) +{ + filter->speed = DEFAULT_SPEED; + filter->mode = DEFAULT_MODE; + filter->threshold = DEFAULT_THRESHOLD; +} diff --git a/gst/effectv/gstop.h b/gst/effectv/gstop.h new file mode 100644 index 0000000..e794603 --- /dev/null +++ b/gst/effectv/gstop.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001-2006 FUKUCHI Kentaro + * + * OpTV - Optical art meets real-time video effect. + * Copyright (C) 2004-2005 FUKUCHI Kentaro + * + * EffecTV is free software. 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_OP_H__ +#define __GST_OP_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_OPTV \ + (gst_optv_get_type()) +#define GST_OPTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OPTV,GstOpTV)) +#define GST_OPTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OPTV,GstOpTVClass)) +#define GST_IS_OPTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OPTV)) +#define GST_IS_OPTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OPTV)) + +typedef struct _GstOpTV GstOpTV; +typedef struct _GstOpTVClass GstOpTVClass; + +struct _GstOpTV +{ + GstVideoFilter element; + + /* < private > */ + gint width, height; + + gint mode; + gint speed; + guint threshold; + + gint8 *opmap[4]; + guint8 *diff; + guint8 phase; +}; + +struct _GstOpTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_optv_get_type (void); + +G_END_DECLS + +#endif /* __GST_OP_H__ */ diff --git a/gst/effectv/gstquark.c b/gst/effectv/gstquark.c new file mode 100644 index 0000000..59f4f2c --- /dev/null +++ b/gst/effectv/gstquark.c @@ -0,0 +1,309 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV: + * Copyright (C) 2001-2002 FUKUCHI Kentarou + * + * QuarkTV - motion disolver. + * + * EffecTV is free software. 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-quarktv + * + * QuarkTV disolves moving objects. It picks up pixels from + * the last frames randomly. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! quarktv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of quarktv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstquark.h" +#include "gsteffectv.h" + +#include +#include + +/* number of frames of time-buffer. It should be as a configurable paramater */ +/* This number also must be 2^n just for the speed. */ +#define PLANES 16 + +enum +{ + PROP_0, + PROP_PLANES +}; + +GST_BOILERPLATE (GstQuarkTV, gst_quarktv, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +static void gst_quarktv_planetable_clear (GstQuarkTV * filter); + +static GstStaticPadTemplate gst_quarktv_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" + GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx) + ); + +static GstStaticPadTemplate gst_quarktv_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" + GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx) + ); + +static gboolean +gst_quarktv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstQuarkTV *filter = GST_QUARKTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + gst_quarktv_planetable_clear (filter); + filter->area = filter->width * filter->height; + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static GstFlowReturn +gst_quarktv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstQuarkTV *filter = GST_QUARKTV (trans); + gint area; + guint32 *src, *dest; + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime timestamp; + GstBuffer **planetable; + gint planes, current_plane; + + timestamp = GST_BUFFER_TIMESTAMP (in); + timestamp = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) + gst_object_sync_values (G_OBJECT (filter), timestamp); + + if (G_UNLIKELY (filter->planetable == NULL)) + return GST_FLOW_WRONG_STATE; + + GST_OBJECT_LOCK (filter); + area = filter->area; + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + planetable = filter->planetable; + planes = filter->planes; + current_plane = filter->current_plane; + + if (planetable[current_plane]) + gst_buffer_unref (planetable[current_plane]); + planetable[current_plane] = gst_buffer_ref (in); + + /* For each pixel */ + while (--area) { + GstBuffer *rand; + + /* pick a random buffer */ + rand = planetable[(current_plane + (fastrand () >> 24)) % planes]; + + /* Copy the pixel from the random buffer to dest */ + dest[area] = + (rand ? ((guint32 *) GST_BUFFER_DATA (rand))[area] : src[area]); + } + + filter->current_plane--; + if (filter->current_plane < 0) + filter->current_plane = planes - 1; + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static void +gst_quarktv_planetable_clear (GstQuarkTV * filter) +{ + gint i; + + if (filter->planetable == NULL) + return; + + for (i = 0; i < filter->planes; i++) { + if (GST_IS_BUFFER (filter->planetable[i])) { + gst_buffer_unref (filter->planetable[i]); + } + filter->planetable[i] = NULL; + } +} + +static gboolean +gst_quarktv_start (GstBaseTransform * trans) +{ + GstQuarkTV *filter = GST_QUARKTV (trans); + + if (filter->planetable) { + gst_quarktv_planetable_clear (filter); + g_free (filter->planetable); + } + filter->planetable = + (GstBuffer **) g_malloc0 (filter->planes * sizeof (GstBuffer *)); + + return TRUE; +} + +static void +gst_quarktv_finalize (GObject * object) +{ + GstQuarkTV *filter = GST_QUARKTV (object); + + if (filter->planetable) { + gst_quarktv_planetable_clear (filter); + g_free (filter->planetable); + filter->planetable = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_quarktv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstQuarkTV *filter = GST_QUARKTV (object); + + GST_OBJECT_LOCK (filter); + switch (prop_id) { + case PROP_PLANES: + { + gint new_n_planes = g_value_get_int (value); + GstBuffer **new_planetable; + gint i; + + /* If the number of planes changed, copy across any existing planes */ + if (new_n_planes != filter->planes) { + new_planetable = + (GstBuffer **) g_malloc0 (new_n_planes * sizeof (GstBuffer *)); + + if (filter->planetable) { + for (i = 0; (i < new_n_planes) && (i < filter->planes); i++) { + new_planetable[i] = filter->planetable[i]; + } + for (; i < filter->planes; i++) { + if (filter->planetable[i]) + gst_buffer_unref (filter->planetable[i]); + } + g_free (filter->planetable); + } + + filter->planetable = new_planetable; + filter->planes = new_n_planes; + filter->current_plane = filter->planes - 1; + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (filter); +} + +static void +gst_quarktv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstQuarkTV *filter = GST_QUARKTV (object); + + switch (prop_id) { + case PROP_PLANES: + g_value_set_int (value, filter->planes); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_quarktv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "QuarkTV effect", + "Filter/Effect/Video", + "Motion dissolver", "FUKUCHI, Kentarou "); + + gst_element_class_add_static_pad_template (element_class, + &gst_quarktv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_quarktv_src_template); +} + +static void +gst_quarktv_class_init (GstQuarkTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_quarktv_set_property; + gobject_class->get_property = gst_quarktv_get_property; + + gobject_class->finalize = gst_quarktv_finalize; + + g_object_class_install_property (gobject_class, PROP_PLANES, + g_param_spec_int ("planes", "Planes", + "Number of planes", 0, 64, PLANES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_quarktv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_quarktv_transform); + trans_class->start = GST_DEBUG_FUNCPTR (gst_quarktv_start); +} + +static void +gst_quarktv_init (GstQuarkTV * filter, GstQuarkTVClass * klass) +{ + filter->planes = PLANES; + filter->current_plane = filter->planes - 1; +} diff --git a/gst/effectv/gstquark.h b/gst/effectv/gstquark.h new file mode 100644 index 0000000..79a6107 --- /dev/null +++ b/gst/effectv/gstquark.h @@ -0,0 +1,72 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV: + * Copyright (C) 2001-2002 FUKUCHI Kentarou + * + * QuarkTV - motion disolver. + * + * EffecTV is free software. 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_QUARK_H__ +#define __GST_QUARK_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_QUARKTV \ + (gst_quarktv_get_type()) +#define GST_QUARKTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QUARKTV,GstQuarkTV)) +#define GST_QUARKTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QUARKTV,GstQuarkTVClass)) +#define GST_IS_QUARKTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QUARKTV)) +#define GST_IS_QUARKTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUARKTV)) + +typedef struct _GstQuarkTV GstQuarkTV; +typedef struct _GstQuarkTVClass GstQuarkTVClass; + +struct _GstQuarkTV +{ + GstVideoFilter element; + + /* < private > */ + + gint width, height; + gint area; + gint planes; + gint current_plane; + GstBuffer **planetable; +}; + +struct _GstQuarkTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_quarktv_get_type (void); + +G_END_DECLS + +#endif /* __GST_QUARK_H__ */ diff --git a/gst/effectv/gstradioac.c b/gst/effectv/gstradioac.c new file mode 100644 index 0000000..f417c93 --- /dev/null +++ b/gst/effectv/gstradioac.c @@ -0,0 +1,632 @@ +/* GStreamer + * Cradioacyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Cradioacyright (C) 2001-2006 FUKUCHI Kentaro + * + * RadioacTV - motion-enlightment effect. + * Cradioacyright (C) 2001-2002 FUKUCHI Kentaro + * + * EffecTV is free software. 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 radioaction) any later version. + * + * This library is distributed in the hradioace 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 cradioacy 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-radioactv + * + * RadioacTV does *NOT* detect a radioactivity. It detects a difference + * from previous frame and blurs it. + * + * RadioacTV has 4 mode, normal, strobe1, strobe2 and trigger. + * In trigger mode, effect appears only when the trigger property is %TRUE. + * + * strobe1 and strobe2 mode drops some frames. strobe1 mode uses the difference between + * current frame and previous frame dropped, while strobe2 mode uses the difference from + * previous frame displayed. The effect of strobe2 is stronger than strobe1. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! radioactv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of radioactv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstradioac.h" +#include "gsteffectv.h" + +#include +#include + +enum +{ + RADIOAC_NORMAL = 0, + RADIOAC_STROBE, + RADIOAC_STROBE2, + RADIOAC_TRIGGER +}; + +enum +{ + COLOR_RED = 0, + COLOR_GREEN, + COLOR_BLUE, + COLOR_WHITE +}; + +#define GST_TYPE_RADIOACTV_MODE (gst_radioactv_mode_get_type()) +static GType +gst_radioactv_mode_get_type (void) +{ + static GType type = 0; + + static const GEnumValue enumvalue[] = { + {RADIOAC_NORMAL, "Normal", "normal"}, + {RADIOAC_STROBE, "Strobe 1", "strobe1"}, + {RADIOAC_STROBE2, "Strobe 2", "strobe2"}, + {RADIOAC_TRIGGER, "Trigger", "trigger"}, + {0, NULL, NULL}, + }; + + if (!type) { + type = g_enum_register_static ("GstRadioacTVMode", enumvalue); + } + return type; +} + +#define GST_TYPE_RADIOACTV_COLOR (gst_radioactv_color_get_type()) +static GType +gst_radioactv_color_get_type (void) +{ + static GType type = 0; + + static const GEnumValue enumvalue[] = { + {COLOR_RED, "Red", "red"}, + {COLOR_GREEN, "Green", "green"}, + {COLOR_BLUE, "Blue", "blue"}, + {COLOR_WHITE, "White", "white"}, + {0, NULL, NULL}, + }; + + if (!type) { + type = g_enum_register_static ("GstRadioacTVColor", enumvalue); + } + return type; +} + +#define DEFAULT_MODE RADIOAC_NORMAL +#define DEFAULT_COLOR COLOR_WHITE +#define DEFAULT_INTERVAL 3 +#define DEFAULT_TRIGGER FALSE + +enum +{ + PROP_0, + PROP_MODE, + PROP_COLOR, + PROP_INTERVAL, + PROP_TRIGGER +}; + +#define COLORS 32 +#define PATTERN 4 +#define MAGIC_THRESHOLD 40 +#define RATIO 0.95 + +static guint32 palettes[COLORS * PATTERN]; +static gint swap_tab[] = { 2, 1, 0, 3 }; + +GST_BOILERPLATE (GstRadioacTV, gst_radioactv, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define CAPS_STR GST_VIDEO_CAPS_RGBx "; " GST_VIDEO_CAPS_BGRx +#else +#define CAPS_STR GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB +#endif + +static GstStaticPadTemplate gst_radioactv_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static GstStaticPadTemplate gst_radioactv_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static void +makePalette (void) +{ + gint i; + +#define DELTA (255/(COLORS/2-1)) + + /* red, gree, blue */ + for (i = 0; i < COLORS / 2; i++) { + palettes[i] = i * DELTA; + palettes[COLORS + i] = (i * DELTA) << 8; + palettes[COLORS * 2 + i] = (i * DELTA) << 16; + } + for (i = 0; i < COLORS / 2; i++) { + palettes[i + COLORS / 2] = 255 | (i * DELTA) << 16 | (i * DELTA) << 8; + palettes[COLORS + i + COLORS / 2] = + (255 << 8) | (i * DELTA) << 16 | i * DELTA; + palettes[COLORS * 2 + i + COLORS / 2] = + (255 << 16) | (i * DELTA) << 8 | i * DELTA; + } + /* white */ + for (i = 0; i < COLORS; i++) { + palettes[COLORS * 3 + i] = (255 * i / COLORS) * 0x10101; + } + for (i = 0; i < COLORS * PATTERN; i++) { + palettes[i] = palettes[i] & 0xfefeff; + } +#undef DELTA +} + +#define VIDEO_HWIDTH (filter->buf_width/2) +#define VIDEO_HHEIGHT (filter->buf_height/2) + +/* this table assumes that video_width is times of 32 */ +static void +setTable (GstRadioacTV * filter) +{ + guint bits; + gint x, y, tx, ty, xx; + gint ptr, prevptr; + + prevptr = (gint) (0.5 + RATIO * (-VIDEO_HWIDTH) + VIDEO_HWIDTH); + for (xx = 0; xx < (filter->buf_width_blocks); xx++) { + bits = 0; + for (x = 0; x < 32; x++) { + ptr = (gint) (0.5 + RATIO * (xx * 32 + x - VIDEO_HWIDTH) + VIDEO_HWIDTH); + bits = bits >> 1; + if (ptr != prevptr) + bits |= 0x80000000; + prevptr = ptr; + } + filter->blurzoomx[xx] = bits; + } + + ty = (gint) (0.5 + RATIO * (-VIDEO_HHEIGHT) + VIDEO_HHEIGHT); + tx = (gint) (0.5 + RATIO * (-VIDEO_HWIDTH) + VIDEO_HWIDTH); + xx = (gint) (0.5 + RATIO * (filter->buf_width - 1 - VIDEO_HWIDTH) + + VIDEO_HWIDTH); + filter->blurzoomy[0] = ty * filter->buf_width + tx; + prevptr = ty * filter->buf_width + xx; + for (y = 1; y < filter->buf_height; y++) { + ty = (gint) (0.5 + RATIO * (y - VIDEO_HHEIGHT) + VIDEO_HHEIGHT); + filter->blurzoomy[y] = ty * filter->buf_width + tx - prevptr; + prevptr = ty * filter->buf_width + xx; + } +} + +#undef VIDEO_HWIDTH +#undef VIDEO_HHEIGHT + +static void +blur (GstRadioacTV * filter) +{ + gint x, y; + gint width; + guint8 *p, *q; + guint8 v; + + width = filter->buf_width; + p = filter->blurzoombuf + filter->width + 1; + q = p + filter->buf_area; + + for (y = filter->buf_height - 2; y > 0; y--) { + for (x = width - 2; x > 0; x--) { + v = (*(p - width) + *(p - 1) + *(p + 1) + *(p + width)) / 4 - 1; + if (v == 255) + v = 0; + *q = v; + p++; + q++; + } + p += 2; + q += 2; + } +} + +static void +zoom (GstRadioacTV * filter) +{ + gint b, x, y; + guint8 *p, *q; + gint blocks, height; + gint dx; + + p = filter->blurzoombuf + filter->buf_area; + q = filter->blurzoombuf; + height = filter->buf_height; + blocks = filter->buf_width_blocks; + + for (y = 0; y < height; y++) { + p += filter->blurzoomy[y]; + for (b = 0; b < blocks; b++) { + dx = filter->blurzoomx[b]; + for (x = 0; x < 32; x++) { + p += (dx & 1); + *q++ = *p; + dx = dx >> 1; + } + } + } +} + +static void +blurzoomcore (GstRadioacTV * filter) +{ + blur (filter); + zoom (filter); +} + +/* Background image is refreshed every frame */ +static void +image_bgsubtract_update_y (guint32 * src, gint16 * background, guint8 * diff, + gint video_area, gint y_threshold) +{ + gint i; + gint R, G, B; + guint32 *p; + gint16 *q; + guint8 *r; + gint v; + + p = src; + q = background; + r = diff; + for (i = 0; i < video_area; i++) { + R = ((*p) & 0xff0000) >> (16 - 1); + G = ((*p) & 0xff00) >> (8 - 2); + B = (*p) & 0xff; + v = (R + G + B) - (gint) (*q); + *q = (gint16) (R + G + B); + *r = ((v + y_threshold) >> 24) | ((y_threshold - v) >> 24); + + p++; + q++; + r++; + } +} + +static GstFlowReturn +gst_radioactv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstRadioacTV *filter = GST_RADIOACTV (trans); + guint32 *src, *dest; + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime timestamp, stream_time; + gint x, y; + guint32 a, b; + guint8 *diff, *p; + guint32 *palette; + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + GST_OBJECT_LOCK (filter); +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + if (filter->format == GST_VIDEO_FORMAT_RGBx) { + palette = &palettes[COLORS * filter->color]; + } else { + palette = &palettes[COLORS * swap_tab[filter->color]]; + } +#else + if (filter->format == GST_VIDEO_FORMAT_xBGR) { + palette = &palettes[COLORS * filter->color]; + } else { + palette = &palettes[COLORS * swap_tab[filter->color]]; + } +#endif + diff = filter->diff; + + if (filter->mode == 3 && filter->trigger) + filter->snaptime = 0; + else if (filter->mode == 3 && !filter->trigger) + filter->snaptime = 1; + + if (filter->mode != 2 || filter->snaptime <= 0) { + image_bgsubtract_update_y (src, filter->background, diff, + filter->width * filter->height, MAGIC_THRESHOLD * 7); + if (filter->mode == 0 || filter->snaptime <= 0) { + diff += filter->buf_margin_left; + p = filter->blurzoombuf; + for (y = 0; y < filter->buf_height; y++) { + for (x = 0; x < filter->buf_width; x++) { + p[x] |= diff[x] >> 3; + } + diff += filter->width; + p += filter->buf_width; + } + if (filter->mode == 1 || filter->mode == 2) { + memcpy (filter->snapframe, src, filter->width * filter->height * 4); + } + } + } + blurzoomcore (filter); + + if (filter->mode == 1 || filter->mode == 2) { + src = filter->snapframe; + } + p = filter->blurzoombuf; + for (y = 0; y < filter->height; y++) { + for (x = 0; x < filter->buf_margin_left; x++) { + *dest++ = *src++; + } + for (x = 0; x < filter->buf_width; x++) { + a = *src++ & 0xfefeff; + b = palette[*p++]; + a += b; + b = a & 0x1010100; + *dest++ = a | (b - (b >> 8)); + } + for (x = 0; x < filter->buf_margin_right; x++) { + *dest++ = *src++; + } + } + + if (filter->mode == 1 || filter->mode == 2) { + filter->snaptime--; + if (filter->snaptime < 0) { + filter->snaptime = filter->interval; + } + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_radioactv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstRadioacTV *filter = GST_RADIOACTV (btrans); + gboolean ret = FALSE; + + GST_OBJECT_LOCK (filter); + + if (gst_video_format_parse_caps (incaps, &filter->format, &filter->width, + &filter->height)) { + filter->buf_width_blocks = filter->width / 32; + if (filter->buf_width_blocks > 255) + goto out; + + filter->buf_width = filter->buf_width_blocks * 32; + filter->buf_height = filter->height; + filter->buf_area = filter->buf_height * filter->buf_width; + filter->buf_margin_left = (filter->width - filter->buf_width) / 2; + filter->buf_margin_right = + filter->height - filter->buf_width - filter->buf_margin_left; + + if (filter->blurzoombuf) + g_free (filter->blurzoombuf); + filter->blurzoombuf = g_new0 (guint8, filter->buf_area * 2); + + if (filter->blurzoomx) + g_free (filter->blurzoomx); + filter->blurzoomx = g_new0 (gint, filter->buf_width); + + if (filter->blurzoomy) + g_free (filter->blurzoomy); + filter->blurzoomy = g_new0 (gint, filter->buf_height); + + if (filter->snapframe) + g_free (filter->snapframe); + filter->snapframe = g_new (guint32, filter->width * filter->height); + + if (filter->diff) + g_free (filter->diff); + filter->diff = g_new (guint8, filter->width * filter->height); + + if (filter->background) + g_free (filter->background); + filter->background = g_new0 (gint16, filter->width * filter->height); + + setTable (filter); + + ret = TRUE; + } +out: + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_radioactv_start (GstBaseTransform * trans) +{ + GstRadioacTV *filter = GST_RADIOACTV (trans); + + filter->snaptime = 0; + + return TRUE; +} + +static void +gst_radioactv_finalize (GObject * object) +{ + GstRadioacTV *filter = GST_RADIOACTV (object); + + if (filter->snapframe) + g_free (filter->snapframe); + filter->snapframe = NULL; + + if (filter->blurzoombuf) + g_free (filter->blurzoombuf); + filter->blurzoombuf = NULL; + + if (filter->diff) + g_free (filter->diff); + filter->diff = NULL; + + if (filter->background) + g_free (filter->background); + filter->background = NULL; + + if (filter->blurzoomx) + g_free (filter->blurzoomx); + filter->blurzoomx = NULL; + + if (filter->blurzoomy) + g_free (filter->blurzoomy); + filter->blurzoomy = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_radioactv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRadioacTV *filter = GST_RADIOACTV (object); + + GST_OBJECT_LOCK (filter); + switch (prop_id) { + case PROP_MODE: + filter->mode = g_value_get_enum (value); + if (filter->mode == 3) + filter->snaptime = 1; + break; + case PROP_COLOR: + filter->color = g_value_get_enum (value); + break; + case PROP_INTERVAL: + filter->interval = g_value_get_uint (value); + break; + case PROP_TRIGGER: + filter->trigger = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (filter); +} + +static void +gst_radioactv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRadioacTV *filter = GST_RADIOACTV (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, filter->mode); + break; + case PROP_COLOR: + g_value_set_enum (value, filter->color); + break; + case PROP_INTERVAL: + g_value_set_uint (value, filter->interval); + break; + case PROP_TRIGGER: + g_value_set_boolean (value, filter->trigger); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_radioactv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "RadioacTV effect", + "Filter/Effect/Video", + "motion-enlightment effect", + "FUKUCHI, Kentarou , " + "Sebastian Dröge "); + + gst_element_class_add_static_pad_template (element_class, + &gst_radioactv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_radioactv_src_template); +} + +static void +gst_radioactv_class_init (GstRadioacTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_radioactv_set_property; + gobject_class->get_property = gst_radioactv_get_property; + + gobject_class->finalize = gst_radioactv_finalize; + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Mode", GST_TYPE_RADIOACTV_MODE, DEFAULT_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_COLOR, + g_param_spec_enum ("color", "Color", + "Color", GST_TYPE_RADIOACTV_COLOR, DEFAULT_COLOR, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INTERVAL, + g_param_spec_uint ("interval", "Interval", + "Snapshot interval (in strobe mode)", 0, G_MAXINT, DEFAULT_INTERVAL, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TRIGGER, + g_param_spec_boolean ("trigger", "Trigger", + "Trigger (in trigger mode)", DEFAULT_TRIGGER, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_radioactv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_radioactv_transform); + trans_class->start = GST_DEBUG_FUNCPTR (gst_radioactv_start); + + makePalette (); +} + +static void +gst_radioactv_init (GstRadioacTV * filter, GstRadioacTVClass * klass) +{ + filter->mode = DEFAULT_MODE; + filter->color = DEFAULT_COLOR; + filter->interval = DEFAULT_INTERVAL; + filter->trigger = DEFAULT_TRIGGER; +} diff --git a/gst/effectv/gstradioac.h b/gst/effectv/gstradioac.h new file mode 100644 index 0000000..64a425d --- /dev/null +++ b/gst/effectv/gstradioac.h @@ -0,0 +1,90 @@ +/* GStreamer + * Cradioacyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Cradioacyright (C) 2001-2006 FUKUCHI Kentaro + * + * RadioacTV - motion-enlightment effect. + * Copyright (C) 2001-2002 FUKUCHI Kentaro + * + * EffecTV is free software. 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 radioaction) any later version. + * + * This library is distributed in the hradioace 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 cradioacy 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_RADIOAC_H__ +#define __GST_RADIOAC_H__ + +#include + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RADIOACTV \ + (gst_radioactv_get_type()) +#define GST_RADIOACTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RADIOACTV,GstRadioacTV)) +#define GST_RADIOACTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RADIOACTV,GstRadioacTVClass)) +#define GST_IS_RADIOACTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RADIOACTV)) +#define GST_IS_RADIOACTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RADIOACTV)) + +typedef struct _GstRadioacTV GstRadioacTV; +typedef struct _GstRadioacTVClass GstRadioacTVClass; + +struct _GstRadioacTV +{ + GstVideoFilter element; + + /* < private > */ + gint width, height; + GstVideoFormat format; + + gint mode; + gint color; + guint interval; + gboolean trigger; + + gint snaptime; + + guint32 *snapframe; + guint8 *blurzoombuf; + guint8 *diff; + gint16 *background; + gint *blurzoomx; + gint *blurzoomy; + + gint buf_width_blocks; + gint buf_width; + gint buf_height; + gint buf_area; + gint buf_margin_right; + gint buf_margin_left; +}; + +struct _GstRadioacTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_radioactv_get_type (void); + +G_END_DECLS + +#endif /* __GST_RADIOAC_H__ */ diff --git a/gst/effectv/gstrev.c b/gst/effectv/gstrev.c new file mode 100644 index 0000000..a5cc4dd --- /dev/null +++ b/gst/effectv/gstrev.c @@ -0,0 +1,273 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * EffecTV: + * Copyright (C) 2001 FUKUCHI Kentarou + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001 FUKUCHI Kentarou + * + * revTV based on Rutt-Etra Video Synthesizer 1974? + + * (c)2002 Ed Tannenbaum + * + * This effect acts like a waveform monitor on each line. + * It was originally done by deflecting the electron beam on a monitor using + * additional electromagnets on the yoke of a b/w CRT. + * Here it is emulated digitally. + + * Experimaental tapes were made with this system by Bill and + * Louise Etra and Woody and Steina Vasulka + + * The line spacing can be controlled using the 1 and 2 Keys. + * The gain is controlled using the 3 and 4 keys. + * The update rate is controlled using the 0 and - keys. + + * EffecTV is free software. 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-quarktv + * + * RevTV acts like a video waveform monitor for each line of video + * processed. This creates a pseudo 3D effect based on the brightness + * of the video along each line. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! revtv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of revtv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstrev.h" + +#include +#include + +#define THE_COLOR 0xffffffff + +enum +{ + PROP_0, + PROP_DELAY, + PROP_LINESPACE, + PROP_GAIN +}; + +GST_BOILERPLATE (GstRevTV, gst_revtv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define CAPS_STR GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGBx +#else +#define CAPS_STR GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_xRGB +#endif + +static GstStaticPadTemplate gst_revtv_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static GstStaticPadTemplate gst_revtv_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static gboolean +gst_revtv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstRevTV *filter = GST_REVTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static GstFlowReturn +gst_revtv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) +{ + GstRevTV *filter = GST_REVTV (trans); + guint32 *src, *dest; + gint width, height; + guint32 *nsrc; + gint y, x, R, G, B, yval; + GstFlowReturn ret = GST_FLOW_OK; + gint linespace, vscale; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + GST_OBJECT_LOCK (filter); + width = filter->width; + height = filter->height; + + /* Clear everything to black */ + memset (dest, 0, width * height * sizeof (guint32)); + + linespace = filter->linespace; + vscale = filter->vscale; + + /* draw the offset lines */ + for (y = 0; y < height; y += linespace) { + for (x = 0; x <= width; x++) { + nsrc = src + (y * width) + x; + + /* Calc Y Value for curpix */ + R = ((*nsrc) & 0xff0000) >> (16 - 1); + G = ((*nsrc) & 0xff00) >> (8 - 2); + B = (*nsrc) & 0xff; + + yval = y - ((short) (R + G + B) / vscale); + + if (yval > 0) { + dest[x + (yval * width)] = THE_COLOR; + } + } + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static void +gst_revtv_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstRevTV *filter = GST_REVTV (object); + + GST_OBJECT_LOCK (filter); + switch (prop_id) { + case PROP_DELAY: + filter->vgrabtime = g_value_get_int (value); + break; + case PROP_LINESPACE: + filter->linespace = g_value_get_int (value); + break; + case PROP_GAIN: + filter->vscale = 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_revtv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstRevTV *filter = GST_REVTV (object); + + switch (prop_id) { + case PROP_DELAY: + g_value_set_int (value, filter->vgrabtime); + break; + case PROP_LINESPACE: + g_value_set_int (value, filter->linespace); + break; + case PROP_GAIN: + g_value_set_int (value, filter->vscale); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_revtv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "RevTV effect", + "Filter/Effect/Video", + "A video waveform monitor for each line of video processed", + "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &gst_revtv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_revtv_src_template); +} + +static void +gst_revtv_class_init (GstRevTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_revtv_set_property; + gobject_class->get_property = gst_revtv_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DELAY, + g_param_spec_int ("delay", "Delay", "Delay in frames between updates", + 1, 100, 1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LINESPACE, + g_param_spec_int ("linespace", "Linespace", "Control line spacing", 1, + 100, 6, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_GAIN, + g_param_spec_int ("gain", "Gain", "Control gain", 1, 200, 50, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_revtv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_revtv_transform); +} + +static void +gst_revtv_init (GstRevTV * restv, GstRevTVClass * klass) +{ + restv->vgrabtime = 1; + restv->vgrab = 0; + restv->linespace = 6; + restv->vscale = 50; +} diff --git a/gst/effectv/gstrev.h b/gst/effectv/gstrev.h new file mode 100644 index 0000000..867f49a --- /dev/null +++ b/gst/effectv/gstrev.h @@ -0,0 +1,88 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * EffecTV: + * Copyright (C) 2001 FUKUCHI Kentarou + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001 FUKUCHI Kentarou + * + * revTV based on Rutt-Etra Video Synthesizer 1974? + + * (c)2002 Ed Tannenbaum + * + * This effect acts like a waveform monitor on each line. + * It was originally done by deflecting the electron beam on a monitor using + * additional electromagnets on the yoke of a b/w CRT. + * Here it is emulated digitally. + + * Experimaental tapes were made with this system by Bill and + * Louise Etra and Woody and Steina Vasulka + + * The line spacing can be controlled using the 1 and 2 Keys. + * The gain is controlled using the 3 and 4 keys. + * The update rate is controlled using the 0 and - keys. + + * EffecTV is free software. 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_REV_H__ +#define __GST_REV_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_REVTV \ + (gst_revtv_get_type()) +#define GST_REVTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_REVTV,GstRevTV)) +#define GST_REVTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_REVTV,GstRevTVClass)) +#define GST_IS_REVTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_REVTV)) +#define GST_IS_REVTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_REVTV)) + +typedef struct _GstRevTV GstRevTV; +typedef struct _GstRevTVClass GstRevTVClass; + +struct _GstRevTV +{ + GstVideoFilter videofilter; + + /* < private > */ + + gint width, height; + gint vgrabtime; + gint vgrab; + gint linespace; + gint vscale; +}; + +struct _GstRevTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_revtv_get_type (void); + +G_END_DECLS + +#endif /* __GST_REV_H__ */ diff --git a/gst/effectv/gstripple.c b/gst/effectv/gstripple.c new file mode 100644 index 0000000..49ed75c --- /dev/null +++ b/gst/effectv/gstripple.c @@ -0,0 +1,622 @@ +/* GStreamer + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001-2006 FUKUCHI Kentaro + * + * RippleTV - Water ripple effect. + * Copyright (C) 2001-2002 FUKUCHI Kentaro + * + * This combines the RippleTV and BaltanTV effects, which are + * very similar. BaltanTV is used if the feedback property is set + * to TRUE, otherwise RippleTV is used. + * + * EffecTV is free software. 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-rippletv + * + * RippleTV does ripple mark effect on the video input. The ripple is caused + * by motion or random rain drops. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! rippletv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of rippletv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstripple.h" +#include "gsteffectv.h" + +#include +#include + +#define DEFAULT_MODE 0 + +enum +{ + PROP_0, + PROP_RESET, + PROP_MODE +}; + +static gint sqrtable[256]; + +#define GST_TYPE_RIPPLETV_MODE (gst_rippletv_mode_get_type()) +static GType +gst_rippletv_mode_get_type (void) +{ + static GType type = 0; + + static const GEnumValue enumvalue[] = { + {0, "Motion Detection", "motion-detection"}, + {1, "Rain", "rain"}, + {0, NULL, NULL}, + }; + + if (!type) { + type = g_enum_register_static ("GstRippleTVMode", enumvalue); + } + return type; +} + + +GST_BOILERPLATE (GstRippleTV, gst_rippletv, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +static GstStaticPadTemplate gst_rippletv_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB) + ); + +static GstStaticPadTemplate gst_rippletv_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB) + ); + +static const gint point = 16; +static const gint impact = 2; +static const gint decay = 8; +static const gint loopnum = 2; + +static void +setTable (void) +{ + gint i; + + for (i = 0; i < 128; i++) { + sqrtable[i] = i * i; + } + for (i = 1; i <= 128; i++) { + sqrtable[256 - i] = -i * i; + } +} + +static void +image_bgset_y (guint32 * src, gint16 * background, gint video_area) +{ + gint i; + gint R, G, B; + guint32 *p; + gint16 *q; + + p = src; + q = background; + for (i = 0; i < video_area; i++) { + R = ((*p) & 0xff0000) >> (16 - 1); + G = ((*p) & 0xff00) >> (8 - 2); + B = (*p) & 0xff; + *q = (gint16) (R + G + B); + p++; + q++; + } +} + +static gint +setBackground (GstRippleTV * filter, guint32 * src) +{ + image_bgset_y (src, filter->background, filter->width * filter->height); + filter->bg_is_set = TRUE; + + return 0; +} + +static void +image_bgsubtract_update_y (guint32 * src, gint16 * background, guint8 * diff, + gint video_area) +{ + gint i; + gint R, G, B; + guint32 *p; + gint16 *q; + guint8 *r; + gint v; + + p = src; + q = background; + r = diff; + for (i = 0; i < video_area; i++) { + R = ((*p) & 0xff0000) >> (16 - 1); + G = ((*p) & 0xff00) >> (8 - 2); + B = (*p) & 0xff; + v = (R + G + B) - (gint) (*q); + *q = (gint16) (R + G + B); + *r = ((v + 70 * 7) >> 24) | ((70 * 7 - v) >> 24); + + p++; + q++; + r++; + } +} + +static void +motiondetect (GstRippleTV * filter, guint32 * src) +{ + guint8 *diff = filter->diff; + gint width = filter->width; + gint *p, *q; + gint x, y, h; + + if (!filter->bg_is_set) + setBackground (filter, src); + + image_bgsubtract_update_y (src, filter->background, filter->diff, + filter->width * filter->height); + p = filter->map1 + filter->map_w + 1; + q = filter->map2 + filter->map_w + 1; + diff += filter->width + 2; + + for (y = filter->map_h - 2; y > 0; y--) { + for (x = filter->map_w - 2; x > 0; x--) { + h = (gint) * diff + (gint) * (diff + 1) + (gint) * (diff + width) + + (gint) * (diff + width + 1); + if (h > 0) { + *p = h << (point + impact - 8); + *q = *p; + } + p++; + q++; + diff += 2; + } + diff += width + 2; + p += 2; + q += 2; + } +} + +static inline void +drop (gint power, gint * map1, gint * map2, gint map_w, gint map_h) +{ + gint x, y; + gint *p, *q; + + x = fastrand () % (map_w - 4) + 2; + y = fastrand () % (map_h - 4) + 2; + p = map1 + y * map_w + x; + q = map2 + y * map_w + x; + *p = power; + *q = power; + *(p - map_w) = *(p - 1) = *(p + 1) = *(p + map_w) = power / 2; + *(p - map_w - 1) = *(p - map_w + 1) = *(p + map_w - 1) = *(p + map_w + 1) = + power / 4; + *(q - map_w) = *(q - 1) = *(q + 1) = *(q + map_w) = power / 2; + *(q - map_w - 1) = *(q - map_w + 1) = *(q + map_w - 1) = *(p + map_w + 1) = + power / 4; +} + +static void +raindrop (GstRippleTV * filter) +{ + gint i; + + if (filter->period == 0) { + switch (filter->rain_stat) { + case 0: + filter->period = (fastrand () >> 23) + 100; + filter->drop_prob = 0; + filter->drop_prob_increment = 0x00ffffff / filter->period; + filter->drop_power = (-(fastrand () >> 28) - 2) << point; + filter->drops_per_frame_max = 2 << (fastrand () >> 30); // 2,4,8 or 16 + filter->rain_stat = 1; + break; + case 1: + filter->drop_prob = 0x00ffffff; + filter->drops_per_frame = 1; + filter->drop_prob_increment = 1; + filter->period = (filter->drops_per_frame_max - 1) * 16; + filter->rain_stat = 2; + break; + case 2: + filter->period = (fastrand () >> 22) + 1000; + filter->drop_prob_increment = 0; + filter->rain_stat = 3; + break; + case 3: + filter->period = (filter->drops_per_frame_max - 1) * 16; + filter->drop_prob_increment = -1; + filter->rain_stat = 4; + break; + case 4: + filter->period = (fastrand () >> 24) + 60; + filter->drop_prob_increment = -(filter->drop_prob / filter->period); + filter->rain_stat = 5; + break; + case 5: + default: + filter->period = (fastrand () >> 23) + 500; + filter->drop_prob = 0; + filter->rain_stat = 0; + break; + } + } + switch (filter->rain_stat) { + default: + case 0: + break; + case 1: + case 5: + if ((fastrand () >> 8) < filter->drop_prob) { + drop (filter->drop_power, filter->map1, filter->map2, filter->map_w, + filter->map_h); + } + filter->drop_prob += filter->drop_prob_increment; + break; + case 2: + case 3: + case 4: + for (i = filter->drops_per_frame / 16; i > 0; i--) { + drop (filter->drop_power, filter->map1, filter->map2, filter->map_w, + filter->map_h); + } + filter->drops_per_frame += filter->drop_prob_increment; + break; + } + filter->period--; +} + +static GstFlowReturn +gst_rippletv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstRippleTV *filter = GST_RIPPLETV (trans); + guint32 *src, *dest; + GstFlowReturn ret = GST_FLOW_OK; + gint x, y, i; + gint dx, dy, o_dx; + gint h, v; + gint m_w, m_h, v_w, v_h; + gint *p, *q, *r; + gint8 *vp; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + GST_OBJECT_LOCK (filter); + /* impact from the motion or rain drop */ + if (filter->mode) + raindrop (filter); + else + motiondetect (filter, src); + + m_w = filter->map_w; + m_h = filter->map_h; + v_w = filter->width; + v_h = filter->height; + + /* simulate surface wave */ + + /* This function is called only 30 times per second. To increase a speed + * of wave, iterates this loop several times. */ + for (i = loopnum; i > 0; i--) { + /* wave simulation */ + p = filter->map1 + m_w + 1; + q = filter->map2 + m_w + 1; + r = filter->map3 + m_w + 1; + for (y = m_h - 2; y > 0; y--) { + for (x = m_w - 2; x > 0; x--) { + h = *(p - m_w - 1) + *(p - m_w + 1) + *(p + m_w - 1) + *(p + m_w + 1) + + *(p - m_w) + *(p - 1) + *(p + 1) + *(p + m_w) - (*p) * 9; + h = h >> 3; + v = *p - *q; + v += h - (v >> decay); + *r = v + *p; + p++; + q++; + r++; + } + p += 2; + q += 2; + r += 2; + } + + /* low pass filter */ + p = filter->map3 + m_w + 1; + q = filter->map2 + m_w + 1; + for (y = m_h - 2; y > 0; y--) { + for (x = m_w - 2; x > 0; x--) { + h = *(p - m_w) + *(p - 1) + *(p + 1) + *(p + m_w) + (*p) * 60; + *q = h >> 6; + p++; + q++; + } + p += 2; + q += 2; + } + + p = filter->map1; + filter->map1 = filter->map2; + filter->map2 = p; + } + + vp = filter->vtable; + p = filter->map1; + for (y = m_h - 1; y > 0; y--) { + for (x = m_w - 1; x > 0; x--) { + /* difference of the height between two voxel. They are twiced to + * emphasise the wave. */ + vp[0] = sqrtable[((p[0] - p[1]) >> (point - 1)) & 0xff]; + vp[1] = sqrtable[((p[0] - p[m_w]) >> (point - 1)) & 0xff]; + p++; + vp += 2; + } + p++; + vp += 2; + } + + vp = filter->vtable; + + /* draw refracted image. The vector table is stretched. */ + for (y = 0; y < v_h; y += 2) { + for (x = 0; x < v_w; x += 2) { + h = (gint) vp[0]; + v = (gint) vp[1]; + dx = x + h; + dy = y + v; + dx = CLAMP (dx, 0, (v_w - 2)); + dy = CLAMP (dy, 0, (v_h - 2)); + dest[0] = src[dy * v_w + dx]; + + o_dx = dx; + + dx = x + 1 + (h + (gint) vp[2]) / 2; + dx = CLAMP (dx, 0, (v_w - 2)); + dest[1] = src[dy * v_w + dx]; + + dy = y + 1 + (v + (gint) vp[m_w * 2 + 1]) / 2; + dy = CLAMP (dy, 0, (v_h - 2)); + dest[v_w] = src[dy * v_w + o_dx]; + + dest[v_w + 1] = src[dy * v_w + dx]; + dest += 2; + vp += 2; + } + dest += v_w; + vp += 2; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_rippletv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstRippleTV *filter = GST_RIPPLETV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + + filter->map_h = filter->height / 2 + 1; + filter->map_w = filter->width / 2 + 1; + + /* we over allocate the buffers, as the render code does not handle clipping + * very well */ + if (filter->map) + g_free (filter->map); + filter->map = g_new0 (gint, (1 + filter->map_h) * filter->map_w * 3); + + filter->map1 = filter->map; + filter->map2 = filter->map + filter->map_w * filter->map_h; + filter->map3 = filter->map + filter->map_w * filter->map_h * 2; + + if (filter->vtable) + g_free (filter->vtable); + filter->vtable = g_new0 (gint8, (1 + filter->map_h) * filter->map_w * 2); + + if (filter->background) + g_free (filter->background); + filter->background = g_new0 (gint16, filter->width * (filter->height + 1)); + + if (filter->diff) + g_free (filter->diff); + filter->diff = g_new0 (guint8, filter->width * (filter->height + 1)); + + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_rippletv_start (GstBaseTransform * trans) +{ + GstRippleTV *filter = GST_RIPPLETV (trans); + + filter->bg_is_set = FALSE; + + filter->period = 0; + filter->rain_stat = 0; + filter->drop_prob = 0; + filter->drop_prob_increment = 0; + filter->drops_per_frame_max = 0; + filter->drops_per_frame = 0; + filter->drop_power = 0; + + return TRUE; +} + +static void +gst_rippletv_finalize (GObject * object) +{ + GstRippleTV *filter = GST_RIPPLETV (object); + + if (filter->map) + g_free (filter->map); + filter->map = NULL; + + if (filter->vtable) + g_free (filter->vtable); + filter->vtable = NULL; + + if (filter->background) + g_free (filter->background); + filter->background = NULL; + + if (filter->diff) + g_free (filter->diff); + filter->diff = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_rippletv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRippleTV *filter = GST_RIPPLETV (object); + + GST_OBJECT_LOCK (filter); + switch (prop_id) { + case PROP_RESET:{ + memset (filter->map, 0, + filter->map_h * filter->map_w * 2 * sizeof (gint)); + break; + } + case PROP_MODE: + filter->mode = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (filter); +} + +static void +gst_rippletv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstRippleTV *filter = GST_RIPPLETV (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, filter->mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rippletv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "RippleTV effect", + "Filter/Effect/Video", + "RippleTV does ripple mark effect on the video input", + "FUKUCHI, Kentarou , " + "Sebastian Dröge "); + + gst_element_class_add_static_pad_template (element_class, + &gst_rippletv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rippletv_src_template); +} + +static void +gst_rippletv_class_init (GstRippleTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_rippletv_set_property; + gobject_class->get_property = gst_rippletv_get_property; + + gobject_class->finalize = gst_rippletv_finalize; + + g_object_class_install_property (gobject_class, PROP_RESET, + g_param_spec_boolean ("reset", "Reset", + "Reset all current ripples", FALSE, + G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Mode", GST_TYPE_RIPPLETV_MODE, DEFAULT_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_rippletv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_rippletv_transform); + trans_class->start = GST_DEBUG_FUNCPTR (gst_rippletv_start); + + setTable (); +} + +static void +gst_rippletv_init (GstRippleTV * filter, GstRippleTVClass * klass) +{ + filter->mode = DEFAULT_MODE; + + /* FIXME: remove this when memory corruption after resizes are fixed */ + gst_pad_use_fixed_caps (GST_BASE_TRANSFORM_SRC_PAD (filter)); + gst_pad_use_fixed_caps (GST_BASE_TRANSFORM_SINK_PAD (filter)); +} diff --git a/gst/effectv/gstripple.h b/gst/effectv/gstripple.h new file mode 100644 index 0000000..388ba56 --- /dev/null +++ b/gst/effectv/gstripple.h @@ -0,0 +1,87 @@ +/* GStreamer + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001-2006 FUKUCHI Kentaro + * + * RippleTV - Water ripple effect. + * Copyright (C) 2001-2002 FUKUCHI Kentaro + * + * EffecTV is free software. 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_RIPPLE_H__ +#define __GST_RIPPLE_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RIPPLETV \ + (gst_rippletv_get_type()) +#define GST_RIPPLETV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RIPPLETV,GstRippleTV)) +#define GST_RIPPLETV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RIPPLETV,GstRippleTVClass)) +#define GST_IS_RIPPLETV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RIPPLETV)) +#define GST_IS_RIPPLETV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RIPPLETV)) + +typedef struct _GstRippleTV GstRippleTV; +typedef struct _GstRippleTVClass GstRippleTVClass; + +struct _GstRippleTV +{ + GstVideoFilter element; + + /* < private > */ + gint width, height; + + gint mode; + + gint16 *background; + guint8 *diff; + + gint *map, *map1, *map2, *map3; + gint map_h, map_w; + + gint8 *vtable; + + gboolean bg_is_set; + + gint period; + gint rain_stat; + guint drop_prob; + gint drop_prob_increment; + gint drops_per_frame_max; + gint drops_per_frame; + gint drop_power; +}; + +struct _GstRippleTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_rippletv_get_type (void); + +G_END_DECLS + +#endif /* __GST_RIPPLE_H__ */ diff --git a/gst/effectv/gstshagadelic.c b/gst/effectv/gstshagadelic.c new file mode 100644 index 0000000..f2cb6e7 --- /dev/null +++ b/gst/effectv/gstshagadelic.c @@ -0,0 +1,270 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * EffecTV: + * Copyright (C) 2001 FUKUCHI Kentarou + * + * Inspired by Adrian Likin's script for the GIMP. + * EffecTV is free software. 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-shagadelictv + * + * Oh behave, ShagedelicTV makes images shagadelic! + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! shagadelictv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of shagadelictv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstshagadelic.h" +#include "gsteffectv.h" + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +GST_BOILERPLATE (GstShagadelicTV, gst_shagadelictv, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +static void gst_shagadelic_initialize (GstShagadelicTV * filter); + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define CAPS_STR GST_VIDEO_CAPS_BGRx +#else +#define CAPS_STR GST_VIDEO_CAPS_xRGB +#endif + +static GstStaticPadTemplate gst_shagadelictv_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static GstStaticPadTemplate gst_shagadelictv_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static gboolean +gst_shagadelictv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstShagadelicTV *filter = GST_SHAGADELICTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + gint area = filter->width * filter->height; + + g_free (filter->ripple); + g_free (filter->spiral); + + filter->ripple = (guint8 *) g_malloc (area * 4); + filter->spiral = (guint8 *) g_malloc (area); + + gst_shagadelic_initialize (filter); + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static void +gst_shagadelic_initialize (GstShagadelicTV * filter) +{ + int i, x, y; + +#ifdef PS2 + float xx, yy; +#else + double xx, yy; +#endif + + i = 0; + for (y = 0; y < filter->height * 2; y++) { + yy = y - filter->height; + yy *= yy; + + for (x = 0; x < filter->width * 2; x++) { + xx = x - filter->width; +#ifdef PS2 + filter->ripple[i++] = ((unsigned int) (sqrtf (xx * xx + yy) * 8)) & 255; +#else + filter->ripple[i++] = ((unsigned int) (sqrt (xx * xx + yy) * 8)) & 255; +#endif + } + } + + i = 0; + for (y = 0; y < filter->height; y++) { + yy = y - filter->height / 2; + + for (x = 0; x < filter->width; x++) { + xx = x - filter->width / 2; +#ifdef PS2 + filter->spiral[i++] = ((unsigned int) + ((atan2f (xx, + yy) / ((float) M_PI) * 256 * 9) + (sqrtf (xx * xx + + yy * yy) * 5))) & 255; +#else + filter->spiral[i++] = ((unsigned int) + ((atan2 (xx, yy) / M_PI * 256 * 9) + (sqrt (xx * xx + + yy * yy) * 5))) & 255; +#endif +/* Here is another Swinger! + * ((atan2(xx, yy)/M_PI*256) + (sqrt(xx*xx+yy*yy)*10))&255; + */ + } + } + filter->rx = fastrand () % filter->width; + filter->ry = fastrand () % filter->height; + filter->bx = fastrand () % filter->width; + filter->by = fastrand () % filter->height; + filter->rvx = -2; + filter->rvy = -2; + filter->bvx = 2; + filter->bvy = 2; + filter->phase = 0; +} + +static GstFlowReturn +gst_shagadelictv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstShagadelicTV *filter = GST_SHAGADELICTV (trans); + guint32 *src, *dest; + gint x, y; + guint32 v; + guint8 r, g, b; + gint width, height; + GstFlowReturn ret = GST_FLOW_OK; + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + GST_OBJECT_LOCK (filter); + width = filter->width; + height = filter->height; + + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + v = *src++ | 0x1010100; + v = (v - 0x707060) & 0x1010100; + v -= v >> 8; +/* Try another Babe! + * v = *src++; + * *dest++ = v & ((r<<16)|(g<<8)|b); + */ + r = ((gint8) (filter->ripple[(filter->ry + y) * width * 2 + filter->rx + + x] + filter->phase * 2)) >> 7; + g = ((gint8) (filter->spiral[y * width + x] + filter->phase * 3)) >> 7; + b = ((gint8) (filter->ripple[(filter->by + y) * width * 2 + filter->bx + + x] - filter->phase)) >> 7; + *dest++ = v & ((r << 16) | (g << 8) | b); + } + } + + filter->phase -= 8; + if ((filter->rx + filter->rvx) < 0 || (filter->rx + filter->rvx) >= width) + filter->rvx = -filter->rvx; + if ((filter->ry + filter->rvy) < 0 || (filter->ry + filter->rvy) >= height) + filter->rvy = -filter->rvy; + if ((filter->bx + filter->bvx) < 0 || (filter->bx + filter->bvx) >= width) + filter->bvx = -filter->bvx; + if ((filter->by + filter->bvy) < 0 || (filter->by + filter->bvy) >= height) + filter->bvy = -filter->bvy; + filter->rx += filter->rvx; + filter->ry += filter->rvy; + filter->bx += filter->bvx; + filter->by += filter->bvy; + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static void +gst_shagadelictv_finalize (GObject * object) +{ + GstShagadelicTV *filter = GST_SHAGADELICTV (object); + + if (filter->ripple) + g_free (filter->ripple); + filter->ripple = NULL; + + if (filter->spiral) + g_free (filter->spiral); + filter->spiral = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_shagadelictv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "ShagadelicTV", + "Filter/Effect/Video", + "Oh behave, ShagedelicTV makes images shagadelic!", + "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &gst_shagadelictv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_shagadelictv_src_template); +} + +static void +gst_shagadelictv_class_init (GstShagadelicTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->finalize = gst_shagadelictv_finalize; + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_shagadelictv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_shagadelictv_transform); +} + +static void +gst_shagadelictv_init (GstShagadelicTV * filter, GstShagadelicTVClass * klass) +{ + filter->ripple = NULL; + filter->spiral = NULL; +} diff --git a/gst/effectv/gstshagadelic.h b/gst/effectv/gstshagadelic.h new file mode 100644 index 0000000..d44faa7 --- /dev/null +++ b/gst/effectv/gstshagadelic.h @@ -0,0 +1,74 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * EffecTV: + * Copyright (C) 2001 FUKUCHI Kentarou + * + * Inspired by Adrian Likin's script for the GIMP. + * EffecTV is free software. 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_SHAGADELIC_H__ +#define __GST_SHAGADELIC_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SHAGADELICTV \ + (gst_shagadelictv_get_type()) +#define GST_SHAGADELICTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SHAGADELICTV,GstShagadelicTV)) +#define GST_SHAGADELICTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SHAGADELICTV,GstShagadelicTVClass)) +#define GST_IS_SHAGADELICTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SHAGADELICTV)) +#define GST_IS_SHAGADELICTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SHAGADELICTV)) + +typedef struct _GstShagadelicTV GstShagadelicTV; +typedef struct _GstShagadelicTVClass GstShagadelicTVClass; + +struct _GstShagadelicTV +{ + GstVideoFilter videofilter; + + /* < private > */ + + gint width, height; + gint stat; + guint8 *ripple; + guint8 *spiral; + guint8 phase; + gint rx, ry; + gint bx, by; + gint rvx, rvy; + gint bvx, bvy; +}; + +struct _GstShagadelicTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_shagadelictv_get_type (void); + +G_END_DECLS + +#endif /* __GST_SHAGADELIC_H__ */ diff --git a/gst/effectv/gststreak.c b/gst/effectv/gststreak.c new file mode 100644 index 0000000..3feb1f4 --- /dev/null +++ b/gst/effectv/gststreak.c @@ -0,0 +1,279 @@ +/* GStreamer + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001-2006 FUKUCHI Kentaro + * + * StreakTV - afterimage effector. + * Copyright (C) 2001-2002 FUKUCHI Kentaro + * + * This combines the StreakTV and BaltanTV effects, which are + * very similar. BaltanTV is used if the feedback property is set + * to TRUE, otherwise StreakTV is used. + * + * EffecTV is free software. 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-streaktv + * + * StreakTV makes after images of moving objects. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! streaktv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of streaktv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gststreak.h" +#include "gsteffectv.h" + +#include + +#define DEFAULT_FEEDBACK FALSE + +enum +{ + PROP_0, + PROP_FEEDBACK +}; + +GST_BOILERPLATE (GstStreakTV, gst_streaktv, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +static GstStaticPadTemplate gst_streaktv_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB) + ); + +static GstStaticPadTemplate gst_streaktv_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB) + ); + + + +static GstFlowReturn +gst_streaktv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstStreakTV *filter = GST_STREAKTV (trans); + guint32 *src, *dest; + GstFlowReturn ret = GST_FLOW_OK; + gint i, cf; + gint video_area = filter->width * filter->height; + guint32 **planetable = filter->planetable; + gint plane = filter->plane; + guint stride_mask, stride_shift, stride; + + GST_OBJECT_LOCK (filter); + if (filter->feedback) { + stride_mask = 0xfcfcfcfc; + stride = 8; + stride_shift = 2; + } else { + stride_mask = 0xf8f8f8f8; + stride = 4; + stride_shift = 3; + } + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + for (i = 0; i < video_area; i++) { + planetable[plane][i] = (src[i] & stride_mask) >> stride_shift; + } + + cf = plane & (stride - 1); + if (filter->feedback) { + for (i = 0; i < video_area; i++) { + dest[i] = planetable[cf][i] + + planetable[cf + stride][i] + + planetable[cf + stride * 2][i] + + planetable[cf + stride * 3][i]; + planetable[plane][i] = (dest[i] & stride_mask) >> stride_shift; + } + } else { + for (i = 0; i < video_area; i++) { + dest[i] = planetable[cf][i] + + planetable[cf + stride][i] + + planetable[cf + stride * 2][i] + + planetable[cf + stride * 3][i] + + planetable[cf + stride * 4][i] + + planetable[cf + stride * 5][i] + + planetable[cf + stride * 6][i] + + planetable[cf + stride * 7][i]; + } + } + + plane++; + filter->plane = plane & (PLANES - 1); + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_streaktv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstStreakTV *filter = GST_STREAKTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + gint i; + + if (filter->planebuffer) + g_free (filter->planebuffer); + + filter->planebuffer = + g_new0 (guint32, filter->width * filter->height * 4 * PLANES); + for (i = 0; i < PLANES; i++) + filter->planetable[i] = + &filter->planebuffer[filter->width * filter->height * i]; + + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_streaktv_start (GstBaseTransform * trans) +{ + GstStreakTV *filter = GST_STREAKTV (trans); + + filter->plane = 0; + + return TRUE; +} + +static void +gst_streaktv_finalize (GObject * object) +{ + GstStreakTV *filter = GST_STREAKTV (object); + + if (filter->planebuffer) { + g_free (filter->planebuffer); + filter->planebuffer = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_streaktv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstStreakTV *filter = GST_STREAKTV (object); + + switch (prop_id) { + case PROP_FEEDBACK: + if (G_UNLIKELY (GST_STATE (filter) >= GST_STATE_PAUSED)) { + g_warning ("Changing the \"feedback\" property only allowed " + "in state < PLAYING"); + return; + } + + filter->feedback = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_streaktv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstStreakTV *filter = GST_STREAKTV (object); + + switch (prop_id) { + case PROP_FEEDBACK: + g_value_set_boolean (value, filter->feedback); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_streaktv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "StreakTV effect", + "Filter/Effect/Video", + "StreakTV makes after images of moving objects", + "FUKUCHI, Kentarou , " + "Sebastian Dröge "); + + gst_element_class_add_static_pad_template (element_class, + &gst_streaktv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_streaktv_src_template); +} + +static void +gst_streaktv_class_init (GstStreakTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_streaktv_set_property; + gobject_class->get_property = gst_streaktv_get_property; + + gobject_class->finalize = gst_streaktv_finalize; + + g_object_class_install_property (gobject_class, PROP_FEEDBACK, + g_param_spec_boolean ("feedback", "Feedback", + "Feedback", DEFAULT_FEEDBACK, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_streaktv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_streaktv_transform); + trans_class->start = GST_DEBUG_FUNCPTR (gst_streaktv_start); +} + +static void +gst_streaktv_init (GstStreakTV * filter, GstStreakTVClass * klass) +{ + filter->feedback = DEFAULT_FEEDBACK; +} diff --git a/gst/effectv/gststreak.h b/gst/effectv/gststreak.h new file mode 100644 index 0000000..0e49a00 --- /dev/null +++ b/gst/effectv/gststreak.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) <2009> Sebastian Dröge + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001-2006 FUKUCHI Kentaro + * + * StreakTV - afterimage effector. + * Copyright (C) 2001-2002 FUKUCHI Kentaro + * + * EffecTV is free software. 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_STREAK_H__ +#define __GST_STREAK_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_STREAKTV \ + (gst_streaktv_get_type()) +#define GST_STREAKTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STREAKTV,GstStreakTV)) +#define GST_STREAKTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STREAKTV,GstStreakTVClass)) +#define GST_IS_STREAKTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STREAKTV)) +#define GST_IS_STREAKTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STREAKTV)) + +typedef struct _GstStreakTV GstStreakTV; +typedef struct _GstStreakTVClass GstStreakTVClass; + +#define PLANES 32 + +struct _GstStreakTV +{ + GstVideoFilter element; + + /* < private > */ + gint width, height; + + gboolean feedback; + + guint32 *planebuffer; + guint32 *planetable[PLANES]; + gint plane; +}; + +struct _GstStreakTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_streaktv_get_type (void); + +G_END_DECLS + +#endif /* __GST_STREAK_H__ */ diff --git a/gst/effectv/gstvertigo.c b/gst/effectv/gstvertigo.c new file mode 100644 index 0000000..51b1f90 --- /dev/null +++ b/gst/effectv/gstvertigo.c @@ -0,0 +1,328 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * EffecTV: + * Copyright (C) 2001 FUKUCHI Kentarou + * + * EffecTV is free software. 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-vertigotv + * + * VertigoTV is a loopback alpha blending effector with rotating and scaling. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! vertigotv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of vertigotv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstvertigo.h" + +#include +#include + +GST_BOILERPLATE (GstVertigoTV, gst_vertigotv, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +/* Filter signals and args */ +enum +{ + PROP_0, + PROP_SPEED, + PROP_ZOOM_SPEED +}; + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define CAPS_STR GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx +#else +#define CAPS_STR GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR +#endif + +static GstStaticPadTemplate gst_vertigotv_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static GstStaticPadTemplate gst_vertigotv_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_STR) + ); + +static gboolean +gst_vertigotv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstVertigoTV *filter = GST_VERTIGOTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + gint area = filter->width * filter->height; + + g_free (filter->buffer); + filter->buffer = (guint32 *) g_malloc0 (area * 2 * sizeof (guint32)); + + filter->current_buffer = filter->buffer; + filter->alt_buffer = filter->buffer + area; + filter->phase = 0; + + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static void +gst_vertigotv_set_parms (GstVertigoTV * filter) +{ + double vx, vy; + double t; + double x, y; + double dizz; + + dizz = sin (filter->phase) * 10 + sin (filter->phase * 1.9 + 5) * 5; + + x = filter->width / 2; + y = filter->height / 2; + + t = (x * x + y * y) * filter->zoomrate; + + if (filter->width > filter->height) { + if (dizz >= 0) { + if (dizz > x) + dizz = x; + vx = (x * (x - dizz) + y * y) / t; + } else { + if (dizz < -x) + dizz = -x; + vx = (x * (x + dizz) + y * y) / t; + } + vy = (dizz * y) / t; + } else { + if (dizz >= 0) { + if (dizz > y) + dizz = y; + vx = (x * x + y * (y - dizz)) / t; + } else { + if (dizz < -y) + dizz = -y; + vx = (x * x + y * (y + dizz)) / t; + } + vy = (dizz * x) / t; + } + filter->dx = vx * 65536; + filter->dy = vy * 65536; + filter->sx = (-vx * x + vy * y + x + cos (filter->phase * 5) * 2) * 65536; + filter->sy = (-vx * y - vy * x + y + sin (filter->phase * 6) * 2) * 65536; + + filter->phase += filter->phase_increment; + if (filter->phase > 5700000) + filter->phase = 0; +} + +static GstFlowReturn +gst_vertigotv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstVertigoTV *filter = GST_VERTIGOTV (trans); + guint32 *src, *dest, *p; + guint32 v; + gint x, y, ox, oy, i, width, height, area; + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (filter), stream_time); + + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); + + GST_OBJECT_LOCK (filter); + + width = filter->width; + height = filter->height; + area = width * height; + + gst_vertigotv_set_parms (filter); + p = filter->alt_buffer; + + for (y = height; y > 0; y--) { + ox = filter->sx; + oy = filter->sy; + + for (x = width; x > 0; x--) { + i = (oy >> 16) * width + (ox >> 16); + if (i < 0) + i = 0; + if (i >= area) + i = area; + + v = filter->current_buffer[i] & 0xfcfcff; + v = (v * 3) + ((*src++) & 0xfcfcff); + + *p++ = (v >> 2); + ox += filter->dx; + oy += filter->dy; + } + filter->sx -= filter->dy; + filter->sy += filter->dx; + } + + memcpy (dest, filter->alt_buffer, area * sizeof (guint32)); + + p = filter->current_buffer; + filter->current_buffer = filter->alt_buffer; + filter->alt_buffer = p; + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gboolean +gst_vertigotv_start (GstBaseTransform * trans) +{ + GstVertigoTV *filter = GST_VERTIGOTV (trans); + + filter->phase = 0.0; + + return TRUE; +} + +static void +gst_vertigotv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVertigoTV *filter = GST_VERTIGOTV (object); + + GST_OBJECT_LOCK (filter); + switch (prop_id) { + case PROP_SPEED: + filter->phase_increment = g_value_get_float (value); + break; + case PROP_ZOOM_SPEED: + filter->zoomrate = g_value_get_float (value); + break; + default: + break; + } + GST_OBJECT_UNLOCK (filter); +} + +static void +gst_vertigotv_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVertigoTV *filter = GST_VERTIGOTV (object); + + switch (prop_id) { + case PROP_SPEED: + g_value_set_float (value, filter->phase_increment); + break; + case PROP_ZOOM_SPEED: + g_value_set_float (value, filter->zoomrate); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_vertigotv_finalize (GObject * object) +{ + GstVertigoTV *filter = GST_VERTIGOTV (object); + + g_free (filter->buffer); + filter->buffer = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_vertigotv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "VertigoTV effect", + "Filter/Effect/Video", + "A loopback alpha blending effector with rotating and scaling", + "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &gst_vertigotv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_vertigotv_src_template); +} + +static void +gst_vertigotv_class_init (GstVertigoTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_vertigotv_set_property; + gobject_class->get_property = gst_vertigotv_get_property; + gobject_class->finalize = gst_vertigotv_finalize; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SPEED, + g_param_spec_float ("speed", "Speed", "Control the speed of movement", + 0.01, 100.0, 0.02, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ZOOM_SPEED, + g_param_spec_float ("zoom-speed", "Zoom Speed", + "Control the rate of zooming", 1.01, 1.1, 1.01, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->start = GST_DEBUG_FUNCPTR (gst_vertigotv_start); + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_vertigotv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_vertigotv_transform); +} + +static void +gst_vertigotv_init (GstVertigoTV * filter, GstVertigoTVClass * klass) +{ + filter->buffer = NULL; + filter->phase = 0.0; + filter->phase_increment = 0.02; + filter->zoomrate = 1.01; +} diff --git a/gst/effectv/gstvertigo.h b/gst/effectv/gstvertigo.h new file mode 100644 index 0000000..efc63ec --- /dev/null +++ b/gst/effectv/gstvertigo.h @@ -0,0 +1,72 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * EffecTV: + * Copyright (C) 2001 FUKUCHI Kentarou + * + * EffecTV is free software. 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_VERTIGO_H__ +#define __GST_VERTIGO_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VERTIGOTV \ + (gst_vertigotv_get_type()) +#define GST_VERTIGOTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VERTIGOTV,GstVertigoTV)) +#define GST_VERTIGOTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VERTIGOTV,GstVertigoTVClass)) +#define GST_IS_VERTIGOTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VERTIGOTV)) +#define GST_IS_VERTIGOTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VERTIGOTV)) + +typedef struct _GstVertigoTV GstVertigoTV; +typedef struct _GstVertigoTVClass GstVertigoTVClass; + +struct _GstVertigoTV +{ + GstVideoFilter videofilter; + + /* < private > */ + + gint width, height; + guint32 *buffer; + guint32 *current_buffer, *alt_buffer; + gint dx, dy; + gint sx, sy; + gdouble phase; + gdouble phase_increment; + gdouble zoomrate; +}; + +struct _GstVertigoTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_vertigotv_get_type (void); + +G_END_DECLS + +#endif /* __GST_VERTIGO_H__ */ diff --git a/gst/effectv/gstwarp.c b/gst/effectv/gstwarp.c new file mode 100644 index 0000000..fff0d4e --- /dev/null +++ b/gst/effectv/gstwarp.c @@ -0,0 +1,288 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001 FUKUCHI Kentarou + * + * 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 was (probably) generated from gstvideotemplate.c, + * gstvideotemplate.c,v 1.11 2004/01/07 08:56:45 ds Exp + */ + +/* From main.c of warp-1.1: + * + * Simple DirectMedia Layer demo + * Realtime picture 'gooing' + * by sam lantinga slouken@devolution.com + */ + +/** + * SECTION:element-warptv + * + * WarpTV does realtime goo'ing of the video input. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! warptv ! ffmpegcolorspace ! autovideosink + * ]| This pipeline shows the effect of warptv on a test stream. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstwarp.h" + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +GST_BOILERPLATE (GstWarpTV, gst_warptv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); + +static void initSinTable (); +static void initOffsTable (GstWarpTV * filter); +static void initDistTable (GstWarpTV * filter); + +static GstStaticPadTemplate gst_warptv_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";" + GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR) + ); + +static GstStaticPadTemplate gst_warptv_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";" + GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR) + ); + +static gboolean +gst_warptv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstWarpTV *filter = GST_WARPTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; + + structure = gst_caps_get_structure (incaps, 0); + + GST_OBJECT_LOCK (filter); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + g_free (filter->disttable); + g_free (filter->offstable); + + filter->offstable = g_malloc (filter->height * sizeof (guint32)); + filter->disttable = + g_malloc (filter->width * filter->height * sizeof (guint32)); + + initOffsTable (filter); + initDistTable (filter); + ret = TRUE; + } + GST_OBJECT_UNLOCK (filter); + + return ret; +} + +static gint32 sintable[1024 + 256]; + +static void +initSinTable (void) +{ + gint32 *tptr, *tsinptr; + gint i; + + tsinptr = tptr = sintable; + + for (i = 0; i < 1024; i++) + *tptr++ = (int) (sin (i * M_PI / 512) * 32767); + + for (i = 0; i < 256; i++) + *tptr++ = *tsinptr++; +} + +static void +initOffsTable (GstWarpTV * filter) +{ + gint y; + + for (y = 0; y < filter->height; y++) { + filter->offstable[y] = y * filter->width; + } +} + +static void +initDistTable (GstWarpTV * filter) +{ + gint32 halfw, halfh, *distptr; + gint x, y; + float m; + + halfw = filter->width >> 1; + halfh = filter->height >> 1; + + distptr = filter->disttable; + + m = sqrt ((double) (halfw * halfw + halfh * halfh)); + + for (y = -halfh; y < halfh; y++) + for (x = -halfw; x < halfw; x++) +#ifdef PS2 + *distptr++ = ((int) ((sqrtf (x * x + y * y) * 511.9999) / m)) << 1; +#else + *distptr++ = ((int) ((sqrt (x * x + y * y) * 511.9999) / m)) << 1; +#endif +} + +static GstFlowReturn +gst_warptv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) +{ + GstWarpTV *warptv = GST_WARPTV (trans); + gint width, height; + guint32 *src = (guint32 *) GST_BUFFER_DATA (in); + guint32 *dest = (guint32 *) GST_BUFFER_DATA (out); + gint xw, yw, cw; + gint32 c, i, x, y, dx, dy, maxx, maxy; + gint32 skip, *ctptr, *distptr; + gint32 *ctable; + GstFlowReturn ret = GST_FLOW_OK; + + GST_OBJECT_LOCK (warptv); + width = warptv->width; + height = warptv->height; + + xw = (gint) (sin ((warptv->tval + 100) * M_PI / 128) * 30); + yw = (gint) (sin ((warptv->tval) * M_PI / 256) * -35); + cw = (gint) (sin ((warptv->tval - 70) * M_PI / 64) * 50); + xw += (gint) (sin ((warptv->tval - 10) * M_PI / 512) * 40); + yw += (gint) (sin ((warptv->tval + 30) * M_PI / 512) * 40); + + ctptr = warptv->ctable; + distptr = warptv->disttable; + ctable = warptv->ctable; + + skip = 0; /* video_width*sizeof(RGB32)/4 - video_width;; */ + c = 0; + + for (x = 0; x < 512; x++) { + i = (c >> 3) & 0x3FE; + *ctptr++ = ((sintable[i] * yw) >> 15); + *ctptr++ = ((sintable[i + 256] * xw) >> 15); + c += cw; + } + maxx = width - 2; + maxy = height - 2; + + for (y = 0; y < height - 1; y++) { + for (x = 0; x < width; x++) { + i = *distptr++; + dx = ctable[i + 1] + x; + dy = ctable[i] + y; + + if (dx < 0) + dx = 0; + else if (dx > maxx) + dx = maxx; + + if (dy < 0) + dy = 0; + else if (dy > maxy) + dy = maxy; + *dest++ = src[warptv->offstable[dy] + dx]; + } + dest += skip; + } + + warptv->tval = (warptv->tval + 1) & 511; + GST_OBJECT_UNLOCK (warptv); + + return ret; +} + +static gboolean +gst_warptv_start (GstBaseTransform * trans) +{ + GstWarpTV *warptv = GST_WARPTV (trans); + + warptv->tval = 0; + + return TRUE; +} + +static void +gst_warptv_finalize (GObject * object) +{ + GstWarpTV *warptv = GST_WARPTV (object); + + g_free (warptv->offstable); + warptv->offstable = NULL; + g_free (warptv->disttable); + warptv->disttable = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_warptv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "WarpTV effect", + "Filter/Effect/Video", + "WarpTV does realtime goo'ing of the video input", + "Sam Lantinga "); + + gst_element_class_add_static_pad_template (element_class, + &gst_warptv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_warptv_src_template); +} + +static void +gst_warptv_class_init (GstWarpTVClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->finalize = gst_warptv_finalize; + + trans_class->start = GST_DEBUG_FUNCPTR (gst_warptv_start); + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_warptv_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_warptv_transform); + + initSinTable (); +} + +static void +gst_warptv_init (GstWarpTV * warptv, GstWarpTVClass * klass) +{ + /* nothing to do */ +} diff --git a/gst/effectv/gstwarp.h b/gst/effectv/gstwarp.h new file mode 100644 index 0000000..a987960 --- /dev/null +++ b/gst/effectv/gstwarp.h @@ -0,0 +1,69 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * + * EffecTV - Realtime Digital Video Effector + * Copyright (C) 2001 FUKUCHI Kentarou + * + * 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_WARP_H__ +#define __GST_WARP_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_WARPTV \ + (gst_warptv_get_type()) +#define GST_WARPTV(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WARPTV,GstWarpTV)) +#define GST_WARPTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WARPTV,GstWarpTVClass)) +#define GST_IS_WARPTV(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WARPTV)) +#define GST_IS_WARPTV_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WARPTV)) + +typedef struct _GstWarpTV GstWarpTV; +typedef struct _GstWarpTVClass GstWarpTVClass; + +struct _GstWarpTV +{ + GstVideoFilter videofilter; + + /* < private > */ + + gint width, height; + gint *offstable; + gint32 *disttable; + gint32 ctable[1024]; + gint tval; +}; + +struct _GstWarpTVClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_warptv_get_type (void); + +G_END_DECLS + +#endif /* __GST_WARP_H__ */ diff --git a/gst/equalizer/GstIirEqualizer10Bands.prs b/gst/equalizer/GstIirEqualizer10Bands.prs new file mode 100644 index 0000000..9b261b8 --- /dev/null +++ b/gst/equalizer/GstIirEqualizer10Bands.prs @@ -0,0 +1,174 @@ +[_presets_] +version=0.10 +element-name=GstIirEqualizer10Bands + +[ballad] +band0=4 +band1=3.75 +band2=2.5 +band3=0 +band4=-4 +band5=-6 +band6=-3 +band7=0 +band8=2.5 +band9=9 + +[classic] +band0=0 +band1=0 +band2=0 +band3=0 +band4=0 +band5=0 +band6=-6 +band7=-7 +band8=-7 +band9=-9.5 + +[club] +band0=0 +band1=0 +band2=8 +band3=6 +band4=5.5 +band5=5 +band6=3 +band7=0 +band8=0 +band9=0 + +[dance] +band0=9.6 +band1=7 +band2=2.5 +band3=0 +band4=0 +band5=-5.6 +band6=-7 +band7=-7 +band8=0 +band9=0 + +[pop] +band0=-1.6 +band1=4.5 +band2=7 +band3=8 +band4=5.6 +band5=0 +band6=-2.5 +band7=-2 +band8=-1.6 +band9=-1.5 + +[reggae] +band0=0 +band1=0 +band2=0 +band3=-5.5 +band4=0 +band5=6.5 +band6=6.5 +band7=0 +band8=0 +band9=0 + +[rock] +band0=8 +band1=5 +band2=-5.5 +band3=-8 +band4=-3 +band5=4 +band6=8 +band7=11 +band8=11 +band9=11.5 + +[ska] +band0=-2.5 +band1=-5 +band2=-4 +band3=0 +band4=4 +band5=5.5 +band6=8 +band7=9 +band8=11 +band9=9 + +[soft] +band0=5 +band1=1.5 +band2=0 +band3=-2.5 +band4=0 +band5=4 +band6=8 +band7=9 +band8=11 +band9=12 + +[techno] +band0=8 +band1=5.5 +band2=0 +band3=-5.5 +band4=-5 +band5=0 +band6=8 +band7=10 +band8=10 +band9=9 + + +[party] +band0=7 +band1=7 +band2=0 +band3=0 +band4=0 +band5=0 +band6=0 +band7=0 +band8=7 +band9=7 + + +[more bass] +band0=-8 +band1=10 +band2=10 +band3=5.5 +band4=1.5 +band5=-4 +band6=-8 +band7=-10 +band8=-11 +band9=-11 + +[more bass and treble] +band0=8 +band1=5.5 +band2=0 +band3=-7 +band4=-5 +band5=1.5 +band6=8 +band7=11.2 +band8=12 +band9=12 + +[more treble] +band0=-10 +band1=-10 +band2=-10 +band3=-4 +band4=2.5 +band5=11 +band6=16 +band7=16 +band8=16 +band9=18 + diff --git a/gst/equalizer/GstIirEqualizer3Bands.prs b/gst/equalizer/GstIirEqualizer3Bands.prs new file mode 100644 index 0000000..fb8ef5a --- /dev/null +++ b/gst/equalizer/GstIirEqualizer3Bands.prs @@ -0,0 +1,14 @@ +[_presets_] +version=0.10 +element-name=GstIirEqualizer3Bands + +[more bass] +band0=7.75 +band1=0 +band2=0 + +[more trebble] +band0=0 +band1=0 +band2=6.0 + diff --git a/gst/equalizer/Makefile.am b/gst/equalizer/Makefile.am new file mode 100644 index 0000000..b3b8663 --- /dev/null +++ b/gst/equalizer/Makefile.am @@ -0,0 +1,36 @@ +plugin_LTLIBRARIES = libgstequalizer.la + +libgstequalizer_la_SOURCES = \ + gstiirequalizer.c gstiirequalizer.h \ + gstiirequalizernbands.c gstiirequalizernbands.h \ + gstiirequalizer3bands.c gstiirequalizer3bands.h \ + gstiirequalizer10bands.c gstiirequalizer10bands.h + +libgstequalizer_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) +libgstequalizer_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \ + $(GST_LIBS) $(LIBM) +libgstequalizer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstequalizer_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstiirequalizer.h + +presetdir = $(datadir)/gstreamer-$(GST_MAJORMINOR)/presets +preset_DATA = GstIirEqualizer3Bands.prs GstIirEqualizer10Bands.prs + +EXTRA_DIST = $(preset_DATA) + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstequalizer -:SHARED libgstequalizer \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstequalizer_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstequalizer_la_CFLAGS) \ + -:LDFLAGS $(libgstequalizer_la_LDFLAGS) \ + $(libgstequalizer_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/equalizer/Makefile.in b/gst/equalizer/Makefile.in new file mode 100644 index 0000000..73e8aec --- /dev/null +++ b/gst/equalizer/Makefile.in @@ -0,0 +1,881 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/equalizer +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(presetdir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstequalizer_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstequalizer_la_OBJECTS = libgstequalizer_la-gstiirequalizer.lo \ + libgstequalizer_la-gstiirequalizernbands.lo \ + libgstequalizer_la-gstiirequalizer3bands.lo \ + libgstequalizer_la-gstiirequalizer10bands.lo +libgstequalizer_la_OBJECTS = $(am_libgstequalizer_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstequalizer_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstequalizer_la_CFLAGS) $(CFLAGS) \ + $(libgstequalizer_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstequalizer_la_SOURCES) +DIST_SOURCES = $(libgstequalizer_la_SOURCES) +DATA = $(preset_DATA) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstequalizer.la +libgstequalizer_la_SOURCES = \ + gstiirequalizer.c gstiirequalizer.h \ + gstiirequalizernbands.c gstiirequalizernbands.h \ + gstiirequalizer3bands.c gstiirequalizer3bands.h \ + gstiirequalizer10bands.c gstiirequalizer10bands.h + +libgstequalizer_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) + +libgstequalizer_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \ + $(GST_LIBS) $(LIBM) + +libgstequalizer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstequalizer_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstiirequalizer.h +presetdir = $(datadir)/gstreamer-$(GST_MAJORMINOR)/presets +preset_DATA = GstIirEqualizer3Bands.prs GstIirEqualizer10Bands.prs +EXTRA_DIST = $(preset_DATA) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/equalizer/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/equalizer/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstequalizer.la: $(libgstequalizer_la_OBJECTS) $(libgstequalizer_la_DEPENDENCIES) $(EXTRA_libgstequalizer_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstequalizer_la_LINK) -rpath $(plugindir) $(libgstequalizer_la_OBJECTS) $(libgstequalizer_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstequalizer_la-gstiirequalizer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstequalizer_la-gstiirequalizer3bands.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstequalizer_la-gstiirequalizernbands.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstequalizer_la-gstiirequalizer.lo: gstiirequalizer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Tpo -c -o libgstequalizer_la-gstiirequalizer.lo `test -f 'gstiirequalizer.c' || echo '$(srcdir)/'`gstiirequalizer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstiirequalizer.c' object='libgstequalizer_la-gstiirequalizer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer.lo `test -f 'gstiirequalizer.c' || echo '$(srcdir)/'`gstiirequalizer.c + +libgstequalizer_la-gstiirequalizernbands.lo: gstiirequalizernbands.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizernbands.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizernbands.Tpo -c -o libgstequalizer_la-gstiirequalizernbands.lo `test -f 'gstiirequalizernbands.c' || echo '$(srcdir)/'`gstiirequalizernbands.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizernbands.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizernbands.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstiirequalizernbands.c' object='libgstequalizer_la-gstiirequalizernbands.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizernbands.lo `test -f 'gstiirequalizernbands.c' || echo '$(srcdir)/'`gstiirequalizernbands.c + +libgstequalizer_la-gstiirequalizer3bands.lo: gstiirequalizer3bands.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer3bands.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer3bands.Tpo -c -o libgstequalizer_la-gstiirequalizer3bands.lo `test -f 'gstiirequalizer3bands.c' || echo '$(srcdir)/'`gstiirequalizer3bands.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizer3bands.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer3bands.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstiirequalizer3bands.c' object='libgstequalizer_la-gstiirequalizer3bands.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer3bands.lo `test -f 'gstiirequalizer3bands.c' || echo '$(srcdir)/'`gstiirequalizer3bands.c + +libgstequalizer_la-gstiirequalizer10bands.lo: gstiirequalizer10bands.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer10bands.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Tpo -c -o libgstequalizer_la-gstiirequalizer10bands.lo `test -f 'gstiirequalizer10bands.c' || echo '$(srcdir)/'`gstiirequalizer10bands.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstiirequalizer10bands.c' object='libgstequalizer_la-gstiirequalizer10bands.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer10bands.lo `test -f 'gstiirequalizer10bands.c' || echo '$(srcdir)/'`gstiirequalizer10bands.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-presetDATA: $(preset_DATA) + @$(NORMAL_INSTALL) + test -z "$(presetdir)" || $(MKDIR_P) "$(DESTDIR)$(presetdir)" + @list='$(preset_DATA)'; test -n "$(presetdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(presetdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(presetdir)" || exit $$?; \ + done + +uninstall-presetDATA: + @$(NORMAL_UNINSTALL) + @list='$(preset_DATA)'; test -n "$(presetdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(presetdir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(presetdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES install-presetDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES uninstall-presetDATA + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-presetDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES \ + uninstall-presetDATA + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstequalizer -:SHARED libgstequalizer \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstequalizer_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstequalizer_la_CFLAGS) \ + -:LDFLAGS $(libgstequalizer_la_LDFLAGS) \ + $(libgstequalizer_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/equalizer/gstiirequalizer.c b/gst/equalizer/gstiirequalizer.c new file mode 100644 index 0000000..ffd2c43 --- /dev/null +++ b/gst/equalizer/gstiirequalizer.c @@ -0,0 +1,942 @@ +/* GStreamer + * Copyright (C) <2004> Benjamin Otte + * <2007> Stefan Kost + * <2007> Sebastian Dröge + * + * 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 +#include + +#include "gstiirequalizer.h" +#include "gstiirequalizernbands.h" +#include "gstiirequalizer3bands.h" +#include "gstiirequalizer10bands.h" + +#include "gst/glib-compat-private.h" + +GST_DEBUG_CATEGORY (equalizer_debug); +#define GST_CAT_DEFAULT equalizer_debug + +#define BANDS_LOCK(equ) g_mutex_lock(equ->bands_lock) +#define BANDS_UNLOCK(equ) g_mutex_unlock(equ->bands_lock) + +static void gst_iir_equalizer_child_proxy_interface_init (gpointer g_iface, + gpointer iface_data); + +static void gst_iir_equalizer_finalize (GObject * object); + +static gboolean gst_iir_equalizer_setup (GstAudioFilter * filter, + GstRingBufferSpec * fmt); +static GstFlowReturn gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, + GstBuffer * buf); + +#define ALLOWED_CAPS \ + "audio/x-raw-int," \ + " depth=(int)16," \ + " width=(int)16," \ + " endianness=(int)BYTE_ORDER," \ + " signed=(bool)TRUE," \ + " rate=(int)[1000,MAX]," \ + " channels=(int)[1,MAX]; " \ + "audio/x-raw-float," \ + " width=(int) { 32, 64 } ," \ + " endianness=(int)BYTE_ORDER," \ + " rate=(int)[1000,MAX]," \ + " channels=(int)[1,MAX]" + +static void +_do_init (GType object_type) +{ + const GInterfaceInfo child_proxy_interface_info = { + (GInterfaceInitFunc) gst_iir_equalizer_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 (GstIirEqualizer, gst_iir_equalizer, + GstAudioFilter, GST_TYPE_AUDIO_FILTER, _do_init); + +/* child object */ + +enum +{ + PROP_GAIN = 1, + PROP_FREQ, + PROP_BANDWIDTH, + PROP_TYPE +}; + +typedef enum +{ + BAND_TYPE_PEAK = 0, + BAND_TYPE_LOW_SHELF, + BAND_TYPE_HIGH_SHELF +} GstIirEqualizerBandType; + +#define GST_TYPE_IIR_EQUALIZER_BAND_TYPE (gst_iir_equalizer_band_type_get_type ()) +static GType +gst_iir_equalizer_band_type_get_type (void) +{ + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {BAND_TYPE_PEAK, "Peak filter (default for inner bands)", "peak"}, + {BAND_TYPE_LOW_SHELF, "Low shelf filter (default for first band)", + "low-shelf"}, + {BAND_TYPE_HIGH_SHELF, "High shelf filter (default for last band)", + "high-shelf"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstIirEqualizerBandType", values); + } + return gtype; +} + + +typedef struct _GstIirEqualizerBandClass GstIirEqualizerBandClass; + +#define GST_TYPE_IIR_EQUALIZER_BAND \ + (gst_iir_equalizer_band_get_type()) +#define GST_IIR_EQUALIZER_BAND(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_BAND,GstIirEqualizerBand)) +#define GST_IIR_EQUALIZER_BAND_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_BAND,GstIirEqualizerBandClass)) +#define GST_IS_IIR_EQUALIZER_BAND(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_BAND)) +#define GST_IS_IIR_EQUALIZER_BAND_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_BAND)) + +struct _GstIirEqualizerBand +{ + GstObject object; + + /*< private > */ + /* center frequency and gain */ + gdouble freq; + gdouble gain; + gdouble width; + GstIirEqualizerBandType type; + + /* second order iir filter */ + gdouble b1, b2; /* IIR coefficients for outputs */ + gdouble a0, a1, a2; /* IIR coefficients for inputs */ +}; + +struct _GstIirEqualizerBandClass +{ + GstObjectClass parent_class; +}; + +static GType gst_iir_equalizer_band_get_type (void); + +static void +gst_iir_equalizer_band_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstIirEqualizerBand *band = GST_IIR_EQUALIZER_BAND (object); + GstIirEqualizer *equ = + GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band))); + + switch (prop_id) { + case PROP_GAIN:{ + gdouble gain; + + gain = g_value_get_double (value); + GST_DEBUG_OBJECT (band, "gain = %lf -> %lf", band->gain, gain); + if (gain != band->gain) { + BANDS_LOCK (equ); + equ->need_new_coefficients = TRUE; + band->gain = gain; + BANDS_UNLOCK (equ); + GST_DEBUG_OBJECT (band, "changed gain = %lf ", band->gain); + } + break; + } + case PROP_FREQ:{ + gdouble freq; + + freq = g_value_get_double (value); + GST_DEBUG_OBJECT (band, "freq = %lf -> %lf", band->freq, freq); + if (freq != band->freq) { + BANDS_LOCK (equ); + equ->need_new_coefficients = TRUE; + band->freq = freq; + BANDS_UNLOCK (equ); + GST_DEBUG_OBJECT (band, "changed freq = %lf ", band->freq); + } + break; + } + case PROP_BANDWIDTH:{ + gdouble width; + + width = g_value_get_double (value); + GST_DEBUG_OBJECT (band, "width = %lf -> %lf", band->width, width); + if (width != band->width) { + BANDS_LOCK (equ); + equ->need_new_coefficients = TRUE; + band->width = width; + BANDS_UNLOCK (equ); + GST_DEBUG_OBJECT (band, "changed width = %lf ", band->width); + } + break; + } + case PROP_TYPE:{ + GstIirEqualizerBandType type; + + type = g_value_get_enum (value); + GST_DEBUG_OBJECT (band, "type = %d -> %d", band->type, type); + if (type != band->type) { + BANDS_LOCK (equ); + equ->need_new_coefficients = TRUE; + band->type = type; + BANDS_UNLOCK (equ); + GST_DEBUG_OBJECT (band, "changed type = %d ", band->type); + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + gst_object_unref (equ); +} + +static void +gst_iir_equalizer_band_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstIirEqualizerBand *band = GST_IIR_EQUALIZER_BAND (object); + + switch (prop_id) { + case PROP_GAIN: + g_value_set_double (value, band->gain); + break; + case PROP_FREQ: + g_value_set_double (value, band->freq); + break; + case PROP_BANDWIDTH: + g_value_set_double (value, band->width); + break; + case PROP_TYPE: + g_value_set_enum (value, band->type); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_iir_equalizer_band_class_init (GstIirEqualizerBandClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = gst_iir_equalizer_band_set_property; + gobject_class->get_property = gst_iir_equalizer_band_get_property; + + g_object_class_install_property (gobject_class, PROP_GAIN, + g_param_spec_double ("gain", "gain", + "gain for the frequency band ranging from -24.0 dB to +12.0 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_FREQ, + g_param_spec_double ("freq", "freq", + "center frequency of the band", + 0.0, 100000.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_BANDWIDTH, + g_param_spec_double ("bandwidth", "bandwidth", + "difference between bandedges in Hz", + 0.0, 100000.0, 1.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_TYPE, + g_param_spec_enum ("type", "Type", + "Filter type", GST_TYPE_IIR_EQUALIZER_BAND_TYPE, + BAND_TYPE_PEAK, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); +} + +static void +gst_iir_equalizer_band_init (GstIirEqualizerBand * band, + GstIirEqualizerBandClass * klass) +{ + band->freq = 0.0; + band->gain = 0.0; + band->width = 1.0; + band->type = BAND_TYPE_PEAK; +} + +static GType +gst_iir_equalizer_band_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (!type)) { + const GTypeInfo type_info = { + sizeof (GstIirEqualizerBandClass), + NULL, + NULL, + (GClassInitFunc) gst_iir_equalizer_band_class_init, + NULL, + NULL, + sizeof (GstIirEqualizerBand), + 0, + (GInstanceInitFunc) gst_iir_equalizer_band_init, + }; + type = + g_type_register_static (GST_TYPE_OBJECT, "GstIirEqualizerBand", + &type_info, 0); + } + return (type); +} + + +/* child proxy iface */ +static GstObject * +gst_iir_equalizer_child_proxy_get_child_by_index (GstChildProxy * child_proxy, + guint index) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (child_proxy); + GstObject *ret; + + BANDS_LOCK (equ); + if (G_UNLIKELY (index >= equ->freq_band_count)) { + BANDS_UNLOCK (equ); + g_return_val_if_fail (index < equ->freq_band_count, NULL); + } + + ret = gst_object_ref (equ->bands[index]); + BANDS_UNLOCK (equ); + + GST_LOG_OBJECT (equ, "return child[%d] %" GST_PTR_FORMAT, index, ret); + return ret; +} + +static guint +gst_iir_equalizer_child_proxy_get_children_count (GstChildProxy * child_proxy) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (child_proxy); + + GST_LOG ("we have %d children", equ->freq_band_count); + return equ->freq_band_count; +} + +static void +gst_iir_equalizer_child_proxy_interface_init (gpointer g_iface, + gpointer iface_data) +{ + GstChildProxyInterface *iface = g_iface; + + GST_DEBUG ("initializing iface"); + + iface->get_child_by_index = gst_iir_equalizer_child_proxy_get_child_by_index; + iface->get_children_count = gst_iir_equalizer_child_proxy_get_children_count; +} + + +/* equalizer implementation */ + +static void +gst_iir_equalizer_base_init (gpointer g_class) +{ + GstAudioFilterClass *audiofilter_class = GST_AUDIO_FILTER_CLASS (g_class); + GstCaps *caps; + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (audiofilter_class, caps); + gst_caps_unref (caps); +} + +static void +gst_iir_equalizer_class_init (GstIirEqualizerClass * klass) +{ + GstAudioFilterClass *audio_filter_class = (GstAudioFilterClass *) klass; + GstBaseTransformClass *btrans_class = (GstBaseTransformClass *) klass; + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = gst_iir_equalizer_finalize; + audio_filter_class->setup = gst_iir_equalizer_setup; + btrans_class->transform_ip = gst_iir_equalizer_transform_ip; +} + +static void +gst_iir_equalizer_init (GstIirEqualizer * eq, GstIirEqualizerClass * g_class) +{ + eq->bands_lock = g_mutex_new (); + eq->need_new_coefficients = TRUE; +} + +static void +gst_iir_equalizer_finalize (GObject * object) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); + gint i; + + for (i = 0; i < equ->freq_band_count; i++) { + if (equ->bands[i]) + gst_object_unparent (GST_OBJECT (equ->bands[i])); + equ->bands[i] = NULL; + } + equ->freq_band_count = 0; + + g_free (equ->bands); + g_free (equ->history); + + g_mutex_free (equ->bands_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* Filter taken from + * + * The Equivalence of Various Methods of Computing + * Biquad Coefficients for Audio Parametric Equalizers + * + * by Robert Bristow-Johnson + * + * http://www.aes.org/e-lib/browse.cfm?elib=6326 + * http://www.musicdsp.org/files/EQ-Coefficients.pdf + * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt + * + * The bandwidth method that we use here is the preferred + * one from this article transformed from octaves to frequency + * in Hz. + */ +static inline gdouble +arg_to_scale (gdouble arg) +{ + return (pow (10.0, arg / 40.0)); +} + +static gdouble +calculate_omega (gdouble freq, gint rate) +{ + gdouble omega; + + if (freq / rate >= 0.5) + omega = G_PI; + else if (freq <= 0.0) + omega = 0.0; + else + omega = 2.0 * G_PI * (freq / rate); + + return omega; +} + +static gdouble +calculate_bw (GstIirEqualizerBand * band, gint rate) +{ + gdouble bw = 0.0; + + if (band->width / rate >= 0.5) { + /* If bandwidth == 0.5 the calculation below fails as tan(G_PI/2) + * is undefined. So set the bandwidth to a slightly smaller value. + */ + bw = G_PI - 0.00000001; + } else if (band->width <= 0.0) { + /* If bandwidth == 0 this band won't change anything so set + * the coefficients accordingly. The coefficient calculation + * below would create coefficients that for some reason amplify + * the band. + */ + band->a0 = 1.0; + band->a1 = 0.0; + band->a2 = 0.0; + band->b1 = 0.0; + band->b2 = 0.0; + } else { + bw = 2.0 * G_PI * (band->width / rate); + } + return bw; +} + +static void +setup_peak_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) +{ + g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); + + { + gdouble gain, omega, bw; + gdouble alpha, alpha1, alpha2, b0; + + gain = arg_to_scale (band->gain); + omega = calculate_omega (band->freq, GST_AUDIO_FILTER (equ)->format.rate); + bw = calculate_bw (band, GST_AUDIO_FILTER (equ)->format.rate); + if (bw == 0.0) + goto out; + + alpha = tan (bw / 2.0); + + alpha1 = alpha * gain; + alpha2 = alpha / gain; + + b0 = (1.0 + alpha2); + + band->a0 = (1.0 + alpha1) / b0; + band->a1 = (-2.0 * cos (omega)) / b0; + band->a2 = (1.0 - alpha1) / b0; + band->b1 = (2.0 * cos (omega)) / b0; + band->b2 = -(1.0 - alpha2) / b0; + + out: + GST_INFO + ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", + band->gain, band->width, band->freq, band->a0, band->a1, band->a2, + band->b1, band->b2); + } +} + +static void +setup_low_shelf_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) +{ + g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); + + { + gdouble gain, omega, bw; + gdouble alpha, delta, b0; + gdouble egp, egm; + + gain = arg_to_scale (band->gain); + omega = calculate_omega (band->freq, GST_AUDIO_FILTER (equ)->format.rate); + bw = calculate_bw (band, GST_AUDIO_FILTER (equ)->format.rate); + if (bw == 0.0) + goto out; + + egm = gain - 1.0; + egp = gain + 1.0; + alpha = tan (bw / 2.0); + + delta = 2.0 * sqrt (gain) * alpha; + b0 = egp + egm * cos (omega) + delta; + + band->a0 = ((egp - egm * cos (omega) + delta) * gain) / b0; + band->a1 = ((egm - egp * cos (omega)) * 2.0 * gain) / b0; + band->a2 = ((egp - egm * cos (omega) - delta) * gain) / b0; + band->b1 = ((egm + egp * cos (omega)) * 2.0) / b0; + band->b2 = -((egp + egm * cos (omega) - delta)) / b0; + + + out: + GST_INFO + ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", + band->gain, band->width, band->freq, band->a0, band->a1, band->a2, + band->b1, band->b2); + } +} + +static void +setup_high_shelf_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) +{ + g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); + + { + gdouble gain, omega, bw; + gdouble alpha, delta, b0; + gdouble egp, egm; + + gain = arg_to_scale (band->gain); + omega = calculate_omega (band->freq, GST_AUDIO_FILTER (equ)->format.rate); + bw = calculate_bw (band, GST_AUDIO_FILTER (equ)->format.rate); + if (bw == 0.0) + goto out; + + egm = gain - 1.0; + egp = gain + 1.0; + alpha = tan (bw / 2.0); + + delta = 2.0 * sqrt (gain) * alpha; + b0 = egp - egm * cos (omega) + delta; + + band->a0 = ((egp + egm * cos (omega) + delta) * gain) / b0; + band->a1 = ((egm + egp * cos (omega)) * -2.0 * gain) / b0; + band->a2 = ((egp + egm * cos (omega) - delta) * gain) / b0; + band->b1 = ((egm - egp * cos (omega)) * -2.0) / b0; + band->b2 = -((egp - egm * cos (omega) - delta)) / b0; + + + out: + GST_INFO + ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", + band->gain, band->width, band->freq, band->a0, band->a1, band->a2, + band->b1, band->b2); + } +} + +/* Must be called with bands_lock and transform lock! */ +static void +set_passthrough (GstIirEqualizer * equ) +{ + gint i; + gboolean passthrough = TRUE; + + for (i = 0; i < equ->freq_band_count; i++) { + passthrough = passthrough && (equ->bands[i]->gain == 0.0); + } + + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (equ), passthrough); + GST_DEBUG ("Passthrough mode: %d\n", passthrough); +} + +/* Must be called with bands_lock and transform lock! */ +static void +update_coefficients (GstIirEqualizer * equ) +{ + gint i, n = equ->freq_band_count; + + for (i = 0; i < n; i++) { + if (equ->bands[i]->type == BAND_TYPE_PEAK) + setup_peak_filter (equ, equ->bands[i]); + else if (equ->bands[i]->type == BAND_TYPE_LOW_SHELF) + setup_low_shelf_filter (equ, equ->bands[i]); + else + setup_high_shelf_filter (equ, equ->bands[i]); + } + + equ->need_new_coefficients = FALSE; +} + +/* Must be called with transform lock! */ +static void +alloc_history (GstIirEqualizer * equ) +{ + /* free + alloc = no memcpy */ + g_free (equ->history); + equ->history = + g_malloc0 (equ->history_size * GST_AUDIO_FILTER (equ)->format.channels * + equ->freq_band_count); +} + +void +gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count) +{ + guint old_count, i; + gdouble freq0, freq1, step; + gchar name[20]; + + if (equ->freq_band_count == new_count) + return; + + BANDS_LOCK (equ); + + if (G_UNLIKELY (equ->freq_band_count == new_count)) { + BANDS_UNLOCK (equ); + return; + } + + old_count = equ->freq_band_count; + equ->freq_band_count = new_count; + GST_DEBUG ("bands %u -> %u", old_count, new_count); + + if (old_count < new_count) { + /* add new bands */ + equ->bands = g_realloc (equ->bands, sizeof (GstObject *) * new_count); + for (i = old_count; i < new_count; i++) { + /* otherwise they get names like 'iirequalizerband5' */ + sprintf (name, "band%u", i); + equ->bands[i] = g_object_new (GST_TYPE_IIR_EQUALIZER_BAND, + "name", name, NULL); + GST_DEBUG ("adding band[%d]=%p", i, equ->bands[i]); + + gst_object_set_parent (GST_OBJECT (equ->bands[i]), GST_OBJECT (equ)); + gst_child_proxy_child_added (GST_OBJECT (equ), + GST_OBJECT (equ->bands[i])); + } + } else { + /* free unused bands */ + for (i = new_count; i < old_count; i++) { + GST_DEBUG ("removing band[%d]=%p", i, equ->bands[i]); + gst_child_proxy_child_removed (GST_OBJECT (equ), + GST_OBJECT (equ->bands[i])); + gst_object_unparent (GST_OBJECT (equ->bands[i])); + equ->bands[i] = NULL; + } + } + + alloc_history (equ); + + /* set center frequencies and name band objects + * FIXME: arg! we can't change the name of parented objects :( + * application should read band->freq to get the name + */ + + step = pow (HIGHEST_FREQ / LOWEST_FREQ, 1.0 / new_count); + freq0 = LOWEST_FREQ; + for (i = 0; i < new_count; i++) { + freq1 = freq0 * step; + + if (i == 0) + equ->bands[i]->type = BAND_TYPE_LOW_SHELF; + else if (i == new_count - 1) + equ->bands[i]->type = BAND_TYPE_HIGH_SHELF; + else + equ->bands[i]->type = BAND_TYPE_PEAK; + + equ->bands[i]->freq = freq0 + ((freq1 - freq0) / 2.0); + equ->bands[i]->width = freq1 - freq0; + GST_DEBUG ("band[%2d] = '%lf'", i, equ->bands[i]->freq); + + g_object_notify (G_OBJECT (equ->bands[i]), "bandwidth"); + g_object_notify (G_OBJECT (equ->bands[i]), "freq"); + g_object_notify (G_OBJECT (equ->bands[i]), "type"); + + /* + if(equ->bands[i]->freq<10000.0) + sprintf (name,"%dHz",(gint)equ->bands[i]->freq); + else + sprintf (name,"%dkHz",(gint)(equ->bands[i]->freq/1000.0)); + gst_object_set_name( GST_OBJECT (equ->bands[i]), name); + GST_DEBUG ("band[%2d] = '%s'",i,name); + */ + freq0 = freq1; + } + + equ->need_new_coefficients = TRUE; + BANDS_UNLOCK (equ); +} + +/* start of code that is type specific */ + +#define CREATE_OPTIMIZED_FUNCTIONS_INT(TYPE,BIG_TYPE,MIN_VAL,MAX_VAL) \ +typedef struct { \ + BIG_TYPE x1, x2; /* history of input values for a filter */ \ + BIG_TYPE y1, y2; /* history of output values for a filter */ \ +} SecondOrderHistory ## TYPE; \ + \ +static inline BIG_TYPE \ +one_step_ ## TYPE (GstIirEqualizerBand *filter, \ + SecondOrderHistory ## TYPE *history, BIG_TYPE input) \ +{ \ + /* calculate output */ \ + BIG_TYPE output = filter->a0 * input + \ + filter->a1 * history->x1 + filter->a2 * history->x2 + \ + filter->b1 * history->y1 + filter->b2 * history->y2; \ + /* update history */ \ + history->y2 = history->y1; \ + history->y1 = output; \ + history->x2 = history->x1; \ + history->x1 = input; \ + \ + return output; \ +} \ + \ +static const guint \ +history_size_ ## TYPE = sizeof (SecondOrderHistory ## TYPE); \ + \ +static void \ +gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \ +guint size, guint channels) \ +{ \ + guint frames = size / channels / sizeof (TYPE); \ + guint i, c, f, nf = equ->freq_band_count; \ + BIG_TYPE cur; \ + GstIirEqualizerBand **filters = equ->bands; \ + \ + for (i = 0; i < frames; i++) { \ + SecondOrderHistory ## TYPE *history = equ->history; \ + for (c = 0; c < channels; c++) { \ + cur = *((TYPE *) data); \ + for (f = 0; f < nf; f++) { \ + cur = one_step_ ## TYPE (filters[f], history, cur); \ + history++; \ + } \ + cur = CLAMP (cur, MIN_VAL, MAX_VAL); \ + *((TYPE *) data) = (TYPE) floor (cur); \ + data += sizeof (TYPE); \ + } \ + } \ +} + +#define CREATE_OPTIMIZED_FUNCTIONS(TYPE) \ +typedef struct { \ + TYPE x1, x2; /* history of input values for a filter */ \ + TYPE y1, y2; /* history of output values for a filter */ \ +} SecondOrderHistory ## TYPE; \ + \ +static inline TYPE \ +one_step_ ## TYPE (GstIirEqualizerBand *filter, \ + SecondOrderHistory ## TYPE *history, TYPE input) \ +{ \ + /* calculate output */ \ + TYPE output = filter->a0 * input + filter->a1 * history->x1 + \ + filter->a2 * history->x2 + filter->b1 * history->y1 + \ + filter->b2 * history->y2; \ + /* update history */ \ + history->y2 = history->y1; \ + history->y1 = output; \ + history->x2 = history->x1; \ + history->x1 = input; \ + \ + return output; \ +} \ + \ +static const guint \ +history_size_ ## TYPE = sizeof (SecondOrderHistory ## TYPE); \ + \ +static void \ +gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \ +guint size, guint channels) \ +{ \ + guint frames = size / channels / sizeof (TYPE); \ + guint i, c, f, nf = equ->freq_band_count; \ + TYPE cur; \ + GstIirEqualizerBand **filters = equ->bands; \ + \ + for (i = 0; i < frames; i++) { \ + SecondOrderHistory ## TYPE *history = equ->history; \ + for (c = 0; c < channels; c++) { \ + cur = *((TYPE *) data); \ + for (f = 0; f < nf; f++) { \ + cur = one_step_ ## TYPE (filters[f], history, cur); \ + history++; \ + } \ + *((TYPE *) data) = (TYPE) cur; \ + data += sizeof (TYPE); \ + } \ + } \ +} + +CREATE_OPTIMIZED_FUNCTIONS_INT (gint16, gfloat, -32768.0, 32767.0); +CREATE_OPTIMIZED_FUNCTIONS (gfloat); +CREATE_OPTIMIZED_FUNCTIONS (gdouble); + +static GstFlowReturn +gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf) +{ + GstAudioFilter *filter = GST_AUDIO_FILTER (btrans); + GstIirEqualizer *equ = GST_IIR_EQUALIZER (btrans); + GstClockTime timestamp; + gboolean need_new_coefficients; + + if (G_UNLIKELY (filter->format.channels < 1 || equ->process == NULL)) + return GST_FLOW_NOT_NEGOTIATED; + + BANDS_LOCK (equ); + need_new_coefficients = equ->need_new_coefficients; + BANDS_UNLOCK (equ); + + if (!need_new_coefficients && gst_base_transform_is_passthrough (btrans)) + return GST_FLOW_OK; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + timestamp = + gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + GstIirEqualizerBand **filters = equ->bands; + guint f, nf = equ->freq_band_count; + + gst_object_sync_values (G_OBJECT (equ), timestamp); + + /* sync values for bands too */ + /* FIXME: iterating equ->bands is not thread-safe here */ + for (f = 0; f < nf; f++) { + gst_object_sync_values (G_OBJECT (filters[f]), timestamp); + } + } + + BANDS_LOCK (equ); + if (need_new_coefficients) { + update_coefficients (equ); + set_passthrough (equ); + } + BANDS_UNLOCK (equ); + + equ->process (equ, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), + filter->format.channels); + + return GST_FLOW_OK; +} + +static gboolean +gst_iir_equalizer_setup (GstAudioFilter * audio, GstRingBufferSpec * fmt) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (audio); + + switch (fmt->type) { + case GST_BUFTYPE_LINEAR: + switch (fmt->width) { + case 16: + equ->history_size = history_size_gint16; + equ->process = gst_iir_equ_process_gint16; + break; + default: + return FALSE; + } + break; + case GST_BUFTYPE_FLOAT: + switch (fmt->width) { + case 32: + equ->history_size = history_size_gfloat; + equ->process = gst_iir_equ_process_gfloat; + break; + case 64: + equ->history_size = history_size_gdouble; + equ->process = gst_iir_equ_process_gdouble; + break; + default: + return FALSE; + } + break; + default: + return FALSE; + } + + alloc_history (equ); + return TRUE; +} + + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (equalizer_debug, "equalizer", 0, "equalizer"); + + if (!(gst_element_register (plugin, "equalizer-nbands", GST_RANK_NONE, + GST_TYPE_IIR_EQUALIZER_NBANDS))) + return FALSE; + + if (!(gst_element_register (plugin, "equalizer-3bands", GST_RANK_NONE, + GST_TYPE_IIR_EQUALIZER_3BANDS))) + return FALSE; + + if (!(gst_element_register (plugin, "equalizer-10bands", GST_RANK_NONE, + GST_TYPE_IIR_EQUALIZER_10BANDS))) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "equalizer", + "GStreamer audio equalizers", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/equalizer/gstiirequalizer.h b/gst/equalizer/gstiirequalizer.h new file mode 100644 index 0000000..2254ddc --- /dev/null +++ b/gst/equalizer/gstiirequalizer.h @@ -0,0 +1,78 @@ +/* GStreamer IIR equalizer + * Copyright (C) <2004> Benjamin Otte + * <2007> Stefan Kost + * + * 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_IIR_EQUALIZER__ +#define __GST_IIR_EQUALIZER__ + +#include +#include +#include + +typedef struct _GstIirEqualizer GstIirEqualizer; +typedef struct _GstIirEqualizerClass GstIirEqualizerClass; +typedef struct _GstIirEqualizerBand GstIirEqualizerBand; + +#define GST_TYPE_IIR_EQUALIZER \ + (gst_iir_equalizer_get_type()) +#define GST_IIR_EQUALIZER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER,GstIirEqualizer)) +#define GST_IIR_EQUALIZER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER,GstIirEqualizerClass)) +#define GST_IS_IIR_EQUALIZER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER)) +#define GST_IS_IIR_EQUALIZER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER)) + +#define LOWEST_FREQ (20.0) +#define HIGHEST_FREQ (20000.0) + +typedef void (*ProcessFunc) (GstIirEqualizer * eq, guint8 * data, guint size, + guint channels); + +struct _GstIirEqualizer +{ + GstAudioFilter audiofilter; + + /*< private >*/ + + GMutex *bands_lock; + GstIirEqualizerBand **bands; + + /* properties */ + guint freq_band_count; + /* for each band and channel */ + gpointer history; + guint history_size; + + gboolean need_new_coefficients; + + ProcessFunc process; +}; + +struct _GstIirEqualizerClass +{ + GstAudioFilterClass audiofilter_class; +}; + +extern void gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count); + +extern GType gst_iir_equalizer_get_type(void); + +#endif /* __GST_IIR_EQUALIZER__ */ diff --git a/gst/equalizer/gstiirequalizer10bands.c b/gst/equalizer/gstiirequalizer10bands.c new file mode 100644 index 0000000..b39515c --- /dev/null +++ b/gst/equalizer/gstiirequalizer10bands.c @@ -0,0 +1,247 @@ +/* GStreamer + * Copyright (C) <2007> Stefan Kost + * + * 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-equalizer-10bands + * + * The 10 band equalizer element allows to change the gain of 10 equally distributed + * frequency bands between 30 Hz and 15 kHz. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-10bands band2=3.0 ! alsasink + * ]| This raises the volume of the 3rd band which is at 119 Hz by 3 db. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstiirequalizer.h" +#include "gstiirequalizer10bands.h" + + +enum +{ + PROP_BAND0 = 1, + PROP_BAND1, + PROP_BAND2, + PROP_BAND3, + PROP_BAND4, + PROP_BAND5, + PROP_BAND6, + PROP_BAND7, + PROP_BAND8, + PROP_BAND9, +}; + +static void gst_iir_equalizer_10bands_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_iir_equalizer_10bands_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +GST_DEBUG_CATEGORY_EXTERN (equalizer_debug); +#define GST_CAT_DEFAULT equalizer_debug + + +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 (GstIirEqualizer10Bands, gst_iir_equalizer_10bands, + GstIirEqualizer, GST_TYPE_IIR_EQUALIZER, _do_init); + +/* equalizer implementation */ + +static void +gst_iir_equalizer_10bands_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "10 Band Equalizer", + "Filter/Effect/Audio", + "Direct Form 10 band IIR equalizer", + "Stefan Kost "); +} + +static void +gst_iir_equalizer_10bands_class_init (GstIirEqualizer10BandsClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_iir_equalizer_10bands_set_property; + gobject_class->get_property = gst_iir_equalizer_10bands_get_property; + + g_object_class_install_property (gobject_class, PROP_BAND0, + g_param_spec_double ("band0", "29 Hz", + "gain for the frequency band 29 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND1, + g_param_spec_double ("band1", "59 Hz", + "gain for the frequency band 59 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND2, + g_param_spec_double ("band2", "119 Hz", + "gain for the frequency band 119 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND3, + g_param_spec_double ("band3", "237 Hz", + "gain for the frequency band 237 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND4, + g_param_spec_double ("band4", "474 Hz", + "gain for the frequency band 474 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND5, + g_param_spec_double ("band5", "947 Hz", + "gain for the frequency band 947 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND6, + g_param_spec_double ("band6", "1889 Hz", + "gain for the frequency band 1889 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND7, + g_param_spec_double ("band7", "3770 Hz", + "gain for the frequency band 3770 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND8, + g_param_spec_double ("band8", "7523 Hz", + "gain for the frequency band 7523 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND9, + g_param_spec_double ("band9", "15011 Hz", + "gain for the frequency band 15011 Hz, ranging from -24 dB to +12 dB", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); +} + +static void +gst_iir_equalizer_10bands_init (GstIirEqualizer10Bands * equ_n, + GstIirEqualizer10BandsClass * g_class) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (equ_n); + + gst_iir_equalizer_compute_frequencies (equ, 10); +} + +static void +gst_iir_equalizer_10bands_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); + + switch (prop_id) { + case PROP_BAND0: + gst_child_proxy_set_property (GST_OBJECT (equ), "band0::gain", value); + break; + case PROP_BAND1: + gst_child_proxy_set_property (GST_OBJECT (equ), "band1::gain", value); + break; + case PROP_BAND2: + gst_child_proxy_set_property (GST_OBJECT (equ), "band2::gain", value); + break; + case PROP_BAND3: + gst_child_proxy_set_property (GST_OBJECT (equ), "band3::gain", value); + break; + case PROP_BAND4: + gst_child_proxy_set_property (GST_OBJECT (equ), "band4::gain", value); + break; + case PROP_BAND5: + gst_child_proxy_set_property (GST_OBJECT (equ), "band5::gain", value); + break; + case PROP_BAND6: + gst_child_proxy_set_property (GST_OBJECT (equ), "band6::gain", value); + break; + case PROP_BAND7: + gst_child_proxy_set_property (GST_OBJECT (equ), "band7::gain", value); + break; + case PROP_BAND8: + gst_child_proxy_set_property (GST_OBJECT (equ), "band8::gain", value); + break; + case PROP_BAND9: + gst_child_proxy_set_property (GST_OBJECT (equ), "band9::gain", value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_iir_equalizer_10bands_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); + + switch (prop_id) { + case PROP_BAND0: + gst_child_proxy_get_property (GST_OBJECT (equ), "band0::gain", value); + break; + case PROP_BAND1: + gst_child_proxy_get_property (GST_OBJECT (equ), "band1::gain", value); + break; + case PROP_BAND2: + gst_child_proxy_get_property (GST_OBJECT (equ), "band2::gain", value); + break; + case PROP_BAND3: + gst_child_proxy_get_property (GST_OBJECT (equ), "band3::gain", value); + break; + case PROP_BAND4: + gst_child_proxy_get_property (GST_OBJECT (equ), "band4::gain", value); + break; + case PROP_BAND5: + gst_child_proxy_get_property (GST_OBJECT (equ), "band5::gain", value); + break; + case PROP_BAND6: + gst_child_proxy_get_property (GST_OBJECT (equ), "band6::gain", value); + break; + case PROP_BAND7: + gst_child_proxy_get_property (GST_OBJECT (equ), "band7::gain", value); + break; + case PROP_BAND8: + gst_child_proxy_get_property (GST_OBJECT (equ), "band8::gain", value); + break; + case PROP_BAND9: + gst_child_proxy_get_property (GST_OBJECT (equ), "band9::gain", value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/equalizer/gstiirequalizer10bands.h b/gst/equalizer/gstiirequalizer10bands.h new file mode 100644 index 0000000..72bda61 --- /dev/null +++ b/gst/equalizer/gstiirequalizer10bands.h @@ -0,0 +1,51 @@ +/* GStreamer + * Copyright (C) <2007> Stefan Kost + * + * 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_IIR_EQUALIZER_10BANDS__ +#define __GST_IIR_EQUALIZER_10BANDS__ + +#include "gstiirequalizer.h" + +typedef struct _GstIirEqualizer10Bands GstIirEqualizer10Bands; +typedef struct _GstIirEqualizer10BandsClass GstIirEqualizer10BandsClass; + +#define GST_TYPE_IIR_EQUALIZER_10BANDS \ + (gst_iir_equalizer_10bands_get_type()) +#define GST_IIR_EQUALIZER_10BANDS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_10BANDS,GstIirEqualizer10Bands)) +#define GST_IIR_EQUALIZER_10BANDS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_10BANDS,GstIirEqualizer10BandsClass)) +#define GST_IS_IIR_EQUALIZER_10BANDS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_10BANDS)) +#define GST_IS_IIR_EQUALIZER_10BANDS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_10BANDS)) + +struct _GstIirEqualizer10Bands +{ + GstIirEqualizer equalizer; +}; + +struct _GstIirEqualizer10BandsClass +{ + GstIirEqualizerClass equalizer_class; +}; + +extern GType gst_iir_equalizer_10bands_get_type(void); + +#endif /* __GST_IIR_EQUALIZER_10BANDS__ */ diff --git a/gst/equalizer/gstiirequalizer3bands.c b/gst/equalizer/gstiirequalizer3bands.c new file mode 100644 index 0000000..733c5b8 --- /dev/null +++ b/gst/equalizer/gstiirequalizer3bands.c @@ -0,0 +1,161 @@ +/* GStreamer + * Copyright (C) <2007> Stefan Kost + * + * 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-equalizer-3bands + * + * The 3-band equalizer element allows to change the gain of a low frequency, + * medium frequency and high frequency band. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-3bands band1=6.0 ! alsasink + * ]| This raises the volume of the 2nd band, which is at 1110 Hz, by 6 db. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstiirequalizer.h" +#include "gstiirequalizer3bands.h" + +enum +{ + PROP_BAND0 = 1, + PROP_BAND1, + PROP_BAND2, +}; + +static void gst_iir_equalizer_3bands_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_iir_equalizer_3bands_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +GST_DEBUG_CATEGORY_EXTERN (equalizer_debug); +#define GST_CAT_DEFAULT equalizer_debug + + +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 (GstIirEqualizer3Bands, gst_iir_equalizer_3bands, + GstIirEqualizer, GST_TYPE_IIR_EQUALIZER, _do_init); + +/* equalizer implementation */ + +static void +gst_iir_equalizer_3bands_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "3 Band Equalizer", + "Filter/Effect/Audio", + "Direct Form 3 band IIR equalizer", "Stefan Kost "); +} + +static void +gst_iir_equalizer_3bands_class_init (GstIirEqualizer3BandsClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_iir_equalizer_3bands_set_property; + gobject_class->get_property = gst_iir_equalizer_3bands_get_property; + + g_object_class_install_property (gobject_class, PROP_BAND0, + g_param_spec_double ("band0", "110 Hz", + "gain for the frequency band 100 Hz, ranging from -24.0 to +12.0", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND1, + g_param_spec_double ("band1", "1100 Hz", + "gain for the frequency band 1100 Hz, ranging from -24.0 to +12.0", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BAND2, + g_param_spec_double ("band2", "11 kHz", + "gain for the frequency band 11 kHz, ranging from -24.0 to +12.0", + -24.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); +} + +static void +gst_iir_equalizer_3bands_init (GstIirEqualizer3Bands * equ_n, + GstIirEqualizer3BandsClass * g_class) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (equ_n); + + gst_iir_equalizer_compute_frequencies (equ, 3); +} + +static void +gst_iir_equalizer_3bands_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); + + switch (prop_id) { + case PROP_BAND0: + gst_child_proxy_set_property (GST_OBJECT (equ), "band0::gain", value); + break; + case PROP_BAND1: + gst_child_proxy_set_property (GST_OBJECT (equ), "band1::gain", value); + break; + case PROP_BAND2: + gst_child_proxy_set_property (GST_OBJECT (equ), "band2::gain", value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_iir_equalizer_3bands_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); + + switch (prop_id) { + case PROP_BAND0: + gst_child_proxy_get_property (GST_OBJECT (equ), "band0::gain", value); + break; + case PROP_BAND1: + gst_child_proxy_get_property (GST_OBJECT (equ), "band1::gain", value); + break; + case PROP_BAND2: + gst_child_proxy_get_property (GST_OBJECT (equ), "band2::gain", value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/equalizer/gstiirequalizer3bands.h b/gst/equalizer/gstiirequalizer3bands.h new file mode 100644 index 0000000..a76249a --- /dev/null +++ b/gst/equalizer/gstiirequalizer3bands.h @@ -0,0 +1,51 @@ +/* GStreamer + * Copyright (C) <2007> Stefan Kost + * + * 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_IIR_EQUALIZER_3BANDS__ +#define __GST_IIR_EQUALIZER_3BANDS__ + +#include "gstiirequalizer.h" + +typedef struct _GstIirEqualizer3Bands GstIirEqualizer3Bands; +typedef struct _GstIirEqualizer3BandsClass GstIirEqualizer3BandsClass; + +#define GST_TYPE_IIR_EQUALIZER_3BANDS \ + (gst_iir_equalizer_3bands_get_type()) +#define GST_IIR_EQUALIZER_3BANDS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_3BANDS,GstIirEqualizer3Bands)) +#define GST_IIR_EQUALIZER_3BANDS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_3BANDS,GstIirEqualizer3BandsClass)) +#define GST_IS_IIR_EQUALIZER_3BANDS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_3BANDS)) +#define GST_IS_IIR_EQUALIZER_3BANDS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_3BANDS)) + +struct _GstIirEqualizer3Bands +{ + GstIirEqualizer equalizer; +}; + +struct _GstIirEqualizer3BandsClass +{ + GstIirEqualizerClass equalizer_class; +}; + +extern GType gst_iir_equalizer_3bands_get_type(void); + +#endif /* __GST_IIR_EQUALIZER_3BANDS__ */ diff --git a/gst/equalizer/gstiirequalizernbands.c b/gst/equalizer/gstiirequalizernbands.c new file mode 100644 index 0000000..b507195 --- /dev/null +++ b/gst/equalizer/gstiirequalizernbands.c @@ -0,0 +1,169 @@ +/* GStreamer + * Copyright (C) <2004> Benjamin Otte + * <2007> Stefan Kost + * + * 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-equalizer-nbands + * + * The n-band equalizer element is a fully parametric equalizer. It allows to + * select between 1 and 64 bands and has properties on each band to change + * the center frequency, band width and gain. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-nbands num-bands=15 band5::gain=6.0 ! alsasink + * ]| This make the equalizer use 15 bands and raises the volume of the 5th band by 6 db. + * + * + * Example code + * |[ + * #include <gst/gst.h> + * + * ... + * typedef struct { + * gfloat freq; + * gfloat width; + * gfloat gain; + * } GstEqualizerBandState; + * + * ... + * + * GstElement *equalizer; + * GstObject *band; + * gint i; + * GstEqualizerBandState state[] = { + * { 120.0, 50.0, - 3.0}, + * { 500.0, 20.0, 12.0}, + * {1503.0, 2.0, -20.0}, + * {6000.0, 1000.0, 6.0}, + * {3000.0, 120.0, 2.0} + * }; + * + * ... + * + * equalizer = gst_element_factory_make ("equalizer-nbands", "equalizer"); + * g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); + * + * ... + * + * for (i = 0; i < 5; i++) { + * band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); + * g_object_set (G_OBJECT (band), "freq", state[i].freq, + * "bandwidth", state[i].width, + * "gain", state[i].gain); + * g_object_unref (G_OBJECT (band)); + * } + * + * ... + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstiirequalizer.h" +#include "gstiirequalizernbands.h" + + +enum +{ + PROP_NUM_BANDS = 1 +}; + +static void gst_iir_equalizer_nbands_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_iir_equalizer_nbands_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +GST_DEBUG_CATEGORY_EXTERN (equalizer_debug); +#define GST_CAT_DEFAULT equalizer_debug + +GST_BOILERPLATE (GstIirEqualizerNBands, gst_iir_equalizer_nbands, + GstIirEqualizer, GST_TYPE_IIR_EQUALIZER); + +/* equalizer implementation */ + +static void +gst_iir_equalizer_nbands_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "N Band Equalizer", + "Filter/Effect/Audio", + "Direct Form IIR equalizer", + "Benjamin Otte ," " Stefan Kost "); +} + +static void +gst_iir_equalizer_nbands_class_init (GstIirEqualizerNBandsClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_iir_equalizer_nbands_set_property; + gobject_class->get_property = gst_iir_equalizer_nbands_get_property; + + g_object_class_install_property (gobject_class, PROP_NUM_BANDS, + g_param_spec_uint ("num-bands", "num-bands", + "number of different bands to use", 1, 64, 10, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT)); +} + +static void +gst_iir_equalizer_nbands_init (GstIirEqualizerNBands * equ_n, + GstIirEqualizerNBandsClass * g_class) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (equ_n); + + gst_iir_equalizer_compute_frequencies (equ, 10); +} + +static void +gst_iir_equalizer_nbands_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); + + switch (prop_id) { + case PROP_NUM_BANDS: + gst_iir_equalizer_compute_frequencies (equ, g_value_get_uint (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_iir_equalizer_nbands_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); + + switch (prop_id) { + case PROP_NUM_BANDS: + g_value_set_uint (value, equ->freq_band_count); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/equalizer/gstiirequalizernbands.h b/gst/equalizer/gstiirequalizernbands.h new file mode 100644 index 0000000..b0ffa85 --- /dev/null +++ b/gst/equalizer/gstiirequalizernbands.h @@ -0,0 +1,52 @@ +/* GStreamer + * Copyright (C) <2004> Benjamin Otte + * <2007> Stefan Kost + * + * 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_IIR_EQUALIZER_NBANDS__ +#define __GST_IIR_EQUALIZER_NBANDS__ + +#include "gstiirequalizer.h" + +typedef struct _GstIirEqualizerNBands GstIirEqualizerNBands; +typedef struct _GstIirEqualizerNBandsClass GstIirEqualizerNBandsClass; + +#define GST_TYPE_IIR_EQUALIZER_NBANDS \ + (gst_iir_equalizer_nbands_get_type()) +#define GST_IIR_EQUALIZER_NBANDS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_NBANDS,GstIirEqualizerNBands)) +#define GST_IIR_EQUALIZER_NBANDS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_NBANDS,GstIirEqualizerNBandsClass)) +#define GST_IS_IIR_EQUALIZER_NBANDS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_NBANDS)) +#define GST_IS_IIR_EQUALIZER_NBANDS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_NBANDS)) + +struct _GstIirEqualizerNBands +{ + GstIirEqualizer equalizer; +}; + +struct _GstIirEqualizerNBandsClass +{ + GstIirEqualizerClass equalizer_class; +}; + +extern GType gst_iir_equalizer_nbands_get_type(void); + +#endif /* __GST_IIR_EQUALIZER_NBANDS__ */ diff --git a/gst/flv/Makefile.am b/gst/flv/Makefile.am new file mode 100644 index 0000000..e8059cb --- /dev/null +++ b/gst/flv/Makefile.am @@ -0,0 +1,24 @@ +plugin_LTLIBRARIES = libgstflv.la + +libgstflv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstflv_la_LIBADD = -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) +libgstflv_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} +libgstflv_la_SOURCES = gstflvdemux.c gstflvmux.c +libgstflv_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstflvdemux.h gstflvmux.h amfdefs.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstflv -:SHARED libgstflv \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstflv_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstflv_la_CFLAGS) \ + -:LDFLAGS $(libgstflv_la_LDFLAGS) \ + $(libgstflv_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/flv/Makefile.in b/gst/flv/Makefile.in new file mode 100644 index 0000000..9a786a1 --- /dev/null +++ b/gst/flv/Makefile.in @@ -0,0 +1,830 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/flv +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstflv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstflv_la_OBJECTS = libgstflv_la-gstflvdemux.lo \ + libgstflv_la-gstflvmux.lo +libgstflv_la_OBJECTS = $(am_libgstflv_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstflv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstflv_la_CFLAGS) $(CFLAGS) \ + $(libgstflv_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstflv_la_SOURCES) +DIST_SOURCES = $(libgstflv_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstflv.la +libgstflv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstflv_la_LIBADD = -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) + +libgstflv_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} +libgstflv_la_SOURCES = gstflvdemux.c gstflvmux.c +libgstflv_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstflvdemux.h gstflvmux.h amfdefs.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/flv/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/flv/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstflv.la: $(libgstflv_la_OBJECTS) $(libgstflv_la_DEPENDENCIES) $(EXTRA_libgstflv_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstflv_la_LINK) -rpath $(plugindir) $(libgstflv_la_OBJECTS) $(libgstflv_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflv_la-gstflvdemux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflv_la-gstflvmux.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstflv_la-gstflvdemux.lo: gstflvdemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflv_la_CFLAGS) $(CFLAGS) -MT libgstflv_la-gstflvdemux.lo -MD -MP -MF $(DEPDIR)/libgstflv_la-gstflvdemux.Tpo -c -o libgstflv_la-gstflvdemux.lo `test -f 'gstflvdemux.c' || echo '$(srcdir)/'`gstflvdemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflv_la-gstflvdemux.Tpo $(DEPDIR)/libgstflv_la-gstflvdemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflvdemux.c' object='libgstflv_la-gstflvdemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflv_la_CFLAGS) $(CFLAGS) -c -o libgstflv_la-gstflvdemux.lo `test -f 'gstflvdemux.c' || echo '$(srcdir)/'`gstflvdemux.c + +libgstflv_la-gstflvmux.lo: gstflvmux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflv_la_CFLAGS) $(CFLAGS) -MT libgstflv_la-gstflvmux.lo -MD -MP -MF $(DEPDIR)/libgstflv_la-gstflvmux.Tpo -c -o libgstflv_la-gstflvmux.lo `test -f 'gstflvmux.c' || echo '$(srcdir)/'`gstflvmux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflv_la-gstflvmux.Tpo $(DEPDIR)/libgstflv_la-gstflvmux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflvmux.c' object='libgstflv_la-gstflvmux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflv_la_CFLAGS) $(CFLAGS) -c -o libgstflv_la-gstflvmux.lo `test -f 'gstflvmux.c' || echo '$(srcdir)/'`gstflvmux.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstflv -:SHARED libgstflv \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstflv_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstflv_la_CFLAGS) \ + -:LDFLAGS $(libgstflv_la_LDFLAGS) \ + $(libgstflv_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/flv/amfdefs.h b/gst/flv/amfdefs.h new file mode 100644 index 0000000..6c14f3f --- /dev/null +++ b/gst/flv/amfdefs.h @@ -0,0 +1,44 @@ +/* GStreamer + * + * Copyright (c) 2011 Jan Schmidt + * + * 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 __AMFDEFS_H__ +#define __AMFDEFS_H__ + +#include + +#define AMF0_NUMBER_MARKER 0x0 +#define AMF0_BOOLEAN_MARKER 0x1 +#define AMF0_STRING_MARKER 0x2 +#define AMF0_OBJECT_MARKER 0x3 +#define AMF0_MOVIECLIP_MARKER 0x4 // Reserved, not supported +#define AMF0_NULL_MARKER 0x5 +#define AMF0_UNDEFINED_MARKER 0x6 +#define AMF0_REFERENCE_MARKER 0x7 +#define AMF0_ECMA_ARRAY_MARKER 0x8 +#define AMF0_OBJECT_END_MARKER 0x9 +#define AMF0_STRICT_ARRAY_MARKER 0xA +#define AMF0_DATE_MARKER 0xB +#define AMF0_LONG_STRING_MARKER 0xC +#define AMF0_UNSUPPORTED_MARKER 0xD +#define AMF0_RECORDSET_MARKER 0xE // Reserved, not supported +#define AMF0_XML_DOCUMENT_MARKER 0xF +#define AMF0_TYPED_OBJECT_MARKER 0x10 + +#endif diff --git a/gst/flv/gstflvdemux.c b/gst/flv/gstflvdemux.c new file mode 100644 index 0000000..fbf7e25 --- /dev/null +++ b/gst/flv/gstflvdemux.c @@ -0,0 +1,3309 @@ +/* GStreamer + * Copyright (C) <2007> Julien Moutte + * + * 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. + * + * + * Example launch line + * |[ + * gst-launch -v filesrc location=/path/to/flv ! flvdemux ! audioconvert ! autoaudiosink + * ]| This pipeline demuxes an FLV file and outputs the contained raw audio streams. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "gstflvdemux.h" +#include "gstflvmux.h" + +#include +#include +#include +#include + +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 + ("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, stream-format = (string) raw, 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 };") + ); + +static GstStaticPadTemplate video_src_template = + GST_STATIC_PAD_TEMPLATE ("video", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("video/x-flash-video; " + "video/x-flash-screen; " + "video/x-vp6-flash; " "video/x-vp6-alpha; " + "video/x-h264, stream-format=avc;") + ); + +GST_DEBUG_CATEGORY_STATIC (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 + +/* two seconds - consider pts are resynced to another base if this different */ +#define RESYNC_THRESHOLD 2000 + +static gboolean flv_demux_handle_seek_push (GstFlvDemux * demux, + GstEvent * event); +static gboolean gst_flv_demux_handle_seek_pull (GstFlvDemux * demux, + GstEvent * event, gboolean seeking); + +static gboolean gst_flv_demux_query (GstPad * pad, GstQuery * query); +static gboolean gst_flv_demux_src_event (GstPad * pad, GstEvent * event); + + +static void +gst_flv_demux_parse_and_add_index_entry (GstFlvDemux * demux, GstClockTime ts, + guint64 pos, gboolean keyframe) +{ + static GstIndexAssociation associations[2]; + static GstIndexEntry *entry; + + GST_LOG_OBJECT (demux, + "adding key=%d association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT, + keyframe, GST_TIME_ARGS (ts), pos); + + /* if upstream is not seekable there is no point in building an index */ + if (!demux->upstream_seekable) + return; + + /* entry may already have been added before, avoid adding indefinitely */ + entry = gst_index_get_assoc_entry (demux->index, demux->index_id, + GST_INDEX_LOOKUP_EXACT, GST_ASSOCIATION_FLAG_NONE, GST_FORMAT_BYTES, pos); + + if (entry) { +#ifndef GST_DISABLE_GST_DEBUG + gint64 time; + gboolean key; + + gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &time); + key = ! !(GST_INDEX_ASSOC_FLAGS (entry) & GST_ASSOCIATION_FLAG_KEY_UNIT); + GST_LOG_OBJECT (demux, "position already mapped to time %" GST_TIME_FORMAT + ", keyframe %d", GST_TIME_ARGS (time), key); + /* there is not really a way to delete the existing one */ + if (time != ts || key != ! !keyframe) + GST_DEBUG_OBJECT (demux, "metadata mismatch"); +#endif + return; + } + + associations[0].format = GST_FORMAT_TIME; + associations[0].value = ts; + associations[1].format = GST_FORMAT_BYTES; + associations[1].value = pos; + + gst_index_add_associationv (demux->index, demux->index_id, + (keyframe) ? GST_ASSOCIATION_FLAG_KEY_UNIT : + GST_ASSOCIATION_FLAG_DELTA_UNIT, 2, + (const GstIndexAssociation *) &associations); + + if (pos > demux->index_max_pos) + demux->index_max_pos = pos; + if (ts > demux->index_max_time) + demux->index_max_time = ts; +} + +static gchar * +FLV_GET_STRING (GstByteReader * reader) +{ + guint16 string_size = 0; + gchar *string = NULL; + const guint8 *str = NULL; + + 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, + GST_QUERY_POSITION, + GST_QUERY_SEEKING, + 0 + }; + + return query_types; +} + +static void +gst_flv_demux_check_seekability (GstFlvDemux * demux) +{ + GstQuery *query; + gint64 start = -1, stop = -1; + + demux->upstream_seekable = FALSE; + + query = gst_query_new_seeking (GST_FORMAT_BYTES); + if (!gst_pad_peer_query (demux->sinkpad, query)) { + GST_DEBUG_OBJECT (demux, "seeking query failed"); + gst_query_unref (query); + return; + } + + gst_query_parse_seeking (query, NULL, &demux->upstream_seekable, + &start, &stop); + + gst_query_unref (query); + + /* try harder to query upstream size if we didn't get it the first time */ + if (demux->upstream_seekable && stop == -1) { + GstFormat fmt = GST_FORMAT_BYTES; + + GST_DEBUG_OBJECT (demux, "doing duration query to fix up unset stop"); + gst_pad_query_peer_duration (demux->sinkpad, &fmt, &stop); + } + + /* if upstream doesn't know the size, it's likely that it's not seekable in + * practice even if it technically may be seekable */ + if (demux->upstream_seekable && (start != 0 || stop <= start)) { + GST_DEBUG_OBJECT (demux, "seekable but unknown start/stop -> disable"); + demux->upstream_seekable = FALSE; + } + + GST_DEBUG_OBJECT (demux, "upstream seekable: %d", demux->upstream_seekable); +} + +static void +parse_flv_demux_parse_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_demux_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 = 0; + + 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 if (!strcmp (tag_name, "width")) { + demux->w = d; + } else if (!strcmp (tag_name, "height")) { + demux->h = d; + } else if (!strcmp (tag_name, "framerate")) { + demux->framerate = d; + } else { + GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name); + } + + break; + } + case 1: // Boolean + { + guint8 b = 0; + + 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_demux_parse_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_demux_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 = 0; + 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_demux_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 = 0; + + 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 = 0; + + 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 = 0; + gint16 i = 0; + + 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; +} + +static GstFlowReturn +gst_flv_demux_parse_tag_script (GstFlvDemux * demux, GstBuffer * buffer) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer); + guint8 type = 0; + + 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) { + gboolean end_marker = FALSE; + GST_DEBUG_OBJECT (demux, "we have a metadata script object"); + + if (!gst_byte_reader_get_uint8 (&reader, &type)) { + g_free (function_name); + return GST_FLOW_OK; + } + + switch (type) { + case 8: + { + guint32 nb_elems = 0; + + /* ECMA array */ + if (!gst_byte_reader_get_uint32_be (&reader, &nb_elems)) { + g_free (function_name); + return GST_FLOW_OK; + } + + /* The number of elements is just a hint, some files have + nb_elements == 0 and actually contain items. */ + GST_DEBUG_OBJECT (demux, "there are approx. %d elements in the array", + nb_elems); + } + /* fallthrough to read data */ + case 3: + { + /* Object */ + while (!end_marker) { + gboolean ok = + gst_flv_demux_parse_metadata_item (demux, &reader, &end_marker); + + if (G_UNLIKELY (!ok)) { + GST_WARNING_OBJECT (demux, "failed reading a tag, skipping"); + break; + } + } + } + break; + default: + GST_DEBUG_OBJECT (demux, "Unhandled script data type : %d", type); + g_free (function_name); + return GST_FLOW_OK; + } + + demux->push_tags = TRUE; + } + + g_free (function_name); + + if (demux->index && demux->times && demux->filepositions) { + guint num; + + /* If an index was found, insert associations */ + num = MIN (demux->times->len, demux->filepositions->len); + for (i = 0; i < num; i++) { + guint64 time, fileposition; + + time = g_array_index (demux->times, gdouble, i) * GST_SECOND; + fileposition = g_array_index (demux->filepositions, gdouble, i); + gst_flv_demux_parse_and_add_index_entry (demux, time, fileposition, + TRUE); + } + demux->indexed = TRUE; + } + } + + return ret; +} + +static gboolean +gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag, + guint32 rate, guint32 channels, guint32 width) +{ + GstCaps *caps = NULL; + gchar *codec_name = NULL; + gboolean ret = FALSE; + guint adjusted_rate = rate; + + switch (codec_tag) { + case 1: + caps = gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, + "swf", NULL); + 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); + 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); + break; + case 4: + case 5: + case 6: + caps = gst_caps_new_simple ("audio/x-nellymoser", NULL); + break; + case 10: + { + /* use codec-data to extract and verify samplerate */ + if (demux->audio_codec_data && + GST_BUFFER_SIZE (demux->audio_codec_data) >= 2) { + gint freq_index; + + freq_index = + ((GST_READ_UINT16_BE (GST_BUFFER_DATA (demux->audio_codec_data)))); + freq_index = (freq_index & 0x0780) >> 7; + adjusted_rate = + gst_codec_utils_aac_get_sample_rate_from_index (freq_index); + + if (adjusted_rate && (rate != adjusted_rate)) { + GST_LOG_OBJECT (demux, "Ajusting AAC sample rate %d -> %d", rate, + adjusted_rate); + } else { + adjusted_rate = rate; + } + } + caps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 4, "framed", G_TYPE_BOOLEAN, TRUE, + "stream-format", G_TYPE_STRING, "raw", NULL); + break; + } + case 7: + caps = gst_caps_new_simple ("audio/x-alaw", NULL); + break; + case 8: + caps = gst_caps_new_simple ("audio/x-mulaw", NULL); + break; + case 11: + caps = gst_caps_new_simple ("audio/x-speex", NULL); + 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, adjusted_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 got from tags */ + demux->audio_codec_tag = codec_tag; + demux->rate = rate; + demux->channels = channels; + demux->width = width; + + codec_name = gst_pb_utils_get_codec_description (caps); + + 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); + g_free (codec_name); + } + + 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; +} + +static void +gst_flv_demux_push_tags (GstFlvDemux * demux) +{ + if (demux->has_audio && !demux->audio_pad) { + GST_DEBUG_OBJECT (demux, + "Waiting for audio stream pad to come up before we can push tags"); + return; + } + if (demux->has_video && !demux->video_pad) { + GST_DEBUG_OBJECT (demux, + "Waiting for video stream pad to come up before we can push tags"); + return; + } + if (demux->taglist) { + GST_DEBUG_OBJECT (demux, "pushing tags out %" GST_PTR_FORMAT, + demux->taglist); + gst_element_found_tags (GST_ELEMENT (demux), demux->taglist); + demux->taglist = gst_tag_list_new (); + demux->push_tags = FALSE; + } +} + +static void +gst_flv_demux_update_resync (GstFlvDemux * demux, guint32 pts, gboolean discont, + guint32 * last, GstClockTime * offset) +{ + gint32 dpts = pts - *last; + if (!discont && ABS (dpts) >= RESYNC_THRESHOLD) { + /* Theoretically, we should use substract the duration of the last buffer, + but this demuxer sends no durations on buffers, not sure if it cannot + know, or just does not care to calculate. */ + *offset -= dpts * GST_MSECOND; + GST_WARNING_OBJECT (demux, + "Large pts gap (%" G_GINT32_FORMAT " ms), assuming resync, offset now %" + GST_TIME_FORMAT "", dpts, GST_TIME_ARGS (*offset)); + } + *last = pts; +} + +static GstFlowReturn +gst_flv_demux_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"); + + if (demux->no_more_pads && !demux->audio_pad) { + GST_WARNING_OBJECT (demux, + "Signaled no-more-pads already but had no audio pad -- ignoring"); + goto beach; + } + + g_return_val_if_fail (GST_BUFFER_SIZE (buffer) == demux->tag_size, + GST_FLOW_ERROR); + + /* 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; + + GST_LOG_OBJECT (demux, "pts bytes %02X %02X %02X %02X (%d)", data[0], data[1], + data[2], data[3], pts); + + /* Error out on tags with too small headers */ + if (GST_BUFFER_SIZE (buffer) < 11) { + GST_ERROR_OBJECT (demux, "Too small tag size (%d)", + GST_BUFFER_SIZE (buffer)); + return GST_FLOW_ERROR; + } + + /* Silently skip buffers with no data */ + if (GST_BUFFER_SIZE (buffer) == 11) + return GST_FLOW_OK; + + /* 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_demux_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)); + demux->no_more_pads = TRUE; + demux->push_tags = TRUE; + } + } + + /* 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_demux_audio_negotiate (demux, codec_tag, rate, channels, + width)) { + ret = GST_FLOW_ERROR; + goto beach; + } + } + + /* Push taglist if present */ + if (G_UNLIKELY (demux->push_tags)) + gst_flv_demux_push_tags (demux); + + /* 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: + { + /* AudioSpecificConfig 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_demux_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); + } + } + + /* detect (and deem to be resyncs) large pts gaps */ + gst_flv_demux_update_resync (demux, pts, demux->audio_need_discont, + &demux->last_audio_pts, &demux->audio_time_offset); + + /* Fill buffer with data */ + GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND + demux->audio_time_offset; + 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 the index is not yet complete */ + if (!demux->has_video && demux->index && !demux->indexed) { + gst_flv_demux_parse_and_add_index_entry (demux, + GST_BUFFER_TIMESTAMP (outbuf), demux->cur_tag_offset, TRUE); + } + + 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)); + + if (!GST_CLOCK_TIME_IS_VALID (demux->audio_start)) { + demux->audio_start = GST_BUFFER_TIMESTAMP (outbuf); + } + if (!GST_CLOCK_TIME_IS_VALID (demux->audio_first_ts)) { + demux->audio_first_ts = GST_BUFFER_TIMESTAMP (outbuf); + } + + if (G_UNLIKELY (!demux->no_more_pads + && (GST_CLOCK_DIFF (demux->audio_start, + GST_BUFFER_TIMESTAMP (outbuf)) > 6 * GST_SECOND))) { + GST_DEBUG_OBJECT (demux, + "Signalling no-more-pads because no video stream was found" + " after 6 seconds of audio"); + gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); + demux->no_more_pads = TRUE; + demux->push_tags = TRUE; + } + + /* Push downstream */ + ret = gst_pad_push (demux->audio_pad, outbuf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) { + if (demux->segment.rate < 0.0 && ret == GST_FLOW_UNEXPECTED && + demux->segment.last_stop > demux->segment.stop) { + /* In reverse playback we can get a GST_FLOW_UNEXPECTED when + * we are at the end of the segment, so we just need to jump + * back to the previous section. */ + GST_DEBUG_OBJECT (demux, "downstream has reached end of segment"); + demux->audio_done = TRUE; + ret = GST_FLOW_OK; + } else { + 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_demux_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); + break; + case 3: + caps = gst_caps_new_simple ("video/x-flash-screen", NULL); + break; + case 4: + caps = gst_caps_new_simple ("video/x-vp6-flash", NULL); + break; + case 5: + caps = gst_caps_new_simple ("video/x-vp6-alpha", NULL); + break; + case 7: + caps = + gst_caps_new_simple ("video/x-h264", "stream-format", G_TYPE_STRING, + "avc", NULL); + 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 (G_LIKELY (demux->w)) { + gst_caps_set_simple (caps, "width", G_TYPE_INT, demux->w, NULL); + } + + if (G_LIKELY (demux->h)) { + gst_caps_set_simple (caps, "height", G_TYPE_INT, demux->h, NULL); + } + + if (G_LIKELY (demux->framerate)) { + gint num = 0, den = 0; + + gst_util_double_to_fraction (demux->framerate, &num, &den); + GST_DEBUG_OBJECT (demux->video_pad, + "fps to be used on caps %f (as a fraction = %d/%d)", demux->framerate, + num, den); + + gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, num, den, 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; + + codec_name = gst_pb_utils_get_codec_description (caps); + + 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); + g_free (codec_name); + } + + 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; +} + +static GstFlowReturn +gst_flv_demux_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"); + + + if (demux->no_more_pads && !demux->video_pad) { + GST_WARNING_OBJECT (demux, + "Signaled no-more-pads already but had no audio pad -- ignoring"); + goto beach; + } + + /* 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; + + GST_LOG_OBJECT (demux, "pts bytes %02X %02X %02X %02X (%d)", data[0], data[1], + data[2], data[3], pts); + + 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) { + gint32 cts; + + codec_data = 5; + + cts = GST_READ_UINT24_BE (data + 9); + cts = (cts + 0xff800000) ^ 0xff800000; + + GST_LOG_OBJECT (demux, "got cts %d", cts); + + /* avoid negative overflow */ + if (cts >= 0 || pts >= -cts) + pts += cts; + } + + 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_demux_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)); + demux->no_more_pads = TRUE; + demux->push_tags = TRUE; + } + } + + /* 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_demux_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 (G_UNLIKELY (demux->push_tags)) + gst_flv_demux_push_tags (demux); + + /* 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_demux_video_negotiate (demux, codec_tag); + goto beach; + break; + } + case 1: + /* H.264 NALU packet */ + GST_LOG_OBJECT (demux, "got a H.264 NALU video packet"); + break; + default: + GST_WARNING_OBJECT (demux, "invalid video packet type %u", + avc_packet_type); + } + } + + /* detect (and deem to be resyncs) large pts gaps */ + gst_flv_demux_update_resync (demux, pts, demux->video_need_discont, + &demux->last_video_pts, &demux->video_time_offset); + + /* Fill buffer with data */ + GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND + demux->video_time_offset; + 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->indexed && demux->index) { + gst_flv_demux_parse_and_add_index_entry (demux, + GST_BUFFER_TIMESTAMP (outbuf), demux->cur_tag_offset, keyframe); + } + + 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); + + if (!GST_CLOCK_TIME_IS_VALID (demux->video_start)) { + demux->video_start = GST_BUFFER_TIMESTAMP (outbuf); + } + if (!GST_CLOCK_TIME_IS_VALID (demux->audio_first_ts)) { + demux->video_first_ts = GST_BUFFER_TIMESTAMP (outbuf); + } + + if (G_UNLIKELY (!demux->no_more_pads + && (GST_CLOCK_DIFF (demux->video_start, + GST_BUFFER_TIMESTAMP (outbuf)) > 6 * GST_SECOND))) { + GST_DEBUG_OBJECT (demux, + "Signalling no-more-pads because no audio stream was found" + " after 6 seconds of video"); + gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); + demux->no_more_pads = TRUE; + demux->push_tags = TRUE; + } + + /* Push downstream */ + ret = gst_pad_push (demux->video_pad, outbuf); + + if (G_UNLIKELY (ret != GST_FLOW_OK)) { + if (demux->segment.rate < 0.0 && ret == GST_FLOW_UNEXPECTED && + demux->segment.last_stop > demux->segment.stop) { + /* In reverse playback we can get a GST_FLOW_UNEXPECTED when + * we are at the end of the segment, so we just need to jump + * back to the previous section. */ + GST_DEBUG_OBJECT (demux, "downstream has reached end of segment"); + demux->video_done = TRUE; + ret = GST_FLOW_OK; + } else { + 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; +} + +static GstClockTime +gst_flv_demux_parse_tag_timestamp (GstFlvDemux * demux, gboolean index, + 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; + GST_LOG_OBJECT (demux, "pts: %" GST_TIME_FORMAT, GST_TIME_ARGS (ret)); + + if (index && demux->index && !demux->indexed && (type == 9 || (type == 8 + && !demux->has_video))) { + gst_flv_demux_parse_and_add_index_entry (demux, ret, demux->offset, + keyframe); + } + + if (demux->duration == GST_CLOCK_TIME_NONE || demux->duration < ret) + demux->duration = ret; + + return ret; +} + +static GstFlowReturn +gst_flv_demux_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; +} + +static GstFlowReturn +gst_flv_demux_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; + } + } + + /* do a one-time seekability check */ + gst_flv_demux_check_seekability (demux); + + /* We don't care about the rest */ + demux->need_header = FALSE; + +beach: + return ret; +} + + +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 and if we're not during a seek */ + if (!demux->random_access && demux->state != FLV_STATE_SEEK) { + /* 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; + + demux->indexed = FALSE; + demux->upstream_seekable = FALSE; + demux->file_size = 0; + + demux->index_max_pos = 0; + demux->index_max_time = 0; + + demux->audio_start = demux->video_start = GST_CLOCK_TIME_NONE; + demux->last_audio_pts = demux->last_video_pts = 0; + demux->audio_time_offset = demux->video_time_offset = 0; + + demux->no_more_pads = FALSE; + + gst_segment_init (&demux->segment, GST_FORMAT_TIME); + + demux->w = demux->h = 0; + demux->framerate = 0.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; + } +} + +/* + * Create and push a flushing seek event upstream + */ +static gboolean +flv_demux_seek_to_offset (GstFlvDemux * demux, guint64 offset) +{ + GstEvent *event; + gboolean res = 0; + + GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset); + + event = + gst_event_new_seek (1.0, GST_FORMAT_BYTES, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, + GST_SEEK_TYPE_NONE, -1); + + res = gst_pad_push_event (demux->sinkpad, event); + + if (res) + demux->offset = offset; + return res; +} + +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); + } + + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { + GST_DEBUG_OBJECT (demux, "Discontinuity"); + gst_adapter_clear (demux->adapter); + } + + gst_adapter_push (demux->adapter, buffer); + + if (demux->seeking) { + demux->state = FLV_STATE_SEEK; + GST_OBJECT_LOCK (demux); + demux->seeking = FALSE; + GST_OBJECT_UNLOCK (demux); + } + +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_demux_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_demux_parse_tag_type (demux, buffer); + + gst_buffer_unref (buffer); + demux->offset += FLV_TAG_TYPE_SIZE; + + /* last tag is not an index => no index/don't know where the index is + * seek back to the beginning */ + if (demux->seek_event && demux->state != FLV_STATE_TAG_SCRIPT) + goto no_index; + + 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_demux_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_demux_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_demux_parse_tag_script (demux, buffer); + + gst_buffer_unref (buffer); + demux->offset += demux->tag_size; + + demux->state = FLV_STATE_TAG_TYPE; + + /* if there's a seek event we're here for the index so if we don't have it + * we seek back to the beginning */ + if (demux->seek_event) { + if (demux->indexed) + demux->state = FLV_STATE_SEEK; + else + goto no_index; + } + + goto parse; + } else { + goto beach; + } + } + case FLV_STATE_SEEK: + { + GstEvent *event; + + ret = GST_FLOW_OK; + + if (!demux->indexed) { + if (demux->offset == demux->file_size - sizeof (guint32)) { + GstBuffer *buffer = + gst_adapter_take_buffer (demux->adapter, sizeof (guint32)); + GstByteReader *reader = gst_byte_reader_new_from_buffer (buffer); + guint64 seek_offset; + + if (!gst_adapter_available (demux->adapter) >= sizeof (guint32)) { + /* error */ + } + + seek_offset = + demux->file_size - sizeof (guint32) - + gst_byte_reader_peek_uint32_be_unchecked (reader); + gst_byte_reader_free (reader); + gst_buffer_unref (buffer); + + GST_INFO_OBJECT (demux, + "Seeking to beginning of last tag at %" G_GUINT64_FORMAT, + seek_offset); + demux->state = FLV_STATE_TAG_TYPE; + flv_demux_seek_to_offset (demux, seek_offset); + goto beach; + } else + goto no_index; + } + + GST_OBJECT_LOCK (demux); + event = demux->seek_event; + demux->seek_event = NULL; + GST_OBJECT_UNLOCK (demux); + + /* calculate and perform seek */ + if (!flv_demux_handle_seek_push (demux, event)) + goto seek_failed; + + gst_event_unref (event); + demux->state = FLV_STATE_TAG_TYPE; + 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; + +/* ERRORS */ +no_index: + { + GST_OBJECT_LOCK (demux); + demux->seeking = FALSE; + gst_event_unref (demux->seek_event); + demux->seek_event = NULL; + GST_OBJECT_UNLOCK (demux); + GST_WARNING_OBJECT (demux, + "failed to find an index, seeking back to beginning"); + flv_demux_seek_to_offset (demux, 0); + return GST_FLOW_OK; + } +seek_failed: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("seek failed")); + return GST_FLOW_ERROR; + } + +} + +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_demux_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_demux_parse_tag_video (demux, buffer); + break; + case FLV_STATE_TAG_AUDIO: + ret = gst_flv_demux_parse_tag_audio (demux, buffer); + break; + case FLV_STATE_TAG_SCRIPT: + ret = gst_flv_demux_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_demux_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 void +gst_flv_demux_move_to_offset (GstFlvDemux * demux, gint64 offset, + gboolean reset) +{ + demux->offset = offset; + + /* Tell all the stream we moved to a different position (discont) */ + demux->audio_need_discont = TRUE; + demux->video_need_discont = TRUE; + + /* next section setup */ + demux->from_offset = -1; + demux->audio_done = demux->video_done = FALSE; + demux->audio_first_ts = demux->video_first_ts = GST_CLOCK_TIME_NONE; + + if (reset) { + demux->from_offset = -1; + demux->to_offset = G_MAXINT64; + } + + /* 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; + } +} + +static GstFlowReturn +gst_flv_demux_seek_to_prev_keyframe (GstFlvDemux * demux) +{ + GstFlowReturn ret = GST_FLOW_UNEXPECTED; + GstIndexEntry *entry = NULL; + + GST_DEBUG_OBJECT (demux, + "terminated section started at offset %" G_GINT64_FORMAT, + demux->from_offset); + + /* we are done if we got all audio and video */ + if ((!GST_CLOCK_TIME_IS_VALID (demux->audio_first_ts) || + demux->audio_first_ts < demux->segment.start) && + (!GST_CLOCK_TIME_IS_VALID (demux->video_first_ts) || + demux->video_first_ts < demux->segment.start)) + goto done; + + if (demux->from_offset <= 0) + goto done; + + GST_DEBUG_OBJECT (demux, "locating previous position"); + + /* locate index entry before previous start position */ + if (demux->index) + entry = gst_index_get_assoc_entry (demux->index, demux->index_id, + GST_INDEX_LOOKUP_BEFORE, GST_ASSOCIATION_FLAG_KEY_UNIT, + GST_FORMAT_BYTES, demux->from_offset - 1); + + if (entry) { + gint64 bytes, time; + + 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 %" G_GINT64_FORMAT + " at %" GST_TIME_FORMAT ", seeking to %" G_GINT64_FORMAT, + demux->offset - 1, GST_TIME_ARGS (time), bytes); + + /* setup for next section */ + demux->to_offset = demux->from_offset; + gst_flv_demux_move_to_offset (demux, bytes, FALSE); + ret = GST_FLOW_OK; + } + +done: + return ret; +} + +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 GstFlowReturn +gst_flv_demux_create_index (GstFlvDemux * demux, gint64 pos, GstClockTime ts) +{ + gint64 size; + GstFormat fmt = GST_FORMAT_BYTES; + size_t tag_size; + guint64 old_offset; + GstBuffer *buffer; + GstClockTime tag_time; + GstFlowReturn ret = GST_FLOW_OK; + + if (G_UNLIKELY (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &size) || + fmt != GST_FORMAT_BYTES)) + return GST_FLOW_OK; + + GST_DEBUG_OBJECT (demux, "building index at %" G_GINT64_FORMAT + " looking for time %" GST_TIME_FORMAT, pos, GST_TIME_ARGS (ts)); + + old_offset = demux->offset; + demux->offset = pos; + + while ((ret = gst_flv_demux_pull_range (demux, demux->sinkpad, demux->offset, + 12, &buffer)) == GST_FLOW_OK) { + tag_time = + gst_flv_demux_parse_tag_timestamp (demux, TRUE, buffer, &tag_size); + + gst_buffer_unref (buffer); + + if (G_UNLIKELY (tag_time == GST_CLOCK_TIME_NONE || tag_time > ts)) + goto exit; + + demux->offset += tag_size; + } + + if (ret == GST_FLOW_UNEXPECTED) { + /* file ran out, so mark we have complete index */ + demux->indexed = TRUE; + ret = GST_FLOW_OK; + } + +exit: + demux->offset = old_offset; + + return ret; +} + +static gint64 +gst_flv_demux_get_metadata (GstFlvDemux * demux) +{ + gint64 ret = 0, offset; + GstFormat fmt = GST_FORMAT_BYTES; + size_t tag_size, size; + GstBuffer *buffer = NULL; + + if (G_UNLIKELY (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &offset) + || fmt != GST_FORMAT_BYTES)) + goto exit; + + ret = offset; + GST_DEBUG_OBJECT (demux, "upstream size: %" G_GINT64_FORMAT, offset); + if (G_UNLIKELY (offset < 4)) + goto exit; + + offset -= 4; + if (GST_FLOW_OK != gst_flv_demux_pull_range (demux, demux->sinkpad, offset, + 4, &buffer)) + goto exit; + + tag_size = GST_READ_UINT32_BE (GST_BUFFER_DATA (buffer)); + GST_DEBUG_OBJECT (demux, "last tag size: %" G_GSIZE_FORMAT, tag_size); + gst_buffer_unref (buffer); + buffer = NULL; + + offset -= tag_size; + if (GST_FLOW_OK != gst_flv_demux_pull_range (demux, demux->sinkpad, offset, + 12, &buffer)) + goto exit; + + /* a consistency check */ + size = GST_READ_UINT24_BE (GST_BUFFER_DATA (buffer) + 1); + if (size != tag_size - 11) { + GST_DEBUG_OBJECT (demux, + "tag size %" G_GSIZE_FORMAT ", expected %" G_GSIZE_FORMAT + ", corrupt or truncated file", size, tag_size - 11); + goto exit; + } + + /* try to update duration with timestamp in any case */ + gst_flv_demux_parse_tag_timestamp (demux, FALSE, buffer, &size); + + /* maybe get some more metadata */ + if (GST_BUFFER_DATA (buffer)[0] == 18) { + gst_buffer_unref (buffer); + buffer = NULL; + GST_DEBUG_OBJECT (demux, "script tag, pulling it to parse"); + offset += 4; + if (GST_FLOW_OK == gst_flv_demux_pull_range (demux, demux->sinkpad, offset, + tag_size, &buffer)) + gst_flv_demux_parse_tag_script (demux, buffer); + } + +exit: + if (buffer) + gst_buffer_unref (buffer); + + return ret; +} + +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)); + + /* pull in data */ + switch (demux->state) { + case FLV_STATE_TAG_TYPE: + if (demux->from_offset == -1) + demux->from_offset = demux->offset; + ret = gst_flv_demux_pull_tag (pad, demux); + /* if we have seen real data, we probably passed a possible metadata + * header located at start. So if we do not yet have an index, + * try to pick up metadata (index, duration) at the end */ + if (G_UNLIKELY (!demux->file_size && !demux->indexed && + (demux->has_video || demux->has_audio))) + demux->file_size = gst_flv_demux_get_metadata (demux); + break; + case FLV_STATE_DONE: + ret = GST_FLOW_UNEXPECTED; + break; + case FLV_STATE_SEEK: + /* seek issued with insufficient index; + * scan for index in task thread from current maximum offset to + * desired time and then perform seek */ + /* TODO maybe some buffering message or so to indicate scan progress */ + ret = gst_flv_demux_create_index (demux, demux->index_max_pos, + demux->seek_time); + if (ret != GST_FLOW_OK) + goto pause; + /* position and state arranged by seek, + * also unrefs event */ + gst_flv_demux_handle_seek_pull (demux, demux->seek_event, FALSE); + demux->seek_event = NULL; + break; + default: + ret = gst_flv_demux_pull_header (pad, demux); + /* index scans start after header */ + demux->index_max_pos = demux->offset; + break; + } + + if (demux->segment.rate < 0.0) { + /* check end of section */ + if ((gint64) demux->offset >= demux->to_offset || + demux->segment.last_stop >= demux->segment.stop + 2 * GST_SECOND || + (demux->audio_done && demux->video_done)) + ret = gst_flv_demux_seek_to_prev_keyframe (demux); + } else { + /* check EOS condition */ + if ((demux->segment.stop != -1) && + (demux->segment.last_stop >= demux->segment.stop)) { + ret = GST_FLOW_UNEXPECTED; + } + } + + /* pause if something went wrong or at end */ + if (G_UNLIKELY (ret != GST_FLOW_OK)) + 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 (ret == GST_FLOW_UNEXPECTED) { + /* perform EOS logic */ + if (!demux->no_more_pads) { + gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); + demux->no_more_pads = TRUE; + } + + 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 */ + if (!demux->no_more_pads) { + gst_element_no_more_pads (GST_ELEMENT (demux)); + demux->no_more_pads = TRUE; + } + + 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 if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + 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->last_stop; + + 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->last_stop), 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 +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, 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); + /* FIXME : the keyframe flag is never used ! */ + + /* 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"); + gst_event_unref (event); + return FALSE; + } +} + +static gboolean +gst_flv_demux_handle_seek_push (GstFlvDemux * demux, GstEvent * event) +{ + GstFormat format; + + gst_event_parse_seek (event, NULL, &format, NULL, NULL, NULL, NULL, NULL); + + if (format != GST_FORMAT_TIME) { + GST_WARNING_OBJECT (demux, "we only support seeking in TIME format"); + gst_event_unref (event); + return FALSE; + } + + /* First try upstream */ + if (gst_pad_push_event (demux->sinkpad, gst_event_ref (event))) { + GST_DEBUG_OBJECT (demux, "Upstream successfully seeked"); + gst_event_unref (event); + return TRUE; + } + + if (!demux->indexed) { + guint64 seek_offset = 0; + gboolean building_index; + GstFormat fmt; + + GST_OBJECT_LOCK (demux); + /* handle the seek in the chain function */ + demux->seeking = TRUE; + demux->state = FLV_STATE_SEEK; + + /* copy the event */ + if (demux->seek_event) + gst_event_unref (demux->seek_event); + demux->seek_event = gst_event_ref (event); + + /* set the building_index flag so that only one thread can setup the + * structures for index seeking. */ + building_index = demux->building_index; + if (!building_index) { + demux->building_index = TRUE; + fmt = GST_FORMAT_BYTES; + if (!demux->file_size + && !gst_pad_query_peer_duration (demux->sinkpad, &fmt, + &demux->file_size)) { + GST_WARNING_OBJECT (demux, + "Cannot obtain file size - %" G_GINT64_FORMAT ", format %u", + demux->file_size, fmt); + GST_OBJECT_UNLOCK (demux); + return FALSE; + } + + /* we hope the last tag is a scriptdataobject containing an index + * the size of the last tag is given in the last guint32 bits + * then we seek to the beginning of the tag, parse it and hopefully obtain an index */ + seek_offset = demux->file_size - sizeof (guint32); + GST_DEBUG_OBJECT (demux, + "File size obtained, seeking to %" G_GUINT64_FORMAT, seek_offset); + } + GST_OBJECT_UNLOCK (demux); + + if (!building_index) { + GST_INFO_OBJECT (demux, "Seeking to last 4 bytes at %" G_GUINT64_FORMAT, + seek_offset); + return flv_demux_seek_to_offset (demux, seek_offset); + } + + /* FIXME: we have to always return true so that we don't block the seek + * thread. + * Note: maybe it is OK to return true if we're still building the index */ + return TRUE; + } + + return flv_demux_handle_seek_push (demux, event); +} + +static gboolean +gst_flv_demux_handle_seek_pull (GstFlvDemux * demux, GstEvent * event, + gboolean seeking) +{ + GstFormat format; + GstSeekFlags flags; + GstSeekType start_type, stop_type; + gint64 start, stop; + gdouble rate; + gboolean update, flush, ret = FALSE; + GstSegment seeksegment; + + gst_event_parse_seek (event, &rate, &format, &flags, + &start_type, &start, &stop_type, &stop); + + if (format != GST_FORMAT_TIME) + goto wrong_format; + + /* mark seeking thread entering flushing/pausing */ + GST_OBJECT_LOCK (demux); + if (seeking) + demux->seeking = seeking; + GST_OBJECT_UNLOCK (demux); + + flush = ! !(flags & GST_SEEK_FLAG_FLUSH); + /* FIXME : the keyframe flag is never used */ + + 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 */ + /* index is reliable if it is complete or we do not go to far ahead */ + if (seeking && !demux->indexed && + seeksegment.last_stop > demux->index_max_time + 10 * GST_SECOND) { + GST_DEBUG_OBJECT (demux, "delaying seek to post-scan; " + " index only up to %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->index_max_time)); + /* stop flushing for now */ + if (flush) + gst_flv_demux_push_src_event (demux, gst_event_new_flush_stop ()); + /* delegate scanning and index building to task thread to avoid + * occupying main (UI) loop */ + if (demux->seek_event) + gst_event_unref (demux->seek_event); + demux->seek_event = gst_event_ref (event); + demux->seek_time = seeksegment.last_stop; + demux->state = FLV_STATE_SEEK; + /* do not know about succes yet, but we did care and handled it */ + ret = TRUE; + goto exit; + } + /* now index should be as reliable as it can be for current purpose */ + gst_flv_demux_move_to_offset (demux, + gst_flv_demux_find_offset (demux, &seeksegment), TRUE); + 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; + } + if (demux->segment.rate < 0.0) { + /* we can't generate a segment by locking on + * to the first timestamp we see */ + GST_DEBUG_OBJECT (demux, "preparing newsegment from %" + GST_TIME_FORMAT " to %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->segment.start), + GST_TIME_ARGS (demux->segment.stop)); + demux->new_seg_event = + gst_event_new_new_segment (FALSE, demux->segment.rate, + demux->segment.format, demux->segment.start, + demux->segment.stop, demux->segment.start); + } + } + +exit: + GST_OBJECT_LOCK (demux); + seeking = demux->seeking && !seeking; + demux->seeking = FALSE; + GST_OBJECT_UNLOCK (demux); + + /* if we detect an external seek having started (and possibly already having + * flushed), do not restart task to give it a chance. + * Otherwise external one's flushing will take care to pause task */ + if (seeking) { + gst_pad_pause_task (demux->sinkpad); + } else { + gst_pad_start_task (demux->sinkpad, + (GstTaskFunction) gst_flv_demux_loop, demux->sinkpad); + } + + GST_PAD_STREAM_UNLOCK (demux->sinkpad); + + gst_event_unref (event); + return ret; + + /* ERRORS */ +wrong_format: + { + GST_WARNING_OBJECT (demux, "we only support seeking in TIME format"); + gst_event_unref (event); + return ret; + } +} + +/* 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); + } + if (!demux->no_more_pads) { + gst_element_no_more_pads (GST_ELEMENT (demux)); + demux->no_more_pads = TRUE; + } + + 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; +} + +static 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, TRUE); + } 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; +} + +static 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_position (query, GST_FORMAT_TIME, demux->segment.last_stop); + + break; + } + + case GST_QUERY_SEEKING:{ + GstFormat fmt; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + + /* First ask upstream */ + if (fmt == GST_FORMAT_TIME && gst_pad_peer_query (demux->sinkpad, query)) { + gboolean seekable; + + gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL); + if (seekable) { + res = TRUE; + break; + } + } + res = TRUE; + if (fmt != GST_FORMAT_TIME || !demux->index) { + gst_query_set_seeking (query, fmt, FALSE, -1, -1); + } else if (demux->random_access) { + gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, + demux->duration); + } else { + GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES); + gboolean seekable = gst_pad_peer_query (demux->sinkpad, peerquery); + + if (seekable) + gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL); + gst_query_unref (peerquery); + + if (seekable) + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, + demux->duration); + else + gst_query_set_seeking (query, GST_FORMAT_TIME, FALSE, -1, -1); + } + 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); + if (index) { + demux->index = gst_object_ref (index); + demux->own_index = FALSE; + } else + demux->index = NULL; + + GST_OBJECT_UNLOCK (demux); + /* object lock might be taken again */ + if (index) + gst_index_get_writer_id (index, GST_OBJECT (element), &demux->index_id); + GST_DEBUG_OBJECT (demux, "Set index %" GST_PTR_FORMAT, demux->index); + +} + +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_static_pad_template (element_class, + &flv_sink_template); + gst_element_class_add_static_pad_template (element_class, + &audio_src_template); + gst_element_class_add_static_pad_template (element_class, + &video_src_template); + gst_element_class_set_details_simple (element_class, "FLV Demuxer", + "Codec/Demuxer", + "Demux FLV feeds into digital streams", + "Julien Moutte "); +} + +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_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_PRIMARY, + 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 new file mode 100644 index 0000000..07559a5 --- /dev/null +++ b/gst/flv/gstflvdemux.h @@ -0,0 +1,156 @@ +/* GStreamer + * Copyright (C) <2007> Julien Moutte + * + * 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 +#include + +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_SEEK, + FLV_STATE_DONE, + FLV_STATE_NONE +} GstFlvDemuxState; + +struct _GstFlvDemux +{ + GstElement element; + + GstPad *sinkpad; + + GstPad *audio_pad; + GstPad *video_pad; + + /* */ + + 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; + GstClockTime audio_start; + guint32 last_audio_pts; + GstClockTime audio_time_offset; + + /* 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; + GstClockTime video_start; + guint32 last_video_pts; + GstClockTime video_time_offset; + gdouble framerate; + + gboolean random_access; + gboolean need_header; + gboolean has_audio; + gboolean has_video; + gboolean push_tags; + gboolean strict; + gboolean flushing; + + gboolean no_more_pads; + + gboolean seeking; + gboolean building_index; + gboolean indexed; /* TRUE if index is completely built */ + gboolean upstream_seekable; /* TRUE if upstream is seekable */ + gint64 file_size; + GstEvent *seek_event; + gint64 seek_time; + + GstClockTime index_max_time; + gint64 index_max_pos; + + /* reverse playback */ + GstClockTime video_first_ts; + GstClockTime audio_first_ts; + gboolean video_done; + gboolean audio_done; + gint64 from_offset; + gint64 to_offset; +}; + +struct _GstFlvDemuxClass +{ + GstElementClass parent_class; +}; + +GType gst_flv_demux_get_type (void); + +G_END_DECLS +#endif /* __FLV_DEMUX_H__ */ diff --git a/gst/flv/gstflvmux.c b/gst/flv/gstflvmux.c new file mode 100644 index 0000000..44ed7ea --- /dev/null +++ b/gst/flv/gstflvmux.c @@ -0,0 +1,1579 @@ +/* GStreamer + * + * Copyright (c) 2008,2009 Sebastian Dröge + * + * 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. + * + * + * Example launch line + * |[ + * 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. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstflvmux.h" +#include "amfdefs.h" + +GST_DEBUG_CATEGORY_STATIC (flvmux_debug); +#define GST_CAT_DEFAULT flvmux_debug + +enum +{ + PROP_0, + PROP_STREAMABLE +}; + +#define DEFAULT_STREAMABLE FALSE +#define MAX_INDEX_ENTRIES 128 + +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, stream-format=avc;") + ); + +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) 2, framed = (boolean) TRUE; " + "audio/mpeg, mpegversion = (int) 4, stream-format = (string) raw, 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 void gst_flv_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_flv_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); + +static GstStateChangeReturn +gst_flv_mux_change_state (GstElement * element, GstStateChange transition); + +static void gst_flv_mux_reset (GstElement * element); +static void gst_flv_mux_reset_pad (GstFlvMux * mux, GstFlvPad * pad, + gboolean video); + +typedef struct +{ + gdouble position; + gdouble time; +} GstFlvMuxIndexEntry; + +static void +gst_flv_mux_index_entry_free (GstFlvMuxIndexEntry * entry) +{ + g_slice_free (GstFlvMuxIndexEntry, entry); +} + +static void +gst_flv_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &videosink_templ); + gst_element_class_add_static_pad_template (element_class, + &audiosink_templ); + gst_element_class_add_static_pad_template (element_class, &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 "); + + 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->get_property = gst_flv_mux_get_property; + gobject_class->set_property = gst_flv_mux_set_property; + gobject_class->finalize = gst_flv_mux_finalize; + + /* FIXME: ideally the right mode of operation should be detected + * automatically using queries when parameter not specified. */ + /** + * GstFlvMux:streamable + * + * If True, the output will be streaming friendly. (ie without indexes and + * duration) + * + * Since: 0.10.24 + **/ + g_object_class_install_property (gobject_class, PROP_STREAMABLE, + g_param_spec_boolean ("streamable", "streamable", + "If set to true, the output should be as if it is to be streamed " + "and hence no indexes written or duration written.", + DEFAULT_STREAMABLE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + 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); + + /* property */ + mux->streamable = DEFAULT_STREAMABLE; + + mux->new_tags = FALSE; + + 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; + + for (sl = mux->collect->data; sl != NULL; sl = g_slist_next (sl)) { + GstFlvPad *cpad = (GstFlvPad *) sl->data; + + gst_flv_mux_reset_pad (mux, cpad, cpad->video); + } + + g_list_foreach (mux->index, (GFunc) gst_flv_mux_index_entry_free, NULL); + g_list_free (mux->index); + mux->index = NULL; + mux->byte_count = 0; + + mux->have_audio = mux->have_video = FALSE; + mux->duration = GST_CLOCK_TIME_NONE; + mux->new_tags = FALSE; + + mux->state = GST_FLV_MUX_STATE_HEADER; + + /* tags */ + gst_tag_setter_reset_tags (GST_TAG_SETTER (mux)); +} + +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 *list; + GstTagSetter *setter = GST_TAG_SETTER (mux); + const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter); + + gst_event_parse_tag (event, &list); + gst_tag_setter_merge_tags (setter, list, mode); + mux->new_tags = TRUE; + 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)); + } + + 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 || mpegversion == 2) { + 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 { + 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)); + } + + gst_object_unref (mux); + + return ret; +} + +static void +gst_flv_mux_reset_pad (GstFlvMux * mux, GstFlvPad * cpad, gboolean video) +{ + cpad->video = video; + + if (cpad->audio_codec_data) + gst_buffer_unref (cpad->audio_codec_data); + cpad->audio_codec_data = NULL; + cpad->audio_codec = G_MAXUINT; + cpad->rate = G_MAXUINT; + cpad->width = G_MAXUINT; + cpad->channels = G_MAXUINT; + + if (cpad->video_codec_data) + gst_buffer_unref (cpad->video_codec_data); + cpad->video_codec_data = NULL; + cpad->video_codec = G_MAXUINT; + cpad->last_timestamp = 0; +} + +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->audio_codec_data = NULL; + cpad->video_codec_data = NULL; + gst_flv_mux_reset_pad (mux, cpad, video); + + /* 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); + + gst_flv_mux_reset_pad (mux, cpad, cpad->video); + gst_collect_pads_remove_pad (mux->collect, pad); + gst_element_remove_pad (element, pad); +} + +static GstFlowReturn +gst_flv_mux_push (GstFlvMux * mux, GstBuffer * buffer) +{ + buffer = gst_buffer_make_metadata_writable (buffer); + gst_buffer_set_caps (buffer, GST_PAD_CAPS (mux->srcpad)); + /* pushing the buffer that rewrites the header will make it no longer be the + * total output size in bytes, but it doesn't matter at that point */ + mux->byte_count += GST_BUFFER_SIZE (buffer); + + return gst_pad_push (mux->srcpad, buffer); +} + +static GstBuffer * +gst_flv_mux_create_header (GstFlvMux * mux) +{ + GstBuffer *header; + guint8 *data; + + header = gst_buffer_new_and_alloc (9 + 4); + data = GST_BUFFER_DATA (header); + + 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 */ + + return header; +} + +static GstBuffer * +gst_flv_mux_preallocate_index (GstFlvMux * mux) +{ + GstBuffer *tmp; + guint8 *data; + gint preallocate_size; + + /* preallocate index of size: + * - 'keyframes' ECMA array key: 2 + 9 = 11 bytes + * - nested ECMA array header, length and end marker: 8 bytes + * - 'times' and 'filepositions' keys: 22 bytes + * - two strict arrays headers and lengths: 10 bytes + * - each index entry: 18 bytes + */ + preallocate_size = 11 + 8 + 22 + 10 + MAX_INDEX_ENTRIES * 18; + GST_DEBUG_OBJECT (mux, "preallocating %d bytes for the index", + preallocate_size); + + tmp = gst_buffer_new_and_alloc (preallocate_size); + data = GST_BUFFER_DATA (tmp); + + /* prefill the space with a gstfiller: script tag variable */ + GST_WRITE_UINT16_BE (data, 9); /* 9 characters */ + memcpy (data + 2, "gstfiller", 9); + GST_WRITE_UINT8 (data + 11, AMF0_STRING_MARKER); /* a string value */ + GST_WRITE_UINT16_BE (data + 12, preallocate_size - 14); + memset (data + 14, ' ', preallocate_size - 14); /* the rest is spaces */ + return tmp; +} + +static GstBuffer * +gst_flv_mux_create_number_script_value (const gchar * name, gdouble value) +{ + GstBuffer *tmp = gst_buffer_new_and_alloc (2 + strlen (name) + 1 + 8); + guint8 *data = GST_BUFFER_DATA (tmp); + gsize len = strlen (name); + + GST_WRITE_UINT16_BE (data, len); + data += 2; /* name length */ + memcpy (data, name, len); + data += len; + *data++ = AMF0_NUMBER_MARKER; /* double type */ + GST_WRITE_DOUBLE_BE (data, value); + + return tmp; +} + +static GstBuffer * +gst_flv_mux_create_metadata (GstFlvMux * mux, gboolean full) +{ + const GstTagList *tags; + GstBuffer *script_tag, *tmp; + guint8 *data; + gint i, n_tags, tags_written = 0; + + tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux)); + + GST_DEBUG_OBJECT (mux, "tags = %" GST_PTR_FORMAT, 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] = AMF0_STRING_MARKER; /* string */ + data[1] = 0; + data[2] = 10; /* length 10 */ + memcpy (&data[3], "onMetaData", 10); + + script_tag = gst_buffer_join (script_tag, tmp); + + n_tags = (tags) ? gst_structure_n_fields ((GstStructure *) 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); + + if (!full) + goto tags; + + /* Some players expect the 'duration' to be always set. Fill it out later, + after querying the pads or after getting EOS */ + if (!mux->streamable) { + tmp = gst_flv_mux_create_number_script_value ("duration", 86400); + script_tag = gst_buffer_join (script_tag, tmp); + tags_written++; + + /* Sometimes the information about the total file size is useful for the + player. It will be filled later, after getting EOS */ + tmp = gst_flv_mux_create_number_script_value ("filesize", 0); + script_tag = gst_buffer_join (script_tag, tmp); + tags_written++; + + /* Preallocate space for the index to be written at EOS */ + tmp = gst_flv_mux_preallocate_index (mux); + script_tag = gst_buffer_join (script_tag, tmp); + } else { + GST_DEBUG_OBJECT (mux, "not preallocating index, streamable mode"); + } + +tags: + for (i = 0; tags && i < n_tags; i++) { + const gchar *tag_name = + gst_structure_nth_field_name ((const GstStructure *) tags, i); + if (!strcmp (tag_name, GST_TAG_DURATION)) { + guint64 dur; + + if (!gst_tag_list_get_uint64 (tags, GST_TAG_DURATION, &dur)) + continue; + mux->duration = dur; + } else if (!strcmp (tag_name, GST_TAG_ARTIST) || + !strcmp (tag_name, GST_TAG_TITLE)) { + gchar *s; + const gchar *t = NULL; + + 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 (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 (!full) + goto end; + + if (mux->duration == GST_CLOCK_TIME_NONE) { + GSList *l; + + GstFormat fmt = GST_FORMAT_TIME; + guint64 dur; + + for (l = mux->collect->data; l; l = l->next) { + GstCollectData *cdata = l->data; + + fmt = GST_FORMAT_TIME; + + if (gst_pad_query_peer_duration (cdata->pad, &fmt, (gint64 *) & dur) && + fmt == GST_FORMAT_TIME && dur != GST_CLOCK_TIME_NONE) { + if (mux->duration == GST_CLOCK_TIME_NONE) + mux->duration = dur; + else + mux->duration = MAX (dur, mux->duration); + } + } + } + + if (!mux->streamable && mux->duration != GST_CLOCK_TIME_NONE) { + gdouble d; + d = gst_guint64_to_gdouble (mux->duration); + d /= (gdouble) GST_SECOND; + + GST_DEBUG_OBJECT (mux, "determined the duration to be %f", d); + data = GST_BUFFER_DATA (script_tag); + GST_WRITE_DOUBLE_BE (data + 29 + 2 + 8 + 1, d); + } + + if (mux->have_video) { + GstPad *video_pad = NULL; + GstFlvPad *cpad; + GSList *l = mux->collect->data; + + for (; l; l = l->next) { + 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 size; + gint num, den; + + GST_DEBUG_OBJECT (mux, "putting videocodecid %d in the metadata", + cpad->video_codec); + + tmp = gst_flv_mux_create_number_script_value ("videocodecid", + cpad->video_codec); + script_tag = gst_buffer_join (script_tag, tmp); + tags_written++; + + if (gst_structure_get_int (s, "width", &size)) { + GST_DEBUG_OBJECT (mux, "putting width %d in the metadata", size); + + tmp = gst_flv_mux_create_number_script_value ("width", size); + script_tag = gst_buffer_join (script_tag, tmp); + tags_written++; + } + + if (gst_structure_get_int (s, "height", &size)) { + GST_DEBUG_OBJECT (mux, "putting height %d in the metadata", size); + + tmp = gst_flv_mux_create_number_script_value ("height", size); + script_tag = gst_buffer_join (script_tag, tmp); + tags_written++; + } + + if (gst_structure_get_fraction (s, "pixel-aspect-ratio", &num, &den)) { + gdouble d; + + d = num; + GST_DEBUG_OBJECT (mux, "putting AspectRatioX %f in the metadata", d); + + tmp = gst_flv_mux_create_number_script_value ("AspectRatioX", d); + script_tag = gst_buffer_join (script_tag, tmp); + tags_written++; + + d = den; + GST_DEBUG_OBJECT (mux, "putting AspectRatioY %f in the metadata", d); + + tmp = gst_flv_mux_create_number_script_value ("AspectRatioY", d); + script_tag = gst_buffer_join (script_tag, tmp); + tags_written++; + } + + if (gst_structure_get_fraction (s, "framerate", &num, &den)) { + gdouble d; + + gst_util_fraction_to_double (num, den, &d); + GST_DEBUG_OBJECT (mux, "putting framerate %f in the metadata", d); + + tmp = gst_flv_mux_create_number_script_value ("framerate", d); + script_tag = gst_buffer_join (script_tag, tmp); + tags_written++; + } + } + } + + if (mux->have_audio) { + GstPad *audio_pad = NULL; + GstFlvPad *cpad; + GSList *l = mux->collect->data; + + for (; l; l = l->next) { + cpad = l->data; + if (cpad && !cpad->video) { + audio_pad = cpad->collect.pad; + break; + } + } + + if (audio_pad) { + GST_DEBUG_OBJECT (mux, "putting audiocodecid %d in the metadata", + cpad->audio_codec); + + tmp = gst_flv_mux_create_number_script_value ("audiocodecid", + cpad->audio_codec); + 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", 15); + 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", 12); + 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++; + } + +end: + + if (!tags_written) { + gst_buffer_unref (script_tag); + script_tag = NULL; + goto exit; + } + + 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); + +exit: + return script_tag; +} + +static GstBuffer * +gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer, + GstFlvPad * cpad, gboolean is_codec_data) +{ + GstBuffer *tag; + guint8 *data; + guint size; + guint32 timestamp = + (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) ? GST_BUFFER_TIMESTAMP (buffer) / + GST_MSECOND : cpad->last_timestamp / GST_MSECOND; + + size = 11; + if (cpad->video) { + size += 1; + 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) + size += 1 + GST_BUFFER_SIZE (buffer); + else + size += GST_BUFFER_SIZE (buffer); + } + size += 4; + + tag = gst_buffer_new_and_alloc (size); + GST_BUFFER_TIMESTAMP (tag) = timestamp * GST_MSECOND; + 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; + + /* wrap the timestamp every G_MAXINT32 miliseconds */ + timestamp &= 0x7fffffff; + 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) { + data[12] = is_codec_data ? 0 : 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) { + data[12] = is_codec_data ? 0 : 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_copy_metadata (tag, buffer, GST_BUFFER_COPY_TIMESTAMPS); + /* mark the buffer if it's an audio buffer and there's also video being muxed + * or it's a video interframe */ + if ((mux->have_video && !cpad->video) || + GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) + GST_BUFFER_FLAG_SET (tag, GST_BUFFER_FLAG_DELTA_UNIT); + + GST_BUFFER_OFFSET (tag) = GST_BUFFER_OFFSET_END (tag) = + GST_BUFFER_OFFSET_NONE; + + return tag; +} + +static inline GstBuffer * +gst_flv_mux_buffer_to_tag (GstFlvMux * mux, GstBuffer * buffer, + GstFlvPad * cpad) +{ + return gst_flv_mux_buffer_to_tag_internal (mux, buffer, cpad, FALSE); +} + +static inline GstBuffer * +gst_flv_mux_codec_data_buffer_to_tag (GstFlvMux * mux, GstBuffer * buffer, + GstFlvPad * cpad) +{ + return gst_flv_mux_buffer_to_tag_internal (mux, buffer, cpad, TRUE); +} + +static void +gst_flv_mux_put_buffer_in_streamheader (GValue * streamheader, + GstBuffer * buffer) +{ + GValue value = { 0 }; + GstBuffer *buf; + + g_value_init (&value, GST_TYPE_BUFFER); + buf = gst_buffer_copy (buffer); + gst_value_set_buffer (&value, buf); + gst_buffer_unref (buf); + gst_value_array_append_value (streamheader, &value); + g_value_unset (&value); +} + +static GstFlowReturn +gst_flv_mux_write_header (GstFlvMux * mux) +{ + GstBuffer *header, *metadata; + GstBuffer *video_codec_data, *audio_codec_data; + GstCaps *caps; + GstStructure *structure; + GValue streamheader = { 0 }; + GSList *l; + GstFlowReturn ret; + + header = gst_flv_mux_create_header (mux); + metadata = gst_flv_mux_create_metadata (mux, TRUE); + video_codec_data = NULL; + audio_codec_data = NULL; + + for (l = mux->collect->data; l != NULL; l = l->next) { + GstFlvPad *cpad = l->data; + + /* Get H.264 and AAC codec data, if present */ + if (cpad && cpad->video && cpad->video_codec == 7) { + if (cpad->video_codec_data == NULL) + GST_WARNING_OBJECT (mux, "Codec data for video stream not found, " + "output might not be playable"); + else + video_codec_data = + gst_flv_mux_codec_data_buffer_to_tag (mux, cpad->video_codec_data, + cpad); + } else if (cpad && !cpad->video && cpad->audio_codec == 10) { + if (cpad->audio_codec_data == NULL) + GST_WARNING_OBJECT (mux, "Codec data for audio stream not found, " + "output might not be playable"); + else + audio_codec_data = + gst_flv_mux_codec_data_buffer_to_tag (mux, cpad->audio_codec_data, + cpad); + } + } + + /* mark buffers that will go in the streamheader */ + GST_BUFFER_FLAG_SET (header, GST_BUFFER_FLAG_IN_CAPS); + GST_BUFFER_FLAG_SET (metadata, GST_BUFFER_FLAG_IN_CAPS); + if (video_codec_data != NULL) { + GST_BUFFER_FLAG_SET (video_codec_data, GST_BUFFER_FLAG_IN_CAPS); + /* mark as a delta unit, so downstream will not try to synchronize on that + * buffer - to actually start playback you need a real video keyframe */ + GST_BUFFER_FLAG_SET (video_codec_data, GST_BUFFER_FLAG_DELTA_UNIT); + } + if (audio_codec_data != NULL) { + GST_BUFFER_FLAG_SET (audio_codec_data, GST_BUFFER_FLAG_IN_CAPS); + } + + /* put buffers in streamheader */ + g_value_init (&streamheader, GST_TYPE_ARRAY); + gst_flv_mux_put_buffer_in_streamheader (&streamheader, header); + gst_flv_mux_put_buffer_in_streamheader (&streamheader, metadata); + if (video_codec_data != NULL) + gst_flv_mux_put_buffer_in_streamheader (&streamheader, video_codec_data); + if (audio_codec_data != NULL) + gst_flv_mux_put_buffer_in_streamheader (&streamheader, audio_codec_data); + + /* create the caps and put the streamheader in them */ + caps = gst_caps_new_simple ("video/x-flv", NULL); + caps = gst_caps_make_writable (caps); + structure = gst_caps_get_structure (caps, 0); + gst_structure_set_value (structure, "streamheader", &streamheader); + g_value_unset (&streamheader); + + if (GST_PAD_CAPS (mux->srcpad) == NULL) + gst_pad_set_caps (mux->srcpad, caps); + + gst_caps_unref (caps); + + /* push the header buffer, the metadata and the codec info, if any */ + ret = gst_flv_mux_push (mux, header); + if (ret != GST_FLOW_OK) + return ret; + ret = gst_flv_mux_push (mux, metadata); + if (ret != GST_FLOW_OK) + return ret; + if (video_codec_data != NULL) { + ret = gst_flv_mux_push (mux, video_codec_data); + if (ret != GST_FLOW_OK) + return ret; + } + if (audio_codec_data != NULL) { + ret = gst_flv_mux_push (mux, audio_codec_data); + if (ret != GST_FLOW_OK) + return ret; + } + return GST_FLOW_OK; +} + +static void +gst_flv_mux_update_index (GstFlvMux * mux, GstBuffer * buffer, GstFlvPad * cpad) +{ + /* + * Add the tag byte offset and to the index if it's a valid seek point, which + * means it's either a video keyframe or if there is no video pad (in that + * case every FLV tag is a valid seek point) + */ + if (mux->have_video && + (!cpad->video || + GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT))) + return; + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) { + GstFlvMuxIndexEntry *entry = g_slice_new (GstFlvMuxIndexEntry); + entry->position = mux->byte_count; + entry->time = + gst_guint64_to_gdouble (GST_BUFFER_TIMESTAMP (buffer)) / GST_SECOND; + mux->index = g_list_prepend (mux->index, entry); + } +} + +static GstFlowReturn +gst_flv_mux_write_buffer (GstFlvMux * mux, GstFlvPad * cpad) +{ + GstBuffer *tag; + GstBuffer *buffer = + gst_collect_pads_pop (mux->collect, (GstCollectData *) cpad); + GstFlowReturn ret; + + /* arrange downstream running time */ + buffer = gst_buffer_make_metadata_writable (buffer); + GST_BUFFER_TIMESTAMP (buffer) = + gst_segment_to_running_time (&cpad->collect.segment, + GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buffer)); + + if (!mux->streamable) + gst_flv_mux_update_index (mux, buffer, cpad); + + tag = gst_flv_mux_buffer_to_tag (mux, buffer, cpad); + + gst_buffer_unref (buffer); + + ret = gst_flv_mux_push (mux, tag); + + if (ret == GST_FLOW_OK && GST_BUFFER_TIMESTAMP_IS_VALID (tag)) + cpad->last_timestamp = GST_BUFFER_TIMESTAMP (tag); + + return ret; +} + +static guint64 +gst_flv_mux_determine_duration (GstFlvMux * mux) +{ + GSList *l; + GstClockTime duration = GST_CLOCK_TIME_NONE; + + GST_DEBUG_OBJECT (mux, "trying to determine the duration " + "from pad timestamps"); + + for (l = mux->collect->data; l != NULL; l = l->next) { + GstFlvPad *cpad = l->data; + + if (cpad && (cpad->last_timestamp != GST_CLOCK_TIME_NONE)) { + if (duration == GST_CLOCK_TIME_NONE) + duration = cpad->last_timestamp; + else + duration = MAX (duration, cpad->last_timestamp); + } + } + + return duration; +} + +static GstFlowReturn +gst_flv_mux_rewrite_header (GstFlvMux * mux) +{ + GstBuffer *rewrite, *index, *tmp; + GstEvent *event; + guint8 *data; + gdouble d; + GList *l; + guint32 index_len, allocate_size; + guint32 i, index_skip; + GstClockTime dur; + + if (mux->streamable) + return GST_FLOW_OK; + + /* seek back to the preallocated index space */ + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + 13 + 29, GST_CLOCK_TIME_NONE, 13 + 29); + if (!gst_pad_push_event (mux->srcpad, event)) { + GST_WARNING_OBJECT (mux, "Seek to rewrite header failed"); + return GST_FLOW_OK; + } + + /* determine duration now based on our own timestamping, + * so that it is likely many times better and consistent + * than whatever obtained by some query */ + dur = gst_flv_mux_determine_duration (mux); + if (dur != GST_CLOCK_TIME_NONE) + mux->duration = dur; + + /* rewrite the duration tag */ + d = gst_guint64_to_gdouble (mux->duration); + d /= (gdouble) GST_SECOND; + + GST_DEBUG_OBJECT (mux, "determined the final duration to be %f", d); + + rewrite = gst_flv_mux_create_number_script_value ("duration", d); + + /* rewrite the filesize tag */ + d = gst_guint64_to_gdouble (mux->byte_count); + + GST_DEBUG_OBJECT (mux, "putting total filesize %f in the metadata", d); + + tmp = gst_flv_mux_create_number_script_value ("filesize", d); + rewrite = gst_buffer_join (rewrite, tmp); + + if (!mux->index) { + /* no index, so push buffer and return */ + return gst_flv_mux_push (mux, rewrite); + } + + /* rewrite the index */ + mux->index = g_list_reverse (mux->index); + index_len = g_list_length (mux->index); + + /* We write at most MAX_INDEX_ENTRIES elements */ + if (index_len > MAX_INDEX_ENTRIES) { + index_skip = 1 + index_len / MAX_INDEX_ENTRIES; + index_len = (index_len + index_skip - 1) / index_skip; + } else { + index_skip = 1; + } + + GST_DEBUG_OBJECT (mux, "Index length is %d", index_len); + /* see size calculation in gst_flv_mux_preallocate_index */ + allocate_size = 11 + 8 + 22 + 10 + index_len * 18; + GST_DEBUG_OBJECT (mux, "Allocating %d bytes for index", allocate_size); + index = gst_buffer_new_and_alloc (allocate_size); + data = GST_BUFFER_DATA (index); + + GST_WRITE_UINT16_BE (data, 9); /* the 'keyframes' key */ + memcpy (data + 2, "keyframes", 9); + GST_WRITE_UINT8 (data + 11, 8); /* nested ECMA array */ + GST_WRITE_UINT32_BE (data + 12, 2); /* two elements */ + GST_WRITE_UINT16_BE (data + 16, 5); /* first string key: 'times' */ + memcpy (data + 18, "times", 5); + GST_WRITE_UINT8 (data + 23, 10); /* strict array */ + GST_WRITE_UINT32_BE (data + 24, index_len); + data += 28; + + /* the keyframes' times */ + for (i = 0, l = mux->index; l; l = l->next, i++) { + GstFlvMuxIndexEntry *entry = l->data; + + if (i % index_skip != 0) + continue; + GST_WRITE_UINT8 (data, 0); /* numeric (aka double) */ + GST_WRITE_DOUBLE_BE (data + 1, entry->time); + data += 9; + } + + GST_WRITE_UINT16_BE (data, 13); /* second string key: 'filepositions' */ + memcpy (data + 2, "filepositions", 13); + GST_WRITE_UINT8 (data + 15, 10); /* strict array */ + GST_WRITE_UINT32_BE (data + 16, index_len); + data += 20; + + /* the keyframes' file positions */ + for (i = 0, l = mux->index; l; l = l->next, i++) { + GstFlvMuxIndexEntry *entry = l->data; + + if (i % index_skip != 0) + continue; + GST_WRITE_UINT8 (data, 0); + GST_WRITE_DOUBLE_BE (data + 1, entry->position); + data += 9; + } + + GST_WRITE_UINT24_BE (data, 9); /* finish the ECMA array */ + + /* If there is space left in the prefilled area, reinsert the filler. + There is at least 18 bytes free, so it will always fit. */ + if (index_len < MAX_INDEX_ENTRIES) { + GstBuffer *tmp; + guint8 *data; + guint32 remaining_filler_size; + + tmp = gst_buffer_new_and_alloc (14); + data = GST_BUFFER_DATA (tmp); + GST_WRITE_UINT16_BE (data, 9); + memcpy (data + 2, "gstfiller", 9); + GST_WRITE_UINT8 (data + 11, 2); /* string */ + + /* There is 18 bytes per remaining index entry minus what is used for + * the'gstfiller' key. The rest is already filled with spaces, so just need + * to update length. */ + remaining_filler_size = (MAX_INDEX_ENTRIES - index_len) * 18 - 14; + GST_DEBUG_OBJECT (mux, "Remaining filler size is %d bytes", + remaining_filler_size); + GST_WRITE_UINT16_BE (data + 12, remaining_filler_size); + index = gst_buffer_join (index, tmp); + } + + rewrite = gst_buffer_join (rewrite, index); + + gst_buffer_set_caps (rewrite, GST_PAD_CAPS (mux->srcpad)); + return gst_flv_mux_push (mux, rewrite); +} + +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; + } + + if (mux->new_tags) { + GstBuffer *buf = gst_flv_mux_create_metadata (mux, FALSE); + if (buf) + gst_flv_mux_push (mux, buf); + mux->new_tags = FALSE; + } + + + 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; + } + + time = gst_segment_to_running_time (&cpad->collect.segment, + GST_FORMAT_TIME, time); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { + GST_DEBUG_OBJECT (mux, "clipping buffer on pad %s outside segment", + GST_PAD_NAME (cpad->collect.pad)); + buffer = gst_collect_pads_pop (pads, (GstCollectData *) cpad); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } + + if (best == NULL || (GST_CLOCK_TIME_IS_VALID (best_time) + && time < best_time)) { + best = cpad; + best_time = time; + } + } + + /* The FLV timestamp is an int32 field. For non-live streams error out if a + bigger timestamp is seen, for live the timestamp will get wrapped in + gst_flv_mux_buffer_to_tag */ + if (!mux->streamable && GST_CLOCK_TIME_IS_VALID (best_time) + && best_time / GST_MSECOND > G_MAXINT32) { + 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_flv_mux_rewrite_header (mux); + gst_pad_push_event (mux->srcpad, gst_event_new_eos ()); + return GST_FLOW_UNEXPECTED; + } else { + return GST_FLOW_OK; + } +} + +static void +gst_flv_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstFlvMux *mux = GST_FLV_MUX (object); + + switch (prop_id) { + case PROP_STREAMABLE: + g_value_set_boolean (value, mux->streamable); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_flv_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstFlvMux *mux = GST_FLV_MUX (object); + + switch (prop_id) { + case PROP_STREAMABLE: + mux->streamable = g_value_get_boolean (value); + if (mux->streamable) + gst_tag_setter_set_tag_merge_mode (GST_TAG_SETTER (mux), + GST_TAG_MERGE_REPLACE); + else + gst_tag_setter_set_tag_merge_mode (GST_TAG_SETTER (mux), + GST_TAG_MERGE_KEEP); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +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 new file mode 100644 index 0000000..fff51b9 --- /dev/null +++ b/gst/flv/gstflvmux.h @@ -0,0 +1,93 @@ +/* GStreamer + * + * Copyright (c) 2008 Sebastian Dröge + * + * 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 +#include + +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; + + 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; + + /* */ + GstPadEventFunction collect_event; + + GstFlvMuxState state; + gboolean have_audio; + gboolean have_video; + gboolean streamable; + + GstTagList *tags; + gboolean new_tags; + GList *index; + guint64 byte_count; + guint64 duration; +} 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/flx/Makefile.am b/gst/flx/Makefile.am new file mode 100644 index 0000000..01d8bd8 --- /dev/null +++ b/gst/flx/Makefile.am @@ -0,0 +1,24 @@ +plugin_LTLIBRARIES = libgstflxdec.la + +libgstflxdec_la_SOURCES = gstflxdec.c flx_color.c +libgstflxdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstflxdec_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) +libgstflxdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstflxdec_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = flx_fmt.h flx_color.h gstflxdec.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstflxdec -:SHARED libgstflxdec \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstflxdec_la_SOURCES) \ + $(nodist_libgstflxdec_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstflxdec_la_CFLAGS) \ + -:LDFLAGS $(libgstflxdec_la_LDFLAGS) \ + $(libgstflxdec_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/flx/Makefile.in b/gst/flx/Makefile.in new file mode 100644 index 0000000..3197a98 --- /dev/null +++ b/gst/flx/Makefile.in @@ -0,0 +1,829 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/flx +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstflxdec_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstflxdec_la_OBJECTS = libgstflxdec_la-gstflxdec.lo \ + libgstflxdec_la-flx_color.lo +libgstflxdec_la_OBJECTS = $(am_libgstflxdec_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstflxdec_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstflxdec_la_CFLAGS) $(CFLAGS) \ + $(libgstflxdec_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstflxdec_la_SOURCES) +DIST_SOURCES = $(libgstflxdec_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstflxdec.la +libgstflxdec_la_SOURCES = gstflxdec.c flx_color.c +libgstflxdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstflxdec_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) +libgstflxdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstflxdec_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = flx_fmt.h flx_color.h gstflxdec.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/flx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/flx/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstflxdec.la: $(libgstflxdec_la_OBJECTS) $(libgstflxdec_la_DEPENDENCIES) $(EXTRA_libgstflxdec_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstflxdec_la_LINK) -rpath $(plugindir) $(libgstflxdec_la_OBJECTS) $(libgstflxdec_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflxdec_la-flx_color.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflxdec_la-gstflxdec.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstflxdec_la-gstflxdec.lo: gstflxdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflxdec_la_CFLAGS) $(CFLAGS) -MT libgstflxdec_la-gstflxdec.lo -MD -MP -MF $(DEPDIR)/libgstflxdec_la-gstflxdec.Tpo -c -o libgstflxdec_la-gstflxdec.lo `test -f 'gstflxdec.c' || echo '$(srcdir)/'`gstflxdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflxdec_la-gstflxdec.Tpo $(DEPDIR)/libgstflxdec_la-gstflxdec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflxdec.c' object='libgstflxdec_la-gstflxdec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflxdec_la_CFLAGS) $(CFLAGS) -c -o libgstflxdec_la-gstflxdec.lo `test -f 'gstflxdec.c' || echo '$(srcdir)/'`gstflxdec.c + +libgstflxdec_la-flx_color.lo: flx_color.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflxdec_la_CFLAGS) $(CFLAGS) -MT libgstflxdec_la-flx_color.lo -MD -MP -MF $(DEPDIR)/libgstflxdec_la-flx_color.Tpo -c -o libgstflxdec_la-flx_color.lo `test -f 'flx_color.c' || echo '$(srcdir)/'`flx_color.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflxdec_la-flx_color.Tpo $(DEPDIR)/libgstflxdec_la-flx_color.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='flx_color.c' object='libgstflxdec_la-flx_color.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflxdec_la_CFLAGS) $(CFLAGS) -c -o libgstflxdec_la-flx_color.lo `test -f 'flx_color.c' || echo '$(srcdir)/'`flx_color.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstflxdec -:SHARED libgstflxdec \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstflxdec_la_SOURCES) \ + $(nodist_libgstflxdec_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstflxdec_la_CFLAGS) \ + -:LDFLAGS $(libgstflxdec_la_LDFLAGS) \ + $(libgstflxdec_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/flx/flx_color.c b/gst/flx/flx_color.c new file mode 100644 index 0000000..854010a --- /dev/null +++ b/gst/flx/flx_color.c @@ -0,0 +1,118 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 +#include + +#include "flx_color.h" + +FlxColorSpaceConverter * +flx_colorspace_converter_new (gint width, gint height) +{ + FlxColorSpaceConverter *new = g_malloc (sizeof (FlxColorSpaceConverter)); + + new->width = width; + new->height = height; + + memset (new->palvec, 0, sizeof (new->palvec)); + return new; +} + +void +flx_colorspace_converter_destroy (FlxColorSpaceConverter * flxpal) +{ + g_return_if_fail (flxpal != NULL); + + g_free (flxpal); +} + +void +flx_colorspace_convert (FlxColorSpaceConverter * flxpal, guchar * src, + guchar * dest) +{ + guint size, col; + + g_return_if_fail (flxpal != NULL); + g_return_if_fail (src != dest); + + + size = flxpal->width * flxpal->height; + + while (size--) { + col = (*src++ * 3); + +#if G_BYTE_ORDER == G_BIG_ENDIAN + *dest++ = 0; + *dest++ = flxpal->palvec[col]; + *dest++ = flxpal->palvec[col + 1]; + *dest++ = flxpal->palvec[col + 2]; +#else + *dest++ = flxpal->palvec[col + 2]; + *dest++ = flxpal->palvec[col + 1]; + *dest++ = flxpal->palvec[col]; + *dest++ = 0; +#endif + } + +} + + +void +flx_set_palette_vector (FlxColorSpaceConverter * flxpal, guint start, guint num, + guchar * newpal, gint scale) +{ + guint grab; + + g_return_if_fail (flxpal != NULL); + g_return_if_fail (start < 0x100); + + grab = ((start + num) > 0x100 ? 0x100 - start : num); + + if (scale) { + gint i = 0; + + start *= 3; + while (grab) { + flxpal->palvec[start++] = newpal[i++] << scale; + flxpal->palvec[start++] = newpal[i++] << scale; + flxpal->palvec[start++] = newpal[i++] << scale; + grab--; + } + } else { + memcpy (&flxpal->palvec[start * 3], newpal, grab * 3); + } + +} + +void +flx_set_color (FlxColorSpaceConverter * flxpal, guint colr, guint red, + guint green, guint blue, gint scale) +{ + + g_return_if_fail (flxpal != NULL); + g_return_if_fail (colr < 0x100); + + flxpal->palvec[(colr * 3)] = red << scale; + flxpal->palvec[(colr * 3) + 1] = green << scale; + flxpal->palvec[(colr * 3) + 2] = blue << scale; +} diff --git a/gst/flx/flx_color.h b/gst/flx/flx_color.h new file mode 100644 index 0000000..80378e1 --- /dev/null +++ b/gst/flx/flx_color.h @@ -0,0 +1,52 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 __FLX_COLOR_H__ +#define __FLX_COLOR_H__ + +#include + +G_BEGIN_DECLS + +typedef enum { + FLX_COLORSPACE_RGB8, + FLX_COLORSPACE_RGB32, +} FlxColorSpaceType; + + +typedef struct _FlxColorSpaceConverter FlxColorSpaceConverter; + +struct _FlxColorSpaceConverter { + guint width; + guint height; + guchar palvec[768]; +}; + +void flx_colorspace_converter_destroy(FlxColorSpaceConverter *flxpal); +void flx_colorspace_convert(FlxColorSpaceConverter *flxpal, guchar *src, guchar *dest); +FlxColorSpaceConverter * flx_colorspace_converter_new(gint width, gint height); + +void flx_set_palette_vector(FlxColorSpaceConverter *flxpal, guint start, guint num, + guchar *newpal, gint scale); +void flx_set_color(FlxColorSpaceConverter *flxpal, guint colr, guint red, guint green, + guint blue, gint scale); + +G_END_DECLS + +#endif /* __FLX_COLOR_H__ */ diff --git a/gst/flx/flx_fmt.h b/gst/flx/flx_fmt.h new file mode 100644 index 0000000..ae0e268 --- /dev/null +++ b/gst/flx/flx_fmt.h @@ -0,0 +1,200 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_FLX_FMT__H__ +#define __GST_FLX_FMT_H__ + +#include + +G_BEGIN_DECLS + +enum Flx_TypeChunk +{ + /* frame chunks */ + FLX_PREFIX_TYPE = 0xf100, + FLX_SCRIPT_CHUNK = 0xf1e0, + FLX_FRAME_TYPE = 0xf1fa, + FLX_SEGMENT_TABLE = 0xf1fb, + FLX_HUFFMAN_TABLE = 0xf1fc, + + /* sub chunks */ + FLX_CEL_DATA = 3, + FLX_COLOR256 = 4, + FLX_SS2 = 7, + FLX_COLOR64 = 11, + FLX_LC = 12, + FLX_BLACK = 13, + FLX_BRUN = 15, + FLX_COPY = 16, + FLX_MINI = 18, + FLX_DTA_RUN = 25, + FLX_DTA_COPY = 26, + FLX_DTA_LC = 27, + FLX_LABEL = 31, + FLX_BMP_MASK = 32, + FLX_MLEV_MASK = 33, + FLX_SEGMENT = 34, + FLX_KEY_IMAGE = 35, + FLX_KEY_PAL = 36, + FLX_REGION = 37, + FLX_WAVE = 38, + FLX_USERSTRING = 39, + FLX_RGN_MASK = 40 + +}; + +enum Flx_MagicHdr +{ + FLX_MAGICHDR_FLI = 0xaf11, + FLX_MAGICHDR_FLC = 0xaf12, + FLX_MAGICHDR_FLX = 0xaf44, + FLX_MAGICHDR_HUFFBWT = 0xaf30 +}; + +typedef struct _FlxHeader +{ + guint32 size; + guint16 type; + guint16 frames; + guint16 width,height,depth,flags; + guint32 speed; + guint16 reserved1; + /* FLC */ + guint32 created,creator,updated,updater; + guint16 aspect_dx, aspect_dy; + /* EGI */ + guint16 ext_flags,keyframes,totalframes; + guint32 req_memory; + guint16 max_regions,transp_num; + guchar reserved2[24]; + /* FLC */ + guint32 oframe1,oframe2; + guchar reserved3[40]; +} FlxHeader; +#define FlxHeaderSize 128 + +typedef struct _FlxFrameChunk +{ + guint32 size; + guint16 id; +} FlxFrameChunk; +#define FlxFrameChunkSize 6 + +typedef struct _FlxPrefixChunk +{ + guint16 chunks; + guchar reserved[8]; +} FlxPrefixChunk; + +typedef struct _FlxSegmentTable +{ + guint16 segments; +} FlxSegmentTable; + +typedef struct _FlxHuffmanTable +{ + guint16 codelength; + guint16 numcodes; + guchar reserved[6]; +} FlxHuffmanTable; + +typedef struct _FlxFrameType +{ + guint16 chunks; + guint16 delay; + guchar reserved[6]; +} FlxFrameType; +#define FlxFrameTypeSize 10 + +#if G_BYTE_ORDER == G_BIG_ENDIAN +#define LE_TO_BE_16(i16) ((guint16) (((i16) << 8) | ((i16) >> 8))) +#define LE_TO_BE_32(i32) \ + (((guint32) (LE_TO_BE_16((guint16) (i32))) << 16) | (LE_TO_BE_16((i32) >> 16))) + +#define FLX_FRAME_TYPE_FIX_ENDIANNESS(frm_type_p) \ + do { \ + (frm_type_p)->chunks = LE_TO_BE_16((frm_type_p)->chunks); \ + (frm_type_p)->delay = LE_TO_BE_16((frm_type_p)->delay); \ + } while(0) + +#define FLX_HUFFMAN_TABLE_FIX_ENDIANNESS(hffmn_table_p) \ + do { \ + (hffmn_table_p)->codelength = \ + LE_TO_BE_16((hffmn_table_p)->codelength); \ + (hffmn_table_p)->numcodes = LE_TO_BE_16((hffmn_table_p)->numcodes); \ + } while(0) + +#define FLX_SEGMENT_TABLE_FIX_ENDIANNESS(sgmnt_table_p) \ + ((sgmnt_table_p)->segments = LE_TO_BE_16((sgmnt_table_p)->segments)) + +#define FLX_PREFIX_CHUNK_FIX_ENDIANNESS(prfx_chnk_p) \ + do { \ + (prfx_chnk_p)->chunks = LE_TO_BE_16((prfx_chnk_p)->chunks); \ + } while(0) + +#define FLX_FRAME_CHUNK_FIX_ENDIANNESS(frm_chnk_p) \ + do { \ + (frm_chnk_p)->size = LE_TO_BE_32((frm_chnk_p)->size); \ + (frm_chnk_p)->id = LE_TO_BE_16((frm_chnk_p)->id); \ + } while(0) + +#define FLX_HDR_FIX_ENDIANNESS(hdr_p) \ + do { \ + (hdr_p)->size = LE_TO_BE_32((hdr_p)->size); \ + (hdr_p)->type = LE_TO_BE_16((hdr_p)->type); \ + (hdr_p)->frames = LE_TO_BE_16((hdr_p)->frames); \ + (hdr_p)->width = LE_TO_BE_16((hdr_p)->width); \ + (hdr_p)->height = LE_TO_BE_16((hdr_p)->height); \ + (hdr_p)->depth = LE_TO_BE_16((hdr_p)->depth); \ + (hdr_p)->flags = LE_TO_BE_16((hdr_p)->flags); \ + (hdr_p)->speed = LE_TO_BE_32((hdr_p)->speed); \ + (hdr_p)->reserved1 = LE_TO_BE_16((hdr_p)->reserved1); \ + (hdr_p)->created = LE_TO_BE_32((hdr_p)->created); \ + (hdr_p)->creator = LE_TO_BE_32((hdr_p)->creator); \ + (hdr_p)->updated = LE_TO_BE_32((hdr_p)->updated); \ + (hdr_p)->updater = LE_TO_BE_32((hdr_p)->updater); \ + (hdr_p)->aspect_dx = LE_TO_BE_16((hdr_p)->aspect_dx); \ + (hdr_p)->aspect_dy = LE_TO_BE_16((hdr_p)->aspect_dy); \ + (hdr_p)->ext_flags = LE_TO_BE_16((hdr_p)->ext_flags); \ + (hdr_p)->keyframes = LE_TO_BE_16((hdr_p)->keyframes); \ + (hdr_p)->totalframes = LE_TO_BE_16((hdr_p)->totalframes); \ + (hdr_p)->req_memory = LE_TO_BE_32((hdr_p)->req_memory); \ + (hdr_p)->max_regions = LE_TO_BE_16((hdr_p)->max_regions); \ + (hdr_p)->transp_num = LE_TO_BE_16((hdr_p)->transp_num); \ + (hdr_p)->oframe1 = LE_TO_BE_32((hdr_p)->oframe1); \ + (hdr_p)->oframe2 = LE_TO_BE_32((hdr_p)->oframe2); \ + } while(0) +#else + +#define LE_TO_BE_16(i16) ((i16)) +#define LE_TO_BE_32(i32) ((i32)) + +#define FLX_FRAME_TYPE_FIX_ENDIANNESS(frm_type_p) +#define FLX_HUFFMAN_TABLE_FIX_ENDIANNESS(hffmn_table_p) +#define FLX_SEGMENT_TABLE_FIX_ENDIANNESS(sgmnt_table_p) +#define FLX_PREFIX_CHUNK_FIX_ENDIANNESS(prfx_chnk_p) +#define FLX_FRAME_CHUNK_FIX_ENDIANNESS(frm_chnk_p) +#define FLX_HDR_FIX_ENDIANNESS(hdr_p) + +#endif /* G_BYTE_ORDER == G_BIG_ENDIAN */ + +G_END_DECLS + +#endif /* __GST_FLX_FMT_H__ */ diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c new file mode 100644 index 0000000..5017684 --- /dev/null +++ b/gst/flx/gstflxdec.c @@ -0,0 +1,690 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-flxdec + * + * This element decodes fli/flc/flx-video into raw video + */ +/* + * http://www.coolutils.com/Formats/FLI + * http://woodshole.er.usgs.gov/operations/modeling/flc.html + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include "flx_fmt.h" +#include "gstflxdec.h" +#include + +#define JIFFIE (GST_SECOND/70) + +GST_DEBUG_CATEGORY_STATIC (flxdec_debug); +#define GST_CAT_DEFAULT flxdec_debug + +/* input */ +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-fli") + ); + +/* output */ +static GstStaticPadTemplate src_video_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) + ); + + +static void gst_flxdec_class_init (GstFlxDecClass * klass); +static void gst_flxdec_base_init (GstFlxDecClass * klass); +static void gst_flxdec_init (GstFlxDec * flxdec); +static void gst_flxdec_dispose (GstFlxDec * flxdec); + +static GstFlowReturn gst_flxdec_chain (GstPad * pad, GstBuffer * buf); + +static GstStateChangeReturn gst_flxdec_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_flxdec_src_query_handler (GstPad * pad, GstQuery * query); +static gboolean gst_flxdec_src_event_handler (GstPad * pad, GstEvent * event); +static gboolean gst_flxdec_sink_event_handler (GstPad * pad, GstEvent * event); + +static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint); +static void flx_decode_brun (GstFlxDec *, guchar *, guchar *); +static void flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); +static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); + +#define rndalign(off) ((off) + ((off) & 1)) + +static GstElementClass *parent_class = NULL; + +GType +gst_flxdec_get_type (void) +{ + static GType flxdec_type = 0; + + if (!flxdec_type) { + static const GTypeInfo flxdec_info = { + sizeof (GstFlxDecClass), + (GBaseInitFunc) gst_flxdec_base_init, + NULL, + (GClassInitFunc) gst_flxdec_class_init, + NULL, + NULL, + sizeof (GstFlxDec), + 0, + (GInstanceInitFunc) gst_flxdec_init, + }; + + flxdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstFlxDec", &flxdec_info, 0); + } + return flxdec_type; +} + +static void +gst_flxdec_base_init (GstFlxDecClass * klass) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (gstelement_class, "FLX video decoder", + "Codec/Decoder/Video", + "FLC/FLI/FLX video decoder", + "Sepp Wijnands , Zeeshan Ali "); + gst_element_class_add_static_pad_template (gstelement_class, + &sink_factory); + gst_element_class_add_static_pad_template (gstelement_class, + &src_video_factory); +} + +static void +gst_flxdec_class_init (GstFlxDecClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->dispose = (GObjectFinalizeFunc) gst_flxdec_dispose; + + GST_DEBUG_CATEGORY_INIT (flxdec_debug, "flxdec", 0, "FLX video decoder"); + + gstelement_class->change_state = gst_flxdec_change_state; +} + +static void +gst_flxdec_init (GstFlxDec * flxdec) +{ + flxdec->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); + gst_element_add_pad (GST_ELEMENT (flxdec), flxdec->sinkpad); + gst_pad_set_chain_function (flxdec->sinkpad, gst_flxdec_chain); + gst_pad_set_event_function (flxdec->sinkpad, gst_flxdec_sink_event_handler); + + flxdec->srcpad = gst_pad_new_from_static_template (&src_video_factory, "src"); + gst_element_add_pad (GST_ELEMENT (flxdec), flxdec->srcpad); + gst_pad_set_query_function (flxdec->srcpad, gst_flxdec_src_query_handler); + gst_pad_set_event_function (flxdec->srcpad, gst_flxdec_src_event_handler); + + gst_pad_use_fixed_caps (flxdec->srcpad); + + flxdec->frame = NULL; + flxdec->delta = NULL; + + flxdec->adapter = gst_adapter_new (); +} + +static void +gst_flxdec_dispose (GstFlxDec * flxdec) +{ + if (flxdec->adapter) { + g_object_unref (flxdec->adapter); + flxdec->adapter = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose ((GObject *) flxdec); +} + +static gboolean +gst_flxdec_src_query_handler (GstPad * pad, GstQuery * query) +{ + GstFlxDec *flxdec = (GstFlxDec *) gst_pad_get_parent (pad); + gboolean ret = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_DURATION: + { + GstFormat format; + + gst_query_parse_duration (query, &format, NULL); + + if (format != GST_FORMAT_TIME) + goto done; + + gst_query_set_duration (query, format, flxdec->duration); + + ret = TRUE; + } + default: + break; + } +done: + gst_object_unref (flxdec); + + return ret; +} + +static gboolean +gst_flxdec_src_event_handler (GstPad * pad, GstEvent * event) +{ + GstFlxDec *flxdec = (GstFlxDec *) gst_pad_get_parent (pad); + gboolean ret; + + /* TODO: implement the seek and other event handling */ + + ret = gst_pad_push_event (flxdec->sinkpad, event); + + gst_object_unref (flxdec); + + return ret; +} + +static gboolean +gst_flxdec_sink_event_handler (GstPad * pad, GstEvent * event) +{ + GstFlxDec *flxdec; + gboolean ret; + + flxdec = GST_FLXDEC (gst_pad_get_parent (pad)); + + ret = gst_pad_push_event (flxdec->srcpad, event); + + gst_object_unref (flxdec); + return ret; +} + +static void +flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data, + guchar * dest) +{ + FlxFrameChunk *hdr; + + g_return_if_fail (data != NULL); + + while (count--) { + hdr = (FlxFrameChunk *) data; + FLX_FRAME_CHUNK_FIX_ENDIANNESS (hdr); + data += FlxFrameChunkSize; + + switch (hdr->id) { + case FLX_COLOR64: + flx_decode_color (flxdec, data, dest, 2); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; + + case FLX_COLOR256: + flx_decode_color (flxdec, data, dest, 0); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; + + case FLX_BRUN: + flx_decode_brun (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; + + case FLX_LC: + flx_decode_delta_fli (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; + + case FLX_SS2: + flx_decode_delta_flc (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; + + case FLX_BLACK: + memset (dest, 0, flxdec->size); + break; + + case FLX_MINI: + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; + + default: + GST_WARNING ("Unimplented chunk type: 0x%02x size: %d - skipping", + hdr->id, hdr->size); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; + } + } +} + + +static void +flx_decode_color (GstFlxDec * flxdec, guchar * data, guchar * dest, gint scale) +{ + guint packs, count, indx; + + g_return_if_fail (flxdec != NULL); + + packs = (data[0] + (data[1] << 8)); + + data += 2; + indx = 0; + + GST_LOG ("GstFlxDec: cmap packs: %d", packs); + while (packs--) { + /* color map index + skip count */ + indx += *data++; + + /* number of rgb triplets */ + count = *data++ & 0xff; + if (count == 0) + count = 256; + + GST_LOG ("GstFlxDec: cmap count: %d (indx: %d)", count, indx); + flx_set_palette_vector (flxdec->converter, indx, count, data, scale); + + data += (count * 3); + } +} + +static void +flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) +{ + gulong count, lines, row; + guchar x; + + g_return_if_fail (flxdec != NULL); + + lines = flxdec->hdr.height; + while (lines--) { + /* packet count. + * should not be used anymore, since the flc format can + * contain more then 255 RLE packets. we use the frame + * width instead. + */ + data++; + + row = flxdec->hdr.width; + while (row) { + count = *data++; + + if (count > 0x7f) { + /* literal run */ + count = 0x100 - count; + row -= count; + + while (count--) + *dest++ = *data++; + + } else { + /* replicate run */ + row -= count; + x = *data++; + + while (count--) + *dest++ = x; + } + } + } +} + +static void +flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) +{ + gulong count, packets, lines, start_line; + guchar *start_p, x; + + g_return_if_fail (flxdec != NULL); + g_return_if_fail (flxdec->delta != NULL); + + /* use last frame for delta */ + memcpy (dest, GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_SIZE (flxdec->delta)); + + start_line = (data[0] + (data[1] << 8)); + lines = (data[2] + (data[3] << 8)); + data += 4; + + /* start position of delta */ + dest += (flxdec->hdr.width * start_line); + start_p = dest; + + while (lines--) { + /* packet count */ + packets = *data++; + + while (packets--) { + /* skip count */ + dest += *data++; + + /* RLE count */ + count = *data++; + + if (count > 0x7f) { + /* literal run */ + count = 0x100 - count; + x = *data++; + + while (count--) + *dest++ = x; + + } else { + /* replicate run */ + while (count--) + *dest++ = *data++; + } + } + start_p += flxdec->hdr.width; + dest = start_p; + } +} + +static void +flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) +{ + gulong count, lines, start_l, opcode; + guchar *start_p; + + g_return_if_fail (flxdec != NULL); + g_return_if_fail (flxdec->delta != NULL); + + /* use last frame for delta */ + memcpy (dest, GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_SIZE (flxdec->delta)); + + lines = (data[0] + (data[1] << 8)); + data += 2; + + start_p = dest; + start_l = lines; + + while (lines) { + dest = start_p + (flxdec->hdr.width * (start_l - lines)); + + /* process opcode(s) */ + while ((opcode = (data[0] + (data[1] << 8))) & 0xc000) { + data += 2; + if ((opcode & 0xc000) == 0xc000) { + /* skip count */ + start_l += (0x10000 - opcode); + dest += flxdec->hdr.width * (0x10000 - opcode); + } else { + /* last pixel */ + dest += flxdec->hdr.width; + *dest++ = (opcode & 0xff); + } + } + data += 2; + + /* last opcode is the packet count */ + while (opcode--) { + /* skip count */ + dest += *data++; + + /* RLE count */ + count = *data++; + + if (count > 0x7f) { + /* replicate word run */ + count = 0x100 - count; + while (count--) { + *dest++ = data[0]; + *dest++ = data[1]; + } + data += 2; + } else { + /* literal word run */ + while (count--) { + *dest++ = *data++; + *dest++ = *data++; + } + } + } + lines--; + } +} + +static GstFlowReturn +gst_flxdec_chain (GstPad * pad, GstBuffer * buf) +{ + GstCaps *caps; + guint avail; + GstFlowReturn res = GST_FLOW_OK; + + GstFlxDec *flxdec; + FlxHeader *flxh; + + g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); + flxdec = (GstFlxDec *) gst_pad_get_parent (pad); + g_return_val_if_fail (flxdec != NULL, GST_FLOW_ERROR); + + gst_adapter_push (flxdec->adapter, buf); + avail = gst_adapter_available (flxdec->adapter); + + if (flxdec->state == GST_FLXDEC_READ_HEADER) { + if (avail >= FlxHeaderSize) { + const guint8 *data = gst_adapter_peek (flxdec->adapter, FlxHeaderSize); + + memcpy ((gchar *) & flxdec->hdr, data, FlxHeaderSize); + FLX_HDR_FIX_ENDIANNESS (&(flxdec->hdr)); + gst_adapter_flush (flxdec->adapter, FlxHeaderSize); + + flxh = &flxdec->hdr; + + /* check header */ + if (flxh->type != FLX_MAGICHDR_FLI && + flxh->type != FLX_MAGICHDR_FLC && flxh->type != FLX_MAGICHDR_FLX) + goto wrong_type; + + GST_LOG ("size : %d", flxh->size); + GST_LOG ("frames : %d", flxh->frames); + GST_LOG ("width : %d", flxh->width); + GST_LOG ("height : %d", flxh->height); + GST_LOG ("depth : %d", flxh->depth); + GST_LOG ("speed : %d", flxh->speed); + + flxdec->next_time = 0; + + if (flxh->type == FLX_MAGICHDR_FLI) { + flxdec->frame_time = JIFFIE * flxh->speed; + } else if (flxh->speed == 0) { + flxdec->frame_time = GST_SECOND / 70; + } else { + flxdec->frame_time = flxh->speed * GST_MSECOND; + } + + flxdec->duration = flxh->frames * flxdec->frame_time; + GST_LOG ("duration : %" GST_TIME_FORMAT, + GST_TIME_ARGS (flxdec->duration)); + + caps = gst_caps_from_string (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN); + gst_caps_set_simple (caps, + "width", G_TYPE_INT, flxh->width, + "height", G_TYPE_INT, flxh->height, + "framerate", GST_TYPE_FRACTION, (gint) GST_MSECOND, + (gint) flxdec->frame_time / 1000, NULL); + + gst_pad_set_caps (flxdec->srcpad, caps); + gst_caps_unref (caps); + + if (flxh->depth <= 8) + flxdec->converter = + flx_colorspace_converter_new (flxh->width, flxh->height); + + if (flxh->type == FLX_MAGICHDR_FLC || flxh->type == FLX_MAGICHDR_FLX) { + GST_LOG ("(FLC) aspect_dx : %d", flxh->aspect_dx); + GST_LOG ("(FLC) aspect_dy : %d", flxh->aspect_dy); + GST_LOG ("(FLC) oframe1 : 0x%08x", flxh->oframe1); + GST_LOG ("(FLC) oframe2 : 0x%08x", flxh->oframe2); + } + + flxdec->size = (flxh->width * flxh->height); + + /* create delta and output frame */ + flxdec->frame = gst_buffer_new (); + flxdec->delta = gst_buffer_new (); + GST_BUFFER_DATA (flxdec->frame) = g_malloc (flxdec->size); + GST_BUFFER_MALLOCDATA (flxdec->frame) = GST_BUFFER_DATA (flxdec->frame); + GST_BUFFER_SIZE (flxdec->frame) = flxdec->size; + GST_BUFFER_DATA (flxdec->delta) = g_malloc (flxdec->size); + GST_BUFFER_MALLOCDATA (flxdec->delta) = GST_BUFFER_DATA (flxdec->delta); + GST_BUFFER_SIZE (flxdec->delta) = flxdec->size; + + flxdec->state = GST_FLXDEC_PLAYING; + } + } else if (flxdec->state == GST_FLXDEC_PLAYING) { + GstBuffer *out; + + /* while we have enough data in the adapter */ + while (avail >= FlxFrameChunkSize) { + FlxFrameChunk flxfh; + guchar *chunk; + const guint8 *data; + + chunk = NULL; + data = gst_adapter_peek (flxdec->adapter, FlxFrameChunkSize); + memcpy (&flxfh, data, FlxFrameChunkSize); + FLX_FRAME_CHUNK_FIX_ENDIANNESS (&flxfh); + + switch (flxfh.id) { + case FLX_FRAME_TYPE: + /* check if we have the complete frame */ + if (avail < flxfh.size) + goto need_more_data; + + /* flush header */ + gst_adapter_flush (flxdec->adapter, FlxFrameChunkSize); + + chunk = gst_adapter_take (flxdec->adapter, + flxfh.size - FlxFrameChunkSize); + FLX_FRAME_TYPE_FIX_ENDIANNESS ((FlxFrameType *) chunk); + if (((FlxFrameType *) chunk)->chunks == 0) + break; + + /* create 32 bits output frame */ + res = gst_pad_alloc_buffer_and_set_caps (flxdec->srcpad, + GST_BUFFER_OFFSET_NONE, + flxdec->size * 4, GST_PAD_CAPS (flxdec->srcpad), &out); + if (res != GST_FLOW_OK) + break; + + /* decode chunks */ + flx_decode_chunks (flxdec, + ((FlxFrameType *) chunk)->chunks, + chunk + FlxFrameTypeSize, GST_BUFFER_DATA (flxdec->frame)); + + /* save copy of the current frame for possible delta. */ + memcpy (GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_DATA (flxdec->frame), GST_BUFFER_SIZE (flxdec->delta)); + + /* convert current frame. */ + flx_colorspace_convert (flxdec->converter, + GST_BUFFER_DATA (flxdec->frame), GST_BUFFER_DATA (out)); + + GST_BUFFER_TIMESTAMP (out) = flxdec->next_time; + flxdec->next_time += flxdec->frame_time; + + gst_pad_push (flxdec->srcpad, out); + break; + } + + if (chunk) + g_free (chunk); + + avail = gst_adapter_available (flxdec->adapter); + } + } +need_more_data: + gst_object_unref (flxdec); + return res; + + /* ERRORS */ +wrong_type: + { + GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, (NULL), + ("not a flx file (type %x)", flxh->type)); + gst_object_unref (flxdec); + return GST_FLOW_ERROR; + } +} + +static GstStateChangeReturn +gst_flxdec_change_state (GstElement * element, GstStateChange transition) +{ + GstFlxDec *flxdec; + GstStateChangeReturn ret; + + flxdec = GST_FLXDEC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (flxdec->adapter); + flxdec->state = GST_FLXDEC_READ_HEADER; + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + default: + break; + } + + ret = parent_class->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + if (flxdec->frame) { + gst_buffer_unref (flxdec->frame); + flxdec->frame = NULL; + } + if (flxdec->delta) { + gst_buffer_unref (flxdec->delta); + flxdec->delta = NULL; + } + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "flxdec", + GST_RANK_PRIMARY, GST_TYPE_FLXDEC); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "flxdec", + "FLC/FLI/FLX video decoder", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/flx/gstflxdec.h b/gst/flx/gstflxdec.h new file mode 100644 index 0000000..d447c7d --- /dev/null +++ b/gst/flx/gstflxdec.h @@ -0,0 +1,82 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_FLX_DECODER_H__ +#define __GST_FLX_DECODER_H__ + +#include + +#include +#include "flx_color.h" + +G_BEGIN_DECLS + +typedef enum { + GST_FLXDEC_READ_HEADER, + GST_FLXDEC_PLAYING, +} GstFlxDecState; + + +/* Definition of structure storing data for this element. */ +typedef struct _GstFlxDec GstFlxDec; + +struct _GstFlxDec { + GstElement element; + + GstPad *sinkpad,*srcpad; + + gboolean active, new_meta; + + GstBuffer *delta, *frame; + GstAdapter *adapter; + gulong size; + GstFlxDecState state; + gint64 frame_time; + gint64 next_time; + gint64 duration; + + FlxColorSpaceConverter *converter; + + FlxHeader hdr; +}; + +/* Standard definition defining a class for this element. */ +typedef struct _GstFlxDecClass GstFlxDecClass; +struct _GstFlxDecClass { + GstElementClass parent_class; +}; + +/* Standard macros for defining types for this element. */ +#define GST_TYPE_FLXDEC \ + (gst_flxdec_get_type()) +#define GST_FLXDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLXDEC,GstFlxDec)) +#define GST_FLXDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLXDEC,GstFlxDecClass)) +#define GST_IS_FLXDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLXDEC)) +#define GST_IS_FLXDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLXDEC)) + +/* Standard function returning type information. */ +GType gst_flxdec_get_type(void); + +G_END_DECLS + +#endif /* __GST_FLX_DECODER_H__ */ diff --git a/gst/goom/Makefile.am b/gst/goom/Makefile.am new file mode 100644 index 0000000..500f0a8 --- /dev/null +++ b/gst/goom/Makefile.am @@ -0,0 +1,61 @@ + +plugin_LTLIBRARIES = libgstgoom.la + +PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s ppc_drawings.h ppc_zoom_ultimate.h +MMX_FILES=mmx.c xmmx.c mmx.h xmmx.h + +if HAVE_CPU_PPC +# disable until someone figures out how to build these correctly on ppc +#ARCH_FILES = $(PPC_FILES) +ARCH_FILES = +endif +if HAVE_CPU_PPC64 +# disable until someone figures out how to build these correctly on ppc +#ARCH_FILES = $(PPC_FILES) +ARCH_FILES = +endif +if HAVE_CPU_I386 +ARCH_FILES = $(MMX_FILES) +ARCH_CFLAGS = -DBUILD_MMX +endif + +libgstgoom_la_SOURCES = \ + gstgoom.c gstgoom.h \ + drawmethods.c drawmethods.h \ + sound_tester.c sound_tester.h \ + mathtools.c mathtools.h \ + lines.c lines.h ifs.c ifs.h surf3d.c surf3d.h \ + tentacle3d.c tentacle3d.h v3d.c v3d.h \ + convolve_fx.c flying_stars_fx.c \ + goom_fx.h goom_visual_fx.h \ + motif_goom1.h motif_goom2.h \ + plugin_info.c goom_plugin_info.h \ + goom_tools.c \ + config_param.c filters.c goom_core.c graphic.c \ + goom.h goom_typedefs.h goom_graphic.h \ + goom_config_param.h goom_visual_fx.h goom_filters.h \ + goom_tools.h goom_tools.h goom_config.h \ + $(ARCH_FILES) + +libgstgoom_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GOOM_FILTER_CFLAGS) $(ARCH_CFLAGS) $(ORC_CFLAGS) +libgstgoom_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(ORC_LIBS) +libgstgoom_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstgoom_la_LIBTOOLFLAGS = --tag=disable-static + +EXTRA_DIST = $(PPC_FILES) $(MMX_FILES) + +.NOTPARALLEL: + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstgoom -:SHARED libgstgoom \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstgoom_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgoom_la_CFLAGS) \ + -:LDFLAGS $(libgstgoom_la_LDFLAGS) \ + $(libgstgoom_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/goom/Makefile.in b/gst/goom/Makefile.in new file mode 100644 index 0000000..159fa32 --- /dev/null +++ b/gst/goom/Makefile.in @@ -0,0 +1,1012 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/goom +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstgoom_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__libgstgoom_la_SOURCES_DIST = gstgoom.c gstgoom.h drawmethods.c \ + drawmethods.h sound_tester.c sound_tester.h mathtools.c \ + mathtools.h lines.c lines.h ifs.c ifs.h surf3d.c surf3d.h \ + tentacle3d.c tentacle3d.h v3d.c v3d.h convolve_fx.c \ + flying_stars_fx.c goom_fx.h goom_visual_fx.h motif_goom1.h \ + motif_goom2.h plugin_info.c goom_plugin_info.h goom_tools.c \ + config_param.c filters.c goom_core.c graphic.c goom.h \ + goom_typedefs.h goom_graphic.h goom_config_param.h \ + goom_filters.h goom_tools.h goom_config.h mmx.c xmmx.c mmx.h \ + xmmx.h +am__objects_1 = libgstgoom_la-mmx.lo libgstgoom_la-xmmx.lo +@HAVE_CPU_I386_TRUE@am__objects_2 = $(am__objects_1) +am_libgstgoom_la_OBJECTS = libgstgoom_la-gstgoom.lo \ + libgstgoom_la-drawmethods.lo libgstgoom_la-sound_tester.lo \ + libgstgoom_la-mathtools.lo libgstgoom_la-lines.lo \ + libgstgoom_la-ifs.lo libgstgoom_la-surf3d.lo \ + libgstgoom_la-tentacle3d.lo libgstgoom_la-v3d.lo \ + libgstgoom_la-convolve_fx.lo libgstgoom_la-flying_stars_fx.lo \ + libgstgoom_la-plugin_info.lo libgstgoom_la-goom_tools.lo \ + libgstgoom_la-config_param.lo libgstgoom_la-filters.lo \ + libgstgoom_la-goom_core.lo libgstgoom_la-graphic.lo \ + $(am__objects_2) +libgstgoom_la_OBJECTS = $(am_libgstgoom_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstgoom_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstgoom_la_CFLAGS) $(CFLAGS) \ + $(libgstgoom_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstgoom_la_SOURCES) +DIST_SOURCES = $(am__libgstgoom_la_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstgoom.la +PPC_FILES = ppc_zoom_ultimate.s ppc_drawings.s ppc_drawings.h ppc_zoom_ultimate.h +MMX_FILES = mmx.c xmmx.c mmx.h xmmx.h +@HAVE_CPU_I386_TRUE@ARCH_FILES = $(MMX_FILES) +# disable until someone figures out how to build these correctly on ppc +#ARCH_FILES = $(PPC_FILES) +@HAVE_CPU_PPC64_TRUE@ARCH_FILES = + +# disable until someone figures out how to build these correctly on ppc +#ARCH_FILES = $(PPC_FILES) +@HAVE_CPU_PPC_TRUE@ARCH_FILES = +@HAVE_CPU_I386_TRUE@ARCH_CFLAGS = -DBUILD_MMX +libgstgoom_la_SOURCES = \ + gstgoom.c gstgoom.h \ + drawmethods.c drawmethods.h \ + sound_tester.c sound_tester.h \ + mathtools.c mathtools.h \ + lines.c lines.h ifs.c ifs.h surf3d.c surf3d.h \ + tentacle3d.c tentacle3d.h v3d.c v3d.h \ + convolve_fx.c flying_stars_fx.c \ + goom_fx.h goom_visual_fx.h \ + motif_goom1.h motif_goom2.h \ + plugin_info.c goom_plugin_info.h \ + goom_tools.c \ + config_param.c filters.c goom_core.c graphic.c \ + goom.h goom_typedefs.h goom_graphic.h \ + goom_config_param.h goom_visual_fx.h goom_filters.h \ + goom_tools.h goom_tools.h goom_config.h \ + $(ARCH_FILES) + +libgstgoom_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GOOM_FILTER_CFLAGS) $(ARCH_CFLAGS) $(ORC_CFLAGS) +libgstgoom_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(ORC_LIBS) +libgstgoom_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstgoom_la_LIBTOOLFLAGS = --tag=disable-static +EXTRA_DIST = $(PPC_FILES) $(MMX_FILES) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/goom/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/goom/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstgoom.la: $(libgstgoom_la_OBJECTS) $(libgstgoom_la_DEPENDENCIES) $(EXTRA_libgstgoom_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstgoom_la_LINK) -rpath $(plugindir) $(libgstgoom_la_OBJECTS) $(libgstgoom_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-config_param.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-convolve_fx.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-drawmethods.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-filters.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-flying_stars_fx.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-goom_core.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-goom_tools.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-graphic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-gstgoom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-ifs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-lines.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-mathtools.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-mmx.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-plugin_info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-sound_tester.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-surf3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-tentacle3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-v3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-xmmx.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstgoom_la-gstgoom.lo: gstgoom.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-gstgoom.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-gstgoom.Tpo -c -o libgstgoom_la-gstgoom.lo `test -f 'gstgoom.c' || echo '$(srcdir)/'`gstgoom.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-gstgoom.Tpo $(DEPDIR)/libgstgoom_la-gstgoom.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgoom.c' object='libgstgoom_la-gstgoom.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-gstgoom.lo `test -f 'gstgoom.c' || echo '$(srcdir)/'`gstgoom.c + +libgstgoom_la-drawmethods.lo: drawmethods.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-drawmethods.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-drawmethods.Tpo -c -o libgstgoom_la-drawmethods.lo `test -f 'drawmethods.c' || echo '$(srcdir)/'`drawmethods.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-drawmethods.Tpo $(DEPDIR)/libgstgoom_la-drawmethods.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drawmethods.c' object='libgstgoom_la-drawmethods.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-drawmethods.lo `test -f 'drawmethods.c' || echo '$(srcdir)/'`drawmethods.c + +libgstgoom_la-sound_tester.lo: sound_tester.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-sound_tester.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-sound_tester.Tpo -c -o libgstgoom_la-sound_tester.lo `test -f 'sound_tester.c' || echo '$(srcdir)/'`sound_tester.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-sound_tester.Tpo $(DEPDIR)/libgstgoom_la-sound_tester.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sound_tester.c' object='libgstgoom_la-sound_tester.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-sound_tester.lo `test -f 'sound_tester.c' || echo '$(srcdir)/'`sound_tester.c + +libgstgoom_la-mathtools.lo: mathtools.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-mathtools.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-mathtools.Tpo -c -o libgstgoom_la-mathtools.lo `test -f 'mathtools.c' || echo '$(srcdir)/'`mathtools.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-mathtools.Tpo $(DEPDIR)/libgstgoom_la-mathtools.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mathtools.c' object='libgstgoom_la-mathtools.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-mathtools.lo `test -f 'mathtools.c' || echo '$(srcdir)/'`mathtools.c + +libgstgoom_la-lines.lo: lines.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-lines.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-lines.Tpo -c -o libgstgoom_la-lines.lo `test -f 'lines.c' || echo '$(srcdir)/'`lines.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-lines.Tpo $(DEPDIR)/libgstgoom_la-lines.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lines.c' object='libgstgoom_la-lines.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-lines.lo `test -f 'lines.c' || echo '$(srcdir)/'`lines.c + +libgstgoom_la-ifs.lo: ifs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-ifs.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-ifs.Tpo -c -o libgstgoom_la-ifs.lo `test -f 'ifs.c' || echo '$(srcdir)/'`ifs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-ifs.Tpo $(DEPDIR)/libgstgoom_la-ifs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ifs.c' object='libgstgoom_la-ifs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-ifs.lo `test -f 'ifs.c' || echo '$(srcdir)/'`ifs.c + +libgstgoom_la-surf3d.lo: surf3d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-surf3d.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-surf3d.Tpo -c -o libgstgoom_la-surf3d.lo `test -f 'surf3d.c' || echo '$(srcdir)/'`surf3d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-surf3d.Tpo $(DEPDIR)/libgstgoom_la-surf3d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surf3d.c' object='libgstgoom_la-surf3d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-surf3d.lo `test -f 'surf3d.c' || echo '$(srcdir)/'`surf3d.c + +libgstgoom_la-tentacle3d.lo: tentacle3d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-tentacle3d.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-tentacle3d.Tpo -c -o libgstgoom_la-tentacle3d.lo `test -f 'tentacle3d.c' || echo '$(srcdir)/'`tentacle3d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-tentacle3d.Tpo $(DEPDIR)/libgstgoom_la-tentacle3d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tentacle3d.c' object='libgstgoom_la-tentacle3d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-tentacle3d.lo `test -f 'tentacle3d.c' || echo '$(srcdir)/'`tentacle3d.c + +libgstgoom_la-v3d.lo: v3d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-v3d.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-v3d.Tpo -c -o libgstgoom_la-v3d.lo `test -f 'v3d.c' || echo '$(srcdir)/'`v3d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-v3d.Tpo $(DEPDIR)/libgstgoom_la-v3d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v3d.c' object='libgstgoom_la-v3d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-v3d.lo `test -f 'v3d.c' || echo '$(srcdir)/'`v3d.c + +libgstgoom_la-convolve_fx.lo: convolve_fx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-convolve_fx.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-convolve_fx.Tpo -c -o libgstgoom_la-convolve_fx.lo `test -f 'convolve_fx.c' || echo '$(srcdir)/'`convolve_fx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-convolve_fx.Tpo $(DEPDIR)/libgstgoom_la-convolve_fx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='convolve_fx.c' object='libgstgoom_la-convolve_fx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-convolve_fx.lo `test -f 'convolve_fx.c' || echo '$(srcdir)/'`convolve_fx.c + +libgstgoom_la-flying_stars_fx.lo: flying_stars_fx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-flying_stars_fx.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-flying_stars_fx.Tpo -c -o libgstgoom_la-flying_stars_fx.lo `test -f 'flying_stars_fx.c' || echo '$(srcdir)/'`flying_stars_fx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-flying_stars_fx.Tpo $(DEPDIR)/libgstgoom_la-flying_stars_fx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='flying_stars_fx.c' object='libgstgoom_la-flying_stars_fx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-flying_stars_fx.lo `test -f 'flying_stars_fx.c' || echo '$(srcdir)/'`flying_stars_fx.c + +libgstgoom_la-plugin_info.lo: plugin_info.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-plugin_info.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-plugin_info.Tpo -c -o libgstgoom_la-plugin_info.lo `test -f 'plugin_info.c' || echo '$(srcdir)/'`plugin_info.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-plugin_info.Tpo $(DEPDIR)/libgstgoom_la-plugin_info.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin_info.c' object='libgstgoom_la-plugin_info.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-plugin_info.lo `test -f 'plugin_info.c' || echo '$(srcdir)/'`plugin_info.c + +libgstgoom_la-goom_tools.lo: goom_tools.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-goom_tools.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-goom_tools.Tpo -c -o libgstgoom_la-goom_tools.lo `test -f 'goom_tools.c' || echo '$(srcdir)/'`goom_tools.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-goom_tools.Tpo $(DEPDIR)/libgstgoom_la-goom_tools.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='goom_tools.c' object='libgstgoom_la-goom_tools.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-goom_tools.lo `test -f 'goom_tools.c' || echo '$(srcdir)/'`goom_tools.c + +libgstgoom_la-config_param.lo: config_param.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-config_param.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-config_param.Tpo -c -o libgstgoom_la-config_param.lo `test -f 'config_param.c' || echo '$(srcdir)/'`config_param.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-config_param.Tpo $(DEPDIR)/libgstgoom_la-config_param.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config_param.c' object='libgstgoom_la-config_param.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-config_param.lo `test -f 'config_param.c' || echo '$(srcdir)/'`config_param.c + +libgstgoom_la-filters.lo: filters.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-filters.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-filters.Tpo -c -o libgstgoom_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-filters.Tpo $(DEPDIR)/libgstgoom_la-filters.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters.c' object='libgstgoom_la-filters.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c + +libgstgoom_la-goom_core.lo: goom_core.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-goom_core.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-goom_core.Tpo -c -o libgstgoom_la-goom_core.lo `test -f 'goom_core.c' || echo '$(srcdir)/'`goom_core.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-goom_core.Tpo $(DEPDIR)/libgstgoom_la-goom_core.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='goom_core.c' object='libgstgoom_la-goom_core.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-goom_core.lo `test -f 'goom_core.c' || echo '$(srcdir)/'`goom_core.c + +libgstgoom_la-graphic.lo: graphic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-graphic.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-graphic.Tpo -c -o libgstgoom_la-graphic.lo `test -f 'graphic.c' || echo '$(srcdir)/'`graphic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-graphic.Tpo $(DEPDIR)/libgstgoom_la-graphic.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='graphic.c' object='libgstgoom_la-graphic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-graphic.lo `test -f 'graphic.c' || echo '$(srcdir)/'`graphic.c + +libgstgoom_la-mmx.lo: mmx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-mmx.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-mmx.Tpo -c -o libgstgoom_la-mmx.lo `test -f 'mmx.c' || echo '$(srcdir)/'`mmx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-mmx.Tpo $(DEPDIR)/libgstgoom_la-mmx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mmx.c' object='libgstgoom_la-mmx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-mmx.lo `test -f 'mmx.c' || echo '$(srcdir)/'`mmx.c + +libgstgoom_la-xmmx.lo: xmmx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-xmmx.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-xmmx.Tpo -c -o libgstgoom_la-xmmx.lo `test -f 'xmmx.c' || echo '$(srcdir)/'`xmmx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-xmmx.Tpo $(DEPDIR)/libgstgoom_la-xmmx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xmmx.c' object='libgstgoom_la-xmmx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-xmmx.lo `test -f 'xmmx.c' || echo '$(srcdir)/'`xmmx.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +.NOTPARALLEL: + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstgoom -:SHARED libgstgoom \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstgoom_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgoom_la_CFLAGS) \ + -:LDFLAGS $(libgstgoom_la_LDFLAGS) \ + $(libgstgoom_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/goom/README b/gst/goom/README new file mode 100644 index 0000000..08af2ba --- /dev/null +++ b/gst/goom/README @@ -0,0 +1,13 @@ +The Goom plugin is based on the Goom visualization code from +the Goom homepage found at: +http://ios.free.fr/?page=projet&quoi=1 + +Like the original library so is the Goom plugin available under the LGPL license + +This is based on goom2k4 with changes to plugin_info.c and mmx.h to use Orc for CPU +detection and GStreamer-specific ifdef's for architecture detection. + +These files are not in use right now: +filters_mmx.s +goomsl* +surf3d.s diff --git a/gst/goom/config_param.c b/gst/goom/config_param.c new file mode 100644 index 0000000..feb5015 --- /dev/null +++ b/gst/goom/config_param.c @@ -0,0 +1,144 @@ +/* Goom Project + * Copyright (C) <2003> Jean-Christophe Hoelt + * + * 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 "goom_config_param.h" +#include + +/* TODO: Ajouter goom_ devant ces fonctions */ + +static void +empty_fct (PluginParam * dummy) +{ +} + +void +goom_secure_param (PluginParam * p) +{ + p->changed = empty_fct; + p->change_listener = empty_fct; + p->user_data = 0; + p->name = p->desc = 0; + p->rw = 1; +} + +void +goom_secure_f_param (PluginParam * p, const char *name) +{ + secure_param (p); + + p->name = name; + p->type = PARAM_FLOATVAL; + FVAL (*p) = 0.5f; + FMIN (*p) = 0.0f; + FMAX (*p) = 1.0f; + FSTEP (*p) = 0.01f; +} + +void +goom_secure_f_feedback (PluginParam * p, const char *name) +{ + secure_f_param (p, name); + + p->rw = 0; +} + +void +goom_secure_s_param (PluginParam * p, const char *name) +{ + secure_param (p); + + p->name = name; + p->type = PARAM_STRVAL; + SVAL (*p) = 0; +} + +void +goom_secure_b_param (PluginParam * p, const char *name, int value) +{ + secure_param (p); + + p->name = name; + p->type = PARAM_BOOLVAL; + BVAL (*p) = value; +} + +void +goom_secure_i_param (PluginParam * p, const char *name) +{ + secure_param (p); + + p->name = name; + p->type = PARAM_INTVAL; + IVAL (*p) = 50; + IMIN (*p) = 0; + IMAX (*p) = 100; + ISTEP (*p) = 1; +} + +void +goom_secure_i_feedback (PluginParam * p, const char *name) +{ + secure_i_param (p, name); + + p->rw = 0; +} + +void +goom_plugin_parameters (PluginParameters * p, const char *name, int nb) +{ + p->name = name; + p->desc = ""; + p->nbParams = nb; + p->params = malloc (nb * sizeof (PluginParam *)); +} + +void +goom_plugin_parameters_free (PluginParameters * p) +{ + free (p->params); +} + +/*---------------------------------------------------------------------------*/ + +void +goom_set_str_param_value (PluginParam * p, const char *str) +{ + int len = strlen (str); + + if (SVAL (*p)) + SVAL (*p) = (char *) realloc (SVAL (*p), len + 1); + else + SVAL (*p) = (char *) malloc (len + 1); + memcpy (SVAL (*p), str, len + 1); +} + +void +goom_set_list_param_value (PluginParam * p, const char *str) +{ + int len = strlen (str); + +#ifdef VERBOSE + printf ("%s: %d\n", str, len); +#endif + if (LVAL (*p)) + LVAL (*p) = (char *) realloc (LVAL (*p), len + 1); + else + LVAL (*p) = (char *) malloc (len + 1); + memcpy (LVAL (*p), str, len + 1); +} diff --git a/gst/goom/convolve_fx.c b/gst/goom/convolve_fx.c new file mode 100644 index 0000000..457b5eb --- /dev/null +++ b/gst/goom/convolve_fx.c @@ -0,0 +1,368 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "goom_fx.h" +#include "goom_plugin_info.h" +#include "goom_config.h" +#include +#include +#include +#include + +//#define CONV_MOTIF_W 32 +//#define CONV_MOTIF_WMASK 0x1f + +/* Define if you like the wacky GOOM logo: */ +#undef DRAW_MOTIF + +#define CONV_MOTIF_W 128 +#define CONV_MOTIF_WMASK 0x7f + +typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; + +#include "motif_goom1.h" +#include "motif_goom2.h" + +#define NB_THETA 512 + +typedef struct _CONV_DATA +{ + PluginParam light; + PluginParam factor_adj_p; + PluginParam factor_p; + PluginParameters params; + + /* rotozoom */ + int theta; + float ftheta; + int h_sin[NB_THETA]; + int h_cos[NB_THETA]; + int h_height; + float visibility; + Motif conv_motif; + int inverse_motif; + +} ConvData; + +/* init rotozoom tables */ +static void +compute_tables (VisualFX * _this, PluginInfo * info) +{ + ConvData *data = (ConvData *) _this->fx_data; + double screen_coef; + int i; + double h; + double radian; + + if (data->h_height == info->screen.height) + return; + + screen_coef = 2.0 * 300.0 / (double) info->screen.height; + data->h_height = info->screen.height; + + for (i = 0; i < NB_THETA; i++) { + radian = 2 * i * G_PI / NB_THETA; + h = (0.2 + cos (radian) / 15.0 * sin (radian * 2.0 + 12.123)) * screen_coef; + data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos (radian)); + data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin (radian)); + } +} + +static void +set_motif (ConvData * data, Motif motif) +{ + int i, j; + + for (i = 0; i < CONV_MOTIF_W; ++i) + for (j = 0; j < CONV_MOTIF_W; ++j) + data->conv_motif[i][j] = + motif[CONV_MOTIF_W - i - 1][CONV_MOTIF_W - j - 1]; +} + +static void +convolve_init (VisualFX * _this, PluginInfo * info) +{ + ConvData *data; + + data = (ConvData *) malloc (sizeof (ConvData)); + _this->fx_data = (void *) data; + + secure_f_param (&data->light, "Screen Brightness"); + data->light.param.fval.max = 300.0f; + data->light.param.fval.step = 1.0f; + data->light.param.fval.value = 100.0f; + + secure_f_param (&data->factor_adj_p, "Flash Intensity"); + data->factor_adj_p.param.fval.max = 200.0f; + data->factor_adj_p.param.fval.step = 1.0f; + data->factor_adj_p.param.fval.value = 70.0f; + + secure_f_feedback (&data->factor_p, "Factor"); + + plugin_parameters (&data->params, "Bright Flash", 5); + data->params.params[0] = &data->light; + data->params.params[1] = &data->factor_adj_p; + data->params.params[2] = 0; + data->params.params[3] = &data->factor_p; + data->params.params[4] = 0; + + data->h_height = 0; + + /* init rotozoom tables */ + compute_tables (_this, info); + data->theta = 0; + data->ftheta = 0.0; + data->visibility = 1.0; + set_motif (data, CONV_MOTIF2); + data->inverse_motif = 0; + + _this->params = &data->params; +} + +static void +convolve_free (VisualFX * _this) +{ + ConvData *data = (ConvData *) _this->fx_data; + + goom_plugin_parameters_free (&data->params); + + free (_this->fx_data); +} + +#ifdef DRAW_MOTIF +static void +create_output_with_brightness (VisualFX * _this, Pixel * src, Pixel * dest, + PluginInfo * info, int iff) +{ + ConvData *data = (ConvData *) _this->fx_data; + + int x, y; + int i = 0; //info->screen.height * info->screen.width - 1; + + const int c = data->h_cos[data->theta]; + const int s = data->h_sin[data->theta]; + + const int xi = -(info->screen.width / 2) * c; + const int yi = (info->screen.width / 2) * s; + + const int xj = -(info->screen.height / 2) * s; + const int yj = -(info->screen.height / 2) * c; + + int xprime = xj; + int yprime = yj; + + int ifftab[16]; + + if (data->inverse_motif) { + int i; + + for (i = 0; i < 16; ++i) + ifftab[i] = (double) iff *(1.0 + data->visibility * (15.0 - i) / 15.0); + } else { + int i; + + for (i = 0; i < 16; ++i) + ifftab[i] = (double) iff / (1.0 + data->visibility * (15.0 - i) / 15.0); + } + + for (y = info->screen.height; y--;) { + int xtex, ytex; + + xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; + xprime += s; + + ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; + yprime += c; + +#ifdef HAVE_MMX + __asm__ __volatile__ ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + "\n\t movd %[xtex], %%mm2" "\n\t movd %[ytex], %%mm3" "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ + "\n\t movd %[c], %%mm4" "\n\t movd %[s], %%mm6" "\n\t pxor %%mm5, %%mm5" "\n\t psubd %%mm6, %%mm5" "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ + "\n\t movd %[motif], %%mm6" /* mm6 = motif */ + ::[xtex] "g" (xtex),[ytex] "g" (ytex) + ,[c] "g" (c),[s] "g" (s) + ,[motif] "g" (&data->conv_motif[0][0])); + + for (x = info->screen.width; x--;) { + __asm__ __volatile__ ("\n\t movd %[src], %%mm0" /* mm0 = src */ + "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ + "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ + "\n\t movq %%mm2, %%mm3" "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ + "\n\t movd %%mm3, %%eax" /* eax = xtex' */ + "\n\t psrlq $25, %%mm3" "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ + "\n\t andl $127, %%eax" "\n\t andl $16256, %%ecx" "\n\t addl %%ecx, %%eax" "\n\t movd %%mm6, %%esi" /* esi = motif */ + "\n\t xorl %%ecx, %%ecx" "\n\t movb (%%eax,%%esi), %%cl" "\n\t movl %[ifftab], %%eax" "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ + "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ + "\n\t punpcklwd %%mm1, %%mm1" + "\n\t punpcklbw %%mm7, %%mm0" + "\n\t punpckldq %%mm1, %%mm1" + "\n\t psrlw $1, %%mm0" + "\n\t psrlw $2, %%mm1" + "\n\t pmullw %%mm1, %%mm0" + "\n\t psrlw $5, %%mm0" + "\n\t packuswb %%mm7, %%mm0" + "\n\t movd %%mm0, %[dest]":[dest] "=g" (dest[i].val) + :[src] "g" (src[i].val) + ,[ifftab] "g" (&ifftab[0]) + :"eax", "ecx"); + + i++; + } +#else + for (x = info->screen.width; x--;) { + + int iff2; + unsigned int f0, f1, f2, f3; + + xtex += c; + ytex -= s; + + iff2 = + ifftab[(int) data->conv_motif[(ytex >> 16) & CONV_MOTIF_WMASK][(xtex + >> 16) & CONV_MOTIF_WMASK]]; + +#define sat(a) ((a)>0xFF?0xFF:(a)) + f0 = src[i].val; + f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; + f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; + f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; + dest[i].val = + (sat (f1) << R_OFFSET) | (sat (f2) << G_OFFSET) | (sat (f3) << + B_OFFSET); +/* + f0 = (src[i].cop[0] * iff2) >> 8; + f1 = (src[i].cop[1] * iff2) >> 8; + f2 = (src[i].cop[2] * iff2) >> 8; + f3 = (src[i].cop[3] * iff2) >> 8; + + dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; + dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; + dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; + dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +*/ + i++; + } +#endif + } +#ifdef HAVE_MMX + __asm__ __volatile__ ("\n\t emms"); +#endif + + compute_tables (_this, info); +} +#endif + +/*#include + +static uint64_t GetTick() +{ + uint64_t x; + asm volatile ("RDTSC" : "=A" (x)); + return x; +}*/ + + +static void +convolve_apply (VisualFX * _this, Pixel * src, Pixel * dest, PluginInfo * info) +{ + + ConvData *data = (ConvData *) _this->fx_data; +#ifdef DRAW_MOTIF + float ff; + int iff; + + ff = (FVAL (data->factor_p) * FVAL (data->factor_adj_p) + + FVAL (data->light)) / 100.0f; + iff = (unsigned int) (ff * 256); +#endif + + { + double fcycle = (double) info->cycle; + double rotate_param, rotate_coef; + float INCREASE_RATE = 1.5; + float DECAY_RATE = 0.955; + + if (FVAL (info->sound.last_goom_p) > 0.8) + FVAL (data->factor_p) += FVAL (info->sound.goom_power_p) * INCREASE_RATE; + FVAL (data->factor_p) *= DECAY_RATE; + + rotate_param = FVAL (info->sound.last_goom_p); + if (rotate_param < 0.0) + rotate_param = 0.0; + rotate_param += FVAL (info->sound.goom_power_p); + + rotate_coef = 4.0 + FVAL (info->sound.goom_power_p) * 6.0; + data->ftheta = (data->ftheta + rotate_coef * sin (rotate_param * 6.3)); + data->theta = ((unsigned int) data->ftheta) % NB_THETA; + data->visibility = + (cos (fcycle * 0.001 + 1.5) * sin (fcycle * 0.008) + + cos (fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; + if (data->visibility < 0.0) + data->visibility = 0.0; + data->factor_p.change_listener (&data->factor_p); + } + + if (data->visibility < 0.01) { + switch (goom_irand (info->gRandom, 300)) { + case 1: + set_motif (data, CONV_MOTIF1); + data->inverse_motif = 1; + break; + case 2: + set_motif (data, CONV_MOTIF2); + data->inverse_motif = 0; + break; + } + } +#ifdef DRAW_MOTIF + if ((ff > 0.98f) && (ff < 1.02f)) + memcpy (dest, src, info->screen.size * sizeof (Pixel)); + else + create_output_with_brightness (_this, src, dest, info, iff); +#else + memcpy (dest, src, info->screen.size * sizeof (Pixel)); +#endif + +/* +// Benching suite... + { + uint64_t before, after; + double timed; + static double stimed = 10000.0; + before = GetTick(); + data->visibility = 1.0; + create_output_with_brightness(_this,src,dest,info,iff); + after = GetTick(); + timed = (double)((after-before) / info->screen.size); + if (timed < stimed) { + stimed = timed; + printf ("CLK = %3.0f CPP\n", stimed); + } + } +*/ +} + +void +convolve_create (VisualFX * vfx) +{ + vfx->init = convolve_init; + vfx->free = convolve_free; + vfx->apply = convolve_apply; + vfx->fx_data = NULL; + vfx->params = NULL; +} diff --git a/gst/goom/drawmethods.c b/gst/goom/drawmethods.c new file mode 100644 index 0000000..cd8163a --- /dev/null +++ b/gst/goom/drawmethods.c @@ -0,0 +1,222 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "drawmethods.h" + +#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ +{\ + int tra=0,i=0;\ + unsigned char *bra = (unsigned char*)&(_backbuf);\ + unsigned char *dra = (unsigned char*)&(_out);\ + unsigned char *cra = (unsigned char*)&(_col);\ + for (;i<4;i++) {\ + tra = *cra;\ + tra += *bra;\ + if (tra>255) tra=255;\ + *dra = tra;\ + ++dra;++cra;++bra;\ + }\ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) + +void +draw_line (Pixel * data, int x1, int y1, int x2, int y2, int col, int screenx, + int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) + || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + return; + + /* clip to top edge + if ((y1 < 0) && (y2 < 0)) + return; + + if (y1 < 0) { + x1 += (y1 * (x1 - x2)) / (y2 - y1); + y1 = 0; + } + if (y2 < 0) { + x2 += (y2 * (x1 - x2)) / (y2 - y1); + y2 = 0; + } + + clip to bottom edge + if ((y1 >= screeny) && (y2 >= screeny)) + return; + if (y1 >= screeny) { + x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); + y1 = screeny - 1; + } + if (y2 >= screeny) { + x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); + y2 = screeny - 1; + } + clip to left edge + if ((x1 < 0) && (x2 < 0)) + return; + if (x1 < 0) { + y1 += (x1 * (y1 - y2)) / (x2 - x1); + x1 = 0; + } + if (x2 < 0) { + y2 += (x2 * (y1 - y2)) / (x2 - x1); + x2 = 0; + } + clip to right edge + if ((x1 >= screenx) && (x2 >= screenx)) + return; + if (x1 >= screenx) { + y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); + x1 = screenx - 1; + } + if (x2 >= screenx) { + y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); + x2 = screenx - 1; + } + */ + + dx = x2 - x1; + dy = y2 - y1; + if (x1 > x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + return; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + return; + } else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + return; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + return; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + return; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + return; + } + } +} diff --git a/gst/goom/drawmethods.h b/gst/goom/drawmethods.h new file mode 100644 index 0000000..cdf3d47 --- /dev/null +++ b/gst/goom/drawmethods.h @@ -0,0 +1,27 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _DRAWMETHODS_H +#define _DRAWMETHODS_H + +#include "goom_config.h" +#include "goom_graphic.h" + +void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); + +#endif /* _DRAWMETHODS_H */ diff --git a/gst/goom/filters.c b/gst/goom/filters.c new file mode 100644 index 0000000..8c6dbb1 --- /dev/null +++ b/gst/goom/filters.c @@ -0,0 +1,872 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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. + */ +// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- + +/* filter.c version 0.7 +* contient les filtres applicable a un buffer +* creation : 01/10/2000 +* -ajout de sinFilter() +* -ajout de zoomFilter() +* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs +* -optimisation de sinFilter (utilisant une table de sin) +* -asm +* -optimisation de la procedure de generation du buffer de transformation +* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] +*/ + +/* #define _DEBUG_PIXEL */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#ifdef HAVE_INTTYPES_H +#include +#endif + +#include "goom_filters.h" +#include "goom_graphic.h" +#include "goom_tools.h" +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "v3d.h" + +/* TODO : MOVE THIS AWAY !!! */ +/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ +static inline void +setPixelRGB (PluginInfo * goomInfo, Pixel * buffer, Uint x, Uint y, Color c) +{ + Pixel i; + + i.channels.b = c.b; + i.channels.g = c.v; + i.channels.r = c.r; + *(buffer + (x + y * goomInfo->screen.width)) = i; +} + +static inline void +setPixelRGB_ (Pixel * buffer, Uint x, Color c) +{ + buffer[x].channels.r = c.r; + buffer[x].channels.g = c.v; + buffer[x].channels.b = c.b; +} + +static inline void +getPixelRGB (PluginInfo * goomInfo, Pixel * buffer, Uint x, Uint y, Color * c) +{ + Pixel i = *(buffer + (x + y * goomInfo->screen.width)); + + c->b = i.channels.b; + c->v = i.channels.g; + c->r = i.channels.r; +} + +static inline void +getPixelRGB_ (Pixel * buffer, Uint x, Color * c) +{ + Pixel i = *(buffer + x); + + c->b = i.channels.b; + c->v = i.channels.g; + c->r = i.channels.r; +} + +/* END TODO */ + + +/* DEPRECATED */ +// retourne x>>s , en testant le signe de x +//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) +//#define EFFECT_DISTORS 4 +//#define EFFECT_DISTORS_SL 2 +//#define INTERLACE_ADD 9 +//#define INTERLACE_AND 0xf +/* END DEPRECATED */ + +#define BUFFPOINTNB 16 +#define BUFFPOINTNBF 16.0f +#define BUFFPOINTMASK 0xffff + +#define sqrtperte 16 +/* faire : a % sqrtperte <=> a & pertemask */ +#define PERTEMASK 0xf +/* faire : a / sqrtperte <=> a >> PERTEDEC */ +#define PERTEDEC 4 + +/* pure c version of the zoom filter */ +static void c_zoom (Pixel * expix1, Pixel * expix2, unsigned int prevX, + unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, + int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); + +/* simple wrapper to give it the same proto than the others */ +void +zoom_filter_c (int sizeX, int sizeY, Pixel * src, Pixel * dest, int *brutS, + int *brutD, int buffratio, int precalCoef[16][16]) +{ + c_zoom (src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); +} + +static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); + + +typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA +{ + + PluginParam enabled_bp; + PluginParameters params; + + unsigned int *coeffs, *freecoeffs; + + signed int *brutS, *freebrutS; /* source */ + signed int *brutD, *freebrutD; /* dest */ + signed int *brutT, *freebrutT; /* temp (en cours de generation) */ + + guint32 zoom_width; + + unsigned int prevX, prevY; + + float general_speed; + int reverse; /* reverse the speed */ + char theMode; + int waveEffect; + int hypercosEffect; + int vPlaneEffect; + int hPlaneEffect; + char noisify; + int middleX, middleY; + + int mustInitBuffers; + int interlace_start; + + /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ + int buffratio; + int *firedec; + + /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ + int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; + + /** calculatePXandPY statics */ + int wave; + int wavesp; + +} ZoomFilterFXWrapperData; + + + + +static inline void +zoomVector (v2g * vecteur, ZoomFilterFXWrapperData * data, float X, float Y) +{ + float vx, vy; + float sq_dist = X * X + Y * Y; + + /* sx = (X < 0.0f) ? -1.0f : 1.0f; + sy = (Y < 0.0f) ? -1.0f : 1.0f; + */ + float coefVitesse = (1.0f + data->general_speed) / 50.0f; + + // Effects + + /* Centralized FX */ + + switch (data->theMode) { + case CRYSTAL_BALL_MODE: + coefVitesse -= (sq_dist - 0.3f) / 15.0f; + break; + case AMULETTE_MODE: + coefVitesse += sq_dist * 3.5f; + break; + case WAVE_MODE: + coefVitesse += sin (sq_dist * 20.0f) / 100.0f; + break; + case SCRUNCH_MODE: + coefVitesse += sq_dist / 10.0f; + break; + //case HYPERCOS1_MODE: + break; + //case HYPERCOS2_MODE: + break; + //case YONLY_MODE: + break; + case SPEEDWAY_MODE: + coefVitesse *= 4.0f * Y; + break; + default: + break; + } + + if (coefVitesse < -2.01f) + coefVitesse = -2.01f; + if (coefVitesse > 2.01f) + coefVitesse = 2.01f; + + vx = coefVitesse * X; + vy = coefVitesse * Y; + + /* Amulette 2 */ + // vx = X * tan(dist); + // vy = Y * tan(dist); + + /* Rotate */ + //vx = (X+Y)*0.1; + //vy = (Y-X)*0.1; + + + // Effects adds-on + + /* Noise */ + if (data->noisify) { + vx += (((float) rand ()) / ((float) RAND_MAX) - 0.5f) / 50.0f; + vy += (((float) rand ()) / ((float) RAND_MAX) - 0.5f) / 50.0f; + } + + /* Hypercos */ + if (data->hypercosEffect) { + vx += sin (Y * 10.0f) / 120.0f; + vy += sin (X * 10.0f) / 120.0f; + } + + /* H Plane */ + if (data->hPlaneEffect) + vx += Y * 0.0025f * data->hPlaneEffect; + + /* V Plane */ + if (data->vPlaneEffect) + vy += X * 0.0025f * data->vPlaneEffect; + + /* TODO : Water Mode */ + // if (data->waveEffect) + + vecteur->x = vx; + vecteur->y = vy; +} + + +/* + * Makes a stripe of a transform buffer (brutT) + * + * The transform is (in order) : + * Translation (-data->middleX, -data->middleY) + * Homothetie (Center : 0,0 Coeff : 2/data->prevX) + */ +static void +makeZoomBufferStripe (ZoomFilterFXWrapperData * data, int INTERLACE_INCR) +{ + // Position of the pixel to compute in pixmap coordinates + Uint x, y; + + // Where (verticaly) to stop generating the buffer stripe + int maxEnd; + + // Ratio from pixmap to normalized coordinates + float ratio = 2.0f / ((float) data->prevX); + + // Ratio from normalized to virtual pixmap coordinates + float inv_ratio = BUFFPOINTNBF / ratio; + float min = ratio / BUFFPOINTNBF; + + // Y position of the pixel to compute in normalized coordinates + float Y = ((float) (data->interlace_start - data->middleY)) * ratio; + + maxEnd = data->prevY; + if (maxEnd > (data->interlace_start + INTERLACE_INCR)) + maxEnd = (data->interlace_start + INTERLACE_INCR); + + for (y = data->interlace_start; + (y < data->prevY) && ((signed int) y < maxEnd); y++) { + Uint premul_y_prevX = y * data->prevX * 2; + float X = -((float) data->middleX) * ratio; + + for (x = 0; x < data->prevX; x++) { + v2g vector; + + zoomVector (&vector, data, X, Y); + + /* Finish and avoid null displacement */ + if (fabs (vector.x) < min) + vector.x = (vector.x < 0.0f) ? -min : min; + if (fabs (vector.y) < min) + vector.y = (vector.y < 0.0f) ? -min : min; + + data->brutT[premul_y_prevX] = + ((int) ((X - vector.x) * inv_ratio) + + ((int) (data->middleX * BUFFPOINTNB))); + data->brutT[premul_y_prevX + 1] = + ((int) ((Y - vector.y) * inv_ratio) + + ((int) (data->middleY * BUFFPOINTNB))); + premul_y_prevX += 2; + X += ratio; + } + Y += ratio; + } + data->interlace_start += INTERLACE_INCR; + if (y >= data->prevY - 1) + data->interlace_start = -1; +} + + +/* + * calculer px et py en fonction de x,y,middleX,middleY et theMode + * px et py indique la nouvelle position (en sqrtperte ieme de pixel) + * (valeur * 16) + + inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) + { + if (data->theMode == WATER_MODE) { + int yy; + + yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; + if (yy < 0) + yy = 0; + if (yy >= (signed int)goomInfo->screen.height) + yy = goomInfo->screen.height - 1; + + *px = (x << 4) + data->firedec[yy] + (data->wave / 10); + *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); + + data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + if (data->wave < -10) + data->wavesp += 2; + if (data->wave > 10) + data->wavesp -= 2; + data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + if (data->wavesp > 100) + data->wavesp = (data->wavesp * 9) / 10; + } + else { + int dist = 0, vx9, vy9; + int vx, vy; + int ppx, ppy; + int fvitesse = data->vitesse << 4; + + if (data->noisify) { + x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); + y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); + } + vx = (x - data->middleX) << 9; + vy = (y - data->middleY) << 9; + + if (data->hPlaneEffect) + vx += data->hPlaneEffect * (y - data->middleY); + + if (data->vPlaneEffect) + vy += data->vPlaneEffect * (x - data->middleX); + + if (data->waveEffect) { + fvitesse *= + 1024 + + ShiftRight (goomInfo->sintable + [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); + fvitesse /= 1024; + } + + if (data->hypercosEffect) { + vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); + vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); + } + + vx9 = ShiftRight (vx, 9); + vy9 = ShiftRight (vy, 9); + dist = vx9 * vx9 + vy9 * vy9; + + switch (data->theMode) { + case WAVE_MODE: + fvitesse *= + 1024 + + ShiftRight (goomInfo->sintable + [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); + fvitesse>>=10; + break; + case CRYSTAL_BALL_MODE: + fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); + break; + case AMULETTE_MODE: + fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); + break; + case SCRUNCH_MODE: + fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); + break; + case HYPERCOS1_MODE: + vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); + vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); + break; + case HYPERCOS2_MODE: + vx = + vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); + vy = + vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); + fvitesse = 128 << 4; + break; + case YONLY_MODE: + fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); + fvitesse >>= 10; + break; + case SPEEDWAY_MODE: + fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); + break; + } + + if (fvitesse < -3024) + fvitesse = -3024; + + if (vx < 0) // pb avec decalage sur nb negatif + ppx = -(-(vx * fvitesse) >> 16); + // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) + // * * * * * 9 = nb chiffre virgule de vx) + else + ppx = ((vx * fvitesse) >> 16); + + if (vy < 0) + ppy = -(-(vy * fvitesse) >> 16); + else + ppy = ((vy * fvitesse) >> 16); + + *px = (data->middleX << 4) + ppx; + *py = (data->middleY << 4) + ppy; + } + } + */ + + + +static void +c_zoom (Pixel * expix1, Pixel * expix2, unsigned int prevX, unsigned int prevY, + signed int *brutS, signed int *brutD, int buffratio, int precalCoef[16][16]) +{ + int myPos, myPos2; + Color couleur; + + unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; + + int bufsize = prevX * prevY * 2; + int bufwidth = prevX; + + expix1[0].val = expix1[prevX - 1].val = expix1[prevX * prevY - 1].val = + expix1[prevX * prevY - prevX].val = 0; + + for (myPos = 0; myPos < bufsize; myPos += 2) { + Color col1, col2, col3, col4; + int c1, c2, c3, c4, px, py; + int pos; + int coeffs; + + int brutSmypos = brutS[myPos]; + + myPos2 = myPos + 1; + + px = brutSmypos + (((brutD[myPos] - + brutSmypos) * buffratio) >> BUFFPOINTNB); + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - + brutSmypos) * buffratio) >> BUFFPOINTNB); + + if ((py >= ay) || (px >= ax)) { + pos = coeffs = 0; + } else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + /* coef en modulo 15 */ + coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; + } + getPixelRGB_ (expix1, pos, &col1); + getPixelRGB_ (expix1, pos + 1, &col2); + getPixelRGB_ (expix1, pos + bufwidth, &col3); + getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); + + c1 = coeffs; + c2 = (c1 >> 8) & 0xFF; + c3 = (c1 >> 16) & 0xFF; + c4 = (c1 >> 24) & 0xFF; + c1 = c1 & 0xff; + + couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; + if (couleur.r > 5) + couleur.r -= 5; + couleur.r >>= 8; + + couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; + if (couleur.v > 5) + couleur.v -= 5; + couleur.v >>= 8; + + couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; + if (couleur.b > 5) + couleur.b -= 5; + couleur.b >>= 8; + + setPixelRGB_ (expix2, myPos >> 1, couleur); + } +} + +/** generate the water fx horizontal direction buffer */ +static void +generateTheWaterFXHorizontalDirectionBuffer (PluginInfo * goomInfo, + ZoomFilterFXWrapperData * data) +{ + + int loopv; + int decc = goom_irand (goomInfo->gRandom, 8) - 4; + int spdc = goom_irand (goomInfo->gRandom, 8) - 4; + int accel = goom_irand (goomInfo->gRandom, 8) - 4; + + for (loopv = data->prevY; loopv != 0;) { + + loopv--; + data->firedec[loopv] = decc; + decc += spdc / 10; + spdc += + goom_irand (goomInfo->gRandom, 3) - goom_irand (goomInfo->gRandom, 3); + + if (decc > 4) + spdc -= 1; + if (decc < -4) + spdc += 1; + + if (spdc > 30) + spdc = spdc - goom_irand (goomInfo->gRandom, 3) + accel / 10; + if (spdc < -30) + spdc = spdc + goom_irand (goomInfo->gRandom, 3) + accel / 10; + + if (decc > 8 && spdc > 1) + spdc -= goom_irand (goomInfo->gRandom, 3) - 2; + + if (decc < -8 && spdc < -1) + spdc += goom_irand (goomInfo->gRandom, 3) + 2; + + if (decc > 8 || decc < -8) + decc = decc * 8 / 9; + + accel += + goom_irand (goomInfo->gRandom, 2) - goom_irand (goomInfo->gRandom, 2); + if (accel > 20) + accel -= 2; + if (accel < -20) + accel += 2; + } +} + + + +/** +* Main work for the dynamic displacement map. + * + * Reads data from pix1, write to pix2. + * + * Useful datas for this FX are stored in ZoomFilterData. + * + * If you think that this is a strange function name, let me say that a long time ago, + * there has been a slow version and a gray-level only one. Then came these function, + * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. + * So that is why you have this name, for the nostalgy of the first days of goom + * when it was just a tiny program writen in Turbo Pascal on my i486... + */ +void +zoomFilterFastRGB (PluginInfo * goomInfo, Pixel * pix1, Pixel * pix2, + ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) +{ + Uint x, y; + + ZoomFilterFXWrapperData *data = + (ZoomFilterFXWrapperData *) goomInfo->zoomFilter_fx.fx_data; + + if (!BVAL (data->enabled_bp)) + return; + + /** changement de taille **/ + if ((data->prevX != resx) || (data->prevY != resy)) { + data->prevX = resx; + data->prevY = resy; + + if (data->brutS) + free (data->freebrutS); + data->brutS = 0; + if (data->brutD) + free (data->freebrutD); + data->brutD = 0; + if (data->brutT) + free (data->freebrutT); + data->brutT = 0; + + data->middleX = resx / 2; + data->middleY = resy / 2; + data->mustInitBuffers = 1; + if (data->firedec) + free (data->firedec); + data->firedec = 0; + } + + if (data->interlace_start != -2) + zf = NULL; + + /** changement de config **/ + if (zf) { + data->reverse = zf->reverse; + data->general_speed = (float) (zf->vitesse - 128) / 128.0f; + if (data->reverse) + data->general_speed = -data->general_speed; + data->middleX = zf->middleX; + data->middleY = zf->middleY; + data->theMode = zf->mode; + data->hPlaneEffect = zf->hPlaneEffect; + data->vPlaneEffect = zf->vPlaneEffect; + data->waveEffect = zf->waveEffect; + data->hypercosEffect = zf->hypercosEffect; + data->noisify = zf->noisify; + data->interlace_start = 0; + } + + + if (data->mustInitBuffers) { + + data->mustInitBuffers = 0; + data->freebrutS = + (signed int *) calloc (resx * resy * 2 + 128, sizeof (unsigned int)); + data->brutS = + (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); + + data->freebrutD = + (signed int *) calloc (resx * resy * 2 + 128, sizeof (unsigned int)); + data->brutD = + (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); + + data->freebrutT = + (signed int *) calloc (resx * resy * 2 + 128, sizeof (unsigned int)); + data->brutT = + (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); + + data->buffratio = 0; + + data->firedec = (int *) malloc (data->prevY * sizeof (int)); + generateTheWaterFXHorizontalDirectionBuffer (goomInfo, data); + + data->interlace_start = 0; + makeZoomBufferStripe (data, resy); + + /* Copy the data from temp to dest and source */ + memcpy (data->brutS, data->brutT, resx * resy * 2 * sizeof (int)); + memcpy (data->brutD, data->brutT, resx * resy * 2 * sizeof (int)); + } + + /* generation du buffer de trans */ + if (data->interlace_start == -1) { + + /* sauvegarde de l'etat actuel dans la nouvelle source + * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ + y = data->prevX * data->prevY * 2; + for (x = 0; x < y; x += 2) { + int brutSmypos = data->brutS[x]; + int x2 = x + 1; + + data->brutS[x] = + brutSmypos + (((data->brutD[x] - + brutSmypos) * data->buffratio) >> BUFFPOINTNB); + brutSmypos = data->brutS[x2]; + data->brutS[x2] = + brutSmypos + (((data->brutD[x2] - + brutSmypos) * data->buffratio) >> BUFFPOINTNB); + } + data->buffratio = 0; + } + + if (data->interlace_start == -1) { + signed int *tmp; + + tmp = data->brutD; + data->brutD = data->brutT; + data->brutT = tmp; + tmp = data->freebrutD; + data->freebrutD = data->freebrutT; + data->freebrutT = tmp; + data->interlace_start = -2; + } + + if (data->interlace_start >= 0) { + /* creation de la nouvelle destination */ + makeZoomBufferStripe (data, resy / 16); + } + + if (switchIncr != 0) { + data->buffratio += switchIncr; + if (data->buffratio > BUFFPOINTMASK) + data->buffratio = BUFFPOINTMASK; + } + + if (switchMult != 1.0f) { + data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + + (float) data->buffratio * switchMult); + } + + data->zoom_width = data->prevX; + + goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, + data->brutS, data->brutD, data->buffratio, data->precalCoef); +} + +static void +generatePrecalCoef (int precalCoef[16][16]) +{ + int coefh, coefv; + + for (coefh = 0; coefh < 16; coefh++) { + for (coefv = 0; coefv < 16; coefv++) { + + int i; + int diffcoeffh; + int diffcoeffv; + + diffcoeffh = sqrtperte - coefh; + diffcoeffv = sqrtperte - coefv; + + if (!(coefh || coefv)) { + i = 255; + } else { + int i1, i2, i3, i4; + + i1 = diffcoeffh * diffcoeffv; + i2 = coefh * diffcoeffv; + i3 = diffcoeffh * coefv; + i4 = coefh * coefv; + + // TODO: faire mieux... + if (i1) + i1--; + if (i2) + i2--; + if (i3) + i3--; + if (i4) + i4--; + + i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); + } + precalCoef[coefh][coefv] = i; + } + } +} + +/* VisualFX Wrapper */ + +static void +zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo * info) +{ + ZoomFilterFXWrapperData *data = + (ZoomFilterFXWrapperData *) malloc (sizeof (ZoomFilterFXWrapperData)); + + data->coeffs = 0; + data->freecoeffs = 0; + data->brutS = 0; + data->freebrutS = 0; + data->brutD = 0; + data->freebrutD = 0; + data->brutT = 0; + data->freebrutT = 0; + data->prevX = 0; + data->prevY = 0; + + data->mustInitBuffers = 1; + data->interlace_start = -2; + + data->general_speed = 0.0f; + data->reverse = 0; + data->theMode = AMULETTE_MODE; + data->waveEffect = 0; + data->hypercosEffect = 0; + data->vPlaneEffect = 0; + data->hPlaneEffect = 0; + data->noisify = 2; + + /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ + data->buffratio = 0; + data->firedec = 0; + + data->wave = data->wavesp = 0; + + secure_b_param (&data->enabled_bp, "Enabled", 1); + + plugin_parameters (&data->params, "Zoom Filter", 1); + data->params.params[0] = &data->enabled_bp; + + _this->params = &data->params; + _this->fx_data = (void *) data; + + /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ + generatePrecalCoef (data->precalCoef); +} + +static void +zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) +{ + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData *) _this->fx_data; + + if (data->freebrutT) + free (data->freebrutT); + if (data->freebrutS) + free (data->freebrutS); + if (data->freebrutD) + free (data->freebrutD); + if (data->firedec) + free (data->firedec); + + goom_plugin_parameters_free (_this->params); + + free (_this->fx_data); +} + +static void +zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel * src, + Pixel * dest, PluginInfo * info) +{ +} + +void +zoomFilterVisualFXWrapper_create (VisualFX * fx) +{ + fx->init = zoomFilterVisualFXWrapper_init; + fx->free = zoomFilterVisualFXWrapper_free; + fx->apply = zoomFilterVisualFXWrapper_apply; + fx->params = NULL; + fx->fx_data = NULL; +} + + +/* TODO : MOVE THIS AWAY */ + +void +pointFilter (PluginInfo * goomInfo, Pixel * pix1, Color c, float t1, float t2, + float t3, float t4, Uint cycle) +{ + Uint x = (Uint) ((int) (goomInfo->screen.width / 2) + + (int) (t1 * cos ((float) cycle / t3))); + Uint y = (Uint) ((int) (goomInfo->screen.height / 2) + + (int) (t2 * sin ((float) cycle / t4))); + + if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) + && (y < goomInfo->screen.height - 2)) { + setPixelRGB (goomInfo, pix1, x + 1, y, c); + setPixelRGB (goomInfo, pix1, x, y + 1, c); + setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); + setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); + setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); + } +} diff --git a/gst/goom/flying_stars_fx.c b/gst/goom/flying_stars_fx.c new file mode 100644 index 0000000..a0ad8b7 --- /dev/null +++ b/gst/goom/flying_stars_fx.c @@ -0,0 +1,361 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "goom_fx.h" +#include "goom_plugin_info.h" +#include "goom_tools.h" + +#include "mathtools.h" + +/* TODO:-- FAIRE PROPREMENT... BOAH... */ +#define NCOL 15 + +/*static const int colval[] = { +0xfdf6f5, +0xfae4e4, +0xf7d1d1, +0xf3b6b5, +0xefa2a2, +0xec9190, +0xea8282, +0xe87575, +0xe46060, +0xe14b4c, +0xde3b3b, +0xdc2d2f, +0xd92726, +0xd81619, +0xd50c09, +0 +}; +*/ +static const int colval[] = { + 0x1416181a, + 0x1419181a, + 0x141f181a, + 0x1426181a, + 0x142a181a, + 0x142f181a, + 0x1436181a, + 0x142f1819, + 0x14261615, + 0x13201411, + 0x111a100a, + 0x0c180508, + 0x08100304, + 0x00050101, + 0x0 +}; + + +/* The different modes of the visual FX. + * Put this values on fx_mode */ +#define FIREWORKS_FX 0 +#define RAIN_FX 1 +#define FOUNTAIN_FX 2 +#define LAST_FX 3 + +typedef struct _FS_STAR +{ + float x, y; + float vx, vy; + float ax, ay; + float age, vage; +} Star; + +typedef struct _FS_DATA +{ + + int fx_mode; + int nbStars; + + int maxStars; + Star *stars; + + float min_age; + float max_age; + + PluginParam min_age_p; + PluginParam max_age_p; + PluginParam nbStars_p; + PluginParam nbStars_limit_p; + PluginParam fx_mode_p; + + PluginParameters params; +} FSData; + +static void +fs_init (VisualFX * _this, PluginInfo * info) +{ + + FSData *data; + + data = (FSData *) malloc (sizeof (FSData)); + + data->fx_mode = FIREWORKS_FX; + data->maxStars = 4096; + data->stars = (Star *) malloc (data->maxStars * sizeof (Star)); + data->nbStars = 0; + + secure_i_param (&data->max_age_p, "Fireworks Smallest Bombs"); + IVAL (data->max_age_p) = 80; + IMIN (data->max_age_p) = 0; + IMAX (data->max_age_p) = 100; + ISTEP (data->max_age_p) = 1; + + secure_i_param (&data->min_age_p, "Fireworks Largest Bombs"); + IVAL (data->min_age_p) = 99; + IMIN (data->min_age_p) = 0; + IMAX (data->min_age_p) = 100; + ISTEP (data->min_age_p) = 1; + + secure_i_param (&data->nbStars_limit_p, "Max Number of Particules"); + IVAL (data->nbStars_limit_p) = 512; + IMIN (data->nbStars_limit_p) = 0; + IMAX (data->nbStars_limit_p) = data->maxStars; + ISTEP (data->nbStars_limit_p) = 64; + + secure_i_param (&data->fx_mode_p, "FX Mode"); + IVAL (data->fx_mode_p) = data->fx_mode; + IMIN (data->fx_mode_p) = 1; + IMAX (data->fx_mode_p) = 3; + ISTEP (data->fx_mode_p) = 1; + + secure_f_feedback (&data->nbStars_p, "Number of Particules (% of Max)"); + + plugin_parameters (&data->params, "Particule System", 7); + data->params.params[0] = &data->fx_mode_p; + data->params.params[1] = &data->nbStars_limit_p; + data->params.params[2] = 0; + data->params.params[3] = &data->min_age_p; + data->params.params[4] = &data->max_age_p; + data->params.params[5] = 0; + data->params.params[6] = &data->nbStars_p; + + _this->params = &data->params; + _this->fx_data = (void *) data; +} + +static void +fs_free (VisualFX * _this) +{ + FSData *data = (FSData *) _this->fx_data; + + goom_plugin_parameters_free (&data->params); + + free (data->stars); + free (_this->fx_data); +} + + +/** + * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. + */ +static void +addABomb (FSData * fs, int mx, int my, float radius, float vage, float gravity, + PluginInfo * info) +{ + + int i = fs->nbStars; + float ro; + int theta; + + if (fs->nbStars >= fs->maxStars) + return; + fs->nbStars++; + + fs->stars[i].x = mx; + fs->stars[i].y = my; + + ro = radius * (float) goom_irand (info->gRandom, 100) / 100.0f; + ro *= (float) goom_irand (info->gRandom, 100) / 100.0f + 1.0f; + theta = goom_irand (info->gRandom, 256); + + fs->stars[i].vx = ro * cos256[theta]; + fs->stars[i].vy = -0.2f + ro * sin256[theta]; + + fs->stars[i].ax = 0; + fs->stars[i].ay = gravity; + + fs->stars[i].age = 0; + if (vage < fs->min_age) + vage = fs->min_age; + fs->stars[i].vage = vage; +} + + +/** + * Met a jour la position et vitesse d'une particule. + */ +static void +updateStar (Star * s) +{ + s->x += s->vx; + s->y += s->vy; + s->vx += s->ax; + s->vy += s->ay; + s->age += s->vage; +} + + +/** + * Ajoute de nouvelles particules au moment d'un evenement sonore. + */ +static void +fs_sound_event_occured (VisualFX * _this, PluginInfo * info) +{ + + FSData *data = (FSData *) _this->fx_data; + int i; + + int max = (int) ((1.0f + info->sound.goomPower) * goom_irand (info->gRandom, + 150)) + 100; + float radius = + (1.0f + info->sound.goomPower) * (float) (goom_irand (info->gRandom, + 150) + 50) / 300; + int mx; + int my; + float vage, gravity = 0.02f; + + switch (data->fx_mode) { + case FIREWORKS_FX: + { + double dx, dy; + + do { + mx = goom_irand (info->gRandom, info->screen.width); + my = goom_irand (info->gRandom, info->screen.height); + dx = (mx - info->screen.width / 2); + dy = (my - info->screen.height / 2); + } while (dx * dx + dy * dy < + (info->screen.height / 2) * (info->screen.height / 2)); + vage = data->max_age * (1.0f - info->sound.goomPower); + } + break; + case RAIN_FX: + mx = goom_irand (info->gRandom, info->screen.width); + if (mx > info->screen.width / 2) + mx = info->screen.width; + else + mx = 0; + my = -(info->screen.height / 3) - goom_irand (info->gRandom, + info->screen.width / 3); + radius *= 1.5; + vage = 0.002f; + break; + case FOUNTAIN_FX: + my = info->screen.height + 2; + vage = 0.001f; + radius += 1.0f; + mx = info->screen.width / 2; + gravity = 0.04f; + break; + default: + return; + /* my = i R A N D (info->screen.height); vage = 0.01f; */ + } + + radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ + max *= info->screen.height / 200.0f; + + if (info->sound.timeSinceLastBigGoom < 1) { + radius *= 1.5; + max *= 2; + } + for (i = 0; i < max; ++i) + addABomb (data, mx, my, radius, vage, gravity, info); +} + + +/** + * Main methode of the FX. + */ +static void +fs_apply (VisualFX * _this, Pixel * src, Pixel * dest, PluginInfo * info) +{ + + int i; + int col; + FSData *data = (FSData *) _this->fx_data; + + /* Get the new parameters values */ + data->min_age = 1.0f - (float) IVAL (data->min_age_p) / 100.0f; + data->max_age = 1.0f - (float) IVAL (data->max_age_p) / 100.0f; + FVAL (data->nbStars_p) = (float) data->nbStars / (float) data->maxStars; + data->nbStars_p.change_listener (&data->nbStars_p); + data->maxStars = IVAL (data->nbStars_limit_p); + data->fx_mode = IVAL (data->fx_mode_p); + + /* look for events */ + if (info->sound.timeSinceLastGoom < 1) { + fs_sound_event_occured (_this, info); + if (goom_irand (info->gRandom, 20) == 1) { + IVAL (data->fx_mode_p) = goom_irand (info->gRandom, (LAST_FX * 3)); + data->fx_mode_p.change_listener (&data->fx_mode_p); + } + } + + /* update particules */ + for (i = 0; i < data->nbStars; ++i) { + updateStar (&data->stars[i]); + + /* dead particule */ + if (data->stars[i].age >= NCOL) + continue; + + /* choose the color of the particule */ + col = colval[(int) data->stars[i].age]; + + /* draws the particule */ + info->methods.draw_line (dest, (int) data->stars[i].x, + (int) data->stars[i].y, + (int) (data->stars[i].x - data->stars[i].vx * 6), + (int) (data->stars[i].y - data->stars[i].vy * 6), col, + (int) info->screen.width, (int) info->screen.height); + info->methods.draw_line (dest, (int) data->stars[i].x, + (int) data->stars[i].y, + (int) (data->stars[i].x - data->stars[i].vx * 2), + (int) (data->stars[i].y - data->stars[i].vy * 2), col, + (int) info->screen.width, (int) info->screen.height); + } + + /* look for dead particules */ + for (i = 0; i < data->nbStars;) { + + if ((data->stars[i].x > info->screen.width + 64) + || ((data->stars[i].vy >= 0) + && (data->stars[i].y - 16 * data->stars[i].vy > + info->screen.height)) + || (data->stars[i].x < -64) + || (data->stars[i].age >= NCOL)) { + data->stars[i] = data->stars[data->nbStars - 1]; + data->nbStars--; + } else + ++i; + } +} + +void +flying_star_create (VisualFX * vfx) +{ + vfx->init = fs_init; + vfx->free = fs_free; + vfx->apply = fs_apply; + vfx->fx_data = NULL; + vfx->params = NULL; +} diff --git a/gst/goom/goom.h b/gst/goom/goom.h new file mode 100644 index 0000000..ccfc3f2 --- /dev/null +++ b/gst/goom/goom.h @@ -0,0 +1,42 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _GOOMCORE_H +#define _GOOMCORE_H + +#include "goom_config.h" +#include "goom_plugin_info.h" + +#define NB_FX 10 + +PluginInfo *goom_init (guint32 resx, guint32 resy); +void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); + +/* + * forceMode == 0 : do nothing + * forceMode == -1 : lock the FX + * forceMode == 1..NB_FX : force a switch to FX n# forceMode + */ +guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps); + +/* returns 0 if the buffer wasn't accepted */ +int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); + +void goom_close (PluginInfo *goomInfo); + +#endif diff --git a/gst/goom/goom_config.h b/gst/goom/goom_config.h new file mode 100644 index 0000000..8daa1d6 --- /dev/null +++ b/gst/goom/goom_config.h @@ -0,0 +1,45 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 + +#if G_BYTE_ORDER == G_BIG_ENDIAN +#define COLOR_ARGB +#else +#define COLOR_BGRA +#endif + +#if 1 +/* ndef COLOR_BGRA */ +/** position des composantes **/ + #define BLEU 0 + #define VERT 1 + #define ROUGE 2 + #define ALPHA 3 +#else + #define ROUGE 1 + #define BLEU 3 + #define VERT 2 + #define ALPHA 0 +#endif + +#if defined (BUILD_MMX) && defined (HAVE_GCC_ASM) + +#define HAVE_MMX +#endif + diff --git a/gst/goom/goom_config_param.h b/gst/goom/goom_config_param.h new file mode 100644 index 0000000..15fd22f --- /dev/null +++ b/gst/goom/goom_config_param.h @@ -0,0 +1,134 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _CONFIG_PARAM_H +#define _CONFIG_PARAM_H + +#include + +/* + * File created on 2003-05-24 by Jeko. + * (c)2003, JC Hoelt for iOS-software. + * + * LGPL Licence. + */ + +typedef enum { + PARAM_INTVAL, + PARAM_FLOATVAL, + PARAM_BOOLVAL, + PARAM_STRVAL, + PARAM_LISTVAL, +} ParamType; + +struct IntVal { + int value; + int min; + int max; + int step; +}; +struct FloatVal { + float value; + float min; + float max; + float step; +}; +struct StrVal { + char *value; +}; +struct ListVal { + char *value; + int nbChoices; + char **choices; +}; +struct BoolVal { + int value; +}; + + +typedef struct _PARAM { + const char *name; + const char *desc; + char rw; + ParamType type; + union { + struct IntVal ival; + struct FloatVal fval; + struct StrVal sval; + struct ListVal slist; + struct BoolVal bval; + } param; + + /* used by the core to inform the GUI of a change */ + void (*change_listener)(struct _PARAM *_this); + + /* used by the GUI to inform the core of a change */ + void (*changed)(struct _PARAM *_this); + + void *user_data; /* can be used by the GUI */ +} PluginParam; + +#define IVAL(p) ((p).param.ival.value) +#define SVAL(p) ((p).param.sval.value) +#define FVAL(p) ((p).param.fval.value) +#define BVAL(p) ((p).param.bval.value) +#define LVAL(p) ((p).param.slist.value) + +#define FMIN(p) ((p).param.fval.min) +#define FMAX(p) ((p).param.fval.max) +#define FSTEP(p) ((p).param.fval.step) + +#define IMIN(p) ((p).param.ival.min) +#define IMAX(p) ((p).param.ival.max) +#define ISTEP(p) ((p).param.ival.step) + +void goom_secure_param(PluginParam *p); + +void goom_secure_f_param(PluginParam *p, const char *name); +void goom_secure_i_param(PluginParam *p, const char *name); +void goom_secure_b_param(PluginParam *p, const char *name, int value); +void goom_secure_s_param(PluginParam *p, const char *name); + +void goom_secure_f_feedback(PluginParam *p, const char *name); +void goom_secure_i_feedback(PluginParam *p, const char *name); + +void goom_set_str_param_value(PluginParam *p, const char *str); +void goom_set_list_param_value(PluginParam *p, const char *str); + +typedef struct _PARAMETERS { + const char *name; + const char *desc; + int nbParams; + PluginParam **params; +} PluginParameters; + +void goom_plugin_parameters(PluginParameters *p, const char *name, int nb); +void goom_plugin_parameters_free(PluginParameters *p); + +#define secure_param goom_secure_param +#define secure_f_param goom_secure_f_param +#define secure_i_param goom_secure_i_param +#define secure_b_param goom_secure_b_param +#define secure_s_param goom_secure_s_param +#define secure_f_feedback goom_secure_f_feedback +#define secure_i_feedback goom_secure_i_feedback +#define set_list_param_value goom_set_list_param_value +#define set_str_param_value goom_set_str_param_value +#define plugin_parameters goom_plugin_parameters + +#endif diff --git a/gst/goom/goom_core.c b/gst/goom/goom_core.c new file mode 100644 index 0000000..7c2aef1 --- /dev/null +++ b/gst/goom/goom_core.c @@ -0,0 +1,853 @@ +/* Goom Project + * Copyright (C) <2003> Jean-Christophe Hoelt + * + * goom_core.c:Contains the core of goom's work. + * + * 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 +#include +#include +#include + +#ifdef HAVE_INTTYPES_H +#include +#endif + +#include "goom.h" +#include "goom_tools.h" +#include "goom_filters.h" +#include "lines.h" +#include "ifs.h" +#include "tentacle3d.h" + +#include "sound_tester.h" +#include "goom_plugin_info.h" +#include "goom_fx.h" + +/* #define VERBOSE */ + +#define STOP_SPEED 128 +/* TODO: put that as variable in PluginInfo */ +#define TIME_BTW_CHG 300 + +static void choose_a_goom_line (PluginInfo * goomInfo, float *param1, + float *param2, int *couleur, int *mode, float *amplitude, int far); + +static void +init_buffers (PluginInfo * goomInfo, int buffsize) +{ + goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + memset (goomInfo->pixel, 0, buffsize * sizeof (guint32) + 128); + goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + memset (goomInfo->back, 0, buffsize * sizeof (guint32) + 128); + goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); + memset (goomInfo->conv, 0, buffsize * sizeof (guint32) + 128); + + goomInfo->outputBuf = goomInfo->conv; + + goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); + goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); +} + +/************************** +* INIT * +**************************/ +PluginInfo * +goom_init (guint32 resx, guint32 resy) +{ + PluginInfo *goomInfo = (PluginInfo *) malloc (sizeof (PluginInfo)); + +#ifdef VERBOSE + printf ("GOOM: init (%d, %d);\n", resx, resy); +#endif + + plugin_info_init (goomInfo, 4); + + goomInfo->screen.width = resx; + goomInfo->screen.height = resy; + goomInfo->screen.size = resx * resy; + + init_buffers (goomInfo, goomInfo->screen.size); + goomInfo->gRandom = goom_random_init ((uintptr_t) goomInfo->pixel); + + goomInfo->cycle = 0; + + flying_star_create (&goomInfo->star_fx); + goomInfo->star_fx.init (&goomInfo->star_fx, goomInfo); + + zoomFilterVisualFXWrapper_create (&goomInfo->zoomFilter_fx); + goomInfo->zoomFilter_fx.init (&goomInfo->zoomFilter_fx, goomInfo); + + tentacle_fx_create (&goomInfo->tentacles_fx); + goomInfo->tentacles_fx.init (&goomInfo->tentacles_fx, goomInfo); + + convolve_create (&goomInfo->convolve_fx); + goomInfo->convolve_fx.init (&goomInfo->convolve_fx, goomInfo); + + plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); + plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); + plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); + plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); + + ifs_visualfx_create (&goomInfo->ifs_fx); + goomInfo->ifs_fx.init (&goomInfo->ifs_fx, goomInfo); + + goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, + GML_HLINE, goomInfo->screen.height, GML_BLACK, + GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); + goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, + GML_HLINE, 0, GML_BLACK, + GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); + + /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ + + return goomInfo; +} + + + +void +goom_set_resolution (PluginInfo * goomInfo, guint32 resx, guint32 resy) +{ + free (goomInfo->pixel); + free (goomInfo->back); + free (goomInfo->conv); + + goomInfo->screen.width = resx; + goomInfo->screen.height = resy; + goomInfo->screen.size = resx * resy; + + init_buffers (goomInfo, goomInfo->screen.size); + + /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ + goomInfo->ifs_fx.free (&goomInfo->ifs_fx); + goomInfo->ifs_fx.init (&goomInfo->ifs_fx, goomInfo); + + goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); + goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); +} + +int +goom_set_screenbuffer (PluginInfo * goomInfo, void *buffer) +{ + goomInfo->outputBuf = (Pixel *) buffer; + return 1; +} + +/******************************************** +* UPDATE * +******************************************** + +* WARNING: this is a 600 lines function ! (21-11-2003) +*/ +guint32 * +goom_update (PluginInfo * goomInfo, gint16 data[2][512], int forceMode, + float fps) +{ + Pixel *return_val; + guint32 pointWidth; + guint32 pointHeight; + int i; + float largfactor; /* elargissement de l'intervalle d'�volution des points */ + Pixel *tmp; + + ZoomFilterData *pzfd; + + /* test if the config has changed, update it if so */ + pointWidth = (goomInfo->screen.width * 2) / 5; + pointHeight = ((goomInfo->screen.height) * 2) / 5; + + /* ! etude du signal ... */ + evaluate_sound (data, &(goomInfo->sound)); + + /* goom_execute_main_script(goomInfo); */ + + /* ! calcul du deplacement des petits points ... */ + largfactor = + goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; + + if (largfactor > 1.5f) + largfactor = 1.5f; + + goomInfo->update.decay_ifs--; + if (goomInfo->update.decay_ifs > 0) + goomInfo->update.ifs_incr += 2; + if (goomInfo->update.decay_ifs == 0) + goomInfo->update.ifs_incr = 0; + + if (goomInfo->update.recay_ifs) { + goomInfo->update.ifs_incr -= 2; + goomInfo->update.recay_ifs--; + if ((goomInfo->update.recay_ifs == 0) && (goomInfo->update.ifs_incr <= 0)) + goomInfo->update.ifs_incr = 1; + } + + if (goomInfo->update.ifs_incr > 0) + goomInfo->ifs_fx.apply (&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, + goomInfo); + + if (goomInfo->curGState->drawPoints) { + for (i = 1; i * 15 <= goomInfo->sound.speedvar * 80.0f + 15; i++) { + goomInfo->update.loopvar += goomInfo->sound.speedvar * 50 + 1; + + pointFilter (goomInfo, goomInfo->p1, + YELLOW, + ((pointWidth - 6.0f) * largfactor + 5.0f), + ((pointHeight - 6.0f) * largfactor + 5.0f), + i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032); + pointFilter (goomInfo, goomInfo->p1, ORANGE, + ((pointWidth / 2) * largfactor) / i + 10.0f * i, + ((pointHeight / 2) * largfactor) / i + 10.0f * i, + 96.0f, i * 80.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, VIOLET, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + i + 122.0f, 134.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, BLACK, + ((pointHeight / 3) * largfactor + 20.0f), + ((pointHeight / 3) * largfactor + 20.0f), + 58.0f, i * 66.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, WHITE, + (pointHeight * largfactor + 10.0f * i) / i, + (pointHeight * largfactor + 10.0f * i) / i, + 66.0f, 74.0f, goomInfo->update.loopvar + i * 500); + } + } + + /* par d�faut pas de changement de zoom */ + pzfd = NULL; + + /* + * Test forceMode + */ +#ifdef VERBOSE + if (forceMode != 0) { + printf ("forcemode = %d\n", forceMode); + } +#endif + + + /* diminuer de 1 le temps de lockage */ + /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ + /* changement d'etat du plugin juste apres un autre changement d'etat. oki */ + if (--goomInfo->update.lockvar < 0) + goomInfo->update.lockvar = 0; + + /* on verifie qu'il ne se pas un truc interressant avec le son. */ + if ((goomInfo->sound.timeSinceLastGoom == 0) + || (forceMode > 0) + || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { + + /* changement eventuel de mode */ + if (goom_irand (goomInfo->gRandom, 16) == 0) + switch (goom_irand (goomInfo->gRandom, 34)) { + case 0: + case 10: + goomInfo->update.zoomFilterData.hypercosEffect = + goom_irand (goomInfo->gRandom, 2); + case 13: + case 20: + case 21: + goomInfo->update.zoomFilterData.mode = WAVE_MODE; + goomInfo->update.zoomFilterData.reverse = 0; + goomInfo->update.zoomFilterData.waveEffect = + (goom_irand (goomInfo->gRandom, 3) == 0); + if (goom_irand (goomInfo->gRandom, 2)) + goomInfo->update.zoomFilterData.vitesse = + (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; + break; + case 1: + case 11: + goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 2: + case 12: + goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 3: + goomInfo->update.zoomFilterData.mode = WATER_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 4: + case 14: + goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 5: + case 15: + case 22: + goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = + (goom_irand (goomInfo->gRandom, 3) == 0); + break; + case 6: + case 16: + goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 7: + case 17: + goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; + goomInfo->update.zoomFilterData.waveEffect = + (goom_irand (goomInfo->gRandom, 4) == 0); + goomInfo->update.zoomFilterData.hypercosEffect = + goom_irand (goomInfo->gRandom, 2); + break; + case 8: + case 18: + case 19: + goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; + goomInfo->update.zoomFilterData.waveEffect = 1; + goomInfo->update.zoomFilterData.hypercosEffect = 1; + break; + case 29: + case 30: + goomInfo->update.zoomFilterData.mode = YONLY_MODE; + break; + case 31: + case 32: + case 33: + goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; + break; + default: + goomInfo->update.zoomFilterData.mode = NORMAL_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + } + } + + /* tout ceci ne sera fait qu'en cas de non-blocage */ + if (goomInfo->update.lockvar == 0) { + /* reperage de goom (acceleration forte de l'acceleration du volume) */ + /* -> coup de boost de la vitesse si besoin.. */ + if (goomInfo->sound.timeSinceLastGoom == 0) { + + int i; + + goomInfo->update.goomvar++; + + /* SELECTION OF THE GOOM STATE */ + if ((!goomInfo->update.stateSelectionBlocker) + && (goom_irand (goomInfo->gRandom, 3))) { + goomInfo->update.stateSelectionRnd = + goom_irand (goomInfo->gRandom, goomInfo->statesRangeMax); + goomInfo->update.stateSelectionBlocker = 3; + } else if (goomInfo->update.stateSelectionBlocker) + goomInfo->update.stateSelectionBlocker--; + + for (i = 0; i < goomInfo->statesNumber; i++) + if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) + && (goomInfo->update.stateSelectionRnd <= + goomInfo->states[i].rangemax)) + goomInfo->curGState = &(goomInfo->states[i]); + + if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr <= 0)) { + goomInfo->update.recay_ifs = 5; + goomInfo->update.ifs_incr = 11; + } + + if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr > 0) + && (goomInfo->update.decay_ifs <= 0)) + goomInfo->update.decay_ifs = 100; + + if (!goomInfo->curGState->drawScope) + goomInfo->update.stop_lines = 0xf000 & 5; + + if (!goomInfo->curGState->drawScope) { + goomInfo->update.stop_lines = 0; + goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; + } + + /* if (goomInfo->update.goomvar % 1 == 0) */ + { + guint32 vtmp; + guint32 newvit; + + goomInfo->update.lockvar = 50; + newvit = + STOP_SPEED + 1 - + ((float) 3.5f * log10 (goomInfo->sound.speedvar * 60 + 1)); + /* retablir le zoom avant.. */ + if ((goomInfo->update.zoomFilterData.reverse) + && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { + goomInfo->update.zoomFilterData.reverse = 0; + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; + goomInfo->update.lockvar = 75; + } + if (goom_irand (goomInfo->gRandom, 10) == 0) { + goomInfo->update.zoomFilterData.reverse = 1; + goomInfo->update.lockvar = 100; + } + + if (goom_irand (goomInfo->gRandom, 10) == 0) + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; + if (goom_irand (goomInfo->gRandom, 12) == 0) + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; + + /* changement de milieu.. */ + switch (goom_irand (goomInfo->gRandom, 25)) { + case 0: + case 3: + case 6: + goomInfo->update.zoomFilterData.middleY = + goomInfo->screen.height - 1; + goomInfo->update.zoomFilterData.middleX = + goomInfo->screen.width / 2; + break; + case 1: + case 4: + goomInfo->update.zoomFilterData.middleX = + goomInfo->screen.width - 1; + break; + case 2: + case 5: + goomInfo->update.zoomFilterData.middleX = 1; + break; + default: + goomInfo->update.zoomFilterData.middleY = + goomInfo->screen.height / 2; + goomInfo->update.zoomFilterData.middleX = + goomInfo->screen.width / 2; + } + + if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) + || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) + || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; + } + + switch (vtmp = (goom_irand (goomInfo->gRandom, 15))) { + case 0: + goomInfo->update.zoomFilterData.vPlaneEffect = + goom_irand (goomInfo->gRandom, 3) + - goom_irand (goomInfo->gRandom, 3); + goomInfo->update.zoomFilterData.hPlaneEffect = + goom_irand (goomInfo->gRandom, 3) + - goom_irand (goomInfo->gRandom, 3); + break; + case 3: + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = + goom_irand (goomInfo->gRandom, 8) + - goom_irand (goomInfo->gRandom, 8); + break; + case 4: + case 5: + case 6: + case 7: + goomInfo->update.zoomFilterData.vPlaneEffect = + goom_irand (goomInfo->gRandom, 5) + - goom_irand (goomInfo->gRandom, 5); + goomInfo->update.zoomFilterData.hPlaneEffect = + -goomInfo->update.zoomFilterData.vPlaneEffect; + break; + case 8: + goomInfo->update.zoomFilterData.hPlaneEffect = + 5 + goom_irand (goomInfo->gRandom, 8); + goomInfo->update.zoomFilterData.vPlaneEffect = + -goomInfo->update.zoomFilterData.hPlaneEffect; + break; + case 9: + goomInfo->update.zoomFilterData.vPlaneEffect = + 5 + goom_irand (goomInfo->gRandom, 8); + goomInfo->update.zoomFilterData.hPlaneEffect = + -goomInfo->update.zoomFilterData.hPlaneEffect; + break; + case 13: + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + goomInfo->update.zoomFilterData.vPlaneEffect = + goom_irand (goomInfo->gRandom, 10) + - goom_irand (goomInfo->gRandom, 10); + break; + case 14: + goomInfo->update.zoomFilterData.hPlaneEffect = + goom_irand (goomInfo->gRandom, 10) + - goom_irand (goomInfo->gRandom, 10); + goomInfo->update.zoomFilterData.vPlaneEffect = + goom_irand (goomInfo->gRandom, 10) + - goom_irand (goomInfo->gRandom, 10); + break; + default: + if (vtmp < 10) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + } + } + + if (goom_irand (goomInfo->gRandom, 5) != 0) + goomInfo->update.zoomFilterData.noisify = 0; + else { + goomInfo->update.zoomFilterData.noisify = + goom_irand (goomInfo->gRandom, 2) + 1; + goomInfo->update.lockvar *= 2; + } + + if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + goomInfo->update.zoomFilterData.noisify = 0; + } + + if ((goomInfo->update.zoomFilterData.middleX == 1) + || (goomInfo->update.zoomFilterData.middleX == + (signed int) goomInfo->screen.width - 1)) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + if (goom_irand (goomInfo->gRandom, 2)) + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + } + + if ((signed int) newvit < goomInfo->update.zoomFilterData.vitesse) { /* on accelere */ + pzfd = &goomInfo->update.zoomFilterData; + if (((newvit < STOP_SPEED - 7) && + (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && + (goomInfo->cycle % 3 == 0)) + || (goom_irand (goomInfo->gRandom, 40) == 0)) { + goomInfo->update.zoomFilterData.vitesse = + STOP_SPEED - goom_irand (goomInfo->gRandom, 2) + + goom_irand (goomInfo->gRandom, 2); + goomInfo->update.zoomFilterData.reverse = + !goomInfo->update.zoomFilterData.reverse; + } else { + goomInfo->update.zoomFilterData.vitesse = + (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; + } + goomInfo->update.lockvar += 50; + } + } + + if (goomInfo->update.lockvar > 150) { + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + goomInfo->update.switchMult = 1.0f; + } + } + /* mode mega-lent */ + if (goom_irand (goomInfo->gRandom, 700) == 0) { + /* + * printf ("coup du sort...\n") ; + */ + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + goomInfo->update.goomvar = 1; + goomInfo->update.lockvar += 50; + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + goomInfo->update.switchMult = 1.0f; + } + } + + /* + * gros frein si la musique est calme + */ + if ((goomInfo->sound.speedvar < 0.01f) + && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) + && (goomInfo->cycle % 16 == 0)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse += 3; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + goomInfo->update.goomvar = 0; + } + + /* + * baisser regulierement la vitesse... + */ + if ((goomInfo->cycle % 73 == 0) + && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse++; + } + + /* + * arreter de decr�menter au bout d'un certain temps + */ + if ((goomInfo->cycle % 101 == 0) + && (goomInfo->update.zoomFilterData.pertedec == 7)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + } + + /* + * Permet de forcer un effet. + */ + if ((forceMode > 0) && (forceMode <= NB_FX)) { + pzfd = &goomInfo->update.zoomFilterData; + pzfd->mode = forceMode - 1; + } + + if (forceMode == -1) { + pzfd = NULL; + } + + /* + * Changement d'effet de zoom ! + */ + if (pzfd != NULL) { + int dif; + + goomInfo->update.cyclesSinceLastChange = 0; + + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + + dif = + goomInfo->update.zoomFilterData.vitesse - + goomInfo->update.previousZoomSpeed; + if (dif < 0) + dif = -dif; + + if (dif > 2) { + goomInfo->update.switchIncr *= (dif + 2) / 2; + } + goomInfo->update.previousZoomSpeed = + goomInfo->update.zoomFilterData.vitesse; + goomInfo->update.switchMult = 1.0f; + + if (((goomInfo->sound.timeSinceLastGoom == 0) + && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { + goomInfo->update.switchIncr = 0; + goomInfo->update.switchMult = goomInfo->update.switchMultAmount; + } + } else { + if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.cyclesSinceLastChange = 0; + } else + goomInfo->update.cyclesSinceLastChange++; + } + +#ifdef VERBOSE + if (pzfd) { + printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); + } +#endif + + /* Zoom here ! */ + zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, + goomInfo->screen.width, goomInfo->screen.height, + goomInfo->update.switchIncr, goomInfo->update.switchMult); + + /* + * Affichage tentacule + */ + + goomInfo->tentacles_fx.apply (&goomInfo->tentacles_fx, goomInfo->p1, + goomInfo->p2, goomInfo); + goomInfo->star_fx.apply (&goomInfo->star_fx, goomInfo->p2, goomInfo->p1, + goomInfo); + + /* + * Gestion du Scope + */ + + /* + * arret demande + */ + if ((goomInfo->update.stop_lines & 0xf000) + || (!goomInfo->curGState->drawScope)) { + float param1, param2, amplitude; + int couleur; + int mode; + + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude, + 1); + couleur = GML_BLACK; + + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); + goomInfo->update.stop_lines &= 0x0fff; + } + + /* + * arret aleatore.. changement de mode de ligne.. + */ + if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { + goomInfo->update.lineMode--; + if (goomInfo->update.lineMode == -1) + goomInfo->update.lineMode = 0; + } else if ((goomInfo->cycle % 80 == 0) + && (goom_irand (goomInfo->gRandom, 5) == 0) && goomInfo->update.lineMode) + goomInfo->update.lineMode--; + + if ((goomInfo->cycle % 120 == 0) + && (goom_irand (goomInfo->gRandom, 4) == 0) + && (goomInfo->curGState->drawScope)) { + if (goomInfo->update.lineMode == 0) + goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; + else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { + float param1, param2, amplitude; + int couleur1, couleur2; + int mode; + + goomInfo->update.lineMode--; + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, + &mode, &litude, goomInfo->update.stop_lines); + + couleur2 = 5 - couleur1; + if (goomInfo->update.stop_lines) { + goomInfo->update.stop_lines--; + if (goom_irand (goomInfo->gRandom, 2)) + couleur2 = couleur1 = GML_BLACK; + } + + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, + couleur1); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, + couleur2); + } + } + + /* + * si on est dans un goom : afficher les lignes... + */ + if ((goomInfo->update.lineMode != 0) + || (goomInfo->sound.timeSinceLastGoom < 5)) { + goomInfo->gmline2->power = goomInfo->gmline1->power; + + goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); + goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); + + if (((goomInfo->cycle % 121) == 9) + && (goom_irand (goomInfo->gRandom, 3) == 1) + && ((goomInfo->update.lineMode == 0) + || (goomInfo->update.lineMode == + goomInfo->update.drawLinesDuration))) { + float param1, param2, amplitude; + int couleur1, couleur2; + int mode; + + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, + &mode, &litude, goomInfo->update.stop_lines); + couleur2 = 5 - couleur1; + + if (goomInfo->update.stop_lines) { + goomInfo->update.stop_lines--; + if (goom_irand (goomInfo->gRandom, 2)) + couleur2 = couleur1 = GML_BLACK; + } + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, + couleur1); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, + couleur2); + } + } + + return_val = goomInfo->p1; + tmp = goomInfo->p1; + goomInfo->p1 = goomInfo->p2; + goomInfo->p2 = tmp; + + /* affichage et swappage des buffers.. */ + goomInfo->cycle++; + + goomInfo->convolve_fx.apply (&goomInfo->convolve_fx, return_val, + goomInfo->outputBuf, goomInfo); + + return (guint32 *) goomInfo->outputBuf; +} + +/**************************************** +* CLOSE * +****************************************/ +void +goom_close (PluginInfo * goomInfo) +{ + if (goomInfo->pixel != NULL) + free (goomInfo->pixel); + if (goomInfo->back != NULL) + free (goomInfo->back); + if (goomInfo->conv != NULL) + free (goomInfo->conv); + + goomInfo->pixel = goomInfo->back = NULL; + goomInfo->conv = NULL; + goom_random_free (goomInfo->gRandom); + goom_lines_free (&goomInfo->gmline1); + goom_lines_free (&goomInfo->gmline2); + + /* release_ifs (); */ + goomInfo->ifs_fx.free (&goomInfo->ifs_fx); + goomInfo->convolve_fx.free (&goomInfo->convolve_fx); + goomInfo->star_fx.free (&goomInfo->star_fx); + goomInfo->tentacles_fx.free (&goomInfo->tentacles_fx); + goomInfo->zoomFilter_fx.free (&goomInfo->zoomFilter_fx); + + plugin_info_free (goomInfo); + free (goomInfo); +} + + +/* *** */ +void +choose_a_goom_line (PluginInfo * goomInfo, float *param1, float *param2, + int *couleur, int *mode, float *amplitude, int far) +{ + *mode = goom_irand (goomInfo->gRandom, 3); + *amplitude = 1.0f; + switch (*mode) { + case GML_CIRCLE: + if (far) { + *param1 = *param2 = 0.47f; + *amplitude = 0.8f; + break; + } + if (goom_irand (goomInfo->gRandom, 3) == 0) { + *param1 = *param2 = 0; + *amplitude = 3.0f; + } else if (goom_irand (goomInfo->gRandom, 2)) { + *param1 = 0.40f * goomInfo->screen.height; + *param2 = 0.22f * goomInfo->screen.height; + } else { + *param1 = *param2 = goomInfo->screen.height * 0.35; + } + break; + case GML_HLINE: + if (goom_irand (goomInfo->gRandom, 4) || far) { + *param1 = goomInfo->screen.height / 7; + *param2 = 6.0f * goomInfo->screen.height / 7.0f; + } else { + *param1 = *param2 = goomInfo->screen.height / 2.0f; + *amplitude = 2.0f; + } + break; + case GML_VLINE: + if (goom_irand (goomInfo->gRandom, 3) || far) { + *param1 = goomInfo->screen.width / 7.0f; + *param2 = 6.0f * goomInfo->screen.width / 7.0f; + } else { + *param1 = *param2 = goomInfo->screen.width / 2.0f; + *amplitude = 1.5f; + } + break; + } + + *couleur = goom_irand (goomInfo->gRandom, 6); +} diff --git a/gst/goom/goom_filters.h b/gst/goom/goom_filters.h new file mode 100644 index 0000000..5c6545a --- /dev/null +++ b/gst/goom/goom_filters.h @@ -0,0 +1,70 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 FILTERS_H +#define FILTERS_H + +#include "goom_config.h" +#include "goom_typedefs.h" +#include "goom_visual_fx.h" +#include "goom_graphic.h" + +void zoomFilterVisualFXWrapper_create(VisualFX *fx); + +struct _ZOOM_FILTER_DATA +{ + int vitesse; /* 128 = vitesse nule... * * 256 = en arriere + * hyper vite.. * * 0 = en avant hype vite. */ + unsigned char pertedec; + unsigned char sqrtperte; + int middleX, middleY; /* milieu de l'effet */ + char reverse; /* inverse la vitesse */ + char mode; /* type d'effet � appliquer (cf les #define) */ + /** @since June 2001 */ + int hPlaneEffect; /* deviation horitontale */ + int vPlaneEffect; /* deviation verticale */ + /** @since April 2002 */ + int waveEffect; /* applique une "surcouche" de wave effect */ + int hypercosEffect; /* applique une "surcouche de hypercos effect */ + + char noisify; /* ajoute un bruit a la transformation */ +}; + +#define NORMAL_MODE 0 +#define WAVE_MODE 1 +#define CRYSTAL_BALL_MODE 2 +#define SCRUNCH_MODE 3 +#define AMULETTE_MODE 4 +#define WATER_MODE 5 +#define HYPERCOS1_MODE 6 +#define HYPERCOS2_MODE 7 +#define YONLY_MODE 8 +#define SPEEDWAY_MODE 9 + +void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, + float t1, float t2, float t3, float t4, guint32 cycle); + +/* filtre de zoom : + * le contenu de pix1 est copie dans pix2. + * zf : si non NULL, configure l'effet. + * resx,resy : taille des buffers. + */ +void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, + guint32 resy, int switchIncr, float switchMult); + +#endif diff --git a/gst/goom/goom_fx.h b/gst/goom/goom_fx.h new file mode 100644 index 0000000..b239a38 --- /dev/null +++ b/gst/goom/goom_fx.h @@ -0,0 +1,30 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _GOOM_FX_H +#define _GOOM_FX_H + +#include "goom_visual_fx.h" +#include "goom_plugin_info.h" + +void convolve_create (VisualFX *vfx); +void flying_star_create (VisualFX *vfx); + +void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + +#endif diff --git a/gst/goom/goom_graphic.h b/gst/goom/goom_graphic.h new file mode 100644 index 0000000..7632205 --- /dev/null +++ b/gst/goom/goom_graphic.h @@ -0,0 +1,92 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 GRAPHIC_H +#define GRAPHIC_H + +typedef unsigned int Uint; + +typedef struct +{ + unsigned short r, v, b; +} +Color; + +extern const Color BLACK; +extern const Color WHITE; +extern const Color RED; +extern const Color BLUE; +extern const Color GREEN; +extern const Color YELLOW; +extern const Color ORANGE; +extern const Color VIOLET; + + +#ifdef COLOR_BGRA + +#define B_CHANNEL 0xFF000000 +#define G_CHANNEL 0x00FF0000 +#define R_CHANNEL 0x0000FF00 +#define A_CHANNEL 0x000000FF +#define B_OFFSET 24 +#define G_OFFSET 16 +#define R_OFFSET 8 +#define A_OFFSET 0 + +typedef union _PIXEL { + struct { + unsigned char b; + unsigned char g; + unsigned char r; + unsigned char a; + } channels; + unsigned int val; + unsigned char cop[4]; +} Pixel; + +#else + +#define A_CHANNEL 0xFF000000 +#define R_CHANNEL 0x00FF0000 +#define G_CHANNEL 0x0000FF00 +#define B_CHANNEL 0x000000FF +#define A_OFFSET 24 +#define R_OFFSET 16 +#define G_OFFSET 8 +#define B_OFFSET 0 + +typedef union _PIXEL { + struct { + unsigned char a; + unsigned char r; + unsigned char g; + unsigned char b; + } channels; + unsigned int val; + unsigned char cop[4]; +} Pixel; + +#endif /* COLOR_BGRA */ + +/* +inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); +inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); +*/ + + +#endif /* GRAPHIC_H */ diff --git a/gst/goom/goom_plugin_info.h b/gst/goom/goom_plugin_info.h new file mode 100644 index 0000000..294afe8 --- /dev/null +++ b/gst/goom/goom_plugin_info.h @@ -0,0 +1,181 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _PLUGIN_INFO_H +#define _PLUGIN_INFO_H + +#include "goom_typedefs.h" + +#include "goom_config.h" + +#include "goom_graphic.h" +#include "goom_config_param.h" +#include "goom_visual_fx.h" +#include "goom_filters.h" +#include "goom_tools.h" + +typedef struct { + char drawIFS; + char drawPoints; + char drawTentacle; + + char drawScope; + int farScope; + + int rangemin; + int rangemax; +} GoomState; + +#define STATES_MAX_NB 128 + +/** + * Gives informations about the sound. + */ +struct _SOUND_INFO { + + /* nota : a Goom is just a sound event... */ + + int timeSinceLastGoom; /* >= 0 */ + float goomPower; /* power of the last Goom [0..1] */ + + int timeSinceLastBigGoom; /* >= 0 */ + + float volume; /* [0..1] */ + short samples[2][512]; + + /* other "internal" datas for the sound_tester */ + float goom_limit; /* auto-updated limit of goom_detection */ + float bigGoomLimit; + float accelvar; /* acceleration of the sound - [0..1] */ + float speedvar; /* speed of the sound - [0..100] */ + int allTimesMax; + int totalgoom; /* number of goom since last reset + * (a reset every 64 cycles) */ + + float prov_max; /* accel max since last reset */ + + int cycle; + + /* private */ + PluginParam volume_p; + PluginParam speed_p; + PluginParam accel_p; + PluginParam goom_limit_p; + PluginParam goom_power_p; + PluginParam last_goom_p; + PluginParam last_biggoom_p; + PluginParam biggoom_speed_limit_p; + PluginParam biggoom_factor_p; + + PluginParameters params; /* contains the previously defined parameters. */ +}; + + +/** + * Allows FXs to know the current state of the plugin. + */ +struct _PLUGIN_INFO { + + /* public datas */ + + int nbParams; + PluginParameters *params; + + /* private datas */ + + struct _SIZE_TYPE { + int width; + int height; + int size; /* == screen.height * screen.width. */ + } screen; + + SoundInfo sound; + + int nbVisuals; + VisualFX **visuals; /* pointers on all the visual fx */ + + /** The known FX */ + VisualFX convolve_fx; + VisualFX star_fx; + VisualFX zoomFilter_fx; + VisualFX tentacles_fx; + VisualFX ifs_fx; + + /** image buffers */ + guint32 *pixel; + guint32 *back; + Pixel *p1, *p2; + Pixel *conv; + Pixel *outputBuf; + + /** state of goom */ + guint32 cycle; + GoomState states[STATES_MAX_NB]; + int statesNumber; + int statesRangeMax; + + GoomState *curGState; + + /** effet de ligne.. */ + GMLine *gmline1; + GMLine *gmline2; + + /** sinus table */ + int sintable[0x10000]; + + /* INTERNALS */ + + /** goom_update internals. + * I took all static variables from goom_update and put them here.. for the moment. + */ + struct { + int lockvar; /* pour empecher de nouveaux changements */ + int goomvar; /* boucle des gooms */ + int loopvar; /* mouvement des points */ + int stop_lines; + int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ + int decay_ifs; /* disparition de l'ifs */ + int recay_ifs; /* dedisparition de l'ifs */ + int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ + int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ + int lineMode; /* l'effet lineaire a dessiner */ + float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ + int switchIncrAmount; /* 0x7f */ + float switchMult; /* 1.0f */ + int switchIncr; /* = SWITCHINCR; */ + int stateSelectionRnd; + int stateSelectionBlocker; + int previousZoomSpeed; + ZoomFilterData zoomFilterData; + } update; + + struct { + void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); + void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + } methods; + + GoomRandom *gRandom; +}; + +void plugin_info_init(PluginInfo *p, int nbVisual); +void plugin_info_free(PluginInfo *p); + +/* i = [0..p->nbVisual-1] */ +void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); + +#endif diff --git a/gst/goom/goom_tools.c b/gst/goom/goom_tools.c new file mode 100644 index 0000000..4f9a6b2 --- /dev/null +++ b/gst/goom/goom_tools.c @@ -0,0 +1,50 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "goom_tools.h" +#include + +GoomRandom * +goom_random_init (int i) +{ + GoomRandom *grandom = (GoomRandom *) malloc (sizeof (GoomRandom)); + + srand (i); + grandom->pos = 1; + goom_random_update_array (grandom, GOOM_NB_RAND); + return grandom; +} + +void +goom_random_free (GoomRandom * grandom) +{ + free (grandom); +} + +void +goom_random_update_array (GoomRandom * grandom, int numberOfValuesToChange) +{ + while (numberOfValuesToChange > 0) { +#if RAND_MAX < 0x10000 + grandom->array[grandom->pos++] = ((rand () << 16) + rand ()) / 127; +#else + grandom->array[grandom->pos++] = rand () / 127; +#endif + numberOfValuesToChange--; + } +} diff --git a/gst/goom/goom_tools.h b/gst/goom/goom_tools.h new file mode 100644 index 0000000..caaa219 --- /dev/null +++ b/gst/goom/goom_tools.h @@ -0,0 +1,53 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _GOOMTOOLS_H +#define _GOOMTOOLS_H + +#include "goom_config.h" + +/** + * Random number generator wrapper for faster random number. + */ + +#define GOOM_NB_RAND 0x10000 + +typedef struct _GOOM_RANDOM { + int array[GOOM_NB_RAND]; + unsigned short pos; +} GoomRandom; + +GoomRandom *goom_random_init(int i); +void goom_random_free(GoomRandom *grandom); + +inline static int goom_random(GoomRandom *grandom) { + + grandom->pos++; /* works because pos is an unsigned short */ + return grandom->array[grandom->pos]; +} + +inline static int goom_irand(GoomRandom *grandom, int i) { + + grandom->pos++; + return grandom->array[grandom->pos] % i; +} + +/* called to change the specified number of value in the array, so that the array does not remain the same*/ +void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); + +#endif diff --git a/gst/goom/goom_typedefs.h b/gst/goom/goom_typedefs.h new file mode 100644 index 0000000..7188b4b --- /dev/null +++ b/gst/goom/goom_typedefs.h @@ -0,0 +1,29 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _GOOM_TYPEDEFS_H +#define _GOOM_TYPEDEFS_H + +typedef struct _PLUGIN_INFO PluginInfo; +typedef struct _SOUND_INFO SoundInfo; +typedef struct _GMLINE GMLine; +typedef struct _GMUNITPOINTER GMUnitPointer; +typedef struct _ZOOM_FILTER_DATA ZoomFilterData; +typedef struct _VISUAL_FX VisualFX; + +#endif diff --git a/gst/goom/goom_visual_fx.h b/gst/goom/goom_visual_fx.h new file mode 100644 index 0000000..6f6f964 --- /dev/null +++ b/gst/goom/goom_visual_fx.h @@ -0,0 +1,35 @@ +/* Goom Project + * Copyright (C) <2003> Jean-Christophe Hoelt + * + * 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 _VISUAL_FX_H +#define _VISUAL_FX_H + +#include "goom_config_param.h" +#include "goom_graphic.h" +#include "goom_typedefs.h" + +struct _VISUAL_FX { + void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); + void (*free) (struct _VISUAL_FX *_this); + void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); + void *fx_data; + + PluginParameters *params; +}; + +#endif diff --git a/gst/goom/graphic.c b/gst/goom/graphic.c new file mode 100644 index 0000000..64c0223 --- /dev/null +++ b/gst/goom/graphic.c @@ -0,0 +1,28 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "goom_graphic.h" + +const Color BLACK = { 0, 0, 0 }; +const Color WHITE = { 0xff, 0xff, 0xff }; +const Color RED = { 0xff, 0x05, 0x05 }; +const Color GREEN = { 0x05, 0xff, 0x05 }; +const Color BLUE = { 0x05, 0x05, 0xff }; +const Color YELLOW = { 0xff, 0xff, 0x33 }; +const Color ORANGE = { 0xff, 0xcc, 0x05 }; +const Color VIOLET = { 0x55, 0x05, 0xff }; diff --git a/gst/goom/gstgoom.c b/gst/goom/gstgoom.c new file mode 100644 index 0000000..b05b8f3 --- /dev/null +++ b/gst/goom/gstgoom.c @@ -0,0 +1,676 @@ +/* gstgoom.c: implementation of goom drawing element + * Copyright (C) <2001> Richard Boulton + * (C) <2006> Wim Taymans + * + * 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-goom + * @see_also: synaesthesia + * + * Goom is an audio visualisation element. It creates warping structures + * based on the incoming audio signal. + * + * + * Example launch line + * |[ + * gst-launch -v audiotestsrc ! goom ! ffmpegcolorspace ! xvimagesink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "gstgoom.h" +#include +#include "goom.h" + +#if HAVE_ORC +#include +#endif + +GST_DEBUG_CATEGORY (goom_debug); +#define GST_CAT_DEFAULT goom_debug + +#define DEFAULT_WIDTH 320 +#define DEFAULT_HEIGHT 240 +#define DEFAULT_FPS_N 25 +#define DEFAULT_FPS_D 1 + +/* signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 + /* FILL ME */ +}; + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", /* the name of the pads */ + GST_PAD_SINK, /* type of the pad */ + GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */ + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 8000, 96000 ], " "channels = (int) { 1, 2 }") + ); + + +static void gst_goom_class_init (GstGoomClass * klass); +static void gst_goom_base_init (GstGoomClass * klass); +static void gst_goom_init (GstGoom * goom); +static void gst_goom_finalize (GObject * object); + +static GstStateChangeReturn gst_goom_change_state (GstElement * element, + GstStateChange transition); + +static GstFlowReturn gst_goom_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_goom_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_goom_sink_event (GstPad * pad, GstEvent * event); + +static gboolean gst_goom_src_query (GstPad * pad, GstQuery * query); + +static gboolean gst_goom_sink_setcaps (GstPad * pad, GstCaps * caps); +static gboolean gst_goom_src_setcaps (GstPad * pad, GstCaps * caps); + +static GstElementClass *parent_class = NULL; + +GType +gst_goom_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GstGoomClass), + (GBaseInitFunc) gst_goom_base_init, + NULL, + (GClassInitFunc) gst_goom_class_init, + NULL, + NULL, + sizeof (GstGoom), + 0, + (GInstanceInitFunc) gst_goom_init, + }; + + type = g_type_register_static (GST_TYPE_ELEMENT, "GstGoom", &info, 0); + } + return type; +} + +static void +gst_goom_base_init (GstGoomClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (element_class, "GOOM: what a GOOM!", + "Visualization", + "Takes frames of data and outputs video frames using the GOOM filter", + "Wim Taymans "); + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); +} + +static void +gst_goom_class_init (GstGoomClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_goom_finalize; + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_goom_change_state); +} + +static void +gst_goom_init (GstGoom * goom) +{ + /* create the sink and src pads */ + goom->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); + gst_pad_set_chain_function (goom->sinkpad, + GST_DEBUG_FUNCPTR (gst_goom_chain)); + gst_pad_set_event_function (goom->sinkpad, + GST_DEBUG_FUNCPTR (gst_goom_sink_event)); + gst_pad_set_setcaps_function (goom->sinkpad, + GST_DEBUG_FUNCPTR (gst_goom_sink_setcaps)); + gst_element_add_pad (GST_ELEMENT (goom), goom->sinkpad); + + goom->srcpad = gst_pad_new_from_static_template (&src_template, "src"); + gst_pad_set_setcaps_function (goom->srcpad, + GST_DEBUG_FUNCPTR (gst_goom_src_setcaps)); + gst_pad_set_event_function (goom->srcpad, + GST_DEBUG_FUNCPTR (gst_goom_src_event)); + gst_pad_set_query_function (goom->srcpad, + GST_DEBUG_FUNCPTR (gst_goom_src_query)); + gst_element_add_pad (GST_ELEMENT (goom), goom->srcpad); + + goom->adapter = gst_adapter_new (); + + goom->width = DEFAULT_WIDTH; + goom->height = DEFAULT_HEIGHT; + goom->fps_n = DEFAULT_FPS_N; /* desired frame rate */ + goom->fps_d = DEFAULT_FPS_D; /* desired frame rate */ + goom->channels = 0; + goom->rate = 0; + goom->duration = 0; + + goom->plugin = goom_init (goom->width, goom->height); +} + +static void +gst_goom_finalize (GObject * object) +{ + GstGoom *goom = GST_GOOM (object); + + goom_close (goom->plugin); + goom->plugin = NULL; + + g_object_unref (goom->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_goom_reset (GstGoom * goom) +{ + gst_adapter_clear (goom->adapter); + gst_segment_init (&goom->segment, GST_FORMAT_UNDEFINED); + + GST_OBJECT_LOCK (goom); + goom->proportion = 1.0; + goom->earliest_time = -1; + GST_OBJECT_UNLOCK (goom); +} + +static gboolean +gst_goom_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstGoom *goom; + GstStructure *structure; + gboolean res; + + goom = GST_GOOM (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + + res = gst_structure_get_int (structure, "channels", &goom->channels); + res &= gst_structure_get_int (structure, "rate", &goom->rate); + + goom->bps = goom->channels * sizeof (gint16); + + return res; +} + +static gboolean +gst_goom_src_setcaps (GstPad * pad, GstCaps * caps) +{ + GstGoom *goom; + GstStructure *structure; + + goom = GST_GOOM (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "width", &goom->width) || + !gst_structure_get_int (structure, "height", &goom->height) || + !gst_structure_get_fraction (structure, "framerate", &goom->fps_n, + &goom->fps_d)) + return FALSE; + + goom_set_resolution (goom->plugin, goom->width, goom->height); + + /* size of the output buffer in bytes, depth is always 4 bytes */ + goom->outsize = goom->width * goom->height * 4; + goom->duration = + gst_util_uint64_scale_int (GST_SECOND, goom->fps_d, goom->fps_n); + goom->spf = gst_util_uint64_scale_int (goom->rate, goom->fps_d, goom->fps_n); + goom->bpf = goom->spf * goom->bps; + + GST_DEBUG_OBJECT (goom, "dimension %dx%d, framerate %d/%d, spf %d", + goom->width, goom->height, goom->fps_n, goom->fps_d, goom->spf); + + return TRUE; +} + +static gboolean +gst_goom_src_negotiate (GstGoom * goom) +{ + GstCaps *othercaps, *target; + GstStructure *structure; + const GstCaps *templ; + + templ = gst_pad_get_pad_template_caps (goom->srcpad); + + GST_DEBUG_OBJECT (goom, "performing negotiation"); + + /* see what the peer can do */ + othercaps = gst_pad_peer_get_caps (goom->srcpad); + if (othercaps) { + target = gst_caps_intersect (othercaps, templ); + gst_caps_unref (othercaps); + + if (gst_caps_is_empty (target)) + goto no_format; + + gst_caps_truncate (target); + } else { + target = gst_caps_ref ((GstCaps *) templ); + } + + structure = gst_caps_get_structure (target, 0); + gst_structure_fixate_field_nearest_int (structure, "width", DEFAULT_WIDTH); + gst_structure_fixate_field_nearest_int (structure, "height", DEFAULT_HEIGHT); + gst_structure_fixate_field_nearest_fraction (structure, "framerate", + DEFAULT_FPS_N, DEFAULT_FPS_D); + + gst_pad_set_caps (goom->srcpad, target); + gst_caps_unref (target); + + return TRUE; + +no_format: + { + gst_caps_unref (target); + return FALSE; + } +} + +static gboolean +gst_goom_src_event (GstPad * pad, GstEvent * event) +{ + gboolean res; + GstGoom *goom; + + goom = GST_GOOM (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS: + { + gdouble proportion; + GstClockTimeDiff diff; + GstClockTime timestamp; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + /* save stuff for the _chain() function */ + GST_OBJECT_LOCK (goom); + goom->proportion = proportion; + if (diff >= 0) + /* we're late, this is a good estimate for next displayable + * frame (see part-qos.txt) */ + goom->earliest_time = timestamp + 2 * diff + goom->duration; + else + goom->earliest_time = timestamp + diff; + GST_OBJECT_UNLOCK (goom); + + res = gst_pad_push_event (goom->sinkpad, event); + break; + } + default: + res = gst_pad_push_event (goom->sinkpad, event); + break; + } + gst_object_unref (goom); + + return res; +} + +static gboolean +gst_goom_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean res; + GstGoom *goom; + + goom = GST_GOOM (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_START: + res = gst_pad_push_event (goom->srcpad, event); + break; + case GST_EVENT_FLUSH_STOP: + gst_goom_reset (goom); + res = gst_pad_push_event (goom->srcpad, event); + break; + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time; + gboolean update; + + /* the newsegment values are used to clip the input samples + * and to convert the incomming timestamps to running time so + * we can do QoS */ + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + + /* now configure the values */ + gst_segment_set_newsegment_full (&goom->segment, update, + rate, arate, format, start, stop, time); + + res = gst_pad_push_event (goom->srcpad, event); + break; + } + default: + res = gst_pad_push_event (goom->srcpad, event); + break; + } + gst_object_unref (goom); + + return res; +} + +static gboolean +gst_goom_src_query (GstPad * pad, GstQuery * query) +{ + gboolean res = FALSE; + GstGoom *goom; + + goom = GST_GOOM (gst_pad_get_parent (pad)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + /* We need to send the query upstream and add the returned latency to our + * own */ + GstClockTime min_latency, max_latency; + gboolean us_live; + GstClockTime our_latency; + guint max_samples; + + if (goom->rate == 0) + break; + + if ((res = gst_pad_peer_query (goom->sinkpad, query))) { + gst_query_parse_latency (query, &us_live, &min_latency, &max_latency); + + GST_DEBUG_OBJECT (goom, "Peer latency: min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + /* the max samples we must buffer buffer */ + max_samples = MAX (GOOM_SAMPLES, goom->spf); + our_latency = + gst_util_uint64_scale_int (max_samples, GST_SECOND, goom->rate); + + GST_DEBUG_OBJECT (goom, "Our latency: %" GST_TIME_FORMAT, + GST_TIME_ARGS (our_latency)); + + /* we add some latency but only if we need to buffer more than what + * upstream gives us */ + min_latency += our_latency; + if (max_latency != -1) + max_latency += our_latency; + + GST_DEBUG_OBJECT (goom, "Calculated total latency : min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + gst_query_set_latency (query, TRUE, min_latency, max_latency); + } + break; + } + default: + res = gst_pad_peer_query (goom->sinkpad, query); + break; + } + + gst_object_unref (goom); + + return res; +} + +static GstFlowReturn +get_buffer (GstGoom * goom, GstBuffer ** outbuf) +{ + GstFlowReturn ret; + + if (GST_PAD_CAPS (goom->srcpad) == NULL) { + if (!gst_goom_src_negotiate (goom)) + return GST_FLOW_NOT_NEGOTIATED; + } + + GST_DEBUG_OBJECT (goom, "allocating output buffer with caps %" + GST_PTR_FORMAT, GST_PAD_CAPS (goom->srcpad)); + + ret = + gst_pad_alloc_buffer_and_set_caps (goom->srcpad, + GST_BUFFER_OFFSET_NONE, goom->outsize, + GST_PAD_CAPS (goom->srcpad), outbuf); + if (ret != GST_FLOW_OK) + return ret; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_goom_chain (GstPad * pad, GstBuffer * buffer) +{ + GstGoom *goom; + GstFlowReturn ret; + GstBuffer *outbuf = NULL; + + goom = GST_GOOM (gst_pad_get_parent (pad)); + if (goom->bps == 0) { + ret = GST_FLOW_NOT_NEGOTIATED; + goto beach; + } + + /* If we don't have an output format yet, preallocate a buffer to try and + * set one */ + if (GST_PAD_CAPS (goom->srcpad) == NULL) { + ret = get_buffer (goom, &outbuf); + if (ret != GST_FLOW_OK) { + gst_buffer_unref (buffer); + goto beach; + } + } + + /* don't try to combine samples from discont buffer */ + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { + gst_adapter_clear (goom->adapter); + } + + GST_DEBUG_OBJECT (goom, + "Input buffer has %d samples, time=%" G_GUINT64_FORMAT, + GST_BUFFER_SIZE (buffer) / goom->bps, GST_BUFFER_TIMESTAMP (buffer)); + + /* Collect samples until we have enough for an output frame */ + gst_adapter_push (goom->adapter, buffer); + + ret = GST_FLOW_OK; + + while (TRUE) { + const guint16 *data; + gboolean need_skip; + guchar *out_frame; + gint i; + guint avail, to_flush; + guint64 dist, timestamp; + + avail = gst_adapter_available (goom->adapter); + GST_DEBUG_OBJECT (goom, "avail now %u", avail); + + /* we need GOOM_SAMPLES to get a meaningful result from goom. */ + if (avail < (GOOM_SAMPLES * goom->bps)) + break; + + /* we also need enough samples to produce one frame at least */ + if (avail < goom->bpf) + break; + + GST_DEBUG_OBJECT (goom, "processing buffer"); + + /* get timestamp of the current adapter byte */ + timestamp = gst_adapter_prev_timestamp (goom->adapter, &dist); + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + /* convert bytes to time */ + dist /= goom->bps; + timestamp += gst_util_uint64_scale_int (dist, GST_SECOND, goom->rate); + } + + if (timestamp != -1) { + gint64 qostime; + + qostime = gst_segment_to_running_time (&goom->segment, GST_FORMAT_TIME, + timestamp); + qostime += goom->duration; + + GST_OBJECT_LOCK (goom); + /* check for QoS, don't compute buffers that are known to be late */ + need_skip = goom->earliest_time != -1 && qostime <= goom->earliest_time; + GST_OBJECT_UNLOCK (goom); + + if (need_skip) { + GST_WARNING_OBJECT (goom, + "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT, + GST_TIME_ARGS (qostime), GST_TIME_ARGS (goom->earliest_time)); + goto skip; + } + } + + /* get next GOOM_SAMPLES, we have at least this amount of samples */ + data = + (const guint16 *) gst_adapter_peek (goom->adapter, + GOOM_SAMPLES * goom->bps); + + if (goom->channels == 2) { + for (i = 0; i < GOOM_SAMPLES; i++) { + goom->datain[0][i] = *data++; + goom->datain[1][i] = *data++; + } + } else { + for (i = 0; i < GOOM_SAMPLES; i++) { + goom->datain[0][i] = *data; + goom->datain[1][i] = *data++; + } + } + + /* alloc a buffer if we don't have one yet, this happens + * when we pushed a buffer in this while loop before */ + if (outbuf == NULL) { + ret = get_buffer (goom, &outbuf); + if (ret != GST_FLOW_OK) { + goto beach; + } + } + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = goom->duration; + GST_BUFFER_SIZE (outbuf) = goom->outsize; + + out_frame = (guchar *) goom_update (goom->plugin, goom->datain, 0, 0); + memcpy (GST_BUFFER_DATA (outbuf), out_frame, goom->outsize); + + GST_DEBUG ("Pushing frame with time=%" GST_TIME_FORMAT ", duration=%" + GST_TIME_FORMAT, GST_TIME_ARGS (timestamp), + GST_TIME_ARGS (goom->duration)); + + ret = gst_pad_push (goom->srcpad, outbuf); + outbuf = NULL; + + skip: + /* Now flush the samples we needed for this frame, which might be more than + * the samples we used (GOOM_SAMPLES). */ + to_flush = goom->bpf; + + GST_DEBUG_OBJECT (goom, "finished frame, flushing %u bytes from input", + to_flush); + gst_adapter_flush (goom->adapter, to_flush); + + if (ret != GST_FLOW_OK) + break; + } + + if (outbuf != NULL) + gst_buffer_unref (outbuf); + +beach: + gst_object_unref (goom); + + return ret; +} + +static GstStateChangeReturn +gst_goom_change_state (GstElement * element, GstStateChange transition) +{ + GstGoom *goom = GST_GOOM (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_goom_reset (goom); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (goom_debug, "goom", 0, "goom visualisation element"); + +#if HAVE_ORC + orc_init (); +#endif + + return gst_element_register (plugin, "goom", GST_RANK_NONE, GST_TYPE_GOOM); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "goom", + "GOOM visualization filter", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/goom/gstgoom.h b/gst/goom/gstgoom.h new file mode 100644 index 0000000..382d053 --- /dev/null +++ b/gst/goom/gstgoom.h @@ -0,0 +1,88 @@ +/* gstgoom.c: implementation of goom drawing element + * Copyright (C) <2001> Richard Boulton + * + * 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_GOOM_H__ +#define __GST_GOOM_H__ + +G_BEGIN_DECLS + +#include +#include +#include "goom.h" + +#define GOOM_SAMPLES 512 + +#define GST_TYPE_GOOM (gst_goom_get_type()) +#define GST_GOOM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GOOM,GstGoom)) +#define GST_GOOM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GOOM,GstGoomClass)) +#define GST_IS_GOOM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GOOM)) +#define GST_IS_GOOM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GOOM)) + +typedef struct _GstGoom GstGoom; +typedef struct _GstGoomClass GstGoomClass; + +struct _GstGoom +{ + GstElement element; + + /* pads */ + GstPad *sinkpad, *srcpad; + GstAdapter *adapter; + + /* input tracking */ + gint rate; + gint channels; + guint bps; + + /* video state */ + gint fps_n; + gint fps_d; + gint width; + gint height; + GstClockTime duration; + guint outsize; + + /* samples per frame */ + guint spf; + /* bytes per frame */ + guint bpf; + + /* goom stuff */ + gint16 datain[2][GOOM_SAMPLES]; + PluginInfo *plugin; + + /* segment state */ + GstSegment segment; + + /* QoS stuff *//* with LOCK */ + gdouble proportion; + GstClockTime earliest_time; +}; + +struct _GstGoomClass +{ + GstElementClass parent_class; +}; + +GType gst_goom_get_type (void); + +G_END_DECLS + +#endif /* __GST_GOOM_H__ */ + diff --git a/gst/goom/ifs.c b/gst/goom/ifs.c new file mode 100644 index 0000000..3684dcc --- /dev/null +++ b/gst/goom/ifs.c @@ -0,0 +1,774 @@ +/*- + * Copyright (c) 1997 by Massimino Pascal + * + * ifs.c: modified iterated functions system for goom. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * If this mode is weird and you have an old MetroX server, it is buggy. + * There is a free SuSE-enhanced MetroX X server that is fine. + * + * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." + * + * Revision History: + * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). + * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) + * 01-Nov-2000: Allocation checks + * 10-May-1997: jwz@jwz.org: turned into a standalone program. + * Made it render into an offscreen bitmap and then copy + * that onto the screen, to reduce flicker. + */ + +/* #ifdef STANDALONE */ + +#include +#include +#include + +#include "goom_config.h" + +#ifdef HAVE_MMX +#include "mmx.h" +#endif + +#include "goom_graphic.h" +#include "ifs.h" +#include "goom_tools.h" + +typedef struct _ifsPoint +{ + gint32 x, y; +} +IFSPoint; + + +#define MODE_ifs + +#define PROGCLASS "IFS" + +#define HACK_INIT init_ifs +#define HACK_DRAW draw_ifs + +#define ifs_opts xlockmore_opts + +#define DEFAULTS "*delay: 20000 \n" \ +"*ncolors: 100 \n" + +#define SMOOTH_COLORS + +#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) +#define NRAND(n) ((int) (LRAND() % (n))) + +#if RAND_MAX < 0x10000 +#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) +#else +#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ +#endif + +/*****************************************************/ + +typedef float DBL; +typedef int F_PT; + +/* typedef float F_PT; */ + +/*****************************************************/ + +#define FIX 12 +#define UNIT ( 1<c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0); + Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0); + Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0); + Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0); + Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (G_PI / 180.0); + Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (G_PI / 180.0); + Cur++; + } +} + +static void +free_ifs_buffers (FRACTAL * Fractal) +{ + if (Fractal->Buffer1 != NULL) { + (void) free ((void *) Fractal->Buffer1); + Fractal->Buffer1 = (IFSPoint *) NULL; + } + if (Fractal->Buffer2 != NULL) { + (void) free ((void *) Fractal->Buffer2); + Fractal->Buffer2 = (IFSPoint *) NULL; + } +} + + +static void +free_ifs (FRACTAL * Fractal) +{ + free_ifs_buffers (Fractal); +} + +/***************************************************************/ + +static void +init_ifs (PluginInfo * goomInfo, IfsData * data) +{ + int i; + FRACTAL *Fractal; + int width = goomInfo->screen.width; + int height = goomInfo->screen.height; + + if (data->Root == NULL) { + data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); + if (data->Root == NULL) + return; + data->Root->Buffer1 = (IFSPoint *) NULL; + data->Root->Buffer2 = (IFSPoint *) NULL; + } + Fractal = data->Root; + + free_ifs_buffers (Fractal); + + i = (NRAND (4)) + 2; /* Number of centers */ + switch (i) { + case 3: + Fractal->Depth = MAX_DEPTH_3; + Fractal->r_mean = .6; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 4: + Fractal->Depth = MAX_DEPTH_4; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 5: + Fractal->Depth = MAX_DEPTH_5; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + default: + case 2: + Fractal->Depth = MAX_DEPTH_2; + Fractal->r_mean = .7; + Fractal->dr_mean = .3; + Fractal->dr2_mean = .4; + break; + } + Fractal->Nb_Simi = i; + Fractal->Max_Pt = Fractal->Nb_Simi - 1; + for (i = 0; i <= Fractal->Depth + 2; ++i) + Fractal->Max_Pt *= Fractal->Nb_Simi; + + if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, + sizeof (IFSPoint))) == NULL) { + free_ifs (Fractal); + return; + } + if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, + sizeof (IFSPoint))) == NULL) { + free_ifs (Fractal); + return; + } + + Fractal->Speed = 6; + Fractal->Width = width; /* modif by JeKo */ + Fractal->Height = height; /* modif by JeKo */ + Fractal->Cur_Pt = 0; + Fractal->Count = 0; + Fractal->Lx = (Fractal->Width - 1) / 2; + Fractal->Ly = (Fractal->Height - 1) / 2; + Fractal->Col = rand () % (width * height); /* modif by JeKo */ + + Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); +} + + +/***************************************************************/ + +static inline void +Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) +{ + F_PT xx, yy; + + xo = xo - Simi->Cx; + xo = (xo * Simi->R) >> FIX; /* / UNIT; */ + yo = yo - Simi->Cy; + yo = (yo * Simi->R) >> FIX; /* / UNIT; */ + + xx = xo - Simi->Cx; + xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ + yy = -yo - Simi->Cy; + yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ + + *x = ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) + >> FIX /* / UNIT */ ) + Simi->Cx; + *y = ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) + >> FIX /* / UNIT */ ) + Simi->Cy; +} + +/***************************************************************/ + +static void +Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData * data) +{ + F_PT x, y, i; + SIMI *Cur; + + Cur = data->Cur_F->Components; + for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { + Transform (Cur, xo, yo, &x, &y); + + data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX + 1) /* /(UNIT*2) */ ); + data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX + 1) /* /(UNIT*2) */ ); + data->Buf++; + + data->Cur_Pt++; + + if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { + F->Depth--; + Trace (F, x, y, data); + F->Depth++; + } + } +} + +static void +Draw_Fractal (IfsData * data) +{ + FRACTAL *F = data->Root; + int i, j; + F_PT x, y, xo, yo; + SIMI *Cur, *Simi; + + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + Cur->Cx = DBL_To_F_PT (Cur->c_x); + Cur->Cy = DBL_To_F_PT (Cur->c_y); + + Cur->Ct = DBL_To_F_PT (cos (Cur->A)); + Cur->St = DBL_To_F_PT (sin (Cur->A)); + Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); + Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); + + Cur->R = DBL_To_F_PT (Cur->r); + Cur->R2 = DBL_To_F_PT (Cur->r2); + } + + + data->Cur_Pt = 0; + data->Cur_F = F; + data->Buf = F->Buffer2; + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + xo = Cur->Cx; + yo = Cur->Cy; + for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { + if (Simi == Cur) + continue; + Transform (Simi, xo, yo, &x, &y); + Trace (F, x, y, data); + } + } + + /* Erase previous */ + + F->Cur_Pt = data->Cur_Pt; + data->Buf = F->Buffer1; + F->Buffer1 = F->Buffer2; + F->Buffer2 = data->Buf; +} + + +static IFSPoint * +draw_ifs (PluginInfo * goomInfo, int *nbpt, IfsData * data) +{ + int i; + DBL u, uu, v, vv, u0, u1, u2, u3; + SIMI *S, *S1, *S2, *S3, *S4; + FRACTAL *F; + + if (data->Root == NULL) + return NULL; + F = data->Root; + if (F->Buffer1 == NULL) + return NULL; + + u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; + uu = u * u; + v = 1.0 - u; + vv = v * v; + u0 = vv * v; + u1 = 3.0 * vv * u; + u2 = 3.0 * v * uu; + u3 = u * uu; + + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; + S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; + S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; + S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; + S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; + S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; + } + + Draw_Fractal (data); + + if (F->Count >= 1000 / F->Speed) { + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S2->c_x = 2.0 * S4->c_x - S3->c_x; + S2->c_y = 2.0 * S4->c_y - S3->c_y; + S2->r = 2.0 * S4->r - S3->r; + S2->r2 = 2.0 * S4->r2 - S3->r2; + S2->A = 2.0 * S4->A - S3->A; + S2->A2 = 2.0 * S4->A2 - S3->A2; + + *S1 = *S4; + } + Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); + + Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); + + F->Count = 0; + } else + F->Count++; + + F->Col++; + + (*nbpt) = data->Cur_Pt; + return F->Buffer2; +} + + +/***************************************************************/ + +static void +release_ifs (IfsData * data) +{ + if (data->Root != NULL) { + free_ifs (data->Root); + (void) free ((void *) data->Root); + data->Root = (FRACTAL *) NULL; + } +} + +#define RAND() goom_random(goomInfo->gRandom) + +static void +ifs_update (PluginInfo * goomInfo, Pixel * data, Pixel * back, int increment, + IfsData * fx_data) +{ + static unsigned int couleur = 0xc0c0c0c0; + static int v[4] = { 2, 4, 3, 2 }; + static int col[4] = { 2, 4, 3, 2 }; + +#define MOD_MER 0 +#define MOD_FEU 1 +#define MOD_MERVER 2 + static int mode = MOD_MERVER; + static int justChanged = 0; + static int cycle = 0; + int cycle10; + + int nbpt = 0; + IFSPoint *points; + int i; + + unsigned int couleursl = couleur; + int width = goomInfo->screen.width; + int height = goomInfo->screen.height; + + cycle++; + if (cycle >= 80) + cycle = 0; + + if (cycle < 40) + cycle10 = cycle / 10; + else + cycle10 = 7 - cycle / 10; + + { + unsigned char *tmp = (unsigned char *) &couleursl; + + for (i = 0; i < 4; i++) { + *tmp = (*tmp) >> cycle10; + tmp++; + } + } + + points = draw_ifs (goomInfo, &nbpt, fx_data); + nbpt--; + +#ifdef HAVE_MMX + movd_m2r (couleursl, mm1); + punpckldq_r2r (mm1, mm1); + for (i = 0; i < nbpt; i += increment) { + int x = points[i].x; + int y = points[i].y; + + if ((x < width) && (y < height) && (x > 0) && (y > 0)) { + int pos = x + (y * width); + + movd_m2r (back[pos], mm0); + paddusb_r2r (mm1, mm0); + movd_r2m (mm0, data[pos]); + } + } + emms (); /*__asm__ __volatile__ ("emms");*/ +#else + for (i = 0; i < nbpt; i += increment) { + int x = (int) points[i].x & 0x7fffffff; + int y = (int) points[i].y & 0x7fffffff; + + if ((x < width) && (y < height)) { + int pos = x + (int) (y * width); + int tra = 0, i = 0; + unsigned char *bra = (unsigned char *) &back[pos]; + unsigned char *dra = (unsigned char *) &data[pos]; + unsigned char *cra = (unsigned char *) &couleursl; + + for (; i < 4; i++) { + tra = *cra; + tra += *bra; + if (tra > 255) + tra = 255; + *dra = tra; + ++dra; + ++cra; + ++bra; + } + } + } +#endif /*MMX*/ + justChanged--; + + col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; + col[BLEU] = couleur >> (BLEU * 8) & 0xff; + col[VERT] = couleur >> (VERT * 8) & 0xff; + col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; + + if (mode == MOD_MER) { + col[BLEU] += v[BLEU]; + if (col[BLEU] > 255) { + col[BLEU] = 255; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 32) { + col[BLEU] = 32; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[BLEU]) { + col[VERT] = col[BLEU]; + v[VERT] = v[BLEU]; + } + if (col[VERT] < 32) { + col[VERT] = 32; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 64) { + col[ROUGE] = 64; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 0) { + col[ALPHA] = 0; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) + && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; + justChanged = 250; + } + } else if (mode == MOD_MERVER) { + col[BLEU] += v[BLEU]; + if (col[BLEU] > 128) { + col[BLEU] = 128; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 16) { + col[BLEU] = 16; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[ALPHA]) { + col[VERT] = col[ALPHA]; + v[VERT] = v[ALPHA]; + } + if (col[VERT] < 32) { + col[VERT] = 32; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 128) { + col[ROUGE] = 128; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 255) { + col[ALPHA] = 255; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) + && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 3 ? MOD_FEU : MOD_MER; + justChanged = 250; + } + } else if (mode == MOD_FEU) { + + col[BLEU] += v[BLEU]; + if (col[BLEU] > 64) { + col[BLEU] = 64; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 0) { + col[BLEU] = 0; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[ROUGE] + 20) { + col[VERT] = col[ROUGE] + 20; + v[VERT] = -(RAND () % 3) - 2; + v[ROUGE] = (RAND () % 4) + 1; + v[BLEU] = (RAND () % 4) + 1; + } + if (col[VERT] < 0) { + col[VERT] = 0; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 255) { + col[ROUGE] = 255; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] > col[VERT] + 40) { + col[ROUGE] = col[VERT] + 40; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 0) { + col[ALPHA] = 0; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) + && (col[BLEU] > 32) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 2 ? MOD_MER : MOD_MERVER; + justChanged = 250; + } + } + + couleur = (col[ALPHA] << (ALPHA * 8)) + | (col[BLEU] << (BLEU * 8)) + | (col[VERT] << (VERT * 8)) + | (col[ROUGE] << (ROUGE * 8)); +} + +/** VISUAL_FX WRAPPER FOR IFS */ + +static void +ifs_vfx_apply (VisualFX * _this, Pixel * src, Pixel * dest, + PluginInfo * goomInfo) +{ + + IfsData *data = (IfsData *) _this->fx_data; + + if (!data->initalized) { + data->initalized = 1; + init_ifs (goomInfo, data); + } + ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); + /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ +} + +static void +ifs_vfx_init (VisualFX * _this, PluginInfo * info) +{ + + IfsData *data = (IfsData *) malloc (sizeof (IfsData)); + + data->Root = (FRACTAL *) NULL; + data->initalized = 0; + _this->fx_data = data; +} + +static void +ifs_vfx_free (VisualFX * _this) +{ + IfsData *data = (IfsData *) _this->fx_data; + + release_ifs (data); + free (data); +} + +void +ifs_visualfx_create (VisualFX * vfx) +{ + + vfx->init = ifs_vfx_init; + vfx->free = ifs_vfx_free; + vfx->apply = ifs_vfx_apply; + vfx->fx_data = NULL; + vfx->params = NULL; +} diff --git a/gst/goom/ifs.h b/gst/goom/ifs.h new file mode 100644 index 0000000..4003773 --- /dev/null +++ b/gst/goom/ifs.h @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 1997 by Massimino Pascal + * + * ifs.h: modified iterated functions system for goom. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * If this mode is weird and you have an old MetroX server, it is buggy. + * There is a free SuSE-enhanced MetroX X server that is fine. + * + * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." + * + * Revision History: + * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). + * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) + * 01-Nov-2000: Allocation checks + * 10-May-1997: jwz@jwz.org: turned into a standalone program. + * Made it render into an offscreen bitmap and then copy + * that onto the screen, to reduce flicker. + */ + +#ifndef IFS_H +#define IFS_H + +#include "goom_config.h" +#include "goom_graphic.h" +#include "goom_plugin_info.h" +#include "goom_visual_fx.h" + +void ifs_visualfx_create(VisualFX *vfx); + +/* init ifs for a (width)x(height) output. * / +void init_ifs (PluginInfo *goomInfo, int width, int height); + +/ * draw an ifs on the buffer (which size is width * height) + increment means that we draw 1/increment of the ifs's points * / +void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); + +/ * free all ifs's data. * / +void release_ifs (void); +*/ + + +#endif diff --git a/gst/goom/lines.c b/gst/goom/lines.c new file mode 100644 index 0000000..096240c --- /dev/null +++ b/gst/goom/lines.c @@ -0,0 +1,257 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "lines.h" +#include +#include +#include +#include "goom_tools.h" +#include "drawmethods.h" +#include "goom_plugin_info.h" + +static inline unsigned char +lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10 (power) / 2.0; + + if (t > 0) { + val = (int) t; /* (32.0f * log (t)); */ + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } else { + return 0; + } +} + +static void +lightencolor (guint32 * col, float power) +{ + unsigned char *color; + + color = (unsigned char *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + + + +static void +genline (int id, float param, GMUnitPointer * l, int rx, int ry) +{ + int i; + + switch (id) { + case GML_HLINE: + for (i = 0; i < 512; i++) { + l[i].x = ((float) i * rx) / 512.0f; + l[i].y = param; + l[i].angle = G_PI / 2.0f; + } + return; + case GML_VLINE: + for (i = 0; i < 512; i++) { + l[i].y = ((float) i * ry) / 512.0f; + l[i].x = param; + l[i].angle = 0.0f; + } + return; + case GML_CIRCLE: + for (i = 0; i < 512; i++) { + float cosa, sina; + + l[i].angle = 2.0f * G_PI * (float) i / 512.0f; + cosa = param * cos (l[i].angle); + sina = param * sin (l[i].angle); + l[i].x = ((float) rx / 2.0f) + cosa; + l[i].y = (float) ry / 2.0f + sina; + } + return; + } +} + +static guint32 +getcouleur (int mode) +{ + switch (mode) { + case GML_RED: + return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); + case GML_ORANGE_J: + return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); + case GML_ORANGE_V: + return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); + case GML_BLEUBLANC: + return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); + case GML_VERT: + return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); + case GML_BLEU: + return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); + case GML_BLACK: + return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); + } + return 0; +} + +void +goom_lines_set_res (GMLine * gml, int rx, int ry) +{ + if (gml != NULL) { + gml->screenX = rx; + gml->screenY = ry; + + genline (gml->IDdest, gml->param, gml->points2, rx, ry); + } +} + + +static void +goom_lines_move (GMLine * l) +{ + int i; + unsigned char *c1, *c2; + + for (i = 0; i < 512; i++) { + l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; + l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; + l->points[i].angle = + (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; + } + + c1 = (unsigned char *) &l->color; + c2 = (unsigned char *) &l->color2; + for (i = 0; i < 4; i++) { + int cc1, cc2; + + cc1 = *c1; + cc2 = *c2; + *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); + ++c1; + ++c2; + } + + l->power += l->powinc; + if (l->power < 1.1f) { + l->power = 1.1f; + l->powinc = (float) (goom_irand (l->goomInfo->gRandom, 20) + 10) / 300.0f; + } + if (l->power > 17.5f) { + l->power = 17.5f; + l->powinc = -(float) (goom_irand (l->goomInfo->gRandom, 20) + 10) / 300.0f; + } + + l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; +} + +void +goom_lines_switch_to (GMLine * gml, int IDdest, + float param, float amplitude, int col) +{ + genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); + gml->IDdest = IDdest; + gml->param = param; + gml->amplitudeF = amplitude; + gml->color2 = getcouleur (col); +} + +GMLine * +goom_lines_init (PluginInfo * goomInfo, int rx, int ry, + int IDsrc, float paramS, int coulS, int IDdest, float paramD, int coulD) +{ + GMLine *l = (GMLine *) malloc (sizeof (GMLine)); + + l->goomInfo = goomInfo; + + l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); + l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); + l->nbPoints = 512; + + l->IDdest = IDdest; + l->param = paramD; + + l->amplitude = l->amplitudeF = 1.0f; + + genline (IDsrc, paramS, l->points, rx, ry); + genline (IDdest, paramD, l->points2, rx, ry); + + l->color = getcouleur (coulS); + l->color2 = getcouleur (coulD); + + l->screenX = rx; + l->screenY = ry; + + l->power = 0.0f; + l->powinc = 0.01f; + + goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); + + return l; +} + +void +goom_lines_free (GMLine ** l) +{ + free ((*l)->points2); + free ((*l)->points); + free (*l); + l = NULL; +} + +void +goom_lines_draw (PluginInfo * plug, GMLine * line, gint16 data[512], Pixel * p) +{ + if (line != NULL) { + int i, x1, y1; + guint32 color = line->color; + GMUnitPointer *pt = &(line->points[0]); + + float cosa = cos (pt->angle) / 1000.0f; + float sina = sin (pt->angle) / 1000.0f; + + lightencolor (&color, line->power); + + x1 = (int) (pt->x + cosa * line->amplitude * data[0]); + y1 = (int) (pt->y + sina * line->amplitude * data[0]); + + for (i = 1; i < 512; i++) { + int x2, y2; + GMUnitPointer *pt = &(line->points[i]); + + float cosa = cos (pt->angle) / 1000.0f; + float sina = sin (pt->angle) / 1000.0f; + + x2 = (int) (pt->x + cosa * line->amplitude * data[i]); + y2 = (int) (pt->y + sina * line->amplitude * data[i]); + + plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, + line->screenY); + + x1 = x2; + y1 = y2; + } + goom_lines_move (line); + } +} diff --git a/gst/goom/lines.h b/gst/goom/lines.h new file mode 100644 index 0000000..6c2b47c --- /dev/null +++ b/gst/goom/lines.h @@ -0,0 +1,94 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _LINES_H +#define _LINES_H + +#include "goom_typedefs.h" +#include "goom_graphic.h" +#include "goom_config.h" + +struct _GMUNITPOINTER +{ + float x; + float y; + float angle; +}; + +/* tableau de points */ +struct _GMLINE +{ + + GMUnitPointer *points; + GMUnitPointer *points2; + int IDdest; + float param; + float amplitudeF; + float amplitude; + + int nbPoints; + guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ + guint32 color2; + + int screenX; + int screenY; + + float power; + float powinc; + + PluginInfo *goomInfo; +}; + +/* les ID possibles */ + +#define GML_CIRCLE 0 +/* (param = radius) */ + +#define GML_HLINE 1 +/* (param = y) */ + +#define GML_VLINE 2 +/* (param = x) */ + +/* les modes couleur possible (si tu mets un autre c'est noir) */ + +#define GML_BLEUBLANC 0 +#define GML_RED 1 +#define GML_ORANGE_V 2 +#define GML_ORANGE_J 3 +#define GML_VERT 4 +#define GML_BLEU 5 +#define GML_BLACK 6 + +/* construit un effet de line (une ligne horitontale pour commencer) */ +GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, + int IDsrc, float paramS, int modeCoulSrc, + int IDdest, float paramD, int modeCoulDest); + +void goom_lines_switch_to (GMLine * gml, int IDdest, float param, + float amplitude, + int modeCoul); + +void goom_lines_set_res (GMLine * gml, int rx, int ry); + +void goom_lines_free (GMLine ** gml); + +void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p); + +#endif /* _LINES_H */ diff --git a/gst/goom/mathtools.c b/gst/goom/mathtools.c new file mode 100644 index 0000000..84d5a96 --- /dev/null +++ b/gst/goom/mathtools.c @@ -0,0 +1,106 @@ +/* Goom Project + * Copyright (C) <2003> Jean-Christophe Hoelt + * + * goom_core.c:Contains the core of goom's work. + * + * 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 "mathtools.h" + +float sin256[256] = { + 0, 0.0245412, 0.0490677, 0.0735646, 0.0980171, 0.122411, 0.14673, 0.170962, + 0.19509, 0.219101, 0.24298, 0.266713, 0.290285, 0.313682, 0.33689, + 0.359895, 0.382683, 0.405241, 0.427555, 0.449611, 0.471397, 0.492898, + 0.514103, 0.534998, 0.55557, 0.575808, 0.595699, 0.615232, 0.634393, + 0.653173, 0.671559, 0.689541, 0.707107, 0.724247, 0.740951, 0.757209, + 0.77301, 0.788346, 0.803208, 0.817585, 0.83147, 0.844854, 0.857729, + 0.870087, 0.881921, 0.893224, 0.903989, 0.91421, 0.92388, 0.932993, + 0.941544, 0.949528, 0.95694, 0.963776, 0.970031, 0.975702, 0.980785, + 0.985278, 0.989177, 0.99248, 0.995185, 0.99729, 0.998795, 0.999699, 1, + 0.999699, 0.998795, 0.99729, 0.995185, 0.99248, 0.989177, 0.985278, + 0.980785, 0.975702, 0.970031, 0.963776, 0.95694, 0.949528, 0.941544, + 0.932993, 0.92388, 0.91421, 0.903989, 0.893224, 0.881921, 0.870087, + 0.857729, 0.844854, 0.83147, 0.817585, 0.803208, 0.788346, 0.77301, + 0.757209, 0.740951, 0.724247, 0.707107, 0.689541, 0.671559, 0.653173, + 0.634393, 0.615232, 0.595699, 0.575808, 0.55557, 0.534998, 0.514103, + 0.492898, 0.471397, 0.449611, 0.427555, 0.405241, 0.382683, 0.359895, + 0.33689, 0.313682, 0.290285, 0.266713, 0.24298, 0.219101, 0.19509, + 0.170962, 0.14673, 0.122411, 0.0980171, 0.0735646, 0.0490677, 0.0245412, + 1.22465e-16, -0.0245412, -0.0490677, -0.0735646, -0.0980171, -0.122411, + -0.14673, -0.170962, -0.19509, -0.219101, -0.24298, -0.266713, -0.290285, + -0.313682, -0.33689, -0.359895, -0.382683, -0.405241, -0.427555, + -0.449611, -0.471397, -0.492898, -0.514103, -0.534998, -0.55557, + -0.575808, -0.595699, -0.615232, -0.634393, -0.653173, -0.671559, + -0.689541, -0.707107, -0.724247, -0.740951, -0.757209, -0.77301, + -0.788346, -0.803208, -0.817585, -0.83147, -0.844854, -0.857729, + -0.870087, -0.881921, -0.893224, -0.903989, -0.91421, -0.92388, -0.932993, + -0.941544, -0.949528, -0.95694, -0.963776, -0.970031, -0.975702, + -0.980785, -0.985278, -0.989177, -0.99248, -0.995185, -0.99729, -0.998795, + -0.999699, -1, -0.999699, -0.998795, -0.99729, -0.995185, -0.99248, + -0.989177, -0.985278, -0.980785, -0.975702, -0.970031, -0.963776, + -0.95694, -0.949528, -0.941544, -0.932993, -0.92388, -0.91421, -0.903989, + -0.893224, -0.881921, -0.870087, -0.857729, -0.844854, -0.83147, + -0.817585, -0.803208, -0.788346, -0.77301, -0.757209, -0.740951, + -0.724247, -0.707107, -0.689541, -0.671559, -0.653173, -0.634393, + -0.615232, -0.595699, -0.575808, -0.55557, -0.534998, -0.514103, + -0.492898, -0.471397, -0.449611, -0.427555, -0.405241, -0.382683, + -0.359895, -0.33689, -0.313682, -0.290285, -0.266713, -0.24298, -0.219101, + -0.19509, -0.170962, -0.14673, -0.122411, -0.0980171, -0.0735646, + -0.0490677, -0.0245412 +}; + +float cos256[256] = { + 0, 0.999699, 0.998795, 0.99729, 0.995185, 0.99248, 0.989177, 0.985278, + 0.980785, 0.975702, 0.970031, 0.963776, 0.95694, 0.949528, 0.941544, + 0.932993, 0.92388, 0.91421, 0.903989, 0.893224, 0.881921, 0.870087, + 0.857729, 0.844854, 0.83147, 0.817585, 0.803208, 0.788346, 0.77301, + 0.757209, 0.740951, 0.724247, 0.707107, 0.689541, 0.671559, 0.653173, + 0.634393, 0.615232, 0.595699, 0.575808, 0.55557, 0.534998, 0.514103, + 0.492898, 0.471397, 0.449611, 0.427555, 0.405241, 0.382683, 0.359895, + 0.33689, 0.313682, 0.290285, 0.266713, 0.24298, 0.219101, 0.19509, + 0.170962, 0.14673, 0.122411, 0.0980171, 0.0735646, 0.0490677, 0.0245412, + 6.12323e-17, -0.0245412, -0.0490677, -0.0735646, -0.0980171, -0.122411, + -0.14673, -0.170962, -0.19509, -0.219101, -0.24298, -0.266713, -0.290285, + -0.313682, -0.33689, -0.359895, -0.382683, -0.405241, -0.427555, + -0.449611, -0.471397, -0.492898, -0.514103, -0.534998, -0.55557, + -0.575808, -0.595699, -0.615232, -0.634393, -0.653173, -0.671559, + -0.689541, -0.707107, -0.724247, -0.740951, -0.757209, -0.77301, + -0.788346, -0.803208, -0.817585, -0.83147, -0.844854, -0.857729, + -0.870087, -0.881921, -0.893224, -0.903989, -0.91421, -0.92388, -0.932993, + -0.941544, -0.949528, -0.95694, -0.963776, -0.970031, -0.975702, + -0.980785, -0.985278, -0.989177, -0.99248, -0.995185, -0.99729, -0.998795, + -0.999699, -1, -0.999699, -0.998795, -0.99729, -0.995185, -0.99248, + -0.989177, -0.985278, -0.980785, -0.975702, -0.970031, -0.963776, + -0.95694, -0.949528, -0.941544, -0.932993, -0.92388, -0.91421, -0.903989, + -0.893224, -0.881921, -0.870087, -0.857729, -0.844854, -0.83147, + -0.817585, -0.803208, -0.788346, -0.77301, -0.757209, -0.740951, + -0.724247, -0.707107, -0.689541, -0.671559, -0.653173, -0.634393, + -0.615232, -0.595699, -0.575808, -0.55557, -0.534998, -0.514103, + -0.492898, -0.471397, -0.449611, -0.427555, -0.405241, -0.382683, + -0.359895, -0.33689, -0.313682, -0.290285, -0.266713, -0.24298, -0.219101, + -0.19509, -0.170962, -0.14673, -0.122411, -0.0980171, -0.0735646, + -0.0490677, -0.0245412, -1.83697e-16, 0.0245412, 0.0490677, 0.0735646, + 0.0980171, 0.122411, 0.14673, 0.170962, 0.19509, 0.219101, 0.24298, + 0.266713, 0.290285, 0.313682, 0.33689, 0.359895, 0.382683, 0.405241, + 0.427555, 0.449611, 0.471397, 0.492898, 0.514103, 0.534998, 0.55557, + 0.575808, 0.595699, 0.615232, 0.634393, 0.653173, 0.671559, 0.689541, + 0.707107, 0.724247, 0.740951, 0.757209, 0.77301, 0.788346, 0.803208, + 0.817585, 0.83147, 0.844854, 0.857729, 0.870087, 0.881921, 0.893224, + 0.903989, 0.91421, 0.92388, 0.932993, 0.941544, 0.949528, 0.95694, + 0.963776, 0.970031, 0.975702, 0.980785, 0.985278, 0.989177, 0.99248, + 0.995185, 0.99729, 0.998795, 0.999699 +}; diff --git a/gst/goom/mathtools.h b/gst/goom/mathtools.h new file mode 100644 index 0000000..baf79b0 --- /dev/null +++ b/gst/goom/mathtools.h @@ -0,0 +1,58 @@ +/* Goom Project + * Copyright (C) <2003> Jean-Christophe Hoelt + * + * goom_core.c:Contains the core of goom's work. + * + * 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 MATHTOOLS_H +#define MATHTOOLS_H + +#include + +#define _double2fixmagic (68719476736.0*1.5) +/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ +#define _shiftamt 16 +/* 16.16 fixed point representation */ + +#if G_BYTE_ORDER == G_BIG_ENDIAN +#define iexp_ 0 +#define iman_ 1 +#else +#define iexp_ 1 +#define iman_ 0 +#endif /* BigEndian_ */ + +/* TODO: this optimization is very efficient: put it again when all works +#ifdef HAVE_MMX +#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} +#else*/ +#define F2I(dbl,i) i=(int)dbl; +/*#endif*/ + +#if 0 +#define SINCOS(f,s,c) \ + __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) +#else +#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} +#endif + +extern float sin256[256]; +extern float cos256[256]; + +#endif + diff --git a/gst/goom/mmx.c b/gst/goom/mmx.c new file mode 100644 index 0000000..bc2a6c4 --- /dev/null +++ b/gst/goom/mmx.c @@ -0,0 +1,291 @@ +/* mmx.c + + 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-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "goom_config.h" + +#ifdef HAVE_MMX + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#include "mmx.h" +#include "goom_graphic.h" + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +int +mmx_supported (void) +{ + return (mm_support () & 0x1); +} + +void +zoom_filter_mmx (int prevX, int prevY, + Pixel * expix1, Pixel * expix2, + int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) +{ + unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; + + int bufsize = prevX * prevY; + int loop; + + __asm__ __volatile__ ("pxor %mm7,%mm7"); + + for (loop = 0; loop < bufsize; loop++) { + /* int couleur; */ + int px, py; + int pos; + int coeffs; + + int myPos = loop << 1, myPos2 = myPos + 1; + int brutSmypos = brutS[myPos]; + + px = brutSmypos + (((brutD[myPos] - + brutSmypos) * buffratio) >> BUFFPOINTNB); + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - + brutSmypos) * buffratio) >> BUFFPOINTNB); + + if ((py >= ay) || (px >= ax)) { + pos = coeffs = 0; + } else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + // coef en modulo 15 + coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; + } + + __asm__ __volatile__ ("movd %2, %%mm6 \n\t" + /* recuperation des deux premiers pixels dans mm0 et mm1 */ + "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ + "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ + /* depackage du premier pixel */ + "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ + "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ + "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ + /* extraction des coefficients... */ + "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ + "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ + "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ + "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ + "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ + /* multiplication des pixels par les coefficients */ + "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ + "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ + "paddw %%mm1, %%mm0 \n\t" + /* ...extraction des 2 derniers coefficients */ + "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ + "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ + "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ + /* ajouter la longueur de ligne a esi */ + "addl 8(%%ebp),%1 \n\t" + /* recuperation des 2 derniers pixels */ + "movq (%3,%1,4), %%mm1 \n\t" "movq %%mm1, %%mm2 \n\t" + /* depackage des pixels */ + "punpcklbw %%mm7, %%mm1 \n\t" "punpckhbw %%mm7, %%mm2 \n\t" + /* multiplication pas les coeffs */ + "pmullw %%mm4, %%mm1 \n\t" "pmullw %%mm5, %%mm2 \n\t" + /* ajout des valeurs obtenues ? la valeur finale */ + "paddw %%mm1, %%mm0 \n\t" "paddw %%mm2, %%mm0 \n\t" + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + "psrlw $8, %%mm0 \n\t" + "packuswb %%mm7, %%mm0 \n\t" "movd %%mm0,%0 \n\t":"=g" (expix2[loop]) + :"r" (pos), "r" (coeffs), "r" (expix1) + + ); + + emms (); + } +} + +#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ +{ \ + movd_m2r(_backbuf, mm0); \ + paddusb_m2r(_col, mm0); \ + movd_r2m(mm0, _out); \ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) + +void +draw_line_mmx (Pixel * data, int x1, int y1, int x2, int y2, int col, + int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) + || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + goto end_of_line; + + dx = x2 - x1; + dy = y2 - y1; + if (x1 >= x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + goto end_of_line; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + goto end_of_line; + } + } +end_of_line: + emms (); + /* __asm__ __volatile__ ("emms"); */ +} +#else +int +mmx_supported (void) +{ + return (0); +} +#endif /* HAVE_MMX */ diff --git a/gst/goom/mmx.h b/gst/goom/mmx.h new file mode 100644 index 0000000..3fae26b --- /dev/null +++ b/gst/goom/mmx.h @@ -0,0 +1,729 @@ +/* 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-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _MMX_H +#define _MMX_H + +#include "goom_graphic.h" + +/* 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 */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ + + + +/* Function to test if multimedia instructions are supported... +*/ +static 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 + 13 if AMD Extended MMX, &3dNow 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 */ + "pushl %%ebx\n\t" + "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" + "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ + "jnz AMDXMMXSupported\n\t" + "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + "AMDXMMXSupported:\n\t" + "movl $13, %0\n\n\t" /* XMMX, 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" + "popl %%ebx\n\t" + : "=X" (rval) + : /* no input */ + : "eax", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +static inline int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} + +int mmx_supported (void); +int xmmx_supported (void); + + +/* MMX optimized implementations */ +void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, + int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, + int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); + + +/* 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 + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=m" (memd) \ + : "m" (mems)); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#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() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms" \ + "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ + } + +#else + +#define emms() __asm__ __volatile__ ("emms"::: \ + "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") + +#endif + +#endif + diff --git a/gst/goom/motif_goom1.h b/gst/goom/motif_goom1.h new file mode 100644 index 0000000..ba5a7d4 --- /dev/null +++ b/gst/goom/motif_goom1.h @@ -0,0 +1,1044 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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. + */ +static Motif CONV_MOTIF1 = { + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, + 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, + 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, + 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, + 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, + 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, + 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, + 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, + 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, + 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, + 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, + 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, + 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, + 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, + 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, + 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, + 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, + 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, + 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, + 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, + 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, + 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, + 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, + 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, + 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, + 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, + 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, + 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, + 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, + 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, + 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, + 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, + 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, + 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, + 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, + 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, + 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, + 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, + 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, + 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, + 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, + 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, + 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, + 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, + 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, + 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, + 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, + 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, + 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, + 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, + 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, + 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, + 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, + 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, + 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, + 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, + 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, + 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, + 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, + 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, + 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, + 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, + 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, + 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, + 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, + 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, + 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, + 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, + 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, + 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, + 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, + 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, + 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, + 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, + 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, + 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, + 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, + 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, + 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, + 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, + 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, + 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, + 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, + 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, + 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, + 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, + 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, + 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, + 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, + 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, + 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, + 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, + 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, + 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, + 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, + 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, + 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, + 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, + 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, + 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, + 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, + 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, + 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, + 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, + 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, + 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, + 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, + 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, + 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, + 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, + 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, + 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, + 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, + 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, + 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, + 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, + 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, + 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, + 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, + 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, + 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, + 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, + 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, + 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, + 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, + 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, + 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, + 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, + 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, + 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, + 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, + 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, + 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, + 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, + 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, + 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, + 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, + 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, + 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, + 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, + 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, + 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, + 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, + 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, + 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, + 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, + 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, + 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, + 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, + 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, + 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, + 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, + 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, + 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, + 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, + 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, + 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, + 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, + 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, + 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, + 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, + 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, + 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, + 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, + 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, + 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, + 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, + 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, + 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, + 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, + 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, + 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, + 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, + 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, + 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, + 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, + 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, + 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, + 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, + 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, + 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, + 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, + 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, + 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, + 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, + 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, + 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15} + }; diff --git a/gst/goom/motif_goom2.h b/gst/goom/motif_goom2.h new file mode 100644 index 0000000..1ef1cbe --- /dev/null +++ b/gst/goom/motif_goom2.h @@ -0,0 +1,1044 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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. + */ +static Motif CONV_MOTIF2 = { + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, + 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, + 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, + 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, + 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, + 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, + 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, + 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, + 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, + 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, + 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, + 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, + 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, + 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, + 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, + 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, + 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, + 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, + 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, + 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, + 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, + 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, + 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, + 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, + 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, + 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, + 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, + 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, + 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, + 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, + 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, + 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, + 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, + 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, + 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, + 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, + 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, + 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, + 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, + 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, + 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, + 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, + 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, + 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, + 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, + 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, + 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, + 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, + 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, + 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, + 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, + 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, + 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, + 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, + 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, + 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, + 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, + 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, + 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, + 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, + 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, + 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, + 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, + 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, + 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, + 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, + 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, + 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, + 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, + 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, + 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, + 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, + 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, + 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, + 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, + 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, + 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, + 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, + 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, + 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, + 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, + 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, + 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, + 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, + 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, + 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, + 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, + 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, + 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, + 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, + 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, + 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, + 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, + 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, + 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, + 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, + 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, + 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, + 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, + 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, + 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, + 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, + 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, + 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, + 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, + 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, + 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, + 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, + 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, + 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, + 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, + 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, + 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, + 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, + 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, + 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, + 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, + 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, + 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, + 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, + 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, + 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, + 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, + 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, + 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, + 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, + 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, + 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, + 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, + 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, + 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, + 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, + 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, + 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, + 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, + 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, + 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, + 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, + 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, + 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, + 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, + 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, + 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, + 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, + 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, + 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15} + }; diff --git a/gst/goom/plugin_info.c b/gst/goom/plugin_info.c new file mode 100644 index 0000000..b50c9dd --- /dev/null +++ b/gst/goom/plugin_info.c @@ -0,0 +1,264 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 + +#include "goom_config.h" + +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "drawmethods.h" +#include +#include +#ifdef HAVE_ORC +#include +#endif + + +#if defined (HAVE_CPU_PPC64) || defined (HAVE_CPU_PPC) +#include "ppc_zoom_ultimate.h" +#include "ppc_drawings.h" +#endif /* HAVE_CPU_PPC64 || HAVE_CPU_PPC */ + + +#ifdef HAVE_MMX +#include "mmx.h" +#endif /* HAVE_MMX */ + +#include + +GST_DEBUG_CATEGORY_EXTERN (goom_debug); +#define GST_CAT_DEFAULT goom_debug + +static void +setOptimizedMethods (PluginInfo * p) +{ +#ifdef HAVE_ORC + unsigned int cpuFlavour = + orc_target_get_default_flags (orc_target_get_by_name ("mmx")); +#else + unsigned int cpuFlavour = 0; +#endif + + /* set default methods */ + p->methods.draw_line = draw_line; + p->methods.zoom_filter = zoom_filter_c; +/* p->methods.create_output_with_brightness = create_output_with_brightness;*/ + + GST_INFO ("orc cpu flags: 0x%08x", cpuFlavour); + +/* FIXME: what about HAVE_CPU_X86_64 ? */ +#ifdef HAVE_CPU_I386 +#ifdef HAVE_MMX +#ifdef HAVE_ORC + GST_INFO ("have an x86"); + if (cpuFlavour & ORC_TARGET_MMX_MMXEXT) { + GST_INFO ("Extended MMX detected. Using the fastest methods!"); + p->methods.draw_line = draw_line_xmmx; + p->methods.zoom_filter = zoom_filter_xmmx; + } else if (cpuFlavour & ORC_TARGET_MMX_MMX) { + GST_INFO ("MMX detected. Using fast methods!"); + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_mmx; + } else { + GST_INFO ("Too bad ! No SIMD optimization available for your CPU."); + } +#endif +#endif +#endif /* HAVE_CPU_I386 */ + +/* disable all PPC stuff until someone finds out what to use here instead of + * CPU_OPTION_64_BITS, and until someone fixes the assembly build for ppc */ +#if 0 +#ifdef HAVE_CPU_PPC64 + if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) { +/* p->methods.create_output_with_brightness = ppc_brightness_G5; */ + p->methods.zoom_filter = ppc_zoom_generic; + } +#endif /* HAVE_CPU_PPC64 */ + +#ifdef HAVE_CPU_PPC + if ((cpuFlavour & ORC_TARGET_ALTIVEC_ALTIVEC) != 0) { +/* p->methods.create_output_with_brightness = ppc_brightness_G4; */ + p->methods.zoom_filter = ppc_zoom_G4; + } else { +/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/ + p->methods.zoom_filter = ppc_zoom_generic; + } +#endif /* HAVE_CPU_PPC */ +#endif + + cpuFlavour = 0; /* trick compiler into thinking variable is used */ +} + +void +plugin_info_init (PluginInfo * pp, int nbVisuals) +{ + + int i; + + memset (pp, 0, sizeof (PluginInfo)); + + pp->sound.speedvar = pp->sound.accelvar = pp->sound.totalgoom = 0; + pp->sound.prov_max = 0; + pp->sound.goom_limit = 1; + pp->sound.allTimesMax = 1; + pp->sound.timeSinceLastGoom = 1; + pp->sound.timeSinceLastBigGoom = 1; + pp->sound.cycle = 0; + + secure_f_feedback (&pp->sound.volume_p, "Sound Volume"); + secure_f_feedback (&pp->sound.accel_p, "Sound Acceleration"); + secure_f_feedback (&pp->sound.speed_p, "Sound Speed"); + secure_f_feedback (&pp->sound.goom_limit_p, "Goom Limit"); + secure_f_feedback (&pp->sound.last_goom_p, "Goom Detection"); + secure_f_feedback (&pp->sound.last_biggoom_p, "Big Goom Detection"); + secure_f_feedback (&pp->sound.goom_power_p, "Goom Power"); + + secure_i_param (&pp->sound.biggoom_speed_limit_p, "Big Goom Speed Limit"); + IVAL (pp->sound.biggoom_speed_limit_p) = 10; + IMIN (pp->sound.biggoom_speed_limit_p) = 0; + IMAX (pp->sound.biggoom_speed_limit_p) = 100; + ISTEP (pp->sound.biggoom_speed_limit_p) = 1; + + secure_i_param (&pp->sound.biggoom_factor_p, "Big Goom Factor"); + IVAL (pp->sound.biggoom_factor_p) = 10; + IMIN (pp->sound.biggoom_factor_p) = 0; + IMAX (pp->sound.biggoom_factor_p) = 100; + ISTEP (pp->sound.biggoom_factor_p) = 1; + + plugin_parameters (&pp->sound.params, "Sound", 11); + + pp->nbParams = 0; + pp->params = NULL; + pp->nbVisuals = nbVisuals; + pp->visuals = (VisualFX **) malloc (sizeof (VisualFX *) * nbVisuals); + + pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; + pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; + pp->sound.params.params[2] = 0; + pp->sound.params.params[3] = &pp->sound.volume_p; + pp->sound.params.params[4] = &pp->sound.accel_p; + pp->sound.params.params[5] = &pp->sound.speed_p; + pp->sound.params.params[6] = 0; + pp->sound.params.params[7] = &pp->sound.goom_limit_p; + pp->sound.params.params[8] = &pp->sound.goom_power_p; + pp->sound.params.params[9] = &pp->sound.last_goom_p; + pp->sound.params.params[10] = &pp->sound.last_biggoom_p; + + pp->statesNumber = 8; + pp->statesRangeMax = 510; + { + GoomState states[8] = { + {1, 0, 0, 1, 4, 0, 100} + , + {1, 0, 0, 0, 1, 101, 140} + , + {1, 0, 0, 1, 2, 141, 200} + , + {0, 1, 0, 1, 2, 201, 260} + , + {0, 1, 0, 1, 0, 261, 330} + , + {0, 1, 1, 1, 4, 331, 400} + , + {0, 0, 1, 0, 5, 401, 450} + , + {0, 0, 1, 1, 1, 451, 510} + }; + for (i = 0; i < 8; ++i) + pp->states[i] = states[i]; + } + pp->curGState = &(pp->states[6]); + + /* datas for the update loop */ + pp->update.lockvar = 0; + pp->update.goomvar = 0; + pp->update.loopvar = 0; + pp->update.stop_lines = 0; + pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ + pp->update.decay_ifs = 0; /* disparition de l'ifs */ + pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ + pp->update.cyclesSinceLastChange = 0; + pp->update.drawLinesDuration = 80; + pp->update.lineMode = pp->update.drawLinesDuration; + + pp->update.switchMultAmount = (29.0f / 30.0f); + pp->update.switchIncrAmount = 0x7f; + pp->update.switchMult = 1.0f; + pp->update.switchIncr = pp->update.switchIncrAmount; + + pp->update.stateSelectionRnd = 0; + pp->update.stateSelectionBlocker = 0; + pp->update.previousZoomSpeed = 128; + + { + ZoomFilterData zfd = { + 127, 8, 16, + 1, 1, 0, NORMAL_MODE, + 0, 0, 0, 0, 0 + }; + pp->update.zoomFilterData = zfd; + } + + setOptimizedMethods (pp); + + for (i = 0; i < 0xffff; i++) { + pp->sintable[i] = + (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / + sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); + /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ + } +} + +void +plugin_info_add_visual (PluginInfo * p, int i, VisualFX * visual) +{ + p->visuals[i] = visual; + if (i == p->nbVisuals - 1) { + ++i; + p->nbParams = 1; + while (i--) { + if (p->visuals[i]->params) + p->nbParams++; + } + p->params = + (PluginParameters *) malloc (sizeof (PluginParameters) * p->nbParams); + i = p->nbVisuals; + p->nbParams = 1; + p->params[0] = p->sound.params; + while (i--) { + if (p->visuals[i]->params) + p->params[p->nbParams++] = *(p->visuals[i]->params); + } + } +} + +void +plugin_info_free (PluginInfo * p) +{ + goom_plugin_parameters_free (&p->sound.params); + + if (p->params) + free (p->params); + free (p->visuals); +} diff --git a/gst/goom/ppc_drawings.h b/gst/goom/ppc_drawings.h new file mode 100644 index 0000000..8dd158d --- /dev/null +++ b/gst/goom/ppc_drawings.h @@ -0,0 +1,28 @@ +/* Goom Project + * Copyright (C) <2003> Guillaume Borios, iOS-Software + * + * 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. + */ + +/* Generic PowerPC Code */ +void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); + +/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); + +/* G5 Specific PowerPC Code (Possible use of Altivec) */ +void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); + diff --git a/gst/goom/ppc_drawings.s b/gst/goom/ppc_drawings.s new file mode 100644 index 0000000..4e100b7 --- /dev/null +++ b/gst/goom/ppc_drawings.s @@ -0,0 +1,394 @@ +; PowerPC optimized drawing methods for Goom +; © 2003 Guillaume Borios +; 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. + +; Change log : +; 30 May 2003 : File creation + +; Section definition : We use a read only code section for the whole file +.section __TEXT,__text,regular,pure_instructions + + +; -------------------------------------------------------------------------------------- +; Single 32b pixel drawing macros +; Usage : +; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 +; Only the work registers (WR) can be touched by the macros +; +; Available methods : +; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) +; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) +; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing +; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) +; DRAWMETHOD_B_OR_MACRO : Bitwise OR +; DRAWMETHOD_BAND_MACRO : Bitwise AND +; DRAWMETHOD_BXOR_MACRO : Bitwise XOR +; DRAWMETHOD_BNOT_MACRO : Bitwise NOT +; -------------------------------------------------------------------------------------- + +.macro DRAWMETHOD_OVRW_MACRO + stw $2,0($1) ;; *$1 <- $2 +.endmacro + +.macro DRAWMETHOD_B_OR_MACRO + lwz $3,0($0) ;; $3 <- *$0 + or $3,$3,$2 ;; $3 <- $3 | $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BAND_MACRO + lwz $3,0($0) ;; $3 <- *$0 + and $3,$3,$2 ;; $3 <- $3 & $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BXOR_MACRO + lwz $3,0($0) ;; $3 <- *$0 + xor $3,$3,$2 ;; $3 <- $3 ^ $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BNOT_MACRO + lwz $3,0($0) ;; $3 <- *$0 + nand $3,$3,$3 ;; $3 <- ~$3 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_PLUS_MACRO + lwz $4,0($0) ;; $4 <- *$0 + andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 + andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 + add $3,$3,$5 ;; $3 <- $3 + $5 + rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) + srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) + or $3,$3,$5 ;; $3 <- $3 | $5 + lis $5,0xFF ;; $5 <- 0x00FF00FF + addi $5,$5,0xFF + and $4,$4,$5 ;; $4 <- $4 & $5 + and $6,$2,$5 ;; $6 <- $2 & $5 + add $4,$4,$6 ;; $4 <- $4 + $6 + rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) + srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) + rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) + srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) + rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] + or $4,$4,$6 ;; $4 <- $4 | $6 + rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] + stw $4,0($1) ;; *$1 <- $4 +.endmacro + +.macro DRAWMETHOD_HALF_MACRO + lwz $4,0($0) ;; $4 <- *$0 + andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 + andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 + add $3,$3,$5 ;; $3 <- $3 + $5 + lis $5,0xFF ;; $5 <- 0x00FF00FF + addi $5,$5,0xFF + and $4,$4,$5 ;; $4 <- $4 & $5 + and $5,$2,$5 ;; $5 <- $2 & $5 + add $4,$4,$5 ;; $4 <- $4 + $5 + srwi $4,$4,1 ;; $4 <- $4 >> 1 + rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] + stw $4,0($1) ;; *$1 <- $4 +.endmacro + +.macro DRAWMETHOD_DFLT_MACRO + DRAWMETHOD_PLUS_MACRO +.endmacro + +; -------------------------------------------------------------------------------------- + + + +; ************************************************************************************** +; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); +; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +; ************************************************************************************** +.globl _DRAWMETHOD_PLUS_2_PPC +.align 3 +_DRAWMETHOD_PLUS_2_PPC: + DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 + blr ;; return + +.globl _DRAWMETHOD_PLUS_PPC +.align 3 +_DRAWMETHOD_PLUS_PPC: + DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 + blr ;; return + + +; ************************************************************************************** +; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); +; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +; ************************************************************************************** +.globl _DRAWMETHOD_HALF_2_PPC +.align 3 +_DRAWMETHOD_HALF_2_PPC: + DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 + blr ;; return + +.globl _DRAWMETHOD_HALF_PPC +.align 3 +_DRAWMETHOD_HALF_PPC: + DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 + blr ;; return + + +; ************************************************************************************** +; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, +; unsigned int screenx, unsigned int screeny) +; ************************************************************************************** +.globl _DRAW_LINE_PPC +.align 3 +_DRAW_LINE_PPC: + ;; NOT IMPLEMENTED YET + blr ;; return + + +; ************************************************************************************** +; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) +; ************************************************************************************** + + +.const +.align 4 +vectorZERO: + .long 0,0,0,0 + .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 + .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 + .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B + .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F + + +.section __TEXT,__text,regular,pure_instructions + +.globl _ppc_brightness_G4 +.align 3 +_ppc_brightness_G4: + + +;; PowerPC Altivec code + srwi r5,r5,2 + mtctr r5 + +;;vrsave + mfspr r11,256 + lis r12,0xCFFC + mtspr 256,r12 + + mflr r0 + bcl 20,31,"L00000000001$pb" +"L00000000001$pb": + mflr r10 + mtlr r0 + + addis r9,r10,ha16(vectorZERO-"L00000000001$pb") + addi r9,r9,lo16(vectorZERO-"L00000000001$pb") + + vxor v0,v0,v0 ;; V0 = NULL vector + + addi r9,r9,16 + lvx v10,0,r9 + addi r9,r9,16 + lvx v11,0,r9 + addi r9,r9,16 + lvx v12,0,r9 + addi r9,r9,16 + lvx v13,0,r9 + + addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") + addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") + stw r6,0(r9) + li r6,8 + stw r6,4(r9) + lvx v9,0,r9 + li r9,128 + vspltw v8,v9,0 + vspltw v9,v9,1 + +;; elt counter + li r9,0 + lis r7,0x0F01 + b L7 +.align 4 +L7: + lvx v1,r9,r3 + + vperm v4,v1,v0,v10 + ;********************* + add r10,r9,r3 + ;********************* + vperm v5,v1,v0,v11 + vperm v6,v1,v0,v12 + vperm v7,v1,v0,v13 + + vmulouh v4,v4,v8 + ;********************* + dst r10,r7,3 + ;********************* + vmulouh v5,v5,v8 + vmulouh v6,v6,v8 + vmulouh v7,v7,v8 + vsrw v4,v4,v9 + vsrw v5,v5,v9 + vsrw v6,v6,v9 + vsrw v7,v7,v9 + + vpkuwus v4,v4,v5 + vpkuwus v6,v6,v7 + vpkuhus v1,v4,v6 + + stvx v1,r9,r4 + addi r9,r9,16 + + bdnz L7 + + mtspr 256,r11 + blr + + +.globl _ppc_brightness_G5 +.align 3 +_ppc_brightness_G5: + +;; PowerPC Altivec G5 code + srwi r5,r5,2 + mtctr r5 + +;;vrsave + mfspr r11,256 + lis r12,0xCFFC + mtspr 256,r12 + + mflr r0 + bcl 20,31,"L00000000002$pb" +"L00000000002$pb": + mflr r10 + mtlr r0 + + addis r9,r10,ha16(vectorZERO-"L00000000002$pb") + addi r9,r9,lo16(vectorZERO-"L00000000002$pb") + + vxor v0,v0,v0 ;; V0 = NULL vector + + addi r9,r9,16 + lvx v10,0,r9 + addi r9,r9,16 + lvx v11,0,r9 + addi r9,r9,16 + lvx v12,0,r9 + addi r9,r9,16 + lvx v13,0,r9 + + addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") + addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") + stw r6,0(r9) + li r6,8 + stw r6,4(r9) + lvx v9,0,r9 + li r9,128 + vspltw v8,v9,0 + vspltw v9,v9,1 + +;; elt counter + li r9,0 + lis r7,0x0F01 + b L6 +.align 4 +L6: + lvx v1,r9,r3 + + vperm v4,v1,v0,v10 + ;********************* + add r10,r9,r3 + ;********************* + vperm v5,v1,v0,v11 + vperm v6,v1,v0,v12 + vperm v7,v1,v0,v13 + + vmulouh v4,v4,v8 + vmulouh v5,v5,v8 + vmulouh v6,v6,v8 + vmulouh v7,v7,v8 + vsrw v4,v4,v9 + vsrw v5,v5,v9 + vsrw v6,v6,v9 + vsrw v7,v7,v9 + + vpkuwus v4,v4,v5 + vpkuwus v6,v6,v7 + vpkuhus v1,v4,v6 + + stvx v1,r9,r4 + addi r9,r9,16 + + bdnz L6 + + mtspr 256,r11 + blr + + +.globl _ppc_brightness_generic +.align 3 +_ppc_brightness_generic: + lis r12,0x00FF + ori r12,r12,0x00FF + subi r3,r3,4 + subi r4,r4,4 + mtctr r5 + b L1 +.align 4 +L1: + lwzu r7,4(r3) + + rlwinm r8,r7,16,24,31 + rlwinm r9,r7,24,24,31 + mullw r8,r8,r6 + rlwinm r10,r7,0,24,31 + mullw r9,r9,r6 + srwi r8,r8,8 + mullw r10,r10,r6 + srwi r9,r9,8 + + rlwinm. r11,r8,0,0,23 + beq L2 + li r8,0xFF +L2: + srwi r10,r10,8 + rlwinm. r11,r9,0,0,23 + beq L3 + li r9,0xFF +L3: + rlwinm r7,r8,16,8,15 + rlwinm. r11,r10,0,0,23 + beq L4 + li r10,0xFF +L4: + rlwimi r7,r9,8,16,23 + rlwimi r7,r10,0,24,31 + + stwu r7,4(r4) + bdnz L1 + + blr + + + +.static_data +.align 4 +vectortmpwork: + .long 0,0,0,0 + diff --git a/gst/goom/ppc_zoom_ultimate.h b/gst/goom/ppc_zoom_ultimate.h new file mode 100644 index 0000000..6c6a4cc --- /dev/null +++ b/gst/goom/ppc_zoom_ultimate.h @@ -0,0 +1,25 @@ +/* Goom Project + * Copyright (C) <2003> Guillaume Borios, iOS-Software + * + * 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. + */ + +/* Generic PowerPC Code */ +void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + +/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + diff --git a/gst/goom/ppc_zoom_ultimate.s b/gst/goom/ppc_zoom_ultimate.s new file mode 100644 index 0000000..10c25a5 --- /dev/null +++ b/gst/goom/ppc_zoom_ultimate.s @@ -0,0 +1,336 @@ +; PowerPC optimized zoom for Goom +; © 2001-2003 Guillaume Borios +; 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. + +; Change log : +; 21 Dec 2003 : Use of altivec is now determined with a parameter + +; Section definition : We use a read only section +.text + +; name of the function to call by C program : ppc_zoom +; We declare this label as a global to extend its scope outside this file +.globl _ppc_zoom_generic +.globl _ppc_zoom_G4 + +; Description : +; This routine dynamically computes and applies a zoom filter + +; parameters : +; r3 <=> unsigned int sizeX (in pixels) +; r4 <=> unsigned int sizeY (in pixels) +; r5 <=> unsigned int * frompixmap +; r6 <=> unsigned int * topixmap +; r7 <=> unsigned int * brutS +; r8 <=> unsigned int * brutD +; r9 <=> unsigned int buffratio +; r10 <=> int [16][16] precalccoeffs + +; globals after init +; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) +; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) +; r3 <=> ax = x max in 16th of pixels (replaces old r3) +; r4 <=> ay = y max in 16th of pixels (replaces old r4) +; r20 <=> row size in bytes +; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) + +; ABI notes : +; r1 is the Stack Pointer (SP) => Do not use +; r13..r31 are non-volatiles => Do not use + +_ppc_zoom_generic: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r18,-56(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r3,r4 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r3,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r3,r3,1 +subi r4,r4,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r6,r6,4 +slwi r3,r3,4 +slwi r4,r4,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +b L1 +.align 5 +L1: + +; computes dynamically the position to fetch +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr4,0,r2,r3 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +cmpl cr7,0,r29,r4 +srawi r29,r29,4 ; pos computing +bge- cr4,L4 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L4 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r5 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r6) ; Stores the computed pixel +bdnz L1 ; Iterate again if needed +b L3 ;goto end ; If not, returns from the function + + +; if out of range +L4: +stwu r18,4(r6) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L1 + + +L3: + +; Restore saved registers and return +lmw r18,-56(r1) +blr + + + + + + + + +_ppc_zoom_G4: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r17,-60(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r3,r4 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r3,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r3,r3,1 +subi r4,r4,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r6,r6,4 +slwi r3,r3,4 +slwi r4,r4,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +;********************* +lis r17,0x0F01 + +b L100 +.align 5 +L100: + +addi r6,r6,4 + +; Optimization to ensure the destination buffer +; won't be loaded into the data cache +rlwinm. r0,r6,0,27,31 +bne+ L500 +dcbz 0,r6 +;dcba 0,r6 +L500: + +; computes dynamically the position to fetch +;mullw r8,r8,r29 +;mullw r2,r2,r29 +;add r2,r8,r2 +;srawi r2,r2,17 + +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +dst r30,r17,0 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +dst r31,r17,1 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr4,0,r2,r3 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +cmpl cr7,0,r29,r4 +srawi r29,r29,4 ; pos computing +bge- cr4,L400 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L400 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r5 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +dst r2,r17,2 +rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 +;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 +;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 +;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 +;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stw r7,0(r6) ; Stores the computed pixel +bdnz L100 ; Iterate again if needed +b L300 ;goto end ; If not, returns from the function + + +; if out of range +L400: +stw r18,0(r6) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L100 + + +L300: + +; Restore saved registers and return +lmw r17,-60(r1) +blr diff --git a/gst/goom/sound_tester.c b/gst/goom/sound_tester.c new file mode 100644 index 0000000..c6e1610 --- /dev/null +++ b/gst/goom/sound_tester.c @@ -0,0 +1,161 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "sound_tester.h" + +#include +#include + +/* some constants */ +#define BIG_GOOM_DURATION 100 +#define BIG_GOOM_SPEED_LIMIT 0.1f + +#define ACCEL_MULT 0.95f +#define SPEED_MULT 0.99f + + +void +evaluate_sound (gint16 data[2][512], SoundInfo * info) +{ + + int i; + float difaccel; + float prevspeed; + + /* find the max */ + int incvar = 0; + + for (i = 0; i < 512; i += 2) { + if (incvar < data[0][i]) + incvar = data[0][i]; + } + + if (incvar > info->allTimesMax) + info->allTimesMax = incvar; + + /* volume sonore */ + info->volume = (float) incvar / (float) info->allTimesMax; + memcpy (info->samples[0], data[0], 512 * sizeof (short)); + memcpy (info->samples[1], data[1], 512 * sizeof (short)); + + difaccel = info->accelvar; + info->accelvar = info->volume; /* accel entre 0 et 1 */ + + /* transformations sur la vitesse du son */ + if (info->speedvar > 1.0f) + info->speedvar = 1.0f; + + if (info->speedvar < 0.1f) + info->accelvar *= (1.0f - (float) info->speedvar); + else if (info->speedvar < 0.3f) + info->accelvar *= (0.9f - (float) (info->speedvar - 0.1f) / 2.0f); + else + info->accelvar *= (0.8f - (float) (info->speedvar - 0.3f) / 4.0f); + + /* adoucissement de l'acceleration */ + info->accelvar *= ACCEL_MULT; + if (info->accelvar < 0) + info->accelvar = 0; + + difaccel = info->accelvar - difaccel; + if (difaccel < 0) + difaccel = -difaccel; + + /* mise a jour de la vitesse */ + prevspeed = info->speedvar; + info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; + info->speedvar *= SPEED_MULT; + info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; + if (info->speedvar < 0) + info->speedvar = 0; + if (info->speedvar > 1) + info->speedvar = 1; + + /* temps du goom */ + info->timeSinceLastGoom++; + info->timeSinceLastBigGoom++; + info->cycle++; + + /* detection des nouveaux gooms */ + if ((info->speedvar > (float) IVAL (info->biggoom_speed_limit_p) / 100.0f) + && (info->accelvar > info->bigGoomLimit) + && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { + info->timeSinceLastBigGoom = 0; + } + + if (info->accelvar > info->goom_limit) { + /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ + info->totalgoom++; + info->timeSinceLastGoom = 0; + info->goomPower = info->accelvar - info->goom_limit; + } + + if (info->accelvar > info->prov_max) + info->prov_max = info->accelvar; + + if (info->goom_limit > 1) + info->goom_limit = 1; + + /* toute les 2 secondes : v�rifier si le taux de goom est correct + * et le modifier sinon.. */ + if (info->cycle % 64 == 0) { + if (info->speedvar < 0.01f) + info->goom_limit *= 0.91; + if (info->totalgoom > 4) { + info->goom_limit += 0.02; + } + if (info->totalgoom > 7) { + info->goom_limit *= 1.03f; + info->goom_limit += 0.03; + } + if (info->totalgoom > 16) { + info->goom_limit *= 1.05f; + info->goom_limit += 0.04; + } + if (info->totalgoom == 0) { + info->goom_limit = info->prov_max - 0.02; + } + if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) + info->goom_limit -= 0.01; + info->totalgoom = 0; + info->bigGoomLimit = + info->goom_limit * (1.0f + + (float) IVAL (info->biggoom_factor_p) / 500.0f); + info->prov_max = 0; + } + + /* mise a jour des parametres pour la GUI */ + FVAL (info->volume_p) = info->volume; + info->volume_p.change_listener (&info->volume_p); + FVAL (info->speed_p) = info->speedvar * 4; + info->speed_p.change_listener (&info->speed_p); + FVAL (info->accel_p) = info->accelvar; + info->accel_p.change_listener (&info->accel_p); + + FVAL (info->goom_limit_p) = info->goom_limit; + info->goom_limit_p.change_listener (&info->goom_limit_p); + FVAL (info->goom_power_p) = info->goomPower; + info->goom_power_p.change_listener (&info->goom_power_p); + FVAL (info->last_goom_p) = 1.0 - ((float) info->timeSinceLastGoom / 20.0f); + info->last_goom_p.change_listener (&info->last_goom_p); + FVAL (info->last_biggoom_p) = + 1.0 - ((float) info->timeSinceLastBigGoom / 40.0f); + info->last_biggoom_p.change_listener (&info->last_biggoom_p); + + /* bigGoomLimit ==goomLimit*9/8+7 ? */ +} diff --git a/gst/goom/sound_tester.h b/gst/goom/sound_tester.h new file mode 100644 index 0000000..a79bf2c --- /dev/null +++ b/gst/goom/sound_tester.h @@ -0,0 +1,29 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _SOUND_TESTER_H +#define _SOUND_TESTER_H + +#include "goom_plugin_info.h" +#include "goom_config.h" + +/** change les donnees du SoundInfo */ +void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo); + +#endif + diff --git a/gst/goom/surf3d.c b/gst/goom/surf3d.c new file mode 100644 index 0000000..588a553 --- /dev/null +++ b/gst/goom/surf3d.c @@ -0,0 +1,152 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "surf3d.h" +#include "goom_plugin_info.h" +#include +#include +#include + +grid3d * +grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) +{ + int x = defx; + int y = defz; + grid3d *g = malloc (sizeof (grid3d)); + surf3d *s = &(g->surf); + + s->nbvertex = x * y; + s->vertex = malloc (x * y * sizeof (v3d)); + s->svertex = malloc (x * y * sizeof (v3d)); + s->center = center; + + g->defx = defx; + g->sizex = sizex; + g->defz = defz; + g->sizez = sizez; + g->mode = 0; + + while (y) { + --y; + x = defx; + while (x) { + --x; + s->vertex[x + defx * y].x = (float) (x - defx / 2) * sizex / defx; + s->vertex[x + defx * y].y = 0; + s->vertex[x + defx * y].z = (float) (y - defz / 2) * sizez / defz; + } + } + return g; +} + +void +grid3d_free (grid3d * g) +{ + surf3d *s = &(g->surf); + + free (s->vertex); + free (s->svertex); + + free (g); +} + +void +grid3d_draw (PluginInfo * plug, grid3d * g, int color, int colorlow, + int dist, Pixel * buf, Pixel * back, int W, int H) +{ + + int x; + v2d v2, v2x; + + v2d *v2_array = malloc (g->surf.nbvertex * sizeof (v2d)); + + v3d_to_v2d (g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); + + for (x = 0; x < g->defx; x++) { + int z; + + v2x = v2_array[x]; + + for (z = 1; z < g->defz; z++) { + v2 = v2_array[z * g->defx + x]; + if (((v2.x != -666) || (v2.y != -666)) + && ((v2x.x != -666) || (v2x.y != -666))) { + plug->methods.draw_line (buf, v2x.x, v2x.y, v2.x, v2.y, colorlow, W, H); + plug->methods.draw_line (back, v2x.x, v2x.y, v2.x, v2.y, color, W, H); + } + v2x = v2; + } + } + + free (v2_array); +} + +void +surf3d_rotate (surf3d * s, float angle) +{ + int i; + float cosa; + float sina; + + SINCOS (angle, sina, cosa); + for (i = 0; i < s->nbvertex; i++) { + Y_ROTATE_V3D (s->vertex[i], s->svertex[i], cosa, sina); + } +} + +void +surf3d_translate (surf3d * s) +{ + int i; + + for (i = 0; i < s->nbvertex; i++) { + TRANSLATE_V3D (s->center, s->svertex[i]); + } +} + +void +grid3d_update (grid3d * g, float angle, float *vals, float dist) +{ + int i; + float cosa; + float sina; + surf3d *s = &(g->surf); + v3d cam = s->center; + + cam.z += dist; + + SINCOS ((angle / 4.3f), sina, cosa); + cam.y += sina * 2.0f; + SINCOS (angle, sina, cosa); + + if (g->mode == 0) { + if (vals) + for (i = 0; i < g->defx; i++) + s->vertex[i].y = s->vertex[i].y * 0.2 + vals[i] * 0.8; + + for (i = g->defx; i < s->nbvertex; i++) { + s->vertex[i].y *= 0.255f; + s->vertex[i].y += (s->vertex[i - g->defx].y * 0.777f); + } + } + + for (i = 0; i < s->nbvertex; i++) { + Y_ROTATE_V3D (s->vertex[i], s->svertex[i], cosa, sina); + TRANSLATE_V3D (cam, s->svertex[i]); + } +} diff --git a/gst/goom/surf3d.h b/gst/goom/surf3d.h new file mode 100644 index 0000000..83caa33 --- /dev/null +++ b/gst/goom/surf3d.h @@ -0,0 +1,57 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _SURF3D_H +#define _SURF3D_H + +#include "v3d.h" +#include "goom_graphic.h" +#include "goom_typedefs.h" + +typedef struct { + v3d *vertex; + v3d *svertex; + int nbvertex; + + v3d center; +} surf3d; + +typedef struct { + surf3d surf; + + int defx; + int sizex; + int defz; + int sizez; + int mode; +} grid3d; + +/* hi-level */ + +/* works on grid3d */ +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); +void grid3d_free (grid3d *g); +void grid3d_update (grid3d *s, float angle, float *vals, float dist); + +/* low level */ +void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); +void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); +void surf3d_rotate (surf3d *s, float angle); +void surf3d_translate (surf3d *s); + +#endif diff --git a/gst/goom/tentacle3d.c b/gst/goom/tentacle3d.c new file mode 100644 index 0000000..4c0d143 --- /dev/null +++ b/gst/goom/tentacle3d.c @@ -0,0 +1,357 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 + +#include "v3d.h" +#include "surf3d.h" +#include "goom_tools.h" +#include "goom_config.h" +#include "goom_plugin_info.h" +#include "tentacle3d.h" + +#define D 256.0f + +#define nbgrid 6 +#define definitionx 15 +#define definitionz 45 + +typedef struct _TENTACLE_FX_DATA +{ + PluginParam enabled_bp; + PluginParameters params; + + float cycle; + grid3d *grille[nbgrid]; + float *vals; + +#define NB_TENTACLE_COLORS 4 + int colors[NB_TENTACLE_COLORS]; + + int col; + int dstcol; + float lig; + float ligs; + + /* statics from pretty_move */ + float distt; + float distt2; + float rot; /* entre 0 et 2 * G_PI */ + int happens; + int rotation; + int lock; +} TentacleFXData; + +static void tentacle_new (TentacleFXData * data); +static void tentacle_update (PluginInfo * goomInfo, Pixel * buf, Pixel * back, + int W, int H, short[2][512], float, int drawit, TentacleFXData * data); +static void tentacle_free (TentacleFXData * data); + +/* + * VisualFX wrapper for the tentacles + */ + +static void +tentacle_fx_init (VisualFX * _this, PluginInfo * info) +{ + + TentacleFXData *data = (TentacleFXData *) malloc (sizeof (TentacleFXData)); + + secure_b_param (&data->enabled_bp, "Enabled", 1); + plugin_parameters (&data->params, "3D Tentacles", 1); + data->params.params[0] = &data->enabled_bp; + + data->cycle = 0.0f; + data->col = + (0x28 << (ROUGE * 8)) | (0x2c << (VERT * 8)) | (0x5f << (BLEU * 8)); + data->dstcol = 0; + data->lig = 1.15f; + data->ligs = 0.1f; + + data->distt = 10.0f; + data->distt2 = 0.0f; + data->rot = 0.0f; /* entre 0 et 2 * G_PI */ + data->happens = 0; + + data->rotation = 0; + data->lock = 0; + data->colors[0] = + (0x18 << (ROUGE * 8)) | (0x4c << (VERT * 8)) | (0x2f << (BLEU * 8)); + data->colors[1] = + (0x48 << (ROUGE * 8)) | (0x2c << (VERT * 8)) | (0x6f << (BLEU * 8)); + data->colors[2] = + (0x58 << (ROUGE * 8)) | (0x3c << (VERT * 8)) | (0x0f << (BLEU * 8)); + data->colors[3] = + (0x87 << (ROUGE * 8)) | (0x55 << (VERT * 8)) | (0x74 << (BLEU * 8)); + tentacle_new (data); + + _this->params = &data->params; + _this->fx_data = (void *) data; +} + +static void +tentacle_fx_apply (VisualFX * _this, Pixel * src, Pixel * dest, + PluginInfo * goomInfo) +{ + TentacleFXData *data = (TentacleFXData *) _this->fx_data; + + if (BVAL (data->enabled_bp)) { + tentacle_update (goomInfo, dest, src, goomInfo->screen.width, + goomInfo->screen.height, goomInfo->sound.samples, + (float) goomInfo->sound.accelvar, + goomInfo->curGState->drawTentacle, data); + } +} + +static void +tentacle_fx_free (VisualFX * _this) +{ + tentacle_free ((TentacleFXData *) _this->fx_data); + free (_this->fx_data); +} + +void +tentacle_fx_create (VisualFX * fx) +{ + fx->init = tentacle_fx_init; + fx->apply = tentacle_fx_apply; + fx->free = tentacle_fx_free; + fx->fx_data = NULL; + fx->params = NULL; +} + +/* ----- */ + +static void +tentacle_free (TentacleFXData * data) +{ + int tmp; + + /* FREE GRID */ + for (tmp = 0; tmp < nbgrid; tmp++) + grid3d_free (data->grille[tmp]); + free (data->vals); + + goom_plugin_parameters_free (&data->params); +} + +static void +tentacle_new (TentacleFXData * data) +{ + int tmp; + + v3d center = { 0, -17.0, 0 }; + data->vals = (float *) malloc ((definitionx + 20) * sizeof (float)); + + for (tmp = 0; tmp < nbgrid; tmp++) { + int x, z; + + z = 45 + rand () % 30; + x = 85 + rand () % 5; + center.z = z; + data->grille[tmp] = + grid3d_new (x, definitionx, z, definitionz + rand () % 10, center); + center.y += 8; + } +} + +static inline unsigned char +lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10 (power) / 2.0; + + if (t > 0) { + val = (int) t; /* (32.0f * log (t)); */ + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } else { + return 0; + } +} + +static void +lightencolor (int *col, float power) +{ + unsigned char *color; + + color = (unsigned char *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + +/* retourne x>>s , en testant le signe de x */ +#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) + +static int +evolutecolor (unsigned int src, unsigned int dest, + unsigned int mask, unsigned int incr) +{ + + int color = src & (~mask); + + src &= mask; + dest &= mask; + + if ((src != mask) + && (src < dest)) + src += incr; + + if (src > dest) + src -= incr; + return (src & mask) | color; +} + +static void +pretty_move (PluginInfo * goomInfo, float cycle, float *dist, float *dist2, + float *rotangle, TentacleFXData * fx_data) +{ + + float tmp; + + /* many magic numbers here... I don't really like that. */ + if (fx_data->happens) + fx_data->happens -= 1; + else if (fx_data->lock == 0) { + fx_data->happens = + goom_irand (goomInfo->gRandom, + 200) ? 0 : 100 + goom_irand (goomInfo->gRandom, 60); + fx_data->lock = fx_data->happens * 3 / 2; + } else + fx_data->lock--; + + tmp = fx_data->happens ? 8.0f : 0; + *dist2 = fx_data->distt2 = (tmp + 15.0f * fx_data->distt2) / 16.0f; + + tmp = 30 + D - 90.0f * (1.0f + sin (cycle * 19 / 20)); + if (fx_data->happens) + tmp *= 0.6f; + + *dist = fx_data->distt = (tmp + 3.0f * fx_data->distt) / 4.0f; + + if (!fx_data->happens) { + tmp = G_PI * sin (cycle) / 32 + 3 * G_PI / 2; + } else { + fx_data->rotation = + goom_irand (goomInfo->gRandom, + 500) ? fx_data->rotation : goom_irand (goomInfo->gRandom, 2); + if (fx_data->rotation) + cycle *= 2.0f * G_PI; + else + cycle *= -1.0f * G_PI; + tmp = cycle - (G_PI * 2.0) * floor (cycle / (G_PI * 2.0)); + } + + if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot + 2.0 * G_PI))) { + fx_data->rot = (tmp + 15.0f * (fx_data->rot + 2 * G_PI)) / 16.0f; + if (fx_data->rot > 2.0 * G_PI) + fx_data->rot -= 2.0 * G_PI; + *rotangle = fx_data->rot; + } else if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot - 2.0 * G_PI))) { + fx_data->rot = (tmp + 15.0f * (fx_data->rot - 2.0 * G_PI)) / 16.0f; + if (fx_data->rot < 0.0f) + fx_data->rot += 2.0 * G_PI; + *rotangle = fx_data->rot; + } else + *rotangle = fx_data->rot = (tmp + 15.0f * fx_data->rot) / 16.0f; +} + +static void +tentacle_update (PluginInfo * goomInfo, Pixel * buf, Pixel * back, int W, int H, + short data[2][512], float rapport, int drawit, TentacleFXData * fx_data) +{ + + int tmp; + int tmp2; + + int color; + int colorlow; + + float dist, dist2, rotangle; + + if ((!drawit) && (fx_data->ligs > 0.0f)) + fx_data->ligs = -fx_data->ligs; + + fx_data->lig += fx_data->ligs; + + if (fx_data->lig > 1.01f) { + if ((fx_data->lig > 10.0f) | (fx_data->lig < 1.1f)) + fx_data->ligs = -fx_data->ligs; + + if ((fx_data->lig < 6.3f) && (goom_irand (goomInfo->gRandom, 30) == 0)) + fx_data->dstcol = goom_irand (goomInfo->gRandom, NB_TENTACLE_COLORS); + + fx_data->col = + evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff, + 0x01); + fx_data->col = + evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff00, + 0x0100); + fx_data->col = + evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff0000, + 0x010000); + fx_data->col = + evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], + 0xff000000, 0x01000000); + + color = fx_data->col; + colorlow = fx_data->col; + + lightencolor (&color, fx_data->lig * 2.0f + 2.0f); + lightencolor (&colorlow, (fx_data->lig / 3.0f) + 0.67f); + + rapport = 1.0f + 2.0f * (rapport - 1.0f); + rapport *= 1.2f; + if (rapport > 1.12f) + rapport = 1.12f; + + pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); + + for (tmp = 0; tmp < nbgrid; tmp++) { + for (tmp2 = 0; tmp2 < definitionx; tmp2++) { + float val = + (float) (ShiftRight (data[0][goom_irand (goomInfo->gRandom, 511)], + 10)) * rapport; + + fx_data->vals[tmp2] = val; + } + + grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); + } + fx_data->cycle += 0.01f; + for (tmp = 0; tmp < nbgrid; tmp++) + grid3d_draw (goomInfo, fx_data->grille[tmp], color, colorlow, dist, buf, + back, W, H); + } else { + fx_data->lig = 1.05f; + if (fx_data->ligs < 0.0f) + fx_data->ligs = -fx_data->ligs; + pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); + fx_data->cycle += 0.1f; + if (fx_data->cycle > 1000) + fx_data->cycle = 0; + } +} diff --git a/gst/goom/tentacle3d.h b/gst/goom/tentacle3d.h new file mode 100644 index 0000000..3696dd8 --- /dev/null +++ b/gst/goom/tentacle3d.h @@ -0,0 +1,26 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _TENTACLE3D_H +#define _TENTACLE3D_H + +#include "goom_visual_fx.h" + +void tentacle_fx_create(VisualFX *fx); + +#endif diff --git a/gst/goom/v3d.c b/gst/goom/v3d.c new file mode 100644 index 0000000..f37141e --- /dev/null +++ b/gst/goom/v3d.c @@ -0,0 +1,38 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 "v3d.h" + +void +v3d_to_v2d (v3d * v3, int nbvertex, int width, int height, float distance, + v2d * v2) +{ + int i; + + for (i = 0; i < nbvertex; ++i) { + if (v3[i].z > 2) { + int Xp, Yp; + + F2I ((distance * v3[i].x / v3[i].z), Xp); + F2I ((distance * v3[i].y / v3[i].z), Yp); + v2[i].x = Xp + (width >> 1); + v2[i].y = -Yp + (height >> 1); + } else + v2[i].x = v2[i].y = -666; + } +} diff --git a/gst/goom/v3d.h b/gst/goom/v3d.h new file mode 100644 index 0000000..4257cca --- /dev/null +++ b/gst/goom/v3d.h @@ -0,0 +1,83 @@ +/* Goom Project + * Copyright (C) <2003> iOS-Software + * + * 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 _V3D_H +#define _V3D_H + +#include +#include +#include + +#include "mathtools.h" + +typedef struct { + float x,y,z; +} v3d; + +typedef struct { + int x,y; +} v2d; + +typedef struct { + double x,y; +} v2g; + +/* + * projete le vertex 3D sur le plan d'affichage + * retourne (0,0) si le point ne doit pas etre affiche. + * + * bonne valeur pour distance : 256 + */ +#define V3D_TO_V2D(v3,v2,width,height,distance) \ +{ \ + int Xp, Yp; \ + if (v3.z > 2) { \ + F2I((distance * v3.x / v3.z),Xp) ; \ + F2I((distance * v3.y / v3.z),Yp) ; \ + v2.x = Xp + (width>>1); \ + v2.y = -Yp + (height>>1); \ + } \ + else v2.x=v2.y=-666; \ +} + +void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); + +/* + * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) + * centerz = centre de rotation en z + */ +#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ +{\ + vf.x = vi.x * cosa - vi.z * sina;\ + vf.z = vi.x * sina + vi.z * cosa;\ + vf.y = vi.y;\ +} + +/* + * translation + */ +#define TRANSLATE_V3D(vsrc,vdest)\ +{\ + vdest.x += vsrc.x;\ + vdest.y += vsrc.y;\ + vdest.z += vsrc.z;\ +} + +#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} + +#endif diff --git a/gst/goom/xmmx.c b/gst/goom/xmmx.c new file mode 100644 index 0000000..ea87cf9 --- /dev/null +++ b/gst/goom/xmmx.c @@ -0,0 +1,402 @@ +/* xmmx.c + + eXtended 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 xmmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DXMMX_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. + + 1999 by R. Fisher + Based on libmmx, 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "goom_config.h" + +#ifdef HAVE_MMX + +/* a definir pour avoir exactement le meme resultat que la fonction C + * (un chouillat plus lent).. mais la difference est assez peu notable. + */ +// #define STRICT_COMPAT + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +/* faire : a % sqrtperte <=> a & pertemask*/ +#define PERTEMASK 0xf +/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +#define PERTEDEC 4 + + +/*#define MMX_TRACE*/ +#include "mmx.h" +/*#include "xmmx.h"*/ +#include "goom_graphic.h" + +int +xmmx_supported (void) +{ + return (mm_support () & 0x8) >> 3; +} + +void +zoom_filter_xmmx (int prevX, int prevY, + Pixel * expix1, Pixel * expix2, + int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t *) lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t *) lbruD; /* buffer de transformation dest */ + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + + /* volatile mmx_t interpix; */ + + expix1[0].val = expix1[prevX - 1].val = expix1[prevX * prevY - 1].val = + expix1[prevX * prevY - prevX].val = 0; + + prevXY.ud[0] = (prevX - 1) << PERTEDEC; + prevXY.ud[1] = (prevY - 1) << PERTEDEC; + + ratiox.d[0] = buffratio; + ratiox.d[1] = buffratio; + + asm volatile ("\n\t movq %[ratio], %%mm6" "\n\t pslld $16, %%mm6" /* mm6 = [rat16=buffratio<<16 | rat16=buffratio<<16] */ + "\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + ::[ratio] "m" (ratiox)); + + loop = 0; + + /* + * NOTE : mm6 et mm7 ne sont pas modifies dans la boucle. + */ + while (loop < bufsize) { + /* Thread #1 + * pre : mm6 = [rat16|rat16] + * post : mm0 = S + ((D-S)*rat16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + asm volatile ("#1 \n\t movq 0(%[brutS]), %%mm0" "#1 \n\t movq 0(%[brutD]), %%mm1" "#1 \n\t psubd %%mm0, %%mm1" /* mm1 = D - S */ + "#1 \n\t movq %%mm1, %%mm2" /* mm2 = D - S */ + "#1 \n\t pslld $16, %%mm1" "#1 \n\t pmullw %%mm6, %%mm2" "#1 \n\t pmulhuw %%mm6, %%mm1" "#1 \n\t pslld $16, %%mm0" "#1 \n\t paddd %%mm2, %%mm1" /* mm1 = (D - S) * buffratio >> 16 */ + "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ + "#1 \n\t psrld $16, %%mm0"::[brutS] "r" (&brutS[loop]), + [brutD] "r" (&brutD[loop]) + ); /* mm0 = S */ + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1,mm2 + */ + asm volatile + ("#1 \n\t movq %[prevXY], %%mm1" "#1 \n\t pcmpgtd %%mm0, %%mm1" + /* mm0 en X contient (idem pour Y) : + * 1111 si prevXY > px + * 0000 si prevXY <= px */ +#ifdef STRICT_COMPAT + "#1 \n\t movq %%mm1, %%mm2" + "#1 \n\t punpckhdq %%mm2, %%mm2" + "#1 \n\t punpckldq %%mm1, %%mm1" "#1 \n\t pand %%mm2, %%mm0" +#endif + "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ + ::[prevXY] "m" (prevXY)); + + /* Thread #2 + * pre : mm0 : clipped position on screen + * + * post : mm3 : coefs for this position + * mm1 : X vector [0|X] + * + * modif : eax,esi + */ + __asm__ __volatile__ ("#2 \n\t movd %%mm0,%%esi" + "#2 \n\t movq %%mm0,%%mm1" + "#2 \n\t andl $15,%%esi" + "#2 \n\t psrlq $32,%%mm1" + "#2 \n\t shll $6,%%esi" + "#2 \n\t movd %%mm1,%%eax" + "#2 \n\t addl %[precalCoef],%%esi" + "#2 \n\t andl $15,%%eax" + "#2 \n\t movd (%%esi,%%eax,4),%%mm3"::[precalCoef] + "g" (precalCoef):"eax", "esi"); + + /* + * extraction des coefficients... (Thread #3) + * + * pre : coef dans mm3 + * + * post : coef extraits dans mm3 (c1 & c2) + * et mm4 (c3 & c4) + * + * modif : mm5 + */ + + /* (Thread #4) + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * + * post : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * + * modif : eax, esi + */ + __asm__ __volatile__ ("#2 \n\t psrld $4, %%mm0" "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ + "#4 \n\t movd %%mm1,%%eax" + "#3 \n\t movq %%mm3,%%mm5" + "#4 \n\t mull %[prevX]" + "#4 \n\t movd %%mm0,%%esi" + "#3 \n\t punpcklbw %%mm5, %%mm3" + "#4 \n\t addl %%esi, %%eax" + "#3 \n\t movq %%mm3, %%mm4" + "#3 \n\t movq %%mm3, %%mm5" + "#4 \n\t movl %[expix1], %%esi" + "#3 \n\t punpcklbw %%mm5, %%mm3" + "#4 \n\t movq (%%esi,%%eax,4),%%mm0" + "#3 \n\t punpckhbw %%mm5, %%mm4" + "#4 \n\t addl %[prevX],%%eax" + "#4 \n\t movq (%%esi,%%eax,4),%%mm2"::[expix1] "g" (expix1) + ,[prevX] "g" (prevX) + :"eax", "esi", "edx"); + + /* + * pre : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * mm3 & mm4 : coefs + */ + + /* recopie des deux premiers pixels dans mm0 et mm1 */ + movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ + punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + + /* extraction des coefficients... */ + + movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + + /*^en parrallele^ *//* depackage du 2ieme pixel */ + /*^ */ punpckhbw_r2r (mm7, mm1); + /* 00-b1-00-v1-00-r1-00-a1 */ + + punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ + movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ + movq_r2r (mm2, mm1); + + /* depackage des pixels */ + punpcklbw_r2r (mm7, mm1); + punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ + pmullw_r2r (mm4, mm1); + pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues � la valeur finale */ + paddw_r2r (mm1, mm0); + paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + psrlw_i2r (8, mm0); + packuswb_r2r (mm7, mm0); + + movd_r2m (mm0, expix2[loop]); + + ++loop; + } + /* this was femms, which is AMD 3dnow */ + __asm__ __volatile__ ("emms\n"); +} + +#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ +{ \ + movd_m2r(_backbuf, mm0); \ + paddusb_m2r(_col, mm0); \ + movd_r2m(mm0, _out); \ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) + +void +draw_line_xmmx (Pixel * data, int x1, int y1, int x2, int y2, int col, + int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) + || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + goto end_of_line; + + dx = x2 - x1; + dy = y2 - y1; + if (x1 >= x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + goto end_of_line; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + goto end_of_line; + } + } +end_of_line: + /* this was femms, which is AMD 3dnow */ + __asm__ __volatile__ ("emms\n"); +} +#else +int +xmmx_supported (void) +{ + return (0); +} +#endif diff --git a/gst/goom/xmmx.h b/gst/goom/xmmx.h new file mode 100644 index 0000000..70ef361 --- /dev/null +++ b/gst/goom/xmmx.h @@ -0,0 +1,537 @@ +/* xmmx.h + + eXtended 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 xmmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DXMMX_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. + + 1999 by R. Fisher + Based on libmmx, 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _XMMX_H +#define _XMMX_H + + +/* 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 (Extended) 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) +*/ +#ifndef _MMX_H +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 */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +#endif + + + +/* Function to test if multimedia instructions are supported... +*/ +static 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" /* 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 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... +*/ +#ifndef _XMMX_H +inline extern int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} +#endif + +/* Function to test if xmmx instructions are supported... +*/ +inline extern int +xmmx_ok(void) +{ + /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ + return ( (mm_support() & 0x2) >> 1 ); +} + + +/* 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 XMMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#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%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#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%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __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%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_m2ir(op, mem, rs) \ + __asm__ __volatile__ (#op " %0, %%" #rs \ + : /* nothing */ \ + : "X" (mem) ) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_r2ir(op, rs1, rs2) \ + __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ + : /* nothing */ \ + : /* nothing */ ) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (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)) + + + +/* 4x16 Parallel MAGnitude +*/ +#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) +#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) +#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) + + +/* 4x16 Parallel ADDs using Saturation arithmetic + and Implied destination +*/ +#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) +#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) +#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) + + +/* 4x16 Parallel SUBs using Saturation arithmetic + and Implied destination +*/ +#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) +#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) +#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15. +*/ +#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) +#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) +#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15, storing to Implied register +*/ +#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) +#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) +#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) + + +/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions + of results Rounded with 1/2 bit 15, accumulating with Implied register +*/ +#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) +#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) +#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) + + +/* 8x8u Parallel AVErage +*/ +#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) +#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) +#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) + + +/* 8x8u Parallel DISTance and accumulate with + unsigned saturation to Implied register +*/ +#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) +#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Zero +*/ +#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Not Zero +*/ +#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Less than Zero +*/ +#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Greater than or Equal to Zero +*/ +#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) + + +/* Fast 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-xmmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef XMMX_TRACE + +#define femms() \ + { \ + fprintf(stderr, "femms()\n"); \ + __asm__ __volatile__ ("femms"); \ + } + +#else + +#define femms() __asm__ __volatile__ ("femms") + +#endif + +#endif + diff --git a/gst/goom2k1/Makefile.am b/gst/goom2k1/Makefile.am new file mode 100644 index 0000000..6b2ddfd --- /dev/null +++ b/gst/goom2k1/Makefile.am @@ -0,0 +1,29 @@ +plugin_LTLIBRARIES = libgstgoom2k1.la + +GOOM_FILTER_FILES = filters.c +GOOM_FILTER_CFLAGS = -UMMX -UUSE_ASM + +noinst_HEADERS = gstgoom.h filters.h goom_core.h goom_tools.h graphic.h lines.h + +libgstgoom2k1_la_SOURCES = gstgoom.c goom_core.c $(GOOM_FILTER_FILES) graphic.c lines.c + +libgstgoom2k1_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GOOM_FILTER_CFLAGS) +libgstgoom2k1_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) +libgstgoom2k1_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstgoom2k1_la_LIBTOOLFLAGS = --tag=disable-static + +EXTRA_DIST = filters.c + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstgoom2k1 -:SHARED libgstgoom2k1 \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstgoom2k1_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgoom2k1_la_CFLAGS) \ + -:LDFLAGS $(libgstgoom2k1_la_LDFLAGS) \ + $(libgstgoom2k1_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/goom2k1/Makefile.in b/gst/goom2k1/Makefile.in new file mode 100644 index 0000000..d6b9d6d --- /dev/null +++ b/gst/goom2k1/Makefile.in @@ -0,0 +1,857 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/goom2k1 +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstgoom2k1_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__objects_1 = libgstgoom2k1_la-filters.lo +am_libgstgoom2k1_la_OBJECTS = libgstgoom2k1_la-gstgoom.lo \ + libgstgoom2k1_la-goom_core.lo $(am__objects_1) \ + libgstgoom2k1_la-graphic.lo libgstgoom2k1_la-lines.lo +libgstgoom2k1_la_OBJECTS = $(am_libgstgoom2k1_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstgoom2k1_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) \ + $(libgstgoom2k1_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstgoom2k1_la_SOURCES) +DIST_SOURCES = $(libgstgoom2k1_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstgoom2k1.la +GOOM_FILTER_FILES = filters.c +GOOM_FILTER_CFLAGS = -UMMX -UUSE_ASM +noinst_HEADERS = gstgoom.h filters.h goom_core.h goom_tools.h graphic.h lines.h +libgstgoom2k1_la_SOURCES = gstgoom.c goom_core.c $(GOOM_FILTER_FILES) graphic.c lines.c +libgstgoom2k1_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GOOM_FILTER_CFLAGS) +libgstgoom2k1_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) +libgstgoom2k1_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstgoom2k1_la_LIBTOOLFLAGS = --tag=disable-static +EXTRA_DIST = filters.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/goom2k1/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/goom2k1/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstgoom2k1.la: $(libgstgoom2k1_la_OBJECTS) $(libgstgoom2k1_la_DEPENDENCIES) $(EXTRA_libgstgoom2k1_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstgoom2k1_la_LINK) -rpath $(plugindir) $(libgstgoom2k1_la_OBJECTS) $(libgstgoom2k1_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-filters.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-goom_core.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-graphic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-gstgoom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-lines.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstgoom2k1_la-gstgoom.lo: gstgoom.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-gstgoom.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-gstgoom.Tpo -c -o libgstgoom2k1_la-gstgoom.lo `test -f 'gstgoom.c' || echo '$(srcdir)/'`gstgoom.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-gstgoom.Tpo $(DEPDIR)/libgstgoom2k1_la-gstgoom.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgoom.c' object='libgstgoom2k1_la-gstgoom.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-gstgoom.lo `test -f 'gstgoom.c' || echo '$(srcdir)/'`gstgoom.c + +libgstgoom2k1_la-goom_core.lo: goom_core.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-goom_core.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-goom_core.Tpo -c -o libgstgoom2k1_la-goom_core.lo `test -f 'goom_core.c' || echo '$(srcdir)/'`goom_core.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-goom_core.Tpo $(DEPDIR)/libgstgoom2k1_la-goom_core.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='goom_core.c' object='libgstgoom2k1_la-goom_core.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-goom_core.lo `test -f 'goom_core.c' || echo '$(srcdir)/'`goom_core.c + +libgstgoom2k1_la-filters.lo: filters.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-filters.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-filters.Tpo -c -o libgstgoom2k1_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-filters.Tpo $(DEPDIR)/libgstgoom2k1_la-filters.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters.c' object='libgstgoom2k1_la-filters.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c + +libgstgoom2k1_la-graphic.lo: graphic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-graphic.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-graphic.Tpo -c -o libgstgoom2k1_la-graphic.lo `test -f 'graphic.c' || echo '$(srcdir)/'`graphic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-graphic.Tpo $(DEPDIR)/libgstgoom2k1_la-graphic.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='graphic.c' object='libgstgoom2k1_la-graphic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-graphic.lo `test -f 'graphic.c' || echo '$(srcdir)/'`graphic.c + +libgstgoom2k1_la-lines.lo: lines.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-lines.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-lines.Tpo -c -o libgstgoom2k1_la-lines.lo `test -f 'lines.c' || echo '$(srcdir)/'`lines.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-lines.Tpo $(DEPDIR)/libgstgoom2k1_la-lines.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lines.c' object='libgstgoom2k1_la-lines.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-lines.lo `test -f 'lines.c' || echo '$(srcdir)/'`lines.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstgoom2k1 -:SHARED libgstgoom2k1 \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstgoom2k1_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgoom2k1_la_CFLAGS) \ + -:LDFLAGS $(libgstgoom2k1_la_LDFLAGS) \ + $(libgstgoom2k1_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/goom2k1/README b/gst/goom2k1/README new file mode 100644 index 0000000..f12cf1b --- /dev/null +++ b/gst/goom2k1/README @@ -0,0 +1,5 @@ +The Goom plugin is based on the Goom visualization code from +the Goom homepage found at: +http://ios.free.fr/?page=projet&quoi=1 + +Like the original library so is the Goom plugin available under the LGPL license diff --git a/gst/goom2k1/filters.c b/gst/goom2k1/filters.c new file mode 100644 index 0000000..1b1ea13 --- /dev/null +++ b/gst/goom2k1/filters.c @@ -0,0 +1,606 @@ +/* filter.c version 0.7 + * contient les filtres applicable a un buffer + * creation : 01/10/2000 + * -ajout de sinFilter() + * -ajout de zoomFilter() + * -copie de zoomFilter() en zoomFilterRGB(), gérant les 3 couleurs + * -optimisation de sinFilter (utilisant une table de sin) + * -asm + * -optimisation de la procedure de génération du buffer de transformation + * la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] +*/ + +/*#define _DEBUG_PIXEL; */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "filters.h" +#include "graphic.h" +#include "goom_tools.h" +#include "goom_core.h" +#include +#include +#include + +#ifdef MMX +#define USE_ASM +#endif +#ifdef POWERPC +#define USE_ASM +#endif + +#ifdef USE_ASM +#define EFFECT_DISTORS 4 +#else +#define EFFECT_DISTORS 10 +#endif + + +#ifdef USE_ASM + +#ifdef MMX +int mmx_zoom (); +guint32 mmx_zoom_size; +#endif /* MMX */ + +#ifdef POWERPC +extern unsigned int useAltivec; +extern void ppc_zoom (void); +extern void ppc_zoom_altivec (void); +unsigned int ppcsize4; +#endif /* PowerPC */ + + +unsigned int *coeffs = 0, *freecoeffs = 0; +guint32 *expix1 = 0; /* pointeur exporte vers p1 */ +guint32 *expix2 = 0; /* pointeur exporte vers p2 */ +guint32 zoom_width; +#endif /* ASM */ + + +static int firstTime = 1; +static int sintable[0xffff]; + +ZoomFilterData * +zoomFilterNew (void) +{ + ZoomFilterData *zf = malloc (sizeof (ZoomFilterData)); + + zf->vitesse = 128; + zf->pertedec = 8; + zf->sqrtperte = 16; + zf->middleX = 1; + zf->middleY = 1; + zf->reverse = 0; + zf->mode = WAVE_MODE; + zf->hPlaneEffect = 0; + zf->vPlaneEffect = 0; + zf->noisify = 0; + zf->buffsize = 0; + zf->res_x = 0; + zf->res_y = 0; + + zf->buffer = NULL; + zf->firedec = NULL; + + zf->wave = 0; + zf->wavesp = 0; + + return zf; +} + +/* retourne x>>s , en testant le signe de x */ +static inline int +ShiftRight (int x, const unsigned char s) +{ + if (x < 0) + return -(-x >> s); + else + return x >> s; +} + +/* + calculer px et py en fonction de x,y,middleX,middleY et theMode + px et py indique la nouvelle position (en sqrtperte ieme de pixel) + (valeur * 16) +*/ +static void +calculatePXandPY (GoomData * gd, int x, int y, int *px, int *py) +{ + ZoomFilterData *zf = gd->zfd; + int middleX, middleY; + guint32 resoly = zf->res_y; + int vPlaneEffect = zf->vPlaneEffect; + int hPlaneEffect = zf->hPlaneEffect; + int vitesse = zf->vitesse; + char theMode = zf->mode; + + if (theMode == WATER_MODE) { + int wavesp = zf->wavesp; + int wave = zf->wave; + int yy = y + RAND (gd) % 4 + wave / 10; + + yy -= RAND (gd) % 4; + if (yy < 0) + yy = 0; + if (yy >= resoly) + yy = resoly - 1; + + *px = (x << 4) + zf->firedec[yy] + (wave / 10); + *py = (y << 4) + 132 - ((vitesse < 132) ? vitesse : 131); + + wavesp += RAND (gd) % 3; + wavesp -= RAND (gd) % 3; + if (wave < -10) + wavesp += 2; + if (wave > 10) + wavesp -= 2; + wave += (wavesp / 10) + RAND (gd) % 3; + wave -= RAND (gd) % 3; + if (wavesp > 100) + wavesp = (wavesp * 9) / 10; + + zf->wavesp = wavesp; + zf->wave = wave; + } else { + int dist; + register int vx, vy; + int fvitesse = vitesse << 4; + + middleX = zf->middleX; + middleY = zf->middleY; + + if (zf->noisify) { + x += RAND (gd) % zf->noisify; + x -= RAND (gd) % zf->noisify; + y += RAND (gd) % zf->noisify; + y -= RAND (gd) % zf->noisify; + } + + if (hPlaneEffect) + vx = ((x - middleX) << 9) + hPlaneEffect * (y - middleY); + else + vx = (x - middleX) << 9; + + if (vPlaneEffect) + vy = ((y - middleY) << 9) + vPlaneEffect * (x - middleX); + else + vy = (y - middleY) << 9; + + switch (theMode) { + case WAVE_MODE: + dist = + ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, + 9) * ShiftRight (vy, 9); + fvitesse *= + 1024 + + ShiftRight (sintable[(unsigned short) (0xffff * dist * + EFFECT_DISTORS)], 6); + fvitesse /= 1024; + break; + case CRYSTAL_BALL_MODE: + dist = + ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, + 9) * ShiftRight (vy, 9); + fvitesse += (dist * EFFECT_DISTORS >> 10); + break; + case AMULETTE_MODE: + dist = + ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, + 9) * ShiftRight (vy, 9); + fvitesse -= (dist * EFFECT_DISTORS >> 4); + break; + case SCRUNCH_MODE: + dist = + ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, + 9) * ShiftRight (vy, 9); + fvitesse -= (dist * EFFECT_DISTORS >> 9); + break; + } + if (vx < 0) + *px = (middleX << 4) - (-(vx * fvitesse) >> 16); + else + *px = (middleX << 4) + ((vx * fvitesse) >> 16); + if (vy < 0) + *py = (middleY << 4) - (-(vy * fvitesse) >> 16); + else + *py = (middleY << 4) + ((vy * fvitesse) >> 16); + } +} + +/*#define _DEBUG */ + +static inline void +setPixelRGB (Uint * buffer, Uint x, Uint y, Color c, + guint32 resolx, guint32 resoly) +{ +/* buffer[ y*WIDTH + x ] = (c.r<<16)|(c.v<<8)|c.b */ +#ifdef _DEBUG_PIXEL + if (x + y * resolx >= resolx * resoly) { + fprintf (stderr, "setPixel ERROR : hors du tableau... %i, %i\n", x, y); + /*exit (1) ; */ + } +#endif + +#ifdef USE_DGA + buffer[y * resolx + x] = (c.b << 16) | (c.v << 8) | c.r; +#else + buffer[y * resolx + x] = (c.r << 16) | (c.v << 8) | c.b; +#endif +} + + +static inline void +setPixelRGB_ (Uint * buffer, Uint x, Color c, guint32 resolx, guint32 resoly) +{ +#ifdef _DEBUG + if (x >= resolx * resoly) { + printf ("setPixel ERROR : hors du tableau... %i >= %i*%i (%i)\n", x, resolx, + resoly, resolx * resoly); + exit (1); + } +#endif + +#ifdef USE_DGA + buffer[x] = (c.b << 16) | (c.v << 8) | c.r; +#else + buffer[x] = (c.r << 16) | (c.v << 8) | c.b; +#endif +} + + + +static inline void +getPixelRGB (Uint * buffer, Uint x, Uint y, Color * c, + guint32 resolx, guint32 resoly) +{ + register unsigned char *tmp8; + +#ifdef _DEBUG + if (x + y * resolx >= resolx * resoly) { + printf ("getPixel ERROR : hors du tableau... %i, %i\n", x, y); + exit (1); + } +#endif + +#ifdef __BIG_ENDIAN__ + c->b = *(unsigned char *) (tmp8 = + (unsigned char *) (buffer + (x + y * resolx))); + c->r = *(unsigned char *) (++tmp8); + c->v = *(unsigned char *) (++tmp8); + c->b = *(unsigned char *) (++tmp8); + +#else + /* ATTENTION AU PETIT INDIEN */ + c->b = *(unsigned char *) (tmp8 = + (unsigned char *) (buffer + (x + y * resolx))); + c->v = *(unsigned char *) (++tmp8); + c->r = *(unsigned char *) (++tmp8); +/* *c = (Color) buffer[x+y*WIDTH] ; */ +#endif +} + + +static inline void +getPixelRGB_ (Uint * buffer, Uint x, Color * c, guint32 resolx, guint32 resoly) +{ + register unsigned char *tmp8; + +#ifdef _DEBUG + if (x >= resolx * resoly) { + printf ("getPixel ERROR : hors du tableau... %i\n", x); + exit (1); + } +#endif + +#ifdef __BIG_ENDIAN__ + c->b = *(unsigned char *) (tmp8 = (unsigned char *) (buffer + x)); + c->r = *(unsigned char *) (++tmp8); + c->v = *(unsigned char *) (++tmp8); + c->b = *(unsigned char *) (++tmp8); + +#else + /* ATTENTION AU PETIT INDIEN */ + tmp8 = (unsigned char *) (buffer + x); + c->b = *(unsigned char *) (tmp8++); + c->v = *(unsigned char *) (tmp8++); + c->r = *(unsigned char *) (tmp8); +/* *c = (Color) buffer[x+y*WIDTH] ; */ +#endif +} + +static void +zoomFilterSetResolution (GoomData * gd, ZoomFilterData * zf) +{ + unsigned short us; + + if (zf->buffsize >= gd->buffsize) { + zf->res_x = gd->resolx; + zf->res_y = gd->resoly; + zf->middleX = gd->resolx / 2; + zf->middleY = gd->resoly - 1; + + return; + } +#ifndef USE_ASM + if (zf->buffer) + free (zf->buffer); + zf->buffer = 0; +#else + if (coeffs) + free (freecoeffs); + coeffs = 0; +#endif + zf->middleX = gd->resolx / 2; + zf->middleY = gd->resoly - 1; + zf->res_x = gd->resolx; + zf->res_y = gd->resoly; + + if (zf->firedec) + free (zf->firedec); + zf->firedec = 0; + + zf->buffsize = gd->resolx * gd->resoly * sizeof (unsigned int); + +#ifdef USE_ASM + freecoeffs = (unsigned int *) + malloc (resx * resy * 2 * sizeof (unsigned int) + 128); + coeffs = (guint32 *) ((1 + ((unsigned int) (freecoeffs)) / 128) * 128); + +#else + zf->buffer = calloc (sizeof (guint32), zf->buffsize * 5); + zf->pos10 = zf->buffer; + zf->c[0] = zf->pos10 + zf->buffsize; + zf->c[1] = zf->c[0] + zf->buffsize; + zf->c[2] = zf->c[1] + zf->buffsize; + zf->c[3] = zf->c[2] + zf->buffsize; +#endif + zf->firedec = (int *) malloc (zf->res_y * sizeof (int)); + + if (firstTime) { + firstTime = 0; + + /* generation d'une table de sinus */ + for (us = 0; us < 0xffff; us++) { + sintable[us] = (int) (1024.0f * sin (us * 2 * 3.31415f / 0xffff)); + } + } + + { + int loopv; + + for (loopv = zf->res_y; loopv != 0;) { + int decc = 0; + int spdc = 0; + int accel = 0; + + loopv--; + zf->firedec[loopv] = decc; + decc += spdc / 10; + spdc += RAND (gd) % 3; + spdc -= RAND (gd) % 3; + + if (decc > 4) + spdc -= 1; + if (decc < -4) + spdc += 1; + + if (spdc > 30) + spdc = spdc - RAND (gd) % 3 + accel / 10; + if (spdc < -30) + spdc = spdc + RAND (gd) % 3 + accel / 10; + + if (decc > 8 && spdc > 1) + spdc -= RAND (gd) % 3 - 2; + + if (decc < -8 && spdc < -1) + spdc += RAND (gd) % 3 + 2; + + if (decc > 8 || decc < -8) + decc = decc * 8 / 9; + + accel += RAND (gd) % 2; + accel -= RAND (gd) % 2; + if (accel > 20) + accel -= 2; + if (accel < -20) + accel += 2; + } + } +} + +void +zoomFilterDestroy (ZoomFilterData * zf) +{ + if (zf) { + if (zf->firedec) + free (zf->firedec); + if (zf->buffer) + free (zf->buffer); + free (zf); + } +} + +/*===============================================================*/ +void +zoomFilterFastRGB (GoomData * goomdata, ZoomFilterData * zf, int zfd_update) +{ + guint32 prevX = goomdata->resolx; + guint32 prevY = goomdata->resoly; + + guint32 *pix1 = goomdata->p1; + guint32 *pix2 = goomdata->p2; + unsigned int *pos10; + unsigned int **c; + + Uint x, y; + +/* static unsigned int prevX = 0, prevY = 0; */ + +#ifdef USE_ASM + expix1 = pix1; + expix2 = pix2; +#else + Color couleur; + Color col1, col2, col3, col4; + Uint position; +#endif + + if ((goomdata->resolx != zf->res_x) || (goomdata->resoly != zf->res_y)) { + zoomFilterSetResolution (goomdata, zf); + } + + pos10 = zf->pos10; + c = zf->c; + + if (zfd_update) { + guchar sqrtperte = zf->sqrtperte; + gint start_y = 0; + + if (zf->reverse) + zf->vitesse = 256 - zf->vitesse; + + /* generation du buffer */ + for (y = 0; y < zf->res_y; y++) { + gint y_16 = y << 4; + gint max_px = (prevX - 1) * sqrtperte; + gint max_py = (prevY - 1) * sqrtperte; + + for (x = 0; x < zf->res_x; x++) { + gint px, py; + guchar coefv, coefh; + + /* calculer px et py en fonction de */ + /* x,y,middleX,middleY et theMode */ + calculatePXandPY (goomdata, x, y, &px, &py); + + if ((px == x << 4) && (py == y_16)) + py += 8; + + if ((py < 0) || (px < 0) || (py >= max_py) || (px >= max_px)) { +#ifdef USE_ASM + coeffs[(y * prevX + x) * 2] = 0; + coeffs[(y * prevX + x) * 2 + 1] = 0; +#else + pos10[start_y + x] = 0; + c[0][start_y + x] = 0; + c[1][start_y + x] = 0; + c[2][start_y + x] = 0; + c[3][start_y + x] = 0; +#endif + } else { + int npx10; + int npy10; + int pos; + + npx10 = (px / sqrtperte); + npy10 = (py / sqrtperte); + +/* if (npx10 >= prevX) fprintf(stderr,"error npx:%d",npx10); + if (npy10 >= prevY) fprintf(stderr,"error npy:%d",npy10); +*/ + coefh = px % sqrtperte; + coefv = py % sqrtperte; +#ifdef USE_ASM + pos = (y * prevX + x) * 2; + coeffs[pos] = (npx10 + prevX * npy10) * 4; + + if (!(coefh || coefv)) + coeffs[pos + 1] = (sqrtperte * sqrtperte - 1); + else + coeffs[pos + 1] = ((sqrtperte - coefh) * (sqrtperte - coefv)); + + coeffs[pos + 1] |= (coefh * (sqrtperte - coefv)) << 8; + coeffs[pos + 1] |= ((sqrtperte - coefh) * coefv) << 16; + coeffs[pos + 1] |= (coefh * coefv) << 24; +#else + pos = start_y + x; + pos10[pos] = npx10 + prevX * npy10; + + if (!(coefh || coefv)) + c[0][pos] = sqrtperte * sqrtperte - 1; + else + c[0][pos] = (sqrtperte - coefh) * (sqrtperte - coefv); + + c[1][pos] = coefh * (sqrtperte - coefv); + c[2][pos] = (sqrtperte - coefh) * coefv; + c[3][pos] = coefh * coefv; +#endif + } + } + /* Advance start of line index */ + start_y += prevX; + } + } +#ifdef USE_ASM +#ifdef MMX + zoom_width = prevX; + mmx_zoom_size = prevX * prevY; + mmx_zoom (); +#endif + +#ifdef POWERPC + zoom_width = prevX; + if (useAltivec) { + ppcsize4 = ((unsigned int) (prevX * prevY)) / 4; + ppc_zoom_altivec (); + } else { + ppcsize4 = ((unsigned int) (prevX * prevY)); + ppc_zoom (); + } +#endif +#else + for (position = 0; position < prevX * prevY; position++) { + getPixelRGB_ (pix1, pos10[position], &col1, goomdata->resolx, + goomdata->resoly); + getPixelRGB_ (pix1, pos10[position] + 1, &col2, goomdata->resolx, + goomdata->resoly); + getPixelRGB_ (pix1, pos10[position] + prevX, &col3, goomdata->resolx, + goomdata->resoly); + getPixelRGB_ (pix1, pos10[position] + prevX + 1, &col4, goomdata->resolx, + goomdata->resoly); + + couleur.r = col1.r * c[0][position] + + col2.r * c[1][position] + + col3.r * c[2][position] + + col4.r * c[3][position]; + couleur.r >>= zf->pertedec; + + couleur.v = col1.v * c[0][position] + + col2.v * c[1][position] + + col3.v * c[2][position] + + col4.v * c[3][position]; + couleur.v >>= zf->pertedec; + + couleur.b = col1.b * c[0][position] + + col2.b * c[1][position] + + col3.b * c[2][position] + + col4.b * c[3][position]; + couleur.b >>= zf->pertedec; + + setPixelRGB_ (pix2, position, couleur, goomdata->resolx, goomdata->resoly); + } +#endif +} + + +void +pointFilter (GoomData * goomdata, Color c, + float t1, float t2, float t3, float t4, Uint cycle) +{ + Uint *pix1 = goomdata->p1; + ZoomFilterData *zf = goomdata->zfd; + Uint x = (Uint) (zf->middleX + (int) (t1 * cos ((float) cycle / t3))); + Uint y = (Uint) (zf->middleY + (int) (t2 * sin ((float) cycle / t4))); + + if ((x > 1) && (y > 1) && (x < goomdata->resolx - 2) + && (y < goomdata->resoly - 2)) { + setPixelRGB (pix1, x + 1, y, c, goomdata->resolx, goomdata->resoly); + setPixelRGB (pix1, x, y + 1, c, goomdata->resolx, goomdata->resoly); + setPixelRGB (pix1, x + 1, y + 1, WHITE, goomdata->resolx, goomdata->resoly); + setPixelRGB (pix1, x + 2, y + 1, c, goomdata->resolx, goomdata->resoly); + setPixelRGB (pix1, x + 1, y + 2, c, goomdata->resolx, goomdata->resoly); + } +} diff --git a/gst/goom2k1/filters.h b/gst/goom2k1/filters.h new file mode 100644 index 0000000..8c6f62e --- /dev/null +++ b/gst/goom2k1/filters.h @@ -0,0 +1,83 @@ +#ifndef FILTERS_H +#define FILTERS_H + +#include + +#include "graphic.h" +#include "goom_core.h" + +#define NORMAL_MODE 0 +#define WAVE_MODE 1 +#define CRYSTAL_BALL_MODE 2 +#define SCRUNCH_MODE 3 +#define AMULETTE_MODE 4 +#define WATER_MODE 5 + +struct ZoomFilterData +{ + int vitesse; + unsigned char pertedec; + unsigned char sqrtperte; + int middleX; + int middleY; + char reverse; + char mode; + /** @since June 2001 */ + int hPlaneEffect; + int vPlaneEffect; + char noisify; + + guint32 res_x; + guint32 res_y; + guint32 buffsize; + + guint32 *buffer; + guint32 *pos10; + guint32 *c[4]; + int *firedec; + + int wave; + int wavesp; +}; + +void pointFilter(GoomData *goomdata, Color c, + float t1, float t2, float t3, float t4, + guint32 cycle); + +/* filtre de zoom : + le contenu de pix1 est copie dans pix2, avec l'effet appliqué + midx et midy represente le centre du zoom + +void zoomFilter(Uint *pix1, Uint *pix2, Uint middleX, Uint middleY); +void zoomFilterRGB(Uint *pix1, +Uint *pix2, +Uint middleX, +Uint middleY); +*/ + +ZoomFilterData *zoomFilterNew (void); +void zoomFilterDestroy (ZoomFilterData *zf); +void zoomFilterFastRGB (GoomData *goomdata, ZoomFilterData *zf, + int zfd_update); + +/* filtre sin : + le contenu de pix1 est copie dans pix2, avec l'effet appliqué + cycle est la variable de temps. + mode vaut SIN_MUL ou SIN_ADD + rate est le pourcentage de l'effet appliqué + lenght : la longueur d'onde (1..10) [5] + speed : la vitesse (1..100) [10] +*/ +/* +void sinFilter(Uint *pix1,Uint *pix2, + Uint cycle, + Uint mode, + Uint rate, + char lenght, + Uint speed); +*/ + +#define SIN_MUL 1 +#define SIN_ADD 2 + +#endif diff --git a/gst/goom2k1/goom_core.c b/gst/goom2k1/goom_core.c new file mode 100644 index 0000000..ee893f4 --- /dev/null +++ b/gst/goom2k1/goom_core.c @@ -0,0 +1,411 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include +#include +#include "goom_core.h" +#include "goom_tools.h" +#include "filters.h" +#include "lines.h" + +/*#define VERBOSE */ + +#ifdef VERBOSE +#include +#endif + +#define STOP_SPEED 128 + +void +goom_init (GoomData * goomdata, guint32 resx, guint32 resy) +{ +#ifdef VERBOSE + printf ("GOOM: init (%d, %d);\n", resx, resy); +#endif + goomdata->resolx = 0; + goomdata->resoly = 0; + goomdata->buffsize = 0; + + goomdata->pixel = NULL; + goomdata->back = NULL; + goomdata->p1 = NULL; + goomdata->p2 = NULL; + + goom_set_resolution (goomdata, resx, resy); + RAND_INIT (goomdata, GPOINTER_TO_INT (goomdata->pixel)); + goomdata->cycle = 0; + + + goomdata->goomlimit = 2; /* sensibilité du goom */ + goomdata->zfd = zoomFilterNew (); + goomdata->lockvar = 0; /* pour empecher de nouveaux changements */ + goomdata->goomvar = 0; /* boucle des gooms */ + goomdata->totalgoom = 0; /* nombre de gooms par seconds */ + goomdata->agoom = 0; /* un goom a eu lieu.. */ + goomdata->loopvar = 0; /* mouvement des points */ + goomdata->speedvar = 0; /* vitesse des particules */ + goomdata->lineMode = 0; /* l'effet lineaire a dessiner */ +} + +void +goom_set_resolution (GoomData * goomdata, guint32 resx, guint32 resy) +{ + guint32 buffsize = resx * resy; + + if ((goomdata->resolx == resx) && (goomdata->resoly == resy)) + return; + + if (goomdata->buffsize < buffsize) { + if (goomdata->pixel) + free (goomdata->pixel); + if (goomdata->back) + free (goomdata->back); + goomdata->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + goomdata->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + goomdata->buffsize = buffsize; + + goomdata->p1 = (void *) (((guintptr) goomdata->pixel + 0x7f) & (~0x7f)); + goomdata->p2 = (void *) (((guintptr) goomdata->back + 0x7f) & (~0x7f)); + } + + goomdata->resolx = resx; + goomdata->resoly = resy; + + memset (goomdata->pixel, 0, buffsize * sizeof (guint32) + 128); + memset (goomdata->back, 0, buffsize * sizeof (guint32) + 128); +} + +guint32 * +goom_update (GoomData * goomdata, gint16 data[2][512]) +{ + guint32 *return_val; + guint32 pointWidth; + guint32 pointHeight; + int incvar; /* volume du son */ + int accelvar; /* acceleration des particules */ + int i; + float largfactor; /* elargissement de l'intervalle d'évolution des points */ + int zfd_update = 0; + int resolx = goomdata->resolx; + int resoly = goomdata->resoly; + ZoomFilterData *pzfd = goomdata->zfd; + guint32 *tmp; + + /* test if the config has changed, update it if so */ + + pointWidth = (resolx * 2) / 5; + pointHeight = (resoly * 2) / 5; + + /* ! etude du signal ... */ + incvar = 0; + for (i = 0; i < 512; i++) { + if (incvar < data[0][i]) + incvar = data[0][i]; + } + + accelvar = incvar / 5000; + if (goomdata->speedvar > 5) { + accelvar--; + if (goomdata->speedvar > 20) + accelvar--; + if (goomdata->speedvar > 40) + goomdata->speedvar = 40; + } + accelvar--; + goomdata->speedvar += accelvar; + + if (goomdata->speedvar < 0) + goomdata->speedvar = 0; + if (goomdata->speedvar > 40) + goomdata->speedvar = 40; + + + /* ! calcul du deplacement des petits points ... */ + + largfactor = + ((float) goomdata->speedvar / 40.0f + (float) incvar / 50000.0f) / 1.5f; + if (largfactor > 1.5f) + largfactor = 1.5f; + + for (i = 1; i * 15 <= goomdata->speedvar + 15; i++) { + goomdata->loopvar += goomdata->speedvar + 1; + + pointFilter (goomdata, + YELLOW, + ((pointWidth - 6.0f) * largfactor + 5.0f), + ((pointHeight - 6.0f) * largfactor + 5.0f), + i * 152.0f, 128.0f, goomdata->loopvar + i * 2032); + pointFilter (goomdata, ORANGE, + ((pointWidth / 2) * largfactor) / i + 10.0f * i, + ((pointHeight / 2) * largfactor) / i + 10.0f * i, + 96.0f, i * 80.0f, goomdata->loopvar / i); + pointFilter (goomdata, VIOLET, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + i + 122.0f, 134.0f, goomdata->loopvar / i); + pointFilter (goomdata, BLACK, + ((pointHeight / 3) * largfactor + 20.0f), + ((pointHeight / 3) * largfactor + 20.0f), + 58.0f, i * 66.0f, goomdata->loopvar / i); + pointFilter (goomdata, WHITE, + (pointHeight * largfactor + 10.0f * i) / i, + (pointHeight * largfactor + 10.0f * i) / i, + 66.0f, 74.0f, goomdata->loopvar + i * 500); + } + + /* diminuer de 1 le temps de lockage */ + /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ + /* changement d'etat du plugins juste apres un autre changement d'etat. oki ? */ + if (--goomdata->lockvar < 0) + goomdata->lockvar = 0; + + /* temps du goom */ + if (--goomdata->agoom < 0) + goomdata->agoom = 0; + + /* on verifie qu'il ne se pas un truc interressant avec le son. */ + if ((accelvar > goomdata->goomlimit) || (accelvar < -goomdata->goomlimit)) { + /* UN GOOM !!! YAHOO ! */ + goomdata->totalgoom++; + goomdata->agoom = 20; /* mais pdt 20 cycles, il n'y en aura plus. */ + goomdata->lineMode = (goomdata->lineMode + 1) % 20; /* Tous les 10 gooms on change de mode lineaire */ + + /* changement eventuel de mode */ + switch (iRAND (goomdata, 10)) { + case 0: + case 1: + case 2: + pzfd->mode = WAVE_MODE; + pzfd->vitesse = STOP_SPEED - 1; + pzfd->reverse = 0; + break; + case 3: + case 4: + pzfd->mode = CRYSTAL_BALL_MODE; + break; + case 5: + pzfd->mode = AMULETTE_MODE; + break; + case 6: + pzfd->mode = WATER_MODE; + break; + case 7: + pzfd->mode = SCRUNCH_MODE; + break; + default: + pzfd->mode = NORMAL_MODE; + } + } + + /* tout ceci ne sera fait qu'en cas de non-blocage */ + if (goomdata->lockvar == 0) { + /* reperage de goom (acceleration forte de l'acceleration du volume) */ + /* -> coup de boost de la vitesse si besoin.. */ + if ((accelvar > goomdata->goomlimit) || (accelvar < -goomdata->goomlimit)) { + goomdata->goomvar++; + /*if (goomvar % 1 == 0) */ + { + guint32 vtmp; + guint32 newvit; + + newvit = STOP_SPEED - goomdata->speedvar / 2; + /* retablir le zoom avant.. */ + if ((pzfd->reverse) && (!(goomdata->cycle % 12)) && (rand () % 3 == 0)) { + pzfd->reverse = 0; + pzfd->vitesse = STOP_SPEED - 2; + goomdata->lockvar = 50; + } + if (iRAND (goomdata, 10) == 0) { + pzfd->reverse = 1; + goomdata->lockvar = 100; + } + + /* changement de milieu.. */ + switch (iRAND (goomdata, 20)) { + case 0: + pzfd->middleY = resoly - 1; + pzfd->middleX = resolx / 2; + break; + case 1: + pzfd->middleX = resolx - 1; + break; + case 2: + pzfd->middleX = 1; + break; + default: + pzfd->middleY = resoly / 2; + pzfd->middleX = resolx / 2; + } + + if (pzfd->mode == WATER_MODE) { + pzfd->middleX = resolx / 2; + pzfd->middleY = resoly / 2; + } + + switch (vtmp = (iRAND (goomdata, 27))) { + case 0: + pzfd->vPlaneEffect = iRAND (goomdata, 3); + pzfd->vPlaneEffect -= iRAND (goomdata, 3); + pzfd->hPlaneEffect = iRAND (goomdata, 3); + pzfd->hPlaneEffect -= iRAND (goomdata, 3); + break; + case 3: + pzfd->vPlaneEffect = 0; + pzfd->hPlaneEffect = iRAND (goomdata, 8); + pzfd->hPlaneEffect -= iRAND (goomdata, 8); + break; + case 4: + case 5: + case 6: + case 7: + pzfd->vPlaneEffect = iRAND (goomdata, 5); + pzfd->vPlaneEffect -= iRAND (goomdata, 5); + pzfd->hPlaneEffect = -pzfd->vPlaneEffect; + break; + case 8: + pzfd->hPlaneEffect = 5 + iRAND (goomdata, 8); + pzfd->vPlaneEffect = -pzfd->hPlaneEffect; + break; + case 9: + pzfd->vPlaneEffect = 5 + iRAND (goomdata, 8); + pzfd->hPlaneEffect = -pzfd->hPlaneEffect; + break; + case 13: + pzfd->hPlaneEffect = 0; + pzfd->vPlaneEffect = iRAND (goomdata, 10); + pzfd->vPlaneEffect -= iRAND (goomdata, 10); + break; + default: + if (vtmp < 10) { + pzfd->vPlaneEffect = 0; + pzfd->hPlaneEffect = 0; + } + } + + if (iRAND (goomdata, 3) != 0) + pzfd->noisify = 0; + else { + pzfd->noisify = iRAND (goomdata, 3) + 2; + goomdata->lockvar *= 3; + } + + if (pzfd->mode == AMULETTE_MODE) { + pzfd->vPlaneEffect = 0; + pzfd->hPlaneEffect = 0; + pzfd->noisify = 0; + } + + if ((pzfd->middleX == 1) || (pzfd->middleX == resolx - 1)) { + pzfd->vPlaneEffect = 0; + pzfd->hPlaneEffect = iRAND (goomdata, 2) ? 0 : pzfd->hPlaneEffect; + } + + if (newvit < pzfd->vitesse) { /* on accelere */ + zfd_update = 1; + if (((newvit < STOP_SPEED - 7) && + (pzfd->vitesse < STOP_SPEED - 6) && + (goomdata->cycle % 3 == 0)) || (iRAND (goomdata, 40) == 0)) { + pzfd->vitesse = STOP_SPEED - 1; + pzfd->reverse = !pzfd->reverse; + } else { + pzfd->vitesse = (newvit + pzfd->vitesse * 4) / 5; + } + goomdata->lockvar += 50; + } + } + } + /* mode mega-lent */ + if (iRAND (goomdata, 1000) == 0) { + /* + printf ("coup du sort...\n") ; + */ + zfd_update = 1; + pzfd->vitesse = STOP_SPEED - 1; + pzfd->pertedec = 8; + pzfd->sqrtperte = 16; + goomdata->goomvar = 1; + goomdata->lockvar += 70; + } + } + + /* gros frein si la musique est calme */ + if ((goomdata->speedvar < 1) && (pzfd->vitesse < STOP_SPEED - 4) + && (goomdata->cycle % 16 == 0)) { + /* + printf ("++slow part... %i\n", zfd.vitesse) ; + */ + zfd_update = 1; + pzfd->vitesse += 3; + pzfd->pertedec = 8; + pzfd->sqrtperte = 16; + goomdata->goomvar = 0; + /* + printf ("--slow part... %i\n", zfd.vitesse) ; + */ + } + + /* baisser regulierement la vitesse... */ + if ((goomdata->cycle % 73 == 0) && (pzfd->vitesse < STOP_SPEED - 5)) { + /* + printf ("slow down...\n") ; + */ + zfd_update = 1; + pzfd->vitesse++; + } + + /* arreter de decrémenter au bout d'un certain temps */ + if ((goomdata->cycle % 101 == 0) && (pzfd->pertedec == 7)) { + zfd_update = 1; + pzfd->pertedec = 8; + pzfd->sqrtperte = 16; + } + + /* Zoom here ! */ + zoomFilterFastRGB (goomdata, pzfd, zfd_update); + + /* si on est dans un goom : afficher les lignes... */ + if (goomdata->agoom > 15) + goom_lines (goomdata, data, ((pzfd->middleX == resolx / 2) + && (pzfd->middleY == resoly / 2) + && (pzfd->mode != WATER_MODE)) + ? (goomdata->lineMode / 10) : 0, goomdata->p2, goomdata->agoom - 15); + + return_val = goomdata->p2; + tmp = goomdata->p1; + goomdata->p1 = goomdata->p2; + goomdata->p2 = tmp; + + /* affichage et swappage des buffers.. */ + goomdata->cycle++; + + /* tous les 100 cycles : vérifier si le taux de goom est correct */ + /* et le modifier sinon.. */ + if (!(goomdata->cycle % 100)) { + if (goomdata->totalgoom > 15) { + /* printf ("less gooms\n") ; */ + goomdata->goomlimit++; + } else { + if ((goomdata->totalgoom == 0) && (goomdata->goomlimit > 1)) + goomdata->goomlimit--; + } + goomdata->totalgoom = 0; + } + return return_val; +} + +void +goom_close (GoomData * goomdata) +{ + if (goomdata->pixel != NULL) + free (goomdata->pixel); + if (goomdata->back != NULL) + free (goomdata->back); + if (goomdata->zfd != NULL) { + zoomFilterDestroy (goomdata->zfd); + goomdata->zfd = NULL; + } + goomdata->pixel = goomdata->back = NULL; + RAND_CLOSE (goomdata); +} diff --git a/gst/goom2k1/goom_core.h b/gst/goom2k1/goom_core.h new file mode 100644 index 0000000..1fbc0ee --- /dev/null +++ b/gst/goom2k1/goom_core.h @@ -0,0 +1,43 @@ +#ifndef _GOOMCORE_H +#define _GOOMCORE_H + +#include + +typedef struct ZoomFilterData ZoomFilterData; + +typedef struct +{ +/**-----------------------------------------------------** + ** SHARED DATA ** + **-----------------------------------------------------**/ + guint32 *pixel; + guint32 *back; + guint32 *p1, *p2; + guint32 cycle; + + guint32 resolx, resoly, buffsize; + + int lockvar; /* pour empecher de nouveaux changements */ + int goomvar; /* boucle des gooms */ + int totalgoom; /* nombre de gooms par seconds */ + int agoom; /* un goom a eu lieu.. */ + int loopvar; /* mouvement des points */ + int speedvar; /* vitesse des particules */ + int lineMode; /* l'effet lineaire a dessiner */ + char goomlimit; /* sensibilité du goom */ + + ZoomFilterData *zfd; + + /* Random table */ + gint *rand_tab; + guint rand_pos; +} GoomData; + +void goom_init (GoomData *goomdata, guint32 resx, guint32 resy); +void goom_set_resolution (GoomData *goomdata, guint32 resx, guint32 resy); + +guint32 *goom_update (GoomData *goomdata, gint16 data [2][512]); + +void goom_close (GoomData *goomdata); + +#endif diff --git a/gst/goom2k1/goom_tools.h b/gst/goom2k1/goom_tools.h new file mode 100644 index 0000000..6178dba --- /dev/null +++ b/gst/goom2k1/goom_tools.h @@ -0,0 +1,24 @@ +#ifndef _GOOMTOOLS_H +#define _GOOMTOOLS_H + +#define NB_RAND 0x10000 + +#define RAND_INIT(gd,i) \ + srand (i); \ + if (gd->rand_tab == NULL) \ + gd->rand_tab = g_malloc (NB_RAND * sizeof(gint)) ;\ + gd->rand_pos = 0; \ + while (gd->rand_pos < NB_RAND) \ + gd->rand_tab [gd->rand_pos++] = rand (); + +#define RAND(gd) \ + (gd->rand_tab[gd->rand_pos = ((gd->rand_pos + 1) % NB_RAND)]) + +#define RAND_CLOSE(gd) \ + g_free (gd->rand_tab); \ + gd->rand_tab = NULL; + +/*#define iRAND(i) ((guint32)((float)i * RAND()/RAND_MAX)) */ +#define iRAND(gd,i) (RAND(gd) % i) + +#endif diff --git a/gst/goom2k1/graphic.c b/gst/goom2k1/graphic.c new file mode 100644 index 0000000..c20f987 --- /dev/null +++ b/gst/goom2k1/graphic.c @@ -0,0 +1,14 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "graphic.h" + +const Color BLACK = { 0, 0, 0 }; +const Color WHITE = { 0xff, 0xff, 0xff }; +const Color RED = { 0xff, 0, 0 }; +const Color GREEN = { 0, 0xff, 0 }; +const Color BLUE = { 0, 0, 0xff }; +const Color YELLOW = { 0xff, 0xff, 0x33 }; +const Color ORANGE = { 0xff, 0xcc, 0x00 }; +const Color VIOLET = { 0x55, 0x00, 0xff }; diff --git a/gst/goom2k1/graphic.h b/gst/goom2k1/graphic.h new file mode 100644 index 0000000..4154d7f --- /dev/null +++ b/gst/goom2k1/graphic.h @@ -0,0 +1,23 @@ +#ifndef GRAPHIC_H +#define GRAPHIC_H + +#include /* defines inline for better portability */ + +typedef unsigned int Uint; + +typedef struct +{ + unsigned short r,v,b; +} +Color; + +extern const Color BLACK; +extern const Color WHITE; +extern const Color RED; +extern const Color BLUE; +extern const Color GREEN; +extern const Color YELLOW; +extern const Color ORANGE; +extern const Color VIOLET; + +#endif /*GRAPHIC_H*/ diff --git a/gst/goom2k1/gstgoom.c b/gst/goom2k1/gstgoom.c new file mode 100644 index 0000000..7c27394 --- /dev/null +++ b/gst/goom2k1/gstgoom.c @@ -0,0 +1,661 @@ +/* gstgoom.c: implementation of goom drawing element + * Copyright (C) <2001> Richard Boulton + * (C) <2006> Wim Taymans + * + * 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-goom2k1 + * @see_also: goom, synaesthesia + * + * Goom2k1 is an audio visualisation element. It creates warping structures + * based on the incomming audio signal. Goom2k1 is the older version of the + * visualisation. Also available is goom2k4, with a different look. + * + * + * Example launch line + * |[ + * gst-launch -v audiotestsrc ! goom2k1 ! ffmpegcolorspace ! xvimagesink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "gstgoom.h" +#include +#include "goom_core.h" + +GST_DEBUG_CATEGORY_STATIC (goom_debug); +#define GST_CAT_DEFAULT goom_debug + +#define DEFAULT_WIDTH 320 +#define DEFAULT_HEIGHT 240 +#define DEFAULT_FPS_N 25 +#define DEFAULT_FPS_D 1 + +/* signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 + /* FILL ME */ +}; + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", /* the name of the pads */ + GST_PAD_SINK, /* type of the pad */ + GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */ + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 8000, 96000 ], " "channels = (int) { 1, 2 }") + ); + + +static void gst_goom_class_init (GstGoomClass * klass); +static void gst_goom_base_init (GstGoomClass * klass); +static void gst_goom_init (GstGoom * goom); +static void gst_goom_finalize (GObject * object); + +static GstStateChangeReturn gst_goom_change_state (GstElement * element, + GstStateChange transition); + +static GstFlowReturn gst_goom_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_goom_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_goom_sink_event (GstPad * pad, GstEvent * event); + +static gboolean gst_goom_src_query (GstPad * pad, GstQuery * query); + +static gboolean gst_goom_sink_setcaps (GstPad * pad, GstCaps * caps); +static gboolean gst_goom_src_setcaps (GstPad * pad, GstCaps * caps); + +static GstElementClass *parent_class = NULL; + +GType +gst_goom_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GstGoomClass), + (GBaseInitFunc) gst_goom_base_init, + NULL, + (GClassInitFunc) gst_goom_class_init, + NULL, + NULL, + sizeof (GstGoom), + 0, + (GInstanceInitFunc) gst_goom_init, + }; + + type = g_type_register_static (GST_TYPE_ELEMENT, "GstGoom2k1", &info, 0); + } + return type; +} + +static void +gst_goom_base_init (GstGoomClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details_simple (element_class, + "GOOM: what a GOOM! 2k1 edition", "Visualization", + "Takes frames of data and outputs video frames using the GOOM 2k1 filter", + "Wim Taymans "); + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); +} + +static void +gst_goom_class_init (GstGoomClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_goom_finalize; + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_goom_change_state); + + GST_DEBUG_CATEGORY_INIT (goom_debug, "goom", 0, "goom visualisation element"); +} + +static void +gst_goom_init (GstGoom * goom) +{ + /* create the sink and src pads */ + goom->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); + gst_pad_set_chain_function (goom->sinkpad, + GST_DEBUG_FUNCPTR (gst_goom_chain)); + gst_pad_set_event_function (goom->sinkpad, + GST_DEBUG_FUNCPTR (gst_goom_sink_event)); + gst_pad_set_setcaps_function (goom->sinkpad, + GST_DEBUG_FUNCPTR (gst_goom_sink_setcaps)); + gst_element_add_pad (GST_ELEMENT (goom), goom->sinkpad); + + goom->srcpad = gst_pad_new_from_static_template (&src_template, "src"); + gst_pad_set_setcaps_function (goom->srcpad, + GST_DEBUG_FUNCPTR (gst_goom_src_setcaps)); + gst_pad_set_event_function (goom->srcpad, + GST_DEBUG_FUNCPTR (gst_goom_src_event)); + gst_pad_set_query_function (goom->srcpad, + GST_DEBUG_FUNCPTR (gst_goom_src_query)); + gst_element_add_pad (GST_ELEMENT (goom), goom->srcpad); + + goom->adapter = gst_adapter_new (); + + goom->width = DEFAULT_WIDTH; + goom->height = DEFAULT_HEIGHT; + goom->fps_n = DEFAULT_FPS_N; /* desired frame rate */ + goom->fps_d = DEFAULT_FPS_D; /* desired frame rate */ + goom->channels = 0; + goom->rate = 0; + goom->duration = 0; + + goom_init (&(goom->goomdata), goom->width, goom->height); +} + +static void +gst_goom_finalize (GObject * object) +{ + GstGoom *goom = GST_GOOM (object); + + goom_close (&(goom->goomdata)); + + g_object_unref (goom->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_goom_reset (GstGoom * goom) +{ + gst_adapter_clear (goom->adapter); + gst_segment_init (&goom->segment, GST_FORMAT_UNDEFINED); + + GST_OBJECT_LOCK (goom); + goom->proportion = 1.0; + goom->earliest_time = -1; + GST_OBJECT_UNLOCK (goom); +} + +static gboolean +gst_goom_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstGoom *goom; + GstStructure *structure; + gboolean res; + + goom = GST_GOOM (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + + res = gst_structure_get_int (structure, "channels", &goom->channels); + res &= gst_structure_get_int (structure, "rate", &goom->rate); + + goom->bps = goom->channels * sizeof (gint16); + + return res; +} + +static gboolean +gst_goom_src_setcaps (GstPad * pad, GstCaps * caps) +{ + GstGoom *goom; + GstStructure *structure; + + goom = GST_GOOM (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "width", &goom->width) || + !gst_structure_get_int (structure, "height", &goom->height) || + !gst_structure_get_fraction (structure, "framerate", &goom->fps_n, + &goom->fps_d)) + return FALSE; + + goom_set_resolution (&(goom->goomdata), goom->width, goom->height); + + /* size of the output buffer in bytes, depth is always 4 bytes */ + goom->outsize = goom->width * goom->height * 4; + goom->duration = + gst_util_uint64_scale_int (GST_SECOND, goom->fps_d, goom->fps_n); + goom->spf = gst_util_uint64_scale_int (goom->rate, goom->fps_d, goom->fps_n); + goom->bpf = goom->spf * goom->bps; + + GST_DEBUG_OBJECT (goom, "dimension %dx%d, framerate %d/%d, spf %d", + goom->width, goom->height, goom->fps_n, goom->fps_d, goom->spf); + + return TRUE; +} + +static gboolean +gst_goom_src_negotiate (GstGoom * goom) +{ + GstCaps *othercaps, *target; + GstStructure *structure; + const GstCaps *templ; + + templ = gst_pad_get_pad_template_caps (goom->srcpad); + + GST_DEBUG_OBJECT (goom, "performing negotiation"); + + /* see what the peer can do */ + othercaps = gst_pad_peer_get_caps (goom->srcpad); + if (othercaps) { + target = gst_caps_intersect (othercaps, templ); + gst_caps_unref (othercaps); + + if (gst_caps_is_empty (target)) + goto no_format; + + gst_caps_truncate (target); + } else { + target = gst_caps_ref ((GstCaps *) templ); + } + + structure = gst_caps_get_structure (target, 0); + gst_structure_fixate_field_nearest_int (structure, "width", DEFAULT_WIDTH); + gst_structure_fixate_field_nearest_int (structure, "height", DEFAULT_HEIGHT); + gst_structure_fixate_field_nearest_fraction (structure, "framerate", + DEFAULT_FPS_N, DEFAULT_FPS_D); + + gst_pad_set_caps (goom->srcpad, target); + gst_caps_unref (target); + + return TRUE; + +no_format: + { + gst_caps_unref (target); + return FALSE; + } +} + +static gboolean +gst_goom_src_event (GstPad * pad, GstEvent * event) +{ + gboolean res; + GstGoom *goom; + + goom = GST_GOOM (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS: + { + gdouble proportion; + GstClockTimeDiff diff; + GstClockTime timestamp; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + /* save stuff for the _chain() function */ + GST_OBJECT_LOCK (goom); + goom->proportion = proportion; + if (diff >= 0) + /* we're late, this is a good estimate for next displayable + * frame (see part-qos.txt) */ + goom->earliest_time = timestamp + 2 * diff + goom->duration; + else + goom->earliest_time = timestamp + diff; + GST_OBJECT_UNLOCK (goom); + + res = gst_pad_push_event (goom->sinkpad, event); + break; + } + default: + res = gst_pad_push_event (goom->sinkpad, event); + break; + } + gst_object_unref (goom); + + return res; +} + +static gboolean +gst_goom_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean res; + GstGoom *goom; + + goom = GST_GOOM (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_START: + res = gst_pad_push_event (goom->srcpad, event); + break; + case GST_EVENT_FLUSH_STOP: + gst_goom_reset (goom); + res = gst_pad_push_event (goom->srcpad, event); + break; + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time; + gboolean update; + + /* the newsegment values are used to clip the input samples + * and to convert the incomming timestamps to running time so + * we can do QoS */ + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + + /* now configure the values */ + gst_segment_set_newsegment_full (&goom->segment, update, + rate, arate, format, start, stop, time); + + res = gst_pad_push_event (goom->srcpad, event); + break; + } + default: + res = gst_pad_push_event (goom->srcpad, event); + break; + } + gst_object_unref (goom); + + return res; +} + +static gboolean +gst_goom_src_query (GstPad * pad, GstQuery * query) +{ + gboolean res; + GstGoom *goom; + + goom = GST_GOOM (gst_pad_get_parent (pad)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + /* We need to send the query upstream and add the returned latency to our + * own */ + GstClockTime min_latency, max_latency; + gboolean us_live; + GstClockTime our_latency; + guint max_samples; + + if ((res = gst_pad_peer_query (goom->sinkpad, query))) { + gst_query_parse_latency (query, &us_live, &min_latency, &max_latency); + + GST_DEBUG_OBJECT (goom, "Peer latency: min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + /* the max samples we must buffer buffer */ + max_samples = MAX (GOOM_SAMPLES, goom->spf); + our_latency = + gst_util_uint64_scale_int (max_samples, GST_SECOND, goom->rate); + + GST_DEBUG_OBJECT (goom, "Our latency: %" GST_TIME_FORMAT, + GST_TIME_ARGS (our_latency)); + + /* we add some latency but only if we need to buffer more than what + * upstream gives us */ + min_latency += our_latency; + if (max_latency != -1) + max_latency += our_latency; + + GST_DEBUG_OBJECT (goom, "Calculated total latency : min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + gst_query_set_latency (query, TRUE, min_latency, max_latency); + } + break; + } + default: + res = gst_pad_peer_query (goom->sinkpad, query); + break; + } + + gst_object_unref (goom); + + return res; +} + +static GstFlowReturn +get_buffer (GstGoom * goom, GstBuffer ** outbuf) +{ + GstFlowReturn ret; + + if (GST_PAD_CAPS (goom->srcpad) == NULL) { + if (!gst_goom_src_negotiate (goom)) + return GST_FLOW_NOT_NEGOTIATED; + } + + GST_DEBUG_OBJECT (goom, "allocating output buffer with caps %" + GST_PTR_FORMAT, GST_PAD_CAPS (goom->srcpad)); + + ret = + gst_pad_alloc_buffer_and_set_caps (goom->srcpad, + GST_BUFFER_OFFSET_NONE, goom->outsize, + GST_PAD_CAPS (goom->srcpad), outbuf); + if (ret != GST_FLOW_OK) + return ret; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_goom_chain (GstPad * pad, GstBuffer * buffer) +{ + GstGoom *goom; + GstFlowReturn ret; + GstBuffer *outbuf = NULL; + + goom = GST_GOOM (gst_pad_get_parent (pad)); + + /* If we don't have an output format yet, preallocate a buffer to try and + * set one */ + if (GST_PAD_CAPS (goom->srcpad) == NULL) { + ret = get_buffer (goom, &outbuf); + if (ret != GST_FLOW_OK) { + gst_buffer_unref (buffer); + goto beach; + } + } + + /* don't try to combine samples from discont buffer */ + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { + gst_adapter_clear (goom->adapter); + } + + GST_DEBUG_OBJECT (goom, + "Input buffer has %d samples, time=%" G_GUINT64_FORMAT, + GST_BUFFER_SIZE (buffer) / goom->bps, GST_BUFFER_TIMESTAMP (buffer)); + + /* Collect samples until we have enough for an output frame */ + gst_adapter_push (goom->adapter, buffer); + + ret = GST_FLOW_OK; + + while (TRUE) { + const guint16 *data; + gboolean need_skip; + guchar *out_frame; + gint i; + guint avail, to_flush; + guint64 dist, timestamp; + + avail = gst_adapter_available (goom->adapter); + GST_DEBUG_OBJECT (goom, "avail now %u", avail); + + /* we need GOOM_SAMPLES to get a meaningful result from goom. */ + if (avail < (GOOM_SAMPLES * goom->bps)) + break; + + /* we also need enough samples to produce one frame at least */ + if (avail < goom->bpf) + break; + + GST_DEBUG_OBJECT (goom, "processing buffer"); + + /* get timestamp of the current adapter byte */ + timestamp = gst_adapter_prev_timestamp (goom->adapter, &dist); + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + /* convert bytes to time */ + dist /= goom->bps; + timestamp += gst_util_uint64_scale_int (dist, GST_SECOND, goom->rate); + } + + if (timestamp != -1) { + gint64 qostime; + + qostime = gst_segment_to_running_time (&goom->segment, GST_FORMAT_TIME, + timestamp); + qostime += goom->duration; + + GST_OBJECT_LOCK (goom); + /* check for QoS, don't compute buffers that are known to be late */ + need_skip = goom->earliest_time != -1 && qostime <= goom->earliest_time; + GST_OBJECT_UNLOCK (goom); + + if (need_skip) { + GST_WARNING_OBJECT (goom, + "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT, + GST_TIME_ARGS (qostime), GST_TIME_ARGS (goom->earliest_time)); + goto skip; + } + } + + /* get next GOOM_SAMPLES, we have at least this amount of samples */ + data = + (const guint16 *) gst_adapter_peek (goom->adapter, + GOOM_SAMPLES * goom->bps); + + if (goom->channels == 2) { + for (i = 0; i < GOOM_SAMPLES; i++) { + goom->datain[0][i] = *data++; + goom->datain[1][i] = *data++; + } + } else { + for (i = 0; i < GOOM_SAMPLES; i++) { + goom->datain[0][i] = *data; + goom->datain[1][i] = *data++; + } + } + + /* alloc a buffer if we don't have one yet, this happens + * when we pushed a buffer in this while loop before */ + if (outbuf == NULL) { + ret = get_buffer (goom, &outbuf); + if (ret != GST_FLOW_OK) { + goto beach; + } + } + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = goom->duration; + GST_BUFFER_SIZE (outbuf) = goom->outsize; + + out_frame = (guchar *) goom_update (&(goom->goomdata), goom->datain); + memcpy (GST_BUFFER_DATA (outbuf), out_frame, goom->outsize); + + GST_DEBUG ("Pushing frame with time=%" GST_TIME_FORMAT ", duration=%" + GST_TIME_FORMAT, GST_TIME_ARGS (timestamp), + GST_TIME_ARGS (goom->duration)); + + ret = gst_pad_push (goom->srcpad, outbuf); + outbuf = NULL; + + skip: + /* Now flush the samples we needed for this frame, which might be more than + * the samples we used (GOOM_SAMPLES). */ + to_flush = goom->bpf; + + GST_DEBUG_OBJECT (goom, "finished frame, flushing %u bytes from input", + to_flush); + gst_adapter_flush (goom->adapter, to_flush); + + if (ret != GST_FLOW_OK) + break; + } + + if (outbuf != NULL) + gst_buffer_unref (outbuf); + +beach: + gst_object_unref (goom); + + return ret; +} + +static GstStateChangeReturn +gst_goom_change_state (GstElement * element, GstStateChange transition) +{ + GstGoom *goom = GST_GOOM (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_goom_reset (goom); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "goom2k1", GST_RANK_NONE, GST_TYPE_GOOM); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "goom2k1", + "GOOM 2k1 visualization filter", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/goom2k1/gstgoom.h b/gst/goom2k1/gstgoom.h new file mode 100644 index 0000000..3aeeafa --- /dev/null +++ b/gst/goom2k1/gstgoom.h @@ -0,0 +1,88 @@ +/* gstgoom.c: implementation of goom drawing element + * Copyright (C) <2001> Richard Boulton + * + * 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_GOOM_H__ +#define __GST_GOOM_H__ + +G_BEGIN_DECLS + +#include +#include +#include "goom_core.h" + +#define GOOM_SAMPLES 512 + +#define GST_TYPE_GOOM (gst_goom_get_type()) +#define GST_GOOM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GOOM,GstGoom)) +#define GST_GOOM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GOOM,GstGoomClass)) +#define GST_IS_GOOM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GOOM)) +#define GST_IS_GOOM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GOOM)) + +typedef struct _GstGoom GstGoom; +typedef struct _GstGoomClass GstGoomClass; + +struct _GstGoom +{ + GstElement element; + + /* pads */ + GstPad *sinkpad, *srcpad; + GstAdapter *adapter; + + /* input tracking */ + gint rate; + gint channels; + guint bps; + + /* video state */ + gint fps_n; + gint fps_d; + gint width; + gint height; + GstClockTime duration; + guint outsize; + + /* samples per frame */ + guint spf; + /* bytes per frame */ + guint bpf; + + /* goom stuff */ + gint16 datain[2][GOOM_SAMPLES]; + GoomData goomdata; + + /* segment state */ + GstSegment segment; + + /* QoS stuff *//* with LOCK */ + gdouble proportion; + GstClockTime earliest_time; +}; + +struct _GstGoomClass +{ + GstElementClass parent_class; +}; + +GType gst_goom_get_type (void); + +G_END_DECLS + +#endif /* __GST_GOOM_H__ */ + diff --git a/gst/goom2k1/lines.c b/gst/goom2k1/lines.c new file mode 100644 index 0000000..3214e1d --- /dev/null +++ b/gst/goom2k1/lines.c @@ -0,0 +1,107 @@ +/* + * lines.c + * iTunesXPlugIn + * + * Created by guillaum on Tue Aug 14 2001. + * Copyright (c) 2001 __CompanyName__. All rights reserved. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "lines.h" +#include + +static inline unsigned char +lighten (unsigned char value, unsigned char power) +{ + unsigned char i; + + for (i = 0; i < power; i++) + value += (255 - value) / 5; + return value; +} + +void +goom_lines (GoomData * goomdata, gint16 data[2][512], unsigned int ID, + unsigned int *p, guint32 power) +{ + guint32 color1; + guint32 color2; + guint32 resolx = goomdata->resolx; + guint32 resoly = goomdata->resoly; + unsigned char *color = 1 + (unsigned char *) &color1; + + switch (ID) { + case 0: /* Horizontal stereo lines */ + { + color1 = 0x0000AA00; + color2 = 0x00AA0000; + break; + } + + case 1: /* Stereo circles */ + { + color1 = 0x00AA33DD; + color2 = 0x00AA33DD; + break; + } + } + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color = 1 + (unsigned char *) &color2; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + + switch (ID) { + case 0: /* Horizontal stereo lines */ + { + unsigned int i; + + for (i = 0; i < 512; i++) { + guint32 plot; + + plot = i * resolx / 512 + (resoly / 4 + data[0][i] / 1600) * resolx; + p[plot] = color1; + p[plot + 1] = color1; + plot = i * resolx / 512 + (resoly * 3 / 4 - data[1][i] / 1600) * resolx; + p[plot] = color2; + p[plot + 1] = color2; + } + break; + } + + case 1: /* Stereo circles */ + { + float z; + unsigned int monX = resolx / 2; + float monY = resoly / 4; + float monY2 = resoly / 2; + + for (z = 0; z < 6.2832f; z += 1.0f / monY) { + /* float offset1 = 128+data[1][(unsigned int)(z*81.33f)])/200000; */ + p[monX + (unsigned int) ((monY + ((float) resoly) * (128 + + data[1][(unsigned int) (z * 81.33f)]) / 200000) * + cos (z) + resolx * (unsigned int) (monY2 + (monY + + ((float) resoly) * (128 + + data[1][(unsigned int) (z * 81.33f)]) / 400000) * + sin (z)))] = color1; + p[monX + (unsigned int) ((monY - ((float) resoly) * (128 + + data[0][(unsigned int) (z * 81.33f)]) / 200000) * + cos (z) + resolx * (unsigned int) (monY2 + (monY - + ((float) resoly) * (128 + + data[0][(unsigned int) (z * 81.33f)]) / 400000) * + sin (z)))] = color2; + } + break; + } + } +} diff --git a/gst/goom2k1/lines.h b/gst/goom2k1/lines.h new file mode 100644 index 0000000..548f339 --- /dev/null +++ b/gst/goom2k1/lines.h @@ -0,0 +1,16 @@ +/* + * lines.h + * iGoom + * + * Created by guillaum on Tue Aug 14 2001. + * Copyright (c) 2001 ios. All rights reserved. + * + */ +#include + +#include "graphic.h" +#include "goom_core.h" + +void goom_lines(GoomData *goomdata, gint16 data [2][512], unsigned int ID,unsigned int* p, guint32 power); + + diff --git a/gst/icydemux/Makefile.am b/gst/icydemux/Makefile.am new file mode 100644 index 0000000..b7f2c66 --- /dev/null +++ b/gst/icydemux/Makefile.am @@ -0,0 +1,23 @@ +plugin_LTLIBRARIES = libgsticydemux.la + +libgsticydemux_la_SOURCES = gsticydemux.c +libgsticydemux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgsticydemux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) +libgsticydemux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgsticydemux_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gsticydemux.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgsticydemux -:SHARED libgsticydemux \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgsticydemux_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsticydemux_la_CFLAGS) \ + -:LDFLAGS $(libgsticydemux_la_LDFLAGS) \ + $(libgsticydemux_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/icydemux/Makefile.in b/gst/icydemux/Makefile.in new file mode 100644 index 0000000..c24dcea --- /dev/null +++ b/gst/icydemux/Makefile.in @@ -0,0 +1,820 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/icydemux +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgsticydemux_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgsticydemux_la_OBJECTS = libgsticydemux_la-gsticydemux.lo +libgsticydemux_la_OBJECTS = $(am_libgsticydemux_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgsticydemux_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgsticydemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgsticydemux_la_CFLAGS) $(CFLAGS) \ + $(libgsticydemux_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgsticydemux_la_SOURCES) +DIST_SOURCES = $(libgsticydemux_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgsticydemux.la +libgsticydemux_la_SOURCES = gsticydemux.c +libgsticydemux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgsticydemux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) +libgsticydemux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgsticydemux_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gsticydemux.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/icydemux/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/icydemux/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgsticydemux.la: $(libgsticydemux_la_OBJECTS) $(libgsticydemux_la_DEPENDENCIES) $(EXTRA_libgsticydemux_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgsticydemux_la_LINK) -rpath $(plugindir) $(libgsticydemux_la_OBJECTS) $(libgsticydemux_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsticydemux_la-gsticydemux.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgsticydemux_la-gsticydemux.lo: gsticydemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsticydemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsticydemux_la_CFLAGS) $(CFLAGS) -MT libgsticydemux_la-gsticydemux.lo -MD -MP -MF $(DEPDIR)/libgsticydemux_la-gsticydemux.Tpo -c -o libgsticydemux_la-gsticydemux.lo `test -f 'gsticydemux.c' || echo '$(srcdir)/'`gsticydemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsticydemux_la-gsticydemux.Tpo $(DEPDIR)/libgsticydemux_la-gsticydemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsticydemux.c' object='libgsticydemux_la-gsticydemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsticydemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsticydemux_la_CFLAGS) $(CFLAGS) -c -o libgsticydemux_la-gsticydemux.lo `test -f 'gsticydemux.c' || echo '$(srcdir)/'`gsticydemux.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgsticydemux -:SHARED libgsticydemux \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgsticydemux_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsticydemux_la_CFLAGS) \ + -:LDFLAGS $(libgsticydemux_la_LDFLAGS) \ + $(libgsticydemux_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/icydemux/gsticydemux.c b/gst/icydemux/gsticydemux.c new file mode 100644 index 0000000..4a533b9 --- /dev/null +++ b/gst/icydemux/gsticydemux.c @@ -0,0 +1,651 @@ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ +/* Copyright 2005 Jan Schmidt + * 2006 Michael Smith + * Copyright (C) 2003-2004 Benjamin Otte + * + * 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-icydemux + * + * icydemux accepts data streams with ICY metadata at known intervals, as + * transmitted from an upstream element (usually read as response headers from + * an HTTP stream). The mime type of the data between the tag blocks is + * detected using typefind functions, and the appropriate output mime type set + * on outgoing buffers. + * + * + * Example launch line + * |[ + * gst-launch souphttpsrc location=http://some.server/ iradio-mode=true ! icydemux ! fakesink -t + * ]| This pipeline should read any available ICY tag information and output it. + * The contents of the stream should be detected, and the appropriate mime + * type set on buffers produced from icydemux. (Using gnomevfssrc, neonhttpsrc + * or giosrc instead of souphttpsrc should also work.) + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include + +#include "gsticydemux.h" + +#include + +#define ICY_TYPE_FIND_MAX_SIZE (40*1024) + +GST_DEBUG_CATEGORY_STATIC (icydemux_debug); +#define GST_CAT_DEFAULT (icydemux_debug) + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-icy, metadata-interval = (int)[0, MAX]") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("ANY") + ); + +static void gst_icydemux_class_init (GstICYDemuxClass * klass); +static void gst_icydemux_base_init (GstICYDemuxClass * klass); +static void gst_icydemux_init (GstICYDemux * icydemux); +static void gst_icydemux_dispose (GObject * object); + +static GstFlowReturn gst_icydemux_chain (GstPad * pad, GstBuffer * buf); +static gboolean gst_icydemux_handle_event (GstPad * pad, GstEvent * event); + +static gboolean gst_icydemux_add_srcpad (GstICYDemux * icydemux, + GstCaps * new_caps); +static gboolean gst_icydemux_remove_srcpad (GstICYDemux * icydemux); + +static GstStateChangeReturn gst_icydemux_change_state (GstElement * element, + GstStateChange transition); +static gboolean gst_icydemux_sink_setcaps (GstPad * pad, GstCaps * caps); + +static gboolean gst_icydemux_send_tag_event (GstICYDemux * icydemux, + GstTagList * taglist); + +static GstElementClass *parent_class = NULL; + +GType +gst_icydemux_get_type (void) +{ + static GType plugin_type = 0; + + if (!plugin_type) { + static const GTypeInfo plugin_info = { + sizeof (GstICYDemuxClass), + (GBaseInitFunc) gst_icydemux_base_init, + NULL, + (GClassInitFunc) gst_icydemux_class_init, + NULL, + NULL, + sizeof (GstICYDemux), + 0, + (GInstanceInitFunc) gst_icydemux_init, + }; + plugin_type = g_type_register_static (GST_TYPE_ELEMENT, + "GstICYDemux", &plugin_info, 0); + } + return plugin_type; +} + +static void +gst_icydemux_base_init (GstICYDemuxClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_set_details_simple (element_class, "ICY tag demuxer", + "Codec/Demuxer/Metadata", + "Read and output ICY tags while demuxing the contents", + "Jan Schmidt , " + "Michael Smith "); +} + +static void +gst_icydemux_class_init (GstICYDemuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + + gobject_class->dispose = gst_icydemux_dispose; + + gstelement_class->change_state = gst_icydemux_change_state; + +} + +static void +gst_icydemux_reset (GstICYDemux * icydemux) +{ + /* Unknown at the moment (this is a fatal error if don't have a value by the + * time we get to our chain function) + */ + icydemux->meta_interval = -1; + icydemux->remaining = 0; + + icydemux->typefinding = TRUE; + + gst_caps_replace (&(icydemux->src_caps), NULL); + + gst_icydemux_remove_srcpad (icydemux); + + if (icydemux->cached_tags) { + gst_tag_list_free (icydemux->cached_tags); + icydemux->cached_tags = NULL; + } + + if (icydemux->cached_events) { + g_list_foreach (icydemux->cached_events, + (GFunc) gst_mini_object_unref, NULL); + g_list_free (icydemux->cached_events); + icydemux->cached_events = NULL; + } + + if (icydemux->meta_adapter) { + gst_adapter_clear (icydemux->meta_adapter); + g_object_unref (icydemux->meta_adapter); + icydemux->meta_adapter = NULL; + } + + if (icydemux->typefind_buf) { + gst_buffer_unref (icydemux->typefind_buf); + icydemux->typefind_buf = NULL; + } + + if (icydemux->content_type) { + g_free (icydemux->content_type); + icydemux->content_type = NULL; + } +} + +static void +gst_icydemux_init (GstICYDemux * icydemux) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (icydemux); + + icydemux->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "sink"), "sink"); + gst_pad_set_chain_function (icydemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_icydemux_chain)); + gst_pad_set_event_function (icydemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_icydemux_handle_event)); + gst_pad_set_setcaps_function (icydemux->sinkpad, + GST_DEBUG_FUNCPTR (gst_icydemux_sink_setcaps)); + gst_element_add_pad (GST_ELEMENT (icydemux), icydemux->sinkpad); + + gst_icydemux_reset (icydemux); +} + +static gboolean +gst_icydemux_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstICYDemux *icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad)); + GstStructure *structure = gst_caps_get_structure (caps, 0); + const gchar *tmp; + + if (!gst_structure_get_int (structure, "metadata-interval", + &icydemux->meta_interval)) + return FALSE; + + /* If incoming caps have the HTTP Content-Type, copy that over */ + if ((tmp = gst_structure_get_string (structure, "content-type"))) + icydemux->content_type = g_strdup (tmp); + + /* We have a meta interval, so initialise the rest */ + icydemux->remaining = icydemux->meta_interval; + icydemux->meta_remaining = 0; + return TRUE; +} + +static void +gst_icydemux_dispose (GObject * object) +{ + GstICYDemux *icydemux = GST_ICYDEMUX (object); + + gst_icydemux_reset (icydemux); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static gboolean +gst_icydemux_add_srcpad (GstICYDemux * icydemux, GstCaps * new_caps) +{ + if (icydemux->src_caps == NULL || + !gst_caps_is_equal (new_caps, icydemux->src_caps)) { + gst_caps_replace (&(icydemux->src_caps), new_caps); + if (icydemux->srcpad != NULL) { + GST_DEBUG_OBJECT (icydemux, "Changing src pad caps to %" GST_PTR_FORMAT, + icydemux->src_caps); + + gst_pad_set_caps (icydemux->srcpad, icydemux->src_caps); + } + } else { + /* Caps never changed */ + gst_caps_unref (new_caps); + } + + if (icydemux->srcpad == NULL) { + icydemux->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_GET_CLASS (icydemux), "src"), "src"); + g_return_val_if_fail (icydemux->srcpad != NULL, FALSE); + + gst_pad_use_fixed_caps (icydemux->srcpad); + + if (icydemux->src_caps) + gst_pad_set_caps (icydemux->srcpad, icydemux->src_caps); + + GST_DEBUG_OBJECT (icydemux, "Adding src pad with caps %" GST_PTR_FORMAT, + icydemux->src_caps); + + gst_pad_set_active (icydemux->srcpad, TRUE); + if (!(gst_element_add_pad (GST_ELEMENT (icydemux), icydemux->srcpad))) + return FALSE; + gst_element_no_more_pads (GST_ELEMENT (icydemux)); + } + + return TRUE; +} + +static gboolean +gst_icydemux_remove_srcpad (GstICYDemux * icydemux) +{ + gboolean res = TRUE; + + if (icydemux->srcpad != NULL) { + res = gst_element_remove_pad (GST_ELEMENT (icydemux), icydemux->srcpad); + g_return_val_if_fail (res != FALSE, FALSE); + icydemux->srcpad = NULL; + } + + return res; +}; + +static gchar * +gst_icydemux_unicodify (const gchar * str) +{ + const gchar *env_vars[] = { "GST_ICY_TAG_ENCODING", + "GST_TAG_ENCODING", NULL + }; + + return gst_tag_freeform_string_to_utf8 (str, -1, env_vars); +} + +/* takes ownership of tag list */ +static gboolean +gst_icydemux_tag_found (GstICYDemux * icydemux, GstTagList * tags) +{ + /* send the tag event if we have finished typefinding and have a src pad */ + if (icydemux->srcpad) + return gst_icydemux_send_tag_event (icydemux, tags); + + /* if we haven't a source pad yet, cache the tags */ + if (!icydemux->cached_tags) { + icydemux->cached_tags = tags; + } else { + gst_tag_list_insert (icydemux->cached_tags, tags, + GST_TAG_MERGE_REPLACE_ALL); + gst_tag_list_free (tags); + } + + return TRUE; +} + +static void +gst_icydemux_parse_and_send_tags (GstICYDemux * icydemux) +{ + GstTagList *tags; + const guint8 *data; + int length, i; + gchar *buffer; + gchar **strings; + + length = gst_adapter_available (icydemux->meta_adapter); + + data = gst_adapter_peek (icydemux->meta_adapter, length); + + /* Now, copy this to a buffer where we can NULL-terminate it to make things + * a bit easier, then do that parsing. */ + buffer = g_strndup ((const gchar *) data, length); + + tags = gst_tag_list_new (); + strings = g_strsplit (buffer, "';", 0); + + for (i = 0; strings[i]; i++) { + if (!g_ascii_strncasecmp (strings[i], "StreamTitle=", 12)) { + char *title = gst_icydemux_unicodify (strings[i] + 13); + + if (title && *title) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE, + title, NULL); + g_free (title); + } + } else if (!g_ascii_strncasecmp (strings[i], "StreamUrl=", 10)) { + char *url = gst_icydemux_unicodify (strings[i] + 11); + + if (url && *url) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_HOMEPAGE, + url, NULL); + g_free (url); + } + } + } + + g_strfreev (strings); + g_free (buffer); + gst_adapter_clear (icydemux->meta_adapter); + + if (!gst_tag_list_is_empty (tags)) + gst_icydemux_tag_found (icydemux, tags); + else + gst_tag_list_free (tags); +} + +static gboolean +gst_icydemux_handle_event (GstPad * pad, GstEvent * event) +{ + GstICYDemux *icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad)); + gboolean result; + + if (GST_EVENT_TYPE (event) == GST_EVENT_TAG) { + GstTagList *tags; + + gst_event_parse_tag (event, &tags); + result = gst_icydemux_tag_found (icydemux, gst_tag_list_copy (tags)); + gst_event_unref (event); + return result; + } + + if (icydemux->typefinding) { + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + g_list_foreach (icydemux->cached_events, + (GFunc) gst_mini_object_unref, NULL); + g_list_free (icydemux->cached_events); + icydemux->cached_events = NULL; + + return gst_pad_event_default (pad, event); + default: + icydemux->cached_events = g_list_append (icydemux->cached_events, + event); + return TRUE; + } + } else { + return gst_pad_event_default (pad, event); + } +} + +static void +gst_icydemux_send_cached_events (GstICYDemux * icydemux) +{ + GList *l; + + for (l = icydemux->cached_events; l != NULL; l = l->next) { + GstEvent *event = GST_EVENT (l->data); + + gst_pad_push_event (icydemux->srcpad, event); + } + g_list_free (icydemux->cached_events); + icydemux->cached_events = NULL; +} + +static GstFlowReturn +gst_icydemux_typefind_or_forward (GstICYDemux * icydemux, GstBuffer * buf) +{ + if (icydemux->typefinding) { + GstBuffer *tf_buf; + GstCaps *caps = NULL; + GstTypeFindProbability prob; + + /* If we have a content-type from upstream, let's see if we can shortcut + * typefinding */ + if (G_UNLIKELY (icydemux->content_type)) { + if (!g_ascii_strcasecmp (icydemux->content_type, "video/nsv")) { + GST_DEBUG ("We have a NSV stream"); + caps = gst_caps_new_simple ("video/x-nsv", NULL); + } else { + GST_DEBUG ("Upstream Content-Type isn't supported"); + g_free (icydemux->content_type); + icydemux->content_type = NULL; + } + } + + if (icydemux->typefind_buf) { + icydemux->typefind_buf = gst_buffer_join (icydemux->typefind_buf, buf); + } else { + icydemux->typefind_buf = buf; + } + + /* Only typefind if we haven't already got some caps */ + if (caps == NULL) { + caps = gst_type_find_helper_for_buffer (GST_OBJECT (icydemux), + icydemux->typefind_buf, &prob); + + if (caps == NULL) { + if (GST_BUFFER_SIZE (icydemux->typefind_buf) < ICY_TYPE_FIND_MAX_SIZE) { + /* Just break for more data */ + return GST_FLOW_OK; + } + + /* We failed typefind */ + GST_ELEMENT_ERROR (icydemux, STREAM, TYPE_NOT_FOUND, (NULL), + ("No caps found for contents within an ICY stream")); + gst_buffer_unref (icydemux->typefind_buf); + icydemux->typefind_buf = NULL; + return GST_FLOW_ERROR; + } + } + + if (!gst_icydemux_add_srcpad (icydemux, caps)) { + GST_DEBUG_OBJECT (icydemux, "Failed to add srcpad"); + gst_caps_unref (caps); + gst_buffer_unref (icydemux->typefind_buf); + icydemux->typefind_buf = NULL; + return GST_FLOW_ERROR; + } + gst_caps_unref (caps); + + if (icydemux->cached_events) { + gst_icydemux_send_cached_events (icydemux); + } + + if (icydemux->cached_tags) { + gst_icydemux_send_tag_event (icydemux, icydemux->cached_tags); + icydemux->cached_tags = NULL; + } + + /* Move onto streaming: call ourselves recursively with the typefind buffer + * to get that forwarded. */ + icydemux->typefinding = FALSE; + + tf_buf = icydemux->typefind_buf; + icydemux->typefind_buf = NULL; + return gst_icydemux_typefind_or_forward (icydemux, tf_buf); + } else { + if (G_UNLIKELY (icydemux->srcpad == NULL)) { + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } + + buf = gst_buffer_make_metadata_writable (buf); + gst_buffer_set_caps (buf, icydemux->src_caps); + + /* Most things don't care, and it's a pain to track (we should preserve a + * 0 offset on the first buffer though if it's there, for id3demux etc.) */ + if (GST_BUFFER_OFFSET (buf) != 0) { + GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE; + } + + return gst_pad_push (icydemux->srcpad, buf); + } +} + +static void +gst_icydemux_add_meta (GstICYDemux * icydemux, GstBuffer * buf) +{ + if (!icydemux->meta_adapter) + icydemux->meta_adapter = gst_adapter_new (); + + gst_adapter_push (icydemux->meta_adapter, buf); +} + +static GstFlowReturn +gst_icydemux_chain (GstPad * pad, GstBuffer * buf) +{ + GstICYDemux *icydemux; + guint size, chunk, offset; + GstBuffer *sub; + GstFlowReturn ret = GST_FLOW_OK; + + icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad)); + + if (G_UNLIKELY (icydemux->meta_interval < 0)) + goto not_negotiated; + + if (icydemux->meta_interval == 0) { + ret = gst_icydemux_typefind_or_forward (icydemux, buf); + goto done; + } + + /* Go through the buffer, chopping it into appropriate chunks. Forward as + * tags or buffers, as appropriate + */ + size = GST_BUFFER_SIZE (buf); + offset = 0; + while (size) { + if (icydemux->remaining) { + chunk = (size <= icydemux->remaining) ? size : icydemux->remaining; + sub = gst_buffer_create_sub (buf, offset, chunk); + offset += chunk; + icydemux->remaining -= chunk; + size -= chunk; + + /* This buffer goes onto typefinding, and/or directly pushed out */ + ret = gst_icydemux_typefind_or_forward (icydemux, sub); + if (ret != GST_FLOW_OK) + goto done; + } else if (icydemux->meta_remaining) { + chunk = (size <= icydemux->meta_remaining) ? + size : icydemux->meta_remaining; + sub = gst_buffer_create_sub (buf, offset, chunk); + gst_icydemux_add_meta (icydemux, sub); + + offset += chunk; + icydemux->meta_remaining -= chunk; + size -= chunk; + + if (icydemux->meta_remaining == 0) { + /* Parse tags from meta_adapter, send off as tag messages */ + GST_DEBUG_OBJECT (icydemux, "No remaining metadata, parsing for tags"); + gst_icydemux_parse_and_send_tags (icydemux); + + icydemux->remaining = icydemux->meta_interval; + } + } else { + /* We need to read a single byte (always safe at this point in the loop) + * to figure out how many bytes of metadata exist. + * The 'spec' tells us to read 16 * (byte_value) bytes of metadata after + * this (zero is common, and means the metadata hasn't changed). + */ + icydemux->meta_remaining = 16 * GST_BUFFER_DATA (buf)[offset]; + if (icydemux->meta_remaining == 0) + icydemux->remaining = icydemux->meta_interval; + + offset += 1; + size -= 1; + } + } + +done: + gst_buffer_unref (buf); + + return ret; + + /* ERRORS */ +not_negotiated: + { + GST_WARNING_OBJECT (icydemux, "meta_interval not set, buffer probably had " + "no caps set. Try enabling iradio-mode on the http source element"); + gst_buffer_unref (buf); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static GstStateChangeReturn +gst_icydemux_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstICYDemux *icydemux = GST_ICYDEMUX (element); + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_icydemux_reset (icydemux); + break; + default: + break; + } + return ret; +} + +/* takes ownership of tag list */ +static gboolean +gst_icydemux_send_tag_event (GstICYDemux * icydemux, GstTagList * tags) +{ + GstEvent *event; + + gst_element_post_message (GST_ELEMENT (icydemux), + gst_message_new_tag (GST_OBJECT (icydemux), gst_tag_list_copy (tags))); + + event = gst_event_new_tag (tags); + GST_EVENT_TIMESTAMP (event) = 0; + + GST_DEBUG_OBJECT (icydemux, "Sending tag event on src pad"); + return gst_pad_push_event (icydemux->srcpad, event); + +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (icydemux_debug, "icydemux", 0, + "GStreamer ICY tag demuxer"); + + return gst_element_register (plugin, "icydemux", + GST_RANK_PRIMARY, GST_TYPE_ICYDEMUX); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "icydemux", + "Demux ICY tags from a stream", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/icydemux/gsticydemux.h b/gst/icydemux/gsticydemux.h new file mode 100644 index 0000000..d48339a --- /dev/null +++ b/gst/icydemux/gsticydemux.h @@ -0,0 +1,87 @@ +/* Copyright 2005 Jan Schmidt + * 2006 Michael Smith + * Copyright (C) 2003-2004 Benjamin Otte + * + * 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_ICYDEMUX_H__ +#define __GST_ICYDEMUX_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ICYDEMUX \ + (gst_icydemux_get_type()) +#define GST_ICYDEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ICYDEMUX,GstICYDemux)) +#define GST_ICYDEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ICYDEMUX,GstICYDemuxClass)) +#define GST_IS_ICYDEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ICYDEMUX)) +#define GST_IS_ICYDEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ICYDEMUX)) + +typedef struct _GstICYDemux GstICYDemux; +typedef struct _GstICYDemuxClass GstICYDemuxClass; + +struct _GstICYDemux +{ + GstElement element; + + GstPad *sinkpad, *srcpad; + + /* Interval between metadata updates */ + gint meta_interval; + + /* Remaining bytes until the next metadata update */ + gint remaining; + + /* When 'remaining' is zero, this holds the number of bytes of metadata we + * still need to read, or zero if we don't yet know (which means we need to + * read one byte, after which we can initialise this properly) */ + gint meta_remaining; + + /* Caps for the data enclosed */ + GstCaps *src_caps; + + /* True if we're still typefinding */ + gboolean typefinding; + + GstTagList *cached_tags; + GList *cached_events; + + GstAdapter *meta_adapter; + + GstBuffer *typefind_buf; + + /* upstream HTTP Content-Type */ + gchar *content_type; +}; + +struct _GstICYDemuxClass +{ + GstElementClass parent_class; +}; + +GType gst_icydemux_get_type (void); + +G_END_DECLS + +#endif /* __GST_ICYDEMUX_H__ */ diff --git a/gst/id3demux/Makefile.am b/gst/id3demux/Makefile.am new file mode 100644 index 0000000..cce8035 --- /dev/null +++ b/gst/id3demux/Makefile.am @@ -0,0 +1,24 @@ +plugin_LTLIBRARIES = libgstid3demux.la + +libgstid3demux_la_SOURCES = gstid3demux.c +libgstid3demux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstid3demux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@ $(GST_BASE_LIBS) +libgstid3demux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstid3demux_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstid3demux.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstid3demux -:SHARED libgstid3demux \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstid3demux_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstid3demux_la_CFLAGS) \ + -:LDFLAGS $(libgstid3demux_la_LDFLAGS) \ + $(libgstid3demux_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/id3demux/Makefile.in b/gst/id3demux/Makefile.in new file mode 100644 index 0000000..a4753f3 --- /dev/null +++ b/gst/id3demux/Makefile.in @@ -0,0 +1,821 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/id3demux +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstid3demux_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstid3demux_la_OBJECTS = libgstid3demux_la-gstid3demux.lo +libgstid3demux_la_OBJECTS = $(am_libgstid3demux_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstid3demux_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstid3demux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstid3demux_la_CFLAGS) $(CFLAGS) \ + $(libgstid3demux_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstid3demux_la_SOURCES) +DIST_SOURCES = $(libgstid3demux_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstid3demux.la +libgstid3demux_la_SOURCES = gstid3demux.c +libgstid3demux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstid3demux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@ $(GST_BASE_LIBS) + +libgstid3demux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstid3demux_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstid3demux.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/id3demux/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/id3demux/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstid3demux.la: $(libgstid3demux_la_OBJECTS) $(libgstid3demux_la_DEPENDENCIES) $(EXTRA_libgstid3demux_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstid3demux_la_LINK) -rpath $(plugindir) $(libgstid3demux_la_OBJECTS) $(libgstid3demux_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstid3demux_la-gstid3demux.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstid3demux_la-gstid3demux.lo: gstid3demux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstid3demux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstid3demux_la_CFLAGS) $(CFLAGS) -MT libgstid3demux_la-gstid3demux.lo -MD -MP -MF $(DEPDIR)/libgstid3demux_la-gstid3demux.Tpo -c -o libgstid3demux_la-gstid3demux.lo `test -f 'gstid3demux.c' || echo '$(srcdir)/'`gstid3demux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstid3demux_la-gstid3demux.Tpo $(DEPDIR)/libgstid3demux_la-gstid3demux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstid3demux.c' object='libgstid3demux_la-gstid3demux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstid3demux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstid3demux_la_CFLAGS) $(CFLAGS) -c -o libgstid3demux_la-gstid3demux.lo `test -f 'gstid3demux.c' || echo '$(srcdir)/'`gstid3demux.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstid3demux -:SHARED libgstid3demux \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstid3demux_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstid3demux_la_CFLAGS) \ + -:LDFLAGS $(libgstid3demux_la_LDFLAGS) \ + $(libgstid3demux_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/id3demux/gstid3demux.c b/gst/id3demux/gstid3demux.c new file mode 100644 index 0000000..414b574 --- /dev/null +++ b/gst/id3demux/gstid3demux.c @@ -0,0 +1,287 @@ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ +/* GStreamer ID3 tag demuxer + * Copyright (C) 2005 Jan Schmidt + * Copyright (C) 2003-2004 Benjamin Otte + * + * 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-id3demux + * + * id3demux accepts data streams with either (or both) ID3v2 regions at the + * start, or ID3v1 at the end. The mime type of the data between the tag blocks + * is detected using typefind functions, and the appropriate output mime type + * set on outgoing buffers. + * + * The element is only able to read ID3v1 tags from a seekable stream, because + * they are at the end of the stream. That is, when get_range mode is supported + * by the upstream elements. If get_range operation is available, id3demux makes + * it available downstream. This means that elements which require get_range + * mode, such as wavparse, can operate on files containing ID3 tag information. + * + * This id3demux element replaced an older element with the same name which + * relied on libid3tag from the MAD project. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=file.mp3 ! id3demux ! fakesink -t + * ]| This pipeline should read any available ID3 tag information and output it. + * The contents of the file inside the ID3 tag regions should be detected, and + * the appropriate mime type set on buffers produced from id3demux. + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include + +#include "gstid3demux.h" + +enum +{ + ARG_0, + ARG_PREFER_V1 +}; + +#define DEFAULT_PREFER_V1 FALSE + +GST_DEBUG_CATEGORY (id3demux_debug); +#define GST_CAT_DEFAULT (id3demux_debug) + +#define ID3V1_TAG_SIZE 128 +#define ID3V2_HDR_SIZE GST_TAG_ID3V2_HEADER_SIZE + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-id3") + ); + +static gboolean gst_id3demux_identify_tag (GstTagDemux * demux, + GstBuffer * buffer, gboolean start_tag, guint * tag_size); +static GstTagDemuxResult gst_id3demux_parse_tag (GstTagDemux * demux, + GstBuffer * buffer, gboolean start_tag, guint * tag_size, + GstTagList ** tags); +static GstTagList *gst_id3demux_merge_tags (GstTagDemux * tagdemux, + const GstTagList * start_tags, const GstTagList * end_tags); + +static void gst_id3demux_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_id3demux_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +GST_BOILERPLATE (GstID3Demux, gst_id3demux, GstTagDemux, GST_TYPE_TAG_DEMUX); + +static void +gst_id3demux_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "ID3 tag demuxer", + "Codec/Demuxer/Metadata", + "Read and output ID3v1 and ID3v2 tags while demuxing the contents", + "Jan Schmidt "); +} + +static void +gst_id3demux_class_init (GstID3DemuxClass * klass) +{ + GstTagDemuxClass *tagdemux_class = (GstTagDemuxClass *) klass; + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_id3demux_set_property; + gobject_class->get_property = gst_id3demux_get_property; + + g_object_class_install_property (gobject_class, ARG_PREFER_V1, + g_param_spec_boolean ("prefer-v1", "Prefer version 1 tag", + "Prefer tags from ID3v1 tag at end of file when both ID3v1 " + "and ID3v2 tags are present", DEFAULT_PREFER_V1, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + tagdemux_class->identify_tag = GST_DEBUG_FUNCPTR (gst_id3demux_identify_tag); + tagdemux_class->parse_tag = GST_DEBUG_FUNCPTR (gst_id3demux_parse_tag); + tagdemux_class->merge_tags = GST_DEBUG_FUNCPTR (gst_id3demux_merge_tags); + + tagdemux_class->min_start_size = ID3V2_HDR_SIZE; + tagdemux_class->min_end_size = ID3V1_TAG_SIZE; +} + +static void +gst_id3demux_init (GstID3Demux * id3demux, GstID3DemuxClass * klass) +{ + id3demux->prefer_v1 = DEFAULT_PREFER_V1; +} + +static gboolean +gst_id3demux_identify_tag (GstTagDemux * demux, GstBuffer * buf, + gboolean start_tag, guint * tag_size) +{ + const guint8 *data = GST_BUFFER_DATA (buf); + + if (start_tag) { + if (data[0] != 'I' || data[1] != 'D' || data[2] != '3') + goto no_marker; + + *tag_size = gst_tag_get_id3v2_tag_size (buf); + } else { + if (data[0] != 'T' || data[1] != 'A' || data[2] != 'G') + goto no_marker; + + *tag_size = ID3V1_TAG_SIZE; + } + + GST_INFO_OBJECT (demux, "Found ID3v%u marker, tag_size = %u", + (start_tag) ? 2 : 1, *tag_size); + + return TRUE; + +no_marker: + { + GST_DEBUG_OBJECT (demux, "No ID3v%u marker found", (start_tag) ? 2 : 1); + return FALSE; + } +} + +static void +gst_id3demux_add_container_format (GstTagList * tags) +{ + GstCaps *sink_caps; + + sink_caps = gst_static_pad_template_get_caps (&sink_factory); + gst_pb_utils_add_codec_description_to_tag_list (tags, + GST_TAG_CONTAINER_FORMAT, sink_caps); + gst_caps_unref (sink_caps); +} + +static GstTagDemuxResult +gst_id3demux_parse_tag (GstTagDemux * demux, GstBuffer * buffer, + gboolean start_tag, guint * tag_size, GstTagList ** tags) +{ + if (start_tag) { + *tag_size = gst_tag_get_id3v2_tag_size (buffer); + *tags = gst_tag_list_from_id3v2_tag (buffer); + + if (G_LIKELY (*tags != NULL)) { + gst_id3demux_add_container_format (*tags); + return GST_TAG_DEMUX_RESULT_OK; + } else { + return GST_TAG_DEMUX_RESULT_BROKEN_TAG; + } + } else { + *tags = gst_tag_list_new_from_id3v1 (GST_BUFFER_DATA (buffer)); + + if (G_UNLIKELY (*tags == NULL)) + return GST_TAG_DEMUX_RESULT_BROKEN_TAG; + + gst_id3demux_add_container_format (*tags); + *tag_size = ID3V1_TAG_SIZE; + return GST_TAG_DEMUX_RESULT_OK; + } +} + +static GstTagList * +gst_id3demux_merge_tags (GstTagDemux * tagdemux, const GstTagList * start_tags, + const GstTagList * end_tags) +{ + GstID3Demux *id3demux; + GstTagList *merged; + gboolean prefer_v1; + + id3demux = GST_ID3DEMUX (tagdemux); + + GST_OBJECT_LOCK (id3demux); + prefer_v1 = id3demux->prefer_v1; + GST_OBJECT_UNLOCK (id3demux); + + /* we merge in REPLACE mode, so put the less important tags first */ + if (prefer_v1) + merged = gst_tag_list_merge (start_tags, end_tags, GST_TAG_MERGE_REPLACE); + else + merged = gst_tag_list_merge (end_tags, start_tags, GST_TAG_MERGE_REPLACE); + + GST_LOG_OBJECT (id3demux, "start tags: %" GST_PTR_FORMAT, start_tags); + GST_LOG_OBJECT (id3demux, "end tags: %" GST_PTR_FORMAT, end_tags); + GST_LOG_OBJECT (id3demux, "merged tags: %" GST_PTR_FORMAT, merged); + + return merged; +} + +static void +gst_id3demux_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstID3Demux *id3demux; + + id3demux = GST_ID3DEMUX (object); + + switch (prop_id) { + case ARG_PREFER_V1:{ + GST_OBJECT_LOCK (id3demux); + id3demux->prefer_v1 = g_value_get_boolean (value); + GST_OBJECT_UNLOCK (id3demux); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_id3demux_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstID3Demux *id3demux; + + id3demux = GST_ID3DEMUX (object); + + switch (prop_id) { + case ARG_PREFER_V1: + GST_OBJECT_LOCK (id3demux); + g_value_set_boolean (value, id3demux->prefer_v1); + GST_OBJECT_UNLOCK (id3demux); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (id3demux_debug, "id3demux", 0, + "GStreamer ID3 tag demuxer"); + + gst_tag_register_musicbrainz_tags (); + + return gst_element_register (plugin, "id3demux", + GST_RANK_PRIMARY, GST_TYPE_ID3DEMUX); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "id3demux", + "Demux ID3v1 and ID3v2 tags from a file", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/id3demux/gstid3demux.h b/gst/id3demux/gstid3demux.h new file mode 100644 index 0000000..a875502 --- /dev/null +++ b/gst/id3demux/gstid3demux.h @@ -0,0 +1,59 @@ +/* GStreamer ID3 tag demuxer + * Copyright (C) 2005 Jan Schmidt + * Copyright (C) 2003-2004 Benjamin Otte + * + * 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_ID3DEMUX_H__ +#define __GST_ID3DEMUX_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ID3DEMUX \ + (gst_id3demux_get_type()) +#define GST_ID3DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ID3DEMUX,GstID3Demux)) +#define GST_ID3DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ID3DEMUX,GstID3DemuxClass)) +#define GST_IS_ID3DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ID3DEMUX)) +#define GST_IS_ID3DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ID3DEMUX)) + +typedef struct _GstID3Demux GstID3Demux; +typedef struct _GstID3DemuxClass GstID3DemuxClass; + +struct _GstID3Demux +{ + GstTagDemux tagdemux; + + gboolean prefer_v1; /* prefer ID3v1 tags over ID3v2 tags? */ +}; + +struct _GstID3DemuxClass +{ + GstTagDemuxClass parent_class; +}; + +GType gst_id3demux_get_type (void); + +G_END_DECLS + +#endif /* __GST_ID3DEMUX_H__ */ + diff --git a/gst/imagefreeze/Makefile.am b/gst/imagefreeze/Makefile.am new file mode 100644 index 0000000..7aa8614 --- /dev/null +++ b/gst/imagefreeze/Makefile.am @@ -0,0 +1,24 @@ +plugin_LTLIBRARIES = libgstimagefreeze.la + +libgstimagefreeze_la_SOURCES = gstimagefreeze.c + +libgstimagefreeze_la_CFLAGS = $(GST_CFLAGS) +libgstimagefreeze_la_LIBADD = $(GST_LIBS) +libgstimagefreeze_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstimagefreeze_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstimagefreeze.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstimagefreeze -:SHARED libgstimagefreeze \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstimagefreeze_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstimagefreeze_la_CFLAGS) \ + -:LDFLAGS $(libgstimagefreeze_la_LDFLAGS) \ + $(libgstimagefreeze_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/imagefreeze/Makefile.in b/gst/imagefreeze/Makefile.in new file mode 100644 index 0000000..4c8a06d --- /dev/null +++ b/gst/imagefreeze/Makefile.in @@ -0,0 +1,819 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/imagefreeze +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstimagefreeze_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libgstimagefreeze_la_OBJECTS = \ + libgstimagefreeze_la-gstimagefreeze.lo +libgstimagefreeze_la_OBJECTS = $(am_libgstimagefreeze_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstimagefreeze_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstimagefreeze_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstimagefreeze_la_CFLAGS) $(CFLAGS) \ + $(libgstimagefreeze_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstimagefreeze_la_SOURCES) +DIST_SOURCES = $(libgstimagefreeze_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstimagefreeze.la +libgstimagefreeze_la_SOURCES = gstimagefreeze.c +libgstimagefreeze_la_CFLAGS = $(GST_CFLAGS) +libgstimagefreeze_la_LIBADD = $(GST_LIBS) +libgstimagefreeze_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstimagefreeze_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstimagefreeze.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/imagefreeze/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/imagefreeze/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstimagefreeze.la: $(libgstimagefreeze_la_OBJECTS) $(libgstimagefreeze_la_DEPENDENCIES) $(EXTRA_libgstimagefreeze_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstimagefreeze_la_LINK) -rpath $(plugindir) $(libgstimagefreeze_la_OBJECTS) $(libgstimagefreeze_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstimagefreeze_la-gstimagefreeze.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstimagefreeze_la-gstimagefreeze.lo: gstimagefreeze.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstimagefreeze_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstimagefreeze_la_CFLAGS) $(CFLAGS) -MT libgstimagefreeze_la-gstimagefreeze.lo -MD -MP -MF $(DEPDIR)/libgstimagefreeze_la-gstimagefreeze.Tpo -c -o libgstimagefreeze_la-gstimagefreeze.lo `test -f 'gstimagefreeze.c' || echo '$(srcdir)/'`gstimagefreeze.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstimagefreeze_la-gstimagefreeze.Tpo $(DEPDIR)/libgstimagefreeze_la-gstimagefreeze.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstimagefreeze.c' object='libgstimagefreeze_la-gstimagefreeze.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstimagefreeze_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstimagefreeze_la_CFLAGS) $(CFLAGS) -c -o libgstimagefreeze_la-gstimagefreeze.lo `test -f 'gstimagefreeze.c' || echo '$(srcdir)/'`gstimagefreeze.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstimagefreeze -:SHARED libgstimagefreeze \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstimagefreeze_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstimagefreeze_la_CFLAGS) \ + -:LDFLAGS $(libgstimagefreeze_la_LDFLAGS) \ + $(libgstimagefreeze_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/imagefreeze/gstimagefreeze.c b/gst/imagefreeze/gstimagefreeze.c new file mode 100644 index 0000000..f5f05dd --- /dev/null +++ b/gst/imagefreeze/gstimagefreeze.c @@ -0,0 +1,927 @@ +/* GStreamer + * Copyright (c) 2005 Edward Hervey + * Copyright (C) 2010 Sebastian Dröge + * + * 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-imagefreeze + * + * The imagefreeze element generates a still frame video stream from + * the input. It duplicates the first frame with the framerate requested + * by downstream, allows seeking and answers queries. + * + * + * Example launch line + * |[ + * gst-launch -v filesrc location=some.png ! decodebin2 ! imagefreeze ! autovideosink + * ]| This pipeline shows a still frame stream of a PNG file. + * + */ + +/* This is based on the imagefreeze element from PiTiVi: + * http://git.gnome.org/browse/pitivi/tree/pitivi/elements/imagefreeze.py + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +#include "gstimagefreeze.h" + +static void gst_image_freeze_finalize (GObject * object); + +static void gst_image_freeze_reset (GstImageFreeze * self); + +static GstStateChangeReturn gst_image_freeze_change_state (GstElement * element, + GstStateChange transition); + +static GstFlowReturn gst_image_freeze_sink_chain (GstPad * pad, + GstBuffer * buffer); +static gboolean gst_image_freeze_sink_event (GstPad * pad, GstEvent * event); +static gboolean gst_image_freeze_sink_setcaps (GstPad * pad, GstCaps * caps); +static GstCaps *gst_image_freeze_sink_getcaps (GstPad * pad); +static gboolean gst_image_freeze_sink_query (GstPad * pad, GstQuery * query); +static GstFlowReturn gst_image_freeze_sink_bufferalloc (GstPad * pad, + guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); +static void gst_image_freeze_src_loop (GstPad * pad); +static gboolean gst_image_freeze_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_image_freeze_src_query (GstPad * pad, GstQuery * query); +static const GstQueryType *gst_image_freeze_src_query_type (GstPad * pad); + +static GstStaticPadTemplate sink_pad_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray")); + +static GstStaticPadTemplate src_pad_template = + GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray")); + +GST_DEBUG_CATEGORY_STATIC (gst_image_freeze_debug); +#define GST_CAT_DEFAULT gst_image_freeze_debug + +GST_BOILERPLATE (GstImageFreeze, gst_image_freeze, GstElement, + GST_TYPE_ELEMENT); + +static void +gst_image_freeze_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (gstelement_class, + "Still frame stream generator", + "Filter/Video", + "Generates a still frame stream from an image", + "Sebastian Dröge "); + + gst_element_class_add_static_pad_template (gstelement_class, + &sink_pad_template); + gst_element_class_add_static_pad_template (gstelement_class, + &src_pad_template); +} + +static void +gst_image_freeze_class_init (GstImageFreezeClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + gobject_class->finalize = gst_image_freeze_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_image_freeze_change_state); +} + +static void +gst_image_freeze_init (GstImageFreeze * self, GstImageFreezeClass * g_class) +{ + self->sinkpad = gst_pad_new_from_static_template (&sink_pad_template, "sink"); + gst_pad_set_chain_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_sink_chain)); + gst_pad_set_event_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_sink_event)); + gst_pad_set_query_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_sink_query)); + gst_pad_set_setcaps_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_sink_setcaps)); + gst_pad_set_getcaps_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_sink_getcaps)); + gst_pad_set_bufferalloc_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_sink_bufferalloc)); + gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); + + self->srcpad = gst_pad_new_from_static_template (&src_pad_template, "src"); + gst_pad_set_event_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_src_event)); + gst_pad_set_query_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_src_query)); + gst_pad_set_query_type_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_image_freeze_src_query_type)); + gst_pad_use_fixed_caps (self->srcpad); + gst_element_add_pad (GST_ELEMENT (self), self->srcpad); + + self->lock = g_mutex_new (); + + gst_image_freeze_reset (self); +} + +static void +gst_image_freeze_finalize (GObject * object) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (object); + + gst_image_freeze_reset (self); + + if (self->lock) + g_mutex_free (self->lock); + self->lock = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_image_freeze_reset (GstImageFreeze * self) +{ + GST_DEBUG_OBJECT (self, "Resetting internal state"); + + g_mutex_lock (self->lock); + gst_buffer_replace (&self->buffer, NULL); + + gst_segment_init (&self->segment, GST_FORMAT_TIME); + self->need_segment = TRUE; + gst_event_replace (&self->close_segment, NULL); + + self->fps_n = self->fps_d = 0; + self->offset = 0; + g_mutex_unlock (self->lock); + + g_atomic_int_set (&self->seeking, 0); +} + +static gboolean +gst_image_freeze_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); + gboolean ret = FALSE; + GstStructure *s; + gint fps_n, fps_d; + GstCaps *othercaps, *intersection; + guint i, n; + + caps = gst_caps_make_writable (gst_caps_ref (caps)); + + GST_DEBUG_OBJECT (pad, "Setting caps: %" GST_PTR_FORMAT, caps); + + s = gst_caps_get_structure (caps, 0); + + /* 1. Remove framerate */ + gst_structure_remove_field (s, "framerate"); + gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, + NULL); + + /* 2. Intersect with template caps */ + othercaps = (GstCaps *) gst_pad_get_pad_template_caps (pad); + intersection = gst_caps_intersect (caps, othercaps); + GST_DEBUG_OBJECT (pad, "Intersecting: %" GST_PTR_FORMAT, caps); + GST_DEBUG_OBJECT (pad, "with: %" GST_PTR_FORMAT, othercaps); + GST_DEBUG_OBJECT (pad, "gave: %" GST_PTR_FORMAT, intersection); + gst_caps_unref (caps); + caps = intersection; + intersection = othercaps = NULL; + + /* 3. Intersect with downstream peer caps */ + othercaps = gst_pad_peer_get_caps (self->srcpad); + if (othercaps) { + intersection = gst_caps_intersect (caps, othercaps); + GST_DEBUG_OBJECT (pad, "Intersecting: %" GST_PTR_FORMAT, caps); + GST_DEBUG_OBJECT (pad, "with: %" GST_PTR_FORMAT, othercaps); + GST_DEBUG_OBJECT (pad, "gave: %" GST_PTR_FORMAT, intersection); + gst_caps_unref (othercaps); + gst_caps_unref (caps); + caps = intersection; + intersection = othercaps = NULL; + } + + /* 4. For every candidate check if it's accepted downstream + * and fixate framerate to nearest 25/1 */ + n = gst_caps_get_size (caps); + for (i = 0; i < n; i++) { + GstCaps *candidate = gst_caps_new_empty (); + GstStructure *s = gst_structure_copy (gst_caps_get_structure (caps, i)); + + gst_caps_append_structure (candidate, s); + if (gst_pad_peer_accept_caps (self->srcpad, candidate)) { + if (gst_structure_has_field_typed (s, "framerate", GST_TYPE_FRACTION) || + gst_structure_fixate_field_nearest_fraction (s, "framerate", 25, 1)) { + gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d); + if (fps_d != 0) { + g_mutex_lock (self->lock); + self->fps_n = fps_n; + self->fps_d = fps_d; + g_mutex_unlock (self->lock); + GST_DEBUG_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, candidate); + gst_pad_set_caps (self->srcpad, candidate); + gst_caps_unref (candidate); + ret = TRUE; + goto done; + } else { + GST_WARNING_OBJECT (pad, "Invalid caps with framerate %d/%d", fps_n, + fps_d); + } + } + } + gst_caps_unref (candidate); + } + +done: + if (!ret) + GST_ERROR_OBJECT (pad, "No usable caps found"); + + gst_caps_unref (caps); + gst_object_unref (self); + + return ret; +} + +static GstCaps * +gst_image_freeze_sink_getcaps (GstPad * pad) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); + GstCaps *ret, *tmp; + guint i, n; + + if (GST_PAD_CAPS (pad)) { + ret = gst_caps_copy (GST_PAD_CAPS (pad)); + goto done; + } + + tmp = gst_pad_peer_get_caps (self->srcpad); + if (tmp) { + ret = gst_caps_intersect (tmp, gst_pad_get_pad_template_caps (pad)); + gst_caps_unref (tmp); + } else { + ret = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + } + + n = gst_caps_get_size (ret); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (ret, i); + + gst_structure_remove_field (s, "framerate"); + gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, + 1, NULL); + } + +done: + gst_object_unref (self); + + GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); + + return ret; +} + +static gboolean +gst_image_freeze_sink_query (GstPad * pad, GstQuery * query) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); + gboolean ret; + GstPad *peer = gst_pad_get_peer (self->srcpad); + + GST_LOG_OBJECT (pad, "Handling query of type '%s'", + gst_query_type_get_name (GST_QUERY_TYPE (query))); + + if (!peer) { + GST_INFO_OBJECT (pad, "No peer yet, dropping query"); + ret = FALSE; + } else { + ret = gst_pad_query (peer, query); + gst_object_unref (peer); + } + + gst_object_unref (self); + return ret; +} + +static GstFlowReturn +gst_image_freeze_sink_bufferalloc (GstPad * pad, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); + GstFlowReturn ret; + gboolean do_alloc; + + GST_LOG_OBJECT (pad, "Allocating buffer with offset 0x%" G_GINT64_MODIFIER + "x and size %u with caps: %" GST_PTR_FORMAT, offset, size, caps); + + *buf = NULL; + + g_mutex_lock (self->lock); + do_alloc = self->buffer == NULL; + g_mutex_unlock (self->lock); + + if (do_alloc) { + gboolean seeking = FALSE; + + do { + GST_PAD_STREAM_LOCK (self->srcpad); + ret = gst_pad_alloc_buffer (self->srcpad, offset, size, caps, buf); + + seeking = ret == GST_FLOW_WRONG_STATE + && g_atomic_int_get (&self->seeking); + GST_PAD_STREAM_UNLOCK (self->srcpad); + } while (seeking); + + if (G_UNLIKELY (ret != GST_FLOW_OK)) + GST_ERROR_OBJECT (pad, "Allocating buffer failed: %s", + gst_flow_get_name (ret)); + } else { + /* Let upstream go EOS if we already have a buffer */ + ret = GST_FLOW_UNEXPECTED; + } + + gst_object_unref (self); + + return ret; +} + +static gboolean +gst_image_freeze_convert (GstImageFreeze * self, + GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) +{ + gboolean ret = FALSE; + + if (src_format == *dest_format) { + *dest_value = src_value; + return TRUE; + } + + if (src_value == -1) { + *dest_value = -1; + return TRUE; + } + + switch (src_format) { + case GST_FORMAT_DEFAULT:{ + switch (*dest_format) { + case GST_FORMAT_TIME: + g_mutex_lock (self->lock); + if (self->fps_n == 0) + *dest_value = -1; + else + *dest_value = + gst_util_uint64_scale (src_value, GST_SECOND * self->fps_d, + self->fps_n); + g_mutex_unlock (self->lock); + ret = TRUE; + break; + default: + break; + } + break; + } + case GST_FORMAT_TIME:{ + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + g_mutex_lock (self->lock); + *dest_value = + gst_util_uint64_scale (src_value, self->fps_n, + self->fps_d * GST_SECOND); + g_mutex_unlock (self->lock); + ret = TRUE; + break; + default: + break; + } + break; + } + default: + break; + } + + return ret; +} + +static const GstQueryType * +gst_image_freeze_src_query_type (GstPad * pad) +{ + static const GstQueryType types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_SEEKING, + GST_QUERY_CONVERT, + 0 + }; + + return types; +} + +static gboolean +gst_image_freeze_src_query (GstPad * pad, GstQuery * query) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); + gboolean ret = FALSE; + + GST_LOG_OBJECT (pad, "Handling query of type '%s'", + gst_query_type_get_name (GST_QUERY_TYPE (query))); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONVERT:{ + GstFormat src_format, dest_format; + gint64 src_value, dest_value; + + gst_query_parse_convert (query, &src_format, &src_value, &dest_format, + &dest_value); + ret = + gst_image_freeze_convert (self, src_format, src_value, &dest_format, + &dest_value); + if (ret) + gst_query_set_convert (query, src_format, src_value, dest_format, + dest_value); + break; + } + case GST_QUERY_POSITION:{ + GstFormat format; + gint64 position; + + gst_query_parse_position (query, &format, NULL); + switch (format) { + case GST_FORMAT_DEFAULT:{ + g_mutex_lock (self->lock); + position = self->offset; + g_mutex_unlock (self->lock); + ret = TRUE; + break; + } + case GST_FORMAT_TIME:{ + g_mutex_lock (self->lock); + position = self->segment.last_stop; + g_mutex_unlock (self->lock); + ret = TRUE; + break; + } + default: + break; + } + + if (ret) { + gst_query_set_position (query, format, position); + GST_DEBUG_OBJECT (pad, + "Returning position %" G_GINT64_FORMAT " in format %s", position, + gst_format_get_name (format)); + } else { + GST_DEBUG_OBJECT (pad, "Position query failed"); + } + break; + } + case GST_QUERY_DURATION:{ + GstFormat format; + gint64 duration; + + gst_query_parse_duration (query, &format, NULL); + switch (format) { + case GST_FORMAT_TIME:{ + g_mutex_lock (self->lock); + duration = self->segment.stop; + g_mutex_unlock (self->lock); + ret = TRUE; + break; + } + case GST_FORMAT_DEFAULT:{ + g_mutex_lock (self->lock); + duration = self->segment.stop; + if (duration != -1) + duration = + gst_util_uint64_scale (duration, self->fps_n, + GST_SECOND * self->fps_d); + g_mutex_unlock (self->lock); + ret = TRUE; + break; + } + default: + break; + } + + if (ret) { + gst_query_set_duration (query, format, duration); + GST_DEBUG_OBJECT (pad, + "Returning duration %" G_GINT64_FORMAT " in format %s", duration, + gst_format_get_name (format)); + } else { + GST_DEBUG_OBJECT (pad, "Duration query failed"); + } + break; + } + case GST_QUERY_SEEKING:{ + GstFormat format; + gboolean seekable; + + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + seekable = (format == GST_FORMAT_TIME || format == GST_FORMAT_DEFAULT); + + gst_query_set_seeking (query, format, seekable, (seekable ? 0 : -1), -1); + ret = TRUE; + break; + } + default: + ret = FALSE; + break; + } + + gst_object_unref (self); + return ret; +} + + +static gboolean +gst_image_freeze_sink_event (GstPad * pad, GstEvent * event) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); + gboolean ret; + + GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + if (!self->buffer) { + /* if we receive EOS before a buffer arrives, then let it pass */ + GST_DEBUG_OBJECT (self, "EOS without input buffer, passing on"); + ret = gst_pad_push_event (self->srcpad, event); + break; + } + /* fall-through */ + case GST_EVENT_NEWSEGMENT: + GST_DEBUG_OBJECT (pad, "Dropping event"); + gst_event_unref (event); + ret = TRUE; + break; + case GST_EVENT_FLUSH_START: + gst_image_freeze_reset (self); + /* fall through */ + default: + ret = gst_pad_push_event (self->srcpad, event); + break; + } + + gst_object_unref (self); + return ret; +} + +static gboolean +gst_image_freeze_src_event (GstPad * pad, GstEvent * event) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); + gboolean ret; + + GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NAVIGATION: + case GST_EVENT_QOS: + case GST_EVENT_LATENCY: + case GST_EVENT_STEP: + GST_DEBUG_OBJECT (pad, "Dropping event"); + gst_event_unref (event); + ret = TRUE; + break; + case GST_EVENT_SEEK:{ + gdouble rate; + GstFormat format; + GstSeekFlags flags; + GstSeekType start_type, stop_type; + gint64 start, stop; + gint64 last_stop; + gboolean start_task; + gboolean flush; + + gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, + &stop_type, &stop); + gst_event_unref (event); + + flush = ! !(flags & GST_SEEK_FLAG_FLUSH); + + if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT) { + GST_ERROR_OBJECT (pad, "Seek in invalid format: %s", + gst_format_get_name (format)); + ret = FALSE; + break; + } + + if (format == GST_FORMAT_DEFAULT) { + format = GST_FORMAT_TIME; + if (!gst_image_freeze_convert (self, GST_FORMAT_DEFAULT, start, &format, + &start) + || !gst_image_freeze_convert (self, GST_FORMAT_DEFAULT, stop, + &format, &stop) + || start == -1 || stop == -1) { + GST_ERROR_OBJECT (pad, + "Failed to convert seek from DEFAULT format into TIME format"); + ret = FALSE; + break; + } + } + + if (flush) { + GstEvent *e; + + g_atomic_int_set (&self->seeking, 1); + e = gst_event_new_flush_start (); + gst_pad_push_event (self->srcpad, e); + } else { + gst_pad_pause_task (self->srcpad); + } + + GST_PAD_STREAM_LOCK (self->srcpad); + + g_mutex_lock (self->lock); + gst_event_replace (&self->close_segment, NULL); + if (!flush) { + if (!self->need_segment && self->segment.rate >= 0) { + self->close_segment = + gst_event_new_new_segment_full (TRUE, self->segment.rate, + self->segment.applied_rate, self->segment.format, + self->segment.start, self->segment.last_stop, self->segment.time); + } else if (!self->need_segment) { + gint64 stop; + + if ((stop = self->segment.stop) == -1) + stop = self->segment.duration; + + self->close_segment = + gst_event_new_new_segment_full (TRUE, self->segment.rate, + self->segment.applied_rate, self->segment.format, + self->segment.last_stop, stop, self->segment.last_stop); + } + } + + gst_segment_set_seek (&self->segment, rate, format, flags, start_type, + start, stop_type, stop, NULL); + self->need_segment = TRUE; + last_stop = self->segment.last_stop; + + start_task = self->buffer != NULL; + g_mutex_unlock (self->lock); + + if (flush) { + GstEvent *e; + + e = gst_event_new_flush_stop (); + gst_pad_push_event (self->srcpad, e); + g_atomic_int_set (&self->seeking, 0); + } + + if (flags & GST_SEEK_FLAG_SEGMENT) { + GstMessage *m; + + m = gst_message_new_segment_start (GST_OBJECT (self), + format, last_stop); + gst_element_post_message (GST_ELEMENT (self), m); + } + + GST_PAD_STREAM_UNLOCK (self->srcpad); + + GST_DEBUG_OBJECT (pad, "Seek successful"); + + if (start_task) { + g_mutex_lock (self->lock); + + if (self->buffer != NULL) + gst_pad_start_task (self->srcpad, + (GstTaskFunction) gst_image_freeze_src_loop, self->srcpad); + + g_mutex_unlock (self->lock); + } + + ret = TRUE; + break; + } + case GST_EVENT_FLUSH_START: + gst_image_freeze_reset (self); + /* fall through */ + default: + ret = gst_pad_push_event (self->sinkpad, event); + break; + } + + gst_object_unref (self); + return ret; +} + +static GstFlowReturn +gst_image_freeze_sink_chain (GstPad * pad, GstBuffer * buffer) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (GST_PAD_PARENT (pad)); + + g_mutex_lock (self->lock); + if (self->buffer) { + GST_DEBUG_OBJECT (pad, "Already have a buffer, dropping"); + gst_buffer_unref (buffer); + g_mutex_unlock (self->lock); + return GST_FLOW_UNEXPECTED; + } + + self->buffer = buffer; + + gst_pad_start_task (self->srcpad, (GstTaskFunction) gst_image_freeze_src_loop, + self->srcpad); + g_mutex_unlock (self->lock); + return GST_FLOW_OK; +} + +static void +gst_image_freeze_src_loop (GstPad * pad) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (GST_PAD_PARENT (pad)); + GstBuffer *buffer; + guint64 offset; + GstClockTime timestamp, timestamp_end; + gint64 cstart, cstop; + gboolean in_seg, eos; + + g_mutex_lock (self->lock); + if (!self->buffer) { + GST_ERROR_OBJECT (pad, "Have no buffer yet"); + g_mutex_unlock (self->lock); + gst_pad_pause_task (self->srcpad); + return; + } + buffer = gst_buffer_ref (self->buffer); + buffer = gst_buffer_make_metadata_writable (buffer); + g_mutex_unlock (self->lock); + + if (self->close_segment) { + GST_DEBUG_OBJECT (pad, "Closing previous segment"); + gst_pad_push_event (self->srcpad, self->close_segment); + self->close_segment = NULL; + } + + if (self->need_segment) { + GstEvent *e; + + GST_DEBUG_OBJECT (pad, "Pushing NEWSEGMENT event: %" GST_SEGMENT_FORMAT, + &self->segment); + e = gst_event_new_new_segment_full (FALSE, self->segment.rate, + self->segment.applied_rate, self->segment.format, self->segment.start, + self->segment.stop, self->segment.start); + + g_mutex_lock (self->lock); + if (self->segment.rate >= 0) { + self->offset = + gst_util_uint64_scale (self->segment.start, self->fps_n, + self->fps_d * GST_SECOND); + } else { + self->offset = + gst_util_uint64_scale (self->segment.stop, self->fps_n, + self->fps_d * GST_SECOND); + } + g_mutex_unlock (self->lock); + + self->need_segment = FALSE; + + gst_pad_push_event (self->srcpad, e); + } + + g_mutex_lock (self->lock); + offset = self->offset; + + if (self->fps_n != 0) { + timestamp = + gst_util_uint64_scale (offset, self->fps_d * GST_SECOND, self->fps_n); + timestamp_end = + gst_util_uint64_scale (offset + 1, self->fps_d * GST_SECOND, + self->fps_n); + } else { + timestamp = self->segment.start; + timestamp_end = GST_CLOCK_TIME_NONE; + } + + eos = (self->fps_n == 0 && offset > 0) || + (self->segment.rate >= 0 && self->segment.stop != -1 + && timestamp > self->segment.stop) || (self->segment.rate < 0 + && offset == 0) || (self->segment.rate < 0 + && self->segment.start != -1 && timestamp_end < self->segment.start); + + if (self->fps_n == 0 && offset > 0) + in_seg = FALSE; + else + in_seg = + gst_segment_clip (&self->segment, GST_FORMAT_TIME, timestamp, + timestamp_end, &cstart, &cstop); + + if (in_seg) + gst_segment_set_last_stop (&self->segment, GST_FORMAT_TIME, cstart); + + if (self->segment.rate >= 0) + self->offset++; + else + self->offset--; + g_mutex_unlock (self->lock); + + GST_DEBUG_OBJECT (pad, "Handling buffer with timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (in_seg) { + GstFlowReturn ret; + + GST_BUFFER_TIMESTAMP (buffer) = cstart; + GST_BUFFER_DURATION (buffer) = cstop - cstart; + GST_BUFFER_OFFSET (buffer) = offset; + GST_BUFFER_OFFSET_END (buffer) = offset + 1; + gst_buffer_set_caps (buffer, GST_PAD_CAPS (self->srcpad)); + ret = gst_pad_push (self->srcpad, buffer); + GST_DEBUG_OBJECT (pad, "Pushing buffer resulted in %s", + gst_flow_get_name (ret)); + if (ret != GST_FLOW_OK) + gst_pad_pause_task (self->srcpad); + } else { + gst_buffer_unref (buffer); + } + + if (eos) { + if ((self->segment.flags & GST_SEEK_FLAG_SEGMENT)) { + GstMessage *m; + + GST_DEBUG_OBJECT (pad, "Sending segment done at end of segment"); + if (self->segment.rate >= 0) + m = gst_message_new_segment_done (GST_OBJECT_CAST (self), + GST_FORMAT_TIME, self->segment.stop); + else + m = gst_message_new_segment_done (GST_OBJECT_CAST (self), + GST_FORMAT_TIME, self->segment.start); + gst_element_post_message (GST_ELEMENT_CAST (self), m); + } else { + GST_DEBUG_OBJECT (pad, "Sending EOS at end of segment"); + gst_pad_push_event (self->srcpad, gst_event_new_eos ()); + } + gst_pad_pause_task (self->srcpad); + } +} + +static GstStateChangeReturn +gst_image_freeze_change_state (GstElement * element, GstStateChange transition) +{ + GstImageFreeze *self = GST_IMAGE_FREEZE (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_image_freeze_reset (self); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_pad_stop_task (self->srcpad); + gst_image_freeze_reset (self); + break; + default: + break; + } + + if (GST_ELEMENT_CLASS (parent_class)->change_state) + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + default: + break; + } + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_image_freeze_debug, "imagefreeze", 0, + "imagefreeze element"); + + if (!gst_element_register (plugin, "imagefreeze", GST_RANK_NONE, + GST_TYPE_IMAGE_FREEZE)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "imagefreeze", + "Still frame stream generator", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/imagefreeze/gstimagefreeze.h b/gst/imagefreeze/gstimagefreeze.h new file mode 100644 index 0000000..d5b1449 --- /dev/null +++ b/gst/imagefreeze/gstimagefreeze.h @@ -0,0 +1,74 @@ +/* GStreamer + * Copyright (C) 2010 Sebastian Dröge + * + * 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_IMAGE_FREEZE_H__ +#define __GST_IMAGE_FREEZE_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_IMAGE_FREEZE \ + (gst_image_freeze_get_type()) +#define GST_IMAGE_FREEZE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IMAGE_FREEZE,GstImageFreeze)) +#define GST_IMAGE_FREEZE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IMAGE_FREEZE,GstImageFreezeClass)) +#define GST_IMAGE_FREEZE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_IMAGE_FREEZE,GstImageFreezeClass)) +#define GST_IS_IMAGE_FREEZE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IMAGE_FREEZE)) +#define GST_IS_IMAGE_FREEZE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IMAGE_FREEZE)) + +typedef struct _GstImageFreeze GstImageFreeze; +typedef struct _GstImageFreezeClass GstImageFreezeClass; + +struct _GstImageFreeze +{ + GstElement parent; + + /* < private > */ + GstPad *sinkpad; + GstPad *srcpad; + + GMutex *lock; + GstBuffer *buffer; + gint fps_n, fps_d; + + GstSegment segment; + gboolean need_segment; + GstEvent *close_segment; + + guint64 offset; + + /* TRUE if currently doing a flushing seek, protected + * by srcpad's stream lock */ + gint seeking; +}; + +struct _GstImageFreezeClass +{ + GstElementClass parent_class; +}; + +GType gst_image_freeze_get_type (void); + +G_END_DECLS + +#endif /* __GST_IMAGE_FREEZE_H__ */ diff --git a/gst/interleave/Makefile.am b/gst/interleave/Makefile.am new file mode 100644 index 0000000..0a2d2d8 --- /dev/null +++ b/gst/interleave/Makefile.am @@ -0,0 +1,24 @@ + +plugin_LTLIBRARIES = libgstinterleave.la + +libgstinterleave_la_SOURCES = plugin.c interleave.c deinterleave.c +libgstinterleave_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstinterleave_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) +libgstinterleave_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstinterleave_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = plugin.h interleave.h deinterleave.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstinterleave -:SHARED libgstinterleave \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstinterleave_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstinterleave_la_CFLAGS) \ + -:LDFLAGS $(libgstinterleave_la_LDFLAGS) \ + $(libgstinterleave_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/interleave/Makefile.in b/gst/interleave/Makefile.in new file mode 100644 index 0000000..fcd6846 --- /dev/null +++ b/gst/interleave/Makefile.in @@ -0,0 +1,837 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/interleave +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstinterleave_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstinterleave_la_OBJECTS = libgstinterleave_la-plugin.lo \ + libgstinterleave_la-interleave.lo \ + libgstinterleave_la-deinterleave.lo +libgstinterleave_la_OBJECTS = $(am_libgstinterleave_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstinterleave_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstinterleave_la_CFLAGS) $(CFLAGS) \ + $(libgstinterleave_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstinterleave_la_SOURCES) +DIST_SOURCES = $(libgstinterleave_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstinterleave.la +libgstinterleave_la_SOURCES = plugin.c interleave.c deinterleave.c +libgstinterleave_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstinterleave_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) +libgstinterleave_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstinterleave_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = plugin.h interleave.h deinterleave.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/interleave/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/interleave/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstinterleave.la: $(libgstinterleave_la_OBJECTS) $(libgstinterleave_la_DEPENDENCIES) $(EXTRA_libgstinterleave_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstinterleave_la_LINK) -rpath $(plugindir) $(libgstinterleave_la_OBJECTS) $(libgstinterleave_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterleave_la-deinterleave.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterleave_la-interleave.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterleave_la-plugin.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstinterleave_la-plugin.lo: plugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -MT libgstinterleave_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstinterleave_la-plugin.Tpo -c -o libgstinterleave_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterleave_la-plugin.Tpo $(DEPDIR)/libgstinterleave_la-plugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstinterleave_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -c -o libgstinterleave_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c + +libgstinterleave_la-interleave.lo: interleave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -MT libgstinterleave_la-interleave.lo -MD -MP -MF $(DEPDIR)/libgstinterleave_la-interleave.Tpo -c -o libgstinterleave_la-interleave.lo `test -f 'interleave.c' || echo '$(srcdir)/'`interleave.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterleave_la-interleave.Tpo $(DEPDIR)/libgstinterleave_la-interleave.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interleave.c' object='libgstinterleave_la-interleave.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -c -o libgstinterleave_la-interleave.lo `test -f 'interleave.c' || echo '$(srcdir)/'`interleave.c + +libgstinterleave_la-deinterleave.lo: deinterleave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -MT libgstinterleave_la-deinterleave.lo -MD -MP -MF $(DEPDIR)/libgstinterleave_la-deinterleave.Tpo -c -o libgstinterleave_la-deinterleave.lo `test -f 'deinterleave.c' || echo '$(srcdir)/'`deinterleave.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterleave_la-deinterleave.Tpo $(DEPDIR)/libgstinterleave_la-deinterleave.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='deinterleave.c' object='libgstinterleave_la-deinterleave.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -c -o libgstinterleave_la-deinterleave.lo `test -f 'deinterleave.c' || echo '$(srcdir)/'`deinterleave.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstinterleave -:SHARED libgstinterleave \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstinterleave_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstinterleave_la_CFLAGS) \ + -:LDFLAGS $(libgstinterleave_la_LDFLAGS) \ + $(libgstinterleave_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/interleave/deinterleave.c b/gst/interleave/deinterleave.c new file mode 100644 index 0000000..ad88c4e --- /dev/null +++ b/gst/interleave/deinterleave.c @@ -0,0 +1,889 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2005 Wim Taymans + * 2007 Andy Wingo + * 2008 Sebastian Dröge + * + * deinterleave.c: deinterleave samples + * + * 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. + */ + +/* TODO: + * - handle changes in number of channels + * - handle changes in channel positions + * - better capsnego by using a buffer alloc function + * and passing downstream caps changes upstream there + */ + +/** + * SECTION:element-deinterleave + * @see_also: interleave + * + * Splits one interleaved multichannel audio stream into many mono audio streams. + * + * This element handles all raw audio formats and supports changing the input caps as long as + * all downstream elements can handle the new caps and the number of channels and the channel + * positions stay the same. This restriction will be removed in later versions by adding or + * removing some source pads as required. + * + * In most cases a queue and an audioconvert element should be added after each source pad + * before further processing of the audio data. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=/path/to/file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2 ! deinterleave name=d d.src0 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel1.ogg d.src1 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel2.ogg + * ]| Decodes an MP3 file and encodes the left and right channel into separate + * Ogg Vorbis files. + * |[ + * gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2" ! deinterleave name=d interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav d.src0 ! queue ! audioconvert ! i.sink1 d.src1 ! queue ! audioconvert ! i.sink0 + * ]| Decodes and deinterleaves a Stereo MP3 file into separate channels and + * then interleaves the channels again to a WAV file with the channel with the + * channels exchanged. + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include "deinterleave.h" + +GST_DEBUG_CATEGORY_STATIC (gst_deinterleave_debug); +#define GST_CAT_DEFAULT gst_deinterleave_debug + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) 1, " + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " + "width = (int) { 8, 16, 24, 32 }, " + "depth = (int) [ 1, 32 ], " + "signed = (boolean) { true, false }; " + "audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) 1, " + "endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " + "width = (int) { 32, 64 }") + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " + "width = (int) { 8, 16, 24, 32 }, " + "depth = (int) [ 1, 32 ], " + "signed = (boolean) { true, false }; " + "audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " + "width = (int) { 32, 64 }") + ); + +#define MAKE_FUNC(type) \ +static void deinterleave_##type (guint##type *out, guint##type *in, \ + guint stride, guint nframes) \ +{ \ + gint i; \ + \ + for (i = 0; i < nframes; i++) { \ + out[i] = *in; \ + in += stride; \ + } \ +} + +MAKE_FUNC (8); +MAKE_FUNC (16); +MAKE_FUNC (32); +MAKE_FUNC (64); + +static void +deinterleave_24 (guint8 * out, guint8 * in, guint stride, guint nframes) +{ + gint i; + + for (i = 0; i < nframes; i++) { + memcpy (out, in, 3); + out += 3; + in += stride * 3; + } +} + +GST_BOILERPLATE (GstDeinterleave, gst_deinterleave, GstElement, + GST_TYPE_ELEMENT); + +enum +{ + PROP_0, + PROP_KEEP_POSITIONS +}; + +static GstFlowReturn gst_deinterleave_chain (GstPad * pad, GstBuffer * buffer); + +static gboolean gst_deinterleave_sink_setcaps (GstPad * pad, GstCaps * caps); + +static GstCaps *gst_deinterleave_sink_getcaps (GstPad * pad); + +static gboolean gst_deinterleave_sink_activate_push (GstPad * pad, + gboolean active); +static gboolean gst_deinterleave_sink_event (GstPad * pad, GstEvent * event); + +static gboolean gst_deinterleave_src_query (GstPad * pad, GstQuery * query); + +static void gst_deinterleave_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_deinterleave_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + + +static void +gst_deinterleave_finalize (GObject * obj) +{ + GstDeinterleave *self = GST_DEINTERLEAVE (obj); + + if (self->pos) { + g_free (self->pos); + self->pos = NULL; + } + + if (self->pending_events) { + g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref, NULL); + g_list_free (self->pending_events); + self->pending_events = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_deinterleave_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = (GstElementClass *) g_class; + + gst_element_class_set_details_simple (gstelement_class, "Audio deinterleaver", + "Filter/Converter/Audio", + "Splits one interleaved multichannel audio stream into many mono audio streams", + "Andy Wingo , " + "Iain , " + "Sebastian Dröge "); + + gst_element_class_add_static_pad_template (gstelement_class, + &sink_template); + gst_element_class_add_static_pad_template (gstelement_class, + &src_template); +} + +static void +gst_deinterleave_class_init (GstDeinterleaveClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + GST_DEBUG_CATEGORY_INIT (gst_deinterleave_debug, "deinterleave", 0, + "deinterleave element"); + + gobject_class->finalize = gst_deinterleave_finalize; + gobject_class->set_property = gst_deinterleave_set_property; + gobject_class->get_property = gst_deinterleave_get_property; + + /** + * GstDeinterleave:keep-positions + * + * Keep positions: When enable the caps on the output buffers will + * contain the original channel positions. This can be used to correctly + * interleave the output again later but can also lead to unwanted effects + * if the output should be handled as Mono. + * + */ + g_object_class_install_property (gobject_class, PROP_KEEP_POSITIONS, + g_param_spec_boolean ("keep-positions", "Keep positions", + "Keep the original channel positions on the output buffers", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_deinterleave_init (GstDeinterleave * self, GstDeinterleaveClass * klass) +{ + self->channels = 0; + self->pos = NULL; + self->keep_positions = FALSE; + self->width = 0; + self->func = NULL; + + /* Add sink pad */ + self->sink = gst_pad_new_from_static_template (&sink_template, "sink"); + gst_pad_set_chain_function (self->sink, + GST_DEBUG_FUNCPTR (gst_deinterleave_chain)); + gst_pad_set_setcaps_function (self->sink, + GST_DEBUG_FUNCPTR (gst_deinterleave_sink_setcaps)); + gst_pad_set_getcaps_function (self->sink, + GST_DEBUG_FUNCPTR (gst_deinterleave_sink_getcaps)); + gst_pad_set_activatepush_function (self->sink, + GST_DEBUG_FUNCPTR (gst_deinterleave_sink_activate_push)); + gst_pad_set_event_function (self->sink, + GST_DEBUG_FUNCPTR (gst_deinterleave_sink_event)); + gst_element_add_pad (GST_ELEMENT (self), self->sink); +} + +static void +gst_deinterleave_add_new_pads (GstDeinterleave * self, GstCaps * caps) +{ + GstPad *pad; + + guint i; + + for (i = 0; i < self->channels; i++) { + gchar *name = g_strdup_printf ("src%d", i); + + GstCaps *srccaps; + + GstStructure *s; + + pad = gst_pad_new_from_static_template (&src_template, name); + g_free (name); + + /* Set channel position if we know it */ + if (self->keep_positions) { + GstAudioChannelPosition pos[1] = { GST_AUDIO_CHANNEL_POSITION_NONE }; + + srccaps = gst_caps_copy (caps); + s = gst_caps_get_structure (srccaps, 0); + if (self->pos) + gst_audio_set_channel_positions (s, &self->pos[i]); + else + gst_audio_set_channel_positions (s, pos); + } else { + srccaps = caps; + } + + gst_pad_set_caps (pad, srccaps); + gst_pad_use_fixed_caps (pad); + gst_pad_set_query_function (pad, + GST_DEBUG_FUNCPTR (gst_deinterleave_src_query)); + gst_pad_set_active (pad, TRUE); + gst_element_add_pad (GST_ELEMENT (self), pad); + self->srcpads = g_list_prepend (self->srcpads, gst_object_ref (pad)); + + if (self->keep_positions) + gst_caps_unref (srccaps); + } + + gst_element_no_more_pads (GST_ELEMENT (self)); + self->srcpads = g_list_reverse (self->srcpads); +} + +static void +gst_deinterleave_set_pads_caps (GstDeinterleave * self, GstCaps * caps) +{ + GList *l; + + GstStructure *s; + + gint i; + + for (l = self->srcpads, i = 0; l; l = l->next, i++) { + GstPad *pad = GST_PAD (l->data); + + GstCaps *srccaps; + + /* Set channel position if we know it */ + if (self->keep_positions) { + GstAudioChannelPosition pos[1] = { GST_AUDIO_CHANNEL_POSITION_NONE }; + + srccaps = gst_caps_copy (caps); + s = gst_caps_get_structure (srccaps, 0); + if (self->pos) + gst_audio_set_channel_positions (s, &self->pos[i]); + else + gst_audio_set_channel_positions (s, pos); + } else { + srccaps = caps; + } + + gst_pad_set_caps (pad, srccaps); + + if (self->keep_positions) + gst_caps_unref (srccaps); + } +} + +static void +gst_deinterleave_remove_pads (GstDeinterleave * self) +{ + GList *l; + + GST_INFO_OBJECT (self, "removing pads"); + + for (l = self->srcpads; l; l = l->next) { + GstPad *pad = GST_PAD (l->data); + + gst_element_remove_pad (GST_ELEMENT_CAST (self), pad); + gst_object_unref (pad); + } + g_list_free (self->srcpads); + self->srcpads = NULL; + + gst_pad_set_caps (self->sink, NULL); + gst_caps_replace (&self->sinkcaps, NULL); +} + +static gboolean +gst_deinterleave_set_process_function (GstDeinterleave * self, GstCaps * caps) +{ + GstStructure *s; + + s = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (s, "width", &self->width)) + return FALSE; + + switch (self->width) { + case 8: + self->func = (GstDeinterleaveFunc) deinterleave_8; + break; + case 16: + self->func = (GstDeinterleaveFunc) deinterleave_16; + break; + case 24: + self->func = (GstDeinterleaveFunc) deinterleave_24; + break; + case 32: + self->func = (GstDeinterleaveFunc) deinterleave_32; + break; + case 64: + self->func = (GstDeinterleaveFunc) deinterleave_64; + break; + default: + return FALSE; + } + return TRUE; +} + +static gboolean +gst_deinterleave_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstDeinterleave *self; + + GstCaps *srccaps; + + GstStructure *s; + + self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (self, "got caps: %" GST_PTR_FORMAT, caps); + + if (self->sinkcaps && !gst_caps_is_equal (caps, self->sinkcaps)) { + gint new_channels, i; + + GstAudioChannelPosition *pos; + + gboolean same_layout = TRUE; + + s = gst_caps_get_structure (caps, 0); + + /* We allow caps changes as long as the number of channels doesn't change + * and the channel positions stay the same. _getcaps() should've cared + * for this already but better be safe. + */ + if (!gst_structure_get_int (s, "channels", &new_channels) || + new_channels != self->channels || + !gst_deinterleave_set_process_function (self, caps)) + goto cannot_change_caps; + + /* Now check the channel positions. If we had no channel positions + * and get them or the other way around things have changed. + * If we had channel positions and get different ones things have + * changed too of course + */ + pos = gst_audio_get_channel_positions (s); + if ((pos && !self->pos) || (!pos && self->pos)) + goto cannot_change_caps; + + if (pos) { + for (i = 0; i < self->channels; i++) { + if (self->pos[i] != pos[i]) { + same_layout = FALSE; + break; + } + } + g_free (pos); + if (!same_layout) + goto cannot_change_caps; + } + + } else { + s = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (s, "channels", &self->channels)) + goto no_channels; + + if (!gst_deinterleave_set_process_function (self, caps)) + goto unsupported_caps; + + self->pos = gst_audio_get_channel_positions (s); + } + + gst_caps_replace (&self->sinkcaps, caps); + + /* Get srcpad caps */ + srccaps = gst_caps_copy (caps); + s = gst_caps_get_structure (srccaps, 0); + gst_structure_set (s, "channels", G_TYPE_INT, 1, NULL); + gst_structure_remove_field (s, "channel-positions"); + + /* If we already have pads, update the caps otherwise + * add new pads */ + if (self->srcpads) { + gst_deinterleave_set_pads_caps (self, srccaps); + } else { + gst_deinterleave_add_new_pads (self, srccaps); + } + + gst_caps_unref (srccaps); + gst_object_unref (self); + + return TRUE; + +cannot_change_caps: + { + GST_ERROR_OBJECT (self, "can't set new caps: %" GST_PTR_FORMAT, caps); + gst_object_unref (self); + return FALSE; + } +unsupported_caps: + { + GST_ERROR_OBJECT (self, "caps not supported: %" GST_PTR_FORMAT, caps); + gst_object_unref (self); + return FALSE; + } +no_channels: + { + GST_ERROR_OBJECT (self, "invalid caps"); + gst_object_unref (self); + return FALSE; + } +} + +static void +__remove_channels (GstCaps * caps) +{ + GstStructure *s; + + gint i, size; + + size = gst_caps_get_size (caps); + for (i = 0; i < size; i++) { + s = gst_caps_get_structure (caps, i); + gst_structure_remove_field (s, "channel-positions"); + gst_structure_remove_field (s, "channels"); + } +} + +static void +__set_channels (GstCaps * caps, gint channels) +{ + GstStructure *s; + + gint i, size; + + size = gst_caps_get_size (caps); + for (i = 0; i < size; i++) { + s = gst_caps_get_structure (caps, i); + if (channels > 0) + gst_structure_set (s, "channels", G_TYPE_INT, channels, NULL); + else + gst_structure_set (s, "channels", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); + } +} + +static GstCaps * +gst_deinterleave_sink_getcaps (GstPad * pad) +{ + GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); + + GstCaps *ret; + + GList *l; + + GST_OBJECT_LOCK (self); + /* Intersect all of our pad template caps with the peer caps of the pad + * to get all formats that are possible up- and downstream. + * + * For the pad for which the caps are requested we don't remove the channel + * informations as they must be in the returned caps and incompatibilities + * will be detected here already + */ + ret = gst_caps_new_any (); + for (l = GST_ELEMENT (self)->pads; l != NULL; l = l->next) { + GstPad *ourpad = GST_PAD (l->data); + + GstCaps *peercaps = NULL, *ourcaps; + + ourcaps = gst_caps_copy (gst_pad_get_pad_template_caps (ourpad)); + + if (pad == ourpad) { + if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) + __set_channels (ourcaps, self->channels); + else + __set_channels (ourcaps, 1); + } else { + __remove_channels (ourcaps); + /* Only ask for peer caps for other pads than pad + * as otherwise gst_pad_peer_get_caps() might call + * back into this function and deadlock + */ + peercaps = gst_pad_peer_get_caps (ourpad); + } + + /* If the peer exists and has caps add them to the intersection, + * otherwise assume that the peer accepts everything */ + if (peercaps) { + GstCaps *intersection; + + GstCaps *oldret = ret; + + __remove_channels (peercaps); + + intersection = gst_caps_intersect (peercaps, ourcaps); + + ret = gst_caps_intersect (ret, intersection); + gst_caps_unref (intersection); + gst_caps_unref (peercaps); + gst_caps_unref (oldret); + } else { + GstCaps *oldret = ret; + + ret = gst_caps_intersect (ret, ourcaps); + gst_caps_unref (oldret); + } + gst_caps_unref (ourcaps); + } + GST_OBJECT_UNLOCK (self); + + gst_object_unref (self); + + GST_DEBUG_OBJECT (pad, "Intersected caps to %" GST_PTR_FORMAT, ret); + + return ret; +} + +static gboolean +gst_deinterleave_sink_event (GstPad * pad, GstEvent * event) +{ + GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); + + gboolean ret; + + GST_DEBUG ("Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event), + GST_DEBUG_PAD_NAME (pad)); + + /* Send FLUSH_STOP, FLUSH_START and EOS immediately, no matter if + * we have src pads already or not. Queue all other events and + * push them after we have src pads + */ + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + case GST_EVENT_FLUSH_START: + case GST_EVENT_EOS: + ret = gst_pad_event_default (pad, event); + break; + default: + if (self->srcpads) { + ret = gst_pad_event_default (pad, event); + } else { + GST_OBJECT_LOCK (self); + self->pending_events = g_list_append (self->pending_events, event); + GST_OBJECT_UNLOCK (self); + ret = TRUE; + } + break; + } + + gst_object_unref (self); + + return ret; +} + +static gboolean +gst_deinterleave_src_query (GstPad * pad, GstQuery * query) +{ + GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); + + gboolean res; + + res = gst_pad_query_default (pad, query); + + if (res && GST_QUERY_TYPE (query) == GST_QUERY_DURATION) { + GstFormat format; + + gint64 dur; + + gst_query_parse_duration (query, &format, &dur); + + /* Need to divide by the number of channels in byte format + * to get the correct value. All other formats should be fine + */ + if (format == GST_FORMAT_BYTES && dur != -1) + gst_query_set_duration (query, format, dur / self->channels); + } else if (res && GST_QUERY_TYPE (query) == GST_QUERY_POSITION) { + GstFormat format; + + gint64 pos; + + gst_query_parse_position (query, &format, &pos); + + /* Need to divide by the number of channels in byte format + * to get the correct value. All other formats should be fine + */ + if (format == GST_FORMAT_BYTES && pos != -1) + gst_query_set_position (query, format, pos / self->channels); + } + + gst_object_unref (self); + return res; +} + +static void +gst_deinterleave_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstDeinterleave *self = GST_DEINTERLEAVE (object); + + switch (prop_id) { + case PROP_KEEP_POSITIONS: + self->keep_positions = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_deinterleave_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstDeinterleave *self = GST_DEINTERLEAVE (object); + + switch (prop_id) { + case PROP_KEEP_POSITIONS: + g_value_set_boolean (value, self->keep_positions); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstFlowReturn +gst_deinterleave_process (GstDeinterleave * self, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + + guint channels = self->channels; + + guint pads_pushed = 0, buffers_allocated = 0; + + guint nframes = GST_BUFFER_SIZE (buf) / channels / (self->width / 8); + + guint bufsize = nframes * (self->width / 8); + + guint i; + + GList *srcs; + + GstBuffer **buffers_out = g_new0 (GstBuffer *, channels); + + guint8 *in, *out; + + /* Send any pending events to all src pads */ + GST_OBJECT_LOCK (self); + if (self->pending_events) { + GList *events; + + GstEvent *event; + + GST_DEBUG_OBJECT (self, "Sending pending events to all src pads"); + + for (events = self->pending_events; events != NULL; events = events->next) { + event = GST_EVENT (events->data); + + for (srcs = self->srcpads; srcs != NULL; srcs = srcs->next) + gst_pad_push_event (GST_PAD (srcs->data), gst_event_ref (event)); + gst_event_unref (event); + } + + g_list_free (self->pending_events); + self->pending_events = NULL; + } + GST_OBJECT_UNLOCK (self); + + /* Allocate buffers */ + for (srcs = self->srcpads, i = 0; srcs; srcs = srcs->next, i++) { + GstPad *pad = (GstPad *) srcs->data; + + buffers_out[i] = NULL; + ret = + gst_pad_alloc_buffer (pad, GST_BUFFER_OFFSET_NONE, bufsize, + GST_PAD_CAPS (pad), &buffers_out[i]); + + /* Make sure we got a correct buffer. The only other case we allow + * here is an unliked pad */ + if (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED) + goto alloc_buffer_failed; + else if (buffers_out[i] && GST_BUFFER_SIZE (buffers_out[i]) != bufsize) + goto alloc_buffer_bad_size; + else if (buffers_out[i] && + !gst_caps_is_equal (GST_BUFFER_CAPS (buffers_out[i]), + GST_PAD_CAPS (pad))) + goto invalid_caps; + + if (buffers_out[i]) { + gst_buffer_copy_metadata (buffers_out[i], buf, + GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS); + buffers_allocated++; + } + } + + /* Return NOT_LINKED if no pad was linked */ + if (!buffers_allocated) { + GST_WARNING_OBJECT (self, + "Couldn't allocate any buffers because no pad was linked"); + ret = GST_FLOW_NOT_LINKED; + goto done; + } + + /* deinterleave */ + for (srcs = self->srcpads, i = 0; srcs; srcs = srcs->next, i++) { + GstPad *pad = (GstPad *) srcs->data; + + in = (guint8 *) GST_BUFFER_DATA (buf); + in += i * (self->width / 8); + if (buffers_out[i]) { + out = (guint8 *) GST_BUFFER_DATA (buffers_out[i]); + + self->func (out, in, channels, nframes); + + ret = gst_pad_push (pad, buffers_out[i]); + buffers_out[i] = NULL; + if (ret == GST_FLOW_OK) + pads_pushed++; + else if (ret == GST_FLOW_NOT_LINKED) + ret = GST_FLOW_OK; + else + goto push_failed; + } + } + + /* Return NOT_LINKED if no pad was linked */ + if (!pads_pushed) + ret = GST_FLOW_NOT_LINKED; + +done: + gst_buffer_unref (buf); + g_free (buffers_out); + return ret; + +alloc_buffer_failed: + { + GST_WARNING ("gst_pad_alloc_buffer() returned %s", gst_flow_get_name (ret)); + goto clean_buffers; + + } +alloc_buffer_bad_size: + { + GST_WARNING ("called alloc_buffer(), but didn't get requested bytes"); + ret = GST_FLOW_NOT_NEGOTIATED; + goto clean_buffers; + } +invalid_caps: + { + GST_WARNING ("called alloc_buffer(), but didn't get requested caps"); + ret = GST_FLOW_NOT_NEGOTIATED; + goto clean_buffers; + } +push_failed: + { + GST_DEBUG ("push() failed, flow = %s", gst_flow_get_name (ret)); + goto clean_buffers; + } +clean_buffers: + { + for (i = 0; i < channels; i++) { + if (buffers_out[i]) + gst_buffer_unref (buffers_out[i]); + } + gst_buffer_unref (buf); + g_free (buffers_out); + return ret; + } +} + +static GstFlowReturn +gst_deinterleave_chain (GstPad * pad, GstBuffer * buffer) +{ + GstDeinterleave *self = GST_DEINTERLEAVE (GST_PAD_PARENT (pad)); + + GstFlowReturn ret; + + g_return_val_if_fail (self->func != NULL, GST_FLOW_NOT_NEGOTIATED); + g_return_val_if_fail (self->width > 0, GST_FLOW_NOT_NEGOTIATED); + g_return_val_if_fail (self->channels > 0, GST_FLOW_NOT_NEGOTIATED); + + ret = gst_deinterleave_process (self, buffer); + + if (ret != GST_FLOW_OK) + GST_DEBUG_OBJECT (self, "flow return: %s", gst_flow_get_name (ret)); + + return ret; +} + +static gboolean +gst_deinterleave_sink_activate_push (GstPad * pad, gboolean active) +{ + GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); + + /* Reset everything when the pad is deactivated */ + if (!active) { + gst_deinterleave_remove_pads (self); + if (self->pos) { + g_free (self->pos); + self->pos = NULL; + } + self->channels = 0; + self->width = 0; + self->func = NULL; + + if (self->pending_events) { + g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref, + NULL); + g_list_free (self->pending_events); + self->pending_events = NULL; + } + } + + gst_object_unref (self); + + return TRUE; +} diff --git a/gst/interleave/deinterleave.h b/gst/interleave/deinterleave.h new file mode 100644 index 0000000..fe8ec75 --- /dev/null +++ b/gst/interleave/deinterleave.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2005 Wim Taymans + * 2007 Andy Wingo + * 2008 Sebastian Dröge + * + * deinterleave.c: deinterleave samples + * + * 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 __DEINTERLEAVE_H__ +#define __DEINTERLEAVE_H__ + +G_BEGIN_DECLS + +#include +#include + +#define GST_TYPE_DEINTERLEAVE (gst_deinterleave_get_type()) +#define GST_DEINTERLEAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEINTERLEAVE,GstDeinterleave)) +#define GST_DEINTERLEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEINTERLEAVE,GstDeinterleaveClass)) +#define GST_DEINTERLEAVE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_DEINTERLEAVE,GstDeinterleaveClass)) +#define GST_IS_DEINTERLEAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEINTERLEAVE)) +#define GST_IS_DEINTERLEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEINTERLEAVE)) + +typedef struct _GstDeinterleave GstDeinterleave; +typedef struct _GstDeinterleaveClass GstDeinterleaveClass; + +typedef void (*GstDeinterleaveFunc) (gpointer out, gpointer in, guint stride, guint nframes); + +struct _GstDeinterleave +{ + GstElement element; + + /*< private > */ + GList *srcpads; + GstCaps *sinkcaps; + gint channels; + GstAudioChannelPosition *pos; + gboolean keep_positions; + + GstPad *sink; + + gint width; + GstDeinterleaveFunc func; + + GList *pending_events; +}; + +struct _GstDeinterleaveClass +{ + GstElementClass parent_class; +}; + +GType gst_deinterleave_get_type (void); + +G_END_DECLS + +#endif /* __DEINTERLEAVE_H__ */ diff --git a/gst/interleave/interleave.c b/gst/interleave/interleave.c new file mode 100644 index 0000000..bc672d1 --- /dev/null +++ b/gst/interleave/interleave.c @@ -0,0 +1,1306 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2005 Wim Taymans + * 2007 Andy Wingo + * 2008 Sebastian Dröge + * + * interleave.c: interleave samples, mostly based on adder. + * + * 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. + */ + +/* TODO: + * - handle caps changes + * - handle more queries/events + */ + +/** + * SECTION:element-interleave + * @see_also: deinterleave + * + * Merges separate mono inputs into one interleaved stream. + * + * This element handles all raw floating point sample formats and all signed integer sample formats. The first + * caps on one of the sinkpads will set the caps of the output so usually an audioconvert element should be + * placed before every sinkpad of interleave. + * + * It's possible to change the number of channels while the pipeline is running by adding or removing + * some of the request pads but this will change the caps of the output buffers. Changing the input + * caps is _not_ supported yet. + * + * The channel number of every sinkpad in the out can be retrieved from the "channel" property of the pad. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2" ! deinterleave name=d interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav d.src0 ! queue ! audioconvert ! i.sink1 d.src1 ! queue ! audioconvert ! i.sink0 + * ]| Decodes and deinterleaves a Stereo MP3 file into separate channels and + * then interleaves the channels again to a WAV file with the channel with the + * channels exchanged. + * |[ + * gst-launch interleave name=i ! audioconvert ! wavenc ! filesink location=file.wav filesrc location=file1.wav ! decodebin ! audioconvert ! "audio/x-raw-int,channels=1" ! queue ! i.sink0 filesrc location=file2.wav ! decodebin ! audioconvert ! "audio/x-raw-int,channels=1" ! queue ! i.sink1 + * ]| Interleaves two Mono WAV files to a single Stereo WAV file. + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include "interleave.h" + +#include + +GST_DEBUG_CATEGORY_STATIC (gst_interleave_debug); +#define GST_CAT_DEFAULT gst_interleave_debug + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) 1, " + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " + "width = (int) { 8, 16, 24, 32 }, " + "depth = (int) [ 1, 32 ], " + "signed = (boolean) true; " + "audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) 1, " + "endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " + "width = (int) { 32, 64 }") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " + "width = (int) { 8, 16, 24, 32 }, " + "depth = (int) [ 1, 32 ], " + "signed = (boolean) true; " + "audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " + "width = (int) { 32, 64 }") + ); + +#define MAKE_FUNC(type) \ +static void interleave_##type (guint##type *out, guint##type *in, \ + guint stride, guint nframes) \ +{ \ + gint i; \ + \ + for (i = 0; i < nframes; i++) { \ + *out = in[i]; \ + out += stride; \ + } \ +} + +MAKE_FUNC (8); +MAKE_FUNC (16); +MAKE_FUNC (32); +MAKE_FUNC (64); + +static void +interleave_24 (guint8 * out, guint8 * in, guint stride, guint nframes) +{ + gint i; + + for (i = 0; i < nframes; i++) { + memcpy (out, in, 3); + out += stride * 3; + in += 3; + } +} + +typedef struct +{ + GstPad parent; + guint channel; +} GstInterleavePad; + +enum +{ + PROP_PAD_0, + PROP_PAD_CHANNEL +}; + +static void gst_interleave_pad_class_init (GstPadClass * klass); + +#define GST_TYPE_INTERLEAVE_PAD (gst_interleave_pad_get_type()) +#define GST_INTERLEAVE_PAD(pad) (G_TYPE_CHECK_INSTANCE_CAST((pad),GST_TYPE_INTERLEAVE_PAD,GstInterleavePad)) +#define GST_INTERLEAVE_PAD_CAST(pad) ((GstInterleavePad *) pad) +#define GST_IS_INTERLEAVE_PAD(pad) (G_TYPE_CHECK_INSTANCE_TYPE((pad),GST_TYPE_INTERLEAVE_PAD)) +static GType +gst_interleave_pad_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + type = g_type_register_static_simple (GST_TYPE_PAD, + g_intern_static_string ("GstInterleavePad"), sizeof (GstPadClass), + (GClassInitFunc) gst_interleave_pad_class_init, + sizeof (GstInterleavePad), NULL, 0); + } + return type; +} + +static void +gst_interleave_pad_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstInterleavePad *self = GST_INTERLEAVE_PAD (object); + + switch (prop_id) { + case PROP_PAD_CHANNEL: + g_value_set_uint (value, self->channel); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_interleave_pad_class_init (GstPadClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->get_property = gst_interleave_pad_get_property; + + g_object_class_install_property (gobject_class, + PROP_PAD_CHANNEL, + g_param_spec_uint ("channel", + "Channel number", + "Number of the channel of this pad in the output", 0, G_MAXUINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +GST_BOILERPLATE (GstInterleave, gst_interleave, GstElement, GST_TYPE_ELEMENT); + +enum +{ + PROP_0, + PROP_CHANNEL_POSITIONS, + PROP_CHANNEL_POSITIONS_FROM_INPUT +}; + +static void gst_interleave_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_interleave_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static GstPad *gst_interleave_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_interleave_release_pad (GstElement * element, GstPad * pad); + +static GstStateChangeReturn gst_interleave_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_interleave_src_query (GstPad * pad, GstQuery * query); + +static gboolean gst_interleave_src_event (GstPad * pad, GstEvent * event); + +static gboolean gst_interleave_sink_event (GstPad * pad, GstEvent * event); + +static gboolean gst_interleave_sink_setcaps (GstPad * pad, GstCaps * caps); + +static GstCaps *gst_interleave_sink_getcaps (GstPad * pad); + +static GstFlowReturn gst_interleave_collected (GstCollectPads * pads, + GstInterleave * self); + +static void +gst_interleave_finalize (GObject * object) +{ + GstInterleave *self = GST_INTERLEAVE (object); + + if (self->collect) { + gst_object_unref (self->collect); + self->collect = NULL; + } + + if (self->channel_positions + && self->channel_positions != self->input_channel_positions) { + g_value_array_free (self->channel_positions); + self->channel_positions = NULL; + } + + if (self->input_channel_positions) { + g_value_array_free (self->input_channel_positions); + self->input_channel_positions = NULL; + } + + gst_caps_replace (&self->sinkcaps, NULL); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_interleave_check_channel_positions (GValueArray * positions) +{ + gint i; + guint channels; + GstAudioChannelPosition *pos; + gboolean ret; + + channels = positions->n_values; + pos = g_new (GstAudioChannelPosition, positions->n_values); + + for (i = 0; i < channels; i++) { + GValue *v = g_value_array_get_nth (positions, i); + + pos[i] = g_value_get_enum (v); + } + + ret = gst_audio_check_channel_positions (pos, channels); + g_free (pos); + + return ret; +} + +static void +gst_interleave_set_channel_positions (GstInterleave * self, GstStructure * s) +{ + GValue pos_array = { 0, }; + gint i; + + g_value_init (&pos_array, GST_TYPE_ARRAY); + + if (self->channel_positions + && self->channels == self->channel_positions->n_values + && gst_interleave_check_channel_positions (self->channel_positions)) { + GST_DEBUG_OBJECT (self, "Using provided channel positions"); + for (i = 0; i < self->channels; i++) + gst_value_array_append_value (&pos_array, + g_value_array_get_nth (self->channel_positions, i)); + } else { + GValue pos_none = { 0, }; + + GST_WARNING_OBJECT (self, "Using NONE channel positions"); + + g_value_init (&pos_none, GST_TYPE_AUDIO_CHANNEL_POSITION); + g_value_set_enum (&pos_none, GST_AUDIO_CHANNEL_POSITION_NONE); + + for (i = 0; i < self->channels; i++) + gst_value_array_append_value (&pos_array, &pos_none); + + g_value_unset (&pos_none); + } + gst_structure_set_value (s, "channel-positions", &pos_array); + g_value_unset (&pos_array); +} + +static void +gst_interleave_base_init (gpointer g_class) +{ + gst_element_class_set_details_simple (g_class, "Audio interleaver", + "Filter/Converter/Audio", + "Folds many mono channels into one interleaved audio stream", + "Andy Wingo , " + "Sebastian Dröge "); + + gst_element_class_add_static_pad_template (g_class, &sink_template); + gst_element_class_add_static_pad_template (g_class, &src_template); +} + +static void +gst_interleave_class_init (GstInterleaveClass * klass) +{ + GstElementClass *gstelement_class; + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstelement_class = GST_ELEMENT_CLASS (klass); + + GST_DEBUG_CATEGORY_INIT (gst_interleave_debug, "interleave", 0, + "interleave element"); + + /* Reference GstInterleavePad class to have the type registered from + * a threadsafe context + */ + g_type_class_ref (GST_TYPE_INTERLEAVE_PAD); + + gobject_class->finalize = gst_interleave_finalize; + gobject_class->set_property = gst_interleave_set_property; + gobject_class->get_property = gst_interleave_get_property; + + /** + * GstInterleave:channel-positions + * + * Channel positions: This property controls the channel positions + * that are used on the src caps. The number of elements should be + * the same as the number of sink pads and the array should contain + * a valid list of channel positions. The n-th element of the array + * is the position of the n-th sink pad. + * + * These channel positions will only be used if they're valid and the + * number of elements is the same as the number of channels. If this + * is not given a NONE layout will be used. + * + */ + g_object_class_install_property (gobject_class, PROP_CHANNEL_POSITIONS, + g_param_spec_value_array ("channel-positions", "Channel positions", + "Channel positions used on the output", + g_param_spec_enum ("channel-position", "Channel position", + "Channel position of the n-th input", + GST_TYPE_AUDIO_CHANNEL_POSITION, + GST_AUDIO_CHANNEL_POSITION_NONE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS), + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstInterleave:channel-positions-from-input + * + * Channel positions from input: If this property is set to %TRUE the channel + * positions will be taken from the input caps if valid channel positions for + * the output can be constructed from them. If this is set to %TRUE setting the + * channel-positions property overwrites this property again. + * + */ + g_object_class_install_property (gobject_class, + PROP_CHANNEL_POSITIONS_FROM_INPUT, + g_param_spec_boolean ("channel-positions-from-input", + "Channel positions from input", + "Take channel positions from the input", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_interleave_request_new_pad); + gstelement_class->release_pad = + GST_DEBUG_FUNCPTR (gst_interleave_release_pad); + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_interleave_change_state); +} + +static void +gst_interleave_init (GstInterleave * self, GstInterleaveClass * klass) +{ + self->src = gst_pad_new_from_static_template (&src_template, "src"); + + gst_pad_set_query_function (self->src, + GST_DEBUG_FUNCPTR (gst_interleave_src_query)); + gst_pad_set_event_function (self->src, + GST_DEBUG_FUNCPTR (gst_interleave_src_event)); + + gst_element_add_pad (GST_ELEMENT (self), self->src); + + self->collect = gst_collect_pads_new (); + gst_collect_pads_set_function (self->collect, + (GstCollectPadsFunction) gst_interleave_collected, self); + + self->input_channel_positions = g_value_array_new (0); + self->channel_positions_from_input = TRUE; + self->channel_positions = self->input_channel_positions; +} + +static void +gst_interleave_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstInterleave *self = GST_INTERLEAVE (object); + + switch (prop_id) { + case PROP_CHANNEL_POSITIONS: + if (self->channel_positions && + self->channel_positions != self->input_channel_positions) + g_value_array_free (self->channel_positions); + + self->channel_positions = g_value_dup_boxed (value); + self->channel_positions_from_input = FALSE; + break; + case PROP_CHANNEL_POSITIONS_FROM_INPUT: + self->channel_positions_from_input = g_value_get_boolean (value); + + if (self->channel_positions_from_input) { + if (self->channel_positions && + self->channel_positions != self->input_channel_positions) + g_value_array_free (self->channel_positions); + self->channel_positions = self->input_channel_positions; + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_interleave_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstInterleave *self = GST_INTERLEAVE (object); + + switch (prop_id) { + case PROP_CHANNEL_POSITIONS: + g_value_set_boxed (value, self->channel_positions); + break; + case PROP_CHANNEL_POSITIONS_FROM_INPUT: + g_value_set_boolean (value, self->channel_positions_from_input); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstPad * +gst_interleave_request_new_pad (GstElement * element, GstPadTemplate * templ, + const gchar * req_name) +{ + GstInterleave *self = GST_INTERLEAVE (element); + GstPad *new_pad; + gchar *pad_name; + gint channels, padnumber; + GValue val = { 0, }; + + if (templ->direction != GST_PAD_SINK) + goto not_sink_pad; + +#if GLIB_CHECK_VERSION(2,29,5) + channels = g_atomic_int_add (&self->channels, 1); + padnumber = g_atomic_int_add (&self->padcounter, 1); +#else + channels = g_atomic_int_exchange_and_add (&self->channels, 1); + padnumber = g_atomic_int_exchange_and_add (&self->padcounter, 1); +#endif + + pad_name = g_strdup_printf ("sink%d", padnumber); + new_pad = GST_PAD_CAST (g_object_new (GST_TYPE_INTERLEAVE_PAD, + "name", pad_name, "direction", templ->direction, + "template", templ, NULL)); + GST_INTERLEAVE_PAD_CAST (new_pad)->channel = channels; + GST_DEBUG_OBJECT (self, "requested new pad %s", pad_name); + g_free (pad_name); + + gst_pad_set_setcaps_function (new_pad, + GST_DEBUG_FUNCPTR (gst_interleave_sink_setcaps)); + gst_pad_set_getcaps_function (new_pad, + GST_DEBUG_FUNCPTR (gst_interleave_sink_getcaps)); + + gst_collect_pads_add_pad (self->collect, new_pad, sizeof (GstCollectData)); + + /* 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 */ + self->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (new_pad); + gst_pad_set_event_function (new_pad, + GST_DEBUG_FUNCPTR (gst_interleave_sink_event)); + + if (!gst_element_add_pad (element, new_pad)) + goto could_not_add; + + g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_NONE); + self->input_channel_positions = + g_value_array_append (self->input_channel_positions, &val); + g_value_unset (&val); + + /* Update the src caps if we already have them */ + if (self->sinkcaps) { + GstCaps *srccaps; + GstStructure *s; + + /* Take lock to make sure processing finishes first */ + GST_OBJECT_LOCK (self->collect); + + srccaps = gst_caps_copy (self->sinkcaps); + s = gst_caps_get_structure (srccaps, 0); + + gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL); + gst_interleave_set_channel_positions (self, s); + + gst_pad_set_caps (self->src, srccaps); + gst_caps_unref (srccaps); + + GST_OBJECT_UNLOCK (self->collect); + } + + return new_pad; + + /* errors */ +not_sink_pad: + { + g_warning ("interleave: requested new pad that is not a SINK pad\n"); + return NULL; + } +could_not_add: + { + GST_DEBUG_OBJECT (self, "could not add pad %s", GST_PAD_NAME (new_pad)); + gst_collect_pads_remove_pad (self->collect, new_pad); + gst_object_unref (new_pad); + return NULL; + } +} + +static void +gst_interleave_release_pad (GstElement * element, GstPad * pad) +{ + GstInterleave *self = GST_INTERLEAVE (element); + GList *l; + + g_return_if_fail (GST_IS_INTERLEAVE_PAD (pad)); + + /* Take lock to make sure we're not changing this when processing buffers */ + GST_OBJECT_LOCK (self->collect); + + g_atomic_int_add (&self->channels, -1); + + g_value_array_remove (self->input_channel_positions, + GST_INTERLEAVE_PAD_CAST (pad)->channel); + + /* Update channel numbers */ + GST_OBJECT_LOCK (self); + for (l = GST_ELEMENT_CAST (self)->sinkpads; l != NULL; l = l->next) { + GstInterleavePad *ipad = GST_INTERLEAVE_PAD (l->data); + + if (GST_INTERLEAVE_PAD_CAST (pad)->channel < ipad->channel) + ipad->channel--; + } + GST_OBJECT_UNLOCK (self); + + /* Update the src caps if we already have them */ + if (self->sinkcaps) { + if (self->channels > 0) { + GstCaps *srccaps; + GstStructure *s; + + srccaps = gst_caps_copy (self->sinkcaps); + s = gst_caps_get_structure (srccaps, 0); + + gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL); + gst_interleave_set_channel_positions (self, s); + + gst_pad_set_caps (self->src, srccaps); + gst_caps_unref (srccaps); + } else { + gst_caps_replace (&self->sinkcaps, NULL); + gst_pad_set_caps (self->src, NULL); + } + } + + GST_OBJECT_UNLOCK (self->collect); + + gst_collect_pads_remove_pad (self->collect, pad); + gst_element_remove_pad (element, pad); +} + +static GstStateChangeReturn +gst_interleave_change_state (GstElement * element, GstStateChange transition) +{ + GstInterleave *self; + GstStateChangeReturn ret; + + self = GST_INTERLEAVE (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + self->timestamp = 0; + self->offset = 0; + self->segment_pending = TRUE; + self->segment_position = 0; + self->segment_rate = 1.0; + gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); + gst_collect_pads_start (self->collect); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + default: + break; + } + + /* Stop before calling the parent's state change function as + * GstCollectPads might take locks and we would deadlock in that + * case + */ + if (transition == GST_STATE_CHANGE_PAUSED_TO_READY) + gst_collect_pads_stop (self->collect); + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_pad_set_caps (self->src, NULL); + gst_caps_replace (&self->sinkcaps, NULL); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +static void +__remove_channels (GstCaps * caps) +{ + GstStructure *s; + gint i, size; + + size = gst_caps_get_size (caps); + for (i = 0; i < size; i++) { + s = gst_caps_get_structure (caps, i); + gst_structure_remove_field (s, "channel-positions"); + gst_structure_remove_field (s, "channels"); + } +} + +static void +__set_channels (GstCaps * caps, gint channels) +{ + GstStructure *s; + gint i, size; + + size = gst_caps_get_size (caps); + for (i = 0; i < size; i++) { + s = gst_caps_get_structure (caps, i); + if (channels > 0) + gst_structure_set (s, "channels", G_TYPE_INT, channels, NULL); + else + gst_structure_set (s, "channels", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); + } +} + +/* we can only accept caps that we and downstream can handle. */ +static GstCaps * +gst_interleave_sink_getcaps (GstPad * pad) +{ + GstInterleave *self = GST_INTERLEAVE (gst_pad_get_parent (pad)); + GstCaps *result, *peercaps, *sinkcaps; + + GST_OBJECT_LOCK (self); + + /* If we already have caps on one of the sink pads return them */ + if (self->sinkcaps) { + result = gst_caps_copy (self->sinkcaps); + } else { + /* get the downstream possible caps */ + peercaps = gst_pad_peer_get_caps (self->src); + /* get the allowed caps on this sinkpad */ + sinkcaps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + __remove_channels (sinkcaps); + if (peercaps) { + __remove_channels (peercaps); + /* if the peer has caps, intersect */ + GST_DEBUG_OBJECT (pad, "intersecting peer and template caps"); + result = gst_caps_intersect (peercaps, sinkcaps); + gst_caps_unref (peercaps); + gst_caps_unref (sinkcaps); + } else { + /* the peer has no caps (or there is no peer), just use the allowed caps + * of this sinkpad. */ + GST_DEBUG_OBJECT (pad, "no peer caps, using sinkcaps"); + result = sinkcaps; + } + __set_channels (result, 1); + } + + GST_OBJECT_UNLOCK (self); + + gst_object_unref (self); + + GST_DEBUG_OBJECT (pad, "Returning caps %" GST_PTR_FORMAT, result); + + return result; +} + +static void +gst_interleave_set_process_function (GstInterleave * self) +{ + switch (self->width) { + case 8: + self->func = (GstInterleaveFunc) interleave_8; + break; + case 16: + self->func = (GstInterleaveFunc) interleave_16; + break; + case 24: + self->func = (GstInterleaveFunc) interleave_24; + break; + case 32: + self->func = (GstInterleaveFunc) interleave_32; + break; + case 64: + self->func = (GstInterleaveFunc) interleave_64; + break; + default: + g_assert_not_reached (); + break; + } +} + +static gboolean +gst_interleave_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstInterleave *self; + + g_return_val_if_fail (GST_IS_INTERLEAVE_PAD (pad), FALSE); + + self = GST_INTERLEAVE (gst_pad_get_parent (pad)); + + /* First caps that are set on a sink pad are used as output caps */ + /* TODO: handle caps changes */ + if (self->sinkcaps && !gst_caps_is_subset (caps, self->sinkcaps)) { + goto cannot_change_caps; + } else { + GstCaps *srccaps; + GstStructure *s; + gboolean res; + + s = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (s, "width", &self->width)) + goto no_width; + + if (!gst_structure_get_int (s, "rate", &self->rate)) + goto no_rate; + + gst_interleave_set_process_function (self); + + if (gst_structure_has_field (s, "channel-positions")) { + const GValue *pos_array; + + pos_array = gst_structure_get_value (s, "channel-positions"); + if (GST_VALUE_HOLDS_ARRAY (pos_array) + && gst_value_array_get_size (pos_array) == 1) { + const GValue *pos = gst_value_array_get_value (pos_array, 0); + + GValue *apos = g_value_array_get_nth (self->input_channel_positions, + GST_INTERLEAVE_PAD_CAST (pad)->channel); + + g_value_set_enum (apos, g_value_get_enum (pos)); + } + } + + srccaps = gst_caps_copy (caps); + s = gst_caps_get_structure (srccaps, 0); + + gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL); + gst_interleave_set_channel_positions (self, s); + + res = gst_pad_set_caps (self->src, srccaps); + gst_caps_unref (srccaps); + + if (!res) + goto src_did_not_accept; + } + + if (!self->sinkcaps) { + GstCaps *sinkcaps = gst_caps_copy (caps); + GstStructure *s = gst_caps_get_structure (sinkcaps, 0); + + gst_structure_remove_field (s, "channel-positions"); + + gst_caps_replace (&self->sinkcaps, sinkcaps); + + gst_caps_unref (sinkcaps); + } + + gst_object_unref (self); + + return TRUE; + +cannot_change_caps: + { + GST_WARNING_OBJECT (self, "caps of %" GST_PTR_FORMAT " already set, can't " + "change", self->sinkcaps); + gst_object_unref (self); + return FALSE; + } +src_did_not_accept: + { + GST_WARNING_OBJECT (self, "src did not accept setcaps()"); + gst_object_unref (self); + return FALSE; + } +no_width: + { + GST_WARNING_OBJECT (self, "caps did not have width: %" GST_PTR_FORMAT, + caps); + gst_object_unref (self); + return FALSE; + } +no_rate: + { + GST_WARNING_OBJECT (self, "caps did not have rate: %" GST_PTR_FORMAT, caps); + gst_object_unref (self); + return FALSE; + } +} + +static gboolean +gst_interleave_sink_event (GstPad * pad, GstEvent * event) +{ + GstInterleave *self = GST_INTERLEAVE (gst_pad_get_parent (pad)); + gboolean ret; + + GST_DEBUG ("Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event), + GST_DEBUG_PAD_NAME (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + /* mark a pending new segment. This event is synchronized + * with the streaming thread so we can safely update the + * variable without races. It's somewhat weird because we + * assume the collectpads forwarded the FLUSH_STOP past us + * and downstream (using our source pad, the bastard!). + */ + self->segment_pending = TRUE; + break; + default: + break; + } + + /* now GstCollectPads can take care of the rest, e.g. EOS */ + ret = self->collect_event (pad, event); + + gst_object_unref (self); + return ret; +} + +static gboolean +gst_interleave_src_query_duration (GstInterleave * self, GstQuery * query) +{ + gint64 max; + gboolean res; + GstFormat format; + GstIterator *it; + gboolean done; + + /* parse format */ + gst_query_parse_duration (query, &format, NULL); + + max = -1; + res = TRUE; + done = FALSE; + + /* Take maximum of all durations */ + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); + while (!done) { + GstIteratorResult ires; + + gpointer item; + + ires = gst_iterator_next (it, &item); + switch (ires) { + case GST_ITERATOR_DONE: + done = TRUE; + break; + case GST_ITERATOR_OK: + { + GstPad *pad = GST_PAD_CAST (item); + + gint64 duration; + + /* ask sink peer for duration */ + res &= gst_pad_query_peer_duration (pad, &format, &duration); + /* take max from all valid return values */ + if (res) { + /* valid unknown length, stop searching */ + if (duration == -1) { + max = duration; + done = TRUE; + } + /* else see if bigger than current max */ + else if (duration > max) + max = duration; + } + gst_object_unref (pad); + break; + } + case GST_ITERATOR_RESYNC: + max = -1; + res = TRUE; + gst_iterator_resync (it); + break; + default: + res = FALSE; + done = TRUE; + break; + } + } + gst_iterator_free (it); + + if (res) { + /* If in bytes format we have to multiply with the number of channels + * to get the correct results. All other formats should be fine */ + if (format == GST_FORMAT_BYTES && max != -1) + max *= self->channels; + + /* and store the max */ + GST_DEBUG_OBJECT (self, "Total duration in format %s: %" + GST_TIME_FORMAT, gst_format_get_name (format), GST_TIME_ARGS (max)); + gst_query_set_duration (query, format, max); + } + + return res; +} + +static gboolean +gst_interleave_src_query_latency (GstInterleave * self, GstQuery * query) +{ + GstClockTime min, max; + gboolean live; + gboolean res; + GstIterator *it; + gboolean done; + + res = TRUE; + done = FALSE; + + live = FALSE; + min = 0; + max = GST_CLOCK_TIME_NONE; + + /* Take maximum of all latency values */ + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); + while (!done) { + GstIteratorResult ires; + gpointer item; + + ires = gst_iterator_next (it, &item); + switch (ires) { + case GST_ITERATOR_DONE: + done = TRUE; + break; + case GST_ITERATOR_OK: + { + GstPad *pad = GST_PAD_CAST (item); + GstQuery *peerquery; + GstClockTime min_cur, max_cur; + gboolean live_cur; + + peerquery = gst_query_new_latency (); + + /* Ask peer for latency */ + res &= gst_pad_peer_query (pad, peerquery); + + /* take max from all valid return values */ + if (res) { + gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur); + + if (min_cur > min) + min = min_cur; + + if (max_cur != GST_CLOCK_TIME_NONE && + ((max != GST_CLOCK_TIME_NONE && max_cur > max) || + (max == GST_CLOCK_TIME_NONE))) + max = max_cur; + + live = live || live_cur; + } + + gst_query_unref (peerquery); + gst_object_unref (pad); + break; + } + case GST_ITERATOR_RESYNC: + live = FALSE; + min = 0; + max = GST_CLOCK_TIME_NONE; + res = TRUE; + gst_iterator_resync (it); + break; + default: + res = FALSE; + done = TRUE; + break; + } + } + gst_iterator_free (it); + + if (res) { + /* store the results */ + GST_DEBUG_OBJECT (self, "Calculated total latency: live %s, min %" + GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, + (live ? "yes" : "no"), GST_TIME_ARGS (min), GST_TIME_ARGS (max)); + gst_query_set_latency (query, live, min, max); + } + + return res; +} + +static gboolean +gst_interleave_src_query (GstPad * pad, GstQuery * query) +{ + GstInterleave *self = GST_INTERLEAVE (gst_pad_get_parent (pad)); + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + + gst_query_parse_position (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME: + /* FIXME, bring to stream time, might be tricky */ + gst_query_set_position (query, format, self->timestamp); + res = TRUE; + break; + case GST_FORMAT_BYTES: + gst_query_set_position (query, format, + self->offset * self->channels * self->width); + res = TRUE; + break; + case GST_FORMAT_DEFAULT: + gst_query_set_position (query, format, self->offset); + res = TRUE; + break; + default: + break; + } + break; + } + case GST_QUERY_DURATION: + res = gst_interleave_src_query_duration (self, query); + break; + case GST_QUERY_LATENCY: + res = gst_interleave_src_query_latency (self, query); + break; + default: + /* FIXME, needs a custom query handler because we have multiple + * sinkpads */ + res = gst_pad_query_default (pad, query); + break; + } + + gst_object_unref (self); + return res; +} + +static gboolean +forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) +{ + gst_event_ref (event); + GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event)); + if (!gst_pad_push_event (pad, event)) { + g_value_set_boolean (ret, FALSE); + GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", + event, GST_EVENT_TYPE_NAME (event)); + } else { + GST_LOG_OBJECT (pad, "Sent event %p (%s).", + event, GST_EVENT_TYPE_NAME (event)); + } + gst_object_unref (pad); + return TRUE; +} + +static gboolean +forward_event (GstInterleave * self, GstEvent * event) +{ + GstIterator *it; + GValue vret = { 0 }; + + GST_LOG_OBJECT (self, "Forwarding event %p (%s)", event, + GST_EVENT_TYPE_NAME (event)); + + g_value_init (&vret, G_TYPE_BOOLEAN); + g_value_set_boolean (&vret, TRUE); + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); + gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func, &vret, + event); + gst_iterator_free (it); + gst_event_unref (event); + + return g_value_get_boolean (&vret); +} + + +static gboolean +gst_interleave_src_event (GstPad * pad, GstEvent * event) +{ + GstInterleave *self = GST_INTERLEAVE (gst_pad_get_parent (pad)); + gboolean result; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS: + /* QoS might be tricky */ + result = FALSE; + break; + case GST_EVENT_SEEK: + { + GstSeekFlags flags; + GstSeekType curtype; + gint64 cur; + + /* parse the seek parameters */ + gst_event_parse_seek (event, &self->segment_rate, NULL, &flags, &curtype, + &cur, NULL, NULL); + + /* check if we are flushing */ + if (flags & GST_SEEK_FLAG_FLUSH) { + /* make sure we accept nothing anymore and return WRONG_STATE */ + gst_collect_pads_set_flushing (self->collect, TRUE); + + /* flushing seek, start flush downstream, the flush will be done + * when all pads received a FLUSH_STOP. */ + gst_pad_push_event (self->src, gst_event_new_flush_start ()); + } + + /* now wait for the collected to be finished and mark a new + * segment */ + GST_OBJECT_LOCK (self->collect); + if (curtype == GST_SEEK_TYPE_SET) + self->segment_position = cur; + else + self->segment_position = 0; + self->segment_pending = TRUE; + GST_OBJECT_UNLOCK (self->collect); + + result = forward_event (self, event); + break; + } + case GST_EVENT_NAVIGATION: + /* navigation is rather pointless. */ + result = FALSE; + break; + default: + /* just forward the rest for now */ + result = forward_event (self, event); + break; + } + gst_object_unref (self); + + return result; +} + +static GstFlowReturn +gst_interleave_collected (GstCollectPads * pads, GstInterleave * self) +{ + guint size; + GstBuffer *outbuf; + GstFlowReturn ret = GST_FLOW_OK; + GSList *collected; + guint nsamples; + guint ncollected = 0; + gboolean empty = TRUE; + gint width = self->width / 8; + + g_return_val_if_fail (self->func != NULL, GST_FLOW_NOT_NEGOTIATED); + g_return_val_if_fail (self->width > 0, GST_FLOW_NOT_NEGOTIATED); + g_return_val_if_fail (self->channels > 0, GST_FLOW_NOT_NEGOTIATED); + g_return_val_if_fail (self->rate > 0, GST_FLOW_NOT_NEGOTIATED); + + size = gst_collect_pads_available (pads); + + g_return_val_if_fail (size % width == 0, GST_FLOW_ERROR); + + GST_DEBUG_OBJECT (self, "Starting to collect %u bytes from %d channels", size, + self->channels); + + nsamples = size / width; + + ret = + gst_pad_alloc_buffer (self->src, GST_BUFFER_OFFSET_NONE, + size * self->channels, GST_PAD_CAPS (self->src), &outbuf); + + if (ret != GST_FLOW_OK) { + return ret; + } else if (outbuf == NULL || GST_BUFFER_SIZE (outbuf) < size * self->channels) { + gst_buffer_unref (outbuf); + return GST_FLOW_NOT_NEGOTIATED; + } else if (!gst_caps_is_equal (GST_BUFFER_CAPS (outbuf), + GST_PAD_CAPS (self->src))) { + gst_buffer_unref (outbuf); + return GST_FLOW_NOT_NEGOTIATED; + } + + memset (GST_BUFFER_DATA (outbuf), 0, size * self->channels); + + for (collected = pads->data; collected != NULL; collected = collected->next) { + GstCollectData *cdata; + GstBuffer *inbuf; + guint8 *outdata; + + cdata = (GstCollectData *) collected->data; + + inbuf = gst_collect_pads_take_buffer (pads, cdata, size); + if (inbuf == NULL) { + GST_DEBUG_OBJECT (cdata->pad, "No buffer available"); + goto next; + } + ncollected++; + + if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP)) + goto next; + + empty = FALSE; + outdata = + GST_BUFFER_DATA (outbuf) + + width * GST_INTERLEAVE_PAD_CAST (cdata->pad)->channel; + + self->func (outdata, GST_BUFFER_DATA (inbuf), self->channels, nsamples); + + next: + if (inbuf) + gst_buffer_unref (inbuf); + } + + if (ncollected == 0) + goto eos; + + if (self->segment_pending) { + GstEvent *event; + + event = gst_event_new_new_segment_full (FALSE, self->segment_rate, + 1.0, GST_FORMAT_TIME, self->timestamp, -1, self->segment_position); + + gst_pad_push_event (self->src, event); + self->segment_pending = FALSE; + self->segment_position = 0; + } + + GST_BUFFER_TIMESTAMP (outbuf) = self->timestamp; + GST_BUFFER_OFFSET (outbuf) = self->offset; + + self->offset += nsamples; + self->timestamp = gst_util_uint64_scale_int (self->offset, + GST_SECOND, self->rate); + + GST_BUFFER_DURATION (outbuf) = self->timestamp - + GST_BUFFER_TIMESTAMP (outbuf); + + if (empty) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP); + + GST_LOG_OBJECT (self, "pushing outbuf, timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf))); + ret = gst_pad_push (self->src, outbuf); + + return ret; + +eos: + { + GST_DEBUG_OBJECT (self, "no data available, must be EOS"); + gst_buffer_unref (outbuf); + gst_pad_push_event (self->src, gst_event_new_eos ()); + return GST_FLOW_UNEXPECTED; + } +} diff --git a/gst/interleave/interleave.h b/gst/interleave/interleave.h new file mode 100644 index 0000000..fb3b274 --- /dev/null +++ b/gst/interleave/interleave.h @@ -0,0 +1,89 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2005 Wim Taymans + * 2007 Andy Wingo + * 2008 Sebastian Dröge + * + * interleave.c: interleave samples, mostly based on adder + * + * 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 __INTERLEAVE_H__ +#define __INTERLEAVE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_INTERLEAVE (gst_interleave_get_type()) +#define GST_INTERLEAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_INTERLEAVE,GstInterleave)) +#define GST_INTERLEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_INTERLEAVE,GstInterleaveClass)) +#define GST_INTERLEAVE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_INTERLEAVE,GstInterleaveClass)) +#define GST_IS_INTERLEAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_INTERLEAVE)) +#define GST_IS_INTERLEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_INTERLEAVE)) + +typedef struct _GstInterleave GstInterleave; +typedef struct _GstInterleaveClass GstInterleaveClass; + +typedef void (*GstInterleaveFunc) (gpointer out, gpointer in, guint stride, guint nframes); + +struct _GstInterleave +{ + GstElement element; + + /*< private >*/ + GstCollectPads *collect; + + gint channels; + gint padcounter; + gint rate; + gint width; + + GValueArray *channel_positions; + GValueArray *input_channel_positions; + gboolean channel_positions_from_input; + + GstCaps *sinkcaps; + + GstClockTime timestamp; + guint64 offset; + + gboolean segment_pending; + guint64 segment_position; + gdouble segment_rate; + GstSegment segment; + + GstPadEventFunction collect_event; + + GstInterleaveFunc func; + + GstPad *src; +}; + +struct _GstInterleaveClass +{ + GstElementClass parent_class; +}; + +GType gst_interleave_get_type (void); + +G_END_DECLS + +#endif /* __INTERLEAVE_H__ */ diff --git a/gst/interleave/plugin.c b/gst/interleave/plugin.c new file mode 100644 index 0000000..7017c45 --- /dev/null +++ b/gst/interleave/plugin.c @@ -0,0 +1,44 @@ +/* GStreamer interleave plugin + * Copyright (C) 2004,2007 Andy Wingo + * + * plugin.c: the stubs for the interleave plugin + * + * 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 "plugin.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "interleave", + GST_RANK_NONE, gst_interleave_get_type ()) || + !gst_element_register (plugin, "deinterleave", + GST_RANK_NONE, gst_deinterleave_get_type ())) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "interleave", + "Audio interleaver/deinterleaver", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/interleave/plugin.h b/gst/interleave/plugin.h new file mode 100644 index 0000000..3e96a7e --- /dev/null +++ b/gst/interleave/plugin.h @@ -0,0 +1,31 @@ +/* GStreamer interleave plugin + * Copyright (C) 2004,2007 Andy Wingo + * + * plugin.h: the stubs for the interleave plugin + * + * 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_PLUGIN_INTERLEAVE_H__ +#define __GST_PLUGIN_INTERLEAVE_H__ + + +#include +#include "interleave.h" +#include "deinterleave.h" + +#endif /* __GST_PLUGIN_INTERLEAVE_H__ */ diff --git a/gst/isomp4/Makefile.am b/gst/isomp4/Makefile.am new file mode 100644 index 0000000..010e09c --- /dev/null +++ b/gst/isomp4/Makefile.am @@ -0,0 +1,55 @@ + +plugin_LTLIBRARIES = libgstisomp4.la + +libgstisomp4_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstisomp4_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgstrtp-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) +libgstisomp4_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} +libgstisomp4_la_SOURCES = isomp4-plugin.c gstrtpxqtdepay.c \ + qtdemux.c qtdemux_types.c qtdemux_dump.c qtdemux_lang.c \ + gstqtmux.c gstqtmoovrecover.c atoms.c atomsrecovery.c descriptors.c \ + properties.c gstqtmuxmap.c +libgstisomp4_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + qtatomparser.h \ + qtdemux.h \ + qtdemux_types.h \ + qtdemux_dump.h \ + qtdemux_fourcc.h \ + qtdemux_lang.h \ + qtpalette.h \ + gstrtpxqtdepay.h \ + gstqtmux.h \ + gstqtmoovrecover.h \ + atoms.h \ + atomsrecovery.h \ + descriptors.h \ + properties.h \ + fourcc.h \ + ftypcc.h \ + gstqtmuxmap.h + +EXTRA_DIST = \ + gstqtmux-doc.c \ + gstqtmux-doc.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstisomp4 -:SHARED libgstisomp4 \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstisomp4_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) \ + -:LDFLAGS $(libgstisomp4_la_LDFLAGS) \ + $(libgstisomp4_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/isomp4/Makefile.in b/gst/isomp4/Makefile.in new file mode 100644 index 0000000..d34d265 --- /dev/null +++ b/gst/isomp4/Makefile.in @@ -0,0 +1,958 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/isomp4 +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstisomp4_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstisomp4_la_OBJECTS = libgstisomp4_la-isomp4-plugin.lo \ + libgstisomp4_la-gstrtpxqtdepay.lo libgstisomp4_la-qtdemux.lo \ + libgstisomp4_la-qtdemux_types.lo \ + libgstisomp4_la-qtdemux_dump.lo \ + libgstisomp4_la-qtdemux_lang.lo libgstisomp4_la-gstqtmux.lo \ + libgstisomp4_la-gstqtmoovrecover.lo libgstisomp4_la-atoms.lo \ + libgstisomp4_la-atomsrecovery.lo \ + libgstisomp4_la-descriptors.lo libgstisomp4_la-properties.lo \ + libgstisomp4_la-gstqtmuxmap.lo +libgstisomp4_la_OBJECTS = $(am_libgstisomp4_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstisomp4_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstisomp4_la_CFLAGS) $(CFLAGS) \ + $(libgstisomp4_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstisomp4_la_SOURCES) +DIST_SOURCES = $(libgstisomp4_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstisomp4.la +libgstisomp4_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstisomp4_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgstrtp-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) + +libgstisomp4_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} +libgstisomp4_la_SOURCES = isomp4-plugin.c gstrtpxqtdepay.c \ + qtdemux.c qtdemux_types.c qtdemux_dump.c qtdemux_lang.c \ + gstqtmux.c gstqtmoovrecover.c atoms.c atomsrecovery.c descriptors.c \ + properties.c gstqtmuxmap.c + +libgstisomp4_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + qtatomparser.h \ + qtdemux.h \ + qtdemux_types.h \ + qtdemux_dump.h \ + qtdemux_fourcc.h \ + qtdemux_lang.h \ + qtpalette.h \ + gstrtpxqtdepay.h \ + gstqtmux.h \ + gstqtmoovrecover.h \ + atoms.h \ + atomsrecovery.h \ + descriptors.h \ + properties.h \ + fourcc.h \ + ftypcc.h \ + gstqtmuxmap.h + +EXTRA_DIST = \ + gstqtmux-doc.c \ + gstqtmux-doc.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/isomp4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/isomp4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstisomp4.la: $(libgstisomp4_la_OBJECTS) $(libgstisomp4_la_DEPENDENCIES) $(EXTRA_libgstisomp4_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstisomp4_la_LINK) -rpath $(plugindir) $(libgstisomp4_la_OBJECTS) $(libgstisomp4_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-atoms.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-atomsrecovery.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-descriptors.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-gstqtmoovrecover.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-gstqtmux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-gstqtmuxmap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-gstrtpxqtdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-isomp4-plugin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-properties.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-qtdemux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-qtdemux_dump.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-qtdemux_lang.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-qtdemux_types.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstisomp4_la-isomp4-plugin.lo: isomp4-plugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-isomp4-plugin.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-isomp4-plugin.Tpo -c -o libgstisomp4_la-isomp4-plugin.lo `test -f 'isomp4-plugin.c' || echo '$(srcdir)/'`isomp4-plugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-isomp4-plugin.Tpo $(DEPDIR)/libgstisomp4_la-isomp4-plugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='isomp4-plugin.c' object='libgstisomp4_la-isomp4-plugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-isomp4-plugin.lo `test -f 'isomp4-plugin.c' || echo '$(srcdir)/'`isomp4-plugin.c + +libgstisomp4_la-gstrtpxqtdepay.lo: gstrtpxqtdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-gstrtpxqtdepay.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-gstrtpxqtdepay.Tpo -c -o libgstisomp4_la-gstrtpxqtdepay.lo `test -f 'gstrtpxqtdepay.c' || echo '$(srcdir)/'`gstrtpxqtdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-gstrtpxqtdepay.Tpo $(DEPDIR)/libgstisomp4_la-gstrtpxqtdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpxqtdepay.c' object='libgstisomp4_la-gstrtpxqtdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-gstrtpxqtdepay.lo `test -f 'gstrtpxqtdepay.c' || echo '$(srcdir)/'`gstrtpxqtdepay.c + +libgstisomp4_la-qtdemux.lo: qtdemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-qtdemux.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-qtdemux.Tpo -c -o libgstisomp4_la-qtdemux.lo `test -f 'qtdemux.c' || echo '$(srcdir)/'`qtdemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-qtdemux.Tpo $(DEPDIR)/libgstisomp4_la-qtdemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtdemux.c' object='libgstisomp4_la-qtdemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-qtdemux.lo `test -f 'qtdemux.c' || echo '$(srcdir)/'`qtdemux.c + +libgstisomp4_la-qtdemux_types.lo: qtdemux_types.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-qtdemux_types.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-qtdemux_types.Tpo -c -o libgstisomp4_la-qtdemux_types.lo `test -f 'qtdemux_types.c' || echo '$(srcdir)/'`qtdemux_types.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-qtdemux_types.Tpo $(DEPDIR)/libgstisomp4_la-qtdemux_types.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtdemux_types.c' object='libgstisomp4_la-qtdemux_types.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-qtdemux_types.lo `test -f 'qtdemux_types.c' || echo '$(srcdir)/'`qtdemux_types.c + +libgstisomp4_la-qtdemux_dump.lo: qtdemux_dump.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-qtdemux_dump.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-qtdemux_dump.Tpo -c -o libgstisomp4_la-qtdemux_dump.lo `test -f 'qtdemux_dump.c' || echo '$(srcdir)/'`qtdemux_dump.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-qtdemux_dump.Tpo $(DEPDIR)/libgstisomp4_la-qtdemux_dump.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtdemux_dump.c' object='libgstisomp4_la-qtdemux_dump.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-qtdemux_dump.lo `test -f 'qtdemux_dump.c' || echo '$(srcdir)/'`qtdemux_dump.c + +libgstisomp4_la-qtdemux_lang.lo: qtdemux_lang.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-qtdemux_lang.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-qtdemux_lang.Tpo -c -o libgstisomp4_la-qtdemux_lang.lo `test -f 'qtdemux_lang.c' || echo '$(srcdir)/'`qtdemux_lang.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-qtdemux_lang.Tpo $(DEPDIR)/libgstisomp4_la-qtdemux_lang.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtdemux_lang.c' object='libgstisomp4_la-qtdemux_lang.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-qtdemux_lang.lo `test -f 'qtdemux_lang.c' || echo '$(srcdir)/'`qtdemux_lang.c + +libgstisomp4_la-gstqtmux.lo: gstqtmux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-gstqtmux.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-gstqtmux.Tpo -c -o libgstisomp4_la-gstqtmux.lo `test -f 'gstqtmux.c' || echo '$(srcdir)/'`gstqtmux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-gstqtmux.Tpo $(DEPDIR)/libgstisomp4_la-gstqtmux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstqtmux.c' object='libgstisomp4_la-gstqtmux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-gstqtmux.lo `test -f 'gstqtmux.c' || echo '$(srcdir)/'`gstqtmux.c + +libgstisomp4_la-gstqtmoovrecover.lo: gstqtmoovrecover.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-gstqtmoovrecover.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-gstqtmoovrecover.Tpo -c -o libgstisomp4_la-gstqtmoovrecover.lo `test -f 'gstqtmoovrecover.c' || echo '$(srcdir)/'`gstqtmoovrecover.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-gstqtmoovrecover.Tpo $(DEPDIR)/libgstisomp4_la-gstqtmoovrecover.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstqtmoovrecover.c' object='libgstisomp4_la-gstqtmoovrecover.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-gstqtmoovrecover.lo `test -f 'gstqtmoovrecover.c' || echo '$(srcdir)/'`gstqtmoovrecover.c + +libgstisomp4_la-atoms.lo: atoms.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-atoms.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-atoms.Tpo -c -o libgstisomp4_la-atoms.lo `test -f 'atoms.c' || echo '$(srcdir)/'`atoms.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-atoms.Tpo $(DEPDIR)/libgstisomp4_la-atoms.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='atoms.c' object='libgstisomp4_la-atoms.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-atoms.lo `test -f 'atoms.c' || echo '$(srcdir)/'`atoms.c + +libgstisomp4_la-atomsrecovery.lo: atomsrecovery.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-atomsrecovery.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-atomsrecovery.Tpo -c -o libgstisomp4_la-atomsrecovery.lo `test -f 'atomsrecovery.c' || echo '$(srcdir)/'`atomsrecovery.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-atomsrecovery.Tpo $(DEPDIR)/libgstisomp4_la-atomsrecovery.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='atomsrecovery.c' object='libgstisomp4_la-atomsrecovery.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-atomsrecovery.lo `test -f 'atomsrecovery.c' || echo '$(srcdir)/'`atomsrecovery.c + +libgstisomp4_la-descriptors.lo: descriptors.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-descriptors.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-descriptors.Tpo -c -o libgstisomp4_la-descriptors.lo `test -f 'descriptors.c' || echo '$(srcdir)/'`descriptors.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-descriptors.Tpo $(DEPDIR)/libgstisomp4_la-descriptors.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='descriptors.c' object='libgstisomp4_la-descriptors.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-descriptors.lo `test -f 'descriptors.c' || echo '$(srcdir)/'`descriptors.c + +libgstisomp4_la-properties.lo: properties.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-properties.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-properties.Tpo -c -o libgstisomp4_la-properties.lo `test -f 'properties.c' || echo '$(srcdir)/'`properties.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-properties.Tpo $(DEPDIR)/libgstisomp4_la-properties.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='properties.c' object='libgstisomp4_la-properties.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-properties.lo `test -f 'properties.c' || echo '$(srcdir)/'`properties.c + +libgstisomp4_la-gstqtmuxmap.lo: gstqtmuxmap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-gstqtmuxmap.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-gstqtmuxmap.Tpo -c -o libgstisomp4_la-gstqtmuxmap.lo `test -f 'gstqtmuxmap.c' || echo '$(srcdir)/'`gstqtmuxmap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-gstqtmuxmap.Tpo $(DEPDIR)/libgstisomp4_la-gstqtmuxmap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstqtmuxmap.c' object='libgstisomp4_la-gstqtmuxmap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-gstqtmuxmap.lo `test -f 'gstqtmuxmap.c' || echo '$(srcdir)/'`gstqtmuxmap.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstisomp4 -:SHARED libgstisomp4 \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstisomp4_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) \ + -:LDFLAGS $(libgstisomp4_la_LDFLAGS) \ + $(libgstisomp4_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/isomp4/atoms.c b/gst/isomp4/atoms.c new file mode 100644 index 0000000..5bd6cb7 --- /dev/null +++ b/gst/isomp4/atoms.c @@ -0,0 +1,4494 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008-2010 Thiago Santos + * Copyright (C) 2008 Mark Nauwelaerts + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "atoms.h" +#include +#include + +#include +#include +#include + +/** + * Creates a new AtomsContext for the given flavor. + */ +AtomsContext * +atoms_context_new (AtomsTreeFlavor flavor) +{ + AtomsContext *context = g_new0 (AtomsContext, 1); + context->flavor = flavor; + return context; +} + +/** + * Frees an AtomsContext and all memory associated with it + */ +void +atoms_context_free (AtomsContext * context) +{ + g_free (context); +} + +/* -- creation, initialization, clear and free functions -- */ + +#define SECS_PER_DAY (24 * 60 * 60) +#define LEAP_YEARS_FROM_1904_TO_1970 17 + +static guint64 +get_current_qt_time (void) +{ + GTimeVal timeval; + + g_get_current_time (&timeval); + /* FIXME this should use UTC coordinated time */ + return timeval.tv_sec + (((1970 - 1904) * (guint64) 365) + + LEAP_YEARS_FROM_1904_TO_1970) * SECS_PER_DAY; +} + +static void +common_time_info_init (TimeInfo * ti) +{ + ti->creation_time = ti->modification_time = get_current_qt_time (); + ti->timescale = 0; + ti->duration = 0; +} + +static void +atom_header_set (Atom * header, guint32 fourcc, gint32 size, gint64 ext_size) +{ + header->type = fourcc; + header->size = size; + header->extended_size = ext_size; +} + +static void +atom_clear (Atom * atom) +{ +} + +static void +atom_full_init (AtomFull * full, guint32 fourcc, gint32 size, gint64 ext_size, + guint8 version, guint8 flags[3]) +{ + atom_header_set (&(full->header), fourcc, size, ext_size); + full->version = version; + full->flags[0] = flags[0]; + full->flags[1] = flags[1]; + full->flags[2] = flags[2]; +} + +static void +atom_full_clear (AtomFull * full) +{ + atom_clear (&full->header); +} + +static void +atom_full_free (AtomFull * full) +{ + atom_full_clear (full); + g_free (full); +} + +static guint32 +atom_full_get_flags_as_uint (AtomFull * full) +{ + return full->flags[0] << 16 | full->flags[1] << 8 | full->flags[2]; +} + +static void +atom_full_set_flags_as_uint (AtomFull * full, guint32 flags_as_uint) +{ + full->flags[2] = flags_as_uint & 0xFF; + full->flags[1] = (flags_as_uint & 0xFF00) >> 8; + full->flags[0] = (flags_as_uint & 0xFF0000) >> 16; +} + +static AtomInfo * +build_atom_info_wrapper (Atom * atom, gpointer copy_func, gpointer free_func) +{ + AtomInfo *info = NULL; + + if (atom) { + info = g_new0 (AtomInfo, 1); + + info->atom = atom; + info->copy_data_func = copy_func; + info->free_func = free_func; + } + + return info; +} + +static GList * +atom_info_list_prepend_atom (GList * ai, Atom * atom, + AtomCopyDataFunc copy_func, AtomFreeFunc free_func) +{ + if (atom) + return g_list_prepend (ai, + build_atom_info_wrapper (atom, copy_func, free_func)); + else + return ai; +} + +static void +atom_info_list_free (GList * ai) +{ + while (ai) { + AtomInfo *info = (AtomInfo *) ai->data; + + info->free_func (info->atom); + g_free (info); + ai = g_list_delete_link (ai, ai); + } +} + +static AtomData * +atom_data_new (guint32 fourcc) +{ + AtomData *data = g_new0 (AtomData, 1); + + atom_header_set (&data->header, fourcc, 0, 0); + return data; +} + +static void +atom_data_alloc_mem (AtomData * data, guint32 size) +{ + if (data->data) { + g_free (data->data); + } + data->data = g_new0 (guint8, size); + data->datalen = size; +} + +static AtomData * +atom_data_new_from_gst_buffer (guint32 fourcc, const GstBuffer * buf) +{ + AtomData *data = atom_data_new (fourcc); + + atom_data_alloc_mem (data, GST_BUFFER_SIZE (buf)); + g_memmove (data->data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + return data; +} + +static void +atom_data_free (AtomData * data) +{ + atom_clear (&data->header); + g_free (data->data); + g_free (data); +} + +static AtomUUID * +atom_uuid_new (void) +{ + AtomUUID *uuid = g_new0 (AtomUUID, 1); + + atom_header_set (&uuid->header, FOURCC_uuid, 0, 0); + return uuid; +} + +static void +atom_uuid_free (AtomUUID * data) +{ + atom_clear (&data->header); + g_free (data->data); + g_free (data); +} + +static void +atom_ftyp_init (AtomFTYP * ftyp, guint32 major, guint32 version, GList * brands) +{ + gint index; + GList *it = NULL; + + atom_header_set (&ftyp->header, FOURCC_ftyp, 16, 0); + ftyp->major_brand = major; + ftyp->version = version; + + /* always include major brand as compatible brand */ + ftyp->compatible_brands_size = g_list_length (brands) + 1; + ftyp->compatible_brands = g_new (guint32, ftyp->compatible_brands_size); + + ftyp->compatible_brands[0] = major; + index = 1; + for (it = brands; it != NULL; it = g_list_next (it)) { + ftyp->compatible_brands[index++] = GPOINTER_TO_UINT (it->data); + } +} + +AtomFTYP * +atom_ftyp_new (AtomsContext * context, guint32 major, guint32 version, + GList * brands) +{ + AtomFTYP *ftyp = g_new0 (AtomFTYP, 1); + + atom_ftyp_init (ftyp, major, version, brands); + return ftyp; +} + +void +atom_ftyp_free (AtomFTYP * ftyp) +{ + atom_clear (&ftyp->header); + g_free (ftyp->compatible_brands); + ftyp->compatible_brands = NULL; + g_free (ftyp); +} + +static void +atom_esds_init (AtomESDS * esds) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&esds->header, FOURCC_esds, 0, 0, 0, flags); + desc_es_init (&esds->es); +} + +static AtomESDS * +atom_esds_new (void) +{ + AtomESDS *esds = g_new0 (AtomESDS, 1); + + atom_esds_init (esds); + return esds; +} + +static void +atom_esds_free (AtomESDS * esds) +{ + atom_full_clear (&esds->header); + desc_es_descriptor_clear (&esds->es); + g_free (esds); +} + +static AtomFRMA * +atom_frma_new (void) +{ + AtomFRMA *frma = g_new0 (AtomFRMA, 1); + + atom_header_set (&frma->header, FOURCC_frma, 0, 0); + return frma; +} + +static void +atom_frma_free (AtomFRMA * frma) +{ + atom_clear (&frma->header); + g_free (frma); +} + +static AtomWAVE * +atom_wave_new (void) +{ + AtomWAVE *wave = g_new0 (AtomWAVE, 1); + + atom_header_set (&wave->header, FOURCC_wave, 0, 0); + return wave; +} + +static void +atom_wave_free (AtomWAVE * wave) +{ + atom_clear (&wave->header); + atom_info_list_free (wave->extension_atoms); + g_free (wave); +} + +static void +atom_elst_init (AtomELST * elst) +{ + guint8 flags[3] = { 0, 0, 0 }; + atom_full_init (&elst->header, FOURCC_elst, 0, 0, 0, flags); + elst->entries = 0; +} + +static void +atom_elst_clear (AtomELST * elst) +{ + GSList *walker; + + atom_full_clear (&elst->header); + walker = elst->entries; + while (walker) { + g_free ((EditListEntry *) walker->data); + walker = g_slist_next (walker); + } + g_slist_free (elst->entries); +} + +static void +atom_edts_init (AtomEDTS * edts) +{ + atom_header_set (&edts->header, FOURCC_edts, 0, 0); + atom_elst_init (&edts->elst); +} + +static void +atom_edts_clear (AtomEDTS * edts) +{ + atom_clear (&edts->header); + atom_elst_clear (&edts->elst); +} + +static AtomEDTS * +atom_edts_new (void) +{ + AtomEDTS *edts = g_new0 (AtomEDTS, 1); + atom_edts_init (edts); + return edts; +} + +static void +atom_edts_free (AtomEDTS * edts) +{ + atom_edts_clear (edts); + g_free (edts); +} + +static void +atom_sample_entry_init (SampleTableEntry * se, guint32 type) +{ + atom_header_set (&se->header, type, 0, 0); + + memset (se->reserved, 0, sizeof (guint8) * 6); + se->data_reference_index = 0; +} + +static void +atom_sample_entry_free (SampleTableEntry * se) +{ + atom_clear (&se->header); +} + +static void +sample_entry_mp4a_init (SampleTableEntryMP4A * mp4a) +{ + atom_sample_entry_init (&mp4a->se, FOURCC_mp4a); + + mp4a->version = 0; + mp4a->revision_level = 0; + mp4a->vendor = 0; + mp4a->channels = 2; + mp4a->sample_size = 16; + mp4a->compression_id = 0; + mp4a->packet_size = 0; + mp4a->sample_rate = 0; + /* following only used if version is 1 */ + mp4a->samples_per_packet = 0; + mp4a->bytes_per_packet = 0; + mp4a->bytes_per_frame = 0; + mp4a->bytes_per_sample = 0; + + mp4a->extension_atoms = NULL; +} + +static SampleTableEntryMP4A * +sample_entry_mp4a_new (void) +{ + SampleTableEntryMP4A *mp4a = g_new0 (SampleTableEntryMP4A, 1); + + sample_entry_mp4a_init (mp4a); + return mp4a; +} + +static void +sample_entry_mp4a_free (SampleTableEntryMP4A * mp4a) +{ + atom_sample_entry_free (&mp4a->se); + atom_info_list_free (mp4a->extension_atoms); + g_free (mp4a); +} + +static void +sample_entry_mp4v_init (SampleTableEntryMP4V * mp4v, AtomsContext * context) +{ + atom_sample_entry_init (&mp4v->se, FOURCC_mp4v); + + mp4v->version = 0; + mp4v->revision_level = 0; + mp4v->vendor = 0; + + mp4v->temporal_quality = 0; + mp4v->spatial_quality = 0; + + /* qt and ISO base media do not contradict, and examples agree */ + mp4v->horizontal_resolution = 0x00480000; + mp4v->vertical_resolution = 0x00480000; + + mp4v->datasize = 0; + mp4v->frame_count = 1; + + memset (mp4v->compressor, 0, sizeof (guint8) * 32); + + mp4v->depth = 0; + mp4v->color_table_id = 0; + + mp4v->extension_atoms = NULL; +} + +static void +sample_entry_mp4v_free (SampleTableEntryMP4V * mp4v) +{ + atom_sample_entry_free (&mp4v->se); + atom_info_list_free (mp4v->extension_atoms); + g_free (mp4v); +} + +static SampleTableEntryMP4V * +sample_entry_mp4v_new (AtomsContext * context) +{ + SampleTableEntryMP4V *mp4v = g_new0 (SampleTableEntryMP4V, 1); + + sample_entry_mp4v_init (mp4v, context); + return mp4v; +} + +static void +atom_stsd_init (AtomSTSD * stsd) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&stsd->header, FOURCC_stsd, 0, 0, 0, flags); + stsd->entries = NULL; + stsd->n_entries = 0; +} + +static void +atom_stsd_remove_entries (AtomSTSD * stsd) +{ + GList *walker; + + walker = stsd->entries; + while (walker) { + GList *aux = walker; + SampleTableEntry *se = (SampleTableEntry *) aux->data; + + walker = g_list_next (walker); + stsd->entries = g_list_remove_link (stsd->entries, aux); + + switch (se->kind) { + case AUDIO: + sample_entry_mp4a_free ((SampleTableEntryMP4A *) se); + break; + case VIDEO: + sample_entry_mp4v_free ((SampleTableEntryMP4V *) se); + break; + default: + /* best possible cleanup */ + atom_sample_entry_free (se); + } + g_list_free (aux); + } + stsd->n_entries = 0; +} + +static void +atom_stsd_clear (AtomSTSD * stsd) +{ + atom_stsd_remove_entries (stsd); + atom_full_clear (&stsd->header); +} + +static void +atom_ctts_init (AtomCTTS * ctts) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&ctts->header, FOURCC_ctts, 0, 0, 0, flags); + atom_array_init (&ctts->entries, 128); + ctts->do_pts = FALSE; +} + +static AtomCTTS * +atom_ctts_new (void) +{ + AtomCTTS *ctts = g_new0 (AtomCTTS, 1); + + atom_ctts_init (ctts); + return ctts; +} + +static void +atom_ctts_free (AtomCTTS * ctts) +{ + atom_full_clear (&ctts->header); + atom_array_clear (&ctts->entries); + g_free (ctts); +} + +static void +atom_stts_init (AtomSTTS * stts) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&stts->header, FOURCC_stts, 0, 0, 0, flags); + atom_array_init (&stts->entries, 512); +} + +static void +atom_stts_clear (AtomSTTS * stts) +{ + atom_full_clear (&stts->header); + atom_array_clear (&stts->entries); +} + +static void +atom_stsz_init (AtomSTSZ * stsz) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&stsz->header, FOURCC_stsz, 0, 0, 0, flags); + atom_array_init (&stsz->entries, 1024); + stsz->sample_size = 0; + stsz->table_size = 0; +} + +static void +atom_stsz_clear (AtomSTSZ * stsz) +{ + atom_full_clear (&stsz->header); + atom_array_clear (&stsz->entries); + stsz->table_size = 0; +} + +static void +atom_stsc_init (AtomSTSC * stsc) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&stsc->header, FOURCC_stsc, 0, 0, 0, flags); + atom_array_init (&stsc->entries, 128); +} + +static void +atom_stsc_clear (AtomSTSC * stsc) +{ + atom_full_clear (&stsc->header); + atom_array_clear (&stsc->entries); +} + +static void +atom_co64_init (AtomSTCO64 * co64) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&co64->header, FOURCC_stco, 0, 0, 0, flags); + atom_array_init (&co64->entries, 256); +} + +static void +atom_stco64_clear (AtomSTCO64 * stco64) +{ + atom_full_clear (&stco64->header); + atom_array_clear (&stco64->entries); +} + +static void +atom_stss_init (AtomSTSS * stss) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&stss->header, FOURCC_stss, 0, 0, 0, flags); + atom_array_init (&stss->entries, 128); +} + +static void +atom_stss_clear (AtomSTSS * stss) +{ + atom_full_clear (&stss->header); + atom_array_clear (&stss->entries); +} + +void +atom_stbl_init (AtomSTBL * stbl) +{ + atom_header_set (&stbl->header, FOURCC_stbl, 0, 0); + + atom_stts_init (&stbl->stts); + atom_stss_init (&stbl->stss); + atom_stsd_init (&stbl->stsd); + atom_stsz_init (&stbl->stsz); + atom_stsc_init (&stbl->stsc); + stbl->ctts = NULL; + + atom_co64_init (&stbl->stco64); +} + +void +atom_stbl_clear (AtomSTBL * stbl) +{ + atom_clear (&stbl->header); + atom_stsd_clear (&stbl->stsd); + atom_stts_clear (&stbl->stts); + atom_stss_clear (&stbl->stss); + atom_stsc_clear (&stbl->stsc); + atom_stsz_clear (&stbl->stsz); + if (stbl->ctts) { + atom_ctts_free (stbl->ctts); + } + atom_stco64_clear (&stbl->stco64); +} + +static void +atom_vmhd_init (AtomVMHD * vmhd, AtomsContext * context) +{ + guint8 flags[3] = { 0, 0, 1 }; + + atom_full_init (&vmhd->header, FOURCC_vmhd, 0, 0, 0, flags); + vmhd->graphics_mode = 0x0; + memset (vmhd->opcolor, 0, sizeof (guint16) * 3); + + if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { + vmhd->graphics_mode = 0x40; + vmhd->opcolor[0] = 32768; + vmhd->opcolor[1] = 32768; + vmhd->opcolor[2] = 32768; + } +} + +static AtomVMHD * +atom_vmhd_new (AtomsContext * context) +{ + AtomVMHD *vmhd = g_new0 (AtomVMHD, 1); + + atom_vmhd_init (vmhd, context); + return vmhd; +} + +static void +atom_vmhd_free (AtomVMHD * vmhd) +{ + atom_full_clear (&vmhd->header); + g_free (vmhd); +} + +static void +atom_smhd_init (AtomSMHD * smhd) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&smhd->header, FOURCC_smhd, 0, 0, 0, flags); + smhd->balance = 0; + smhd->reserved = 0; +} + +static AtomSMHD * +atom_smhd_new (void) +{ + AtomSMHD *smhd = g_new0 (AtomSMHD, 1); + + atom_smhd_init (smhd); + return smhd; +} + +static void +atom_smhd_free (AtomSMHD * smhd) +{ + atom_full_clear (&smhd->header); + g_free (smhd); +} + +static void +atom_hmhd_free (AtomHMHD * hmhd) +{ + atom_full_clear (&hmhd->header); + g_free (hmhd); +} + +static void +atom_hdlr_init (AtomHDLR * hdlr) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&hdlr->header, FOURCC_hdlr, 0, 0, 0, flags); + + hdlr->component_type = 0; + hdlr->handler_type = 0; + hdlr->manufacturer = 0; + hdlr->flags = 0; + hdlr->flags_mask = 0; + hdlr->name = g_strdup (""); +} + +static AtomHDLR * +atom_hdlr_new (void) +{ + AtomHDLR *hdlr = g_new0 (AtomHDLR, 1); + + atom_hdlr_init (hdlr); + return hdlr; +} + +static void +atom_hdlr_clear (AtomHDLR * hdlr) +{ + atom_full_clear (&hdlr->header); + if (hdlr->name) { + g_free (hdlr->name); + hdlr->name = NULL; + } +} + +static void +atom_hdlr_free (AtomHDLR * hdlr) +{ + atom_hdlr_clear (hdlr); + g_free (hdlr); +} + +static void +atom_url_init (AtomURL * url) +{ + guint8 flags[3] = { 0, 0, 1 }; + + atom_full_init (&url->header, FOURCC_url_, 0, 0, 0, flags); + url->location = NULL; +} + +static void +atom_url_free (AtomURL * url) +{ + atom_full_clear (&url->header); + if (url->location) { + g_free (url->location); + url->location = NULL; + } + g_free (url); +} + +static AtomURL * +atom_url_new (void) +{ + AtomURL *url = g_new0 (AtomURL, 1); + + atom_url_init (url); + return url; +} + +static AtomFull * +atom_alis_new (void) +{ + guint8 flags[3] = { 0, 0, 1 }; + AtomFull *alis = g_new0 (AtomFull, 1); + + atom_full_init (alis, FOURCC_alis, 0, 0, 0, flags); + return alis; +} + +static void +atom_dref_init (AtomDREF * dref, AtomsContext * context) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&dref->header, FOURCC_dref, 0, 0, 0, flags); + + /* in either case, alis or url init arranges to set self-contained flag */ + if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { + /* alis dref for qt */ + AtomFull *alis = atom_alis_new (); + dref->entries = g_list_append (dref->entries, alis); + } else { + /* url for iso spec, as 'alis' not specified there */ + AtomURL *url = atom_url_new (); + dref->entries = g_list_append (dref->entries, url); + } +} + +static void +atom_dref_clear (AtomDREF * dref) +{ + GList *walker; + + atom_full_clear (&dref->header); + walker = dref->entries; + while (walker) { + GList *aux = walker; + Atom *atom = (Atom *) aux->data; + + walker = g_list_next (walker); + dref->entries = g_list_remove_link (dref->entries, aux); + switch (atom->type) { + case FOURCC_alis: + atom_full_free ((AtomFull *) atom); + break; + case FOURCC_url_: + atom_url_free ((AtomURL *) atom); + break; + default: + /* we do nothing, better leak than crash */ + break; + } + g_list_free (aux); + } +} + +static void +atom_dinf_init (AtomDINF * dinf, AtomsContext * context) +{ + atom_header_set (&dinf->header, FOURCC_dinf, 0, 0); + atom_dref_init (&dinf->dref, context); +} + +static void +atom_dinf_clear (AtomDINF * dinf) +{ + atom_clear (&dinf->header); + atom_dref_clear (&dinf->dref); +} + +static void +atom_minf_init (AtomMINF * minf, AtomsContext * context) +{ + atom_header_set (&minf->header, FOURCC_minf, 0, 0); + + minf->vmhd = NULL; + minf->smhd = NULL; + minf->hmhd = NULL; + + if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { + minf->hdlr = atom_hdlr_new (); + minf->hdlr->component_type = FOURCC_dhlr; + minf->hdlr->handler_type = FOURCC_alis; + } else { + minf->hdlr = NULL; + } + atom_dinf_init (&minf->dinf, context); + atom_stbl_init (&minf->stbl); +} + +static void +atom_minf_clear_handlers (AtomMINF * minf) +{ + if (minf->vmhd) { + atom_vmhd_free (minf->vmhd); + minf->vmhd = NULL; + } + if (minf->smhd) { + atom_smhd_free (minf->smhd); + minf->smhd = NULL; + } + if (minf->hmhd) { + atom_hmhd_free (minf->hmhd); + minf->hmhd = NULL; + } +} + +static void +atom_minf_clear (AtomMINF * minf) +{ + atom_clear (&minf->header); + atom_minf_clear_handlers (minf); + if (minf->hdlr) { + atom_hdlr_free (minf->hdlr); + } + atom_dinf_clear (&minf->dinf); + atom_stbl_clear (&minf->stbl); +} + +static void +atom_mdhd_init (AtomMDHD * mdhd) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&mdhd->header, FOURCC_mdhd, 0, 0, 0, flags); + common_time_info_init (&mdhd->time_info); + mdhd->language_code = 0; + mdhd->quality = 0; +} + +static void +atom_mdhd_clear (AtomMDHD * mdhd) +{ + atom_full_clear (&mdhd->header); +} + +static void +atom_mdia_init (AtomMDIA * mdia, AtomsContext * context) +{ + atom_header_set (&mdia->header, FOURCC_mdia, 0, 0); + + atom_mdhd_init (&mdia->mdhd); + atom_hdlr_init (&mdia->hdlr); + atom_minf_init (&mdia->minf, context); +} + +static void +atom_mdia_clear (AtomMDIA * mdia) +{ + atom_clear (&mdia->header); + atom_mdhd_clear (&mdia->mdhd); + atom_hdlr_clear (&mdia->hdlr); + atom_minf_clear (&mdia->minf); +} + +static void +atom_tkhd_init (AtomTKHD * tkhd, AtomsContext * context) +{ + /* + * flags info + * 1 -> track enabled + * 2 -> track in movie + * 4 -> track in preview + */ + guint8 flags[3] = { 0, 0, 7 }; + + atom_full_init (&tkhd->header, FOURCC_tkhd, 0, 0, 0, flags); + + tkhd->creation_time = tkhd->modification_time = get_current_qt_time (); + tkhd->duration = 0; + tkhd->track_ID = 0; + tkhd->reserved = 0; + + tkhd->reserved2[0] = tkhd->reserved2[1] = 0; + tkhd->layer = 0; + tkhd->alternate_group = 0; + tkhd->volume = 0; + tkhd->reserved3 = 0; + memset (tkhd->matrix, 0, sizeof (guint32) * 9); + tkhd->matrix[0] = 1 << 16; + tkhd->matrix[4] = 1 << 16; + tkhd->matrix[8] = 16384 << 16; + tkhd->width = 0; + tkhd->height = 0; +} + +static void +atom_tkhd_clear (AtomTKHD * tkhd) +{ + atom_full_clear (&tkhd->header); +} + +static void +atom_trak_init (AtomTRAK * trak, AtomsContext * context) +{ + atom_header_set (&trak->header, FOURCC_trak, 0, 0); + + atom_tkhd_init (&trak->tkhd, context); + trak->edts = NULL; + atom_mdia_init (&trak->mdia, context); +} + +AtomTRAK * +atom_trak_new (AtomsContext * context) +{ + AtomTRAK *trak = g_new0 (AtomTRAK, 1); + + atom_trak_init (trak, context); + return trak; +} + +static void +atom_trak_clear (AtomTRAK * trak) +{ + atom_clear (&trak->header); + atom_tkhd_clear (&trak->tkhd); + if (trak->edts) + atom_edts_free (trak->edts); + atom_mdia_clear (&trak->mdia); +} + +static void +atom_trak_free (AtomTRAK * trak) +{ + atom_trak_clear (trak); + g_free (trak); +} + +static void +atom_ilst_init (AtomILST * ilst) +{ + atom_header_set (&ilst->header, FOURCC_ilst, 0, 0); + ilst->entries = NULL; +} + +static AtomILST * +atom_ilst_new (void) +{ + AtomILST *ilst = g_new0 (AtomILST, 1); + + atom_ilst_init (ilst); + return ilst; +} + +static void +atom_ilst_free (AtomILST * ilst) +{ + if (ilst->entries) + atom_info_list_free (ilst->entries); + atom_clear (&ilst->header); + g_free (ilst); +} + +static void +atom_meta_init (AtomMETA * meta) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&meta->header, FOURCC_meta, 0, 0, 0, flags); + atom_hdlr_init (&meta->hdlr); + /* FIXME (ISOM says this is always 0) */ + meta->hdlr.component_type = FOURCC_mhlr; + meta->hdlr.handler_type = FOURCC_mdir; + meta->ilst = NULL; +} + +static AtomMETA * +atom_meta_new (void) +{ + AtomMETA *meta = g_new0 (AtomMETA, 1); + + atom_meta_init (meta); + return meta; +} + +static void +atom_meta_free (AtomMETA * meta) +{ + atom_full_clear (&meta->header); + atom_hdlr_clear (&meta->hdlr); + if (meta->ilst) + atom_ilst_free (meta->ilst); + meta->ilst = NULL; + g_free (meta); +} + +static void +atom_udta_init (AtomUDTA * udta) +{ + atom_header_set (&udta->header, FOURCC_udta, 0, 0); + udta->meta = NULL; +} + +static AtomUDTA * +atom_udta_new (void) +{ + AtomUDTA *udta = g_new0 (AtomUDTA, 1); + + atom_udta_init (udta); + return udta; +} + +static void +atom_udta_free (AtomUDTA * udta) +{ + atom_clear (&udta->header); + if (udta->meta) + atom_meta_free (udta->meta); + udta->meta = NULL; + if (udta->entries) + atom_info_list_free (udta->entries); + g_free (udta); +} + +static void +atom_tag_data_init (AtomTagData * data) +{ + guint8 flags[] = { 0, 0, 0 }; + + atom_full_init (&data->header, FOURCC_data, 0, 0, 0, flags); +} + +static void +atom_tag_data_clear (AtomTagData * data) +{ + atom_full_clear (&data->header); + g_free (data->data); + data->datalen = 0; +} + +/* + * Fourcc is the tag fourcc + * flags will be truncated to 24bits + */ +static AtomTag * +atom_tag_new (guint32 fourcc, guint32 flags_as_uint) +{ + AtomTag *tag = g_new0 (AtomTag, 1); + + tag->header.type = fourcc; + atom_tag_data_init (&tag->data); + atom_full_set_flags_as_uint (&tag->data.header, flags_as_uint); + return tag; +} + +static void +atom_tag_free (AtomTag * tag) +{ + atom_clear (&tag->header); + atom_tag_data_clear (&tag->data); + g_free (tag); +} + +static void +atom_mvhd_init (AtomMVHD * mvhd) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&(mvhd->header), FOURCC_mvhd, sizeof (AtomMVHD), 0, 0, flags); + + common_time_info_init (&mvhd->time_info); + + mvhd->prefered_rate = 1 << 16; + mvhd->volume = 1 << 8; + mvhd->reserved3 = 0; + memset (mvhd->reserved4, 0, sizeof (guint32[2])); + + memset (mvhd->matrix, 0, sizeof (guint32[9])); + mvhd->matrix[0] = 1 << 16; + mvhd->matrix[4] = 1 << 16; + mvhd->matrix[8] = 16384 << 16; + + mvhd->preview_time = 0; + mvhd->preview_duration = 0; + mvhd->poster_time = 0; + mvhd->selection_time = 0; + mvhd->selection_duration = 0; + mvhd->current_time = 0; + + mvhd->next_track_id = 1; +} + +static void +atom_mvhd_clear (AtomMVHD * mvhd) +{ + atom_full_clear (&mvhd->header); +} + +static void +atom_mehd_init (AtomMEHD * mehd) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&mehd->header, FOURCC_mehd, 0, 0, 1, flags); + mehd->fragment_duration = 0; +} + +static void +atom_mvex_init (AtomMVEX * mvex) +{ + atom_header_set (&mvex->header, FOURCC_mvex, 0, 0); + atom_mehd_init (&mvex->mehd); + mvex->trexs = NULL; +} + +static void +atom_moov_init (AtomMOOV * moov, AtomsContext * context) +{ + atom_header_set (&(moov->header), FOURCC_moov, 0, 0); + atom_mvhd_init (&(moov->mvhd)); + atom_mvex_init (&(moov->mvex)); + moov->udta = NULL; + moov->traks = NULL; + moov->context = *context; +} + +AtomMOOV * +atom_moov_new (AtomsContext * context) +{ + AtomMOOV *moov = g_new0 (AtomMOOV, 1); + + atom_moov_init (moov, context); + return moov; +} + +static void +atom_trex_free (AtomTREX * trex) +{ + atom_full_clear (&trex->header); + g_free (trex); +} + +static void +atom_mvex_clear (AtomMVEX * mvex) +{ + GList *walker; + + atom_clear (&mvex->header); + walker = mvex->trexs; + while (walker) { + atom_trex_free ((AtomTREX *) walker->data); + walker = g_list_next (walker); + } + g_list_free (mvex->trexs); + mvex->trexs = NULL; +} + +void +atom_moov_free (AtomMOOV * moov) +{ + GList *walker; + + atom_clear (&moov->header); + atom_mvhd_clear (&moov->mvhd); + + walker = moov->traks; + while (walker) { + atom_trak_free ((AtomTRAK *) walker->data); + walker = g_list_next (walker); + } + g_list_free (moov->traks); + moov->traks = NULL; + + if (moov->udta) { + atom_udta_free (moov->udta); + moov->udta = NULL; + } + + atom_mvex_clear (&moov->mvex); + + g_free (moov); +} + +/* -- end of init / free -- */ + +/* -- copy data functions -- */ + +static guint8 +atom_full_get_version (AtomFull * full) +{ + return full->version; +} + +static guint64 +common_time_info_copy_data (TimeInfo * ti, gboolean trunc_to_32, + guint8 ** buffer, guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (trunc_to_32) { + prop_copy_uint32 ((guint32) ti->creation_time, buffer, size, offset); + prop_copy_uint32 ((guint32) ti->modification_time, buffer, size, offset); + prop_copy_uint32 (ti->timescale, buffer, size, offset); + prop_copy_uint32 ((guint32) ti->duration, buffer, size, offset); + } else { + prop_copy_uint64 (ti->creation_time, buffer, size, offset); + prop_copy_uint64 (ti->modification_time, buffer, size, offset); + prop_copy_uint32 (ti->timescale, buffer, size, offset); + prop_copy_uint64 (ti->duration, buffer, size, offset); + } + return *offset - original_offset; +} + +static void +atom_write_size (guint8 ** buffer, guint64 * size, guint64 * offset, + guint64 atom_pos) +{ + /* this only works for non-extended atom size, which is OK + * (though it could be made to do mem_move, etc and write extended size) */ + prop_copy_uint32 (*offset - atom_pos, buffer, size, &atom_pos); +} + +guint64 +atom_copy_data (Atom * atom, guint8 ** buffer, guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + /* copies type and size */ + prop_copy_uint32 (atom->size, buffer, size, offset); + prop_copy_fourcc (atom->type, buffer, size, offset); + + /* extended size needed */ + if (atom->size == 1) { + /* really should not happen other than with mdat atom; + * would be a problem for size (re)write code, not to mention memory */ + g_return_val_if_fail (atom->type == FOURCC_mdat, 0); + prop_copy_uint64 (atom->extended_size, buffer, size, offset); + } + + return *offset - original_offset; +} + +static guint64 +atom_full_copy_data (AtomFull * atom, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&atom->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint8 (atom->version, buffer, size, offset); + prop_copy_uint8_array (atom->flags, 3, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_info_list_copy_data (GList * ai, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + while (ai) { + AtomInfo *info = (AtomInfo *) ai->data; + + if (!info->copy_data_func (info->atom, buffer, size, offset)) { + return 0; + } + ai = g_list_next (ai); + } + + return *offset - original_offset; +} + +static guint64 +atom_data_copy_data (AtomData * data, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&data->header, buffer, size, offset)) { + return 0; + } + if (data->datalen) + prop_copy_uint8_array (data->data, data->datalen, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_uuid_copy_data (AtomUUID * uuid, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&uuid->header, buffer, size, offset)) { + return 0; + } + prop_copy_uint8_array (uuid->uuid, 16, buffer, size, offset); + if (uuid->datalen) + prop_copy_uint8_array (uuid->data, uuid->datalen, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_ftyp_copy_data (AtomFTYP * ftyp, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&ftyp->header, buffer, size, offset)) { + return 0; + } + prop_copy_fourcc (ftyp->major_brand, buffer, size, offset); + prop_copy_uint32 (ftyp->version, buffer, size, offset); + + prop_copy_fourcc_array (ftyp->compatible_brands, ftyp->compatible_brands_size, + buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_mvhd_copy_data (AtomMVHD * atom, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint8 version; + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&(atom->header), buffer, size, offset)) { + return 0; + } + + version = atom_full_get_version (&(atom->header)); + if (version == 0) { + common_time_info_copy_data (&atom->time_info, TRUE, buffer, size, offset); + } else if (version == 1) { + common_time_info_copy_data (&atom->time_info, FALSE, buffer, size, offset); + } else { + *offset = original_offset; + return 0; + } + + prop_copy_uint32 (atom->prefered_rate, buffer, size, offset); + prop_copy_uint16 (atom->volume, buffer, size, offset); + prop_copy_uint16 (atom->reserved3, buffer, size, offset); + prop_copy_uint32_array (atom->reserved4, 2, buffer, size, offset); + prop_copy_uint32_array (atom->matrix, 9, buffer, size, offset); + prop_copy_uint32 (atom->preview_time, buffer, size, offset); + prop_copy_uint32 (atom->preview_duration, buffer, size, offset); + prop_copy_uint32 (atom->poster_time, buffer, size, offset); + prop_copy_uint32 (atom->selection_time, buffer, size, offset); + prop_copy_uint32 (atom->selection_duration, buffer, size, offset); + prop_copy_uint32 (atom->current_time, buffer, size, offset); + + prop_copy_uint32 (atom->next_track_id, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_tkhd_copy_data (AtomTKHD * tkhd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&tkhd->header, buffer, size, offset)) { + return 0; + } + + if (atom_full_get_version (&tkhd->header) == 0) { + prop_copy_uint32 ((guint32) tkhd->creation_time, buffer, size, offset); + prop_copy_uint32 ((guint32) tkhd->modification_time, buffer, size, offset); + prop_copy_uint32 (tkhd->track_ID, buffer, size, offset); + prop_copy_uint32 (tkhd->reserved, buffer, size, offset); + prop_copy_uint32 ((guint32) tkhd->duration, buffer, size, offset); + } else { + prop_copy_uint64 (tkhd->creation_time, buffer, size, offset); + prop_copy_uint64 (tkhd->modification_time, buffer, size, offset); + prop_copy_uint32 (tkhd->track_ID, buffer, size, offset); + prop_copy_uint32 (tkhd->reserved, buffer, size, offset); + prop_copy_uint64 (tkhd->duration, buffer, size, offset); + } + + prop_copy_uint32_array (tkhd->reserved2, 2, buffer, size, offset); + prop_copy_uint16 (tkhd->layer, buffer, size, offset); + prop_copy_uint16 (tkhd->alternate_group, buffer, size, offset); + prop_copy_uint16 (tkhd->volume, buffer, size, offset); + prop_copy_uint16 (tkhd->reserved3, buffer, size, offset); + prop_copy_uint32_array (tkhd->matrix, 9, buffer, size, offset); + + prop_copy_uint32 (tkhd->width, buffer, size, offset); + prop_copy_uint32 (tkhd->height, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_hdlr_copy_data (AtomHDLR * hdlr, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&hdlr->header, buffer, size, offset)) { + return 0; + } + + prop_copy_fourcc (hdlr->component_type, buffer, size, offset); + prop_copy_fourcc (hdlr->handler_type, buffer, size, offset); + prop_copy_fourcc (hdlr->manufacturer, buffer, size, offset); + prop_copy_uint32 (hdlr->flags, buffer, size, offset); + prop_copy_uint32 (hdlr->flags_mask, buffer, size, offset); + + prop_copy_size_string ((guint8 *) hdlr->name, strlen (hdlr->name), buffer, + size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_vmhd_copy_data (AtomVMHD * vmhd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&vmhd->header, buffer, size, offset)) { + return 0; + } + prop_copy_uint16 (vmhd->graphics_mode, buffer, size, offset); + prop_copy_uint16_array (vmhd->opcolor, 3, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return original_offset - *offset; +} + +static guint64 +atom_smhd_copy_data (AtomSMHD * smhd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&smhd->header, buffer, size, offset)) { + return 0; + } + prop_copy_uint16 (smhd->balance, buffer, size, offset); + prop_copy_uint16 (smhd->reserved, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return original_offset - *offset; +} + +static guint64 +atom_hmhd_copy_data (AtomHMHD * hmhd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&hmhd->header, buffer, size, offset)) { + return 0; + } + prop_copy_uint16 (hmhd->max_pdu_size, buffer, size, offset); + prop_copy_uint16 (hmhd->avg_pdu_size, buffer, size, offset); + prop_copy_uint32 (hmhd->max_bitrate, buffer, size, offset); + prop_copy_uint32 (hmhd->avg_bitrate, buffer, size, offset); + prop_copy_uint32 (hmhd->sliding_avg_bitrate, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return original_offset - *offset; +} + +static gboolean +atom_url_same_file_flag (AtomURL * url) +{ + return (url->header.flags[2] & 0x1) == 1; +} + +static guint64 +atom_url_copy_data (AtomURL * url, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&url->header, buffer, size, offset)) { + return 0; + } + + if (!atom_url_same_file_flag (url)) { + prop_copy_null_terminated_string (url->location, buffer, size, offset); + } + + atom_write_size (buffer, size, offset, original_offset); + return original_offset - *offset; +} + +guint64 +atom_stts_copy_data (AtomSTTS * stts, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint i; + + if (!atom_full_copy_data (&stts->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (atom_array_get_len (&stts->entries), buffer, size, offset); + /* minimize realloc */ + prop_copy_ensure_buffer (buffer, size, offset, + 8 * atom_array_get_len (&stts->entries)); + for (i = 0; i < atom_array_get_len (&stts->entries); i++) { + STTSEntry *entry = &atom_array_index (&stts->entries, i); + + prop_copy_uint32 (entry->sample_count, buffer, size, offset); + prop_copy_int32 (entry->sample_delta, buffer, size, offset); + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_sample_entry_copy_data (SampleTableEntry * se, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&se->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint8_array (se->reserved, 6, buffer, size, offset); + prop_copy_uint16 (se->data_reference_index, buffer, size, offset); + + return *offset - original_offset; +} + +static guint64 +atom_esds_copy_data (AtomESDS * esds, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&esds->header, buffer, size, offset)) { + return 0; + } + if (!desc_es_descriptor_copy_data (&esds->es, buffer, size, offset)) { + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_frma_copy_data (AtomFRMA * frma, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&(frma->header), buffer, size, offset)) + return 0; + + prop_copy_fourcc (frma->media_type, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_mp4s_copy_data (SampleTableEntryMP4S * mp4s, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_sample_entry_copy_data (&mp4s->se, buffer, size, offset)) { + return 0; + } + if (!atom_esds_copy_data (&mp4s->es, buffer, size, offset)) { + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_hint_sample_entry_copy_data (AtomHintSampleEntry * hse, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_sample_entry_copy_data (&hse->se, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (hse->size, buffer, size, offset); + prop_copy_uint8_array (hse->data, hse->size, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +sample_entry_mp4a_copy_data (SampleTableEntryMP4A * mp4a, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_sample_entry_copy_data (&mp4a->se, buffer, size, offset)) { + return 0; + } + + prop_copy_uint16 (mp4a->version, buffer, size, offset); + prop_copy_uint16 (mp4a->revision_level, buffer, size, offset); + prop_copy_uint32 (mp4a->vendor, buffer, size, offset); + prop_copy_uint16 (mp4a->channels, buffer, size, offset); + prop_copy_uint16 (mp4a->sample_size, buffer, size, offset); + prop_copy_uint16 (mp4a->compression_id, buffer, size, offset); + prop_copy_uint16 (mp4a->packet_size, buffer, size, offset); + prop_copy_uint32 (mp4a->sample_rate, buffer, size, offset); + + /* this should always be 0 for mp4 flavor */ + if (mp4a->version == 1) { + prop_copy_uint32 (mp4a->samples_per_packet, buffer, size, offset); + prop_copy_uint32 (mp4a->bytes_per_packet, buffer, size, offset); + prop_copy_uint32 (mp4a->bytes_per_frame, buffer, size, offset); + prop_copy_uint32 (mp4a->bytes_per_sample, buffer, size, offset); + } + + if (mp4a->extension_atoms) { + if (!atom_info_list_copy_data (mp4a->extension_atoms, buffer, size, offset)) + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +sample_entry_mp4v_copy_data (SampleTableEntryMP4V * mp4v, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_sample_entry_copy_data (&mp4v->se, buffer, size, offset)) { + return 0; + } + + prop_copy_uint16 (mp4v->version, buffer, size, offset); + prop_copy_uint16 (mp4v->revision_level, buffer, size, offset); + prop_copy_fourcc (mp4v->vendor, buffer, size, offset); + prop_copy_uint32 (mp4v->temporal_quality, buffer, size, offset); + prop_copy_uint32 (mp4v->spatial_quality, buffer, size, offset); + + prop_copy_uint16 (mp4v->width, buffer, size, offset); + prop_copy_uint16 (mp4v->height, buffer, size, offset); + + prop_copy_uint32 (mp4v->horizontal_resolution, buffer, size, offset); + prop_copy_uint32 (mp4v->vertical_resolution, buffer, size, offset); + prop_copy_uint32 (mp4v->datasize, buffer, size, offset); + + prop_copy_uint16 (mp4v->frame_count, buffer, size, offset); + + prop_copy_fixed_size_string ((guint8 *) mp4v->compressor, 32, buffer, size, + offset); + + prop_copy_uint16 (mp4v->depth, buffer, size, offset); + prop_copy_uint16 (mp4v->color_table_id, buffer, size, offset); + + /* extra atoms */ + if (mp4v->extension_atoms && + !atom_info_list_copy_data (mp4v->extension_atoms, buffer, size, offset)) + return 0; + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_stsz_copy_data (AtomSTSZ * stsz, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint i; + + if (!atom_full_copy_data (&stsz->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (stsz->sample_size, buffer, size, offset); + prop_copy_uint32 (stsz->table_size, buffer, size, offset); + if (stsz->sample_size == 0) { + /* minimize realloc */ + prop_copy_ensure_buffer (buffer, size, offset, 4 * stsz->table_size); + /* entry count must match sample count */ + g_assert (atom_array_get_len (&stsz->entries) == stsz->table_size); + for (i = 0; i < atom_array_get_len (&stsz->entries); i++) { + prop_copy_uint32 (atom_array_index (&stsz->entries, i), buffer, size, + offset); + } + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_stsc_copy_data (AtomSTSC * stsc, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint i; + + if (!atom_full_copy_data (&stsc->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (atom_array_get_len (&stsc->entries), buffer, size, offset); + /* minimize realloc */ + prop_copy_ensure_buffer (buffer, size, offset, + 12 * atom_array_get_len (&stsc->entries)); + + for (i = 0; i < atom_array_get_len (&stsc->entries); i++) { + STSCEntry *entry = &atom_array_index (&stsc->entries, i); + + prop_copy_uint32 (entry->first_chunk, buffer, size, offset); + prop_copy_uint32 (entry->samples_per_chunk, buffer, size, offset); + prop_copy_uint32 (entry->sample_description_index, buffer, size, offset); + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_ctts_copy_data (AtomCTTS * ctts, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint i; + + if (!atom_full_copy_data (&ctts->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (atom_array_get_len (&ctts->entries), buffer, size, offset); + /* minimize realloc */ + prop_copy_ensure_buffer (buffer, size, offset, + 8 * atom_array_get_len (&ctts->entries)); + for (i = 0; i < atom_array_get_len (&ctts->entries); i++) { + CTTSEntry *entry = &atom_array_index (&ctts->entries, i); + + prop_copy_uint32 (entry->samplecount, buffer, size, offset); + prop_copy_uint32 (entry->sampleoffset, buffer, size, offset); + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_stco64_copy_data (AtomSTCO64 * stco64, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint i; + gboolean trunc_to_32 = stco64->header.header.type == FOURCC_stco; + + if (!atom_full_copy_data (&stco64->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (atom_array_get_len (&stco64->entries), buffer, size, + offset); + + /* minimize realloc */ + prop_copy_ensure_buffer (buffer, size, offset, + 8 * atom_array_get_len (&stco64->entries)); + for (i = 0; i < atom_array_get_len (&stco64->entries); i++) { + guint64 *value = &atom_array_index (&stco64->entries, i); + + if (trunc_to_32) { + prop_copy_uint32 ((guint32) * value, buffer, size, offset); + } else { + prop_copy_uint64 (*value, buffer, size, offset); + } + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_stss_copy_data (AtomSTSS * stss, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint i; + + if (atom_array_get_len (&stss->entries) == 0) { + /* FIXME not needing this atom might be confused with error while copying */ + return 0; + } + + if (!atom_full_copy_data (&stss->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (atom_array_get_len (&stss->entries), buffer, size, offset); + /* minimize realloc */ + prop_copy_ensure_buffer (buffer, size, offset, + 4 * atom_array_get_len (&stss->entries)); + for (i = 0; i < atom_array_get_len (&stss->entries); i++) { + prop_copy_uint32 (atom_array_index (&stss->entries, i), buffer, size, + offset); + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_stsd_copy_data (AtomSTSD * stsd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + GList *walker; + + if (!atom_full_copy_data (&stsd->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (stsd->n_entries, buffer, size, offset); + + for (walker = g_list_last (stsd->entries); walker != NULL; + walker = g_list_previous (walker)) { + SampleTableEntry *se = (SampleTableEntry *) walker->data; + + switch (((Atom *) walker->data)->type) { + case FOURCC_mp4a: + if (!sample_entry_mp4a_copy_data ((SampleTableEntryMP4A *) walker->data, + buffer, size, offset)) { + return 0; + } + break; + case FOURCC_mp4s: + if (!atom_mp4s_copy_data ((SampleTableEntryMP4S *) walker->data, + buffer, size, offset)) { + return 0; + } + break; + case FOURCC_mp4v: + if (!sample_entry_mp4v_copy_data ((SampleTableEntryMP4V *) walker->data, + buffer, size, offset)) { + return 0; + } + break; + default: + if (se->kind == VIDEO) { + if (!sample_entry_mp4v_copy_data ((SampleTableEntryMP4V *) + walker->data, buffer, size, offset)) { + return 0; + } + } else if (se->kind == AUDIO) { + if (!sample_entry_mp4a_copy_data ((SampleTableEntryMP4A *) + walker->data, buffer, size, offset)) { + return 0; + } + } else { + if (!atom_hint_sample_entry_copy_data ( + (AtomHintSampleEntry *) walker->data, buffer, size, offset)) { + return 0; + } + } + break; + } + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_stbl_copy_data (AtomSTBL * stbl, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&stbl->header, buffer, size, offset)) { + return 0; + } + + if (!atom_stsd_copy_data (&stbl->stsd, buffer, size, offset)) { + return 0; + } + if (!atom_stts_copy_data (&stbl->stts, buffer, size, offset)) { + return 0; + } + /* this atom is optional, so let's check if we need it + * (to avoid false error) */ + if (atom_array_get_len (&stbl->stss.entries)) { + if (!atom_stss_copy_data (&stbl->stss, buffer, size, offset)) { + return 0; + } + } + + if (!atom_stsc_copy_data (&stbl->stsc, buffer, size, offset)) { + return 0; + } + if (!atom_stsz_copy_data (&stbl->stsz, buffer, size, offset)) { + return 0; + } + if (stbl->ctts && stbl->ctts->do_pts) { + if (!atom_ctts_copy_data (stbl->ctts, buffer, size, offset)) { + return 0; + } + } + if (!atom_stco64_copy_data (&stbl->stco64, buffer, size, offset)) { + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return original_offset - *offset; +} + + +static guint64 +atom_dref_copy_data (AtomDREF * dref, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + GList *walker; + + if (!atom_full_copy_data (&dref->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (g_list_length (dref->entries), buffer, size, offset); + + walker = dref->entries; + while (walker != NULL) { + Atom *atom = (Atom *) walker->data; + + if (atom->type == FOURCC_url_) { + atom_url_copy_data ((AtomURL *) atom, buffer, size, offset); + } else if (atom->type == FOURCC_alis) { + atom_full_copy_data ((AtomFull *) atom, buffer, size, offset); + } else { + g_error ("Unsupported atom used inside dref atom"); + } + walker = g_list_next (walker); + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_dinf_copy_data (AtomDINF * dinf, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&dinf->header, buffer, size, offset)) { + return 0; + } + + if (!atom_dref_copy_data (&dinf->dref, buffer, size, offset)) { + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return original_offset - *offset; +} + +static guint64 +atom_minf_copy_data (AtomMINF * minf, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&minf->header, buffer, size, offset)) { + return 0; + } + + if (minf->vmhd) { + if (!atom_vmhd_copy_data (minf->vmhd, buffer, size, offset)) { + return 0; + } + } else if (minf->smhd) { + if (!atom_smhd_copy_data (minf->smhd, buffer, size, offset)) { + return 0; + } + } else if (minf->hmhd) { + if (!atom_hmhd_copy_data (minf->hmhd, buffer, size, offset)) { + return 0; + } + } + + if (minf->hdlr) { + if (!atom_hdlr_copy_data (minf->hdlr, buffer, size, offset)) { + return 0; + } + } + + if (!atom_dinf_copy_data (&minf->dinf, buffer, size, offset)) { + return 0; + } + if (!atom_stbl_copy_data (&minf->stbl, buffer, size, offset)) { + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_mdhd_copy_data (AtomMDHD * mdhd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&mdhd->header, buffer, size, offset)) { + return 0; + } + + if (!common_time_info_copy_data (&mdhd->time_info, + atom_full_get_version (&mdhd->header) == 0, buffer, size, offset)) { + return 0; + } + + prop_copy_uint16 (mdhd->language_code, buffer, size, offset); + prop_copy_uint16 (mdhd->quality, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_mdia_copy_data (AtomMDIA * mdia, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&mdia->header, buffer, size, offset)) { + return 0; + } + if (!atom_mdhd_copy_data (&mdia->mdhd, buffer, size, offset)) { + return 0; + } + if (!atom_hdlr_copy_data (&mdia->hdlr, buffer, size, offset)) { + return 0; + } + + if (!atom_minf_copy_data (&mdia->minf, buffer, size, offset)) { + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_elst_copy_data (AtomELST * elst, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + GSList *walker; + + if (!atom_full_copy_data (&elst->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (g_slist_length (elst->entries), buffer, size, offset); + + for (walker = elst->entries; walker != NULL; walker = g_slist_next (walker)) { + EditListEntry *entry = (EditListEntry *) walker->data; + prop_copy_uint32 (entry->duration, buffer, size, offset); + prop_copy_uint32 (entry->media_time, buffer, size, offset); + prop_copy_uint32 (entry->media_rate, buffer, size, offset); + } + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_edts_copy_data (AtomEDTS * edts, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&(edts->header), buffer, size, offset)) + return 0; + + if (!atom_elst_copy_data (&(edts->elst), buffer, size, offset)) + return 0; + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_trak_copy_data (AtomTRAK * trak, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&trak->header, buffer, size, offset)) { + return 0; + } + if (!atom_tkhd_copy_data (&trak->tkhd, buffer, size, offset)) { + return 0; + } + if (trak->edts) { + if (!atom_edts_copy_data (trak->edts, buffer, size, offset)) { + return 0; + } + } + + if (!atom_mdia_copy_data (&trak->mdia, buffer, size, offset)) { + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_tag_data_copy_data (AtomTagData * data, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&data->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (data->reserved, buffer, size, offset); + prop_copy_uint8_array (data->data, data->datalen, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_tag_copy_data (AtomTag * tag, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&tag->header, buffer, size, offset)) { + return 0; + } + + if (!atom_tag_data_copy_data (&tag->data, buffer, size, offset)) { + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_ilst_copy_data (AtomILST * ilst, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&ilst->header, buffer, size, offset)) { + return 0; + } + /* extra atoms */ + if (ilst->entries && + !atom_info_list_copy_data (ilst->entries, buffer, size, offset)) + return 0; + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_meta_copy_data (AtomMETA * meta, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&meta->header, buffer, size, offset)) { + return 0; + } + if (!atom_hdlr_copy_data (&meta->hdlr, buffer, size, offset)) { + return 0; + } + if (meta->ilst) { + if (!atom_ilst_copy_data (meta->ilst, buffer, size, offset)) { + return 0; + } + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_udta_copy_data (AtomUDTA * udta, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&udta->header, buffer, size, offset)) { + return 0; + } + if (udta->meta) { + if (!atom_meta_copy_data (udta->meta, buffer, size, offset)) { + return 0; + } + } + if (udta->entries) { + /* extra atoms */ + if (!atom_info_list_copy_data (udta->entries, buffer, size, offset)) + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_mehd_copy_data (AtomMEHD * mehd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&mehd->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint64 (mehd->fragment_duration, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_trex_copy_data (AtomTREX * trex, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&trex->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (trex->track_ID, buffer, size, offset); + prop_copy_uint32 (trex->default_sample_description_index, buffer, size, + offset); + prop_copy_uint32 (trex->default_sample_duration, buffer, size, offset); + prop_copy_uint32 (trex->default_sample_size, buffer, size, offset); + prop_copy_uint32 (trex->default_sample_flags, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_mvex_copy_data (AtomMVEX * mvex, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + GList *walker; + + if (!atom_copy_data (&mvex->header, buffer, size, offset)) { + return 0; + } + + if (!atom_mehd_copy_data (&mvex->mehd, buffer, size, offset)) { + return 0; + } + + walker = g_list_first (mvex->trexs); + while (walker != NULL) { + if (!atom_trex_copy_data ((AtomTREX *) walker->data, buffer, size, offset)) { + return 0; + } + walker = g_list_next (walker); + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +guint64 +atom_moov_copy_data (AtomMOOV * atom, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + GList *walker; + + if (!atom_copy_data (&(atom->header), buffer, size, offset)) + return 0; + + if (!atom_mvhd_copy_data (&(atom->mvhd), buffer, size, offset)) + return 0; + + walker = g_list_first (atom->traks); + while (walker != NULL) { + if (!atom_trak_copy_data ((AtomTRAK *) walker->data, buffer, size, offset)) { + return 0; + } + walker = g_list_next (walker); + } + + if (atom->udta) { + if (!atom_udta_copy_data (atom->udta, buffer, size, offset)) { + return 0; + } + } + + if (atom->fragmented) { + if (!atom_mvex_copy_data (&atom->mvex, buffer, size, offset)) { + return 0; + } + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_wave_copy_data (AtomWAVE * wave, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_copy_data (&(wave->header), buffer, size, offset)) + return 0; + + if (wave->extension_atoms) { + if (!atom_info_list_copy_data (wave->extension_atoms, buffer, size, offset)) + return 0; + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +/* -- end of copy data functions -- */ + +/* -- general functions, API and support functions */ + +/* add samples to tables */ + +static void +atom_stsc_add_new_entry (AtomSTSC * stsc, guint32 first_chunk, guint32 nsamples) +{ + STSCEntry nentry; + gint len; + + if ((len = atom_array_get_len (&stsc->entries)) && + ((atom_array_index (&stsc->entries, len - 1)).samples_per_chunk == + nsamples)) + return; + + nentry.first_chunk = first_chunk; + nentry.samples_per_chunk = nsamples; + nentry.sample_description_index = 1; + atom_array_append (&stsc->entries, nentry, 128); +} + +static void +atom_stts_add_entry (AtomSTTS * stts, guint32 sample_count, gint32 sample_delta) +{ + STTSEntry *entry = NULL; + + if (G_LIKELY (atom_array_get_len (&stts->entries) != 0)) + entry = &atom_array_index (&stts->entries, + atom_array_get_len (&stts->entries) - 1); + + if (entry && entry->sample_delta == sample_delta) { + entry->sample_count += sample_count; + } else { + STTSEntry nentry; + + nentry.sample_count = sample_count; + nentry.sample_delta = sample_delta; + atom_array_append (&stts->entries, nentry, 256); + } +} + +static void +atom_stsz_add_entry (AtomSTSZ * stsz, guint32 nsamples, guint32 size) +{ + guint32 i; + + stsz->table_size += nsamples; + if (stsz->sample_size != 0) { + /* it is constant size, we don't need entries */ + return; + } + for (i = 0; i < nsamples; i++) { + atom_array_append (&stsz->entries, size, 1024); + } +} + +static guint32 +atom_stco64_get_entry_count (AtomSTCO64 * stco64) +{ + return atom_array_get_len (&stco64->entries); +} + +static void +atom_stco64_add_entry (AtomSTCO64 * stco64, guint64 entry) +{ + atom_array_append (&stco64->entries, entry, 256); + if (entry > G_MAXUINT32) + stco64->header.header.type = FOURCC_co64; +} + +static void +atom_stss_add_entry (AtomSTSS * stss, guint32 sample) +{ + atom_array_append (&stss->entries, sample, 512); +} + +static void +atom_stbl_add_stss_entry (AtomSTBL * stbl) +{ + guint32 sample_index = stbl->stsz.table_size; + + atom_stss_add_entry (&stbl->stss, sample_index); +} + +static void +atom_ctts_add_entry (AtomCTTS * ctts, guint32 nsamples, guint32 offset) +{ + CTTSEntry *entry = NULL; + + if (G_LIKELY (atom_array_get_len (&ctts->entries) != 0)) + entry = &atom_array_index (&ctts->entries, + atom_array_get_len (&ctts->entries) - 1); + + if (entry == NULL || entry->sampleoffset != offset) { + CTTSEntry nentry; + + nentry.samplecount = nsamples; + nentry.sampleoffset = offset; + atom_array_append (&ctts->entries, nentry, 256); + if (offset != 0) + ctts->do_pts = TRUE; + } else { + entry->samplecount += nsamples; + } +} + +static void +atom_stbl_add_ctts_entry (AtomSTBL * stbl, guint32 nsamples, guint32 offset) +{ + if (stbl->ctts == NULL) { + stbl->ctts = atom_ctts_new (); + } + atom_ctts_add_entry (stbl->ctts, nsamples, offset); +} + +void +atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples, guint32 delta, + guint32 size, guint64 chunk_offset, gboolean sync, gint64 pts_offset) +{ + atom_stts_add_entry (&stbl->stts, nsamples, delta); + atom_stsz_add_entry (&stbl->stsz, nsamples, size); + atom_stco64_add_entry (&stbl->stco64, chunk_offset); + atom_stsc_add_new_entry (&stbl->stsc, + atom_stco64_get_entry_count (&stbl->stco64), nsamples); + if (sync) + atom_stbl_add_stss_entry (stbl); + /* always store to arrange for consistent content */ + atom_stbl_add_ctts_entry (stbl, nsamples, pts_offset); +} + +void +atom_trak_add_samples (AtomTRAK * trak, guint32 nsamples, guint32 delta, + guint32 size, guint64 chunk_offset, gboolean sync, gint64 pts_offset) +{ + AtomSTBL *stbl = &trak->mdia.minf.stbl; + atom_stbl_add_samples (stbl, nsamples, delta, size, chunk_offset, sync, + pts_offset); +} + +/* trak and moov molding */ + +guint32 +atom_trak_get_timescale (AtomTRAK * trak) +{ + return trak->mdia.mdhd.time_info.timescale; +} + +guint32 +atom_trak_get_id (AtomTRAK * trak) +{ + return trak->tkhd.track_ID; +} + +static void +atom_trak_set_id (AtomTRAK * trak, guint32 id) +{ + trak->tkhd.track_ID = id; +} + +static void +atom_moov_add_trex (AtomMOOV * moov, AtomTREX * trex) +{ + moov->mvex.trexs = g_list_append (moov->mvex.trexs, trex); +} + +static AtomTREX * +atom_trex_new (AtomTRAK * trak) +{ + guint8 flags[3] = { 0, 0, 0 }; + AtomTREX *trex = g_new0 (AtomTREX, 1); + + atom_full_init (&trex->header, FOURCC_trex, 0, 0, 0, flags); + + trex->track_ID = trak->tkhd.track_ID; + trex->default_sample_description_index = 1; + trex->default_sample_duration = 0; + trex->default_sample_size = 0; + trex->default_sample_flags = 0; + + return trex; +} + +void +atom_moov_add_trak (AtomMOOV * moov, AtomTRAK * trak) +{ + atom_trak_set_id (trak, moov->mvhd.next_track_id++); + moov->traks = g_list_append (moov->traks, trak); + /* additional trak means also new trex */ + atom_moov_add_trex (moov, atom_trex_new (trak)); +} + +static guint64 +atom_trak_get_duration (AtomTRAK * trak) +{ + return trak->tkhd.duration; +} + +static guint64 +atom_stts_get_total_duration (AtomSTTS * stts) +{ + guint i; + guint64 sum = 0; + + for (i = 0; i < atom_array_get_len (&stts->entries); i++) { + STTSEntry *entry = &atom_array_index (&stts->entries, i); + + sum += (guint64) (entry->sample_count) * entry->sample_delta; + } + return sum; +} + +static void +atom_trak_update_duration (AtomTRAK * trak, guint64 moov_timescale) +{ + trak->mdia.mdhd.time_info.duration = + atom_stts_get_total_duration (&trak->mdia.minf.stbl.stts); + if (trak->mdia.mdhd.time_info.timescale != 0) { + trak->tkhd.duration = + gst_util_uint64_scale (trak->mdia.mdhd.time_info.duration, + moov_timescale, trak->mdia.mdhd.time_info.timescale); + } else { + trak->tkhd.duration = 0; + } +} + +static guint32 +atom_moov_get_timescale (AtomMOOV * moov) +{ + return moov->mvhd.time_info.timescale; +} + +void +atom_moov_update_timescale (AtomMOOV * moov, guint32 timescale) +{ + moov->mvhd.time_info.timescale = timescale; +} + +void +atom_moov_update_duration (AtomMOOV * moov) +{ + GList *traks = moov->traks; + guint64 dur, duration = 0; + + while (traks) { + AtomTRAK *trak = (AtomTRAK *) traks->data; + + atom_trak_update_duration (trak, atom_moov_get_timescale (moov)); + dur = atom_trak_get_duration (trak); + if (dur > duration) + duration = dur; + traks = g_list_next (traks); + } + moov->mvhd.time_info.duration = duration; + moov->mvex.mehd.fragment_duration = duration; +} + +void +atom_moov_set_fragmented (AtomMOOV * moov, gboolean fragmented) +{ + moov->fragmented = fragmented; +} + +void +atom_stco64_chunks_add_offset (AtomSTCO64 * stco64, guint32 offset) +{ + guint i; + + for (i = 0; i < atom_array_get_len (&stco64->entries); i++) { + guint64 *value = &atom_array_index (&stco64->entries, i); + + *value += offset; + } +} + +void +atom_moov_chunks_add_offset (AtomMOOV * moov, guint32 offset) +{ + GList *traks = moov->traks; + + while (traks) { + AtomTRAK *trak = (AtomTRAK *) traks->data; + + atom_stco64_chunks_add_offset (&trak->mdia.minf.stbl.stco64, offset); + traks = g_list_next (traks); + } +} + +void +atom_trak_update_bitrates (AtomTRAK * trak, guint32 avg_bitrate, + guint32 max_bitrate) +{ + AtomESDS *esds = NULL; + AtomData *btrt = NULL; + AtomWAVE *wave = NULL; + AtomSTSD *stsd; + GList *iter; + GList *extensioniter = NULL; + + g_return_if_fail (trak != NULL); + + if (avg_bitrate == 0 && max_bitrate == 0) + return; + + stsd = &trak->mdia.minf.stbl.stsd; + for (iter = stsd->entries; iter; iter = g_list_next (iter)) { + SampleTableEntry *entry = iter->data; + + switch (entry->kind) { + case AUDIO:{ + SampleTableEntryMP4A *audioentry = (SampleTableEntryMP4A *) entry; + extensioniter = audioentry->extension_atoms; + break; + } + case VIDEO:{ + SampleTableEntryMP4V *videoentry = (SampleTableEntryMP4V *) entry; + extensioniter = videoentry->extension_atoms; + break; + } + default: + break; + } + } + + for (; extensioniter; extensioniter = g_list_next (extensioniter)) { + AtomInfo *atominfo = extensioniter->data; + if (atominfo->atom->type == FOURCC_esds) { + esds = (AtomESDS *) atominfo->atom; + } else if (atominfo->atom->type == FOURCC_btrt) { + btrt = (AtomData *) atominfo->atom; + } else if (atominfo->atom->type == FOURCC_wave) { + wave = (AtomWAVE *) atominfo->atom; + } + } + + /* wave might have an esds internally */ + if (wave) { + for (extensioniter = wave->extension_atoms; extensioniter; + extensioniter = g_list_next (extensioniter)) { + AtomInfo *atominfo = extensioniter->data; + if (atominfo->atom->type == FOURCC_esds) { + esds = (AtomESDS *) atominfo->atom; + break; + } + } + } + + if (esds) { + if (avg_bitrate && esds->es.dec_conf_desc.avg_bitrate == 0) + esds->es.dec_conf_desc.avg_bitrate = avg_bitrate; + if (max_bitrate && esds->es.dec_conf_desc.max_bitrate == 0) + esds->es.dec_conf_desc.max_bitrate = max_bitrate; + } + if (btrt) { + /* type(4bytes) + size(4bytes) + buffersize(4bytes) + + * maxbitrate(bytes) + avgbitrate(bytes) */ + if (max_bitrate && GST_READ_UINT32_BE (btrt->data + 4) == 0) + GST_WRITE_UINT32_BE (btrt->data + 4, max_bitrate); + if (avg_bitrate && GST_READ_UINT32_BE (btrt->data + 8) == 0) + GST_WRITE_UINT32_BE (btrt->data + 8, avg_bitrate); + } +} + +/* + * Meta tags functions + */ +static void +atom_moov_init_metatags (AtomMOOV * moov, AtomsContext * context) +{ + if (!moov->udta) { + moov->udta = atom_udta_new (); + } + if (context->flavor != ATOMS_TREE_FLAVOR_3GP) { + if (!moov->udta->meta) { + moov->udta->meta = atom_meta_new (); + } + if (!moov->udta->meta->ilst) { + moov->udta->meta->ilst = atom_ilst_new (); + } + } +} + +static void +atom_tag_data_alloc_data (AtomTagData * data, guint size) +{ + if (data->data != NULL) { + g_free (data->data); + } + data->data = g_new0 (guint8, size); + data->datalen = size; +} + +static void +atom_moov_append_tag (AtomMOOV * moov, AtomInfo * tag) +{ + GList **entries; + + atom_moov_init_metatags (moov, &moov->context); + if (moov->udta->meta) + entries = &moov->udta->meta->ilst->entries; + else + entries = &moov->udta->entries; + *entries = g_list_append (*entries, tag); +} + +void +atom_moov_add_tag (AtomMOOV * moov, guint32 fourcc, guint32 flags, + const guint8 * data, guint size) +{ + AtomTag *tag; + AtomTagData *tdata; + + tag = atom_tag_new (fourcc, flags); + tdata = &tag->data; + atom_tag_data_alloc_data (tdata, size); + g_memmove (tdata->data, data, size); + + atom_moov_append_tag (moov, + build_atom_info_wrapper ((Atom *) tag, atom_tag_copy_data, + atom_tag_free)); +} + +void +atom_moov_add_str_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value) +{ + gint len = strlen (value); + + if (len > 0) + atom_moov_add_tag (moov, fourcc, METADATA_TEXT_FLAG, (guint8 *) value, len); +} + +void +atom_moov_add_uint_tag (AtomMOOV * moov, guint32 fourcc, guint32 flags, + guint32 value) +{ + guint8 data[8] = { 0, }; + + if (flags) { + GST_WRITE_UINT16_BE (data, value); + atom_moov_add_tag (moov, fourcc, flags, data, 2); + } else { + GST_WRITE_UINT32_BE (data + 2, value); + atom_moov_add_tag (moov, fourcc, flags, data, 8); + } +} + +void +atom_moov_add_blob_tag (AtomMOOV * moov, guint8 * data, guint size) +{ + AtomData *data_atom; + GstBuffer *buf; + guint len; + guint32 fourcc; + + if (size < 8) + return; + + /* blob is unparsed atom; + * extract size and fourcc, and wrap remainder in data atom */ + len = GST_READ_UINT32_BE (data); + fourcc = GST_READ_UINT32_LE (data + 4); + if (len > size) + return; + + buf = gst_buffer_new (); + GST_BUFFER_SIZE (buf) = len - 8; + GST_BUFFER_DATA (buf) = data + 8; + + data_atom = atom_data_new_from_gst_buffer (fourcc, buf); + gst_buffer_unref (buf); + + atom_moov_append_tag (moov, + build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data, + atom_data_free)); +} + +void +atom_moov_add_3gp_tag (AtomMOOV * moov, guint32 fourcc, guint8 * data, + guint size) +{ + AtomData *data_atom; + GstBuffer *buf; + guint8 *bdata; + + /* need full atom */ + buf = gst_buffer_new_and_alloc (size + 4); + bdata = GST_BUFFER_DATA (buf); + /* full atom: version and flags */ + GST_WRITE_UINT32_BE (bdata, 0); + memcpy (bdata + 4, data, size); + + data_atom = atom_data_new_from_gst_buffer (fourcc, buf); + gst_buffer_unref (buf); + + atom_moov_append_tag (moov, + build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data, + atom_data_free)); +} + +guint16 +language_code (const char *lang) +{ + g_return_val_if_fail (lang != NULL, 0); + g_return_val_if_fail (strlen (lang) == 3, 0); + + return (((lang[0] - 0x60) & 0x1F) << 10) + (((lang[1] - 0x60) & 0x1F) << 5) + + ((lang[2] - 0x60) & 0x1F); +} + +void +atom_moov_add_3gp_str_int_tag (AtomMOOV * moov, guint32 fourcc, + const gchar * value, gint16 ivalue) +{ + gint len = 0, size = 0; + guint8 *data; + + if (value) { + len = strlen (value); + size = len + 3; + } + + if (ivalue >= 0) + size += 2; + + data = g_malloc (size + 3); + /* language tag and null-terminated UTF-8 string */ + if (value) { + GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); + /* include 0 terminator */ + memcpy (data + 2, value, len + 1); + } + /* 16-bit unsigned int if standalone, otherwise 8-bit */ + if (ivalue >= 0) { + if (size == 2) + GST_WRITE_UINT16_BE (data + size - 2, ivalue); + else { + GST_WRITE_UINT8 (data + size - 2, ivalue & 0xFF); + size--; + } + } + + atom_moov_add_3gp_tag (moov, fourcc, data, size); + g_free (data); +} + +void +atom_moov_add_3gp_str_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value) +{ + atom_moov_add_3gp_str_int_tag (moov, fourcc, value, -1); +} + +void +atom_moov_add_3gp_uint_tag (AtomMOOV * moov, guint32 fourcc, guint16 value) +{ + atom_moov_add_3gp_str_int_tag (moov, fourcc, NULL, value); +} + +void +atom_moov_add_xmp_tags (AtomMOOV * moov, GstBuffer * xmpbuffer) +{ + AtomData *data_atom = NULL; + + if (moov->context.flavor == ATOMS_TREE_FLAVOR_MOV) { + if (xmpbuffer) { + data_atom = atom_data_new_from_gst_buffer (FOURCC_XMP_, xmpbuffer); + atom_moov_init_metatags (moov, &moov->context); + moov->udta->entries = g_list_append (moov->udta->entries, + build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data, + atom_data_free)); + } + } else { + GST_DEBUG ("Not adding xmp to moov atom, it is only used in 'mov' format"); + } + +} + +/* + * Functions for specifying media types + */ + +static void +atom_minf_set_audio (AtomMINF * minf) +{ + atom_minf_clear_handlers (minf); + minf->smhd = atom_smhd_new (); +} + +static void +atom_minf_set_video (AtomMINF * minf, AtomsContext * context) +{ + atom_minf_clear_handlers (minf); + minf->vmhd = atom_vmhd_new (context); +} + +static void +atom_hdlr_set_type (AtomHDLR * hdlr, AtomsContext * context, guint32 comp_type, + guint32 hdlr_type) +{ + if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { + hdlr->component_type = comp_type; + } + hdlr->handler_type = hdlr_type; +} + +static void +atom_hdlr_set_name (AtomHDLR * hdlr, const char *name) +{ + if (hdlr->name) + g_free (hdlr->name); + hdlr->name = g_strdup (name); +} + +static void +atom_mdia_set_hdlr_type_audio (AtomMDIA * mdia, AtomsContext * context) +{ + atom_hdlr_set_type (&mdia->hdlr, context, FOURCC_mhlr, FOURCC_soun); + /* Some players (low-end hardware) check for this name, which is what + * QuickTime itself sets */ + atom_hdlr_set_name (&mdia->hdlr, "SoundHandler"); +} + +static void +atom_mdia_set_hdlr_type_video (AtomMDIA * mdia, AtomsContext * context) +{ + atom_hdlr_set_type (&mdia->hdlr, context, FOURCC_mhlr, FOURCC_vide); + /* Some players (low-end hardware) check for this name, which is what + * QuickTime itself sets */ + atom_hdlr_set_name (&mdia->hdlr, "VideoHandler"); +} + +static void +atom_mdia_set_audio (AtomMDIA * mdia, AtomsContext * context) +{ + atom_mdia_set_hdlr_type_audio (mdia, context); + atom_minf_set_audio (&mdia->minf); +} + +static void +atom_mdia_set_video (AtomMDIA * mdia, AtomsContext * context) +{ + atom_mdia_set_hdlr_type_video (mdia, context); + atom_minf_set_video (&mdia->minf, context); +} + +static void +atom_tkhd_set_audio (AtomTKHD * tkhd) +{ + tkhd->volume = 0x0100; + tkhd->width = tkhd->height = 0; +} + +static void +atom_tkhd_set_video (AtomTKHD * tkhd, AtomsContext * context, guint32 width, + guint32 height) +{ + tkhd->volume = 0; + + /* qt and ISO base media do not contradict, and examples agree */ + tkhd->width = width; + tkhd->height = height; +} + +static void +atom_edts_add_entry (AtomEDTS * edts, EditListEntry * entry) +{ + edts->elst.entries = g_slist_append (edts->elst.entries, entry); +} + +/* + * Adds a new entry to this trak edits list + * duration is in the moov's timescale + * media_time is the offset in the media time to start from (media's timescale) + * rate is a 32 bits fixed-point + */ +void +atom_trak_add_elst_entry (AtomTRAK * trak, guint32 duration, guint32 media_time, + guint32 rate) +{ + EditListEntry *entry = g_new (EditListEntry, 1); + + entry->duration = duration; + entry->media_time = media_time; + entry->media_rate = rate; + + if (trak->edts == NULL) { + trak->edts = atom_edts_new (); + } + atom_edts_add_entry (trak->edts, entry); +} + +/* re-negotiation is prevented at top-level, so only 1 entry expected. + * Quite some more care here and elsewhere may be needed to + * support several entries */ +static SampleTableEntryMP4A * +atom_trak_add_audio_entry (AtomTRAK * trak, AtomsContext * context, + guint32 type) +{ + AtomSTSD *stsd = &trak->mdia.minf.stbl.stsd; + SampleTableEntryMP4A *mp4a = sample_entry_mp4a_new (); + + mp4a->se.header.type = type; + mp4a->se.kind = AUDIO; + mp4a->compression_id = -1; + mp4a->se.data_reference_index = 1; + + stsd->entries = g_list_prepend (stsd->entries, mp4a); + stsd->n_entries++; + return mp4a; +} + +static SampleTableEntryMP4V * +atom_trak_add_video_entry (AtomTRAK * trak, AtomsContext * context, + guint32 type) +{ + SampleTableEntryMP4V *mp4v = sample_entry_mp4v_new (context); + AtomSTSD *stsd = &trak->mdia.minf.stbl.stsd; + + mp4v->se.header.type = type; + mp4v->se.kind = VIDEO; + mp4v->se.data_reference_index = 1; + mp4v->horizontal_resolution = 72 << 16; + mp4v->vertical_resolution = 72 << 16; + if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { + mp4v->spatial_quality = 512; + mp4v->temporal_quality = 512; + } + + stsd->entries = g_list_prepend (stsd->entries, mp4v); + stsd->n_entries++; + return mp4v; +} + +static void +atom_trak_set_constant_size_samples (AtomTRAK * trak, guint32 sample_size) +{ + trak->mdia.minf.stbl.stsz.sample_size = sample_size; +} + +static void +atom_trak_set_audio (AtomTRAK * trak, AtomsContext * context) +{ + atom_tkhd_set_audio (&trak->tkhd); + atom_mdia_set_audio (&trak->mdia, context); +} + +static void +atom_trak_set_video (AtomTRAK * trak, AtomsContext * context, guint32 width, + guint32 height) +{ + atom_tkhd_set_video (&trak->tkhd, context, width, height); + atom_mdia_set_video (&trak->mdia, context); +} + +static void +atom_trak_set_audio_commons (AtomTRAK * trak, AtomsContext * context, + guint32 rate) +{ + atom_trak_set_audio (trak, context); + trak->mdia.mdhd.time_info.timescale = rate; +} + +static void +atom_trak_set_video_commons (AtomTRAK * trak, AtomsContext * context, + guint32 rate, guint32 width, guint32 height) +{ + atom_trak_set_video (trak, context, width, height); + trak->mdia.mdhd.time_info.timescale = rate; + trak->tkhd.width = width << 16; + trak->tkhd.height = height << 16; +} + +void +atom_trak_set_audio_type (AtomTRAK * trak, AtomsContext * context, + AudioSampleEntry * entry, guint32 scale, AtomInfo * ext, gint sample_size) +{ + SampleTableEntryMP4A *ste; + + atom_trak_set_audio_commons (trak, context, scale); + atom_stsd_remove_entries (&trak->mdia.minf.stbl.stsd); + ste = atom_trak_add_audio_entry (trak, context, entry->fourcc); + + trak->is_video = FALSE; + trak->is_h264 = FALSE; + + ste->version = entry->version; + ste->compression_id = entry->compression_id; + ste->sample_size = entry->sample_size; + ste->sample_rate = entry->sample_rate << 16; + ste->channels = entry->channels; + + ste->samples_per_packet = entry->samples_per_packet; + ste->bytes_per_sample = entry->bytes_per_sample; + ste->bytes_per_packet = entry->bytes_per_packet; + ste->bytes_per_frame = entry->bytes_per_frame; + + if (ext) + ste->extension_atoms = g_list_prepend (ste->extension_atoms, ext); + + /* 0 size means variable size */ + atom_trak_set_constant_size_samples (trak, sample_size); +} + +static AtomInfo * +build_pasp_extension (AtomTRAK * trak, gint par_width, gint par_height) +{ + AtomData *atom_data; + GstBuffer *buf; + guint8 *data; + + buf = gst_buffer_new_and_alloc (8); + data = GST_BUFFER_DATA (buf); + + /* ihdr = image header box */ + GST_WRITE_UINT32_BE (data, par_width); + GST_WRITE_UINT32_BE (data + 4, par_height); + + atom_data = atom_data_new_from_gst_buffer (FOURCC_pasp, buf); + gst_buffer_unref (buf); + + return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, + atom_data_free); +} + +void +atom_trak_set_video_type (AtomTRAK * trak, AtomsContext * context, + VisualSampleEntry * entry, guint32 scale, GList * ext_atoms_list) +{ + SampleTableEntryMP4V *ste; + gint dwidth, dheight; + gint par_n = 0, par_d = 0; + + if ((entry->par_n != 1 || entry->par_d != 1) && + (entry->par_n != entry->par_d)) { + par_n = entry->par_n; + par_d = entry->par_d; + } + + dwidth = entry->width; + dheight = entry->height; + /* ISO file spec says track header w/h indicates track's visual presentation + * (so this together with pixels w/h implicitly defines PAR) */ + if (par_n && (context->flavor != ATOMS_TREE_FLAVOR_MOV)) { + if (par_n > par_d) { + dwidth = entry->width * par_n / par_d; + dheight = entry->height; + } else { + dwidth = entry->width * par_n / par_d; + dheight = entry->height; + } + } + + atom_trak_set_video_commons (trak, context, scale, dwidth, dheight); + atom_stsd_remove_entries (&trak->mdia.minf.stbl.stsd); + ste = atom_trak_add_video_entry (trak, context, entry->fourcc); + + trak->is_video = TRUE; + trak->is_h264 = (entry->fourcc == FOURCC_avc1); + + ste->version = entry->version; + ste->width = entry->width; + ste->height = entry->height; + ste->depth = entry->depth; + ste->color_table_id = entry->color_table_id; + ste->frame_count = entry->frame_count; + + if (ext_atoms_list) + ste->extension_atoms = g_list_concat (ste->extension_atoms, ext_atoms_list); + + /* QT spec has a pasp extension atom in stsd that can hold PAR */ + if (par_n && (context->flavor == ATOMS_TREE_FLAVOR_MOV)) { + ste->extension_atoms = g_list_append (ste->extension_atoms, + build_pasp_extension (trak, par_n, par_d)); + } +} + +static void +atom_mfhd_init (AtomMFHD * mfhd, guint32 sequence_number) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&(mfhd->header), FOURCC_mfhd, 0, 0, 0, flags); + mfhd->sequence_number = sequence_number; +} + +static void +atom_moof_init (AtomMOOF * moof, AtomsContext * context, + guint32 sequence_number) +{ + atom_header_set (&moof->header, FOURCC_moof, 0, 0); + atom_mfhd_init (&moof->mfhd, sequence_number); + moof->trafs = NULL; +} + +AtomMOOF * +atom_moof_new (AtomsContext * context, guint32 sequence_number) +{ + AtomMOOF *moof = g_new0 (AtomMOOF, 1); + + atom_moof_init (moof, context, sequence_number); + return moof; +} + +static void +atom_trun_free (AtomTRUN * trun) +{ + atom_full_clear (&trun->header); + atom_array_clear (&trun->entries); + g_free (trun); +} + +static void +atom_sdtp_free (AtomSDTP * sdtp) +{ + atom_full_clear (&sdtp->header); + atom_array_clear (&sdtp->entries); + g_free (sdtp); +} + +void +atom_traf_free (AtomTRAF * traf) +{ + GList *walker; + + walker = traf->truns; + while (walker) { + atom_trun_free ((AtomTRUN *) walker->data); + walker = g_list_next (walker); + } + g_list_free (traf->truns); + traf->truns = NULL; + + walker = traf->sdtps; + while (walker) { + atom_sdtp_free ((AtomSDTP *) walker->data); + walker = g_list_next (walker); + } + g_list_free (traf->sdtps); + traf->sdtps = NULL; + + g_free (traf); +} + +void +atom_moof_free (AtomMOOF * moof) +{ + GList *walker; + + walker = moof->trafs; + while (walker) { + atom_traf_free ((AtomTRAF *) walker->data); + walker = g_list_next (walker); + } + g_list_free (moof->trafs); + moof->trafs = NULL; + + g_free (moof); +} + +static guint64 +atom_mfhd_copy_data (AtomMFHD * mfhd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&mfhd->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (mfhd->sequence_number, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_tfhd_copy_data (AtomTFHD * tfhd, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint32 flags; + + if (!atom_full_copy_data (&tfhd->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (tfhd->track_ID, buffer, size, offset); + + flags = atom_full_get_flags_as_uint (&tfhd->header); + + if (flags & TF_BASE_DATA_OFFSET) + prop_copy_uint64 (tfhd->base_data_offset, buffer, size, offset); + if (flags & TF_SAMPLE_DESCRIPTION_INDEX) + prop_copy_uint32 (tfhd->sample_description_index, buffer, size, offset); + if (flags & TF_DEFAULT_SAMPLE_DURATION) + prop_copy_uint32 (tfhd->default_sample_duration, buffer, size, offset); + if (flags & TF_DEFAULT_SAMPLE_SIZE) + prop_copy_uint32 (tfhd->default_sample_size, buffer, size, offset); + if (flags & TF_DEFAULT_SAMPLE_FLAGS) + prop_copy_uint32 (tfhd->default_sample_flags, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_trun_copy_data (AtomTRUN * trun, guint8 ** buffer, guint64 * size, + guint64 * offset, guint32 * data_offset) +{ + guint64 original_offset = *offset; + guint32 flags, i; + + flags = atom_full_get_flags_as_uint (&trun->header); + + /* if first trun in moof, forcibly add data_offset and record + * where it must be written later on */ + if (data_offset && !*data_offset) { + flags |= TR_DATA_OFFSET; + } else { + flags &= ~TR_DATA_OFFSET; + } + + atom_full_set_flags_as_uint (&trun->header, flags); + + if (!atom_full_copy_data (&trun->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (trun->sample_count, buffer, size, offset); + + if (flags & TR_DATA_OFFSET) { + *data_offset = *offset; + prop_copy_int32 (trun->data_offset, buffer, size, offset); + } + if (flags & TR_FIRST_SAMPLE_FLAGS) + prop_copy_uint32 (trun->first_sample_flags, buffer, size, offset); + + for (i = 0; i < atom_array_get_len (&trun->entries); i++) { + TRUNSampleEntry *entry = &atom_array_index (&trun->entries, i); + + if (flags & TR_SAMPLE_DURATION) + prop_copy_uint32 (entry->sample_duration, buffer, size, offset); + if (flags & TR_SAMPLE_SIZE) + prop_copy_uint32 (entry->sample_size, buffer, size, offset); + if (flags & TR_SAMPLE_FLAGS) + prop_copy_uint32 (entry->sample_flags, buffer, size, offset); + if (flags & TR_COMPOSITION_TIME_OFFSETS) + prop_copy_uint32 (entry->sample_composition_time_offset, + buffer, size, offset); + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_sdtp_copy_data (AtomSDTP * sdtp, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!atom_full_copy_data (&sdtp->header, buffer, size, offset)) { + return 0; + } + + /* all entries at once */ + prop_copy_fixed_size_string (&atom_array_index (&sdtp->entries, 0), + atom_array_get_len (&sdtp->entries), buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_traf_copy_data (AtomTRAF * traf, guint8 ** buffer, guint64 * size, + guint64 * offset, guint32 * data_offset) +{ + guint64 original_offset = *offset; + GList *walker; + + if (!atom_copy_data (&traf->header, buffer, size, offset)) { + return 0; + } + if (!atom_tfhd_copy_data (&traf->tfhd, buffer, size, offset)) { + return 0; + } + + walker = g_list_first (traf->truns); + while (walker != NULL) { + if (!atom_trun_copy_data ((AtomTRUN *) walker->data, buffer, size, offset, + data_offset)) { + return 0; + } + walker = g_list_next (walker); + } + + walker = g_list_first (traf->sdtps); + while (walker != NULL) { + if (!atom_sdtp_copy_data ((AtomSDTP *) walker->data, buffer, size, offset)) { + return 0; + } + walker = g_list_next (walker); + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +/* creates moof atom; metadata is written expecting actual buffer data + * is in mdata directly after moof, and is consecutively written per trak */ +guint64 +atom_moof_copy_data (AtomMOOF * moof, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + GList *walker; + guint32 data_offset = 0; + + if (!atom_copy_data (&moof->header, buffer, size, offset)) + return 0; + + if (!atom_mfhd_copy_data (&moof->mfhd, buffer, size, offset)) + return 0; + + walker = g_list_first (moof->trafs); + while (walker != NULL) { + if (!atom_traf_copy_data ((AtomTRAF *) walker->data, buffer, size, offset, + &data_offset)) { + return 0; + } + walker = g_list_next (walker); + } + + atom_write_size (buffer, size, offset, original_offset); + + if (*buffer && data_offset) { + /* first trun needs a data-offset relative to moof start + * = moof size + mdat prefix */ + GST_WRITE_UINT32_BE (*buffer + data_offset, *offset - original_offset + 8); + } + + return *offset - original_offset; +} + +static void +atom_tfhd_init (AtomTFHD * tfhd, guint32 track_ID) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&tfhd->header, FOURCC_tfhd, 0, 0, 0, flags); + tfhd->track_ID = track_ID; + tfhd->base_data_offset = 0; + tfhd->sample_description_index = 1; + tfhd->default_sample_duration = 0; + tfhd->default_sample_size = 0; + tfhd->default_sample_flags = 0; +} + +static void +atom_trun_init (AtomTRUN * trun) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&trun->header, FOURCC_trun, 0, 0, 0, flags); + trun->sample_count = 0; + trun->data_offset = 0; + trun->first_sample_flags = 0; + atom_array_init (&trun->entries, 512); +} + +static AtomTRUN * +atom_trun_new (void) +{ + AtomTRUN *trun = g_new0 (AtomTRUN, 1); + + atom_trun_init (trun); + return trun; +} + +static void +atom_sdtp_init (AtomSDTP * sdtp) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&sdtp->header, FOURCC_sdtp, 0, 0, 0, flags); + atom_array_init (&sdtp->entries, 512); +} + +static AtomSDTP * +atom_sdtp_new (AtomsContext * context) +{ + AtomSDTP *sdtp = g_new0 (AtomSDTP, 1); + + atom_sdtp_init (sdtp); + return sdtp; +} + +static void +atom_traf_add_sdtp (AtomTRAF * traf, AtomSDTP * sdtp) +{ + traf->sdtps = g_list_append (traf->sdtps, sdtp); +} + +static void +atom_sdtp_add_samples (AtomSDTP * sdtp, guint8 val) +{ + /* it does not make much/any sense according to specs, + * but that's how MS isml samples seem to do it */ + atom_array_append (&sdtp->entries, val, 256); +} + +static void +atom_trun_add_samples (AtomTRUN * trun, guint32 delta, guint32 size, + guint32 flags, gint64 pts_offset) +{ + TRUNSampleEntry nentry; + + if (pts_offset != 0) + trun->header.flags[1] |= TR_COMPOSITION_TIME_OFFSETS; + + nentry.sample_duration = delta; + nentry.sample_size = size; + nentry.sample_flags = flags; + nentry.sample_composition_time_offset = pts_offset; + atom_array_append (&trun->entries, nentry, 256); + trun->sample_count++; +} + +static void +atom_traf_init (AtomTRAF * traf, AtomsContext * context, guint32 track_ID) +{ + atom_header_set (&traf->header, FOURCC_traf, 0, 0); + atom_tfhd_init (&traf->tfhd, track_ID); + traf->truns = NULL; + + if (context->flavor == ATOMS_TREE_FLAVOR_ISML) + atom_traf_add_sdtp (traf, atom_sdtp_new (context)); +} + +AtomTRAF * +atom_traf_new (AtomsContext * context, guint32 track_ID) +{ + AtomTRAF *traf = g_new0 (AtomTRAF, 1); + + atom_traf_init (traf, context, track_ID); + return traf; +} + +static void +atom_traf_add_trun (AtomTRAF * traf, AtomTRUN * trun) +{ + traf->truns = g_list_append (traf->truns, trun); +} + +void +atom_traf_add_samples (AtomTRAF * traf, guint32 delta, guint32 size, + gboolean sync, gint64 pts_offset, gboolean sdtp_sync) +{ + AtomTRUN *trun; + guint32 flags; + + /* 0x10000 is sample-is-difference-sample flag + * low byte stuff is what ismv uses */ + flags = (sync ? 0x0 : 0x10000) | (sdtp_sync ? 0x40 : 0xc0); + + if (G_UNLIKELY (!traf->truns)) { + trun = atom_trun_new (); + atom_traf_add_trun (traf, trun); + /* optimistic; indicate all defaults present in tfhd */ + traf->tfhd.header.flags[2] = TF_DEFAULT_SAMPLE_DURATION | + TF_DEFAULT_SAMPLE_SIZE | TF_DEFAULT_SAMPLE_FLAGS; + traf->tfhd.default_sample_duration = delta; + traf->tfhd.default_sample_size = size; + traf->tfhd.default_sample_flags = flags; + trun->first_sample_flags = flags; + } + + trun = traf->truns->data; + + /* check if still matching defaults, + * if not, abandon default and need entry for each sample */ + if (traf->tfhd.default_sample_duration != delta) { + traf->tfhd.header.flags[2] &= ~TF_DEFAULT_SAMPLE_DURATION; + trun->header.flags[1] |= (TR_SAMPLE_DURATION >> 8); + } + if (traf->tfhd.default_sample_size != size) { + traf->tfhd.header.flags[2] &= ~TF_DEFAULT_SAMPLE_SIZE; + trun->header.flags[1] |= (TR_SAMPLE_SIZE >> 8); + } + if (traf->tfhd.default_sample_flags != flags) { + if (trun->sample_count == 1) { + /* at least will need first sample flag */ + traf->tfhd.default_sample_flags = flags; + trun->header.flags[2] |= TR_FIRST_SAMPLE_FLAGS; + } else { + /* now we need sample flags for each sample */ + traf->tfhd.header.flags[2] &= ~TF_DEFAULT_SAMPLE_FLAGS; + trun->header.flags[1] |= (TR_SAMPLE_FLAGS >> 8); + trun->header.flags[2] &= ~TR_FIRST_SAMPLE_FLAGS; + } + } + + atom_trun_add_samples (traf->truns->data, delta, size, flags, pts_offset); + + if (traf->sdtps) + atom_sdtp_add_samples (traf->sdtps->data, 0x10 | ((flags & 0xff) >> 4)); +} + +guint32 +atom_traf_get_sample_num (AtomTRAF * traf) +{ + AtomTRUN *trun; + + if (G_UNLIKELY (!traf->truns)) + return 0; + + trun = traf->truns->data; + return atom_array_get_len (&trun->entries); +} + +void +atom_moof_add_traf (AtomMOOF * moof, AtomTRAF * traf) +{ + moof->trafs = g_list_append (moof->trafs, traf); +} + +static void +atom_tfra_free (AtomTFRA * tfra) +{ + atom_full_clear (&tfra->header); + atom_array_clear (&tfra->entries); + g_free (tfra); +} + +AtomMFRA * +atom_mfra_new (AtomsContext * context) +{ + AtomMFRA *mfra = g_new0 (AtomMFRA, 1); + + atom_header_set (&mfra->header, FOURCC_mfra, 0, 0); + return mfra; +} + +void +atom_mfra_add_tfra (AtomMFRA * mfra, AtomTFRA * tfra) +{ + mfra->tfras = g_list_append (mfra->tfras, tfra); +} + +void +atom_mfra_free (AtomMFRA * mfra) +{ + GList *walker; + + walker = mfra->tfras; + while (walker) { + atom_tfra_free ((AtomTFRA *) walker->data); + walker = g_list_next (walker); + } + g_list_free (mfra->tfras); + mfra->tfras = NULL; + + atom_clear (&mfra->header); + g_free (mfra); +} + +static void +atom_tfra_init (AtomTFRA * tfra, guint32 track_ID) +{ + guint8 flags[3] = { 0, 0, 0 }; + + atom_full_init (&tfra->header, FOURCC_tfra, 0, 0, 0, flags); + tfra->track_ID = track_ID; + atom_array_init (&tfra->entries, 512); +} + +AtomTFRA * +atom_tfra_new (AtomsContext * context, guint32 track_ID) +{ + AtomTFRA *tfra = g_new0 (AtomTFRA, 1); + + atom_tfra_init (tfra, track_ID); + return tfra; + +} + +static inline gint +need_bytes (guint32 num) +{ + gint n = 0; + + while (num >>= 8) + n++; + + return n; +} + +void +atom_tfra_add_entry (AtomTFRA * tfra, guint64 dts, guint32 sample_num) +{ + TFRAEntry entry; + + entry.time = dts; + /* fill in later */ + entry.moof_offset = 0; + /* always write a single trun in a single traf */ + entry.traf_number = 1; + entry.trun_number = 1; + entry.sample_number = sample_num; + + /* auto-use 64 bits if needed */ + if (dts > G_MAXUINT32) + tfra->header.version = 1; + + /* 1 byte will always do for traf and trun number, + * check how much sample_num needs */ + tfra->lengths = (tfra->lengths & 0xfc) || + MAX (tfra->lengths, need_bytes (sample_num)); + + atom_array_append (&tfra->entries, entry, 256); +} + +void +atom_tfra_update_offset (AtomTFRA * tfra, guint64 offset) +{ + gint i; + + /* auto-use 64 bits if needed */ + if (offset > G_MAXUINT32) + tfra->header.version = 1; + + for (i = atom_array_get_len (&tfra->entries) - 1; i >= 0; i--) { + TFRAEntry *entry = &atom_array_index (&tfra->entries, i); + + if (entry->moof_offset) + break; + entry->moof_offset = offset; + } +} + +static guint64 +atom_tfra_copy_data (AtomTFRA * tfra, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint32 i; + TFRAEntry *entry; + guint32 data; + guint bytes; + guint version; + + if (!atom_full_copy_data (&tfra->header, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (tfra->track_ID, buffer, size, offset); + prop_copy_uint32 (tfra->lengths, buffer, size, offset); + prop_copy_uint32 (atom_array_get_len (&tfra->entries), buffer, size, offset); + + version = tfra->header.version; + for (i = 0; i < atom_array_get_len (&tfra->entries); ++i) { + entry = &atom_array_index (&tfra->entries, i); + if (version) { + prop_copy_uint64 (entry->time, buffer, size, offset); + prop_copy_uint64 (entry->moof_offset, buffer, size, offset); + } else { + prop_copy_uint32 (entry->time, buffer, size, offset); + prop_copy_uint32 (entry->moof_offset, buffer, size, offset); + } + + bytes = (tfra->lengths & (0x3 << 4)) + 1; + data = GUINT32_TO_BE (entry->traf_number); + prop_copy_fixed_size_string (((guint8 *) & data) + 4 - bytes, bytes, + buffer, size, offset); + + bytes = (tfra->lengths & (0x3 << 2)) + 1; + data = GUINT32_TO_BE (entry->trun_number); + prop_copy_fixed_size_string (((guint8 *) & data) + 4 - bytes, bytes, + buffer, size, offset); + + bytes = (tfra->lengths & (0x3)) + 1; + data = GUINT32_TO_BE (entry->sample_number); + prop_copy_fixed_size_string (((guint8 *) & data) + 4 - bytes, bytes, + buffer, size, offset); + + } + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +static guint64 +atom_mfro_copy_data (guint32 s, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + guint8 flags[3] = { 0, 0, 0 }; + AtomFull mfro; + + atom_full_init (&mfro, FOURCC_mfro, 0, 0, 0, flags); + + if (!atom_full_copy_data (&mfro, buffer, size, offset)) { + return 0; + } + + prop_copy_uint32 (s, buffer, size, offset); + + atom_write_size (buffer, size, offset, original_offset); + + return *offset - original_offset; +} + + +guint64 +atom_mfra_copy_data (AtomMFRA * mfra, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + guint64 original_offset = *offset; + GList *walker; + + if (!atom_copy_data (&mfra->header, buffer, size, offset)) + return 0; + + walker = g_list_first (mfra->tfras); + while (walker != NULL) { + if (!atom_tfra_copy_data ((AtomTFRA *) walker->data, buffer, size, offset)) { + return 0; + } + walker = g_list_next (walker); + } + + /* 16 is the size of the mfro atom */ + if (!atom_mfro_copy_data (*offset - original_offset + 16, buffer, + size, offset)) + return 0; + + atom_write_size (buffer, size, offset, original_offset); + return *offset - original_offset; +} + +/* some sample description construction helpers */ + +AtomInfo * +build_esds_extension (AtomTRAK * trak, guint8 object_type, guint8 stream_type, + const GstBuffer * codec_data, guint32 avg_bitrate, guint32 max_bitrate) +{ + guint32 track_id; + AtomESDS *esds; + + track_id = trak->tkhd.track_ID; + + esds = atom_esds_new (); + esds->es.id = track_id & 0xFFFF; + esds->es.dec_conf_desc.object_type = object_type; + esds->es.dec_conf_desc.stream_type = stream_type << 2 | 0x01; + + if (avg_bitrate > 0) + esds->es.dec_conf_desc.avg_bitrate = avg_bitrate; + if (max_bitrate > 0) + esds->es.dec_conf_desc.max_bitrate = max_bitrate; + + /* optional DecoderSpecificInfo */ + if (codec_data) { + DecoderSpecificInfoDescriptor *desc; + + esds->es.dec_conf_desc.dec_specific_info = desc = + desc_dec_specific_info_new (); + desc_dec_specific_info_alloc_data (desc, GST_BUFFER_SIZE (codec_data)); + + memcpy (desc->data, GST_BUFFER_DATA (codec_data), + GST_BUFFER_SIZE (codec_data)); + } + + return build_atom_info_wrapper ((Atom *) esds, atom_esds_copy_data, + atom_esds_free); +} + +AtomInfo * +build_btrt_extension (guint32 buffer_size_db, guint32 avg_bitrate, + guint32 max_bitrate) +{ + AtomData *atom_data; + GstBuffer *buf; + + buf = gst_buffer_new_and_alloc (12); + + GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), buffer_size_db); + GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + 4, max_bitrate); + GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + 8, avg_bitrate); + + atom_data = atom_data_new_from_gst_buffer (FOURCC_btrt, buf); + gst_buffer_unref (buf); + + return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, + atom_data_free); +} + +static AtomInfo * +build_mov_wave_extension (AtomTRAK * trak, guint32 fourcc, AtomInfo * atom1, + AtomInfo * atom2, gboolean terminator) +{ + AtomWAVE *wave; + AtomFRMA *frma; + Atom *ext_atom; + + /* Build WAVE atom for sample table entry */ + wave = atom_wave_new (); + + /* Prepend Terminator atom to the WAVE list first, so it ends up last */ + if (terminator) { + ext_atom = (Atom *) atom_data_new (FOURCC_null); + wave->extension_atoms = + atom_info_list_prepend_atom (wave->extension_atoms, (Atom *) ext_atom, + (AtomCopyDataFunc) atom_data_copy_data, (AtomFreeFunc) atom_data_free); + } + + /* Add supplied atoms to WAVE */ + if (atom2) + wave->extension_atoms = g_list_prepend (wave->extension_atoms, atom2); + if (atom1) + wave->extension_atoms = g_list_prepend (wave->extension_atoms, atom1); + + /* Add FRMA to the WAVE */ + frma = atom_frma_new (); + frma->media_type = fourcc; + + wave->extension_atoms = + atom_info_list_prepend_atom (wave->extension_atoms, (Atom *) frma, + (AtomCopyDataFunc) atom_frma_copy_data, (AtomFreeFunc) atom_frma_free); + + return build_atom_info_wrapper ((Atom *) wave, atom_wave_copy_data, + atom_wave_free); +} + +AtomInfo * +build_mov_aac_extension (AtomTRAK * trak, const GstBuffer * codec_data, + guint32 avg_bitrate, guint32 max_bitrate) +{ + AtomInfo *esds, *mp4a; + GstBuffer *buf; + + /* Add ESDS atom to WAVE */ + esds = build_esds_extension (trak, ESDS_OBJECT_TYPE_MPEG4_P3, + ESDS_STREAM_TYPE_AUDIO, codec_data, avg_bitrate, max_bitrate); + + /* Add MP4A atom to the WAVE: + * not really in spec, but makes offset based players happy */ + buf = gst_buffer_new_and_alloc (4); + *((guint32 *) GST_BUFFER_DATA (buf)) = 0; + mp4a = build_codec_data_extension (FOURCC_mp4a, buf); + gst_buffer_unref (buf); + + return build_mov_wave_extension (trak, FOURCC_mp4a, mp4a, esds, TRUE); +} + +AtomInfo * +build_mov_alac_extension (AtomTRAK * trak, const GstBuffer * codec_data) +{ + AtomInfo *alac; + + alac = build_codec_data_extension (FOURCC_alac, codec_data); + + return build_mov_wave_extension (trak, FOURCC_alac, NULL, alac, TRUE); +} + +AtomInfo * +build_fiel_extension (gint fields) +{ + AtomData *atom_data; + GstBuffer *buf; + + if (fields == 1) { + return NULL; + } + + buf = gst_buffer_new_and_alloc (1); + GST_BUFFER_DATA (buf)[0] = (guint8) fields; + + atom_data = + atom_data_new_from_gst_buffer (GST_MAKE_FOURCC ('f', 'i', 'e', 'l'), buf); + gst_buffer_unref (buf); + + return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, + atom_data_free); +} + +AtomInfo * +build_jp2x_extension (const GstBuffer * prefix) +{ + AtomData *atom_data; + + if (!prefix) { + return NULL; + } + + atom_data = + atom_data_new_from_gst_buffer (GST_MAKE_FOURCC ('j', 'p', '2', 'x'), + prefix); + + return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, + atom_data_free); +} + +AtomInfo * +build_jp2h_extension (AtomTRAK * trak, gint width, gint height, guint32 fourcc, + gint ncomp, const GValue * cmap_array, const GValue * cdef_array) +{ + AtomData *atom_data; + GstBuffer *buf; + guint8 cenum; + gint i; + gint idhr_size = 22; + gint colr_size = 15; + gint cmap_size = 0, cdef_size = 0; + gint cmap_array_size = 0; + gint cdef_array_size = 0; + GstByteWriter writer; + + g_return_val_if_fail (cmap_array == NULL || + GST_VALUE_HOLDS_ARRAY (cmap_array), NULL); + g_return_val_if_fail (cdef_array == NULL || + GST_VALUE_HOLDS_ARRAY (cdef_array), NULL); + + if (fourcc == GST_MAKE_FOURCC ('s', 'R', 'G', 'B')) { + cenum = 0x10; + if (ncomp == 0) + ncomp = 3; + } else if (fourcc == GST_MAKE_FOURCC ('G', 'R', 'A', 'Y')) { + cenum = 0x11; + if (ncomp == 0) + ncomp = 1; + } else if (fourcc == GST_MAKE_FOURCC ('s', 'Y', 'U', 'V')) { + cenum = 0x12; + if (ncomp == 0) + ncomp = 3; + } else + return NULL; + + if (cmap_array) { + cmap_array_size = gst_value_array_get_size (cmap_array); + cmap_size = 8 + cmap_array_size * 4; + } + if (cdef_array) { + cdef_array_size = gst_value_array_get_size (cdef_array); + cdef_size = 8 + 2 + cdef_array_size * 6; + } + + buf = gst_buffer_new_and_alloc (idhr_size + colr_size + cmap_size + + cdef_size); + gst_byte_writer_init_with_buffer (&writer, buf, FALSE); + + /* ihdr = image header box */ + gst_byte_writer_put_uint32_be (&writer, 22); + gst_byte_writer_put_uint32_le (&writer, GST_MAKE_FOURCC ('i', 'h', 'd', 'r')); + gst_byte_writer_put_uint32_be (&writer, height); + gst_byte_writer_put_uint32_be (&writer, width); + gst_byte_writer_put_uint16_be (&writer, ncomp); + /* 8 bits per component, unsigned */ + gst_byte_writer_put_uint8 (&writer, 0x7); + /* compression type; reserved */ + gst_byte_writer_put_uint8 (&writer, 0x7); + /* colour space (un)known */ + gst_byte_writer_put_uint8 (&writer, 0x0); + /* intellectual property right (box present) */ + gst_byte_writer_put_uint8 (&writer, 0x0); + + /* colour specification box */ + gst_byte_writer_put_uint32_be (&writer, 15); + gst_byte_writer_put_uint32_le (&writer, GST_MAKE_FOURCC ('c', 'o', 'l', 'r')); + + /* specification method: enumerated */ + gst_byte_writer_put_uint8 (&writer, 0x1); + /* precedence; reserved */ + gst_byte_writer_put_uint8 (&writer, 0x0); + /* approximation; reserved */ + gst_byte_writer_put_uint8 (&writer, 0x0); + /* enumerated colourspace */ + gst_byte_writer_put_uint32_be (&writer, cenum); + + if (cmap_array) { + gst_byte_writer_put_uint32_be (&writer, cmap_size); + gst_byte_writer_put_uint32_le (&writer, + GST_MAKE_FOURCC ('c', 'm', 'a', 'p')); + for (i = 0; i < cmap_array_size; i++) { + const GValue *item; + gint value; + guint16 cmp; + guint8 mtyp; + guint8 pcol; + item = gst_value_array_get_value (cmap_array, i); + value = g_value_get_int (item); + + /* value is '(mtyp << 24) | (pcol << 16) | cmp' */ + cmp = value & 0xFFFF; + mtyp = value >> 24; + pcol = (value >> 16) & 0xFF; + + if (mtyp == 1) + GST_WARNING ("MTYP of cmap atom signals Pallete Mapping, but we don't " + "handle Pallete mapping atoms yet"); + + gst_byte_writer_put_uint16_be (&writer, cmp); + gst_byte_writer_put_uint8 (&writer, mtyp); + gst_byte_writer_put_uint8 (&writer, pcol); + } + } + + if (cdef_array) { + gst_byte_writer_put_uint32_be (&writer, cdef_size); + gst_byte_writer_put_uint32_le (&writer, + GST_MAKE_FOURCC ('c', 'd', 'e', 'f')); + gst_byte_writer_put_uint16_be (&writer, cdef_array_size); + for (i = 0; i < cdef_array_size; i++) { + const GValue *item; + gint value; + item = gst_value_array_get_value (cdef_array, i); + value = g_value_get_int (item); + + gst_byte_writer_put_uint16_be (&writer, i); + if (value > 0) { + gst_byte_writer_put_uint16_be (&writer, 0); + gst_byte_writer_put_uint16_be (&writer, value); + } else if (value < 0) { + gst_byte_writer_put_uint16_be (&writer, -value); + gst_byte_writer_put_uint16_be (&writer, 0); /* TODO what here? */ + } else { + gst_byte_writer_put_uint16_be (&writer, 1); + gst_byte_writer_put_uint16_be (&writer, 0); + } + } + } + + g_assert (gst_byte_writer_get_remaining (&writer) == 0); + + atom_data = atom_data_new_from_gst_buffer (FOURCC_jp2h, buf); + gst_buffer_unref (buf); + + return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, + atom_data_free); +} + +AtomInfo * +build_codec_data_extension (guint32 fourcc, const GstBuffer * codec_data) +{ + AtomData *data; + AtomInfo *result = NULL; + + if (codec_data) { + data = atom_data_new_from_gst_buffer (fourcc, codec_data); + result = build_atom_info_wrapper ((Atom *) data, atom_data_copy_data, + atom_data_free); + } + + return result; +} + +AtomInfo * +build_amr_extension (void) +{ + guint8 ext[9]; + GstBuffer *buf; + AtomInfo *res; + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = ext; + GST_BUFFER_SIZE (buf) = sizeof (ext); + + /* vendor */ + GST_WRITE_UINT32_LE (ext, 0); + /* decoder version */ + GST_WRITE_UINT8 (ext + 4, 0); + /* mode set (all modes) */ + GST_WRITE_UINT16_BE (ext + 5, 0x81FF); + /* mode change period (no restriction) */ + GST_WRITE_UINT8 (ext + 7, 0); + /* frames per sample */ + GST_WRITE_UINT8 (ext + 8, 1); + + res = build_codec_data_extension (GST_MAKE_FOURCC ('d', 'a', 'm', 'r'), buf); + gst_buffer_unref (buf); + return res; +} + +AtomInfo * +build_h263_extension (void) +{ + guint8 ext[7]; + GstBuffer *buf; + AtomInfo *res; + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = ext; + GST_BUFFER_SIZE (buf) = sizeof (ext); + + /* vendor */ + GST_WRITE_UINT32_LE (ext, 0); + /* decoder version */ + GST_WRITE_UINT8 (ext + 4, 0); + /* level / profile */ + /* FIXME ? maybe ? obtain somewhere; baseline for now */ + GST_WRITE_UINT8 (ext + 5, 10); + GST_WRITE_UINT8 (ext + 6, 0); + + res = build_codec_data_extension (GST_MAKE_FOURCC ('d', '2', '6', '3'), buf); + gst_buffer_unref (buf); + return res; +} + +AtomInfo * +build_gama_atom (gdouble gamma) +{ + AtomInfo *res; + guint32 gamma_fp; + GstBuffer *buf; + + /* convert to uint32 from fixed point */ + gamma_fp = (guint32) 65536 *gamma; + + buf = gst_buffer_new_and_alloc (4); + GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), gamma_fp); + res = build_codec_data_extension (FOURCC_gama, buf); + gst_buffer_unref (buf); + return res; +} + +AtomInfo * +build_SMI_atom (const GstBuffer * seqh) +{ + AtomInfo *res; + GstBuffer *buf; + + /* the seqh plus its size and fourcc */ + buf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (seqh) + 8); + + GST_WRITE_UINT32_LE (GST_BUFFER_DATA (buf), FOURCC_SEQH); + GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + 4, GST_BUFFER_SIZE (seqh)); + memcpy (GST_BUFFER_DATA (buf) + 8, GST_BUFFER_DATA (seqh), + GST_BUFFER_SIZE (seqh)); + res = build_codec_data_extension (FOURCC_SMI_, buf); + gst_buffer_unref (buf); + return res; +} + +static AtomInfo * +build_ima_adpcm_atom (gint channels, gint rate, gint blocksize) +{ + AtomData *atom_data; + GstBuffer *buf; + guint8 *data; + const gint ima_adpcm_atom_size = 20; + guint32 fourcc; + gint samplesperblock; + gint bytespersec; + + /* The FOURCC for WAV codecs in QT is 'ms' followed by the 16 bit wave codec + identifier. Note that the identifier here is big-endian, but when used + within the WAVE header (below), it's little endian. */ + fourcc = MS_WAVE_FOURCC (0x11); + + buf = gst_buffer_new_and_alloc (ima_adpcm_atom_size); + data = GST_BUFFER_DATA (buf); + + /* This atom's content is a WAVE header, including 2 bytes of extra data. + Note that all of this is little-endian, unlike most stuff in qt. */ + /* 4 bytes header per channel (including 1 sample). Then 2 samples per byte + for the rest. Simplifies to this. */ + samplesperblock = 2 * blocksize / channels - 7; + bytespersec = rate * blocksize / samplesperblock; + GST_WRITE_UINT16_LE (data, 0x11); + GST_WRITE_UINT16_LE (data + 2, channels); + GST_WRITE_UINT32_LE (data + 4, rate); + GST_WRITE_UINT32_LE (data + 8, bytespersec); + GST_WRITE_UINT16_LE (data + 12, blocksize); + GST_WRITE_UINT16_LE (data + 14, 4); + GST_WRITE_UINT16_LE (data + 16, 2); /* Two extra bytes */ + GST_WRITE_UINT16_LE (data + 18, samplesperblock); + + atom_data = atom_data_new_from_gst_buffer (fourcc, buf); + gst_buffer_unref (buf); + + return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, + atom_data_free); +} + +AtomInfo * +build_ima_adpcm_extension (gint channels, gint rate, gint blocksize) +{ + AtomWAVE *wave; + AtomFRMA *frma; + Atom *ext_atom; + + /* Add WAVE atom */ + wave = atom_wave_new (); + + /* Prepend Terminator atom to the WAVE list first, so it ends up last */ + ext_atom = (Atom *) atom_data_new (FOURCC_null); + wave->extension_atoms = + atom_info_list_prepend_atom (wave->extension_atoms, (Atom *) ext_atom, + (AtomCopyDataFunc) atom_data_copy_data, (AtomFreeFunc) atom_data_free); + + /* Add wave ima adpcm atom to WAVE */ + wave->extension_atoms = g_list_prepend (wave->extension_atoms, + build_ima_adpcm_atom (channels, rate, blocksize)); + + /* Add FRMA to the WAVE */ + frma = atom_frma_new (); + frma->media_type = MS_WAVE_FOURCC (0x11); + + wave->extension_atoms = + atom_info_list_prepend_atom (wave->extension_atoms, (Atom *) frma, + (AtomCopyDataFunc) atom_frma_copy_data, (AtomFreeFunc) atom_frma_free); + + return build_atom_info_wrapper ((Atom *) wave, atom_wave_copy_data, + atom_wave_free); +} + +AtomInfo * +build_uuid_xmp_atom (GstBuffer * xmp_data) +{ + AtomUUID *uuid; + static guint8 xmp_uuid[] = { 0xBE, 0x7A, 0xCF, 0xCB, + 0x97, 0xA9, 0x42, 0xE8, + 0x9C, 0x71, 0x99, 0x94, + 0x91, 0xE3, 0xAF, 0xAC + }; + + if (xmp_data == NULL) + return NULL; + + uuid = atom_uuid_new (); + memcpy (uuid->uuid, xmp_uuid, 16); + + uuid->data = g_malloc (GST_BUFFER_SIZE (xmp_data)); + uuid->datalen = GST_BUFFER_SIZE (xmp_data); + memcpy (uuid->data, GST_BUFFER_DATA (xmp_data), GST_BUFFER_SIZE (xmp_data)); + + return build_atom_info_wrapper ((Atom *) uuid, atom_uuid_copy_data, + atom_uuid_free); +} diff --git a/gst/isomp4/atoms.h b/gst/isomp4/atoms.h new file mode 100644 index 0000000..20ea141 --- /dev/null +++ b/gst/isomp4/atoms.h @@ -0,0 +1,959 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008-2010 Thiago Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __ATOMS_H__ +#define __ATOMS_H__ + +#include +#include + +#include "descriptors.h" +#include "properties.h" +#include "fourcc.h" +#include "ftypcc.h" + +/* helper storage struct */ +#define ATOM_ARRAY(struct_type) \ +struct { \ + guint size; \ + guint len; \ + struct_type *data; \ +} + +/* storage helpers */ + +#define atom_array_init(array, reserve) \ +G_STMT_START { \ + (array)->len = 0; \ + (array)->size = reserve; \ + (array)->data = g_malloc (sizeof (*(array)->data) * reserve); \ +} G_STMT_END + +#define atom_array_append(array, elmt, inc) \ +G_STMT_START { \ + g_assert ((array)->data); \ + g_assert (inc > 0); \ + if (G_UNLIKELY ((array)->len == (array)->size)) { \ + (array)->size += inc; \ + (array)->data = \ + g_realloc ((array)->data, sizeof (*((array)->data)) * (array)->size); \ + } \ + (array)->data[(array)->len] = elmt; \ + (array)->len++; \ +} G_STMT_END + +#define atom_array_get_len(array) ((array)->len) +#define atom_array_index(array, index) ((array)->data[index]) + +#define atom_array_clear(array) \ +G_STMT_START { \ + (array)->size = (array)->len = 0; \ + g_free ((array)->data); \ + (array)->data = NULL; \ +} G_STMT_END + +/* light-weight context that may influence header atom tree construction */ +typedef enum _AtomsTreeFlavor +{ + ATOMS_TREE_FLAVOR_MOV, + ATOMS_TREE_FLAVOR_ISOM, + ATOMS_TREE_FLAVOR_3GP, + ATOMS_TREE_FLAVOR_ISML +} AtomsTreeFlavor; + +typedef struct _AtomsContext +{ + AtomsTreeFlavor flavor; +} AtomsContext; + +AtomsContext* atoms_context_new (AtomsTreeFlavor flavor); +void atoms_context_free (AtomsContext *context); + +#define METADATA_DATA_FLAG 0x0 +#define METADATA_TEXT_FLAG 0x1 + +/* atom defs and functions */ + +/** + * Used for storing time related values for some atoms. + */ +typedef struct _TimeInfo +{ + guint64 creation_time; + guint64 modification_time; + guint32 timescale; + guint64 duration; +} TimeInfo; + +typedef struct _Atom +{ + guint32 size; + guint32 type; + guint64 extended_size; +} Atom; + +typedef struct _AtomFull +{ + Atom header; + + guint8 version; + guint8 flags[3]; +} AtomFull; + +/* + * Generic extension atom + */ +typedef struct _AtomData +{ + Atom header; + + /* not written */ + guint32 datalen; + + guint8 *data; +} AtomData; + +typedef struct _AtomUUID +{ + Atom header; + + guint8 uuid[16]; + + /* not written */ + guint32 datalen; + + guint8 *data; +} AtomUUID; + +typedef struct _AtomFTYP +{ + Atom header; + guint32 major_brand; + guint32 version; + guint32 *compatible_brands; + + /* not written */ + guint32 compatible_brands_size; +} AtomFTYP; + +typedef struct _AtomMVHD +{ + AtomFull header; + + /* version 0: 32 bits */ + TimeInfo time_info; + + guint32 prefered_rate; /* ISO: 0x00010000 */ + guint16 volume; /* ISO: 0x0100 */ + guint16 reserved3; /* ISO: 0x0 */ + guint32 reserved4[2]; /* ISO: 0, 0 */ + /* ISO: identity matrix = + * { 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000 } */ + guint32 matrix[9]; + + /* ISO: all 0 */ + guint32 preview_time; + guint32 preview_duration; + guint32 poster_time; + guint32 selection_time; + guint32 selection_duration; + guint32 current_time; + + guint32 next_track_id; +} AtomMVHD; + +typedef struct _AtomTKHD +{ + AtomFull header; + + /* version 0: 32 bits */ + /* like the TimeInfo struct, but it has this track_ID inside */ + guint64 creation_time; + guint64 modification_time; + guint32 track_ID; + guint32 reserved; + guint64 duration; + + guint32 reserved2[2]; + guint16 layer; + guint16 alternate_group; + guint16 volume; + guint16 reserved3; + + /* ISO: identity matrix = + * { 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000 } */ + guint32 matrix[9]; + guint32 width; + guint32 height; +} AtomTKHD; + +typedef struct _AtomMDHD +{ + AtomFull header; + + /* version 0: 32 bits */ + TimeInfo time_info; + + /* ISO: packed ISO-639-2/T language code (first bit must be 0) */ + guint16 language_code; + /* ISO: 0 */ + guint16 quality; +} AtomMDHD; + +typedef struct _AtomHDLR +{ + AtomFull header; + + /* ISO: 0 */ + guint32 component_type; + guint32 handler_type; + guint32 manufacturer; + guint32 flags; + guint32 flags_mask; + gchar *name; +} AtomHDLR; + +typedef struct _AtomVMHD +{ + AtomFull header; /* ISO: flags = 1 */ + + guint16 graphics_mode; + /* RGB */ + guint16 opcolor[3]; +} AtomVMHD; + +typedef struct _AtomSMHD +{ + AtomFull header; + + guint16 balance; + guint16 reserved; +} AtomSMHD; + +typedef struct _AtomHMHD +{ + AtomFull header; + + guint16 max_pdu_size; + guint16 avg_pdu_size; + guint32 max_bitrate; + guint32 avg_bitrate; + guint32 sliding_avg_bitrate; +} AtomHMHD; + +typedef struct _AtomURL +{ + AtomFull header; + + gchar *location; +} AtomURL; + +typedef struct _AtomDREF +{ + AtomFull header; + + GList *entries; +} AtomDREF; + +typedef struct _AtomDINF +{ + Atom header; + + AtomDREF dref; +} AtomDINF; + +typedef struct _STTSEntry +{ + guint32 sample_count; + gint32 sample_delta; +} STTSEntry; + +typedef struct _AtomSTTS +{ + AtomFull header; + + ATOM_ARRAY (STTSEntry) entries; +} AtomSTTS; + +typedef struct _AtomSTSS +{ + AtomFull header; + + ATOM_ARRAY (guint32) entries; +} AtomSTSS; + +typedef struct _AtomESDS +{ + AtomFull header; + + ESDescriptor es; +} AtomESDS; + +typedef struct _AtomFRMA +{ + Atom header; + + guint32 media_type; +} AtomFRMA; + +typedef enum _SampleEntryKind +{ + UNKNOWN, + AUDIO, + VIDEO +} SampleEntryKind; + +typedef struct _SampleTableEntry +{ + Atom header; + + guint8 reserved[6]; + guint16 data_reference_index; + + /* sort of entry */ + SampleEntryKind kind; +} SampleTableEntry; + +typedef struct _AtomHintSampleEntry +{ + SampleTableEntry se; + guint32 size; + guint8 *data; +} AtomHintSampleEntry; + +typedef struct _SampleTableEntryMP4V +{ + SampleTableEntry se; + + guint16 version; + guint16 revision_level; + + guint32 vendor; /* fourcc code */ + guint32 temporal_quality; + guint32 spatial_quality; + + guint16 width; + guint16 height; + + guint32 horizontal_resolution; + guint32 vertical_resolution; + guint32 datasize; + + guint16 frame_count; /* usually 1 */ + + guint8 compressor[32]; /* pascal string, i.e. first byte = length */ + + guint16 depth; + guint16 color_table_id; + + /* (optional) list of AtomInfo */ + GList *extension_atoms; +} SampleTableEntryMP4V; + +typedef struct _SampleTableEntryMP4A +{ + SampleTableEntry se; + + guint16 version; + guint16 revision_level; + guint32 vendor; + + guint16 channels; + guint16 sample_size; + guint16 compression_id; + guint16 packet_size; + + guint32 sample_rate; /* fixed point 16.16 */ + + guint32 samples_per_packet; + guint32 bytes_per_packet; + guint32 bytes_per_frame; + guint32 bytes_per_sample; + + /* (optional) list of AtomInfo */ + GList *extension_atoms; +} SampleTableEntryMP4A; + +typedef struct _SampleTableEntryMP4S +{ + SampleTableEntry se; + + AtomESDS es; +} SampleTableEntryMP4S; + +typedef struct _AtomSTSD +{ + AtomFull header; + + guint n_entries; + /* list of subclasses of SampleTableEntry */ + GList *entries; +} AtomSTSD; + +typedef struct _AtomSTSZ +{ + AtomFull header; + + guint32 sample_size; + + /* need the size here because when sample_size is constant, + * the list is empty */ + guint32 table_size; + ATOM_ARRAY (guint32) entries; +} AtomSTSZ; + +typedef struct _STSCEntry +{ + guint32 first_chunk; + guint32 samples_per_chunk; + guint32 sample_description_index; +} STSCEntry; + +typedef struct _AtomSTSC +{ + AtomFull header; + + ATOM_ARRAY (STSCEntry) entries; +} AtomSTSC; + + +/* + * used for both STCO and CO64 + * if used as STCO, entries should be truncated to use only 32bits + */ +typedef struct _AtomSTCO64 +{ + AtomFull header; + + ATOM_ARRAY (guint64) entries; +} AtomSTCO64; + +typedef struct _CTTSEntry +{ + guint32 samplecount; + guint32 sampleoffset; +} CTTSEntry; + +typedef struct _AtomCTTS +{ + AtomFull header; + + /* also entry count here */ + ATOM_ARRAY (CTTSEntry) entries; + gboolean do_pts; +} AtomCTTS; + +typedef struct _AtomSTBL +{ + Atom header; + + AtomSTSD stsd; + AtomSTTS stts; + AtomSTSS stss; + AtomSTSC stsc; + AtomSTSZ stsz; + /* NULL if not present */ + AtomCTTS *ctts; + + AtomSTCO64 stco64; +} AtomSTBL; + +typedef struct _AtomMINF +{ + Atom header; + + /* only (exactly) one of those must be present */ + AtomVMHD *vmhd; + AtomSMHD *smhd; + AtomHMHD *hmhd; + + AtomHDLR *hdlr; + AtomDINF dinf; + AtomSTBL stbl; +} AtomMINF; + +typedef struct _EditListEntry +{ + /* duration in movie's timescale */ + guint32 duration; + /* start time in media's timescale, -1 for empty */ + guint32 media_time; + guint32 media_rate; /* fixed point 32 bit */ +} EditListEntry; + +typedef struct _AtomELST +{ + AtomFull header; + + /* number of entries is implicit */ + GSList *entries; +} AtomELST; + +typedef struct _AtomEDTS +{ + Atom header; + AtomELST elst; +} AtomEDTS; + +typedef struct _AtomMDIA +{ + Atom header; + + AtomMDHD mdhd; + AtomHDLR hdlr; + AtomMINF minf; +} AtomMDIA; + +typedef struct _AtomILST +{ + Atom header; + + /* list of AtomInfo */ + GList* entries; +} AtomILST; + +typedef struct _AtomTagData +{ + AtomFull header; + guint32 reserved; + + guint32 datalen; + guint8* data; +} AtomTagData; + +typedef struct _AtomTag +{ + Atom header; + + AtomTagData data; +} AtomTag; + +typedef struct _AtomMETA +{ + AtomFull header; + AtomHDLR hdlr; + AtomILST *ilst; +} AtomMETA; + +typedef struct _AtomUDTA +{ + Atom header; + + /* list of AtomInfo */ + GList* entries; + /* or list is further down */ + AtomMETA *meta; +} AtomUDTA; + +enum TrFlags +{ + TR_DATA_OFFSET = 0x01, /* data-offset-present */ + TR_FIRST_SAMPLE_FLAGS = 0x04, /* first-sample-flags-present */ + TR_SAMPLE_DURATION = 0x0100, /* sample-duration-present */ + TR_SAMPLE_SIZE = 0x0200, /* sample-size-present */ + TR_SAMPLE_FLAGS = 0x0400, /* sample-flags-present */ + TR_COMPOSITION_TIME_OFFSETS = 0x0800 /* sample-composition-time-offsets-presents */ +}; + +enum TfFlags +{ + TF_BASE_DATA_OFFSET = 0x01, /* base-data-offset-present */ + TF_SAMPLE_DESCRIPTION_INDEX = 0x02, /* sample-description-index-present */ + TF_DEFAULT_SAMPLE_DURATION = 0x08, /* default-sample-duration-present */ + TF_DEFAULT_SAMPLE_SIZE = 0x010, /* default-sample-size-present */ + TF_DEFAULT_SAMPLE_FLAGS = 0x020, /* default-sample-flags-present */ + TF_DURATION_IS_EMPTY = 0x010000 /* sample-composition-time-offsets-presents */ +}; + +typedef struct _AtomTRAK +{ + Atom header; + + AtomTKHD tkhd; + AtomEDTS *edts; + AtomMDIA mdia; + + /* some helper info for structural conformity checks */ + gboolean is_video; + gboolean is_h264; +} AtomTRAK; + +typedef struct _AtomTREX +{ + AtomFull header; + + guint32 track_ID; + guint32 default_sample_description_index; + guint32 default_sample_duration; + guint32 default_sample_size; + guint32 default_sample_flags; +} AtomTREX; + +typedef struct _AtomMEHD +{ + AtomFull header; + + guint64 fragment_duration; +} AtomMEHD; + + +typedef struct _AtomMVEX +{ + Atom header; + + AtomMEHD mehd; + + /* list of AtomTREX */ + GList *trexs; +} AtomMVEX; + +typedef struct _AtomMFHD +{ + AtomFull header; + + guint32 sequence_number; +} AtomMFHD; + +typedef struct _AtomTFHD +{ + AtomFull header; + + guint32 track_ID; + guint64 base_data_offset; + guint32 sample_description_index; + guint32 default_sample_duration; + guint32 default_sample_size; + guint32 default_sample_flags; +} AtomTFHD; + +typedef struct _TRUNSampleEntry +{ + guint32 sample_duration; + guint32 sample_size; + guint32 sample_flags; + guint32 sample_composition_time_offset; +} TRUNSampleEntry; + +typedef struct _AtomTRUN +{ + AtomFull header; + + guint32 sample_count; + gint32 data_offset; + guint32 first_sample_flags; + + /* array of fields */ + ATOM_ARRAY (TRUNSampleEntry) entries; +} AtomTRUN; + +typedef struct _AtomSDTP +{ + AtomFull header; + + /* not serialized */ + guint32 sample_count; + + /* array of fields */ + ATOM_ARRAY (guint8) entries; +} AtomSDTP; + +typedef struct _AtomTRAF +{ + Atom header; + + AtomTFHD tfhd; + + /* list of AtomTRUN */ + GList *truns; + /* list of AtomSDTP */ + GList *sdtps; +} AtomTRAF; + +typedef struct _AtomMOOF +{ + Atom header; + + AtomMFHD mfhd; + + /* list of AtomTRAF */ + GList *trafs; +} AtomMOOF; + + +typedef struct _AtomMOOV +{ + /* style */ + AtomsContext context; + + Atom header; + + AtomMVHD mvhd; + AtomMVEX mvex; + + /* list of AtomTRAK */ + GList *traks; + AtomUDTA *udta; + + gboolean fragmented; +} AtomMOOV; + +typedef struct _AtomWAVE +{ + Atom header; + + /* list of AtomInfo */ + GList *extension_atoms; +} AtomWAVE; + +typedef struct _TFRAEntry +{ + guint64 time; + guint64 moof_offset; + guint32 traf_number; + guint32 trun_number; + guint32 sample_number; +} TFRAEntry; + +typedef struct _AtomTFRA +{ + AtomFull header; + + guint32 track_ID; + guint32 lengths; + /* array of entries */ + ATOM_ARRAY (TFRAEntry) entries; +} AtomTFRA; + +typedef struct _AtomMFRA +{ + Atom header; + + /* list of tfra */ + GList *tfras; +} AtomMFRA; + +/* + * Function to serialize an atom + */ +typedef guint64 (*AtomCopyDataFunc) (Atom *atom, guint8 **buffer, guint64 *size, guint64 *offset); + +/* + * Releases memory allocated by an atom + */ +typedef guint64 (*AtomFreeFunc) (Atom *atom); + +/* + * Some atoms might have many optional different kinds of child atoms, so this + * is useful for enabling generic handling of any atom. + * All we need are the two functions (copying it to an array + * for serialization and the memory releasing function). + */ +typedef struct _AtomInfo +{ + Atom *atom; + AtomCopyDataFunc copy_data_func; + AtomFreeFunc free_func; +} AtomInfo; + + +guint64 atom_copy_data (Atom *atom, guint8 **buffer, + guint64 *size, guint64* offset); + +AtomFTYP* atom_ftyp_new (AtomsContext *context, guint32 major, + guint32 version, GList *brands); +guint64 atom_ftyp_copy_data (AtomFTYP *ftyp, guint8 **buffer, + guint64 *size, guint64 *offset); +void atom_ftyp_free (AtomFTYP *ftyp); + +AtomTRAK* atom_trak_new (AtomsContext *context); +void atom_trak_add_samples (AtomTRAK * trak, guint32 nsamples, guint32 delta, + guint32 size, guint64 chunk_offset, gboolean sync, + gint64 pts_offset); +void atom_trak_add_elst_entry (AtomTRAK * trak, guint32 duration, + guint32 media_time, guint32 rate); +guint32 atom_trak_get_timescale (AtomTRAK *trak); +guint32 atom_trak_get_id (AtomTRAK * trak); +void atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples, + guint32 delta, guint32 size, + guint64 chunk_offset, gboolean sync, + gint64 pts_offset); + +AtomMOOV* atom_moov_new (AtomsContext *context); +void atom_moov_free (AtomMOOV *moov); +guint64 atom_moov_copy_data (AtomMOOV *atom, guint8 **buffer, guint64 *size, guint64* offset); +void atom_moov_update_timescale (AtomMOOV *moov, guint32 timescale); +void atom_moov_update_duration (AtomMOOV *moov); +void atom_moov_set_fragmented (AtomMOOV *moov, gboolean fragmented); +void atom_moov_chunks_add_offset (AtomMOOV *moov, guint32 offset); +void atom_moov_add_trak (AtomMOOV *moov, AtomTRAK *trak); + +guint64 atom_mvhd_copy_data (AtomMVHD * atom, guint8 ** buffer, + guint64 * size, guint64 * offset); +void atom_stco64_chunks_add_offset (AtomSTCO64 * stco64, guint32 offset); +guint64 atom_trak_copy_data (AtomTRAK * atom, guint8 ** buffer, + guint64 * size, guint64 * offset); +void atom_stbl_clear (AtomSTBL * stbl); +void atom_stbl_init (AtomSTBL * stbl); +guint64 atom_stss_copy_data (AtomSTSS *atom, guint8 **buffer, + guint64 *size, guint64* offset); +guint64 atom_stts_copy_data (AtomSTTS *atom, guint8 **buffer, + guint64 *size, guint64* offset); +guint64 atom_stsc_copy_data (AtomSTSC *atom, guint8 **buffer, + guint64 *size, guint64* offset); +guint64 atom_stsz_copy_data (AtomSTSZ *atom, guint8 **buffer, + guint64 *size, guint64* offset); +guint64 atom_ctts_copy_data (AtomCTTS *atom, guint8 **buffer, + guint64 *size, guint64* offset); +guint64 atom_stco64_copy_data (AtomSTCO64 *atom, guint8 **buffer, + guint64 *size, guint64* offset); +AtomMOOF* atom_moof_new (AtomsContext *context, guint32 sequence_number); +void atom_moof_free (AtomMOOF *moof); +guint64 atom_moof_copy_data (AtomMOOF *moof, guint8 **buffer, guint64 *size, guint64* offset); +AtomTRAF * atom_traf_new (AtomsContext * context, guint32 track_ID); +void atom_traf_free (AtomTRAF * traf); +void atom_traf_add_samples (AtomTRAF * traf, guint32 delta, + guint32 size, gboolean sync, gint64 pts_offset, + gboolean sdtp_sync); +guint32 atom_traf_get_sample_num (AtomTRAF * traf); +void atom_moof_add_traf (AtomMOOF *moof, AtomTRAF *traf); + +AtomMFRA* atom_mfra_new (AtomsContext *context); +void atom_mfra_free (AtomMFRA *mfra); +AtomTFRA* atom_tfra_new (AtomsContext *context, guint32 track_ID); +void atom_tfra_add_entry (AtomTFRA *tfra, guint64 dts, guint32 sample_num); +void atom_tfra_update_offset (AtomTFRA * tfra, guint64 offset); +void atom_mfra_add_tfra (AtomMFRA *mfra, AtomTFRA *tfra); +guint64 atom_mfra_copy_data (AtomMFRA *mfra, guint8 **buffer, guint64 *size, guint64* offset); + + +/* media sample description related helpers */ + +typedef struct +{ + guint16 version; + guint32 fourcc; + guint width; + guint height; + guint depth; + guint frame_count; + gint color_table_id; + guint par_n; + guint par_d; + + GstBuffer *codec_data; +} VisualSampleEntry; + +typedef struct +{ + guint32 fourcc; + guint version; + gint compression_id; + guint sample_rate; + guint channels; + guint sample_size; + guint bytes_per_packet; + guint samples_per_packet; + guint bytes_per_sample; + guint bytes_per_frame; + + GstBuffer *codec_data; +} AudioSampleEntry; + +void atom_trak_set_audio_type (AtomTRAK * trak, AtomsContext * context, + AudioSampleEntry * entry, guint32 scale, + AtomInfo * ext, gint sample_size); + +void atom_trak_set_video_type (AtomTRAK * trak, AtomsContext * context, + VisualSampleEntry * entry, guint32 rate, + GList * ext_atoms_list); + +void atom_trak_update_bitrates (AtomTRAK * trak, guint32 avg_bitrate, + guint32 max_bitrate); + +AtomInfo * build_codec_data_extension (guint32 fourcc, const GstBuffer * codec_data); +AtomInfo * build_mov_aac_extension (AtomTRAK * trak, const GstBuffer * codec_data, + guint32 avg_bitrate, guint32 max_bitrate); +AtomInfo * build_mov_alac_extension (AtomTRAK * trak, const GstBuffer * codec_data); +AtomInfo * build_esds_extension (AtomTRAK * trak, guint8 object_type, + guint8 stream_type, const GstBuffer * codec_data, + guint32 avg_bitrate, guint32 max_bitrate); +AtomInfo * build_btrt_extension (guint32 buffer_size_db, guint32 avg_bitrate, + guint32 max_bitrate); +AtomInfo * build_jp2h_extension (AtomTRAK * trak, gint width, gint height, + guint32 fourcc, gint ncomp, + const GValue * cmap_array, + const GValue * cdef_array); + +AtomInfo * build_jp2x_extension (const GstBuffer * prefix); +AtomInfo * build_fiel_extension (gint fields); +AtomInfo * build_amr_extension (void); +AtomInfo * build_h263_extension (void); +AtomInfo * build_gama_atom (gdouble gamma); +AtomInfo * build_SMI_atom (const GstBuffer *seqh); +AtomInfo * build_ima_adpcm_extension (gint channels, gint rate, + gint blocksize); +AtomInfo * build_uuid_xmp_atom (GstBuffer * xmp); + + +/* + * Meta tags functions + */ +void atom_moov_add_str_tag (AtomMOOV *moov, guint32 fourcc, const gchar *value); +void atom_moov_add_uint_tag (AtomMOOV *moov, guint32 fourcc, guint32 flags, + guint32 value); +void atom_moov_add_tag (AtomMOOV *moov, guint32 fourcc, guint32 flags, + const guint8 * data, guint size); +void atom_moov_add_blob_tag (AtomMOOV *moov, guint8 *data, guint size); + +void atom_moov_add_3gp_str_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value); +void atom_moov_add_3gp_uint_tag (AtomMOOV * moov, guint32 fourcc, guint16 value); +void atom_moov_add_3gp_str_int_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value, + gint16 ivalue); +void atom_moov_add_3gp_tag (AtomMOOV * moov, guint32 fourcc, guint8 * data, + guint size); + +void atom_moov_add_xmp_tags (AtomMOOV * moov, GstBuffer * xmp); + +#define GST_QT_MUX_DEFAULT_TAG_LANGUAGE "eng" +guint16 language_code (const char * lang); + +#endif /* __ATOMS_H__ */ diff --git a/gst/isomp4/atomsrecovery.c b/gst/isomp4/atomsrecovery.c new file mode 100644 index 0000000..1d53ed8 --- /dev/null +++ b/gst/isomp4/atomsrecovery.c @@ -0,0 +1,1104 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2010 Thiago Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** + * This module contains functions for serializing partial information from + * a mux in progress (by qtmux elements). This enables reconstruction of the + * moov box if a crash happens and thus recovering the movie file. + * + * Usage: + * 1) pipeline: ...yourelements ! qtmux moov-recovery-file=path.mrf ! \ + * filesink location=moovie.mov + * + * 2) CRASH! + * + * 3) gst-launch qtmoovrecover recovery-input=path.mrf broken-input=moovie.mov \ + fixed-output=recovered.mov + * + * 4) (Hopefully) enjoy recovered.mov. + * + * --- Recovery file layout --- + * 1) Version (a guint16) + * 2) Prefix atom (if present) + * 3) ftyp atom + * 4) MVHD atom (without timescale/duration set) + * 5) moovie timescale + * 6) number of traks + * 7) list of trak atoms (stbl data is ignored, except for the stsd atom) + * 8) Buffers metadata (metadata that is relevant to the container) + * Buffers metadata are stored in the order they are added to the mdat, + * each entre has a fixed size and is stored in BE. booleans are stored + * as a single byte where 0 means false, otherwise is true. + * Metadata: + * - guint32 track_id; + * - guint32 nsamples; + * - guint32 delta; + * - guint32 size; + * - guint64 chunk_offset; + * - gboolean sync; + * - gboolean do_pts; + * - guint64 pts_offset; (always present, ignored if do_pts is false) + * + * The mdat file might contain ftyp and then mdat, in case this is the faststart + * temporary file there is no ftyp and no mdat header, only the buffers data. + * + * Notes about recovery file layout: We still don't store tags nor EDTS data. + * + * IMPORTANT: this is still at a experimental state. + */ + +#include "atomsrecovery.h" + +#define ATOMS_RECOV_OUTPUT_WRITE_ERROR(err) \ + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, \ + "Failed to write to output file: %s", g_strerror (errno)) + +static gboolean +atoms_recov_write_version (FILE * f) +{ + guint8 data[2]; + GST_WRITE_UINT16_BE (data, ATOMS_RECOV_FILE_VERSION); + return fwrite (data, 2, 1, f) == 1; +} + +static gboolean +atoms_recov_write_ftyp_info (FILE * f, AtomFTYP * ftyp, GstBuffer * prefix) +{ + guint8 *data = NULL; + guint64 offset = 0; + guint64 size = 0; + + if (prefix) { + if (fwrite (GST_BUFFER_DATA (prefix), 1, GST_BUFFER_SIZE (prefix), f) != + GST_BUFFER_SIZE (prefix)) { + return FALSE; + } + } + if (!atom_ftyp_copy_data (ftyp, &data, &size, &offset)) { + return FALSE; + } + if (fwrite (data, 1, offset, f) != offset) { + g_free (data); + return FALSE; + } + g_free (data); + return TRUE; +} + +/** + * Writes important info on the 'moov' atom (non-trak related) + * to be able to recover the moov structure after a crash. + * + * Currently, it writes the MVHD atom. + */ +static gboolean +atoms_recov_write_moov_info (FILE * f, AtomMOOV * moov) +{ + guint8 *data; + guint64 size; + guint64 offset = 0; + guint64 atom_size = 0; + gint writen = 0; + + /* likely enough */ + size = 256; + data = g_malloc (size); + atom_size = atom_mvhd_copy_data (&moov->mvhd, &data, &size, &offset); + if (atom_size > 0) + writen = fwrite (data, 1, atom_size, f); + g_free (data); + return atom_size > 0 && writen == atom_size; +} + +/** + * Writes the number of traks to the file. + * This simply writes a guint32 in BE. + */ +static gboolean +atoms_recov_write_traks_number (FILE * f, guint32 traks) +{ + guint8 data[4]; + GST_WRITE_UINT32_BE (data, traks); + return fwrite (data, 4, 1, f) == 1; +} + +/** + * Writes the moov's timescale to the file + * This simply writes a guint32 in BE. + */ +static gboolean +atoms_recov_write_moov_timescale (FILE * f, guint32 timescale) +{ + guint8 data[4]; + GST_WRITE_UINT32_BE (data, timescale); + return fwrite (data, 4, 1, f) == 1; +} + +/** + * Writes the trak atom to the file. + */ +gboolean +atoms_recov_write_trak_info (FILE * f, AtomTRAK * trak) +{ + guint8 *data; + guint64 size; + guint64 offset = 0; + guint64 atom_size = 0; + gint writen = 0; + + /* buffer is realloced to a larger size if needed */ + size = 4 * 1024; + data = g_malloc (size); + atom_size = atom_trak_copy_data (trak, &data, &size, &offset); + if (atom_size > 0) + writen = fwrite (data, atom_size, 1, f); + g_free (data); + return atom_size > 0 && writen == atom_size; +} + +gboolean +atoms_recov_write_trak_samples (FILE * f, AtomTRAK * trak, guint32 nsamples, + guint32 delta, guint32 size, guint64 chunk_offset, gboolean sync, + gboolean do_pts, gint64 pts_offset) +{ + guint8 data[TRAK_BUFFER_ENTRY_INFO_SIZE]; + /* + * We have to write a TrakBufferEntryInfo + */ + GST_WRITE_UINT32_BE (data + 0, trak->tkhd.track_ID); + GST_WRITE_UINT32_BE (data + 4, nsamples); + GST_WRITE_UINT32_BE (data + 8, delta); + GST_WRITE_UINT32_BE (data + 12, size); + GST_WRITE_UINT64_BE (data + 16, chunk_offset); + if (sync) + GST_WRITE_UINT8 (data + 24, 1); + else + GST_WRITE_UINT8 (data + 24, 0); + if (do_pts) { + GST_WRITE_UINT8 (data + 25, 1); + GST_WRITE_UINT64_BE (data + 26, pts_offset); + } else { + GST_WRITE_UINT8 (data + 25, 0); + GST_WRITE_UINT64_BE (data + 26, 0); + } + + return fwrite (data, 1, TRAK_BUFFER_ENTRY_INFO_SIZE, f) == + TRAK_BUFFER_ENTRY_INFO_SIZE; +} + +gboolean +atoms_recov_write_headers (FILE * f, AtomFTYP * ftyp, GstBuffer * prefix, + AtomMOOV * moov, guint32 timescale, guint32 traks_number) +{ + if (!atoms_recov_write_version (f)) { + return FALSE; + } + + if (!atoms_recov_write_ftyp_info (f, ftyp, prefix)) { + return FALSE; + } + + if (!atoms_recov_write_moov_info (f, moov)) { + return FALSE; + } + + if (!atoms_recov_write_moov_timescale (f, timescale)) { + return FALSE; + } + + if (!atoms_recov_write_traks_number (f, traks_number)) { + return FALSE; + } + + return TRUE; +} + +static gboolean +read_atom_header (FILE * f, guint32 * fourcc, guint32 * size) +{ + guint8 aux[8]; + + if (fread (aux, 1, 8, f) != 8) + return FALSE; + *size = GST_READ_UINT32_BE (aux); + *fourcc = GST_READ_UINT32_LE (aux + 4); + return TRUE; +} + +static gboolean +moov_recov_file_parse_prefix (MoovRecovFile * moovrf) +{ + guint32 fourcc; + guint32 size; + guint32 total_size = 0; + if (fseek (moovrf->file, 2, SEEK_SET) != 0) + return FALSE; + if (!read_atom_header (moovrf->file, &fourcc, &size)) { + return FALSE; + } + + if (fourcc != FOURCC_ftyp) { + /* we might have a prefix here */ + if (fseek (moovrf->file, size - 8, SEEK_CUR) != 0) + return FALSE; + + total_size += size; + + /* now read the ftyp */ + if (!read_atom_header (moovrf->file, &fourcc, &size)) + return FALSE; + } + + /* this has to be the ftyp */ + if (fourcc != FOURCC_ftyp) + return FALSE; + total_size += size; + moovrf->prefix_size = total_size; + return fseek (moovrf->file, size - 8, SEEK_CUR) == 0; +} + +static gboolean +moov_recov_file_parse_mvhd (MoovRecovFile * moovrf) +{ + guint32 fourcc; + guint32 size; + if (!read_atom_header (moovrf->file, &fourcc, &size)) { + return FALSE; + } + /* check for sanity */ + if (fourcc != FOURCC_mvhd) + return FALSE; + + moovrf->mvhd_size = size; + moovrf->mvhd_pos = ftell (moovrf->file) - 8; + + /* skip the remaining of the mvhd in the file */ + return fseek (moovrf->file, size - 8, SEEK_CUR) == 0; +} + +static gboolean +mdat_recov_file_parse_mdat_start (MdatRecovFile * mdatrf) +{ + guint32 fourcc, size; + + if (!read_atom_header (mdatrf->file, &fourcc, &size)) { + return FALSE; + } + if (size == 1) { + mdatrf->mdat_header_size = 16; + mdatrf->mdat_size = 16; + } else { + mdatrf->mdat_header_size = 8; + mdatrf->mdat_size = 8; + } + mdatrf->mdat_start = ftell (mdatrf->file) - 8; + + return fourcc == FOURCC_mdat; +} + +MdatRecovFile * +mdat_recov_file_create (FILE * file, gboolean datafile, GError ** err) +{ + MdatRecovFile *mrf = g_new0 (MdatRecovFile, 1); + guint32 fourcc, size; + + g_return_val_if_fail (file != NULL, NULL); + + mrf->file = file; + mrf->rawfile = datafile; + + /* get the file/data length */ + if (fseek (file, 0, SEEK_END) != 0) + goto file_length_error; + /* still needs to deduce the mdat header and ftyp size */ + mrf->data_size = ftell (file); + if (mrf->data_size == -1L) + goto file_length_error; + + if (fseek (file, 0, SEEK_SET) != 0) + goto file_seek_error; + + if (datafile) { + /* this file contains no atoms, only raw data to be placed on the mdat + * this happens when faststart mode is used */ + mrf->mdat_start = 0; + mrf->mdat_header_size = 16; + mrf->mdat_size = 16; + return mrf; + } + + if (!read_atom_header (file, &fourcc, &size)) { + goto parse_error; + } + if (fourcc != FOURCC_ftyp) { + /* this could be a prefix atom, let's skip it and try again */ + if (fseek (file, size - 8, SEEK_CUR) != 0) { + goto file_seek_error; + } + if (!read_atom_header (file, &fourcc, &size)) { + goto parse_error; + } + } + + if (fourcc != FOURCC_ftyp) { + goto parse_error; + } + if (fseek (file, size - 8, SEEK_CUR) != 0) + goto file_seek_error; + + /* we don't parse this if we have a tmpdatafile */ + if (!mdat_recov_file_parse_mdat_start (mrf)) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, + "Error while parsing mdat atom"); + goto fail; + } + + return mrf; + +parse_error: + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, + "Failed to parse atom"); + goto fail; + +file_seek_error: + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, + "Failed to seek to start of the file"); + goto fail; + +file_length_error: + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, + "Failed to determine file size"); + goto fail; + +fail: + mdat_recov_file_free (mrf); + return NULL; +} + +void +mdat_recov_file_free (MdatRecovFile * mrf) +{ + fclose (mrf->file); + g_free (mrf); +} + +static gboolean +moov_recov_parse_num_traks (MoovRecovFile * moovrf) +{ + guint8 traks[4]; + if (fread (traks, 1, 4, moovrf->file) != 4) + return FALSE; + moovrf->num_traks = GST_READ_UINT32_BE (traks); + return TRUE; +} + +static gboolean +moov_recov_parse_moov_timescale (MoovRecovFile * moovrf) +{ + guint8 ts[4]; + if (fread (ts, 1, 4, moovrf->file) != 4) + return FALSE; + moovrf->timescale = GST_READ_UINT32_BE (ts); + return TRUE; +} + +static gboolean +skip_atom (MoovRecovFile * moovrf, guint32 expected_fourcc) +{ + guint32 size; + guint32 fourcc; + + if (!read_atom_header (moovrf->file, &fourcc, &size)) + return FALSE; + if (fourcc != expected_fourcc) + return FALSE; + + return (fseek (moovrf->file, size - 8, SEEK_CUR) == 0); +} + +static gboolean +moov_recov_parse_tkhd (MoovRecovFile * moovrf, TrakRecovData * trakrd) +{ + guint32 size; + guint32 fourcc; + guint8 data[4]; + + /* make sure we are on a tkhd atom */ + if (!read_atom_header (moovrf->file, &fourcc, &size)) + return FALSE; + if (fourcc != FOURCC_tkhd) + return FALSE; + + trakrd->tkhd_file_offset = ftell (moovrf->file) - 8; + + /* move 8 bytes forward to the trak_id pos */ + if (fseek (moovrf->file, 12, SEEK_CUR) != 0) + return FALSE; + if (fread (data, 1, 4, moovrf->file) != 4) + return FALSE; + + /* advance the rest of tkhd */ + fseek (moovrf->file, 68, SEEK_CUR); + + trakrd->trak_id = GST_READ_UINT32_BE (data); + return TRUE; +} + +static gboolean +moov_recov_parse_stbl (MoovRecovFile * moovrf, TrakRecovData * trakrd) +{ + guint32 size; + guint32 fourcc; + guint32 auxsize; + + if (!read_atom_header (moovrf->file, &fourcc, &size)) + return FALSE; + if (fourcc != FOURCC_stbl) + return FALSE; + + trakrd->stbl_file_offset = ftell (moovrf->file) - 8; + trakrd->stbl_size = size; + + /* skip the stsd */ + if (!read_atom_header (moovrf->file, &fourcc, &auxsize)) + return FALSE; + if (fourcc != FOURCC_stsd) + return FALSE; + if (fseek (moovrf->file, auxsize - 8, SEEK_CUR) != 0) + return FALSE; + + trakrd->stsd_size = auxsize; + trakrd->post_stsd_offset = ftell (moovrf->file); + + /* as this is the last atom we parse, we don't skip forward */ + + return TRUE; +} + +static gboolean +moov_recov_parse_minf (MoovRecovFile * moovrf, TrakRecovData * trakrd) +{ + guint32 size; + guint32 fourcc; + guint32 auxsize; + + if (!read_atom_header (moovrf->file, &fourcc, &size)) + return FALSE; + if (fourcc != FOURCC_minf) + return FALSE; + + trakrd->minf_file_offset = ftell (moovrf->file) - 8; + trakrd->minf_size = size; + + /* skip either of vmhd, smhd, hmhd that might follow */ + if (!read_atom_header (moovrf->file, &fourcc, &auxsize)) + return FALSE; + if (fourcc != FOURCC_vmhd && fourcc != FOURCC_smhd && fourcc != FOURCC_hmhd && + fourcc != FOURCC_gmhd) + return FALSE; + if (fseek (moovrf->file, auxsize - 8, SEEK_CUR)) + return FALSE; + + /* skip a possible hdlr and the following dinf */ + if (!read_atom_header (moovrf->file, &fourcc, &auxsize)) + return FALSE; + if (fourcc == FOURCC_hdlr) { + if (fseek (moovrf->file, auxsize - 8, SEEK_CUR)) + return FALSE; + if (!read_atom_header (moovrf->file, &fourcc, &auxsize)) + return FALSE; + } + if (fourcc != FOURCC_dinf) + return FALSE; + if (fseek (moovrf->file, auxsize - 8, SEEK_CUR)) + return FALSE; + + /* now we are ready to read the stbl */ + if (!moov_recov_parse_stbl (moovrf, trakrd)) + return FALSE; + + return TRUE; +} + +static gboolean +moov_recov_parse_mdhd (MoovRecovFile * moovrf, TrakRecovData * trakrd) +{ + guint32 size; + guint32 fourcc; + guint8 data[4]; + + /* make sure we are on a tkhd atom */ + if (!read_atom_header (moovrf->file, &fourcc, &size)) + return FALSE; + if (fourcc != FOURCC_mdhd) + return FALSE; + + trakrd->mdhd_file_offset = ftell (moovrf->file) - 8; + + /* get the timescale */ + if (fseek (moovrf->file, 12, SEEK_CUR) != 0) + return FALSE; + if (fread (data, 1, 4, moovrf->file) != 4) + return FALSE; + trakrd->timescale = GST_READ_UINT32_BE (data); + if (fseek (moovrf->file, 8, SEEK_CUR) != 0) + return FALSE; + return TRUE; +} + +static gboolean +moov_recov_parse_mdia (MoovRecovFile * moovrf, TrakRecovData * trakrd) +{ + guint32 size; + guint32 fourcc; + + /* make sure we are on a tkhd atom */ + if (!read_atom_header (moovrf->file, &fourcc, &size)) + return FALSE; + if (fourcc != FOURCC_mdia) + return FALSE; + + trakrd->mdia_file_offset = ftell (moovrf->file) - 8; + trakrd->mdia_size = size; + + if (!moov_recov_parse_mdhd (moovrf, trakrd)) + return FALSE; + + if (!skip_atom (moovrf, FOURCC_hdlr)) + return FALSE; + if (!moov_recov_parse_minf (moovrf, trakrd)) + return FALSE; + return TRUE; +} + +static gboolean +moov_recov_parse_trak (MoovRecovFile * moovrf, TrakRecovData * trakrd) +{ + guint64 offset; + guint32 size; + guint32 fourcc; + + offset = ftell (moovrf->file); + if (offset == -1) { + return FALSE; + } + + /* make sure we are on a trak atom */ + if (!read_atom_header (moovrf->file, &fourcc, &size)) { + return FALSE; + } + if (fourcc != FOURCC_trak) { + return FALSE; + } + trakrd->trak_size = size; + + /* now we should have a trak header 'tkhd' */ + if (!moov_recov_parse_tkhd (moovrf, trakrd)) + return FALSE; + + /* FIXME add edts handling here and in qtmux, as this is only detected + * after buffers start flowing */ + + if (!moov_recov_parse_mdia (moovrf, trakrd)) + return FALSE; + + trakrd->file_offset = offset; + /* position after the trak */ + return fseek (moovrf->file, (long int) offset + size, SEEK_SET) == 0; +} + +MoovRecovFile * +moov_recov_file_create (FILE * file, GError ** err) +{ + gint i; + MoovRecovFile *moovrf = g_new0 (MoovRecovFile, 1); + + g_return_val_if_fail (file != NULL, NULL); + + moovrf->file = file; + + /* look for ftyp and prefix at the start */ + if (!moov_recov_file_parse_prefix (moovrf)) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, + "Error while parsing prefix atoms"); + goto fail; + } + + /* parse the mvhd */ + if (!moov_recov_file_parse_mvhd (moovrf)) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, + "Error while parsing mvhd atom"); + goto fail; + } + + if (!moov_recov_parse_moov_timescale (moovrf)) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, + "Error while parsing timescale"); + goto fail; + } + if (!moov_recov_parse_num_traks (moovrf)) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, + "Error while parsing parsing number of traks"); + goto fail; + } + + /* sanity check */ + if (moovrf->num_traks > 1024) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, + "Unsupported number of traks"); + goto fail; + } + + /* init the traks */ + moovrf->traks_rd = g_new0 (TrakRecovData, moovrf->num_traks); + for (i = 0; i < moovrf->num_traks; i++) { + atom_stbl_init (&(moovrf->traks_rd[i].stbl)); + } + for (i = 0; i < moovrf->num_traks; i++) { + if (!moov_recov_parse_trak (moovrf, &(moovrf->traks_rd[i]))) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, + "Error while parsing trak atom"); + goto fail; + } + } + + return moovrf; + +fail: + moov_recov_file_free (moovrf); + return NULL; +} + +void +moov_recov_file_free (MoovRecovFile * moovrf) +{ + gint i; + fclose (moovrf->file); + if (moovrf->traks_rd) { + for (i = 0; i < moovrf->num_traks; i++) { + atom_stbl_clear (&(moovrf->traks_rd[i].stbl)); + } + g_free (moovrf->traks_rd); + } + g_free (moovrf); +} + +static gboolean +moov_recov_parse_buffer_entry (MoovRecovFile * moovrf, TrakBufferEntryInfo * b) +{ + guint8 data[TRAK_BUFFER_ENTRY_INFO_SIZE]; + gint read; + + read = fread (data, 1, TRAK_BUFFER_ENTRY_INFO_SIZE, moovrf->file); + if (read != TRAK_BUFFER_ENTRY_INFO_SIZE) + return FALSE; + + b->track_id = GST_READ_UINT32_BE (data); + b->nsamples = GST_READ_UINT32_BE (data + 4); + b->delta = GST_READ_UINT32_BE (data + 8); + b->size = GST_READ_UINT32_BE (data + 12); + b->chunk_offset = GST_READ_UINT64_BE (data + 16); + b->sync = data[24] != 0; + b->do_pts = data[25] != 0; + b->pts_offset = GST_READ_UINT64_BE (data + 26); + return TRUE; +} + +static gboolean +mdat_recov_add_sample (MdatRecovFile * mdatrf, guint32 size) +{ + /* test if this data exists */ + if (mdatrf->mdat_size - mdatrf->mdat_header_size + size > mdatrf->data_size) + return FALSE; + + mdatrf->mdat_size += size; + return TRUE; +} + +static TrakRecovData * +moov_recov_get_trak (MoovRecovFile * moovrf, guint32 id) +{ + gint i; + for (i = 0; i < moovrf->num_traks; i++) { + if (moovrf->traks_rd[i].trak_id == id) + return &(moovrf->traks_rd[i]); + } + return NULL; +} + +static void +trak_recov_data_add_sample (TrakRecovData * trak, TrakBufferEntryInfo * b) +{ + trak->duration += b->nsamples * b->delta; + atom_stbl_add_samples (&trak->stbl, b->nsamples, b->delta, b->size, + b->chunk_offset, b->sync, b->pts_offset); +} + +/** + * Parses the buffer entries in the MoovRecovFile and matches the inputs + * with the data in the MdatRecovFile. Whenever a buffer entry of that + * represents 'x' bytes of data, the same amount of data is 'validated' in + * the MdatRecovFile and will be inluded in the generated moovie file. + */ +gboolean +moov_recov_parse_buffers (MoovRecovFile * moovrf, MdatRecovFile * mdatrf, + GError ** err) +{ + TrakBufferEntryInfo entry; + TrakRecovData *trak; + + /* we assume both moovrf and mdatrf are at the starting points of their + * data reading */ + while (moov_recov_parse_buffer_entry (moovrf, &entry)) { + /* be sure we still have this data in mdat */ + trak = moov_recov_get_trak (moovrf, entry.track_id); + if (trak == NULL) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, + "Invalid trak id found in buffer entry"); + return FALSE; + } + if (!mdat_recov_add_sample (mdatrf, entry.size)) + break; + trak_recov_data_add_sample (trak, &entry); + } + return TRUE; +} + +static guint32 +trak_recov_data_get_trak_atom_size (TrakRecovData * trak) +{ + AtomSTBL *stbl = &trak->stbl; + guint64 offset; + + /* write out our stbl child atoms */ + offset = 0; + + if (!atom_stts_copy_data (&stbl->stts, NULL, NULL, &offset)) { + goto fail; + } + if (atom_array_get_len (&stbl->stss.entries) > 0) { + if (!atom_stss_copy_data (&stbl->stss, NULL, NULL, &offset)) { + goto fail; + } + } + if (!atom_stsc_copy_data (&stbl->stsc, NULL, NULL, &offset)) { + goto fail; + } + if (!atom_stsz_copy_data (&stbl->stsz, NULL, NULL, &offset)) { + goto fail; + } + if (stbl->ctts) { + if (!atom_ctts_copy_data (stbl->ctts, NULL, NULL, &offset)) { + goto fail; + } + } + if (!atom_stco64_copy_data (&stbl->stco64, NULL, NULL, &offset)) { + goto fail; + } + + return trak->trak_size + ((trak->stsd_size + offset + 8) - trak->stbl_size); + +fail: + return 0; +} + +static guint8 * +moov_recov_get_stbl_children_data (MoovRecovFile * moovrf, TrakRecovData * trak, + guint64 * p_size) +{ + AtomSTBL *stbl = &trak->stbl; + guint8 *buffer; + guint64 size; + guint64 offset; + + /* write out our stbl child atoms + * + * Use 1MB as a starting size, *_copy_data functions + * will grow the buffer if needed. + */ + size = 1024 * 1024; + buffer = g_malloc0 (size); + offset = 0; + + if (!atom_stts_copy_data (&stbl->stts, &buffer, &size, &offset)) { + goto fail; + } + if (atom_array_get_len (&stbl->stss.entries) > 0) { + if (!atom_stss_copy_data (&stbl->stss, &buffer, &size, &offset)) { + goto fail; + } + } + if (!atom_stsc_copy_data (&stbl->stsc, &buffer, &size, &offset)) { + goto fail; + } + if (!atom_stsz_copy_data (&stbl->stsz, &buffer, &size, &offset)) { + goto fail; + } + if (stbl->ctts) { + if (!atom_ctts_copy_data (stbl->ctts, &buffer, &size, &offset)) { + goto fail; + } + } + if (!atom_stco64_copy_data (&stbl->stco64, &buffer, &size, &offset)) { + goto fail; + } + *p_size = offset; + return buffer; + +fail: + g_free (buffer); + return NULL; +} + +gboolean +moov_recov_write_file (MoovRecovFile * moovrf, MdatRecovFile * mdatrf, + FILE * outf, GError ** err) +{ + guint8 auxdata[16]; + guint8 *data = NULL; + guint8 *prefix_data = NULL; + guint8 *mvhd_data = NULL; + guint8 *trak_data = NULL; + guint32 moov_size = 0; + gint i; + guint64 stbl_children_size = 0; + guint8 *stbl_children = NULL; + guint32 longest_duration = 0; + guint16 version; + + /* check the version */ + if (fseek (moovrf->file, 0, SEEK_SET) != 0) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, + "Failed to seek to the start of the moov recovery file"); + goto fail; + } + if (fread (auxdata, 1, 2, moovrf->file) != 2) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, + "Failed to read version from file"); + } + + version = GST_READ_UINT16_BE (auxdata); + if (version != ATOMS_RECOV_FILE_VERSION) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_VERSION, + "Input file version (%u) is not supported in this version (%u)", + version, ATOMS_RECOV_FILE_VERSION); + return FALSE; + } + + /* write the ftyp */ + prefix_data = g_malloc (moovrf->prefix_size); + if (fread (prefix_data, 1, moovrf->prefix_size, + moovrf->file) != moovrf->prefix_size) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, + "Failed to read the ftyp atom from file"); + goto fail; + } + if (fwrite (prefix_data, 1, moovrf->prefix_size, outf) != moovrf->prefix_size) { + ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); + goto fail; + } + g_free (prefix_data); + prefix_data = NULL; + + /* need to calculate the moov size beforehand to add the offset to + * chunk offset entries */ + moov_size += moovrf->mvhd_size + 8; /* mvhd + moov size + fourcc */ + for (i = 0; i < moovrf->num_traks; i++) { + TrakRecovData *trak = &(moovrf->traks_rd[i]); + guint32 duration; /* in moov's timescale */ + guint32 trak_size; + + /* convert trak duration to moov's duration */ + duration = gst_util_uint64_scale_round (trak->duration, moovrf->timescale, + trak->timescale); + + if (duration > longest_duration) + longest_duration = duration; + trak_size = trak_recov_data_get_trak_atom_size (trak); + if (trak_size == 0) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_GENERIC, + "Failed to estimate trak atom size"); + goto fail; + } + moov_size += trak_size; + } + + /* add chunks offsets */ + for (i = 0; i < moovrf->num_traks; i++) { + TrakRecovData *trak = &(moovrf->traks_rd[i]); + /* 16 for the mdat header */ + gint64 offset = moov_size + ftell (outf) + 16; + atom_stco64_chunks_add_offset (&trak->stbl.stco64, offset); + } + + /* write the moov */ + GST_WRITE_UINT32_BE (auxdata, moov_size); + GST_WRITE_UINT32_LE (auxdata + 4, FOURCC_moov); + if (fwrite (auxdata, 1, 8, outf) != 8) { + ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); + goto fail; + } + + /* write the mvhd */ + mvhd_data = g_malloc (moovrf->mvhd_size); + if (fseek (moovrf->file, moovrf->mvhd_pos, SEEK_SET) != 0) + goto fail; + if (fread (mvhd_data, 1, moovrf->mvhd_size, + moovrf->file) != moovrf->mvhd_size) + goto fail; + GST_WRITE_UINT32_BE (mvhd_data + 20, moovrf->timescale); + GST_WRITE_UINT32_BE (mvhd_data + 24, longest_duration); + if (fwrite (mvhd_data, 1, moovrf->mvhd_size, outf) != moovrf->mvhd_size) { + ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); + goto fail; + } + g_free (mvhd_data); + mvhd_data = NULL; + + /* write the traks, this is the tough part because we need to update: + * - stbl atom + * - sizes of atoms from stbl to trak + * - trak duration + */ + for (i = 0; i < moovrf->num_traks; i++) { + TrakRecovData *trak = &(moovrf->traks_rd[i]); + guint trak_data_size; + guint32 stbl_new_size; + guint32 minf_new_size; + guint32 mdia_new_size; + guint32 trak_new_size; + guint32 size_diff; + guint32 duration; /* in moov's timescale */ + + /* convert trak duration to moov's duration */ + duration = gst_util_uint64_scale_round (trak->duration, moovrf->timescale, + trak->timescale); + + stbl_children = moov_recov_get_stbl_children_data (moovrf, trak, + &stbl_children_size); + if (stbl_children == NULL) + goto fail; + + /* calc the new size of the atoms from stbl to trak in the atoms tree */ + stbl_new_size = trak->stsd_size + stbl_children_size + 8; + size_diff = stbl_new_size - trak->stbl_size; + minf_new_size = trak->minf_size + size_diff; + mdia_new_size = trak->mdia_size + size_diff; + trak_new_size = trak->trak_size + size_diff; + + if (fseek (moovrf->file, trak->file_offset, SEEK_SET) != 0) + goto fail; + trak_data_size = trak->post_stsd_offset - trak->file_offset; + trak_data = g_malloc (trak_data_size); + if (fread (trak_data, 1, trak_data_size, moovrf->file) != trak_data_size) { + goto fail; + } + /* update the size values in those read atoms before writing */ + GST_WRITE_UINT32_BE (trak_data, trak_new_size); + GST_WRITE_UINT32_BE (trak_data + (trak->mdia_file_offset - + trak->file_offset), mdia_new_size); + GST_WRITE_UINT32_BE (trak_data + (trak->minf_file_offset - + trak->file_offset), minf_new_size); + GST_WRITE_UINT32_BE (trak_data + (trak->stbl_file_offset - + trak->file_offset), stbl_new_size); + + /* update duration values in tkhd and mdhd */ + GST_WRITE_UINT32_BE (trak_data + (trak->tkhd_file_offset - + trak->file_offset) + 28, duration); + GST_WRITE_UINT32_BE (trak_data + (trak->mdhd_file_offset - + trak->file_offset) + 24, trak->duration); + + if (fwrite (trak_data, 1, trak_data_size, outf) != trak_data_size) { + ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); + goto fail; + } + if (fwrite (stbl_children, 1, stbl_children_size, outf) != + stbl_children_size) { + ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); + goto fail; + } + g_free (trak_data); + trak_data = NULL; + g_free (stbl_children); + stbl_children = NULL; + } + + /* write the mdat */ + /* write the header first */ + GST_WRITE_UINT32_BE (auxdata, 1); + GST_WRITE_UINT32_LE (auxdata + 4, FOURCC_mdat); + GST_WRITE_UINT64_BE (auxdata + 8, mdatrf->mdat_size); + if (fwrite (auxdata, 1, 16, outf) != 16) { + ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); + goto fail; + } + + /* now read the mdat data and output to the file */ + if (fseek (mdatrf->file, mdatrf->mdat_start + + (mdatrf->rawfile ? 0 : mdatrf->mdat_header_size), SEEK_SET) != 0) + goto fail; + + data = g_malloc (4096); + while (!feof (mdatrf->file)) { + gint read, write; + + read = fread (data, 1, 4096, mdatrf->file); + write = fwrite (data, 1, read, outf); + + if (write != read) { + g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, + "Failed to copy data to output file: %s", g_strerror (errno)); + goto fail; + } + } + g_free (data); + + return TRUE; + +fail: + g_free (stbl_children); + g_free (mvhd_data); + g_free (prefix_data); + g_free (trak_data); + g_free (data); + return FALSE; +} diff --git a/gst/isomp4/atomsrecovery.h b/gst/isomp4/atomsrecovery.h new file mode 100644 index 0000000..4dffc48 --- /dev/null +++ b/gst/isomp4/atomsrecovery.h @@ -0,0 +1,159 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2010 Thiago Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __ATOMS_RECOVERY_H__ +#define __ATOMS_RECOVERY_H__ + +#include +#include +#include +#include + +#include "atoms.h" + +/* Version to be incremented each time we decide + * to change the file layout */ +#define ATOMS_RECOV_FILE_VERSION 1 + +#define ATOMS_RECOV_QUARK (g_quark_from_string ("qtmux-atoms-recovery")) + +/* gerror error codes */ +#define ATOMS_RECOV_ERR_GENERIC 1 +#define ATOMS_RECOV_ERR_FILE 2 +#define ATOMS_RECOV_ERR_PARSING 3 +#define ATOMS_RECOV_ERR_VERSION 4 + +/* this struct represents each buffer in a moov file, containing the info + * that is placed in the stsd children atoms + * Fields should be writen in BE order, and booleans should be writen as + * 1byte with 0 for false, anything otherwise */ +#define TRAK_BUFFER_ENTRY_INFO_SIZE 34 +typedef struct +{ + guint32 track_id; + guint32 nsamples; + guint32 delta; + guint32 size; + guint64 chunk_offset; + guint64 pts_offset; + gboolean sync; + gboolean do_pts; +} TrakBufferEntryInfo; + +typedef struct +{ + guint32 trak_id; + guint32 duration; /* duration in trak timescale */ + guint32 timescale; /* trak's timescale */ + + guint64 file_offset; + + /* need for later updating duration */ + guint64 tkhd_file_offset; + guint64 mdhd_file_offset; + + /* need these offsets to update size */ + guint32 trak_size; + guint64 mdia_file_offset; + guint32 mdia_size; + guint64 minf_file_offset; + guint32 minf_size; + guint64 stbl_file_offset; + guint32 stbl_size; + + guint64 post_stsd_offset; + guint32 stsd_size; + + /* for storing the samples info */ + AtomSTBL stbl; +} TrakRecovData; + +typedef struct +{ + FILE * file; + gboolean rawfile; + + /* results from parsing the input file */ + guint64 data_size; + guint32 mdat_header_size; + guint mdat_start; + + guint64 mdat_size; +} MdatRecovFile; + +typedef struct +{ + FILE * file; + guint32 timescale; + + guint32 mvhd_pos; + guint32 mvhd_size; + guint32 prefix_size; /* prefix + ftyp total size */ + + gint num_traks; + TrakRecovData *traks_rd; +} MoovRecovFile; + +gboolean atoms_recov_write_trak_info (FILE * f, AtomTRAK * trak); +gboolean atoms_recov_write_headers (FILE * f, AtomFTYP * ftyp, + GstBuffer * prefix, AtomMOOV * moov, + guint32 timescale, + guint32 traks_number); +gboolean atoms_recov_write_trak_samples (FILE * f, AtomTRAK * trak, + guint32 nsamples, guint32 delta, + guint32 size, guint64 chunk_offset, + gboolean sync, gboolean do_pts, + gint64 pts_offset); + +MdatRecovFile * mdat_recov_file_create (FILE * file, gboolean datafile, + GError ** err); +void mdat_recov_file_free (MdatRecovFile * mrf); +MoovRecovFile * moov_recov_file_create (FILE * file, GError ** err); +void moov_recov_file_free (MoovRecovFile * moovrf); +gboolean moov_recov_parse_buffers (MoovRecovFile * moovrf, + MdatRecovFile * mdatrf, + GError ** err); +gboolean moov_recov_write_file (MoovRecovFile * moovrf, + MdatRecovFile * mdatrf, FILE * outf, + GError ** err); + +#endif /* __ATOMS_RECOVERY_H__ */ diff --git a/gst/isomp4/descriptors.c b/gst/isomp4/descriptors.c new file mode 100644 index 0000000..e7d5a5d --- /dev/null +++ b/gst/isomp4/descriptors.c @@ -0,0 +1,457 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008 Thiago Sousa Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "descriptors.h" + +/* + * Some mp4 structures (descriptors) use a coding scheme for + * representing its size. + * It is grouped in bytes. The 1st bit set to 1 means we need another byte, + * 0 otherwise. The remaining 7 bits are the useful values. + * + * The next set of functions handle those values + */ + +/* + * Gets an unsigned integer and packs it into a 'expandable size' format + * (as used by mp4 descriptors) + * @size: the integer to be parsed + * @ptr: the array to place the result + * @array_size: the size of ptr array + */ +static void +expandable_size_parse (guint64 size, guint8 * ptr, guint32 array_size) +{ + int index = 0; + + memset (ptr, 0, sizeof (array_size)); + while (size > 0 && index < array_size) { + ptr[index++] = (size > 0x7F ? 0x80 : 0x0) | (size & 0x7F); + size = size >> 7; + } +} + +/* + * Gets how many positions in an array holding an 'expandable size' + * are really used + * + * @ptr: the array with the 'expandable size' + * @array_size: the size of ptr array + * + * Returns: the number of really used positions + */ +static guint64 +expandable_size_get_length (guint8 * ptr, guint32 array_size) +{ + gboolean next = TRUE; + guint32 index = 0; + + while (next && index < array_size) { + next = ((ptr[index] & 0x80) == 1); + index++; + } + return index; +} + +/* + * Initializers below + */ + +static void +desc_base_descriptor_init (BaseDescriptor * bd, guint8 tag, guint32 size) +{ + bd->tag = tag; + expandable_size_parse (size, bd->size, 4); +} + +static void +desc_dec_specific_info_init (DecoderSpecificInfoDescriptor * dsid) +{ + desc_base_descriptor_init (&dsid->base, DECODER_SPECIFIC_INFO_TAG, 0); + dsid->length = 0; + dsid->data = NULL; +} + +DecoderSpecificInfoDescriptor * +desc_dec_specific_info_new (void) +{ + DecoderSpecificInfoDescriptor *desc = + g_new0 (DecoderSpecificInfoDescriptor, 1); + desc_dec_specific_info_init (desc); + return desc; +} + +static void +desc_dec_conf_desc_init (DecoderConfigDescriptor * dcd) +{ + desc_base_descriptor_init (&dcd->base, DECODER_CONFIG_DESC_TAG, 0); + dcd->dec_specific_info = NULL; +} + +static void +desc_sl_conf_desc_init (SLConfigDescriptor * sl) +{ + desc_base_descriptor_init (&sl->base, SL_CONFIG_DESC_TAG, 0); + sl->predefined = 0x2; +} + +void +desc_es_init (ESDescriptor * es) +{ + desc_base_descriptor_init (&es->base, ES_DESCRIPTOR_TAG, 0); + + es->id = 0; + es->flags = 0; + es->depends_on_es_id = 0; + es->ocr_es_id = 0; + es->url_length = 0; + es->url_string = NULL; + + desc_dec_conf_desc_init (&es->dec_conf_desc); + desc_sl_conf_desc_init (&es->sl_conf_desc); +} + +ESDescriptor * +desc_es_descriptor_new (void) +{ + ESDescriptor *es = g_new0 (ESDescriptor, 1); + + desc_es_init (es); + return es; +} + +/* + * Deinitializers/Destructors below + */ + +static void +desc_base_descriptor_clear (BaseDescriptor * base) +{ +} + +void +desc_dec_specific_info_free (DecoderSpecificInfoDescriptor * dsid) +{ + desc_base_descriptor_clear (&dsid->base); + if (dsid->data) { + g_free (dsid->data); + dsid->data = NULL; + } + g_free (dsid); +} + +static void +desc_dec_conf_desc_clear (DecoderConfigDescriptor * dec) +{ + desc_base_descriptor_clear (&dec->base); + if (dec->dec_specific_info) { + desc_dec_specific_info_free (dec->dec_specific_info); + } +} + +static void +desc_sl_config_descriptor_clear (SLConfigDescriptor * sl) +{ + desc_base_descriptor_clear (&sl->base); +} + +void +desc_es_descriptor_clear (ESDescriptor * es) +{ + desc_base_descriptor_clear (&es->base); + if (es->url_string) { + g_free (es->url_string); + es->url_string = NULL; + } + desc_dec_conf_desc_clear (&es->dec_conf_desc); + desc_sl_config_descriptor_clear (&es->sl_conf_desc); +} + +/* + * Size handling functions below + */ + +void +desc_dec_specific_info_alloc_data (DecoderSpecificInfoDescriptor * dsid, + guint32 size) +{ + if (dsid->data) { + g_free (dsid->data); + } + dsid->data = g_new0 (guint8, size); + dsid->length = size; +} + +static void +desc_base_descriptor_set_size (BaseDescriptor * bd, guint32 size) +{ + expandable_size_parse (size, bd->size, 4); +} + +static guint64 +desc_base_descriptor_get_size (BaseDescriptor * bd) +{ + guint64 size = 0; + + size += sizeof (guint8); + size += expandable_size_get_length (bd->size, 4) * sizeof (guint8); + return size; +} + +static guint64 +desc_sl_config_descriptor_get_size (SLConfigDescriptor * sl_desc) +{ + guint64 size = 0; + guint64 extra_size = 0; + + size += desc_base_descriptor_get_size (&sl_desc->base); + /* predefined */ + extra_size += sizeof (guint8); + + desc_base_descriptor_set_size (&sl_desc->base, extra_size); + + return size + extra_size; +} + +static guint64 +desc_dec_specific_info_get_size (DecoderSpecificInfoDescriptor * dsid) +{ + guint64 size = 0; + guint64 extra_size = 0; + + size += desc_base_descriptor_get_size (&dsid->base); + extra_size += sizeof (guint8) * dsid->length; + desc_base_descriptor_set_size (&dsid->base, extra_size); + return size + extra_size; +} + +static guint64 +desc_dec_config_descriptor_get_size (DecoderConfigDescriptor * dec_desc) +{ + guint64 size = 0; + guint64 extra_size = 0; + + size += desc_base_descriptor_get_size (&dec_desc->base); + /* object type */ + extra_size += sizeof (guint8); + /* stream type */ + extra_size += sizeof (guint8); + /* buffer size */ + extra_size += sizeof (guint8) * 3; + /* max bitrate */ + extra_size += sizeof (guint32); + /* avg bitrate */ + extra_size += sizeof (guint32); + if (dec_desc->dec_specific_info) { + extra_size += desc_dec_specific_info_get_size (dec_desc->dec_specific_info); + } + + desc_base_descriptor_set_size (&dec_desc->base, extra_size); + return size + extra_size; +} + +static guint64 +desc_es_descriptor_get_size (ESDescriptor * es) +{ + guint64 size = 0; + guint64 extra_size = 0; + + size += desc_base_descriptor_get_size (&es->base); + /* id */ + extra_size += sizeof (guint16); + /* flags */ + extra_size += sizeof (guint8); + /* depends_on_es_id */ + if (es->flags & 0x80) { + extra_size += sizeof (guint16); + } + if (es->flags & 0x40) { + /* url_length */ + extra_size += sizeof (guint8); + /* url */ + extra_size += sizeof (gchar) * es->url_length; + } + if (es->flags & 0x20) { + /* ocr_es_id */ + extra_size += sizeof (guint16); + } + + extra_size += desc_dec_config_descriptor_get_size (&es->dec_conf_desc); + extra_size += desc_sl_config_descriptor_get_size (&es->sl_conf_desc); + + desc_base_descriptor_set_size (&es->base, extra_size); + + return size + extra_size; +} + +static gboolean +desc_es_descriptor_check_stream_dependency (ESDescriptor * es) +{ + return es->flags & 0x80; +} + +static gboolean +desc_es_descriptor_check_url_flag (ESDescriptor * es) +{ + return es->flags & 0x40; +} + +static gboolean +desc_es_descriptor_check_ocr (ESDescriptor * es) +{ + return es->flags & 0x20; +} + +/* Copy/Serializations Functions below */ + +static guint64 +desc_base_descriptor_copy_data (BaseDescriptor * desc, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + prop_copy_uint8 (desc->tag, buffer, size, offset); + prop_copy_uint8_array (desc->size, expandable_size_get_length (desc->size, 4), + buffer, size, offset); + return original_offset - *offset; +} + +static guint64 +desc_sl_config_descriptor_copy_data (SLConfigDescriptor * desc, + guint8 ** buffer, guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!desc_base_descriptor_copy_data (&desc->base, buffer, size, offset)) { + return 0; + } + /* predefined attribute */ + prop_copy_uint8 (desc->predefined, buffer, size, offset); + + return *offset - original_offset; +} + +static guint64 +desc_dec_specific_info_copy_data (DecoderSpecificInfoDescriptor * desc, + guint8 ** buffer, guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!desc_base_descriptor_copy_data (&desc->base, buffer, size, offset)) { + return 0; + } + prop_copy_uint8_array (desc->data, desc->length, buffer, size, offset); + + return *offset - original_offset; +} + +static guint64 +desc_dec_config_descriptor_copy_data (DecoderConfigDescriptor * desc, + guint8 ** buffer, guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + if (!desc_base_descriptor_copy_data (&desc->base, buffer, size, offset)) { + return 0; + } + + prop_copy_uint8 (desc->object_type, buffer, size, offset); + + prop_copy_uint8 (desc->stream_type, buffer, size, offset); + prop_copy_uint8_array (desc->buffer_size_DB, 3, buffer, size, offset); + + prop_copy_uint32 (desc->max_bitrate, buffer, size, offset); + prop_copy_uint32 (desc->avg_bitrate, buffer, size, offset); + + if (desc->dec_specific_info) { + if (!desc_dec_specific_info_copy_data (desc->dec_specific_info, buffer, + size, offset)) { + return 0; + } + } + + return *offset - original_offset; +} + +guint64 +desc_es_descriptor_copy_data (ESDescriptor * desc, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + /* must call this twice to have size fields of all contained descriptors set + * correctly, and to have the size of the size fields taken into account */ + desc_es_descriptor_get_size (desc); + desc_es_descriptor_get_size (desc); + + if (!desc_base_descriptor_copy_data (&desc->base, buffer, size, offset)) { + return 0; + } + /* id and flags */ + prop_copy_uint16 (desc->id, buffer, size, offset); + prop_copy_uint8 (desc->flags, buffer, size, offset); + + if (desc_es_descriptor_check_stream_dependency (desc)) { + prop_copy_uint16 (desc->depends_on_es_id, buffer, size, offset); + } + + if (desc_es_descriptor_check_url_flag (desc)) { + prop_copy_size_string (desc->url_string, desc->url_length, buffer, size, + offset); + } + + if (desc_es_descriptor_check_ocr (desc)) { + prop_copy_uint16 (desc->ocr_es_id, buffer, size, offset); + } + + if (!desc_dec_config_descriptor_copy_data (&desc->dec_conf_desc, buffer, size, + offset)) { + return 0; + } + + if (!desc_sl_config_descriptor_copy_data (&desc->sl_conf_desc, buffer, size, + offset)) { + return 0; + } + + return *offset - original_offset; +} diff --git a/gst/isomp4/descriptors.h b/gst/isomp4/descriptors.h new file mode 100644 index 0000000..cc633a3 --- /dev/null +++ b/gst/isomp4/descriptors.h @@ -0,0 +1,151 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008 Thiago Sousa Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __DESCRIPTORS_H__ +#define __DESCRIPTORS_H__ + +#include +#include +#include "properties.h" + +/* + * Tags for descriptor (each kind is represented by a number, instead of fourcc as in atoms) + */ +#define OBJECT_DESC_TAG 0x01 +#define INIT_OBJECT_DESC_TAG 0x02 +#define ES_DESCRIPTOR_TAG 0x03 +#define DECODER_CONFIG_DESC_TAG 0x04 +#define DECODER_SPECIFIC_INFO_TAG 0x05 +#define SL_CONFIG_DESC_TAG 0x06 +#define ES_ID_INC_TAG 0x0E +#define MP4_INIT_OBJECT_DESC_TAG 0x10 + +#define ESDS_OBJECT_TYPE_MPEG1_P3 0x6B +#define ESDS_OBJECT_TYPE_MPEG2_P7_MAIN 0x66 +#define ESDS_OBJECT_TYPE_MPEG4_P7_LC 0x67 +#define ESDS_OBJECT_TYPE_MPEG4_P7_SSR 0x68 +#define ESDS_OBJECT_TYPE_MPEG4_P2 0x20 +#define ESDS_OBJECT_TYPE_MPEG4_P3 0x40 + +#define ESDS_STREAM_TYPE_VISUAL 0x04 +#define ESDS_STREAM_TYPE_AUDIO 0x05 + + +typedef struct _BaseDescriptor +{ + guint8 tag; + /* the first bit of each byte indicates if the next byte should be used */ + guint8 size[4]; +} BaseDescriptor; + +typedef struct _SLConfigDescriptor +{ + BaseDescriptor base; + + guint8 predefined; /* everything is supposed predefined */ +} SLConfigDescriptor; + +typedef struct _DecoderSpecificInfoDescriptor +{ + BaseDescriptor base; + guint32 length; + guint8 *data; +} DecoderSpecificInfoDescriptor; + +typedef struct _DecoderConfigDescriptor { + BaseDescriptor base; + + guint8 object_type; + + /* following are condensed into streamType: + * bit(6) streamType; + * bit(1) upStream; + * const bit(1) reserved=1; + */ + guint8 stream_type; + + guint8 buffer_size_DB[3]; + guint32 max_bitrate; + guint32 avg_bitrate; + + DecoderSpecificInfoDescriptor *dec_specific_info; +} DecoderConfigDescriptor; + +typedef struct _ESDescriptor +{ + BaseDescriptor base; + + guint16 id; + + /* flags contains the following: + * bit(1) streamDependenceFlag; + * bit(1) URL_Flag; + * bit(1) OCRstreamFlag; + * bit(5) streamPriority; + */ + guint8 flags; + + guint16 depends_on_es_id; + guint8 url_length; /* only if URL_flag is set */ + guint8 *url_string; /* size is url_length */ + + guint16 ocr_es_id; /* only if OCRstreamFlag is set */ + + DecoderConfigDescriptor dec_conf_desc; + SLConfigDescriptor sl_conf_desc; + + /* optional remainder of ESDescriptor is not used */ +} ESDescriptor; + +/* --- FUNCTIONS --- */ +void desc_es_init (ESDescriptor *es); +ESDescriptor *desc_es_descriptor_new (void); +guint64 desc_es_descriptor_copy_data (ESDescriptor *es, guint8 **buffer, + guint64 *size, guint64 *offset); +void desc_es_descriptor_clear (ESDescriptor *es); + +DecoderSpecificInfoDescriptor *desc_dec_specific_info_new(void); +void desc_dec_specific_info_free (DecoderSpecificInfoDescriptor *dsid); +void desc_dec_specific_info_alloc_data (DecoderSpecificInfoDescriptor *dsid, + guint32 size); + +#endif /* __DESCRIPTORS_H__ */ diff --git a/gst/isomp4/fourcc.h b/gst/isomp4/fourcc.h new file mode 100644 index 0000000..3f5dd51 --- /dev/null +++ b/gst/isomp4/fourcc.h @@ -0,0 +1,232 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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. + */ + /* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#ifndef __FOURCC_H__ +#define __FOURCC_H__ + +#include + +G_BEGIN_DECLS + +#define FOURCC_null 0x0 + +#define FOURCC_moov GST_MAKE_FOURCC('m','o','o','v') +#define FOURCC_mvhd GST_MAKE_FOURCC('m','v','h','d') +#define FOURCC_clip GST_MAKE_FOURCC('c','l','i','p') +#define FOURCC_trak GST_MAKE_FOURCC('t','r','a','k') +#define FOURCC_udta GST_MAKE_FOURCC('u','d','t','a') +#define FOURCC_tkhd GST_MAKE_FOURCC('t','k','h','d') +#define FOURCC_crgn GST_MAKE_FOURCC('c','r','g','n') +#define FOURCC_edts GST_MAKE_FOURCC('e','d','t','s') +#define FOURCC_elst GST_MAKE_FOURCC('e','l','s','t') +#define FOURCC_tref GST_MAKE_FOURCC('t','r','e','f') +#define FOURCC_imap GST_MAKE_FOURCC('i','m','a','p') +#define FOURCC___in GST_MAKE_FOURCC(' ',' ','i','n') +#define FOURCC___ty GST_MAKE_FOURCC(' ',' ','t','y') +#define FOURCC_mdia GST_MAKE_FOURCC('m','d','i','a') +#define FOURCC_mdhd GST_MAKE_FOURCC('m','d','h','d') +#define FOURCC_hdlr GST_MAKE_FOURCC('h','d','l','r') +#define FOURCC_dhlr GST_MAKE_FOURCC('d','h','l','r') +#define FOURCC_mhlr GST_MAKE_FOURCC('m','h','l','r') +#define FOURCC_minf GST_MAKE_FOURCC('m','i','n','f') +#define FOURCC_mdir GST_MAKE_FOURCC('m','d','i','r') +#define FOURCC_vmhd GST_MAKE_FOURCC('v','m','h','d') +#define FOURCC_smhd GST_MAKE_FOURCC('s','m','h','d') +#define FOURCC_gmhd GST_MAKE_FOURCC('g','m','h','d') +#define FOURCC_hmhd GST_MAKE_FOURCC('h','m','h','d') +#define FOURCC_dinf GST_MAKE_FOURCC('d','i','n','f') +#define FOURCC_dref GST_MAKE_FOURCC('d','r','e','f') +#define FOURCC_stbl GST_MAKE_FOURCC('s','t','b','l') +#define FOURCC_stsd GST_MAKE_FOURCC('s','t','s','d') +#define FOURCC_stts GST_MAKE_FOURCC('s','t','t','s') +#define FOURCC_stss GST_MAKE_FOURCC('s','t','s','s') +#define FOURCC_stsc GST_MAKE_FOURCC('s','t','s','c') +#define FOURCC_stsz GST_MAKE_FOURCC('s','t','s','z') +#define FOURCC_stco GST_MAKE_FOURCC('s','t','c','o') +#define FOURCC_vide GST_MAKE_FOURCC('v','i','d','e') +#define FOURCC_soun GST_MAKE_FOURCC('s','o','u','n') +#define FOURCC_strm GST_MAKE_FOURCC('s','t','r','m') +#define FOURCC_rtsp GST_MAKE_FOURCC('r','t','s','p') +#define FOURCC_co64 GST_MAKE_FOURCC('c','o','6','4') +#define FOURCC_dcom GST_MAKE_FOURCC('d','c','o','m') +#define FOURCC_cmvd GST_MAKE_FOURCC('c','m','v','d') +#define FOURCC_hint GST_MAKE_FOURCC('h','i','n','t') +#define FOURCC_mp4a GST_MAKE_FOURCC('m','p','4','a') +#define FOURCC__mp3 GST_MAKE_FOURCC('.','m','p','3') +#define FOURCC_mp4s GST_MAKE_FOURCC('m','p','4','s') +#define FOURCC_mp4v GST_MAKE_FOURCC('m','p','4','v') +#define FOURCC_2vuy GST_MAKE_FOURCC('2','v','u','y') +#define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e') +#define FOURCC_appl GST_MAKE_FOURCC('a','p','p','l') +#define FOURCC_esds GST_MAKE_FOURCC('e','s','d','s') +#define FOURCC_pasp GST_MAKE_FOURCC('p','a','s','p') +#define FOURCC_hnti GST_MAKE_FOURCC('h','n','t','i') +#define FOURCC_rtp_ GST_MAKE_FOURCC('r','t','p',' ') +#define FOURCC_sdp_ GST_MAKE_FOURCC('s','d','p',' ') +#define FOURCC_meta GST_MAKE_FOURCC('m','e','t','a') +#define FOURCC_ilst GST_MAKE_FOURCC('i','l','s','t') +#define FOURCC__nam GST_MAKE_FOURCC(0xa9,'n','a','m') +#define FOURCC__ART GST_MAKE_FOURCC(0xa9,'A','R','T') +#define FOURCC_aART GST_MAKE_FOURCC('a','A','R','T') +#define FOURCC__wrt GST_MAKE_FOURCC(0xa9,'w','r','t') +#define FOURCC__grp GST_MAKE_FOURCC(0xa9,'g','r','p') +#define FOURCC__alb GST_MAKE_FOURCC(0xa9,'a','l','b') +#define FOURCC__day GST_MAKE_FOURCC(0xa9,'d','a','y') +#define FOURCC__des GST_MAKE_FOURCC(0xa9,'d','e','s') +#define FOURCC__lyr GST_MAKE_FOURCC(0xa9,'l','y','r') +#define FOURCC_gnre GST_MAKE_FOURCC('g','n','r','e') +#define FOURCC_disc GST_MAKE_FOURCC('d','i','s','c') +#define FOURCC_disk GST_MAKE_FOURCC('d','i','s','k') +#define FOURCC_trkn GST_MAKE_FOURCC('t','r','k','n') +#define FOURCC_cprt GST_MAKE_FOURCC('c','p','r','t') +#define FOURCC_covr GST_MAKE_FOURCC('c','o','v','r') +#define FOURCC_cpil GST_MAKE_FOURCC('c','p','i','l') +#define FOURCC_tmpo GST_MAKE_FOURCC('t','m','p','o') +#define FOURCC__too GST_MAKE_FOURCC(0xa9,'t','o','o') +#define FOURCC_keyw GST_MAKE_FOURCC('k','e','y','w') +#define FOURCC_____ GST_MAKE_FOURCC('-','-','-','-') +#define FOURCC_free GST_MAKE_FOURCC('f','r','e','e') +#define FOURCC_data GST_MAKE_FOURCC('d','a','t','a') +#define FOURCC_SVQ3 GST_MAKE_FOURCC('S','V','Q','3') +#define FOURCC__gen GST_MAKE_FOURCC(0xa9, 'g', 'e', 'n') +#define FOURCC_drms GST_MAKE_FOURCC('d','r','m','s') +#define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') +#define FOURCC_h263 GST_MAKE_FOURCC('h','2','6','3') +#define FOURCC_s263 GST_MAKE_FOURCC('s','2','6','3') +#define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C') +#define FOURCC_VP31 GST_MAKE_FOURCC('V','P','3','1') +#define FOURCC_VP80 GST_MAKE_FOURCC('V','P','8','0') +#define FOURCC_rle_ GST_MAKE_FOURCC('r','l','e',' ') +#define FOURCC_MAC6 GST_MAKE_FOURCC('M','A','C','6') +#define FOURCC_MAC3 GST_MAKE_FOURCC('M','A','C','3') +#define FOURCC_ima4 GST_MAKE_FOURCC('i','m','a','4') +#define FOURCC_ulaw GST_MAKE_FOURCC('u','l','a','w') +#define FOURCC_alaw GST_MAKE_FOURCC('a','l','a','w') +#define FOURCC_twos GST_MAKE_FOURCC('t','w','o','s') +#define FOURCC_sowt GST_MAKE_FOURCC('s','o','w','t') +#define FOURCC_raw_ GST_MAKE_FOURCC('r','a','w',' ') +#define FOURCC_QDM2 GST_MAKE_FOURCC('Q','D','M','2') +#define FOURCC_alac GST_MAKE_FOURCC('a','l','a','c') +#define FOURCC_samr GST_MAKE_FOURCC('s','a','m','r') +#define FOURCC_sawb GST_MAKE_FOURCC('s','a','w','b') +#define FOURCC_mdat GST_MAKE_FOURCC('m','d','a','t') +#define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e') +#define FOURCC_PICT GST_MAKE_FOURCC('P','I','C','T') +#define FOURCC_pnot GST_MAKE_FOURCC('p','n','o','t') +#define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b') +#define FOURCC_alis GST_MAKE_FOURCC('a','l','i','s') +#define FOURCC_url_ GST_MAKE_FOURCC('u','r','l',' ') +#define FOURCC_frma GST_MAKE_FOURCC('f','r','m','a') +#define FOURCC_ctts GST_MAKE_FOURCC('c','t','t','s') +#define FOURCC_drac GST_MAKE_FOURCC('d','r','a','c') +#define FOURCC_jpeg GST_MAKE_FOURCC('j','p','e','g') +#define FOURCC_mjp2 GST_MAKE_FOURCC('m','j','p','2') +#define FOURCC_jp2h GST_MAKE_FOURCC('j','p','2','h') +#define FOURCC_jp2c GST_MAKE_FOURCC('j','p','2','c') +#define FOURCC_gama GST_MAKE_FOURCC('g','a','m','a') +#define FOURCC_tvsh GST_MAKE_FOURCC('t','v','s','h') +#define FOURCC_tven GST_MAKE_FOURCC('t','v','e','n') +#define FOURCC_tvsn GST_MAKE_FOURCC('t','v','s','n') +#define FOURCC_tves GST_MAKE_FOURCC('t','v','e','s') +#define FOURCC_sonm GST_MAKE_FOURCC('s','o','n','m') +#define FOURCC_soal GST_MAKE_FOURCC('s','o','a','l') +#define FOURCC_soar GST_MAKE_FOURCC('s','o','a','r') +#define FOURCC_soaa GST_MAKE_FOURCC('s','o','a','a') +#define FOURCC_soco GST_MAKE_FOURCC('s','o','c','o') +#define FOURCC_sosn GST_MAKE_FOURCC('s','o','s','n') +#define FOURCC_XMP_ GST_MAKE_FOURCC('X','M','P','_') +#define FOURCC_uuid GST_MAKE_FOURCC('u','u','i','d') + + +/* SVQ3 fourcc */ +#define FOURCC_SEQH GST_MAKE_FOURCC('S','E','Q','H') +#define FOURCC_SMI_ GST_MAKE_FOURCC('S','M','I',' ') + +/* fragmented mp4 */ +#define FOURCC_mvex GST_MAKE_FOURCC('m','v','e','x') +#define FOURCC_mehd GST_MAKE_FOURCC('m','e','h','d') +#define FOURCC_trex GST_MAKE_FOURCC('t','r','e','x') +#define FOURCC_mfra GST_MAKE_FOURCC('m','f','r','a') +#define FOURCC_moof GST_MAKE_FOURCC('m','o','o','f') +#define FOURCC_tfra GST_MAKE_FOURCC('t','f','r','a') +#define FOURCC_tfhd GST_MAKE_FOURCC('t','f','h','d') +#define FOURCC_trun GST_MAKE_FOURCC('t','r','u','n') +#define FOURCC_sdtp GST_MAKE_FOURCC('s','d','t','p') +#define FOURCC_mfro GST_MAKE_FOURCC('m','f','r','o') +#define FOURCC_mfhd GST_MAKE_FOURCC('m','f','h','d') +#define FOURCC_mvhd GST_MAKE_FOURCC('m','v','h','d') +#define FOURCC_traf GST_MAKE_FOURCC('t','r','a','f') +#define FOURCC_btrt GST_MAKE_FOURCC('b','t','r','t') + +/* Xiph fourcc */ +#define FOURCC_XiTh GST_MAKE_FOURCC('X','i','T','h') +#define FOURCC_XdxT GST_MAKE_FOURCC('X','d','x','T') +#define FOURCC_tCtH GST_MAKE_FOURCC('t','C','t','H') +#define FOURCC_tCt_ GST_MAKE_FOURCC('t','C','t','#') +#define FOURCC_tCtC GST_MAKE_FOURCC('t','C','t','C') + +/* ilst metatags */ +#define FOURCC_titl GST_MAKE_FOURCC('t','i','t','l') +#define FOURCC__cmt GST_MAKE_FOURCC(0xa9, 'c','m','t') + +/* 3gp tags */ +#define FOURCC_dscp GST_MAKE_FOURCC('d','s','c','p') +#define FOURCC_perf GST_MAKE_FOURCC('p','e','r','f') +#define FOURCC_auth GST_MAKE_FOURCC('a','u','t','h') +#define FOURCC_yrrc GST_MAKE_FOURCC('y','r','r','c') +#define FOURCC_albm GST_MAKE_FOURCC('a','l','b','m') +#define FOURCC_loci GST_MAKE_FOURCC('l','o','c','i') +#define FOURCC_kywd GST_MAKE_FOURCC('k','y','w','d') +#define FOURCC_clsf GST_MAKE_FOURCC('c','l','s','f') + +/* For Microsoft Wave formats embedded in quicktime, the FOURCC is + 'm', 's', then the 16 bit wave codec id */ +#define MS_WAVE_FOURCC(codecid) GST_MAKE_FOURCC( \ + 'm', 's', ((codecid)>>8)&0xff, ((codecid)&0xff)) + +#define FOURCC_owma GST_MAKE_FOURCC('o','w','m','a') +#define FOURCC_ovc1 GST_MAKE_FOURCC('o','v','c','1') + +G_END_DECLS + +#endif /* __FOURCC_H__ */ diff --git a/gst/isomp4/ftypcc.h b/gst/isomp4/ftypcc.h new file mode 100644 index 0000000..3d31b6d --- /dev/null +++ b/gst/isomp4/ftypcc.h @@ -0,0 +1,68 @@ +/* GStreamer + * Copyright (C) <2008> Thiago Sousa Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __FTYP_CC_H__ +#define __FTYP_CC_H__ + +#include + +G_BEGIN_DECLS + +#define FOURCC_ftyp GST_MAKE_FOURCC('f','t','y','p') +#define FOURCC_isom GST_MAKE_FOURCC('i','s','o','m') +#define FOURCC_iso2 GST_MAKE_FOURCC('i','s','o','2') +#define FOURCC_mp41 GST_MAKE_FOURCC('m','p','4','1') +#define FOURCC_mp42 GST_MAKE_FOURCC('m','p','4','2') +#define FOURCC_mjp2 GST_MAKE_FOURCC('m','j','p','2') +#define FOURCC_3gp4 GST_MAKE_FOURCC('3','g','p','4') +#define FOURCC_3gp6 GST_MAKE_FOURCC('3','g','p','6') +#define FOURCC_3gg6 GST_MAKE_FOURCC('3','g','g','6') +#define FOURCC_3gr6 GST_MAKE_FOURCC('3','g','r','6') +#define FOURCC_3gg7 GST_MAKE_FOURCC('3','g','g','7') +#define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') +#define FOURCC_qt__ GST_MAKE_FOURCC('q','t',' ',' ') +#define FOURCC_isml GST_MAKE_FOURCC('i','s','m','l') +#define FOURCC_piff GST_MAKE_FOURCC('p','i','f','f') + +G_END_DECLS + +#endif /* __FTYP_CC_H__ */ diff --git a/gst/isomp4/gstqtmoovrecover.c b/gst/isomp4/gstqtmoovrecover.c new file mode 100644 index 0000000..0b832d3 --- /dev/null +++ b/gst/isomp4/gstqtmoovrecover.c @@ -0,0 +1,395 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2010 Thiago Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +/** + * SECTION:element-qtmoovrecover + * @short_description: Utility element for recovering unfinished quicktime files + * + * + * + * This element recovers quicktime files created with qtmux using the moov + * recovery feature. + * + * Example pipelines + * + * + * TODO + * + * + * + * + * Documentation last reviewed on 2011-04-21 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include + +#include "gstqtmoovrecover.h" + +GST_DEBUG_CATEGORY_STATIC (gst_qt_moov_recover_debug); +#define GST_CAT_DEFAULT gst_qt_moov_recover_debug + +/* QTMoovRecover signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_RECOVERY_INPUT, + PROP_BROKEN_INPUT, + PROP_FIXED_OUTPUT, + PROP_FAST_START_MODE +}; + +GST_BOILERPLATE (GstQTMoovRecover, gst_qt_moov_recover, GstPipeline, + GST_TYPE_PIPELINE); + +/* property functions */ +static void gst_qt_moov_recover_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_qt_moov_recover_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static GstStateChangeReturn gst_qt_moov_recover_change_state (GstElement * + element, GstStateChange transition); + +static void gst_qt_moov_recover_finalize (GObject * object); + +static void +gst_qt_moov_recover_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); +#if 0 + GstQTMoovRecoverClass *klass = (GstQTMoovRecoverClass *) g_class; +#endif + gst_element_class_set_details_simple (element_class, "QT Moov Recover", + "Util", "Recovers unfinished qtmux files", + "Thiago Santos "); +} + +static void +gst_qt_moov_recover_class_init (GstQTMoovRecoverClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_qt_moov_recover_finalize; + gobject_class->get_property = gst_qt_moov_recover_get_property; + gobject_class->set_property = gst_qt_moov_recover_set_property; + + gstelement_class->change_state = gst_qt_moov_recover_change_state; + + g_object_class_install_property (gobject_class, PROP_FIXED_OUTPUT, + g_param_spec_string ("fixed-output", + "Path to write the fixed file", + "Path to write the fixed file to (used as output)", + NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_BROKEN_INPUT, + g_param_spec_string ("broken-input", + "Path to broken input file", + "Path to broken input file. (If qtmux was on faststart mode, this " + "file is the faststart file)", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_RECOVERY_INPUT, + g_param_spec_string ("recovery-input", + "Path to recovery file", + "Path to recovery file (used as input)", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_FAST_START_MODE, + g_param_spec_boolean ("faststart-mode", + "If the broken input is from faststart mode", + "If the broken input is from faststart mode", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (gst_qt_moov_recover_debug, "qtmoovrecover", 0, + "QT Moovie Recover"); +} + +static void +gst_qt_moov_recover_init (GstQTMoovRecover * qtmr, + GstQTMoovRecoverClass * qtmr_klass) +{ +} + +static void +gst_qt_moov_recover_finalize (GObject * object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_qt_moov_recover_run (void *data) +{ + FILE *moovrec = NULL; + FILE *mdatinput = NULL; + FILE *output = NULL; + MdatRecovFile *mdat_recov = NULL; + MoovRecovFile *moov_recov = NULL; + GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (data); + GError *err = NULL; + + GST_LOG_OBJECT (qtmr, "Starting task"); + + GST_DEBUG_OBJECT (qtmr, "Validating properties"); + GST_OBJECT_LOCK (qtmr); + /* validate properties */ + if (qtmr->broken_input == NULL) { + GST_OBJECT_UNLOCK (qtmr); + GST_ELEMENT_ERROR (qtmr, RESOURCE, SETTINGS, + ("Please set broken-input property"), (NULL)); + goto end; + } + if (qtmr->recovery_input == NULL) { + GST_OBJECT_UNLOCK (qtmr); + GST_ELEMENT_ERROR (qtmr, RESOURCE, SETTINGS, + ("Please set recovery-input property"), (NULL)); + goto end; + } + if (qtmr->fixed_output == NULL) { + GST_OBJECT_UNLOCK (qtmr); + GST_ELEMENT_ERROR (qtmr, RESOURCE, SETTINGS, + ("Please set fixed-output property"), (NULL)); + goto end; + } + + GST_DEBUG_OBJECT (qtmr, "Opening input/output files"); + /* open files */ + moovrec = g_fopen (qtmr->recovery_input, "rb"); + if (moovrec == NULL) { + GST_OBJECT_UNLOCK (qtmr); + GST_ELEMENT_ERROR (qtmr, RESOURCE, OPEN_READ, + ("Failed to open recovery-input file"), (NULL)); + goto end; + } + + mdatinput = g_fopen (qtmr->broken_input, "rb"); + if (mdatinput == NULL) { + GST_OBJECT_UNLOCK (qtmr); + GST_ELEMENT_ERROR (qtmr, RESOURCE, OPEN_READ, + ("Failed to open broken-input file"), (NULL)); + goto end; + } + output = g_fopen (qtmr->fixed_output, "wb+"); + if (output == NULL) { + GST_OBJECT_UNLOCK (qtmr); + GST_ELEMENT_ERROR (qtmr, RESOURCE, OPEN_READ_WRITE, + ("Failed to open fixed-output file"), (NULL)); + goto end; + } + GST_OBJECT_UNLOCK (qtmr); + + GST_DEBUG_OBJECT (qtmr, "Parsing input files"); + /* now create our structures */ + mdat_recov = mdat_recov_file_create (mdatinput, qtmr->faststart_mode, &err); + mdatinput = NULL; + if (mdat_recov == NULL) { + GST_ELEMENT_ERROR (qtmr, RESOURCE, FAILED, + ("Broken file could not be parsed correctly"), (NULL)); + goto end; + } + moov_recov = moov_recov_file_create (moovrec, &err); + moovrec = NULL; + if (moov_recov == NULL) { + GST_ELEMENT_ERROR (qtmr, RESOURCE, FAILED, + ("Recovery file could not be parsed correctly"), (NULL)); + goto end; + } + + /* now parse the buffers data from moovrec */ + if (!moov_recov_parse_buffers (moov_recov, mdat_recov, &err)) { + goto end; + } + + GST_DEBUG_OBJECT (qtmr, "Writing fixed file to output"); + if (!moov_recov_write_file (moov_recov, mdat_recov, output, &err)) { + goto end; + } + + /* here means success */ + GST_DEBUG_OBJECT (qtmr, "Finished successfully, posting EOS"); + gst_element_post_message (GST_ELEMENT_CAST (qtmr), + gst_message_new_eos (GST_OBJECT_CAST (qtmr))); + +end: + GST_LOG_OBJECT (qtmr, "Finalizing task"); + if (err) { + GST_ELEMENT_ERROR (qtmr, RESOURCE, FAILED, ("%s", err->message), (NULL)); + g_error_free (err); + } + + if (moov_recov) + moov_recov_file_free (moov_recov); + if (moovrec) + fclose (moovrec); + + if (mdat_recov) + mdat_recov_file_free (mdat_recov); + if (mdatinput) + fclose (mdatinput); + + if (output) + fclose (output); + GST_LOG_OBJECT (qtmr, "Leaving task"); + gst_task_stop (qtmr->task); +} + +static void +gst_qt_moov_recover_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (object); + + GST_OBJECT_LOCK (qtmr); + switch (prop_id) { + case PROP_FAST_START_MODE: + g_value_set_boolean (value, qtmr->faststart_mode); + break; + case PROP_BROKEN_INPUT: + g_value_set_string (value, qtmr->broken_input); + break; + case PROP_RECOVERY_INPUT: + g_value_set_string (value, qtmr->recovery_input); + break; + case PROP_FIXED_OUTPUT: + g_value_set_string (value, qtmr->fixed_output); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (qtmr); +} + +static void +gst_qt_moov_recover_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (object); + + GST_OBJECT_LOCK (qtmr); + switch (prop_id) { + case PROP_FAST_START_MODE: + qtmr->faststart_mode = g_value_get_boolean (value); + break; + case PROP_BROKEN_INPUT: + g_free (qtmr->broken_input); + qtmr->broken_input = g_value_dup_string (value); + break; + case PROP_RECOVERY_INPUT: + g_free (qtmr->recovery_input); + qtmr->recovery_input = g_value_dup_string (value); + break; + case PROP_FIXED_OUTPUT: + g_free (qtmr->fixed_output); + qtmr->fixed_output = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (qtmr); +} + +static GstStateChangeReturn +gst_qt_moov_recover_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret; + GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + qtmr->task = gst_task_create (gst_qt_moov_recover_run, qtmr); + g_static_rec_mutex_init (&qtmr->task_mutex); + gst_task_set_lock (qtmr->task, &qtmr->task_mutex); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + gst_task_start (qtmr->task); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + gst_task_stop (qtmr->task); + gst_task_join (qtmr->task); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + g_assert (gst_task_get_state (qtmr->task) == GST_TASK_STOPPED); + gst_object_unref (qtmr->task); + qtmr->task = NULL; + g_static_rec_mutex_free (&qtmr->task_mutex); + break; + default: + break; + } + return ret; +} + + +gboolean +gst_qt_moov_recover_register (GstPlugin * plugin) +{ + return gst_element_register (plugin, "qtmoovrecover", GST_RANK_NONE, + GST_TYPE_QT_MOOV_RECOVER); +} diff --git a/gst/isomp4/gstqtmoovrecover.h b/gst/isomp4/gstqtmoovrecover.h new file mode 100644 index 0000000..15eac84 --- /dev/null +++ b/gst/isomp4/gstqtmoovrecover.h @@ -0,0 +1,88 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2010 Thiago Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_QT_MOOV_RECOVER_H__ +#define __GST_QT_MOOV_RECOVER_H__ + +#include + +#include "atoms.h" +#include "atomsrecovery.h" + +G_BEGIN_DECLS + +#define GST_TYPE_QT_MOOV_RECOVER (gst_qt_moov_recover_get_type()) +#define GST_QT_MOOV_RECOVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QT_MOOV_RECOVER, GstQTMoovRecover)) +#define GST_QT_MOOV_RECOVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QT_MOOV_RECOVER, GstQTMoovRecover)) +#define GST_IS_QT_MOOV_RECOVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QT_MOOV_RECOVER)) +#define GST_IS_QT_MOOV_RECOVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QT_MOOV_RECOVER)) +#define GST_QT_MOOV_RECOVER_CAST(obj) ((GstQTMoovRecover*)(obj)) + + +typedef struct _GstQTMoovRecover GstQTMoovRecover; +typedef struct _GstQTMoovRecoverClass GstQTMoovRecoverClass; + +struct _GstQTMoovRecover +{ + GstPipeline pipeline; + + GstTask *task; + GStaticRecMutex task_mutex; + + /* properties */ + gboolean faststart_mode; + gchar *recovery_input; + gchar *fixed_output; + gchar *broken_input; +}; + +struct _GstQTMoovRecoverClass +{ + GstPipelineClass parent_class; +}; + +GType gst_qt_moov_recover_get_type (void); +gboolean gst_qt_moov_recover_register (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_QT_MOOV_RECOVER_H__ */ diff --git a/gst/isomp4/gstqtmux-doc.c b/gst/isomp4/gstqtmux-doc.c new file mode 100644 index 0000000..986fffc --- /dev/null +++ b/gst/isomp4/gstqtmux-doc.c @@ -0,0 +1,300 @@ +/* Quicktime muxer documentation + * Copyright (C) 2008-2010 Thiago Santos + * Copyright (C) 2008 Mark Nauwelaerts + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* ============================= mp4mux ==================================== */ + +/** + * SECTION:element-mp4mux + * @short_description: Muxer for ISO MPEG-4 (.mp4) files + * + * This element merges streams (audio and video) into ISO MPEG-4 (.mp4) files. + * + * The following background intends to explain why various similar muxers + * are present in this plugin. + * + * The + * QuickTime file format specification served as basis for the MP4 file + * format specification (mp4mux), and as such the QuickTime file structure is + * nearly identical to the so-called ISO Base Media file format defined in + * ISO 14496-12 (except for some media specific parts). + * In turn, the latter ISO Base Media format was further specialized as a + * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) + * and in various 3GPP(2) specs (gppmux). + * The fragmented file features defined (only) in ISO Base Media are used by + * ISMV files making up (a.o.) Smooth Streaming (ismlmux). + * + * A few properties (movie-timescale, + * trak-timescale) allow adjusting + * some technical parameters, which might be useful in (rare) cases to resolve + * compatibility issues in some situations. + * + * Some other properties influence the result more fundamentally. + * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, + * somewhat contrary to this usually being called "the header". + * However, a faststart file will + * (with some effort) arrange this to be located near start of the file, + * which then allows it e.g. to be played while downloading. + * Alternatively, rather than having one chunk of metadata at start (or end), + * there can be some metadata at start and most of the other data can be spread + * out into fragments of fragment-duration. + * If such fragmented layout is intended for streaming purposes, then + * streamable allows foregoing to add + * index metadata (at the end of file). + * + * dts-method allows selecting a + * method for managing input timestamps (stay tuned for 0.11 to have this + * automagically settled). The default delta/duration method should handle nice + * (aka perfect streams) just fine, but may experience problems otherwise + * (e.g. input stream with re-ordered B-frames and/or with frame dropping). + * The re-ordering approach re-assigns incoming timestamps in ascending order + * to incoming buffers and offers an alternative in such cases. In cases where + * that might fail, the remaining method can be tried, which is exact and + * according to specs, but might experience playback on not so spec-wise players. + * Note that this latter approach also requires one to enable + * presentation-timestamp. + * + * + * Example pipelines + * |[ + * gst-launch gst-launch v4l2src num-buffers=50 ! queue ! x264enc ! mp4mux ! filesink location=video.mp4 + * ]| + * Records a video stream captured from a v4l2 device, encodes it into H.264 + * and muxes it into an mp4 file. + * + * + * Documentation last reviewed on 2011-04-21 + */ + +/* ============================= 3gppmux ==================================== */ + +/** + * SECTION:element-3gppmux + * @short_description: Muxer for 3GPP (.3gp) files + * + * This element merges streams (audio and video) into 3GPP (.3gp) files. + * + * The following background intends to explain why various similar muxers + * are present in this plugin. + * + * The + * QuickTime file format specification served as basis for the MP4 file + * format specification (mp4mux), and as such the QuickTime file structure is + * nearly identical to the so-called ISO Base Media file format defined in + * ISO 14496-12 (except for some media specific parts). + * In turn, the latter ISO Base Media format was further specialized as a + * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) + * and in various 3GPP(2) specs (gppmux). + * The fragmented file features defined (only) in ISO Base Media are used by + * ISMV files making up (a.o.) Smooth Streaming (ismlmux). + * + * A few properties (movie-timescale, + * trak-timescale) allow adjusting + * some technical parameters, which might be useful in (rare) cases to resolve + * compatibility issues in some situations. + * + * Some other properties influence the result more fundamentally. + * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, + * somewhat contrary to this usually being called "the header". + * However, a faststart file will + * (with some effort) arrange this to be located near start of the file, + * which then allows it e.g. to be played while downloading. + * Alternatively, rather than having one chunk of metadata at start (or end), + * there can be some metadata at start and most of the other data can be spread + * out into fragments of fragment-duration. + * If such fragmented layout is intended for streaming purposes, then + * streamable allows foregoing to add + * index metadata (at the end of file). + * + * dts-method allows selecting a + * method for managing input timestamps (stay tuned for 0.11 to have this + * automagically settled). The default delta/duration method should handle nice + * (aka perfect streams) just fine, but may experience problems otherwise + * (e.g. input stream with re-ordered B-frames and/or with frame dropping). + * The re-ordering approach re-assigns incoming timestamps in ascending order + * to incoming buffers and offers an alternative in such cases. In cases where + * that might fail, the remaining method can be tried, which is exact and + * according to specs, but might experience playback on not so spec-wise players. + * Note that this latter approach also requires one to enable + * presentation-timestamp. + * + * + * Example pipelines + * |[ + * gst-launch v4l2src num-buffers=50 ! queue ! ffenc_h263 ! gppmux ! filesink location=video.3gp + * ]| + * Records a video stream captured from a v4l2 device, encodes it into H.263 + * and muxes it into an 3gp file. + * + * + * Documentation last reviewed on 2011-04-21 + */ + +/* ============================= mj2pmux ==================================== */ + +/** + * SECTION:element-mj2mux + * @short_description: Muxer for Motion JPEG-2000 (.mj2) files + * + * This element merges streams (audio and video) into MJ2 (.mj2) files. + * + * The following background intends to explain why various similar muxers + * are present in this plugin. + * + * The + * QuickTime file format specification served as basis for the MP4 file + * format specification (mp4mux), and as such the QuickTime file structure is + * nearly identical to the so-called ISO Base Media file format defined in + * ISO 14496-12 (except for some media specific parts). + * In turn, the latter ISO Base Media format was further specialized as a + * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) + * and in various 3GPP(2) specs (gppmux). + * The fragmented file features defined (only) in ISO Base Media are used by + * ISMV files making up (a.o.) Smooth Streaming (ismlmux). + * + * A few properties (movie-timescale, + * trak-timescale) allow adjusting + * some technical parameters, which might be useful in (rare) cases to resolve + * compatibility issues in some situations. + * + * Some other properties influence the result more fundamentally. + * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, + * somewhat contrary to this usually being called "the header". + * However, a faststart file will + * (with some effort) arrange this to be located near start of the file, + * which then allows it e.g. to be played while downloading. + * Alternatively, rather than having one chunk of metadata at start (or end), + * there can be some metadata at start and most of the other data can be spread + * out into fragments of fragment-duration. + * If such fragmented layout is intended for streaming purposes, then + * streamable allows foregoing to add + * index metadata (at the end of file). + * + * dts-method allows selecting a + * method for managing input timestamps (stay tuned for 0.11 to have this + * automagically settled). The default delta/duration method should handle nice + * (aka perfect streams) just fine, but may experience problems otherwise + * (e.g. input stream with re-ordered B-frames and/or with frame dropping). + * The re-ordering approach re-assigns incoming timestamps in ascending order + * to incoming buffers and offers an alternative in such cases. In cases where + * that might fail, the remaining method can be tried, which is exact and + * according to specs, but might experience playback on not so spec-wise players. + * Note that this latter approach also requires one to enable + * presentation-timestamp. + * + * + * Example pipelines + * |[ + * gst-launch v4l2src num-buffers=50 ! queue ! jp2kenc ! mj2mux ! filesink location=video.mj2 + * ]| + * Records a video stream captured from a v4l2 device, encodes it into JPEG-2000 + * and muxes it into an mj2 file. + * + * + * Documentation last reviewed on 2011-04-21 + */ + +/* ============================= ismlmux ==================================== */ + +/** + * SECTION:element-ismlmux + * @short_description: Muxer for ISML smooth streaming (.isml) files + * + * This element merges streams (audio and video) into MJ2 (.mj2) files. + * + * The following background intends to explain why various similar muxers + * are present in this plugin. + * + * The + * QuickTime file format specification served as basis for the MP4 file + * format specification (mp4mux), and as such the QuickTime file structure is + * nearly identical to the so-called ISO Base Media file format defined in + * ISO 14496-12 (except for some media specific parts). + * In turn, the latter ISO Base Media format was further specialized as a + * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) + * and in various 3GPP(2) specs (gppmux). + * The fragmented file features defined (only) in ISO Base Media are used by + * ISMV files making up (a.o.) Smooth Streaming (ismlmux). + * + * A few properties (movie-timescale, + * trak-timescale) allow adjusting + * some technical parameters, which might be useful in (rare) cases to resolve + * compatibility issues in some situations. + * + * Some other properties influence the result more fundamentally. + * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, + * somewhat contrary to this usually being called "the header". + * However, a faststart file will + * (with some effort) arrange this to be located near start of the file, + * which then allows it e.g. to be played while downloading. + * Alternatively, rather than having one chunk of metadata at start (or end), + * there can be some metadata at start and most of the other data can be spread + * out into fragments of fragment-duration. + * If such fragmented layout is intended for streaming purposes, then + * streamable allows foregoing to add + * index metadata (at the end of file). + * + * dts-method allows selecting a + * method for managing input timestamps (stay tuned for 0.11 to have this + * automagically settled). The default delta/duration method should handle nice + * (aka perfect streams) just fine, but may experience problems otherwise + * (e.g. input stream with re-ordered B-frames and/or with frame dropping). + * The re-ordering approach re-assigns incoming timestamps in ascending order + * to incoming buffers and offers an alternative in such cases. In cases where + * that might fail, the remaining method can be tried, which is exact and + * according to specs, but might experience playback on not so spec-wise players. + * Note that this latter approach also requires one to enable + * presentation-timestamp. + * + * + * Example pipelines + * |[ + * gst-launch v4l2src num-buffers=50 ! queue ! jp2kenc ! mj2mux ! filesink location=video.mj2 + * ]| + * Records a video stream captured from a v4l2 device, encodes it into JPEG-2000 + * and muxes it into an mj2 file. + * + * + * Documentation last reviewed on 2011-04-21 + */ diff --git a/gst/isomp4/gstqtmux-doc.h b/gst/isomp4/gstqtmux-doc.h new file mode 100644 index 0000000..48b5d8c --- /dev/null +++ b/gst/isomp4/gstqtmux-doc.h @@ -0,0 +1,52 @@ +/* Quicktime muxer documentation + * Copyright (C) 2008-2010 Thiago Santos + * Copyright (C) 2008 Mark Nauwelaerts + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#error "This header is for gtk-doc only and not supposed to be included" + +typedef struct _GstMP4Mux GstMP4Mux; +typedef struct _Gst3GPPMux GstMP4Mux; +typedef struct _GstISMLMux GstMP4Mux; +typedef struct _GstMJ2Mux GstMJ2Mux; + diff --git a/gst/isomp4/gstqtmux.c b/gst/isomp4/gstqtmux.c new file mode 100644 index 0000000..5e9fcdd --- /dev/null +++ b/gst/isomp4/gstqtmux.c @@ -0,0 +1,3628 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008-2010 Thiago Santos + * Copyright (C) 2008 Mark Nauwelaerts + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * Contact: Stefan Kost + + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +/** + * SECTION:element-qtmux + * @short_description: Muxer for quicktime(.mov) files + * + * This element merges streams (audio and video) into QuickTime(.mov) files. + * + * The following background intends to explain why various similar muxers + * are present in this plugin. + * + * The + * QuickTime file format specification served as basis for the MP4 file + * format specification (mp4mux), and as such the QuickTime file structure is + * nearly identical to the so-called ISO Base Media file format defined in + * ISO 14496-12 (except for some media specific parts). + * In turn, the latter ISO Base Media format was further specialized as a + * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) + * and in various 3GPP(2) specs (gppmux). + * The fragmented file features defined (only) in ISO Base Media are used by + * ISMV files making up (a.o.) Smooth Streaming (ismlmux). + * + * A few properties (movie-timescale, + * trak-timescale) allow adjusting + * some technical parameters, which might be useful in (rare) cases to resolve + * compatibility issues in some situations. + * + * Some other properties influence the result more fundamentally. + * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, + * somewhat contrary to this usually being called "the header". + * However, a faststart file will + * (with some effort) arrange this to be located near start of the file, + * which then allows it e.g. to be played while downloading. + * Alternatively, rather than having one chunk of metadata at start (or end), + * there can be some metadata at start and most of the other data can be spread + * out into fragments of fragment-duration. + * If such fragmented layout is intended for streaming purposes, then + * streamable allows foregoing to add + * index metadata (at the end of file). + * + * dts-method allows selecting a + * method for managing input timestamps (stay tuned for 0.11 to have this + * automagically settled). The default delta/duration method should handle nice + * (aka perfect streams) just fine, but may experience problems otherwise + * (e.g. input stream with re-ordered B-frames and/or with frame dropping). + * The re-ordering approach re-assigns incoming timestamps in ascending order + * to incoming buffers and offers an alternative in such cases. In cases where + * that might fail, the remaining method can be tried, which is exact and + * according to specs, but might experience playback on not so spec-wise players. + * Note that this latter approach also requires one to enable + * presentation-timestamp. + * + * + * Example pipelines + * |[ + * gst-launch v4l2src num-buffers=500 ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! qtmux ! filesink location=video.mov + * ]| + * Records a video stream captured from a v4l2 device and muxes it into a qt file. + * + * + * Last reviewed on 2010-12-03 + */ + +/* + * Based on avimux + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include + +#include +#ifdef G_OS_WIN32 +#include /* lseek, open, close, read */ +#undef lseek +#define lseek _lseeki64 +#undef off_t +#define off_t guint64 +#endif + +#ifdef _MSC_VER +#define ftruncate g_win32_ftruncate +#endif + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include "gstqtmux.h" + +GST_DEBUG_CATEGORY_STATIC (gst_qt_mux_debug); +#define GST_CAT_DEFAULT gst_qt_mux_debug + +enum +{ + DTS_METHOD_DD, + DTS_METHOD_REORDER, + DTS_METHOD_ASC +}; + +static GType +gst_qt_mux_dts_method_get_type (void) +{ + static GType gst_qt_mux_dts_method = 0; + + if (!gst_qt_mux_dts_method) { + static const GEnumValue dts_methods[] = { + {DTS_METHOD_DD, "delta/duration", "dd"}, + {DTS_METHOD_REORDER, "reorder", "reorder"}, + {DTS_METHOD_ASC, "ascending", "asc"}, + {0, NULL, NULL}, + }; + + gst_qt_mux_dts_method = + g_enum_register_static ("GstQTMuxDtsMethods", dts_methods); + } + + return gst_qt_mux_dts_method; +} + +#define GST_TYPE_QT_MUX_DTS_METHOD \ + (gst_qt_mux_dts_method_get_type ()) + +/* QTMux signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_MOVIE_TIMESCALE, + PROP_TRAK_TIMESCALE, + PROP_FAST_START, + PROP_FAST_START_TEMP_FILE, + PROP_MOOV_RECOV_FILE, + PROP_FRAGMENT_DURATION, + PROP_STREAMABLE, + PROP_DTS_METHOD, + PROP_DO_CTTS, +}; + +/* some spare for header size as well */ +#define MDAT_LARGE_FILE_LIMIT ((guint64) 1024 * 1024 * 1024 * 2) +#define MAX_TOLERATED_LATENESS (GST_SECOND / 10) + +#define DEFAULT_MOVIE_TIMESCALE 1000 +#define DEFAULT_TRAK_TIMESCALE 0 +#define DEFAULT_DO_CTTS TRUE +#define DEFAULT_FAST_START FALSE +#define DEFAULT_FAST_START_TEMP_FILE NULL +#define DEFAULT_MOOV_RECOV_FILE NULL +#define DEFAULT_FRAGMENT_DURATION 0 +#define DEFAULT_STREAMABLE FALSE +#define DEFAULT_DTS_METHOD DTS_METHOD_REORDER + + +static void gst_qt_mux_finalize (GObject * object); + +static GstStateChangeReturn gst_qt_mux_change_state (GstElement * element, + GstStateChange transition); + +/* property functions */ +static void gst_qt_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_qt_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +/* pad functions */ +static GstPad *gst_qt_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_qt_mux_release_pad (GstElement * element, GstPad * pad); + +/* event */ +static gboolean gst_qt_mux_sink_event (GstPad * pad, GstEvent * event); + +static GstFlowReturn gst_qt_mux_collected (GstCollectPads * pads, + gpointer user_data); +static GstFlowReturn gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, + GstBuffer * buf); + +static GstElementClass *parent_class = NULL; + +static void +gst_qt_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstQTMuxClass *klass = (GstQTMuxClass *) g_class; + GstQTMuxClassParams *params; + GstPadTemplate *videosinktempl, *audiosinktempl, *srctempl; + gchar *longname, *description; + + params = + (GstQTMuxClassParams *) g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class), + GST_QT_MUX_PARAMS_QDATA); + g_assert (params != NULL); + + /* construct the element details struct */ + longname = g_strdup_printf ("%s Muxer", params->prop->long_name); + description = g_strdup_printf ("Multiplex audio and video into a %s file%s", + params->prop->long_name, + (params->prop->rank == GST_RANK_NONE) ? " (deprecated)" : ""); + gst_element_class_set_details_simple (element_class, longname, + "Codec/Muxer", description, + "Thiago Sousa Santos "); + g_free (longname); + g_free (description); + + /* pad templates */ + srctempl = gst_pad_template_new ("src", GST_PAD_SRC, + GST_PAD_ALWAYS, params->src_caps); + gst_element_class_add_pad_template (element_class, srctempl); + gst_object_unref (srctempl); + + if (params->audio_sink_caps) { + audiosinktempl = gst_pad_template_new ("audio_%d", + GST_PAD_SINK, GST_PAD_REQUEST, params->audio_sink_caps); + gst_element_class_add_pad_template (element_class, audiosinktempl); + gst_object_unref (audiosinktempl); + } + + if (params->video_sink_caps) { + videosinktempl = gst_pad_template_new ("video_%d", + GST_PAD_SINK, GST_PAD_REQUEST, params->video_sink_caps); + gst_element_class_add_pad_template (element_class, videosinktempl); + gst_object_unref (videosinktempl); + } + + klass->format = params->prop->format; +} + +static void +gst_qt_mux_class_init (GstQTMuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_qt_mux_finalize; + gobject_class->get_property = gst_qt_mux_get_property; + gobject_class->set_property = gst_qt_mux_set_property; + + g_object_class_install_property (gobject_class, PROP_MOVIE_TIMESCALE, + g_param_spec_uint ("movie-timescale", "Movie timescale", + "Timescale to use in the movie (units per second)", + 1, G_MAXUINT32, DEFAULT_MOVIE_TIMESCALE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_TRAK_TIMESCALE, + g_param_spec_uint ("trak-timescale", "Track timescale", + "Timescale to use for the tracks (units per second, 0 is automatic)", + 0, G_MAXUINT32, DEFAULT_TRAK_TIMESCALE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DO_CTTS, + g_param_spec_boolean ("presentation-time", + "Include presentation-time info", + "Calculate and include presentation/composition time " + "(in addition to decoding time)", DEFAULT_DO_CTTS, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DTS_METHOD, + g_param_spec_enum ("dts-method", "dts-method", + "Method to determine DTS time", + GST_TYPE_QT_MUX_DTS_METHOD, DEFAULT_DTS_METHOD, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_FAST_START, + g_param_spec_boolean ("faststart", "Format file to faststart", + "If the file should be formatted for faststart (headers first)", + DEFAULT_FAST_START, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_FAST_START_TEMP_FILE, + g_param_spec_string ("faststart-file", "File to use for storing buffers", + "File that will be used temporarily to store data from the stream " + "when creating a faststart file. If null a filepath will be " + "created automatically", DEFAULT_FAST_START_TEMP_FILE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_MOOV_RECOV_FILE, + g_param_spec_string ("moov-recovery-file", + "File to store data for posterior moov atom recovery", + "File to be used to store " + "data for moov atom making movie file recovery possible in case " + "of a crash during muxing. Null for disabled. (Experimental)", + DEFAULT_MOOV_RECOV_FILE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_FRAGMENT_DURATION, + g_param_spec_uint ("fragment-duration", "Fragment duration", + "Fragment durations in ms (produce a fragmented file if > 0)", + 0, G_MAXUINT32, klass->format == GST_QT_MUX_FORMAT_ISML ? + 2000 : DEFAULT_FRAGMENT_DURATION, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_STREAMABLE, + g_param_spec_boolean ("streamable", "Streamable", + "If set to true, the output should be as if it is to be streamed " + "and hence no indexes written or duration written.", + DEFAULT_STREAMABLE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_qt_mux_request_new_pad); + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_qt_mux_change_state); + gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_qt_mux_release_pad); +} + +static void +gst_qt_mux_pad_reset (GstQTPad * qtpad) +{ + gint i; + + qtpad->fourcc = 0; + qtpad->is_out_of_order = FALSE; + qtpad->have_dts = FALSE; + qtpad->sample_size = 0; + qtpad->sync = FALSE; + qtpad->last_dts = 0; + qtpad->first_ts = GST_CLOCK_TIME_NONE; + qtpad->prepare_buf_func = NULL; + qtpad->avg_bitrate = 0; + qtpad->max_bitrate = 0; + qtpad->ts_n_entries = 0; + qtpad->total_duration = 0; + qtpad->total_bytes = 0; + + qtpad->buf_head = 0; + qtpad->buf_tail = 0; + for (i = 0; i < G_N_ELEMENTS (qtpad->buf_entries); i++) { + if (qtpad->buf_entries[i]) { + gst_buffer_unref (qtpad->buf_entries[i]); + qtpad->buf_entries[i] = NULL; + } + } + + if (qtpad->last_buf) + gst_buffer_replace (&qtpad->last_buf, NULL); + + /* reference owned elsewhere */ + qtpad->trak = NULL; + + if (qtpad->traf) { + atom_traf_free (qtpad->traf); + qtpad->traf = NULL; + } + atom_array_clear (&qtpad->fragment_buffers); + + /* reference owned elsewhere */ + qtpad->tfra = NULL; +} + +/* + * Takes GstQTMux back to its initial state + */ +static void +gst_qt_mux_reset (GstQTMux * qtmux, gboolean alloc) +{ + GSList *walk; + + qtmux->state = GST_QT_MUX_STATE_NONE; + qtmux->header_size = 0; + qtmux->mdat_size = 0; + qtmux->mdat_pos = 0; + qtmux->longest_chunk = GST_CLOCK_TIME_NONE; + qtmux->video_pads = 0; + qtmux->audio_pads = 0; + qtmux->fragment_sequence = 0; + + if (qtmux->ftyp) { + atom_ftyp_free (qtmux->ftyp); + qtmux->ftyp = NULL; + } + if (qtmux->moov) { + atom_moov_free (qtmux->moov); + qtmux->moov = NULL; + } + if (qtmux->mfra) { + atom_mfra_free (qtmux->mfra); + qtmux->mfra = NULL; + } + if (qtmux->fast_start_file) { + fclose (qtmux->fast_start_file); + g_remove (qtmux->fast_start_file_path); + qtmux->fast_start_file = NULL; + } + if (qtmux->moov_recov_file) { + fclose (qtmux->moov_recov_file); + qtmux->moov_recov_file = NULL; + } + for (walk = qtmux->extra_atoms; walk; walk = g_slist_next (walk)) { + AtomInfo *ainfo = (AtomInfo *) walk->data; + ainfo->free_func (ainfo->atom); + g_free (ainfo); + } + g_slist_free (qtmux->extra_atoms); + qtmux->extra_atoms = NULL; + + GST_OBJECT_LOCK (qtmux); + gst_tag_setter_reset_tags (GST_TAG_SETTER (qtmux)); + GST_OBJECT_UNLOCK (qtmux); + + /* reset pad data */ + for (walk = qtmux->sinkpads; walk; walk = g_slist_next (walk)) { + GstQTPad *qtpad = (GstQTPad *) walk->data; + gst_qt_mux_pad_reset (qtpad); + + /* hm, moov_free above yanked the traks away from us, + * so do not free, but do clear */ + qtpad->trak = NULL; + } + + if (alloc) { + qtmux->moov = atom_moov_new (qtmux->context); + /* ensure all is as nice and fresh as request_new_pad would provide it */ + for (walk = qtmux->sinkpads; walk; walk = g_slist_next (walk)) { + GstQTPad *qtpad = (GstQTPad *) walk->data; + + qtpad->trak = atom_trak_new (qtmux->context); + atom_moov_add_trak (qtmux->moov, qtpad->trak); + } + } +} + +static void +gst_qt_mux_init (GstQTMux * qtmux, GstQTMuxClass * qtmux_klass) +{ + GstElementClass *klass = GST_ELEMENT_CLASS (qtmux_klass); + GstPadTemplate *templ; + + templ = gst_element_class_get_pad_template (klass, "src"); + qtmux->srcpad = gst_pad_new_from_template (templ, "src"); + gst_pad_use_fixed_caps (qtmux->srcpad); + gst_element_add_pad (GST_ELEMENT (qtmux), qtmux->srcpad); + + qtmux->sinkpads = NULL; + qtmux->collect = gst_collect_pads_new (); + gst_collect_pads_set_function (qtmux->collect, + (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_qt_mux_collected), qtmux); + + /* properties set to default upon construction */ + + /* always need this */ + qtmux->context = + atoms_context_new (gst_qt_mux_map_format_to_flavor (qtmux_klass->format)); + + /* internals to initial state */ + gst_qt_mux_reset (qtmux, TRUE); +} + + +static void +gst_qt_mux_finalize (GObject * object) +{ + GstQTMux *qtmux = GST_QT_MUX_CAST (object); + + gst_qt_mux_reset (qtmux, FALSE); + + g_free (qtmux->fast_start_file_path); + g_free (qtmux->moov_recov_file_path); + + atoms_context_free (qtmux->context); + gst_object_unref (qtmux->collect); + + g_slist_free (qtmux->sinkpads); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstBuffer * +gst_qt_mux_prepare_jpc_buffer (GstQTPad * qtpad, GstBuffer * buf, + GstQTMux * qtmux) +{ + GstBuffer *newbuf; + + GST_LOG_OBJECT (qtmux, "Preparing jpc buffer"); + + if (buf == NULL) + return NULL; + + newbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (buf) + 8); + gst_buffer_copy_metadata (newbuf, buf, GST_BUFFER_COPY_ALL); + + GST_WRITE_UINT32_BE (GST_BUFFER_DATA (newbuf), GST_BUFFER_SIZE (newbuf)); + GST_WRITE_UINT32_LE (GST_BUFFER_DATA (newbuf) + 4, FOURCC_jp2c); + + memcpy (GST_BUFFER_DATA (newbuf) + 8, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + gst_buffer_unref (buf); + + return newbuf; +} + +static void +gst_qt_mux_add_mp4_tag (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + switch (gst_tag_get_type (tag)) { + /* strings */ + case G_TYPE_STRING: + { + gchar *str = NULL; + + if (!gst_tag_list_get_string (list, tag, &str) || !str) + break; + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), str); + atom_moov_add_str_tag (qtmux->moov, fourcc, str); + g_free (str); + break; + } + /* double */ + case G_TYPE_DOUBLE: + { + gdouble value; + + if (!gst_tag_list_get_double (list, tag, &value)) + break; + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u", + GST_FOURCC_ARGS (fourcc), (gint) value); + atom_moov_add_uint_tag (qtmux->moov, fourcc, 21, (gint) value); + break; + } + case G_TYPE_UINT: + { + guint value = 0; + if (tag2) { + /* paired unsigned integers */ + guint count = 0; + gboolean got_tag; + + got_tag = gst_tag_list_get_uint (list, tag, &value); + got_tag = gst_tag_list_get_uint (list, tag2, &count) || got_tag; + if (!got_tag) + break; + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u/%u", + GST_FOURCC_ARGS (fourcc), value, count); + atom_moov_add_uint_tag (qtmux->moov, fourcc, 0, + value << 16 | (count & 0xFFFF)); + } else { + /* unpaired unsigned integers */ + if (!gst_tag_list_get_uint (list, tag, &value)) + break; + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u", + GST_FOURCC_ARGS (fourcc), value); + atom_moov_add_uint_tag (qtmux->moov, fourcc, 1, value); + } + break; + } + default: + g_assert_not_reached (); + break; + } +} + +static void +gst_qt_mux_add_mp4_date (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + GDate *date = NULL; + GDateYear year; + GDateMonth month; + GDateDay day; + gchar *str; + + g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_DATE); + + if (!gst_tag_list_get_date (list, tag, &date) || !date) + return; + + year = g_date_get_year (date); + month = g_date_get_month (date); + day = g_date_get_day (date); + + g_date_free (date); + + if (year == G_DATE_BAD_YEAR && month == G_DATE_BAD_MONTH && + day == G_DATE_BAD_DAY) { + GST_WARNING_OBJECT (qtmux, "invalid date in tag"); + return; + } + + str = g_strdup_printf ("%u-%u-%u", year, month, day); + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), str); + atom_moov_add_str_tag (qtmux->moov, fourcc, str); + g_free (str); +} + +static void +gst_qt_mux_add_mp4_cover (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + GValue value = { 0, }; + GstBuffer *buf; + GstCaps *caps; + GstStructure *structure; + gint flags = 0; + + g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_BUFFER); + + if (!gst_tag_list_copy_value (&value, list, tag)) + return; + + buf = gst_value_get_buffer (&value); + if (!buf) + goto done; + + caps = gst_buffer_get_caps (buf); + if (!caps) { + GST_WARNING_OBJECT (qtmux, "preview image without caps"); + goto done; + } + + GST_DEBUG_OBJECT (qtmux, "preview image caps %" GST_PTR_FORMAT, caps); + + structure = gst_caps_get_structure (caps, 0); + if (gst_structure_has_name (structure, "image/jpeg")) + flags = 13; + else if (gst_structure_has_name (structure, "image/png")) + flags = 14; + gst_caps_unref (caps); + + if (!flags) { + GST_WARNING_OBJECT (qtmux, "preview image format not supported"); + goto done; + } + + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT + " -> image size %d", GST_FOURCC_ARGS (fourcc), GST_BUFFER_SIZE (buf)); + atom_moov_add_tag (qtmux->moov, fourcc, flags, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); +done: + g_value_unset (&value); +} + +static void +gst_qt_mux_add_3gp_str (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + gchar *str = NULL; + guint number; + + g_return_if_fail (gst_tag_get_type (tag) == G_TYPE_STRING); + g_return_if_fail (!tag2 || gst_tag_get_type (tag2) == G_TYPE_UINT); + + if (!gst_tag_list_get_string (list, tag, &str) || !str) + return; + + if (tag2) + if (!gst_tag_list_get_uint (list, tag2, &number)) + tag2 = NULL; + + if (!tag2) { + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), str); + atom_moov_add_3gp_str_tag (qtmux->moov, fourcc, str); + } else { + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s/%d", + GST_FOURCC_ARGS (fourcc), str, number); + atom_moov_add_3gp_str_int_tag (qtmux->moov, fourcc, str, number); + } + + g_free (str); +} + +static void +gst_qt_mux_add_3gp_date (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + GDate *date = NULL; + GDateYear year; + + g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_DATE); + + if (!gst_tag_list_get_date (list, tag, &date) || !date) + return; + + year = g_date_get_year (date); + + if (year == G_DATE_BAD_YEAR) { + GST_WARNING_OBJECT (qtmux, "invalid date in tag"); + return; + } + + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %d", + GST_FOURCC_ARGS (fourcc), year); + atom_moov_add_3gp_uint_tag (qtmux->moov, fourcc, year); +} + +static void +gst_qt_mux_add_3gp_location (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + gdouble latitude = -360, longitude = -360, altitude = 0; + gchar *location = NULL; + guint8 *data, *ddata; + gint size = 0, len = 0; + gboolean ret = FALSE; + + g_return_if_fail (strcmp (tag, GST_TAG_GEO_LOCATION_NAME) == 0); + + ret = gst_tag_list_get_string (list, tag, &location); + ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_LONGITUDE, + &longitude); + ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_LATITUDE, + &latitude); + ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_ELEVATION, + &altitude); + + if (!ret) + return; + + if (location) + len = strlen (location); + size += len + 1 + 2; + + /* role + (long, lat, alt) + body + notes */ + size += 1 + 3 * 4 + 1 + 1; + + data = ddata = g_malloc (size); + + /* language tag */ + GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); + /* location */ + if (location) + memcpy (data + 2, location, len); + GST_WRITE_UINT8 (data + 2 + len, 0); + data += len + 1 + 2; + /* role */ + GST_WRITE_UINT8 (data, 0); + /* long, lat, alt */ +#define QT_WRITE_SFP32(data, fp) GST_WRITE_UINT32_BE(data, (guint32) ((gint) (fp * 65536.0))) + QT_WRITE_SFP32 (data + 1, longitude); + QT_WRITE_SFP32 (data + 5, latitude); + QT_WRITE_SFP32 (data + 9, altitude); + /* neither astronomical body nor notes */ + GST_WRITE_UINT16_BE (data + 13, 0); + + GST_DEBUG_OBJECT (qtmux, "Adding tag 'loci'"); + atom_moov_add_3gp_tag (qtmux->moov, fourcc, ddata, size); + g_free (ddata); +} + +static void +gst_qt_mux_add_3gp_keywords (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + gchar *keywords = NULL; + guint8 *data, *ddata; + gint size = 0, i; + gchar **kwds; + + g_return_if_fail (strcmp (tag, GST_TAG_KEYWORDS) == 0); + + if (!gst_tag_list_get_string (list, tag, &keywords) || !keywords) + return; + + kwds = g_strsplit (keywords, ",", 0); + g_free (keywords); + + size = 0; + for (i = 0; kwds[i]; i++) { + /* size byte + null-terminator */ + size += strlen (kwds[i]) + 1 + 1; + } + + /* language tag + count + keywords */ + size += 2 + 1; + + data = ddata = g_malloc (size); + + /* language tag */ + GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); + /* count */ + GST_WRITE_UINT8 (data + 2, i); + data += 3; + /* keywords */ + for (i = 0; kwds[i]; ++i) { + gint len = strlen (kwds[i]); + + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), kwds[i]); + /* size */ + GST_WRITE_UINT8 (data, len + 1); + memcpy (data + 1, kwds[i], len + 1); + data += len + 2; + } + + g_strfreev (kwds); + + atom_moov_add_3gp_tag (qtmux->moov, fourcc, ddata, size); + g_free (ddata); +} + +static gboolean +gst_qt_mux_parse_classification_string (GstQTMux * qtmux, const gchar * input, + guint32 * p_fourcc, guint16 * p_table, gchar ** p_content) +{ + guint32 fourcc; + gint table; + gint size; + const gchar *data; + + data = input; + size = strlen (input); + + if (size < 4 + 3 + 1 + 1 + 1) { + /* at least the minimum xxxx://y/z */ + GST_WARNING_OBJECT (qtmux, "Classification tag input (%s) too short, " + "ignoring", input); + return FALSE; + } + + /* read the fourcc */ + memcpy (&fourcc, data, 4); + size -= 4; + data += 4; + + if (strncmp (data, "://", 3) != 0) { + goto mismatch; + } + data += 3; + size -= 3; + + /* read the table number */ + if (sscanf (data, "%d", &table) != 1) { + goto mismatch; + } + if (table < 0) { + GST_WARNING_OBJECT (qtmux, "Invalid table number in classification tag (%d)" + ", table numbers should be positive, ignoring tag", table); + return FALSE; + } + + /* find the next / */ + while (size > 0 && data[0] != '/') { + data += 1; + size -= 1; + } + if (size == 0) { + goto mismatch; + } + g_assert (data[0] == '/'); + + /* skip the '/' */ + data += 1; + size -= 1; + if (size == 0) { + goto mismatch; + } + + /* read up the rest of the string */ + *p_content = g_strdup (data); + *p_table = (guint16) table; + *p_fourcc = fourcc; + return TRUE; + +mismatch: + { + GST_WARNING_OBJECT (qtmux, "Ignoring classification tag as " + "input (%s) didn't match the expected entitycode://table/content", + input); + return FALSE; + } +} + +static void +gst_qt_mux_add_3gp_classification (GstQTMux * qtmux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc) +{ + gchar *clsf_data = NULL; + gint size = 0; + guint32 entity = 0; + guint16 table = 0; + gchar *content = NULL; + guint8 *data; + + g_return_if_fail (strcmp (tag, GST_TAG_3GP_CLASSIFICATION) == 0); + + if (!gst_tag_list_get_string (list, tag, &clsf_data) || !clsf_data) + return; + + GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", + GST_FOURCC_ARGS (fourcc), clsf_data); + + /* parse the string, format is: + * entityfourcc://table/content + */ + gst_qt_mux_parse_classification_string (qtmux, clsf_data, &entity, &table, + &content); + g_free (clsf_data); + /* +1 for the \0 */ + size = strlen (content) + 1; + + /* now we have everything, build the atom + * atom description is at 3GPP TS 26.244 V8.2.0 (2009-09) */ + data = g_malloc (4 + 2 + 2 + size); + GST_WRITE_UINT32_LE (data, entity); + GST_WRITE_UINT16_BE (data + 4, (guint16) table); + GST_WRITE_UINT16_BE (data + 6, 0); + memcpy (data + 8, content, size); + g_free (content); + + atom_moov_add_3gp_tag (qtmux->moov, fourcc, data, 4 + 2 + 2 + size); + g_free (data); +} + +typedef void (*GstQTMuxAddTagFunc) (GstQTMux * mux, const GstTagList * list, + const char *tag, const char *tag2, guint32 fourcc); + +/* + * Struct to record mappings from gstreamer tags to fourcc codes + */ +typedef struct _GstTagToFourcc +{ + guint32 fourcc; + const gchar *gsttag; + const gchar *gsttag2; + const GstQTMuxAddTagFunc func; +} GstTagToFourcc; + +/* tag list tags to fourcc matching */ +static const GstTagToFourcc tag_matches_mp4[] = { + {FOURCC__alb, GST_TAG_ALBUM, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_soal, GST_TAG_ALBUM_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__ART, GST_TAG_ARTIST, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_soar, GST_TAG_ARTIST_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_aART, GST_TAG_ALBUM_ARTIST, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_soaa, GST_TAG_ALBUM_ARTIST_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__cmt, GST_TAG_COMMENT, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__wrt, GST_TAG_COMPOSER, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_soco, GST_TAG_COMPOSER_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_tvsh, GST_TAG_SHOW_NAME, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_sosn, GST_TAG_SHOW_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_tvsn, GST_TAG_SHOW_SEASON_NUMBER, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_tves, GST_TAG_SHOW_EPISODE_NUMBER, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__gen, GST_TAG_GENRE, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__nam, GST_TAG_TITLE, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_sonm, GST_TAG_TITLE_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_perf, GST_TAG_PERFORMER, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__grp, GST_TAG_GROUPING, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__des, GST_TAG_DESCRIPTION, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__lyr, GST_TAG_LYRICS, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__too, GST_TAG_ENCODER, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_cprt, GST_TAG_COPYRIGHT, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_keyw, GST_TAG_KEYWORDS, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC__day, GST_TAG_DATE, NULL, gst_qt_mux_add_mp4_date}, + {FOURCC_tmpo, GST_TAG_BEATS_PER_MINUTE, NULL, gst_qt_mux_add_mp4_tag}, + {FOURCC_trkn, GST_TAG_TRACK_NUMBER, GST_TAG_TRACK_COUNT, + gst_qt_mux_add_mp4_tag}, + {FOURCC_disk, GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, + gst_qt_mux_add_mp4_tag}, + {FOURCC_covr, GST_TAG_PREVIEW_IMAGE, NULL, gst_qt_mux_add_mp4_cover}, + {FOURCC_covr, GST_TAG_IMAGE, NULL, gst_qt_mux_add_mp4_cover}, + {0, NULL,} +}; + +static const GstTagToFourcc tag_matches_3gp[] = { + {FOURCC_titl, GST_TAG_TITLE, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_dscp, GST_TAG_DESCRIPTION, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_cprt, GST_TAG_COPYRIGHT, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_perf, GST_TAG_ARTIST, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_auth, GST_TAG_COMPOSER, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_gnre, GST_TAG_GENRE, NULL, gst_qt_mux_add_3gp_str}, + {FOURCC_kywd, GST_TAG_KEYWORDS, NULL, gst_qt_mux_add_3gp_keywords}, + {FOURCC_yrrc, GST_TAG_DATE, NULL, gst_qt_mux_add_3gp_date}, + {FOURCC_albm, GST_TAG_ALBUM, GST_TAG_TRACK_NUMBER, gst_qt_mux_add_3gp_str}, + {FOURCC_loci, GST_TAG_GEO_LOCATION_NAME, NULL, gst_qt_mux_add_3gp_location}, + {FOURCC_clsf, GST_TAG_3GP_CLASSIFICATION, NULL, + gst_qt_mux_add_3gp_classification}, + {0, NULL,} +}; + +/* qtdemux produces these for atoms it cannot parse */ +#define GST_QT_DEMUX_PRIVATE_TAG "private-qt-tag" + +static void +gst_qt_mux_add_xmp_tags (GstQTMux * qtmux, const GstTagList * list) +{ + GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); + GstBuffer *xmp = NULL; + + /* adobe specs only have 'quicktime' and 'mp4', + * but I guess we can extrapolate to gpp. + * Keep mj2 out for now as we don't add any tags for it yet. + * If you have further info about xmp on these formats, please share */ + if (qtmux_klass->format == GST_QT_MUX_FORMAT_MJ2) + return; + + GST_DEBUG_OBJECT (qtmux, "Adding xmp tags"); + + if (qtmux_klass->format == GST_QT_MUX_FORMAT_QT) { + xmp = gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER (qtmux), + list, TRUE); + if (xmp) + atom_moov_add_xmp_tags (qtmux->moov, xmp); + } else { + AtomInfo *ainfo; + /* for isom/mp4, it is a top level uuid atom */ + xmp = gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER (qtmux), + list, TRUE); + if (xmp) { + ainfo = build_uuid_xmp_atom (xmp); + if (ainfo) { + qtmux->extra_atoms = g_slist_prepend (qtmux->extra_atoms, ainfo); + } + } + } + if (xmp) + gst_buffer_unref (xmp); +} + +static void +gst_qt_mux_add_metadata_tags (GstQTMux * qtmux, const GstTagList * list) +{ + GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); + guint32 fourcc; + gint i; + const gchar *tag, *tag2; + const GstTagToFourcc *tag_matches; + + switch (qtmux_klass->format) { + case GST_QT_MUX_FORMAT_3GP: + tag_matches = tag_matches_3gp; + break; + case GST_QT_MUX_FORMAT_MJ2: + tag_matches = NULL; + break; + default: + /* sort of iTunes style for mp4 and QT (?) */ + tag_matches = tag_matches_mp4; + break; + } + + if (!tag_matches) + return; + + for (i = 0; tag_matches[i].fourcc; i++) { + fourcc = tag_matches[i].fourcc; + tag = tag_matches[i].gsttag; + tag2 = tag_matches[i].gsttag2; + + g_assert (tag_matches[i].func); + tag_matches[i].func (qtmux, list, tag, tag2, fourcc); + } + + /* add unparsed blobs if present */ + if (gst_tag_exists (GST_QT_DEMUX_PRIVATE_TAG)) { + guint num_tags; + + num_tags = gst_tag_list_get_tag_size (list, GST_QT_DEMUX_PRIVATE_TAG); + for (i = 0; i < num_tags; ++i) { + const GValue *val; + GstBuffer *buf; + GstCaps *caps = NULL; + + val = gst_tag_list_get_value_index (list, GST_QT_DEMUX_PRIVATE_TAG, i); + buf = (GstBuffer *) gst_value_get_mini_object (val); + + if (buf && (caps = gst_buffer_get_caps (buf))) { + GstStructure *s; + const gchar *style = NULL; + + GST_DEBUG_OBJECT (qtmux, "Found private tag %d/%d; size %d, caps %" + GST_PTR_FORMAT, i, num_tags, GST_BUFFER_SIZE (buf), caps); + s = gst_caps_get_structure (caps, 0); + if (s && (style = gst_structure_get_string (s, "style"))) { + /* try to prevent some style tag ending up into another variant + * (todo: make into a list if more cases) */ + if ((strcmp (style, "itunes") == 0 && + qtmux_klass->format == GST_QT_MUX_FORMAT_MP4) || + (strcmp (style, "iso") == 0 && + qtmux_klass->format == GST_QT_MUX_FORMAT_3GP)) { + GST_DEBUG_OBJECT (qtmux, "Adding private tag"); + atom_moov_add_blob_tag (qtmux->moov, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + } + } + gst_caps_unref (caps); + } + } + } + + return; +} + +/* + * Gets the tagsetter iface taglist and puts the known tags + * into the output stream + */ +static void +gst_qt_mux_setup_metadata (GstQTMux * qtmux) +{ + const GstTagList *tags; + + GST_OBJECT_LOCK (qtmux); + tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (qtmux)); + GST_OBJECT_UNLOCK (qtmux); + + GST_LOG_OBJECT (qtmux, "tags: %" GST_PTR_FORMAT, tags); + + if (tags && !gst_tag_list_is_empty (tags)) { + GstTagList *copy = gst_tag_list_copy (tags); + + GST_DEBUG_OBJECT (qtmux, "Removing bogus tags"); + gst_tag_list_remove_tag (copy, GST_TAG_VIDEO_CODEC); + gst_tag_list_remove_tag (copy, GST_TAG_AUDIO_CODEC); + gst_tag_list_remove_tag (copy, GST_TAG_CONTAINER_FORMAT); + + GST_DEBUG_OBJECT (qtmux, "Formatting tags"); + gst_qt_mux_add_metadata_tags (qtmux, copy); + gst_qt_mux_add_xmp_tags (qtmux, copy); + gst_tag_list_free (copy); + } else { + GST_DEBUG_OBJECT (qtmux, "No tags received"); + } +} + +static inline GstBuffer * +_gst_buffer_new_take_data (guint8 * data, guint size) +{ + GstBuffer *buf; + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data; + GST_BUFFER_SIZE (buf) = size; + + return buf; +} + +static GstFlowReturn +gst_qt_mux_send_buffer (GstQTMux * qtmux, GstBuffer * buf, guint64 * offset, + gboolean mind_fast) +{ + GstFlowReturn res; + guint8 *data; + guint size; + + g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + GST_LOG_OBJECT (qtmux, "sending buffer size %d", size); + + if (mind_fast && qtmux->fast_start_file) { + gint ret; + + GST_LOG_OBJECT (qtmux, "to temporary file"); + ret = fwrite (data, sizeof (guint8), size, qtmux->fast_start_file); + gst_buffer_unref (buf); + if (ret != size) + goto write_error; + else + res = GST_FLOW_OK; + } else { + GST_LOG_OBJECT (qtmux, "downstream"); + + buf = gst_buffer_make_metadata_writable (buf); + gst_buffer_set_caps (buf, GST_PAD_CAPS (qtmux->srcpad)); + res = gst_pad_push (qtmux->srcpad, buf); + } + + if (G_LIKELY (offset)) + *offset += size; + + return res; + + /* ERRORS */ +write_error: + { + GST_ELEMENT_ERROR (qtmux, RESOURCE, WRITE, + ("Failed to write to temporary file"), GST_ERROR_SYSTEM); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_qt_mux_seek_to_beginning (FILE * f) +{ +#ifdef HAVE_FSEEKO + if (fseeko (f, (off_t) 0, SEEK_SET) != 0) + return FALSE; +#elif defined (G_OS_UNIX) || defined (G_OS_WIN32) + if (lseek (fileno (f), (off_t) 0, SEEK_SET) == (off_t) - 1) + return FALSE; +#else + if (fseek (f, (long) 0, SEEK_SET) != 0) + return FALSE; +#endif + return TRUE; +} + +static GstFlowReturn +gst_qt_mux_send_buffered_data (GstQTMux * qtmux, guint64 * offset) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *buf = NULL; + + if (fflush (qtmux->fast_start_file)) + goto flush_failed; + + if (!gst_qt_mux_seek_to_beginning (qtmux->fast_start_file)) + goto seek_failed; + + /* hm, this could all take a really really long time, + * but there may not be another way to get moov atom first + * (somehow optimize copy?) */ + GST_DEBUG_OBJECT (qtmux, "Sending buffered data"); + while (ret == GST_FLOW_OK) { + gint r; + const int bufsize = 4096; + + buf = gst_buffer_new_and_alloc (bufsize); + r = fread (GST_BUFFER_DATA (buf), sizeof (guint8), bufsize, + qtmux->fast_start_file); + if (r == 0) + break; + GST_BUFFER_SIZE (buf) = r; + GST_LOG_OBJECT (qtmux, "Pushing buffered buffer of size %d", r); + ret = gst_qt_mux_send_buffer (qtmux, buf, offset, FALSE); + buf = NULL; + } + if (buf) + gst_buffer_unref (buf); + + if (ftruncate (fileno (qtmux->fast_start_file), 0)) + goto seek_failed; + if (!gst_qt_mux_seek_to_beginning (qtmux->fast_start_file)) + goto seek_failed; + + return ret; + + /* ERRORS */ +flush_failed: + { + GST_ELEMENT_ERROR (qtmux, RESOURCE, WRITE, + ("Failed to flush temporary file"), GST_ERROR_SYSTEM); + ret = GST_FLOW_ERROR; + goto fail; + } +seek_failed: + { + GST_ELEMENT_ERROR (qtmux, RESOURCE, SEEK, + ("Failed to seek temporary file"), GST_ERROR_SYSTEM); + ret = GST_FLOW_ERROR; + goto fail; + } +fail: + { + /* clear descriptor so we don't remove temp file later on, + * might be possible to recover */ + fclose (qtmux->fast_start_file); + qtmux->fast_start_file = NULL; + return ret; + } +} + +/* + * Sends the initial mdat atom fields (size fields and fourcc type), + * the subsequent buffers are considered part of it's data. + * As we can't predict the amount of data that we are going to place in mdat + * we need to record the position of the size field in the stream so we can + * seek back to it later and update when the streams have finished. + */ +static GstFlowReturn +gst_qt_mux_send_mdat_header (GstQTMux * qtmux, guint64 * off, guint64 size, + gboolean extended) +{ + Atom *node_header; + GstBuffer *buf; + guint8 *data = NULL; + guint64 offset = 0; + + GST_DEBUG_OBJECT (qtmux, "Sending mdat's atom header, " + "size %" G_GUINT64_FORMAT, size); + + node_header = g_malloc0 (sizeof (Atom)); + node_header->type = FOURCC_mdat; + if (extended) { + /* use extended size */ + node_header->size = 1; + node_header->extended_size = 0; + if (size) + node_header->extended_size = size + 16; + } else { + node_header->size = size + 8; + } + + size = offset = 0; + if (atom_copy_data (node_header, &data, &size, &offset) == 0) + goto serialize_error; + + buf = _gst_buffer_new_take_data (data, offset); + g_free (node_header); + + GST_LOG_OBJECT (qtmux, "Pushing mdat start"); + return gst_qt_mux_send_buffer (qtmux, buf, off, FALSE); + + /* ERRORS */ +serialize_error: + { + GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), + ("Failed to serialize mdat")); + return GST_FLOW_ERROR; + } +} + +/* + * We get the position of the mdat size field, seek back to it + * and overwrite with the real value + */ +static GstFlowReturn +gst_qt_mux_update_mdat_size (GstQTMux * qtmux, guint64 mdat_pos, + guint64 mdat_size, guint64 * offset) +{ + GstEvent *event; + GstBuffer *buf; + gboolean large_file; + + large_file = (mdat_size > MDAT_LARGE_FILE_LIMIT); + + if (large_file) + mdat_pos += 8; + + /* seek and rewrite the header */ + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + mdat_pos, GST_CLOCK_TIME_NONE, 0); + gst_pad_push_event (qtmux->srcpad, event); + + if (large_file) { + buf = gst_buffer_new_and_alloc (sizeof (guint64)); + GST_WRITE_UINT64_BE (GST_BUFFER_DATA (buf), mdat_size + 16); + } else { + guint8 *data; + + buf = gst_buffer_new_and_alloc (16); + data = GST_BUFFER_DATA (buf); + GST_WRITE_UINT32_BE (data, 8); + GST_WRITE_UINT32_LE (data + 4, FOURCC_free); + GST_WRITE_UINT32_BE (data + 8, mdat_size + 8); + GST_WRITE_UINT32_LE (data + 12, FOURCC_mdat); + } + + return gst_qt_mux_send_buffer (qtmux, buf, offset, FALSE); +} + +static GstFlowReturn +gst_qt_mux_send_ftyp (GstQTMux * qtmux, guint64 * off) +{ + GstBuffer *buf; + guint64 size = 0, offset = 0; + guint8 *data = NULL; + + GST_DEBUG_OBJECT (qtmux, "Sending ftyp atom"); + + if (!atom_ftyp_copy_data (qtmux->ftyp, &data, &size, &offset)) + goto serialize_error; + + buf = _gst_buffer_new_take_data (data, offset); + + GST_LOG_OBJECT (qtmux, "Pushing ftyp"); + return gst_qt_mux_send_buffer (qtmux, buf, off, FALSE); + + /* ERRORS */ +serialize_error: + { + GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), + ("Failed to serialize ftyp")); + return GST_FLOW_ERROR; + } +} + +static void +gst_qt_mux_prepare_ftyp (GstQTMux * qtmux, AtomFTYP ** p_ftyp, + GstBuffer ** p_prefix) +{ + GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); + guint32 major, version; + GList *comp; + GstBuffer *prefix = NULL; + AtomFTYP *ftyp = NULL; + + GST_DEBUG_OBJECT (qtmux, "Preparing ftyp and possible prefix atom"); + + /* init and send context and ftyp based on current property state */ + gst_qt_mux_map_format_to_header (qtmux_klass->format, &prefix, &major, + &version, &comp, qtmux->moov, qtmux->longest_chunk, + qtmux->fast_start_file != NULL); + ftyp = atom_ftyp_new (qtmux->context, major, version, comp); + if (comp) + g_list_free (comp); + if (prefix) { + if (p_prefix) + *p_prefix = prefix; + else + gst_buffer_unref (prefix); + } + *p_ftyp = ftyp; +} + +static GstFlowReturn +gst_qt_mux_prepare_and_send_ftyp (GstQTMux * qtmux) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *prefix = NULL; + + GST_DEBUG_OBJECT (qtmux, "Preparing to send ftyp atom"); + + /* init and send context and ftyp based on current property state */ + if (qtmux->ftyp) { + atom_ftyp_free (qtmux->ftyp); + qtmux->ftyp = NULL; + } + gst_qt_mux_prepare_ftyp (qtmux, &qtmux->ftyp, &prefix); + if (prefix) { + ret = gst_qt_mux_send_buffer (qtmux, prefix, &qtmux->header_size, FALSE); + if (ret != GST_FLOW_OK) + return ret; + } + return gst_qt_mux_send_ftyp (qtmux, &qtmux->header_size); +} + +static void +gst_qt_mux_set_header_on_caps (GstQTMux * mux, GstBuffer * buf) +{ + GstStructure *structure; + GValue array = { 0 }; + GValue value = { 0 }; + GstCaps *caps; + + caps = gst_caps_copy (GST_PAD_CAPS (mux->srcpad)); + structure = gst_caps_get_structure (caps, 0); + + g_value_init (&array, GST_TYPE_ARRAY); + + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); + g_value_init (&value, GST_TYPE_BUFFER); + gst_value_take_buffer (&value, gst_buffer_ref (buf)); + gst_value_array_append_value (&array, &value); + g_value_unset (&value); + + gst_structure_set_value (structure, "streamheader", &array); + g_value_unset (&array); + gst_pad_set_caps (mux->srcpad, caps); + gst_caps_unref (caps); +} + +static void +gst_qt_mux_configure_moov (GstQTMux * qtmux, guint32 * _timescale) +{ + gboolean fragmented; + guint32 timescale; + + GST_OBJECT_LOCK (qtmux); + timescale = qtmux->timescale; + fragmented = qtmux->fragment_sequence > 0; + GST_OBJECT_UNLOCK (qtmux); + + /* inform lower layers of our property wishes, and determine duration. + * Let moov take care of this using its list of traks; + * so that released pads are also included */ + GST_DEBUG_OBJECT (qtmux, "Updating timescale to %" G_GUINT32_FORMAT, + timescale); + atom_moov_update_timescale (qtmux->moov, timescale); + atom_moov_set_fragmented (qtmux->moov, fragmented); + + atom_moov_update_duration (qtmux->moov); + + if (_timescale) + *_timescale = timescale; +} + +static GstFlowReturn +gst_qt_mux_send_moov (GstQTMux * qtmux, guint64 * _offset, gboolean mind_fast) +{ + guint64 offset = 0, size = 0; + guint8 *data; + GstBuffer *buf; + GstFlowReturn ret = GST_FLOW_OK; + + /* serialize moov */ + offset = size = 0; + data = NULL; + GST_LOG_OBJECT (qtmux, "Copying movie header into buffer"); + if (!atom_moov_copy_data (qtmux->moov, &data, &size, &offset)) + goto serialize_error; + + buf = _gst_buffer_new_take_data (data, offset); + GST_DEBUG_OBJECT (qtmux, "Pushing moov atoms"); + gst_qt_mux_set_header_on_caps (qtmux, buf); + ret = gst_qt_mux_send_buffer (qtmux, buf, _offset, mind_fast); + + return ret; + +serialize_error: + { + g_free (data); + return GST_FLOW_ERROR; + } +} + +/* either calculates size of extra atoms or pushes them */ +static GstFlowReturn +gst_qt_mux_send_extra_atoms (GstQTMux * qtmux, gboolean send, guint64 * offset, + gboolean mind_fast) +{ + GSList *walk; + guint64 loffset = 0, size = 0; + guint8 *data; + GstFlowReturn ret = GST_FLOW_OK; + + for (walk = qtmux->extra_atoms; walk; walk = g_slist_next (walk)) { + AtomInfo *ainfo = (AtomInfo *) walk->data; + + loffset = size = 0; + data = NULL; + if (!ainfo->copy_data_func (ainfo->atom, + send ? &data : NULL, &size, &loffset)) + goto serialize_error; + + if (send) { + GstBuffer *buf; + + GST_DEBUG_OBJECT (qtmux, + "Pushing extra top-level atom %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (ainfo->atom->type)); + buf = _gst_buffer_new_take_data (data, loffset); + ret = gst_qt_mux_send_buffer (qtmux, buf, offset, FALSE); + if (ret != GST_FLOW_OK) + break; + } else { + if (offset) + *offset += loffset; + } + } + + return ret; + +serialize_error: + { + g_free (data); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_qt_mux_start_file (GstQTMux * qtmux) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstCaps *caps; + + GST_DEBUG_OBJECT (qtmux, "starting file"); + + caps = gst_caps_copy (gst_pad_get_pad_template_caps (qtmux->srcpad)); + /* qtmux has structure with and without variant, remove all but the first */ + while (gst_caps_get_size (caps) > 1) + gst_caps_remove_structure (caps, 1); + gst_pad_set_caps (qtmux->srcpad, caps); + gst_caps_unref (caps); + + /* let downstream know we think in BYTES and expect to do seeking later on */ + gst_pad_push_event (qtmux->srcpad, + gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)); + + /* initialize our moov recovery file */ + GST_OBJECT_LOCK (qtmux); + if (qtmux->moov_recov_file_path) { + GST_DEBUG_OBJECT (qtmux, "Openning moov recovery file: %s", + qtmux->moov_recov_file_path); + qtmux->moov_recov_file = g_fopen (qtmux->moov_recov_file_path, "wb+"); + if (qtmux->moov_recov_file == NULL) { + GST_WARNING_OBJECT (qtmux, "Failed to open moov recovery file in %s", + qtmux->moov_recov_file_path); + } else { + GSList *walk; + gboolean fail = FALSE; + AtomFTYP *ftyp = NULL; + GstBuffer *prefix = NULL; + + gst_qt_mux_prepare_ftyp (qtmux, &ftyp, &prefix); + + if (!atoms_recov_write_headers (qtmux->moov_recov_file, ftyp, prefix, + qtmux->moov, qtmux->timescale, + g_slist_length (qtmux->sinkpads))) { + GST_WARNING_OBJECT (qtmux, "Failed to write moov recovery file " + "headers"); + fail = TRUE; + } + + atom_ftyp_free (ftyp); + if (prefix) + gst_buffer_unref (prefix); + + for (walk = qtmux->sinkpads; walk && !fail; walk = g_slist_next (walk)) { + GstCollectData *cdata = (GstCollectData *) walk->data; + GstQTPad *qpad = (GstQTPad *) cdata; + /* write info for each stream */ + fail = atoms_recov_write_trak_info (qtmux->moov_recov_file, qpad->trak); + if (fail) { + GST_WARNING_OBJECT (qtmux, "Failed to write trak info to recovery " + "file"); + } + } + if (fail) { + /* cleanup */ + fclose (qtmux->moov_recov_file); + qtmux->moov_recov_file = NULL; + GST_WARNING_OBJECT (qtmux, "An error was detected while writing to " + "recover file, moov recovery won't work"); + } + } + } + GST_OBJECT_UNLOCK (qtmux); + + /* + * send mdat header if already needed, and mark position for later update. + * We don't send ftyp now if we are on fast start mode, because we can + * better fine tune using the information we gather to create the whole moov + * atom. + */ + if (qtmux->fast_start) { + GST_OBJECT_LOCK (qtmux); + qtmux->fast_start_file = g_fopen (qtmux->fast_start_file_path, "wb+"); + if (!qtmux->fast_start_file) + goto open_failed; + GST_OBJECT_UNLOCK (qtmux); + + /* send a dummy buffer for preroll */ + ret = gst_qt_mux_send_buffer (qtmux, gst_buffer_new (), NULL, FALSE); + if (ret != GST_FLOW_OK) + goto exit; + + } else { + ret = gst_qt_mux_prepare_and_send_ftyp (qtmux); + if (ret != GST_FLOW_OK) { + goto exit; + } + + /* well, it's moov pos if fragmented ... */ + qtmux->mdat_pos = qtmux->header_size; + + if (qtmux->fragment_duration) { + GST_DEBUG_OBJECT (qtmux, "fragment duration %d ms, writing headers", + qtmux->fragment_duration); + /* also used as snapshot marker to indicate fragmented file */ + qtmux->fragment_sequence = 1; + /* prepare moov and/or tags */ + gst_qt_mux_configure_moov (qtmux, NULL); + gst_qt_mux_setup_metadata (qtmux); + ret = gst_qt_mux_send_moov (qtmux, &qtmux->header_size, FALSE); + if (ret != GST_FLOW_OK) + return ret; + /* extra atoms */ + ret = + gst_qt_mux_send_extra_atoms (qtmux, TRUE, &qtmux->header_size, FALSE); + if (ret != GST_FLOW_OK) + return ret; + /* prepare index */ + if (!qtmux->streamable) + qtmux->mfra = atom_mfra_new (qtmux->context); + } else { + /* extended to ensure some spare space */ + ret = gst_qt_mux_send_mdat_header (qtmux, &qtmux->header_size, 0, TRUE); + } + } + +exit: + return ret; + + /* ERRORS */ +open_failed: + { + GST_ELEMENT_ERROR (qtmux, RESOURCE, OPEN_READ_WRITE, + (("Could not open temporary file \"%s\""), qtmux->fast_start_file_path), + GST_ERROR_SYSTEM); + GST_OBJECT_UNLOCK (qtmux); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_qt_mux_stop_file (GstQTMux * qtmux) +{ + gboolean ret = GST_FLOW_OK; + guint64 offset = 0, size = 0; + GSList *walk; + gboolean large_file; + guint32 timescale; + GstClockTime first_ts = GST_CLOCK_TIME_NONE; + + GST_DEBUG_OBJECT (qtmux, "Updating remaining values and sending last data"); + + /* pushing last buffers for each pad */ + for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) { + GstCollectData *cdata = (GstCollectData *) walk->data; + GstQTPad *qtpad = (GstQTPad *) cdata; + + /* avoid add_buffer complaining if not negotiated + * in which case no buffers either, so skipping */ + if (!qtpad->fourcc) { + GST_DEBUG_OBJECT (qtmux, "Pad %s has never had buffers", + GST_PAD_NAME (qtpad->collect.pad)); + continue; + } + + /* send last buffer; also flushes possibly queued buffers/ts */ + GST_DEBUG_OBJECT (qtmux, "Sending the last buffer for pad %s", + GST_PAD_NAME (qtpad->collect.pad)); + ret = gst_qt_mux_add_buffer (qtmux, qtpad, NULL); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (qtmux, "Failed to send last buffer for %s, " + "flow return: %s", GST_PAD_NAME (qtpad->collect.pad), + gst_flow_get_name (ret)); + } + + /* having flushed above, can check for buffers now */ + if (!GST_CLOCK_TIME_IS_VALID (qtpad->first_ts)) { + GST_DEBUG_OBJECT (qtmux, "Pad %s has no buffers", + GST_PAD_NAME (qtpad->collect.pad)); + continue; + } + + /* determine max stream duration */ + if (!GST_CLOCK_TIME_IS_VALID (first_ts) || + (GST_CLOCK_TIME_IS_VALID (qtpad->first_ts) && + qtpad->last_dts > first_ts)) { + first_ts = qtpad->last_dts; + } + + /* update average bitrate of streams if needed */ + { + guint32 avgbitrate = 0; + guint32 maxbitrate = qtpad->max_bitrate; + + if (qtpad->avg_bitrate) + avgbitrate = qtpad->avg_bitrate; + else if (qtpad->total_duration > 0) + avgbitrate = (guint32) gst_util_uint64_scale_round (qtpad->total_bytes, + 8 * GST_SECOND, qtpad->total_duration); + + atom_trak_update_bitrates (qtpad->trak, avgbitrate, maxbitrate); + } + } + + if (qtmux->fragment_sequence) { + GstEvent *event; + + if (qtmux->mfra) { + guint8 *data = NULL; + GstBuffer *buf; + + size = offset = 0; + GST_DEBUG_OBJECT (qtmux, "adding mfra"); + if (!atom_mfra_copy_data (qtmux->mfra, &data, &size, &offset)) + goto serialize_error; + buf = _gst_buffer_new_take_data (data, offset); + ret = gst_qt_mux_send_buffer (qtmux, buf, NULL, FALSE); + if (ret != GST_FLOW_OK) + return ret; + } else { + /* must have been streamable; no need to write duration */ + GST_DEBUG_OBJECT (qtmux, "streamable file; nothing to stop"); + return GST_FLOW_OK; + } + + + timescale = qtmux->timescale; + /* only mvex duration is updated, + * mvhd should be consistent with empty moov + * (but TODO maybe some clients do not handle that well ?) */ + qtmux->moov->mvex.mehd.fragment_duration = + gst_util_uint64_scale (first_ts, timescale, GST_SECOND); + GST_DEBUG_OBJECT (qtmux, "rewriting moov with mvex duration %" + GST_TIME_FORMAT, GST_TIME_ARGS (first_ts)); + /* seek and rewrite the header */ + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + qtmux->mdat_pos, GST_CLOCK_TIME_NONE, 0); + gst_pad_push_event (qtmux->srcpad, event); + /* no need to seek back */ + return gst_qt_mux_send_moov (qtmux, NULL, FALSE); + } + + gst_qt_mux_configure_moov (qtmux, ×cale); + + /* check for late streams */ + first_ts = GST_CLOCK_TIME_NONE; + for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) { + GstCollectData *cdata = (GstCollectData *) walk->data; + GstQTPad *qtpad = (GstQTPad *) cdata; + + if (!GST_CLOCK_TIME_IS_VALID (first_ts) || + (GST_CLOCK_TIME_IS_VALID (qtpad->first_ts) && + qtpad->first_ts < first_ts)) { + first_ts = qtpad->first_ts; + } + } + GST_DEBUG_OBJECT (qtmux, "Media first ts selected: %" GST_TIME_FORMAT, + GST_TIME_ARGS (first_ts)); + /* add EDTSs for late streams */ + for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) { + GstCollectData *cdata = (GstCollectData *) walk->data; + GstQTPad *qtpad = (GstQTPad *) cdata; + guint32 lateness; + guint32 duration; + + if (GST_CLOCK_TIME_IS_VALID (qtpad->first_ts) && + qtpad->first_ts > first_ts + MAX_TOLERATED_LATENESS) { + GST_DEBUG_OBJECT (qtmux, "Pad %s is a late stream by %" GST_TIME_FORMAT, + GST_PAD_NAME (qtpad->collect.pad), + GST_TIME_ARGS (qtpad->first_ts - first_ts)); + lateness = gst_util_uint64_scale_round (qtpad->first_ts - first_ts, + timescale, GST_SECOND); + duration = qtpad->trak->tkhd.duration; + atom_trak_add_elst_entry (qtpad->trak, lateness, (guint32) - 1, + (guint32) (1 * 65536.0)); + atom_trak_add_elst_entry (qtpad->trak, duration, 0, + (guint32) (1 * 65536.0)); + + /* need to add the empty time to the trak duration */ + qtpad->trak->tkhd.duration += lateness; + } + } + + /* tags into file metadata */ + gst_qt_mux_setup_metadata (qtmux); + + large_file = (qtmux->mdat_size > MDAT_LARGE_FILE_LIMIT); + /* if faststart, update the offset of the atoms in the movie with the offset + * that the movie headers before mdat will cause. + * Also, send the ftyp */ + if (qtmux->fast_start_file) { + GstFlowReturn flow_ret; + offset = size = 0; + + flow_ret = gst_qt_mux_prepare_and_send_ftyp (qtmux); + if (flow_ret != GST_FLOW_OK) { + goto ftyp_error; + } + /* copy into NULL to obtain size */ + if (!atom_moov_copy_data (qtmux->moov, NULL, &size, &offset)) + goto serialize_error; + GST_DEBUG_OBJECT (qtmux, "calculated moov atom size %" G_GUINT64_FORMAT, + offset); + offset += qtmux->header_size + (large_file ? 16 : 8); + + /* sum up with the extra atoms size */ + ret = gst_qt_mux_send_extra_atoms (qtmux, FALSE, &offset, FALSE); + if (ret != GST_FLOW_OK) + return ret; + } else { + offset = qtmux->header_size; + } + atom_moov_chunks_add_offset (qtmux->moov, offset); + + /* moov */ + /* note: as of this point, we no longer care about tracking written data size, + * since there is no more use for it anyway */ + ret = gst_qt_mux_send_moov (qtmux, NULL, FALSE); + if (ret != GST_FLOW_OK) + return ret; + + /* extra atoms */ + ret = gst_qt_mux_send_extra_atoms (qtmux, TRUE, NULL, FALSE); + if (ret != GST_FLOW_OK) + return ret; + + /* if needed, send mdat atom and move buffered data into it */ + if (qtmux->fast_start_file) { + /* mdat_size = accumulated (buffered data) */ + ret = gst_qt_mux_send_mdat_header (qtmux, NULL, qtmux->mdat_size, + large_file); + if (ret != GST_FLOW_OK) + return ret; + ret = gst_qt_mux_send_buffered_data (qtmux, NULL); + if (ret != GST_FLOW_OK) + return ret; + } else { + /* mdat needs update iff not using faststart */ + GST_DEBUG_OBJECT (qtmux, "updating mdat size"); + ret = gst_qt_mux_update_mdat_size (qtmux, qtmux->mdat_pos, + qtmux->mdat_size, NULL); + /* note; no seeking back to the end of file is done, + * since we no longer write anything anyway */ + } + + return ret; + + /* ERRORS */ +serialize_error: + { + GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), + ("Failed to serialize moov")); + return GST_FLOW_ERROR; + } +ftyp_error: + { + GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("Failed to send ftyp")); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_qt_mux_pad_fragment_add_buffer (GstQTMux * qtmux, GstQTPad * pad, + GstBuffer * buf, gboolean force, guint32 nsamples, gint64 dts, + guint32 delta, guint32 size, gboolean sync, gint64 pts_offset) +{ + GstFlowReturn ret = GST_FLOW_OK; + + /* setup if needed */ + if (G_UNLIKELY (!pad->traf || force)) + goto init; + +flush: + /* flush pad fragment if threshold reached, + * or at new keyframe if we should be minding those in the first place */ + if (G_UNLIKELY (force || (sync && pad->sync) || + pad->fragment_duration < (gint64) delta)) { + AtomMOOF *moof; + guint64 size = 0, offset = 0; + guint8 *data = NULL; + GstBuffer *buffer; + guint i, total_size; + + /* now we know where moof ends up, update offset in tfra */ + if (pad->tfra) + atom_tfra_update_offset (pad->tfra, qtmux->header_size); + + moof = atom_moof_new (qtmux->context, qtmux->fragment_sequence); + /* takes ownership */ + atom_moof_add_traf (moof, pad->traf); + pad->traf = NULL; + atom_moof_copy_data (moof, &data, &size, &offset); + buffer = _gst_buffer_new_take_data (data, offset); + GST_LOG_OBJECT (qtmux, "writing moof size %d", GST_BUFFER_SIZE (buffer)); + ret = gst_qt_mux_send_buffer (qtmux, buffer, &qtmux->header_size, FALSE); + + /* and actual data */ + total_size = 0; + for (i = 0; i < atom_array_get_len (&pad->fragment_buffers); i++) { + total_size += + GST_BUFFER_SIZE (atom_array_index (&pad->fragment_buffers, i)); + } + + GST_LOG_OBJECT (qtmux, "writing %d buffers, total_size %d", + atom_array_get_len (&pad->fragment_buffers), total_size); + if (ret == GST_FLOW_OK) + ret = gst_qt_mux_send_mdat_header (qtmux, &qtmux->header_size, total_size, + FALSE); + for (i = 0; i < atom_array_get_len (&pad->fragment_buffers); i++) { + if (G_LIKELY (ret == GST_FLOW_OK)) + ret = gst_qt_mux_send_buffer (qtmux, + atom_array_index (&pad->fragment_buffers, i), &qtmux->header_size, + FALSE); + else + gst_buffer_unref (atom_array_index (&pad->fragment_buffers, i)); + } + + atom_array_clear (&pad->fragment_buffers); + atom_moof_free (moof); + qtmux->fragment_sequence++; + force = FALSE; + } + +init: + if (G_UNLIKELY (!pad->traf)) { + GST_LOG_OBJECT (qtmux, "setting up new fragment"); + pad->traf = atom_traf_new (qtmux->context, atom_trak_get_id (pad->trak)); + atom_array_init (&pad->fragment_buffers, 512); + pad->fragment_duration = gst_util_uint64_scale (qtmux->fragment_duration, + atom_trak_get_timescale (pad->trak), 1000); + + if (G_UNLIKELY (qtmux->mfra && !pad->tfra)) { + pad->tfra = atom_tfra_new (qtmux->context, atom_trak_get_id (pad->trak)); + atom_mfra_add_tfra (qtmux->mfra, pad->tfra); + } + } + + /* add buffer and metadata */ + atom_traf_add_samples (pad->traf, delta, size, sync, pts_offset, + pad->sync && sync); + atom_array_append (&pad->fragment_buffers, buf, 256); + pad->fragment_duration -= delta; + + if (pad->tfra) { + guint32 sn = atom_traf_get_sample_num (pad->traf); + + if ((sync && pad->sync) || (sn == 1 && !pad->sync)) + atom_tfra_add_entry (pad->tfra, dts, sn); + } + + if (G_UNLIKELY (force)) + goto flush; + + return ret; +} + +/* sigh, tiny list helpers to re-order stuff */ +static void +gst_qt_mux_push_ts (GstQTMux * qtmux, GstQTPad * pad, GstClockTime ts) +{ + gint i; + + for (i = 0; (i < QTMUX_NO_OF_TS) && (i < pad->ts_n_entries); i++) { + if (ts > pad->ts_entries[i]) + break; + } + memmove (&pad->ts_entries[i + 1], &pad->ts_entries[i], + sizeof (GstClockTime) * (pad->ts_n_entries - i)); + pad->ts_entries[i] = ts; + pad->ts_n_entries++; +} + +static void +check_and_subtract_ts (GstQTMux * qtmux, GstClockTime * ts_a, GstClockTime ts_b) +{ + if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (*ts_a))) { + if (G_LIKELY (*ts_a > ts_b)) { + *ts_a -= ts_b; + } else { + *ts_a = 0; + GST_WARNING_OBJECT (qtmux, "Subtraction would result in negative value, " + "using 0 as result"); + } + } +} + +/* subtract ts from all buffers enqueued on the pad */ +static void +gst_qt_mux_subtract_ts (GstQTMux * qtmux, GstQTPad * pad, GstClockTime ts) +{ + gint i; + + for (i = 0; (i < QTMUX_NO_OF_TS) && (i < pad->ts_n_entries); i++) { + check_and_subtract_ts (qtmux, &pad->ts_entries[i], ts); + } + for (i = 0; i < G_N_ELEMENTS (pad->buf_entries); i++) { + if (pad->buf_entries[i]) { + check_and_subtract_ts (qtmux, &GST_BUFFER_TIMESTAMP (pad->buf_entries[i]), + ts); + check_and_subtract_ts (qtmux, + &GST_BUFFER_OFFSET_END (pad->buf_entries[i]), ts); + } + } +} + +/* takes ownership of @buf */ +static GstBuffer * +gst_qt_mux_get_asc_buffer_ts (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf) +{ + const gint wrap = G_N_ELEMENTS (pad->buf_entries); + GstClockTime ts; + + /* store buffer and ts, latter ordered */ + if (buf) { + pad->buf_entries[pad->buf_tail++] = buf; + pad->buf_tail %= wrap; + gst_qt_mux_push_ts (qtmux, pad, GST_BUFFER_TIMESTAMP (buf)); + } + + if (pad->ts_n_entries && (!buf || pad->ts_n_entries >= QTMUX_NO_OF_TS)) { + ts = pad->ts_entries[--pad->ts_n_entries]; + buf = pad->buf_entries[pad->buf_head]; + pad->buf_entries[pad->buf_head++] = NULL; + pad->buf_head %= wrap; + buf = gst_buffer_make_metadata_writable (buf); + /* track original ts (= pts ?) for later */ + GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_TIMESTAMP (buf); + GST_BUFFER_TIMESTAMP (buf) = ts; + GST_DEBUG_OBJECT (qtmux, "next buffer uses reordered ts %" GST_TIME_FORMAT, + GST_TIME_ARGS (ts)); + } else { + buf = NULL; + } + + return buf; +} + +/* + * Here we push the buffer and update the tables in the track atoms + */ +static GstFlowReturn +gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf) +{ + GstBuffer *last_buf = NULL; + GstClockTime duration; + guint nsamples, sample_size; + guint64 chunk_offset; + gint64 last_dts, scaled_duration; + gint64 pts_offset = 0; + gboolean sync = FALSE, do_pts = FALSE; + gboolean drain = (buf == NULL); + GstFlowReturn ret = GST_FLOW_OK; + + if (!pad->fourcc) + goto not_negotiated; + + /* if this pad has a prepare function, call it */ + if (pad->prepare_buf_func != NULL) { + buf = pad->prepare_buf_func (pad, buf, qtmux); + } + + if (G_LIKELY (buf != NULL && GST_CLOCK_TIME_IS_VALID (pad->first_ts) && + pad->first_ts != 0)) { + buf = gst_buffer_make_metadata_writable (buf); + check_and_subtract_ts (qtmux, &GST_BUFFER_TIMESTAMP (buf), pad->first_ts); + } + /* when we obtain the first_ts we subtract from all stored buffers we have, + * after that we can subtract on input */ + +again: + last_buf = pad->last_buf; + if (qtmux->dts_method == DTS_METHOD_REORDER) { + buf = gst_qt_mux_get_asc_buffer_ts (qtmux, pad, buf); + if (!buf && !last_buf) { + GST_DEBUG_OBJECT (qtmux, "no reordered buffer"); + return GST_FLOW_OK; + } + } + + if (last_buf == NULL) { +#ifndef GST_DISABLE_GST_DEBUG + if (buf == NULL) { + GST_DEBUG_OBJECT (qtmux, "Pad %s has no previous buffer stored and " + "received NULL buffer, doing nothing", + GST_PAD_NAME (pad->collect.pad)); + } else { + GST_LOG_OBJECT (qtmux, + "Pad %s has no previous buffer stored, storing now", + GST_PAD_NAME (pad->collect.pad)); + } +#endif + pad->last_buf = buf; + goto exit; + } else + gst_buffer_ref (last_buf); + + /* nasty heuristic mess to guestimate dealing with DTS/PTS, + * while also trying to stay close to input ts to preserve sync, + * so in DTS_METHOD_DD: + * - prefer using input ts where possible + * - if those detected out-of-order (*), mark as out-of-order + * - if in out-of-order, then + * - if duration available, use that as delta + * Also mind to preserve sync between streams, and adding + * durations might drift, so try to resync when we expect + * input ts == (sum of durations), which is at some keyframe input frame. + * - if no duration available, we are actually in serious trouble and need + * to hack around that, so we fail. + * To remedy failure, alternatively, in DTS_METHOD_REORDER: + * - collect some buffers and re-order timestamp, + * then process the oldest buffer with smallest timestamps. + * This should typically compensate for some codec's handywork with ts. + * ... but in case this makes ts end up where not expected, in DTS_METHOD_ASC: + * - keep each ts with its buffer and still keep a list of most recent X ts, + * use the (ascending) minimum of those as DTS (and the difference as ts delta), + * and use this DTS as a basis to obtain a (positive) CTS offset. + * This should yield exact PTS == buffer ts, but it seems not all players + * out there are aware of ctts pts ... + * + * 0.11 Phew, can we (pretty) please please sort out DTS/PTS on buffers ... + */ + if (G_LIKELY (buf) && !pad->is_out_of_order) { + if (G_LIKELY (GST_BUFFER_TIMESTAMP_IS_VALID (last_buf) && + GST_BUFFER_TIMESTAMP_IS_VALID (buf))) { + if ((GST_BUFFER_TIMESTAMP (buf) < GST_BUFFER_TIMESTAMP (last_buf))) { + GST_DEBUG_OBJECT (qtmux, "detected out-of-order input"); + pad->is_out_of_order = TRUE; + } + } else { + /* this is pretty bad */ + GST_WARNING_OBJECT (qtmux, "missing input timestamp"); + /* fall back to durations */ + pad->is_out_of_order = TRUE; + } + } + + /* would have to be some unusual input, but not impossible */ + if (G_UNLIKELY (qtmux->dts_method == DTS_METHOD_REORDER && + pad->is_out_of_order)) { + goto no_order; + } + + /* if this is the first buffer, store the timestamp */ + if (G_UNLIKELY (pad->first_ts == GST_CLOCK_TIME_NONE) && last_buf) { + if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (last_buf))) { + pad->first_ts = GST_BUFFER_TIMESTAMP (last_buf); + } else { + GST_DEBUG_OBJECT (qtmux, "First buffer for pad %s has no timestamp, " + "using 0 as first timestamp", GST_PAD_NAME (pad->collect.pad)); + pad->first_ts = 0; + } + GST_DEBUG_OBJECT (qtmux, "Stored first timestamp for pad %s %" + GST_TIME_FORMAT, GST_PAD_NAME (pad->collect.pad), + GST_TIME_ARGS (pad->first_ts)); + + gst_qt_mux_subtract_ts (qtmux, pad, pad->first_ts); + + GST_BUFFER_TIMESTAMP (last_buf) = 0; + check_and_subtract_ts (qtmux, &GST_BUFFER_OFFSET_END (last_buf), + pad->first_ts); + if (buf) { + check_and_subtract_ts (qtmux, &GST_BUFFER_TIMESTAMP (buf), pad->first_ts); + check_and_subtract_ts (qtmux, &GST_BUFFER_OFFSET_END (buf), + pad->first_ts); + } + } + + /* fall back to duration if last buffer or + * out-of-order (determined previously), otherwise use input ts */ + if (buf == NULL || + (pad->is_out_of_order && qtmux->dts_method == DTS_METHOD_DD)) { + if (!GST_BUFFER_DURATION_IS_VALID (last_buf)) { + /* be forgiving for some possibly last upstream flushed buffer */ + if (buf) + goto no_time; + GST_WARNING_OBJECT (qtmux, "no duration for last buffer"); + /* iso spec recommends some small value, try 0 */ + duration = 0; + } else { + duration = GST_BUFFER_DURATION (last_buf); + /* avoid drift in sum timestamps, + * so use input timestamp for suitable keyframe */ + if (buf && !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT) && + GST_BUFFER_TIMESTAMP (buf) >= pad->last_dts) { + GST_DEBUG_OBJECT (qtmux, "resyncing out-of-order input to ts; " + "replacing %" GST_TIME_FORMAT " by %" GST_TIME_FORMAT, + GST_TIME_ARGS (pad->last_dts + duration), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + duration = GST_BUFFER_TIMESTAMP (buf) - pad->last_dts; + } + } + } else if (qtmux->dts_method != DTS_METHOD_ASC) { + duration = GST_BUFFER_TIMESTAMP (buf) - GST_BUFFER_TIMESTAMP (last_buf); + } else { + GstClockTime ts; + + g_assert (qtmux->dts_method == DTS_METHOD_ASC); + if (!qtmux->guess_pts) + goto need_pts; + + /* add timestamp to queue; keeps in descending order */ + gst_qt_mux_push_ts (qtmux, pad, GST_BUFFER_TIMESTAMP (last_buf)); + /* chuck out smallest/last one if we have enough */ + if (G_LIKELY (pad->ts_n_entries > QTMUX_NO_OF_TS)) + pad->ts_n_entries--; + /* peek the now smallest timestamp */ + ts = pad->ts_entries[pad->ts_n_entries - 1]; + /* these tails are expected to be (strictly) ascending with + * large enough history */ + GST_DEBUG_OBJECT (qtmux, "ASC method; base timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (ts)); + if (ts >= pad->last_dts) { + duration = ts - pad->last_dts; + } else { + /* fallback to previous value, negative ct offset might handle */ + GST_WARNING_OBJECT (qtmux, "unexpected decrease in timestamp"); + duration = 0; + } + /* arrange for small non-zero duration/delta << expected frame time */ + ts = gst_util_uint64_scale (10, GST_SECOND, + atom_trak_get_timescale (pad->trak)); + duration = MAX (duration, ts); + } + + /* for computing the avg bitrate */ + if (G_LIKELY (last_buf)) { + pad->total_bytes += GST_BUFFER_SIZE (last_buf); + pad->total_duration += duration; + } + + gst_buffer_replace (&pad->last_buf, buf); + + last_dts = gst_util_uint64_scale_round (pad->last_dts, + atom_trak_get_timescale (pad->trak), GST_SECOND); + + /* fragments only deal with 1 buffer == 1 chunk (== 1 sample) */ + if (pad->sample_size && !qtmux->fragment_sequence) { + /* Constant size packets: usually raw audio (with many samples per + buffer (= chunk)), but can also be fixed-packet-size codecs like ADPCM + */ + sample_size = pad->sample_size; + if (GST_BUFFER_SIZE (last_buf) % sample_size != 0) + goto fragmented_sample; + /* note: qt raw audio storage warps it implicitly into a timewise + * perfect stream, discarding buffer times */ + if (GST_BUFFER_DURATION (last_buf) != GST_CLOCK_TIME_NONE) { + nsamples = gst_util_uint64_scale_round (GST_BUFFER_DURATION (last_buf), + atom_trak_get_timescale (pad->trak), GST_SECOND); + } else { + nsamples = GST_BUFFER_SIZE (last_buf) / sample_size; + } + duration = GST_BUFFER_DURATION (last_buf) / nsamples; + + /* timescale = samplerate */ + scaled_duration = 1; + pad->last_dts += duration * nsamples; + } else { + nsamples = 1; + sample_size = GST_BUFFER_SIZE (last_buf); + if (pad->have_dts) { + gint64 scaled_dts; + pad->last_dts = GST_BUFFER_OFFSET_END (last_buf); + if ((gint64) (pad->last_dts) < 0) { + scaled_dts = -gst_util_uint64_scale_round (-pad->last_dts, + atom_trak_get_timescale (pad->trak), GST_SECOND); + } else { + scaled_dts = gst_util_uint64_scale_round (pad->last_dts, + atom_trak_get_timescale (pad->trak), GST_SECOND); + } + scaled_duration = scaled_dts - last_dts; + last_dts = scaled_dts; + } else { + /* first convert intended timestamp (in GstClockTime resolution) to + * trak timescale, then derive delta; + * this ensures sums of (scale)delta add up to converted timestamp, + * which only deviates at most 1/scale from timestamp itself */ + scaled_duration = gst_util_uint64_scale_round (pad->last_dts + duration, + atom_trak_get_timescale (pad->trak), GST_SECOND) - last_dts; + pad->last_dts += duration; + } + } + chunk_offset = qtmux->mdat_size; + + GST_LOG_OBJECT (qtmux, + "Pad (%s) dts updated to %" GST_TIME_FORMAT, + GST_PAD_NAME (pad->collect.pad), GST_TIME_ARGS (pad->last_dts)); + GST_LOG_OBJECT (qtmux, + "Adding %d samples to track, duration: %" G_GUINT64_FORMAT + " size: %" G_GUINT32_FORMAT " chunk offset: %" G_GUINT64_FORMAT, + nsamples, scaled_duration, sample_size, chunk_offset); + + /* might be a sync sample */ + if (pad->sync && + !GST_BUFFER_FLAG_IS_SET (last_buf, GST_BUFFER_FLAG_DELTA_UNIT)) { + GST_LOG_OBJECT (qtmux, "Adding new sync sample entry for track of pad %s", + GST_PAD_NAME (pad->collect.pad)); + sync = TRUE; + } + + /* optionally calculate ctts entry values + * (if composition-time expected different from decoding-time) */ + /* really not recommended: + * - decoder typically takes care of dts/pts issues + * - in case of out-of-order, dts may only be determined as above + * (e.g. sum of duration), which may be totally different from + * buffer timestamps in case of multiple segment, non-perfect streams + * (and just perhaps maybe with some luck segment_to_running_time + * or segment_to_media_time might get near to it) */ + if ((pad->have_dts || qtmux->guess_pts)) { + guint64 pts; + + pts = qtmux->dts_method == DTS_METHOD_REORDER ? + GST_BUFFER_OFFSET_END (last_buf) : GST_BUFFER_TIMESTAMP (last_buf); + pts = gst_util_uint64_scale_round (pts, + atom_trak_get_timescale (pad->trak), GST_SECOND); + pts_offset = (gint64) (pts - last_dts); + do_pts = TRUE; + GST_LOG_OBJECT (qtmux, "Adding ctts entry for pad %s: %" G_GINT64_FORMAT, + GST_PAD_NAME (pad->collect.pad), pts_offset); + } + + /* + * Each buffer starts a new chunk, so we can assume the buffer + * duration is the chunk duration + */ + if (GST_CLOCK_TIME_IS_VALID (duration) && (duration > qtmux->longest_chunk || + !GST_CLOCK_TIME_IS_VALID (qtmux->longest_chunk))) { + GST_DEBUG_OBJECT (qtmux, "New longest chunk found: %" GST_TIME_FORMAT + ", pad %s", GST_TIME_ARGS (duration), GST_PAD_NAME (pad->collect.pad)); + qtmux->longest_chunk = duration; + } + + /* now we go and register this buffer/sample all over */ + /* note that a new chunk is started each time (not fancy but works) */ + if (qtmux->moov_recov_file) { + if (!atoms_recov_write_trak_samples (qtmux->moov_recov_file, pad->trak, + nsamples, (gint32) scaled_duration, sample_size, chunk_offset, sync, + do_pts, pts_offset)) { + GST_WARNING_OBJECT (qtmux, "Failed to write sample information to " + "recovery file, disabling recovery"); + fclose (qtmux->moov_recov_file); + qtmux->moov_recov_file = NULL; + } + } + + if (buf) + gst_buffer_unref (buf); + + if (qtmux->fragment_sequence) { + /* ensure that always sync samples are marked as such */ + ret = gst_qt_mux_pad_fragment_add_buffer (qtmux, pad, last_buf, + buf == NULL, nsamples, last_dts, (gint32) scaled_duration, sample_size, + !pad->sync || sync, pts_offset); + } else { + atom_trak_add_samples (pad->trak, nsamples, (gint32) scaled_duration, + sample_size, chunk_offset, sync, pts_offset); + ret = gst_qt_mux_send_buffer (qtmux, last_buf, &qtmux->mdat_size, TRUE); + } + +exit: + if (G_UNLIKELY (drain && qtmux->dts_method == DTS_METHOD_REORDER && + ret == GST_FLOW_OK)) { + buf = NULL; + goto again; + } + + return ret; + + /* ERRORS */ +bail: + { + if (buf) + gst_buffer_unref (buf); + gst_buffer_unref (last_buf); + return GST_FLOW_ERROR; + } +no_time: + { + GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), + ("Received buffer without timestamp/duration. " + "Using e.g. dts-method=reorder might help.")); + goto bail; + } +no_order: + { + GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), + ("DTS method failed to re-order timestamps.")); + goto bail; + } +need_pts: + { + GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), + ("Selected DTS method also needs PTS enabled.")); + goto bail; + } +fragmented_sample: + { + GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), + ("Audio buffer contains fragmented sample.")); + goto bail; + } +not_negotiated: + { + GST_ELEMENT_ERROR (qtmux, CORE, NEGOTIATION, (NULL), + ("format wasn't negotiated before buffer flow on pad %s", + GST_PAD_NAME (pad->collect.pad))); + if (buf) + gst_buffer_unref (buf); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static GstFlowReturn +gst_qt_mux_collected (GstCollectPads * pads, gpointer user_data) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstQTMux *qtmux = GST_QT_MUX_CAST (user_data); + GSList *walk; + GstQTPad *best_pad = NULL; + GstClockTime time, best_time = GST_CLOCK_TIME_NONE; + GstBuffer *buf; + + if (G_UNLIKELY (qtmux->state == GST_QT_MUX_STATE_STARTED)) { + if ((ret = gst_qt_mux_start_file (qtmux)) != GST_FLOW_OK) + return ret; + else + qtmux->state = GST_QT_MUX_STATE_DATA; + } + + if (G_UNLIKELY (qtmux->state == GST_QT_MUX_STATE_EOS)) + return GST_FLOW_UNEXPECTED; + + /* select the best buffer */ + walk = qtmux->collect->data; + while (walk) { + GstQTPad *pad; + GstCollectData *data; + + data = (GstCollectData *) walk->data; + pad = (GstQTPad *) data; + + walk = g_slist_next (walk); + + buf = gst_collect_pads_peek (pads, data); + if (buf == NULL) { + GST_LOG_OBJECT (qtmux, "Pad %s has no buffers", + GST_PAD_NAME (pad->collect.pad)); + continue; + } + time = GST_BUFFER_TIMESTAMP (buf); + gst_buffer_unref (buf); + + /* invalid should pass */ + if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) { + time = + gst_segment_to_running_time (&data->segment, GST_FORMAT_TIME, time); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { + GST_DEBUG_OBJECT (qtmux, "clipping buffer on pad %s outside segment", + GST_PAD_NAME (data->pad)); + buf = gst_collect_pads_pop (pads, data); + gst_buffer_unref (buf); + return GST_FLOW_OK; + } + } + + if (best_pad == NULL || !GST_CLOCK_TIME_IS_VALID (time) || + (GST_CLOCK_TIME_IS_VALID (best_time) && time < best_time)) { + best_pad = pad; + best_time = time; + } + } + + if (best_pad != NULL) { + GST_LOG_OBJECT (qtmux, "selected pad %s with time %" GST_TIME_FORMAT, + GST_PAD_NAME (best_pad->collect.pad), GST_TIME_ARGS (best_time)); + buf = gst_collect_pads_pop (pads, &best_pad->collect); + buf = gst_buffer_make_metadata_writable (buf); + GST_BUFFER_TIMESTAMP (buf) = best_time; + ret = gst_qt_mux_add_buffer (qtmux, best_pad, buf); + } else { + ret = gst_qt_mux_stop_file (qtmux); + if (ret == GST_FLOW_OK) { + GST_DEBUG_OBJECT (qtmux, "Pushing eos"); + gst_pad_push_event (qtmux->srcpad, gst_event_new_eos ()); + ret = GST_FLOW_UNEXPECTED; + } else { + GST_WARNING_OBJECT (qtmux, "Failed to stop file: %s", + gst_flow_get_name (ret)); + } + qtmux->state = GST_QT_MUX_STATE_EOS; + } + + return ret; +} + +static gboolean +check_field (GQuark field_id, const GValue * value, gpointer user_data) +{ + GstStructure *structure = (GstStructure *) user_data; + const GValue *other = gst_structure_id_get_value (structure, field_id); + if (other == NULL) + return FALSE; + return gst_value_compare (value, other) == GST_VALUE_EQUAL; +} + +static gboolean +gst_qtmux_caps_is_subset_full (GstQTMux * qtmux, GstCaps * subset, + GstCaps * superset) +{ + GstStructure *sub_s = gst_caps_get_structure (subset, 0); + GstStructure *sup_s = gst_caps_get_structure (superset, 0); + + return gst_structure_foreach (sub_s, check_field, sup_s); +} + +static gboolean +gst_qt_mux_audio_sink_set_caps (GstPad * pad, GstCaps * caps) +{ + GstQTMux *qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad)); + GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); + GstQTPad *qtpad = NULL; + GstStructure *structure; + const gchar *mimetype; + gint rate, channels; + const GValue *value = NULL; + const GstBuffer *codec_data = NULL; + GstQTMuxFormat format; + AudioSampleEntry entry = { 0, }; + AtomInfo *ext_atom = NULL; + gint constant_size = 0; + const gchar *stream_format; + + /* find stream data */ + qtpad = (GstQTPad *) gst_pad_get_element_private (pad); + g_assert (qtpad); + + qtpad->prepare_buf_func = NULL; + + /* does not go well to renegotiate stream mid-way, unless + * the old caps are a subset of the new one (this means upstream + * added more info to the caps, as both should be 'fixed' caps) */ + if (qtpad->fourcc) { + GstCaps *current_caps = NULL; + gboolean is_subset; + g_object_get (pad, "caps", ¤t_caps, NULL); + g_assert (caps != NULL); + + is_subset = gst_qtmux_caps_is_subset_full (qtmux, current_caps, caps); + gst_caps_unref (current_caps); + if (!is_subset) { + goto refuse_renegotiation; + } + GST_DEBUG_OBJECT (qtmux, + "pad %s accepted renegotiation to %" GST_PTR_FORMAT " from %" + GST_PTR_FORMAT, GST_PAD_NAME (pad), caps, GST_PAD_CAPS (pad)); + } + + GST_DEBUG_OBJECT (qtmux, "%s:%s, caps=%" GST_PTR_FORMAT, + GST_DEBUG_PAD_NAME (pad), caps); + + format = qtmux_klass->format; + structure = gst_caps_get_structure (caps, 0); + mimetype = gst_structure_get_name (structure); + + /* common info */ + if (!gst_structure_get_int (structure, "channels", &channels) || + !gst_structure_get_int (structure, "rate", &rate)) { + goto refuse_caps; + } + + /* optional */ + value = gst_structure_get_value (structure, "codec_data"); + if (value != NULL) + codec_data = gst_value_get_buffer (value); + + qtpad->is_out_of_order = FALSE; + qtpad->have_dts = FALSE; + + /* set common properties */ + entry.sample_rate = rate; + entry.channels = channels; + /* default */ + entry.sample_size = 16; + /* this is the typical compressed case */ + if (format == GST_QT_MUX_FORMAT_QT) { + entry.version = 1; + entry.compression_id = -2; + } + + /* now map onto a fourcc, and some extra properties */ + if (strcmp (mimetype, "audio/mpeg") == 0) { + gint mpegversion = 0; + gint layer = -1; + + gst_structure_get_int (structure, "mpegversion", &mpegversion); + switch (mpegversion) { + case 1: + gst_structure_get_int (structure, "layer", &layer); + switch (layer) { + case 3: + /* mp3 */ + /* note: QuickTime player does not like mp3 either way in iso/mp4 */ + if (format == GST_QT_MUX_FORMAT_QT) + entry.fourcc = FOURCC__mp3; + else { + entry.fourcc = FOURCC_mp4a; + ext_atom = + build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG1_P3, + ESDS_STREAM_TYPE_AUDIO, codec_data, qtpad->avg_bitrate, + qtpad->max_bitrate); + } + entry.samples_per_packet = 1152; + entry.bytes_per_sample = 2; + break; + } + break; + case 4: + + /* check stream-format */ + stream_format = gst_structure_get_string (structure, "stream-format"); + if (stream_format) { + if (strcmp (stream_format, "raw") != 0) { + GST_WARNING_OBJECT (qtmux, "Unsupported AAC stream-format %s, " + "please use 'raw'", stream_format); + goto refuse_caps; + } + } else { + GST_WARNING_OBJECT (qtmux, "No stream-format present in caps, " + "assuming 'raw'"); + } + + if (!codec_data || GST_BUFFER_SIZE (codec_data) < 2) + GST_WARNING_OBJECT (qtmux, "no (valid) codec_data for AAC audio"); + else { + guint8 profile = GST_READ_UINT8 (GST_BUFFER_DATA (codec_data)); + + /* warn if not Low Complexity profile */ + profile >>= 3; + if (profile != 2) + GST_WARNING_OBJECT (qtmux, + "non-LC AAC may not run well on (Apple) QuickTime/iTunes"); + } + + /* AAC */ + entry.fourcc = FOURCC_mp4a; + + if (format == GST_QT_MUX_FORMAT_QT) + ext_atom = build_mov_aac_extension (qtpad->trak, codec_data, + qtpad->avg_bitrate, qtpad->max_bitrate); + else + ext_atom = + build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG4_P3, + ESDS_STREAM_TYPE_AUDIO, codec_data, qtpad->avg_bitrate, + qtpad->max_bitrate); + break; + default: + break; + } + } else if (strcmp (mimetype, "audio/AMR") == 0) { + entry.fourcc = FOURCC_samr; + entry.sample_size = 16; + entry.samples_per_packet = 160; + entry.bytes_per_sample = 2; + ext_atom = build_amr_extension (); + } else if (strcmp (mimetype, "audio/AMR-WB") == 0) { + entry.fourcc = FOURCC_sawb; + entry.sample_size = 16; + entry.samples_per_packet = 320; + entry.bytes_per_sample = 2; + ext_atom = build_amr_extension (); + } else if (strcmp (mimetype, "audio/x-raw-int") == 0) { + gint width; + gint depth; + gint endianness; + gboolean sign; + + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "depth", &depth) || + !gst_structure_get_boolean (structure, "signed", &sign)) { + GST_DEBUG_OBJECT (qtmux, "broken caps, width/depth/signed field missing"); + goto refuse_caps; + } + + if (depth <= 8) { + endianness = G_BYTE_ORDER; + } else if (!gst_structure_get_int (structure, "endianness", &endianness)) { + GST_DEBUG_OBJECT (qtmux, "broken caps, endianness field missing"); + goto refuse_caps; + } + + /* spec has no place for a distinction in these */ + if (width != depth) { + GST_DEBUG_OBJECT (qtmux, "width must be same as depth!"); + goto refuse_caps; + } + + if (sign) { + if (endianness == G_LITTLE_ENDIAN) + entry.fourcc = FOURCC_sowt; + else if (endianness == G_BIG_ENDIAN) + entry.fourcc = FOURCC_twos; + /* maximum backward compatibility; only new version for > 16 bit */ + if (depth <= 16) + entry.version = 0; + /* not compressed in any case */ + entry.compression_id = 0; + /* QT spec says: max at 16 bit even if sample size were actually larger, + * however, most players (e.g. QuickTime!) seem to disagree, so ... */ + entry.sample_size = depth; + entry.bytes_per_sample = depth / 8; + entry.samples_per_packet = 1; + entry.bytes_per_packet = depth / 8; + entry.bytes_per_frame = entry.bytes_per_packet * channels; + } else { + if (width == 8 && depth == 8) { + /* fall back to old 8-bit version */ + entry.fourcc = FOURCC_raw_; + entry.version = 0; + entry.compression_id = 0; + entry.sample_size = 8; + } else { + GST_DEBUG_OBJECT (qtmux, "non 8-bit PCM must be signed"); + goto refuse_caps; + } + } + constant_size = (depth / 8) * channels; + } else if (strcmp (mimetype, "audio/x-alaw") == 0) { + entry.fourcc = FOURCC_alaw; + entry.samples_per_packet = 1023; + entry.bytes_per_sample = 2; + } else if (strcmp (mimetype, "audio/x-mulaw") == 0) { + entry.fourcc = FOURCC_ulaw; + entry.samples_per_packet = 1023; + entry.bytes_per_sample = 2; + } else if (strcmp (mimetype, "audio/x-adpcm") == 0) { + gint blocksize; + if (!gst_structure_get_int (structure, "block_align", &blocksize)) { + GST_DEBUG_OBJECT (qtmux, "broken caps, block_align missing"); + goto refuse_caps; + } + /* Currently only supports WAV-style IMA ADPCM, for which the codec id is + 0x11 */ + entry.fourcc = MS_WAVE_FOURCC (0x11); + /* 4 byte header per channel (including one sample). 2 samples per byte + remaining. Simplifying gives the following (samples per block per + channel) */ + entry.samples_per_packet = 2 * blocksize / channels - 7; + entry.bytes_per_sample = 2; + + entry.bytes_per_frame = blocksize; + entry.bytes_per_packet = blocksize / channels; + /* ADPCM has constant size packets */ + constant_size = 1; + /* TODO: I don't really understand why this helps, but it does! Constant + * size and compression_id of -2 seem to be incompatible, and other files + * in the wild use this too. */ + entry.compression_id = -1; + + ext_atom = build_ima_adpcm_extension (channels, rate, blocksize); + } else if (strcmp (mimetype, "audio/x-alac") == 0) { + GstBuffer *codec_config; + gint len; + + entry.fourcc = FOURCC_alac; + /* let's check if codec data already comes with 'alac' atom prefix */ + if (!codec_data || (len = GST_BUFFER_SIZE (codec_data)) < 28) { + GST_DEBUG_OBJECT (qtmux, "broken caps, codec data missing"); + goto refuse_caps; + } + if (GST_READ_UINT32_LE (GST_BUFFER_DATA (codec_data) + 4) == FOURCC_alac) { + len -= 8; + codec_config = gst_buffer_create_sub ((GstBuffer *) codec_data, 8, len); + } else { + codec_config = gst_buffer_ref ((GstBuffer *) codec_data); + } + if (len != 28) { + /* does not look good, but perhaps some trailing unneeded stuff */ + GST_WARNING_OBJECT (qtmux, "unexpected codec-data size, possibly broken"); + } + if (format == GST_QT_MUX_FORMAT_QT) + ext_atom = build_mov_alac_extension (qtpad->trak, codec_config); + else + ext_atom = build_codec_data_extension (FOURCC_alac, codec_config); + /* set some more info */ + entry.bytes_per_sample = 2; + entry.samples_per_packet = + GST_READ_UINT32_BE (GST_BUFFER_DATA (codec_config) + 4); + gst_buffer_unref (codec_config); + } + + if (!entry.fourcc) + goto refuse_caps; + + /* ok, set the pad info accordingly */ + qtpad->fourcc = entry.fourcc; + qtpad->sample_size = constant_size; + atom_trak_set_audio_type (qtpad->trak, qtmux->context, &entry, + qtmux->trak_timescale ? qtmux->trak_timescale : entry.sample_rate, + ext_atom, constant_size); + + gst_object_unref (qtmux); + return TRUE; + + /* ERRORS */ +refuse_caps: + { + GST_WARNING_OBJECT (qtmux, "pad %s refused caps %" GST_PTR_FORMAT, + GST_PAD_NAME (pad), caps); + gst_object_unref (qtmux); + return FALSE; + } +refuse_renegotiation: + { + GST_WARNING_OBJECT (qtmux, + "pad %s refused renegotiation to %" GST_PTR_FORMAT, + GST_PAD_NAME (pad), caps); + gst_object_unref (qtmux); + return FALSE; + } +} + +/* scale rate up or down by factor of 10 to fit into [1000,10000] interval */ +static guint32 +adjust_rate (guint64 rate) +{ + if (rate == 0) + return 10000; + + while (rate >= 10000) + rate /= 10; + + while (rate < 1000) + rate *= 10; + + return (guint32) rate; +} + +static gboolean +gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps) +{ + GstQTMux *qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad)); + GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); + GstQTPad *qtpad = NULL; + GstStructure *structure; + const gchar *mimetype; + gint width, height, depth = -1; + gint framerate_num, framerate_den; + guint32 rate; + const GValue *value = NULL; + const GstBuffer *codec_data = NULL; + VisualSampleEntry entry = { 0, }; + GstQTMuxFormat format; + AtomInfo *ext_atom = NULL; + GList *ext_atom_list = NULL; + gboolean sync = FALSE; + int par_num, par_den; + + /* find stream data */ + qtpad = (GstQTPad *) gst_pad_get_element_private (pad); + g_assert (qtpad); + + qtpad->prepare_buf_func = NULL; + + /* does not go well to renegotiate stream mid-way, unless + * the old caps are a subset of the new one (this means upstream + * added more info to the caps, as both should be 'fixed' caps) */ + if (qtpad->fourcc) { + GstCaps *current_caps = NULL; + gboolean is_subset; + g_object_get (pad, "caps", ¤t_caps, NULL); + g_assert (caps != NULL); + + is_subset = gst_qtmux_caps_is_subset_full (qtmux, current_caps, caps); + gst_caps_unref (current_caps); + if (!is_subset) { + goto refuse_renegotiation; + } + GST_DEBUG_OBJECT (qtmux, + "pad %s accepted renegotiation to %" GST_PTR_FORMAT " from %" + GST_PTR_FORMAT, GST_PAD_NAME (pad), caps, GST_PAD_CAPS (pad)); + } + + GST_DEBUG_OBJECT (qtmux, "%s:%s, caps=%" GST_PTR_FORMAT, + GST_DEBUG_PAD_NAME (pad), caps); + + format = qtmux_klass->format; + structure = gst_caps_get_structure (caps, 0); + mimetype = gst_structure_get_name (structure); + + /* required parts */ + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) + goto refuse_caps; + + /* optional */ + depth = -1; + /* works as a default timebase */ + framerate_num = 10000; + framerate_den = 1; + gst_structure_get_fraction (structure, "framerate", &framerate_num, + &framerate_den); + gst_structure_get_int (structure, "depth", &depth); + value = gst_structure_get_value (structure, "codec_data"); + if (value != NULL) + codec_data = gst_value_get_buffer (value); + + par_num = 1; + par_den = 1; + gst_structure_get_fraction (structure, "pixel-aspect-ratio", &par_num, + &par_den); + + qtpad->is_out_of_order = FALSE; + + /* bring frame numerator into a range that ensures both reasonable resolution + * as well as a fair duration */ + rate = qtmux->trak_timescale ? + qtmux->trak_timescale : adjust_rate (framerate_num); + GST_DEBUG_OBJECT (qtmux, "Rate of video track selected: %" G_GUINT32_FORMAT, + rate); + + /* set common properties */ + entry.width = width; + entry.height = height; + entry.par_n = par_num; + entry.par_d = par_den; + /* should be OK according to qt and iso spec, override if really needed */ + entry.color_table_id = -1; + entry.frame_count = 1; + entry.depth = 24; + + /* sync entries by default */ + sync = TRUE; + + /* now map onto a fourcc, and some extra properties */ + if (strcmp (mimetype, "video/x-raw-rgb") == 0) { + gint bpp; + + entry.fourcc = FOURCC_raw_; + gst_structure_get_int (structure, "bpp", &bpp); + entry.depth = bpp; + sync = FALSE; + } else if (strcmp (mimetype, "video/x-raw-yuv") == 0) { + guint32 format = 0; + + sync = FALSE; + gst_structure_get_fourcc (structure, "format", &format); + switch (format) { + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + if (depth == -1) + depth = 24; + entry.fourcc = FOURCC_2vuy; + entry.depth = depth; + break; + } + } else if (strcmp (mimetype, "video/x-h263") == 0) { + ext_atom = NULL; + if (format == GST_QT_MUX_FORMAT_QT) + entry.fourcc = FOURCC_h263; + else + entry.fourcc = FOURCC_s263; + ext_atom = build_h263_extension (); + if (ext_atom != NULL) + ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); + } else if (strcmp (mimetype, "video/x-divx") == 0 || + strcmp (mimetype, "video/mpeg") == 0) { + gint version = 0; + + if (strcmp (mimetype, "video/x-divx") == 0) { + gst_structure_get_int (structure, "divxversion", &version); + version = version == 5 ? 1 : 0; + } else { + gst_structure_get_int (structure, "mpegversion", &version); + version = version == 4 ? 1 : 0; + } + if (version) { + entry.fourcc = FOURCC_mp4v; + ext_atom = + build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG4_P2, + ESDS_STREAM_TYPE_VISUAL, codec_data, qtpad->avg_bitrate, + qtpad->max_bitrate); + if (ext_atom != NULL) + ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); + if (!codec_data) + GST_WARNING_OBJECT (qtmux, "no codec_data for MPEG4 video; " + "output might not play in Apple QuickTime (try global-headers?)"); + } + } else if (strcmp (mimetype, "video/x-h264") == 0) { + /* check if we accept these caps */ + if (gst_structure_has_field (structure, "stream-format")) { + const gchar *format; + const gchar *alignment; + + format = gst_structure_get_string (structure, "stream-format"); + alignment = gst_structure_get_string (structure, "alignment"); + + if (strcmp (format, "avc") != 0 || alignment == NULL || + strcmp (alignment, "au") != 0) { + GST_WARNING_OBJECT (qtmux, "Rejecting h264 caps, qtmux only accepts " + "avc format with AU aligned samples"); + goto refuse_caps; + } + } else { + GST_WARNING_OBJECT (qtmux, "no stream-format field in h264 caps"); + goto refuse_caps; + } + + if (!codec_data) { + GST_WARNING_OBJECT (qtmux, "no codec_data in h264 caps"); + goto refuse_caps; + } + + entry.fourcc = FOURCC_avc1; + if (qtpad->avg_bitrate == 0) { + gint avg_bitrate = 0; + gst_structure_get_int (structure, "bitrate", &avg_bitrate); + qtpad->avg_bitrate = avg_bitrate; + } + ext_atom = build_btrt_extension (0, qtpad->avg_bitrate, qtpad->max_bitrate); + if (ext_atom != NULL) + ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); + ext_atom = build_codec_data_extension (FOURCC_avcC, codec_data); + if (ext_atom != NULL) + ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); + } else if (strcmp (mimetype, "video/x-svq") == 0) { + gint version = 0; + const GstBuffer *seqh = NULL; + const GValue *seqh_value; + gdouble gamma = 0; + + gst_structure_get_int (structure, "svqversion", &version); + if (version == 3) { + entry.fourcc = FOURCC_SVQ3; + entry.version = 3; + entry.depth = 32; + + seqh_value = gst_structure_get_value (structure, "seqh"); + if (seqh_value) { + seqh = gst_value_get_buffer (seqh_value); + ext_atom = build_SMI_atom (seqh); + if (ext_atom) + ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); + } + + /* we need to add the gamma anyway because quicktime might crash + * when it doesn't find it */ + if (!gst_structure_get_double (structure, "applied-gamma", &gamma)) { + /* it seems that using 0 here makes it ignored */ + gamma = 0.0; + } + ext_atom = build_gama_atom (gamma); + if (ext_atom) + ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); + } else { + GST_WARNING_OBJECT (qtmux, "SVQ version %d not supported. Please file " + "a bug at http://bugzilla.gnome.org", version); + } + } else if (strcmp (mimetype, "video/x-dv") == 0) { + gint version = 0; + gboolean pal = TRUE; + + sync = FALSE; + if (framerate_num != 25 || framerate_den != 1) + pal = FALSE; + gst_structure_get_int (structure, "dvversion", &version); + /* fall back to typical one */ + if (!version) + version = 25; + switch (version) { + case 25: + if (pal) + entry.fourcc = GST_MAKE_FOURCC ('d', 'v', 'c', 'p'); + else + entry.fourcc = GST_MAKE_FOURCC ('d', 'v', 'c', ' '); + break; + case 50: + if (pal) + entry.fourcc = GST_MAKE_FOURCC ('d', 'v', '5', 'p'); + else + entry.fourcc = GST_MAKE_FOURCC ('d', 'v', '5', 'n'); + break; + default: + GST_WARNING_OBJECT (qtmux, "unrecognized dv version"); + break; + } + } else if (strcmp (mimetype, "image/jpeg") == 0) { + entry.fourcc = FOURCC_jpeg; + sync = FALSE; + } else if (strcmp (mimetype, "image/x-j2c") == 0 || + strcmp (mimetype, "image/x-jpc") == 0) { + guint32 fourcc; + const GValue *cmap_array; + const GValue *cdef_array; + gint ncomp = 0; + gint fields = 1; + + if (strcmp (mimetype, "image/x-jpc") == 0) { + qtpad->prepare_buf_func = gst_qt_mux_prepare_jpc_buffer; + } + + gst_structure_get_int (structure, "num-components", &ncomp); + gst_structure_get_int (structure, "fields", &fields); + cmap_array = gst_structure_get_value (structure, "component-map"); + cdef_array = gst_structure_get_value (structure, "channel-definitions"); + + ext_atom = NULL; + entry.fourcc = FOURCC_mjp2; + sync = FALSE; + if (gst_structure_get_fourcc (structure, "fourcc", &fourcc) && + (ext_atom = + build_jp2h_extension (qtpad->trak, width, height, fourcc, ncomp, + cmap_array, cdef_array)) != NULL) { + ext_atom_list = g_list_append (ext_atom_list, ext_atom); + + ext_atom = build_fiel_extension (fields); + if (ext_atom) + ext_atom_list = g_list_append (ext_atom_list, ext_atom); + + ext_atom = build_jp2x_extension (codec_data); + if (ext_atom) + ext_atom_list = g_list_append (ext_atom_list, ext_atom); + } else { + GST_DEBUG_OBJECT (qtmux, "missing or invalid fourcc in jp2 caps"); + goto refuse_caps; + } + } else if (strcmp (mimetype, "video/x-vp8") == 0) { + entry.fourcc = FOURCC_VP80; + sync = FALSE; + } else if (strcmp (mimetype, "video/x-dirac") == 0) { + entry.fourcc = FOURCC_drac; + qtpad->have_dts = TRUE; + } else if (strcmp (mimetype, "video/x-qt-part") == 0) { + guint32 fourcc; + + gst_structure_get_fourcc (structure, "format", &fourcc); + entry.fourcc = fourcc; + qtpad->have_dts = TRUE; + } else if (strcmp (mimetype, "video/x-mp4-part") == 0) { + guint32 fourcc; + + gst_structure_get_fourcc (structure, "format", &fourcc); + entry.fourcc = fourcc; + qtpad->have_dts = TRUE; + } + + if (!entry.fourcc) + goto refuse_caps; + + /* ok, set the pad info accordingly */ + qtpad->fourcc = entry.fourcc; + qtpad->sync = sync; + atom_trak_set_video_type (qtpad->trak, qtmux->context, &entry, rate, + ext_atom_list); + + gst_object_unref (qtmux); + return TRUE; + + /* ERRORS */ +refuse_caps: + { + GST_WARNING_OBJECT (qtmux, "pad %s refused caps %" GST_PTR_FORMAT, + GST_PAD_NAME (pad), caps); + gst_object_unref (qtmux); + return FALSE; + } +refuse_renegotiation: + { + GST_WARNING_OBJECT (qtmux, + "pad %s refused renegotiation to %" GST_PTR_FORMAT " from %" + GST_PTR_FORMAT, GST_PAD_NAME (pad), caps, GST_PAD_CAPS (pad)); + gst_object_unref (qtmux); + return FALSE; + } +} + +static gboolean +gst_qt_mux_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean ret; + GstQTMux *qtmux; + guint32 avg_bitrate = 0, max_bitrate = 0; + + qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad)); + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG:{ + GstTagList *list; + GstTagSetter *setter = GST_TAG_SETTER (qtmux); + GstTagMergeMode mode; + + GST_OBJECT_LOCK (qtmux); + mode = gst_tag_setter_get_tag_merge_mode (setter); + + GST_DEBUG_OBJECT (qtmux, "received tag event"); + gst_event_parse_tag (event, &list); + + gst_tag_setter_merge_tags (setter, list, mode); + GST_OBJECT_UNLOCK (qtmux); + + if (gst_tag_list_get_uint (list, GST_TAG_BITRATE, &avg_bitrate) | + gst_tag_list_get_uint (list, GST_TAG_MAXIMUM_BITRATE, &max_bitrate)) { + GstQTPad *qtpad = gst_pad_get_element_private (pad); + g_assert (qtpad); + + if (avg_bitrate > 0 && avg_bitrate < G_MAXUINT32) + qtpad->avg_bitrate = avg_bitrate; + if (max_bitrate > 0 && max_bitrate < G_MAXUINT32) + qtpad->max_bitrate = max_bitrate; + } + + break; + } + default: + break; + } + + ret = qtmux->collect_event (pad, event); + gst_object_unref (qtmux); + + return ret; +} + +static void +gst_qt_mux_release_pad (GstElement * element, GstPad * pad) +{ + GstQTMux *mux = GST_QT_MUX_CAST (element); + GSList *walk; + + GST_DEBUG_OBJECT (element, "Releasing %s:%s", GST_DEBUG_PAD_NAME (pad)); + + for (walk = mux->sinkpads; walk; walk = g_slist_next (walk)) { + GstQTPad *qtpad = (GstQTPad *) walk->data; + GST_DEBUG ("Checking %s:%s", GST_DEBUG_PAD_NAME (qtpad->collect.pad)); + if (qtpad->collect.pad == pad) { + /* this is it, remove */ + mux->sinkpads = g_slist_delete_link (mux->sinkpads, walk); + gst_element_remove_pad (element, pad); + break; + } + } + + gst_collect_pads_remove_pad (mux->collect, pad); +} + +static GstPad * +gst_qt_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); + GstQTMux *qtmux = GST_QT_MUX_CAST (element); + GstQTPad *collect_pad; + GstPad *newpad; + gboolean audio; + gchar *name; + + if (templ->direction != GST_PAD_SINK) + goto wrong_direction; + + if (qtmux->state > GST_QT_MUX_STATE_STARTED) + goto too_late; + + if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { + audio = TRUE; + name = g_strdup_printf ("audio_%02d", qtmux->audio_pads++); + } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { + audio = FALSE; + name = g_strdup_printf ("video_%02d", qtmux->video_pads++); + } else + goto wrong_template; + + GST_DEBUG_OBJECT (qtmux, "Requested pad: %s", name); + + /* create pad and add to collections */ + newpad = gst_pad_new_from_template (templ, name); + g_free (name); + collect_pad = (GstQTPad *) + gst_collect_pads_add_pad_full (qtmux->collect, newpad, sizeof (GstQTPad), + (GstCollectDataDestroyNotify) (gst_qt_mux_pad_reset)); + /* set up pad */ + gst_qt_mux_pad_reset (collect_pad); + collect_pad->trak = atom_trak_new (qtmux->context); + atom_moov_add_trak (qtmux->moov, collect_pad->trak); + + qtmux->sinkpads = g_slist_append (qtmux->sinkpads, collect_pad); + + /* set up pad functions */ + if (audio) + gst_pad_set_setcaps_function (newpad, + GST_DEBUG_FUNCPTR (gst_qt_mux_audio_sink_set_caps)); + else + gst_pad_set_setcaps_function (newpad, + GST_DEBUG_FUNCPTR (gst_qt_mux_video_sink_set_caps)); + + /* 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. + */ + qtmux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad); + gst_pad_set_event_function (newpad, + GST_DEBUG_FUNCPTR (gst_qt_mux_sink_event)); + + gst_pad_set_active (newpad, TRUE); + gst_element_add_pad (element, newpad); + + return newpad; + + /* ERRORS */ +wrong_direction: + { + GST_WARNING_OBJECT (qtmux, "Request pad that is not a SINK pad."); + return NULL; + } +too_late: + { + GST_WARNING_OBJECT (qtmux, "Not providing request pad after stream start."); + return NULL; + } +wrong_template: + { + GST_WARNING_OBJECT (qtmux, "This is not our template!"); + return NULL; + } +} + +static void +gst_qt_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstQTMux *qtmux = GST_QT_MUX_CAST (object); + + GST_OBJECT_LOCK (qtmux); + switch (prop_id) { + case PROP_MOVIE_TIMESCALE: + g_value_set_uint (value, qtmux->timescale); + break; + case PROP_TRAK_TIMESCALE: + g_value_set_uint (value, qtmux->trak_timescale); + break; + case PROP_DO_CTTS: + g_value_set_boolean (value, qtmux->guess_pts); + break; + case PROP_DTS_METHOD: + g_value_set_enum (value, qtmux->dts_method); + break; + case PROP_FAST_START: + g_value_set_boolean (value, qtmux->fast_start); + break; + case PROP_FAST_START_TEMP_FILE: + g_value_set_string (value, qtmux->fast_start_file_path); + break; + case PROP_MOOV_RECOV_FILE: + g_value_set_string (value, qtmux->moov_recov_file_path); + break; + case PROP_FRAGMENT_DURATION: + g_value_set_uint (value, qtmux->fragment_duration); + break; + case PROP_STREAMABLE: + g_value_set_boolean (value, qtmux->streamable); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (qtmux); +} + +static void +gst_qt_mux_generate_fast_start_file_path (GstQTMux * qtmux) +{ + gchar *tmp; + + g_free (qtmux->fast_start_file_path); + qtmux->fast_start_file_path = NULL; + + tmp = g_strdup_printf ("%s%d", "qtmux", g_random_int ()); + qtmux->fast_start_file_path = g_build_filename (g_get_tmp_dir (), tmp, NULL); + g_free (tmp); +} + +static void +gst_qt_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstQTMux *qtmux = GST_QT_MUX_CAST (object); + + GST_OBJECT_LOCK (qtmux); + switch (prop_id) { + case PROP_MOVIE_TIMESCALE: + qtmux->timescale = g_value_get_uint (value); + break; + case PROP_TRAK_TIMESCALE: + qtmux->trak_timescale = g_value_get_uint (value); + break; + case PROP_DO_CTTS: + qtmux->guess_pts = g_value_get_boolean (value); + break; + case PROP_DTS_METHOD: + qtmux->dts_method = g_value_get_enum (value); + break; + case PROP_FAST_START: + qtmux->fast_start = g_value_get_boolean (value); + break; + case PROP_FAST_START_TEMP_FILE: + g_free (qtmux->fast_start_file_path); + qtmux->fast_start_file_path = g_value_dup_string (value); + /* NULL means to generate a random one */ + if (!qtmux->fast_start_file_path) { + gst_qt_mux_generate_fast_start_file_path (qtmux); + } + break; + case PROP_MOOV_RECOV_FILE: + g_free (qtmux->moov_recov_file_path); + qtmux->moov_recov_file_path = g_value_dup_string (value); + break; + case PROP_FRAGMENT_DURATION: + qtmux->fragment_duration = g_value_get_uint (value); + break; + case PROP_STREAMABLE: + qtmux->streamable = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (qtmux); +} + +static GstStateChangeReturn +gst_qt_mux_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstQTMux *qtmux = GST_QT_MUX_CAST (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_collect_pads_start (qtmux->collect); + qtmux->state = GST_QT_MUX_STATE_STARTED; + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_collect_pads_stop (qtmux->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_qt_mux_reset (qtmux, TRUE); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +gboolean +gst_qt_mux_register (GstPlugin * plugin) +{ + GTypeInfo typeinfo = { + sizeof (GstQTMuxClass), + (GBaseInitFunc) gst_qt_mux_base_init, + NULL, + (GClassInitFunc) gst_qt_mux_class_init, + NULL, + NULL, + sizeof (GstQTMux), + 0, + (GInstanceInitFunc) gst_qt_mux_init, + }; + static const GInterfaceInfo tag_setter_info = { + NULL, NULL, NULL + }; + static const GInterfaceInfo tag_xmp_writer_info = { + NULL, NULL, NULL + }; + GType type; + GstQTMuxFormat format; + GstQTMuxClassParams *params; + guint i = 0; + + GST_DEBUG_CATEGORY_INIT (gst_qt_mux_debug, "qtmux", 0, "QT Muxer"); + + GST_LOG ("Registering muxers"); + + while (TRUE) { + GstQTMuxFormatProp *prop; + + prop = &gst_qt_mux_format_list[i]; + format = prop->format; + if (format == GST_QT_MUX_FORMAT_NONE) + break; + + /* create a cache for these properties */ + params = g_new0 (GstQTMuxClassParams, 1); + params->prop = prop; + params->src_caps = gst_static_caps_get (&prop->src_caps); + params->video_sink_caps = gst_static_caps_get (&prop->video_sink_caps); + params->audio_sink_caps = gst_static_caps_get (&prop->audio_sink_caps); + + /* create the type now */ + type = g_type_register_static (GST_TYPE_ELEMENT, prop->type_name, &typeinfo, + 0); + 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); + g_type_add_interface_static (type, GST_TYPE_TAG_XMP_WRITER, + &tag_xmp_writer_info); + + if (!gst_element_register (plugin, prop->name, prop->rank, type)) + return FALSE; + + i++; + } + + GST_LOG ("Finished registering muxers"); + + /* FIXME: ideally classification tag should be added and + registered in gstreamer core gsttaglist + */ + + GST_LOG ("Registering tags"); + + gst_tag_register (GST_TAG_3GP_CLASSIFICATION, GST_TAG_FLAG_META, + G_TYPE_STRING, GST_TAG_3GP_CLASSIFICATION, "content classification", + gst_tag_merge_use_first); + + GST_LOG ("Finished registering tags"); + + return TRUE; +} diff --git a/gst/isomp4/gstqtmux.h b/gst/isomp4/gstqtmux.h new file mode 100644 index 0000000..1851973 --- /dev/null +++ b/gst/isomp4/gstqtmux.h @@ -0,0 +1,232 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008-2010 Thiago Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_QT_MUX_H__ +#define __GST_QT_MUX_H__ + +#include +#include + +#include "fourcc.h" +#include "atoms.h" +#include "atomsrecovery.h" +#include "gstqtmuxmap.h" + +G_BEGIN_DECLS + +#define GST_TYPE_QT_MUX (gst_qt_mux_get_type()) +#define GST_QT_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QT_MUX, GstQTMux)) +#define GST_QT_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QT_MUX, GstQTMux)) +#define GST_IS_QT_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QT_MUX)) +#define GST_IS_QT_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QT_MUX)) +#define GST_QT_MUX_CAST(obj) ((GstQTMux*)(obj)) + + +typedef struct _GstQTMux GstQTMux; +typedef struct _GstQTMuxClass GstQTMuxClass; +typedef struct _GstQTPad GstQTPad; + +/* + * GstQTPadPrepareBufferFunc + * + * Receives a buffer (takes ref) and returns a new buffer that should + * replace the passed one. + * + * Useful for when the pad/datatype needs some manipulation before + * being muxed. (Originally added for image/x-jpc support, for which buffers + * need to be wrapped into a isom box) + */ +typedef GstBuffer * (*GstQTPadPrepareBufferFunc) (GstQTPad * pad, + GstBuffer * buf, GstQTMux * qtmux); + +#define QTMUX_NO_OF_TS 10 + +struct _GstQTPad +{ + GstCollectData collect; /* we extend the CollectData */ + + /* fourcc id of stream */ + guint32 fourcc; + /* whether using format that have out of order buffers */ + gboolean is_out_of_order; + /* whether upstream provides valid PTS data */ + gboolean have_dts; + /* if not 0, track with constant sized samples, e.g. raw audio */ + guint sample_size; + /* make sync table entry */ + gboolean sync; + /* bitrates */ + guint32 avg_bitrate, max_bitrate; + + /* for avg bitrate calculation */ + guint64 total_bytes; + guint64 total_duration; + + GstBuffer *last_buf; + /* dts of last_buf */ + GstClockTime last_dts; + + /* store the first timestamp for comparing with other streams and + * know if there are late streams */ + GstClockTime first_ts; + GstClockTime ts_entries[QTMUX_NO_OF_TS + 2]; + guint ts_n_entries; + GstBuffer *buf_entries[QTMUX_NO_OF_TS + 2]; + guint buf_head; + guint buf_tail; + + /* all the atom and chunk book-keeping is delegated here + * unowned/uncounted reference, parent MOOV owns */ + AtomTRAK *trak; + /* fragmented support */ + /* meta data book-keeping delegated here */ + AtomTRAF *traf; + /* fragment buffers */ + ATOM_ARRAY (GstBuffer *) fragment_buffers; + /* running fragment duration */ + gint64 fragment_duration; + /* optional fragment index book-keeping */ + AtomTFRA *tfra; + + /* if nothing is set, it won't be called */ + GstQTPadPrepareBufferFunc prepare_buf_func; +}; + +typedef enum _GstQTMuxState +{ + GST_QT_MUX_STATE_NONE, + GST_QT_MUX_STATE_STARTED, + GST_QT_MUX_STATE_DATA, + GST_QT_MUX_STATE_EOS +} GstQTMuxState; + +struct _GstQTMux +{ + GstElement element; + + GstPad *srcpad; + GstCollectPads *collect; + GSList *sinkpads; + + /* state */ + GstQTMuxState state; + + /* size of header (prefix, atoms (ftyp, mdat)) */ + guint64 header_size; + /* accumulated size of raw media data (a priori not including mdat header) */ + guint64 mdat_size; + /* position of mdat atom (for later updating) */ + guint64 mdat_pos; + + /* keep track of the largest chunk to fine-tune brands */ + GstClockTime longest_chunk; + + /* atom helper objects */ + AtomsContext *context; + AtomFTYP *ftyp; + AtomMOOV *moov; + GSList *extra_atoms; /* list of extra top-level atoms (e.g. UUID for xmp) + * Stored as AtomInfo structs */ + + /* fragmented file index */ + AtomMFRA *mfra; + + /* fast start */ + FILE *fast_start_file; + + /* moov recovery */ + FILE *moov_recov_file; + + /* fragment sequence */ + guint32 fragment_sequence; + + /* properties */ + guint32 timescale; + guint32 trak_timescale; + AtomsTreeFlavor flavor; + gboolean fast_start; + gboolean guess_pts; + gint dts_method; + gchar *fast_start_file_path; + gchar *moov_recov_file_path; + guint32 fragment_duration; + gboolean streamable; + + /* for collect pads event handling function */ + GstPadEventFunction collect_event; + + /* for request pad naming */ + guint video_pads, audio_pads; +}; + +struct _GstQTMuxClass +{ + GstElementClass parent_class; + + GstQTMuxFormat format; +}; + +/* type register helper struct */ +typedef struct _GstQTMuxClassParams +{ + GstQTMuxFormatProp *prop; + GstCaps *src_caps; + GstCaps *video_sink_caps; + GstCaps *audio_sink_caps; +} GstQTMuxClassParams; + +#define GST_QT_MUX_PARAMS_QDATA g_quark_from_static_string("qt-mux-params") + +GType gst_qt_mux_get_type (void); +gboolean gst_qt_mux_register (GstPlugin * plugin); + +/* FIXME: ideally classification tag should be added and + * registered in gstreamer core gsttaglist + * + * this tag is a string in the format: entityfourcc://table_num/content + * FIXME Shouldn't we add a field for 'language'? + */ +#define GST_TAG_3GP_CLASSIFICATION "classification" + +G_END_DECLS + +#endif /* __GST_QT_MUX_H__ */ diff --git a/gst/isomp4/gstqtmuxmap.c b/gst/isomp4/gstqtmuxmap.c new file mode 100644 index 0000000..e0fb78b --- /dev/null +++ b/gst/isomp4/gstqtmuxmap.c @@ -0,0 +1,391 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008 Thiago Sousa Santos + * Copyright (C) 2008 Mark Nauwelaerts + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "gstqtmuxmap.h" +#include "fourcc.h" +#include "ftypcc.h" + +/* static info related to various format */ + +#define COMMON_VIDEO_CAPS \ + "width = (int) [ 16, 4096 ], " \ + "height = (int) [ 16, 4096 ], " \ + "framerate = (fraction) [ 0, MAX ]" + +#define COMMON_VIDEO_CAPS_NO_FRAMERATE \ + "width = (int) [ 16, 4096 ], " \ + "height = (int) [ 16, 4096 ] " + +#define H263_CAPS \ + "video/x-h263, " \ + COMMON_VIDEO_CAPS + +#define H264_CAPS \ + "video/x-h264, " \ + "stream-format = (string) avc, " \ + "alignment = (string) au, " \ + COMMON_VIDEO_CAPS + +#define MPEG4V_CAPS \ + "video/mpeg, " \ + "mpegversion = (int) 4, "\ + "systemstream = (boolean) false, " \ + COMMON_VIDEO_CAPS "; " \ + "video/x-divx, " \ + "divxversion = (int) 5, "\ + COMMON_VIDEO_CAPS + +#define SVQ_CAPS \ + "video/x-svq, " \ + "svqversion = (int) 3, " \ + COMMON_VIDEO_CAPS + +#define COMMON_AUDIO_CAPS(c, r) \ + "channels = (int) [ 1, " G_STRINGIFY (c) " ], " \ + "rate = (int) [ 1, " G_STRINGIFY (r) " ]" + +#define PCM_CAPS \ + "audio/x-raw-int, " \ + "width = (int) 8, " \ + "depth = (int) 8, " \ + COMMON_AUDIO_CAPS (2, MAX) ", " \ + "signed = (boolean) { true, false }; " \ + "audio/x-raw-int, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " \ + COMMON_AUDIO_CAPS (2, MAX) ", " \ + "signed = (boolean) true " \ + +#define PCM_CAPS_FULL \ + PCM_CAPS "; " \ + "audio/x-raw-int, " \ + "width = (int) 24, " \ + "depth = (int) 24, " \ + "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " \ + COMMON_AUDIO_CAPS (2, MAX) ", " \ + "signed = (boolean) true; " \ + "audio/x-raw-int, " \ + "width = (int) 32, " \ + "depth = (int) 32, " \ + "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " \ + COMMON_AUDIO_CAPS (2, MAX) ", " \ + "signed = (boolean) true " + +#define MP3_CAPS \ + "audio/mpeg, " \ + "mpegversion = (int) 1, " \ + "layer = (int) 3, " \ + COMMON_AUDIO_CAPS (2, MAX) + +#define AAC_CAPS \ + "audio/mpeg, " \ + "mpegversion = (int) 4, " \ + "stream-format = (string) raw, " \ + COMMON_AUDIO_CAPS (8, MAX) + +#define AMR_CAPS \ + "audio/AMR, " \ + "rate = (int) 8000, " \ + "channels = [ 1, 2 ]; " \ + "audio/AMR-WB, " \ + "rate = (int) 16000, " \ + "channels = [ 1, 2 ] " + +#define ADPCM_CAPS \ + "audio/x-adpcm, " \ + "layout = (string)dvi, " \ + "block_align = (int)[64, 8096], " \ + COMMON_AUDIO_CAPS(2, MAX) + +#define ALAC_CAPS \ + "audio/x-alac, " \ + COMMON_AUDIO_CAPS(2, MAX) + +/* FIXME 0.11 - take a look at bugs #580005 and #340375 */ +GstQTMuxFormatProp gst_qt_mux_format_list[] = { + /* original QuickTime format; see Apple site (e.g. qtff.pdf) */ + { + GST_QT_MUX_FORMAT_QT, + GST_RANK_PRIMARY, + "qtmux", + "QuickTime", + "GstQTMux", + GST_STATIC_CAPS ("video/quicktime, variant = (string) apple; " + "video/quicktime"), + GST_STATIC_CAPS ("video/x-raw-rgb, " + COMMON_VIDEO_CAPS "; " + "video/x-raw-yuv, " + "format = (fourcc) UYVY, " + COMMON_VIDEO_CAPS "; " + MPEG4V_CAPS "; " + H263_CAPS "; " + H264_CAPS "; " + SVQ_CAPS "; " + "video/x-dv, " + "systemstream = (boolean) false, " + COMMON_VIDEO_CAPS "; " + "image/jpeg, " + COMMON_VIDEO_CAPS_NO_FRAMERATE "; " + "video/x-vp8, " + COMMON_VIDEO_CAPS "; " + "video/x-dirac, " + COMMON_VIDEO_CAPS "; " "video/x-qt-part, " COMMON_VIDEO_CAPS), + GST_STATIC_CAPS (PCM_CAPS_FULL "; " + MP3_CAPS " ; " + AAC_CAPS " ; " + ADPCM_CAPS " ; " + "audio/x-alaw, " COMMON_AUDIO_CAPS (2, MAX) "; " + AMR_CAPS " ; " ALAC_CAPS) + } + , + /* ISO 14496-14: mp42 as ISO base media extension + * (supersedes original ISO 144996-1 mp41) */ + { + GST_QT_MUX_FORMAT_MP4, + GST_RANK_PRIMARY, + "mp4mux", + "MP4", + "GstMP4Mux", + GST_STATIC_CAPS ("video/quicktime, variant = (string) iso"), + GST_STATIC_CAPS (MPEG4V_CAPS "; " H264_CAPS ";" + "video/x-mp4-part," COMMON_VIDEO_CAPS), + GST_STATIC_CAPS (MP3_CAPS "; " AAC_CAPS " ; " ALAC_CAPS) + } + , + /* Microsoft Smooth Streaming fmp4/isml */ + /* TODO add WMV/WMA support */ + { + GST_QT_MUX_FORMAT_ISML, + GST_RANK_PRIMARY, + "ismlmux", + "ISML", + "GstISMLMux", + GST_STATIC_CAPS ("video/quicktime, variant = (string) iso-fragmented"), + GST_STATIC_CAPS (MPEG4V_CAPS "; " H264_CAPS), + GST_STATIC_CAPS (MP3_CAPS "; " AAC_CAPS) + } + , + /* 3GPP Technical Specification 26.244 V7.3.0 + * (extended in 3GPP2 File Formats for Multimedia Services) */ + { + GST_QT_MUX_FORMAT_3GP, + GST_RANK_PRIMARY, + "3gppmux", + "3GPP", + "Gst3GPPMux", + GST_STATIC_CAPS ("video/quicktime, variant = (string) 3gpp"), + GST_STATIC_CAPS (H263_CAPS "; " MPEG4V_CAPS "; " H264_CAPS), + GST_STATIC_CAPS (AMR_CAPS "; " MP3_CAPS "; " AAC_CAPS) + } + , +#ifndef GST_REMOVE_DEPRECATED + /* 3GPP Technical Specification 26.244 V7.3.0 + * (extended in 3GPP2 File Formats for Multimedia Services) */ + { + GST_QT_MUX_FORMAT_3GP, + GST_RANK_NONE, + "gppmux", + "3GPP", + "GstGPPMux", + GST_STATIC_CAPS ("video/quicktime, variant = (string) 3gpp"), + GST_STATIC_CAPS (H263_CAPS "; " MPEG4V_CAPS "; " H264_CAPS), + GST_STATIC_CAPS (AMR_CAPS "; " MP3_CAPS "; " AAC_CAPS) + } + , +#endif + /* ISO 15444-3: Motion-JPEG-2000 (also ISO base media extension) */ + { + GST_QT_MUX_FORMAT_MJ2, + GST_RANK_PRIMARY, + "mj2mux", + "MJ2", + "GstMJ2Mux", + GST_STATIC_CAPS ("video/mj2"), + GST_STATIC_CAPS ("image/x-j2c, " COMMON_VIDEO_CAPS "; " + "image/x-jpc, " COMMON_VIDEO_CAPS), + GST_STATIC_CAPS (PCM_CAPS) + } + , + { + GST_QT_MUX_FORMAT_NONE, + } +}; + +/* pretty static, but may turn out needed a few times */ +AtomsTreeFlavor +gst_qt_mux_map_format_to_flavor (GstQTMuxFormat format) +{ + if (format == GST_QT_MUX_FORMAT_QT) + return ATOMS_TREE_FLAVOR_MOV; + else if (format == GST_QT_MUX_FORMAT_3GP) + return ATOMS_TREE_FLAVOR_3GP; + else if (format == GST_QT_MUX_FORMAT_ISML) + return ATOMS_TREE_FLAVOR_ISML; + else + return ATOMS_TREE_FLAVOR_ISOM; +} + +static void +gst_qt_mux_map_check_tracks (AtomMOOV * moov, gint * _video, gint * _audio, + gboolean * _has_h264) +{ + GList *it; + gint video = 0, audio = 0; + gboolean has_h264 = FALSE; + + for (it = moov->traks; it != NULL; it = g_list_next (it)) { + AtomTRAK *track = it->data; + + if (track->is_video) { + video++; + if (track->is_h264) + has_h264 = TRUE; + } else + audio++; + } + + if (_video) + *_video = video; + if (_audio) + *_audio = audio; + if (_has_h264) + *_has_h264 = has_h264; +} + +/* pretty static, but possibly dynamic format info */ + +/* notes: + * - avc1 brand is not used, since the specific extensions indicated by it + * are not used (e.g. sample groupings, etc) + * - TODO: maybe even more 3GPP brand fine-tuning ?? + * (but that might need ftyp rewriting at the end) */ +void +gst_qt_mux_map_format_to_header (GstQTMuxFormat format, GstBuffer ** _prefix, + guint32 * _major, guint32 * _version, GList ** _compatible, AtomMOOV * moov, + GstClockTime longest_chunk, gboolean faststart) +{ + static guint32 qt_brands[] = { 0 }; + static guint32 mp4_brands[] = { FOURCC_mp41, FOURCC_isom, FOURCC_iso2, 0 }; + static guint32 isml_brands[] = { FOURCC_iso2, 0 }; + static guint32 gpp_brands[] = { FOURCC_isom, FOURCC_iso2, 0 }; + static guint32 mjp2_brands[] = { FOURCC_isom, FOURCC_iso2, 0 }; + static guint8 mjp2_prefix[] = + { 0, 0, 0, 12, 'j', 'P', ' ', ' ', 0x0D, 0x0A, 0x87, 0x0A }; + guint32 *comp = NULL; + guint32 major = 0, version = 0; + GstBuffer *prefix = NULL; + GList *result = NULL; + + g_return_if_fail (_prefix != NULL); + g_return_if_fail (_major != NULL); + g_return_if_fail (_version != NULL); + g_return_if_fail (_compatible != NULL); + + switch (format) { + case GST_QT_MUX_FORMAT_QT: + major = FOURCC_qt__; + comp = qt_brands; + version = 0x20050300; + break; + case GST_QT_MUX_FORMAT_MP4: + major = FOURCC_mp42; + comp = mp4_brands; + break; + case GST_QT_MUX_FORMAT_ISML: + major = FOURCC_isml; + comp = isml_brands; + break; + case GST_QT_MUX_FORMAT_3GP: + { + gint video, audio; + gboolean has_h264; + + gst_qt_mux_map_check_tracks (moov, &video, &audio, &has_h264); + /* only track restriction really matters for Basic Profile */ + if (video <= 1 && audio <= 1) { + /* it seems only newer spec knows about H264 */ + major = has_h264 ? FOURCC_3gp6 : FOURCC_3gp4; + version = has_h264 ? 0x100 : 0x200; + } else { + major = FOURCC_3gg6; + version = 0x100; + } + comp = gpp_brands; + + /* + * We assume that we have chunks in dts order + */ + if (faststart && longest_chunk <= GST_SECOND) { + /* add progressive download profile */ + result = g_list_append (result, GUINT_TO_POINTER (FOURCC_3gr6)); + } + break; + } + case GST_QT_MUX_FORMAT_MJ2: + major = FOURCC_mjp2; + comp = mjp2_brands; + version = 0; + prefix = gst_buffer_new_and_alloc (sizeof (mjp2_prefix)); + memcpy (GST_BUFFER_DATA (prefix), mjp2_prefix, GST_BUFFER_SIZE (prefix)); + break; + default: + g_assert_not_reached (); + break; + } + + /* convert list to list, hm */ + while (comp && *comp != 0) { + /* order matters over efficiency */ + result = g_list_append (result, GUINT_TO_POINTER (*comp)); + comp++; + } + + *_major = major; + *_version = version; + *_prefix = prefix; + *_compatible = result; + + /* TODO 3GPP may include mp42 as compatible if applicable */ + /* TODO 3GPP major brand 3gp7 if at most 1 video and audio track */ +} diff --git a/gst/isomp4/gstqtmuxmap.h b/gst/isomp4/gstqtmuxmap.h new file mode 100644 index 0000000..f069a2f --- /dev/null +++ b/gst/isomp4/gstqtmuxmap.h @@ -0,0 +1,84 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008 Thiago Sousa Santos + * Copyright (C) 2008 Mark Nauwelaerts + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_QT_MUX_MAP_H__ +#define __GST_QT_MUX_MAP_H__ + +#include "atoms.h" + +#include +#include + +typedef enum _GstQTMuxFormat +{ + GST_QT_MUX_FORMAT_NONE = 0, + GST_QT_MUX_FORMAT_QT, + GST_QT_MUX_FORMAT_MP4, + GST_QT_MUX_FORMAT_3GP, + GST_QT_MUX_FORMAT_MJ2, + GST_QT_MUX_FORMAT_ISML +} GstQTMuxFormat; + +typedef struct _GstQTMuxFormatProp +{ + GstQTMuxFormat format; + GstRank rank; + const gchar *name; + const gchar *long_name; + const gchar *type_name; + GstStaticCaps src_caps; + GstStaticCaps video_sink_caps; + GstStaticCaps audio_sink_caps; +} GstQTMuxFormatProp; + +extern GstQTMuxFormatProp gst_qt_mux_format_list[]; + +void gst_qt_mux_map_format_to_header (GstQTMuxFormat format, GstBuffer ** _prefix, + guint32 * _major, guint32 * verson, + GList ** _compatible, AtomMOOV * moov, + GstClockTime longest_chunk, + gboolean faststart); + +AtomsTreeFlavor gst_qt_mux_map_format_to_flavor (GstQTMuxFormat format); + +#endif /* __GST_QT_MUX_MAP_H__ */ diff --git a/gst/isomp4/gstrtpxqtdepay.c b/gst/isomp4/gstrtpxqtdepay.c new file mode 100644 index 0000000..ce0778b --- /dev/null +++ b/gst/isomp4/gstrtpxqtdepay.c @@ -0,0 +1,694 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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 http://developer.apple.com/quicktime/icefloe/dispatch026.html + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include +#include "gstrtpxqtdepay.h" + +#define MAKE_TLV(a,b) (((a)<<8)|(b)) + +#define TLV_sd MAKE_TLV ('s','d') +#define TLV_qt MAKE_TLV ('q','t') +#define TLV_ti MAKE_TLV ('t','i') +#define TLV_ly MAKE_TLV ('l','y') +#define TLV_vo MAKE_TLV ('v','o') +#define TLV_mx MAKE_TLV ('m','x') +#define TLV_tr MAKE_TLV ('t','r') +#define TLV_tw MAKE_TLV ('t','w') +#define TLV_th MAKE_TLV ('t','h') +#define TLV_la MAKE_TLV ('l','a') +#define TLV_rt MAKE_TLV ('r','t') +#define TLV_gm MAKE_TLV ('g','m') +#define TLV_oc MAKE_TLV ('o','c') +#define TLV_cr MAKE_TLV ('c','r') +#define TLV_du MAKE_TLV ('d','u') +#define TLV_po MAKE_TLV ('p','o') + +#define QT_UINT32(a) (GST_READ_UINT32_BE(a)) +#define QT_UINT24(a) (GST_READ_UINT32_BE(a) >> 8) +#define QT_UINT16(a) (GST_READ_UINT16_BE(a)) +#define QT_UINT8(a) (GST_READ_UINT8(a)) +#define QT_FP32(a) ((GST_READ_UINT32_BE(a))/65536.0) +#define QT_FP16(a) ((GST_READ_UINT16_BE(a))/256.0) +#define QT_FOURCC(a) (GST_READ_UINT32_LE(a)) +#define QT_UINT64(a) ((((guint64)QT_UINT32(a))<<32)|QT_UINT32(((guint8 *)a)+4)) + +#define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') +#define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C') + +GST_DEBUG_CATEGORY_STATIC (rtpxqtdepay_debug); +#define GST_CAT_DEFAULT (rtpxqtdepay_debug) + +/* RtpXQTDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, +}; + +static GstStaticPadTemplate gst_rtp_xqt_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_rtp_xqt_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "media = (string) { \"audio\", \"video\" }, clock-rate = (int) [1, MAX], " + "encoding-name = (string) { \"X-QT\", \"X-QUICKTIME\" }") + ); + +GST_BOILERPLATE (GstRtpXQTDepay, gst_rtp_xqt_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_xqt_depay_finalize (GObject * object); + +static gboolean gst_rtp_xqt_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_xqt_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static GstStateChangeReturn gst_rtp_xqt_depay_change_state (GstElement * + element, GstStateChange transition); + +static void +gst_rtp_xqt_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_xqt_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_xqt_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP packet depayloader", + "Codec/Depayloader/Network", + "Extracts Quicktime audio/video from RTP packets", + "Wim Taymans "); +} + +static void +gst_rtp_xqt_depay_class_init (GstRtpXQTDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_rtp_xqt_depay_finalize; + + gstelement_class->change_state = gst_rtp_xqt_depay_change_state; + + gstbasertpdepayload_class->set_caps = gst_rtp_xqt_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_xqt_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpxqtdepay_debug, "rtpxqtdepay", 0, + "QT Media RTP Depayloader"); +} + +static void +gst_rtp_xqt_depay_init (GstRtpXQTDepay * rtpxqtdepay, + GstRtpXQTDepayClass * klass) +{ + rtpxqtdepay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_xqt_depay_finalize (GObject * object) +{ + GstRtpXQTDepay *rtpxqtdepay; + + rtpxqtdepay = GST_RTP_XQT_DEPAY (object); + + g_object_unref (rtpxqtdepay->adapter); + rtpxqtdepay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_quicktime_parse_sd (GstRtpXQTDepay * rtpxqtdepay, guint8 * data, + guint data_len) +{ + gint len; + guint32 fourcc; + + if (data_len < 8) + goto too_short; + + len = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; + if (len > data_len) + goto too_short; + + fourcc = QT_FOURCC (data + 4); + + GST_DEBUG_OBJECT (rtpxqtdepay, "parsing %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + + switch (fourcc) { + case FOURCC_avc1: + { + guint32 chlen; + + if (len < 0x56) + goto too_short; + len -= 0x56; + data += 0x56; + + /* find avcC */ + while (len >= 8) { + chlen = QT_UINT32 (data); + fourcc = QT_FOURCC (data + 4); + if (fourcc == FOURCC_avcC) { + GstBuffer *buf; + gint size; + GstCaps *caps; + + GST_DEBUG_OBJECT (rtpxqtdepay, "found avcC codec_data in sd, %u", + chlen); + + /* parse, if found */ + if (chlen < len) + size = chlen - 8; + else + size = len - 8; + + buf = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (buf), data + 8, size); + caps = gst_caps_new_simple ("video/x-h264", + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD (rtpxqtdepay)->srcpad, caps); + gst_caps_unref (caps); + break; + } + len -= chlen; + data += chlen; + } + break; + } + default: + break; + } + return TRUE; + + /* ERRORS */ +too_short: + { + return FALSE; + } +} + +static gboolean +gst_rtp_xqt_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + gint clock_rate = 90000; /* default */ + + structure = gst_caps_get_structure (caps, 0); + + gst_structure_get_int (structure, "clock-rate", &clock_rate); + depayload->clock_rate = clock_rate; + + return TRUE; +} + +static GstBuffer * +gst_rtp_xqt_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpXQTDepay *rtpxqtdepay; + GstBuffer *outbuf; + gboolean m; + + rtpxqtdepay = GST_RTP_XQT_DEPAY (depayload); + + if (!gst_rtp_buffer_validate (buf)) + goto bad_packet; + + if (GST_BUFFER_IS_DISCONT (buf)) { + /* discont, clear adapter and try to find a new packet start */ + gst_adapter_clear (rtpxqtdepay->adapter); + rtpxqtdepay->need_resync = TRUE; + GST_DEBUG_OBJECT (rtpxqtdepay, "we need resync"); + } + + m = gst_rtp_buffer_get_marker (buf); + GST_LOG_OBJECT (rtpxqtdepay, "marker: %d", m); + + { + gint payload_len; + guint avail; + guint8 *payload; + guint8 ver, pck; + gboolean s, q, l, d; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + payload = gst_rtp_buffer_get_payload (buf); + + /* 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | VER |PCK|S|Q|L| RES |D| QuickTime Payload ID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + if (payload_len <= 4) + goto wrong_length; + + ver = (payload[0] & 0xf0) >> 4; + if (ver > 1) + goto wrong_version; + + pck = (payload[0] & 0x0c) >> 2; + if (pck == 0) + goto pck_reserved; + + s = (payload[0] & 0x02) != 0; /* contains sync sample */ + q = (payload[0] & 0x01) != 0; /* has payload description */ + l = (payload[1] & 0x80) != 0; /* has packet specific information description */ + d = (payload[2] & 0x80) != 0; /* don't cache info for payload id */ + /* id used for caching info */ + rtpxqtdepay->current_id = ((payload[2] & 0x7f) << 8) | payload[3]; + + GST_LOG_OBJECT (rtpxqtdepay, + "VER: %d, PCK: %d, S: %d, Q: %d, L: %d, D: %d, ID: %d", ver, pck, s, q, + l, d, rtpxqtdepay->current_id); + + if (rtpxqtdepay->need_resync) { + /* we need to find the boundary of a new packet after a DISCONT */ + if (pck != 3 || q) { + /* non-fragmented packet or payload description present, packet starts + * here. */ + rtpxqtdepay->need_resync = FALSE; + } else { + /* fragmented packet without description */ + if (m) { + /* marker bit set, next packet is start of new one */ + rtpxqtdepay->need_resync = FALSE; + } + goto need_resync; + } + } + + payload += 4; + payload_len -= 4; + + if (q) { + gboolean k, f, a, z; + guint pdlen, pdpadded; + gint padding; + /* media_type only used for printing */ + guint32 G_GNUC_UNUSED media_type; + guint32 timescale; + + /* 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |K|F|A|Z| RES | QuickTime Payload Desc Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * . QuickTime Payload Desc Data ... . + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + if (payload_len <= 4) + goto wrong_length; + + k = (payload[0] & 0x80) != 0; /* keyframe */ + f = (payload[0] & 0x40) != 0; /* sparse */ + a = (payload[0] & 0x20) != 0; /* start of payload */ + z = (payload[0] & 0x10) != 0; /* end of payload */ + pdlen = (payload[2] << 8) | payload[3]; + + if (pdlen < 12) + goto wrong_length; + + /* calc padding */ + pdpadded = pdlen + 3; + pdpadded -= pdpadded % 4; + if (payload_len < pdpadded) + goto wrong_length; + + padding = pdpadded - pdlen; + GST_LOG_OBJECT (rtpxqtdepay, + "K: %d, F: %d, A: %d, Z: %d, len: %d, padding %d", k, f, a, z, pdlen, + padding); + + payload += 4; + payload_len -= 4; + /* 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | QuickTime Media Type | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Timescale | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * . QuickTime TLVs ... . + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + media_type = + (payload[0] << 24) | (payload[1] << 16) | (payload[2] << 8) | + payload[3]; + timescale = + (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | + payload[7]; + + GST_LOG_OBJECT (rtpxqtdepay, "media_type: %c%c%c%c, timescale %u", + payload[0], payload[1], payload[2], payload[3], timescale); + + payload += 8; + payload_len -= 8; + pdlen -= 12; + + /* parse TLV (type-length-value triplets */ + while (pdlen > 3) { + guint16 tlv_len, tlv_type; + + /* 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | QuickTime TLV Length | QuickTime TLV Type | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * . QuickTime TLV Value ... . + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + tlv_len = (payload[0] << 8) | payload[1]; + tlv_type = (payload[2] << 8) | payload[3]; + pdlen -= 4; + if (tlv_len > pdlen) + goto wrong_length; + + GST_LOG_OBJECT (rtpxqtdepay, "TLV '%c%c', len %d", payload[2], + payload[3], tlv_len); + + payload += 4; + payload_len -= 4; + + switch (tlv_type) { + case TLV_sd: + /* Session description */ + if (!gst_rtp_quicktime_parse_sd (rtpxqtdepay, payload, tlv_len)) + goto unknown_format; + rtpxqtdepay->have_sd = TRUE; + break; + case TLV_qt: + case TLV_ti: + case TLV_ly: + case TLV_vo: + case TLV_mx: + case TLV_tr: + case TLV_tw: + case TLV_th: + case TLV_la: + case TLV_rt: + case TLV_gm: + case TLV_oc: + case TLV_cr: + case TLV_du: + case TLV_po: + default: + break; + } + + pdlen -= tlv_len; + payload += tlv_len; + payload_len -= tlv_len; + } + payload += padding; + payload_len -= padding; + } + + if (l) { + guint ssilen, ssipadded; + gint padding; + + /* 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | RES | Sample-Specific Info Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * . QuickTime TLVs ... + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + if (payload_len <= 4) + goto wrong_length; + + ssilen = (payload[2] << 8) | payload[3]; + if (ssilen < 4) + goto wrong_length; + + /* calc padding */ + ssipadded = ssilen + 3; + ssipadded -= ssipadded % 4; + if (payload_len < ssipadded) + goto wrong_length; + + padding = ssipadded - ssilen; + GST_LOG_OBJECT (rtpxqtdepay, "len: %d, padding %d", ssilen, padding); + + payload += 4; + payload_len -= 4; + ssilen -= 4; + + /* parse TLV (type-length-value triplets */ + while (ssilen > 3) { + guint16 tlv_len, tlv_type; + + /* 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | QuickTime TLV Length | QuickTime TLV Type | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * . QuickTime TLV Value ... . + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + tlv_len = (payload[0] << 8) | payload[1]; + tlv_type = (payload[2] << 8) | payload[3]; + ssilen -= 4; + if (tlv_len > ssilen) + goto wrong_length; + + GST_LOG_OBJECT (rtpxqtdepay, "TLV '%c%c', len %d", payload[2], + payload[3], tlv_len); + + payload += 4; + payload_len -= 4; + + switch (tlv_type) { + case TLV_sd: + case TLV_qt: + case TLV_ti: + case TLV_ly: + case TLV_vo: + case TLV_mx: + case TLV_tr: + case TLV_tw: + case TLV_th: + case TLV_la: + case TLV_rt: + case TLV_gm: + case TLV_oc: + case TLV_cr: + case TLV_du: + case TLV_po: + default: + break; + } + + ssilen -= tlv_len; + payload += tlv_len; + payload_len -= tlv_len; + } + payload += padding; + payload_len -= padding; + } + + rtpxqtdepay->previous_id = rtpxqtdepay->current_id; + + switch (pck) { + case 1: + { + /* multiple samples per packet. */ + outbuf = gst_buffer_new_and_alloc (payload_len); + memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); + return outbuf; + } + case 2: + { + guint slen; + + /* multiple samples per packet. + * 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |S| Reserved | Sample Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Sample Timestamp | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * . Sample Data ... . + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |S| Reserved | Sample Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Sample Timestamp | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * . Sample Data ... . + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * . ...... . + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + while (payload_len > 8) { + s = (payload[0] & 0x80) != 0; /* contains sync sample */ + slen = (payload[2] << 8) | payload[3]; + /* timestamp = + * (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | + * payload[7]; + */ + + payload += 8; + payload_len -= 8; + + if (slen > payload_len) + slen = payload_len; + + outbuf = gst_buffer_new_and_alloc (slen); + memcpy (GST_BUFFER_DATA (outbuf), payload, slen); + if (!s) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + + gst_base_rtp_depayload_push (depayload, outbuf); + + /* aligned on 32 bit boundary */ + slen = GST_ROUND_UP_4 (slen); + + payload += slen; + payload_len -= slen; + } + break; + } + case 3: + { + /* one sample per packet, use adapter to combine based on marker bit. */ + outbuf = gst_buffer_new_and_alloc (payload_len); + memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); + + gst_adapter_push (rtpxqtdepay->adapter, outbuf); + + if (!m) + goto done; + + avail = gst_adapter_available (rtpxqtdepay->adapter); + outbuf = gst_adapter_take_buffer (rtpxqtdepay->adapter, avail); + + GST_DEBUG_OBJECT (rtpxqtdepay, + "gst_rtp_xqt_depay_chain: pushing buffer of size %u", avail); + + return outbuf; + } + } + } + +done: + return NULL; + +bad_packet: + { + GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, + ("Packet did not validate."), (NULL)); + return NULL; + } +need_resync: + { + GST_DEBUG_OBJECT (rtpxqtdepay, "waiting for marker"); + return NULL; + } +wrong_version: + { + GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, + ("Unknown payload version."), (NULL)); + return NULL; + } +pck_reserved: + { + GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, + ("PCK reserved 0."), (NULL)); + return NULL; + } +wrong_length: + { + GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, + ("Wrong payload length."), (NULL)); + return NULL; + } +unknown_format: + { + GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, + ("Unknown payload format."), (NULL)); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_xqt_depay_change_state (GstElement * element, GstStateChange transition) +{ + GstRtpXQTDepay *rtpxqtdepay; + GstStateChangeReturn ret; + + rtpxqtdepay = GST_RTP_XQT_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (rtpxqtdepay->adapter); + rtpxqtdepay->previous_id = -1; + rtpxqtdepay->current_id = -1; + rtpxqtdepay->need_resync = TRUE; + rtpxqtdepay->have_sd = FALSE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_adapter_clear (rtpxqtdepay->adapter); + default: + break; + } + return ret; +} diff --git a/gst/isomp4/gstrtpxqtdepay.h b/gst/isomp4/gstrtpxqtdepay.h new file mode 100644 index 0000000..4b8a6df --- /dev/null +++ b/gst/isomp4/gstrtpxqtdepay.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_XQT_DEPAY_H__ +#define __GST_RTP_XQT_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_XQT_DEPAY \ + (gst_rtp_xqt_depay_get_type()) +#define GST_RTP_XQT_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_XQT_DEPAY,GstRtpXQTDepay)) +#define GST_RTP_XQT_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_XQT_DEPAY,GstRtpXQTDepayClass)) +#define GST_IS_RTP_XQT_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_XQT_DEPAY)) +#define GST_IS_RTP_XQT_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_XQT_DEPAY)) + +typedef struct _GstRtpXQTDepay GstRtpXQTDepay; +typedef struct _GstRtpXQTDepayClass GstRtpXQTDepayClass; + +struct _GstRtpXQTDepay +{ + GstBaseRTPDepayload depayload; + + GstAdapter *adapter; + + gboolean need_resync; + guint16 previous_id; + guint16 current_id; + gboolean have_sd; +}; + +struct _GstRtpXQTDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_xqt_depay_get_type (void); + +G_END_DECLS + +#endif /* __GST_RTP_XQT_DEPAY_H__ */ diff --git a/gst/isomp4/isomp4-plugin.c b/gst/isomp4/isomp4-plugin.c new file mode 100644 index 0000000..1e26d30 --- /dev/null +++ b/gst/isomp4/isomp4-plugin.c @@ -0,0 +1,74 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David A. Schleef + * Copyright (C) <2006> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "gst/gst-i18n-plugin.h" + +#include "qtdemux.h" +#include "gstrtpxqtdepay.h" +#include "gstqtmux.h" +#include "gstqtmoovrecover.h" + +#include + +static gboolean +plugin_init (GstPlugin * plugin) +{ +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + + gst_pb_utils_init (); + + /* ensure private tag is registered */ + gst_tag_register (GST_QT_DEMUX_PRIVATE_TAG, GST_TAG_FLAG_META, + GST_TYPE_BUFFER, "QT atom", "unparsed QT tag atom", + gst_tag_merge_use_first); + + gst_tag_register (GST_QT_DEMUX_CLASSIFICATION_TAG, GST_TAG_FLAG_META, + G_TYPE_STRING, GST_QT_DEMUX_CLASSIFICATION_TAG, "content classification", + gst_tag_merge_use_first); + + if (!gst_element_register (plugin, "qtdemux", + GST_RANK_PRIMARY, GST_TYPE_QTDEMUX)) + return FALSE; + + if (!gst_element_register (plugin, "rtpxqtdepay", + GST_RANK_MARGINAL, GST_TYPE_RTP_XQT_DEPAY)) + return FALSE; + + if (!gst_qt_mux_register (plugin)) + return FALSE; + if (!gst_qt_moov_recover_register (plugin)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "isomp4", + "ISO base media file format support (mp4, 3gpp, qt, mj2)", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/isomp4/properties.c b/gst/isomp4/properties.c new file mode 100644 index 0000000..8dafb2e --- /dev/null +++ b/gst/isomp4/properties.c @@ -0,0 +1,210 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008 Thiago Sousa Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "properties.h" + +/* if needed, re-allocate buffer to ensure size bytes can be written into it + * at offset */ +void +prop_copy_ensure_buffer (guint8 ** buffer, guint64 * bsize, guint64 * offset, + guint64 size) +{ + if (buffer && *bsize - *offset < size) { + *bsize += size + 10 * 1024; + *buffer = g_realloc (*buffer, *bsize); + } +} + +static guint64 +copy_func (void *prop, guint size, guint8 ** buffer, guint64 * bsize, + guint64 * offset) +{ + if (buffer) { + prop_copy_ensure_buffer (buffer, bsize, offset, size); + memcpy (*buffer + *offset, prop, size); + } + *offset += size; + return size; +} + +#define INT_ARRAY_COPY_FUNC_FAST(name, datatype) \ +guint64 prop_copy_ ## name ## _array (datatype *prop, guint size, \ + guint8 ** buffer, guint64 * bsize, guint64 * offset) { \ + return copy_func (prop, sizeof (datatype) * size, buffer, bsize, offset);\ +} + +#define INT_ARRAY_COPY_FUNC(name, datatype) \ +guint64 prop_copy_ ## name ## _array (datatype *prop, guint size, \ + guint8 ** buffer, guint64 * bsize, guint64 * offset) { \ + guint i; \ + \ + for (i = 0; i < size; i++) { \ + prop_copy_ ## name (prop[i], buffer, bsize, offset); \ + } \ + return sizeof (datatype) * size; \ +} + +/* INTEGERS */ +guint64 +prop_copy_uint8 (guint8 prop, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + return copy_func (&prop, sizeof (guint8), buffer, size, offset); +} + +guint64 +prop_copy_uint16 (guint16 prop, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + prop = GUINT16_TO_BE (prop); + return copy_func (&prop, sizeof (guint16), buffer, size, offset); +} + +guint64 +prop_copy_uint32 (guint32 prop, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + prop = GUINT32_TO_BE (prop); + return copy_func (&prop, sizeof (guint32), buffer, size, offset); +} + +guint64 +prop_copy_uint64 (guint64 prop, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + prop = GUINT64_TO_BE (prop); + return copy_func (&prop, sizeof (guint64), buffer, size, offset); +} + +guint64 +prop_copy_int32 (gint32 prop, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + prop = GINT32_TO_BE (prop); + return copy_func (&prop, sizeof (guint32), buffer, size, offset); +} + +/* uint8 can use direct copy in any case, and may be used for large quantity */ +INT_ARRAY_COPY_FUNC_FAST (uint8, guint8); +/* not used in large quantity anyway */ +INT_ARRAY_COPY_FUNC (uint16, guint16); +INT_ARRAY_COPY_FUNC (uint32, guint32); +INT_ARRAY_COPY_FUNC (uint64, guint64); + +/* FOURCC */ +guint64 +prop_copy_fourcc (guint32 prop, guint8 ** buffer, guint64 * size, + guint64 * offset) +{ + prop = GINT32_TO_LE (prop); + return copy_func (&prop, sizeof (guint32), buffer, size, offset); +} + +INT_ARRAY_COPY_FUNC (fourcc, guint32); + +/** + * prop_copy_fixed_size_string: + * @string: the string to be copied + * @str_size: size of the string + * @buffer: the array to copy the string to + * @offset: the position in the buffer array. + * This value is updated to the point right after the copied string. + * + * Copies a string of bytes without placing its size at the beginning. + * + * Returns: the number of bytes copied + */ +guint64 +prop_copy_fixed_size_string (guint8 * string, guint str_size, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + return copy_func (string, str_size * sizeof (guint8), buffer, size, offset); +} + +/** + * prop_copy_size_string: + * + * @string: the string to be copied + * @str_size: size of the string + * @buffer: the array to copy the string to + * @offset: the position in the buffer array. + * This value is updated to the point right after the copied string. + * + * Copies a string and its size to an array. Example: + * string = 'abc\0' + * result in the array: [3][a][b][c] (each [x] represents a position) + * + * Returns: the number of bytes copied + */ +guint64 +prop_copy_size_string (guint8 * string, guint str_size, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + + prop_copy_uint8 (str_size, buffer, size, offset); + prop_copy_fixed_size_string (string, str_size, buffer, size, offset); + return *offset - original_offset; +} + +/** + * prop_copy_null_terminated_string: + * @string: the string to be copied + * @buffer: the array to copy the string to + * @offset: the position in the buffer array. + * This value is updated to the point right after the copied string. + * + * Copies a string including its null terminating char to an array. + * + * Returns: the number of bytes copied + */ +guint64 +prop_copy_null_terminated_string (gchar * string, guint8 ** buffer, + guint64 * size, guint64 * offset) +{ + guint64 original_offset = *offset; + guint len = strlen (string); + + prop_copy_fixed_size_string ((guint8 *) string, len, buffer, size, offset); + prop_copy_uint8 ('\0', buffer, size, offset); + return *offset - original_offset; +} diff --git a/gst/isomp4/properties.h b/gst/isomp4/properties.h new file mode 100644 index 0000000..ad67e0d --- /dev/null +++ b/gst/isomp4/properties.h @@ -0,0 +1,87 @@ +/* Quicktime muxer plugin for GStreamer + * Copyright (C) 2008 Thiago Sousa Santos + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __PROPERTIES_H__ +#define __PROPERTIES_H__ + +#include +#include + +/** + * Functions for copying atoms properties. + * + * All of them receive, as the input, the property to be copied, the destination + * buffer, and a pointer to an offset in the destination buffer to copy to the right place. + * This offset will be updated to the new value (offset + copied_size) + * The functions return the size of the property that has been copied or 0 + * if it couldn't copy. + */ + +void prop_copy_ensure_buffer (guint8 ** buffer, guint64 * bsize, guint64 * offset, guint64 size); + +guint64 prop_copy_uint8 (guint8 prop, guint8 **buffer, guint64 *size, guint64 *offset); +guint64 prop_copy_uint16 (guint16 prop, guint8 **buffer, guint64 *size, guint64 *offset); +guint64 prop_copy_uint32 (guint32 prop, guint8 **buffer, guint64 *size, guint64 *offset); +guint64 prop_copy_uint64 (guint64 prop, guint8 **buffer, guint64 *size, guint64 *offset); + +guint64 prop_copy_int32 (gint32 prop, guint8 **buffer, guint64 *size, guint64 *offset); + +guint64 prop_copy_uint8_array (guint8 *prop, guint size, + guint8 **buffer, guint64 *bsize, guint64 *offset); +guint64 prop_copy_uint16_array (guint16 *prop, guint size, + guint8 **buffer, guint64 *bsize, guint64 *offset); +guint64 prop_copy_uint32_array (guint32 *prop, guint size, + guint8 **buffer, guint64 *bsize, guint64 *offset); +guint64 prop_copy_uint64_array (guint64 *prop, guint size, + guint8 **buffer, guint64 *bsize, guint64 *offset); + +guint64 prop_copy_fourcc (guint32 prop, guint8 **buffer, guint64 *size, guint64 *offset); +guint64 prop_copy_fourcc_array (guint32 *prop, guint size, + guint8 **buffer, guint64 *bsize, guint64 *offset); +guint64 prop_copy_fixed_size_string (guint8 *string, guint str_size, + guint8 **buffer, guint64 *size, guint64 *offset); +guint64 prop_copy_size_string (guint8 *string, guint str_size, + guint8 **buffer, guint64 *size, guint64 *offset); +guint64 prop_copy_null_terminated_string (gchar *string, + guint8 **buffer, guint64 *size, guint64 *offset); + +#endif /* __PROPERTIES_H__ */ diff --git a/gst/isomp4/qtatomparser.h b/gst/isomp4/qtatomparser.h new file mode 100644 index 0000000..06bb344 --- /dev/null +++ b/gst/isomp4/qtatomparser.h @@ -0,0 +1,139 @@ +/* GStreamer QuickTime atom parser + * Copyright (C) 2009 Tim-Philipp Müller + * Copyright (C) <2009> STEricsson + * + * 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 QT_ATOM_PARSER_H +#define QT_ATOM_PARSER_H + +#include + +/* our inlined version of GstByteReader */ + +static inline gboolean +qt_atom_parser_has_remaining (GstByteReader * parser, guint64 bytes_needed) +{ + return G_LIKELY (parser->size >= bytes_needed) && + G_LIKELY ((parser->size - bytes_needed) >= parser->byte); +} + +static inline gboolean +qt_atom_parser_has_chunks (GstByteReader * parser, guint32 n_chunks, + guint32 chunk_size) +{ + /* assumption: n_chunks and chunk_size are 32-bit, we cast to 64-bit here + * to avoid overflows, to handle e.g. (guint32)-1 * size correctly */ + return qt_atom_parser_has_remaining (parser, (guint64) n_chunks * chunk_size); +} + +static inline gboolean +qt_atom_parser_peek_sub (GstByteReader * parser, guint offset, guint size, + GstByteReader * sub) +{ + *sub = *parser; + + if (G_UNLIKELY (!gst_byte_reader_skip (sub, offset))) + return FALSE; + + return (gst_byte_reader_get_remaining (sub) >= size); +} + +static inline gboolean +qt_atom_parser_skipn_and_get_uint32 (GstByteReader * parser, + guint bytes_to_skip, guint32 * val) +{ + if (G_UNLIKELY (gst_byte_reader_get_remaining (parser) < (bytes_to_skip + 4))) + return FALSE; + + gst_byte_reader_skip_unchecked (parser, bytes_to_skip); + *val = gst_byte_reader_get_uint32_be_unchecked (parser); + return TRUE; +} + +/* off_size must be either 4 or 8 */ +static inline gboolean +qt_atom_parser_get_offset (GstByteReader * parser, guint off_size, + guint64 * val) +{ + if (G_UNLIKELY (gst_byte_reader_get_remaining (parser) < off_size)) + return FALSE; + + if (off_size == sizeof (guint64)) { + *val = gst_byte_reader_get_uint64_be_unchecked (parser); + } else { + *val = gst_byte_reader_get_uint32_be_unchecked (parser); + } + return TRUE; +} + +/* off_size must be either 4 or 8 */ +static inline guint64 +qt_atom_parser_get_offset_unchecked (GstByteReader * parser, guint off_size) +{ + if (off_size == sizeof (guint64)) { + return gst_byte_reader_get_uint64_be_unchecked (parser); + } else { + return gst_byte_reader_get_uint32_be_unchecked (parser); + } +} + +/* size must be from 1 to 4 */ +static inline guint32 +qt_atom_parser_get_uint_with_size_unchecked (GstByteReader * parser, + guint size) +{ + switch (size) { + case 1: + return gst_byte_reader_get_uint8_unchecked (parser); + case 2: + return gst_byte_reader_get_uint16_be_unchecked (parser); + case 3: + return gst_byte_reader_get_uint24_be_unchecked (parser); + case 4: + return gst_byte_reader_get_uint32_be_unchecked (parser); + default: + g_assert_not_reached (); + gst_byte_reader_skip_unchecked (parser, size); + break; + } + return 0; +} + +static inline gboolean +qt_atom_parser_get_fourcc (GstByteReader * parser, guint32 * fourcc) +{ + guint32 f_be; + + if (G_UNLIKELY (gst_byte_reader_get_remaining (parser) < 4)) + return FALSE; + + f_be = gst_byte_reader_get_uint32_be_unchecked (parser); + *fourcc = GUINT32_SWAP_LE_BE (f_be); + return TRUE; +} + +static inline guint32 +qt_atom_parser_get_fourcc_unchecked (GstByteReader * parser) +{ + guint32 fourcc; + + fourcc = gst_byte_reader_get_uint32_be_unchecked (parser); + return GUINT32_SWAP_LE_BE (fourcc); +} + +#endif /* QT_ATOM_PARSER_H */ diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c new file mode 100644 index 0000000..2050be1 --- /dev/null +++ b/gst/isomp4/qtdemux.c @@ -0,0 +1,10229 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David A. Schleef + * Copyright (C) <2006> Wim Taymans + * Copyright (C) <2007> Julien Moutte + * Copyright (C) <2009> Tim-Philipp Müller + * Copyright (C) <2009> STEricsson + * + * 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-qtdemux + * + * Demuxes a .mov file into raw or compressed audio and/or video streams. + * + * This element supports both push and pull-based scheduling, depending on the + * capabilities of the upstream elements. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=test.mov ! qtdemux name=demux demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! autovideosink + * ]| Play (parse and decode) a .mov file and try to output it to + * an automatically detected soundcard and videosink. If the MOV file contains + * compressed audio or video data, this will only work if you have the + * right decoder elements/plugins installed. + * + * + * Last reviewed on 2006-12-29 (0.10.5) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "gst/gst-i18n-plugin.h" + +#include +#include + +#include "qtatomparser.h" +#include "qtdemux_types.h" +#include "qtdemux_dump.h" +#include "qtdemux_fourcc.h" +#include "qtdemux_lang.h" +#include "qtdemux.h" +#include "qtpalette.h" + +#include "gst/riff/riff-media.h" +#include "gst/riff/riff-read.h" + +#include + +#include +#include +#include + +#ifdef HAVE_ZLIB +# include +#endif + +/* max. size considered 'sane' for non-mdat atoms */ +#define QTDEMUX_MAX_ATOM_SIZE (25*1024*1024) + +/* if the sample index is larger than this, something is likely wrong */ +#define QTDEMUX_MAX_SAMPLE_INDEX_SIZE (50*1024*1024) + +/* For converting qt creation times to unix epoch times */ +#define QTDEMUX_SECONDS_PER_DAY (60 * 60 * 24) +#define QTDEMUX_LEAP_YEARS_FROM_1904_TO_1970 17 +#define QTDEMUX_SECONDS_FROM_1904_TO_1970 (((1970 - 1904) * (guint64) 365 + \ + QTDEMUX_LEAP_YEARS_FROM_1904_TO_1970) * QTDEMUX_SECONDS_PER_DAY) + +#ifdef QTDEMUX_MODIFICATION +/* default value of buffer-size property */ +#define QTDEMUX_MAX_BUFFER_SIZE (100*1024*1024) + +#define QTDEMUX_DEFAULT_FWD_TRICKPLAY_MODE 0 /* 0: sending P-frames also, 1: only key frames */ +/* properties considering different cases of file formats */ +enum +{ + PROP_0, + PROP_MAX_BUFFER_SIZE, + PROP_TEMP_LOCATION, + PROP_FWDTRICK_MODE, +}; +#endif + +GST_DEBUG_CATEGORY (qtdemux_debug); + +/*typedef struct _QtNode QtNode; */ +typedef struct _QtDemuxSegment QtDemuxSegment; +typedef struct _QtDemuxSample QtDemuxSample; + +#ifdef QTDEMUX_MODIFICATION +typedef struct _TrickPlayInfo TrickPlayInfo; + +struct _TrickPlayInfo +{ + gint32 next_kidx; + gint32 prev_kidx; + guint64 kidxs_dur_diff; /* duration between two consecutive key frames */ + gint32 show_samples; /* samples to show between two consecutive key frames */ + guint64 start_pos; /* trickplay start position */ +}; +#endif + + +/*struct _QtNode +{ + guint32 type; + guint8 *data; + gint len; +};*/ + +struct _QtDemuxSample +{ + guint32 size; + gint32 pts_offset; /* Add this value to timestamp to get the pts */ + guint64 offset; + guint64 timestamp; /* DTS In mov time */ + guint32 duration; /* In mov time */ + gboolean keyframe; /* TRUE when this packet is a keyframe */ +}; + +/* timestamp is the DTS */ +#define QTSAMPLE_DTS(stream,sample) gst_util_uint64_scale ((sample)->timestamp,\ + GST_SECOND, (stream)->timescale) +/* timestamp + offset is the PTS */ +#define QTSAMPLE_PTS(stream,sample) gst_util_uint64_scale ((sample)->timestamp + \ + (sample)->pts_offset, GST_SECOND, (stream)->timescale) +/* timestamp + duration - dts is the duration */ +#define QTSAMPLE_DUR_DTS(stream,sample,dts) (gst_util_uint64_scale ((sample)->timestamp + \ + (sample)->duration, GST_SECOND, (stream)->timescale) - (dts)); +/* timestamp + offset + duration - pts is the duration */ +#define QTSAMPLE_DUR_PTS(stream,sample,pts) (gst_util_uint64_scale ((sample)->timestamp + \ + (sample)->pts_offset + (sample)->duration, GST_SECOND, (stream)->timescale) - (pts)); + +#define QTSAMPLE_KEYFRAME(stream,sample) ((stream)->all_keyframe || (sample)->keyframe) + +/* + * Quicktime has tracks and segments. A track is a continuous piece of + * multimedia content. The track is not always played from start to finish but + * instead, pieces of the track are 'cut out' and played in sequence. This is + * what the segments do. + * + * Inside the track we have keyframes (K) and delta frames. The track has its + * own timing, which starts from 0 and extends to end. The position in the track + * is called the media_time. + * + * The segments now describe the pieces that should be played from this track + * and are basically tupples of media_time/duration/rate entries. We can have + * multiple segments and they are all played after one another. An example: + * + * segment 1: media_time: 1 second, duration: 1 second, rate 1 + * segment 2: media_time: 3 second, duration: 2 second, rate 2 + * + * To correctly play back this track, one must play: 1 second of media starting + * from media_time 1 followed by 2 seconds of media starting from media_time 3 + * at a rate of 2. + * + * Each of the segments will be played at a specific time, the first segment at + * time 0, the second one after the duration of the first one, etc.. Note that + * the time in resulting playback is not identical to the media_time of the + * track anymore. + * + * Visually, assuming the track has 4 second of media_time: + * + * (a) (b) (c) (d) + * .-----------------------------------------------------------. + * track: | K.....K.........K........K.......K.......K...........K... | + * '-----------------------------------------------------------' + * 0 1 2 3 4 + * .------------^ ^ .----------^ ^ + * / .-------------' / .------------------' + * / / .-----' / + * .--------------. .--------------. + * | segment 1 | | segment 2 | + * '--------------' '--------------' + * + * The challenge here is to cut out the right pieces of the track for each of + * the playback segments. This fortunatly can easily be done with the SEGMENT + * events of gstreamer. + * + * For playback of segment 1, we need to provide the decoder with the keyframe + * (a), in the above figure, but we must instruct it only to output the decoded + * data between second 1 and 2. We do this with a SEGMENT event for 1 to 2, time + * position set to the time of the segment: 0. + * + * We then proceed to push data from keyframe (a) to frame (b). The decoder + * decodes but clips all before media_time 1. + * + * After finishing a segment, we push out a new SEGMENT event with the clipping + * boundaries of the new data. + * + * This is a good usecase for the GStreamer accumulated SEGMENT events. + */ + +struct _QtDemuxSegment +{ + /* global time and duration, all gst time */ + guint64 time; + guint64 stop_time; + guint64 duration; + /* media time of trak, all gst time */ + guint64 media_start; + guint64 media_stop; + gdouble rate; +}; + +struct _QtDemuxStream +{ + GstPad *pad; + + /* stream type */ + guint32 subtype; + GstCaps *caps; + guint32 fourcc; + + /* if the stream has a redirect URI in its headers, we store it here */ + gchar *redirect_uri; + + /* track id */ + guint track_id; + + /* duration/scale */ + guint64 duration; /* in timescale */ + guint32 timescale; + + /* language */ + gchar lang_id[4]; /* ISO 639-2T language code */ + + /* our samples */ + guint32 n_samples; + QtDemuxSample *samples; + gboolean all_keyframe; /* TRUE when all samples are keyframes (no stss) */ + guint32 min_duration; /* duration in timescale of first sample, used for figuring out + the framerate, in timescale units */ + + /* if we use chunks or samples */ + gboolean sampled; + guint padding; + + /* video info */ + gint width; + gint height; + /* aspect ratio */ + gint display_width; + gint display_height; + gint par_w; + gint par_h; + /* Numerator/denominator framerate */ + gint fps_n; + gint fps_d; + guint16 bits_per_sample; + guint16 color_table_id; + + /* audio info */ + gdouble rate; + gint n_channels; + guint samples_per_packet; + guint samples_per_frame; + guint bytes_per_packet; + guint bytes_per_sample; + guint bytes_per_frame; + guint compression; + + /* when a discontinuity is pending */ + gboolean discont; + + /* list of buffers to push first */ + GSList *buffers; + + /* if we need to clip this buffer. This is only needed for uncompressed + * data */ + gboolean need_clip; + + /* buffer needs some custom processing, e.g. subtitles */ + gboolean need_process; + + /* current position */ + guint32 segment_index; + guint32 sample_index; + guint64 time_position; /* in gst time */ + + /* the Gst segment we are processing out, used for clipping */ + GstSegment segment; + + /* last GstFlowReturn */ + GstFlowReturn last_ret; + + /* quicktime segments */ + guint32 n_segments; + QtDemuxSegment *segments; + guint32 from_sample; + guint32 to_sample; + + gboolean sent_eos; + GstTagList *pending_tags; + gboolean send_global_tags; + + GstEvent *pending_event; + + GstByteReader stco; + GstByteReader stsz; + GstByteReader stsc; + GstByteReader stts; + GstByteReader stss; + GstByteReader ctts; + + gboolean chunks_are_chunks; + gint64 stbl_index; + /* stco */ + guint co_size; + GstByteReader co_chunk; + guint32 first_chunk; + guint32 current_chunk; + guint32 last_chunk; + guint32 samples_per_chunk; + guint32 stco_sample_index; + /* stsz */ + guint32 sample_size; /* 0 means variable sizes are stored in stsz */ + /* stsc */ + guint32 stsc_index; + guint32 n_samples_per_chunk; + guint32 stsc_chunk_index; + guint32 stsc_sample_index; + guint64 chunk_offset; + /* stts */ + guint32 stts_index; + guint32 stts_samples; + guint32 n_sample_times; + guint32 stts_sample_index; + guint64 stts_time; + guint32 stts_duration; + /* stss */ + gboolean stss_present; + guint32 n_sample_syncs; + guint32 stss_index; + guint32 n_sample_partial_syncs; + /* ctts */ + gboolean ctts_present; + guint32 n_composition_times; + guint32 ctts_index; + guint32 ctts_sample_index; + guint32 ctts_count; + gint32 ctts_soffset; + + /* fragmented */ + gboolean parsed_trex; + guint32 def_sample_duration; + guint32 def_sample_size; + guint32 def_sample_flags; +#ifdef QTDEMUX_MODIFICATION + guint32 orientation; + TrickPlayInfo *trickplay_info; /* trickplay specific handle */ +#endif +}; + +enum QtDemuxState +{ + QTDEMUX_STATE_INITIAL, /* Initial state (haven't got the header yet) */ + QTDEMUX_STATE_HEADER, /* Parsing the header */ + QTDEMUX_STATE_MOVIE, /* Parsing/Playing the media data */ + QTDEMUX_STATE_BUFFER_MDAT /* Buffering the mdat atom */ +}; + +static GNode *qtdemux_tree_get_child_by_type (GNode * node, guint32 fourcc); +static GNode *qtdemux_tree_get_child_by_type_full (GNode * node, + guint32 fourcc, GstByteReader * parser); +static GNode *qtdemux_tree_get_sibling_by_type (GNode * node, guint32 fourcc); +static GNode *qtdemux_tree_get_sibling_by_type_full (GNode * node, + guint32 fourcc, GstByteReader * parser); + +static GstStaticPadTemplate gst_qtdemux_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/quicktime; video/mj2; audio/x-m4a; " + "application/x-3gp") + ); + +static GstStaticPadTemplate gst_qtdemux_videosrc_template = +GST_STATIC_PAD_TEMPLATE ("video_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_qtdemux_audiosrc_template = +GST_STATIC_PAD_TEMPLATE ("audio_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_qtdemux_subsrc_template = +GST_STATIC_PAD_TEMPLATE ("subtitle_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +GST_BOILERPLATE (GstQTDemux, gst_qtdemux, GstQTDemux, GST_TYPE_ELEMENT); + +static void gst_qtdemux_dispose (GObject * object); + +static guint32 +gst_qtdemux_find_index_linear (GstQTDemux * qtdemux, QtDemuxStream * str, + guint64 media_time); +static guint32 +gst_qtdemux_find_index_for_given_media_offset_linear (GstQTDemux * qtdemux, + QtDemuxStream * str, gint64 media_offset); + +static void gst_qtdemux_set_index (GstElement * element, GstIndex * index); +static GstIndex *gst_qtdemux_get_index (GstElement * element); +static GstStateChangeReturn gst_qtdemux_change_state (GstElement * element, + GstStateChange transition); +static gboolean qtdemux_sink_activate (GstPad * sinkpad); +static gboolean qtdemux_sink_activate_pull (GstPad * sinkpad, gboolean active); +static gboolean qtdemux_sink_activate_push (GstPad * sinkpad, gboolean active); + +static void gst_qtdemux_loop (GstPad * pad); +static GstFlowReturn gst_qtdemux_chain (GstPad * sinkpad, GstBuffer * inbuf); +static gboolean gst_qtdemux_handle_sink_event (GstPad * pad, GstEvent * event); + +static gboolean qtdemux_parse_moov (GstQTDemux * qtdemux, + const guint8 * buffer, guint length); +static gboolean qtdemux_parse_node (GstQTDemux * qtdemux, GNode * node, + const guint8 * buffer, guint length); +static gboolean qtdemux_parse_tree (GstQTDemux * qtdemux); + +static void gst_qtdemux_handle_esds (GstQTDemux * qtdemux, + QtDemuxStream * stream, GNode * esds, GstTagList * list); +static GstCaps *qtdemux_video_caps (GstQTDemux * qtdemux, + QtDemuxStream * stream, guint32 fourcc, const guint8 * stsd_data, + gchar ** codec_name); +static GstCaps *qtdemux_audio_caps (GstQTDemux * qtdemux, + QtDemuxStream * stream, guint32 fourcc, const guint8 * data, int len, + gchar ** codec_name); +static GstCaps *qtdemux_sub_caps (GstQTDemux * qtdemux, + QtDemuxStream * stream, guint32 fourcc, const guint8 * data, + gchar ** codec_name); +static gboolean qtdemux_parse_samples (GstQTDemux * qtdemux, + QtDemuxStream * stream, guint32 n); +static GstFlowReturn qtdemux_expose_streams (GstQTDemux * qtdemux); + +#ifdef QTDEMUX_MODIFICATION +static void gst_qtdemux_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_qtdemux_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static gint32 gst_qtdemux_find_next_keyframe (GstQTDemux * qtdemux, QtDemuxStream * str, guint32 index); +static void gst_qtdemux_forward_trickplay (GstQTDemux * qtdemux, QtDemuxStream * stream, guint64 *timestamp); +static void gst_qtdemux_backward_trickplay (GstQTDemux * qtdemux, QtDemuxStream * stream, guint64 *timestamp); +#endif + +static void +gst_qtdemux_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_qtdemux_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_qtdemux_videosrc_template); + gst_element_class_add_static_pad_template (element_class, + &gst_qtdemux_audiosrc_template); + gst_element_class_add_static_pad_template (element_class, + &gst_qtdemux_subsrc_template); + gst_element_class_set_details_simple (element_class, "QuickTime demuxer", + "Codec/Demuxer", + "Demultiplex a QuickTime file into audio and video streams", + "David Schleef , Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (qtdemux_debug, "qtdemux", 0, "qtdemux plugin"); +} + +static void +gst_qtdemux_class_init (GstQTDemuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->dispose = gst_qtdemux_dispose; + +#ifdef QTDEMUX_MODIFICATION + gobject_class->set_property = gst_qtdemux_set_property; + gobject_class->get_property = gst_qtdemux_get_property; +#endif + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_qtdemux_change_state); + + gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_qtdemux_set_index); + gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_qtdemux_get_index); + +#ifdef QTDEMUX_MODIFICATION + g_object_class_install_property (gobject_class, PROP_MAX_BUFFER_SIZE, + g_param_spec_uint ("buffer-size", "buffer-size", + "Maximum buffer size for mdat atom buffering in case it comes before the moov atom", + 1, G_MAXUINT, QTDEMUX_MAX_BUFFER_SIZE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TEMP_LOCATION, + g_param_spec_string ("temp-location", "temp-location", + "Location for the mdat atom buffering incase it comes before the moov atom", + "/tmp/qtdemux", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_FWDTRICK_MODE, + g_param_spec_boolean ("fwd-trick-mode", + "Forward trickplay mode to use", + "(0) Sending Non-Keyframes also in forward trickplay (1) Sending only keyframes in forward trickplay", + QTDEMUX_DEFAULT_FWD_TRICKPLAY_MODE, + G_PARAM_READWRITE)); +#endif + + + gst_tag_register_musicbrainz_tags (); +} + +static void +gst_qtdemux_init (GstQTDemux * qtdemux, GstQTDemuxClass * klass) +{ + qtdemux->sinkpad = + gst_pad_new_from_static_template (&gst_qtdemux_sink_template, "sink"); + gst_pad_set_activate_function (qtdemux->sinkpad, qtdemux_sink_activate); + gst_pad_set_activatepull_function (qtdemux->sinkpad, + qtdemux_sink_activate_pull); + gst_pad_set_activatepush_function (qtdemux->sinkpad, + qtdemux_sink_activate_push); + gst_pad_set_chain_function (qtdemux->sinkpad, gst_qtdemux_chain); + gst_pad_set_event_function (qtdemux->sinkpad, gst_qtdemux_handle_sink_event); + gst_element_add_pad (GST_ELEMENT_CAST (qtdemux), qtdemux->sinkpad); + + qtdemux->state = QTDEMUX_STATE_INITIAL; + qtdemux->pullbased = FALSE; + qtdemux->posted_redirect = FALSE; + qtdemux->neededbytes = 16; + qtdemux->todrop = 0; + qtdemux->adapter = gst_adapter_new (); + qtdemux->offset = 0; + qtdemux->first_mdat = -1; + qtdemux->got_moov = FALSE; + qtdemux->mdatoffset = GST_CLOCK_TIME_NONE; + qtdemux->mdatbuffer = NULL; + gst_segment_init (&qtdemux->segment, GST_FORMAT_TIME); +#ifdef QTDEMUX_MODIFICATION + /* Initialization of properties with default values*/ + qtdemux->filename = g_strdup("/tmp/qtdemux"); + qtdemux->file = NULL; + qtdemux->ofile = NULL; + qtdemux->filesize = 0; + qtdemux->maxbuffersize = QTDEMUX_MAX_BUFFER_SIZE; + qtdemux->fwdtrick_mode = QTDEMUX_DEFAULT_FWD_TRICKPLAY_MODE; +#endif +} + +static void +gst_qtdemux_dispose (GObject * object) +{ + GstQTDemux *qtdemux = GST_QTDEMUX (object); + + if (qtdemux->adapter) { + g_object_unref (G_OBJECT (qtdemux->adapter)); + qtdemux->adapter = NULL; + } + +#ifdef QTDEMUX_MODIFICATION + if (qtdemux->filename) + g_free (qtdemux->filename); +#endif + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +#ifdef QTDEMUX_MODIFICATION +static void +gst_qtdemux_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstQTDemux *demux; + demux = GST_QTDEMUX (object); + + switch (prop_id) { + case PROP_MAX_BUFFER_SIZE: + demux->maxbuffersize = g_value_get_uint (value); + break; + case PROP_TEMP_LOCATION: + if (demux->filename) + g_free (demux->filename); + demux->filename = g_strdup (g_value_get_string (value)); + break; + case PROP_FWDTRICK_MODE: + demux->fwdtrick_mode = g_value_get_boolean(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qtdemux_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstQTDemux *demux; + demux = GST_QTDEMUX (object); + + switch (prop_id) { + case PROP_MAX_BUFFER_SIZE: + g_value_set_uint (value, demux->maxbuffersize); + break; + case PROP_TEMP_LOCATION: + g_value_set_string (value, demux->filename); + break; + case PROP_FWDTRICK_MODE: + g_value_set_boolean(value, demux->fwdtrick_mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} +#endif + + +static void +gst_qtdemux_post_no_playable_stream_error (GstQTDemux * qtdemux) +{ + if (qtdemux->posted_redirect) { + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file contains no playable streams.")), + ("no known streams found, a redirect message has been posted")); + } else { + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file contains no playable streams.")), + ("no known streams found")); + } +} + +static GstFlowReturn +gst_qtdemux_pull_atom (GstQTDemux * qtdemux, guint64 offset, guint64 size, + GstBuffer ** buf) +{ + GstFlowReturn flow; + + if (G_UNLIKELY (size == 0)) { + GstFlowReturn ret; + GstBuffer *tmp = NULL; + + ret = gst_qtdemux_pull_atom (qtdemux, offset, sizeof (guint32), &tmp); + if (ret != GST_FLOW_OK) + return ret; + + size = QT_UINT32 (GST_BUFFER_DATA (tmp)); + GST_DEBUG_OBJECT (qtdemux, "size 0x%08" G_GINT64_MODIFIER "x", size); + + gst_buffer_unref (tmp); + } + + /* Sanity check: catch bogus sizes (fuzzed/broken files) */ + if (G_UNLIKELY (size > QTDEMUX_MAX_ATOM_SIZE)) { + if (qtdemux->state != QTDEMUX_STATE_MOVIE && qtdemux->got_moov) { + /* we're pulling header but already got most interesting bits, + * so never mind the rest (e.g. tags) (that much) */ + GST_WARNING_OBJECT (qtdemux, "atom has bogus size %" G_GUINT64_FORMAT, + size); + return GST_FLOW_UNEXPECTED; + } else { + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is invalid and cannot be played.")), + ("atom has bogus size %" G_GUINT64_FORMAT, size)); + return GST_FLOW_ERROR; + } + } + + flow = gst_pad_pull_range (qtdemux->sinkpad, offset, size, buf); + + if (G_UNLIKELY (flow != GST_FLOW_OK)) + return flow; + + /* Catch short reads - we don't want any partial atoms */ + if (G_UNLIKELY (GST_BUFFER_SIZE (*buf) < size)) { + GST_WARNING_OBJECT (qtdemux, "short read: %u < %" G_GUINT64_FORMAT, + GST_BUFFER_SIZE (*buf), size); + gst_buffer_unref (*buf); + *buf = NULL; + return GST_FLOW_UNEXPECTED; + } + + return flow; +} + +#if 1 +static gboolean +gst_qtdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat dest_format, gint64 * dest_value) +{ + gboolean res = TRUE; + QtDemuxStream *stream = gst_pad_get_element_private (pad); + GstQTDemux *qtdemux = GST_QTDEMUX (gst_pad_get_parent (pad)); + gint32 index; + + if (stream->subtype != FOURCC_vide) { + res = FALSE; + goto done; + } + + switch (src_format) { + case GST_FORMAT_TIME: + switch (dest_format) { + case GST_FORMAT_BYTES:{ + index = gst_qtdemux_find_index_linear (qtdemux, stream, src_value); + if (-1 == index) + return FALSE; + + *dest_value = stream->samples[index].offset; + + GST_DEBUG_OBJECT (qtdemux, "Format Conversion Time->Offset :%" + GST_TIME_FORMAT "->%" G_GUINT64_FORMAT, + GST_TIME_ARGS (src_value), *dest_value); + break; + } + default: + res = FALSE; + break; + } + break; + case GST_FORMAT_BYTES: + switch (dest_format) { + case GST_FORMAT_TIME:{ + index = + gst_qtdemux_find_index_for_given_media_offset_linear (qtdemux, + stream, src_value); + + if (-1 == index) + return FALSE; + + *dest_value = + gst_util_uint64_scale (stream->samples[index].timestamp, + GST_SECOND, stream->timescale); + GST_DEBUG_OBJECT (qtdemux, "Format Conversion Offset->Time :%" + G_GUINT64_FORMAT "->%" GST_TIME_FORMAT, + src_value, GST_TIME_ARGS (*dest_value)); + break; + } + default: + res = FALSE; + break; + } + break; + default: + res = FALSE; + } + +done: + gst_object_unref (qtdemux); + + return res; +} +#endif + +static const GstQueryType * +gst_qtdemux_get_src_query_types (GstPad * pad) +{ + static const GstQueryType src_types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_CONVERT, + GST_QUERY_FORMATS, + GST_QUERY_SEEKING, + 0 + }; + + return src_types; +} + +static gboolean +gst_qtdemux_get_duration (GstQTDemux * qtdemux, gint64 * duration) +{ + gboolean res = TRUE; + + *duration = GST_CLOCK_TIME_NONE; + + if (qtdemux->duration != 0) { + if (qtdemux->duration != G_MAXINT64 && qtdemux->timescale != 0) { + *duration = gst_util_uint64_scale (qtdemux->duration, + GST_SECOND, qtdemux->timescale); + } + } + return res; +} + +static gboolean +gst_qtdemux_handle_src_query (GstPad * pad, GstQuery * query) +{ + gboolean res = FALSE; + GstQTDemux *qtdemux = GST_QTDEMUX (gst_pad_get_parent (pad)); + + GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + if (GST_CLOCK_TIME_IS_VALID (qtdemux->segment.last_stop)) { + gst_query_set_position (query, GST_FORMAT_TIME, + qtdemux->segment.last_stop); + res = TRUE; + } + break; + case GST_QUERY_DURATION:{ + GstFormat fmt; + + gst_query_parse_duration (query, &fmt, NULL); + if (fmt == GST_FORMAT_TIME) { + gint64 duration = -1; + + gst_qtdemux_get_duration (qtdemux, &duration); + if (duration > 0) { + gst_query_set_duration (query, GST_FORMAT_TIME, duration); + res = TRUE; + } + } + break; + } + case GST_QUERY_CONVERT:{ + GstFormat src_fmt, dest_fmt; + gint64 src_value, dest_value = 0; + + gst_query_parse_convert (query, &src_fmt, &src_value, &dest_fmt, NULL); + + res = gst_qtdemux_src_convert (pad, + src_fmt, src_value, dest_fmt, &dest_value); + if (res) { + gst_query_set_convert (query, src_fmt, src_value, dest_fmt, dest_value); + res = TRUE; + } + break; + } + case GST_QUERY_FORMATS: + gst_query_set_formats (query, 2, GST_FORMAT_TIME, GST_FORMAT_BYTES); + res = TRUE; + break; + case GST_QUERY_SEEKING:{ + GstFormat fmt; + gboolean seekable; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if (fmt == GST_FORMAT_TIME) { + gint64 duration = -1; + + gst_qtdemux_get_duration (qtdemux, &duration); + seekable = TRUE; + if (!qtdemux->pullbased) { + GstQuery *q; + + /* we might be able with help from upstream */ + seekable = FALSE; + q = gst_query_new_seeking (GST_FORMAT_BYTES); + if (gst_pad_peer_query (qtdemux->sinkpad, q)) { + gst_query_parse_seeking (q, &fmt, &seekable, NULL, NULL); + GST_LOG_OBJECT (qtdemux, "upstream BYTE seekable %d", seekable); + } + gst_query_unref (q); + } + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, duration); + res = TRUE; + } + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + + gst_object_unref (qtdemux); + + return res; +} + +static void +gst_qtdemux_push_tags (GstQTDemux * qtdemux, QtDemuxStream * stream) +{ + if (G_LIKELY (stream->pad)) { + GST_DEBUG_OBJECT (qtdemux, "Checking pad %s:%s for tags", + GST_DEBUG_PAD_NAME (stream->pad)); + + if (G_UNLIKELY (stream->pending_tags)) { + GST_DEBUG_OBJECT (qtdemux, "Sending tags %" GST_PTR_FORMAT, + stream->pending_tags); + gst_pad_push_event (stream->pad, + gst_event_new_tag (stream->pending_tags)); + stream->pending_tags = NULL; + } + + if (G_UNLIKELY (stream->send_global_tags && qtdemux->tag_list)) { + GST_DEBUG_OBJECT (qtdemux, "Sending global tags %" GST_PTR_FORMAT, + qtdemux->tag_list); + gst_pad_push_event (stream->pad, + gst_event_new_tag (gst_tag_list_copy (qtdemux->tag_list))); + stream->send_global_tags = FALSE; + } + } +} + +/* push event on all source pads; takes ownership of the event */ +static void +gst_qtdemux_push_event (GstQTDemux * qtdemux, GstEvent * event) +{ + guint n; + gboolean has_valid_stream = FALSE; + GstEventType etype = GST_EVENT_TYPE (event); + + GST_DEBUG_OBJECT (qtdemux, "pushing %s event on all source pads", + GST_EVENT_TYPE_NAME (event)); + + for (n = 0; n < qtdemux->n_streams; n++) { + GstPad *pad; + QtDemuxStream *stream = qtdemux->streams[n]; + + if ((pad = stream->pad)) { + has_valid_stream = TRUE; + + if (etype == GST_EVENT_EOS) { + /* let's not send twice */ + if (stream->sent_eos) + continue; + stream->sent_eos = TRUE; + } + + gst_pad_push_event (pad, gst_event_ref (event)); + } + } + + gst_event_unref (event); + + /* if it is EOS and there are no pads, post an error */ + if (!has_valid_stream && etype == GST_EVENT_EOS) { + gst_qtdemux_post_no_playable_stream_error (qtdemux); + } +} + +/* push a pending newsegment event, if any from the streaming thread */ +static void +gst_qtdemux_push_pending_newsegment (GstQTDemux * qtdemux) +{ + if (qtdemux->pending_newsegment) { + gst_qtdemux_push_event (qtdemux, qtdemux->pending_newsegment); + qtdemux->pending_newsegment = NULL; + } +} + +typedef struct +{ + guint64 media_time; +} FindData; + +static gint +find_func (QtDemuxSample * s1, guint64 * media_time, gpointer user_data) +{ + if (s1->timestamp > *media_time) + return 1; + + return -1; +} + +/* find the index of the sample that includes the data for @media_time using a + * binary search. Only to be called in optimized cases of linear search below. + * + * Returns the index of the sample. + */ +static guint32 +gst_qtdemux_find_index (GstQTDemux * qtdemux, QtDemuxStream * str, + guint64 media_time) +{ + QtDemuxSample *result; + guint32 index; + + /* convert media_time to mov format */ + media_time = + gst_util_uint64_scale_ceil (media_time, str->timescale, GST_SECOND); + + result = gst_util_array_binary_search (str->samples, str->stbl_index + 1, + sizeof (QtDemuxSample), (GCompareDataFunc) find_func, + GST_SEARCH_MODE_BEFORE, &media_time, NULL); + + if (G_LIKELY (result)) + index = result - str->samples; + else + index = 0; + + return index; +} + + + +/* find the index of the sample that includes the data for @media_offset using a + * linear search + * + * Returns the index of the sample. + */ +static guint32 +gst_qtdemux_find_index_for_given_media_offset_linear (GstQTDemux * qtdemux, + QtDemuxStream * str, gint64 media_offset) +{ + QtDemuxSample *result = str->samples; + guint32 index = 0; + + if (result == NULL || str->n_samples == 0) + return -1; + + if (media_offset == result->offset) + return index; + + result++; + while (index < str->n_samples - 1) { + if (!qtdemux_parse_samples (qtdemux, str, index + 1)) + goto parse_failed; + + if (media_offset < result->offset) + break; + + index++; + result++; + } + return index; + + /* ERRORS */ +parse_failed: + { + GST_LOG_OBJECT (qtdemux, "Parsing of index %u failed!", index + 1); + return -1; + } +} + +/* find the index of the sample that includes the data for @media_time using a + * linear search, and keeping in mind that not all samples may have been parsed + * yet. If possible, it will delegate to binary search. + * + * Returns the index of the sample. + */ +static guint32 +gst_qtdemux_find_index_linear (GstQTDemux * qtdemux, QtDemuxStream * str, + guint64 media_time) +{ + guint32 index = 0; + guint64 mov_time; + + /* convert media_time to mov format */ + mov_time = + gst_util_uint64_scale_ceil (media_time, str->timescale, GST_SECOND); + + if (mov_time == str->samples[0].timestamp) + return index; + + /* use faster search if requested time in already parsed range */ + if (str->stbl_index >= 0 && + mov_time <= str->samples[str->stbl_index].timestamp) + return gst_qtdemux_find_index (qtdemux, str, media_time); + + while (index < str->n_samples - 1) { + if (!qtdemux_parse_samples (qtdemux, str, index + 1)) + goto parse_failed; + + if (mov_time < str->samples[index + 1].timestamp) + break; + + index++; + } + return index; + + /* ERRORS */ +parse_failed: + { + GST_LOG_OBJECT (qtdemux, "Parsing of index %u failed!", index + 1); + return -1; + } +} + +/* find the index of the keyframe needed to decode the sample at @index + * of stream @str. + * + * Returns the index of the keyframe. + */ +static guint32 +gst_qtdemux_find_keyframe (GstQTDemux * qtdemux, QtDemuxStream * str, + guint32 index) +{ + guint32 new_index = index; + + if (index >= str->n_samples) { + new_index = str->n_samples; + goto beach; + } + + /* all keyframes, return index */ + if (str->all_keyframe) { + new_index = index; +#ifdef QTDEMUX_MODIFICATION + if(qtdemux->segment.rate < 0.0 && new_index && (FOURCC_vide == str->subtype)) + new_index--; +#endif + goto beach; + } + +#ifdef QTDEMUX_MODIFICATION + if(qtdemux->segment.rate < 0.0 && new_index && (FOURCC_vide == str->subtype)) { + /* If index is keyframe, reduce index by 1, so that we could fetch prev keyframe for video + * This change is done to fix the out of segment issue when seek position is a keyframe position */ + new_index--; + } +#endif + + /* else go back until we have a keyframe */ + while (TRUE) { + if (str->samples[new_index].keyframe) + break; + + if (new_index == 0) + break; + + new_index--; + } + +beach: + GST_DEBUG_OBJECT (qtdemux, "searching for keyframe index before index %u " + "gave %u", index, new_index); + + return new_index; +} + +/* find the segment for @time_position for @stream + * + * Returns -1 if the segment cannot be found. + */ +static guint32 +gst_qtdemux_find_segment (GstQTDemux * qtdemux, QtDemuxStream * stream, + guint64 time_position) +{ + gint i; + guint32 seg_idx; + + GST_LOG_OBJECT (qtdemux, "finding segment for %" GST_TIME_FORMAT, + GST_TIME_ARGS (time_position)); + + /* find segment corresponding to time_position if we are looking + * for a segment. */ + seg_idx = -1; + for (i = 0; i < stream->n_segments; i++) { + QtDemuxSegment *segment = &stream->segments[i]; + + GST_LOG_OBJECT (qtdemux, + "looking at segment %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT, + GST_TIME_ARGS (segment->time), GST_TIME_ARGS (segment->stop_time)); + + /* For the last segment we include stop_time in the last segment */ + if (i < stream->n_segments - 1) { + if (segment->time <= time_position && time_position < segment->stop_time) { + GST_LOG_OBJECT (qtdemux, "segment %d matches", i); + seg_idx = i; + break; + } + } else { + if (segment->time <= time_position && time_position <= segment->stop_time) { + GST_LOG_OBJECT (qtdemux, "segment %d matches", i); + seg_idx = i; + break; + } + } + } + return seg_idx; +} + +/* move the stream @str to the sample position @index. + * + * Updates @str->sample_index and marks discontinuity if needed. + */ +static void +gst_qtdemux_move_stream (GstQTDemux * qtdemux, QtDemuxStream * str, + guint32 index) +{ + /* no change needed */ + if (index == str->sample_index) + return; + + GST_DEBUG_OBJECT (qtdemux, "moving to sample %u of %u", index, + str->n_samples); + + /* position changed, we have a discont */ + str->sample_index = index; + /* Each time we move in the stream we store the position where we are + * starting from */ + str->from_sample = index; + str->discont = TRUE; +} + +static void +gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time, + gint64 * key_time, gint64 * key_offset) +{ + guint64 min_offset; + gint64 min_byte_offset = -1; + gint n; + + min_offset = desired_time; + + /* for each stream, find the index of the sample in the segment + * and move back to the previous keyframe. */ + for (n = 0; n < qtdemux->n_streams; n++) { + QtDemuxStream *str; + guint32 index, kindex; + guint32 seg_idx; + guint64 media_start; + guint64 media_time; + guint64 seg_time; + QtDemuxSegment *seg; + + str = qtdemux->streams[n]; + + seg_idx = gst_qtdemux_find_segment (qtdemux, str, desired_time); + GST_DEBUG_OBJECT (qtdemux, "align segment %d", seg_idx); + + /* segment not found, continue with normal flow */ + if (seg_idx == -1) + continue; + + /* get segment and time in the segment */ + seg = &str->segments[seg_idx]; + seg_time = desired_time - seg->time; + + /* get the media time in the segment */ + media_start = seg->media_start + seg_time; + + /* get the index of the sample with media time */ + index = gst_qtdemux_find_index_linear (qtdemux, str, media_start); + GST_DEBUG_OBJECT (qtdemux, "sample for %" GST_TIME_FORMAT " at %u" + " at offset %" G_GUINT64_FORMAT, + GST_TIME_ARGS (media_start), index, str->samples[index].offset); + + /* find previous keyframe */ + kindex = gst_qtdemux_find_keyframe (qtdemux, str, index); + + /* if the keyframe is at a different position, we need to update the + * requested seek time */ + if (index != kindex) { + index = kindex; + + /* get timestamp of keyframe */ + media_time = + gst_util_uint64_scale (str->samples[kindex].timestamp, GST_SECOND, + str->timescale); + GST_DEBUG_OBJECT (qtdemux, "keyframe at %u with time %" GST_TIME_FORMAT + " at offset %" G_GUINT64_FORMAT, + kindex, GST_TIME_ARGS (media_time), str->samples[kindex].offset); + + /* keyframes in the segment get a chance to change the + * desired_offset. keyframes out of the segment are + * ignored. */ + if (media_time >= seg->media_start) { + guint64 seg_time; + + /* this keyframe is inside the segment, convert back to + * segment time */ + seg_time = (media_time - seg->media_start) + seg->time; + if (seg_time < min_offset) + min_offset = seg_time; + } + } + + if (min_byte_offset < 0 || str->samples[index].offset < min_byte_offset) + min_byte_offset = str->samples[index].offset; + } + + if (key_time) + *key_time = min_offset; + if (key_offset) + *key_offset = min_byte_offset; +} + +static gboolean +gst_qtdemux_convert_seek (GstPad * pad, GstFormat * format, + GstSeekType cur_type, gint64 * cur, GstSeekType stop_type, gint64 * stop) +{ + gboolean res; + GstFormat fmt; + + g_return_val_if_fail (format != NULL, FALSE); + g_return_val_if_fail (cur != NULL, FALSE); + g_return_val_if_fail (stop != NULL, FALSE); + + if (*format == GST_FORMAT_TIME) + return TRUE; + + fmt = GST_FORMAT_TIME; + res = TRUE; + if (cur_type != GST_SEEK_TYPE_NONE) + res = gst_pad_query_convert (pad, *format, *cur, &fmt, cur); + if (res && stop_type != GST_SEEK_TYPE_NONE) + res = gst_pad_query_convert (pad, *format, *stop, &fmt, stop); + + if (res) + *format = GST_FORMAT_TIME; + + return res; +} + +/* perform seek in push based mode: + find BYTE position to move to based on time and delegate to upstream +*/ +static gboolean +gst_qtdemux_do_push_seek (GstQTDemux * qtdemux, GstPad * pad, GstEvent * event) +{ + gdouble rate; + GstFormat format; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + gint64 cur, stop; + gboolean res; + gint64 byte_cur; + + GST_DEBUG_OBJECT (qtdemux, "doing push-based seek"); + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + /* FIXME, always play to the end */ + stop = -1; + + /* only forward streaming and seeking is possible */ + if (rate <= 0) + goto unsupported_seek; + + /* convert to TIME if needed and possible */ + if (!gst_qtdemux_convert_seek (pad, &format, cur_type, &cur, + stop_type, &stop)) + goto no_format; + + /* find reasonable corresponding BYTE position, + * also try to mind about keyframes, since we can not go back a bit for them + * later on */ + gst_qtdemux_adjust_seek (qtdemux, cur, NULL, &byte_cur); + + if (byte_cur == -1) + goto abort_seek; + + GST_DEBUG_OBJECT (qtdemux, "Pushing BYTE seek rate %g, " + "start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, rate, byte_cur, + stop); + + if (!(flags & GST_SEEK_FLAG_KEY_UNIT)) { + GST_DEBUG_OBJECT (qtdemux, + "Requested seek time: %" GST_TIME_FORMAT ", calculated seek offset: %" + G_GUINT64_FORMAT, GST_TIME_ARGS (cur), byte_cur); + GST_OBJECT_LOCK (qtdemux); + qtdemux->requested_seek_time = cur; + qtdemux->seek_offset = byte_cur; + GST_OBJECT_UNLOCK (qtdemux); + } + + /* BYTE seek event */ + event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, cur_type, byte_cur, + stop_type, stop); + res = gst_pad_push_event (qtdemux->sinkpad, event); + + return res; + + /* ERRORS */ +abort_seek: + { + GST_DEBUG_OBJECT (qtdemux, "could not determine byte position to seek to, " + "seek aborted."); + return FALSE; + } +unsupported_seek: + { + GST_DEBUG_OBJECT (qtdemux, "unsupported seek, seek aborted."); + return FALSE; + } +no_format: + { + GST_DEBUG_OBJECT (qtdemux, "unsupported format given, seek aborted."); + return FALSE; + } +} + +/* perform the seek. + * + * We set all segment_indexes in the streams to unknown and + * adjust the time_position to the desired position. this is enough + * to trigger a segment switch in the streaming thread to start + * streaming from the desired position. + * + * Keyframe seeking is a little more complicated when dealing with + * segments. Ideally we want to move to the previous keyframe in + * the segment but there might not be a keyframe in the segment. In + * fact, none of the segments could contain a keyframe. We take a + * practical approach: seek to the previous keyframe in the segment, + * if there is none, seek to the beginning of the segment. + * + * Called with STREAM_LOCK + */ +static gboolean +gst_qtdemux_perform_seek (GstQTDemux * qtdemux, GstSegment * segment) +{ + gint64 desired_offset; + gint n; + + desired_offset = segment->last_stop; + + GST_DEBUG_OBJECT (qtdemux, "seeking to %" GST_TIME_FORMAT, + GST_TIME_ARGS (desired_offset)); + + /* may not have enough fragmented info to do this adjustment, + * and we can't scan (and probably should not) at this time with + * possibly flushing upstream */ + if ((segment->flags & GST_SEEK_FLAG_KEY_UNIT) && !qtdemux->fragmented) { + gint64 min_offset; + + gst_qtdemux_adjust_seek (qtdemux, desired_offset, &min_offset, NULL); + GST_DEBUG_OBJECT (qtdemux, "keyframe seek, align to %" + GST_TIME_FORMAT, GST_TIME_ARGS (min_offset)); + desired_offset = min_offset; + } + + /* and set all streams to the final position */ + for (n = 0; n < qtdemux->n_streams; n++) { + QtDemuxStream *stream = qtdemux->streams[n]; + + stream->time_position = desired_offset; + stream->sample_index = -1; + stream->segment_index = -1; + stream->last_ret = GST_FLOW_OK; + stream->sent_eos = FALSE; +#ifdef QTDEMUX_MODIFICATION + stream->trickplay_info->prev_kidx = 0; + stream->trickplay_info->next_kidx = 0; + stream->trickplay_info->kidxs_dur_diff = 0; + stream->trickplay_info->start_pos = segment->last_stop; +#endif + } + segment->last_stop = desired_offset; + segment->time = desired_offset; + + /* we stop at the end */ + if (segment->stop == -1) + segment->stop = segment->duration; + + return TRUE; +} + +/* do a seek in pull based mode */ +static gboolean +gst_qtdemux_do_seek (GstQTDemux * qtdemux, GstPad * pad, GstEvent * event) +{ + gdouble rate; + GstFormat format; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + gint64 cur = 0, stop; + gboolean flush; + gboolean update; + GstSegment seeksegment; + int i; + + if (event) { + GST_DEBUG_OBJECT (qtdemux, "doing seek with event"); + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); +#ifdef QTDEMUX_MODIFICATION + GST_INFO_OBJECT (qtdemux, "Going to seek to %"GST_TIME_FORMAT", with rate = %f", GST_TIME_ARGS(cur), rate); +#endif + + /* we have to have a format as the segment format. Try to convert + * if not. */ + if (!gst_qtdemux_convert_seek (pad, &format, cur_type, &cur, + stop_type, &stop)) + goto no_format; + + GST_DEBUG_OBJECT (qtdemux, "seek format %s", gst_format_get_name (format)); + } else { + GST_DEBUG_OBJECT (qtdemux, "doing seek without event"); + flags = 0; + } + + flush = flags & GST_SEEK_FLAG_FLUSH; + + /* stop streaming, either by flushing or by pausing the task */ + if (flush) { + /* unlock upstream pull_range */ + gst_pad_push_event (qtdemux->sinkpad, gst_event_new_flush_start ()); + /* make sure out loop function exits */ + gst_qtdemux_push_event (qtdemux, gst_event_new_flush_start ()); + } else { + /* non flushing seek, pause the task */ + gst_pad_pause_task (qtdemux->sinkpad); + } + + /* wait for streaming to finish */ + GST_PAD_STREAM_LOCK (qtdemux->sinkpad); + + /* copy segment, we need this because we still need the old + * segment when we close the current segment. */ + memcpy (&seeksegment, &qtdemux->segment, sizeof (GstSegment)); + + if (event) { + /* configure the segment with the seek variables */ + GST_DEBUG_OBJECT (qtdemux, "configuring seek"); + gst_segment_set_seek (&seeksegment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + } + +#ifdef QTDEMUX_MODIFICATION + if (cur != GST_CLOCK_TIME_NONE) + gst_segment_set_last_stop (&seeksegment, GST_FORMAT_TIME, cur); +#endif + + /* now do the seek, this actually never returns FALSE */ + gst_qtdemux_perform_seek (qtdemux, &seeksegment); + + /* prepare for streaming again */ + if (flush) { + gst_pad_push_event (qtdemux->sinkpad, gst_event_new_flush_stop ()); + gst_qtdemux_push_event (qtdemux, gst_event_new_flush_stop ()); + } else if (qtdemux->segment_running) { + /* we are running the current segment and doing a non-flushing seek, + * close the segment first based on the last_stop. */ + GST_DEBUG_OBJECT (qtdemux, "closing running segment %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, qtdemux->segment.start, + qtdemux->segment.last_stop); + + if (qtdemux->segment.rate >= 0) { + /* FIXME, rate is the product of the global rate and the (quicktime) + * segment rate. */ + qtdemux->pending_newsegment = gst_event_new_new_segment (TRUE, + qtdemux->segment.rate, qtdemux->segment.format, + qtdemux->segment.start, qtdemux->segment.last_stop, + qtdemux->segment.time); + } else { /* For Reverse Playback */ + guint64 stop; + + if ((stop = qtdemux->segment.stop) == -1) + stop = qtdemux->segment.duration; + /* for reverse playback, we played from stop to last_stop. */ + qtdemux->pending_newsegment = gst_event_new_new_segment (TRUE, + qtdemux->segment.rate, qtdemux->segment.format, + qtdemux->segment.last_stop, stop, qtdemux->segment.last_stop); + } + } + +#ifdef QTDEMUX_MODIFICATION + if (seeksegment.rate < 0.0) { + seeksegment.start = 0.0; + } +#endif + + /* commit the new segment */ + memcpy (&qtdemux->segment, &seeksegment, sizeof (GstSegment)); + + if (qtdemux->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT_CAST (qtdemux), + gst_message_new_segment_start (GST_OBJECT_CAST (qtdemux), + qtdemux->segment.format, qtdemux->segment.last_stop)); + } + + /* restart streaming, NEWSEGMENT will be sent from the streaming + * thread. */ + qtdemux->segment_running = TRUE; + for (i = 0; i < qtdemux->n_streams; i++) + qtdemux->streams[i]->last_ret = GST_FLOW_OK; + + gst_pad_start_task (qtdemux->sinkpad, (GstTaskFunction) gst_qtdemux_loop, + qtdemux->sinkpad); + + GST_PAD_STREAM_UNLOCK (qtdemux->sinkpad); + + return TRUE; + + /* ERRORS */ +no_format: + { + GST_DEBUG_OBJECT (qtdemux, "unsupported format given, seek aborted."); + return FALSE; + } +} + +static gboolean +qtdemux_ensure_index (GstQTDemux * qtdemux) +{ + guint i; + + GST_DEBUG_OBJECT (qtdemux, "collecting all metadata for all streams"); + + /* Build complete index */ + for (i = 0; i < qtdemux->n_streams; i++) { + QtDemuxStream *stream = qtdemux->streams[i]; + + if (!qtdemux_parse_samples (qtdemux, stream, stream->n_samples - 1)) + goto parse_error; + } + return TRUE; + + /* ERRORS */ +parse_error: + { + GST_LOG_OBJECT (qtdemux, + "Building complete index of stream %u for seeking failed!", i); + return FALSE; + } +} + +static gboolean +gst_qtdemux_handle_src_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstQTDemux *qtdemux = GST_QTDEMUX (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + { +#ifndef GST_DISABLE_GST_DEBUG + GstClockTime ts = gst_util_get_timestamp (); +#endif + /* Build complete index for seeking; + * if not a fragmented file at least */ + if (!qtdemux->fragmented) + if (!qtdemux_ensure_index (qtdemux)) + goto index_failed; +#ifndef GST_DISABLE_GST_DEBUG + ts = gst_util_get_timestamp () - ts; + GST_INFO_OBJECT (qtdemux, + "Time taken to parse index %" GST_TIME_FORMAT, GST_TIME_ARGS (ts)); +#endif + } + if (qtdemux->pullbased) { + res = gst_qtdemux_do_seek (qtdemux, pad, event); + } else if (qtdemux->state == QTDEMUX_STATE_MOVIE && qtdemux->n_streams && + !qtdemux->fragmented) { + res = gst_qtdemux_do_push_seek (qtdemux, pad, event); + } else { + GST_DEBUG_OBJECT (qtdemux, + "ignoring seek in push mode in current state"); + res = FALSE; + } + gst_event_unref (event); + break; + case GST_EVENT_QOS: + case GST_EVENT_NAVIGATION: + res = FALSE; + gst_event_unref (event); + break; + default: + res = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (qtdemux); + +done: + return res; + + /* ERRORS */ +index_failed: + { + GST_ERROR_OBJECT (qtdemux, "Index failed"); + gst_event_unref (event); + res = FALSE; + goto done; + } +} + +/* stream/index return sample that is min/max w.r.t. byte position, + * time is min/max w.r.t. time of samples, + * the latter need not be time of the former sample */ +static void +gst_qtdemux_find_sample (GstQTDemux * qtdemux, gint64 byte_pos, gboolean fw, + gboolean set, QtDemuxStream ** _stream, gint * _index, gint64 * _time) +{ + gint i, n, index; + gint64 time, min_time; + QtDemuxStream *stream; + + min_time = -1; + stream = NULL; + index = -1; + + for (n = 0; n < qtdemux->n_streams; ++n) { + QtDemuxStream *str; + gint inc; + gboolean set_sample; + + str = qtdemux->streams[n]; + set_sample = !set; + + if (fw) { + i = 0; + inc = 1; + } else { + i = str->n_samples - 1; + inc = -1; + } + for (; (i >= 0) && (i < str->n_samples); i += inc) { + if (str->samples[i].size && + ((fw && (str->samples[i].offset >= byte_pos)) || + (!fw && + (str->samples[i].offset + str->samples[i].size <= + byte_pos)))) { + /* move stream to first available sample */ + if (set) { + gst_qtdemux_move_stream (qtdemux, str, i); + set_sample = TRUE; + } + /* determine min/max time */ + time = str->samples[i].timestamp + str->samples[i].pts_offset; + time = gst_util_uint64_scale (time, GST_SECOND, str->timescale); + if (min_time == -1 || (!fw && time > min_time) || + (fw && time < min_time)) { + min_time = time; + } + /* determine stream with leading sample, to get its position */ + if (!stream || (fw + && (str->samples[i].offset < stream->samples[index].offset)) + || (!fw + && (str->samples[i].offset > stream->samples[index].offset))) { + stream = str; + index = i; + } + break; + } + } + /* no sample for this stream, mark eos */ + if (!set_sample) + gst_qtdemux_move_stream (qtdemux, str, str->n_samples); + } + + if (_time) + *_time = min_time; + if (_stream) + *_stream = stream; + if (_index) + *_index = index; +} + +static gboolean +gst_qtdemux_handle_sink_event (GstPad * sinkpad, GstEvent * event) +{ + GstQTDemux *demux = GST_QTDEMUX (GST_PAD_PARENT (sinkpad)); + gboolean res; + + GST_LOG_OBJECT (demux, "handling %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time, offset = 0; + QtDemuxStream *stream; + gint idx; + gboolean update; + GstSegment segment; + + /* some debug output */ + gst_segment_init (&segment, GST_FORMAT_UNDEFINED); + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + gst_segment_set_newsegment_full (&segment, update, rate, arate, format, + start, stop, time); + GST_DEBUG_OBJECT (demux, + "received format %d newsegment %" GST_SEGMENT_FORMAT, format, + &segment); + + /* chain will send initial newsegment after pads have been added */ + if (demux->state != QTDEMUX_STATE_MOVIE || !demux->n_streams) { + GST_DEBUG_OBJECT (demux, "still starting, eating event"); + goto exit; + } + + /* we only expect a BYTE segment, e.g. following a seek */ + if (format == GST_FORMAT_BYTES) { + if (start > 0) { + gint64 requested_seek_time; + guint64 seek_offset; + + offset = start; + + GST_OBJECT_LOCK (demux); + requested_seek_time = demux->requested_seek_time; + seek_offset = demux->seek_offset; + demux->requested_seek_time = -1; + demux->seek_offset = -1; + GST_OBJECT_UNLOCK (demux); + + if (offset == seek_offset) { + start = requested_seek_time; + } else { + gst_qtdemux_find_sample (demux, start, TRUE, FALSE, NULL, NULL, + &start); + start = MAX (start, 0); + } + } + if (stop > 0) { + gst_qtdemux_find_sample (demux, stop, FALSE, FALSE, NULL, NULL, + &stop); + /* keyframe seeking should already arrange for start >= stop, + * but make sure in other rare cases */ + stop = MAX (stop, start); + } + } else { + GST_DEBUG_OBJECT (demux, "unsupported segment format, ignoring"); + goto exit; + } + + /* accept upstream's notion of segment and distribute along */ + gst_segment_set_newsegment_full (&demux->segment, update, rate, arate, + GST_FORMAT_TIME, start, stop, start); + GST_DEBUG_OBJECT (demux, "Pushing newseg update %d, rate %g, " + "applied rate %g, format %d, start %" GST_TIME_FORMAT ", " + "stop %" GST_TIME_FORMAT, update, rate, arate, GST_FORMAT_TIME, + GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); + + gst_qtdemux_push_event (demux, + gst_event_new_new_segment_full (update, rate, arate, GST_FORMAT_TIME, + start, stop, start)); + + /* clear leftover in current segment, if any */ + gst_adapter_clear (demux->adapter); + /* set up streaming thread */ + gst_qtdemux_find_sample (demux, offset, TRUE, TRUE, &stream, &idx, NULL); + demux->offset = offset; + if (stream) { + demux->todrop = stream->samples[idx].offset - offset; + demux->neededbytes = demux->todrop + stream->samples[idx].size; + } else { + /* set up for EOS */ + demux->neededbytes = -1; + demux->todrop = 0; + } + exit: + gst_event_unref (event); + res = TRUE; + goto drop; + break; + } + case GST_EVENT_FLUSH_STOP: + { + gint i; + + /* clean up, force EOS if no more info follows */ + gst_adapter_clear (demux->adapter); + demux->offset = 0; + demux->neededbytes = -1; + /* reset flow return, e.g. following seek */ + for (i = 0; i < demux->n_streams; i++) { + demux->streams[i]->last_ret = GST_FLOW_OK; + demux->streams[i]->sent_eos = FALSE; + } + break; + } + case GST_EVENT_EOS: + /* If we are in push mode, and get an EOS before we've seen any streams, + * then error out - we have nowhere to send the EOS */ + if (!demux->pullbased) { + gint i; + gboolean has_valid_stream = FALSE; + for (i = 0; i < demux->n_streams; i++) { + if (demux->streams[i]->pad != NULL) { + has_valid_stream = TRUE; + break; + } + } + if (!has_valid_stream) + gst_qtdemux_post_no_playable_stream_error (demux); + } + break; + default: + break; + } + + res = gst_pad_event_default (demux->sinkpad, event); + +drop: + return res; +} + +static void +gst_qtdemux_set_index (GstElement * element, GstIndex * index) +{ + GstQTDemux *demux = GST_QTDEMUX (element); + + GST_OBJECT_LOCK (demux); + if (demux->element_index) + gst_object_unref (demux->element_index); + if (index) { + demux->element_index = gst_object_ref (index); + } else { + demux->element_index = NULL; + } + GST_OBJECT_UNLOCK (demux); + /* object lock might be taken again */ + if (index) + gst_index_get_writer_id (index, GST_OBJECT (element), &demux->index_id); + GST_DEBUG_OBJECT (demux, "Set index %" GST_PTR_FORMAT "for writer id %d", + demux->element_index, demux->index_id); +} + +static GstIndex * +gst_qtdemux_get_index (GstElement * element) +{ + GstIndex *result = NULL; + GstQTDemux *demux = GST_QTDEMUX (element); + + GST_OBJECT_LOCK (demux); + if (demux->element_index) + result = gst_object_ref (demux->element_index); + GST_OBJECT_UNLOCK (demux); + + GST_DEBUG_OBJECT (demux, "Returning index %" GST_PTR_FORMAT, result); + + return result; +} + +static void +gst_qtdemux_stbl_free (QtDemuxStream * stream) +{ + g_free ((gpointer) stream->stco.data); + stream->stco.data = NULL; + g_free ((gpointer) stream->stsz.data); + stream->stsz.data = NULL; + g_free ((gpointer) stream->stsc.data); + stream->stsc.data = NULL; + g_free ((gpointer) stream->stts.data); + stream->stts.data = NULL; + g_free ((gpointer) stream->stss.data); + stream->stss.data = NULL; + g_free ((gpointer) stream->ctts.data); + stream->ctts.data = NULL; +} + +static void +gst_qtdemux_stream_free (GstQTDemux * qtdemux, QtDemuxStream * stream) +{ + while (stream->buffers) { + gst_buffer_unref (GST_BUFFER_CAST (stream->buffers->data)); + stream->buffers = g_slist_delete_link (stream->buffers, stream->buffers); + } + if (stream->pad) + gst_element_remove_pad (GST_ELEMENT_CAST (qtdemux), stream->pad); + g_free (stream->samples); + if (stream->caps) + gst_caps_unref (stream->caps); + g_free (stream->segments); + if (stream->pending_tags) + gst_tag_list_free (stream->pending_tags); + g_free (stream->redirect_uri); + /* free stbl sub-atoms */ + gst_qtdemux_stbl_free (stream); +#ifdef QTDEMUX_MODIFICATION + if (stream->trickplay_info) + g_free (stream->trickplay_info); +#endif + g_free (stream); +} + +static GstStateChangeReturn +gst_qtdemux_change_state (GstElement * element, GstStateChange transition) +{ + GstQTDemux *qtdemux = GST_QTDEMUX (element); + GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + default: + break; + } + + result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY:{ + gint n; + + qtdemux->state = QTDEMUX_STATE_INITIAL; + qtdemux->neededbytes = 16; + qtdemux->todrop = 0; + qtdemux->pullbased = FALSE; + qtdemux->posted_redirect = FALSE; + qtdemux->offset = 0; + qtdemux->first_mdat = -1; + qtdemux->header_size = 0; + qtdemux->got_moov = FALSE; + qtdemux->mdatoffset = GST_CLOCK_TIME_NONE; + if (qtdemux->mdatbuffer) + gst_buffer_unref (qtdemux->mdatbuffer); + qtdemux->mdatbuffer = NULL; + if (qtdemux->comp_brands) + gst_buffer_unref (qtdemux->comp_brands); + qtdemux->comp_brands = NULL; + if (qtdemux->tag_list) + gst_tag_list_free (qtdemux->tag_list); + qtdemux->tag_list = NULL; + if (qtdemux->element_index) + gst_object_unref (qtdemux->element_index); + qtdemux->element_index = NULL; + gst_adapter_clear (qtdemux->adapter); +#ifdef QTDEMUX_MODIFICATION + // TODO: Check new modifications + if (qtdemux->file) { + fclose (qtdemux->file); + if (qtdemux->ofile) + fclose (qtdemux->ofile); + if(!remove (qtdemux->filename)) GST_DEBUG_OBJECT (qtdemux, "Error removing temp file"); + } + qtdemux->file = NULL; + qtdemux->ofile = NULL; + qtdemux->filesize = 0; + qtdemux->maxbuffersize = QTDEMUX_MAX_BUFFER_SIZE; +#endif + for (n = 0; n < qtdemux->n_streams; n++) { + gst_qtdemux_stream_free (qtdemux, qtdemux->streams[n]); + qtdemux->streams[n] = NULL; + } + qtdemux->major_brand = 0; + qtdemux->n_streams = 0; + qtdemux->n_video_streams = 0; + qtdemux->n_audio_streams = 0; + qtdemux->n_sub_streams = 0; + gst_segment_init (&qtdemux->segment, GST_FORMAT_TIME); + qtdemux->requested_seek_time = GST_CLOCK_TIME_NONE; + qtdemux->seek_offset = 0; + qtdemux->upstream_seekable = FALSE; + qtdemux->upstream_size = 0; + break; + } + default: + break; + } + + return result; +} + +static void +qtdemux_post_global_tags (GstQTDemux * qtdemux) +{ + if (qtdemux->tag_list) { + /* all header tags ready and parsed, push them */ + GST_INFO_OBJECT (qtdemux, "posting global tags: %" GST_PTR_FORMAT, + qtdemux->tag_list); + /* post now, send event on pads later */ + gst_element_post_message (GST_ELEMENT (qtdemux), + gst_message_new_tag (GST_OBJECT (qtdemux), + gst_tag_list_copy (qtdemux->tag_list))); + } +} + +static void +qtdemux_parse_ftyp (GstQTDemux * qtdemux, const guint8 * buffer, gint length) +{ + /* counts as header data */ + qtdemux->header_size += length; + + /* only consider at least a sufficiently complete ftyp atom */ + if (length >= 20) { + GstBuffer *buf; + + qtdemux->major_brand = QT_FOURCC (buffer + 8); + GST_DEBUG_OBJECT (qtdemux, "major brand: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (qtdemux->major_brand)); + buf = qtdemux->comp_brands = gst_buffer_new_and_alloc (length - 16); + memcpy (GST_BUFFER_DATA (buf), buffer + 16, GST_BUFFER_SIZE (buf)); + } +} + +static void +qtdemux_handle_xmp_taglist (GstQTDemux * qtdemux, GstTagList * taglist) +{ + /* Strip out bogus fields */ + if (taglist) { + gst_tag_list_remove_tag (taglist, GST_TAG_VIDEO_CODEC); + + GST_DEBUG_OBJECT (qtdemux, "Found XMP tags %" GST_PTR_FORMAT, taglist); + + if (qtdemux->tag_list) { + /* prioritize native tags using _KEEP mode */ + gst_tag_list_insert (qtdemux->tag_list, taglist, GST_TAG_MERGE_KEEP); + gst_tag_list_free (taglist); + } else + qtdemux->tag_list = taglist; + } +} + +static void +qtdemux_parse_uuid (GstQTDemux * qtdemux, const guint8 * buffer, gint length) +{ + static guint8 xmp_uuid[] = { 0xBE, 0x7A, 0xCF, 0xCB, + 0x97, 0xA9, 0x42, 0xE8, + 0x9C, 0x71, 0x99, 0x94, + 0x91, 0xE3, 0xAF, 0xAC + }; + guint offset; + + /* counts as header data */ + qtdemux->header_size += length; + + offset = (QT_UINT32 (buffer) == 0) ? 16 : 8; + + if (length <= offset + 16) { + GST_DEBUG_OBJECT (qtdemux, "uuid atom is too short, skipping"); + return; + } + + if (memcmp (buffer + offset, xmp_uuid, 16) == 0) { + GstBuffer *buf; + GstTagList *taglist; + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = (guint8 *) buffer + offset + 16; + GST_BUFFER_SIZE (buf) = length - offset - 16; + + taglist = gst_tag_list_from_xmp_buffer (buf); + gst_buffer_unref (buf); + + qtdemux_handle_xmp_taglist (qtdemux, taglist); + + } else { + GST_DEBUG_OBJECT (qtdemux, "Ignoring unknown uuid"); + } +} + +/* caller verifies at least 8 bytes in buf */ +static void +extract_initial_length_and_fourcc (const guint8 * data, guint size, + guint64 * plength, guint32 * pfourcc) +{ + guint64 length; + guint32 fourcc; + + length = QT_UINT32 (data); + GST_DEBUG ("length 0x%08" G_GINT64_MODIFIER "x", length); + fourcc = QT_FOURCC (data + 4); + GST_DEBUG ("atom type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); + + if (length == 0) { + length = G_MAXUINT32; + } else if (length == 1 && size >= 16) { + /* this means we have an extended size, which is the 64 bit value of + * the next 8 bytes */ + length = QT_UINT64 (data + 8); + GST_DEBUG ("length 0x%08" G_GINT64_MODIFIER "x", length); + } + + if (plength) + *plength = length; + if (pfourcc) + *pfourcc = fourcc; +} + +static gboolean +qtdemux_parse_mehd (GstQTDemux * qtdemux, GstByteReader * br) +{ + guint32 version = 0; + guint64 duration = 0; + + if (!gst_byte_reader_get_uint32_be (br, &version)) + goto failed; + + version >>= 24; + if (version == 1) { + if (!gst_byte_reader_get_uint64_be (br, &duration)) + goto failed; + } else { + guint32 dur = 0; + + if (!gst_byte_reader_get_uint32_be (br, &dur)) + goto failed; + duration = dur; + } + + GST_INFO_OBJECT (qtdemux, "mehd duration: %" G_GUINT64_FORMAT, duration); + qtdemux->duration = duration; + + return TRUE; + +failed: + { + GST_DEBUG_OBJECT (qtdemux, "parsing mehd failed"); + return FALSE; + } +} + +static gboolean +qtdemux_parse_trex (GstQTDemux * qtdemux, QtDemuxStream * stream, + guint32 * ds_duration, guint32 * ds_size, guint32 * ds_flags) +{ + if (!stream->parsed_trex && qtdemux->moov_node) { + GNode *mvex, *trex; + GstByteReader trex_data; + + mvex = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_mvex); + if (mvex) { + trex = qtdemux_tree_get_child_by_type_full (mvex, FOURCC_trex, + &trex_data); + while (trex) { + guint32 id = 0, dur = 0, size = 0, flags = 0; + + /* skip version/flags */ + if (!gst_byte_reader_skip (&trex_data, 4)) + goto next; + if (!gst_byte_reader_get_uint32_be (&trex_data, &id)) + goto next; + if (id != stream->track_id) + goto next; + /* sample description index; ignore */ + if (!gst_byte_reader_get_uint32_be (&trex_data, &dur)) + goto next; + if (!gst_byte_reader_get_uint32_be (&trex_data, &dur)) + goto next; + if (!gst_byte_reader_get_uint32_be (&trex_data, &size)) + goto next; + if (!gst_byte_reader_get_uint32_be (&trex_data, &flags)) + goto next; + + GST_DEBUG_OBJECT (qtdemux, "fragment defaults for stream %d; " + "duration %d, size %d, flags 0x%x", stream->track_id, + dur, size, flags); + + stream->parsed_trex = TRUE; + stream->def_sample_duration = dur; + stream->def_sample_size = size; + stream->def_sample_flags = flags; + + next: + /* iterate all siblings */ + trex = qtdemux_tree_get_sibling_by_type_full (trex, FOURCC_trex, + &trex_data); + } + } + } + + *ds_duration = stream->def_sample_duration; + *ds_size = stream->def_sample_size; + *ds_size = stream->def_sample_size; + + /* even then, above values are better than random ... */ + if (G_UNLIKELY (!stream->parsed_trex)) { + GST_WARNING_OBJECT (qtdemux, + "failed to find fragment defaults for stream %d", stream->track_id); + return FALSE; + } + + return TRUE; +} + +static gboolean +qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun, + QtDemuxStream * stream, guint32 d_sample_duration, guint32 d_sample_size, + guint32 d_sample_flags, gint64 moof_offset, gint64 moof_length, + gint64 * base_offset, gint64 * running_offset) +{ + guint64 timestamp; + gint32 data_offset = 0; + guint32 flags = 0, first_flags = 0, samples_count = 0; + gint i; + guint8 *data; + guint entry_size, dur_offset, size_offset, flags_offset = 0, ct_offset = 0; + QtDemuxSample *sample; + gboolean ismv = FALSE; + + GST_LOG_OBJECT (qtdemux, "parsing trun stream %d; " + "default dur %d, size %d, flags 0x%x, base offset %" G_GINT64_FORMAT, + stream->track_id, d_sample_duration, d_sample_size, d_sample_flags, + *base_offset); + + /* presence of stss or not can't really tell us much, + * and flags and so on tend to be marginally reliable in these files */ + if (stream->subtype == FOURCC_soun) { + GST_DEBUG_OBJECT (qtdemux, + "sound track in fragmented file; marking all keyframes"); + stream->all_keyframe = TRUE; + } + + if (!gst_byte_reader_skip (trun, 1) || + !gst_byte_reader_get_uint24_be (trun, &flags)) + goto fail; + + if (!gst_byte_reader_get_uint32_be (trun, &samples_count)) + goto fail; + + if (flags & TR_DATA_OFFSET) { + /* note this is really signed */ + if (!gst_byte_reader_get_int32_be (trun, &data_offset)) + goto fail; + GST_LOG_OBJECT (qtdemux, "trun data offset %d", data_offset); + /* default base offset = first byte of moof */ + if (*base_offset == -1) { + GST_LOG_OBJECT (qtdemux, "base_offset at moof"); + *base_offset = moof_offset; + } + *running_offset = *base_offset + data_offset; + } else { + /* if no offset at all, that would mean data starts at moof start, + * which is a bit wrong and is ismv crappy way, so compensate + * assuming data is in mdat following moof */ + if (*base_offset == -1) { + *base_offset = moof_offset + moof_length + 8; + GST_LOG_OBJECT (qtdemux, "base_offset assumed in mdat after moof"); + ismv = TRUE; + } + if (*running_offset == -1) + *running_offset = *base_offset; + } + + GST_LOG_OBJECT (qtdemux, "running offset now %" G_GINT64_FORMAT, + *running_offset); + GST_LOG_OBJECT (qtdemux, "trun offset %d, flags 0x%x, entries %d", + data_offset, flags, samples_count); + + if (flags & TR_FIRST_SAMPLE_FLAGS) { + if (G_UNLIKELY (flags & TR_SAMPLE_FLAGS)) { + GST_DEBUG_OBJECT (qtdemux, + "invalid flags; SAMPLE and FIRST_SAMPLE present, discarding latter"); + flags ^= TR_FIRST_SAMPLE_FLAGS; + } else { + if (!gst_byte_reader_get_uint32_be (trun, &first_flags)) + goto fail; + GST_LOG_OBJECT (qtdemux, "first flags: 0x%x", first_flags); + } + } + + /* FIXME ? spec says other bits should also be checked to determine + * entry size (and prefix size for that matter) */ + entry_size = 0; + dur_offset = size_offset = 0; + if (flags & TR_SAMPLE_DURATION) { + GST_LOG_OBJECT (qtdemux, "entry duration present"); + dur_offset = entry_size; + entry_size += 4; + } + if (flags & TR_SAMPLE_SIZE) { + GST_LOG_OBJECT (qtdemux, "entry size present"); + size_offset = entry_size; + entry_size += 4; + } + if (flags & TR_SAMPLE_FLAGS) { + GST_LOG_OBJECT (qtdemux, "entry flags present"); + flags_offset = entry_size; + entry_size += 4; + } + if (flags & TR_COMPOSITION_TIME_OFFSETS) { + GST_LOG_OBJECT (qtdemux, "entry ct offset present"); + ct_offset = entry_size; + entry_size += 4; + } + + if (!qt_atom_parser_has_chunks (trun, samples_count, entry_size)) + goto fail; + data = (guint8 *) gst_byte_reader_peek_data_unchecked (trun); + + if (stream->n_samples >= + QTDEMUX_MAX_SAMPLE_INDEX_SIZE / sizeof (QtDemuxSample)) + goto index_too_big; + + GST_DEBUG_OBJECT (qtdemux, "allocating n_samples %u * %u (%.2f MB)", + stream->n_samples, (guint) sizeof (QtDemuxSample), + stream->n_samples * sizeof (QtDemuxSample) / (1024.0 * 1024.0)); + + /* create a new array of samples if it's the first sample parsed */ + if (stream->n_samples == 0) + stream->samples = g_try_new0 (QtDemuxSample, samples_count); + /* or try to reallocate it with space enough to insert the new samples */ + else + stream->samples = g_try_renew (QtDemuxSample, stream->samples, + stream->n_samples + samples_count); + if (stream->samples == NULL) + goto out_of_memory; + + if (G_UNLIKELY (stream->n_samples == 0)) { + /* the timestamp of the first sample is also provided by the tfra entry + * but we shouldn't rely on it as it is at the end of files */ + timestamp = 0; + } else { + /* subsequent fragments extend stream */ + timestamp = + stream->samples[stream->n_samples - 1].timestamp + + stream->samples[stream->n_samples - 1].duration; + } + sample = stream->samples + stream->n_samples; + for (i = 0; i < samples_count; i++) { + guint32 dur, size, sflags, ct; + + /* first read sample data */ + if (flags & TR_SAMPLE_DURATION) { + dur = QT_UINT32 (data + dur_offset); + } else { + dur = d_sample_duration; + } + if (flags & TR_SAMPLE_SIZE) { + size = QT_UINT32 (data + size_offset); + } else { + size = d_sample_size; + } + if (flags & TR_FIRST_SAMPLE_FLAGS) { + if (i == 0) { + sflags = first_flags; + } else { + sflags = d_sample_flags; + } + } else if (flags & TR_SAMPLE_FLAGS) { + sflags = QT_UINT32 (data + flags_offset); + } else { + sflags = d_sample_flags; + } + if (flags & TR_COMPOSITION_TIME_OFFSETS) { + ct = QT_UINT32 (data + ct_offset); + } else { + ct = 0; + } + data += entry_size; + + /* fill the sample information */ + sample->offset = *running_offset; + sample->pts_offset = ct; + sample->size = size; + sample->timestamp = timestamp; + sample->duration = dur; + /* sample-is-difference-sample */ + /* ismv seems to use 0x40 for keyframe, 0xc0 for non-keyframe, + * now idea how it relates to bitfield other than massive LE/BE confusion */ + sample->keyframe = ismv ? ((sflags & 0xff) == 0x40) : !(sflags & 0x10000); + *running_offset += size; + timestamp += dur; + sample++; + } + + stream->n_samples += samples_count; + + return TRUE; + +fail: + { + GST_WARNING_OBJECT (qtdemux, "failed to parse trun"); + return FALSE; + } +out_of_memory: + { + GST_WARNING_OBJECT (qtdemux, "failed to allocate %d samples", + stream->n_samples); + return FALSE; + } +index_too_big: + { + GST_WARNING_OBJECT (qtdemux, "not allocating index of %d samples, would " + "be larger than %uMB (broken file?)", stream->n_samples, + QTDEMUX_MAX_SAMPLE_INDEX_SIZE >> 20); + return FALSE; + } +} + +/* find stream with @id */ +static inline QtDemuxStream * +qtdemux_find_stream (GstQTDemux * qtdemux, guint32 id) +{ + QtDemuxStream *stream; + gint i; + + /* check */ + if (G_UNLIKELY (!id)) { + GST_DEBUG_OBJECT (qtdemux, "invalid track id 0"); + return NULL; + } + + /* try to get it fast and simple */ + if (G_LIKELY (id <= qtdemux->n_streams)) { + stream = qtdemux->streams[id - 1]; + if (G_LIKELY (stream->track_id == id)) + return stream; + } + + /* linear search otherwise */ + for (i = 0; i < qtdemux->n_streams; i++) { + stream = qtdemux->streams[i]; + if (stream->track_id == id) + return stream; + } + + return NULL; +} + +static gboolean +qtdemux_parse_tfhd (GstQTDemux * qtdemux, GstByteReader * tfhd, + QtDemuxStream ** stream, guint32 * default_sample_duration, + guint32 * default_sample_size, guint32 * default_sample_flags, + gint64 * base_offset) +{ + guint32 flags = 0; + guint32 track_id = 0; + + if (!gst_byte_reader_skip (tfhd, 1) || + !gst_byte_reader_get_uint24_be (tfhd, &flags)) + goto invalid_track; + + if (!gst_byte_reader_get_uint32_be (tfhd, &track_id)) + goto invalid_track; + + *stream = qtdemux_find_stream (qtdemux, track_id); + if (G_UNLIKELY (!*stream)) + goto unknown_stream; + + if (flags & TF_BASE_DATA_OFFSET) + if (!gst_byte_reader_get_uint64_be (tfhd, (guint64 *) base_offset)) + goto invalid_track; + + /* obtain stream defaults */ + qtdemux_parse_trex (qtdemux, *stream, + default_sample_duration, default_sample_size, default_sample_flags); + + /* FIXME: Handle TF_SAMPLE_DESCRIPTION_INDEX properly */ + if (flags & TF_SAMPLE_DESCRIPTION_INDEX) + if (!gst_byte_reader_skip (tfhd, 4)) + goto invalid_track; + + if (flags & TF_DEFAULT_SAMPLE_DURATION) + if (!gst_byte_reader_get_uint32_be (tfhd, default_sample_duration)) + goto invalid_track; + + if (flags & TF_DEFAULT_SAMPLE_SIZE) + if (!gst_byte_reader_get_uint32_be (tfhd, default_sample_size)) + goto invalid_track; + + if (flags & TF_DEFAULT_SAMPLE_FLAGS) + if (!gst_byte_reader_get_uint32_be (tfhd, default_sample_flags)) + goto invalid_track; + + return TRUE; + +invalid_track: + { + GST_WARNING_OBJECT (qtdemux, "invalid track fragment header"); + return FALSE; + } +unknown_stream: + { + GST_DEBUG_OBJECT (qtdemux, "unknown stream in tfhd"); + return TRUE; + } +} + +static gboolean +qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length, + guint64 moof_offset, QtDemuxStream * stream) +{ + GNode *moof_node, *traf_node, *tfhd_node, *trun_node; + GstByteReader trun_data, tfhd_data; + guint32 ds_size = 0, ds_duration = 0, ds_flags = 0; + gint64 base_offset, running_offset; + + /* NOTE @stream ignored */ + + moof_node = g_node_new ((guint8 *) buffer); + qtdemux_parse_node (qtdemux, moof_node, buffer, length); + qtdemux_node_dump (qtdemux, moof_node); + + /* unknown base_offset to start with */ + base_offset = running_offset = -1; + traf_node = qtdemux_tree_get_child_by_type (moof_node, FOURCC_traf); + while (traf_node) { + /* Fragment Header node */ + tfhd_node = + qtdemux_tree_get_child_by_type_full (traf_node, FOURCC_tfhd, + &tfhd_data); + if (!tfhd_node) + goto missing_tfhd; + if (!qtdemux_parse_tfhd (qtdemux, &tfhd_data, &stream, &ds_duration, + &ds_size, &ds_flags, &base_offset)) + goto missing_tfhd; + if (G_UNLIKELY (!stream)) { + /* we lost track of offset, we'll need to regain it, + * but can delay complaining until later or avoid doing so altogether */ + base_offset = -2; + goto next; + } + if (G_UNLIKELY (base_offset < -1)) + goto lost_offset; + /* Track Run node */ + trun_node = + qtdemux_tree_get_child_by_type_full (traf_node, FOURCC_trun, + &trun_data); + while (trun_node) { + qtdemux_parse_trun (qtdemux, &trun_data, stream, + ds_duration, ds_size, ds_flags, moof_offset, length, &base_offset, + &running_offset); + /* iterate all siblings */ + trun_node = qtdemux_tree_get_sibling_by_type_full (trun_node, FOURCC_trun, + &trun_data); + } + /* if no new base_offset provided for next traf, + * base is end of current traf */ + base_offset = running_offset; + running_offset = -1; + next: + /* iterate all siblings */ + traf_node = qtdemux_tree_get_sibling_by_type (traf_node, FOURCC_traf); + } + g_node_destroy (moof_node); + return TRUE; + +missing_tfhd: + { + GST_DEBUG_OBJECT (qtdemux, "missing tfhd box"); + goto fail; + } +lost_offset: + { + GST_DEBUG_OBJECT (qtdemux, "lost offset"); + goto fail; + } +fail: + { + g_node_destroy (moof_node); + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is corrupt and cannot be played.")), (NULL)); + return FALSE; + } +} + +/* might be used if some day we actually use mfra & co + * for random access to fragments, + * but that will require quite some modifications and much less relying + * on a sample array */ +#if 0 +static gboolean +qtdemux_parse_tfra (GstQTDemux * qtdemux, GNode * tfra_node, + QtDemuxStream * stream) +{ + guint64 time = 0, moof_offset = 0; + guint32 ver_flags, track_id, len, num_entries, i; + guint value_size, traf_size, trun_size, sample_size; + GstBuffer *buf = NULL; + GstFlowReturn ret; + GstByteReader tfra; + + gst_byte_reader_init (&tfra, (guint8 *) tfra_node->data + (4 + 4), + QT_UINT32 ((guint8 *) tfra_node->data) - (4 + 4)); + + if (!gst_byte_reader_get_uint32_be (&tfra, &ver_flags)) + return FALSE; + + if (!(gst_byte_reader_get_uint32_be (&tfra, &track_id) && + gst_byte_reader_get_uint32_be (&tfra, &len) && + gst_byte_reader_get_uint32_be (&tfra, &num_entries))) + return FALSE; + + GST_LOG_OBJECT (qtdemux, "id %d == stream id %d ?", + track_id, stream->track_id); + if (track_id != stream->track_id) { + return FALSE; + } + + value_size = ((ver_flags >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); + sample_size = (len & 3) + 1; + trun_size = ((len & 12) >> 2) + 1; + traf_size = ((len & 48) >> 4) + 1; + + if (num_entries == 0) + goto no_samples; + + if (!qt_atom_parser_has_chunks (&tfra, num_entries, + value_size + value_size + traf_size + trun_size + sample_size)) + goto corrupt_file; + + for (i = 0; i < num_entries; i++) { + qt_atom_parser_get_offset (&tfra, value_size, &time); + qt_atom_parser_get_offset (&tfra, value_size, &moof_offset); + qt_atom_parser_get_uint_with_size_unchecked (&tfra, traf_size); + qt_atom_parser_get_uint_with_size_unchecked (&tfra, trun_size); + qt_atom_parser_get_uint_with_size_unchecked (&tfra, sample_size); + + GST_LOG_OBJECT (qtdemux, + "fragment time: %" GST_TIME_FORMAT " moof_offset: %u", + GST_TIME_ARGS (gst_util_uint64_scale (time, GST_SECOND, + stream->timescale)), moof_offset); + + ret = gst_qtdemux_pull_atom (qtdemux, moof_offset, 0, &buf); + if (ret != GST_FLOW_OK) + goto corrupt_file; + qtdemux_parse_moof (qtdemux, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), + moof_offset, stream); + gst_buffer_unref (buf); + } + + return TRUE; + +/* ERRORS */ +corrupt_file: + { + GST_ELEMENT_ERROR (qtdemux, STREAM, DECODE, + (_("This file is corrupt and cannot be played.")), (NULL)); + return FALSE; + } +no_samples: + { + GST_WARNING_OBJECT (qtdemux, "stream has no samples"); + return FALSE; + } +} + +static gboolean +qtdemux_parse_mfra (GstQTDemux * qtdemux, QtDemuxStream * stream) +{ + GstFlowReturn ret; + GNode *mfra_node, *tfra_node; + GstBuffer *buffer; + + if (!qtdemux->mfra_offset) + return FALSE; + + ret = gst_qtdemux_pull_atom (qtdemux, qtdemux->mfra_offset, 0, &buffer); + if (ret != GST_FLOW_OK) + goto corrupt_file; + + mfra_node = g_node_new ((guint8 *) GST_BUFFER_DATA (buffer)); + qtdemux_parse_node (qtdemux, mfra_node, GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); + + tfra_node = qtdemux_tree_get_child_by_type (mfra_node, FOURCC_tfra); + + while (tfra_node) { + qtdemux_parse_tfra (qtdemux, tfra_node, stream); + /* iterate all siblings */ + tfra_node = qtdemux_tree_get_sibling_by_type (tfra_node, FOURCC_tfra); + } + g_node_destroy (mfra_node); + gst_buffer_unref (buffer); + + return TRUE; + +corrupt_file: + { + GST_ELEMENT_ERROR (qtdemux, STREAM, DECODE, + (_("This file is corrupt and cannot be played.")), (NULL)); + return FALSE; + } +} + +static GstFlowReturn +qtdemux_parse_mfro (GstQTDemux * qtdemux, guint64 * mfra_offset, + guint32 * mfro_size) +{ + GstFlowReturn ret = GST_FLOW_ERROR; + GstBuffer *mfro = NULL; + guint32 fourcc; + gint64 len; + GstFormat fmt = GST_FORMAT_BYTES; + + if (!gst_pad_query_peer_duration (qtdemux->sinkpad, &fmt, &len)) { + GST_DEBUG_OBJECT (qtdemux, "upstream size not available; " + "can not locate mfro"); + goto exit; + } + + ret = gst_qtdemux_pull_atom (qtdemux, len - 16, 16, &mfro); + if (ret != GST_FLOW_OK) + goto exit; + + fourcc = QT_FOURCC (GST_BUFFER_DATA (mfro) + 4); + if (fourcc != FOURCC_mfro) + goto exit; + + GST_INFO_OBJECT (qtdemux, "Found mfro atom: fragmented mp4 container"); + if (GST_BUFFER_SIZE (mfro) >= 16) { + GST_DEBUG_OBJECT (qtdemux, "parsing 'mfro' atom"); + *mfro_size = QT_UINT32 (GST_BUFFER_DATA (mfro) + 12); + if (*mfro_size >= len) { + GST_WARNING_OBJECT (qtdemux, "mfro.size is invalid"); + ret = GST_FLOW_ERROR; + goto exit; + } + *mfra_offset = len - *mfro_size; + } + +exit: + if (mfro) + gst_buffer_unref (mfro); + + return ret; +} + +static void +qtdemux_parse_fragmented (GstQTDemux * qtdemux) +{ + GstFlowReturn ret; + guint32 mfra_size = 0; + guint64 mfra_offset = 0; + + /* default */ + qtdemux->fragmented = FALSE; + + /* We check here if it is a fragmented mp4 container */ + ret = qtdemux_parse_mfro (qtdemux, &mfra_offset, &mfra_size); + if (ret == GST_FLOW_OK && mfra_size != 0 && mfra_offset != 0) { + qtdemux->fragmented = TRUE; + GST_DEBUG_OBJECT (qtdemux, + "mfra atom expected at offset %" G_GUINT64_FORMAT, mfra_offset); + qtdemux->mfra_offset = mfra_offset; + } +} +#endif + +static GstFlowReturn +gst_qtdemux_loop_state_header (GstQTDemux * qtdemux) +{ + guint64 length = 0; + guint32 fourcc = 0; + GstBuffer *buf = NULL; + GstFlowReturn ret = GST_FLOW_OK; + guint64 cur_offset = qtdemux->offset; + + ret = gst_pad_pull_range (qtdemux->sinkpad, cur_offset, 16, &buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto beach; + if (G_LIKELY (GST_BUFFER_SIZE (buf) >= 8)) + extract_initial_length_and_fourcc (GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf), &length, &fourcc); + gst_buffer_unref (buf); + + /* maybe we already got most we needed, so only consider this eof */ + if (G_UNLIKELY (length == 0)) { + GST_ELEMENT_WARNING (qtdemux, STREAM, DEMUX, + (_("Invalid atom size.")), + ("Header atom '%" GST_FOURCC_FORMAT "' has empty length", + GST_FOURCC_ARGS (fourcc))); + ret = GST_FLOW_UNEXPECTED; + goto beach; + } + + switch (fourcc) { + case FOURCC_moof: + /* record for later parsing when needed */ + if (!qtdemux->moof_offset) { + qtdemux->moof_offset = qtdemux->offset; + } + /* fall-through */ + case FOURCC_mdat: + case FOURCC_free: + case FOURCC_PICT: + { + GST_LOG_OBJECT (qtdemux, + "skipping atom '%" GST_FOURCC_FORMAT "' at %" G_GUINT64_FORMAT, + GST_FOURCC_ARGS (fourcc), cur_offset); + qtdemux->offset += length; + break; + } + case FOURCC_moov: + { + GstBuffer *moov; + + if (qtdemux->got_moov) { + GST_DEBUG_OBJECT (qtdemux, "Skipping moov atom as we have one already"); + qtdemux->offset += length; + goto beach; + } + + ret = gst_pad_pull_range (qtdemux->sinkpad, cur_offset, length, &moov); + if (ret != GST_FLOW_OK) + goto beach; + if (length != GST_BUFFER_SIZE (moov)) { + /* Some files have a 'moov' atom at the end of the file which contains + * a terminal 'free' atom where the body of the atom is missing. + * Check for, and permit, this special case. + */ + if (GST_BUFFER_SIZE (moov) >= 8) { + guint8 *final_data = GST_BUFFER_DATA (moov) + + (GST_BUFFER_SIZE (moov) - 8); + guint32 final_length = QT_UINT32 (final_data); + guint32 final_fourcc = QT_FOURCC (final_data + 4); + if (final_fourcc == FOURCC_free && + GST_BUFFER_SIZE (moov) + final_length - 8 == length) { + /* Ok, we've found that special case. Allocate a new buffer with + * that free atom actually present. */ + GstBuffer *newmoov = gst_buffer_new_and_alloc (length); + gst_buffer_copy_metadata (newmoov, moov, + GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS | + GST_BUFFER_COPY_CAPS); + memcpy (GST_BUFFER_DATA (newmoov), GST_BUFFER_DATA (moov), + GST_BUFFER_SIZE (moov)); + memset (GST_BUFFER_DATA (newmoov) + GST_BUFFER_SIZE (moov), 0, + final_length - 8); + gst_buffer_unref (moov); + moov = newmoov; + } + } + } + + if (length != GST_BUFFER_SIZE (moov)) { + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is incomplete and cannot be played.")), + ("We got less than expected (received %u, wanted %u, offset %" + G_GUINT64_FORMAT ")", + GST_BUFFER_SIZE (moov), (guint) length, cur_offset)); + gst_buffer_unref (moov); + ret = GST_FLOW_ERROR; + goto beach; + } + qtdemux->offset += length; + + qtdemux_parse_moov (qtdemux, GST_BUFFER_DATA (moov), length); + qtdemux_node_dump (qtdemux, qtdemux->moov_node); + + qtdemux_parse_tree (qtdemux); + g_node_destroy (qtdemux->moov_node); + gst_buffer_unref (moov); + qtdemux->moov_node = NULL; + qtdemux->got_moov = TRUE; + + break; + } + case FOURCC_ftyp: + { + GstBuffer *ftyp; + + /* extract major brand; might come in handy for ISO vs QT issues */ + ret = gst_qtdemux_pull_atom (qtdemux, cur_offset, length, &ftyp); + if (ret != GST_FLOW_OK) + goto beach; + qtdemux->offset += length; + qtdemux_parse_ftyp (qtdemux, GST_BUFFER_DATA (ftyp), + GST_BUFFER_SIZE (ftyp)); + if (qtdemux->major_brand == FOURCC_qt__) { + GST_ERROR_OBJECT (qtdemux, "Unsupported major brand..."); + return GST_FLOW_ERROR; + } + gst_buffer_unref (ftyp); + break; + } + case FOURCC_uuid: + { + GstBuffer *uuid; + + /* uuid are extension atoms */ + ret = gst_qtdemux_pull_atom (qtdemux, cur_offset, length, &uuid); + if (ret != GST_FLOW_OK) + goto beach; + qtdemux->offset += length; + qtdemux_parse_uuid (qtdemux, GST_BUFFER_DATA (uuid), + GST_BUFFER_SIZE (uuid)); + gst_buffer_unref (uuid); + break; + } + default: + { + GstBuffer *unknown; + + GST_LOG_OBJECT (qtdemux, + "unknown %08x '%" GST_FOURCC_FORMAT "' of size %" G_GUINT64_FORMAT + " at %" G_GUINT64_FORMAT, fourcc, GST_FOURCC_ARGS (fourcc), length, + cur_offset); + ret = gst_qtdemux_pull_atom (qtdemux, cur_offset, length, &unknown); + if (ret != GST_FLOW_OK) + goto beach; + GST_MEMDUMP ("Unknown tag", GST_BUFFER_DATA (unknown), + GST_BUFFER_SIZE (unknown)); + gst_buffer_unref (unknown); + qtdemux->offset += length; + break; + } + } + +beach: + if (ret == GST_FLOW_UNEXPECTED && qtdemux->got_moov) { + /* digested all data, show what we have */ + ret = qtdemux_expose_streams (qtdemux); + + /* Only post, event on pads is done after newsegment */ + qtdemux_post_global_tags (qtdemux); + + qtdemux->state = QTDEMUX_STATE_MOVIE; + GST_DEBUG_OBJECT (qtdemux, "switching state to STATE_MOVIE (%d)", + qtdemux->state); + return ret; + } + return ret; +} + +/* Seeks to the previous keyframe of the indexed stream and + * aligns other streams with respect to the keyframe timestamp + * of indexed stream. Only called in case of Reverse Playback + */ +static GstFlowReturn +gst_qtdemux_seek_to_previous_keyframe (GstQTDemux * qtdemux) +{ + guint8 n = 0; + guint32 seg_idx = 0, k_index = 0; + guint32 ref_seg_idx, ref_k_index; + guint64 k_pos = 0, last_stop = 0; + QtDemuxSegment *seg = NULL; + QtDemuxStream *ref_str = NULL; + guint64 seg_media_start_mov; /* segment media start time in mov format */ +#ifdef QTDEMUX_MODIFICATION + QtDemuxSample *sample; + gdouble minusone = -1; + guint64 time_position = GST_CLOCK_TIME_NONE; +#endif + + /* Now we choose an arbitrary stream, get the previous keyframe timestamp + * and finally align all the other streams on that timestamp with their + * respective keyframes */ + for (n = 0; n < qtdemux->n_streams; n++) { + QtDemuxStream *str = qtdemux->streams[n]; + +#ifdef QTDEMUX_MODIFICATION + sample = &str->samples[str->sample_index]; + + if((time_position - (minusone *qtdemux->segment.rate)*sample->duration)>0) + time_position -= (minusone *qtdemux->segment.rate)*sample->duration; + else + time_position = 0; + + seg_idx = gst_qtdemux_find_segment (qtdemux, str, + time_position); +#else + seg_idx = gst_qtdemux_find_segment (qtdemux, str, + qtdemux->segment.last_stop); +#endif + + /* segment not found, continue with normal flow */ + if (seg_idx == -1) + continue; + + /* No candidate yet, take that one */ + if (!ref_str) { + ref_str = str; + continue; + } + + /* So that stream has a segment, we prefer video streams */ + if (str->subtype == FOURCC_vide) { + ref_str = str; + break; + } + } + + if (G_UNLIKELY (!ref_str)) { + GST_DEBUG_OBJECT (qtdemux, "couldn't find any stream"); + goto eos; + } + + if (G_UNLIKELY (!ref_str->from_sample)) { + GST_DEBUG_OBJECT (qtdemux, "reached the beginning of the file"); + goto eos; + } + + /* So that stream has been playing from from_sample to to_sample. We will + * get the timestamp of the previous sample and search for a keyframe before + * that. For audio streams we do an arbitrary jump in the past (10 samples) */ + if (ref_str->subtype == FOURCC_vide) { + k_index = gst_qtdemux_find_keyframe (qtdemux, ref_str, + ref_str->from_sample - 1); + } else { + if (ref_str->from_sample >= 10) + k_index = ref_str->from_sample - 10; + else + k_index = 0; + } + + /* get current segment for that stream */ + seg = &ref_str->segments[ref_str->segment_index]; + /* convert seg->media_start to mov format time for timestamp comparison */ + seg_media_start_mov = + gst_util_uint64_scale (seg->media_start, ref_str->timescale, GST_SECOND); + /* Crawl back through segments to find the one containing this I frame */ + while (ref_str->samples[k_index].timestamp < seg_media_start_mov) { + GST_DEBUG_OBJECT (qtdemux, "keyframe position is out of segment %u", + ref_str->segment_index); + if (G_UNLIKELY (!ref_str->segment_index)) { + /* Reached first segment, let's consider it's EOS */ + goto eos; + } + ref_str->segment_index--; + seg = &ref_str->segments[ref_str->segment_index]; + /* convert seg->media_start to mov format time for timestamp comparison */ + seg_media_start_mov = + gst_util_uint64_scale (seg->media_start, ref_str->timescale, + GST_SECOND); + } + /* Calculate time position of the keyframe and where we should stop */ + k_pos = + (gst_util_uint64_scale (ref_str->samples[k_index].timestamp, GST_SECOND, + ref_str->timescale) - seg->media_start) + seg->time; + last_stop = + gst_util_uint64_scale (ref_str->samples[ref_str->from_sample].timestamp, + GST_SECOND, ref_str->timescale); + last_stop = (last_stop - seg->media_start) + seg->time; + + GST_DEBUG_OBJECT (qtdemux, "preferred stream played from sample %u, " + "now going to sample %u (pts %" GST_TIME_FORMAT ")", ref_str->from_sample, + k_index, GST_TIME_ARGS (k_pos)); + + /* Set last_stop with the keyframe timestamp we pushed of that stream */ + gst_segment_set_last_stop (&qtdemux->segment, GST_FORMAT_TIME, last_stop); + GST_DEBUG_OBJECT (qtdemux, "last_stop now is %" GST_TIME_FORMAT, + GST_TIME_ARGS (last_stop)); + + if (G_UNLIKELY (last_stop < qtdemux->segment.start)) { + GST_DEBUG_OBJECT (qtdemux, "reached the beginning of segment"); + goto eos; + } + + ref_seg_idx = ref_str->segment_index; + ref_k_index = k_index; + + /* Align them all on this */ + for (n = 0; n < qtdemux->n_streams; n++) { + guint32 index = 0; + guint64 media_start = 0, seg_time = 0; + QtDemuxStream *str = qtdemux->streams[n]; + + /* aligning reference stream again might lead to backing up to yet another + * keyframe (due to timestamp rounding issues), + * potentially putting more load on downstream; so let's try to avoid */ + if (str == ref_str) { + seg_idx = ref_seg_idx; + seg = &str->segments[seg_idx]; + k_index = ref_k_index; + GST_DEBUG_OBJECT (qtdemux, "reference stream segment %d, " + "sample at index %d", ref_str->segment_index, k_index); + } else { + seg_idx = gst_qtdemux_find_segment (qtdemux, str, k_pos); + GST_DEBUG_OBJECT (qtdemux, "align segment %d", seg_idx); + + /* segment not found, continue with normal flow */ + if (seg_idx == -1) + continue; + + /* get segment and time in the segment */ + seg = &str->segments[seg_idx]; + seg_time = k_pos - seg->time; + + /* get the media time in the segment */ + media_start = seg->media_start + seg_time; + + /* get the index of the sample with media time */ + index = gst_qtdemux_find_index_linear (qtdemux, str, media_start); + GST_DEBUG_OBJECT (qtdemux, "sample for %" GST_TIME_FORMAT " at %u", + GST_TIME_ARGS (media_start), index); + + /* find previous keyframe */ + k_index = gst_qtdemux_find_keyframe (qtdemux, str, index); + } + + /* Remember until where we want to go */ + str->to_sample = str->from_sample - 1; + /* Define our time position */ + str->time_position = + (gst_util_uint64_scale (str->samples[k_index].timestamp, GST_SECOND, + str->timescale) - seg->media_start) + seg->time; + /* Now seek back in time */ + gst_qtdemux_move_stream (qtdemux, str, k_index); + GST_DEBUG_OBJECT (qtdemux, "keyframe at %u, time position %" + GST_TIME_FORMAT " playing from sample %u to %u", k_index, + GST_TIME_ARGS (str->time_position), str->from_sample, str->to_sample); + } + + return GST_FLOW_OK; + +eos: + return GST_FLOW_UNEXPECTED; +} + +/* activate the given segment number @seg_idx of @stream at time @offset. + * @offset is an absolute global position over all the segments. + * + * This will push out a NEWSEGMENT event with the right values and + * position the stream index to the first decodable sample before + * @offset. + */ +static gboolean +gst_qtdemux_activate_segment (GstQTDemux * qtdemux, QtDemuxStream * stream, + guint32 seg_idx, guint64 offset) +{ + GstEvent *event; + QtDemuxSegment *segment; + guint32 index, kf_index; + guint64 seg_time; + guint64 start, stop, time; + gdouble rate; + + GST_LOG_OBJECT (qtdemux, "activate segment %d, offset %" G_GUINT64_FORMAT, + seg_idx, offset); + + /* update the current segment */ + stream->segment_index = seg_idx; + + /* get the segment */ + segment = &stream->segments[seg_idx]; + + if (G_UNLIKELY (offset < segment->time)) { + GST_WARNING_OBJECT (qtdemux, "offset < segment->time %" G_GUINT64_FORMAT, + segment->time); + return FALSE; + } + + /* segment lies beyond total indicated duration */ + if (G_UNLIKELY (qtdemux->segment.duration != -1 && + segment->time > qtdemux->segment.duration)) { + GST_WARNING_OBJECT (qtdemux, "file duration %" G_GINT64_FORMAT + " < segment->time %" G_GUINT64_FORMAT, qtdemux->segment.duration, + segment->time); + return FALSE; + } + + /* get time in this segment */ + seg_time = offset - segment->time; + + GST_LOG_OBJECT (qtdemux, "seg_time %" GST_TIME_FORMAT, + GST_TIME_ARGS (seg_time)); + + if (G_UNLIKELY (seg_time > segment->duration)) { + GST_LOG_OBJECT (qtdemux, "seg_time > segment->duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (segment->duration)); + return FALSE; + } + + /* qtdemux->segment.stop is in outside-time-realm, whereas + * segment->media_stop is in track-time-realm. + * + * In order to compare the two, we need to bring segment.stop + * into the track-time-realm */ + + stop = qtdemux->segment.stop; + if (stop == -1) + stop = qtdemux->segment.duration; + if (stop == -1) + stop = segment->media_stop; + else + stop = + MIN (segment->media_stop, stop - segment->time + segment->media_start); + + if (qtdemux->segment.rate >= 0) { + start = MIN (segment->media_start + seg_time, stop); + time = offset; + } else { + if (segment->media_start >= qtdemux->segment.start) { + start = segment->media_start; + time = segment->time; + } else { + start = qtdemux->segment.start; + time = segment->time + (qtdemux->segment.start - segment->media_start); + } + + start = MAX (segment->media_start, qtdemux->segment.start); + stop = MIN (segment->media_start + seg_time, stop); + } + + GST_DEBUG_OBJECT (qtdemux, "newsegment %d from %" GST_TIME_FORMAT + " to %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT, seg_idx, + GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (time)); + + /* combine global rate with that of the segment */ + rate = segment->rate * qtdemux->segment.rate; + + /* update the segment values used for clipping */ + gst_segment_init (&stream->segment, GST_FORMAT_TIME); + gst_segment_set_newsegment (&stream->segment, FALSE, rate, GST_FORMAT_TIME, + start, stop, time); + + /* now prepare and send the segment */ + if (stream->pad) { + event = gst_event_new_new_segment (FALSE, rate, GST_FORMAT_TIME, + start, stop, time); + gst_pad_push_event (stream->pad, event); + /* assume we can send more data now */ + stream->last_ret = GST_FLOW_OK; + /* clear to send tags on this pad now */ + gst_qtdemux_push_tags (qtdemux, stream); + } + + /* and move to the keyframe before the indicated media time of the + * segment */ + if (qtdemux->segment.rate >= 0) { + index = gst_qtdemux_find_index_linear (qtdemux, stream, start); + stream->to_sample = G_MAXUINT32; + GST_DEBUG_OBJECT (qtdemux, "moving data pointer to %" GST_TIME_FORMAT + ", index: %u, pts %" GST_TIME_FORMAT, GST_TIME_ARGS (start), index, + GST_TIME_ARGS (gst_util_uint64_scale (stream->samples[index].timestamp, + GST_SECOND, stream->timescale))); + } else { + index = gst_qtdemux_find_index_linear (qtdemux, stream, stop); + stream->to_sample = index; + GST_DEBUG_OBJECT (qtdemux, "moving data pointer to %" GST_TIME_FORMAT + ", index: %u, pts %" GST_TIME_FORMAT, GST_TIME_ARGS (stop), index, + GST_TIME_ARGS (gst_util_uint64_scale (stream->samples[index].timestamp, + GST_SECOND, stream->timescale))); + } + + /* gst_qtdemux_parse_sample () called from gst_qtdemux_find_index_linear () + * encountered an error and printed a message so we return appropriately */ + if (index == -1) + return FALSE; + + /* we're at the right spot */ + if (index == stream->sample_index) { + GST_DEBUG_OBJECT (qtdemux, "we are at the right index"); + return TRUE; + } + + /* find keyframe of the target index */ + kf_index = gst_qtdemux_find_keyframe (qtdemux, stream, index); + +/* *INDENT-OFF* */ +/* indent does stupid stuff with stream->samples[].timestamp */ + + /* if we move forwards, we don't have to go back to the previous + * keyframe since we already sent that. We can also just jump to + * the keyframe right before the target index if there is one. */ + if (index > stream->sample_index) { + /* moving forwards check if we move past a keyframe */ + if (kf_index > stream->sample_index) { + GST_DEBUG_OBJECT (qtdemux, + "moving forwards to keyframe at %u (pts %" GST_TIME_FORMAT, kf_index, + GST_TIME_ARGS (gst_util_uint64_scale ( + stream->samples[kf_index].timestamp, + GST_SECOND, stream->timescale))); + gst_qtdemux_move_stream (qtdemux, stream, kf_index); + } else { + GST_DEBUG_OBJECT (qtdemux, + "moving forwards, keyframe at %u (pts %" GST_TIME_FORMAT + " already sent", kf_index, + GST_TIME_ARGS (gst_util_uint64_scale ( + stream->samples[kf_index].timestamp, + GST_SECOND, stream->timescale))); + } + } else { + GST_DEBUG_OBJECT (qtdemux, + "moving backwards to keyframe at %u (pts %" GST_TIME_FORMAT, kf_index, + GST_TIME_ARGS (gst_util_uint64_scale ( + stream->samples[kf_index].timestamp, + GST_SECOND, stream->timescale))); + gst_qtdemux_move_stream (qtdemux, stream, kf_index); + } + +/* *INDENT-ON* */ + + return TRUE; +} + +/* prepare to get the current sample of @stream, getting essential values. + * + * This function will also prepare and send the segment when needed. + * + * Return FALSE if the stream is EOS. + */ +static gboolean +gst_qtdemux_prepare_current_sample (GstQTDemux * qtdemux, + QtDemuxStream * stream, guint64 * offset, guint * size, guint64 * timestamp, + guint64 * duration, gboolean * keyframe) +{ + QtDemuxSample *sample; + guint64 time_position; + guint32 seg_idx; + + g_return_val_if_fail (stream != NULL, FALSE); + + time_position = stream->time_position; + if (G_UNLIKELY (time_position == -1)) + goto eos; + + seg_idx = stream->segment_index; + if (G_UNLIKELY (seg_idx == -1)) { + /* find segment corresponding to time_position if we are looking + * for a segment. */ + seg_idx = gst_qtdemux_find_segment (qtdemux, stream, time_position); + + /* nothing found, we're really eos */ + if (seg_idx == -1) + goto eos; + } + + /* different segment, activate it, sample_index will be set. */ + if (G_UNLIKELY (stream->segment_index != seg_idx)) + gst_qtdemux_activate_segment (qtdemux, stream, seg_idx, time_position); + + GST_LOG_OBJECT (qtdemux, "segment active, index = %u of %u", + stream->sample_index, stream->n_samples); + + if (G_UNLIKELY (stream->sample_index >= stream->n_samples)) + goto eos; + + if (!qtdemux_parse_samples (qtdemux, stream, stream->sample_index)) { + GST_LOG_OBJECT (qtdemux, "Parsing of index %u failed!", + stream->sample_index); + return FALSE; + } + + /* now get the info for the sample we're at */ + sample = &stream->samples[stream->sample_index]; + + *timestamp = QTSAMPLE_PTS (stream, sample); + *offset = sample->offset; + *size = sample->size; + *duration = QTSAMPLE_DUR_PTS (stream, sample, *timestamp); + *keyframe = QTSAMPLE_KEYFRAME (stream, sample); + +#ifdef QTDEMUX_MODIFICATION + if (qtdemux->segment.rate > 1.0 && (FOURCC_vide == stream->subtype)) { + /* forward trick play */ + gst_qtdemux_forward_trickplay (qtdemux, stream, timestamp); + } + else if (qtdemux->segment.rate < 0.0 && (FOURCC_vide == stream->subtype)) { + /* backward trick play */ + gst_qtdemux_backward_trickplay (qtdemux, stream, timestamp); + } + #endif + + return TRUE; + + /* special cases */ +eos: + { + stream->time_position = -1; + return FALSE; + } +} + +/* move to the next sample in @stream. + * + * Moves to the next segment when needed. + */ +static void +gst_qtdemux_advance_sample (GstQTDemux * qtdemux, QtDemuxStream * stream) +{ + QtDemuxSample *sample; + QtDemuxSegment *segment; + + if (G_UNLIKELY (stream->sample_index >= stream->to_sample)) { + /* Mark the stream as EOS */ + GST_DEBUG_OBJECT (qtdemux, + "reached max allowed sample %u, mark EOS", stream->to_sample); + stream->time_position = -1; + return; + } + + /* move to next sample */ + stream->sample_index++; + + /* get current segment */ + segment = &stream->segments[stream->segment_index]; + + /* reached the last sample, we need the next segment */ + if (G_UNLIKELY (stream->sample_index >= stream->n_samples)) + goto next_segment; + + if (!qtdemux_parse_samples (qtdemux, stream, stream->sample_index)) { + GST_LOG_OBJECT (qtdemux, "Parsing of index %u failed!", + stream->sample_index); + return; + } + + /* get next sample */ + sample = &stream->samples[stream->sample_index]; + + /* see if we are past the segment */ + if (G_UNLIKELY (gst_util_uint64_scale (sample->timestamp, + GST_SECOND, stream->timescale) >= segment->media_stop)) + goto next_segment; + + if (gst_util_uint64_scale (sample->timestamp, GST_SECOND, + stream->timescale) >= segment->media_start) { + /* inside the segment, update time_position, looks very familiar to + * GStreamer segments, doesn't it? */ + stream->time_position = + (gst_util_uint64_scale (sample->timestamp, GST_SECOND, + stream->timescale) - segment->media_start) + segment->time; + } else { + /* not yet in segment, time does not yet increment. This means + * that we are still prerolling keyframes to the decoder so it can + * decode the first sample of the segment. */ + stream->time_position = segment->time; + } + return; + + /* move to the next segment */ +next_segment: + { + GST_DEBUG_OBJECT (qtdemux, "segment %d ended ", stream->segment_index); + + if (stream->segment_index == stream->n_segments - 1) { + /* are we at the end of the last segment, we're EOS */ + stream->time_position = -1; + } else { + /* else we're only at the end of the current segment */ + stream->time_position = segment->stop_time; + } + /* make sure we select a new segment */ + stream->segment_index = -1; + } +} + +static void +gst_qtdemux_sync_streams (GstQTDemux * demux) +{ + gint i; + + if (demux->n_streams <= 1) + return; + + for (i = 0; i < demux->n_streams; i++) { + QtDemuxStream *stream; + GstClockTime end_time; + + stream = demux->streams[i]; + + if (!stream->pad) + continue; + + /* TODO advance time on subtitle streams here, if any some day */ + + /* some clips/trailers may have unbalanced streams at the end, + * so send EOS on shorter stream to prevent stalling others */ + + /* do not mess with EOS if SEGMENT seeking */ + if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) + continue; + + if (demux->pullbased) { + /* loop mode is sample time based */ + if (stream->time_position != -1) + continue; + } else { + /* push mode is byte position based */ + if (stream->n_samples && + stream->samples[stream->n_samples - 1].offset >= demux->offset) + continue; + } + + if (stream->sent_eos) + continue; + + /* only act if some gap */ + end_time = stream->segments[stream->n_segments - 1].stop_time; + GST_LOG_OBJECT (demux, "current position: %" GST_TIME_FORMAT + ", stream end: %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->segment.last_stop), GST_TIME_ARGS (end_time)); + if (end_time + 2 * GST_SECOND < demux->segment.last_stop) { + GST_DEBUG_OBJECT (demux, "sending EOS for stream %s", + GST_PAD_NAME (stream->pad)); + stream->sent_eos = TRUE; + gst_pad_push_event (stream->pad, gst_event_new_eos ()); + } + } +} + +/* UNEXPECTED and NOT_LINKED need to be combined. This means that we return: + * + * GST_FLOW_NOT_LINKED: when all pads NOT_LINKED. + * GST_FLOW_UNEXPECTED: when all pads UNEXPECTED or NOT_LINKED. + */ +static GstFlowReturn +gst_qtdemux_combine_flows (GstQTDemux * demux, QtDemuxStream * stream, + GstFlowReturn ret) +{ + gint i; + gboolean unexpected = FALSE, not_linked = TRUE; + + GST_LOG_OBJECT (demux, "flow return: %s", gst_flow_get_name (ret)); + + /* store the value */ + stream->last_ret = ret; + + /* any other error that is not-linked or eos can be returned right away */ + if (G_LIKELY (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_NOT_LINKED)) + goto done; + + /* only return NOT_LINKED if all other pads returned NOT_LINKED */ + for (i = 0; i < demux->n_streams; i++) { + QtDemuxStream *ostream = demux->streams[i]; + + ret = ostream->last_ret; + + /* no unexpected or unlinked, return */ + if (G_LIKELY (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_NOT_LINKED)) + goto done; + + /* we check to see if we have at least 1 unexpected or all unlinked */ + unexpected |= (ret == GST_FLOW_UNEXPECTED); + not_linked &= (ret == GST_FLOW_NOT_LINKED); + } + + /* when we get here, we all have unlinked or unexpected */ + if (not_linked) + ret = GST_FLOW_NOT_LINKED; + else if (unexpected) + ret = GST_FLOW_UNEXPECTED; +done: + GST_LOG_OBJECT (demux, "combined flow return: %s", gst_flow_get_name (ret)); + return ret; +} + +/* the input buffer metadata must be writable. Returns NULL when the buffer is + * completely cliped */ +static GstBuffer * +gst_qtdemux_clip_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream, + GstBuffer * buf) +{ + gint64 start, stop, cstart, cstop, diff; + GstClockTime timestamp = GST_CLOCK_TIME_NONE, duration = GST_CLOCK_TIME_NONE; + guint8 *data; + guint size; + gint num_rate, denom_rate; + gint frame_size; + gboolean clip_data; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* depending on the type, setup the clip parameters */ + if (stream->subtype == FOURCC_soun) { + frame_size = stream->bytes_per_frame; + num_rate = GST_SECOND; + denom_rate = (gint) stream->rate; + clip_data = TRUE; + } else if (stream->subtype == FOURCC_vide) { + frame_size = size; + num_rate = stream->fps_n; + denom_rate = stream->fps_d; + clip_data = FALSE; + } else + goto wrong_type; + + /* we can only clip if we have a valid timestamp */ + timestamp = GST_BUFFER_TIMESTAMP (buf); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) + goto no_timestamp; + + if (G_LIKELY (GST_BUFFER_DURATION_IS_VALID (buf))) { + duration = GST_BUFFER_DURATION (buf); + } else { + duration = + gst_util_uint64_scale_int (size / frame_size, num_rate, denom_rate); + } + + start = timestamp; + stop = start + duration; + + if (G_UNLIKELY (!gst_segment_clip (&stream->segment, + GST_FORMAT_TIME, start, stop, &cstart, &cstop))) + goto clipped; + + /* see if some clipping happened */ + diff = cstart - start; + if (diff > 0) { + timestamp = cstart; + duration -= diff; + + if (clip_data) { + /* bring clipped time to samples and to bytes */ + diff = gst_util_uint64_scale_int (diff, denom_rate, num_rate); + diff *= frame_size; + + GST_DEBUG_OBJECT (qtdemux, + "clipping start to %" GST_TIME_FORMAT " %" + G_GUINT64_FORMAT " bytes", GST_TIME_ARGS (cstart), diff); + + data += diff; + size -= diff; + } + } + diff = stop - cstop; + if (diff > 0) { + duration -= diff; + + if (clip_data) { + /* bring clipped time to samples and then to bytes */ + diff = gst_util_uint64_scale_int (diff, denom_rate, num_rate); + diff *= frame_size; + GST_DEBUG_OBJECT (qtdemux, + "clipping stop to %" GST_TIME_FORMAT " %" G_GUINT64_FORMAT + " bytes", GST_TIME_ARGS (cstop), diff); + size -= diff; + } + } + + GST_BUFFER_TIMESTAMP (buf) = timestamp; + GST_BUFFER_DURATION (buf) = duration; + GST_BUFFER_SIZE (buf) = size; + GST_BUFFER_DATA (buf) = data; + + return buf; + + /* dropped buffer */ +wrong_type: + { + GST_DEBUG_OBJECT (qtdemux, "unknown stream type"); + return buf; + } +no_timestamp: + { + GST_DEBUG_OBJECT (qtdemux, "no timestamp on buffer"); + return buf; + } +clipped: + { + GST_DEBUG_OBJECT (qtdemux, "clipped buffer"); + gst_buffer_unref (buf); + return NULL; + } +} + +/* the input buffer metadata must be writable, + * but time/duration etc not yet set and need not be preserved */ +static GstBuffer * +gst_qtdemux_process_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream, + GstBuffer * buf) +{ + guint8 *data; + guint size, nsize = 0; + gchar *str; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* not many cases for now */ + if (G_UNLIKELY (stream->fourcc == FOURCC_mp4s)) { + /* send a one time dvd clut event */ + if (stream->pending_event && stream->pad) + gst_pad_push_event (stream->pad, stream->pending_event); + stream->pending_event = NULL; + /* no further processing needed */ + stream->need_process = FALSE; + } + + if (G_UNLIKELY (stream->subtype != FOURCC_text)) { + return buf; + } + + if (G_LIKELY (size >= 2)) { + nsize = GST_READ_UINT16_BE (data); + nsize = MIN (nsize, size - 2); + } + + GST_LOG_OBJECT (qtdemux, "3GPP timed text subtitle: %d/%d", nsize, size); + + /* takes care of UTF-8 validation or UTF-16 recognition, + * no other encoding expected */ + str = gst_tag_freeform_string_to_utf8 ((gchar *) data + 2, nsize, NULL); + if (str) { + gst_buffer_unref (buf); + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = (guint8 *) str; + GST_BUFFER_SIZE (buf) = strlen (str); + } else { + /* may be 0-size subtitle, which is also sent to keep pipeline going */ + GST_BUFFER_DATA (buf) = data + 2; + GST_BUFFER_SIZE (buf) = nsize; + } + + /* FIXME ? convert optional subsequent style info to markup */ + + return buf; +} + +/* Sets a buffer's attributes properly and pushes it downstream. + * Also checks for additional actions and custom processing that may + * need to be done first. + */ +static gboolean +gst_qtdemux_decorate_and_push_buffer (GstQTDemux * qtdemux, + QtDemuxStream * stream, GstBuffer * buf, + guint64 timestamp, guint64 duration, gboolean keyframe, guint64 position, + guint64 byte_position) +{ + GstFlowReturn ret = GST_FLOW_OK; + + if (G_UNLIKELY (stream->fourcc == FOURCC_rtsp)) { + gchar *url; + + url = g_strndup ((gchar *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + if (url != NULL && strlen (url) != 0) { + /* we have RTSP redirect now */ + gst_element_post_message (GST_ELEMENT_CAST (qtdemux), + gst_message_new_element (GST_OBJECT_CAST (qtdemux), + gst_structure_new ("redirect", + "new-location", G_TYPE_STRING, url, NULL))); + qtdemux->posted_redirect = TRUE; + } else { + GST_WARNING_OBJECT (qtdemux, "Redirect URI of stream is empty, not " + "posting"); + } + g_free (url); + } + + /* position reporting */ + if (qtdemux->segment.rate >= 0) { + gst_segment_set_last_stop (&qtdemux->segment, GST_FORMAT_TIME, position); + gst_qtdemux_sync_streams (qtdemux); + } + + if (G_UNLIKELY (!stream->pad)) { + GST_DEBUG_OBJECT (qtdemux, "No output pad for stream, ignoring"); + gst_buffer_unref (buf); + goto exit; + } + + /* send out pending buffers */ + while (stream->buffers) { + GstBuffer *buffer = (GstBuffer *) stream->buffers->data; + + if (G_UNLIKELY (stream->discont)) { + GST_LOG_OBJECT (qtdemux, "marking discont buffer"); + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + gst_buffer_set_caps (buffer, stream->caps); + + gst_pad_push (stream->pad, buffer); + + stream->buffers = g_slist_delete_link (stream->buffers, stream->buffers); + } + + /* we're going to modify the metadata */ + buf = gst_buffer_make_metadata_writable (buf); + + if (G_UNLIKELY (stream->need_process)) + buf = gst_qtdemux_process_buffer (qtdemux, stream, buf); + + GST_BUFFER_TIMESTAMP (buf) = timestamp; + GST_BUFFER_DURATION (buf) = duration; + GST_BUFFER_OFFSET (buf) = -1; + GST_BUFFER_OFFSET_END (buf) = -1; + + if (G_UNLIKELY (stream->padding)) { + GST_BUFFER_DATA (buf) += stream->padding; + GST_BUFFER_SIZE (buf) -= stream->padding; + } + + if (G_UNLIKELY (qtdemux->element_index)) { + GstClockTime stream_time; + + stream_time = + gst_segment_to_stream_time (&stream->segment, GST_FORMAT_TIME, + timestamp); + if (GST_CLOCK_TIME_IS_VALID (stream_time)) { + GST_LOG_OBJECT (qtdemux, + "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT, GST_TIME_ARGS (stream_time), byte_position); + gst_index_add_association (qtdemux->element_index, + qtdemux->index_id, + keyframe ? GST_ASSOCIATION_FLAG_KEY_UNIT : + GST_ASSOCIATION_FLAG_DELTA_UNIT, GST_FORMAT_TIME, stream_time, + GST_FORMAT_BYTES, byte_position, NULL); + } + } + + if (stream->need_clip) + buf = gst_qtdemux_clip_buffer (qtdemux, stream, buf); + + if (G_UNLIKELY (buf == NULL)) + goto exit; + + if (G_UNLIKELY (stream->discont)) { + GST_LOG_OBJECT (qtdemux, "marking discont buffer"); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + } + + if (!keyframe) + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); + + gst_buffer_set_caps (buf, stream->caps); + + GST_LOG_OBJECT (qtdemux, + "Pushing buffer with time %" GST_TIME_FORMAT ", duration %" + GST_TIME_FORMAT " on pad %s", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_PAD_NAME (stream->pad)); + + ret = gst_pad_push (stream->pad, buf); + +exit: + return ret; +} + +static GstFlowReturn +gst_qtdemux_loop_state_movie (GstQTDemux * qtdemux) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *buf = NULL; + QtDemuxStream *stream; + guint64 min_time; + guint64 offset = 0; + guint64 timestamp = GST_CLOCK_TIME_NONE; + guint64 duration = 0; + gboolean keyframe = FALSE; + guint size = 0; + gint index; + gint i; + + gst_qtdemux_push_pending_newsegment (qtdemux); + + /* Figure out the next stream sample to output, min_time is expressed in + * global time and runs over the edit list segments. */ + min_time = G_MAXUINT64; + index = -1; + for (i = 0; i < qtdemux->n_streams; i++) { + guint64 position; + + stream = qtdemux->streams[i]; + position = stream->time_position; + + /* position of -1 is EOS */ + if (position != -1 && position < min_time) { + min_time = position; + index = i; + } + } + /* all are EOS */ + if (G_UNLIKELY (index == -1)) { + GST_DEBUG_OBJECT (qtdemux, "all streams are EOS"); + goto eos; + } + + /* check for segment end */ + if (G_UNLIKELY (qtdemux->segment.stop != -1 + && qtdemux->segment.stop < min_time)) { + GST_DEBUG_OBJECT (qtdemux, "we reached the end of our segment."); + goto eos; + } + + stream = qtdemux->streams[index]; + + /* fetch info for the current sample of this stream */ + if (G_UNLIKELY (!gst_qtdemux_prepare_current_sample (qtdemux, stream, &offset, + &size, ×tamp, &duration, &keyframe))) + goto eos_stream; + + GST_LOG_OBJECT (qtdemux, + "pushing from stream %d, offset %" G_GUINT64_FORMAT + ", size %d, timestamp=%" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, + index, offset, size, GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration)); + + /* hmm, empty sample, skip and move to next sample */ + if (G_UNLIKELY (size <= 0)) + goto next; + + /* last pushed sample was out of boundary, goto next sample */ + if (G_UNLIKELY (stream->last_ret == GST_FLOW_UNEXPECTED)) + goto next; + + GST_LOG_OBJECT (qtdemux, "reading %d bytes @ %" G_GUINT64_FORMAT, size, + offset); + + ret = gst_qtdemux_pull_atom (qtdemux, offset, size, &buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto beach; + + ret = gst_qtdemux_decorate_and_push_buffer (qtdemux, stream, buf, + timestamp, duration, keyframe, min_time, offset); + + /* combine flows */ + ret = gst_qtdemux_combine_flows (qtdemux, stream, ret); + /* ignore unlinked, we will not push on the pad anymore and we will EOS when + * we have no more data for the pad to push */ + if (ret == GST_FLOW_UNEXPECTED) + ret = GST_FLOW_OK; + +next: + gst_qtdemux_advance_sample (qtdemux, stream); + +beach: + return ret; + + /* special cases */ +eos: + { + GST_DEBUG_OBJECT (qtdemux, "No samples left for any streams - EOS"); + ret = GST_FLOW_UNEXPECTED; + goto beach; + } +eos_stream: + { + GST_DEBUG_OBJECT (qtdemux, "No samples left for stream"); + /* EOS will be raised if all are EOS */ + ret = GST_FLOW_OK; + goto beach; + } +} + +static void +gst_qtdemux_loop (GstPad * pad) +{ + GstQTDemux *qtdemux; + guint64 cur_offset; + GstFlowReturn ret; + + qtdemux = GST_QTDEMUX (gst_pad_get_parent (pad)); + + cur_offset = qtdemux->offset; + GST_LOG_OBJECT (qtdemux, "loop at position %" G_GUINT64_FORMAT ", state %d", + cur_offset, qtdemux->state); + + switch (qtdemux->state) { + case QTDEMUX_STATE_INITIAL: + case QTDEMUX_STATE_HEADER: + ret = gst_qtdemux_loop_state_header (qtdemux); + break; + case QTDEMUX_STATE_MOVIE: + ret = gst_qtdemux_loop_state_movie (qtdemux); + if (qtdemux->segment.rate < 0 && ret == GST_FLOW_UNEXPECTED) { + ret = gst_qtdemux_seek_to_previous_keyframe (qtdemux); + } + break; + default: + /* ouch */ + goto invalid_state; + } + + /* if something went wrong, pause */ + if (ret != GST_FLOW_OK) + goto pause; + +done: + gst_object_unref (qtdemux); + return; + + /* ERRORS */ +invalid_state: + { + GST_ELEMENT_ERROR (qtdemux, STREAM, FAILED, + (NULL), ("streaming stopped, invalid state")); + qtdemux->segment_running = FALSE; + gst_pad_pause_task (pad); + gst_qtdemux_push_event (qtdemux, gst_event_new_eos ()); + goto done; + } +pause: + { + const gchar *reason = gst_flow_get_name (ret); + + GST_LOG_OBJECT (qtdemux, "pausing task, reason %s", reason); + + qtdemux->segment_running = FALSE; + gst_pad_pause_task (pad); + + /* fatal errors need special actions */ + /* check EOS */ + if (ret == GST_FLOW_UNEXPECTED) { + if (qtdemux->n_streams == 0) { + /* we have no streams, post an error */ + gst_qtdemux_post_no_playable_stream_error (qtdemux); + } + if (qtdemux->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gint64 stop; + + /* FIXME: I am not sure this is the right fix. If the sinks are + * supposed to detect the segment is complete and accumulate + * automatically, it does not seem to work here. Need more work */ + qtdemux->segment_running = TRUE; + + if ((stop = qtdemux->segment.stop) == -1) + stop = qtdemux->segment.duration; + + if (qtdemux->segment.rate >= 0) { + GST_LOG_OBJECT (qtdemux, "Sending segment done, at end of segment"); + gst_element_post_message (GST_ELEMENT_CAST (qtdemux), + gst_message_new_segment_done (GST_OBJECT_CAST (qtdemux), + GST_FORMAT_TIME, stop)); + } else { + /* For Reverse Playback */ + GST_LOG_OBJECT (qtdemux, "Sending segment done, at start of segment"); + gst_element_post_message (GST_ELEMENT_CAST (qtdemux), + gst_message_new_segment_done (GST_OBJECT_CAST (qtdemux), + GST_FORMAT_TIME, qtdemux->segment.start)); + } + } else { + GST_LOG_OBJECT (qtdemux, "Sending EOS at end of segment"); + gst_qtdemux_push_event (qtdemux, gst_event_new_eos ()); + } + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + GST_ELEMENT_ERROR (qtdemux, STREAM, FAILED, + (NULL), ("streaming stopped, reason %s", reason)); + gst_qtdemux_push_event (qtdemux, gst_event_new_eos ()); + } + goto done; + } +} + +/* + * next_entry_size + * + * Returns the size of the first entry at the current offset. + * If -1, there are none (which means EOS or empty file). + */ +static guint64 +next_entry_size (GstQTDemux * demux) +{ + QtDemuxStream *stream; + int i; + int smallidx = -1; + guint64 smalloffs = (guint64) - 1; + QtDemuxSample *sample; + + GST_LOG_OBJECT (demux, "Finding entry at offset %" G_GUINT64_FORMAT, + demux->offset); + + for (i = 0; i < demux->n_streams; i++) { + stream = demux->streams[i]; + + if (stream->sample_index == -1) + stream->sample_index = 0; + + if (stream->sample_index >= stream->n_samples) { + GST_LOG_OBJECT (demux, "stream %d samples exhausted", i); + continue; + } + + if (!qtdemux_parse_samples (demux, stream, stream->sample_index)) { + GST_LOG_OBJECT (demux, "Parsing of index %u from stbl atom failed!", + stream->sample_index); + return -1; + } + + sample = &stream->samples[stream->sample_index]; + + GST_LOG_OBJECT (demux, + "Checking Stream %d (sample_index:%d / offset:%" G_GUINT64_FORMAT + " / size:%" G_GUINT32_FORMAT ")", i, stream->sample_index, + sample->offset, sample->size); + + if (((smalloffs == -1) + || (sample->offset < smalloffs)) && (sample->size)) { + smallidx = i; + smalloffs = sample->offset; + } + } + + GST_LOG_OBJECT (demux, + "stream %d offset %" G_GUINT64_FORMAT " demux->offset :%" + G_GUINT64_FORMAT, smallidx, smalloffs, demux->offset); + + if (smallidx == -1) + return -1; + + stream = demux->streams[smallidx]; + sample = &stream->samples[stream->sample_index]; + + if (sample->offset >= demux->offset) { + demux->todrop = sample->offset - demux->offset; + return sample->size + demux->todrop; + } + + GST_DEBUG_OBJECT (demux, + "There wasn't any entry at offset %" G_GUINT64_FORMAT, demux->offset); + return -1; +} + +static void +gst_qtdemux_post_progress (GstQTDemux * demux, gint num, gint denom) +{ + gint perc = (gint) ((gdouble) num * 100.0 / (gdouble) denom); + + gst_element_post_message (GST_ELEMENT_CAST (demux), + gst_message_new_element (GST_OBJECT_CAST (demux), + gst_structure_new ("progress", "percent", G_TYPE_INT, perc, NULL))); +} + +static gboolean +qtdemux_seek_offset (GstQTDemux * demux, guint64 offset) +{ + GstEvent *event; + gboolean res = 0; + + GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset); + + event = + gst_event_new_seek (1.0, GST_FORMAT_BYTES, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, + GST_SEEK_TYPE_NONE, -1); + + res = gst_pad_push_event (demux->sinkpad, event); + + return res; +} + +/* check for seekable upstream, above and beyond a mere query */ +static void +gst_qtdemux_check_seekability (GstQTDemux * demux) +{ + GstQuery *query; + gboolean seekable = FALSE; + gint64 start = -1, stop = -1; + + if (demux->upstream_size) + return; + + query = gst_query_new_seeking (GST_FORMAT_BYTES); + if (!gst_pad_peer_query (demux->sinkpad, query)) { + GST_DEBUG_OBJECT (demux, "seeking query failed"); + goto done; + } + + gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); + + /* try harder to query upstream size if we didn't get it the first time */ + if (seekable && stop == -1) { + GstFormat fmt = GST_FORMAT_BYTES; + + GST_DEBUG_OBJECT (demux, "doing duration query to fix up unset stop"); + gst_pad_query_peer_duration (demux->sinkpad, &fmt, &stop); + } + + /* if upstream doesn't know the size, it's likely that it's not seekable in + * practice even if it technically may be seekable */ + if (seekable && (start != 0 || stop <= start)) { + GST_DEBUG_OBJECT (demux, "seekable but unknown start/stop -> disable"); + seekable = FALSE; + } + +done: + gst_query_unref (query); + + GST_DEBUG_OBJECT (demux, "seekable: %d (%" G_GUINT64_FORMAT " - %" + G_GUINT64_FORMAT ")", seekable, start, stop); + demux->upstream_seekable = seekable; + demux->upstream_size = seekable ? stop : -1; +} + +/* FIXME, unverified after edit list updates */ +static GstFlowReturn +gst_qtdemux_chain (GstPad * sinkpad, GstBuffer * inbuf) +{ + GstQTDemux *demux; + GstFlowReturn ret = GST_FLOW_OK; + + demux = GST_QTDEMUX (gst_pad_get_parent (sinkpad)); + +#ifdef QTDEMUX_MODIFICATION + /* Added consideration of demuxer state */ + if (demux->file && demux->state == QTDEMUX_STATE_MOVIE) { + if (fwrite (GST_BUFFER_DATA (inbuf), GST_BUFFER_SIZE (inbuf), 1, demux->file) != 1) { + GST_ELEMENT_ERROR (demux, STREAM, DECODE, + (_("Could not write to temporary buffer file.")), + ("File Write Failure: '%s'", + demux->filename)); + return GST_FLOW_ERROR; + } else { + demux->filesize += GST_BUFFER_SIZE (inbuf); + } + gst_buffer_unref (inbuf); + } else { + gst_adapter_push (demux->adapter, inbuf); + } +#else + gst_adapter_push (demux->adapter, inbuf); +#endif + + /* we never really mean to buffer that much */ + if (demux->neededbytes == -1) + goto eos; + + GST_DEBUG_OBJECT (demux, "pushing in inbuf %p, neededbytes:%u, available:%u", + inbuf, demux->neededbytes, gst_adapter_available (demux->adapter)); + +#ifdef QTDEMUX_MODIFICATION + /* Added consideration of demuxer state and file size*/ + while (((gst_adapter_available (demux->adapter)) >= demux->neededbytes + || (demux->file && demux->state == QTDEMUX_STATE_MOVIE && demux->filesize >= demux->neededbytes)) + && ret == GST_FLOW_OK) { +#else + while (((gst_adapter_available (demux->adapter)) >= demux->neededbytes) && + (ret == GST_FLOW_OK)) { +#endif + + GST_DEBUG_OBJECT (demux, + "state:%d , demux->neededbytes:%d, demux->offset:%" G_GUINT64_FORMAT, + demux->state, demux->neededbytes, demux->offset); + + switch (demux->state) { + case QTDEMUX_STATE_INITIAL:{ + const guint8 *data; + guint32 fourcc; + guint64 size; + + gst_qtdemux_check_seekability (demux); + + data = gst_adapter_peek (demux->adapter, demux->neededbytes); + + /* get fourcc/length, set neededbytes */ + extract_initial_length_and_fourcc ((guint8 *) data, demux->neededbytes, + &size, &fourcc); + GST_DEBUG_OBJECT (demux, "Peeking found [%" GST_FOURCC_FORMAT "] " + "size: %" G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc), size); + if (size == 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, + (_("This file is invalid and cannot be played.")), + ("initial atom '%" GST_FOURCC_FORMAT "' has empty length", + GST_FOURCC_ARGS (fourcc))); + ret = GST_FLOW_ERROR; + break; + } + if (fourcc == FOURCC_mdat) { + if (demux->n_streams > 0) { + /* we have the headers, start playback */ + demux->state = QTDEMUX_STATE_MOVIE; + demux->neededbytes = next_entry_size (demux); + demux->mdatleft = size; + + /* Only post, event on pads is done after newsegment */ + qtdemux_post_global_tags (demux); + + } else { + /* no headers yet, try to get them */ + guint bs; + gboolean res; + guint64 old, target; + + buffer_data: + old = demux->offset; + target = old + size; + + /* try to jump over the atom with a seek */ + /* only bother if it seems worth doing so, + * and avoids possible upstream/server problems */ + if (demux->upstream_seekable && + demux->upstream_size > 4 * (1 << 20)) { + res = qtdemux_seek_offset (demux, target); + } else { + GST_DEBUG_OBJECT (demux, "skipping seek"); + res = FALSE; + } + + if (res) { + GST_DEBUG_OBJECT (demux, "seek success"); + /* remember the offset fo the first mdat so we can seek back to it + * after we have the headers */ + if (fourcc == FOURCC_mdat && demux->first_mdat == -1) { + demux->first_mdat = old; + GST_DEBUG_OBJECT (demux, "first mdat at %" G_GUINT64_FORMAT, + demux->first_mdat); + } + /* seek worked, continue reading */ + demux->offset = target; + demux->neededbytes = 16; + demux->state = QTDEMUX_STATE_INITIAL; + } else { + /* seek failed, need to buffer */ + demux->offset = old; + GST_DEBUG_OBJECT (demux, "seek failed/skipped"); + /* there may be multiple mdat (or alike) buffers */ + /* sanity check */ + if (demux->mdatbuffer) + bs = GST_BUFFER_SIZE (demux->mdatbuffer); +#ifdef QTDEMUX_MODIFICATION + else if (demux->file) + bs = demux->filesize; +#endif + else + bs = 0; +#ifdef QTDEMUX_MODIFICATION + if (size + bs > demux->maxbuffersize) +#else + if (size + bs > 10 * (1 << 20)) +#endif + goto no_moov; + demux->state = QTDEMUX_STATE_BUFFER_MDAT; + demux->neededbytes = size; +#ifdef QTDEMUX_MODIFICATION + if ((demux->filename && demux->file == NULL) || !demux->mdatbuffer) +#else + if (!demux->mdatbuffer) +#endif + demux->mdatoffset = demux->offset; + } + } + } else if (G_UNLIKELY (size > QTDEMUX_MAX_ATOM_SIZE)) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, + (_("This file is invalid and cannot be played.")), + ("atom %" GST_FOURCC_FORMAT " has bogus size %" G_GUINT64_FORMAT, + GST_FOURCC_ARGS (fourcc), size)); + ret = GST_FLOW_ERROR; + break; + } else { + /* this means we already started buffering and still no moov header, + * let's continue buffering everything till we get moov */ +#ifdef QTDEMUX_MODIFICATION + if ((demux->mdatbuffer || demux->file) && (fourcc != FOURCC_moov)) +#else + if (demux->mdatbuffer && (fourcc != FOURCC_moov)) +#endif + goto buffer_data; + demux->neededbytes = size; + demux->state = QTDEMUX_STATE_HEADER; + } + break; + } + case QTDEMUX_STATE_HEADER:{ + const guint8 *data; + guint32 fourcc; + + GST_DEBUG_OBJECT (demux, "In header"); + + data = gst_adapter_peek (demux->adapter, demux->neededbytes); + + /* parse the header */ + extract_initial_length_and_fourcc (data, demux->neededbytes, NULL, + &fourcc); + if (fourcc == FOURCC_moov) { + GST_DEBUG_OBJECT (demux, "Parsing [moov]"); + + demux->got_moov = TRUE; + + /* prepare newsegment to send when streaming actually starts */ + if (!demux->pending_newsegment) { + demux->pending_newsegment = + gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, + 0, GST_CLOCK_TIME_NONE, 0); + } + + qtdemux_parse_moov (demux, data, demux->neededbytes); + qtdemux_node_dump (demux, demux->moov_node); + qtdemux_parse_tree (demux); + qtdemux_expose_streams (demux); + + g_node_destroy (demux->moov_node); + demux->moov_node = NULL; + GST_DEBUG_OBJECT (demux, "Finished parsing the header"); + } else if (fourcc == FOURCC_moof) { + if (demux->got_moov && demux->fragmented) { + GST_DEBUG_OBJECT (demux, "Parsing [moof]"); + if (!qtdemux_parse_moof (demux, data, demux->neededbytes, + demux->offset, NULL)) { + ret = GST_FLOW_ERROR; + goto done; + } + } else { + GST_DEBUG_OBJECT (demux, "Discarding [moof]"); + } + } else if (fourcc == FOURCC_ftyp) { + GST_DEBUG_OBJECT (demux, "Parsing [ftyp]"); + qtdemux_parse_ftyp (demux, data, demux->neededbytes); + } else if (fourcc == FOURCC_uuid) { + GST_DEBUG_OBJECT (demux, "Parsing [uuid]"); + qtdemux_parse_uuid (demux, data, demux->neededbytes); + } else { + GST_WARNING_OBJECT (demux, + "Unknown fourcc while parsing header : %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + /* Let's jump that one and go back to initial state */ + } + +#ifdef QTDEMUX_MODIFICATION + if ((demux->mdatbuffer || demux->file) && demux->n_streams) { + GstBuffer *buf; +#else + if (demux->mdatbuffer && demux->n_streams) { +#endif + + /* the mdat was before the header */ + GST_DEBUG_OBJECT (demux, "We have n_streams:%d and mdatbuffer:%p", + demux->n_streams, demux->mdatbuffer); + /* restore our adapter/offset view of things with upstream; + * put preceding buffered data ahead of current moov data. + * This should also handle evil mdat, moov, mdat cases and alike */ +#ifdef QTDEMUX_MODIFICATION + if (demux->file == NULL) { + // TODO: need to know what we need to do with buf, it is not freed + //buf = gst_adapter_take_buffer (demux->adapter, gst_adapter_available (demux->adapter)); +#endif + gst_adapter_clear (demux->adapter); + gst_adapter_push (demux->adapter, demux->mdatbuffer); /* need to check */ + demux->mdatbuffer = NULL; +#ifdef QTDEMUX_MODIFICATION + } else { + buf = gst_adapter_take_buffer (demux->adapter, gst_adapter_available (demux->adapter)); + gst_adapter_clear (demux->adapter); + if (fwrite (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), 1, demux->file) != 1) { + GST_ELEMENT_ERROR (demux, STREAM, DECODE, + (_("Could not write to temporary buffer file.")), + ("File Write Failure: '%s'", demux->filename)); + ret = GST_FLOW_ERROR; + break; + } else { + demux->filesize += GST_BUFFER_SIZE (buf); + } + gst_buffer_unref (buf); + } +#endif + demux->offset = demux->mdatoffset; + demux->neededbytes = next_entry_size (demux); + demux->state = QTDEMUX_STATE_MOVIE; + demux->mdatleft = gst_adapter_available (demux->adapter); + + /* Only post, event on pads is done after newsegment */ + qtdemux_post_global_tags (demux); + +#ifdef QTDEMUX_MODIFICATION + if (demux->file) { + demux->ofile = fopen (demux->filename, "rb"); + if (demux->ofile == NULL) { + GST_ELEMENT_ERROR (demux, STREAM, DECODE, + (_("Could not open temporary buffer file.")), + ("File Open Failure %d: '%s'", __LINE__, demux->filename)); + ret = GST_FLOW_ERROR; + break; + } + } +#endif + } else { + GST_DEBUG_OBJECT (demux, "Carrying on normally"); + gst_adapter_flush (demux->adapter, demux->neededbytes); + + if (demux->got_moov && demux->first_mdat != -1) { + gboolean res; + + /* we need to seek back */ + res = qtdemux_seek_offset (demux, demux->first_mdat); + if (res) { + demux->offset = demux->first_mdat; + } else { + GST_DEBUG_OBJECT (demux, "Seek back failed"); + } + } else { + demux->offset += demux->neededbytes; + } + demux->neededbytes = 16; + demux->state = QTDEMUX_STATE_INITIAL; + } + + break; + } + case QTDEMUX_STATE_BUFFER_MDAT:{ + GstBuffer *buf; + + GST_DEBUG_OBJECT (demux, "Got our buffer at offset %" G_GUINT64_FORMAT, + demux->offset); + buf = gst_adapter_take_buffer (demux->adapter, demux->neededbytes); + GST_DEBUG_OBJECT (demux, "mdatbuffer starts with %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (QT_FOURCC (GST_BUFFER_DATA (buf) + 4))); + +#ifdef QTDEMUX_MODIFICATION + if (demux->filename == NULL) { +#endif + if (demux->mdatbuffer) + demux->mdatbuffer = gst_buffer_join (demux->mdatbuffer, buf); + else + demux->mdatbuffer = buf; +#ifdef QTDEMUX_MODIFICATION + } else { + write_data: + if (demux->file) { + if (fwrite (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), 1, demux->file) != 1) { + GST_ELEMENT_ERROR (demux, STREAM, DECODE, + (_("Could not write to temporary buffer file.")), + ("File Write Failure: '%s'", demux->filename)); + ret = GST_FLOW_ERROR; + break; + } else { + demux->filesize += GST_BUFFER_SIZE (buf); + } + gst_buffer_unref (buf); + } else { + demux->file = fopen (demux->filename, "wb"); + if (demux->file == NULL) { + GST_ELEMENT_ERROR (demux, STREAM, DECODE, + (_("Could not create temporary buffer file.")), + ("File Open Failure: '%s'", demux->filename)); + ret = GST_FLOW_ERROR; + break; + } + goto write_data; + } + } +#endif + demux->offset += demux->neededbytes; + demux->neededbytes = 16; + demux->state = QTDEMUX_STATE_INITIAL; + gst_qtdemux_post_progress (demux, 1, 1); + + break; + } + case QTDEMUX_STATE_MOVIE:{ + GstBuffer *outbuf; + QtDemuxStream *stream = NULL; + QtDemuxSample *sample; + int i = -1; + guint64 timestamp, duration, position; + gboolean keyframe; + + GST_DEBUG_OBJECT (demux, + "BEGIN // in MOVIE for offset %" G_GUINT64_FORMAT, demux->offset); + + if (demux->fragmented) { + GST_DEBUG_OBJECT (demux, "mdat remaining %" G_GUINT64_FORMAT, + demux->mdatleft); + if (G_LIKELY (demux->todrop < demux->mdatleft)) { + /* if needed data starts within this atom, + * then it should not exceed this atom */ + if (G_UNLIKELY (demux->neededbytes > demux->mdatleft)) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, + (_("This file is invalid and cannot be played.")), + ("sample data crosses atom boundary")); + ret = GST_FLOW_ERROR; + break; + } + demux->mdatleft -= demux->neededbytes; + } else { + GST_DEBUG_OBJECT (demux, "data atom emptied; resuming atom scan"); + /* so we are dropping more than left in this atom */ + demux->todrop -= demux->mdatleft; + demux->neededbytes -= demux->mdatleft; + demux->mdatleft = 0; + /* need to resume atom parsing so we do not miss any other pieces */ + demux->state = QTDEMUX_STATE_INITIAL; + demux->neededbytes = 16; + break; + } + } + + if (demux->todrop) { + GST_LOG_OBJECT (demux, "Dropping %d bytes", demux->todrop); +#ifdef QTDEMUX_MODIFICATION + if (demux->file == NULL) +#endif + gst_adapter_flush (demux->adapter, demux->todrop); +#ifdef QTDEMUX_MODIFICATION + else { + if(!fseek (demux->ofile, (long) demux->todrop, SEEK_CUR)) + demux->filesize -= demux->todrop; + } +#endif + demux->neededbytes -= demux->todrop; + demux->offset += demux->todrop; + } + + /* first buffer? */ + /* initial newsegment sent here after having added pads, + * possible others in sink_event */ + if (G_UNLIKELY (demux->pending_newsegment)) { + gst_qtdemux_push_event (demux, demux->pending_newsegment); + demux->pending_newsegment = NULL; + /* clear to send tags on all streams */ + for (i = 0; i < demux->n_streams; i++) { + gst_qtdemux_push_tags (demux, demux->streams[i]); + } + } + + /* Figure out which stream this is packet belongs to */ + for (i = 0; i < demux->n_streams; i++) { + stream = demux->streams[i]; + if (stream->sample_index >= stream->n_samples) + continue; + GST_LOG_OBJECT (demux, + "Checking stream %d (sample_index:%d / offset:%" G_GUINT64_FORMAT + " / size:%d)", i, stream->sample_index, + stream->samples[stream->sample_index].offset, + stream->samples[stream->sample_index].size); + + if (stream->samples[stream->sample_index].offset == demux->offset) + break; + } + + if (G_UNLIKELY (stream == NULL || i == demux->n_streams)) + goto unknown_stream; + + /* Put data in a buffer, set timestamps, caps, ... */ +#ifdef QTDEMUX_MODIFICATION + if (demux->file == NULL) { +#endif + outbuf = gst_adapter_take_buffer (demux->adapter, demux->neededbytes); + GST_DEBUG_OBJECT (demux, "stream : %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (stream->fourcc)); +#ifdef QTDEMUX_MODIFICATION + } else { + outbuf = gst_buffer_new_and_alloc (demux->neededbytes); + g_return_val_if_fail (outbuf != NULL, GST_FLOW_ERROR); + if (fread (GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf), 1, demux->ofile) != 1) { + GST_ELEMENT_ERROR (demux, STREAM, DECODE, + (_("Could not read from temporary buffer file.")), + ("File Read Failure: '%s'", demux->filename)); + ret = GST_FLOW_ERROR; + break; + } + demux->filesize -= demux->neededbytes; + } +#endif + g_return_val_if_fail (outbuf != NULL, GST_FLOW_ERROR); + + sample = &stream->samples[stream->sample_index]; + + position = QTSAMPLE_DTS (stream, sample); + timestamp = QTSAMPLE_PTS (stream, sample); + duration = QTSAMPLE_DUR_DTS (stream, sample, position); + keyframe = QTSAMPLE_KEYFRAME (stream, sample); + + ret = gst_qtdemux_decorate_and_push_buffer (demux, stream, outbuf, + timestamp, duration, keyframe, position, demux->offset); + + /* combine flows */ + ret = gst_qtdemux_combine_flows (demux, stream, ret); + + stream->sample_index++; + + /* update current offset and figure out size of next buffer */ + GST_LOG_OBJECT (demux, "increasing offset %" G_GUINT64_FORMAT " by %u", + demux->offset, demux->neededbytes); + demux->offset += demux->neededbytes; + GST_LOG_OBJECT (demux, "offset is now %" G_GUINT64_FORMAT, + demux->offset); + + if ((demux->neededbytes = next_entry_size (demux)) == -1) { + if (demux->fragmented) { + GST_DEBUG_OBJECT (demux, "(temporarily) out of fragmented samples"); + /* there may be more to follow, only finish this atom */ + demux->todrop = demux->mdatleft; + demux->neededbytes = demux->todrop; + break; + } + goto eos; + } + break; + } + default: + goto invalid_state; + } + } + + /* when buffering movie data, at least show user something is happening */ +#ifdef QTDEMUX_MODIFICATION + if (ret == GST_FLOW_OK && demux->state == QTDEMUX_STATE_BUFFER_MDAT) { + guint available; + if (demux->file) + available = demux->filesize; + else + available = gst_adapter_available (demux->adapter); + + if (available <= demux->neededbytes) { + gst_qtdemux_post_progress (demux, available, demux->neededbytes); + } + } +#else + if (ret == GST_FLOW_OK && demux->state == QTDEMUX_STATE_BUFFER_MDAT && + gst_adapter_available (demux->adapter) <= demux->neededbytes) { + gst_qtdemux_post_progress (demux, gst_adapter_available (demux->adapter), + demux->neededbytes); + } +#endif +done: + gst_object_unref (demux); + + return ret; + + /* ERRORS */ +unknown_stream: + { + GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), ("unknown stream found")); + ret = GST_FLOW_ERROR; + goto done; + } +eos: + { + GST_DEBUG_OBJECT (demux, "no next entry, EOS"); + ret = GST_FLOW_UNEXPECTED; + goto done; + } +invalid_state: + { + GST_ELEMENT_ERROR (demux, STREAM, FAILED, + (NULL), ("qtdemuxer invalid state %d", demux->state)); + ret = GST_FLOW_ERROR; + goto done; + } +no_moov: + { + GST_ELEMENT_ERROR (demux, STREAM, FAILED, + (NULL), ("no 'moov' atom within the first 10 MB")); + ret = GST_FLOW_ERROR; + goto done; + } +} + +static gboolean +qtdemux_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); +} + +static gboolean +qtdemux_sink_activate_pull (GstPad * sinkpad, gboolean active) +{ + GstQTDemux *demux = GST_QTDEMUX (GST_PAD_PARENT (sinkpad)); + + if (active) { + demux->pullbased = TRUE; + demux->segment_running = TRUE; + return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_qtdemux_loop, + sinkpad); + } else { + demux->segment_running = FALSE; + return gst_pad_stop_task (sinkpad); + } +} + +static gboolean +qtdemux_sink_activate_push (GstPad * sinkpad, gboolean active) +{ + GstQTDemux *demux = GST_QTDEMUX (GST_PAD_PARENT (sinkpad)); + + demux->pullbased = FALSE; + + return TRUE; +} + +#ifdef HAVE_ZLIB +static void * +qtdemux_zalloc (void *opaque, unsigned int items, unsigned int size) +{ + return g_malloc (items * size); +} + +static void +qtdemux_zfree (void *opaque, void *addr) +{ + g_free (addr); +} + +static void * +qtdemux_inflate (void *z_buffer, guint z_length, guint length) +{ + guint8 *buffer; + z_stream *z; + int ret; + + z = g_new0 (z_stream, 1); + z->zalloc = qtdemux_zalloc; + z->zfree = qtdemux_zfree; + z->opaque = NULL; + + z->next_in = z_buffer; + z->avail_in = z_length; + + buffer = (guint8 *) g_malloc (length); + ret = inflateInit (z); + while (z->avail_in > 0) { + if (z->avail_out == 0) { + length += 1024; + buffer = (guint8 *) g_realloc (buffer, length); + z->next_out = buffer + z->total_out; + z->avail_out = 1024; + } + ret = inflate (z, Z_SYNC_FLUSH); + if (ret != Z_OK) + break; + } + if (ret != Z_STREAM_END) { + g_warning ("inflate() returned %d", ret); + } + + g_free (z); + return buffer; +} +#endif /* HAVE_ZLIB */ + +static gboolean +qtdemux_parse_moov (GstQTDemux * qtdemux, const guint8 * buffer, guint length) +{ + qtdemux->moov_node = g_node_new ((guint8 *) buffer); + + /* counts as header data */ + qtdemux->header_size += length; + + GST_DEBUG_OBJECT (qtdemux, "parsing 'moov' atom"); + qtdemux_parse_node (qtdemux, qtdemux->moov_node, buffer, length); + return TRUE; +} + +static gboolean +qtdemux_parse_container (GstQTDemux * qtdemux, GNode * node, const guint8 * buf, + const guint8 * end) +{ + while (G_UNLIKELY (buf < end)) { + GNode *child; + guint32 len; + + if (G_UNLIKELY (buf + 4 > end)) { + GST_LOG_OBJECT (qtdemux, "buffer overrun"); + break; + } + len = QT_UINT32 (buf); + if (G_UNLIKELY (len == 0)) { + GST_LOG_OBJECT (qtdemux, "empty container"); + break; + } + if (G_UNLIKELY (len < 8)) { + GST_WARNING_OBJECT (qtdemux, "length too short (%d < 8)", len); + break; + } + if (G_UNLIKELY (len > (end - buf))) { + GST_WARNING_OBJECT (qtdemux, "length too long (%d > %d)", len, + (gint) (end - buf)); + break; + } + + child = g_node_new ((guint8 *) buf); + g_node_append (node, child); + GST_LOG_OBJECT (qtdemux, "adding new node of len %d", len); + qtdemux_parse_node (qtdemux, child, buf, len); + + buf += len; + } + return TRUE; +} + +static gboolean +qtdemux_parse_theora_extension (GstQTDemux * qtdemux, QtDemuxStream * stream, + GNode * xdxt) +{ + int len = QT_UINT32 (xdxt->data); + guint8 *buf = xdxt->data; + guint8 *end = buf + len; + GstBuffer *buffer; + + /* skip size and type */ + buf += 8; + end -= 8; + + while (buf < end) { + gint size; + guint32 type; + + size = QT_UINT32 (buf); + type = QT_FOURCC (buf + 4); + + GST_LOG_OBJECT (qtdemux, "%p %p", buf, end); + + if (buf + size > end || size <= 0) + break; + + buf += 8; + size -= 8; + + GST_WARNING_OBJECT (qtdemux, "have cookie %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (type)); + + switch (type) { + case FOURCC_tCtH: + buffer = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (buffer), buf, size); + stream->buffers = g_slist_append (stream->buffers, buffer); + GST_LOG_OBJECT (qtdemux, "parsing theora header"); + break; + case FOURCC_tCt_: + buffer = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (buffer), buf, size); + stream->buffers = g_slist_append (stream->buffers, buffer); + GST_LOG_OBJECT (qtdemux, "parsing theora comment"); + break; + case FOURCC_tCtC: + buffer = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (buffer), buf, size); + stream->buffers = g_slist_append (stream->buffers, buffer); + GST_LOG_OBJECT (qtdemux, "parsing theora codebook"); + break; + default: + GST_WARNING_OBJECT (qtdemux, + "unknown theora cookie %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (type)); + break; + } + buf += size; + } + return TRUE; +} + +static gboolean +qtdemux_parse_node (GstQTDemux * qtdemux, GNode * node, const guint8 * buffer, + guint length) +{ + guint32 fourcc = 0; + guint32 node_length = 0; + const QtNodeType *type; + const guint8 *end; + + GST_LOG_OBJECT (qtdemux, "qtdemux_parse buffer %p length %u", buffer, length); + + if (G_UNLIKELY (length < 8)) + goto not_enough_data; + + node_length = QT_UINT32 (buffer); + fourcc = QT_FOURCC (buffer + 4); + + /* ignore empty nodes */ + if (G_UNLIKELY (fourcc == 0 || node_length == 8)) + return TRUE; + + type = qtdemux_type_get (fourcc); + + end = buffer + length; + + GST_LOG_OBJECT (qtdemux, + "parsing '%" GST_FOURCC_FORMAT "', length=%u, name '%s'", + GST_FOURCC_ARGS (fourcc), node_length, type->name); + + if (node_length > length) + goto broken_atom_size; + + if (type->flags & QT_FLAG_CONTAINER) { + qtdemux_parse_container (qtdemux, node, buffer + 8, end); + } else { + switch (fourcc) { + case FOURCC_stsd: + { + if (node_length < 20) { + GST_LOG_OBJECT (qtdemux, "skipping small stsd box"); + break; + } + GST_DEBUG_OBJECT (qtdemux, + "parsing stsd (sample table, sample description) atom"); + qtdemux_parse_container (qtdemux, node, buffer + 16, end); + break; + } + case FOURCC_mp4a: + case FOURCC_alac: + { + guint32 version; + guint32 offset; + guint min_size; + + /* also read alac (or whatever) in stead of mp4a in the following, + * since a similar layout is used in other cases as well */ + if (fourcc == FOURCC_mp4a) + min_size = 20; + else + min_size = 40; + + /* There are two things we might encounter here: a true mp4a atom, and + an mp4a entry in an stsd atom. The latter is what we're interested + in, and it looks like an atom, but isn't really one. The true mp4a + atom is short, so we detect it based on length here. */ + if (length < min_size) { + GST_LOG_OBJECT (qtdemux, "skipping small %" GST_FOURCC_FORMAT " box", + GST_FOURCC_ARGS (fourcc)); + break; + } + + /* 'version' here is the sound sample description version. Types 0 and + 1 are documented in the QTFF reference, but type 2 is not: it's + described in Apple header files instead (struct SoundDescriptionV2 + in Movies.h) */ + version = QT_UINT16 (buffer + 16); + + GST_DEBUG_OBJECT (qtdemux, "%" GST_FOURCC_FORMAT " version 0x%08x", + GST_FOURCC_ARGS (fourcc), version); + + /* parse any esds descriptors */ + switch (version) { + case 0: + offset = 0x24; + break; + case 1: + offset = 0x34; + break; + case 2: + offset = 0x48; + break; + default: + GST_WARNING_OBJECT (qtdemux, + "unhandled %" GST_FOURCC_FORMAT " version 0x%08x", + GST_FOURCC_ARGS (fourcc), version); + offset = 0; + break; + } + if (offset) + qtdemux_parse_container (qtdemux, node, buffer + offset, end); + break; + } + case FOURCC_mp4v: + case FOURCC_MP4V: + case FOURCC_fmp4: + case FOURCC_FMP4: + { + const guint8 *buf; + guint32 version; + int tlen; + + GST_DEBUG_OBJECT (qtdemux, "parsing in %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + version = QT_UINT32 (buffer + 16); + GST_DEBUG_OBJECT (qtdemux, "version %08x", version); + if (1 || version == 0x00000000) { + buf = buffer + 0x32; + + /* FIXME Quicktime uses PASCAL string while + * the iso format uses C strings. Check the file + * type before attempting to parse the string here. */ + tlen = QT_UINT8 (buf); + GST_DEBUG_OBJECT (qtdemux, "tlen = %d", tlen); + buf++; + GST_DEBUG_OBJECT (qtdemux, "string = %.*s", tlen, (char *) buf); + /* the string has a reserved space of 32 bytes so skip + * the remaining 31 */ + buf += 31; + buf += 4; /* and 4 bytes reserved */ + + GST_MEMDUMP_OBJECT (qtdemux, "mp4v", buf, end - buf); + + qtdemux_parse_container (qtdemux, node, buf, end); + } + break; + } + case FOURCC_avc1: + { + GST_MEMDUMP_OBJECT (qtdemux, "avc1", buffer, end - buffer); + qtdemux_parse_container (qtdemux, node, buffer + 0x56, end); + break; + } + case FOURCC_mjp2: + { + qtdemux_parse_container (qtdemux, node, buffer + 86, end); + break; + } + case FOURCC_meta: + { + GST_DEBUG_OBJECT (qtdemux, "parsing meta atom"); + qtdemux_parse_container (qtdemux, node, buffer + 12, end); + break; + } + case FOURCC_XiTh: + { + guint32 version; + guint32 offset; + + version = QT_UINT32 (buffer + 12); + GST_DEBUG_OBJECT (qtdemux, "parsing XiTh atom version 0x%08x", version); + + switch (version) { + case 0x00000001: + offset = 0x62; + break; + default: + GST_DEBUG_OBJECT (qtdemux, "unknown version 0x%08x", version); + offset = 0; + break; + } + if (offset) + qtdemux_parse_container (qtdemux, node, buffer + offset, end); + break; + } + case FOURCC_in24: + { + qtdemux_parse_container (qtdemux, node, buffer + 0x34, end); + break; + } + default: + if (!strcmp (type->name, "unknown")) + GST_MEMDUMP ("Unknown tag", buffer + 4, end - buffer - 4); + break; + } + } + GST_LOG_OBJECT (qtdemux, "parsed '%" GST_FOURCC_FORMAT "'", + GST_FOURCC_ARGS (fourcc)); + return TRUE; + +/* ERRORS */ +not_enough_data: + { + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is corrupt and cannot be played.")), + ("Not enough data for an atom header, got only %u bytes", length)); + return FALSE; + } +broken_atom_size: + { + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is corrupt and cannot be played.")), + ("Atom '%" GST_FOURCC_FORMAT "' has size of %u bytes, but we have only " + "%u bytes available.", GST_FOURCC_ARGS (fourcc), node_length, + length)); + return FALSE; + } +} + +static GNode * +qtdemux_tree_get_child_by_type (GNode * node, guint32 fourcc) +{ + GNode *child; + guint8 *buffer; + guint32 child_fourcc; + + for (child = g_node_first_child (node); child; + child = g_node_next_sibling (child)) { + buffer = (guint8 *) child->data; + + child_fourcc = QT_FOURCC (buffer + 4); + + if (G_UNLIKELY (child_fourcc == fourcc)) { + return child; + } + } + return NULL; +} + +static GNode * +qtdemux_tree_get_child_by_type_full (GNode * node, guint32 fourcc, + GstByteReader * parser) +{ + GNode *child; + guint8 *buffer; + guint32 child_fourcc, child_len; + + for (child = g_node_first_child (node); child; + child = g_node_next_sibling (child)) { + buffer = (guint8 *) child->data; + + child_len = QT_UINT32 (buffer); + child_fourcc = QT_FOURCC (buffer + 4); + + if (G_UNLIKELY (child_fourcc == fourcc)) { + if (G_UNLIKELY (child_len < (4 + 4))) + return NULL; + /* FIXME: must verify if atom length < parent atom length */ + gst_byte_reader_init (parser, buffer + (4 + 4), child_len - (4 + 4)); + return child; + } + } + return NULL; +} + +static GNode * +qtdemux_tree_get_sibling_by_type_full (GNode * node, guint32 fourcc, + GstByteReader * parser) +{ + GNode *child; + guint8 *buffer; + guint32 child_fourcc, child_len; + + for (child = g_node_next_sibling (node); child; + child = g_node_next_sibling (child)) { + buffer = (guint8 *) child->data; + + child_fourcc = QT_FOURCC (buffer + 4); + + if (child_fourcc == fourcc) { + if (parser) { + child_len = QT_UINT32 (buffer); + if (G_UNLIKELY (child_len < (4 + 4))) + return NULL; + /* FIXME: must verify if atom length < parent atom length */ + gst_byte_reader_init (parser, buffer + (4 + 4), child_len - (4 + 4)); + } + return child; + } + } + return NULL; +} + +static GNode * +qtdemux_tree_get_sibling_by_type (GNode * node, guint32 fourcc) +{ + return qtdemux_tree_get_sibling_by_type_full (node, fourcc, NULL); +} + +static gboolean +gst_qtdemux_add_stream (GstQTDemux * qtdemux, + QtDemuxStream * stream, GstTagList * list) +{ + /* consistent default for push based mode */ + gst_segment_init (&stream->segment, GST_FORMAT_TIME); + gst_segment_set_newsegment (&stream->segment, FALSE, 1.0, GST_FORMAT_TIME, + 0, GST_CLOCK_TIME_NONE, 0); + + if (stream->subtype == FOURCC_vide) { + gchar *name = g_strdup_printf ("video_%02d", qtdemux->n_video_streams); + + stream->pad = + gst_pad_new_from_static_template (&gst_qtdemux_videosrc_template, name); + g_free (name); + + /* fps is calculated base on the duration of the first frames since + * qt does not have a fixed framerate. */ + if ((stream->n_samples == 1) && (stream->min_duration == 0)) { + /* still frame */ + stream->fps_n = 0; + stream->fps_d = 1; + } else { + stream->fps_n = stream->timescale; + if (stream->min_duration == 0) + stream->fps_d = 1; + else + stream->fps_d = stream->min_duration; + } + + if (stream->caps) { + gboolean gray; + gint depth, palette_count; + const guint32 *palette_data = NULL; + + gst_caps_set_simple (stream->caps, + "width", G_TYPE_INT, stream->width, + "height", G_TYPE_INT, stream->height, + "framerate", GST_TYPE_FRACTION, stream->fps_n, stream->fps_d, NULL); + + /* calculate pixel-aspect-ratio using display width and height */ + GST_DEBUG_OBJECT (qtdemux, + "video size %dx%d, target display size %dx%d", stream->width, + stream->height, stream->display_width, stream->display_height); + + if (stream->display_width > 0 && stream->display_height > 0 && + stream->width > 0 && stream->height > 0) { + gint n, d; + + /* calculate the pixel aspect ratio using the display and pixel w/h */ + n = stream->display_width * stream->height; + d = stream->display_height * stream->width; + if (n == d) + n = d = 1; + GST_DEBUG_OBJECT (qtdemux, "setting PAR to %d/%d", n, d); + gst_caps_set_simple (stream->caps, "pixel-aspect-ratio", + GST_TYPE_FRACTION, n, d, NULL); + } + + /* qt file might have pasp atom */ + if (stream->par_w > 0 && stream->par_h > 0) { + GST_DEBUG_OBJECT (qtdemux, "par %d:%d", stream->par_w, stream->par_h); + gst_caps_set_simple (stream->caps, "pixel-aspect-ratio", + GST_TYPE_FRACTION, stream->par_w, stream->par_h, NULL); + } + + depth = stream->bits_per_sample; + + /* more than 32 bits means grayscale */ + gray = (depth > 32); + /* low 32 bits specify the depth */ + depth &= 0x1F; + + /* different number of palette entries is determined by depth. */ + palette_count = 0; + if ((depth == 1) || (depth == 2) || (depth == 4) || (depth == 8)) + palette_count = (1 << depth); + + switch (palette_count) { + case 0: + break; + case 2: + palette_data = ff_qt_default_palette_2; + break; + case 4: + palette_data = ff_qt_default_palette_4; + break; + case 16: + if (gray) + palette_data = ff_qt_grayscale_palette_16; + else + palette_data = ff_qt_default_palette_16; + break; + case 256: + if (gray) + palette_data = ff_qt_grayscale_palette_256; + else + palette_data = ff_qt_default_palette_256; + break; + default: + GST_ELEMENT_WARNING (qtdemux, STREAM, DEMUX, + (_("The video in this file might not play correctly.")), + ("unsupported palette depth %d", depth)); + break; + } + if (palette_data) { + GstBuffer *palette; + + /* make sure it's not writable. We leave MALLOCDATA to NULL so that we + * don't free any of the buffer data. */ + palette = gst_buffer_new (); + GST_BUFFER_FLAG_SET (palette, GST_BUFFER_FLAG_READONLY); + GST_BUFFER_DATA (palette) = (guint8 *) palette_data; + GST_BUFFER_SIZE (palette) = sizeof (guint32) * palette_count; + + gst_caps_set_simple (stream->caps, "palette_data", + GST_TYPE_BUFFER, palette, NULL); + gst_buffer_unref (palette); + } else if (palette_count != 0) { + GST_ELEMENT_WARNING (qtdemux, STREAM, NOT_IMPLEMENTED, + (NULL), ("Unsupported palette depth %d. Ignoring stream.", depth)); + + gst_object_unref (stream->pad); + stream->pad = NULL; + } + } + qtdemux->n_video_streams++; + } else if (stream->subtype == FOURCC_soun) { + gchar *name = g_strdup_printf ("audio_%02d", qtdemux->n_audio_streams); + + stream->pad = + gst_pad_new_from_static_template (&gst_qtdemux_audiosrc_template, name); + g_free (name); + if (stream->caps) { + gst_caps_set_simple (stream->caps, + "rate", G_TYPE_INT, (int) stream->rate, + "channels", G_TYPE_INT, stream->n_channels, NULL); + } + qtdemux->n_audio_streams++; + } else if (stream->subtype == FOURCC_strm) { + GST_DEBUG_OBJECT (qtdemux, "stream type, not creating pad"); + } else if (stream->subtype == FOURCC_subp || stream->subtype == FOURCC_text) { + gchar *name = g_strdup_printf ("subtitle_%02d", qtdemux->n_sub_streams); + + stream->pad = + gst_pad_new_from_static_template (&gst_qtdemux_subsrc_template, name); + g_free (name); + qtdemux->n_sub_streams++; + } else { + GST_DEBUG_OBJECT (qtdemux, "unknown stream type"); + goto done; + } + + if (stream->pad) { + GST_PAD_ELEMENT_PRIVATE (stream->pad) = stream; + + gst_pad_use_fixed_caps (stream->pad); + gst_pad_set_event_function (stream->pad, gst_qtdemux_handle_src_event); + gst_pad_set_query_type_function (stream->pad, + gst_qtdemux_get_src_query_types); + gst_pad_set_query_function (stream->pad, gst_qtdemux_handle_src_query); + + GST_DEBUG_OBJECT (qtdemux, "setting caps %" GST_PTR_FORMAT, stream->caps); + gst_pad_set_caps (stream->pad, stream->caps); + + GST_DEBUG_OBJECT (qtdemux, "adding pad %s %p to qtdemux %p", + GST_OBJECT_NAME (stream->pad), stream->pad, qtdemux); + gst_pad_set_active (stream->pad, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (qtdemux), stream->pad); + if (stream->pending_tags) + gst_tag_list_free (stream->pending_tags); + stream->pending_tags = list; + if (list) { + /* post now, send event on pad later */ + GST_DEBUG_OBJECT (qtdemux, "Posting tags %" GST_PTR_FORMAT, list); + gst_element_post_message (GST_ELEMENT (qtdemux), + gst_message_new_tag_full (GST_OBJECT (qtdemux), stream->pad, + gst_tag_list_copy (list))); + } + /* global tags go on each pad anyway */ + stream->send_global_tags = TRUE; + } +done: + return TRUE; +} + +/* find next atom with @fourcc starting at @offset */ +static GstFlowReturn +qtdemux_find_atom (GstQTDemux * qtdemux, guint64 * offset, + guint64 * length, guint32 fourcc) +{ + GstFlowReturn ret; + guint32 lfourcc; + GstBuffer *buf; + + GST_LOG_OBJECT (qtdemux, "finding fourcc %" GST_FOURCC_FORMAT " at offset %" + G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc), *offset); + + while (TRUE) { + ret = gst_pad_pull_range (qtdemux->sinkpad, *offset, 16, &buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto locate_failed; + if (G_LIKELY (GST_BUFFER_SIZE (buf) != 16)) { + /* likely EOF */ + ret = GST_FLOW_UNEXPECTED; + gst_buffer_unref (buf); + goto locate_failed; + } + extract_initial_length_and_fourcc (GST_BUFFER_DATA (buf), 16, length, + &lfourcc); + gst_buffer_unref (buf); + + if (G_UNLIKELY (*length == 0)) { + GST_DEBUG_OBJECT (qtdemux, "invalid length 0"); + ret = GST_FLOW_ERROR; + goto locate_failed; + } + + if (lfourcc == fourcc) { + GST_DEBUG_OBJECT (qtdemux, "found fourcc at offset %" G_GUINT64_FORMAT, + *offset); + break; + } else { + GST_LOG_OBJECT (qtdemux, + "skipping atom '%" GST_FOURCC_FORMAT "' at %" G_GUINT64_FORMAT, + GST_FOURCC_ARGS (fourcc), *offset); + *offset += *length; + } + } + + return GST_FLOW_OK; + +locate_failed: + { + /* might simply have had last one */ + GST_DEBUG_OBJECT (qtdemux, "fourcc not found"); + return ret; + } +} + +/* should only do something in pull mode */ +/* call with OBJECT lock */ +static GstFlowReturn +qtdemux_add_fragmented_samples (GstQTDemux * qtdemux) +{ + guint64 length, offset; + GstBuffer *buf = NULL; + GstFlowReturn ret = GST_FLOW_OK; + GstFlowReturn res = GST_FLOW_OK; + + offset = qtdemux->moof_offset; + GST_DEBUG_OBJECT (qtdemux, "next moof at offset %" G_GUINT64_FORMAT, offset); + + if (!offset) { + GST_DEBUG_OBJECT (qtdemux, "no next moof"); + return GST_FLOW_UNEXPECTED; + } + + /* best not do pull etc with lock held */ + GST_OBJECT_UNLOCK (qtdemux); + + ret = qtdemux_find_atom (qtdemux, &offset, &length, FOURCC_moof); + if (ret != GST_FLOW_OK) + goto flow_failed; + + ret = gst_qtdemux_pull_atom (qtdemux, offset, length, &buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto flow_failed; + if (!qtdemux_parse_moof (qtdemux, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf), offset, NULL)) { + gst_buffer_unref (buf); + buf = NULL; + goto parse_failed; + } + + gst_buffer_unref (buf); + buf = NULL; + + offset += length; + /* look for next moof */ + ret = qtdemux_find_atom (qtdemux, &offset, &length, FOURCC_moof); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto flow_failed; + +exit: + GST_OBJECT_LOCK (qtdemux); + + qtdemux->moof_offset = offset; + + return res; + +parse_failed: + { + GST_DEBUG_OBJECT (qtdemux, "failed to parse moof"); + offset = 0; + res = GST_FLOW_ERROR; + goto exit; + } +flow_failed: + { + /* maybe upstream temporarily flushing */ + if (ret != GST_FLOW_WRONG_STATE) { + GST_DEBUG_OBJECT (qtdemux, "no next moof"); + offset = 0; + } else { + GST_DEBUG_OBJECT (qtdemux, "upstream WRONG_STATE"); + /* resume at current position next time */ + } + res = ret; + goto exit; + } +} + +/* initialise bytereaders for stbl sub-atoms */ +static gboolean +qtdemux_stbl_init (GstQTDemux * qtdemux, QtDemuxStream * stream, GNode * stbl) +{ + stream->stbl_index = -1; /* no samples have yet been parsed */ + + /* time-to-sample atom */ + if (!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stts, &stream->stts)) + goto corrupt_file; + + /* copy atom data into a new buffer for later use */ + stream->stts.data = g_memdup (stream->stts.data, stream->stts.size); + + /* skip version + flags */ + if (!gst_byte_reader_skip (&stream->stts, 1 + 3) || + !gst_byte_reader_get_uint32_be (&stream->stts, &stream->n_sample_times)) + goto corrupt_file; + GST_LOG_OBJECT (qtdemux, "%u timestamp blocks", stream->n_sample_times); + + /* make sure there's enough data */ + if (!qt_atom_parser_has_chunks (&stream->stts, stream->n_sample_times, 8)) { + stream->n_sample_times = gst_byte_reader_get_remaining (&stream->stts) / 8; + GST_LOG_OBJECT (qtdemux, "overriding to %u timestamp blocks", + stream->n_sample_times); + if (!stream->n_sample_times) + goto corrupt_file; + } + + /* sync sample atom */ + if ((stream->stss_present = + ! !qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stss, + &stream->stss) ? TRUE : FALSE) == TRUE) { + /* copy atom data into a new buffer for later use */ + stream->stss.data = g_memdup (stream->stss.data, stream->stss.size); + + /* skip version + flags */ + if (!gst_byte_reader_skip (&stream->stss, 1 + 3) || + !gst_byte_reader_get_uint32_be (&stream->stss, &stream->n_sample_syncs)) + goto corrupt_file; + + if (stream->n_sample_syncs) { + /* make sure there's enough data */ + if (!qt_atom_parser_has_chunks (&stream->stss, stream->n_sample_syncs, 4)) + goto corrupt_file; + } + } + + /* sample size */ + if (!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stsz, &stream->stsz)) + goto no_samples; + + /* copy atom data into a new buffer for later use */ + stream->stsz.data = g_memdup (stream->stsz.data, stream->stsz.size); + + /* skip version + flags */ + if (!gst_byte_reader_skip (&stream->stsz, 1 + 3) || + !gst_byte_reader_get_uint32_be (&stream->stsz, &stream->sample_size)) + goto corrupt_file; + + if (!gst_byte_reader_get_uint32_be (&stream->stsz, &stream->n_samples)) + goto corrupt_file; + + if (!stream->n_samples) + goto no_samples; + + /* sample-to-chunk atom */ + if (!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stsc, &stream->stsc)) + goto corrupt_file; + + /* copy atom data into a new buffer for later use */ + stream->stsc.data = g_memdup (stream->stsc.data, stream->stsc.size); + + /* skip version + flags */ + if (!gst_byte_reader_skip (&stream->stsc, 1 + 3) || + !gst_byte_reader_get_uint32_be (&stream->stsc, + &stream->n_samples_per_chunk)) + goto corrupt_file; + + GST_DEBUG_OBJECT (qtdemux, "n_samples_per_chunk %u", + stream->n_samples_per_chunk); + + /* make sure there's enough data */ + if (!qt_atom_parser_has_chunks (&stream->stsc, stream->n_samples_per_chunk, + 12)) + goto corrupt_file; + + + /* chunk offset */ + if (qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stco, &stream->stco)) + stream->co_size = sizeof (guint32); + else if (qtdemux_tree_get_child_by_type_full (stbl, FOURCC_co64, + &stream->stco)) + stream->co_size = sizeof (guint64); + else + goto corrupt_file; + + /* copy atom data into a new buffer for later use */ + stream->stco.data = g_memdup (stream->stco.data, stream->stco.size); + + /* skip version + flags */ + if (!gst_byte_reader_skip (&stream->stco, 1 + 3)) + goto corrupt_file; + + /* chunks_are_chunks == 0 means treat chunks as samples */ + stream->chunks_are_chunks = !stream->sample_size || stream->sampled; + if (stream->chunks_are_chunks) { + /* skip number of entries */ + if (!gst_byte_reader_skip (&stream->stco, 4)) + goto corrupt_file; + + /* make sure there are enough data in the stsz atom */ + if (!stream->sample_size) { + /* different sizes for each sample */ + if (!qt_atom_parser_has_chunks (&stream->stsz, stream->n_samples, 4)) + goto corrupt_file; + } + } else { + /* treat chunks as samples */ + if (!gst_byte_reader_get_uint32_be (&stream->stco, &stream->n_samples)) + goto corrupt_file; + } + + GST_DEBUG_OBJECT (qtdemux, "allocating n_samples %u * %u (%.2f MB)", + stream->n_samples, (guint) sizeof (QtDemuxSample), + stream->n_samples * sizeof (QtDemuxSample) / (1024.0 * 1024.0)); + + if (stream->n_samples >= + QTDEMUX_MAX_SAMPLE_INDEX_SIZE / sizeof (QtDemuxSample)) { + GST_WARNING_OBJECT (qtdemux, "not allocating index of %d samples, would " + "be larger than %uMB (broken file?)", stream->n_samples, + QTDEMUX_MAX_SAMPLE_INDEX_SIZE >> 20); + return FALSE; + } + + stream->samples = g_try_new0 (QtDemuxSample, stream->n_samples); + if (!stream->samples) { + GST_WARNING_OBJECT (qtdemux, "failed to allocate %d samples", + stream->n_samples); + return FALSE; + } + + + /* composition time-to-sample */ + if ((stream->ctts_present = + ! !qtdemux_tree_get_child_by_type_full (stbl, FOURCC_ctts, + &stream->ctts) ? TRUE : FALSE) == TRUE) { + /* copy atom data into a new buffer for later use */ + stream->ctts.data = g_memdup (stream->ctts.data, stream->ctts.size); + + /* skip version + flags */ + if (!gst_byte_reader_skip (&stream->ctts, 1 + 3) + || !gst_byte_reader_get_uint32_be (&stream->ctts, + &stream->n_composition_times)) + goto corrupt_file; + + /* make sure there's enough data */ + if (!qt_atom_parser_has_chunks (&stream->ctts, stream->n_composition_times, + 4 + 4)) + goto corrupt_file; + } + + return TRUE; + +corrupt_file: + { + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is corrupt and cannot be played.")), (NULL)); + return FALSE; + } +no_samples: + { + gst_qtdemux_stbl_free (stream); + if (!qtdemux->fragmented) { + /* not quite good */ + GST_WARNING_OBJECT (qtdemux, "stream has no samples"); + return FALSE; + } else { + /* may pick up samples elsewhere */ + return TRUE; + } + } +} + +/* collect samples from the next sample to be parsed up to sample @n for @stream + * by reading the info from @stbl + * + * This code can be executed from both the streaming thread and the seeking + * thread so it takes the object lock to protect itself + */ +static gboolean +qtdemux_parse_samples (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 n) +{ + gint i, j, k; + QtDemuxSample *samples, *first, *cur, *last; + guint32 n_samples_per_chunk; + guint32 n_samples; + + GST_LOG_OBJECT (qtdemux, "parsing samples for stream fourcc %" + GST_FOURCC_FORMAT ", pad %s", GST_FOURCC_ARGS (stream->fourcc), + stream->pad ? GST_PAD_NAME (stream->pad) : "(NULL)"); + + n_samples = stream->n_samples; + + if (n >= n_samples) + goto out_of_samples; + + GST_OBJECT_LOCK (qtdemux); + if (n <= stream->stbl_index) + goto already_parsed; + + GST_DEBUG_OBJECT (qtdemux, "parsing up to sample %u", n); + + if (!stream->stsz.data) { + /* so we already parsed and passed all the moov samples; + * onto fragmented ones */ + g_assert (qtdemux->fragmented); + goto done; + } + + /* pointer to the sample table */ + samples = stream->samples; + + /* starts from -1, moves to the next sample index to parse */ + stream->stbl_index++; + + /* keep track of the first and last sample to fill */ + first = &samples[stream->stbl_index]; + last = &samples[n]; + + if (stream->chunks_are_chunks) { + /* set the sample sizes */ + if (stream->sample_size == 0) { + /* different sizes for each sample */ + for (cur = first; cur <= last; cur++) { + cur->size = gst_byte_reader_get_uint32_be_unchecked (&stream->stsz); + GST_LOG_OBJECT (qtdemux, "sample %d has size %u", + (guint) (cur - samples), cur->size); + } + } else { + /* samples have the same size */ + GST_LOG_OBJECT (qtdemux, "all samples have size %u", stream->sample_size); + for (cur = first; cur <= last; cur++) + cur->size = stream->sample_size; + } + } + + n_samples_per_chunk = stream->n_samples_per_chunk; + cur = first; + + for (i = stream->stsc_index; i < n_samples_per_chunk; i++) { + guint32 last_chunk; + + if (stream->stsc_chunk_index >= stream->last_chunk + || stream->stsc_chunk_index < stream->first_chunk) { + stream->first_chunk = + gst_byte_reader_get_uint32_be_unchecked (&stream->stsc); + stream->samples_per_chunk = + gst_byte_reader_get_uint32_be_unchecked (&stream->stsc); + gst_byte_reader_skip_unchecked (&stream->stsc, 4); + + /* chunk numbers are counted from 1 it seems */ + if (G_UNLIKELY (stream->first_chunk == 0)) + goto corrupt_file; + + --stream->first_chunk; + + /* the last chunk of each entry is calculated by taking the first chunk + * of the next entry; except if there is no next, where we fake it with + * INT_MAX */ + if (G_UNLIKELY (i == (stream->n_samples_per_chunk - 1))) { + stream->last_chunk = G_MAXUINT32; + } else { + stream->last_chunk = + gst_byte_reader_peek_uint32_be_unchecked (&stream->stsc); + if (G_UNLIKELY (stream->last_chunk == 0)) + goto corrupt_file; + + --stream->last_chunk; + } + + GST_LOG_OBJECT (qtdemux, + "entry %d has first_chunk %d, last_chunk %d, samples_per_chunk %d", i, + stream->first_chunk, stream->last_chunk, stream->samples_per_chunk); + + if (G_UNLIKELY (stream->last_chunk < stream->first_chunk)) + goto corrupt_file; + + if (stream->last_chunk != G_MAXUINT32) { + if (!qt_atom_parser_peek_sub (&stream->stco, + stream->first_chunk * stream->co_size, + (stream->last_chunk - stream->first_chunk) * stream->co_size, + &stream->co_chunk)) + goto corrupt_file; + + } else { + stream->co_chunk = stream->stco; + if (!gst_byte_reader_skip (&stream->co_chunk, + stream->first_chunk * stream->co_size)) + goto corrupt_file; + } + + stream->stsc_chunk_index = stream->first_chunk; + } + + last_chunk = stream->last_chunk; + + if (stream->chunks_are_chunks) { + for (j = stream->stsc_chunk_index; j < last_chunk; j++) { + guint32 samples_per_chunk; + guint64 chunk_offset; + + if (!stream->stsc_sample_index + && !qt_atom_parser_get_offset (&stream->co_chunk, stream->co_size, + &stream->chunk_offset)) + goto corrupt_file; + + samples_per_chunk = stream->samples_per_chunk; + chunk_offset = stream->chunk_offset; + + for (k = stream->stsc_sample_index; k < samples_per_chunk; k++) { + GST_LOG_OBJECT (qtdemux, "Creating entry %d with offset %" + G_GUINT64_FORMAT, (guint) (cur - samples), stream->chunk_offset); + + cur->offset = chunk_offset; + chunk_offset += cur->size; + cur++; + + if (G_UNLIKELY (cur > last)) { + /* save state */ + stream->stsc_sample_index = k + 1; + stream->chunk_offset = chunk_offset; + stream->stsc_chunk_index = j; + goto done2; + } + } + stream->stsc_sample_index = 0; + } + stream->stsc_chunk_index = j; + } else { + cur = &samples[stream->stsc_chunk_index]; + + for (j = stream->stsc_chunk_index; j < last_chunk; j++) { + if (j > n) { + /* save state */ + stream->stsc_chunk_index = j; + goto done; + } + + cur->offset = + qt_atom_parser_get_offset_unchecked (&stream->co_chunk, + stream->co_size); + + GST_LOG_OBJECT (qtdemux, "Created entry %d with offset " + "%" G_GUINT64_FORMAT, j, cur->offset); + + if (stream->samples_per_frame * stream->bytes_per_frame) { + cur->size = + (stream->samples_per_chunk * stream->n_channels) / + stream->samples_per_frame * stream->bytes_per_frame; + } else { + cur->size = stream->samples_per_chunk; + } + + GST_DEBUG_OBJECT (qtdemux, + "keyframe sample %d: timestamp %" GST_TIME_FORMAT ", size %u", + j, GST_TIME_ARGS (gst_util_uint64_scale (stream->stco_sample_index, + GST_SECOND, stream->timescale)), cur->size); + + cur->timestamp = stream->stco_sample_index; + cur->duration = stream->samples_per_chunk; + cur->keyframe = TRUE; + cur++; + + stream->stco_sample_index += stream->samples_per_chunk; + } + stream->stsc_chunk_index = j; + } + stream->stsc_index++; + } + + if (!stream->chunks_are_chunks) + goto ctts; +done2: + { + guint32 n_sample_times; + + n_sample_times = stream->n_sample_times; + cur = first; + + for (i = stream->stts_index; i < n_sample_times; i++) { + guint32 stts_samples; + gint32 stts_duration; + gint64 stts_time; + + if (stream->stts_sample_index >= stream->stts_samples + || !stream->stts_sample_index) { + + stream->stts_samples = + gst_byte_reader_get_uint32_be_unchecked (&stream->stts); + stream->stts_duration = + gst_byte_reader_get_uint32_be_unchecked (&stream->stts); + + GST_LOG_OBJECT (qtdemux, "block %d, %u timestamps, duration %u", + i, stream->stts_samples, stream->stts_duration); + + stream->stts_sample_index = 0; + } + + stts_samples = stream->stts_samples; + stts_duration = stream->stts_duration; + stts_time = stream->stts_time; + + for (j = stream->stts_sample_index; j < stts_samples; j++) { + GST_DEBUG_OBJECT (qtdemux, + "sample %d: index %d, timestamp %" GST_TIME_FORMAT, + (guint) (cur - samples), j, + GST_TIME_ARGS (gst_util_uint64_scale (stts_time, GST_SECOND, + stream->timescale))); + + cur->timestamp = stts_time; + cur->duration = stts_duration; + + /* avoid 32-bit wrap-around, + * but still mind possible 'negative' duration */ + stts_time += (gint64) stts_duration; + cur++; + + if (G_UNLIKELY (cur > last)) { + /* save values */ + stream->stts_time = stts_time; + stream->stts_sample_index = j + 1; + goto done3; + } + } + stream->stts_sample_index = 0; + stream->stts_time = stts_time; + stream->stts_index++; + } + /* fill up empty timestamps with the last timestamp, this can happen when + * the last samples do not decode and so we don't have timestamps for them. + * We however look at the last timestamp to estimate the track length so we + * need something in here. */ + for (; cur < last; cur++) { + GST_DEBUG_OBJECT (qtdemux, + "fill sample %d: timestamp %" GST_TIME_FORMAT, + (guint) (cur - samples), + GST_TIME_ARGS (gst_util_uint64_scale (stream->stts_time, GST_SECOND, + stream->timescale))); + cur->timestamp = stream->stts_time; + cur->duration = -1; + } + } +done3: + { + /* sample sync, can be NULL */ + if (stream->stss_present == TRUE) { + guint32 n_sample_syncs; + + n_sample_syncs = stream->n_sample_syncs; + + if (!n_sample_syncs) { + GST_DEBUG_OBJECT (qtdemux, "all samples are keyframes"); + stream->all_keyframe = TRUE; + } else { + for (i = stream->stss_index; i < n_sample_syncs; i++) { + /* note that the first sample is index 1, not 0 */ + guint32 index; + + index = gst_byte_reader_get_uint32_be_unchecked (&stream->stss); + + if (G_LIKELY (index > 0 && index <= n_samples)) { + index -= 1; + samples[index].keyframe = TRUE; + GST_DEBUG_OBJECT (qtdemux, "samples at %u is keyframe", index); + /* and exit if we have enough samples */ + if (G_UNLIKELY (index >= n)) { + i++; + break; + } + } + } + /* save state */ + stream->stss_index = i; + } + } else { + /* no stss, all samples are keyframes */ + stream->all_keyframe = TRUE; + GST_DEBUG_OBJECT (qtdemux, "setting all keyframes"); + } + } + +ctts: + /* composition time to sample */ + if (stream->ctts_present == TRUE) { + guint32 n_composition_times; + guint32 ctts_count; + gint32 ctts_soffset; + + /* Fill in the pts_offsets */ + cur = first; + n_composition_times = stream->n_composition_times; + + for (i = stream->ctts_index; i < n_composition_times; i++) { + if (stream->ctts_sample_index >= stream->ctts_count + || !stream->ctts_sample_index) { + stream->ctts_count = + gst_byte_reader_get_uint32_be_unchecked (&stream->ctts); + stream->ctts_soffset = + gst_byte_reader_get_int32_be_unchecked (&stream->ctts); + stream->ctts_sample_index = 0; + } + + ctts_count = stream->ctts_count; + ctts_soffset = stream->ctts_soffset; + + for (j = stream->ctts_sample_index; j < ctts_count; j++) { + cur->pts_offset = ctts_soffset; + cur++; + + if (G_UNLIKELY (cur > last)) { + /* save state */ + stream->ctts_sample_index = j + 1; + goto done; + } + } + stream->ctts_sample_index = 0; + stream->ctts_index++; + } + } +done: + stream->stbl_index = n; + /* if index has been completely parsed, free data that is no-longer needed */ + if (n + 1 == stream->n_samples) { + gst_qtdemux_stbl_free (stream); + GST_DEBUG_OBJECT (qtdemux, + "parsed all available samples; checking for more"); + while (n + 1 == stream->n_samples) + if (qtdemux_add_fragmented_samples (qtdemux) != GST_FLOW_OK) + break; + } + GST_OBJECT_UNLOCK (qtdemux); + + return TRUE; + + /* SUCCESS */ +already_parsed: + { + GST_LOG_OBJECT (qtdemux, + "Tried to parse up to sample %u but this sample has already been parsed", + n); + /* if fragmented, there may be more */ + if (qtdemux->fragmented && n == stream->stbl_index) + goto done; + GST_OBJECT_UNLOCK (qtdemux); + return TRUE; + } + /* ERRORS */ +out_of_samples: + { + GST_LOG_OBJECT (qtdemux, + "Tried to parse up to sample %u but there are only %u samples", n + 1, + stream->n_samples); + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is corrupt and cannot be played.")), (NULL)); + return FALSE; + } +corrupt_file: + { + GST_OBJECT_UNLOCK (qtdemux); + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is corrupt and cannot be played.")), (NULL)); + return FALSE; + } +} + +/* collect all segment info for @stream. + */ +static gboolean +qtdemux_parse_segments (GstQTDemux * qtdemux, QtDemuxStream * stream, + GNode * trak) +{ + GNode *edts; + + /* parse and prepare segment info from the edit list */ + GST_DEBUG_OBJECT (qtdemux, "looking for edit list container"); + stream->n_segments = 0; + stream->segments = NULL; + if ((edts = qtdemux_tree_get_child_by_type (trak, FOURCC_edts))) { + GNode *elst; + gint n_segments; + gint i, count; + guint64 time, stime; + guint8 *buffer; + + GST_DEBUG_OBJECT (qtdemux, "looking for edit list"); + if (!(elst = qtdemux_tree_get_child_by_type (edts, FOURCC_elst))) + goto done; + + buffer = elst->data; + + n_segments = QT_UINT32 (buffer + 12); + + /* we might allocate a bit too much, at least allocate 1 segment */ + stream->segments = g_new (QtDemuxSegment, MAX (n_segments, 1)); + + /* segments always start from 0 */ + time = 0; + stime = 0; + count = 0; + for (i = 0; i < n_segments; i++) { + guint64 duration; + guint64 media_time; + QtDemuxSegment *segment; + guint32 rate_int; + + media_time = QT_UINT32 (buffer + 20 + i * 12); + + /* -1 media time is an empty segment, just ignore it */ + if (media_time == G_MAXUINT32) + continue; + + duration = QT_UINT32 (buffer + 16 + i * 12); + + segment = &stream->segments[count++]; + + /* time and duration expressed in global timescale */ + segment->time = stime; + /* add non scaled values so we don't cause roundoff errors */ + time += duration; + stime = gst_util_uint64_scale (time, GST_SECOND, qtdemux->timescale); + segment->stop_time = stime; + segment->duration = stime - segment->time; + /* media_time expressed in stream timescale */ + segment->media_start = + gst_util_uint64_scale (media_time, GST_SECOND, stream->timescale); + segment->media_stop = segment->media_start + segment->duration; + rate_int = GST_READ_UINT32_BE (buffer + 24 + i * 12); + + if (rate_int <= 1) { + /* 0 is not allowed, some programs write 1 instead of the floating point + * value */ + GST_WARNING_OBJECT (qtdemux, "found suspicious rate %" G_GUINT32_FORMAT, + rate_int); + segment->rate = 1; + } else { + segment->rate = rate_int / 65536.0; + } + + GST_DEBUG_OBJECT (qtdemux, "created segment %d time %" GST_TIME_FORMAT + ", duration %" GST_TIME_FORMAT ", media_time %" GST_TIME_FORMAT + ", rate %g, (%d)", i, GST_TIME_ARGS (segment->time), + GST_TIME_ARGS (segment->duration), + GST_TIME_ARGS (segment->media_start), segment->rate, rate_int); + } + GST_DEBUG_OBJECT (qtdemux, "found %d non-empty segments", count); + stream->n_segments = count; + } +done: + + /* push based does not handle segments, so act accordingly here, + * and warn if applicable */ + if (!qtdemux->pullbased) { + GST_WARNING_OBJECT (qtdemux, "streaming; discarding edit list segments"); + /* remove and use default one below, we stream like it anyway */ + g_free (stream->segments); + stream->segments = NULL; + stream->n_segments = 0; + } + + /* no segments, create one to play the complete trak */ + if (stream->n_segments == 0) { + GstClockTime stream_duration = + gst_util_uint64_scale (stream->duration, GST_SECOND, stream->timescale); + + if (stream->segments == NULL) + stream->segments = g_new (QtDemuxSegment, 1); + + /* represent unknown our way */ + if (stream_duration == 0) + stream_duration = -1; + + stream->segments[0].time = 0; + stream->segments[0].stop_time = stream_duration; + stream->segments[0].duration = stream_duration; + stream->segments[0].media_start = 0; + stream->segments[0].media_stop = stream_duration; + stream->segments[0].rate = 1.0; + + GST_DEBUG_OBJECT (qtdemux, "created dummy segment %" GST_TIME_FORMAT, + GST_TIME_ARGS (stream_duration)); + stream->n_segments = 1; + } + GST_DEBUG_OBJECT (qtdemux, "using %d segments", stream->n_segments); + + return TRUE; +} + +/* + * Parses the stsd atom of a svq3 trak looking for + * the SMI and gama atoms. + */ +static void +qtdemux_parse_svq3_stsd_data (GstQTDemux * qtdemux, GNode * stsd, + guint8 ** gamma, GstBuffer ** seqh) +{ + guint8 *_gamma = NULL; + GstBuffer *_seqh = NULL; + guint8 *stsd_data = stsd->data; + guint32 length = QT_UINT32 (stsd_data); + guint16 version; + + if (length < 32) { + GST_WARNING_OBJECT (qtdemux, "stsd too short"); + goto end; + } + + stsd_data += 32; + length -= 32; + version = QT_UINT16 (stsd_data); + if (version == 3) { + if (length >= 70) { + length -= 70; + stsd_data += 70; + while (length > 8) { + guint32 fourcc, size; + guint8 *data; + size = QT_UINT32 (stsd_data); + fourcc = QT_FOURCC (stsd_data + 4); + data = stsd_data + 8; + + switch (fourcc) { + case FOURCC_gama:{ + if (size == 12) { + _gamma = data; + } else { + GST_WARNING_OBJECT (qtdemux, "Unexpected size %" G_GUINT32_FORMAT + " for gama atom, expected 12", size); + } + break; + } + case FOURCC_SMI_:{ + if (size > 16 && QT_FOURCC (data) == FOURCC_SEQH) { + guint32 seqh_size; + if (_seqh != NULL) { + GST_WARNING_OBJECT (qtdemux, "Unexpected second SEQH SMI atom " + " found, ignoring"); + } else { + seqh_size = QT_UINT32 (data + 4); + if (seqh_size > 0) { + _seqh = gst_buffer_new_and_alloc (seqh_size); + memcpy (GST_BUFFER_DATA (_seqh), data + 8, seqh_size); + } + } + } + break; + } + default:{ + GST_WARNING_OBJECT (qtdemux, "Unhandled atom %" GST_FOURCC_FORMAT + " in SVQ3 entry in stsd atom", GST_FOURCC_ARGS (fourcc)); + } + } + + if (size <= length) { + length -= size; + stsd_data += size; + } + } + } else { + GST_WARNING_OBJECT (qtdemux, "SVQ3 entry too short in stsd atom"); + } + } else { + GST_WARNING_OBJECT (qtdemux, "Unexpected version for SVQ3 entry %" + G_GUINT16_FORMAT, version); + goto end; + } + +end: + if (gamma) { + *gamma = _gamma; + } + if (seqh) { + *seqh = _seqh; + } else if (_seqh) { + gst_buffer_unref (_seqh); + } +} + +static gchar * +qtdemux_get_rtsp_uri_from_hndl (GstQTDemux * qtdemux, GNode * minf) +{ + GNode *dinf; + GstByteReader dref; + gchar *uri = NULL; + + /* + * Get 'dinf', to get its child 'dref', that might contain a 'hndl' + * atom that might contain a 'data' atom with the rtsp uri. + * This case was reported in bug #597497, some info about + * the hndl atom can be found in TN1195 + */ + dinf = qtdemux_tree_get_child_by_type (minf, FOURCC_dinf); + GST_DEBUG_OBJECT (qtdemux, "Trying to obtain rtsp URI for stream trak"); + + if (dinf) { + guint32 dref_num_entries = 0; + if (qtdemux_tree_get_child_by_type_full (dinf, FOURCC_dref, &dref) && + gst_byte_reader_skip (&dref, 4) && + gst_byte_reader_get_uint32_be (&dref, &dref_num_entries)) { + gint i; + + /* search dref entries for hndl atom */ + for (i = 0; i < dref_num_entries; i++) { + guint32 size = 0, type; + guint8 string_len = 0; + if (gst_byte_reader_get_uint32_be (&dref, &size) && + qt_atom_parser_get_fourcc (&dref, &type)) { + if (type == FOURCC_hndl) { + GST_DEBUG_OBJECT (qtdemux, "Found hndl atom"); + + /* skip data reference handle bytes and the + * following pascal string and some extra 4 + * bytes I have no idea what are */ + if (!gst_byte_reader_skip (&dref, 4) || + !gst_byte_reader_get_uint8 (&dref, &string_len) || + !gst_byte_reader_skip (&dref, string_len + 4)) { + GST_WARNING_OBJECT (qtdemux, "Failed to parse hndl atom"); + break; + } + + /* iterate over the atoms to find the data atom */ + while (gst_byte_reader_get_remaining (&dref) >= 8) { + guint32 atom_size; + guint32 atom_type; + + if (gst_byte_reader_get_uint32_be (&dref, &atom_size) && + qt_atom_parser_get_fourcc (&dref, &atom_type)) { + if (atom_type == FOURCC_data) { + const guint8 *uri_aux = NULL; + + /* found the data atom that might contain the rtsp uri */ + GST_DEBUG_OBJECT (qtdemux, "Found data atom inside " + "hndl atom, interpreting it as an URI"); + if (gst_byte_reader_peek_data (&dref, atom_size - 8, + &uri_aux)) { + if (g_strstr_len ((gchar *) uri_aux, 7, "rtsp://") != NULL) + uri = g_strndup ((gchar *) uri_aux, atom_size - 8); + else + GST_WARNING_OBJECT (qtdemux, "Data atom in hndl atom " + "didn't contain a rtsp address"); + } else { + GST_WARNING_OBJECT (qtdemux, "Failed to get the data " + "atom contents"); + } + break; + } + /* skipping to the next entry */ + gst_byte_reader_skip (&dref, atom_size - 8); + } else { + GST_WARNING_OBJECT (qtdemux, "Failed to parse hndl child " + "atom header"); + break; + } + } + break; + } + /* skip to the next entry */ + gst_byte_reader_skip (&dref, size - 8); + } else { + GST_WARNING_OBJECT (qtdemux, "Error parsing dref atom"); + } + } + GST_DEBUG_OBJECT (qtdemux, "Finished parsing dref atom"); + } + } + return uri; +} + +static gint +less_than (gconstpointer a, gconstpointer b) +{ + const guint32 *av = a, *bv = b; + + return *av - *bv; +} + +#define AMR_NB_ALL_MODES 0x81ff +#define AMR_WB_ALL_MODES 0x83ff +static guint +qtdemux_parse_amr_bitrate (GstBuffer * buf, gboolean wb) +{ + /* The 'damr' atom is of the form: + * + * | vendor | decoder_ver | mode_set | mode_change_period | frames/sample | + * 32 b 8 b 16 b 8 b 8 b + * + * The highest set bit of the first 7 (AMR-NB) or 8 (AMR-WB) bits of mode_set + * represents the highest mode used in the stream (and thus the maximum + * bitrate), with a couple of special cases as seen below. + */ + + /* Map of frame type ID -> bitrate */ + static const guint nb_bitrates[] = { + 4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200 + }; + static const guint wb_bitrates[] = { + 6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850 + }; + const guint8 *data = GST_BUFFER_DATA (buf); + guint size = QT_UINT32 (data), max_mode; + guint16 mode_set; + + if (GST_BUFFER_SIZE (buf) != 0x11) { + GST_DEBUG ("Atom should have size 0x11, not %u", size); + goto bad_data; + } + + if (QT_FOURCC (data + 4) != GST_MAKE_FOURCC ('d', 'a', 'm', 'r')) { + GST_DEBUG ("Unknown atom in %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (QT_UINT32 (data + 4))); + goto bad_data; + } + + mode_set = QT_UINT16 (data + 13); + + if (mode_set == (wb ? AMR_WB_ALL_MODES : AMR_NB_ALL_MODES)) + max_mode = 7 + (wb ? 1 : 0); + else + /* AMR-NB modes fo from 0-7, and AMR-WB modes go from 0-8 */ + max_mode = g_bit_nth_msf ((gulong) mode_set & (wb ? 0x1ff : 0xff), -1); + + if (max_mode == -1) { + GST_DEBUG ("No mode indication was found (mode set) = %x", + (guint) mode_set); + goto bad_data; + } + + return wb ? wb_bitrates[max_mode] : nb_bitrates[max_mode]; + +bad_data: + return 0; +} + +/* parse the traks. + * With each track we associate a new QtDemuxStream that contains all the info + * about the trak. + * traks that do not decode to something (like strm traks) will not have a pad. + */ +static gboolean +qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) +{ + GstByteReader tkhd; + int offset; + GNode *mdia; + GNode *mdhd; + GNode *hdlr; + GNode *minf; + GNode *stbl; + GNode *stsd; + GNode *mp4a; + GNode *mp4v; + GNode *wave; + GNode *esds; + GNode *pasp; + QtDemuxStream *stream; + GstTagList *list = NULL; + gchar *codec = NULL; + const guint8 *stsd_data; + guint16 lang_code; /* quicktime lang code or packed iso code */ + guint32 version; + guint32 tkhd_flags = 0; + guint8 tkhd_version = 0; + guint32 fourcc; + guint value_size, len; +#ifdef QTDEMUX_MODIFICATION + guint32 a; + guint32 b; + guint32 c; + guint32 d; + gboolean res = FALSE; + guint16 layer; + guint16 alternate_group; + guint16 volume; + GstClockTime duration; +#endif + + stream = g_new0 (QtDemuxStream, 1); + /* new streams always need a discont */ + stream->discont = TRUE; + /* we enable clipping for raw audio/video streams */ + stream->need_clip = FALSE; + stream->need_process = FALSE; + stream->segment_index = -1; + stream->time_position = 0; + stream->sample_index = -1; + stream->last_ret = GST_FLOW_OK; +#ifdef QTDEMUX_MODIFICATION + stream->trickplay_info = g_new0 (TrickPlayInfo, 1); + stream->trickplay_info->prev_kidx = 0; + stream->trickplay_info->next_kidx = 0; + stream->trickplay_info->kidxs_dur_diff = 0; + stream->orientation = -1; +#endif + if (!qtdemux_tree_get_child_by_type_full (trak, FOURCC_tkhd, &tkhd) + || !gst_byte_reader_get_uint8 (&tkhd, &tkhd_version) + || !gst_byte_reader_get_uint24_be (&tkhd, &tkhd_flags)) + goto corrupt_file; + + /* pick between 64 or 32 bits */ + value_size = tkhd_version == 1 ? 8 : 4; + if (!gst_byte_reader_skip (&tkhd, value_size * 2) || + !gst_byte_reader_get_uint32_be (&tkhd, &stream->track_id)) + goto corrupt_file; + + GST_LOG_OBJECT (qtdemux, "track[tkhd] version/flags/id: 0x%02x/%06x/%u", + tkhd_version, tkhd_flags, stream->track_id); +#ifdef QTDEMUX_MODIFICATION + if (!gst_byte_reader_skip (&tkhd, 4)) //skipping for reserved bits + goto corrupt_file; + + //reading duration from the tkhd atom, 64 bits if version is 1 and 32 bits if version is 0 + if(tkhd_version == 1) { + if(gst_byte_reader_get_uint64_be (&tkhd, &duration)) { + GST_LOG_OBJECT(qtdemux, "the duration from tkhd field is %"GST_TIME_FORMAT, GST_TIME_ARGS(duration)); + } else { + GST_LOG_OBJECT(qtdemux ,"no duration information present"); + goto corrupt_file; + } + } else { + if(gst_byte_reader_get_uint32_be (&tkhd, &duration)) { + GST_LOG_OBJECT(qtdemux, "the duration from tkhd field is %"GST_TIME_FORMAT, GST_TIME_ARGS(duration)); + } else { + GST_LOG_OBJECT(qtdemux, "no duration information present"); + goto corrupt_file; + } + } + + if(!gst_byte_reader_skip(&tkhd, 8)) { //skipping for reserved + GST_LOG_OBJECT(qtdemux, "tkhd doesn't have more information"); + goto corrupt_file; + } + +//reading layer, alternate_group and volume information from tkhd atom + if(!gst_byte_reader_get_uint16_be(&tkhd, &layer) || + !gst_byte_reader_get_uint16_be(&tkhd, &alternate_group) || + !gst_byte_reader_get_uint16_be(&tkhd, &volume)) { + GST_LOG_OBJECT(qtdemux, "tkhd doesn't have layer, group or volume information"); + goto corrupt_file; + } else { + GST_LOG_OBJECT(qtdemux, "the layer info is %d", layer); + GST_LOG_OBJECT(qtdemux, "the alternate group info is %d", alternate_group); + GST_LOG_OBJECT(qtdemux, "the volume information is %d", volume); + } + if(!gst_byte_reader_skip(&tkhd, 2)) { //skipping for reserved + GST_LOG_OBJECT(qtdemux, "no information present in tkhd"); + goto corrupt_file; + } + + //reading the orientation matrix information + if(!gst_byte_reader_get_uint32_be(&tkhd, &a) || + !gst_byte_reader_get_uint32_be(&tkhd, &b)) { + GST_LOG_OBJECT(qtdemux, "No matrix information present"); + goto corrupt_file; + } else { + GST_LOG_OBJECT(qtdemux, "matrix a and b info is %08x %08x", a, b); + } + + if(!gst_byte_reader_skip(&tkhd, 4)) { //skipping some unrelevant information + GST_LOG_OBJECT(qtdemux, "tkhd doesn't have more information"); + goto corrupt_file; + } + + if(!gst_byte_reader_get_uint32_be(&tkhd, &c) || + !gst_byte_reader_get_uint32_be(&tkhd, &d)) { + goto corrupt_file; + } else { + GST_LOG_OBJECT(qtdemux, "c and d info is %08x %08x", c, d); + } + + //Checking the orientation information with parsed matrix information + if(a == 0x00010000 && b == 0x00000000 && c == 0x00000000 && d == 0x00010000) + stream->orientation = 0; + if(a == 0x00000000 && b == 0x00010000 && c == 0xFFFF0000 && d == 0x00000000) + stream->orientation = 90; + if(a == 0xFFFF0000 && b == 0x00000000 && c == 0x00000000 && d == 0xFFFF0000) + stream->orientation = 180; + if(a == 0x00000000 && b == 0xFFFF0000 && c == 0x00010000 && d == 0x00000000) + stream->orientation = 270; + + GST_INFO("the orientation is %d", stream->orientation); +#endif + if (!(mdia = qtdemux_tree_get_child_by_type (trak, FOURCC_mdia))) + goto corrupt_file; + + if (!(mdhd = qtdemux_tree_get_child_by_type (mdia, FOURCC_mdhd))) { + /* be nice for some crooked mjp2 files that use mhdr for mdhd */ + if (qtdemux->major_brand != FOURCC_mjp2 || + !(mdhd = qtdemux_tree_get_child_by_type (mdia, FOURCC_mhdr))) + goto corrupt_file; + } + + len = QT_UINT32 ((guint8 *) mdhd->data); + version = QT_UINT32 ((guint8 *) mdhd->data + 8); + GST_LOG_OBJECT (qtdemux, "track version/flags: %08x", version); + if (version == 0x01000000) { + if (len < 38) + goto corrupt_file; + stream->timescale = QT_UINT32 ((guint8 *) mdhd->data + 28); + stream->duration = QT_UINT64 ((guint8 *) mdhd->data + 32); + lang_code = QT_UINT16 ((guint8 *) mdhd->data + 36); + } else { + if (len < 30) + goto corrupt_file; + stream->timescale = QT_UINT32 ((guint8 *) mdhd->data + 20); + stream->duration = QT_UINT32 ((guint8 *) mdhd->data + 24); + lang_code = QT_UINT16 ((guint8 *) mdhd->data + 28); + } + + if (lang_code < 0x800) { + qtdemux_lang_map_qt_code_to_iso (stream->lang_id, lang_code); + } else { + stream->lang_id[0] = 0x60 + ((lang_code >> 10) & 0x1F); + stream->lang_id[1] = 0x60 + ((lang_code >> 5) & 0x1F); + stream->lang_id[2] = 0x60 + (lang_code & 0x1F); + stream->lang_id[3] = 0; + } + + GST_LOG_OBJECT (qtdemux, "track timescale: %" G_GUINT32_FORMAT, + stream->timescale); + GST_LOG_OBJECT (qtdemux, "track duration: %" G_GUINT64_FORMAT, + stream->duration); + GST_LOG_OBJECT (qtdemux, "track language code/id: 0x%04x/%s", + lang_code, stream->lang_id); + + if (G_UNLIKELY (stream->timescale == 0 || qtdemux->timescale == 0)) + goto corrupt_file; + + /* fragmented files may have bogus duration in moov */ + if (!qtdemux->fragmented && + qtdemux->duration != G_MAXINT64 && stream->duration != G_MAXINT32) { + guint64 tdur1, tdur2; + + /* don't overflow */ + tdur1 = stream->timescale * (guint64) qtdemux->duration; + tdur2 = qtdemux->timescale * (guint64) stream->duration; + + /* HACK: + * some of those trailers, nowadays, have prologue images that are + * themselves vide tracks as well. I haven't really found a way to + * identify those yet, except for just looking at their duration. */ + if (tdur1 != 0 && (tdur2 * 10 / tdur1) < 2) { + GST_WARNING_OBJECT (qtdemux, + "Track shorter than 20%% (%" G_GUINT64_FORMAT "/%" G_GUINT32_FORMAT + " vs. %" G_GUINT64_FORMAT "/%" G_GUINT32_FORMAT ") of the stream " + "found, assuming preview image or something; skipping track", + stream->duration, stream->timescale, qtdemux->duration, + qtdemux->timescale); +#ifdef QTDEMUX_MODIFICATION + g_free (stream->trickplay_info); +#endif + g_free (stream); + return TRUE; + } + } + + if (!(hdlr = qtdemux_tree_get_child_by_type (mdia, FOURCC_hdlr))) + goto corrupt_file; + + GST_LOG_OBJECT (qtdemux, "track type: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (QT_FOURCC ((guint8 *) hdlr->data + 12))); + + len = QT_UINT32 ((guint8 *) hdlr->data); + if (len >= 20) + stream->subtype = QT_FOURCC ((guint8 *) hdlr->data + 16); + GST_LOG_OBJECT (qtdemux, "track subtype: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (stream->subtype)); + + if (!(minf = qtdemux_tree_get_child_by_type (mdia, FOURCC_minf))) + goto corrupt_file; + + if (!(stbl = qtdemux_tree_get_child_by_type (minf, FOURCC_stbl))) + goto corrupt_file; + + /* parse stsd */ + if (!(stsd = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsd))) + goto corrupt_file; + stsd_data = (const guint8 *) stsd->data; + + /* stsd should at least have one entry */ + len = QT_UINT32 (stsd_data); + if (len < 24) + goto corrupt_file; + + /* and that entry should fit within stsd */ + len = QT_UINT32 (stsd_data + 16); + if (len > QT_UINT32 (stsd_data) + 16) + goto corrupt_file; + GST_LOG_OBJECT (qtdemux, "stsd len: %d", len); + + stream->fourcc = fourcc = QT_FOURCC (stsd_data + 16 + 4); + GST_LOG_OBJECT (qtdemux, "stsd type: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (stream->fourcc)); + + if ((fourcc == FOURCC_drms) || (fourcc == FOURCC_drmi) || + ((fourcc & 0xFFFFFF00) == GST_MAKE_FOURCC ('e', 'n', 'c', 0))) + goto error_encrypted; + + if (stream->subtype == FOURCC_vide) { + guint32 w = 0, h = 0; + + stream->sampled = TRUE; + + /* version 1 uses some 64-bit ints */ +#ifdef QTDEMUX_MODIFICATION + if (!gst_byte_reader_get_uint32_be (&tkhd, &w) + || !gst_byte_reader_get_uint32_be (&tkhd, &h)) +#else + if (!gst_byte_reader_skip (&tkhd, 56 + value_size) + || !gst_byte_reader_get_uint32_be (&tkhd, &w) + || !gst_byte_reader_get_uint32_be (&tkhd, &h)) +#endif + + goto corrupt_file; + + stream->display_width = w >> 16; + stream->display_height = h >> 16; + + offset = 16; + if (len < 86) + goto corrupt_file; + + stream->width = QT_UINT16 (stsd_data + offset + 32); + stream->height = QT_UINT16 (stsd_data + offset + 34); + stream->fps_n = 0; /* this is filled in later */ + stream->fps_d = 0; /* this is filled in later */ + stream->bits_per_sample = QT_UINT16 (stsd_data + offset + 82); + stream->color_table_id = QT_UINT16 (stsd_data + offset + 84); + + GST_LOG_OBJECT (qtdemux, "frame count: %u", + QT_UINT16 (stsd_data + offset + 48)); + + stream->caps = + qtdemux_video_caps (qtdemux, stream, fourcc, stsd_data, &codec); + if (codec) { + list = gst_tag_list_new (); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_VIDEO_CODEC, codec, NULL); + g_free (codec); + codec = NULL; + } + + esds = NULL; + pasp = NULL; +#ifdef QTDEMUX_MODIFICATION + mp4v = qtdemux_tree_get_child_by_type (stsd, FOURCC_mp4v); + if (!mp4v) + mp4v = qtdemux_tree_get_child_by_type (stsd, FOURCC_MP4V); + /* H264 is MPEG-4 after all, + * and qt seems to put MPEG-4 stuff in there as well */ + if (!mp4v) + mp4v = qtdemux_tree_get_child_by_type (stsd, FOURCC_avc1); +#else + /* pick 'the' stsd child */ + mp4v = qtdemux_tree_get_child_by_type (stsd, fourcc); +#endif + if (mp4v) { + esds = qtdemux_tree_get_child_by_type (mp4v, FOURCC_esds); + pasp = qtdemux_tree_get_child_by_type (mp4v, FOURCC_pasp); + } + + if (pasp) { + const guint8 *pasp_data = (const guint8 *) pasp->data; + + stream->par_w = QT_UINT32 (pasp_data + 8); + stream->par_h = QT_UINT32 (pasp_data + 12); + } else { + stream->par_w = 0; + stream->par_h = 0; + } + + if (esds) { + gst_qtdemux_handle_esds (qtdemux, stream, esds, list); +#ifdef QTDEMUX_MODIFICATION + /* If the caps modified to H263 from MPEG-4, update the fourcc variable */ + fourcc = stream->fourcc; +#endif + } else { + switch (fourcc) { + case FOURCC_avc1: + { + gint len = QT_UINT32 (stsd_data) - 0x66; + const guint8 *avc_data = stsd_data + 0x66; + + /* find avcC */ + while (len >= 0x8) { + gint size; + + if (QT_UINT32 (avc_data) <= len) + size = QT_UINT32 (avc_data) - 0x8; + else + size = len - 0x8; + + if (size < 1) + /* No real data, so break out */ + break; + + switch (QT_FOURCC (avc_data + 0x4)) { + case FOURCC_avcC: + { + /* parse, if found */ + GstBuffer *buf; + + GST_DEBUG_OBJECT (qtdemux, "found avcC codec_data in stsd"); + + /* First 4 bytes are the length of the atom, the next 4 bytes + * are the fourcc, the next 1 byte is the version, and the + * subsequent bytes are sequence parameter set like data. */ + gst_codec_utils_h264_caps_set_level_and_profile (stream->caps, + avc_data + 8 + 1, size - 1); + + buf = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (buf), avc_data + 0x8, size); + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + + break; + } + case FOURCC_btrt: + { + guint avg_bitrate, max_bitrate; + + /* bufferSizeDB, maxBitrate and avgBitrate - 4 bytes each */ + if (size < 12) + break; + + max_bitrate = QT_UINT32 (avc_data + 0xc); + avg_bitrate = QT_UINT32 (avc_data + 0x10); + + if (!max_bitrate && !avg_bitrate) + break; + + /* Some muxers seem to swap the average and maximum bitrates + * (I'm looking at you, YouTube), so we swap for sanity. */ + if (max_bitrate > 0 && max_bitrate < avg_bitrate) { + guint temp = avg_bitrate; + + avg_bitrate = max_bitrate; + max_bitrate = temp; + } + + if (!list) + list = gst_tag_list_new (); + + if (max_bitrate > 0 && max_bitrate < G_MAXUINT32) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_MAXIMUM_BITRATE, max_bitrate, NULL); + } + if (avg_bitrate > 0 && avg_bitrate < G_MAXUINT32) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_BITRATE, avg_bitrate, NULL); + } + + break; + } + + default: + break; + } + + len -= size + 8; + avc_data += size + 8; + } + + break; + } + case FOURCC_mp4v: + case FOURCC_MP4V: + case FOURCC_fmp4: + case FOURCC_FMP4: + { + GNode *glbl; + + GST_DEBUG_OBJECT (qtdemux, "found %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + + /* codec data might be in glbl extension atom */ +#ifdef QTDEMUX_MODIFICATION + glbl = qtdemux_tree_get_child_by_type (mp4v, FOURCC_glbl); +#else + glbl = mp4v ? + qtdemux_tree_get_child_by_type (mp4v, FOURCC_glbl) : NULL; +#endif + if (glbl) { + guint8 *data; + GstBuffer *buf; + gint len; + + GST_DEBUG_OBJECT (qtdemux, "found glbl data in stsd"); + data = glbl->data; + len = QT_UINT32 (data); + if (len > 0x8) { + len -= 0x8; + buf = gst_buffer_new_and_alloc (len); + memcpy (GST_BUFFER_DATA (buf), data + 8, len); + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + } + } + break; + } + case FOURCC_mjp2: + { + /* see annex I of the jpeg2000 spec */ + GNode *jp2h, *ihdr, *colr, *mjp2, *field, *prefix, *cmap, *cdef; + const guint8 *data; + guint32 fourcc = 0; + gint ncomp = 0; + guint32 ncomp_map = 0; + gint32 *comp_map = NULL; + guint32 nchan_def = 0; + gint32 *chan_def = NULL; + + GST_DEBUG_OBJECT (qtdemux, "found mjp2"); + /* some required atoms */ + mjp2 = qtdemux_tree_get_child_by_type (stsd, FOURCC_mjp2); + if (!mjp2) + break; + jp2h = qtdemux_tree_get_child_by_type (mjp2, FOURCC_jp2h); + if (!jp2h) + break; + + /* number of components; redundant with info in codestream, but useful + to a muxer */ + ihdr = qtdemux_tree_get_child_by_type (jp2h, FOURCC_ihdr); + if (!ihdr || QT_UINT32 (ihdr->data) != 22) + break; + ncomp = QT_UINT16 (((guint8 *) ihdr->data) + 16); + + colr = qtdemux_tree_get_child_by_type (jp2h, FOURCC_colr); + if (!colr) + break; + GST_DEBUG_OBJECT (qtdemux, "found colr"); + /* extract colour space info */ + if (QT_UINT8 ((guint8 *) colr->data + 8) == 1) { + switch (QT_UINT32 ((guint8 *) colr->data + 11)) { + case 16: + fourcc = GST_MAKE_FOURCC ('s', 'R', 'G', 'B'); + break; + case 17: + fourcc = GST_MAKE_FOURCC ('G', 'R', 'A', 'Y'); + break; + case 18: + fourcc = GST_MAKE_FOURCC ('s', 'Y', 'U', 'V'); + break; + default: + break; + } + } + if (!fourcc) + /* colr is required, and only values 16, 17, and 18 are specified, + so error if we have no fourcc */ + break; + + /* extract component mapping */ + cmap = qtdemux_tree_get_child_by_type (jp2h, FOURCC_cmap); + if (cmap) { + guint32 cmap_len = 0; + int i; + cmap_len = QT_UINT32 (cmap->data); + if (cmap_len >= 8) { + /* normal box, subtract off header */ + cmap_len -= 8; + /* cmap: { u16 cmp; u8 mtyp; u8 pcol; }* */ + if (cmap_len % 4 == 0) { + ncomp_map = (cmap_len / 4); + comp_map = g_new0 (gint32, ncomp_map); + for (i = 0; i < ncomp_map; i++) { + guint16 cmp; + guint8 mtyp, pcol; + cmp = QT_UINT16 (((guint8 *) cmap->data) + 8 + i * 4); + mtyp = QT_UINT8 (((guint8 *) cmap->data) + 8 + i * 4 + 2); + pcol = QT_UINT8 (((guint8 *) cmap->data) + 8 + i * 4 + 3); + comp_map[i] = (mtyp << 24) | (pcol << 16) | cmp; + } + } + } + } + /* extract channel definitions */ + cdef = qtdemux_tree_get_child_by_type (jp2h, FOURCC_cdef); + if (cdef) { + guint32 cdef_len = 0; + int i; + cdef_len = QT_UINT32 (cdef->data); + if (cdef_len >= 10) { + /* normal box, subtract off header and len */ + cdef_len -= 10; + /* cdef: u16 n; { u16 cn; u16 typ; u16 asoc; }* */ + if (cdef_len % 6 == 0) { + nchan_def = (cdef_len / 6); + chan_def = g_new0 (gint32, nchan_def); + for (i = 0; i < nchan_def; i++) + chan_def[i] = -1; + for (i = 0; i < nchan_def; i++) { + guint16 cn, typ, asoc; + cn = QT_UINT16 (((guint8 *) cdef->data) + 10 + i * 6); + typ = QT_UINT16 (((guint8 *) cdef->data) + 10 + i * 6 + 2); + asoc = QT_UINT16 (((guint8 *) cdef->data) + 10 + i * 6 + 4); + if (cn < nchan_def) { + switch (typ) { + case 0: + chan_def[cn] = asoc; + break; + case 1: + chan_def[cn] = 0; /* alpha */ + break; + default: + chan_def[cn] = -typ; + } + } + } + } + } + } + + gst_caps_set_simple (stream->caps, + "num-components", G_TYPE_INT, ncomp, NULL); + gst_caps_set_simple (stream->caps, + "fourcc", GST_TYPE_FOURCC, fourcc, NULL); + + if (comp_map) { + GValue arr = { 0, }; + GValue elt = { 0, }; + int i; + g_value_init (&arr, GST_TYPE_ARRAY); + g_value_init (&elt, G_TYPE_INT); + for (i = 0; i < ncomp_map; i++) { + g_value_set_int (&elt, comp_map[i]); + gst_value_array_append_value (&arr, &elt); + } + gst_structure_set_value (gst_caps_get_structure (stream->caps, 0), + "component-map", &arr); + g_value_unset (&elt); + g_value_unset (&arr); + g_free (comp_map); + } + + if (chan_def) { + GValue arr = { 0, }; + GValue elt = { 0, }; + int i; + g_value_init (&arr, GST_TYPE_ARRAY); + g_value_init (&elt, G_TYPE_INT); + for (i = 0; i < nchan_def; i++) { + g_value_set_int (&elt, chan_def[i]); + gst_value_array_append_value (&arr, &elt); + } + gst_structure_set_value (gst_caps_get_structure (stream->caps, 0), + "channel-definitions", &arr); + g_value_unset (&elt); + g_value_unset (&arr); + g_free (chan_def); + } + + /* some optional atoms */ + field = qtdemux_tree_get_child_by_type (mjp2, FOURCC_fiel); + prefix = qtdemux_tree_get_child_by_type (mjp2, FOURCC_jp2x); + + /* indicate possible fields in caps */ + if (field) { + data = (guint8 *) field->data + 8; + if (*data != 1) + gst_caps_set_simple (stream->caps, "fields", G_TYPE_INT, + (gint) * data, NULL); + } + /* add codec_data if provided */ + if (prefix) { + GstBuffer *buf; + gint len; + + GST_DEBUG_OBJECT (qtdemux, "found prefix data in stsd"); + data = prefix->data; + len = QT_UINT32 (data); + if (len > 0x8) { + len -= 0x8; + buf = gst_buffer_new_and_alloc (len); + memcpy (GST_BUFFER_DATA (buf), data + 8, len); + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + } + } + break; + } + case FOURCC_SVQ3: + case FOURCC_VP31: + { + GstBuffer *buf; + GstBuffer *seqh = NULL; + guint8 *gamma_data = NULL; + gint len = QT_UINT32 (stsd_data); + + qtdemux_parse_svq3_stsd_data (qtdemux, stsd, &gamma_data, &seqh); + if (gamma_data) { + gst_caps_set_simple (stream->caps, "applied-gamma", G_TYPE_DOUBLE, + QT_FP32 (gamma_data), NULL); + } + if (seqh) { + /* sorry for the bad name, but we don't know what this is, other + * than its own fourcc */ + gst_caps_set_simple (stream->caps, "seqh", GST_TYPE_BUFFER, seqh, + NULL); + } + + GST_DEBUG_OBJECT (qtdemux, "found codec_data in stsd"); + buf = gst_buffer_new_and_alloc (len); + memcpy (GST_BUFFER_DATA (buf), stsd_data, len); + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + break; + } + case FOURCC_rle_: + { + gst_caps_set_simple (stream->caps, + "depth", G_TYPE_INT, QT_UINT16 (stsd_data + offset + 82), NULL); + break; + } + case FOURCC_XiTh: + { + GNode *xith, *xdxt; + + GST_DEBUG_OBJECT (qtdemux, "found XiTh"); + xith = qtdemux_tree_get_child_by_type (stsd, FOURCC_XiTh); + if (!xith) + break; + + xdxt = qtdemux_tree_get_child_by_type (xith, FOURCC_XdxT); + if (!xdxt) + break; + + GST_DEBUG_OBJECT (qtdemux, "found XdxT node"); + /* collect the headers and store them in a stream list so that we can + * send them out first */ + qtdemux_parse_theora_extension (qtdemux, stream, xdxt); + break; + } + case FOURCC_ovc1: + { + GNode *ovc1; + gchar *ovc1_data; + guint ovc1_len; + GstBuffer *buf; + + GST_DEBUG_OBJECT (qtdemux, "parse ovc1 header"); + ovc1 = qtdemux_tree_get_child_by_type (stsd, FOURCC_ovc1); + if (!ovc1) + break; + ovc1_data = ovc1->data; + ovc1_len = QT_UINT32 (ovc1_data); + if (ovc1_len <= 198) { + GST_WARNING_OBJECT (qtdemux, "Too small ovc1 header, skipping"); + break; + } + buf = gst_buffer_new_and_alloc (ovc1_len - 198); + memcpy (GST_BUFFER_DATA (buf), ovc1_data + 198, ovc1_len - 198); + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + break; + } + default: + break; + } + } + + GST_INFO_OBJECT (qtdemux, + "type %" GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT, + GST_FOURCC_ARGS (fourcc), stream->caps); + + } else if (stream->subtype == FOURCC_soun) { + int version, samplesize; + guint16 compression_id; + gboolean amrwb = FALSE; + + offset = 32; + if (len < 36) + goto corrupt_file; + + version = QT_UINT32 (stsd_data + offset); + stream->n_channels = QT_UINT16 (stsd_data + offset + 8); + samplesize = QT_UINT16 (stsd_data + offset + 10); + compression_id = QT_UINT16 (stsd_data + offset + 12); + stream->rate = QT_FP32 (stsd_data + offset + 16); + + GST_LOG_OBJECT (qtdemux, "version/rev: %08x", version); + GST_LOG_OBJECT (qtdemux, "vendor: %08x", + QT_UINT32 (stsd_data + offset + 4)); + GST_LOG_OBJECT (qtdemux, "n_channels: %d", stream->n_channels); + GST_LOG_OBJECT (qtdemux, "sample_size: %d", samplesize); + GST_LOG_OBJECT (qtdemux, "compression_id: %d", compression_id); + GST_LOG_OBJECT (qtdemux, "packet size: %d", + QT_UINT16 (stsd_data + offset + 14)); + GST_LOG_OBJECT (qtdemux, "sample rate: %g", stream->rate); + + if (compression_id == 0xfffe) + stream->sampled = TRUE; + + /* first assume uncompressed audio */ + stream->bytes_per_sample = samplesize / 8; + stream->samples_per_frame = stream->n_channels; + stream->bytes_per_frame = stream->n_channels * stream->bytes_per_sample; + stream->samples_per_packet = stream->samples_per_frame; + stream->bytes_per_packet = stream->bytes_per_sample; + + offset = 52; + switch (fourcc) { + /* Yes, these have to be hard-coded */ + case FOURCC_MAC6: + { + stream->samples_per_packet = 6; + stream->bytes_per_packet = 1; + stream->bytes_per_frame = 1 * stream->n_channels; + stream->bytes_per_sample = 1; + stream->samples_per_frame = 6 * stream->n_channels; + break; + } + case FOURCC_MAC3: + { + stream->samples_per_packet = 3; + stream->bytes_per_packet = 1; + stream->bytes_per_frame = 1 * stream->n_channels; + stream->bytes_per_sample = 1; + stream->samples_per_frame = 3 * stream->n_channels; + break; + } + case FOURCC_ima4: + { + stream->samples_per_packet = 64; + stream->bytes_per_packet = 34; + stream->bytes_per_frame = 34 * stream->n_channels; + stream->bytes_per_sample = 2; + stream->samples_per_frame = 64 * stream->n_channels; + break; + } + case FOURCC_ulaw: + case FOURCC_alaw: + { + stream->samples_per_packet = 1; + stream->bytes_per_packet = 1; + stream->bytes_per_frame = 1 * stream->n_channels; + stream->bytes_per_sample = 1; + stream->samples_per_frame = 1 * stream->n_channels; + break; + } + case FOURCC_agsm: + { + stream->samples_per_packet = 160; + stream->bytes_per_packet = 33; + stream->bytes_per_frame = 33 * stream->n_channels; + stream->bytes_per_sample = 2; + stream->samples_per_frame = 160 * stream->n_channels; + break; + } + default: + break; + } + + if (version == 0x00010000) { + switch (fourcc) { + case FOURCC_twos: + case FOURCC_sowt: + case FOURCC_raw_: + break; + default: + { + /* only parse extra decoding config for non-pcm audio */ + stream->samples_per_packet = QT_UINT32 (stsd_data + offset); + stream->bytes_per_packet = QT_UINT32 (stsd_data + offset + 4); + stream->bytes_per_frame = QT_UINT32 (stsd_data + offset + 8); + stream->bytes_per_sample = QT_UINT32 (stsd_data + offset + 12); + + GST_LOG_OBJECT (qtdemux, "samples/packet: %d", + stream->samples_per_packet); + GST_LOG_OBJECT (qtdemux, "bytes/packet: %d", + stream->bytes_per_packet); + GST_LOG_OBJECT (qtdemux, "bytes/frame: %d", + stream->bytes_per_frame); + GST_LOG_OBJECT (qtdemux, "bytes/sample: %d", + stream->bytes_per_sample); + + if (!stream->sampled && stream->bytes_per_packet) { + stream->samples_per_frame = (stream->bytes_per_frame / + stream->bytes_per_packet) * stream->samples_per_packet; + GST_LOG_OBJECT (qtdemux, "samples/frame: %d", + stream->samples_per_frame); + } + break; + } + } + } else if (version == 0x00020000) { + union + { + gdouble fp; + guint64 val; + } qtfp; + + stream->samples_per_packet = QT_UINT32 (stsd_data + offset); + qtfp.val = QT_UINT64 (stsd_data + offset + 4); + stream->rate = qtfp.fp; + stream->n_channels = QT_UINT32 (stsd_data + offset + 12); + + GST_LOG_OBJECT (qtdemux, "samples/packet: %d", + stream->samples_per_packet); + GST_LOG_OBJECT (qtdemux, "sample rate: %g", stream->rate); + GST_LOG_OBJECT (qtdemux, "n_channels: %d", stream->n_channels); + + } else { + GST_WARNING_OBJECT (qtdemux, "unknown version %08x", version); + } + + stream->caps = qtdemux_audio_caps (qtdemux, stream, fourcc, NULL, 0, + &codec); + + switch (fourcc) { + case FOURCC_in24: + { + GNode *enda; + GNode *in24; + + in24 = qtdemux_tree_get_child_by_type (stsd, FOURCC_in24); + + enda = qtdemux_tree_get_child_by_type (in24, FOURCC_enda); + if (!enda) { + wave = qtdemux_tree_get_child_by_type (in24, FOURCC_wave); + if (wave) + enda = qtdemux_tree_get_child_by_type (wave, FOURCC_enda); + } + if (enda) { + gst_caps_set_simple (stream->caps, + "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, NULL); + } + break; + } + case FOURCC_owma: + { + GNode *owma; + const gchar *owma_data, *codec_name = NULL; + guint owma_len; + GstBuffer *buf; + gint version = 1; + /* from http://msdn.microsoft.com/en-us/library/dd757720(VS.85).aspx */ + /* FIXME this should also be gst_riff_strf_auds, + * but the latter one is actually missing bits-per-sample :( */ + typedef struct + { + gint16 wFormatTag; + gint16 nChannels; + gint32 nSamplesPerSec; + gint32 nAvgBytesPerSec; + gint16 nBlockAlign; + gint16 wBitsPerSample; + gint16 cbSize; + } WAVEFORMATEX; + WAVEFORMATEX *wfex; + + GST_DEBUG_OBJECT (qtdemux, "parse owma"); + owma = qtdemux_tree_get_child_by_type (stsd, FOURCC_owma); + if (!owma) + break; + owma_data = owma->data; + owma_len = QT_UINT32 (owma_data); + if (owma_len <= 54) { + GST_WARNING_OBJECT (qtdemux, "Too small owma header, skipping"); + break; + } + wfex = (WAVEFORMATEX *) (owma_data + 36); + buf = gst_buffer_new_and_alloc (owma_len - 54); + memcpy (GST_BUFFER_DATA (buf), owma_data + 54, owma_len - 54); + if (wfex->wFormatTag == 0x0161) { + codec_name = "Windows Media Audio"; + version = 2; + } else if (wfex->wFormatTag == 0x0162) { + codec_name = "Windows Media Audio 9 Pro"; + version = 3; + } else if (wfex->wFormatTag == 0x0163) { + codec_name = "Windows Media Audio 9 Lossless"; + /* is that correct? gstffmpegcodecmap.c is missing it, but + * fluendo codec seems to support it */ + version = 4; + } + + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, + "wmaversion", G_TYPE_INT, version, + "block_align", G_TYPE_INT, GST_READ_UINT16_LE (&wfex->nBlockAlign), + "bitrate", G_TYPE_INT, GST_READ_UINT32_LE (&wfex->nAvgBytesPerSec), + "width", G_TYPE_INT, GST_READ_UINT16_LE (&wfex->wBitsPerSample), + "depth", G_TYPE_INT, GST_READ_UINT16_LE (&wfex->wBitsPerSample), + NULL); + gst_buffer_unref (buf); + + if (codec_name) { + g_free (codec); + codec = g_strdup (codec_name); + } + break; + } + default: + break; + } + + if (codec) { + GstStructure *s; + gint bitrate = 0; + + list = gst_tag_list_new (); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, codec, NULL); + g_free (codec); + codec = NULL; + + /* some bitrate info may have ended up in caps */ + s = gst_caps_get_structure (stream->caps, 0); + gst_structure_get_int (s, "bitrate", &bitrate); + if (bitrate > 0) + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, + bitrate, NULL); + } + + mp4a = qtdemux_tree_get_child_by_type (stsd, FOURCC_mp4a); + wave = NULL; + esds = NULL; + if (mp4a) { + wave = qtdemux_tree_get_child_by_type (mp4a, FOURCC_wave); + if (wave) + esds = qtdemux_tree_get_child_by_type (wave, FOURCC_esds); + if (!esds) + esds = qtdemux_tree_get_child_by_type (mp4a, FOURCC_esds); + } + + + /* If the fourcc's bottom 16 bits gives 'sm', then the top + 16 bits is a byte-swapped wave-style codec identifier, + and we can find a WAVE header internally to a 'wave' atom here. + This can more clearly be thought of as 'ms' as the top 16 bits, and a + codec id as the bottom 16 bits - but byte-swapped to store in QT (which + is big-endian). + */ + if ((fourcc & 0xffff) == (('s' << 8) | 'm')) { + if (len < offset + 20) { + GST_WARNING_OBJECT (qtdemux, "No wave atom in MS-style audio"); + } else { + guint32 datalen = QT_UINT32 (stsd_data + offset + 16); + const guint8 *data = stsd_data + offset + 16; + GNode *wavenode; + GNode *waveheadernode; + + wavenode = g_node_new ((guint8 *) data); + if (qtdemux_parse_node (qtdemux, wavenode, data, datalen)) { + const guint8 *waveheader; + guint32 headerlen; + + waveheadernode = qtdemux_tree_get_child_by_type (wavenode, fourcc); + if (waveheadernode) { + waveheader = (const guint8 *) waveheadernode->data; + headerlen = QT_UINT32 (waveheader); + + if (headerlen > 8) { + gst_riff_strf_auds *header = NULL; + GstBuffer *headerbuf; + GstBuffer *extra; + + waveheader += 8; + headerlen -= 8; + + headerbuf = gst_buffer_new (); + GST_BUFFER_DATA (headerbuf) = (guint8 *) waveheader; + GST_BUFFER_SIZE (headerbuf) = headerlen; + + if (gst_riff_parse_strf_auds (GST_ELEMENT_CAST (qtdemux), + headerbuf, &header, &extra)) { + gst_caps_unref (stream->caps); + stream->caps = gst_riff_create_audio_caps (header->format, NULL, + header, extra, NULL, NULL); + + if (extra) + gst_buffer_unref (extra); + } + } + } else + GST_DEBUG ("Didn't find waveheadernode for this codec"); + } + g_node_destroy (wavenode); + } + } else if (esds) { + gst_qtdemux_handle_esds (qtdemux, stream, esds, list); + } else { + switch (fourcc) { +#if 0 + /* FIXME: what is in the chunk? */ + case FOURCC_QDMC: + { + gint len = QT_UINT32 (stsd_data); + + /* seems to be always = 116 = 0x74 */ + break; + } +#endif + case FOURCC_QDM2: + { + gint len = QT_UINT32 (stsd_data); + + if (len > 0x4C) { + GstBuffer *buf = gst_buffer_new_and_alloc (len - 0x4C); + + memcpy (GST_BUFFER_DATA (buf), stsd_data + 0x4C, len - 0x4C); + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + } + gst_caps_set_simple (stream->caps, + "samplesize", G_TYPE_INT, samplesize, NULL); + break; + } + case FOURCC_alac: + { + GNode *alac, *wave = NULL; + + /* apparently, m4a has this atom appended directly in the stsd entry, + * while mov has it in a wave atom */ + alac = qtdemux_tree_get_child_by_type (stsd, FOURCC_alac); + if (alac) { + /* alac now refers to stsd entry atom */ + wave = qtdemux_tree_get_child_by_type (alac, FOURCC_wave); + if (wave) + alac = qtdemux_tree_get_child_by_type (wave, FOURCC_alac); + else + alac = qtdemux_tree_get_child_by_type (alac, FOURCC_alac); + } + if (alac) { + gint len = QT_UINT32 (alac->data); + GstBuffer *buf; + + if (len < 36) { + GST_DEBUG_OBJECT (qtdemux, + "discarding alac atom with unexpected len %d", len); + } else { + /* codec-data contains alac atom size and prefix, + * ffmpeg likes it that way, not quite gst-ish though ...*/ + buf = gst_buffer_new_and_alloc (len); + memcpy (GST_BUFFER_DATA (buf), alac->data, len); + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + } + } + gst_caps_set_simple (stream->caps, + "samplesize", G_TYPE_INT, samplesize, NULL); + break; + } + case FOURCC_sawb: + /* Fallthrough! */ + amrwb = TRUE; + case FOURCC_samr: + { + gint len = QT_UINT32 (stsd_data); + + if (len > 0x34) { + GstBuffer *buf = gst_buffer_new_and_alloc (len - 0x34); + guint bitrate; + + memcpy (GST_BUFFER_DATA (buf), stsd_data + 0x34, len - 0x34); + + /* If we have enough data, let's try to get the 'damr' atom. See + * the 3GPP container spec (26.244) for more details. */ + if ((len - 0x34) > 8 && + (bitrate = qtdemux_parse_amr_bitrate (buf, amrwb))) { + if (!list) + list = gst_tag_list_new (); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_MAXIMUM_BITRATE, bitrate, NULL); + } + + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + } + break; + } + default: + break; + } + } + GST_INFO_OBJECT (qtdemux, + "type %" GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT, + GST_FOURCC_ARGS (fourcc), stream->caps); + + } else if (stream->subtype == FOURCC_strm) { + if (fourcc == FOURCC_rtsp) { + stream->redirect_uri = qtdemux_get_rtsp_uri_from_hndl (qtdemux, minf); + } else { + GST_INFO_OBJECT (qtdemux, "unhandled stream type %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + goto unknown_stream; + } + stream->sampled = TRUE; + } else if (stream->subtype == FOURCC_subp || stream->subtype == FOURCC_text) { + + stream->sampled = TRUE; + + offset = 16; + + stream->caps = + qtdemux_sub_caps (qtdemux, stream, fourcc, stsd_data, &codec); + if (codec) { + list = gst_tag_list_new (); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_SUBTITLE_CODEC, codec, NULL); + g_free (codec); + codec = NULL; + } + + /* hunt for sort-of codec data */ + switch (fourcc) { + case FOURCC_mp4s: + { + guint len; + const guint8 *data; + + /* look for palette */ + /* target mp4s atom */ + len = QT_UINT32 (stsd_data + offset); + data = stsd_data + offset; + /* verify sufficient length, + * and esds present with decConfigDescr of expected size and position */ + if ((len >= 106 + 8) + && (QT_FOURCC (data + 8 + 8 + 4) == FOURCC_esds) + && (QT_UINT16 (data + 8 + 40) == 0x0540)) { + GstStructure *s; + guint32 clut[16]; + gint i; + + /* move to decConfigDescr data */ + data = data + 8 + 42; + for (i = 0; i < 16; i++) { + clut[i] = QT_UINT32 (data); + data += 4; + } + + s = gst_structure_new ("application/x-gst-dvd", "event", + G_TYPE_STRING, "dvd-spu-clut-change", + "clut00", G_TYPE_INT, clut[0], "clut01", G_TYPE_INT, clut[1], + "clut02", G_TYPE_INT, clut[2], "clut03", G_TYPE_INT, clut[3], + "clut04", G_TYPE_INT, clut[4], "clut05", G_TYPE_INT, clut[5], + "clut06", G_TYPE_INT, clut[6], "clut07", G_TYPE_INT, clut[7], + "clut08", G_TYPE_INT, clut[8], "clut09", G_TYPE_INT, clut[9], + "clut10", G_TYPE_INT, clut[10], "clut11", G_TYPE_INT, clut[11], + "clut12", G_TYPE_INT, clut[12], "clut13", G_TYPE_INT, clut[13], + "clut14", G_TYPE_INT, clut[14], "clut15", G_TYPE_INT, clut[15], + NULL); + + /* store event and trigger custom processing */ + stream->pending_event = + gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s); + stream->need_process = TRUE; + } + break; + } + default: + break; + } + } else { + goto unknown_stream; + } + + /* promote to sampled format */ + if (stream->fourcc == FOURCC_samr) { + /* force mono 8000 Hz for AMR */ + stream->sampled = TRUE; + stream->n_channels = 1; + stream->rate = 8000; + } else if (stream->fourcc == FOURCC_sawb) { + /* force mono 16000 Hz for AMR-WB */ + stream->sampled = TRUE; + stream->n_channels = 1; + stream->rate = 16000; + } else if (stream->fourcc == FOURCC_mp4a) { + stream->sampled = TRUE; + } + + /* collect sample information */ + if (!qtdemux_stbl_init (qtdemux, stream, stbl)) + goto samples_failed; + + if (qtdemux->fragmented) { + guint32 dummy; + guint64 offset; + + /* need all moov samples as basis; probably not many if any at all */ + /* prevent moof parsing taking of at this time */ + offset = qtdemux->moof_offset; + qtdemux->moof_offset = 0; + if (stream->n_samples && + !qtdemux_parse_samples (qtdemux, stream, stream->n_samples - 1)) { + qtdemux->moof_offset = offset; + goto samples_failed; + } + qtdemux->moof_offset = 0; + /* movie duration more reliable in this case (e.g. mehd) */ + if (qtdemux->segment.duration && + GST_CLOCK_TIME_IS_VALID (qtdemux->segment.duration)) + stream->duration = gst_util_uint64_scale (qtdemux->segment.duration, + stream->timescale, GST_SECOND); + /* need defaults for fragments */ + qtdemux_parse_trex (qtdemux, stream, &dummy, &dummy, &dummy); + } + + /* configure segments */ + if (!qtdemux_parse_segments (qtdemux, stream, trak)) + goto segments_failed; + + /* add some language tag, if useful */ + if (stream->lang_id[0] != '\0' && strcmp (stream->lang_id, "unk") && + strcmp (stream->lang_id, "und")) { + const gchar *lang_code; + + if (!list) + list = gst_tag_list_new (); + + /* convert ISO 639-2 code to ISO 639-1 */ + lang_code = gst_tag_get_language_code (stream->lang_id); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_LANGUAGE_CODE, (lang_code) ? lang_code : stream->lang_id, NULL); + } + + /* now we are ready to add the stream */ + if (qtdemux->n_streams >= GST_QTDEMUX_MAX_STREAMS) + goto too_many_streams; + + stream->pending_tags = list; + qtdemux->streams[qtdemux->n_streams] = stream; + qtdemux->n_streams++; + GST_DEBUG_OBJECT (qtdemux, "n_streams is now %d", qtdemux->n_streams); + + return TRUE; + +/* ERRORS */ +corrupt_file: + { + GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, + (_("This file is corrupt and cannot be played.")), (NULL)); +#ifdef QTDEMUX_MODIFICATION + g_free (stream->trickplay_info); +#endif + g_free (stream); + return FALSE; + } +error_encrypted: + { + GST_ELEMENT_ERROR (qtdemux, STREAM, DECRYPT, (NULL), (NULL)); +#ifdef QTDEMUX_MODIFICATION + g_free (stream->trickplay_info); +#endif + g_free (stream); + return FALSE; + } +samples_failed: +segments_failed: + { + /* we posted an error already */ + /* free stbl sub-atoms */ + gst_qtdemux_stbl_free (stream); +#ifdef QTDEMUX_MODIFICATION + g_free (stream->trickplay_info); +#endif + g_free (stream); + return FALSE; + } +unknown_stream: + { + GST_INFO_OBJECT (qtdemux, "unknown subtype %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (stream->subtype)); +#ifdef QTDEMUX_MODIFICATION + g_free (stream->trickplay_info); +#endif + g_free (stream); + return TRUE; + } +too_many_streams: + { + GST_ELEMENT_WARNING (qtdemux, STREAM, DEMUX, + (_("This file contains too many streams. Only playing first %d"), + GST_QTDEMUX_MAX_STREAMS), (NULL)); + return TRUE; + } +} + +/* If we can estimate the overall bitrate, and don't have information about the + * stream bitrate for exactly one stream, this guesses the stream bitrate as + * the overall bitrate minus the sum of the bitrates of all other streams. This + * should be useful for the common case where we have one audio and one video + * stream and can estimate the bitrate of one, but not the other. */ +static void +gst_qtdemux_guess_bitrate (GstQTDemux * qtdemux) +{ + GstFormat format = GST_FORMAT_BYTES; + QtDemuxStream *stream = NULL; + gint64 size, duration, sys_bitrate, sum_bitrate = 0; + gint i; + guint bitrate; + + if (qtdemux->fragmented) + return; + + GST_DEBUG_OBJECT (qtdemux, "Looking for streams with unknown bitrate"); + + if (!gst_pad_query_peer_duration (qtdemux->sinkpad, &format, &size) || + format != GST_FORMAT_BYTES) { + GST_DEBUG_OBJECT (qtdemux, + "Size in bytes of the stream not known - bailing"); + return; + } + + /* Subtract the header size */ + GST_DEBUG_OBJECT (qtdemux, "Total size %" G_GINT64_FORMAT ", header size %u", + size, qtdemux->header_size); + g_assert (size >= qtdemux->header_size); + size = size - qtdemux->header_size; + + if (!gst_qtdemux_get_duration (qtdemux, &duration) || + duration == GST_CLOCK_TIME_NONE) { + GST_DEBUG_OBJECT (qtdemux, "Stream duration not known - bailing"); + return; + } + + for (i = 0; i < qtdemux->n_streams; i++) { + switch (qtdemux->streams[i]->subtype) { + case FOURCC_soun: + case FOURCC_vide: + /* retrieve bitrate, prefer avg then max */ + bitrate = 0; + if (qtdemux->streams[i]->pending_tags) { + gst_tag_list_get_uint (qtdemux->streams[i]->pending_tags, + GST_TAG_MAXIMUM_BITRATE, &bitrate); + gst_tag_list_get_uint (qtdemux->streams[i]->pending_tags, + GST_TAG_BITRATE, &bitrate); + } + if (bitrate) + sum_bitrate += bitrate; + else { + if (stream) { + GST_DEBUG_OBJECT (qtdemux, + ">1 stream with unknown bitrate - bailing"); + return; + } else + stream = qtdemux->streams[i]; + } + + default: + /* For other subtypes, we assume no significant impact on bitrate */ + break; + } + } + + if (!stream) { + GST_DEBUG_OBJECT (qtdemux, "All stream bitrates are known"); + return; + } + + sys_bitrate = gst_util_uint64_scale (size, GST_SECOND * 8, duration); + + if (sys_bitrate < sum_bitrate) { + /* This can happen, since sum_bitrate might be derived from maximum + * bitrates and not average bitrates */ + GST_DEBUG_OBJECT (qtdemux, + "System bitrate less than sum bitrate - bailing"); + return; + } + + bitrate = sys_bitrate - sum_bitrate; + GST_DEBUG_OBJECT (qtdemux, "System bitrate = %" G_GINT64_FORMAT + ", Stream bitrate = %u", sys_bitrate, bitrate); + + if (!stream->pending_tags) + stream->pending_tags = gst_tag_list_new (); + + gst_tag_list_add (stream->pending_tags, GST_TAG_MERGE_REPLACE, + GST_TAG_BITRATE, bitrate, NULL); +} + +static GstFlowReturn +qtdemux_expose_streams (GstQTDemux * qtdemux) +{ + gint i; + GstFlowReturn ret = GST_FLOW_OK; + + GST_DEBUG_OBJECT (qtdemux, "exposing streams"); + + for (i = 0; ret == GST_FLOW_OK && i < qtdemux->n_streams; i++) { + QtDemuxStream *stream = qtdemux->streams[i]; + guint32 sample_num = 0; + guint samples = 20; + GArray *durations; + GstTagList *list; + + GST_DEBUG_OBJECT (qtdemux, "stream %d, id %d, fourcc %" GST_FOURCC_FORMAT, + i, stream->track_id, GST_FOURCC_ARGS (stream->fourcc)); + + if (qtdemux->fragmented) { + /* need all moov samples first */ + GST_OBJECT_LOCK (qtdemux); + while (stream->n_samples == 0) + if ((ret = qtdemux_add_fragmented_samples (qtdemux)) != GST_FLOW_OK) + break; + GST_OBJECT_UNLOCK (qtdemux); + } else { + /* discard any stray moof */ + qtdemux->moof_offset = 0; + } + + /* prepare braking */ + if (ret != GST_FLOW_ERROR) + ret = GST_FLOW_OK; + + /* in pull mode, we should have parsed some sample info by now; + * and quite some code will not handle no samples. + * in push mode, we'll just have to deal with it */ + if (G_UNLIKELY (qtdemux->pullbased && !stream->n_samples)) { + GST_DEBUG_OBJECT (qtdemux, "no samples for stream; discarding"); + gst_qtdemux_stream_free (qtdemux, stream); + memmove (&(qtdemux->streams[i]), &(qtdemux->streams[i + 1]), + sizeof (QtDemuxStream *) * (GST_QTDEMUX_MAX_STREAMS - i - 1)); + qtdemux->streams[GST_QTDEMUX_MAX_STREAMS - 1] = NULL; + qtdemux->n_streams--; + i--; + continue; + } + + /* parse number of initial sample to set frame rate cap */ + while (sample_num < stream->n_samples && sample_num < samples) { + if (!qtdemux_parse_samples (qtdemux, stream, sample_num)) + break; + ++sample_num; + } + /* collect and sort durations */ + samples = MIN (stream->stbl_index + 1, samples); + GST_DEBUG_OBJECT (qtdemux, "%d samples for framerate", samples); + if (samples) { + durations = g_array_sized_new (FALSE, FALSE, sizeof (guint32), samples); + sample_num = 0; + while (sample_num < samples) { + g_array_append_val (durations, stream->samples[sample_num].duration); + sample_num++; + } + g_array_sort (durations, less_than); + stream->min_duration = g_array_index (durations, guint32, samples / 2); + g_array_free (durations, TRUE); + } + + /* now we have all info and can expose */ + list = stream->pending_tags; + stream->pending_tags = NULL; + gst_qtdemux_add_stream (qtdemux, stream, list); + } + + gst_qtdemux_guess_bitrate (qtdemux); + + gst_element_no_more_pads (GST_ELEMENT_CAST (qtdemux)); + + /* check if we should post a redirect in case there is a single trak + * and it is a redirecting trak */ + if (qtdemux->n_streams == 1 && qtdemux->streams[0]->redirect_uri != NULL) { + GstMessage *m; + + qtdemux_post_global_tags (qtdemux); + + GST_INFO_OBJECT (qtdemux, "Issuing a redirect due to a single track with " + "an external content"); + m = gst_message_new_element (GST_OBJECT_CAST (qtdemux), + gst_structure_new ("redirect", + "new-location", G_TYPE_STRING, qtdemux->streams[0]->redirect_uri, + NULL)); + gst_element_post_message (GST_ELEMENT_CAST (qtdemux), m); + qtdemux->posted_redirect = TRUE; + } + + return ret; +} + +/* check if major or compatible brand is 3GP */ +static inline gboolean +qtdemux_is_brand_3gp (GstQTDemux * qtdemux, gboolean major) +{ + if (major) { + return ((qtdemux->major_brand & GST_MAKE_FOURCC (255, 255, 0, 0)) == + GST_MAKE_FOURCC ('3', 'g', 0, 0)); + } else if (qtdemux->comp_brands != NULL) { + guint8 *data = GST_BUFFER_DATA (qtdemux->comp_brands); + guint size = GST_BUFFER_SIZE (qtdemux->comp_brands); + gboolean res = FALSE; + + while (size >= 4) { + res = res || ((QT_FOURCC (data) & GST_MAKE_FOURCC (255, 255, 0, 0)) == + GST_MAKE_FOURCC ('3', 'g', 0, 0)); + data += 4; + size -= 4; + } + return res; + } else { + return FALSE; + } +} + +/* check if tag is a spec'ed 3GP tag keyword storing a string */ +static inline gboolean +qtdemux_is_string_tag_3gp (GstQTDemux * qtdemux, guint32 fourcc) +{ + return fourcc == FOURCC_cprt || fourcc == FOURCC_gnre || fourcc == FOURCC_titl + || fourcc == FOURCC_dscp || fourcc == FOURCC_perf || fourcc == FOURCC_auth + || fourcc == FOURCC_albm; +} + +static void +qtdemux_tag_add_location (GstQTDemux * qtdemux, const char *tag, + const char *dummy, GNode * node) +{ + const gchar *env_vars[] = { "GST_QT_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; + int offset; + char *name; + gchar *data; + gdouble longitude, latitude, altitude; + gint len; + + len = QT_UINT32 (node->data); + if (len <= 14) + goto short_read; + + data = node->data; + offset = 14; + + /* TODO: language code skipped */ + + name = gst_tag_freeform_string_to_utf8 (data + offset, -1, env_vars); + + if (!name) { + /* do not alarm in trivial case, but bail out otherwise */ + if (*(data + offset) != 0) { + GST_DEBUG_OBJECT (qtdemux, "failed to convert %s tag to UTF-8, " + "giving up", tag); + } + } else { + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_GEO_LOCATION_NAME, name, NULL); + offset += strlen (name); + g_free (name); + } + + if (len < offset + 2 + 4 + 4 + 4) + goto short_read; + + /* +1 +1 = skip null-terminator and location role byte */ + offset += 1 + 1; + /* table in spec says unsigned, semantics say negative has meaning ... */ + longitude = QT_SFP32 (data + offset); + + offset += 4; + latitude = QT_SFP32 (data + offset); + + offset += 4; + altitude = QT_SFP32 (data + offset); + + /* one invalid means all are invalid */ + if (longitude >= -180.0 && longitude <= 180.0 && + latitude >= -90.0 && latitude <= 90.0) { + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_GEO_LOCATION_LATITUDE, latitude, + GST_TAG_GEO_LOCATION_LONGITUDE, longitude, + GST_TAG_GEO_LOCATION_ELEVATION, altitude, NULL); + } + + /* TODO: no GST_TAG_, so astronomical body and additional notes skipped */ + + return; + + /* ERRORS */ +short_read: + { + GST_DEBUG_OBJECT (qtdemux, "short read parsing 3GP location"); + return; + } +} + + +static void +qtdemux_tag_add_year (GstQTDemux * qtdemux, const char *tag, const char *dummy, + GNode * node) +{ + guint16 y; + GDate *date; + gint len; + + len = QT_UINT32 (node->data); + if (len < 14) + return; + + y = QT_UINT16 ((guint8 *) node->data + 12); + if (y == 0) { + GST_DEBUG_OBJECT (qtdemux, "year: %u is not a valid year", y); + return; + } + GST_DEBUG_OBJECT (qtdemux, "year: %u", y); + + date = g_date_new_dmy (1, 1, y); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, date, NULL); + g_date_free (date); +} + +static void +qtdemux_tag_add_classification (GstQTDemux * qtdemux, const char *tag, + const char *dummy, GNode * node) +{ + int offset; + char *tag_str = NULL; + guint8 *entity; + guint16 table; + gint len; + + len = QT_UINT32 (node->data); + if (len <= 20) + goto short_read; + + offset = 12; + entity = (guint8 *) node->data + offset; + if (entity[0] == 0 || entity[1] == 0 || entity[2] == 0 || entity[3] == 0) { + GST_DEBUG_OBJECT (qtdemux, + "classification info: %c%c%c%c invalid classification entity", + entity[0], entity[1], entity[2], entity[3]); + return; + } + + offset += 4; + table = QT_UINT16 ((guint8 *) node->data + offset); + + /* Language code skipped */ + + offset += 4; + + /* Tag format: "XXXX://Y[YYYY]/classification info string" + * XXXX: classification entity, fixed length 4 chars. + * Y[YYYY]: classification table, max 5 chars. + */ + tag_str = g_strdup_printf ("----://%u/%s", + table, (char *) node->data + offset); + + /* memcpy To be sure we're preserving byte order */ + memcpy (tag_str, entity, 4); + GST_DEBUG_OBJECT (qtdemux, "classification info: %s", tag_str); + + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_APPEND, tag, + tag_str, NULL); + + g_free (tag_str); + + return; + + /* ERRORS */ +short_read: + { + GST_DEBUG_OBJECT (qtdemux, "short read parsing 3GP classification"); + return; + } +} + +static gboolean +qtdemux_tag_add_str_full (GstQTDemux * qtdemux, const char *tag, + const char *dummy, GNode * node) +{ + const gchar *env_vars[] = { "GST_QT_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; + GNode *data; + char *s; + int len; + guint32 type; + int offset; + gboolean ret = TRUE; + + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + if (data) { + len = QT_UINT32 (data->data); + type = QT_UINT32 ((guint8 *) data->data + 8); + if (type == 0x00000001 && len > 16) { + s = gst_tag_freeform_string_to_utf8 ((char *) data->data + 16, len - 16, + env_vars); + if (s) { + GST_DEBUG_OBJECT (qtdemux, "adding tag %s", GST_STR_NULL (s)); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, s, + NULL); + g_free (s); + } else { + GST_DEBUG_OBJECT (qtdemux, "failed to convert %s tag to UTF-8", tag); + } + } + } else { + len = QT_UINT32 (node->data); + type = QT_UINT32 ((guint8 *) node->data + 4); + if ((type >> 24) == 0xa9) { + /* Type starts with the (C) symbol, so the next 32 bits are + * the language code, which we ignore */ + offset = 12; + GST_DEBUG_OBJECT (qtdemux, "found international text tag"); + } else if (len > 14 && qtdemux_is_string_tag_3gp (qtdemux, + QT_FOURCC ((guint8 *) node->data + 4))) { + guint32 type = QT_UINT32 ((guint8 *) node->data + 8); + + /* we go for 3GP style encoding if major brands claims so, + * or if no hope for data be ok UTF-8, and compatible 3GP brand present */ + if (qtdemux_is_brand_3gp (qtdemux, TRUE) || + (qtdemux_is_brand_3gp (qtdemux, FALSE) && + ((type & 0x00FFFFFF) == 0x0) && (type >> 24 <= 0xF))) { + offset = 14; + /* 16-bit Language code is ignored here as well */ + GST_DEBUG_OBJECT (qtdemux, "found 3gpp text tag"); + } else { + goto normal; + } + } else { + normal: + offset = 8; + GST_DEBUG_OBJECT (qtdemux, "found normal text tag"); + ret = FALSE; /* may have to fallback */ + } + s = gst_tag_freeform_string_to_utf8 ((char *) node->data + offset, + len - offset, env_vars); + if (s) { + GST_DEBUG_OBJECT (qtdemux, "adding tag %s", GST_STR_NULL (s)); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, s, NULL); + g_free (s); + ret = TRUE; + } else { + GST_DEBUG_OBJECT (qtdemux, "failed to convert %s tag to UTF-8", tag); + } + } + return ret; +} + +static void +qtdemux_tag_add_str (GstQTDemux * qtdemux, const char *tag, + const char *dummy, GNode * node) +{ + qtdemux_tag_add_str_full (qtdemux, tag, dummy, node); +} + +static void +qtdemux_tag_add_keywords (GstQTDemux * qtdemux, const char *tag, + const char *dummy, GNode * node) +{ + const gchar *env_vars[] = { "GST_QT_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; + guint8 *data; + char *s, *t, *k = NULL; + int len; + int offset; + int count; + + /* first try normal string tag if major brand not 3GP */ + if (!qtdemux_is_brand_3gp (qtdemux, TRUE)) { + if (!qtdemux_tag_add_str_full (qtdemux, tag, dummy, node)) { + /* hm, that did not work, maybe 3gpp storage in non-3gpp major brand; + * let's try it 3gpp way after minor safety check */ + data = node->data; + if (QT_UINT32 (data) < 15 || !qtdemux_is_brand_3gp (qtdemux, FALSE)) + return; + } else + return; + } + + GST_DEBUG_OBJECT (qtdemux, "found 3gpp keyword tag"); + + data = node->data; + + len = QT_UINT32 (data); + if (len < 15) + goto short_read; + + count = QT_UINT8 (data + 14); + offset = 15; + for (; count; count--) { + gint slen; + + if (offset + 1 > len) + goto short_read; + slen = QT_UINT8 (data + offset); + offset += 1; + if (offset + slen > len) + goto short_read; + s = gst_tag_freeform_string_to_utf8 ((char *) node->data + offset, + slen, env_vars); + if (s) { + GST_DEBUG_OBJECT (qtdemux, "adding keyword %s", GST_STR_NULL (s)); + if (k) { + t = g_strjoin (",", k, s, NULL); + g_free (s); + g_free (k); + k = t; + } else { + k = s; + } + } else { + GST_DEBUG_OBJECT (qtdemux, "failed to convert keyword to UTF-8"); + } + offset += slen; + } + +done: + if (k) { + GST_DEBUG_OBJECT (qtdemux, "adding tag %s", GST_STR_NULL (k)); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, k, NULL); + } + g_free (k); + + return; + + /* ERRORS */ +short_read: + { + GST_DEBUG_OBJECT (qtdemux, "short read parsing 3GP keywords"); + goto done; + } +} + +static void +qtdemux_tag_add_num (GstQTDemux * qtdemux, const char *tag1, + const char *tag2, GNode * node) +{ + GNode *data; + int len; + int type; + int n1, n2; + + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + if (data) { + len = QT_UINT32 (data->data); + type = QT_UINT32 ((guint8 *) data->data + 8); + if (type == 0x00000000 && len >= 22) { + n1 = QT_UINT16 ((guint8 *) data->data + 18); + n2 = QT_UINT16 ((guint8 *) data->data + 20); + if (n1 > 0) { + GST_DEBUG_OBJECT (qtdemux, "adding tag %s=%d", tag1, n1); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + tag1, n1, NULL); + } + if (n2 > 0) { + GST_DEBUG_OBJECT (qtdemux, "adding tag %s=%d", tag2, n2); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + tag2, n2, NULL); + } + } + } +} + +static void +qtdemux_tag_add_tmpo (GstQTDemux * qtdemux, const char *tag1, const char *dummy, + GNode * node) +{ + GNode *data; + int len; + int type; + int n1; + + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + if (data) { + len = QT_UINT32 (data->data); + type = QT_UINT32 ((guint8 *) data->data + 8); + GST_DEBUG_OBJECT (qtdemux, "have tempo tag, type=%d,len=%d", type, len); + /* some files wrongly have a type 0x0f=15, but it should be 0x15 */ + if ((type == 0x00000015 || type == 0x0000000f) && len >= 18) { + n1 = QT_UINT16 ((guint8 *) data->data + 16); + if (n1) { + /* do not add bpm=0 */ + GST_DEBUG_OBJECT (qtdemux, "adding tag %d", n1); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + tag1, (gdouble) n1, NULL); + } + } + } +} + +static void +qtdemux_tag_add_uint32 (GstQTDemux * qtdemux, const char *tag1, + const char *dummy, GNode * node) +{ + GNode *data; + int len; + int type; + guint32 num; + + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + if (data) { + len = QT_UINT32 (data->data); + type = QT_UINT32 ((guint8 *) data->data + 8); + GST_DEBUG_OBJECT (qtdemux, "have %s tag, type=%d,len=%d", tag1, type, len); + /* some files wrongly have a type 0x0f=15, but it should be 0x15 */ + if ((type == 0x00000015 || type == 0x0000000f) && len >= 20) { + num = QT_UINT32 ((guint8 *) data->data + 16); + if (num) { + /* do not add num=0 */ + GST_DEBUG_OBJECT (qtdemux, "adding tag %d", num); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + tag1, num, NULL); + } + } + } +} + +static void +qtdemux_tag_add_covr (GstQTDemux * qtdemux, const char *tag1, const char *dummy, + GNode * node) +{ + GNode *data; + int len; + int type; + GstBuffer *buf; + + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + if (data) { + len = QT_UINT32 (data->data); + type = QT_UINT32 ((guint8 *) data->data + 8); + GST_DEBUG_OBJECT (qtdemux, "have covr tag, type=%d,len=%d", type, len); + if ((type == 0x0000000d || type == 0x0000000e) && len > 16) { + if ((buf = gst_tag_image_data_to_image_buffer ((guint8 *) data->data + 16, + len - 16, GST_TAG_IMAGE_TYPE_NONE))) { + GST_DEBUG_OBJECT (qtdemux, "adding tag size %d", len - 16); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + tag1, buf, NULL); + gst_buffer_unref (buf); + } + } + } +} + +static void +qtdemux_tag_add_date (GstQTDemux * qtdemux, const char *tag, const char *dummy, + GNode * node) +{ + GNode *data; + char *s; + int len; + int type; + + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + if (data) { + len = QT_UINT32 (data->data); + type = QT_UINT32 ((guint8 *) data->data + 8); + if (type == 0x00000001 && len > 16) { + guint y, m = 1, d = 1; + gint ret; + + s = g_strndup ((char *) data->data + 16, len - 16); + GST_DEBUG_OBJECT (qtdemux, "adding date '%s'", s); + ret = sscanf (s, "%u-%u-%u", &y, &m, &d); + if (ret >= 1 && y > 1500 && y < 3000) { + GDate *date; + + date = g_date_new_dmy (d, m, y); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, + date, NULL); + g_date_free (date); + } else { + GST_DEBUG_OBJECT (qtdemux, "could not parse date string '%s'", s); + } + g_free (s); + } + } +} + +static void +qtdemux_tag_add_gnre (GstQTDemux * qtdemux, const char *tag, const char *dummy, + GNode * node) +{ + GNode *data; + + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + +#ifndef QTDEMUX_MODIFICATION + /* re-route to normal string tag if major brand says so + * or no data atom and compatible brand suggests so */ + if (qtdemux_is_brand_3gp (qtdemux, TRUE) || + (qtdemux_is_brand_3gp (qtdemux, FALSE) && !data)) { + qtdemux_tag_add_str (qtdemux, tag, dummy, node); + return; + } +#endif + + if (data) { + guint len, type, n; + + len = QT_UINT32 (data->data); + type = QT_UINT32 ((guint8 *) data->data + 8); + if (type == 0x00000000 && len >= 18) { + n = QT_UINT16 ((guint8 *) data->data + 16); + if (n > 0) { + const gchar *genre; + + genre = gst_tag_id3_genre_get (n - 1); + if (genre != NULL) { + GST_DEBUG_OBJECT (qtdemux, "adding %d [%s]", n, genre); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + tag, genre, NULL); + } + } + } +#ifdef QTDEMUX_MODIFICATION + else { + /* re-route to normal string tag if major brand says so + * or no data atom and compatible brand suggests so */ + if (qtdemux_is_brand_3gp (qtdemux, TRUE) || + (qtdemux_is_brand_3gp (qtdemux, FALSE) && !data)) { + qtdemux_tag_add_str (qtdemux, tag, dummy, node); + return; + } + } +#endif + } +#ifdef QTDEMUX_MODIFICATION + else { + /* re-route to normal string tag if major brand says so + * or no data atom and compatible brand suggests so */ + if (qtdemux_is_brand_3gp (qtdemux, TRUE) || + (qtdemux_is_brand_3gp (qtdemux, FALSE) && !data)) { + qtdemux_tag_add_str (qtdemux, tag, dummy, node); + return; + } + } +#endif +} + +static void +qtdemux_add_double_tag_from_str (GstQTDemux * demux, const gchar * tag, + guint8 * data, guint32 datasize) +{ + gdouble value; + gchar *datacopy; + + /* make a copy to have \0 at the end */ + datacopy = g_strndup ((gchar *) data, datasize); + + /* convert the str to double */ + if (sscanf (datacopy, "%lf", &value) == 1) { + GST_DEBUG_OBJECT (demux, "adding tag: %s [%s]", tag, datacopy); + gst_tag_list_add (demux->tag_list, GST_TAG_MERGE_REPLACE, tag, value, NULL); + } else { + GST_WARNING_OBJECT (demux, "Failed to parse double from string: %s", + datacopy); + } + g_free (datacopy); +} + + +static void +qtdemux_tag_add_revdns (GstQTDemux * demux, const char *tag, + const char *tag_bis, GNode * node) +{ + GNode *mean; + GNode *name; + GNode *data; + guint32 meansize; + guint32 namesize; + guint32 datatype; + guint32 datasize; + const gchar *meanstr; + const gchar *namestr; + + /* checking the whole ---- atom size for consistency */ + if (QT_UINT32 (node->data) <= 4 + 12 + 12 + 16) { + GST_WARNING_OBJECT (demux, "Tag ---- atom is too small, ignoring"); + return; + } + + mean = qtdemux_tree_get_child_by_type (node, FOURCC_mean); + if (!mean) { + GST_WARNING_OBJECT (demux, "No 'mean' atom found"); + return; + } + + meansize = QT_UINT32 (mean->data); + if (meansize <= 12) { + GST_WARNING_OBJECT (demux, "Small mean atom, ignoring the whole tag"); + return; + } + meanstr = ((gchar *) mean->data) + 12; + + name = qtdemux_tree_get_child_by_type (node, FOURCC_name); + if (!name) { + GST_WARNING_OBJECT (demux, "'name' atom not found, ignoring tag"); + return; + } + + namesize = QT_UINT32 (name->data); + if (namesize <= 12) { + GST_WARNING_OBJECT (demux, "'name' atom is too small, ignoring tag"); + return; + } + namestr = ((gchar *) name->data) + 12; + + /* + * Data atom is: + * uint32 - size + * uint32 - name + * uint8 - version + * uint24 - data type + * uint32 - all 0 + * rest - the data + */ + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + if (!data) { + GST_WARNING_OBJECT (demux, "No data atom in this tag"); + return; + } + datasize = QT_UINT32 (data->data); + if (datasize <= 16) { + GST_WARNING_OBJECT (demux, "Data atom too small"); + return; + } + datatype = QT_UINT32 (((gchar *) data->data) + 8) & 0xFFFFFF; + + if (strncmp (meanstr, "com.apple.iTunes", meansize - 12) == 0) { + static const struct + { + const gchar name[28]; + const gchar tag[28]; + } tags[] = { + { + "replaygain_track_gain", GST_TAG_TRACK_GAIN}, { + "replaygain_track_peak", GST_TAG_TRACK_PEAK}, { + "replaygain_album_gain", GST_TAG_ALBUM_GAIN}, { + "replaygain_album_peak", GST_TAG_ALBUM_PEAK}, { + "MusicBrainz Track Id", GST_TAG_MUSICBRAINZ_TRACKID}, { + "MusicBrainz Artist Id", GST_TAG_MUSICBRAINZ_ARTISTID}, { + "MusicBrainz Album Id", GST_TAG_MUSICBRAINZ_ALBUMID}, { + "MusicBrainz Album Artist Id", GST_TAG_MUSICBRAINZ_ALBUMARTISTID} + }; + int i; + + for (i = 0; i < G_N_ELEMENTS (tags); ++i) { + if (!g_ascii_strncasecmp (tags[i].name, namestr, namesize - 12)) { + switch (gst_tag_get_type (tags[i].tag)) { + case G_TYPE_DOUBLE: + qtdemux_add_double_tag_from_str (demux, tags[i].tag, + ((guint8 *) data->data) + 16, datasize - 16); + break; + case G_TYPE_STRING: + qtdemux_tag_add_str (demux, tags[i].tag, NULL, node); + break; + default: + /* not reached */ + break; + } + break; + } + } + if (i == G_N_ELEMENTS (tags)) + goto unknown_tag; + } else { + goto unknown_tag; + } + + return; + +/* errors */ +unknown_tag: + { + gchar *namestr_dbg; + gchar *meanstr_dbg; + + meanstr_dbg = g_strndup (meanstr, meansize - 12); + namestr_dbg = g_strndup (namestr, namesize - 12); + + GST_WARNING_OBJECT (demux, "This tag %s:%s type:%u is not mapped, " + "file a bug at bugzilla.gnome.org", meanstr_dbg, namestr_dbg, datatype); + + g_free (namestr_dbg); + g_free (meanstr_dbg); + return; + } +} + +static void +qtdemux_tag_add_id32 (GstQTDemux * demux, const char *tag, + const char *tag_bis, GNode * node) +{ + guint8 *data; + GstBuffer *buf; + guint len; + GstTagList *taglist = NULL; + + GST_LOG_OBJECT (demux, "parsing ID32"); + + data = node->data; + len = GST_READ_UINT32_BE (data); + + /* need at least full box and language tag */ + if (len < 12 + 2) + return; + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = data + 14; + GST_BUFFER_SIZE (buf) = len - 14; + + taglist = gst_tag_list_from_id3v2_tag (buf); + if (taglist) { + GST_LOG_OBJECT (demux, "parsing ok"); + gst_tag_list_insert (demux->tag_list, taglist, GST_TAG_MERGE_KEEP); + } else { + GST_LOG_OBJECT (demux, "parsing failed"); + } + + if (taglist) + gst_tag_list_free (taglist); + + gst_buffer_unref (buf); +} + +typedef void (*GstQTDemuxAddTagFunc) (GstQTDemux * demux, + const char *tag, const char *tag_bis, GNode * node); + +/* unmapped tags +FOURCC_pcst -> if media is a podcast -> bool +FOURCC_cpil -> if media is part of a compilation -> bool +FOURCC_pgap -> if media is part of a gapless context -> bool +FOURCC_tven -> the tv episode id e.g. S01E23 -> str +*/ + +static const struct +{ + guint32 fourcc; + const gchar *gst_tag; + const gchar *gst_tag_bis; + const GstQTDemuxAddTagFunc func; +} add_funcs[] = { + { + FOURCC__nam, GST_TAG_TITLE, NULL, qtdemux_tag_add_str}, { + FOURCC_titl, GST_TAG_TITLE, NULL, qtdemux_tag_add_str}, { + FOURCC__grp, GST_TAG_GROUPING, NULL, qtdemux_tag_add_str}, { + FOURCC__wrt, GST_TAG_COMPOSER, NULL, qtdemux_tag_add_str}, { + FOURCC__ART, GST_TAG_ARTIST, NULL, qtdemux_tag_add_str}, { + FOURCC_aART, GST_TAG_ALBUM_ARTIST, NULL, qtdemux_tag_add_str}, { + FOURCC_perf, GST_TAG_ARTIST, NULL, qtdemux_tag_add_str}, { + FOURCC_auth, GST_TAG_COMPOSER, NULL, qtdemux_tag_add_str}, { + FOURCC__alb, GST_TAG_ALBUM, NULL, qtdemux_tag_add_str}, { + FOURCC_albm, GST_TAG_ALBUM, NULL, qtdemux_tag_add_str}, { + FOURCC_cprt, GST_TAG_COPYRIGHT, NULL, qtdemux_tag_add_str}, { + FOURCC__cpy, GST_TAG_COPYRIGHT, NULL, qtdemux_tag_add_str}, { + FOURCC__cmt, GST_TAG_COMMENT, NULL, qtdemux_tag_add_str}, { + FOURCC__des, GST_TAG_DESCRIPTION, NULL, qtdemux_tag_add_str}, { + FOURCC_desc, GST_TAG_DESCRIPTION, NULL, qtdemux_tag_add_str}, { + FOURCC_dscp, GST_TAG_DESCRIPTION, NULL, qtdemux_tag_add_str}, { + FOURCC__lyr, GST_TAG_LYRICS, NULL, qtdemux_tag_add_str}, { + FOURCC__day, GST_TAG_DATE, NULL, qtdemux_tag_add_date}, { + FOURCC_yrrc, GST_TAG_DATE, NULL, qtdemux_tag_add_year}, { + FOURCC__too, GST_TAG_ENCODER, NULL, qtdemux_tag_add_str}, { + FOURCC__inf, GST_TAG_COMMENT, NULL, qtdemux_tag_add_str}, { + FOURCC_trkn, GST_TAG_TRACK_NUMBER, GST_TAG_TRACK_COUNT, qtdemux_tag_add_num}, { + FOURCC_disk, GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, + qtdemux_tag_add_num}, { + FOURCC_disc, GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, + qtdemux_tag_add_num}, { + FOURCC__gen, GST_TAG_GENRE, NULL, qtdemux_tag_add_str}, { + FOURCC_gnre, GST_TAG_GENRE, NULL, qtdemux_tag_add_gnre}, { + FOURCC_tmpo, GST_TAG_BEATS_PER_MINUTE, NULL, qtdemux_tag_add_tmpo}, { + FOURCC_covr, GST_TAG_PREVIEW_IMAGE, NULL, qtdemux_tag_add_covr}, { + FOURCC_sonm, GST_TAG_TITLE_SORTNAME, NULL, qtdemux_tag_add_str}, { + FOURCC_soal, GST_TAG_ALBUM_SORTNAME, NULL, qtdemux_tag_add_str}, { + FOURCC_soar, GST_TAG_ARTIST_SORTNAME, NULL, qtdemux_tag_add_str}, { + FOURCC_soaa, GST_TAG_ALBUM_ARTIST_SORTNAME, NULL, qtdemux_tag_add_str}, { + FOURCC_soco, GST_TAG_COMPOSER_SORTNAME, NULL, qtdemux_tag_add_str}, { + FOURCC_sosn, GST_TAG_SHOW_SORTNAME, NULL, qtdemux_tag_add_str}, { + FOURCC_tvsh, GST_TAG_SHOW_NAME, NULL, qtdemux_tag_add_str}, { + FOURCC_tvsn, GST_TAG_SHOW_SEASON_NUMBER, NULL, qtdemux_tag_add_uint32}, { + FOURCC_tves, GST_TAG_SHOW_EPISODE_NUMBER, NULL, qtdemux_tag_add_uint32}, { + FOURCC_kywd, GST_TAG_KEYWORDS, NULL, qtdemux_tag_add_keywords}, { + FOURCC_keyw, GST_TAG_KEYWORDS, NULL, qtdemux_tag_add_str}, { + FOURCC__enc, GST_TAG_ENCODER, NULL, qtdemux_tag_add_str}, { + FOURCC_loci, GST_TAG_GEO_LOCATION_NAME, NULL, qtdemux_tag_add_location}, { + FOURCC_clsf, GST_QT_DEMUX_CLASSIFICATION_TAG, NULL, + qtdemux_tag_add_classification}, { + + /* This is a special case, some tags are stored in this + * 'reverse dns naming', according to: + * http://atomicparsley.sourceforge.net/mpeg-4files.html and + * bug #614471 + */ + FOURCC_____, "", NULL, qtdemux_tag_add_revdns}, { + /* see http://www.mp4ra.org/specs.html for ID32 in meta box */ + FOURCC_ID32, "", NULL, qtdemux_tag_add_id32} +}; + +static void +qtdemux_tag_add_blob (GNode * node, GstQTDemux * demux) +{ + gint len; + guint8 *data; + GstBuffer *buf; + gchar *media_type; + const gchar *style; + GstCaps *caps; + guint i; + guint8 ndata[4]; + + data = node->data; + len = QT_UINT32 (data); + buf = gst_buffer_new_and_alloc (len); + memcpy (GST_BUFFER_DATA (buf), data, len); + + /* heuristic to determine style of tag */ + if (QT_FOURCC (data + 4) == FOURCC_____ || + (len > 8 + 12 && QT_FOURCC (data + 12) == FOURCC_data)) + style = "itunes"; + /* fall back to assuming iso/3gp tag style */ + else + style = "iso"; + + /* santize the name for the caps. */ + for (i = 0; i < 4; i++) { + guint8 d = data[4 + i]; + if (g_ascii_isalnum (d)) + ndata[i] = g_ascii_tolower (d); + else + ndata[i] = '_'; + } + + media_type = g_strdup_printf ("application/x-gst-qt-%c%c%c%c-tag", + ndata[0], ndata[1], ndata[2], ndata[3]); + GST_DEBUG_OBJECT (demux, "media type %s", media_type); + + caps = gst_caps_new_simple (media_type, "style", G_TYPE_STRING, style, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + g_free (media_type); + + GST_DEBUG_OBJECT (demux, "adding private tag; size %d, caps %" GST_PTR_FORMAT, + GST_BUFFER_SIZE (buf), caps); + + gst_tag_list_add (demux->tag_list, GST_TAG_MERGE_APPEND, + GST_QT_DEMUX_PRIVATE_TAG, buf, NULL); + gst_buffer_unref (buf); +} + +static void +qtdemux_parse_udta (GstQTDemux * qtdemux, GNode * udta) +{ + GNode *meta; + GNode *ilst; + GNode *xmp_; + GNode *node; + gint i; + + meta = qtdemux_tree_get_child_by_type (udta, FOURCC_meta); + if (meta != NULL) { + ilst = qtdemux_tree_get_child_by_type (meta, FOURCC_ilst); + if (ilst == NULL) { + GST_LOG_OBJECT (qtdemux, "no ilst"); + return; + } + } else { + ilst = udta; + GST_LOG_OBJECT (qtdemux, "no meta so using udta itself"); + } + + GST_DEBUG_OBJECT (qtdemux, "new tag list"); + if (!qtdemux->tag_list) + qtdemux->tag_list = gst_tag_list_new (); + + i = 0; + while (i < G_N_ELEMENTS (add_funcs)) { + node = qtdemux_tree_get_child_by_type (ilst, add_funcs[i].fourcc); + if (node) { + gint len; + + len = QT_UINT32 (node->data); + if (len < 12) { + GST_DEBUG_OBJECT (qtdemux, "too small tag atom %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (add_funcs[i].fourcc)); + } else { + add_funcs[i].func (qtdemux, add_funcs[i].gst_tag, + add_funcs[i].gst_tag_bis, node); + } + g_node_destroy (node); + } else { + i++; + } + } + + /* parsed nodes have been removed, pass along remainder as blob */ + g_node_children_foreach (ilst, G_TRAVERSE_ALL, + (GNodeForeachFunc) qtdemux_tag_add_blob, qtdemux); + + /* parse up XMP_ node if existing */ + xmp_ = qtdemux_tree_get_child_by_type (udta, FOURCC_XMP_); + if (xmp_ != NULL) { + GstBuffer *buf; + GstTagList *taglist; + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = ((guint8 *) xmp_->data) + 8; + GST_BUFFER_SIZE (buf) = QT_UINT32 ((guint8 *) xmp_->data) - 8; + + taglist = gst_tag_list_from_xmp_buffer (buf); + gst_buffer_unref (buf); + + qtdemux_handle_xmp_taglist (qtdemux, taglist); + } else { + GST_DEBUG_OBJECT (qtdemux, "No XMP_ node found"); + } + +} + +typedef struct +{ + GstStructure *structure; /* helper for sort function */ + gchar *location; + guint min_req_bitrate; + guint min_req_qt_version; +} GstQtReference; + +static gint +qtdemux_redirects_sort_func (gconstpointer a, gconstpointer b) +{ + GstQtReference *ref_a = (GstQtReference *) a; + GstQtReference *ref_b = (GstQtReference *) b; + + if (ref_b->min_req_qt_version != ref_a->min_req_qt_version) + return ref_b->min_req_qt_version - ref_a->min_req_qt_version; + + /* known bitrates go before unknown; higher bitrates go first */ + return ref_b->min_req_bitrate - ref_a->min_req_bitrate; +} + +/* sort the redirects and post a message for the application. + */ +static void +qtdemux_process_redirects (GstQTDemux * qtdemux, GList * references) +{ + GstQtReference *best; + GstStructure *s; + GstMessage *msg; + GValue list_val = { 0, }; + GList *l; + + g_assert (references != NULL); + + references = g_list_sort (references, qtdemux_redirects_sort_func); + + best = (GstQtReference *) references->data; + + g_value_init (&list_val, GST_TYPE_LIST); + + for (l = references; l != NULL; l = l->next) { + GstQtReference *ref = (GstQtReference *) l->data; + GValue struct_val = { 0, }; + + ref->structure = gst_structure_new ("redirect", + "new-location", G_TYPE_STRING, ref->location, NULL); + + if (ref->min_req_bitrate > 0) { + gst_structure_set (ref->structure, "minimum-bitrate", G_TYPE_INT, + ref->min_req_bitrate, NULL); + } + + g_value_init (&struct_val, GST_TYPE_STRUCTURE); + g_value_set_boxed (&struct_val, ref->structure); + gst_value_list_append_value (&list_val, &struct_val); + g_value_unset (&struct_val); + /* don't free anything here yet, since we need best->structure below */ + } + + g_assert (best != NULL); + s = gst_structure_copy (best->structure); + + if (g_list_length (references) > 1) { + gst_structure_set_value (s, "locations", &list_val); + } + + g_value_unset (&list_val); + + for (l = references; l != NULL; l = l->next) { + GstQtReference *ref = (GstQtReference *) l->data; + + gst_structure_free (ref->structure); + g_free (ref->location); + g_free (ref); + } + g_list_free (references); + + GST_INFO_OBJECT (qtdemux, "posting redirect message: %" GST_PTR_FORMAT, s); + msg = gst_message_new_element (GST_OBJECT_CAST (qtdemux), s); + gst_element_post_message (GST_ELEMENT_CAST (qtdemux), msg); + qtdemux->posted_redirect = TRUE; +} + +/* look for redirect nodes, collect all redirect information and + * process it. + */ +static gboolean +qtdemux_parse_redirects (GstQTDemux * qtdemux) +{ + return TRUE; +} + +static GstTagList * +qtdemux_add_container_format (GstQTDemux * qtdemux, GstTagList * tags) +{ + const gchar *fmt; + + if (tags == NULL) + tags = gst_tag_list_new (); + + if (qtdemux->major_brand == FOURCC_mjp2) + fmt = "Motion JPEG 2000"; + else if ((qtdemux->major_brand & 0xffff) == GST_MAKE_FOURCC ('3', 'g', 0, 0)) + fmt = "3GP"; + else if (qtdemux->fragmented) + fmt = "ISO fMP4"; + else + fmt = "ISO MP4/M4A"; + + GST_LOG_OBJECT (qtdemux, "mapped %" GST_FOURCC_FORMAT " to '%s'", + GST_FOURCC_ARGS (qtdemux->major_brand), fmt); + + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_CONTAINER_FORMAT, + fmt, NULL); + + return tags; +} + +/* we have read th complete moov node now. + * This function parses all of the relevant info, creates the traks and + * prepares all data structures for playback + */ +static gboolean +qtdemux_parse_tree (GstQTDemux * qtdemux) +{ + GNode *mvhd; + GNode *trak; + GNode *udta; + GNode *mvex; + gint64 duration; + guint64 creation_time; + GstDateTime *datetime = NULL; + gint version; + + mvhd = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_mvhd); + if (mvhd == NULL) { + GST_LOG_OBJECT (qtdemux, "No mvhd node found, looking for redirects."); + return qtdemux_parse_redirects (qtdemux); + } + + version = QT_UINT8 ((guint8 *) mvhd->data + 8); + if (version == 1) { + creation_time = QT_UINT64 ((guint8 *) mvhd->data + 12); + qtdemux->timescale = QT_UINT32 ((guint8 *) mvhd->data + 28); + qtdemux->duration = QT_UINT64 ((guint8 *) mvhd->data + 32); + } else if (version == 0) { + creation_time = QT_UINT32 ((guint8 *) mvhd->data + 12); + qtdemux->timescale = QT_UINT32 ((guint8 *) mvhd->data + 20); + qtdemux->duration = QT_UINT32 ((guint8 *) mvhd->data + 24); + } else { + GST_WARNING_OBJECT (qtdemux, "Unhandled mvhd version %d", version); + return FALSE; + } + + /* Moving qt creation time (secs since 1904) to unix time */ + if (creation_time != 0) { + if (creation_time > QTDEMUX_SECONDS_FROM_1904_TO_1970) { + GTimeVal now; + + creation_time -= QTDEMUX_SECONDS_FROM_1904_TO_1970; + /* some data cleansing sanity */ + g_get_current_time (&now); + if (now.tv_sec + 24 * 3600 < creation_time) { + GST_DEBUG_OBJECT (qtdemux, "discarding bogus future creation time"); + } else { + datetime = gst_date_time_new_from_unix_epoch_local_time (creation_time); + } + } else { + GST_WARNING_OBJECT (qtdemux, "Can't handle datetimes before 1970 yet, " + "please file a bug at http://bugzilla.gnome.org"); + } + } + if (datetime) { + if (!qtdemux->tag_list) + qtdemux->tag_list = gst_tag_list_new (); + + /* Use KEEP as explicit tags should have a higher priority than mvhd tag */ + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_KEEP, GST_TAG_DATE_TIME, + datetime, NULL); + gst_date_time_unref (datetime); + } + + GST_INFO_OBJECT (qtdemux, "timescale: %u", qtdemux->timescale); + GST_INFO_OBJECT (qtdemux, "duration: %" G_GUINT64_FORMAT, qtdemux->duration); + + /* check for fragmented file and get some (default) data */ + mvex = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_mvex); + if (mvex) { + GNode *mehd; + GstByteReader mehd_data; + + /* let track parsing or anyone know weird stuff might happen ... */ + qtdemux->fragmented = TRUE; + + /* compensate for total duration */ + mehd = qtdemux_tree_get_child_by_type_full (mvex, FOURCC_mehd, &mehd_data); + if (mehd) + qtdemux_parse_mehd (qtdemux, &mehd_data); + } + + /* set duration in the segment info */ + gst_qtdemux_get_duration (qtdemux, &duration); + if (duration) { + gst_segment_set_duration (&qtdemux->segment, GST_FORMAT_TIME, duration); + /* also do not exceed duration; stop is set that way post seek anyway, + * and segment activation falls back to duration, + * whereas loop only checks stop, so let's align this here as well */ + qtdemux->segment.stop = duration; + } + + /* parse all traks */ + trak = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_trak); + while (trak) { + qtdemux_parse_trak (qtdemux, trak); + /* iterate all siblings */ + trak = qtdemux_tree_get_sibling_by_type (trak, FOURCC_trak); + } + + /* find tags */ + udta = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_udta); + if (udta) { + qtdemux_parse_udta (qtdemux, udta); + } else { + GST_LOG_OBJECT (qtdemux, "No udta node found."); + } + + /* maybe also some tags in meta box */ + udta = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_meta); + if (udta) { + GST_DEBUG_OBJECT (qtdemux, "Parsing meta box for tags."); + qtdemux_parse_udta (qtdemux, udta); + } else { + GST_LOG_OBJECT (qtdemux, "No meta node found."); + } + + qtdemux->tag_list = qtdemux_add_container_format (qtdemux, qtdemux->tag_list); + + return TRUE; +} + +/* taken from ffmpeg */ +static unsigned int +get_size (guint8 * ptr, guint8 ** end) +{ + int count = 4; + int len = 0; + + while (count--) { + int c = *ptr; + + ptr++; + len = (len << 7) | (c & 0x7f); + if (!(c & 0x80)) + break; + } + if (end) + *end = ptr; + return len; +} + +/* this can change the codec originally present in @list */ +static void +gst_qtdemux_handle_esds (GstQTDemux * qtdemux, QtDemuxStream * stream, + GNode * esds, GstTagList * list) +{ + int len = QT_UINT32 (esds->data); + guint8 *ptr = esds->data; + guint8 *end = ptr + len; + int tag; + guint8 *data_ptr = NULL; + int data_len = 0; + guint8 object_type_id = 0; + const char *codec_name = NULL; + GstCaps *caps = NULL; + + GST_MEMDUMP_OBJECT (qtdemux, "esds", ptr, len); + ptr += 8; + GST_DEBUG_OBJECT (qtdemux, "version/flags = %08x", QT_UINT32 (ptr)); + ptr += 4; + while (ptr < end) { + tag = QT_UINT8 (ptr); + GST_DEBUG_OBJECT (qtdemux, "tag = %02x", tag); + ptr++; + len = get_size (ptr, &ptr); + GST_DEBUG_OBJECT (qtdemux, "len = %d", len); + + switch (tag) { + case 0x03: + GST_DEBUG_OBJECT (qtdemux, "ID %04x", QT_UINT16 (ptr)); + GST_DEBUG_OBJECT (qtdemux, "priority %04x", QT_UINT8 (ptr + 2)); + ptr += 3; + break; + case 0x04:{ + guint max_bitrate, avg_bitrate; + + object_type_id = QT_UINT8 (ptr); + max_bitrate = QT_UINT32 (ptr + 5); + avg_bitrate = QT_UINT32 (ptr + 9); + GST_DEBUG_OBJECT (qtdemux, "object_type_id %02x", object_type_id); + GST_DEBUG_OBJECT (qtdemux, "stream_type %02x", QT_UINT8 (ptr + 1)); + GST_DEBUG_OBJECT (qtdemux, "buffer_size_db %02x", QT_UINT24 (ptr + 2)); + GST_DEBUG_OBJECT (qtdemux, "max bitrate %u", max_bitrate); + GST_DEBUG_OBJECT (qtdemux, "avg bitrate %u", avg_bitrate); + if (max_bitrate > 0 && max_bitrate < G_MAXUINT32) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_MAXIMUM_BITRATE, max_bitrate, NULL); + } + if (avg_bitrate > 0 && avg_bitrate < G_MAXUINT32) { + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, + avg_bitrate, NULL); + } + ptr += 13; + break; + } + case 0x05: + GST_MEMDUMP_OBJECT (qtdemux, "data", ptr, len); + data_ptr = ptr; + data_len = len; + ptr += len; + break; + case 0x06: + GST_DEBUG_OBJECT (qtdemux, "data %02x", QT_UINT8 (ptr)); + ptr += 1; + break; + default: + GST_ERROR_OBJECT (qtdemux, "parse error"); + break; + } + } + + /* object_type_id in the esds atom in mp4a and mp4v tells us which codec is + * in use, and should also be used to override some other parameters for some + * codecs. */ + switch (object_type_id) { + case 0x20: /* MPEG-4 */ + /* 4 bytes for the visual_object_sequence_start_code and 1 byte for the + * profile_and_level_indication */ + if (data_ptr != NULL && data_len >= 5 && + GST_READ_UINT32_BE (data_ptr) == 0x000001b0) { + gst_codec_utils_mpeg4video_caps_set_level_and_profile (stream->caps, + data_ptr + 4, data_len - 4); + } + break; /* Nothing special needed here */ + case 0x21: /* H.264 */ + codec_name = "H.264 / AVC"; + caps = gst_caps_new_simple ("video/x-h264", + "stream-format", G_TYPE_STRING, "avc", + "alignment", G_TYPE_STRING, "au", NULL); + break; + case 0x40: /* AAC (any) */ + case 0x66: /* AAC Main */ + case 0x67: /* AAC LC */ + case 0x68: /* AAC SSR */ + /* Override channels and rate based on the codec_data, as it's often + * wrong. */ + /* Only do so for basic setup without HE-AAC extension */ + if (data_ptr && data_len == 2) { + guint channels, rateindex, rate; + + /* FIXME: add gst_codec_utils_aac_get_{channels|sample_rate}()? */ + channels = (data_ptr[1] & 0x7f) >> 3; + if (channels > 0 && channels < 7) { + stream->n_channels = channels; + } else if (channels == 7) { + stream->n_channels = 8; + } + + rateindex = ((data_ptr[0] & 0x7) << 1) | ((data_ptr[1] & 0x80) >> 7); + rate = gst_codec_utils_aac_get_sample_rate_from_index (rateindex); + if (rate > 0) + stream->rate = rate; + } + + /* Set level and profile if possible */ + if (data_ptr != NULL && data_len >= 2) { + gst_codec_utils_aac_caps_set_level_and_profile (stream->caps, + data_ptr, data_len); + } + break; + case 0x60: /* MPEG-2, various profiles */ + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + codec_name = "MPEG-2 video"; + + gst_caps_unref (stream->caps); + stream->caps = gst_caps_new_simple ("video/mpeg", + "mpegversion", G_TYPE_INT, 2, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case 0x69: /* MP3 has two different values, accept either */ + case 0x6B: + /* change to mpeg1 layer 3 audio */ + gst_caps_set_simple (stream->caps, "layer", G_TYPE_INT, 3, + "mpegversion", G_TYPE_INT, 1, NULL); + codec_name = "MPEG-1 layer 3"; + break; + case 0x6A: /* MPEG-1 */ + codec_name = "MPEG-1 video"; + + gst_caps_unref (stream->caps); + stream->caps = gst_caps_new_simple ("video/mpeg", + "mpegversion", G_TYPE_INT, 1, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case 0x6C: /* MJPEG */ + caps = gst_caps_new_simple ("image/jpeg", NULL); + codec_name = "Motion-JPEG"; + break; + case 0x6D: /* PNG */ + caps = gst_caps_new_simple ("image/png", NULL); + codec_name = "PNG still images"; + break; + case 0x6E: /* JPEG2000 */ + codec_name = "JPEG-2000"; + caps = gst_caps_new_simple ("image/x-j2c", "fields", G_TYPE_INT, 1, NULL); + break; + case 0xA4: /* Dirac */ + codec_name = "Dirac"; + caps = gst_caps_new_simple ("video/x-dirac", NULL); + break; + case 0xA5: /* AC3 */ + codec_name = "AC-3 audio"; + caps = gst_caps_new_simple ("audio/x-ac3", + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + break; + case 0xE1: /* QCELP */ + /* QCELP, the codec_data is a riff tag (little endian) with + * more info (http://ftp.3gpp2.org/TSGC/Working/2003/2003-05-SanDiego/TSG-C-2003-05-San%20Diego/WG1/SWG12/C12-20030512-006%20=%20C12-20030217-015_Draft_Baseline%20Text%20of%20FFMS_R2.doc). */ + caps = gst_caps_new_simple ("audio/qcelp", NULL); + codec_name = "QCELP"; + break; + default: + break; + } + + /* If we have a replacement caps, then change our caps for this stream */ + if (caps) { + gst_caps_unref (stream->caps); + stream->caps = caps; + } + + if (codec_name && list) + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, codec_name, NULL); + + /* Add the codec_data attribute to caps, if we have it */ + if (data_ptr) { + GstBuffer *buffer; + + buffer = gst_buffer_new_and_alloc (data_len); + memcpy (GST_BUFFER_DATA (buffer), data_ptr, data_len); + + GST_DEBUG_OBJECT (qtdemux, "setting codec_data from esds"); + GST_MEMDUMP_OBJECT (qtdemux, "codec_data from esds", data_ptr, data_len); + +#ifdef QTDEMUX_MODIFICATION + /* Check the possiblity of H263 in case of mp4v fourCC */ + if(stream->fourcc == FOURCC_mp4v) { + gboolean err = TRUE; + int i; + + GST_ERROR_OBJECT (qtdemux, "Checking for the Possibility of H263"); + for(i=0; ifourcc = GST_MAKE_FOURCC ('h', '2', '6', '3'); + stream->caps = gst_caps_from_string ("video/x-h263"); + gst_buffer_unref (buffer); + return; + } + } +#endif + + gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, + buffer, NULL); + gst_buffer_unref (buffer); + } + +} + +#define _codec(name) \ + do { \ + if (codec_name) { \ + *codec_name = g_strdup (name); \ + } \ + } while (0) + +static GstCaps * +qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, + guint32 fourcc, const guint8 * stsd_data, gchar ** codec_name) +{ + GstCaps *caps; + const GstStructure *s; + const gchar *name; + + switch (fourcc) { + case GST_MAKE_FOURCC ('p', 'n', 'g', ' '): + _codec ("PNG still images"); + caps = gst_caps_new_simple ("image/png", NULL); + break; + case GST_MAKE_FOURCC ('j', 'p', 'e', 'g'): + _codec ("JPEG still images"); + caps = gst_caps_new_simple ("image/jpeg", NULL); + break; + case GST_MAKE_FOURCC ('m', 'j', 'p', 'a'): + case GST_MAKE_FOURCC ('A', 'V', 'D', 'J'): + case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'): + case GST_MAKE_FOURCC ('d', 'm', 'b', '1'): + _codec ("Motion-JPEG"); + caps = gst_caps_new_simple ("image/jpeg", NULL); + break; + case GST_MAKE_FOURCC ('m', 'j', 'p', 'b'): + _codec ("Motion-JPEG format B"); + caps = gst_caps_new_simple ("video/x-mjpeg-b", NULL); + break; + case GST_MAKE_FOURCC ('m', 'j', 'p', '2'): + _codec ("JPEG-2000"); + /* override to what it should be according to spec, avoid palette_data */ + stream->bits_per_sample = 24; + caps = gst_caps_new_simple ("image/x-j2c", "fields", G_TYPE_INT, 1, NULL); + break; + case GST_MAKE_FOURCC ('S', 'V', 'Q', '3'): + _codec ("Sorensen video v.3"); + caps = gst_caps_new_simple ("video/x-svq", + "svqversion", G_TYPE_INT, 3, NULL); + break; + case GST_MAKE_FOURCC ('s', 'v', 'q', 'i'): + case GST_MAKE_FOURCC ('S', 'V', 'Q', '1'): + _codec ("Sorensen video v.1"); + caps = gst_caps_new_simple ("video/x-svq", + "svqversion", G_TYPE_INT, 1, NULL); + break; + case GST_MAKE_FOURCC ('r', 'a', 'w', ' '): + { + guint16 bps; + + _codec ("Raw RGB video"); + bps = QT_UINT16 (stsd_data + 98); + /* set common stuff */ + caps = gst_caps_new_simple ("video/x-raw-rgb", + "endianness", G_TYPE_INT, G_BYTE_ORDER, "depth", G_TYPE_INT, bps, + NULL); + + switch (bps) { + case 15: + gst_caps_set_simple (caps, + "bpp", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "red_mask", G_TYPE_INT, 0x7c00, + "green_mask", G_TYPE_INT, 0x03e0, + "blue_mask", G_TYPE_INT, 0x001f, NULL); + break; + case 16: + gst_caps_set_simple (caps, + "bpp", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "red_mask", G_TYPE_INT, 0xf800, + "green_mask", G_TYPE_INT, 0x07e0, + "blue_mask", G_TYPE_INT, 0x001f, NULL); + break; + case 24: + gst_caps_set_simple (caps, + "bpp", G_TYPE_INT, 24, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "red_mask", G_TYPE_INT, 0xff0000, + "green_mask", G_TYPE_INT, 0x00ff00, + "blue_mask", G_TYPE_INT, 0x0000ff, NULL); + break; + case 32: + gst_caps_set_simple (caps, + "bpp", G_TYPE_INT, 32, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "alpha_mask", G_TYPE_INT, 0xff000000, + "red_mask", G_TYPE_INT, 0x00ff0000, + "green_mask", G_TYPE_INT, 0x0000ff00, + "blue_mask", G_TYPE_INT, 0x000000ff, NULL); + break; + default: + /* unknown */ + break; + } + break; + } + case GST_MAKE_FOURCC ('y', 'v', '1', '2'): + _codec ("Raw planar YUV 4:2:0"); + caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), + NULL); + break; + case GST_MAKE_FOURCC ('y', 'u', 'v', '2'): + case GST_MAKE_FOURCC ('Y', 'u', 'v', '2'): + _codec ("Raw packed YUV 4:2:2"); + caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'), + NULL); + break; + case GST_MAKE_FOURCC ('2', 'v', 'u', 'y'): + case GST_MAKE_FOURCC ('2', 'V', 'u', 'y'): + _codec ("Raw packed YUV 4:2:2"); + caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'), + NULL); + break; + case GST_MAKE_FOURCC ('v', '2', '1', '0'): + _codec ("Raw packed YUV 10-bit 4:2:2"); + caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('v', '2', '1', '0'), + NULL); + break; + case GST_MAKE_FOURCC ('r', '2', '1', '0'): + _codec ("Raw packed RGB 10-bit 4:4:4"); + caps = gst_caps_new_simple ("video/x-raw-rgb", + "endianness", G_TYPE_INT, G_BIG_ENDIAN, "depth", G_TYPE_INT, 30, + "bpp", G_TYPE_INT, 32, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "red_mask", G_TYPE_INT, 0x3ff00000, + "green_mask", G_TYPE_INT, 0x000ffc00, + "blue_mask", G_TYPE_INT, 0x000003ff, NULL); + break; + case GST_MAKE_FOURCC ('m', 'p', 'e', 'g'): + case GST_MAKE_FOURCC ('m', 'p', 'g', '1'): + _codec ("MPEG-1 video"); + caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case GST_MAKE_FOURCC ('h', 'd', 'v', '1'): /* HDV 720p30 */ + case GST_MAKE_FOURCC ('h', 'd', 'v', '2'): /* HDV 1080i60 */ + case GST_MAKE_FOURCC ('h', 'd', 'v', '3'): /* HDV 1080i50 */ + case GST_MAKE_FOURCC ('h', 'd', 'v', '5'): /* HDV 720p25 */ + case GST_MAKE_FOURCC ('h', 'd', 'v', '6'): /* HDV 1080i60 */ + case GST_MAKE_FOURCC ('m', 'x', '5', 'n'): /* MPEG2 IMX NTSC 525/60 50mb/s produced by FCP */ + case GST_MAKE_FOURCC ('m', 'x', '5', 'p'): /* MPEG2 IMX PAL 625/60 50mb/s produced by FCP */ + case GST_MAKE_FOURCC ('m', 'x', '4', 'n'): /* MPEG2 IMX NTSC 525/60 40mb/s produced by FCP */ + case GST_MAKE_FOURCC ('m', 'x', '4', 'p'): /* MPEG2 IMX PAL 625/60 40mb/s produced by FCP */ + case GST_MAKE_FOURCC ('m', 'x', '3', 'n'): /* MPEG2 IMX NTSC 525/60 30mb/s produced by FCP */ + case GST_MAKE_FOURCC ('m', 'x', '3', 'p'): /* MPEG2 IMX PAL 625/50 30mb/s produced by FCP */ + case GST_MAKE_FOURCC ('x', 'd', 'v', '2'): /* XDCAM HD 1080i60 */ + case GST_MAKE_FOURCC ('A', 'V', 'm', 'p'): /* AVID IMX PAL */ + case GST_MAKE_FOURCC ('m', 'p', 'g', '2'): /* AVID IMX PAL */ + _codec ("MPEG-2 video"); + caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case GST_MAKE_FOURCC ('g', 'i', 'f', ' '): + _codec ("GIF still images"); + caps = gst_caps_new_simple ("image/gif", NULL); + break; + case GST_MAKE_FOURCC ('h', '2', '6', '3'): + case GST_MAKE_FOURCC ('H', '2', '6', '3'): + case GST_MAKE_FOURCC ('s', '2', '6', '3'): + case GST_MAKE_FOURCC ('U', '2', '6', '3'): + _codec ("H.263"); + /* ffmpeg uses the height/width props, don't know why */ + caps = gst_caps_new_simple ("video/x-h263", NULL); + break; + case GST_MAKE_FOURCC ('m', 'p', '4', 'v'): + case GST_MAKE_FOURCC ('M', 'P', '4', 'V'): + _codec ("MPEG-4 video"); + caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case GST_MAKE_FOURCC ('3', 'i', 'v', 'd'): + case GST_MAKE_FOURCC ('3', 'I', 'V', 'D'): + _codec ("Microsoft MPEG-4 4.3"); /* FIXME? */ + caps = gst_caps_new_simple ("video/x-msmpeg", + "msmpegversion", G_TYPE_INT, 43, NULL); + break; + case GST_MAKE_FOURCC ('3', 'I', 'V', '1'): + case GST_MAKE_FOURCC ('3', 'I', 'V', '2'): + _codec ("3ivX video"); + caps = gst_caps_new_simple ("video/x-3ivx", NULL); + break; + case GST_MAKE_FOURCC ('D', 'I', 'V', '3'): + _codec ("DivX 3"); + caps = gst_caps_new_simple ("video/x-divx", + "divxversion", G_TYPE_INT, 3, NULL); + break; + case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'): + case GST_MAKE_FOURCC ('d', 'i', 'v', 'x'): + _codec ("DivX 4"); + caps = gst_caps_new_simple ("video/x-divx", + "divxversion", G_TYPE_INT, 4, NULL); + break; + case GST_MAKE_FOURCC ('D', 'X', '5', '0'): + _codec ("DivX 5"); + caps = gst_caps_new_simple ("video/x-divx", + "divxversion", G_TYPE_INT, 5, NULL); + break; + case GST_MAKE_FOURCC ('X', 'V', 'I', 'D'): + case GST_MAKE_FOURCC ('x', 'v', 'i', 'd'): + _codec ("XVID MPEG-4"); + caps = gst_caps_new_simple ("video/x-xvid", NULL); + break; + + case GST_MAKE_FOURCC ('F', 'M', 'P', '4'): + case GST_MAKE_FOURCC ('U', 'M', 'P', '4'): + caps = gst_caps_new_simple ("video/mpeg", + "mpegversion", G_TYPE_INT, 4, NULL); + if (codec_name) + *codec_name = g_strdup ("FFmpeg MPEG-4"); + break; + + case GST_MAKE_FOURCC ('c', 'v', 'i', 'd'): + _codec ("Cinepak"); + caps = gst_caps_new_simple ("video/x-cinepak", NULL); + break; + case GST_MAKE_FOURCC ('q', 'd', 'r', 'w'): + _codec ("Apple QuickDraw"); + caps = gst_caps_new_simple ("video/x-qdrw", NULL); + break; + case GST_MAKE_FOURCC ('r', 'p', 'z', 'a'): + _codec ("Apple video"); + caps = gst_caps_new_simple ("video/x-apple-video", NULL); + break; + case GST_MAKE_FOURCC ('a', 'v', 'c', '1'): + _codec ("H.264 / AVC"); + caps = gst_caps_new_simple ("video/x-h264", + "stream-format", G_TYPE_STRING, "avc", + "alignment", G_TYPE_STRING, "au", NULL); + break; + case GST_MAKE_FOURCC ('r', 'l', 'e', ' '): + _codec ("Run-length encoding"); + caps = gst_caps_new_simple ("video/x-rle", + "layout", G_TYPE_STRING, "quicktime", NULL); + break; + case GST_MAKE_FOURCC ('I', 'V', '3', '2'): + case GST_MAKE_FOURCC ('i', 'v', '3', '2'): + _codec ("Indeo Video 3"); + caps = gst_caps_new_simple ("video/x-indeo", + "indeoversion", G_TYPE_INT, 3, NULL); + break; + case GST_MAKE_FOURCC ('I', 'V', '4', '1'): + case GST_MAKE_FOURCC ('i', 'v', '4', '1'): + _codec ("Intel Video 4"); + caps = gst_caps_new_simple ("video/x-indeo", + "indeoversion", G_TYPE_INT, 4, NULL); + break; + case GST_MAKE_FOURCC ('d', 'v', 'c', 'p'): + case GST_MAKE_FOURCC ('d', 'v', 'c', ' '): + case GST_MAKE_FOURCC ('d', 'v', 's', 'd'): + case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'): + case GST_MAKE_FOURCC ('d', 'v', 'c', 's'): + case GST_MAKE_FOURCC ('D', 'V', 'C', 'S'): + case GST_MAKE_FOURCC ('d', 'v', '2', '5'): + case GST_MAKE_FOURCC ('d', 'v', 'p', 'p'): + _codec ("DV Video"); + caps = gst_caps_new_simple ("video/x-dv", "dvversion", G_TYPE_INT, 25, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case GST_MAKE_FOURCC ('d', 'v', '5', 'n'): /* DVCPRO50 NTSC */ + case GST_MAKE_FOURCC ('d', 'v', '5', 'p'): /* DVCPRO50 PAL */ + _codec ("DVCPro50 Video"); + caps = gst_caps_new_simple ("video/x-dv", "dvversion", G_TYPE_INT, 50, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case GST_MAKE_FOURCC ('d', 'v', 'h', '5'): /* DVCPRO HD 50i produced by FCP */ + case GST_MAKE_FOURCC ('d', 'v', 'h', '6'): /* DVCPRO HD 60i produced by FCP */ + _codec ("DVCProHD Video"); + caps = gst_caps_new_simple ("video/x-dv", "dvversion", G_TYPE_INT, 100, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case GST_MAKE_FOURCC ('s', 'm', 'c', ' '): + _codec ("Apple Graphics (SMC)"); + caps = gst_caps_new_simple ("video/x-smc", NULL); + break; + case GST_MAKE_FOURCC ('V', 'P', '3', '1'): + _codec ("VP3"); + caps = gst_caps_new_simple ("video/x-vp3", NULL); + break; + case GST_MAKE_FOURCC ('X', 'i', 'T', 'h'): + _codec ("Theora"); + caps = gst_caps_new_simple ("video/x-theora", NULL); + /* theora uses one byte of padding in the data stream because it does not + * allow 0 sized packets while theora does */ + stream->padding = 1; + break; + case GST_MAKE_FOURCC ('d', 'r', 'a', 'c'): + _codec ("Dirac"); + caps = gst_caps_new_simple ("video/x-dirac", NULL); + break; + case GST_MAKE_FOURCC ('t', 'i', 'f', 'f'): + _codec ("TIFF still images"); + caps = gst_caps_new_simple ("image/tiff", NULL); + break; + case GST_MAKE_FOURCC ('i', 'c', 'o', 'd'): + _codec ("Apple Intermediate Codec"); + caps = gst_caps_from_string ("video/x-apple-intermediate-codec"); + break; + case GST_MAKE_FOURCC ('A', 'V', 'd', 'n'): + _codec ("AVID DNxHD"); + caps = gst_caps_from_string ("video/x-dnxhd"); + break; + case GST_MAKE_FOURCC ('V', 'P', '8', '0'): + _codec ("On2 VP8"); + caps = gst_caps_from_string ("video/x-vp8"); + break; + case FOURCC_ovc1: + _codec ("VC-1"); + caps = gst_caps_new_simple ("video/x-wmv", + "wmvversion", G_TYPE_INT, 3, + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('W', 'V', 'C', '1'), + NULL); + break; + case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'): + default: + { + char *s; + + s = g_strdup_printf ("video/x-gst-fourcc-%" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + caps = gst_caps_new_simple (s, NULL); + break; + } + } + +#ifdef QTDEMUX_MODIFICATION + if(stream->orientation != -1) { + gst_caps_set_simple (caps, "orientation", G_TYPE_INT, stream->orientation, NULL); + } +#endif + + /* enable clipping for raw video streams */ + s = gst_caps_get_structure (caps, 0); + name = gst_structure_get_name (s); + if (g_str_has_prefix (name, "video/x-raw-")) { + stream->need_clip = TRUE; + } + return caps; +} + +static GstCaps * +qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, + guint32 fourcc, const guint8 * data, int len, gchar ** codec_name) +{ + GstCaps *caps; + const GstStructure *s; + const gchar *name; + gint endian = 0; + + GST_DEBUG_OBJECT (qtdemux, "resolve fourcc %08x", fourcc); + + switch (fourcc) { + case GST_MAKE_FOURCC ('N', 'O', 'N', 'E'): + case GST_MAKE_FOURCC ('r', 'a', 'w', ' '): + _codec ("Raw 8-bit PCM audio"); + caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 8, + "depth", G_TYPE_INT, 8, "signed", G_TYPE_BOOLEAN, FALSE, NULL); + break; + case GST_MAKE_FOURCC ('t', 'w', 'o', 's'): + endian = G_BIG_ENDIAN; + /* fall-through */ + case GST_MAKE_FOURCC ('s', 'o', 'w', 't'): + { + gchar *str; + gint depth; + + if (!endian) + endian = G_LITTLE_ENDIAN; + + depth = stream->bytes_per_packet * 8; + str = g_strdup_printf ("Raw %d-bit PCM audio", depth); + _codec (str); + g_free (str); + caps = gst_caps_new_simple ("audio/x-raw-int", + "width", G_TYPE_INT, depth, "depth", G_TYPE_INT, depth, + "endianness", G_TYPE_INT, endian, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + break; + } + case GST_MAKE_FOURCC ('f', 'l', '6', '4'): + _codec ("Raw 64-bit floating-point audio"); + caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 64, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL); + break; + case GST_MAKE_FOURCC ('f', 'l', '3', '2'): + _codec ("Raw 32-bit floating-point audio"); + caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL); + break; + case FOURCC_in24: + _codec ("Raw 24-bit PCM audio"); + /* we assume BIG ENDIAN, an enda box will tell us to change this to little + * endian later */ + caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 24, + "depth", G_TYPE_INT, 24, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + break; + case GST_MAKE_FOURCC ('i', 'n', '3', '2'): + _codec ("Raw 32-bit PCM audio"); + caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 32, + "depth", G_TYPE_INT, 32, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + break; + case GST_MAKE_FOURCC ('u', 'l', 'a', 'w'): + _codec ("Mu-law audio"); + caps = gst_caps_new_simple ("audio/x-mulaw", NULL); + break; + case GST_MAKE_FOURCC ('a', 'l', 'a', 'w'): + _codec ("A-law audio"); + caps = gst_caps_new_simple ("audio/x-alaw", NULL); + break; + case 0x0200736d: + case 0x6d730002: + _codec ("Microsoft ADPCM"); + /* Microsoft ADPCM-ACM code 2 */ + caps = gst_caps_new_simple ("audio/x-adpcm", + "layout", G_TYPE_STRING, "microsoft", NULL); + break; + case 0x1100736d: + case 0x6d730011: + _codec ("DVI/IMA ADPCM"); + caps = gst_caps_new_simple ("audio/x-adpcm", + "layout", G_TYPE_STRING, "dvi", NULL); + break; + case 0x1700736d: + case 0x6d730017: + _codec ("DVI/Intel IMA ADPCM"); + /* FIXME DVI/Intel IMA ADPCM/ACM code 17 */ + caps = gst_caps_new_simple ("audio/x-adpcm", + "layout", G_TYPE_STRING, "quicktime", NULL); + break; + case 0x5500736d: + case 0x6d730055: + /* MPEG layer 3, CBR only (pre QT4.1) */ + case GST_MAKE_FOURCC ('.', 'm', 'p', '3'): + _codec ("MPEG-1 layer 3"); + /* MPEG layer 3, CBR & VBR (QT4.1 and later) */ + caps = gst_caps_new_simple ("audio/mpeg", "layer", G_TYPE_INT, 3, + "mpegversion", G_TYPE_INT, 1, NULL); + break; + case 0x20736d: + case GST_MAKE_FOURCC ('e', 'c', '-', '3'): + _codec ("EAC-3 audio"); + caps = gst_caps_new_simple ("audio/x-eac3", + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + stream->sampled = TRUE; + break; + case GST_MAKE_FOURCC ('a', 'c', '-', '3'): + _codec ("AC-3 audio"); + caps = gst_caps_new_simple ("audio/x-ac3", + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + stream->sampled = TRUE; + break; + case GST_MAKE_FOURCC ('M', 'A', 'C', '3'): + _codec ("MACE-3"); + caps = gst_caps_new_simple ("audio/x-mace", + "maceversion", G_TYPE_INT, 3, NULL); + break; + case GST_MAKE_FOURCC ('M', 'A', 'C', '6'): + _codec ("MACE-6"); + caps = gst_caps_new_simple ("audio/x-mace", + "maceversion", G_TYPE_INT, 6, NULL); + break; + case GST_MAKE_FOURCC ('O', 'g', 'g', 'V'): + /* ogg/vorbis */ + caps = gst_caps_new_simple ("application/ogg", NULL); + break; + case GST_MAKE_FOURCC ('d', 'v', 'c', 'a'): + _codec ("DV audio"); + caps = gst_caps_new_simple ("audio/x-dv", NULL); + break; + case GST_MAKE_FOURCC ('m', 'p', '4', 'a'): + _codec ("MPEG-4 AAC audio"); + caps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 4, "framed", G_TYPE_BOOLEAN, TRUE, + "stream-format", G_TYPE_STRING, "raw", NULL); + break; + case GST_MAKE_FOURCC ('Q', 'D', 'M', 'C'): + _codec ("QDesign Music"); + caps = gst_caps_new_simple ("audio/x-qdm", NULL); + break; + case GST_MAKE_FOURCC ('Q', 'D', 'M', '2'): + _codec ("QDesign Music v.2"); + /* FIXME: QDesign music version 2 (no constant) */ + if (data) { + caps = gst_caps_new_simple ("audio/x-qdm2", + "framesize", G_TYPE_INT, QT_UINT32 (data + 52), + "bitrate", G_TYPE_INT, QT_UINT32 (data + 40), + "blocksize", G_TYPE_INT, QT_UINT32 (data + 44), NULL); + } else { + caps = gst_caps_new_simple ("audio/x-qdm2", NULL); + } + break; + case GST_MAKE_FOURCC ('a', 'g', 's', 'm'): + _codec ("GSM audio"); + caps = gst_caps_new_simple ("audio/x-gsm", NULL); + break; + case GST_MAKE_FOURCC ('s', 'a', 'm', 'r'): + _codec ("AMR audio"); + caps = gst_caps_new_simple ("audio/AMR", NULL); + break; + case GST_MAKE_FOURCC ('s', 'a', 'w', 'b'): + _codec ("AMR-WB audio"); + caps = gst_caps_new_simple ("audio/AMR-WB", NULL); + break; + case GST_MAKE_FOURCC ('i', 'm', 'a', '4'): + _codec ("Quicktime IMA ADPCM"); + caps = gst_caps_new_simple ("audio/x-adpcm", + "layout", G_TYPE_STRING, "quicktime", NULL); + break; + case GST_MAKE_FOURCC ('a', 'l', 'a', 'c'): + _codec ("Apple lossless audio"); + caps = gst_caps_new_simple ("audio/x-alac", NULL); + break; + case GST_MAKE_FOURCC ('Q', 'c', 'l', 'p'): + _codec ("QualComm PureVoice"); + caps = gst_caps_from_string ("audio/qcelp"); + break; + case FOURCC_owma: + _codec ("WMA"); + caps = gst_caps_new_simple ("audio/x-wma", NULL); + break; + case GST_MAKE_FOURCC ('q', 't', 'v', 'r'): + /* ? */ + default: + { + char *s; + + s = g_strdup_printf ("audio/x-gst-fourcc-%" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + caps = gst_caps_new_simple (s, NULL); + break; + } + } + + /* enable clipping for raw audio streams */ + s = gst_caps_get_structure (caps, 0); + name = gst_structure_get_name (s); + if (g_str_has_prefix (name, "audio/x-raw-")) { + stream->need_clip = TRUE; + } + return caps; +} + +static GstCaps * +qtdemux_sub_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, + guint32 fourcc, const guint8 * stsd_data, gchar ** codec_name) +{ + GstCaps *caps; + + GST_DEBUG_OBJECT (qtdemux, "resolve fourcc %08x", fourcc); + + switch (fourcc) { + case GST_MAKE_FOURCC ('m', 'p', '4', 's'): + _codec ("DVD subtitle"); + caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL); + break; + case GST_MAKE_FOURCC ('t', 'e', 'x', 't'): + _codec ("Quicktime timed text"); + goto text; + case GST_MAKE_FOURCC ('t', 'x', '3', 'g'): + _codec ("3GPP timed text"); + text: + caps = gst_caps_new_simple ("text/plain", NULL); + /* actual text piece needs to be extracted */ + stream->need_process = TRUE; + break; + default: + { + char *s; + + s = g_strdup_printf ("text/x-gst-fourcc-%" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + caps = gst_caps_new_simple (s, NULL); + break; + } + } + return caps; +} + +#ifdef QTDEMUX_MODIFICATION +static void +gst_qtdemux_forward_trickplay (GstQTDemux * qtdemux, QtDemuxStream * stream, guint64 *timestamp) +{ + guint32 nsamples = 0; /* Number of samples between two consecutive keyframes */ + QtDemuxSample *sample; + + if ((*timestamp < stream->trickplay_info->start_pos) && !qtdemux->fwdtrick_mode) { + GST_LOG_OBJECT (qtdemux, "Received shown sample... not applying trickplay algo"); + return; + } + + if ((stream->trickplay_info->next_kidx == 0 ) && (stream->sample_index < stream->to_sample)) { + stream->trickplay_info->next_kidx = stream->trickplay_info->prev_kidx = stream->sample_index; + + GST_DEBUG_OBJECT (qtdemux, " Previous index : %d and ts = %"GST_TIME_FORMAT, + stream->trickplay_info->prev_kidx, GST_TIME_ARGS(QTSAMPLE_PTS (stream, &stream->samples[stream->trickplay_info->prev_kidx]))); + + while(1) { /* while loop to handle multiple consecutive key frames */ + /* find previous key frame */ + stream->trickplay_info->next_kidx = gst_qtdemux_find_next_keyframe (qtdemux, stream, stream->trickplay_info->next_kidx + 1); + + /* based no.of sample between key frame and rate, drop frames */ + GST_DEBUG_OBJECT (qtdemux, "current index : %d, next key index : %d", stream->sample_index, stream->trickplay_info->next_kidx); + + if (qtdemux->fwdtrick_mode) { + /* sending only key frames */ + GST_DEBUG_OBJECT (qtdemux, "reached end of keyframe interval....Jumping to next key index = %d", stream->trickplay_info->next_kidx); + stream->sample_index = stream->trickplay_info->next_kidx -1; /* next_kidx -1 is because advance_sample will increment */ + stream->trickplay_info->next_kidx = 0; + stream->discont = TRUE; + break; + } else { + + /* find no.of samples between present and previous key frames */ + nsamples = stream->trickplay_info->next_kidx - stream->trickplay_info->prev_kidx; + + /* find average duration between key frames */ + stream->trickplay_info->kidxs_dur_diff = (QTSAMPLE_PTS (stream, &stream->samples[stream->trickplay_info->next_kidx]) - + QTSAMPLE_PTS (stream, &stream->samples[stream->trickplay_info->prev_kidx])) / + nsamples; + + stream->trickplay_info->show_samples = nsamples / qtdemux->segment.rate; + + GST_DEBUG_OBJECT (qtdemux, "duration 2 between consecutive frames : %"GST_TIME_FORMAT, GST_TIME_ARGS(stream->trickplay_info->kidxs_dur_diff)); + + if(stream->trickplay_info->show_samples) { + GST_DEBUG_OBJECT (qtdemux, "samples to display between two key frames = %d", stream->trickplay_info->show_samples); + /* found no. of samples to show between key frames */ + *timestamp = QTSAMPLE_PTS (stream, &stream->samples[stream->sample_index]); + break; + } else if (!stream->trickplay_info->show_samples && + (stream->trickplay_info->next_kidx >= (stream->n_samples-1))) { + /* shown samples required to show between 2 key frames */ + GST_DEBUG_OBJECT (qtdemux, "reached end of keyframe interval....Jumping to next key index = %d", stream->trickplay_info->next_kidx); + if (stream->trickplay_info->next_kidx == stream->n_samples - 1) + stream->sample_index = stream->trickplay_info->next_kidx; + else + stream->sample_index = stream->trickplay_info->next_kidx -1; /* next_kidx -1 is because advance_sample will increment */ + stream->trickplay_info->next_kidx = 0; + stream->discont = TRUE; + break; + } + } + } + stream->discont = TRUE; + } else if (stream->trickplay_info->next_kidx != 0) { + GST_LOG_OBJECT (qtdemux, "next_kidx = %d and show_samples = %d", stream->trickplay_info->next_kidx, stream->trickplay_info->show_samples); + + stream->trickplay_info->show_samples--; + sample = &stream->samples[stream->trickplay_info->prev_kidx]; + *timestamp = QTSAMPLE_PTS (stream, sample) + + ((stream->sample_index -stream->trickplay_info->prev_kidx) * (abs (qtdemux->segment.rate)) * (stream->trickplay_info->kidxs_dur_diff)); + + if (stream->trickplay_info->show_samples == 0) { + /* shown samples required to show between 2 key frames */ + GST_DEBUG_OBJECT (qtdemux, "reached end of keyframe interval....Jumping to next key index = %d", stream->trickplay_info->next_kidx); + if (stream->trickplay_info->next_kidx == stream->n_samples - 1) + stream->sample_index = stream->trickplay_info->next_kidx; + else + stream->sample_index = stream->trickplay_info->next_kidx -1; /* next_kidx -1 is because advance_sample will increment */ + stream->trickplay_info->next_kidx = 0; + stream->discont = TRUE; + } + } +} + +static void +gst_qtdemux_backward_trickplay (GstQTDemux * qtdemux, QtDemuxStream * stream, guint64 *timestamp) +{ + if (stream->samples[stream->sample_index].keyframe) { + stream->sample_index = stream->to_sample; + GST_LOG_OBJECT (qtdemux, "Received key frame...Jump to end of the segment (idx = %d)...", stream->sample_index); + } +} + +/* searches next immediate key frame after index */ +static gint32 +gst_qtdemux_find_next_keyframe (GstQTDemux * qtdemux, QtDemuxStream * str, guint32 index) +{ + gint32 new_index = index; + + if (index > str->n_samples) { + GST_WARNING_OBJECT (qtdemux, "index is greater than n_samples..."); + new_index = str->n_samples - 1; + goto beach; + } + + /* all keyframes, return index */ + if (str->all_keyframe) { + new_index = index; + goto beach; + } + + /* else go back until we have a keyframe */ + while (TRUE) { + if (new_index == str->n_samples) { + GST_INFO_OBJECT (qtdemux, "Reached n_samples, taking last frame as reference..."); + new_index = str->n_samples - 1; + goto beach; + } + + if (str->samples[new_index].keyframe) { + GST_LOG ("Found keyframe..."); + break; + } + new_index++; + } + +beach: + GST_DEBUG_OBJECT (qtdemux, "searching for keyframe index before index %u " + "gave %d", index, new_index); + + return new_index; +} + +#endif + diff --git a/gst/isomp4/qtdemux.h b/gst/isomp4/qtdemux.h new file mode 100644 index 0000000..dd60dcc --- /dev/null +++ b/gst/isomp4/qtdemux.h @@ -0,0 +1,140 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_QTDEMUX_H__ +#define __GST_QTDEMUX_H__ + +#include +#include + +#define QTDEMUX_MODIFICATION + +#ifdef QTDEMUX_MODIFICATION +#include +#endif + +G_BEGIN_DECLS + +GST_DEBUG_CATEGORY_EXTERN (qtdemux_debug); +#define GST_CAT_DEFAULT qtdemux_debug + +#define GST_TYPE_QTDEMUX \ + (gst_qtdemux_get_type()) +#define GST_QTDEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QTDEMUX,GstQTDemux)) +#define GST_QTDEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QTDEMUX,GstQTDemuxClass)) +#define GST_IS_QTDEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QTDEMUX)) +#define GST_IS_QTDEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QTDEMUX)) + +#define GST_QTDEMUX_CAST(obj) ((GstQTDemux *)(obj)) + +/* qtdemux produces these for atoms it cannot parse */ +#define GST_QT_DEMUX_PRIVATE_TAG "private-qt-tag" +#define GST_QT_DEMUX_CLASSIFICATION_TAG "classification" + +#define GST_QTDEMUX_MAX_STREAMS 8 + +typedef struct _GstQTDemux GstQTDemux; +typedef struct _GstQTDemuxClass GstQTDemuxClass; +typedef struct _QtDemuxStream QtDemuxStream; + +struct _GstQTDemux { + GstElement element; + + /* pads */ + GstPad *sinkpad; + + QtDemuxStream *streams[GST_QTDEMUX_MAX_STREAMS]; + gint n_streams; + gint n_video_streams; + gint n_audio_streams; + gint n_sub_streams; + + guint major_brand; + GstBuffer *comp_brands; + GNode *moov_node; + GNode *moov_node_compressed; + + guint32 timescale; + guint64 duration; + + gboolean fragmented; + /* offset of the mfra atom */ + guint64 mfra_offset; + guint64 moof_offset; + + gint state; + + gboolean pullbased; + gboolean posted_redirect; + + /* push based variables */ + guint neededbytes; + guint todrop; + GstAdapter *adapter; + GstBuffer *mdatbuffer; + guint64 mdatleft; + + guint64 offset; + /* offset of the mdat atom */ + guint64 mdatoffset; + guint64 first_mdat; + gboolean got_moov; + guint header_size; + + GstTagList *tag_list; + + /* configured playback region */ + GstSegment segment; + gboolean segment_running; + GstEvent *pending_newsegment; + + /* gst index support */ + GstIndex *element_index; + gint index_id; + + gint64 requested_seek_time; + guint64 seek_offset; + + gboolean upstream_seekable; + gboolean upstream_size; + +#ifdef QTDEMUX_MODIFICATION + FILE* file; + FILE* ofile; + gchar* filename; + guint filesize; + guint maxbuffersize; + gboolean fwdtrick_mode; +#endif +}; + +struct _GstQTDemuxClass { + GstElementClass parent_class; +}; + +GType gst_qtdemux_get_type (void); + +G_END_DECLS + +#endif /* __GST_QTDEMUX_H__ */ diff --git a/gst/isomp4/qtdemux_dump.c b/gst/isomp4/qtdemux_dump.c new file mode 100644 index 0000000..92b91d8 --- /dev/null +++ b/gst/isomp4/qtdemux_dump.c @@ -0,0 +1,767 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) 2009 Tim-Philipp Müller + * Copyright (C) <2009> STEricsson + * + * 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 "qtdemux_types.h" +#include "qtdemux_dump.h" + +#include "qtatomparser.h" + +#include + +#define GET_UINT8(data) gst_byte_reader_get_uint8_unchecked(data) +#define GET_UINT16(data) gst_byte_reader_get_uint16_be_unchecked(data) +#define GET_UINT32(data) gst_byte_reader_get_uint32_be_unchecked(data) +#define GET_UINT64(data) gst_byte_reader_get_uint64_be_unchecked(data) +#define GET_FP32(data) (gst_byte_reader_get_uint32_be_unchecked(data)/65536.0) +#define GET_FP16(data) (gst_byte_reader_get_uint16_be_unchecked(data)/256.0) +#define GET_FOURCC(data) qt_atom_parser_get_fourcc_unchecked(data) + +gboolean +qtdemux_dump_mvhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 version = 0; + + if (!qt_atom_parser_has_remaining (data, 100)) + return FALSE; + + version = GET_UINT32 (data); + GST_LOG ("%*s version/flags: %08x", depth, "", version); + + version = version >> 24; + if (version == 0) { + GST_LOG ("%*s creation time: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s modify time: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s time scale: 1/%u sec", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s duration: %u", depth, "", GET_UINT32 (data)); + } else if (version == 1) { + GST_LOG ("%*s creation time: %" G_GUINT64_FORMAT, + depth, "", GET_UINT64 (data)); + GST_LOG ("%*s modify time: %" G_GUINT64_FORMAT, + depth, "", GET_UINT64 (data)); + GST_LOG ("%*s time scale: 1/%u sec", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s duration: %" G_GUINT64_FORMAT, + depth, "", GET_UINT64 (data)); + } else + return FALSE; + + GST_LOG ("%*s pref. rate: %g", depth, "", GET_FP32 (data)); + GST_LOG ("%*s pref. volume: %g", depth, "", GET_FP16 (data)); + gst_byte_reader_skip (data, 46); + GST_LOG ("%*s preview time: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s preview dur.: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s poster time: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s select time: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s select dur.: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s current time: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s next track ID: %d", depth, "", GET_UINT32 (data)); + return TRUE; +} + +gboolean +qtdemux_dump_tkhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint64 duration, ctime, mtime; + guint32 version = 0, track_id = 0, iwidth = 0, iheight = 0; + guint16 layer = 0, alt_group = 0, ivol = 0; + guint value_size; + + if (!gst_byte_reader_get_uint32_be (data, &version)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", version); + + value_size = ((version >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); + + if (qt_atom_parser_get_offset (data, value_size, &ctime) && + qt_atom_parser_get_offset (data, value_size, &mtime) && + gst_byte_reader_get_uint32_be (data, &track_id) && + gst_byte_reader_skip (data, 4) && + qt_atom_parser_get_offset (data, value_size, &duration) && + gst_byte_reader_skip (data, 4) && + gst_byte_reader_get_uint16_be (data, &layer) && + gst_byte_reader_get_uint16_be (data, &alt_group) && + gst_byte_reader_skip (data, 4) && + gst_byte_reader_get_uint16_be (data, &ivol) && + gst_byte_reader_skip (data, 2 + (9 * 4)) && + gst_byte_reader_get_uint32_be (data, &iwidth) && + gst_byte_reader_get_uint32_be (data, &iheight)) { + GST_LOG ("%*s creation time: %" G_GUINT64_FORMAT, depth, "", ctime); + GST_LOG ("%*s modify time: %" G_GUINT64_FORMAT, depth, "", mtime); + GST_LOG ("%*s track ID: %u", depth, "", track_id); + GST_LOG ("%*s duration: %" G_GUINT64_FORMAT, depth, "", duration); + GST_LOG ("%*s layer: %u", depth, "", layer); + GST_LOG ("%*s alt group: %u", depth, "", alt_group); + GST_LOG ("%*s volume: %g", depth, "", ivol / 256.0); + GST_LOG ("%*s track width: %g", depth, "", iwidth / 65536.0); + GST_LOG ("%*s track height: %g", depth, "", iheight / 65536.0); + return TRUE; + } + + return FALSE; +} + +gboolean +qtdemux_dump_elst (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %d", depth, "", num_entries); + + if (!qt_atom_parser_has_chunks (data, num_entries, 4 + 4 + 4)) + return FALSE; + + for (i = 0; i < num_entries; i++) { + GST_LOG ("%*s track dur: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s media time: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s media rate: %g", depth, "", GET_FP32 (data)); + } + return TRUE; +} + +gboolean +qtdemux_dump_mdhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 version = 0; + guint64 duration, ctime, mtime; + guint32 time_scale = 0; + guint16 language = 0, quality = 0; + guint value_size; + + if (!gst_byte_reader_get_uint32_be (data, &version)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", version); + + value_size = ((version >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); + + if (qt_atom_parser_get_offset (data, value_size, &ctime) && + qt_atom_parser_get_offset (data, value_size, &mtime) && + gst_byte_reader_get_uint32_be (data, &time_scale) && + qt_atom_parser_get_offset (data, value_size, &duration) && + gst_byte_reader_get_uint16_be (data, &language) && + gst_byte_reader_get_uint16_be (data, &quality)) { + GST_LOG ("%*s creation time: %" G_GUINT64_FORMAT, depth, "", ctime); + GST_LOG ("%*s modify time: %" G_GUINT64_FORMAT, depth, "", mtime); + GST_LOG ("%*s time scale: 1/%u sec", depth, "", time_scale); + GST_LOG ("%*s duration: %" G_GUINT64_FORMAT, depth, "", duration); + GST_LOG ("%*s language: %u", depth, "", language); + GST_LOG ("%*s quality: %u", depth, "", quality); + return TRUE; + } + + return FALSE; +} + +gboolean +qtdemux_dump_hdlr (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 version, type, subtype, manufacturer; + const gchar *name; + + if (!qt_atom_parser_has_remaining (data, 4 + 4 + 4 + 4 + 4 + 4 + 1)) + return FALSE; + + version = GET_UINT32 (data); + type = GET_FOURCC (data); + subtype = GET_FOURCC (data); + manufacturer = GET_FOURCC (data); + + GST_LOG ("%*s version/flags: %08x", depth, "", version); + GST_LOG ("%*s type: %" GST_FOURCC_FORMAT, depth, "", + GST_FOURCC_ARGS (type)); + GST_LOG ("%*s subtype: %" GST_FOURCC_FORMAT, depth, "", + GST_FOURCC_ARGS (subtype)); + GST_LOG ("%*s manufacturer: %" GST_FOURCC_FORMAT, depth, "", + GST_FOURCC_ARGS (manufacturer)); + GST_LOG ("%*s flags: %08x", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s flags mask: %08x", depth, "", GET_UINT32 (data)); + + /* quicktime uses pascal string, mp4 zero-terminated string */ + if (gst_byte_reader_peek_string (data, &name)) { + GST_LOG ("%*s name: %s", depth, "", name); + } else { + gchar buf[256]; + guint len; + + len = gst_byte_reader_get_uint8_unchecked (data); + if (qt_atom_parser_has_remaining (data, len)) { + memcpy (buf, gst_byte_reader_peek_data_unchecked (data), len); + buf[len] = '\0'; + GST_LOG ("%*s name: %s", depth, "", buf); + } + } + return TRUE; +} + +gboolean +qtdemux_dump_vmhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + if (!qt_atom_parser_has_remaining (data, 4 + 4)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s mode/color: %08x", depth, "", GET_UINT32 (data)); + return TRUE; +} + +gboolean +qtdemux_dump_dref (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %u", depth, "", num_entries); + for (i = 0; i < num_entries; i++) { + guint32 size = 0, fourcc; + + if (!gst_byte_reader_get_uint32_be (data, &size) || + !qt_atom_parser_get_fourcc (data, &fourcc) || size < 8 || + !gst_byte_reader_skip (data, size - 8)) + return FALSE; + + GST_LOG ("%*s size: %u", depth, "", size); + GST_LOG ("%*s type: %" GST_FOURCC_FORMAT, depth, "", + GST_FOURCC_ARGS (fourcc)); + } + return TRUE; +} + +gboolean +qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %d", depth, "", num_entries); + + for (i = 0; i < num_entries; i++) { + GstByteReader sub; + guint32 size = 0, fourcc; + + if (!gst_byte_reader_get_uint32_be (data, &size) || + !qt_atom_parser_get_fourcc (data, &fourcc)) + return FALSE; + + GST_LOG ("%*s size: %u", depth, "", size); + GST_LOG ("%*s type: %" GST_FOURCC_FORMAT, depth, "", + GST_FOURCC_ARGS (fourcc)); + + if (size < (6 + 2 + 4 + 4 + 4 + 4 + 2 + 2 + 4 + 4 + 4 + 2 + 1 + 31 + 2 + 2)) + return FALSE; + + qt_atom_parser_peek_sub (data, 0, 78, &sub); + gst_byte_reader_skip (&sub, 6); + GST_LOG ("%*s data reference:%d", depth, "", GET_UINT16 (&sub)); + GST_LOG ("%*s version/rev.: %08x", depth, "", GET_UINT32 (&sub)); + fourcc = GET_FOURCC (&sub); + GST_LOG ("%*s vendor: %" GST_FOURCC_FORMAT, depth, "", + GST_FOURCC_ARGS (fourcc)); + GST_LOG ("%*s temporal qual: %u", depth, "", GET_UINT32 (&sub)); + GST_LOG ("%*s spatial qual: %u", depth, "", GET_UINT32 (&sub)); + GST_LOG ("%*s width: %u", depth, "", GET_UINT16 (&sub)); + GST_LOG ("%*s height: %u", depth, "", GET_UINT16 (&sub)); + GST_LOG ("%*s horiz. resol: %g", depth, "", GET_FP32 (&sub)); + GST_LOG ("%*s vert. resol.: %g", depth, "", GET_FP32 (&sub)); + GST_LOG ("%*s data size: %u", depth, "", GET_UINT32 (&sub)); + GST_LOG ("%*s frame count: %u", depth, "", GET_UINT16 (&sub)); + /* something is not right with this, it's supposed to be a string but it's + * not apparently, so just skip this for now */ + gst_byte_reader_skip (&sub, 1 + 31); + GST_LOG ("%*s compressor: (skipped)", depth, ""); + GST_LOG ("%*s depth: %u", depth, "", GET_UINT16 (&sub)); + GST_LOG ("%*s color table ID:%u", depth, "", GET_UINT16 (&sub)); + if (!gst_byte_reader_skip (data, size - (4 + 4))) + return FALSE; + } + return TRUE; +} + +gboolean +qtdemux_dump_stts (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %d", depth, "", num_entries); + + if (!qt_atom_parser_has_chunks (data, num_entries, 4 + 4)) + return FALSE; + + for (i = 0; i < num_entries; i++) { + GST_LOG ("%*s count: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s duration: %u", depth, "", GET_UINT32 (data)); + } + return TRUE; +} + +gboolean +qtdemux_dump_stss (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %d", depth, "", num_entries); + + if (!qt_atom_parser_has_chunks (data, num_entries, 4)) + return FALSE; + + for (i = 0; i < num_entries; i++) { + GST_LOG ("%*s sample: %u", depth, "", GET_UINT32 (data)); + } + return TRUE; +} + +gboolean +qtdemux_dump_stsc (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %d", depth, "", num_entries); + + if (!qt_atom_parser_has_chunks (data, num_entries, 4 + 4 + 4)) + return FALSE; + + for (i = 0; i < num_entries; i++) { + GST_LOG ("%*s first chunk: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s sample per ch: %u", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s sample desc id:%08x", depth, "", GET_UINT32 (data)); + } + return TRUE; +} + +gboolean +qtdemux_dump_stsz (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, sample_size = 0, num_entries = 0; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &sample_size)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s sample size: %d", depth, "", sample_size); + + if (sample_size == 0) { + if (!gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s n entries: %d", depth, "", num_entries); +#if 0 + if (!qt_atom_parser_has_chunks (data, num_entries, 4)) + return FALSE; + for (i = 0; i < num_entries; i++) { + GST_LOG ("%*s sample size: %u", depth, "", GET_UINT32 (data)); + } +#endif + } + return TRUE; +} + +gboolean +qtdemux_dump_stco (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %d", depth, "", num_entries); + + if (!qt_atom_parser_has_chunks (data, num_entries, 4)) + return FALSE; + + for (i = 0; i < num_entries; i++) { + GST_LOG ("%*s chunk offset: %u", depth, "", GET_UINT32 (data)); + } + return TRUE; +} + +gboolean +qtdemux_dump_ctts (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i, count, offset; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %d", depth, "", num_entries); + + if (!qt_atom_parser_has_chunks (data, num_entries, 4 + 4)) + return FALSE; + + for (i = 0; i < num_entries; i++) { + count = GET_UINT32 (data); + offset = GET_UINT32 (data); + GST_LOG ("%*s sample count :%8d offset: %8d", depth, "", count, offset); + } + return TRUE; +} + +gboolean +qtdemux_dump_co64 (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 ver_flags = 0, num_entries = 0, i; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || + !gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + GST_LOG ("%*s n entries: %d", depth, "", num_entries); + + if (!qt_atom_parser_has_chunks (data, num_entries, 8)) + return FALSE; + + for (i = 0; i < num_entries; i++) { + GST_LOG ("%*s chunk offset: %" G_GUINT64_FORMAT, depth, "", + GET_UINT64 (data)); + } + return TRUE; +} + +gboolean +qtdemux_dump_mfro (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + if (!qt_atom_parser_has_remaining (data, 4)) + return FALSE; + + GST_LOG ("%*s size: %d", depth, "", GET_UINT32 (data)); + return TRUE; +} + +gboolean +qtdemux_dump_tfra (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint64 time = 0, moof_offset = 0; + guint32 len = 0, num_entries = 0, ver_flags = 0, track_id = 0, i; + guint value_size, traf_size, trun_size, sample_size; + + if (!gst_byte_reader_get_uint32_be (data, &ver_flags)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); + + if (!gst_byte_reader_get_uint32_be (data, &track_id) || + gst_byte_reader_get_uint32_be (data, &len) || + gst_byte_reader_get_uint32_be (data, &num_entries)) + return FALSE; + + GST_LOG ("%*s track ID: %u", depth, "", track_id); + GST_LOG ("%*s length: 0x%x", depth, "", len); + GST_LOG ("%*s n entries: %u", depth, "", num_entries); + + value_size = ((ver_flags >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); + sample_size = (len & 3) + 1; + trun_size = ((len & 12) >> 2) + 1; + traf_size = ((len & 48) >> 4) + 1; + + if (!qt_atom_parser_has_chunks (data, num_entries, + value_size + value_size + traf_size + trun_size + sample_size)) + return FALSE; + + for (i = 0; i < num_entries; i++) { + qt_atom_parser_get_offset (data, value_size, &time); + qt_atom_parser_get_offset (data, value_size, &moof_offset); + GST_LOG ("%*s time: %" G_GUINT64_FORMAT, depth, "", time); + GST_LOG ("%*s moof_offset: %" G_GUINT64_FORMAT, + depth, "", moof_offset); + GST_LOG ("%*s traf_number: %u", depth, "", + qt_atom_parser_get_uint_with_size_unchecked (data, traf_size)); + GST_LOG ("%*s trun_number: %u", depth, "", + qt_atom_parser_get_uint_with_size_unchecked (data, trun_size)); + GST_LOG ("%*s sample_number: %u", depth, "", + qt_atom_parser_get_uint_with_size_unchecked (data, sample_size)); + } + + return TRUE; +} + +gboolean +qtdemux_dump_tfhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 flags = 0, n = 0, track_id = 0; + guint64 base_data_offset = 0; + + if (!gst_byte_reader_skip (data, 1) || + !gst_byte_reader_get_uint24_be (data, &flags)) + return FALSE; + GST_LOG ("%*s flags: %08x", depth, "", flags); + + if (!gst_byte_reader_get_uint32_be (data, &track_id)) + return FALSE; + GST_LOG ("%*s track_id: %u", depth, "", track_id); + + if (flags & TF_BASE_DATA_OFFSET) { + if (!gst_byte_reader_get_uint64_be (data, &base_data_offset)) + return FALSE; + GST_LOG ("%*s base-data-offset: %" G_GUINT64_FORMAT, + depth, "", base_data_offset); + } + + if (flags & TF_SAMPLE_DESCRIPTION_INDEX) { + if (!gst_byte_reader_get_uint32_be (data, &n)) + return FALSE; + GST_LOG ("%*s sample-description-index: %u", depth, "", n); + } + + if (flags & TF_DEFAULT_SAMPLE_DURATION) { + if (!gst_byte_reader_get_uint32_be (data, &n)) + return FALSE; + GST_LOG ("%*s default-sample-duration: %u", depth, "", n); + } + + if (flags & TF_DEFAULT_SAMPLE_SIZE) { + if (!gst_byte_reader_get_uint32_be (data, &n)) + return FALSE; + GST_LOG ("%*s default-sample-size: %u", depth, "", n); + } + + if (flags & TF_DEFAULT_SAMPLE_FLAGS) { + if (!gst_byte_reader_get_uint32_be (data, &n)) + return FALSE; + GST_LOG ("%*s default-sample-flags: %u", depth, "", n); + } + + GST_LOG ("%*s duration-is-empty: %s", depth, "", + flags & TF_DURATION_IS_EMPTY ? "yes" : "no"); + + return TRUE; +} + +gboolean +qtdemux_dump_trun (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 flags = 0, samples_count = 0, data_offset = 0, first_sample_flags = 0; + guint32 sample_duration = 0, sample_size = 0, sample_flags = + 0, composition_time_offsets = 0; + int i = 0; + + if (!gst_byte_reader_skip (data, 1) || + !gst_byte_reader_get_uint24_be (data, &flags)) + return FALSE; + + GST_LOG ("%*s flags: %08x", depth, "", flags); + + if (!gst_byte_reader_get_uint32_be (data, &samples_count)) + return FALSE; + GST_LOG ("%*s samples_count: %u", depth, "", samples_count); + + if (flags & TR_DATA_OFFSET) { + if (!gst_byte_reader_get_uint32_be (data, &data_offset)) + return FALSE; + GST_LOG ("%*s data-offset: %u", depth, "", data_offset); + } + + if (flags & TR_FIRST_SAMPLE_FLAGS) { + if (!gst_byte_reader_get_uint32_be (data, &first_sample_flags)) + return FALSE; + GST_LOG ("%*s first-sample-flags: %u", depth, "", first_sample_flags); + } + + for (i = 0; i < samples_count; i++) { + if (flags & TR_SAMPLE_DURATION) { + if (!gst_byte_reader_get_uint32_be (data, &sample_duration)) + return FALSE; + GST_LOG ("%*s sample-duration: %u", depth, "", sample_duration); + } + + if (flags & TR_SAMPLE_SIZE) { + if (!gst_byte_reader_get_uint32_be (data, &sample_size)) + return FALSE; + GST_LOG ("%*s sample-size: %u", depth, "", sample_size); + } + + if (flags & TR_SAMPLE_FLAGS) { + if (!gst_byte_reader_get_uint32_be (data, &sample_flags)) + return FALSE; + GST_LOG ("%*s sample-flags: %u", depth, "", sample_flags); + } + + if (flags & TR_COMPOSITION_TIME_OFFSETS) { + if (!gst_byte_reader_get_uint32_be (data, &composition_time_offsets)) + return FALSE; + GST_LOG ("%*s composition_time_offsets: %u", depth, "", + composition_time_offsets); + } + } + + return TRUE; +} + +gboolean +qtdemux_dump_trex (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + if (!qt_atom_parser_has_remaining (data, 4 + 4 + 4 + 4 + 4 + 4)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s track ID: %08x", depth, "", GET_UINT32 (data)); + GST_LOG ("%*s default sample desc. index: %08x", depth, "", + GET_UINT32 (data)); + GST_LOG ("%*s default sample duration: %08x", depth, "", + GET_UINT32 (data)); + GST_LOG ("%*s default sample size: %08x", depth, "", + GET_UINT32 (data)); + GST_LOG ("%*s default sample flags: %08x", depth, "", + GET_UINT32 (data)); + + return TRUE; +} + +gboolean +qtdemux_dump_mehd (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 version = 0; + guint64 fragment_duration; + guint value_size; + + if (!gst_byte_reader_get_uint32_be (data, &version)) + return FALSE; + + GST_LOG ("%*s version/flags: %08x", depth, "", version); + + value_size = ((version >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); + if (qt_atom_parser_get_offset (data, value_size, &fragment_duration)) { + GST_LOG ("%*s fragment duration: %" G_GUINT64_FORMAT, + depth, "", fragment_duration); + return TRUE; + } + + return FALSE; +} + +gboolean +qtdemux_dump_sdtp (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + guint32 version; + guint8 val; + guint i = 1; + + version = GET_UINT32 (data); + GST_LOG ("%*s version/flags: %08x", depth, "", version); + + /* the sample_count is specified in the stsz or stz2 box. + * the information for a sample is stored in a single byte, + * so we read until there are no remaining bytes */ + while (qt_atom_parser_has_remaining (data, 1)) { + val = GET_UINT8 (data); + GST_LOG ("%*s sample number: %d", depth, "", i); + GST_LOG ("%*s sample_depends_on: %d", depth, "", + ((guint16) (val)) & 0x3); + GST_LOG ("%*s sample_is_depended_on: %d", depth, "", + ((guint16) (val >> 2)) & 0x3); + GST_LOG ("%*s sample_has_redundancy: %d", depth, "", + ((guint16) (val >> 4)) & 0x3); + ++i; + } + return TRUE; +} + +gboolean +qtdemux_dump_unknown (GstQTDemux * qtdemux, GstByteReader * data, int depth) +{ + int len; + + len = gst_byte_reader_get_remaining (data); + GST_LOG ("%*s length: %d", depth, "", len); + + GST_MEMDUMP_OBJECT (qtdemux, "unknown atom data", + gst_byte_reader_peek_data_unchecked (data), len); + return TRUE; +} + +static gboolean +qtdemux_node_dump_foreach (GNode * node, gpointer qtdemux) +{ + GstByteReader parser; + guint8 *buffer = (guint8 *) node->data; /* FIXME: move to byte reader */ + guint32 node_length; + guint32 fourcc; + const QtNodeType *type; + int depth; + + node_length = GST_READ_UINT32_BE (buffer); + fourcc = GST_READ_UINT32_LE (buffer + 4); + + g_warn_if_fail (node_length >= 8); + + gst_byte_reader_init (&parser, buffer + 8, node_length - 8); + + type = qtdemux_type_get (fourcc); + + depth = (g_node_depth (node) - 1) * 2; + GST_LOG ("%*s'%" GST_FOURCC_FORMAT "', [%d], %s", + depth, "", GST_FOURCC_ARGS (fourcc), node_length, type->name); + + if (type->dump) { + gboolean ret; + + ret = type->dump (GST_QTDEMUX_CAST (qtdemux), &parser, depth); + + if (!ret) { + GST_WARNING ("%*s not enough data parsing atom %" GST_FOURCC_FORMAT, + depth, "", GST_FOURCC_ARGS (fourcc)); + } + } + + return FALSE; +} + +gboolean +qtdemux_node_dump (GstQTDemux * qtdemux, GNode * node) +{ + if (__gst_debug_min < GST_LEVEL_LOG) + return TRUE; + + g_node_traverse (node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, + qtdemux_node_dump_foreach, qtdemux); + return TRUE; +} diff --git a/gst/isomp4/qtdemux_dump.h b/gst/isomp4/qtdemux_dump.h new file mode 100644 index 0000000..44fe3f3 --- /dev/null +++ b/gst/isomp4/qtdemux_dump.h @@ -0,0 +1,78 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> STEricsson + * + * 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_QTDEMUX_DUMP_H__ +#define __GST_QTDEMUX_DUMP_H__ + +#include +#include + +G_BEGIN_DECLS + gboolean qtdemux_dump_mvhd (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_tkhd (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_elst (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_mdhd (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_hdlr (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_vmhd (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_dref (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_stts (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_stss (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_stsc (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_stsz (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_stco (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_co64 (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_ctts (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_mfro (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_tfra (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_tfhd (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_trun (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_trex (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_mehd (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_sdtp (GstQTDemux * qtdemux, GstByteReader * data, + int depth); +gboolean qtdemux_dump_unknown (GstQTDemux * qtdemux, GstByteReader * data, + int depth); + +gboolean qtdemux_node_dump (GstQTDemux * qtdemux, GNode * node); + +G_END_DECLS +#endif /* __GST_QTDEMUX_DUMP_H__ */ diff --git a/gst/isomp4/qtdemux_fourcc.h b/gst/isomp4/qtdemux_fourcc.h new file mode 100644 index 0000000..b069097 --- /dev/null +++ b/gst/isomp4/qtdemux_fourcc.h @@ -0,0 +1,219 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_QTDEMUX_FOURCC_H__ +#define __GST_QTDEMUX_FOURCC_H__ + +#include + +G_BEGIN_DECLS + +#define FOURCC_ftyp GST_MAKE_FOURCC('f','t','y','p') +#define FOURCC_qt__ GST_MAKE_FOURCC('q','t',' ',' ') +#define FOURCC_moov GST_MAKE_FOURCC('m','o','o','v') +#define FOURCC_mvhd GST_MAKE_FOURCC('m','v','h','d') +#define FOURCC_clip GST_MAKE_FOURCC('c','l','i','p') +#define FOURCC_trak GST_MAKE_FOURCC('t','r','a','k') +#define FOURCC_udta GST_MAKE_FOURCC('u','d','t','a') +#define FOURCC_tkhd GST_MAKE_FOURCC('t','k','h','d') +#define FOURCC_crgn GST_MAKE_FOURCC('c','r','g','n') +#define FOURCC_edts GST_MAKE_FOURCC('e','d','t','s') +#define FOURCC_elst GST_MAKE_FOURCC('e','l','s','t') +#define FOURCC_tref GST_MAKE_FOURCC('t','r','e','f') +#define FOURCC_imap GST_MAKE_FOURCC('i','m','a','p') +#define FOURCC___in GST_MAKE_FOURCC(' ',' ','i','n') +#define FOURCC___ty GST_MAKE_FOURCC(' ',' ','t','y') +#define FOURCC_mdia GST_MAKE_FOURCC('m','d','i','a') +#define FOURCC_mdhd GST_MAKE_FOURCC('m','d','h','d') +#define FOURCC_hdlr GST_MAKE_FOURCC('h','d','l','r') +#define FOURCC_hndl GST_MAKE_FOURCC('h','n','d','l') +#define FOURCC_minf GST_MAKE_FOURCC('m','i','n','f') +#define FOURCC_vmhd GST_MAKE_FOURCC('v','m','h','d') +#define FOURCC_smhd GST_MAKE_FOURCC('s','m','h','d') +#define FOURCC_dinf GST_MAKE_FOURCC('d','i','n','f') +#define FOURCC_dref GST_MAKE_FOURCC('d','r','e','f') +#define FOURCC_stbl GST_MAKE_FOURCC('s','t','b','l') +#define FOURCC_stsd GST_MAKE_FOURCC('s','t','s','d') +#define FOURCC_stts GST_MAKE_FOURCC('s','t','t','s') +#define FOURCC_stss GST_MAKE_FOURCC('s','t','s','s') +#define FOURCC_stsc GST_MAKE_FOURCC('s','t','s','c') +#define FOURCC_stsz GST_MAKE_FOURCC('s','t','s','z') +#define FOURCC_stco GST_MAKE_FOURCC('s','t','c','o') +#define FOURCC_vide GST_MAKE_FOURCC('v','i','d','e') +#define FOURCC_soun GST_MAKE_FOURCC('s','o','u','n') +#define FOURCC_subp GST_MAKE_FOURCC('s','u','b','p') +#define FOURCC_strm GST_MAKE_FOURCC('s','t','r','m') +#define FOURCC_rtsp GST_MAKE_FOURCC('r','t','s','p') +#define FOURCC_co64 GST_MAKE_FOURCC('c','o','6','4') +#define FOURCC_hint GST_MAKE_FOURCC('h','i','n','t') +#define FOURCC_mp4a GST_MAKE_FOURCC('m','p','4','a') +#define FOURCC_mp4v GST_MAKE_FOURCC('m','p','4','v') +#define FOURCC_MP4V GST_MAKE_FOURCC('M','P','4','V') +#define FOURCC_fmp4 GST_MAKE_FOURCC('f','m','p','4') +#define FOURCC_FMP4 GST_MAKE_FOURCC('F','M','P','4') +#define FOURCC_glbl GST_MAKE_FOURCC('g','l','b','l') +#define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e') +#define FOURCC_appl GST_MAKE_FOURCC('a','p','p','l') +#define FOURCC_esds GST_MAKE_FOURCC('e','s','d','s') +#define FOURCC_pasp GST_MAKE_FOURCC('p','a','s','p') +#define FOURCC_hnti GST_MAKE_FOURCC('h','n','t','i') +#define FOURCC_rtp_ GST_MAKE_FOURCC('r','t','p',' ') +#define FOURCC_sdp_ GST_MAKE_FOURCC('s','d','p',' ') +#define FOURCC_meta GST_MAKE_FOURCC('m','e','t','a') +#define FOURCC_ilst GST_MAKE_FOURCC('i','l','s','t') +#define FOURCC__nam GST_MAKE_FOURCC(0xa9,'n','a','m') +#define FOURCC__cmt GST_MAKE_FOURCC(0xa9,'c','m','t') +#define FOURCC__des GST_MAKE_FOURCC(0xa9,'d','e','s') +#define FOURCC_desc GST_MAKE_FOURCC('d','e','s','c') +#define FOURCC__lyr GST_MAKE_FOURCC(0xa9,'l','y','r') +#define FOURCC__cpy GST_MAKE_FOURCC(0xa9,'c','p','y') +#define FOURCC__ART GST_MAKE_FOURCC(0xa9,'A','R','T') +#define FOURCC_aART GST_MAKE_FOURCC('a','A','R','T') +#define FOURCC__wrt GST_MAKE_FOURCC(0xa9,'w','r','t') +#define FOURCC__grp GST_MAKE_FOURCC(0xa9,'g','r','p') +#define FOURCC__alb GST_MAKE_FOURCC(0xa9,'a','l','b') +#define FOURCC__day GST_MAKE_FOURCC(0xa9,'d','a','y') +#define FOURCC__req GST_MAKE_FOURCC(0xa9,'r','e','q') +#define FOURCC__enc GST_MAKE_FOURCC(0xa9,'e','n','c') +#define FOURCC__inf GST_MAKE_FOURCC(0xa9,'i','n','f') +#define FOURCC_cprt GST_MAKE_FOURCC('c','p','r','t') +#define FOURCC_gnre GST_MAKE_FOURCC('g','n','r','e') +#define FOURCC_disc GST_MAKE_FOURCC('d','i','s','c') +#define FOURCC_disk GST_MAKE_FOURCC('d','i','s','k') +#define FOURCC_trkn GST_MAKE_FOURCC('t','r','k','n') +#define FOURCC_cpil GST_MAKE_FOURCC('c','p','i','l') +#define FOURCC_pgap GST_MAKE_FOURCC('p','g','a','p') +#define FOURCC_pcst GST_MAKE_FOURCC('p','c','s','t') +#define FOURCC_tmpo GST_MAKE_FOURCC('t','m','p','o') +#define FOURCC_covr GST_MAKE_FOURCC('c','o','v','r') +#define FOURCC__too GST_MAKE_FOURCC(0xa9,'t','o','o') +#define FOURCC_tvsh GST_MAKE_FOURCC('t','v','s','h') +#define FOURCC_tven GST_MAKE_FOURCC('t','v','e','n') +#define FOURCC_tvsn GST_MAKE_FOURCC('t','v','s','n') +#define FOURCC_tves GST_MAKE_FOURCC('t','v','e','s') +#define FOURCC_sonm GST_MAKE_FOURCC('s','o','n','m') +#define FOURCC_soal GST_MAKE_FOURCC('s','o','a','l') +#define FOURCC_soar GST_MAKE_FOURCC('s','o','a','r') +#define FOURCC_soaa GST_MAKE_FOURCC('s','o','a','a') +#define FOURCC_soco GST_MAKE_FOURCC('s','o','c','o') +#define FOURCC_sosn GST_MAKE_FOURCC('s','o','s','n') +#define FOURCC_____ GST_MAKE_FOURCC('-','-','-','-') +#define FOURCC_mean GST_MAKE_FOURCC('m','e','a','n') +#define FOURCC_name GST_MAKE_FOURCC('n','a','m','e') +#define FOURCC_free GST_MAKE_FOURCC('f','r','e','e') +#define FOURCC_data GST_MAKE_FOURCC('d','a','t','a') +#define FOURCC_SVQ3 GST_MAKE_FOURCC('S','V','Q','3') +#define FOURCC__gen GST_MAKE_FOURCC(0xa9, 'g', 'e', 'n') +#define FOURCC_drms GST_MAKE_FOURCC('d','r','m','s') +#define FOURCC_drmi GST_MAKE_FOURCC('d','r','m','i') +#define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') +#define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C') +#define FOURCC_btrt GST_MAKE_FOURCC('b','t','r','t') +#define FOURCC_VP31 GST_MAKE_FOURCC('V','P','3','1') +#define FOURCC_rle_ GST_MAKE_FOURCC('r','l','e',' ') +#define FOURCC_MAC6 GST_MAKE_FOURCC('M','A','C','6') +#define FOURCC_MAC3 GST_MAKE_FOURCC('M','A','C','3') +#define FOURCC_ima4 GST_MAKE_FOURCC('i','m','a','4') +#define FOURCC_ulaw GST_MAKE_FOURCC('u','l','a','w') +#define FOURCC_alaw GST_MAKE_FOURCC('a','l','a','w') +#define FOURCC_twos GST_MAKE_FOURCC('t','w','o','s') +#define FOURCC_sowt GST_MAKE_FOURCC('s','o','w','t') +#define FOURCC_raw_ GST_MAKE_FOURCC('r','a','w',' ') +#define FOURCC_in24 GST_MAKE_FOURCC('i','n','2','4') +#define FOURCC_enda GST_MAKE_FOURCC('e','n','d','a') +#define FOURCC_QDM2 GST_MAKE_FOURCC('Q','D','M','2') +#define FOURCC_alac GST_MAKE_FOURCC('a','l','a','c') +#define FOURCC_samr GST_MAKE_FOURCC('s','a','m','r') +#define FOURCC_sawb GST_MAKE_FOURCC('s','a','w','b') +#define FOURCC_mdat GST_MAKE_FOURCC('m','d','a','t') +#define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e') +#define FOURCC_PICT GST_MAKE_FOURCC('P','I','C','T') +#define FOURCC_pnot GST_MAKE_FOURCC('p','n','o','t') +#define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b') +#define FOURCC_alis GST_MAKE_FOURCC('a','l','i','s') +#define FOURCC_url_ GST_MAKE_FOURCC('u','r','l',' ') +#define FOURCC_frma GST_MAKE_FOURCC('f','r','m','a') +#define FOURCC_ctts GST_MAKE_FOURCC('c','t','t','s') +#define FOURCC_keyw GST_MAKE_FOURCC('k','e','y','w') +#define FOURCC_kywd GST_MAKE_FOURCC('k','y','w','d') +#define FOURCC_agsm GST_MAKE_FOURCC('a','g','s','m') +#define FOURCC_text GST_MAKE_FOURCC('t','e','x','t') +#define FOURCC_tx3g GST_MAKE_FOURCC('t','x','3','g') +#define FOURCC_mp4s GST_MAKE_FOURCC('m','p','4','s') +#define FOURCC_gama GST_MAKE_FOURCC('g','a','m','a') + +/* SVQ3 fourcc */ +#define FOURCC_SEQH GST_MAKE_FOURCC('S','E','Q','H') +#define FOURCC_SMI_ GST_MAKE_FOURCC('S','M','I',' ') + +/* 3gpp asset meta data fourcc */ +#define FOURCC_titl GST_MAKE_FOURCC('t','i','t','l') +#define FOURCC_dscp GST_MAKE_FOURCC('d','s','c','p') +#define FOURCC_perf GST_MAKE_FOURCC('p','e','r','f') +#define FOURCC_auth GST_MAKE_FOURCC('a','u','t','h') +#define FOURCC_rtng GST_MAKE_FOURCC('r','t','n','g') +#define FOURCC_clsf GST_MAKE_FOURCC('c','l','s','f') +#define FOURCC_loci GST_MAKE_FOURCC('l','o','c','i') +#define FOURCC_albm GST_MAKE_FOURCC('a','l','b','m') +#define FOURCC_yrrc GST_MAKE_FOURCC('y','r','r','c') + +/* misc tag stuff */ +#define FOURCC_ID32 GST_MAKE_FOURCC('I', 'D','3','2') + +/* ISO Motion JPEG 2000 fourcc */ +#define FOURCC_mjp2 GST_MAKE_FOURCC('m','j','p','2') +#define FOURCC_jp2h GST_MAKE_FOURCC('j','p','2','h') +#define FOURCC_ihdr GST_MAKE_FOURCC('i','h','d','r') +#define FOURCC_colr GST_MAKE_FOURCC('c','o','l','r') +#define FOURCC_fiel GST_MAKE_FOURCC('f','i','e','l') +#define FOURCC_jp2x GST_MAKE_FOURCC('j','p','2','x') +#define FOURCC_cmap GST_MAKE_FOURCC('c','m','a','p') +#define FOURCC_cdef GST_MAKE_FOURCC('c','d','e','f') +/* some buggy hardware's notion of mdhd */ +#define FOURCC_mhdr GST_MAKE_FOURCC('m','h','d','r') + +/* Xiph fourcc */ +#define FOURCC_XiTh GST_MAKE_FOURCC('X','i','T','h') +#define FOURCC_XdxT GST_MAKE_FOURCC('X','d','x','T') +#define FOURCC_tCtH GST_MAKE_FOURCC('t','C','t','H') +#define FOURCC_tCt_ GST_MAKE_FOURCC('t','C','t','#') +#define FOURCC_tCtC GST_MAKE_FOURCC('t','C','t','C') + +#define FOURCC_XMP_ GST_MAKE_FOURCC('X','M','P','_') +#define FOURCC_uuid GST_MAKE_FOURCC('u','u','i','d') + +/* Fragmented MP4 */ +#define FOURCC_mehd GST_MAKE_FOURCC('m','e','h','d') +#define FOURCC_mfhd GST_MAKE_FOURCC('m','f','h','d') +#define FOURCC_mfra GST_MAKE_FOURCC('m','f','r','a') +#define FOURCC_mfro GST_MAKE_FOURCC('m','f','r','o') +#define FOURCC_moof GST_MAKE_FOURCC('m','o','o','f') +#define FOURCC_mvex GST_MAKE_FOURCC('m','v','e','x') +#define FOURCC_sdtp GST_MAKE_FOURCC('s','d','t','p') +#define FOURCC_tfhd GST_MAKE_FOURCC('t','f','h','d') +#define FOURCC_tfra GST_MAKE_FOURCC('t','f','r','a') +#define FOURCC_traf GST_MAKE_FOURCC('t','r','a','f') +#define FOURCC_trex GST_MAKE_FOURCC('t','r','e','x') +#define FOURCC_trun GST_MAKE_FOURCC('t','r','u','n') +#define FOURCC_ovc1 GST_MAKE_FOURCC('o','v','c','1') +#define FOURCC_owma GST_MAKE_FOURCC('o','w','m','a') + +G_END_DECLS + +#endif /* __GST_QTDEMUX_FOURCC_H__ */ diff --git a/gst/isomp4/qtdemux_lang.c b/gst/isomp4/qtdemux_lang.c new file mode 100644 index 0000000..9a46d90 --- /dev/null +++ b/gst/isomp4/qtdemux_lang.c @@ -0,0 +1,205 @@ +/* GStreamer Quicktime/ISO demuxer language utility functions + * Copyright (C) 2010 Tim-Philipp Müller + * + * 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 "qtdemux.h" +#include "qtdemux_lang.h" + +#include + +/* http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap4/qtff4.html */ + +static const gchar qt_lang_map[][4] = { + +/* 000 English + * 001 French + * 002 German + * 003 Italian + * 004 Dutch + * 005 Swedish + * 006 Spanish + * 007 Danish + * 008 Portuguese + * 009 Norwegian + */ + "eng", "fre", "deu", "ita", "nld", "swe", "spa", "dan", "por", "nor", + +/* 010 Hebrew + * 011 Japanese + * 012 Arabic + * 013 Finnish + * 014 Greek + * 015 Icelandic + * 016 Maltese + * 017 Turkish + * 018 Croatian + * 019 Traditional Chinese (ISO 639-2 can't express script differences, so zho) + */ + "heb", "jpn", "ara", "fin", "ell", "isl", "mlt", "tur", "hrv", "zho", + +/* 020 Urdu + * 021 Hindi + * 022 Thai + * 023 Korean + * 024 Lithuanian + * 025 Polish + * 026 Hungarian + * 027 Estonian + * 028 Latvian / Lettish + * 029 Lappish / Saamish (used code for Nothern Sami) + */ + "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav", "sme", + +/* 030 Faeroese + * 031 Farsi + * 032 Russian + * 033 Simplified Chinese (ISO 639-2 can't express script differences, so zho) + * 034 Flemish (no ISO 639-2 code, used Dutch code) + * 035 Irish + * 036 Albanian + * 037 Romanian + * 038 Czech + * 039 Slovak + */ + "fao", "fas", "rus", "zho", "nld", "gle", "sqi", "ron", "ces", "slk", + +/* 040 Slovenian + * 041 Yiddish + * 042 Serbian + * 043 Macedonian + * 044 Bulgarian + * 045 Ukrainian + * 046 Byelorussian + * 047 Uzbek + * 048 Kazakh + * 049 Azerbaijani + */ + "slv", "yid", "srp", "mkd", "bul", "ukr", "bel", "uzb", "kaz", "aze", + +/* 050 AzerbaijanAr (presumably script difference? used aze here) + * 051 Armenian + * 052 Georgian + * 053 Moldavian + * 054 Kirghiz + * 055 Tajiki + * 056 Turkmen + * 057 Mongolian + * 058 MongolianCyr (presumably script difference? used mon here) + * 059 Pashto + */ + + "aze", "hye", "kat", "mol", "kir", "tgk", "tuk", "mon", "mon", "pus", + + +/* 060 Kurdish + * 061 Kashmiri + * 062 Sindhi + * 063 Tibetan + * 064 Nepali + * 065 Sanskrit + * 066 Marathi + * 067 Bengali + * 068 Assamese + * 069 Gujarati + */ + "kur", "kas", "snd", "bod", "nep", "san", "mar", "ben", "asm", "guj", + +/* 070 Punjabi + * 071 Oriya + * 072 Malayalam + * 073 Kannada + * 074 Tamil + * 075 Telugu + * 076 Sinhalese + * 077 Burmese + * 078 Khmer + * 079 Lao + */ + "pan", "ori", "mal", "kan", "tam", "tel", "sin", "mya", "khm", "lao", + +/* 080 Vietnamese + * 081 Indonesian + * 082 Tagalog + * 083 MalayRoman + * 084 MalayArabic + * 085 Amharic + * 087 Galla (same as Oromo?) + * 087 Oromo + * 088 Somali + * 089 Swahili + */ + "vie", "ind", "tgl", "msa", "msa", "amh", "orm", "orm", "som", "swa", + +/* 090 Ruanda + * 091 Rundi + * 092 Chewa + * 093 Malagasy + * 094 Esperanto + * 095 --- + * 096 --- + * 097 --- + * 098 --- + * 099 --- + */ + "kin", "run", "nya", "mlg", "ep", "und", "und", "und", "und", "und", + +/* 100-109 --- + * 110-119 --- + */ + "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", + "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", + +/* 120-127 --- + * 128 Welsh + * 129 Basque + */ + "und", "und", "und", "und", "und", "und", "und", "und", "cym", "eus", + +/* 130 Catalan + * 131 Latin + * 132 Quechua + * 133 Guarani + * 134 Aymara + * 135 Tatar + * 136 Uighur + * 137 Dzongkha + * 138 JavaneseRom + */ + "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav" +}; + +/* map quicktime language code to ISO-639-2T id, returns "und" if unknown */ +void +qtdemux_lang_map_qt_code_to_iso (gchar id[4], guint16 qt_lang_code) +{ + const gchar *iso_code; + + g_assert (qt_lang_code < 0x800); + + if (qt_lang_code < G_N_ELEMENTS (qt_lang_map)) + iso_code = qt_lang_map[qt_lang_code]; + else + iso_code = "und"; + + GST_DEBUG ("mapped quicktime language code %u to ISO 639-2T code '%s'", + qt_lang_code, iso_code); + + memcpy (id, iso_code, 4); + + g_assert (id[3] == '\0'); +} diff --git a/gst/isomp4/qtdemux_lang.h b/gst/isomp4/qtdemux_lang.h new file mode 100644 index 0000000..a5fdec0 --- /dev/null +++ b/gst/isomp4/qtdemux_lang.h @@ -0,0 +1,31 @@ +/* GStreamer Quicktime/ISO demuxer language utility functions + * Copyright (C) 2010 Tim-Philipp Müller + * + * 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_QTDEMUX_LANG_H__ +#define __GST_QTDEMUX_LANG_H__ + +G_BEGIN_DECLS + +#include + +void qtdemux_lang_map_qt_code_to_iso (gchar id[4], guint16 qt_lang_code); + +G_END_DECLS + +#endif /* __GST_QTDEMUX_LANG_H__ */ diff --git a/gst/isomp4/qtdemux_types.c b/gst/isomp4/qtdemux_types.c new file mode 100644 index 0000000..db89e8c --- /dev/null +++ b/gst/isomp4/qtdemux_types.c @@ -0,0 +1,180 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 "qtdemux_types.h" +#include "qtdemux_dump.h" +#include "qtdemux_fourcc.h" + +static const QtNodeType qt_node_types[] = { + {FOURCC_moov, "movie", QT_FLAG_CONTAINER,}, + {FOURCC_mvhd, "movie header", 0, + qtdemux_dump_mvhd}, + {FOURCC_clip, "clipping", QT_FLAG_CONTAINER,}, + {FOURCC_trak, "track", QT_FLAG_CONTAINER,}, + {FOURCC_udta, "user data", QT_FLAG_CONTAINER,}, /* special container */ + {FOURCC_tkhd, "track header", 0, + qtdemux_dump_tkhd}, + {FOURCC_crgn, "clipping region", 0,}, + {FOURCC_edts, "edit", QT_FLAG_CONTAINER,}, + {FOURCC_elst, "edit list", 0, + qtdemux_dump_elst}, + {FOURCC_tref, "track reference", QT_FLAG_CONTAINER,}, + {FOURCC_imap, "track input map", QT_FLAG_CONTAINER,}, + {FOURCC___in, "track input", 0,}, /* special container */ + {FOURCC___ty, "input type", 0,}, + {FOURCC_mdia, "media", QT_FLAG_CONTAINER}, + {FOURCC_mdhd, "media header", 0, + qtdemux_dump_mdhd}, + {FOURCC_hdlr, "handler reference", 0, + qtdemux_dump_hdlr}, + {FOURCC_minf, "media information", QT_FLAG_CONTAINER}, + {FOURCC_vmhd, "video media information", 0, + qtdemux_dump_vmhd}, + {FOURCC_smhd, "sound media information", 0}, + {FOURCC_dinf, "data information", QT_FLAG_CONTAINER}, + {FOURCC_dref, "data reference", 0, + qtdemux_dump_dref}, + {FOURCC_stbl, "sample table", QT_FLAG_CONTAINER}, + {FOURCC_stsd, "sample description", 0, + qtdemux_dump_stsd}, + {FOURCC_stts, "time-to-sample", 0, + qtdemux_dump_stts}, + {FOURCC_stss, "sync sample", 0, + qtdemux_dump_stss}, + {FOURCC_stsc, "sample-to-chunk", 0, + qtdemux_dump_stsc}, + {FOURCC_stsz, "sample size", 0, + qtdemux_dump_stsz}, + {FOURCC_stco, "chunk offset", 0, + qtdemux_dump_stco}, + {FOURCC_co64, "64-bit chunk offset", 0, + qtdemux_dump_co64}, + {FOURCC_vide, "video media", 0}, + {FOURCC_hint, "hint", 0,}, + {FOURCC_mp4a, "mp4a", 0,}, + {FOURCC_mp4v, "mp4v", 0,}, + {FOURCC_mjp2, "mjp2", 0,}, + {FOURCC_mhdr, "mhdr", QT_FLAG_CONTAINER,}, + {FOURCC_jp2h, "jp2h", QT_FLAG_CONTAINER,}, + {FOURCC_colr, "colr", 0,}, + {FOURCC_fiel, "fiel", 0,}, + {FOURCC_jp2x, "jp2x", 0,}, + {FOURCC_alac, "alac", 0,}, + {FOURCC_wave, "wave", QT_FLAG_CONTAINER}, + {FOURCC_appl, "appl", QT_FLAG_CONTAINER}, + {FOURCC_esds, "esds", 0}, + {FOURCC_hnti, "hnti", QT_FLAG_CONTAINER}, + {FOURCC_rtp_, "rtp ", 0, qtdemux_dump_unknown}, + {FOURCC_sdp_, "sdp ", 0, qtdemux_dump_unknown}, + {FOURCC_meta, "meta", 0, qtdemux_dump_unknown}, + {FOURCC_ilst, "ilst", QT_FLAG_CONTAINER,}, + {FOURCC__nam, "Name", QT_FLAG_CONTAINER,}, + {FOURCC_titl, "Title", QT_FLAG_CONTAINER,}, + {FOURCC__ART, "Artist", QT_FLAG_CONTAINER,}, + {FOURCC_aART, "Album Artist", QT_FLAG_CONTAINER,}, + {FOURCC_auth, "Author", QT_FLAG_CONTAINER,}, + {FOURCC_perf, "Performer", QT_FLAG_CONTAINER,}, + {FOURCC__wrt, "Writer", QT_FLAG_CONTAINER,}, + {FOURCC__grp, "Grouping", QT_FLAG_CONTAINER,}, + {FOURCC__alb, "Album", QT_FLAG_CONTAINER,}, + {FOURCC_albm, "Album", QT_FLAG_CONTAINER,}, + {FOURCC__day, "Date", QT_FLAG_CONTAINER,}, + {FOURCC__cpy, "Copyright", QT_FLAG_CONTAINER,}, + {FOURCC__cmt, "Comment", QT_FLAG_CONTAINER,}, + {FOURCC__des, "Description", QT_FLAG_CONTAINER,}, + {FOURCC_desc, "Description", QT_FLAG_CONTAINER,}, + {FOURCC_dscp, "Description", QT_FLAG_CONTAINER,}, + {FOURCC__lyr, "Lyrics", QT_FLAG_CONTAINER,}, + {FOURCC__req, "Requirement", QT_FLAG_CONTAINER,}, + {FOURCC__enc, "Encoder", QT_FLAG_CONTAINER,}, + {FOURCC_gnre, "Genre", QT_FLAG_CONTAINER,}, + {FOURCC_trkn, "Track Number", QT_FLAG_CONTAINER,}, + {FOURCC_disc, "Disc Number", QT_FLAG_CONTAINER,}, + {FOURCC_disk, "Disc Number", QT_FLAG_CONTAINER,}, + {FOURCC_cprt, "Copyright", QT_FLAG_CONTAINER,}, + {FOURCC_cpil, "Compilation", QT_FLAG_CONTAINER,}, + {FOURCC_pgap, "Gapless", QT_FLAG_CONTAINER,}, + {FOURCC_pcst, "Podcast", QT_FLAG_CONTAINER,}, + {FOURCC_tmpo, "Tempo", QT_FLAG_CONTAINER,}, + {FOURCC_covr, "Cover", QT_FLAG_CONTAINER,}, + {FOURCC_sonm, "Sort Title", QT_FLAG_CONTAINER,}, + {FOURCC_soal, "Sort Album", QT_FLAG_CONTAINER,}, + {FOURCC_soar, "Sort Artist", QT_FLAG_CONTAINER,}, + {FOURCC_soaa, "Sort Album Artist", QT_FLAG_CONTAINER,}, + {FOURCC_soco, "Sort Composer", QT_FLAG_CONTAINER,}, + {FOURCC_sosn, "Sort TV Show", QT_FLAG_CONTAINER,}, + {FOURCC_tvsh, "TV Show", QT_FLAG_CONTAINER,}, + {FOURCC_tven, "TV Episode ID", QT_FLAG_CONTAINER,}, + {FOURCC_tvsn, "TV Season Number", QT_FLAG_CONTAINER,}, + {FOURCC_tves, "TV Episode Number", QT_FLAG_CONTAINER,}, + {FOURCC_keyw, "Keywords", QT_FLAG_CONTAINER,}, + {FOURCC_kywd, "Keywords", QT_FLAG_CONTAINER,}, + {FOURCC__too, "Encoder", QT_FLAG_CONTAINER,}, + {FOURCC_____, "----", QT_FLAG_CONTAINER,}, + {FOURCC_data, "data", 0, qtdemux_dump_unknown}, + {FOURCC_free, "free", 0,}, + {FOURCC_SVQ3, "SVQ3", 0,}, + {FOURCC__gen, "Custom Genre", QT_FLAG_CONTAINER,}, + {FOURCC_ctts, "Composition time to sample", 0, qtdemux_dump_ctts}, + {FOURCC_XiTh, "XiTh", 0}, + {FOURCC_XdxT, "XdxT", 0}, + {FOURCC_loci, "loci", 0}, + {FOURCC_clsf, "clsf", 0}, + {FOURCC_mfra, "movie fragment random access", + QT_FLAG_CONTAINER,}, + {FOURCC_tfra, "track fragment random access", 0, + qtdemux_dump_tfra}, + {FOURCC_mfro, "movie fragment random access offset", 0, + qtdemux_dump_mfro}, + {FOURCC_moof, "movie fragment", QT_FLAG_CONTAINER,}, + {FOURCC_mfhd, "movie fragment header", 0,}, + {FOURCC_traf, "track fragment", QT_FLAG_CONTAINER,}, + {FOURCC_tfhd, "track fragment header", 0, + qtdemux_dump_tfhd}, + {FOURCC_sdtp, "independent and disposable samples", 0, + qtdemux_dump_sdtp}, + {FOURCC_trun, "track fragment run", 0, qtdemux_dump_trun}, + {FOURCC_mdat, "moovie data", 0, qtdemux_dump_unknown}, + {FOURCC_trex, "moovie data", 0, qtdemux_dump_trex}, + {FOURCC_mvex, "mvex", QT_FLAG_CONTAINER,}, + {FOURCC_mehd, "movie extends header", 0, + qtdemux_dump_mehd}, + {FOURCC_ovc1, "ovc1", 0}, + {FOURCC_owma, "owma", 0}, + {0, "unknown", 0,}, +}; + +static const int n_qt_node_types = + sizeof (qt_node_types) / sizeof (qt_node_types[0]); + +const QtNodeType * +qtdemux_type_get (guint32 fourcc) +{ + int i; + + for (i = 0; i < n_qt_node_types; i++) { + if (G_UNLIKELY (qt_node_types[i].fourcc == fourcc)) + return qt_node_types + i; + } + + GST_WARNING ("unknown QuickTime node type %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + + return qt_node_types + n_qt_node_types - 1; +} diff --git a/gst/isomp4/qtdemux_types.h b/gst/isomp4/qtdemux_types.h new file mode 100644 index 0000000..a22efb8 --- /dev/null +++ b/gst/isomp4/qtdemux_types.h @@ -0,0 +1,82 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> STEricsson + * + * 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_QTDEMUX_TYPES_H__ +#define __GST_QTDEMUX_TYPES_H__ + +#include +#include + +#include "qtdemux.h" + +G_BEGIN_DECLS + +typedef gboolean (*QtDumpFunc) (GstQTDemux * qtdemux, GstByteReader * data, + int depth); + +typedef struct _QtNodeType QtNodeType; + +#define QT_UINT32(a) (GST_READ_UINT32_BE(a)) +#define QT_UINT24(a) (GST_READ_UINT32_BE(a) >> 8) +#define QT_UINT16(a) (GST_READ_UINT16_BE(a)) +#define QT_UINT8(a) (GST_READ_UINT8(a)) +#define QT_FP32(a) ((GST_READ_UINT32_BE(a))/65536.0) +#define QT_SFP32(a) (((gint)(GST_READ_UINT32_BE(a)))/65536.0) +#define QT_FP16(a) ((GST_READ_UINT16_BE(a))/256.0) +#define QT_FOURCC(a) (GST_READ_UINT32_LE(a)) +#define QT_UINT64(a) ((((guint64)QT_UINT32(a))<<32)|QT_UINT32(((guint8 *)a)+4)) + +typedef enum { + QT_FLAG_NONE = (0), + QT_FLAG_CONTAINER = (1 << 0) +} QtFlags; + +struct _QtNodeType { + guint32 fourcc; + const gchar *name; + QtFlags flags; + QtDumpFunc dump; +}; + +enum TfFlags +{ + TF_BASE_DATA_OFFSET = 0x000001, /* base-data-offset-present */ + TF_SAMPLE_DESCRIPTION_INDEX = 0x000002, /* sample-description-index-present */ + TF_DEFAULT_SAMPLE_DURATION = 0x000008, /* default-sample-duration-present */ + TF_DEFAULT_SAMPLE_SIZE = 0x000010, /* default-sample-size-present */ + TF_DEFAULT_SAMPLE_FLAGS = 0x000020, /* default-sample-flags-present */ + TF_DURATION_IS_EMPTY = 0x100000 /* duration-is-empty */ +}; + +enum TrFlags +{ + TR_DATA_OFFSET = 0x000001, /* data-offset-present */ + TR_FIRST_SAMPLE_FLAGS = 0x000004, /* first-sample-flags-present */ + TR_SAMPLE_DURATION = 0x000100, /* sample-duration-present */ + TR_SAMPLE_SIZE = 0x000200, /* sample-size-present */ + TR_SAMPLE_FLAGS = 0x000400, /* sample-flags-present */ + TR_COMPOSITION_TIME_OFFSETS = 0x000800 /* sample-composition-time-offsets-presents */ +}; + +const QtNodeType *qtdemux_type_get (guint32 fourcc); + +G_END_DECLS + +#endif /* __GST_QTDEMUX_TYPES_H__ */ diff --git a/gst/isomp4/qtpalette.h b/gst/isomp4/qtpalette.h new file mode 100644 index 0000000..80ece2a --- /dev/null +++ b/gst/isomp4/qtpalette.h @@ -0,0 +1,137 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_QTPALLETE_H__ +#define __GST_QTPALLETE_H__ + +#include + +G_BEGIN_DECLS + +static const guint32 ff_qt_default_palette_2[2] = { + 0xffffff, 0x000000 +}; + +static const guint32 ff_qt_default_palette_4[4] = { + 0x93655e, 0xffffff, 0xdfd0ab, 0x000000 +}; + +static const guint32 ff_qt_default_palette_16[16] = { + 0xfffbff, 0xefd9bb, 0xe8c9b1, 0x93655e, + 0xfcdee8, 0x9d8891, 0xffffff, 0xffffff, + 0xffffff, 0x474837, 0x7a5e55, 0xdfd0ab, + 0xfffbf9, 0xe8cac5, 0x8a7c77, 0x000000 +}; +static const guint32 ff_qt_default_palette_256[256] = { + 0xFFFFFF, 0xFFFFCC, 0xFFFF99, 0xFFFF66, 0xFFFF33, 0xFFFF00, + 0xFFCCFF, 0xFFCCCC, 0xFFCC99, 0xFFCC66, 0xFFCC33, 0xFFCC00, + 0xFF99FF, 0xFF99CC, 0xFF9999, 0xFF9966, 0xFF9933, 0xFF9900, + 0xFF66FF, 0xFF66CC, 0xFF6699, 0xFF6666, 0xFF6633, 0xFF6600, + 0xFF33FF, 0xFF33CC, 0xFF3399, 0xFF3366, 0xFF3333, 0xFF3300, + 0xFF00FF, 0xFF00CC, 0xFF0099, 0xFF0066, 0xFF0033, 0xFF0000, + 0xCCFFFF, 0xCCFFCC, 0xCCFF99, 0xCCFF66, 0xCCFF33, 0xCCFF00, + 0xCCCCFF, 0xCCCCCC, 0xCCCC99, 0xCCCC66, 0xCCCC33, 0xCCCC00, + 0xCC99FF, 0xCC99CC, 0xCC9999, 0xCC9966, 0xCC9933, 0xCC9900, + 0xCC66FF, 0xCC66CC, 0xCC6699, 0xCC6666, 0xCC6633, 0xCC6600, + 0xCC33FF, 0xCC33CC, 0xCC3399, 0xCC3366, 0xCC3333, 0xCC3300, + 0xCC00FF, 0xCC00CC, 0xCC0099, 0xCC0066, 0xCC0033, 0xCC0000, + 0x99FFFF, 0x99FFCC, 0x99FF99, 0x99FF66, 0x99FF33, 0x99FF00, + 0x99CCFF, 0x99CCCC, 0x99CC99, 0x99CC66, 0x99CC33, 0x99CC00, + 0x9999FF, 0x9999CC, 0x999999, 0x999966, 0x999933, 0x999900, + 0x9966FF, 0x9966CC, 0x996699, 0x996666, 0x996633, 0x996600, + 0x9933FF, 0x9933CC, 0x993399, 0x993366, 0x993333, 0x993300, + 0x9900FF, 0x9900CC, 0x990099, 0x990066, 0x990033, 0x990000, + 0x66FFFF, 0x66FFCC, 0x66FF99, 0x66FF66, 0x66FF33, 0x66FF00, + 0x66CCFF, 0x66CCCC, 0x66CC99, 0x66CC66, 0x66CC33, 0x66CC00, + 0x6699FF, 0x6699CC, 0x669999, 0x669966, 0x669933, 0x669900, + 0x6666FF, 0x6666CC, 0x666699, 0x666666, 0x666633, 0x666600, + 0x6633FF, 0x6633CC, 0x663399, 0x663366, 0x663333, 0x663300, + 0x6600FF, 0x6600CC, 0x660099, 0x660066, 0x660033, 0x660000, + 0x33FFFF, 0x33FFCC, 0x33FF99, 0x33FF66, 0x33FF33, 0x33FF00, + 0x33CCFF, 0x33CCCC, 0x33CC99, 0x33CC66, 0x33CC33, 0x33CC00, + 0x3399FF, 0x3399CC, 0x339999, 0x339966, 0x339933, 0x339900, + 0x3366FF, 0x3366CC, 0x336699, 0x336666, 0x336633, 0x336600, + 0x3333FF, 0x3333CC, 0x333399, 0x333366, 0x333333, 0x333300, + 0x3300FF, 0x3300CC, 0x330099, 0x330066, 0x330033, 0x330000, + 0x00FFFF, 0x00FFCC, 0x00FF99, 0x00FF66, 0x00FF33, 0x00FF00, + 0x00CCFF, 0x00CCCC, 0x00CC99, 0x00CC66, 0x00CC33, 0x00CC00, + 0x0099FF, 0x0099CC, 0x009999, 0x009966, 0x009933, 0x009900, + 0x0066FF, 0x0066CC, 0x006699, 0x006666, 0x006633, 0x006600, + 0x0033FF, 0x0033CC, 0x003399, 0x003366, 0x003333, 0x003300, + 0x0000FF, 0x0000CC, 0x000099, 0x000066, 0x000033, 0xEE0000, + 0xDD0000, 0xBB0000, 0xAA0000, 0x880000, 0x770000, 0x550000, + 0x440000, 0x220000, 0x110000, 0x00EE00, 0x00DD00, 0x00BB00, + 0x00AA00, 0x008800, 0x007700, 0x005500, 0x004400, 0x002200, + 0x001100, 0x0000EE, 0x0000DD, 0x0000BB, 0x0000AA, 0x000088, + 0x000077, 0x000055, 0x000044, 0x000022, 0x000011, 0xEEEEEE, + 0xDDDDDD, 0xBBBBBB, 0xAAAAAA, 0x888888, 0x777777, 0x555555, + 0x444444, 0x222222, 0x111111, 0x000000 +}; + +static const guint32 ff_qt_grayscale_palette_16[16] = { + 0xffffff, 0xeeeeee, 0xdddddd, 0xcccccc, + 0xbbbbbb, 0xaaaaaa, 0x999999, 0x888888, + 0x777777, 0x666666, 0x555555, 0x444444, + 0x333333, 0x222222, 0x111111, 0x000000 +}; + +static const guint32 ff_qt_grayscale_palette_256[256] = { + 0xffffff, 0xfefefe, 0xfdfdfd, 0xfcfcfc, 0xfbfbfb, 0xfafafa, 0xf9f9f9, + 0xf8f8f8, 0xf7f7f7, 0xf6f6f6, 0xf5f5f5, 0xf4f4f4, 0xf3f3f3, 0xf2f2f2, + 0xf1f1f1, 0xf0f0f0, 0xefefef, 0xeeeeee, 0xededed, 0xececec, 0xebebeb, + 0xeaeaea, 0xe9e9e9, 0xe8e8e8, 0xe7e7e7, 0xe6e6e6, 0xe5e5e5, 0xe4e4e4, + 0xe3e3e3, 0xe2e2e2, 0xe1e1e1, 0xe0e0e0, 0xdfdfdf, 0xdedede, 0xdddddd, + 0xdcdcdc, 0xdbdbdb, 0xdadada, 0xd9d9d9, 0xd8d8d8, 0xd7d7d7, 0xd6d6d6, + 0xd5d5d5, 0xd4d4d4, 0xd3d3d3, 0xd2d2d2, 0xd1d1d1, 0xd0d0d0, 0xcfcfcf, + 0xcecece, 0xcdcdcd, 0xcccccc, 0xcbcbcb, 0xcacaca, 0xc9c9c9, 0xc8c8c8, + 0xc7c7c7, 0xc6c6c6, 0xc5c5c5, 0xc4c4c4, 0xc3c3c3, 0xc2c2c2, 0xc1c1c1, + 0xc0c0c0, 0xbfbfbf, 0xbebebe, 0xbdbdbd, 0xbcbcbc, 0xbbbbbb, 0xbababa, + 0xb9b9b9, 0xb8b8b8, 0xb7b7b7, 0xb6b6b6, 0xb5b5b5, 0xb4b4b4, 0xb3b3b3, + 0xb2b2b2, 0xb1b1b1, 0xb0b0b0, 0xafafaf, 0xaeaeae, 0xadadad, 0xacacac, + 0xababab, 0xaaaaaa, 0xa9a9a9, 0xa8a8a8, 0xa7a7a7, 0xa6a6a6, 0xa5a5a5, + 0xa4a4a4, 0xa3a3a3, 0xa2a2a2, 0xa1a1a1, 0xa0a0a0, 0x9f9f9f, 0x9e9e9e, + 0x9d9d9d, 0x9c9c9c, 0x9b9b9b, 0x9a9a9a, 0x999999, 0x989898, 0x979797, + 0x969696, 0x959595, 0x949494, 0x939393, 0x929292, 0x919191, 0x909090, + 0x8f8f8f, 0x8e8e8e, 0x8d8d8d, 0x8c8c8c, 0x8b8b8b, 0x8a8a8a, 0x898989, + 0x888888, 0x878787, 0x868686, 0x858585, 0x848484, 0x838383, 0x828282, + 0x818181, 0x808080, 0x7f7f7f, 0x7e7e7e, 0x7d7d7d, 0x7c7c7c, 0x7b7b7b, + 0x7a7a7a, 0x797979, 0x787878, 0x777777, 0x767676, 0x757575, 0x747474, + 0x737373, 0x727272, 0x717171, 0x707070, 0x6f6f6f, 0x6e6e6e, 0x6d6d6d, + 0x6c6c6c, 0x6b6b6b, 0x6a6a6a, 0x696969, 0x686868, 0x676767, 0x666666, + 0x656565, 0x646464, 0x636363, 0x626262, 0x616161, 0x606060, 0x5f5f5f, + 0x5e5e5e, 0x5d5d5d, 0x5c5c5c, 0x5b5b5b, 0x5a5a5a, 0x595959, 0x585858, + 0x575757, 0x565656, 0x555555, 0x545454, 0x535353, 0x525252, 0x515151, + 0x505050, 0x4f4f4f, 0x4e4e4e, 0x4d4d4d, 0x4c4c4c, 0x4b4b4b, 0x4a4a4a, + 0x494949, 0x484848, 0x474747, 0x464646, 0x454545, 0x444444, 0x434343, + 0x424242, 0x414141, 0x404040, 0x3f3f3f, 0x3e3e3e, 0x3d3d3d, 0x3c3c3c, + 0x3b3b3b, 0x3a3a3a, 0x393939, 0x383838, 0x373737, 0x363636, 0x353535, + 0x343434, 0x333333, 0x323232, 0x313131, 0x303030, 0x2f2f2f, 0x2e2e2e, + 0x2d2d2d, 0x2c2c2c, 0x2b2b2b, 0x2a2a2a, 0x292929, 0x282828, 0x272727, + 0x262626, 0x252525, 0x242424, 0x232323, 0x222222, 0x212121, 0x202020, + 0x1f1f1f, 0x1e1e1e, 0x1d1d1d, 0x1c1c1c, 0x1b1b1b, 0x1a1a1a, 0x191919, + 0x181818, 0x171717, 0x161616, 0x151515, 0x141414, 0x131313, 0x121212, + 0x111111, 0x101010, 0x0f0f0f, 0x0e0e0e, 0x0d0d0d, 0x0c0c0c, 0x0b0b0b, + 0x0a0a0a, 0x090909, 0x080808, 0x070707, 0x060606, 0x050505, 0x040404, + 0x030303, 0x020202, 0x010101, 0x000000 +}; + +G_END_DECLS + +#endif /* __GST_QTPALETTE_H__ */ diff --git a/gst/law/Makefile.am b/gst/law/Makefile.am new file mode 100644 index 0000000..16bff25 --- /dev/null +++ b/gst/law/Makefile.am @@ -0,0 +1,40 @@ +plugin_LTLIBRARIES = libgstalaw.la libgstmulaw.la + +libgstalaw_la_SOURCES = alaw-encode.c alaw-decode.c alaw.c +libgstalaw_la_CFLAGS = $(GST_CFLAGS) +libgstalaw_la_LIBADD = $(GST_LIBS) +libgstalaw_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstalaw_la_LIBTOOLFLAGS = --tag=disable-static + +libgstmulaw_la_SOURCES = mulaw-encode.c mulaw-conversion.c mulaw-decode.c mulaw.c +libgstmulaw_la_CFLAGS = $(GST_CFLAGS) +libgstmulaw_la_LIBADD = $(GST_LIBS) +libgstmulaw_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmulaw_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = mulaw-conversion.h alaw-encode.h alaw-decode.h mulaw-encode.h mulaw-decode.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstalaw -:SHARED libgstalaw \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstalaw_la_SOURCES) \ + $(nodist_libgstalaw_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstalaw_la_CFLAGS) \ + -:LDFLAGS $(libgstalaw_la_LDFLAGS) \ + $(libgstalaw_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + -:SHARED libgstmulaw \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmulaw_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmulaw_la_CFLAGS) \ + -:LDFLAGS $(libgstmulaw_la_LDFLAGS) \ + $(libgstmulaw_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/law/Makefile.in b/gst/law/Makefile.in new file mode 100644 index 0000000..dff15f8 --- /dev/null +++ b/gst/law/Makefile.in @@ -0,0 +1,894 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/law +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstalaw_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libgstalaw_la_OBJECTS = libgstalaw_la-alaw-encode.lo \ + libgstalaw_la-alaw-decode.lo libgstalaw_la-alaw.lo +libgstalaw_la_OBJECTS = $(am_libgstalaw_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstalaw_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstalaw_la_CFLAGS) $(CFLAGS) \ + $(libgstalaw_la_LDFLAGS) $(LDFLAGS) -o $@ +libgstmulaw_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libgstmulaw_la_OBJECTS = libgstmulaw_la-mulaw-encode.lo \ + libgstmulaw_la-mulaw-conversion.lo \ + libgstmulaw_la-mulaw-decode.lo libgstmulaw_la-mulaw.lo +libgstmulaw_la_OBJECTS = $(am_libgstmulaw_la_OBJECTS) +libgstmulaw_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstmulaw_la_CFLAGS) $(CFLAGS) \ + $(libgstmulaw_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstalaw_la_SOURCES) $(libgstmulaw_la_SOURCES) +DIST_SOURCES = $(libgstalaw_la_SOURCES) $(libgstmulaw_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstalaw.la libgstmulaw.la +libgstalaw_la_SOURCES = alaw-encode.c alaw-decode.c alaw.c +libgstalaw_la_CFLAGS = $(GST_CFLAGS) +libgstalaw_la_LIBADD = $(GST_LIBS) +libgstalaw_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstalaw_la_LIBTOOLFLAGS = --tag=disable-static +libgstmulaw_la_SOURCES = mulaw-encode.c mulaw-conversion.c mulaw-decode.c mulaw.c +libgstmulaw_la_CFLAGS = $(GST_CFLAGS) +libgstmulaw_la_LIBADD = $(GST_LIBS) +libgstmulaw_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmulaw_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = mulaw-conversion.h alaw-encode.h alaw-decode.h mulaw-encode.h mulaw-decode.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/law/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/law/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstalaw.la: $(libgstalaw_la_OBJECTS) $(libgstalaw_la_DEPENDENCIES) $(EXTRA_libgstalaw_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstalaw_la_LINK) -rpath $(plugindir) $(libgstalaw_la_OBJECTS) $(libgstalaw_la_LIBADD) $(LIBS) +libgstmulaw.la: $(libgstmulaw_la_OBJECTS) $(libgstmulaw_la_DEPENDENCIES) $(EXTRA_libgstmulaw_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstmulaw_la_LINK) -rpath $(plugindir) $(libgstmulaw_la_OBJECTS) $(libgstmulaw_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalaw_la-alaw-decode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalaw_la-alaw-encode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalaw_la-alaw.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmulaw_la-mulaw-conversion.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmulaw_la-mulaw-decode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmulaw_la-mulaw-encode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmulaw_la-mulaw.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstalaw_la-alaw-encode.lo: alaw-encode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -MT libgstalaw_la-alaw-encode.lo -MD -MP -MF $(DEPDIR)/libgstalaw_la-alaw-encode.Tpo -c -o libgstalaw_la-alaw-encode.lo `test -f 'alaw-encode.c' || echo '$(srcdir)/'`alaw-encode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalaw_la-alaw-encode.Tpo $(DEPDIR)/libgstalaw_la-alaw-encode.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alaw-encode.c' object='libgstalaw_la-alaw-encode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -c -o libgstalaw_la-alaw-encode.lo `test -f 'alaw-encode.c' || echo '$(srcdir)/'`alaw-encode.c + +libgstalaw_la-alaw-decode.lo: alaw-decode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -MT libgstalaw_la-alaw-decode.lo -MD -MP -MF $(DEPDIR)/libgstalaw_la-alaw-decode.Tpo -c -o libgstalaw_la-alaw-decode.lo `test -f 'alaw-decode.c' || echo '$(srcdir)/'`alaw-decode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalaw_la-alaw-decode.Tpo $(DEPDIR)/libgstalaw_la-alaw-decode.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alaw-decode.c' object='libgstalaw_la-alaw-decode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -c -o libgstalaw_la-alaw-decode.lo `test -f 'alaw-decode.c' || echo '$(srcdir)/'`alaw-decode.c + +libgstalaw_la-alaw.lo: alaw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -MT libgstalaw_la-alaw.lo -MD -MP -MF $(DEPDIR)/libgstalaw_la-alaw.Tpo -c -o libgstalaw_la-alaw.lo `test -f 'alaw.c' || echo '$(srcdir)/'`alaw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalaw_la-alaw.Tpo $(DEPDIR)/libgstalaw_la-alaw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alaw.c' object='libgstalaw_la-alaw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -c -o libgstalaw_la-alaw.lo `test -f 'alaw.c' || echo '$(srcdir)/'`alaw.c + +libgstmulaw_la-mulaw-encode.lo: mulaw-encode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -MT libgstmulaw_la-mulaw-encode.lo -MD -MP -MF $(DEPDIR)/libgstmulaw_la-mulaw-encode.Tpo -c -o libgstmulaw_la-mulaw-encode.lo `test -f 'mulaw-encode.c' || echo '$(srcdir)/'`mulaw-encode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmulaw_la-mulaw-encode.Tpo $(DEPDIR)/libgstmulaw_la-mulaw-encode.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mulaw-encode.c' object='libgstmulaw_la-mulaw-encode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -c -o libgstmulaw_la-mulaw-encode.lo `test -f 'mulaw-encode.c' || echo '$(srcdir)/'`mulaw-encode.c + +libgstmulaw_la-mulaw-conversion.lo: mulaw-conversion.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -MT libgstmulaw_la-mulaw-conversion.lo -MD -MP -MF $(DEPDIR)/libgstmulaw_la-mulaw-conversion.Tpo -c -o libgstmulaw_la-mulaw-conversion.lo `test -f 'mulaw-conversion.c' || echo '$(srcdir)/'`mulaw-conversion.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmulaw_la-mulaw-conversion.Tpo $(DEPDIR)/libgstmulaw_la-mulaw-conversion.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mulaw-conversion.c' object='libgstmulaw_la-mulaw-conversion.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -c -o libgstmulaw_la-mulaw-conversion.lo `test -f 'mulaw-conversion.c' || echo '$(srcdir)/'`mulaw-conversion.c + +libgstmulaw_la-mulaw-decode.lo: mulaw-decode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -MT libgstmulaw_la-mulaw-decode.lo -MD -MP -MF $(DEPDIR)/libgstmulaw_la-mulaw-decode.Tpo -c -o libgstmulaw_la-mulaw-decode.lo `test -f 'mulaw-decode.c' || echo '$(srcdir)/'`mulaw-decode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmulaw_la-mulaw-decode.Tpo $(DEPDIR)/libgstmulaw_la-mulaw-decode.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mulaw-decode.c' object='libgstmulaw_la-mulaw-decode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -c -o libgstmulaw_la-mulaw-decode.lo `test -f 'mulaw-decode.c' || echo '$(srcdir)/'`mulaw-decode.c + +libgstmulaw_la-mulaw.lo: mulaw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -MT libgstmulaw_la-mulaw.lo -MD -MP -MF $(DEPDIR)/libgstmulaw_la-mulaw.Tpo -c -o libgstmulaw_la-mulaw.lo `test -f 'mulaw.c' || echo '$(srcdir)/'`mulaw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmulaw_la-mulaw.Tpo $(DEPDIR)/libgstmulaw_la-mulaw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mulaw.c' object='libgstmulaw_la-mulaw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -c -o libgstmulaw_la-mulaw.lo `test -f 'mulaw.c' || echo '$(srcdir)/'`mulaw.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstalaw -:SHARED libgstalaw \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstalaw_la_SOURCES) \ + $(nodist_libgstalaw_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstalaw_la_CFLAGS) \ + -:LDFLAGS $(libgstalaw_la_LDFLAGS) \ + $(libgstalaw_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + -:SHARED libgstmulaw \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmulaw_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmulaw_la_CFLAGS) \ + -:LDFLAGS $(libgstmulaw_la_LDFLAGS) \ + $(libgstmulaw_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/law/alaw-decode.c b/gst/law/alaw-decode.c new file mode 100644 index 0000000..2fa6a5d --- /dev/null +++ b/gst/law/alaw-decode.c @@ -0,0 +1,344 @@ +/* GStreamer A-Law to PCM conversion + * Copyright (C) 2000 by Abramo Bagnara + * + * 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.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * 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-alawdec + * + * This element decodes alaw audio. Alaw coding is also known as G.711. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "alaw-decode.h" + +extern GstStaticPadTemplate alaw_dec_src_factory; +extern GstStaticPadTemplate alaw_dec_sink_factory; + +GST_DEBUG_CATEGORY_STATIC (alaw_dec_debug); +#define GST_CAT_DEFAULT alaw_dec_debug + +static GstStateChangeReturn +gst_alaw_dec_change_state (GstElement * element, GstStateChange transition); +static GstFlowReturn gst_alaw_dec_chain (GstPad * pad, GstBuffer * buffer); + +GST_BOILERPLATE (GstALawDec, gst_alaw_dec, GstElement, GST_TYPE_ELEMENT); + +/* some day we might have defines in gstconfig.h that tell us about the + * desired cpu/memory/binary size trade-offs */ +#define GST_ALAW_DEC_USE_TABLE + +#ifdef GST_ALAW_DEC_USE_TABLE + +static const gint alaw_to_s16_table[256] = { + -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, + -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, + -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, + -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, + -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, + -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, + -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472, + -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, + -344, -328, -376, -360, -280, -264, -312, -296, + -472, -456, -504, -488, -408, -392, -440, -424, + -88, -72, -120, -104, -24, -8, -56, -40, + -216, -200, -248, -232, -152, -136, -184, -168, + -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, + -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, + -688, -656, -752, -720, -560, -528, -624, -592, + -944, -912, -1008, -976, -816, -784, -880, -848, + 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, + 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, + 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, + 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, + 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, + 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, + 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, + 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, + 344, 328, 376, 360, 280, 264, 312, 296, + 472, 456, 504, 488, 408, 392, 440, 424, + 88, 72, 120, 104, 24, 8, 56, 40, + 216, 200, 248, 232, 152, 136, 184, 168, + 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, + 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, + 688, 656, 752, 720, 560, 528, 624, 592, + 944, 912, 1008, 976, 816, 784, 880, 848 +}; + +static inline gint +alaw_to_s16 (guint8 a_val) +{ + return alaw_to_s16_table[a_val]; +} + +#else /* GST_ALAW_DEC_USE_TABLE */ + +static inline gint +alaw_to_s16 (guint8 a_val) +{ + gint t; + gint seg; + + a_val ^= 0x55; + t = a_val & 0x7f; + if (t < 16) + t = (t << 4) + 8; + else { + seg = (t >> 4) & 0x07; + t = ((t & 0x0f) << 4) + 0x108; + t <<= seg - 1; + } + return ((a_val & 0x80) ? t : -t); +} + +#endif /* GST_ALAW_DEC_USE_TABLE */ + +static gboolean +gst_alaw_dec_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstALawDec *alawdec; + GstStructure *structure; + int rate, channels; + gboolean ret; + GstCaps *outcaps; + + alawdec = GST_ALAW_DEC (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + + ret = gst_structure_get_int (structure, "rate", &rate); + ret &= gst_structure_get_int (structure, "channels", &channels); + if (!ret) + return FALSE; + + outcaps = gst_caps_new_simple ("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); + + ret = gst_pad_set_caps (alawdec->srcpad, outcaps); + gst_caps_unref (outcaps); + + if (ret) { + GST_DEBUG_OBJECT (alawdec, "rate=%d, channels=%d", rate, channels); + alawdec->rate = rate; + alawdec->channels = channels; + } + return ret; +} + +static GstCaps * +gst_alaw_dec_getcaps (GstPad * pad) +{ + GstALawDec *alawdec; + GstPad *otherpad; + GstCaps *othercaps, *result; + const GstCaps *templ; + const gchar *name; + gint i; + + alawdec = GST_ALAW_DEC (GST_PAD_PARENT (pad)); + + /* figure out the name of the caps we are going to return */ + if (pad == alawdec->srcpad) { + name = "audio/x-raw-int"; + otherpad = alawdec->sinkpad; + } else { + name = "audio/x-alaw"; + otherpad = alawdec->srcpad; + } + /* get caps from the peer, this can return NULL when there is no peer */ + othercaps = gst_pad_peer_get_caps (otherpad); + + /* get the template caps to make sure we return something acceptable */ + templ = gst_pad_get_pad_template_caps (pad); + + if (othercaps) { + /* there was a peer */ + othercaps = gst_caps_make_writable (othercaps); + + /* go through the caps and remove the fields we don't want */ + for (i = 0; i < gst_caps_get_size (othercaps); i++) { + GstStructure *structure; + + structure = gst_caps_get_structure (othercaps, i); + + /* adjust the name */ + gst_structure_set_name (structure, name); + + if (pad == alawdec->sinkpad) { + /* remove the fields we don't want */ + gst_structure_remove_fields (structure, "width", "depth", "endianness", + "signed", NULL); + } else { + /* add fixed fields */ + gst_structure_set (structure, "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + } + } + /* filter against the allowed caps of the pad to return our result */ + result = gst_caps_intersect (othercaps, templ); + gst_caps_unref (othercaps); + } else { + /* there was no peer, return the template caps */ + result = gst_caps_copy (templ); + } + + return result; +} + +static void +gst_alaw_dec_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &alaw_dec_src_factory); + gst_element_class_add_static_pad_template (element_class, + &alaw_dec_sink_factory); + + gst_element_class_set_details_simple (element_class, "A Law audio decoder", + "Codec/Decoder/Audio", "Convert 8bit A law to 16bit PCM", + "Zaheer Abbas Merali "); + + GST_DEBUG_CATEGORY_INIT (alaw_dec_debug, "alawdec", 0, "A Law audio decoder"); +} + +static void +gst_alaw_dec_class_init (GstALawDecClass * klass) +{ + GstElementClass *element_class = (GstElementClass *) klass; + + element_class->change_state = GST_DEBUG_FUNCPTR (gst_alaw_dec_change_state); +} + +static void +gst_alaw_dec_init (GstALawDec * alawdec, GstALawDecClass * klass) +{ + alawdec->sinkpad = + gst_pad_new_from_static_template (&alaw_dec_sink_factory, "sink"); + gst_pad_set_setcaps_function (alawdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_alaw_dec_sink_setcaps)); + gst_pad_set_getcaps_function (alawdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_alaw_dec_getcaps)); + gst_pad_set_chain_function (alawdec->sinkpad, + GST_DEBUG_FUNCPTR (gst_alaw_dec_chain)); + gst_element_add_pad (GST_ELEMENT (alawdec), alawdec->sinkpad); + + alawdec->srcpad = + gst_pad_new_from_static_template (&alaw_dec_src_factory, "src"); + gst_pad_use_fixed_caps (alawdec->srcpad); + gst_pad_set_getcaps_function (alawdec->srcpad, + GST_DEBUG_FUNCPTR (gst_alaw_dec_getcaps)); + gst_element_add_pad (GST_ELEMENT (alawdec), alawdec->srcpad); +} + +static GstFlowReturn +gst_alaw_dec_chain (GstPad * pad, GstBuffer * buffer) +{ + GstALawDec *alawdec; + gint16 *linear_data; + guint8 *alaw_data; + guint alaw_size; + GstBuffer *outbuf; + gint i; + GstFlowReturn ret; + + alawdec = GST_ALAW_DEC (GST_PAD_PARENT (pad)); + + if (G_UNLIKELY (alawdec->rate == 0)) + goto not_negotiated; + + GST_LOG_OBJECT (alawdec, "buffer with ts=%" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); + + alaw_data = GST_BUFFER_DATA (buffer); + alaw_size = GST_BUFFER_SIZE (buffer); + + ret = + gst_pad_alloc_buffer_and_set_caps (alawdec->srcpad, + GST_BUFFER_OFFSET_NONE, alaw_size * 2, GST_PAD_CAPS (alawdec->srcpad), + &outbuf); + if (ret != GST_FLOW_OK) + goto alloc_failed; + + linear_data = (gint16 *) GST_BUFFER_DATA (outbuf); + + /* copy discont flag */ + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); + GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (alawdec->srcpad)); + + for (i = 0; i < alaw_size; i++) { + linear_data[i] = alaw_to_s16 (alaw_data[i]); + } + gst_buffer_unref (buffer); + + ret = gst_pad_push (alawdec->srcpad, outbuf); + + return ret; + +not_negotiated: + { + gst_buffer_unref (buffer); + GST_WARNING_OBJECT (alawdec, "no input format set: not-negotiated"); + return GST_FLOW_NOT_NEGOTIATED; + } +alloc_failed: + { + gst_buffer_unref (buffer); + GST_DEBUG_OBJECT (alawdec, "pad alloc failed, flow: %s", + gst_flow_get_name (ret)); + return ret; + } +} + +static GstStateChangeReturn +gst_alaw_dec_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstALawDec *dec = GST_ALAW_DEC (element); + + switch (transition) { + 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_PAUSED_TO_READY: + dec->rate = 0; + dec->channels = 0; + break; + default: + break; + } + + return ret; +} diff --git a/gst/law/alaw-decode.h b/gst/law/alaw-decode.h new file mode 100644 index 0000000..55433cc --- /dev/null +++ b/gst/law/alaw-decode.h @@ -0,0 +1,58 @@ +/* GStreamer A-Law to PCM conversion + * Copyright (C) 2000 by Abramo Bagnara + * + * 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_ALAW_DECODE_H__ +#define __GST_ALAW_DECODE_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ALAW_DEC \ + (gst_alaw_dec_get_type()) +#define GST_ALAW_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALAW_DEC,GstALawDec)) +#define GST_ALAW_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALAW_DEC,GstALawDecClass)) +#define GST_IS_ALAW_DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALAW_DEC)) +#define GST_IS_ALAW_DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALAW_DEC)) + +typedef struct _GstALawDec GstALawDec; +typedef struct _GstALawDecClass GstALawDecClass; + +struct _GstALawDec { + GstElement element; + + GstPad *sinkpad,*srcpad; + gint rate; + gint channels; +}; + +struct _GstALawDecClass { + GstElementClass parent_class; +}; + +GType gst_alaw_dec_get_type(void); + +G_END_DECLS + +#endif /* __GST_ALAW_DECODE_H__ */ + diff --git a/gst/law/alaw-encode.c b/gst/law/alaw-encode.c new file mode 100644 index 0000000..b12c23e --- /dev/null +++ b/gst/law/alaw-encode.c @@ -0,0 +1,524 @@ +/* GStreamer PCM to A-Law conversion + * Copyright (C) 2000 by Abramo Bagnara + * + * 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.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * 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-alawenc + * + * This element encode alaw audio. Alaw coding is also known as G.711. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "alaw-encode.h" + +GST_DEBUG_CATEGORY_STATIC (alaw_enc_debug); +#define GST_CAT_DEFAULT alaw_enc_debug + +extern GstStaticPadTemplate alaw_enc_src_factory; +extern GstStaticPadTemplate alaw_enc_sink_factory; + +static GstFlowReturn gst_alaw_enc_chain (GstPad * pad, GstBuffer * buffer); + +GST_BOILERPLATE (GstALawEnc, gst_alaw_enc, GstElement, GST_TYPE_ELEMENT); + +/* some day we might have defines in gstconfig.h that tell us about the + * desired cpu/memory/binary size trade-offs */ +#define GST_ALAW_ENC_USE_TABLE + +#ifdef GST_ALAW_ENC_USE_TABLE + +static const guint8 alaw_encode[2048 + 1] = { + 0xd5, 0xd4, 0xd7, 0xd6, 0xd1, 0xd0, 0xd3, 0xd2, 0xdd, 0xdc, 0xdf, 0xde, + 0xd9, 0xd8, 0xdb, 0xda, 0xc5, 0xc4, 0xc7, 0xc6, 0xc1, 0xc0, 0xc3, 0xc2, + 0xcd, 0xcc, 0xcf, 0xce, 0xc9, 0xc8, 0xcb, 0xca, 0xf5, 0xf5, 0xf4, 0xf4, + 0xf7, 0xf7, 0xf6, 0xf6, 0xf1, 0xf1, 0xf0, 0xf0, 0xf3, 0xf3, 0xf2, 0xf2, + 0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xf9, 0xf8, 0xf8, + 0xfb, 0xfb, 0xfa, 0xfa, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a +}; + +static inline guint8 +s16_to_alaw (gint16 pcm_val) +{ + if (pcm_val >= 0) + return alaw_encode[pcm_val / 16]; + else + return (0x7F & alaw_encode[pcm_val / -16]); +} + +#else /* GST_ALAW_ENC_USE_TABLE */ + +/* + * s16_to_alaw() - Convert a 16-bit linear PCM value to 8-bit A-law + * + * s16_to_alaw() accepts an 16-bit integer and encodes it as A-law data. + * + * Linear Input Code Compressed Code + * ------------------------ --------------- + * 0000000wxyza 000wxyz + * 0000001wxyza 001wxyz + * 000001wxyzab 010wxyz + * 00001wxyzabc 011wxyz + * 0001wxyzabcd 100wxyz + * 001wxyzabcde 101wxyz + * 01wxyzabcdef 110wxyz + * 1wxyzabcdefg 111wxyz + * + * For further information see John C. Bellamy's Digital Telephony, 1982, + * John Wiley & Sons, pps 98-111 and 472-476. + */ + +static inline gint +val_seg (gint val) +{ + gint r = 1; + + val >>= 8; + if (val & 0xf0) { + val >>= 4; + r += 4; + } + if (val & 0x0c) { + val >>= 2; + r += 2; + } + if (val & 0x02) + r += 1; + return r; +} + +static inline guint8 +s16_to_alaw (gint pcm_val) +{ + gint seg; + guint8 mask; + guint8 aval; + + if (pcm_val >= 0) { + mask = 0xD5; + } else { + mask = 0x55; + pcm_val = -pcm_val; + if (pcm_val > 0x7fff) + pcm_val = 0x7fff; + } + + if (pcm_val < 256) + aval = pcm_val >> 4; + else { + /* Convert the scaled magnitude to segment number. */ + seg = val_seg (pcm_val); + aval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f); + } + return aval ^ mask; +} + +#endif /* GST_ALAW_ENC_USE_TABLE */ + +static GstCaps * +gst_alaw_enc_getcaps (GstPad * pad) +{ + GstALawEnc *alawenc; + GstPad *otherpad; + GstCaps *othercaps, *result; + const GstCaps *templ; + const gchar *name; + gint i; + + alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad)); + + /* figure out the name of the caps we are going to return */ + if (pad == alawenc->srcpad) { + name = "audio/x-alaw"; + otherpad = alawenc->sinkpad; + } else { + name = "audio/x-raw-int"; + otherpad = alawenc->srcpad; + } + /* get caps from the peer, this can return NULL when there is no peer */ + othercaps = gst_pad_peer_get_caps (otherpad); + + /* get the template caps to make sure we return something acceptable */ + templ = gst_pad_get_pad_template_caps (pad); + + if (othercaps) { + /* there was a peer */ + othercaps = gst_caps_make_writable (othercaps); + + /* go through the caps and remove the fields we don't want */ + for (i = 0; i < gst_caps_get_size (othercaps); i++) { + GstStructure *structure; + + structure = gst_caps_get_structure (othercaps, i); + + /* adjust the name */ + gst_structure_set_name (structure, name); + + if (pad == alawenc->srcpad) { + /* remove the fields we don't want */ + gst_structure_remove_fields (structure, "width", "depth", "endianness", + "signed", NULL); + } else { + /* add fixed fields */ + gst_structure_set (structure, "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + } + } + /* filter against the allowed caps of the pad to return our result */ + result = gst_caps_intersect (othercaps, templ); + gst_caps_unref (othercaps); + } else { + /* there was no peer, return the template caps */ + result = gst_caps_copy (templ); + } + + return result; +} + +static gboolean +gst_alaw_enc_setcaps (GstPad * pad, GstCaps * caps) +{ + GstALawEnc *alawenc; + GstPad *otherpad; + GstStructure *structure; + gboolean ret; + GstCaps *base_caps; + + alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + gst_structure_get_int (structure, "channels", &alawenc->channels); + gst_structure_get_int (structure, "rate", &alawenc->rate); + + if (pad == alawenc->sinkpad) { + otherpad = alawenc->srcpad; + } else { + otherpad = alawenc->sinkpad; + } + + base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad)); + structure = gst_caps_get_structure (base_caps, 0); + gst_structure_set (structure, "rate", G_TYPE_INT, alawenc->rate, NULL); + gst_structure_set (structure, "channels", G_TYPE_INT, alawenc->channels, + NULL); + + GST_DEBUG_OBJECT (alawenc, "rate=%d, channels=%d", alawenc->rate, + alawenc->channels); + + ret = gst_pad_set_caps (otherpad, base_caps); + + gst_caps_unref (base_caps); + + return ret; +} + +static void +gst_alaw_enc_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &alaw_enc_src_factory); + gst_element_class_add_static_pad_template (element_class, + &alaw_enc_sink_factory); + + gst_element_class_set_details_simple (element_class, + "A Law audio encoder", "Codec/Encoder/Audio", + "Convert 16bit PCM to 8bit A law", + "Zaheer Abbas Merali "); + + GST_DEBUG_CATEGORY_INIT (alaw_enc_debug, "alawenc", 0, "A Law audio encoder"); +} + +static void +gst_alaw_enc_class_init (GstALawEncClass * klass) +{ + /* nothing to do here for now */ +} + +static void +gst_alaw_enc_init (GstALawEnc * alawenc, GstALawEncClass * klass) +{ + alawenc->sinkpad = + gst_pad_new_from_static_template (&alaw_enc_sink_factory, "sink"); + gst_pad_set_setcaps_function (alawenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_alaw_enc_setcaps)); + gst_pad_set_getcaps_function (alawenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_alaw_enc_getcaps)); + gst_pad_set_chain_function (alawenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_alaw_enc_chain)); + gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->sinkpad); + + alawenc->srcpad = + gst_pad_new_from_static_template (&alaw_enc_src_factory, "src"); + gst_pad_set_setcaps_function (alawenc->srcpad, + GST_DEBUG_FUNCPTR (gst_alaw_enc_setcaps)); + gst_pad_set_getcaps_function (alawenc->srcpad, + GST_DEBUG_FUNCPTR (gst_alaw_enc_getcaps)); + gst_pad_use_fixed_caps (alawenc->srcpad); + gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->srcpad); + + /* init rest */ + alawenc->channels = 0; + alawenc->rate = 0; +} + +static GstFlowReturn +gst_alaw_enc_chain (GstPad * pad, GstBuffer * buffer) +{ + GstALawEnc *alawenc; + gint16 *linear_data; + guint linear_size; + guint8 *alaw_data; + guint alaw_size; + GstBuffer *outbuf; + gint i; + GstFlowReturn ret; + GstClockTime timestamp, duration; + + alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad)); + + if (G_UNLIKELY (alawenc->rate == 0 || alawenc->channels == 0)) + goto not_negotiated; + + linear_data = (gint16 *) GST_BUFFER_DATA (buffer); + linear_size = GST_BUFFER_SIZE (buffer); + + alaw_size = linear_size / 2; + + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + + GST_LOG_OBJECT (alawenc, "buffer with ts=%" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + ret = + gst_pad_alloc_buffer_and_set_caps (alawenc->srcpad, + GST_BUFFER_OFFSET_NONE, alaw_size, GST_PAD_CAPS (alawenc->srcpad), + &outbuf); + if (ret != GST_FLOW_OK) + goto done; + + if (duration == GST_CLOCK_TIME_NONE) { + duration = gst_util_uint64_scale_int (alaw_size, + GST_SECOND, alawenc->rate * alawenc->channels); + } + + if (GST_BUFFER_SIZE (outbuf) < alaw_size) { + /* pad-alloc can return a smaller buffer */ + gst_buffer_unref (outbuf); + outbuf = gst_buffer_new_and_alloc (alaw_size); + } + + alaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); + + /* copy discont flag */ + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = duration; + + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (alawenc->srcpad)); + + for (i = 0; i < alaw_size; i++) { + alaw_data[i] = s16_to_alaw (linear_data[i]); + } + + ret = gst_pad_push (alawenc->srcpad, outbuf); + +done: + + gst_buffer_unref (buffer); + + return ret; + +not_negotiated: + { + ret = GST_FLOW_NOT_NEGOTIATED; + goto done; + } +} diff --git a/gst/law/alaw-encode.h b/gst/law/alaw-encode.h new file mode 100644 index 0000000..3ca53a6 --- /dev/null +++ b/gst/law/alaw-encode.h @@ -0,0 +1,59 @@ +/* GStreamer PCM to A-Law conversion + * Copyright (C) 2000 by Abramo Bagnara + * + * 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_ALAW_ENCODE_H__ +#define __GST_ALAW_ENCODE_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ALAW_ENC \ + (gst_alaw_enc_get_type()) +#define GST_ALAW_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALAW_ENC,GstALawEnc)) +#define GST_ALAW_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALAW_ENC,GstALawEncClass)) +#define GST_IS_ALAW_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALAW_ENC)) +#define GST_IS_ALAW_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALAW_ENC)) + +typedef struct _GstALawEnc GstALawEnc; +typedef struct _GstALawEncClass GstALawEncClass; + +struct _GstALawEnc { + GstElement element; + + GstPad *sinkpad,*srcpad; + + gint channels; + gint rate; +}; + +struct _GstALawEncClass { + GstElementClass parent_class; +}; + +GType gst_alaw_enc_get_type(void); + +G_END_DECLS + +#endif /* __GST_ALAW_ENCODE_H__ */ diff --git a/gst/law/alaw.c b/gst/law/alaw.c new file mode 100644 index 0000000..0442935 --- /dev/null +++ b/gst/law/alaw.c @@ -0,0 +1,77 @@ +/* GStreamer PCM/A-Law conversions + * + * 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.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * 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 "alaw-encode.h" +#include "alaw-decode.h" + +GstStaticPadTemplate alaw_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 8000, 192000 ], " + "channels = (int) [ 1, 2 ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") + ); + +GstStaticPadTemplate alaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-alaw, " + "rate = [ 8000 , 192000 ], " "channels = [ 1 , 2 ]") + ); + +GstStaticPadTemplate alaw_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 8000, 192000 ], " + "channels = (int) [ 1, 2 ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") + ); + +GstStaticPadTemplate alaw_enc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-alaw, " + "rate = [ 8000 , 192000 ], " "channels = [ 1 , 2 ]") + ); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "alawenc", + GST_RANK_PRIMARY, GST_TYPE_ALAW_ENC) || + !gst_element_register (plugin, "alawdec", + GST_RANK_PRIMARY, GST_TYPE_ALAW_DEC)) + return FALSE; + + return TRUE; +} + +/* FIXME 0.11: merge alaw and mulaw into one plugin? */ +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "alaw", + "ALaw audio conversion routines", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/law/mulaw-conversion.c b/gst/law/mulaw-conversion.c new file mode 100644 index 0000000..8afae80 --- /dev/null +++ b/gst/law/mulaw-conversion.c @@ -0,0 +1,118 @@ +/* + * This routine converts from linear to ulaw + * 29 September 1989 + * + * Craig Reese: IDA/Supercomputing Research Center + * Joe Campbell: Department of Defense + * + * References: + * 1) CCITT Recommendation G.711 (very difficult to follow) + * 2) "A New Digital Technique for Implementation of Any + * Continuous PCM Companding Law," Villeret, Michel, + * et al. 1973 IEEE Int. Conf. on Communications, Vol 1, + * 1973, pg. 11.12-11.17 + * 3) MIL-STD-188-113,"Interoperability and Performance Standards + * for Analog-to_Digital Conversion Techniques," + * 17 February 1987 + * + * Input: Signed 16 bit linear sample + * Output: 8 bit ulaw sample + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "mulaw-conversion.h" + +#undef ZEROTRAP /* turn on the trap as per the MIL-STD */ +#define BIAS 0x84 /* define the add-in bias for 16 bit samples */ +#define CLIP 32635 + +void +mulaw_encode (gint16 * in, guint8 * out, gint numsamples) +{ + static gint16 exp_lut[256] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 + }; + gint16 sign, exponent, mantissa, i; + gint16 sample; + guint8 ulawbyte; + + for (i = 0; i < numsamples; i++) { + sample = in[i]; + /** get the sample into sign-magnitude **/ + sign = (sample >> 8) & 0x80; /* set aside the sign */ + if (sign != 0) { + sample = -sample; /* get magnitude */ + } + /* sample can be zero because we can overflow in the inversion, + * checking against the unsigned version solves this */ + if (((guint16) sample) > CLIP) + sample = CLIP; /* clip the magnitude */ + + /** convert from 16 bit linear to ulaw **/ + sample = sample + BIAS; + exponent = exp_lut[(sample >> 7) & 0xFF]; + mantissa = (sample >> (exponent + 3)) & 0x0F; + ulawbyte = ~(sign | (exponent << 4) | mantissa); +#ifdef ZEROTRAP + if (ulawbyte == 0) + ulawbyte = 0x02; /* optional CCITT trap */ +#endif + out[i] = ulawbyte; + } +} + +/* + * This routine converts from ulaw to 16 bit linear + * 29 September 1989 + * + * Craig Reese: IDA/Supercomputing Research Center + * + * References: + * 1) CCITT Recommendation G.711 (very difficult to follow) + * 2) MIL-STD-188-113,"Interoperability and Performance Standards + * for Analog-to_Digital Conversion Techniques," + * 17 February 1987 + * + * Input: 8 bit ulaw sample + * Output: signed 16 bit linear sample + */ + +void +mulaw_decode (guint8 * in, gint16 * out, gint numsamples) +{ + static gint16 exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 }; + gint16 sign, exponent, mantissa; + guint8 ulawbyte; + gint16 linear, i; + + for (i = 0; i < numsamples; i++) { + ulawbyte = in[i]; + ulawbyte = ~ulawbyte; + sign = (ulawbyte & 0x80); + exponent = (ulawbyte >> 4) & 0x07; + mantissa = ulawbyte & 0x0F; + linear = exp_lut[exponent] + (mantissa << (exponent + 3)); + if (sign != 0) + linear = -linear; + out[i] = linear; + } +} diff --git a/gst/law/mulaw-conversion.h b/gst/law/mulaw-conversion.h new file mode 100644 index 0000000..38367ad --- /dev/null +++ b/gst/law/mulaw-conversion.h @@ -0,0 +1,12 @@ +#ifndef _GST_ULAW_CONVERSION_H +#define _GST_ULAW_CONVERSION_H + +#include + +void +mulaw_encode(gint16* in, guint8* out, gint numsamples); +void +mulaw_decode(guint8* in,gint16* out,gint numsamples); + +#endif /* _GST_ULAW_CONVERSION_H */ + diff --git a/gst/law/mulaw-decode.c b/gst/law/mulaw-decode.c new file mode 100644 index 0000000..b8a0d65 --- /dev/null +++ b/gst/law/mulaw-decode.c @@ -0,0 +1,307 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-mulawdec + * + * This element decodes mulaw audio. Mulaw coding is also known as G.711. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include "mulaw-decode.h" +#include "mulaw-conversion.h" + +extern GstStaticPadTemplate mulaw_dec_src_factory; +extern GstStaticPadTemplate mulaw_dec_sink_factory; + +/* Stereo signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +static void gst_mulawdec_class_init (GstMuLawDecClass * klass); +static void gst_mulawdec_base_init (GstMuLawDecClass * klass); +static void gst_mulawdec_init (GstMuLawDec * mulawdec); +static GstStateChangeReturn +gst_mulawdec_change_state (GstElement * element, GstStateChange transition); + +static GstFlowReturn gst_mulawdec_chain (GstPad * pad, GstBuffer * buffer); + +static GstElementClass *parent_class = NULL; + +static gboolean +mulawdec_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstMuLawDec *mulawdec; + GstStructure *structure; + int rate, channels; + gboolean ret; + GstCaps *outcaps; + + mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + ret = gst_structure_get_int (structure, "rate", &rate); + ret = ret && gst_structure_get_int (structure, "channels", &channels); + if (!ret) + return FALSE; + + outcaps = gst_caps_new_simple ("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); + ret = gst_pad_set_caps (mulawdec->srcpad, outcaps); + gst_caps_unref (outcaps); + + if (ret) { + GST_DEBUG_OBJECT (mulawdec, "rate=%d, channels=%d", rate, channels); + mulawdec->rate = rate; + mulawdec->channels = channels; + } + return ret; +} + +static GstCaps * +mulawdec_getcaps (GstPad * pad) +{ + GstMuLawDec *mulawdec; + GstPad *otherpad; + GstCaps *othercaps, *result; + const GstCaps *templ; + const gchar *name; + gint i; + + mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad)); + + /* figure out the name of the caps we are going to return */ + if (pad == mulawdec->srcpad) { + name = "audio/x-raw-int"; + otherpad = mulawdec->sinkpad; + } else { + name = "audio/x-mulaw"; + otherpad = mulawdec->srcpad; + } + /* get caps from the peer, this can return NULL when there is no peer */ + othercaps = gst_pad_peer_get_caps (otherpad); + + /* get the template caps to make sure we return something acceptable */ + templ = gst_pad_get_pad_template_caps (pad); + + if (othercaps) { + /* there was a peer */ + othercaps = gst_caps_make_writable (othercaps); + + /* go through the caps and remove the fields we don't want */ + for (i = 0; i < gst_caps_get_size (othercaps); i++) { + GstStructure *structure; + + structure = gst_caps_get_structure (othercaps, i); + + /* adjust the name */ + gst_structure_set_name (structure, name); + + if (pad == mulawdec->sinkpad) { + /* remove the fields we don't want */ + gst_structure_remove_fields (structure, "width", "depth", "endianness", + "signed", NULL); + } else { + /* add fixed fields */ + gst_structure_set (structure, "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + } + } + /* filter against the allowed caps of the pad to return our result */ + result = gst_caps_intersect (othercaps, templ); + gst_caps_unref (othercaps); + } else { + /* there was no peer, return the template caps */ + result = gst_caps_copy (templ); + } + return result; +} + +GType +gst_mulawdec_get_type (void) +{ + static GType mulawdec_type = 0; + + if (!mulawdec_type) { + static const GTypeInfo mulawdec_info = { + sizeof (GstMuLawDecClass), + (GBaseInitFunc) gst_mulawdec_base_init, + NULL, + (GClassInitFunc) gst_mulawdec_class_init, + NULL, + NULL, + sizeof (GstMuLawDec), + 0, + (GInstanceInitFunc) gst_mulawdec_init, + }; + + mulawdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMuLawDec", &mulawdec_info, + 0); + } + return mulawdec_type; +} + +static void +gst_mulawdec_base_init (GstMuLawDecClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &mulaw_dec_src_factory); + gst_element_class_add_static_pad_template (element_class, + &mulaw_dec_sink_factory); + gst_element_class_set_details_simple (element_class, "Mu Law audio decoder", + "Codec/Decoder/Audio", + "Convert 8bit mu law to 16bit PCM", + "Zaheer Abbas Merali "); +} + +static void +gst_mulawdec_class_init (GstMuLawDecClass * klass) +{ + GstElementClass *element_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + element_class->change_state = GST_DEBUG_FUNCPTR (gst_mulawdec_change_state); +} + +static void +gst_mulawdec_init (GstMuLawDec * mulawdec) +{ + mulawdec->sinkpad = + gst_pad_new_from_static_template (&mulaw_dec_sink_factory, "sink"); + gst_pad_set_setcaps_function (mulawdec->sinkpad, mulawdec_sink_setcaps); + gst_pad_set_getcaps_function (mulawdec->sinkpad, mulawdec_getcaps); + gst_pad_set_chain_function (mulawdec->sinkpad, gst_mulawdec_chain); + gst_element_add_pad (GST_ELEMENT (mulawdec), mulawdec->sinkpad); + + mulawdec->srcpad = + gst_pad_new_from_static_template (&mulaw_dec_src_factory, "src"); + gst_pad_use_fixed_caps (mulawdec->srcpad); + gst_pad_set_getcaps_function (mulawdec->srcpad, mulawdec_getcaps); + gst_element_add_pad (GST_ELEMENT (mulawdec), mulawdec->srcpad); +} + +static GstFlowReturn +gst_mulawdec_chain (GstPad * pad, GstBuffer * buffer) +{ + GstMuLawDec *mulawdec; + gint16 *linear_data; + guint8 *mulaw_data; + guint mulaw_size; + GstBuffer *outbuf; + GstFlowReturn ret; + + mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad)); + + if (G_UNLIKELY (mulawdec->rate == 0)) + goto not_negotiated; + + mulaw_data = (guint8 *) GST_BUFFER_DATA (buffer); + mulaw_size = GST_BUFFER_SIZE (buffer); + + ret = + gst_pad_alloc_buffer_and_set_caps (mulawdec->srcpad, + GST_BUFFER_OFFSET_NONE, mulaw_size * 2, GST_PAD_CAPS (mulawdec->srcpad), + &outbuf); + if (ret != GST_FLOW_OK) + goto alloc_failed; + + linear_data = (gint16 *) GST_BUFFER_DATA (outbuf); + + /* copy discont flag */ + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); + if (GST_BUFFER_DURATION (outbuf) == GST_CLOCK_TIME_NONE) + GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (GST_SECOND, + mulaw_size * 2, 2 * mulawdec->rate * mulawdec->channels); + else + GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mulawdec->srcpad)); + + mulaw_decode (mulaw_data, linear_data, mulaw_size); + + gst_buffer_unref (buffer); + + ret = gst_pad_push (mulawdec->srcpad, outbuf); + + return ret; + + /* ERRORS */ +not_negotiated: + { + GST_WARNING_OBJECT (mulawdec, "no input format set: not-negotiated"); + gst_buffer_unref (buffer); + return GST_FLOW_NOT_NEGOTIATED; + } +alloc_failed: + { + GST_DEBUG_OBJECT (mulawdec, "pad alloc failed, flow: %s", + gst_flow_get_name (ret)); + gst_buffer_unref (buffer); + return ret; + } +} + +static GstStateChangeReturn +gst_mulawdec_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstMuLawDec *dec = GST_MULAWDEC (element); + + switch (transition) { + 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_PAUSED_TO_READY: + dec->rate = 0; + dec->channels = 0; + break; + default: + break; + } + + return ret; +} diff --git a/gst/law/mulaw-decode.h b/gst/law/mulaw-decode.h new file mode 100644 index 0000000..9585118 --- /dev/null +++ b/gst/law/mulaw-decode.h @@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_MULAWDECODE_H__ +#define __GST_MULAWDECODE_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_MULAWDEC \ + (gst_mulawdec_get_type()) +#define GST_MULAWDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULAWDEC,GstMuLawDec)) +#define GST_MULAWDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULAWDEC,GstMuLawDecClass)) +#define GST_IS_MULAWDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULAWDEC)) +#define GST_IS_MULAWDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULAWDEC)) + +typedef struct _GstMuLawDec GstMuLawDec; +typedef struct _GstMuLawDecClass GstMuLawDecClass; + +struct _GstMuLawDec { + GstElement element; + + GstPad *sinkpad,*srcpad; + + gint rate; + gint channels; +}; + +struct _GstMuLawDecClass { + GstElementClass parent_class; +}; + +GType gst_mulawdec_get_type(void); + +G_END_DECLS + +#endif /* __GST_STEREO_H__ */ diff --git a/gst/law/mulaw-encode.c b/gst/law/mulaw-encode.c new file mode 100644 index 0000000..15f8285 --- /dev/null +++ b/gst/law/mulaw-encode.c @@ -0,0 +1,297 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-mulawenc + * + * This element encode mulaw audio. Mulaw coding is also known as G.711. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include "mulaw-encode.h" +#include "mulaw-conversion.h" + +extern GstStaticPadTemplate mulaw_enc_src_factory; +extern GstStaticPadTemplate mulaw_enc_sink_factory; + +/* Stereo signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +static void gst_mulawenc_class_init (GstMuLawEncClass * klass); +static void gst_mulawenc_base_init (GstMuLawEncClass * klass); +static void gst_mulawenc_init (GstMuLawEnc * mulawenc); + +static GstFlowReturn gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer); + +static GstElementClass *parent_class = NULL; + +/*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 }; */ + +static GstCaps * +mulawenc_getcaps (GstPad * pad) +{ + GstMuLawEnc *mulawenc; + GstPad *otherpad; + GstCaps *othercaps, *result; + const GstCaps *templ; + const gchar *name; + gint i; + + mulawenc = GST_MULAWENC (GST_PAD_PARENT (pad)); + + /* figure out the name of the caps we are going to return */ + if (pad == mulawenc->srcpad) { + name = "audio/x-mulaw"; + otherpad = mulawenc->sinkpad; + } else { + name = "audio/x-raw-int"; + otherpad = mulawenc->srcpad; + } + /* get caps from the peer, this can return NULL when there is no peer */ + othercaps = gst_pad_peer_get_caps (otherpad); + + /* get the template caps to make sure we return something acceptable */ + templ = gst_pad_get_pad_template_caps (pad); + + if (othercaps) { + /* there was a peer */ + othercaps = gst_caps_make_writable (othercaps); + + /* go through the caps and remove the fields we don't want */ + for (i = 0; i < gst_caps_get_size (othercaps); i++) { + GstStructure *structure; + + structure = gst_caps_get_structure (othercaps, i); + + /* adjust the name */ + gst_structure_set_name (structure, name); + + if (pad == mulawenc->srcpad) { + /* remove the fields we don't want */ + gst_structure_remove_fields (structure, "width", "depth", "endianness", + "signed", NULL); + } else { + /* add fixed fields */ + gst_structure_set (structure, "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + } + } + /* filter against the allowed caps of the pad to return our result */ + result = gst_caps_intersect (othercaps, templ); + gst_caps_unref (othercaps); + } else { + /* there was no peer, return the template caps */ + result = gst_caps_copy (templ); + } + return result; +} + +static gboolean +mulawenc_setcaps (GstPad * pad, GstCaps * caps) +{ + GstMuLawEnc *mulawenc; + GstPad *otherpad; + GstStructure *structure; + GstCaps *base_caps; + + mulawenc = GST_MULAWENC (gst_pad_get_parent (pad)); + + structure = gst_caps_get_structure (caps, 0); + gst_structure_get_int (structure, "channels", &mulawenc->channels); + gst_structure_get_int (structure, "rate", &mulawenc->rate); + + if (pad == mulawenc->sinkpad) { + otherpad = mulawenc->srcpad; + } else { + otherpad = mulawenc->sinkpad; + } + base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad)); + + structure = gst_caps_get_structure (base_caps, 0); + gst_structure_set (structure, "rate", G_TYPE_INT, mulawenc->rate, NULL); + gst_structure_set (structure, "channels", G_TYPE_INT, mulawenc->channels, + NULL); + + gst_pad_set_caps (otherpad, base_caps); + + gst_object_unref (mulawenc); + gst_caps_unref (base_caps); + + return TRUE; +} + +GType +gst_mulawenc_get_type (void) +{ + static GType mulawenc_type = 0; + + if (!mulawenc_type) { + static const GTypeInfo mulawenc_info = { + sizeof (GstMuLawEncClass), + (GBaseInitFunc) gst_mulawenc_base_init, + NULL, + (GClassInitFunc) gst_mulawenc_class_init, + NULL, + NULL, + sizeof (GstMuLawEnc), + 0, + (GInstanceInitFunc) gst_mulawenc_init, + }; + + mulawenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMuLawEnc", &mulawenc_info, + 0); + } + return mulawenc_type; +} + +static void +gst_mulawenc_base_init (GstMuLawEncClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &mulaw_enc_src_factory); + gst_element_class_add_static_pad_template (element_class, + &mulaw_enc_sink_factory); + gst_element_class_set_details_simple (element_class, "Mu Law audio encoder", + "Codec/Encoder/Audio", + "Convert 16bit PCM to 8bit mu law", + "Zaheer Abbas Merali "); +} + +static void +gst_mulawenc_class_init (GstMuLawEncClass * klass) +{ + parent_class = g_type_class_peek_parent (klass); +} + +static void +gst_mulawenc_init (GstMuLawEnc * mulawenc) +{ + mulawenc->sinkpad = + gst_pad_new_from_static_template (&mulaw_enc_sink_factory, "sink"); + gst_pad_set_setcaps_function (mulawenc->sinkpad, mulawenc_setcaps); + gst_pad_set_getcaps_function (mulawenc->sinkpad, mulawenc_getcaps); + gst_pad_set_chain_function (mulawenc->sinkpad, gst_mulawenc_chain); + gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->sinkpad); + + mulawenc->srcpad = + gst_pad_new_from_static_template (&mulaw_enc_src_factory, "src"); + gst_pad_set_setcaps_function (mulawenc->srcpad, mulawenc_setcaps); + gst_pad_set_getcaps_function (mulawenc->srcpad, mulawenc_getcaps); + gst_pad_use_fixed_caps (mulawenc->srcpad); + gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->srcpad); + + /* init rest */ + mulawenc->channels = 0; + mulawenc->rate = 0; +} + +static GstFlowReturn +gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer) +{ + GstMuLawEnc *mulawenc; + gint16 *linear_data; + guint linear_size; + guint8 *mulaw_data; + guint mulaw_size; + GstBuffer *outbuf; + GstFlowReturn ret; + GstClockTime timestamp, duration; + + mulawenc = GST_MULAWENC (gst_pad_get_parent (pad)); + + if (!mulawenc->rate || !mulawenc->channels) + goto not_negotiated; + + linear_data = (gint16 *) GST_BUFFER_DATA (buffer); + linear_size = GST_BUFFER_SIZE (buffer); + + mulaw_size = linear_size / 2; + + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + + ret = gst_pad_alloc_buffer_and_set_caps (mulawenc->srcpad, + GST_BUFFER_OFFSET_NONE, mulaw_size, GST_PAD_CAPS (mulawenc->srcpad), + &outbuf); + if (ret != GST_FLOW_OK) + goto alloc_failed; + + if (duration == -1) { + duration = gst_util_uint64_scale_int (mulaw_size, + GST_SECOND, mulawenc->rate * mulawenc->channels); + } + + if (GST_BUFFER_SIZE (outbuf) < mulaw_size) { + /* pad-alloc can suggest a smaller size */ + gst_buffer_unref (outbuf); + outbuf = gst_buffer_new_and_alloc (mulaw_size); + } + + mulaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); + + /* copy discont flag */ + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = duration; + + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mulawenc->srcpad)); + + mulaw_encode (linear_data, mulaw_data, mulaw_size); + + gst_buffer_unref (buffer); + + ret = gst_pad_push (mulawenc->srcpad, outbuf); + +done: + gst_object_unref (mulawenc); + + return ret; + +not_negotiated: + { + GST_DEBUG_OBJECT (mulawenc, "no format negotiated"); + ret = GST_FLOW_NOT_NEGOTIATED; + gst_buffer_unref (buffer); + goto done; + } +alloc_failed: + { + GST_DEBUG_OBJECT (mulawenc, "pad alloc failed"); + gst_buffer_unref (buffer); + goto done; + } +} diff --git a/gst/law/mulaw-encode.h b/gst/law/mulaw-encode.h new file mode 100644 index 0000000..f428c3c --- /dev/null +++ b/gst/law/mulaw-encode.h @@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_MULAWENCODE_H__ +#define __GST_MULAWENCODE_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_MULAWENC \ + (gst_mulawenc_get_type()) +#define GST_MULAWENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULAWENC,GstMuLawEnc)) +#define GST_MULAWENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULAWENC,GstMuLawEncClass)) +#define GST_IS_MULAWENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULAWENC)) +#define GST_IS_MULAWENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULAWENC)) + +typedef struct _GstMuLawEnc GstMuLawEnc; +typedef struct _GstMuLawEncClass GstMuLawEncClass; + +struct _GstMuLawEnc { + GstElement element; + + GstPad *sinkpad,*srcpad; + + gint channels; + gint rate; +}; + +struct _GstMuLawEncClass { + GstElementClass parent_class; +}; + +GType gst_mulawenc_get_type(void); + +G_END_DECLS + +#endif /* __GST_STEREO_H__ */ diff --git a/gst/law/mulaw.c b/gst/law/mulaw.c new file mode 100644 index 0000000..e8d9e72 --- /dev/null +++ b/gst/law/mulaw.c @@ -0,0 +1,75 @@ +/* GStreamer PCM/A-Law conversions + * + * 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.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * 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 "mulaw-encode.h" +#include "mulaw-decode.h" + +GstStaticPadTemplate mulaw_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 8000, 192000 ], " + "channels = (int) [ 1, 2 ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") + ); + +GstStaticPadTemplate mulaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-mulaw, " + "rate = [ 8000 , 192000 ], " "channels = [ 1 , 2 ]") + ); + +GstStaticPadTemplate mulaw_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 8000, 192000 ], " + "channels = (int) [ 1, 2 ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") + ); + +GstStaticPadTemplate mulaw_enc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-mulaw, " + "rate = [ 8000 , 192000 ], " "channels = [ 1 , 2 ]") + ); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "mulawenc", + GST_RANK_PRIMARY, GST_TYPE_MULAWENC) || + !gst_element_register (plugin, "mulawdec", + GST_RANK_PRIMARY, GST_TYPE_MULAWDEC)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mulaw", + "MuLaw audio conversion routines", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/level/Makefile.am b/gst/level/Makefile.am new file mode 100644 index 0000000..047e196 --- /dev/null +++ b/gst/level/Makefile.am @@ -0,0 +1,24 @@ +plugin_LTLIBRARIES = libgstlevel.la + +libgstlevel_la_SOURCES = gstlevel.c +libgstlevel_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstlevel_la_LIBADD = $(GST_BASE_LIBS) $(LIBM) +libgstlevel_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstlevel_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstlevel.h + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstlevel -:SHARED libgstlevel \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstlevel_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstlevel_la_CFLAGS) \ + -:LDFLAGS $(libgstlevel_la_LDFLAGS) \ + $(libgstlevel_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/level/Makefile.in b/gst/level/Makefile.in new file mode 100644 index 0000000..691dec8 --- /dev/null +++ b/gst/level/Makefile.in @@ -0,0 +1,819 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/level +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstlevel_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstlevel_la_OBJECTS = libgstlevel_la-gstlevel.lo +libgstlevel_la_OBJECTS = $(am_libgstlevel_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstlevel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstlevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstlevel_la_CFLAGS) $(CFLAGS) \ + $(libgstlevel_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstlevel_la_SOURCES) +DIST_SOURCES = $(libgstlevel_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstlevel.la +libgstlevel_la_SOURCES = gstlevel.c +libgstlevel_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstlevel_la_LIBADD = $(GST_BASE_LIBS) $(LIBM) +libgstlevel_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstlevel_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstlevel.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/level/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/level/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstlevel.la: $(libgstlevel_la_OBJECTS) $(libgstlevel_la_DEPENDENCIES) $(EXTRA_libgstlevel_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstlevel_la_LINK) -rpath $(plugindir) $(libgstlevel_la_OBJECTS) $(libgstlevel_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstlevel_la-gstlevel.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstlevel_la-gstlevel.lo: gstlevel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlevel_la_CFLAGS) $(CFLAGS) -MT libgstlevel_la-gstlevel.lo -MD -MP -MF $(DEPDIR)/libgstlevel_la-gstlevel.Tpo -c -o libgstlevel_la-gstlevel.lo `test -f 'gstlevel.c' || echo '$(srcdir)/'`gstlevel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstlevel_la-gstlevel.Tpo $(DEPDIR)/libgstlevel_la-gstlevel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstlevel.c' object='libgstlevel_la-gstlevel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlevel_la_CFLAGS) $(CFLAGS) -c -o libgstlevel_la-gstlevel.lo `test -f 'gstlevel.c' || echo '$(srcdir)/'`gstlevel.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstlevel -:SHARED libgstlevel \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstlevel_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstlevel_la_CFLAGS) \ + -:LDFLAGS $(libgstlevel_la_LDFLAGS) \ + $(libgstlevel_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/level/gstlevel.c b/gst/level/gstlevel.c new file mode 100644 index 0000000..6d89a68 --- /dev/null +++ b/gst/level/gstlevel.c @@ -0,0 +1,727 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) 2000,2001,2002,2003,2005 + * Thomas Vander Stichele + * + * 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-level + * + * Level analyses incoming audio buffers and, if the #GstLevel:message property + * is #TRUE, generates an element message named + * "level": + * after each interval of time given by the #GstLevel:interval property. + * The message's structure contains these fields: + * + * + * + * #GstClockTime + * "timestamp": + * the timestamp of the buffer that triggered the message. + * + * + * + * + * #GstClockTime + * "stream-time": + * the stream time of the buffer. + * + * + * + * + * #GstClockTime + * "running-time": + * the running_time of the buffer. + * + * + * + * + * #GstClockTime + * "duration": + * the duration of the buffer. + * + * + * + * + * #GstClockTime + * "endtime": + * the end time of the buffer that triggered the message as stream time (this + * is deprecated, as it can be calculated from stream-time + duration) + * + * + * + * + * #GstValueList of #gdouble + * "peak": + * the peak power level in dB for each channel + * + * + * + * + * #GstValueList of #gdouble + * "decay": + * the decaying peak power level in dB for each channel + * the decaying peak level follows the peak level, but starts dropping + * if no new peak is reached after the time given by + * the the time to live. + * When the decaying peak level drops, it does so at the decay rate + * as specified by the + * the peak falloff rate. + * + * + * + * + * #GstValueList of #gdouble + * "rms": + * the Root Mean Square (or average power) level in dB for each channel + * + * + * + * + * + * Example application + * |[ + * + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include + +#include "gstlevel.h" + +GST_DEBUG_CATEGORY_STATIC (level_debug); +#define GST_CAT_DEFAULT level_debug + +#define EPSILON 1e-35f + +static GstStaticPadTemplate sink_template_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) { 8, 16, 32 }, " + "depth = (int) { 8, 16, 32 }, " + "signed = (boolean) true; " + "audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " "width = (int) {32, 64} ") + ); + +static GstStaticPadTemplate src_template_factory = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) { 8, 16, 32 }, " + "depth = (int) { 8, 16, 32 }, " + "signed = (boolean) true; " + "audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " "width = (int) {32, 64} ") + ); + +enum +{ + PROP_0, + PROP_SIGNAL_LEVEL, + PROP_SIGNAL_INTERVAL, + PROP_PEAK_TTL, + PROP_PEAK_FALLOFF +}; + +GST_BOILERPLATE (GstLevel, gst_level, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void gst_level_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_level_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_level_finalize (GObject * obj); + +static gboolean gst_level_set_caps (GstBaseTransform * trans, GstCaps * in, + GstCaps * out); +static gboolean gst_level_start (GstBaseTransform * trans); +static GstFlowReturn gst_level_transform_ip (GstBaseTransform * trans, + GstBuffer * in); + + +static void +gst_level_base_init (gpointer g_class) +{ + GstElementClass *element_class = g_class; + + gst_element_class_add_static_pad_template (element_class, + &sink_template_factory); + gst_element_class_add_static_pad_template (element_class, + &src_template_factory); + gst_element_class_set_details_simple (element_class, "Level", + "Filter/Analyzer/Audio", + "RMS/Peak/Decaying Peak Level messager for audio/raw", + "Thomas Vander Stichele "); +} + +static void +gst_level_class_init (GstLevelClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + + gobject_class->set_property = gst_level_set_property; + gobject_class->get_property = gst_level_get_property; + gobject_class->finalize = gst_level_finalize; + + g_object_class_install_property (gobject_class, PROP_SIGNAL_LEVEL, + g_param_spec_boolean ("message", "message", + "Post a level message for each passed interval", + TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SIGNAL_INTERVAL, + g_param_spec_uint64 ("interval", "Interval", + "Interval of time between message posts (in nanoseconds)", + 1, G_MAXUINT64, GST_SECOND / 10, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PEAK_TTL, + g_param_spec_uint64 ("peak-ttl", "Peak TTL", + "Time To Live of decay peak before it falls back (in nanoseconds)", + 0, G_MAXUINT64, GST_SECOND / 10 * 3, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PEAK_FALLOFF, + g_param_spec_double ("peak-falloff", "Peak Falloff", + "Decay rate of decay peak after TTL (in dB/sec)", + 0.0, G_MAXDOUBLE, 10.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (level_debug, "level", 0, "Level calculation"); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_level_set_caps); + trans_class->start = GST_DEBUG_FUNCPTR (gst_level_start); + trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_level_transform_ip); + trans_class->passthrough_on_same_caps = TRUE; +} + +static void +gst_level_init (GstLevel * filter, GstLevelClass * g_class) +{ + filter->CS = NULL; + filter->peak = NULL; + + filter->rate = 0; + filter->width = 0; + filter->channels = 0; + + filter->interval = GST_SECOND / 10; + filter->decay_peak_ttl = GST_SECOND / 10 * 3; + filter->decay_peak_falloff = 10.0; /* dB falloff (/sec) */ + + filter->message = TRUE; + + filter->process = NULL; + + gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); +} + +static void +gst_level_finalize (GObject * obj) +{ + GstLevel *filter = GST_LEVEL (obj); + + g_free (filter->CS); + g_free (filter->peak); + g_free (filter->last_peak); + g_free (filter->decay_peak); + g_free (filter->decay_peak_base); + g_free (filter->decay_peak_age); + + filter->CS = NULL; + filter->peak = NULL; + filter->last_peak = NULL; + filter->decay_peak = NULL; + filter->decay_peak_base = NULL; + filter->decay_peak_age = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_level_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstLevel *filter = GST_LEVEL (object); + + switch (prop_id) { + case PROP_SIGNAL_LEVEL: + filter->message = g_value_get_boolean (value); + break; + case PROP_SIGNAL_INTERVAL: + filter->interval = g_value_get_uint64 (value); + if (filter->rate) { + filter->interval_frames = + GST_CLOCK_TIME_TO_FRAMES (filter->interval, filter->rate); + } + break; + case PROP_PEAK_TTL: + filter->decay_peak_ttl = + gst_guint64_to_gdouble (g_value_get_uint64 (value)); + break; + case PROP_PEAK_FALLOFF: + filter->decay_peak_falloff = g_value_get_double (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_level_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstLevel *filter = GST_LEVEL (object); + + switch (prop_id) { + case PROP_SIGNAL_LEVEL: + g_value_set_boolean (value, filter->message); + break; + case PROP_SIGNAL_INTERVAL: + g_value_set_uint64 (value, filter->interval); + break; + case PROP_PEAK_TTL: + g_value_set_uint64 (value, filter->decay_peak_ttl); + break; + case PROP_PEAK_FALLOFF: + g_value_set_double (value, filter->decay_peak_falloff); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +/* process one (interleaved) channel of incoming samples + * calculate square sum of samples + * normalize and average over number of samples + * returns a normalized cumulative square value, which can be averaged + * to return the average power as a double between 0 and 1 + * also returns the normalized peak power (square of the highest amplitude) + * + * caller must assure num is a multiple of channels + * samples for multiple channels are interleaved + * input sample data enters in *in_data as 8 or 16 bit data + * this filter only accepts signed audio data, so mid level is always 0 + * + * for 16 bit, this code considers the non-existant 32768 value to be + * full-scale; so 32767 will not map to 1.0 + */ + +#define DEFINE_INT_LEVEL_CALCULATOR(TYPE, RESOLUTION) \ +static void inline \ +gst_level_calculate_##TYPE (gpointer data, guint num, guint channels, \ + gdouble *NCS, gdouble *NPS) \ +{ \ + TYPE * in = (TYPE *)data; \ + register guint j; \ + gdouble squaresum = 0.0; /* square sum of the integer samples */ \ + register gdouble square = 0.0; /* Square */ \ + register gdouble peaksquare = 0.0; /* Peak Square Sample */ \ + gdouble normalizer; /* divisor to get a [-1.0, 1.0] range */ \ + \ + /* *NCS = 0.0; Normalized Cumulative Square */ \ + /* *NPS = 0.0; Normalized Peask Square */ \ + \ + normalizer = (gdouble) (G_GINT64_CONSTANT(1) << (RESOLUTION * 2)); \ + \ + /* oil_squaresum_shifted_s16(&squaresum,in,num); */ \ + for (j = 0; j < num; j += channels) \ + { \ + square = ((gdouble) in[j]) * in[j]; \ + if (square > peaksquare) peaksquare = square; \ + squaresum += square; \ + } \ + \ + *NCS = squaresum / normalizer; \ + *NPS = peaksquare / normalizer; \ +} + +DEFINE_INT_LEVEL_CALCULATOR (gint32, 31); +DEFINE_INT_LEVEL_CALCULATOR (gint16, 15); +DEFINE_INT_LEVEL_CALCULATOR (gint8, 7); + +#define DEFINE_FLOAT_LEVEL_CALCULATOR(TYPE) \ +static void inline \ +gst_level_calculate_##TYPE (gpointer data, guint num, guint channels, \ + gdouble *NCS, gdouble *NPS) \ +{ \ + TYPE * in = (TYPE *)data; \ + register guint j; \ + gdouble squaresum = 0.0; /* square sum of the integer samples */ \ + register gdouble square = 0.0; /* Square */ \ + register gdouble peaksquare = 0.0; /* Peak Square Sample */ \ + \ + /* *NCS = 0.0; Normalized Cumulative Square */ \ + /* *NPS = 0.0; Normalized Peask Square */ \ + \ + /* oil_squaresum_f64(&squaresum,in,num); */ \ + for (j = 0; j < num; j += channels) \ + { \ + square = ((gdouble) in[j]) * in[j]; \ + if (square > peaksquare) peaksquare = square; \ + squaresum += square; \ + } \ + \ + *NCS = squaresum; \ + *NPS = peaksquare; \ +} + +DEFINE_FLOAT_LEVEL_CALCULATOR (gfloat); +DEFINE_FLOAT_LEVEL_CALCULATOR (gdouble); + +/* we would need stride to deinterleave also +static void inline +gst_level_calculate_gdouble (gpointer data, guint num, guint channels, + gdouble *NCS, gdouble *NPS) +{ + oil_squaresum_f64(NCS,(gdouble *)data,num); + *NPS = 0.0; +} +*/ + + +static gint +structure_get_int (GstStructure * structure, const gchar * field) +{ + gint ret; + + if (!gst_structure_get_int (structure, field, &ret)) + g_assert_not_reached (); + + return ret; +} + +static gboolean +gst_level_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out) +{ + GstLevel *filter = GST_LEVEL (trans); + const gchar *mimetype; + GstStructure *structure; + gint i; + + structure = gst_caps_get_structure (in, 0); + filter->rate = structure_get_int (structure, "rate"); + filter->width = structure_get_int (structure, "width"); + filter->channels = structure_get_int (structure, "channels"); + mimetype = gst_structure_get_name (structure); + + /* FIXME: set calculator func depending on caps */ + filter->process = NULL; + if (strcmp (mimetype, "audio/x-raw-int") == 0) { + GST_DEBUG_OBJECT (filter, "use int: %u", filter->width); + switch (filter->width) { + case 8: + filter->process = gst_level_calculate_gint8; + break; + case 16: + filter->process = gst_level_calculate_gint16; + break; + case 32: + filter->process = gst_level_calculate_gint32; + break; + } + } else if (strcmp (mimetype, "audio/x-raw-float") == 0) { + GST_DEBUG_OBJECT (filter, "use float, %u", filter->width); + switch (filter->width) { + case 32: + filter->process = gst_level_calculate_gfloat; + break; + case 64: + filter->process = gst_level_calculate_gdouble; + break; + } + } + + /* allocate channel variable arrays */ + g_free (filter->CS); + g_free (filter->peak); + g_free (filter->last_peak); + g_free (filter->decay_peak); + g_free (filter->decay_peak_base); + g_free (filter->decay_peak_age); + filter->CS = g_new (gdouble, filter->channels); + filter->peak = g_new (gdouble, filter->channels); + filter->last_peak = g_new (gdouble, filter->channels); + filter->decay_peak = g_new (gdouble, filter->channels); + filter->decay_peak_base = g_new (gdouble, filter->channels); + + filter->decay_peak_age = g_new (GstClockTime, filter->channels); + + for (i = 0; i < filter->channels; ++i) { + filter->CS[i] = filter->peak[i] = filter->last_peak[i] = + filter->decay_peak[i] = filter->decay_peak_base[i] = 0.0; + filter->decay_peak_age[i] = G_GUINT64_CONSTANT (0); + } + + filter->interval_frames = + GST_CLOCK_TIME_TO_FRAMES (filter->interval, filter->rate); + + return TRUE; +} + +static gboolean +gst_level_start (GstBaseTransform * trans) +{ + GstLevel *filter = GST_LEVEL (trans); + + filter->num_frames = 0; + + return TRUE; +} + +static GstMessage * +gst_level_message_new (GstLevel * level, GstClockTime timestamp, + GstClockTime duration) +{ + GstBaseTransform *trans = GST_BASE_TRANSFORM_CAST (level); + GstStructure *s; + GValue v = { 0, }; + GstClockTime endtime, running_time, stream_time; + + g_value_init (&v, GST_TYPE_LIST); + + running_time = gst_segment_to_running_time (&trans->segment, GST_FORMAT_TIME, + timestamp); + stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, + timestamp); + /* endtime is for backwards compatibility */ + endtime = stream_time + duration; + + s = gst_structure_new ("level", + "endtime", GST_TYPE_CLOCK_TIME, endtime, + "timestamp", G_TYPE_UINT64, timestamp, + "stream-time", G_TYPE_UINT64, stream_time, + "running-time", G_TYPE_UINT64, running_time, + "duration", G_TYPE_UINT64, duration, NULL); + /* will copy-by-value */ + gst_structure_set_value (s, "rms", &v); + gst_structure_set_value (s, "peak", &v); + gst_structure_set_value (s, "decay", &v); + + g_value_unset (&v); + + return gst_message_new_element (GST_OBJECT (level), s); +} + +static void +gst_level_message_append_channel (GstMessage * m, gdouble rms, gdouble peak, + gdouble decay) +{ + GstStructure *s; + GValue v = { 0, }; + GValue *l; + + g_value_init (&v, G_TYPE_DOUBLE); + + s = (GstStructure *) gst_message_get_structure (m); + + l = (GValue *) gst_structure_get_value (s, "rms"); + g_value_set_double (&v, rms); + gst_value_list_append_value (l, &v); /* copies by value */ + + l = (GValue *) gst_structure_get_value (s, "peak"); + g_value_set_double (&v, peak); + gst_value_list_append_value (l, &v); /* copies by value */ + + l = (GValue *) gst_structure_get_value (s, "decay"); + g_value_set_double (&v, decay); + gst_value_list_append_value (l, &v); /* copies by value */ + + g_value_unset (&v); +} + +static GstFlowReturn +gst_level_transform_ip (GstBaseTransform * trans, GstBuffer * in) +{ + GstLevel *filter; + guint8 *in_data; + gdouble CS; + guint i; + guint num_frames = 0; + guint num_int_samples = 0; /* number of interleaved samples + * ie. total count for all channels combined */ + GstClockTimeDiff falloff_time; + + filter = GST_LEVEL (trans); + + in_data = GST_BUFFER_DATA (in); + num_int_samples = GST_BUFFER_SIZE (in) / (filter->width / 8); + + GST_LOG_OBJECT (filter, "analyzing %u sample frames at ts %" GST_TIME_FORMAT, + num_int_samples, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (in))); + + g_return_val_if_fail (num_int_samples % filter->channels == 0, + GST_FLOW_ERROR); + + num_frames = num_int_samples / filter->channels; + + for (i = 0; i < filter->channels; ++i) { + if (!GST_BUFFER_FLAG_IS_SET (in, GST_BUFFER_FLAG_GAP)) { + filter->process (in_data, num_int_samples, filter->channels, &CS, + &filter->peak[i]); + GST_LOG_OBJECT (filter, + "channel %d, cumulative sum %f, peak %f, over %d samples/%d channels", + i, CS, filter->peak[i], num_int_samples, filter->channels); + filter->CS[i] += CS; + } else { + filter->peak[i] = 0.0; + } + in_data += (filter->width / 8); + + filter->decay_peak_age[i] += + GST_FRAMES_TO_CLOCK_TIME (num_frames, filter->rate); + GST_LOG_OBJECT (filter, "filter peak info [%d]: decay peak %f, age %" + GST_TIME_FORMAT, i, + filter->decay_peak[i], GST_TIME_ARGS (filter->decay_peak_age[i])); + + /* update running peak */ + if (filter->peak[i] > filter->last_peak[i]) + filter->last_peak[i] = filter->peak[i]; + + /* make decay peak fall off if too old */ + falloff_time = + GST_CLOCK_DIFF (gst_gdouble_to_guint64 (filter->decay_peak_ttl), + filter->decay_peak_age[i]); + if (falloff_time > 0) { + gdouble falloff_dB; + gdouble falloff; + gdouble length; /* length of falloff time in seconds */ + + length = (gdouble) falloff_time / (gdouble) GST_SECOND; + falloff_dB = filter->decay_peak_falloff * length; + falloff = pow (10, falloff_dB / -20.0); + + GST_LOG_OBJECT (filter, + "falloff: current %f, base %f, interval %" GST_TIME_FORMAT + ", dB falloff %f, factor %e", + filter->decay_peak[i], filter->decay_peak_base[i], + GST_TIME_ARGS (falloff_time), falloff_dB, falloff); + filter->decay_peak[i] = filter->decay_peak_base[i] * falloff; + GST_LOG_OBJECT (filter, + "peak is %" GST_TIME_FORMAT " old, decayed with factor %e to %f", + GST_TIME_ARGS (filter->decay_peak_age[i]), falloff, + filter->decay_peak[i]); + } else { + GST_LOG_OBJECT (filter, "peak not old enough, not decaying"); + } + + /* if the peak of this run is higher, the decay peak gets reset */ + if (filter->peak[i] >= filter->decay_peak[i]) { + GST_LOG_OBJECT (filter, "new peak, %f", filter->peak[i]); + filter->decay_peak[i] = filter->peak[i]; + filter->decay_peak_base[i] = filter->peak[i]; + filter->decay_peak_age[i] = G_GINT64_CONSTANT (0); + } + } + + if (G_UNLIKELY (!filter->num_frames)) { + /* remember start timestamp for message */ + filter->message_ts = GST_BUFFER_TIMESTAMP (in); + } + filter->num_frames += num_frames; + + /* do we need to message ? */ + if (filter->num_frames >= filter->interval_frames) { + if (filter->message) { + GstMessage *m; + GstClockTime duration = + GST_FRAMES_TO_CLOCK_TIME (filter->num_frames, filter->rate); + + m = gst_level_message_new (filter, filter->message_ts, duration); + + GST_LOG_OBJECT (filter, + "message: ts %" GST_TIME_FORMAT ", num_frames %d", + GST_TIME_ARGS (filter->message_ts), filter->num_frames); + + for (i = 0; i < filter->channels; ++i) { + gdouble RMS; + gdouble RMSdB, lastdB, decaydB; + + RMS = sqrt (filter->CS[i] / filter->num_frames); + GST_LOG_OBJECT (filter, + "message: channel %d, CS %f, num_frames %d, RMS %f", + i, filter->CS[i], filter->num_frames, RMS); + GST_LOG_OBJECT (filter, + "message: last_peak: %f, decay_peak: %f", + filter->last_peak[i], filter->decay_peak[i]); + /* RMS values are calculated in amplitude, so 20 * log 10 */ + RMSdB = 20 * log10 (RMS + EPSILON); + /* peak values are square sums, ie. power, so 10 * log 10 */ + lastdB = 10 * log10 (filter->last_peak[i] + EPSILON); + decaydB = 10 * log10 (filter->decay_peak[i] + EPSILON); + + if (filter->decay_peak[i] < filter->last_peak[i]) { + /* this can happen in certain cases, for example when + * the last peak is between decay_peak and decay_peak_base */ + GST_DEBUG_OBJECT (filter, + "message: decay peak dB %f smaller than last peak dB %f, copying", + decaydB, lastdB); + filter->decay_peak[i] = filter->last_peak[i]; + } + GST_LOG_OBJECT (filter, + "message: RMS %f dB, peak %f dB, decay %f dB", + RMSdB, lastdB, decaydB); + + gst_level_message_append_channel (m, RMSdB, lastdB, decaydB); + + /* reset cumulative and normal peak */ + filter->CS[i] = 0.0; + filter->last_peak[i] = 0.0; + } + + gst_element_post_message (GST_ELEMENT (filter), m); + } + filter->num_frames = 0; + } + + return GST_FLOW_OK; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + /*oil_init (); */ + + return gst_element_register (plugin, "level", GST_RANK_NONE, GST_TYPE_LEVEL); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "level", + "Audio level plugin", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/level/gstlevel.h b/gst/level/gstlevel.h new file mode 100644 index 0000000..32d4c9e --- /dev/null +++ b/gst/level/gstlevel.h @@ -0,0 +1,96 @@ +/* GStreamer + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2000,2001,2002,2003,2005 + * Thomas Vander Stichele + * + * 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_LEVEL_H__ +#define __GST_LEVEL_H__ + + +#include +#include + + +G_BEGIN_DECLS + + +#define GST_TYPE_LEVEL \ + (gst_level_get_type()) +#define GST_LEVEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LEVEL,GstLevel)) +#define GST_LEVEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_LEVEL,GstLevelClass)) +#define GST_LEVEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_LEVEL,GstLevelClass)) +#define GST_IS_LEVEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LEVEL)) +#define GST_IS_LEVEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LEVEL)) + + +typedef struct _GstLevel GstLevel; +typedef struct _GstLevelClass GstLevelClass; + +/** + * GstLevel: + * + * Opaque data structure. + */ +struct _GstLevel { + GstBaseTransform element; + + gboolean message; /* whether or not to post messages */ + guint64 interval; /* how many seconds between emits */ + + gint rate; /* caps variables */ + gint width; + gint channels; + + gdouble decay_peak_ttl; /* time to live for peak in seconds */ + gdouble decay_peak_falloff; /* falloff in dB/sec */ + gint num_frames; /* frame count (1 sample per channel) + * since last emit */ + gint interval_frames; /* after how many frame to sent a message */ + GstClockTime message_ts; /* starttime for next message */ + + /* per-channel arrays for intermediate values */ + gdouble *CS; /* normalized Cumulative Square */ + gdouble *peak; /* normalized Peak value over buffer */ + gdouble *last_peak; /* last normalized Peak value over interval */ + gdouble *decay_peak; /* running decaying normalized Peak */ + gdouble *decay_peak_base; /* value of last peak we are decaying from */ + gdouble *MS; /* normalized Mean Square of buffer */ + gdouble *RMS_dB; /* RMS in dB to emit */ + GstClockTime *decay_peak_age; /* age of last peak */ + + void (*process)(gpointer, guint, guint, gdouble*, gdouble*); +}; + +struct _GstLevelClass { + GstBaseTransformClass parent_class; +}; + +GType gst_level_get_type (void); + + +G_END_DECLS + + +#endif /* __GST_LEVEL_H__ */ diff --git a/gst/matroska/Makefile.am b/gst/matroska/Makefile.am new file mode 100644 index 0000000..7d56973 --- /dev/null +++ b/gst/matroska/Makefile.am @@ -0,0 +1,58 @@ +plugin_LTLIBRARIES = libgstmatroska.la + +libgstmatroska_la_SOURCES = \ + ebml-read.c \ + ebml-write.c \ + matroska.c \ + matroska-demux.c \ + matroska-parse.c \ + matroska-ids.c \ + matroska-mux.c \ + matroska-read-common.c \ + webm-mux.c \ + lzo.c + +noinst_HEADERS = \ + ebml-ids.h \ + ebml-read.h \ + ebml-write.h \ + matroska-demux.h \ + matroska-parse.h \ + matroska-ids.h \ + matroska-mux.h \ + matroska-read-common.h \ + webm-mux.h \ + lzo.h + +libgstmatroska_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) +libgstmatroska_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(ZLIB_LIBS) \ + $(BZ2_LIBS) \ + $(LIBM) +libgstmatroska_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmatroska_la_LIBTOOLFLAGS = --tag=disable-static + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstmatroska -:SHARED libgstmatroska \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmatroska_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) \ + -:LDFLAGS $(libgstmatroska_la_LDFLAGS) \ + $(libgstmatroska_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/matroska/Makefile.in b/gst/matroska/Makefile.in new file mode 100644 index 0000000..d21f919 --- /dev/null +++ b/gst/matroska/Makefile.in @@ -0,0 +1,937 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/matroska +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstmatroska_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstmatroska_la_OBJECTS = libgstmatroska_la-ebml-read.lo \ + libgstmatroska_la-ebml-write.lo libgstmatroska_la-matroska.lo \ + libgstmatroska_la-matroska-demux.lo \ + libgstmatroska_la-matroska-parse.lo \ + libgstmatroska_la-matroska-ids.lo \ + libgstmatroska_la-matroska-mux.lo \ + libgstmatroska_la-matroska-read-common.lo \ + libgstmatroska_la-webm-mux.lo libgstmatroska_la-lzo.lo +libgstmatroska_la_OBJECTS = $(am_libgstmatroska_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstmatroska_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstmatroska_la_CFLAGS) $(CFLAGS) \ + $(libgstmatroska_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstmatroska_la_SOURCES) +DIST_SOURCES = $(libgstmatroska_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstmatroska.la +libgstmatroska_la_SOURCES = \ + ebml-read.c \ + ebml-write.c \ + matroska.c \ + matroska-demux.c \ + matroska-parse.c \ + matroska-ids.c \ + matroska-mux.c \ + matroska-read-common.c \ + webm-mux.c \ + lzo.c + +noinst_HEADERS = \ + ebml-ids.h \ + ebml-read.h \ + ebml-write.h \ + matroska-demux.h \ + matroska-parse.h \ + matroska-ids.h \ + matroska-mux.h \ + matroska-read-common.h \ + webm-mux.h \ + lzo.h + +libgstmatroska_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) + +libgstmatroska_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(ZLIB_LIBS) \ + $(BZ2_LIBS) \ + $(LIBM) + +libgstmatroska_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmatroska_la_LIBTOOLFLAGS = --tag=disable-static +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/matroska/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/matroska/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstmatroska.la: $(libgstmatroska_la_OBJECTS) $(libgstmatroska_la_DEPENDENCIES) $(EXTRA_libgstmatroska_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstmatroska_la_LINK) -rpath $(plugindir) $(libgstmatroska_la_OBJECTS) $(libgstmatroska_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-ebml-read.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-ebml-write.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-lzo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-demux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-ids.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-mux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-parse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-read-common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-webm-mux.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstmatroska_la-ebml-read.lo: ebml-read.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-ebml-read.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-ebml-read.Tpo -c -o libgstmatroska_la-ebml-read.lo `test -f 'ebml-read.c' || echo '$(srcdir)/'`ebml-read.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-ebml-read.Tpo $(DEPDIR)/libgstmatroska_la-ebml-read.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ebml-read.c' object='libgstmatroska_la-ebml-read.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-ebml-read.lo `test -f 'ebml-read.c' || echo '$(srcdir)/'`ebml-read.c + +libgstmatroska_la-ebml-write.lo: ebml-write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-ebml-write.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-ebml-write.Tpo -c -o libgstmatroska_la-ebml-write.lo `test -f 'ebml-write.c' || echo '$(srcdir)/'`ebml-write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-ebml-write.Tpo $(DEPDIR)/libgstmatroska_la-ebml-write.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ebml-write.c' object='libgstmatroska_la-ebml-write.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-ebml-write.lo `test -f 'ebml-write.c' || echo '$(srcdir)/'`ebml-write.c + +libgstmatroska_la-matroska.lo: matroska.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska.Tpo -c -o libgstmatroska_la-matroska.lo `test -f 'matroska.c' || echo '$(srcdir)/'`matroska.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska.Tpo $(DEPDIR)/libgstmatroska_la-matroska.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska.c' object='libgstmatroska_la-matroska.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska.lo `test -f 'matroska.c' || echo '$(srcdir)/'`matroska.c + +libgstmatroska_la-matroska-demux.lo: matroska-demux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-demux.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-demux.Tpo -c -o libgstmatroska_la-matroska-demux.lo `test -f 'matroska-demux.c' || echo '$(srcdir)/'`matroska-demux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-demux.Tpo $(DEPDIR)/libgstmatroska_la-matroska-demux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-demux.c' object='libgstmatroska_la-matroska-demux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-demux.lo `test -f 'matroska-demux.c' || echo '$(srcdir)/'`matroska-demux.c + +libgstmatroska_la-matroska-parse.lo: matroska-parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-parse.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-parse.Tpo -c -o libgstmatroska_la-matroska-parse.lo `test -f 'matroska-parse.c' || echo '$(srcdir)/'`matroska-parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-parse.Tpo $(DEPDIR)/libgstmatroska_la-matroska-parse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-parse.c' object='libgstmatroska_la-matroska-parse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-parse.lo `test -f 'matroska-parse.c' || echo '$(srcdir)/'`matroska-parse.c + +libgstmatroska_la-matroska-ids.lo: matroska-ids.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-ids.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-ids.Tpo -c -o libgstmatroska_la-matroska-ids.lo `test -f 'matroska-ids.c' || echo '$(srcdir)/'`matroska-ids.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-ids.Tpo $(DEPDIR)/libgstmatroska_la-matroska-ids.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-ids.c' object='libgstmatroska_la-matroska-ids.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-ids.lo `test -f 'matroska-ids.c' || echo '$(srcdir)/'`matroska-ids.c + +libgstmatroska_la-matroska-mux.lo: matroska-mux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-mux.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-mux.Tpo -c -o libgstmatroska_la-matroska-mux.lo `test -f 'matroska-mux.c' || echo '$(srcdir)/'`matroska-mux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-mux.Tpo $(DEPDIR)/libgstmatroska_la-matroska-mux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-mux.c' object='libgstmatroska_la-matroska-mux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-mux.lo `test -f 'matroska-mux.c' || echo '$(srcdir)/'`matroska-mux.c + +libgstmatroska_la-matroska-read-common.lo: matroska-read-common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-read-common.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-read-common.Tpo -c -o libgstmatroska_la-matroska-read-common.lo `test -f 'matroska-read-common.c' || echo '$(srcdir)/'`matroska-read-common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-read-common.Tpo $(DEPDIR)/libgstmatroska_la-matroska-read-common.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-read-common.c' object='libgstmatroska_la-matroska-read-common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-read-common.lo `test -f 'matroska-read-common.c' || echo '$(srcdir)/'`matroska-read-common.c + +libgstmatroska_la-webm-mux.lo: webm-mux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-webm-mux.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-webm-mux.Tpo -c -o libgstmatroska_la-webm-mux.lo `test -f 'webm-mux.c' || echo '$(srcdir)/'`webm-mux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-webm-mux.Tpo $(DEPDIR)/libgstmatroska_la-webm-mux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webm-mux.c' object='libgstmatroska_la-webm-mux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-webm-mux.lo `test -f 'webm-mux.c' || echo '$(srcdir)/'`webm-mux.c + +libgstmatroska_la-lzo.lo: lzo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-lzo.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-lzo.Tpo -c -o libgstmatroska_la-lzo.lo `test -f 'lzo.c' || echo '$(srcdir)/'`lzo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-lzo.Tpo $(DEPDIR)/libgstmatroska_la-lzo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lzo.c' object='libgstmatroska_la-lzo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-lzo.lo `test -f 'lzo.c' || echo '$(srcdir)/'`lzo.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstmatroska -:SHARED libgstmatroska \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmatroska_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) \ + -:LDFLAGS $(libgstmatroska_la_LDFLAGS) \ + $(libgstmatroska_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/matroska/ebml-ids.h b/gst/matroska/ebml-ids.h new file mode 100644 index 0000000..14edf74 --- /dev/null +++ b/gst/matroska/ebml-ids.h @@ -0,0 +1,54 @@ +/* GStreamer EBML I/O + * (c) 2003 Ronald Bultje + * + * ebml-ids.h: definition of EBML data IDs + * + * 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_EBML_IDS_H__ +#define __GST_EBML_IDS_H__ + +G_BEGIN_DECLS + +/* EBML version supported */ +#define GST_EBML_VERSION 1 + +/* Unknown size (all bits set to 1) */ +#define GST_EBML_SIZE_UNKNOWN G_GINT64_CONSTANT(0x00ffffffffffffff) + +/* top-level master-IDs */ +#define GST_EBML_ID_HEADER 0x1A45DFA3 + +/* IDs in the HEADER master */ +#define GST_EBML_ID_EBMLVERSION 0x4286 +#define GST_EBML_ID_EBMLREADVERSION 0x42F7 +#define GST_EBML_ID_EBMLMAXIDLENGTH 0x42F2 +#define GST_EBML_ID_EBMLMAXSIZELENGTH 0x42F3 +#define GST_EBML_ID_DOCTYPE 0x4282 +#define GST_EBML_ID_DOCTYPEVERSION 0x4287 +#define GST_EBML_ID_DOCTYPEREADVERSION 0x4285 + +/* general EBML types */ +#define GST_EBML_ID_VOID 0xEC +#define GST_EBML_ID_CRC32 0xBF + +/* EbmlDate offset from the unix epoch in seconds, 2001/01/01 00:00:00 UTC */ +#define GST_EBML_DATE_OFFSET 978307200 + +G_END_DECLS + +#endif /* __GST_EBML_IDS_H__ */ diff --git a/gst/matroska/ebml-read.c b/gst/matroska/ebml-read.c new file mode 100644 index 0000000..f6bf134 --- /dev/null +++ b/gst/matroska/ebml-read.c @@ -0,0 +1,671 @@ +/* GStreamer EBML I/O + * (c) 2003 Ronald Bultje + * + * ebml-read.c: read EBML data from file/stream + * + * 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 + +#include "ebml-read.h" +#include "ebml-ids.h" + +#include + +/* NAN is supposed to be in math.h, Microsoft defines it in xmath.h */ +#ifdef _MSC_VER +#include +#endif + +/* If everything goes wrong try 0.0/0.0 which should be NAN */ +#ifndef NAN +#define NAN (0.0 / 0.0) +#endif + +GST_DEBUG_CATEGORY (ebmlread_debug); +#define GST_CAT_DEFAULT ebmlread_debug + +/* Peeks following element id and element length in datastream provided + * by @peek with @ctx as user data. + * Returns GST_FLOW_UNEXPECTED if not enough data to read id and length. + * Otherwise, @needed provides the prefix length (id + length), and + * @length provides element length. + * + * @object and @offset are provided for informative messaging/debug purposes. + */ +GstFlowReturn +gst_ebml_peek_id_length (guint32 * _id, guint64 * _length, guint * _needed, + GstPeekData peek, gpointer * ctx, GstElement * el, guint64 offset) +{ + guint needed; + const guint8 *buf; + gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; + guint64 total; + guint8 b; + GstFlowReturn ret; + + g_return_val_if_fail (_id != NULL, GST_FLOW_ERROR); + g_return_val_if_fail (_length != NULL, GST_FLOW_ERROR); + g_return_val_if_fail (_needed != NULL, GST_FLOW_ERROR); + + /* well ... */ + *_id = (guint32) GST_EBML_SIZE_UNKNOWN; + *_length = GST_EBML_SIZE_UNKNOWN; + + /* read element id */ + needed = 2; + ret = peek (ctx, needed, &buf); + if (ret != GST_FLOW_OK) + goto peek_error; + b = GST_READ_UINT8 (buf); + total = (guint64) b; + while (read <= 4 && !(total & len_mask)) { + read++; + len_mask >>= 1; + } + if (G_UNLIKELY (read > 4)) + goto invalid_id; + + /* need id and at least something for subsequent length */ + needed = read + 1; + ret = peek (ctx, needed, &buf); + if (ret != GST_FLOW_OK) + goto peek_error; + while (n < read) { + b = GST_READ_UINT8 (buf + n); + total = (total << 8) | b; + ++n; + } + *_id = (guint32) total; + + /* read element length */ + b = GST_READ_UINT8 (buf + n); + total = (guint64) b; + len_mask = 0x80; + read = 1; + while (read <= 8 && !(total & len_mask)) { + read++; + len_mask >>= 1; + } + if (G_UNLIKELY (read > 8)) + goto invalid_length; + if ((total &= (len_mask - 1)) == len_mask - 1) + num_ffs++; + + needed += read - 1; + ret = peek (ctx, needed, &buf); + if (ret != GST_FLOW_OK) + goto peek_error; + buf += (needed - read); + n = 1; + while (n < read) { + guint8 b = GST_READ_UINT8 (buf + n); + + if (G_UNLIKELY (b == 0xff)) + num_ffs++; + total = (total << 8) | b; + ++n; + } + + if (G_UNLIKELY (read == num_ffs)) + *_length = G_MAXUINT64; + else + *_length = total; + + *_needed = needed; + + return GST_FLOW_OK; + + /* ERRORS */ +peek_error: + { + GST_WARNING_OBJECT (el, "peek failed, ret = %d", ret); + *_needed = needed; + return ret; + } +invalid_id: + { + GST_ERROR_OBJECT (el, + "Invalid EBML ID size tag (0x%x) at position %" G_GUINT64_FORMAT " (0x%" + G_GINT64_MODIFIER "x)", (guint) b, offset, offset); + return GST_FLOW_ERROR; + } +invalid_length: + { + GST_ERROR_OBJECT (el, + "Invalid EBML length size tag (0x%x) at position %" G_GUINT64_FORMAT + " (0x%" G_GINT64_MODIFIER "x)", (guint) b, offset, offset); + return GST_FLOW_ERROR; + } +} + +/* setup for parsing @buf at position @offset on behalf of @el. + * Takes ownership of @buf. */ +void +gst_ebml_read_init (GstEbmlRead * ebml, GstElement * el, GstBuffer * buf, + guint64 offset) +{ + GstEbmlMaster m; + + g_return_if_fail (el); + g_return_if_fail (buf); + + ebml->el = el; + ebml->offset = offset; + ebml->buf = buf; + ebml->readers = g_array_sized_new (FALSE, FALSE, sizeof (GstEbmlMaster), 10); + m.offset = ebml->offset; + gst_byte_reader_init (&m.br, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + g_array_append_val (ebml->readers, m); +} + +void +gst_ebml_read_clear (GstEbmlRead * ebml) +{ + if (ebml->readers) + g_array_free (ebml->readers, TRUE); + ebml->readers = NULL; + if (ebml->buf) + gst_buffer_unref (ebml->buf); + ebml->buf = NULL; + ebml->el = NULL; +} + +static GstFlowReturn +gst_ebml_read_peek (GstByteReader * br, guint peek, const guint8 ** data) +{ + if (G_LIKELY (gst_byte_reader_peek_data (br, peek, data))) + return GST_FLOW_OK; + else + return GST_FLOW_UNEXPECTED; +} + +static GstFlowReturn +gst_ebml_peek_id_full (GstEbmlRead * ebml, guint32 * id, guint64 * length, + guint * prefix) +{ + GstFlowReturn ret; + + ret = gst_ebml_peek_id_length (id, length, prefix, + (GstPeekData) gst_ebml_read_peek, (gpointer) gst_ebml_read_br (ebml), + ebml->el, gst_ebml_read_get_pos (ebml)); + if (ret != GST_FLOW_OK) + return ret; + + GST_LOG_OBJECT (ebml->el, "id 0x%x at offset 0x%" G_GINT64_MODIFIER "x" + " of length %" G_GUINT64_FORMAT ", prefix %d", *id, + gst_ebml_read_get_pos (ebml), *length, *prefix); + +#ifndef GST_DISABLE_GST_DEBUG + { + const guint8 *data = NULL; + GstByteReader *br = gst_ebml_read_br (ebml); + guint size = gst_byte_reader_get_remaining (br); + + gst_byte_reader_peek_data (br, size, &data); + + GST_LOG_OBJECT (ebml->el, "current br %p; remaining %d", br, size); + if (data) + GST_MEMDUMP_OBJECT (ebml->el, "element", data, MIN (size, *length)); + } +#endif + + return ret; +} + +GstFlowReturn +gst_ebml_peek_id (GstEbmlRead * ebml, guint32 * id) +{ + guint64 length; + guint needed; + + return gst_ebml_peek_id_full (ebml, id, &length, &needed); +} + +/* + * Read the next element, the contents are supposed to be sub-elements which + * can be read separately. A new bytereader is setup for doing so. + */ +GstFlowReturn +gst_ebml_read_master (GstEbmlRead * ebml, guint32 * id) +{ + guint64 length; + guint prefix; + const guint8 *data = NULL; + GstFlowReturn ret; + GstEbmlMaster m; + + ret = gst_ebml_peek_id_full (ebml, id, &length, &prefix); + if (ret != GST_FLOW_OK) + return ret; + + /* we just at least peeked the id */ + if (!gst_byte_reader_skip (gst_ebml_read_br (ebml), prefix)) + return GST_FLOW_ERROR; /* FIXME: do proper error handling */ + + m.offset = gst_ebml_read_get_pos (ebml); + if (!gst_byte_reader_get_data (gst_ebml_read_br (ebml), length, &data)) + return GST_FLOW_PARSE; + + GST_LOG_OBJECT (ebml->el, "pushing level %d at offset %" G_GUINT64_FORMAT, + ebml->readers->len, m.offset); + gst_byte_reader_init (&m.br, data, length); + g_array_append_val (ebml->readers, m); + + return GST_FLOW_OK; +} + +/* explicitly pop a bytereader from stack. Usually invoked automagically. */ +GstFlowReturn +gst_ebml_read_pop_master (GstEbmlRead * ebml) +{ + g_return_val_if_fail (ebml->readers, GST_FLOW_ERROR); + + /* never remove initial bytereader */ + if (ebml->readers->len > 1) { + GST_LOG_OBJECT (ebml->el, "popping level %d", ebml->readers->len - 1); + g_array_remove_index (ebml->readers, ebml->readers->len - 1); + } + + return GST_FLOW_OK; +} + +/* + * Skip the next element. + */ + +GstFlowReturn +gst_ebml_read_skip (GstEbmlRead * ebml) +{ + guint64 length; + guint32 id; + guint prefix; + GstFlowReturn ret; + + ret = gst_ebml_peek_id_full (ebml, &id, &length, &prefix); + if (ret != GST_FLOW_OK) + return ret; + + if (!gst_byte_reader_skip (gst_ebml_read_br (ebml), length + prefix)) + return GST_FLOW_PARSE; + + return ret; +} + +/* + * Read the next element as a GstBuffer (binary). + */ + +GstFlowReturn +gst_ebml_read_buffer (GstEbmlRead * ebml, guint32 * id, GstBuffer ** buf) +{ + guint64 length; + guint prefix; + GstFlowReturn ret; + + ret = gst_ebml_peek_id_full (ebml, id, &length, &prefix); + if (ret != GST_FLOW_OK) + return ret; + + /* we just at least peeked the id */ + if (!gst_byte_reader_skip (gst_ebml_read_br (ebml), prefix)) + return GST_FLOW_ERROR; /* FIXME: do proper error handling */ + + if (G_LIKELY (length > 0)) { + guint offset; + + offset = gst_ebml_read_get_pos (ebml) - ebml->offset; + if (G_LIKELY (gst_byte_reader_skip (gst_ebml_read_br (ebml), length))) { + *buf = gst_buffer_create_sub (ebml->buf, offset, length); + } else { + *buf = NULL; + return GST_FLOW_PARSE; + } + } else { + *buf = gst_buffer_new (); + } + + return ret; +} + +/* + * Read the next element, return a pointer to it and its size. + */ + +static GstFlowReturn +gst_ebml_read_bytes (GstEbmlRead * ebml, guint32 * id, const guint8 ** data, + guint * size) +{ + guint64 length; + guint prefix; + GstFlowReturn ret; + + *size = 0; + + ret = gst_ebml_peek_id_full (ebml, id, &length, &prefix); + if (ret != GST_FLOW_OK) + return ret; + + /* we just at least peeked the id */ + if (!gst_byte_reader_skip (gst_ebml_read_br (ebml), prefix)) + return GST_FLOW_ERROR; /* FIXME: do proper error handling */ + + *data = NULL; + if (G_LIKELY (length >= 0)) { + if (!gst_byte_reader_get_data (gst_ebml_read_br (ebml), length, data)) + return GST_FLOW_PARSE; + } + + *size = length; + + return ret; +} + +/* + * Read the next element as an unsigned int. + */ + +GstFlowReturn +gst_ebml_read_uint (GstEbmlRead * ebml, guint32 * id, guint64 * num) +{ + const guint8 *data; + guint size; + GstFlowReturn ret; + + ret = gst_ebml_read_bytes (ebml, id, &data, &size); + if (ret != GST_FLOW_OK) + return ret; + + if (size > 8) { + GST_ERROR_OBJECT (ebml->el, + "Invalid integer element size %d at position %" G_GUINT64_FORMAT " (0x%" + G_GINT64_MODIFIER "x)", size, gst_ebml_read_get_pos (ebml) - size, + gst_ebml_read_get_pos (ebml) - size); + return GST_FLOW_ERROR; + } + + if (size == 0) { + *num = 0; + return ret; + } + + *num = 0; + while (size > 0) { + *num = (*num << 8) | *data; + size--; + data++; + } + + return ret; +} + +/* + * Read the next element as a signed int. + */ + +GstFlowReturn +gst_ebml_read_sint (GstEbmlRead * ebml, guint32 * id, gint64 * num) +{ + const guint8 *data; + guint size; + gboolean negative = 0; + GstFlowReturn ret; + + ret = gst_ebml_read_bytes (ebml, id, &data, &size); + if (ret != GST_FLOW_OK) + return ret; + + if (size > 8) { + GST_ERROR_OBJECT (ebml->el, + "Invalid integer element size %d at position %" G_GUINT64_FORMAT " (0x%" + G_GINT64_MODIFIER "x)", size, gst_ebml_read_get_pos (ebml) - size, + gst_ebml_read_get_pos (ebml) - size); + return GST_FLOW_ERROR; + } + + if (size == 0) { + *num = 0; + return ret; + } + + *num = 0; + if (*data & 0x80) { + negative = 1; + *num = *data & ~0x80; + size--; + data++; + } + + while (size > 0) { + *num = (*num << 8) | *data; + size--; + data++; + } + + /* make signed */ + if (negative) { + *num = 0 - *num; + } + + return ret; +} + +/* Convert 80 bit extended precision float in big endian format to double. + * Code taken from libavutil/intfloat_readwrite.c from ffmpeg, + * licensed under LGPL */ + +struct _ext_float +{ + guint8 exponent[2]; + guint8 mantissa[8]; +}; + +static gdouble +_ext2dbl (const guint8 * data) +{ + struct _ext_float ext; + guint64 m = 0; + gint e, i; + + memcpy (&ext.exponent, data, 2); + memcpy (&ext.mantissa, data + 2, 8); + + for (i = 0; i < 8; i++) + m = (m << 8) + ext.mantissa[i]; + e = (((gint) ext.exponent[0] & 0x7f) << 8) | ext.exponent[1]; + if (e == 0x7fff && m) + return NAN; + e -= 16383 + 63; /* In IEEE 80 bits, the whole (i.e. 1.xxxx) + * mantissa bit is written as opposed to the + * single and double precision formats */ + if (ext.exponent[0] & 0x80) + m = -m; + return ldexp (m, e); +} + +/* + * Read the next element as a float. + */ + +GstFlowReturn +gst_ebml_read_float (GstEbmlRead * ebml, guint32 * id, gdouble * num) +{ + const guint8 *data; + guint size; + GstFlowReturn ret; + + ret = gst_ebml_read_bytes (ebml, id, &data, &size); + if (ret != GST_FLOW_OK) + return ret; + + if (size != 0 && size != 4 && size != 8 && size != 10) { + GST_ERROR_OBJECT (ebml->el, + "Invalid float element size %d at position %" G_GUINT64_FORMAT " (0x%" + G_GINT64_MODIFIER "x)", size, gst_ebml_read_get_pos (ebml) - size, + gst_ebml_read_get_pos (ebml) - size); + return GST_FLOW_ERROR; + } + + if (size == 4) { + gfloat f; + + memcpy (&f, data, 4); + f = GFLOAT_FROM_BE (f); + + *num = f; + } else if (size == 8) { + gdouble d; + + memcpy (&d, data, 8); + d = GDOUBLE_FROM_BE (d); + + *num = d; + } else if (size == 10) { + *num = _ext2dbl (data); + } else { + /* size == 0 means a value of 0.0 */ + *num = 0.0; + } + + return ret; +} + +/* + * Read the next element as a C string. + */ + +static GstFlowReturn +gst_ebml_read_string (GstEbmlRead * ebml, guint32 * id, gchar ** str) +{ + const guint8 *data; + guint size; + GstFlowReturn ret; + + ret = gst_ebml_read_bytes (ebml, id, &data, &size); + if (ret != GST_FLOW_OK) + return ret; + + *str = g_malloc (size + 1); + memcpy (*str, data, size); + (*str)[size] = '\0'; + + return ret; +} + +/* + * Read the next element as an ASCII string. + */ + +GstFlowReturn +gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str_out) +{ + GstFlowReturn ret; + gchar *str; + gchar *iter; + +#ifndef GST_DISABLE_GST_DEBUG + guint64 oldoff = ebml->offset; +#endif + + ret = gst_ebml_read_string (ebml, id, &str); + if (ret != GST_FLOW_OK) + return ret; + + for (iter = str; *iter != '\0'; iter++) { + if (G_UNLIKELY (*iter & 0x80)) { + GST_ERROR_OBJECT (ebml, + "Invalid ASCII string at offset %" G_GUINT64_FORMAT, oldoff); + g_free (str); + return GST_FLOW_ERROR; + } + } + + *str_out = str; + return ret; +} + +/* + * Read the next element as a UTF-8 string. + */ + +GstFlowReturn +gst_ebml_read_utf8 (GstEbmlRead * ebml, guint32 * id, gchar ** str) +{ + GstFlowReturn ret; + +#ifndef GST_DISABLE_GST_DEBUG + guint64 oldoff = gst_ebml_read_get_pos (ebml); +#endif + + ret = gst_ebml_read_string (ebml, id, str); + if (ret != GST_FLOW_OK) + return ret; + + if (str != NULL && *str != NULL && **str != '\0' && + !g_utf8_validate (*str, -1, NULL)) { + GST_WARNING_OBJECT (ebml->el, + "Invalid UTF-8 string at offset %" G_GUINT64_FORMAT, oldoff); + } + + return ret; +} + +/* + * Read the next element as a date. + * Returns the seconds since the unix epoch. + */ + +GstFlowReturn +gst_ebml_read_date (GstEbmlRead * ebml, guint32 * id, gint64 * date) +{ + gint64 ebml_date; + GstFlowReturn ret; + + ret = gst_ebml_read_sint (ebml, id, &ebml_date); + if (ret != GST_FLOW_OK) + return ret; + + *date = (ebml_date / GST_SECOND) + GST_EBML_DATE_OFFSET; + + return ret; +} + +/* + * Read the next element as binary data. + */ + +GstFlowReturn +gst_ebml_read_binary (GstEbmlRead * ebml, + guint32 * id, guint8 ** binary, guint64 * length) +{ + const guint8 *data; + guint size; + GstFlowReturn ret; + + ret = gst_ebml_read_bytes (ebml, id, &data, &size); + if (ret != GST_FLOW_OK) + return ret; + + *length = size; + *binary = g_memdup (data, size); + + return GST_FLOW_OK; +} diff --git a/gst/matroska/ebml-read.h b/gst/matroska/ebml-read.h new file mode 100644 index 0000000..9db38f5 --- /dev/null +++ b/gst/matroska/ebml-read.h @@ -0,0 +1,170 @@ +/* GStreamer EBML I/O + * (c) 2003 Ronald Bultje + * + * ebml-read.c: read EBML data from file/stream + * + * 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_EBML_READ_H__ +#define __GST_EBML_READ_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_EBML_READ \ + (gst_ebml_read_get_type ()) +#define GST_EBML_READ(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_EBML_READ, GstEbmlRead)) +#define GST_EBML_READ_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_EBML_READ, GstEbmlReadClass)) +#define GST_IS_EBML_READ(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EBML_READ)) +#define GST_IS_EBML_READ_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_READ)) +#define GST_EBML_READ_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_READ, GstEbmlReadClass)) + +GST_DEBUG_CATEGORY_EXTERN (ebmlread_debug); + +/* custom flow return code */ +#define GST_FLOW_PARSE GST_FLOW_CUSTOM_ERROR + +typedef struct _GstEbmlMaster { + guint64 offset; + GstByteReader br; +} GstEbmlMaster; + +typedef struct _GstEbmlRead { + GstElement *el; + + GstBuffer *buf; + guint64 offset; + + GArray *readers; +} GstEbmlRead; + +typedef GstFlowReturn (*GstPeekData) (gpointer * context, guint peek, const guint8 ** data); + +/* returns UNEXPECTED if not enough data */ +GstFlowReturn gst_ebml_peek_id_length (guint32 * _id, guint64 * _length, + guint * _needed, + GstPeekData peek, gpointer * ctx, + GstElement * el, guint64 offset); + +void gst_ebml_read_init (GstEbmlRead * ebml, + GstElement * el, GstBuffer * buf, + guint64 offset); + +void gst_ebml_read_clear (GstEbmlRead * ebml); + +GstFlowReturn gst_ebml_peek_id (GstEbmlRead * ebml, guint32 * id); + +/* return _PARSE if not enough data to read what is needed, _ERROR or _OK */ +GstFlowReturn gst_ebml_read_skip (GstEbmlRead *ebml); + +GstFlowReturn gst_ebml_read_buffer (GstEbmlRead *ebml, + guint32 *id, + GstBuffer **buf); + +GstFlowReturn gst_ebml_read_uint (GstEbmlRead *ebml, + guint32 *id, + guint64 *num); + +GstFlowReturn gst_ebml_read_sint (GstEbmlRead *ebml, + guint32 *id, + gint64 *num); + +GstFlowReturn gst_ebml_read_float (GstEbmlRead *ebml, + guint32 *id, + gdouble *num); + +GstFlowReturn gst_ebml_read_ascii (GstEbmlRead *ebml, + guint32 *id, + gchar **str); + +GstFlowReturn gst_ebml_read_utf8 (GstEbmlRead *ebml, + guint32 *id, + gchar **str); + +GstFlowReturn gst_ebml_read_date (GstEbmlRead *ebml, + guint32 *id, + gint64 *date); + +GstFlowReturn gst_ebml_read_master (GstEbmlRead *ebml, + guint32 *id); + +GstFlowReturn gst_ebml_read_pop_master (GstEbmlRead *ebml); + +GstFlowReturn gst_ebml_read_binary (GstEbmlRead *ebml, + guint32 *id, + guint8 **binary, + guint64 *length); + +GstFlowReturn gst_ebml_read_header (GstEbmlRead *read, + gchar **doctype, + guint *version); + +/* Returns current (absolute) position of Ebml parser, + * i.e. taking into account offset provided at init */ +static inline guint64 +gst_ebml_read_get_pos (GstEbmlRead * ebml) +{ + GstEbmlMaster *m; + + g_return_val_if_fail (ebml->readers, 0); + g_return_val_if_fail (ebml->readers->len, 0); + + m = &(g_array_index (ebml->readers, GstEbmlMaster, ebml->readers->len - 1)); + return m->offset + gst_byte_reader_get_pos (&m->br); +} + +/* Returns starting offset of Ebml parser */ +static inline guint64 +gst_ebml_read_get_offset (GstEbmlRead * ebml) +{ + return ebml->offset; +} + +static inline GstByteReader * +gst_ebml_read_br (GstEbmlRead * ebml) +{ + g_return_val_if_fail (ebml->readers, NULL); + g_return_val_if_fail (ebml->readers->len, NULL); + + return &(g_array_index (ebml->readers, + GstEbmlMaster, ebml->readers->len - 1).br); +} + +static inline gboolean +gst_ebml_read_has_remaining (GstEbmlRead * ebml, guint64 bytes_needed, + gboolean auto_pop) +{ + gboolean res; + + res = (gst_byte_reader_get_remaining (gst_ebml_read_br (ebml)) >= bytes_needed); + if (G_LIKELY (!res && auto_pop)) { + gst_ebml_read_pop_master (ebml); + } + + return G_LIKELY (res); +} + +G_END_DECLS + +#endif /* __GST_EBML_READ_H__ */ diff --git a/gst/matroska/ebml-write.c b/gst/matroska/ebml-write.c new file mode 100644 index 0000000..06f3568 --- /dev/null +++ b/gst/matroska/ebml-write.c @@ -0,0 +1,882 @@ +/* GStreamer EBML I/O + * (c) 2003 Ronald Bultje + * (c) 2005 Michal Benes + * + * ebml-write.c: write EBML data to file/stream + * + * 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 + +#include "ebml-write.h" +#include "ebml-ids.h" + + +GST_DEBUG_CATEGORY_STATIC (gst_ebml_write_debug); +#define GST_CAT_DEFAULT gst_ebml_write_debug + +#define _do_init(thing) \ + GST_DEBUG_CATEGORY_INIT (gst_ebml_write_debug, "ebmlwrite", 0, "Write EBML structured data") +GST_BOILERPLATE_FULL (GstEbmlWrite, gst_ebml_write, GstObject, GST_TYPE_OBJECT, + _do_init); + +static void gst_ebml_write_finalize (GObject * object); + +static void +gst_ebml_write_base_init (gpointer g_class) +{ +} + +static void +gst_ebml_write_class_init (GstEbmlWriteClass * klass) +{ + GObjectClass *object = G_OBJECT_CLASS (klass); + + object->finalize = gst_ebml_write_finalize; +} + +static void +gst_ebml_write_init (GstEbmlWrite * ebml, GstEbmlWriteClass * klass) +{ + ebml->srcpad = NULL; + ebml->pos = 0; + ebml->last_pos = G_MAXUINT64; /* force newsegment event */ + + ebml->cache = NULL; + ebml->streamheader = NULL; + ebml->streamheader_pos = 0; + ebml->writing_streamheader = FALSE; + ebml->caps = NULL; +} + +static void +gst_ebml_write_finalize (GObject * object) +{ + GstEbmlWrite *ebml = GST_EBML_WRITE (object); + + gst_object_unref (ebml->srcpad); + + if (ebml->cache) { + gst_byte_writer_free (ebml->cache); + ebml->cache = NULL; + } + + if (ebml->streamheader) { + gst_byte_writer_free (ebml->streamheader); + ebml->streamheader = NULL; + } + + if (ebml->caps) { + gst_caps_unref (ebml->caps); + ebml->caps = NULL; + } + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); +} + + +/** + * gst_ebml_write_new: + * @srcpad: Source pad to which the output will be pushed. + * + * Creates a new #GstEbmlWrite. + * + * Returns: a new #GstEbmlWrite + */ +GstEbmlWrite * +gst_ebml_write_new (GstPad * srcpad) +{ + GstEbmlWrite *ebml = + GST_EBML_WRITE (g_object_new (GST_TYPE_EBML_WRITE, NULL)); + + ebml->srcpad = gst_object_ref (srcpad); + ebml->timestamp = GST_CLOCK_TIME_NONE; + + gst_ebml_write_reset (ebml); + + return ebml; +} + + +/** + * gst_ebml_write_reset: + * @ebml: a #GstEbmlWrite. + * + * Reset internal state of #GstEbmlWrite. + */ +void +gst_ebml_write_reset (GstEbmlWrite * ebml) +{ + ebml->pos = 0; + ebml->last_pos = G_MAXUINT64; /* force newsegment event */ + + if (ebml->cache) { + gst_byte_writer_free (ebml->cache); + ebml->cache = NULL; + } + + if (ebml->caps) { + gst_caps_unref (ebml->caps); + ebml->caps = NULL; + } + + ebml->last_write_result = GST_FLOW_OK; + ebml->timestamp = GST_CLOCK_TIME_NONE; +} + + +/** + * gst_ebml_last_write_result: + * @ebml: a #GstEbmlWrite. + * + * Returns: GST_FLOW_OK if there was not write error since the last call of + * gst_ebml_last_write_result or code of the error. + */ +GstFlowReturn +gst_ebml_last_write_result (GstEbmlWrite * ebml) +{ + GstFlowReturn res = ebml->last_write_result; + + ebml->last_write_result = GST_FLOW_OK; + + return res; +} + + +void +gst_ebml_start_streamheader (GstEbmlWrite * ebml) +{ + g_return_if_fail (ebml->streamheader == NULL); + + GST_DEBUG ("Starting streamheader at %" G_GUINT64_FORMAT, ebml->pos); + ebml->streamheader = gst_byte_writer_new_with_size (1000, FALSE); + ebml->streamheader_pos = ebml->pos; + ebml->writing_streamheader = TRUE; +} + +GstBuffer * +gst_ebml_stop_streamheader (GstEbmlWrite * ebml) +{ + GstBuffer *buffer; + + if (!ebml->streamheader) + return NULL; + + buffer = gst_byte_writer_free_and_get_buffer (ebml->streamheader); + ebml->streamheader = NULL; + GST_DEBUG ("Streamheader was size %d", GST_BUFFER_SIZE (buffer)); + + ebml->writing_streamheader = FALSE; + return buffer; +} + +/** + * gst_ebml_write_set_cache: + * @ebml: a #GstEbmlWrite. + * @size: size of the cache. + * Create a cache. + * + * The idea is that you use this for writing a lot + * of small elements. This will just "queue" all of + * them and they'll be pushed to the next element all + * at once. This saves memory and time for buffer + * allocation and init, and it looks better. + */ +void +gst_ebml_write_set_cache (GstEbmlWrite * ebml, guint size) +{ + g_return_if_fail (ebml->cache == NULL); + + GST_DEBUG ("Starting cache at %" G_GUINT64_FORMAT, ebml->pos); + ebml->cache = gst_byte_writer_new_with_size (size, FALSE); + ebml->cache_pos = ebml->pos; +} + +static gboolean +gst_ebml_writer_send_new_segment_event (GstEbmlWrite * ebml, guint64 new_pos) +{ + gboolean res; + + GST_INFO ("seeking to %" G_GUINT64_FORMAT, new_pos); + + res = gst_pad_push_event (ebml->srcpad, + gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, new_pos, -1, 0)); + + if (!res) + GST_WARNING ("seek to %" G_GUINT64_FORMAT "failed", new_pos); + + return res; +} + +/** + * gst_ebml_write_flush_cache: + * @ebml: a #GstEbmlWrite. + * @timestamp: timestamp of the buffer. + * + * Flush the cache. + */ +void +gst_ebml_write_flush_cache (GstEbmlWrite * ebml, gboolean is_keyframe, + GstClockTime timestamp) +{ + GstBuffer *buffer; + + if (!ebml->cache) + return; + + buffer = gst_byte_writer_free_and_get_buffer (ebml->cache); + ebml->cache = NULL; + GST_DEBUG ("Flushing cache of size %d", GST_BUFFER_SIZE (buffer)); + gst_buffer_set_caps (buffer, ebml->caps); + GST_BUFFER_TIMESTAMP (buffer) = timestamp; + GST_BUFFER_OFFSET (buffer) = ebml->pos - GST_BUFFER_SIZE (buffer); + GST_BUFFER_OFFSET_END (buffer) = ebml->pos; + if (ebml->last_write_result == GST_FLOW_OK) { + if (GST_BUFFER_OFFSET (buffer) != ebml->last_pos) { + gst_ebml_writer_send_new_segment_event (ebml, GST_BUFFER_OFFSET (buffer)); + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); + } + if (ebml->writing_streamheader) { + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_IN_CAPS); + } + if (!is_keyframe) { + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + } + ebml->last_pos = ebml->pos; + ebml->last_write_result = gst_pad_push (ebml->srcpad, buffer); + } else { + gst_buffer_unref (buffer); + } +} + + +/** + * gst_ebml_write_element_new: + * @ebml: a #GstEbmlWrite. + * @size: size of the requested buffer. + * + * Create a buffer for one element. If there is + * a cache, use that instead. + * + * Returns: A new #GstBuffer. + */ +static GstBuffer * +gst_ebml_write_element_new (GstEbmlWrite * ebml, guint8 ** data_out, guint size) +{ + /* Create new buffer of size + ID + length */ + GstBuffer *buf; + + /* length, ID */ + size += 12; + + buf = gst_buffer_new_and_alloc (size); + GST_BUFFER_TIMESTAMP (buf) = ebml->timestamp; + + *data_out = GST_BUFFER_DATA (buf); + + return buf; +} + + +/** + * gst_ebml_write_element_id: + * @data_inout: Pointer to data pointer + * @id: Element ID that should be written. + * + * Write element ID into a buffer. + */ +static void +gst_ebml_write_element_id (guint8 ** data_inout, guint32 id) +{ + guint8 *data = *data_inout; + guint bytes = 4, mask = 0x10; + + /* get ID length */ + while (!(id & (mask << ((bytes - 1) * 8))) && bytes > 0) { + mask <<= 1; + bytes--; + } + + /* if invalid ID, use dummy */ + if (bytes == 0) { + GST_WARNING ("Invalid ID, voiding"); + bytes = 1; + id = GST_EBML_ID_VOID; + } + + /* write out, BE */ + *data_inout += bytes; + while (bytes--) { + data[bytes] = id & 0xff; + id >>= 8; + } +} + + +/** + * gst_ebml_write_element_size: + * @data_inout: Pointer to data pointer + * @size: Element length. + * + * Write element length into a buffer. + */ +static void +gst_ebml_write_element_size (guint8 ** data_inout, guint64 size) +{ + guint8 *data = *data_inout; + guint bytes = 1, mask = 0x80; + + if (size != GST_EBML_SIZE_UNKNOWN) { + /* how many bytes? - use mask-1 because an all-1 bitset is not allowed */ + while ((size >> ((bytes - 1) * 8)) >= (mask - 1) && bytes <= 8) { + mask >>= 1; + bytes++; + } + + /* if invalid size, use max. */ + if (bytes > 8) { + GST_WARNING ("Invalid size, writing size unknown"); + mask = 0x01; + bytes = 8; + /* Now here's a real FIXME: we cannot read those yet! */ + size = GST_EBML_SIZE_UNKNOWN; + } + } else { + mask = 0x01; + bytes = 8; + } + + /* write out, BE, with length size marker */ + *data_inout += bytes; + while (bytes-- > 0) { + data[bytes] = size & 0xff; + size >>= 8; + if (!bytes) + *data |= mask; + } +} + + +/** + * gst_ebml_write_element_data: + * @data_inout: Pointer to data pointer + * @write: Data that should be written. + * @length: Length of the data. + * + * Write element data into a buffer. + */ +static void +gst_ebml_write_element_data (guint8 ** data_inout, guint8 * write, + guint64 length) +{ + memcpy (*data_inout, write, length); + *data_inout += length; +} + + +/** + * gst_ebml_write_element_push: + * @ebml: #GstEbmlWrite + * @buf: #GstBuffer to be written. + * @buf_data: Start of data to push from @buf (or NULL for whole buffer). + * @buf_data_end: Data pointer positioned after the last byte in @buf_data (or + * NULL for whole buffer). + * + * Write out buffer by moving it to the next element. + */ +static void +gst_ebml_write_element_push (GstEbmlWrite * ebml, GstBuffer * buf, + guint8 * buf_data, guint8 * buf_data_end) +{ + guint data_size; + + if (!buf_data) + buf_data = GST_BUFFER_DATA (buf); + + if (buf_data_end) { + data_size = buf_data_end - buf_data; + GST_BUFFER_SIZE (buf) = data_size; + } else { + data_size = GST_BUFFER_SIZE (buf); + } + + ebml->pos += data_size; + + /* if there's no cache, then don't push it! */ + if (ebml->writing_streamheader) { + gst_byte_writer_put_data (ebml->streamheader, buf_data, data_size); + } + if (ebml->cache) { + gst_byte_writer_put_data (ebml->cache, buf_data, data_size); + gst_buffer_unref (buf); + return; + } + + if (ebml->last_write_result == GST_FLOW_OK) { + buf = gst_buffer_make_metadata_writable (buf); + gst_buffer_set_caps (buf, ebml->caps); + GST_BUFFER_OFFSET (buf) = ebml->pos - data_size; + GST_BUFFER_OFFSET_END (buf) = ebml->pos; + if (ebml->writing_streamheader) { + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); + } + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); + + if (GST_BUFFER_OFFSET (buf) != ebml->last_pos) { + gst_ebml_writer_send_new_segment_event (ebml, GST_BUFFER_OFFSET (buf)); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + } + ebml->last_pos = ebml->pos; + ebml->last_write_result = gst_pad_push (ebml->srcpad, buf); + } else { + gst_buffer_unref (buf); + } +} + + +/** + * gst_ebml_write_seek: + * @ebml: #GstEbmlWrite + * @pos: Seek position. + * + * Seek. + */ +void +gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos) +{ + if (ebml->writing_streamheader) { + GST_DEBUG ("wanting to seek to pos %" G_GUINT64_FORMAT, pos); + if (pos >= ebml->streamheader_pos && + pos <= ebml->streamheader_pos + ebml->streamheader->parent.size) { + gst_byte_writer_set_pos (ebml->streamheader, + pos - ebml->streamheader_pos); + GST_DEBUG ("seeked in streamheader to position %" G_GUINT64_FORMAT, + pos - ebml->streamheader_pos); + } else { + GST_WARNING + ("we are writing streamheader still and seek is out of bounds"); + } + } + /* Cache seeking. A bit dangerous, we assume the client writer + * knows what he's doing... */ + if (ebml->cache) { + /* within bounds? */ + if (pos >= ebml->cache_pos && + pos <= ebml->cache_pos + ebml->cache->parent.size) { + GST_DEBUG ("seeking in cache to %" G_GUINT64_FORMAT, pos); + ebml->pos = pos; + gst_byte_writer_set_pos (ebml->cache, ebml->pos - ebml->cache_pos); + return; + } else { + GST_LOG ("Seek outside cache range. Clearing..."); + gst_ebml_write_flush_cache (ebml, FALSE, GST_CLOCK_TIME_NONE); + } + } + + GST_INFO ("scheduling seek to %" G_GUINT64_FORMAT, pos); + ebml->pos = pos; +} + + +/** + * gst_ebml_write_get_uint_size: + * @num: Number to be encoded. + * + * Get number of bytes needed to write a uint. + * + * Returns: Encoded uint length. + */ +static guint +gst_ebml_write_get_uint_size (guint64 num) +{ + guint size = 1; + + /* get size */ + while (num >= (G_GINT64_CONSTANT (1) << (size * 8)) && size < 8) { + size++; + } + + return size; +} + + +/** + * gst_ebml_write_set_uint: + * @data_inout: Pointer to data pointer + * @num: Number to be written. + * @size: Encoded number length. + * + * Write an uint into a buffer. + */ +static void +gst_ebml_write_set_uint (guint8 ** data_inout, guint64 num, guint size) +{ + guint8 *data = *data_inout; + + *data_inout += size; + + while (size-- > 0) { + data[size] = num & 0xff; + num >>= 8; + } +} + + +/** + * gst_ebml_write_uint: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * @num: Number to be written. + * + * Write uint element. + */ +void +gst_ebml_write_uint (GstEbmlWrite * ebml, guint32 id, guint64 num) +{ + GstBuffer *buf; + guint8 *data_start, *data_end; + guint size = gst_ebml_write_get_uint_size (num); + + buf = gst_ebml_write_element_new (ebml, &data_start, sizeof (num)); + data_end = data_start; + + /* write */ + gst_ebml_write_element_id (&data_end, id); + gst_ebml_write_element_size (&data_end, size); + gst_ebml_write_set_uint (&data_end, num, size); + gst_ebml_write_element_push (ebml, buf, data_start, data_end); +} + + +/** + * gst_ebml_write_sint: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * @num: Number to be written. + * + * Write sint element. + */ +void +gst_ebml_write_sint (GstEbmlWrite * ebml, guint32 id, gint64 num) +{ + GstBuffer *buf; + guint8 *data_start, *data_end; + /* if the signed number is on the edge of a extra-byte, + * then we'll fall over when detecting it. Example: if I + * have a number (-)0x8000 (G_MINSHORT), then my abs()<<1 + * will be 0x10000; this is G_MAXUSHORT+1! So: if (<0) -1. */ + guint64 unum = (num < 0 ? (-num - 1) << 1 : num << 1); + guint size = gst_ebml_write_get_uint_size (unum); + + buf = gst_ebml_write_element_new (ebml, &data_start, sizeof (num)); + data_end = data_start; + + /* make unsigned */ + if (num >= 0) { + unum = num; + } else { + unum = 0x80 << (size - 1); + unum += num; + unum |= 0x80 << (size - 1); + } + + /* write */ + gst_ebml_write_element_id (&data_end, id); + gst_ebml_write_element_size (&data_end, size); + gst_ebml_write_set_uint (&data_end, unum, size); + gst_ebml_write_element_push (ebml, buf, data_start, data_end); +} + + +/** + * gst_ebml_write_float: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * @num: Number to be written. + * + * Write float element. + */ +void +gst_ebml_write_float (GstEbmlWrite * ebml, guint32 id, gdouble num) +{ + GstBuffer *buf; + guint8 *data_start, *data_end; + + buf = gst_ebml_write_element_new (ebml, &data_start, sizeof (num)); + data_end = data_start; + + gst_ebml_write_element_id (&data_end, id); + gst_ebml_write_element_size (&data_end, 8); + num = GDOUBLE_TO_BE (num); + gst_ebml_write_element_data (&data_end, (guint8 *) & num, 8); + gst_ebml_write_element_push (ebml, buf, data_start, data_end); +} + + +/** + * gst_ebml_write_ascii: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * @str: String to be written. + * + * Write string element. + */ +void +gst_ebml_write_ascii (GstEbmlWrite * ebml, guint32 id, const gchar * str) +{ + gint len = strlen (str) + 1; /* add trailing '\0' */ + GstBuffer *buf; + guint8 *data_start, *data_end; + + buf = gst_ebml_write_element_new (ebml, &data_start, len); + data_end = data_start; + + gst_ebml_write_element_id (&data_end, id); + gst_ebml_write_element_size (&data_end, len); + gst_ebml_write_element_data (&data_end, (guint8 *) str, len); + gst_ebml_write_element_push (ebml, buf, data_start, data_end); +} + + +/** + * gst_ebml_write_utf8: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * @str: String to be written. + * + * Write utf8 encoded string element. + */ +void +gst_ebml_write_utf8 (GstEbmlWrite * ebml, guint32 id, const gchar * str) +{ + gst_ebml_write_ascii (ebml, id, str); +} + + +/** + * gst_ebml_write_date: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * @date: Date in seconds since the unix epoch. + * + * Write date element. + */ +void +gst_ebml_write_date (GstEbmlWrite * ebml, guint32 id, gint64 date) +{ + gst_ebml_write_sint (ebml, id, (date - GST_EBML_DATE_OFFSET) * GST_SECOND); +} + +/** + * gst_ebml_write_master_start: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * + * Start wiriting mater element. + * + * Master writing is annoying. We use a size marker of + * the max. allowed length, so that we can later fill it + * in validly. + * + * Returns: Master starting position. + */ +guint64 +gst_ebml_write_master_start (GstEbmlWrite * ebml, guint32 id) +{ + guint64 pos = ebml->pos; + GstBuffer *buf; + guint8 *data_start, *data_end; + + buf = gst_ebml_write_element_new (ebml, &data_start, 0); + data_end = data_start; + + gst_ebml_write_element_id (&data_end, id); + pos += data_end - data_start; + gst_ebml_write_element_size (&data_end, GST_EBML_SIZE_UNKNOWN); + gst_ebml_write_element_push (ebml, buf, data_start, data_end); + + return pos; +} + + +/** + * gst_ebml_write_master_finish_full: + * @ebml: #GstEbmlWrite + * @startpos: Master starting position. + * + * Finish writing master element. Size of master element is difference between + * current position and the element start, and @extra_size added to this. + */ +void +gst_ebml_write_master_finish_full (GstEbmlWrite * ebml, guint64 startpos, + guint64 extra_size) +{ + guint64 pos = ebml->pos; + GstBuffer *buf; + + gst_ebml_write_seek (ebml, startpos); + + buf = gst_buffer_new_and_alloc (8); + GST_WRITE_UINT64_BE (GST_BUFFER_DATA (buf), + (G_GINT64_CONSTANT (1) << 56) | (pos - startpos - 8 + extra_size)); + + gst_ebml_write_element_push (ebml, buf, NULL, NULL); + gst_ebml_write_seek (ebml, pos); +} + +void +gst_ebml_write_master_finish (GstEbmlWrite * ebml, guint64 startpos) +{ + gst_ebml_write_master_finish_full (ebml, startpos, 0); +} + +/** + * gst_ebml_write_binary: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * @binary: Data to be written. + * @length: Length of the data + * + * Write an element with binary data. + */ +void +gst_ebml_write_binary (GstEbmlWrite * ebml, + guint32 id, guint8 * binary, guint64 length) +{ + GstBuffer *buf; + guint8 *data_start, *data_end; + + buf = gst_ebml_write_element_new (ebml, &data_start, length); + data_end = data_start; + + gst_ebml_write_element_id (&data_end, id); + gst_ebml_write_element_size (&data_end, length); + gst_ebml_write_element_data (&data_end, binary, length); + gst_ebml_write_element_push (ebml, buf, data_start, data_end); +} + + +/** + * gst_ebml_write_buffer_header: + * @ebml: #GstEbmlWrite + * @id: Element ID. + * @length: Length of the data + * + * Write header of the binary element (use with gst_ebml_write_buffer function). + * + * For things like video frames and audio samples, + * you want to use this function, as it doesn't have + * the overhead of memcpy() that other functions + * such as write_binary() do have. + */ +void +gst_ebml_write_buffer_header (GstEbmlWrite * ebml, guint32 id, guint64 length) +{ + GstBuffer *buf; + guint8 *data_start, *data_end; + + buf = gst_ebml_write_element_new (ebml, &data_start, 0); + data_end = data_start; + + gst_ebml_write_element_id (&data_end, id); + gst_ebml_write_element_size (&data_end, length); + gst_ebml_write_element_push (ebml, buf, data_start, data_end); +} + + +/** + * gst_ebml_write_buffer: + * @ebml: #GstEbmlWrite + * @buf: #GstBuffer cointaining the data. + * + * Write binary element (see gst_ebml_write_buffer_header). + */ +void +gst_ebml_write_buffer (GstEbmlWrite * ebml, GstBuffer * buf) +{ + gst_ebml_write_element_push (ebml, buf, NULL, NULL); +} + + +/** + * gst_ebml_replace_uint: + * @ebml: #GstEbmlWrite + * @pos: Position of the uint that should be replaced. + * @num: New value. + * + * Replace uint with a new value. + * + * When replacing a uint, we assume that it is *always* + * 8-byte, since that's the safest guess we can do. This + * is just for simplicity. + * + * FIXME: this function needs to be replaced with something + * proper. This is a crude hack. + */ +void +gst_ebml_replace_uint (GstEbmlWrite * ebml, guint64 pos, guint64 num) +{ + guint64 oldpos = ebml->pos; + GstBuffer *buf = gst_buffer_new_and_alloc (8); + guint8 *data_start, *data_end; + + data_start = GST_BUFFER_DATA (buf); + data_end = data_start; + + gst_ebml_write_seek (ebml, pos); + gst_ebml_write_set_uint (&data_end, num, 8); + + gst_ebml_write_element_push (ebml, buf, data_start, data_end); + gst_ebml_write_seek (ebml, oldpos); +} + +/** + * gst_ebml_write_header: + * @ebml: #GstEbmlWrite + * @doctype: Document type. + * @version: Document type version. + * + * Write EBML header. + */ +void +gst_ebml_write_header (GstEbmlWrite * ebml, const gchar * doctype, + guint version) +{ + guint64 pos; + + /* write the basic EBML header */ + gst_ebml_write_set_cache (ebml, 0x40); + pos = gst_ebml_write_master_start (ebml, GST_EBML_ID_HEADER); +#if (GST_EBML_VERSION != 1) + gst_ebml_write_uint (ebml, GST_EBML_ID_EBMLVERSION, GST_EBML_VERSION); + gst_ebml_write_uint (ebml, GST_EBML_ID_EBMLREADVERSION, GST_EBML_VERSION); +#endif +#if 0 + /* we don't write these until they're "non-default" (never!) */ + gst_ebml_write_uint (ebml, GST_EBML_ID_EBMLMAXIDLENGTH, sizeof (guint32)); + gst_ebml_write_uint (ebml, GST_EBML_ID_EBMLMAXSIZELENGTH, sizeof (guint64)); +#endif + gst_ebml_write_ascii (ebml, GST_EBML_ID_DOCTYPE, doctype); + gst_ebml_write_uint (ebml, GST_EBML_ID_DOCTYPEVERSION, version); + gst_ebml_write_uint (ebml, GST_EBML_ID_DOCTYPEREADVERSION, version); + gst_ebml_write_master_finish (ebml, pos); + gst_ebml_write_flush_cache (ebml, FALSE, 0); +} diff --git a/gst/matroska/ebml-write.h b/gst/matroska/ebml-write.h new file mode 100644 index 0000000..4d0293d --- /dev/null +++ b/gst/matroska/ebml-write.h @@ -0,0 +1,152 @@ +/* GStreamer EBML I/O + * (c) 2003 Ronald Bultje + * (c) 2005 Michal Benes + * + * ebml-write.c: write EBML data to file/stream + * + * 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_EBML_WRITE_H__ +#define __GST_EBML_WRITE_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_EBML_WRITE \ + (gst_ebml_write_get_type ()) +#define GST_EBML_WRITE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_EBML_WRITE, GstEbmlWrite)) +#define GST_EBML_WRITE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_EBML_WRITE, GstEbmlWriteClass)) +#define GST_IS_EBML_WRITE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EBML_WRITE)) +#define GST_IS_EBML_WRITE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_WRITE)) +#define GST_EBML_WRITE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_WRITE, GstEbmlWriteClass)) + +typedef struct _GstEbmlWrite { + GstObject object; + + GstPad *srcpad; + guint64 pos; + guint64 last_pos; + GstClockTime timestamp; + + GstByteWriter *cache; + guint64 cache_pos; + + GstFlowReturn last_write_result; + + gboolean writing_streamheader; + GstByteWriter *streamheader; + guint64 streamheader_pos; + + GstCaps *caps; +} GstEbmlWrite; + +typedef struct _GstEbmlWriteClass { + GstObjectClass parent; +} GstEbmlWriteClass; + +GType gst_ebml_write_get_type (void); + +GstEbmlWrite *gst_ebml_write_new (GstPad *srcpad); +void gst_ebml_write_reset (GstEbmlWrite *ebml); + +GstFlowReturn gst_ebml_last_write_result (GstEbmlWrite *ebml); + +/* Used to create streamheaders */ +void gst_ebml_start_streamheader (GstEbmlWrite *ebml); +GstBuffer* gst_ebml_stop_streamheader (GstEbmlWrite *ebml); + +/* + * Caching means that we do not push one buffer for + * each element, but fill this one until a flush. + */ +void gst_ebml_write_set_cache (GstEbmlWrite *ebml, + guint size); +void gst_ebml_write_flush_cache (GstEbmlWrite *ebml, + gboolean is_keyframe, + GstClockTime timestamp); + +/* + * Seeking. + */ +void gst_ebml_write_seek (GstEbmlWrite *ebml, + guint64 pos); + +/* + * Data writing. + */ +void gst_ebml_write_uint (GstEbmlWrite *ebml, + guint32 id, + guint64 num); +void gst_ebml_write_sint (GstEbmlWrite *ebml, + guint32 id, + gint64 num); +void gst_ebml_write_float (GstEbmlWrite *ebml, + guint32 id, + gdouble num); +void gst_ebml_write_ascii (GstEbmlWrite *ebml, + guint32 id, + const gchar *str); +void gst_ebml_write_utf8 (GstEbmlWrite *ebml, + guint32 id, + const gchar *str); +void gst_ebml_write_date (GstEbmlWrite *ebml, + guint32 id, + gint64 date); +guint64 gst_ebml_write_master_start (GstEbmlWrite *ebml, + guint32 id); +void gst_ebml_write_master_finish (GstEbmlWrite *ebml, + guint64 startpos); +void gst_ebml_write_master_finish_full (GstEbmlWrite * ebml, + guint64 startpos, + guint64 extra_size); +void gst_ebml_write_binary (GstEbmlWrite *ebml, + guint32 id, + guchar *binary, + guint64 length); +void gst_ebml_write_header (GstEbmlWrite *ebml, + const gchar *doctype, + guint version); + +/* + * Note: this is supposed to be used only for media data. + */ +void gst_ebml_write_buffer_header (GstEbmlWrite *ebml, + guint32 id, + guint64 length); +void gst_ebml_write_buffer (GstEbmlWrite *ebml, + GstBuffer *data); + +/* + * A hack, basically... See matroska-mux.c. I should actually + * make a nice _replace_element_with_size() or so, but this + * works for now. + */ +void gst_ebml_replace_uint (GstEbmlWrite *ebml, + guint64 pos, + guint64 num); + +G_END_DECLS + +#endif /* __GST_EBML_WRITE_H__ */ diff --git a/gst/matroska/lzo.c b/gst/matroska/lzo.c new file mode 100644 index 0000000..995638f --- /dev/null +++ b/gst/matroska/lzo.c @@ -0,0 +1,288 @@ +/* + * LZO 1x decompression + * Copyright (c) 2006 Reimar Doeffinger + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include "_stdint.h" +#include "lzo.h" + +/*! define if we may write up to 12 bytes beyond the output buffer */ +/* #define OUTBUF_PADDED 1 */ +/*! define if we may read up to 8 bytes beyond the input buffer */ +/* #define INBUF_PADDED 1 */ +typedef struct LZOContext +{ + const uint8_t *in, *in_end; + uint8_t *out_start, *out, *out_end; + int error; +} LZOContext; + +/* + * \brief read one byte from input buffer, avoiding overrun + * \return byte read + */ +static inline int +get_byte (LZOContext * c) +{ + if (c->in < c->in_end) + return *c->in++; + c->error |= LZO_INPUT_DEPLETED; + return 1; +} + +#ifdef INBUF_PADDED +#define GETB(c) (*(c).in++) +#else +#define GETB(c) get_byte(&(c)) +#endif + +/* + * \brief decode a length value in the coding used by lzo + * \param x previous byte value + * \param mask bits used from x + * \return decoded length value + */ +static inline int +get_len (LZOContext * c, int x, int mask) +{ + int cnt = x & mask; + if (!cnt) { + while (!(x = get_byte (c))) + cnt += 255; + cnt += mask + x; + } + return cnt; +} + +/*#define UNALIGNED_LOADSTORE */ +#define BUILTIN_MEMCPY +#ifdef UNALIGNED_LOADSTORE +#define COPY2(d, s) *(uint16_t *)(d) = *(uint16_t *)(s); +#define COPY4(d, s) *(uint32_t *)(d) = *(uint32_t *)(s); +#elif defined(BUILTIN_MEMCPY) +#define COPY2(d, s) memcpy(d, s, 2); +#define COPY4(d, s) memcpy(d, s, 4); +#else +#define COPY2(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; +#define COPY4(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; (d)[2] = (s)[2]; (d)[3] = (s)[3]; +#endif + +/* + * \brief copy bytes from input to output buffer with checking + * \param cnt number of bytes to copy, must be >= 0 + */ +static inline void +copy (LZOContext * c, int cnt) +{ + register const uint8_t *src = c->in; + register uint8_t *dst = c->out; + if (cnt > c->in_end - src) { + cnt = MAX (c->in_end - src, 0); + c->error |= LZO_INPUT_DEPLETED; + } + if (cnt > c->out_end - dst) { + cnt = MAX (c->out_end - dst, 0); + c->error |= LZO_OUTPUT_FULL; + } +#if defined(INBUF_PADDED) && defined(OUTBUF_PADDED) + COPY4 (dst, src); + src += 4; + dst += 4; + cnt -= 4; + if (cnt > 0) +#endif + memcpy (dst, src, cnt); + c->in = src + cnt; + c->out = dst + cnt; +} + +/* + * \brief copy previously decoded bytes to current position + * \param back how many bytes back we start + * \param cnt number of bytes to copy, must be >= 0 + * + * cnt > back is valid, this will copy the bytes we just copied, + * thus creating a repeating pattern with a period length of back. + */ +static inline void +copy_backptr (LZOContext * c, int back, int cnt) +{ + register const uint8_t *src = &c->out[-back]; + register uint8_t *dst = c->out; + if (src < c->out_start || src > dst) { + c->error |= LZO_INVALID_BACKPTR; + return; + } + if (cnt > c->out_end - dst) { + cnt = MAX (c->out_end - dst, 0); + c->error |= LZO_OUTPUT_FULL; + } + if (back == 1) { + memset (dst, *src, cnt); + dst += cnt; + } else { +#ifdef OUTBUF_PADDED + COPY2 (dst, src); + COPY2 (dst + 2, src + 2); + src += 4; + dst += 4; + cnt -= 4; + if (cnt > 0) { + COPY2 (dst, src); + COPY2 (dst + 2, src + 2); + COPY2 (dst + 4, src + 4); + COPY2 (dst + 6, src + 6); + src += 8; + dst += 8; + cnt -= 8; + } +#endif + if (cnt > 0) { + int blocklen = back; + while (cnt > blocklen) { + memcpy (dst, src, blocklen); + dst += blocklen; + cnt -= blocklen; + blocklen <<= 1; + } + memcpy (dst, src, cnt); + } + dst += cnt; + } + c->out = dst; +} + +/* + * \brief decode LZO 1x compressed data + * \param out output buffer + * \param outlen size of output buffer, number of bytes left are returned here + * \param in input buffer + * \param inlen size of input buffer, number of bytes left are returned here + * \return 0 on success, otherwise error flags, see lzo.h + * + * make sure all buffers are appropriately padded, in must provide + * LZO_INPUT_PADDING, out must provide LZO_OUTPUT_PADDING additional bytes + */ +int +lzo1x_decode (void *out, int *outlen, const void *in, int *inlen) +{ + int state = 0; + int x; + LZOContext c; + c.in = in; + c.in_end = (const uint8_t *) in + *inlen; + c.out = c.out_start = out; + c.out_end = (uint8_t *) out + *outlen; + c.error = 0; + x = GETB (c); + if (x > 17) { + copy (&c, x - 17); + x = GETB (c); + if (x < 16) + c.error |= LZO_ERROR; + } + if (c.in > c.in_end) + c.error |= LZO_INPUT_DEPLETED; + while (!c.error) { + int cnt, back; + if (x > 15) { + if (x > 63) { + cnt = (x >> 5) - 1; + back = (GETB (c) << 3) + ((x >> 2) & 7) + 1; + } else if (x > 31) { + cnt = get_len (&c, x, 31); + x = GETB (c); + back = (GETB (c) << 6) + (x >> 2) + 1; + } else { + cnt = get_len (&c, x, 7); + back = (1 << 14) + ((x & 8) << 11); + x = GETB (c); + back += (GETB (c) << 6) + (x >> 2); + if (back == (1 << 14)) { + if (cnt != 1) + c.error |= LZO_ERROR; + break; + } + } + } else if (!state) { + cnt = get_len (&c, x, 15); + copy (&c, cnt + 3); + x = GETB (c); + if (x > 15) + continue; + cnt = 1; + back = (1 << 11) + (GETB (c) << 2) + (x >> 2) + 1; + } else { + cnt = 0; + back = (GETB (c) << 2) + (x >> 2) + 1; + } + copy_backptr (&c, back, cnt + 2); + state = cnt = x & 3; + copy (&c, cnt); + x = GETB (c); + } + *inlen = c.in_end - c.in; + if (c.in > c.in_end) + *inlen = 0; + *outlen = c.out_end - c.out; + return c.error; +} + +#ifdef TEST +#include +#include +#include "log.h" +#define MAXSZ (10*1024*1024) +int +main (int argc, char *argv[]) +{ + FILE *in = fopen (argv[1], "rb"); + uint8_t *orig = av_malloc (MAXSZ + 16); + uint8_t *comp = av_malloc (2 * MAXSZ + 16); + uint8_t *decomp = av_malloc (MAXSZ + 16); + size_t s = fread (orig, 1, MAXSZ, in); + lzo_uint clen = 0; + long tmp[LZO1X_MEM_COMPRESS]; + int inlen, outlen; + int i; + av_log_level = AV_LOG_DEBUG; + lzo1x_999_compress (orig, s, comp, &clen, tmp); + for (i = 0; i < 300; i++) { + START_TIMER inlen = clen; + outlen = MAXSZ; +#ifdef LIBLZO + if (lzo1x_decompress_safe (comp, inlen, decomp, &outlen, NULL)) +#elif defined(LIBLZO_UNSAFE) + if (lzo1x_decompress (comp, inlen, decomp, &outlen, NULL)) +#else + if (lzo1x_decode (decomp, &outlen, comp, &inlen)) +#endif + av_log (NULL, AV_LOG_ERROR, "decompression error\n"); + STOP_TIMER ("lzod") + } + if (memcmp (orig, decomp, s)) + av_log (NULL, AV_LOG_ERROR, "decompression incorrect\n"); + else + av_log (NULL, AV_LOG_ERROR, "decompression ok\n"); + return 0; +} +#endif diff --git a/gst/matroska/lzo.h b/gst/matroska/lzo.h new file mode 100644 index 0000000..e7795f7 --- /dev/null +++ b/gst/matroska/lzo.h @@ -0,0 +1,35 @@ +/* + * LZO 1x decompression + * copyright (c) 2006 Reimar Doeffinger + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef FFMPEG_LZO_H +#define FFMPEG_LZO_H + +#define LZO_INPUT_DEPLETED 1 +#define LZO_OUTPUT_FULL 2 +#define LZO_INVALID_BACKPTR 4 +#define LZO_ERROR 8 + +#define LZO_INPUT_PADDING 8 +#define LZO_OUTPUT_PADDING 12 + +int lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); + +#endif /* FFMPEG_LZO_H */ diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c new file mode 100644 index 0000000..81d1d71 --- /dev/null +++ b/gst/matroska/matroska-demux.c @@ -0,0 +1,6795 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * (c) 2006 Tim-Philipp Müller + * (c) 2008 Sebastian Dröge + * (c) 2011 Debarshi Ray + * + * matroska-demux.c: matroska file/stream demuxer + * + * 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. + */ + +/* TODO: check CRC32 if present + * TODO: there can be a segment after the first segment. Handle like + * chained oggs. Fixes #334082 + * TODO: Test samples: http://www.matroska.org/samples/matrix/index.html + * http://samples.mplayerhq.hu/Matroska/ + * TODO: check if demuxing is done correct for all codecs according to spec + * TODO: seeking with incomplete or without CUE + */ + +/** + * SECTION:element-matroskademux + * + * matroskademux demuxes a Matroska file into the different contained streams. + * + * + * Example launch line + * |[ + * gst-launch -v filesrc location=/path/to/mkv ! matroskademux ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink + * ]| This pipeline demuxes a Matroska file and outputs the contained Vorbis audio. + * + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include +#include + +/* For AVI compatibility mode + and for fourcc stuff */ +#include +#include +#include + +#include + +#include + +#include "matroska-demux.h" +#include "matroska-ids.h" + +GST_DEBUG_CATEGORY_STATIC (matroskademux_debug); +#define GST_CAT_DEFAULT matroskademux_debug + +#define DEBUG_ELEMENT_START(demux, ebml, element) \ + GST_DEBUG_OBJECT (demux, "Parsing " element " element at offset %" \ + G_GUINT64_FORMAT, gst_ebml_read_get_pos (ebml)) + +#define DEBUG_ELEMENT_STOP(demux, ebml, element, ret) \ + GST_DEBUG_OBJECT (demux, "Parsing " element " element " \ + " finished with '%s'", gst_flow_get_name (ret)) + +enum +{ + ARG_0, + ARG_METADATA, + ARG_STREAMINFO, + ARG_MAX_GAP_TIME +}; + +#define DEFAULT_MAX_GAP_TIME (2 * GST_SECOND) + +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska; video/webm") + ); + +/* TODO: fill in caps! */ + +static GstStaticPadTemplate audio_src_templ = +GST_STATIC_PAD_TEMPLATE ("audio_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("ANY") + ); + +static GstStaticPadTemplate video_src_templ = +GST_STATIC_PAD_TEMPLATE ("video_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("ANY") + ); + +static GstStaticPadTemplate subtitle_src_templ = + GST_STATIC_PAD_TEMPLATE ("subtitle_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("text/x-pango-markup; application/x-ssa; " + "application/x-ass;application/x-usf; video/x-dvd-subpicture; " + "subpicture/x-pgs; subtitle/x-kate; " "application/x-subtitle-unknown") + ); + +static GstFlowReturn gst_matroska_demux_parse_id (GstMatroskaDemux * demux, + guint32 id, guint64 length, guint needed); + +/* element functions */ +static void gst_matroska_demux_loop (GstPad * pad); + +static gboolean gst_matroska_demux_element_send_event (GstElement * element, + GstEvent * event); +static gboolean gst_matroska_demux_element_query (GstElement * element, + GstQuery * query); + +/* pad functions */ +static gboolean gst_matroska_demux_sink_activate_pull (GstPad * sinkpad, + gboolean active); +static gboolean gst_matroska_demux_sink_activate (GstPad * sinkpad); + +static gboolean gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux, + GstPad * pad, GstEvent * event); +static gboolean gst_matroska_demux_handle_src_event (GstPad * pad, + GstEvent * event); +static const GstQueryType *gst_matroska_demux_get_src_query_types (GstPad * + pad); +static gboolean gst_matroska_demux_handle_src_query (GstPad * pad, + GstQuery * query); + +static gboolean gst_matroska_demux_handle_sink_event (GstPad * pad, + GstEvent * event); +static GstFlowReturn gst_matroska_demux_chain (GstPad * pad, + GstBuffer * buffer); + +static GstStateChangeReturn +gst_matroska_demux_change_state (GstElement * element, + GstStateChange transition); +static void +gst_matroska_demux_set_index (GstElement * element, GstIndex * index); +static GstIndex *gst_matroska_demux_get_index (GstElement * element); + +/* caps functions */ +static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext + * videocontext, const gchar * codec_id, guint8 * data, guint size, + gchar ** codec_name, guint32 * riff_fourcc); +static GstCaps *gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext + * audiocontext, const gchar * codec_id, guint8 * data, guint size, + gchar ** codec_name, guint16 * riff_audio_fmt); +static GstCaps + * gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext * + subtitlecontext, const gchar * codec_id, gpointer data, guint size); + +/* stream methods */ +static void gst_matroska_demux_reset (GstElement * element); +static gboolean perform_seek_to_offset (GstMatroskaDemux * demux, + guint64 offset); + +/* gobject functions */ +static void gst_matroska_demux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_matroska_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +#ifdef MKV_DEMUX_MODIFICATION +static GstMatroskaIndex *gst_matroska_demux_get_next_index (GstMatroskaDemux * demux, GstMatroskaTrackContext * track, GstMatroskaIndex *entry); +static GstFlowReturn gst_matroska_demux_trickplay_find_tracks (GstMatroskaDemux * demux); +static GstFlowReturn gst_matroska_demux_trickplay_parse_id (GstMatroskaDemux * demux, guint32 id, guint64 length, guint needed); +static GstFlowReturn gst_matroska_demux_trickplay_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, GstEbmlRead * ebml, guint64 cluster_time, guint64 cluster_offset, gboolean is_simpleblock); +static gint32 gst_matroska_demux_trickplay_nframes2show_bw_keyframes (GstMatroskaDemux* demux, GstMatroskaTrackContext * stream); +static GstFlowReturn gst_matroska_demux_backward_trickplay (GstMatroskaDemux* demux, GstMatroskaTrackContext * stream, GstBuffer* sub); +static GstFlowReturn gst_matroska_demux_forward_trickplay (GstMatroskaDemux* demux, GstMatroskaTrackContext * stream, GstBuffer *buffer, gboolean *skip); +static gboolean gst_matroska_demux_create_index_table(GstMatroskaDemux* demux); +#endif + +GType gst_matroska_demux_get_type (void); +GST_BOILERPLATE (GstMatroskaDemux, gst_matroska_demux, GstElement, + GST_TYPE_ELEMENT); + +static void +gst_matroska_demux_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &video_src_templ); + gst_element_class_add_static_pad_template (element_class, &audio_src_templ); + gst_element_class_add_static_pad_template (element_class, + &subtitle_src_templ); + gst_element_class_add_static_pad_template (element_class, &sink_templ); + + gst_element_class_set_details_simple (element_class, "Matroska demuxer", + "Codec/Demuxer", + "Demuxes Matroska/WebM streams into video/audio/subtitles", + "GStreamer maintainers "); +} + +static void +gst_matroska_demux_finalize (GObject * object) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (object); + + if (demux->common.src) { + g_ptr_array_free (demux->common.src, TRUE); + demux->common.src = NULL; + } + + if (demux->common.global_tags) { + gst_tag_list_free (demux->common.global_tags); + demux->common.global_tags = NULL; + } + + g_object_unref (demux->common.adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + + GST_DEBUG_CATEGORY_INIT (matroskademux_debug, "matroskademux", 0, + "Matroska demuxer"); + + gobject_class->finalize = gst_matroska_demux_finalize; + + gobject_class->get_property = gst_matroska_demux_get_property; + gobject_class->set_property = gst_matroska_demux_set_property; + + g_object_class_install_property (gobject_class, ARG_MAX_GAP_TIME, + g_param_spec_uint64 ("max-gap-time", "Maximum gap time", + "The demuxer sends out newsegment events for skipping " + "gaps longer than this (0 = disabled).", 0, G_MAXUINT64, + DEFAULT_MAX_GAP_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_matroska_demux_change_state); + gstelement_class->send_event = + GST_DEBUG_FUNCPTR (gst_matroska_demux_element_send_event); + gstelement_class->query = + GST_DEBUG_FUNCPTR (gst_matroska_demux_element_query); + + gstelement_class->set_index = + GST_DEBUG_FUNCPTR (gst_matroska_demux_set_index); + gstelement_class->get_index = + GST_DEBUG_FUNCPTR (gst_matroska_demux_get_index); +} + +static void +gst_matroska_demux_init (GstMatroskaDemux * demux, + GstMatroskaDemuxClass * klass) +{ + demux->common.sinkpad = gst_pad_new_from_static_template (&sink_templ, + "sink"); + gst_pad_set_activate_function (demux->common.sinkpad, + GST_DEBUG_FUNCPTR (gst_matroska_demux_sink_activate)); + gst_pad_set_activatepull_function (demux->common.sinkpad, + GST_DEBUG_FUNCPTR (gst_matroska_demux_sink_activate_pull)); + gst_pad_set_chain_function (demux->common.sinkpad, + GST_DEBUG_FUNCPTR (gst_matroska_demux_chain)); + gst_pad_set_event_function (demux->common.sinkpad, + GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_sink_event)); + gst_element_add_pad (GST_ELEMENT (demux), demux->common.sinkpad); + + /* initial stream no. */ + demux->common.src = NULL; + + demux->common.writing_app = NULL; + demux->common.muxing_app = NULL; + demux->common.index = NULL; + demux->common.global_tags = NULL; + + demux->common.adapter = gst_adapter_new (); + +#ifdef MKV_DEMUX_MODIFICATION + demux->found_videokeyframe = FALSE; + demux->found_audioframe = FALSE; + demux->is_eos_blockgroup = FALSE; + demux->is_eos_simpleblock = FALSE; + demux->video_keyframe_pushed = FALSE; + demux->seek_head_cluster_info_absent = FALSE; + demux->seek_head_cue_info_absent = FALSE; + demux->index_table_created = TRUE; + demux->index_table_array_creation = FALSE; +#endif + + /* property defaults */ + demux->max_gap_time = DEFAULT_MAX_GAP_TIME; + + /* finish off */ + gst_matroska_demux_reset (GST_ELEMENT (demux)); +} + +static void +gst_matroska_track_free (GstMatroskaTrackContext * track) +{ + g_free (track->codec_id); + g_free (track->codec_name); + g_free (track->name); + g_free (track->language); + g_free (track->codec_priv); + g_free (track->codec_state); + +#ifdef MKV_DEMUX_MODIFICATION + while (!g_queue_is_empty (track->queue)) { + GstBuffer* buf = g_queue_pop_head (track->queue); + gst_buffer_unref (buf); + } + g_queue_free (track->queue); +#endif + + if (track->encodings != NULL) { + int i; + + for (i = 0; i < track->encodings->len; ++i) { + GstMatroskaTrackEncoding *enc = &g_array_index (track->encodings, + GstMatroskaTrackEncoding, + i); + + g_free (enc->comp_settings); + } + g_array_free (track->encodings, TRUE); + } + + if (track->pending_tags) + gst_tag_list_free (track->pending_tags); + + if (track->index_table) + g_array_free (track->index_table, TRUE); + + g_free (track); +} + +/* + * Returns the aggregated GstFlowReturn. + */ +static GstFlowReturn +gst_matroska_demux_combine_flows (GstMatroskaDemux * demux, + GstMatroskaTrackContext * track, GstFlowReturn ret) +{ + guint i; + + /* store the value */ + track->last_flow = ret; + + /* any other error that is not-linked can be returned right away */ + if (ret != GST_FLOW_NOT_LINKED) + goto done; + + /* only return NOT_LINKED if all other pads returned NOT_LINKED */ + g_assert (demux->common.src->len == demux->common.num_streams); + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *ostream = g_ptr_array_index (demux->common.src, + i); + + if (ostream == NULL) + continue; + + ret = ostream->last_flow; + /* some other return value (must be SUCCESS but we can return + * other values as well) */ + if (ret != GST_FLOW_NOT_LINKED) + goto done; + } + /* if we get here, all other pads were unlinked and we return + * NOT_LINKED then */ +done: + GST_LOG_OBJECT (demux, "combined return %s", gst_flow_get_name (ret)); + return ret; +} + +static void +gst_matroska_demux_free_parsed_el (gpointer mem, gpointer user_data) +{ + g_slice_free (guint64, mem); +} + +static void +gst_matroska_demux_reset (GstElement * element) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); + guint i; + + GST_DEBUG_OBJECT (demux, "Resetting state"); + + /* reset input */ + demux->common.state = GST_MATROSKA_READ_STATE_START; + + /* clean up existing streams */ + if (demux->common.src) { + g_assert (demux->common.src->len == demux->common.num_streams); + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src, + i); + + if (context->pad != NULL) + gst_element_remove_pad (GST_ELEMENT (demux), context->pad); + + gst_caps_replace (&context->caps, NULL); + gst_matroska_track_free (context); + } + g_ptr_array_free (demux->common.src, TRUE); + } + demux->common.src = g_ptr_array_new (); + + demux->common.num_streams = 0; + demux->num_a_streams = 0; + demux->num_t_streams = 0; + demux->num_v_streams = 0; + + /* reset media info */ + g_free (demux->common.writing_app); + demux->common.writing_app = NULL; + g_free (demux->common.muxing_app); + demux->common.muxing_app = NULL; + + /* reset indexes */ + if (demux->common.index) { + g_array_free (demux->common.index, TRUE); + demux->common.index = NULL; + } + + if (demux->clusters) { + g_array_free (demux->clusters, TRUE); + demux->clusters = NULL; + } + + /* reset timers */ + demux->clock = NULL; + demux->common.time_scale = 1000000; + demux->common.created = G_MININT64; + + demux->common.index_parsed = FALSE; + demux->tracks_parsed = FALSE; + demux->common.segmentinfo_parsed = FALSE; + demux->common.attachments_parsed = FALSE; + + g_list_foreach (demux->common.tags_parsed, + (GFunc) gst_matroska_demux_free_parsed_el, NULL); + g_list_free (demux->common.tags_parsed); + demux->common.tags_parsed = NULL; + + g_list_foreach (demux->seek_parsed, + (GFunc) gst_matroska_demux_free_parsed_el, NULL); + g_list_free (demux->seek_parsed); + demux->seek_parsed = NULL; + + gst_segment_init (&demux->common.segment, GST_FORMAT_TIME); + demux->last_stop_end = GST_CLOCK_TIME_NONE; + demux->seek_block = 0; + demux->stream_start_time = GST_CLOCK_TIME_NONE; + + demux->common.offset = 0; + demux->cluster_time = GST_CLOCK_TIME_NONE; + demux->cluster_offset = 0; + demux->next_cluster_offset = 0; + demux->index_offset = 0; + demux->seekable = FALSE; + demux->need_newsegment = FALSE; + demux->building_index = FALSE; + if (demux->seek_event) { + gst_event_unref (demux->seek_event); + demux->seek_event = NULL; + } + + demux->seek_index = NULL; + demux->seek_entry = 0; + + if (demux->close_segment) { + gst_event_unref (demux->close_segment); + demux->close_segment = NULL; + } + + if (demux->new_segment) { + gst_event_unref (demux->new_segment); + demux->new_segment = NULL; + } + + if (demux->common.element_index) { + gst_object_unref (demux->common.element_index); + demux->common.element_index = NULL; + } + demux->common.element_index_writer_id = -1; + + if (demux->common.global_tags) { + gst_tag_list_free (demux->common.global_tags); + } + demux->common.global_tags = gst_tag_list_new (); + + if (demux->common.cached_buffer) { + gst_buffer_unref (demux->common.cached_buffer); + demux->common.cached_buffer = NULL; + } + + demux->invalid_duration = FALSE; +} + +static GstBuffer * +gst_matroska_decode_buffer (GstMatroskaTrackContext * context, GstBuffer * buf) +{ + guint8 *data; + guint size; + GstBuffer *new_buf; + + g_return_val_if_fail (GST_IS_BUFFER (buf), NULL); + + GST_DEBUG ("decoding buffer %p", buf); + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + g_return_val_if_fail (data != NULL && size > 0, buf); + + if (gst_matroska_decode_data (context->encodings, &data, &size, + GST_MATROSKA_TRACK_ENCODING_SCOPE_FRAME, FALSE)) { + new_buf = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (new_buf) = (guint8 *) data; + GST_BUFFER_DATA (new_buf) = (guint8 *) data; + GST_BUFFER_SIZE (new_buf) = size; + + gst_buffer_unref (buf); + buf = new_buf; + + return buf; + } else { + GST_DEBUG ("decode data failed"); + gst_buffer_unref (buf); + return NULL; + } +} + +static GstFlowReturn +gst_matroska_demux_add_stream (GstMatroskaDemux * demux, GstEbmlRead * ebml) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux); + GstMatroskaTrackContext *context; + GstPadTemplate *templ = NULL; + GstCaps *caps = NULL; + gchar *padname = NULL; + GstFlowReturn ret; + guint32 id, riff_fourcc = 0; + guint16 riff_audio_fmt = 0; + GstTagList *list = NULL; + gchar *codec = NULL; + + DEBUG_ELEMENT_START (demux, ebml, "TrackEntry"); + + /* start with the master */ + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (demux, ebml, "TrackEntry", ret); + return ret; + } + + /* allocate generic... if we know the type, we'll g_renew() + * with the precise type */ + context = g_new0 (GstMatroskaTrackContext, 1); + g_ptr_array_add (demux->common.src, context); + context->index = demux->common.num_streams; + context->index_writer_id = -1; + context->type = 0; /* no type yet */ + context->default_duration = 0; + context->pos = 0; +#ifdef MKV_DEMUX_MODIFICATION + context->found_next_kframe = FALSE; +#endif + context->set_discont = TRUE; + context->timecodescale = 1.0; + context->flags = + GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT | + GST_MATROSKA_TRACK_LACING; + context->last_flow = GST_FLOW_OK; + context->to_offset = G_MAXINT64; + context->alignment = 1; + demux->common.num_streams++; + g_assert (demux->common.src->len == demux->common.num_streams); + +#ifdef MKV_DEMUX_MODIFICATION + context->queue = g_queue_new (); +// context->found_key_frame = FALSE; + context->last_ts = GST_CLOCK_TIME_NONE; +// context->avg_duration = GST_CLOCK_TIME_NONE; +// context->intra_gap = 0; +#endif + + GST_DEBUG_OBJECT (demux, "Stream number %d", context->index); + + /* try reading the trackentry headers */ + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* track number (unique stream ID) */ + case GST_MATROSKA_ID_TRACKNUMBER:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_ERROR_OBJECT (demux, "Invalid TrackNumber 0"); + ret = GST_FLOW_ERROR; + break; + } else if (!gst_matroska_read_common_tracknumber_unique (&demux->common, + num)) { + GST_ERROR_OBJECT (demux, "TrackNumber %" G_GUINT64_FORMAT + " is not unique", num); + ret = GST_FLOW_ERROR; + break; + } + + GST_DEBUG_OBJECT (demux, "TrackNumber: %" G_GUINT64_FORMAT, num); + context->num = num; + break; + } + /* track UID (unique identifier) */ + case GST_MATROSKA_ID_TRACKUID:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_ERROR_OBJECT (demux, "Invalid TrackUID 0"); + ret = GST_FLOW_ERROR; + break; + } + + GST_DEBUG_OBJECT (demux, "TrackUID: %" G_GUINT64_FORMAT, num); + context->uid = num; + break; + } + + /* track type (video, audio, combined, subtitle, etc.) */ + case GST_MATROSKA_ID_TRACKTYPE:{ + guint64 track_type; + + if ((ret = gst_ebml_read_uint (ebml, &id, &track_type)) != GST_FLOW_OK) { + break; + } + + if (context->type != 0 && context->type != track_type) { + GST_WARNING_OBJECT (demux, + "More than one tracktype defined in a TrackEntry - skipping"); + break; + } else if (track_type < 1 || track_type > 254) { + GST_WARNING_OBJECT (demux, "Invalid TrackType %" G_GUINT64_FORMAT, + track_type); + break; + } + + GST_DEBUG_OBJECT (demux, "TrackType: %" G_GUINT64_FORMAT, track_type); + + /* ok, so we're actually going to reallocate this thing */ + switch (track_type) { + case GST_MATROSKA_TRACK_TYPE_VIDEO: + gst_matroska_track_init_video_context (&context); + break; + case GST_MATROSKA_TRACK_TYPE_AUDIO: + gst_matroska_track_init_audio_context (&context); + break; + case GST_MATROSKA_TRACK_TYPE_SUBTITLE: + gst_matroska_track_init_subtitle_context (&context); + break; + case GST_MATROSKA_TRACK_TYPE_COMPLEX: + case GST_MATROSKA_TRACK_TYPE_LOGO: + case GST_MATROSKA_TRACK_TYPE_BUTTONS: + case GST_MATROSKA_TRACK_TYPE_CONTROL: + default: + GST_WARNING_OBJECT (demux, + "Unknown or unsupported TrackType %" G_GUINT64_FORMAT, + track_type); + context->type = 0; + break; + } + g_ptr_array_index (demux->common.src, demux->common.num_streams - 1) + = context; + break; + } + + /* tracktype specific stuff for video */ + case GST_MATROSKA_ID_TRACKVIDEO:{ + GstMatroskaTrackVideoContext *videocontext; + + DEBUG_ELEMENT_START (demux, ebml, "TrackVideo"); + + if (!gst_matroska_track_init_video_context (&context)) { + GST_WARNING_OBJECT (demux, + "TrackVideo element in non-video track - ignoring track"); + ret = GST_FLOW_ERROR; + break; + } else if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + break; + } + videocontext = (GstMatroskaTrackVideoContext *) context; + g_ptr_array_index (demux->common.src, demux->common.num_streams - 1) + = context; + + while (ret == GST_FLOW_OK && + gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* Should be one level up but some broken muxers write it here. */ + case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (demux, "Invalid TrackDefaultDuration 0"); + break; + } + + GST_DEBUG_OBJECT (demux, + "TrackDefaultDuration: %" G_GUINT64_FORMAT, num); + context->default_duration = num; + break; + } + + /* video framerate */ + /* NOTE: This one is here only for backward compatibility. + * Use _TRACKDEFAULDURATION one level up. */ + case GST_MATROSKA_ID_VIDEOFRAMERATE:{ + gdouble num; + + if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num <= 0.0) { + GST_WARNING_OBJECT (demux, "Invalid TrackVideoFPS %lf", num); + break; + } + + GST_DEBUG_OBJECT (demux, "TrackVideoFrameRate: %lf", num); + if (context->default_duration == 0) + context->default_duration = + gst_gdouble_to_guint64 ((gdouble) GST_SECOND * (1.0 / num)); + videocontext->default_fps = num; + break; + } + + /* width of the size to display the video at */ + case GST_MATROSKA_ID_VIDEODISPLAYWIDTH:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (demux, "Invalid TrackVideoDisplayWidth 0"); + break; + } + + GST_DEBUG_OBJECT (demux, + "TrackVideoDisplayWidth: %" G_GUINT64_FORMAT, num); + videocontext->display_width = num; + break; + } + + /* height of the size to display the video at */ + case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (demux, "Invalid TrackVideoDisplayHeight 0"); + break; + } + + GST_DEBUG_OBJECT (demux, + "TrackVideoDisplayHeight: %" G_GUINT64_FORMAT, num); + videocontext->display_height = num; + break; + } + + /* width of the video in the file */ + case GST_MATROSKA_ID_VIDEOPIXELWIDTH:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (demux, "Invalid TrackVideoPixelWidth 0"); + break; + } + + GST_DEBUG_OBJECT (demux, + "TrackVideoPixelWidth: %" G_GUINT64_FORMAT, num); + videocontext->pixel_width = num; + break; + } + + /* height of the video in the file */ + case GST_MATROSKA_ID_VIDEOPIXELHEIGHT:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (demux, "Invalid TrackVideoPixelHeight 0"); + break; + } + + GST_DEBUG_OBJECT (demux, + "TrackVideoPixelHeight: %" G_GUINT64_FORMAT, num); + videocontext->pixel_height = num; + break; + } + + /* whether the video is interlaced */ + case GST_MATROSKA_ID_VIDEOFLAGINTERLACED:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; + else + context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED; + GST_DEBUG_OBJECT (demux, "TrackVideoInterlaced: %d", + (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) ? 1 : + 0); + break; + } + + /* aspect ratio behaviour */ + case GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE && + num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP && + num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) { + GST_WARNING_OBJECT (demux, + "Unknown TrackVideoAspectRatioType 0x%x", (guint) num); + break; + } + GST_DEBUG_OBJECT (demux, + "TrackVideoAspectRatioType: %" G_GUINT64_FORMAT, num); + videocontext->asr_mode = num; + break; + } + + /* colourspace (only matters for raw video) fourcc */ + case GST_MATROSKA_ID_VIDEOCOLOURSPACE:{ + guint8 *data; + guint64 datalen; + + if ((ret = + gst_ebml_read_binary (ebml, &id, &data, + &datalen)) != GST_FLOW_OK) + break; + + if (datalen != 4) { + g_free (data); + GST_WARNING_OBJECT (demux, + "Invalid TrackVideoColourSpace length %" G_GUINT64_FORMAT, + datalen); + break; + } + + memcpy (&videocontext->fourcc, data, 4); + GST_DEBUG_OBJECT (demux, + "TrackVideoColourSpace: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (videocontext->fourcc)); + g_free (data); + break; + } + + default: + GST_WARNING_OBJECT (demux, + "Unknown TrackVideo subelement 0x%x - ignoring", id); + /* fall through */ + case GST_MATROSKA_ID_VIDEOSTEREOMODE: + case GST_MATROSKA_ID_VIDEODISPLAYUNIT: + case GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM: + case GST_MATROSKA_ID_VIDEOPIXELCROPTOP: + case GST_MATROSKA_ID_VIDEOPIXELCROPLEFT: + case GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT: + case GST_MATROSKA_ID_VIDEOGAMMAVALUE: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (demux, ebml, "TrackVideo", ret); + break; + } + + /* tracktype specific stuff for audio */ + case GST_MATROSKA_ID_TRACKAUDIO:{ + GstMatroskaTrackAudioContext *audiocontext; + + DEBUG_ELEMENT_START (demux, ebml, "TrackAudio"); + + if (!gst_matroska_track_init_audio_context (&context)) { + GST_WARNING_OBJECT (demux, + "TrackAudio element in non-audio track - ignoring track"); + ret = GST_FLOW_ERROR; + break; + } + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) + break; + + audiocontext = (GstMatroskaTrackAudioContext *) context; + g_ptr_array_index (demux->common.src, demux->common.num_streams - 1) + = context; + + while (ret == GST_FLOW_OK && + gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* samplerate */ + case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ:{ + gdouble num; + + if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) + break; + + + if (num <= 0.0) { + GST_WARNING_OBJECT (demux, + "Invalid TrackAudioSamplingFrequency %lf", num); + break; + } + + GST_DEBUG_OBJECT (demux, "TrackAudioSamplingFrequency: %lf", num); + audiocontext->samplerate = num; + break; + } + + /* bitdepth */ + case GST_MATROSKA_ID_AUDIOBITDEPTH:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (demux, "Invalid TrackAudioBitDepth 0"); + break; + } + + GST_DEBUG_OBJECT (demux, "TrackAudioBitDepth: %" G_GUINT64_FORMAT, + num); + audiocontext->bitdepth = num; + break; + } + + /* channels */ + case GST_MATROSKA_ID_AUDIOCHANNELS:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (demux, "Invalid TrackAudioChannels 0"); + break; + } + + GST_DEBUG_OBJECT (demux, "TrackAudioChannels: %" G_GUINT64_FORMAT, + num); + audiocontext->channels = num; + break; + } + + default: + GST_WARNING_OBJECT (demux, + "Unknown TrackAudio subelement 0x%x - ignoring", id); + /* fall through */ + case GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS: + case GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (demux, ebml, "TrackAudio", ret); + + break; + } + + /* codec identifier */ + case GST_MATROSKA_ID_CODECID:{ + gchar *text; + + if ((ret = gst_ebml_read_ascii (ebml, &id, &text)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (demux, "CodecID: %s", GST_STR_NULL (text)); + context->codec_id = text; + break; + } + + /* codec private data */ + case GST_MATROSKA_ID_CODECPRIVATE:{ + guint8 *data; + guint64 size; + + if ((ret = + gst_ebml_read_binary (ebml, &id, &data, &size)) != GST_FLOW_OK) + break; + + context->codec_priv = data; + context->codec_priv_size = size; + + GST_DEBUG_OBJECT (demux, "CodecPrivate of size %" G_GUINT64_FORMAT, + size); + break; + } + + /* name of the codec */ + case GST_MATROSKA_ID_CODECNAME:{ + gchar *text; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (demux, "CodecName: %s", GST_STR_NULL (text)); + context->codec_name = text; + break; + } + + /* name of this track */ + case GST_MATROSKA_ID_TRACKNAME:{ + gchar *text; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + context->name = text; + GST_DEBUG_OBJECT (demux, "TrackName: %s", GST_STR_NULL (text)); + break; + } + + /* language (matters for audio/subtitles, mostly) */ + case GST_MATROSKA_ID_TRACKLANGUAGE:{ + gchar *text; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + + context->language = text; + + /* fre-ca => fre */ + if (strlen (context->language) >= 4 && context->language[3] == '-') + context->language[3] = '\0'; + + GST_DEBUG_OBJECT (demux, "TrackLanguage: %s", + GST_STR_NULL (context->language)); + break; + } + + /* whether this is actually used */ + case GST_MATROSKA_ID_TRACKFLAGENABLED:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_TRACK_ENABLED; + else + context->flags &= ~GST_MATROSKA_TRACK_ENABLED; + + GST_DEBUG_OBJECT (demux, "TrackEnabled: %d", + (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); + break; + } + + /* whether it's the default for this track type */ + case GST_MATROSKA_ID_TRACKFLAGDEFAULT:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_TRACK_DEFAULT; + else + context->flags &= ~GST_MATROSKA_TRACK_DEFAULT; + + GST_DEBUG_OBJECT (demux, "TrackDefault: %d", + (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); + break; + } + + /* whether the track must be used during playback */ + case GST_MATROSKA_ID_TRACKFLAGFORCED:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_TRACK_FORCED; + else + context->flags &= ~GST_MATROSKA_TRACK_FORCED; + + GST_DEBUG_OBJECT (demux, "TrackForced: %d", + (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); + break; + } + + /* lacing (like MPEG, where blocks don't end/start on frame + * boundaries) */ + case GST_MATROSKA_ID_TRACKFLAGLACING:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_TRACK_LACING; + else + context->flags &= ~GST_MATROSKA_TRACK_LACING; + + GST_DEBUG_OBJECT (demux, "TrackLacing: %d", + (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); + break; + } + + /* default length (in time) of one data block in this track */ + case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + + if (num == 0) { + GST_WARNING_OBJECT (demux, "Invalid TrackDefaultDuration 0"); + break; + } + + GST_DEBUG_OBJECT (demux, "TrackDefaultDuration: %" G_GUINT64_FORMAT, + num); + context->default_duration = num; + break; + } + + case GST_MATROSKA_ID_CONTENTENCODINGS:{ + ret = gst_matroska_read_common_read_track_encodings (&demux->common, + ebml, context); + break; + } + + case GST_MATROSKA_ID_TRACKTIMECODESCALE:{ + gdouble num; + + if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num <= 0.0) { + GST_WARNING_OBJECT (demux, "Invalid TrackTimeCodeScale %lf", num); + break; + } + + GST_DEBUG_OBJECT (demux, "TrackTimeCodeScale: %lf", num); + context->timecodescale = num; + break; + } + + default: + GST_WARNING ("Unknown TrackEntry subelement 0x%x - ignoring", id); + /* pass-through */ + + /* we ignore these because they're nothing useful (i.e. crap) + * or simply not implemented yet. */ + case GST_MATROSKA_ID_TRACKMINCACHE: + case GST_MATROSKA_ID_TRACKMAXCACHE: + case GST_MATROSKA_ID_MAXBLOCKADDITIONID: + case GST_MATROSKA_ID_TRACKATTACHMENTLINK: + case GST_MATROSKA_ID_TRACKOVERLAY: + case GST_MATROSKA_ID_TRACKTRANSLATE: + case GST_MATROSKA_ID_TRACKOFFSET: + case GST_MATROSKA_ID_CODECSETTINGS: + case GST_MATROSKA_ID_CODECINFOURL: + case GST_MATROSKA_ID_CODECDOWNLOADURL: + case GST_MATROSKA_ID_CODECDECODEALL: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (demux, ebml, "TrackEntry", ret); + + /* Decode codec private data if necessary */ + if (context->encodings && context->encodings->len > 0 && context->codec_priv + && context->codec_priv_size > 0) { + if (!gst_matroska_decode_data (context->encodings, + &context->codec_priv, &context->codec_priv_size, + GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA, TRUE)) { + GST_WARNING_OBJECT (demux, "Decoding codec private data failed"); + ret = GST_FLOW_ERROR; + } + } + + if (context->type == 0 || context->codec_id == NULL || (ret != GST_FLOW_OK + && ret != GST_FLOW_UNEXPECTED)) { + if (ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED) + GST_WARNING_OBJECT (ebml, "Unknown stream/codec in track entry header"); + + demux->common.num_streams--; + g_ptr_array_remove_index (demux->common.src, demux->common.num_streams); + g_assert (demux->common.src->len == demux->common.num_streams); + if (context) { + gst_matroska_track_free (context); + } + + return ret; + } + + /* now create the GStreamer connectivity */ + switch (context->type) { + case GST_MATROSKA_TRACK_TYPE_VIDEO:{ + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) context; + + padname = g_strdup_printf ("video_%02d", demux->num_v_streams++); + templ = gst_element_class_get_pad_template (klass, "video_%02d"); + caps = gst_matroska_demux_video_caps (videocontext, + context->codec_id, (guint8 *) context->codec_priv, + context->codec_priv_size, &codec, &riff_fourcc); + + if (codec) { + list = gst_tag_list_new (); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_VIDEO_CODEC, codec, NULL); + g_free (codec); + } + break; + } + + case GST_MATROSKA_TRACK_TYPE_AUDIO:{ + GstMatroskaTrackAudioContext *audiocontext = + (GstMatroskaTrackAudioContext *) context; + + padname = g_strdup_printf ("audio_%02d", demux->num_a_streams++); + templ = gst_element_class_get_pad_template (klass, "audio_%02d"); + caps = gst_matroska_demux_audio_caps (audiocontext, + context->codec_id, context->codec_priv, context->codec_priv_size, + &codec, &riff_audio_fmt); + + if (codec) { + list = gst_tag_list_new (); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, codec, NULL); + g_free (codec); + } + break; + } + + case GST_MATROSKA_TRACK_TYPE_SUBTITLE:{ + GstMatroskaTrackSubtitleContext *subtitlecontext = + (GstMatroskaTrackSubtitleContext *) context; + + padname = g_strdup_printf ("subtitle_%02d", demux->num_t_streams++); + templ = gst_element_class_get_pad_template (klass, "subtitle_%02d"); + caps = gst_matroska_demux_subtitle_caps (subtitlecontext, + context->codec_id, context->codec_priv, context->codec_priv_size); + break; + } + + case GST_MATROSKA_TRACK_TYPE_COMPLEX: + case GST_MATROSKA_TRACK_TYPE_LOGO: + case GST_MATROSKA_TRACK_TYPE_BUTTONS: + case GST_MATROSKA_TRACK_TYPE_CONTROL: + default: + /* we should already have quit by now */ + g_assert_not_reached (); + } + + if ((context->language == NULL || *context->language == '\0') && + (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO || + context->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE)) { + GST_LOG ("stream %d: language=eng (assuming default)", context->index); + context->language = g_strdup ("eng"); + } + + if (context->language) { + const gchar *lang; + + if (!list) + list = gst_tag_list_new (); + + /* Matroska contains ISO 639-2B codes, we want ISO 639-1 */ + lang = gst_tag_get_language_code (context->language); + gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, + GST_TAG_LANGUAGE_CODE, (lang) ? lang : context->language, NULL); + } + + if (caps == NULL) { + GST_WARNING_OBJECT (demux, "could not determine caps for stream with " + "codec_id='%s'", context->codec_id); + switch (context->type) { + case GST_MATROSKA_TRACK_TYPE_VIDEO: + caps = gst_caps_new_simple ("video/x-unknown", NULL); + break; + case GST_MATROSKA_TRACK_TYPE_AUDIO: + caps = gst_caps_new_simple ("audio/x-unknown", NULL); + break; + case GST_MATROSKA_TRACK_TYPE_SUBTITLE: + caps = gst_caps_new_simple ("application/x-subtitle-unknown", NULL); + break; + case GST_MATROSKA_TRACK_TYPE_COMPLEX: + default: + caps = gst_caps_new_simple ("application/x-matroska-unknown", NULL); + break; + } + gst_caps_set_simple (caps, "codec-id", G_TYPE_STRING, context->codec_id, + NULL); + + /* add any unrecognised riff fourcc / audio format, but after codec-id */ + if (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO && riff_audio_fmt != 0) + gst_caps_set_simple (caps, "format", G_TYPE_INT, riff_audio_fmt, NULL); + else if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO && riff_fourcc != 0) + gst_caps_set_simple (caps, "fourcc", GST_TYPE_FOURCC, riff_fourcc, NULL); + } + + /* the pad in here */ + context->pad = gst_pad_new_from_template (templ, padname); + context->caps = caps; + + gst_pad_set_event_function (context->pad, + GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_src_event)); + gst_pad_set_query_type_function (context->pad, + GST_DEBUG_FUNCPTR (gst_matroska_demux_get_src_query_types)); + gst_pad_set_query_function (context->pad, + GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_src_query)); + + GST_INFO_OBJECT (demux, "Adding pad '%s' with caps %" GST_PTR_FORMAT, + padname, caps); + + context->pending_tags = list; + + gst_pad_set_element_private (context->pad, context); + + gst_pad_use_fixed_caps (context->pad); + gst_pad_set_caps (context->pad, context->caps); + gst_pad_set_active (context->pad, TRUE); + gst_element_add_pad (GST_ELEMENT (demux), context->pad); + + g_free (padname); + +#ifdef MKV_DEMUX_MODIFICATION + if (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO) + demux->audio_stream = context; + if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) + demux->video = TRUE; +#endif + + /* tadaah! */ + return ret; +} + +static const GstQueryType * +gst_matroska_demux_get_src_query_types (GstPad * pad) +{ + static const GstQueryType query_types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_SEEKING, + 0 + }; + + return query_types; +} + +static gboolean +gst_matroska_demux_query (GstMatroskaDemux * demux, GstPad * pad, + GstQuery * query) +{ + gboolean res = FALSE; + GstMatroskaTrackContext *context = NULL; + + if (pad) { + context = gst_pad_get_element_private (pad); + } + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + + gst_query_parse_position (query, &format, NULL); + + if (format == GST_FORMAT_TIME) { + GST_OBJECT_LOCK (demux); + if (context) + gst_query_set_position (query, GST_FORMAT_TIME, + MAX (context->pos, demux->stream_start_time) - + demux->stream_start_time); + else + gst_query_set_position (query, GST_FORMAT_TIME, + MAX (demux->common.segment.last_stop, demux->stream_start_time) - + demux->stream_start_time); + GST_OBJECT_UNLOCK (demux); + } else if (format == GST_FORMAT_DEFAULT && context + && context->default_duration) { + GST_OBJECT_LOCK (demux); + gst_query_set_position (query, GST_FORMAT_DEFAULT, + context->pos / context->default_duration); + GST_OBJECT_UNLOCK (demux); + } else { + GST_DEBUG_OBJECT (demux, + "only position query in TIME and DEFAULT format is supported"); + } + + res = TRUE; + break; + } + case GST_QUERY_DURATION: + { + GstFormat format; + + gst_query_parse_duration (query, &format, NULL); + + if (format == GST_FORMAT_TIME) { + GST_OBJECT_LOCK (demux); + gst_query_set_duration (query, GST_FORMAT_TIME, + demux->common.segment.duration); + GST_OBJECT_UNLOCK (demux); + } else if (format == GST_FORMAT_DEFAULT && context + && context->default_duration) { + GST_OBJECT_LOCK (demux); + gst_query_set_duration (query, GST_FORMAT_DEFAULT, + demux->common.segment.duration / context->default_duration); + GST_OBJECT_UNLOCK (demux); + } else { + GST_DEBUG_OBJECT (demux, + "only duration query in TIME and DEFAULT format is supported"); + } + + res = TRUE; + break; + } + + case GST_QUERY_SEEKING: + { + GstFormat fmt; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + GST_OBJECT_LOCK (demux); + if (fmt == GST_FORMAT_TIME) { + gboolean seekable; + + if (demux->streaming) { + /* assuming we'll be able to get an index ... */ + seekable = demux->seekable; + } else { + seekable = TRUE; + } + + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, + 0, demux->common.segment.duration); + res = TRUE; + } + GST_OBJECT_UNLOCK (demux); + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + + return res; +} + +static gboolean +gst_matroska_demux_element_query (GstElement * element, GstQuery * query) +{ + return gst_matroska_demux_query (GST_MATROSKA_DEMUX (element), NULL, query); +} + +static gboolean +gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query) +{ + gboolean ret; + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); + + ret = gst_matroska_demux_query (demux, pad, query); + + gst_object_unref (demux); + + return ret; +} + +/* returns FALSE if there are no pads to deliver event to, + * otherwise TRUE (whatever the outcome of event sending), + * takes ownership of the passed event! */ +static gboolean +gst_matroska_demux_send_event (GstMatroskaDemux * demux, GstEvent * event) +{ + gboolean is_newsegment; + gboolean ret = FALSE; + gint i; + + g_return_val_if_fail (event != NULL, FALSE); + + GST_DEBUG_OBJECT (demux, "Sending event of type %s to all source pads", + GST_EVENT_TYPE_NAME (event)); + + is_newsegment = (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT); + + g_assert (demux->common.src->len == demux->common.num_streams); + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *stream; + + stream = g_ptr_array_index (demux->common.src, i); + gst_event_ref (event); + gst_pad_push_event (stream->pad, event); + ret = TRUE; + + /* FIXME: send global tags before stream tags */ + if (G_UNLIKELY (is_newsegment && stream->pending_tags != NULL)) { + GST_DEBUG_OBJECT (demux, "Sending pending_tags %p for pad %s:%s : %" + GST_PTR_FORMAT, stream->pending_tags, + GST_DEBUG_PAD_NAME (stream->pad), stream->pending_tags); + gst_element_found_tags_for_pad (GST_ELEMENT (demux), stream->pad, + stream->pending_tags); + stream->pending_tags = NULL; + } + } + + if (G_UNLIKELY (is_newsegment && demux->common.global_tags != NULL)) { + gst_tag_list_add (demux->common.global_tags, GST_TAG_MERGE_REPLACE, + GST_TAG_CONTAINER_FORMAT, "Matroska", NULL); + GST_DEBUG_OBJECT (demux, "Sending global_tags %p : %" GST_PTR_FORMAT, + demux->common.global_tags, demux->common.global_tags); + gst_element_found_tags (GST_ELEMENT (demux), demux->common.global_tags); + demux->common.global_tags = NULL; + } + + gst_event_unref (event); + return ret; +} + +static gboolean +gst_matroska_demux_element_send_event (GstElement * element, GstEvent * event) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); + gboolean res; + + g_return_val_if_fail (event != NULL, FALSE); + + if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { + res = gst_matroska_demux_handle_seek_event (demux, NULL, event); + } else { + GST_WARNING_OBJECT (demux, "Unhandled event of type %s", + GST_EVENT_TYPE_NAME (event)); + res = FALSE; + } + gst_event_unref (event); + return res; +} + +static gboolean +gst_matroska_demux_move_to_entry (GstMatroskaDemux * demux, + GstMatroskaIndex * entry, gboolean reset) +{ + gint i; + + GST_OBJECT_LOCK (demux); + + /* seek (relative to matroska segment) */ + /* position might be invalid; will error when streaming resumes ... */ + demux->common.offset = entry->pos + demux->common.ebml_segment_start; + + GST_DEBUG_OBJECT (demux, "Seeked to offset %" G_GUINT64_FORMAT ", block %d, " + "time %" GST_TIME_FORMAT, entry->pos + demux->common.ebml_segment_start, + entry->block, GST_TIME_ARGS (entry->time)); + + /* update the time */ + gst_matroska_read_common_reset_streams (&demux->common, entry->time, TRUE); + demux->common.segment.last_stop = entry->time; + demux->seek_block = entry->block; + demux->seek_first = TRUE; + demux->last_stop_end = GST_CLOCK_TIME_NONE; + + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i); + + if (reset) { + stream->to_offset = G_MAXINT64; + } else { + if (stream->from_offset != -1) + stream->to_offset = stream->from_offset; + } + stream->from_offset = -1; + } + + GST_OBJECT_UNLOCK (demux); + + return TRUE; +} + +static gint +gst_matroska_cluster_compare (gint64 * i1, gint64 * i2) +{ + if (*i1 < *i2) + return -1; + else if (*i1 > *i2) + return 1; + else + return 0; +} + +/* searches for a cluster start from @pos, + * return GST_FLOW_OK and cluster position in @pos if found */ +static GstFlowReturn +gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos) +{ + gint64 newpos = *pos; + gint64 orig_offset; + GstFlowReturn ret = GST_FLOW_OK; + const guint chunk = 64 * 1024; + GstBuffer *buf = NULL; + guint64 length; + guint32 id; + guint needed; + + orig_offset = demux->common.offset; + + GST_LOG_OBJECT (demux, "searching cluster following offset %" G_GINT64_FORMAT, + *pos); + + if (demux->clusters) { + gint64 *cpos; + + cpos = gst_util_array_binary_search (demux->clusters->data, + demux->clusters->len, sizeof (gint64), + (GCompareDataFunc) gst_matroska_cluster_compare, + GST_SEARCH_MODE_AFTER, pos, NULL); + /* sanity check */ + if (cpos) { + GST_DEBUG_OBJECT (demux, + "cluster reported at offset %" G_GINT64_FORMAT, *cpos); + demux->common.offset = *cpos; + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (ret == GST_FLOW_OK && id == GST_MATROSKA_ID_CLUSTER) { + newpos = *cpos; + goto exit; + } + } + } + + /* read in at newpos and scan for ebml cluster id */ + while (1) { + GstByteReader reader; + gint cluster_pos; + + if (buf != NULL) { + gst_buffer_unref (buf); + buf = NULL; + } + ret = gst_pad_pull_range (demux->common.sinkpad, newpos, chunk, &buf); + if (ret != GST_FLOW_OK) + break; + GST_DEBUG_OBJECT (demux, "read buffer size %d at offset %" G_GINT64_FORMAT, + GST_BUFFER_SIZE (buf), newpos); + gst_byte_reader_init_from_buffer (&reader, buf); + resume: + cluster_pos = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff, + GST_MATROSKA_ID_CLUSTER, 0, gst_byte_reader_get_remaining (&reader)); + if (cluster_pos >= 0) { + newpos += cluster_pos; + /* prepare resuming at next byte */ + gst_byte_reader_skip (&reader, cluster_pos + 1); + GST_DEBUG_OBJECT (demux, + "found cluster ebml id at offset %" G_GINT64_FORMAT, newpos); + /* extra checks whether we really sync'ed to a cluster: + * - either it is the first and only cluster + * - either there is a cluster after this one + * - either cluster length is undefined + */ + /* ok if first cluster (there may not a subsequent one) */ + if (newpos == demux->first_cluster_offset) { + GST_DEBUG_OBJECT (demux, "cluster is first cluster -> OK"); + break; + } + demux->common.offset = newpos; + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (demux, "need more data -> continue"); + continue; + } + g_assert (id == GST_MATROSKA_ID_CLUSTER); + GST_DEBUG_OBJECT (demux, "cluster size %" G_GUINT64_FORMAT ", prefix %d", + length, needed); + /* ok if undefined length or first cluster */ + if (length == GST_EBML_SIZE_UNKNOWN || length == G_MAXUINT64) { + GST_DEBUG_OBJECT (demux, "cluster has undefined length -> OK"); + break; + } + /* skip cluster */ + demux->common.offset += length + needed; + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (ret != GST_FLOW_OK) + goto resume; + GST_DEBUG_OBJECT (demux, "next element is %scluster", + id == GST_MATROSKA_ID_CLUSTER ? "" : "not "); + if (id == GST_MATROSKA_ID_CLUSTER) + break; + /* not ok, resume */ + goto resume; + } else { + /* partial cluster id may have been in tail of buffer */ + newpos += MAX (gst_byte_reader_get_remaining (&reader), 4) - 3; + } + } + + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + +exit: + demux->common.offset = orig_offset; + *pos = newpos; + return ret; +} + +/* bisect and scan through file for cluster starting before @time, + * returns fake index entry with corresponding info on cluster */ +static GstMatroskaIndex * +gst_matroska_demux_search_pos (GstMatroskaDemux * demux, GstClockTime time) +{ + GstMatroskaIndex *entry = NULL; + GstMatroskaReadState current_state; + GstClockTime otime, prev_cluster_time, current_cluster_time, cluster_time; + gint64 opos, newpos, startpos = 0, current_offset; + gint64 prev_cluster_offset = -1, current_cluster_offset, cluster_offset; + const guint chunk = 64 * 1024; + GstFlowReturn ret; + guint64 length; + guint32 id; + guint needed; + + /* (under)estimate new position, resync using cluster ebml id, + * and scan forward to appropriate cluster + * (and re-estimate if need to go backward) */ + + prev_cluster_time = GST_CLOCK_TIME_NONE; + + /* store some current state */ + current_state = demux->common.state; + g_return_val_if_fail (current_state == GST_MATROSKA_READ_STATE_DATA, NULL); + + current_cluster_offset = demux->cluster_offset; + current_cluster_time = demux->cluster_time; + current_offset = demux->common.offset; + + demux->common.state = GST_MATROSKA_READ_STATE_SCANNING; + + /* estimate using start and current position */ + GST_OBJECT_LOCK (demux); + opos = demux->common.offset - demux->common.ebml_segment_start; + otime = demux->common.segment.last_stop; + GST_OBJECT_UNLOCK (demux); + + /* sanitize */ + time = MAX (time, demux->stream_start_time); + + /* avoid division by zero in first estimation below */ + if (otime <= demux->stream_start_time) + otime = time; + +retry: + GST_LOG_OBJECT (demux, + "opos: %" G_GUINT64_FORMAT ", otime: %" GST_TIME_FORMAT ", %" + GST_TIME_FORMAT " in stream time (start %" GST_TIME_FORMAT "), time %" + GST_TIME_FORMAT, opos, GST_TIME_ARGS (otime), + GST_TIME_ARGS (otime - demux->stream_start_time), + GST_TIME_ARGS (demux->stream_start_time), GST_TIME_ARGS (time)); + newpos = + gst_util_uint64_scale (opos - demux->common.ebml_segment_start, + time - demux->stream_start_time, + otime - demux->stream_start_time) - chunk; + if (newpos < 0) + newpos = 0; + /* favour undershoot */ + newpos = newpos * 90 / 100; + newpos += demux->common.ebml_segment_start; + + GST_DEBUG_OBJECT (demux, + "estimated offset for %" GST_TIME_FORMAT ": %" G_GINT64_FORMAT, + GST_TIME_ARGS (time), newpos); + + /* and at least start scanning before previous scan start to avoid looping */ + startpos = startpos * 90 / 100; + if (startpos && startpos < newpos) + newpos = startpos; + + /* read in at newpos and scan for ebml cluster id */ + startpos = newpos; + while (1) { + + ret = gst_matroska_demux_search_cluster (demux, &newpos); + if (ret == GST_FLOW_UNEXPECTED) { + /* heuristic HACK */ + newpos = startpos * 80 / 100; + GST_DEBUG_OBJECT (demux, "EOS; " + "new estimated offset for %" GST_TIME_FORMAT ": %" G_GINT64_FORMAT, + GST_TIME_ARGS (time), newpos); + startpos = newpos; + continue; + } else if (ret != GST_FLOW_OK) { + goto exit; + } else { + break; + } + } + + /* then start scanning and parsing for cluster time, + * re-estimate if overshoot, otherwise next cluster and so on */ + demux->common.offset = newpos; + demux->cluster_time = cluster_time = GST_CLOCK_TIME_NONE; + while (1) { + guint64 cluster_size = 0; + + /* peek and parse some elements */ + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (ret != GST_FLOW_OK) + goto error; + GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", needed %d", demux->common.offset, id, + length, needed); + ret = gst_matroska_demux_parse_id (demux, id, length, needed); + if (ret != GST_FLOW_OK) + goto error; + + if (id == GST_MATROSKA_ID_CLUSTER) { + cluster_time = GST_CLOCK_TIME_NONE; + if (length == G_MAXUINT64) + cluster_size = 0; + else + cluster_size = length + needed; + } + if (demux->cluster_time != GST_CLOCK_TIME_NONE && + cluster_time == GST_CLOCK_TIME_NONE) { + cluster_time = demux->cluster_time * demux->common.time_scale; + cluster_offset = demux->cluster_offset; + GST_DEBUG_OBJECT (demux, "found cluster at offset %" G_GINT64_FORMAT + " with time %" GST_TIME_FORMAT, cluster_offset, + GST_TIME_ARGS (cluster_time)); + if (cluster_time > time) { + GST_DEBUG_OBJECT (demux, "overshot target"); + /* cluster overshoots */ + if (cluster_offset == demux->first_cluster_offset) { + /* but no prev one */ + GST_DEBUG_OBJECT (demux, "but using first cluster anyway"); + prev_cluster_time = cluster_time; + prev_cluster_offset = cluster_offset; + break; + } + if (prev_cluster_time != GST_CLOCK_TIME_NONE) { + /* prev cluster did not overshoot, so prev cluster is target */ + break; + } else { + /* re-estimate using this new position info */ + opos = cluster_offset; + otime = cluster_time; + goto retry; + } + } else { + /* cluster undershoots, goto next one */ + prev_cluster_time = cluster_time; + prev_cluster_offset = cluster_offset; + /* skip cluster if length is defined, + * otherwise will be skippingly parsed into */ + if (cluster_size) { + GST_DEBUG_OBJECT (demux, "skipping to next cluster"); + demux->common.offset = cluster_offset + cluster_size; + demux->cluster_time = GST_CLOCK_TIME_NONE; + } else { + GST_DEBUG_OBJECT (demux, "parsing/skipping cluster elements"); + } + } + } + continue; + + error: + if (ret == GST_FLOW_UNEXPECTED) { + if (prev_cluster_time != GST_CLOCK_TIME_NONE) + break; + } + goto exit; + } + + entry = g_new0 (GstMatroskaIndex, 1); + entry->time = prev_cluster_time; + entry->pos = prev_cluster_offset - demux->common.ebml_segment_start; + GST_DEBUG_OBJECT (demux, "simulated index entry; time %" GST_TIME_FORMAT + ", pos %" G_GUINT64_FORMAT, GST_TIME_ARGS (entry->time), entry->pos); + +exit: + + /* restore some state */ + demux->cluster_offset = current_cluster_offset; + demux->cluster_time = current_cluster_time; + demux->common.offset = current_offset; + demux->common.state = current_state; + + return entry; +} + +static gboolean +gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux, + GstPad * pad, GstEvent * event) +{ + GstMatroskaIndex *entry = NULL; + GstMatroskaIndex scan_entry; +#ifdef MKV_DEMUX_MODIFICATION + GstMatroskaIndex *next_entry = NULL; +#endif + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + GstFormat format; + gboolean flush, keyunit; + gdouble rate; + gint64 cur, stop; + GstMatroskaTrackContext *track = NULL; + GstSegment seeksegment = { 0, }; + gboolean update = TRUE; + + if (pad) + track = gst_pad_get_element_private (pad); + + gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, + &stop_type, &stop); + + /* we can only seek on time */ + if (format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (demux, "Can only seek on TIME"); + return FALSE; + } + +#ifndef MKV_DEMUX_MODIFICATION + /* cannot yet do backwards playback */ + if (rate <= 0.0) { + GST_DEBUG_OBJECT (demux, "Can only seek with positive rate"); + return FALSE; + } +#endif + + /* copy segment, we need this because we still need the old + * segment when we close the current segment. */ + memcpy (&seeksegment, &demux->common.segment, sizeof (GstSegment)); + +#ifdef MKV_DEMUX_MODIFICATION + gst_segment_set_last_stop (&seeksegment, GST_FORMAT_TIME, cur); +#endif + + /* pull mode without index means that the actual duration is not known, + * we might be playing a file that's still being recorded + * so, invalidate our current duration, which is only a moving target, + * and should not be used to clamp anything */ + if (!demux->streaming && !demux->common.index && + demux->invalid_duration) { + gst_segment_set_duration (&seeksegment, GST_FORMAT_TIME, + GST_CLOCK_TIME_NONE); + } + + if (event) { + GST_DEBUG_OBJECT (demux, "configuring seek"); + gst_segment_set_seek (&seeksegment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + /* compensate for clip start time */ + if (GST_CLOCK_TIME_IS_VALID (demux->stream_start_time)) { + seeksegment.last_stop += demux->stream_start_time; + seeksegment.start += demux->stream_start_time; + if (GST_CLOCK_TIME_IS_VALID (seeksegment.stop)) + seeksegment.stop += demux->stream_start_time; + /* note that time should stay at indicated position */ + } + } + + /* restore segment duration (if any effect), + * would be determined again when parsing, but anyway ... */ +#ifndef MKV_DEMUX_MODIFICATION + gst_segment_set_duration (&seeksegment, GST_FORMAT_TIME, + demux->common.segment.duration); +#endif + + flush = ! !(flags & GST_SEEK_FLAG_FLUSH); + keyunit = ! !(flags & GST_SEEK_FLAG_KEY_UNIT); + + GST_DEBUG_OBJECT (demux, "New segment %" GST_SEGMENT_FORMAT, &seeksegment); + +#ifndef MKV_DEMUX_MODIFICATION + if (!update) { + /* only have to update some segment, + * but also still have to honour flush and so on */ + GST_DEBUG_OBJECT (demux, "... no update"); + /* bad goto, bad ... */ + goto next; + } +#endif + + /* check sanity before we start flushing and all that */ + GST_OBJECT_LOCK (demux); + track = gst_matroska_read_common_get_seek_track (&demux->common, track); + if ((entry = gst_matroska_read_common_do_index_seek (&demux->common, track, + seeksegment.last_stop, &demux->seek_index, &demux->seek_entry)) == + NULL) { + /* pull mode without index can scan later on */ + if (demux->streaming) { + GST_DEBUG_OBJECT (demux, "No matching seek entry in index"); + GST_OBJECT_UNLOCK (demux); + return FALSE; + } +#ifdef MKV_DEMUX_MODIFICATION + } else { + GST_INFO_OBJECT (demux, "Entry Details are"); + GST_INFO_OBJECT (demux, "entry->block %u", (guint)entry->block); + GST_INFO_OBJECT (demux, "entry->pos %"G_GUINT64_FORMAT, entry->pos); + GST_INFO_OBJECT (demux, "entry->time %"GST_TIME_FORMAT, GST_TIME_ARGS(entry->time)); + GST_INFO_OBJECT (demux, "entry->track %u", (guint)entry->track); +#endif + } + +#ifdef MKV_DEMUX_MODIFICATION + if (entry == NULL) { + GST_OBJECT_UNLOCK (demux); + return FALSE; + } + + if (seeksegment.rate < 0.0) { + GST_INFO("Current Index is %"GST_TIME_FORMAT, GST_TIME_ARGS(entry->time)); + next_entry = gst_matroska_demux_get_next_index (demux, track, entry); + if (next_entry == NULL) { + GST_ERROR ("Entry Not found...."); + GST_OBJECT_UNLOCK (demux); + return FALSE; + } + GST_INFO("Next Index is %"GST_TIME_FORMAT, GST_TIME_ARGS(next_entry->time)); + } +#endif + + GST_DEBUG_OBJECT (demux, "Seek position looks sane"); + GST_OBJECT_UNLOCK (demux); + + if (demux->streaming) { + /* need to seek to cluster start to pick up cluster time */ + /* upstream takes care of flushing and all that + * ... and newsegment event handling takes care of the rest */ + return perform_seek_to_offset (demux, + entry->pos + demux->common.ebml_segment_start); + } + +#ifdef MKV_DEMUX_MODIFICATION + keyunit = TRUE;//intentionally making it as true. need to check +#endif + +next: + if (flush) { + GST_DEBUG_OBJECT (demux, "Starting flush"); + gst_pad_push_event (demux->common.sinkpad, gst_event_new_flush_start ()); + gst_matroska_demux_send_event (demux, gst_event_new_flush_start ()); + } else { + GST_DEBUG_OBJECT (demux, "Non-flushing seek, pausing task"); + gst_pad_pause_task (demux->common.sinkpad); + } + +#ifndef MKV_DEMUX_MODIFICATION + /* ouch */ + if (!update) + goto exit; +#endif + + /* now grab the stream lock so that streaming cannot continue, for + * non flushing seeks when the element is in PAUSED this could block + * forever. */ + GST_DEBUG_OBJECT (demux, "Waiting for streaming to stop"); + GST_PAD_STREAM_LOCK (demux->common.sinkpad); + + /* pull mode without index can do some scanning */ + if (!demux->streaming && !entry) { + /* need to stop flushing upstream as we need it next */ + if (flush) + gst_pad_push_event (demux->common.sinkpad, gst_event_new_flush_stop ()); + entry = gst_matroska_demux_search_pos (demux, seeksegment.last_stop); + /* keep local copy */ + if (entry) { + scan_entry = *entry; + g_free (entry); + entry = &scan_entry; + } else { + GST_DEBUG_OBJECT (demux, "Scan failed to find matching position"); + if (flush) + gst_matroska_demux_send_event (demux, gst_event_new_flush_stop ()); + goto seek_error; + } + } + + if (keyunit) { + GST_DEBUG_OBJECT (demux, "seek to key unit, adjusting segment start to %" + GST_TIME_FORMAT, GST_TIME_ARGS (entry->time)); +#ifdef MKV_DEMUX_MODIFICATION + if (seeksegment.stop == -1) { + seeksegment.stop = seeksegment.duration; + } + if (seeksegment.rate > 0.0) { + seeksegment.start = cur; + seeksegment.time = cur; + seeksegment.last_stop = cur; + seeksegment.stop = seeksegment.duration; + } else if (seeksegment.rate < 0.0) {/* Reverse trick play */ + seeksegment.start = 0.0; + seeksegment.stop = next_entry->time; + seeksegment.last_stop = cur + GST_MSECOND; + seeksegment.time = 0.0; + demux->next_keyframe_ts = cur; + GST_INFO("next_keyframe_ts %"GST_TIME_FORMAT, GST_TIME_ARGS(demux->next_keyframe_ts)); + } +#else + seeksegment.start = MAX (entry->time, demux->stream_start_time); + seeksegment.last_stop = seeksegment.start; + seeksegment.time = seeksegment.start - demux->stream_start_time; +#endif + } + +exit: + if (flush) { + GST_DEBUG_OBJECT (demux, "Stopping flush"); + gst_pad_push_event (demux->common.sinkpad, gst_event_new_flush_stop ()); + gst_matroska_demux_send_event (demux, gst_event_new_flush_stop ()); +#ifdef MKV_DEMUX_MODIFICATION + } else if (demux->segment_running) { +#else + } else if (demux->segment_running && update) { +#endif + GST_DEBUG_OBJECT (demux, "Closing currently running segment"); + + GST_OBJECT_LOCK (demux); + if (demux->close_segment) + gst_event_unref (demux->close_segment); + + demux->close_segment = gst_event_new_new_segment (TRUE, + demux->common.segment.rate, GST_FORMAT_TIME, + demux->common.segment.start, demux->common.segment.last_stop, + demux->common.segment.time); + GST_OBJECT_UNLOCK (demux); + } + + GST_OBJECT_LOCK (demux); + /* now update the real segment info */ + GST_DEBUG_OBJECT (demux, "Committing new seek segment"); + memcpy (&demux->common.segment, &seeksegment, sizeof (GstSegment)); + GST_OBJECT_UNLOCK (demux); + + /* update some (segment) state */ +#ifdef MKV_DEMUX_MODIFICATION + if (!gst_matroska_demux_move_to_entry (demux, entry, TRUE)) +#else + if (update && !gst_matroska_demux_move_to_entry (demux, entry, TRUE)) +#endif + goto seek_error; + + /* notify start of new segment */ + if (demux->common.segment.flags & GST_SEEK_FLAG_SEGMENT) { + GstMessage *msg; + + msg = gst_message_new_segment_start (GST_OBJECT (demux), + GST_FORMAT_TIME, demux->common.segment.start); + gst_element_post_message (GST_ELEMENT (demux), msg); + } + + GST_OBJECT_LOCK (demux); + if (demux->new_segment) + gst_event_unref (demux->new_segment); +#ifdef MKV_DEMUX_MODIFICATION + if (demux->common.segment.rate > 0.0) { + demux->new_segment = gst_event_new_new_segment_full (FALSE, + demux->common.segment.rate, demux->common.segment.applied_rate, + demux->common.segment.format, seeksegment.last_stop, + demux->common.segment.stop, demux->common.segment.time); + + } else if (demux->common.segment.rate < 0.0) { + /* Reverse trick play */ + demux->new_segment = gst_event_new_new_segment_full (FALSE, + demux->common.segment.rate, demux->common.segment.applied_rate, + demux->common.segment.format, demux->common.segment.start, + seeksegment.last_stop, demux->common.segment.time); + } +#else + demux->new_segment = gst_event_new_new_segment_full (!update, + demux->common.segment.rate, demux->common.segment.applied_rate, + demux->common.segment.format, demux->common.segment.start, + demux->common.segment.stop, demux->common.segment.time); +#endif + GST_OBJECT_UNLOCK (demux); + +#ifdef MKV_DEMUX_MODIFICATION + if (demux->common.segment.rate > 0.0) { + demux->common.segment.last_stop = entry->time; + } else if (demux->common.segment.rate < 0.0) { + demux->common.segment.last_stop = next_entry->time; + } +#endif + + /* restart our task since it might have been stopped when we did the + * flush. */ + demux->segment_running = TRUE; + gst_pad_start_task (demux->common.sinkpad, + (GstTaskFunction) gst_matroska_demux_loop, demux->common.sinkpad); + +#ifdef MKV_DEMUX_MODIFICATION + while (!g_queue_is_empty (track->queue)) { + GstBuffer* buf = g_queue_pop_head (track->queue); + gst_buffer_unref (buf); + } +#endif + + /* streaming can continue now */ + GST_PAD_STREAM_UNLOCK (demux->common.sinkpad); + + return TRUE; + +seek_error: + { + GST_PAD_STREAM_UNLOCK (demux->common.sinkpad); + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Got a seek error")); + return FALSE; + } +} + +/* + * Handle whether we can perform the seek event or if we have to let the chain + * function handle seeks to build the seek indexes first. + */ +static gboolean +gst_matroska_demux_handle_seek_push (GstMatroskaDemux * demux, GstPad * pad, + GstEvent * event) +{ + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + GstFormat format; + gdouble rate; + gint64 cur, stop; + + gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, + &stop_type, &stop); + + /* sanity checks */ + + /* we can only seek on time */ + if (format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (demux, "Can only seek on TIME"); + return FALSE; + } + + if (stop_type != GST_SEEK_TYPE_NONE && stop != GST_CLOCK_TIME_NONE) { + GST_DEBUG_OBJECT (demux, "Seek end-time not supported in streaming mode"); + return FALSE; + } + + if (!(flags & GST_SEEK_FLAG_FLUSH)) { + GST_DEBUG_OBJECT (demux, + "Non-flushing seek not supported in streaming mode"); + return FALSE; + } + + if (flags & GST_SEEK_FLAG_SEGMENT) { + GST_DEBUG_OBJECT (demux, "Segment seek not supported in streaming mode"); + return FALSE; + } + + /* check for having parsed index already */ + if (!demux->common.index_parsed) { + gboolean building_index; + guint64 offset = 0; + + if (!demux->index_offset) { + GST_DEBUG_OBJECT (demux, "no index (location); no seek in push mode"); + return FALSE; + } + + GST_OBJECT_LOCK (demux); + /* handle the seek event in the chain function */ + demux->common.state = GST_MATROSKA_READ_STATE_SEEK; + /* no more seek can be issued until state reset to _DATA */ + + /* copy the event */ + if (demux->seek_event) + gst_event_unref (demux->seek_event); + demux->seek_event = gst_event_ref (event); + + /* set the building_index flag so that only one thread can setup the + * structures for index seeking. */ + building_index = demux->building_index; + if (!building_index) { + demux->building_index = TRUE; + offset = demux->index_offset; + } + GST_OBJECT_UNLOCK (demux); + + if (!building_index) { + /* seek to the first subindex or legacy index */ + GST_INFO_OBJECT (demux, "Seeking to Cues at %" G_GUINT64_FORMAT, offset); + return perform_seek_to_offset (demux, offset); + } + + /* well, we are handling it already */ + return TRUE; + } + + /* delegate to tweaked regular seek */ + return gst_matroska_demux_handle_seek_event (demux, pad, event); +} + +static gboolean +gst_matroska_demux_handle_src_event (GstPad * pad, GstEvent * event) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); + gboolean res = TRUE; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + /* no seeking until we are (safely) ready */ + if (demux->common.state != GST_MATROSKA_READ_STATE_DATA) { + GST_DEBUG_OBJECT (demux, "not ready for seeking yet"); + return FALSE; + } + if (!demux->streaming) + res = gst_matroska_demux_handle_seek_event (demux, pad, event); + else + res = gst_matroska_demux_handle_seek_push (demux, pad, event); + gst_event_unref (event); + break; + + case GST_EVENT_QOS: + { + GstMatroskaTrackContext *context = gst_pad_get_element_private (pad); + if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) context; + gdouble proportion; + GstClockTimeDiff diff; + GstClockTime timestamp; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + GST_OBJECT_LOCK (demux); + videocontext->earliest_time = timestamp + diff; + GST_OBJECT_UNLOCK (demux); + } + res = TRUE; + gst_event_unref (event); + break; + } + + /* events we don't need to handle */ + case GST_EVENT_NAVIGATION: + gst_event_unref (event); + res = FALSE; + break; + + case GST_EVENT_LATENCY: + default: + res = gst_pad_push_event (demux->common.sinkpad, event); + break; + } + + gst_object_unref (demux); + + return res; +} + +static GstFlowReturn +gst_matroska_demux_seek_to_previous_keyframe (GstMatroskaDemux * demux) +{ + GstFlowReturn ret = GST_FLOW_UNEXPECTED; + gboolean done = TRUE; + gint i; + + g_return_val_if_fail (demux->seek_index, GST_FLOW_UNEXPECTED); + g_return_val_if_fail (demux->seek_entry < demux->seek_index->len, + GST_FLOW_UNEXPECTED); + + GST_DEBUG_OBJECT (demux, "locating previous keyframe"); + + if (!demux->seek_entry) { + GST_DEBUG_OBJECT (demux, "no earlier index entry"); + goto exit; + } + + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i); + + GST_DEBUG_OBJECT (demux, "segment start %" GST_TIME_FORMAT + ", stream %d at %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->common.segment.start), stream->index, + GST_TIME_ARGS (stream->from_time)); + if (GST_CLOCK_TIME_IS_VALID (stream->from_time)) { + if (stream->from_time > demux->common.segment.start) { + GST_DEBUG_OBJECT (demux, "stream %d not finished yet", stream->index); + done = FALSE; + } + } else { + /* nothing pushed for this stream; + * likely seek entry did not start at keyframe, so all was skipped. + * So we need an earlier entry */ + done = FALSE; + } + } + + if (!done) { + GstMatroskaIndex *entry; + + entry = &g_array_index (demux->seek_index, GstMatroskaIndex, + --demux->seek_entry); + if (!gst_matroska_demux_move_to_entry (demux, entry, FALSE)) + goto exit; + + ret = GST_FLOW_OK; + } + +exit: + return ret; +} + +static GstFlowReturn +gst_matroska_demux_parse_tracks (GstMatroskaDemux * demux, GstEbmlRead * ebml) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint32 id; + + DEBUG_ELEMENT_START (demux, ebml, "Tracks"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (demux, ebml, "Tracks", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* one track within the "all-tracks" header */ + case GST_MATROSKA_ID_TRACKENTRY: + ret = gst_matroska_demux_add_stream (demux, ebml); + break; + + default: + ret = gst_matroska_read_common_parse_skip (&demux->common, ebml, + "Track", id); + break; + } + } + DEBUG_ELEMENT_STOP (demux, ebml, "Tracks", ret); + + demux->tracks_parsed = TRUE; + + return ret; +} + +/* + * Read signed/unsigned "EBML" numbers. + * Return: number of bytes processed. + */ + +static gint +gst_matroska_ebmlnum_uint (guint8 * data, guint size, guint64 * num) +{ + gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; + guint64 total; + + if (size <= 0) { + return -1; + } + + total = data[0]; + while (read <= 8 && !(total & len_mask)) { + read++; + len_mask >>= 1; + } + if (read > 8) + return -1; + + if ((total &= (len_mask - 1)) == len_mask - 1) + num_ffs++; + if (size < read) + return -1; + while (n < read) { + if (data[n] == 0xff) + num_ffs++; + total = (total << 8) | data[n]; + n++; + } + + if (read == num_ffs && total != 0) + *num = G_MAXUINT64; + else + *num = total; + + return read; +} + +static gint +gst_matroska_ebmlnum_sint (guint8 * data, guint size, gint64 * num) +{ + guint64 unum; + gint res; + + /* read as unsigned number first */ + if ((res = gst_matroska_ebmlnum_uint (data, size, &unum)) < 0) + return -1; + + /* make signed */ + if (unum == G_MAXUINT64) + *num = G_MAXINT64; + else + *num = unum - ((1 << ((7 * res) - 1)) - 1); + + return res; +} + +/* + * Mostly used for subtitles. We add void filler data for each + * lagging stream to make sure we don't deadlock. + */ + +static void +gst_matroska_demux_sync_streams (GstMatroskaDemux * demux) +{ + gint stream_nr; + + GST_OBJECT_LOCK (demux); + + GST_LOG_OBJECT (demux, "Sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->common.segment.last_stop)); + + g_assert (demux->common.num_streams == demux->common.src->len); + for (stream_nr = 0; stream_nr < demux->common.src->len; stream_nr++) { + GstMatroskaTrackContext *context; + + context = g_ptr_array_index (demux->common.src, stream_nr); + + GST_LOG_OBJECT (demux, + "Checking for resync on stream %d (%" GST_TIME_FORMAT ")", stream_nr, + GST_TIME_ARGS (context->pos)); + + if (G_LIKELY (context->type != GST_MATROSKA_TRACK_TYPE_SUBTITLE)) { + GST_LOG_OBJECT (demux, "Skipping sync on non-subtitle stream"); + continue; + } +#ifndef MKV_DEMUX_MODIFICATION + /* does it lag? 0.5 seconds is a random threshold... + * lag need only be considered if we have advanced into requested segment */ + if (GST_CLOCK_TIME_IS_VALID (context->pos) && + GST_CLOCK_TIME_IS_VALID (demux->common.segment.last_stop) && + demux->common.segment.last_stop > demux->common.segment.start && + context->pos + (GST_SECOND / 2) < demux->common.segment.last_stop) { + gint64 new_start; + GstEvent *event; + + new_start = demux->common.segment.last_stop - (GST_SECOND / 2); + if (GST_CLOCK_TIME_IS_VALID (demux->common.segment.stop)) + new_start = MIN (new_start, demux->common.segment.stop); + GST_DEBUG_OBJECT (demux, + "Synchronizing stream %d with others by advancing time " "from %" + GST_TIME_FORMAT " to %" GST_TIME_FORMAT, stream_nr, + GST_TIME_ARGS (context->pos), GST_TIME_ARGS (new_start)); + + context->pos = new_start; + + /* advance stream time */ + event = gst_event_new_new_segment (TRUE, demux->common.segment.rate, + demux->common.segment.format, new_start, demux->common.segment.stop, + new_start); + GST_OBJECT_UNLOCK (demux); + gst_pad_push_event (context->pad, event); + GST_OBJECT_LOCK (demux); + } +#endif + } + + GST_OBJECT_UNLOCK (demux); +} + +static GstFlowReturn +gst_matroska_demux_push_hdr_buf (GstMatroskaDemux * demux, + GstMatroskaTrackContext * stream, guint8 * data, guint len) +{ + GstFlowReturn ret, cret; + GstBuffer *header_buf; + + header_buf = gst_buffer_new_and_alloc (len); + gst_buffer_set_caps (header_buf, stream->caps); + memcpy (GST_BUFFER_DATA (header_buf), data, len); + + if (stream->set_discont) { + GST_BUFFER_FLAG_SET (header_buf, GST_BUFFER_FLAG_DISCONT); + stream->set_discont = FALSE; + } + + ret = gst_pad_push (stream->pad, header_buf); + + /* combine flows */ + cret = gst_matroska_demux_combine_flows (demux, stream, ret); + + return cret; +} + +static GstFlowReturn +gst_matroska_demux_push_flac_codec_priv_data (GstMatroskaDemux * demux, + GstMatroskaTrackContext * stream) +{ + GstFlowReturn ret; + guint8 *pdata; + guint off, len; + + GST_LOG_OBJECT (demux, "priv data size = %u", stream->codec_priv_size); + + pdata = (guint8 *) stream->codec_priv; + + /* need at least 'fLaC' marker + STREAMINFO metadata block */ + if (stream->codec_priv_size < ((4) + (4 + 34))) { + GST_WARNING_OBJECT (demux, "not enough codec priv data for flac headers"); + return GST_FLOW_ERROR; + } + + if (memcmp (pdata, "fLaC", 4) != 0) { + GST_WARNING_OBJECT (demux, "no flac marker at start of stream headers"); + return GST_FLOW_ERROR; + } + + ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata, 4); + if (ret != GST_FLOW_OK) + return ret; + + off = 4; /* skip fLaC marker */ + while (off < stream->codec_priv_size) { + len = GST_READ_UINT8 (pdata + off + 1) << 16; + len |= GST_READ_UINT8 (pdata + off + 2) << 8; + len |= GST_READ_UINT8 (pdata + off + 3); + + GST_DEBUG_OBJECT (demux, "header packet: len=%u bytes, flags=0x%02x", + len, (guint) pdata[off]); + + ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata + off, len + 4); + if (ret != GST_FLOW_OK) + return ret; + + off += 4 + len; + } + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_matroska_demux_push_speex_codec_priv_data (GstMatroskaDemux * demux, + GstMatroskaTrackContext * stream) +{ + GstFlowReturn ret; + guint8 *pdata; + + GST_LOG_OBJECT (demux, "priv data size = %u", stream->codec_priv_size); + + pdata = (guint8 *) stream->codec_priv; + + /* need at least 'fLaC' marker + STREAMINFO metadata block */ + if (stream->codec_priv_size < 80) { + GST_WARNING_OBJECT (demux, "not enough codec priv data for speex headers"); + return GST_FLOW_ERROR; + } + + if (memcmp (pdata, "Speex ", 8) != 0) { + GST_WARNING_OBJECT (demux, "no Speex marker at start of stream headers"); + return GST_FLOW_ERROR; + } + + ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata, 80); + if (ret != GST_FLOW_OK) + return ret; + + if (stream->codec_priv_size == 80) + return ret; + else + return gst_matroska_demux_push_hdr_buf (demux, stream, pdata + 80, + stream->codec_priv_size - 80); +} + +static GstFlowReturn +gst_matroska_demux_push_xiph_codec_priv_data (GstMatroskaDemux * demux, + GstMatroskaTrackContext * stream) +{ + GstFlowReturn ret; + guint8 *p = (guint8 *) stream->codec_priv; + gint i, offset, num_packets; + guint *length, last; + + if (stream->codec_priv == NULL || stream->codec_priv_size == 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Missing codec private data for xiph headers, broken file")); + return GST_FLOW_ERROR; + } + + /* start of the stream and vorbis audio or theora video, need to + * send the codec_priv data as first three packets */ + num_packets = p[0] + 1; + GST_DEBUG_OBJECT (demux, "%u stream headers, total length=%u bytes", + (guint) num_packets, stream->codec_priv_size); + + length = g_alloca (num_packets * sizeof (guint)); + last = 0; + offset = 1; + + /* first packets, read length values */ + for (i = 0; i < num_packets - 1; i++) { + length[i] = 0; + while (offset < stream->codec_priv_size) { + length[i] += p[offset]; + if (p[offset++] != 0xff) + break; + } + last += length[i]; + } + if (offset + last > stream->codec_priv_size) + return GST_FLOW_ERROR; + + /* last packet is the remaining size */ + length[i] = stream->codec_priv_size - offset - last; + + for (i = 0; i < num_packets; i++) { + GST_DEBUG_OBJECT (demux, "buffer %d: length=%u bytes", i, + (guint) length[i]); + if (offset + length[i] > stream->codec_priv_size) + return GST_FLOW_ERROR; + + ret = + gst_matroska_demux_push_hdr_buf (demux, stream, p + offset, length[i]); + if (ret != GST_FLOW_OK) + return ret; + + offset += length[i]; + } + return GST_FLOW_OK; +} + +static void +gst_matroska_demux_push_dvd_clut_change_event (GstMatroskaDemux * demux, + GstMatroskaTrackContext * stream) +{ + gchar *buf, *start; + + g_assert (!strcmp (stream->codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB)); + + if (!stream->codec_priv) + return; + + /* ideally, VobSub private data should be parsed and stored more convenient + * elsewhere, but for now, only interested in a small part */ + + /* make sure we have terminating 0 */ + buf = g_strndup ((gchar *) stream->codec_priv, stream->codec_priv_size); + + /* just locate and parse palette part */ + start = strstr (buf, "palette:"); + if (start) { + gint i; + guint32 clut[16]; + guint32 col; + guint8 r, g, b, y, u, v; + + start += 8; + while (g_ascii_isspace (*start)) + start++; + for (i = 0; i < 16; i++) { + if (sscanf (start, "%06x", &col) != 1) + break; + start += 6; + while ((*start == ',') || g_ascii_isspace (*start)) + start++; + /* sigh, need to convert this from vobsub pseudo-RGB to YUV */ + r = (col >> 16) & 0xff; + g = (col >> 8) & 0xff; + b = col & 0xff; + y = CLAMP ((0.1494 * r + 0.6061 * g + 0.2445 * b) * 219 / 255 + 16, 0, + 255); + u = CLAMP (0.6066 * r - 0.4322 * g - 0.1744 * b + 128, 0, 255); + v = CLAMP (-0.08435 * r - 0.3422 * g + 0.4266 * b + 128, 0, 255); + clut[i] = (y << 16) | (u << 8) | v; + } + + /* got them all without problems; build and send event */ + if (i == 16) { + GstStructure *s; + + s = gst_structure_new ("application/x-gst-dvd", "event", G_TYPE_STRING, + "dvd-spu-clut-change", "clut00", G_TYPE_INT, clut[0], "clut01", + G_TYPE_INT, clut[1], "clut02", G_TYPE_INT, clut[2], "clut03", + G_TYPE_INT, clut[3], "clut04", G_TYPE_INT, clut[4], "clut05", + G_TYPE_INT, clut[5], "clut06", G_TYPE_INT, clut[6], "clut07", + G_TYPE_INT, clut[7], "clut08", G_TYPE_INT, clut[8], "clut09", + G_TYPE_INT, clut[9], "clut10", G_TYPE_INT, clut[10], "clut11", + G_TYPE_INT, clut[11], "clut12", G_TYPE_INT, clut[12], "clut13", + G_TYPE_INT, clut[13], "clut14", G_TYPE_INT, clut[14], "clut15", + G_TYPE_INT, clut[15], NULL); + + gst_pad_push_event (stream->pad, + gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s)); + } + } + g_free (buf); +} + +static GstFlowReturn +gst_matroska_demux_add_mpeg_seq_header (GstElement * element, + GstMatroskaTrackContext * stream, GstBuffer ** buf) +{ + guint8 *seq_header; + guint seq_header_len; + guint32 header; + + if (stream->codec_state) { + seq_header = stream->codec_state; + seq_header_len = stream->codec_state_size; + } else if (stream->codec_priv) { + seq_header = stream->codec_priv; + seq_header_len = stream->codec_priv_size; + } else { + return GST_FLOW_OK; + } + + /* Sequence header only needed for keyframes */ + if (GST_BUFFER_FLAG_IS_SET (*buf, GST_BUFFER_FLAG_DELTA_UNIT)) + return GST_FLOW_OK; + + if (GST_BUFFER_SIZE (*buf) < 4) + return GST_FLOW_OK; + + header = GST_READ_UINT32_BE (GST_BUFFER_DATA (*buf)); + /* Sequence start code, if not found prepend */ + if (header != 0x000001b3) { + GstBuffer *newbuf; + + newbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (*buf) + seq_header_len); + gst_buffer_set_caps (newbuf, stream->caps); + + GST_DEBUG_OBJECT (element, "Prepending MPEG sequence header"); + gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_TIMESTAMPS | + GST_BUFFER_COPY_FLAGS); + g_memmove (GST_BUFFER_DATA (newbuf), seq_header, seq_header_len); + g_memmove (GST_BUFFER_DATA (newbuf) + seq_header_len, + GST_BUFFER_DATA (*buf), GST_BUFFER_SIZE (*buf)); + gst_buffer_unref (*buf); + *buf = newbuf; + } + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_matroska_demux_add_wvpk_header (GstElement * element, + GstMatroskaTrackContext * stream, GstBuffer ** buf) +{ + GstMatroskaTrackAudioContext *audiocontext = + (GstMatroskaTrackAudioContext *) stream; + GstBuffer *newbuf = NULL; + guint8 *data; + guint newlen; + Wavpack4Header wvh; + + wvh.ck_id[0] = 'w'; + wvh.ck_id[1] = 'v'; + wvh.ck_id[2] = 'p'; + wvh.ck_id[3] = 'k'; + + wvh.version = GST_READ_UINT16_LE (stream->codec_priv); + wvh.track_no = 0; + wvh.index_no = 0; + wvh.total_samples = -1; + wvh.block_index = audiocontext->wvpk_block_index; + + if (audiocontext->channels <= 2) { + guint32 block_samples; + + block_samples = GST_READ_UINT32_LE (GST_BUFFER_DATA (*buf)); + /* we need to reconstruct the header of the wavpack block */ + + /* -20 because ck_size is the size of the wavpack block -8 + * and lace_size is the size of the wavpack block + 12 + * (the three guint32 of the header that already are in the buffer) */ + wvh.ck_size = GST_BUFFER_SIZE (*buf) + sizeof (Wavpack4Header) - 20; + + /* block_samples, flags and crc are already in the buffer */ + newlen = GST_BUFFER_SIZE (*buf) + sizeof (Wavpack4Header) - 12; + newbuf = gst_buffer_new_and_alloc (newlen); + gst_buffer_set_caps (newbuf, stream->caps); + + data = GST_BUFFER_DATA (newbuf); + data[0] = 'w'; + data[1] = 'v'; + data[2] = 'p'; + data[3] = 'k'; + GST_WRITE_UINT32_LE (data + 4, wvh.ck_size); + GST_WRITE_UINT16_LE (data + 8, wvh.version); + GST_WRITE_UINT8 (data + 10, wvh.track_no); + GST_WRITE_UINT8 (data + 11, wvh.index_no); + GST_WRITE_UINT32_LE (data + 12, wvh.total_samples); + GST_WRITE_UINT32_LE (data + 16, wvh.block_index); + g_memmove (data + 20, GST_BUFFER_DATA (*buf), GST_BUFFER_SIZE (*buf)); + gst_buffer_copy_metadata (newbuf, *buf, + GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS); + gst_buffer_unref (*buf); + *buf = newbuf; + audiocontext->wvpk_block_index += block_samples; + } else { + guint8 *outdata; + guint outpos = 0; + guint size; + guint32 block_samples, flags, crc, blocksize; + + data = GST_BUFFER_DATA (*buf); + size = GST_BUFFER_SIZE (*buf); + + if (size < 4) { + GST_ERROR_OBJECT (element, "Too small wavpack buffer"); + return GST_FLOW_ERROR; + } + + block_samples = GST_READ_UINT32_LE (data); + data += 4; + size -= 4; + + while (size > 12) { + flags = GST_READ_UINT32_LE (data); + data += 4; + size -= 4; + crc = GST_READ_UINT32_LE (data); + data += 4; + size -= 4; + blocksize = GST_READ_UINT32_LE (data); + data += 4; + size -= 4; + + if (blocksize == 0 || size < blocksize) + break; + + if (newbuf == NULL) { + newbuf = gst_buffer_new_and_alloc (sizeof (Wavpack4Header) + blocksize); + gst_buffer_set_caps (newbuf, stream->caps); + + gst_buffer_copy_metadata (newbuf, *buf, + GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS); + + outpos = 0; + outdata = GST_BUFFER_DATA (newbuf); + } else { + GST_BUFFER_SIZE (newbuf) += sizeof (Wavpack4Header) + blocksize; + GST_BUFFER_DATA (newbuf) = + g_realloc (GST_BUFFER_DATA (newbuf), GST_BUFFER_SIZE (newbuf)); + GST_BUFFER_MALLOCDATA (newbuf) = GST_BUFFER_DATA (newbuf); + outdata = GST_BUFFER_DATA (newbuf); + } + + outdata[outpos] = 'w'; + outdata[outpos + 1] = 'v'; + outdata[outpos + 2] = 'p'; + outdata[outpos + 3] = 'k'; + outpos += 4; + + GST_WRITE_UINT32_LE (outdata + outpos, + blocksize + sizeof (Wavpack4Header) - 8); + GST_WRITE_UINT16_LE (outdata + outpos + 4, wvh.version); + GST_WRITE_UINT8 (outdata + outpos + 6, wvh.track_no); + GST_WRITE_UINT8 (outdata + outpos + 7, wvh.index_no); + GST_WRITE_UINT32_LE (outdata + outpos + 8, wvh.total_samples); + GST_WRITE_UINT32_LE (outdata + outpos + 12, wvh.block_index); + GST_WRITE_UINT32_LE (outdata + outpos + 16, block_samples); + GST_WRITE_UINT32_LE (outdata + outpos + 20, flags); + GST_WRITE_UINT32_LE (outdata + outpos + 24, crc); + outpos += 28; + + g_memmove (outdata + outpos, data, blocksize); + outpos += blocksize; + data += blocksize; + size -= blocksize; + } + gst_buffer_unref (*buf); + *buf = newbuf; + audiocontext->wvpk_block_index += block_samples; + } + + return GST_FLOW_OK; +} + +/* @text must be null-terminated */ +static gboolean +gst_matroska_demux_subtitle_chunk_has_tag (GstElement * element, + const gchar * text) +{ + gchar *tag; + + /* yes, this might all lead to false positives ... */ + tag = (gchar *) text; + while ((tag = strchr (tag, '<'))) { + tag++; + if (*tag != '\0' && *(tag + 1) == '>') { + /* some common convenience ones */ + /* maybe any character will do here ? */ + switch (*tag) { + case 'b': + case 'i': + case 'u': + case 's': + return TRUE; + default: + return FALSE; + } + } + } + + if (strstr (text, "invalid_utf8) { + if (g_utf8_validate (data, size, NULL)) { + goto next; + } + GST_WARNING_OBJECT (element, "subtitle stream %d is not valid UTF-8, this " + "is broken according to the matroska specification", stream->num); + sub_stream->invalid_utf8 = TRUE; + } + + /* file with broken non-UTF8 subtitle, do the best we can do to fix it */ + encoding = g_getenv ("GST_SUBTITLE_ENCODING"); + if (encoding == NULL || *encoding == '\0') { + /* if local encoding is UTF-8 and no encoding specified + * via the environment variable, assume ISO-8859-15 */ + if (g_get_charset (&encoding)) { + encoding = "ISO-8859-15"; + } + } + + utf8 = g_convert_with_fallback (data, size, "UTF-8", encoding, (char *) "*", + NULL, NULL, &err); + + if (err) { + GST_LOG_OBJECT (element, "could not convert string from '%s' to UTF-8: %s", + encoding, err->message); + g_error_free (err); + g_free (utf8); + + /* invalid input encoding, fall back to ISO-8859-15 (always succeeds) */ + encoding = "ISO-8859-15"; + utf8 = g_convert_with_fallback (data, size, "UTF-8", encoding, (char *) "*", + NULL, NULL, NULL); + } + + GST_LOG_OBJECT (element, "converted subtitle text from %s to UTF-8 %s", + encoding, (err) ? "(using ISO-8859-15 as fallback)" : ""); + + if (utf8 == NULL) + utf8 = g_strdup ("invalid subtitle"); + + newbuf = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (newbuf) = (guint8 *) utf8; + GST_BUFFER_DATA (newbuf) = (guint8 *) utf8; + GST_BUFFER_SIZE (newbuf) = strlen (utf8); + gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_ALL); + gst_buffer_unref (*buf); + + *buf = newbuf; + data = (const gchar *) GST_BUFFER_DATA (*buf); + size = GST_BUFFER_SIZE (*buf); + +next: + + if (sub_stream->check_markup) { + /* caps claim markup text, so we need to escape text, + * except if text is already markup and then needs no further escaping */ + sub_stream->seen_markup_tag = sub_stream->seen_markup_tag || + gst_matroska_demux_subtitle_chunk_has_tag (element, data); + + if (!sub_stream->seen_markup_tag) { + utf8 = g_markup_escape_text (data, size); + + newbuf = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (newbuf) = (guint8 *) utf8; + GST_BUFFER_DATA (newbuf) = (guint8 *) utf8; + GST_BUFFER_SIZE (newbuf) = strlen (utf8); + gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_ALL); + gst_buffer_unref (*buf); + + *buf = newbuf; + } + } + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_matroska_demux_check_aac (GstElement * element, + GstMatroskaTrackContext * stream, GstBuffer ** buf) +{ + const guint8 *data; + guint size; + + data = GST_BUFFER_DATA (*buf); + size = GST_BUFFER_SIZE (*buf); + + if (size > 2 && data[0] == 0xff && (data[1] >> 4 == 0x0f)) { + GstCaps *new_caps; + GstStructure *s; + + /* tss, ADTS data, remove codec_data + * still assume it is at least parsed */ + new_caps = gst_caps_copy (stream->caps); + s = gst_caps_get_structure (new_caps, 0); + g_assert (s); + gst_structure_remove_field (s, "codec_data"); + gst_caps_replace (&stream->caps, new_caps); + gst_pad_set_caps (stream->pad, new_caps); + gst_buffer_set_caps (*buf, new_caps); + GST_DEBUG_OBJECT (element, "ADTS AAC audio data; removing codec-data, " + "new caps: %" GST_PTR_FORMAT, new_caps); + gst_caps_unref (new_caps); + } + + /* disable subsequent checking */ + stream->postprocess_frame = NULL; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, + GstEbmlRead * ebml, guint64 cluster_time, guint64 cluster_offset, + gboolean is_simpleblock) +{ + GstMatroskaTrackContext *stream = NULL; + GstFlowReturn ret = GST_FLOW_OK; + gboolean readblock = FALSE; + guint32 id; + guint64 block_duration = -1; + GstBuffer *buf = NULL; + gint stream_num = -1, n, laces = 0; + guint size = 0; + gint *lace_size = NULL; + gint64 time = 0; + gint flags = 0; + gint64 referenceblock = 0; + gint64 offset; + + offset = gst_ebml_read_get_offset (ebml); + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if (!is_simpleblock) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) { + goto data_error; + } + } else { + id = GST_MATROSKA_ID_SIMPLEBLOCK; + } + + switch (id) { + /* one block inside the group. Note, block parsing is one + * of the harder things, so this code is a bit complicated. + * See http://www.matroska.org/ for documentation. */ + case GST_MATROSKA_ID_SIMPLEBLOCK: + case GST_MATROSKA_ID_BLOCK: + { + guint64 num; + guint8 *data; + + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + if ((ret = gst_ebml_read_buffer (ebml, &id, &buf)) != GST_FLOW_OK) + break; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* first byte(s): blocknum */ + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) + goto data_error; + data += n; + size -= n; + + /* fetch stream from num */ + stream_num = gst_matroska_read_common_stream_from_num (&demux->common, + num); + if (G_UNLIKELY (size < 3)) { + GST_WARNING_OBJECT (demux, "Invalid size %u", size); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } else if (G_UNLIKELY (stream_num < 0 || + stream_num >= demux->common.num_streams)) { + /* let's not give up on a stray invalid track number */ + GST_WARNING_OBJECT (demux, + "Invalid stream %d for track number %" G_GUINT64_FORMAT + "; ignoring block", stream_num, num); + goto done; + } + + stream = g_ptr_array_index (demux->common.src, stream_num); + +#ifdef MKV_DEMUX_MODIFICATION + if (demux->common.segment.rate < 0.0) { + if ((stream_num+1) == GST_MATROSKA_TRACK_TYPE_AUDIO) { + /* found at least one audio block */ + demux->found_audioframe = TRUE; + } + } +#endif + + /* time (relative to cluster time) */ + time = ((gint16) GST_READ_UINT16_BE (data)); + data += 2; + size -= 2; + flags = GST_READ_UINT8 (data); + data += 1; + size -= 1; + + GST_LOG_OBJECT (demux, "time %" G_GUINT64_FORMAT ", flags %d", time, + flags); + + switch ((flags & 0x06) >> 1) { + case 0x0: /* no lacing */ + laces = 1; + lace_size = g_new (gint, 1); + lace_size[0] = size; + break; + + case 0x1: /* xiph lacing */ + case 0x2: /* fixed-size lacing */ + case 0x3: /* EBML lacing */ + if (size == 0) + goto invalid_lacing; + laces = GST_READ_UINT8 (data) + 1; + data += 1; + size -= 1; + lace_size = g_new0 (gint, laces); + + switch ((flags & 0x06) >> 1) { + case 0x1: /* xiph lacing */ { + guint temp, total = 0; + + for (n = 0; ret == GST_FLOW_OK && n < laces - 1; n++) { + while (1) { + if (size == 0) + goto invalid_lacing; + temp = GST_READ_UINT8 (data); + lace_size[n] += temp; + data += 1; + size -= 1; + if (temp != 0xff) + break; + } + total += lace_size[n]; + } + lace_size[n] = size - total; + break; + } + + case 0x2: /* fixed-size lacing */ + for (n = 0; n < laces; n++) + lace_size[n] = size / laces; + break; + + case 0x3: /* EBML lacing */ { + guint total; + + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) + goto data_error; + data += n; + size -= n; + total = lace_size[0] = num; + for (n = 1; ret == GST_FLOW_OK && n < laces - 1; n++) { + gint64 snum; + gint r; + + if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0) + goto data_error; + data += r; + size -= r; + lace_size[n] = lace_size[n - 1] + snum; + total += lace_size[n]; + } + if (n < laces) + lace_size[n] = size - total; + break; + } + } + break; + } + + if (stream->send_xiph_headers) { + ret = gst_matroska_demux_push_xiph_codec_priv_data (demux, stream); + stream->send_xiph_headers = FALSE; + } + + if (stream->send_flac_headers) { + ret = gst_matroska_demux_push_flac_codec_priv_data (demux, stream); + stream->send_flac_headers = FALSE; + } + + if (stream->send_speex_headers) { + ret = gst_matroska_demux_push_speex_codec_priv_data (demux, stream); + stream->send_speex_headers = FALSE; + } + + if (stream->send_dvd_event) { + gst_matroska_demux_push_dvd_clut_change_event (demux, stream); + /* FIXME: should we send this event again after (flushing) seek ? */ + stream->send_dvd_event = FALSE; + } + + if (ret != GST_FLOW_OK) + break; + + readblock = TRUE; + break; + } + + case GST_MATROSKA_ID_BLOCKDURATION:{ + ret = gst_ebml_read_uint (ebml, &id, &block_duration); + GST_DEBUG_OBJECT (demux, "BlockDuration: %" G_GUINT64_FORMAT, + block_duration); + break; + } + + case GST_MATROSKA_ID_REFERENCEBLOCK:{ + ret = gst_ebml_read_sint (ebml, &id, &referenceblock); + GST_DEBUG_OBJECT (demux, "ReferenceBlock: %" G_GINT64_FORMAT, + referenceblock); + break; + } + + case GST_MATROSKA_ID_CODECSTATE:{ + guint8 *data; + guint64 data_len = 0; + + if ((ret = + gst_ebml_read_binary (ebml, &id, &data, + &data_len)) != GST_FLOW_OK) + break; + + if (G_UNLIKELY (stream == NULL)) { + GST_WARNING_OBJECT (demux, + "Unexpected CodecState subelement - ignoring"); + break; + } + + g_free (stream->codec_state); + stream->codec_state = data; + stream->codec_state_size = data_len; + + /* Decode if necessary */ + if (stream->encodings && stream->encodings->len > 0 + && stream->codec_state && stream->codec_state_size > 0) { + if (!gst_matroska_decode_data (stream->encodings, + &stream->codec_state, &stream->codec_state_size, + GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA, TRUE)) { + GST_WARNING_OBJECT (demux, "Decoding codec state failed"); + } + } + + GST_DEBUG_OBJECT (demux, "CodecState of %u bytes", + stream->codec_state_size); + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (&demux->common, ebml, + "BlockGroup", id); + break; + + case GST_MATROSKA_ID_BLOCKVIRTUAL: + case GST_MATROSKA_ID_BLOCKADDITIONS: + case GST_MATROSKA_ID_REFERENCEPRIORITY: + case GST_MATROSKA_ID_REFERENCEVIRTUAL: + case GST_MATROSKA_ID_SLICES: + GST_DEBUG_OBJECT (demux, + "Skipping BlockGroup subelement 0x%x - ignoring", id); + ret = gst_ebml_read_skip (ebml); + break; + } + + if (is_simpleblock) + break; + } + + /* reading a number or so could have failed */ + if (ret != GST_FLOW_OK) + goto data_error; + + if (ret == GST_FLOW_OK && readblock) { + guint64 duration = 0; + gint64 lace_time = 0; + gboolean delta_unit; + + stream = g_ptr_array_index (demux->common.src, stream_num); + + if (cluster_time != GST_CLOCK_TIME_NONE) { + /* FIXME: What to do with negative timestamps? Give timestamp 0 or -1? + * Drop unless the lace contains timestamp 0? */ + if (time < 0 && (-time) > cluster_time) { + lace_time = 0; + } else { + if (stream->timecodescale == 1.0) + lace_time = (cluster_time + time) * demux->common.time_scale; + else + lace_time = + gst_util_guint64_to_gdouble ((cluster_time + time) * + demux->common.time_scale) * stream->timecodescale; + } + } else { + lace_time = GST_CLOCK_TIME_NONE; + } + + /* need to refresh segment info ASAP */ + if (GST_CLOCK_TIME_IS_VALID (lace_time) && demux->need_newsegment) { + guint64 clace_time; + + GST_DEBUG_OBJECT (demux, + "generating segment starting at %" GST_TIME_FORMAT, + GST_TIME_ARGS (lace_time)); + if (!GST_CLOCK_TIME_IS_VALID (demux->stream_start_time)) { + demux->stream_start_time = lace_time; + GST_DEBUG_OBJECT (demux, + "Setting stream start time to %" GST_TIME_FORMAT, + GST_TIME_ARGS (lace_time)); + } + clace_time = MAX (lace_time, demux->stream_start_time); + gst_segment_set_newsegment (&demux->common.segment, FALSE, + demux->common.segment.rate, GST_FORMAT_TIME, clace_time, + GST_CLOCK_TIME_NONE, clace_time - demux->stream_start_time); + /* now convey our segment notion downstream */ + gst_matroska_demux_send_event (demux, gst_event_new_new_segment (FALSE, + demux->common.segment.rate, demux->common.segment.format, + demux->common.segment.start, demux->common.segment.stop, + demux->common.segment.start)); + demux->need_newsegment = FALSE; + } + + if (block_duration != -1) { + if (stream->timecodescale == 1.0) + duration = gst_util_uint64_scale (block_duration, + demux->common.time_scale, 1); + else + duration = + gst_util_gdouble_to_guint64 (gst_util_guint64_to_gdouble + (gst_util_uint64_scale (block_duration, demux->common.time_scale, + 1)) * stream->timecodescale); + } else if (stream->default_duration) { + duration = stream->default_duration * laces; + } + /* else duration is diff between timecode of this and next block */ + + /* For SimpleBlock, look at the keyframe bit in flags. Otherwise, + a ReferenceBlock implies that this is not a keyframe. In either + case, it only makes sense for video streams. */ + delta_unit = stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && + ((is_simpleblock && !(flags & 0x80)) || referenceblock); + + if (delta_unit && stream->set_discont) { + /* When doing seeks or such, we need to restart on key frames or + * decoders might choke. */ + GST_DEBUG_OBJECT (demux, "skipping delta unit"); + goto done; + } + + for (n = 0; n < laces; n++) { + GstBuffer *sub; +#ifdef MKV_DEMUX_MODIFICATION + gboolean skip_flag = FALSE; +#endif + + if (G_UNLIKELY (lace_size[n] > size)) { + GST_WARNING_OBJECT (demux, "Invalid lace size"); + break; + } + + /* QoS for video track with an index. the assumption is that + index entries point to keyframes, but if that is not true we + will instad skip until the next keyframe. */ + if (GST_CLOCK_TIME_IS_VALID (lace_time) && + stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && + stream->index_table && demux->common.segment.rate > 0.0) { + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) stream; + GstClockTime earliest_time; + GstClockTime earliest_stream_time; + + GST_OBJECT_LOCK (demux); + earliest_time = videocontext->earliest_time; + GST_OBJECT_UNLOCK (demux); + earliest_stream_time = gst_segment_to_position (&demux->common.segment, + GST_FORMAT_TIME, earliest_time); + + if (GST_CLOCK_TIME_IS_VALID (lace_time) && + GST_CLOCK_TIME_IS_VALID (earliest_stream_time) && + lace_time <= earliest_stream_time) { + /* find index entry (keyframe) <= earliest_stream_time */ + GstMatroskaIndex *entry = + gst_util_array_binary_search (stream->index_table->data, + stream->index_table->len, sizeof (GstMatroskaIndex), + (GCompareDataFunc) gst_matroska_index_seek_find, + GST_SEARCH_MODE_BEFORE, &earliest_stream_time, NULL); + + /* if that entry (keyframe) is after the current the current + buffer, we can skip pushing (and thus decoding) all + buffers until that keyframe. */ + if (entry && GST_CLOCK_TIME_IS_VALID (entry->time) && + entry->time > lace_time) { + GST_LOG_OBJECT (demux, "Skipping lace before late keyframe"); + stream->set_discont = TRUE; + goto next_lace; + } + } + } + + sub = gst_buffer_create_sub (buf, + GST_BUFFER_SIZE (buf) - size, lace_size[n]); + GST_DEBUG_OBJECT (demux, "created subbuffer %p", sub); +#ifdef MKV_DEMUX_MODIFICATION + if(demux->index_table_created == FALSE) { + demux->common.segment.duration = 0; + } +#endif + + if (delta_unit) + GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT); + else + GST_BUFFER_FLAG_UNSET (sub, GST_BUFFER_FLAG_DELTA_UNIT); + + if (stream->encodings != NULL && stream->encodings->len > 0) + sub = gst_matroska_decode_buffer (stream, sub); + + if (sub == NULL) { + GST_WARNING_OBJECT (demux, "Decoding buffer failed"); + goto next_lace; + } + + GST_BUFFER_TIMESTAMP (sub) = lace_time; + + if (GST_CLOCK_TIME_IS_VALID (lace_time)) { + GstClockTime last_stop_end; + +#ifndef MKV_DEMUX_MODIFICATION + /* Check if this stream is after segment stop */ + if (GST_CLOCK_TIME_IS_VALID (demux->common.segment.stop) && + lace_time >= demux->common.segment.stop) { + GST_DEBUG_OBJECT (demux, + "Stream %d after segment stop %" GST_TIME_FORMAT, stream->index, + GST_TIME_ARGS (demux->common.segment.stop)); + gst_buffer_unref (sub); + goto eos; + } + if (offset >= stream->to_offset) { + GST_DEBUG_OBJECT (demux, "Stream %d after playback section", + stream->index); + gst_buffer_unref (sub); + goto eos; + } +#endif + + /* handle gaps, e.g. non-zero start-time, or an cue index entry + * that landed us with timestamps not quite intended */ + GST_OBJECT_LOCK (demux); + if (demux->max_gap_time && +#ifdef MKV_DEMUX_MODIFICATION + GST_CLOCK_TIME_IS_VALID (/*demux->last_stop_end*/demux->common.segment.last_stop) && + demux->common.segment.rate > 0.0) { +#else + GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) && + demux->common.segment.rate > 0.0) { +#endif + + GstClockTimeDiff diff; + GstEvent *event1, *event2; + + /* only send newsegments with increasing start times, + * otherwise if these go back and forth downstream (sinks) increase + * accumulated time and running_time */ +#ifdef MKV_DEMUX_MODIFICATION + diff = GST_CLOCK_DIFF (/*demux->last_stop_end*/demux->common.segment.last_stop, lace_time); +#else + diff = GST_CLOCK_DIFF (demux->last_stop_end, lace_time); +#endif + if (diff > 0 && diff > demux->max_gap_time + && lace_time > demux->common.segment.start + && (!GST_CLOCK_TIME_IS_VALID (demux->common.segment.stop) + || lace_time < demux->common.segment.stop)) { + GST_DEBUG_OBJECT (demux, + "Gap of %" G_GINT64_FORMAT " ns detected in" + "stream %d (%" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "). " + "Sending updated NEWSEGMENT events", diff, + stream->index, GST_TIME_ARGS (stream->pos), + GST_TIME_ARGS (lace_time)); + /* send newsegment events such that the gap is not accounted in + * accum time, hence running_time */ + /* close ahead of gap */ + event1 = gst_event_new_new_segment (TRUE, + demux->common.segment.rate, demux->common.segment.format, + demux->last_stop_end, demux->last_stop_end, + demux->last_stop_end); + /* skip gap */ + event2 = gst_event_new_new_segment (FALSE, + demux->common.segment.rate, + demux->common.segment.format, lace_time, + demux->common.segment.stop, lace_time); + GST_OBJECT_UNLOCK (demux); + gst_matroska_demux_send_event (demux, event1); + gst_matroska_demux_send_event (demux, event2); + GST_OBJECT_LOCK (demux); + /* align segment view with downstream, + * prevents double-counting accum when closing segment */ + gst_segment_set_newsegment (&demux->common.segment, FALSE, + demux->common.segment.rate, demux->common.segment.format, + lace_time, demux->common.segment.stop, lace_time); + demux->common.segment.last_stop = lace_time; + } + } + + if (!GST_CLOCK_TIME_IS_VALID (demux->common.segment.last_stop) + || demux->common.segment.last_stop < lace_time) { + demux->common.segment.last_stop = lace_time; + } + GST_OBJECT_UNLOCK (demux); + + last_stop_end = lace_time; + if (duration) { + GST_BUFFER_DURATION (sub) = duration / laces; + last_stop_end += GST_BUFFER_DURATION (sub); + } + + if (!GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) || + demux->last_stop_end < last_stop_end) + demux->last_stop_end = last_stop_end; + + GST_OBJECT_LOCK (demux); +#ifdef MKV_DEMUX_MODIFICATION + if ((demux->common.segment.duration == -1 || + demux->stream_start_time + demux->common.segment.duration < + last_stop_end) && demux->index_table_created == TRUE) { +#else + if (demux->common.segment.duration == -1 || + demux->stream_start_time + demux->common.segment.duration < + last_stop_end) { +#endif + gst_segment_set_duration (&demux->common.segment, GST_FORMAT_TIME, + last_stop_end - demux->stream_start_time); + GST_OBJECT_UNLOCK (demux); + if (!demux->invalid_duration) { + gst_element_post_message (GST_ELEMENT_CAST (demux), + gst_message_new_duration (GST_OBJECT_CAST (demux), + GST_FORMAT_TIME, GST_CLOCK_TIME_NONE)); + demux->invalid_duration = TRUE; + } + } else { + GST_OBJECT_UNLOCK (demux); + } + } + + stream->pos = lace_time; + + gst_matroska_demux_sync_streams (demux); + + if (stream->set_discont) { + GST_DEBUG_OBJECT (demux, "marking DISCONT"); + GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DISCONT); + stream->set_discont = FALSE; + } + + /* reverse playback book-keeping */ + if (!GST_CLOCK_TIME_IS_VALID (stream->from_time)) + stream->from_time = lace_time; + if (stream->from_offset == -1) + stream->from_offset = offset; + +#ifdef MKV_DEMUX_MODIFICATION + if ((demux->common.segment.rate < 0.0) && ((stream_num+1) == GST_MATROSKA_TRACK_TYPE_VIDEO)) { + if (GST_BUFFER_FLAG_IS_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT)) { + GST_DEBUG_OBJECT (demux, "skipping delta unit"); + gst_buffer_unref (sub); + goto done; + } else { + /* found key frame*/ + demux->found_videokeyframe = TRUE; + } + } + demux->current_ts = GST_BUFFER_TIMESTAMP (sub); +#endif + + GST_DEBUG_OBJECT (demux, + "Pushing lace %d, data of size %d for stream %d, time=%" + GST_TIME_FORMAT " and duration=%" GST_TIME_FORMAT, n, + GST_BUFFER_SIZE (sub), stream_num, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), + GST_TIME_ARGS (GST_BUFFER_DURATION (sub))); + + if (demux->common.element_index) { + if (stream->index_writer_id == -1) + gst_index_get_writer_id (demux->common.element_index, + GST_OBJECT (stream->pad), &stream->index_writer_id); + + GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT " for writer id %d", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), cluster_offset, + stream->index_writer_id); + gst_index_add_association (demux->common.element_index, + stream->index_writer_id, GST_BUFFER_FLAG_IS_SET (sub, + GST_BUFFER_FLAG_DELTA_UNIT) ? 0 : GST_ASSOCIATION_FLAG_KEY_UNIT, + GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (sub), GST_FORMAT_BYTES, + cluster_offset, NULL); + } + + gst_buffer_set_caps (sub, GST_PAD_CAPS (stream->pad)); + + /* Postprocess the buffers depending on the codec used */ + if (stream->postprocess_frame) { + GST_LOG_OBJECT (demux, "running post process"); + ret = stream->postprocess_frame (GST_ELEMENT (demux), stream, &sub); + } + +#ifdef MKV_DEMUX_MODIFICATION + if (demux->video && demux->common.segment.rate > 1.0 + && stream->type <= GST_MATROSKA_TRACK_TYPE_AUDIO) { + skip_flag = FALSE; + if(GST_BUFFER_TIMESTAMP(sub) >= demux->common.segment.start) { + GST_BUFFER_FLAG_UNSET(sub, GST_BUFFER_FLAG_DELTA_UNIT); + GST_INFO("Entering into forward Trickplay"); + ret = gst_matroska_demux_forward_trickplay (demux, stream, sub, &skip_flag); + } + if (skip_flag == FALSE) { + GST_INFO("buffer pushed %"GST_TIME_FORMAT, GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(sub))); + ret = gst_pad_push (stream->pad, sub); + } else { + GST_INFO("Unreffing the buffer %"GST_TIME_FORMAT, GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(sub))); + gst_buffer_unref (sub); + } + } else if (demux->common.segment.rate < 0.0) { + ret = gst_matroska_demux_backward_trickplay (demux, stream, sub); + } else +#endif + { + /* At this point, we have a sub-buffer pointing at data within a larger + buffer. This data might not be aligned with anything. If the data is + raw samples though, we want it aligned to the raw type (eg, 4 bytes + for 32 bit samples, etc), or bad things will happen downstream as + elements typically assume minimal alignment. + Therefore, create an aligned copy if necessary. */ + g_assert (stream->alignment <= G_MEM_ALIGN); + if (((guintptr) GST_BUFFER_DATA (sub)) & (stream->alignment - 1)) { + GstBuffer *buffer = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (sub)); + memcpy (GST_BUFFER_DATA (buffer), GST_BUFFER_DATA (sub), + GST_BUFFER_SIZE (sub)); + gst_buffer_copy_metadata (buffer, sub, GST_BUFFER_COPY_ALL); + GST_DEBUG_OBJECT (demux, "We want output aligned on %d, reallocated", + stream->alignment); + gst_buffer_unref (sub); + sub = buffer; + } +#ifdef MKV_DEMUX_MODIFICATION + if(demux->index_table_created == FALSE) { + // flag checking sufficient for simple block and delta unit for Block group + if(flags == 128 || (!delta_unit && stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO)) { + GST_INFO("Keyframe Found"); + + //Information required for index table creation + GstMatroskaIndex *idx = NULL; + idx = (GstMatroskaIndex*)malloc(sizeof(GstMatroskaIndex)); + if(idx == NULL) { + GST_INFO("Unable to create memory"); + ret = GST_FLOW_UNEXPECTED; + goto done; + } + idx->pos = (cluster_offset - demux->initial_offset); + idx->track = 1; + idx->time = GST_BUFFER_TIMESTAMP(sub); + idx->block = 1; + + // Creating new/Over-Writing index table + if(!demux->index_table_array_creation) { + GST_INFO("Keyframe time stamp is %"GST_TIME_FORMAT"pos %"G_GUINT64_FORMAT, GST_TIME_ARGS(idx->time), idx->pos); + GST_INFO("Index table creation first time"); + demux->common.index = NULL;//g_array_unref(demux->common.index); + demux->common.index = g_array_new(FALSE, FALSE, sizeof(GstMatroskaIndex)); + g_array_append_val(demux->common.index, *idx); + GST_INFO("size of the index is %d",demux->common.index->len); + demux->index_table_array_creation = TRUE; + } else { + GST_INFO("Adding Keyframe info to index table"); + GST_INFO("Keyframe time stamp is %"GST_TIME_FORMAT"pos %"G_GUINT64_FORMAT, GST_TIME_ARGS(idx->time), idx->pos); + g_array_append_val(demux->common.index, *idx); + GST_INFO("size of the index is %d",demux->common.index->len); + } + } else { + //demux->common.segment.duration = (GST_BUFFER_TIMESTAMP(sub) + GST_BUFFER_DURATION (sub)); + demux->duration = GST_BUFFER_TIMESTAMP(sub) + GST_BUFFER_DURATION (sub); + GST_INFO("duration is in capturing not setting%"GST_TIME_FORMAT, GST_TIME_ARGS(demux->duration)); + GST_INFO("duration in segment duration still not set%"GST_TIME_FORMAT, GST_TIME_ARGS(demux->common.segment.duration)); + } + } else { + ret = gst_pad_push (stream->pad, sub); + } +#else + ret = gst_pad_push (stream->pad, sub); +#endif + } + + if (demux->common.segment.rate < 0) { + if (lace_time > demux->common.segment.stop + && ret == GST_FLOW_UNEXPECTED) { + /* In reverse playback we can get a GST_FLOW_UNEXPECTED when + * we are at the end of the segment, so we just need to jump + * back to the previous section. */ + GST_DEBUG_OBJECT (demux, "downstream has reached end of segment"); + ret = GST_FLOW_OK; + } + } + /* combine flows */ + ret = gst_matroska_demux_combine_flows (demux, stream, ret); + + next_lace: + size -= lace_size[n]; + if (lace_time != GST_CLOCK_TIME_NONE && duration) + lace_time += duration / laces; + else + lace_time = GST_CLOCK_TIME_NONE; + } + } + +done: + if (buf) + gst_buffer_unref (buf); + g_free (lace_size); + + return ret; + + /* EXITS */ +eos: + { + stream->eos = TRUE; + ret = GST_FLOW_OK; + /* combine flows */ + ret = gst_matroska_demux_combine_flows (demux, stream, ret); + goto done; + } +invalid_lacing: + { + GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Invalid lacing size")); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } +data_error: + { + GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Data error")); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } +} + +/* return FALSE if block(group) should be skipped (due to a seek) */ +static inline gboolean +gst_matroska_demux_seek_block (GstMatroskaDemux * demux) +{ + if (G_UNLIKELY (demux->seek_block)) { + if (!(--demux->seek_block)) { + return TRUE; + } else { + GST_LOG_OBJECT (demux, "should skip block due to seek"); + return FALSE; + } + } else { + return TRUE; + } +} + +static GstFlowReturn +gst_matroska_demux_parse_contents_seekentry (GstMatroskaDemux * demux, + GstEbmlRead * ebml) +{ + GstFlowReturn ret; + guint64 seek_pos = (guint64) - 1; + guint32 seek_id = 0; + guint32 id; + + DEBUG_ELEMENT_START (demux, ebml, "Seek"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (demux, ebml, "Seek", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_SEEKID: + { + guint64 t; + + if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (demux, "SeekID: %" G_GUINT64_FORMAT, t); + seek_id = t; + break; + } + + case GST_MATROSKA_ID_SEEKPOSITION: + { + guint64 t; + + if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK) + break; + + if (t > G_MAXINT64) { + GST_WARNING_OBJECT (demux, + "Too large SeekPosition %" G_GUINT64_FORMAT, t); + break; + } + + GST_DEBUG_OBJECT (demux, "SeekPosition: %" G_GUINT64_FORMAT, t); + seek_pos = t; + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (&demux->common, ebml, + "SeekHead", id); + break; + } + } + + if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) + return ret; + + if (!seek_id || seek_pos == (guint64) - 1) { + GST_WARNING_OBJECT (demux, "Incomplete seekhead entry (0x%x/%" + G_GUINT64_FORMAT ")", seek_id, seek_pos); + return GST_FLOW_OK; + } + + switch (seek_id) { + case GST_MATROSKA_ID_SEEKHEAD: + { + } + case GST_MATROSKA_ID_CUES: + case GST_MATROSKA_ID_TAGS: + case GST_MATROSKA_ID_TRACKS: + case GST_MATROSKA_ID_SEGMENTINFO: + case GST_MATROSKA_ID_ATTACHMENTS: + case GST_MATROSKA_ID_CHAPTERS: + { + guint64 before_pos, length; + guint needed; + + /* remember */ + length = gst_matroska_read_common_get_length (&demux->common); + before_pos = demux->common.offset; + + if (length == (guint64) - 1) { + GST_DEBUG_OBJECT (demux, "no upstream length, skipping SeakHead entry"); + break; + } + + /* check for validity */ + if (seek_pos + demux->common.ebml_segment_start + 12 >= length) { + GST_WARNING_OBJECT (demux, + "SeekHead reference lies outside file!" " (%" + G_GUINT64_FORMAT "+%" G_GUINT64_FORMAT "+12 >= %" + G_GUINT64_FORMAT ")", seek_pos, demux->common.ebml_segment_start, + length); +#ifdef MKV_DEMUX_MODIFICATION + demux->seek_head_cluster_info_absent = TRUE; + demux->seek_head_cue_info_absent = TRUE; + demux->index_table_created = FALSE; + GST_INFO("Need to create index table this might take time"); +#endif + break; + } + + /* only pick up index location when streaming */ + if (demux->streaming) { + if (seek_id == GST_MATROSKA_ID_CUES) { + demux->index_offset = seek_pos + demux->common.ebml_segment_start; + GST_DEBUG_OBJECT (demux, "Cues located at offset %" G_GUINT64_FORMAT, + demux->index_offset); + } + break; + } + + /* seek */ + demux->common.offset = seek_pos + demux->common.ebml_segment_start; + + /* check ID */ + if ((ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed)) != + GST_FLOW_OK) + goto finish; + + if (id != seek_id) { + GST_WARNING_OBJECT (demux, + "We looked for ID=0x%x but got ID=0x%x (pos=%" G_GUINT64_FORMAT ")", + seek_id, id, seek_pos + demux->common.ebml_segment_start); + } else { + /* now parse */ + ret = gst_matroska_demux_parse_id (demux, id, length, needed); + } + + finish: + /* seek back */ + demux->common.offset = before_pos; + break; + } + + case GST_MATROSKA_ID_CLUSTER: + { + guint64 pos = seek_pos + demux->common.ebml_segment_start; + + GST_LOG_OBJECT (demux, "Cluster position"); + if (G_UNLIKELY (!demux->clusters)) + demux->clusters = g_array_sized_new (TRUE, TRUE, sizeof (guint64), 100); + g_array_append_val (demux->clusters, pos); + break; + } + + default: + GST_DEBUG_OBJECT (demux, "Ignoring Seek entry for ID=0x%x", seek_id); + break; + } + DEBUG_ELEMENT_STOP (demux, ebml, "Seek", ret); + + return ret; +} + +static GstFlowReturn +gst_matroska_demux_parse_contents (GstMatroskaDemux * demux, GstEbmlRead * ebml) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint32 id; + + DEBUG_ELEMENT_START (demux, ebml, "SeekHead"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (demux, ebml, "SeekHead", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_SEEKENTRY: + { + ret = gst_matroska_demux_parse_contents_seekentry (demux, ebml); + /* Ignore EOS and errors here */ + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (demux, "Ignoring %s", gst_flow_get_name (ret)); + ret = GST_FLOW_OK; + } + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (&demux->common, + ebml, "SeekHead", id); + break; + } + } + + DEBUG_ELEMENT_STOP (demux, ebml, "SeekHead", ret); + + /* Sort clusters by position for easier searching */ + if (demux->clusters) + g_array_sort (demux->clusters, (GCompareFunc) gst_matroska_cluster_compare); + + return ret; +} + +#define GST_FLOW_OVERFLOW GST_FLOW_CUSTOM_ERROR + +#define MAX_BLOCK_SIZE (15 * 1024 * 1024) + +static inline GstFlowReturn +gst_matroska_demux_check_read_size (GstMatroskaDemux * demux, guint64 bytes) +{ + if (G_UNLIKELY (bytes > MAX_BLOCK_SIZE)) { + /* only a few blocks are expected/allowed to be large, + * and will be recursed into, whereas others will be read and must fit */ + if (demux->streaming) { + /* fatal in streaming case, as we can't step over easily */ + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("reading large block of size %" G_GUINT64_FORMAT " not supported; " + "file might be corrupt.", bytes)); + return GST_FLOW_ERROR; + } else { + /* indicate higher level to quietly give up */ + GST_DEBUG_OBJECT (demux, + "too large block of size %" G_GUINT64_FORMAT, bytes); + return GST_FLOW_ERROR; + } + } else { + return GST_FLOW_OK; + } +} + +/* returns TRUE if we truely are in error state, and should give up */ +static inline gboolean +gst_matroska_demux_check_parse_error (GstMatroskaDemux * demux) +{ + if (!demux->streaming && demux->next_cluster_offset > 0) { + /* just repositioning to where next cluster should be and try from there */ + GST_WARNING_OBJECT (demux, "parse error, trying next cluster expected at %" + G_GUINT64_FORMAT, demux->next_cluster_offset); + demux->common.offset = demux->next_cluster_offset; + demux->next_cluster_offset = 0; + return FALSE; + } else { + gint64 pos; + + /* sigh, one last attempt above and beyond call of duty ...; + * search for cluster mark following current pos */ + pos = demux->common.offset; + GST_WARNING_OBJECT (demux, "parse error, looking for next cluster"); + if (gst_matroska_demux_search_cluster (demux, &pos) != GST_FLOW_OK) { + /* did not work, give up */ + return TRUE; + } else { + GST_DEBUG_OBJECT (demux, "... found at %" G_GUINT64_FORMAT, pos); + /* try that position */ + demux->common.offset = pos; + return FALSE; + } + } +} + +static inline GstFlowReturn +gst_matroska_demux_flush (GstMatroskaDemux * demux, guint flush) +{ + GST_LOG_OBJECT (demux, "skipping %d bytes", flush); + demux->common.offset += flush; + if (demux->streaming) { + GstFlowReturn ret; + + /* hard to skip large blocks when streaming */ + ret = gst_matroska_demux_check_read_size (demux, flush); + if (ret != GST_FLOW_OK) + return ret; + if (flush <= gst_adapter_available (demux->common.adapter)) + gst_adapter_flush (demux->common.adapter, flush); + else + return GST_FLOW_UNEXPECTED; + } + return GST_FLOW_OK; +} + +/* initializes @ebml with @bytes from input stream at current offset. + * Returns UNEXPECTED if insufficient available, + * ERROR if too much was attempted to read. */ +static inline GstFlowReturn +gst_matroska_demux_take (GstMatroskaDemux * demux, guint64 bytes, + GstEbmlRead * ebml) +{ + GstBuffer *buffer = NULL; + GstFlowReturn ret = GST_FLOW_OK; + + GST_LOG_OBJECT (demux, "taking %" G_GUINT64_FORMAT " bytes for parsing", + bytes); + ret = gst_matroska_demux_check_read_size (demux, bytes); + if (G_UNLIKELY (ret != GST_FLOW_OK)) { + if (!demux->streaming) { + /* in pull mode, we can skip */ + if ((ret = gst_matroska_demux_flush (demux, bytes)) == GST_FLOW_OK) + ret = GST_FLOW_OVERFLOW; + } else { + /* otherwise fatal */ + ret = GST_FLOW_ERROR; + } + goto exit; + } + if (demux->streaming) { + if (gst_adapter_available (demux->common.adapter) >= bytes) + buffer = gst_adapter_take_buffer (demux->common.adapter, bytes); + else + ret = GST_FLOW_UNEXPECTED; + } else + ret = gst_matroska_read_common_peek_bytes (&demux->common, + demux->common.offset, bytes, &buffer, NULL); + if (G_LIKELY (buffer)) { + gst_ebml_read_init (ebml, GST_ELEMENT_CAST (demux), buffer, + demux->common.offset); + demux->common.offset += bytes; + } +exit: + return ret; +} + +static void +gst_matroska_demux_check_seekability (GstMatroskaDemux * demux) +{ + GstQuery *query; + gboolean seekable = FALSE; + gint64 start = -1, stop = -1; + + query = gst_query_new_seeking (GST_FORMAT_BYTES); + if (!gst_pad_peer_query (demux->common.sinkpad, query)) { + GST_DEBUG_OBJECT (demux, "seeking query failed"); + goto done; + } + + gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); + + /* try harder to query upstream size if we didn't get it the first time */ + if (seekable && stop == -1) { + GstFormat fmt = GST_FORMAT_BYTES; + + GST_DEBUG_OBJECT (demux, "doing duration query to fix up unset stop"); + gst_pad_query_peer_duration (demux->common.sinkpad, &fmt, &stop); + } + + /* if upstream doesn't know the size, it's likely that it's not seekable in + * practice even if it technically may be seekable */ + if (seekable && (start != 0 || stop <= start)) { + GST_DEBUG_OBJECT (demux, "seekable but unknown start/stop -> disable"); + seekable = FALSE; + } + +done: + GST_INFO_OBJECT (demux, "seekable: %d (%" G_GUINT64_FORMAT " - %" + G_GUINT64_FORMAT ")", seekable, start, stop); + demux->seekable = seekable; + + gst_query_unref (query); +} + +static GstFlowReturn +gst_matroska_demux_find_tracks (GstMatroskaDemux * demux) +{ + guint32 id; + guint64 before_pos; + guint64 length; + guint needed; + GstFlowReturn ret = GST_FLOW_OK; + + GST_WARNING_OBJECT (demux, + "Found Cluster element before Tracks, searching Tracks"); + + /* remember */ + before_pos = demux->common.offset; + + /* Search Tracks element */ + while (TRUE) { + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (ret != GST_FLOW_OK) + break; + + if (id != GST_MATROSKA_ID_TRACKS) { + /* we may be skipping large cluster here, so forego size check etc */ + /* ... but we can't skip undefined size; force error */ + if (length == G_MAXUINT64) { + ret = gst_matroska_demux_check_read_size (demux, length); + break; + } else { + demux->common.offset += needed; + demux->common.offset += length; + } + continue; + } + + /* will lead to track parsing ... */ + ret = gst_matroska_demux_parse_id (demux, id, length, needed); + break; + } + + /* seek back */ + demux->common.offset = before_pos; + + return ret; +} + +#define GST_READ_CHECK(stmt) \ +G_STMT_START { \ + if (G_UNLIKELY ((ret = (stmt)) != GST_FLOW_OK)) { \ + if (ret == GST_FLOW_OVERFLOW) { \ + ret = GST_FLOW_OK; \ + } \ + goto read_error; \ + } \ +} G_STMT_END + +static GstFlowReturn +gst_matroska_demux_parse_id (GstMatroskaDemux * demux, guint32 id, + guint64 length, guint needed) +{ + GstEbmlRead ebml = { 0, }; + GstFlowReturn ret = GST_FLOW_OK; + guint64 read; + + GST_LOG_OBJECT (demux, "Parsing Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", prefix %d", id, length, needed); + + /* if we plan to read and parse this element, we need prefix (id + length) + * and the contents */ + /* mind about overflow wrap-around when dealing with undefined size */ + read = length; + if (G_LIKELY (length != G_MAXUINT64)) + read += needed; + + switch (demux->common.state) { + case GST_MATROSKA_READ_STATE_START: + switch (id) { + case GST_EBML_ID_HEADER: + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_read_common_parse_header (&demux->common, &ebml); + if (ret != GST_FLOW_OK) + goto parse_failed; + demux->common.state = GST_MATROSKA_READ_STATE_SEGMENT; + gst_matroska_demux_check_seekability (demux); + break; + default: + goto invalid_header; + break; + } + break; + case GST_MATROSKA_READ_STATE_SEGMENT: + switch (id) { + case GST_MATROSKA_ID_SEGMENT: + /* eat segment prefix */ + GST_READ_CHECK (gst_matroska_demux_flush (demux, needed)); + GST_DEBUG_OBJECT (demux, + "Found Segment start at offset %" G_GUINT64_FORMAT, + demux->common.offset); +#ifdef MKV_DEMUX_MODIFICATION + demux->initial_offset = demux->common.offset; + GST_INFO("Initial offset storing is %u", demux->initial_offset); +#endif + /* seeks are from the beginning of the segment, + * after the segment ID/length */ + demux->common.ebml_segment_start = demux->common.offset; + demux->common.state = GST_MATROSKA_READ_STATE_HEADER; + break; + default: + GST_WARNING_OBJECT (demux, + "Expected a Segment ID (0x%x), but received 0x%x!", + GST_MATROSKA_ID_SEGMENT, id); + GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); + break; + } + break; + case GST_MATROSKA_READ_STATE_SCANNING: + if (id != GST_MATROSKA_ID_CLUSTER && + id != GST_MATROSKA_ID_CLUSTERTIMECODE) + goto skip; + /* fall-through */ + case GST_MATROSKA_READ_STATE_HEADER: + case GST_MATROSKA_READ_STATE_DATA: + case GST_MATROSKA_READ_STATE_SEEK: + switch (id) { + case GST_MATROSKA_ID_SEGMENTINFO: + if (!demux->common.segmentinfo_parsed) { + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_read_common_parse_info (&demux->common, + GST_ELEMENT_CAST (demux), &ebml); +#ifdef MKV_DEMUX_MODIFICATION + demux->duration = demux->common.segment.duration; /* need to check */ +#endif + } else { + GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); + } + break; + case GST_MATROSKA_ID_TRACKS: + if (!demux->tracks_parsed) { + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_demux_parse_tracks (demux, &ebml); + } else { + GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); + } + break; + case GST_MATROSKA_ID_CLUSTER: + if (G_UNLIKELY (!demux->tracks_parsed)) { + if (demux->streaming) { + GST_DEBUG_OBJECT (demux, "Cluster before Track"); + goto not_streamable; + } else { + ret = gst_matroska_demux_find_tracks (demux); + if (!demux->tracks_parsed) + goto no_tracks; + } + } + if (G_UNLIKELY (demux->common.state + == GST_MATROSKA_READ_STATE_HEADER)) { + demux->common.state = GST_MATROSKA_READ_STATE_DATA; + demux->first_cluster_offset = demux->common.offset; + GST_DEBUG_OBJECT (demux, "signaling no more pads"); + gst_element_no_more_pads (GST_ELEMENT (demux)); + /* send initial newsegment - we wait till we know the first + incoming timestamp, so we can properly set the start of + the segment. */ + demux->need_newsegment = TRUE; + } + demux->cluster_time = GST_CLOCK_TIME_NONE; + demux->cluster_offset = demux->common.offset; + if (G_UNLIKELY (!demux->seek_first && demux->seek_block)) { + GST_DEBUG_OBJECT (demux, "seek target block %" G_GUINT64_FORMAT + " not found in Cluster, trying next Cluster's first block instead", + demux->seek_block); + demux->seek_block = 0; + } + demux->seek_first = FALSE; + /* record next cluster for recovery */ + if (read != G_MAXUINT64) + demux->next_cluster_offset = demux->cluster_offset + read; + /* eat cluster prefix */ + gst_matroska_demux_flush (demux, needed); + break; + case GST_MATROSKA_ID_CLUSTERTIMECODE: + { + guint64 num; + + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + if ((ret = gst_ebml_read_uint (&ebml, &id, &num)) != GST_FLOW_OK) + goto parse_failed; + GST_DEBUG_OBJECT (demux, "ClusterTimeCode: %" G_GUINT64_FORMAT, num); + demux->cluster_time = num; + if (demux->common.element_index) { + if (demux->common.element_index_writer_id == -1) + gst_index_get_writer_id (demux->common.element_index, + GST_OBJECT (demux), &demux->common.element_index_writer_id); + GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT " for writer id %d", + GST_TIME_ARGS (demux->cluster_time), demux->cluster_offset, + demux->common.element_index_writer_id); + gst_index_add_association (demux->common.element_index, + demux->common.element_index_writer_id, + GST_ASSOCIATION_FLAG_KEY_UNIT, + GST_FORMAT_TIME, demux->cluster_time, + GST_FORMAT_BYTES, demux->cluster_offset, NULL); + } + break; + } + case GST_MATROSKA_ID_BLOCKGROUP: + if (!gst_matroska_demux_seek_block (demux)) + goto skip; + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + DEBUG_ELEMENT_START (demux, &ebml, "BlockGroup"); + if ((ret = gst_ebml_read_master (&ebml, &id)) == GST_FLOW_OK) { + ret = gst_matroska_demux_parse_blockgroup_or_simpleblock (demux, + &ebml, demux->cluster_time, demux->cluster_offset, FALSE); + } + +#ifdef MKV_DEMUX_MODIFICATION + if ((demux->common.segment.rate < 0.0) && (demux->found_videokeyframe == TRUE) + && (demux->found_audioframe == TRUE) && (demux->current_ts >= demux->next_keyframe_ts) ) { + /* we displayed at least one one audio block and one video key frame + Now, goto previous cluster */ + int i =0; + int minusone = -1; + guint64 duration = 0; + GstClockTime time_position = 0; + GstMatroskaIndex *entry = NULL; + guint64 time=0; + + demux->next_keyframe_ts = demux->prev_keyframe_ts; + GST_INFO("next_keyframe_ts is %"GST_TIME_FORMAT, GST_TIME_ARGS(demux->next_keyframe_ts)); + demux->video_keyframe_pushed = FALSE; + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i); + if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + GST_DEBUG ("video track duration = %"G_GUINT64_FORMAT"position = %"GST_TIME_FORMAT"\n", + stream->default_duration, GST_TIME_ARGS(stream->pos)); + duration = stream->default_duration; + time_position = stream->pos; + } + } + + if((time_position - (minusone *demux->common.segment.rate)*((double)duration/1000000000))> 0) { + time_position -= (minusone *demux->common.segment.rate)*((double)duration/1000000000); + } else { + time_position=0; + } + + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i); + guint64 offset; + + GST_OBJECT_LOCK (demux); + if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + if ((entry = gst_matroska_read_common_do_index_seek (&demux->common, stream, time_position, NULL, NULL)) == NULL) { + GST_DEBUG_OBJECT (demux, "No matching seek entry in index"); + } else { + GST_DEBUG_OBJECT (demux, "pos = %"G_GUINT64_FORMAT", track = %d, block = %d, time = %"GST_TIME_FORMAT"\n", + entry->pos, entry->track, entry->block, GST_TIME_ARGS(entry->time)); + time = entry->time; + offset = entry->pos + demux->common.ebml_segment_start; + if (offset >= gst_matroska_read_common_get_length(&demux->common)) { + GST_INFO_OBJECT (demux, " Seek failed"); + goto seek_failed; + } + demux->common.offset = offset; + } + } + stream->pos = time; + stream->set_discont = TRUE; + stream->last_flow = GST_FLOW_OK; + if (stream->pos > 0.0) { + stream->eos = FALSE; + } else { + if(demux->is_eos_blockgroup == FALSE) { + demux->is_eos_blockgroup = TRUE; + } else { + stream->eos = TRUE; + GST_INFO_OBJECT (demux, "Reached EOS....."); + } + } + demux->common.segment.last_stop = time; + + GST_OBJECT_UNLOCK (demux); + } + + if (time == 0.0 && demux->is_eos_blockgroup == TRUE && demux->is_eos_simpleblock == TRUE) { + gst_segment_init (&demux->common.segment, GST_FORMAT_TIME); + gst_segment_set_duration (&demux->common.segment, GST_FORMAT_TIME, demux->duration); + + /* send new_segment event with start =0 and stop = duration */ + demux->new_segment = gst_event_new_new_segment_full (TRUE, + demux->common.segment.rate, demux->common.segment.applied_rate, demux->common.segment.format, + demux->common.segment.start, demux->common.segment.stop, demux->common.segment.time); + } + + demux->found_videokeyframe = FALSE; + demux->found_audioframe = FALSE; + demux->prev_keyframe_ts = time; + GST_INFO("prev_keyframe in blockgroup is %"GST_TIME_FORMAT,GST_TIME_ARGS(demux->prev_keyframe_ts)); + return ret; + } +#endif + + DEBUG_ELEMENT_STOP (demux, &ebml, "BlockGroup", ret); + break; + case GST_MATROSKA_ID_SIMPLEBLOCK: + if (!gst_matroska_demux_seek_block (demux)) + goto skip; + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + DEBUG_ELEMENT_START (demux, &ebml, "SimpleBlock"); + ret = gst_matroska_demux_parse_blockgroup_or_simpleblock (demux, + &ebml, demux->cluster_time, demux->cluster_offset, TRUE); + +#ifdef MKV_DEMUX_MODIFICATION + if ((demux->common.segment.rate < 0.0) && (demux->found_videokeyframe == TRUE) && (demux->found_audioframe == TRUE) + && (demux->current_ts >= demux->next_keyframe_ts) ) { + /* we displayed at least one one audio block and one video key frame + Now, goto previous cluster */ + int i =0; + int minusone = -1; + guint64 duration = 0; + GstClockTime time_position=0; + GstMatroskaIndex *entry = NULL; + + demux->next_keyframe_ts = demux->prev_keyframe_ts; + GST_INFO("next_keyframe_ts is %"GST_TIME_FORMAT, GST_TIME_ARGS(demux->next_keyframe_ts)); + demux->video_keyframe_pushed = FALSE; + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i); + if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + GST_DEBUG ("video track duration = %"G_GUINT64_FORMAT"position = %"GST_TIME_FORMAT"\n", + stream->default_duration, GST_TIME_ARGS(stream->pos)); + duration = stream->default_duration; + time_position = stream->pos; + } + } + + if((time_position - (minusone *demux->common.segment.rate)*((double)duration/1000000000))> 0) { + time_position -= (minusone *demux->common.segment.rate)*((double)duration/1000000000); + } else { + time_position=0; + } + + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i); + guint64 offset; + + GST_OBJECT_LOCK (demux); + if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + if ((entry = gst_matroska_read_common_do_index_seek (&demux->common, stream, time_position, NULL, NULL)) == NULL) { + GST_DEBUG_OBJECT (demux, "No matching seek entry in index"); + } + + GST_DEBUG_OBJECT (demux, "pos = %"G_GUINT64_FORMAT", track = %d, block = %d, time = %"GST_TIME_FORMAT"\n", + entry->pos, entry->track, entry->block, GST_TIME_ARGS(entry->time)); + + /* seek (relative to matroska segment) */ + + offset = entry->pos + demux->common.ebml_segment_start; + if (offset >= gst_matroska_read_common_get_length(&demux->common)) { + GST_INFO_OBJECT (demux, " Seek failed"); + GST_OBJECT_UNLOCK (demux); + goto seek_failed; + } + demux->common.offset = offset; + } + + stream->pos = entry->time; + stream->set_discont = TRUE; + stream->last_flow = GST_FLOW_OK; + if (stream->pos > 0.0) { + stream->eos = FALSE; + } else { + if(demux->is_eos_simpleblock == FALSE) { + demux->is_eos_simpleblock = TRUE; + } else { + stream->eos = TRUE; + GST_INFO_OBJECT (demux, "Reached EOS....."); + } + } + demux->common.segment.last_stop = entry->time; + + GST_OBJECT_UNLOCK (demux); + } + + if (entry->time == 0.0 && demux->is_eos_simpleblock == TRUE && demux->is_eos_blockgroup == TRUE) { + gst_segment_init (&demux->common.segment, GST_FORMAT_TIME); + gst_segment_set_duration (&demux->common.segment, GST_FORMAT_TIME, demux->duration); + + /* send new_segment event with start =0 and stop = duration */ + demux->new_segment = gst_event_new_new_segment_full (TRUE, + demux->common.segment.rate, demux->common.segment.applied_rate, demux->common.segment.format, + demux->common.segment.start, demux->common.segment.stop, demux->common.segment.time); + } + + demux->found_videokeyframe = FALSE; + demux->found_audioframe = FALSE; + demux->prev_keyframe_ts = entry->time; + GST_INFO("prev_keyframe in simpleblock is %"GST_TIME_FORMAT,GST_TIME_ARGS(demux->prev_keyframe_ts)); + return ret; + } +#endif + + DEBUG_ELEMENT_STOP (demux, &ebml, "SimpleBlock", ret); + break; + case GST_MATROSKA_ID_ATTACHMENTS: + if (!demux->common.attachments_parsed) { + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_read_common_parse_attachments (&demux->common, + GST_ELEMENT_CAST (demux), &ebml); + } else { + GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); + } + break; + case GST_MATROSKA_ID_TAGS: + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_read_common_parse_metadata (&demux->common, + GST_ELEMENT_CAST (demux), &ebml); + break; + case GST_MATROSKA_ID_CHAPTERS: + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_read_common_parse_chapters (&demux->common, &ebml); + break; + case GST_MATROSKA_ID_SEEKHEAD: + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_demux_parse_contents (demux, &ebml); + break; + case GST_MATROSKA_ID_CUES: + if (demux->common.index_parsed) { + GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); + break; + } + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_read_common_parse_index (&demux->common, &ebml); + /* only push based; delayed index building */ + if (ret == GST_FLOW_OK + && demux->common.state == GST_MATROSKA_READ_STATE_SEEK) { + GstEvent *event; + + GST_OBJECT_LOCK (demux); + event = demux->seek_event; + demux->seek_event = NULL; + GST_OBJECT_UNLOCK (demux); + + g_assert (event); + /* unlikely to fail, since we managed to seek to this point */ + if (!gst_matroska_demux_handle_seek_event (demux, NULL, event)) + goto seek_failed; + /* resume data handling, main thread clear to seek again */ + GST_OBJECT_LOCK (demux); + demux->common.state = GST_MATROSKA_READ_STATE_DATA; + GST_OBJECT_UNLOCK (demux); + } + break; + case GST_MATROSKA_ID_POSITION: + case GST_MATROSKA_ID_PREVSIZE: + case GST_MATROSKA_ID_ENCRYPTEDBLOCK: + case GST_MATROSKA_ID_SILENTTRACKS: + GST_DEBUG_OBJECT (demux, + "Skipping Cluster subelement 0x%x - ignoring", id); + /* fall-through */ + default: + skip: + GST_DEBUG_OBJECT (demux, "skipping Element 0x%x", id); + GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); + break; + } + break; + } + + if (ret == GST_FLOW_PARSE) + goto parse_failed; + +exit: + gst_ebml_read_clear (&ebml); + return ret; + + /* ERRORS */ +read_error: + { + /* simply exit, maybe not enough data yet */ + /* no ebml to clear if read error */ + return ret; + } +parse_failed: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Failed to parse Element 0x%x", id)); + ret = GST_FLOW_ERROR; + goto exit; + } +not_streamable: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("File layout does not permit streaming")); + ret = GST_FLOW_ERROR; + goto exit; + } +no_tracks: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("No Tracks element found")); + ret = GST_FLOW_ERROR; + goto exit; + } +invalid_header: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Invalid header")); + ret = GST_FLOW_ERROR; + goto exit; + } +seek_failed: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Failed to seek")); + ret = GST_FLOW_ERROR; + goto exit; + } +} + +static void +gst_matroska_demux_loop (GstPad * pad) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad)); + GstFlowReturn ret; + guint32 id; + guint64 length; + guint needed; + + /* If we have to close a segment, send a new segment to do this now */ + if (G_LIKELY (demux->common.state == GST_MATROSKA_READ_STATE_DATA)) { + if (G_UNLIKELY (demux->close_segment)) { + gst_matroska_demux_send_event (demux, demux->close_segment); + demux->close_segment = NULL; + } + if (G_UNLIKELY (demux->new_segment)) { + gst_matroska_demux_send_event (demux, demux->new_segment); + demux->new_segment = NULL; + } + } + + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (ret == GST_FLOW_UNEXPECTED) + goto eos; + if (ret != GST_FLOW_OK) { + if (gst_matroska_demux_check_parse_error (demux)) + goto pause; + else + return; + } + + GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", needed %d", demux->common.offset, id, + length, needed); + + ret = gst_matroska_demux_parse_id (demux, id, length, needed); + if (ret == GST_FLOW_UNEXPECTED) + goto eos; + if (ret != GST_FLOW_OK) + goto pause; + + /* check if we're at the end of a configured segment */ + if (G_LIKELY (demux->common.src->len)) { + guint i; + + g_assert (demux->common.num_streams == demux->common.src->len); + for (i = 0; i < demux->common.src->len; i++) { + +#ifdef MKV_DEMUX_MODIFICATION +//Index table Creation Logic + if((demux->seek_head_cluster_info_absent || demux->seek_head_cue_info_absent) && !demux->index_table_created) { + GST_INFO("Index table needs to be created"); + + guint64 index_offset = demux->common.offset; + + GST_INFO("offset index is %"G_GUINT64_FORMAT, demux->common.offset); + demux->common.segment.duration = -1; + gst_matroska_demux_create_index_table(demux); + + demux->common.offset = index_offset; + demux->index_table_created = TRUE; + demux->common.segment.last_stop = 0; + demux->common.segment.duration = demux->duration; + GST_INFO("index table creation completed"); + } +#endif + GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src, i); + GST_DEBUG_OBJECT (context->pad, "pos %" GST_TIME_FORMAT, + GST_TIME_ARGS (context->pos)); + if (context->eos == FALSE) + goto next; + } + + GST_INFO_OBJECT (demux, "All streams are EOS"); + ret = GST_FLOW_UNEXPECTED; +#ifdef MKV_DEMUX_MODIFICATION + if(demux->is_eos_blockgroup || demux->is_eos_simpleblock) { + demux->seek_entry = 0; + } +#endif + goto eos; + } + +next: + if (G_UNLIKELY (demux->common.offset == + gst_matroska_read_common_get_length (&demux->common))) { + GST_LOG_OBJECT (demux, "Reached end of stream"); + ret = GST_FLOW_UNEXPECTED; + goto eos; + } + + return; + + /* ERRORS */ +eos: + { + if (demux->common.segment.rate < 0.0) { + ret = gst_matroska_demux_seek_to_previous_keyframe (demux); + if (ret == GST_FLOW_OK) + return; + } + /* fall-through */ + } +pause: + { + const gchar *reason = gst_flow_get_name (ret); + gboolean push_eos = FALSE; + + GST_LOG_OBJECT (demux, "pausing task, reason %s", reason); + demux->segment_running = FALSE; + gst_pad_pause_task (demux->common.sinkpad); + + if (ret == GST_FLOW_UNEXPECTED) { + /* perform EOS logic */ + + /* If we were in the headers, make sure we send no-more-pads. + This will ensure decodebin2 does not get stuck thinking + the chain is not complete yet, and waiting indefinitely. */ + if (G_UNLIKELY (demux->common.state == GST_MATROSKA_READ_STATE_HEADER)) { + if (demux->common.src->len == 0) { + GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), + ("No pads created")); + } else { + GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), + ("Failed to finish reading headers")); + } + gst_element_no_more_pads (GST_ELEMENT (demux)); + } + + /* Close the segment, i.e. update segment stop with the duration + * if no stop was set */ + if (GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) && + !GST_CLOCK_TIME_IS_VALID (demux->common.segment.stop) && + GST_CLOCK_TIME_IS_VALID (demux->common.segment.start) && + demux->last_stop_end > demux->common.segment.start) { + /* arrange to accumulate duration downstream, but avoid sending + * newsegment with decreasing start (w.r.t. sync newsegment events) */ + GstEvent *event = + gst_event_new_new_segment_full (TRUE, demux->common.segment.rate, + demux->common.segment.applied_rate, demux->common.segment.format, + demux->last_stop_end, demux->last_stop_end, + demux->common.segment.time + (demux->last_stop_end - + demux->common.segment.start)); + gst_matroska_demux_send_event (demux, event); + } + + if (demux->common.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->common.segment.stop) == -1) + stop = demux->last_stop_end; + + GST_LOG_OBJECT (demux, "Sending segment done, at end of segment"); + gst_element_post_message (GST_ELEMENT (demux), + gst_message_new_segment_done (GST_OBJECT (demux), GST_FORMAT_TIME, + stop)); + } else { + push_eos = TRUE; + } + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + /* for fatal errors we post an error message */ + GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), + ("stream stopped, reason %s", reason)); + push_eos = TRUE; + } + if (push_eos) { + /* send EOS, and prevent hanging if no streams yet */ + GST_LOG_OBJECT (demux, "Sending EOS, at end of stream"); + if (!gst_matroska_demux_send_event (demux, gst_event_new_eos ()) && + (ret == GST_FLOW_UNEXPECTED)) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, + (NULL), ("got eos but no streams (yet)")); + } + } + return; + } +} + +/* + * Create and push a flushing seek event upstream + */ +static gboolean +perform_seek_to_offset (GstMatroskaDemux * demux, guint64 offset) +{ + GstEvent *event; + gboolean res = 0; + + GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset); + + event = + gst_event_new_seek (1.0, GST_FORMAT_BYTES, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, + GST_SEEK_TYPE_NONE, -1); + + res = gst_pad_push_event (demux->common.sinkpad, event); + + /* newsegment event will update offset */ + return res; +} + +static GstFlowReturn +gst_matroska_demux_chain (GstPad * pad, GstBuffer * buffer) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad)); + guint available; + GstFlowReturn ret = GST_FLOW_OK; + guint needed = 0; + guint32 id; + guint64 length; + + if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buffer))) { + GST_DEBUG_OBJECT (demux, "got DISCONT"); + gst_adapter_clear (demux->common.adapter); + GST_OBJECT_LOCK (demux); + gst_matroska_read_common_reset_streams (&demux->common, + GST_CLOCK_TIME_NONE, FALSE); + GST_OBJECT_UNLOCK (demux); + } + + gst_adapter_push (demux->common.adapter, buffer); + buffer = NULL; + +next: + available = gst_adapter_available (demux->common.adapter); + + ret = gst_matroska_read_common_peek_id_length_push (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)) + return ret; + + GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", needed %d, available %d", + demux->common.offset, id, length, needed, available); + + if (needed > available) + return GST_FLOW_OK; + + ret = gst_matroska_demux_parse_id (demux, id, length, needed); + if (ret == GST_FLOW_UNEXPECTED) { + /* need more data */ + return GST_FLOW_OK; + } else if (ret != GST_FLOW_OK) { + return ret; + } else + goto next; +} + +static gboolean +gst_matroska_demux_handle_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad)); + + GST_DEBUG_OBJECT (demux, + "have event type %s: %p on sink pad", GST_EVENT_TYPE_NAME (event), event); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time = 0; + gboolean update; + GstSegment segment; + + /* some debug output */ + gst_segment_init (&segment, GST_FORMAT_UNDEFINED); + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + gst_segment_set_newsegment_full (&segment, update, rate, arate, format, + start, stop, time); + GST_DEBUG_OBJECT (demux, + "received format %d newsegment %" GST_SEGMENT_FORMAT, format, + &segment); + + if (demux->common.state < GST_MATROSKA_READ_STATE_DATA) { + GST_DEBUG_OBJECT (demux, "still starting"); + goto exit; + } + + /* we only expect a BYTE segment, e.g. following a seek */ + if (format != GST_FORMAT_BYTES) { + GST_DEBUG_OBJECT (demux, "unsupported segment format, ignoring"); + goto exit; + } + + GST_DEBUG_OBJECT (demux, "clearing segment state"); + GST_OBJECT_LOCK (demux); + /* clear current segment leftover */ + gst_adapter_clear (demux->common.adapter); + /* and some streaming setup */ + demux->common.offset = start; + /* do not know where we are; + * need to come across a cluster and generate newsegment */ + demux->common.segment.last_stop = GST_CLOCK_TIME_NONE; + demux->cluster_time = GST_CLOCK_TIME_NONE; + demux->cluster_offset = 0; + demux->need_newsegment = TRUE; + /* but keep some of the upstream segment */ + demux->common.segment.rate = rate; + GST_OBJECT_UNLOCK (demux); + exit: + /* chain will send initial newsegment after pads have been added, + * or otherwise come up with one */ + GST_DEBUG_OBJECT (demux, "eating event"); + gst_event_unref (event); + res = TRUE; + break; + } + case GST_EVENT_EOS: + { + if (demux->common.state != GST_MATROSKA_READ_STATE_DATA) { + gst_event_unref (event); + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, + (NULL), ("got eos and didn't receive a complete header object")); + } else if (demux->common.num_streams == 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, + (NULL), ("got eos but no streams (yet)")); + } else { + gst_matroska_demux_send_event (demux, event); + } + break; + } + case GST_EVENT_FLUSH_STOP: + { + gst_adapter_clear (demux->common.adapter); + GST_OBJECT_LOCK (demux); + gst_matroska_read_common_reset_streams (&demux->common, + GST_CLOCK_TIME_NONE, TRUE); + demux->common.segment.last_stop = GST_CLOCK_TIME_NONE; + demux->cluster_time = GST_CLOCK_TIME_NONE; + demux->cluster_offset = 0; + GST_OBJECT_UNLOCK (demux); + /* fall-through */ + } + default: + res = gst_pad_event_default (pad, event); + break; + } + + return res; +} + +static gboolean +gst_matroska_demux_sink_activate (GstPad * sinkpad) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (sinkpad)); + + if (gst_pad_check_pull_range (sinkpad)) { + GST_DEBUG ("going to pull mode"); + demux->streaming = FALSE; + return gst_pad_activate_pull (sinkpad, TRUE); + } else { + GST_DEBUG ("going to push (streaming) mode"); + demux->streaming = TRUE; + return gst_pad_activate_push (sinkpad, TRUE); + } + + return FALSE; +} + +static gboolean +gst_matroska_demux_sink_activate_pull (GstPad * sinkpad, gboolean active) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (sinkpad)); + + if (active) { + /* if we have a scheduler we can start the task */ + demux->segment_running = TRUE; + gst_pad_start_task (sinkpad, (GstTaskFunction) gst_matroska_demux_loop, + sinkpad); + } else { + demux->segment_running = FALSE; + gst_pad_stop_task (sinkpad); + } + + return TRUE; +} + +static void +gst_duration_to_fraction (guint64 duration, gint * dest_n, gint * dest_d) +{ + static const int common_den[] = { 1, 2, 3, 4, 1001 }; + int n, d; + int i; + guint64 a; + + for (i = 0; i < G_N_ELEMENTS (common_den); i++) { + d = common_den[i]; + n = floor (0.5 + (d * 1e9) / duration); + a = gst_util_uint64_scale_int (1000000000, d, n); + if (duration >= a - 1 && duration <= a + 1) { + goto out; + } + } + + gst_util_double_to_fraction (1e9 / duration, &n, &d); + +out: + /* set results */ + *dest_n = n; + *dest_d = d; +} + +static GstCaps * +gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext * + videocontext, const gchar * codec_id, guint8 * data, guint size, + gchar ** codec_name, guint32 * riff_fourcc) +{ + GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) videocontext; + GstCaps *caps = NULL; + + g_assert (videocontext != NULL); + g_assert (codec_name != NULL); + + context->send_xiph_headers = FALSE; + context->send_flac_headers = FALSE; + context->send_speex_headers = FALSE; + + if (riff_fourcc) + *riff_fourcc = 0; + + /* TODO: check if we have all codec types from matroska-ids.h + * check if we have to do more special things with codec_private + * + * Add support for + * GST_MATROSKA_CODEC_ID_VIDEO_QUICKTIME + * GST_MATROSKA_CODEC_ID_VIDEO_SNOW + */ + + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC)) { + gst_riff_strf_vids *vids = NULL; + + if (data) { + GstBuffer *buf = NULL; + + vids = (gst_riff_strf_vids *) data; + + /* assure size is big enough */ + if (size < 24) { + GST_WARNING ("Too small BITMAPINFOHEADER (%d bytes)", size); + return NULL; + } + if (size < sizeof (gst_riff_strf_vids)) { + vids = g_new (gst_riff_strf_vids, 1); + memcpy (vids, data, size); + } + + /* little-endian -> byte-order */ + vids->size = GUINT32_FROM_LE (vids->size); + vids->width = GUINT32_FROM_LE (vids->width); + vids->height = GUINT32_FROM_LE (vids->height); + vids->planes = GUINT16_FROM_LE (vids->planes); + vids->bit_cnt = GUINT16_FROM_LE (vids->bit_cnt); + vids->compression = GUINT32_FROM_LE (vids->compression); + vids->image_size = GUINT32_FROM_LE (vids->image_size); + vids->xpels_meter = GUINT32_FROM_LE (vids->xpels_meter); + vids->ypels_meter = GUINT32_FROM_LE (vids->ypels_meter); + vids->num_colors = GUINT32_FROM_LE (vids->num_colors); + vids->imp_colors = GUINT32_FROM_LE (vids->imp_colors); + + if (size > sizeof (gst_riff_strf_vids)) { /* some extra_data */ + buf = gst_buffer_new_and_alloc (size - sizeof (gst_riff_strf_vids)); + memcpy (GST_BUFFER_DATA (buf), + (guint8 *) vids + sizeof (gst_riff_strf_vids), + GST_BUFFER_SIZE (buf)); + } + + if (riff_fourcc) + *riff_fourcc = vids->compression; + + caps = gst_riff_create_video_caps (vids->compression, NULL, vids, + buf, NULL, codec_name); + + if (caps == NULL) { + GST_WARNING ("Unhandled RIFF fourcc %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (vids->compression)); + } + + if (buf) + gst_buffer_unref (buf); + + if (vids != (gst_riff_strf_vids *) data) + g_free (vids); + } + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED)) { + guint32 fourcc = 0; + + switch (videocontext->fourcc) { + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + *codec_name = g_strdup ("Raw planar YUV 4:2:0"); + fourcc = videocontext->fourcc; + break; + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + *codec_name = g_strdup ("Raw packed YUV 4:2:2"); + fourcc = videocontext->fourcc; + break; + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + *codec_name = g_strdup ("Raw packed YUV 4:2:0"); + fourcc = videocontext->fourcc; + break; + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + *codec_name = g_strdup ("Raw packed YUV 4:2:2"); + fourcc = videocontext->fourcc; + break; + case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): + *codec_name = g_strdup ("Raw packed YUV 4:4:4 with alpha channel"); + fourcc = videocontext->fourcc; + break; + + default: + GST_DEBUG ("Unknown fourcc %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (videocontext->fourcc)); + return NULL; + } + + caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, fourcc, NULL); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP)) { + caps = gst_caps_new_simple ("video/x-divx", + "divxversion", G_TYPE_INT, 4, NULL); + *codec_name = g_strdup ("MPEG-4 simple profile"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP) || + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP)) { +#if 0 + caps = gst_caps_new_full (gst_structure_new ("video/x-divx", + "divxversion", G_TYPE_INT, 5, NULL), + gst_structure_new ("video/x-xvid", NULL), + gst_structure_new ("video/mpeg", + "mpegversion", G_TYPE_INT, 4, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL), NULL); +#endif + caps = gst_caps_new_simple ("video/mpeg", + "mpegversion", G_TYPE_INT, 4, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + if (data) { + GstBuffer *priv = gst_buffer_new_and_alloc (size); + + memcpy (GST_BUFFER_DATA (priv), data, size); + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL); + gst_buffer_unref (priv); + } + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP)) + *codec_name = g_strdup ("MPEG-4 advanced simple profile"); + else + *codec_name = g_strdup ("MPEG-4 advanced profile"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3)) { +#if 0 + caps = gst_caps_new_full (gst_structure_new ("video/x-divx", + "divxversion", G_TYPE_INT, 3, NULL), + gst_structure_new ("video/x-msmpeg", + "msmpegversion", G_TYPE_INT, 43, NULL), NULL); +#endif + caps = gst_caps_new_simple ("video/x-msmpeg", + "msmpegversion", G_TYPE_INT, 43, NULL); + *codec_name = g_strdup ("Microsoft MPEG-4 v.3"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1) || + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG2)) { + gint mpegversion; + + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1)) + mpegversion = 1; + else + mpegversion = 2; + + caps = gst_caps_new_simple ("video/mpeg", + "systemstream", G_TYPE_BOOLEAN, FALSE, + "mpegversion", G_TYPE_INT, mpegversion, NULL); + *codec_name = g_strdup_printf ("MPEG-%d video", mpegversion); + context->postprocess_frame = gst_matroska_demux_add_mpeg_seq_header; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MJPEG)) { + caps = gst_caps_new_simple ("image/jpeg", NULL); + *codec_name = g_strdup ("Motion-JPEG"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC)) { + caps = gst_caps_new_simple ("video/x-h264", NULL); + if (data) { + GstBuffer *priv = gst_buffer_new_and_alloc (size); + + /* First byte is the version, second is the profile indication, and third + * is the 5 contraint_set_flags and 3 reserved bits. Fourth byte is the + * level indication. */ + gst_codec_utils_h264_caps_set_level_and_profile (caps, data + 1, + size - 1); + + memcpy (GST_BUFFER_DATA (priv), data, size); + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL); + gst_buffer_unref (priv); + + gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "avc", + "alignment", G_TYPE_STRING, "au", NULL); + } else { + GST_WARNING ("No codec data found, assuming output is byte-stream"); + gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "byte-stream", + NULL); + } + *codec_name = g_strdup ("H264"); + } else if ((!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1)) || + (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2)) || + (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3)) || + (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4))) { + gint rmversion = -1; + + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1)) + rmversion = 1; + else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2)) + rmversion = 2; + else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3)) + rmversion = 3; + else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4)) + rmversion = 4; + + caps = gst_caps_new_simple ("video/x-pn-realvideo", + "rmversion", G_TYPE_INT, rmversion, NULL); + GST_DEBUG ("data:%p, size:0x%x", data, size); + /* We need to extract the extradata ! */ + if (data && (size >= 0x22)) { + GstBuffer *priv; + guint rformat; + guint subformat; + + subformat = GST_READ_UINT32_BE (data + 0x1a); + rformat = GST_READ_UINT32_BE (data + 0x1e); + + priv = gst_buffer_new_and_alloc (size - 0x1a); + + memcpy (GST_BUFFER_DATA (priv), data + 0x1a, size - 0x1a); + gst_caps_set_simple (caps, + "codec_data", GST_TYPE_BUFFER, priv, + "format", G_TYPE_INT, rformat, + "subformat", G_TYPE_INT, subformat, NULL); + gst_buffer_unref (priv); + + } + *codec_name = g_strdup_printf ("RealVideo %d.0", rmversion); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_THEORA)) { + caps = gst_caps_new_simple ("video/x-theora", NULL); + context->send_xiph_headers = TRUE; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_DIRAC)) { + caps = gst_caps_new_simple ("video/x-dirac", NULL); + *codec_name = g_strdup_printf ("Dirac"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VP8)) { + caps = gst_caps_new_simple ("video/x-vp8", NULL); + *codec_name = g_strdup_printf ("On2 VP8"); + } else { + GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id); + return NULL; + } + + if (caps != NULL) { + int i; + GstStructure *structure; + + for (i = 0; i < gst_caps_get_size (caps); i++) { + structure = gst_caps_get_structure (caps, i); + + /* FIXME: use the real unit here! */ + GST_DEBUG ("video size %dx%d, target display size %dx%d (any unit)", + videocontext->pixel_width, + videocontext->pixel_height, + videocontext->display_width, videocontext->display_height); + + /* pixel width and height are the w and h of the video in pixels */ + if (videocontext->pixel_width > 0 && videocontext->pixel_height > 0) { + gint w = videocontext->pixel_width; + gint h = videocontext->pixel_height; + + gst_structure_set (structure, + "width", G_TYPE_INT, w, "height", G_TYPE_INT, h, NULL); + } + + if (videocontext->display_width > 0 || videocontext->display_height > 0) { + int n, d; + + if (videocontext->display_width <= 0) + videocontext->display_width = videocontext->pixel_width; + if (videocontext->display_height <= 0) + videocontext->display_height = videocontext->pixel_height; + + /* calculate the pixel aspect ratio using the display and pixel w/h */ + n = videocontext->display_width * videocontext->pixel_height; + d = videocontext->display_height * videocontext->pixel_width; + GST_DEBUG ("setting PAR to %d/%d", n, d); + gst_structure_set (structure, "pixel-aspect-ratio", + GST_TYPE_FRACTION, + videocontext->display_width * videocontext->pixel_height, + videocontext->display_height * videocontext->pixel_width, NULL); + } + + if (videocontext->default_fps > 0.0) { + GValue fps_double = { 0, }; + GValue fps_fraction = { 0, }; + + g_value_init (&fps_double, G_TYPE_DOUBLE); + g_value_init (&fps_fraction, GST_TYPE_FRACTION); + g_value_set_double (&fps_double, videocontext->default_fps); + g_value_transform (&fps_double, &fps_fraction); + + GST_DEBUG ("using default fps %f", videocontext->default_fps); + + gst_structure_set_value (structure, "framerate", &fps_fraction); + g_value_unset (&fps_double); + g_value_unset (&fps_fraction); + } else if (context->default_duration > 0) { + int fps_n, fps_d; + + gst_duration_to_fraction (context->default_duration, &fps_n, &fps_d); + + GST_INFO ("using default duration %" G_GUINT64_FORMAT + " framerate %d/%d", context->default_duration, fps_n, fps_d); + + gst_structure_set (structure, "framerate", GST_TYPE_FRACTION, + fps_n, fps_d, NULL); + } else { + /* sort of a hack to get most codecs to support, + * even if the default_duration is missing */ + gst_structure_set (structure, "framerate", GST_TYPE_FRACTION, + 25, 1, NULL); + } + + if (videocontext->parent.flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) + gst_structure_set (structure, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL); + } + + gst_caps_do_simplify (caps); + } + + return caps; +} + +/* + * Some AAC specific code... *sigh* + * FIXME: maybe we should use '15' and code the sample rate explicitly + * if the sample rate doesn't match the predefined rates exactly? (tpm) + */ + +static gint +aac_rate_idx (gint rate) +{ + if (92017 <= rate) + return 0; + else if (75132 <= rate) + return 1; + else if (55426 <= rate) + return 2; + else if (46009 <= rate) + return 3; + else if (37566 <= rate) + return 4; + else if (27713 <= rate) + return 5; + else if (23004 <= rate) + return 6; + else if (18783 <= rate) + return 7; + else if (13856 <= rate) + return 8; + else if (11502 <= rate) + return 9; + else if (9391 <= rate) + return 10; + else + return 11; +} + +static gint +aac_profile_idx (const gchar * codec_id) +{ + gint profile; + + if (strlen (codec_id) <= 12) + profile = 3; + else if (!strncmp (&codec_id[12], "MAIN", 4)) + profile = 0; + else if (!strncmp (&codec_id[12], "LC", 2)) + profile = 1; + else if (!strncmp (&codec_id[12], "SSR", 3)) + profile = 2; + else + profile = 3; + + return profile; +} + +#define AAC_SYNC_EXTENSION_TYPE 0x02b7 + +static GstCaps * +gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext * + audiocontext, const gchar * codec_id, guint8 * data, guint size, + gchar ** codec_name, guint16 * riff_audio_fmt) +{ + GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) audiocontext; + GstCaps *caps = NULL; + + g_assert (audiocontext != NULL); + g_assert (codec_name != NULL); + + if (riff_audio_fmt) + *riff_audio_fmt = 0; + + context->send_xiph_headers = FALSE; + context->send_flac_headers = FALSE; + context->send_speex_headers = FALSE; + + /* TODO: check if we have all codec types from matroska-ids.h + * check if we have to do more special things with codec_private + * check if we need bitdepth in different places too + * implement channel position magic + * Add support for: + * GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID9 + * GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID10 + * GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDMC + * GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDM2 + */ + + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1) || + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2) || + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3)) { + gint layer; + + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1)) + layer = 1; + else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2)) + layer = 2; + else + layer = 3; + + caps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, layer, NULL); + *codec_name = g_strdup_printf ("MPEG-1 layer %d", layer); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE) || + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE)) { + gint endianness; + + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE)) + endianness = G_BIG_ENDIAN; + else + endianness = G_LITTLE_ENDIAN; + + caps = gst_caps_new_simple ("audio/x-raw-int", + "width", G_TYPE_INT, audiocontext->bitdepth, + "depth", G_TYPE_INT, audiocontext->bitdepth, + "signed", G_TYPE_BOOLEAN, audiocontext->bitdepth != 8, + "endianness", G_TYPE_INT, endianness, NULL); + + *codec_name = g_strdup_printf ("Raw %d-bit PCM audio", + audiocontext->bitdepth); + context->alignment = audiocontext->bitdepth / 8; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT)) { + caps = gst_caps_new_simple ("audio/x-raw-float", + "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, + "width", G_TYPE_INT, audiocontext->bitdepth, NULL); + *codec_name = g_strdup_printf ("Raw %d-bit floating-point audio", + audiocontext->bitdepth); + context->alignment = audiocontext->bitdepth / 8; + } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AC3, + strlen (GST_MATROSKA_CODEC_ID_AUDIO_AC3))) { + caps = gst_caps_new_simple ("audio/x-ac3", + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + *codec_name = g_strdup ("AC-3 audio"); + } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_EAC3, + strlen (GST_MATROSKA_CODEC_ID_AUDIO_EAC3))) { + caps = gst_caps_new_simple ("audio/x-eac3", + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + *codec_name = g_strdup ("E-AC-3 audio"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_DTS)) { + caps = gst_caps_new_simple ("audio/x-dts", NULL); + *codec_name = g_strdup ("DTS audio"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_VORBIS)) { + caps = gst_caps_new_simple ("audio/x-vorbis", NULL); + context->send_xiph_headers = TRUE; + /* vorbis decoder does tags */ + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_FLAC)) { + caps = gst_caps_new_simple ("audio/x-flac", NULL); + context->send_flac_headers = TRUE; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_SPEEX)) { + caps = gst_caps_new_simple ("audio/x-speex", NULL); + context->send_speex_headers = TRUE; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_ACM)) { + gst_riff_strf_auds auds; + + if (data) { + GstBuffer *codec_data = gst_buffer_new (); + + /* little-endian -> byte-order */ + auds.format = GST_READ_UINT16_LE (data); + auds.channels = GST_READ_UINT16_LE (data + 2); + auds.rate = GST_READ_UINT32_LE (data + 4); + auds.av_bps = GST_READ_UINT32_LE (data + 8); + auds.blockalign = GST_READ_UINT16_LE (data + 12); + auds.size = GST_READ_UINT16_LE (data + 16); + + /* 18 is the waveformatex size */ + gst_buffer_set_data (codec_data, data + 18, auds.size); + + if (riff_audio_fmt) + *riff_audio_fmt = auds.format; + + caps = gst_riff_create_audio_caps (auds.format, NULL, &auds, NULL, + codec_data, codec_name); + gst_buffer_unref (codec_data); + + if (caps == NULL) { + GST_WARNING ("Unhandled RIFF audio format 0x%02x", auds.format); + } + } + } else if (g_str_has_prefix (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC)) { + GstBuffer *priv = NULL; + gint mpegversion; + gint rate_idx, profile; + guint8 *data = NULL; + + /* unspecified AAC profile with opaque private codec data */ + if (strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC) == 0) { + if (context->codec_priv_size >= 2) { + guint obj_type, freq_index, explicit_freq_bytes = 0; + + codec_id = GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4; + mpegversion = 4; + freq_index = (GST_READ_UINT16_BE (context->codec_priv) & 0x780) >> 7; + obj_type = (GST_READ_UINT16_BE (context->codec_priv) & 0xF800) >> 11; + if (freq_index == 15) + explicit_freq_bytes = 3; + GST_DEBUG ("obj_type = %u, freq_index = %u", obj_type, freq_index); + priv = gst_buffer_new_and_alloc (context->codec_priv_size); + memcpy (GST_BUFFER_DATA (priv), context->codec_priv, + context->codec_priv_size); + /* assume SBR if samplerate <= 24kHz */ + if (obj_type == 5 || (freq_index >= 6 && freq_index != 15) || + (context->codec_priv_size == (5 + explicit_freq_bytes))) { + audiocontext->samplerate *= 2; + } + } else { + GST_WARNING ("Opaque A_AAC codec ID, but no codec private data"); + /* this is pretty broken; + * maybe we need to make up some default private, + * or maybe ADTS data got dumped in. + * Let's set up some private data now, and check actual data later */ + /* just try this and see what happens ... */ + codec_id = GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4; + context->postprocess_frame = gst_matroska_demux_check_aac; + } + } + + /* make up decoder-specific data if it is not supplied */ + if (priv == NULL) { + priv = gst_buffer_new_and_alloc (5); + data = GST_BUFFER_DATA (priv); + rate_idx = aac_rate_idx (audiocontext->samplerate); + profile = aac_profile_idx (codec_id); + + data[0] = ((profile + 1) << 3) | ((rate_idx & 0xE) >> 1); + data[1] = ((rate_idx & 0x1) << 7) | (audiocontext->channels << 3); + GST_BUFFER_SIZE (priv) = 2; + + if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2, + strlen (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2))) { + mpegversion = 2; + } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4, + strlen (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4))) { + mpegversion = 4; + + if (g_strrstr (codec_id, "SBR")) { + /* HE-AAC (aka SBR AAC) */ + audiocontext->samplerate *= 2; + rate_idx = aac_rate_idx (audiocontext->samplerate); + data[2] = AAC_SYNC_EXTENSION_TYPE >> 3; + data[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5; + data[4] = (1 << 7) | (rate_idx << 3); + GST_BUFFER_SIZE (priv) = 5; + } + } else { + gst_buffer_unref (priv); + priv = NULL; + GST_ERROR ("Unknown AAC profile and no codec private data"); + } + } + + if (priv) { + caps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, mpegversion, + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL); + *codec_name = g_strdup_printf ("MPEG-%d AAC audio", mpegversion); + gst_buffer_unref (priv); + } + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_TTA)) { + caps = gst_caps_new_simple ("audio/x-tta", + "width", G_TYPE_INT, audiocontext->bitdepth, NULL); + *codec_name = g_strdup ("TTA audio"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_WAVPACK4)) { + caps = gst_caps_new_simple ("audio/x-wavpack", + "width", G_TYPE_INT, audiocontext->bitdepth, + "framed", G_TYPE_BOOLEAN, TRUE, NULL); + *codec_name = g_strdup ("Wavpack audio"); + context->postprocess_frame = gst_matroska_demux_add_wvpk_header; + audiocontext->wvpk_block_index = 0; + } else if ((!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4)) || + (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4)) || + (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK))) { + gint raversion = -1; + + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4)) + raversion = 1; + else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK)) + raversion = 8; + else + raversion = 2; + + caps = gst_caps_new_simple ("audio/x-pn-realaudio", + "raversion", G_TYPE_INT, raversion, NULL); + /* Extract extra information from caps, mapping varies based on codec */ + if (data && (size >= 0x50)) { + GstBuffer *priv; + guint flavor; + guint packet_size; + guint height; + guint leaf_size; + guint sample_width; + guint extra_data_size; + + GST_ERROR ("real audio raversion:%d", raversion); + if (raversion == 8) { + /* COOK */ + flavor = GST_READ_UINT16_BE (data + 22); + packet_size = GST_READ_UINT32_BE (data + 24); + height = GST_READ_UINT16_BE (data + 40); + leaf_size = GST_READ_UINT16_BE (data + 44); + sample_width = GST_READ_UINT16_BE (data + 58); + extra_data_size = GST_READ_UINT32_BE (data + 74); + + GST_ERROR + ("flavor:%d, packet_size:%d, height:%d, leaf_size:%d, sample_width:%d, extra_data_size:%d", + flavor, packet_size, height, leaf_size, sample_width, + extra_data_size); + gst_caps_set_simple (caps, "flavor", G_TYPE_INT, flavor, "packet_size", + G_TYPE_INT, packet_size, "height", G_TYPE_INT, height, "leaf_size", + G_TYPE_INT, leaf_size, "width", G_TYPE_INT, sample_width, NULL); + + if ((size - 78) >= extra_data_size) { + priv = gst_buffer_new_and_alloc (extra_data_size); + memcpy (GST_BUFFER_DATA (priv), data + 78, extra_data_size); + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL); + gst_buffer_unref (priv); + } + } + } + + *codec_name = g_strdup_printf ("RealAudio %d.0", raversion); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_SIPR)) { + caps = gst_caps_new_simple ("audio/x-sipro", NULL); + *codec_name = g_strdup ("Sipro/ACELP.NET Voice Codec"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_RALF)) { + caps = gst_caps_new_simple ("audio/x-ralf-mpeg4-generic", NULL); + *codec_name = g_strdup ("Real Audio Lossless"); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_ATRC)) { + caps = gst_caps_new_simple ("audio/x-vnd.sony.atrac3", NULL); + *codec_name = g_strdup ("Sony ATRAC3"); + } else { + GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id); + return NULL; + } + + if (caps != NULL) { + if (audiocontext->samplerate > 0 && audiocontext->channels > 0) { + gint i; + + for (i = 0; i < gst_caps_get_size (caps); i++) { + gst_structure_set (gst_caps_get_structure (caps, i), + "channels", G_TYPE_INT, audiocontext->channels, + "rate", G_TYPE_INT, audiocontext->samplerate, NULL); + } + } + + gst_caps_do_simplify (caps); + } + + return caps; +} + +static GstCaps * +gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext * + subtitlecontext, const gchar * codec_id, gpointer data, guint size) +{ + GstCaps *caps = NULL; + GstMatroskaTrackContext *context = + (GstMatroskaTrackContext *) subtitlecontext; + + /* for backwards compatibility */ + if (!g_ascii_strcasecmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_ASCII)) + codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8; + else if (!g_ascii_strcasecmp (codec_id, "S_SSA")) + codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_SSA; + else if (!g_ascii_strcasecmp (codec_id, "S_ASS")) + codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_ASS; + else if (!g_ascii_strcasecmp (codec_id, "S_USF")) + codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_USF; + + /* TODO: Add GST_MATROSKA_CODEC_ID_SUBTITLE_BMP support + * Check if we have to do something with codec_private */ + if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8)) { + /* well, plain text simply does not have a lot of markup ... */ + caps = gst_caps_new_simple ("text/x-pango-markup", NULL); + context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer; + subtitlecontext->check_markup = TRUE; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_SSA)) { + caps = gst_caps_new_simple ("application/x-ssa", NULL); + context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer; + subtitlecontext->check_markup = FALSE; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_ASS)) { + caps = gst_caps_new_simple ("application/x-ass", NULL); + context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer; + subtitlecontext->check_markup = FALSE; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_USF)) { + caps = gst_caps_new_simple ("application/x-usf", NULL); + context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer; + subtitlecontext->check_markup = FALSE; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB)) { + caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL); + ((GstMatroskaTrackContext *) subtitlecontext)->send_dvd_event = TRUE; + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_HDMVPGS)) { + caps = gst_caps_new_simple ("subpicture/x-pgs", NULL); + } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_KATE)) { + caps = gst_caps_new_simple ("subtitle/x-kate", NULL); + context->send_xiph_headers = TRUE; + } else { + GST_DEBUG ("Unknown subtitle stream: codec_id='%s'", codec_id); + caps = gst_caps_new_simple ("application/x-subtitle-unknown", NULL); + } + + if (data != NULL && size > 0) { + GstBuffer *buf; + + buf = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (buf), data, size); + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + } + + return caps; +} + +static void +gst_matroska_demux_set_index (GstElement * element, GstIndex * index) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); + + GST_OBJECT_LOCK (demux); + if (demux->common.element_index) + gst_object_unref (demux->common.element_index); + demux->common.element_index = index ? gst_object_ref (index) : NULL; + GST_OBJECT_UNLOCK (demux); + GST_DEBUG_OBJECT (demux, "Set index %" GST_PTR_FORMAT, + demux->common.element_index); +} + +static GstIndex * +gst_matroska_demux_get_index (GstElement * element) +{ + GstIndex *result = NULL; + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); + + GST_OBJECT_LOCK (demux); + if (demux->common.element_index) + result = gst_object_ref (demux->common.element_index); + GST_OBJECT_UNLOCK (demux); + + GST_DEBUG_OBJECT (demux, "Returning index %" GST_PTR_FORMAT, result); + + return result; +} + + +#ifdef MKV_DEMUX_MODIFICATION +static GstMatroskaIndex * +gst_matroska_demux_get_next_index (GstMatroskaDemux * demux, GstMatroskaTrackContext * track, GstMatroskaIndex *entry) +{ + int i =0; + GArray *index; + GstMatroskaIndex *tmp = NULL; + + /* find entry just before or at the requested position */ + if (track && track->index_table) + index = track->index_table; + else + index = demux->common.index; + + for (i=0; i < index->len; i++) { + tmp = &g_array_index (index, GstMatroskaIndex, i); + if ((tmp->time == entry->time) && (tmp->pos == entry->pos)) { + if ((index->len - i) == 1) { + GST_DEBUG_OBJECT (demux, "entry found in last index...returning last index"); + } else { + GST_DEBUG_OBJECT (demux, "Found entry at index = %d"); + i = i+1; + tmp = &g_array_index (index, GstMatroskaIndex, i); + } + return tmp; + } + } + return NULL; +} + +static GstFlowReturn +gst_matroska_demux_trickplay_find_tracks (GstMatroskaDemux * demux) +{ + guint32 id; + guint64 before_pos; + guint64 length; + guint needed; + GstFlowReturn ret = GST_FLOW_OK; + + GST_WARNING_OBJECT (demux, + "Found Cluster element before Tracks, searching Tracks"); + + /* remember */ + before_pos = demux->common.offset; + + /* Search Tracks element */ + while (TRUE) { + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (ret != GST_FLOW_OK) + break; + + if (id != GST_MATROSKA_ID_TRACKS) { + /* we may be skipping large cluster here, so forego size check etc */ + /* ... but we can't skip undefined size; force error */ + if (length == G_MAXUINT64) { + ret = gst_matroska_demux_check_read_size (demux, length); + break; + } else { + demux->common.offset += needed; + demux->common.offset += length; + } + continue; + } + + /* will lead to track parsing ... */ + ret = gst_matroska_demux_trickplay_parse_id (demux, id, length, needed); + break; + } + + /* seek back */ + demux->common.offset = before_pos; + + return ret; +} + +static GstFlowReturn +gst_matroska_demux_trickplay_parse_id (GstMatroskaDemux * demux, guint32 id, + guint64 length, guint needed) +{ + GstEbmlRead ebml = { 0, }; + GstFlowReturn ret = GST_FLOW_OK; + guint64 read; + + GST_LOG_OBJECT (demux, "Parsing Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", prefix %d", id, length, needed); + + /* if we plan to read and parse this element, we need prefix (id + length) + * and the contents */ + /* mind about overflow wrap-around when dealing with undefined size */ + read = length; + if (G_LIKELY (length != G_MAXUINT64)) + read += needed; + + switch (demux->common.state) { + case GST_MATROSKA_READ_STATE_START: + switch (id) { + case GST_EBML_ID_HEADER: + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + ret = gst_matroska_read_common_parse_header (&demux->common, &ebml); + if (ret != GST_FLOW_OK) + goto parse_failed; + demux->common.state = GST_MATROSKA_READ_STATE_SEGMENT; + gst_matroska_demux_check_seekability (demux); + break; + default: + goto invalid_header; + break; + } + break; + case GST_MATROSKA_READ_STATE_SEGMENT: + switch (id) { + case GST_MATROSKA_ID_SEGMENT: + /* eat segment prefix */ + GST_READ_CHECK (gst_matroska_demux_flush (demux, needed)); + GST_DEBUG_OBJECT (demux, + "Found Segment start at offset %" G_GUINT64_FORMAT, + demux->common.offset); + /* seeks are from the beginning of the segment, + * after the segment ID/length */ + demux->common.ebml_segment_start = demux->common.offset; + demux->common.state = GST_MATROSKA_READ_STATE_HEADER; + break; + default: + GST_WARNING_OBJECT (demux, + "Expected a Segment ID (0x%x), but received 0x%x!", + GST_MATROSKA_ID_SEGMENT, id); + GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); + break; + } + break; + case GST_MATROSKA_READ_STATE_SCANNING: + if (id != GST_MATROSKA_ID_CLUSTER && + id != GST_MATROSKA_ID_CLUSTERTIMECODE) + goto skip; + /* fall-through */ + case GST_MATROSKA_READ_STATE_HEADER: + case GST_MATROSKA_READ_STATE_DATA: + case GST_MATROSKA_READ_STATE_SEEK: + switch (id) { + case GST_MATROSKA_ID_CLUSTER: + if (G_UNLIKELY (!demux->tracks_parsed)) { + if (demux->streaming) { + GST_DEBUG_OBJECT (demux, "Cluster before Track"); + goto not_streamable; + } else { + ret = gst_matroska_demux_trickplay_find_tracks (demux); + if (!demux->tracks_parsed) + goto no_tracks; + } + } + if (G_UNLIKELY (demux->common.state == GST_MATROSKA_READ_STATE_HEADER)) { + demux->common.state = GST_MATROSKA_READ_STATE_DATA; + demux->first_cluster_offset = demux->common.offset; + GST_DEBUG_OBJECT (demux, "signaling no more pads"); + gst_element_no_more_pads (GST_ELEMENT (demux)); + /* send initial newsegment */ + gst_matroska_demux_send_event (demux, + gst_event_new_new_segment (FALSE, 1.0, + GST_FORMAT_TIME, 0, + (demux->common.segment.duration > + 0) ? demux->common.segment.duration : -1, 0)); + } + demux->cluster_time = GST_CLOCK_TIME_NONE; + demux->cluster_offset = demux->common.offset; + if (G_UNLIKELY (!demux->seek_first && demux->seek_block)) { + GST_DEBUG_OBJECT (demux, "seek target block %" G_GUINT64_FORMAT + " not found in Cluster, trying next Cluster's first block instead", + demux->seek_block); + demux->seek_block = 0; + } + demux->seek_first = FALSE; + /* record next cluster for recovery */ + if (read != G_MAXUINT64) + demux->next_cluster_offset = demux->cluster_offset + read; + /* eat cluster prefix */ + gst_matroska_demux_flush (demux, needed); + break; + case GST_MATROSKA_ID_CLUSTERTIMECODE: { + guint64 num; + + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + if ((ret = gst_ebml_read_uint (&ebml, &id, &num)) != GST_FLOW_OK) + goto parse_failed; + GST_DEBUG_OBJECT (demux, "ClusterTimeCode: %" G_GUINT64_FORMAT, num); + demux->cluster_time = num; + if (demux->common.element_index) { + if (demux->common.element_index_writer_id == -1) + gst_index_get_writer_id (demux->common.element_index, + GST_OBJECT (demux), &demux->common.element_index_writer_id); + GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT " for writer id %d", + GST_TIME_ARGS (demux->cluster_time), demux->cluster_offset, + demux->common.element_index_writer_id); + gst_index_add_association (demux->common.element_index, + demux->common.element_index_writer_id, GST_ASSOCIATION_FLAG_KEY_UNIT, + GST_FORMAT_TIME, demux->cluster_time, + GST_FORMAT_BYTES, demux->cluster_offset, NULL); + } + break; + } + case GST_MATROSKA_ID_BLOCKGROUP: + if (!gst_matroska_demux_seek_block (demux)) + goto skip; + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + DEBUG_ELEMENT_START (demux, &ebml, "BlockGroup"); + if ((ret = gst_ebml_read_master (&ebml, &id)) == GST_FLOW_OK) { + ret = gst_matroska_demux_trickplay_parse_blockgroup_or_simpleblock (demux, + &ebml, demux->cluster_time, demux->cluster_offset, FALSE); + } + DEBUG_ELEMENT_STOP (demux, &ebml, "BlockGroup", ret); + break; + case GST_MATROSKA_ID_SIMPLEBLOCK: + if (!gst_matroska_demux_seek_block (demux)) + goto skip; + GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); + DEBUG_ELEMENT_START (demux, &ebml, "SimpleBlock"); + ret = gst_matroska_demux_trickplay_parse_blockgroup_or_simpleblock (demux, + &ebml, demux->cluster_time, demux->cluster_offset, TRUE); + DEBUG_ELEMENT_STOP (demux, &ebml, "SimpleBlock", ret); + break; + case GST_MATROSKA_ID_SEGMENTINFO: + case GST_MATROSKA_ID_TRACKS: + case GST_MATROSKA_ID_ATTACHMENTS: + case GST_MATROSKA_ID_TAGS: + case GST_MATROSKA_ID_CHAPTERS: + case GST_MATROSKA_ID_SEEKHEAD: + case GST_MATROSKA_ID_CUES: + case GST_MATROSKA_ID_POSITION: + case GST_MATROSKA_ID_PREVSIZE: + case GST_MATROSKA_ID_ENCRYPTEDBLOCK: + case GST_MATROSKA_ID_SILENTTRACKS: + GST_DEBUG_OBJECT (demux, + "Skipping Cluster subelement 0x%x - ignoring", id); + /* fall-through */ + default: + skip: + GST_DEBUG_OBJECT (demux, "skipping Element 0x%x", id); + GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); + break; + } + break; + } + + if (ret == GST_FLOW_PARSE) + goto parse_failed; + +exit: + gst_ebml_read_clear (&ebml); + return ret; + + /* ERRORS */ +read_error: + { + /* simply exit, maybe not enough data yet */ + /* no ebml to clear if read error */ + return ret; + } +parse_failed: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Failed to parse Element 0x%x", id)); + ret = GST_FLOW_ERROR; + goto exit; + } +not_streamable: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("File layout does not permit streaming")); + ret = GST_FLOW_ERROR; + goto exit; + } +no_tracks: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("No Tracks element found")); + ret = GST_FLOW_ERROR; + goto exit; + } +invalid_header: + { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Invalid header")); + ret = GST_FLOW_ERROR; + goto exit; + } +} + +static GstFlowReturn +gst_matroska_demux_trickplay_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, + GstEbmlRead * ebml, guint64 cluster_time, guint64 cluster_offset, + gboolean is_simpleblock) +{ + GstMatroskaTrackContext *stream = NULL; + GstFlowReturn ret = GST_FLOW_OK; + gboolean readblock = FALSE; + guint32 id; + guint64 block_duration = 0; + GstBuffer *buf = NULL; + gint stream_num = -1, n, laces = 0; + guint size = 0; + gint64 time = 0; + gint flags = 0; + gint64 referenceblock = 0; + gint64 offset; + + offset = gst_ebml_read_get_offset (ebml); + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if (!is_simpleblock) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) { + goto data_error; + } + } else { + id = GST_MATROSKA_ID_SIMPLEBLOCK; + } + + switch (id) { + /* one block inside the group. Note, block parsing is one + * of the harder things, so this code is a bit complicated. + * See http://www.matroska.org/ for documentation. */ + case GST_MATROSKA_ID_SIMPLEBLOCK: + case GST_MATROSKA_ID_BLOCK: { + guint64 num; + guint8 *data; + + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + if ((ret = gst_ebml_read_buffer (ebml, &id, &buf)) != GST_FLOW_OK) + break; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* first byte(s): blocknum */ + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) + goto data_error; + data += n; + size -= n; + + /* fetch stream from num */ + stream_num = gst_matroska_read_common_stream_from_num (&demux->common, num); + if (G_UNLIKELY (size < 3)) { + GST_WARNING_OBJECT (demux, "Invalid size %u", size); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } else if (G_UNLIKELY (stream_num < 0 || + stream_num >= demux->common.num_streams)) { + /* let's not give up on a stray invalid track number */ + GST_WARNING_OBJECT (demux, + "Invalid stream %d for track number %" G_GUINT64_FORMAT + "; ignoring block", stream_num, num); + goto done; + } + + stream = g_ptr_array_index (demux->common.src, stream_num); + + /* time (relative to cluster time) */ + time = ((gint16) GST_READ_UINT16_BE (data)); + data += 2; + size -= 2; + flags = GST_READ_UINT8 (data); + data += 1; + size -= 1; + + GST_LOG_OBJECT (demux, "time %" G_GUINT64_FORMAT ", flags %d", time, + flags); + + switch ((flags & 0x06) >> 1) { + case 0x0: /* no lacing */ + laces = 1; + break; + + case 0x1: /* xiph lacing */ + case 0x2: /* fixed-size lacing */ + case 0x3: /* EBML lacing */ + if (size == 0) + goto invalid_lacing; + laces = GST_READ_UINT8 (data) + 1; + break; + } + + + if (ret != GST_FLOW_OK) + break; + + readblock = TRUE; + break; + } + + case GST_MATROSKA_ID_BLOCKDURATION: { + ret = gst_ebml_read_uint (ebml, &id, &block_duration); + GST_DEBUG_OBJECT (demux, "BlockDuration: %" G_GUINT64_FORMAT, + block_duration); + break; + } + + case GST_MATROSKA_ID_REFERENCEBLOCK: { + ret = gst_ebml_read_sint (ebml, &id, &referenceblock); + GST_DEBUG_OBJECT (demux, "ReferenceBlock: %" G_GINT64_FORMAT, + referenceblock); + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (&demux->common, ebml, "BlockGroup", id); + break; + + case GST_MATROSKA_ID_BLOCKVIRTUAL: + case GST_MATROSKA_ID_BLOCKADDITIONS: + case GST_MATROSKA_ID_REFERENCEPRIORITY: + case GST_MATROSKA_ID_REFERENCEVIRTUAL: + case GST_MATROSKA_ID_SLICES: + GST_DEBUG_OBJECT (demux, + "Skipping BlockGroup subelement 0x%x - ignoring", id); + ret = gst_ebml_read_skip (ebml); + break; + } + + if (is_simpleblock) + break; + } + + /* reading a number or so could have failed */ + if (ret != GST_FLOW_OK) + goto data_error; + + if (ret == GST_FLOW_OK && readblock) { + gint64 lace_time = 0; + gboolean delta_unit; + + stream = g_ptr_array_index (demux->common.src, stream_num); + + if (cluster_time != GST_CLOCK_TIME_NONE) { + /* FIXME: What to do with negative timestamps? Give timestamp 0 or -1? + * Drop unless the lace contains timestamp 0? */ + if (time < 0 && (-time) > cluster_time) { + lace_time = 0; + } else { + if (stream->timecodescale == 1.0) + lace_time = (cluster_time + time) * demux->common.time_scale; + else + lace_time = + gst_util_guint64_to_gdouble ((cluster_time + time) * + demux->common.time_scale) * stream->timecodescale; + } + } else { + lace_time = GST_CLOCK_TIME_NONE; + } + + /* else duration is diff between timecode of this and next block */ + + /* For SimpleBlock, look at the keyframe bit in flags. Otherwise, + a ReferenceBlock implies that this is not a keyframe. In either + case, it only makes sense for video streams. */ + delta_unit = stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && + ((is_simpleblock && !(flags & 0x80)) || referenceblock); + + if (delta_unit && stream->set_discont) { + /* When doing seeks or such, we need to restart on key frames or + * decoders might choke. */ + GST_DEBUG_OBJECT (demux, "skipping delta unit"); + goto done; + } + + /* last_ts used for EOS in trickplay */ + stream->last_ts = lace_time; + + if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + stream->num_frames_bw_keyframes++; + if (delta_unit == FALSE) { + stream->found_next_kframe = TRUE; + demux->next_key_cluster_time = demux->cluster_time; + stream->next_kframe_timestamp = lace_time; + demux->common.segment.last_stop = lace_time - 0.5* GST_SECOND; + } + } else if (stream->type == GST_MATROSKA_TRACK_TYPE_AUDIO) { + stream->num_frames_bw_keyframes = stream->num_frames_bw_keyframes + laces; + } + } + +done: + if (buf) + gst_buffer_unref (buf); + + return ret; + +invalid_lacing: + { + GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Invalid lacing size")); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } +data_error: + { + GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Data error")); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } +} + +static gint32 +gst_matroska_demux_trickplay_nframes2show_bw_keyframes (GstMatroskaDemux* demux, GstMatroskaTrackContext * stream) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint32 id; + guint64 length; + guint needed; + gint prev_offset = demux->common.offset; + gint next_keyframe_offset = 0; + guint64 prev_cluster_time = demux->cluster_time; + guint64 prev_cluster_offset = demux->cluster_offset; + int i = 0; + + while (stream->found_next_kframe == FALSE) { + next_keyframe_offset = demux->common.offset; + + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id, &length, &needed); + if (ret == GST_FLOW_UNEXPECTED) { + stream->next_kframe_timestamp = stream->last_ts; + stream->found_next_kframe = TRUE; + break; + } + GST_LOG_OBJECT (demux, "trickplay : Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", needed %d", demux->common.offset, id, + length, needed); + + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (demux, "Error in id_length_pull flow ret...reason : %s\n", gst_flow_get_name (ret)); + break; + } + + ret = gst_matroska_demux_trickplay_parse_id (demux, id, length, needed); + if (ret == GST_FLOW_UNEXPECTED) { + stream->next_kframe_timestamp = stream->last_ts; + stream->found_next_kframe = TRUE; + break; + } + + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (demux, "Error in parse_id flow ret...reason : %s\n", gst_flow_get_name (ret)); + break; + } + } + + if (stream->found_next_kframe == TRUE) { + demux->next_key_frame_offset = next_keyframe_offset; + } + + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src, i); + if (context->type <= GST_MATROSKA_TRACK_TYPE_AUDIO) { + context->frames_to_show_bw_keyframes = context->num_frames_bw_keyframes / demux->common.segment.rate; + } + } + + /* keeping previous offset values for normal operation */ + demux->common.offset = prev_offset; + demux->cluster_offset = prev_cluster_offset; + demux->cluster_time = prev_cluster_time; + + return stream->num_frames_bw_keyframes; +} + +static GstFlowReturn +gst_matroska_demux_backward_trickplay (GstMatroskaDemux* demux, GstMatroskaTrackContext * stream, GstBuffer* sub) +{ + GstFlowReturn ret = GST_FLOW_OK; + + if (((stream->type == GST_MATROSKA_TRACK_TYPE_AUDIO) || (!GST_BUFFER_FLAG_IS_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT))) + && (demux->prev_keyframe_ts <= (GST_BUFFER_TIMESTAMP (sub)) <= demux->next_keyframe_ts)) { + + if(stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && !demux->video_keyframe_pushed) { + demux->video_keyframe_pushed = TRUE; + } else if(stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && demux->video_keyframe_pushed){ + GST_INFO("unreffing the video frame (already sent one keyframe)"); + gst_buffer_unref (sub); + return ret; + } + + if(demux->prev_keyframe_ts == demux->next_keyframe_ts || demux->prev_keyframe_ts > demux->next_keyframe_ts) { + GST_INFO("Unreffing the already pushed buffer"); + gst_buffer_unref (sub); + return ret; + } + + GST_DEBUG_OBJECT (demux, "Pushing data of size %d for stream %d, time=%"GST_TIME_FORMAT + " and duration=%" GST_TIME_FORMAT, + GST_BUFFER_SIZE (sub), stream->type, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), + GST_TIME_ARGS (GST_BUFFER_DURATION (sub))); + + g_assert (stream->alignment <= G_MEM_ALIGN); + if (((guintptr) GST_BUFFER_DATA (sub)) & (stream->alignment - 1)) { + GST_INFO("in if alignment log"); + GstBuffer *buffer = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (sub)); + memcpy (GST_BUFFER_DATA (buffer), GST_BUFFER_DATA (sub), + GST_BUFFER_SIZE (sub)); + gst_buffer_copy_metadata (buffer, sub, GST_BUFFER_COPY_ALL); + GST_DEBUG_OBJECT (demux, "We want output aligned on %d, reallocated", stream->alignment); + gst_buffer_unref (sub); + sub = buffer; + } + + ret = gst_pad_push(stream->pad, sub); + + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (demux, "Error in pad_push. Reason : %s\n", gst_flow_get_name (ret)); + } + } else if(GST_BUFFER_FLAG_IS_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT)) { + gst_buffer_unref (sub); + } + return ret; +} + +static GstFlowReturn +gst_matroska_demux_forward_trickplay (GstMatroskaDemux* demux, GstMatroskaTrackContext * stream, GstBuffer *buffer, gboolean *skip) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint64 time_escalation = 0; + gint i = 0; + + if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + if ((stream->found_next_kframe == FALSE) && (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT))) { + GST_INFO("Finding the no of frames b/w keyframe"); + g_assert (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)); + gst_matroska_demux_trickplay_nframes2show_bw_keyframes (demux, stream); + stream->prev_kframe_timestamp = GST_BUFFER_TIMESTAMP (buffer); + GST_INFO("next keyframe timestamp is %"GST_TIME_FORMAT" and previous keyframe timestamp is %"GST_TIME_FORMAT, + GST_TIME_ARGS(stream->next_kframe_timestamp), GST_TIME_ARGS(stream->prev_kframe_timestamp)); + stream->avg_duration_bw_keyframes = (stream->next_kframe_timestamp - stream->prev_kframe_timestamp) / stream->num_frames_bw_keyframes; + GST_INFO_OBJECT (demux, "Number of frames between key frames = %d and frames to show between key frames = %d", stream->num_frames_bw_keyframes, stream->frames_to_show_bw_keyframes); + GST_DEBUG_OBJECT (demux, "average duration of frames = %"GST_TIME_FORMAT, GST_TIME_ARGS(stream->avg_duration_bw_keyframes)); + + for (i = 0; i < demux->common.src->len; i++) { + GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src, i); + if (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO) { + context->num_frames_bw_keyframes = 0; + } + } + } else { + if (stream->frames_to_show_bw_keyframes == 0) { + stream->found_next_kframe = FALSE; + demux->cluster_time = demux->next_key_cluster_time; + demux->common.offset = demux->next_key_frame_offset; + stream->num_frames_bw_keyframes = 0; + GST_DEBUG_OBJECT (demux, "next key cluster time = %"GST_TIME_FORMAT" and offset = %u...\n", GST_TIME_ARGS(demux->cluster_time), demux->common.offset); + } + + if(stream->num_frames_bw_keyframes == 0) + *skip = TRUE; + + if(stream->frames_to_show_bw_keyframes > 0) { + GST_INFO("Time stamp modification %"GST_TIME_FORMAT,GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer))); + + time_escalation = ((stream->num_frames_bw_keyframes/demux->common.segment.rate) - stream->frames_to_show_bw_keyframes) * stream->avg_duration_bw_keyframes * demux->common.segment.rate; + + GST_BUFFER_TIMESTAMP(buffer) = stream->prev_kframe_timestamp + time_escalation; + GST_INFO("Time stamp modified %"GST_TIME_FORMAT,GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer))); + } + stream->frames_to_show_bw_keyframes--; + } + } else if (stream->type == GST_MATROSKA_TRACK_TYPE_AUDIO) { + if (stream->frames_to_show_bw_keyframes == 0) { + *skip = TRUE; + stream->num_frames_bw_keyframes = 0; + stream->frames_to_show_bw_keyframes = 0; + } else { + stream->frames_to_show_bw_keyframes--; + } + } + return ret; +} +#endif + + + +static GstStateChangeReturn +gst_matroska_demux_change_state (GstElement * element, + GstStateChange transition) +{ + GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + /* handle upwards state changes here */ + switch (transition) { + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + /* handle downwards state changes */ + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_matroska_demux_reset (GST_ELEMENT (demux)); + break; + default: + break; + } + + return ret; +} + +static void +gst_matroska_demux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstMatroskaDemux *demux; + + g_return_if_fail (GST_IS_MATROSKA_DEMUX (object)); + demux = GST_MATROSKA_DEMUX (object); + + switch (prop_id) { + case ARG_MAX_GAP_TIME: + GST_OBJECT_LOCK (demux); + demux->max_gap_time = g_value_get_uint64 (value); + GST_OBJECT_UNLOCK (demux); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_matroska_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstMatroskaDemux *demux; + + g_return_if_fail (GST_IS_MATROSKA_DEMUX (object)); + demux = GST_MATROSKA_DEMUX (object); + + switch (prop_id) { + case ARG_MAX_GAP_TIME: + GST_OBJECT_LOCK (demux); + g_value_set_uint64 (value, demux->max_gap_time); + GST_OBJECT_UNLOCK (demux); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +#ifdef MKV_DEMUX_MODIFICATION +static gboolean gst_matroska_demux_create_index_table(GstMatroskaDemux* demux) +{ + GstFlowReturn ret; + guint32 id_index; + guint64 length_index; + guint needed_index; + + while(TRUE) { + ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, + GST_ELEMENT_CAST (demux), &id_index, &length_index, &needed_index); + + if (ret == GST_FLOW_UNEXPECTED || ret != GST_FLOW_OK) { + GST_INFO("problem in pulling data or eos reached"); + demux->index_table_created = TRUE; + break; + } + + GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", needed %d", demux->common.offset, id_index, + length_index, needed_index); + + ret = gst_matroska_demux_parse_id (demux, id_index, length_index, needed_index); + + if(ret == GST_FLOW_UNEXPECTED || ret != GST_FLOW_OK) { + GST_INFO("problem in pulling data or eos reached"); + demux->index_table_created = TRUE; + break; + } + } + + return TRUE; +} +#endif + +gboolean +gst_matroska_demux_plugin_init (GstPlugin * plugin) +{ + gst_riff_init (); + + /* parser helper separate debug */ + GST_DEBUG_CATEGORY_INIT (ebmlread_debug, "ebmlread", + 0, "EBML stream helper class"); + + /* create an elementfactory for the matroska_demux element */ + if (!gst_element_register (plugin, "matroskademux", + GST_RANK_PRIMARY, GST_TYPE_MATROSKA_DEMUX)) + return FALSE; + + return TRUE; +} diff --git a/gst/matroska/matroska-demux.h b/gst/matroska/matroska-demux.h new file mode 100644 index 0000000..a8e442f --- /dev/null +++ b/gst/matroska/matroska-demux.h @@ -0,0 +1,138 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * (c) 2011 Debarshi Ray + * + * matroska-demux.h: matroska file/stream demuxer definition + * + * 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_MATROSKA_DEMUX_H__ +#define __GST_MATROSKA_DEMUX_H__ + +#include + +#include "ebml-read.h" +#include "matroska-ids.h" +#include "matroska-read-common.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MATROSKA_DEMUX \ + (gst_matroska_demux_get_type ()) +#define GST_MATROSKA_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemux)) +#define GST_MATROSKA_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemuxClass)) +#define GST_IS_MATROSKA_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_DEMUX)) +#define GST_IS_MATROSKA_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_DEMUX)) + +typedef struct _GstMatroskaDemux { + GstElement parent; + + /* < private > */ + + GstMatroskaReadCommon common; + + /* pads */ + GstClock *clock; + guint num_v_streams; + guint num_a_streams; + guint num_t_streams; + + /* state */ + gboolean streaming; + guint level_up; + guint64 seek_block; + gboolean seek_first; + + /* did we parse cues/tracks/segmentinfo already? */ + gboolean tracks_parsed; + GList *seek_parsed; + + /* cluster positions (optional) */ + GArray *clusters; + + /* keeping track of playback position */ + gboolean segment_running; + GstClockTime last_stop_end; + GstClockTime stream_start_time; + + GstEvent *close_segment; + GstEvent *new_segment; + + /* some state saving */ + GstClockTime cluster_time; + guint64 cluster_offset; + guint64 first_cluster_offset; + guint64 next_cluster_offset; + +#ifdef MKV_DEMUX_MODIFICATION + gint64 duration; /* need to check */ + GstClockTime time_position; + GstMatroskaTrackContext* audio_stream; + gboolean video; + gboolean found_videokeyframe; + gboolean found_audioframe; + gboolean seek_head_cluster_info_absent; + gboolean seek_head_cue_info_absent; + gboolean index_table_created; + gboolean index_table_array_creation; + guint32 initial_offset; +#endif + + /* index stuff */ + gboolean seekable; + gboolean building_index; + guint64 index_offset; + GstEvent *seek_event; + gboolean need_newsegment; + + /* reverse playback */ + GArray *seek_index; + gint seek_entry; + +#ifdef MKV_DEMUX_MODIFICATION + GstClockTime next_key_cluster_time; + guint64 next_key_frame_offset; + GstClockTime current_ts; + GstClockTime current_fwd_ts; + GstClockTime next_keyframe_ts; + GstClockTime prev_keyframe_ts; + gboolean is_eos_blockgroup; + gboolean is_eos_simpleblock; + gint no_video_frame; + gboolean video_keyframe_pushed; +#endif + + /* gap handling */ + guint64 max_gap_time; + + /* for non-finalized files, with invalid segment duration */ + gboolean invalid_duration; +} GstMatroskaDemux; + +typedef struct _GstMatroskaDemuxClass { + GstElementClass parent; +} GstMatroskaDemuxClass; + +gboolean gst_matroska_demux_plugin_init (GstPlugin *plugin); + +G_END_DECLS + +#endif /* __GST_MATROSKA_DEMUX_H__ */ diff --git a/gst/matroska/matroska-ids.c b/gst/matroska/matroska-ids.c new file mode 100644 index 0000000..8e62395 --- /dev/null +++ b/gst/matroska/matroska-ids.c @@ -0,0 +1,118 @@ +/* GStreamer Matroska muxer/demuxer + * (C) 2003 Ronald Bultje + * (C) 2006 Tim-Philipp Müller + * + * matroska-ids.c: matroska track context utility functions + * + * 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 "matroska-ids.h" + +gboolean +gst_matroska_track_init_video_context (GstMatroskaTrackContext ** p_context) +{ + GstMatroskaTrackVideoContext *video_context; + + g_assert (p_context != NULL && *p_context != NULL); + + /* already set up? (track info might come before track type) */ + if ((*p_context)->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + GST_LOG ("video context already set up"); + return TRUE; + } + + /* it better not have been set up as some other track type ... */ + if ((*p_context)->type != 0) { + g_return_val_if_reached (FALSE); + } + + video_context = g_renew (GstMatroskaTrackVideoContext, *p_context, 1); + *p_context = (GstMatroskaTrackContext *) video_context; + + /* defaults */ + (*p_context)->type = GST_MATROSKA_TRACK_TYPE_VIDEO; + video_context->display_width = 0; + video_context->display_height = 0; + video_context->pixel_width = 0; + video_context->pixel_height = 0; + video_context->asr_mode = 0; + video_context->fourcc = 0; + video_context->default_fps = 0.0; + video_context->earliest_time = GST_CLOCK_TIME_NONE; + return TRUE; +} + +gboolean +gst_matroska_track_init_audio_context (GstMatroskaTrackContext ** p_context) +{ + GstMatroskaTrackAudioContext *audio_context; + + g_assert (p_context != NULL && *p_context != NULL); + + /* already set up? (track info might come before track type) */ + if ((*p_context)->type == GST_MATROSKA_TRACK_TYPE_AUDIO) + return TRUE; + + /* it better not have been set up as some other track type ... */ + if ((*p_context)->type != 0) { + g_return_val_if_reached (FALSE); + } + + audio_context = g_renew (GstMatroskaTrackAudioContext, *p_context, 1); + *p_context = (GstMatroskaTrackContext *) audio_context; + + /* defaults */ + (*p_context)->type = GST_MATROSKA_TRACK_TYPE_AUDIO; + audio_context->channels = 1; + audio_context->samplerate = 8000; + return TRUE; +} + +gboolean +gst_matroska_track_init_subtitle_context (GstMatroskaTrackContext ** p_context) +{ + GstMatroskaTrackSubtitleContext *subtitle_context; + + g_assert (p_context != NULL && *p_context != NULL); + + /* already set up? (track info might come before track type) */ + if ((*p_context)->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE) + return TRUE; + + /* it better not have been set up as some other track type ... */ + if ((*p_context)->type != 0) { + g_return_val_if_reached (FALSE); + } + + subtitle_context = g_renew (GstMatroskaTrackSubtitleContext, *p_context, 1); + *p_context = (GstMatroskaTrackContext *) subtitle_context; + + (*p_context)->type = GST_MATROSKA_TRACK_TYPE_SUBTITLE; + subtitle_context->invalid_utf8 = FALSE; + subtitle_context->seen_markup_tag = FALSE; + return TRUE; +} + +void +gst_matroska_register_tags (void) +{ + /* TODO: register other custom tags */ +} diff --git a/gst/matroska/matroska-ids.h b/gst/matroska/matroska-ids.h new file mode 100644 index 0000000..c88555c --- /dev/null +++ b/gst/matroska/matroska-ids.h @@ -0,0 +1,639 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * + * matroska-ids.h: matroska file/stream data IDs + * + * 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_MATROSKA_IDS_H__ +#define __GST_MATROSKA_IDS_H__ + +#include + +#include "ebml-ids.h" + +#define MKV_DEMUX_MODIFICATION /* for enabling changes */ + +/* + * EBML DocType. + */ + +#define GST_MATROSKA_DOCTYPE_MATROSKA "matroska" +#define GST_MATROSKA_DOCTYPE_WEBM "webm" + +/* + * Matroska element IDs. max. 32-bit. + */ + +/* toplevel Segment */ +#define GST_MATROSKA_ID_SEGMENT 0x18538067 + +/* matroska top-level master IDs, childs of Segment */ +#define GST_MATROSKA_ID_SEGMENTINFO 0x1549A966 +#define GST_MATROSKA_ID_TRACKS 0x1654AE6B +#define GST_MATROSKA_ID_CUES 0x1C53BB6B +#define GST_MATROSKA_ID_TAGS 0x1254C367 +#define GST_MATROSKA_ID_SEEKHEAD 0x114D9B74 +#define GST_MATROSKA_ID_CLUSTER 0x1F43B675 +#define GST_MATROSKA_ID_ATTACHMENTS 0x1941A469 +#define GST_MATROSKA_ID_CHAPTERS 0x1043A770 + +/* IDs in the SegmentInfo master */ +#define GST_MATROSKA_ID_TIMECODESCALE 0x2AD7B1 +#define GST_MATROSKA_ID_DURATION 0x4489 +#define GST_MATROSKA_ID_WRITINGAPP 0x5741 +#define GST_MATROSKA_ID_MUXINGAPP 0x4D80 +#define GST_MATROSKA_ID_DATEUTC 0x4461 +#define GST_MATROSKA_ID_SEGMENTUID 0x73A4 +#define GST_MATROSKA_ID_SEGMENTFILENAME 0x7384 +#define GST_MATROSKA_ID_PREVUID 0x3CB923 +#define GST_MATROSKA_ID_PREVFILENAME 0x3C83AB +#define GST_MATROSKA_ID_NEXTUID 0x3EB923 +#define GST_MATROSKA_ID_NEXTFILENAME 0x3E83BB +#define GST_MATROSKA_ID_TITLE 0x7BA9 +#define GST_MATROSKA_ID_SEGMENTFAMILY 0x4444 +#define GST_MATROSKA_ID_CHAPTERTRANSLATE 0x6924 + +/* IDs in the ChapterTranslate master */ +#define GST_MATROSKA_ID_CHAPTERTRANSLATEEDITIONUID 0x69FC +#define GST_MATROSKA_ID_CHAPTERTRANSLATECODEC 0x69BF +#define GST_MATROSKA_ID_CHAPTERTRANSLATEID 0x69A5 + +/* ID in the Tracks master */ +#define GST_MATROSKA_ID_TRACKENTRY 0xAE + +/* IDs in the TrackEntry master */ +#define GST_MATROSKA_ID_TRACKNUMBER 0xD7 +#define GST_MATROSKA_ID_TRACKUID 0x73C5 +#define GST_MATROSKA_ID_TRACKTYPE 0x83 +#define GST_MATROSKA_ID_TRACKAUDIO 0xE1 +#define GST_MATROSKA_ID_TRACKVIDEO 0xE0 +#define GST_MATROSKA_ID_CONTENTENCODINGS 0x6D80 +#define GST_MATROSKA_ID_CODECID 0x86 +#define GST_MATROSKA_ID_CODECPRIVATE 0x63A2 +#define GST_MATROSKA_ID_CODECNAME 0x258688 +#define GST_MATROSKA_ID_TRACKNAME 0x536E +#define GST_MATROSKA_ID_TRACKLANGUAGE 0x22B59C +#define GST_MATROSKA_ID_TRACKFLAGENABLED 0xB9 +#define GST_MATROSKA_ID_TRACKFLAGDEFAULT 0x88 +#define GST_MATROSKA_ID_TRACKFLAGFORCED 0x55AA +#define GST_MATROSKA_ID_TRACKFLAGLACING 0x9C +#define GST_MATROSKA_ID_TRACKMINCACHE 0x6DE7 +#define GST_MATROSKA_ID_TRACKMAXCACHE 0x6DF8 +#define GST_MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383 +#define GST_MATROSKA_ID_TRACKTIMECODESCALE 0x23314F +#define GST_MATROSKA_ID_MAXBLOCKADDITIONID 0x55EE +#define GST_MATROSKA_ID_TRACKATTACHMENTLINK 0x7446 +#define GST_MATROSKA_ID_TRACKOVERLAY 0x6FAB +#define GST_MATROSKA_ID_TRACKTRANSLATE 0x6624 +/* semi-draft */ +#define GST_MATROSKA_ID_TRACKOFFSET 0x537F +/* semi-draft */ +#define GST_MATROSKA_ID_CODECSETTINGS 0x3A9697 +/* semi-draft */ +#define GST_MATROSKA_ID_CODECINFOURL 0x3B4040 +/* semi-draft */ +#define GST_MATROSKA_ID_CODECDOWNLOADURL 0x26B240 +/* semi-draft */ +#define GST_MATROSKA_ID_CODECDECODEALL 0xAA + +/* IDs in the TrackTranslate master */ +#define GST_MATROSKA_ID_TRACKTRANSLATEEDITIONUID 0x66FC +#define GST_MATROSKA_ID_TRACKTRANSLATECODEC 0x66BF +#define GST_MATROSKA_ID_TRACKTRANSLATETRACKID 0x66A5 + + +/* IDs in the TrackVideo master */ +/* NOTE: This one is here only for backward compatibility. + * Use _TRACKDEFAULDURATION */ +#define GST_MATROSKA_ID_VIDEOFRAMERATE 0x2383E3 +#define GST_MATROSKA_ID_VIDEODISPLAYWIDTH 0x54B0 +#define GST_MATROSKA_ID_VIDEODISPLAYHEIGHT 0x54BA +#define GST_MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2 +#define GST_MATROSKA_ID_VIDEOPIXELWIDTH 0xB0 +#define GST_MATROSKA_ID_VIDEOPIXELHEIGHT 0xBA +#define GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM 0x54AA +#define GST_MATROSKA_ID_VIDEOPIXELCROPTOP 0x54BB +#define GST_MATROSKA_ID_VIDEOPIXELCROPLEFT 0x54CC +#define GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT 0x54DD +#define GST_MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A +/* semi-draft */ +#define GST_MATROSKA_ID_VIDEOSTEREOMODE 0x53B8 +#define GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE 0x54B3 +#define GST_MATROSKA_ID_VIDEOCOLOURSPACE 0x2EB524 +/* semi-draft */ +#define GST_MATROSKA_ID_VIDEOGAMMAVALUE 0x2FB523 + +/* IDs in the TrackAudio master */ +#define GST_MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5 +#define GST_MATROSKA_ID_AUDIOBITDEPTH 0x6264 +#define GST_MATROSKA_ID_AUDIOCHANNELS 0x9F +/* semi-draft */ +#define GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS 0x7D7B +#define GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ 0x78B5 + +/* IDs in the TrackContentEncoding master */ +#define GST_MATROSKA_ID_CONTENTENCODING 0x6240 + +/* IDs in the ContentEncoding master */ +#define GST_MATROSKA_ID_CONTENTENCODINGORDER 0x5031 +#define GST_MATROSKA_ID_CONTENTENCODINGSCOPE 0x5032 +#define GST_MATROSKA_ID_CONTENTENCODINGTYPE 0x5033 +#define GST_MATROSKA_ID_CONTENTCOMPRESSION 0x5034 +#define GST_MATROSKA_ID_CONTENTENCRYPTION 0x5035 + +/* IDs in the ContentCompression master */ +#define GST_MATROSKA_ID_CONTENTCOMPALGO 0x4254 +#define GST_MATROSKA_ID_CONTENTCOMPSETTINGS 0x4255 + +/* IDs in the ContentEncryption master */ +#define GST_MATROSKA_ID_CONTENTENCALGO 0x47E1 +#define GST_MATROSKA_ID_CONTENTENCKEYID 0x47E2 +#define GST_MATROSKA_ID_CONTENTSIGNATURE 0x47E3 +#define GST_MATROSKA_ID_CONTENTSIGKEYID 0x47E4 +#define GST_MATROSKA_ID_CONTENTSIGALGO 0x47E5 +#define GST_MATROSKA_ID_CONTENTSIGHASHALGO 0x47E6 + +/* ID in the CUEs master */ +#define GST_MATROSKA_ID_POINTENTRY 0xBB + +/* IDs in the pointentry master */ +#define GST_MATROSKA_ID_CUETIME 0xB3 +#define GST_MATROSKA_ID_CUETRACKPOSITIONS 0xB7 + +/* IDs in the CueTrackPositions master */ +#define GST_MATROSKA_ID_CUETRACK 0xF7 +#define GST_MATROSKA_ID_CUECLUSTERPOSITION 0xF1 +#define GST_MATROSKA_ID_CUEBLOCKNUMBER 0x5378 +/* semi-draft */ +#define GST_MATROSKA_ID_CUECODECSTATE 0xEA +/* semi-draft */ +#define GST_MATROSKA_ID_CUEREFERENCE 0xDB + +/* IDs in the CueReference master */ +/* semi-draft */ +#define GST_MATROSKA_ID_CUEREFTIME 0x96 +/* semi-draft */ +#define GST_MATROSKA_ID_CUEREFCLUSTER 0x97 +/* semi-draft */ +#define GST_MATROSKA_ID_CUEREFNUMBER 0x535F +/* semi-draft */ +#define GST_MATROSKA_ID_CUEREFCODECSTATE 0xEB + +/* IDs in the Tags master */ +#define GST_MATROSKA_ID_TAG 0x7373 + +/* in the Tag master */ +#define GST_MATROSKA_ID_SIMPLETAG 0x67C8 +#define GST_MATROSKA_ID_TARGETS 0x63C0 + +/* in the SimpleTag master */ +#define GST_MATROSKA_ID_TAGNAME 0x45A3 +#define GST_MATROSKA_ID_TAGSTRING 0x4487 +#define GST_MATROSKA_ID_TAGLANGUAGE 0x447A +#define GST_MATROSKA_ID_TAGDEFAULT 0x4484 +#define GST_MATROSKA_ID_TAGBINARY 0x4485 + +/* in the Targets master */ +#define GST_MATROSKA_ID_TARGETTYPEVALUE 0x68CA +#define GST_MATROSKA_ID_TARGETTYPE 0x63CA +#define GST_MATROSKA_ID_TARGETTRACKUID 0x63C5 +#define GST_MATROSKA_ID_TARGETEDITIONUID 0x63C5 +#define GST_MATROSKA_ID_TARGETCHAPTERUID 0x63C4 +#define GST_MATROSKA_ID_TARGETATTACHMENTUID 0x63C6 + +/* IDs in the SeekHead master */ +#define GST_MATROSKA_ID_SEEKENTRY 0x4DBB + +/* IDs in the SeekEntry master */ +#define GST_MATROSKA_ID_SEEKID 0x53AB +#define GST_MATROSKA_ID_SEEKPOSITION 0x53AC + +/* IDs in the Cluster master */ +#define GST_MATROSKA_ID_CLUSTERTIMECODE 0xE7 +#define GST_MATROSKA_ID_BLOCKGROUP 0xA0 +#define GST_MATROSKA_ID_SIMPLEBLOCK 0xA3 +#define GST_MATROSKA_ID_REFERENCEBLOCK 0xFB +#define GST_MATROSKA_ID_POSITION 0xA7 +#define GST_MATROSKA_ID_PREVSIZE 0xAB +/* semi-draft */ +#define GST_MATROSKA_ID_ENCRYPTEDBLOCK 0xAF +#define GST_MATROSKA_ID_SILENTTRACKS 0x5854 + +/* IDs in the SilentTracks master */ +#define GST_MATROSKA_ID_SILENTTRACKNUMBER 0x58D7 + +/* IDs in the BlockGroup master */ +#define GST_MATROSKA_ID_BLOCK 0xA1 +#define GST_MATROSKA_ID_BLOCKDURATION 0x9B +/* semi-draft */ +#define GST_MATROSKA_ID_BLOCKVIRTUAL 0xA2 +#define GST_MATROSKA_ID_REFERENCEBLOCK 0xFB +#define GST_MATROSKA_ID_BLOCKADDITIONS 0x75A1 +#define GST_MATROSKA_ID_REFERENCEPRIORITY 0xFA +/* semi-draft */ +#define GST_MATROSKA_ID_REFERENCEVIRTUAL 0xFD +/* semi-draft */ +#define GST_MATROSKA_ID_CODECSTATE 0xA4 +#define GST_MATROSKA_ID_SLICES 0x8E + +/* IDs in the BlockAdditions master */ +#define GST_MATROSKA_ID_BLOCKMORE 0xA6 + +/* IDs in the BlockMore master */ +#define GST_MATROSKA_ID_BLOCKADDID 0xEE +#define GST_MATROSKA_ID_BLOCKADDITIONAL 0xA5 + +/* IDs in the Slices master */ +#define GST_MATROSKA_ID_TIMESLICE 0xE8 + +/* IDs in the TimeSlice master */ +#define GST_MATROSKA_ID_LACENUMBER 0xCC +/* semi-draft */ +#define GST_MATROSKA_ID_FRAMENUMBER 0xCD +/* semi-draft */ +#define GST_MATROSKA_ID_BLOCKADDITIONID 0xCB +/* semi-draft */ +#define GST_MATROSKA_ID_TIMESLICEDELAY 0xCE +#define GST_MATROSKA_ID_TIMESLICEDURATION 0xCF + +/* IDs in the Attachments master */ +#define GST_MATROSKA_ID_ATTACHEDFILE 0x61A7 + +/* IDs in the AttachedFile master */ +#define GST_MATROSKA_ID_FILEDESCRIPTION 0x467E +#define GST_MATROSKA_ID_FILENAME 0x466E +#define GST_MATROSKA_ID_FILEMIMETYPE 0x4660 +#define GST_MATROSKA_ID_FILEDATA 0x465C +#define GST_MATROSKA_ID_FILEUID 0x46AE +/* semi-draft */ +#define GST_MATROSKA_ID_FILEREFERRAL 0x4675 + +/* IDs in the Chapters master */ +#define GST_MATROSKA_ID_EDITIONENTRY 0x45B9 + +/* IDs in the EditionEntry master */ +#define GST_MATROSKA_ID_EDITIONUID 0x45BC +#define GST_MATROSKA_ID_EDITIONFLAGHIDDEN 0x45BD +#define GST_MATROSKA_ID_EDITIONFLAGDEFAULT 0x45DB +#define GST_MATROSKA_ID_EDITIONFLAGORDERED 0x45DD +#define GST_MATROSKA_ID_CHAPTERATOM 0xB6 + +/* IDs in the ChapterAtom master */ +#define GST_MATROSKA_ID_CHAPTERUID 0x73C4 +#define GST_MATROSKA_ID_CHAPTERTIMESTART 0x91 +#define GST_MATROSKA_ID_CHAPTERTIMESTOP 0x92 +#define GST_MATROSKA_ID_CHAPTERFLAGHIDDEN 0x98 +#define GST_MATROSKA_ID_CHAPTERFLAGENABLED 0x4598 +#define GST_MATROSKA_ID_CHAPTERSEGMENTUID 0x6E67 +#define GST_MATROSKA_ID_CHAPTERSEGMENTEDITIONUID 0x6EBC +#define GST_MATROSKA_ID_CHAPTERPHYSICALEQUIV 0x63C3 +#define GST_MATROSKA_ID_CHAPTERTRACK 0x8F +#define GST_MATROSKA_ID_CHAPTERDISPLAY 0x80 +#define GST_MATROSKA_ID_CHAPPROCESS 0x6944 + +/* IDs in the ChapProcess master */ +#define GST_MATROSKA_ID_CHAPPROCESSCODECID 0x6955 +#define GST_MATROSKA_ID_CHAPPROCESSPRIVATE 0x450D +#define GST_MATROSKA_ID_CHAPPROCESSCOMMAND 0x6911 + +/* IDs in the ChapProcessCommand master */ +#define GST_MATROSKA_ID_CHAPPROCESSTIME 0x6922 +#define GST_MATROSKA_ID_CHAPPROCESSDATA 0x6933 + +/* IDs in the ChapterDisplay master */ +#define GST_MATROSKA_ID_CHAPSTRING 0x85 +#define GST_MATROSKA_ID_CHAPLANGUAGE 0x437C +#define GST_MATROSKA_ID_CHAPCOUNTRY 0x437E + +/* IDs in the ChapterTrack master */ +#define GST_MATROSKA_ID_CHAPTERTRACKNUMBER 0x89 + +/* + * Matroska Codec IDs. Strings. + */ + +#define GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC "V_MS/VFW/FOURCC" +#define GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED "V_UNCOMPRESSED" +#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP "V_MPEG4/ISO/SP" +#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP "V_MPEG4/ISO/ASP" +#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP "V_MPEG4/ISO/AP" +#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC "V_MPEG4/ISO/AVC" +#define GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3 "V_MPEG4/MS/V3" +#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG1 "V_MPEG1" +#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG2 "V_MPEG2" +/* FIXME: not (yet) in the spec! */ +#define GST_MATROSKA_CODEC_ID_VIDEO_MJPEG "V_MJPEG" +#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1 "V_REAL/RV10" +#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2 "V_REAL/RV20" +#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3 "V_REAL/RV30" +#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4 "V_REAL/RV40" +#define GST_MATROSKA_CODEC_ID_VIDEO_THEORA "V_THEORA" +#define GST_MATROSKA_CODEC_ID_VIDEO_QUICKTIME "V_QUICKTIME" +#define GST_MATROSKA_CODEC_ID_VIDEO_SNOW "V_SNOW" +#define GST_MATROSKA_CODEC_ID_VIDEO_DIRAC "V_DIRAC" +#define GST_MATROSKA_CODEC_ID_VIDEO_VP8 "V_VP8" + +#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1 "A_MPEG/L1" +#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2 "A_MPEG/L2" +#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3 "A_MPEG/L3" +#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE "A_PCM/INT/BIG" +#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE "A_PCM/INT/LIT" +#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT "A_PCM/FLOAT/IEEE" +#define GST_MATROSKA_CODEC_ID_AUDIO_AC3 "A_AC3" +#define GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID9 "A_AC3/BSID9" +#define GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID10 "A_AC3/BSID10" +#define GST_MATROSKA_CODEC_ID_AUDIO_EAC3 "A_EAC3" +#define GST_MATROSKA_CODEC_ID_AUDIO_DTS "A_DTS" +#define GST_MATROSKA_CODEC_ID_AUDIO_VORBIS "A_VORBIS" +#define GST_MATROSKA_CODEC_ID_AUDIO_FLAC "A_FLAC" +/* FIXME: not yet in the spec */ +#define GST_MATROSKA_CODEC_ID_AUDIO_SPEEX "A_SPEEX" +#define GST_MATROSKA_CODEC_ID_AUDIO_ACM "A_MS/ACM" +#define GST_MATROSKA_CODEC_ID_AUDIO_TTA "A_TTA1" +#define GST_MATROSKA_CODEC_ID_AUDIO_WAVPACK4 "A_WAVPACK4" +#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4 "A_REAL/14_4" +#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_28_8 "A_REAL/28_8" +#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK "A_REAL/COOK" +#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_SIPR "A_REAL/SIPR" +#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_RALF "A_REAL/RALF" +#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_ATRC "A_REAL/ATRC" +#define GST_MATROSKA_CODEC_ID_AUDIO_AAC "A_AAC" +#define GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2 "A_AAC/MPEG2/" +#define GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4 "A_AAC/MPEG4/" +#define GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDMC "A_QUICKTIME/QDMC" +#define GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDM2 "A_QUICKTIME/QDM2" +/* Undefined for now: +#define GST_MATROSKA_CODEC_ID_AUDIO_MPC "A_MPC" +*/ + +#define GST_MATROSKA_CODEC_ID_SUBTITLE_ASCII "S_TEXT/ASCII" +#define GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8 "S_TEXT/UTF8" +#define GST_MATROSKA_CODEC_ID_SUBTITLE_SSA "S_TEXT/SSA" +#define GST_MATROSKA_CODEC_ID_SUBTITLE_ASS "S_TEXT/ASS" +#define GST_MATROSKA_CODEC_ID_SUBTITLE_USF "S_TEXT/USF" +#define GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB "S_VOBSUB" +#define GST_MATROSKA_CODEC_ID_SUBTITLE_HDMVPGS "S_HDMV/PGS" +#define GST_MATROSKA_CODEC_ID_SUBTITLE_BMP "S_IMAGE/BMP" +#define GST_MATROSKA_CODEC_ID_SUBTITLE_KATE "S_KATE" + +/* + * Matroska tags. Strings. + */ + +#define GST_MATROSKA_TAG_ID_TITLE "TITLE" +#define GST_MATROSKA_TAG_ID_AUTHOR "AUTHOR" +#define GST_MATROSKA_TAG_ID_ARTIST "ARTIST" +#define GST_MATROSKA_TAG_ID_ALBUM "ALBUM" +#define GST_MATROSKA_TAG_ID_COMMENTS "COMMENTS" +#define GST_MATROSKA_TAG_ID_BITSPS "BITSPS" +#define GST_MATROSKA_TAG_ID_BPS "BPS" +#define GST_MATROSKA_TAG_ID_ENCODER "ENCODER" +#define GST_MATROSKA_TAG_ID_DATE "DATE" +#define GST_MATROSKA_TAG_ID_ISRC "ISRC" +#define GST_MATROSKA_TAG_ID_COPYRIGHT "COPYRIGHT" +#define GST_MATROSKA_TAG_ID_BPM "BPM" +#define GST_MATROSKA_TAG_ID_TERMS_OF_USE "TERMS_OF_USE" +#define GST_MATROSKA_TAG_ID_DATE "DATE" +#define GST_MATROSKA_TAG_ID_COMPOSER "COMPOSER" +#define GST_MATROSKA_TAG_ID_LEAD_PERFORMER "LEAD_PERFOMER" +#define GST_MATROSKA_TAG_ID_GENRE "GENRE" + +/* + * TODO: add this tag & mappings + * "REPLAYGAIN_GAIN" -> GST_TAG_*_GAIN see http://replaygain.hydrogenaudio.org/rg_data_format.html + * "REPLAYGAIN_PEAK" -> GST_TAG_*_PEAK see http://replaygain.hydrogenaudio.org/peak_data_format.html + * both are depending on the target (track, album?) + * + * "TOTAL_PARTS" -> GST_TAG_TRACK_COUNT depending on target + * "PART_NUMBER" -> GST_TAG_TRACK_NUMBER depending on target + * + * "SORT_WITH" -> nested in other elements, GST_TAG_TITLE_SORTNAME, etc + * + * TODO: maybe add custom gstreamer tags for other standard matroska tags, + * see http://matroska.org/technical/specs/tagging/index.html + * + * TODO: handle tag targets and nesting correctly + */ + +/* + * Enumerations for various types (mapping from binary + * value to what it actually means). + */ + +typedef enum { + GST_MATROSKA_TRACK_TYPE_VIDEO = 0x1, + GST_MATROSKA_TRACK_TYPE_AUDIO = 0x2, + GST_MATROSKA_TRACK_TYPE_COMPLEX = 0x3, + GST_MATROSKA_TRACK_TYPE_LOGO = 0x10, + GST_MATROSKA_TRACK_TYPE_SUBTITLE = 0x11, + GST_MATROSKA_TRACK_TYPE_BUTTONS = 0x12, + GST_MATROSKA_TRACK_TYPE_CONTROL = 0x20, +} GstMatroskaTrackType; + +typedef enum { + GST_MATROSKA_ASPECT_RATIO_MODE_FREE = 0x0, + GST_MATROSKA_ASPECT_RATIO_MODE_KEEP = 0x1, + GST_MATROSKA_ASPECT_RATIO_MODE_FIXED = 0x2, +} GstMatroskaAspectRatioMode; + +/* + * These aren't in any way "matroska-form" things, + * it's just something I use in the muxer/demuxer. + */ + +typedef enum { + GST_MATROSKA_TRACK_ENABLED = (1<<0), + GST_MATROSKA_TRACK_DEFAULT = (1<<1), + GST_MATROSKA_TRACK_LACING = (1<<2), + GST_MATROSKA_TRACK_FORCED = (1<<3), + GST_MATROSKA_TRACK_SHIFT = (1<<16) +} GstMatroskaTrackFlags; + +typedef enum { + GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT<<0) +} GstMatroskaVideoTrackFlags; + + +typedef struct _GstMatroskaTrackContext GstMatroskaTrackContext; + +/* TODO: check if all fields are used */ +struct _GstMatroskaTrackContext { + GstPad *pad; + GstCaps *caps; + guint index; + GstFlowReturn last_flow; + /* reverse playback */ + GstClockTime from_time; + gint64 from_offset; + gint64 to_offset; + + GArray *index_table; + + gint index_writer_id; + + /* some often-used info */ + gchar *codec_id, *codec_name, *name, *language; + guint8 *codec_priv; + guint codec_priv_size; + guint8 *codec_state; + guint codec_state_size; + GstMatroskaTrackType type; + guint uid, num; + GstMatroskaTrackFlags flags; + guint64 default_duration; + guint64 pos; + gdouble timecodescale; + + gboolean set_discont; /* TRUE = set DISCONT flag on next buffer */ + + /* Special flag for Vorbis and Theora, for which we need to send + * codec_priv first before sending any data, and just testing + * for time == 0 is not enough to detect that. Used by demuxer */ + gboolean send_xiph_headers; + + /* Special flag for Flac, for which we need to reconstruct the header + * buffer from the codec_priv data before sending any data, and just + * testing for time == 0 is not enough to detect that. Used by demuxer */ + gboolean send_flac_headers; + + /* Special flag for Speex, for which we need to reconstruct the header + * buffer from the codec_priv data before sending any data, and just + * testing for time == 0 is not enough to detect that. Used by demuxer */ + gboolean send_speex_headers; + + /* Special flag for VobSub, for which we have to send colour table info + * (if available) first before sending any data, and just testing + * for time == 0 is not enough to detect that. Used by demuxer */ + gboolean send_dvd_event; + + /* Special counter for muxer to skip the first N vorbis/theora headers - + * they are put into codec private data, not muxed into the stream */ + guint xiph_headers_to_skip; + + /* Used for postprocessing a frame before it is pushed from the demuxer */ + GstFlowReturn (*postprocess_frame) (GstElement *element, + GstMatroskaTrackContext *context, + GstBuffer **buffer); + + /* Tags to send after newsegment event */ + GstTagList *pending_tags; + + /* A GArray of GstMatroskaTrackEncoding structures which contain the + * encoding (compression/encryption) settings for this track, if any */ + GArray *encodings; + + /* Whether the stream is EOS */ + gboolean eos; +#ifdef MKV_DEMUX_MODIFICATION + GstClockTime last_ts; + GQueue* queue; + + gboolean found_next_kframe; + gint32 num_frames_bw_keyframes; + guint64 avg_duration_bw_keyframes; + guint32 frames_to_show_bw_keyframes; + GstClockTime prev_kframe_timestamp; + GstClockTime next_kframe_timestamp; +#endif + + /* any alignment we need our output buffers to have */ + gint alignment; +}; + +typedef struct _GstMatroskaTrackVideoContext { + GstMatroskaTrackContext parent; + + guint pixel_width, pixel_height; + guint display_width, display_height; + gdouble default_fps; + GstMatroskaAspectRatioMode asr_mode; + guint32 fourcc; + + /* QoS */ + GstClockTime earliest_time; + + GstBuffer *dirac_unit; +} GstMatroskaTrackVideoContext; + +typedef struct _GstMatroskaTrackAudioContext { + GstMatroskaTrackContext parent; + + guint samplerate, channels, bitdepth; + + guint32 wvpk_block_index; +} GstMatroskaTrackAudioContext; + +typedef struct _GstMatroskaTrackSubtitleContext { + GstMatroskaTrackContext parent; + + gboolean check_utf8; /* buffers should be valid UTF-8 */ + gboolean check_markup; /* check if buffers contain markup + * or plaintext and escape characters */ + gboolean invalid_utf8; /* work around broken files */ + gboolean seen_markup_tag; /* markup found in text */ +} GstMatroskaTrackSubtitleContext; + +typedef struct _GstMatroskaIndex { + guint64 pos; /* of the corresponding *cluster*! */ + guint16 track; /* reference to 'num' */ + GstClockTime time; /* in nanoseconds */ + guint32 block; /* number of the block in the cluster */ +} GstMatroskaIndex; + +typedef struct _Wavpack4Header { + guchar ck_id [4]; /* "wvpk" */ + guint32 ck_size; /* size of entire frame (minus 8, of course) */ + guint16 version; /* 0x403 for now */ + guint8 track_no; /* track number (0 if not used, like now) */ + guint8 index_no; /* remember these? (0 if not used, like now) */ + guint32 total_samples; /* for entire file (-1 if unknown) */ + guint32 block_index; /* index of first sample in block (to file begin) */ + guint32 block_samples; /* # samples in this block */ + guint32 flags; /* various flags for id and decoding */ + guint32 crc; /* crc for actual decoded data */ +} Wavpack4Header; + +typedef enum { + GST_MATROSKA_TRACK_ENCODING_SCOPE_FRAME = (1<<0), + GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA = (1<<1), + GST_MATROSKA_TRACK_ENCODING_SCOPE_NEXT_CONTENT_ENCODING = (1<<2) +} GstMatroskaTrackEncodingScope; + +typedef enum { + GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_ZLIB = 0, + GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_BZLIB = 1, + GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_LZO1X = 2, + GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_HEADERSTRIP = 3 +} GstMatroskaTrackCompressionAlgorithm; + +typedef struct _GstMatroskaTrackEncoding { + guint order; + guint scope : 3; + guint type : 1; + guint comp_algo : 2; + guint8 *comp_settings; + guint comp_settings_length; +} GstMatroskaTrackEncoding; + +gboolean gst_matroska_track_init_video_context (GstMatroskaTrackContext ** p_context); +gboolean gst_matroska_track_init_audio_context (GstMatroskaTrackContext ** p_context); +gboolean gst_matroska_track_init_subtitle_context (GstMatroskaTrackContext ** p_context); + +void gst_matroska_register_tags (void); + +#endif /* __GST_MATROSKA_IDS_H__ */ diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c new file mode 100644 index 0000000..30c0cdb --- /dev/null +++ b/gst/matroska/matroska-mux.c @@ -0,0 +1,3167 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * (c) 2005 Michal Benes + * (c) 2008 Sebastian Dröge + * + * matroska-mux.c: matroska file/stream muxer + * + * 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. + */ + +/* TODO: - check everywhere that we don't write invalid values + * - make sure timestamps are correctly scaled everywhere + */ + +/** + * SECTION:element-matroskamux + * + * matroskamux muxes different input streams into a Matroska file. + * + * + * Example launch line + * |[ + * gst-launch -v filesrc location=/path/to/mp3 ! mp3parse ! matroskamux name=mux ! filesink location=test.mkv filesrc location=/path/to/theora.ogg ! oggdemux ! theoraparse ! mux. + * ]| This pipeline muxes an MP3 file and a Ogg Theora video into a Matroska file. + * |[ + * gst-launch -v audiotestsrc num-buffers=100 ! audioconvert ! vorbisenc ! matroskamux ! filesink location=test.mka + * ]| This pipeline muxes a 440Hz sine wave encoded with the Vorbis codec into a Matroska file. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include +#include + +#include "matroska-mux.h" +#include "matroska-ids.h" + +GST_DEBUG_CATEGORY_STATIC (matroskamux_debug); +#define GST_CAT_DEFAULT matroskamux_debug + +enum +{ + ARG_0, + ARG_WRITING_APP, + ARG_DOCTYPE_VERSION, + ARG_MIN_INDEX_INTERVAL, + ARG_STREAMABLE +}; + +#define DEFAULT_DOCTYPE_VERSION 2 +#define DEFAULT_WRITING_APP "GStreamer Matroska muxer" +#define DEFAULT_MIN_INDEX_INTERVAL 0 +#define DEFAULT_STREAMABLE FALSE + +/* WAVEFORMATEX is gst_riff_strf_auds + an extra guint16 extension size */ +#define WAVEFORMATEX_SIZE (2 + sizeof (gst_riff_strf_auds)) + +static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska") + ); + +#define COMMON_VIDEO_CAPS \ + "width = (int) [ 16, 4096 ], " \ + "height = (int) [ 16, 4096 ], " \ + "framerate = (fraction) [ 0, MAX ]" + +#define COMMON_VIDEO_CAPS_NO_FRAMERATE \ + "width = (int) [ 16, 4096 ], " \ + "height = (int) [ 16, 4096 ] " + +/* FIXME: + * * require codec data, etc as needed + */ + +static GstStaticPadTemplate videosink_templ = + GST_STATIC_PAD_TEMPLATE ("video_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) { 1, 2, 4 }, " + "systemstream = (boolean) false, " + COMMON_VIDEO_CAPS "; " + "video/x-h264, stream-format=avc, alignment=au, " + COMMON_VIDEO_CAPS "; " + "video/x-divx, " + COMMON_VIDEO_CAPS "; " + "video/x-xvid, " + COMMON_VIDEO_CAPS "; " + "video/x-huffyuv, " + COMMON_VIDEO_CAPS "; " + "video/x-dv, " + COMMON_VIDEO_CAPS "; " + "video/x-h263, " + COMMON_VIDEO_CAPS "; " + "video/x-msmpeg, " + COMMON_VIDEO_CAPS "; " + "image/jpeg, " + COMMON_VIDEO_CAPS_NO_FRAMERATE "; " + "video/x-theora; " + "video/x-dirac, " + COMMON_VIDEO_CAPS "; " + "video/x-pn-realvideo, " + "rmversion = (int) [1, 4], " + COMMON_VIDEO_CAPS "; " + "video/x-vp8, " + COMMON_VIDEO_CAPS "; " + "video/x-raw-yuv, " + "format = (fourcc) { YUY2, I420, YV12, UYVY, AYUV }, " + COMMON_VIDEO_CAPS "; " + "video/x-wmv, " "wmvversion = (int) [ 1, 3 ], " COMMON_VIDEO_CAPS) + ); + +#define COMMON_AUDIO_CAPS \ + "channels = (int) [ 1, MAX ], " \ + "rate = (int) [ 1, MAX ]" + +/* FIXME: + * * require codec data, etc as needed + */ +static GstStaticPadTemplate audiosink_templ = + GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + COMMON_AUDIO_CAPS "; " + "audio/mpeg, " + "mpegversion = (int) { 2, 4 }, " + "stream-format = (string) raw, " + COMMON_AUDIO_CAPS "; " + "audio/x-ac3, " + COMMON_AUDIO_CAPS "; " + "audio/x-eac3, " + COMMON_AUDIO_CAPS "; " + "audio/x-dts, " + COMMON_AUDIO_CAPS "; " + "audio/x-vorbis, " + COMMON_AUDIO_CAPS "; " + "audio/x-flac, " + COMMON_AUDIO_CAPS "; " + "audio/x-speex, " + COMMON_AUDIO_CAPS "; " + "audio/x-raw-int, " + "width = (int) 8, " + "depth = (int) 8, " + "signed = (boolean) false, " + COMMON_AUDIO_CAPS ";" + "audio/x-raw-int, " + "width = (int) 16, " + "depth = (int) 16, " + "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " + "signed = (boolean) true, " + COMMON_AUDIO_CAPS ";" + "audio/x-raw-int, " + "width = (int) 24, " + "depth = (int) 24, " + "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " + "signed = (boolean) true, " + COMMON_AUDIO_CAPS ";" + "audio/x-raw-int, " + "width = (int) 32, " + "depth = (int) 32, " + "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " + "signed = (boolean) true, " + COMMON_AUDIO_CAPS ";" + "audio/x-raw-float, " + "width = (int) [ 32, 64 ], " + "endianness = (int) LITTLE_ENDIAN, " + COMMON_AUDIO_CAPS ";" + "audio/x-tta, " + "width = (int) { 8, 16, 24 }, " + "channels = (int) { 1, 2 }, " "rate = (int) [ 8000, 96000 ]; " + "audio/x-pn-realaudio, " + "raversion = (int) { 1, 2, 8 }, " COMMON_AUDIO_CAPS "; " + "audio/x-wma, " "wmaversion = (int) [ 1, 3 ], " + "block_align = (int) [ 0, 65535 ], bitrate = (int) [ 0, 524288 ], " + COMMON_AUDIO_CAPS ";" + "audio/x-alaw, " + "channels = (int) {1, 2}, " "rate = (int) [ 8000, 192000 ]; " + "audio/x-mulaw, " + "channels = (int) {1, 2}, " "rate = (int) [ 8000, 192000 ]") + ); + +static GstStaticPadTemplate subtitlesink_templ = +GST_STATIC_PAD_TEMPLATE ("subtitle_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("subtitle/x-kate")); + +static GArray *used_uids; +G_LOCK_DEFINE_STATIC (used_uids); + +static void gst_matroska_mux_add_interfaces (GType type); + +GST_BOILERPLATE_FULL (GstMatroskaMux, gst_matroska_mux, GstElement, + GST_TYPE_ELEMENT, gst_matroska_mux_add_interfaces); + +/* Matroska muxer destructor */ +static void gst_matroska_mux_finalize (GObject * object); + +/* Pads collected callback */ +static GstFlowReturn +gst_matroska_mux_collected (GstCollectPads * pads, gpointer user_data); + +/* pad functions */ +static gboolean gst_matroska_mux_handle_src_event (GstPad * pad, + GstEvent * event); +static GstPad *gst_matroska_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_matroska_mux_release_pad (GstElement * element, GstPad * pad); + +/* gst internal change state handler */ +static GstStateChangeReturn +gst_matroska_mux_change_state (GstElement * element, GstStateChange transition); + +/* gobject bla bla */ +static void gst_matroska_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_matroska_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +/* reset muxer */ +static void gst_matroska_mux_reset (GstElement * element); + +/* uid generation */ +static guint64 gst_matroska_mux_create_uid (); + +static gboolean theora_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context); +static gboolean vorbis_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context); +static gboolean speex_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context); +static gboolean kate_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context); +static gboolean flac_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context); +static void +gst_matroska_mux_write_simple_tag (const GstTagList * list, const gchar * tag, + gpointer data); + +static void +gst_matroska_mux_add_interfaces (GType type) +{ + static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; + + g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info); +} + +static void +gst_matroska_mux_base_init (gpointer g_class) +{ +} + +static void +gst_matroska_mux_class_init (GstMatroskaMuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gst_element_class_add_static_pad_template (gstelement_class, + &videosink_templ); + gst_element_class_add_static_pad_template (gstelement_class, + &audiosink_templ); + gst_element_class_add_static_pad_template (gstelement_class, + &subtitlesink_templ); + gst_element_class_add_static_pad_template (gstelement_class, &src_templ); + gst_element_class_set_details_simple (gstelement_class, "Matroska muxer", + "Codec/Muxer", + "Muxes video/audio/subtitle streams into a matroska stream", + "GStreamer maintainers "); + + GST_DEBUG_CATEGORY_INIT (matroskamux_debug, "matroskamux", 0, + "Matroska muxer"); + + gobject_class->finalize = gst_matroska_mux_finalize; + + gobject_class->get_property = gst_matroska_mux_get_property; + gobject_class->set_property = gst_matroska_mux_set_property; + + g_object_class_install_property (gobject_class, ARG_WRITING_APP, + g_param_spec_string ("writing-app", "Writing application.", + "The name the application that creates the matroska file.", + NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_DOCTYPE_VERSION, + g_param_spec_int ("version", "DocType version", + "This parameter determines what Matroska features can be used.", + 1, 2, DEFAULT_DOCTYPE_VERSION, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_MIN_INDEX_INTERVAL, + g_param_spec_int64 ("min-index-interval", "Minimum time between index " + "entries", "An index entry is created every so many nanoseconds.", + 0, G_MAXINT64, DEFAULT_MIN_INDEX_INTERVAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_STREAMABLE, + g_param_spec_boolean ("streamable", "Determines whether output should " + "be streamable", "If set to true, the output should be as if it is " + "to be streamed and hence no indexes written or duration written.", + DEFAULT_STREAMABLE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_matroska_mux_change_state); + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_matroska_mux_request_new_pad); + gstelement_class->release_pad = + GST_DEBUG_FUNCPTR (gst_matroska_mux_release_pad); +} + +/** + * Start of pad option handler code + */ +#define DEFAULT_PAD_FRAME_DURATION TRUE +#define DEFAULT_PAD_FRAME_DURATION_VP8 FALSE + +enum +{ + PROP_PAD_0, + PROP_PAD_FRAME_DURATION +}; + +typedef struct +{ + GstPad parent; + gboolean frame_duration; + gboolean frame_duration_user; +} GstMatroskamuxPad; + +static void gst_matroskamux_pad_class_init (GstPadClass * klass); + +static GType +gst_matroskamux_pad_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + type = g_type_register_static_simple (GST_TYPE_PAD, + g_intern_static_string ("GstMatroskamuxPad"), sizeof (GstPadClass), + (GClassInitFunc) gst_matroskamux_pad_class_init, + sizeof (GstMatroskamuxPad), NULL, 0); + } + return type; +} + +#define GST_TYPE_MATROSKAMUX_PAD (gst_matroskamux_pad_get_type()) +#define GST_MATROSKAMUX_PAD(pad) (G_TYPE_CHECK_INSTANCE_CAST((pad),GST_TYPE_MATROSKAMUX_PAD,GstMatroskamuxPad)) +#define GST_MATROSKAMUX_PAD_CAST(pad) ((GstMatroskamuxPad *) pad) +#define GST_IS_MATROSKAMUX_PAD(pad) (G_TYPE_CHECK_INSTANCE_TYPE((pad),GST_TYPE_MATROSKAMUX_PAD)) + +static void +gst_matroskamux_pad_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMatroskamuxPad *pad = GST_MATROSKAMUX_PAD (object); + + switch (prop_id) { + case PROP_PAD_FRAME_DURATION: + g_value_set_boolean (value, pad->frame_duration); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_matroskamux_pad_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMatroskamuxPad *pad = GST_MATROSKAMUX_PAD (object); + + switch (prop_id) { + case PROP_PAD_FRAME_DURATION: + pad->frame_duration = g_value_get_boolean (value); + pad->frame_duration_user = TRUE; + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_matroskamux_pad_class_init (GstPadClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_matroskamux_pad_set_property; + gobject_class->get_property = gst_matroskamux_pad_get_property; + + g_object_class_install_property (gobject_class, PROP_PAD_FRAME_DURATION, + g_param_spec_boolean ("frame-duration", "Frame duration", + "Default frame duration", DEFAULT_PAD_FRAME_DURATION, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_matroskamux_pad_init (GstMatroskamuxPad * pad) +{ + pad->frame_duration = DEFAULT_PAD_FRAME_DURATION; + pad->frame_duration_user = FALSE; +} + +/* + * End of pad option handler code + **/ + +/** + * gst_matroska_mux_init: + * @mux: #GstMatroskaMux that should be initialized. + * @g_class: Class of the muxer. + * + * Matroska muxer constructor. + */ +static void +gst_matroska_mux_init (GstMatroskaMux * mux, GstMatroskaMuxClass * g_class) +{ + GstPadTemplate *templ; + + templ = + gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src"); + mux->srcpad = gst_pad_new_from_template (templ, "src"); + + gst_pad_set_event_function (mux->srcpad, gst_matroska_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_matroska_mux_collected), + mux); + + mux->ebml_write = gst_ebml_write_new (mux->srcpad); + mux->doctype = GST_MATROSKA_DOCTYPE_MATROSKA; + + /* property defaults */ + mux->doctype_version = DEFAULT_DOCTYPE_VERSION; + mux->writing_app = g_strdup (DEFAULT_WRITING_APP); + mux->min_index_interval = DEFAULT_MIN_INDEX_INTERVAL; + mux->streamable = DEFAULT_STREAMABLE; + + /* initialize internal variables */ + mux->index = NULL; + mux->num_streams = 0; + mux->num_a_streams = 0; + mux->num_t_streams = 0; + mux->num_v_streams = 0; + + /* initialize remaining variables */ + gst_matroska_mux_reset (GST_ELEMENT (mux)); +} + + +/** + * gst_matroska_mux_finalize: + * @object: #GstMatroskaMux that should be finalized. + * + * Finalize matroska muxer. + */ +static void +gst_matroska_mux_finalize (GObject * object) +{ + GstMatroskaMux *mux = GST_MATROSKA_MUX (object); + + gst_event_replace (&mux->force_key_unit_event, NULL); + + gst_object_unref (mux->collect); + gst_object_unref (mux->ebml_write); + if (mux->writing_app) + g_free (mux->writing_app); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * gst_matroska_mux_create_uid: + * + * Generate new unused track UID. + * + * Returns: New track UID. + */ +static guint64 +gst_matroska_mux_create_uid (void) +{ + guint64 uid = 0; + + G_LOCK (used_uids); + + if (!used_uids) + used_uids = g_array_sized_new (FALSE, FALSE, sizeof (guint64), 10); + + while (!uid) { + guint i; + + uid = (((guint64) g_random_int ()) << 32) | g_random_int (); + for (i = 0; i < used_uids->len; i++) { + if (g_array_index (used_uids, guint64, i) == uid) { + uid = 0; + break; + } + } + g_array_append_val (used_uids, uid); + } + + G_UNLOCK (used_uids); + return uid; +} + + +/** + * gst_matroska_pad_reset: + * @collect_pad: the #GstMatroskaPad + * + * Reset and/or release resources of a matroska collect pad. + */ +static void +gst_matroska_pad_reset (GstMatroskaPad * collect_pad, gboolean full) +{ + gchar *name = NULL; + GstMatroskaTrackType type = 0; + + /* free track information */ + if (collect_pad->track != NULL) { + /* retrieve for optional later use */ + name = collect_pad->track->name; + type = collect_pad->track->type; + /* extra for video */ + if (type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + GstMatroskaTrackVideoContext *ctx = + (GstMatroskaTrackVideoContext *) collect_pad->track; + + if (ctx->dirac_unit) { + gst_buffer_unref (ctx->dirac_unit); + ctx->dirac_unit = NULL; + } + } + g_free (collect_pad->track->codec_id); + g_free (collect_pad->track->codec_name); + if (full) + g_free (collect_pad->track->name); + g_free (collect_pad->track->language); + g_free (collect_pad->track->codec_priv); + g_free (collect_pad->track); + collect_pad->track = NULL; + } + + /* free cached buffer */ + if (collect_pad->buffer != NULL) { + gst_buffer_unref (collect_pad->buffer); + collect_pad->buffer = NULL; + } + + if (!full && type != 0) { + GstMatroskaTrackContext *context; + + /* create a fresh context */ + switch (type) { + case GST_MATROSKA_TRACK_TYPE_VIDEO: + context = (GstMatroskaTrackContext *) + g_new0 (GstMatroskaTrackVideoContext, 1); + break; + case GST_MATROSKA_TRACK_TYPE_AUDIO: + context = (GstMatroskaTrackContext *) + g_new0 (GstMatroskaTrackAudioContext, 1); + break; + case GST_MATROSKA_TRACK_TYPE_SUBTITLE: + context = (GstMatroskaTrackContext *) + g_new0 (GstMatroskaTrackSubtitleContext, 1); + break; + default: + g_assert_not_reached (); + return; + } + + context->type = type; + context->name = name; + /* TODO: check default values for the context */ + context->flags = GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT; + collect_pad->track = context; + collect_pad->buffer = NULL; + collect_pad->duration = 0; + collect_pad->start_ts = GST_CLOCK_TIME_NONE; + collect_pad->end_ts = GST_CLOCK_TIME_NONE; + } +} + +/** + * gst_matroska_pad_free: + * @collect_pad: the #GstMatroskaPad + * + * Release resources of a matroska collect pad. + */ +static void +gst_matroska_pad_free (GstMatroskaPad * collect_pad) +{ + gst_matroska_pad_reset (collect_pad, TRUE); +} + + +/** + * gst_matroska_mux_reset: + * @element: #GstMatroskaMux that should be reseted. + * + * Reset matroska muxer back to initial state. + */ +static void +gst_matroska_mux_reset (GstElement * element) +{ + GstMatroskaMux *mux = GST_MATROSKA_MUX (element); + GSList *walk; + + /* reset EBML write */ + gst_ebml_write_reset (mux->ebml_write); + + /* reset input */ + mux->state = GST_MATROSKA_MUX_STATE_START; + + /* clean up existing streams */ + + for (walk = mux->collect->data; walk; walk = g_slist_next (walk)) { + GstMatroskaPad *collect_pad; + + collect_pad = (GstMatroskaPad *) walk->data; + + /* reset collect pad to pristine state */ + gst_matroska_pad_reset (collect_pad, FALSE); + } + + /* reset indexes */ + mux->num_indexes = 0; + g_free (mux->index); + mux->index = NULL; + + /* reset timers */ + mux->time_scale = GST_MSECOND; + mux->max_cluster_duration = G_MAXINT16 * mux->time_scale; + mux->duration = 0; + + /* reset cluster */ + mux->cluster = 0; + mux->cluster_time = 0; + mux->cluster_pos = 0; + mux->prev_cluster_size = 0; + + /* reset tags */ + gst_tag_setter_reset_tags (GST_TAG_SETTER (mux)); +} + +/** + * gst_matroska_mux_handle_src_event: + * @pad: Pad which received the event. + * @event: Received event. + * + * handle events - copied from oggmux without understanding + * + * Returns: #TRUE on success. + */ +static gboolean +gst_matroska_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); +} + +/** + * gst_matroska_mux_handle_sink_event: + * @pad: Pad which received the event. + * @event: Received event. + * + * handle events - informational ones like tags + * + * Returns: #TRUE on success. + */ +static gboolean +gst_matroska_mux_handle_sink_event (GstPad * pad, GstEvent * event) +{ + GstMatroskaTrackContext *context; + GstMatroskaPad *collect_pad; + GstMatroskaMux *mux; + GstTagList *list; + gboolean ret = TRUE; + + mux = GST_MATROSKA_MUX (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG:{ + gchar *lang = NULL; + + GST_DEBUG_OBJECT (mux, "received tag event"); + gst_event_parse_tag (event, &list); + + collect_pad = (GstMatroskaPad *) gst_pad_get_element_private (pad); + g_assert (collect_pad); + context = collect_pad->track; + g_assert (context); + + /* Matroska wants ISO 639-2B code, taglist most likely contains 639-1 */ + if (gst_tag_list_get_string (list, GST_TAG_LANGUAGE_CODE, &lang)) { + const gchar *lang_code; + + lang_code = gst_tag_get_language_code_iso_639_2B (lang); + if (lang_code) { + GST_INFO_OBJECT (pad, "Setting language to '%s'", lang_code); + context->language = g_strdup (lang_code); + } else { + GST_WARNING_OBJECT (pad, "Did not get language code for '%s'", lang); + } + g_free (lang); + } + + /* FIXME: what about stream-specific tags? */ + gst_tag_setter_merge_tags (GST_TAG_SETTER (mux), list, + gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (mux))); + + gst_event_unref (event); + /* handled this, don't want collectpads to forward it downstream */ + event = NULL; + break; + } + case GST_EVENT_NEWSEGMENT:{ + GstFormat format; + + gst_event_parse_new_segment (event, NULL, NULL, &format, NULL, NULL, + NULL); + if (format != GST_FORMAT_TIME) { + ret = FALSE; + gst_event_unref (event); + event = NULL; + } + break; + } + case GST_EVENT_CUSTOM_DOWNSTREAM:{ + const GstStructure *structure; + + structure = gst_event_get_structure (event); + if (gst_structure_has_name (structure, "GstForceKeyUnit")) { + gst_event_replace (&mux->force_key_unit_event, NULL); + mux->force_key_unit_event = event; + event = NULL; + } + break; + } + default: + break; + } + + /* now GstCollectPads can take care of the rest, e.g. EOS */ + if (event) + ret = mux->collect_event (pad, event); + + gst_object_unref (mux); + + return ret; +} + + +/** + * gst_matroska_mux_video_pad_setcaps: + * @pad: Pad which got the caps. + * @caps: New caps. + * + * Setcaps function for video sink pad. + * + * Returns: #TRUE on success. + */ +static gboolean +gst_matroska_mux_video_pad_setcaps (GstPad * pad, GstCaps * caps) +{ + GstMatroskaTrackContext *context = NULL; + GstMatroskaTrackVideoContext *videocontext; + GstMatroskaMux *mux; + GstMatroskaPad *collect_pad; + GstStructure *structure; + const gchar *mimetype; + const GValue *value = NULL; + const GstBuffer *codec_buf = NULL; + gint width, height, pixel_width, pixel_height; + gint fps_d, fps_n; + gboolean interlaced = FALSE; + + mux = GST_MATROSKA_MUX (GST_PAD_PARENT (pad)); + + /* find context */ + collect_pad = (GstMatroskaPad *) gst_pad_get_element_private (pad); + g_assert (collect_pad); + context = collect_pad->track; + g_assert (context); + g_assert (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO); + videocontext = (GstMatroskaTrackVideoContext *) context; + + /* gst -> matroska ID'ing */ + structure = gst_caps_get_structure (caps, 0); + + mimetype = gst_structure_get_name (structure); + + if (gst_structure_get_boolean (structure, "interlaced", &interlaced) + && interlaced) + context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; + + if (!strcmp (mimetype, "video/x-theora")) { + /* we'll extract the details later from the theora identification header */ + goto skip_details; + } + + /* get general properties */ + /* spec says it is mandatory */ + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) + goto refuse_caps; + + videocontext->pixel_width = width; + videocontext->pixel_height = height; + + /* set vp8 defaults or let user override it */ + if (GST_MATROSKAMUX_PAD_CAST (pad)->frame_duration_user == FALSE + && (!strcmp (mimetype, "video/x-vp8"))) + GST_MATROSKAMUX_PAD_CAST (pad)->frame_duration = + DEFAULT_PAD_FRAME_DURATION_VP8; + + if (GST_MATROSKAMUX_PAD_CAST (pad)->frame_duration + && gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d) + && fps_n > 0) { + context->default_duration = + gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n); + GST_LOG_OBJECT (pad, "default duration = %" GST_TIME_FORMAT, + GST_TIME_ARGS (context->default_duration)); + } else { + context->default_duration = 0; + } + if (gst_structure_get_fraction (structure, "pixel-aspect-ratio", + &pixel_width, &pixel_height)) { + if (pixel_width > pixel_height) { + videocontext->display_width = width * pixel_width / pixel_height; + videocontext->display_height = height; + } else if (pixel_width < pixel_height) { + videocontext->display_width = width; + videocontext->display_height = height * pixel_height / pixel_width; + } else { + videocontext->display_width = 0; + videocontext->display_height = 0; + } + } else { + videocontext->display_width = 0; + videocontext->display_height = 0; + } + +skip_details: + + videocontext->asr_mode = GST_MATROSKA_ASPECT_RATIO_MODE_FREE; + videocontext->fourcc = 0; + + /* TODO: - check if we handle all codecs by the spec, i.e. codec private + * data and other settings + * - add new formats + */ + + /* extract codec_data, may turn out needed */ + value = gst_structure_get_value (structure, "codec_data"); + if (value) + codec_buf = gst_value_get_buffer (value); + + /* find type */ + if (!strcmp (mimetype, "video/x-raw-yuv")) { + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED); + gst_structure_get_fourcc (structure, "format", &videocontext->fourcc); + } else if (!strcmp (mimetype, "video/x-xvid") /* MS/VfW compatibility cases */ + ||!strcmp (mimetype, "video/x-huffyuv") + || !strcmp (mimetype, "video/x-divx") + || !strcmp (mimetype, "video/x-dv") + || !strcmp (mimetype, "video/x-h263") + || !strcmp (mimetype, "video/x-msmpeg") + || !strcmp (mimetype, "video/x-wmv") + || !strcmp (mimetype, "image/jpeg")) { + gst_riff_strf_vids *bih; + gint size = sizeof (gst_riff_strf_vids); + guint32 fourcc = 0; + + if (!strcmp (mimetype, "video/x-xvid")) + fourcc = GST_MAKE_FOURCC ('X', 'V', 'I', 'D'); + else if (!strcmp (mimetype, "video/x-huffyuv")) + fourcc = GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'); + else if (!strcmp (mimetype, "video/x-dv")) + fourcc = GST_MAKE_FOURCC ('D', 'V', 'S', 'D'); + else if (!strcmp (mimetype, "video/x-h263")) + fourcc = GST_MAKE_FOURCC ('H', '2', '6', '3'); + else if (!strcmp (mimetype, "video/x-divx")) { + gint divxversion; + + gst_structure_get_int (structure, "divxversion", &divxversion); + switch (divxversion) { + case 3: + fourcc = GST_MAKE_FOURCC ('D', 'I', 'V', '3'); + break; + case 4: + fourcc = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); + break; + case 5: + fourcc = GST_MAKE_FOURCC ('D', 'X', '5', '0'); + break; + } + } else if (!strcmp (mimetype, "video/x-msmpeg")) { + gint msmpegversion; + + gst_structure_get_int (structure, "msmpegversion", &msmpegversion); + switch (msmpegversion) { + case 41: + fourcc = GST_MAKE_FOURCC ('M', 'P', 'G', '4'); + break; + case 42: + fourcc = GST_MAKE_FOURCC ('M', 'P', '4', '2'); + break; + case 43: + goto msmpeg43; + break; + } + } else if (!strcmp (mimetype, "video/x-wmv")) { + gint wmvversion; + guint32 format; + if (gst_structure_get_fourcc (structure, "format", &format)) { + fourcc = format; + } else if (gst_structure_get_int (structure, "wmvversion", &wmvversion)) { + if (wmvversion == 2) { + fourcc = GST_MAKE_FOURCC ('W', 'M', 'V', '2'); + } else if (wmvversion == 1) { + fourcc = GST_MAKE_FOURCC ('W', 'M', 'V', '1'); + } else if (wmvversion == 3) { + fourcc = GST_MAKE_FOURCC ('W', 'M', 'V', '3'); + } + } + } else if (!strcmp (mimetype, "image/jpeg")) { + fourcc = GST_MAKE_FOURCC ('M', 'J', 'P', 'G'); + } + + if (!fourcc) + goto refuse_caps; + + bih = g_new0 (gst_riff_strf_vids, 1); + GST_WRITE_UINT32_LE (&bih->size, size); + GST_WRITE_UINT32_LE (&bih->width, videocontext->pixel_width); + GST_WRITE_UINT32_LE (&bih->height, videocontext->pixel_height); + GST_WRITE_UINT32_LE (&bih->compression, fourcc); + GST_WRITE_UINT16_LE (&bih->planes, (guint16) 1); + GST_WRITE_UINT16_LE (&bih->bit_cnt, (guint16) 24); + GST_WRITE_UINT32_LE (&bih->image_size, videocontext->pixel_width * + videocontext->pixel_height * 3); + + /* process codec private/initialization data, if any */ + if (codec_buf) { + size += GST_BUFFER_SIZE (codec_buf); + bih = g_realloc (bih, size); + GST_WRITE_UINT32_LE (&bih->size, size); + memcpy ((guint8 *) bih + sizeof (gst_riff_strf_vids), + GST_BUFFER_DATA (codec_buf), GST_BUFFER_SIZE (codec_buf)); + } + + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC); + context->codec_priv = (gpointer) bih; + context->codec_priv_size = size; + } else if (!strcmp (mimetype, "video/x-h264")) { + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC); + + if (context->codec_priv != NULL) { + g_free (context->codec_priv); + context->codec_priv = NULL; + context->codec_priv_size = 0; + } + + /* Create avcC header */ + if (codec_buf != NULL) { + context->codec_priv_size = GST_BUFFER_SIZE (codec_buf); + context->codec_priv = g_malloc0 (context->codec_priv_size); + memcpy (context->codec_priv, GST_BUFFER_DATA (codec_buf), + context->codec_priv_size); + } + } else if (!strcmp (mimetype, "video/x-theora")) { + const GValue *streamheader; + + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_THEORA); + + if (context->codec_priv != NULL) { + g_free (context->codec_priv); + context->codec_priv = NULL; + context->codec_priv_size = 0; + } + + streamheader = gst_structure_get_value (structure, "streamheader"); + if (!theora_streamheader_to_codecdata (streamheader, context)) { + GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), + ("theora stream headers missing or malformed")); + goto refuse_caps; + } + } else if (!strcmp (mimetype, "video/x-dirac")) { + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_DIRAC); + } else if (!strcmp (mimetype, "video/x-vp8")) { + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_VP8); + } else if (!strcmp (mimetype, "video/mpeg")) { + gint mpegversion; + + gst_structure_get_int (structure, "mpegversion", &mpegversion); + switch (mpegversion) { + case 1: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG1); + break; + case 2: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG2); + break; + case 4: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); + break; + default: + goto refuse_caps; + } + + /* global headers may be in codec data */ + if (codec_buf != NULL) { + context->codec_priv_size = GST_BUFFER_SIZE (codec_buf); + context->codec_priv = g_malloc0 (context->codec_priv_size); + memcpy (context->codec_priv, GST_BUFFER_DATA (codec_buf), + context->codec_priv_size); + } + } else if (!strcmp (mimetype, "video/x-msmpeg")) { + msmpeg43: + /* can only make it here if preceding case verified it was version 3 */ + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3); + } else if (!strcmp (mimetype, "video/x-pn-realvideo")) { + gint rmversion; + const GValue *mdpr_data; + + gst_structure_get_int (structure, "rmversion", &rmversion); + switch (rmversion) { + case 1: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1); + break; + case 2: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2); + break; + case 3: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3); + break; + case 4: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4); + break; + default: + goto refuse_caps; + } + + mdpr_data = gst_structure_get_value (structure, "mdpr_data"); + if (mdpr_data != NULL) { + guint8 *priv_data = NULL; + guint priv_data_size = 0; + + GstBuffer *codec_data_buf = g_value_peek_pointer (mdpr_data); + + priv_data_size = GST_BUFFER_SIZE (codec_data_buf); + priv_data = g_malloc0 (priv_data_size); + + memcpy (priv_data, GST_BUFFER_DATA (codec_data_buf), priv_data_size); + + context->codec_priv = priv_data; + context->codec_priv_size = priv_data_size; + } + } + + return TRUE; + + /* ERRORS */ +refuse_caps: + { + GST_WARNING_OBJECT (mux, "pad %s refused caps %" GST_PTR_FORMAT, + GST_PAD_NAME (pad), caps); + return FALSE; + } +} + +/* N > 0 to expect a particular number of headers, negative if the + number of headers is variable */ +static gboolean +xiphN_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context, GstBuffer ** p_buf0, int N) +{ + GstBuffer **buf = NULL; + GArray *bufarr; + guint8 *priv_data; + guint bufi, i, offset, priv_data_size; + + if (streamheader == NULL) + goto no_stream_headers; + + if (G_VALUE_TYPE (streamheader) != GST_TYPE_ARRAY) + goto wrong_type; + + bufarr = g_value_peek_pointer (streamheader); + if (bufarr->len <= 0 || bufarr->len > 255) /* at least one header, and count stored in a byte */ + goto wrong_count; + if (N > 0 && bufarr->len != N) + goto wrong_count; + + context->xiph_headers_to_skip = bufarr->len; + + buf = (GstBuffer **) g_malloc0 (sizeof (GstBuffer *) * bufarr->len); + for (i = 0; i < bufarr->len; i++) { + GValue *bufval = &g_array_index (bufarr, GValue, i); + + if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { + g_free (buf); + goto wrong_content_type; + } + + buf[i] = g_value_peek_pointer (bufval); + } + + priv_data_size = 1; + if (bufarr->len > 0) { + for (i = 0; i < bufarr->len - 1; i++) { + priv_data_size += GST_BUFFER_SIZE (buf[i]) / 0xff + 1; + } + } + + for (i = 0; i < bufarr->len; ++i) { + priv_data_size += GST_BUFFER_SIZE (buf[i]); + } + + priv_data = g_malloc0 (priv_data_size); + + priv_data[0] = bufarr->len - 1; + offset = 1; + + if (bufarr->len > 0) { + for (bufi = 0; bufi < bufarr->len - 1; bufi++) { + for (i = 0; i < GST_BUFFER_SIZE (buf[bufi]) / 0xff; ++i) { + priv_data[offset++] = 0xff; + } + priv_data[offset++] = GST_BUFFER_SIZE (buf[bufi]) % 0xff; + } + } + + for (i = 0; i < bufarr->len; ++i) { + memcpy (priv_data + offset, GST_BUFFER_DATA (buf[i]), + GST_BUFFER_SIZE (buf[i])); + offset += GST_BUFFER_SIZE (buf[i]); + } + + context->codec_priv = priv_data; + context->codec_priv_size = priv_data_size; + + if (p_buf0) + *p_buf0 = gst_buffer_ref (buf[0]); + + g_free (buf); + + return TRUE; + +/* ERRORS */ +no_stream_headers: + { + GST_WARNING ("required streamheaders missing in sink caps!"); + return FALSE; + } +wrong_type: + { + GST_WARNING ("streamheaders are not a GST_TYPE_ARRAY, but a %s", + G_VALUE_TYPE_NAME (streamheader)); + return FALSE; + } +wrong_count: + { + GST_WARNING ("got %u streamheaders, not %d as expected", bufarr->len, N); + return FALSE; + } +wrong_content_type: + { + GST_WARNING ("streamheaders array does not contain GstBuffers"); + return FALSE; + } +} + +static gboolean +vorbis_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context) +{ + GstBuffer *buf0 = NULL; + + if (!xiphN_streamheader_to_codecdata (streamheader, context, &buf0, 3)) + return FALSE; + + if (buf0 == NULL || GST_BUFFER_SIZE (buf0) < 1 + 6 + 4) { + GST_WARNING ("First vorbis header too small, ignoring"); + } else { + if (memcmp (GST_BUFFER_DATA (buf0) + 1, "vorbis", 6) == 0) { + GstMatroskaTrackAudioContext *audiocontext; + guint8 *hdr; + + hdr = GST_BUFFER_DATA (buf0) + 1 + 6 + 4; + audiocontext = (GstMatroskaTrackAudioContext *) context; + audiocontext->channels = GST_READ_UINT8 (hdr); + audiocontext->samplerate = GST_READ_UINT32_LE (hdr + 1); + } + } + + if (buf0) + gst_buffer_unref (buf0); + + return TRUE; +} + +static gboolean +theora_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context) +{ + GstBuffer *buf0 = NULL; + + if (!xiphN_streamheader_to_codecdata (streamheader, context, &buf0, 3)) + return FALSE; + + if (buf0 == NULL || GST_BUFFER_SIZE (buf0) < 1 + 6 + 26) { + GST_WARNING ("First theora header too small, ignoring"); + } else if (memcmp (GST_BUFFER_DATA (buf0), "\200theora\003\002", 9) != 0) { + GST_WARNING ("First header not a theora identification header, ignoring"); + } else { + GstMatroskaTrackVideoContext *videocontext; + guint fps_num, fps_denom, par_num, par_denom; + guint8 *hdr; + + hdr = GST_BUFFER_DATA (buf0) + 1 + 6 + 3 + 2 + 2; + + videocontext = (GstMatroskaTrackVideoContext *) context; + videocontext->pixel_width = GST_READ_UINT32_BE (hdr) >> 8; + videocontext->pixel_height = GST_READ_UINT32_BE (hdr + 3) >> 8; + hdr += 3 + 3 + 1 + 1; + fps_num = GST_READ_UINT32_BE (hdr); + fps_denom = GST_READ_UINT32_BE (hdr + 4); + context->default_duration = gst_util_uint64_scale_int (GST_SECOND, + fps_denom, fps_num); + hdr += 4 + 4; + par_num = GST_READ_UINT32_BE (hdr) >> 8; + par_denom = GST_READ_UINT32_BE (hdr + 3) >> 8; + if (par_num > 0 && par_num > 0) { + if (par_num > par_denom) { + videocontext->display_width = + videocontext->pixel_width * par_num / par_denom; + videocontext->display_height = videocontext->pixel_height; + } else if (par_num < par_denom) { + videocontext->display_width = videocontext->pixel_width; + videocontext->display_height = + videocontext->pixel_height * par_denom / par_num; + } else { + videocontext->display_width = 0; + videocontext->display_height = 0; + } + } else { + videocontext->display_width = 0; + videocontext->display_height = 0; + } + hdr += 3 + 3; + } + + if (buf0) + gst_buffer_unref (buf0); + + return TRUE; +} + +static gboolean +kate_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context) +{ + GstBuffer *buf0 = NULL; + + if (!xiphN_streamheader_to_codecdata (streamheader, context, &buf0, -1)) + return FALSE; + + if (buf0 == NULL || GST_BUFFER_SIZE (buf0) < 64) { /* Kate ID header is 64 bytes */ + GST_WARNING ("First kate header too small, ignoring"); + } else if (memcmp (GST_BUFFER_DATA (buf0), "\200kate\0\0\0", 8) != 0) { + GST_WARNING ("First header not a kate identification header, ignoring"); + } + + if (buf0) + gst_buffer_unref (buf0); + + return TRUE; +} + +static gboolean +flac_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context) +{ + GArray *bufarr; + gint i; + GValue *bufval; + GstBuffer *buffer; + + if (streamheader == NULL || G_VALUE_TYPE (streamheader) != GST_TYPE_ARRAY) { + GST_WARNING ("No or invalid streamheader field in the caps"); + return FALSE; + } + + bufarr = g_value_peek_pointer (streamheader); + if (bufarr->len < 2) { + GST_WARNING ("Too few headers in streamheader field"); + return FALSE; + } + + context->xiph_headers_to_skip = bufarr->len + 1; + + bufval = &g_array_index (bufarr, GValue, 0); + if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { + GST_WARNING ("streamheaders array does not contain GstBuffers"); + return FALSE; + } + + buffer = g_value_peek_pointer (bufval); + + /* Need at least OggFLAC mapping header, fLaC marker and STREAMINFO block */ + if (GST_BUFFER_SIZE (buffer) < 9 + 4 + 4 + 34 + || memcmp (GST_BUFFER_DATA (buffer) + 1, "FLAC", 4) != 0 + || memcmp (GST_BUFFER_DATA (buffer) + 9, "fLaC", 4) != 0) { + GST_WARNING ("Invalid streamheader for FLAC"); + return FALSE; + } + + context->codec_priv = g_malloc (GST_BUFFER_SIZE (buffer) - 9); + context->codec_priv_size = GST_BUFFER_SIZE (buffer) - 9; + memcpy (context->codec_priv, GST_BUFFER_DATA (buffer) + 9, + GST_BUFFER_SIZE (buffer) - 9); + + for (i = 1; i < bufarr->len; i++) { + bufval = &g_array_index (bufarr, GValue, i); + + if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { + g_free (context->codec_priv); + context->codec_priv = NULL; + context->codec_priv_size = 0; + GST_WARNING ("streamheaders array does not contain GstBuffers"); + return FALSE; + } + + buffer = g_value_peek_pointer (bufval); + + context->codec_priv = + g_realloc (context->codec_priv, + context->codec_priv_size + GST_BUFFER_SIZE (buffer)); + memcpy ((guint8 *) context->codec_priv + context->codec_priv_size, + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + context->codec_priv_size = + context->codec_priv_size + GST_BUFFER_SIZE (buffer); + } + + return TRUE; +} + +static gboolean +speex_streamheader_to_codecdata (const GValue * streamheader, + GstMatroskaTrackContext * context) +{ + GArray *bufarr; + GValue *bufval; + GstBuffer *buffer; + + if (streamheader == NULL || G_VALUE_TYPE (streamheader) != GST_TYPE_ARRAY) { + GST_WARNING ("No or invalid streamheader field in the caps"); + return FALSE; + } + + bufarr = g_value_peek_pointer (streamheader); + if (bufarr->len != 2) { + GST_WARNING ("Too few headers in streamheader field"); + return FALSE; + } + + context->xiph_headers_to_skip = bufarr->len + 1; + + bufval = &g_array_index (bufarr, GValue, 0); + if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { + GST_WARNING ("streamheaders array does not contain GstBuffers"); + return FALSE; + } + + buffer = g_value_peek_pointer (bufval); + + if (GST_BUFFER_SIZE (buffer) < 80 + || memcmp (GST_BUFFER_DATA (buffer), "Speex ", 8) != 0) { + GST_WARNING ("Invalid streamheader for Speex"); + return FALSE; + } + + context->codec_priv = g_malloc (GST_BUFFER_SIZE (buffer)); + context->codec_priv_size = GST_BUFFER_SIZE (buffer); + memcpy (context->codec_priv, GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); + + bufval = &g_array_index (bufarr, GValue, 1); + + if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { + g_free (context->codec_priv); + context->codec_priv = NULL; + context->codec_priv_size = 0; + GST_WARNING ("streamheaders array does not contain GstBuffers"); + return FALSE; + } + + buffer = g_value_peek_pointer (bufval); + + context->codec_priv = + g_realloc (context->codec_priv, + context->codec_priv_size + GST_BUFFER_SIZE (buffer)); + memcpy ((guint8 *) context->codec_priv + context->codec_priv_size, + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + context->codec_priv_size = + context->codec_priv_size + GST_BUFFER_SIZE (buffer); + + return TRUE; +} + +static const gchar * +aac_codec_data_to_codec_id (const GstBuffer * buf) +{ + const gchar *result; + gint profile; + + /* default to MAIN */ + profile = 1; + + if (GST_BUFFER_SIZE (buf) >= 2) { + profile = GST_READ_UINT8 (GST_BUFFER_DATA (buf)); + profile >>= 3; + } + + switch (profile) { + case 1: + result = "MAIN"; + break; + case 2: + result = "LC"; + break; + case 3: + result = "SSR"; + break; + case 4: + result = "LTP"; + break; + default: + GST_WARNING ("unknown AAC profile, defaulting to MAIN"); + result = "MAIN"; + break; + } + + return result; +} + +/** + * gst_matroska_mux_audio_pad_setcaps: + * @pad: Pad which got the caps. + * @caps: New caps. + * + * Setcaps function for audio sink pad. + * + * Returns: #TRUE on success. + */ +static gboolean +gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps) +{ + GstMatroskaTrackContext *context = NULL; + GstMatroskaTrackAudioContext *audiocontext; + GstMatroskaMux *mux; + GstMatroskaPad *collect_pad; + const gchar *mimetype; + gint samplerate = 0, channels = 0; + GstStructure *structure; + const GValue *codec_data = NULL; + const GstBuffer *buf = NULL; + const gchar *stream_format = NULL; + + mux = GST_MATROSKA_MUX (GST_PAD_PARENT (pad)); + + /* find context */ + collect_pad = (GstMatroskaPad *) gst_pad_get_element_private (pad); + g_assert (collect_pad); + context = collect_pad->track; + g_assert (context); + g_assert (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO); + audiocontext = (GstMatroskaTrackAudioContext *) context; + + structure = gst_caps_get_structure (caps, 0); + mimetype = gst_structure_get_name (structure); + + /* general setup */ + gst_structure_get_int (structure, "rate", &samplerate); + gst_structure_get_int (structure, "channels", &channels); + + audiocontext->samplerate = samplerate; + audiocontext->channels = channels; + audiocontext->bitdepth = 0; + context->default_duration = 0; + + codec_data = gst_structure_get_value (structure, "codec_data"); + if (codec_data) + buf = gst_value_get_buffer (codec_data); + + /* TODO: - check if we handle all codecs by the spec, i.e. codec private + * data and other settings + * - add new formats + */ + + if (!strcmp (mimetype, "audio/mpeg")) { + gint mpegversion = 0; + + gst_structure_get_int (structure, "mpegversion", &mpegversion); + switch (mpegversion) { + case 1:{ + gint layer; + gint version = 1; + gint spf; + + gst_structure_get_int (structure, "layer", &layer); + + if (!gst_structure_get_int (structure, "mpegaudioversion", &version)) { + GST_WARNING_OBJECT (mux, + "Unable to determine MPEG audio version, assuming 1"); + version = 1; + } + + if (layer == 1) + spf = 384; + else if (layer == 2) + spf = 1152; + else if (version == 2) + spf = 576; + else + spf = 1152; + + context->default_duration = + gst_util_uint64_scale (GST_SECOND, spf, audiocontext->samplerate); + + switch (layer) { + case 1: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1); + break; + case 2: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2); + break; + case 3: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3); + break; + default: + goto refuse_caps; + } + break; + } + case 2: + case 4: + stream_format = gst_structure_get_string (structure, "stream-format"); + /* check this is raw aac */ + if (stream_format) { + if (strcmp (stream_format, "raw") != 0) { + GST_WARNING_OBJECT (mux, "AAC stream-format must be 'raw', not %s", + stream_format); + } + } else { + GST_WARNING_OBJECT (mux, "AAC stream-format not specified, " + "assuming 'raw'"); + } + + if (buf) { + if (mpegversion == 2) + context->codec_id = + g_strdup_printf (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2 "%s", + aac_codec_data_to_codec_id (buf)); + else if (mpegversion == 4) + context->codec_id = + g_strdup_printf (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4 "%s", + aac_codec_data_to_codec_id (buf)); + else + g_assert_not_reached (); + } else { + GST_DEBUG_OBJECT (mux, "no AAC codec_data; not packetized"); + goto refuse_caps; + } + break; + default: + goto refuse_caps; + } + } else if (!strcmp (mimetype, "audio/x-raw-int")) { + gint width, depth; + gint endianness = G_LITTLE_ENDIAN; + gboolean signedness = TRUE; + + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "depth", &depth) || + !gst_structure_get_boolean (structure, "signed", &signedness)) { + GST_DEBUG_OBJECT (mux, "broken caps, width/depth/signed field missing"); + goto refuse_caps; + } + + if (depth > 8 && + !gst_structure_get_int (structure, "endianness", &endianness)) { + GST_DEBUG_OBJECT (mux, "broken caps, no endianness specified"); + goto refuse_caps; + } + + if (width != depth) { + GST_DEBUG_OBJECT (mux, "width must be same as depth!"); + goto refuse_caps; + } + + /* FIXME: where is this spec'ed out? (tpm) */ + if ((width == 8 && signedness) || (width >= 16 && !signedness)) { + GST_DEBUG_OBJECT (mux, "8-bit PCM must be unsigned, 16-bit PCM signed"); + goto refuse_caps; + } + + audiocontext->bitdepth = depth; + if (endianness == G_BIG_ENDIAN) + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE); + else + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE); + + } else if (!strcmp (mimetype, "audio/x-raw-float")) { + gint width; + + if (!gst_structure_get_int (structure, "width", &width)) { + GST_DEBUG_OBJECT (mux, "broken caps, width field missing"); + goto refuse_caps; + } + + audiocontext->bitdepth = width; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT); + + } else if (!strcmp (mimetype, "audio/x-vorbis")) { + const GValue *streamheader; + + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_VORBIS); + + if (context->codec_priv != NULL) { + g_free (context->codec_priv); + context->codec_priv = NULL; + context->codec_priv_size = 0; + } + + streamheader = gst_structure_get_value (structure, "streamheader"); + if (!vorbis_streamheader_to_codecdata (streamheader, context)) { + GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), + ("vorbis stream headers missing or malformed")); + goto refuse_caps; + } + } else if (!strcmp (mimetype, "audio/x-flac")) { + const GValue *streamheader; + + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_FLAC); + if (context->codec_priv != NULL) { + g_free (context->codec_priv); + context->codec_priv = NULL; + context->codec_priv_size = 0; + } + + streamheader = gst_structure_get_value (structure, "streamheader"); + if (!flac_streamheader_to_codecdata (streamheader, context)) { + GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), + ("flac stream headers missing or malformed")); + goto refuse_caps; + } + } else if (!strcmp (mimetype, "audio/x-speex")) { + const GValue *streamheader; + + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_SPEEX); + if (context->codec_priv != NULL) { + g_free (context->codec_priv); + context->codec_priv = NULL; + context->codec_priv_size = 0; + } + + streamheader = gst_structure_get_value (structure, "streamheader"); + if (!speex_streamheader_to_codecdata (streamheader, context)) { + GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), + ("speex stream headers missing or malformed")); + goto refuse_caps; + } + } else if (!strcmp (mimetype, "audio/x-ac3")) { + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_AC3); + } else if (!strcmp (mimetype, "audio/x-eac3")) { + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_EAC3); + } else if (!strcmp (mimetype, "audio/x-dts")) { + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_DTS); + } else if (!strcmp (mimetype, "audio/x-tta")) { + gint width; + + /* TTA frame duration */ + context->default_duration = 1.04489795918367346939 * GST_SECOND; + + gst_structure_get_int (structure, "width", &width); + audiocontext->bitdepth = width; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_TTA); + + } else if (!strcmp (mimetype, "audio/x-pn-realaudio")) { + gint raversion; + const GValue *mdpr_data; + + gst_structure_get_int (structure, "raversion", &raversion); + switch (raversion) { + case 1: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4); + break; + case 2: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_REAL_28_8); + break; + case 8: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK); + break; + default: + goto refuse_caps; + } + + mdpr_data = gst_structure_get_value (structure, "mdpr_data"); + if (mdpr_data != NULL) { + guint8 *priv_data = NULL; + guint priv_data_size = 0; + + GstBuffer *codec_data_buf = g_value_peek_pointer (mdpr_data); + + priv_data_size = GST_BUFFER_SIZE (codec_data_buf); + priv_data = g_malloc0 (priv_data_size); + + memcpy (priv_data, GST_BUFFER_DATA (codec_data_buf), priv_data_size); + + context->codec_priv = priv_data; + context->codec_priv_size = priv_data_size; + } + + } else if (!strcmp (mimetype, "audio/x-wma") + || !strcmp (mimetype, "audio/x-alaw") + || !strcmp (mimetype, "audio/x-mulaw")) { + guint8 *codec_priv; + guint codec_priv_size; + guint16 format = 0; + gint block_align; + gint bitrate; + + if (samplerate == 0 || channels == 0) { + GST_WARNING_OBJECT (mux, "Missing channels/samplerate on caps"); + goto refuse_caps; + } + + if (!strcmp (mimetype, "audio/x-wma")) { + gint wmaversion; + gint depth; + + if (!gst_structure_get_int (structure, "wmaversion", &wmaversion) + || !gst_structure_get_int (structure, "block_align", &block_align) + || !gst_structure_get_int (structure, "bitrate", &bitrate)) { + GST_WARNING_OBJECT (mux, "Missing wmaversion/block_align/bitrate" + " on WMA caps"); + goto refuse_caps; + } + + switch (wmaversion) { + case 1: + format = GST_RIFF_WAVE_FORMAT_WMAV1; + break; + case 2: + format = GST_RIFF_WAVE_FORMAT_WMAV2; + break; + case 3: + format = GST_RIFF_WAVE_FORMAT_WMAV3; + break; + default: + GST_WARNING_OBJECT (mux, "Unexpected WMA version: %d", wmaversion); + goto refuse_caps; + } + + if (gst_structure_get_int (structure, "depth", &depth)) + audiocontext->bitdepth = depth; + } else if (!strcmp (mimetype, "audio/x-alaw") + || !strcmp (mimetype, "audio/x-mulaw")) { + audiocontext->bitdepth = 8; + if (!strcmp (mimetype, "audio/x-alaw")) + format = GST_RIFF_WAVE_FORMAT_ALAW; + else + format = GST_RIFF_WAVE_FORMAT_MULAW; + + block_align = channels; + bitrate = block_align * samplerate; + } + g_assert (format != 0); + + codec_priv_size = WAVEFORMATEX_SIZE; + if (buf) + codec_priv_size += GST_BUFFER_SIZE (buf); + + /* serialize waveformatex structure */ + codec_priv = g_malloc0 (codec_priv_size); + GST_WRITE_UINT16_LE (codec_priv, format); + GST_WRITE_UINT16_LE (codec_priv + 2, channels); + GST_WRITE_UINT32_LE (codec_priv + 4, samplerate); + GST_WRITE_UINT32_LE (codec_priv + 8, bitrate / 8); + GST_WRITE_UINT16_LE (codec_priv + 12, block_align); + GST_WRITE_UINT16_LE (codec_priv + 14, 0); + if (buf) + GST_WRITE_UINT16_LE (codec_priv + 16, GST_BUFFER_SIZE (buf)); + else + GST_WRITE_UINT16_LE (codec_priv + 16, 0); + + /* process codec private/initialization data, if any */ + if (buf) { + memcpy ((guint8 *) codec_priv + WAVEFORMATEX_SIZE, + GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + } + + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_ACM); + context->codec_priv = (gpointer) codec_priv; + context->codec_priv_size = codec_priv_size; + } + + return TRUE; + + /* ERRORS */ +refuse_caps: + { + GST_WARNING_OBJECT (mux, "pad %s refused caps %" GST_PTR_FORMAT, + GST_PAD_NAME (pad), caps); + return FALSE; + } +} + + +/** + * gst_matroska_mux_subtitle_pad_setcaps: + * @pad: Pad which got the caps. + * @caps: New caps. + * + * Setcaps function for subtitle sink pad. + * + * Returns: #TRUE on success. + */ +static gboolean +gst_matroska_mux_subtitle_pad_setcaps (GstPad * pad, GstCaps * caps) +{ + /* FIXME: + * Consider this as boilerplate code for now. There is + * no single subtitle creation element in GStreamer, + * neither do I know how subtitling works at all. */ + + /* There is now (at least) one such alement (kateenc), and I'm going + to handle it here and claim it works when it can be piped back + through GStreamer and VLC */ + + GstMatroskaTrackContext *context = NULL; + GstMatroskaTrackSubtitleContext *scontext; + GstMatroskaMux *mux; + GstMatroskaPad *collect_pad; + const gchar *mimetype; + GstStructure *structure; + + mux = GST_MATROSKA_MUX (GST_PAD_PARENT (pad)); + + /* find context */ + collect_pad = (GstMatroskaPad *) gst_pad_get_element_private (pad); + g_assert (collect_pad); + context = collect_pad->track; + g_assert (context); + g_assert (context->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE); + scontext = (GstMatroskaTrackSubtitleContext *) context; + + structure = gst_caps_get_structure (caps, 0); + mimetype = gst_structure_get_name (structure); + + /* general setup */ + scontext->check_utf8 = 1; + scontext->invalid_utf8 = 0; + context->default_duration = 0; + + /* TODO: - other format than Kate */ + + if (!strcmp (mimetype, "subtitle/x-kate")) { + const GValue *streamheader; + + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_SUBTITLE_KATE); + + if (context->codec_priv != NULL) { + g_free (context->codec_priv); + context->codec_priv = NULL; + context->codec_priv_size = 0; + } + + streamheader = gst_structure_get_value (structure, "streamheader"); + if (!kate_streamheader_to_codecdata (streamheader, context)) { + GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), + ("kate stream headers missing or malformed")); + return FALSE; + } + return TRUE; + } + + return FALSE; +} + + +/** + * gst_matroska_mux_request_new_pad: + * @element: #GstMatroskaMux. + * @templ: #GstPadTemplate. + * @pad_name: New pad name. + * + * Request pad function for sink templates. + * + * Returns: New #GstPad. + */ +static GstPad * +gst_matroska_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); + GstMatroskaMux *mux = GST_MATROSKA_MUX (element); + GstMatroskaPad *collect_pad; + GstMatroskamuxPad *newpad; + gchar *name = NULL; + const gchar *pad_name = NULL; + GstPadSetCapsFunction setcapsfunc = NULL; + GstMatroskaTrackContext *context = NULL; + gint pad_id; + + if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { + /* don't mix named and unnamed pads, if the pad already exists we fail when + * trying to add it */ + if (req_name != NULL && sscanf (req_name, "audio_%d", &pad_id) == 1) { + pad_name = req_name; + } else { + name = g_strdup_printf ("audio_%d", mux->num_a_streams++); + pad_name = name; + } + setcapsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_audio_pad_setcaps); + context = (GstMatroskaTrackContext *) + g_new0 (GstMatroskaTrackAudioContext, 1); + context->type = GST_MATROSKA_TRACK_TYPE_AUDIO; + context->name = g_strdup ("Audio"); + } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { + /* don't mix named and unnamed pads, if the pad already exists we fail when + * trying to add it */ + if (req_name != NULL && sscanf (req_name, "video_%d", &pad_id) == 1) { + pad_name = req_name; + } else { + name = g_strdup_printf ("video_%d", mux->num_v_streams++); + pad_name = name; + } + setcapsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_video_pad_setcaps); + context = (GstMatroskaTrackContext *) + g_new0 (GstMatroskaTrackVideoContext, 1); + context->type = GST_MATROSKA_TRACK_TYPE_VIDEO; + context->name = g_strdup ("Video"); + } else if (templ == gst_element_class_get_pad_template (klass, "subtitle_%d")) { + /* don't mix named and unnamed pads, if the pad already exists we fail when + * trying to add it */ + if (req_name != NULL && sscanf (req_name, "subtitle_%d", &pad_id) == 1) { + pad_name = req_name; + } else { + name = g_strdup_printf ("subtitle_%d", mux->num_t_streams++); + pad_name = name; + } + setcapsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_subtitle_pad_setcaps); + context = (GstMatroskaTrackContext *) + g_new0 (GstMatroskaTrackSubtitleContext, 1); + context->type = GST_MATROSKA_TRACK_TYPE_SUBTITLE; + context->name = g_strdup ("Subtitle"); + } else { + GST_WARNING_OBJECT (mux, "This is not our template!"); + return NULL; + } + + newpad = g_object_new (GST_TYPE_MATROSKAMUX_PAD, + "name", pad_name, "direction", templ->direction, "template", templ, NULL); + g_free (name); + + gst_matroskamux_pad_init (newpad); + collect_pad = (GstMatroskaPad *) + gst_collect_pads_add_pad_full (mux->collect, GST_PAD (newpad), + sizeof (GstMatroskamuxPad), + (GstCollectDataDestroyNotify) gst_matroska_pad_free); + + collect_pad->track = context; + gst_matroska_pad_reset (collect_pad, FALSE); + + /* 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. + * TODO GstCollectPads should really give its 'users' a clean chance to + * properly handle events that are not meant for collectpads itself. + * Perhaps a callback or so, though rejected (?) in #340060. + * This would allow (clean) transcoding of info from demuxer/streams + * to another muxer */ + mux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad); + gst_pad_set_event_function (GST_PAD (newpad), + GST_DEBUG_FUNCPTR (gst_matroska_mux_handle_sink_event)); + + gst_pad_set_setcaps_function (GST_PAD (newpad), setcapsfunc); + gst_pad_set_active (GST_PAD (newpad), TRUE); + if (!gst_element_add_pad (element, GST_PAD (newpad))) + goto pad_add_failed; + + mux->num_streams++; + + GST_DEBUG_OBJECT (newpad, "Added new request pad"); + + return GST_PAD (newpad); + + /* ERROR cases */ +pad_add_failed: + { + GST_WARNING_OBJECT (mux, "Adding the new pad '%s' failed", pad_name); + gst_object_unref (newpad); + return NULL; + } +} + +/** + * gst_matroska_mux_release_pad: + * @element: #GstMatroskaMux. + * @pad: Pad to release. + * + * Release a previously requested pad. +*/ +static void +gst_matroska_mux_release_pad (GstElement * element, GstPad * pad) +{ + GstMatroskaMux *mux; + GSList *walk; + + mux = GST_MATROSKA_MUX (GST_PAD_PARENT (pad)); + + for (walk = mux->collect->data; walk; walk = g_slist_next (walk)) { + GstCollectData *cdata = (GstCollectData *) walk->data; + GstMatroskaPad *collect_pad = (GstMatroskaPad *) cdata; + + if (cdata->pad == pad) { + GstClockTime min_dur; /* observed minimum duration */ + + if (GST_CLOCK_TIME_IS_VALID (collect_pad->start_ts) && + GST_CLOCK_TIME_IS_VALID (collect_pad->end_ts)) { + min_dur = GST_CLOCK_DIFF (collect_pad->start_ts, collect_pad->end_ts); + if (collect_pad->duration < min_dur) + collect_pad->duration = min_dur; + } + + if (GST_CLOCK_TIME_IS_VALID (collect_pad->duration) && + mux->duration < collect_pad->duration) + mux->duration = collect_pad->duration; + + break; + } + } + + gst_collect_pads_remove_pad (mux->collect, pad); + if (gst_element_remove_pad (element, pad)) + mux->num_streams--; +} + + +/** + * gst_matroska_mux_track_header: + * @mux: #GstMatroskaMux + * @context: Tack context. + * + * Write a track header. + */ +static void +gst_matroska_mux_track_header (GstMatroskaMux * mux, + GstMatroskaTrackContext * context) +{ + GstEbmlWrite *ebml = mux->ebml_write; + guint64 master; + + /* TODO: check if everything necessary is written and check default values */ + + /* track type goes before the type-specific stuff */ + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKNUMBER, context->num); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKTYPE, context->type); + + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKUID, + gst_matroska_mux_create_uid ()); + if (context->default_duration) { + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKDEFAULTDURATION, + context->default_duration); + } + if (context->language) { + gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TRACKLANGUAGE, + context->language); + } + + /* type-specific stuff */ + switch (context->type) { + case GST_MATROSKA_TRACK_TYPE_VIDEO:{ + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) context; + + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKVIDEO); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOPIXELWIDTH, + videocontext->pixel_width); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOPIXELHEIGHT, + videocontext->pixel_height); + if (videocontext->display_width && videocontext->display_height) { + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYWIDTH, + videocontext->display_width); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYHEIGHT, + videocontext->display_height); + } + if (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 1); + if (videocontext->fourcc) { + guint32 fcc_le = GUINT32_TO_LE (videocontext->fourcc); + + gst_ebml_write_binary (ebml, GST_MATROSKA_ID_VIDEOCOLOURSPACE, + (gpointer) & fcc_le, 4); + } + gst_ebml_write_master_finish (ebml, master); + + break; + } + + case GST_MATROSKA_TRACK_TYPE_AUDIO:{ + GstMatroskaTrackAudioContext *audiocontext = + (GstMatroskaTrackAudioContext *) context; + + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKAUDIO); + if (audiocontext->samplerate != 8000) + gst_ebml_write_float (ebml, GST_MATROSKA_ID_AUDIOSAMPLINGFREQ, + audiocontext->samplerate); + if (audiocontext->channels != 1) + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOCHANNELS, + audiocontext->channels); + if (audiocontext->bitdepth) { + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOBITDEPTH, + audiocontext->bitdepth); + } + gst_ebml_write_master_finish (ebml, master); + + break; + } + + default: + /* doesn't need type-specific data */ + break; + } + + gst_ebml_write_ascii (ebml, GST_MATROSKA_ID_CODECID, context->codec_id); + if (context->codec_priv) + gst_ebml_write_binary (ebml, GST_MATROSKA_ID_CODECPRIVATE, + context->codec_priv, context->codec_priv_size); + /* FIXME: until we have a nice way of getting the codecname + * out of the caps, I'm not going to enable this. Too much + * (useless, double, boring) work... */ + /* TODO: Use value from tags if any */ + /*gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_CODECNAME, + context->codec_name); */ + gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TRACKNAME, context->name); +} + + +/** + * gst_matroska_mux_start: + * @mux: #GstMatroskaMux + * + * Start a new matroska file (write headers etc...) + */ +static void +gst_matroska_mux_start (GstMatroskaMux * mux) +{ + GstEbmlWrite *ebml = mux->ebml_write; + const gchar *doctype; + guint32 seekhead_id[] = { GST_MATROSKA_ID_SEGMENTINFO, + GST_MATROSKA_ID_TRACKS, + GST_MATROSKA_ID_CUES, + GST_MATROSKA_ID_TAGS, + 0 + }; + guint64 master, child; + GSList *collected; + int i; + guint tracknum = 1; + GstClockTime duration = 0; + guint32 segment_uid[4]; + GTimeVal time = { 0, 0 }; + + if (!strcmp (mux->doctype, GST_MATROSKA_DOCTYPE_WEBM)) { + ebml->caps = gst_caps_new_simple ("video/webm", NULL); + } else { + ebml->caps = gst_caps_new_simple ("video/x-matroska", NULL); + } + /* we start with a EBML header */ + doctype = mux->doctype; + GST_INFO_OBJECT (ebml, "DocType: %s, Version: %d", + doctype, mux->doctype_version); + gst_ebml_write_header (ebml, doctype, mux->doctype_version); + + /* the rest of the header is cached */ + gst_ebml_write_set_cache (ebml, 0x1000); + + /* start a segment */ + mux->segment_pos = + gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEGMENT); + mux->segment_master = ebml->pos; + + if (!mux->streamable) { + /* seekhead (table of contents) - we set the positions later */ + mux->seekhead_pos = ebml->pos; + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEEKHEAD); + for (i = 0; seekhead_id[i] != 0; i++) { + child = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEEKENTRY); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_SEEKID, seekhead_id[i]); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_SEEKPOSITION, -1); + gst_ebml_write_master_finish (ebml, child); + } + gst_ebml_write_master_finish (ebml, master); + } + + if (mux->streamable) { + const GstTagList *tags; + + /* tags */ + tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux)); + + if (tags != NULL && !gst_tag_list_is_empty (tags)) { + guint64 master_tags, master_tag; + + GST_DEBUG ("Writing tags"); + + /* TODO: maybe limit via the TARGETS id by looking at the source pad */ + mux->tags_pos = ebml->pos; + master_tags = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TAGS); + master_tag = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TAG); + gst_tag_list_foreach (tags, gst_matroska_mux_write_simple_tag, ebml); + gst_ebml_write_master_finish (ebml, master_tag); + gst_ebml_write_master_finish (ebml, master_tags); + } + } + + /* segment info */ + mux->info_pos = ebml->pos; + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEGMENTINFO); + for (i = 0; i < 4; i++) { + segment_uid[i] = g_random_int (); + } + gst_ebml_write_binary (ebml, GST_MATROSKA_ID_SEGMENTUID, + (guint8 *) segment_uid, 16); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TIMECODESCALE, mux->time_scale); + mux->duration_pos = ebml->pos; + /* get duration */ + if (!mux->streamable) { + for (collected = mux->collect->data; collected; + collected = g_slist_next (collected)) { + GstMatroskaPad *collect_pad; + GstFormat format = GST_FORMAT_TIME; + GstPad *thepad; + gint64 trackduration; + + collect_pad = (GstMatroskaPad *) collected->data; + thepad = collect_pad->collect.pad; + + /* Query the total length of the track. */ + GST_DEBUG_OBJECT (thepad, "querying peer duration"); + if (gst_pad_query_peer_duration (thepad, &format, &trackduration)) { + GST_DEBUG_OBJECT (thepad, "duration: %" GST_TIME_FORMAT, + GST_TIME_ARGS (trackduration)); + if (trackduration != GST_CLOCK_TIME_NONE && trackduration > duration) { + duration = (GstClockTime) trackduration; + } + } + } + gst_ebml_write_float (ebml, GST_MATROSKA_ID_DURATION, + gst_guint64_to_gdouble (duration) / + gst_guint64_to_gdouble (mux->time_scale)); + } + gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_MUXINGAPP, + "GStreamer plugin version " PACKAGE_VERSION); + if (mux->writing_app && mux->writing_app[0]) { + gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_WRITINGAPP, mux->writing_app); + } + g_get_current_time (&time); + gst_ebml_write_date (ebml, GST_MATROSKA_ID_DATEUTC, time.tv_sec); + gst_ebml_write_master_finish (ebml, master); + + /* tracks */ + mux->tracks_pos = ebml->pos; + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKS); + + for (collected = mux->collect->data; collected; + collected = g_slist_next (collected)) { + GstMatroskaPad *collect_pad; + GstPad *thepad; + + collect_pad = (GstMatroskaPad *) collected->data; + thepad = collect_pad->collect.pad; + + if (gst_pad_is_linked (thepad) && gst_pad_is_active (thepad) && + collect_pad->track->codec_id != 0) { + collect_pad->track->num = tracknum++; + child = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKENTRY); + gst_matroska_mux_track_header (mux, collect_pad->track); + gst_ebml_write_master_finish (ebml, child); + /* some remaing pad/track setup */ + collect_pad->default_duration_scaled = + gst_util_uint64_scale (collect_pad->track->default_duration, + 1, mux->time_scale); + } + } + gst_ebml_write_master_finish (ebml, master); + + /* lastly, flush the cache */ + gst_ebml_write_flush_cache (ebml, FALSE, 0); +} + +static void +gst_matroska_mux_write_simple_tag (const GstTagList * list, const gchar * tag, + gpointer data) +{ + /* TODO: more sensible tag mappings */ + static const struct + { + const gchar *matroska_tagname; + const gchar *gstreamer_tagname; + } + tag_conv[] = { + { + GST_MATROSKA_TAG_ID_TITLE, GST_TAG_TITLE}, { + GST_MATROSKA_TAG_ID_ARTIST, GST_TAG_ARTIST}, { + GST_MATROSKA_TAG_ID_ALBUM, GST_TAG_ALBUM}, { + GST_MATROSKA_TAG_ID_COMMENTS, GST_TAG_COMMENT}, { + GST_MATROSKA_TAG_ID_BITSPS, GST_TAG_BITRATE}, { + GST_MATROSKA_TAG_ID_BPS, GST_TAG_BITRATE}, { + GST_MATROSKA_TAG_ID_ENCODER, GST_TAG_ENCODER}, { + GST_MATROSKA_TAG_ID_DATE, GST_TAG_DATE}, { + GST_MATROSKA_TAG_ID_ISRC, GST_TAG_ISRC}, { + GST_MATROSKA_TAG_ID_COPYRIGHT, GST_TAG_COPYRIGHT}, { + GST_MATROSKA_TAG_ID_BPM, GST_TAG_BEATS_PER_MINUTE}, { + GST_MATROSKA_TAG_ID_TERMS_OF_USE, GST_TAG_LICENSE}, { + GST_MATROSKA_TAG_ID_COMPOSER, GST_TAG_COMPOSER}, { + GST_MATROSKA_TAG_ID_LEAD_PERFORMER, GST_TAG_PERFORMER}, { + GST_MATROSKA_TAG_ID_GENRE, GST_TAG_GENRE} + }; + GstEbmlWrite *ebml = (GstEbmlWrite *) data; + guint i; + guint64 simpletag_master; + + for (i = 0; i < G_N_ELEMENTS (tag_conv); i++) { + const gchar *tagname_gst = tag_conv[i].gstreamer_tagname; + const gchar *tagname_mkv = tag_conv[i].matroska_tagname; + + if (strcmp (tagname_gst, tag) == 0) { + GValue src = { 0, }; + gchar *dest; + + if (!gst_tag_list_copy_value (&src, list, tag)) + break; + if ((dest = gst_value_serialize (&src))) { + + simpletag_master = gst_ebml_write_master_start (ebml, + GST_MATROSKA_ID_SIMPLETAG); + gst_ebml_write_ascii (ebml, GST_MATROSKA_ID_TAGNAME, tagname_mkv); + gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TAGSTRING, dest); + gst_ebml_write_master_finish (ebml, simpletag_master); + g_free (dest); + } else { + GST_WARNING ("Can't transform tag '%s' to string", tagname_mkv); + } + g_value_unset (&src); + break; + } + } +} + + +/** + * gst_matroska_mux_finish: + * @mux: #GstMatroskaMux + * + * Finish a new matroska file (write index etc...) + */ +static void +gst_matroska_mux_finish (GstMatroskaMux * mux) +{ + GstEbmlWrite *ebml = mux->ebml_write; + guint64 pos; + guint64 duration = 0; + GSList *collected; + const GstTagList *tags; + + /* finish last cluster */ + if (mux->cluster) { + gst_ebml_write_master_finish (ebml, mux->cluster); + } + + /* cues */ + if (mux->index != NULL) { + guint n; + guint64 master, pointentry_master, trackpos_master; + + mux->cues_pos = ebml->pos; + gst_ebml_write_set_cache (ebml, 12 + 41 * mux->num_indexes); + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CUES); + + for (n = 0; n < mux->num_indexes; n++) { + GstMatroskaIndex *idx = &mux->index[n]; + + pointentry_master = gst_ebml_write_master_start (ebml, + GST_MATROSKA_ID_POINTENTRY); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUETIME, + idx->time / mux->time_scale); + trackpos_master = gst_ebml_write_master_start (ebml, + GST_MATROSKA_ID_CUETRACKPOSITIONS); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUETRACK, idx->track); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUECLUSTERPOSITION, + idx->pos - mux->segment_master); + gst_ebml_write_master_finish (ebml, trackpos_master); + gst_ebml_write_master_finish (ebml, pointentry_master); + } + + gst_ebml_write_master_finish (ebml, master); + gst_ebml_write_flush_cache (ebml, FALSE, GST_CLOCK_TIME_NONE); + } + + /* tags */ + tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux)); + + if (tags != NULL && !gst_tag_list_is_empty (tags)) { + guint64 master_tags, master_tag; + + GST_DEBUG ("Writing tags"); + + /* TODO: maybe limit via the TARGETS id by looking at the source pad */ + mux->tags_pos = ebml->pos; + master_tags = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TAGS); + master_tag = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TAG); + gst_tag_list_foreach (tags, gst_matroska_mux_write_simple_tag, ebml); + gst_ebml_write_master_finish (ebml, master_tag); + gst_ebml_write_master_finish (ebml, master_tags); + } + + /* update seekhead. We know that: + * - a seekhead contains 4 entries. + * - order of entries is as above. + * - a seekhead has a 4-byte header + 8-byte length + * - each entry is 2-byte master, 2-byte ID pointer, + * 2-byte length pointer, all 8/1-byte length, 4- + * byte ID and 8-byte length pointer, where the + * length pointer starts at 20. + * - all entries are local to the segment (so pos - segment_master). + * - so each entry is at 12 + 20 + num * 28. */ + gst_ebml_replace_uint (ebml, mux->seekhead_pos + 32, + mux->info_pos - mux->segment_master); + gst_ebml_replace_uint (ebml, mux->seekhead_pos + 60, + mux->tracks_pos - mux->segment_master); + if (mux->index != NULL) { + gst_ebml_replace_uint (ebml, mux->seekhead_pos + 88, + mux->cues_pos - mux->segment_master); + } else { + /* void'ify */ + guint64 my_pos = ebml->pos; + + gst_ebml_write_seek (ebml, mux->seekhead_pos + 68); + gst_ebml_write_buffer_header (ebml, GST_EBML_ID_VOID, 26); + gst_ebml_write_seek (ebml, my_pos); + } + if (tags != NULL) { + gst_ebml_replace_uint (ebml, mux->seekhead_pos + 116, + mux->tags_pos - mux->segment_master); + } else { + /* void'ify */ + guint64 my_pos = ebml->pos; + + gst_ebml_write_seek (ebml, mux->seekhead_pos + 96); + gst_ebml_write_buffer_header (ebml, GST_EBML_ID_VOID, 26); + gst_ebml_write_seek (ebml, my_pos); + } + + /* update duration */ + /* first get the overall duration */ + /* a released track may have left a duration in here */ + duration = mux->duration; + for (collected = mux->collect->data; collected; + collected = g_slist_next (collected)) { + GstMatroskaPad *collect_pad; + GstClockTime min_duration; /* observed minimum duration */ + + collect_pad = (GstMatroskaPad *) collected->data; + + GST_DEBUG_OBJECT (mux, + "Pad %" GST_PTR_FORMAT " start ts %" GST_TIME_FORMAT + " end ts %" GST_TIME_FORMAT, collect_pad, + GST_TIME_ARGS (collect_pad->start_ts), + GST_TIME_ARGS (collect_pad->end_ts)); + + if (GST_CLOCK_TIME_IS_VALID (collect_pad->start_ts) && + GST_CLOCK_TIME_IS_VALID (collect_pad->end_ts)) { + min_duration = + GST_CLOCK_DIFF (collect_pad->start_ts, collect_pad->end_ts); + if (collect_pad->duration < min_duration) + collect_pad->duration = min_duration; + GST_DEBUG_OBJECT (collect_pad, + "final track duration: %" GST_TIME_FORMAT, + GST_TIME_ARGS (collect_pad->duration)); + } + + if (GST_CLOCK_TIME_IS_VALID (collect_pad->duration) && + duration < collect_pad->duration) + duration = collect_pad->duration; + } + if (duration != 0) { + GST_DEBUG_OBJECT (mux, "final total duration: %" GST_TIME_FORMAT, + GST_TIME_ARGS (duration)); + pos = mux->ebml_write->pos; + gst_ebml_write_seek (ebml, mux->duration_pos); + gst_ebml_write_float (ebml, GST_MATROSKA_ID_DURATION, + gst_guint64_to_gdouble (duration) / + gst_guint64_to_gdouble (mux->time_scale)); + gst_ebml_write_seek (ebml, pos); + } else { + /* void'ify */ + guint64 my_pos = ebml->pos; + + gst_ebml_write_seek (ebml, mux->duration_pos); + gst_ebml_write_buffer_header (ebml, GST_EBML_ID_VOID, 8); + gst_ebml_write_seek (ebml, my_pos); + } + GST_DEBUG_OBJECT (mux, "finishing segment"); + /* finish segment - this also writes element length */ + gst_ebml_write_master_finish (ebml, mux->segment_pos); +} + + +/** + * gst_matroska_mux_best_pad: + * @mux: #GstMatroskaMux + * @popped: True if at least one buffer was popped from #GstCollectPads + * + * Find a pad with the oldest data + * (data from this pad should be written first). + * + * Returns: Selected pad. + */ +static GstMatroskaPad * +gst_matroska_mux_best_pad (GstMatroskaMux * mux, gboolean * popped) +{ + GSList *collected; + GstMatroskaPad *best = NULL; + + *popped = FALSE; + for (collected = mux->collect->data; collected; + collected = g_slist_next (collected)) { + GstMatroskaPad *collect_pad; + + collect_pad = (GstMatroskaPad *) collected->data; + /* fetch a new buffer if needed */ + if (collect_pad->buffer == NULL) { + collect_pad->buffer = gst_collect_pads_pop (mux->collect, + (GstCollectData *) collect_pad); + + if (collect_pad->buffer != NULL) { + GstClockTime time; + + *popped = TRUE; + /* convert to running time */ + time = GST_BUFFER_TIMESTAMP (collect_pad->buffer); + /* invalid should pass */ + if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) { + time = gst_segment_to_running_time (&collect_pad->collect.segment, + GST_FORMAT_TIME, time); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { + GST_DEBUG_OBJECT (mux, "clipping buffer on pad %s outside segment", + GST_PAD_NAME (collect_pad->collect.pad)); + gst_buffer_unref (collect_pad->buffer); + collect_pad->buffer = NULL; + return NULL; + } else { + GST_LOG_OBJECT (mux, "buffer ts %" GST_TIME_FORMAT " -> %" + GST_TIME_FORMAT " running time", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (collect_pad->buffer)), + GST_TIME_ARGS (time)); + collect_pad->buffer = + gst_buffer_make_metadata_writable (collect_pad->buffer); + GST_BUFFER_TIMESTAMP (collect_pad->buffer) = time; + } + } + } + } + + /* if we have a buffer check if it is better then the current best one */ + if (collect_pad->buffer != NULL) { + if (best == NULL || !GST_BUFFER_TIMESTAMP_IS_VALID (collect_pad->buffer) + || (GST_BUFFER_TIMESTAMP_IS_VALID (best->buffer) + && GST_BUFFER_TIMESTAMP (collect_pad->buffer) < + GST_BUFFER_TIMESTAMP (best->buffer))) { + best = collect_pad; + } + } + } + + return best; +} + +/** + * gst_matroska_mux_buffer_header: + * @track: Track context. + * @relative_timestamp: relative timestamp of the buffer + * @flags: Buffer flags. + * + * Create a buffer containing buffer header. + * + * Returns: New buffer. + */ +static GstBuffer * +gst_matroska_mux_create_buffer_header (GstMatroskaTrackContext * track, + gint16 relative_timestamp, int flags) +{ + GstBuffer *hdr; + + hdr = gst_buffer_new_and_alloc (4); + /* track num - FIXME: what if num >= 0x80 (unlikely)? */ + GST_BUFFER_DATA (hdr)[0] = track->num | 0x80; + /* time relative to clustertime */ + GST_WRITE_UINT16_BE (GST_BUFFER_DATA (hdr) + 1, relative_timestamp); + + /* flags */ + GST_BUFFER_DATA (hdr)[3] = flags; + + return hdr; +} + +#define DIRAC_PARSE_CODE_SEQUENCE_HEADER 0x00 +#define DIRAC_PARSE_CODE_END_OF_SEQUENCE 0x10 +#define DIRAC_PARSE_CODE_IS_PICTURE(x) ((x & 0x08) != 0) + +static GstBuffer * +gst_matroska_mux_handle_dirac_packet (GstMatroskaMux * mux, + GstMatroskaPad * collect_pad, GstBuffer * buf) +{ + GstMatroskaTrackVideoContext *ctx = + (GstMatroskaTrackVideoContext *) collect_pad->track; + const guint8 *data = GST_BUFFER_DATA (buf); + guint size = GST_BUFFER_SIZE (buf); + guint8 parse_code; + guint32 next_parse_offset; + GstBuffer *ret = NULL; + gboolean is_muxing_unit = FALSE; + + if (GST_BUFFER_SIZE (buf) < 13) { + gst_buffer_unref (buf); + return ret; + } + + /* Check if this buffer contains a picture or end-of-sequence packet */ + while (size >= 13) { + if (GST_READ_UINT32_BE (data) != 0x42424344 /* 'BBCD' */ ) { + gst_buffer_unref (buf); + return ret; + } + + parse_code = GST_READ_UINT8 (data + 4); + if (parse_code == DIRAC_PARSE_CODE_SEQUENCE_HEADER) { + if (ctx->dirac_unit) { + gst_buffer_unref (ctx->dirac_unit); + ctx->dirac_unit = NULL; + } + } else if (DIRAC_PARSE_CODE_IS_PICTURE (parse_code) || + parse_code == DIRAC_PARSE_CODE_END_OF_SEQUENCE) { + is_muxing_unit = TRUE; + break; + } + + next_parse_offset = GST_READ_UINT32_BE (data + 5); + + if (G_UNLIKELY (next_parse_offset == 0 || next_parse_offset > size)) + break; + + data += next_parse_offset; + size -= next_parse_offset; + } + + if (ctx->dirac_unit) + ctx->dirac_unit = gst_buffer_join (ctx->dirac_unit, gst_buffer_ref (buf)); + else + ctx->dirac_unit = gst_buffer_ref (buf); + + if (is_muxing_unit) { + ret = gst_buffer_make_metadata_writable (ctx->dirac_unit); + ctx->dirac_unit = NULL; + gst_buffer_copy_metadata (ret, buf, + GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS | + GST_BUFFER_COPY_CAPS); + gst_buffer_unref (buf); + } else { + gst_buffer_unref (buf); + ret = NULL; + } + + return ret; +} + +static void +gst_matroska_mux_stop_streamheader (GstMatroskaMux * mux) +{ + GstCaps *caps; + GstStructure *s; + GValue streamheader = { 0 }; + GValue bufval = { 0 }; + GstBuffer *streamheader_buffer; + GstEbmlWrite *ebml = mux->ebml_write; + + streamheader_buffer = gst_ebml_stop_streamheader (ebml); + if (!strcmp (mux->doctype, GST_MATROSKA_DOCTYPE_WEBM)) { + caps = gst_caps_new_simple ("video/webm", NULL); + } else { + caps = gst_caps_new_simple ("video/x-matroska", NULL); + } + s = gst_caps_get_structure (caps, 0); + g_value_init (&streamheader, GST_TYPE_ARRAY); + g_value_init (&bufval, GST_TYPE_BUFFER); + GST_BUFFER_FLAG_SET (streamheader_buffer, GST_BUFFER_FLAG_IN_CAPS); + gst_value_set_buffer (&bufval, streamheader_buffer); + gst_value_array_append_value (&streamheader, &bufval); + g_value_unset (&bufval); + gst_structure_set_value (s, "streamheader", &streamheader); + g_value_unset (&streamheader); + gst_caps_replace (&ebml->caps, caps); + gst_buffer_unref (streamheader_buffer); + gst_caps_unref (caps); +} + +/** + * gst_matroska_mux_write_data: + * @mux: #GstMatroskaMux + * @collect_pad: #GstMatroskaPad with the data + * + * Write collected data (called from gst_matroska_mux_collected). + * + * Returns: Result of the gst_pad_push issued to write the data. + */ +static GstFlowReturn +gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad) +{ + GstEbmlWrite *ebml = mux->ebml_write; + GstBuffer *buf, *hdr; + guint64 blockgroup; + gboolean write_duration; + gint16 relative_timestamp; + gint64 relative_timestamp64; + guint64 block_duration; + gboolean is_video_keyframe = FALSE; + GstMatroskamuxPad *pad; + + /* write data */ + buf = collect_pad->buffer; + collect_pad->buffer = NULL; + pad = GST_MATROSKAMUX_PAD_CAST (collect_pad->collect.pad); + + /* vorbis/theora headers are retrieved from caps and put in CodecPrivate */ + if (collect_pad->track->xiph_headers_to_skip > 0) { + GST_LOG_OBJECT (collect_pad->collect.pad, "dropping streamheader buffer"); + gst_buffer_unref (buf); + --collect_pad->track->xiph_headers_to_skip; + return GST_FLOW_OK; + } + + /* for dirac we have to queue up everything up to a picture unit */ + if (collect_pad->track->codec_id != NULL && + strcmp (collect_pad->track->codec_id, + GST_MATROSKA_CODEC_ID_VIDEO_DIRAC) == 0) { + buf = gst_matroska_mux_handle_dirac_packet (mux, collect_pad, buf); + if (!buf) + return GST_FLOW_OK; + } + + /* hm, invalid timestamp (due to --to be fixed--- element upstream); + * this would wreak havoc with time stored in matroska file */ + /* TODO: maybe calculate a timestamp by using the previous timestamp + * and default duration */ + if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + GST_WARNING_OBJECT (collect_pad->collect.pad, + "Invalid buffer timestamp; dropping buffer"); + gst_buffer_unref (buf); + return GST_FLOW_OK; + } + + /* set the timestamp for outgoing buffers */ + ebml->timestamp = GST_BUFFER_TIMESTAMP (buf); + + if (collect_pad->track->type == GST_MATROSKA_TRACK_TYPE_VIDEO && + !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT)) { + GST_LOG_OBJECT (mux, "have video keyframe, ts=%" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + is_video_keyframe = TRUE; + } + + if (mux->cluster) { + /* start a new cluster at every keyframe, at every GstForceKeyUnit event, + * or when we may be reaching the limit of the relative timestamp */ + if (mux->cluster_time + + mux->max_cluster_duration < GST_BUFFER_TIMESTAMP (buf) + || is_video_keyframe || mux->force_key_unit_event) { + if (!mux->streamable) + gst_ebml_write_master_finish (ebml, mux->cluster); + + /* Forward the GstForceKeyUnit event after finishing the cluster */ + if (mux->force_key_unit_event) { + gst_pad_push_event (mux->srcpad, mux->force_key_unit_event); + mux->force_key_unit_event = NULL; + } + + mux->prev_cluster_size = ebml->pos - mux->cluster_pos; + mux->cluster_pos = ebml->pos; + gst_ebml_write_set_cache (ebml, 0x20); + mux->cluster = + gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE, + gst_util_uint64_scale (GST_BUFFER_TIMESTAMP (buf), 1, + mux->time_scale)); + GST_LOG_OBJECT (mux, "cluster timestamp %" G_GUINT64_FORMAT, + gst_util_uint64_scale (GST_BUFFER_TIMESTAMP (buf), 1, + mux->time_scale)); + gst_ebml_write_flush_cache (ebml, TRUE, GST_BUFFER_TIMESTAMP (buf)); + mux->cluster_time = GST_BUFFER_TIMESTAMP (buf); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_PREVSIZE, + mux->prev_cluster_size); + } + } else { + /* first cluster */ + + mux->cluster_pos = ebml->pos; + gst_ebml_write_set_cache (ebml, 0x20); + mux->cluster = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE, + gst_util_uint64_scale (GST_BUFFER_TIMESTAMP (buf), 1, mux->time_scale)); + gst_ebml_write_flush_cache (ebml, TRUE, GST_BUFFER_TIMESTAMP (buf)); + mux->cluster_time = GST_BUFFER_TIMESTAMP (buf); + } + + /* update duration of this track */ + if (GST_BUFFER_DURATION_IS_VALID (buf)) + collect_pad->duration += GST_BUFFER_DURATION (buf); + + /* We currently write index entries for all video tracks or for the audio + * track in a single-track audio file. This could be improved by keeping the + * index only for the *first* video track. */ + + /* TODO: index is useful for every track, should contain the number of + * the block in the cluster which contains the timestamp, should also work + * for files with multiple audio tracks. + */ + if (!mux->streamable && + (is_video_keyframe || + ((collect_pad->track->type == GST_MATROSKA_TRACK_TYPE_AUDIO) && + (mux->num_streams == 1)))) { + gint last_idx = -1; + + if (mux->min_index_interval != 0) { + for (last_idx = mux->num_indexes - 1; last_idx >= 0; last_idx--) { + if (mux->index[last_idx].track == collect_pad->track->num) + break; + } + } + + if (last_idx < 0 || mux->min_index_interval == 0 || + (GST_CLOCK_DIFF (mux->index[last_idx].time, GST_BUFFER_TIMESTAMP (buf)) + >= mux->min_index_interval)) { + GstMatroskaIndex *idx; + + if (mux->num_indexes % 32 == 0) { + mux->index = g_renew (GstMatroskaIndex, mux->index, + mux->num_indexes + 32); + } + idx = &mux->index[mux->num_indexes++]; + + idx->pos = mux->cluster_pos; + idx->time = GST_BUFFER_TIMESTAMP (buf); + idx->track = collect_pad->track->num; + } + } + + /* Check if the duration differs from the default duration. */ + write_duration = FALSE; + block_duration = 0; + if (pad->frame_duration && GST_BUFFER_DURATION_IS_VALID (buf)) { + block_duration = gst_util_uint64_scale (GST_BUFFER_DURATION (buf), + 1, mux->time_scale); + + /* small difference should be ok. */ + if (block_duration > collect_pad->default_duration_scaled + 1 || + block_duration < collect_pad->default_duration_scaled - 1) { + write_duration = TRUE; + } + } + + /* write the block, for doctype v2 use SimpleBlock if possible + * one slice (*breath*). + * FIXME: Need to do correct lacing! */ + relative_timestamp64 = GST_BUFFER_TIMESTAMP (buf) - mux->cluster_time; + if (relative_timestamp64 >= 0) { + /* round the timestamp */ + relative_timestamp64 += gst_util_uint64_scale (mux->time_scale, 1, 2); + } else { + /* round the timestamp */ + relative_timestamp64 -= gst_util_uint64_scale (mux->time_scale, 1, 2); + } + relative_timestamp = gst_util_uint64_scale (relative_timestamp64, 1, + mux->time_scale); + if (mux->doctype_version > 1 && !write_duration) { + int flags = + GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT) ? 0 : 0x80; + + hdr = + gst_matroska_mux_create_buffer_header (collect_pad->track, + relative_timestamp, flags); + gst_ebml_write_set_cache (ebml, 0x40); + gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_SIMPLEBLOCK, + GST_BUFFER_SIZE (buf) + GST_BUFFER_SIZE (hdr)); + gst_ebml_write_buffer (ebml, hdr); + gst_ebml_write_flush_cache (ebml, FALSE, GST_BUFFER_TIMESTAMP (buf)); + gst_ebml_write_buffer (ebml, buf); + + return gst_ebml_last_write_result (ebml); + } else { + gst_ebml_write_set_cache (ebml, GST_BUFFER_SIZE (buf) * 2); + /* write and call order slightly unnatural, + * but avoids seek and minizes pushing */ + blockgroup = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_BLOCKGROUP); + hdr = + gst_matroska_mux_create_buffer_header (collect_pad->track, + relative_timestamp, 0); + if (write_duration) + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_BLOCKDURATION, block_duration); + gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_BLOCK, + GST_BUFFER_SIZE (buf) + GST_BUFFER_SIZE (hdr)); + gst_ebml_write_buffer (ebml, hdr); + gst_ebml_write_master_finish_full (ebml, blockgroup, GST_BUFFER_SIZE (buf)); + gst_ebml_write_flush_cache (ebml, FALSE, GST_BUFFER_TIMESTAMP (buf)); + gst_ebml_write_buffer (ebml, buf); + + return gst_ebml_last_write_result (ebml); + } +} + + +/** + * gst_matroska_mux_collected: + * @pads: #GstCollectPads + * @uuser_data: #GstMatroskaMux + * + * Collectpads callback. + * + * Returns: #GstFlowReturn + */ +static GstFlowReturn +gst_matroska_mux_collected (GstCollectPads * pads, gpointer user_data) +{ + GstMatroskaMux *mux = GST_MATROSKA_MUX (user_data); + GstEbmlWrite *ebml = mux->ebml_write; + GstMatroskaPad *best; + gboolean popped; + GstFlowReturn ret = GST_FLOW_OK; + + GST_DEBUG_OBJECT (mux, "Collected pads"); + + /* start with a header */ + if (mux->state == GST_MATROSKA_MUX_STATE_START) { + if (mux->collect->data == NULL) { + GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), + ("No input streams configured")); + return GST_FLOW_ERROR; + } + mux->state = GST_MATROSKA_MUX_STATE_HEADER; + gst_ebml_start_streamheader (ebml); + gst_matroska_mux_start (mux); + gst_matroska_mux_stop_streamheader (mux); + mux->state = GST_MATROSKA_MUX_STATE_DATA; + } + + do { + /* which stream to write from? */ + best = gst_matroska_mux_best_pad (mux, &popped); + + /* if there is no best pad, we have reached EOS */ + if (best == NULL) { + /* buffer popped, but none returned means it was clipped */ + if (popped) + break; + GST_DEBUG_OBJECT (mux, "No best pad finishing..."); + if (!mux->streamable) { + gst_matroska_mux_finish (mux); + } else { + GST_DEBUG_OBJECT (mux, "... but streamable, nothing to finish"); + } + gst_pad_push_event (mux->srcpad, gst_event_new_eos ()); + ret = GST_FLOW_UNEXPECTED; + break; + } + GST_DEBUG_OBJECT (best->collect.pad, "best pad - buffer ts %" + GST_TIME_FORMAT " dur %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (best->buffer)), + GST_TIME_ARGS (GST_BUFFER_DURATION (best->buffer))); + + /* make note of first and last encountered timestamps, so we can calculate + * the actual duration later when we send an updated header on eos */ + if (GST_BUFFER_TIMESTAMP_IS_VALID (best->buffer)) { + GstClockTime start_ts = GST_BUFFER_TIMESTAMP (best->buffer); + GstClockTime end_ts = start_ts; + + if (GST_BUFFER_DURATION_IS_VALID (best->buffer)) + end_ts += GST_BUFFER_DURATION (best->buffer); + else if (best->track->default_duration) + end_ts += best->track->default_duration; + + if (!GST_CLOCK_TIME_IS_VALID (best->end_ts) || end_ts > best->end_ts) + best->end_ts = end_ts; + + if (G_UNLIKELY (best->start_ts == GST_CLOCK_TIME_NONE || + start_ts < best->start_ts)) + best->start_ts = start_ts; + } + + /* write one buffer */ + ret = gst_matroska_mux_write_data (mux, best); + } while (ret == GST_FLOW_OK && !popped); + + return ret; +} + + +/** + * gst_matroska_mux_change_state: + * @element: #GstMatroskaMux + * @transition: State change transition. + * + * Change the muxer state. + * + * Returns: #GstStateChangeReturn + */ +static GstStateChangeReturn +gst_matroska_mux_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstMatroskaMux *mux = GST_MATROSKA_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_matroska_mux_reset (GST_ELEMENT (mux)); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +static void +gst_matroska_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstMatroskaMux *mux; + + g_return_if_fail (GST_IS_MATROSKA_MUX (object)); + mux = GST_MATROSKA_MUX (object); + + switch (prop_id) { + case ARG_WRITING_APP: + if (!g_value_get_string (value)) { + GST_WARNING_OBJECT (mux, "writing-app property can not be NULL"); + break; + } + g_free (mux->writing_app); + mux->writing_app = g_value_dup_string (value); + break; + case ARG_DOCTYPE_VERSION: + mux->doctype_version = g_value_get_int (value); + break; + case ARG_MIN_INDEX_INTERVAL: + mux->min_index_interval = g_value_get_int64 (value); + break; + case ARG_STREAMABLE: + mux->streamable = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_matroska_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstMatroskaMux *mux; + + g_return_if_fail (GST_IS_MATROSKA_MUX (object)); + mux = GST_MATROSKA_MUX (object); + + switch (prop_id) { + case ARG_WRITING_APP: + g_value_set_string (value, mux->writing_app); + break; + case ARG_DOCTYPE_VERSION: + g_value_set_int (value, mux->doctype_version); + break; + case ARG_MIN_INDEX_INTERVAL: + g_value_set_int64 (value, mux->min_index_interval); + break; + case ARG_STREAMABLE: + g_value_set_boolean (value, mux->streamable); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/matroska/matroska-mux.h b/gst/matroska/matroska-mux.h new file mode 100644 index 0000000..73bdc09 --- /dev/null +++ b/gst/matroska/matroska-mux.h @@ -0,0 +1,142 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * (c) 2005 Michal Benes + * + * matroska-mux.h: matroska file/stream muxer object types + * + * 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_MATROSKA_MUX_H__ +#define __GST_MATROSKA_MUX_H__ + +#include +#include + +#include "ebml-write.h" +#include "matroska-ids.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MATROSKA_MUX \ + (gst_matroska_mux_get_type ()) +#define GST_MATROSKA_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MATROSKA_MUX, GstMatroskaMux)) +#define GST_MATROSKA_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_MUX, GstMatroskaMuxClass)) +#define GST_IS_MATROSKA_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_MUX)) +#define GST_IS_MATROSKA_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_MUX)) + +typedef enum { + GST_MATROSKA_MUX_STATE_START, + GST_MATROSKA_MUX_STATE_HEADER, + GST_MATROSKA_MUX_STATE_DATA, +} GstMatroskaMuxState; + +typedef struct _GstMatroskaMetaSeekIndex { + guint32 id; + guint64 pos; +} GstMatroskaMetaSeekIndex; + +/* all information needed for one matroska stream */ +typedef struct +{ + GstCollectData collect; /* we extend the CollectData */ + GstMatroskaTrackContext *track; + + GstBuffer *buffer; /* the queued buffer for this pad */ + + guint64 duration; + GstClockTime start_ts; + GstClockTime end_ts; /* last timestamp + (if available) duration */ + guint64 default_duration_scaled; +} +GstMatroskaPad; + + +typedef struct _GstMatroskaMux { + GstElement element; + + /* < private > */ + + /* pads */ + GstPad *srcpad; + GstCollectPads *collect; + GstPadEventFunction collect_event; + GstEbmlWrite *ebml_write; + + guint num_streams, + num_v_streams, num_a_streams, num_t_streams; + + /* Application name (for the writing application header element) */ + gchar *writing_app; + + /* EBML DocType. */ + const gchar *doctype; + + /* DocType version. */ + guint doctype_version; + + /* state */ + GstMatroskaMuxState state; + + /* a cue (index) table */ + GstMatroskaIndex *index; + guint num_indexes; + GstClockTimeDiff min_index_interval; + gboolean streamable; + + /* timescale in the file */ + guint64 time_scale; + /* based on timescale, limit of nanoseconds you can have in a cluster */ + guint64 max_cluster_duration; + + /* length, position (time, ns) */ + guint64 duration; + + /* byte-positions of master-elements (for replacing contents) */ + guint64 segment_pos, + seekhead_pos, + cues_pos, + tags_pos, + info_pos, + tracks_pos, + duration_pos, + meta_pos; + guint64 segment_master; + + /* current cluster */ + guint64 cluster, + cluster_time, + cluster_pos, + prev_cluster_size; + + /* GstForceKeyUnit event */ + GstEvent *force_key_unit_event; + +} GstMatroskaMux; + +typedef struct _GstMatroskaMuxClass { + GstElementClass parent; +} GstMatroskaMuxClass; + +GType gst_matroska_mux_get_type (void); + +G_END_DECLS + +#endif /* __GST_MATROSKA_MUX_H__ */ diff --git a/gst/matroska/matroska-parse.c b/gst/matroska/matroska-parse.c new file mode 100644 index 0000000..6fd1f79 --- /dev/null +++ b/gst/matroska/matroska-parse.c @@ -0,0 +1,3242 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * (c) 2006 Tim-Philipp Müller + * (c) 2008 Sebastian Dröge + * (c) 2011 Debarshi Ray + * + * matroska-parse.c: matroska file/stream parser + * + * 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. + */ + +/* TODO: check CRC32 if present + * TODO: there can be a segment after the first segment. Handle like + * chained oggs. Fixes #334082 + * TODO: Test samples: http://www.matroska.org/samples/matrix/index.html + * http://samples.mplayerhq.hu/Matroska/ + * TODO: check if parseing is done correct for all codecs according to spec + * TODO: seeking with incomplete or without CUE + */ + +/** + * SECTION:element-matroskaparse + * + * matroskaparse parsees a Matroska file into the different contained streams. + * + * + * Example launch line + * |[ + * gst-launch -v filesrc location=/path/to/mkv ! matroskaparse ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink + * ]| This pipeline parsees a Matroska file and outputs the contained Vorbis audio. + * + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +/* For AVI compatibility mode + and for fourcc stuff */ +#include +#include +#include + +#include + +#include + +#include "matroska-parse.h" +#include "matroska-ids.h" + +GST_DEBUG_CATEGORY_STATIC (matroskaparse_debug); +#define GST_CAT_DEFAULT matroskaparse_debug + +#define DEBUG_ELEMENT_START(parse, ebml, element) \ + GST_DEBUG_OBJECT (parse, "Parsing " element " element at offset %" \ + G_GUINT64_FORMAT, gst_ebml_read_get_pos (ebml)) + +#define DEBUG_ELEMENT_STOP(parse, ebml, element, ret) \ + GST_DEBUG_OBJECT (parse, "Parsing " element " element " \ + " finished with '%s'", gst_flow_get_name (ret)) + +enum +{ + ARG_0, + ARG_METADATA, + ARG_STREAMINFO +}; + +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska; video/webm") + ); + +static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska; video/webm") + ); + +static GstFlowReturn gst_matroska_parse_parse_id (GstMatroskaParse * parse, + guint32 id, guint64 length, guint needed); + +/* element functions */ +//static void gst_matroska_parse_loop (GstPad * pad); + +static gboolean gst_matroska_parse_element_send_event (GstElement * element, + GstEvent * event); +static gboolean gst_matroska_parse_element_query (GstElement * element, + GstQuery * query); + +/* pad functions */ +static gboolean gst_matroska_parse_handle_seek_event (GstMatroskaParse * parse, + GstPad * pad, GstEvent * event); +static gboolean gst_matroska_parse_handle_src_event (GstPad * pad, + GstEvent * event); +static const GstQueryType *gst_matroska_parse_get_src_query_types (GstPad * + pad); +static gboolean gst_matroska_parse_handle_src_query (GstPad * pad, + GstQuery * query); + +static gboolean gst_matroska_parse_handle_sink_event (GstPad * pad, + GstEvent * event); +static GstFlowReturn gst_matroska_parse_chain (GstPad * pad, + GstBuffer * buffer); + +static GstStateChangeReturn +gst_matroska_parse_change_state (GstElement * element, + GstStateChange transition); +static void +gst_matroska_parse_set_index (GstElement * element, GstIndex * index); +static GstIndex *gst_matroska_parse_get_index (GstElement * element); + +/* stream methods */ +static void gst_matroska_parse_reset (GstElement * element); +static gboolean perform_seek_to_offset (GstMatroskaParse * parse, + guint64 offset); + +GType gst_matroska_parse_get_type (void); +GST_BOILERPLATE (GstMatroskaParse, gst_matroska_parse, GstElement, + GST_TYPE_ELEMENT); + +static void +gst_matroska_parse_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &src_templ); + gst_element_class_add_static_pad_template (element_class, &sink_templ); + + gst_element_class_set_details_simple (element_class, "Matroska parser", + "Codec/Parser", + "Parses Matroska/WebM streams into video/audio/subtitles", + "GStreamer maintainers "); +} + +static void +gst_matroska_parse_finalize (GObject * object) +{ + GstMatroskaParse *parse = GST_MATROSKA_PARSE (object); + + if (parse->common.src) { + g_ptr_array_free (parse->common.src, TRUE); + parse->common.src = NULL; + } + + if (parse->common.global_tags) { + gst_tag_list_free (parse->common.global_tags); + parse->common.global_tags = NULL; + } + + g_object_unref (parse->common.adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_matroska_parse_class_init (GstMatroskaParseClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + + GST_DEBUG_CATEGORY_INIT (matroskaparse_debug, "matroskaparse", 0, + "Matroska parser"); + + gobject_class->finalize = gst_matroska_parse_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_matroska_parse_change_state); + gstelement_class->send_event = + GST_DEBUG_FUNCPTR (gst_matroska_parse_element_send_event); + gstelement_class->query = + GST_DEBUG_FUNCPTR (gst_matroska_parse_element_query); + + gstelement_class->set_index = + GST_DEBUG_FUNCPTR (gst_matroska_parse_set_index); + gstelement_class->get_index = + GST_DEBUG_FUNCPTR (gst_matroska_parse_get_index); +} + +static void +gst_matroska_parse_init (GstMatroskaParse * parse, + GstMatroskaParseClass * klass) +{ + parse->common.sinkpad = gst_pad_new_from_static_template (&sink_templ, + "sink"); + gst_pad_set_chain_function (parse->common.sinkpad, + GST_DEBUG_FUNCPTR (gst_matroska_parse_chain)); + gst_pad_set_event_function (parse->common.sinkpad, + GST_DEBUG_FUNCPTR (gst_matroska_parse_handle_sink_event)); + gst_element_add_pad (GST_ELEMENT (parse), parse->common.sinkpad); + + parse->srcpad = gst_pad_new_from_static_template (&src_templ, "src"); + gst_pad_set_event_function (parse->srcpad, + GST_DEBUG_FUNCPTR (gst_matroska_parse_handle_src_event)); + gst_pad_set_query_type_function (parse->srcpad, + GST_DEBUG_FUNCPTR (gst_matroska_parse_get_src_query_types)); + gst_pad_set_query_function (parse->srcpad, + GST_DEBUG_FUNCPTR (gst_matroska_parse_handle_src_query)); + gst_pad_use_fixed_caps (parse->srcpad); + + gst_element_add_pad (GST_ELEMENT (parse), parse->srcpad); + + /* initial stream no. */ + parse->common.src = NULL; + + parse->common.writing_app = NULL; + parse->common.muxing_app = NULL; + parse->common.index = NULL; + parse->common.global_tags = NULL; + + parse->common.adapter = gst_adapter_new (); + + /* finish off */ + gst_matroska_parse_reset (GST_ELEMENT (parse)); +} + +static void +gst_matroska_track_free (GstMatroskaTrackContext * track) +{ + g_free (track->codec_id); + g_free (track->codec_name); + g_free (track->name); + g_free (track->language); + g_free (track->codec_priv); + g_free (track->codec_state); + + if (track->encodings != NULL) { + int i; + + for (i = 0; i < track->encodings->len; ++i) { + GstMatroskaTrackEncoding *enc = &g_array_index (track->encodings, + GstMatroskaTrackEncoding, + i); + + g_free (enc->comp_settings); + } + g_array_free (track->encodings, TRUE); + } + + if (track->pending_tags) + gst_tag_list_free (track->pending_tags); + + if (track->index_table) + g_array_free (track->index_table, TRUE); + + g_free (track); +} + +static void +gst_matroska_parse_free_parsed_el (gpointer mem, gpointer user_data) +{ + g_slice_free (guint64, mem); +} + +static void +gst_matroska_parse_reset (GstElement * element) +{ + GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); + guint i; + + GST_DEBUG_OBJECT (parse, "Resetting state"); + + /* reset input */ + parse->common.state = GST_MATROSKA_READ_STATE_START; + + /* clean up existing streams */ + if (parse->common.src) { + g_assert (parse->common.src->len == parse->common.num_streams); + for (i = 0; i < parse->common.src->len; i++) { + GstMatroskaTrackContext *context = g_ptr_array_index (parse->common.src, + i); + + gst_caps_replace (&context->caps, NULL); + gst_matroska_track_free (context); + } + g_ptr_array_free (parse->common.src, TRUE); + } + parse->common.src = g_ptr_array_new (); + + parse->common.num_streams = 0; + parse->num_a_streams = 0; + parse->num_t_streams = 0; + parse->num_v_streams = 0; + + /* reset media info */ + g_free (parse->common.writing_app); + parse->common.writing_app = NULL; + g_free (parse->common.muxing_app); + parse->common.muxing_app = NULL; + + /* reset indexes */ + if (parse->common.index) { + g_array_free (parse->common.index, TRUE); + parse->common.index = NULL; + } + + /* reset timers */ + parse->clock = NULL; + parse->common.time_scale = 1000000; + parse->common.created = G_MININT64; + + parse->common.index_parsed = FALSE; + parse->tracks_parsed = FALSE; + parse->common.segmentinfo_parsed = FALSE; + parse->common.attachments_parsed = FALSE; + + g_list_foreach (parse->common.tags_parsed, + (GFunc) gst_matroska_parse_free_parsed_el, NULL); + g_list_free (parse->common.tags_parsed); + parse->common.tags_parsed = NULL; + + g_list_foreach (parse->seek_parsed, + (GFunc) gst_matroska_parse_free_parsed_el, NULL); + g_list_free (parse->seek_parsed); + parse->seek_parsed = NULL; + + gst_segment_init (&parse->common.segment, GST_FORMAT_TIME); + parse->last_stop_end = GST_CLOCK_TIME_NONE; + parse->seek_block = 0; + + parse->common.offset = 0; + parse->cluster_time = GST_CLOCK_TIME_NONE; + parse->cluster_offset = 0; + parse->next_cluster_offset = 0; + parse->index_offset = 0; + parse->seekable = FALSE; + parse->need_newsegment = FALSE; + parse->building_index = FALSE; + if (parse->seek_event) { + gst_event_unref (parse->seek_event); + parse->seek_event = NULL; + } + + parse->seek_index = NULL; + parse->seek_entry = 0; + + if (parse->close_segment) { + gst_event_unref (parse->close_segment); + parse->close_segment = NULL; + } + + if (parse->new_segment) { + gst_event_unref (parse->new_segment); + parse->new_segment = NULL; + } + + if (parse->common.element_index) { + gst_object_unref (parse->common.element_index); + parse->common.element_index = NULL; + } + parse->common.element_index_writer_id = -1; + + if (parse->common.global_tags) { + gst_tag_list_free (parse->common.global_tags); + } + parse->common.global_tags = gst_tag_list_new (); + + if (parse->common.cached_buffer) { + gst_buffer_unref (parse->common.cached_buffer); + parse->common.cached_buffer = NULL; + } + + if (parse->streamheader != NULL) { + gst_buffer_unref (parse->streamheader); + parse->streamheader = NULL; + } +} + +static GstFlowReturn +gst_matroska_parse_add_stream (GstMatroskaParse * parse, GstEbmlRead * ebml) +{ + GstMatroskaTrackContext *context; + GstFlowReturn ret; + guint32 id; + + DEBUG_ELEMENT_START (parse, ebml, "TrackEntry"); + + /* start with the master */ + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (parse, ebml, "TrackEntry", ret); + return ret; + } + + /* allocate generic... if we know the type, we'll g_renew() + * with the precise type */ + context = g_new0 (GstMatroskaTrackContext, 1); + g_ptr_array_add (parse->common.src, context); + context->index = parse->common.num_streams; + context->index_writer_id = -1; + context->type = 0; /* no type yet */ + context->default_duration = 0; + context->pos = 0; + context->set_discont = TRUE; + context->timecodescale = 1.0; + context->flags = + GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT | + GST_MATROSKA_TRACK_LACING; + context->last_flow = GST_FLOW_OK; + context->to_offset = G_MAXINT64; + context->alignment = 1; + parse->common.num_streams++; + g_assert (parse->common.src->len == parse->common.num_streams); + + GST_DEBUG_OBJECT (parse, "Stream number %d", context->index); + + /* try reading the trackentry headers */ + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* track number (unique stream ID) */ + case GST_MATROSKA_ID_TRACKNUMBER:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_ERROR_OBJECT (parse, "Invalid TrackNumber 0"); + ret = GST_FLOW_ERROR; + break; + } else if (!gst_matroska_read_common_tracknumber_unique (&parse->common, + num)) { + GST_ERROR_OBJECT (parse, "TrackNumber %" G_GUINT64_FORMAT + " is not unique", num); + ret = GST_FLOW_ERROR; + break; + } + + GST_DEBUG_OBJECT (parse, "TrackNumber: %" G_GUINT64_FORMAT, num); + context->num = num; + break; + } + /* track UID (unique identifier) */ + case GST_MATROSKA_ID_TRACKUID:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_ERROR_OBJECT (parse, "Invalid TrackUID 0"); + ret = GST_FLOW_ERROR; + break; + } + + GST_DEBUG_OBJECT (parse, "TrackUID: %" G_GUINT64_FORMAT, num); + context->uid = num; + break; + } + + /* track type (video, audio, combined, subtitle, etc.) */ + case GST_MATROSKA_ID_TRACKTYPE:{ + guint64 track_type; + + if ((ret = gst_ebml_read_uint (ebml, &id, &track_type)) != GST_FLOW_OK) { + break; + } + + if (context->type != 0 && context->type != track_type) { + GST_WARNING_OBJECT (parse, + "More than one tracktype defined in a TrackEntry - skipping"); + break; + } else if (track_type < 1 || track_type > 254) { + GST_WARNING_OBJECT (parse, "Invalid TrackType %" G_GUINT64_FORMAT, + track_type); + break; + } + + GST_DEBUG_OBJECT (parse, "TrackType: %" G_GUINT64_FORMAT, track_type); + + /* ok, so we're actually going to reallocate this thing */ + switch (track_type) { + case GST_MATROSKA_TRACK_TYPE_VIDEO: + gst_matroska_track_init_video_context (&context); + break; + case GST_MATROSKA_TRACK_TYPE_AUDIO: + gst_matroska_track_init_audio_context (&context); + break; + case GST_MATROSKA_TRACK_TYPE_SUBTITLE: + gst_matroska_track_init_subtitle_context (&context); + break; + case GST_MATROSKA_TRACK_TYPE_COMPLEX: + case GST_MATROSKA_TRACK_TYPE_LOGO: + case GST_MATROSKA_TRACK_TYPE_BUTTONS: + case GST_MATROSKA_TRACK_TYPE_CONTROL: + default: + GST_WARNING_OBJECT (parse, + "Unknown or unsupported TrackType %" G_GUINT64_FORMAT, + track_type); + context->type = 0; + break; + } + g_ptr_array_index (parse->common.src, parse->common.num_streams - 1) + = context; + break; + } + + /* tracktype specific stuff for video */ + case GST_MATROSKA_ID_TRACKVIDEO:{ + GstMatroskaTrackVideoContext *videocontext; + + DEBUG_ELEMENT_START (parse, ebml, "TrackVideo"); + + if (!gst_matroska_track_init_video_context (&context)) { + GST_WARNING_OBJECT (parse, + "TrackVideo element in non-video track - ignoring track"); + ret = GST_FLOW_ERROR; + break; + } else if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + break; + } + videocontext = (GstMatroskaTrackVideoContext *) context; + g_ptr_array_index (parse->common.src, parse->common.num_streams - 1) + = context; + + while (ret == GST_FLOW_OK && + gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* Should be one level up but some broken muxers write it here. */ + case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (parse, "Invalid TrackDefaultDuration 0"); + break; + } + + GST_DEBUG_OBJECT (parse, + "TrackDefaultDuration: %" G_GUINT64_FORMAT, num); + context->default_duration = num; + break; + } + + /* video framerate */ + /* NOTE: This one is here only for backward compatibility. + * Use _TRACKDEFAULDURATION one level up. */ + case GST_MATROSKA_ID_VIDEOFRAMERATE:{ + gdouble num; + + if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num <= 0.0) { + GST_WARNING_OBJECT (parse, "Invalid TrackVideoFPS %lf", num); + break; + } + + GST_DEBUG_OBJECT (parse, "TrackVideoFrameRate: %lf", num); + if (context->default_duration == 0) + context->default_duration = + gst_gdouble_to_guint64 ((gdouble) GST_SECOND * (1.0 / num)); + videocontext->default_fps = num; + break; + } + + /* width of the size to display the video at */ + case GST_MATROSKA_ID_VIDEODISPLAYWIDTH:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (parse, "Invalid TrackVideoDisplayWidth 0"); + break; + } + + GST_DEBUG_OBJECT (parse, + "TrackVideoDisplayWidth: %" G_GUINT64_FORMAT, num); + videocontext->display_width = num; + break; + } + + /* height of the size to display the video at */ + case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (parse, "Invalid TrackVideoDisplayHeight 0"); + break; + } + + GST_DEBUG_OBJECT (parse, + "TrackVideoDisplayHeight: %" G_GUINT64_FORMAT, num); + videocontext->display_height = num; + break; + } + + /* width of the video in the file */ + case GST_MATROSKA_ID_VIDEOPIXELWIDTH:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (parse, "Invalid TrackVideoPixelWidth 0"); + break; + } + + GST_DEBUG_OBJECT (parse, + "TrackVideoPixelWidth: %" G_GUINT64_FORMAT, num); + videocontext->pixel_width = num; + break; + } + + /* height of the video in the file */ + case GST_MATROSKA_ID_VIDEOPIXELHEIGHT:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (parse, "Invalid TrackVideoPixelHeight 0"); + break; + } + + GST_DEBUG_OBJECT (parse, + "TrackVideoPixelHeight: %" G_GUINT64_FORMAT, num); + videocontext->pixel_height = num; + break; + } + + /* whether the video is interlaced */ + case GST_MATROSKA_ID_VIDEOFLAGINTERLACED:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; + else + context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED; + GST_DEBUG_OBJECT (parse, "TrackVideoInterlaced: %d", + (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) ? 1 : + 0); + break; + } + + /* aspect ratio behaviour */ + case GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE && + num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP && + num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) { + GST_WARNING_OBJECT (parse, + "Unknown TrackVideoAspectRatioType 0x%x", (guint) num); + break; + } + GST_DEBUG_OBJECT (parse, + "TrackVideoAspectRatioType: %" G_GUINT64_FORMAT, num); + videocontext->asr_mode = num; + break; + } + + /* colourspace (only matters for raw video) fourcc */ + case GST_MATROSKA_ID_VIDEOCOLOURSPACE:{ + guint8 *data; + guint64 datalen; + + if ((ret = + gst_ebml_read_binary (ebml, &id, &data, + &datalen)) != GST_FLOW_OK) + break; + + if (datalen != 4) { + g_free (data); + GST_WARNING_OBJECT (parse, + "Invalid TrackVideoColourSpace length %" G_GUINT64_FORMAT, + datalen); + break; + } + + memcpy (&videocontext->fourcc, data, 4); + GST_DEBUG_OBJECT (parse, + "TrackVideoColourSpace: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (videocontext->fourcc)); + g_free (data); + break; + } + + default: + GST_WARNING_OBJECT (parse, + "Unknown TrackVideo subelement 0x%x - ignoring", id); + /* fall through */ + case GST_MATROSKA_ID_VIDEOSTEREOMODE: + case GST_MATROSKA_ID_VIDEODISPLAYUNIT: + case GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM: + case GST_MATROSKA_ID_VIDEOPIXELCROPTOP: + case GST_MATROSKA_ID_VIDEOPIXELCROPLEFT: + case GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT: + case GST_MATROSKA_ID_VIDEOGAMMAVALUE: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (parse, ebml, "TrackVideo", ret); + break; + } + + /* tracktype specific stuff for audio */ + case GST_MATROSKA_ID_TRACKAUDIO:{ + GstMatroskaTrackAudioContext *audiocontext; + + DEBUG_ELEMENT_START (parse, ebml, "TrackAudio"); + + if (!gst_matroska_track_init_audio_context (&context)) { + GST_WARNING_OBJECT (parse, + "TrackAudio element in non-audio track - ignoring track"); + ret = GST_FLOW_ERROR; + break; + } + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) + break; + + audiocontext = (GstMatroskaTrackAudioContext *) context; + g_ptr_array_index (parse->common.src, parse->common.num_streams - 1) + = context; + + while (ret == GST_FLOW_OK && + gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* samplerate */ + case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ:{ + gdouble num; + + if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) + break; + + + if (num <= 0.0) { + GST_WARNING_OBJECT (parse, + "Invalid TrackAudioSamplingFrequency %lf", num); + break; + } + + GST_DEBUG_OBJECT (parse, "TrackAudioSamplingFrequency: %lf", num); + audiocontext->samplerate = num; + break; + } + + /* bitdepth */ + case GST_MATROSKA_ID_AUDIOBITDEPTH:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (parse, "Invalid TrackAudioBitDepth 0"); + break; + } + + GST_DEBUG_OBJECT (parse, "TrackAudioBitDepth: %" G_GUINT64_FORMAT, + num); + audiocontext->bitdepth = num; + break; + } + + /* channels */ + case GST_MATROSKA_ID_AUDIOCHANNELS:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (parse, "Invalid TrackAudioChannels 0"); + break; + } + + GST_DEBUG_OBJECT (parse, "TrackAudioChannels: %" G_GUINT64_FORMAT, + num); + audiocontext->channels = num; + break; + } + + default: + GST_WARNING_OBJECT (parse, + "Unknown TrackAudio subelement 0x%x - ignoring", id); + /* fall through */ + case GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS: + case GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (parse, ebml, "TrackAudio", ret); + + break; + } + + /* codec identifier */ + case GST_MATROSKA_ID_CODECID:{ + gchar *text; + + if ((ret = gst_ebml_read_ascii (ebml, &id, &text)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (parse, "CodecID: %s", GST_STR_NULL (text)); + context->codec_id = text; + break; + } + + /* codec private data */ + case GST_MATROSKA_ID_CODECPRIVATE:{ + guint8 *data; + guint64 size; + + if ((ret = + gst_ebml_read_binary (ebml, &id, &data, &size)) != GST_FLOW_OK) + break; + + context->codec_priv = data; + context->codec_priv_size = size; + + GST_DEBUG_OBJECT (parse, "CodecPrivate of size %" G_GUINT64_FORMAT, + size); + break; + } + + /* name of the codec */ + case GST_MATROSKA_ID_CODECNAME:{ + gchar *text; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (parse, "CodecName: %s", GST_STR_NULL (text)); + context->codec_name = text; + break; + } + + /* name of this track */ + case GST_MATROSKA_ID_TRACKNAME:{ + gchar *text; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + context->name = text; + GST_DEBUG_OBJECT (parse, "TrackName: %s", GST_STR_NULL (text)); + break; + } + + /* language (matters for audio/subtitles, mostly) */ + case GST_MATROSKA_ID_TRACKLANGUAGE:{ + gchar *text; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + + context->language = text; + + /* fre-ca => fre */ + if (strlen (context->language) >= 4 && context->language[3] == '-') + context->language[3] = '\0'; + + GST_DEBUG_OBJECT (parse, "TrackLanguage: %s", + GST_STR_NULL (context->language)); + break; + } + + /* whether this is actually used */ + case GST_MATROSKA_ID_TRACKFLAGENABLED:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_TRACK_ENABLED; + else + context->flags &= ~GST_MATROSKA_TRACK_ENABLED; + + GST_DEBUG_OBJECT (parse, "TrackEnabled: %d", + (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); + break; + } + + /* whether it's the default for this track type */ + case GST_MATROSKA_ID_TRACKFLAGDEFAULT:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_TRACK_DEFAULT; + else + context->flags &= ~GST_MATROSKA_TRACK_DEFAULT; + + GST_DEBUG_OBJECT (parse, "TrackDefault: %d", + (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); + break; + } + + /* whether the track must be used during playback */ + case GST_MATROSKA_ID_TRACKFLAGFORCED:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_TRACK_FORCED; + else + context->flags &= ~GST_MATROSKA_TRACK_FORCED; + + GST_DEBUG_OBJECT (parse, "TrackForced: %d", + (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); + break; + } + + /* lacing (like MPEG, where blocks don't end/start on frame + * boundaries) */ + case GST_MATROSKA_ID_TRACKFLAGLACING:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num) + context->flags |= GST_MATROSKA_TRACK_LACING; + else + context->flags &= ~GST_MATROSKA_TRACK_LACING; + + GST_DEBUG_OBJECT (parse, "TrackLacing: %d", + (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); + break; + } + + /* default length (in time) of one data block in this track */ + case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + + if (num == 0) { + GST_WARNING_OBJECT (parse, "Invalid TrackDefaultDuration 0"); + break; + } + + GST_DEBUG_OBJECT (parse, "TrackDefaultDuration: %" G_GUINT64_FORMAT, + num); + context->default_duration = num; + break; + } + + case GST_MATROSKA_ID_CONTENTENCODINGS:{ + ret = gst_matroska_read_common_read_track_encodings (&parse->common, + ebml, context); + break; + } + + case GST_MATROSKA_ID_TRACKTIMECODESCALE:{ + gdouble num; + + if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num <= 0.0) { + GST_WARNING_OBJECT (parse, "Invalid TrackTimeCodeScale %lf", num); + break; + } + + GST_DEBUG_OBJECT (parse, "TrackTimeCodeScale: %lf", num); + context->timecodescale = num; + break; + } + + default: + GST_WARNING ("Unknown TrackEntry subelement 0x%x - ignoring", id); + /* pass-through */ + + /* we ignore these because they're nothing useful (i.e. crap) + * or simply not implemented yet. */ + case GST_MATROSKA_ID_TRACKMINCACHE: + case GST_MATROSKA_ID_TRACKMAXCACHE: + case GST_MATROSKA_ID_MAXBLOCKADDITIONID: + case GST_MATROSKA_ID_TRACKATTACHMENTLINK: + case GST_MATROSKA_ID_TRACKOVERLAY: + case GST_MATROSKA_ID_TRACKTRANSLATE: + case GST_MATROSKA_ID_TRACKOFFSET: + case GST_MATROSKA_ID_CODECSETTINGS: + case GST_MATROSKA_ID_CODECINFOURL: + case GST_MATROSKA_ID_CODECDOWNLOADURL: + case GST_MATROSKA_ID_CODECDECODEALL: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (parse, ebml, "TrackEntry", ret); + + /* Decode codec private data if necessary */ + if (context->encodings && context->encodings->len > 0 && context->codec_priv + && context->codec_priv_size > 0) { + if (!gst_matroska_decode_data (context->encodings, + &context->codec_priv, &context->codec_priv_size, + GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA, TRUE)) { + GST_WARNING_OBJECT (parse, "Decoding codec private data failed"); + ret = GST_FLOW_ERROR; + } + } + + if (context->type == 0 || context->codec_id == NULL || (ret != GST_FLOW_OK + && ret != GST_FLOW_UNEXPECTED)) { + if (ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED) + GST_WARNING_OBJECT (ebml, "Unknown stream/codec in track entry header"); + + parse->common.num_streams--; + g_ptr_array_remove_index (parse->common.src, parse->common.num_streams); + g_assert (parse->common.src->len == parse->common.num_streams); + if (context) { + gst_matroska_track_free (context); + } + + return ret; + } + + if ((context->language == NULL || *context->language == '\0') && + (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO || + context->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE)) { + GST_LOG ("stream %d: language=eng (assuming default)", context->index); + context->language = g_strdup ("eng"); + } + + + /* tadaah! */ + return ret; +} + +static const GstQueryType * +gst_matroska_parse_get_src_query_types (GstPad * pad) +{ + static const GstQueryType query_types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_SEEKING, + 0 + }; + + return query_types; +} + +static gboolean +gst_matroska_parse_query (GstMatroskaParse * parse, GstPad * pad, + GstQuery * query) +{ + gboolean res = FALSE; + GstMatroskaTrackContext *context = NULL; + + if (pad) { + context = gst_pad_get_element_private (pad); + } + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + + gst_query_parse_position (query, &format, NULL); + + if (format == GST_FORMAT_TIME) { + GST_OBJECT_LOCK (parse); + if (context) + gst_query_set_position (query, GST_FORMAT_TIME, context->pos); + else + gst_query_set_position (query, GST_FORMAT_TIME, + parse->common.segment.last_stop); + GST_OBJECT_UNLOCK (parse); + } else if (format == GST_FORMAT_DEFAULT && context + && context->default_duration) { + GST_OBJECT_LOCK (parse); + gst_query_set_position (query, GST_FORMAT_DEFAULT, + context->pos / context->default_duration); + GST_OBJECT_UNLOCK (parse); + } else { + GST_DEBUG_OBJECT (parse, + "only position query in TIME and DEFAULT format is supported"); + } + + res = TRUE; + break; + } + case GST_QUERY_DURATION: + { + GstFormat format; + + gst_query_parse_duration (query, &format, NULL); + + if (format == GST_FORMAT_TIME) { + GST_OBJECT_LOCK (parse); + gst_query_set_duration (query, GST_FORMAT_TIME, + parse->common.segment.duration); + GST_OBJECT_UNLOCK (parse); + } else if (format == GST_FORMAT_DEFAULT && context + && context->default_duration) { + GST_OBJECT_LOCK (parse); + gst_query_set_duration (query, GST_FORMAT_DEFAULT, + parse->common.segment.duration / context->default_duration); + GST_OBJECT_UNLOCK (parse); + } else { + GST_DEBUG_OBJECT (parse, + "only duration query in TIME and DEFAULT format is supported"); + } + + res = TRUE; + break; + } + + case GST_QUERY_SEEKING: + { + GstFormat fmt; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if (fmt == GST_FORMAT_TIME) { + gboolean seekable; + + /* assuming we'll be able to get an index ... */ + seekable = parse->seekable; + + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, + 0, parse->common.segment.duration); + res = TRUE; + } + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + + return res; +} + +static gboolean +gst_matroska_parse_element_query (GstElement * element, GstQuery * query) +{ + return gst_matroska_parse_query (GST_MATROSKA_PARSE (element), NULL, query); +} + +static gboolean +gst_matroska_parse_handle_src_query (GstPad * pad, GstQuery * query) +{ + gboolean ret; + GstMatroskaParse *parse = GST_MATROSKA_PARSE (gst_pad_get_parent (pad)); + + ret = gst_matroska_parse_query (parse, pad, query); + + gst_object_unref (parse); + + return ret; +} + +/* returns FALSE if there are no pads to deliver event to, + * otherwise TRUE (whatever the outcome of event sending), + * takes ownership of the passed event! */ +static gboolean +gst_matroska_parse_send_event (GstMatroskaParse * parse, GstEvent * event) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (event != NULL, FALSE); + + GST_DEBUG_OBJECT (parse, "Sending event of type %s to all source pads", + GST_EVENT_TYPE_NAME (event)); + + gst_pad_push_event (parse->srcpad, event); + + return ret; +} + +static gboolean +gst_matroska_parse_element_send_event (GstElement * element, GstEvent * event) +{ + GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); + gboolean res; + + g_return_val_if_fail (event != NULL, FALSE); + + if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { + res = gst_matroska_parse_handle_seek_event (parse, NULL, event); + } else { + GST_WARNING_OBJECT (parse, "Unhandled event of type %s", + GST_EVENT_TYPE_NAME (event)); + res = FALSE; + } + gst_event_unref (event); + return res; +} + +/* searches for a cluster start from @pos, + * return GST_FLOW_OK and cluster position in @pos if found */ +static GstFlowReturn +gst_matroska_parse_search_cluster (GstMatroskaParse * parse, gint64 * pos) +{ + gint64 newpos = *pos; + gint64 orig_offset; + GstFlowReturn ret = GST_FLOW_OK; + const guint chunk = 64 * 1024; + GstBuffer *buf = NULL; + guint64 length; + guint32 id; + guint needed; + + orig_offset = parse->common.offset; + + /* read in at newpos and scan for ebml cluster id */ + while (1) { + GstByteReader reader; + gint cluster_pos; + + ret = gst_pad_pull_range (parse->common.sinkpad, newpos, chunk, &buf); + if (ret != GST_FLOW_OK) + break; + GST_DEBUG_OBJECT (parse, "read buffer size %d at offset %" G_GINT64_FORMAT, + GST_BUFFER_SIZE (buf), newpos); + gst_byte_reader_init_from_buffer (&reader, buf); + cluster_pos = 0; + resume: + cluster_pos = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff, + GST_MATROSKA_ID_CLUSTER, cluster_pos, + GST_BUFFER_SIZE (buf) - cluster_pos); + if (cluster_pos >= 0) { + newpos += cluster_pos; + GST_DEBUG_OBJECT (parse, + "found cluster ebml id at offset %" G_GINT64_FORMAT, newpos); + /* extra checks whether we really sync'ed to a cluster: + * - either it is the first and only cluster + * - either there is a cluster after this one + * - either cluster length is undefined + */ + /* ok if first cluster (there may not a subsequent one) */ + if (newpos == parse->first_cluster_offset) { + GST_DEBUG_OBJECT (parse, "cluster is first cluster -> OK"); + break; + } + parse->common.offset = newpos; + ret = gst_matroska_read_common_peek_id_length_pull (&parse->common, + GST_ELEMENT_CAST (parse), &id, &length, &needed); + if (ret != GST_FLOW_OK) + goto resume; + g_assert (id == GST_MATROSKA_ID_CLUSTER); + GST_DEBUG_OBJECT (parse, "cluster size %" G_GUINT64_FORMAT ", prefix %d", + length, needed); + /* ok if undefined length or first cluster */ + if (length == G_MAXUINT64) { + GST_DEBUG_OBJECT (parse, "cluster has undefined length -> OK"); + break; + } + /* skip cluster */ + parse->common.offset += length + needed; + ret = gst_matroska_read_common_peek_id_length_pull (&parse->common, + GST_ELEMENT_CAST (parse), &id, &length, &needed); + if (ret != GST_FLOW_OK) + goto resume; + GST_DEBUG_OBJECT (parse, "next element is %scluster", + id == GST_MATROSKA_ID_CLUSTER ? "" : "not "); + if (id == GST_MATROSKA_ID_CLUSTER) + break; + /* not ok, resume */ + goto resume; + } else { + /* partial cluster id may have been in tail of buffer */ + newpos += MAX (GST_BUFFER_SIZE (buf), 4) - 3; + gst_buffer_unref (buf); + buf = NULL; + } + } + + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + + parse->common.offset = orig_offset; + *pos = newpos; + return ret; +} + + +static gboolean +gst_matroska_parse_handle_seek_event (GstMatroskaParse * parse, + GstPad * pad, GstEvent * event) +{ + GstMatroskaIndex *entry = NULL; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + GstFormat format; + gdouble rate; + gint64 cur, stop; + GstMatroskaTrackContext *track = NULL; + GstSegment seeksegment = { 0, }; + gboolean update; + + if (pad) + track = gst_pad_get_element_private (pad); + + track = gst_matroska_read_common_get_seek_track (&parse->common, track); + + gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, + &stop_type, &stop); + + /* we can only seek on time */ + if (format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (parse, "Can only seek on TIME"); + return FALSE; + } + + /* copy segment, we need this because we still need the old + * segment when we close the current segment. */ + memcpy (&seeksegment, &parse->common.segment, sizeof (GstSegment)); + + if (event) { + GST_DEBUG_OBJECT (parse, "configuring seek"); + gst_segment_set_seek (&seeksegment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + } + + GST_DEBUG_OBJECT (parse, "New segment %" GST_SEGMENT_FORMAT, &seeksegment); + + /* check sanity before we start flushing and all that */ + GST_OBJECT_LOCK (parse); + if ((entry = gst_matroska_read_common_do_index_seek (&parse->common, track, + seeksegment.last_stop, &parse->seek_index, &parse->seek_entry)) == + NULL) { + /* pull mode without index can scan later on */ + GST_DEBUG_OBJECT (parse, "No matching seek entry in index"); + GST_OBJECT_UNLOCK (parse); + return FALSE; + } + GST_DEBUG_OBJECT (parse, "Seek position looks sane"); + GST_OBJECT_UNLOCK (parse); + + /* need to seek to cluster start to pick up cluster time */ + /* upstream takes care of flushing and all that + * ... and newsegment event handling takes care of the rest */ + return perform_seek_to_offset (parse, entry->pos + + parse->common.ebml_segment_start); +} + +/* + * Handle whether we can perform the seek event or if we have to let the chain + * function handle seeks to build the seek indexes first. + */ +static gboolean +gst_matroska_parse_handle_seek_push (GstMatroskaParse * parse, GstPad * pad, + GstEvent * event) +{ + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + GstFormat format; + gdouble rate; + gint64 cur, stop; + + gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, + &stop_type, &stop); + + /* sanity checks */ + + /* we can only seek on time */ + if (format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (parse, "Can only seek on TIME"); + return FALSE; + } + + if (stop_type != GST_SEEK_TYPE_NONE && stop != GST_CLOCK_TIME_NONE) { + GST_DEBUG_OBJECT (parse, "Seek end-time not supported in streaming mode"); + return FALSE; + } + + if (!(flags & GST_SEEK_FLAG_FLUSH)) { + GST_DEBUG_OBJECT (parse, + "Non-flushing seek not supported in streaming mode"); + return FALSE; + } + + if (flags & GST_SEEK_FLAG_SEGMENT) { + GST_DEBUG_OBJECT (parse, "Segment seek not supported in streaming mode"); + return FALSE; + } + + /* check for having parsed index already */ + if (!parse->common.index_parsed) { + gboolean building_index; + guint64 offset = 0; + + if (!parse->index_offset) { + GST_DEBUG_OBJECT (parse, "no index (location); no seek in push mode"); + return FALSE; + } + + GST_OBJECT_LOCK (parse); + /* handle the seek event in the chain function */ + parse->common.state = GST_MATROSKA_READ_STATE_SEEK; + /* no more seek can be issued until state reset to _DATA */ + + /* copy the event */ + if (parse->seek_event) + gst_event_unref (parse->seek_event); + parse->seek_event = gst_event_ref (event); + + /* set the building_index flag so that only one thread can setup the + * structures for index seeking. */ + building_index = parse->building_index; + if (!building_index) { + parse->building_index = TRUE; + offset = parse->index_offset; + } + GST_OBJECT_UNLOCK (parse); + + if (!building_index) { + /* seek to the first subindex or legacy index */ + GST_INFO_OBJECT (parse, "Seeking to Cues at %" G_GUINT64_FORMAT, offset); + return perform_seek_to_offset (parse, offset); + } + + /* well, we are handling it already */ + return TRUE; + } + + /* delegate to tweaked regular seek */ + return gst_matroska_parse_handle_seek_event (parse, pad, event); +} + +static gboolean +gst_matroska_parse_handle_src_event (GstPad * pad, GstEvent * event) +{ + GstMatroskaParse *parse = GST_MATROSKA_PARSE (gst_pad_get_parent (pad)); + gboolean res = TRUE; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + /* no seeking until we are (safely) ready */ + if (parse->common.state != GST_MATROSKA_READ_STATE_DATA) { + GST_DEBUG_OBJECT (parse, "not ready for seeking yet"); + return FALSE; + } + res = gst_matroska_parse_handle_seek_push (parse, pad, event); + gst_event_unref (event); + break; + + case GST_EVENT_QOS: + { + GstMatroskaTrackContext *context = gst_pad_get_element_private (pad); + if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) context; + gdouble proportion; + GstClockTimeDiff diff; + GstClockTime timestamp; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + GST_OBJECT_LOCK (parse); + videocontext->earliest_time = timestamp + diff; + GST_OBJECT_UNLOCK (parse); + } + res = TRUE; + gst_event_unref (event); + break; + } + + /* events we don't need to handle */ + case GST_EVENT_NAVIGATION: + gst_event_unref (event); + res = FALSE; + break; + + case GST_EVENT_LATENCY: + default: + res = gst_pad_push_event (parse->common.sinkpad, event); + break; + } + + gst_object_unref (parse); + + return res; +} + +static GstFlowReturn +gst_matroska_parse_parse_tracks (GstMatroskaParse * parse, GstEbmlRead * ebml) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint32 id; + + DEBUG_ELEMENT_START (parse, ebml, "Tracks"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (parse, ebml, "Tracks", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* one track within the "all-tracks" header */ + case GST_MATROSKA_ID_TRACKENTRY: + ret = gst_matroska_parse_add_stream (parse, ebml); + break; + + default: + ret = gst_matroska_read_common_parse_skip (&parse->common, ebml, + "Track", id); + break; + } + } + DEBUG_ELEMENT_STOP (parse, ebml, "Tracks", ret); + + parse->tracks_parsed = TRUE; + + return ret; +} + +/* + * Read signed/unsigned "EBML" numbers. + * Return: number of bytes processed. + */ + +static gint +gst_matroska_ebmlnum_uint (guint8 * data, guint size, guint64 * num) +{ + gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; + guint64 total; + + if (size <= 0) { + return -1; + } + + total = data[0]; + while (read <= 8 && !(total & len_mask)) { + read++; + len_mask >>= 1; + } + if (read > 8) + return -1; + + if ((total &= (len_mask - 1)) == len_mask - 1) + num_ffs++; + if (size < read) + return -1; + while (n < read) { + if (data[n] == 0xff) + num_ffs++; + total = (total << 8) | data[n]; + n++; + } + + if (read == num_ffs && total != 0) + *num = G_MAXUINT64; + else + *num = total; + + return read; +} + +static gint +gst_matroska_ebmlnum_sint (guint8 * data, guint size, gint64 * num) +{ + guint64 unum; + gint res; + + /* read as unsigned number first */ + if ((res = gst_matroska_ebmlnum_uint (data, size, &unum)) < 0) + return -1; + + /* make signed */ + if (unum == G_MAXUINT64) + *num = G_MAXINT64; + else + *num = unum - ((1 << ((7 * res) - 1)) - 1); + + return res; +} + +static GstFlowReturn +gst_matroska_parse_parse_blockgroup_or_simpleblock (GstMatroskaParse * parse, + GstEbmlRead * ebml, guint64 cluster_time, guint64 cluster_offset, + gboolean is_simpleblock) +{ + GstMatroskaTrackContext *stream = NULL; + GstFlowReturn ret = GST_FLOW_OK; + gboolean readblock = FALSE; + guint32 id; + guint64 block_duration = 0; + GstBuffer *buf = NULL; + gint stream_num = -1, n, laces = 0; + guint size = 0; + gint *lace_size = NULL; + gint64 time = 0; + gint flags = 0; + gint64 referenceblock = 0; + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if (!is_simpleblock) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) { + goto data_error; + } + } else { + id = GST_MATROSKA_ID_SIMPLEBLOCK; + } + + switch (id) { + /* one block inside the group. Note, block parsing is one + * of the harder things, so this code is a bit complicated. + * See http://www.matroska.org/ for documentation. */ + case GST_MATROSKA_ID_SIMPLEBLOCK: + case GST_MATROSKA_ID_BLOCK: + { + guint64 num; + guint8 *data; + + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + if ((ret = gst_ebml_read_buffer (ebml, &id, &buf)) != GST_FLOW_OK) + break; + + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* first byte(s): blocknum */ + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) + goto data_error; + data += n; + size -= n; + + /* fetch stream from num */ + stream_num = gst_matroska_read_common_stream_from_num (&parse->common, + num); + if (G_UNLIKELY (size < 3)) { + GST_WARNING_OBJECT (parse, "Invalid size %u", size); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } else if (G_UNLIKELY (stream_num < 0 || + stream_num >= parse->common.num_streams)) { + /* let's not give up on a stray invalid track number */ + GST_WARNING_OBJECT (parse, + "Invalid stream %d for track number %" G_GUINT64_FORMAT + "; ignoring block", stream_num, num); + goto done; + } + + stream = g_ptr_array_index (parse->common.src, stream_num); + + /* time (relative to cluster time) */ + time = ((gint16) GST_READ_UINT16_BE (data)); + data += 2; + size -= 2; + flags = GST_READ_UINT8 (data); + data += 1; + size -= 1; + + GST_LOG_OBJECT (parse, "time %" G_GUINT64_FORMAT ", flags %d", time, + flags); + + switch ((flags & 0x06) >> 1) { + case 0x0: /* no lacing */ + laces = 1; + lace_size = g_new (gint, 1); + lace_size[0] = size; + break; + + case 0x1: /* xiph lacing */ + case 0x2: /* fixed-size lacing */ + case 0x3: /* EBML lacing */ + if (size == 0) + goto invalid_lacing; + laces = GST_READ_UINT8 (data) + 1; + data += 1; + size -= 1; + lace_size = g_new0 (gint, laces); + + switch ((flags & 0x06) >> 1) { + case 0x1: /* xiph lacing */ { + guint temp, total = 0; + + for (n = 0; ret == GST_FLOW_OK && n < laces - 1; n++) { + while (1) { + if (size == 0) + goto invalid_lacing; + temp = GST_READ_UINT8 (data); + lace_size[n] += temp; + data += 1; + size -= 1; + if (temp != 0xff) + break; + } + total += lace_size[n]; + } + lace_size[n] = size - total; + break; + } + + case 0x2: /* fixed-size lacing */ + for (n = 0; n < laces; n++) + lace_size[n] = size / laces; + break; + + case 0x3: /* EBML lacing */ { + guint total; + + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) + goto data_error; + data += n; + size -= n; + total = lace_size[0] = num; + for (n = 1; ret == GST_FLOW_OK && n < laces - 1; n++) { + gint64 snum; + gint r; + + if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0) + goto data_error; + data += r; + size -= r; + lace_size[n] = lace_size[n - 1] + snum; + total += lace_size[n]; + } + if (n < laces) + lace_size[n] = size - total; + break; + } + } + break; + } + + if (ret != GST_FLOW_OK) + break; + + readblock = TRUE; + break; + } + + case GST_MATROSKA_ID_BLOCKDURATION:{ + ret = gst_ebml_read_uint (ebml, &id, &block_duration); + GST_DEBUG_OBJECT (parse, "BlockDuration: %" G_GUINT64_FORMAT, + block_duration); + break; + } + + case GST_MATROSKA_ID_REFERENCEBLOCK:{ + ret = gst_ebml_read_sint (ebml, &id, &referenceblock); + GST_DEBUG_OBJECT (parse, "ReferenceBlock: %" G_GINT64_FORMAT, + referenceblock); + break; + } + + case GST_MATROSKA_ID_CODECSTATE:{ + guint8 *data; + guint64 data_len = 0; + + if ((ret = + gst_ebml_read_binary (ebml, &id, &data, + &data_len)) != GST_FLOW_OK) + break; + + if (G_UNLIKELY (stream == NULL)) { + GST_WARNING_OBJECT (parse, + "Unexpected CodecState subelement - ignoring"); + break; + } + + g_free (stream->codec_state); + stream->codec_state = data; + stream->codec_state_size = data_len; + + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (&parse->common, ebml, + "BlockGroup", id); + break; + + case GST_MATROSKA_ID_BLOCKVIRTUAL: + case GST_MATROSKA_ID_BLOCKADDITIONS: + case GST_MATROSKA_ID_REFERENCEPRIORITY: + case GST_MATROSKA_ID_REFERENCEVIRTUAL: + case GST_MATROSKA_ID_SLICES: + GST_DEBUG_OBJECT (parse, + "Skipping BlockGroup subelement 0x%x - ignoring", id); + ret = gst_ebml_read_skip (ebml); + break; + } + + if (is_simpleblock) + break; + } + + /* reading a number or so could have failed */ + if (ret != GST_FLOW_OK) + goto data_error; + + if (ret == GST_FLOW_OK && readblock) { + guint64 duration = 0; + gint64 lace_time = 0; + gboolean delta_unit; + + stream = g_ptr_array_index (parse->common.src, stream_num); + + if (cluster_time != GST_CLOCK_TIME_NONE) { + /* FIXME: What to do with negative timestamps? Give timestamp 0 or -1? + * Drop unless the lace contains timestamp 0? */ + if (time < 0 && (-time) > cluster_time) { + lace_time = 0; + } else { + if (stream->timecodescale == 1.0) + lace_time = (cluster_time + time) * parse->common.time_scale; + else + lace_time = + gst_util_guint64_to_gdouble ((cluster_time + time) * + parse->common.time_scale) * stream->timecodescale; + } + } else { + lace_time = GST_CLOCK_TIME_NONE; + } + + if (lace_time != GST_CLOCK_TIME_NONE) { + parse->last_timestamp = lace_time; + } + /* need to refresh segment info ASAP */ + if (GST_CLOCK_TIME_IS_VALID (lace_time) && parse->need_newsegment) { + GST_DEBUG_OBJECT (parse, + "generating segment starting at %" GST_TIME_FORMAT, + GST_TIME_ARGS (lace_time)); + /* pretend we seeked here */ + gst_segment_set_seek (&parse->common.segment, parse->common.segment.rate, + GST_FORMAT_TIME, 0, GST_SEEK_TYPE_SET, lace_time, + GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE, NULL); + /* now convey our segment notion downstream */ + gst_matroska_parse_send_event (parse, gst_event_new_new_segment (FALSE, + parse->common.segment.rate, parse->common.segment.format, + parse->common.segment.start, parse->common.segment.stop, + parse->common.segment.start)); + parse->need_newsegment = FALSE; + } + + if (block_duration) { + if (stream->timecodescale == 1.0) + duration = gst_util_uint64_scale (block_duration, + parse->common.time_scale, 1); + else + duration = + gst_util_gdouble_to_guint64 (gst_util_guint64_to_gdouble + (gst_util_uint64_scale (block_duration, parse->common.time_scale, + 1)) * stream->timecodescale); + } else if (stream->default_duration) { + duration = stream->default_duration * laces; + } + /* else duration is diff between timecode of this and next block */ + + /* For SimpleBlock, look at the keyframe bit in flags. Otherwise, + a ReferenceBlock implies that this is not a keyframe. In either + case, it only makes sense for video streams. */ + delta_unit = stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && + ((is_simpleblock && !(flags & 0x80)) || referenceblock); + + if (delta_unit && stream->set_discont) { + /* When doing seeks or such, we need to restart on key frames or + * decoders might choke. */ + GST_DEBUG_OBJECT (parse, "skipping delta unit"); + goto done; + } + + for (n = 0; n < laces; n++) { + if (G_UNLIKELY (lace_size[n] > size)) { + GST_WARNING_OBJECT (parse, "Invalid lace size"); + break; + } + + /* QoS for video track with an index. the assumption is that + index entries point to keyframes, but if that is not true we + will instad skip until the next keyframe. */ + if (GST_CLOCK_TIME_IS_VALID (lace_time) && + stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && + stream->index_table && parse->common.segment.rate > 0.0) { + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) stream; + GstClockTime earliest_time; + GstClockTime earliest_stream_time; + + GST_OBJECT_LOCK (parse); + earliest_time = videocontext->earliest_time; + GST_OBJECT_UNLOCK (parse); + earliest_stream_time = gst_segment_to_position (&parse->common.segment, + GST_FORMAT_TIME, earliest_time); + + if (GST_CLOCK_TIME_IS_VALID (lace_time) && + GST_CLOCK_TIME_IS_VALID (earliest_stream_time) && + lace_time <= earliest_stream_time) { + /* find index entry (keyframe) <= earliest_stream_time */ + GstMatroskaIndex *entry = + gst_util_array_binary_search (stream->index_table->data, + stream->index_table->len, sizeof (GstMatroskaIndex), + (GCompareDataFunc) gst_matroska_index_seek_find, + GST_SEARCH_MODE_BEFORE, &earliest_stream_time, NULL); + + /* if that entry (keyframe) is after the current the current + buffer, we can skip pushing (and thus decoding) all + buffers until that keyframe. */ + if (entry && GST_CLOCK_TIME_IS_VALID (entry->time) && + entry->time > lace_time) { + GST_LOG_OBJECT (parse, "Skipping lace before late keyframe"); + stream->set_discont = TRUE; + goto next_lace; + } + } + } +#if 0 + sub = gst_buffer_create_sub (buf, + GST_BUFFER_SIZE (buf) - size, lace_size[n]); + GST_DEBUG_OBJECT (parse, "created subbuffer %p", sub); + + if (delta_unit) + GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT); + else + GST_BUFFER_FLAG_UNSET (sub, GST_BUFFER_FLAG_DELTA_UNIT); + + if (stream->encodings != NULL && stream->encodings->len > 0) + sub = gst_matroska_decode_buffer (stream, sub); + + if (sub == NULL) { + GST_WARNING_OBJECT (parse, "Decoding buffer failed"); + goto next_lace; + } + + GST_BUFFER_TIMESTAMP (sub) = lace_time; + + if (GST_CLOCK_TIME_IS_VALID (lace_time)) { + GstClockTime last_stop_end; + + /* Check if this stream is after segment stop */ + if (GST_CLOCK_TIME_IS_VALID (parse->common.segment.stop) && + lace_time >= parse->common.segment.stop) { + GST_DEBUG_OBJECT (parse, + "Stream %d after segment stop %" GST_TIME_FORMAT, stream->index, + GST_TIME_ARGS (parse->common.segment.stop)); + gst_buffer_unref (sub); + goto eos; + } + if (offset >= stream->to_offset) { + GST_DEBUG_OBJECT (parse, "Stream %d after playback section", + stream->index); + gst_buffer_unref (sub); + goto eos; + } + + /* handle gaps, e.g. non-zero start-time, or an cue index entry + * that landed us with timestamps not quite intended */ + if (GST_CLOCK_TIME_IS_VALID (parse->segment.last_stop) && + parse->segment.rate > 0.0) { + GstClockTimeDiff diff; + + /* only send newsegments with increasing start times, + * otherwise if these go back and forth downstream (sinks) increase + * accumulated time and running_time */ + diff = GST_CLOCK_DIFF (parse->segment.last_stop, lace_time); + if (diff > 2 * GST_SECOND && lace_time > parse->segment.start && + (!GST_CLOCK_TIME_IS_VALID (parse->segment.stop) || + lace_time < parse->segment.stop)) { + GST_DEBUG_OBJECT (parse, + "Gap of %" G_GINT64_FORMAT " ns detected in" + "stream %d (%" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "). " + "Sending updated NEWSEGMENT events", diff, + stream->index, GST_TIME_ARGS (stream->pos), + GST_TIME_ARGS (lace_time)); + /* send newsegment events such that the gap is not accounted in + * accum time, hence running_time */ + /* close ahead of gap */ + gst_matroska_parse_send_event (parse, + gst_event_new_new_segment (TRUE, parse->segment.rate, + parse->segment.format, parse->segment.last_stop, + parse->segment.last_stop, parse->segment.last_stop)); + /* skip gap */ + gst_matroska_parse_send_event (parse, + gst_event_new_new_segment (FALSE, parse->segment.rate, + parse->segment.format, lace_time, parse->segment.stop, + lace_time)); + /* align segment view with downstream, + * prevents double-counting accum when closing segment */ + gst_segment_set_newsegment (&parse->segment, FALSE, + parse->segment.rate, parse->segment.format, lace_time, + parse->segment.stop, lace_time); + parse->segment.last_stop = lace_time; + } + } + + if (!GST_CLOCK_TIME_IS_VALID (parse->segment.last_stop) + || parse->segment.last_stop < lace_time) { + parse->segment.last_stop = lace_time; + } + + last_stop_end = lace_time; + if (duration) { + GST_BUFFER_DURATION (sub) = duration / laces; + last_stop_end += GST_BUFFER_DURATION (sub); + } + + if (!GST_CLOCK_TIME_IS_VALID (parse->last_stop_end) || + parse->last_stop_end < last_stop_end) + parse->last_stop_end = last_stop_end; + + if (parse->segment.duration == -1 || + parse->segment.duration < lace_time) { + gst_segment_set_duration (&parse->segment, GST_FORMAT_TIME, + last_stop_end); + gst_element_post_message (GST_ELEMENT_CAST (parse), + gst_message_new_duration (GST_OBJECT_CAST (parse), + GST_FORMAT_TIME, GST_CLOCK_TIME_NONE)); + } + } + + stream->pos = lace_time; + + gst_matroska_parse_sync_streams (parse); + + if (stream->set_discont) { + GST_DEBUG_OBJECT (parse, "marking DISCONT"); + GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DISCONT); + stream->set_discont = FALSE; + } + + /* reverse playback book-keeping */ + if (!GST_CLOCK_TIME_IS_VALID (stream->from_time)) + stream->from_time = lace_time; + if (stream->from_offset == -1) + stream->from_offset = offset; + + GST_DEBUG_OBJECT (parse, + "Pushing lace %d, data of size %d for stream %d, time=%" + GST_TIME_FORMAT " and duration=%" GST_TIME_FORMAT, n, + GST_BUFFER_SIZE (sub), stream_num, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), + GST_TIME_ARGS (GST_BUFFER_DURATION (sub))); + + if (parse->element_index) { + if (stream->index_writer_id == -1) + gst_index_get_writer_id (parse->element_index, + GST_OBJECT (stream->pad), &stream->index_writer_id); + + GST_LOG_OBJECT (parse, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT " for writer id %d", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), cluster_offset, + stream->index_writer_id); + gst_index_add_association (parse->element_index, + stream->index_writer_id, GST_BUFFER_FLAG_IS_SET (sub, + GST_BUFFER_FLAG_DELTA_UNIT) ? 0 : GST_ASSOCIATION_FLAG_KEY_UNIT, + GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (sub), GST_FORMAT_BYTES, + cluster_offset, NULL); + } + + gst_buffer_set_caps (sub, GST_PAD_CAPS (parse->srcpad)); + + /* Postprocess the buffers depending on the codec used */ + if (stream->postprocess_frame) { + GST_LOG_OBJECT (parse, "running post process"); + ret = stream->postprocess_frame (GST_ELEMENT (parse), stream, &sub); + } + + ret = gst_pad_push (stream->pad, sub); + if (parse->segment.rate < 0) { + if (lace_time > parse->segment.stop && ret == GST_FLOW_UNEXPECTED) { + /* In reverse playback we can get a GST_FLOW_UNEXPECTED when + * we are at the end of the segment, so we just need to jump + * back to the previous section. */ + GST_DEBUG_OBJECT (parse, "downstream has reached end of segment"); + ret = GST_FLOW_OK; + } + } + /* combine flows */ + ret = gst_matroska_parse_combine_flows (parse, stream, ret); +#endif + + next_lace: + size -= lace_size[n]; + if (lace_time != GST_CLOCK_TIME_NONE && duration) + lace_time += duration / laces; + else + lace_time = GST_CLOCK_TIME_NONE; + } + } + +done: + if (buf) + gst_buffer_unref (buf); + g_free (lace_size); + + return ret; + + /* EXITS */ +invalid_lacing: + { + GST_ELEMENT_WARNING (parse, STREAM, DEMUX, (NULL), ("Invalid lacing size")); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } +data_error: + { + GST_ELEMENT_WARNING (parse, STREAM, DEMUX, (NULL), ("Data error")); + /* non-fatal, try next block(group) */ + ret = GST_FLOW_OK; + goto done; + } +} + +/* return FALSE if block(group) should be skipped (due to a seek) */ +static inline gboolean +gst_matroska_parse_seek_block (GstMatroskaParse * parse) +{ + if (G_UNLIKELY (parse->seek_block)) { + if (!(--parse->seek_block)) { + return TRUE; + } else { + GST_LOG_OBJECT (parse, "should skip block due to seek"); + return FALSE; + } + } else { + return TRUE; + } +} + +static GstFlowReturn +gst_matroska_parse_parse_contents_seekentry (GstMatroskaParse * parse, + GstEbmlRead * ebml) +{ + GstFlowReturn ret; + guint64 seek_pos = (guint64) - 1; + guint32 seek_id = 0; + guint32 id; + + DEBUG_ELEMENT_START (parse, ebml, "Seek"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (parse, ebml, "Seek", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_SEEKID: + { + guint64 t; + + if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (parse, "SeekID: %" G_GUINT64_FORMAT, t); + seek_id = t; + break; + } + + case GST_MATROSKA_ID_SEEKPOSITION: + { + guint64 t; + + if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK) + break; + + if (t > G_MAXINT64) { + GST_WARNING_OBJECT (parse, + "Too large SeekPosition %" G_GUINT64_FORMAT, t); + break; + } + + GST_DEBUG_OBJECT (parse, "SeekPosition: %" G_GUINT64_FORMAT, t); + seek_pos = t; + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (&parse->common, ebml, + "SeekHead", id); + break; + } + } + + if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) + return ret; + + if (!seek_id || seek_pos == (guint64) - 1) { + GST_WARNING_OBJECT (parse, "Incomplete seekhead entry (0x%x/%" + G_GUINT64_FORMAT ")", seek_id, seek_pos); + return GST_FLOW_OK; + } + + switch (seek_id) { + case GST_MATROSKA_ID_SEEKHEAD: + { + } + case GST_MATROSKA_ID_CUES: + case GST_MATROSKA_ID_TAGS: + case GST_MATROSKA_ID_TRACKS: + case GST_MATROSKA_ID_SEGMENTINFO: + case GST_MATROSKA_ID_ATTACHMENTS: + case GST_MATROSKA_ID_CHAPTERS: + { + guint64 length; + + /* remember */ + length = gst_matroska_read_common_get_length (&parse->common); + + if (length == (guint64) - 1) { + GST_DEBUG_OBJECT (parse, "no upstream length, skipping SeakHead entry"); + break; + } + + /* check for validity */ + if (seek_pos + parse->common.ebml_segment_start + 12 >= length) { + GST_WARNING_OBJECT (parse, + "SeekHead reference lies outside file!" " (%" + G_GUINT64_FORMAT "+%" G_GUINT64_FORMAT "+12 >= %" + G_GUINT64_FORMAT ")", seek_pos, parse->common.ebml_segment_start, + length); + break; + } + + /* only pick up index location when streaming */ + if (seek_id == GST_MATROSKA_ID_CUES) { + parse->index_offset = seek_pos + parse->common.ebml_segment_start; + GST_DEBUG_OBJECT (parse, "Cues located at offset %" G_GUINT64_FORMAT, + parse->index_offset); + } + break; + } + + default: + GST_DEBUG_OBJECT (parse, "Ignoring Seek entry for ID=0x%x", seek_id); + break; + } + DEBUG_ELEMENT_STOP (parse, ebml, "Seek", ret); + + return ret; +} + +static GstFlowReturn +gst_matroska_parse_parse_contents (GstMatroskaParse * parse, GstEbmlRead * ebml) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint32 id; + + DEBUG_ELEMENT_START (parse, ebml, "SeekHead"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (parse, ebml, "SeekHead", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_SEEKENTRY: + { + ret = gst_matroska_parse_parse_contents_seekentry (parse, ebml); + /* Ignore EOS and errors here */ + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (parse, "Ignoring %s", gst_flow_get_name (ret)); + ret = GST_FLOW_OK; + } + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (&parse->common, ebml, + "SeekHead", id); + break; + } + } + + DEBUG_ELEMENT_STOP (parse, ebml, "SeekHead", ret); + + return ret; +} + +#define GST_FLOW_OVERFLOW GST_FLOW_CUSTOM_ERROR + +#define MAX_BLOCK_SIZE (15 * 1024 * 1024) + +static inline GstFlowReturn +gst_matroska_parse_check_read_size (GstMatroskaParse * parse, guint64 bytes) +{ + if (G_UNLIKELY (bytes > MAX_BLOCK_SIZE)) { + /* only a few blocks are expected/allowed to be large, + * and will be recursed into, whereas others will be read and must fit */ + /* fatal in streaming case, as we can't step over easily */ + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), + ("reading large block of size %" G_GUINT64_FORMAT " not supported; " + "file might be corrupt.", bytes)); + return GST_FLOW_ERROR; + } else { + return GST_FLOW_OK; + } +} + +/* returns TRUE if we truely are in error state, and should give up */ +static inline gboolean +gst_matroska_parse_check_parse_error (GstMatroskaParse * parse) +{ + gint64 pos; + + /* sigh, one last attempt above and beyond call of duty ...; + * search for cluster mark following current pos */ + pos = parse->common.offset; + GST_WARNING_OBJECT (parse, "parse error, looking for next cluster"); + if (gst_matroska_parse_search_cluster (parse, &pos) != GST_FLOW_OK) { + /* did not work, give up */ + return TRUE; + } else { + GST_DEBUG_OBJECT (parse, "... found at %" G_GUINT64_FORMAT, pos); + /* try that position */ + parse->common.offset = pos; + return FALSE; + } +} + +/* initializes @ebml with @bytes from input stream at current offset. + * Returns UNEXPECTED if insufficient available, + * ERROR if too much was attempted to read. */ +static inline GstFlowReturn +gst_matroska_parse_take (GstMatroskaParse * parse, guint64 bytes, + GstEbmlRead * ebml) +{ + GstBuffer *buffer = NULL; + GstFlowReturn ret = GST_FLOW_OK; + + GST_LOG_OBJECT (parse, "taking %" G_GUINT64_FORMAT " bytes for parsing", + bytes); + ret = gst_matroska_parse_check_read_size (parse, bytes); + if (G_UNLIKELY (ret != GST_FLOW_OK)) { + /* otherwise fatal */ + ret = GST_FLOW_ERROR; + goto exit; + } + if (gst_adapter_available (parse->common.adapter) >= bytes) + buffer = gst_adapter_take_buffer (parse->common.adapter, bytes); + else + ret = GST_FLOW_UNEXPECTED; + if (G_LIKELY (buffer)) { + gst_ebml_read_init (ebml, GST_ELEMENT_CAST (parse), buffer, + parse->common.offset); + parse->common.offset += bytes; + } +exit: + return ret; +} + +static void +gst_matroska_parse_check_seekability (GstMatroskaParse * parse) +{ + GstQuery *query; + gboolean seekable = FALSE; + gint64 start = -1, stop = -1; + + query = gst_query_new_seeking (GST_FORMAT_BYTES); + if (!gst_pad_peer_query (parse->common.sinkpad, query)) { + GST_DEBUG_OBJECT (parse, "seeking query failed"); + goto done; + } + + gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); + + /* try harder to query upstream size if we didn't get it the first time */ + if (seekable && stop == -1) { + GstFormat fmt = GST_FORMAT_BYTES; + + GST_DEBUG_OBJECT (parse, "doing duration query to fix up unset stop"); + gst_pad_query_peer_duration (parse->common.sinkpad, &fmt, &stop); + } + + /* if upstream doesn't know the size, it's likely that it's not seekable in + * practice even if it technically may be seekable */ + if (seekable && (start != 0 || stop <= start)) { + GST_DEBUG_OBJECT (parse, "seekable but unknown start/stop -> disable"); + seekable = FALSE; + } + +done: + GST_INFO_OBJECT (parse, "seekable: %d (%" G_GUINT64_FORMAT " - %" + G_GUINT64_FORMAT ")", seekable, start, stop); + parse->seekable = seekable; + + gst_query_unref (query); +} + +#if 0 +static GstFlowReturn +gst_matroska_parse_find_tracks (GstMatroskaParse * parse) +{ + guint32 id; + guint64 before_pos; + guint64 length; + guint needed; + GstFlowReturn ret = GST_FLOW_OK; + + GST_WARNING_OBJECT (parse, + "Found Cluster element before Tracks, searching Tracks"); + + /* remember */ + before_pos = parse->common.offset; + + /* Search Tracks element */ + while (TRUE) { + ret = gst_matroska_read_common_peek_id_length_pull (&parse->common, + GST_ELEMENT_CAST (parse), &id, &length, &needed); + if (ret != GST_FLOW_OK) + break; + + if (id != GST_MATROSKA_ID_TRACKS) { + /* we may be skipping large cluster here, so forego size check etc */ + /* ... but we can't skip undefined size; force error */ + if (length == G_MAXUINT64) { + ret = gst_matroska_parse_check_read_size (parse, length); + break; + } else { + parse->common.offset += needed; + parse->offset += length; + } + continue; + } + + /* will lead to track parsing ... */ + ret = gst_matroska_parse_parse_id (parse, id, length, needed); + break; + } + + /* seek back */ + parse->offset = before_pos; + + return ret; +} +#endif + +#define GST_READ_CHECK(stmt) \ +G_STMT_START { \ + if (G_UNLIKELY ((ret = (stmt)) != GST_FLOW_OK)) { \ + if (ret == GST_FLOW_OVERFLOW) { \ + ret = GST_FLOW_OK; \ + } \ + goto read_error; \ + } \ +} G_STMT_END + +static void +gst_matroska_parse_accumulate_streamheader (GstMatroskaParse * parse, + GstBuffer * buffer) +{ + if (parse->pushed_headers) { + GST_WARNING_OBJECT (parse, + "Accumulating headers, but headers are already pushed"); + } + + if (parse->streamheader) { + GstBuffer *buf; + + buf = gst_buffer_span (parse->streamheader, 0, buffer, + GST_BUFFER_SIZE (parse->streamheader) + GST_BUFFER_SIZE (buffer)); + gst_buffer_unref (parse->streamheader); + parse->streamheader = buf; + } else { + parse->streamheader = gst_buffer_ref (buffer); + } + + GST_DEBUG ("%d", GST_BUFFER_SIZE (parse->streamheader)); +} + +static GstFlowReturn +gst_matroska_parse_output (GstMatroskaParse * parse, GstBuffer * buffer, + gboolean keyframe) +{ + GstFlowReturn ret = GST_FLOW_OK; + + if (!parse->pushed_headers) { + GstCaps *caps; + GstStructure *s; + GValue streamheader = { 0 }; + GValue bufval = { 0 }; + GstBuffer *buf; + + caps = gst_caps_new_simple ("video/x-matroska", NULL); + s = gst_caps_get_structure (caps, 0); + g_value_init (&streamheader, GST_TYPE_ARRAY); + g_value_init (&bufval, GST_TYPE_BUFFER); + buf = gst_buffer_copy (parse->streamheader); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); + gst_value_set_buffer (&bufval, buf); + gst_buffer_unref (buf); + gst_value_array_append_value (&streamheader, &bufval); + g_value_unset (&bufval); + gst_structure_set_value (s, "streamheader", &streamheader); + g_value_unset (&streamheader); + //gst_caps_replace (parse->caps, caps); + gst_pad_set_caps (parse->srcpad, caps); + + buf = gst_buffer_copy (parse->streamheader); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); + + ret = gst_pad_push (parse->srcpad, buf); + + parse->pushed_headers = TRUE; + } + + if (!keyframe) { + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + } else { + GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + } + if (GST_BUFFER_TIMESTAMP (buffer) != GST_CLOCK_TIME_NONE) { + parse->last_timestamp = GST_BUFFER_TIMESTAMP (buffer); + } else { + GST_BUFFER_TIMESTAMP (buffer) = parse->last_timestamp; + } + gst_buffer_set_caps (buffer, GST_PAD_CAPS (parse->srcpad)); + ret = gst_pad_push (parse->srcpad, gst_buffer_ref (buffer)); + + return ret; +} + +static GstFlowReturn +gst_matroska_parse_parse_id (GstMatroskaParse * parse, guint32 id, + guint64 length, guint needed) +{ + GstEbmlRead ebml = { 0, }; + GstFlowReturn ret = GST_FLOW_OK; + guint64 read; + //GstBuffer *buffer; + + GST_DEBUG_OBJECT (parse, "Parsing Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", prefix %d", id, length, needed); + +#if 0 + if (gst_adapter_available (parse->adapter) >= length + needed) { + buffer = gst_adapter_take_buffer (parse->adapter, length + needed); + gst_pad_push (parse->srcpad, buffer); + } else { + ret = GST_FLOW_UNEXPECTED; + } + //GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + + return ret; +#endif + + + + /* if we plan to read and parse this element, we need prefix (id + length) + * and the contents */ + /* mind about overflow wrap-around when dealing with undefined size */ + read = length; + if (G_LIKELY (length != G_MAXUINT64)) + read += needed; + + switch (parse->common.state) { + case GST_MATROSKA_READ_STATE_START: + switch (id) { + case GST_EBML_ID_HEADER: + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + ret = gst_matroska_read_common_parse_header (&parse->common, &ebml); + if (ret != GST_FLOW_OK) + goto parse_failed; + parse->common.state = GST_MATROSKA_READ_STATE_SEGMENT; + gst_matroska_parse_check_seekability (parse); + gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); + break; + default: + goto invalid_header; + break; + } + break; + case GST_MATROSKA_READ_STATE_SEGMENT: + switch (id) { + case GST_MATROSKA_ID_SEGMENT: + /* eat segment prefix */ + GST_READ_CHECK (gst_matroska_parse_take (parse, needed, &ebml)); + GST_DEBUG_OBJECT (parse, + "Found Segment start at offset %" G_GUINT64_FORMAT, + parse->common.offset); + /* seeks are from the beginning of the segment, + * after the segment ID/length */ + parse->common.ebml_segment_start = parse->common.offset; + parse->common.state = GST_MATROSKA_READ_STATE_HEADER; + gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); + break; + default: + GST_WARNING_OBJECT (parse, + "Expected a Segment ID (0x%x), but received 0x%x!", + GST_MATROSKA_ID_SEGMENT, id); + GST_READ_CHECK (gst_matroska_parse_take (parse, needed, &ebml)); + gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); + break; + } + break; + case GST_MATROSKA_READ_STATE_SCANNING: + if (id != GST_MATROSKA_ID_CLUSTER && + id != GST_MATROSKA_ID_CLUSTERTIMECODE) + goto skip; + /* fall-through */ + case GST_MATROSKA_READ_STATE_HEADER: + case GST_MATROSKA_READ_STATE_DATA: + case GST_MATROSKA_READ_STATE_SEEK: + switch (id) { + case GST_MATROSKA_ID_SEGMENTINFO: + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + if (!parse->common.segmentinfo_parsed) { + ret = gst_matroska_read_common_parse_info (&parse->common, + GST_ELEMENT_CAST (parse), &ebml); + } + gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); + break; + case GST_MATROSKA_ID_TRACKS: + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + if (!parse->tracks_parsed) { + ret = gst_matroska_parse_parse_tracks (parse, &ebml); + } + gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); + break; + case GST_MATROSKA_ID_CLUSTER: + if (G_UNLIKELY (!parse->tracks_parsed)) { + GST_DEBUG_OBJECT (parse, "Cluster before Track"); + goto not_streamable; + } + if (G_UNLIKELY (parse->common.state + == GST_MATROSKA_READ_STATE_HEADER)) { + parse->common.state = GST_MATROSKA_READ_STATE_DATA; + parse->first_cluster_offset = parse->common.offset; + GST_DEBUG_OBJECT (parse, "signaling no more pads"); + } + parse->cluster_time = GST_CLOCK_TIME_NONE; + parse->cluster_offset = parse->common.offset; + if (G_UNLIKELY (!parse->seek_first && parse->seek_block)) { + GST_DEBUG_OBJECT (parse, "seek target block %" G_GUINT64_FORMAT + " not found in Cluster, trying next Cluster's first block instead", + parse->seek_block); + parse->seek_block = 0; + } + parse->seek_first = FALSE; + /* record next cluster for recovery */ + if (read != G_MAXUINT64) + parse->next_cluster_offset = parse->cluster_offset + read; + /* eat cluster prefix */ + GST_READ_CHECK (gst_matroska_parse_take (parse, needed, &ebml)); + ret = gst_matroska_parse_output (parse, ebml.buf, TRUE); + //gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); + break; + case GST_MATROSKA_ID_CLUSTERTIMECODE: + { + guint64 num; + + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + if ((ret = gst_ebml_read_uint (&ebml, &id, &num)) != GST_FLOW_OK) + goto parse_failed; + GST_DEBUG_OBJECT (parse, "ClusterTimeCode: %" G_GUINT64_FORMAT, num); + parse->cluster_time = num; + if (parse->common.element_index) { + if (parse->common.element_index_writer_id == -1) + gst_index_get_writer_id (parse->common.element_index, + GST_OBJECT (parse), &parse->common.element_index_writer_id); + GST_LOG_OBJECT (parse, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT " for writer id %d", + GST_TIME_ARGS (parse->cluster_time), parse->cluster_offset, + parse->common.element_index_writer_id); + gst_index_add_association (parse->common.element_index, + parse->common.element_index_writer_id, + GST_ASSOCIATION_FLAG_KEY_UNIT, + GST_FORMAT_TIME, parse->cluster_time, + GST_FORMAT_BYTES, parse->cluster_offset, NULL); + } + gst_matroska_parse_output (parse, ebml.buf, FALSE); + break; + } + case GST_MATROSKA_ID_BLOCKGROUP: + if (!gst_matroska_parse_seek_block (parse)) + goto skip; + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + DEBUG_ELEMENT_START (parse, &ebml, "BlockGroup"); + if ((ret = gst_ebml_read_master (&ebml, &id)) == GST_FLOW_OK) { + ret = gst_matroska_parse_parse_blockgroup_or_simpleblock (parse, + &ebml, parse->cluster_time, parse->cluster_offset, FALSE); + } + DEBUG_ELEMENT_STOP (parse, &ebml, "BlockGroup", ret); + gst_matroska_parse_output (parse, ebml.buf, FALSE); + break; + case GST_MATROSKA_ID_SIMPLEBLOCK: + if (!gst_matroska_parse_seek_block (parse)) + goto skip; + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + DEBUG_ELEMENT_START (parse, &ebml, "SimpleBlock"); + ret = gst_matroska_parse_parse_blockgroup_or_simpleblock (parse, + &ebml, parse->cluster_time, parse->cluster_offset, TRUE); + DEBUG_ELEMENT_STOP (parse, &ebml, "SimpleBlock", ret); + gst_matroska_parse_output (parse, ebml.buf, FALSE); + break; + case GST_MATROSKA_ID_ATTACHMENTS: + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + if (!parse->common.attachments_parsed) { + ret = gst_matroska_read_common_parse_attachments (&parse->common, + GST_ELEMENT_CAST (parse), &ebml); + } + gst_matroska_parse_output (parse, ebml.buf, FALSE); + break; + case GST_MATROSKA_ID_TAGS: + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + ret = gst_matroska_read_common_parse_metadata (&parse->common, + GST_ELEMENT_CAST (parse), &ebml); + gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); + break; + case GST_MATROSKA_ID_CHAPTERS: + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + ret = gst_matroska_read_common_parse_chapters (&parse->common, &ebml); + gst_matroska_parse_output (parse, ebml.buf, FALSE); + break; + case GST_MATROSKA_ID_SEEKHEAD: + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + ret = gst_matroska_parse_parse_contents (parse, &ebml); + gst_matroska_parse_output (parse, ebml.buf, FALSE); + break; + case GST_MATROSKA_ID_CUES: + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + if (!parse->common.index_parsed) { + ret = gst_matroska_read_common_parse_index (&parse->common, &ebml); + /* only push based; delayed index building */ + if (ret == GST_FLOW_OK + && parse->common.state == GST_MATROSKA_READ_STATE_SEEK) { + GstEvent *event; + + GST_OBJECT_LOCK (parse); + event = parse->seek_event; + parse->seek_event = NULL; + GST_OBJECT_UNLOCK (parse); + + g_assert (event); + /* unlikely to fail, since we managed to seek to this point */ + if (!gst_matroska_parse_handle_seek_event (parse, NULL, event)) + goto seek_failed; + /* resume data handling, main thread clear to seek again */ + GST_OBJECT_LOCK (parse); + parse->common.state = GST_MATROSKA_READ_STATE_DATA; + GST_OBJECT_UNLOCK (parse); + } + } + gst_matroska_parse_output (parse, ebml.buf, FALSE); + break; + case GST_MATROSKA_ID_POSITION: + case GST_MATROSKA_ID_PREVSIZE: + case GST_MATROSKA_ID_ENCRYPTEDBLOCK: + case GST_MATROSKA_ID_SILENTTRACKS: + GST_DEBUG_OBJECT (parse, + "Skipping Cluster subelement 0x%x - ignoring", id); + /* fall-through */ + default: + skip: + GST_DEBUG_OBJECT (parse, "skipping Element 0x%x", id); + GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); + gst_matroska_parse_output (parse, ebml.buf, FALSE); + break; + } + break; + } + + if (ret == GST_FLOW_PARSE) + goto parse_failed; + +exit: + gst_ebml_read_clear (&ebml); + return ret; + + /* ERRORS */ +read_error: + { + /* simply exit, maybe not enough data yet */ + /* no ebml to clear if read error */ + return ret; + } +parse_failed: + { + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), + ("Failed to parse Element 0x%x", id)); + ret = GST_FLOW_ERROR; + goto exit; + } +not_streamable: + { + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), + ("File layout does not permit streaming")); + ret = GST_FLOW_ERROR; + goto exit; + } +#if 0 +no_tracks: + { + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), + ("No Tracks element found")); + ret = GST_FLOW_ERROR; + goto exit; + } +#endif +invalid_header: + { + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("Invalid header")); + ret = GST_FLOW_ERROR; + goto exit; + } +seek_failed: + { + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("Failed to seek")); + ret = GST_FLOW_ERROR; + goto exit; + } +} + +#if 0 +static void +gst_matroska_parse_loop (GstPad * pad) +{ + GstMatroskaParse *parse = GST_MATROSKA_PARSE (GST_PAD_PARENT (pad)); + GstFlowReturn ret; + guint32 id; + guint64 length; + guint needed; + + /* If we have to close a segment, send a new segment to do this now */ + if (G_LIKELY (parse->common.state == GST_MATROSKA_READ_STATE_DATA)) { + if (G_UNLIKELY (parse->close_segment)) { + gst_matroska_parse_send_event (parse, parse->close_segment); + parse->close_segment = NULL; + } + if (G_UNLIKELY (parse->new_segment)) { + gst_matroska_parse_send_event (parse, parse->new_segment); + parse->new_segment = NULL; + } + } + + ret = gst_matroska_read_common_peek_id_length_pull (&parse->common, + GST_ELEMENT_CAST (parse), &id, &length, &needed); + if (ret == GST_FLOW_UNEXPECTED) + goto eos; + if (ret != GST_FLOW_OK) { + if (gst_matroska_parse_check_parse_error (parse)) + goto pause; + else + return; + } + + GST_LOG_OBJECT (parse, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", needed %d", parse->offset, id, + length, needed); + + ret = gst_matroska_parse_parse_id (parse, id, length, needed); + if (ret == GST_FLOW_UNEXPECTED) + goto eos; + if (ret != GST_FLOW_OK) + goto pause; + + /* check if we're at the end of a configured segment */ + if (G_LIKELY (parse->src->len)) { + guint i; + + g_assert (parse->num_streams == parse->src->len); + for (i = 0; i < parse->src->len; i++) { + GstMatroskaTrackContext *context = g_ptr_array_index (parse->src, i); + GST_DEBUG_OBJECT (context->pad, "pos %" GST_TIME_FORMAT, + GST_TIME_ARGS (context->pos)); + if (context->eos == FALSE) + goto next; + } + + GST_INFO_OBJECT (parse, "All streams are EOS"); + ret = GST_FLOW_UNEXPECTED; + goto eos; + } + +next: + if (G_UNLIKELY (parse->offset == + gst_matroska_read_common_get_length (&parse->common))) { + GST_LOG_OBJECT (parse, "Reached end of stream"); + ret = GST_FLOW_UNEXPECTED; + goto eos; + } + + return; + + /* ERRORS */ +eos: + { + if (parse->segment.rate < 0.0) { + ret = gst_matroska_parse_seek_to_previous_keyframe (parse); + if (ret == GST_FLOW_OK) + return; + } + /* fall-through */ + } +pause: + { + const gchar *reason = gst_flow_get_name (ret); + gboolean push_eos = FALSE; + + GST_LOG_OBJECT (parse, "pausing task, reason %s", reason); + parse->segment_running = FALSE; + gst_pad_pause_task (parse->common.sinkpad); + + if (ret == GST_FLOW_UNEXPECTED) { + /* perform EOS logic */ + + /* Close the segment, i.e. update segment stop with the duration + * if no stop was set */ + if (GST_CLOCK_TIME_IS_VALID (parse->last_stop_end) && + !GST_CLOCK_TIME_IS_VALID (parse->segment.stop)) { + GstEvent *event = + gst_event_new_new_segment_full (TRUE, parse->segment.rate, + parse->segment.applied_rate, parse->segment.format, + parse->segment.start, + MAX (parse->last_stop_end, parse->segment.start), + parse->segment.time); + gst_matroska_parse_send_event (parse, event); + } + + if (parse->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 = parse->segment.stop) == -1) + stop = parse->last_stop_end; + + GST_LOG_OBJECT (parse, "Sending segment done, at end of segment"); + gst_element_post_message (GST_ELEMENT (parse), + gst_message_new_segment_done (GST_OBJECT (parse), GST_FORMAT_TIME, + stop)); + } else { + push_eos = TRUE; + } + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + /* for fatal errors we post an error message */ + GST_ELEMENT_ERROR (parse, STREAM, FAILED, (NULL), + ("stream stopped, reason %s", reason)); + push_eos = TRUE; + } + if (push_eos) { + /* send EOS, and prevent hanging if no streams yet */ + GST_LOG_OBJECT (parse, "Sending EOS, at end of stream"); + if (!gst_matroska_parse_send_event (parse, gst_event_new_eos ()) && + (ret == GST_FLOW_UNEXPECTED)) { + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, + (NULL), ("got eos but no streams (yet)")); + } + } + return; + } +} +#endif + +/* + * Create and push a flushing seek event upstream + */ +static gboolean +perform_seek_to_offset (GstMatroskaParse * parse, guint64 offset) +{ + GstEvent *event; + gboolean res = 0; + + GST_DEBUG_OBJECT (parse, "Seeking to %" G_GUINT64_FORMAT, offset); + + event = + gst_event_new_seek (1.0, GST_FORMAT_BYTES, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, + GST_SEEK_TYPE_NONE, -1); + + res = gst_pad_push_event (parse->common.sinkpad, event); + + /* newsegment event will update offset */ + return res; +} + +static GstFlowReturn +gst_matroska_parse_chain (GstPad * pad, GstBuffer * buffer) +{ + GstMatroskaParse *parse = GST_MATROSKA_PARSE (GST_PAD_PARENT (pad)); + guint available; + GstFlowReturn ret = GST_FLOW_OK; + guint needed = 0; + guint32 id; + guint64 length; + + if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buffer))) { + GST_DEBUG_OBJECT (parse, "got DISCONT"); + gst_adapter_clear (parse->common.adapter); + GST_OBJECT_LOCK (parse); + gst_matroska_read_common_reset_streams (&parse->common, + GST_CLOCK_TIME_NONE, FALSE); + GST_OBJECT_UNLOCK (parse); + } + + gst_adapter_push (parse->common.adapter, buffer); + buffer = NULL; + +next: + available = gst_adapter_available (parse->common.adapter); + + ret = gst_matroska_read_common_peek_id_length_push (&parse->common, + GST_ELEMENT_CAST (parse), &id, &length, &needed); + if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)) + return ret; + + GST_LOG_OBJECT (parse, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " + "size %" G_GUINT64_FORMAT ", needed %d, available %d", + parse->common.offset, id, length, needed, available); + + if (needed > available) + return GST_FLOW_OK; + + ret = gst_matroska_parse_parse_id (parse, id, length, needed); + if (ret == GST_FLOW_UNEXPECTED) { + /* need more data */ + return GST_FLOW_OK; + } else if (ret != GST_FLOW_OK) { + return ret; + } else + goto next; +} + +static gboolean +gst_matroska_parse_handle_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstMatroskaParse *parse = GST_MATROSKA_PARSE (GST_PAD_PARENT (pad)); + + GST_DEBUG_OBJECT (parse, + "have event type %s: %p on sink pad", GST_EVENT_TYPE_NAME (event), event); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time = 0; + gboolean update; + GstSegment segment; + + /* some debug output */ + gst_segment_init (&segment, GST_FORMAT_UNDEFINED); + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + gst_segment_set_newsegment_full (&segment, update, rate, arate, format, + start, stop, time); + GST_DEBUG_OBJECT (parse, + "received format %d newsegment %" GST_SEGMENT_FORMAT, format, + &segment); + + if (parse->common.state < GST_MATROSKA_READ_STATE_DATA) { + GST_DEBUG_OBJECT (parse, "still starting"); + goto exit; + } + + /* we only expect a BYTE segment, e.g. following a seek */ + if (format != GST_FORMAT_BYTES) { + GST_DEBUG_OBJECT (parse, "unsupported segment format, ignoring"); + goto exit; + } + + GST_DEBUG_OBJECT (parse, "clearing segment state"); + /* clear current segment leftover */ + gst_adapter_clear (parse->common.adapter); + /* and some streaming setup */ + parse->common.offset = start; + /* do not know where we are; + * need to come across a cluster and generate newsegment */ + parse->common.segment.last_stop = GST_CLOCK_TIME_NONE; + parse->cluster_time = GST_CLOCK_TIME_NONE; + parse->cluster_offset = 0; + parse->need_newsegment = TRUE; + /* but keep some of the upstream segment */ + parse->common.segment.rate = rate; + exit: + /* chain will send initial newsegment after pads have been added, + * or otherwise come up with one */ + GST_DEBUG_OBJECT (parse, "eating event"); + gst_event_unref (event); + res = TRUE; + break; + } + case GST_EVENT_EOS: + { + if (parse->common.state != GST_MATROSKA_READ_STATE_DATA) { + gst_event_unref (event); + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, + (NULL), ("got eos and didn't receive a complete header object")); + } else if (parse->common.num_streams == 0) { + GST_ELEMENT_ERROR (parse, STREAM, DEMUX, + (NULL), ("got eos but no streams (yet)")); + } else { + gst_matroska_parse_send_event (parse, event); + } + break; + } + case GST_EVENT_FLUSH_STOP: + { + gst_adapter_clear (parse->common.adapter); + GST_OBJECT_LOCK (parse); + gst_matroska_read_common_reset_streams (&parse->common, + GST_CLOCK_TIME_NONE, TRUE); + GST_OBJECT_UNLOCK (parse); + parse->common.segment.last_stop = GST_CLOCK_TIME_NONE; + parse->cluster_time = GST_CLOCK_TIME_NONE; + parse->cluster_offset = 0; + /* fall-through */ + } + default: + res = gst_pad_event_default (pad, event); + break; + } + + return res; +} + +static void +gst_matroska_parse_set_index (GstElement * element, GstIndex * index) +{ + GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); + + GST_OBJECT_LOCK (parse); + if (parse->common.element_index) + gst_object_unref (parse->common.element_index); + parse->common.element_index = index ? gst_object_ref (index) : NULL; + GST_OBJECT_UNLOCK (parse); + GST_DEBUG_OBJECT (parse, "Set index %" GST_PTR_FORMAT, + parse->common.element_index); +} + +static GstIndex * +gst_matroska_parse_get_index (GstElement * element) +{ + GstIndex *result = NULL; + GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); + + GST_OBJECT_LOCK (parse); + if (parse->common.element_index) + result = gst_object_ref (parse->common.element_index); + GST_OBJECT_UNLOCK (parse); + + GST_DEBUG_OBJECT (parse, "Returning index %" GST_PTR_FORMAT, result); + + return result; +} + +static GstStateChangeReturn +gst_matroska_parse_change_state (GstElement * element, + GstStateChange transition) +{ + GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + /* handle upwards state changes here */ + switch (transition) { + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + /* handle downwards state changes */ + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_matroska_parse_reset (GST_ELEMENT (parse)); + break; + default: + break; + } + + return ret; +} + +gboolean +gst_matroska_parse_plugin_init (GstPlugin * plugin) +{ + gst_riff_init (); + + /* create an elementfactory for the matroska_parse element */ + if (!gst_element_register (plugin, "matroskaparse", + GST_RANK_NONE, GST_TYPE_MATROSKA_PARSE)) + return FALSE; + + return TRUE; +} diff --git a/gst/matroska/matroska-parse.h b/gst/matroska/matroska-parse.h new file mode 100644 index 0000000..a447e77 --- /dev/null +++ b/gst/matroska/matroska-parse.h @@ -0,0 +1,106 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * (c) 2011 Debarshi Ray + * + * matroska-parse.h: matroska file/stream parseer definition + * + * 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_MATROSKA_PARSE_H__ +#define __GST_MATROSKA_PARSE_H__ + +#include + +#include "ebml-read.h" +#include "matroska-ids.h" +#include "matroska-read-common.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MATROSKA_PARSE \ + (gst_matroska_parse_get_type ()) +#define GST_MATROSKA_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MATROSKA_PARSE, GstMatroskaParse)) +#define GST_MATROSKA_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_PARSE, GstMatroskaParseClass)) +#define GST_IS_MATROSKA_PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_PARSE)) +#define GST_IS_MATROSKA_PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_PARSE)) + +typedef struct _GstMatroskaParse { + GstElement parent; + + /* < private > */ + + GstMatroskaReadCommon common; + + /* pads */ + GstPad *srcpad; + GstClock *clock; + guint num_v_streams; + guint num_a_streams; + guint num_t_streams; + + GstBuffer *streamheader; + gboolean pushed_headers; + GstClockTime last_timestamp; + + /* state */ + //gboolean streaming; + guint level_up; + guint64 seek_block; + gboolean seek_first; + + /* did we parse cues/tracks/segmentinfo already? */ + gboolean tracks_parsed; + GList *seek_parsed; + + /* keeping track of playback position */ + gboolean segment_running; + GstClockTime last_stop_end; + + GstEvent *close_segment; + GstEvent *new_segment; + + /* some state saving */ + GstClockTime cluster_time; + guint64 cluster_offset; + guint64 first_cluster_offset; + guint64 next_cluster_offset; + + /* index stuff */ + gboolean seekable; + gboolean building_index; + guint64 index_offset; + GstEvent *seek_event; + gboolean need_newsegment; + + /* reverse playback */ + GArray *seek_index; + gint seek_entry; +} GstMatroskaParse; + +typedef struct _GstMatroskaParseClass { + GstElementClass parent; +} GstMatroskaParseClass; + +gboolean gst_matroska_parse_plugin_init (GstPlugin *plugin); + +G_END_DECLS + +#endif /* __GST_MATROSKA_PARSE_H__ */ diff --git a/gst/matroska/matroska-read-common.c b/gst/matroska/matroska-read-common.c new file mode 100644 index 0000000..1104acc --- /dev/null +++ b/gst/matroska/matroska-read-common.c @@ -0,0 +1,1951 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * (c) 2006 Tim-Philipp Müller + * (c) 2008 Sebastian Dröge + * (c) 2011 Debarshi Ray + * + * matroska-read-common.c: shared by matroska file/stream demuxer and parser + * + * 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 +#include + +#ifdef HAVE_ZLIB +#include +#endif + +#ifdef HAVE_BZ2 +#include +#endif + +#include +#include + +#include "lzo.h" + +#include "ebml-read.h" +#include "matroska-read-common.h" + +GST_DEBUG_CATEGORY (matroskareadcommon_debug); +#define GST_CAT_DEFAULT matroskareadcommon_debug + +#define DEBUG_ELEMENT_START(common, ebml, element) \ + GST_DEBUG_OBJECT (common, "Parsing " element " element at offset %" \ + G_GUINT64_FORMAT, gst_ebml_read_get_pos (ebml)) + +#define DEBUG_ELEMENT_STOP(common, ebml, element, ret) \ + GST_DEBUG_OBJECT (common, "Parsing " element " element " \ + " finished with '%s'", gst_flow_get_name (ret)) + +static gboolean +gst_matroska_decompress_data (GstMatroskaTrackEncoding * enc, + guint8 ** data_out, guint * size_out, + GstMatroskaTrackCompressionAlgorithm algo) +{ + guint8 *new_data = NULL; + guint new_size = 0; + guint8 *data = *data_out; + guint size = *size_out; + gboolean ret = TRUE; + + if (algo == GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_ZLIB) { +#ifdef HAVE_ZLIB + /* zlib encoded data */ + z_stream zstream; + guint orig_size; + int result; + + orig_size = size; + zstream.zalloc = (alloc_func) 0; + zstream.zfree = (free_func) 0; + zstream.opaque = (voidpf) 0; + if (inflateInit (&zstream) != Z_OK) { + GST_WARNING ("zlib initialization failed."); + ret = FALSE; + goto out; + } + zstream.next_in = (Bytef *) data; + zstream.avail_in = orig_size; + new_size = orig_size; + new_data = g_malloc (new_size); + zstream.avail_out = new_size; + zstream.next_out = (Bytef *) new_data; + + do { + result = inflate (&zstream, Z_NO_FLUSH); + if (result != Z_OK && result != Z_STREAM_END) { + GST_WARNING ("zlib decompression failed."); + g_free (new_data); + inflateEnd (&zstream); + break; + } + new_size += 4000; + new_data = g_realloc (new_data, new_size); + zstream.next_out = (Bytef *) (new_data + zstream.total_out); + zstream.avail_out += 4000; + } while (zstream.avail_in != 0 && result != Z_STREAM_END); + + if (result != Z_STREAM_END) { + ret = FALSE; + goto out; + } else { + new_size = zstream.total_out; + inflateEnd (&zstream); + } +#else + GST_WARNING ("zlib encoded tracks not supported."); + ret = FALSE; + goto out; +#endif + } else if (algo == GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_BZLIB) { +#ifdef HAVE_BZ2 + /* bzip2 encoded data */ + bz_stream bzstream; + guint orig_size; + int result; + + bzstream.bzalloc = NULL; + bzstream.bzfree = NULL; + bzstream.opaque = NULL; + orig_size = size; + + if (BZ2_bzDecompressInit (&bzstream, 0, 0) != BZ_OK) { + GST_WARNING ("bzip2 initialization failed."); + ret = FALSE; + goto out; + } + + bzstream.next_in = (char *) data; + bzstream.avail_in = orig_size; + new_size = orig_size; + new_data = g_malloc (new_size); + bzstream.avail_out = new_size; + bzstream.next_out = (char *) new_data; + + do { + result = BZ2_bzDecompress (&bzstream); + if (result != BZ_OK && result != BZ_STREAM_END) { + GST_WARNING ("bzip2 decompression failed."); + g_free (new_data); + BZ2_bzDecompressEnd (&bzstream); + break; + } + new_size += 4000; + new_data = g_realloc (new_data, new_size); + bzstream.next_out = (char *) (new_data + bzstream.total_out_lo32); + bzstream.avail_out += 4000; + } while (bzstream.avail_in != 0 && result != BZ_STREAM_END); + + if (result != BZ_STREAM_END) { + ret = FALSE; + goto out; + } else { + new_size = bzstream.total_out_lo32; + BZ2_bzDecompressEnd (&bzstream); + } +#else + GST_WARNING ("bzip2 encoded tracks not supported."); + ret = FALSE; + goto out; +#endif + } else if (algo == GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_LZO1X) { + /* lzo encoded data */ + int result; + int orig_size, out_size; + + orig_size = size; + out_size = size; + new_size = size; + new_data = g_malloc (new_size); + + do { + orig_size = size; + out_size = new_size; + + result = lzo1x_decode (new_data, &out_size, data, &orig_size); + + if (orig_size > 0) { + new_size += 4000; + new_data = g_realloc (new_data, new_size); + } + } while (orig_size > 0 && result == LZO_OUTPUT_FULL); + + new_size -= out_size; + + if (result != LZO_OUTPUT_FULL) { + GST_WARNING ("lzo decompression failed"); + g_free (new_data); + + ret = FALSE; + goto out; + } + + } else if (algo == GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_HEADERSTRIP) { + /* header stripped encoded data */ + if (enc->comp_settings_length > 0) { + new_data = g_malloc (size + enc->comp_settings_length); + new_size = size + enc->comp_settings_length; + + memcpy (new_data, enc->comp_settings, enc->comp_settings_length); + memcpy (new_data + enc->comp_settings_length, data, size); + } + } else { + GST_ERROR ("invalid compression algorithm %d", algo); + ret = FALSE; + } + +out: + + if (!ret) { + *data_out = NULL; + *size_out = 0; + } else { + *data_out = new_data; + *size_out = new_size; + } + + return ret; +} + +GstFlowReturn +gst_matroska_decode_content_encodings (GArray * encodings) +{ + gint i; + + if (encodings == NULL) + return GST_FLOW_OK; + + for (i = 0; i < encodings->len; i++) { + GstMatroskaTrackEncoding *enc = + &g_array_index (encodings, GstMatroskaTrackEncoding, i); + guint8 *data = NULL; + guint size; + + if ((enc->scope & GST_MATROSKA_TRACK_ENCODING_SCOPE_NEXT_CONTENT_ENCODING) + == 0) + continue; + + /* Encryption not supported yet */ + if (enc->type != 0) + return GST_FLOW_ERROR; + + if (i + 1 >= encodings->len) + return GST_FLOW_ERROR; + + if (enc->comp_settings_length == 0) + continue; + + data = enc->comp_settings; + size = enc->comp_settings_length; + + if (!gst_matroska_decompress_data (enc, &data, &size, enc->comp_algo)) + return GST_FLOW_ERROR; + + g_free (enc->comp_settings); + + enc->comp_settings = data; + enc->comp_settings_length = size; + } + + return GST_FLOW_OK; +} + +gboolean +gst_matroska_decode_data (GArray * encodings, guint8 ** data_out, + guint * size_out, GstMatroskaTrackEncodingScope scope, gboolean free) +{ + guint8 *data; + guint size; + gboolean ret = TRUE; + gint i; + + g_return_val_if_fail (encodings != NULL, FALSE); + g_return_val_if_fail (data_out != NULL && *data_out != NULL, FALSE); + g_return_val_if_fail (size_out != NULL, FALSE); + + data = *data_out; + size = *size_out; + + for (i = 0; i < encodings->len; i++) { + GstMatroskaTrackEncoding *enc = + &g_array_index (encodings, GstMatroskaTrackEncoding, i); + guint8 *new_data = NULL; + guint new_size = 0; + + if ((enc->scope & scope) == 0) + continue; + + /* Encryption not supported yet */ + if (enc->type != 0) { + ret = FALSE; + break; + } + + new_data = data; + new_size = size; + + ret = + gst_matroska_decompress_data (enc, &new_data, &new_size, + enc->comp_algo); + + if (!ret) + break; + + if ((data == *data_out && free) || (data != *data_out)) + g_free (data); + + data = new_data; + size = new_size; + } + + if (!ret) { + if ((data == *data_out && free) || (data != *data_out)) + g_free (data); + + *data_out = NULL; + *size_out = 0; + } else { + *data_out = data; + *size_out = size; + } + + return ret; +} + +static gint +gst_matroska_index_compare (GstMatroskaIndex * i1, GstMatroskaIndex * i2) +{ + if (i1->time < i2->time) + return -1; + else if (i1->time > i2->time) + return 1; + else if (i1->block < i2->block) + return -1; + else if (i1->block > i2->block) + return 1; + else + return 0; +} + +gint +gst_matroska_index_seek_find (GstMatroskaIndex * i1, GstClockTime * time, + gpointer user_data) +{ + if (i1->time < *time) + return -1; + else if (i1->time > *time) + return 1; + else + return 0; +} + +GstMatroskaIndex * +gst_matroska_read_common_do_index_seek (GstMatroskaReadCommon * common, + GstMatroskaTrackContext * track, gint64 seek_pos, GArray ** _index, + gint * _entry_index) +{ + GstMatroskaIndex *entry = NULL; + GArray *index; + + if (!common->index || !common->index->len) + return NULL; + + /* find entry just before or at the requested position */ + if (track && track->index_table) + index = track->index_table; + else + index = common->index; + + entry = + gst_util_array_binary_search (index->data, index->len, + sizeof (GstMatroskaIndex), + (GCompareDataFunc) gst_matroska_index_seek_find, GST_SEARCH_MODE_BEFORE, + &seek_pos, NULL); + + if (entry == NULL) + entry = &g_array_index (index, GstMatroskaIndex, 0); + + if (_index) + *_index = index; + if (_entry_index) + *_entry_index = entry - (GstMatroskaIndex *) index->data; + + return entry; +} + +static gint +gst_matroska_read_common_encoding_cmp (GstMatroskaTrackEncoding * a, + GstMatroskaTrackEncoding * b) +{ + if (b->order > a->order) + return 1; + else if (b->order < a->order) + return -1; + else + return 0; +} + +static gboolean +gst_matroska_read_common_encoding_order_unique (GArray * encodings, guint64 + order) +{ + gint i; + + if (encodings == NULL || encodings->len == 0) + return TRUE; + + for (i = 0; i < encodings->len; i++) + if (g_array_index (encodings, GstMatroskaTrackEncoding, i).order == order) + return FALSE; + + return TRUE; +} + +/* takes ownership of taglist */ +void +gst_matroska_read_common_found_global_tag (GstMatroskaReadCommon * common, + GstElement * el, GstTagList * taglist) +{ + if (common->global_tags) { + /* nothing sent yet, add to cache */ + gst_tag_list_insert (common->global_tags, taglist, GST_TAG_MERGE_APPEND); + gst_tag_list_free (taglist); + } else { + /* hm, already sent, no need to cache and wait anymore */ + GST_DEBUG_OBJECT (common, "Sending late global tags %" GST_PTR_FORMAT, + taglist); + gst_element_found_tags (el, taglist); + } +} + +gint64 +gst_matroska_read_common_get_length (GstMatroskaReadCommon * common) +{ + GstFormat fmt = GST_FORMAT_BYTES; + gint64 end = -1; + + if (!gst_pad_query_peer_duration (common->sinkpad, &fmt, &end) || + fmt != GST_FORMAT_BYTES || end < 0) + GST_DEBUG_OBJECT (common, "no upstream length"); + + return end; +} + +/* determine track to seek in */ +GstMatroskaTrackContext * +gst_matroska_read_common_get_seek_track (GstMatroskaReadCommon * common, + GstMatroskaTrackContext * track) +{ + gint i; + + if (track && track->type == GST_MATROSKA_TRACK_TYPE_VIDEO) + return track; + + for (i = 0; i < common->src->len; i++) { + GstMatroskaTrackContext *stream; + + stream = g_ptr_array_index (common->src, i); + if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && stream->index_table) + track = stream; + } + + return track; +} + +/* skip unknown or alike element */ +GstFlowReturn +gst_matroska_read_common_parse_skip (GstMatroskaReadCommon * common, + GstEbmlRead * ebml, const gchar * parent_name, guint id) +{ + if (id == GST_EBML_ID_VOID) { + GST_DEBUG_OBJECT (common, "Skipping EBML Void element"); + } else if (id == GST_EBML_ID_CRC32) { + GST_DEBUG_OBJECT (common, "Skipping EBML CRC32 element"); + } else { + GST_WARNING_OBJECT (common, + "Unknown %s subelement 0x%x - ignoring", parent_name, id); + } + + return gst_ebml_read_skip (ebml); +} + +static GstFlowReturn +gst_matroska_read_common_parse_attached_file (GstMatroskaReadCommon * common, + GstEbmlRead * ebml, GstTagList * taglist) +{ + guint32 id; + GstFlowReturn ret; + gchar *description = NULL; + gchar *filename = NULL; + gchar *mimetype = NULL; + guint8 *data = NULL; + guint64 datalen = 0; + + DEBUG_ELEMENT_START (common, ebml, "AttachedFile"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "AttachedFile", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + /* read all sub-entries */ + + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_FILEDESCRIPTION: + if (description) { + GST_WARNING_OBJECT (common, "FileDescription can only appear once"); + break; + } + + ret = gst_ebml_read_utf8 (ebml, &id, &description); + GST_DEBUG_OBJECT (common, "FileDescription: %s", + GST_STR_NULL (description)); + break; + case GST_MATROSKA_ID_FILENAME: + if (filename) { + GST_WARNING_OBJECT (common, "FileName can only appear once"); + break; + } + + ret = gst_ebml_read_utf8 (ebml, &id, &filename); + + GST_DEBUG_OBJECT (common, "FileName: %s", GST_STR_NULL (filename)); + break; + case GST_MATROSKA_ID_FILEMIMETYPE: + if (mimetype) { + GST_WARNING_OBJECT (common, "FileMimeType can only appear once"); + break; + } + + ret = gst_ebml_read_ascii (ebml, &id, &mimetype); + GST_DEBUG_OBJECT (common, "FileMimeType: %s", GST_STR_NULL (mimetype)); + break; + case GST_MATROSKA_ID_FILEDATA: + if (data) { + GST_WARNING_OBJECT (common, "FileData can only appear once"); + break; + } + + ret = gst_ebml_read_binary (ebml, &id, &data, &datalen); + GST_DEBUG_OBJECT (common, "FileData of size %" G_GUINT64_FORMAT, + datalen); + break; + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, + "AttachedFile", id); + break; + case GST_MATROSKA_ID_FILEUID: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "AttachedFile", ret); + + if (filename && mimetype && data && datalen > 0) { + GstTagImageType image_type = GST_TAG_IMAGE_TYPE_NONE; + GstBuffer *tagbuffer = NULL; + GstCaps *caps; + gchar *filename_lc = g_utf8_strdown (filename, -1); + + GST_DEBUG_OBJECT (common, "Creating tag for attachment with " + "filename '%s', mimetype '%s', description '%s', " + "size %" G_GUINT64_FORMAT, filename, mimetype, + GST_STR_NULL (description), datalen); + + /* TODO: better heuristics for different image types */ + if (strstr (filename_lc, "cover")) { + if (strstr (filename_lc, "back")) + image_type = GST_TAG_IMAGE_TYPE_BACK_COVER; + else + image_type = GST_TAG_IMAGE_TYPE_FRONT_COVER; + } else if (g_str_has_prefix (mimetype, "image/") || + g_str_has_suffix (filename_lc, "png") || + g_str_has_suffix (filename_lc, "jpg") || + g_str_has_suffix (filename_lc, "jpeg") || + g_str_has_suffix (filename_lc, "gif") || + g_str_has_suffix (filename_lc, "bmp")) { + image_type = GST_TAG_IMAGE_TYPE_UNDEFINED; + } + g_free (filename_lc); + + /* First try to create an image tag buffer from this */ + if (image_type != GST_TAG_IMAGE_TYPE_NONE) { + tagbuffer = + gst_tag_image_data_to_image_buffer (data, datalen, image_type); + + if (!tagbuffer) + image_type = GST_TAG_IMAGE_TYPE_NONE; + } + + /* if this failed create an attachment buffer */ + if (!tagbuffer) { + tagbuffer = gst_buffer_new_and_alloc (datalen); + + memcpy (GST_BUFFER_DATA (tagbuffer), data, datalen); + GST_BUFFER_SIZE (tagbuffer) = datalen; + + caps = gst_type_find_helper_for_buffer (NULL, tagbuffer, NULL); + if (caps == NULL) + caps = gst_caps_new_simple (mimetype, NULL); + gst_buffer_set_caps (tagbuffer, caps); + gst_caps_unref (caps); + } + + /* Set filename and description on the caps */ + caps = GST_BUFFER_CAPS (tagbuffer); + gst_caps_set_simple (caps, "filename", G_TYPE_STRING, filename, NULL); + if (description) + gst_caps_set_simple (caps, "description", G_TYPE_STRING, description, + NULL); + + GST_DEBUG_OBJECT (common, + "Created attachment buffer with caps: %" GST_PTR_FORMAT, caps); + + /* and append to the tag list */ + if (image_type != GST_TAG_IMAGE_TYPE_NONE) + gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_IMAGE, tagbuffer, + NULL); + else + gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_ATTACHMENT, + tagbuffer, NULL); + + /* the tag list adds it own ref */ + gst_buffer_unref (tagbuffer); + } + + g_free (filename); + g_free (mimetype); + g_free (data); + g_free (description); + + return ret; +} + +GstFlowReturn +gst_matroska_read_common_parse_attachments (GstMatroskaReadCommon * common, + GstElement * el, GstEbmlRead * ebml) +{ + guint32 id; + GstFlowReturn ret = GST_FLOW_OK; + GstTagList *taglist; + + DEBUG_ELEMENT_START (common, ebml, "Attachments"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "Attachments", ret); + return ret; + } + + taglist = gst_tag_list_new (); + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_ATTACHEDFILE: + ret = gst_matroska_read_common_parse_attached_file (common, ebml, + taglist); + break; + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, + "Attachments", id); + break; + } + } + DEBUG_ELEMENT_STOP (common, ebml, "Attachments", ret); + + if (gst_structure_n_fields (GST_STRUCTURE (taglist)) > 0) { + GST_DEBUG_OBJECT (common, "Storing attachment tags"); + gst_matroska_read_common_found_global_tag (common, el, taglist); + } else { + GST_DEBUG_OBJECT (common, "No valid attachments found"); + gst_tag_list_free (taglist); + } + + common->attachments_parsed = TRUE; + + return ret; +} + +GstFlowReturn +gst_matroska_read_common_parse_chapters (GstMatroskaReadCommon * common, + GstEbmlRead * ebml) +{ + guint32 id; + GstFlowReturn ret = GST_FLOW_OK; + + GST_WARNING_OBJECT (common, "Parsing of chapters not implemented yet"); + + /* TODO: implement parsing of chapters */ + + DEBUG_ELEMENT_START (common, ebml, "Chapters"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "Chapters", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + default: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "Chapters", ret); + return ret; +} + +GstFlowReturn +gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common, + GstEbmlRead * ebml) +{ + GstFlowReturn ret; + gchar *doctype; + guint version; + guint32 id; + + /* this function is the first to be called */ + + /* default init */ + doctype = NULL; + version = 1; + + ret = gst_ebml_peek_id (ebml, &id); + if (ret != GST_FLOW_OK) + return ret; + + GST_DEBUG_OBJECT (common, "id: %08x", id); + + if (id != GST_EBML_ID_HEADER) { + GST_ERROR_OBJECT (common, "Failed to read header"); + goto exit; + } + + ret = gst_ebml_read_master (ebml, &id); + if (ret != GST_FLOW_OK) + return ret; + + while (gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + ret = gst_ebml_peek_id (ebml, &id); + if (ret != GST_FLOW_OK) + return ret; + + switch (id) { + /* is our read version uptodate? */ + case GST_EBML_ID_EBMLREADVERSION:{ + guint64 num; + + ret = gst_ebml_read_uint (ebml, &id, &num); + if (ret != GST_FLOW_OK) + return ret; + if (num != GST_EBML_VERSION) { + GST_ERROR_OBJECT (ebml, "Unsupported EBML version %" G_GUINT64_FORMAT, + num); + return GST_FLOW_ERROR; + } + + GST_DEBUG_OBJECT (ebml, "EbmlReadVersion: %" G_GUINT64_FORMAT, num); + break; + } + + /* we only handle 8 byte lengths at max */ + case GST_EBML_ID_EBMLMAXSIZELENGTH:{ + guint64 num; + + ret = gst_ebml_read_uint (ebml, &id, &num); + if (ret != GST_FLOW_OK) + return ret; + if (num > sizeof (guint64)) { + GST_ERROR_OBJECT (ebml, + "Unsupported EBML maximum size %" G_GUINT64_FORMAT, num); + return GST_FLOW_ERROR; + } + GST_DEBUG_OBJECT (ebml, "EbmlMaxSizeLength: %" G_GUINT64_FORMAT, num); + break; + } + + /* we handle 4 byte IDs at max */ + case GST_EBML_ID_EBMLMAXIDLENGTH:{ + guint64 num; + + ret = gst_ebml_read_uint (ebml, &id, &num); + if (ret != GST_FLOW_OK) + return ret; + if (num > sizeof (guint32)) { + GST_ERROR_OBJECT (ebml, + "Unsupported EBML maximum ID %" G_GUINT64_FORMAT, num); + return GST_FLOW_ERROR; + } + GST_DEBUG_OBJECT (ebml, "EbmlMaxIdLength: %" G_GUINT64_FORMAT, num); + break; + } + + case GST_EBML_ID_DOCTYPE:{ + gchar *text; + + ret = gst_ebml_read_ascii (ebml, &id, &text); + if (ret != GST_FLOW_OK) + return ret; + + GST_DEBUG_OBJECT (ebml, "EbmlDocType: %s", GST_STR_NULL (text)); + + if (doctype) + g_free (doctype); + doctype = text; + break; + } + + case GST_EBML_ID_DOCTYPEREADVERSION:{ + guint64 num; + + ret = gst_ebml_read_uint (ebml, &id, &num); + if (ret != GST_FLOW_OK) + return ret; + version = num; + GST_DEBUG_OBJECT (ebml, "EbmlReadVersion: %" G_GUINT64_FORMAT, num); + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, + "EBML header", id); + if (ret != GST_FLOW_OK) + return ret; + break; + + /* we ignore these two, as they don't tell us anything we care about */ + case GST_EBML_ID_EBMLVERSION: + case GST_EBML_ID_DOCTYPEVERSION: + ret = gst_ebml_read_skip (ebml); + if (ret != GST_FLOW_OK) + return ret; + break; + } + } + +exit: + + if ((doctype != NULL && !strcmp (doctype, GST_MATROSKA_DOCTYPE_MATROSKA)) || + (doctype != NULL && !strcmp (doctype, GST_MATROSKA_DOCTYPE_WEBM)) || + (doctype == NULL)) { + if (version <= 2) { + if (doctype) { + GST_INFO_OBJECT (common, "Input is %s version %d", doctype, version); + } else { + GST_WARNING_OBJECT (common, "Input is EBML without doctype, assuming " + "matroska (version %d)", version); + } + ret = GST_FLOW_OK; + } else { + GST_ELEMENT_ERROR (common, STREAM, DEMUX, (NULL), + ("Demuxer version (2) is too old to read %s version %d", + GST_STR_NULL (doctype), version)); + ret = GST_FLOW_ERROR; + } + g_free (doctype); + } else { + GST_ELEMENT_ERROR (common, STREAM, WRONG_TYPE, (NULL), + ("Input is not a matroska stream (doctype=%s)", doctype)); + ret = GST_FLOW_ERROR; + g_free (doctype); + } + + return ret; +} + +static GstFlowReturn +gst_matroska_read_common_parse_index_cuetrack (GstMatroskaReadCommon * common, + GstEbmlRead * ebml, guint * nentries) +{ + guint32 id; + GstFlowReturn ret; + GstMatroskaIndex idx; + + idx.pos = (guint64) - 1; + idx.track = 0; + idx.time = GST_CLOCK_TIME_NONE; + idx.block = 1; + + DEBUG_ELEMENT_START (common, ebml, "CueTrackPositions"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "CueTrackPositions", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* track number */ + case GST_MATROSKA_ID_CUETRACK: + { + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + idx.track = 0; + GST_WARNING_OBJECT (common, "Invalid CueTrack 0"); + break; + } + + GST_DEBUG_OBJECT (common, "CueTrack: %" G_GUINT64_FORMAT, num); + idx.track = num; + break; + } + + /* position in file */ + case GST_MATROSKA_ID_CUECLUSTERPOSITION: + { + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num > G_MAXINT64) { + GST_WARNING_OBJECT (common, "CueClusterPosition %" G_GUINT64_FORMAT + " too large", num); + break; + } + + idx.pos = num; + break; + } + + /* number of block in the cluster */ + case GST_MATROSKA_ID_CUEBLOCKNUMBER: + { + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num == 0) { + GST_WARNING_OBJECT (common, "Invalid CueBlockNumber 0"); + break; + } + + GST_DEBUG_OBJECT (common, "CueBlockNumber: %" G_GUINT64_FORMAT, num); + idx.block = num; + + /* mild sanity check, disregard strange cases ... */ + if (idx.block > G_MAXUINT16) { + GST_DEBUG_OBJECT (common, "... looks suspicious, ignoring"); + idx.block = 1; + } + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, + "CueTrackPositions", id); + break; + + case GST_MATROSKA_ID_CUECODECSTATE: + case GST_MATROSKA_ID_CUEREFERENCE: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "CueTrackPositions", ret); + + /* (e.g.) lavf typically creates entries without a block number, + * which is bogus and leads to contradictory information */ + if (common->index->len) { + GstMatroskaIndex *last_idx; + + last_idx = &g_array_index (common->index, GstMatroskaIndex, + common->index->len - 1); + if (last_idx->block == idx.block && last_idx->pos == idx.pos && + last_idx->track == idx.track && idx.time > last_idx->time) { + GST_DEBUG_OBJECT (common, "Cue entry refers to same location, " + "but has different time than previous entry; discarding"); + idx.track = 0; + } + } + + if ((ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED) + && idx.pos != (guint64) - 1 && idx.track > 0) { + g_array_append_val (common->index, idx); + (*nentries)++; + } else if (ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED) { + GST_DEBUG_OBJECT (common, "CueTrackPositions without valid content"); + } + + return ret; +} + +static GstFlowReturn +gst_matroska_read_common_parse_index_pointentry (GstMatroskaReadCommon * + common, GstEbmlRead * ebml) +{ + guint32 id; + GstFlowReturn ret; + GstClockTime time = GST_CLOCK_TIME_NONE; + guint nentries = 0; + + DEBUG_ELEMENT_START (common, ebml, "CuePoint"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "CuePoint", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* one single index entry ('point') */ + case GST_MATROSKA_ID_CUETIME: + { + if ((ret = gst_ebml_read_uint (ebml, &id, &time)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (common, "CueTime: %" G_GUINT64_FORMAT, time); + time = time * common->time_scale; + break; + } + + /* position in the file + track to which it belongs */ + case GST_MATROSKA_ID_CUETRACKPOSITIONS: + { + if ((ret = + gst_matroska_read_common_parse_index_cuetrack (common, ebml, + &nentries)) != GST_FLOW_OK) + break; + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, "CuePoint", + id); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "CuePoint", ret); + + if (nentries > 0) { + if (time == GST_CLOCK_TIME_NONE) { + GST_WARNING_OBJECT (common, "CuePoint without valid time"); + g_array_remove_range (common->index, common->index->len - nentries, + nentries); + } else { + gint i; + + for (i = common->index->len - nentries; i < common->index->len; i++) { + GstMatroskaIndex *idx = + &g_array_index (common->index, GstMatroskaIndex, i); + + idx->time = time; + GST_DEBUG_OBJECT (common, "Index entry: pos=%" G_GUINT64_FORMAT + ", time=%" GST_TIME_FORMAT ", track=%u, block=%u", idx->pos, + GST_TIME_ARGS (idx->time), (guint) idx->track, (guint) idx->block); + } + } + } else { + GST_DEBUG_OBJECT (common, "Empty CuePoint"); + } + + return ret; +} + +gint +gst_matroska_read_common_stream_from_num (GstMatroskaReadCommon * common, + guint track_num) +{ + guint n; + + g_assert (common->src->len == common->num_streams); + for (n = 0; n < common->src->len; n++) { + GstMatroskaTrackContext *context = g_ptr_array_index (common->src, n); + + if (context->num == track_num) { + return n; + } + } + + if (n == common->num_streams) + GST_WARNING_OBJECT (common, + "Failed to find corresponding pad for tracknum %d", track_num); + + return -1; +} + +GstFlowReturn +gst_matroska_read_common_parse_index (GstMatroskaReadCommon * common, + GstEbmlRead * ebml) +{ + guint32 id; + GstFlowReturn ret = GST_FLOW_OK; + guint i; + + if (common->index) + g_array_free (common->index, TRUE); + common->index = + g_array_sized_new (FALSE, FALSE, sizeof (GstMatroskaIndex), 128); + + DEBUG_ELEMENT_START (common, ebml, "Cues"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "Cues", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* one single index entry ('point') */ + case GST_MATROSKA_ID_POINTENTRY: + ret = gst_matroska_read_common_parse_index_pointentry (common, ebml); + break; + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, "Cues", id); + break; + } + } + DEBUG_ELEMENT_STOP (common, ebml, "Cues", ret); + + /* Sort index by time, smallest time first, for easier searching */ + g_array_sort (common->index, (GCompareFunc) gst_matroska_index_compare); + + /* Now sort the track specific index entries into their own arrays */ + for (i = 0; i < common->index->len; i++) { + GstMatroskaIndex *idx = &g_array_index (common->index, GstMatroskaIndex, + i); + gint track_num; + GstMatroskaTrackContext *ctx; + + if (common->element_index) { + gint writer_id; + + if (idx->track != 0 && + (track_num = + gst_matroska_read_common_stream_from_num (common, + idx->track)) != -1) { + ctx = g_ptr_array_index (common->src, track_num); + + if (ctx->index_writer_id == -1) + gst_index_get_writer_id (common->element_index, + GST_OBJECT (ctx->pad), &ctx->index_writer_id); + writer_id = ctx->index_writer_id; + } else { + if (common->element_index_writer_id == -1) + gst_index_get_writer_id (common->element_index, GST_OBJECT (common), + &common->element_index_writer_id); + writer_id = common->element_index_writer_id; + } + + GST_LOG_OBJECT (common, "adding association %" GST_TIME_FORMAT "-> %" + G_GUINT64_FORMAT " for writer id %d", GST_TIME_ARGS (idx->time), + idx->pos, writer_id); + gst_index_add_association (common->element_index, writer_id, + GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, idx->time, + GST_FORMAT_BYTES, idx->pos + common->ebml_segment_start, NULL); + } + + if (idx->track == 0) + continue; + + track_num = gst_matroska_read_common_stream_from_num (common, idx->track); + if (track_num == -1) + continue; + + ctx = g_ptr_array_index (common->src, track_num); + + if (ctx->index_table == NULL) + ctx->index_table = + g_array_sized_new (FALSE, FALSE, sizeof (GstMatroskaIndex), 128); + + g_array_append_vals (ctx->index_table, idx, 1); + } + + common->index_parsed = TRUE; + + /* sanity check; empty index normalizes to no index */ + if (common->index->len == 0) { + g_array_free (common->index, TRUE); + common->index = NULL; + } + + return ret; +} + +GstFlowReturn +gst_matroska_read_common_parse_info (GstMatroskaReadCommon * common, + GstElement * el, GstEbmlRead * ebml) +{ + GstFlowReturn ret = GST_FLOW_OK; + gdouble dur_f = -1.0; + guint32 id; + + DEBUG_ELEMENT_START (common, ebml, "SegmentInfo"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "SegmentInfo", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + /* cluster timecode */ + case GST_MATROSKA_ID_TIMECODESCALE:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + + GST_DEBUG_OBJECT (common, "TimeCodeScale: %" G_GUINT64_FORMAT, num); + common->time_scale = num; + break; + } + + case GST_MATROSKA_ID_DURATION:{ + if ((ret = gst_ebml_read_float (ebml, &id, &dur_f)) != GST_FLOW_OK) + break; + + if (dur_f <= 0.0) { + GST_WARNING_OBJECT (common, "Invalid duration %lf", dur_f); + break; + } + + GST_DEBUG_OBJECT (common, "Duration: %lf", dur_f); + break; + } + + case GST_MATROSKA_ID_WRITINGAPP:{ + gchar *text; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (common, "WritingApp: %s", GST_STR_NULL (text)); + common->writing_app = text; + break; + } + + case GST_MATROSKA_ID_MUXINGAPP:{ + gchar *text; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (common, "MuxingApp: %s", GST_STR_NULL (text)); + common->muxing_app = text; + break; + } + + case GST_MATROSKA_ID_DATEUTC:{ + gint64 time; + + if ((ret = gst_ebml_read_date (ebml, &id, &time)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (common, "DateUTC: %" G_GINT64_FORMAT, time); + common->created = time; + break; + } + + case GST_MATROSKA_ID_TITLE:{ + gchar *text; + GstTagList *taglist; + + if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (common, "Title: %s", GST_STR_NULL (text)); + taglist = gst_tag_list_new (); + gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, text, + NULL); + gst_matroska_read_common_found_global_tag (common, el, taglist); + g_free (text); + break; + } + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, + "SegmentInfo", id); + break; + + /* fall through */ + case GST_MATROSKA_ID_SEGMENTUID: + case GST_MATROSKA_ID_SEGMENTFILENAME: + case GST_MATROSKA_ID_PREVUID: + case GST_MATROSKA_ID_PREVFILENAME: + case GST_MATROSKA_ID_NEXTUID: + case GST_MATROSKA_ID_NEXTFILENAME: + case GST_MATROSKA_ID_SEGMENTFAMILY: + case GST_MATROSKA_ID_CHAPTERTRANSLATE: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + if (dur_f > 0.0) { + GstClockTime dur_u; + + dur_u = gst_gdouble_to_guint64 (dur_f * + gst_guint64_to_gdouble (common->time_scale)); + if (GST_CLOCK_TIME_IS_VALID (dur_u) && dur_u <= G_MAXINT64) + gst_segment_set_duration (&common->segment, GST_FORMAT_TIME, dur_u); + } + + DEBUG_ELEMENT_STOP (common, ebml, "SegmentInfo", ret); + + common->segmentinfo_parsed = TRUE; + + return ret; +} + +static GstFlowReturn +gst_matroska_read_common_parse_metadata_id_simple_tag (GstMatroskaReadCommon * + common, GstEbmlRead * ebml, GstTagList ** p_taglist) +{ + /* FIXME: check if there are more useful mappings */ + static const struct + { + const gchar *matroska_tagname; + const gchar *gstreamer_tagname; + } + tag_conv[] = { + { + GST_MATROSKA_TAG_ID_TITLE, GST_TAG_TITLE}, { + GST_MATROSKA_TAG_ID_ARTIST, GST_TAG_ARTIST}, { + GST_MATROSKA_TAG_ID_AUTHOR, GST_TAG_ARTIST}, { + GST_MATROSKA_TAG_ID_ALBUM, GST_TAG_ALBUM}, { + GST_MATROSKA_TAG_ID_COMMENTS, GST_TAG_COMMENT}, { + GST_MATROSKA_TAG_ID_BITSPS, GST_TAG_BITRATE}, { + GST_MATROSKA_TAG_ID_BPS, GST_TAG_BITRATE}, { + GST_MATROSKA_TAG_ID_ENCODER, GST_TAG_ENCODER}, { + GST_MATROSKA_TAG_ID_DATE, GST_TAG_DATE}, { + GST_MATROSKA_TAG_ID_ISRC, GST_TAG_ISRC}, { + GST_MATROSKA_TAG_ID_COPYRIGHT, GST_TAG_COPYRIGHT}, { + GST_MATROSKA_TAG_ID_BPM, GST_TAG_BEATS_PER_MINUTE}, { + GST_MATROSKA_TAG_ID_TERMS_OF_USE, GST_TAG_LICENSE}, { + GST_MATROSKA_TAG_ID_COMPOSER, GST_TAG_COMPOSER}, { + GST_MATROSKA_TAG_ID_LEAD_PERFORMER, GST_TAG_PERFORMER}, { + GST_MATROSKA_TAG_ID_GENRE, GST_TAG_GENRE} + }; + GstFlowReturn ret; + guint32 id; + gchar *value = NULL; + gchar *tag = NULL; + + DEBUG_ELEMENT_START (common, ebml, "SimpleTag"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "SimpleTag", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + /* read all sub-entries */ + + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_TAGNAME: + g_free (tag); + tag = NULL; + ret = gst_ebml_read_ascii (ebml, &id, &tag); + GST_DEBUG_OBJECT (common, "TagName: %s", GST_STR_NULL (tag)); + break; + + case GST_MATROSKA_ID_TAGSTRING: + g_free (value); + value = NULL; + ret = gst_ebml_read_utf8 (ebml, &id, &value); + GST_DEBUG_OBJECT (common, "TagString: %s", GST_STR_NULL (value)); + break; + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, "SimpleTag", + id); + break; + /* fall-through */ + + case GST_MATROSKA_ID_TAGLANGUAGE: + case GST_MATROSKA_ID_TAGDEFAULT: + case GST_MATROSKA_ID_TAGBINARY: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "SimpleTag", ret); + + if (tag && value) { + guint i; + + for (i = 0; i < G_N_ELEMENTS (tag_conv); i++) { + const gchar *tagname_gst = tag_conv[i].gstreamer_tagname; + + const gchar *tagname_mkv = tag_conv[i].matroska_tagname; + + if (strcmp (tagname_mkv, tag) == 0) { + GValue dest = { 0, }; + GType dest_type = gst_tag_get_type (tagname_gst); + + /* Ensure that any date string is complete */ + if (dest_type == GST_TYPE_DATE) { + guint year = 1901, month = 1, day = 1; + + /* Dates can be yyyy-MM-dd, yyyy-MM or yyyy, but we need + * the first type */ + if (sscanf (value, "%04u-%02u-%02u", &year, &month, &day) != 0) { + g_free (value); + value = g_strdup_printf ("%04u-%02u-%02u", year, month, day); + } + } + + g_value_init (&dest, dest_type); + if (gst_value_deserialize (&dest, value)) { + gst_tag_list_add_values (*p_taglist, GST_TAG_MERGE_APPEND, + tagname_gst, &dest, NULL); + } else { + GST_WARNING_OBJECT (common, "Can't transform tag '%s' with " + "value '%s' to target type '%s'", tag, value, + g_type_name (dest_type)); + } + g_value_unset (&dest); + break; + } + } + } + + g_free (tag); + g_free (value); + + return ret; +} + +static GstFlowReturn +gst_matroska_read_common_parse_metadata_id_tag (GstMatroskaReadCommon * common, + GstEbmlRead * ebml, GstTagList ** p_taglist) +{ + guint32 id; + GstFlowReturn ret; + + DEBUG_ELEMENT_START (common, ebml, "Tag"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "Tag", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + /* read all sub-entries */ + + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_SIMPLETAG: + ret = gst_matroska_read_common_parse_metadata_id_simple_tag (common, + ebml, p_taglist); + break; + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, "Tag", id); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "Tag", ret); + + return ret; +} + +GstFlowReturn +gst_matroska_read_common_parse_metadata (GstMatroskaReadCommon * common, + GstElement * el, GstEbmlRead * ebml) +{ + GstTagList *taglist; + GstFlowReturn ret = GST_FLOW_OK; + guint32 id; + GList *l; + guint64 curpos; + + curpos = gst_ebml_read_get_pos (ebml); + + /* Make sure we don't parse a tags element twice and + * post it's tags twice */ + curpos = gst_ebml_read_get_pos (ebml); + for (l = common->tags_parsed; l; l = l->next) { + guint64 *pos = l->data; + + if (*pos == curpos) { + GST_DEBUG_OBJECT (common, "Skipping already parsed Tags at offset %" + G_GUINT64_FORMAT, curpos); + return GST_FLOW_OK; + } + } + + common->tags_parsed = + g_list_prepend (common->tags_parsed, g_slice_new (guint64)); + *((guint64 *) common->tags_parsed->data) = curpos; + /* fall-through */ + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "Tags", ret); + return ret; + } + + taglist = gst_tag_list_new (); + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_TAG: + ret = gst_matroska_read_common_parse_metadata_id_tag (common, ebml, + &taglist); + break; + + default: + ret = gst_matroska_read_common_parse_skip (common, ebml, "Tags", id); + break; + /* FIXME: Use to limit the tags to specific pads */ + case GST_MATROSKA_ID_TARGETS: + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "Tags", ret); + + gst_matroska_read_common_found_global_tag (common, el, taglist); + + return ret; +} + +static GstFlowReturn +gst_matroska_read_common_peek_adapter (GstMatroskaReadCommon * common, guint + peek, const guint8 ** data) +{ + *data = gst_adapter_peek (common->adapter, peek); + if (*data == NULL) + return GST_FLOW_UNEXPECTED; + + return GST_FLOW_OK; +} + +/* + * Calls pull_range for (offset,size) without advancing our offset + */ +GstFlowReturn +gst_matroska_read_common_peek_bytes (GstMatroskaReadCommon * common, guint64 + offset, guint size, GstBuffer ** p_buf, guint8 ** bytes) +{ + GstFlowReturn ret; + + /* Caching here actually makes much less difference than one would expect. + * We do it mainly to avoid pulling buffers of 1 byte all the time */ + if (common->cached_buffer) { + guint64 cache_offset = GST_BUFFER_OFFSET (common->cached_buffer); + guint cache_size = GST_BUFFER_SIZE (common->cached_buffer); + + if (cache_offset <= common->offset && + (common->offset + size) <= (cache_offset + cache_size)) { + if (p_buf) + *p_buf = gst_buffer_create_sub (common->cached_buffer, + common->offset - cache_offset, size); + if (bytes) + *bytes = GST_BUFFER_DATA (common->cached_buffer) + common->offset - + cache_offset; + return GST_FLOW_OK; + } + /* not enough data in the cache, free cache and get a new one */ + gst_buffer_unref (common->cached_buffer); + common->cached_buffer = NULL; + } + + /* refill the cache */ + ret = gst_pad_pull_range (common->sinkpad, common->offset, + MAX (size, 64 * 1024), &common->cached_buffer); + if (ret != GST_FLOW_OK) { + common->cached_buffer = NULL; + return ret; + } + + if (GST_BUFFER_SIZE (common->cached_buffer) >= size) { + if (p_buf) + *p_buf = gst_buffer_create_sub (common->cached_buffer, 0, size); + if (bytes) + *bytes = GST_BUFFER_DATA (common->cached_buffer); + return GST_FLOW_OK; + } + + /* Not possible to get enough data, try a last time with + * requesting exactly the size we need */ + gst_buffer_unref (common->cached_buffer); + common->cached_buffer = NULL; + + ret = + gst_pad_pull_range (common->sinkpad, common->offset, size, + &common->cached_buffer); + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (common, "pull_range returned %d", ret); + if (p_buf) + *p_buf = NULL; + if (bytes) + *bytes = NULL; + return ret; + } + + if (GST_BUFFER_SIZE (common->cached_buffer) < size) { + GST_WARNING_OBJECT (common, "Dropping short buffer at offset %" + G_GUINT64_FORMAT ": wanted %u bytes, got %u bytes", common->offset, + size, GST_BUFFER_SIZE (common->cached_buffer)); + + gst_buffer_unref (common->cached_buffer); + common->cached_buffer = NULL; + if (p_buf) + *p_buf = NULL; + if (bytes) + *bytes = NULL; + return GST_FLOW_UNEXPECTED; + } + + if (p_buf) + *p_buf = gst_buffer_create_sub (common->cached_buffer, 0, size); + if (bytes) + *bytes = GST_BUFFER_DATA (common->cached_buffer); + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_matroska_read_common_peek_pull (GstMatroskaReadCommon * common, guint peek, + guint8 ** data) +{ + return gst_matroska_read_common_peek_bytes (common, common->offset, peek, + NULL, data); +} + +GstFlowReturn +gst_matroska_read_common_peek_id_length_pull (GstMatroskaReadCommon * common, + GstElement * el, guint32 * _id, guint64 * _length, guint * _needed) +{ + return gst_ebml_peek_id_length (_id, _length, _needed, + (GstPeekData) gst_matroska_read_common_peek_pull, (gpointer) common, el, + common->offset); +} + +GstFlowReturn +gst_matroska_read_common_peek_id_length_push (GstMatroskaReadCommon * common, + GstElement * el, guint32 * _id, guint64 * _length, guint * _needed) +{ + return gst_ebml_peek_id_length (_id, _length, _needed, + (GstPeekData) gst_matroska_read_common_peek_adapter, (gpointer) common, + el, common->offset); +} + +static GstFlowReturn +gst_matroska_read_common_read_track_encoding (GstMatroskaReadCommon * common, + GstEbmlRead * ebml, GstMatroskaTrackContext * context) +{ + GstMatroskaTrackEncoding enc = { 0, }; + GstFlowReturn ret; + guint32 id; + + DEBUG_ELEMENT_START (common, ebml, "ContentEncoding"); + /* Set default values */ + enc.scope = 1; + /* All other default values are 0 */ + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "ContentEncoding", ret); + return ret; + } + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_CONTENTENCODINGORDER:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (!gst_matroska_read_common_encoding_order_unique (context->encodings, + num)) { + GST_ERROR_OBJECT (common, "ContentEncodingOrder %" G_GUINT64_FORMAT + "is not unique for track %d", num, context->num); + ret = GST_FLOW_ERROR; + break; + } + + GST_DEBUG_OBJECT (common, "ContentEncodingOrder: %" G_GUINT64_FORMAT, + num); + enc.order = num; + break; + } + case GST_MATROSKA_ID_CONTENTENCODINGSCOPE:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num > 7 && num == 0) { + GST_ERROR_OBJECT (common, "Invalid ContentEncodingScope %" + G_GUINT64_FORMAT, num); + ret = GST_FLOW_ERROR; + break; + } + + GST_DEBUG_OBJECT (common, "ContentEncodingScope: %" G_GUINT64_FORMAT, + num); + enc.scope = num; + + break; + } + case GST_MATROSKA_ID_CONTENTENCODINGTYPE:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + if (num > 1) { + GST_ERROR_OBJECT (common, "Invalid ContentEncodingType %" + G_GUINT64_FORMAT, num); + ret = GST_FLOW_ERROR; + break; + } else if (num != 0) { + GST_ERROR_OBJECT (common, "Encrypted tracks are not supported yet"); + ret = GST_FLOW_ERROR; + break; + } + GST_DEBUG_OBJECT (common, "ContentEncodingType: %" G_GUINT64_FORMAT, + num); + enc.type = num; + break; + } + case GST_MATROSKA_ID_CONTENTCOMPRESSION:{ + + DEBUG_ELEMENT_START (common, ebml, "ContentCompression"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) + break; + + while (ret == GST_FLOW_OK && + gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_CONTENTCOMPALGO:{ + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) { + break; + } + if (num > 3) { + GST_ERROR_OBJECT (common, "Invalid ContentCompAlgo %" + G_GUINT64_FORMAT, num); + ret = GST_FLOW_ERROR; + break; + } + GST_DEBUG_OBJECT (common, "ContentCompAlgo: %" G_GUINT64_FORMAT, + num); + enc.comp_algo = num; + + break; + } + case GST_MATROSKA_ID_CONTENTCOMPSETTINGS:{ + guint8 *data; + guint64 size; + + if ((ret = + gst_ebml_read_binary (ebml, &id, &data, + &size)) != GST_FLOW_OK) { + break; + } + enc.comp_settings = data; + enc.comp_settings_length = size; + GST_DEBUG_OBJECT (common, + "ContentCompSettings of size %" G_GUINT64_FORMAT, size); + break; + } + default: + GST_WARNING_OBJECT (common, + "Unknown ContentCompression subelement 0x%x - ignoring", id); + ret = gst_ebml_read_skip (ebml); + break; + } + } + DEBUG_ELEMENT_STOP (common, ebml, "ContentCompression", ret); + break; + } + + case GST_MATROSKA_ID_CONTENTENCRYPTION: + GST_ERROR_OBJECT (common, "Encrypted tracks not yet supported"); + gst_ebml_read_skip (ebml); + ret = GST_FLOW_ERROR; + break; + default: + GST_WARNING_OBJECT (common, + "Unknown ContentEncoding subelement 0x%x - ignoring", id); + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "ContentEncoding", ret); + if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) + return ret; + + /* TODO: Check if the combination of values is valid */ + + g_array_append_val (context->encodings, enc); + + return ret; +} + +GstFlowReturn +gst_matroska_read_common_read_track_encodings (GstMatroskaReadCommon * common, + GstEbmlRead * ebml, GstMatroskaTrackContext * context) +{ + GstFlowReturn ret; + guint32 id; + + DEBUG_ELEMENT_START (common, ebml, "ContentEncodings"); + + if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { + DEBUG_ELEMENT_STOP (common, ebml, "ContentEncodings", ret); + return ret; + } + + context->encodings = + g_array_sized_new (FALSE, FALSE, sizeof (GstMatroskaTrackEncoding), 1); + + while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { + if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) + break; + + switch (id) { + case GST_MATROSKA_ID_CONTENTENCODING: + ret = gst_matroska_read_common_read_track_encoding (common, ebml, + context); + break; + default: + GST_WARNING_OBJECT (common, + "Unknown ContentEncodings subelement 0x%x - ignoring", id); + ret = gst_ebml_read_skip (ebml); + break; + } + } + + DEBUG_ELEMENT_STOP (common, ebml, "ContentEncodings", ret); + if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) + return ret; + + /* Sort encodings according to their order */ + g_array_sort (context->encodings, + (GCompareFunc) gst_matroska_read_common_encoding_cmp); + + return gst_matroska_decode_content_encodings (context->encodings); +} + +/* call with object lock held */ +void +gst_matroska_read_common_reset_streams (GstMatroskaReadCommon * common, + GstClockTime time, gboolean full) +{ + gint i; + + GST_DEBUG_OBJECT (common, "resetting stream state"); + + g_assert (common->src->len == common->num_streams); + for (i = 0; i < common->src->len; i++) { + GstMatroskaTrackContext *context = g_ptr_array_index (common->src, i); + context->pos = time; + context->set_discont = TRUE; + context->eos = FALSE; + context->from_time = GST_CLOCK_TIME_NONE; + +#ifdef MKV_DEMUX_MODIFICATION + context->found_next_kframe = FALSE; + context->num_frames_bw_keyframes = 0; + context->avg_duration_bw_keyframes = GST_CLOCK_TIME_NONE; + context->frames_to_show_bw_keyframes = 0; + context->prev_kframe_timestamp = GST_CLOCK_TIME_NONE; + context->next_kframe_timestamp = GST_CLOCK_TIME_NONE; + context->last_ts = GST_CLOCK_TIME_NONE; +#endif + + if (full) + context->last_flow = GST_FLOW_OK; + if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) context; + /* demux object lock held by caller */ + videocontext->earliest_time = GST_CLOCK_TIME_NONE; + } + } +} + +gboolean +gst_matroska_read_common_tracknumber_unique (GstMatroskaReadCommon * common, + guint64 num) +{ + gint i; + + g_assert (common->src->len == common->num_streams); + for (i = 0; i < common->src->len; i++) { + GstMatroskaTrackContext *context = g_ptr_array_index (common->src, i); + + if (context->num == num) + return FALSE; + } + + return TRUE; +} diff --git a/gst/matroska/matroska-read-common.h b/gst/matroska/matroska-read-common.h new file mode 100644 index 0000000..cf617e6 --- /dev/null +++ b/gst/matroska/matroska-read-common.h @@ -0,0 +1,139 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * (c) 2011 Debarshi Ray + * + * matroska-read-common.h: shared by matroska file/stream demuxer and parser + * + * 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_MATROSKA_READ_COMMON_H__ +#define __GST_MATROSKA_READ_COMMON_H__ + +#include +#include +#include + +#include "matroska-ids.h" + +G_BEGIN_DECLS + +GST_DEBUG_CATEGORY_EXTERN(matroskareadcommon_debug); + +typedef enum { + GST_MATROSKA_READ_STATE_START, + GST_MATROSKA_READ_STATE_SEGMENT, + GST_MATROSKA_READ_STATE_HEADER, + GST_MATROSKA_READ_STATE_DATA, + GST_MATROSKA_READ_STATE_SEEK, + GST_MATROSKA_READ_STATE_SCANNING +} GstMatroskaReadState; + +typedef struct _GstMatroskaReadCommon { + GstIndex *element_index; + gint element_index_writer_id; + + /* pads */ + GstPad *sinkpad; + GPtrArray *src; + guint num_streams; + + /* metadata */ + gchar *muxing_app; + gchar *writing_app; + gint64 created; + + /* state */ + GstMatroskaReadState state; + + /* did we parse cues/tracks/segmentinfo already? */ + gboolean index_parsed; + gboolean segmentinfo_parsed; + gboolean attachments_parsed; + GList *tags_parsed; + + /* start-of-segment */ + guint64 ebml_segment_start; + + /* a cue (index) table */ + GArray *index; + + /* timescale in the file */ + guint64 time_scale; + + /* keeping track of playback position */ + GstSegment segment; + + GstTagList *global_tags; + + /* pull mode caching */ + GstBuffer *cached_buffer; + + /* push and pull mode */ + guint64 offset; + + /* push based mode usual suspects */ + GstAdapter *adapter; +} GstMatroskaReadCommon; + +GstFlowReturn gst_matroska_decode_content_encodings (GArray * encodings); +gboolean gst_matroska_decode_data (GArray * encodings, guint8 ** data_out, + guint * size_out, GstMatroskaTrackEncodingScope scope, gboolean free); +gint gst_matroska_index_seek_find (GstMatroskaIndex * i1, GstClockTime * time, + gpointer user_data); +GstMatroskaIndex * gst_matroska_read_common_do_index_seek ( + GstMatroskaReadCommon * common, GstMatroskaTrackContext * track, gint64 + seek_pos, GArray ** _index, gint * _entry_index); +void gst_matroska_read_common_found_global_tag (GstMatroskaReadCommon * common, + GstElement * el, GstTagList * taglist); +gint64 gst_matroska_read_common_get_length (GstMatroskaReadCommon * common); +GstMatroskaTrackContext * gst_matroska_read_common_get_seek_track ( + GstMatroskaReadCommon * common, GstMatroskaTrackContext * track); +GstFlowReturn gst_matroska_read_common_parse_index (GstMatroskaReadCommon * + common, GstEbmlRead * ebml); +GstFlowReturn gst_matroska_read_common_parse_info (GstMatroskaReadCommon * + common, GstElement * el, GstEbmlRead * ebml); +GstFlowReturn gst_matroska_read_common_parse_attachments ( + GstMatroskaReadCommon * common, GstElement * el, GstEbmlRead * ebml); +GstFlowReturn gst_matroska_read_common_parse_chapters (GstMatroskaReadCommon * + common, GstEbmlRead * ebml); +GstFlowReturn gst_matroska_read_common_parse_header (GstMatroskaReadCommon * + common, GstEbmlRead * ebml); +GstFlowReturn gst_matroska_read_common_parse_metadata (GstMatroskaReadCommon * + common, GstElement * el, GstEbmlRead * ebml); +GstFlowReturn gst_matroska_read_common_parse_skip (GstMatroskaReadCommon * + common, GstEbmlRead * ebml, const gchar * parent_name, guint id); +GstFlowReturn gst_matroska_read_common_peek_bytes (GstMatroskaReadCommon * + common, guint64 offset, guint size, GstBuffer ** p_buf, guint8 ** bytes); +GstFlowReturn gst_matroska_read_common_peek_id_length_pull (GstMatroskaReadCommon * + common, GstElement * el, guint32 * _id, guint64 * _length, guint * + _needed); +GstFlowReturn gst_matroska_read_common_peek_id_length_push (GstMatroskaReadCommon * + common, GstElement * el, guint32 * _id, guint64 * _length, guint * + _needed); +gint gst_matroska_read_common_stream_from_num (GstMatroskaReadCommon * common, + guint track_num); +GstFlowReturn gst_matroska_read_common_read_track_encodings ( + GstMatroskaReadCommon * common, GstEbmlRead * ebml, + GstMatroskaTrackContext * context); +void gst_matroska_read_common_reset_streams (GstMatroskaReadCommon * common, + GstClockTime time, gboolean full); +gboolean gst_matroska_read_common_tracknumber_unique (GstMatroskaReadCommon * + common, guint64 num); + +G_END_DECLS + +#endif /* __GST_MATROSKA_READ_COMMON_H__ */ diff --git a/gst/matroska/matroska.c b/gst/matroska/matroska.c new file mode 100644 index 0000000..5391400 --- /dev/null +++ b/gst/matroska/matroska.c @@ -0,0 +1,61 @@ +/* GStreamer Matroska muxer/demuxer + * (c) 2003 Ronald Bultje + * + * matroska.c: plugin loader + * + * 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 "matroska-demux.h" +#include "matroska-parse.h" +#include "matroska-read-common.h" +#include "matroska-mux.h" +#include "matroska-ids.h" +#include "webm-mux.h" + +#include + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret; + + gst_pb_utils_init (); + + gst_matroska_register_tags (); + + GST_DEBUG_CATEGORY_INIT (matroskareadcommon_debug, "matroskareadcommon", 0, + "Matroska demuxer/parser shared debug"); + + ret = gst_matroska_demux_plugin_init (plugin); + ret &= gst_matroska_parse_plugin_init (plugin); + ret &= gst_element_register (plugin, "matroskamux", GST_RANK_PRIMARY, + GST_TYPE_MATROSKA_MUX); + ret &= gst_element_register (plugin, "webmmux", GST_RANK_PRIMARY, + GST_TYPE_WEBM_MUX); + + return ret; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "matroska", + "Matroska and WebM stream handling", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/matroska/webm-mux.c b/gst/matroska/webm-mux.c new file mode 100644 index 0000000..885c651 --- /dev/null +++ b/gst/matroska/webm-mux.c @@ -0,0 +1,105 @@ +/* GStreamer WebM muxer + * Copyright (c) 2010 Sebastian Dröge + * + * 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-webmmux + * + * webmmux muxes VP8 video and Vorbis audio streams into a WebM file. + * + * + * Example launch line + * |[ + * gst-launch-0.10 webmmux name=mux ! filesink location=newfile.webm \ + * uridecodebin uri=file:///path/to/somefile.ogv name=demux \ + * demux. ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0 \ + * demux. ! progressreport ! audioconvert ! audiorate ! vorbisenc ! queue ! mux.audio_0 + * ]| This pipeline re-encodes a video file of any format into a WebM file. + * |[ + * gst-launch-0.10 webmmux name=mux ! filesink location=test.webm \ + * videotestsrc num-buffers=250 ! video/x-raw-yuv,framerate=25/1 ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0 \ + * audiotestsrc samplesperbuffer=44100 num-buffers=10 ! audio/x-raw-float,rate=44100 ! vorbisenc ! queue ! mux.audio_0 + * ]| This pipeline muxes a test video and a sine wave into a WebM file. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "webm-mux.h" + +#define COMMON_VIDEO_CAPS \ + "width = (int) [ 16, 4096 ], " \ + "height = (int) [ 16, 4096 ], " \ + "framerate = (fraction) [ 0, MAX ]" + +#define COMMON_AUDIO_CAPS \ + "channels = (int) [ 1, MAX ], " \ + "rate = (int) [ 1, MAX ]" + +GST_BOILERPLATE (GstWebMMux, gst_webm_mux, GstMatroskaMux, + GST_TYPE_MATROSKA_MUX); + +static GstStaticPadTemplate webm_src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/webm") + ); + +static GstStaticPadTemplate webm_videosink_templ = +GST_STATIC_PAD_TEMPLATE ("video_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("video/x-vp8, " COMMON_VIDEO_CAPS) + ); + +static GstStaticPadTemplate webm_audiosink_templ = +GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/x-vorbis, " COMMON_AUDIO_CAPS) + ); + +static void +gst_webm_mux_base_init (gpointer g_class) +{ +} + +static void +gst_webm_mux_class_init (GstWebMMuxClass * klass) +{ + GstElementClass *gstelement_class = (GstElementClass *) klass; + + gst_element_class_add_static_pad_template (gstelement_class, + &webm_videosink_templ); + gst_element_class_add_static_pad_template (gstelement_class, + &webm_audiosink_templ); + gst_element_class_add_static_pad_template (gstelement_class, + &webm_src_templ); + gst_element_class_set_details_simple (gstelement_class, "WebM muxer", + "Codec/Muxer", + "Muxes video and audio streams into a WebM stream", + "GStreamer maintainers "); +} + +static void +gst_webm_mux_init (GstWebMMux * mux, GstWebMMuxClass * g_class) +{ + GST_MATROSKA_MUX (mux)->doctype = GST_MATROSKA_DOCTYPE_WEBM; +} diff --git a/gst/matroska/webm-mux.h b/gst/matroska/webm-mux.h new file mode 100644 index 0000000..cb007b0 --- /dev/null +++ b/gst/matroska/webm-mux.h @@ -0,0 +1,49 @@ +/* GStreamer WebM muxer + * Copyright (c) 2010 Sebastian Dröge + * + * 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_WEBM_MUX_H__ +#define __GST_WEBM_MUX_H__ + +#include "matroska-mux.h" + +#define GST_TYPE_WEBM_MUX \ + (gst_webm_mux_get_type ()) +#define GST_WEBM_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WEBM_MUX, GstWebMMux)) +#define GST_WEBM_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WEBM_MUX, GstWebMMuxClass)) +#define GST_IS_WEBM_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WEBM_MUX)) +#define GST_IS_WEBM_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WEBM_MUX)) + +typedef struct _GstWebMMux GstWebMMux; +typedef struct _GstWebMMuxClass GstWebMMuxClass; + +struct _GstWebMMux { + GstMatroskaMux matroskamux; +}; + +struct _GstWebMMuxClass { + GstMatroskaMuxClass matroskamuxclass; +}; + +GType gst_webm_mux_get_type (void); + +#endif /* __GST_WEBM_MUX_H__ */ diff --git a/gst/monoscope/Makefile.am b/gst/monoscope/Makefile.am new file mode 100644 index 0000000..f869469 --- /dev/null +++ b/gst/monoscope/Makefile.am @@ -0,0 +1,24 @@ +plugin_LTLIBRARIES = libgstmonoscope.la + +libgstmonoscope_la_SOURCES = gstmonoscope.c monoscope.c convolve.c + +noinst_HEADERS = gstmonoscope.h monoscope.h convolve.h + +libgstmonoscope_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) +libgstmonoscope_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstmonoscope_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmonoscope_la_LIBTOOLFLAGS = --tag=disable-static + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstmonoscope -:SHARED libgstmonoscope \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmonoscope_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmonoscope_la_CFLAGS) \ + -:LDFLAGS $(libgstmonoscope_la_LDFLAGS) \ + $(libgstmonoscope_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/monoscope/Makefile.in b/gst/monoscope/Makefile.in new file mode 100644 index 0000000..c49327e --- /dev/null +++ b/gst/monoscope/Makefile.in @@ -0,0 +1,836 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/monoscope +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstmonoscope_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstmonoscope_la_OBJECTS = libgstmonoscope_la-gstmonoscope.lo \ + libgstmonoscope_la-monoscope.lo libgstmonoscope_la-convolve.lo +libgstmonoscope_la_OBJECTS = $(am_libgstmonoscope_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstmonoscope_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) \ + $(libgstmonoscope_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstmonoscope_la_SOURCES) +DIST_SOURCES = $(libgstmonoscope_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstmonoscope.la +libgstmonoscope_la_SOURCES = gstmonoscope.c monoscope.c convolve.c +noinst_HEADERS = gstmonoscope.h monoscope.h convolve.h +libgstmonoscope_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) +libgstmonoscope_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstmonoscope_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmonoscope_la_LIBTOOLFLAGS = --tag=disable-static +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/monoscope/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/monoscope/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstmonoscope.la: $(libgstmonoscope_la_OBJECTS) $(libgstmonoscope_la_DEPENDENCIES) $(EXTRA_libgstmonoscope_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstmonoscope_la_LINK) -rpath $(plugindir) $(libgstmonoscope_la_OBJECTS) $(libgstmonoscope_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmonoscope_la-convolve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmonoscope_la-gstmonoscope.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmonoscope_la-monoscope.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstmonoscope_la-gstmonoscope.lo: gstmonoscope.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -MT libgstmonoscope_la-gstmonoscope.lo -MD -MP -MF $(DEPDIR)/libgstmonoscope_la-gstmonoscope.Tpo -c -o libgstmonoscope_la-gstmonoscope.lo `test -f 'gstmonoscope.c' || echo '$(srcdir)/'`gstmonoscope.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmonoscope_la-gstmonoscope.Tpo $(DEPDIR)/libgstmonoscope_la-gstmonoscope.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmonoscope.c' object='libgstmonoscope_la-gstmonoscope.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -c -o libgstmonoscope_la-gstmonoscope.lo `test -f 'gstmonoscope.c' || echo '$(srcdir)/'`gstmonoscope.c + +libgstmonoscope_la-monoscope.lo: monoscope.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -MT libgstmonoscope_la-monoscope.lo -MD -MP -MF $(DEPDIR)/libgstmonoscope_la-monoscope.Tpo -c -o libgstmonoscope_la-monoscope.lo `test -f 'monoscope.c' || echo '$(srcdir)/'`monoscope.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmonoscope_la-monoscope.Tpo $(DEPDIR)/libgstmonoscope_la-monoscope.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='monoscope.c' object='libgstmonoscope_la-monoscope.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -c -o libgstmonoscope_la-monoscope.lo `test -f 'monoscope.c' || echo '$(srcdir)/'`monoscope.c + +libgstmonoscope_la-convolve.lo: convolve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -MT libgstmonoscope_la-convolve.lo -MD -MP -MF $(DEPDIR)/libgstmonoscope_la-convolve.Tpo -c -o libgstmonoscope_la-convolve.lo `test -f 'convolve.c' || echo '$(srcdir)/'`convolve.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmonoscope_la-convolve.Tpo $(DEPDIR)/libgstmonoscope_la-convolve.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='convolve.c' object='libgstmonoscope_la-convolve.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -c -o libgstmonoscope_la-convolve.lo `test -f 'convolve.c' || echo '$(srcdir)/'`convolve.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstmonoscope -:SHARED libgstmonoscope \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmonoscope_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmonoscope_la_CFLAGS) \ + -:LDFLAGS $(libgstmonoscope_la_LDFLAGS) \ + $(libgstmonoscope_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/monoscope/README b/gst/monoscope/README new file mode 100644 index 0000000..5c85e80 --- /dev/null +++ b/gst/monoscope/README @@ -0,0 +1,13 @@ +This is a visualization based on on the monoscope output plugin from +alsaplayer. + +The monoscope convolution matching code was written by Ralph Loader. + +The monoscope.c and monoscope.h files are under the BSD license (without advertising clause). + +This implementation is taken from alsaplayer version 0.99.54, at +http://www.alsaplayer.org/ + +Note: only one instance of this plugin may be created at a time: it has a +lot of static data. This should be fixed (and it shouldn't be hard to do +so, either). diff --git a/gst/monoscope/convolve.c b/gst/monoscope/convolve.c new file mode 100644 index 0000000..584f680 --- /dev/null +++ b/gst/monoscope/convolve.c @@ -0,0 +1,346 @@ +/* Karatsuba convolution + * + * Copyright (C) 1999 Ralph Loader + * + * 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. + * + * + * Note: 7th December 2004: This file used to be licensed under the GPL, + * but we got permission from Ralp Loader to relicense it to LGPL. + * + * $Id$ + * + */ + +/* The algorithm is based on the following. For the convolution of a pair + * of pairs, (a,b) * (c,d) = (0, a.c, a.d+b.c, b.d), we can reduce the four + * multiplications to three, by the formulae a.d+b.c = (a+b).(c+d) - a.c - + * b.d. A similar relation enables us to compute a 2n by 2n convolution + * using 3 n by n convolutions, and thus a 2^n by 2^n convolution using 3^n + * multiplications (as opposed to the 4^n that the quadratic algorithm + * takes. */ + +/* For large n, this is slower than the O(n log n) that the FFT method + * takes, but we avoid using complex numbers, and we only have to compute + * one convolution, as opposed to 3 FFTs. We have good locality-of- + * reference as well, which will help on CPUs with tiny caches. */ + +/* E.g., for a 512 x 512 convolution, the FFT method takes 55 * 512 = 28160 + * (real) multiplications, as opposed to 3^9 = 19683 for the Karatsuba + * algorithm. We actually want 257 outputs of a 256 x 512 convolution; + * that doesn't appear to give an easy advantage for the FFT algorithm, but + * for the Karatsuba algorithm, it's easy to use two 256 x 256 + * convolutions, taking 2 x 3^8 = 12312 multiplications. [This difference + * is that the FFT method "wraps" the arrays, doing a 2^n x 2^n -> 2^n, + * while the Karatsuba algorithm pads with zeros, doing 2^n x 2^n -> 2.2^n + * - 1]. */ + +/* There's a big lie above, actually... for a 4x4 convolution, it's quicker + * to do it using 16 multiplications than the more complex Karatsuba + * algorithm... So the recursion bottoms out at 4x4s. This increases the + * number of multiplications by a factor of 16/9, but reduces the overheads + * dramatically. */ + +/* The convolution algorithm is implemented as a stack machine. We have a + * stack of commands, each in one of the forms "do a 2^n x 2^n + * convolution", or "combine these three length 2^n outputs into one + * 2^{n+1} output." */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "convolve.h" + +typedef union stack_entry_s +{ + struct + { + const double *left, *right; + double *out; + } + v; + struct + { + double *main, *null; + } + b; + +} +stack_entry; + +#define STACK_SIZE (CONVOLVE_DEPTH * 3) + +struct _struct_convolve_state +{ + double left[CONVOLVE_BIG]; + double right[CONVOLVE_SMALL * 3]; + double scratch[CONVOLVE_SMALL * 3]; + stack_entry stack[STACK_SIZE + 1]; +}; + +/* + * Initialisation routine - sets up tables and space to work in. + * Returns a pointer to internal state, to be used when performing calls. + * On error, returns NULL. + * The pointer should be freed when it is finished with, by convolve_close(). + */ +convolve_state * +convolve_init (void) +{ + return (convolve_state *) calloc (1, sizeof (convolve_state)); +} + +/* + * Free the state allocated with convolve_init(). + */ +void +convolve_close (convolve_state * state) +{ + free (state); +} + +static void +convolve_4 (double *out, const double *left, const double *right) +/* This does a 4x4 -> 7 convolution. For what it's worth, the slightly odd + * ordering gives about a 1% speed up on my Pentium II. */ +{ + double l0, l1, l2, l3, r0, r1, r2, r3; + double a; + + l0 = left[0]; + r0 = right[0]; + a = l0 * r0; + l1 = left[1]; + r1 = right[1]; + out[0] = a; + a = (l0 * r1) + (l1 * r0); + l2 = left[2]; + r2 = right[2]; + out[1] = a; + a = (l0 * r2) + (l1 * r1) + (l2 * r0); + l3 = left[3]; + r3 = right[3]; + out[2] = a; + + out[3] = (l0 * r3) + (l1 * r2) + (l2 * r1) + (l3 * r0); + out[4] = (l1 * r3) + (l2 * r2) + (l3 * r1); + out[5] = (l2 * r3) + (l3 * r2); + out[6] = l3 * r3; +} + +static void +convolve_run (stack_entry * top, unsigned size, double *scratch) +/* Interpret a stack of commands. The stack starts with two entries; the + * convolution to do, and an illegal entry used to mark the stack top. The + * size is the number of entries in each input, and must be a power of 2, + * and at least 8. It is OK to have out equal to left and/or right. + * scratch must have length 3*size. The number of stack entries needed is + * 3n-4 where size=2^n. */ +{ + do { + const double *left; + const double *right; + double *out; + + /* When we get here, the stack top is always a convolve, + * with size > 4. So we will split it. We repeatedly split + * the top entry until we get to size = 4. */ + + left = top->v.left; + right = top->v.right; + out = top->v.out; + top++; + + do { + double *s_left, *s_right; + int i; + + /* Halve the size. */ + size >>= 1; + + /* Allocate the scratch areas. */ + s_left = scratch + size * 3; + /* s_right is a length 2*size buffer also used for + * intermediate output. */ + s_right = scratch + size * 4; + + /* Create the intermediate factors. */ + for (i = 0; i < size; i++) { + double l = left[i] + left[i + size]; + double r = right[i] + right[i + size]; + + s_left[i + size] = r; + s_left[i] = l; + } + + /* Push the combine entry onto the stack. */ + top -= 3; + top[2].b.main = out; + top[2].b.null = NULL; + + /* Push the low entry onto the stack. This must be + * the last of the three sub-convolutions, because + * it may overwrite the arguments. */ + top[1].v.left = left; + top[1].v.right = right; + top[1].v.out = out; + + /* Push the mid entry onto the stack. */ + top[0].v.left = s_left; + top[0].v.right = s_right; + top[0].v.out = s_right; + + /* Leave the high entry in variables. */ + left += size; + right += size; + out += size * 2; + + } while (size > 4); + + /* When we get here, the stack top is a group of 3 + * convolves, with size = 4, followed by some combines. */ + convolve_4 (out, left, right); + convolve_4 (top[0].v.out, top[0].v.left, top[0].v.right); + convolve_4 (top[1].v.out, top[1].v.left, top[1].v.right); + top += 2; + + /* Now process combines. */ + do { + /* b.main is the output buffer, mid is the middle + * part which needs to be adjusted in place, and + * then folded back into the output. We do this in + * a slightly strange way, so as to avoid having + * two loops. */ + double *out = top->b.main; + double *mid = scratch + size * 4; + unsigned int i; + + top++; + out[size * 2 - 1] = 0; + for (i = 0; i < size - 1; i++) { + double lo; + double hi; + + lo = mid[0] - (out[0] + out[2 * size]) + out[size]; + hi = mid[size] - (out[size] + out[3 * size]) + out[2 * size]; + out[size] = lo; + out[2 * size] = hi; + out++; + mid++; + } + size <<= 1; + } while (top->b.null == NULL); + } while (top->b.main != NULL); +} + +int +convolve_match (const int *lastchoice, + const short *input, convolve_state * state) +/* lastchoice is a 256 sized array. input is a 512 array. We find the + * contiguous length 256 sub-array of input that best matches lastchoice. + * A measure of how good a sub-array is compared with the lastchoice is + * given by the sum of the products of each pair of entries. We maximise + * that, by taking an appropriate convolution, and then finding the maximum + * entry in the convolutions. state is a (non-NULL) pointer returned by + * convolve_init. */ +{ + double avg; + double best; + int p = 0; + int i; + double *left = state->left; + double *right = state->right; + double *scratch = state->scratch; + stack_entry *top = state->stack + (STACK_SIZE - 1); + +#if 1 + for (i = 0; i < 512; i++) + left[i] = input[i]; + + avg = 0; + for (i = 0; i < 256; i++) { + double a = lastchoice[255 - i]; + + right[i] = a; + avg += a; + } +#endif + /* We adjust the smaller of the two input arrays to have average + * value 0. This makes the eventual result insensitive to both + * constant offsets and positive multipliers of the inputs. */ + avg /= 256; + for (i = 0; i < 256; i++) + right[i] -= avg; + /* End-of-stack marker. */ + top[1].b.null = scratch; + top[1].b.main = NULL; + /* The low 256x256, of which we want the high 256 outputs. */ + top->v.left = left; + top->v.right = right; + top->v.out = right + 256; + convolve_run (top, 256, scratch); + + /* The high 256x256, of which we want the low 256 outputs. */ + top->v.left = left + 256; + top->v.right = right; + top->v.out = right; + convolve_run (top, 256, scratch); + + /* Now find the best position amoungs this. Apart from the first + * and last, the required convolution outputs are formed by adding + * outputs from the two convolutions above. */ + best = right[511]; + right[767] = 0; + p = -1; + for (i = 0; i < 256; i++) { + double a = right[i] + right[i + 512]; + + if (a > best) { + best = a; + p = i; + } + } + p++; + +#if 0 + { + /* This is some debugging code... */ + int bad = 0; + + best = 0; + for (i = 0; i < 256; i++) + best += ((double) input[i + p]) * ((double) lastchoice[i] - avg); + + for (i = 0; i < 257; i++) { + double tot = 0; + unsigned int j; + + for (j = 0; j < 256; j++) + tot += ((double) input[i + j]) * ((double) lastchoice[j] - avg); + if (tot > best) + printf ("(%i)", i); + if (tot != left[i + 255]) + printf ("!"); + } + + printf ("%i\n", p); + } +#endif + + return p; +} diff --git a/gst/monoscope/convolve.h b/gst/monoscope/convolve.h new file mode 100644 index 0000000..dc934ec --- /dev/null +++ b/gst/monoscope/convolve.h @@ -0,0 +1,54 @@ +/* convolve.h: Header for convolutions. + * + * Copyright (C) 1999 Ralph Loader + * + * 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. + * + * + * Note: 7th December 2004: This file used to be licensed under the GPL, + * but we got permission from Ralp Loader to relicense it to LGPL. + * + * + */ + +#ifndef CONVOLVE_H +#define CONVOLVE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* convolve_match takes two blocks, one twice the size of the other. The + * sizes of these are CONVOLVE_BIG and CONVOLVE_SMALL respectively. */ +#define CONVOLVE_DEPTH 8 +#define CONVOLVE_SMALL (1 << CONVOLVE_DEPTH) +#define CONVOLVE_BIG (CONVOLVE_SMALL * 2) + +/* Convolution stuff */ +typedef struct _struct_convolve_state convolve_state; + +convolve_state *convolve_init (void); +void convolve_close (convolve_state * state); + +int convolve_match (const int * lastchoice, + const short int * input, + convolve_state * state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gst/monoscope/gstmonoscope.c b/gst/monoscope/gstmonoscope.c new file mode 100644 index 0000000..14b003c --- /dev/null +++ b/gst/monoscope/gstmonoscope.c @@ -0,0 +1,553 @@ +/* gstmonoscope.c: implementation of monoscope drawing element + * Copyright (C) <2002> Richard Boulton + * Copyright (C) <2006> Tim-Philipp Müller + * Copyright (C) <2006> Wim Taymans + * + * 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-monoscope + * @see_also: goom + * + * Monoscope is an audio visualisation element. It creates a coloured + * curve of the audio signal like on an oscilloscope. + * + * + * Example launch line + * |[ + * gst-launch -v audiotestsrc ! audioconvert ! monoscope ! ffmpegcolorspace ! ximagesink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include "gstmonoscope.h" +#include "monoscope.h" + +GST_DEBUG_CATEGORY_STATIC (monoscope_debug); +#define GST_CAT_DEFAULT monoscope_debug + +#if G_BYTE_ORDER == G_BIG_ENDIAN +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-rgb, " + "bpp = (int) 32, " + "depth = (int) 24, " + "endianness = (int) BIG_ENDIAN, " + "red_mask = (int) " GST_VIDEO_BYTE2_MASK_32 ", " + "green_mask = (int) " GST_VIDEO_BYTE3_MASK_32 ", " + "blue_mask = (int) " GST_VIDEO_BYTE4_MASK_32 ", " + "width = (int)256, " + "height = (int)128, " "framerate = " GST_VIDEO_FPS_RANGE) + ); +#else +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-rgb, " + "bpp = (int) 32, " + "depth = (int) 24, " + "endianness = (int) BIG_ENDIAN, " + "red_mask = (int) " GST_VIDEO_BYTE3_MASK_32 ", " + "green_mask = (int) " GST_VIDEO_BYTE2_MASK_32 ", " + "blue_mask = (int) " GST_VIDEO_BYTE1_MASK_32 ", " + "width = (int)256, " + "height = (int)128, " "framerate = " GST_VIDEO_FPS_RANGE) + ); +#endif + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS) + ); + + +GST_BOILERPLATE (GstMonoscope, gst_monoscope, GstElement, GST_TYPE_ELEMENT); + +static void gst_monoscope_finalize (GObject * object); +static GstFlowReturn gst_monoscope_chain (GstPad * pad, GstBuffer * buf); +static gboolean gst_monoscope_src_setcaps (GstPad * pad, GstCaps * caps); +static gboolean gst_monoscope_sink_setcaps (GstPad * pad, GstCaps * caps); +static void gst_monoscope_reset (GstMonoscope * monoscope); +static gboolean gst_monoscope_sink_event (GstPad * pad, GstEvent * event); +static gboolean gst_monoscope_src_event (GstPad * pad, GstEvent * event); +static GstStateChangeReturn gst_monoscope_change_state (GstElement * element, + GstStateChange transition); + +static void +gst_monoscope_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_set_details_simple (element_class, "Monoscope", + "Visualization", + "Displays a highly stabilised waveform of audio input", + "Richard Boulton "); +} + +static void +gst_monoscope_class_init (GstMonoscopeClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_monoscope_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_monoscope_change_state); +} + +static void +gst_monoscope_init (GstMonoscope * monoscope, GstMonoscopeClass * klass) +{ + monoscope->sinkpad = + gst_pad_new_from_static_template (&sink_template, "sink"); + gst_pad_set_chain_function (monoscope->sinkpad, + GST_DEBUG_FUNCPTR (gst_monoscope_chain)); + gst_pad_set_event_function (monoscope->sinkpad, + GST_DEBUG_FUNCPTR (gst_monoscope_sink_event)); + gst_pad_set_setcaps_function (monoscope->sinkpad, + GST_DEBUG_FUNCPTR (gst_monoscope_sink_setcaps)); + gst_element_add_pad (GST_ELEMENT (monoscope), monoscope->sinkpad); + + monoscope->srcpad = gst_pad_new_from_static_template (&src_template, "src"); + gst_pad_set_setcaps_function (monoscope->srcpad, + GST_DEBUG_FUNCPTR (gst_monoscope_src_setcaps)); + gst_pad_set_event_function (monoscope->srcpad, + GST_DEBUG_FUNCPTR (gst_monoscope_src_event)); + gst_element_add_pad (GST_ELEMENT (monoscope), monoscope->srcpad); + + monoscope->adapter = gst_adapter_new (); + monoscope->next_ts = GST_CLOCK_TIME_NONE; + monoscope->bps = sizeof (gint16); + + /* reset the initial video state */ + monoscope->width = 256; + monoscope->height = 128; + monoscope->fps_num = 25; /* desired frame rate */ + monoscope->fps_denom = 1; + monoscope->visstate = NULL; + + /* reset the initial audio state */ + monoscope->rate = GST_AUDIO_DEF_RATE; +} + +static void +gst_monoscope_finalize (GObject * object) +{ + GstMonoscope *monoscope = GST_MONOSCOPE (object); + + if (monoscope->visstate) + monoscope_close (monoscope->visstate); + + g_object_unref (monoscope->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_monoscope_reset (GstMonoscope * monoscope) +{ + monoscope->next_ts = GST_CLOCK_TIME_NONE; + + gst_adapter_clear (monoscope->adapter); + gst_segment_init (&monoscope->segment, GST_FORMAT_UNDEFINED); + + GST_OBJECT_LOCK (monoscope); + monoscope->proportion = 1.0; + monoscope->earliest_time = -1; + GST_OBJECT_UNLOCK (monoscope); +} + +static gboolean +gst_monoscope_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstMonoscope *monoscope = GST_MONOSCOPE (GST_PAD_PARENT (pad)); + GstStructure *structure; + + structure = gst_caps_get_structure (caps, 0); + + gst_structure_get_int (structure, "rate", &monoscope->rate); + + GST_DEBUG_OBJECT (monoscope, "sample rate = %d", monoscope->rate); + return TRUE; +} + +static gboolean +gst_monoscope_src_setcaps (GstPad * pad, GstCaps * caps) +{ + GstMonoscope *monoscope = GST_MONOSCOPE (GST_PAD_PARENT (pad)); + GstStructure *structure; + + structure = gst_caps_get_structure (caps, 0); + + gst_structure_get_int (structure, "width", &monoscope->width); + gst_structure_get_int (structure, "height", &monoscope->height); + gst_structure_get_fraction (structure, "framerate", &monoscope->fps_num, + &monoscope->fps_denom); + + monoscope->outsize = monoscope->width * monoscope->height * 4; + monoscope->frame_duration = gst_util_uint64_scale_int (GST_SECOND, + monoscope->fps_denom, monoscope->fps_num); + monoscope->spf = + gst_util_uint64_scale_int (monoscope->rate, monoscope->fps_denom, + monoscope->fps_num); + + GST_DEBUG_OBJECT (monoscope, "dimension %dx%d, framerate %d/%d, spf %d", + monoscope->width, monoscope->height, monoscope->fps_num, + monoscope->fps_denom, monoscope->spf); + + if (monoscope->visstate) { + monoscope_close (monoscope->visstate); + monoscope->visstate = NULL; + } + + monoscope->visstate = monoscope_init (monoscope->width, monoscope->height); + + return (monoscope->visstate != NULL); +} + +static gboolean +gst_monoscope_src_negotiate (GstMonoscope * monoscope) +{ + GstCaps *othercaps, *target; + GstStructure *structure; + const GstCaps *templ; + + templ = gst_pad_get_pad_template_caps (monoscope->srcpad); + + GST_DEBUG_OBJECT (monoscope, "performing negotiation"); + + /* see what the peer can do */ + othercaps = gst_pad_peer_get_caps (monoscope->srcpad); + if (othercaps) { + target = gst_caps_intersect (othercaps, templ); + gst_caps_unref (othercaps); + + if (gst_caps_is_empty (target)) + goto no_format; + + gst_caps_truncate (target); + } else { + target = gst_caps_ref ((GstCaps *) templ); + } + + structure = gst_caps_get_structure (target, 0); + gst_structure_fixate_field_nearest_int (structure, "width", 320); + gst_structure_fixate_field_nearest_int (structure, "height", 240); + gst_structure_fixate_field_nearest_fraction (structure, "framerate", 25, 1); + + gst_pad_set_caps (monoscope->srcpad, target); + gst_caps_unref (target); + + return TRUE; + +no_format: + { + gst_caps_unref (target); + return FALSE; + } +} + +static GstFlowReturn +get_buffer (GstMonoscope * monoscope, GstBuffer ** outbuf) +{ + GstFlowReturn ret; + + if (GST_PAD_CAPS (monoscope->srcpad) == NULL) { + if (!gst_monoscope_src_negotiate (monoscope)) + return GST_FLOW_NOT_NEGOTIATED; + } + + GST_LOG_OBJECT (monoscope, "allocating output buffer of size %d with caps %" + GST_PTR_FORMAT, monoscope->outsize, GST_PAD_CAPS (monoscope->srcpad)); + + ret = + gst_pad_alloc_buffer_and_set_caps (monoscope->srcpad, + GST_BUFFER_OFFSET_NONE, monoscope->outsize, + GST_PAD_CAPS (monoscope->srcpad), outbuf); + + if (ret != GST_FLOW_OK) + return ret; + + if (*outbuf == NULL) + return GST_FLOW_ERROR; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_monoscope_chain (GstPad * pad, GstBuffer * inbuf) +{ + GstFlowReturn flow_ret = GST_FLOW_OK; + GstMonoscope *monoscope; + + monoscope = GST_MONOSCOPE (GST_PAD_PARENT (pad)); + + /* don't try to combine samples from discont buffer */ + if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_DISCONT)) { + gst_adapter_clear (monoscope->adapter); + monoscope->next_ts = GST_CLOCK_TIME_NONE; + } + + /* Match timestamps from the incoming audio */ + if (GST_BUFFER_TIMESTAMP (inbuf) != GST_CLOCK_TIME_NONE) + monoscope->next_ts = GST_BUFFER_TIMESTAMP (inbuf); + + GST_LOG_OBJECT (monoscope, "in buffer has %d samples, ts=%" GST_TIME_FORMAT, + GST_BUFFER_SIZE (inbuf) / monoscope->bps, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (inbuf))); + + gst_adapter_push (monoscope->adapter, inbuf); + inbuf = NULL; + + /* Collect samples until we have enough for an output frame */ + while (flow_ret == GST_FLOW_OK) { + gint16 *samples; + GstBuffer *outbuf = NULL; + guint32 *pixels, avail, bytesperframe; + + avail = gst_adapter_available (monoscope->adapter); + GST_LOG_OBJECT (monoscope, "bytes avail now %u", avail); + + /* do negotiation if not done yet, so ->spf etc. is set */ + if (GST_PAD_CAPS (monoscope->srcpad) == NULL) { + flow_ret = get_buffer (monoscope, &outbuf); + if (flow_ret != GST_FLOW_OK) + goto out; + gst_buffer_unref (outbuf); + outbuf = NULL; + } + + bytesperframe = monoscope->spf * monoscope->bps; + if (avail < bytesperframe) + break; + + /* FIXME: something is wrong with QoS, we are skipping way too much + * stuff even with very low CPU loads */ +#if 0 + if (monoscope->next_ts != -1) { + gboolean need_skip; + gint64 qostime; + + qostime = gst_segment_to_running_time (&monoscope->segment, + GST_FORMAT_TIME, monoscope->next_ts); + + GST_OBJECT_LOCK (monoscope); + /* check for QoS, don't compute buffers that are known to be late */ + need_skip = + GST_CLOCK_TIME_IS_VALID (monoscope->earliest_time) && + qostime <= monoscope->earliest_time; + GST_OBJECT_UNLOCK (monoscope); + + if (need_skip) { + GST_WARNING_OBJECT (monoscope, + "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT, + GST_TIME_ARGS (qostime), GST_TIME_ARGS (monoscope->earliest_time)); + goto skip; + } + } +#endif + + samples = (gint16 *) gst_adapter_peek (monoscope->adapter, bytesperframe); + + if (monoscope->spf < 512) { + gint16 in_data[512], i; + + for (i = 0; i < 512; ++i) { + gdouble off; + + off = ((gdouble) i * (gdouble) monoscope->spf) / 512.0; + in_data[i] = samples[MIN ((guint) off, monoscope->spf)]; + } + pixels = monoscope_update (monoscope->visstate, in_data); + } else { + /* not really correct, but looks much prettier */ + pixels = monoscope_update (monoscope->visstate, samples); + } + + flow_ret = get_buffer (monoscope, &outbuf); + if (flow_ret != GST_FLOW_OK) + goto out; + + memcpy (GST_BUFFER_DATA (outbuf), pixels, monoscope->outsize); + + GST_BUFFER_TIMESTAMP (outbuf) = monoscope->next_ts; + GST_BUFFER_DURATION (outbuf) = monoscope->frame_duration; + + flow_ret = gst_pad_push (monoscope->srcpad, outbuf); + +#if 0 + skip: +#endif + + if (GST_CLOCK_TIME_IS_VALID (monoscope->next_ts)) + monoscope->next_ts += monoscope->frame_duration; + + gst_adapter_flush (monoscope->adapter, bytesperframe); + } + +out: + + return flow_ret; +} + +static gboolean +gst_monoscope_sink_event (GstPad * pad, GstEvent * event) +{ + GstMonoscope *monoscope; + gboolean res; + + monoscope = GST_MONOSCOPE (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_START: + res = gst_pad_push_event (monoscope->srcpad, event); + break; + case GST_EVENT_FLUSH_STOP: + gst_monoscope_reset (monoscope); + res = gst_pad_push_event (monoscope->srcpad, event); + break; + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time; + gboolean update; + + /* the newsegment values are used to clip the input samples + * and to convert the incomming timestamps to running time so + * we can do QoS */ + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + + /* now configure the values */ + gst_segment_set_newsegment_full (&monoscope->segment, update, + rate, arate, format, start, stop, time); + + res = gst_pad_push_event (monoscope->srcpad, event); + break; + } + default: + res = gst_pad_push_event (monoscope->srcpad, event); + break; + } + + gst_object_unref (monoscope); + + return res; +} + +static gboolean +gst_monoscope_src_event (GstPad * pad, GstEvent * event) +{ + GstMonoscope *monoscope; + gboolean res; + + monoscope = GST_MONOSCOPE (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS:{ + gdouble proportion; + GstClockTimeDiff diff; + GstClockTime timestamp; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + /* save stuff for the _chain() function */ + GST_OBJECT_LOCK (monoscope); + monoscope->proportion = proportion; + if (diff >= 0) + /* we're late, this is a good estimate for next displayable + * frame (see part-qos.txt) */ + monoscope->earliest_time = + timestamp + 2 * diff + monoscope->frame_duration; + else + monoscope->earliest_time = timestamp + diff; + GST_OBJECT_UNLOCK (monoscope); + + res = gst_pad_push_event (monoscope->sinkpad, event); + break; + } + default: + res = gst_pad_push_event (monoscope->sinkpad, event); + break; + } + gst_object_unref (monoscope); + + return res; +} + +static GstStateChangeReturn +gst_monoscope_change_state (GstElement * element, GstStateChange transition) +{ + GstMonoscope *monoscope = GST_MONOSCOPE (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_monoscope_reset (monoscope); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (monoscope_debug, "monoscope", 0, + "monoscope element"); + + return gst_element_register (plugin, "monoscope", + GST_RANK_NONE, GST_TYPE_MONOSCOPE); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "monoscope", + "Monoscope visualization", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/monoscope/gstmonoscope.h b/gst/monoscope/gstmonoscope.h new file mode 100644 index 0000000..249757b --- /dev/null +++ b/gst/monoscope/gstmonoscope.h @@ -0,0 +1,82 @@ +/* GStreamer monoscope visualisation element + * Copyright (C) <2002> Richard Boulton + * Copyright (C) <2006> Tim-Philipp Müller + * Copyright (C) <2006> Wim Taymans + * + * 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_MONOSCOPE__ +#define __GST_MONOSCOPE__ + +G_BEGIN_DECLS + +#include +#include + +#define GST_TYPE_MONOSCOPE (gst_monoscope_get_type()) +#define GST_MONOSCOPE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MONOSCOPE,GstMonoscope)) +#define GST_MONOSCOPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MONOSCOPE,GstMonoscopeClass)) +#define GST_IS_MONOSCOPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MONOSCOPE)) +#define GST_IS_MONOSCOPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MONOSCOPE)) + +typedef struct _GstMonoscope GstMonoscope; +typedef struct _GstMonoscopeClass GstMonoscopeClass; + +struct _GstMonoscope +{ + GstElement element; + + /* pads */ + GstPad *sinkpad; + GstPad *srcpad; + + GstAdapter *adapter; + + guint64 next_ts; /* expected timestamp of the next frame */ + guint64 frame_duration; /* video frame duration */ + gint rate; /* sample rate */ + guint bps; /* bytes per sample */ + guint spf; /* samples per video frame */ + + GstSegment segment; + + /* QoS stuff *//* with LOCK */ + gdouble proportion; + GstClockTime earliest_time; + + /* video state */ + gint fps_num; + gint fps_denom; + gint width; + gint height; + guint outsize; + + /* visualisation state */ + struct monoscope_state *visstate; +}; + +struct _GstMonoscopeClass +{ + GstElementClass parent_class; +}; + +GType gst_monoscope_get_type (void); + +G_END_DECLS + +#endif /* __GST_MONOSCOPE__ */ + diff --git a/gst/monoscope/monoscope.c b/gst/monoscope/monoscope.c new file mode 100644 index 0000000..98822d3 --- /dev/null +++ b/gst/monoscope/monoscope.c @@ -0,0 +1,164 @@ +/* monoscope.cpp + * Copyright (C) 2002 Richard Boulton + * Copyright (C) 1998-2001 Andy Lo A Foe + * Original code by Tinic Uro + * + * This code is copied from Alsaplayer. The orginal code was by Tinic Uro and under + * the BSD license without a advertisig clause. Andy Lo A Foe then relicensed the + * code when he used it for Alsaplayer to GPL with Tinic's permission. Richard Boulton + * then took this code and made a GPL plugin out of it. + * + * 7th December 2004 Christian Schaller: Richard Boulton and Andy Lo A Foe gave + * permission to relicense their changes under BSD license so we where able to restore the + * code to Tinic's original BSD license. + * + * This file is under what is known as the BSD license: + * + * Redistribution and use in source and binary forms, with or without modification, i + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "monoscope.h" + +#include +#include + +static void +colors_init (guint32 * colors) +{ + int i; + + for (i = 0; i < 32; i++) { + colors[i] = (i * 8 << 16) + (255 << 8); + colors[i + 31] = (255 << 16) + (((31 - i) * 8) << 8); + } + colors[63] = (40 << 16) + (75 << 8); +} + +struct monoscope_state * +monoscope_init (guint32 resx, guint32 resy) +{ + struct monoscope_state *stateptr; + + /* I didn't program monoscope to only do 256*128, but it works that way */ + g_return_val_if_fail (resx == 256, 0); + g_return_val_if_fail (resy == 128, 0); + stateptr = calloc (1, sizeof (struct monoscope_state)); + if (stateptr == 0) + return 0; + stateptr->cstate = convolve_init (); + colors_init (stateptr->colors); + return stateptr; +} + +void +monoscope_close (struct monoscope_state *stateptr) +{ + convolve_close (stateptr->cstate); + free (stateptr); +} + +guint32 * +monoscope_update (struct monoscope_state *stateptr, gint16 data[512]) +{ + /* Note that CONVOLVE_BIG must == data size here, ie 512. */ + /* Really, we want samples evenly spread over the available data. + * Just taking a continuous chunk will do for now, though. */ + int i; + int foo; + int bar; + int h; + guint32 *loc; + + int factor; + int val; + int max = 1; + short *thisEq; + + memcpy (stateptr->copyEq, data, sizeof (short) * CONVOLVE_BIG); + thisEq = stateptr->copyEq; +#if 1 + val = convolve_match (stateptr->avgEq, stateptr->copyEq, stateptr->cstate); + thisEq += val; +#endif + memset (stateptr->display, 0, 256 * 128 * sizeof (guint32)); + for (i = 0; i < 256; i++) { + foo = thisEq[i] + (stateptr->avgEq[i] >> 1); + stateptr->avgEq[i] = foo; + if (foo < 0) + foo = -foo; + if (foo > max) + max = foo; + } + stateptr->avgMax += max - (stateptr->avgMax >> 8); + if (stateptr->avgMax < max) + stateptr->avgMax = max; /* Avoid overflow */ + factor = 0x7fffffff / stateptr->avgMax; + /* Keep the scaling sensible. */ + if (factor > (1 << 18)) + factor = 1 << 18; + if (factor < (1 << 8)) + factor = 1 << 8; + for (i = 0; i < 256; i++) { + foo = stateptr->avgEq[i] * factor; + foo >>= 18; + if (foo > 63) + foo = 63; + if (foo < -63) + foo = -63; + val = (i + ((foo + 64) << 8)); + bar = val; + if ((bar > 0) && (bar < (256 * 128))) { + loc = stateptr->display + bar; + if (foo < 0) { + for (h = 0; h <= (-foo); h++) { + *loc = stateptr->colors[h]; + loc += 256; + } + } else { + for (h = 0; h <= foo; h++) { + *loc = stateptr->colors[h]; + loc -= 256; + } + } + } + } + + /* Draw grid. */ + for (i = 16; i < 128; i += 16) { + for (h = 0; h < 256; h += 2) { + stateptr->display[(i << 8) + h] = stateptr->colors[63]; + if (i == 64) + stateptr->display[(i << 8) + h + 1] = stateptr->colors[63]; + } + } + for (i = 16; i < 256; i += 16) { + for (h = 0; h < 128; h += 2) { + stateptr->display[i + (h << 8)] = stateptr->colors[63]; + } + } + + return stateptr->display; +} diff --git a/gst/monoscope/monoscope.h b/gst/monoscope/monoscope.h new file mode 100644 index 0000000..8e7d759 --- /dev/null +++ b/gst/monoscope/monoscope.h @@ -0,0 +1,24 @@ +#ifndef _MONOSCOPE_H +#define _MONOSCOPE_H + +#include +#include "convolve.h" + +#define scope_width 256 +#define scope_height 128 + +struct monoscope_state { + gint16 copyEq[CONVOLVE_BIG]; + int avgEq[CONVOLVE_SMALL]; /* a running average of the last few. */ + int avgMax; /* running average of max sample. */ + guint32 display[(scope_width + 1) * (scope_height + 1)]; + + convolve_state *cstate; + guint32 colors[64]; +}; + +struct monoscope_state * monoscope_init (guint32 resx, guint32 resy); +guint32 * monoscope_update (struct monoscope_state * stateptr, gint16 data [512]); +void monoscope_close (struct monoscope_state * stateptr); + +#endif diff --git a/gst/multifile/Makefile.am b/gst/multifile/Makefile.am new file mode 100644 index 0000000..3c9e316 --- /dev/null +++ b/gst/multifile/Makefile.am @@ -0,0 +1,30 @@ + +plugin_LTLIBRARIES = libgstmultifile.la + +libgstmultifile_la_SOURCES = \ + gstmultifilesink.c \ + gstmultifilesrc.c \ + gstmultifile.c \ + gstsplitfilesrc.c \ + patternspec.c +libgstmultifile_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS) +libgstmultifile_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(GST_LIBS) $(GIO_LIBS) +libgstmultifile_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmultifile_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstmultifilesrc.h gstmultifilesink.h gstsplitfilesrc.h patternspec.h + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstmultifile -:SHARED libgstmultifile \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmultifile_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmultifile_la_CFLAGS) \ + -:LDFLAGS $(libgstmultifile_la_LDFLAGS) \ + $(libgstmultifile_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/multifile/Makefile.in b/gst/multifile/Makefile.in new file mode 100644 index 0000000..60d4d58 --- /dev/null +++ b/gst/multifile/Makefile.in @@ -0,0 +1,863 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/multifile +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstmultifile_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstmultifile_la_OBJECTS = \ + libgstmultifile_la-gstmultifilesink.lo \ + libgstmultifile_la-gstmultifilesrc.lo \ + libgstmultifile_la-gstmultifile.lo \ + libgstmultifile_la-gstsplitfilesrc.lo \ + libgstmultifile_la-patternspec.lo +libgstmultifile_la_OBJECTS = $(am_libgstmultifile_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstmultifile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstmultifile_la_CFLAGS) $(CFLAGS) \ + $(libgstmultifile_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstmultifile_la_SOURCES) +DIST_SOURCES = $(libgstmultifile_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstmultifile.la +libgstmultifile_la_SOURCES = \ + gstmultifilesink.c \ + gstmultifilesrc.c \ + gstmultifile.c \ + gstsplitfilesrc.c \ + patternspec.c + +libgstmultifile_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS) +libgstmultifile_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(GST_LIBS) $(GIO_LIBS) +libgstmultifile_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmultifile_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstmultifilesrc.h gstmultifilesink.h gstsplitfilesrc.h patternspec.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/multifile/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/multifile/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstmultifile.la: $(libgstmultifile_la_OBJECTS) $(libgstmultifile_la_DEPENDENCIES) $(EXTRA_libgstmultifile_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstmultifile_la_LINK) -rpath $(plugindir) $(libgstmultifile_la_OBJECTS) $(libgstmultifile_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-gstmultifile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-gstmultifilesink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-gstmultifilesrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-gstsplitfilesrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-patternspec.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstmultifile_la-gstmultifilesink.lo: gstmultifilesink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-gstmultifilesink.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-gstmultifilesink.Tpo -c -o libgstmultifile_la-gstmultifilesink.lo `test -f 'gstmultifilesink.c' || echo '$(srcdir)/'`gstmultifilesink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-gstmultifilesink.Tpo $(DEPDIR)/libgstmultifile_la-gstmultifilesink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmultifilesink.c' object='libgstmultifile_la-gstmultifilesink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-gstmultifilesink.lo `test -f 'gstmultifilesink.c' || echo '$(srcdir)/'`gstmultifilesink.c + +libgstmultifile_la-gstmultifilesrc.lo: gstmultifilesrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-gstmultifilesrc.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-gstmultifilesrc.Tpo -c -o libgstmultifile_la-gstmultifilesrc.lo `test -f 'gstmultifilesrc.c' || echo '$(srcdir)/'`gstmultifilesrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-gstmultifilesrc.Tpo $(DEPDIR)/libgstmultifile_la-gstmultifilesrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmultifilesrc.c' object='libgstmultifile_la-gstmultifilesrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-gstmultifilesrc.lo `test -f 'gstmultifilesrc.c' || echo '$(srcdir)/'`gstmultifilesrc.c + +libgstmultifile_la-gstmultifile.lo: gstmultifile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-gstmultifile.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-gstmultifile.Tpo -c -o libgstmultifile_la-gstmultifile.lo `test -f 'gstmultifile.c' || echo '$(srcdir)/'`gstmultifile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-gstmultifile.Tpo $(DEPDIR)/libgstmultifile_la-gstmultifile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmultifile.c' object='libgstmultifile_la-gstmultifile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-gstmultifile.lo `test -f 'gstmultifile.c' || echo '$(srcdir)/'`gstmultifile.c + +libgstmultifile_la-gstsplitfilesrc.lo: gstsplitfilesrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-gstsplitfilesrc.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-gstsplitfilesrc.Tpo -c -o libgstmultifile_la-gstsplitfilesrc.lo `test -f 'gstsplitfilesrc.c' || echo '$(srcdir)/'`gstsplitfilesrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-gstsplitfilesrc.Tpo $(DEPDIR)/libgstmultifile_la-gstsplitfilesrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsplitfilesrc.c' object='libgstmultifile_la-gstsplitfilesrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-gstsplitfilesrc.lo `test -f 'gstsplitfilesrc.c' || echo '$(srcdir)/'`gstsplitfilesrc.c + +libgstmultifile_la-patternspec.lo: patternspec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-patternspec.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-patternspec.Tpo -c -o libgstmultifile_la-patternspec.lo `test -f 'patternspec.c' || echo '$(srcdir)/'`patternspec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-patternspec.Tpo $(DEPDIR)/libgstmultifile_la-patternspec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='patternspec.c' object='libgstmultifile_la-patternspec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-patternspec.lo `test -f 'patternspec.c' || echo '$(srcdir)/'`patternspec.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstmultifile -:SHARED libgstmultifile \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmultifile_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmultifile_la_CFLAGS) \ + -:LDFLAGS $(libgstmultifile_la_LDFLAGS) \ + $(libgstmultifile_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/multifile/gstmultifile.c b/gst/multifile/gstmultifile.c new file mode 100644 index 0000000..7441103 --- /dev/null +++ b/gst/multifile/gstmultifile.c @@ -0,0 +1,52 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2006 Wim Taymans + * 2006 David A. Schleef + * + * gstmultifilesink.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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "gstmultifilesink.h" +#include "gstmultifilesrc.h" +#include "gstsplitfilesrc.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_element_register (plugin, "multifilesrc", GST_RANK_NONE, + gst_multi_file_src_get_type ()); + gst_element_register (plugin, "multifilesink", GST_RANK_NONE, + gst_multi_file_sink_get_type ()); + gst_element_register (plugin, "splitfilesrc", GST_RANK_NONE, + gst_split_file_src_get_type ()); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "multifile", + "Reads/Writes buffers from/to sequentially named files", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/multifile/gstmultifilesink.c b/gst/multifile/gstmultifilesink.c new file mode 100644 index 0000000..2be3b56 --- /dev/null +++ b/gst/multifile/gstmultifilesink.c @@ -0,0 +1,883 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2006 Wim Taymans + * 2006 David A. Schleef + * 2011 Collabora Ltd. + * + * gstmultifilesink.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. + */ +/** + * SECTION:element-multifilesink + * @see_also: #GstFileSrc + * + * Write incoming data to a series of sequentially-named files. + * + * The filename property should contain a string with a \%d placeholder that will + * be substituted with the index for each filename. + * + * If the #GstMultiFileSink:post-messages property is #TRUE, it sends an application + * message named + * "GstMultiFileSink" after writing each + * buffer. + * + * The message's structure contains these fields: + * + * + * + * #gchar * + * "filename": + * the filename where the buffer was written. + * + * + * + * + * #gint + * "index": + * the index of the buffer. + * + * + * + * + * #GstClockTime + * "timestamp": + * the timestamp of the buffer. + * + * + * + * + * #GstClockTime + * "stream-time": + * the stream time of the buffer. + * + * + * + * + * #GstClockTime + * "running-time": + * the running_time of the buffer. + * + * + * + * + * #GstClockTime + * "duration": + * the duration of the buffer. + * + * + * + * + * #guint64 + * "offset": + * the offset of the buffer that triggered the message. + * + * + * + * + * #guint64 + * "offset-end": + * the offset-end of the buffer that triggered the message. + * + * + * + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc ! multifilesink + * gst-launch videotestsrc ! multifilesink post-messages=true filename="frame%d" + * ]| + * + * + * Last reviewed on 2009-09-11 (0.10.17) + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include +#include +#include +#include "gstmultifilesink.h" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GST_DEBUG_CATEGORY_STATIC (gst_multi_file_sink_debug); +#define GST_CAT_DEFAULT gst_multi_file_sink_debug + +#define DEFAULT_LOCATION "%05d" +#define DEFAULT_INDEX 0 +#define DEFAULT_POST_MESSAGES FALSE +#define DEFAULT_NEXT_FILE GST_MULTI_FILE_SINK_NEXT_BUFFER +#define DEFAULT_MAX_FILES 0 +#define DEFAULT_MAX_FILE_SIZE G_GUINT64_CONSTANT(2*1024*1024*1024) + +enum +{ + PROP_0, + PROP_LOCATION, + PROP_INDEX, + PROP_POST_MESSAGES, + PROP_NEXT_FILE, + PROP_MAX_FILES, + PROP_MAX_FILE_SIZE, + PROP_LAST +}; + +static void gst_multi_file_sink_finalize (GObject * object); + +static void gst_multi_file_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_multi_file_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_multi_file_sink_stop (GstBaseSink * sink); +static GstFlowReturn gst_multi_file_sink_render (GstBaseSink * sink, + GstBuffer * buffer); +static GstFlowReturn gst_multi_file_sink_render_list (GstBaseSink * sink, + GstBufferList * buffer_list); +static gboolean gst_multi_file_sink_set_caps (GstBaseSink * sink, + GstCaps * caps); +static gboolean gst_multi_file_sink_open_next_file (GstMultiFileSink * + multifilesink); +static void gst_multi_file_sink_close_file (GstMultiFileSink * multifilesink, + GstBuffer * buffer); +static void gst_multi_file_sink_ensure_max_files (GstMultiFileSink * + multifilesink); +static gboolean gst_multi_file_sink_event (GstBaseSink * sink, + GstEvent * event); + +#define GST_TYPE_MULTI_FILE_SINK_NEXT (gst_multi_file_sink_next_get_type ()) +static GType +gst_multi_file_sink_next_get_type (void) +{ + static GType multi_file_sync_next_type = 0; + static const GEnumValue next_types[] = { + {GST_MULTI_FILE_SINK_NEXT_BUFFER, "New file for each buffer", "buffer"}, + {GST_MULTI_FILE_SINK_NEXT_DISCONT, "New file after each discontinuity", + "discont"}, + {GST_MULTI_FILE_SINK_NEXT_KEY_FRAME, "New file at each key frame " + "(Useful for MPEG-TS segmenting)", "key-frame"}, + {GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT, + "New file after a force key unit event", "key-unit-event"}, + {GST_MULTI_FILE_SINK_NEXT_MAX_SIZE, "New file when the configured maximum " + "file size would be exceeded with the next buffer or buffer list", + "max-size"}, + {0, NULL, NULL} + }; + + if (!multi_file_sync_next_type) { + multi_file_sync_next_type = + g_enum_register_static ("GstMultiFileSinkNext", next_types); + } + + return multi_file_sync_next_type; +} + +GST_BOILERPLATE (GstMultiFileSink, gst_multi_file_sink, GstBaseSink, + GST_TYPE_BASE_SINK); + +static void +gst_multi_file_sink_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + GST_DEBUG_CATEGORY_INIT (gst_multi_file_sink_debug, "multifilesink", 0, + "multifilesink element"); + + gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate); + gst_element_class_set_details_simple (gstelement_class, "Multi-File Sink", + "Sink/File", + "Write buffers to a sequentially named set of files", + "David Schleef "); +} + +static void +gst_multi_file_sink_class_init (GstMultiFileSinkClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass); + + gobject_class->set_property = gst_multi_file_sink_set_property; + gobject_class->get_property = gst_multi_file_sink_get_property; + + g_object_class_install_property (gobject_class, PROP_LOCATION, + g_param_spec_string ("location", "File Location", + "Location of the file to write", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INDEX, + g_param_spec_int ("index", "Index", + "Index to use with location property to create file names. The " + "index is incremented by one for each buffer written.", + 0, G_MAXINT, DEFAULT_INDEX, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstMultiFileSink:post-messages + * + * Post a message on the GstBus for each file. + * + * Since: 0.10.17 + */ + g_object_class_install_property (gobject_class, PROP_POST_MESSAGES, + g_param_spec_boolean ("post-messages", "Post Messages", + "Post a message for each file with information of the buffer", + DEFAULT_POST_MESSAGES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstMultiFileSink:next-file + * + * When to start a new file. + * + * Since: 0.10.17 + */ + g_object_class_install_property (gobject_class, PROP_NEXT_FILE, + g_param_spec_enum ("next-file", "Next File", + "When to start a new file", + GST_TYPE_MULTI_FILE_SINK_NEXT, DEFAULT_NEXT_FILE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS)); + + + /** + * GstMultiFileSink:max-files + * + * Maximum number of files to keep on disk. Once the maximum is reached, old + * files start to be deleted to make room for new ones. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_MAX_FILES, + g_param_spec_uint ("max-files", "Max files", + "Maximum number of files to keep on disk. Once the maximum is reached," + "old files start to be deleted to make room for new ones.", + 0, G_MAXUINT, DEFAULT_MAX_FILES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstMultiFileSink:max-file-size + * + * Maximum file size before starting a new file in max-size mode. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_MAX_FILE_SIZE, + g_param_spec_uint64 ("max-file-size", "Maximum File Size", + "Maximum file size before starting a new file in max-size mode", + 0, G_MAXUINT64, DEFAULT_MAX_FILE_SIZE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gobject_class->finalize = gst_multi_file_sink_finalize; + + gstbasesink_class->get_times = NULL; + gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_multi_file_sink_stop); + gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_multi_file_sink_render); + gstbasesink_class->render_list = + GST_DEBUG_FUNCPTR (gst_multi_file_sink_render_list); + gstbasesink_class->set_caps = + GST_DEBUG_FUNCPTR (gst_multi_file_sink_set_caps); + gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_multi_file_sink_event); +} + +static void +gst_multi_file_sink_init (GstMultiFileSink * multifilesink, + GstMultiFileSinkClass * g_class) +{ + multifilesink->filename = g_strdup (DEFAULT_LOCATION); + multifilesink->index = DEFAULT_INDEX; + multifilesink->post_messages = DEFAULT_POST_MESSAGES; + multifilesink->max_files = DEFAULT_MAX_FILES; + multifilesink->max_file_size = DEFAULT_MAX_FILE_SIZE; + multifilesink->files = NULL; + multifilesink->n_files = 0; + + gst_base_sink_set_sync (GST_BASE_SINK (multifilesink), FALSE); + + multifilesink->next_segment = GST_CLOCK_TIME_NONE; + multifilesink->force_key_unit_count = -1; +} + +static void +gst_multi_file_sink_finalize (GObject * object) +{ + GstMultiFileSink *sink = GST_MULTI_FILE_SINK (object); + + g_free (sink->filename); + g_slist_foreach (sink->files, (GFunc) g_free, NULL); + g_slist_free (sink->files); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_multi_file_sink_set_location (GstMultiFileSink * sink, + const gchar * location) +{ + g_free (sink->filename); + /* FIXME: validate location to have just one %d */ + sink->filename = g_strdup (location); + + return TRUE; +} + +static void +gst_multi_file_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMultiFileSink *sink = GST_MULTI_FILE_SINK (object); + + switch (prop_id) { + case PROP_LOCATION: + gst_multi_file_sink_set_location (sink, g_value_get_string (value)); + break; + case PROP_INDEX: + sink->index = g_value_get_int (value); + break; + case PROP_POST_MESSAGES: + sink->post_messages = g_value_get_boolean (value); + break; + case PROP_NEXT_FILE: + sink->next_file = g_value_get_enum (value); + break; + case PROP_MAX_FILES: + sink->max_files = g_value_get_uint (value); + break; + case PROP_MAX_FILE_SIZE: + sink->max_file_size = g_value_get_uint64 (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_multi_file_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMultiFileSink *sink = GST_MULTI_FILE_SINK (object); + + switch (prop_id) { + case PROP_LOCATION: + g_value_set_string (value, sink->filename); + break; + case PROP_INDEX: + g_value_set_int (value, sink->index); + break; + case PROP_POST_MESSAGES: + g_value_set_boolean (value, sink->post_messages); + break; + case PROP_NEXT_FILE: + g_value_set_enum (value, sink->next_file); + break; + case PROP_MAX_FILES: + g_value_set_uint (value, sink->max_files); + break; + case PROP_MAX_FILE_SIZE: + g_value_set_uint64 (value, sink->max_file_size); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_multi_file_sink_stop (GstBaseSink * sink) +{ + GstMultiFileSink *multifilesink; + int i; + + multifilesink = GST_MULTI_FILE_SINK (sink); + + if (multifilesink->file != NULL) { + fclose (multifilesink->file); + multifilesink->file = NULL; + } + + if (multifilesink->streamheaders) { + for (i = 0; i < multifilesink->n_streamheaders; i++) { + gst_buffer_unref (multifilesink->streamheaders[i]); + } + g_free (multifilesink->streamheaders); + multifilesink->streamheaders = NULL; + } + + multifilesink->force_key_unit_count = -1; + + return TRUE; +} + + +static void +gst_multi_file_sink_post_message_full (GstMultiFileSink * multifilesink, + GstClockTime timestamp, GstClockTime duration, GstClockTime offset, + GstClockTime offset_end, GstClockTime running_time, + GstClockTime stream_time, const char *filename) +{ + GstStructure *s; + + if (!multifilesink->post_messages) + return; + + s = gst_structure_new ("GstMultiFileSink", + "filename", G_TYPE_STRING, filename, + "index", G_TYPE_INT, multifilesink->index, + "timestamp", G_TYPE_UINT64, timestamp, + "stream-time", G_TYPE_UINT64, stream_time, + "running-time", G_TYPE_UINT64, running_time, + "duration", G_TYPE_UINT64, duration, + "offset", G_TYPE_UINT64, offset, + "offset-end", G_TYPE_UINT64, offset_end, NULL); + + gst_element_post_message (GST_ELEMENT_CAST (multifilesink), + gst_message_new_element (GST_OBJECT_CAST (multifilesink), s)); +} + + +static void +gst_multi_file_sink_post_message (GstMultiFileSink * multifilesink, + GstBuffer * buffer, const char *filename) +{ + GstClockTime duration, timestamp; + GstClockTime running_time, stream_time; + guint64 offset, offset_end; + GstSegment *segment; + GstFormat format; + + if (!multifilesink->post_messages) + return; + + segment = &GST_BASE_SINK (multifilesink)->segment; + format = segment->format; + + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + offset = GST_BUFFER_OFFSET (buffer); + offset_end = GST_BUFFER_OFFSET_END (buffer); + + running_time = gst_segment_to_running_time (segment, format, timestamp); + stream_time = gst_segment_to_stream_time (segment, format, timestamp); + + gst_multi_file_sink_post_message_full (multifilesink, timestamp, duration, + offset, offset_end, running_time, stream_time, filename); +} + +static gboolean +gst_multi_file_sink_write_stream_headers (GstMultiFileSink * sink) +{ + int i; + + if (sink->streamheaders == NULL) + return TRUE; + + /* we want to write these at the beginning */ + g_assert (sink->cur_file_size == 0); + + for (i = 0; i < sink->n_streamheaders; i++) { + GstBuffer *hdr; + int ret; + + hdr = sink->streamheaders[i]; + + ret = fwrite (GST_BUFFER_DATA (hdr), GST_BUFFER_SIZE (hdr), 1, sink->file); + + if (ret != 1) + return FALSE; + + sink->cur_file_size += GST_BUFFER_SIZE (hdr); + } + + return TRUE; +} + +static GstFlowReturn +gst_multi_file_sink_render (GstBaseSink * sink, GstBuffer * buffer) +{ + GstMultiFileSink *multifilesink; + guint size; + guint8 *data; + gchar *filename; + gboolean ret; + GError *error = NULL; + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + + multifilesink = GST_MULTI_FILE_SINK (sink); + + switch (multifilesink->next_file) { + case GST_MULTI_FILE_SINK_NEXT_BUFFER: + gst_multi_file_sink_ensure_max_files (multifilesink); + + filename = g_strdup_printf (multifilesink->filename, + multifilesink->index); + ret = g_file_set_contents (filename, (char *) data, size, &error); + if (!ret) + goto write_error; + + multifilesink->files = g_slist_append (multifilesink->files, filename); + multifilesink->n_files += 1; + + gst_multi_file_sink_post_message (multifilesink, buffer, filename); + multifilesink->index++; + + break; + case GST_MULTI_FILE_SINK_NEXT_DISCONT: + if (GST_BUFFER_IS_DISCONT (buffer)) { + if (multifilesink->file) + gst_multi_file_sink_close_file (multifilesink, buffer); + } + + if (multifilesink->file == NULL) { + if (!gst_multi_file_sink_open_next_file (multifilesink)) + goto stdio_write_error; + } + + ret = fwrite (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 1, + multifilesink->file); + if (ret != 1) + goto stdio_write_error; + + break; + case GST_MULTI_FILE_SINK_NEXT_KEY_FRAME: + if (multifilesink->next_segment == GST_CLOCK_TIME_NONE) { + if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) { + multifilesink->next_segment = GST_BUFFER_TIMESTAMP (buffer) + + 10 * GST_SECOND; + } + } + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) && + GST_BUFFER_TIMESTAMP (buffer) >= multifilesink->next_segment && + !GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) { + if (multifilesink->file) + gst_multi_file_sink_close_file (multifilesink, buffer); + + multifilesink->next_segment += 10 * GST_SECOND; + } + + if (multifilesink->file == NULL) { + if (!gst_multi_file_sink_open_next_file (multifilesink)) + goto stdio_write_error; + + gst_multi_file_sink_write_stream_headers (multifilesink); + } + + ret = fwrite (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 1, + multifilesink->file); + if (ret != 1) + goto stdio_write_error; + + break; + case GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT: + if (multifilesink->file == NULL) { + if (!gst_multi_file_sink_open_next_file (multifilesink)) + goto stdio_write_error; + } + + ret = fwrite (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 1, + multifilesink->file); + if (ret != 1) + goto stdio_write_error; + + break; + case GST_MULTI_FILE_SINK_NEXT_MAX_SIZE:{ + guint64 new_size; + + new_size = multifilesink->cur_file_size + GST_BUFFER_SIZE (buffer); + if (new_size > multifilesink->max_file_size) { + + GST_INFO_OBJECT (multifilesink, "current size: %" G_GUINT64_FORMAT + ", new_size: %" G_GUINT64_FORMAT ", max. size %" G_GUINT64_FORMAT, + multifilesink->cur_file_size, new_size, + multifilesink->max_file_size); + + if (multifilesink->file != NULL) + gst_multi_file_sink_close_file (multifilesink, NULL); + } + + if (multifilesink->file == NULL) { + if (!gst_multi_file_sink_open_next_file (multifilesink)) + goto stdio_write_error; + + gst_multi_file_sink_write_stream_headers (multifilesink); + } + + ret = fwrite (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 1, + multifilesink->file); + + if (ret != 1) + goto stdio_write_error; + + multifilesink->cur_file_size += GST_BUFFER_SIZE (buffer); + break; + } + default: + g_assert_not_reached (); + } + + return GST_FLOW_OK; + + /* ERRORS */ +write_error: + { + switch (error->code) { + case G_FILE_ERROR_NOSPC:{ + GST_ELEMENT_ERROR (multifilesink, RESOURCE, NO_SPACE_LEFT, (NULL), + (NULL)); + break; + } + default:{ + GST_ELEMENT_ERROR (multifilesink, RESOURCE, WRITE, + ("Error while writing to file \"%s\".", filename), + ("%s", g_strerror (errno))); + } + } + g_error_free (error); + g_free (filename); + + return GST_FLOW_ERROR; + } +stdio_write_error: + switch (errno) { + case ENOSPC: + GST_ELEMENT_ERROR (multifilesink, RESOURCE, NO_SPACE_LEFT, + ("Error while writing to file."), ("%s", g_strerror (errno))); + break; + default: + GST_ELEMENT_ERROR (multifilesink, RESOURCE, WRITE, + ("Error while writing to file."), ("%s", g_strerror (errno))); + } + return GST_FLOW_ERROR; +} + +static GstBufferListItem +buffer_list_calc_size (GstBuffer ** buf, guint group, guint idx, gpointer data) +{ + guint *p_size = data; + guint buf_size; + + buf_size = GST_BUFFER_SIZE (*buf); + GST_TRACE ("buffer %u in group %u has size %u", idx, group, buf_size); + *p_size += buf_size; + + return GST_BUFFER_LIST_CONTINUE; +} + +static GstBufferListItem +buffer_list_copy_data (GstBuffer ** buf, guint group, guint idx, gpointer data) +{ + GstBuffer *dest = data; + + if (group == 0 && idx == 0) + gst_buffer_copy_metadata (dest, *buf, GST_BUFFER_COPY_ALL); + + memcpy (GST_BUFFER_DATA (dest) + GST_BUFFER_SIZE (dest), + GST_BUFFER_DATA (*buf), GST_BUFFER_SIZE (*buf)); + GST_BUFFER_SIZE (dest) += GST_BUFFER_SIZE (*buf); + + return GST_BUFFER_LIST_CONTINUE; +} + +/* Our assumption for now is that the buffers in a buffer list should always + * end up in the same file. If someone wants different behaviour, they'll just + * have to add a property for that. */ +static GstFlowReturn +gst_multi_file_sink_render_list (GstBaseSink * sink, GstBufferList * list) +{ + GstBuffer *buf; + guint size; + + gst_buffer_list_foreach (list, buffer_list_calc_size, &size); + GST_LOG_OBJECT (sink, "total size of buffer list %p: %u", list, size); + + /* copy all buffers in the list into one single buffer, so we can use + * the normal render function (FIXME: optimise to avoid the memcpy) */ + buf = gst_buffer_new_and_alloc (size); + GST_BUFFER_SIZE (buf) = 0; + gst_buffer_list_foreach (list, buffer_list_copy_data, buf); + g_assert (GST_BUFFER_SIZE (buf) == size); + + gst_multi_file_sink_render (sink, buf); + gst_buffer_unref (buf); + + return GST_FLOW_OK; +} + +static gboolean +gst_multi_file_sink_set_caps (GstBaseSink * sink, GstCaps * caps) +{ + GstMultiFileSink *multifilesink; + GstStructure *structure; + + multifilesink = GST_MULTI_FILE_SINK (sink); + + structure = gst_caps_get_structure (caps, 0); + if (structure) { + const GValue *value; + + value = gst_structure_get_value (structure, "streamheader"); + + if (GST_VALUE_HOLDS_ARRAY (value)) { + int i; + + if (multifilesink->streamheaders) { + for (i = 0; i < multifilesink->n_streamheaders; i++) { + gst_buffer_unref (multifilesink->streamheaders[i]); + } + g_free (multifilesink->streamheaders); + } + + multifilesink->n_streamheaders = gst_value_array_get_size (value); + multifilesink->streamheaders = + g_malloc (sizeof (GstBuffer *) * multifilesink->n_streamheaders); + + for (i = 0; i < multifilesink->n_streamheaders; i++) { + multifilesink->streamheaders[i] = + gst_buffer_ref (gst_value_get_buffer (gst_value_array_get_value + (value, i))); + } + } + } + + return TRUE; +} + +static void +gst_multi_file_sink_ensure_max_files (GstMultiFileSink * multifilesink) +{ + char *filename; + + while (multifilesink->max_files && + multifilesink->n_files >= multifilesink->max_files) { + filename = multifilesink->files->data; + g_remove (filename); + g_free (filename); + multifilesink->files = g_slist_delete_link (multifilesink->files, + multifilesink->files); + multifilesink->n_files -= 1; + } +} + +static gboolean +gst_multi_file_sink_event (GstBaseSink * sink, GstEvent * event) +{ + GstMultiFileSink *multifilesink; + gchar *filename; + gboolean res = TRUE; + + multifilesink = GST_MULTI_FILE_SINK (sink); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CUSTOM_DOWNSTREAM: + { + GstClockTime timestamp, duration; + GstClockTime running_time, stream_time; + guint64 offset, offset_end; + gboolean all_headers; + guint count; + + if (multifilesink->next_file != GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT || + !gst_video_event_is_force_key_unit (event)) + goto out; + + gst_video_event_parse_downstream_force_key_unit (event, ×tamp, + &stream_time, &running_time, &all_headers, &count); + + if (multifilesink->force_key_unit_count != -1 && + multifilesink->force_key_unit_count == count) + goto out; + + multifilesink->force_key_unit_count = count; + + if (multifilesink->file) { + duration = GST_CLOCK_TIME_NONE; + offset = offset_end = -1; + filename = g_strdup_printf (multifilesink->filename, + multifilesink->index); + gst_multi_file_sink_post_message_full (multifilesink, timestamp, + duration, offset, offset_end, running_time, stream_time, filename); + + g_free (filename); + + gst_multi_file_sink_close_file (multifilesink, NULL); + + } + + if (multifilesink->file == NULL) { + if (!gst_multi_file_sink_open_next_file (multifilesink)) + goto stdio_write_error; + } + + break; + } + default: + break; + } + +out: + return res; + +stdio_write_error: + GST_ELEMENT_ERROR (multifilesink, RESOURCE, WRITE, + ("Error while writing to file."), (NULL)); + return FALSE; +} + +static gboolean +gst_multi_file_sink_open_next_file (GstMultiFileSink * multifilesink) +{ + char *filename; + + g_return_val_if_fail (multifilesink->file == NULL, FALSE); + + gst_multi_file_sink_ensure_max_files (multifilesink); + filename = g_strdup_printf (multifilesink->filename, multifilesink->index); + multifilesink->file = g_fopen (filename, "wb"); + if (multifilesink->file == NULL) { + g_free (filename); + return FALSE; + } + + GST_INFO_OBJECT (multifilesink, "opening file %s", filename); + multifilesink->files = g_slist_append (multifilesink->files, filename); + multifilesink->n_files += 1; + + multifilesink->cur_file_size = 0; + return TRUE; +} + +static void +gst_multi_file_sink_close_file (GstMultiFileSink * multifilesink, + GstBuffer * buffer) +{ + char *filename; + + fclose (multifilesink->file); + multifilesink->file = NULL; + + if (buffer) { + filename = g_strdup_printf (multifilesink->filename, multifilesink->index); + gst_multi_file_sink_post_message (multifilesink, buffer, filename); + g_free (filename); + } + + multifilesink->index++; +} diff --git a/gst/multifile/gstmultifilesink.h b/gst/multifile/gstmultifilesink.h new file mode 100644 index 0000000..dd234d6 --- /dev/null +++ b/gst/multifile/gstmultifilesink.h @@ -0,0 +1,108 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2006 Wim Taymans + * 2006 David A. Schleef + * + * gstmultifilesink.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_MULTIFILESINK_H__ +#define __GST_MULTIFILESINK_H__ + +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +G_BEGIN_DECLS + +#define GST_TYPE_MULTI_FILE_SINK \ + (gst_multi_file_sink_get_type()) +#define GST_MULTI_FILE_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTI_FILE_SINK,GstMultiFileSink)) +#define GST_MULTI_FILE_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTI_FILE_SINK,GstMultiFileSinkClass)) +#define GST_IS_MULTI_FILE_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTI_FILE_SINK)) +#define GST_IS_MULTI_FILE_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTI_FILE_SINK)) + +typedef struct _GstMultiFileSink GstMultiFileSink; +typedef struct _GstMultiFileSinkClass GstMultiFileSinkClass; + +/** + * GstMultiFileSinkNext: + * @GST_MULTI_FILE_SINK_NEXT_BUFFER: New file for each buffer + * @GST_MULTI_FILE_SINK_NEXT_DISCONT: New file after each discontinuity + * @GST_MULTI_FILE_SINK_NEXT_KEY_FRAME: New file at each key frame + * (Useful for MPEG-TS segmenting) + * @GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT: New file after a force key unit + * event (Since: 0.10.31) + * @GST_MULTI_FILE_SINK_NEXT_MAX_SIZE: New file when the configured maximum file + * size would be exceeded with the next buffer or buffer list (Since: 0.10.31) + * + * File splitting modes. + */ +typedef enum { + GST_MULTI_FILE_SINK_NEXT_BUFFER, + GST_MULTI_FILE_SINK_NEXT_DISCONT, + GST_MULTI_FILE_SINK_NEXT_KEY_FRAME, + GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT, + GST_MULTI_FILE_SINK_NEXT_MAX_SIZE +} GstMultiFileSinkNext; + +struct _GstMultiFileSink +{ + GstBaseSink parent; + + gchar *filename; + gint index; + gboolean post_messages; + GstMultiFileSinkNext next_file; + FILE *file; + guint max_files; + GSList *files; + guint n_files; + + gint64 next_segment; + + int n_streamheaders; + GstBuffer **streamheaders; + guint force_key_unit_count; + + guint64 cur_file_size; + guint64 max_file_size; +}; + +struct _GstMultiFileSinkClass +{ + GstBaseSinkClass parent_class; +}; + +GType gst_multi_file_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_MULTIFILESINK_H__ */ diff --git a/gst/multifile/gstmultifilesrc.c b/gst/multifile/gstmultifilesrc.c new file mode 100644 index 0000000..48f5c1f --- /dev/null +++ b/gst/multifile/gstmultifilesrc.c @@ -0,0 +1,417 @@ +/* GStreamer + * Copyright (C) 2006 David A. Schleef + * + * gstmultifilesrc.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. + */ +/** + * SECTION:element-multifilesrc + * @see_also: #GstFileSrc + * + * Reads buffers from sequentially named files. If used together with an image + * decoder, one needs to use the #GstMultiFileSrc:caps property or a capsfilter + * to force to caps containing a framerate. Otherwise image decoders send EOS + * after the first picture. + * + * File names are created by replacing "\%d" with the index using printf(). + * + * + * Example launch line + * |[ + * gst-launch multifilesrc location="img.%04d.png" index=0 caps="image/png,framerate=\(fraction\)12/1" ! \ + * pngdec ! ffmpegcolorspace ! theoraenc ! oggmux ! \ + * filesink location="images.ogg" + * ]| This pipeline creates a video file "images.ogg" by joining multiple PNG + * files named img.0000.png, img.0001.png, etc. + * +*/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gstmultifilesrc.h" + + +static GstFlowReturn gst_multi_file_src_create (GstPushSrc * src, + GstBuffer ** buffer); + +static void gst_multi_file_src_dispose (GObject * object); + +static void gst_multi_file_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_multi_file_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstCaps *gst_multi_file_src_getcaps (GstBaseSrc * src); +static gboolean gst_multi_file_src_query (GstBaseSrc * src, GstQuery * query); + + +static GstStaticPadTemplate gst_multi_file_src_pad_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GST_DEBUG_CATEGORY_STATIC (gst_multi_file_src_debug); +#define GST_CAT_DEFAULT gst_multi_file_src_debug + +enum +{ + ARG_0, + ARG_LOCATION, + ARG_INDEX, + ARG_START_INDEX, + ARG_STOP_INDEX, + ARG_CAPS, + ARG_LOOP +}; + +#define DEFAULT_LOCATION "%05d" +#define DEFAULT_INDEX 0 + + +GST_BOILERPLATE (GstMultiFileSrc, gst_multi_file_src, GstPushSrc, + GST_TYPE_PUSH_SRC); + +static void +gst_multi_file_src_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + GST_DEBUG_CATEGORY_INIT (gst_multi_file_src_debug, "multifilesrc", 0, + "multifilesrc element"); + + gst_element_class_add_static_pad_template (gstelement_class, + &gst_multi_file_src_pad_template); + gst_element_class_set_details_simple (gstelement_class, "Multi-File Source", + "Source/File", + "Read a sequentially named set of files into buffers", + "David Schleef "); +} + +static void +gst_multi_file_src_class_init (GstMultiFileSrcClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstPushSrcClass *gstpushsrc_class = GST_PUSH_SRC_CLASS (klass); + GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); + + gobject_class->set_property = gst_multi_file_src_set_property; + gobject_class->get_property = gst_multi_file_src_get_property; + + g_object_class_install_property (gobject_class, ARG_LOCATION, + g_param_spec_string ("location", "File Location", + "Pattern to create file names of input files. File names are " + "created by calling sprintf() with the pattern and the current " + "index.", DEFAULT_LOCATION, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_INDEX, + g_param_spec_int ("index", "File Index", + "Index to use with location property to create file names. The " + "index is incremented by one for each buffer read.", + 0, INT_MAX, DEFAULT_INDEX, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_START_INDEX, + g_param_spec_int ("start-index", "Start Index", + "Start value of index. The initial value of index can be set " + "either by setting index or start-index. When the end of the loop " + "is reached, the index will be set to the value start-index.", + 0, INT_MAX, DEFAULT_INDEX, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_STOP_INDEX, + g_param_spec_int ("stop-index", "Start Index", + "Stop value of index. The special value -1 means no stop.", + -1, INT_MAX, DEFAULT_INDEX, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_CAPS, + g_param_spec_boxed ("caps", "Caps", + "Caps describing the format of the data.", + GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_LOOP, + g_param_spec_boolean ("loop", "Loop", + "Whether to repeat from the beginning when all files have been read.", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gobject_class->dispose = gst_multi_file_src_dispose; + + gstbasesrc_class->get_caps = gst_multi_file_src_getcaps; + gstbasesrc_class->query = gst_multi_file_src_query; + + gstpushsrc_class->create = gst_multi_file_src_create; + + if (sizeof (off_t) < 8) { + GST_LOG ("No large file support, sizeof (off_t) = %" G_GSIZE_FORMAT, + sizeof (off_t)); + } +} + +static void +gst_multi_file_src_init (GstMultiFileSrc * multifilesrc, + GstMultiFileSrcClass * g_class) +{ + multifilesrc->start_index = DEFAULT_INDEX; + multifilesrc->index = DEFAULT_INDEX; + multifilesrc->stop_index = -1; + multifilesrc->filename = g_strdup (DEFAULT_LOCATION); + multifilesrc->successful_read = FALSE; +} + +static void +gst_multi_file_src_dispose (GObject * object) +{ + GstMultiFileSrc *src = GST_MULTI_FILE_SRC (object); + + g_free (src->filename); + src->filename = NULL; + if (src->caps) + gst_caps_unref (src->caps); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static GstCaps * +gst_multi_file_src_getcaps (GstBaseSrc * src) +{ + GstMultiFileSrc *multi_file_src = GST_MULTI_FILE_SRC (src); + + GST_DEBUG_OBJECT (src, "returning %" GST_PTR_FORMAT, multi_file_src->caps); + + if (multi_file_src->caps) { + return gst_caps_ref (multi_file_src->caps); + } else { + return gst_caps_new_any (); + } +} + +static gboolean +gst_multi_file_src_query (GstBaseSrc * src, GstQuery * query) +{ + gboolean res; + GstMultiFileSrc *mfsrc; + + mfsrc = GST_MULTI_FILE_SRC (src); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + + gst_query_parse_position (query, &format, NULL); + switch (format) { + case GST_FORMAT_BUFFERS: + case GST_FORMAT_DEFAULT: + gst_query_set_position (query, GST_FORMAT_BUFFERS, mfsrc->index); + res = TRUE; + break; + default: + res = GST_BASE_SRC_CLASS (parent_class)->query (src, query); + break; + } + break; + } + default: + res = GST_BASE_SRC_CLASS (parent_class)->query (src, query); + break; + } + return res; +} + +static gboolean +gst_multi_file_src_set_location (GstMultiFileSrc * src, const gchar * location) +{ + g_free (src->filename); + if (location != NULL) { + src->filename = g_strdup (location); + } else { + src->filename = NULL; + } + + return TRUE; +} + +static void +gst_multi_file_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMultiFileSrc *src = GST_MULTI_FILE_SRC (object); + + switch (prop_id) { + case ARG_LOCATION: + gst_multi_file_src_set_location (src, g_value_get_string (value)); + break; + case ARG_INDEX: + src->index = g_value_get_int (value); + break; + case ARG_START_INDEX: + src->start_index = g_value_get_int (value); + break; + case ARG_STOP_INDEX: + src->stop_index = g_value_get_int (value); + break; + case ARG_CAPS: + { + const GstCaps *caps = gst_value_get_caps (value); + GstCaps *new_caps; + + if (caps == NULL) { + new_caps = gst_caps_new_any (); + } else { + new_caps = gst_caps_copy (caps); + } + gst_caps_replace (&src->caps, new_caps); + gst_pad_set_caps (GST_BASE_SRC_PAD (src), new_caps); + } + break; + case ARG_LOOP: + src->loop = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_multi_file_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMultiFileSrc *src = GST_MULTI_FILE_SRC (object); + + switch (prop_id) { + case ARG_LOCATION: + g_value_set_string (value, src->filename); + break; + case ARG_INDEX: + g_value_set_int (value, src->index); + break; + case ARG_START_INDEX: + g_value_set_int (value, src->start_index); + break; + case ARG_STOP_INDEX: + g_value_set_int (value, src->stop_index); + break; + case ARG_CAPS: + gst_value_set_caps (value, src->caps); + break; + case ARG_LOOP: + g_value_set_boolean (value, src->loop); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gchar * +gst_multi_file_src_get_filename (GstMultiFileSrc * multifilesrc) +{ + gchar *filename; + + GST_DEBUG ("%d", multifilesrc->index); + filename = g_strdup_printf (multifilesrc->filename, multifilesrc->index); + + return filename; +} + +static GstFlowReturn +gst_multi_file_src_create (GstPushSrc * src, GstBuffer ** buffer) +{ + GstMultiFileSrc *multifilesrc; + gsize size; + gchar *data; + gchar *filename; + GstBuffer *buf; + gboolean ret; + GError *error = NULL; + + multifilesrc = GST_MULTI_FILE_SRC (src); + + if (multifilesrc->index < multifilesrc->start_index) { + multifilesrc->index = multifilesrc->start_index; + } + filename = gst_multi_file_src_get_filename (multifilesrc); + + GST_DEBUG_OBJECT (multifilesrc, "reading from file \"%s\".", filename); + + ret = g_file_get_contents (filename, &data, &size, &error); + if (!ret) { + if (multifilesrc->successful_read) { + /* If we've read at least one buffer successfully, not finding the + * next file is EOS. */ + g_free (filename); + if (error != NULL) + g_error_free (error); + + if (multifilesrc->loop) { + error = NULL; + multifilesrc->index = multifilesrc->start_index; + + filename = gst_multi_file_src_get_filename (multifilesrc); + ret = g_file_get_contents (filename, &data, &size, &error); + if (!ret) { + g_free (filename); + if (error != NULL) + g_error_free (error); + + return GST_FLOW_UNEXPECTED; + } + } else { + return GST_FLOW_UNEXPECTED; + } + } else { + goto handle_error; + } + } + + multifilesrc->successful_read = TRUE; + multifilesrc->index++; + if (multifilesrc->stop_index != -1 && + multifilesrc->index >= multifilesrc->stop_index) { + multifilesrc->index = multifilesrc->start_index; + } + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = (unsigned char *) data; + GST_BUFFER_MALLOCDATA (buf) = GST_BUFFER_DATA (buf); + GST_BUFFER_SIZE (buf) = size; + GST_BUFFER_OFFSET (buf) = multifilesrc->offset; + GST_BUFFER_OFFSET_END (buf) = multifilesrc->offset + size; + multifilesrc->offset += size; + gst_buffer_set_caps (buf, multifilesrc->caps); + + GST_DEBUG_OBJECT (multifilesrc, "read file \"%s\".", filename); + + g_free (filename); + *buffer = buf; + return GST_FLOW_OK; + +handle_error: + { + if (error != NULL) { + GST_ELEMENT_ERROR (multifilesrc, RESOURCE, READ, + ("Error while reading from file \"%s\".", filename), + ("%s", error->message)); + g_error_free (error); + } else { + GST_ELEMENT_ERROR (multifilesrc, RESOURCE, READ, + ("Error while reading from file \"%s\".", filename), + ("%s", g_strerror (errno))); + } + g_free (filename); + return GST_FLOW_ERROR; + } +} diff --git a/gst/multifile/gstmultifilesrc.h b/gst/multifile/gstmultifilesrc.h new file mode 100644 index 0000000..57ed038 --- /dev/null +++ b/gst/multifile/gstmultifilesrc.h @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) 2006 David A. Schleef + * + * gstmultifilesrc.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. + */ + +#ifndef __GST_MULTIFILESRC_H__ +#define __GST_MULTIFILESRC_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_MULTI_FILE_SRC \ + (gst_multi_file_src_get_type()) +#define GST_MULTI_FILE_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTI_FILE_SRC,GstMultiFileSrc)) +#define GST_MULTI_FILE_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTI_FILE_SRC,GstMultiFileSrcClass)) +#define GST_IS_MULTI_FILE_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTI_FILE_SRC)) +#define GST_IS_MULTI_FILE_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTI_FILE_SRC)) + +typedef struct _GstMultiFileSrc GstMultiFileSrc; +typedef struct _GstMultiFileSrcClass GstMultiFileSrcClass; + +struct _GstMultiFileSrc +{ + GstPushSrc parent; + + gchar *filename; + int start_index; + int stop_index; + int index; + + int offset; + + gboolean loop; + + GstCaps *caps; + gboolean successful_read; +}; + +struct _GstMultiFileSrcClass +{ + GstPushSrcClass parent_class; +}; + +GType gst_multi_file_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_MULTIFILESRC_H__ */ diff --git a/gst/multifile/gstsplitfilesrc.c b/gst/multifile/gstsplitfilesrc.c new file mode 100644 index 0000000..3125997 --- /dev/null +++ b/gst/multifile/gstsplitfilesrc.c @@ -0,0 +1,616 @@ +/* GStreamer Split File Source + * Copyright (C) 2011 Collabora Ltd. + * + * 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-splitfilesrc + * @see_also: #GstFileSrc, #GstMultiFileSrc + * + * Reads data from multiple files, presenting those files as one continuous + * file to downstream elements. This is useful for reading a large file that + * had to be split into multiple parts due to filesystem file size limitations, + * for example. + * + * The files to select are chosen via the location property, which supports + * (and expects) shell-style wildcards (but only for the filename, not for + * directories). The results will be sorted. + * + * + * Example launch line + * |[ + * gst-launch splitfilesrc location="/path/to/part-*.mpg" ! decodebin ! ... \ + * ]| Plays the different parts as if they were one single MPEG file. + * + * + * Since: 0.10.31 + */ + +/* TODO: + * - implement splitfile:// URI handler? + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gstsplitfilesrc.h" +#include "patternspec.h" + +#include + +#ifdef G_OS_WIN32 +#define DEFAULT_PATTERN_MATCH_MODE MATCH_MODE_UTF8 +#else +#define DEFAULT_PATTERN_MATCH_MODE MATCH_MODE_AUTO +#endif + +enum +{ + PROP_LOCATION = 1 +}; + +#define DEFAULT_LOCATION NULL + +static void gst_split_file_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_split_file_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_split_file_src_finalize (GObject * obj); + +static gboolean gst_split_file_src_start (GstBaseSrc * basesrc); +static gboolean gst_split_file_src_stop (GstBaseSrc * basesrc); +static gboolean gst_split_file_src_can_seek (GstBaseSrc * basesrc); +static gboolean gst_split_file_src_check_get_range (GstBaseSrc * basesrc); +static gboolean gst_split_file_src_get_size (GstBaseSrc * basesrc, guint64 * s); +static gboolean gst_split_file_src_unlock (GstBaseSrc * basesrc); +static GstFlowReturn gst_split_file_src_create (GstBaseSrc * basesrc, + guint64 offset, guint size, GstBuffer ** buffer); + +static GstStaticPadTemplate gst_split_file_src_pad_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GST_DEBUG_CATEGORY_STATIC (splitfilesrc_debug); +#define GST_CAT_DEFAULT splitfilesrc_debug + +GST_BOILERPLATE (GstSplitFileSrc, gst_split_file_src, GstBaseSrc, + GST_TYPE_BASE_SRC); + +static void +gst_split_file_src_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + GST_DEBUG_CATEGORY_INIT (splitfilesrc_debug, "splitfilesrc", 0, + "splitfilesrc element"); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_split_file_src_pad_template)); + + gst_element_class_set_details_simple (gstelement_class, "Split-File Source", + "Source/File", + "Read a sequentially named set of files as if it was one large file", + "Tim-Philipp Müller "); +} + +#ifdef G_OS_WIN32 +#define WIN32_BLURB " Location string must be in UTF-8 encoding (on Windows)." +#else +#define WIN32_BLURB /* nothing */ +#endif + +static void +gst_split_file_src_class_init (GstSplitFileSrcClass * klass) +{ + GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = gst_split_file_src_set_property; + gobject_class->get_property = gst_split_file_src_get_property; + gobject_class->finalize = gst_split_file_src_finalize; + + g_object_class_install_property (gobject_class, PROP_LOCATION, + g_param_spec_string ("location", "File Location", + "Wildcard pattern to match file names of the input files. If " + "the location is an absolute path or contains directory components, " + "only the base file name part will be considered for pattern " + "matching. The results will be sorted." WIN32_BLURB, + DEFAULT_LOCATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_split_file_src_start); + gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_split_file_src_stop); + gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_split_file_src_create); + gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_split_file_src_get_size); + gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_split_file_src_unlock); + gstbasesrc_class->is_seekable = + GST_DEBUG_FUNCPTR (gst_split_file_src_can_seek); + gstbasesrc_class->check_get_range = + GST_DEBUG_FUNCPTR (gst_split_file_src_check_get_range); +} + +static void +gst_split_file_src_init (GstSplitFileSrc * splitfilesrc, + GstSplitFileSrcClass * g_class) +{ +} + +static void +gst_split_file_src_finalize (GObject * obj) +{ + GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (obj); + + g_free (src->location); + src->location = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static gboolean +gst_split_file_src_can_seek (GstBaseSrc * basesrc) +{ + return TRUE; +} + +static gboolean +gst_split_file_src_check_get_range (GstBaseSrc * basesrc) +{ + return TRUE; +} + +static gboolean +gst_split_file_src_unlock (GstBaseSrc * basesrc) +{ + /* This is not actually that useful, since all normal file + * operations are fully blocking anyway */ +#if 0 + GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); + + GST_DEBUG_OBJECT (src, "cancelling pending I/O operation if there is one"); + /* g_cancellable_cancel (src->cancellable); */ + GST_DEBUG_OBJECT (src, "done"); +#endif + + return TRUE; +} + +static gboolean +gst_split_file_src_get_size (GstBaseSrc * basesrc, guint64 * size) +{ + GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); + + *size = src->parts[src->num_parts - 1].stop + 1; + return TRUE; +} + +static void +gst_split_file_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (object); + + switch (prop_id) { + case PROP_LOCATION: + GST_OBJECT_LOCK (src); + g_free (src->location); + src->location = g_value_dup_string (value); +#ifdef G_OS_WIN32 + if (!g_utf8_validate (src->location, -1, NULL)) { + g_warning ("splitfilesrc 'location' property must be in UTF-8 " + "encoding on Windows"); + } +#endif + GST_OBJECT_UNLOCK (src); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_split_file_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (object); + + switch (prop_id) { + case PROP_LOCATION: + GST_OBJECT_LOCK (src); + g_value_set_string (value, src->location); + GST_OBJECT_UNLOCK (src); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static int +gst_split_file_src_array_sortfunc (gchar ** a, gchar ** b) +{ + return strcmp (*a, *b); +} + +static gchar ** +gst_split_file_src_find_files (GstSplitFileSrc * src, const gchar * dirname, + const gchar * basename, GError ** err) +{ + PatternSpec *pspec; + GPtrArray *files; + const gchar *name; + GDir *dir; + + if (dirname == NULL || basename == NULL) + goto invalid_location; + + GST_INFO_OBJECT (src, "checking in directory '%s' for pattern '%s'", + dirname, basename); + + dir = g_dir_open (dirname, 0, err); + if (dir == NULL) + return NULL; + + if (DEFAULT_PATTERN_MATCH_MODE == MATCH_MODE_UTF8 && + !g_utf8_validate (basename, -1, NULL)) { + goto not_utf8; + } + + /* mode will be AUTO on linux/unix and UTF8 on win32 */ + pspec = pattern_spec_new (basename, DEFAULT_PATTERN_MATCH_MODE); + + files = g_ptr_array_new (); + + while ((name = g_dir_read_name (dir))) { + GST_TRACE_OBJECT (src, "check: %s", name); + if (pattern_match_string (pspec, name)) { + GST_DEBUG_OBJECT (src, "match: %s", name); + g_ptr_array_add (files, g_build_filename (dirname, name, NULL)); + } + } + + if (files->len == 0) + goto no_matches; + + g_ptr_array_sort (files, (GCompareFunc) gst_split_file_src_array_sortfunc); + g_ptr_array_add (files, NULL); + + pattern_spec_free (pspec); + g_dir_close (dir); + + return (gchar **) g_ptr_array_free (files, FALSE); + +/* ERRORS */ +invalid_location: + { + g_set_error_literal (err, G_FILE_ERROR, G_FILE_ERROR_INVAL, + "No filename specified."); + return NULL; + } +not_utf8: + { + g_dir_close (dir); + g_set_error_literal (err, G_FILE_ERROR, G_FILE_ERROR_INVAL, + "Filename pattern must be UTF-8 on Windows."); + return NULL; + } +no_matches: + { + pattern_spec_free (pspec); + g_dir_close (dir); + g_set_error_literal (err, G_FILE_ERROR, G_FILE_ERROR_NOENT, + "Found no files matching the pattern."); + return NULL; + } +} + +static gboolean +gst_split_file_src_start (GstBaseSrc * basesrc) +{ + GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); + GCancellable *cancel; + gboolean ret = FALSE; + guint64 offset; + GError *err = NULL; + gchar *basename = NULL; + gchar *dirname = NULL; + gchar **files; + guint i; + + GST_OBJECT_LOCK (src); + if (src->location != NULL && src->location[0] != '\0') { + basename = g_path_get_basename (src->location); + dirname = g_path_get_dirname (src->location); + } + GST_OBJECT_UNLOCK (src); + + files = gst_split_file_src_find_files (src, dirname, basename, &err); + + if (files == NULL || *files == NULL) + goto no_files; + + src->num_parts = g_strv_length (files); + src->parts = g_new0 (GstFilePart, src->num_parts); + + cancel = src->cancellable; + + offset = 0; + for (i = 0; i < src->num_parts; ++i) { + GFileInputStream *stream; + GFileInfo *info; + goffset size; + GFile *file; + + file = g_file_new_for_path (files[i]); + stream = g_file_read (file, cancel, &err); + g_object_unref (file); + + if (err != NULL) + goto open_read_error; + + info = g_file_input_stream_query_info (stream, "standard::*", NULL, &err); + if (err != NULL) { + g_object_unref (stream); + goto query_info_error; + } + + size = g_file_info_get_size (info); + g_object_unref (info); + + src->parts[i].stream = stream; + src->parts[i].path = g_strdup (files[i]); + src->parts[i].start = offset; + src->parts[i].stop = offset + size - 1; + + GST_DEBUG ("[%010" G_GUINT64_FORMAT "-%010" G_GUINT64_FORMAT "] %s", + src->parts[i].start, src->parts[i].stop, src->parts[i].path); + + offset += size; + } + + GST_INFO ("Successfully opened %u file parts for reading", src->num_parts); + + src->cur_part = 0; + + src->cancellable = g_cancellable_new (); + + ret = TRUE; + +done: + if (err != NULL) + g_error_free (err); + g_strfreev (files); + g_free (basename); + g_free (dirname); + return ret; + +/* ERRORS */ +no_files: + { + if (err->code == G_IO_ERROR_CANCELLED) + goto cancelled; + + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("%s", err->message), + ("Failed to find files in '%s' for pattern '%s'", + GST_STR_NULL (dirname), GST_STR_NULL (basename))); + goto done; + } +open_read_error: + { + if (err->code == G_IO_ERROR_CANCELLED) + goto cancelled; + + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("%s", err->message), + ("Failed to open file '%s' for reading", files[i])); + goto done; + } +query_info_error: + { + if (err->code == G_IO_ERROR_CANCELLED) + goto cancelled; + + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("%s", err->message), + ("Failed to query info for file '%s'", files[i])); + goto done; + } +cancelled: + { + GST_DEBUG_OBJECT (src, "I/O operation cancelled from another thread"); + goto done; + } +} + +static gboolean +gst_split_file_src_stop (GstBaseSrc * basesrc) +{ + GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); + guint i; + + for (i = 0; i < src->num_parts; ++i) { + if (src->parts[i].stream != NULL) + g_object_unref (src->parts[i].stream); + g_free (src->parts[i].path); + } + g_free (src->parts); + src->parts = NULL; + src->num_parts = 0; + + g_object_unref (src->cancellable); + src->cancellable = NULL; + + return TRUE; +} + +static gboolean +gst_split_file_src_find_part_for_offset (GstSplitFileSrc * src, guint64 offset, + guint * part_number) +{ + GstFilePart *part; + guint i; + + /* TODO: could use gst_util_array_binary_search() here */ + part = src->parts; + for (i = 0; i < src->num_parts; ++i) { + if (offset >= part->start && offset <= part->stop) { + *part_number = i; + return TRUE; + } + ++part; + } + + return FALSE; +} + +static GstFlowReturn +gst_split_file_src_create (GstBaseSrc * basesrc, guint64 offset, guint size, + GstBuffer ** buffer) +{ + GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); + GstFilePart cur_part; + GInputStream *stream; + GCancellable *cancel; + GSeekable *seekable; + GstBuffer *buf; + GError *err = NULL; + guint64 read_offset; + guint8 *data; + guint to_read; + + cur_part = src->parts[src->cur_part]; + if (offset < cur_part.start || offset > cur_part.stop) { + if (!gst_split_file_src_find_part_for_offset (src, offset, &src->cur_part)) + return GST_FLOW_UNEXPECTED; + cur_part = src->parts[src->cur_part]; + } + + GST_LOG_OBJECT (src, "current part: %u (%" G_GUINT64_FORMAT " - " + "%" G_GUINT64_FORMAT ", %s)", src->cur_part, cur_part.start, + cur_part.stop, cur_part.path); + + buf = gst_buffer_new_and_alloc (size); + + GST_BUFFER_OFFSET (buf) = offset; + + data = GST_BUFFER_DATA (buf); + + cancel = src->cancellable; + + while (size > 0) { + guint64 bytes_to_end_of_part; + gsize read = 0; + + /* we want the offset into the file part */ + read_offset = offset - cur_part.start; + + GST_LOG ("Reading part %03u from offset %" G_GUINT64_FORMAT " (%s)", + src->cur_part, read_offset, cur_part.path); + + /* FIXME: only seek when needed (hopefully gio is smart) */ + seekable = G_SEEKABLE (cur_part.stream); + if (!g_seekable_seek (seekable, read_offset, G_SEEK_SET, cancel, &err)) + goto seek_failed; + + GST_LOG_OBJECT (src, "now: %" G_GUINT64_FORMAT, g_seekable_tell (seekable)); + + bytes_to_end_of_part = (cur_part.stop - cur_part.start) + 1 - read_offset; + to_read = MIN (size, bytes_to_end_of_part); + + GST_LOG_OBJECT (src, "reading %u bytes from part %u (bytes to end of " + "part: %u)", to_read, src->cur_part, (guint) bytes_to_end_of_part); + + stream = G_INPUT_STREAM (cur_part.stream); + + /* NB: we won't try to read beyond EOF */ + if (!g_input_stream_read_all (stream, data, to_read, &read, cancel, &err)) + goto read_failed; + + GST_LOG_OBJECT (src, "read %u bytes", (guint) read); + + data += read; + size -= read; + offset += read; + + /* are we done? */ + if (size == 0) + break; + + GST_LOG_OBJECT (src, "%u bytes left to read for this chunk", size); + + /* corner case, this should never really happen (assuming basesrc clips + * requests beyond the file size) */ + if (read < to_read) { + if (src->cur_part == src->num_parts - 1) { + /* last file part, stop reading and truncate buffer */ + GST_BUFFER_SIZE (buf) = offset - GST_BUFFER_OFFSET (buf); + break; + } else { + goto file_part_changed; + } + } + + ++src->cur_part; + cur_part = src->parts[src->cur_part]; + } + + GST_BUFFER_OFFSET_END (buf) = offset; + + *buffer = buf; + GST_LOG_OBJECT (src, "read %u bytes into buf %p", GST_BUFFER_SIZE (buf), buf); + return GST_FLOW_OK; + +/* ERRORS */ +seek_failed: + { + if (err->code == G_IO_ERROR_CANCELLED) + goto cancelled; + + GST_ELEMENT_ERROR (src, RESOURCE, SEEK, (NULL), + ("Seek to %" G_GUINT64_FORMAT " in %s failed", read_offset, + cur_part.path)); + g_error_free (err); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +read_failed: + { + if (err->code == G_IO_ERROR_CANCELLED) + goto cancelled; + + GST_ELEMENT_ERROR (src, RESOURCE, READ, ("%s", err->message), + ("Read from %" G_GUINT64_FORMAT " in %s failed", read_offset, + cur_part.path)); + g_error_free (err); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +file_part_changed: + { + GST_ELEMENT_ERROR (src, RESOURCE, READ, + ("Read error while reading file part %s", cur_part.path), + ("Short read in file part, file may have been modified since start")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +cancelled: + { + GST_DEBUG_OBJECT (src, "I/O operation cancelled from another thread"); + g_error_free (err); + gst_buffer_unref (buf); + return GST_FLOW_WRONG_STATE; + } +} diff --git a/gst/multifile/gstsplitfilesrc.h b/gst/multifile/gstsplitfilesrc.h new file mode 100644 index 0000000..f52b3bf --- /dev/null +++ b/gst/multifile/gstsplitfilesrc.h @@ -0,0 +1,74 @@ +/* GStreamer Split File Source + * Copyright (C) 2011 Collabora Ltd. + * + * 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_SPLIT_FILE_SRC_H__ +#define __GST_SPLIT_FILE_SRC_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SPLIT_FILE_SRC \ + (gst_split_file_src_get_type()) +#define GST_SPLIT_FILE_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPLIT_FILE_SRC,GstSplitFileSrc)) +#define GST_SPLIT_FILE_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPLIT_FILE_SRC,GstSplitFileSrcClass)) +#define GST_IS_SPLIT_FILE_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPLIT_FILE_SRC)) +#define GST_IS_SPLIT_FILE_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPLIT_FILE_SRC)) + +typedef struct _GstFilePart GstFilePart; +typedef struct _GstSplitFileSrc GstSplitFileSrc; +typedef struct _GstSplitFileSrcClass GstSplitFileSrcClass; + +struct _GstFilePart +{ + GFileInputStream *stream; + gchar *path; + guint64 start; /* inclusive */ + guint64 stop; /* inclusive */ +}; + +struct _GstSplitFileSrc +{ + GstBaseSrc parent; + + gchar *location; /* OBJECT_LOCK */ + + GstFilePart *parts; + guint num_parts; + + guint cur_part; /* part used last (likely also to be used next) */ + + GCancellable *cancellable; /* so we can interrupt blocking operations */ +}; + +struct _GstSplitFileSrcClass +{ + GstBaseSrcClass parent_class; +}; + +GType gst_split_file_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_SPLIT_FILE_SRC_H__ */ diff --git a/gst/multifile/patternspec.c b/gst/multifile/patternspec.c new file mode 100644 index 0000000..59de8d1 --- /dev/null +++ b/gst/multifile/patternspec.c @@ -0,0 +1,334 @@ +/* GPattern copy that supports raw (non-utf8) matching + * based on: GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. + * + * 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 "patternspec.h" +#include + +typedef enum +{ + MATCH_ALL, /* "*A?A*" */ + MATCH_ALL_TAIL, /* "*A?AA" */ + MATCH_HEAD, /* "AAAA*" */ + MATCH_TAIL, /* "*AAAA" */ + MATCH_EXACT, /* "AAAAA" */ + MATCH_LAST +} MatchType; + +struct _PatternSpec +{ + MatchMode match_mode; + MatchType match_type; + guint pattern_length; + guint min_length; + guint max_length; + gchar *pattern; +}; + +static inline gchar * +raw_strreverse (const gchar * str, gssize size) +{ + g_assert (size > 0); + return g_strreverse (g_strndup (str, size)); +} + +static inline gboolean +pattern_ph_match (const gchar * match_pattern, MatchMode match_mode, + const gchar * match_string, gboolean * wildcard_reached_p) +{ + register const gchar *pattern, *string; + register gchar ch; + + pattern = match_pattern; + string = match_string; + + ch = *pattern; + pattern++; + while (ch) { + switch (ch) { + case '?': + if (!*string) + return FALSE; + if (match_mode == MATCH_MODE_UTF8) + string = g_utf8_next_char (string); + else + ++string; + break; + + case '*': + *wildcard_reached_p = TRUE; + do { + ch = *pattern; + pattern++; + if (ch == '?') { + if (!*string) + return FALSE; + if (match_mode == MATCH_MODE_UTF8) + string = g_utf8_next_char (string); + else + ++string; + } + } + while (ch == '*' || ch == '?'); + if (!ch) + return TRUE; + do { + gboolean next_wildcard_reached = FALSE; + while (ch != *string) { + if (!*string) + return FALSE; + if (match_mode == MATCH_MODE_UTF8) + string = g_utf8_next_char (string); + else + ++string; + } + string++; + if (pattern_ph_match (pattern, match_mode, string, + &next_wildcard_reached)) + return TRUE; + if (next_wildcard_reached) + /* the forthcoming pattern substring up to the next wildcard has + * been matched, but a mismatch occoured for the rest of the + * pattern, following the next wildcard. + * there's no need to advance the current match position any + * further if the rest pattern will not match. + */ + return FALSE; + } + while (*string); + break; + + default: + if (ch == *string) + string++; + else + return FALSE; + break; + } + + ch = *pattern; + pattern++; + } + + return *string == 0; +} + +static gboolean +pattern_match (PatternSpec * pspec, guint string_length, + const gchar * string, const gchar * string_reversed) +{ + MatchMode match_mode; + + g_assert (pspec != NULL); + g_assert (string != NULL); + + if (string_length < pspec->min_length || string_length > pspec->max_length) + return FALSE; + + match_mode = pspec->match_mode; + if (match_mode == MATCH_MODE_AUTO) { + if (!g_utf8_validate (string, string_length, NULL)) + match_mode = MATCH_MODE_RAW; + else + match_mode = MATCH_MODE_UTF8; + } + + switch (pspec->match_type) { + gboolean dummy; + case MATCH_ALL: + return pattern_ph_match (pspec->pattern, match_mode, string, &dummy); + case MATCH_ALL_TAIL: + if (string_reversed) + return pattern_ph_match (pspec->pattern, match_mode, string_reversed, + &dummy); + else { + gboolean result; + gchar *tmp; + if (match_mode == MATCH_MODE_UTF8) { + tmp = g_utf8_strreverse (string, string_length); + } else { + tmp = raw_strreverse (string, string_length); + } + result = pattern_ph_match (pspec->pattern, match_mode, tmp, &dummy); + g_free (tmp); + return result; + } + case MATCH_HEAD: + if (pspec->pattern_length == string_length) + return memcmp (pspec->pattern, string, string_length) == 0; + else if (pspec->pattern_length) + return memcmp (pspec->pattern, string, pspec->pattern_length) == 0; + else + return TRUE; + case MATCH_TAIL: + if (pspec->pattern_length) + /* compare incl. NUL terminator */ + return memcmp (pspec->pattern, + string + (string_length - pspec->pattern_length), + pspec->pattern_length + 1) == 0; + else + return TRUE; + case MATCH_EXACT: + if (pspec->pattern_length != string_length) + return FALSE; + else + return memcmp (pspec->pattern, string, string_length) == 0; + default: + g_return_val_if_fail (pspec->match_type < MATCH_LAST, FALSE); + return FALSE; + } +} + +PatternSpec * +pattern_spec_new (const gchar * pattern, MatchMode match_mode) +{ + PatternSpec *pspec; + gboolean seen_joker = FALSE, seen_wildcard = FALSE, more_wildcards = FALSE; + gint hw_pos = -1, tw_pos = -1, hj_pos = -1, tj_pos = -1; + gboolean follows_wildcard = FALSE; + guint pending_jokers = 0; + const gchar *s; + gchar *d; + guint i; + + g_assert (pattern != NULL); + g_assert (match_mode != MATCH_MODE_UTF8 + || g_utf8_validate (pattern, -1, NULL)); + + /* canonicalize pattern and collect necessary stats */ + pspec = g_new (PatternSpec, 1); + pspec->match_mode = match_mode; + pspec->pattern_length = strlen (pattern); + pspec->min_length = 0; + pspec->max_length = 0; + pspec->pattern = g_new (gchar, pspec->pattern_length + 1); + + if (pspec->match_mode == MATCH_MODE_AUTO) { + if (!g_utf8_validate (pattern, -1, NULL)) + pspec->match_mode = MATCH_MODE_RAW; + } + + d = pspec->pattern; + for (i = 0, s = pattern; *s != 0; s++) { + switch (*s) { + case '*': + if (follows_wildcard) { /* compress multiple wildcards */ + pspec->pattern_length--; + continue; + } + follows_wildcard = TRUE; + if (hw_pos < 0) + hw_pos = i; + tw_pos = i; + break; + case '?': + pending_jokers++; + pspec->min_length++; + if (pspec->match_mode == MATCH_MODE_RAW) { + pspec->max_length += 1; + } else { + pspec->max_length += 4; /* maximum UTF-8 character length */ + } + continue; + default: + for (; pending_jokers; pending_jokers--, i++) { + *d++ = '?'; + if (hj_pos < 0) + hj_pos = i; + tj_pos = i; + } + follows_wildcard = FALSE; + pspec->min_length++; + pspec->max_length++; + break; + } + *d++ = *s; + i++; + } + for (; pending_jokers; pending_jokers--) { + *d++ = '?'; + if (hj_pos < 0) + hj_pos = i; + tj_pos = i; + } + *d++ = 0; + seen_joker = hj_pos >= 0; + seen_wildcard = hw_pos >= 0; + more_wildcards = seen_wildcard && hw_pos != tw_pos; + if (seen_wildcard) + pspec->max_length = G_MAXUINT; + + /* special case sole head/tail wildcard or exact matches */ + if (!seen_joker && !more_wildcards) { + if (pspec->pattern[0] == '*') { + pspec->match_type = MATCH_TAIL; + memmove (pspec->pattern, pspec->pattern + 1, --pspec->pattern_length); + pspec->pattern[pspec->pattern_length] = 0; + return pspec; + } + if (pspec->pattern_length > 0 && + pspec->pattern[pspec->pattern_length - 1] == '*') { + pspec->match_type = MATCH_HEAD; + pspec->pattern[--pspec->pattern_length] = 0; + return pspec; + } + if (!seen_wildcard) { + pspec->match_type = MATCH_EXACT; + return pspec; + } + } + + /* now just need to distinguish between head or tail match start */ + tw_pos = pspec->pattern_length - 1 - tw_pos; /* last pos to tail distance */ + tj_pos = pspec->pattern_length - 1 - tj_pos; /* last pos to tail distance */ + if (seen_wildcard) + pspec->match_type = tw_pos > hw_pos ? MATCH_ALL_TAIL : MATCH_ALL; + else /* seen_joker */ + pspec->match_type = tj_pos > hj_pos ? MATCH_ALL_TAIL : MATCH_ALL; + if (pspec->match_type == MATCH_ALL_TAIL) { + gchar *tmp = pspec->pattern; + + if (pspec->match_mode == MATCH_MODE_RAW) { + pspec->pattern = raw_strreverse (pspec->pattern, pspec->pattern_length); + } else { + pspec->pattern = + g_utf8_strreverse (pspec->pattern, pspec->pattern_length); + } + g_free (tmp); + } + return pspec; +} + +void +pattern_spec_free (PatternSpec * pspec) +{ + g_assert (pspec != NULL); + + g_free (pspec->pattern); + g_free (pspec); +} + +gboolean +pattern_match_string (PatternSpec * pspec, const gchar * string) +{ + return pattern_match (pspec, strlen (string), string, NULL); +} diff --git a/gst/multifile/patternspec.h b/gst/multifile/patternspec.h new file mode 100644 index 0000000..c3e9436 --- /dev/null +++ b/gst/multifile/patternspec.h @@ -0,0 +1,47 @@ +/* GPattern copy that supports raw (non-utf8) matching + * based on: GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. + * + * 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. + */ + +#ifndef __PATTERN_SPEC_H__ +#define __PATTERN_SPEC_H__ + +#include + +G_BEGIN_DECLS + +typedef enum +{ + MATCH_MODE_AUTO = 0, + MATCH_MODE_UTF8, + MATCH_MODE_RAW +} MatchMode; + +typedef struct _PatternSpec PatternSpec; + +PatternSpec * pattern_spec_new (const gchar * pattern, + MatchMode match_mode); + +void pattern_spec_free (PatternSpec * pspec); + +gboolean pattern_match_string (PatternSpec * pspec, + const gchar * string); + +G_END_DECLS + +#endif /* __PATTERN_SPEC_H__ */ diff --git a/gst/multipart/Makefile.am b/gst/multipart/Makefile.am new file mode 100644 index 0000000..8ec931e --- /dev/null +++ b/gst/multipart/Makefile.am @@ -0,0 +1,24 @@ +plugin_LTLIBRARIES = libgstmultipart.la + +libgstmultipart_la_SOURCES = multipart.c multipartdemux.c multipartmux.c +libgstmultipart_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) +libgstmultipart_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstmultipart_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmultipart_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = multipartdemux.h multipartmux.h + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstmultipart -:SHARED libgstmultipart \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmultipart_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmultipart_la_CFLAGS) \ + -:LDFLAGS $(libgstmultipart_la_LDFLAGS) \ + $(libgstmultipart_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/multipart/Makefile.in b/gst/multipart/Makefile.in new file mode 100644 index 0000000..7a421f3 --- /dev/null +++ b/gst/multipart/Makefile.in @@ -0,0 +1,837 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/multipart +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstmultipart_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstmultipart_la_OBJECTS = libgstmultipart_la-multipart.lo \ + libgstmultipart_la-multipartdemux.lo \ + libgstmultipart_la-multipartmux.lo +libgstmultipart_la_OBJECTS = $(am_libgstmultipart_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstmultipart_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstmultipart_la_CFLAGS) $(CFLAGS) \ + $(libgstmultipart_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstmultipart_la_SOURCES) +DIST_SOURCES = $(libgstmultipart_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstmultipart.la +libgstmultipart_la_SOURCES = multipart.c multipartdemux.c multipartmux.c +libgstmultipart_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) +libgstmultipart_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstmultipart_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstmultipart_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = multipartdemux.h multipartmux.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/multipart/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/multipart/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstmultipart.la: $(libgstmultipart_la_OBJECTS) $(libgstmultipart_la_DEPENDENCIES) $(EXTRA_libgstmultipart_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstmultipart_la_LINK) -rpath $(plugindir) $(libgstmultipart_la_OBJECTS) $(libgstmultipart_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultipart_la-multipart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultipart_la-multipartdemux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultipart_la-multipartmux.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstmultipart_la-multipart.lo: multipart.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -MT libgstmultipart_la-multipart.lo -MD -MP -MF $(DEPDIR)/libgstmultipart_la-multipart.Tpo -c -o libgstmultipart_la-multipart.lo `test -f 'multipart.c' || echo '$(srcdir)/'`multipart.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultipart_la-multipart.Tpo $(DEPDIR)/libgstmultipart_la-multipart.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multipart.c' object='libgstmultipart_la-multipart.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -c -o libgstmultipart_la-multipart.lo `test -f 'multipart.c' || echo '$(srcdir)/'`multipart.c + +libgstmultipart_la-multipartdemux.lo: multipartdemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -MT libgstmultipart_la-multipartdemux.lo -MD -MP -MF $(DEPDIR)/libgstmultipart_la-multipartdemux.Tpo -c -o libgstmultipart_la-multipartdemux.lo `test -f 'multipartdemux.c' || echo '$(srcdir)/'`multipartdemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultipart_la-multipartdemux.Tpo $(DEPDIR)/libgstmultipart_la-multipartdemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multipartdemux.c' object='libgstmultipart_la-multipartdemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -c -o libgstmultipart_la-multipartdemux.lo `test -f 'multipartdemux.c' || echo '$(srcdir)/'`multipartdemux.c + +libgstmultipart_la-multipartmux.lo: multipartmux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -MT libgstmultipart_la-multipartmux.lo -MD -MP -MF $(DEPDIR)/libgstmultipart_la-multipartmux.Tpo -c -o libgstmultipart_la-multipartmux.lo `test -f 'multipartmux.c' || echo '$(srcdir)/'`multipartmux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultipart_la-multipartmux.Tpo $(DEPDIR)/libgstmultipart_la-multipartmux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multipartmux.c' object='libgstmultipart_la-multipartmux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -c -o libgstmultipart_la-multipartmux.lo `test -f 'multipartmux.c' || echo '$(srcdir)/'`multipartmux.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstmultipart -:SHARED libgstmultipart \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstmultipart_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmultipart_la_CFLAGS) \ + -:LDFLAGS $(libgstmultipart_la_LDFLAGS) \ + $(libgstmultipart_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/multipart/multipart.c b/gst/multipart/multipart.c new file mode 100644 index 0000000..12bab4c --- /dev/null +++ b/gst/multipart/multipart.c @@ -0,0 +1,42 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 + +#include "multipartdemux.h" +#include "multipartmux.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_multipart_demux_plugin_init (plugin); + gst_multipart_mux_plugin_init (plugin); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "multipart", + "multipart stream manipulation", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/multipart/multipartdemux.c b/gst/multipart/multipartdemux.c new file mode 100644 index 0000000..525143c --- /dev/null +++ b/gst/multipart/multipartdemux.c @@ -0,0 +1,732 @@ +/* GStreamer + * Copyright (C) 2006 Sjoerd Simons + * Copyright (C) 2004 Wim Taymans + * + * gstmultipartdemux.c: multipart stream demuxer + * + * 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-multipartdemux + * @see_also: #GstMultipartMux + * + * MultipartDemux uses the Content-type field of incoming buffers to demux and + * push data to dynamic source pads. Most of the time multipart streams are + * sequential JPEG frames generated from a live source such as a network source + * or a camera. + * + * The output buffers of the multipartdemux typically have no timestamps and are + * usually played as fast as possible (at the rate that the source provides the + * data). + * + * the content in multipart files is separated with a boundary string that can + * be configured specifically with the #GstMultipartDemux:boundary property + * otherwise it will be autodetected. + * + * + * Sample pipelines + * |[ + * gst-launch filesrc location=/tmp/test.multipart ! multipartdemux ! jpegdec ! ffmpegcolorspace ! ximagesink + * ]| a simple pipeline to demux a multipart file muxed with #GstMultipartMux + * containing JPEG frames. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "multipartdemux.h" + +GST_DEBUG_CATEGORY_STATIC (gst_multipart_demux_debug); +#define GST_CAT_DEFAULT gst_multipart_demux_debug + +/* signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_AUTOSCAN FALSE +#define DEFAULT_BOUNDARY NULL +#define DEFAULT_SINGLE_STREAM FALSE + +enum +{ + PROP_0, + PROP_AUTOSCAN, + PROP_BOUNDARY, + PROP_SINGLE_STREAM +}; + +static GstStaticPadTemplate multipart_demux_src_template_factory = +GST_STATIC_PAD_TEMPLATE ("src_%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate multipart_demux_sink_template_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("multipart/x-mixed-replace") + ); + +typedef struct +{ + const gchar *key; + const gchar *val; +} GstNamesMap; + +/* convert from mime types to gst structure names. Add more when needed. The + * mime-type is stored as lowercase */ +static const GstNamesMap gstnames[] = { + /* RFC 2046 says audio/basic is mulaw, mono, 8000Hz */ + {"audio/basic", "audio/x-mulaw, channels=1, rate=8000"}, + {"audio/g726-16", + "audio/x-adpcm, bitrate=16000, layout=g726, channels=1, rate=8000"}, + {"audio/g726-24", + "audio/x-adpcm, bitrate=24000, layout=g726, channels=1, rate=8000"}, + {"audio/g726-32", + "audio/x-adpcm, bitrate=32000, layout=g726, channels=1, rate=8000"}, + {"audio/g726-40", + "audio/x-adpcm, bitrate=40000, layout=g726, channels=1, rate=8000"}, + /* Panasonic Network Cameras non-standard types */ + {"audio/g726", + "audio/x-adpcm, bitrate=32000, layout=g726, channels=1, rate=8000"}, + {NULL, NULL} +}; + + +static GstFlowReturn gst_multipart_demux_chain (GstPad * pad, GstBuffer * buf); + +static GstStateChangeReturn gst_multipart_demux_change_state (GstElement * + element, GstStateChange transition); + +static void gst_multipart_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static void gst_multipart_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_multipart_demux_finalize (GObject * object); + +GST_BOILERPLATE (GstMultipartDemux, gst_multipart_demux, GstElement, + GST_TYPE_ELEMENT); + +static void +gst_multipart_demux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &multipart_demux_sink_template_factory); + gst_element_class_add_static_pad_template (element_class, + &multipart_demux_src_template_factory); + gst_element_class_set_details_simple (element_class, "Multipart demuxer", + "Codec/Demuxer", + "demux multipart streams", + "Wim Taymans , Sjoerd Simons "); +} + +static void +gst_multipart_demux_class_init (GstMultipartDemuxClass * klass) +{ + int i; + + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + gobject_class->finalize = gst_multipart_demux_finalize; + gobject_class->set_property = gst_multipart_set_property; + gobject_class->get_property = gst_multipart_get_property; + + g_object_class_install_property (gobject_class, PROP_BOUNDARY, + g_param_spec_string ("boundary", "Boundary", + "The boundary string separating data, automatic if NULL", + DEFAULT_BOUNDARY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_AUTOSCAN, + g_param_spec_boolean ("autoscan", "autoscan", + "Try to autofind the prefix (deprecated unused, see boundary)", + DEFAULT_AUTOSCAN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstMultipartDemux::single-stream: + * + * Assume that there is only one stream whose content-type will + * not change and emit no-more-pads as soon as the first boundary + * content is parsed, decoded, and pads are linked. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_SINGLE_STREAM, + g_param_spec_boolean ("single-stream", "Single Stream", + "Assume that there is only one stream whose content-type will not change and emit no-more-pads as soon as the first boundary content is parsed, decoded, and pads are linked", + DEFAULT_SINGLE_STREAM, G_PARAM_READWRITE)); + + /* populate gst names and mime types pairs */ + klass->gstnames = g_hash_table_new (g_str_hash, g_str_equal); + for (i = 0; gstnames[i].key; i++) { + g_hash_table_insert (klass->gstnames, (gpointer) gstnames[i].key, + (gpointer) gstnames[i].val); + } + + gstelement_class->change_state = gst_multipart_demux_change_state; +} + +static void +gst_multipart_demux_init (GstMultipartDemux * multipart, + GstMultipartDemuxClass * g_class) +{ + /* create the sink pad */ + multipart->sinkpad = + gst_pad_new_from_static_template (&multipart_demux_sink_template_factory, + "sink"); + gst_element_add_pad (GST_ELEMENT_CAST (multipart), multipart->sinkpad); + gst_pad_set_chain_function (multipart->sinkpad, + GST_DEBUG_FUNCPTR (gst_multipart_demux_chain)); + + multipart->adapter = gst_adapter_new (); + multipart->boundary = DEFAULT_BOUNDARY; + multipart->mime_type = NULL; + multipart->content_length = -1; + multipart->header_completed = FALSE; + multipart->scanpos = 0; + multipart->autoscan = DEFAULT_AUTOSCAN; + multipart->singleStream = DEFAULT_SINGLE_STREAM; +} + +static void +gst_multipart_pad_free (GstMultipartPad * mppad) +{ + g_free (mppad->mime); + g_free (mppad); +} + +static void +gst_multipart_demux_finalize (GObject * object) +{ + GstMultipartDemux *demux = GST_MULTIPART_DEMUX (object); + + g_object_unref (demux->adapter); + g_free (demux->boundary); + g_free (demux->mime_type); + g_slist_foreach (demux->srcpads, (GFunc) gst_multipart_pad_free, NULL); + g_slist_free (demux->srcpads); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static const gchar * +gst_multipart_demux_get_gstname (GstMultipartDemux * demux, gchar * mimetype) +{ + GstMultipartDemuxClass *klass; + const gchar *gstname; + + klass = GST_MULTIPART_DEMUX_GET_CLASS (demux); + + /* use hashtable to convert to gst name */ + gstname = g_hash_table_lookup (klass->gstnames, mimetype); + if (gstname == NULL) { + /* no gst name mapping, use mime type */ + gstname = mimetype; + } + GST_DEBUG_OBJECT (demux, "gst name for %s is %s", mimetype, gstname); + return gstname; +} + +static GstFlowReturn +gst_multipart_combine_flows (GstMultipartDemux * demux, GstMultipartPad * pad, + GstFlowReturn ret) +{ + GSList *walk; + + /* store the value */ + pad->last_ret = ret; + + /* any other error that is not-linked can be returned right + * away */ + if (ret != GST_FLOW_NOT_LINKED) + goto done; + + /* only return NOT_LINKED if all other pads returned NOT_LINKED */ + for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { + GstMultipartPad *opad = (GstMultipartPad *) walk->data; + + ret = opad->last_ret; + /* some other return value (must be SUCCESS but we can return + * other values as well) */ + if (ret != GST_FLOW_NOT_LINKED) + goto done; + } + /* if we get here, all other pads were unlinked and we return + * NOT_LINKED then */ +done: + return ret; +} + +static GstMultipartPad * +gst_multipart_find_pad_by_mime (GstMultipartDemux * demux, gchar * mime, + gboolean * created) +{ + GSList *walk; + + walk = demux->srcpads; + while (walk) { + GstMultipartPad *pad = (GstMultipartPad *) walk->data; + + if (!strcmp (pad->mime, mime)) { + if (created) { + *created = FALSE; + } + return pad; + } + + walk = walk->next; + } + /* pad not found, create it */ + { + GstPad *pad; + GstMultipartPad *mppad; + gchar *name; + const gchar *capsname; + GstCaps *caps; + + mppad = g_new0 (GstMultipartPad, 1); + + GST_DEBUG_OBJECT (demux, "creating pad with mime: %s", mime); + + name = g_strdup_printf ("src_%d", demux->numpads); + pad = + gst_pad_new_from_static_template (&multipart_demux_src_template_factory, + name); + g_free (name); + + /* take the mime type, convert it to the caps name */ + capsname = gst_multipart_demux_get_gstname (demux, mime); + caps = gst_caps_from_string (capsname); + GST_DEBUG_OBJECT (demux, "caps for pad: %s", capsname); + gst_pad_use_fixed_caps (pad); + gst_pad_set_caps (pad, caps); + gst_caps_unref (caps); + + mppad->pad = pad; + mppad->mime = g_strdup (mime); + mppad->last_ret = GST_FLOW_OK; + + demux->srcpads = g_slist_prepend (demux->srcpads, mppad); + demux->numpads++; + + gst_pad_set_active (pad, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (demux), pad); + + if (created) { + *created = TRUE; + } + + if (demux->singleStream) { + gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); + } + + return mppad; + } +} + +static gboolean +get_line_end (const guint8 * data, const guint8 * dataend, guint8 ** end, + guint8 ** next) +{ + guint8 *x; + gboolean foundr = FALSE; + + for (x = (guint8 *) data; x < dataend; x++) { + if (*x == '\r') { + foundr = TRUE; + } else if (*x == '\n') { + *end = x - (foundr ? 1 : 0); + *next = x + 1; + return TRUE; + } + } + return FALSE; +} + +static guint +get_mime_len (const guint8 * data, guint maxlen) +{ + guint8 *x; + + x = (guint8 *) data; + while (*x != '\0' && *x != '\r' && *x != '\n' && *x != ';') { + x++; + } + return x - data; +} + +static gint +multipart_parse_header (GstMultipartDemux * multipart) +{ + const guint8 *data; + const guint8 *dataend; + gchar *boundary; + int boundary_len; + int datalen; + guint8 *pos; + guint8 *end, *next; + + datalen = gst_adapter_available (multipart->adapter); + data = gst_adapter_peek (multipart->adapter, datalen); + dataend = data + datalen; + + /* Skip leading whitespace, pos endposition should at least leave space for + * the boundary and a \n */ + for (pos = (guint8 *) data; pos < dataend - 4 && g_ascii_isspace (*pos); + pos++); + + if (pos >= dataend - 4) { + return MULTIPART_NEED_MORE_DATA; + } + + if (G_UNLIKELY (pos[0] != '-' || pos[1] != '-')) { + GST_DEBUG_OBJECT (multipart, "No boundary available"); + goto wrong_header; + } + + /* First the boundary */ + if (!get_line_end (pos, dataend, &end, &next)) + return MULTIPART_NEED_MORE_DATA; + + /* Ignore the leading -- */ + boundary_len = end - pos - 2; + boundary = (gchar *) pos + 2; + if (boundary_len < 1) { + GST_DEBUG_OBJECT (multipart, "No boundary available"); + goto wrong_header; + } + + if (G_UNLIKELY (multipart->boundary == NULL)) { + /* First time we see the boundary, copy it */ + multipart->boundary = g_strndup (boundary, boundary_len); + multipart->boundary_len = boundary_len; + } else if (G_UNLIKELY (boundary_len != multipart->boundary_len)) { + /* Something odd is going on, either the boundary indicated EOS or it's + * invalid */ + if (G_UNLIKELY (boundary_len == multipart->boundary_len + 2 && + !strncmp (boundary, multipart->boundary, multipart->boundary_len) && + !strncmp (boundary + multipart->boundary_len, "--", 2))) { + return MULTIPART_DATA_EOS; + } + GST_DEBUG_OBJECT (multipart, + "Boundary length doesn't match detected boundary (%d <> %d", + boundary_len, multipart->boundary_len); + goto wrong_header; + } else if (G_UNLIKELY (strncmp (boundary, multipart->boundary, boundary_len))) { + GST_DEBUG_OBJECT (multipart, "Boundary doesn't match previous boundary"); + goto wrong_header; + } + + + pos = next; + while (get_line_end (pos, dataend, &end, &next)) { + guint len = end - pos; + + if (len == 0) { + /* empty line, data starts behind us */ + GST_DEBUG_OBJECT (multipart, + "Parsed the header - boundary: %s, mime-type: %s, content-length: %d", + multipart->boundary, multipart->mime_type, multipart->content_length); + return next - data; + } + + if (len >= 14 && !g_ascii_strncasecmp ("content-type:", (gchar *) pos, 13)) { + guint mime_len; + + /* only take the mime type up to the first ; if any. After ; there can be + * properties that we don't handle yet. */ + mime_len = get_mime_len (pos + 14, len - 14); + + g_free (multipart->mime_type); + multipart->mime_type = g_ascii_strdown ((gchar *) pos + 14, mime_len); + } else if (len >= 15 && + !g_ascii_strncasecmp ("content-length:", (gchar *) pos, 15)) { + multipart->content_length = + g_ascii_strtoull ((gchar *) pos + 15, NULL, 10); + } + pos = next; + } + GST_DEBUG_OBJECT (multipart, "Need more data for the header"); + return MULTIPART_NEED_MORE_DATA; + +wrong_header: + { + GST_ELEMENT_ERROR (multipart, STREAM, DEMUX, (NULL), + ("Boundary not found in the multipart header")); + return MULTIPART_DATA_ERROR; + } +} + +static gint +multipart_find_boundary (GstMultipartDemux * multipart, gint * datalen) +{ + /* Adaptor is positioned at the start of the data */ + const guint8 *data, *pos; + const guint8 *dataend; + gint len; + + if (multipart->content_length >= 0) { + /* fast path, known content length :) */ + len = multipart->content_length; + if (gst_adapter_available (multipart->adapter) >= len + 2) { + *datalen = len; + data = gst_adapter_peek (multipart->adapter, len + 1); + + /* If data[len] contains \r then assume a newline is \r\n */ + if (data[len] == '\r') + len += 2; + else if (data[len] == '\n') + len += 1; + /* Don't check if boundary is actually there, but let the header parsing + * bail out if it isn't */ + return len; + } else { + /* need more data */ + return MULTIPART_NEED_MORE_DATA; + } + } + + len = gst_adapter_available (multipart->adapter); + if (len == 0) + return MULTIPART_NEED_MORE_DATA; + data = gst_adapter_peek (multipart->adapter, len); + dataend = data + len; + + for (pos = data + multipart->scanpos; + pos <= dataend - multipart->boundary_len - 2; pos++) { + if (*pos == '-' && pos[1] == '-' && + !strncmp ((gchar *) pos + 2, + multipart->boundary, multipart->boundary_len)) { + /* Found the boundary! Check if there was a newline before the boundary */ + len = pos - data; + if (pos - 2 > data && pos[-2] == '\r') + len -= 2; + else if (pos - 1 > data && pos[-1] == '\n') + len -= 1; + *datalen = len; + + multipart->scanpos = 0; + return pos - data; + } + } + multipart->scanpos = pos - data; + return MULTIPART_NEED_MORE_DATA; +} + +static GstFlowReturn +gst_multipart_demux_chain (GstPad * pad, GstBuffer * buf) +{ + GstMultipartDemux *multipart; + GstAdapter *adapter; + GstClockTime timestamp; + gint size = 1; + GstFlowReturn res; + + multipart = GST_MULTIPART_DEMUX (gst_pad_get_parent (pad)); + adapter = multipart->adapter; + + res = GST_FLOW_OK; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + + if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) { + gst_adapter_clear (adapter); + } + gst_adapter_push (adapter, buf); + + while (gst_adapter_available (adapter) > 0) { + GstMultipartPad *srcpad; + GstBuffer *outbuf; + gboolean created; + gint datalen; + + if (G_UNLIKELY (!multipart->header_completed)) { + if ((size = multipart_parse_header (multipart)) < 0) { + goto nodata; + } else { + gst_adapter_flush (adapter, size); + multipart->header_completed = TRUE; + } + } + if ((size = multipart_find_boundary (multipart, &datalen)) < 0) { + goto nodata; + } + + /* Invalidate header info */ + multipart->header_completed = FALSE; + multipart->content_length = -1; + + if (G_UNLIKELY (datalen <= 0)) { + GST_DEBUG_OBJECT (multipart, "skipping empty content."); + gst_adapter_flush (adapter, size - datalen); + } else { + srcpad = + gst_multipart_find_pad_by_mime (multipart, + multipart->mime_type, &created); + outbuf = gst_adapter_take_buffer (adapter, datalen); + gst_adapter_flush (adapter, size - datalen); + + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (srcpad->pad)); + if (created) { + GstTagList *tags; + + /* Push new segment, first buffer has 0 timestamp */ + gst_pad_push_event (srcpad->pad, + gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0)); + + tags = + gst_tag_list_new_full (GST_TAG_CONTAINER_FORMAT, "Multipart", NULL); + gst_pad_push_event (srcpad->pad, gst_event_new_tag (tags)); + + GST_BUFFER_TIMESTAMP (outbuf) = 0; + } else { + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + } + GST_DEBUG_OBJECT (multipart, + "pushing buffer with timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf))); + GST_DEBUG_OBJECT (multipart, "buffer has caps %" GST_PTR_FORMAT, + GST_BUFFER_CAPS (outbuf)); + res = gst_pad_push (srcpad->pad, outbuf); + res = gst_multipart_combine_flows (multipart, srcpad, res); + if (res != GST_FLOW_OK) + break; + } + } + +nodata: + gst_object_unref (multipart); + + if (G_UNLIKELY (size == MULTIPART_DATA_ERROR)) + return GST_FLOW_ERROR; + if (G_UNLIKELY (size == MULTIPART_DATA_EOS)) + return GST_FLOW_UNEXPECTED; + + return res; +} + +static GstStateChangeReturn +gst_multipart_demux_change_state (GstElement * element, + GstStateChange transition) +{ + GstMultipartDemux *multipart; + GstStateChangeReturn ret; + + multipart = GST_MULTIPART_DEMUX (element); + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + multipart->header_completed = FALSE; + g_free (multipart->boundary); + multipart->boundary = NULL; + g_free (multipart->mime_type); + multipart->mime_type = NULL; + gst_adapter_clear (multipart->adapter); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + + +static void +gst_multipart_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMultipartDemux *filter; + + g_return_if_fail (GST_IS_MULTIPART_DEMUX (object)); + filter = GST_MULTIPART_DEMUX (object); + + switch (prop_id) { + case PROP_BOUNDARY: + /* Not really that usefull anymore as we can reliably autoscan */ + g_free (filter->boundary); + filter->boundary = g_value_dup_string (value); + if (filter->boundary != NULL) { + filter->boundary_len = strlen (filter->boundary); + } + break; + case PROP_AUTOSCAN: + filter->autoscan = g_value_get_boolean (value); + break; + case PROP_SINGLE_STREAM: + filter->singleStream = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_multipart_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMultipartDemux *filter; + + g_return_if_fail (GST_IS_MULTIPART_DEMUX (object)); + filter = GST_MULTIPART_DEMUX (object); + + switch (prop_id) { + case PROP_BOUNDARY: + g_value_set_string (value, filter->boundary); + break; + case PROP_AUTOSCAN: + g_value_set_boolean (value, filter->autoscan); + break; + case PROP_SINGLE_STREAM: + g_value_set_boolean (value, filter->singleStream); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + + +gboolean +gst_multipart_demux_plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_multipart_demux_debug, + "multipartdemux", 0, "multipart demuxer"); + + return gst_element_register (plugin, "multipartdemux", GST_RANK_PRIMARY, + GST_TYPE_MULTIPART_DEMUX); +} diff --git a/gst/multipart/multipartdemux.h b/gst/multipart/multipartdemux.h new file mode 100644 index 0000000..5d37bc9 --- /dev/null +++ b/gst/multipart/multipartdemux.h @@ -0,0 +1,105 @@ +/* GStreamer + * Copyright (C) 2006 Sjoerd Simons + * Copyright (C) 2004 Wim Taymans + * + * gstmultipartdemux.h: multipart stream demuxer + * + * 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_MULTIPART_DEMUX__ +#define __GST_MULTIPART_DEMUX__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_MULTIPART_DEMUX (gst_multipart_demux_get_type()) +#define GST_MULTIPART_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTIPART_DEMUX, GstMultipartDemux)) +#define GST_MULTIPART_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIPART_DEMUX, GstMultipartDemux)) +#define GST_MULTIPART_DEMUX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MULTIPART_DEMUX, GstMultipartDemuxClass)) +#define GST_IS_MULTIPART_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTIPART_DEMUX)) +#define GST_IS_MULTIPART_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIPART_DEMUX)) + +typedef struct _GstMultipartDemux GstMultipartDemux; +typedef struct _GstMultipartDemuxClass GstMultipartDemuxClass; + +#define MULTIPART_NEED_MORE_DATA -1 +#define MULTIPART_DATA_ERROR -2 +#define MULTIPART_DATA_EOS -3 + +/* all information needed for one multipart stream */ +typedef struct +{ + GstPad *pad; /* reference for this pad is held by element we belong to */ + + gchar *mime; + + GstFlowReturn last_ret; +} +GstMultipartPad; + +/** + * GstMultipartDemux: + * + * The opaque #GstMultipartDemux structure. + */ +struct _GstMultipartDemux +{ + GstElement element; + + /* pad */ + GstPad *sinkpad; + + GSList *srcpads; + gint numpads; + + GstAdapter *adapter; + + /* Header information of the current frame */ + gboolean header_completed; + gchar *boundary; + guint boundary_len; + gchar *mime_type; + gint content_length; + + /* deprecated, unused */ + gboolean autoscan; + + /* Index inside the current data when manually looking for the boundary */ + gint scanpos; + + gboolean singleStream; +}; + +struct _GstMultipartDemuxClass +{ + GstElementClass parent_class; + + GHashTable *gstnames; +}; + +GType gst_multipart_demux_get_type (void); + +gboolean gst_multipart_demux_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_MULTIPART_DEMUX__ */ + diff --git a/gst/multipart/multipartmux.c b/gst/multipart/multipartmux.c new file mode 100644 index 0000000..9d3e56a --- /dev/null +++ b/gst/multipart/multipartmux.c @@ -0,0 +1,681 @@ +/* multipart muxer plugin for GStreamer + * Copyright (C) 2004 Wim Taymans + * + * 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-multipartmux + * + * MultipartMux uses the #GstCaps of the sink pad as the Content-type field for + * incoming buffers when muxing them to a multipart stream. Most of the time + * multipart streams are sequential JPEG frames. + * + * + * Sample pipelines + * |[ + * gst-launch videotestsrc ! video/x-raw-yuv, framerate='(fraction)'5/1 ! jpegenc ! multipartmux ! filesink location=/tmp/test.multipart + * ]| a pipeline to mux 5 JPEG frames per second into a multipart stream + * stored to a file. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "multipartmux.h" + +GST_DEBUG_CATEGORY_STATIC (gst_multipart_mux_debug); +#define GST_CAT_DEFAULT gst_multipart_mux_debug + +#define DEFAULT_BOUNDARY "ThisRandomString" + +enum +{ + ARG_0, + ARG_BOUNDARY + /* FILL ME */ +}; + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("multipart/x-mixed-replace") + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS_ANY /* we can take anything, really */ + ); + +typedef struct +{ + const gchar *key; + const gchar *val; +} MimeTypeMap; + +/* convert from gst structure names to mime types. Add more when needed. */ +static const MimeTypeMap mimetypes[] = { + {"audio/x-mulaw", "audio/basic"}, + {NULL, NULL} +}; + +static void gst_multipart_mux_base_init (gpointer g_class); +static void gst_multipart_mux_class_init (GstMultipartMuxClass * klass); +static void gst_multipart_mux_init (GstMultipartMux * multipart_mux); + +static void gst_multipart_mux_finalize (GObject * object); + +static gboolean gst_multipart_mux_handle_src_event (GstPad * pad, + GstEvent * event); +static GstPad *gst_multipart_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static GstStateChangeReturn gst_multipart_mux_change_state (GstElement * + element, GstStateChange transition); + +static GstFlowReturn gst_multipart_mux_collected (GstCollectPads * pads, + GstMultipartMux * mux); + +static void gst_multipart_mux_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_multipart_mux_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstElementClass *parent_class = NULL; + +GType +gst_multipart_mux_get_type (void) +{ + static GType multipart_mux_type = 0; + + if (!multipart_mux_type) { + static const GTypeInfo multipart_mux_info = { + sizeof (GstMultipartMuxClass), + gst_multipart_mux_base_init, + NULL, + (GClassInitFunc) gst_multipart_mux_class_init, + NULL, + NULL, + sizeof (GstMultipartMux), + 0, + (GInstanceInitFunc) gst_multipart_mux_init, + }; + + multipart_mux_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMultipartMux", + &multipart_mux_info, 0); + } + return multipart_mux_type; +} + +static void +gst_multipart_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "Multipart muxer", + "Codec/Muxer", "mux multipart streams", "Wim Taymans "); +} + +static void +gst_multipart_mux_class_init (GstMultipartMuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + gint i; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_multipart_mux_finalize; + gobject_class->get_property = gst_multipart_mux_get_property; + gobject_class->set_property = gst_multipart_mux_set_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BOUNDARY, + g_param_spec_string ("boundary", "Boundary", "Boundary string", + DEFAULT_BOUNDARY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->request_new_pad = gst_multipart_mux_request_new_pad; + gstelement_class->change_state = gst_multipart_mux_change_state; + + /* populate mime types */ + klass->mimetypes = g_hash_table_new (g_str_hash, g_str_equal); + for (i = 0; mimetypes[i].key; i++) { + g_hash_table_insert (klass->mimetypes, (gpointer) mimetypes[i].key, + (gpointer) mimetypes[i].val); + } +} + +static void +gst_multipart_mux_init (GstMultipartMux * multipart_mux) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (multipart_mux); + + multipart_mux->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); + gst_pad_set_event_function (multipart_mux->srcpad, + gst_multipart_mux_handle_src_event); + gst_element_add_pad (GST_ELEMENT (multipart_mux), multipart_mux->srcpad); + + multipart_mux->boundary = g_strdup (DEFAULT_BOUNDARY); + + multipart_mux->collect = gst_collect_pads_new (); + gst_collect_pads_set_function (multipart_mux->collect, + (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_multipart_mux_collected), + multipart_mux); +} + +static void +gst_multipart_mux_finalize (GObject * object) +{ + GstMultipartMux *multipart_mux; + + multipart_mux = GST_MULTIPART_MUX (object); + + g_free (multipart_mux->boundary); + + if (multipart_mux->collect) + gst_object_unref (multipart_mux->collect); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstPad * +gst_multipart_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) +{ + GstMultipartMux *multipart_mux; + GstPad *newpad; + GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); + gchar *name; + + if (templ != gst_element_class_get_pad_template (klass, "sink_%d")) + goto wrong_template; + + multipart_mux = GST_MULTIPART_MUX (element); + + /* create new pad with the name */ + name = g_strdup_printf ("sink_%02d", multipart_mux->numpads); + newpad = gst_pad_new_from_template (templ, name); + g_free (name); + + /* construct our own wrapper data structure for the pad to + * keep track of its status */ + { + GstMultipartPadData *multipartpad; + + multipartpad = (GstMultipartPadData *) + gst_collect_pads_add_pad (multipart_mux->collect, newpad, + sizeof (GstMultipartPadData)); + + /* save a pointer to our data in the pad */ + gst_pad_set_element_private (newpad, multipartpad); + multipart_mux->numpads++; + } + + /* add the pad to the element */ + gst_element_add_pad (element, newpad); + + return newpad; + + /* ERRORS */ +wrong_template: + { + g_warning ("multipart_mux: this is not our template!"); + return NULL; + } +} + +/* handle events */ +static gboolean +gst_multipart_mux_handle_src_event (GstPad * pad, GstEvent * event) +{ + GstMultipartMux *multipart_mux; + GstEventType type; + + multipart_mux = GST_MULTIPART_MUX (gst_pad_get_parent (pad)); + + type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; + + switch (type) { + case GST_EVENT_SEEK: + /* disable seeking for now */ + return FALSE; + default: + break; + } + + gst_object_unref (multipart_mux); + + return gst_pad_event_default (pad, event); +} + +static const gchar * +gst_multipart_mux_get_mime (GstMultipartMux * mux, GstStructure * s) +{ + GstMultipartMuxClass *klass; + const gchar *mime; + const gchar *name; + gint rate; + gint channels; + gint bitrate = 0; + + klass = GST_MULTIPART_MUX_GET_CLASS (mux); + + name = gst_structure_get_name (s); + + /* use hashtable to convert to mime type */ + mime = g_hash_table_lookup (klass->mimetypes, name); + if (mime == NULL) { + if (!strcmp (name, "audio/x-adpcm")) + gst_structure_get_int (s, "bitrate", &bitrate); + + switch (bitrate) { + case 16000: + mime = "audio/G726-16"; + break; + case 24000: + mime = "audio/G726-24"; + break; + case 32000: + mime = "audio/G726-32"; + break; + case 40000: + mime = "audio/G726-40"; + break; + default: + /* no mime type mapping, use name */ + mime = name; + break; + } + } + /* RFC2046 requires audio/basic to be mulaw 8000Hz mono */ + if (g_ascii_strcasecmp (mime, "audio/basic") == 0) { + if (gst_structure_get_int (s, "rate", &rate) && + gst_structure_get_int (s, "channels", &channels)) { + if (rate != 8000 || channels != 1) { + mime = name; + } + } else { + mime = name; + } + } + return mime; +} + +/* + * Given two pads, compare the buffers queued on it and return 0 if they have + * an equal priority, 1 if the new pad is better, -1 if the old pad is better + */ +static gint +gst_multipart_mux_compare_pads (GstMultipartMux * multipart_mux, + GstMultipartPadData * old, GstMultipartPadData * new) +{ + guint64 oldtime, newtime; + + /* if the old pad doesn't contain anything or is even NULL, return + * the new pad as best candidate and vice versa */ + if (old == NULL || old->buffer == NULL) + return 1; + if (new == NULL || new->buffer == NULL) + return -1; + + /* no timestamp on old buffer, it must go first */ + oldtime = old->timestamp; + if (oldtime == GST_CLOCK_TIME_NONE) + return -1; + + /* no timestamp on new buffer, it must go first */ + newtime = new->timestamp; + if (newtime == GST_CLOCK_TIME_NONE) + return 1; + + /* old buffer has higher timestamp, new one should go first */ + if (newtime < oldtime) + return 1; + /* new buffer has higher timestamp, old one should go first */ + else if (newtime > oldtime) + return -1; + + /* same priority if all of the above failed */ + return 0; +} + +/* make sure a buffer is queued on all pads, returns a pointer to an multipartpad + * that holds the best buffer or NULL when no pad was usable */ +static GstMultipartPadData * +gst_multipart_mux_queue_pads (GstMultipartMux * mux) +{ + GSList *walk = NULL; + GstMultipartPadData *bestpad = NULL; + + g_return_val_if_fail (GST_IS_MULTIPART_MUX (mux), NULL); + + /* try to make sure we have a buffer from each usable pad first */ + walk = mux->collect->data; + while (walk) { + GstCollectData *data = (GstCollectData *) walk->data; + GstMultipartPadData *pad = (GstMultipartPadData *) data; + + walk = g_slist_next (walk); + + /* try to get a new buffer for this pad if needed and possible */ + if (pad->buffer == NULL) { + GstBuffer *buf = NULL; + + buf = gst_collect_pads_pop (mux->collect, data); + + /* Store timestamp with segment_start and preroll */ + if (buf && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + pad->timestamp = + gst_segment_to_running_time (&data->segment, GST_FORMAT_TIME, + GST_BUFFER_TIMESTAMP (buf)); + } else { + pad->timestamp = GST_CLOCK_TIME_NONE; + } + + pad->buffer = buf; + } + + /* we should have a buffer now, see if it is the best stream to + * pull on */ + if (pad->buffer != NULL) { + if (gst_multipart_mux_compare_pads (mux, bestpad, pad) > 0) { + bestpad = pad; + } + } + } + + return bestpad; +} + +/* basic idea: + * + * 1) find a pad to pull on, this is done by pulling on all pads and + * looking at the buffers to decide which one should be muxed first. + * 2) create a new buffer for the header + * 3) push both buffers on best pad, go to 1 + */ +static GstFlowReturn +gst_multipart_mux_collected (GstCollectPads * pads, GstMultipartMux * mux) +{ + GstMultipartPadData *best; + GstFlowReturn ret = GST_FLOW_OK; + gchar *header = NULL; + size_t headerlen; + GstBuffer *headerbuf = NULL; + GstBuffer *footerbuf = NULL; + GstBuffer *databuf = NULL; + GstStructure *structure = NULL; + const gchar *mime; + + GST_DEBUG_OBJECT (mux, "all pads are collected"); + + /* queue buffers on all pads; find a buffer with the lowest timestamp */ + best = gst_multipart_mux_queue_pads (mux); + if (!best) + /* EOS */ + goto eos; + else if (!best->buffer) + goto buffer_error; + + /* If not negotiated yet set caps on src pad */ + if (!mux->negotiated) { + GstCaps *newcaps; + + newcaps = gst_caps_new_simple ("multipart/x-mixed-replace", + "boundary", G_TYPE_STRING, mux->boundary, NULL); + + if (!gst_pad_set_caps (mux->srcpad, newcaps)) { + gst_caps_unref (newcaps); + goto nego_error; + } + + gst_caps_unref (newcaps); + mux->negotiated = TRUE; + } + + /* see if we need to push a segment */ + if (mux->need_segment) { + GstEvent *event; + GstClockTime time; + + if (best->timestamp != -1) + time = best->timestamp; + else + time = 0; + + /* for the segment, we take the first timestamp we see, we don't know the + * length and the position is 0 */ + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, + time, -1, 0); + + gst_pad_push_event (mux->srcpad, event); + + mux->need_segment = FALSE; + } + + structure = gst_caps_get_structure (GST_BUFFER_CAPS (best->buffer), 0); + if (!structure) + goto no_caps; + + /* get the mime type for the structure */ + mime = gst_multipart_mux_get_mime (mux, structure); + + header = g_strdup_printf ("--%s\r\nContent-Type: %s\r\n" + "Content-Length: %u\r\n\r\n", + mux->boundary, mime, GST_BUFFER_SIZE (best->buffer)); + headerlen = strlen (header); + + ret = gst_pad_alloc_buffer_and_set_caps (mux->srcpad, GST_BUFFER_OFFSET_NONE, + headerlen, GST_PAD_CAPS (mux->srcpad), &headerbuf); + if (ret != GST_FLOW_OK) + goto alloc_failed; + + memcpy (GST_BUFFER_DATA (headerbuf), header, headerlen); + g_free (header); + + /* the header has the same timestamp as the data buffer (which we will push + * below) and has a duration of 0 */ + GST_BUFFER_TIMESTAMP (headerbuf) = best->timestamp; + GST_BUFFER_DURATION (headerbuf) = 0; + GST_BUFFER_OFFSET (headerbuf) = mux->offset; + mux->offset += headerlen; + GST_BUFFER_OFFSET_END (headerbuf) = mux->offset; + + GST_DEBUG_OBJECT (mux, "pushing %" G_GSIZE_FORMAT " bytes header buffer", + headerlen); + ret = gst_pad_push (mux->srcpad, headerbuf); + if (ret != GST_FLOW_OK) + /* push always takes ownership of the buffer, even after an error, so we + * don't need to unref headerbuf here. */ + goto beach; + + /* take best->buffer, we don't need to unref it later as we will push it + * now. */ + databuf = gst_buffer_make_metadata_writable (best->buffer); + best->buffer = NULL; + + gst_buffer_set_caps (databuf, GST_PAD_CAPS (mux->srcpad)); + /* we need to updated the timestamp to match the running_time */ + GST_BUFFER_TIMESTAMP (databuf) = best->timestamp; + GST_BUFFER_OFFSET (databuf) = mux->offset; + mux->offset += GST_BUFFER_SIZE (databuf); + GST_BUFFER_OFFSET_END (databuf) = mux->offset; + GST_BUFFER_FLAG_SET (databuf, GST_BUFFER_FLAG_DELTA_UNIT); + + GST_DEBUG_OBJECT (mux, "pushing %u bytes data buffer", + GST_BUFFER_SIZE (databuf)); + ret = gst_pad_push (mux->srcpad, databuf); + if (ret != GST_FLOW_OK) + /* push always takes ownership of the buffer, even after an error, so we + * don't need to unref headerbuf here. */ + goto beach; + + ret = gst_pad_alloc_buffer_and_set_caps (mux->srcpad, GST_BUFFER_OFFSET_NONE, + 2, GST_PAD_CAPS (mux->srcpad), &footerbuf); + if (ret != GST_FLOW_OK) + goto alloc_failed; + + memcpy (GST_BUFFER_DATA (footerbuf), "\r\n", 2); + + /* the footer has the same timestamp as the data buffer and has a + * duration of 0 */ + GST_BUFFER_TIMESTAMP (footerbuf) = best->timestamp; + GST_BUFFER_DURATION (footerbuf) = 0; + GST_BUFFER_OFFSET (footerbuf) = mux->offset; + mux->offset += 2; + GST_BUFFER_OFFSET_END (footerbuf) = mux->offset; + GST_BUFFER_FLAG_SET (footerbuf, GST_BUFFER_FLAG_DELTA_UNIT); + + GST_DEBUG_OBJECT (mux, "pushing 2 bytes footer buffer"); + ret = gst_pad_push (mux->srcpad, footerbuf); + +beach: + if (best && best->buffer) { + gst_buffer_unref (best->buffer); + best->buffer = NULL; + } + return ret; + + /* ERRORS */ +buffer_error: + { + /* There is a best but no buffer, this is not quite right.. */ + GST_ELEMENT_ERROR (mux, STREAM, FAILED, (NULL), ("internal muxing error")); + ret = GST_FLOW_ERROR; + goto beach; + } +eos: + { + GST_DEBUG_OBJECT (mux, "Pushing EOS"); + gst_pad_push_event (mux->srcpad, gst_event_new_eos ()); + ret = GST_FLOW_UNEXPECTED; + goto beach; + } +nego_error: + { + GST_WARNING_OBJECT (mux, "failed to set caps"); + GST_ELEMENT_ERROR (mux, CORE, NEGOTIATION, (NULL), (NULL)); + ret = GST_FLOW_NOT_NEGOTIATED; + goto beach; + } +no_caps: + { + GST_WARNING_OBJECT (mux, "no caps on the incoming buffer %p", best->buffer); + GST_ELEMENT_ERROR (mux, CORE, NEGOTIATION, (NULL), (NULL)); + ret = GST_FLOW_NOT_NEGOTIATED; + goto beach; + } +alloc_failed: + { + GST_WARNING_OBJECT (mux, + "failed allocating a %" G_GSIZE_FORMAT " bytes buffer", headerlen); + g_free (header); + goto beach; + } +} + +static void +gst_multipart_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstMultipartMux *mux; + + mux = GST_MULTIPART_MUX (object); + + switch (prop_id) { + case ARG_BOUNDARY: + g_value_set_string (value, mux->boundary); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_multipart_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstMultipartMux *mux; + + mux = GST_MULTIPART_MUX (object); + + switch (prop_id) { + case ARG_BOUNDARY: + g_free (mux->boundary); + mux->boundary = g_strdup (g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_multipart_mux_change_state (GstElement * element, GstStateChange transition) +{ + GstMultipartMux *multipart_mux; + GstStateChangeReturn ret; + + multipart_mux = GST_MULTIPART_MUX (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + multipart_mux->offset = 0; + multipart_mux->negotiated = FALSE; + multipart_mux->need_segment = TRUE; + GST_DEBUG_OBJECT (multipart_mux, "starting collect pads"); + gst_collect_pads_start (multipart_mux->collect); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_DEBUG_OBJECT (multipart_mux, "stopping collect pads"); + gst_collect_pads_stop (multipart_mux->collect); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + return ret; + + switch (transition) { + default: + break; + } + + return ret; +} + +gboolean +gst_multipart_mux_plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_multipart_mux_debug, "multipartmux", 0, + "multipart muxer"); + + return gst_element_register (plugin, "multipartmux", GST_RANK_NONE, + GST_TYPE_MULTIPART_MUX); +} diff --git a/gst/multipart/multipartmux.h b/gst/multipart/multipartmux.h new file mode 100644 index 0000000..a52db36 --- /dev/null +++ b/gst/multipart/multipartmux.h @@ -0,0 +1,94 @@ +/* GStreamer + * Copyright (C) 2004 Wim Taymans + * + * gstmultipartmux.h: multipart stream muxer + * + * 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_MULTIPART_MUX__ +#define __GST_MULTIPART_MUX__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_MULTIPART_MUX (gst_multipart_mux_get_type()) +#define GST_MULTIPART_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTIPART_MUX, GstMultipartMux)) +#define GST_MULTIPART_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIPART_MUX, GstMultipartMux)) +#define GST_MULTIPART_MUX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MULTIPART_MUX, GstMultipartMuxClass)) +#define GST_IS_MULTIPART_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTIPART_MUX)) +#define GST_IS_MULTIPART_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIPART_MUX)) + +typedef struct _GstMultipartMux GstMultipartMux; +typedef struct _GstMultipartMuxClass GstMultipartMuxClass; + +/* all information needed for one multipart stream */ +typedef struct +{ + GstCollectData collect; /* we extend the CollectData */ + + GstBuffer *buffer; /* the queued buffer for this pad */ + GstClockTime timestamp; /* its timestamp, converted to running_time so that we can + correctly sort over multiple segments. */ +} +GstMultipartPadData; + +/** + * GstMultipartMux: + * + * The opaque #GstMultipartMux structure. + */ +struct _GstMultipartMux +{ + GstElement element; + + /* pad */ + GstPad *srcpad; + + /* sinkpads */ + GstCollectPads *collect; + + gint numpads; + + /* offset in stream */ + guint64 offset; + + /* boundary string */ + gchar *boundary; + + gboolean negotiated; + gboolean need_segment; +}; + +struct _GstMultipartMuxClass +{ + GstElementClass parent_class; + + GHashTable *mimetypes; +}; + +GType gst_multipart_mux_get_type (void); + +gboolean gst_multipart_mux_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_MULTIPART_MUX__ */ + diff --git a/gst/replaygain/Makefile.am b/gst/replaygain/Makefile.am new file mode 100644 index 0000000..90e84fe --- /dev/null +++ b/gst/replaygain/Makefile.am @@ -0,0 +1,38 @@ +plugin_LTLIBRARIES = libgstreplaygain.la + +libgstreplaygain_la_SOURCES = \ + gstrganalysis.c \ + gstrglimiter.c \ + gstrgvolume.c \ + replaygain.c \ + rganalysis.c +libgstreplaygain_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstreplaygain_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-0.10 \ + $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) +libgstreplaygain_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstreplaygain_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = \ + gstrganalysis.h \ + gstrglimiter.h \ + gstrgvolume.h \ + replaygain.h \ + rganalysis.h + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstreplaygain -:SHARED libgstreplaygain \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstreplaygain_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstreplaygain_la_CFLAGS) \ + -:LDFLAGS $(libgstreplaygain_la_LDFLAGS) \ + $(libgstreplaygain_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/replaygain/Makefile.in b/gst/replaygain/Makefile.in new file mode 100644 index 0000000..81018de --- /dev/null +++ b/gst/replaygain/Makefile.in @@ -0,0 +1,875 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/replaygain +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstreplaygain_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstreplaygain_la_OBJECTS = libgstreplaygain_la-gstrganalysis.lo \ + libgstreplaygain_la-gstrglimiter.lo \ + libgstreplaygain_la-gstrgvolume.lo \ + libgstreplaygain_la-replaygain.lo \ + libgstreplaygain_la-rganalysis.lo +libgstreplaygain_la_OBJECTS = $(am_libgstreplaygain_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstreplaygain_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) \ + $(libgstreplaygain_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstreplaygain_la_SOURCES) +DIST_SOURCES = $(libgstreplaygain_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstreplaygain.la +libgstreplaygain_la_SOURCES = \ + gstrganalysis.c \ + gstrglimiter.c \ + gstrgvolume.c \ + replaygain.c \ + rganalysis.c + +libgstreplaygain_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) + +libgstreplaygain_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-0.10 \ + $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) + +libgstreplaygain_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstreplaygain_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = \ + gstrganalysis.h \ + gstrglimiter.h \ + gstrgvolume.h \ + replaygain.h \ + rganalysis.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/replaygain/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/replaygain/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstreplaygain.la: $(libgstreplaygain_la_OBJECTS) $(libgstreplaygain_la_DEPENDENCIES) $(EXTRA_libgstreplaygain_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstreplaygain_la_LINK) -rpath $(plugindir) $(libgstreplaygain_la_OBJECTS) $(libgstreplaygain_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-gstrganalysis.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-gstrglimiter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-gstrgvolume.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-replaygain.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-rganalysis.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstreplaygain_la-gstrganalysis.lo: gstrganalysis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-gstrganalysis.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-gstrganalysis.Tpo -c -o libgstreplaygain_la-gstrganalysis.lo `test -f 'gstrganalysis.c' || echo '$(srcdir)/'`gstrganalysis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-gstrganalysis.Tpo $(DEPDIR)/libgstreplaygain_la-gstrganalysis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrganalysis.c' object='libgstreplaygain_la-gstrganalysis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-gstrganalysis.lo `test -f 'gstrganalysis.c' || echo '$(srcdir)/'`gstrganalysis.c + +libgstreplaygain_la-gstrglimiter.lo: gstrglimiter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-gstrglimiter.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-gstrglimiter.Tpo -c -o libgstreplaygain_la-gstrglimiter.lo `test -f 'gstrglimiter.c' || echo '$(srcdir)/'`gstrglimiter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-gstrglimiter.Tpo $(DEPDIR)/libgstreplaygain_la-gstrglimiter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrglimiter.c' object='libgstreplaygain_la-gstrglimiter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-gstrglimiter.lo `test -f 'gstrglimiter.c' || echo '$(srcdir)/'`gstrglimiter.c + +libgstreplaygain_la-gstrgvolume.lo: gstrgvolume.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-gstrgvolume.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-gstrgvolume.Tpo -c -o libgstreplaygain_la-gstrgvolume.lo `test -f 'gstrgvolume.c' || echo '$(srcdir)/'`gstrgvolume.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-gstrgvolume.Tpo $(DEPDIR)/libgstreplaygain_la-gstrgvolume.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrgvolume.c' object='libgstreplaygain_la-gstrgvolume.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-gstrgvolume.lo `test -f 'gstrgvolume.c' || echo '$(srcdir)/'`gstrgvolume.c + +libgstreplaygain_la-replaygain.lo: replaygain.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-replaygain.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-replaygain.Tpo -c -o libgstreplaygain_la-replaygain.lo `test -f 'replaygain.c' || echo '$(srcdir)/'`replaygain.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-replaygain.Tpo $(DEPDIR)/libgstreplaygain_la-replaygain.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='replaygain.c' object='libgstreplaygain_la-replaygain.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-replaygain.lo `test -f 'replaygain.c' || echo '$(srcdir)/'`replaygain.c + +libgstreplaygain_la-rganalysis.lo: rganalysis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-rganalysis.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-rganalysis.Tpo -c -o libgstreplaygain_la-rganalysis.lo `test -f 'rganalysis.c' || echo '$(srcdir)/'`rganalysis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-rganalysis.Tpo $(DEPDIR)/libgstreplaygain_la-rganalysis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rganalysis.c' object='libgstreplaygain_la-rganalysis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-rganalysis.lo `test -f 'rganalysis.c' || echo '$(srcdir)/'`rganalysis.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstreplaygain -:SHARED libgstreplaygain \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstreplaygain_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstreplaygain_la_CFLAGS) \ + -:LDFLAGS $(libgstreplaygain_la_LDFLAGS) \ + $(libgstreplaygain_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/replaygain/gstrganalysis.c b/gst/replaygain/gstrganalysis.c new file mode 100644 index 0000000..4a3abdb --- /dev/null +++ b/gst/replaygain/gstrganalysis.c @@ -0,0 +1,721 @@ +/* GStreamer ReplayGain analysis + * + * Copyright (C) 2006 Rene Stadler + * + * gstrganalysis.c: Element that performs the ReplayGain analysis + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +/** + * SECTION:element-rganalysis + * @see_also: #GstRgVolume + * + * This element analyzes raw audio sample data in accordance with the proposed + * ReplayGain standard for + * calculating the ideal replay gain for music tracks and albums. The element + * is designed as a pass-through filter that never modifies any data. As it + * receives an EOS event, it finalizes the ongoing analysis and generates a tag + * list containing the results. It is sent downstream with a tag event and + * posted on the message bus with a tag message. The EOS event is forwarded as + * normal afterwards. Result tag lists at least contain the tags + * #GST_TAG_TRACK_GAIN, #GST_TAG_TRACK_PEAK and #GST_TAG_REFERENCE_LEVEL. + * + * Because the generated metadata tags become available at the end of streams, + * downstream muxer and encoder elements are normally unable to save them in + * their output since they generally save metadata in the file header. + * Therefore, it is often necessary that applications read the results in a bus + * event handler for the tag message. Obtaining the values this way is always + * needed for album processing + * since the album gain and peak values need to be associated with all tracks of + * an album, not just the last one. + * + * + * Example launch lines + * |[ + * gst-launch -t audiotestsrc wave=sine num-buffers=512 ! rganalysis ! fakesink + * ]| Analyze a simple test waveform + * |[ + * gst-launch -t filesrc location=filename.ext ! decodebin \ + * ! audioconvert ! audioresample ! rganalysis ! fakesink + * ]| Analyze a given file + * |[ + * gst-launch -t gnomevfssrc location=http://replaygain.hydrogenaudio.org/ref_pink.wav \ + * ! wavparse ! rganalysis ! fakesink + * ]| Analyze the pink noise reference file + * + * The above launch line yields a result gain of +6 dB (instead of the expected + * +0 dB). This is not in error, refer to the #GstRgAnalysis:reference-level + * property documentation for more information. + * + * + * + * Acknowledgements + * + * This element is based on code used in the vorbisgain program and many + * others. The relevant parts are copyrighted by David Robinson, Glen Sawyer + * and Frank Klemm. + * + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gstrganalysis.h" +#include "replaygain.h" + +GST_DEBUG_CATEGORY_STATIC (gst_rg_analysis_debug); +#define GST_CAT_DEFAULT gst_rg_analysis_debug + +/* Default property value. */ +#define FORCED_DEFAULT TRUE +#define DEFAULT_MESSAGE FALSE + +enum +{ + PROP_0, + PROP_NUM_TRACKS, + PROP_FORCED, + PROP_REFERENCE_LEVEL, + PROP_MESSAGE +}; + +/* The ReplayGain algorithm is intended for use with mono and stereo + * audio. The used implementation has filter coefficients for the + * "usual" sample rates in the 8000 to 48000 Hz range. */ +#define REPLAY_GAIN_CAPS \ + "channels = (int) { 1, 2 }, " \ + "rate = (int) { 8000, 11025, 12000, 16000, 22050, 24000, 32000, " \ + "44100, 48000 }" + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " + "width = (int) 32, " "endianness = (int) BYTE_ORDER, " + REPLAY_GAIN_CAPS "; " + "audio/x-raw-int, " + "width = (int) 16, " "depth = (int) [ 1, 16 ], " + "signed = (boolean) true, " "endianness = (int) BYTE_ORDER, " + REPLAY_GAIN_CAPS)); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " + "width = (int) 32, " "endianness = (int) BYTE_ORDER, " + REPLAY_GAIN_CAPS "; " + "audio/x-raw-int, " + "width = (int) 16, " "depth = (int) [ 1, 16 ], " + "signed = (boolean) true, " "endianness = (int) BYTE_ORDER, " + REPLAY_GAIN_CAPS)); + +GST_BOILERPLATE (GstRgAnalysis, gst_rg_analysis, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void gst_rg_analysis_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rg_analysis_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_rg_analysis_start (GstBaseTransform * base); +static gboolean gst_rg_analysis_set_caps (GstBaseTransform * base, + GstCaps * incaps, GstCaps * outcaps); +static GstFlowReturn gst_rg_analysis_transform_ip (GstBaseTransform * base, + GstBuffer * buf); +static gboolean gst_rg_analysis_event (GstBaseTransform * base, + GstEvent * event); +static gboolean gst_rg_analysis_stop (GstBaseTransform * base); + +static void gst_rg_analysis_handle_tags (GstRgAnalysis * filter, + const GstTagList * tag_list); +static void gst_rg_analysis_handle_eos (GstRgAnalysis * filter); +static gboolean gst_rg_analysis_track_result (GstRgAnalysis * filter, + GstTagList ** tag_list); +static gboolean gst_rg_analysis_album_result (GstRgAnalysis * filter, + GstTagList ** tag_list); + +static void +gst_rg_analysis_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_set_details_simple (element_class, "ReplayGain analysis", + "Filter/Analyzer/Audio", + "Perform the ReplayGain analysis", + "Ren\xc3\xa9 Stadler "); + + GST_DEBUG_CATEGORY_INIT (gst_rg_analysis_debug, "rganalysis", 0, + "ReplayGain analysis element"); +} + +static void +gst_rg_analysis_class_init (GstRgAnalysisClass * klass) +{ + GObjectClass *gobject_class; + GstBaseTransformClass *trans_class; + + gobject_class = (GObjectClass *) klass; + gobject_class->set_property = gst_rg_analysis_set_property; + gobject_class->get_property = gst_rg_analysis_get_property; + + /** + * GstRgAnalysis:num-tracks: + * + * Number of remaining album tracks. + * + * Analyzing several streams sequentially and assigning them a common result + * gain is known as "album processing". If this gain is used during playback + * (by switching to "album mode"), all tracks of an album receive the same + * amplification. This keeps the relative volume levels between the tracks + * intact. To enable this, set this property to the number of streams that + * will be processed as album tracks. + * + * Every time an EOS event is received, the value of this property is + * decremented by one. As it reaches zero, it is assumed that the last track + * of the album finished. The tag list for the final stream will contain the + * additional tags #GST_TAG_ALBUM_GAIN and #GST_TAG_ALBUM_PEAK. All other + * streams just get the two track tags posted because the values for the album + * tags are not known before all tracks are analyzed. Applications need to + * ensure that the album gain and peak values are also associated with the + * other tracks when storing the results. + * + * If the total number of album tracks is unknown beforehand, just ensure that + * the value is greater than 1 before each track starts. Then before the end + * of the last track, set it to the value 1. + * + * To perform album processing, the element has to preserve data between + * streams. This cannot survive a state change to the NULL or READY state. + * If you change your pipeline's state to NULL or READY between tracks, lock + * the element's state using gst_element_set_locked_state() when it is in + * PAUSED or PLAYING. + */ + g_object_class_install_property (gobject_class, PROP_NUM_TRACKS, + g_param_spec_int ("num-tracks", "Number of album tracks", + "Number of remaining album tracks", 0, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRgAnalysis:forced: + * + * Whether to analyze streams even when ReplayGain tags exist. + * + * For assisting transcoder/converter applications, the element can silently + * skip the processing of streams that already contain the necessary tags. + * Data will flow as usual but the element will not consume CPU time and will + * not generate result tags. To enable possible skipping, set this property + * to #FALSE. + * + * If used in conjunction with album + * processing, the element will skip the number of remaining album + * tracks if a full set of tags is found for the first track. If a subsequent + * track of the album is missing tags, processing cannot start again. If this + * is undesired, the application has to scan all files beforehand and enable + * forcing of processing if needed. + */ + g_object_class_install_property (gobject_class, PROP_FORCED, + g_param_spec_boolean ("forced", "Forced", + "Analyze even if ReplayGain tags exist", + FORCED_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRgAnalysis:reference-level: + * + * Reference level [dB]. + * + * Analyzing the ReplayGain pink noise reference waveform computes a result of + * +6 dB instead of the expected 0 dB. This is because the default reference + * level is 89 dB. To obtain values as lined out in the original proposal of + * ReplayGain, set this property to 83. + * + * Almost all software uses 89 dB as a reference however, and this value has + * become the new official value. That is to say, while the change has been + * acclaimed by the author of the ReplayGain proposal, the webpage is still outdated at the time + * of this writing. + * + * The value was changed because the original proposal recommends a default + * pre-amp value of +6 dB for playback. This seemed a bit odd, as it means + * that the algorithm has the general tendency to produce adjustment values + * that are 6 dB too low. Bumping the reference level by 6 dB compensated for + * this. + * + * The problem of the reference level being ambiguous for lack of concise + * standardization is to be solved by adopting the #GST_TAG_REFERENCE_LEVEL + * tag, which allows to store the used value alongside the gain values. + */ + g_object_class_install_property (gobject_class, PROP_REFERENCE_LEVEL, + g_param_spec_double ("reference-level", "Reference level", + "Reference level [dB]", 0.0, 150., RG_REFERENCE_LEVEL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MESSAGE, + g_param_spec_boolean ("message", "Message", + "Post statics messages", + DEFAULT_MESSAGE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + trans_class = (GstBaseTransformClass *) klass; + trans_class->start = GST_DEBUG_FUNCPTR (gst_rg_analysis_start); + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_rg_analysis_set_caps); + trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_rg_analysis_transform_ip); + trans_class->event = GST_DEBUG_FUNCPTR (gst_rg_analysis_event); + trans_class->stop = GST_DEBUG_FUNCPTR (gst_rg_analysis_stop); + trans_class->passthrough_on_same_caps = TRUE; +} + +static void +gst_rg_analysis_init (GstRgAnalysis * filter, GstRgAnalysisClass * gclass) +{ + GstBaseTransform *base = GST_BASE_TRANSFORM (filter); + + gst_base_transform_set_gap_aware (base, TRUE); + + filter->num_tracks = 0; + filter->forced = FORCED_DEFAULT; + filter->message = DEFAULT_MESSAGE; + filter->reference_level = RG_REFERENCE_LEVEL; + + filter->ctx = NULL; + filter->analyze = NULL; +} + +static void +gst_rg_analysis_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRgAnalysis *filter = GST_RG_ANALYSIS (object); + + GST_OBJECT_LOCK (filter); + switch (prop_id) { + case PROP_NUM_TRACKS: + filter->num_tracks = g_value_get_int (value); + break; + case PROP_FORCED: + filter->forced = g_value_get_boolean (value); + break; + case PROP_REFERENCE_LEVEL: + filter->reference_level = g_value_get_double (value); + break; + case PROP_MESSAGE: + filter->message = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (filter); +} + +static void +gst_rg_analysis_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRgAnalysis *filter = GST_RG_ANALYSIS (object); + + GST_OBJECT_LOCK (filter); + switch (prop_id) { + case PROP_NUM_TRACKS: + g_value_set_int (value, filter->num_tracks); + break; + case PROP_FORCED: + g_value_set_boolean (value, filter->forced); + break; + case PROP_REFERENCE_LEVEL: + g_value_set_double (value, filter->reference_level); + break; + case PROP_MESSAGE: + g_value_set_boolean (value, filter->message); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (filter); +} + +static void +gst_rg_analysis_post_message (gpointer rganalysis, GstClockTime timestamp, + GstClockTime duration, gdouble rglevel) +{ + GstRgAnalysis *filter = GST_RG_ANALYSIS (rganalysis); + if (filter->message) { + GstMessage *m; + + m = gst_message_new_element (GST_OBJECT_CAST (rganalysis), + gst_structure_new ("rganalysis", + "timestamp", G_TYPE_UINT64, timestamp, + "duration", G_TYPE_UINT64, duration, + "rglevel", G_TYPE_DOUBLE, rglevel, NULL)); + + gst_element_post_message (GST_ELEMENT_CAST (rganalysis), m); + } +} + + +static gboolean +gst_rg_analysis_start (GstBaseTransform * base) +{ + GstRgAnalysis *filter = GST_RG_ANALYSIS (base); + + filter->ignore_tags = FALSE; + filter->skip = FALSE; + filter->has_track_gain = FALSE; + filter->has_track_peak = FALSE; + filter->has_album_gain = FALSE; + filter->has_album_peak = FALSE; + + filter->ctx = rg_analysis_new (); + GST_OBJECT_LOCK (filter); + rg_analysis_init_silence_detection (filter->ctx, gst_rg_analysis_post_message, + filter); + GST_OBJECT_UNLOCK (filter); + filter->analyze = NULL; + + GST_LOG_OBJECT (filter, "started"); + + return TRUE; +} + +static gboolean +gst_rg_analysis_set_caps (GstBaseTransform * base, GstCaps * in_caps, + GstCaps * out_caps) +{ + GstRgAnalysis *filter = GST_RG_ANALYSIS (base); + GstStructure *structure; + const gchar *name; + gint n_channels, sample_rate, sample_bit_size, sample_size; + + g_return_val_if_fail (filter->ctx != NULL, FALSE); + + GST_DEBUG_OBJECT (filter, + "set_caps in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, + in_caps, out_caps); + + structure = gst_caps_get_structure (in_caps, 0); + name = gst_structure_get_name (structure); + + if (!gst_structure_get_int (structure, "width", &sample_bit_size) + || !gst_structure_get_int (structure, "channels", &n_channels) + || !gst_structure_get_int (structure, "rate", &sample_rate)) + goto invalid_format; + + if (!rg_analysis_set_sample_rate (filter->ctx, sample_rate)) + goto invalid_format; + + if (sample_bit_size % 8 != 0) + goto invalid_format; + sample_size = sample_bit_size / 8; + + if (g_str_equal (name, "audio/x-raw-float")) { + + if (sample_size != sizeof (gfloat)) + goto invalid_format; + + /* The depth is not variable for float formats of course. It just + * makes the transform function nice and simple if the + * rg_analysis_analyze_* functions have a common signature. */ + filter->depth = sizeof (gfloat) * 8; + + if (n_channels == 1) + filter->analyze = rg_analysis_analyze_mono_float; + else if (n_channels == 2) + filter->analyze = rg_analysis_analyze_stereo_float; + else + goto invalid_format; + + } else if (g_str_equal (name, "audio/x-raw-int")) { + + if (sample_size != sizeof (gint16)) + goto invalid_format; + + if (!gst_structure_get_int (structure, "depth", &filter->depth)) + goto invalid_format; + if (filter->depth < 1 || filter->depth > 16) + goto invalid_format; + + if (n_channels == 1) + filter->analyze = rg_analysis_analyze_mono_int16; + else if (n_channels == 2) + filter->analyze = rg_analysis_analyze_stereo_int16; + else + goto invalid_format; + + } else { + + goto invalid_format; + } + + return TRUE; + + /* Errors. */ +invalid_format: + { + filter->analyze = NULL; + GST_ELEMENT_ERROR (filter, CORE, NEGOTIATION, + ("Invalid incoming caps: %" GST_PTR_FORMAT, in_caps), (NULL)); + return FALSE; + } +} + +static GstFlowReturn +gst_rg_analysis_transform_ip (GstBaseTransform * base, GstBuffer * buf) +{ + GstRgAnalysis *filter = GST_RG_ANALYSIS (base); + + g_return_val_if_fail (filter->ctx != NULL, GST_FLOW_WRONG_STATE); + g_return_val_if_fail (filter->analyze != NULL, GST_FLOW_NOT_NEGOTIATED); + + if (filter->skip) + return GST_FLOW_OK; + + GST_LOG_OBJECT (filter, "processing buffer of size %u", + GST_BUFFER_SIZE (buf)); + + rg_analysis_start_buffer (filter->ctx, GST_BUFFER_TIMESTAMP (buf)); + filter->analyze (filter->ctx, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), + filter->depth); + + return GST_FLOW_OK; +} + +static gboolean +gst_rg_analysis_event (GstBaseTransform * base, GstEvent * event) +{ + GstRgAnalysis *filter = GST_RG_ANALYSIS (base); + + g_return_val_if_fail (filter->ctx != NULL, TRUE); + + switch (GST_EVENT_TYPE (event)) { + + case GST_EVENT_EOS: + { + GST_LOG_OBJECT (filter, "received EOS event"); + + gst_rg_analysis_handle_eos (filter); + + GST_LOG_OBJECT (filter, "passing on EOS event"); + + break; + } + case GST_EVENT_TAG: + { + GstTagList *tag_list; + + /* The reference to the tag list is borrowed. */ + gst_event_parse_tag (event, &tag_list); + gst_rg_analysis_handle_tags (filter, tag_list); + + break; + } + default: + break; + } + + return GST_BASE_TRANSFORM_CLASS (parent_class)->event (base, event); +} + +static gboolean +gst_rg_analysis_stop (GstBaseTransform * base) +{ + GstRgAnalysis *filter = GST_RG_ANALYSIS (base); + + g_return_val_if_fail (filter->ctx != NULL, FALSE); + + rg_analysis_destroy (filter->ctx); + filter->ctx = NULL; + + GST_LOG_OBJECT (filter, "stopped"); + + return TRUE; +} + +static void +gst_rg_analysis_handle_tags (GstRgAnalysis * filter, + const GstTagList * tag_list) +{ + gboolean album_processing = (filter->num_tracks > 0); + gdouble dummy; + + if (!album_processing) + filter->ignore_tags = FALSE; + + if (filter->skip && album_processing) { + GST_DEBUG_OBJECT (filter, "ignoring tag event: skipping album"); + return; + } else if (filter->skip) { + GST_DEBUG_OBJECT (filter, "ignoring tag event: skipping track"); + return; + } else if (filter->ignore_tags) { + GST_DEBUG_OBJECT (filter, "ignoring tag event: cannot skip anyways"); + return; + } + + filter->has_track_gain |= gst_tag_list_get_double (tag_list, + GST_TAG_TRACK_GAIN, &dummy); + filter->has_track_peak |= gst_tag_list_get_double (tag_list, + GST_TAG_TRACK_PEAK, &dummy); + filter->has_album_gain |= gst_tag_list_get_double (tag_list, + GST_TAG_ALBUM_GAIN, &dummy); + filter->has_album_peak |= gst_tag_list_get_double (tag_list, + GST_TAG_ALBUM_PEAK, &dummy); + + if (!(filter->has_track_gain && filter->has_track_peak)) { + GST_DEBUG_OBJECT (filter, "track tags not complete yet"); + return; + } + + if (album_processing && !(filter->has_album_gain && filter->has_album_peak)) { + GST_DEBUG_OBJECT (filter, "album tags not complete yet"); + return; + } + + if (filter->forced) { + GST_DEBUG_OBJECT (filter, + "existing tags are sufficient, but processing anyway (forced)"); + return; + } + + filter->skip = TRUE; + rg_analysis_reset (filter->ctx); + + if (!album_processing) { + GST_DEBUG_OBJECT (filter, + "existing tags are sufficient, will not process this track"); + } else { + GST_DEBUG_OBJECT (filter, + "existing tags are sufficient, will not process this album"); + } +} + +static void +gst_rg_analysis_handle_eos (GstRgAnalysis * filter) +{ + gboolean album_processing = (filter->num_tracks > 0); + gboolean album_finished = (filter->num_tracks == 1); + gboolean album_skipping = album_processing && filter->skip; + + filter->has_track_gain = FALSE; + filter->has_track_peak = FALSE; + + if (album_finished) { + filter->ignore_tags = FALSE; + filter->skip = FALSE; + filter->has_album_gain = FALSE; + filter->has_album_peak = FALSE; + } else if (!album_skipping) { + filter->skip = FALSE; + } + + /* We might have just fully processed a track because it has + * incomplete tags. If we do album processing and allow skipping + * (not forced), prevent switching to skipping if a later track with + * full tags comes along: */ + if (!filter->forced && album_processing && !album_finished) + filter->ignore_tags = TRUE; + + if (!filter->skip) { + GstTagList *tag_list = NULL; + gboolean track_success; + gboolean album_success = FALSE; + + track_success = gst_rg_analysis_track_result (filter, &tag_list); + + if (album_finished) + album_success = gst_rg_analysis_album_result (filter, &tag_list); + else if (!album_processing) + rg_analysis_reset_album (filter->ctx); + + if (track_success || album_success) { + GST_LOG_OBJECT (filter, "posting tag list with results"); + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_REFERENCE_LEVEL, filter->reference_level, NULL); + /* This steals our reference to the list: */ + gst_element_found_tags_for_pad (GST_ELEMENT (filter), + GST_BASE_TRANSFORM_SRC_PAD (GST_BASE_TRANSFORM (filter)), tag_list); + } + } + + if (album_processing) { + filter->num_tracks--; + + if (!album_finished) { + GST_DEBUG_OBJECT (filter, "album not finished yet (num-tracks is now %u)", + filter->num_tracks); + } else { + GST_DEBUG_OBJECT (filter, "album finished (num-tracks is now 0)"); + } + } + + if (album_processing) + g_object_notify (G_OBJECT (filter), "num-tracks"); +} + +static gboolean +gst_rg_analysis_track_result (GstRgAnalysis * filter, GstTagList ** tag_list) +{ + gboolean track_success; + gdouble track_gain, track_peak; + + track_success = rg_analysis_track_result (filter->ctx, &track_gain, + &track_peak); + + if (track_success) { + track_gain += filter->reference_level - RG_REFERENCE_LEVEL; + GST_INFO_OBJECT (filter, "track gain is %+.2f dB, peak %.6f", track_gain, + track_peak); + } else { + GST_INFO_OBJECT (filter, "track was too short to analyze"); + } + + if (track_success) { + if (*tag_list == NULL) + *tag_list = gst_tag_list_new (); + gst_tag_list_add (*tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_TRACK_PEAK, track_peak, GST_TAG_TRACK_GAIN, track_gain, NULL); + } + + return track_success; +} + +static gboolean +gst_rg_analysis_album_result (GstRgAnalysis * filter, GstTagList ** tag_list) +{ + gboolean album_success; + gdouble album_gain, album_peak; + + album_success = rg_analysis_album_result (filter->ctx, &album_gain, + &album_peak); + + if (album_success) { + album_gain += filter->reference_level - RG_REFERENCE_LEVEL; + GST_INFO_OBJECT (filter, "album gain is %+.2f dB, peak %.6f", album_gain, + album_peak); + } else { + GST_INFO_OBJECT (filter, "album was too short to analyze"); + } + + if (album_success) { + if (*tag_list == NULL) + *tag_list = gst_tag_list_new (); + gst_tag_list_add (*tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_ALBUM_PEAK, album_peak, GST_TAG_ALBUM_GAIN, album_gain, NULL); + } + + return album_success; +} diff --git a/gst/replaygain/gstrganalysis.h b/gst/replaygain/gstrganalysis.h new file mode 100644 index 0000000..0d68e63 --- /dev/null +++ b/gst/replaygain/gstrganalysis.h @@ -0,0 +1,86 @@ +/* GStreamer ReplayGain analysis + * + * Copyright (C) 2006 Rene Stadler + * + * gstrganalysis.h: Element that performs the ReplayGain analysis + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef __GST_RG_ANALYSIS_H__ +#define __GST_RG_ANALYSIS_H__ + +#include +#include + +#include "rganalysis.h" + +G_BEGIN_DECLS + +#define GST_TYPE_RG_ANALYSIS \ + (gst_rg_analysis_get_type()) +#define GST_RG_ANALYSIS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RG_ANALYSIS,GstRgAnalysis)) +#define GST_RG_ANALYSIS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RG_ANALYSIS,GstRgAnalysisClass)) +#define GST_IS_RG_ANALYSIS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RG_ANALYSIS)) +#define GST_IS_RG_ANALYSIS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RG_ANALYSIS)) +typedef struct _GstRgAnalysis GstRgAnalysis; +typedef struct _GstRgAnalysisClass GstRgAnalysisClass; + +/** + * GstRgAnalysis: + * + * Opaque data structure. + */ +struct _GstRgAnalysis +{ + GstBaseTransform element; + + /*< private >*/ + + RgAnalysisCtx *ctx; + void (*analyze) (RgAnalysisCtx * ctx, gconstpointer data, gsize size, + guint depth); + gint depth; + + /* Property values. */ + guint num_tracks; + gdouble reference_level; + gboolean forced; + gboolean message; + + /* State machinery for skipping. */ + gboolean ignore_tags; + gboolean skip; + gboolean has_track_gain; + gboolean has_track_peak; + gboolean has_album_gain; + gboolean has_album_peak; +}; + +struct _GstRgAnalysisClass +{ + GstBaseTransformClass parent_class; +}; + +GType gst_rg_analysis_get_type (void); + +G_END_DECLS + +#endif /* __GST_RG_ANALYSIS_H__ */ diff --git a/gst/replaygain/gstrglimiter.c b/gst/replaygain/gstrglimiter.c new file mode 100644 index 0000000..2fb387b --- /dev/null +++ b/gst/replaygain/gstrglimiter.c @@ -0,0 +1,192 @@ +/* GStreamer ReplayGain limiter + * + * Copyright (C) 2007 Rene Stadler + * + * gstrglimiter.c: Element to apply signal compression to raw audio data + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +/** + * SECTION:element-rglimiter + * @see_also: #GstRgVolume + * + * This element applies signal compression/limiting to raw audio data. It + * performs strict hard limiting with soft-knee characteristics, using a + * threshold of -6 dB. This type of filter is mentioned in the proposed ReplayGain standard. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=filename.ext ! decodebin ! audioconvert \ + * ! rgvolume pre-amp=6.0 headroom=10.0 ! rglimiter \ + * ! audioconvert ! audioresample ! alsasink + * ]|Playback of a file + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gstrglimiter.h" + +GST_DEBUG_CATEGORY_STATIC (gst_rg_limiter_debug); +#define GST_CAT_DEFAULT gst_rg_limiter_debug + +enum +{ + PROP_0, + PROP_ENABLED, +}; + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " + "width = (int) 32, channels = (int) [1, MAX], " + "rate = (int) [1, MAX], endianness = (int) BYTE_ORDER")); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " + "width = (int) 32, channels = (int) [1, MAX], " + "rate = (int) [1, MAX], endianness = (int) BYTE_ORDER")); + +GST_BOILERPLATE (GstRgLimiter, gst_rg_limiter, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void gst_rg_limiter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rg_limiter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstFlowReturn gst_rg_limiter_transform_ip (GstBaseTransform * base, + GstBuffer * buf); + +static void +gst_rg_limiter_base_init (gpointer g_class) +{ + GstElementClass *element_class = g_class; + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_set_details_simple (element_class, "ReplayGain limiter", + "Filter/Effect/Audio", + "Apply signal compression to raw audio data", + "Ren\xc3\xa9 Stadler "); + + GST_DEBUG_CATEGORY_INIT (gst_rg_limiter_debug, "rglimiter", 0, + "ReplayGain limiter element"); +} + +static void +gst_rg_limiter_class_init (GstRgLimiterClass * klass) +{ + GObjectClass *gobject_class; + GstBaseTransformClass *trans_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_rg_limiter_set_property; + gobject_class->get_property = gst_rg_limiter_get_property; + + g_object_class_install_property (gobject_class, PROP_ENABLED, + g_param_spec_boolean ("enabled", "Enabled", "Enable processing", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class = GST_BASE_TRANSFORM_CLASS (klass); + trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_rg_limiter_transform_ip); + trans_class->passthrough_on_same_caps = FALSE; +} + +static void +gst_rg_limiter_init (GstRgLimiter * filter, GstRgLimiterClass * gclass) +{ + GstBaseTransform *base = GST_BASE_TRANSFORM (filter); + + gst_base_transform_set_passthrough (base, FALSE); + gst_base_transform_set_gap_aware (base, TRUE); + + filter->enabled = TRUE; +} + +static void +gst_rg_limiter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRgLimiter *filter = GST_RG_LIMITER (object); + + switch (prop_id) { + case PROP_ENABLED: + filter->enabled = g_value_get_boolean (value); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), + !filter->enabled); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rg_limiter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRgLimiter *filter = GST_RG_LIMITER (object); + + switch (prop_id) { + case PROP_ENABLED: + g_value_set_boolean (value, filter->enabled); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +#define LIMIT 1.0 +#define THRES 0.5 /* ca. -6 dB */ +#define COMPL 0.5 /* LIMIT - THRESH */ + +static GstFlowReturn +gst_rg_limiter_transform_ip (GstBaseTransform * base, GstBuffer * buf) +{ + GstRgLimiter *filter = GST_RG_LIMITER (base); + gfloat *input; + guint count; + guint i; + + if (!filter->enabled) + return GST_FLOW_OK; + + if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP)) + return GST_FLOW_OK; + + input = (gfloat *) GST_BUFFER_DATA (buf); + count = GST_BUFFER_SIZE (buf) / sizeof (gfloat); + + for (i = count; i--;) { + if (*input > THRES) + *input = tanhf ((*input - THRES) / COMPL) * COMPL + THRES; + else if (*input < -THRES) + *input = tanhf ((*input + THRES) / COMPL) * COMPL - THRES; + input++; + } + + return GST_FLOW_OK; +} diff --git a/gst/replaygain/gstrglimiter.h b/gst/replaygain/gstrglimiter.h new file mode 100644 index 0000000..63bd804 --- /dev/null +++ b/gst/replaygain/gstrglimiter.h @@ -0,0 +1,64 @@ +/* GStreamer ReplayGain limiter + * + * Copyright (C) 2007 Rene Stadler + * + * gstrglimiter.h: Element to apply signal compression to raw audio data + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef __GST_RG_LIMITER_H__ +#define __GST_RG_LIMITER_H__ + +#include +#include + +#define GST_TYPE_RG_LIMITER \ + (gst_rg_limiter_get_type()) +#define GST_RG_LIMITER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RG_LIMITER,GstRgLimiter)) +#define GST_RG_LIMITER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RG_LIMITER,GstRgLimiterClass)) +#define GST_IS_RG_LIMITER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RG_LIMITER)) +#define GST_IS_RG_LIMITER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RG_LIMITER)) + +typedef struct _GstRgLimiter GstRgLimiter; +typedef struct _GstRgLimiterClass GstRgLimiterClass; + +/** + * GstRgLimiter: + * + * Opaque data structure. + */ +struct _GstRgLimiter +{ + GstBaseTransform element; + + /*< private >*/ + + gboolean enabled; +}; + +struct _GstRgLimiterClass +{ + GstBaseTransformClass parent_class; +}; + +GType gst_rg_limiter_get_type (void); + +#endif /* __GST_RG_LIMITER_H__ */ diff --git a/gst/replaygain/gstrgvolume.c b/gst/replaygain/gstrgvolume.c new file mode 100644 index 0000000..d3d105a --- /dev/null +++ b/gst/replaygain/gstrgvolume.c @@ -0,0 +1,708 @@ +/* GStreamer ReplayGain volume adjustment + * + * Copyright (C) 2007 Rene Stadler + * + * gstrgvolume.c: Element to apply ReplayGain volume adjustment + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +/** + * SECTION:element-rgvolume + * @see_also: #GstRgLimiter, #GstRgAnalysis + * + * This element applies volume changes to streams as lined out in the proposed + * ReplayGain standard. It + * interprets the ReplayGain meta data tags and carries out the adjustment (by + * using a volume element internally). The relevant tags are: + * + * #GST_TAG_TRACK_GAIN + * #GST_TAG_TRACK_PEAK + * #GST_TAG_ALBUM_GAIN + * #GST_TAG_ALBUM_PEAK + * #GST_TAG_REFERENCE_LEVEL + * + * The information carried by these tags must have been calculated beforehand by + * performing the ReplayGain analysis. This is implemented by the rganalysis element. + * + * The signal compression/limiting recommendations outlined in the proposed + * standard are not implemented by this element. This has to be handled by + * separate elements because applications might want to have additional filters + * between the volume adjustment and the limiting stage. A basic limiter is + * included with this plugin: The rglimiter + * element applies -6 dB hard limiting as mentioned in the ReplayGain standard. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=filename.ext ! decodebin ! audioconvert \ + * ! rgvolume ! audioconvert ! audioresample ! alsasink + * ]| Playback of a file + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gstrgvolume.h" +#include "replaygain.h" + +GST_DEBUG_CATEGORY_STATIC (gst_rg_volume_debug); +#define GST_CAT_DEFAULT gst_rg_volume_debug + +enum +{ + PROP_0, + PROP_ALBUM_MODE, + PROP_HEADROOM, + PROP_PRE_AMP, + PROP_FALLBACK_GAIN, + PROP_TARGET_GAIN, + PROP_RESULT_GAIN +}; + +#define DEFAULT_ALBUM_MODE TRUE +#define DEFAULT_HEADROOM 0.0 +#define DEFAULT_PRE_AMP 0.0 +#define DEFAULT_FALLBACK_GAIN 0.0 + +#define DB_TO_LINEAR(x) pow (10., (x) / 20.) +#define LINEAR_TO_DB(x) (20. * log10 (x)) + +#define GAIN_FORMAT "+.02f dB" +#define PEAK_FORMAT ".06f" + +#define VALID_GAIN(x) ((x) > -60.00 && (x) < 60.00) +#define VALID_PEAK(x) ((x) > 0.) + +/* Same template caps as GstVolume, for I don't like having just ANY caps. */ + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 32; " + "audio/x-raw-int, " + "channels = (int) [ 1, MAX ], " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE")); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " + "rate = (int) [ 1, MAX ], " + "channels = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 32; " + "audio/x-raw-int, " + "channels = (int) [ 1, MAX ], " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE")); + +GST_BOILERPLATE (GstRgVolume, gst_rg_volume, GstBin, GST_TYPE_BIN); + +static void gst_rg_volume_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rg_volume_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_rg_volume_dispose (GObject * object); + +static GstStateChangeReturn gst_rg_volume_change_state (GstElement * element, + GstStateChange transition); +static gboolean gst_rg_volume_sink_event (GstPad * pad, GstEvent * event); + +static GstEvent *gst_rg_volume_tag_event (GstRgVolume * self, GstEvent * event); +static void gst_rg_volume_reset (GstRgVolume * self); +static void gst_rg_volume_update_gain (GstRgVolume * self); +static inline void gst_rg_volume_determine_gain (GstRgVolume * self, + gdouble * target_gain, gdouble * result_gain); + +static void +gst_rg_volume_base_init (gpointer g_class) +{ + GstElementClass *element_class = g_class; + + gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_set_details_simple (element_class, "ReplayGain volume", + "Filter/Effect/Audio", + "Apply ReplayGain volume adjustment", + "Ren\xc3\xa9 Stadler "); + + GST_DEBUG_CATEGORY_INIT (gst_rg_volume_debug, "rgvolume", 0, + "ReplayGain volume element"); +} + +static void +gst_rg_volume_class_init (GstRgVolumeClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *element_class; + GstBinClass *bin_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_rg_volume_set_property; + gobject_class->get_property = gst_rg_volume_get_property; + gobject_class->dispose = gst_rg_volume_dispose; + + /** + * GstRgVolume:album-mode: + * + * Whether to prefer album gain over track gain. + * + * If set to %TRUE, use album gain instead of track gain if both are + * available. This keeps the relative loudness levels of tracks from the same + * album intact. + * + * If set to %FALSE, track mode is used instead. This effectively leads to + * more extensive normalization. + * + * If album mode is enabled but the album gain tag is absent in the stream, + * the track gain is used instead. If both gain tags are missing, the value + * of the fallback-gain + * property is used instead. + */ + g_object_class_install_property (gobject_class, PROP_ALBUM_MODE, + g_param_spec_boolean ("album-mode", "Album mode", + "Prefer album over track gain", DEFAULT_ALBUM_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRgVolume:headroom: + * + * Extra headroom [dB]. This controls the amount by which the output can + * exceed digital full scale. + * + * Only set this to a value greater than 0.0 if signal compression/limiting of + * a suitable form is applied to the output (or output is brought into the + * correct range by some other transformation). + * + * This element internally uses a volume element, which also supports + * operating on integer audio formats. These formats do not allow exceeding + * digital full scale. If extra headroom is used, make sure that the raw + * audio data format is floating point (audio/x-raw-float). Otherwise, + * clipping distortion might be introduced as part of the volume adjustment + * itself. + */ + g_object_class_install_property (gobject_class, PROP_HEADROOM, + g_param_spec_double ("headroom", "Headroom", "Extra headroom [dB]", + 0., 60., DEFAULT_HEADROOM, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRgVolume:pre-amp: + * + * Additional gain to apply globally [dB]. This controls the trade-off + * between uniformity of normalization and utilization of available dynamic + * range. + * + * Note that the default value is 0 dB because the ReplayGain reference value + * was adjusted by +6 dB (from 83 to 89 dB). At the time of this writing, the + * webpage is still outdated and + * does not reflect this change however. Where the original proposal states + * that a proper default pre-amp value is +6 dB, this translates to the used 0 + * dB. + */ + g_object_class_install_property (gobject_class, PROP_PRE_AMP, + g_param_spec_double ("pre-amp", "Pre-amp", "Extra gain [dB]", + -60., 60., DEFAULT_PRE_AMP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRgVolume:fallback-gain: + * + * Fallback gain [dB] for streams missing ReplayGain tags. + */ + g_object_class_install_property (gobject_class, PROP_FALLBACK_GAIN, + g_param_spec_double ("fallback-gain", "Fallback gain", + "Gain for streams missing tags [dB]", + -60., 60., DEFAULT_FALLBACK_GAIN, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRgVolume:result-gain: + * + * Applied gain [dB]. This gain is applied to processed buffer data. + * + * This is set to the target + * gain if amplification by that amount can be applied safely. + * "Safely" means that the volume adjustment does not inflict clipping + * distortion. Should this not be the case, the result gain is set to an + * appropriately reduced value (by applying peak normalization). The proposed + * standard calls this "clipping prevention". + * + * The difference between target and result gain reflects the necessary amount + * of reduction. Applications can make use of this information to temporarily + * reduce the pre-amp for + * subsequent streams, as recommended by the ReplayGain standard. + * + * Note that target and result gain differing for a great majority of streams + * indicates a problem: What happens in this case is that most streams receive + * peak normalization instead of amplification by the ideal replay gain. To + * prevent this, the pre-amp has + * to be lowered and/or a limiter has to be used which facilitates the use of + * headroom. + */ + g_object_class_install_property (gobject_class, PROP_RESULT_GAIN, + g_param_spec_double ("result-gain", "Result-gain", "Applied gain [dB]", + -120., 120., 0., G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + /** + * GstRgVolume:target-gain: + * + * Applicable gain [dB]. This gain is supposed to be applied. + * + * Depending on the value of the album-mode property and the + * presence of ReplayGain tags in the stream, this is set according to one of + * these simple formulas: + * + * + * pre-amp + album gain + * of the stream + * pre-amp + track gain + * of the stream + * pre-amp + fallback gain + * + */ + g_object_class_install_property (gobject_class, PROP_TARGET_GAIN, + g_param_spec_double ("target-gain", "Target-gain", + "Applicable gain [dB]", -120., 120., 0., + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + element_class = (GstElementClass *) klass; + element_class->change_state = GST_DEBUG_FUNCPTR (gst_rg_volume_change_state); + + bin_class = (GstBinClass *) klass; + /* Setting these to NULL makes gst_bin_add and _remove refuse to let anyone + * mess with our internals. */ + bin_class->add_element = NULL; + bin_class->remove_element = NULL; +} + +static void +gst_rg_volume_init (GstRgVolume * self, GstRgVolumeClass * gclass) +{ + GObjectClass *volume_class; + GstPad *volume_pad, *ghost_pad; + + self->album_mode = DEFAULT_ALBUM_MODE; + self->headroom = DEFAULT_HEADROOM; + self->pre_amp = DEFAULT_PRE_AMP; + self->fallback_gain = DEFAULT_FALLBACK_GAIN; + self->target_gain = 0.0; + self->result_gain = 0.0; + + self->volume_element = gst_element_factory_make ("volume", "rgvolume-volume"); + if (G_UNLIKELY (self->volume_element == NULL)) { + GstMessage *msg; + + GST_WARNING_OBJECT (self, "could not create volume element"); + msg = gst_missing_element_message_new (GST_ELEMENT_CAST (self), "volume"); + gst_element_post_message (GST_ELEMENT_CAST (self), msg); + + /* Nothing else to do, we will refuse the state change from NULL to READY to + * indicate that something went very wrong. It is doubtful that someone + * attempts changing our state though, since we end up having no pads! */ + return; + } + + volume_class = G_OBJECT_GET_CLASS (G_OBJECT (self->volume_element)); + self->max_volume = G_PARAM_SPEC_DOUBLE + (g_object_class_find_property (volume_class, "volume"))->maximum; + + GST_BIN_CLASS (parent_class)->add_element (GST_BIN_CAST (self), + self->volume_element); + + volume_pad = gst_element_get_static_pad (self->volume_element, "sink"); + ghost_pad = gst_ghost_pad_new_from_template ("sink", volume_pad, + gst_pad_get_pad_template (volume_pad)); + gst_object_unref (volume_pad); + gst_pad_set_event_function (ghost_pad, gst_rg_volume_sink_event); + gst_element_add_pad (GST_ELEMENT_CAST (self), ghost_pad); + + volume_pad = gst_element_get_static_pad (self->volume_element, "src"); + ghost_pad = gst_ghost_pad_new_from_template ("src", volume_pad, + gst_pad_get_pad_template (volume_pad)); + gst_object_unref (volume_pad); + gst_element_add_pad (GST_ELEMENT_CAST (self), ghost_pad); +} + +static void +gst_rg_volume_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRgVolume *self = GST_RG_VOLUME (object); + + switch (prop_id) { + case PROP_ALBUM_MODE: + self->album_mode = g_value_get_boolean (value); + break; + case PROP_HEADROOM: + self->headroom = g_value_get_double (value); + break; + case PROP_PRE_AMP: + self->pre_amp = g_value_get_double (value); + break; + case PROP_FALLBACK_GAIN: + self->fallback_gain = g_value_get_double (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + gst_rg_volume_update_gain (self); +} + +static void +gst_rg_volume_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRgVolume *self = GST_RG_VOLUME (object); + + switch (prop_id) { + case PROP_ALBUM_MODE: + g_value_set_boolean (value, self->album_mode); + break; + case PROP_HEADROOM: + g_value_set_double (value, self->headroom); + break; + case PROP_PRE_AMP: + g_value_set_double (value, self->pre_amp); + break; + case PROP_FALLBACK_GAIN: + g_value_set_double (value, self->fallback_gain); + break; + case PROP_TARGET_GAIN: + g_value_set_double (value, self->target_gain); + break; + case PROP_RESULT_GAIN: + g_value_set_double (value, self->result_gain); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rg_volume_dispose (GObject * object) +{ + GstRgVolume *self = GST_RG_VOLUME (object); + + if (self->volume_element != NULL) { + /* Manually remove our child using the bin implementation of remove_element. + * This is needed because we prevent gst_bin_remove from working, which the + * parent dispose handler would use if we had any children left. */ + GST_BIN_CLASS (parent_class)->remove_element (GST_BIN_CAST (self), + self->volume_element); + self->volume_element = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static GstStateChangeReturn +gst_rg_volume_change_state (GstElement * element, GstStateChange transition) +{ + GstRgVolume *self = GST_RG_VOLUME (element); + GstStateChangeReturn res; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + + if (G_UNLIKELY (self->volume_element == NULL)) { + /* Creating our child volume element in _init failed. */ + return GST_STATE_CHANGE_FAILURE; + } + break; + + case GST_STATE_CHANGE_READY_TO_PAUSED: + + gst_rg_volume_reset (self); + break; + + default: + break; + } + + res = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + return res; +} + +/* Event function for the ghost sink pad. */ +static gboolean +gst_rg_volume_sink_event (GstPad * pad, GstEvent * event) +{ + GstRgVolume *self; + GstPad *volume_sink_pad; + GstEvent *send_event = event; + gboolean res; + + self = GST_RG_VOLUME (gst_pad_get_parent_element (pad)); + volume_sink_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG: + + GST_LOG_OBJECT (self, "received tag event"); + + send_event = gst_rg_volume_tag_event (self, event); + + if (send_event == NULL) + GST_LOG_OBJECT (self, "all tags handled, dropping event"); + + break; + + case GST_EVENT_EOS: + + gst_rg_volume_reset (self); + break; + + default: + break; + } + + if (G_LIKELY (send_event != NULL)) + res = gst_pad_send_event (volume_sink_pad, send_event); + else + res = TRUE; + + gst_object_unref (volume_sink_pad); + gst_object_unref (self); + return res; +} + +static GstEvent * +gst_rg_volume_tag_event (GstRgVolume * self, GstEvent * event) +{ + GstTagList *tag_list; + gboolean has_track_gain, has_track_peak, has_album_gain, has_album_peak; + gboolean has_ref_level; + + g_return_val_if_fail (event != NULL, NULL); + g_return_val_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_TAG, event); + + gst_event_parse_tag (event, &tag_list); + + if (gst_tag_list_is_empty (tag_list)) + return event; + + has_track_gain = gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, + &self->track_gain); + has_track_peak = gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, + &self->track_peak); + has_album_gain = gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, + &self->album_gain); + has_album_peak = gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, + &self->album_peak); + has_ref_level = gst_tag_list_get_double (tag_list, GST_TAG_REFERENCE_LEVEL, + &self->reference_level); + + if (!has_track_gain && !has_track_peak && !has_album_gain && !has_album_peak) + return event; + + if (has_ref_level && (has_track_gain || has_album_gain) + && (ABS (self->reference_level - RG_REFERENCE_LEVEL) > 1.e-6)) { + /* Log a message stating the amount of adjustment that is applied below. */ + GST_DEBUG_OBJECT (self, + "compensating for reference level difference by %" GAIN_FORMAT, + RG_REFERENCE_LEVEL - self->reference_level); + } + if (has_track_gain) { + self->track_gain += RG_REFERENCE_LEVEL - self->reference_level; + } + if (has_album_gain) { + self->album_gain += RG_REFERENCE_LEVEL - self->reference_level; + } + + /* Ignore values that are obviously invalid. */ + if (G_UNLIKELY (has_track_gain && !VALID_GAIN (self->track_gain))) { + GST_DEBUG_OBJECT (self, + "ignoring bogus track gain value %" GAIN_FORMAT, self->track_gain); + has_track_gain = FALSE; + } + if (G_UNLIKELY (has_track_peak && !VALID_PEAK (self->track_peak))) { + GST_DEBUG_OBJECT (self, + "ignoring bogus track peak value %" PEAK_FORMAT, self->track_peak); + has_track_peak = FALSE; + } + if (G_UNLIKELY (has_album_gain && !VALID_GAIN (self->album_gain))) { + GST_DEBUG_OBJECT (self, + "ignoring bogus album gain value %" GAIN_FORMAT, self->album_gain); + has_album_gain = FALSE; + } + if (G_UNLIKELY (has_album_peak && !VALID_PEAK (self->album_peak))) { + GST_DEBUG_OBJECT (self, + "ignoring bogus album peak value %" PEAK_FORMAT, self->album_peak); + has_album_peak = FALSE; + } + + /* Clamp peaks >1.0. Float based decoders can produce spurious samples >1.0, + * cutting these files back to 1.0 should not cause any audible distortion. + * This is most often seen with Vorbis files. */ + if (has_track_peak && self->track_peak > 1.) { + GST_DEBUG_OBJECT (self, + "clamping track peak %" PEAK_FORMAT " to 1.0", self->track_peak); + self->track_peak = 1.0; + } + if (has_album_peak && self->album_peak > 1.) { + GST_DEBUG_OBJECT (self, + "clamping album peak %" PEAK_FORMAT " to 1.0", self->album_peak); + self->album_peak = 1.0; + } + + self->has_track_gain |= has_track_gain; + self->has_track_peak |= has_track_peak; + self->has_album_gain |= has_album_gain; + self->has_album_peak |= has_album_peak; + + event = (GstEvent *) gst_mini_object_make_writable (GST_MINI_OBJECT (event)); + gst_event_parse_tag (event, &tag_list); + + gst_tag_list_remove_tag (tag_list, GST_TAG_TRACK_GAIN); + gst_tag_list_remove_tag (tag_list, GST_TAG_TRACK_PEAK); + gst_tag_list_remove_tag (tag_list, GST_TAG_ALBUM_GAIN); + gst_tag_list_remove_tag (tag_list, GST_TAG_ALBUM_PEAK); + gst_tag_list_remove_tag (tag_list, GST_TAG_REFERENCE_LEVEL); + + gst_rg_volume_update_gain (self); + + if (gst_tag_list_is_empty (tag_list)) { + gst_event_unref (event); + event = NULL; + } + + return event; +} + +static void +gst_rg_volume_reset (GstRgVolume * self) +{ + self->has_track_gain = FALSE; + self->has_track_peak = FALSE; + self->has_album_gain = FALSE; + self->has_album_peak = FALSE; + + self->reference_level = RG_REFERENCE_LEVEL; + + gst_rg_volume_update_gain (self); +} + +static void +gst_rg_volume_update_gain (GstRgVolume * self) +{ + gdouble target_gain, result_gain, result_volume; + gboolean target_gain_changed, result_gain_changed; + + gst_rg_volume_determine_gain (self, &target_gain, &result_gain); + + result_volume = DB_TO_LINEAR (result_gain); + + /* Ensure that the result volume is within the range that the volume element + * can handle. Currently, the limit is 10. (+20 dB), which should not be + * restrictive. */ + if (G_UNLIKELY (result_volume > self->max_volume)) { + GST_INFO_OBJECT (self, + "cannot handle result gain of %" GAIN_FORMAT " (%0.6f), adjusting", + result_gain, result_volume); + + result_volume = self->max_volume; + result_gain = LINEAR_TO_DB (result_volume); + } + + /* Direct comparison is OK in this case. */ + if (target_gain == result_gain) { + GST_INFO_OBJECT (self, + "result gain is %" GAIN_FORMAT " (%0.6f), matching target", + result_gain, result_volume); + } else { + GST_INFO_OBJECT (self, + "result gain is %" GAIN_FORMAT " (%0.6f), target is %" GAIN_FORMAT, + result_gain, result_volume, target_gain); + } + + target_gain_changed = (self->target_gain != target_gain); + result_gain_changed = (self->result_gain != result_gain); + + self->target_gain = target_gain; + self->result_gain = result_gain; + + g_object_set (self->volume_element, "volume", result_volume, NULL); + + if (target_gain_changed) + g_object_notify ((GObject *) self, "target-gain"); + if (result_gain_changed) + g_object_notify ((GObject *) self, "result-gain"); +} + +static inline void +gst_rg_volume_determine_gain (GstRgVolume * self, gdouble * target_gain, + gdouble * result_gain) +{ + gdouble gain, peak; + + if (!self->has_track_gain && !self->has_album_gain) { + + GST_DEBUG_OBJECT (self, "using fallback gain"); + gain = self->fallback_gain; + peak = 1.0; + + } else if ((self->album_mode && self->has_album_gain) + || (!self->album_mode && !self->has_track_gain)) { + + gain = self->album_gain; + if (G_LIKELY (self->has_album_peak)) { + peak = self->album_peak; + } else { + GST_DEBUG_OBJECT (self, "album peak missing, assuming 1.0"); + peak = 1.0; + } + /* Falling back from track to album gain shouldn't really happen. */ + if (G_UNLIKELY (!self->album_mode)) + GST_INFO_OBJECT (self, "falling back to album gain"); + + } else { + /* !album_mode && !has_album_gain || album_mode && has_track_gain */ + + gain = self->track_gain; + if (G_LIKELY (self->has_track_peak)) { + peak = self->track_peak; + } else { + GST_DEBUG_OBJECT (self, "track peak missing, assuming 1.0"); + peak = 1.0; + } + if (self->album_mode) + GST_INFO_OBJECT (self, "falling back to track gain"); + } + + gain += self->pre_amp; + + *target_gain = gain; + *result_gain = gain; + + if (LINEAR_TO_DB (peak) + gain > self->headroom) { + *result_gain = LINEAR_TO_DB (1. / peak) + self->headroom; + } +} diff --git a/gst/replaygain/gstrgvolume.h b/gst/replaygain/gstrgvolume.h new file mode 100644 index 0000000..a0a5a8c --- /dev/null +++ b/gst/replaygain/gstrgvolume.h @@ -0,0 +1,88 @@ +/* GStreamer ReplayGain volume adjustment + * + * Copyright (C) 2007 Rene Stadler + * + * gstrgvolume.h: Element to apply ReplayGain volume adjustment + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef __GST_RG_VOLUME_H__ +#define __GST_RG_VOLUME_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RG_VOLUME \ + (gst_rg_volume_get_type()) +#define GST_RG_VOLUME(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RG_VOLUME,GstRgVolume)) +#define GST_RG_VOLUME_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RG_VOLUME,GstRgVolumeClass)) +#define GST_IS_RG_VOLUME(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RG_VOLUME)) +#define GST_IS_RG_VOLUME_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RG_VOLUME)) + +typedef struct _GstRgVolume GstRgVolume; +typedef struct _GstRgVolumeClass GstRgVolumeClass; + +/** + * GstRgVolume: + * + * Opaque data structure. + */ +struct _GstRgVolume +{ + GstBin bin; + + /*< private >*/ + + GstElement *volume_element; + gdouble max_volume; + + gboolean album_mode; + gdouble headroom; + gdouble pre_amp; + gdouble fallback_gain; + + gdouble target_gain; + gdouble result_gain; + + gdouble track_gain; + gdouble track_peak; + gdouble album_gain; + gdouble album_peak; + + gboolean has_track_gain; + gboolean has_track_peak; + gboolean has_album_gain; + gboolean has_album_peak; + + gdouble reference_level; +}; + +struct _GstRgVolumeClass +{ + GstBinClass parent_class; +}; + +GType gst_rg_volume_get_type (void); + +G_END_DECLS + +#endif /* __GST_RG_VOLUME_H__ */ diff --git a/gst/replaygain/replaygain.c b/gst/replaygain/replaygain.c new file mode 100644 index 0000000..d0127e8 --- /dev/null +++ b/gst/replaygain/replaygain.c @@ -0,0 +1,53 @@ +/* GStreamer ReplayGain plugin + * + * Copyright (C) 2006 Rene Stadler + * + * replaygain.c: Plugin providing ReplayGain related elements + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gstrganalysis.h" +#include "gstrglimiter.h" +#include "gstrgvolume.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "rganalysis", GST_RANK_NONE, + GST_TYPE_RG_ANALYSIS)) + return FALSE; + + if (!gst_element_register (plugin, "rglimiter", GST_RANK_NONE, + GST_TYPE_RG_LIMITER)) + return FALSE; + + if (!gst_element_register (plugin, "rgvolume", GST_RANK_NONE, + GST_TYPE_RG_VOLUME)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "replaygain", + "ReplayGain volume normalization", plugin_init, VERSION, GST_LICENSE, + GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/replaygain/replaygain.h b/gst/replaygain/replaygain.h new file mode 100644 index 0000000..15be888 --- /dev/null +++ b/gst/replaygain/replaygain.h @@ -0,0 +1,36 @@ +/* GStreamer ReplayGain plugin + * + * Copyright (C) 2006 Rene Stadler + * + * replaygain.h: Plugin providing ReplayGain related elements + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef __REPLAYGAIN_H__ +#define __REPLAYGAIN_H__ + +G_BEGIN_DECLS + +/* Reference level (in dBSPL). The 2001 proposal specifies 83. This was + * changed later in all implementations to 89, which is the new, offical value: + * David Robinson acknowledged the change but didn't update the website yet. */ + +#define RG_REFERENCE_LEVEL 89. + +G_END_DECLS + +#endif /* __REPLAYGAIN_H__ */ diff --git a/gst/replaygain/rganalysis.c b/gst/replaygain/rganalysis.c new file mode 100644 index 0000000..2553536 --- /dev/null +++ b/gst/replaygain/rganalysis.c @@ -0,0 +1,824 @@ +/* GStreamer ReplayGain analysis + * + * Copyright (C) 2006 Rene Stadler + * Copyright (C) 2001 David Robinson + * Glen Sawyer + * + * rganalysis.c: Analyze raw audio data in accordance with ReplayGain + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +/* Based on code with Copyright (C) 2001 David Robinson + * and Glen Sawyer , + * which is distributed under the LGPL as part of the vorbisgain + * program. The original code also mentions Frank Klemm + * (http://www.uni-jena.de/~pfk/mpp/) for having contributed lots of + * good code. Specifically, this is based on the file + * "gain_analysis.c" from vorbisgain version 0.34. + */ + +/* Room for future improvement: Mono data is currently in fact copied + * to two channels which get processed normally. This means that mono + * input data is processed twice. + */ + +/* Helpful information for understanding this code: The two IIR + * filters depend on previous input _and_ previous output samples (up + * to the filter's order number of samples). This explains the whole + * lot of memcpy'ing done in rg_analysis_analyze and why the context + * holds so many buffers. + */ + +#include +#include +#include + +#include "rganalysis.h" + +#define YULE_ORDER 10 +#define BUTTER_ORDER 2 +/* Percentile which is louder than the proposed level: */ +#define RMS_PERCENTILE 95 +/* Duration of RMS window in milliseconds: */ +#define RMS_WINDOW_MSECS 50 +/* Histogram array elements per dB: */ +#define STEPS_PER_DB 100 +/* Histogram upper bound in dB (normal max. values in the wild are + * assumed to be around 70, 80 dB): */ +#define MAX_DB 120 +/* Calibration value: */ +#define PINK_REF 64.82 /* 298640883795 */ + +#define MAX_ORDER MAX (BUTTER_ORDER, YULE_ORDER) +#define MAX_SAMPLE_RATE 48000 +/* The + 999 has the effect of ceil()ing: */ +#define MAX_SAMPLE_WINDOW (guint) \ + ((MAX_SAMPLE_RATE * RMS_WINDOW_MSECS + 999) / 1000) + +/* Analysis result accumulator. */ + +struct _RgAnalysisAcc +{ + guint32 histogram[STEPS_PER_DB * MAX_DB]; + gdouble peak; +}; + +typedef struct _RgAnalysisAcc RgAnalysisAcc; + +/* Analysis context. */ + +struct _RgAnalysisCtx +{ + /* Filter buffers for left channel. */ + gfloat inprebuf_l[MAX_ORDER * 2]; + gfloat *inpre_l; + gfloat stepbuf_l[MAX_SAMPLE_WINDOW + MAX_ORDER]; + gfloat *step_l; + gfloat outbuf_l[MAX_SAMPLE_WINDOW + MAX_ORDER]; + gfloat *out_l; + /* Filter buffers for right channel. */ + gfloat inprebuf_r[MAX_ORDER * 2]; + gfloat *inpre_r; + gfloat stepbuf_r[MAX_SAMPLE_WINDOW + MAX_ORDER]; + gfloat *step_r; + gfloat outbuf_r[MAX_SAMPLE_WINDOW + MAX_ORDER]; + gfloat *out_r; + + /* Number of samples to reach duration of the RMS window: */ + guint window_n_samples; + /* Progress of the running window: */ + guint window_n_samples_done; + gdouble window_square_sum; + + gint sample_rate; + gint sample_rate_index; + + RgAnalysisAcc track; + RgAnalysisAcc album; + void (*post_message) (gpointer analysis, + GstClockTime timestamp, GstClockTime duration, gdouble rglevel); + gpointer analysis; + /* The timestamp of the current incoming buffer. */ + GstClockTime buffer_timestamp; + /* Number of samples processed in current buffer, during emit_signal, + this will always be on an RMS window boundary. */ + guint buffer_n_samples_done; +}; + +/* Filter coefficients for the IIR filters that form the equal + * loudness filter. XFilter[ctx->sample_rate_index] gives the array + * of the X coefficients (A or B) for the configured sample rate. */ + +#ifdef _MSC_VER +/* Disable double-to-float warning: */ +/* A better solution would be to append 'f' to each constant, but that + * makes the code ugly. */ +#pragma warning ( disable : 4305 ) +#endif + +static const gfloat AYule[9][11] = { + {1., -3.84664617118067, 7.81501653005538, -11.34170355132042, + 13.05504219327545, -12.28759895145294, 9.48293806319790, + -5.87257861775999, 2.75465861874613, -0.86984376593551, + 0.13919314567432}, + {1., -3.47845948550071, 6.36317777566148, -8.54751527471874, 9.47693607801280, + -8.81498681370155, 6.85401540936998, -4.39470996079559, + 2.19611684890774, -0.75104302451432, 0.13149317958808}, + {1., -2.37898834973084, 2.84868151156327, -2.64577170229825, 2.23697657451713, + -1.67148153367602, 1.00595954808547, -0.45953458054983, + 0.16378164858596, -0.05032077717131, 0.02347897407020}, + {1., -1.61273165137247, 1.07977492259970, -0.25656257754070, + -0.16276719120440, -0.22638893773906, 0.39120800788284, + -0.22138138954925, 0.04500235387352, 0.02005851806501, + 0.00302439095741}, + {1., -1.49858979367799, 0.87350271418188, 0.12205022308084, -0.80774944671438, + 0.47854794562326, -0.12453458140019, -0.04067510197014, + 0.08333755284107, -0.04237348025746, 0.02977207319925}, + {1., -0.62820619233671, 0.29661783706366, -0.37256372942400, 0.00213767857124, + -0.42029820170918, 0.22199650564824, 0.00613424350682, 0.06747620744683, + 0.05784820375801, 0.03222754072173}, + {1., -1.04800335126349, 0.29156311971249, -0.26806001042947, 0.00819999645858, + 0.45054734505008, -0.33032403314006, 0.06739368333110, + -0.04784254229033, 0.01639907836189, 0.01807364323573}, + {1., -0.51035327095184, -0.31863563325245, -0.20256413484477, + 0.14728154134330, 0.38952639978999, -0.23313271880868, + -0.05246019024463, -0.02505961724053, 0.02442357316099, + 0.01818801111503}, + {1., -0.25049871956020, -0.43193942311114, -0.03424681017675, + -0.04678328784242, 0.26408300200955, 0.15113130533216, + -0.17556493366449, -0.18823009262115, 0.05477720428674, + 0.04704409688120} +}; + +static const gfloat BYule[9][11] = { + {0.03857599435200, -0.02160367184185, -0.00123395316851, -0.00009291677959, + -0.01655260341619, 0.02161526843274, -0.02074045215285, + 0.00594298065125, 0.00306428023191, 0.00012025322027, 0.00288463683916}, + {0.05418656406430, -0.02911007808948, -0.00848709379851, -0.00851165645469, + -0.00834990904936, 0.02245293253339, -0.02596338512915, + 0.01624864962975, -0.00240879051584, 0.00674613682247, + -0.00187763777362}, + {0.15457299681924, -0.09331049056315, -0.06247880153653, 0.02163541888798, + -0.05588393329856, 0.04781476674921, 0.00222312597743, 0.03174092540049, + -0.01390589421898, 0.00651420667831, -0.00881362733839}, + {0.30296907319327, -0.22613988682123, -0.08587323730772, 0.03282930172664, + -0.00915702933434, -0.02364141202522, -0.00584456039913, + 0.06276101321749, -0.00000828086748, 0.00205861885564, + -0.02950134983287}, + {0.33642304856132, -0.25572241425570, -0.11828570177555, 0.11921148675203, + -0.07834489609479, -0.00469977914380, -0.00589500224440, + 0.05724228140351, 0.00832043980773, -0.01635381384540, + -0.01760176568150}, + {0.44915256608450, -0.14351757464547, -0.22784394429749, -0.01419140100551, + 0.04078262797139, -0.12398163381748, 0.04097565135648, 0.10478503600251, + -0.01863887810927, -0.03193428438915, 0.00541907748707}, + {0.56619470757641, -0.75464456939302, 0.16242137742230, 0.16744243493672, + -0.18901604199609, 0.30931782841830, -0.27562961986224, + 0.00647310677246, 0.08647503780351, -0.03788984554840, + -0.00588215443421}, + {0.58100494960553, -0.53174909058578, -0.14289799034253, 0.17520704835522, + 0.02377945217615, 0.15558449135573, -0.25344790059353, 0.01628462406333, + 0.06920467763959, -0.03721611395801, -0.00749618797172}, + {0.53648789255105, -0.42163034350696, -0.00275953611929, 0.04267842219415, + -0.10214864179676, 0.14590772289388, -0.02459864859345, + -0.11202315195388, -0.04060034127000, 0.04788665548180, + -0.02217936801134} +}; + +static const gfloat AButter[9][3] = { + {1., -1.97223372919527, 0.97261396931306}, + {1., -1.96977855582618, 0.97022847566350}, + {1., -1.95835380975398, 0.95920349965459}, + {1., -1.95002759149878, 0.95124613669835}, + {1., -1.94561023566527, 0.94705070426118}, + {1., -1.92783286977036, 0.93034775234268}, + {1., -1.91858953033784, 0.92177618768381}, + {1., -1.91542108074780, 0.91885558323625}, + {1., -1.88903307939452, 0.89487434461664} +}; + +static const gfloat BButter[9][3] = { + {0.98621192462708, -1.97242384925416, 0.98621192462708}, + {0.98500175787242, -1.97000351574484, 0.98500175787242}, + {0.97938932735214, -1.95877865470428, 0.97938932735214}, + {0.97531843204928, -1.95063686409857, 0.97531843204928}, + {0.97316523498161, -1.94633046996323, 0.97316523498161}, + {0.96454515552826, -1.92909031105652, 0.96454515552826}, + {0.96009142950541, -1.92018285901082, 0.96009142950541}, + {0.95856916599601, -1.91713833199203, 0.95856916599601}, + {0.94597685600279, -1.89195371200558, 0.94597685600279} +}; + +#ifdef _MSC_VER +#pragma warning ( default : 4305 ) +#endif + +/* Filter functions. These access elements with negative indices of + * the input and output arrays (up to the filter's order). */ + +/* For much better performance, the function below has been + * implemented by unrolling the inner loop for our two use cases. */ + +/* + * static inline void + * apply_filter (const gfloat * input, gfloat * output, guint n_samples, + * const gfloat * a, const gfloat * b, guint order) + * { + * gfloat y; + * gint i, k; + * + * for (i = 0; i < n_samples; i++) { + * y = input[i] * b[0]; + * for (k = 1; k <= order; k++) + * y += input[i - k] * b[k] - output[i - k] * a[k]; + * output[i] = y; + * } + * } + */ + +static inline void +yule_filter (const gfloat * input, gfloat * output, + const gfloat * a, const gfloat * b) +{ + /* 1e-10 is added below to avoid running into denormals when operating on + * near silence. */ + + output[0] = 1e-10 + input[0] * b[0] + + input[-1] * b[1] - output[-1] * a[1] + + input[-2] * b[2] - output[-2] * a[2] + + input[-3] * b[3] - output[-3] * a[3] + + input[-4] * b[4] - output[-4] * a[4] + + input[-5] * b[5] - output[-5] * a[5] + + input[-6] * b[6] - output[-6] * a[6] + + input[-7] * b[7] - output[-7] * a[7] + + input[-8] * b[8] - output[-8] * a[8] + + input[-9] * b[9] - output[-9] * a[9] + + input[-10] * b[10] - output[-10] * a[10]; +} + +static inline void +butter_filter (const gfloat * input, gfloat * output, + const gfloat * a, const gfloat * b) +{ + output[0] = input[0] * b[0] + + input[-1] * b[1] - output[-1] * a[1] + + input[-2] * b[2] - output[-2] * a[2]; +} + +/* Because butter_filter and yule_filter are inlined, this function is + * a bit blown-up (code-size wise), but not inlining gives a ca. 40% + * performance penalty. */ + +static inline void +apply_filters (const RgAnalysisCtx * ctx, const gfloat * input_l, + const gfloat * input_r, guint n_samples) +{ + const gfloat *ayule = AYule[ctx->sample_rate_index]; + const gfloat *byule = BYule[ctx->sample_rate_index]; + const gfloat *abutter = AButter[ctx->sample_rate_index]; + const gfloat *bbutter = BButter[ctx->sample_rate_index]; + gint pos = ctx->window_n_samples_done; + gint i; + + for (i = 0; i < n_samples; i++, pos++) { + yule_filter (input_l + i, ctx->step_l + pos, ayule, byule); + butter_filter (ctx->step_l + pos, ctx->out_l + pos, abutter, bbutter); + + yule_filter (input_r + i, ctx->step_r + pos, ayule, byule); + butter_filter (ctx->step_r + pos, ctx->out_r + pos, abutter, bbutter); + } +} + +/* Clear filter buffer state and current RMS window. */ + +static void +reset_filters (RgAnalysisCtx * ctx) +{ + gint i; + + for (i = 0; i < MAX_ORDER; i++) { + + ctx->inprebuf_l[i] = 0.; + ctx->stepbuf_l[i] = 0.; + ctx->outbuf_l[i] = 0.; + + ctx->inprebuf_r[i] = 0.; + ctx->stepbuf_r[i] = 0.; + ctx->outbuf_r[i] = 0.; + } + + ctx->window_square_sum = 0.; + ctx->window_n_samples_done = 0; +} + +/* Accumulator functions. */ + +/* Add two accumulators in-place. The sum is defined as the result of + * the vector sum of the histogram array and the maximum value of the + * peak field. Thus "adding" the accumulators for all tracks yields + * the correct result for obtaining the album gain and peak. */ + +static void +accumulator_add (RgAnalysisAcc * acc, const RgAnalysisAcc * acc_other) +{ + gint i; + + for (i = 0; i < G_N_ELEMENTS (acc->histogram); i++) + acc->histogram[i] += acc_other->histogram[i]; + + acc->peak = MAX (acc->peak, acc_other->peak); +} + +/* Reset an accumulator to zero. */ + +static void +accumulator_clear (RgAnalysisAcc * acc) +{ + memset (acc->histogram, 0, sizeof (acc->histogram)); + acc->peak = 0.; +} + +/* Obtain final analysis result from an accumulator. Returns TRUE on + * success, FALSE on error (if accumulator is still zero). */ + +static gboolean +accumulator_result (const RgAnalysisAcc * acc, gdouble * result_gain, + gdouble * result_peak) +{ + guint32 sum = 0; + guint32 upper; + guint i; + + for (i = 0; i < G_N_ELEMENTS (acc->histogram); i++) + sum += acc->histogram[i]; + + if (sum == 0) + /* All entries are 0: We got less than 50ms of data. */ + return FALSE; + + upper = (guint32) ceil (sum * (1. - (gdouble) (RMS_PERCENTILE / 100.))); + + for (i = G_N_ELEMENTS (acc->histogram); i--;) { + if (upper <= acc->histogram[i]) + break; + upper -= acc->histogram[i]; + } + + if (result_peak != NULL) + *result_peak = acc->peak; + if (result_gain != NULL) + *result_gain = PINK_REF - (gdouble) i / STEPS_PER_DB; + + return TRUE; +} + +/* Functions that operate on contexts, for external usage. */ + +/* Create a new context. Before it can be used, a sample rate must be + * configured using rg_analysis_set_sample_rate. */ + +RgAnalysisCtx * +rg_analysis_new (void) +{ + RgAnalysisCtx *ctx; + + ctx = g_new (RgAnalysisCtx, 1); + + ctx->inpre_l = ctx->inprebuf_l + MAX_ORDER; + ctx->step_l = ctx->stepbuf_l + MAX_ORDER; + ctx->out_l = ctx->outbuf_l + MAX_ORDER; + + ctx->inpre_r = ctx->inprebuf_r + MAX_ORDER; + ctx->step_r = ctx->stepbuf_r + MAX_ORDER; + ctx->out_r = ctx->outbuf_r + MAX_ORDER; + + ctx->sample_rate = 0; + + accumulator_clear (&ctx->track); + accumulator_clear (&ctx->album); + + return ctx; +} + +static void +reset_silence_detection (RgAnalysisCtx * ctx) +{ + ctx->buffer_timestamp = GST_CLOCK_TIME_NONE; + ctx->buffer_n_samples_done = 0; +} + +/* Adapt to given sample rate. Does nothing if already the current + * rate (returns TRUE then). Returns FALSE only if given sample rate + * is not supported. If the configured rate changes, the last + * unprocessed incomplete 50ms chunk of data is dropped because the + * filters are reset. */ + +gboolean +rg_analysis_set_sample_rate (RgAnalysisCtx * ctx, gint sample_rate) +{ + g_return_val_if_fail (ctx != NULL, FALSE); + + if (ctx->sample_rate == sample_rate) + return TRUE; + + switch (sample_rate) { + case 48000: + ctx->sample_rate_index = 0; + break; + case 44100: + ctx->sample_rate_index = 1; + break; + case 32000: + ctx->sample_rate_index = 2; + break; + case 24000: + ctx->sample_rate_index = 3; + break; + case 22050: + ctx->sample_rate_index = 4; + break; + case 16000: + ctx->sample_rate_index = 5; + break; + case 12000: + ctx->sample_rate_index = 6; + break; + case 11025: + ctx->sample_rate_index = 7; + break; + case 8000: + ctx->sample_rate_index = 8; + break; + default: + return FALSE; + } + + ctx->sample_rate = sample_rate; + /* The + 999 has the effect of ceil()ing: */ + ctx->window_n_samples = (guint) ((sample_rate * RMS_WINDOW_MSECS + 999) + / 1000); + + reset_filters (ctx); + reset_silence_detection (ctx); + + return TRUE; +} + +void +rg_analysis_init_silence_detection (RgAnalysisCtx * ctx, + void (*post_message) (gpointer analysis, GstClockTime timestamp, + GstClockTime duration, gdouble rglevel), gpointer analysis) +{ + ctx->post_message = post_message; + ctx->analysis = analysis; + reset_silence_detection (ctx); +} + +void +rg_analysis_start_buffer (RgAnalysisCtx * ctx, GstClockTime buffer_timestamp) +{ + ctx->buffer_timestamp = buffer_timestamp; + ctx->buffer_n_samples_done = 0; +} + +void +rg_analysis_destroy (RgAnalysisCtx * ctx) +{ + g_free (ctx); +} + +/* Entry points for analyzing sample data in common raw data formats. + * The stereo format functions expect interleaved frames. It is + * possible to pass data in different formats for the same context, + * there are no restrictions. All functions have the same signature; + * the depth argument for the float functions is not variable and must + * be given the value 32. */ + +void +rg_analysis_analyze_mono_float (RgAnalysisCtx * ctx, gconstpointer data, + gsize size, guint depth) +{ + gfloat conv_samples[512]; + const gfloat *samples = (gfloat *) data; + guint n_samples = size / sizeof (gfloat); + gint i; + + g_return_if_fail (depth == 32); + g_return_if_fail (size % sizeof (gfloat) == 0); + + while (n_samples) { + gint n = MIN (n_samples, G_N_ELEMENTS (conv_samples)); + + n_samples -= n; + memcpy (conv_samples, samples, n * sizeof (gfloat)); + for (i = 0; i < n; i++) { + ctx->track.peak = MAX (ctx->track.peak, fabs (conv_samples[i])); + conv_samples[i] *= 32768.; + } + samples += n; + rg_analysis_analyze (ctx, conv_samples, NULL, n); + } +} + +void +rg_analysis_analyze_stereo_float (RgAnalysisCtx * ctx, gconstpointer data, + gsize size, guint depth) +{ + gfloat conv_samples_l[256]; + gfloat conv_samples_r[256]; + const gfloat *samples = (gfloat *) data; + guint n_frames = size / (sizeof (gfloat) * 2); + gint i; + + g_return_if_fail (depth == 32); + g_return_if_fail (size % (sizeof (gfloat) * 2) == 0); + + while (n_frames) { + gint n = MIN (n_frames, G_N_ELEMENTS (conv_samples_l)); + + n_frames -= n; + for (i = 0; i < n; i++) { + gfloat old_sample; + + old_sample = samples[2 * i]; + ctx->track.peak = MAX (ctx->track.peak, fabs (old_sample)); + conv_samples_l[i] = old_sample * 32768.; + + old_sample = samples[2 * i + 1]; + ctx->track.peak = MAX (ctx->track.peak, fabs (old_sample)); + conv_samples_r[i] = old_sample * 32768.; + } + samples += 2 * n; + rg_analysis_analyze (ctx, conv_samples_l, conv_samples_r, n); + } +} + +void +rg_analysis_analyze_mono_int16 (RgAnalysisCtx * ctx, gconstpointer data, + gsize size, guint depth) +{ + gfloat conv_samples[512]; + gint32 peak_sample = 0; + const gint16 *samples = (gint16 *) data; + guint n_samples = size / sizeof (gint16); + gint shift = sizeof (gint16) * 8 - depth; + gint i; + + g_return_if_fail (depth <= (sizeof (gint16) * 8)); + g_return_if_fail (size % sizeof (gint16) == 0); + + while (n_samples) { + gint n = MIN (n_samples, G_N_ELEMENTS (conv_samples)); + + n_samples -= n; + for (i = 0; i < n; i++) { + gint16 old_sample = samples[i] << shift; + + peak_sample = MAX (peak_sample, ABS ((gint32) old_sample)); + conv_samples[i] = (gfloat) old_sample; + } + samples += n; + rg_analysis_analyze (ctx, conv_samples, NULL, n); + } + ctx->track.peak = MAX (ctx->track.peak, + (gdouble) peak_sample / ((gdouble) (1u << 15))); +} + +void +rg_analysis_analyze_stereo_int16 (RgAnalysisCtx * ctx, gconstpointer data, + gsize size, guint depth) +{ + gfloat conv_samples_l[256]; + gfloat conv_samples_r[256]; + gint32 peak_sample = 0; + const gint16 *samples = (gint16 *) data; + guint n_frames = size / (sizeof (gint16) * 2); + gint shift = sizeof (gint16) * 8 - depth; + gint i; + + g_return_if_fail (depth <= (sizeof (gint16) * 8)); + g_return_if_fail (size % (sizeof (gint16) * 2) == 0); + + while (n_frames) { + gint n = MIN (n_frames, G_N_ELEMENTS (conv_samples_l)); + + n_frames -= n; + for (i = 0; i < n; i++) { + gint16 old_sample; + + old_sample = samples[2 * i] << shift; + peak_sample = MAX (peak_sample, ABS ((gint32) old_sample)); + conv_samples_l[i] = (gfloat) old_sample; + + old_sample = samples[2 * i + 1] << shift; + peak_sample = MAX (peak_sample, ABS ((gint32) old_sample)); + conv_samples_r[i] = (gfloat) old_sample; + } + samples += 2 * n; + rg_analysis_analyze (ctx, conv_samples_l, conv_samples_r, n); + } + ctx->track.peak = MAX (ctx->track.peak, + (gdouble) peak_sample / ((gdouble) (1u << 15))); +} + +/* Analyze the given chunk of samples. The sample data is given in + * floating point format but should be scaled such that the values + * +/-32768.0 correspond to the -0dBFS reference amplitude. + * + * samples_l: Buffer with sample data for the left channel or of the + * mono channel. + * + * samples_r: Buffer with sample data for the right channel or NULL + * for mono. + * + * n_samples: Number of samples passed in each buffer. + */ + +void +rg_analysis_analyze (RgAnalysisCtx * ctx, const gfloat * samples_l, + const gfloat * samples_r, guint n_samples) +{ + const gfloat *input_l, *input_r; + guint n_samples_done; + gint i; + + g_return_if_fail (ctx != NULL); + g_return_if_fail (samples_l != NULL); + g_return_if_fail (ctx->sample_rate != 0); + + if (n_samples == 0) + return; + + if (samples_r == NULL) + /* Mono. */ + samples_r = samples_l; + + memcpy (ctx->inpre_l, samples_l, + MIN (n_samples, MAX_ORDER) * sizeof (gfloat)); + memcpy (ctx->inpre_r, samples_r, + MIN (n_samples, MAX_ORDER) * sizeof (gfloat)); + + n_samples_done = 0; + while (n_samples_done < n_samples) { + /* Limit number of samples to be processed in this iteration to + * the number needed to complete the next window: */ + guint n_samples_current = MIN (n_samples - n_samples_done, + ctx->window_n_samples - ctx->window_n_samples_done); + + if (n_samples_done < MAX_ORDER) { + input_l = ctx->inpre_l + n_samples_done; + input_r = ctx->inpre_r + n_samples_done; + n_samples_current = MIN (n_samples_current, MAX_ORDER - n_samples_done); + } else { + input_l = samples_l + n_samples_done; + input_r = samples_r + n_samples_done; + } + + apply_filters (ctx, input_l, input_r, n_samples_current); + + /* Update the square sum. */ + for (i = 0; i < n_samples_current; i++) + ctx->window_square_sum += ctx->out_l[ctx->window_n_samples_done + i] + * ctx->out_l[ctx->window_n_samples_done + i] + + ctx->out_r[ctx->window_n_samples_done + i] + * ctx->out_r[ctx->window_n_samples_done + i]; + + ctx->window_n_samples_done += n_samples_current; + ctx->buffer_n_samples_done += n_samples_current; + + g_return_if_fail (ctx->window_n_samples_done <= ctx->window_n_samples); + + if (ctx->window_n_samples_done == ctx->window_n_samples) { + /* Get the Root Mean Square (RMS) for this set of samples. */ + gdouble val = STEPS_PER_DB * 10. * log10 (ctx->window_square_sum / + ctx->window_n_samples * 0.5 + 1.e-37); + gint ival = CLAMP ((gint) val, 0, + (gint) G_N_ELEMENTS (ctx->track.histogram) - 1); + /* Compute the per-window gain */ + const gdouble gain = PINK_REF - (gdouble) ival / STEPS_PER_DB; + const GstClockTime timestamp = ctx->buffer_timestamp + + gst_util_uint64_scale_int_ceil (GST_SECOND, + ctx->buffer_n_samples_done, + ctx->sample_rate) + - RMS_WINDOW_MSECS * GST_MSECOND; + + ctx->post_message (ctx->analysis, timestamp, + RMS_WINDOW_MSECS * GST_MSECOND, -gain); + + + ctx->track.histogram[ival]++; + ctx->window_square_sum = 0.; + ctx->window_n_samples_done = 0; + + /* No need for memmove here, the areas never overlap: Even for + * the smallest sample rate, the number of samples needed for + * the window is greater than MAX_ORDER. */ + + memcpy (ctx->stepbuf_l, ctx->stepbuf_l + ctx->window_n_samples, + MAX_ORDER * sizeof (gfloat)); + memcpy (ctx->outbuf_l, ctx->outbuf_l + ctx->window_n_samples, + MAX_ORDER * sizeof (gfloat)); + + memcpy (ctx->stepbuf_r, ctx->stepbuf_r + ctx->window_n_samples, + MAX_ORDER * sizeof (gfloat)); + memcpy (ctx->outbuf_r, ctx->outbuf_r + ctx->window_n_samples, + MAX_ORDER * sizeof (gfloat)); + } + + n_samples_done += n_samples_current; + } + + if (n_samples >= MAX_ORDER) { + + memcpy (ctx->inprebuf_l, samples_l + n_samples - MAX_ORDER, + MAX_ORDER * sizeof (gfloat)); + + memcpy (ctx->inprebuf_r, samples_r + n_samples - MAX_ORDER, + MAX_ORDER * sizeof (gfloat)); + + } else { + + memmove (ctx->inprebuf_l, ctx->inprebuf_l + n_samples, + (MAX_ORDER - n_samples) * sizeof (gfloat)); + memcpy (ctx->inprebuf_l + MAX_ORDER - n_samples, samples_l, + n_samples * sizeof (gfloat)); + + memmove (ctx->inprebuf_r, ctx->inprebuf_r + n_samples, + (MAX_ORDER - n_samples) * sizeof (gfloat)); + memcpy (ctx->inprebuf_r + MAX_ORDER - n_samples, samples_r, + n_samples * sizeof (gfloat)); + + } +} + +/* Obtain track gain and peak. Returns TRUE on success. Can fail if + * not enough samples have been processed. Updates album accumulator. + * Resets track accumulator. */ + +gboolean +rg_analysis_track_result (RgAnalysisCtx * ctx, gdouble * gain, gdouble * peak) +{ + gboolean result; + + g_return_val_if_fail (ctx != NULL, FALSE); + + accumulator_add (&ctx->album, &ctx->track); + result = accumulator_result (&ctx->track, gain, peak); + accumulator_clear (&ctx->track); + + reset_filters (ctx); + reset_silence_detection (ctx); + + return result; +} + +/* Obtain album gain and peak. Returns TRUE on success. Can fail if + * not enough samples have been processed. Resets album + * accumulator. */ + +gboolean +rg_analysis_album_result (RgAnalysisCtx * ctx, gdouble * gain, gdouble * peak) +{ + gboolean result; + + g_return_val_if_fail (ctx != NULL, FALSE); + + result = accumulator_result (&ctx->album, gain, peak); + accumulator_clear (&ctx->album); + + return result; +} + +void +rg_analysis_reset_album (RgAnalysisCtx * ctx) +{ + accumulator_clear (&ctx->album); +} + +/* Reset internal buffers as well as track and album accumulators. + * Configured sample rate is kept intact. */ + +void +rg_analysis_reset (RgAnalysisCtx * ctx) +{ + g_return_if_fail (ctx != NULL); + + reset_filters (ctx); + accumulator_clear (&ctx->track); + accumulator_clear (&ctx->album); + reset_silence_detection (ctx); +} diff --git a/gst/replaygain/rganalysis.h b/gst/replaygain/rganalysis.h new file mode 100644 index 0000000..f57ad0a --- /dev/null +++ b/gst/replaygain/rganalysis.h @@ -0,0 +1,63 @@ +/* GStreamer ReplayGain analysis + * + * Copyright (C) 2006 Rene Stadler + * Copyright (C) 2001 David Robinson + * Glen Sawyer + * + * rganalysis.h: Analyze raw audio data in accordance with ReplayGain + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef __RG_ANALYSIS_H__ +#define __RG_ANALYSIS_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _RgAnalysisCtx RgAnalysisCtx; + +RgAnalysisCtx *rg_analysis_new (void); +gboolean rg_analysis_set_sample_rate (RgAnalysisCtx * ctx, gint sample_rate); +void rg_analysis_analyze_mono_float (RgAnalysisCtx * ctx, gconstpointer data, + gsize size, guint depth); +void rg_analysis_analyze_stereo_float (RgAnalysisCtx * ctx, gconstpointer data, + gsize size, guint depth); +void rg_analysis_analyze_mono_int16 (RgAnalysisCtx * ctx, gconstpointer data, + gsize size, guint depth); +void rg_analysis_analyze_stereo_int16 (RgAnalysisCtx * ctx, gconstpointer data, + gsize size, guint depth); +void rg_analysis_analyze (RgAnalysisCtx * ctx, const gfloat * samples_l, + const gfloat * samples_r, guint n_samples); +gboolean rg_analysis_track_result (RgAnalysisCtx * ctx, gdouble * gain, + gdouble * peak); +gboolean rg_analysis_album_result (RgAnalysisCtx * ctx, gdouble * gain, + gdouble * peak); +void rg_analysis_init_silence_detection ( + RgAnalysisCtx * ctx, + void (*post_message) (gpointer analysis, GstClockTime timestamp, GstClockTime duration, gdouble rglevel), + gpointer analysis); +void rg_analysis_start_buffer (RgAnalysisCtx * ctx, + GstClockTime buffer_timestamp); +void rg_analysis_reset_album (RgAnalysisCtx * ctx); +void rg_analysis_reset (RgAnalysisCtx * ctx); +void rg_analysis_destroy (RgAnalysisCtx * ctx); + +G_END_DECLS + +#endif /* __RG_ANALYSIS_H__ */ diff --git a/gst/rtp/Makefile.am b/gst/rtp/Makefile.am new file mode 100644 index 0000000..5c43cce --- /dev/null +++ b/gst/rtp/Makefile.am @@ -0,0 +1,180 @@ +plugin_LTLIBRARIES = libgstrtp.la + +libgstrtp_la_SOURCES = \ + fnv1hash.c \ + gstrtp.c \ + gstrtpchannels.c \ + gstrtpdepay.c \ + gstrtpac3depay.c \ + gstrtpac3pay.c \ + gstrtpbvdepay.c \ + gstrtpbvpay.c \ + gstrtpceltdepay.c \ + gstrtpceltpay.c \ + gstrtpdvdepay.c \ + gstrtpdvpay.c \ + gstrtpgstdepay.c \ + gstrtpgstpay.c \ + gstrtpilbcdepay.c \ + gstrtpilbcpay.c \ + gstrtpmpadepay.c \ + gstrtpmpapay.c \ + gstrtpmparobustdepay.c \ + gstrtpmpvdepay.c \ + gstrtpmpvpay.c \ + gstrtppcmadepay.c \ + gstrtppcmudepay.c \ + gstrtppcmupay.c \ + gstrtppcmapay.c \ + gstrtpg722depay.c \ + gstrtpg722pay.c \ + gstrtpg723depay.c \ + gstrtpg723pay.c \ + gstrtpg726pay.c \ + gstrtpg726depay.c \ + gstrtpg729pay.c \ + gstrtpg729depay.c \ + gstrtpgsmdepay.c \ + gstrtpgsmpay.c \ + gstrtpamrdepay.c \ + gstrtpamrpay.c \ + gstrtph263pdepay.c \ + gstrtph263ppay.c \ + gstrtph263depay.c \ + gstrtph263pay.c \ + gstrtph264depay.c \ + gstrtph264pay.c \ + gstrtpj2kdepay.c \ + gstrtpj2kpay.c \ + gstrtpjpegdepay.c \ + gstrtpjpegpay.c \ + gstrtpL16depay.c \ + gstrtpL16pay.c \ + gstasteriskh263.c \ + gstrtpmp1sdepay.c \ + gstrtpmp2tdepay.c \ + gstrtpmp2tpay.c \ + gstrtpmp4vdepay.c \ + gstrtpmp4vpay.c \ + gstrtpmp4gdepay.c \ + gstrtpmp4gpay.c \ + gstrtpmp4adepay.c \ + gstrtpmp4apay.c \ + gstrtpqcelpdepay.c \ + gstrtpqdmdepay.c \ + gstrtpsirenpay.c \ + gstrtpsirendepay.c \ + gstrtpspeexdepay.c \ + gstrtpspeexpay.c \ + gstrtpsv3vdepay.c \ + gstrtptheoradepay.c \ + gstrtptheorapay.c \ + gstrtpvorbisdepay.c \ + gstrtpvorbispay.c \ + gstrtpvrawdepay.c \ + gstrtpvrawpay.c + + +if HAVE_WINSOCK2_H +WINSOCK2_LIBS = -lws2_32 +else +WINSOCK2_LIBS = +endif + +libgstrtp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstrtp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ \ + -lgstrtp-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS) \ + $(WINSOCK2_LIBS) $(LIBM) +libgstrtp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstrtp_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + fnv1hash.h \ + gstrtpchannels.h \ + gstrtpL16depay.h \ + gstrtpL16pay.h \ + gstrtpac3depay.h \ + gstrtpac3pay.h \ + gstrtpbvdepay.h \ + gstrtpbvpay.h \ + gstrtpceltpay.h \ + gstrtpceltdepay.h \ + gstrtpdvdepay.h \ + gstrtpdvpay.h \ + gstrtpamrdepay.h \ + gstrtpamrpay.h \ + gstrtpgstdepay.h \ + gstrtpgstpay.h \ + gstrtpilbcdepay.h \ + gstrtpilbcpay.h \ + gstrtppcmadepay.h \ + gstrtppcmudepay.h \ + gstrtppcmupay.h \ + gstrtppcmapay.h \ + gstrtpg722depay.h \ + gstrtpg722pay.h \ + gstrtpg723depay.h \ + gstrtpg723pay.h \ + gstrtpg726depay.h \ + gstrtpg726pay.h \ + gstrtpg729depay.h \ + gstrtpg729pay.h \ + gstrtpgsmdepay.h \ + gstrtpgsmpay.h \ + gstrtpmpadepay.h \ + gstrtpmparobustdepay.h \ + gstrtpmpapay.h \ + gstrtpmpvdepay.h \ + gstrtpmpvpay.h \ + gstrtph263pdepay.h \ + gstrtph263ppay.h \ + gstrtph263depay.h \ + gstrtph263pay.h \ + gstrtph264depay.h \ + gstrtph264pay.h \ + gstrtpj2kdepay.h \ + gstrtpj2kpay.h \ + gstrtpjpegdepay.h \ + gstrtpjpegpay.h \ + gstrtpmp1sdepay.h \ + gstrtpmp2tdepay.h \ + gstrtpmp2tpay.h \ + gstrtpmp4vdepay.h \ + gstrtpmp4vpay.h \ + gstrtpmp4gdepay.h \ + gstrtpmp4gpay.h \ + gstrtpmp4adepay.h \ + gstrtpmp4apay.h \ + gstrtpdepay.h \ + gstasteriskh263.h \ + gstrtpqcelpdepay.h \ + gstrtpqdmdepay.h \ + gstrtpsirenpay.h \ + gstrtpsirendepay.h \ + gstrtpspeexdepay.h \ + gstrtpspeexpay.h \ + gstrtpsv3vdepay.h \ + gstrtptheoradepay.h \ + gstrtptheorapay.h \ + gstrtpvorbisdepay.h \ + gstrtpvorbispay.h \ + gstrtpvrawdepay.h \ + gstrtpvrawpay.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstrtp -:SHARED libgstrtp \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstrtp_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtp_la_CFLAGS) \ + -:LDFLAGS $(libgstrtp_la_LDFLAGS) \ + $(libgstrtp_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/rtp/Makefile.in b/gst/rtp/Makefile.in new file mode 100644 index 0000000..301db36 --- /dev/null +++ b/gst/rtp/Makefile.in @@ -0,0 +1,1583 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/rtp +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in TODO +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstrtp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstrtp_la_OBJECTS = libgstrtp_la-fnv1hash.lo \ + libgstrtp_la-gstrtp.lo libgstrtp_la-gstrtpchannels.lo \ + libgstrtp_la-gstrtpdepay.lo libgstrtp_la-gstrtpac3depay.lo \ + libgstrtp_la-gstrtpac3pay.lo libgstrtp_la-gstrtpbvdepay.lo \ + libgstrtp_la-gstrtpbvpay.lo libgstrtp_la-gstrtpceltdepay.lo \ + libgstrtp_la-gstrtpceltpay.lo libgstrtp_la-gstrtpdvdepay.lo \ + libgstrtp_la-gstrtpdvpay.lo libgstrtp_la-gstrtpgstdepay.lo \ + libgstrtp_la-gstrtpgstpay.lo libgstrtp_la-gstrtpilbcdepay.lo \ + libgstrtp_la-gstrtpilbcpay.lo libgstrtp_la-gstrtpmpadepay.lo \ + libgstrtp_la-gstrtpmpapay.lo \ + libgstrtp_la-gstrtpmparobustdepay.lo \ + libgstrtp_la-gstrtpmpvdepay.lo libgstrtp_la-gstrtpmpvpay.lo \ + libgstrtp_la-gstrtppcmadepay.lo \ + libgstrtp_la-gstrtppcmudepay.lo libgstrtp_la-gstrtppcmupay.lo \ + libgstrtp_la-gstrtppcmapay.lo libgstrtp_la-gstrtpg722depay.lo \ + libgstrtp_la-gstrtpg722pay.lo libgstrtp_la-gstrtpg723depay.lo \ + libgstrtp_la-gstrtpg723pay.lo libgstrtp_la-gstrtpg726pay.lo \ + libgstrtp_la-gstrtpg726depay.lo libgstrtp_la-gstrtpg729pay.lo \ + libgstrtp_la-gstrtpg729depay.lo libgstrtp_la-gstrtpgsmdepay.lo \ + libgstrtp_la-gstrtpgsmpay.lo libgstrtp_la-gstrtpamrdepay.lo \ + libgstrtp_la-gstrtpamrpay.lo libgstrtp_la-gstrtph263pdepay.lo \ + libgstrtp_la-gstrtph263ppay.lo libgstrtp_la-gstrtph263depay.lo \ + libgstrtp_la-gstrtph263pay.lo libgstrtp_la-gstrtph264depay.lo \ + libgstrtp_la-gstrtph264pay.lo libgstrtp_la-gstrtpj2kdepay.lo \ + libgstrtp_la-gstrtpj2kpay.lo libgstrtp_la-gstrtpjpegdepay.lo \ + libgstrtp_la-gstrtpjpegpay.lo libgstrtp_la-gstrtpL16depay.lo \ + libgstrtp_la-gstrtpL16pay.lo libgstrtp_la-gstasteriskh263.lo \ + libgstrtp_la-gstrtpmp1sdepay.lo \ + libgstrtp_la-gstrtpmp2tdepay.lo libgstrtp_la-gstrtpmp2tpay.lo \ + libgstrtp_la-gstrtpmp4vdepay.lo libgstrtp_la-gstrtpmp4vpay.lo \ + libgstrtp_la-gstrtpmp4gdepay.lo libgstrtp_la-gstrtpmp4gpay.lo \ + libgstrtp_la-gstrtpmp4adepay.lo libgstrtp_la-gstrtpmp4apay.lo \ + libgstrtp_la-gstrtpqcelpdepay.lo \ + libgstrtp_la-gstrtpqdmdepay.lo libgstrtp_la-gstrtpsirenpay.lo \ + libgstrtp_la-gstrtpsirendepay.lo \ + libgstrtp_la-gstrtpspeexdepay.lo \ + libgstrtp_la-gstrtpspeexpay.lo libgstrtp_la-gstrtpsv3vdepay.lo \ + libgstrtp_la-gstrtptheoradepay.lo \ + libgstrtp_la-gstrtptheorapay.lo \ + libgstrtp_la-gstrtpvorbisdepay.lo \ + libgstrtp_la-gstrtpvorbispay.lo \ + libgstrtp_la-gstrtpvrawdepay.lo libgstrtp_la-gstrtpvrawpay.lo +libgstrtp_la_OBJECTS = $(am_libgstrtp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstrtp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstrtp_la_CFLAGS) $(CFLAGS) \ + $(libgstrtp_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstrtp_la_SOURCES) +DIST_SOURCES = $(libgstrtp_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstrtp.la +libgstrtp_la_SOURCES = \ + fnv1hash.c \ + gstrtp.c \ + gstrtpchannels.c \ + gstrtpdepay.c \ + gstrtpac3depay.c \ + gstrtpac3pay.c \ + gstrtpbvdepay.c \ + gstrtpbvpay.c \ + gstrtpceltdepay.c \ + gstrtpceltpay.c \ + gstrtpdvdepay.c \ + gstrtpdvpay.c \ + gstrtpgstdepay.c \ + gstrtpgstpay.c \ + gstrtpilbcdepay.c \ + gstrtpilbcpay.c \ + gstrtpmpadepay.c \ + gstrtpmpapay.c \ + gstrtpmparobustdepay.c \ + gstrtpmpvdepay.c \ + gstrtpmpvpay.c \ + gstrtppcmadepay.c \ + gstrtppcmudepay.c \ + gstrtppcmupay.c \ + gstrtppcmapay.c \ + gstrtpg722depay.c \ + gstrtpg722pay.c \ + gstrtpg723depay.c \ + gstrtpg723pay.c \ + gstrtpg726pay.c \ + gstrtpg726depay.c \ + gstrtpg729pay.c \ + gstrtpg729depay.c \ + gstrtpgsmdepay.c \ + gstrtpgsmpay.c \ + gstrtpamrdepay.c \ + gstrtpamrpay.c \ + gstrtph263pdepay.c \ + gstrtph263ppay.c \ + gstrtph263depay.c \ + gstrtph263pay.c \ + gstrtph264depay.c \ + gstrtph264pay.c \ + gstrtpj2kdepay.c \ + gstrtpj2kpay.c \ + gstrtpjpegdepay.c \ + gstrtpjpegpay.c \ + gstrtpL16depay.c \ + gstrtpL16pay.c \ + gstasteriskh263.c \ + gstrtpmp1sdepay.c \ + gstrtpmp2tdepay.c \ + gstrtpmp2tpay.c \ + gstrtpmp4vdepay.c \ + gstrtpmp4vpay.c \ + gstrtpmp4gdepay.c \ + gstrtpmp4gpay.c \ + gstrtpmp4adepay.c \ + gstrtpmp4apay.c \ + gstrtpqcelpdepay.c \ + gstrtpqdmdepay.c \ + gstrtpsirenpay.c \ + gstrtpsirendepay.c \ + gstrtpspeexdepay.c \ + gstrtpspeexpay.c \ + gstrtpsv3vdepay.c \ + gstrtptheoradepay.c \ + gstrtptheorapay.c \ + gstrtpvorbisdepay.c \ + gstrtpvorbispay.c \ + gstrtpvrawdepay.c \ + gstrtpvrawpay.c + +@HAVE_WINSOCK2_H_FALSE@WINSOCK2_LIBS = +@HAVE_WINSOCK2_H_TRUE@WINSOCK2_LIBS = -lws2_32 +libgstrtp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstrtp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ \ + -lgstrtp-@GST_MAJORMINOR@ \ + -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS) \ + $(WINSOCK2_LIBS) $(LIBM) + +libgstrtp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstrtp_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + fnv1hash.h \ + gstrtpchannels.h \ + gstrtpL16depay.h \ + gstrtpL16pay.h \ + gstrtpac3depay.h \ + gstrtpac3pay.h \ + gstrtpbvdepay.h \ + gstrtpbvpay.h \ + gstrtpceltpay.h \ + gstrtpceltdepay.h \ + gstrtpdvdepay.h \ + gstrtpdvpay.h \ + gstrtpamrdepay.h \ + gstrtpamrpay.h \ + gstrtpgstdepay.h \ + gstrtpgstpay.h \ + gstrtpilbcdepay.h \ + gstrtpilbcpay.h \ + gstrtppcmadepay.h \ + gstrtppcmudepay.h \ + gstrtppcmupay.h \ + gstrtppcmapay.h \ + gstrtpg722depay.h \ + gstrtpg722pay.h \ + gstrtpg723depay.h \ + gstrtpg723pay.h \ + gstrtpg726depay.h \ + gstrtpg726pay.h \ + gstrtpg729depay.h \ + gstrtpg729pay.h \ + gstrtpgsmdepay.h \ + gstrtpgsmpay.h \ + gstrtpmpadepay.h \ + gstrtpmparobustdepay.h \ + gstrtpmpapay.h \ + gstrtpmpvdepay.h \ + gstrtpmpvpay.h \ + gstrtph263pdepay.h \ + gstrtph263ppay.h \ + gstrtph263depay.h \ + gstrtph263pay.h \ + gstrtph264depay.h \ + gstrtph264pay.h \ + gstrtpj2kdepay.h \ + gstrtpj2kpay.h \ + gstrtpjpegdepay.h \ + gstrtpjpegpay.h \ + gstrtpmp1sdepay.h \ + gstrtpmp2tdepay.h \ + gstrtpmp2tpay.h \ + gstrtpmp4vdepay.h \ + gstrtpmp4vpay.h \ + gstrtpmp4gdepay.h \ + gstrtpmp4gpay.h \ + gstrtpmp4adepay.h \ + gstrtpmp4apay.h \ + gstrtpdepay.h \ + gstasteriskh263.h \ + gstrtpqcelpdepay.h \ + gstrtpqdmdepay.h \ + gstrtpsirenpay.h \ + gstrtpsirendepay.h \ + gstrtpspeexdepay.h \ + gstrtpspeexpay.h \ + gstrtpsv3vdepay.h \ + gstrtptheoradepay.h \ + gstrtptheorapay.h \ + gstrtpvorbisdepay.h \ + gstrtpvorbispay.h \ + gstrtpvrawdepay.h \ + gstrtpvrawpay.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/rtp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/rtp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstrtp.la: $(libgstrtp_la_OBJECTS) $(libgstrtp_la_DEPENDENCIES) $(EXTRA_libgstrtp_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstrtp_la_LINK) -rpath $(plugindir) $(libgstrtp_la_OBJECTS) $(libgstrtp_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-fnv1hash.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstasteriskh263.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpL16depay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpL16pay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpac3depay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpac3pay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpamrdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpamrpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpbvdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpbvpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpceltdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpceltpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpchannels.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpdvdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpdvpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg722depay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg722pay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg723depay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg723pay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg726depay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg726pay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg729depay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg729pay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpgsmdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpgsmpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpgstdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpgstpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph263depay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph263pay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph263pdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph263ppay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph264depay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph264pay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpilbcdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpilbcpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpj2kdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpj2kpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpjpegdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpjpegpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp1sdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp2tdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp2tpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4adepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4apay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4gdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4gpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4vdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4vpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmpadepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmpapay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmparobustdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmpvdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmpvpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtppcmadepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtppcmapay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtppcmudepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtppcmupay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpqcelpdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpqdmdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpsirendepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpsirenpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpspeexdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpspeexpay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpsv3vdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtptheoradepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtptheorapay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpvorbisdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpvorbispay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpvrawdepay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpvrawpay.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstrtp_la-fnv1hash.lo: fnv1hash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-fnv1hash.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-fnv1hash.Tpo -c -o libgstrtp_la-fnv1hash.lo `test -f 'fnv1hash.c' || echo '$(srcdir)/'`fnv1hash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-fnv1hash.Tpo $(DEPDIR)/libgstrtp_la-fnv1hash.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fnv1hash.c' object='libgstrtp_la-fnv1hash.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-fnv1hash.lo `test -f 'fnv1hash.c' || echo '$(srcdir)/'`fnv1hash.c + +libgstrtp_la-gstrtp.lo: gstrtp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtp.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtp.Tpo -c -o libgstrtp_la-gstrtp.lo `test -f 'gstrtp.c' || echo '$(srcdir)/'`gstrtp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtp.Tpo $(DEPDIR)/libgstrtp_la-gstrtp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtp.c' object='libgstrtp_la-gstrtp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtp.lo `test -f 'gstrtp.c' || echo '$(srcdir)/'`gstrtp.c + +libgstrtp_la-gstrtpchannels.lo: gstrtpchannels.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpchannels.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpchannels.Tpo -c -o libgstrtp_la-gstrtpchannels.lo `test -f 'gstrtpchannels.c' || echo '$(srcdir)/'`gstrtpchannels.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpchannels.Tpo $(DEPDIR)/libgstrtp_la-gstrtpchannels.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpchannels.c' object='libgstrtp_la-gstrtpchannels.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpchannels.lo `test -f 'gstrtpchannels.c' || echo '$(srcdir)/'`gstrtpchannels.c + +libgstrtp_la-gstrtpdepay.lo: gstrtpdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpdepay.Tpo -c -o libgstrtp_la-gstrtpdepay.lo `test -f 'gstrtpdepay.c' || echo '$(srcdir)/'`gstrtpdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpdepay.c' object='libgstrtp_la-gstrtpdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpdepay.lo `test -f 'gstrtpdepay.c' || echo '$(srcdir)/'`gstrtpdepay.c + +libgstrtp_la-gstrtpac3depay.lo: gstrtpac3depay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpac3depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpac3depay.Tpo -c -o libgstrtp_la-gstrtpac3depay.lo `test -f 'gstrtpac3depay.c' || echo '$(srcdir)/'`gstrtpac3depay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpac3depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpac3depay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpac3depay.c' object='libgstrtp_la-gstrtpac3depay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpac3depay.lo `test -f 'gstrtpac3depay.c' || echo '$(srcdir)/'`gstrtpac3depay.c + +libgstrtp_la-gstrtpac3pay.lo: gstrtpac3pay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpac3pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpac3pay.Tpo -c -o libgstrtp_la-gstrtpac3pay.lo `test -f 'gstrtpac3pay.c' || echo '$(srcdir)/'`gstrtpac3pay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpac3pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpac3pay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpac3pay.c' object='libgstrtp_la-gstrtpac3pay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpac3pay.lo `test -f 'gstrtpac3pay.c' || echo '$(srcdir)/'`gstrtpac3pay.c + +libgstrtp_la-gstrtpbvdepay.lo: gstrtpbvdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpbvdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpbvdepay.Tpo -c -o libgstrtp_la-gstrtpbvdepay.lo `test -f 'gstrtpbvdepay.c' || echo '$(srcdir)/'`gstrtpbvdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpbvdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpbvdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpbvdepay.c' object='libgstrtp_la-gstrtpbvdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpbvdepay.lo `test -f 'gstrtpbvdepay.c' || echo '$(srcdir)/'`gstrtpbvdepay.c + +libgstrtp_la-gstrtpbvpay.lo: gstrtpbvpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpbvpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpbvpay.Tpo -c -o libgstrtp_la-gstrtpbvpay.lo `test -f 'gstrtpbvpay.c' || echo '$(srcdir)/'`gstrtpbvpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpbvpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpbvpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpbvpay.c' object='libgstrtp_la-gstrtpbvpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpbvpay.lo `test -f 'gstrtpbvpay.c' || echo '$(srcdir)/'`gstrtpbvpay.c + +libgstrtp_la-gstrtpceltdepay.lo: gstrtpceltdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpceltdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpceltdepay.Tpo -c -o libgstrtp_la-gstrtpceltdepay.lo `test -f 'gstrtpceltdepay.c' || echo '$(srcdir)/'`gstrtpceltdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpceltdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpceltdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpceltdepay.c' object='libgstrtp_la-gstrtpceltdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpceltdepay.lo `test -f 'gstrtpceltdepay.c' || echo '$(srcdir)/'`gstrtpceltdepay.c + +libgstrtp_la-gstrtpceltpay.lo: gstrtpceltpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpceltpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpceltpay.Tpo -c -o libgstrtp_la-gstrtpceltpay.lo `test -f 'gstrtpceltpay.c' || echo '$(srcdir)/'`gstrtpceltpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpceltpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpceltpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpceltpay.c' object='libgstrtp_la-gstrtpceltpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpceltpay.lo `test -f 'gstrtpceltpay.c' || echo '$(srcdir)/'`gstrtpceltpay.c + +libgstrtp_la-gstrtpdvdepay.lo: gstrtpdvdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpdvdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpdvdepay.Tpo -c -o libgstrtp_la-gstrtpdvdepay.lo `test -f 'gstrtpdvdepay.c' || echo '$(srcdir)/'`gstrtpdvdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpdvdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpdvdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpdvdepay.c' object='libgstrtp_la-gstrtpdvdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpdvdepay.lo `test -f 'gstrtpdvdepay.c' || echo '$(srcdir)/'`gstrtpdvdepay.c + +libgstrtp_la-gstrtpdvpay.lo: gstrtpdvpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpdvpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpdvpay.Tpo -c -o libgstrtp_la-gstrtpdvpay.lo `test -f 'gstrtpdvpay.c' || echo '$(srcdir)/'`gstrtpdvpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpdvpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpdvpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpdvpay.c' object='libgstrtp_la-gstrtpdvpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpdvpay.lo `test -f 'gstrtpdvpay.c' || echo '$(srcdir)/'`gstrtpdvpay.c + +libgstrtp_la-gstrtpgstdepay.lo: gstrtpgstdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpgstdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpgstdepay.Tpo -c -o libgstrtp_la-gstrtpgstdepay.lo `test -f 'gstrtpgstdepay.c' || echo '$(srcdir)/'`gstrtpgstdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpgstdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpgstdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpgstdepay.c' object='libgstrtp_la-gstrtpgstdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpgstdepay.lo `test -f 'gstrtpgstdepay.c' || echo '$(srcdir)/'`gstrtpgstdepay.c + +libgstrtp_la-gstrtpgstpay.lo: gstrtpgstpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpgstpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpgstpay.Tpo -c -o libgstrtp_la-gstrtpgstpay.lo `test -f 'gstrtpgstpay.c' || echo '$(srcdir)/'`gstrtpgstpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpgstpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpgstpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpgstpay.c' object='libgstrtp_la-gstrtpgstpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpgstpay.lo `test -f 'gstrtpgstpay.c' || echo '$(srcdir)/'`gstrtpgstpay.c + +libgstrtp_la-gstrtpilbcdepay.lo: gstrtpilbcdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpilbcdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpilbcdepay.Tpo -c -o libgstrtp_la-gstrtpilbcdepay.lo `test -f 'gstrtpilbcdepay.c' || echo '$(srcdir)/'`gstrtpilbcdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpilbcdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpilbcdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpilbcdepay.c' object='libgstrtp_la-gstrtpilbcdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpilbcdepay.lo `test -f 'gstrtpilbcdepay.c' || echo '$(srcdir)/'`gstrtpilbcdepay.c + +libgstrtp_la-gstrtpilbcpay.lo: gstrtpilbcpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpilbcpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpilbcpay.Tpo -c -o libgstrtp_la-gstrtpilbcpay.lo `test -f 'gstrtpilbcpay.c' || echo '$(srcdir)/'`gstrtpilbcpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpilbcpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpilbcpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpilbcpay.c' object='libgstrtp_la-gstrtpilbcpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpilbcpay.lo `test -f 'gstrtpilbcpay.c' || echo '$(srcdir)/'`gstrtpilbcpay.c + +libgstrtp_la-gstrtpmpadepay.lo: gstrtpmpadepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmpadepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmpadepay.Tpo -c -o libgstrtp_la-gstrtpmpadepay.lo `test -f 'gstrtpmpadepay.c' || echo '$(srcdir)/'`gstrtpmpadepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmpadepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmpadepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmpadepay.c' object='libgstrtp_la-gstrtpmpadepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmpadepay.lo `test -f 'gstrtpmpadepay.c' || echo '$(srcdir)/'`gstrtpmpadepay.c + +libgstrtp_la-gstrtpmpapay.lo: gstrtpmpapay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmpapay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmpapay.Tpo -c -o libgstrtp_la-gstrtpmpapay.lo `test -f 'gstrtpmpapay.c' || echo '$(srcdir)/'`gstrtpmpapay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmpapay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmpapay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmpapay.c' object='libgstrtp_la-gstrtpmpapay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmpapay.lo `test -f 'gstrtpmpapay.c' || echo '$(srcdir)/'`gstrtpmpapay.c + +libgstrtp_la-gstrtpmparobustdepay.lo: gstrtpmparobustdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmparobustdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmparobustdepay.Tpo -c -o libgstrtp_la-gstrtpmparobustdepay.lo `test -f 'gstrtpmparobustdepay.c' || echo '$(srcdir)/'`gstrtpmparobustdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmparobustdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmparobustdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmparobustdepay.c' object='libgstrtp_la-gstrtpmparobustdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmparobustdepay.lo `test -f 'gstrtpmparobustdepay.c' || echo '$(srcdir)/'`gstrtpmparobustdepay.c + +libgstrtp_la-gstrtpmpvdepay.lo: gstrtpmpvdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmpvdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmpvdepay.Tpo -c -o libgstrtp_la-gstrtpmpvdepay.lo `test -f 'gstrtpmpvdepay.c' || echo '$(srcdir)/'`gstrtpmpvdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmpvdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmpvdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmpvdepay.c' object='libgstrtp_la-gstrtpmpvdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmpvdepay.lo `test -f 'gstrtpmpvdepay.c' || echo '$(srcdir)/'`gstrtpmpvdepay.c + +libgstrtp_la-gstrtpmpvpay.lo: gstrtpmpvpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmpvpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmpvpay.Tpo -c -o libgstrtp_la-gstrtpmpvpay.lo `test -f 'gstrtpmpvpay.c' || echo '$(srcdir)/'`gstrtpmpvpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmpvpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmpvpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmpvpay.c' object='libgstrtp_la-gstrtpmpvpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmpvpay.lo `test -f 'gstrtpmpvpay.c' || echo '$(srcdir)/'`gstrtpmpvpay.c + +libgstrtp_la-gstrtppcmadepay.lo: gstrtppcmadepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtppcmadepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtppcmadepay.Tpo -c -o libgstrtp_la-gstrtppcmadepay.lo `test -f 'gstrtppcmadepay.c' || echo '$(srcdir)/'`gstrtppcmadepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtppcmadepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtppcmadepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtppcmadepay.c' object='libgstrtp_la-gstrtppcmadepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtppcmadepay.lo `test -f 'gstrtppcmadepay.c' || echo '$(srcdir)/'`gstrtppcmadepay.c + +libgstrtp_la-gstrtppcmudepay.lo: gstrtppcmudepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtppcmudepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtppcmudepay.Tpo -c -o libgstrtp_la-gstrtppcmudepay.lo `test -f 'gstrtppcmudepay.c' || echo '$(srcdir)/'`gstrtppcmudepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtppcmudepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtppcmudepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtppcmudepay.c' object='libgstrtp_la-gstrtppcmudepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtppcmudepay.lo `test -f 'gstrtppcmudepay.c' || echo '$(srcdir)/'`gstrtppcmudepay.c + +libgstrtp_la-gstrtppcmupay.lo: gstrtppcmupay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtppcmupay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtppcmupay.Tpo -c -o libgstrtp_la-gstrtppcmupay.lo `test -f 'gstrtppcmupay.c' || echo '$(srcdir)/'`gstrtppcmupay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtppcmupay.Tpo $(DEPDIR)/libgstrtp_la-gstrtppcmupay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtppcmupay.c' object='libgstrtp_la-gstrtppcmupay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtppcmupay.lo `test -f 'gstrtppcmupay.c' || echo '$(srcdir)/'`gstrtppcmupay.c + +libgstrtp_la-gstrtppcmapay.lo: gstrtppcmapay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtppcmapay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtppcmapay.Tpo -c -o libgstrtp_la-gstrtppcmapay.lo `test -f 'gstrtppcmapay.c' || echo '$(srcdir)/'`gstrtppcmapay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtppcmapay.Tpo $(DEPDIR)/libgstrtp_la-gstrtppcmapay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtppcmapay.c' object='libgstrtp_la-gstrtppcmapay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtppcmapay.lo `test -f 'gstrtppcmapay.c' || echo '$(srcdir)/'`gstrtppcmapay.c + +libgstrtp_la-gstrtpg722depay.lo: gstrtpg722depay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg722depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg722depay.Tpo -c -o libgstrtp_la-gstrtpg722depay.lo `test -f 'gstrtpg722depay.c' || echo '$(srcdir)/'`gstrtpg722depay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg722depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg722depay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg722depay.c' object='libgstrtp_la-gstrtpg722depay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg722depay.lo `test -f 'gstrtpg722depay.c' || echo '$(srcdir)/'`gstrtpg722depay.c + +libgstrtp_la-gstrtpg722pay.lo: gstrtpg722pay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg722pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg722pay.Tpo -c -o libgstrtp_la-gstrtpg722pay.lo `test -f 'gstrtpg722pay.c' || echo '$(srcdir)/'`gstrtpg722pay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg722pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg722pay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg722pay.c' object='libgstrtp_la-gstrtpg722pay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg722pay.lo `test -f 'gstrtpg722pay.c' || echo '$(srcdir)/'`gstrtpg722pay.c + +libgstrtp_la-gstrtpg723depay.lo: gstrtpg723depay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg723depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg723depay.Tpo -c -o libgstrtp_la-gstrtpg723depay.lo `test -f 'gstrtpg723depay.c' || echo '$(srcdir)/'`gstrtpg723depay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg723depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg723depay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg723depay.c' object='libgstrtp_la-gstrtpg723depay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg723depay.lo `test -f 'gstrtpg723depay.c' || echo '$(srcdir)/'`gstrtpg723depay.c + +libgstrtp_la-gstrtpg723pay.lo: gstrtpg723pay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg723pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg723pay.Tpo -c -o libgstrtp_la-gstrtpg723pay.lo `test -f 'gstrtpg723pay.c' || echo '$(srcdir)/'`gstrtpg723pay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg723pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg723pay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg723pay.c' object='libgstrtp_la-gstrtpg723pay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg723pay.lo `test -f 'gstrtpg723pay.c' || echo '$(srcdir)/'`gstrtpg723pay.c + +libgstrtp_la-gstrtpg726pay.lo: gstrtpg726pay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg726pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg726pay.Tpo -c -o libgstrtp_la-gstrtpg726pay.lo `test -f 'gstrtpg726pay.c' || echo '$(srcdir)/'`gstrtpg726pay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg726pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg726pay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg726pay.c' object='libgstrtp_la-gstrtpg726pay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg726pay.lo `test -f 'gstrtpg726pay.c' || echo '$(srcdir)/'`gstrtpg726pay.c + +libgstrtp_la-gstrtpg726depay.lo: gstrtpg726depay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg726depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg726depay.Tpo -c -o libgstrtp_la-gstrtpg726depay.lo `test -f 'gstrtpg726depay.c' || echo '$(srcdir)/'`gstrtpg726depay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg726depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg726depay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg726depay.c' object='libgstrtp_la-gstrtpg726depay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg726depay.lo `test -f 'gstrtpg726depay.c' || echo '$(srcdir)/'`gstrtpg726depay.c + +libgstrtp_la-gstrtpg729pay.lo: gstrtpg729pay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg729pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg729pay.Tpo -c -o libgstrtp_la-gstrtpg729pay.lo `test -f 'gstrtpg729pay.c' || echo '$(srcdir)/'`gstrtpg729pay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg729pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg729pay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg729pay.c' object='libgstrtp_la-gstrtpg729pay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg729pay.lo `test -f 'gstrtpg729pay.c' || echo '$(srcdir)/'`gstrtpg729pay.c + +libgstrtp_la-gstrtpg729depay.lo: gstrtpg729depay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg729depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg729depay.Tpo -c -o libgstrtp_la-gstrtpg729depay.lo `test -f 'gstrtpg729depay.c' || echo '$(srcdir)/'`gstrtpg729depay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg729depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg729depay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg729depay.c' object='libgstrtp_la-gstrtpg729depay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg729depay.lo `test -f 'gstrtpg729depay.c' || echo '$(srcdir)/'`gstrtpg729depay.c + +libgstrtp_la-gstrtpgsmdepay.lo: gstrtpgsmdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpgsmdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpgsmdepay.Tpo -c -o libgstrtp_la-gstrtpgsmdepay.lo `test -f 'gstrtpgsmdepay.c' || echo '$(srcdir)/'`gstrtpgsmdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpgsmdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpgsmdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpgsmdepay.c' object='libgstrtp_la-gstrtpgsmdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpgsmdepay.lo `test -f 'gstrtpgsmdepay.c' || echo '$(srcdir)/'`gstrtpgsmdepay.c + +libgstrtp_la-gstrtpgsmpay.lo: gstrtpgsmpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpgsmpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpgsmpay.Tpo -c -o libgstrtp_la-gstrtpgsmpay.lo `test -f 'gstrtpgsmpay.c' || echo '$(srcdir)/'`gstrtpgsmpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpgsmpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpgsmpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpgsmpay.c' object='libgstrtp_la-gstrtpgsmpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpgsmpay.lo `test -f 'gstrtpgsmpay.c' || echo '$(srcdir)/'`gstrtpgsmpay.c + +libgstrtp_la-gstrtpamrdepay.lo: gstrtpamrdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpamrdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpamrdepay.Tpo -c -o libgstrtp_la-gstrtpamrdepay.lo `test -f 'gstrtpamrdepay.c' || echo '$(srcdir)/'`gstrtpamrdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpamrdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpamrdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpamrdepay.c' object='libgstrtp_la-gstrtpamrdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpamrdepay.lo `test -f 'gstrtpamrdepay.c' || echo '$(srcdir)/'`gstrtpamrdepay.c + +libgstrtp_la-gstrtpamrpay.lo: gstrtpamrpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpamrpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpamrpay.Tpo -c -o libgstrtp_la-gstrtpamrpay.lo `test -f 'gstrtpamrpay.c' || echo '$(srcdir)/'`gstrtpamrpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpamrpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpamrpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpamrpay.c' object='libgstrtp_la-gstrtpamrpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpamrpay.lo `test -f 'gstrtpamrpay.c' || echo '$(srcdir)/'`gstrtpamrpay.c + +libgstrtp_la-gstrtph263pdepay.lo: gstrtph263pdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph263pdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph263pdepay.Tpo -c -o libgstrtp_la-gstrtph263pdepay.lo `test -f 'gstrtph263pdepay.c' || echo '$(srcdir)/'`gstrtph263pdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph263pdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph263pdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph263pdepay.c' object='libgstrtp_la-gstrtph263pdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph263pdepay.lo `test -f 'gstrtph263pdepay.c' || echo '$(srcdir)/'`gstrtph263pdepay.c + +libgstrtp_la-gstrtph263ppay.lo: gstrtph263ppay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph263ppay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph263ppay.Tpo -c -o libgstrtp_la-gstrtph263ppay.lo `test -f 'gstrtph263ppay.c' || echo '$(srcdir)/'`gstrtph263ppay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph263ppay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph263ppay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph263ppay.c' object='libgstrtp_la-gstrtph263ppay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph263ppay.lo `test -f 'gstrtph263ppay.c' || echo '$(srcdir)/'`gstrtph263ppay.c + +libgstrtp_la-gstrtph263depay.lo: gstrtph263depay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph263depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph263depay.Tpo -c -o libgstrtp_la-gstrtph263depay.lo `test -f 'gstrtph263depay.c' || echo '$(srcdir)/'`gstrtph263depay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph263depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph263depay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph263depay.c' object='libgstrtp_la-gstrtph263depay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph263depay.lo `test -f 'gstrtph263depay.c' || echo '$(srcdir)/'`gstrtph263depay.c + +libgstrtp_la-gstrtph263pay.lo: gstrtph263pay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph263pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph263pay.Tpo -c -o libgstrtp_la-gstrtph263pay.lo `test -f 'gstrtph263pay.c' || echo '$(srcdir)/'`gstrtph263pay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph263pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph263pay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph263pay.c' object='libgstrtp_la-gstrtph263pay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph263pay.lo `test -f 'gstrtph263pay.c' || echo '$(srcdir)/'`gstrtph263pay.c + +libgstrtp_la-gstrtph264depay.lo: gstrtph264depay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph264depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph264depay.Tpo -c -o libgstrtp_la-gstrtph264depay.lo `test -f 'gstrtph264depay.c' || echo '$(srcdir)/'`gstrtph264depay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph264depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph264depay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph264depay.c' object='libgstrtp_la-gstrtph264depay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph264depay.lo `test -f 'gstrtph264depay.c' || echo '$(srcdir)/'`gstrtph264depay.c + +libgstrtp_la-gstrtph264pay.lo: gstrtph264pay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph264pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph264pay.Tpo -c -o libgstrtp_la-gstrtph264pay.lo `test -f 'gstrtph264pay.c' || echo '$(srcdir)/'`gstrtph264pay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph264pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph264pay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph264pay.c' object='libgstrtp_la-gstrtph264pay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph264pay.lo `test -f 'gstrtph264pay.c' || echo '$(srcdir)/'`gstrtph264pay.c + +libgstrtp_la-gstrtpj2kdepay.lo: gstrtpj2kdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpj2kdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpj2kdepay.Tpo -c -o libgstrtp_la-gstrtpj2kdepay.lo `test -f 'gstrtpj2kdepay.c' || echo '$(srcdir)/'`gstrtpj2kdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpj2kdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpj2kdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpj2kdepay.c' object='libgstrtp_la-gstrtpj2kdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpj2kdepay.lo `test -f 'gstrtpj2kdepay.c' || echo '$(srcdir)/'`gstrtpj2kdepay.c + +libgstrtp_la-gstrtpj2kpay.lo: gstrtpj2kpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpj2kpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpj2kpay.Tpo -c -o libgstrtp_la-gstrtpj2kpay.lo `test -f 'gstrtpj2kpay.c' || echo '$(srcdir)/'`gstrtpj2kpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpj2kpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpj2kpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpj2kpay.c' object='libgstrtp_la-gstrtpj2kpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpj2kpay.lo `test -f 'gstrtpj2kpay.c' || echo '$(srcdir)/'`gstrtpj2kpay.c + +libgstrtp_la-gstrtpjpegdepay.lo: gstrtpjpegdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpjpegdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpjpegdepay.Tpo -c -o libgstrtp_la-gstrtpjpegdepay.lo `test -f 'gstrtpjpegdepay.c' || echo '$(srcdir)/'`gstrtpjpegdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpjpegdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpjpegdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpjpegdepay.c' object='libgstrtp_la-gstrtpjpegdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpjpegdepay.lo `test -f 'gstrtpjpegdepay.c' || echo '$(srcdir)/'`gstrtpjpegdepay.c + +libgstrtp_la-gstrtpjpegpay.lo: gstrtpjpegpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpjpegpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpjpegpay.Tpo -c -o libgstrtp_la-gstrtpjpegpay.lo `test -f 'gstrtpjpegpay.c' || echo '$(srcdir)/'`gstrtpjpegpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpjpegpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpjpegpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpjpegpay.c' object='libgstrtp_la-gstrtpjpegpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpjpegpay.lo `test -f 'gstrtpjpegpay.c' || echo '$(srcdir)/'`gstrtpjpegpay.c + +libgstrtp_la-gstrtpL16depay.lo: gstrtpL16depay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpL16depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpL16depay.Tpo -c -o libgstrtp_la-gstrtpL16depay.lo `test -f 'gstrtpL16depay.c' || echo '$(srcdir)/'`gstrtpL16depay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpL16depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpL16depay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpL16depay.c' object='libgstrtp_la-gstrtpL16depay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpL16depay.lo `test -f 'gstrtpL16depay.c' || echo '$(srcdir)/'`gstrtpL16depay.c + +libgstrtp_la-gstrtpL16pay.lo: gstrtpL16pay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpL16pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpL16pay.Tpo -c -o libgstrtp_la-gstrtpL16pay.lo `test -f 'gstrtpL16pay.c' || echo '$(srcdir)/'`gstrtpL16pay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpL16pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpL16pay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpL16pay.c' object='libgstrtp_la-gstrtpL16pay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpL16pay.lo `test -f 'gstrtpL16pay.c' || echo '$(srcdir)/'`gstrtpL16pay.c + +libgstrtp_la-gstasteriskh263.lo: gstasteriskh263.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstasteriskh263.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstasteriskh263.Tpo -c -o libgstrtp_la-gstasteriskh263.lo `test -f 'gstasteriskh263.c' || echo '$(srcdir)/'`gstasteriskh263.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstasteriskh263.Tpo $(DEPDIR)/libgstrtp_la-gstasteriskh263.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstasteriskh263.c' object='libgstrtp_la-gstasteriskh263.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstasteriskh263.lo `test -f 'gstasteriskh263.c' || echo '$(srcdir)/'`gstasteriskh263.c + +libgstrtp_la-gstrtpmp1sdepay.lo: gstrtpmp1sdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp1sdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp1sdepay.Tpo -c -o libgstrtp_la-gstrtpmp1sdepay.lo `test -f 'gstrtpmp1sdepay.c' || echo '$(srcdir)/'`gstrtpmp1sdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp1sdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp1sdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp1sdepay.c' object='libgstrtp_la-gstrtpmp1sdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp1sdepay.lo `test -f 'gstrtpmp1sdepay.c' || echo '$(srcdir)/'`gstrtpmp1sdepay.c + +libgstrtp_la-gstrtpmp2tdepay.lo: gstrtpmp2tdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp2tdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp2tdepay.Tpo -c -o libgstrtp_la-gstrtpmp2tdepay.lo `test -f 'gstrtpmp2tdepay.c' || echo '$(srcdir)/'`gstrtpmp2tdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp2tdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp2tdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp2tdepay.c' object='libgstrtp_la-gstrtpmp2tdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp2tdepay.lo `test -f 'gstrtpmp2tdepay.c' || echo '$(srcdir)/'`gstrtpmp2tdepay.c + +libgstrtp_la-gstrtpmp2tpay.lo: gstrtpmp2tpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp2tpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp2tpay.Tpo -c -o libgstrtp_la-gstrtpmp2tpay.lo `test -f 'gstrtpmp2tpay.c' || echo '$(srcdir)/'`gstrtpmp2tpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp2tpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp2tpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp2tpay.c' object='libgstrtp_la-gstrtpmp2tpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp2tpay.lo `test -f 'gstrtpmp2tpay.c' || echo '$(srcdir)/'`gstrtpmp2tpay.c + +libgstrtp_la-gstrtpmp4vdepay.lo: gstrtpmp4vdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4vdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4vdepay.Tpo -c -o libgstrtp_la-gstrtpmp4vdepay.lo `test -f 'gstrtpmp4vdepay.c' || echo '$(srcdir)/'`gstrtpmp4vdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4vdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4vdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4vdepay.c' object='libgstrtp_la-gstrtpmp4vdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4vdepay.lo `test -f 'gstrtpmp4vdepay.c' || echo '$(srcdir)/'`gstrtpmp4vdepay.c + +libgstrtp_la-gstrtpmp4vpay.lo: gstrtpmp4vpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4vpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4vpay.Tpo -c -o libgstrtp_la-gstrtpmp4vpay.lo `test -f 'gstrtpmp4vpay.c' || echo '$(srcdir)/'`gstrtpmp4vpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4vpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4vpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4vpay.c' object='libgstrtp_la-gstrtpmp4vpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4vpay.lo `test -f 'gstrtpmp4vpay.c' || echo '$(srcdir)/'`gstrtpmp4vpay.c + +libgstrtp_la-gstrtpmp4gdepay.lo: gstrtpmp4gdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4gdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4gdepay.Tpo -c -o libgstrtp_la-gstrtpmp4gdepay.lo `test -f 'gstrtpmp4gdepay.c' || echo '$(srcdir)/'`gstrtpmp4gdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4gdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4gdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4gdepay.c' object='libgstrtp_la-gstrtpmp4gdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4gdepay.lo `test -f 'gstrtpmp4gdepay.c' || echo '$(srcdir)/'`gstrtpmp4gdepay.c + +libgstrtp_la-gstrtpmp4gpay.lo: gstrtpmp4gpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4gpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4gpay.Tpo -c -o libgstrtp_la-gstrtpmp4gpay.lo `test -f 'gstrtpmp4gpay.c' || echo '$(srcdir)/'`gstrtpmp4gpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4gpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4gpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4gpay.c' object='libgstrtp_la-gstrtpmp4gpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4gpay.lo `test -f 'gstrtpmp4gpay.c' || echo '$(srcdir)/'`gstrtpmp4gpay.c + +libgstrtp_la-gstrtpmp4adepay.lo: gstrtpmp4adepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4adepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4adepay.Tpo -c -o libgstrtp_la-gstrtpmp4adepay.lo `test -f 'gstrtpmp4adepay.c' || echo '$(srcdir)/'`gstrtpmp4adepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4adepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4adepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4adepay.c' object='libgstrtp_la-gstrtpmp4adepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4adepay.lo `test -f 'gstrtpmp4adepay.c' || echo '$(srcdir)/'`gstrtpmp4adepay.c + +libgstrtp_la-gstrtpmp4apay.lo: gstrtpmp4apay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4apay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4apay.Tpo -c -o libgstrtp_la-gstrtpmp4apay.lo `test -f 'gstrtpmp4apay.c' || echo '$(srcdir)/'`gstrtpmp4apay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4apay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4apay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4apay.c' object='libgstrtp_la-gstrtpmp4apay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4apay.lo `test -f 'gstrtpmp4apay.c' || echo '$(srcdir)/'`gstrtpmp4apay.c + +libgstrtp_la-gstrtpqcelpdepay.lo: gstrtpqcelpdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpqcelpdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpqcelpdepay.Tpo -c -o libgstrtp_la-gstrtpqcelpdepay.lo `test -f 'gstrtpqcelpdepay.c' || echo '$(srcdir)/'`gstrtpqcelpdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpqcelpdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpqcelpdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpqcelpdepay.c' object='libgstrtp_la-gstrtpqcelpdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpqcelpdepay.lo `test -f 'gstrtpqcelpdepay.c' || echo '$(srcdir)/'`gstrtpqcelpdepay.c + +libgstrtp_la-gstrtpqdmdepay.lo: gstrtpqdmdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpqdmdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpqdmdepay.Tpo -c -o libgstrtp_la-gstrtpqdmdepay.lo `test -f 'gstrtpqdmdepay.c' || echo '$(srcdir)/'`gstrtpqdmdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpqdmdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpqdmdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpqdmdepay.c' object='libgstrtp_la-gstrtpqdmdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpqdmdepay.lo `test -f 'gstrtpqdmdepay.c' || echo '$(srcdir)/'`gstrtpqdmdepay.c + +libgstrtp_la-gstrtpsirenpay.lo: gstrtpsirenpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpsirenpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpsirenpay.Tpo -c -o libgstrtp_la-gstrtpsirenpay.lo `test -f 'gstrtpsirenpay.c' || echo '$(srcdir)/'`gstrtpsirenpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpsirenpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpsirenpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpsirenpay.c' object='libgstrtp_la-gstrtpsirenpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpsirenpay.lo `test -f 'gstrtpsirenpay.c' || echo '$(srcdir)/'`gstrtpsirenpay.c + +libgstrtp_la-gstrtpsirendepay.lo: gstrtpsirendepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpsirendepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpsirendepay.Tpo -c -o libgstrtp_la-gstrtpsirendepay.lo `test -f 'gstrtpsirendepay.c' || echo '$(srcdir)/'`gstrtpsirendepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpsirendepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpsirendepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpsirendepay.c' object='libgstrtp_la-gstrtpsirendepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpsirendepay.lo `test -f 'gstrtpsirendepay.c' || echo '$(srcdir)/'`gstrtpsirendepay.c + +libgstrtp_la-gstrtpspeexdepay.lo: gstrtpspeexdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpspeexdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpspeexdepay.Tpo -c -o libgstrtp_la-gstrtpspeexdepay.lo `test -f 'gstrtpspeexdepay.c' || echo '$(srcdir)/'`gstrtpspeexdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpspeexdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpspeexdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpspeexdepay.c' object='libgstrtp_la-gstrtpspeexdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpspeexdepay.lo `test -f 'gstrtpspeexdepay.c' || echo '$(srcdir)/'`gstrtpspeexdepay.c + +libgstrtp_la-gstrtpspeexpay.lo: gstrtpspeexpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpspeexpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpspeexpay.Tpo -c -o libgstrtp_la-gstrtpspeexpay.lo `test -f 'gstrtpspeexpay.c' || echo '$(srcdir)/'`gstrtpspeexpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpspeexpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpspeexpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpspeexpay.c' object='libgstrtp_la-gstrtpspeexpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpspeexpay.lo `test -f 'gstrtpspeexpay.c' || echo '$(srcdir)/'`gstrtpspeexpay.c + +libgstrtp_la-gstrtpsv3vdepay.lo: gstrtpsv3vdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpsv3vdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpsv3vdepay.Tpo -c -o libgstrtp_la-gstrtpsv3vdepay.lo `test -f 'gstrtpsv3vdepay.c' || echo '$(srcdir)/'`gstrtpsv3vdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpsv3vdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpsv3vdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpsv3vdepay.c' object='libgstrtp_la-gstrtpsv3vdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpsv3vdepay.lo `test -f 'gstrtpsv3vdepay.c' || echo '$(srcdir)/'`gstrtpsv3vdepay.c + +libgstrtp_la-gstrtptheoradepay.lo: gstrtptheoradepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtptheoradepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtptheoradepay.Tpo -c -o libgstrtp_la-gstrtptheoradepay.lo `test -f 'gstrtptheoradepay.c' || echo '$(srcdir)/'`gstrtptheoradepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtptheoradepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtptheoradepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtptheoradepay.c' object='libgstrtp_la-gstrtptheoradepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtptheoradepay.lo `test -f 'gstrtptheoradepay.c' || echo '$(srcdir)/'`gstrtptheoradepay.c + +libgstrtp_la-gstrtptheorapay.lo: gstrtptheorapay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtptheorapay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtptheorapay.Tpo -c -o libgstrtp_la-gstrtptheorapay.lo `test -f 'gstrtptheorapay.c' || echo '$(srcdir)/'`gstrtptheorapay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtptheorapay.Tpo $(DEPDIR)/libgstrtp_la-gstrtptheorapay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtptheorapay.c' object='libgstrtp_la-gstrtptheorapay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtptheorapay.lo `test -f 'gstrtptheorapay.c' || echo '$(srcdir)/'`gstrtptheorapay.c + +libgstrtp_la-gstrtpvorbisdepay.lo: gstrtpvorbisdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpvorbisdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpvorbisdepay.Tpo -c -o libgstrtp_la-gstrtpvorbisdepay.lo `test -f 'gstrtpvorbisdepay.c' || echo '$(srcdir)/'`gstrtpvorbisdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpvorbisdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpvorbisdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpvorbisdepay.c' object='libgstrtp_la-gstrtpvorbisdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpvorbisdepay.lo `test -f 'gstrtpvorbisdepay.c' || echo '$(srcdir)/'`gstrtpvorbisdepay.c + +libgstrtp_la-gstrtpvorbispay.lo: gstrtpvorbispay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpvorbispay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpvorbispay.Tpo -c -o libgstrtp_la-gstrtpvorbispay.lo `test -f 'gstrtpvorbispay.c' || echo '$(srcdir)/'`gstrtpvorbispay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpvorbispay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpvorbispay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpvorbispay.c' object='libgstrtp_la-gstrtpvorbispay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpvorbispay.lo `test -f 'gstrtpvorbispay.c' || echo '$(srcdir)/'`gstrtpvorbispay.c + +libgstrtp_la-gstrtpvrawdepay.lo: gstrtpvrawdepay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpvrawdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpvrawdepay.Tpo -c -o libgstrtp_la-gstrtpvrawdepay.lo `test -f 'gstrtpvrawdepay.c' || echo '$(srcdir)/'`gstrtpvrawdepay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpvrawdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpvrawdepay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpvrawdepay.c' object='libgstrtp_la-gstrtpvrawdepay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpvrawdepay.lo `test -f 'gstrtpvrawdepay.c' || echo '$(srcdir)/'`gstrtpvrawdepay.c + +libgstrtp_la-gstrtpvrawpay.lo: gstrtpvrawpay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpvrawpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpvrawpay.Tpo -c -o libgstrtp_la-gstrtpvrawpay.lo `test -f 'gstrtpvrawpay.c' || echo '$(srcdir)/'`gstrtpvrawpay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpvrawpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpvrawpay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpvrawpay.c' object='libgstrtp_la-gstrtpvrawpay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpvrawpay.lo `test -f 'gstrtpvrawpay.c' || echo '$(srcdir)/'`gstrtpvrawpay.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstrtp -:SHARED libgstrtp \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstrtp_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtp_la_CFLAGS) \ + -:LDFLAGS $(libgstrtp_la_LDFLAGS) \ + $(libgstrtp_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/rtp/README b/gst/rtp/README new file mode 100644 index 0000000..15a8bc8 --- /dev/null +++ b/gst/rtp/README @@ -0,0 +1,398 @@ +This directory contains some RTP payloaders/depayloaders for different payload +types. Use one payloader/depayloder pair per payload. If several payloads can be +payloaded/depayloaded by the same element, make different copies of it, one for +each payload. + +The application/x-rtp mime type +------------------------------- + +For valid RTP packets encapsulated in GstBuffers, we use the caps with +mime type application/x-rtp. + +The following fields can or must (*) be specified in the structure: + + * media: (String) [ "audio", "video", "application", "data", "control" ] + Defined in RFC 2327 in the SDP media announcement field. + Converted to lower case. + + * payload: (int) [0, 127] + For audio and video, these will normally be a media payload type as + defined in the RTP Audio/Video Profile. For dynamicaly allocated + payload types, this value will be >= 96 and the encoding-name must be + set. + + * clock-rate: (int) [0 - MAXINT] + The RTP clock rate. + + encoding-name: (String) ANY + typically second part of the mime type. ex. MP4V-ES. only required if + payload type >= 96. Converted to upper case. + + encoding-params: (String) ANY + extra encoding parameters (as in the SDP a=rtpmap: field). only required + if different from the default of the encoding-name. + Converted to lower-case. + + ssrc: (uint) [0 - MAXINT] + The ssrc value currently in use. (default = the SSRC of the first RTP + packet) + + clock-base: (uint) [0 - MAXINT] + The RTP time representing time npt-start. (default = rtptime of first RTP + packet). + + seqnum-base: (uint) [0 - MAXINT] + The RTP sequence number representing the first rtp packet. When this + parameter is given, all sequence numbers below this seqnum should be + ignored. (default = seqnum of first RTP packet). + + npt-start: (uint64) [0 - MAXINT] + The Normal Play Time for clock-base. This is the position in the stream and + is between 0 and the duration of the stream. This value is expressed in + nanoseconds GstClockTime. (default = 0) + + npt-stop: (uint64) [0 - MAXINT] + The last position in the stream. This value is expressed in nanoseconds + GstClockTime. (default = -1, stop unknown) + + play-speed: (gdouble) [-MIN - MAX] + The intended playback speed of the stream. The client is delivered data at + the adjusted speed. The client should adjust its playback speed with this + value and thus corresponds to the GStreamer rate field in the NEWSEGMENT + event. (default = 1.0) + + play-scale: (gdouble) [-MIN - MAX] + The rate already applied to the stream. The client is delivered a stream + that is scaled by this amount. This value is used to adjust position + reporting and corresponds to the GStream applied-rate field in the + NEWSEGMENT event. (default = 1.0) + + maxptime: (uint) [0, MAX] + The maxptime as defined in RFC 4566, this defines the maximum size of a + packet. It overrides the max-ptime property of payloaders. + + Optional parameters as key/value pairs, media type specific. The value type + should be of type G_TYPE_STRING. The key is converted to lower-case. The + value is left in its original case. + A parameter with no value is converted to =1. + + Example: + + "application/x-rtp", + "media", G_TYPE_STRING, "audio", -. + "payload", G_TYPE_INT, 96, | - required + "clock-rate", G_TYPE_INT, 8000, -' + "encoding-name", G_TYPE_STRING, "AMR", -. - required since payload >= 96 + "encoding-params", G_TYPE_STRING, "1", -' - optional param for AMR + "octet-align", G_TYPE_STRING, "1", -. + "crc", G_TYPE_STRING, "0", | + "robust-sorting", G_TYPE_STRING, "0", | AMR specific params. + "interleaving", G_TYPE_STRING, "0", -' + + Mapping of caps to and from SDP fields: + + m= RTP/AVP -] media and payload from caps + a=rtpmap: /[/] + -> when >= 96 + a=fmtp: =;... + + For above caps: + + m=audio RTP/AVP 96 + a=rtpmap:96 AMR/8000/1 + a=fmtp:96 octet-align=1;crc=0;robust-sorting=0;interleaving=0 + + Attributes are converted as follows: + + IANA registered attribute names are prepended with 'a-' before putting them in + the caps. Unregistered keys (starting with 'x-') are copied directly into the + caps. + + in RTSP, the SSRC is also sent. + + The optional parameters in the SDP fields are case insensitive. In the caps we + always use the lowercase names so that the SDP -> caps mapping remains + possible. + + Mapping of caps to NEWSEGMENT: + + rate: + applied-rate: + format: GST_FORMAT_TIME + start: * GST_SECOND / + stop: if != -1 + - + start + else + -1 + time: + + +Timestamping +------------ + +RTP in GStreamer uses a combination of the RTP timestamps and GStreamer buffer +timestamps to ensure proper synchronisation at the sender and the receiver end. + +In RTP applications, the synchronisation is most complex at the receiver side. + +At the sender side, the RTP timestamps are generated in the payloaders based on +GStreamer timestamps. At the receiver, GStreamer timestamps are reconstructed +from the RTP timestamps and the GStreamer timestamps in the jitterbuffer. This +process is explained in more detail below. + += synchronisation at the sender + +Individual streams at the sender are synchronised using GStreamer timestamps. +The payloader at the sender will convert the GStreamer timestamp into an RTP +timestamp using the following formula: + + RTP = ((RT - RT-base) * clock-rate / GST_SECOND) + RTP-offset + + RTP: the RTP timestamp for the stream. This value is truncated to + 32 bits. + RT: the GStreamer running time corresponding to the timestamp of the + packet to payload + RT-base: the GStreamer running time of the first packet encoded + clock-rate: the clock-rate of the stream + RTP-offset: a random RTP offset + +The RTP timestamp corresponding to RT-base is the clock-base (see caps above). + +In addition to setting an RTP timestamp in the RTP packet, the payloader is also +responsible for putting the GStreamer timestamp on the resulting output buffer. +This timestamp is used for further synchronisation at the sender pipeline, such +as for sending out the packet on the network. + +Notice that the absolute timing information is lost; if the sender is sending +multiple streams, the RTP timestamps in the packets do not contain enough +information to synchronize them in the receiver. The receiver can however use +the RTP timestamps to reconstruct the timing of the stream as it was created by +the sender according to the sender's clock. + +Because the payloaded packet contains both an RTP timestamp and a GStreamer +timestamp, it is possible for an RTP session manager to derive the relation +between the RTP and GST timestamps. This information is used by a session +manager to create SR reports. The NTP time in the report will contain the +running time converted to NTP time and the corresponding RTP timestamp. + +Note that at the sender side, the RTP and GStreamer timestamp both increment at +the same rate, the sender rate. This rate depends on the global pipeline clock +of the sender. + +Some pipelines to illustrate the process: + + gst-launch v4l2src ! ffenc_h263p ! rtph263ppay ! udpsink + + v4l2src puts a GStreamer timestamp on the video frames base on the current + running_time. The encoder encodes and passed the timestamp on. The payloader + generates an RTP timestamp using the above formula and puts it in the RTP + packet. It also copies the incomming GStreamer timestamp on the output RTP + packet. udpsink synchronizes on the gstreamer timestamp before pushing out the + packet. + + += synchronisation at the receiver + +The receiver is responsible for timestamping the received RTP packet with the +running_time of the clock at the time the packet was received. This GStreamer +timestamp reflects the receiver rate and depends on the global pipeline clock of +the receiver. The gstreamer timestamp of the received RTP packet contains a +certain amount of jitter introduced by the network. + +The most simple option for the receiver is to depayload the RTP packet and play +it back as soon as possible, this is with the timestamp when it was received +from the network. For the above sender pipeline this would be done with the +following pipeline: + + gst-launch udpsrc caps="application/x-rtp, media=(string)video, + clock-rate=(int)90000, encoding-name=(string)H263-1998" ! rtph263pdepay ! + ffdec_h263 ! xvimagesink + +It is important that the depayloader copies the incomming GStreamer timestamp +directly to the depayloaded output buffer. It should never attempt to perform +any logic with the RTP timestamp, this task is for the jitterbuffer as we will +see next. + +The above pipeline does not attempt to deal with reordered packets or network +jitter, which could result in jerky playback in the case of high jitter or +corrupted video in the case of packet loss or reordering. This functionality is +performed by the gstrtpjitterbuffer in GStreamer. + +The task of the gstrtpjitterbuffer element is to: + + - deal with reordered packets based on the seqnum + - calculate the drift between the sender and receiver clocks using the + GStreamer timestamps (receiver clock rate) and RTP timestamps (sender clock + rate). + +To deal with reordered packet, the jitterbuffer holds on to the received RTP +packets in a queue for a configurable amount of time, called the latency. + +The jitterbuffer also eliminates network jitter and then tracks the drift +between the local clock (as expressed in the GStreamer timestamps) and the +remote clock (as expressed in the RTP timestamps). It will remove the jitter +and will apply the drift correction to the GStreamer timestamp before pushing +the buffer downstream. The result is that the depayloader receives a smoothed +GStreamer timestamp on the RTP packet, which is copied to the depayloaded data. + +The following pipeline illustrates a receiver with a jitterbuffer. + + gst-launch udpsrc caps="application/x-rtp, media=(string)video, + clock-rate=(int)90000, encoding-name=(string)H263-1998" ! + gstrtpjitterbuffer latency=100 ! rtph263pdepay ! ffdec_h263 ! xvimagesink + +The latency property on the jitterbuffer controls the amount of delay (in +milliseconds) to apply to the outgoing packets. A higher latency will produce +smoother playback in networks with high jitter but cause a higher latency. +Choosing a good value for the latency is a tradeoff between the quality and +latency. The better the network, the lower the latency can be set. + + +usage with UDP +-------------- + +To correctly and completely use the RTP payloaders on the sender and the +receiver you need to write an application. It is not possible to write a full +blown RTP server with a single gst-launch line. + +That said, it is possible to do something functional with a few gst-launch +lines. The biggest problem when constructing a correct gst-launch line lies on +the receiver end. + +The receiver needs to know about the type of the RTP data along with a set of +RTP configuration parameters. This information is usually transmitted to the +client using some sort of session description language (SDP) over some reliable +channel (HTTP/RTSP/...). + +All of the required parameters to connect and use the RTP session on the +server can be found in the caps on the server end. The client receives this +information in some way (caps are converted to and from SDP, as explained above, +for example). + +Some gst-launch lines: + + gst-launch-0.10 -v videotestsrc ! ffenc_h263p ! rtph263ppay ! udpsink + + Setting pipeline to PAUSED ... + /pipeline0/videotestsrc0.src: caps = video/x-raw-yuv, format=(fourcc)I420, + width=(int)320, height=(int)240, framerate=(fraction)30/1 + Pipeline is PREROLLING ... + .... + /pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video, + payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998, + ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982 + .... + Pipeline is PREROLLED ... + Setting pipeline to PLAYING ... + New clock: GstSystemClock + + Write down the caps on the udpsink and set them as the caps of the UDP + receiver: + + gst-launch-0.10 -v udpsrc caps="application/x-rtp, media=(string)video, + payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998, + ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982" + ! rtph263pdepay ! ffdec_h263 ! xvimagesink + + The receiver now displays an h263 image. Since there is no jitterbuffer in the + pipeline, frames will be displayed at the time when they are received. This can + result in jerky playback in the case of high network jitter or currupted video + when packets are dropped or reordered. + + Stream a quicktime file with mpeg4 video and AAC audio on port 5000 and port + 5002. + + gst-launch-0.10 -v filesrc location=~/data/sincity.mp4 ! qtdemux name=d ! queue ! rtpmp4vpay ! udpsink port=5000 + d. ! queue ! rtpmp4gpay ! udpsink port=5002 + .... + /pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video, + payload=(int)96, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, + ssrc=(guint)1162703703, clock-base=(guint)816135835, seqnum-base=(guint)9294, + profile-level-id=(string)3, config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334 + /pipeline0/udpsink1.sink: caps = application/x-rtp, media=(string)audio, + payload=(int)96, clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, + ssrc=(guint)3246149898, clock-base=(guint)4134514058, seqnum-base=(guint)57633, + encoding-params=(string)2, streamtype=(string)5, profile-level-id=(string)1, + mode=(string)aac-hbr, config=(string)1210, sizelength=(string)13, + indexlength=(string)3, indexdeltalength=(string)3 + .... + + Again copy the caps on both sinks to the receiver launch line + + gst-launch + udpsrc port=5000 caps="application/x-rtp, media=(string)video, payload=(int)96, + clock-rate=(int)90000, encoding-name=(string)MP4V-ES, ssrc=(guint)1162703703, + clock-base=(guint)816135835, seqnum-base=(guint)9294, profile-level-id=(string)3, + config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334" + ! rtpmp4vdepay ! ffdec_mpeg4 ! xvimagesink sync=false + udpsrc port=5002 caps="application/x-rtp, media=(string)audio, payload=(int)96, + clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, ssrc=(guint)3246149898, + clock-base=(guint)4134514058, seqnum-base=(guint)57633, encoding-params=(string)2, + streamtype=(string)5, profile-level-id=(string)1, mode=(string)aac-hbr, + config=(string)1210, sizelength=(string)13, indexlength=(string)3, + indexdeltalength=(string)3" + ! rtpmp4gdepay ! faad ! alsasink sync=false + + The caps on the udpsinks can be retrieved when the server pipeline prerolled to + PAUSED. + + The above pipeline sets sync=false on the audio and video sink which means that + no synchronisation will be performed in the sinks, they play the data when it + arrives. If you want to enable synchronisation in the sinks it is highly + recommended to use a gstrtpjitterbuffer after the udpsrc elements. + + Even when sync is enabled, the two different streams will not play synchronised + against eachother because the receiver does not have enough information to + perform this task. For this you need to add the gstrtpbin element in both the + sender and receiver pipeline and use additional sources and sinks to transmit + RTCP packets used for inter-stream synchronisation. + + The caps on the receiver side can be set on the UDP source elements when the + pipeline went to PAUSED. In that state no data is received from the UDP sources + as they are live sources and only produce data in PLAYING. + + +Relevant RFCs +------------- + +3550 RTP: A Transport Protocol for Real-Time Applications. ( 1889 Obsolete ) + +2198 RTP Payload for Redundant Audio Data. +3119 A More Loss-Tolerant RTP Payload Format for MP3 Audio. + +2793 RTP Payload for Text Conversation. + +2032 RTP Payload Format for H.261 Video Streams. +2190 RTP Payload Format for H.263 Video Streams. +2250 RTP Payload Format for MPEG1/MPEG2 Video. +2343 RTP Payload Format for Bundled MPEG. +2429 RTP Payload Format for the 1998 Version of ITU-T Rec. H.263 Video +2431 RTP Payload Format for BT.656 Video Encoding. +2435 RTP Payload Format for JPEG-compressed Video. +3016 RTP Payload Format for MPEG-4 Audio/Visual Streams. +3047 RTP Payload Format for ITU-T Recommendation G.722.1. +3189 RTP Payload Format for DV (IEC 61834) Video. +3190 RTP Payload Format for 12-bit DAT Audio and 20- and 24-bit Linear Sampled Audio. +3389 Real-time Transport Protocol (RTP) Payload for Comfort Noise (CN) +2733 An RTP Payload Format for Generic Forward Error Correction. +2833 RTP Payload for DTMF Digits, Telephony Tones and Telephony + Signals. +2862 RTP Payload Format for Real-Time Pointers. +3351 RTP Profile for Audio and Video Conferences with Minimal Control. ( 1890 Obsolete ) +3555 MIME Type Registration of RTP Payload Formats. + +2508 Compressing IP/UDP/RTP Headers for Low-Speed Serial Links. +1305 Network Time Protocol (Version 3) Specification, Implementation and Analysis. +3339 Date and Time on the Internet: Timestamps. +2246 The TLS Protocol Version 1.0 +3546 Transport Layer Security (TLS) Extensions. ( Updates 2246 ) + +do we care? +----------- + +2029 RTP Payload Format of Sun's CellB Video Encoding. + +usefull +------- + +http://www.iana.org/assignments/rtp-parameters diff --git a/gst/rtp/TODO b/gst/rtp/TODO new file mode 100644 index 0000000..8065a9c --- /dev/null +++ b/gst/rtp/TODO @@ -0,0 +1,15 @@ +* MPEG4 header + - ffmpeg mpeg4 decoder gives error message when sending only the config + string, parsing is OK, error just means no picture was found in the + stream. + +* compare H263 encoders and H263+ + +* better RTP packetizing for h263 + +* bitrate tuning in ffmpeg + - fixed the qmax values so we can quantize more. + +* make ffmpeg negotiate only with accepted framerates + + diff --git a/gst/rtp/fnv1hash.c b/gst/rtp/fnv1hash.c new file mode 100644 index 0000000..a7926e4 --- /dev/null +++ b/gst/rtp/fnv1hash.c @@ -0,0 +1,63 @@ +/* GStreamer + * Copyright (C) 2007 Thomas Vander Stichele + * + * 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 + +#include "fnv1hash.h" + +/* This file implements FNV-1 hashing used in the Ogg payload encoders + * to generate the 24-bit ident value based on the header pages. + * See http://isthe.com/chongo/tech/comp/fnv/ + */ + +#define MASK_24 (((guint32) 1 << 24) -1) + +#define FNV1_HASH_32_INIT ((guint32) 0x811C9DC5L) +//2166136261L) +#define FNV1_HASH_32_PRIME 16777619 + +guint32 +fnv1_hash_32_new (void) +{ + return FNV1_HASH_32_INIT; +} + +guint32 +fnv1_hash_32_update (guint32 hash, const guchar * data, guint length) +{ + guint i; + const guchar *p = data; + + for (i = 0; i < length; ++i, ++p) { + hash *= FNV1_HASH_32_PRIME; + hash ^= *p; + } + + return hash; +} + +guint32 +fnv1_hash_32_to_24 (guint32 hash) +{ + return (hash >> 24) ^ (hash & MASK_24); +} diff --git a/gst/rtp/fnv1hash.h b/gst/rtp/fnv1hash.h new file mode 100644 index 0000000..398323d --- /dev/null +++ b/gst/rtp/fnv1hash.h @@ -0,0 +1,36 @@ +/* GStreamer + * Copyright (C) 2007 Thomas Vander Stichele + * + * 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_FNV1_HASH_H__ +#define __GST_FNV1_HASH_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +guint32 fnv1_hash_32_new (void); +guint32 fnv1_hash_32_update (guint32 hash, const guchar *data, guint length); +guint32 fnv1_hash_32_to_24 (guint32 hash); + +G_END_DECLS + +#endif /* __GST_FNV1_HASH_H__ */ + diff --git a/gst/rtp/gstasteriskh263.c b/gst/rtp/gstasteriskh263.c new file mode 100644 index 0000000..dd59c55 --- /dev/null +++ b/gst/rtp/gstasteriskh263.c @@ -0,0 +1,235 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include +#include "gstasteriskh263.h" + +/* Cygwin has both netinet/in.h and winsock2.h, but + * only one can be included, so prefer the unix one */ +#ifdef HAVE_NETINET_IN_H +# include +#else +#ifdef HAVE_WINSOCK2_H +# include +#endif +#endif + +#define GST_ASTERISKH263_HEADER_LEN 6 + +typedef struct _GstAsteriskH263Header +{ + guint32 timestamp; /* Timestamp */ + guint16 length; /* Length */ +} GstAsteriskH263Header; + +#define GST_ASTERISKH263_HEADER_TIMESTAMP(buf) (((GstAsteriskH263Header *)(GST_BUFFER_DATA (buf)))->timestamp) +#define GST_ASTERISKH263_HEADER_LENGTH(buf) (((GstAsteriskH263Header *)(GST_BUFFER_DATA (buf)))->length) + +static GstStaticPadTemplate gst_asteriskh263_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-asteriskh263") + ); + +static GstStaticPadTemplate gst_asteriskh263_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) [ 96, 127 ], " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H263-1998\"") + ); + +static void gst_asteriskh263_finalize (GObject * object); + +static GstFlowReturn gst_asteriskh263_chain (GstPad * pad, GstBuffer * buffer); + +static GstStateChangeReturn gst_asteriskh263_change_state (GstElement * + element, GstStateChange transition); + +GST_BOILERPLATE (GstAsteriskh263, gst_asteriskh263, GstElement, + GST_TYPE_ELEMENT); + +static void +gst_asteriskh263_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_asteriskh263_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_asteriskh263_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP Asterisk H263 depayloader", "Codec/Depayloader/Network/RTP", + "Extracts H263 video from RTP and encodes in Asterisk H263 format", + "Neil Stratford "); +} + +static void +gst_asteriskh263_class_init (GstAsteriskh263Class * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_asteriskh263_finalize; + + gstelement_class->change_state = gst_asteriskh263_change_state; +} + +static void +gst_asteriskh263_init (GstAsteriskh263 * asteriskh263, + GstAsteriskh263Class * klass) +{ + asteriskh263->srcpad = + gst_pad_new_from_static_template (&gst_asteriskh263_src_template, "src"); + gst_element_add_pad (GST_ELEMENT (asteriskh263), asteriskh263->srcpad); + + asteriskh263->sinkpad = + gst_pad_new_from_static_template (&gst_asteriskh263_sink_template, + "sink"); + gst_pad_set_chain_function (asteriskh263->sinkpad, gst_asteriskh263_chain); + gst_element_add_pad (GST_ELEMENT (asteriskh263), asteriskh263->sinkpad); + + asteriskh263->adapter = gst_adapter_new (); +} + +static void +gst_asteriskh263_finalize (GObject * object) +{ + GstAsteriskh263 *asteriskh263; + + asteriskh263 = GST_ASTERISK_H263 (object); + + g_object_unref (asteriskh263->adapter); + asteriskh263->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstFlowReturn +gst_asteriskh263_chain (GstPad * pad, GstBuffer * buf) +{ + GstAsteriskh263 *asteriskh263; + GstBuffer *outbuf; + GstFlowReturn ret; + + asteriskh263 = GST_ASTERISK_H263 (GST_OBJECT_PARENT (pad)); + + if (!gst_rtp_buffer_validate (buf)) + goto bad_packet; + + { + gint payload_len; + guint8 *payload; + gboolean M; + guint32 timestamp; + guint32 samples; + guint16 asterisk_len; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + payload = gst_rtp_buffer_get_payload (buf); + + M = gst_rtp_buffer_get_marker (buf); + timestamp = gst_rtp_buffer_get_timestamp (buf); + + outbuf = gst_buffer_new_and_alloc (payload_len + + GST_ASTERISKH263_HEADER_LEN); + + /* build the asterisk header */ + asterisk_len = payload_len; + if (M) + asterisk_len |= 0x8000; + if (!asteriskh263->lastts) + asteriskh263->lastts = timestamp; + samples = timestamp - asteriskh263->lastts; + asteriskh263->lastts = timestamp; + + GST_ASTERISKH263_HEADER_TIMESTAMP (outbuf) = g_htonl (samples); + GST_ASTERISKH263_HEADER_LENGTH (outbuf) = g_htons (asterisk_len); + + /* copy the data into place */ + memcpy (GST_BUFFER_DATA (outbuf) + GST_ASTERISKH263_HEADER_LEN, payload, + payload_len); + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + gst_buffer_set_caps (outbuf, + (GstCaps *) gst_pad_get_pad_template_caps (asteriskh263->srcpad)); + + ret = gst_pad_push (asteriskh263->srcpad, outbuf); + + gst_buffer_unref (buf); + } + + return ret; + +bad_packet: + { + GST_DEBUG ("Packet does not validate"); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +} + +static GstStateChangeReturn +gst_asteriskh263_change_state (GstElement * element, GstStateChange transition) +{ + GstAsteriskh263 *asteriskh263; + GstStateChangeReturn ret; + + asteriskh263 = GST_ASTERISK_H263 (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (asteriskh263->adapter); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + /* + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + */ + return ret; +} + +gboolean +gst_asteriskh263_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "asteriskh263", + GST_RANK_SECONDARY, GST_TYPE_ASTERISK_H263); +} diff --git a/gst/rtp/gstasteriskh263.h b/gst/rtp/gstasteriskh263.h new file mode 100644 index 0000000..8451e7e --- /dev/null +++ b/gst/rtp/gstasteriskh263.h @@ -0,0 +1,65 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_ASTERISK_H263_H__ +#define __GST_ASTERISK_H263_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ASTERISK_H263 \ + (gst_asteriskh263_get_type()) +#define GST_ASTERISK_H263(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ASTERISK_H263,GstAsteriskh263)) +#define GST_ASTERISK_H263_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ASTERISK_H263,GstAsteriskh263Class)) +#define GST_IS_ASTERISK_H263(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ASTERISK_H263)) +#define GST_IS_ASTERISK_H263_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ASTERISK_H263)) + +typedef struct _GstAsteriskh263 GstAsteriskh263; +typedef struct _GstAsteriskh263Class GstAsteriskh263Class; + +struct _GstAsteriskh263 +{ + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; + + GstAdapter *adapter; + + guint32 lastts; +}; + +struct _GstAsteriskh263Class +{ + GstElementClass parent_class; +}; + +GType gst_asteriskh263_get_type (void); + +gboolean gst_asteriskh263_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_ASTERISK_H263_H__ */ diff --git a/gst/rtp/gstrtp.c b/gst/rtp/gstrtp.c new file mode 100644 index 0000000..721cee3 --- /dev/null +++ b/gst/rtp/gstrtp.c @@ -0,0 +1,311 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 "gstrtpdepay.h" +#include "gstrtpac3depay.h" +#include "gstrtpac3pay.h" +#include "gstrtpbvdepay.h" +#include "gstrtpbvpay.h" +#include "gstrtpceltdepay.h" +#include "gstrtpceltpay.h" +#include "gstrtpdvdepay.h" +#include "gstrtpdvpay.h" +#include "gstrtpgstdepay.h" +#include "gstrtpgstpay.h" +#include "gstrtpilbcdepay.h" +#include "gstrtpilbcpay.h" +#include "gstrtppcmupay.h" +#include "gstrtppcmapay.h" +#include "gstrtppcmadepay.h" +#include "gstrtppcmudepay.h" +#include "gstrtpg722depay.h" +#include "gstrtpg722pay.h" +#include "gstrtpg723depay.h" +#include "gstrtpg723pay.h" +#include "gstrtpg726depay.h" +#include "gstrtpg726pay.h" +#include "gstrtpg729depay.h" +#include "gstrtpg729pay.h" +#include "gstrtpgsmpay.h" +#include "gstrtpgsmdepay.h" +#include "gstrtpamrpay.h" +#include "gstrtpamrdepay.h" +#include "gstrtpmpapay.h" +#include "gstrtpmpadepay.h" +#include "gstrtpmparobustdepay.h" +#include "gstrtpmpvdepay.h" +#include "gstrtpmpvpay.h" +#include "gstrtph263pdepay.h" +#include "gstrtph263ppay.h" +#include "gstrtph263depay.h" +#include "gstrtph263pay.h" +#include "gstrtph264depay.h" +#include "gstrtph264pay.h" +#include "gstrtpj2kdepay.h" +#include "gstrtpj2kpay.h" +#include "gstrtpjpegdepay.h" +#include "gstrtpjpegpay.h" +#include "gstrtpL16depay.h" +#include "gstrtpL16pay.h" +#include "gstasteriskh263.h" +#include "gstrtpmp1sdepay.h" +#include "gstrtpmp2tdepay.h" +#include "gstrtpmp2tpay.h" +#include "gstrtpmp4vdepay.h" +#include "gstrtpmp4vpay.h" +#include "gstrtpmp4adepay.h" +#include "gstrtpmp4apay.h" +#include "gstrtpmp4gdepay.h" +#include "gstrtpmp4gpay.h" +#include "gstrtpqcelpdepay.h" +#include "gstrtpqdmdepay.h" +#include "gstrtpsirenpay.h" +#include "gstrtpsirendepay.h" +#include "gstrtpspeexpay.h" +#include "gstrtpspeexdepay.h" +#include "gstrtpsv3vdepay.h" +#include "gstrtptheoradepay.h" +#include "gstrtptheorapay.h" +#include "gstrtpvorbisdepay.h" +#include "gstrtpvorbispay.h" +#include "gstrtpvrawdepay.h" +#include "gstrtpvrawpay.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_rtp_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_ac3_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_ac3_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_bv_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_bv_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_celt_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_celt_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_dv_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_dv_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_gst_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_gst_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_ilbc_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_ilbc_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_g722_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_g722_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_g723_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_g723_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_g726_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_g726_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_g729_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_g729_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_gsm_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_gsm_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_amr_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_amr_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_pcma_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_pcmu_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_pcmu_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_pcma_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mpa_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mpa_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mpa_robust_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mpv_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mpv_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_h263p_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_h263p_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_h263_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_h263_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_h264_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_h264_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_j2k_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_j2k_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_jpeg_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_jpeg_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_L16_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_L16_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_asteriskh263_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp1s_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp2t_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp2t_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp4v_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp4v_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp4a_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp4a_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp4g_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_mp4g_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_qcelp_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_qdm2_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_siren_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_siren_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_speex_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_speex_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_sv3v_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_theora_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_theora_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_vorbis_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_vorbis_pay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_vraw_depay_plugin_init (plugin)) + return FALSE; + + if (!gst_rtp_vraw_pay_plugin_init (plugin)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "rtp", + "Real-time protocol plugins", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/rtp/gstrtpL16depay.c b/gst/rtp/gstrtpL16depay.c new file mode 100644 index 0000000..f7aef88 --- /dev/null +++ b/gst/rtp/gstrtpL16depay.c @@ -0,0 +1,265 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 +#include + +#include +#include + +#include "gstrtpL16depay.h" +#include "gstrtpchannels.h" + +GST_DEBUG_CATEGORY_STATIC (rtpL16depay_debug); +#define GST_CAT_DEFAULT (rtpL16depay_debug) + +static GstStaticPadTemplate gst_rtp_L16_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BIG_ENDIAN, " + "signed = (boolean) true, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") + ); + +static GstStaticPadTemplate gst_rtp_L16_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [ 1, MAX ], " + /* "channels = (int) [1, MAX]" */ + /* "emphasis = (string) ANY" */ + /* "channel-order = (string) ANY" */ + "encoding-name = (string) \"L16\";" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) { " GST_RTP_PAYLOAD_L16_STEREO_STRING ", " + GST_RTP_PAYLOAD_L16_MONO_STRING " }," "clock-rate = (int) [ 1, MAX ]" + /* "channels = (int) [1, MAX]" */ + /* "emphasis = (string) ANY" */ + /* "channel-order = (string) ANY" */ + ) + ); + +GST_BOILERPLATE (GstRtpL16Depay, gst_rtp_L16_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_L16_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_L16_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_L16_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_L16_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_L16_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP audio depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts raw audio from RTP packets", + "Zeeshan Ali ," "Wim Taymans "); +} + +static void +gst_rtp_L16_depay_class_init (GstRtpL16DepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->set_caps = gst_rtp_L16_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_L16_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpL16depay_debug, "rtpL16depay", 0, + "Raw Audio RTP Depayloader"); +} + +static void +gst_rtp_L16_depay_init (GstRtpL16Depay * rtpL16depay, + GstRtpL16DepayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static gint +gst_rtp_L16_depay_parse_int (GstStructure * structure, const gchar * field, + gint def) +{ + const gchar *str; + gint res; + + if ((str = gst_structure_get_string (structure, field))) + return atoi (str); + + if (gst_structure_get_int (structure, field, &res)) + return res; + + return def; +} + +static gboolean +gst_rtp_L16_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpL16Depay *rtpL16depay; + gint clock_rate, payload; + gint channels; + GstCaps *srccaps; + gboolean res; + const gchar *channel_order; + const GstRTPChannelOrder *order; + + rtpL16depay = GST_RTP_L16_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + payload = 96; + gst_structure_get_int (structure, "payload", &payload); + switch (payload) { + case GST_RTP_PAYLOAD_L16_STEREO: + channels = 2; + clock_rate = 44100; + break; + case GST_RTP_PAYLOAD_L16_MONO: + channels = 1; + clock_rate = 44100; + break; + default: + /* no fixed mapping, we need clock-rate */ + channels = 0; + clock_rate = 0; + break; + } + + /* caps can overwrite defaults */ + clock_rate = + gst_rtp_L16_depay_parse_int (structure, "clock-rate", clock_rate); + if (clock_rate == 0) + goto no_clockrate; + + channels = + gst_rtp_L16_depay_parse_int (structure, "encoding-params", channels); + if (channels == 0) { + channels = gst_rtp_L16_depay_parse_int (structure, "channels", channels); + if (channels == 0) { + /* channels defaults to 1 otherwise */ + channels = 1; + } + } + + depayload->clock_rate = clock_rate; + rtpL16depay->rate = clock_rate; + rtpL16depay->channels = channels; + + srccaps = gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "rate", G_TYPE_INT, clock_rate, "channels", G_TYPE_INT, channels, NULL); + + /* add channel positions */ + channel_order = gst_structure_get_string (structure, "channel-order"); + + order = gst_rtp_channels_get_by_order (channels, channel_order); + if (order) { + gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), + order->pos); + } else { + GstAudioChannelPosition *pos; + + GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, + (NULL), ("Unknown channel order '%s' for %d channels", + GST_STR_NULL (channel_order), channels)); + /* create default NONE layout */ + pos = gst_rtp_channels_create_default (channels); + gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), pos); + g_free (pos); + } + + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return res; + + /* ERRORS */ +no_clockrate: + { + GST_ERROR_OBJECT (depayload, "no clock-rate specified"); + return FALSE; + } +} + +static GstBuffer * +gst_rtp_L16_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpL16Depay *rtpL16depay; + GstBuffer *outbuf; + gint payload_len; + gboolean marker; + + rtpL16depay = GST_RTP_L16_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + if (payload_len <= 0) + goto empty_packet; + + GST_DEBUG_OBJECT (rtpL16depay, "got payload of %d bytes", payload_len); + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + marker = gst_rtp_buffer_get_marker (buf); + + if (marker) { + /* mark talk spurt with DISCONT */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + return outbuf; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, + ("Empty Payload."), (NULL)); + return NULL; + } +} + +gboolean +gst_rtp_L16_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpL16depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_L16_DEPAY); +} diff --git a/gst/rtp/gstrtpL16depay.h b/gst/rtp/gstrtpL16depay.h new file mode 100644 index 0000000..a260d45 --- /dev/null +++ b/gst/rtp/gstrtpL16depay.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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_RTP_L16_DEPAY_H__ +#define __GST_RTP_L16_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +/* Standard macros for defining types for this element. */ +#define GST_TYPE_RTP_L16_DEPAY \ + (gst_rtp_L16_depay_get_type()) +#define GST_RTP_L16_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_DEPAY,GstRtpL16Depay)) +#define GST_RTP_L16_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L16_DEPAY,GstRtpL16DepayClass)) +#define GST_IS_RTP_L16_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L16_DEPAY)) +#define GST_IS_RTP_L16_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_DEPAY)) + +typedef struct _GstRtpL16Depay GstRtpL16Depay; +typedef struct _GstRtpL16DepayClass GstRtpL16DepayClass; + +/* Definition of structure storing data for this element. */ +struct _GstRtpL16Depay +{ + GstBaseRTPDepayload depayload; + + guint rate; + guint channels; +}; + +/* Standard definition defining a class for this element. */ +struct _GstRtpL16DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_L16_depay_get_type (void); + +gboolean gst_rtp_L16_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_L16_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpL16pay.c b/gst/rtp/gstrtpL16pay.c new file mode 100644 index 0000000..b5dc20e --- /dev/null +++ b/gst/rtp/gstrtpL16pay.c @@ -0,0 +1,238 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 + +#include +#include +#include + +#include "gstrtpL16pay.h" +#include "gstrtpchannels.h" + +GST_DEBUG_CATEGORY_STATIC (rtpL16pay_debug); +#define GST_CAT_DEFAULT (rtpL16pay_debug) + +static GstStaticPadTemplate gst_rtp_L16_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BIG_ENDIAN, " + "signed = (boolean) true, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") + ); + +static GstStaticPadTemplate gst_rtp_L16_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) [ 96, 127 ], " + "clock-rate = (int) [ 1, MAX ], " + "encoding-name = (string) \"L16\", " + "channels = (int) [ 1, MAX ];" + "application/x-rtp, " + "media = (string) \"audio\", " + "encoding-name = (string) \"L16\", " + "payload = (int) " GST_RTP_PAYLOAD_L16_STEREO_STRING ", " + "clock-rate = (int) 44100;" + "application/x-rtp, " + "media = (string) \"audio\", " + "encoding-name = (string) \"L16\", " + "payload = (int) " GST_RTP_PAYLOAD_L16_MONO_STRING ", " + "clock-rate = (int) 44100") + ); + +static gboolean gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, + GstCaps * caps); +static GstCaps *gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, + GstPad * pad); + +GST_BOILERPLATE (GstRtpL16Pay, gst_rtp_L16_pay, GstBaseRTPAudioPayload, + GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); + +static void +gst_rtp_L16_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_L16_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_L16_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP audio payloader", + "Codec/Payloader/Network/RTP", + "Payload-encode Raw audio into RTP packets (RFC 3551)", + "Wim Taymans "); +} + +static void +gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_L16_pay_setcaps; + gstbasertppayload_class->get_caps = gst_rtp_L16_pay_getcaps; + + GST_DEBUG_CATEGORY_INIT (rtpL16pay_debug, "rtpL16pay", 0, + "L16 RTP Payloader"); +} + +static void +gst_rtp_L16_pay_init (GstRtpL16Pay * rtpL16pay, GstRtpL16PayClass * klass) +{ + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpL16pay); + + /* tell basertpaudiopayload that this is a sample based codec */ + gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); +} + +static gboolean +gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +{ + GstRtpL16Pay *rtpL16pay; + GstStructure *structure; + gint channels, rate; + gboolean res; + gchar *params; + GstAudioChannelPosition *pos; + const GstRTPChannelOrder *order; + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basepayload); + rtpL16pay = GST_RTP_L16_PAY (basepayload); + + structure = gst_caps_get_structure (caps, 0); + + /* first parse input caps */ + if (!gst_structure_get_int (structure, "rate", &rate)) + goto no_rate; + + if (!gst_structure_get_int (structure, "channels", &channels)) + goto no_channels; + + /* get the channel order */ + pos = gst_audio_get_channel_positions (structure); + if (pos) + order = gst_rtp_channels_get_by_pos (channels, pos); + else + order = NULL; + + gst_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate); + params = g_strdup_printf ("%d", channels); + + if (!order && channels > 2) { + GST_ELEMENT_WARNING (rtpL16pay, STREAM, DECODE, + (NULL), ("Unknown channel order for %d channels", channels)); + } + + if (order && order->name) { + res = gst_basertppayload_set_outcaps (basepayload, + "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, + channels, "channel-order", G_TYPE_STRING, order->name, NULL); + } else { + res = gst_basertppayload_set_outcaps (basepayload, + "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, + channels, NULL); + } + + g_free (params); + g_free (pos); + + rtpL16pay->rate = rate; + rtpL16pay->channels = channels; + + /* octet-per-sample is 2 * channels for L16 */ + gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, + 2 * rtpL16pay->channels); + + return res; + + /* ERRORS */ +no_rate: + { + GST_DEBUG_OBJECT (rtpL16pay, "no rate given"); + return FALSE; + } +no_channels: + { + GST_DEBUG_OBJECT (rtpL16pay, "no channels given"); + return FALSE; + } +} + +static GstCaps * +gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) +{ + GstCaps *otherpadcaps; + GstCaps *caps; + + otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + + if (otherpadcaps) { + if (!gst_caps_is_empty (otherpadcaps)) { + GstStructure *structure; + gint channels; + gint pt; + gint rate; + + structure = gst_caps_get_structure (otherpadcaps, 0); + + if (gst_structure_get_int (structure, "channels", &channels)) { + gst_caps_set_simple (caps, "channels", G_TYPE_INT, channels, NULL); + } else if (gst_structure_get_int (structure, "payload", &pt)) { + if (pt == 10) + gst_caps_set_simple (caps, "channels", G_TYPE_INT, 2, NULL); + else if (pt == 11) + gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL); + } + + if (gst_structure_get_int (structure, "clock-rate", &rate)) { + gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate, NULL); + } else if (gst_structure_get_int (structure, "payload", &pt)) { + if (pt == 10 || pt == 11) + gst_caps_set_simple (caps, "rate", G_TYPE_INT, 44100, NULL); + } + + } + gst_caps_unref (otherpadcaps); + } + return caps; +} + +gboolean +gst_rtp_L16_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpL16pay", + GST_RANK_SECONDARY, GST_TYPE_RTP_L16_PAY); +} diff --git a/gst/rtp/gstrtpL16pay.h b/gst/rtp/gstrtpL16pay.h new file mode 100644 index 0000000..d2755db --- /dev/null +++ b/gst/rtp/gstrtpL16pay.h @@ -0,0 +1,61 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_L16_PAY_H__ +#define __GST_RTP_L16_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_L16_PAY \ + (gst_rtp_L16_pay_get_type()) +#define GST_RTP_L16_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_PAY,GstRtpL16Pay)) +#define GST_RTP_L16_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L16_PAY,GstRtpL16PayClass)) +#define GST_IS_RTP_L16_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L16_PAY)) +#define GST_IS_RTP_L16_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_PAY)) + +typedef struct _GstRtpL16Pay GstRtpL16Pay; +typedef struct _GstRtpL16PayClass GstRtpL16PayClass; + +struct _GstRtpL16Pay +{ + GstBaseRTPAudioPayload payload; + + gint rate; + gint channels; +}; + +struct _GstRtpL16PayClass +{ + GstBaseRTPAudioPayloadClass parent_class; +}; + +GType gst_rtp_L16_pay_get_type (void); + +gboolean gst_rtp_L16_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_L16_PAY_H__ */ diff --git a/gst/rtp/gstrtpac3depay.c b/gst/rtp/gstrtpac3depay.c new file mode 100644 index 0000000..650090e --- /dev/null +++ b/gst/rtp/gstrtpac3depay.c @@ -0,0 +1,219 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 + +#include +#include "gstrtpac3depay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpac3depay_debug); +#define GST_CAT_DEFAULT (rtpac3depay_debug) + +static GstStaticPadTemplate gst_rtp_ac3_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/ac3") + ); + +static GstStaticPadTemplate gst_rtp_ac3_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) { 32000, 44100, 48000 }, " + "encoding-name = (string) \"AC3\"") + ); + +GST_BOILERPLATE (GstRtpAC3Depay, gst_rtp_ac3_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_ac3_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_ac3_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_ac3_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_ac3_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_ac3_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP AC3 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts AC3 audio from RTP packets (RFC 4184)", + "Wim Taymans "); +} + +static void +gst_rtp_ac3_depay_class_init (GstRtpAC3DepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->set_caps = gst_rtp_ac3_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_ac3_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpac3depay_debug, "rtpac3depay", 0, + "AC3 Audio RTP Depayloader"); +} + +static void +gst_rtp_ac3_depay_init (GstRtpAC3Depay * rtpac3depay, + GstRtpAC3DepayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static gboolean +gst_rtp_ac3_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + gint clock_rate; + GstCaps *srccaps; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("audio/ac3", NULL); + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return res; +} + +struct frmsize_s +{ + guint16 bit_rate; + guint16 frm_size[3]; +}; + +static const struct frmsize_s frmsizecod_tbl[] = { + {32, {64, 69, 96}}, + {32, {64, 70, 96}}, + {40, {80, 87, 120}}, + {40, {80, 88, 120}}, + {48, {96, 104, 144}}, + {48, {96, 105, 144}}, + {56, {112, 121, 168}}, + {56, {112, 122, 168}}, + {64, {128, 139, 192}}, + {64, {128, 140, 192}}, + {80, {160, 174, 240}}, + {80, {160, 175, 240}}, + {96, {192, 208, 288}}, + {96, {192, 209, 288}}, + {112, {224, 243, 336}}, + {112, {224, 244, 336}}, + {128, {256, 278, 384}}, + {128, {256, 279, 384}}, + {160, {320, 348, 480}}, + {160, {320, 349, 480}}, + {192, {384, 417, 576}}, + {192, {384, 418, 576}}, + {224, {448, 487, 672}}, + {224, {448, 488, 672}}, + {256, {512, 557, 768}}, + {256, {512, 558, 768}}, + {320, {640, 696, 960}}, + {320, {640, 697, 960}}, + {384, {768, 835, 1152}}, + {384, {768, 836, 1152}}, + {448, {896, 975, 1344}}, + {448, {896, 976, 1344}}, + {512, {1024, 1114, 1536}}, + {512, {1024, 1115, 1536}}, + {576, {1152, 1253, 1728}}, + {576, {1152, 1254, 1728}}, + {640, {1280, 1393, 1920}}, + {640, {1280, 1394, 1920}} +}; + +static GstBuffer * +gst_rtp_ac3_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpAC3Depay *rtpac3depay; + GstBuffer *outbuf; + + rtpac3depay = GST_RTP_AC3_DEPAY (depayload); + + { + guint8 *payload; + guint16 FT, NF; + + if (gst_rtp_buffer_get_payload_len (buf) < 2) + goto empty_packet; + + payload = gst_rtp_buffer_get_payload (buf); + + /* strip off header + * + * 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | MBZ | FT| NF | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + FT = payload[0] & 0x3; + NF = payload[1]; + + GST_DEBUG_OBJECT (rtpac3depay, "FT: %d, NF: %d", FT, NF); + + /* We don't bother with fragmented packets yet */ + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 2, -1); + + if (outbuf) + GST_DEBUG_OBJECT (rtpac3depay, "pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + return outbuf; + } + + return NULL; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpac3depay, STREAM, DECODE, + ("Empty Payload."), (NULL)); + return NULL; + } +} + +gboolean +gst_rtp_ac3_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpac3depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_AC3_DEPAY); +} diff --git a/gst/rtp/gstrtpac3depay.h b/gst/rtp/gstrtpac3depay.h new file mode 100644 index 0000000..f0929e5 --- /dev/null +++ b/gst/rtp/gstrtpac3depay.h @@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_AC3_DEPAY_H__ +#define __GST_RTP_AC3_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_AC3_DEPAY \ + (gst_rtp_ac3_depay_get_type()) +#define GST_RTP_AC3_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AC3_DEPAY,GstRtpAC3Depay)) +#define GST_RTP_AC3_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AC3_DEPAY,GstRtpAC3DepayClass)) +#define GST_IS_RTP_AC3_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AC3_DEPAY)) +#define GST_IS_RTP_AC3_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AC3_DEPAY)) + +typedef struct _GstRtpAC3Depay GstRtpAC3Depay; +typedef struct _GstRtpAC3DepayClass GstRtpAC3DepayClass; + +struct _GstRtpAC3Depay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpAC3DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_ac3_depay_get_type (void); + +gboolean gst_rtp_ac3_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_AC3_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpac3pay.c b/gst/rtp/gstrtpac3pay.c new file mode 100644 index 0000000..27d4fff --- /dev/null +++ b/gst/rtp/gstrtpac3pay.c @@ -0,0 +1,452 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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 + +#include + +#include "gstrtpac3pay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpac3pay_debug); +#define GST_CAT_DEFAULT (rtpac3pay_debug) + +static GstStaticPadTemplate gst_rtp_ac3_pay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/ac3; " "audio/x-ac3; ") + ); + +static GstStaticPadTemplate gst_rtp_ac3_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) { 32000, 44100, 48000 }, " + "encoding-name = (string) \"AC3\"") + ); + +static void gst_rtp_ac3_pay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_ac3_pay_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_rtp_ac3_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static gboolean gst_rtp_ac3_pay_handle_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_rtp_ac3_pay_flush (GstRtpAC3Pay * rtpac3pay); +static GstFlowReturn gst_rtp_ac3_pay_handle_buffer (GstBaseRTPPayload * payload, + GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpAC3Pay, gst_rtp_ac3_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_ac3_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_ac3_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_ac3_pay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP AC3 audio payloader", "Codec/Payloader/Network/RTP", + "Payload AC3 audio as RTP packets (RFC 4184)", + "Wim Taymans "); +} + +static void +gst_rtp_ac3_pay_class_init (GstRtpAC3PayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_ac3_pay_finalize; + + gstelement_class->change_state = gst_rtp_ac3_pay_change_state; + + gstbasertppayload_class->set_caps = gst_rtp_ac3_pay_setcaps; + gstbasertppayload_class->handle_event = gst_rtp_ac3_pay_handle_event; + gstbasertppayload_class->handle_buffer = gst_rtp_ac3_pay_handle_buffer; + + GST_DEBUG_CATEGORY_INIT (rtpac3pay_debug, "rtpac3pay", 0, + "AC3 Audio RTP Depayloader"); +} + +static void +gst_rtp_ac3_pay_init (GstRtpAC3Pay * rtpac3pay, GstRtpAC3PayClass * klass) +{ + rtpac3pay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_ac3_pay_finalize (GObject * object) +{ + GstRtpAC3Pay *rtpac3pay; + + rtpac3pay = GST_RTP_AC3_PAY (object); + + g_object_unref (rtpac3pay->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_rtp_ac3_pay_reset (GstRtpAC3Pay * pay) +{ + pay->first_ts = -1; + pay->duration = 0; + gst_adapter_clear (pay->adapter); + GST_DEBUG_OBJECT (pay, "reset depayloader"); +} + +static gboolean +gst_rtp_ac3_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + gint rate; + GstStructure *structure; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "rate", &rate)) + rate = 90000; /* default */ + + gst_basertppayload_set_options (payload, "audio", TRUE, "AC3", rate); + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; +} + +static gboolean +gst_rtp_ac3_pay_handle_event (GstPad * pad, GstEvent * event) +{ + GstRtpAC3Pay *rtpac3pay; + + rtpac3pay = GST_RTP_AC3_PAY (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + /* make sure we push the last packets in the adapter on EOS */ + gst_rtp_ac3_pay_flush (rtpac3pay); + break; + case GST_EVENT_FLUSH_STOP: + gst_rtp_ac3_pay_reset (rtpac3pay); + break; + default: + break; + } + + gst_object_unref (rtpac3pay); + + /* FALSE to let the parent handle the event as well */ + return FALSE; +} + +struct frmsize_s +{ + guint16 bit_rate; + guint16 frm_size[3]; +}; + +static const struct frmsize_s frmsizecod_tbl[] = { + {32, {64, 69, 96}}, + {32, {64, 70, 96}}, + {40, {80, 87, 120}}, + {40, {80, 88, 120}}, + {48, {96, 104, 144}}, + {48, {96, 105, 144}}, + {56, {112, 121, 168}}, + {56, {112, 122, 168}}, + {64, {128, 139, 192}}, + {64, {128, 140, 192}}, + {80, {160, 174, 240}}, + {80, {160, 175, 240}}, + {96, {192, 208, 288}}, + {96, {192, 209, 288}}, + {112, {224, 243, 336}}, + {112, {224, 244, 336}}, + {128, {256, 278, 384}}, + {128, {256, 279, 384}}, + {160, {320, 348, 480}}, + {160, {320, 349, 480}}, + {192, {384, 417, 576}}, + {192, {384, 418, 576}}, + {224, {448, 487, 672}}, + {224, {448, 488, 672}}, + {256, {512, 557, 768}}, + {256, {512, 558, 768}}, + {320, {640, 696, 960}}, + {320, {640, 697, 960}}, + {384, {768, 835, 1152}}, + {384, {768, 836, 1152}}, + {448, {896, 975, 1344}}, + {448, {896, 976, 1344}}, + {512, {1024, 1114, 1536}}, + {512, {1024, 1115, 1536}}, + {576, {1152, 1253, 1728}}, + {576, {1152, 1254, 1728}}, + {640, {1280, 1393, 1920}}, + {640, {1280, 1394, 1920}} +}; + +static GstFlowReturn +gst_rtp_ac3_pay_flush (GstRtpAC3Pay * rtpac3pay) +{ + guint avail, FT, NF, mtu; + GstBuffer *outbuf; + GstFlowReturn ret; + + /* the data available in the adapter is either smaller + * than the MTU or bigger. In the case it is smaller, the complete + * adapter contents can be put in one packet. In the case the + * adapter has more than one MTU, we need to split the AC3 data + * over multiple packets. */ + avail = gst_adapter_available (rtpac3pay->adapter); + + ret = GST_FLOW_OK; + + FT = 0; + /* number of frames */ + NF = rtpac3pay->NF; + + mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpac3pay); + + GST_LOG_OBJECT (rtpac3pay, "flushing %u bytes", avail); + + while (avail > 0) { + guint towrite; + guint8 *payload; + guint payload_len; + guint packet_len; + + /* this will be the total length of the packet */ + packet_len = gst_rtp_buffer_calc_packet_len (2 + avail, 0, 0); + + /* fill one MTU or all available bytes */ + towrite = MIN (packet_len, mtu); + + /* this is the payload length */ + payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); + + /* create buffer to hold the payload */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + + if (FT == 0) { + /* check if it all fits */ + if (towrite < packet_len) { + guint maxlen; + + GST_LOG_OBJECT (rtpac3pay, "we need to fragment"); + /* check if we will be able to put at least 5/8th of the total + * frame in this first frame. */ + if ((avail * 5) / 8 >= (payload_len - 2)) + FT = 1; + else + FT = 2; + /* check how many fragments we will need */ + maxlen = gst_rtp_buffer_calc_payload_len (mtu - 2, 0, 0); + NF = (avail + maxlen - 1) / maxlen; + } + } else if (FT != 3) { + /* remaining fragment */ + FT = 3; + } + + /* + * 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | MBZ | FT| NF | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * FT: 0: one or more complete frames + * 1: initial 5/8 fragment + * 2: initial fragment not 5/8 + * 3: other fragment + * NF: amount of frames if FT = 0, else number of fragments. + */ + GST_LOG_OBJECT (rtpac3pay, "FT %u, NF %u", FT, NF); + payload = gst_rtp_buffer_get_payload (outbuf); + payload[0] = (FT & 3); + payload[1] = NF; + payload_len -= 2; + + gst_adapter_copy (rtpac3pay->adapter, &payload[2], 0, payload_len); + gst_adapter_flush (rtpac3pay->adapter, payload_len); + + avail -= payload_len; + if (avail == 0) + gst_rtp_buffer_set_marker (outbuf, TRUE); + + GST_BUFFER_TIMESTAMP (outbuf) = rtpac3pay->first_ts; + GST_BUFFER_DURATION (outbuf) = rtpac3pay->duration; + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpac3pay), outbuf); + } + + return ret; +} + +static GstFlowReturn +gst_rtp_ac3_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpAC3Pay *rtpac3pay; + GstFlowReturn ret; + guint size, avail, left, NF; + guint8 *data, *p; + guint packet_len; + GstClockTime duration, timestamp; + + rtpac3pay = GST_RTP_AC3_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + duration = GST_BUFFER_DURATION (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + + if (GST_BUFFER_IS_DISCONT (buffer)) { + GST_DEBUG_OBJECT (rtpac3pay, "DISCONT"); + gst_rtp_ac3_pay_reset (rtpac3pay); + } + + /* count the amount of incomming packets */ + NF = 0; + left = size; + p = data; + while (TRUE) { + guint bsid, fscod, frmsizecod, frame_size; + + if (left < 6) + break; + + if (p[0] != 0x0b || p[1] != 0x77) + break; + + bsid = p[5] >> 3; + if (bsid > 8) + break; + + frmsizecod = p[4] & 0x3f; + fscod = p[4] >> 6; + + GST_DEBUG_OBJECT (rtpac3pay, "fscod %u, %u", fscod, frmsizecod); + + if (fscod >= 3 || frmsizecod >= 38) + break; + + frame_size = frmsizecod_tbl[frmsizecod].frm_size[fscod] * 2; + if (frame_size > left) + break; + + NF++; + GST_DEBUG_OBJECT (rtpac3pay, "found frame %u of size %u", NF, frame_size); + + p += frame_size; + left -= frame_size; + } + if (NF == 0) + goto no_frames; + + avail = gst_adapter_available (rtpac3pay->adapter); + + /* get packet length of previous data and this new data, + * payload length includes a 4 byte header */ + packet_len = gst_rtp_buffer_calc_packet_len (2 + avail + size, 0, 0); + + /* if this buffer is going to overflow the packet, flush what we + * have. */ + if (gst_basertppayload_is_filled (basepayload, + packet_len, rtpac3pay->duration + duration)) { + ret = gst_rtp_ac3_pay_flush (rtpac3pay); + avail = 0; + } else { + ret = GST_FLOW_OK; + } + + if (avail == 0) { + GST_DEBUG_OBJECT (rtpac3pay, + "first packet, save timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + rtpac3pay->first_ts = timestamp; + rtpac3pay->duration = 0; + rtpac3pay->NF = 0; + } + + gst_adapter_push (rtpac3pay->adapter, buffer); + rtpac3pay->duration += duration; + rtpac3pay->NF += NF; + + return ret; + + /* ERRORS */ +no_frames: + { + GST_WARNING_OBJECT (rtpac3pay, "no valid AC3 frames found"); + return GST_FLOW_OK; + } +} + +static GstStateChangeReturn +gst_rtp_ac3_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstRtpAC3Pay *rtpac3pay; + GstStateChangeReturn ret; + + rtpac3pay = GST_RTP_AC3_PAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_ac3_pay_reset (rtpac3pay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_ac3_pay_reset (rtpac3pay); + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_ac3_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpac3pay", + GST_RANK_SECONDARY, GST_TYPE_RTP_AC3_PAY); +} diff --git a/gst/rtp/gstrtpac3pay.h b/gst/rtp/gstrtpac3pay.h new file mode 100644 index 0000000..2ca9d99 --- /dev/null +++ b/gst/rtp/gstrtpac3pay.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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_RTP_AC3_PAY_H__ +#define __GST_RTP_AC3_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_AC3_PAY \ + (gst_rtp_ac3_pay_get_type()) +#define GST_RTP_AC3_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AC3_PAY,GstRtpAC3Pay)) +#define GST_RTP_AC3_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AC3_PAY,GstRtpAC3PayClass)) +#define GST_IS_RTP_AC3_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AC3_PAY)) +#define GST_IS_RTP_AC3_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AC3_PAY)) + +typedef struct _GstRtpAC3Pay GstRtpAC3Pay; +typedef struct _GstRtpAC3PayClass GstRtpAC3PayClass; + +struct _GstRtpAC3Pay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime first_ts; + GstClockTime duration; + guint NF; +}; + +struct _GstRtpAC3PayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_ac3_pay_get_type (void); + +gboolean gst_rtp_ac3_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_AC3_PAY_H__ */ diff --git a/gst/rtp/gstrtpamrdepay.c b/gst/rtp/gstrtpamrdepay.c new file mode 100644 index 0000000..fa38759 --- /dev/null +++ b/gst/rtp/gstrtpamrdepay.c @@ -0,0 +1,458 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include +#include +#include "gstrtpamrdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpamrdepay_debug); +#define GST_CAT_DEFAULT (rtpamrdepay_debug) + +/* references: + * + * RFC 3267 - Real-Time Transport Protocol (RTP) Payload Format and File + * Storage Format for the Adaptive Multi-Rate (AMR) and Adaptive Multi-Rate + * Wideband (AMR-WB) Audio Codecs. + */ + +/* RtpAMRDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +/* input is an RTP packet + * + * params see RFC 3267, section 8.1 + */ +static GstStaticPadTemplate gst_rtp_amr_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"AMR\", " + "encoding-params = (string) \"1\", " + /* NOTE that all values must be strings in orde to be able to do SDP <-> + * GstCaps mapping. */ + "octet-align = (string) \"1\", " + "crc = (string) { \"0\", \"1\" }, " + "robust-sorting = (string) \"0\", " "interleaving = (string) \"0\";" + /* following options are not needed for a decoder + * + "mode-set = (int) [ 0, 7 ], " + "mode-change-period = (int) [ 1, MAX ], " + "mode-change-neighbor = (boolean) { TRUE, FALSE }, " + "maxptime = (int) [ 20, MAX ], " + "ptime = (int) [ 20, MAX ]" + */ + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 16000, " + "encoding-name = (string) \"AMR-WB\", " + "encoding-params = (string) \"1\", " + /* NOTE that all values must be strings in orde to be able to do SDP <-> + * GstCaps mapping. */ + "octet-align = (string) \"1\", " + "crc = (string) { \"0\", \"1\" }, " + "robust-sorting = (string) \"0\", " "interleaving = (string) \"0\"" + /* following options are not needed for a decoder + * + "mode-set = (int) [ 0, 7 ], " + "mode-change-period = (int) [ 1, MAX ], " + "mode-change-neighbor = (boolean) { TRUE, FALSE }, " + "maxptime = (int) [ 20, MAX ], " + "ptime = (int) [ 20, MAX ]" + */ + ) + ); + +static GstStaticPadTemplate gst_rtp_amr_depay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/AMR, " "channels = (int) 1," "rate = (int) 8000;" + "audio/AMR-WB, " "channels = (int) 1," "rate = (int) 16000") + ); + +static gboolean gst_rtp_amr_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_amr_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +GST_BOILERPLATE (GstRtpAMRDepay, gst_rtp_amr_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_amr_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_amr_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_amr_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP AMR depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts AMR or AMR-WB audio from RTP packets (RFC 3267)", + "Wim Taymans "); +} + +static void +gst_rtp_amr_depay_class_init (GstRtpAMRDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_amr_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_amr_depay_setcaps; + + GST_DEBUG_CATEGORY_INIT (rtpamrdepay_debug, "rtpamrdepay", 0, + "AMR/AMR-WB RTP Depayloader"); +} + +static void +gst_rtp_amr_depay_init (GstRtpAMRDepay * rtpamrdepay, + GstRtpAMRDepayClass * klass) +{ + GstBaseRTPDepayload *depayload; + + depayload = GST_BASE_RTP_DEPAYLOAD (rtpamrdepay); + + gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); +} + +static gboolean +gst_rtp_amr_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstCaps *srccaps; + GstRtpAMRDepay *rtpamrdepay; + const gchar *params; + const gchar *str, *type; + gint clock_rate, need_clock_rate; + gboolean res; + + rtpamrdepay = GST_RTP_AMR_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + /* figure out the mode first and set the clock rates */ + if ((str = gst_structure_get_string (structure, "encoding-name"))) { + if (strcmp (str, "AMR") == 0) { + rtpamrdepay->mode = GST_RTP_AMR_DP_MODE_NB; + need_clock_rate = 8000; + type = "audio/AMR"; + } else if (strcmp (str, "AMR-WB") == 0) { + rtpamrdepay->mode = GST_RTP_AMR_DP_MODE_WB; + need_clock_rate = 16000; + type = "audio/AMR-WB"; + } else + goto invalid_mode; + } else + goto invalid_mode; + + if (!(str = gst_structure_get_string (structure, "octet-align"))) + rtpamrdepay->octet_align = FALSE; + else + rtpamrdepay->octet_align = (atoi (str) == 1); + + if (!(str = gst_structure_get_string (structure, "crc"))) + rtpamrdepay->crc = FALSE; + else + rtpamrdepay->crc = (atoi (str) == 1); + + if (rtpamrdepay->crc) { + /* crc mode implies octet aligned mode */ + rtpamrdepay->octet_align = TRUE; + } + + if (!(str = gst_structure_get_string (structure, "robust-sorting"))) + rtpamrdepay->robust_sorting = FALSE; + else + rtpamrdepay->robust_sorting = (atoi (str) == 1); + + if (rtpamrdepay->robust_sorting) { + /* robust_sorting mode implies octet aligned mode */ + rtpamrdepay->octet_align = TRUE; + } + + if (!(str = gst_structure_get_string (structure, "interleaving"))) + rtpamrdepay->interleaving = FALSE; + else + rtpamrdepay->interleaving = (atoi (str) == 1); + + if (rtpamrdepay->interleaving) { + /* interleaving mode implies octet aligned mode */ + rtpamrdepay->octet_align = TRUE; + } + + if (!(params = gst_structure_get_string (structure, "encoding-params"))) + rtpamrdepay->channels = 1; + else { + rtpamrdepay->channels = atoi (params); + } + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = need_clock_rate; + depayload->clock_rate = clock_rate; + + /* we require 1 channel, 8000 Hz, octet aligned, no CRC, + * no robust sorting, no interleaving for now */ + if (rtpamrdepay->channels != 1) + return FALSE; + if (clock_rate != need_clock_rate) + return FALSE; + if (rtpamrdepay->octet_align != TRUE) + return FALSE; + if (rtpamrdepay->robust_sorting != FALSE) + return FALSE; + if (rtpamrdepay->interleaving != FALSE) + return FALSE; + + srccaps = gst_caps_new_simple (type, + "channels", G_TYPE_INT, rtpamrdepay->channels, + "rate", G_TYPE_INT, clock_rate, NULL); + res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return res; + + /* ERRORS */ +invalid_mode: + { + GST_ERROR_OBJECT (rtpamrdepay, "invalid encoding-name"); + return FALSE; + } +} + +/* -1 is invalid */ +static const gint nb_frame_size[16] = { + 12, 13, 15, 17, 19, 20, 26, 31, + 5, -1, -1, -1, -1, -1, -1, 0 +}; + +static const gint wb_frame_size[16] = { + 17, 23, 32, 36, 40, 46, 50, 58, + 60, 5, -1, -1, -1, -1, -1, 0 +}; + +static GstBuffer * +gst_rtp_amr_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpAMRDepay *rtpamrdepay; + const gint *frame_size; + GstBuffer *outbuf = NULL; + gint payload_len; + + rtpamrdepay = GST_RTP_AMR_DEPAY (depayload); + + /* setup frame size pointer */ + if (rtpamrdepay->mode == GST_RTP_AMR_DP_MODE_NB) + frame_size = nb_frame_size; + else + frame_size = wb_frame_size; + + /* when we get here, 1 channel, 8000/16000 Hz, octet aligned, no CRC, + * no robust sorting, no interleaving data is to be depayloaded */ + { + guint8 *payload, *p, *dp; + gint i, num_packets, num_nonempty_packets; + gint amr_len; + gint ILL, ILP; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + /* need at least 2 bytes for the header */ + if (payload_len < 2) + goto too_small; + + payload = gst_rtp_buffer_get_payload (buf); + + /* depay CMR. The CMR is used by the sender to request + * a new encoding mode. + * + * 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+ + * | CMR |R|R|R|R| + * +-+-+-+-+-+-+-+-+ + */ + /* CMR = (payload[0] & 0xf0) >> 4; */ + + /* strip CMR header now, pack FT and the data for the decoder */ + payload_len -= 1; + payload += 1; + + GST_DEBUG_OBJECT (rtpamrdepay, "payload len %d", payload_len); + + if (rtpamrdepay->interleaving) { + ILL = (payload[0] & 0xf0) >> 4; + ILP = (payload[0] & 0x0f); + + payload_len -= 1; + payload += 1; + + if (ILP > ILL) + goto wrong_interleaving; + } + + /* + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 + * +-+-+-+-+-+-+-+-+.. + * |F| FT |Q|P|P| more FT.. + * +-+-+-+-+-+-+-+-+.. + */ + /* count number of packets by counting the FTs. Also + * count number of amr data bytes and number of non-empty + * packets (this is also the number of CRCs if present). */ + amr_len = 0; + num_nonempty_packets = 0; + num_packets = 0; + for (i = 0; i < payload_len; i++) { + gint fr_size; + guint8 FT; + + FT = (payload[i] & 0x78) >> 3; + + fr_size = frame_size[FT]; + GST_DEBUG_OBJECT (rtpamrdepay, "frame size %d", fr_size); + if (fr_size == -1) + goto wrong_framesize; + + if (fr_size > 0) { + amr_len += fr_size; + num_nonempty_packets++; + } + num_packets++; + + if ((payload[i] & 0x80) == 0) + break; + } + + if (rtpamrdepay->crc) { + /* data len + CRC len + header bytes should be smaller than payload_len */ + if (num_packets + num_nonempty_packets + amr_len > payload_len) + goto wrong_length_1; + } else { + /* data len + header bytes should be smaller than payload_len */ + if (num_packets + amr_len > payload_len) + goto wrong_length_2; + } + + outbuf = gst_buffer_new_and_alloc (payload_len); + + /* point to destination */ + p = GST_BUFFER_DATA (outbuf); + /* point to first data packet */ + dp = payload + num_packets; + if (rtpamrdepay->crc) { + /* skip CRC if present */ + dp += num_nonempty_packets; + } + + for (i = 0; i < num_packets; i++) { + gint fr_size; + + /* copy FT, clear F bit */ + *p++ = payload[i] & 0x7f; + + fr_size = frame_size[(payload[i] & 0x78) >> 3]; + if (fr_size > 0) { + /* copy data packet, FIXME, calc CRC here. */ + memcpy (p, dp, fr_size); + + p += fr_size; + dp += fr_size; + } + } + /* we can set the duration because each packet is 20 milliseconds */ + GST_BUFFER_DURATION (outbuf) = num_packets * 20 * GST_MSECOND; + + if (gst_rtp_buffer_get_marker (buf)) { + /* marker bit marks a discont buffer after a talkspurt. */ + GST_DEBUG_OBJECT (depayload, "marker bit was set"); + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + GST_DEBUG_OBJECT (depayload, "pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + } + return outbuf; + + /* ERRORS */ +too_small: + { + GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, + (NULL), ("AMR RTP payload too small (%d)", payload_len)); + goto bad_packet; + } +wrong_interleaving: + { + GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, + (NULL), ("AMR RTP wrong interleaving")); + goto bad_packet; + } +wrong_framesize: + { + GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, + (NULL), ("AMR RTP frame size == -1")); + goto bad_packet; + } +wrong_length_1: + { + GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, + (NULL), ("AMR RTP wrong length 1")); + goto bad_packet; + } +wrong_length_2: + { + GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, + (NULL), ("AMR RTP wrong length 2")); + goto bad_packet; + } +bad_packet: + { + /* no fatal error */ + return NULL; + } +} + +gboolean +gst_rtp_amr_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpamrdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_AMR_DEPAY); +} diff --git a/gst/rtp/gstrtpamrdepay.h b/gst/rtp/gstrtpamrdepay.h new file mode 100644 index 0000000..92f001a --- /dev/null +++ b/gst/rtp/gstrtpamrdepay.h @@ -0,0 +1,77 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_AMR_DEPAY_H__ +#define __GST_RTP_AMR_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_AMR_DEPAY \ + (gst_rtp_amr_depay_get_type()) +#define GST_RTP_AMR_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AMR_DEPAY,GstRtpAMRDepay)) +#define GST_RTP_AMR_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AMR_DEPAY,GstRtpAMRDepayClass)) +#define GST_IS_RTP_AMR_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AMR_DEPAY)) +#define GST_IS_RTP_AMR_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AMR_DEPAY)) + +typedef struct _GstRtpAMRDepay GstRtpAMRDepay; +typedef struct _GstRtpAMRDepayClass GstRtpAMRDepayClass; + +typedef enum { + GST_RTP_AMR_DP_MODE_INVALID = 0, + GST_RTP_AMR_DP_MODE_NB = 1, + GST_RTP_AMR_DP_MODE_WB = 2 +} GstRtpAMRDepayMode; + +struct _GstRtpAMRDepay +{ + GstBaseRTPDepayload depayload; + + GstRtpAMRDepayMode mode; + + gboolean octet_align; + guint8 mode_set; + gint mode_change_period; + gboolean mode_change_neighbor; + gint maxptime; + gboolean crc; + gboolean robust_sorting; + gboolean interleaving; + gint ptime; + gint channels; +}; + +struct _GstRtpAMRDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_amr_depay_get_type (void); + +gboolean gst_rtp_amr_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_AMR_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpamrpay.c b/gst/rtp/gstrtpamrpay.c new file mode 100644 index 0000000..ea5ada6 --- /dev/null +++ b/gst/rtp/gstrtpamrpay.c @@ -0,0 +1,439 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include + +#include "gstrtpamrpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpamrpay_debug); +#define GST_CAT_DEFAULT (rtpamrpay_debug) + +/* references: + * + * RFC 3267 - Real-Time Transport Protocol (RTP) Payload Format and File + * Storage Format for the Adaptive Multi-Rate (AMR) and Adaptive + * Multi-Rate Wideband (AMR-WB) Audio Codecs. + * + * ETSI TS 126 201 V6.0.0 (2004-12) - Digital cellular telecommunications system (Phase 2+); + * Universal Mobile Telecommunications System (UMTS); + * AMR speech codec, wideband; + * Frame structure + * (3GPP TS 26.201 version 6.0.0 Release 6) + */ + +static GstStaticPadTemplate gst_rtp_amr_pay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/AMR, channels=(int)1, rate=(int)8000; " + "audio/AMR-WB, channels=(int)1, rate=(int)16000") + ); + +static GstStaticPadTemplate gst_rtp_amr_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"AMR\", " + "encoding-params = (string) \"1\", " + "octet-align = (string) \"1\", " + "crc = (string) \"0\", " + "robust-sorting = (string) \"0\", " + "interleaving = (string) \"0\", " + "mode-set = (int) [ 0, 7 ], " + "mode-change-period = (int) [ 1, MAX ], " + "mode-change-neighbor = (string) { \"0\", \"1\" }, " + "maxptime = (int) [ 20, MAX ], " "ptime = (int) [ 20, MAX ];" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 16000, " + "encoding-name = (string) \"AMR-WB\", " + "encoding-params = (string) \"1\", " + "octet-align = (string) \"1\", " + "crc = (string) \"0\", " + "robust-sorting = (string) \"0\", " + "interleaving = (string) \"0\", " + "mode-set = (int) [ 0, 7 ], " + "mode-change-period = (int) [ 1, MAX ], " + "mode-change-neighbor = (string) { \"0\", \"1\" }, " + "maxptime = (int) [ 20, MAX ], " "ptime = (int) [ 20, MAX ]") + ); + +static gboolean gst_rtp_amr_pay_setcaps (GstBaseRTPPayload * basepayload, + GstCaps * caps); +static GstFlowReturn gst_rtp_amr_pay_handle_buffer (GstBaseRTPPayload * pad, + GstBuffer * buffer); + +static GstStateChangeReturn +gst_rtp_amr_pay_change_state (GstElement * element, GstStateChange transition); + +GST_BOILERPLATE (GstRtpAMRPay, gst_rtp_amr_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_amr_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_amr_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_amr_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP AMR payloader", + "Codec/Payloader/Network/RTP", + "Payload-encode AMR or AMR-WB audio into RTP packets (RFC 3267)", + "Wim Taymans "); +} + +static void +gst_rtp_amr_pay_class_init (GstRtpAMRPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + GstElementClass *gstelement_class; + + gstelement_class = (GstElementClass *) klass; + gstelement_class->change_state = gst_rtp_amr_pay_change_state; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_amr_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_amr_pay_handle_buffer; + + GST_DEBUG_CATEGORY_INIT (rtpamrpay_debug, "rtpamrpay", 0, + "AMR/AMR-WB RTP Payloader"); +} + +static void +gst_rtp_amr_pay_init (GstRtpAMRPay * rtpamrpay, GstRtpAMRPayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static void +gst_rtp_amr_pay_reset (GstRtpAMRPay * pay) +{ + pay->next_rtp_time = 0; + pay->first_ts = GST_CLOCK_TIME_NONE; + pay->first_rtp_time = 0; +} + +static gboolean +gst_rtp_amr_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +{ + GstRtpAMRPay *rtpamrpay; + gboolean res; + const GstStructure *s; + const gchar *str; + + rtpamrpay = GST_RTP_AMR_PAY (basepayload); + + /* figure out the mode Narrow or Wideband */ + s = gst_caps_get_structure (caps, 0); + if ((str = gst_structure_get_name (s))) { + if (strcmp (str, "audio/AMR") == 0) + rtpamrpay->mode = GST_RTP_AMR_P_MODE_NB; + else if (strcmp (str, "audio/AMR-WB") == 0) + rtpamrpay->mode = GST_RTP_AMR_P_MODE_WB; + else + goto wrong_type; + } else + goto wrong_type; + + if (rtpamrpay->mode == GST_RTP_AMR_P_MODE_NB) + gst_basertppayload_set_options (basepayload, "audio", TRUE, "AMR", 8000); + else + gst_basertppayload_set_options (basepayload, "audio", TRUE, "AMR-WB", + 16000); + + res = gst_basertppayload_set_outcaps (basepayload, + "encoding-params", G_TYPE_STRING, "1", "octet-align", G_TYPE_STRING, "1", + /* don't set the defaults + * + * "crc", G_TYPE_STRING, "0", + * "robust-sorting", G_TYPE_STRING, "0", + * "interleaving", G_TYPE_STRING, "0", + */ + NULL); + + return res; + + /* ERRORS */ +wrong_type: + { + GST_ERROR_OBJECT (rtpamrpay, "unsupported media type '%s'", + GST_STR_NULL (str)); + return FALSE; + } +} + +static void +gst_rtp_amr_pay_recalc_rtp_time (GstRtpAMRPay * rtpamrpay, + GstClockTime timestamp) +{ + /* re-sync rtp time */ + if (GST_CLOCK_TIME_IS_VALID (rtpamrpay->first_ts) && + GST_CLOCK_TIME_IS_VALID (timestamp) && timestamp >= rtpamrpay->first_ts) { + GstClockTime diff; + guint32 rtpdiff; + + /* interpolate to reproduce gap from start, rather than intermediate + * intervals to avoid roundup accumulation errors */ + diff = timestamp - rtpamrpay->first_ts; + rtpdiff = ((diff / GST_MSECOND) * 8) << + (rtpamrpay->mode == GST_RTP_AMR_P_MODE_WB); + rtpamrpay->next_rtp_time = rtpamrpay->first_rtp_time + rtpdiff; + GST_DEBUG_OBJECT (rtpamrpay, + "elapsed time %" GST_TIME_FORMAT ", rtp %" G_GUINT32_FORMAT ", " + "new offset %" G_GUINT32_FORMAT, GST_TIME_ARGS (diff), rtpdiff, + rtpamrpay->next_rtp_time); + } +} + +/* -1 is invalid */ +static const gint nb_frame_size[16] = { + 12, 13, 15, 17, 19, 20, 26, 31, + 5, -1, -1, -1, -1, -1, -1, 0 +}; + +static const gint wb_frame_size[16] = { + 17, 23, 32, 36, 40, 46, 50, 58, + 60, 5, -1, -1, -1, -1, -1, 0 +}; + +static GstFlowReturn +gst_rtp_amr_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpAMRPay *rtpamrpay; + const gint *frame_size; + GstFlowReturn ret; + guint size, payload_len; + GstBuffer *outbuf; + guint8 *payload, *data, *payload_amr; + GstClockTime timestamp, duration; + guint packet_len, mtu; + gint i, num_packets, num_nonempty_packets; + gint amr_len; + gboolean sid = FALSE; + + rtpamrpay = GST_RTP_AMR_PAY (basepayload); + mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpamrpay); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + + /* setup frame size pointer */ + if (rtpamrpay->mode == GST_RTP_AMR_P_MODE_NB) + frame_size = nb_frame_size; + else + frame_size = wb_frame_size; + + GST_DEBUG_OBJECT (basepayload, "got %d bytes", size); + + /* FIXME, only + * octet aligned, no interleaving, single channel, no CRC, + * no robust-sorting. To fix this you need to implement the downstream + * negotiation function. */ + + /* first count number of packets and total amr frame size */ + amr_len = num_packets = num_nonempty_packets = 0; + for (i = 0; i < size; i++) { + guint8 FT; + gint fr_size; + + FT = (data[i] & 0x78) >> 3; + + fr_size = frame_size[FT]; + GST_DEBUG_OBJECT (basepayload, "frame type %d, frame size %d", FT, fr_size); + /* FIXME, we don't handle this yet.. */ + if (fr_size <= 0) + goto wrong_size; + + if (fr_size == 5) + sid = TRUE; + + amr_len += fr_size; + num_nonempty_packets++; + num_packets++; + i += fr_size; + } + if (amr_len > size) + goto incomplete_frame; + + /* we need one extra byte for the CMR, the ToC is in the input + * data */ + payload_len = size + 1; + + /* get packet len to check against MTU */ + packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0); + if (packet_len > mtu) + goto too_big; + + /* now alloc output buffer */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + + /* copy timestamp */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + + if (duration != GST_CLOCK_TIME_NONE) + GST_BUFFER_DURATION (outbuf) = duration; + else { + GST_BUFFER_DURATION (outbuf) = num_packets * 20 * GST_MSECOND; + } + + if (GST_BUFFER_IS_DISCONT (buffer)) { + GST_DEBUG_OBJECT (basepayload, "discont, setting marker bit"); + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + gst_rtp_buffer_set_marker (outbuf, TRUE); + gst_rtp_amr_pay_recalc_rtp_time (rtpamrpay, timestamp); + } + + if (G_UNLIKELY (sid)) { + gst_rtp_amr_pay_recalc_rtp_time (rtpamrpay, timestamp); + } + + /* perfect rtptime */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (rtpamrpay->first_ts))) { + rtpamrpay->first_ts = timestamp; + rtpamrpay->first_rtp_time = rtpamrpay->next_rtp_time; + } + GST_BUFFER_OFFSET (outbuf) = rtpamrpay->next_rtp_time; + rtpamrpay->next_rtp_time += + (num_packets * 160) << (rtpamrpay->mode == GST_RTP_AMR_P_MODE_WB); + + /* get payload, this is now writable */ + payload = gst_rtp_buffer_get_payload (outbuf); + + /* 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+ + * | CMR |R|R|R|R| + * +-+-+-+-+-+-+-+-+ + */ + payload[0] = 0xF0; /* CMR, no specific mode requested */ + + /* this is where we copy the AMR data, after num_packets FTs and the + * CMR. */ + payload_amr = payload + num_packets + 1; + + /* copy data in payload, first we copy all the FTs then all + * the AMR data. The last FT has to have the F flag cleared. */ + for (i = 1; i <= num_packets; i++) { + guint8 FT; + gint fr_size; + + /* 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+ + * |F| FT |Q|P|P| more FT... + * +-+-+-+-+-+-+-+-+ + */ + FT = (*data & 0x78) >> 3; + + fr_size = frame_size[FT]; + + if (i == num_packets) + /* last packet, clear F flag */ + payload[i] = *data & 0x7f; + else + /* set F flag */ + payload[i] = *data | 0x80; + + memcpy (payload_amr, &data[1], fr_size); + + /* all sizes are > 0 since we checked for that above */ + data += fr_size + 1; + payload_amr += fr_size; + } + + gst_buffer_unref (buffer); + + ret = gst_basertppayload_push (basepayload, outbuf); + + return ret; + + /* ERRORS */ +wrong_size: + { + GST_ELEMENT_ERROR (basepayload, STREAM, FORMAT, + (NULL), ("received AMR frame with size <= 0")); + gst_buffer_unref (buffer); + + return GST_FLOW_ERROR; + } +incomplete_frame: + { + GST_ELEMENT_ERROR (basepayload, STREAM, FORMAT, + (NULL), ("received incomplete AMR frames")); + gst_buffer_unref (buffer); + + return GST_FLOW_ERROR; + } +too_big: + { + GST_ELEMENT_ERROR (basepayload, STREAM, FORMAT, + (NULL), ("received too many AMR frames for MTU")); + gst_buffer_unref (buffer); + + return GST_FLOW_ERROR; + } +} + +static GstStateChangeReturn +gst_rtp_amr_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + /* handle upwards state changes here */ + switch (transition) { + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + /* handle downwards state changes */ + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_amr_pay_reset (GST_RTP_AMR_PAY (element)); + break; + default: + break; + } + + return ret; +} + +gboolean +gst_rtp_amr_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpamrpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_AMR_PAY); +} diff --git a/gst/rtp/gstrtpamrpay.h b/gst/rtp/gstrtpamrpay.h new file mode 100644 index 0000000..36e32fc --- /dev/null +++ b/gst/rtp/gstrtpamrpay.h @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_AMR_PAY_H__ +#define __GST_RTP_AMR_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_AMR_PAY \ + (gst_rtp_amr_pay_get_type()) +#define GST_RTP_AMR_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AMR_PAY,GstRtpAMRPay)) +#define GST_RTP_AMR_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AMR_PAY,GstRtpAMRPayClass)) +#define GST_IS_RTP_AMR_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AMR_PAY)) +#define GST_IS_RTP_AMR_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AMR_PAY)) + +typedef struct _GstRtpAMRPay GstRtpAMRPay; +typedef struct _GstRtpAMRPayClass GstRtpAMRPayClass; + +typedef enum { + GST_RTP_AMR_P_MODE_INVALID = 0, + GST_RTP_AMR_P_MODE_NB = 1, + GST_RTP_AMR_P_MODE_WB = 2 +} GstRtpAMRPayMode; + +struct _GstRtpAMRPay +{ + GstBaseRTPPayload payload; + + GstRtpAMRPayMode mode; + GstClockTime first_ts; + guint32 first_rtp_time; + guint32 next_rtp_time; +}; + +struct _GstRtpAMRPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_amr_pay_get_type (void); + +gboolean gst_rtp_amr_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_AMR_PAY_H__ */ diff --git a/gst/rtp/gstrtpbvdepay.c b/gst/rtp/gstrtpbvdepay.c new file mode 100644 index 0000000..c190982 --- /dev/null +++ b/gst/rtp/gstrtpbvdepay.c @@ -0,0 +1,181 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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 +#include + +#include +#include "gstrtpbvdepay.h" + +static GstStaticPadTemplate gst_rtp_bv_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"BV16\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 16000, " "encoding-name = (string) \"BV32\"") + ); + +static GstStaticPadTemplate gst_rtp_bv_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-bv, " "mode = (int) { 16, 32 }") + ); + +static GstBuffer *gst_rtp_bv_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_bv_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRTPBVDepay, gst_rtp_bv_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_bv_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_bv_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_bv_depay_sink_template); + gst_element_class_set_details_simple (element_class, + "RTP BroadcomVoice depayloader", "Codec/Depayloader/Network/RTP", + "Extracts BroadcomVoice audio from RTP packets (RFC 4298)", + "Wim Taymans "); +} + +static void +gst_rtp_bv_depay_class_init (GstRTPBVDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_bv_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_bv_depay_setcaps; +} + +static void +gst_rtp_bv_depay_init (GstRTPBVDepay * rtpbvdepay, GstRTPBVDepayClass * klass) +{ + rtpbvdepay->mode = -1; +} + +static gboolean +gst_rtp_bv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstRTPBVDepay *rtpbvdepay = GST_RTP_BV_DEPAY (depayload); + GstCaps *srccaps; + GstStructure *structure; + const gchar *mode_str = NULL; + gint mode, clock_rate, expected_rate; + gboolean ret; + + structure = gst_caps_get_structure (caps, 0); + + mode_str = gst_structure_get_string (structure, "encoding-name"); + if (!mode_str) + goto no_mode; + + if (!strcmp (mode_str, "BV16")) { + mode = 16; + expected_rate = 8000; + } else if (!strcmp (mode_str, "BV32")) { + mode = 32; + expected_rate = 16000; + } else + goto invalid_mode; + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = expected_rate; + else if (clock_rate != expected_rate) + goto wrong_rate; + + depayload->clock_rate = clock_rate; + rtpbvdepay->mode = mode; + + srccaps = gst_caps_new_simple ("audio/x-bv", + "mode", G_TYPE_INT, rtpbvdepay->mode, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + + GST_DEBUG ("set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); + gst_caps_unref (srccaps); + + return ret; + + /* ERRORS */ +no_mode: + { + GST_ERROR_OBJECT (rtpbvdepay, "did not receive an encoding-name"); + return FALSE; + } +invalid_mode: + { + GST_ERROR_OBJECT (rtpbvdepay, + "invalid encoding-name, expected BV16 or BV32, got %s", mode_str); + return FALSE; + } +wrong_rate: + { + GST_ERROR_OBJECT (rtpbvdepay, "invalid clock-rate, expected %d, got %d", + expected_rate, clock_rate); + return FALSE; + } +} + +static GstBuffer * +gst_rtp_bv_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstBuffer *outbuf; + gboolean marker; + + marker = gst_rtp_buffer_get_marker (buf); + + GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", + GST_BUFFER_SIZE (buf), marker, + gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + if (marker && outbuf) { + /* mark start of talkspurt with DISCONT */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + return outbuf; +} + +gboolean +gst_rtp_bv_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpbvdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_BV_DEPAY); +} diff --git a/gst/rtp/gstrtpbvdepay.h b/gst/rtp/gstrtpbvdepay.h new file mode 100644 index 0000000..9cb9505 --- /dev/null +++ b/gst/rtp/gstrtpbvdepay.h @@ -0,0 +1,60 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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_RTP_BV_DEPAY_H__ +#define __GST_RTP_BV_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRTPBVDepay GstRTPBVDepay; +typedef struct _GstRTPBVDepayClass GstRTPBVDepayClass; + +#define GST_TYPE_RTP_BV_DEPAY \ + (gst_rtp_bv_depay_get_type()) +#define GST_RTP_BV_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_BV_DEPAY,GstRTPBVDepay)) +#define GST_RTP_BV_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_BV_DEPAY,GstRTPBVDepayClass)) +#define GST_IS_RTP_BV_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_BV_DEPAY)) +#define GST_IS_RTP_BV_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_BV_DEPAY)) + +struct _GstRTPBVDepay +{ + GstBaseRTPDepayload depayload; + + gint mode; +}; + +struct _GstRTPBVDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_bv_depay_get_type (void); + +gboolean gst_rtp_bv_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_BV_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpbvpay.c b/gst/rtp/gstrtpbvpay.c new file mode 100644 index 0000000..80eae8e --- /dev/null +++ b/gst/rtp/gstrtpbvpay.c @@ -0,0 +1,221 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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 +#include + +#include +#include "gstrtpbvpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpbvpay_debug); +#define GST_CAT_DEFAULT (rtpbvpay_debug) + +static GstStaticPadTemplate gst_rtp_bv_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-bv, " "mode = (int) {16, 32}") + ); + +static GstStaticPadTemplate gst_rtp_bv_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"BV16\";" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 16000, " "encoding-name = (string) \"BV32\"") + ); + + +static GstCaps *gst_rtp_bv_pay_sink_getcaps (GstBaseRTPPayload * payload, + GstPad * pad); +static gboolean gst_rtp_bv_pay_sink_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); + +GST_BOILERPLATE (GstRTPBVPay, gst_rtp_bv_pay, GstBaseRTPAudioPayload, + GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); + +static void +gst_rtp_bv_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_bv_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_bv_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP BV Payloader", + "Codec/Payloader/Network/RTP", + "Packetize BroadcomVoice audio streams into RTP packets (RFC 4298)", + "Wim Taymans "); +} + +static void +gst_rtp_bv_pay_class_init (GstRTPBVPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_bv_pay_sink_setcaps; + gstbasertppayload_class->get_caps = gst_rtp_bv_pay_sink_getcaps; + + GST_DEBUG_CATEGORY_INIT (rtpbvpay_debug, "rtpbvpay", 0, + "BroadcomVoice audio RTP payloader"); +} + +static void +gst_rtp_bv_pay_init (GstRTPBVPay * rtpbvpay, GstRTPBVPayClass * klass) +{ + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpbvpay); + + rtpbvpay->mode = -1; + + /* tell basertpaudiopayload that this is a frame based codec */ + gst_base_rtp_audio_payload_set_frame_based (basertpaudiopayload); +} + +static gboolean +gst_rtp_bv_pay_sink_setcaps (GstBaseRTPPayload * basertppayload, GstCaps * caps) +{ + GstRTPBVPay *rtpbvpay; + GstBaseRTPAudioPayload *basertpaudiopayload; + gint mode; + GstStructure *structure; + const char *payload_name; + + rtpbvpay = GST_RTP_BV_PAY (basertppayload); + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basertppayload); + + structure = gst_caps_get_structure (caps, 0); + + payload_name = gst_structure_get_name (structure); + if (g_ascii_strcasecmp ("audio/x-bv", payload_name)) + goto wrong_caps; + + if (!gst_structure_get_int (structure, "mode", &mode)) + goto no_mode; + + if (mode != 16 && mode != 32) + goto wrong_mode; + + if (mode == 16) { + gst_basertppayload_set_options (basertppayload, "audio", TRUE, "BV16", + 8000); + basertppayload->clock_rate = 8000; + } else { + gst_basertppayload_set_options (basertppayload, "audio", TRUE, "BV32", + 16000); + basertppayload->clock_rate = 16000; + } + + /* set options for this frame based audio codec */ + gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, + mode, mode == 16 ? 10 : 20); + + if (mode != rtpbvpay->mode && rtpbvpay->mode != -1) + goto mode_changed; + + rtpbvpay->mode = mode; + + return TRUE; + + /* ERRORS */ +wrong_caps: + { + GST_ERROR_OBJECT (rtpbvpay, "expected audio/x-bv, received %s", + payload_name); + return FALSE; + } +no_mode: + { + GST_ERROR_OBJECT (rtpbvpay, "did not receive a mode"); + return FALSE; + } +wrong_mode: + { + GST_ERROR_OBJECT (rtpbvpay, "mode must be 16 or 32, received %d", mode); + return FALSE; + } +mode_changed: + { + GST_ERROR_OBJECT (rtpbvpay, "Mode has changed from %d to %d! " + "Mode cannot change while streaming", rtpbvpay->mode, mode); + return FALSE; + } +} + +/* we return the padtemplate caps with the mode field fixated to a value if we + * can */ +static GstCaps * +gst_rtp_bv_pay_sink_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) +{ + GstCaps *otherpadcaps; + GstCaps *caps; + + otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + + if (otherpadcaps) { + if (!gst_caps_is_empty (otherpadcaps)) { + GstStructure *structure; + const gchar *mode_str; + gint mode; + + structure = gst_caps_get_structure (otherpadcaps, 0); + + /* construct mode, if we can */ + mode_str = gst_structure_get_string (structure, "encoding-name"); + if (mode_str) { + if (!strcmp (mode_str, "BV16")) + mode = 16; + else if (!strcmp (mode_str, "BV32")) + mode = 32; + else + mode = -1; + + if (mode == 16 || mode == 32) { + structure = gst_caps_get_structure (caps, 0); + gst_structure_set (structure, "mode", G_TYPE_INT, mode, NULL); + } + } + } + gst_caps_unref (otherpadcaps); + } + return caps; +} + +gboolean +gst_rtp_bv_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpbvpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_BV_PAY); +} diff --git a/gst/rtp/gstrtpbvpay.h b/gst/rtp/gstrtpbvpay.h new file mode 100644 index 0000000..58a6108 --- /dev/null +++ b/gst/rtp/gstrtpbvpay.h @@ -0,0 +1,60 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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_RTP_BV_PAY_H__ +#define __GST_RTP_BV_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_BV_PAY \ + (gst_rtp_bv_pay_get_type()) +#define GST_RTP_BV_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_BV_PAY,GstRTPBVPay)) +#define GST_RTP_BV_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_BV_PAY,GstRTPBVPayClass)) +#define GST_IS_RTP_BV_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_BV_PAY)) +#define GST_IS_RTP_BV_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_BV_PAY)) + +typedef struct _GstRTPBVPay GstRTPBVPay; +typedef struct _GstRTPBVPayClass GstRTPBVPayClass; + +struct _GstRTPBVPay +{ + GstBaseRTPAudioPayload audiopayload; + + gint mode; +}; + +struct _GstRTPBVPayClass +{ + GstBaseRTPAudioPayloadClass parent_class; +}; + +GType gst_rtp_bv_pay_get_type (void); + +gboolean gst_rtp_bv_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_BV_PAY_H__ */ diff --git a/gst/rtp/gstrtpceltdepay.c b/gst/rtp/gstrtpceltdepay.c new file mode 100644 index 0000000..b583efd --- /dev/null +++ b/gst/rtp/gstrtpceltdepay.c @@ -0,0 +1,275 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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 +#include +#include + +#include "gstrtpceltdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpceltdepay_debug); +#define GST_CAT_DEFAULT (rtpceltdepay_debug) + +/* RtpCELTDepay signals and args */ + +#define DEFAULT_FRAMESIZE 480 +#define DEFAULT_CHANNELS 1 +#define DEFAULT_CLOCKRATE 32000 + +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +static GstStaticPadTemplate gst_rtp_celt_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [32000, 48000], " + "encoding-name = (string) \"CELT\"") + ); + +static GstStaticPadTemplate gst_rtp_celt_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-celt") + ); + +static GstBuffer *gst_rtp_celt_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_celt_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRtpCELTDepay, gst_rtp_celt_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_celt_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_celt_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_celt_depay_sink_template); + gst_element_class_set_details_simple (element_class, "RTP CELT depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts CELT audio from RTP packets", + "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (rtpceltdepay_debug, "rtpceltdepay", 0, + "CELT RTP Depayloader"); +} + +static void +gst_rtp_celt_depay_class_init (GstRtpCELTDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_celt_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_celt_depay_setcaps; +} + +static void +gst_rtp_celt_depay_init (GstRtpCELTDepay * rtpceltdepay, + GstRtpCELTDepayClass * klass) +{ +} + +/* len 4 bytes LE, + * vendor string (len bytes), + * user_len 4 (0) bytes LE + */ +static const gchar gst_rtp_celt_comment[] = + "\045\0\0\0Depayloaded with GStreamer celtdepay\0\0\0\0"; + +static gboolean +gst_rtp_celt_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpCELTDepay *rtpceltdepay; + gint clock_rate, nb_channels = 0, frame_size = 0; + GstBuffer *buf; + guint8 *data; + const gchar *params; + GstCaps *srccaps; + gboolean res; + + rtpceltdepay = GST_RTP_CELT_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + goto no_clockrate; + depayload->clock_rate = clock_rate; + + if ((params = gst_structure_get_string (structure, "encoding-params"))) + nb_channels = atoi (params); + if (!nb_channels) + nb_channels = DEFAULT_CHANNELS; + + if ((params = gst_structure_get_string (structure, "frame-size"))) + frame_size = atoi (params); + if (!frame_size) + frame_size = DEFAULT_FRAMESIZE; + rtpceltdepay->frame_size = frame_size; + + GST_DEBUG_OBJECT (depayload, "clock-rate=%d channels=%d frame-size=%d", + clock_rate, nb_channels, frame_size); + + /* construct minimal header and comment packet for the decoder */ + buf = gst_buffer_new_and_alloc (60); + data = GST_BUFFER_DATA (buf); + memcpy (data, "CELT ", 8); + data += 8; + memcpy (data, "1.1.12", 7); + data += 20; + GST_WRITE_UINT32_LE (data, 0x80000006); /* version */ + data += 4; + GST_WRITE_UINT32_LE (data, 56); /* header_size */ + data += 4; + GST_WRITE_UINT32_LE (data, clock_rate); /* rate */ + data += 4; + GST_WRITE_UINT32_LE (data, nb_channels); /* channels */ + data += 4; + GST_WRITE_UINT32_LE (data, frame_size); /* frame-size */ + data += 4; + GST_WRITE_UINT32_LE (data, -1); /* overlap */ + data += 4; + GST_WRITE_UINT32_LE (data, -1); /* bytes_per_packet */ + data += 4; + GST_WRITE_UINT32_LE (data, 0); /* extra headers */ + + srccaps = gst_caps_new_simple ("audio/x-celt", NULL); + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpceltdepay), buf); + + buf = gst_buffer_new_and_alloc (sizeof (gst_rtp_celt_comment)); + memcpy (GST_BUFFER_DATA (buf), gst_rtp_celt_comment, + sizeof (gst_rtp_celt_comment)); + + gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpceltdepay), buf); + + return res; + + /* ERRORS */ +no_clockrate: + { + GST_ERROR_OBJECT (depayload, "no clock-rate specified"); + return FALSE; + } +} + +static GstBuffer * +gst_rtp_celt_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstBuffer *outbuf = NULL; + guint8 *payload; + guint offset, pos, payload_len, total_size, size; + guint8 s; + gint clock_rate = 0, frame_size = 0; + GstClockTime framesize_ns = 0, timestamp; + guint n = 0; + GstRtpCELTDepay *rtpceltdepay; + + rtpceltdepay = GST_RTP_CELT_DEPAY (depayload); + clock_rate = depayload->clock_rate; + frame_size = rtpceltdepay->frame_size; + framesize_ns = gst_util_uint64_scale_int (frame_size, GST_SECOND, clock_rate); + + timestamp = GST_BUFFER_TIMESTAMP (buf); + + GST_LOG_OBJECT (depayload, "got %d bytes, mark %d ts %u seqn %d", + GST_BUFFER_SIZE (buf), + gst_rtp_buffer_get_marker (buf), + gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); + + GST_LOG_OBJECT (depayload, "got clock-rate=%d, frame_size=%d, " + "_ns=%" GST_TIME_FORMAT ", timestamp=%" GST_TIME_FORMAT, clock_rate, + frame_size, GST_TIME_ARGS (framesize_ns), GST_TIME_ARGS (timestamp)); + + payload = gst_rtp_buffer_get_payload (buf); + payload_len = gst_rtp_buffer_get_payload_len (buf); + + /* first count how many bytes are consumed by the size headers and make offset + * point to the first data byte */ + total_size = 0; + offset = 0; + while (total_size < payload_len) { + do { + s = payload[offset++]; + total_size += s + 1; + } while (s == 0xff); + } + + /* offset is now pointing to the payload */ + total_size = 0; + pos = 0; + while (total_size < payload_len) { + n++; + size = 0; + do { + s = payload[pos++]; + size += s; + total_size += size + 1; + } while (s == 0xff); + + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, offset, size); + offset += size; + + if (frame_size != -1 && clock_rate != -1) { + GST_BUFFER_TIMESTAMP (outbuf) = timestamp + framesize_ns * n; + GST_BUFFER_DURATION (outbuf) = framesize_ns; + } + GST_LOG_OBJECT (depayload, "push timestamp=%" + GST_TIME_FORMAT ", duration=%" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf))); + + gst_base_rtp_depayload_push (depayload, outbuf); + } + return NULL; +} + +gboolean +gst_rtp_celt_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpceltdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_CELT_DEPAY); +} diff --git a/gst/rtp/gstrtpceltdepay.h b/gst/rtp/gstrtpceltdepay.h new file mode 100644 index 0000000..cfdc220 --- /dev/null +++ b/gst/rtp/gstrtpceltdepay.h @@ -0,0 +1,54 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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 + */ + +#ifndef __GST_RTP_CELT_DEPAY_H__ +#define __GST_RTP_CELT_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpCELTDepay GstRtpCELTDepay; +typedef struct _GstRtpCELTDepayClass GstRtpCELTDepayClass; + +#define GST_TYPE_RTP_CELT_DEPAY \ + (gst_rtp_celt_depay_get_type()) +#define GST_RTP_CELT_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_CELT_DEPAY,GstRtpCELTDepay)) +#define GST_RTP_CELT_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_CELT_DEPAY,GstRtpCELTDepayClass)) +#define GST_IS_RTP_CELT_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_CELT_DEPAY)) +#define GST_IS_RTP_CELT_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_CELT_DEPAY)) + +struct _GstRtpCELTDepay +{ + GstBaseRTPDepayload depayload; + gint frame_size; +}; + +struct _GstRtpCELTDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_celt_depay_get_type (void); + +gboolean gst_rtp_celt_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_CELT_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpceltpay.c b/gst/rtp/gstrtpceltpay.c new file mode 100644 index 0000000..c727efc --- /dev/null +++ b/gst/rtp/gstrtpceltpay.c @@ -0,0 +1,477 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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 +#include +#include + +#include "gstrtpceltpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpceltpay_debug); +#define GST_CAT_DEFAULT (rtpceltpay_debug) + +static GstStaticPadTemplate gst_rtp_celt_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-celt, " + "rate = (int) [ 32000, 64000 ], " + "channels = (int) [1, 2], " "frame-size = (int) [ 64, 512 ]") + ); + +static GstStaticPadTemplate gst_rtp_celt_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [ 32000, 48000 ], " + "encoding-name = (string) \"CELT\"") + ); + +static void gst_rtp_celt_pay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_celt_pay_change_state (GstElement * + element, GstStateChange transition); + +static gboolean gst_rtp_celt_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstCaps *gst_rtp_celt_pay_getcaps (GstBaseRTPPayload * payload, + GstPad * pad); +static GstFlowReturn gst_rtp_celt_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpCELTPay, gst_rtp_celt_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_celt_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_celt_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_celt_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP CELT payloader", + "Codec/Payloader/Network/RTP", + "Payload-encodes CELT audio into a RTP packet", + "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (rtpceltpay_debug, "rtpceltpay", 0, + "CELT RTP Payloader"); +} + +static void +gst_rtp_celt_pay_class_init (GstRtpCELTPayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_celt_pay_finalize; + + gstelement_class->change_state = gst_rtp_celt_pay_change_state; + + gstbasertppayload_class->set_caps = gst_rtp_celt_pay_setcaps; + gstbasertppayload_class->get_caps = gst_rtp_celt_pay_getcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_celt_pay_handle_buffer; +} + +static void +gst_rtp_celt_pay_init (GstRtpCELTPay * rtpceltpay, GstRtpCELTPayClass * klass) +{ + rtpceltpay->queue = g_queue_new (); +} + +static void +gst_rtp_celt_pay_finalize (GObject * object) +{ + GstRtpCELTPay *rtpceltpay; + + rtpceltpay = GST_RTP_CELT_PAY (object); + + g_queue_free (rtpceltpay->queue); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_rtp_celt_pay_clear_queued (GstRtpCELTPay * rtpceltpay) +{ + GstBuffer *buf; + + while ((buf = g_queue_pop_head (rtpceltpay->queue))) + gst_buffer_unref (buf); + + rtpceltpay->bytes = 0; + rtpceltpay->sbytes = 0; + rtpceltpay->qduration = 0; +} + +static void +gst_rtp_celt_pay_add_queued (GstRtpCELTPay * rtpceltpay, GstBuffer * buffer, + guint ssize, guint size, GstClockTime duration) +{ + g_queue_push_tail (rtpceltpay->queue, buffer); + rtpceltpay->sbytes += ssize; + rtpceltpay->bytes += size; + /* only add durations when we have a valid previous duration */ + if (rtpceltpay->qduration != -1) { + if (duration != -1) + /* only add valid durations */ + rtpceltpay->qduration += duration; + else + /* if we add a buffer without valid duration, our total queued duration + * becomes unknown */ + rtpceltpay->qduration = -1; + } +} + +static gboolean +gst_rtp_celt_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + /* don't configure yet, we wait for the ident packet */ + return TRUE; +} + + +static GstCaps * +gst_rtp_celt_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad) +{ + GstCaps *otherpadcaps; + GstCaps *caps; + const gchar *params; + + otherpadcaps = gst_pad_get_allowed_caps (payload->srcpad); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + + if (otherpadcaps) { + if (!gst_caps_is_empty (otherpadcaps)) { + GstStructure *ps = gst_caps_get_structure (otherpadcaps, 0); + GstStructure *s = gst_caps_get_structure (caps, 0); + gint clock_rate = 0, frame_size = 0, channels = 1; + + if (gst_structure_get_int (ps, "clock-rate", &clock_rate)) { + gst_structure_fixate_field_nearest_int (s, "rate", clock_rate); + } + + if ((params = gst_structure_get_string (ps, "frame-size"))) + frame_size = atoi (params); + if (frame_size) + gst_structure_set (s, "frame-size", G_TYPE_INT, frame_size, NULL); + + if ((params = gst_structure_get_string (ps, "encoding-params"))) { + channels = atoi (params); + gst_structure_fixate_field_nearest_int (s, "channels", channels); + } + + GST_DEBUG_OBJECT (payload, "clock-rate=%d frame-size=%d channels=%d", + clock_rate, frame_size, channels); + } + gst_caps_unref (otherpadcaps); + } + + return caps; +} + +static gboolean +gst_rtp_celt_pay_parse_ident (GstRtpCELTPay * rtpceltpay, + const guint8 * data, guint size) +{ + guint32 version, header_size, rate, nb_channels, frame_size, overlap; + guint32 bytes_per_packet; + GstBaseRTPPayload *payload; + gchar *cstr, *fsstr; + gboolean res; + + /* we need the header string (8), the version string (20), the version + * and the header length. */ + if (size < 36) + goto too_small; + + if (!g_str_has_prefix ((const gchar *) data, "CELT ")) + goto wrong_header; + + /* skip header and version string */ + data += 28; + + version = GST_READ_UINT32_LE (data); + GST_DEBUG_OBJECT (rtpceltpay, "version %08x", version); +#if 0 + if (version != 1) + goto wrong_version; +#endif + + data += 4; + /* ensure sizes */ + header_size = GST_READ_UINT32_LE (data); + if (header_size < 56) + goto header_too_small; + + if (size < header_size) + goto payload_too_small; + + data += 4; + rate = GST_READ_UINT32_LE (data); + data += 4; + nb_channels = GST_READ_UINT32_LE (data); + data += 4; + frame_size = GST_READ_UINT32_LE (data); + data += 4; + overlap = GST_READ_UINT32_LE (data); + data += 4; + bytes_per_packet = GST_READ_UINT32_LE (data); + + GST_DEBUG_OBJECT (rtpceltpay, "rate %d, nb_channels %d, frame_size %d", + rate, nb_channels, frame_size); + GST_DEBUG_OBJECT (rtpceltpay, "overlap %d, bytes_per_packet %d", + overlap, bytes_per_packet); + + payload = GST_BASE_RTP_PAYLOAD (rtpceltpay); + + gst_basertppayload_set_options (payload, "audio", FALSE, "CELT", rate); + cstr = g_strdup_printf ("%d", nb_channels); + fsstr = g_strdup_printf ("%d", frame_size); + res = gst_basertppayload_set_outcaps (payload, "encoding-params", + G_TYPE_STRING, cstr, "frame-size", G_TYPE_STRING, fsstr, NULL); + g_free (cstr); + g_free (fsstr); + + return res; + + /* ERRORS */ +too_small: + { + GST_DEBUG_OBJECT (rtpceltpay, + "ident packet too small, need at least 32 bytes"); + return FALSE; + } +wrong_header: + { + GST_DEBUG_OBJECT (rtpceltpay, + "ident packet does not start with \"CELT \""); + return FALSE; + } +#if 0 +wrong_version: + { + GST_DEBUG_OBJECT (rtpceltpay, "can only handle version 1, have version %d", + version); + return FALSE; + } +#endif +header_too_small: + { + GST_DEBUG_OBJECT (rtpceltpay, + "header size too small, need at least 80 bytes, " "got only %d", + header_size); + return FALSE; + } +payload_too_small: + { + GST_DEBUG_OBJECT (rtpceltpay, + "payload too small, need at least %d bytes, got only %d", header_size, + size); + return FALSE; + } +} + +static GstFlowReturn +gst_rtp_celt_pay_flush_queued (GstRtpCELTPay * rtpceltpay) +{ + GstFlowReturn ret; + GstBuffer *buf, *outbuf; + guint8 *payload, *spayload; + guint payload_len; + GstClockTime duration; + + payload_len = rtpceltpay->bytes + rtpceltpay->sbytes; + duration = rtpceltpay->qduration; + + GST_DEBUG_OBJECT (rtpceltpay, "flushing out %u, duration %" GST_TIME_FORMAT, + payload_len, GST_TIME_ARGS (rtpceltpay->qduration)); + + /* get a big enough packet for the sizes + payloads */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + + GST_BUFFER_DURATION (outbuf) = duration; + + /* point to the payload for size headers and data */ + spayload = gst_rtp_buffer_get_payload (outbuf); + payload = spayload + rtpceltpay->sbytes; + + while ((buf = g_queue_pop_head (rtpceltpay->queue))) { + guint size; + + /* copy first timestamp to output */ + if (GST_BUFFER_TIMESTAMP (outbuf) == -1) + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); + + /* write the size to the header */ + size = GST_BUFFER_SIZE (buf); + while (size > 0xff) { + *spayload++ = 0xff; + size -= 0xff; + } + *spayload++ = size; + + size = GST_BUFFER_SIZE (buf); + /* copy payload */ + memcpy (payload, GST_BUFFER_DATA (buf), size); + payload += size; + + gst_buffer_unref (buf); + } + + /* we consumed it all */ + rtpceltpay->bytes = 0; + rtpceltpay->sbytes = 0; + rtpceltpay->qduration = 0; + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpceltpay), outbuf); + + return ret; +} + +static GstFlowReturn +gst_rtp_celt_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstFlowReturn ret; + GstRtpCELTPay *rtpceltpay; + guint size, payload_len; + guint8 *data; + GstClockTime duration, packet_dur; + guint i, ssize, packet_len; + + rtpceltpay = GST_RTP_CELT_PAY (basepayload); + + ret = GST_FLOW_OK; + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + + switch (rtpceltpay->packet) { + case 0: + /* ident packet. We need to parse the headers to construct the RTP + * properties. */ + if (!gst_rtp_celt_pay_parse_ident (rtpceltpay, data, size)) + goto parse_error; + + goto done; + case 1: + /* comment packet, we ignore it */ + goto done; + default: + /* other packets go in the payload */ + break; + } + + duration = GST_BUFFER_DURATION (buffer); + + GST_LOG_OBJECT (rtpceltpay, + "got buffer of duration %" GST_TIME_FORMAT ", size %u", + GST_TIME_ARGS (duration), size); + + /* calculate the size of the size field and the payload */ + ssize = 1; + for (i = size; i > 0xff; i -= 0xff) + ssize++; + + GST_DEBUG_OBJECT (rtpceltpay, "bytes for size %u", ssize); + + /* calculate what the new size and duration would be of the packet */ + payload_len = ssize + size + rtpceltpay->bytes + rtpceltpay->sbytes; + if (rtpceltpay->qduration != -1 && duration != -1) + packet_dur = rtpceltpay->qduration + duration; + else + packet_dur = 0; + + packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0); + + if (gst_basertppayload_is_filled (basepayload, packet_len, packet_dur)) { + /* size or duration would overflow the packet, flush the queued data */ + ret = gst_rtp_celt_pay_flush_queued (rtpceltpay); + } + + /* queue the packet */ + gst_rtp_celt_pay_add_queued (rtpceltpay, buffer, ssize, size, duration); + +done: + rtpceltpay->packet++; + + return ret; + + /* ERRORS */ +parse_error: + { + GST_ELEMENT_ERROR (rtpceltpay, STREAM, DECODE, (NULL), + ("Error parsing first identification packet.")); + return GST_FLOW_ERROR; + } +} + +static GstStateChangeReturn +gst_rtp_celt_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstRtpCELTPay *rtpceltpay; + GstStateChangeReturn ret; + + rtpceltpay = GST_RTP_CELT_PAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + rtpceltpay->packet = 0; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_celt_pay_clear_queued (rtpceltpay); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_celt_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpceltpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_CELT_PAY); +} diff --git a/gst/rtp/gstrtpceltpay.h b/gst/rtp/gstrtpceltpay.h new file mode 100644 index 0000000..9213bf8 --- /dev/null +++ b/gst/rtp/gstrtpceltpay.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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 + */ + + +#ifndef __GST_RTP_CELT_PAY_H__ +#define __GST_RTP_CELT_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpCELTPay GstRtpCELTPay; +typedef struct _GstRtpCELTPayClass GstRtpCELTPayClass; + +#define GST_TYPE_RTP_CELT_PAY \ + (gst_rtp_celt_pay_get_type()) +#define GST_RTP_CELT_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_CELT_PAY,GstRtpCELTPay)) +#define GST_RTP_CELT_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_CELT_PAY,GstRtpCELTPayClass)) +#define GST_IS_RTP_CELT_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_CELT_PAY)) +#define GST_IS_RTP_CELT_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_CELT_PAY)) + +struct _GstRtpCELTPay +{ + GstBaseRTPPayload payload; + + guint64 packet; + + /* queue to hold packets */ + GQueue *queue; + guint sbytes; /* bytes queued for sizes */ + guint bytes; /* bytes queued for data */ + GstClockTime qduration; /* queued duration */ +}; + +struct _GstRtpCELTPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_celt_pay_get_type (void); + +gboolean gst_rtp_celt_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_CELT_PAY_H__ */ diff --git a/gst/rtp/gstrtpchannels.c b/gst/rtp/gstrtpchannels.c new file mode 100644 index 0000000..2ce4280 --- /dev/null +++ b/gst/rtp/gstrtpchannels.c @@ -0,0 +1,167 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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 +#include + +#include "gstrtpchannels.h" + +/* + * RTP channel positions as discussed in RFC 3551 and also RFC 3555 + * + * We can't really represent the described channel positions in GStreamer but we + * implement a (very rough) approximation here. + */ + +static gboolean +check_channels (const GstRTPChannelOrder * order, + const GstAudioChannelPosition * pos) +{ + gint i; + gboolean res = TRUE; + + for (i = 0; i < order->channels; i++) { + if (order->pos[i] != pos[i]) { + res = FALSE; + break; + } + } + return res; +} + +/** + * gst_rtp_channels_get_by_pos: + * @channels: the amount of channels + * @pos: a channel layout + * + * Return a description of the channel layout. + * + * Returns: a #GstRTPChannelOrder with the channel information or NULL when @pos + * is not a valid layout. + */ +const GstRTPChannelOrder * +gst_rtp_channels_get_by_pos (gint channels, const GstAudioChannelPosition * pos) +{ + gint i; + const GstRTPChannelOrder *res = NULL; + + g_return_val_if_fail (pos != NULL, NULL); + + for (i = 0; channel_orders[i].pos; i++) { + if (channel_orders[i].channels != channels) + continue; + + if (check_channels (&channel_orders[i], pos)) { + res = &channel_orders[i]; + break; + } + } + return res; +} + +/** + * gst_rtp_channels_create_default: + * @channels: the amount of channels + * @order: a channel order + * + * Get the channel order info the @order and @channels. + * + * Returns: a #GstRTPChannelOrder with the channel information or NULL when + * @order is not a know layout for @channels. + */ +const GstRTPChannelOrder * +gst_rtp_channels_get_by_order (gint channels, const gchar * order) +{ + gint i; + const GstRTPChannelOrder *res = NULL; + + for (i = 0; channel_orders[i].pos; i++) { + if (channel_orders[i].channels != channels) + continue; + + /* no name but channels match, continue */ + if (!channel_orders[i].name || !order) { + res = &channel_orders[i]; + break; + } + + /* compare names */ + if (g_ascii_strcasecmp (channel_orders[i].name, order)) { + res = &channel_orders[i]; + break; + } + } + return res; +} + +/** + * gst_rtp_channels_get_by_index: + * @channels: the amount of channels + * @idx: the channel index to retrieve + * + * Get the allowed channel order descriptions for @channels. @idx can be used to + * retrieve the desired index. + * + * Returns: a #GstRTPChannelOrder at @idx, NULL when there are no valid channel + * orders. + */ +const GstRTPChannelOrder * +gst_rtp_channels_get_by_index (gint channels, guint idx) +{ + gint i; + const GstRTPChannelOrder *res = NULL; + + for (i = 0; channel_orders[i].pos; i++) { + if (channel_orders[i].channels != channels) + continue; + + if (idx == 0) { + res = &channel_orders[i]; + break; + } + idx--; + } + return res; +} + + +/** + * gst_rtp_channels_create_default: + * @channels: the amount of channels + * + * Create a default none channel mapping for @channels. + * + * Returns: a #GstAudioChannelPosition with all the channel position info set to + * #GST_AUDIO_CHANNEL_POSITION_NONE. + */ +GstAudioChannelPosition * +gst_rtp_channels_create_default (gint channels) +{ + gint i; + GstAudioChannelPosition *posn; + + g_return_val_if_fail (channels > 0, NULL); + + posn = g_new (GstAudioChannelPosition, channels); + + for (i = 0; i < channels; i++) + posn[i] = GST_AUDIO_CHANNEL_POSITION_NONE; + + return posn; +} diff --git a/gst/rtp/gstrtpchannels.h b/gst/rtp/gstrtpchannels.h new file mode 100644 index 0000000..b99a200 --- /dev/null +++ b/gst/rtp/gstrtpchannels.h @@ -0,0 +1,186 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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 +#include + +#include +#include + +typedef struct +{ + const gchar *name; + gint channels; + const GstAudioChannelPosition *pos; +} GstRTPChannelOrder; + +static const GstAudioChannelPosition pos_4_1[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT +}; + +static const GstAudioChannelPosition pos_4_2[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE +}; + +static const GstAudioChannelPosition pos_4_3[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE +}; + +static const GstAudioChannelPosition pos_5_1[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER +}; + +static const GstAudioChannelPosition pos_6_1[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE +}; + +static const GstAudioChannelPosition pos_6_2[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT +}; + +static const GstAudioChannelPosition pos_8_1[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT +}; + +static const GstAudioChannelPosition pos_8_2[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT +}; + +static const GstAudioChannelPosition pos_8_3[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT +}; + +static const GstAudioChannelPosition pos_def_1[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_MONO +}; + +static const GstAudioChannelPosition pos_def_2[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT +}; + +static const GstAudioChannelPosition pos_def_3[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER +}; + +static const GstAudioChannelPosition pos_def_4[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_LFE +}; + +static const GstAudioChannelPosition pos_def_5[] = { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT +}; + +static const GstAudioChannelPosition pos_def_6[] = { + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_LFE +}; + +static const GstRTPChannelOrder channel_orders[] = +{ + /* 4 channels */ + { "DV.LRLsRs", 4, pos_4_1 }, + { "DV.LRCS", 4, pos_4_2 }, + { "DV.LRCWo", 4, pos_4_3 }, + /* 5 channels */ + { "DV.LRLsRsC", 5, pos_5_1 }, + /* 6 channels */ + { "DV.LRLsRsCS", 6, pos_6_1 }, + { "DV.LmixRmixTWoQ1Q2", 6, pos_6_2 }, + /* 8 channels */ + { "DV.LRCWoLsRsLmixRmix", 8, pos_8_1 }, + { "DV.LRCWoLs1Rs1Ls2Rs2", 8, pos_8_2 }, + { "DV.LRCWoLsRsLcRc", 8, pos_8_3 }, + + /* default layouts */ + { NULL, 1, pos_def_1 }, + { NULL, 2, pos_def_2 }, + { NULL, 3, pos_def_3 }, + { NULL, 4, pos_def_4 }, + { NULL, 5, pos_def_5 }, + { NULL, 6, pos_def_6 }, + + /* terminator, invalid entry */ + { NULL, 0, NULL }, +}; + +const GstRTPChannelOrder * gst_rtp_channels_get_by_pos (gint channels, + const GstAudioChannelPosition *pos); +const GstRTPChannelOrder * gst_rtp_channels_get_by_order (gint channels, + const gchar *order); +const GstRTPChannelOrder * gst_rtp_channels_get_by_index (gint channels, guint idx); + +GstAudioChannelPosition * gst_rtp_channels_create_default (gint channels); diff --git a/gst/rtp/gstrtpdepay.c b/gst/rtp/gstrtpdepay.c new file mode 100644 index 0000000..0e05ccd --- /dev/null +++ b/gst/rtp/gstrtpdepay.c @@ -0,0 +1,162 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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. + */ +/* Element-Checklist-Version: 5 */ + +#include "gstrtpdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpdepay_debug); +#define GST_CAT_DEFAULT (rtpdepay_debug) + +static GstStaticPadTemplate gst_rtp_depay_src_rtp_template = +GST_STATIC_PAD_TEMPLATE ("srcrtp", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate gst_rtp_depay_src_rtcp_template = +GST_STATIC_PAD_TEMPLATE ("srcrtcp", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate gst_rtp_depay_sink_rtp_template = +GST_STATIC_PAD_TEMPLATE ("sinkrtp", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate gst_rtp_depay_sink_rtcp_template = +GST_STATIC_PAD_TEMPLATE ("sinkrtcp", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstCaps *gst_rtp_depay_getcaps (GstPad * pad); +static GstFlowReturn gst_rtp_depay_chain_rtp (GstPad * pad, GstBuffer * buffer); +static GstFlowReturn gst_rtp_depay_chain_rtcp (GstPad * pad, + GstBuffer * buffer); + +GST_BOILERPLATE (GstRTPDepay, gst_rtp_depay, GstElement, GST_TYPE_ELEMENT); + +static void +gst_rtp_depay_base_init (gpointer klass) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rtp_depay_src_rtp_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rtp_depay_src_rtcp_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rtp_depay_sink_rtp_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rtp_depay_sink_rtcp_template); + gst_element_class_set_details_simple (gstelement_class, + "Dummy RTP session manager", "Codec/Depayloader/Network/RTP", + "Accepts raw RTP and RTCP packets and sends them forward", + "Wim Taymans "); +} + +static void +gst_rtp_depay_class_init (GstRTPDepayClass * klass) +{ + GST_DEBUG_CATEGORY_INIT (rtpdepay_debug, "rtpdepay", 0, "RTP decoder"); +} + +static void +gst_rtp_depay_init (GstRTPDepay * rtpdepay, GstRTPDepayClass * klass) +{ + /* the input rtp pad */ + rtpdepay->sink_rtp = + gst_pad_new_from_static_template (&gst_rtp_depay_sink_rtp_template, + "sinkrtp"); + gst_element_add_pad (GST_ELEMENT (rtpdepay), rtpdepay->sink_rtp); + gst_pad_set_getcaps_function (rtpdepay->sink_rtp, gst_rtp_depay_getcaps); + gst_pad_set_chain_function (rtpdepay->sink_rtp, gst_rtp_depay_chain_rtp); + + /* the input rtcp pad */ + rtpdepay->sink_rtcp = + gst_pad_new_from_static_template (&gst_rtp_depay_sink_rtcp_template, + "sinkrtcp"); + gst_element_add_pad (GST_ELEMENT (rtpdepay), rtpdepay->sink_rtcp); + gst_pad_set_chain_function (rtpdepay->sink_rtcp, gst_rtp_depay_chain_rtcp); + + /* the output rtp pad */ + rtpdepay->src_rtp = + gst_pad_new_from_static_template (&gst_rtp_depay_src_rtp_template, + "srcrtp"); + gst_pad_set_getcaps_function (rtpdepay->src_rtp, gst_rtp_depay_getcaps); + gst_element_add_pad (GST_ELEMENT (rtpdepay), rtpdepay->src_rtp); + + /* the output rtcp pad */ + rtpdepay->src_rtcp = + gst_pad_new_from_static_template (&gst_rtp_depay_src_rtcp_template, + "srcrtcp"); + gst_element_add_pad (GST_ELEMENT (rtpdepay), rtpdepay->src_rtcp); +} + +static GstCaps * +gst_rtp_depay_getcaps (GstPad * pad) +{ + GstRTPDepay *src; + GstPad *other; + GstCaps *caps; + + src = GST_RTP_DEPAY (GST_PAD_PARENT (pad)); + + other = pad == src->src_rtp ? src->sink_rtp : src->src_rtp; + + caps = gst_pad_peer_get_caps (other); + + if (caps == NULL) + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + + return caps; +} + +static GstFlowReturn +gst_rtp_depay_chain_rtp (GstPad * pad, GstBuffer * buffer) +{ + GstRTPDepay *src; + + src = GST_RTP_DEPAY (GST_PAD_PARENT (pad)); + + GST_DEBUG ("got rtp packet"); + return gst_pad_push (src->src_rtp, buffer); +} + +static GstFlowReturn +gst_rtp_depay_chain_rtcp (GstPad * pad, GstBuffer * buffer) +{ + GST_DEBUG ("got rtcp packet"); + + gst_buffer_unref (buffer); + return GST_FLOW_OK; +} + +gboolean +gst_rtp_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpdepay", + GST_RANK_MARGINAL, GST_TYPE_RTP_DEPAY); +} diff --git a/gst/rtp/gstrtpdepay.h b/gst/rtp/gstrtpdepay.h new file mode 100644 index 0000000..b2b4683 --- /dev/null +++ b/gst/rtp/gstrtpdepay.h @@ -0,0 +1,55 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_DEPAY_H__ +#define __GST_RTP_DEPAY_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_DEPAY (gst_rtp_depay_get_type()) +#define GST_IS_RTP_DEPAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DEPAY)) +#define GST_IS_RTP_DEPAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DEPAY)) +#define GST_RTP_DEPAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DEPAY, GstRTPDepay)) +#define GST_RTP_DEPAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DEPAY, GstRTPDepayClass)) + +typedef struct _GstRTPDepay GstRTPDepay; +typedef struct _GstRTPDepayClass GstRTPDepayClass; + +struct _GstRTPDepay { + GstElement element; + + GstPad *sink_rtp; + GstPad *sink_rtcp; + GstPad *src_rtp; + GstPad *src_rtcp; +}; + +struct _GstRTPDepayClass { + GstElementClass parent_class; +}; + +gboolean gst_rtp_depay_plugin_init (GstPlugin * plugin); + +GType gst_rtp_depay_get_type(void); + +G_END_DECLS + +#endif /* __GST_RTP_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpdvdepay.c b/gst/rtp/gstrtpdvdepay.c new file mode 100644 index 0000000..4098c39 --- /dev/null +++ b/gst/rtp/gstrtpdvdepay.c @@ -0,0 +1,413 @@ +/* Farsight + * Copyright (C) 2006 Marcel Moreaux + * (C) 2008 Wim Taymans + * + * 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. + */ + +/* + * RTP DV depayloader. + * + * Important note for NTSC-users: + * + * Because the author uses PAL video, and he does not have proper DV + * documentation (the DV format specification is not freely available), + * this code may very well contain PAL-specific assumptions. + */ + +#include +#include +#include + +#include "gstrtpdvdepay.h" + +GST_DEBUG_CATEGORY (rtpdvdepay_debug); +#define GST_CAT_DEFAULT (rtpdvdepay_debug) +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, +}; + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-dv") + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) { \"video\", \"audio\" }," + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "encoding-name = (string) \"DV\", " + "clock-rate = (int) 90000," + "encode = (string) { \"SD-VCR/525-60\", \"SD-VCR/625-50\", \"HD-VCR/1125-60\"," + "\"HD-VCR/1250-50\", \"SDL-VCR/525-60\", \"SDL-VCR/625-50\"," + "\"306M/525-60\", \"306M/625-50\", \"314M-25/525-60\"," + "\"314M-25/625-50\", \"314M-50/525-60\", \"314M-50/625-50\" }" + /* optional parameters can't go in the template + * "audio = (string) { \"bundled\", \"none\" }" + */ + ) + ); + +static GstStateChangeReturn +gst_rtp_dv_depay_change_state (GstElement * element, GstStateChange transition); + +static GstBuffer *gst_rtp_dv_depay_process (GstBaseRTPDepayload * base, + GstBuffer * in); +static gboolean gst_rtp_dv_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRTPDVDepay, gst_rtp_dv_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD) + + static void gst_rtp_dv_depay_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "RTP DV Depayloader", + "Codec/Depayloader/Network/RTP", + "Depayloads DV from RTP packets (RFC 3189)", + "Marcel Moreaux , Wim Taymans "); +} + +/* initialize the plugin's class */ +static void +gst_rtp_dv_depay_class_init (GstRTPDVDepayClass * klass) +{ + GstElementClass *gstelement_class = (GstElementClass *) klass; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class = + (GstBaseRTPDepayloadClass *) klass; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_rtp_dv_depay_change_state); + + gstbasertpdepayload_class->process = + GST_DEBUG_FUNCPTR (gst_rtp_dv_depay_process); + gstbasertpdepayload_class->set_caps = + GST_DEBUG_FUNCPTR (gst_rtp_dv_depay_setcaps); + + GST_DEBUG_CATEGORY_INIT (rtpdvdepay_debug, "rtpdvdepay", 0, + "DV RTP Depayloader"); +} + +/* initialize the new element + * instantiate pads and add them to element + * set functions + * initialize structure + */ +static void +gst_rtp_dv_depay_init (GstRTPDVDepay * filter, GstRTPDVDepayClass * klass) +{ +} + +static gboolean +parse_encode (GstRTPDVDepay * rtpdvdepay, const gchar * encode) +{ + rtpdvdepay->width = 720; + if (!strcmp (encode, "314M-25/525-60")) { + rtpdvdepay->frame_size = 240000; + rtpdvdepay->height = 480; + rtpdvdepay->rate_num = 30000; + rtpdvdepay->rate_denom = 1001; + } else if (!strcmp (encode, "SD-VCR/525-60")) { + rtpdvdepay->frame_size = 120000; + rtpdvdepay->height = 480; + rtpdvdepay->rate_num = 30000; + rtpdvdepay->rate_denom = 1001; + } else if (!strcmp (encode, "314M-50/625-50")) { + rtpdvdepay->frame_size = 288000; + rtpdvdepay->height = 576; + rtpdvdepay->rate_num = 25; + rtpdvdepay->rate_denom = 1; + } else if (!strcmp (encode, "SD-VCR/625-50")) { + rtpdvdepay->frame_size = 144000; + rtpdvdepay->height = 576; + rtpdvdepay->rate_num = 25; + rtpdvdepay->rate_denom = 1; + } else if (!strcmp (encode, "314M-25/625-50")) { + rtpdvdepay->frame_size = 144000; + rtpdvdepay->height = 576; + rtpdvdepay->rate_num = 25; + rtpdvdepay->rate_denom = 1; + } else + rtpdvdepay->frame_size = -1; + + return rtpdvdepay->frame_size != -1; +} + +static gboolean +gst_rtp_dv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRTPDVDepay *rtpdvdepay; + GstCaps *srccaps; + gint clock_rate; + gboolean systemstream, ret; + const gchar *encode, *media; + + rtpdvdepay = GST_RTP_DV_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + /* we really need the encode property to figure out the frame size, it's also + * required by the spec */ + if (!(encode = gst_structure_get_string (structure, "encode"))) + goto no_encode; + + /* figure out the size of one frame */ + if (!parse_encode (rtpdvdepay, encode)) + goto unknown_encode; + + /* check the media, this tells us that the stream has video or not */ + if (!(media = gst_structure_get_string (structure, "media"))) + goto no_media; + + systemstream = FALSE; + + if (!strcmp (media, "audio")) { + /* we need a demuxer for audio only */ + systemstream = TRUE; + } else if (!strcmp (media, "video")) { + const gchar *audio; + + /* check the optional audio field, if it's present and set to bundled, we + * are dealing with a system stream. */ + if ((audio = gst_structure_get_string (structure, "audio"))) { + if (!strcmp (audio, "bundled")) + systemstream = TRUE; + } + } + + /* allocate accumulator */ + rtpdvdepay->acc = gst_buffer_new_and_alloc (rtpdvdepay->frame_size); + + /* Initialize the new accumulator frame. + * If the previous frame exists, copy that into the accumulator frame. + * This way, missing packets in the stream won't show up badly. */ + memset (GST_BUFFER_DATA (rtpdvdepay->acc), 0, rtpdvdepay->frame_size); + + srccaps = gst_caps_new_simple ("video/x-dv", + "systemstream", G_TYPE_BOOLEAN, systemstream, + "width", G_TYPE_INT, rtpdvdepay->width, + "height", G_TYPE_INT, rtpdvdepay->height, + "framerate", GST_TYPE_FRACTION, rtpdvdepay->rate_num, + rtpdvdepay->rate_denom, NULL); + ret = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return ret; + + /* ERRORS */ +no_encode: + { + GST_ERROR_OBJECT (rtpdvdepay, "required encode property not found in caps"); + return FALSE; + } +unknown_encode: + { + GST_ERROR_OBJECT (rtpdvdepay, "unknown encode property %s found", encode); + return FALSE; + } +no_media: + { + GST_ERROR_OBJECT (rtpdvdepay, "required media property not found in caps"); + return FALSE; + } +} + +/* A DV frame consists of a bunch of 80-byte DIF blocks. + * Each DIF block contains a 3-byte header telling where in the DV frame the + * DIF block should go. We use this information to calculate its position. + */ +static guint +calculate_difblock_location (guint8 * block) +{ + gint block_type, dif_sequence, dif_block; + guint location; + + block_type = block[0] >> 5; + dif_sequence = block[1] >> 4; + dif_block = block[2]; + + location = dif_sequence * 150; + + switch (block_type) { + case 0: /* Header block, no offset */ + break; + case 1: /* Subcode block */ + location += (1 + dif_block); + break; + case 2: /* VAUX block */ + location += (3 + dif_block); + break; + case 3: /* Audio block */ + location += (6 + dif_block * 16); + break; + case 4: /* Video block */ + location += (7 + (dif_block / 15) + dif_block); + break; + default: /* Something bogus */ + GST_DEBUG ("UNKNOWN BLOCK"); + location = -1; + break; + } + return location; +} + +/* Process one RTP packet. Accumulate RTP payload in the proper place in a DV + * frame, and return that frame if we detect a new frame, or NULL otherwise. + * We assume a DV frame is 144000 bytes. That should accomodate PAL as well as + * NTSC. + */ +static GstBuffer * +gst_rtp_dv_depay_process (GstBaseRTPDepayload * base, GstBuffer * in) +{ + GstBuffer *out = NULL; + guint8 *payload; + guint32 rtp_ts; + guint payload_len, location; + GstRTPDVDepay *dvdepay = GST_RTP_DV_DEPAY (base); + gboolean marker; + + marker = gst_rtp_buffer_get_marker (in); + + /* Check if the received packet contains (the start of) a new frame, we do + * this by checking the RTP timestamp. */ + rtp_ts = gst_rtp_buffer_get_timestamp (in); + + /* we cannot copy the packet yet if the marker is set, we will do that below + * after taking out the data */ + if (dvdepay->prev_ts != -1 && rtp_ts != dvdepay->prev_ts && !marker) { + /* the timestamp changed */ + GST_DEBUG_OBJECT (dvdepay, "new frame with ts %u, old ts %u", rtp_ts, + dvdepay->prev_ts); + + /* return copy of accumulator. */ + out = gst_buffer_copy (dvdepay->acc); + } + + /* Extract the payload */ + payload_len = gst_rtp_buffer_get_payload_len (in); + payload = gst_rtp_buffer_get_payload (in); + + /* copy all DIF chunks in their place. */ + while (payload_len >= 80) { + guint offset; + + /* Calculate where in the frame the payload should go */ + location = calculate_difblock_location (payload); + + if (location < 6) { + /* part of a header, set the flag to mark that we have the header. */ + dvdepay->header_mask |= (1 << location); + GST_LOG_OBJECT (dvdepay, "got header at location %d, now %02x", location, + dvdepay->header_mask); + } else { + GST_LOG_OBJECT (dvdepay, "got block at location %d", location); + } + + /* get the byte offset of the dif block */ + offset = location * 80; + + /* And copy it in, provided the location is sane. */ + if (offset >= 0 && offset <= dvdepay->frame_size - 80) + memcpy (GST_BUFFER_DATA (dvdepay->acc) + offset, payload, 80); + + payload += 80; + payload_len -= 80; + } + + if (marker) { + GST_DEBUG_OBJECT (dvdepay, "marker bit complete frame %u", rtp_ts); + /* only copy the frame when we have a complete header */ + if (dvdepay->header_mask == 0x3f) { + /* The marker marks the end of a frame that we need to push. The next frame + * will change the timestamp but we won't copy the accumulator again because + * we set the prev_ts to -1. */ + out = gst_buffer_copy (dvdepay->acc); + } else { + GST_WARNING_OBJECT (dvdepay, "waiting for frame headers %02x", + dvdepay->header_mask); + } + dvdepay->prev_ts = -1; + } else { + /* save last timestamp */ + dvdepay->prev_ts = rtp_ts; + } + return out; +} + +static void +gst_rtp_dv_depay_reset (GstRTPDVDepay * depay) +{ + if (depay->acc) + gst_buffer_unref (depay->acc); + depay->acc = NULL; + + depay->prev_ts = -1; + depay->header_mask = 0; +} + +static GstStateChangeReturn +gst_rtp_dv_depay_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstRTPDVDepay *depay = GST_RTP_DV_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_dv_depay_reset (depay); + break; + default: + break; + } + + ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, + (element, transition), GST_STATE_CHANGE_FAILURE); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_dv_depay_reset (depay); + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_dv_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpdvdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_DV_DEPAY); +} diff --git a/gst/rtp/gstrtpdvdepay.h b/gst/rtp/gstrtpdvdepay.h new file mode 100644 index 0000000..ea7618a --- /dev/null +++ b/gst/rtp/gstrtpdvdepay.h @@ -0,0 +1,66 @@ +/* Farsight + * Copyright (C) 2006 Marcel Moreaux + * + * 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 __GSTRTPDVDEPAY_H__ +#define __GSTRTPDVDEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +/* #define's don't like whitespacey bits */ +#define GST_TYPE_RTP_DV_DEPAY (gst_rtp_dv_depay_get_type()) +#define GST_RTP_DV_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DV_DEPAY,GstRTPDVDepay)) +#define GST_RTP_DV_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DV_DEPAY,GstRTPDVDepay)) +#define GST_IS_RTP_DV_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DV_DEPAY)) +#define GST_IS_RTP_DV_DEPAY_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DV_DEPAY)) + +typedef struct _GstRTPDVDepay GstRTPDVDepay; +typedef struct _GstRTPDVDepayClass GstRTPDVDepayClass; + +struct _GstRTPDVDepay +{ + GstBaseRTPDepayload parent; + + GstBuffer *acc; + guint frame_size; + guint32 prev_ts; + guint8 header_mask; + + gint width, height; + gint rate_num, rate_denom; +}; + +struct _GstRTPDVDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_dv_depay_get_type (void); + +gboolean gst_rtp_dv_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GSTRTPDVDEPAY_H__ */ diff --git a/gst/rtp/gstrtpdvpay.c b/gst/rtp/gstrtpdvpay.c new file mode 100644 index 0000000..7231cc6 --- /dev/null +++ b/gst/rtp/gstrtpdvpay.c @@ -0,0 +1,375 @@ +/* Farsight + * Copyright (C) 2006 Marcel Moreaux + * (C) 2008 Wim Taymans + * + * 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 +#include +#include + +#include "gstrtpdvpay.h" + +GST_DEBUG_CATEGORY (rtpdvpay_debug); +#define GST_CAT_DEFAULT (rtpdvpay_debug) + +#define DEFAULT_MODE GST_DV_PAY_MODE_VIDEO +enum +{ + PROP_0, + PROP_MODE +}; + +/* takes both system and non-system streams */ +static GstStaticPadTemplate gst_rtp_dv_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-dv") + ); + +static GstStaticPadTemplate gst_rtp_dv_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) { \"video\", \"audio\" } ," + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "encoding-name = (string) \"DV\", " + "clock-rate = (int) 90000," + "encode = (string) { \"SD-VCR/525-60\", \"SD-VCR/625-50\", \"HD-VCR/1125-60\"," + "\"HD-VCR/1250-50\", \"SDL-VCR/525-60\", \"SDL-VCR/625-50\"," + "\"306M/525-60\", \"306M/625-50\", \"314M-25/525-60\"," + "\"314M-25/625-50\", \"314M-50/525-60\", \"314M-50/625-50\" }" + /* optional parameters can't go in the template + * "audio = (string) { \"bundled\", \"none\" }" + */ + ) + ); + +static gboolean gst_rtp_dv_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_dv_pay_handle_buffer (GstBaseRTPPayload * payload, + GstBuffer * buffer); + +#define GST_TYPE_DV_PAY_MODE (gst_dv_pay_mode_get_type()) +static GType +gst_dv_pay_mode_get_type (void) +{ + static GType dv_pay_mode_type = 0; + static const GEnumValue dv_pay_modes[] = { + {GST_DV_PAY_MODE_VIDEO, "Video only", "video"}, + {GST_DV_PAY_MODE_BUNDLED, "Video and Audio bundled", "bundled"}, + {GST_DV_PAY_MODE_AUDIO, "Audio only", "audio"}, + {0, NULL, NULL}, + }; + + if (!dv_pay_mode_type) { + dv_pay_mode_type = g_enum_register_static ("GstDVPayMode", dv_pay_modes); + } + return dv_pay_mode_type; +} + + +static void gst_dv_pay_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_dv_pay_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +GST_BOILERPLATE (GstRTPDVPay, gst_rtp_dv_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_dv_pay_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_dv_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_dv_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP DV Payloader", + "Codec/Payloader/Network/RTP", + "Payloads DV into RTP packets (RFC 3189)", + "Marcel Moreaux , Wim Taymans "); +} + +static void +gst_rtp_dv_pay_class_init (GstRTPDVPayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->set_property = gst_dv_pay_set_property; + gobject_class->get_property = gst_dv_pay_get_property; + + gstbasertppayload_class->set_caps = gst_rtp_dv_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_dv_pay_handle_buffer; + + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "The payload mode of payloading", + GST_TYPE_DV_PAY_MODE, DEFAULT_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (rtpdvpay_debug, "rtpdvpay", 0, "DV RTP Payloader"); +} + +static void +gst_rtp_dv_pay_init (GstRTPDVPay * rtpdvpay, GstRTPDVPayClass * klass) +{ +} + +static void +gst_dv_pay_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstRTPDVPay *rtpdvpay = GST_RTP_DV_PAY (object); + + switch (prop_id) { + case PROP_MODE: + rtpdvpay->mode = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_dv_pay_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstRTPDVPay *rtpdvpay = GST_RTP_DV_PAY (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, rtpdvpay->mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_rtp_dv_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + /* We don't do anything here, but we could check if it's a system stream and if + * it's not, default to sending the video only. We will negotiate downstream + * caps when we get to see the first frame. */ + + return TRUE; +} + +static gboolean +gst_dv_pay_negotiate (GstRTPDVPay * rtpdvpay, guint8 * data, guint size) +{ + const gchar *encode, *media; + gboolean audio_bundled, res; + + if ((data[3] & 0x80) == 0) { /* DSF flag */ + /* it's an NTSC format */ + if ((data[80 * 5 + 48 + 3] & 0x4) && (data[80 * 5 + 48] == 0x60)) { /* 4:2:2 sampling */ + /* NTSC 50Mbps */ + encode = "314M-25/525-60"; + } else { /* 4:1:1 sampling */ + /* NTSC 25Mbps */ + encode = "SD-VCR/525-60"; + } + } else { + /* it's a PAL format */ + if ((data[80 * 5 + 48 + 3] & 0x4) && (data[80 * 5 + 48] == 0x60)) { /* 4:2:2 sampling */ + /* PAL 50Mbps */ + encode = "314M-50/625-50"; + } else if ((data[5] & 0x07) == 0) { /* APT flag */ + /* PAL 25Mbps 4:2:0 */ + encode = "SD-VCR/625-50"; + } else + /* PAL 25Mbps 4:1:1 */ + encode = "314M-25/625-50"; + } + + media = "video"; + audio_bundled = FALSE; + + switch (rtpdvpay->mode) { + case GST_DV_PAY_MODE_AUDIO: + media = "audio"; + break; + case GST_DV_PAY_MODE_BUNDLED: + audio_bundled = TRUE; + break; + default: + break; + } + gst_basertppayload_set_options (GST_BASE_RTP_PAYLOAD (rtpdvpay), media, TRUE, + "DV", 90000); + + if (audio_bundled) { + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpdvpay), + "encode", G_TYPE_STRING, encode, + "audio", G_TYPE_STRING, "bundled", NULL); + } else { + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpdvpay), + "encode", G_TYPE_STRING, encode, NULL); + } + return res; +} + +static gboolean +include_dif (GstRTPDVPay * rtpdvpay, guint8 * data) +{ + gint block_type; + gboolean res; + + block_type = data[0] >> 5; + + switch (block_type) { + case 0: /* Header block */ + case 1: /* Subcode block */ + case 2: /* VAUX block */ + /* always include these blocks */ + res = TRUE; + break; + case 3: /* Audio block */ + /* never include audio if we are doing video only */ + if (rtpdvpay->mode == GST_DV_PAY_MODE_VIDEO) + res = FALSE; + else + res = TRUE; + break; + case 4: /* Video block */ + /* never include video if we are doing audio only */ + if (rtpdvpay->mode == GST_DV_PAY_MODE_AUDIO) + res = FALSE; + else + res = TRUE; + break; + default: /* Something bogus, just ignore */ + res = FALSE; + break; + } + return res; +} + +/* Get a DV frame, chop it up in pieces, and push the pieces to the RTP layer. + */ +static GstFlowReturn +gst_rtp_dv_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRTPDVPay *rtpdvpay; + guint max_payload_size; + GstBuffer *outbuf; + GstFlowReturn ret = GST_FLOW_OK; + gint hdrlen; + guint size; + guint8 *data; + guint8 *dest; + guint filled; + + rtpdvpay = GST_RTP_DV_PAY (basepayload); + + hdrlen = gst_rtp_buffer_calc_header_len (0); + /* DV frames are made up from a bunch of DIF blocks. DIF blocks are 80 bytes + * each, and we should put an integral number of them in each RTP packet. + * Therefore, we round the available room down to the nearest multiple of 80. + * + * The available room is just the packet MTU, minus the RTP header length. */ + max_payload_size = ((GST_BASE_RTP_PAYLOAD_MTU (rtpdvpay) - hdrlen) / 80) * 80; + + /* The length of the buffer to transmit. */ + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + + GST_DEBUG_OBJECT (rtpdvpay, + "DV RTP payloader got buffer of %u bytes, splitting in %u byte " + "payload fragments, at time %" GST_TIME_FORMAT, size, max_payload_size, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); + + if (!rtpdvpay->negotiated) { + gst_dv_pay_negotiate (rtpdvpay, data, size); + /* if we have not yet scanned the stream for its type, do so now */ + rtpdvpay->negotiated = TRUE; + } + + outbuf = NULL; + dest = NULL; + filled = 0; + + /* while we have a complete DIF chunks left */ + while (size >= 80) { + /* Allocate a new buffer, set the timestamp */ + if (outbuf == NULL) { + outbuf = gst_rtp_buffer_new_allocate (max_payload_size, 0, 0); + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); + dest = gst_rtp_buffer_get_payload (outbuf); + filled = 0; + } + + /* inspect the DIF chunk, if we don't need to include it, skip to the next one. */ + if (include_dif (rtpdvpay, data)) { + /* copy data in packet */ + memcpy (dest, data, 80); + + dest += 80; + filled += 80; + } + + /* go to next dif chunk */ + size -= 80; + data += 80; + + /* push out the buffer if the next one would exceed the max packet size or + * when we are pushing the last packet */ + if (filled + 80 > max_payload_size || size < 80) { + if (size < 160) { + guint hlen; + + /* set marker */ + gst_rtp_buffer_set_marker (outbuf, TRUE); + + /* shrink buffer to last packet */ + hlen = gst_rtp_buffer_get_header_len (outbuf); + gst_rtp_buffer_set_packet_len (outbuf, hlen + filled); + } + /* Push out the created piece, and check for errors. */ + ret = gst_basertppayload_push (basepayload, outbuf); + if (ret != GST_FLOW_OK) + break; + + outbuf = NULL; + } + } + gst_buffer_unref (buffer); + + return ret; +} + +gboolean +gst_rtp_dv_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpdvpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_DV_PAY); +} diff --git a/gst/rtp/gstrtpdvpay.h b/gst/rtp/gstrtpdvpay.h new file mode 100644 index 0000000..e691b80 --- /dev/null +++ b/gst/rtp/gstrtpdvpay.h @@ -0,0 +1,69 @@ +/* Farsight + * Copyright (C) 2006 Marcel Moreaux + * + * 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 __GSTRTPDVPAY_H__ +#define __GSTRTPDVPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRTPDVPay GstRTPDVPay; +typedef struct _GstRTPDVPayClass GstRTPDVPayClass; + +#define GST_TYPE_RTP_DV_PAY \ + (gst_rtp_dv_pay_get_type()) +#define GST_RTP_DV_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DV_PAY,GstRTPDVPay)) +#define GST_RTP_DV_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DV_PAY,GstRTPDVPay)) +#define GST_IS_RTP_DV_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DV_PAY)) +#define GST_IS_RTP_DV_PAY_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DV_PAY)) + +typedef enum +{ + GST_DV_PAY_MODE_VIDEO, + GST_DV_PAY_MODE_BUNDLED, + GST_DV_PAY_MODE_AUDIO +} GstDVPayMode; + +struct _GstRTPDVPay +{ + GstBaseRTPPayload payload; + + gboolean negotiated; + GstDVPayMode mode; +}; + +struct _GstRTPDVPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_dv_pay_get_type (void); + +gboolean gst_rtp_dv_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GSTRTPDVPAY_H__ */ diff --git a/gst/rtp/gstrtpg722depay.c b/gst/rtp/gstrtpg722depay.c new file mode 100644 index 0000000..726426b --- /dev/null +++ b/gst/rtp/gstrtpg722depay.c @@ -0,0 +1,260 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 +#include + +#include +#include + +#include "gstrtpg722depay.h" +#include "gstrtpchannels.h" + +GST_DEBUG_CATEGORY_STATIC (rtpg722depay_debug); +#define GST_CAT_DEFAULT (rtpg722depay_debug) + +static GstStaticPadTemplate gst_rtp_g722_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/G722, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") + ); + +static GstStaticPadTemplate gst_rtp_g722_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + /* "channels = (int) [1, MAX]" */ + /* "channel-order = (string) ANY" */ + "encoding-name = (string) \"G722\";" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_G722_STRING ", " + "clock-rate = (int) [ 1, MAX ]" + /* "channels = (int) [1, MAX]" */ + /* "emphasis = (string) ANY" */ + /* "channel-order = (string) ANY" */ + ) + ); + +GST_BOILERPLATE (GstRtpG722Depay, gst_rtp_g722_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_g722_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_g722_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_g722_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g722_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g722_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP audio depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts G722 audio from RTP packets", + "Wim Taymans "); +} + +static void +gst_rtp_g722_depay_class_init (GstRtpG722DepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->set_caps = gst_rtp_g722_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_g722_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpg722depay_debug, "rtpg722depay", 0, + "G722 RTP Depayloader"); +} + +static void +gst_rtp_g722_depay_init (GstRtpG722Depay * rtpg722depay, + GstRtpG722DepayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static gint +gst_rtp_g722_depay_parse_int (GstStructure * structure, const gchar * field, + gint def) +{ + const gchar *str; + gint res; + + if ((str = gst_structure_get_string (structure, field))) + return atoi (str); + + if (gst_structure_get_int (structure, field, &res)) + return res; + + return def; +} + +static gboolean +gst_rtp_g722_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpG722Depay *rtpg722depay; + gint clock_rate, payload, samplerate; + gint channels; + GstCaps *srccaps; + gboolean res; + const gchar *channel_order; + const GstRTPChannelOrder *order; + + rtpg722depay = GST_RTP_G722_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + payload = 96; + gst_structure_get_int (structure, "payload", &payload); + switch (payload) { + case GST_RTP_PAYLOAD_G722: + channels = 1; + clock_rate = 8000; + samplerate = 16000; + break; + default: + /* no fixed mapping, we need clock-rate */ + channels = 0; + clock_rate = 0; + samplerate = 0; + break; + } + + /* caps can overwrite defaults */ + clock_rate = + gst_rtp_g722_depay_parse_int (structure, "clock-rate", clock_rate); + if (clock_rate == 0) + goto no_clockrate; + + if (clock_rate == 8000) + samplerate = 16000; + + if (samplerate == 0) + samplerate = clock_rate; + + channels = + gst_rtp_g722_depay_parse_int (structure, "encoding-params", channels); + if (channels == 0) { + channels = gst_rtp_g722_depay_parse_int (structure, "channels", channels); + if (channels == 0) { + /* channels defaults to 1 otherwise */ + channels = 1; + } + } + + depayload->clock_rate = clock_rate; + rtpg722depay->rate = samplerate; + rtpg722depay->channels = channels; + + srccaps = gst_caps_new_simple ("audio/G722", + "rate", G_TYPE_INT, samplerate, "channels", G_TYPE_INT, channels, NULL); + + /* add channel positions */ + channel_order = gst_structure_get_string (structure, "channel-order"); + + order = gst_rtp_channels_get_by_order (channels, channel_order); + if (order) { + gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), + order->pos); + } else { + GstAudioChannelPosition *pos; + + GST_ELEMENT_WARNING (rtpg722depay, STREAM, DECODE, + (NULL), ("Unknown channel order '%s' for %d channels", + GST_STR_NULL (channel_order), channels)); + /* create default NONE layout */ + pos = gst_rtp_channels_create_default (channels); + gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), pos); + g_free (pos); + } + + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return res; + + /* ERRORS */ +no_clockrate: + { + GST_ERROR_OBJECT (depayload, "no clock-rate specified"); + return FALSE; + } +} + +static GstBuffer * +gst_rtp_g722_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpG722Depay *rtpg722depay; + GstBuffer *outbuf; + gint payload_len; + gboolean marker; + + rtpg722depay = GST_RTP_G722_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + if (payload_len <= 0) + goto empty_packet; + + GST_DEBUG_OBJECT (rtpg722depay, "got payload of %d bytes", payload_len); + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + marker = gst_rtp_buffer_get_marker (buf); + + if (marker && outbuf) { + /* mark talk spurt with DISCONT */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + return outbuf; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpg722depay, STREAM, DECODE, + ("Empty Payload."), (NULL)); + return NULL; + } +} + +gboolean +gst_rtp_g722_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpg722depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_G722_DEPAY); +} diff --git a/gst/rtp/gstrtpg722depay.h b/gst/rtp/gstrtpg722depay.h new file mode 100644 index 0000000..2f6b980 --- /dev/null +++ b/gst/rtp/gstrtpg722depay.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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_RTP_G722_DEPAY_H__ +#define __GST_RTP_G722_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +/* Standard macros for defining types for this element. */ +#define GST_TYPE_RTP_G722_DEPAY \ + (gst_rtp_g722_depay_get_type()) +#define GST_RTP_G722_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G722_DEPAY,GstRtpG722Depay)) +#define GST_RTP_G722_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G722_DEPAY,GstRtpG722DepayClass)) +#define GST_IS_RTP_G722_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G722_DEPAY)) +#define GST_IS_RTP_G722_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G722_DEPAY)) + +typedef struct _GstRtpG722Depay GstRtpG722Depay; +typedef struct _GstRtpG722DepayClass GstRtpG722DepayClass; + +/* Definition of structure storing data for this element. */ +struct _GstRtpG722Depay +{ + GstBaseRTPDepayload depayload; + + guint rate; + guint channels; +}; + +/* Standard definition defining a class for this element. */ +struct _GstRtpG722DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_g722_depay_get_type (void); + +gboolean gst_rtp_g722_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_G722_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpg722pay.c b/gst/rtp/gstrtpg722pay.c new file mode 100644 index 0000000..06958e1 --- /dev/null +++ b/gst/rtp/gstrtpg722pay.c @@ -0,0 +1,208 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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 + +#include +#include +#include + +#include "gstrtpg722pay.h" +#include "gstrtpchannels.h" + +GST_DEBUG_CATEGORY_STATIC (rtpg722pay_debug); +#define GST_CAT_DEFAULT (rtpg722pay_debug) + +static GstStaticPadTemplate gst_rtp_g722_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/G722, " "rate = (int) 16000, " "channels = (int) 1") + ); + +static GstStaticPadTemplate gst_rtp_g722_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "encoding-name = (string) \"G722\", " + "payload = (int) " GST_RTP_PAYLOAD_G722_STRING ", " + "clock-rate = (int) 8000") + ); + +static gboolean gst_rtp_g722_pay_setcaps (GstBaseRTPPayload * basepayload, + GstCaps * caps); +static GstCaps *gst_rtp_g722_pay_getcaps (GstBaseRTPPayload * rtppayload, + GstPad * pad); + +GST_BOILERPLATE (GstRtpG722Pay, gst_rtp_g722_pay, GstBaseRTPAudioPayload, + GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); + +static void +gst_rtp_g722_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g722_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g722_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP audio payloader", + "Codec/Payloader/Network/RTP", + "Payload-encode Raw audio into RTP packets (RFC 3551)", + "Wim Taymans "); +} + +static void +gst_rtp_g722_pay_class_init (GstRtpG722PayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_g722_pay_setcaps; + gstbasertppayload_class->get_caps = gst_rtp_g722_pay_getcaps; + + GST_DEBUG_CATEGORY_INIT (rtpg722pay_debug, "rtpg722pay", 0, + "G722 RTP Payloader"); +} + +static void +gst_rtp_g722_pay_init (GstRtpG722Pay * rtpg722pay, GstRtpG722PayClass * klass) +{ + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpg722pay); + + /* tell basertpaudiopayload that this is a sample based codec */ + gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); +} + +static gboolean +gst_rtp_g722_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +{ + GstRtpG722Pay *rtpg722pay; + GstStructure *structure; + gint rate, channels, clock_rate; + gboolean res; + gchar *params; + GstAudioChannelPosition *pos; + const GstRTPChannelOrder *order; + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basepayload); + rtpg722pay = GST_RTP_G722_PAY (basepayload); + + structure = gst_caps_get_structure (caps, 0); + + /* first parse input caps */ + if (!gst_structure_get_int (structure, "rate", &rate)) + goto no_rate; + + if (!gst_structure_get_int (structure, "channels", &channels)) + goto no_channels; + + /* get the channel order */ + pos = gst_audio_get_channel_positions (structure); + if (pos) + order = gst_rtp_channels_get_by_pos (channels, pos); + else + order = NULL; + + /* Clock rate is always 8000 Hz for G722 according to + * RFC 3551 although the sampling rate is 16000 Hz */ + clock_rate = 8000; + + gst_basertppayload_set_options (basepayload, "audio", TRUE, "G722", + clock_rate); + params = g_strdup_printf ("%d", channels); + + if (!order && channels > 2) { + GST_ELEMENT_WARNING (rtpg722pay, STREAM, DECODE, + (NULL), ("Unknown channel order for %d channels", channels)); + } + + if (order && order->name) { + res = gst_basertppayload_set_outcaps (basepayload, + "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, + channels, "channel-order", G_TYPE_STRING, order->name, NULL); + } else { + res = gst_basertppayload_set_outcaps (basepayload, + "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, + channels, NULL); + } + + g_free (params); + g_free (pos); + + rtpg722pay->rate = rate; + rtpg722pay->channels = channels; + + /* bits-per-sample is 4 * channels for G722, but as the RTP clock runs at + * half speed (8 instead of 16 khz), pretend it's 8 bits per sample + * channels. */ + gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, + 8 * rtpg722pay->channels); + + return res; + + /* ERRORS */ +no_rate: + { + GST_DEBUG_OBJECT (rtpg722pay, "no rate given"); + return FALSE; + } +no_channels: + { + GST_DEBUG_OBJECT (rtpg722pay, "no channels given"); + return FALSE; + } +} + +static GstCaps * +gst_rtp_g722_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) +{ + GstCaps *otherpadcaps; + GstCaps *caps; + + otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + + if (otherpadcaps) { + if (!gst_caps_is_empty (otherpadcaps)) { + gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL); + gst_caps_set_simple (caps, "rate", G_TYPE_INT, 16000, NULL); + } + gst_caps_unref (otherpadcaps); + } + return caps; +} + +gboolean +gst_rtp_g722_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpg722pay", + GST_RANK_SECONDARY, GST_TYPE_RTP_G722_PAY); +} diff --git a/gst/rtp/gstrtpg722pay.h b/gst/rtp/gstrtpg722pay.h new file mode 100644 index 0000000..6712204 --- /dev/null +++ b/gst/rtp/gstrtpg722pay.h @@ -0,0 +1,61 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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_RTP_G722_PAY_H__ +#define __GST_RTP_G722_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_G722_PAY \ + (gst_rtp_g722_pay_get_type()) +#define GST_RTP_G722_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G722_PAY,GstRtpG722Pay)) +#define GST_RTP_G722_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G722_PAY,GstRtpG722PayClass)) +#define GST_IS_RTP_G722_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G722_PAY)) +#define GST_IS_RTP_G722_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G722_PAY)) + +typedef struct _GstRtpG722Pay GstRtpG722Pay; +typedef struct _GstRtpG722PayClass GstRtpG722PayClass; + +struct _GstRtpG722Pay +{ + GstBaseRTPAudioPayload payload; + + gint rate; + gint channels; +}; + +struct _GstRtpG722PayClass +{ + GstBaseRTPAudioPayloadClass parent_class; +}; + +GType gst_rtp_g722_pay_get_type (void); + +gboolean gst_rtp_g722_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_G722_PAY_H__ */ diff --git a/gst/rtp/gstrtpg723depay.c b/gst/rtp/gstrtpg723depay.c new file mode 100644 index 0000000..0f6f137 --- /dev/null +++ b/gst/rtp/gstrtpg723depay.c @@ -0,0 +1,228 @@ +/* GStreamer + * + * Copyright (C) <2010> Wim Taymans + * + * 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 + +#include +#include +#include "gstrtpg723depay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpg723depay_debug); +#define GST_CAT_DEFAULT (rtpg723depay_debug) + + +/* references: + * + * RFC 3551 (4.5.3) + */ + +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +/* input is an RTP packet + * + */ +static GstStaticPadTemplate gst_rtp_g723_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"G723\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_G723_STRING ", " + "clock-rate = (int) 8000") + ); + +static GstStaticPadTemplate gst_rtp_g723_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/G723, " "channels = (int) 1," "rate = (int) 8000") + ); + +static gboolean gst_rtp_g723_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_g723_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +GST_BOILERPLATE (GstRtpG723Depay, gst_rtp_g723_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_g723_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g723_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g723_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP G.723 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts G.723 audio from RTP packets (RFC 3551)", + "Wim Taymans "); + + GST_DEBUG_CATEGORY_INIT (rtpg723depay_debug, "rtpg723depay", 0, + "G.723 RTP Depayloader"); +} + +static void +gst_rtp_g723_depay_class_init (GstRtpG723DepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_g723_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_g723_depay_setcaps; +} + +static void +gst_rtp_g723_depay_init (GstRtpG723Depay * rtpg723depay, + GstRtpG723DepayClass * klass) +{ + GstBaseRTPDepayload *depayload; + + depayload = GST_BASE_RTP_DEPAYLOAD (rtpg723depay); + + gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); +} + +static gboolean +gst_rtp_g723_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstCaps *srccaps; + GstRtpG723Depay *rtpg723depay; + const gchar *params; + gint clock_rate, channels; + gboolean ret; + + rtpg723depay = GST_RTP_G723_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!(params = gst_structure_get_string (structure, "encoding-params"))) + channels = 1; + else { + channels = atoi (params); + } + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 8000; + + if (channels != 1) + goto wrong_channels; + + if (clock_rate != 8000) + goto wrong_clock_rate; + + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("audio/G723", + "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, clock_rate, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return ret; + + /* ERRORS */ +wrong_channels: + { + GST_DEBUG_OBJECT (rtpg723depay, "expected 1 channel, got %d", channels); + return FALSE; + } +wrong_clock_rate: + { + GST_DEBUG_OBJECT (rtpg723depay, "expected 8000 clock-rate, got %d", + clock_rate); + return FALSE; + } +} + + +static GstBuffer * +gst_rtp_g723_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpG723Depay *rtpg723depay; + GstBuffer *outbuf = NULL; + gint payload_len; + gboolean marker; + + rtpg723depay = GST_RTP_G723_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + /* At least 4 bytes */ + if (payload_len < 4) + goto too_small; + + GST_LOG_OBJECT (rtpg723depay, "payload len %d", payload_len); + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + marker = gst_rtp_buffer_get_marker (buf); + + if (marker) { + /* marker bit starts talkspurt */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + GST_LOG_OBJECT (depayload, "pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + return outbuf; + + /* ERRORS */ +too_small: + { + GST_ELEMENT_WARNING (rtpg723depay, STREAM, DECODE, + (NULL), ("G723 RTP payload too small (%d)", payload_len)); + goto bad_packet; + } +bad_packet: + { + /* no fatal error */ + return NULL; + } +} + +gboolean +gst_rtp_g723_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpg723depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_G723_DEPAY); +} diff --git a/gst/rtp/gstrtpg723depay.h b/gst/rtp/gstrtpg723depay.h new file mode 100644 index 0000000..fcab761 --- /dev/null +++ b/gst/rtp/gstrtpg723depay.h @@ -0,0 +1,59 @@ +/* GStreamer + * + * Copyright (C) <2010> Wim Taymans + * + * 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_RTP_G723_DEPAY_H__ +#define __GST_RTP_G723_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_G723_DEPAY \ + (gst_rtp_g723_depay_get_type()) +#define GST_RTP_G723_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G723_DEPAY,GstRtpG723Depay)) +#define GST_RTP_G723_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G723_DEPAY,GstRtpG723DepayClass)) +#define GST_IS_RTP_G723_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G723_DEPAY)) +#define GST_IS_RTP_G723_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G723_DEPAY)) + +typedef struct _GstRtpG723Depay GstRtpG723Depay; +typedef struct _GstRtpG723DepayClass GstRtpG723DepayClass; + +struct _GstRtpG723Depay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpG723DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_g723_depay_get_type (void); + +gboolean gst_rtp_g723_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_G723_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpg723pay.c b/gst/rtp/gstrtpg723pay.c new file mode 100644 index 0000000..3fe906f --- /dev/null +++ b/gst/rtp/gstrtpg723pay.c @@ -0,0 +1,316 @@ +/* GStreamer + * Copyright (C) <2007> Nokia Corporation + * Copyright (C) <2007> Collabora Ltd + * @author: Olivier Crete + * + * 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 +#endif + +#include +#include +#include + +#include "gstrtpg723pay.h" + +#define GST_RTP_PAYLOAD_G723 4 +#define GST_RTP_PAYLOAD_G723_STRING "4" + +#define G723_FRAME_DURATION (30 * GST_MSECOND) + +static gboolean gst_rtp_g723_pay_set_caps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_g723_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buf); + +static GstStaticPadTemplate gst_rtp_g723_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/G723, " /* according to RFC 3551 */ + "channels = (int) 1, " "rate = (int) 8000") + ); + +static GstStaticPadTemplate gst_rtp_g723_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_G723_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"G723\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"G723\"") + ); + +static void gst_rtp_g723_pay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_g723_pay_change_state (GstElement * element, + GstStateChange transition); + +GST_BOILERPLATE (GstRTPG723Pay, gst_rtp_g723_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_g723_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g723_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g723_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP G.723 payloader", + "Codec/Payloader/Network/RTP", + "Packetize G.723 audio into RTP packets", + "Wim Taymans "); +} + +static void +gst_rtp_g723_pay_class_init (GstRTPG723PayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *payload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + payload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_g723_pay_finalize; + + gstelement_class->change_state = gst_rtp_g723_pay_change_state; + + payload_class->set_caps = gst_rtp_g723_pay_set_caps; + payload_class->handle_buffer = gst_rtp_g723_pay_handle_buffer; +} + +static void +gst_rtp_g723_pay_init (GstRTPG723Pay * pay, GstRTPG723PayClass * klass) +{ + GstBaseRTPPayload *payload = GST_BASE_RTP_PAYLOAD (pay); + + pay->adapter = gst_adapter_new (); + + payload->pt = GST_RTP_PAYLOAD_G723; + gst_basertppayload_set_options (payload, "audio", FALSE, "G723", 8000); +} + +static void +gst_rtp_g723_pay_finalize (GObject * object) +{ + GstRTPG723Pay *pay; + + pay = GST_RTP_G723_PAY (object); + + g_object_unref (pay->adapter); + pay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static gboolean +gst_rtp_g723_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + GstStructure *structure; + gint pt; + + structure = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (structure, "payload", &pt)) + pt = GST_RTP_PAYLOAD_G723; + + payload->pt = pt; + payload->dynamic = pt != GST_RTP_PAYLOAD_G723; + + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; +} + +static GstFlowReturn +gst_rtp_g723_pay_flush (GstRTPG723Pay * pay) +{ + GstBuffer *outbuf; + GstFlowReturn ret; + guint8 *payload; + guint avail; + + avail = gst_adapter_available (pay->adapter); + + outbuf = gst_rtp_buffer_new_allocate (avail, 0, 0); + payload = gst_rtp_buffer_get_payload (outbuf); + + GST_BUFFER_TIMESTAMP (outbuf) = pay->timestamp; + GST_BUFFER_DURATION (outbuf) = pay->duration; + + /* copy G723 data as payload */ + gst_adapter_copy (pay->adapter, payload, 0, avail); + + /* flush bytes from adapter */ + gst_adapter_flush (pay->adapter, avail); + pay->timestamp = GST_CLOCK_TIME_NONE; + pay->duration = 0; + + /* set discont and marker */ + if (pay->discont) { + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + gst_rtp_buffer_set_marker (outbuf, TRUE); + pay->discont = FALSE; + } + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (pay), outbuf); + + return ret; +} + +/* 00 high-rate speech (6.3 kb/s) 24 + * 01 low-rate speech (5.3 kb/s) 20 + * 10 SID frame 4 + * 11 reserved 0 */ +static const guint size_tab[4] = { + 24, 20, 4, 0 +}; + +static GstFlowReturn +gst_rtp_g723_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint8 *data; + guint size; + guint8 HDR; + GstRTPG723Pay *pay; + GstClockTime packet_dur, timestamp; + guint payload_len, packet_len; + + pay = GST_RTP_G723_PAY (payload); + + size = GST_BUFFER_SIZE (buf); + data = GST_BUFFER_DATA (buf); + timestamp = GST_BUFFER_TIMESTAMP (buf); + + if (GST_BUFFER_IS_DISCONT (buf)) { + /* flush everything on discont */ + gst_adapter_clear (pay->adapter); + pay->timestamp = GST_CLOCK_TIME_NONE; + pay->duration = 0; + pay->discont = TRUE; + } + + /* should be one of these sizes */ + if (size != 4 && size != 20 && size != 24) + goto invalid_size; + + /* check size by looking at the header bits */ + HDR = data[0] & 0x3; + if (size_tab[HDR] != size) + goto wrong_size; + + /* calculate packet size and duration */ + payload_len = gst_adapter_available (pay->adapter) + size; + packet_dur = pay->duration + G723_FRAME_DURATION; + packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0); + + if (gst_basertppayload_is_filled (payload, packet_len, packet_dur)) { + /* size or duration would overflow the packet, flush the queued data */ + ret = gst_rtp_g723_pay_flush (pay); + } + + /* update timestamp, we keep the timestamp for the first packet in the adapter + * but are able to calculate it from next packets. */ + if (timestamp != GST_CLOCK_TIME_NONE && pay->timestamp == GST_CLOCK_TIME_NONE) { + if (timestamp > pay->duration) + pay->timestamp = timestamp - pay->duration; + else + pay->timestamp = 0; + } + + /* add packet to the queue */ + gst_adapter_push (pay->adapter, buf); + pay->duration = packet_dur; + + /* check if we can flush now */ + if (pay->duration >= payload->min_ptime) { + ret = gst_rtp_g723_pay_flush (pay); + } + + return ret; + + /* WARNINGS */ +invalid_size: + { + GST_ELEMENT_WARNING (pay, STREAM, WRONG_TYPE, + ("Invalid input buffer size"), + ("Input size should be 4, 20 or 24, got %u", size)); + gst_buffer_unref (buf); + return GST_FLOW_OK; + } +wrong_size: + { + GST_ELEMENT_WARNING (pay, STREAM, WRONG_TYPE, + ("Wrong input buffer size"), + ("Expected input buffer size %u but got %u", size_tab[HDR], size)); + gst_buffer_unref (buf); + return GST_FLOW_OK; + } +} + +static GstStateChangeReturn +gst_rtp_g723_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstRTPG723Pay *pay; + + pay = GST_RTP_G723_PAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (pay->adapter); + pay->timestamp = GST_CLOCK_TIME_NONE; + pay->duration = 0; + pay->discont = TRUE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_adapter_clear (pay->adapter); + break; + default: + break; + } + + return ret; +} + +/*Plugin init functions*/ +gboolean +gst_rtp_g723_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpg723pay", GST_RANK_SECONDARY, + gst_rtp_g723_pay_get_type ()); +} diff --git a/gst/rtp/gstrtpg723pay.h b/gst/rtp/gstrtpg723pay.h new file mode 100644 index 0000000..db1570f --- /dev/null +++ b/gst/rtp/gstrtpg723pay.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <2007> Nokia Corporation + * Copyright (C) <2007> Collabora Ltd + * + * 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_RTP_G723_PAY_H__ +#define __GST_RTP_G723_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_G723_PAY \ + (gst_rtp_g723_pay_get_type()) +#define GST_RTP_G723_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G723_PAY,GstRTPG723Pay)) +#define GST_RTP_G723_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G723_PAY,GstRTPG723PayClass)) +#define GST_IS_RTP_G723_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G723_PAY)) +#define GST_IS_RTP_G723_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G723_PAY)) + +typedef struct _GstRTPG723Pay GstRTPG723Pay; +typedef struct _GstRTPG723PayClass GstRTPG723PayClass; + +struct _GstRTPG723Pay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime duration; + GstClockTime timestamp; + gboolean discont; +}; + +struct _GstRTPG723PayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_g723_pay_get_type (void); + +gboolean gst_rtp_g723_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_G723_PAY_H__ */ diff --git a/gst/rtp/gstrtpg726depay.c b/gst/rtp/gstrtpg726depay.c new file mode 100644 index 0000000..2b171a0 --- /dev/null +++ b/gst/rtp/gstrtpg726depay.c @@ -0,0 +1,390 @@ +/* GStreamer + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2005 Edgard Lima + * Copyright (C) 2005 Zeeshan Ali + * Copyright (C) 2008 Axis Communications + * + * 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 +#include +#include +#include + +#include "gstrtpg726depay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpg726depay_debug); +#define GST_CAT_DEFAULT (rtpg726depay_debug) + +#define DEFAULT_BIT_RATE 32000 +#define SAMPLE_RATE 8000 +#define LAYOUT_G726 "g726" + +/* RtpG726Depay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_FORCE_AAL2 TRUE + +enum +{ + PROP_0, + PROP_FORCE_AAL2, + PROP_LAST +}; + +static GstStaticPadTemplate gst_rtp_g726_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "encoding-name = (string) { \"G726\", \"G726-16\", \"G726-24\", \"G726-32\", \"G726-40\", " + "\"AAL2-G726-16\", \"AAL2-G726-24\", \"AAL2-G726-32\", \"AAL2-G726-40\" }, " + "clock-rate = (int) 8000;") + ); + +static GstStaticPadTemplate gst_rtp_g726_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-adpcm, " + "channels = (int) 1, " + "rate = (int) 8000, " + "bitrate = (int) { 16000, 24000, 32000, 40000 }, " + "layout = (string) \"g726\"") + ); + +static void gst_rtp_g726_depay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_rtp_g726_depay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static GstBuffer *gst_rtp_g726_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_g726_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRtpG726Depay, gst_rtp_g726_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_g726_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g726_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g726_depay_sink_template); + gst_element_class_set_details_simple (element_class, "RTP G.726 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts G.726 audio from RTP packets", + "Axis Communications "); +} + +static void +gst_rtp_g726_depay_class_init (GstRtpG726DepayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->set_property = gst_rtp_g726_depay_set_property; + gobject_class->get_property = gst_rtp_g726_depay_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FORCE_AAL2, + g_param_spec_boolean ("force-aal2", "Force AAL2", + "Force AAL2 decoding for compatibility with bad payloaders", + DEFAULT_FORCE_AAL2, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasertpdepayload_class->process = gst_rtp_g726_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_g726_depay_setcaps; + + GST_DEBUG_CATEGORY_INIT (rtpg726depay_debug, "rtpg726depay", 0, + "G.726 RTP Depayloader"); +} + +static void +gst_rtp_g726_depay_init (GstRtpG726Depay * rtpG726depay, + GstRtpG726DepayClass * klass) +{ + GstBaseRTPDepayload *depayload; + + depayload = GST_BASE_RTP_DEPAYLOAD (rtpG726depay); + + gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); + + rtpG726depay->force_aal2 = DEFAULT_FORCE_AAL2; +} + +static gboolean +gst_rtp_g726_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + GstStructure *structure; + gboolean ret; + gint clock_rate; + const gchar *encoding_name; + GstRtpG726Depay *depay; + + depay = GST_RTP_G726_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 8000; /* default */ + depayload->clock_rate = clock_rate; + + depay->aal2 = FALSE; + encoding_name = gst_structure_get_string (structure, "encoding-name"); + if (encoding_name == NULL || g_ascii_strcasecmp (encoding_name, "G726") == 0) { + depay->bitrate = DEFAULT_BIT_RATE; + } else { + if (g_str_has_prefix (encoding_name, "AAL2-")) { + depay->aal2 = TRUE; + encoding_name += 5; + } + if (g_ascii_strcasecmp (encoding_name, "G726-16") == 0) { + depay->bitrate = 16000; + } else if (g_ascii_strcasecmp (encoding_name, "G726-24") == 0) { + depay->bitrate = 24000; + } else if (g_ascii_strcasecmp (encoding_name, "G726-32") == 0) { + depay->bitrate = 32000; + } else if (g_ascii_strcasecmp (encoding_name, "G726-40") == 0) { + depay->bitrate = 40000; + } else + goto unknown_encoding; + } + + GST_DEBUG ("RTP G.726 depayloader, bitrate set to %d\n", depay->bitrate); + + srccaps = gst_caps_new_simple ("audio/x-adpcm", + "channels", G_TYPE_INT, 1, + "rate", G_TYPE_INT, clock_rate, + "bitrate", G_TYPE_INT, depay->bitrate, + "layout", G_TYPE_STRING, LAYOUT_G726, NULL); + + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return ret; + + /* ERRORS */ +unknown_encoding: + { + GST_WARNING ("Could not determine bitrate from encoding-name (%s)", + encoding_name); + return FALSE; + } +} + + +static GstBuffer * +gst_rtp_g726_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpG726Depay *depay; + GstBuffer *outbuf = NULL; + gboolean marker; + + depay = GST_RTP_G726_DEPAY (depayload); + + marker = gst_rtp_buffer_get_marker (buf); + + GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", + GST_BUFFER_SIZE (buf), marker, + gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); + + if (depay->aal2 || depay->force_aal2) { + /* AAL2, we can just copy the bytes */ + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + if (!outbuf) + goto bad_len; + } else { + guint8 *in, *out, tmp; + guint len; + + in = gst_rtp_buffer_get_payload (buf); + len = gst_rtp_buffer_get_payload_len (buf); + + if (gst_buffer_is_writable (buf)) { + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + } else { + GstBuffer *copy; + + /* copy buffer */ + copy = gst_buffer_copy (buf); + outbuf = gst_rtp_buffer_get_payload_buffer (copy); + gst_buffer_unref (copy); + } + + if (!outbuf) + goto bad_len; + + out = GST_BUFFER_DATA (outbuf); + + /* we need to reshuffle the bytes, input is always of the form + * A B C D ... with the number of bits depending on the bitrate. */ + switch (depay->bitrate) { + case 16000: + { + /* 0 + * 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+- + * |D D|C C|B B|A A| ... + * |0 1|0 1|0 1|0 1| + * +-+-+-+-+-+-+-+-+- + */ + while (len > 0) { + tmp = *in++; + *out++ = ((tmp & 0xc0) >> 6) | + ((tmp & 0x30) >> 2) | ((tmp & 0x0c) << 2) | ((tmp & 0x03) << 6); + len--; + } + break; + } + case 24000: + { + /* 0 1 2 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + * |C C|B B B|A A A|F|E E E|D D D|C|H H H|G G G|F F| ... + * |1 2|0 1 2|0 1 2|2|0 1 2|0 1 2|0|0 1 2|0 1 2|0 1| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + */ + while (len > 2) { + tmp = *in++; + *out++ = ((tmp & 0xe0) >> 5) | + ((tmp & 0x1c) << 1) | ((tmp & 0x03) << 6); + tmp = *in++; + *out++ = ((tmp & 0x80) >> 7) | + ((tmp & 0x70) >> 3) | ((tmp & 0x0e) << 4) | ((tmp & 0x01) << 7); + tmp = *in++; + *out++ = ((tmp & 0xc0) >> 6) | + ((tmp & 0x38) >> 1) | ((tmp & 0x07) << 5); + len -= 3; + } + break; + } + case 32000: + { + /* 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + * |B B B B|A A A A|D D D D|C C C C| ... + * |0 1 2 3|0 1 2 3|0 1 2 3|0 1 2 3| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + */ + while (len > 0) { + tmp = *in++; + *out++ = ((tmp & 0xf0) >> 4) | ((tmp & 0x0f) << 4); + len--; + } + break; + } + case 40000: + { + /* 0 1 2 3 4 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + * |B B B|A A A A A|D|C C C C C|B B|E E E E|D D D D|G G|F F F F F|E|H H H H H|G G G| + * |2 3 4|0 1 2 3 4|4|0 1 2 3 4|0 1|1 2 3 4|0 1 2 3|3 4|0 1 2 3 4|0|0 1 2 3 4|0 1 2| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + */ + while (len > 4) { + tmp = *in++; + *out++ = ((tmp & 0xf8) >> 3) | ((tmp & 0x07) << 5); + tmp = *in++; + *out++ = ((tmp & 0xc0) >> 6) | + ((tmp & 0x3e) << 1) | ((tmp & 0x01) << 7); + tmp = *in++; + *out++ = ((tmp & 0xf0) >> 4) | ((tmp & 0x0f) << 4); + tmp = *in++; + *out++ = ((tmp & 0x80) >> 7) | + ((tmp & 0x7c) >> 1) | ((tmp & 0x03) << 6); + tmp = *in++; + *out++ = ((tmp & 0xe0) >> 5) | ((tmp & 0x1f) << 3); + len -= 5; + } + break; + } + } + } + + if (marker) { + /* mark start of talkspurt with discont */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + return outbuf; + +bad_len: + return NULL; +} + +static void +gst_rtp_g726_depay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpG726Depay *rtpg726depay; + + rtpg726depay = GST_RTP_G726_DEPAY (object); + + switch (prop_id) { + case PROP_FORCE_AAL2: + rtpg726depay->force_aal2 = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_g726_depay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpG726Depay *rtpg726depay; + + rtpg726depay = GST_RTP_G726_DEPAY (object); + + switch (prop_id) { + case PROP_FORCE_AAL2: + g_value_set_boolean (value, rtpg726depay->force_aal2); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_rtp_g726_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpg726depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_G726_DEPAY); +} diff --git a/gst/rtp/gstrtpg726depay.h b/gst/rtp/gstrtpg726depay.h new file mode 100644 index 0000000..064a4fa --- /dev/null +++ b/gst/rtp/gstrtpg726depay.h @@ -0,0 +1,57 @@ +/* GStreamer + * Copyright (C) 2005 Edgard Lima + * Copyright (C) 2008 Axis Communications AB + * + * 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 + */ + +#ifndef __GST_RTP_G726_DEPAY_H__ +#define __GST_RTP_G726_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpG726Depay GstRtpG726Depay; +typedef struct _GstRtpG726DepayClass GstRtpG726DepayClass; + +#define GST_TYPE_RTP_G726_DEPAY \ + (gst_rtp_g726_depay_get_type()) +#define GST_RTP_G726_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G726_DEPAY,GstRtpG726Depay)) +#define GST_RTP_G726_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G726_DEPAY,GstRtpG726DepayClass)) +#define GST_IS_RTP_G726_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G726_DEPAY)) +#define GST_IS_RTP_G726_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G726_DEPAY)) + +struct _GstRtpG726Depay +{ + GstBaseRTPDepayload depayload; + + gboolean aal2; + gboolean force_aal2; + gint bitrate; +}; + +struct _GstRtpG726DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_g726_depay_get_type (void); + +gboolean gst_rtp_g726_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_RTP_G726_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpg726pay.c b/gst/rtp/gstrtpg726pay.c new file mode 100644 index 0000000..07c0f27 --- /dev/null +++ b/gst/rtp/gstrtpg726pay.c @@ -0,0 +1,419 @@ +/* GStreamer + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2005 Edgard Lima + * Copyright (C) 2005 Nokia Corporation + * Copyright (C) 2007,2008 Axis Communications + * + * 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 +#include +#include + +#include "gstrtpg726pay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpg726pay_debug); +#define GST_CAT_DEFAULT (rtpg726pay_debug) + +#define DEFAULT_FORCE_AAL2 TRUE + +enum +{ + PROP_0, + PROP_FORCE_AAL2, + PROP_LAST +}; + +static GstStaticPadTemplate gst_rtp_g726_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-adpcm, " + "channels = (int) 1, " + "rate = (int) 8000, " + "bitrate = (int) { 16000, 24000, 32000, 40000 }, " + "layout = (string) \"g726\"") + ); + +static GstStaticPadTemplate gst_rtp_g726_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) { \"G726-16\", \"G726-24\", \"G726-32\", \"G726-40\", " + " \"AAL2-G726-16\", \"AAL2-G726-24\", \"AAL2-G726-32\", \"AAL2-G726-40\" } ") + ); + +static void gst_rtp_g726_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_rtp_g726_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static gboolean gst_rtp_g726_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_g726_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpG726Pay, gst_rtp_g726_pay, GstBaseRTPAudioPayload, + GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); + +static void +gst_rtp_g726_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g726_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g726_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP G.726 payloader", + "Codec/Payloader/Network/RTP", + "Payload-encodes G.726 audio into a RTP packet", + "Axis Communications "); +} + +static void +gst_rtp_g726_pay_class_init (GstRtpG726PayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->set_property = gst_rtp_g726_pay_set_property; + gobject_class->get_property = gst_rtp_g726_pay_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FORCE_AAL2, + g_param_spec_boolean ("force-aal2", "Force AAL2", + "Force AAL2 encoding for compatibility with bad depayloaders", + DEFAULT_FORCE_AAL2, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasertppayload_class->set_caps = gst_rtp_g726_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_g726_pay_handle_buffer; + + GST_DEBUG_CATEGORY_INIT (rtpg726pay_debug, "rtpg726pay", 0, + "G.726 RTP Payloader"); +} + +static void +gst_rtp_g726_pay_init (GstRtpG726Pay * rtpg726pay, GstRtpG726PayClass * klass) +{ + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpg726pay); + + GST_BASE_RTP_PAYLOAD (rtpg726pay)->clock_rate = 8000; + + rtpg726pay->force_aal2 = DEFAULT_FORCE_AAL2; + + /* sample based codec */ + gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); +} + +static gboolean +gst_rtp_g726_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gchar *encoding_name; + GstStructure *structure; + GstBaseRTPAudioPayload *basertpaudiopayload; + GstRtpG726Pay *pay; + GstCaps *peercaps; + gboolean res; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (payload); + pay = GST_RTP_G726_PAY (payload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "bitrate", &pay->bitrate)) + pay->bitrate = 32000; + + GST_DEBUG_OBJECT (payload, "using bitrate %d", pay->bitrate); + + pay->aal2 = FALSE; + + /* first see what we can do with the bitrate */ + switch (pay->bitrate) { + case 16000: + encoding_name = g_strdup ("G726-16"); + gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, + 2); + break; + case 24000: + encoding_name = g_strdup ("G726-24"); + gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, + 3); + break; + case 32000: + encoding_name = g_strdup ("G726-32"); + gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, + 4); + break; + case 40000: + encoding_name = g_strdup ("G726-40"); + gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, + 5); + break; + default: + goto invalid_bitrate; + } + + GST_DEBUG_OBJECT (payload, "selected base encoding %s", encoding_name); + + /* now see if we need to produce AAL2 or not */ + peercaps = gst_pad_peer_get_caps (payload->srcpad); + if (peercaps) { + GstCaps *filter, *intersect; + gchar *capsstr; + + GST_DEBUG_OBJECT (payload, "have peercaps %" GST_PTR_FORMAT, peercaps); + + capsstr = g_strdup_printf ("application/x-rtp, " + "media = (string) \"audio\", " + "clock-rate = (int) 8000, " + "encoding-name = (string) %s; " + "application/x-rtp, " + "media = (string) \"audio\", " + "clock-rate = (int) 8000, " + "encoding-name = (string) AAL2-%s", encoding_name, encoding_name); + filter = gst_caps_from_string (capsstr); + g_free (capsstr); + + /* intersect to filter */ + intersect = gst_caps_intersect (peercaps, filter); + gst_caps_unref (peercaps); + + GST_DEBUG_OBJECT (payload, "intersected to %" GST_PTR_FORMAT, intersect); + + if (!intersect) + goto no_format; + if (gst_caps_is_empty (intersect)) { + gst_caps_unref (intersect); + goto no_format; + } + + structure = gst_caps_get_structure (intersect, 0); + + /* now see what encoding name we settled on, we need to dup because the + * string goes away when we unref the intersection below. */ + encoding_name = + g_strdup (gst_structure_get_string (structure, "encoding-name")); + + /* if we managed to negotiate to AAL2, we definatly are going to do AAL2 + * encoding. Else we only encode AAL2 when explicitly set by the + * property. */ + if (g_str_has_prefix (encoding_name, "AAL2-")) + pay->aal2 = TRUE; + else + pay->aal2 = pay->force_aal2; + + GST_DEBUG_OBJECT (payload, "final encoding %s, AAL2 %d", encoding_name, + pay->aal2); + + gst_caps_unref (intersect); + } else { + /* downstream can do anything but we prefer the better supported non-AAL2 */ + pay->aal2 = pay->force_aal2; + GST_DEBUG_OBJECT (payload, "no peer caps, AAL2 %d", pay->aal2); + } + + gst_basertppayload_set_options (payload, "audio", TRUE, encoding_name, 8000); + res = gst_basertppayload_set_outcaps (payload, NULL); + + g_free (encoding_name); + + return res; + + /* ERRORS */ +invalid_bitrate: + { + GST_ERROR_OBJECT (payload, "invalid bitrate %d specified", pay->bitrate); + return FALSE; + } +no_format: + { + GST_ERROR_OBJECT (payload, "could not negotiate format"); + return FALSE; + } +} + +static GstFlowReturn +gst_rtp_g726_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer) +{ + GstFlowReturn res; + GstRtpG726Pay *pay; + + pay = GST_RTP_G726_PAY (payload); + + if (!pay->aal2) { + guint8 *data, tmp; + guint len; + + /* for non AAL2, we need to reshuffle the bytes, we can do this in-place + * when the buffer is writable. */ + buffer = gst_buffer_make_writable (buffer); + + data = GST_BUFFER_DATA (buffer); + len = GST_BUFFER_SIZE (buffer); + + GST_LOG_OBJECT (pay, "packing %u bytes of data", len); + + /* we need to reshuffle the bytes, output is of the form: + * A B C D .. with the number of bits depending on the bitrate. */ + switch (pay->bitrate) { + case 16000: + { + /* 0 + * 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+- + * |D D|C C|B B|A A| ... + * |0 1|0 1|0 1|0 1| + * +-+-+-+-+-+-+-+-+- + */ + while (len > 0) { + tmp = *data; + *data++ = ((tmp & 0xc0) >> 6) | + ((tmp & 0x30) >> 2) | ((tmp & 0x0c) << 2) | ((tmp & 0x03) << 6); + len--; + } + break; + } + case 24000: + { + /* 0 1 2 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + * |C C|B B B|A A A|F|E E E|D D D|C|H H H|G G G|F F| ... + * |1 2|0 1 2|0 1 2|2|0 1 2|0 1 2|0|0 1 2|0 1 2|0 1| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + */ + while (len > 2) { + tmp = *data; + *data++ = ((tmp & 0xc0) >> 6) | + ((tmp & 0x38) >> 1) | ((tmp & 0x07) << 5); + tmp = *data; + *data++ = ((tmp & 0x80) >> 7) | + ((tmp & 0x70) >> 3) | ((tmp & 0x0e) << 4) | ((tmp & 0x01) << 7); + tmp = *data; + *data++ = ((tmp & 0xe0) >> 5) | + ((tmp & 0x1c) >> 2) | ((tmp & 0x03) << 6); + len -= 3; + } + break; + } + case 32000: + { + /* 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + * |B B B B|A A A A|D D D D|C C C C| ... + * |0 1 2 3|0 1 2 3|0 1 2 3|0 1 2 3| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + */ + while (len > 0) { + tmp = *data; + *data++ = ((tmp & 0xf0) >> 4) | ((tmp & 0x0f) << 4); + len--; + } + break; + } + case 40000: + { + /* 0 1 2 3 4 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + * |B B B|A A A A A|D|C C C C C|B B|E E E E|D D D D|G G|F F F F F|E|H H H H H|G G G| + * |2 3 4|0 1 2 3 4|4|0 1 2 3 4|0 1|1 2 3 4|0 1 2 3|3 4|0 1 2 3 4|0|0 1 2 3 4|0 1 2| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + */ + while (len > 4) { + tmp = *data; + *data++ = ((tmp & 0xe0) >> 5) | ((tmp & 0x1f) << 3); + tmp = *data; + *data++ = ((tmp & 0x80) >> 7) | + ((tmp & 0x7c) >> 2) | ((tmp & 0x03) << 6); + tmp = *data; + *data++ = ((tmp & 0xf0) >> 4) | ((tmp & 0x0f) << 4); + tmp = *data; + *data++ = ((tmp & 0xc0) >> 6) | + ((tmp & 0x3e) << 2) | ((tmp & 0x01) << 7); + tmp = *data; + *data++ = ((tmp & 0xf8) >> 3) | ((tmp & 0x07) << 5); + len -= 5; + } + break; + } + } + } + + res = + GST_BASE_RTP_PAYLOAD_CLASS (parent_class)->handle_buffer (payload, + buffer); + + return res; +} + +static void +gst_rtp_g726_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpG726Pay *rtpg726pay; + + rtpg726pay = GST_RTP_G726_PAY (object); + + switch (prop_id) { + case PROP_FORCE_AAL2: + rtpg726pay->force_aal2 = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_g726_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpG726Pay *rtpg726pay; + + rtpg726pay = GST_RTP_G726_PAY (object); + + switch (prop_id) { + case PROP_FORCE_AAL2: + g_value_set_boolean (value, rtpg726pay->force_aal2); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_rtp_g726_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpg726pay", + GST_RANK_SECONDARY, GST_TYPE_RTP_G726_PAY); +} diff --git a/gst/rtp/gstrtpg726pay.h b/gst/rtp/gstrtpg726pay.h new file mode 100644 index 0000000..ce3dbdc --- /dev/null +++ b/gst/rtp/gstrtpg726pay.h @@ -0,0 +1,55 @@ +/* GStreamer + * Copyright (C) 2005 Edgard Lima + * Copyright (C) 2007,2008 Axis Communications + * + * 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 + */ + +#ifndef __GST_RTP_G726_PAY_H__ +#define __GST_RTP_G726_PAY_H__ + +#include +#include + +G_BEGIN_DECLS typedef struct _GstRtpG726Pay GstRtpG726Pay; +typedef struct _GstRtpG726PayClass GstRtpG726PayClass; + +#define GST_TYPE_RTP_G726_PAY \ + (gst_rtp_g726_pay_get_type()) +#define GST_RTP_G726_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G726_PAY,GstRtpG726Pay)) +#define GST_RTP_G726_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G726_PAY,GstRtpG726PayClass)) +#define GST_IS_RTP_G726_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G726_PAY)) +#define GST_IS_RTP_G726_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G726_PAY)) + +struct _GstRtpG726Pay +{ + GstBaseRTPAudioPayload audiopayload; + + gboolean aal2; + gboolean force_aal2; + gint bitrate; +}; + +struct _GstRtpG726PayClass +{ + GstBaseRTPAudioPayloadClass parent_class; +}; + +GType gst_rtp_g726_pay_get_type (void); + +gboolean gst_rtp_g726_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_RTP_G726_PAY_H__ */ diff --git a/gst/rtp/gstrtpg729depay.c b/gst/rtp/gstrtpg729depay.c new file mode 100644 index 0000000..69799ad --- /dev/null +++ b/gst/rtp/gstrtpg729depay.c @@ -0,0 +1,227 @@ +/* GStreamer + * + * 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 + +#include +#include +#include "gstrtpg729depay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpg729depay_debug); +#define GST_CAT_DEFAULT (rtpg729depay_debug) + + +/* references: + * + * RFC 3551 (4.5.6) + */ + +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +/* input is an RTP packet + * + */ +static GstStaticPadTemplate gst_rtp_g729_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"G729\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_G729_STRING ", " + "clock-rate = (int) 8000") + ); + +static GstStaticPadTemplate gst_rtp_g729_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/G729, " "channels = (int) 1," "rate = (int) 8000") + ); + +static gboolean gst_rtp_g729_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_g729_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +GST_BOILERPLATE (GstRtpG729Depay, gst_rtp_g729_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_g729_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g729_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g729_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP G.729 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts G.729 audio from RTP packets (RFC 3551)", + "Laurent Glayal "); + + GST_DEBUG_CATEGORY_INIT (rtpg729depay_debug, "rtpg729depay", 0, + "G.729 RTP Depayloader"); +} + +static void +gst_rtp_g729_depay_class_init (GstRtpG729DepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_g729_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_g729_depay_setcaps; +} + +static void +gst_rtp_g729_depay_init (GstRtpG729Depay * rtpg729depay, + GstRtpG729DepayClass * klass) +{ + GstBaseRTPDepayload *depayload; + + depayload = GST_BASE_RTP_DEPAYLOAD (rtpg729depay); + + gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); +} + +static gboolean +gst_rtp_g729_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstCaps *srccaps; + GstRtpG729Depay *rtpg729depay; + const gchar *params; + gint clock_rate, channels; + gboolean ret; + + rtpg729depay = GST_RTP_G729_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!(params = gst_structure_get_string (structure, "encoding-params"))) + channels = 1; + else { + channels = atoi (params); + } + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 8000; + + if (channels != 1) + goto wrong_channels; + + if (clock_rate != 8000) + goto wrong_clock_rate; + + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("audio/G729", + "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, clock_rate, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return ret; + + /* ERRORS */ +wrong_channels: + { + GST_DEBUG_OBJECT (rtpg729depay, "expected 1 channel, got %d", channels); + return FALSE; + } +wrong_clock_rate: + { + GST_DEBUG_OBJECT (rtpg729depay, "expected 8000 clock-rate, got %d", + clock_rate); + return FALSE; + } +} + + +static GstBuffer * +gst_rtp_g729_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpG729Depay *rtpg729depay; + GstBuffer *outbuf = NULL; + gint payload_len; + gboolean marker; + + rtpg729depay = GST_RTP_G729_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + /* At least 2 bytes (CNG from G729 Annex B) */ + if (payload_len < 2) { + GST_ELEMENT_WARNING (rtpg729depay, STREAM, DECODE, + (NULL), ("G729 RTP payload too small (%d)", payload_len)); + goto bad_packet; + } + + GST_LOG_OBJECT (rtpg729depay, "payload len %d", payload_len); + + if ((payload_len % 10) == 2) { + GST_LOG_OBJECT (rtpg729depay, "G729 payload contains CNG frame"); + } + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + marker = gst_rtp_buffer_get_marker (buf); + + if (marker) { + /* marker bit starts talkspurt */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + GST_LOG_OBJECT (depayload, "pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + return outbuf; + + /* ERRORS */ +bad_packet: + { + /* no fatal error */ + return NULL; + } +} + +gboolean +gst_rtp_g729_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpg729depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_G729_DEPAY); +} diff --git a/gst/rtp/gstrtpg729depay.h b/gst/rtp/gstrtpg729depay.h new file mode 100644 index 0000000..f02db5c --- /dev/null +++ b/gst/rtp/gstrtpg729depay.h @@ -0,0 +1,61 @@ +/* GStreamer + * + * 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_RTP_G729_DEPAY_H__ +#define __GST_RTP_G729_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_G729_DEPAY \ + (gst_rtp_g729_depay_get_type()) + +#define GST_RTP_G729_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G729_DEPAY,GstRtpG729Depay)) + +#define GST_RTP_G729_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G729_DEPAY,GstRtpG729DepayClass)) + +#define GST_IS_RTP_G729_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G729_DEPAY)) + +#define GST_IS_RTP_G729_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G729_DEPAY)) + +typedef struct _GstRtpG729Depay GstRtpG729Depay; +typedef struct _GstRtpG729DepayClass GstRtpG729DepayClass; + +struct _GstRtpG729Depay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpG729DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_g729_depay_get_type (void); + +gboolean gst_rtp_g729_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_G729_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpg729pay.c b/gst/rtp/gstrtpg729pay.c new file mode 100644 index 0000000..60364cc --- /dev/null +++ b/gst/rtp/gstrtpg729pay.c @@ -0,0 +1,403 @@ +/* GStreamer + * Copyright (C) <2007> Nokia Corporation + * Copyright (C) <2007> Collabora Ltd + * @author: Olivier Crete + * + * 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 payloader assumes that the data will ALWAYS come as zero or more + * 10 bytes frame of audio followed by 0 or 1 2 byte frame of silence. + * Any other buffer format won't work + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gstrtpg729pay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpg729pay_debug); +#define GST_CAT_DEFAULT (rtpg729pay_debug) + +#define G729_FRAME_SIZE 10 +#define G729B_CN_FRAME_SIZE 2 +#define G729_FRAME_DURATION (10 * GST_MSECOND) +#define G729_FRAME_DURATION_MS (10) + +static gboolean +gst_rtp_g729_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps); +static GstFlowReturn +gst_rtp_g729_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf); + +static GstStateChangeReturn +gst_rtp_g729_pay_change_state (GstElement * element, GstStateChange transition); + +static GstStaticPadTemplate gst_rtp_g729_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/G729, " /* according to RFC 3555 */ + "channels = (int) 1, " "rate = (int) 8000") + ); + +static GstStaticPadTemplate gst_rtp_g729_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_G729_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"G729\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"G729\"") + ); + +GST_BOILERPLATE (GstRTPG729Pay, gst_rtp_g729_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_g729_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g729_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_g729_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP G.729 payloader", + "Codec/Payloader/Network/RTP", + "Packetize G.729 audio into RTP packets", + "Olivier Crete "); + + GST_DEBUG_CATEGORY_INIT (rtpg729pay_debug, "rtpg729pay", 0, + "G.729 RTP Payloader"); +} + +static void +gst_rtp_g729_pay_finalize (GObject * object) +{ + GstRTPG729Pay *pay = GST_RTP_G729_PAY (object); + + g_object_unref (pay->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_rtp_g729_pay_class_init (GstRTPG729PayClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + GstBaseRTPPayloadClass *payload_class = GST_BASE_RTP_PAYLOAD_CLASS (klass); + + gobject_class->finalize = gst_rtp_g729_pay_finalize; + + gstelement_class->change_state = gst_rtp_g729_pay_change_state; + + payload_class->set_caps = gst_rtp_g729_pay_set_caps; + payload_class->handle_buffer = gst_rtp_g729_pay_handle_buffer; +} + +static void +gst_rtp_g729_pay_init (GstRTPG729Pay * pay, GstRTPG729PayClass * klass) +{ + GstBaseRTPPayload *payload = GST_BASE_RTP_PAYLOAD (pay); + + payload->pt = GST_RTP_PAYLOAD_G729; + gst_basertppayload_set_options (payload, "audio", FALSE, "G729", 8000); + + pay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_g729_pay_reset (GstRTPG729Pay * pay) +{ + gst_adapter_clear (pay->adapter); + pay->discont = FALSE; + pay->next_rtp_time = 0; + pay->first_ts = GST_CLOCK_TIME_NONE; + pay->first_rtp_time = 0; +} + +static gboolean +gst_rtp_g729_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + GstStructure *structure; + gint pt; + + structure = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (structure, "payload", &pt)) + pt = GST_RTP_PAYLOAD_G729; + + payload->pt = pt; + payload->dynamic = pt != GST_RTP_PAYLOAD_G729; + + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; +} + +static GstFlowReturn +gst_rtp_g729_pay_push (GstRTPG729Pay * rtpg729pay, + const guint8 * data, guint payload_len) +{ + GstBaseRTPPayload *basepayload; + GstClockTime duration; + guint frames; + GstBuffer *outbuf; + guint8 *payload; + GstFlowReturn ret; + + basepayload = GST_BASE_RTP_PAYLOAD (rtpg729pay); + + GST_DEBUG_OBJECT (rtpg729pay, "Pushing %d bytes ts %" GST_TIME_FORMAT, + payload_len, GST_TIME_ARGS (rtpg729pay->next_ts)); + + /* create buffer to hold the payload */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + + /* copy payload */ + payload = gst_rtp_buffer_get_payload (outbuf); + memcpy (payload, data, payload_len); + + /* set metadata */ + frames = + (payload_len / G729_FRAME_SIZE) + ((payload_len % G729_FRAME_SIZE) >> 1); + duration = frames * G729_FRAME_DURATION; + GST_BUFFER_TIMESTAMP (outbuf) = rtpg729pay->next_ts; + GST_BUFFER_DURATION (outbuf) = duration; + GST_BUFFER_OFFSET (outbuf) = rtpg729pay->next_rtp_time; + rtpg729pay->next_ts += duration; + rtpg729pay->next_rtp_time += frames * 80; + + if (G_UNLIKELY (rtpg729pay->discont)) { + GST_DEBUG_OBJECT (basepayload, "discont, setting marker bit"); + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + gst_rtp_buffer_set_marker (outbuf, TRUE); + rtpg729pay->discont = FALSE; + } + + ret = gst_basertppayload_push (basepayload, outbuf); + + return ret; +} + +static void +gst_rtp_g729_pay_recalc_rtp_time (GstRTPG729Pay * rtpg729pay, GstClockTime time) +{ + if (GST_CLOCK_TIME_IS_VALID (rtpg729pay->first_ts) + && GST_CLOCK_TIME_IS_VALID (time) && time >= rtpg729pay->first_ts) { + GstClockTime diff; + guint32 rtpdiff; + + diff = time - rtpg729pay->first_ts; + rtpdiff = (diff / GST_MSECOND) * 8; + rtpg729pay->next_rtp_time = rtpg729pay->first_rtp_time + rtpdiff; + GST_DEBUG_OBJECT (rtpg729pay, + "elapsed time %" GST_TIME_FORMAT ", rtp %" G_GUINT32_FORMAT ", " + "new offset %" G_GUINT32_FORMAT, GST_TIME_ARGS (diff), rtpdiff, + rtpg729pay->next_rtp_time); + } +} + +static GstFlowReturn +gst_rtp_g729_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstRTPG729Pay *rtpg729pay = GST_RTP_G729_PAY (payload); + GstAdapter *adapter = NULL; + guint payload_len; + guint available; + guint maxptime_octets = G_MAXUINT; + guint minptime_octets = 0; + guint min_payload_len; + guint max_payload_len; + + available = GST_BUFFER_SIZE (buf); + + if (available % G729_FRAME_SIZE != 0 && + available % G729_FRAME_SIZE != G729B_CN_FRAME_SIZE) + goto invalid_size; + + /* max number of bytes based on given ptime, has to be multiple of + * frame_duration */ + if (payload->max_ptime != -1) { + guint ptime_ms = payload->max_ptime / GST_MSECOND; + + maxptime_octets = G729_FRAME_SIZE * + (int) (ptime_ms / G729_FRAME_DURATION_MS); + + if (maxptime_octets < G729_FRAME_SIZE) { + GST_WARNING_OBJECT (payload, "Given ptime %" G_GINT64_FORMAT + " is smaller than minimum %d ns, overwriting to minimum", + payload->max_ptime, G729_FRAME_DURATION_MS); + maxptime_octets = G729_FRAME_SIZE; + } + } + + max_payload_len = MIN ( + /* MTU max */ + (int) (gst_rtp_buffer_calc_payload_len (GST_BASE_RTP_PAYLOAD_MTU + (payload), 0, 0) / G729_FRAME_SIZE) + * G729_FRAME_SIZE, + /* ptime max */ + maxptime_octets); + + /* min number of bytes based on a given ptime, has to be a multiple + of frame duration */ + { + guint64 min_ptime = payload->min_ptime; + + min_ptime = min_ptime / GST_MSECOND; + minptime_octets = G729_FRAME_SIZE * + (int) (min_ptime / G729_FRAME_DURATION_MS); + } + + min_payload_len = MAX (minptime_octets, G729_FRAME_SIZE); + + if (min_payload_len > max_payload_len) { + min_payload_len = max_payload_len; + } + + /* If the ptime is specified in the caps, tried to adhere to it exactly */ + if (payload->abidata.ABI.ptime) { + guint64 ptime = payload->abidata.ABI.ptime / GST_MSECOND; + guint ptime_in_bytes = G729_FRAME_SIZE * + (guint) (ptime / G729_FRAME_DURATION_MS); + + /* clip to computed min and max lengths */ + ptime_in_bytes = MAX (min_payload_len, ptime_in_bytes); + ptime_in_bytes = MIN (max_payload_len, ptime_in_bytes); + + min_payload_len = max_payload_len = ptime_in_bytes; + } + + GST_LOG_OBJECT (payload, + "Calculated min_payload_len %u and max_payload_len %u", + min_payload_len, max_payload_len); + + adapter = rtpg729pay->adapter; + available = gst_adapter_available (adapter); + + /* resync rtp time on discont or a discontinuous cn packet */ + if (GST_BUFFER_IS_DISCONT (buf)) { + /* flush remainder */ + if (available > 0) { + gst_rtp_g729_pay_push (rtpg729pay, + gst_adapter_take (adapter, available), available); + available = 0; + } + rtpg729pay->discont = TRUE; + gst_rtp_g729_pay_recalc_rtp_time (rtpg729pay, GST_BUFFER_TIMESTAMP (buf)); + } + + if (GST_BUFFER_SIZE (buf) < G729_FRAME_SIZE) + gst_rtp_g729_pay_recalc_rtp_time (rtpg729pay, GST_BUFFER_TIMESTAMP (buf)); + + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (rtpg729pay->first_ts))) { + rtpg729pay->first_ts = GST_BUFFER_TIMESTAMP (buf); + rtpg729pay->first_rtp_time = rtpg729pay->next_rtp_time; + } + + /* let's reset the base timestamp when the adapter is empty */ + if (available == 0) + rtpg729pay->next_ts = GST_BUFFER_TIMESTAMP (buf); + + if (available == 0 && + GST_BUFFER_SIZE (buf) >= min_payload_len && + GST_BUFFER_SIZE (buf) <= max_payload_len) { + ret = gst_rtp_g729_pay_push (rtpg729pay, + GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + gst_buffer_unref (buf); + return ret; + } + + gst_adapter_push (adapter, buf); + available = gst_adapter_available (adapter); + + /* as long as we have full frames */ + /* this loop will push all available buffers till the last frame */ + while (available >= min_payload_len || + available % G729_FRAME_SIZE == G729B_CN_FRAME_SIZE) { + /* We send as much as we can */ + if (available <= max_payload_len) { + payload_len = available; + } else { + payload_len = MIN (max_payload_len, + (available / G729_FRAME_SIZE) * G729_FRAME_SIZE); + } + + ret = gst_rtp_g729_pay_push (rtpg729pay, + gst_adapter_take (adapter, payload_len), payload_len); + available -= payload_len; + } + + return ret; + + /* ERRORS */ +invalid_size: + { + GST_ELEMENT_ERROR (payload, STREAM, WRONG_TYPE, + ("Invalid input buffer size"), + ("Invalid buffer size, should be a multiple of" + " G729_FRAME_SIZE(10) with an optional G729B_CN_FRAME_SIZE(2)" + " added to it, but it is %u", available)); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +} + +static GstStateChangeReturn +gst_rtp_g729_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + /* handle upwards state changes here */ + switch (transition) { + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + /* handle downwards state changes */ + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_g729_pay_reset (GST_RTP_G729_PAY (element)); + break; + default: + break; + } + + return ret; +} + +gboolean +gst_rtp_g729_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpg729pay", + GST_RANK_SECONDARY, GST_TYPE_RTP_G729_PAY); +} diff --git a/gst/rtp/gstrtpg729pay.h b/gst/rtp/gstrtpg729pay.h new file mode 100644 index 0000000..04c6e79 --- /dev/null +++ b/gst/rtp/gstrtpg729pay.h @@ -0,0 +1,66 @@ +/* GStreamer + * Copyright (C) <2007> Nokia Corporation + * Copyright (C) <2007> Collabora Ltd + * + * 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_RTP_G729_PAY_H__ +#define __GST_RTP_G729_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_G729_PAY \ + (gst_rtp_g729_pay_get_type()) +#define GST_RTP_G729_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G729_PAY,GstRTPG729Pay)) +#define GST_RTP_G729_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G729_PAY,GstRTPG729PayClass)) +#define GST_IS_RTP_G729_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G729_PAY)) +#define GST_IS_RTP_G729_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G729_PAY)) + +typedef struct _GstRTPG729Pay GstRTPG729Pay; +typedef struct _GstRTPG729PayClass GstRTPG729PayClass; + +struct _GstRTPG729Pay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime next_ts; + guint32 next_rtp_time; + GstClockTime first_ts; + guint32 first_rtp_time; + gboolean discont; +}; + +struct _GstRTPG729PayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_g729_pay_get_type (void); + +gboolean gst_rtp_g729_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_G729_PAY_H__ */ diff --git a/gst/rtp/gstrtpgsmdepay.c b/gst/rtp/gstrtpgsmdepay.c new file mode 100644 index 0000000..989991f --- /dev/null +++ b/gst/rtp/gstrtpgsmdepay.c @@ -0,0 +1,152 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2005> Zeeshan Ali + * + * 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 +#include +#include "gstrtpgsmdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpgsmdepay_debug); +#define GST_CAT_DEFAULT (rtpgsmdepay_debug) + +/* RTPGSMDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +static GstStaticPadTemplate gst_rtp_gsm_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) 8000, " "channels = 1") + ); + +static GstStaticPadTemplate gst_rtp_gsm_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\";" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_GSM_STRING ", " + "clock-rate = (int) 8000") + ); + +static GstBuffer *gst_rtp_gsm_depay_process (GstBaseRTPDepayload * _depayload, + GstBuffer * buf); +static gboolean gst_rtp_gsm_depay_setcaps (GstBaseRTPDepayload * _depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRTPGSMDepay, gst_rtp_gsm_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_gsm_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_gsm_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_gsm_depay_sink_template); + gst_element_class_set_details_simple (element_class, "RTP GSM depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts GSM audio from RTP packets", "Zeeshan Ali "); +} + +static void +gst_rtp_gsm_depay_class_init (GstRTPGSMDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertp_depayload_class; + + gstbasertp_depayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertp_depayload_class->process = gst_rtp_gsm_depay_process; + gstbasertp_depayload_class->set_caps = gst_rtp_gsm_depay_setcaps; + + GST_DEBUG_CATEGORY_INIT (rtpgsmdepay_debug, "rtpgsmdepay", 0, + "GSM Audio RTP Depayloader"); +} + +static void +gst_rtp_gsm_depay_init (GstRTPGSMDepay * rtpgsmdepay, + GstRTPGSMDepayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static gboolean +gst_rtp_gsm_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + gboolean ret; + GstStructure *structure; + gint clock_rate; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 8000; /* default */ + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("audio/x-gsm", + "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, clock_rate, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return ret; +} + +static GstBuffer * +gst_rtp_gsm_depay_process (GstBaseRTPDepayload * _depayload, GstBuffer * buf) +{ + GstBuffer *outbuf = NULL; + gboolean marker; + + marker = gst_rtp_buffer_get_marker (buf); + + GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", + GST_BUFFER_SIZE (buf), marker, + gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + if (marker && outbuf) { + /* mark start of talkspurt with DISCONT */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + return outbuf; +} + +gboolean +gst_rtp_gsm_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpgsmdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_GSM_DEPAY); +} diff --git a/gst/rtp/gstrtpgsmdepay.h b/gst/rtp/gstrtpgsmdepay.h new file mode 100644 index 0000000..221f4b3 --- /dev/null +++ b/gst/rtp/gstrtpgsmdepay.h @@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_RTP_GSM_DEPAY_H__ +#define __GST_RTP_GSM_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRTPGSMDepay GstRTPGSMDepay; +typedef struct _GstRTPGSMDepayClass GstRTPGSMDepayClass; + +#define GST_TYPE_RTP_GSM_DEPAY \ + (gst_rtp_gsm_depay_get_type()) +#define GST_RTP_GSM_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_DEPAY,GstRTPGSMDepay)) +#define GST_RTP_GSM_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_DEPAY,GstRTPGSMDepayClass)) +#define GST_IS_RTP_GSM_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GSM_DEPAY)) +#define GST_IS_RTP_GSM_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_DEPAY)) + +struct _GstRTPGSMDepay +{ + GstBaseRTPDepayload _depayload; +}; + +struct _GstRTPGSMDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_gsm_depay_get_type (void); + +gboolean gst_rtp_gsm_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_GSM_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpgsmpay.c b/gst/rtp/gstrtpgsmpay.c new file mode 100644 index 0000000..6506262 --- /dev/null +++ b/gst/rtp/gstrtpgsmpay.c @@ -0,0 +1,183 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2005> Zeeshan Ali + * + * 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 +#include +#include + +#include "gstrtpgsmpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpgsmpay_debug); +#define GST_CAT_DEFAULT (rtpgsmpay_debug) + +static GstStaticPadTemplate gst_rtp_gsm_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) 8000, " "channels = (int) 1") + ); + +static GstStaticPadTemplate gst_rtp_gsm_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_GSM_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\"") + ); + +static gboolean gst_rtp_gsm_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_gsm_pay_handle_buffer (GstBaseRTPPayload * payload, + GstBuffer * buffer); + +GST_BOILERPLATE (GstRTPGSMPay, gst_rtp_gsm_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_gsm_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_gsm_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_gsm_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP GSM payloader", + "Codec/Payloader/Network/RTP", + "Payload-encodes GSM audio into a RTP packet", + "Zeeshan Ali "); +} + +static void +gst_rtp_gsm_pay_class_init (GstRTPGSMPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_gsm_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_gsm_pay_handle_buffer; + + GST_DEBUG_CATEGORY_INIT (rtpgsmpay_debug, "rtpgsmpay", 0, + "GSM Audio RTP Payloader"); +} + +static void +gst_rtp_gsm_pay_init (GstRTPGSMPay * rtpgsmpay, GstRTPGSMPayClass * klass) +{ + GST_BASE_RTP_PAYLOAD (rtpgsmpay)->clock_rate = 8000; + GST_BASE_RTP_PAYLOAD_PT (rtpgsmpay) = GST_RTP_PAYLOAD_GSM; +} + +static gboolean +gst_rtp_gsm_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + const char *stname; + GstStructure *structure; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + + stname = gst_structure_get_name (structure); + + if (strcmp ("audio/x-gsm", stname)) + goto invalid_type; + + gst_basertppayload_set_options (payload, "audio", FALSE, "GSM", 8000); + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; + + /* ERRORS */ +invalid_type: + { + GST_WARNING_OBJECT (payload, "invalid media type received"); + return FALSE; + } +} + +static GstFlowReturn +gst_rtp_gsm_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRTPGSMPay *rtpgsmpay; + guint size, payload_len; + GstBuffer *outbuf; + guint8 *payload, *data; + GstClockTime timestamp, duration; + GstFlowReturn ret; + + rtpgsmpay = GST_RTP_GSM_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + + /* FIXME, only one GSM frame per RTP packet for now */ + payload_len = size; + + /* FIXME, just error out for now */ + if (payload_len > GST_BASE_RTP_PAYLOAD_MTU (rtpgsmpay)) { + GST_ELEMENT_ERROR (rtpgsmpay, STREAM, ENCODE, (NULL), + ("payload_len %u > mtu %u", payload_len, + GST_BASE_RTP_PAYLOAD_MTU (rtpgsmpay))); + return GST_FLOW_ERROR; + } + + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + + /* copy timestamp and duration */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = duration; + + /* get payload */ + payload = gst_rtp_buffer_get_payload (outbuf); + + data = GST_BUFFER_DATA (buffer); + + /* copy data in payload */ + memcpy (&payload[0], data, size); + + gst_buffer_unref (buffer); + + GST_DEBUG ("gst_rtp_gsm_pay_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + ret = gst_basertppayload_push (basepayload, outbuf); + + return ret; +} + +gboolean +gst_rtp_gsm_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpgsmpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_GSM_PAY); +} diff --git a/gst/rtp/gstrtpgsmpay.h b/gst/rtp/gstrtpgsmpay.h new file mode 100644 index 0000000..4172402 --- /dev/null +++ b/gst/rtp/gstrtpgsmpay.h @@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_RTP_GSM_PAY_H__ +#define __GST_RTP_GSM_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRTPGSMPay GstRTPGSMPay; +typedef struct _GstRTPGSMPayClass GstRTPGSMPayClass; + +#define GST_TYPE_RTP_GSM_PAY \ + (gst_rtp_gsm_pay_get_type()) +#define GST_RTP_GSM_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_PAY,GstRTPGSMPay)) +#define GST_RTP_GSM_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_PAY,GstRTPGSMPayClass)) +#define GST_IS_RTP_GSM_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GSM_PAY)) +#define GST_IS_RTP_GSM_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_PAY)) + +struct _GstRTPGSMPay +{ + GstBaseRTPPayload payload; +}; + +struct _GstRTPGSMPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_gsm_pay_get_type (void); + +gboolean gst_rtp_gsm_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_GSM_PAY_H__ */ diff --git a/gst/rtp/gstrtpgstdepay.c b/gst/rtp/gstrtpgstdepay.c new file mode 100644 index 0000000..b187db4 --- /dev/null +++ b/gst/rtp/gstrtpgstdepay.c @@ -0,0 +1,359 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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 + +#include +#include "gstrtpgstdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpgstdepay_debug); +#define GST_CAT_DEFAULT (rtpgstdepay_debug) + +static GstStaticPadTemplate gst_rtp_gst_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_rtp_gst_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"application\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"X-GST\"") + ); + +GST_BOILERPLATE (GstRtpGSTDepay, gst_rtp_gst_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_gst_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_gst_depay_change_state (GstElement * + element, GstStateChange transition); + +static void gst_rtp_gst_depay_reset (GstRtpGSTDepay * rtpgstdepay); +static gboolean gst_rtp_gst_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_gst_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_gst_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_gst_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_gst_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "GStreamer depayloader", "Codec/Depayloader/Network", + "Extracts GStreamer buffers from RTP packets", + "Wim Taymans "); +} + +static void +gst_rtp_gst_depay_class_init (GstRtpGSTDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_gst_depay_finalize; + + gstelement_class->change_state = gst_rtp_gst_depay_change_state; + + gstbasertpdepayload_class->set_caps = gst_rtp_gst_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_gst_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpgstdepay_debug, "rtpgstdepay", 0, + "Gstreamer RTP Depayloader"); +} + +static void +gst_rtp_gst_depay_init (GstRtpGSTDepay * rtpgstdepay, + GstRtpGSTDepayClass * klass) +{ + rtpgstdepay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_gst_depay_finalize (GObject * object) +{ + GstRtpGSTDepay *rtpgstdepay; + + rtpgstdepay = GST_RTP_GST_DEPAY (object); + + gst_rtp_gst_depay_reset (rtpgstdepay); + g_object_unref (rtpgstdepay->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +store_cache (GstRtpGSTDepay * rtpgstdepay, guint CV, GstCaps * caps) +{ + if (rtpgstdepay->CV_cache[CV]) + gst_caps_unref (rtpgstdepay->CV_cache[CV]); + rtpgstdepay->CV_cache[CV] = caps; +} + +static void +gst_rtp_gst_depay_reset (GstRtpGSTDepay * rtpgstdepay) +{ + guint i; + + gst_adapter_clear (rtpgstdepay->adapter); + rtpgstdepay->current_CV = 0; + for (i = 0; i < 8; i++) + store_cache (rtpgstdepay, i, NULL); +} + +static gboolean +gst_rtp_gst_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstRtpGSTDepay *rtpgstdepay; + GstStructure *structure; + GstCaps *outcaps; + gint clock_rate; + gboolean res; + const gchar *capsenc; + gchar *capsstr; + + rtpgstdepay = GST_RTP_GST_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; + depayload->clock_rate = clock_rate; + + capsenc = gst_structure_get_string (structure, "caps"); + if (capsenc) { + gsize out_len; + + capsstr = (gchar *) g_base64_decode (capsenc, &out_len); + outcaps = gst_caps_from_string (capsstr); + g_free (capsstr); + + /* we have the SDP caps as output caps */ + rtpgstdepay->current_CV = 0; + gst_caps_ref (outcaps); + store_cache (rtpgstdepay, 0, outcaps); + } else { + outcaps = gst_caps_new_any (); + } + res = gst_pad_set_caps (depayload->srcpad, outcaps); + gst_caps_unref (outcaps); + + return res; +} + +static GstBuffer * +gst_rtp_gst_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpGSTDepay *rtpgstdepay; + GstBuffer *subbuf, *outbuf = NULL; + gint payload_len; + guint8 *payload; + guint CV; + + rtpgstdepay = GST_RTP_GST_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + if (payload_len <= 8) + goto empty_packet; + + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_WARNING_OBJECT (rtpgstdepay, "DISCONT, clear adapter"); + gst_adapter_clear (rtpgstdepay->adapter); + } + + payload = gst_rtp_buffer_get_payload (buf); + + /* strip off header + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |C| CV |D|X|Y|Z| MBZ | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Frag_offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + /* frag_offset = + * (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | payload[7]; + */ + + /* subbuffer skipping the 8 header bytes */ + subbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 8, -1); + gst_adapter_push (rtpgstdepay->adapter, subbuf); + + if (gst_rtp_buffer_get_marker (buf)) { + guint avail; + GstCaps *outcaps; + + /* take the buffer */ + avail = gst_adapter_available (rtpgstdepay->adapter); + outbuf = gst_adapter_take_buffer (rtpgstdepay->adapter, avail); + + CV = (payload[0] >> 4) & 0x7; + + if (payload[0] & 0x80) { + guint b, csize, size, offset; + guint8 *data; + GstBuffer *subbuf; + + /* C bit, we have inline caps */ + data = GST_BUFFER_DATA (outbuf); + size = GST_BUFFER_SIZE (outbuf); + + /* start reading the length, we need this to skip to the data later */ + csize = offset = 0; + do { + if (offset >= size) + goto too_small; + b = data[offset++]; + csize = (csize << 7) | (b & 0x7f); + } while (b & 0x80); + + if (size < csize) + goto too_small; + + /* parse and store in cache */ + outcaps = gst_caps_from_string ((gchar *) & data[offset]); + store_cache (rtpgstdepay, CV, outcaps); + + /* skip caps */ + offset += csize; + size -= csize; + + GST_DEBUG_OBJECT (rtpgstdepay, + "inline caps %u, length %u, %" GST_PTR_FORMAT, CV, csize, outcaps); + + /* create real data buffer when needed */ + if (size) + subbuf = gst_buffer_create_sub (outbuf, offset, size); + else + subbuf = NULL; + + gst_buffer_unref (outbuf); + outbuf = subbuf; + } + + /* see what caps we need */ + if (CV != rtpgstdepay->current_CV) { + /* we need to switch caps, check if we have the caps */ + if ((outcaps = rtpgstdepay->CV_cache[CV]) == NULL) + goto missing_caps; + + GST_DEBUG_OBJECT (rtpgstdepay, + "need caps switch from %u to %u, %" GST_PTR_FORMAT, + rtpgstdepay->current_CV, CV, outcaps); + + /* and set caps */ + if (gst_pad_set_caps (depayload->srcpad, outcaps)) + rtpgstdepay->current_CV = CV; + } + + if (outbuf) { + if (payload[0] & 0x8) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + if (payload[0] & 0x4) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_MEDIA1); + if (payload[0] & 0x2) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_MEDIA2); + if (payload[0] & 0x1) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_MEDIA3); + } + } + return outbuf; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE, + ("Empty Payload."), (NULL)); + return NULL; + } +too_small: + { + GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE, + ("Buffer too small."), (NULL)); + if (outbuf) + gst_buffer_unref (outbuf); + return NULL; + } +missing_caps: + { + GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE, + ("Missing caps %u.", CV), (NULL)); + if (outbuf) + gst_buffer_unref (outbuf); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_gst_depay_change_state (GstElement * element, GstStateChange transition) +{ + GstRtpGSTDepay *rtpgstdepay; + GstStateChangeReturn ret; + + rtpgstdepay = GST_RTP_GST_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_gst_depay_reset (rtpgstdepay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_gst_depay_reset (rtpgstdepay); + break; + default: + break; + } + return ret; +} + + +gboolean +gst_rtp_gst_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpgstdepay", + GST_RANK_MARGINAL, GST_TYPE_RTP_GST_DEPAY); +} diff --git a/gst/rtp/gstrtpgstdepay.h b/gst/rtp/gstrtpgstdepay.h new file mode 100644 index 0000000..7a50856 --- /dev/null +++ b/gst/rtp/gstrtpgstdepay.h @@ -0,0 +1,63 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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_RTP_GST_DEPAY_H__ +#define __GST_RTP_GST_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_GST_DEPAY \ + (gst_rtp_gst_depay_get_type()) +#define GST_RTP_GST_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GST_DEPAY,GstRtpGSTDepay)) +#define GST_RTP_GST_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GST_DEPAY,GstRtpGSTDepayClass)) +#define GST_IS_RTP_GST_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GST_DEPAY)) +#define GST_IS_RTP_GST_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GST_DEPAY)) + +typedef struct _GstRtpGSTDepay GstRtpGSTDepay; +typedef struct _GstRtpGSTDepayClass GstRtpGSTDepayClass; + +struct _GstRtpGSTDepay +{ + GstBaseRTPDepayload depayload; + + GstAdapter *adapter; + guint current_CV; + GstCaps *CV_cache[8]; +}; + +struct _GstRtpGSTDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_gst_depay_get_type (void); + +gboolean gst_rtp_gst_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_GST_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpgstpay.c b/gst/rtp/gstrtpgstpay.c new file mode 100644 index 0000000..3f244bc --- /dev/null +++ b/gst/rtp/gstrtpgstpay.c @@ -0,0 +1,224 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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 + +#include + +#include "gstrtpgstpay.h" + +/* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |C| CV |D|X|Y|Z| MBZ | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Frag_offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * C: caps inlined flag + * When C set, first part of payload contains caps definition. Caps definition + * starts with variable-length length prefix and then a string of that length. + * the length is encoded in big endian 7 bit chunks, the top 1 bit of a byte + * is the continuation marker and the 7 next bits the data. A continuation + * marker of 1 means that the next byte contains more data. + * + * CV: caps version, 0 = caps from SDP, 1 - 7 inlined caps + * D: delta unit buffer + * X: media 1 flag + * Y: media 2 flag + * Z: media 3 flag + * + * + */ + +static GstStaticPadTemplate gst_rtp_gst_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate gst_rtp_gst_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"application\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"X-GST\"") + ); + +static gboolean gst_rtp_gst_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_gst_pay_handle_buffer (GstBaseRTPPayload * payload, + GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpGSTPay, gst_rtp_gst_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_gst_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_gst_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_gst_pay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP GStreamer payloader", "Codec/Payloader/Network/RTP", + "Payload GStreamer buffers as RTP packets", + "Wim Taymans "); +} + +static void +gst_rtp_gst_pay_class_init (GstRtpGSTPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_gst_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_gst_pay_handle_buffer; +} + +static void +gst_rtp_gst_pay_init (GstRtpGSTPay * rtpgstpay, GstRtpGSTPayClass * klass) +{ +} + +static gboolean +gst_rtp_gst_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + gchar *capsstr, *capsenc; + + capsstr = gst_caps_to_string (caps); + capsenc = g_base64_encode ((guchar *) capsstr, strlen (capsstr)); + g_free (capsstr); + + gst_basertppayload_set_options (payload, "application", TRUE, "X-GST", 90000); + res = + gst_basertppayload_set_outcaps (payload, "caps", G_TYPE_STRING, capsenc, + NULL); + g_free (capsenc); + + return res; +} + +static GstFlowReturn +gst_rtp_gst_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpGSTPay *rtpgstpay; + guint8 *data; + guint size; + GstBuffer *outbuf; + GstFlowReturn ret; + GstClockTime timestamp; + guint32 frag_offset; + guint flags; + + rtpgstpay = GST_RTP_GST_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + + ret = GST_FLOW_OK; + + /* caps always from SDP for now */ + flags = 0; + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) + flags |= (1 << 3); + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_MEDIA1)) + flags |= (1 << 2); + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_MEDIA2)) + flags |= (1 << 1); + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_MEDIA3)) + flags |= (1 << 0); + + /* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |C| CV |D|X|Y|Z| MBZ | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Frag_offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + frag_offset = 0; + + while (size > 0) { + guint towrite; + guint8 *payload; + guint payload_len; + guint packet_len; + + /* this will be the total lenght of the packet */ + packet_len = gst_rtp_buffer_calc_packet_len (8 + size, 0, 0); + + /* fill one MTU or all available bytes */ + towrite = MIN (packet_len, GST_BASE_RTP_PAYLOAD_MTU (rtpgstpay)); + + /* this is the payload length */ + payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); + + /* create buffer to hold the payload */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + payload = gst_rtp_buffer_get_payload (outbuf); + + payload[0] = flags; + payload[1] = payload[2] = payload[3] = 0; + payload[4] = frag_offset >> 24; + payload[5] = frag_offset >> 16; + payload[6] = frag_offset >> 8; + payload[7] = frag_offset & 0xff; + + payload += 8; + payload_len -= 8; + + memcpy (payload, data, payload_len); + + data += payload_len; + size -= payload_len; + frag_offset += payload_len; + + if (size == 0) + gst_rtp_buffer_set_marker (outbuf, TRUE); + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + + ret = gst_basertppayload_push (basepayload, outbuf); + } + gst_buffer_unref (buffer); + + return ret; +} + +gboolean +gst_rtp_gst_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpgstpay", + GST_RANK_NONE, GST_TYPE_RTP_GST_PAY); +} diff --git a/gst/rtp/gstrtpgstpay.h b/gst/rtp/gstrtpgstpay.h new file mode 100644 index 0000000..c7a7c02 --- /dev/null +++ b/gst/rtp/gstrtpgstpay.h @@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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_RTP_GST_PAY_H__ +#define __GST_RTP_GST_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_GST_PAY \ + (gst_rtp_gst_pay_get_type()) +#define GST_RTP_GST_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GST_PAY,GstRtpGSTPay)) +#define GST_RTP_GST_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GST_PAY,GstRtpGSTPayClass)) +#define GST_IS_RTP_GST_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GST_PAY)) +#define GST_IS_RTP_GST_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GST_PAY)) + +typedef struct _GstRtpGSTPay GstRtpGSTPay; +typedef struct _GstRtpGSTPayClass GstRtpGSTPayClass; + +struct _GstRtpGSTPay +{ + GstBaseRTPPayload payload; +}; + +struct _GstRtpGSTPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_gst_pay_get_type (void); + +gboolean gst_rtp_gst_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_GST_PAY_H__ */ diff --git a/gst/rtp/gstrtph263depay.c b/gst/rtp/gstrtph263depay.c new file mode 100644 index 0000000..08f96cc --- /dev/null +++ b/gst/rtp/gstrtph263depay.c @@ -0,0 +1,381 @@ +/* GStreamer + * + * Copyright 2007 Nokia Corporation + * Copyright 2007 Collabora Ltd, + * @author: Philippe Kalaf + * + * Copyright (C) <2005> Wim Taymans + * <2007> Edward Hervey + * + * 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 + +#include +#include "gstrtph263depay.h" + +GST_DEBUG_CATEGORY_STATIC (rtph263depay_debug); +#define GST_CAT_DEFAULT (rtph263depay_debug) + +#define GST_RFC2190A_HEADER_LEN 4 +#define GST_RFC2190B_HEADER_LEN 8 +#define GST_RFC2190C_HEADER_LEN 12 + +static GstStaticPadTemplate gst_rtp_h263_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h263, " + "variant = (string) \"itu\", " "h263version = (string) \"h263\"") + ); + +static GstStaticPadTemplate gst_rtp_h263_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_H263_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"; " + "application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"") + ); + +GST_BOILERPLATE (GstRtpH263Depay, gst_rtp_h263_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_h263_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_h263_depay_change_state (GstElement * + element, GstStateChange transition); + +static GstBuffer *gst_rtp_h263_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +gboolean gst_rtp_h263_depay_setcaps (GstBaseRTPDepayload * filter, + GstCaps * caps); + +static void +gst_rtp_h263_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h263_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h263_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP H263 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts H263 video from RTP packets (RFC 2190)", + "Philippe Kalaf , " + "Edward Hervey "); +} + +static void +gst_rtp_h263_depay_class_init (GstRtpH263DepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_h263_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_h263_depay_setcaps; + + gobject_class->finalize = gst_rtp_h263_depay_finalize; + + gstelement_class->change_state = gst_rtp_h263_depay_change_state; + + GST_DEBUG_CATEGORY_INIT (rtph263depay_debug, "rtph263depay", 0, + "H263 Video RTP Depayloader"); +} + +static void +gst_rtp_h263_depay_init (GstRtpH263Depay * rtph263depay, + GstRtpH263DepayClass * klass) +{ + rtph263depay->adapter = gst_adapter_new (); + + rtph263depay->offset = 0; + rtph263depay->leftover = 0; +} + +static void +gst_rtp_h263_depay_finalize (GObject * object) +{ + GstRtpH263Depay *rtph263depay; + + rtph263depay = GST_RTP_H263_DEPAY (object); + + g_object_unref (rtph263depay->adapter); + rtph263depay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +gboolean +gst_rtp_h263_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) +{ + GstCaps *srccaps; + GstStructure *structure = gst_caps_get_structure (caps, 0); + gint clock_rate; + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + filter->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("video/x-h263", + "variant", G_TYPE_STRING, "itu", + "h263version", G_TYPE_STRING, "h263", NULL); + gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (filter), srccaps); + gst_caps_unref (srccaps); + + return TRUE; +} + +static GstBuffer * +gst_rtp_h263_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpH263Depay *rtph263depay; + GstBuffer *outbuf; + gint payload_len; + guint8 *payload; + guint header_len; + guint SBIT, EBIT; + gboolean F, P, M; + gboolean I; + + rtph263depay = GST_RTP_H263_DEPAY (depayload); + + /* flush remaining data on discont */ + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_LOG_OBJECT (depayload, "Discont buffer, flushing adapter"); + gst_adapter_clear (rtph263depay->adapter); + rtph263depay->offset = 0; + rtph263depay->leftover = 0; + rtph263depay->start = FALSE; + } + + payload_len = gst_rtp_buffer_get_payload_len (buf); + payload = gst_rtp_buffer_get_payload (buf); + + M = gst_rtp_buffer_get_marker (buf); + + /* Let's see what mode we are using */ + F = (payload[0] & 0x80) == 0x80; + P = (payload[0] & 0x40) == 0x40; + + /* Bit shifting */ + SBIT = (payload[0] & 0x38) >> 3; + EBIT = (payload[0] & 0x07); + + /* Figure out header length and I-flag */ + if (F == 0) { + /* F == 0 and P == 0 or 1 + * mode A */ + header_len = GST_RFC2190A_HEADER_LEN; + GST_LOG ("Mode A"); + + /* 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |F|P|SBIT |EBIT | SRC |I|U|S|A|R |DBQ| TRB | TR | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + I = (payload[1] & 0x10) == 0x10; + } else { + if (P == 0) { + /* F == 1 and P == 0 + * mode B */ + header_len = GST_RFC2190B_HEADER_LEN; + GST_LOG ("Mode B"); + + /* 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |F|P|SBIT |EBIT | SRC | QUANT | GOBN | MBA |R | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |I|U|S|A| HMV1 | VMV1 | HMV2 | VMV2 | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + I = (payload[4] & 0x80) == 0x80; + } else { + /* F == 1 and P == 1 + * mode C */ + header_len = GST_RFC2190C_HEADER_LEN; + GST_LOG ("Mode C"); + + /* 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |F|P|SBIT |EBIT | SRC | QUANT | GOBN | MBA |R | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |I|U|S|A| HMV1 | VMV1 | HMV2 | VMV2 | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | RR |DBQ| TRB | TR | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + I = (payload[4] & 0x80) == 0x80; + } + } + + GST_LOG ("F/P/M/I : %d/%d/%d/%d", F, P, M, I); + GST_LOG ("SBIT : %d , EBIT : %d", SBIT, EBIT); + GST_LOG ("payload_len : %d, header_len : %d , leftover : 0x%x", + payload_len, header_len, rtph263depay->leftover); + + /* skip header */ + payload += header_len; + payload_len -= header_len; + + if (!rtph263depay->start) { + /* do not skip this fragment if it is a Mode A with picture start code */ + if (!F && payload_len > 4 && (GST_READ_UINT32_BE (payload) >> 10 == 0x20)) { + GST_DEBUG ("Mode A with PSC => frame start"); + rtph263depay->start = TRUE; + if (!!(payload[4] & 0x02) != I) { + GST_DEBUG ("Wrong Picture Coding Type Flag in rtp header"); + I = !I; + } + rtph263depay->psc_I = I; + } else { + GST_DEBUG ("no frame start yet, skipping payload"); + goto skip; + } + } + + /* only trust I info from Mode A starting packet + * from buggy payloaders or hw */ + I = rtph263depay->psc_I; + + if (SBIT) { + /* take the leftover and merge it at the beginning, FIXME make the buffer + * data writable. */ + GST_LOG ("payload[0] : 0x%x", payload[0]); + payload[0] &= 0xFF >> SBIT; + GST_LOG ("payload[0] : 0x%x", payload[0]); + payload[0] |= rtph263depay->leftover; + GST_LOG ("payload[0] : 0x%x", payload[0]); + rtph263depay->leftover = 0; + rtph263depay->offset = 0; + } + + if (!EBIT) { + GstBuffer *tmp; + + /* Take the entire buffer */ + tmp = gst_rtp_buffer_get_payload_subbuffer (buf, header_len, payload_len); + gst_adapter_push (rtph263depay->adapter, tmp); + } else { + GstBuffer *tmp; + + /* Take the entire buffer except for the last byte */ + tmp = gst_rtp_buffer_get_payload_subbuffer (buf, header_len, + payload_len - 1); + gst_adapter_push (rtph263depay->adapter, tmp); + + /* Put the last byte into the leftover */ + GST_DEBUG ("payload[payload_len - 1] : 0x%x", payload[payload_len - 1]); + GST_DEBUG ("mask : 0x%x", 0xFF << EBIT); + rtph263depay->leftover = (payload[payload_len - 1] >> EBIT) << EBIT; + rtph263depay->offset = 1; + GST_DEBUG ("leftover : 0x%x", rtph263depay->leftover); + } + +skip: + if (M) { + if (rtph263depay->start) { + /* frame is completed */ + guint avail; + guint32 timestamp; + + if (rtph263depay->offset) { + /* push in the leftover */ + GstBuffer *buf = gst_buffer_new_and_alloc (1); + + GST_DEBUG ("Pushing leftover in adapter"); + GST_BUFFER_DATA (buf)[0] = rtph263depay->leftover; + gst_adapter_push (rtph263depay->adapter, buf); + } + + avail = gst_adapter_available (rtph263depay->adapter); + outbuf = gst_adapter_take_buffer (rtph263depay->adapter, avail); + + if (I) + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + + GST_DEBUG ("Pushing out a buffer of %d bytes", avail); + + timestamp = gst_rtp_buffer_get_timestamp (buf); + gst_base_rtp_depayload_push_ts (depayload, timestamp, outbuf); + rtph263depay->offset = 0; + rtph263depay->leftover = 0; + rtph263depay->start = FALSE; + } else { + rtph263depay->start = TRUE; + } + } + + return NULL; +} + +static GstStateChangeReturn +gst_rtp_h263_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpH263Depay *rtph263depay; + GstStateChangeReturn ret; + + rtph263depay = GST_RTP_H263_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (rtph263depay->adapter); + rtph263depay->start = TRUE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_h263_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtph263depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_H263_DEPAY); +} diff --git a/gst/rtp/gstrtph263depay.h b/gst/rtp/gstrtph263depay.h new file mode 100644 index 0000000..9cecb09 --- /dev/null +++ b/gst/rtp/gstrtph263depay.h @@ -0,0 +1,66 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_H263_DEPAY_H__ +#define __GST_RTP_H263_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_H263_DEPAY \ + (gst_rtp_h263_depay_get_type()) +#define GST_RTP_H263_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263_DEPAY,GstRtpH263Depay)) +#define GST_RTP_H263_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263_DEPAY,GstRtpH263DepayClass)) +#define GST_IS_RTP_H263_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263_DEPAY)) +#define GST_IS_RTP_H263_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263_DEPAY)) + +typedef struct _GstRtpH263Depay GstRtpH263Depay; +typedef struct _GstRtpH263DepayClass GstRtpH263DepayClass; + +struct _GstRtpH263Depay +{ + GstBaseRTPDepayload depayload; + + guint8 offset; /* offset to apply to next payload */ + guint8 leftover; /* leftover from previous payload (if offset != 0) */ + gboolean psc_I; /* Picture-Coding-Type == I from Picture Start Code packet */ + GstAdapter *adapter; + gboolean start; +}; + +struct _GstRtpH263DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_h263_depay_get_type (void); + +gboolean gst_rtp_h263_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_H263_DEPAY_H__ */ + diff --git a/gst/rtp/gstrtph263pay.c b/gst/rtp/gstrtph263pay.c new file mode 100644 index 0000000..0564d73 --- /dev/null +++ b/gst/rtp/gstrtph263pay.c @@ -0,0 +1,1800 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * Copyright (C) <2008> Dejan Sakelsak + * Copyright (C) <2009> Janin Kolenc + * + * 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 +#include +#include + +#include "gstrtph263pay.h" + +typedef enum +{ + GST_H263_FRAME_TYPE_I = 0, + GST_H263_FRAME_TYPE_P = 1, + GST_H263_FRAME_TYPE_PB = 2 +} GstRtpH263PayFrameType; + +typedef enum +{ + GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_RES1 = 0, + GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_SQCIF = 1, + GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_QCIF = 2, + GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_CIF = 3, + GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_4CIF = 4, + GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_16CIF = 5, + GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_RES2 = 6, + GST_H263_PAYLOAD_PICTURE_FORMAT_PLUS = 7 +} GstRtpH263PayPictureFormat; + +static const guint format_props[8][2] = { {254, 254}, +{6, 8}, +{9, 11}, +{18, 22}, +{18, 88}, +{18, 352}, +{254, 254}, +{255, 255} +}; + +/* + * I-frame MCBPC table: code, mask, nbits, cb, cr, mb type -> 10 = undefined (because we have guint) + */ +#define MCBPC_I_LEN 9 +#define MCBPC_I_WID 6 +static const guint32 mcbpc_I[9][6] = { + {0x8000, 0x8000, 1, 0, 0, 3}, + {0x2000, 0xe000, 3, 0, 1, 3}, + {0x4000, 0xe000, 3, 1, 0, 3}, + {0x6000, 0xe000, 3, 1, 1, 3}, + {0x1000, 0xf000, 4, 0, 0, 4}, + {0x0400, 0xfc00, 6, 0, 1, 4}, + {0x0800, 0xfc00, 6, 1, 0, 4}, + {0x0c00, 0xfc00, 6, 1, 1, 4}, + {0x0080, 0xff80, 9, 10, 10, 10} +}; + +/* + * P-frame MCBPC table: code, mask, nbits, cb, cr, mb type -> 10 = undefined (because we have guint) + */ +#define MCBPC_P_LEN 21 +#define MCBPC_P_WID 6 +static const guint16 mcbpc_P[21][6] = { + {0x8000, 0x8000, 1, 0, 0, 0}, + {0x3000, 0xf000, 4, 0, 1, 0}, + {0x2000, 0xf000, 4, 1, 0, 0}, + {0x1400, 0xfc00, 6, 1, 1, 0}, + {0x6000, 0xe000, 3, 0, 0, 1}, + {0x0e00, 0xfe00, 7, 0, 1, 1}, + {0x0c00, 0xfe00, 7, 1, 0, 1}, + {0x0280, 0xff80, 9, 1, 1, 1}, + {0x4000, 0xe000, 3, 0, 0, 2}, + {0x0a00, 0xfe00, 7, 0, 1, 2}, + {0x0800, 0xfe00, 7, 1, 0, 2}, + {0x0500, 0xff00, 8, 1, 1, 2}, + {0x1800, 0xf800, 5, 0, 0, 3}, + {0x0400, 0xff00, 8, 0, 1, 3}, + {0x0300, 0xff00, 8, 1, 0, 3}, + {0x0600, 0xfe00, 7, 1, 1, 3}, + {0x1000, 0xfc00, 6, 0, 0, 4}, + {0x0200, 0xff80, 9, 0, 1, 4}, + {0x0180, 0xff80, 9, 1, 0, 4}, + {0x0100, 0xff80, 9, 1, 1, 4}, + {0x0080, 0xff80, 9, 10, 10, 10} +}; + +/* + * I-frame CBPY (code, mask, nbits, Y0, Y1, Y2, Y3) + */ +#define CBPY_LEN 16 +#define CBPY_WID 7 +static const guint8 cbpy_I[16][7] = { + {0x30, 0xf0, 4, 0, 0, 0, 0}, + {0x28, 0xf8, 5, 0, 0, 0, 1}, + {0x20, 0xf8, 5, 0, 0, 1, 0}, + {0x90, 0xf0, 4, 0, 0, 1, 1}, + {0x18, 0xf8, 5, 0, 1, 0, 0}, + {0x70, 0xf0, 4, 0, 1, 0, 1}, + {0x08, 0xfc, 6, 0, 1, 1, 0}, + {0xb0, 0xf0, 4, 0, 1, 1, 1}, + {0x10, 0xf8, 5, 1, 0, 0, 0}, + {0x0c, 0xfc, 6, 1, 0, 0, 1}, + {0x50, 0xf0, 4, 1, 0, 1, 0}, + {0xa0, 0xf0, 4, 1, 0, 1, 1}, + {0x40, 0xf0, 4, 1, 1, 0, 0}, + {0x80, 0xf0, 4, 1, 1, 0, 1}, + {0x60, 0xf0, 4, 1, 1, 1, 0}, + {0xc0, 0xc0, 2, 1, 1, 1, 1} +}; + +/* + * P-frame CBPY (code, mask, nbits, Y0, Y1, Y2, Y3) + */ +static const guint8 cbpy_P[16][7] = { + {0x30, 0xf0, 4, 1, 1, 1, 1}, + {0x28, 0xf8, 5, 1, 1, 1, 0}, + {0x20, 0xf8, 5, 1, 1, 0, 1}, + {0x90, 0xf0, 4, 1, 1, 0, 0}, + {0x18, 0xf8, 5, 1, 0, 1, 1}, + {0x70, 0xf0, 4, 1, 0, 1, 0}, + {0x08, 0xfc, 6, 1, 0, 0, 1}, + {0xb0, 0xf0, 4, 1, 0, 0, 0}, + {0x10, 0xf8, 5, 0, 1, 1, 1}, + {0x0c, 0xfc, 6, 0, 1, 1, 0}, + {0x50, 0xf0, 4, 0, 1, 0, 1}, + {0xa0, 0xf0, 4, 0, 1, 0, 0}, + {0x40, 0xf0, 4, 0, 0, 1, 1}, + {0x80, 0xf0, 4, 0, 0, 1, 0}, + {0x60, 0xf0, 4, 0, 0, 0, 1}, + {0xc0, 0xc0, 2, 0, 0, 0, 0} +}; + +/* + * Block TCOEF table (code, mask, nbits, LAST, RUN, LEVEL) + */ +#define TCOEF_LEN 103 +#define TCOEF_WID 6 +static const guint16 tcoef[103][6] = { + {0x8000, 0xc000, 3, 0, 0, 1}, + {0xf000, 0xf000, 5, 0, 0, 2}, + {0x5400, 0xfc00, 7, 0, 0, 3}, + {0x2e00, 0xfe00, 8, 0, 0, 4}, + {0x1f00, 0xff00, 9, 0, 0, 5}, + {0x1280, 0xff80, 10, 0, 0, 6}, + {0x1200, 0xff80, 10, 0, 0, 7}, + {0x0840, 0xffc0, 11, 0, 0, 8}, + {0x0800, 0xffc0, 11, 0, 0, 9}, + {0x00e0, 0xffe0, 12, 0, 0, 10}, //10 + {0x00c0, 0xffe0, 12, 0, 0, 11}, + {0x0400, 0xffe0, 12, 0, 0, 12}, + {0xc000, 0xe000, 4, 0, 1, 1}, + {0x5000, 0xfc00, 7, 0, 1, 2}, + {0x1e00, 0xff00, 9, 0, 1, 3}, + {0x03c0, 0xffc0, 11, 0, 1, 4}, + {0x0420, 0xffe0, 12, 0, 1, 5}, + {0x0500, 0xfff0, 13, 0, 1, 6}, + {0xe000, 0xf000, 5, 0, 2, 1}, + {0x1d00, 0xff00, 9, 0, 2, 2}, //20 + {0x0380, 0xffc0, 11, 0, 2, 3}, + {0x0510, 0xfff0, 13, 0, 2, 4}, + {0x6800, 0xf800, 6, 0, 3, 1}, + {0x1180, 0xff80, 10, 0, 3, 2}, + {0x0340, 0xffc0, 11, 0, 3, 3}, + {0x6000, 0xf800, 6, 0, 4, 1}, + {0x1100, 0xff80, 10, 0, 4, 2}, + {0x0520, 0xfff0, 13, 0, 4, 3}, + {0x5800, 0xf800, 6, 0, 5, 1}, + {0x0300, 0xffc0, 11, 0, 5, 2}, // 30 + {0x0530, 0xfff0, 13, 0, 5, 3}, + {0x4c00, 0xfc00, 7, 0, 6, 1}, + {0x02c0, 0xffc0, 11, 0, 6, 2}, + {0x0540, 0xfff0, 13, 0, 6, 3}, + {0x4800, 0xfc00, 7, 0, 7, 1}, + {0x0280, 0xffc0, 11, 0, 7, 2}, + {0x4400, 0xfc00, 7, 0, 8, 1}, + {0x0240, 0xffc0, 11, 0, 8, 2}, + {0x4000, 0xfc00, 7, 0, 9, 1}, + {0x0200, 0xffc0, 11, 0, 9, 2}, // 40 + {0x2c00, 0xfe00, 8, 0, 10, 1}, + {0x0550, 0xfff0, 13, 0, 10, 2}, + {0x2a00, 0xfe00, 8, 0, 11, 1}, + {0x2800, 0xfe00, 8, 0, 12, 1}, + {0x1c00, 0xff00, 9, 0, 13, 1}, + {0x1b00, 0xff00, 9, 0, 14, 1}, + {0x1080, 0xff80, 10, 0, 15, 1}, + {0x1000, 0xff80, 10, 0, 16, 1}, + {0x0f80, 0xff80, 10, 0, 17, 1}, + {0x0f00, 0xff80, 10, 0, 18, 1}, // 50 + {0x0e80, 0xff80, 10, 0, 19, 1}, + {0x0e00, 0xff80, 10, 0, 20, 1}, + {0x0d80, 0xff80, 10, 0, 21, 1}, + {0x0d00, 0xff80, 10, 0, 22, 1}, + {0x0440, 0xffe0, 12, 0, 23, 1}, + {0x0460, 0xffe0, 12, 0, 24, 1}, + {0x0560, 0xfff0, 13, 0, 25, 1}, + {0x0570, 0xfff0, 13, 0, 26, 1}, + {0x7000, 0xf000, 5, 1, 0, 1}, + {0x0c80, 0xff80, 10, 1, 0, 2}, // 60 + {0x00a0, 0xffe0, 12, 1, 0, 3}, + {0x3c00, 0xfc00, 7, 1, 1, 1}, + {0x0080, 0xffe0, 12, 1, 1, 2}, + {0x3800, 0xfc00, 7, 1, 2, 1}, + {0x3400, 0xfc00, 7, 1, 3, 1}, + {0x3000, 0xfc00, 7, 1, 4, 1}, + {0x2600, 0xfe00, 8, 1, 5, 1}, + {0x2400, 0xfe00, 8, 1, 6, 1}, + {0x2200, 0xfe00, 8, 1, 7, 1}, + {0x2000, 0xfe00, 8, 1, 8, 1}, // 70 + {0x1a00, 0xff00, 9, 1, 9, 1}, + {0x1900, 0xff00, 9, 1, 10, 1}, + {0x1800, 0xff00, 9, 1, 11, 1}, + {0x1700, 0xff00, 9, 1, 12, 1}, + {0x1600, 0xff00, 9, 1, 13, 1}, + {0x1500, 0xff00, 9, 1, 14, 1}, + {0x1400, 0xff00, 9, 1, 15, 1}, + {0x1300, 0xff00, 9, 1, 16, 1}, + {0x0c00, 0xff80, 10, 1, 17, 1}, + {0x0b80, 0xff80, 10, 1, 18, 1}, // 80 + {0x0b00, 0xff80, 10, 1, 19, 1}, + {0x0a80, 0xff80, 10, 1, 20, 1}, + {0x0a00, 0xff80, 10, 1, 21, 1}, + {0x0980, 0xff80, 10, 1, 22, 1}, + {0x0900, 0xff80, 10, 1, 23, 1}, + {0x0880, 0xff80, 10, 1, 24, 1}, + {0x01c0, 0xffc0, 11, 1, 25, 1}, + {0x0180, 0xffc0, 11, 1, 26, 1}, + {0x0140, 0xffc0, 11, 1, 27, 1}, + {0x0100, 0xffc0, 11, 1, 28, 1}, // 90 + {0x0480, 0xffe0, 12, 1, 29, 1}, + {0x04a0, 0xffe0, 12, 1, 30, 1}, + {0x04c0, 0xffe0, 12, 1, 31, 1}, + {0x04e0, 0xffe0, 12, 1, 32, 1}, + {0x0580, 0xfff0, 13, 1, 33, 1}, + {0x0590, 0xfff0, 13, 1, 34, 1}, + {0x05a0, 0xfff0, 13, 1, 35, 1}, + {0x05b0, 0xfff0, 13, 1, 36, 1}, + {0x05c0, 0xfff0, 13, 1, 37, 1}, + {0x05d0, 0xfff0, 13, 1, 38, 1}, // 100 + {0x05e0, 0xfff0, 13, 1, 39, 1}, + {0x05f0, 0xfff0, 13, 1, 40, 1}, + {0x0600, 0xfe00, 7, 0, 0xffff, 0xffff} +}; + +/* + * Motion vector code table (Code, mask, nbits, vector (halfpixel, two's complement), diff (halfpixel, two's complement)) + */ +#define MVD_LEN 64 +#define MVD_WID 5 +static const guint16 mvd[64][5] = { + {0x0028, 0xfff8, 13, 0x0060, 0x0020}, + {0x0038, 0xfff8, 13, 0x0061, 0x0021}, + {0x0050, 0xfff0, 12, 0x0062, 0x0022}, + {0x0070, 0xfff0, 12, 0x0063, 0x0023}, + {0x0090, 0xfff0, 12, 0x0064, 0x0024}, + {0x00b0, 0xfff0, 12, 0x0065, 0x0025}, + {0x00d0, 0xfff0, 12, 0x0066, 0x0026}, + {0x00f0, 0xfff0, 12, 0x0067, 0x0027}, + {0x0120, 0xffe0, 11, 0x0068, 0x0028}, + {0x0160, 0xffe0, 11, 0x0069, 0x0029}, + {0x01a0, 0xffe0, 11, 0x006a, 0x002a}, + {0x01e0, 0xffe0, 11, 0x006b, 0x002b}, + {0x0220, 0xffe0, 11, 0x006c, 0x002c}, + {0x0260, 0xffe0, 11, 0x006d, 0x002d}, + {0x02a0, 0xffe0, 11, 0x006e, 0x002e}, + {0x02e0, 0xffe0, 11, 0x006f, 0x002f}, + {0x0320, 0xffe0, 11, 0x0070, 0x0030}, + {0x0360, 0xffe0, 11, 0x0071, 0x0031}, + {0x03a0, 0xffe0, 11, 0x0072, 0x0032}, + {0x03e0, 0xffe0, 11, 0x0073, 0x0033}, + {0x0420, 0xffe0, 11, 0x0074, 0x0034}, + {0x0460, 0xffe0, 11, 0x0075, 0x0035}, + {0x04c0, 0xffc0, 10, 0x0076, 0x0036}, + {0x0540, 0xffc0, 10, 0x0077, 0x0037}, + {0x05c0, 0xffc0, 10, 0x0078, 0x0038}, + {0x0700, 0xff00, 8, 0x0079, 0x0039}, + {0x0900, 0xff00, 8, 0x007a, 0x003a}, + {0x0b00, 0xff00, 8, 0x007b, 0x003b}, + {0x0e00, 0xfe00, 7, 0x007c, 0x003c}, + {0x1800, 0xf800, 5, 0x007d, 0x003d}, + {0x3000, 0xf000, 4, 0x007e, 0x003e}, + {0x6000, 0xe000, 3, 0x007f, 0x003f}, + {0x8000, 0x8000, 1, 0x0000, 0x0000}, + {0x4000, 0xe000, 3, 0x0001, 0x0041}, + {0x2000, 0xf000, 4, 0x0002, 0x0042}, + {0x1000, 0xf800, 5, 0x0003, 0x0043}, + {0x0c00, 0xfe00, 7, 0x0004, 0x0044}, + {0x0a00, 0xff00, 8, 0x0005, 0x0045}, + {0x0800, 0xff00, 8, 0x0006, 0x0046}, + {0x0600, 0xff00, 8, 0x0007, 0x0047}, + {0x0580, 0xffc0, 10, 0x0008, 0x0048}, + {0x0500, 0xffc0, 10, 0x0009, 0x0049}, + {0x0480, 0xffc0, 10, 0x000a, 0x004a}, + {0x0440, 0xffe0, 11, 0x000b, 0x004b}, + {0x0400, 0xffe0, 11, 0x000c, 0x004c}, + {0x03c0, 0xffe0, 11, 0x000d, 0x004d}, + {0x0380, 0xffe0, 11, 0x000e, 0x004e}, + {0x0340, 0xffe0, 11, 0x000f, 0x004f}, + {0x0300, 0xffe0, 11, 0x0010, 0x0050}, + {0x02c0, 0xffe0, 11, 0x0011, 0x0051}, + {0x0280, 0xffe0, 11, 0x0012, 0x0052}, + {0x0240, 0xffe0, 11, 0x0013, 0x0053}, + {0x0200, 0xffe0, 11, 0x0014, 0x0054}, + {0x01c0, 0xffe0, 11, 0x0015, 0x0055}, + {0x0180, 0xffe0, 11, 0x0016, 0x0056}, + {0x0140, 0xffe0, 11, 0x0017, 0x0057}, + {0x0100, 0xffe0, 11, 0x0018, 0x0058}, + {0x00e0, 0xfff0, 12, 0x0019, 0x0059}, + {0x00c0, 0xfff0, 12, 0x001a, 0x005a}, + {0x00a0, 0xfff0, 12, 0x001b, 0x005b}, + {0x0080, 0xfff0, 12, 0x001c, 0x005c}, + {0x0060, 0xfff0, 12, 0x001d, 0x005d}, + {0x0040, 0xfff0, 12, 0x001e, 0x005e}, + {0x0030, 0xfff8, 13, 0x001f, 0x005f} +}; + +GST_DEBUG_CATEGORY_STATIC (rtph263pay_debug); +#define GST_CAT_DEFAULT (rtph263pay_debug) + +#define GST_RTP_HEADER_LEN 12 + +enum +{ + PROP_0, + PROP_MODE_A_ONLY +}; + +static GstStaticPadTemplate gst_rtp_h263_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h263, " + "variant = (string) \"itu\", " "h263version = (string) \"h263\"") + ); + +static GstStaticPadTemplate gst_rtp_h263_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_H263_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"; " + "application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"") + ); + +static void gst_rtp_h263_pay_finalize (GObject * object); + +static gboolean gst_rtp_h263_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static void gst_rtp_h263_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_h263_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstFlowReturn gst_rtp_h263_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); + +static void gst_rtp_h263_pay_boundry_init (GstRtpH263PayBoundry * boundry, + guint8 * start, guint8 * end, guint8 sbit, guint8 ebit); +static GstRtpH263PayGob *gst_rtp_h263_pay_gob_new (GstRtpH263PayBoundry * + boundry, guint gobn); +static GstRtpH263PayMB *gst_rtp_h263_pay_mb_new (GstRtpH263PayBoundry * boundry, + guint mba); +static GstRtpH263PayPackage *gst_rtp_h263_pay_package_new_empty (); +static GstRtpH263PayPackage *gst_rtp_h263_pay_package_new (guint8 * start, + guint8 * end, guint length, guint8 sbit, guint8 ebit, GstBuffer * outbuf, + gboolean marker); + +static void gst_rtp_h263_pay_mb_destroy (GstRtpH263PayMB * mb); +static void gst_rtp_h263_pay_gob_destroy (GstRtpH263PayGob * gob, guint ind); +static void gst_rtp_h263_pay_context_destroy (GstRtpH263PayContext * context, + guint ind); +static void gst_rtp_h263_pay_package_destroy (GstRtpH263PayPackage * pack); + +GST_BOILERPLATE (GstRtpH263Pay, gst_rtp_h263_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_h263_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h263_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h263_pay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP H263 packet payloader", "Codec/Payloader/Network/RTP", + "Payload-encodes H263 video in RTP packets (RFC 2190)", + "Neil Stratford " + "Dejan Sakelsak "); +} + +static void +gst_rtp_h263_pay_class_init (GstRtpH263PayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_h263_pay_finalize; + + gstbasertppayload_class->set_caps = gst_rtp_h263_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_h263_pay_handle_buffer; + gobject_class->set_property = gst_rtp_h263_pay_set_property; + gobject_class->get_property = gst_rtp_h263_pay_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_MODE_A_ONLY, g_param_spec_boolean ("modea-only", + "Fragment packets in mode A Only", + "Disable packetization modes B and C", DEFAULT_MODE_A, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (rtph263pay_debug, "rtph263pay", 0, + "H263 RTP Payloader"); +} + +static void +gst_rtp_h263_pay_init (GstRtpH263Pay * rtph263pay, GstRtpH263PayClass * klass) +{ + rtph263pay->adapter = gst_adapter_new (); + + rtph263pay->prop_payload_mode = DEFAULT_MODE_A; +} + +static void +gst_rtp_h263_pay_finalize (GObject * object) +{ + GstRtpH263Pay *rtph263pay; + + rtph263pay = GST_RTP_H263_PAY (object); + + g_object_unref (rtph263pay->adapter); + rtph263pay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_h263_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + + payload->pt = GST_RTP_PAYLOAD_H263; + gst_basertppayload_set_options (payload, "video", TRUE, "H263", 90000); + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; +} + +static void +gst_rtp_h263_pay_context_destroy (GstRtpH263PayContext * context, guint ind) +{ + if (!context) + return; + + if (context->gobs) { + guint i; + + for (i = 0; i < format_props[ind][0]; i++) { + if (context->gobs[i]) { + gst_rtp_h263_pay_gob_destroy (context->gobs[i], ind); + } + } + + g_free (context->gobs); + } + + g_free (context); +} + +static void +gst_rtp_h263_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpH263Pay *rtph263pay; + + rtph263pay = GST_RTP_H263_PAY (object); + + switch (prop_id) { + case PROP_MODE_A_ONLY: + rtph263pay->prop_payload_mode = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_h263_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpH263Pay *rtph263pay; + + rtph263pay = GST_RTP_H263_PAY (object); + + switch (prop_id) { + case PROP_MODE_A_ONLY: + g_value_set_boolean (value, rtph263pay->prop_payload_mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstRtpH263PayPackage * +gst_rtp_h263_pay_package_new_empty (void) +{ + return (GstRtpH263PayPackage *) g_malloc0 (sizeof (GstRtpH263PayPackage)); +} + +static GstRtpH263PayPackage * +gst_rtp_h263_pay_package_new (guint8 * start, guint8 * end, guint length, + guint8 sbit, guint8 ebit, GstBuffer * outbuf, gboolean marker) +{ + + GstRtpH263PayPackage *package; + + package = gst_rtp_h263_pay_package_new_empty (); + + package->payload_start = start; + package->payload_end = end; + package->payload_len = length; + package->sbit = sbit; + package->ebit = ebit; + package->outbuf = outbuf; + package->marker = marker; + + return package; +} + +static void +gst_rtp_h263_pay_package_destroy (GstRtpH263PayPackage * pack) +{ + if (pack) + g_free (pack); +} + +static void +gst_rtp_h263_pay_boundry_init (GstRtpH263PayBoundry * boundry, + guint8 * start, guint8 * end, guint8 sbit, guint8 ebit) +{ + boundry->start = start; + boundry->end = end; + boundry->sbit = sbit; + boundry->ebit = ebit; +} + +static void +gst_rtp_h263_pay_splat_header_A (guint8 * header, + GstRtpH263PayPackage * package, GstRtpH263PayPic * piclayer) +{ + + GstRtpH263PayAHeader *a_header; + + a_header = (GstRtpH263PayAHeader *) header; + + a_header->f = 0; + a_header->p = 0; + a_header->sbit = package->sbit; + a_header->ebit = package->ebit; + a_header->src = GST_H263_PICTURELAYER_PLSRC (piclayer); + a_header->i = GST_H263_PICTURELAYER_PLTYPE (piclayer); + a_header->u = GST_H263_PICTURELAYER_PLUMV (piclayer); + a_header->s = GST_H263_PICTURELAYER_PLSAC (piclayer); + a_header->a = GST_H263_PICTURELAYER_PLAP (piclayer); + a_header->r1 = 0; + a_header->r2 = 0; + a_header->dbq = 0; + a_header->trb = 0; + a_header->tr = 0; + +} + +static void +gst_rtp_h263_pay_splat_header_B (guint8 * header, + GstRtpH263PayPackage * package, GstRtpH263PayPic * piclayer) +{ + + GstRtpH263PayBHeader *b_header; + + b_header = (GstRtpH263PayBHeader *) header; + + b_header->f = 1; + b_header->p = 0; + b_header->sbit = package->sbit; + b_header->ebit = package->ebit; + b_header->src = GST_H263_PICTURELAYER_PLSRC (piclayer); + b_header->quant = package->quant; + b_header->gobn = package->gobn; + b_header->mba1 = package->mba >> 6; + b_header->mba2 = package->mba & 0x003f; + b_header->r = 0; + b_header->i = GST_H263_PICTURELAYER_PLTYPE (piclayer); + b_header->u = GST_H263_PICTURELAYER_PLUMV (piclayer); + b_header->s = GST_H263_PICTURELAYER_PLSAC (piclayer); + b_header->a = GST_H263_PICTURELAYER_PLAP (piclayer); + + b_header->hmv11 = 0; + b_header->hmv12 = 0; + b_header->vmv11 = 0; + b_header->vmv12 = 0; + b_header->hmv21 = 0; + b_header->hmv22 = 0; + b_header->vmv21 = 0; + + if (package->nmvd > 0) { + //mvd[0] + b_header->hmv11 = (package->mvd[0] & 0x7f) >> 3; + b_header->hmv12 = (package->mvd[0] & 0x07); + //mvd[1] + b_header->vmv11 = (package->mvd[1] & 0x07f) >> 2; + b_header->vmv12 = (package->mvd[1] & 0x03); + + if (package->nmvd == 8) { + //mvd[4] + b_header->hmv21 = (package->mvd[4] & 0x7f) >> 1; + b_header->hmv22 = (package->mvd[4] & 0x01); + //mvd[5] + b_header->vmv21 = (package->mvd[5] & 0x7f); + } + } + +} + +static gboolean +gst_rtp_h263_pay_gobfinder (GstRtpH263Pay * rtph263pay, + GstRtpH263PayBoundry * boundry) +{ + guint8 *current; + guint range; + guint i; + + current = boundry->end + 1; + range = (rtph263pay->data - current) + rtph263pay->available_data; + + + GST_DEBUG ("Searching for next GOB, data:%p, len:%u, payload_len:%p," + " current:%p, range:%u", rtph263pay->data, rtph263pay->available_data, + boundry->end + 1, current, range); + + /* If we are past the end, stop */ + if (current >= rtph263pay->data + rtph263pay->available_data) + return FALSE; + + for (i = 3; i < range - 3; i++) { + if ((current[i] == 0x0) && + (current[i + 1] == 0x0) && (current[i + 2] >> 7 == 0x1)) { + GST_LOG ("GOB end found at: %p start: %p len: %u", current + i - 1, + boundry->end + 1, (guint) (current + i - boundry->end + 2)); + gst_rtp_h263_pay_boundry_init (boundry, boundry->end + 1, + current + i - 1, 0, 0); + + return TRUE; + } + } + + GST_DEBUG ("Couldn't find any new GBSC in this frame, range:%u", range); + + gst_rtp_h263_pay_boundry_init (boundry, boundry->end + 1, + (guint8 *) (rtph263pay->data + rtph263pay->available_data - 1), 0, 0); + + return TRUE; +} + +static GstRtpH263PayGob * +gst_rtp_h263_pay_gob_new (GstRtpH263PayBoundry * boundry, guint gobn) +{ + GstRtpH263PayGob *gob; + + gob = (GstRtpH263PayGob *) g_malloc0 (sizeof (GstRtpH263PayGob)); + + gob->start = boundry->start; + gob->end = boundry->end; + gob->length = boundry->end - boundry->start + 1; + gob->ebit = boundry->ebit; + gob->sbit = boundry->sbit; + gob->gobn = gobn; + gob->quant = 0; + gob->macroblocks = NULL; + gob->nmacroblocs = 0; + + return gob; +} + +static void +gst_rtp_h263_pay_gob_destroy (GstRtpH263PayGob * gob, guint ind) +{ + + if (!gob) + return; + + if (gob->macroblocks) { + + guint i; + + for (i = 0; i < gob->nmacroblocs; i++) { + gst_rtp_h263_pay_mb_destroy (gob->macroblocks[i]); + } + + g_free (gob->macroblocks); + } + + g_free (gob); +} + +/* + * decode MCBPC for I frames and return index in table or -1 if not found + */ +static gint +gst_rtp_h263_pay_decode_mcbpc_I (guint32 value) +{ + + gint i; + guint16 code; + + code = value >> 16; + + GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); + + for (i = 0; i < MCBPC_I_LEN; i++) { + if ((code & mcbpc_I[i][1]) == mcbpc_I[i][0]) { + return i; + } + } + + GST_WARNING ("Couldn't find code, returning -1"); + + return -1; +} + +/* + * decode MCBPC for P frames and return index in table or -1 if not found + */ +static gint +gst_rtp_h263_pay_decode_mcbpc_P (guint32 value) +{ + + gint i; + guint16 code; + + code = value >> 16; + + GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); + + for (i = 0; i < MCBPC_P_LEN; i++) { + if ((code & mcbpc_P[i][1]) == mcbpc_P[i][0]) { + return i; + } + } + + GST_WARNING ("Couldn't find code, returning -1"); + + return -1; +} + +/* + * decode CBPY and return index in table or -1 if not found + */ +static gint +gst_rtp_h263_pay_decode_cbpy (guint32 value, const guint8 cbpy_table[16][7]) +{ + + gint i; + guint8 code; + + code = value >> 24; + + GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); + + for (i = 0; i < CBPY_LEN; i++) { + if ((code & cbpy_table[i][1]) == cbpy_table[i][0]) { + return i; + } + } + + GST_WARNING ("Couldn't find code, returning -1"); + + return -1; +} + +/* + * decode MVD and return index in table or -1 if not found + */ +static gint +gst_rtp_h263_pay_decode_mvd (guint32 value) +{ + + gint i; + guint16 code; + + code = value >> 16; + + GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); + + for (i = 0; i < MVD_LEN; i++) { + if ((code & mvd[i][1]) == mvd[i][0]) { + return i; + } + } + + GST_WARNING ("Couldn't find code, returning -1"); + + return -1; +} + +/* + * decode TCOEF and return index in table or -1 if not found + */ +static gint +gst_rtp_h263_pay_decode_tcoef (guint32 value) +{ + + gint i; + guint16 code; + + code = value >> 16; + + GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); + + for (i = 0; i < TCOEF_LEN; i++) { + if ((code & tcoef[i][1]) == tcoef[i][0]) { + GST_LOG ("tcoef is %d", i); + return i; + } + } + + GST_WARNING ("Couldn't find code, returning -1"); + + return -1; +} + +/* + * the 32-bit register is like a window that we move right for "move_bits" to get the next v "data" h263 field + * "rest_bits" tells how many bits in the "data" byte address are still not used + */ + +static gint +gst_rtp_h263_pay_move_window_right (GstRtpH263PayContext * context, guint n, + guint rest_bits, guint8 ** orig_data, guint8 ** data_end) +{ + + GST_DEBUG ("Moving window: 0x%08x from: %p for %d bits, rest_bits: %d", + context->window, context->win_end, n, rest_bits); + + if (n == 0) + return rest_bits; + + while (n != 0 || context->win_end == ((*data_end) + 1)) { + //guint8 a = *data; + if (rest_bits == 0) { + if (n > 8) { + context->window = (context->window << 8) | *context->win_end; + n -= 8; + } else { + context->window = + (context->window << n) | (*context->win_end >> (8 - n)); + rest_bits = 8 - n; + if (rest_bits == 0) + context->win_end++; + break; + } + } else { + if (n > rest_bits) { + context->window = + (context-> + window << rest_bits) | (*context->win_end & (((guint) pow (2.0, + (double) rest_bits)) - 1)); + n -= rest_bits; + rest_bits = 0; + } else { + context->window = + (context->window << n) | ((*context->win_end & (((guint) pow (2.0, + (double) rest_bits)) - 1)) >> (rest_bits - n)); + rest_bits -= n; + if (rest_bits == 0) + context->win_end++; + break; + } + } + + context->win_end++; + } + + *orig_data = context->win_end - 4; + + GST_DEBUG + ("Window moved to %p with value: 0x%08x and orig_data: %p rest_bits: %d", + context->win_end, context->window, *orig_data, rest_bits); + return rest_bits; +} + +/* + * Find the start of the next MB (end of the current MB) + * returns the number of excess bits and stores the end of the MB in end + * data must be placed on first MB byte + */ +static GstRtpH263PayMB * +gst_rtp_h263_pay_B_mbfinder (GstRtpH263PayContext * context, + GstRtpH263PayGob * gob, GstRtpH263PayMB * macroblock, guint mba) +{ + + guint mb_type_index; + guint cbpy_type_index; + guint tcoef_type_index; + GstRtpH263PayMB *mac; + GstRtpH263PayBoundry boundry; + + + gst_rtp_h263_pay_boundry_init (&boundry, macroblock->end, + macroblock->end, 8 - macroblock->ebit, macroblock->ebit); + mac = gst_rtp_h263_pay_mb_new (&boundry, mba); + + + if (mac->sbit == 8) { + mac->start++; +// mac->end++; + mac->sbit = 0; + } + + GST_LOG ("current_pos:%p, end:%p, rest_bits:%d, window:%x", + mac->start, mac->end, macroblock->ebit, context->window); + + GST_LOG ("Current pos after COD: %p", mac->end); + + if (context->piclayer->ptype_pictype == 0) { + //We have an I frame + gint i; + guint last; + guint ind; + + //Step 2 decode MCBPC I + mb_type_index = gst_rtp_h263_pay_decode_mcbpc_I (context->window); + + GST_DEBUG ("MCBPC index: %d", mb_type_index); + if (mb_type_index == -1) { + GST_ERROR ("MB index shouldn't be -1 in window: %08x", context->window); + return NULL; + } + + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, mcbpc_I[mb_type_index][2], + mac->ebit, &mac->end, &gob->end); + + mac->mb_type = mcbpc_I[mb_type_index][5]; + + if (mb_type_index == 8) { + GST_LOG ("Stuffing skipping rest of MB header"); + return mac; + } + //Step 3 decode CBPY I + cbpy_type_index = gst_rtp_h263_pay_decode_cbpy (context->window, cbpy_I); + + GST_DEBUG ("CBPY index: %d", cbpy_type_index); + if (cbpy_type_index == -1) { + GST_ERROR ("CBPY index shouldn't be -1 in window: %08x", context->window); + return NULL; + } + + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, cbpy_I[cbpy_type_index][2], + mac->ebit, &mac->end, &gob->end); + + //Step 4 decode rest of MB + //MB type 1 and 4 have DQUANT - we store it for packaging purposes + if (mcbpc_I[mb_type_index][5] == 4) { + GST_DEBUG ("Shifting DQUANT"); + + mac->quant = (context->window >> 30); + + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, 2, mac->ebit, &mac->end, + &gob->end); + } + //Step 5 go trough the blocks - decode DC and TCOEF + last = 0; + for (i = 0; i < N_BLOCKS; i++) { + + GST_DEBUG ("Decoding INTRADC and TCOEF, i:%d", i); + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, 8, mac->ebit, &mac->end, + &gob->end); + + if (i > 3) { + ind = mcbpc_I[mb_type_index][i - 1]; + } else { + ind = cbpy_I[cbpy_type_index][i + 3]; + } + + if (ind == 1) { + while (last == 0) { + tcoef_type_index = gst_rtp_h263_pay_decode_tcoef (context->window); + + GST_DEBUG ("TCOEF index: %d", tcoef_type_index); + if (tcoef_type_index == -1) { + GST_ERROR ("TCOEF index shouldn't be -1 in window: %08x", + context->window); + return NULL; + } + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, + tcoef[tcoef_type_index][2], mac->ebit, &mac->end, &gob->end); + + last = tcoef[tcoef_type_index][3]; + if (tcoef_type_index == 102) { + if ((context->window & 0x80000000) == 0x80000000) + last = 1; + else + last = 0; + + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, 15, + mac->ebit, &mac->end, &gob->end); + } + } + last = 0; + } + } + + } else { + //We have a P frame + guint i; + guint last; + guint ind; + + //Step 1 check COD + GST_DEBUG ("Checking for COD"); + if ((context->window & 0x80000000) == 0x80000000) { + //The MB is not coded + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, 1, mac->ebit, &mac->end, + &gob->end); + GST_DEBUG ("COOOOOOOOOOOD = 1"); + + return mac; + } else { + //The MB is coded + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, 1, mac->ebit, &mac->end, + &gob->end); + } + + //Step 2 decode MCBPC P + mb_type_index = gst_rtp_h263_pay_decode_mcbpc_P (context->window); + + GST_DEBUG ("MCBPC index: %d", mb_type_index); + if (mb_type_index == -1) { + GST_ERROR ("MB index shouldn't be -1 in window: %08x", context->window); + return NULL; + } + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, mcbpc_P[mb_type_index][2], + mac->ebit, &mac->end, &gob->end); + + mac->mb_type = mcbpc_P[mb_type_index][5]; + + if (mb_type_index == 20) { + GST_LOG ("Stuffing skipping rest of MB header"); + return mac; + } + //Step 3 decode CBPY P + cbpy_type_index = gst_rtp_h263_pay_decode_cbpy (context->window, cbpy_P); + + GST_DEBUG ("CBPY index: %d", cbpy_type_index); + if (cbpy_type_index == -1) { + GST_ERROR ("CBPY index shouldn't be -1 in window: %08x", context->window); + return NULL; + } + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, cbpy_P[cbpy_type_index][2], + mac->ebit, &mac->end, &gob->end); + + //MB type 1 and 4 have DQUANT - we add it to MB object and jump over + if (mcbpc_P[mb_type_index][5] == 4 || mcbpc_P[mb_type_index][5] == 1) { + GST_DEBUG ("Shifting DQUANT"); + + mac->quant = context->window >> 30; + + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, 2, mac->ebit, &mac->end, + &gob->end); + } + //MB types < 3 have MVD1-4 + if (mcbpc_P[mb_type_index][5] < 3) { + + guint nmvd; + gint j; + + nmvd = 2; + if (mcbpc_P[mb_type_index][5] == 2) + nmvd = 8; + + for (j = 0; j < nmvd; j++) { + guint mvd_type; + + mvd_type = gst_rtp_h263_pay_decode_mvd (context->window); + + if (mvd_type == -1) { + GST_ERROR ("MVD1-4 index shouldn't be -1 in window: %08x", + context->window); + return NULL; + } + //set the MB mvd values + mac->mvd[j] = mvd[mvd_type][3]; + + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, mvd[mvd_type][2], + mac->ebit, &mac->end, &gob->end); + } + + + } + //Step 5 go trough the blocks - decode DC and TCOEF + last = 0; + for (i = 0; i < N_BLOCKS; i++) { + + //if MB type 3 or 4 then INTRADC coef are present in blocks + if (mcbpc_P[mb_type_index][5] > 2) { + GST_DEBUG ("INTRADC coef: %d", i); + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, 8, mac->ebit, + &mac->end, &gob->end); + } else { + GST_DEBUG ("INTRADC coef is not present"); + } + + //check if the block has TCOEF + if (i > 3) { + ind = mcbpc_P[mb_type_index][i - 1]; + } else { + if (mcbpc_P[mb_type_index][5] > 2) { + ind = cbpy_I[cbpy_type_index][i + 3]; + } else { + ind = cbpy_P[cbpy_type_index][i + 3]; + } + } + + if (ind == 1) { + while (last == 0) { + tcoef_type_index = gst_rtp_h263_pay_decode_tcoef (context->window); + + GST_DEBUG ("TCOEF index: %d", tcoef_type_index); + if (tcoef_type_index == -1) { + GST_ERROR ("TCOEF index shouldn't be -1 in window: %08x", + context->window); + return NULL; + } + + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, + tcoef[tcoef_type_index][2], mac->ebit, &mac->end, &gob->end); + + last = tcoef[tcoef_type_index][3]; + if (tcoef_type_index == 102) { + if ((context->window & 0x80000000) == 0x80000000) + last = 1; + else + last = 0; + + mac->ebit = + gst_rtp_h263_pay_move_window_right (context, 15, + mac->ebit, &mac->end, &gob->end); + } + } + last = 0; + } + } + } + + mac->length = mac->end - mac->start + 1; + + return mac; +} + +static GstRtpH263PayMB * +gst_rtp_h263_pay_mb_new (GstRtpH263PayBoundry * boundry, guint mba) +{ + GstRtpH263PayMB *mb; + gint i; + + mb = (GstRtpH263PayMB *) g_malloc0 (sizeof (GstRtpH263PayMB)); + + mb->start = boundry->start; + mb->end = boundry->end; + mb->length = boundry->end - boundry->start + 1; + mb->sbit = boundry->sbit; + mb->ebit = boundry->ebit; + mb->mba = mba; + + for (i = 0; i < 5; i++) + mb->mvd[i] = 0; + + return mb; +} + +static void +gst_rtp_h263_pay_mb_destroy (GstRtpH263PayMB * mb) +{ + if (!mb) + return; + + g_free (mb); +} + +static GstFlowReturn +gst_rtp_h263_pay_push (GstRtpH263Pay * rtph263pay, + GstRtpH263PayContext * context, GstRtpH263PayPackage * package) +{ + + /* + * Splat the payload header values + */ + guint8 *header; + guint8 *payload; + GstFlowReturn ret; + + header = gst_rtp_buffer_get_payload (package->outbuf); + payload = header + package->mode; + + switch (package->mode) { + case GST_RTP_H263_PAYLOAD_HEADER_MODE_A: + GST_LOG ("Pushing A packet"); + gst_rtp_h263_pay_splat_header_A (header, package, context->piclayer); + break; + case GST_RTP_H263_PAYLOAD_HEADER_MODE_B: + GST_LOG ("Pushing B packet"); + gst_rtp_h263_pay_splat_header_B (header, package, context->piclayer); + break; + case GST_RTP_H263_PAYLOAD_HEADER_MODE_C: + //gst_rtp_h263_pay_splat_header_C(header, package, context->piclayer); + //break; + default: + return GST_FLOW_ERROR; + } + + + /* + * Copy the payload data in the buffer + */ + GST_DEBUG ("Copying memory"); + memcpy (payload, (guint8 *) package->payload_start, package->payload_len); + + /* + * timestamp the buffer + */ + GST_BUFFER_TIMESTAMP (package->outbuf) = rtph263pay->first_ts; + + gst_rtp_buffer_set_marker (package->outbuf, package->marker); + if (package->marker) + GST_DEBUG ("Marker set!"); + + ret = + gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtph263pay), + package->outbuf); + GST_DEBUG ("Package pushed, returning"); + + gst_rtp_h263_pay_package_destroy (package); + + return ret; +} + +static GstFlowReturn +gst_rtp_h263_pay_A_fragment_push (GstRtpH263Pay * rtph263pay, + GstRtpH263PayContext * context, guint first, guint last) +{ + + GstRtpH263PayPackage *pack; + + pack = gst_rtp_h263_pay_package_new_empty (); + + pack->payload_start = context->gobs[first]->start; + pack->sbit = context->gobs[first]->sbit; + pack->ebit = context->gobs[last]->ebit; + pack->payload_len = + (context->gobs[last]->end - context->gobs[first]->start) + 1; + pack->marker = FALSE; + + if (last == context->no_gobs - 1) { + pack->marker = TRUE; + } + + pack->gobn = context->gobs[first]->gobn; + pack->mode = GST_RTP_H263_PAYLOAD_HEADER_MODE_A; + pack->outbuf = + gst_rtp_buffer_new_allocate (pack->payload_len + pack->mode, 0, 0); + + GST_DEBUG ("Sending len:%d data to push function", pack->payload_len); + + return gst_rtp_h263_pay_push (rtph263pay, context, pack); +} + +static GstFlowReturn +gst_rtp_h263_pay_B_fragment_push (GstRtpH263Pay * rtph263pay, + GstRtpH263PayContext * context, GstRtpH263PayGob * gob, guint first, + guint last, GstRtpH263PayBoundry * boundry) +{ + + GstRtpH263PayPackage *pack; + guint mv; + + pack = gst_rtp_h263_pay_package_new_empty (); + + pack->payload_start = gob->macroblocks[first]->start; + pack->sbit = gob->macroblocks[first]->sbit; + if (first == 0) { + pack->payload_start = boundry->start; + pack->sbit = boundry->sbit; + pack->quant = gob->quant; + } else { + pack->quant = gob->macroblocks[first]->quant; + } + pack->payload_end = gob->macroblocks[last]->end; + + pack->ebit = gob->macroblocks[last]->ebit; + pack->mba = gob->macroblocks[first]->mba; + pack->gobn = gob->gobn; + pack->mode = GST_RTP_H263_PAYLOAD_HEADER_MODE_B; + pack->nmvd = 0; + + if (gob->macroblocks[first]->mb_type < 3) { + if (gob->macroblocks[first]->mb_type == 2) + pack->nmvd = 8; + else if (gob->macroblocks[first]->mb_type < 2) + pack->nmvd = 2; + + for (mv = 0; mv < pack->nmvd; mv++) + pack->mvd[mv] = gob->macroblocks[first]->mvd[mv]; + } + + pack->marker = FALSE; + if (last == gob->nmacroblocs - 1) { + pack->ebit = 0; + } + + if ((format_props[context->piclayer->ptype_srcformat][0] - 1 == gob->gobn) + && (last == gob->nmacroblocs - 1)) { + pack->marker = TRUE; + } + + pack->payload_len = pack->payload_end - pack->payload_start + 1; + pack->outbuf = + gst_rtp_buffer_new_allocate (pack->payload_len + pack->mode, 0, 0); + + return gst_rtp_h263_pay_push (rtph263pay, context, pack); +} + + +static gboolean +gst_rtp_h263_pay_mode_B_fragment (GstRtpH263Pay * rtph263pay, + GstRtpH263PayContext * context, GstRtpH263PayGob * gob) +{ + + + /*---------- MODE B MODE FRAGMENTATION ----------*/ + GstRtpH263PayMB *mac; + guint max_payload_size; + GstRtpH263PayBoundry boundry; + guint mb; + //TODO remove m + GstRtpH263PayMB *m; + + guint first = 0; + guint payload_len; + + max_payload_size = + context->mtu - GST_RTP_H263_PAYLOAD_HEADER_MODE_B - GST_RTP_HEADER_LEN; + + gst_rtp_h263_pay_boundry_init (&boundry, gob->start, gob->start, gob->sbit, + 0); + + gob->macroblocks = + (GstRtpH263PayMB **) g_malloc0 (sizeof (GstRtpH263PayMB *) * + format_props[context->piclayer->ptype_srcformat][1]); + + GST_LOG ("GOB isn't PB frame, applying mode B"); + + //initializing window + context->win_end = boundry.end; + if (gst_rtp_h263_pay_move_window_right (context, 32, boundry.ebit, + &boundry.end, &gob->end) != 0) { + GST_ERROR + ("The rest of the bits should be 0, exiting, because something bad happend"); + gst_adapter_flush (rtph263pay->adapter, rtph263pay->available_data); + goto decode_error; + } + //The first GOB of a frame "has no" actual header - PICTURE header is his header + if (gob->gobn == 0) { + guint shift; + GST_LOG ("Initial GOB"); + shift = 43; + + boundry.ebit = + gst_rtp_h263_pay_move_window_right (context, shift, boundry.ebit, + &boundry.end, &gob->end); + + //We need PQUANT for mode B packages - so we store it + gob->quant = context->window >> 27; + + //if PCM == 1, then PSBI is present - header has 51 bits + //shift for PQUANT (5) and PCM (1) = 6 bits + shift = 6; + if (context->cpm == 1) + shift += 2; + boundry.ebit = + gst_rtp_h263_pay_move_window_right (context, shift, boundry.ebit, + &boundry.end, &gob->end); + + GST_DEBUG ("window: 0x%08x", context->window); + + //Shifting the PEI and PSPARE fields + while ((context->window & 0x80000000) == 0x80000000) { + boundry.ebit = + gst_rtp_h263_pay_move_window_right (context, 9, + boundry.ebit, &boundry.end, &gob->end); + GST_LOG ("window: 0x%x", context->window); + } + + //shift the last PEI field + boundry.ebit = + gst_rtp_h263_pay_move_window_right (context, 1, boundry.ebit, + &boundry.end, &gob->end); + + } else { + //skipping GOBs 24 header bits + 5 GQUANT + guint shift = 24; + + GST_LOG ("INTER GOB"); + + //if CPM == 1, there are 2 more bits in the header - GSBI header is 31 bits long + if (context->cpm == 1) + shift += 2; + + GST_LOG ("window: 0x%x", context->window); + boundry.ebit = + gst_rtp_h263_pay_move_window_right (context, shift, + boundry.ebit, &boundry.end, &gob->end); + + //We need GQUANT for mode B packages - so we store it + gob->quant = context->window >> 27; + + shift = 5; + boundry.ebit = + gst_rtp_h263_pay_move_window_right (context, shift, + boundry.ebit, &boundry.end, &gob->end); + + GST_LOG ("window: 0x%x", context->window); + } + + GST_DEBUG ("GQUANT IS: %08x", gob->quant); + + // We are on MB layer + + m = mac = gst_rtp_h263_pay_mb_new (&boundry, 0); + for (mb = 0; mb < format_props[context->piclayer->ptype_srcformat][1]; mb++) { + + GST_DEBUG ("================ START MB %d =================", mb); + + //Find next macroblock boundaries + if (!(mac = gst_rtp_h263_pay_B_mbfinder (context, gob, mac, mb))) { + + GST_DEBUG ("Error decoding MB - sbit: %d", 8 - m->ebit); + GST_ERROR ("Error decoding in GOB"); + + goto decode_error; + } + //If mb_type == stuffing, don't increment the mb address + if (mac->mb_type == 10) { + mb--; + continue; + } else { + gob->nmacroblocs++; + } + + gob->macroblocks[mb] = mac; + + if (mac->end >= gob->end) { + GST_LOG ("No more MBs in this GOB"); + if (!mac->ebit) { + mac->end--; + } + gob->end = mac->end; + break; + } + m = mac; + GST_DEBUG ("Found MB: mba: %d start: %p end: %p len: %d sbit: %d ebit: %d", + mac->mba, mac->start, mac->end, mac->length, mac->sbit, mac->ebit); + GST_DEBUG ("================ END MB %d =================", mb); + } + + mb = 0; + first = 0; + payload_len = boundry.end - boundry.start + 1; + GST_DEBUG ("------------------------- NEW PACKAGE ----------------------"); + while (mb < gob->nmacroblocs) { + if (payload_len + gob->macroblocks[mb]->length < max_payload_size) { + + //FIXME: payload_len is not the real length -> ignoring sbit/ebit + payload_len += gob->macroblocks[mb]->length; + mb++; + + } else { + //FIXME: we should include the last few bits of the GOB in the package - do we do that now? + //GST_DEBUG ("Pushing GOBS %d to %d because payload size is %d", first, + // first == mb - 1, payload_len); + + if (gst_rtp_h263_pay_B_fragment_push (rtph263pay, context, gob, first, + mb - 1, &boundry)) { + GST_ERROR ("Oooops, there was an error sending"); + return FALSE; + } + + payload_len = 0; + first = mb; + GST_DEBUG + ("------------------------- END PACKAGE ----------------------"); + GST_DEBUG + ("------------------------- NEW PACKAGE ----------------------"); + } + } + + /* Push rest */ + GST_DEBUG ("Remainder first: %d, MB: %d", first, mb); + if (payload_len != 0) { + if (gst_rtp_h263_pay_B_fragment_push (rtph263pay, context, gob, first, + mb - 1, &boundry)) { + GST_ERROR ("Oooops, there was an error sending!"); + return FALSE; + } + } + + /*---------- END OF MODE B FRAGMENTATION ----------*/ + + return TRUE; + +decode_error: + return FALSE; +} + +static GstFlowReturn +gst_rtp_h263_send_entire_frame (GstRtpH263Pay * rtph263pay, + GstRtpH263PayContext * context) +{ + GstRtpH263PayPackage *pack; + pack = + gst_rtp_h263_pay_package_new (rtph263pay->data, + rtph263pay->data + rtph263pay->available_data, + rtph263pay->available_data, 0, 0, NULL, TRUE); + pack->mode = GST_RTP_H263_PAYLOAD_HEADER_MODE_A; + + GST_DEBUG ("Available data: %d", rtph263pay->available_data); + + pack->outbuf = + gst_rtp_buffer_new_allocate (pack->payload_len + + GST_RTP_H263_PAYLOAD_HEADER_MODE_A, 0, 0); + + return gst_rtp_h263_pay_push (rtph263pay, context, pack); +} + +static GstFlowReturn +gst_rtp_h263_pay_flush (GstRtpH263Pay * rtph263pay) +{ + + /* + * FIXME: GSTUF bits are ignored right now, + * - not using EBIT/SBIT payload header fields in mode A fragmentation - ffmpeg doesn't need them, but others? + */ + + GstFlowReturn ret; + GstRtpH263PayContext *context; + gint i; + + ret = 0; + context = (GstRtpH263PayContext *) g_malloc0 (sizeof (GstRtpH263PayContext)); + context->mtu = + rtph263pay->payload.mtu - (MTU_SECURITY_OFFSET + GST_RTP_HEADER_LEN + + GST_RTP_H263_PAYLOAD_HEADER_MODE_C); + + GST_DEBUG ("MTU: %d", context->mtu); + rtph263pay->available_data = gst_adapter_available (rtph263pay->adapter); + if (rtph263pay->available_data == 0) { + ret = GST_FLOW_RESEND; + goto end; + } + + /* Get a pointer to all the data for the frame */ + rtph263pay->data = + (guint8 *) gst_adapter_peek (rtph263pay->adapter, + rtph263pay->available_data); + + /* Picture header */ + context->piclayer = (GstRtpH263PayPic *) rtph263pay->data; + + if (context->piclayer->ptype_pictype == 0) + GST_DEBUG ("We got an I-frame"); + else + GST_DEBUG ("We got a P-frame"); + + context->cpm = rtph263pay->data[6] >> 7; + + GST_DEBUG ("CPM: %d", context->cpm); + + GST_DEBUG ("Payload length is: %d", rtph263pay->available_data); + + /* + * - MODE A - If normal, I and P frames, -> mode A + * - GOB layer fragmentation + * - MODE B - If normal, I and P frames, but GOBs > mtu + * - MB layer fragmentation + * - MODE C - For P frames with PB option, but GOBs > mtu + * - MB layer fragmentation + */ + if (rtph263pay->available_data + GST_RTP_H263_PAYLOAD_HEADER_MODE_A + + GST_RTP_HEADER_LEN < context->mtu) { + ret = gst_rtp_h263_send_entire_frame (rtph263pay, context); + } else { + + /*---------- FRAGMENTING THE FRAME BECAUSE TOO LARGE TO FIT IN MTU ----------*/ + GstRtpH263PayBoundry bound; + gint first; + guint payload_len; + gboolean forcea = FALSE; + + GST_DEBUG ("Frame too large for MTU"); + /* + * Let's go trough all the data and fragment it untill end is reached + */ + + gst_rtp_h263_pay_boundry_init (&bound, NULL, rtph263pay->data - 1, 0, 0); + context->gobs = + (GstRtpH263PayGob **) g_malloc0 (format_props[context-> + piclayer->ptype_srcformat][0] * sizeof (GstRtpH263PayGob *)); + + + for (i = 0; i < format_props[context->piclayer->ptype_srcformat][0]; i++) { + GST_DEBUG ("Searching for gob %d", i); + if (!gst_rtp_h263_pay_gobfinder (rtph263pay, &bound)) { + if (i <= 1) { + GST_WARNING + ("No GOB's were found in data stream! Please enable RTP mode in encoder. Forcing mode A for now."); + ret = gst_rtp_h263_send_entire_frame (rtph263pay, context); + goto end; + } else { + /* try to send fragments corresponding to found GOBs */ + forcea = TRUE; + break; + } + } + + context->gobs[i] = gst_rtp_h263_pay_gob_new (&bound, i); + //FIXME - encoders may generate an EOS gob that has to be processed + GST_DEBUG + ("Gob values are: gobn: %d, start: %p len: %d ebit: %d sbit: %d", i, + context->gobs[i]->start, context->gobs[i]->length, + context->gobs[i]->ebit, context->gobs[i]->sbit); + } + /* NOTE some places may still assume this to be the max possible */ + context->no_gobs = i; + GST_DEBUG ("Found %d GOBS of maximum %d", + context->no_gobs, format_props[context->piclayer->ptype_srcformat][0]); + + // Make packages smaller than MTU + // A mode + // - if ( GOB > MTU) -> B mode || C mode + // Push packages + + first = 0; + payload_len = 0; + i = 0; + while (i < context->no_gobs) { + + if (context->gobs[i]->length >= context->mtu) { + if (payload_len == 0) { + + GST_DEBUG ("GOB len > MTU"); + if (rtph263pay->prop_payload_mode || forcea) { + payload_len = context->gobs[i]->length; + goto force_a; + } + if (!context->piclayer->ptype_pbmode) { + GST_DEBUG ("MODE B on GOB %d needed", i); + if (!gst_rtp_h263_pay_mode_B_fragment (rtph263pay, context, + context->gobs[i])) { + GST_ERROR ("There was an error fragmenting in mode B"); + return GST_FLOW_ERROR; + } + } else { + //IMPLEMENT C mode + GST_ERROR ("MODE C on GOB %d needed, but not supported yet", i); + /*if(!gst_rtp_h263_pay_mode_C_fragment(rtph263pay, context, context->gobs[i])) { + ret = GST_FLOW_OK; + GST_ERROR("There was an error fragmenting in mode C"); + goto decode_error; + } */ + goto decode_error; + } + decode_error: + i++; + first = i; + continue; + + } else { + goto payload_a_push; + } + } + + if (payload_len + context->gobs[i]->length < context->mtu) { + GST_DEBUG ("GOB %d fills mtu", i); + payload_len += context->gobs[i]->length; + i++; + if (i == context->no_gobs) { + GST_DEBUG ("LAST GOB %d", i); + goto payload_a_push; + } + + } else { + payload_a_push: + GST_DEBUG ("Pushing GOBS %d to %d because payload size is %d", first, + first == i ? i : i - 1, payload_len); + gst_rtp_h263_pay_A_fragment_push (rtph263pay, context, first, + first == i ? i : i - 1); + payload_len = 0; + first = i; + } + continue; + + force_a: + GST_DEBUG ("Pushing GOBS %d to %d because payload size is %d", first, i, + payload_len); + gst_rtp_h263_pay_A_fragment_push (rtph263pay, context, first, i); + payload_len = 0; + i++; + first = i; + } + + + }/*---------- END OF FRAGMENTATION ----------*/ + + /* Flush the input buffer data */ + +end: + gst_rtp_h263_pay_context_destroy (context, + context->piclayer->ptype_srcformat); + gst_adapter_flush (rtph263pay->adapter, rtph263pay->available_data); + + return ret; +} + +static GstFlowReturn +gst_rtp_h263_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer) +{ + + GstRtpH263Pay *rtph263pay; + GstFlowReturn ret; + + GST_DEBUG ("-------------------- NEW FRAME ---------------"); + rtph263pay = GST_RTP_H263_PAY (payload); + + rtph263pay->first_ts = GST_BUFFER_TIMESTAMP (buffer); + + /* we always encode and flush a full picture */ + gst_adapter_push (rtph263pay->adapter, buffer); + ret = gst_rtp_h263_pay_flush (rtph263pay); + GST_DEBUG ("-------------------- END FRAME ---------------"); + + return ret; +} + +gboolean +gst_rtp_h263_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtph263pay", + GST_RANK_SECONDARY, GST_TYPE_RTP_H263_PAY); +} diff --git a/gst/rtp/gstrtph263pay.h b/gst/rtp/gstrtph263pay.h new file mode 100644 index 0000000..05fb733 --- /dev/null +++ b/gst/rtp/gstrtph263pay.h @@ -0,0 +1,414 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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. + * + * Author: Dejan Sakelsak sahel@kiberpipa.org + */ + +#ifndef __GST_RTP_H263_PAY_H__ +#define __GST_RTP_H263_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_RTP_H263_PAY \ + (gst_rtp_h263_pay_get_type()) +#define GST_RTP_H263_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263_PAY,GstRtpH263Pay)) +#define GST_RTP_H263_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263_PAY,GstRtpH263PayClass)) +#define GST_IS_RTP_H263_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263_PAY)) +#define GST_IS_RTP_H263_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263_PAY)) +// blocks per macroblock +#define N_BLOCKS 6 +#define DEFAULT_MODE_A FALSE +#define MTU_SECURITY_OFFSET 50 + typedef enum _GstRtpH263PayHeaderMode +{ + GST_RTP_H263_PAYLOAD_HEADER_MODE_A = 4, + GST_RTP_H263_PAYLOAD_HEADER_MODE_B = 8, + GST_RTP_H263_PAYLOAD_HEADER_MODE_C = 12 +} GstRtpH263PayHeaderMode; + +typedef struct _GstRtpH263PayContext GstRtpH263PayContext; +typedef struct _GstRtpH263PayPic GstRtpH263PayPic; +typedef struct _GstRtpH263PayClass GstRtpH263PayClass; +typedef struct _GstRtpH263Pay GstRtpH263Pay; +typedef struct _GstRtpH263PayBoundry GstRtpH263PayBoundry; +typedef struct _GstRtpH263PayMB GstRtpH263PayMB; +typedef struct _GstRtpH263PayGob GstRtpH263PayGob; +typedef struct _GstRtpH263PayPackage GstRtpH263PayPackage; + +//typedef enum _GstRtpH263PayHeaderMode GstRtpH263PayHeaderMode; + +struct _GstRtpH263Pay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime first_ts; + gboolean prop_payload_mode; + guint8 *data; + guint available_data; + +}; + +struct _GstRtpH263PayContext +{ + GstRtpH263PayPic *piclayer; + + guint mtu; + guint window; + guint8 *win_end; + guint8 cpm; + + guint no_gobs; + GstRtpH263PayGob **gobs; + +}; + +struct _GstRtpH263PayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +typedef struct _GstRtpH263PayAHeader +{ +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + unsigned int ebit:3; /* End position */ + unsigned int sbit:3; /* Start position */ + unsigned int p:1; /* PB-frames mode */ + unsigned int f:1; /* flag bit */ + + unsigned int r1:1; /* Reserved */ + unsigned int a:1; /* Advanced Prediction */ + unsigned int s:1; /* syntax based arithmetic coding */ + unsigned int u:1; /* Unrestricted motion vector */ + unsigned int i:1; /* Picture coding type */ + unsigned int src:3; /* Source format */ + + unsigned int trb:3; /* Temporal ref for B frame */ + unsigned int dbq:2; /* Differential Quantisation parameter */ + unsigned int r2:3; /* Reserved */ +#elif G_BYTE_ORDER == G_BIG_ENDIAN + unsigned int f:1; /* flag bit */ + unsigned int p:1; /* PB-frames mode */ + unsigned int sbit:3; /* Start position */ + unsigned int ebit:3; /* End position */ + + unsigned int src:3; /* Source format */ + unsigned int i:1; /* Picture coding type */ + unsigned int u:1; /* Unrestricted motion vector */ + unsigned int s:1; /* syntax based arithmetic coding */ + unsigned int a:1; /* Advanced Prediction */ + unsigned int r1:1; /* Reserved */ + + unsigned int r2:3; /* Reserved */ + unsigned int dbq:2; /* Differential Quantisation parameter */ + unsigned int trb:3; /* Temporal ref for B frame */ +#else +#error "G_BYTE_ORDER should be big or little endian." +#endif + unsigned int tr:8; /* Temporal ref for P frame */ +} GstRtpH263PayAHeader; + +typedef struct _GstRtpH263PayBHeader +{ +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + unsigned int ebit:3; /* End position */ + unsigned int sbit:3; /* Start position */ + unsigned int p:1; /* PB-frames mode */ + unsigned int f:1; /* flag bit */ + + unsigned int quant:5; /* Quantization value for first MB */ + unsigned int src:3; /* Source format */ + + unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */ + unsigned int gobn:5; /* GOB number in effect at start of packet */ + + unsigned int r:2; /* Reserved */ + unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */ + + unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */ + unsigned int a:1; /* Advanced Prediction */ + unsigned int s:1; /* syntax based arithmetic coding */ + unsigned int u:1; /* Unrestricted motion vector */ + unsigned int i:1; /* Picture coding type */ + + unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */ + unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */ + + unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */ + unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */ + + unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */ + unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */ + +#elif G_BYTE_ORDER == G_BIG_ENDIAN + unsigned int f:1; /* flag bit */ + unsigned int p:1; /* PB-frames mode */ + unsigned int sbit:3; /* Start position */ + unsigned int ebit:3; /* End position */ + + unsigned int src:3; /* Source format */ + unsigned int quant:5; /* Quantization value for first MB */ + + unsigned int gobn:5; /* GOB number in effect at start of packet */ + unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */ + + unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */ + unsigned int r:2; /* Reserved */ + + unsigned int i:1; /* Picture coding type */ + unsigned int u:1; /* Unrestricted motion vector */ + unsigned int s:1; /* syntax based arithmetic coding */ + unsigned int a:1; /* Advanced Prediction */ + unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */ + + unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */ + unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */ + + unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */ + unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */ + + unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */ + unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */ +#else +#error "G_BYTE_ORDER should be big or little endian." +#endif +} GstRtpH263PayBHeader; + +typedef struct _GstRtpH263PayCHeader +{ +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + unsigned int ebit:3; /* End position */ + unsigned int sbit:3; /* Start position */ + unsigned int p:1; /* PB-frames mode */ + unsigned int f:1; /* flag bit */ + + unsigned int quant:5; /* Quantization value for first MB */ + unsigned int src:3; /* Source format */ + + unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */ + unsigned int gobn:5; /* GOB number in effect at start of packet */ + + unsigned int r:2; /* Reserved */ + unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */ + + unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */ + unsigned int a:1; /* Advanced Prediction */ + unsigned int s:1; /* syntax based arithmetic coding */ + unsigned int u:1; /* Unrestricted motion vector */ + unsigned int i:1; /* Picture coding type */ + + unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */ + unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */ + + unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */ + unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */ + + unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */ + unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */ + + unsigned int rr1:8; /* reserved */ + + unsigned int rr2:8; /* reserved */ + + unsigned int trb:3; /* Temporal Reference for the B */ + unsigned int dbq:2; /* Differential quantization parameter */ + unsigned int rr3:3; /* reserved */ + + unsigned int tr:8; /* Temporal Reference for the P frame */ + +#elif G_BYTE_ORDER == G_BIG_ENDIAN + unsigned int f:1; /* flag bit */ + unsigned int p:1; /* PB-frames mode */ + unsigned int sbit:3; /* Start position */ + unsigned int ebit:3; /* End position */ + + unsigned int src:3; /* Source format */ + unsigned int quant:5; /* Quantization value for first MB */ + + unsigned int gobn:5; /* GOB number in effect at start of packet */ + unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */ + + unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */ + unsigned int r:2; /* Reserved */ + + unsigned int i:1; /* Picture coding type */ + unsigned int u:1; /* Unrestricted motion vector */ + unsigned int s:1; /* syntax based arithmetic coding */ + unsigned int a:1; /* Advanced Prediction */ + unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */ + + unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */ + unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */ + + unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */ + unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */ + + unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */ + unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */ + unsigned int rr1:8; /* reserved */ + unsigned int rr2:8; /* reserved */ + + unsigned int rr3:3; /* reserved */ + unsigned int dbq:2; /* Differential quantization parameter */ + unsigned int trb:3; /* Temporal Reference for the B */ + + unsigned int tr:8; /* Temporal Reference for the P frame */ +#else +#error "G_BYTE_ORDER should be big or little endian." +#endif +} GstRtpH263PayCHeader; + +struct _GstRtpH263PayPic +{ +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + unsigned int psc1:16; + + unsigned int tr1:2; + unsigned int psc2:6; + + unsigned int ptype_263:1; + unsigned int ptype_start:1; + unsigned int tr2:6; + + unsigned int ptype_umvmode:1; + unsigned int ptype_pictype:1; + unsigned int ptype_srcformat:3; + unsigned int ptype_freeze:1; + unsigned int ptype_camera:1; + unsigned int ptype_split:1; + + unsigned int pquant:5; + unsigned int ptype_pbmode:1; + unsigned int ptype_apmode:1; + unsigned int ptype_sacmode:1; + +#elif G_BYTE_ORDER == G_BIG_ENDIAN + unsigned int psc1:16; + + unsigned int psc2:6; + unsigned int tr1:2; + + unsigned int tr2:6; + unsigned int ptype_start:2; + + unsigned int ptype_split:1; + unsigned int ptype_camera:1; + unsigned int ptype_freeze:1; + unsigned int ptype_srcformat:3; + unsigned int ptype_pictype:1; + unsigned int ptype_umvmode:1; + + unsigned int ptype_sacmode:1; + unsigned int ptype_apmode:1; + unsigned int ptype_pbmode:1; + unsigned int pquant:5; + +#else +#error "G_BYTE_ORDER should be big or little endian." +#endif +}; + +struct _GstRtpH263PayBoundry +{ + + guint8 *start; + guint8 *end; + guint8 sbit; + guint8 ebit; + +}; + +struct _GstRtpH263PayMB +{ + guint8 *start; + guint8 *end; + guint8 sbit; + guint8 ebit; + guint length; + + guint8 mb_type; + guint quant; + + guint mba; + guint8 mvd[10]; +}; + +struct _GstRtpH263PayGob +{ + guint8 *start; + guint8 *end; + guint length; + guint8 sbit; + guint8 ebit; + + guint gobn; + guint quant; + + GstRtpH263PayMB **macroblocks; + guint nmacroblocs; +}; + +struct _GstRtpH263PayPackage +{ + guint8 *payload_start; + guint8 *payload_end; + guint payload_len; + guint8 sbit; + guint8 ebit; + GstBuffer *outbuf; + gboolean marker; + + GstRtpH263PayHeaderMode mode; + + /* + * mode B,C data + */ + + guint16 mba; + guint nmvd; + guint8 mvd[10]; + guint gobn; + guint quant; +}; + +#define GST_H263_PICTURELAYER_PLSRC(buf) (((GstRtpH263PayPic *)(buf))->ptype_srcformat) +#define GST_H263_PICTURELAYER_PLTYPE(buf) (((GstRtpH263PayPic *)(buf))->ptype_pictype) +#define GST_H263_PICTURELAYER_PLUMV(buf) (((GstRtpH263PayPic *)(buf))->ptype_umvmode) +#define GST_H263_PICTURELAYER_PLSAC(buf) (((GstRtpH263PayPic *)(buf))->ptype_sacmode) +#define GST_H263_PICTURELAYER_PLAP(buf) (((GstRtpH263PayPic *)(buf))->ptype_apmode) + +/* + * TODO: PB frame relevant tables + */ + +#define GST_RTP_H263_PAY_END(start, len) (((guint8 *)start) + ((guint)len)) +#define GST_RTP_H263_PAY_GOBN(gob) (((((guint8 *) gob)[2] >> 2) & 0x1f) + +GType gst_rtp_h263_pay_get_type (void); + +gboolean gst_rtp_h263_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_RTP_H263_PAY_H__ */ diff --git a/gst/rtp/gstrtph263pdepay.c b/gst/rtp/gstrtph263pdepay.c new file mode 100644 index 0000000..37e8989 --- /dev/null +++ b/gst/rtp/gstrtph263pdepay.c @@ -0,0 +1,399 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include +#include "gstrtph263pdepay.h" + +static GstStaticPadTemplate gst_rtp_h263p_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h263, " "variant = (string) \"itu\" ") + ); + +static GstStaticPadTemplate gst_rtp_h263p_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX], " + "encoding-name = (string) \"H263-1998\"; " + /* optional params */ + /* NOTE all optional SDP params must be strings in the caps */ + /* + "sqcif = (string) [1, 32], " + "qcif = (string) [1, 32], " + "cif = (string) [1, 32], " + "cif4 = (string) [1, 32], " + "cif16 = (string) [1, 32], " + "custom = (string) ANY, " + "f = (string) {0, 1}," + "i = (string) {0, 1}," + "j = (string) {0, 1}," + "t = (string) {0, 1}," + "k = (string) {1, 2, 3, 4}," + "n = (string) {1, 2, 3, 4}," + "p = (string) ANY," + "par = (string) ANY, " + "cpcf = (string) ANY, " + "bpp = (string) [0, 65536], " + "hrd = (string) {0, 1}; " + */ + "application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX], " + "encoding-name = (string) \"H263-2000\" " + /* optional params */ + /* NOTE all optional SDP params must be strings in the caps */ + /* + "profile = (string) [0, 10], " + "level = (string) {10, 20, 30, 40, 45, 50, 60, 70}, " + "interlace = (string) {0, 1};" + */ + ) + ); + +GST_BOILERPLATE (GstRtpH263PDepay, gst_rtp_h263p_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_h263p_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_h263p_depay_change_state (GstElement * + element, GstStateChange transition); + +static GstBuffer *gst_rtp_h263p_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +gboolean gst_rtp_h263p_depay_setcaps (GstBaseRTPDepayload * filter, + GstCaps * caps); + +static void +gst_rtp_h263p_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h263p_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h263p_depay_sink_template); + + + gst_element_class_set_details_simple (element_class, "RTP H263 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts H263/+/++ video from RTP packets (RFC 4629)", + "Wim Taymans "); +} + +static void +gst_rtp_h263p_depay_class_init (GstRtpH263PDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_h263p_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_h263p_depay_setcaps; + + gobject_class->finalize = gst_rtp_h263p_depay_finalize; + + gstelement_class->change_state = gst_rtp_h263p_depay_change_state; +} + +static void +gst_rtp_h263p_depay_init (GstRtpH263PDepay * rtph263pdepay, + GstRtpH263PDepayClass * klass) +{ + rtph263pdepay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_h263p_depay_finalize (GObject * object) +{ + GstRtpH263PDepay *rtph263pdepay; + + rtph263pdepay = GST_RTP_H263P_DEPAY (object); + + g_object_unref (rtph263pdepay->adapter); + rtph263pdepay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +gboolean +gst_rtp_h263p_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) +{ + GstCaps *srccaps = NULL; + GstStructure *structure = gst_caps_get_structure (caps, 0); + gint clock_rate; + const gchar *encoding_name = NULL; + gboolean res; + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + filter->clock_rate = clock_rate; + + encoding_name = gst_structure_get_string (structure, "encoding-name"); + if (encoding_name == NULL) + goto no_encoding_name; + + if (g_ascii_strcasecmp (encoding_name, "H263-2000") == 0) { + /* always h263++ */ + srccaps = gst_caps_new_simple ("video/x-h263", + "variant", G_TYPE_STRING, "itu", + "h263version", G_TYPE_STRING, "h263pp", NULL); + } else if (g_ascii_strcasecmp (encoding_name, "H263-1998") == 0) { + /* this can be H263 or H263+ depending on defined appendixes in the optional + * SDP params */ + const gchar *F, *I, *J, *T, *K, *N, *P; + gboolean is_h263p = FALSE; + + F = gst_structure_get_string (structure, "f"); + if (F) + if (g_ascii_strcasecmp (F, "1") == 0) + is_h263p = TRUE; + I = gst_structure_get_string (structure, "i"); + if (I) + if (g_ascii_strcasecmp (I, "1") == 0) + is_h263p = TRUE; + J = gst_structure_get_string (structure, "j"); + if (J) + if (g_ascii_strcasecmp (J, "1") == 0) + is_h263p = TRUE; + T = gst_structure_get_string (structure, "t"); + if (T) + if (g_ascii_strcasecmp (T, "1") == 0) + is_h263p = TRUE; + K = gst_structure_get_string (structure, "k"); + if (K) + is_h263p = TRUE; + N = gst_structure_get_string (structure, "n"); + if (N) + is_h263p = TRUE; + P = gst_structure_get_string (structure, "p"); + if (P) + is_h263p = TRUE; + + if (is_h263p) { + srccaps = gst_caps_new_simple ("video/x-h263", + "variant", G_TYPE_STRING, "itu", + "h263version", G_TYPE_STRING, "h263p", NULL); + } else { + srccaps = gst_caps_new_simple ("video/x-h263", + "variant", G_TYPE_STRING, "itu", + "h263version", G_TYPE_STRING, "h263", NULL); + } + } + if (!srccaps) + goto no_caps; + + res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (filter), srccaps); + gst_caps_unref (srccaps); + + return res; + + /* ERRORS */ +no_encoding_name: + { + GST_ERROR_OBJECT (filter, "no encoding-name"); + return FALSE; + } +no_caps: + { + GST_ERROR_OBJECT (filter, "invalid encoding-name"); + return FALSE; + } +} + +static GstBuffer * +gst_rtp_h263p_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpH263PDepay *rtph263pdepay; + GstBuffer *outbuf; + + rtph263pdepay = GST_RTP_H263P_DEPAY (depayload); + + /* flush remaining data on discont */ + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_LOG_OBJECT (depayload, "DISCONT, flushing adapter"); + gst_adapter_clear (rtph263pdepay->adapter); + rtph263pdepay->wait_start = TRUE; + } + + { + gint payload_len; + guint8 *payload; + gboolean P, V, M; + guint header_len; + guint8 PLEN, PEBIT; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + payload = gst_rtp_buffer_get_payload (buf); + + header_len = 2; + + if (payload_len < header_len) + goto too_small; + + M = gst_rtp_buffer_get_marker (buf); + + /* 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | RR |P|V| PLEN |PEBIT| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + P = (payload[0] & 0x04) == 0x04; + V = (payload[0] & 0x02) == 0x02; + PLEN = ((payload[0] & 0x1) << 5) | (payload[1] >> 3); + PEBIT = payload[1] & 0x7; + + GST_LOG_OBJECT (depayload, "P %d, V %d, PLEN %d, PEBIT %d", P, V, PLEN, + PEBIT); + + if (V) { + header_len++; + } + if (PLEN) { + header_len += PLEN; + } + + if ((!P && payload_len < header_len) || (P && payload_len < header_len - 2)) + goto too_small; + + if (P) { + /* FIXME, have to make the packet writable hear. Better to reset these + * bytes when we copy the packet below */ + rtph263pdepay->wait_start = FALSE; + header_len -= 2; + payload[header_len] = 0; + payload[header_len + 1] = 0; + } + + if (rtph263pdepay->wait_start) + goto waiting_start; + + if (payload_len < header_len) + goto too_small; + + /* FIXME do not ignore the VRC header (See RFC 2429 section 4.2) */ + /* FIXME actually use the RTP picture header when it is lost in the network */ + /* for now strip off header */ + payload += header_len; + payload_len -= header_len; + + if (M) { + /* frame is completed: append to previous, push it out */ + guint len, padlen; + guint avail; + + GST_LOG_OBJECT (depayload, "Frame complete"); + + avail = gst_adapter_available (rtph263pdepay->adapter); + + len = avail + payload_len; + padlen = (len % 4) + 4; + outbuf = gst_buffer_new_and_alloc (len + padlen); + memset (GST_BUFFER_DATA (outbuf) + len, 0, padlen); + GST_BUFFER_SIZE (outbuf) = len; + + /* prepend previous data */ + if (avail > 0) { + gst_adapter_copy (rtph263pdepay->adapter, GST_BUFFER_DATA (outbuf), 0, + avail); + gst_adapter_flush (rtph263pdepay->adapter, avail); + } + memcpy (GST_BUFFER_DATA (outbuf) + avail, payload, payload_len); + + return outbuf; + + } else { + /* frame not completed: store in adapter */ + outbuf = gst_buffer_new_and_alloc (payload_len); + + GST_LOG_OBJECT (depayload, "Frame incomplete, storing %d", payload_len); + + memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); + + gst_adapter_push (rtph263pdepay->adapter, outbuf); + } + } + return NULL; + +too_small: + { + GST_ELEMENT_WARNING (rtph263pdepay, STREAM, DECODE, + ("Packet payload was too small"), (NULL)); + return NULL; + } +waiting_start: + { + GST_DEBUG_OBJECT (rtph263pdepay, "waiting for picture start"); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_h263p_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpH263PDepay *rtph263pdepay; + GstStateChangeReturn ret; + + rtph263pdepay = GST_RTP_H263P_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (rtph263pdepay->adapter); + rtph263pdepay->wait_start = TRUE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_h263p_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtph263pdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_H263P_DEPAY); +} diff --git a/gst/rtp/gstrtph263pdepay.h b/gst/rtp/gstrtph263pdepay.h new file mode 100644 index 0000000..0e7c351 --- /dev/null +++ b/gst/rtp/gstrtph263pdepay.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_H263P_DEPAY_H__ +#define __GST_RTP_H263P_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_H263P_DEPAY \ + (gst_rtp_h263p_depay_get_type()) +#define GST_RTP_H263P_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263P_DEPAY,GstRtpH263PDepay)) +#define GST_RTP_H263P_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263P_DEPAY,GstRtpH263PDepayClass)) +#define GST_IS_RTP_H263P_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263P_DEPAY)) +#define GST_IS_RTP_H263P_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263P_DEPAY)) + +typedef struct _GstRtpH263PDepay GstRtpH263PDepay; +typedef struct _GstRtpH263PDepayClass GstRtpH263PDepayClass; + +struct _GstRtpH263PDepay +{ + GstBaseRTPDepayload depayload; + + GstAdapter *adapter; + gboolean wait_start; +}; + +struct _GstRtpH263PDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_h263p_depay_get_type (void); + +gboolean gst_rtp_h263p_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_H263P_DEPAY_H__ */ diff --git a/gst/rtp/gstrtph263ppay.c b/gst/rtp/gstrtph263ppay.c new file mode 100644 index 0000000..f85607e --- /dev/null +++ b/gst/rtp/gstrtph263ppay.c @@ -0,0 +1,753 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 +#include +#include + +#include + +#include "gstrtph263ppay.h" + +#define DEFAULT_FRAGMENTATION_MODE GST_FRAGMENTATION_MODE_NORMAL + +enum +{ + PROP_0, + PROP_FRAGMENTATION_MODE +}; + +#define GST_TYPE_FRAGMENTATION_MODE (gst_fragmentation_mode_get_type()) +static GType +gst_fragmentation_mode_get_type (void) +{ + static GType fragmentation_mode_type = 0; + static const GEnumValue fragmentation_mode[] = { + {GST_FRAGMENTATION_MODE_NORMAL, "Normal", "normal"}, + {GST_FRAGMENTATION_MODE_SYNC, "Fragment at sync points", "sync"}, + {0, NULL, NULL}, + }; + + if (!fragmentation_mode_type) { + fragmentation_mode_type = + g_enum_register_static ("GstFragmentationMode", fragmentation_mode); + } + return fragmentation_mode_type; +} + + +GST_DEBUG_CATEGORY_STATIC (rtph263ppay_debug); +#define GST_CAT_DEFAULT rtph263ppay_debug + +static GstStaticPadTemplate gst_rtp_h263p_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h263, " "variant = (string) \"itu\"") + ); + +/* + * We also return these in getcaps() as required by the SDP caps + * + * width = (int) [16, 4096] + * height = (int) [16, 4096] + * "annex-f = (boolean) {true, false}," + * "annex-i = (boolean) {true, false}," + * "annex-j = (boolean) {true, false}," + * "annex-l = (boolean) {true, false}," + * "annex-t = (boolean) {true, false}," + * "annex-v = (boolean) {true, false}") + */ + + +static GstStaticPadTemplate gst_rtp_h263p_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H263-1998\"; " + "application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H263-2000\"") + ); + +static void gst_rtp_h263p_pay_finalize (GObject * object); + +static void gst_rtp_h263p_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_h263p_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_rtp_h263p_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstCaps *gst_rtp_h263p_pay_sink_getcaps (GstBaseRTPPayload * payload, + GstPad * pad); +static GstFlowReturn gst_rtp_h263p_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpH263PPay, gst_rtp_h263p_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_h263p_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h263p_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h263p_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP H263 payloader", + "Codec/Payloader/Network/RTP", + "Payload-encodes H263/+/++ video in RTP packets (RFC 4629)", + "Wim Taymans "); +} + +static void +gst_rtp_h263p_pay_class_init (GstRtpH263PPayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_h263p_pay_finalize; + gobject_class->set_property = gst_rtp_h263p_pay_set_property; + gobject_class->get_property = gst_rtp_h263p_pay_get_property; + + gstbasertppayload_class->set_caps = gst_rtp_h263p_pay_setcaps; + gstbasertppayload_class->get_caps = gst_rtp_h263p_pay_sink_getcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_h263p_pay_handle_buffer; + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_FRAGMENTATION_MODE, g_param_spec_enum ("fragmentation-mode", + "Fragmentation Mode", + "Packet Fragmentation Mode", GST_TYPE_FRAGMENTATION_MODE, + DEFAULT_FRAGMENTATION_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (rtph263ppay_debug, "rtph263ppay", + 0, "rtph263ppay (RFC 4629)"); +} + +static void +gst_rtp_h263p_pay_init (GstRtpH263PPay * rtph263ppay, + GstRtpH263PPayClass * klass) +{ + rtph263ppay->adapter = gst_adapter_new (); + + rtph263ppay->fragmentation_mode = DEFAULT_FRAGMENTATION_MODE; +} + +static void +gst_rtp_h263p_pay_finalize (GObject * object) +{ + GstRtpH263PPay *rtph263ppay; + + rtph263ppay = GST_RTP_H263P_PAY (object); + + g_object_unref (rtph263ppay->adapter); + rtph263ppay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_h263p_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + GstCaps *peercaps; + gchar *encoding_name = NULL; + + g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE); + + peercaps = gst_pad_peer_get_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload)); + if (peercaps) { + GstCaps *intersect = gst_caps_intersect (peercaps, + gst_pad_get_pad_template_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload))); + + gst_caps_unref (peercaps); + if (!gst_caps_is_empty (intersect)) { + GstStructure *s = gst_caps_get_structure (intersect, 0); + encoding_name = g_strdup (gst_structure_get_string (s, "encoding-name")); + } + gst_caps_unref (intersect); + } + + if (!encoding_name) + encoding_name = g_strdup ("H263-1998"); + + gst_basertppayload_set_options (payload, "video", TRUE, + (gchar *) encoding_name, 90000); + res = gst_basertppayload_set_outcaps (payload, NULL); + g_free (encoding_name); + + return res; +} + +static void +caps_append (GstCaps * caps, GstStructure * in_s, guint x, guint y, guint mpi) +{ + GstStructure *s; + + if (!in_s) + return; + + if (mpi < 1 || mpi > 32) + return; + + s = gst_structure_copy (in_s); + + gst_structure_set (s, + "width", GST_TYPE_INT_RANGE, 1, x, + "height", GST_TYPE_INT_RANGE, 1, y, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 1001 * mpi, NULL); + + gst_caps_merge_structure (caps, s); +} + + +static GstCaps * +gst_rtp_h263p_pay_sink_getcaps (GstBaseRTPPayload * payload, GstPad * pad) +{ + GstRtpH263PPay *rtph263ppay; + GstCaps *caps = NULL; + GstCaps *peercaps = NULL; + GstCaps *intersect = NULL; + guint i; + + rtph263ppay = GST_RTP_H263P_PAY (payload); + + peercaps = gst_pad_peer_get_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload)); + if (!peercaps) + return + gst_caps_copy (gst_pad_get_pad_template_caps + (GST_BASE_RTP_PAYLOAD_SINKPAD (payload))); + + intersect = gst_caps_intersect (peercaps, + gst_pad_get_pad_template_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload))); + gst_caps_unref (peercaps); + + if (gst_caps_is_empty (intersect)) + return intersect; + + caps = gst_caps_new_empty (); + for (i = 0; i < gst_caps_get_size (intersect); i++) { + GstStructure *s = gst_caps_get_structure (intersect, i); + const gchar *encoding_name = gst_structure_get_string (s, "encoding-name"); + + if (!strcmp (encoding_name, "H263-2000")) { + const gchar *profile_str = gst_structure_get_string (s, "profile"); + const gchar *level_str = gst_structure_get_string (s, "level"); + int profile = 0; + int level = 0; + + if (profile_str && level_str) { + gboolean i = FALSE, j = FALSE, l = FALSE, t = FALSE, f = FALSE, + v = FALSE; + GstStructure *new_s = gst_structure_new ("video/x-h263", + "variant", G_TYPE_STRING, "itu", + NULL); + + profile = atoi (profile_str); + level = atoi (level_str); + + /* These profiles are defined in the H.263 Annex X */ + switch (profile) { + case 0: + /* The Baseline Profile (Profile 0) */ + break; + case 1: + /* H.320 Coding Efficiency Version 2 Backward-Compatibility Profile + * (Profile 1) + * Baseline + Annexes I, J, L.4 and T + */ + i = j = l = t = TRUE; + break; + case 2: + /* Version 1 Backward-Compatibility Profile (Profile 2) + * Baseline + Annex F + */ + i = j = l = t = f = TRUE; + break; + case 3: + /* Version 2 Interactive and Streaming Wireless Profile + * Baseline + Annexes I, J, T + */ + i = j = t = TRUE; + break; + case 4: + /* Version 3 Interactive and Streaming Wireless Profile (Profile 4) + * Baseline + Annexes I, J, T, V, W.6.3.8, + */ + /* Missing W.6.3.8 */ + i = j = t = v = TRUE; + break; + case 5: + /* Conversational High Compression Profile (Profile 5) + * Baseline + Annexes F, I, J, L.4, T, D, U + */ + /* Missing D, U */ + f = i = j = l = t = TRUE; + break; + case 6: + /* Conversational Internet Profile (Profile 6) + * Baseline + Annexes F, I, J, L.4, T, D, U and + * K with arbitratry slice ordering + */ + /* Missing D, U, K with arbitratry slice ordering */ + f = i = j = l = t = TRUE; + break; + case 7: + /* Conversational Interlace Profile (Profile 7) + * Baseline + Annexes F, I, J, L.4, T, D, U, W.6.3.11 + */ + /* Missing D, U, W.6.3.11 */ + f = i = j = l = t = TRUE; + break; + case 8: + /* High Latency Profile (Profile 8) + * Baseline + Annexes F, I, J, L.4, T, D, U, P.5, O.1.1 and + * K with arbitratry slice ordering + */ + /* Missing D, U, P.5, O.1.1 */ + f = i = j = l = t = TRUE; + break; + } + + + if (f || i || j || t || l || v) { + GValue list = { 0 }; + GValue vstr = { 0 }; + + g_value_init (&list, GST_TYPE_LIST); + g_value_init (&vstr, G_TYPE_STRING); + + g_value_set_static_string (&vstr, "h263"); + gst_value_list_append_value (&list, &vstr); + g_value_set_static_string (&vstr, "h263p"); + gst_value_list_append_value (&list, &vstr); + + if (l || v) { + g_value_set_static_string (&vstr, "h263pp"); + gst_value_list_append_value (&list, &vstr); + } + g_value_unset (&vstr); + + gst_structure_set_value (new_s, "h263version", &list); + g_value_unset (&list); + } else { + gst_structure_set (new_s, "h263version", G_TYPE_STRING, "h263", NULL); + } + + + if (!f) + gst_structure_set (new_s, "annex-f", G_TYPE_BOOLEAN, FALSE, NULL); + if (!i) + gst_structure_set (new_s, "annex-i", G_TYPE_BOOLEAN, FALSE, NULL); + if (!j) + gst_structure_set (new_s, "annex-j", G_TYPE_BOOLEAN, FALSE, NULL); + if (!t) + gst_structure_set (new_s, "annex-t", G_TYPE_BOOLEAN, FALSE, NULL); + if (!l) + gst_structure_set (new_s, "annex-l", G_TYPE_BOOLEAN, FALSE, NULL); + if (!v) + gst_structure_set (new_s, "annex-v", G_TYPE_BOOLEAN, FALSE, NULL); + + + if (level <= 10 || level == 45) { + gst_structure_set (new_s, + "width", GST_TYPE_INT_RANGE, 1, 176, + "height", GST_TYPE_INT_RANGE, 1, 144, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 2002, NULL); + gst_caps_merge_structure (caps, new_s); + } else if (level <= 20) { + GstStructure *s_copy = gst_structure_copy (new_s); + + gst_structure_set (new_s, + "width", GST_TYPE_INT_RANGE, 1, 352, + "height", GST_TYPE_INT_RANGE, 1, 288, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 2002, NULL); + gst_caps_merge_structure (caps, new_s); + + gst_structure_set (s_copy, + "width", GST_TYPE_INT_RANGE, 1, 176, + "height", GST_TYPE_INT_RANGE, 1, 144, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 1001, NULL); + gst_caps_merge_structure (caps, s_copy); + } else if (level <= 40) { + + gst_structure_set (new_s, + "width", GST_TYPE_INT_RANGE, 1, 352, + "height", GST_TYPE_INT_RANGE, 1, 288, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 1001, NULL); + gst_caps_merge_structure (caps, new_s); + } else if (level <= 50) { + GstStructure *s_copy = gst_structure_copy (new_s); + + gst_structure_set (new_s, + "width", GST_TYPE_INT_RANGE, 1, 352, + "height", GST_TYPE_INT_RANGE, 1, 288, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 50, 1, NULL); + gst_caps_merge_structure (caps, new_s); + + gst_structure_set (s_copy, + "width", GST_TYPE_INT_RANGE, 1, 352, + "height", GST_TYPE_INT_RANGE, 1, 240, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 60000, 1001, NULL); + gst_caps_merge_structure (caps, s_copy); + } else if (level <= 60) { + GstStructure *s_copy = gst_structure_copy (new_s); + + gst_structure_set (new_s, + "width", GST_TYPE_INT_RANGE, 1, 720, + "height", GST_TYPE_INT_RANGE, 1, 288, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 50, 1, NULL); + gst_caps_merge_structure (caps, new_s); + + gst_structure_set (s_copy, + "width", GST_TYPE_INT_RANGE, 1, 720, + "height", GST_TYPE_INT_RANGE, 1, 240, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 60000, 1001, NULL); + gst_caps_merge_structure (caps, s_copy); + } else if (level <= 70) { + GstStructure *s_copy = gst_structure_copy (new_s); + + gst_structure_set (new_s, + "width", GST_TYPE_INT_RANGE, 1, 720, + "height", GST_TYPE_INT_RANGE, 1, 576, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 50, 1, NULL); + gst_caps_merge_structure (caps, new_s); + + gst_structure_set (s_copy, + "width", GST_TYPE_INT_RANGE, 1, 720, + "height", GST_TYPE_INT_RANGE, 1, 480, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 60000, 1001, NULL); + gst_caps_merge_structure (caps, s_copy); + } else { + gst_caps_merge_structure (caps, new_s); + } + + } else { + GstStructure *new_s = gst_structure_new ("video/x-h263", + "variant", G_TYPE_STRING, "itu", + "h263version", G_TYPE_STRING, "h263", + NULL); + + GST_DEBUG_OBJECT (rtph263ppay, "No profile or level specified" + " for H263-2000, defaulting to baseline H263"); + + gst_caps_merge_structure (caps, new_s); + } + } else { + gboolean f = FALSE, i = FALSE, j = FALSE, t = FALSE; + /* FIXME: ffmpeg support the Appendix K too, how do we express it ? + * guint k; + */ + const gchar *str; + GstStructure *new_s = gst_structure_new ("video/x-h263", + "variant", G_TYPE_STRING, "itu", + NULL); + gboolean added = FALSE; + + str = gst_structure_get_string (s, "f"); + if (str && !strcmp (str, "1")) + f = TRUE; + + str = gst_structure_get_string (s, "i"); + if (str && !strcmp (str, "1")) + i = TRUE; + + str = gst_structure_get_string (s, "j"); + if (str && !strcmp (str, "1")) + j = TRUE; + + str = gst_structure_get_string (s, "t"); + if (str && !strcmp (str, "1")) + t = TRUE; + + if (f || i || j || t) { + GValue list = { 0 }; + GValue vstr = { 0 }; + + g_value_init (&list, GST_TYPE_LIST); + g_value_init (&vstr, G_TYPE_STRING); + + g_value_set_static_string (&vstr, "h263"); + gst_value_list_append_value (&list, &vstr); + g_value_set_static_string (&vstr, "h263p"); + gst_value_list_append_value (&list, &vstr); + g_value_unset (&vstr); + + gst_structure_set_value (new_s, "h263version", &list); + g_value_unset (&list); + } else { + gst_structure_set (new_s, "h263version", G_TYPE_STRING, "h263", NULL); + } + + if (!f) + gst_structure_set (new_s, "annex-f", G_TYPE_BOOLEAN, FALSE, NULL); + if (!i) + gst_structure_set (new_s, "annex-i", G_TYPE_BOOLEAN, FALSE, NULL); + if (!j) + gst_structure_set (new_s, "annex-j", G_TYPE_BOOLEAN, FALSE, NULL); + if (!t) + gst_structure_set (new_s, "annex-t", G_TYPE_BOOLEAN, FALSE, NULL); + + + str = gst_structure_get_string (s, "custom"); + if (str) { + unsigned int xmax, ymax, mpi; + if (sscanf (str, "%u,%u,%u", &xmax, &ymax, &mpi) == 3) { + if (xmax % 4 && ymax % 4 && mpi >= 1 && mpi <= 32) { + caps_append (caps, new_s, xmax, ymax, mpi); + added = TRUE; + } else { + GST_WARNING_OBJECT (rtph263ppay, "Invalid custom framesize/MPI" + " %u x %u at %u, ignoring", xmax, ymax, mpi); + } + } else { + GST_WARNING_OBJECT (rtph263ppay, "Invalid custom framesize/MPI: %s," + " ignoring", str); + } + } + + str = gst_structure_get_string (s, "16cif"); + if (str) { + int mpi = atoi (str); + caps_append (caps, new_s, 1408, 1152, mpi); + added = TRUE; + } + + str = gst_structure_get_string (s, "4cif"); + if (str) { + int mpi = atoi (str); + caps_append (caps, new_s, 704, 576, mpi); + added = TRUE; + } + + str = gst_structure_get_string (s, "cif"); + if (str) { + int mpi = atoi (str); + caps_append (caps, new_s, 352, 288, mpi); + added = TRUE; + } + + str = gst_structure_get_string (s, "qcif"); + if (str) { + int mpi = atoi (str); + caps_append (caps, new_s, 176, 144, mpi); + added = TRUE; + } + + str = gst_structure_get_string (s, "sqcif"); + if (str) { + int mpi = atoi (str); + caps_append (caps, new_s, 128, 96, mpi); + added = TRUE; + } + + if (added) + gst_structure_free (new_s); + else + gst_caps_merge_structure (caps, new_s); + } + } + + gst_caps_unref (intersect); + + return caps; +} + + +static void +gst_rtp_h263p_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpH263PPay *rtph263ppay; + + rtph263ppay = GST_RTP_H263P_PAY (object); + + switch (prop_id) { + case PROP_FRAGMENTATION_MODE: + rtph263ppay->fragmentation_mode = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_h263p_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpH263PPay *rtph263ppay; + + rtph263ppay = GST_RTP_H263P_PAY (object); + + switch (prop_id) { + case PROP_FRAGMENTATION_MODE: + g_value_set_enum (value, rtph263ppay->fragmentation_mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstFlowReturn +gst_rtp_h263p_pay_flush (GstRtpH263PPay * rtph263ppay) +{ + guint avail; + GstBuffer *outbuf; + GstFlowReturn ret; + gboolean fragmented; + + avail = gst_adapter_available (rtph263ppay->adapter); + if (avail == 0) + return GST_FLOW_OK; + + fragmented = FALSE; + /* This algorithm assumes the H263/+/++ encoder sends complete frames in each + * buffer */ + /* With Fragmentation Mode at GST_FRAGMENTATION_MODE_NORMAL: + * This algorithm implements the Follow-on packets method for packetization. + * This assumes low packet loss network. + * With Fragmentation Mode at GST_FRAGMENTATION_MODE_SYNC: + * This algorithm separates large frames at synchronisation points (Segments) + * (See RFC 4629 section 6). It would be interesting to have a property such as network + * quality to select between both packetization methods */ + /* TODO Add VRC supprt (See RFC 4629 section 5.2) */ + + while (avail > 0) { + guint towrite; + guint8 *payload; + guint payload_len; + gint header_len; + guint next_gop = 0; + gboolean found_gob = FALSE; + + if (rtph263ppay->fragmentation_mode == GST_FRAGMENTATION_MODE_SYNC) { + /* start after 1st gop possible */ + guint parsed_len = 3; + const guint8 *parse_data = NULL; + + parse_data = gst_adapter_peek (rtph263ppay->adapter, avail); + + /* Check if we have a gob or eos , eossbs */ + /* FIXME EOS and EOSSBS packets should never contain any gobs and vice-versa */ + if (avail >= 3 && *parse_data == 0 && *(parse_data + 1) == 0 + && *(parse_data + 2) >= 0x80) { + GST_DEBUG_OBJECT (rtph263ppay, " Found GOB header"); + found_gob = TRUE; + } + /* Find next and cut the packet accordingly */ + /* TODO we should get as many gobs as possible until MTU is reached, this + * code seems to just get one GOB per packet */ + while (parsed_len + 2 < avail) { + if (parse_data[parsed_len] == 0 && parse_data[parsed_len + 1] == 0 + && parse_data[parsed_len + 2] >= 0x80) { + next_gop = parsed_len; + GST_DEBUG_OBJECT (rtph263ppay, " Next GOB Detected at : %d", + next_gop); + break; + } + parsed_len++; + } + } + + /* for picture start frames (non-fragmented), we need to remove the first + * two 0x00 bytes and set P=1 */ + header_len = (fragmented && !found_gob) ? 2 : 0; + + towrite = MIN (avail, gst_rtp_buffer_calc_payload_len + (GST_BASE_RTP_PAYLOAD_MTU (rtph263ppay) - header_len, 0, 0)); + + if (next_gop > 0) + towrite = MIN (next_gop, towrite); + + payload_len = header_len + towrite; + + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + /* last fragment gets the marker bit set */ + gst_rtp_buffer_set_marker (outbuf, avail > towrite ? 0 : 1); + + payload = gst_rtp_buffer_get_payload (outbuf); + + gst_adapter_copy (rtph263ppay->adapter, &payload[header_len], 0, towrite); + + /* 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | RR |P|V| PLEN |PEBIT| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + /* if fragmented or gop header , write p bit =1 */ + payload[0] = (fragmented && !found_gob) ? 0x00 : 0x04; + payload[1] = 0; + + GST_BUFFER_TIMESTAMP (outbuf) = rtph263ppay->first_timestamp; + GST_BUFFER_DURATION (outbuf) = rtph263ppay->first_duration; + + gst_adapter_flush (rtph263ppay->adapter, towrite); + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtph263ppay), outbuf); + + avail -= towrite; + fragmented = TRUE; + } + + return ret; +} + +static GstFlowReturn +gst_rtp_h263p_pay_handle_buffer (GstBaseRTPPayload * payload, + GstBuffer * buffer) +{ + GstRtpH263PPay *rtph263ppay; + GstFlowReturn ret; + + rtph263ppay = GST_RTP_H263P_PAY (payload); + + rtph263ppay->first_timestamp = GST_BUFFER_TIMESTAMP (buffer); + rtph263ppay->first_duration = GST_BUFFER_DURATION (buffer); + + /* we always encode and flush a full picture */ + gst_adapter_push (rtph263ppay->adapter, buffer); + ret = gst_rtp_h263p_pay_flush (rtph263ppay); + + return ret; +} + +gboolean +gst_rtp_h263p_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtph263ppay", + GST_RANK_SECONDARY, GST_TYPE_RTP_H263P_PAY); +} diff --git a/gst/rtp/gstrtph263ppay.h b/gst/rtp/gstrtph263ppay.h new file mode 100644 index 0000000..b01fb84 --- /dev/null +++ b/gst/rtp/gstrtph263ppay.h @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_H263P_PAY_H__ +#define __GST_RTP_H263P_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_H263P_PAY \ + (gst_rtp_h263p_pay_get_type()) +#define GST_RTP_H263P_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263P_PAY,GstRtpH263PPay)) +#define GST_RTP_H263P_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263P_PAY,GstRtpH263PPayClass)) +#define GST_IS_RTP_H263P_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263P_PAY)) +#define GST_IS_RTP_H263P_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263P_PAY)) + +typedef struct _GstRtpH263PPay GstRtpH263PPay; +typedef struct _GstRtpH263PPayClass GstRtpH263PPayClass; + +typedef enum +{ + GST_FRAGMENTATION_MODE_NORMAL = 0, + GST_FRAGMENTATION_MODE_SYNC = 1 +} GstFragmentationMode; + +struct _GstRtpH263PPay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime first_timestamp; + GstClockTime first_duration; + GstFragmentationMode fragmentation_mode; +}; + +struct _GstRtpH263PPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_h263p_pay_get_type (void); + +gboolean gst_rtp_h263p_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_H263P_PAY_H__ */ diff --git a/gst/rtp/gstrtph264depay.c b/gst/rtp/gstrtph264depay.c new file mode 100644 index 0000000..efe1725 --- /dev/null +++ b/gst/rtp/gstrtph264depay.c @@ -0,0 +1,967 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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 +#include + +#include +#include "gstrtph264depay.h" + +GST_DEBUG_CATEGORY_STATIC (rtph264depay_debug); +#define GST_CAT_DEFAULT (rtph264depay_debug) + +#define DEFAULT_BYTE_STREAM TRUE +#define DEFAULT_ACCESS_UNIT FALSE + +enum +{ + PROP_0, + PROP_BYTE_STREAM, + PROP_ACCESS_UNIT, + PROP_LAST +}; + + +/* 3 zero bytes syncword */ +static const guint8 sync_bytes[] = { 0, 0, 0, 1 }; + +static GstStaticPadTemplate gst_rtp_h264_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h264") + ); + +static GstStaticPadTemplate gst_rtp_h264_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H264\"") + /** optional parameters **/ + /* "profile-level-id = (string) ANY, " */ + /* "max-mbps = (string) ANY, " */ + /* "max-fs = (string) ANY, " */ + /* "max-cpb = (string) ANY, " */ + /* "max-dpb = (string) ANY, " */ + /* "max-br = (string) ANY, " */ + /* "redundant-pic-cap = (string) { \"0\", \"1\" }, " */ + /* "sprop-parameter-sets = (string) ANY, " */ + /* "parameter-add = (string) { \"0\", \"1\" }, " */ + /* "packetization-mode = (string) { \"0\", \"1\", \"2\" }, " */ + /* "sprop-interleaving-depth = (string) ANY, " */ + /* "sprop-deint-buf-req = (string) ANY, " */ + /* "deint-buf-cap = (string) ANY, " */ + /* "sprop-init-buf-time = (string) ANY, " */ + /* "sprop-max-don-diff = (string) ANY, " */ + /* "max-rcmd-nalu-size = (string) ANY " */ + ); + +GST_BOILERPLATE (GstRtpH264Depay, gst_rtp_h264_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_h264_depay_finalize (GObject * object); +static void gst_rtp_h264_depay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_h264_depay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstStateChangeReturn gst_rtp_h264_depay_change_state (GstElement * + element, GstStateChange transition); + +static GstBuffer *gst_rtp_h264_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * filter, + GstCaps * caps); +static gboolean gst_rtp_h264_depay_handle_event (GstBaseRTPDepayload * depay, + GstEvent * event); + +static void +gst_rtp_h264_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h264_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h264_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP H264 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts H264 video from RTP packets (RFC 3984)", + "Wim Taymans "); +} + +static void +gst_rtp_h264_depay_class_init (GstRtpH264DepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_h264_depay_finalize; + + gobject_class->set_property = gst_rtp_h264_depay_set_property; + gobject_class->get_property = gst_rtp_h264_depay_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BYTE_STREAM, + g_param_spec_boolean ("byte-stream", "Byte Stream", + "Generate byte stream format of NALU (deprecated; use caps)", + DEFAULT_BYTE_STREAM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ACCESS_UNIT, + g_param_spec_boolean ("access-unit", "Access Unit", + "Merge NALU into AU (picture) (deprecated; use caps)", + DEFAULT_ACCESS_UNIT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = gst_rtp_h264_depay_change_state; + + gstbasertpdepayload_class->process = gst_rtp_h264_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_h264_depay_setcaps; + gstbasertpdepayload_class->handle_event = gst_rtp_h264_depay_handle_event; + + GST_DEBUG_CATEGORY_INIT (rtph264depay_debug, "rtph264depay", 0, + "H264 Video RTP Depayloader"); +} + +static void +gst_rtp_h264_depay_init (GstRtpH264Depay * rtph264depay, + GstRtpH264DepayClass * klass) +{ + rtph264depay->adapter = gst_adapter_new (); + rtph264depay->picture_adapter = gst_adapter_new (); + rtph264depay->byte_stream = DEFAULT_BYTE_STREAM; + rtph264depay->merge = DEFAULT_ACCESS_UNIT; +} + +static void +gst_rtp_h264_depay_reset (GstRtpH264Depay * rtph264depay) +{ + gst_adapter_clear (rtph264depay->adapter); + rtph264depay->wait_start = TRUE; + gst_adapter_clear (rtph264depay->picture_adapter); + rtph264depay->picture_start = FALSE; + rtph264depay->last_keyframe = FALSE; + rtph264depay->last_ts = 0; + rtph264depay->current_fu_type = 0; +} + +static void +gst_rtp_h264_depay_finalize (GObject * object) +{ + GstRtpH264Depay *rtph264depay; + + rtph264depay = GST_RTP_H264_DEPAY (object); + + if (rtph264depay->codec_data) + gst_buffer_unref (rtph264depay->codec_data); + + g_object_unref (rtph264depay->adapter); + g_object_unref (rtph264depay->picture_adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_rtp_h264_depay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpH264Depay *rtph264depay; + + rtph264depay = GST_RTP_H264_DEPAY (object); + + switch (prop_id) { + case PROP_BYTE_STREAM: + rtph264depay->byte_stream = g_value_get_boolean (value); + break; + case PROP_ACCESS_UNIT: + rtph264depay->merge = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_h264_depay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpH264Depay *rtph264depay; + + rtph264depay = GST_RTP_H264_DEPAY (object); + + switch (prop_id) { + case PROP_BYTE_STREAM: + g_value_set_boolean (value, rtph264depay->byte_stream); + break; + case PROP_ACCESS_UNIT: + g_value_set_boolean (value, rtph264depay->merge); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_h264_depay_negotiate (GstRtpH264Depay * rtph264depay) +{ + GstCaps *caps; + gint byte_stream = -1; + gint merge = -1; + + caps = + gst_pad_get_allowed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (rtph264depay)); + + GST_DEBUG_OBJECT (rtph264depay, "allowed caps: %" GST_PTR_FORMAT, caps); + + if (caps) { + if (gst_caps_get_size (caps) > 0) { + GstStructure *s = gst_caps_get_structure (caps, 0); + const gchar *str = NULL; + + if ((str = gst_structure_get_string (s, "stream-format"))) { + if (strcmp (str, "avc") == 0) { + byte_stream = FALSE; + } else if (strcmp (str, "byte-stream") == 0) { + byte_stream = TRUE; + } else { + GST_DEBUG_OBJECT (rtph264depay, "unknown stream-format: %s", str); + } + } + + if ((str = gst_structure_get_string (s, "alignment"))) { + if (strcmp (str, "au") == 0) { + merge = TRUE; + } else if (strcmp (str, "nal") == 0) { + merge = FALSE; + } else { + GST_DEBUG_OBJECT (rtph264depay, "unknown alignment: %s", str); + } + } + } + gst_caps_unref (caps); + } + + if (byte_stream >= 0) { + GST_DEBUG_OBJECT (rtph264depay, "downstream requires byte-stream %d", + byte_stream); + if (rtph264depay->byte_stream != byte_stream) { + GST_WARNING_OBJECT (rtph264depay, + "overriding property setting based on caps"); + rtph264depay->byte_stream = byte_stream; + } + } + if (merge >= 0) { + GST_DEBUG_OBJECT (rtph264depay, "downstream requires merge %d", merge); + if (rtph264depay->merge != merge) { + GST_WARNING_OBJECT (rtph264depay, + "overriding property setting based on caps"); + rtph264depay->merge = merge; + } + } +} + +static gboolean +gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + gint clock_rate; + GstStructure *structure = gst_caps_get_structure (caps, 0); + GstRtpH264Depay *rtph264depay; + const gchar *ps, *profile; + GstBuffer *codec_data; + guint8 *b64; + gboolean res; + + rtph264depay = GST_RTP_H264_DEPAY (depayload); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("video/x-h264", NULL); + + /* Base64 encoded, comma separated config NALs */ + ps = gst_structure_get_string (structure, "sprop-parameter-sets"); + /* hex: AVCProfileIndication:8 | profile_compat:8 | AVCLevelIndication:8 */ + profile = gst_structure_get_string (structure, "profile-level-id"); + + /* negotiate with downstream w.r.t. output format and alignment */ + gst_rtp_h264_depay_negotiate (rtph264depay); + + if (rtph264depay->byte_stream && ps != NULL) { + /* for bytestream we only need the parameter sets but we don't error out + * when they are not there, we assume they are in the stream. */ + gchar **params; + guint len, total; + gint i; + + params = g_strsplit (ps, ",", 0); + + /* count total number of bytes in base64. Also include the sync bytes in + * front of the params. */ + len = 0; + for (i = 0; params[i]; i++) { + len += strlen (params[i]); + len += sizeof (sync_bytes); + } + /* we seriously overshoot the length, but it's fine. */ + codec_data = gst_buffer_new_and_alloc (len); + b64 = GST_BUFFER_DATA (codec_data); + total = 0; + for (i = 0; params[i]; i++) { + guint save = 0; + gint state = 0; + + GST_DEBUG_OBJECT (depayload, "decoding param %d (%s)", i, params[i]); + memcpy (b64, sync_bytes, sizeof (sync_bytes)); + b64 += sizeof (sync_bytes); + len = + g_base64_decode_step (params[i], strlen (params[i]), b64, &state, + &save); + GST_DEBUG_OBJECT (depayload, "decoded %d bytes", len); + total += len + sizeof (sync_bytes); + b64 += len; + } + GST_BUFFER_SIZE (codec_data) = total; + g_strfreev (params); + + /* keep the codec_data, we need to send it as the first buffer. We cannot + * push it in the adapter because the adapter might be flushed on discont. + */ + if (rtph264depay->codec_data) + gst_buffer_unref (rtph264depay->codec_data); + rtph264depay->codec_data = codec_data; + } else if (!rtph264depay->byte_stream) { + gchar **params; + guint8 **sps, **pps; + guint len, num_sps, num_pps; + gint i; + guint8 *data; + + if (ps == NULL) + goto incomplete_caps; + + params = g_strsplit (ps, ",", 0); + len = g_strv_length (params); + + GST_DEBUG_OBJECT (depayload, "we have %d params", len); + + sps = g_new0 (guint8 *, len + 1); + pps = g_new0 (guint8 *, len + 1); + num_sps = num_pps = 0; + + /* start with 7 bytes header */ + len = 7; + for (i = 0; params[i]; i++) { + gsize nal_len; + guint8 *nalp; + guint save = 0; + gint state = 0; + + nal_len = strlen (params[i]); + nalp = g_malloc (nal_len + 2); + + nal_len = + g_base64_decode_step (params[i], nal_len, nalp + 2, &state, &save); + nalp[0] = (nal_len >> 8) & 0xff; + nalp[1] = nal_len & 0xff; + len += nal_len + 2; + + /* copy to the right list */ + if ((nalp[2] & 0x1f) == 7) { + GST_DEBUG_OBJECT (depayload, "adding param %d as SPS %d", i, num_sps); + sps[num_sps++] = nalp; + } else { + GST_DEBUG_OBJECT (depayload, "adding param %d as PPS %d", i, num_pps); + pps[num_pps++] = nalp; + } + } + g_strfreev (params); + + if (num_sps == 0 || (GST_READ_UINT16_BE (sps[0]) < 3) || num_pps == 0) { + g_strfreev ((gchar **) pps); + g_strfreev ((gchar **) sps); + goto incomplete_caps; + } + + codec_data = gst_buffer_new_and_alloc (len); + data = GST_BUFFER_DATA (codec_data); + + /* 8 bits version == 1 */ + *data++ = 1; + if (profile) { + guint32 profile_id; + + /* hex: AVCProfileIndication:8 | profile_compat:8 | AVCLevelIndication:8 */ + sscanf (profile, "%6x", &profile_id); + *data++ = (profile_id >> 16) & 0xff; + *data++ = (profile_id >> 8) & 0xff; + *data++ = profile_id & 0xff; + } else { + /* extract from SPS */ + *data++ = sps[0][3]; + *data++ = sps[0][4]; + *data++ = sps[0][5]; + } + /* 6 bits reserved | 2 bits lengthSizeMinusOn */ + *data++ = 0xff; + /* 3 bits reserved | 5 bits numOfSequenceParameterSets */ + *data++ = 0xe0 | (num_sps & 0x1f); + + /* copy all SPS */ + for (i = 0; sps[i]; i++) { + len = ((sps[i][0] << 8) | sps[i][1]) + 2; + GST_DEBUG_OBJECT (depayload, "copy SPS %d of length %d", i, len); + memcpy (data, sps[i], len); + g_free (sps[i]); + data += len; + } + g_free (sps); + /* 8 bits numOfPictureParameterSets */ + *data++ = num_pps; + /* copy all PPS */ + for (i = 0; pps[i]; i++) { + len = ((pps[i][0] << 8) | pps[i][1]) + 2; + GST_DEBUG_OBJECT (depayload, "copy PPS %d of length %d", i, len); + memcpy (data, pps[i], len); + g_free (pps[i]); + data += len; + } + g_free (pps); + GST_BUFFER_SIZE (codec_data) = data - GST_BUFFER_DATA (codec_data); + + gst_caps_set_simple (srccaps, + "codec_data", GST_TYPE_BUFFER, codec_data, NULL); + gst_buffer_unref (codec_data); + } + + gst_caps_set_simple (srccaps, "stream-format", G_TYPE_STRING, + rtph264depay->byte_stream ? "byte-stream" : "avc", + "alignment", G_TYPE_STRING, rtph264depay->merge ? "au" : "nal", NULL); + + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return res; + + /* ERRORS */ +incomplete_caps: + { + GST_DEBUG_OBJECT (depayload, "we have incomplete caps"); + gst_caps_unref (srccaps); + return FALSE; + } +} + +static GstBuffer * +gst_rtp_h264_complete_au (GstRtpH264Depay * rtph264depay, + GstClockTime * out_timestamp, gboolean * out_keyframe) +{ + guint outsize; + GstBuffer *outbuf; + + /* we had a picture in the adapter and we completed it */ + GST_DEBUG_OBJECT (rtph264depay, "taking completed AU"); + outsize = gst_adapter_available (rtph264depay->picture_adapter); + outbuf = gst_adapter_take_buffer (rtph264depay->picture_adapter, outsize); + + *out_timestamp = rtph264depay->last_ts; + *out_keyframe = rtph264depay->last_keyframe; + + rtph264depay->last_keyframe = FALSE; + rtph264depay->picture_start = FALSE; + + return outbuf; +} + +/* SPS/PPS/IDR considered key, all others DELTA; + * so downstream waiting for keyframe can pick up at SPS/PPS/IDR */ +#define NAL_TYPE_IS_KEY(nt) (((nt) == 5) || ((nt) == 7) || ((nt) == 8)) + +static GstBuffer * +gst_rtp_h264_depay_handle_nal (GstRtpH264Depay * rtph264depay, GstBuffer * nal, + GstClockTime in_timestamp, gboolean marker) +{ + GstBaseRTPDepayload *depayload = GST_BASE_RTP_DEPAYLOAD (rtph264depay); + gint nal_type; + guint size; + guint8 *data; + GstBuffer *outbuf = NULL; + GstClockTime out_timestamp; + gboolean keyframe, out_keyframe; + + size = GST_BUFFER_SIZE (nal); + if (G_UNLIKELY (size < 5)) + goto short_nal; + + data = GST_BUFFER_DATA (nal); + + nal_type = data[4] & 0x1f; + GST_DEBUG_OBJECT (rtph264depay, "handle NAL type %d", nal_type); + + keyframe = NAL_TYPE_IS_KEY (nal_type); + + out_keyframe = keyframe; + out_timestamp = in_timestamp; + + if (rtph264depay->merge) { + gboolean start = FALSE, complete = FALSE; + + /* consider a coded slices (IDR or not) to start a picture, + * (so ending the previous one) if first_mb_in_slice == 0 + * (non-0 is part of previous one) */ + /* NOTE this is not entirely according to Access Unit specs in 7.4.1.2.4, + * but in practice it works in sane cases, needs not much parsing, + * and also works with broken frame_num in NAL (where spec-wise would fail) */ + if (nal_type == 1 || nal_type == 2 || nal_type == 5) { + /* we have a picture start */ + start = TRUE; + if (data[5] & 0x80) { + /* first_mb_in_slice == 0 completes a picture */ + complete = TRUE; + } + } else if (nal_type >= 6 && nal_type <= 9) { + /* SEI, SPS, PPS, AU terminate picture */ + complete = TRUE; + } + GST_DEBUG_OBJECT (depayload, "start %d, complete %d", start, complete); + + if (complete && rtph264depay->picture_start) + outbuf = gst_rtp_h264_complete_au (rtph264depay, &out_timestamp, + &out_keyframe); + + /* add to adapter */ + GST_DEBUG_OBJECT (depayload, "adding NAL to picture adapter"); + gst_adapter_push (rtph264depay->picture_adapter, nal); + rtph264depay->last_ts = in_timestamp; + rtph264depay->last_keyframe |= keyframe; + rtph264depay->picture_start |= start; + + if (marker) + outbuf = gst_rtp_h264_complete_au (rtph264depay, &out_timestamp, + &out_keyframe); + } else { + /* no merge, output is input nal */ + GST_DEBUG_OBJECT (depayload, "using NAL as output"); + outbuf = nal; + } + + if (outbuf) { + /* prepend codec_data */ + if (rtph264depay->codec_data) { + GST_DEBUG_OBJECT (depayload, "prepending codec_data"); + outbuf = gst_buffer_join (rtph264depay->codec_data, outbuf); + rtph264depay->codec_data = NULL; + out_keyframe = TRUE; + } + outbuf = gst_buffer_make_metadata_writable (outbuf); + + GST_BUFFER_TIMESTAMP (outbuf) = out_timestamp; + + if (out_keyframe) + GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + else + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); + } + + return outbuf; + + /* ERRORS */ +short_nal: + { + GST_WARNING_OBJECT (depayload, "dropping short NAL"); + gst_buffer_unref (nal); + return NULL; + } +} + +static GstBuffer * +gst_rtp_h264_push_fragmentation_unit (GstRtpH264Depay * rtph264depay, + gboolean send) +{ + guint outsize; + guint8 *outdata; + GstBuffer *outbuf; + + outsize = gst_adapter_available (rtph264depay->adapter); + outbuf = gst_adapter_take_buffer (rtph264depay->adapter, outsize); + outdata = GST_BUFFER_DATA (outbuf); + + GST_DEBUG_OBJECT (rtph264depay, "output %d bytes", outsize); + + if (rtph264depay->byte_stream) { + memcpy (outdata, sync_bytes, sizeof (sync_bytes)); + } else { + outsize -= 4; + outdata[0] = (outsize >> 24); + outdata[1] = (outsize >> 16); + outdata[2] = (outsize >> 8); + outdata[3] = (outsize); + } + + rtph264depay->current_fu_type = 0; + + if (send) { + outbuf = gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, + rtph264depay->fu_timestamp, rtph264depay->fu_marker); + if (outbuf) + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtph264depay), + outbuf); + return NULL; + } else { + return gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, + rtph264depay->fu_timestamp, rtph264depay->fu_marker); + } +} + +static GstBuffer * +gst_rtp_h264_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpH264Depay *rtph264depay; + GstBuffer *outbuf = NULL; + guint8 nal_unit_type; + + rtph264depay = GST_RTP_H264_DEPAY (depayload); + + /* flush remaining data on discont */ + if (GST_BUFFER_IS_DISCONT (buf)) { + gst_adapter_clear (rtph264depay->adapter); + rtph264depay->wait_start = TRUE; + rtph264depay->current_fu_type = 0; + } + + { + gint payload_len; + guint8 *payload; + guint header_len; + guint8 nal_ref_idc; + guint8 *outdata; + guint outsize, nalu_size; + GstClockTime timestamp; + gboolean marker; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + payload = gst_rtp_buffer_get_payload (buf); + marker = gst_rtp_buffer_get_marker (buf); + + GST_DEBUG_OBJECT (rtph264depay, "receiving %d bytes", payload_len); + + if (payload_len == 0) + return NULL; + + /* +---------------+ + * |0|1|2|3|4|5|6|7| + * +-+-+-+-+-+-+-+-+ + * |F|NRI| Type | + * +---------------+ + * + * F must be 0. + */ + nal_ref_idc = (payload[0] & 0x60) >> 5; + nal_unit_type = payload[0] & 0x1f; + + /* at least one byte header with type */ + header_len = 1; + + GST_DEBUG_OBJECT (rtph264depay, "NRI %d, Type %d", nal_ref_idc, + nal_unit_type); + + /* If FU unit was being processed, but the current nal is of a different + * type. Assume that the remote payloader is buggy (didn't set the end bit + * when the FU ended) and send out what we gathered thusfar */ + if (G_UNLIKELY (rtph264depay->current_fu_type != 0 && + nal_unit_type != rtph264depay->current_fu_type)) + gst_rtp_h264_push_fragmentation_unit (rtph264depay, TRUE); + + switch (nal_unit_type) { + case 0: + case 30: + case 31: + /* undefined */ + goto undefined_type; + case 25: + /* STAP-B Single-time aggregation packet 5.7.1 */ + /* 2 byte extra header for DON */ + header_len += 2; + /* fallthrough */ + case 24: + { + /* strip headers */ + payload += header_len; + payload_len -= header_len; + + rtph264depay->wait_start = FALSE; + + + /* STAP-A Single-time aggregation packet 5.7.1 */ + while (payload_len > 2) { + /* 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | NALU Size | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + nalu_size = (payload[0] << 8) | payload[1]; + + /* dont include nalu_size */ + if (nalu_size > (payload_len - 2)) + nalu_size = payload_len - 2; + + outsize = nalu_size + sizeof (sync_bytes); + outbuf = gst_buffer_new_and_alloc (outsize); + outdata = GST_BUFFER_DATA (outbuf); + if (rtph264depay->byte_stream) { + memcpy (outdata, sync_bytes, sizeof (sync_bytes)); + } else { + outdata[0] = outdata[1] = 0; + outdata[2] = payload[0]; + outdata[3] = payload[1]; + } + + /* strip NALU size */ + payload += 2; + payload_len -= 2; + + outdata += sizeof (sync_bytes); + memcpy (outdata, payload, nalu_size); + + gst_adapter_push (rtph264depay->adapter, outbuf); + + payload += nalu_size; + payload_len -= nalu_size; + } + + outsize = gst_adapter_available (rtph264depay->adapter); + outbuf = gst_adapter_take_buffer (rtph264depay->adapter, outsize); + + outbuf = gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, timestamp, + marker); + break; + } + case 26: + /* MTAP16 Multi-time aggregation packet 5.7.2 */ + header_len = 5; + /* fallthrough, not implemented */ + case 27: + /* MTAP24 Multi-time aggregation packet 5.7.2 */ + header_len = 6; + goto not_implemented; + break; + case 28: + case 29: + { + /* FU-A Fragmentation unit 5.8 */ + /* FU-B Fragmentation unit 5.8 */ + gboolean S, E; + + /* +---------------+ + * |0|1|2|3|4|5|6|7| + * +-+-+-+-+-+-+-+-+ + * |S|E|R| Type | + * +---------------+ + * + * R is reserved and always 0 + */ + S = (payload[1] & 0x80) == 0x80; + E = (payload[1] & 0x40) == 0x40; + + GST_DEBUG_OBJECT (rtph264depay, "S %d, E %d", S, E); + + if (rtph264depay->wait_start && !S) + goto waiting_start; + + if (S) { + /* NAL unit starts here */ + guint8 nal_header; + + /* If a new FU unit started, while still processing an older one. + * Assume that the remote payloader is buggy (doesn't set the end + * bit) and send out what we've gathered thusfar */ + if (G_UNLIKELY (rtph264depay->current_fu_type != 0)) + gst_rtp_h264_push_fragmentation_unit (rtph264depay, TRUE); + + rtph264depay->current_fu_type = nal_unit_type; + rtph264depay->fu_timestamp = timestamp; + + rtph264depay->wait_start = FALSE; + + /* reconstruct NAL header */ + nal_header = (payload[0] & 0xe0) | (payload[1] & 0x1f); + + /* strip type header, keep FU header, we'll reuse it to reconstruct + * the NAL header. */ + payload += 1; + payload_len -= 1; + + nalu_size = payload_len; + outsize = nalu_size + sizeof (sync_bytes); + outbuf = gst_buffer_new_and_alloc (outsize); + outdata = GST_BUFFER_DATA (outbuf); + outdata += sizeof (sync_bytes); + memcpy (outdata, payload, nalu_size); + outdata[0] = nal_header; + + GST_DEBUG_OBJECT (rtph264depay, "queueing %d bytes", outsize); + + /* and assemble in the adapter */ + gst_adapter_push (rtph264depay->adapter, outbuf); + } else { + /* strip off FU indicator and FU header bytes */ + payload += 2; + payload_len -= 2; + + outsize = payload_len; + outbuf = gst_buffer_new_and_alloc (outsize); + outdata = GST_BUFFER_DATA (outbuf); + memcpy (outdata, payload, outsize); + + GST_DEBUG_OBJECT (rtph264depay, "queueing %d bytes", outsize); + + /* and assemble in the adapter */ + gst_adapter_push (rtph264depay->adapter, outbuf); + } + + outbuf = NULL; + rtph264depay->fu_marker = marker; + + /* if NAL unit ends, flush the adapter */ + if (E) + outbuf = gst_rtp_h264_push_fragmentation_unit (rtph264depay, FALSE); + break; + } + default: + { + rtph264depay->wait_start = FALSE; + + /* 1-23 NAL unit Single NAL unit packet per H.264 5.6 */ + /* the entire payload is the output buffer */ + nalu_size = payload_len; + outsize = nalu_size + sizeof (sync_bytes); + outbuf = gst_buffer_new_and_alloc (outsize); + outdata = GST_BUFFER_DATA (outbuf); + if (rtph264depay->byte_stream) { + memcpy (outdata, sync_bytes, sizeof (sync_bytes)); + } else { + outdata[0] = outdata[1] = 0; + outdata[2] = nalu_size >> 8; + outdata[3] = nalu_size & 0xff; + } + outdata += sizeof (sync_bytes); + memcpy (outdata, payload, nalu_size); + + outbuf = gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, timestamp, + marker); + break; + } + } + } + + return outbuf; + + /* ERRORS */ +undefined_type: + { + GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE, + (NULL), ("Undefined packet type")); + return NULL; + } +waiting_start: + { + GST_DEBUG_OBJECT (rtph264depay, "waiting for start"); + return NULL; + } +not_implemented: + { + GST_ELEMENT_ERROR (rtph264depay, STREAM, FORMAT, + (NULL), ("NAL unit type %d not supported yet", nal_unit_type)); + return NULL; + } +} + +static gboolean +gst_rtp_h264_depay_handle_event (GstBaseRTPDepayload * depay, GstEvent * event) +{ + GstRtpH264Depay *rtph264depay; + + rtph264depay = GST_RTP_H264_DEPAY (depay); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_rtp_h264_depay_reset (rtph264depay); + break; + default: + break; + } + + return + GST_BASE_RTP_DEPAYLOAD_CLASS (parent_class)->handle_event (depay, event); +} + +static GstStateChangeReturn +gst_rtp_h264_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpH264Depay *rtph264depay; + GstStateChangeReturn ret; + + rtph264depay = GST_RTP_H264_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_h264_depay_reset (rtph264depay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_h264_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtph264depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_H264_DEPAY); +} diff --git a/gst/rtp/gstrtph264depay.h b/gst/rtp/gstrtph264depay.h new file mode 100644 index 0000000..f50ffe6 --- /dev/null +++ b/gst/rtp/gstrtph264depay.h @@ -0,0 +1,77 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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_RTP_H264_DEPAY_H__ +#define __GST_RTP_H264_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_H264_DEPAY \ + (gst_rtp_h264_depay_get_type()) +#define GST_RTP_H264_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H264_DEPAY,GstRtpH264Depay)) +#define GST_RTP_H264_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H264_DEPAY,GstRtpH264DepayClass)) +#define GST_IS_RTP_H264_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H264_DEPAY)) +#define GST_IS_RTP_H264_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H264_DEPAY)) + +typedef struct _GstRtpH264Depay GstRtpH264Depay; +typedef struct _GstRtpH264DepayClass GstRtpH264DepayClass; + +struct _GstRtpH264Depay +{ + GstBaseRTPDepayload depayload; + + gboolean byte_stream; + + GstBuffer *codec_data; + GstAdapter *adapter; + gboolean wait_start; + + /* nal merging */ + gboolean merge; + GstAdapter *picture_adapter; + gboolean picture_start; + GstClockTime last_ts; + gboolean last_keyframe; + + /* Work around broken payloaders wrt. FU-A & FU-B */ + guint8 current_fu_type; + GstClockTime fu_timestamp; + gboolean fu_marker; +}; + +struct _GstRtpH264DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_h264_depay_get_type (void); + +gboolean gst_rtp_h264_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_H264_DEPAY_H__ */ diff --git a/gst/rtp/gstrtph264pay.c b/gst/rtp/gstrtph264pay.c new file mode 100644 index 0000000..1d0721e --- /dev/null +++ b/gst/rtp/gstrtph264pay.c @@ -0,0 +1,1398 @@ +/* ex: set tabstop=2 shiftwidth=2 expandtab: */ +/* GStreamer + * + * 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 +#include + +#include +#include + +#include "gstrtph264pay.h" + + +#define IDR_TYPE_ID 5 +#define SPS_TYPE_ID 7 +#define PPS_TYPE_ID 8 +#define USE_MEMCMP + + +GST_DEBUG_CATEGORY_STATIC (rtph264pay_debug); +#define GST_CAT_DEFAULT (rtph264pay_debug) + +/* references: + * + * RFC 3984 + */ + +static GstStaticPadTemplate gst_rtp_h264_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h264") + ); + +static GstStaticPadTemplate gst_rtp_h264_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H264\"") + ); + +#define GST_TYPE_H264_SCAN_MODE (gst_h264_scan_mode_get_type()) +static GType +gst_h264_scan_mode_get_type (void) +{ + static GType h264_scan_mode_type = 0; + static const GEnumValue h264_scan_modes[] = { + {GST_H264_SCAN_MODE_BYTESTREAM, + "Scan complete bytestream for NALUs", + "bytestream"}, + {GST_H264_SCAN_MODE_MULTI_NAL, "Buffers contain multiple complete NALUs", + "multiple"}, + {GST_H264_SCAN_MODE_SINGLE_NAL, "Buffers contain a single complete NALU", + "single"}, + {0, NULL, NULL}, + }; + + if (!h264_scan_mode_type) { + h264_scan_mode_type = + g_enum_register_static ("GstH264PayScanMode", h264_scan_modes); + } + return h264_scan_mode_type; +} + +#define DEFAULT_PROFILE_LEVEL_ID NULL +#define DEFAULT_SPROP_PARAMETER_SETS NULL +#define DEFAULT_SCAN_MODE GST_H264_SCAN_MODE_MULTI_NAL +#define DEFAULT_BUFFER_LIST FALSE +#define DEFAULT_CONFIG_INTERVAL 0 + +enum +{ + PROP_0, + PROP_PROFILE_LEVEL_ID, + PROP_SPROP_PARAMETER_SETS, + PROP_SCAN_MODE, + PROP_BUFFER_LIST, + PROP_CONFIG_INTERVAL, + PROP_LAST +}; + +#define IS_ACCESS_UNIT(x) (((x) > 0x00) && ((x) < 0x06)) + +static void gst_rtp_h264_pay_finalize (GObject * object); + +static void gst_rtp_h264_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_h264_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_rtp_h264_pay_getcaps (GstBaseRTPPayload * payload, + GstPad * pad); +static gboolean gst_rtp_h264_pay_setcaps (GstBaseRTPPayload * basepayload, + GstCaps * caps); +static GstFlowReturn gst_rtp_h264_pay_handle_buffer (GstBaseRTPPayload * pad, + GstBuffer * buffer); +static gboolean gst_rtp_h264_pay_handle_event (GstPad * pad, GstEvent * event); +static GstStateChangeReturn gst_basertppayload_change_state (GstElement * + element, GstStateChange transition); + +GST_BOILERPLATE (GstRtpH264Pay, gst_rtp_h264_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_h264_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h264_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_h264_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP H264 payloader", + "Codec/Payloader/Network/RTP", + "Payload-encode H264 video into RTP packets (RFC 3984)", + "Laurent Glayal "); +} + +static void +gst_rtp_h264_pay_class_init (GstRtpH264PayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->set_property = gst_rtp_h264_pay_set_property; + gobject_class->get_property = gst_rtp_h264_pay_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_PROFILE_LEVEL_ID, g_param_spec_string ("profile-level-id", + "profile-level-id", + "The base64 profile-level-id to set in the sink caps (deprecated)", + DEFAULT_PROFILE_LEVEL_ID, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_SPROP_PARAMETER_SETS, g_param_spec_string ("sprop-parameter-sets", + "sprop-parameter-sets", + "The base64 sprop-parameter-sets to set in out caps (set to NULL to " + "extract from stream)", + DEFAULT_SPROP_PARAMETER_SETS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SCAN_MODE, + g_param_spec_enum ("scan-mode", "Scan Mode", + "How to scan the input buffers for NAL units. Performance can be " + "increased when certain assumptions are made about the input buffers", + GST_TYPE_H264_SCAN_MODE, DEFAULT_SCAN_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, + g_param_spec_boolean ("buffer-list", "Buffer List", + "Use Buffer Lists", + DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_CONFIG_INTERVAL, + g_param_spec_uint ("config-interval", + "SPS PPS Send Interval", + "Send SPS and PPS Insertion Interval in seconds (sprop parameter sets " + "will be multiplexed in the data stream when detected.) (0 = disabled)", + 0, 3600, DEFAULT_CONFIG_INTERVAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) + ); + + gobject_class->finalize = gst_rtp_h264_pay_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_basertppayload_change_state); + + gstbasertppayload_class->get_caps = gst_rtp_h264_pay_getcaps; + gstbasertppayload_class->set_caps = gst_rtp_h264_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_h264_pay_handle_buffer; + gstbasertppayload_class->handle_event = gst_rtp_h264_pay_handle_event; + + GST_DEBUG_CATEGORY_INIT (rtph264pay_debug, "rtph264pay", 0, + "H264 RTP Payloader"); +} + +static void +gst_rtp_h264_pay_init (GstRtpH264Pay * rtph264pay, GstRtpH264PayClass * klass) +{ + rtph264pay->queue = g_array_new (FALSE, FALSE, sizeof (guint)); + rtph264pay->profile = 0; + rtph264pay->sps = NULL; + rtph264pay->pps = NULL; + rtph264pay->last_spspps = -1; + rtph264pay->scan_mode = GST_H264_SCAN_MODE_MULTI_NAL; + rtph264pay->buffer_list = DEFAULT_BUFFER_LIST; + rtph264pay->spspps_interval = DEFAULT_CONFIG_INTERVAL; + + rtph264pay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_h264_pay_clear_sps_pps (GstRtpH264Pay * rtph264pay) +{ + g_list_foreach (rtph264pay->sps, (GFunc) gst_mini_object_unref, NULL); + g_list_free (rtph264pay->sps); + rtph264pay->sps = NULL; + g_list_foreach (rtph264pay->pps, (GFunc) gst_mini_object_unref, NULL); + g_list_free (rtph264pay->pps); + rtph264pay->pps = NULL; +} + +static void +gst_rtp_h264_pay_finalize (GObject * object) +{ + GstRtpH264Pay *rtph264pay; + + rtph264pay = GST_RTP_H264_PAY (object); + + g_array_free (rtph264pay->queue, TRUE); + + gst_rtp_h264_pay_clear_sps_pps (rtph264pay); + + g_free (rtph264pay->sprop_parameter_sets); + + g_object_unref (rtph264pay->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static const gchar *all_levels[] = { + "1", + "1b", + "1.1", + "1.2", + "1.3", + "2", + "2.1", + "2.2", + "3", + "3.1", + "3.2", + "4", + "4.1", + "4.2", + "5", + "5.1", + NULL +}; + +static GstCaps * +gst_rtp_h264_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad) +{ + GstCaps *allowed_caps; + + allowed_caps = + gst_pad_peer_get_caps_reffed (GST_BASE_RTP_PAYLOAD_SRCPAD (payload)); + + if (allowed_caps) { + GstCaps *caps = NULL; + guint i; + + if (gst_caps_is_any (allowed_caps)) { + gst_caps_unref (allowed_caps); + goto any; + } + + if (gst_caps_is_empty (allowed_caps)) + return allowed_caps; + + caps = gst_caps_new_empty (); + + for (i = 0; i < gst_caps_get_size (allowed_caps); i++) { + GstStructure *s = gst_caps_get_structure (allowed_caps, i); + GstStructure *new_s = gst_structure_new ("video/x-h264", NULL); + const gchar *profile_level_id; + + profile_level_id = gst_structure_get_string (s, "profile-level-id"); + + if (profile_level_id && strlen (profile_level_id) == 6) { + const gchar *profile; + const gchar *level; + long int spsint; + guint8 sps[3]; + + spsint = strtol (profile_level_id, NULL, 16); + sps[0] = spsint >> 16; + sps[1] = spsint >> 8; + sps[2] = spsint; + + profile = gst_codec_utils_h264_get_profile (sps, 3); + level = gst_codec_utils_h264_get_level (sps, 3); + + if (profile && level) { + GST_LOG_OBJECT (payload, "In caps, have profile %s and level %s", + profile, level); + + if (!strcmp (profile, "constrained-baseline")) + gst_structure_set (new_s, "profile", G_TYPE_STRING, profile, NULL); + else { + GValue val = { 0, }; + GValue profiles = { 0, }; + + g_value_init (&profiles, GST_TYPE_LIST); + g_value_init (&val, G_TYPE_STRING); + + g_value_set_static_string (&val, profile); + gst_value_list_append_value (&profiles, &val); + + g_value_set_static_string (&val, "constrained-baseline"); + gst_value_list_append_value (&profiles, &val); + + gst_structure_take_value (new_s, "profile", &profiles); + } + + if (!strcmp (level, "1")) + gst_structure_set (new_s, "level", G_TYPE_STRING, level, NULL); + else { + GValue levels = { 0, }; + GValue val = { 0, }; + int j; + + g_value_init (&levels, GST_TYPE_LIST); + g_value_init (&val, G_TYPE_STRING); + + for (j = 0; all_levels[j]; j++) { + g_value_set_static_string (&val, all_levels[j]); + gst_value_list_prepend_value (&levels, &val); + if (!strcmp (level, all_levels[j])) + break; + } + gst_structure_take_value (new_s, "level", &levels); + } + } else { + /* Invalid profile-level-id means baseline */ + + gst_structure_set (new_s, + "profile", G_TYPE_STRING, "constrained-baseline", NULL); + } + } else { + /* No profile-level-id also means baseline */ + + gst_structure_set (new_s, + "profile", G_TYPE_STRING, "constrained-baseline", NULL); + } + + gst_caps_merge_structure (caps, new_s); + } + + gst_caps_unref (allowed_caps); + return caps; + } + +any: + return gst_caps_new_simple ("video/x-h264", NULL); +} + +/* take the currently configured SPS and PPS lists and set them on the caps as + * sprop-parameter-sets */ +static gboolean +gst_rtp_h264_pay_set_sps_pps (GstBaseRTPPayload * basepayload) +{ + GstRtpH264Pay *payloader = GST_RTP_H264_PAY (basepayload); + gchar *profile; + gchar *set; + GList *walk; + GString *sprops; + guint count; + gboolean res; + + sprops = g_string_new (""); + count = 0; + + /* build the sprop-parameter-sets */ + for (walk = payloader->sps; walk; walk = g_list_next (walk)) { + GstBuffer *sps_buf = GST_BUFFER_CAST (walk->data); + + set = + g_base64_encode (GST_BUFFER_DATA (sps_buf), GST_BUFFER_SIZE (sps_buf)); + g_string_append_printf (sprops, "%s%s", count ? "," : "", set); + g_free (set); + count++; + } + for (walk = payloader->pps; walk; walk = g_list_next (walk)) { + GstBuffer *pps_buf = GST_BUFFER_CAST (walk->data); + + set = + g_base64_encode (GST_BUFFER_DATA (pps_buf), GST_BUFFER_SIZE (pps_buf)); + g_string_append_printf (sprops, "%s%s", count ? "," : "", set); + g_free (set); + count++; + } + + /* profile is 24 bit. Force it to respect the limit */ + profile = g_strdup_printf ("%06x", payloader->profile & 0xffffff); + /* combine into output caps */ + res = gst_basertppayload_set_outcaps (basepayload, + "sprop-parameter-sets", G_TYPE_STRING, sprops->str, NULL); + g_string_free (sprops, TRUE); + g_free (profile); + + return res; +} + +static gboolean +gst_rtp_h264_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +{ + GstRtpH264Pay *rtph264pay; + GstStructure *str; + const GValue *value; + guint8 *data; + guint size; + const gchar *alignment; + + rtph264pay = GST_RTP_H264_PAY (basepayload); + + str = gst_caps_get_structure (caps, 0); + + /* we can only set the output caps when we found the sprops and profile + * NALs */ + gst_basertppayload_set_options (basepayload, "video", TRUE, "H264", 90000); + + alignment = gst_structure_get_string (str, "alignment"); + if (alignment && !strcmp (alignment, "au")) + rtph264pay->au_alignment = TRUE; + else + rtph264pay->au_alignment = FALSE; + + /* packetized AVC video has a codec_data */ + if ((value = gst_structure_get_value (str, "codec_data"))) { + GstBuffer *buffer; + guint num_sps, num_pps; + gint i, nal_size; + + GST_DEBUG_OBJECT (rtph264pay, "have packetized h264"); + rtph264pay->packetized = TRUE; + + buffer = gst_value_get_buffer (value); + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + /* parse the avcC data */ + if (size < 7) + goto avcc_too_small; + /* parse the version, this must be 1 */ + if (data[0] != 1) + goto wrong_version; + + /* AVCProfileIndication */ + /* profile_compat */ + /* AVCLevelIndication */ + rtph264pay->profile = (data[1] << 16) | (data[2] << 8) | data[3]; + GST_DEBUG_OBJECT (rtph264pay, "profile %06x", rtph264pay->profile); + + /* 6 bits reserved | 2 bits lengthSizeMinusOne */ + /* this is the number of bytes in front of the NAL units to mark their + * length */ + rtph264pay->nal_length_size = (data[4] & 0x03) + 1; + GST_DEBUG_OBJECT (rtph264pay, "nal length %u", rtph264pay->nal_length_size); + /* 3 bits reserved | 5 bits numOfSequenceParameterSets */ + num_sps = data[5] & 0x1f; + GST_DEBUG_OBJECT (rtph264pay, "num SPS %u", num_sps); + + data += 6; + size -= 6; + + /* create the sprop-parameter-sets */ + for (i = 0; i < num_sps; i++) { + GstBuffer *sps_buf; + + if (size < 2) + goto avcc_error; + + nal_size = (data[0] << 8) | data[1]; + data += 2; + size -= 2; + + GST_LOG_OBJECT (rtph264pay, "SPS %d size %d", i, nal_size); + + if (size < nal_size) + goto avcc_error; + + /* make a buffer out of it and add to SPS list */ + sps_buf = gst_buffer_new_and_alloc (nal_size); + memcpy (GST_BUFFER_DATA (sps_buf), data, nal_size); + rtph264pay->sps = g_list_append (rtph264pay->sps, sps_buf); + + data += nal_size; + size -= nal_size; + } + if (size < 1) + goto avcc_error; + + /* 8 bits numOfPictureParameterSets */ + num_pps = data[0]; + data += 1; + size -= 1; + + GST_DEBUG_OBJECT (rtph264pay, "num PPS %u", num_pps); + for (i = 0; i < num_pps; i++) { + GstBuffer *pps_buf; + + if (size < 2) + goto avcc_error; + + nal_size = (data[0] << 8) | data[1]; + data += 2; + size -= 2; + + GST_LOG_OBJECT (rtph264pay, "PPS %d size %d", i, nal_size); + + if (size < nal_size) + goto avcc_error; + + /* make a buffer out of it and add to PPS list */ + pps_buf = gst_buffer_new_and_alloc (nal_size); + memcpy (GST_BUFFER_DATA (pps_buf), data, nal_size); + rtph264pay->pps = g_list_append (rtph264pay->pps, pps_buf); + + data += nal_size; + size -= nal_size; + } + /* and update the caps with the collected data */ + if (!gst_rtp_h264_pay_set_sps_pps (basepayload)) + return FALSE; + } else { + GST_DEBUG_OBJECT (rtph264pay, "have bytestream h264"); + rtph264pay->packetized = FALSE; + } + + return TRUE; + +avcc_too_small: + { + GST_ERROR_OBJECT (rtph264pay, "avcC size %u < 7", size); + return FALSE; + } +wrong_version: + { + GST_ERROR_OBJECT (rtph264pay, "wrong avcC version"); + return FALSE; + } +avcc_error: + { + GST_ERROR_OBJECT (rtph264pay, "avcC too small "); + return FALSE; + } +} + +static void +gst_rtp_h264_pay_parse_sprop_parameter_sets (GstRtpH264Pay * rtph264pay) +{ + const gchar *ps; + gchar **params; + guint len, num_sps, num_pps; + gint i; + GstBuffer *buf; + + ps = rtph264pay->sprop_parameter_sets; + if (ps == NULL) + return; + + gst_rtp_h264_pay_clear_sps_pps (rtph264pay); + + params = g_strsplit (ps, ",", 0); + len = g_strv_length (params); + + GST_DEBUG_OBJECT (rtph264pay, "we have %d params", len); + + num_sps = num_pps = 0; + + for (i = 0; params[i]; i++) { + gsize nal_len; + guint8 *nalp; + guint save = 0; + gint state = 0; + + nal_len = strlen (params[i]); + buf = gst_buffer_new_and_alloc (nal_len); + nalp = GST_BUFFER_DATA (buf); + + nal_len = g_base64_decode_step (params[i], nal_len, nalp, &state, &save); + GST_BUFFER_SIZE (buf) = nal_len; + + if (!nal_len) { + gst_buffer_unref (buf); + continue; + } + + /* append to the right list */ + if ((nalp[0] & 0x1f) == 7) { + GST_DEBUG_OBJECT (rtph264pay, "adding param %d as SPS %d", i, num_sps); + rtph264pay->sps = g_list_append (rtph264pay->sps, buf); + num_sps++; + } else { + GST_DEBUG_OBJECT (rtph264pay, "adding param %d as PPS %d", i, num_pps); + rtph264pay->pps = g_list_append (rtph264pay->pps, buf); + num_pps++; + } + } + g_strfreev (params); +} + +static guint +next_start_code (const guint8 * data, guint size) +{ + /* Boyer-Moore string matching algorithm, in a degenerative + * sense because our search 'alphabet' is binary - 0 & 1 only. + * This allow us to simplify the general BM algorithm to a very + * simple form. */ + /* assume 1 is in the 3th byte */ + guint offset = 2; + + while (offset < size) { + if (1 == data[offset]) { + unsigned int shift = offset; + + if (0 == data[--shift]) { + if (0 == data[--shift]) { + return shift; + } + } + /* The jump is always 3 because of the 1 previously matched. + * All the 0's must be after this '1' matched at offset */ + offset += 3; + } else if (0 == data[offset]) { + /* maybe next byte is 1? */ + offset++; + } else { + /* can jump 3 bytes forward */ + offset += 3; + } + /* at each iteration, we rescan in a backward manner until + * we match 0.0.1 in reverse order. Since our search string + * has only 2 'alpabets' (i.e. 0 & 1), we know that any + * mismatch will force us to shift a fixed number of steps */ + } + GST_DEBUG ("Cannot find next NAL start code. returning %u", size); + + return size; +} + +static gboolean +gst_rtp_h264_pay_decode_nal (GstRtpH264Pay * payloader, + const guint8 * data, guint size, GstClockTime timestamp) +{ + const guint8 *sps = NULL, *pps = NULL; + guint sps_len = 0, pps_len = 0; + guint8 header, type; + guint len; + gboolean updated; + + /* default is no update */ + updated = FALSE; + + GST_DEBUG ("NAL payload len=%u", size); + + len = size; + header = data[0]; + type = header & 0x1f; + + /* keep sps & pps separately so that we can update either one + * independently. We also record the timestamp of the last SPS/PPS so + * that we can insert them at regular intervals and when needed. */ + if (SPS_TYPE_ID == type) { + /* encode the entire SPS NAL in base64 */ + GST_DEBUG ("Found SPS %x %x %x Len=%u", (header >> 7), + (header >> 5) & 3, type, len); + + sps = data; + sps_len = len; + /* remember when we last saw SPS */ + if (timestamp != -1) + payloader->last_spspps = timestamp; + } else if (PPS_TYPE_ID == type) { + /* encoder the entire PPS NAL in base64 */ + GST_DEBUG ("Found PPS %x %x %x Len = %u", + (header >> 7), (header >> 5) & 3, type, len); + + pps = data; + pps_len = len; + /* remember when we last saw PPS */ + if (timestamp != -1) + payloader->last_spspps = timestamp; + } else { + GST_DEBUG ("NAL: %x %x %x Len = %u", (header >> 7), + (header >> 5) & 3, type, len); + } + + /* If we encountered an SPS and/or a PPS, check if it's the + * same as the one we have. If not, update our version and + * set updated to TRUE + */ + if (sps_len > 0) { + GstBuffer *sps_buf; + + if (payloader->sps != NULL) { + sps_buf = GST_BUFFER_CAST (payloader->sps->data); + + if ((GST_BUFFER_SIZE (sps_buf) != sps_len) + || memcmp (GST_BUFFER_DATA (sps_buf), sps, sps_len)) { + /* something changed, update */ + payloader->profile = (sps[1] << 16) + (sps[2] << 8) + sps[3]; + GST_DEBUG ("Profile level IDC = %06x", payloader->profile); + updated = TRUE; + } + } else { + /* no previous SPS, update */ + updated = TRUE; + } + + if (updated) { + sps_buf = gst_buffer_new_and_alloc (sps_len); + memcpy (GST_BUFFER_DATA (sps_buf), sps, sps_len); + + if (payloader->sps) { + /* replace old buffer */ + gst_buffer_unref (payloader->sps->data); + payloader->sps->data = sps_buf; + } else { + /* add new buffer */ + payloader->sps = g_list_prepend (payloader->sps, sps_buf); + } + } + } + + if (pps_len > 0) { + GstBuffer *pps_buf; + + if (payloader->pps != NULL) { + pps_buf = GST_BUFFER_CAST (payloader->pps->data); + + if ((GST_BUFFER_SIZE (pps_buf) != pps_len) + || memcmp (GST_BUFFER_DATA (pps_buf), pps, pps_len)) { + /* something changed, update */ + updated = TRUE; + } + } else { + /* no previous SPS, update */ + updated = TRUE; + } + + if (updated) { + pps_buf = gst_buffer_new_and_alloc (pps_len); + memcpy (GST_BUFFER_DATA (pps_buf), pps, pps_len); + + if (payloader->pps) { + /* replace old buffer */ + gst_buffer_unref (payloader->pps->data); + payloader->pps->data = pps_buf; + } else { + /* add new buffer */ + payloader->pps = g_list_prepend (payloader->pps, pps_buf); + } + } + } + return updated; +} + +static GstFlowReturn +gst_rtp_h264_pay_payload_nal (GstBaseRTPPayload * basepayload, + const guint8 * data, guint size, GstClockTime timestamp, + GstBuffer * buffer_orig, gboolean end_of_au); + +static GstFlowReturn +gst_rtp_h264_pay_send_sps_pps (GstBaseRTPPayload * basepayload, + GstRtpH264Pay * rtph264pay, GstClockTime timestamp) +{ + GstFlowReturn ret = GST_FLOW_OK; + GList *walk; + + for (walk = rtph264pay->sps; walk; walk = g_list_next (walk)) { + GstBuffer *sps_buf = GST_BUFFER_CAST (walk->data); + + GST_DEBUG_OBJECT (rtph264pay, "inserting SPS in the stream"); + /* resend SPS */ + ret = gst_rtp_h264_pay_payload_nal (basepayload, + GST_BUFFER_DATA (sps_buf), GST_BUFFER_SIZE (sps_buf), timestamp, + sps_buf, FALSE); + /* Not critical here; but throw a warning */ + if (ret != GST_FLOW_OK) + GST_WARNING ("Problem pushing SPS"); + } + for (walk = rtph264pay->pps; walk; walk = g_list_next (walk)) { + GstBuffer *pps_buf = GST_BUFFER_CAST (walk->data); + + GST_DEBUG_OBJECT (rtph264pay, "inserting PPS in the stream"); + /* resend PPS */ + ret = gst_rtp_h264_pay_payload_nal (basepayload, + GST_BUFFER_DATA (pps_buf), GST_BUFFER_SIZE (pps_buf), timestamp, + pps_buf, FALSE); + /* Not critical here; but throw a warning */ + if (ret != GST_FLOW_OK) + GST_WARNING ("Problem pushing PPS"); + } + + if (timestamp != -1) + rtph264pay->last_spspps = timestamp; + + return ret; +} + +static GstFlowReturn +gst_rtp_h264_pay_payload_nal (GstBaseRTPPayload * basepayload, + const guint8 * data, guint size, GstClockTime timestamp, + GstBuffer * buffer_orig, gboolean end_of_au) +{ + GstRtpH264Pay *rtph264pay; + GstFlowReturn ret; + guint8 nalType; + guint packet_len, payload_len, mtu; + GstBuffer *outbuf; + guint8 *payload; + GstBufferList *list = NULL; + GstBufferListIterator *it = NULL; + gboolean send_spspps; + + rtph264pay = GST_RTP_H264_PAY (basepayload); + mtu = GST_BASE_RTP_PAYLOAD_MTU (rtph264pay); + + nalType = data[0] & 0x1f; + GST_DEBUG_OBJECT (rtph264pay, "Processing Buffer with NAL TYPE=%d", nalType); + + send_spspps = FALSE; + + /* check if we need to emit an SPS/PPS now */ + if (nalType == IDR_TYPE_ID && rtph264pay->spspps_interval > 0) { + if (rtph264pay->last_spspps != -1) { + guint64 diff; + + GST_LOG_OBJECT (rtph264pay, + "now %" GST_TIME_FORMAT ", last SPS/PPS %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp), GST_TIME_ARGS (rtph264pay->last_spspps)); + + /* calculate diff between last SPS/PPS in milliseconds */ + if (timestamp > rtph264pay->last_spspps) + diff = timestamp - rtph264pay->last_spspps; + else + diff = 0; + + GST_DEBUG_OBJECT (rtph264pay, + "interval since last SPS/PPS %" GST_TIME_FORMAT, + GST_TIME_ARGS (diff)); + + /* bigger than interval, queue SPS/PPS */ + if (GST_TIME_AS_SECONDS (diff) >= rtph264pay->spspps_interval) { + GST_DEBUG_OBJECT (rtph264pay, "time to send SPS/PPS"); + send_spspps = TRUE; + } + } else { + /* no know previous SPS/PPS time, send now */ + GST_DEBUG_OBJECT (rtph264pay, "no previous SPS/PPS time, send now"); + send_spspps = TRUE; + } + } + + if (send_spspps || rtph264pay->send_spspps) { + /* we need to send SPS/PPS now first. FIXME, don't use the timestamp for + * checking when we need to send SPS/PPS but convert to running_time first. */ + rtph264pay->send_spspps = FALSE; + ret = gst_rtp_h264_pay_send_sps_pps (basepayload, rtph264pay, timestamp); + if (ret != GST_FLOW_OK) + return ret; + } + + packet_len = gst_rtp_buffer_calc_packet_len (size, 0, 0); + + if (packet_len < mtu) { + GST_DEBUG_OBJECT (basepayload, + "NAL Unit fit in one packet datasize=%d mtu=%d", size, mtu); + /* will fit in one packet */ + + if (rtph264pay->buffer_list) { + /* use buffer lists + * first create buffer without payload containing only the RTP header + * and then another buffer containing the payload. both buffers will + * be then added to the list */ + outbuf = gst_rtp_buffer_new_allocate (0, 0, 0); + } else { + /* use the old-fashioned way with a single buffer and memcpy */ + outbuf = gst_rtp_buffer_new_allocate (size, 0, 0); + } + + /* only set the marker bit on packets containing access units */ + if (IS_ACCESS_UNIT (nalType) && end_of_au) { + gst_rtp_buffer_set_marker (outbuf, 1); + } + + /* timestamp the outbuffer */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + + if (rtph264pay->buffer_list) { + GstBuffer *paybuf; + + /* create another buffer with the payload. */ + if (buffer_orig) + paybuf = gst_buffer_create_sub (buffer_orig, data - + GST_BUFFER_DATA (buffer_orig), size); + else { + paybuf = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (paybuf), data, size); + } + + list = gst_buffer_list_new (); + it = gst_buffer_list_iterate (list); + + /* add both buffers to the buffer list */ + gst_buffer_list_iterator_add_group (it); + gst_buffer_list_iterator_add (it, outbuf); + gst_buffer_list_iterator_add (it, paybuf); + + gst_buffer_list_iterator_free (it); + + /* push the list to the next element in the pipe */ + ret = gst_basertppayload_push_list (basepayload, list); + } else { + payload = gst_rtp_buffer_get_payload (outbuf); + GST_DEBUG_OBJECT (basepayload, "Copying %d bytes to outbuf", size); + memcpy (payload, data, size); + + ret = gst_basertppayload_push (basepayload, outbuf); + } + } else { + /* fragmentation Units FU-A */ + guint8 nalHeader; + guint limitedSize; + int ii = 0, start = 1, end = 0, pos = 0; + + GST_DEBUG_OBJECT (basepayload, + "NAL Unit DOES NOT fit in one packet datasize=%d mtu=%d", size, mtu); + + nalHeader = *data; + pos++; + size--; + + ret = GST_FLOW_OK; + + GST_DEBUG_OBJECT (basepayload, "Using FU-A fragmentation for data size=%d", + size); + + /* We keep 2 bytes for FU indicator and FU Header */ + payload_len = gst_rtp_buffer_calc_payload_len (mtu - 2, 0, 0); + + if (rtph264pay->buffer_list) { + list = gst_buffer_list_new (); + it = gst_buffer_list_iterate (list); + } + + while (end == 0) { + limitedSize = size < payload_len ? size : payload_len; + GST_DEBUG_OBJECT (basepayload, + "Inside FU-A fragmentation limitedSize=%d iteration=%d", limitedSize, + ii); + + if (rtph264pay->buffer_list) { + /* use buffer lists + * first create buffer without payload containing only the RTP header + * and then another buffer containing the payload. both buffers will + * be then added to the list */ + outbuf = gst_rtp_buffer_new_allocate (2, 0, 0); + } else { + /* use the old-fashioned way with a single buffer and memcpy + * first create buffer to hold the payload */ + outbuf = gst_rtp_buffer_new_allocate (limitedSize + 2, 0, 0); + } + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + payload = gst_rtp_buffer_get_payload (outbuf); + + if (limitedSize == size) { + GST_DEBUG_OBJECT (basepayload, "end size=%d iteration=%d", size, ii); + end = 1; + } + if (IS_ACCESS_UNIT (nalType)) { + gst_rtp_buffer_set_marker (outbuf, end && end_of_au); + } + + /* FU indicator */ + payload[0] = (nalHeader & 0x60) | 28; + + /* FU Header */ + payload[1] = (start << 7) | (end << 6) | (nalHeader & 0x1f); + + if (rtph264pay->buffer_list) { + GstBuffer *paybuf; + + /* create another buffer to hold the payload */ + if (buffer_orig) + paybuf = gst_buffer_create_sub (buffer_orig, data - + GST_BUFFER_DATA (buffer_orig) + pos, limitedSize); + else { + paybuf = gst_buffer_new_and_alloc (limitedSize); + memcpy (GST_BUFFER_DATA (paybuf), data + pos, limitedSize); + } + + /* create a new group to hold the header and the payload */ + gst_buffer_list_iterator_add_group (it); + + /* add both buffers to the buffer list */ + gst_buffer_list_iterator_add (it, outbuf); + gst_buffer_list_iterator_add (it, paybuf); + + } else { + memcpy (&payload[2], data + pos, limitedSize); + GST_DEBUG_OBJECT (basepayload, + "recorded %d payload bytes into packet iteration=%d", + limitedSize + 2, ii); + + ret = gst_basertppayload_push (basepayload, outbuf); + if (ret != GST_FLOW_OK) + break; + } + + size -= limitedSize; + pos += limitedSize; + ii++; + start = 0; + } + + if (rtph264pay->buffer_list) { + /* free iterator and push the whole buffer list at once */ + gst_buffer_list_iterator_free (it); + ret = gst_basertppayload_push_list (basepayload, list); + } + } + return ret; +} + +static GstFlowReturn +gst_rtp_h264_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpH264Pay *rtph264pay; + GstFlowReturn ret; + guint size, nal_len, i; + const guint8 *data, *nal_data; + GstClockTime timestamp; + GArray *nal_queue; + guint pushed = 0; + + rtph264pay = GST_RTP_H264_PAY (basepayload); + + /* the input buffer contains one or more NAL units */ + + if (rtph264pay->scan_mode == GST_H264_SCAN_MODE_BYTESTREAM) { + timestamp = gst_adapter_prev_timestamp (rtph264pay->adapter, NULL); + gst_adapter_push (rtph264pay->adapter, buffer); + size = gst_adapter_available (rtph264pay->adapter); + data = gst_adapter_peek (rtph264pay->adapter, size); + GST_DEBUG_OBJECT (basepayload, "got %d bytes (%d)", size, + GST_BUFFER_SIZE (buffer)); + + if (!GST_CLOCK_TIME_IS_VALID (timestamp)) + timestamp = GST_BUFFER_TIMESTAMP (buffer); + } else { + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + GST_DEBUG_OBJECT (basepayload, "got %d bytes", size); + } + + ret = GST_FLOW_OK; + + /* now loop over all NAL units and put them in a packet + * FIXME, we should really try to pack multiple NAL units into one RTP packet + * if we can, especially for the config packets that wont't cause decoder + * latency. */ + if (rtph264pay->packetized) { + guint nal_length_size; + + nal_length_size = rtph264pay->nal_length_size; + + while (size > nal_length_size) { + gint i; + gboolean end_of_au = FALSE; + + nal_len = 0; + for (i = 0; i < nal_length_size; i++) { + nal_len = ((nal_len << 8) + data[i]); + } + + /* skip the length bytes, make sure we don't run past the buffer size */ + data += nal_length_size; + size -= nal_length_size; + + if (size >= nal_len) { + GST_DEBUG_OBJECT (basepayload, "got NAL of size %u", nal_len); + } else { + nal_len = size; + GST_DEBUG_OBJECT (basepayload, "got incomplete NAL of size %u", + nal_len); + } + + /* If we're at the end of the buffer, then we're at the end of the + * access unit + */ + if (rtph264pay->au_alignment && size - nal_len <= nal_length_size) { + end_of_au = TRUE; + } + + ret = + gst_rtp_h264_pay_payload_nal (basepayload, data, nal_len, timestamp, + buffer, end_of_au); + if (ret != GST_FLOW_OK) + break; + + data += nal_len; + size -= nal_len; + } + } else { + guint next; + gboolean update = FALSE; + + /* get offset of first start code */ + next = next_start_code (data, size); + + /* skip to start code, if no start code is found, next will be size and we + * will not collect data. */ + data += next; + size -= next; + nal_data = data; + nal_queue = rtph264pay->queue; + + /* array must be empty when we get here */ + g_assert (nal_queue->len == 0); + + GST_DEBUG_OBJECT (basepayload, "found first start at %u, bytes left %u", + next, size); + + /* first pass to locate NALs and parse SPS/PPS */ + while (size > 4) { + /* skip start code */ + data += 3; + size -= 3; + + if (rtph264pay->scan_mode == GST_H264_SCAN_MODE_SINGLE_NAL) { + /* we are told that there is only a single NAL in this packet so that we + * can avoid scanning for the next NAL. */ + next = size; + } else { + /* use next_start_code() to scan buffer. + * next_start_code() returns the offset in data, + * starting from zero to the first byte of 0.0.0.1 + * If no start code is found, it returns the value of the + * 'size' parameter. + * data is unchanged by the call to next_start_code() + */ + next = next_start_code (data, size); + + if (next == size + && rtph264pay->scan_mode == GST_H264_SCAN_MODE_BYTESTREAM) { + /* Didn't find the start of next NAL, handle it next time */ + break; + } + } + + /* nal length is distance to next start code */ + nal_len = next; + + GST_DEBUG_OBJECT (basepayload, "found next start at %u of size %u", next, + nal_len); + + if (rtph264pay->sprop_parameter_sets != NULL) { + /* explicitly set profile and sprop, use those */ + if (rtph264pay->update_caps) { + if (!gst_basertppayload_set_outcaps (basepayload, + "sprop-parameter-sets", G_TYPE_STRING, + rtph264pay->sprop_parameter_sets, NULL)) + goto caps_rejected; + + /* parse SPS and PPS from provided parameter set (for insertion) */ + gst_rtp_h264_pay_parse_sprop_parameter_sets (rtph264pay); + + rtph264pay->update_caps = FALSE; + + GST_DEBUG ("outcaps update: sprop-parameter-sets=%s", + rtph264pay->sprop_parameter_sets); + } + } else { + /* We know our stream is a valid H264 NAL packet, + * go parse it for SPS/PPS to enrich the caps */ + /* order: make sure to check nal */ + update = + gst_rtp_h264_pay_decode_nal (rtph264pay, data, nal_len, timestamp) + || update; + } + /* move to next NAL packet */ + data += nal_len; + size -= nal_len; + + g_array_append_val (nal_queue, nal_len); + } + + /* if has new SPS & PPS, update the output caps */ + if (G_UNLIKELY (update)) + if (!gst_rtp_h264_pay_set_sps_pps (basepayload)) + goto caps_rejected; + + /* second pass to payload and push */ + data = nal_data; + pushed = 0; + + for (i = 0; i < nal_queue->len; i++) { + guint size; + gboolean end_of_au = FALSE; + + nal_len = g_array_index (nal_queue, guint, i); + /* skip start code */ + data += 3; + + /* Trim the end unless we're the last NAL in the buffer. + * In case we're not at the end of the buffer we know the next block + * starts with 0x000001 so all the 0x00 bytes at the end of this one are + * trailing 0x0 that can be discarded */ + size = nal_len; + if (i + 1 != nal_queue->len + || rtph264pay->scan_mode == GST_H264_SCAN_MODE_BYTESTREAM) + for (; size > 1 && data[size - 1] == 0x0; size--) + /* skip */ ; + + /* If it's the last nal unit we have in non-bytestream mode, we can + * assume it's the end of an access-unit + * + * FIXME: We need to wait until the next packet or EOS to + * actually payload the NAL so we can know if the current NAL is + * the last one of an access unit or not if we are in bytestream mode + */ + if (rtph264pay->au_alignment && + rtph264pay->scan_mode != GST_H264_SCAN_MODE_BYTESTREAM && + i == nal_queue->len - 1) + end_of_au = TRUE; + + /* put the data in one or more RTP packets */ + ret = + gst_rtp_h264_pay_payload_nal (basepayload, data, size, timestamp, + buffer, end_of_au); + if (ret != GST_FLOW_OK) { + break; + } + + /* move to next NAL packet */ + data += nal_len; + size -= nal_len; + pushed += nal_len + 3; + } + g_array_set_size (nal_queue, 0); + } + + if (rtph264pay->scan_mode == GST_H264_SCAN_MODE_BYTESTREAM) + gst_adapter_flush (rtph264pay->adapter, pushed); + else + gst_buffer_unref (buffer); + + return ret; + +caps_rejected: + { + GST_WARNING_OBJECT (basepayload, "Could not set outcaps"); + g_array_set_size (nal_queue, 0); + gst_buffer_unref (buffer); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static gboolean +gst_rtp_h264_pay_handle_event (GstPad * pad, GstEvent * event) +{ + const GstStructure *s; + GstRtpH264Pay *rtph264pay = GST_RTP_H264_PAY (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_adapter_clear (rtph264pay->adapter); + break; + case GST_EVENT_CUSTOM_DOWNSTREAM: + s = gst_event_get_structure (event); + if (gst_structure_has_name (s, "GstForceKeyUnit")) { + gboolean resend_codec_data; + + if (gst_structure_get_boolean (s, "all-headers", + &resend_codec_data) && resend_codec_data) + rtph264pay->send_spspps = TRUE; + } + break; + default: + break; + } + + return FALSE; +} + +static GstStateChangeReturn +gst_basertppayload_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret; + GstRtpH264Pay *rtph264pay = GST_RTP_H264_PAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + rtph264pay->send_spspps = FALSE; + gst_adapter_clear (rtph264pay->adapter); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + return ret; +} + +static void +gst_rtp_h264_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpH264Pay *rtph264pay; + + rtph264pay = GST_RTP_H264_PAY (object); + + switch (prop_id) { + case PROP_PROFILE_LEVEL_ID: + break; + case PROP_SPROP_PARAMETER_SETS: + g_free (rtph264pay->sprop_parameter_sets); + rtph264pay->sprop_parameter_sets = g_value_dup_string (value); + rtph264pay->update_caps = TRUE; + break; + case PROP_SCAN_MODE: + rtph264pay->scan_mode = g_value_get_enum (value); + break; + case PROP_BUFFER_LIST: + rtph264pay->buffer_list = g_value_get_boolean (value); + break; + case PROP_CONFIG_INTERVAL: + rtph264pay->spspps_interval = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_h264_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpH264Pay *rtph264pay; + + rtph264pay = GST_RTP_H264_PAY (object); + + switch (prop_id) { + case PROP_PROFILE_LEVEL_ID: + break; + case PROP_SPROP_PARAMETER_SETS: + g_value_set_string (value, rtph264pay->sprop_parameter_sets); + break; + case PROP_SCAN_MODE: + g_value_set_enum (value, rtph264pay->scan_mode); + break; + case PROP_BUFFER_LIST: + g_value_set_boolean (value, rtph264pay->buffer_list); + break; + case PROP_CONFIG_INTERVAL: + g_value_set_uint (value, rtph264pay->spspps_interval); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_rtp_h264_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtph264pay", + GST_RANK_SECONDARY, GST_TYPE_RTP_H264_PAY); +} diff --git a/gst/rtp/gstrtph264pay.h b/gst/rtp/gstrtph264pay.h new file mode 100644 index 0000000..6303e30 --- /dev/null +++ b/gst/rtp/gstrtph264pay.h @@ -0,0 +1,86 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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_RTP_H264_PAY_H__ +#define __GST_RTP_H264_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_H264_PAY \ + (gst_rtp_h264_pay_get_type()) +#define GST_RTP_H264_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H264_PAY,GstRtpH264Pay)) +#define GST_RTP_H264_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H264_PAY,GstRtpH264PayClass)) +#define GST_IS_RTP_H264_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H264_PAY)) +#define GST_IS_RTP_H264_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H264_PAY)) + +typedef enum +{ + GST_H264_SCAN_MODE_BYTESTREAM, + GST_H264_SCAN_MODE_MULTI_NAL, + GST_H264_SCAN_MODE_SINGLE_NAL +} GstH264ScanMode; + +typedef struct _GstRtpH264Pay GstRtpH264Pay; +typedef struct _GstRtpH264PayClass GstRtpH264PayClass; + +struct _GstRtpH264Pay +{ + GstBaseRTPPayload payload; + + guint profile; + GList *sps, *pps; + + gboolean packetized; + gboolean au_alignment; + guint nal_length_size; + GArray *queue; + + gchar *sprop_parameter_sets; + gboolean update_caps; + GstH264ScanMode scan_mode; + + GstAdapter *adapter; + + guint spspps_interval; + gboolean send_spspps; + GstClockTime last_spspps; + + gboolean buffer_list; +}; + +struct _GstRtpH264PayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_h264_pay_get_type (void); + +gboolean gst_rtp_h264_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_H264_PAY_H__ */ diff --git a/gst/rtp/gstrtpilbcdepay.c b/gst/rtp/gstrtpilbcdepay.c new file mode 100644 index 0000000..0cdf23f --- /dev/null +++ b/gst/rtp/gstrtpilbcdepay.c @@ -0,0 +1,236 @@ +/* GStreamer + * Copyright (C) <2006> Philippe Khalaf + * + * 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 +#include +#include +#include "gstrtpilbcdepay.h" + +/* RtpiLBCDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_MODE GST_ILBC_MODE_30 + +enum +{ + PROP_0, + PROP_MODE +}; + +/* FIXME, mode should be string because it is a parameter in SDP fmtp */ +static GstStaticPadTemplate gst_rtp_ilbc_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"ILBC\", " + "mode = (string) { \"20\", \"30\" }") + ); + +static GstStaticPadTemplate gst_rtp_ilbc_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-iLBC, " "mode = (int) { 20, 30 }") + ); + +static void gst_ilbc_depay_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_ilbc_depay_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static GstBuffer *gst_rtp_ilbc_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_ilbc_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRTPiLBCDepay, gst_rtp_ilbc_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +#define GST_TYPE_ILBC_MODE (gst_ilbc_mode_get_type()) +static GType +gst_ilbc_mode_get_type (void) +{ + static GType ilbc_mode_type = 0; + static const GEnumValue ilbc_modes[] = { + {GST_ILBC_MODE_20, "20ms frames", "20ms"}, + {GST_ILBC_MODE_30, "30ms frames", "30ms"}, + {0, NULL, NULL}, + }; + + if (!ilbc_mode_type) { + ilbc_mode_type = g_enum_register_static ("iLBCMode", ilbc_modes); + } + return ilbc_mode_type; +} + +static void +gst_rtp_ilbc_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_ilbc_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_ilbc_depay_sink_template); + gst_element_class_set_details_simple (element_class, "RTP iLBC depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts iLBC audio from RTP packets (RFC 3952)", + "Philippe Kalaf "); +} + +static void +gst_rtp_ilbc_depay_class_init (GstRTPiLBCDepayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->set_property = gst_ilbc_depay_set_property; + gobject_class->get_property = gst_ilbc_depay_get_property; + + /* FIXME, mode is in the caps */ + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", "iLBC frame mode", + GST_TYPE_ILBC_MODE, DEFAULT_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasertpdepayload_class->process = gst_rtp_ilbc_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_ilbc_depay_setcaps; +} + +static void +gst_rtp_ilbc_depay_init (GstRTPiLBCDepay * rtpilbcdepay, + GstRTPiLBCDepayClass * klass) +{ + /* Set default mode */ + rtpilbcdepay->mode = DEFAULT_MODE; +} + +static gboolean +gst_rtp_ilbc_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (depayload); + GstCaps *srccaps; + GstStructure *structure; + const gchar *mode_str = NULL; + gint mode, clock_rate; + gboolean ret; + + structure = gst_caps_get_structure (caps, 0); + + mode = rtpilbcdepay->mode; + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 8000; + depayload->clock_rate = clock_rate; + + /* parse mode, if we can */ + mode_str = gst_structure_get_string (structure, "mode"); + if (mode_str) { + mode = strtol (mode_str, NULL, 10); + if (mode != 20 && mode != 30) + mode = rtpilbcdepay->mode; + } + + rtpilbcdepay->mode = mode; + + srccaps = gst_caps_new_simple ("audio/x-iLBC", + "mode", G_TYPE_INT, rtpilbcdepay->mode, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + + GST_DEBUG ("set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); + gst_caps_unref (srccaps); + + return ret; +} + +static GstBuffer * +gst_rtp_ilbc_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstBuffer *outbuf; + gboolean marker; + + marker = gst_rtp_buffer_get_marker (buf); + + GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", + GST_BUFFER_SIZE (buf), marker, + gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + if (marker && outbuf) { + /* mark start of talkspurt with DISCONT */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + + return outbuf; +} + +static void +gst_ilbc_depay_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (object); + + switch (prop_id) { + case PROP_MODE: + rtpilbcdepay->mode = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_ilbc_depay_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (object); + + switch (prop_id) { + case PROP_MODE: + g_value_set_enum (value, rtpilbcdepay->mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_rtp_ilbc_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpilbcdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_ILBC_DEPAY); +} diff --git a/gst/rtp/gstrtpilbcdepay.h b/gst/rtp/gstrtpilbcdepay.h new file mode 100644 index 0000000..ce8c38d --- /dev/null +++ b/gst/rtp/gstrtpilbcdepay.h @@ -0,0 +1,65 @@ +/* GStreamer + * Copyright (C) <2006> Philippe Khalaf + * + * 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_RTP_ILBC_DEPAY_H__ +#define __GST_RTP_ILBC_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRTPiLBCDepay GstRTPiLBCDepay; +typedef struct _GstRTPiLBCDepayClass GstRTPiLBCDepayClass; + +#define GST_TYPE_RTP_ILBC_DEPAY \ + (gst_rtp_ilbc_depay_get_type()) +#define GST_RTP_ILBC_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_ILBC_DEPAY,GstRTPiLBCDepay)) +#define GST_RTP_ILBC_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_ILBC_DEPAY,GstRTPiLBCDepayClass)) +#define GST_IS_RTP_ILBC_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_ILBC_DEPAY)) +#define GST_IS_RTP_ILBC_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_ILBC_DEPAY)) + +typedef enum { + GST_ILBC_MODE_20 = 20, + GST_ILBC_MODE_30 = 30 +} GstiLBCMode; + +struct _GstRTPiLBCDepay +{ + GstBaseRTPDepayload depayload; + + GstiLBCMode mode; +}; + +struct _GstRTPiLBCDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_ilbc_depay_get_type (void); + +gboolean gst_rtp_ilbc_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_ILBC_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpilbcpay.c b/gst/rtp/gstrtpilbcpay.c new file mode 100644 index 0000000..677f5e2 --- /dev/null +++ b/gst/rtp/gstrtpilbcpay.c @@ -0,0 +1,216 @@ +/* GStreamer + * Copyright (C) <2006> Philippe Khalaf + * + * 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 +#include +#include "gstrtpilbcpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpilbcpay_debug); +#define GST_CAT_DEFAULT (rtpilbcpay_debug) + +static GstStaticPadTemplate gst_rtp_ilbc_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-iLBC, " "mode = (int) {20, 30}") + ); + +static GstStaticPadTemplate gst_rtp_ilbc_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"ILBC\", " + "mode = (string) { \"20\", \"30\" }") + ); + + +static GstCaps *gst_rtp_ilbc_pay_sink_getcaps (GstBaseRTPPayload * payload, + GstPad * pad); +static gboolean gst_rtp_ilbc_pay_sink_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); + +GST_BOILERPLATE (GstRTPILBCPay, gst_rtp_ilbc_pay, GstBaseRTPAudioPayload, + GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); + +static void +gst_rtp_ilbc_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_ilbc_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_ilbc_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP iLBC Payloader", + "Codec/Payloader/Network/RTP", + "Packetize iLBC audio streams into RTP packets", + "Philippe Kalaf "); +} + +static void +gst_rtp_ilbc_pay_class_init (GstRTPILBCPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_ilbc_pay_sink_setcaps; + gstbasertppayload_class->get_caps = gst_rtp_ilbc_pay_sink_getcaps; + + GST_DEBUG_CATEGORY_INIT (rtpilbcpay_debug, "rtpilbcpay", 0, + "iLBC audio RTP payloader"); +} + +static void +gst_rtp_ilbc_pay_init (GstRTPILBCPay * rtpilbcpay, GstRTPILBCPayClass * klass) +{ + GstBaseRTPPayload *basertppayload; + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertppayload = GST_BASE_RTP_PAYLOAD (rtpilbcpay); + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpilbcpay); + + /* we don't set the payload type, it should be set by the application using + * the pt property or the default 96 will be used */ + basertppayload->clock_rate = 8000; + + rtpilbcpay->mode = -1; + + /* tell basertpaudiopayload that this is a frame based codec */ + gst_base_rtp_audio_payload_set_frame_based (basertpaudiopayload); +} + +static gboolean +gst_rtp_ilbc_pay_sink_setcaps (GstBaseRTPPayload * basertppayload, + GstCaps * caps) +{ + GstRTPILBCPay *rtpilbcpay; + GstBaseRTPAudioPayload *basertpaudiopayload; + gboolean ret; + gint mode; + gchar *mode_str; + GstStructure *structure; + const char *payload_name; + + rtpilbcpay = GST_RTP_ILBC_PAY (basertppayload); + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basertppayload); + + structure = gst_caps_get_structure (caps, 0); + + payload_name = gst_structure_get_name (structure); + if (g_ascii_strcasecmp ("audio/x-iLBC", payload_name)) + goto wrong_caps; + + if (!gst_structure_get_int (structure, "mode", &mode)) + goto no_mode; + + if (mode != 20 && mode != 30) + goto wrong_mode; + + gst_basertppayload_set_options (basertppayload, "audio", TRUE, "ILBC", 8000); + /* set options for this frame based audio codec */ + gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, + mode, mode == 30 ? 50 : 38); + + mode_str = g_strdup_printf ("%d", mode); + ret = + gst_basertppayload_set_outcaps (basertppayload, "mode", G_TYPE_STRING, + mode_str, NULL); + g_free (mode_str); + + if (mode != rtpilbcpay->mode && rtpilbcpay->mode != -1) + goto mode_changed; + + rtpilbcpay->mode = mode; + + return ret; + + /* ERRORS */ +wrong_caps: + { + GST_ERROR_OBJECT (rtpilbcpay, "expected audio/x-iLBC, received %s", + payload_name); + return FALSE; + } +no_mode: + { + GST_ERROR_OBJECT (rtpilbcpay, "did not receive a mode"); + return FALSE; + } +wrong_mode: + { + GST_ERROR_OBJECT (rtpilbcpay, "mode must be 20 or 30, received %d", mode); + return FALSE; + } +mode_changed: + { + GST_ERROR_OBJECT (rtpilbcpay, "Mode has changed from %d to %d! " + "Mode cannot change while streaming", rtpilbcpay->mode, mode); + return FALSE; + } +} + +/* we return the padtemplate caps with the mode field fixated to a value if we + * can */ +static GstCaps * +gst_rtp_ilbc_pay_sink_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) +{ + GstCaps *otherpadcaps; + GstCaps *caps; + + otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + + if (otherpadcaps) { + if (!gst_caps_is_empty (otherpadcaps)) { + GstStructure *structure; + const gchar *mode_str; + gint mode; + + structure = gst_caps_get_structure (otherpadcaps, 0); + + /* parse mode, if we can */ + mode_str = gst_structure_get_string (structure, "mode"); + if (mode_str) { + mode = strtol (mode_str, NULL, 10); + if (mode == 20 || mode == 30) { + structure = gst_caps_get_structure (caps, 0); + gst_structure_set (structure, "mode", G_TYPE_INT, mode, NULL); + } + } + } + gst_caps_unref (otherpadcaps); + } + return caps; +} + +gboolean +gst_rtp_ilbc_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpilbcpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_ILBC_PAY); +} diff --git a/gst/rtp/gstrtpilbcpay.h b/gst/rtp/gstrtpilbcpay.h new file mode 100644 index 0000000..8071362 --- /dev/null +++ b/gst/rtp/gstrtpilbcpay.h @@ -0,0 +1,60 @@ +/* GStreamer + * Copyright (C) <2006> Philippe Khalaf + * + * 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_RTP_ILBC_PAY_H__ +#define __GST_RTP_ILBC_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_ILBC_PAY \ + (gst_rtp_ilbc_pay_get_type()) +#define GST_RTP_ILBC_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_ILBC_PAY,GstRTPILBCPay)) +#define GST_RTP_ILBC_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_ILBC_PAY,GstRTPILBCPayClass)) +#define GST_IS_RTP_ILBC_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_ILBC_PAY)) +#define GST_IS_RTP_ILBC_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_ILBC_PAY)) + +typedef struct _GstRTPILBCPay GstRTPILBCPay; +typedef struct _GstRTPILBCPayClass GstRTPILBCPayClass; + +struct _GstRTPILBCPay +{ + GstBaseRTPAudioPayload audiopayload; + + gint mode; +}; + +struct _GstRTPILBCPayClass +{ + GstBaseRTPAudioPayloadClass parent_class; +}; + +GType gst_rtp_ilbc_pay_get_type (void); + +gboolean gst_rtp_ilbc_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_ILBC_PAY_H__ */ diff --git a/gst/rtp/gstrtpj2kdepay.c b/gst/rtp/gstrtpj2kdepay.c new file mode 100644 index 0000000..799a0ad --- /dev/null +++ b/gst/rtp/gstrtpj2kdepay.c @@ -0,0 +1,674 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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 + +#include +#include "gstrtpj2kdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpj2kdepay_debug); +#define GST_CAT_DEFAULT (rtpj2kdepay_debug) + +static GstStaticPadTemplate gst_rtp_j2k_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/x-jpc") + ); + +static GstStaticPadTemplate gst_rtp_j2k_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"JPEG2000\"") + ); + +typedef enum +{ + J2K_MARKER = 0xFF, + J2K_MARKER_SOC = 0x4F, + J2K_MARKER_SOT = 0x90, + J2K_MARKER_SOP = 0x91, + J2K_MARKER_SOD = 0x93, + J2K_MARKER_EOC = 0xD9 +} RtpJ2KMarker; + +#define DEFAULT_BUFFER_LIST TRUE + +enum +{ + PROP_0, + PROP_BUFFER_LIST, + PROP_LAST +}; + +GST_BOILERPLATE (GstRtpJ2KDepay, gst_rtp_j2k_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_j2k_depay_finalize (GObject * object); + +static void gst_rtp_j2k_depay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_j2k_depay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstStateChangeReturn +gst_rtp_j2k_depay_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_rtp_j2k_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_j2k_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_j2k_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_j2k_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_j2k_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP JPEG 2000 depayloader", "Codec/Depayloader/Network/RTP", + "Extracts JPEG 2000 video from RTP packets (RFC 5371)", + "Wim Taymans "); +} + +static void +gst_rtp_j2k_depay_class_init (GstRtpJ2KDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_j2k_depay_finalize; + + gobject_class->set_property = gst_rtp_j2k_depay_set_property; + gobject_class->get_property = gst_rtp_j2k_depay_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, + g_param_spec_boolean ("buffer-list", "Buffer List", + "Use Buffer Lists", + DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = gst_rtp_j2k_depay_change_state; + + gstbasertpdepayload_class->set_caps = gst_rtp_j2k_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_j2k_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpj2kdepay_debug, "rtpj2kdepay", 0, + "J2K Video RTP Depayloader"); +} + +static void +gst_rtp_j2k_depay_init (GstRtpJ2KDepay * rtpj2kdepay, + GstRtpJ2KDepayClass * klass) +{ + rtpj2kdepay->buffer_list = DEFAULT_BUFFER_LIST; + + rtpj2kdepay->pu_adapter = gst_adapter_new (); + rtpj2kdepay->t_adapter = gst_adapter_new (); + rtpj2kdepay->f_adapter = gst_adapter_new (); +} + +static void +store_mheader (GstRtpJ2KDepay * rtpj2kdepay, guint idx, GstBuffer * buf) +{ + GstBuffer *old; + + GST_DEBUG_OBJECT (rtpj2kdepay, "storing main header %p at index %u", buf, + idx); + if ((old = rtpj2kdepay->MH[idx])) + gst_buffer_unref (old); + rtpj2kdepay->MH[idx] = buf; +} + +static void +clear_mheaders (GstRtpJ2KDepay * rtpj2kdepay) +{ + guint i; + + for (i = 0; i < 8; i++) + store_mheader (rtpj2kdepay, i, NULL); +} + +static void +gst_rtp_j2k_depay_reset (GstRtpJ2KDepay * rtpj2kdepay) +{ + clear_mheaders (rtpj2kdepay); + gst_adapter_clear (rtpj2kdepay->pu_adapter); + gst_adapter_clear (rtpj2kdepay->t_adapter); + gst_adapter_clear (rtpj2kdepay->f_adapter); + rtpj2kdepay->next_frag = 0; +} + +static void +gst_rtp_j2k_depay_finalize (GObject * object) +{ + GstRtpJ2KDepay *rtpj2kdepay; + + rtpj2kdepay = GST_RTP_J2K_DEPAY (object); + + clear_mheaders (rtpj2kdepay); + + g_object_unref (rtpj2kdepay->pu_adapter); + g_object_unref (rtpj2kdepay->t_adapter); + g_object_unref (rtpj2kdepay->f_adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_j2k_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + gint clock_rate; + GstCaps *outcaps; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; + depayload->clock_rate = clock_rate; + + outcaps = + gst_caps_new_simple ("image/x-jpc", "framerate", GST_TYPE_FRACTION, 0, 1, + "fields", G_TYPE_INT, 1, "fourcc", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('s', + 'Y', 'U', 'V'), NULL); + res = gst_pad_set_caps (depayload->srcpad, outcaps); + gst_caps_unref (outcaps); + + return res; +} + +static void +gst_rtp_j2k_depay_clear_pu (GstRtpJ2KDepay * rtpj2kdepay) +{ + gst_adapter_clear (rtpj2kdepay->pu_adapter); + rtpj2kdepay->have_sync = FALSE; +} + +static GstFlowReturn +gst_rtp_j2k_depay_flush_pu (GstBaseRTPDepayload * depayload) +{ + GstRtpJ2KDepay *rtpj2kdepay; + GstBuffer *mheader; + guint avail, MHF, mh_id; + + rtpj2kdepay = GST_RTP_J2K_DEPAY (depayload); + + /* take all available buffers */ + avail = gst_adapter_available (rtpj2kdepay->pu_adapter); + if (avail == 0) + goto done; + + MHF = rtpj2kdepay->pu_MHF; + mh_id = rtpj2kdepay->last_mh_id; + + GST_DEBUG_OBJECT (rtpj2kdepay, "flushing PU of size %u", avail); + + if (MHF == 0) { + GList *packets, *walk; + + packets = gst_adapter_take_list (rtpj2kdepay->pu_adapter, avail); + /* append packets */ + for (walk = packets; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + GST_DEBUG_OBJECT (rtpj2kdepay, "append pu packet of size %u", + GST_BUFFER_SIZE (buf)); + gst_adapter_push (rtpj2kdepay->t_adapter, buf); + } + g_list_free (packets); + } else { + /* we have a header */ + GST_DEBUG_OBJECT (rtpj2kdepay, "keeping header %u", mh_id); + /* we managed to see the start and end of the header, take all from + * adapter and keep in header */ + mheader = gst_adapter_take_buffer (rtpj2kdepay->pu_adapter, avail); + + store_mheader (rtpj2kdepay, mh_id, mheader); + } + +done: + rtpj2kdepay->have_sync = FALSE; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_rtp_j2k_depay_flush_tile (GstBaseRTPDepayload * depayload) +{ + GstRtpJ2KDepay *rtpj2kdepay; + guint avail, mh_id; + GList *packets, *walk; + guint8 end[2]; + GstFlowReturn ret = GST_FLOW_OK; + + rtpj2kdepay = GST_RTP_J2K_DEPAY (depayload); + + /* flush pending PU */ + gst_rtp_j2k_depay_flush_pu (depayload); + + /* take all available buffers */ + avail = gst_adapter_available (rtpj2kdepay->t_adapter); + if (avail == 0) + goto done; + + mh_id = rtpj2kdepay->last_mh_id; + + GST_DEBUG_OBJECT (rtpj2kdepay, "flushing tile of size %u", avail); + + if (gst_adapter_available (rtpj2kdepay->f_adapter) == 0) { + GstBuffer *mheader; + + /* we need a header now */ + if ((mheader = rtpj2kdepay->MH[mh_id]) == NULL) + goto waiting_header; + + /* push header in the adapter */ + GST_DEBUG_OBJECT (rtpj2kdepay, "pushing header %u", mh_id); + gst_adapter_push (rtpj2kdepay->f_adapter, gst_buffer_ref (mheader)); + } + + /* check for last bytes */ + gst_adapter_copy (rtpj2kdepay->t_adapter, end, avail - 2, 2); + + /* now append the tile packets to the frame */ + packets = gst_adapter_take_list (rtpj2kdepay->t_adapter, avail); + for (walk = packets; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + + if (walk == packets) { + guint8 *data; + guint size; + + /* first buffer should contain the SOT */ + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + if (size < 12) + goto invalid_tile; + + if (data[0] == 0xff && data[1] == J2K_MARKER_SOT) { + guint Psot, nPsot; + + if (end[0] == 0xff && end[1] == J2K_MARKER_EOC) + nPsot = avail - 2; + else + nPsot = avail; + + Psot = GST_READ_UINT32_BE (&data[6]); + if (Psot != nPsot && Psot != 0) { + /* Psot must match the size of the tile */ + GST_DEBUG_OBJECT (rtpj2kdepay, "set Psot from %u to %u", Psot, nPsot); + buf = gst_buffer_make_writable (buf); + data = GST_BUFFER_DATA (buf); + GST_WRITE_UINT32_BE (&data[6], nPsot); + } + } + } + + GST_DEBUG_OBJECT (rtpj2kdepay, "append pu packet of size %u", + GST_BUFFER_SIZE (buf)); + gst_adapter_push (rtpj2kdepay->f_adapter, buf); + } + g_list_free (packets); + +done: + rtpj2kdepay->last_tile = -1; + + return ret; + + /* errors */ +waiting_header: + { + GST_DEBUG_OBJECT (rtpj2kdepay, "waiting for header %u", mh_id); + gst_adapter_clear (rtpj2kdepay->t_adapter); + rtpj2kdepay->last_tile = -1; + return ret; + } +invalid_tile: + { + GST_ELEMENT_WARNING (rtpj2kdepay, STREAM, DECODE, ("Invalid tile"), (NULL)); + gst_adapter_clear (rtpj2kdepay->t_adapter); + rtpj2kdepay->last_tile = -1; + return ret; + } +} + +static GstFlowReturn +gst_rtp_j2k_depay_flush_frame (GstBaseRTPDepayload * depayload) +{ + GstRtpJ2KDepay *rtpj2kdepay; + guint8 end[2]; + guint8 *data; + guint avail; + + GstFlowReturn ret = GST_FLOW_OK; + + rtpj2kdepay = GST_RTP_J2K_DEPAY (depayload); + + /* flush pending tile */ + gst_rtp_j2k_depay_flush_tile (depayload); + + /* last buffer take all data out of the adapter */ + avail = gst_adapter_available (rtpj2kdepay->f_adapter); + if (avail == 0) + goto done; + + if (avail > 2) { + GstBuffer *outbuf; + + /* take the last bytes of the JPEG 2000 data to see if there is an EOC + * marker */ + gst_adapter_copy (rtpj2kdepay->f_adapter, end, avail - 2, 2); + + if (end[0] != 0xff && end[1] != 0xd9) { + GST_DEBUG_OBJECT (rtpj2kdepay, "no EOC marker, adding one"); + + /* no EOI marker, add one */ + outbuf = gst_buffer_new_and_alloc (2); + data = GST_BUFFER_DATA (outbuf); + data[0] = 0xff; + data[1] = 0xd9; + + gst_adapter_push (rtpj2kdepay->f_adapter, outbuf); + avail += 2; + } + + if (rtpj2kdepay->buffer_list) { + GList *list; + GstBufferList *buflist; + GstBufferListIterator *it; + + GST_DEBUG_OBJECT (rtpj2kdepay, "pushing buffer list of %u bytes", avail); + list = gst_adapter_take_list (rtpj2kdepay->f_adapter, avail); + + buflist = gst_buffer_list_new (); + it = gst_buffer_list_iterate (buflist); + gst_buffer_list_iterator_add_group (it); + gst_buffer_list_iterator_add_list (it, list); + gst_buffer_list_iterator_free (it); + + ret = gst_base_rtp_depayload_push_list (depayload, buflist); + } else { + GST_DEBUG_OBJECT (rtpj2kdepay, "pushing buffer of %u bytes", avail); + outbuf = gst_adapter_take_buffer (rtpj2kdepay->f_adapter, avail); + ret = gst_base_rtp_depayload_push (depayload, outbuf); + } + } else { + GST_WARNING_OBJECT (rtpj2kdepay, "empty packet"); + gst_adapter_clear (rtpj2kdepay->f_adapter); + } + + /* we accept any mh_id now */ + rtpj2kdepay->last_mh_id = -1; + + /* reset state */ + rtpj2kdepay->next_frag = 0; + rtpj2kdepay->have_sync = FALSE; + +done: + /* we can't keep headers with mh_id of 0 */ + store_mheader (rtpj2kdepay, 0, NULL); + + return ret; +} + +static GstBuffer * +gst_rtp_j2k_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpJ2KDepay *rtpj2kdepay; + guint8 *payload; + guint MHF, mh_id, frag_offset, tile, payload_len, j2klen; + gint gap; + guint32 rtptime; + + rtpj2kdepay = GST_RTP_J2K_DEPAY (depayload); + + payload = gst_rtp_buffer_get_payload (buf); + payload_len = gst_rtp_buffer_get_payload_len (buf); + + /* we need at least a header */ + if (payload_len < 8) + goto empty_packet; + + rtptime = gst_rtp_buffer_get_timestamp (buf); + + /* new timestamp marks new frame */ + if (rtpj2kdepay->last_rtptime != rtptime) { + rtpj2kdepay->last_rtptime = rtptime; + /* flush pending frame */ + gst_rtp_j2k_depay_flush_frame (depayload); + } + + /* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |tp |MHF|mh_id|T| priority | tile number | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |reserved | fragment offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + MHF = (payload[0] & 0x30) >> 4; + mh_id = (payload[0] & 0xe) >> 1; + + if (rtpj2kdepay->last_mh_id == -1) + rtpj2kdepay->last_mh_id = mh_id; + else if (rtpj2kdepay->last_mh_id != mh_id) + goto wrong_mh_id; + + tile = (payload[2] << 8) | payload[3]; + frag_offset = (payload[5] << 16) | (payload[6] << 8) | payload[7]; + j2klen = payload_len - 8; + + GST_DEBUG_OBJECT (rtpj2kdepay, "MHF %u, tile %u, frag %u, expected %u", MHF, + tile, frag_offset, rtpj2kdepay->next_frag); + + /* calculate the gap between expected frag */ + gap = frag_offset - rtpj2kdepay->next_frag; + /* calculate next frag */ + rtpj2kdepay->next_frag = frag_offset + j2klen; + + if (gap != 0) { + GST_DEBUG_OBJECT (rtpj2kdepay, "discont of %d, clear PU", gap); + /* discont, clear pu adapter and resync */ + gst_rtp_j2k_depay_clear_pu (rtpj2kdepay); + } + + /* check for sync code */ + if (j2klen > 2 && payload[8] == 0xff) { + guint marker = payload[9]; + + /* packets must start with SOC, SOT or SOP */ + switch (marker) { + case J2K_MARKER_SOC: + GST_DEBUG_OBJECT (rtpj2kdepay, "found SOC packet"); + /* flush the previous frame, should have happened when the timestamp + * changed above. */ + gst_rtp_j2k_depay_flush_frame (depayload); + rtpj2kdepay->have_sync = TRUE; + break; + case J2K_MARKER_SOT: + /* flush the previous tile */ + gst_rtp_j2k_depay_flush_tile (depayload); + GST_DEBUG_OBJECT (rtpj2kdepay, "found SOT packet"); + rtpj2kdepay->have_sync = TRUE; + /* we sync on the tile now */ + rtpj2kdepay->last_tile = tile; + break; + case J2K_MARKER_SOP: + GST_DEBUG_OBJECT (rtpj2kdepay, "found SOP packet"); + /* flush the previous PU */ + gst_rtp_j2k_depay_flush_pu (depayload); + if (rtpj2kdepay->last_tile != tile) { + /* wrong tile, we lose sync and we need a new SOT or SOC to regain + * sync. First flush out the previous tile if we have one. */ + if (rtpj2kdepay->last_tile != -1) + gst_rtp_j2k_depay_flush_tile (depayload); + /* now we have no more valid tile and no sync */ + rtpj2kdepay->last_tile = -1; + rtpj2kdepay->have_sync = FALSE; + } else { + rtpj2kdepay->have_sync = TRUE; + } + break; + default: + GST_DEBUG_OBJECT (rtpj2kdepay, "no sync packet 0x%02d", marker); + break; + } + } + + if (rtpj2kdepay->have_sync) { + GstBuffer *pu_frag; + + if (gst_adapter_available (rtpj2kdepay->pu_adapter) == 0) { + /* first part of pu, record state */ + GST_DEBUG_OBJECT (rtpj2kdepay, "first PU"); + rtpj2kdepay->pu_MHF = MHF; + } + /* and push in pu adapter */ + GST_DEBUG_OBJECT (rtpj2kdepay, "push pu of size %u in adapter", j2klen); + pu_frag = gst_rtp_buffer_get_payload_subbuffer (buf, 8, -1); + gst_adapter_push (rtpj2kdepay->pu_adapter, pu_frag); + + if (MHF & 2) { + /* last part of main header received, we can flush it */ + GST_DEBUG_OBJECT (rtpj2kdepay, "header end, flush pu"); + gst_rtp_j2k_depay_flush_pu (depayload); + } + } else { + GST_DEBUG_OBJECT (rtpj2kdepay, "discard packet, no sync"); + } + + /* marker bit finishes the frame */ + if (gst_rtp_buffer_get_marker (buf)) { + GST_DEBUG_OBJECT (rtpj2kdepay, "marker set, last buffer"); + /* then flush frame */ + gst_rtp_j2k_depay_flush_frame (depayload); + } + return NULL; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpj2kdepay, STREAM, DECODE, + ("Empty Payload."), (NULL)); + return NULL; + } +wrong_mh_id: + { + GST_ELEMENT_WARNING (rtpj2kdepay, STREAM, DECODE, + ("Invalid mh_id %u, expected %u", mh_id, rtpj2kdepay->last_mh_id), + (NULL)); + gst_rtp_j2k_depay_clear_pu (rtpj2kdepay); + return NULL; + } +} + +static void +gst_rtp_j2k_depay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpJ2KDepay *rtpj2kdepay; + + rtpj2kdepay = GST_RTP_J2K_DEPAY (object); + + switch (prop_id) { + case PROP_BUFFER_LIST: + rtpj2kdepay->buffer_list = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_j2k_depay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpJ2KDepay *rtpj2kdepay; + + rtpj2kdepay = GST_RTP_J2K_DEPAY (object); + + switch (prop_id) { + case PROP_BUFFER_LIST: + g_value_set_boolean (value, rtpj2kdepay->buffer_list); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_rtp_j2k_depay_change_state (GstElement * element, GstStateChange transition) +{ + GstRtpJ2KDepay *rtpj2kdepay; + GstStateChangeReturn ret; + + rtpj2kdepay = GST_RTP_J2K_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_j2k_depay_reset (rtpj2kdepay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_j2k_depay_reset (rtpj2kdepay); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_j2k_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpj2kdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_J2K_DEPAY); +} diff --git a/gst/rtp/gstrtpj2kdepay.h b/gst/rtp/gstrtpj2kdepay.h new file mode 100644 index 0000000..40373b2 --- /dev/null +++ b/gst/rtp/gstrtpj2kdepay.h @@ -0,0 +1,76 @@ +/* GStreamer + * Copyright (C) <2009> Wim Taymans + * + * 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_RTP_J2K_DEPAY_H__ +#define __GST_RTP_J2K_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_J2K_DEPAY \ + (gst_rtp_j2k_depay_get_type()) +#define GST_RTP_J2K_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_J2K_DEPAY,GstRtpJ2KDepay)) +#define GST_RTP_J2K_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_J2K_DEPAY,GstRtpJ2KDepayClass)) +#define GST_IS_RTP_J2K_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_J2K_DEPAY)) +#define GST_IS_RTP_J2K_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_J2K_DEPAY)) + +typedef struct _GstRtpJ2KDepay GstRtpJ2KDepay; +typedef struct _GstRtpJ2KDepayClass GstRtpJ2KDepayClass; + +struct _GstRtpJ2KDepay +{ + GstBaseRTPDepayload depayload; + + guint64 last_rtptime; + guint last_mh_id; + guint last_tile; + + GstBuffer *MH[8]; + + guint pu_MHF; + GstAdapter *pu_adapter; + GstAdapter *t_adapter; + GstAdapter *f_adapter; + + guint next_frag; + gboolean have_sync; + + gboolean buffer_list; + gint width, height; +}; + +struct _GstRtpJ2KDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_j2k_depay_get_type (void); + +gboolean gst_rtp_j2k_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_J2K_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpj2kpay.c b/gst/rtp/gstrtpj2kpay.c new file mode 100644 index 0000000..ef06a71 --- /dev/null +++ b/gst/rtp/gstrtpj2kpay.c @@ -0,0 +1,583 @@ +/* GStreamer + * Copyright (C) 2009 Wim Taymans + * + * 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-rtpj2kpay + * + * Payload encode JPEG 2000 pictures into RTP packets according to RFC 5371. + * For detailed information see: http://www.rfc-editor.org/rfc/rfc5371.txt + * + * The payloader takes a JPEG 2000 picture, scans the header for packetization + * units and constructs the RTP packet header followed by the actual JPEG 2000 + * codestream. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "gstrtpj2kpay.h" + +static GstStaticPadTemplate gst_rtp_j2k_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/x-jpc") + ); + +static GstStaticPadTemplate gst_rtp_j2k_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + " media = (string) \"video\", " + " payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + " clock-rate = (int) 90000, " + " encoding-name = (string) \"JPEG2000\"") + ); + +GST_DEBUG_CATEGORY_STATIC (rtpj2kpay_debug); +#define GST_CAT_DEFAULT (rtpj2kpay_debug) + +/* + * RtpJ2KMarker: + * @J2K_MARKER: Prefix for JPEG 2000 marker + * @J2K_MARKER_SOC: Start of Codestream + * @J2K_MARKER_SOT: Start of tile + * @J2K_MARKER_EOC: End of Codestream + * + * Identifers for markers in JPEG 2000 codestreams + */ +typedef enum +{ + J2K_MARKER = 0xFF, + J2K_MARKER_SOC = 0x4F, + J2K_MARKER_SOT = 0x90, + J2K_MARKER_SOP = 0x91, + J2K_MARKER_EPH = 0x92, + J2K_MARKER_SOD = 0x93, + J2K_MARKER_EOC = 0xD9 +} RtpJ2KMarker; + +#define DEFAULT_BUFFER_LIST TRUE + +enum +{ + PROP_0, + PROP_BUFFER_LIST, + PROP_LAST +}; + +typedef struct +{ + guint tp:2; + guint MHF:2; + guint mh_id:3; + guint T:1; + guint priority:8; + guint tile:16; + guint offset:24; +} RtpJ2KHeader; + +#define HEADER_SIZE 8 + +static void gst_rtp_j2k_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_j2k_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_rtp_j2k_pay_setcaps (GstBaseRTPPayload * basepayload, + GstCaps * caps); + +static GstFlowReturn gst_rtp_j2k_pay_handle_buffer (GstBaseRTPPayload * pad, + GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpJ2KPay, gst_rtp_j2k_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_j2k_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_j2k_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_j2k_pay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP JPEG 2000 payloader", "Codec/Payloader/Network/RTP", + "Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)", + "Wim Taymans "); +} + +static void +gst_rtp_j2k_pay_class_init (GstRtpJ2KPayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->set_property = gst_rtp_j2k_pay_set_property; + gobject_class->get_property = gst_rtp_j2k_pay_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, + g_param_spec_boolean ("buffer-list", "Buffer List", + "Use Buffer Lists", + DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasertppayload_class->set_caps = gst_rtp_j2k_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_j2k_pay_handle_buffer; + + GST_DEBUG_CATEGORY_INIT (rtpj2kpay_debug, "rtpj2kpay", 0, + "JPEG 2000 RTP Payloader"); +} + +static void +gst_rtp_j2k_pay_init (GstRtpJ2KPay * pay, GstRtpJ2KPayClass * klass) +{ + pay->buffer_list = DEFAULT_BUFFER_LIST; +} + +static gboolean +gst_rtp_j2k_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +{ + GstStructure *caps_structure = gst_caps_get_structure (caps, 0); + GstRtpJ2KPay *pay; + gint width = 0, height = 0; + gboolean res; + + pay = GST_RTP_J2K_PAY (basepayload); + + /* these properties are not mandatory, we can get them from the stream */ + if (gst_structure_get_int (caps_structure, "height", &height)) { + pay->height = height; + } + if (gst_structure_get_int (caps_structure, "width", &width)) { + pay->width = width; + } + + gst_basertppayload_set_options (basepayload, "video", TRUE, "JPEG2000", + 90000); + res = gst_basertppayload_set_outcaps (basepayload, NULL); + + return res; +} + + +static guint +gst_rtp_j2k_pay_header_size (const guint8 * data, guint offset) +{ + return data[offset] << 8 | data[offset + 1]; +} + +static RtpJ2KMarker +gst_rtp_j2k_pay_scan_marker (const guint8 * data, guint size, guint * offset) +{ + while ((data[(*offset)++] != J2K_MARKER) && ((*offset) < size)); + + if (G_UNLIKELY ((*offset) >= size)) { + return J2K_MARKER_EOC; + } else { + guint8 marker = data[(*offset)++]; + return marker; + } +} + +typedef struct +{ + RtpJ2KHeader header; + gboolean bitstream; + guint n_tiles; + guint next_sot; + gboolean force_packet; +} RtpJ2KState; + +static guint +find_pu_end (GstRtpJ2KPay * pay, const guint8 * data, guint size, + guint offset, RtpJ2KState * state) +{ + gboolean cut_sop = FALSE; + RtpJ2KMarker marker; + + /* parse the j2k header for 'start of codestream' */ + GST_LOG_OBJECT (pay, "checking from offset %u", offset); + while (offset < size) { + marker = gst_rtp_j2k_pay_scan_marker (data, size, &offset); + + if (state->bitstream) { + /* parsing bitstream, only look for SOP */ + switch (marker) { + case J2K_MARKER_SOP: + GST_LOG_OBJECT (pay, "found SOP at %u", offset); + if (cut_sop) + return offset - 2; + cut_sop = TRUE; + break; + case J2K_MARKER_EPH: + /* just skip over EPH */ + GST_LOG_OBJECT (pay, "found EPH at %u", offset); + break; + default: + if (offset >= state->next_sot) { + GST_LOG_OBJECT (pay, "reached next SOT at %u", offset); + state->bitstream = FALSE; + state->force_packet = TRUE; + if (marker == J2K_MARKER_EOC && state->next_sot + 2 <= size) + /* include EOC but never go past the max size */ + return state->next_sot + 2; + else + return state->next_sot; + } + break; + } + } else { + switch (marker) { + case J2K_MARKER_SOC: + GST_LOG_OBJECT (pay, "found SOC at %u", offset); + state->header.MHF = 1; + break; + case J2K_MARKER_SOT: + { + guint len, Psot; + + GST_LOG_OBJECT (pay, "found SOT at %u", offset); + /* we found SOT but also had a header first */ + if (state->header.MHF) { + state->force_packet = TRUE; + return offset - 2; + } + + /* parse SOT but do some sanity checks first */ + len = gst_rtp_j2k_pay_header_size (data, offset); + GST_LOG_OBJECT (pay, "SOT length %u", len); + if (len < 8) + return size; + if (offset + len >= size) + return size; + + if (state->n_tiles == 0) + /* first tile, T is valid */ + state->header.T = 0; + else + /* more tiles, T becomes invalid */ + state->header.T = 1; + state->header.tile = GST_READ_UINT16_BE (&data[offset + 2]); + state->n_tiles++; + + /* get offset of next tile, if it's 0, it goes all the way to the end of + * the data */ + Psot = GST_READ_UINT32_BE (&data[offset + 4]); + if (Psot == 0) + state->next_sot = size; + else + state->next_sot = offset - 2 + Psot; + + offset += len; + GST_LOG_OBJECT (pay, "Isot %u, Psot %u, next %u", state->header.tile, + Psot, state->next_sot); + break; + } + case J2K_MARKER_SOD: + GST_LOG_OBJECT (pay, "found SOD at %u", offset); + /* can't have more tiles now */ + state->n_tiles = 0; + /* go to bitstream parsing */ + state->bitstream = TRUE; + /* cut at the next SOP or else include all data */ + cut_sop = TRUE; + /* force a new packet when we see SOP, this can be optional but the + * spec recommends packing headers separately */ + state->force_packet = TRUE; + break; + case J2K_MARKER_EOC: + GST_LOG_OBJECT (pay, "found EOC at %u", offset); + return offset; + default: + { + guint len = gst_rtp_j2k_pay_header_size (data, offset); + GST_LOG_OBJECT (pay, "skip 0x%02x len %u", marker, len); + offset += len; + break; + } + } + } + } + GST_DEBUG_OBJECT (pay, "reached end of data"); + return size; +} + +static GstFlowReturn +gst_rtp_j2k_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpJ2KPay *pay; + GstClockTime timestamp; + GstFlowReturn ret = GST_FLOW_ERROR; + RtpJ2KState state; + GstBufferList *list = NULL; + GstBufferListIterator *it = NULL; + guint8 *data; + guint size; + guint mtu, max_size; + guint offset; + guint end, pos; + + pay = GST_RTP_J2K_PAY (basepayload); + mtu = GST_BASE_RTP_PAYLOAD_MTU (pay); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + offset = pos = end = 0; + + GST_LOG_OBJECT (pay, "got buffer size %u, timestamp %" GST_TIME_FORMAT, size, + GST_TIME_ARGS (timestamp)); + + /* do some header defaults first */ + state.header.tp = 0; /* only progressive scan */ + state.header.MHF = 0; /* no header */ + state.header.mh_id = 0; /* always 0 for now */ + state.header.T = 1; /* invalid tile */ + state.header.priority = 255; /* always 255 for now */ + state.header.tile = 0; /* no tile number */ + state.header.offset = 0; /* offset of 0 */ + state.bitstream = FALSE; + state.n_tiles = 0; + state.next_sot = 0; + state.force_packet = FALSE; + + if (pay->buffer_list) { + list = gst_buffer_list_new (); + it = gst_buffer_list_iterate (list); + } + + /* get max packet length */ + max_size = gst_rtp_buffer_calc_payload_len (mtu - HEADER_SIZE, 0, 0); + + do { + GstBuffer *outbuf; + guint8 *header; + guint payload_size; + guint pu_size; + + /* try to pack as much as we can */ + do { + /* see how much we have scanned already */ + pu_size = end - offset; + GST_DEBUG_OBJECT (pay, "scanned pu size %u", pu_size); + + /* we need to make a new packet */ + if (state.force_packet) { + GST_DEBUG_OBJECT (pay, "need to force a new packet"); + state.force_packet = FALSE; + pos = end; + break; + } + + /* else see if we have enough */ + if (pu_size > max_size) { + if (pos != offset) + /* the packet became too large, use previous scanpos */ + pu_size = pos - offset; + else + /* the already scanned data was already too big, make sure we start + * scanning from the last searched position */ + pos = end; + + GST_DEBUG_OBJECT (pay, "max size exceeded pu_size %u", pu_size); + break; + } + + pos = end; + + /* exit when finished */ + if (pos == size) + break; + + /* scan next packetization unit and fill in the header */ + end = find_pu_end (pay, data, size, pos, &state); + } while (TRUE); + + while (pu_size > 0) { + guint packet_size, data_size; + + /* calculate the packet size */ + packet_size = + gst_rtp_buffer_calc_packet_len (pu_size + HEADER_SIZE, 0, 0); + + if (packet_size > mtu) { + GST_DEBUG_OBJECT (pay, "needed packet size %u clamped to MTU %u", + packet_size, mtu); + packet_size = mtu; + } else { + GST_DEBUG_OBJECT (pay, "needed packet size %u fits in MTU %u", + packet_size, mtu); + } + + /* get total payload size and data size */ + payload_size = gst_rtp_buffer_calc_payload_len (packet_size, 0, 0); + data_size = payload_size - HEADER_SIZE; + + if (pay->buffer_list) { + /* make buffer for header */ + outbuf = gst_rtp_buffer_new_allocate (HEADER_SIZE, 0, 0); + } else { + /* make buffer for header and data */ + outbuf = gst_rtp_buffer_new_allocate (payload_size, 0, 0); + } + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + + /* get pointer to header */ + header = gst_rtp_buffer_get_payload (outbuf); + + pu_size -= data_size; + if (pu_size == 0) { + /* reached the end of a packetization unit */ + if (state.header.MHF) { + /* we were doing a header, see if all fit in one packet or if + * we had to fragment it */ + if (offset == 0) + state.header.MHF = 3; + else + state.header.MHF = 2; + } + if (end >= size) + gst_rtp_buffer_set_marker (outbuf, TRUE); + } + + /* + * RtpJ2KHeader: + * @tp: type (0 progressive, 1 odd field, 2 even field) + * @MHF: Main Header Flag + * @mh_id: Main Header Identification + * @T: Tile field invalidation flag + * @priority: priority + * @tile number: the tile number of the payload + * @reserved: set to 0 + * @fragment offset: the byte offset of the current payload + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |tp |MHF|mh_id|T| priority | tile number | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |reserved | fragment offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + header[0] = (state.header.tp << 6) | (state.header.MHF << 4) | + (state.header.mh_id << 1) | state.header.T; + header[1] = state.header.priority; + header[2] = state.header.tile >> 8; + header[3] = state.header.tile & 0xff; + header[4] = 0; + header[5] = state.header.offset >> 16; + header[6] = (state.header.offset >> 8) & 0xff; + header[7] = state.header.offset & 0xff; + + if (pay->buffer_list) { + GstBuffer *paybuf; + + /* make subbuffer of j2k data */ + paybuf = gst_buffer_create_sub (buffer, offset, data_size); + + /* create a new group to hold the header and the payload */ + gst_buffer_list_iterator_add_group (it); + + /* add both buffers to the buffer list */ + gst_buffer_list_iterator_add (it, outbuf); + gst_buffer_list_iterator_add (it, paybuf); + } else { + /* copy payload */ + memcpy (header + HEADER_SIZE, &data[offset], data_size); + + ret = gst_basertppayload_push (basepayload, outbuf); + if (ret != GST_FLOW_OK) + goto done; + } + + /* reset header for next round */ + state.header.MHF = 0; + state.header.T = 1; + state.header.tile = 0; + + offset += data_size; + } + offset = pos; + } while (offset < size); + +done: + gst_buffer_unref (buffer); + + if (pay->buffer_list) { + /* free iterator and push the whole buffer list at once */ + gst_buffer_list_iterator_free (it); + ret = gst_basertppayload_push_list (basepayload, list); + } + + return ret; +} + +static void +gst_rtp_j2k_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpJ2KPay *rtpj2kpay; + + rtpj2kpay = GST_RTP_J2K_PAY (object); + + switch (prop_id) { + case PROP_BUFFER_LIST: + rtpj2kpay->buffer_list = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_j2k_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpJ2KPay *rtpj2kpay; + + rtpj2kpay = GST_RTP_J2K_PAY (object); + + switch (prop_id) { + case PROP_BUFFER_LIST: + g_value_set_boolean (value, rtpj2kpay->buffer_list); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_rtp_j2k_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpj2kpay", GST_RANK_SECONDARY, + GST_TYPE_RTP_J2K_PAY); +} diff --git a/gst/rtp/gstrtpj2kpay.h b/gst/rtp/gstrtpj2kpay.h new file mode 100644 index 0000000..3042a3c --- /dev/null +++ b/gst/rtp/gstrtpj2kpay.h @@ -0,0 +1,63 @@ +/* GStreamer + * Copyright (C) 2009 Wim Taymans + * + * 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_RTP_J2K_PAY_H__ +#define __GST_RTP_J2K_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_J2K_PAY \ + (gst_rtp_j2k_pay_get_type()) +#define GST_RTP_J2K_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_J2K_PAY,GstRtpJ2KPay)) +#define GST_RTP_J2K_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_J2K_PAY,GstRtpJ2KPayClass)) +#define GST_IS_RTP_J2K_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_J2K_PAY)) +#define GST_IS_RTP_J2K_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_J2K_PAY)) + +typedef struct _GstRtpJ2KPay GstRtpJ2KPay; +typedef struct _GstRtpJ2KPayClass GstRtpJ2KPayClass; + +struct _GstRtpJ2KPay +{ + GstBaseRTPPayload payload; + + gboolean buffer_list; + + gint height; + gint width; +}; + +struct _GstRtpJ2KPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_j2k_pay_get_type (void); + +gboolean gst_rtp_j2k_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_J2K_PAY_H__ */ diff --git a/gst/rtp/gstrtpjpegdepay.c b/gst/rtp/gstrtpjpegdepay.c new file mode 100644 index 0000000..3c84397 --- /dev/null +++ b/gst/rtp/gstrtpjpegdepay.c @@ -0,0 +1,759 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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 + +#include +#include +#include +#include +#include "gstrtpjpegdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpjpegdepay_debug); +#define GST_CAT_DEFAULT (rtpjpegdepay_debug) + +static GstStaticPadTemplate gst_rtp_jpeg_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/jpeg") + ); + +static GstStaticPadTemplate gst_rtp_jpeg_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"JPEG\"; " + /* optional SDP attributes */ + /* + * "a-framerate = (string) 0.00, " + * "x-framerate = (string) 0.00, " + * "x-dimensions = (string) \"1234,1234\", " + */ + "application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_JPEG_STRING ", " + "clock-rate = (int) 90000" + /* optional SDP attributes */ + /* + * "a-framerate = (string) 0.00, " + * "x-framerate = (string) 0.00, " + * "x-dimensions = (string) \"1234,1234\"" + */ + ) + ); + +GST_BOILERPLATE (GstRtpJPEGDepay, gst_rtp_jpeg_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_jpeg_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_jpeg_depay_change_state (GstElement * + element, GstStateChange transition); + +static gboolean gst_rtp_jpeg_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_jpeg_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_jpeg_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_jpeg_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_jpeg_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP JPEG depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts JPEG video from RTP packets (RFC 2435)", + "Wim Taymans "); +} + +static void +gst_rtp_jpeg_depay_class_init (GstRtpJPEGDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_jpeg_depay_finalize; + + gstelement_class->change_state = gst_rtp_jpeg_depay_change_state; + + gstbasertpdepayload_class->set_caps = gst_rtp_jpeg_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_jpeg_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpjpegdepay_debug, "rtpjpegdepay", 0, + "JPEG Video RTP Depayloader"); +} + +static void +gst_rtp_jpeg_depay_init (GstRtpJPEGDepay * rtpjpegdepay, + GstRtpJPEGDepayClass * klass) +{ + rtpjpegdepay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_jpeg_depay_reset (GstRtpJPEGDepay * depay) +{ + gint i; + + depay->width = 0; + depay->height = 0; + depay->media_width = 0; + depay->media_height = 0; + depay->frate_num = 0; + depay->frate_denom = 1; + depay->discont = TRUE; + + for (i = 0; i < 255; i++) { + g_free (depay->qtables[i]); + depay->qtables[i] = NULL; + } + + gst_adapter_clear (depay->adapter); +} + +static void +gst_rtp_jpeg_depay_finalize (GObject * object) +{ + GstRtpJPEGDepay *rtpjpegdepay; + + rtpjpegdepay = GST_RTP_JPEG_DEPAY (object); + + gst_rtp_jpeg_depay_reset (rtpjpegdepay); + + g_object_unref (rtpjpegdepay->adapter); + rtpjpegdepay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* + * Table K.1 from JPEG spec. + */ +static const int jpeg_luma_quantizer[64] = { + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99 +}; + +/* + * Table K.2 from JPEG spec. + */ +static const int jpeg_chroma_quantizer[64] = { + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + +/* Call MakeTables with the Q factor and a guint8[128] return array + */ +static void +MakeTables (GstRtpJPEGDepay * rtpjpegdepay, gint Q, guint8 qtable[128]) +{ + gint i; + guint factor; + + factor = CLAMP (Q, 1, 99); + + if (Q < 50) + Q = 5000 / factor; + else + Q = 200 - factor * 2; + + for (i = 0; i < 64; i++) { + gint lq = (jpeg_luma_quantizer[i] * Q + 50) / 100; + gint cq = (jpeg_chroma_quantizer[i] * Q + 50) / 100; + + /* Limit the quantizers to 1 <= q <= 255 */ + qtable[i] = CLAMP (lq, 1, 255); + qtable[i + 64] = CLAMP (cq, 1, 255); + } +} + +static const guint8 lum_dc_codelens[] = { + 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 +}; + +static const guint8 lum_dc_symbols[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +}; + +static const guint8 lum_ac_codelens[] = { + 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d +}; + +static const guint8 lum_ac_symbols[] = { + 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa +}; + +static const guint8 chm_dc_codelens[] = { + 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 +}; + +static const guint8 chm_dc_symbols[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +}; + +static const guint8 chm_ac_codelens[] = { + 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 +}; + +static const guint8 chm_ac_symbols[] = { + 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa +}; + +static guint8 * +MakeQuantHeader (guint8 * p, guint8 * qt, gint size, gint tableNo) +{ + *p++ = 0xff; + *p++ = 0xdb; /* DQT */ + *p++ = 0; /* length msb */ + *p++ = size + 3; /* length lsb */ + *p++ = tableNo; + memcpy (p, qt, size); + + return (p + size); +} + +static guint8 * +MakeHuffmanHeader (guint8 * p, const guint8 * codelens, int ncodes, + const guint8 * symbols, int nsymbols, int tableNo, int tableClass) +{ + *p++ = 0xff; + *p++ = 0xc4; /* DHT */ + *p++ = 0; /* length msb */ + *p++ = 3 + ncodes + nsymbols; /* length lsb */ + *p++ = (tableClass << 4) | tableNo; + memcpy (p, codelens, ncodes); + p += ncodes; + memcpy (p, symbols, nsymbols); + p += nsymbols; + + return (p); +} + +static guint8 * +MakeDRIHeader (guint8 * p, guint16 dri) +{ + *p++ = 0xff; + *p++ = 0xdd; /* DRI */ + *p++ = 0x0; /* length msb */ + *p++ = 4; /* length lsb */ + *p++ = dri >> 8; /* dri msb */ + *p++ = dri & 0xff; /* dri lsb */ + + return (p); +} + +/* + * Arguments: + * type, width, height: as supplied in RTP/JPEG header + * qt: quantization tables as either derived from + * the Q field using MakeTables() or as specified + * in section 4.2. + * dri: restart interval in MCUs, or 0 if no restarts. + * + * p: pointer to return area + * + * Return value: + * The length of the generated headers. + * + * Generate a frame and scan headers that can be prepended to the + * RTP/JPEG data payload to produce a JPEG compressed image in + * interchange format (except for possible trailing garbage and + * absence of an EOI marker to terminate the scan). + */ +static guint +MakeHeaders (guint8 * p, int type, int width, int height, guint8 * qt, + guint precision, guint16 dri) +{ + guint8 *start = p; + gint size; + + *p++ = 0xff; + *p++ = 0xd8; /* SOI */ + + size = ((precision & 1) ? 128 : 64); + p = MakeQuantHeader (p, qt, size, 0); + qt += size; + + size = ((precision & 2) ? 128 : 64); + p = MakeQuantHeader (p, qt, size, 1); + qt += size; + + if (dri != 0) + p = MakeDRIHeader (p, dri); + + *p++ = 0xff; + *p++ = 0xc0; /* SOF */ + *p++ = 0; /* length msb */ + *p++ = 17; /* length lsb */ + *p++ = 8; /* 8-bit precision */ + *p++ = height >> 8; /* height msb */ + *p++ = height; /* height lsb */ + *p++ = width >> 8; /* width msb */ + *p++ = width; /* width lsb */ + *p++ = 3; /* number of components */ + *p++ = 0; /* comp 0 */ + if ((type & 0x3f) == 0) + *p++ = 0x21; /* hsamp = 2, vsamp = 1 */ + else + *p++ = 0x22; /* hsamp = 2, vsamp = 2 */ + *p++ = 0; /* quant table 0 */ + *p++ = 1; /* comp 1 */ + *p++ = 0x11; /* hsamp = 1, vsamp = 1 */ + *p++ = 1; /* quant table 1 */ + *p++ = 2; /* comp 2 */ + *p++ = 0x11; /* hsamp = 1, vsamp = 1 */ + *p++ = 1; /* quant table 1 */ + + p = MakeHuffmanHeader (p, lum_dc_codelens, + sizeof (lum_dc_codelens), lum_dc_symbols, sizeof (lum_dc_symbols), 0, 0); + p = MakeHuffmanHeader (p, lum_ac_codelens, + sizeof (lum_ac_codelens), lum_ac_symbols, sizeof (lum_ac_symbols), 0, 1); + p = MakeHuffmanHeader (p, chm_dc_codelens, + sizeof (chm_dc_codelens), chm_dc_symbols, sizeof (chm_dc_symbols), 1, 0); + p = MakeHuffmanHeader (p, chm_ac_codelens, + sizeof (chm_ac_codelens), chm_ac_symbols, sizeof (chm_ac_symbols), 1, 1); + + *p++ = 0xff; + *p++ = 0xda; /* SOS */ + *p++ = 0; /* length msb */ + *p++ = 12; /* length lsb */ + *p++ = 3; /* 3 components */ + *p++ = 0; /* comp 0 */ + *p++ = 0; /* huffman table 0 */ + *p++ = 1; /* comp 1 */ + *p++ = 0x11; /* huffman table 1 */ + *p++ = 2; /* comp 2 */ + *p++ = 0x11; /* huffman table 1 */ + *p++ = 0; /* first DCT coeff */ + *p++ = 63; /* last DCT coeff */ + *p++ = 0; /* sucessive approx. */ + + return (p - start); +}; + +static gboolean +gst_rtp_jpeg_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstRtpJPEGDepay *rtpjpegdepay; + GstStructure *structure; + gint clock_rate; + const gchar *media_attr; + + rtpjpegdepay = GST_RTP_JPEG_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + GST_DEBUG_OBJECT (rtpjpegdepay, "Caps set: %" GST_PTR_FORMAT, caps); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; + depayload->clock_rate = clock_rate; + + /* reset defaults */ + rtpjpegdepay->width = 0; + rtpjpegdepay->height = 0; + rtpjpegdepay->media_width = 0; + rtpjpegdepay->media_height = 0; + rtpjpegdepay->frate_num = 0; + rtpjpegdepay->frate_denom = 1; + + /* check for optional SDP attributes */ + if ((media_attr = gst_structure_get_string (structure, "x-dimensions"))) { + gint w, h; + + if (sscanf (media_attr, "%d,%d", &w, &h) == 2) { + rtpjpegdepay->media_width = w; + rtpjpegdepay->media_height = h; + } + } + + /* try to get a framerate */ + media_attr = gst_structure_get_string (structure, "a-framerate"); + if (!media_attr) + media_attr = gst_structure_get_string (structure, "x-framerate"); + + if (media_attr) { + GValue src = { 0 }; + GValue dest = { 0 }; + gchar *s; + + /* canonicalise floating point string so we can handle framerate strings + * in the form "24.930" or "24,930" irrespective of the current locale */ + s = g_strdup (media_attr); + g_strdelimit (s, ",", '.'); + + /* convert the float to a fraction */ + g_value_init (&src, G_TYPE_DOUBLE); + g_value_set_double (&src, g_ascii_strtod (s, NULL)); + g_value_init (&dest, GST_TYPE_FRACTION); + g_value_transform (&src, &dest); + + rtpjpegdepay->frate_num = gst_value_get_fraction_numerator (&dest); + rtpjpegdepay->frate_denom = gst_value_get_fraction_denominator (&dest); + + g_free (s); + } + + return TRUE; +} + +static GstBuffer * +gst_rtp_jpeg_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpJPEGDepay *rtpjpegdepay; + GstBuffer *outbuf; + gint payload_len, header_len; + guint8 *payload; + guint frag_offset; + gint Q; + guint type, width, height; + guint16 dri, precision, length; + guint8 *qtable; + + rtpjpegdepay = GST_RTP_JPEG_DEPAY (depayload); + + if (GST_BUFFER_IS_DISCONT (buf)) { + gst_adapter_clear (rtpjpegdepay->adapter); + rtpjpegdepay->discont = TRUE; + } + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + if (payload_len < 8) + goto empty_packet; + + payload = gst_rtp_buffer_get_payload (buf); + header_len = 0; + + /* 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type-specific | Fragment Offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type | Q | Width | Height | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + frag_offset = (payload[1] << 16) | (payload[2] << 8) | payload[3]; + type = payload[4]; + Q = payload[5]; + width = payload[6] * 8; + height = payload[7] * 8; + + /* allow frame dimensions > 2040, passed in SDP session or media attributes + * from gstrtspsrc.c (gst_rtspsrc_sdp_attributes_to_caps), or in caps */ + if (!width) + width = rtpjpegdepay->media_width; + + if (!height) + height = rtpjpegdepay->media_height; + + if (width == 0 || height == 0) + goto invalid_dimension; + + GST_DEBUG_OBJECT (rtpjpegdepay, "frag %u, type %u, Q %d, width %u, height %u", + frag_offset, type, Q, width, height); + + header_len += 8; + payload += 8; + payload_len -= 8; + + dri = 0; + if (type > 63) { + if (payload_len < 4) + goto empty_packet; + + /* 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Restart Interval |F|L| Restart Count | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + dri = (payload[0] << 8) | payload[1]; + + GST_DEBUG_OBJECT (rtpjpegdepay, "DRI %" G_GUINT16_FORMAT, dri); + + payload += 4; + header_len += 4; + payload_len -= 4; + } + + if (Q >= 128 && frag_offset == 0) { + if (payload_len < 4) + goto empty_packet; + + /* 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | MBZ | Precision | Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Quantization Table Data | + * | ... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + precision = payload[1]; + length = (payload[2] << 8) | payload[3]; + + GST_DEBUG_OBJECT (rtpjpegdepay, "precision %04x, length %" G_GUINT16_FORMAT, + precision, length); + + if (Q == 255 && length == 0) + goto empty_packet; + + payload += 4; + header_len += 4; + payload_len -= 4; + + if (length > payload_len) + goto empty_packet; + + if (length > 0) + qtable = payload; + else + qtable = rtpjpegdepay->qtables[Q]; + + payload += length; + header_len += length; + payload_len -= length; + } else { + length = 0; + qtable = NULL; + precision = 0; + } + + if (frag_offset == 0) { + guint size; + + if (rtpjpegdepay->width != width || rtpjpegdepay->height != height) { + GstCaps *outcaps; + + outcaps = + gst_caps_new_simple ("image/jpeg", "framerate", GST_TYPE_FRACTION, + rtpjpegdepay->frate_num, rtpjpegdepay->frate_denom, "width", + G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); + gst_pad_set_caps (depayload->srcpad, outcaps); + gst_caps_unref (outcaps); + + rtpjpegdepay->width = width; + rtpjpegdepay->height = height; + } + + GST_LOG_OBJECT (rtpjpegdepay, "first packet, length %" G_GUINT16_FORMAT, + length); + + /* first packet */ + if (length == 0) { + if (Q < 128) { + /* no quant table, see if we have one cached */ + qtable = rtpjpegdepay->qtables[Q]; + if (!qtable) { + GST_DEBUG_OBJECT (rtpjpegdepay, "making Q %d table", Q); + /* make and cache the table */ + qtable = g_new (guint8, 128); + MakeTables (rtpjpegdepay, Q, qtable); + rtpjpegdepay->qtables[Q] = qtable; + } else { + GST_DEBUG_OBJECT (rtpjpegdepay, "using cached table for Q %d", Q); + } + /* all 8 bit quantizers */ + precision = 0; + } else { + if (!qtable) + goto no_qtable; + } + } + /* max header length, should be big enough */ + outbuf = gst_buffer_new_and_alloc (1000); + size = MakeHeaders (GST_BUFFER_DATA (outbuf), type, + width, height, qtable, precision, dri); + + GST_DEBUG_OBJECT (rtpjpegdepay, "pushing %u bytes of header", size); + + GST_BUFFER_SIZE (outbuf) = size; + + gst_adapter_push (rtpjpegdepay->adapter, outbuf); + } + + /* take JPEG data, push in the adapter */ + GST_DEBUG_OBJECT (rtpjpegdepay, "pushing data at offset %d", header_len); + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, header_len, -1); + gst_adapter_push (rtpjpegdepay->adapter, outbuf); + outbuf = NULL; + + if (gst_rtp_buffer_get_marker (buf)) { + guint avail; + guint8 end[2]; + guint8 *data; + + /* last buffer take all data out of the adapter */ + avail = gst_adapter_available (rtpjpegdepay->adapter); + GST_DEBUG_OBJECT (rtpjpegdepay, "marker set, last buffer"); + + /* take the last bytes of the jpeg data to see if there is an EOI + * marker */ + gst_adapter_copy (rtpjpegdepay->adapter, end, avail - 2, 2); + + if (end[0] != 0xff && end[1] != 0xd9) { + GST_DEBUG_OBJECT (rtpjpegdepay, "no EOI marker, adding one"); + + /* no EOI marker, add one */ + outbuf = gst_buffer_new_and_alloc (2); + data = GST_BUFFER_DATA (outbuf); + data[0] = 0xff; + data[1] = 0xd9; + + gst_adapter_push (rtpjpegdepay->adapter, outbuf); + avail += 2; + } + outbuf = gst_adapter_take_buffer (rtpjpegdepay->adapter, avail); + + if (rtpjpegdepay->discont) { + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + rtpjpegdepay->discont = FALSE; + } + + GST_DEBUG_OBJECT (rtpjpegdepay, "returning %u bytes", avail); + } + + return outbuf; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpjpegdepay, STREAM, DECODE, + ("Empty Payload."), (NULL)); + return NULL; + } +invalid_dimension: + { + GST_ELEMENT_WARNING (rtpjpegdepay, STREAM, FORMAT, + ("Invalid Dimension %dx%d.", width, height), (NULL)); + return NULL; + } +no_qtable: + { + GST_WARNING_OBJECT (rtpjpegdepay, "no qtable"); + return NULL; + } +} + + +static GstStateChangeReturn +gst_rtp_jpeg_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpJPEGDepay *rtpjpegdepay; + GstStateChangeReturn ret; + + rtpjpegdepay = GST_RTP_JPEG_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_jpeg_depay_reset (rtpjpegdepay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + default: + break; + } + return ret; +} + + +gboolean +gst_rtp_jpeg_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpjpegdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_JPEG_DEPAY); +} diff --git a/gst/rtp/gstrtpjpegdepay.h b/gst/rtp/gstrtpjpegdepay.h new file mode 100644 index 0000000..11e6f31 --- /dev/null +++ b/gst/rtp/gstrtpjpegdepay.h @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_JPEG_DEPAY_H__ +#define __GST_RTP_JPEG_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_JPEG_DEPAY \ + (gst_rtp_jpeg_depay_get_type()) +#define GST_RTP_JPEG_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_JPEG_DEPAY,GstRtpJPEGDepay)) +#define GST_RTP_JPEG_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_JPEG_DEPAY,GstRtpJPEGDepayClass)) +#define GST_IS_RTP_JPEG_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_JPEG_DEPAY)) +#define GST_IS_RTP_JPEG_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_JPEG_DEPAY)) + +typedef struct _GstRtpJPEGDepay GstRtpJPEGDepay; +typedef struct _GstRtpJPEGDepayClass GstRtpJPEGDepayClass; + +struct _GstRtpJPEGDepay +{ + GstBaseRTPDepayload depayload; + + GstAdapter *adapter; + gboolean discont; + + /* cached quant tables */ + guint8 * qtables[255]; + gint frate_num; + gint frate_denom; + gint media_width; + gint media_height; + gint width, height; +}; + +struct _GstRtpJPEGDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_jpeg_depay_get_type (void); + +gboolean gst_rtp_jpeg_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_JPEG_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpjpegpay.c b/gst/rtp/gstrtpjpegpay.c new file mode 100644 index 0000000..eae2840 --- /dev/null +++ b/gst/rtp/gstrtpjpegpay.c @@ -0,0 +1,934 @@ +/* GStreamer + * Copyright (C) 2008 Axis Communications + * @author Bjorn Ostby + * @author Peter Kjellerstedt + * + * 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-rtpjpegpay + * + * Payload encode JPEG pictures into RTP packets according to RFC 2435. + * For detailed information see: http://www.rfc-editor.org/rfc/rfc2435.txt + * + * The payloader takes a JPEG picture, scans the header for quantization + * tables (if needed) and constructs the RTP packet header followed by + * the actual JPEG entropy scan. + * + * The payloader assumes that correct width and height is found in the caps. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "gstrtpjpegpay.h" + +static GstStaticPadTemplate gst_rtp_jpeg_pay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/jpeg; " "video/x-jpeg") + ); + +static GstStaticPadTemplate gst_rtp_jpeg_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + " media = (string) \"video\", " + " payload = (int) 26 , " + " clock-rate = (int) 90000, " " encoding-name = (string) \"JPEG\"") + ); + +GST_DEBUG_CATEGORY_STATIC (rtpjpegpay_debug); +#define GST_CAT_DEFAULT (rtpjpegpay_debug) + +/* + * QUANT_PREFIX_LEN: + * + * Prefix length in the header before the quantization tables: + * Two size bytes and one byte for precision + */ +#define QUANT_PREFIX_LEN 3 + +/* + * DEFAULT_BUFFER_LIST: + * + */ +#define DEFAULT_BUFFER_LIST FALSE + +typedef enum _RtpJpegMarker RtpJpegMarker; + +/* + * RtpJpegMarker: + * @JPEG_MARKER: Prefix for JPEG marker + * @JPEG_MARKER_SOI: Start of Image marker + * @JPEG_MARKER_JFIF: JFIF marker + * @JPEG_MARKER_CMT: Comment marker + * @JPEG_MARKER_DQT: Define Quantization Table marker + * @JPEG_MARKER_SOF: Start of Frame marker + * @JPEG_MARKER_DHT: Define Huffman Table marker + * @JPEG_MARKER_SOS: Start of Scan marker + * @JPEG_MARKER_EOI: End of Image marker + * @JPEG_MARKER_DRI: Define Restart Interval marker + * @JPEG_MARKER_H264: H264 marker + * + * Identifers for markers in JPEG header + */ +enum _RtpJpegMarker +{ + JPEG_MARKER = 0xFF, + JPEG_MARKER_SOI = 0xD8, + JPEG_MARKER_JFIF = 0xE0, + JPEG_MARKER_CMT = 0xFE, + JPEG_MARKER_DQT = 0xDB, + JPEG_MARKER_SOF = 0xC0, + JPEG_MARKER_DHT = 0xC4, + JPEG_MARKER_SOS = 0xDA, + JPEG_MARKER_EOI = 0xD9, + JPEG_MARKER_DRI = 0xDD, + JPEG_MARKER_H264 = 0xE4 +}; + +#define DEFAULT_JPEG_QUANT 255 + +#define DEFAULT_JPEG_QUALITY 255 +#define DEFAULT_JPEG_TYPE 1 + +enum +{ + PROP_0, + PROP_JPEG_QUALITY, + PROP_JPEG_TYPE, + PROP_BUFFER_LIST, + PROP_LAST +}; + +enum +{ + Q_TABLE_0 = 0, + Q_TABLE_1, + Q_TABLE_MAX /* only support for two tables at the moment */ +}; + +typedef struct _RtpJpegHeader RtpJpegHeader; + +/* + * RtpJpegHeader: + * @type_spec: type specific + * @offset: fragment offset + * @type: type field + * @q: quantization table for this frame + * @width: width of image in 8-pixel multiples + * @height: height of image in 8-pixel multiples + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type-specific | Fragment Offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type | Q | Width | Height | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ +struct _RtpJpegHeader +{ + guint type_spec:8; + guint offset:24; + guint8 type; + guint8 q; + guint8 width; + guint8 height; +}; + +/* + * RtpQuantHeader + * @mbz: must be zero + * @precision: specify size of quantization tables + * @length: length of quantization data + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | MBZ | Precision | Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Quantization Table Data | + * | ... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ +typedef struct +{ + guint8 mbz; + guint8 precision; + guint16 length; +} RtpQuantHeader; + +typedef struct +{ + guint8 size; + const guint8 *data; +} RtpQuantTable; + +/* + * RtpRestartMarkerHeader: + * @restartInterval: number of MCUs that appear between restart markers + * @restartFirstLastCount: a combination of the first packet mark in the chunk + * last packet mark in the chunk and the position of the + * first restart interval in the current "chunk" + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Restart Interval |F|L| Restart Count | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * The restart marker header is implemented according to the following + * methodology specified in section 3.1.7 of rfc2435.txt. + * + * "If the restart intervals in a frame are not guaranteed to be aligned + * with packet boundaries, the F (first) and L (last) bits MUST be set + * to 1 and the Restart Count MUST be set to 0x3FFF. This indicates + * that a receiver MUST reassemble the entire frame before decoding it." + * + */ + +typedef struct +{ + guint16 restart_interval; + guint16 restart_count; +} RtpRestartMarkerHeader; + +typedef struct +{ + guint8 id; + guint8 samp; + guint8 qt; +} CompInfo; + +/* FIXME: restart marker header currently unsupported */ + +static void gst_rtp_jpeg_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static void gst_rtp_jpeg_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_rtp_jpeg_pay_setcaps (GstBaseRTPPayload * basepayload, + GstCaps * caps); + +static GstFlowReturn gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * pad, + GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpJPEGPay, gst_rtp_jpeg_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_jpeg_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_jpeg_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_jpeg_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP JPEG payloader", + "Codec/Payloader/Network/RTP", + "Payload-encodes JPEG pictures into RTP packets (RFC 2435)", + "Axis Communications "); +} + +static void +gst_rtp_jpeg_pay_class_init (GstRtpJPEGPayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->set_property = gst_rtp_jpeg_pay_set_property; + gobject_class->get_property = gst_rtp_jpeg_pay_get_property; + + gstbasertppayload_class->set_caps = gst_rtp_jpeg_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_jpeg_pay_handle_buffer; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_JPEG_QUALITY, + g_param_spec_int ("quality", "Quality", + "Quality factor on JPEG data (unused)", 0, 255, 255, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_JPEG_TYPE, + g_param_spec_int ("type", "Type", + "Default JPEG Type, overwritten by SOF when present", 0, 255, + DEFAULT_JPEG_TYPE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, + g_param_spec_boolean ("buffer-list", "Buffer List", + "Use Buffer Lists", + DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (rtpjpegpay_debug, "rtpjpegpay", 0, + "Motion JPEG RTP Payloader"); +} + +static void +gst_rtp_jpeg_pay_init (GstRtpJPEGPay * pay, GstRtpJPEGPayClass * klass) +{ + pay->quality = DEFAULT_JPEG_QUALITY; + pay->quant = DEFAULT_JPEG_QUANT; + pay->type = DEFAULT_JPEG_TYPE; + pay->buffer_list = DEFAULT_BUFFER_LIST; +} + +static gboolean +gst_rtp_jpeg_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +{ + GstStructure *caps_structure = gst_caps_get_structure (caps, 0); + GstRtpJPEGPay *pay; + gboolean res; + gint width = 0, height = 0; + + pay = GST_RTP_JPEG_PAY (basepayload); + + /* these properties are not mandatory, we can get them from the SOF, if there + * is one. */ + if (gst_structure_get_int (caps_structure, "height", &height)) { + if (height <= 0 || height > 2040) + goto invalid_dimension; + } + pay->height = GST_ROUND_UP_8 (height) / 8; + + if (gst_structure_get_int (caps_structure, "width", &width)) { + if (width <= 0 || width > 2040) + goto invalid_dimension; + } + pay->width = GST_ROUND_UP_8 (width) / 8; + + gst_basertppayload_set_options (basepayload, "video", TRUE, "JPEG", 90000); + res = gst_basertppayload_set_outcaps (basepayload, NULL); + + return res; + + /* ERRORS */ +invalid_dimension: + { + GST_ERROR_OBJECT (pay, "Invalid width/height from caps"); + return FALSE; + } +} + +static guint +gst_rtp_jpeg_pay_header_size (const guint8 * data, guint offset) +{ + return data[offset] << 8 | data[offset + 1]; +} + +static guint +gst_rtp_jpeg_pay_read_quant_table (const guint8 * data, guint size, + guint offset, RtpQuantTable tables[]) +{ + guint quant_size, tab_size; + guint8 prec; + guint8 id; + + if (offset + 2 > size) + goto too_small; + + quant_size = gst_rtp_jpeg_pay_header_size (data, offset); + if (quant_size < 2) + goto small_quant_size; + + /* clamp to available data */ + if (offset + quant_size > size) + quant_size = size - offset; + + offset += 2; + quant_size -= 2; + + while (quant_size > 0) { + /* not enough to read the id */ + if (offset + 1 > size) + break; + + id = data[offset] & 0x0f; + if (id == 15) + /* invalid id received - corrupt data */ + goto invalid_id; + + prec = (data[offset] & 0xf0) >> 4; + if (prec) + tab_size = 128; + else + tab_size = 64; + + /* there is not enough for the table */ + if (quant_size < tab_size + 1) + goto no_table; + + GST_LOG ("read quant table %d, tab_size %d, prec %02x", id, tab_size, prec); + + tables[id].size = tab_size; + tables[id].data = &data[offset + 1]; + + tab_size += 1; + quant_size -= tab_size; + offset += tab_size; + } +done: + return offset + quant_size; + + /* ERRORS */ +too_small: + { + GST_WARNING ("not enough data"); + return size; + } +small_quant_size: + { + GST_WARNING ("quant_size too small (%u < 2)", quant_size); + return size; + } +invalid_id: + { + GST_WARNING ("invalid id"); + goto done; + } +no_table: + { + GST_WARNING ("not enough data for table (%u < %u)", quant_size, + tab_size + 1); + goto done; + } +} + +static gboolean +gst_rtp_jpeg_pay_read_sof (GstRtpJPEGPay * pay, const guint8 * data, + guint size, guint * offset, CompInfo info[]) +{ + guint sof_size, off; + guint width, height, infolen; + CompInfo elem; + gint i, j; + + off = *offset; + + /* we need at least 17 bytes for the SOF */ + if (off + 17 > size) + goto wrong_size; + + sof_size = gst_rtp_jpeg_pay_header_size (data, off); + if (sof_size < 17) + goto wrong_length; + + *offset += sof_size; + + /* skip size */ + off += 2; + + /* precision should be 8 */ + if (data[off++] != 8) + goto bad_precision; + + /* read dimensions */ + height = data[off] << 8 | data[off + 1]; + width = data[off + 2] << 8 | data[off + 3]; + off += 4; + + GST_LOG_OBJECT (pay, "got dimensions %ux%u", height, width); + + if (height == 0 || height > 2040) + goto invalid_dimension; + if (width == 0 || width > 2040) + goto invalid_dimension; + + pay->height = GST_ROUND_UP_8 (height) / 8; + pay->width = GST_ROUND_UP_8 (width) / 8; + + /* we only support 3 components */ + if (data[off++] != 3) + goto bad_components; + + infolen = 0; + for (i = 0; i < 3; i++) { + elem.id = data[off++]; + elem.samp = data[off++]; + elem.qt = data[off++]; + GST_LOG_OBJECT (pay, "got comp %d, samp %02x, qt %d", elem.id, elem.samp, + elem.qt); + /* insertion sort from the last element to the first */ + for (j = infolen; j > 1; j--) { + if (G_LIKELY (info[j - 1].id < elem.id)) + break; + info[j] = info[j - 1]; + } + info[j] = elem; + infolen++; + } + + /* see that the components are supported */ + if (info[0].samp == 0x21) + pay->type = 0; + else if (info[0].samp == 0x22) + pay->type = 1; + else + goto invalid_comp; + + if (!(info[1].samp == 0x11)) + goto invalid_comp; + + if (!(info[2].samp == 0x11)) + goto invalid_comp; + + /* the other components are free to use any quant table but they have to + * have the same table id */ + if (info[1].qt != info[2].qt) + goto invalid_comp; + + return TRUE; + + /* ERRORS */ +wrong_size: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, + ("Wrong size %u (needed %u).", size, off + 17), (NULL)); + return FALSE; + } +wrong_length: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, + ("Wrong SOF length %u.", sof_size), (NULL)); + return FALSE; + } +bad_precision: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, + ("Wrong precision, expecting 8."), (NULL)); + return FALSE; + } +invalid_dimension: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, + ("Wrong dimension, size %ux%u", width, height), (NULL)); + return FALSE; + } +bad_components: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, + ("Wrong number of components"), (NULL)); + return FALSE; + } +invalid_comp: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Invalid component"), (NULL)); + return FALSE; + } +} + +static gboolean +gst_rtp_jpeg_pay_read_dri (GstRtpJPEGPay * pay, const guint8 * data, + guint size, guint * offset, RtpRestartMarkerHeader * dri) +{ + guint dri_size, off; + + off = *offset; + + /* we need at least 4 bytes for the DRI */ + if (off + 4 > size) + goto wrong_size; + + dri_size = gst_rtp_jpeg_pay_header_size (data, off); + if (dri_size < 4) + goto wrong_length; + + *offset += dri_size; + off += 2; + + dri->restart_interval = g_htons ((data[off] << 8) | (data[off + 1])); + dri->restart_count = g_htons (0xFFFF); + + return dri->restart_interval > 0; + +wrong_size: + { + GST_WARNING ("not enough data for DRI"); + *offset = size; + return FALSE; + } +wrong_length: + { + GST_WARNING ("DRI size too small (%u)", dri_size); + *offset += dri_size; + return FALSE; + } +} + +static RtpJpegMarker +gst_rtp_jpeg_pay_scan_marker (const guint8 * data, guint size, guint * offset) +{ + while ((data[(*offset)++] != JPEG_MARKER) && ((*offset) < size)); + + if (G_UNLIKELY ((*offset) >= size)) { + GST_LOG ("found EOI marker"); + return JPEG_MARKER_EOI; + } else { + guint8 marker; + + marker = data[*offset]; + GST_LOG ("found 0x%02x marker at offset %u", marker, *offset); + (*offset)++; + return marker; + } +} + +static GstFlowReturn +gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpJPEGPay *pay; + GstClockTime timestamp; + GstFlowReturn ret = GST_FLOW_ERROR; + RtpJpegHeader jpeg_header; + RtpQuantHeader quant_header; + RtpRestartMarkerHeader restart_marker_header; + RtpQuantTable tables[15] = { {0, NULL}, }; + CompInfo info[3] = { {0,}, }; + guint quant_data_size; + guint8 *data; + guint size; + guint mtu; + guint bytes_left; + guint jpeg_header_size = 0; + guint offset; + gboolean frame_done; + gboolean sos_found, sof_found, dqt_found, dri_found; + gint i; + GstBufferList *list = NULL; + GstBufferListIterator *it = NULL; + + pay = GST_RTP_JPEG_PAY (basepayload); + mtu = GST_BASE_RTP_PAYLOAD_MTU (pay); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + offset = 0; + + GST_LOG_OBJECT (pay, "got buffer size %u, timestamp %" GST_TIME_FORMAT, size, + GST_TIME_ARGS (timestamp)); + + /* parse the jpeg header for 'start of scan' and read quant tables if needed */ + sos_found = FALSE; + dqt_found = FALSE; + sof_found = FALSE; + dri_found = FALSE; + + while (!sos_found && (offset < size)) { + GST_LOG_OBJECT (pay, "checking from offset %u", offset); + switch (gst_rtp_jpeg_pay_scan_marker (data, size, &offset)) { + case JPEG_MARKER_JFIF: + case JPEG_MARKER_CMT: + case JPEG_MARKER_DHT: + case JPEG_MARKER_H264: + GST_LOG_OBJECT (pay, "skipping marker"); + offset += gst_rtp_jpeg_pay_header_size (data, offset); + break; + case JPEG_MARKER_SOF: + if (!gst_rtp_jpeg_pay_read_sof (pay, data, size, &offset, info)) + goto invalid_format; + sof_found = TRUE; + break; + case JPEG_MARKER_DQT: + GST_LOG ("DQT found"); + offset = gst_rtp_jpeg_pay_read_quant_table (data, size, offset, tables); + dqt_found = TRUE; + break; + case JPEG_MARKER_SOS: + sos_found = TRUE; + GST_LOG_OBJECT (pay, "SOS found"); + jpeg_header_size = offset + gst_rtp_jpeg_pay_header_size (data, offset); + break; + case JPEG_MARKER_EOI: + GST_WARNING_OBJECT (pay, "EOI reached before SOS!"); + break; + case JPEG_MARKER_SOI: + GST_LOG_OBJECT (pay, "SOI found"); + break; + case JPEG_MARKER_DRI: + GST_LOG_OBJECT (pay, "DRI found"); + if (gst_rtp_jpeg_pay_read_dri (pay, data, size, &offset, + &restart_marker_header)) + dri_found = TRUE; + break; + default: + break; + } + } + if (!dqt_found || !sof_found) + goto unsupported_jpeg; + + /* by now we should either have negotiated the width/height or the SOF header + * should have filled us in */ + if (pay->width == 0 || pay->height == 0) + goto no_dimension; + + GST_LOG_OBJECT (pay, "header size %u", jpeg_header_size); + + size -= jpeg_header_size; + data += jpeg_header_size; + offset = 0; + + if (dri_found) + pay->type += 64; + + /* prepare stuff for the jpeg header */ + jpeg_header.type_spec = 0; + jpeg_header.type = pay->type; + jpeg_header.q = pay->quant; + jpeg_header.width = pay->width; + jpeg_header.height = pay->height; + + /* collect the quant headers sizes */ + quant_header.mbz = 0; + quant_header.precision = 0; + quant_header.length = 0; + quant_data_size = 0; + + if (pay->quant > 127) { + /* for the Y and U component, look up the quant table and its size. quant + * tables for U and V should be the same */ + for (i = 0; i < 2; i++) { + guint qsize; + guint qt; + + qt = info[i].qt; + if (qt >= G_N_ELEMENTS (tables)) + goto invalid_quant; + + qsize = tables[qt].size; + if (qsize == 0) + goto invalid_quant; + + quant_header.precision |= (qsize == 64 ? 0 : (1 << i)); + quant_data_size += qsize; + } + quant_header.length = g_htons (quant_data_size); + quant_data_size += sizeof (quant_header); + } + + GST_LOG_OBJECT (pay, "quant_data size %u", quant_data_size); + + if (pay->buffer_list) { + list = gst_buffer_list_new (); + it = gst_buffer_list_iterate (list); + } + + bytes_left = sizeof (jpeg_header) + quant_data_size + size; + + if (dri_found) + bytes_left += sizeof (restart_marker_header); + + frame_done = FALSE; + do { + GstBuffer *outbuf; + guint8 *payload; + guint payload_size = (bytes_left < mtu ? bytes_left : mtu); + + if (pay->buffer_list) { + guint header_size; + + header_size = sizeof (jpeg_header) + quant_data_size; + if (dri_found) + header_size += sizeof (restart_marker_header); + + outbuf = gst_rtp_buffer_new_allocate (header_size, 0, 0); + } else { + outbuf = gst_rtp_buffer_new_allocate (payload_size, 0, 0); + } + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + + if (payload_size == bytes_left) { + GST_LOG_OBJECT (pay, "last packet of frame"); + frame_done = TRUE; + gst_rtp_buffer_set_marker (outbuf, 1); + } + + payload = gst_rtp_buffer_get_payload (outbuf); + + /* update offset */ +#if (G_BYTE_ORDER == G_LITTLE_ENDIAN) + jpeg_header.offset = ((offset & 0x0000FF) << 16) | + ((offset & 0xFF0000) >> 16) | (offset & 0x00FF00); +#else + jpeg_header.offset = offset; +#endif + memcpy (payload, &jpeg_header, sizeof (jpeg_header)); + payload += sizeof (jpeg_header); + payload_size -= sizeof (jpeg_header); + + if (dri_found) { + memcpy (payload, &restart_marker_header, sizeof (restart_marker_header)); + payload += sizeof (restart_marker_header); + payload_size -= sizeof (restart_marker_header); + } + + /* only send quant table with first packet */ + if (G_UNLIKELY (quant_data_size > 0)) { + memcpy (payload, &quant_header, sizeof (quant_header)); + payload += sizeof (quant_header); + + /* copy the quant tables for luma and chrominance */ + for (i = 0; i < 2; i++) { + guint qsize; + guint qt; + + qt = info[i].qt; + qsize = tables[qt].size; + memcpy (payload, tables[qt].data, qsize); + + GST_LOG_OBJECT (pay, "component %d using quant %d, size %d", i, qt, + qsize); + + payload += qsize; + } + payload_size -= quant_data_size; + bytes_left -= quant_data_size; + quant_data_size = 0; + } + GST_LOG_OBJECT (pay, "sending payload size %d", payload_size); + + if (pay->buffer_list) { + GstBuffer *paybuf; + + /* create a new buf to hold the payload */ + paybuf = gst_buffer_create_sub (buffer, jpeg_header_size + offset, + payload_size); + + /* create a new group to hold the rtp header and the payload */ + gst_buffer_list_iterator_add_group (it); + gst_buffer_list_iterator_add (it, outbuf); + gst_buffer_list_iterator_add (it, paybuf); + } else { + memcpy (payload, data, payload_size); + ret = gst_basertppayload_push (basepayload, outbuf); + if (ret != GST_FLOW_OK) + break; + } + + bytes_left -= payload_size; + offset += payload_size; + data += payload_size; + } + while (!frame_done); + + if (pay->buffer_list) { + gst_buffer_list_iterator_free (it); + /* push the whole buffer list at once */ + ret = gst_basertppayload_push_list (basepayload, list); + } + + gst_buffer_unref (buffer); + + return ret; + + /* ERRORS */ +unsupported_jpeg: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Unsupported JPEG"), (NULL)); + gst_buffer_unref (buffer); + return GST_FLOW_NOT_SUPPORTED; + } +no_dimension: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("No size given"), (NULL)); + gst_buffer_unref (buffer); + return GST_FLOW_NOT_NEGOTIATED; + } +invalid_format: + { + /* error was posted */ + gst_buffer_unref (buffer); + return GST_FLOW_ERROR; + } +invalid_quant: + { + GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Invalid quant tables"), (NULL)); + gst_buffer_unref (buffer); + return GST_FLOW_ERROR; + } +} + +static void +gst_rtp_jpeg_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpJPEGPay *rtpjpegpay; + + rtpjpegpay = GST_RTP_JPEG_PAY (object); + + switch (prop_id) { + case PROP_JPEG_QUALITY: + rtpjpegpay->quality = g_value_get_int (value); + GST_DEBUG_OBJECT (object, "quality = %d", rtpjpegpay->quality); + break; + case PROP_JPEG_TYPE: + rtpjpegpay->type = g_value_get_int (value); + GST_DEBUG_OBJECT (object, "type = %d", rtpjpegpay->type); + break; + case PROP_BUFFER_LIST: + rtpjpegpay->buffer_list = g_value_get_boolean (value); + GST_DEBUG_OBJECT (object, "buffer_list = %d", rtpjpegpay->buffer_list); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_jpeg_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpJPEGPay *rtpjpegpay; + + rtpjpegpay = GST_RTP_JPEG_PAY (object); + + switch (prop_id) { + case PROP_JPEG_QUALITY: + g_value_set_int (value, rtpjpegpay->quality); + break; + case PROP_JPEG_TYPE: + g_value_set_int (value, rtpjpegpay->type); + break; + case PROP_BUFFER_LIST: + g_value_set_boolean (value, rtpjpegpay->buffer_list); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_rtp_jpeg_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpjpegpay", GST_RANK_SECONDARY, + GST_TYPE_RTP_JPEG_PAY); +} diff --git a/gst/rtp/gstrtpjpegpay.h b/gst/rtp/gstrtpjpegpay.h new file mode 100644 index 0000000..5d003c4 --- /dev/null +++ b/gst/rtp/gstrtpjpegpay.h @@ -0,0 +1,65 @@ +/* GStreamer + * Copyright (C) 2008 Axis Communications + * + * 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_RTP_JPEG_PAY_H__ +#define __GST_RTP_JPEG_PAY_H__ + +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_RTP_JPEG_PAY \ + (gst_rtp_jpeg_pay_get_type()) +#define GST_RTP_JPEG_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_JPEG_PAY,GstRtpJPEGPay)) +#define GST_RTP_JPEG_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_JPEG_PAY,GstRtpJPEGPayClass)) +#define GST_IS_RTP_JPEG_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_JPEG_PAY)) +#define GST_IS_RTP_JPEG_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_JPEG_PAY)) +typedef struct _GstRtpJPEGPay GstRtpJPEGPay; +typedef struct _GstRtpJPEGPayClass GstRtpJPEGPayClass; + +struct _GstRtpJPEGPay +{ + GstBaseRTPPayload payload; + + guint8 quality; + guint8 type; + + gint height; + gint width; + + gboolean buffer_list; + + guint8 quant; +}; + +struct _GstRtpJPEGPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_jpeg_pay_get_type (void); + +gboolean gst_rtp_jpeg_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_RTP_JPEG_PAY_H__ */ diff --git a/gst/rtp/gstrtpmp1sdepay.c b/gst/rtp/gstrtpmp1sdepay.c new file mode 100644 index 0000000..e7ff2fb --- /dev/null +++ b/gst/rtp/gstrtpmp1sdepay.c @@ -0,0 +1,146 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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 + +#include +#include "gstrtpmp1sdepay.h" + +/* RtpMP1SDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_LAST +}; + +static GstStaticPadTemplate gst_rtp_mp1s_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg,systemstream=(boolean)true") + ); + +/* The spec says video/MP1S but I have seen streams with other/MP1S so we will + * allow them both */ +static GstStaticPadTemplate gst_rtp_mp1s_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"other\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP1S\";" + "application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP1S\"") + ); + +GST_BOILERPLATE (GstRtpMP1SDepay, gst_rtp_mp1s_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_mp1s_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_mp1s_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_mp1s_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp1s_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp1s_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG1 System Stream depayloader", "Codec/Depayloader/Network/RTP", + "Extracts MPEG1 System Streams from RTP packets (RFC 3555)", + "Wim Taymans "); +} + +static void +gst_rtp_mp1s_depay_class_init (GstRtpMP1SDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_mp1s_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_mp1s_depay_setcaps; +} + +static void +gst_rtp_mp1s_depay_init (GstRtpMP1SDepay * rtpmp1sdepay, + GstRtpMP1SDepayClass * klass) +{ +} + +static gboolean +gst_rtp_mp1s_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + GstStructure *structure; + gint clock_rate; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("video/mpeg", + "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return res; +} + +static GstBuffer * +gst_rtp_mp1s_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstBuffer *outbuf; + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + if (outbuf) + GST_DEBUG ("gst_rtp_mp1s_depay_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + return outbuf; +} + +gboolean +gst_rtp_mp1s_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp1sdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP1S_DEPAY); +} diff --git a/gst/rtp/gstrtpmp1sdepay.h b/gst/rtp/gstrtpmp1sdepay.h new file mode 100644 index 0000000..42915a7 --- /dev/null +++ b/gst/rtp/gstrtpmp1sdepay.h @@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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_RTP_MP1S_DEPAY_H__ +#define __GST_RTP_MP1S_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MP1S_DEPAY \ + (gst_rtp_mp1s_depay_get_type()) +#define GST_RTP_MP1S_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP1S_DEPAY,GstRtpMP1SDepay)) +#define GST_RTP_MP1S_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP1S_DEPAY,GstRtpMP1SDepayClass)) +#define GST_IS_RTP_MP1S_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP1S_DEPAY)) +#define GST_IS_RTP_MP1S_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP1S_DEPAY)) +typedef struct _GstRtpMP1SDepay GstRtpMP1SDepay; +typedef struct _GstRtpMP1SDepayClass GstRtpMP1SDepayClass; + +struct _GstRtpMP1SDepay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpMP1SDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_mp1s_depay_get_type (void); + +gboolean gst_rtp_mp1s_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP1S_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpmp2tdepay.c b/gst/rtp/gstrtpmp2tdepay.c new file mode 100644 index 0000000..609bfba --- /dev/null +++ b/gst/rtp/gstrtpmp2tdepay.c @@ -0,0 +1,228 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include +#include "gstrtpmp2tdepay.h" + +/* RtpMP2TDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_SKIP_FIRST_BYTES 0 + +enum +{ + PROP_0, + PROP_SKIP_FIRST_BYTES +}; + +static GstStaticPadTemplate gst_rtp_mp2t_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpegts," + "packetsize=(int)188," "systemstream=(boolean)true") + ); + +static GstStaticPadTemplate gst_rtp_mp2t_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP2T-ES\";" + /* All optional parameters + * + * "profile-level-id=[1,MAX]" + * "config=" + */ + "application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_MP2T_STRING ", " + "clock-rate = (int) [1, MAX ]") + ); + +GST_BOILERPLATE (GstRtpMP2TDepay, gst_rtp_mp2t_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_mp2t_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_mp2t_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void gst_rtp_mp2t_depay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_mp2t_depay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +gst_rtp_mp2t_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp2t_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp2t_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG Transport Stream depayloader", "Codec/Depayloader/Network/RTP", + "Extracts MPEG2 TS from RTP packets (RFC 2250)", + "Wim Taymans , " + "Thijs Vermeir "); +} + +static void +gst_rtp_mp2t_depay_class_init (GstRtpMP2TDepayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_mp2t_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_mp2t_depay_setcaps; + + gobject_class->set_property = gst_rtp_mp2t_depay_set_property; + gobject_class->get_property = gst_rtp_mp2t_depay_get_property; + + g_object_class_install_property (gobject_class, PROP_SKIP_FIRST_BYTES, + g_param_spec_uint ("skip-first-bytes", + "Skip first bytes", + "The amount of bytes that need to be skipped at the beginning of the payload", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + +} + +static void +gst_rtp_mp2t_depay_init (GstRtpMP2TDepay * rtpmp2tdepay, + GstRtpMP2TDepayClass * klass) +{ + rtpmp2tdepay->skip_first_bytes = DEFAULT_SKIP_FIRST_BYTES; +} + +static gboolean +gst_rtp_mp2t_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + GstStructure *structure; + gint clock_rate; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("video/mpegts", + "packetsize", G_TYPE_INT, 188, + "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return res; +} + +static GstBuffer * +gst_rtp_mp2t_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpMP2TDepay *rtpmp2tdepay; + GstBuffer *outbuf; + gint payload_len; + + rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + if (G_UNLIKELY (payload_len <= rtpmp2tdepay->skip_first_bytes)) + goto empty_packet; + + outbuf = + gst_rtp_buffer_get_payload_subbuffer (buf, rtpmp2tdepay->skip_first_bytes, + -1); + + if (outbuf) + GST_DEBUG ("gst_rtp_mp2t_depay_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + return outbuf; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE, + (NULL), ("Packet was empty")); + return NULL; + } +} + +static void +gst_rtp_mp2t_depay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpMP2TDepay *rtpmp2tdepay; + + rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object); + + switch (prop_id) { + case PROP_SKIP_FIRST_BYTES: + rtpmp2tdepay->skip_first_bytes = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_mp2t_depay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpMP2TDepay *rtpmp2tdepay; + + rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object); + + switch (prop_id) { + case PROP_SKIP_FIRST_BYTES: + g_value_set_uint (value, rtpmp2tdepay->skip_first_bytes); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_rtp_mp2t_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp2tdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP2T_DEPAY); +} diff --git a/gst/rtp/gstrtpmp2tdepay.h b/gst/rtp/gstrtpmp2tdepay.h new file mode 100644 index 0000000..010b5ca --- /dev/null +++ b/gst/rtp/gstrtpmp2tdepay.h @@ -0,0 +1,60 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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_RTP_MP2T_DEPAY_H__ +#define __GST_RTP_MP2T_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MP2T_DEPAY \ + (gst_rtp_mp2t_depay_get_type()) +#define GST_RTP_MP2T_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP2T_DEPAY,GstRtpMP2TDepay)) +#define GST_RTP_MP2T_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP2T_DEPAY,GstRtpMP2TDepayClass)) +#define GST_IS_RTP_MP2T_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_DEPAY)) +#define GST_IS_RTP_MP2T_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_DEPAY)) +typedef struct _GstRtpMP2TDepay GstRtpMP2TDepay; +typedef struct _GstRtpMP2TDepayClass GstRtpMP2TDepayClass; + +struct _GstRtpMP2TDepay +{ + GstBaseRTPDepayload depayload; + + guint8 skip_first_bytes; +}; + +struct _GstRtpMP2TDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_mp2t_depay_get_type (void); + +gboolean gst_rtp_mp2t_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP2T_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpmp2tpay.c b/gst/rtp/gstrtpmp2tpay.c new file mode 100644 index 0000000..55ef623 --- /dev/null +++ b/gst/rtp/gstrtpmp2tpay.c @@ -0,0 +1,208 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 +#include +#include + +#include "gstrtpmp2tpay.h" + +static GstStaticPadTemplate gst_rtp_mp2t_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpegts," + "packetsize=(int)188," "systemstream=(boolean)true") + ); + +static GstStaticPadTemplate gst_rtp_mp2t_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"MP2T-ES\"") + ); + +static gboolean gst_rtp_mp2t_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_mp2t_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); +static GstFlowReturn gst_rtp_mp2t_pay_flush (GstRTPMP2TPay * rtpmp2tpay); +static void gst_rtp_mp2t_pay_finalize (GObject * object); + +GST_BOILERPLATE (GstRTPMP2TPay, gst_rtp_mp2t_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_mp2t_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp2t_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp2t_pay_src_template); + gst_element_class_set_details_simple (element_class, + "RTP MPEG2 Transport Stream payloader", "Codec/Payloader/Network/RTP", + "Payload-encodes MPEG2 TS into RTP packets (RFC 2250)", + "Wim Taymans "); +} + +static void +gst_rtp_mp2t_pay_class_init (GstRTPMP2TPayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mp2t_pay_finalize; + + gstbasertppayload_class->set_caps = gst_rtp_mp2t_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_mp2t_pay_handle_buffer; +} + +static void +gst_rtp_mp2t_pay_init (GstRTPMP2TPay * rtpmp2tpay, GstRTPMP2TPayClass * klass) +{ + GST_BASE_RTP_PAYLOAD (rtpmp2tpay)->clock_rate = 90000; + GST_BASE_RTP_PAYLOAD_PT (rtpmp2tpay) = GST_RTP_PAYLOAD_MP2T; + + rtpmp2tpay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_mp2t_pay_finalize (GObject * object) +{ + GstRTPMP2TPay *rtpmp2tpay; + + rtpmp2tpay = GST_RTP_MP2T_PAY (object); + + g_object_unref (rtpmp2tpay->adapter); + rtpmp2tpay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_mp2t_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + + gst_basertppayload_set_options (payload, "video", TRUE, "MP2T-ES", 90000); + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; +} + +static GstFlowReturn +gst_rtp_mp2t_pay_flush (GstRTPMP2TPay * rtpmp2tpay) +{ + guint avail; + guint8 *payload; + GstFlowReturn ret; + GstBuffer *outbuf; + + avail = gst_adapter_available (rtpmp2tpay->adapter); + if (avail == 0) + return GST_FLOW_OK; + outbuf = gst_rtp_buffer_new_allocate (avail, 0, 0); + + /* get payload */ + payload = gst_rtp_buffer_get_payload (outbuf); + + /* copy stuff from adapter to payload */ + gst_adapter_copy (rtpmp2tpay->adapter, payload, 0, avail); + + GST_BUFFER_TIMESTAMP (outbuf) = rtpmp2tpay->first_ts; + GST_BUFFER_DURATION (outbuf) = rtpmp2tpay->duration; + + GST_DEBUG_OBJECT (rtpmp2tpay, "pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp2tpay), outbuf); + + /* flush the adapter content */ + gst_adapter_flush (rtpmp2tpay->adapter, avail); + + return ret; +} + +static GstFlowReturn +gst_rtp_mp2t_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRTPMP2TPay *rtpmp2tpay; + guint size, avail, packet_len; + GstClockTime timestamp, duration; + GstFlowReturn ret; + + rtpmp2tpay = GST_RTP_MP2T_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + + ret = GST_FLOW_OK; + avail = gst_adapter_available (rtpmp2tpay->adapter); + + /* Initialize new RTP payload */ + if (avail == 0) { + rtpmp2tpay->first_ts = timestamp; + rtpmp2tpay->duration = duration; + } + + /* get packet length of previous data and this new data, + * payload length includes a 4 byte header */ + packet_len = gst_rtp_buffer_calc_packet_len (4 + avail + size, 0, 0); + + /* if this buffer is going to overflow the packet, flush what we + * have. */ + if (gst_basertppayload_is_filled (basepayload, + packet_len, rtpmp2tpay->duration + duration)) { + ret = gst_rtp_mp2t_pay_flush (rtpmp2tpay); + rtpmp2tpay->first_ts = timestamp; + rtpmp2tpay->duration = duration; + + /* keep filling the payload */ + } else { + if (GST_CLOCK_TIME_IS_VALID (duration)) + rtpmp2tpay->duration += duration; + } + + /* copy buffer to adapter */ + gst_adapter_push (rtpmp2tpay->adapter, buffer); + + return ret; + +} + +gboolean +gst_rtp_mp2t_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp2tpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP2T_PAY); +} diff --git a/gst/rtp/gstrtpmp2tpay.h b/gst/rtp/gstrtpmp2tpay.h new file mode 100644 index 0000000..e7a679b --- /dev/null +++ b/gst/rtp/gstrtpmp2tpay.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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_RTP_MP2T_PAY_H__ +#define __GST_RTP_MP2T_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRTPMP2TPay GstRTPMP2TPay; +typedef struct _GstRTPMP2TPayClass GstRTPMP2TPayClass; + +#define GST_TYPE_RTP_MP2T_PAY \ + (gst_rtp_mp2t_pay_get_type()) +#define GST_RTP_MP2T_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP2T_PAY,GstRTPMP2TPay)) +#define GST_RTP_MP2T_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP2T_PAY,GstRTPMP2TPayClass)) +#define GST_IS_RTP_MP2T_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_PAY)) +#define GST_IS_RTP_MP2T_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_PAY)) + +struct _GstRTPMP2TPay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime first_ts; + GstClockTime duration; +}; + +struct _GstRTPMP2TPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_mp2t_pay_get_type (void); + +gboolean gst_rtp_mp2t_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP2T_PAY_H__ */ diff --git a/gst/rtp/gstrtpmp4adepay.c b/gst/rtp/gstrtpmp4adepay.c new file mode 100644 index 0000000..e4343f8 --- /dev/null +++ b/gst/rtp/gstrtpmp4adepay.c @@ -0,0 +1,434 @@ +/* GStreamer + * Copyright (C) <2007> Nokia Corporation (contact ) + * <2007> Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * 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 +#include + +#include +#include "gstrtpmp4adepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmp4adepay_debug); +#define GST_CAT_DEFAULT (rtpmp4adepay_debug) + +static GstStaticPadTemplate gst_rtp_mp4a_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg," + "mpegversion = (int) 4," "framed = (boolean) true, " + "stream-format = (string) raw") + ); + +static GstStaticPadTemplate gst_rtp_mp4a_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " + "encoding-name = (string) \"MP4A-LATM\"" + /* All optional parameters + * + * "profile-level-id=[1,MAX]" + * "config=" + */ + ) + ); + +GST_BOILERPLATE (GstRtpMP4ADepay, gst_rtp_mp4a_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_mp4a_depay_finalize (GObject * object); + +static gboolean gst_rtp_mp4a_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_mp4a_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static GstStateChangeReturn gst_rtp_mp4a_depay_change_state (GstElement * + element, GstStateChange transition); + + +static void +gst_rtp_mp4a_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4a_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4a_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG4 audio depayloader", "Codec/Depayloader/Network/RTP", + "Extracts MPEG4 audio from RTP packets (RFC 3016)", + "Nokia Corporation (contact ), " + "Wim Taymans "); +} + +static void +gst_rtp_mp4a_depay_class_init (GstRtpMP4ADepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mp4a_depay_finalize; + + gstelement_class->change_state = gst_rtp_mp4a_depay_change_state; + + gstbasertpdepayload_class->process = gst_rtp_mp4a_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_mp4a_depay_setcaps; + + GST_DEBUG_CATEGORY_INIT (rtpmp4adepay_debug, "rtpmp4adepay", 0, + "MPEG4 audio RTP Depayloader"); +} + +static void +gst_rtp_mp4a_depay_init (GstRtpMP4ADepay * rtpmp4adepay, + GstRtpMP4ADepayClass * klass) +{ + rtpmp4adepay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_mp4a_depay_finalize (GObject * object) +{ + GstRtpMP4ADepay *rtpmp4adepay; + + rtpmp4adepay = GST_RTP_MP4A_DEPAY (object); + + g_object_unref (rtpmp4adepay->adapter); + rtpmp4adepay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static const guint aac_sample_rates[] = { 96000, 88200, 64000, 48000, + 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 +}; + +static gboolean +gst_rtp_mp4a_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpMP4ADepay *rtpmp4adepay; + GstCaps *srccaps; + const gchar *str; + gint clock_rate; + gint object_type; + gint channels = 2; /* default */ + gboolean res; + + rtpmp4adepay = GST_RTP_MP4A_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + if (!gst_structure_get_int (structure, "object", &object_type)) + object_type = 2; /* AAC LC default */ + + srccaps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 4, + "framed", G_TYPE_BOOLEAN, TRUE, "channels", G_TYPE_INT, channels, + "stream-format", G_TYPE_STRING, "raw", NULL); + + if ((str = gst_structure_get_string (structure, "config"))) { + GValue v = { 0 }; + + g_value_init (&v, GST_TYPE_BUFFER); + if (gst_value_deserialize (&v, str)) { + GstBuffer *buffer; + guint8 *data; + guint size; + gint i; + guint32 rate = 0; + guint8 obj_type = 0, sr_idx = 0, channels = 0; + GstBitReader br; + + buffer = gst_value_get_buffer (&v); + gst_buffer_ref (buffer); + g_value_unset (&v); + + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + if (size < 2) { + GST_WARNING_OBJECT (depayload, "config too short (%d < 2)", size); + goto bad_config; + } + + /* Parse StreamMuxConfig according to ISO/IEC 14496-3: + * + * audioMuxVersion == 0 (1 bit) + * allStreamsSameTimeFraming == 1 (1 bit) + * numSubFrames == rtpmp4adepay->numSubFrames (6 bits) + * numProgram == 0 (4 bits) + * numLayer == 0 (3 bits) + * + * We only require audioMuxVersion == 0; + * + * The remaining bit of the second byte and the rest of the bits are used + * for audioSpecificConfig which we need to set in codec_info. + */ + if ((data[0] & 0x80) != 0x00) { + GST_WARNING_OBJECT (depayload, "unknown audioMuxVersion 1"); + goto bad_config; + } + + rtpmp4adepay->numSubFrames = (data[0] & 0x3F); + + GST_LOG_OBJECT (rtpmp4adepay, "numSubFrames %d", + rtpmp4adepay->numSubFrames); + + /* shift rest of string 15 bits down */ + size -= 2; + for (i = 0; i < size; i++) { + data[i] = ((data[i + 1] & 1) << 7) | ((data[i + 2] & 0xfe) >> 1); + } + /* ignore remaining bit, we're only interested in full bytes */ + GST_BUFFER_SIZE (buffer) = size; + + gst_bit_reader_init (&br, data, size); + + /* any object type is fine, we need to copy it to the profile-level-id field. */ + if (!gst_bit_reader_get_bits_uint8 (&br, &obj_type, 5)) + goto bad_config; + if (obj_type == 0) { + GST_WARNING_OBJECT (depayload, "invalid object type 0"); + goto bad_config; + } + + if (!gst_bit_reader_get_bits_uint8 (&br, &sr_idx, 4)) + goto bad_config; + if (sr_idx >= G_N_ELEMENTS (aac_sample_rates) && sr_idx != 15) { + GST_WARNING_OBJECT (depayload, "invalid sample rate index %d", sr_idx); + goto bad_config; + } + GST_LOG_OBJECT (rtpmp4adepay, "sample rate index %u", sr_idx); + + if (!gst_bit_reader_get_bits_uint8 (&br, &channels, 4)) + goto bad_config; + if (channels > 7) { + GST_WARNING_OBJECT (depayload, "invalid channels %u", (guint) channels); + goto bad_config; + } + + /* rtp rate depends on sampling rate of the audio */ + if (sr_idx == 15) { + /* index of 15 means we get the rate in the next 24 bits */ + if (!gst_bit_reader_get_bits_uint32 (&br, &rate, 24)) + goto bad_config; + } else if (sr_idx >= G_N_ELEMENTS (aac_sample_rates)) { + goto bad_config; + } else { + /* else use the rate from the table */ + rate = aac_sample_rates[sr_idx]; + } + + rtpmp4adepay->frame_len = 1024; + + switch (obj_type) { + case 1: + case 2: + case 3: + case 4: + case 6: + case 7: + { + guint8 frameLenFlag = 0; + + if (gst_bit_reader_get_bits_uint8 (&br, &frameLenFlag, 1)) + if (frameLenFlag) + rtpmp4adepay->frame_len = 960; + break; + } + default: + break; + } + + gst_caps_set_simple (srccaps, + "channels", G_TYPE_INT, (gint) channels, + "rate", G_TYPE_INT, (gint) rate, + "codec_data", GST_TYPE_BUFFER, buffer, NULL); + gst_buffer_unref (buffer); + } else { + g_warning ("cannot convert config to buffer"); + } + } +bad_config: + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return res; +} + +static GstBuffer * +gst_rtp_mp4a_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpMP4ADepay *rtpmp4adepay; + GstBuffer *outbuf; + + rtpmp4adepay = GST_RTP_MP4A_DEPAY (depayload); + + /* flush remaining data on discont */ + if (GST_BUFFER_IS_DISCONT (buf)) { + gst_adapter_clear (rtpmp4adepay->adapter); + } + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + gst_buffer_copy_metadata (outbuf, buf, GST_BUFFER_COPY_TIMESTAMPS); + gst_adapter_push (rtpmp4adepay->adapter, outbuf); + + /* RTP marker bit indicates the last packet of the AudioMuxElement => create + * and push a buffer */ + if (gst_rtp_buffer_get_marker (buf)) { + guint avail; + guint i; + guint8 *data; + guint pos; + GstClockTime timestamp; + + avail = gst_adapter_available (rtpmp4adepay->adapter); + timestamp = gst_adapter_prev_timestamp (rtpmp4adepay->adapter, NULL); + + GST_LOG_OBJECT (rtpmp4adepay, "have marker and %u available", avail); + + outbuf = gst_adapter_take_buffer (rtpmp4adepay->adapter, avail); + data = GST_BUFFER_DATA (outbuf); + /* position in data we are at */ + pos = 0; + + /* looping through the number of sub-frames in the audio payload */ + for (i = 0; i <= rtpmp4adepay->numSubFrames; i++) { + /* determine payload length and set buffer data pointer accordingly */ + guint skip; + guint data_len; + GstBuffer *tmp = NULL; + + /* each subframe starts with a variable length encoding */ + data_len = 0; + for (skip = 0; skip < avail; skip++) { + data_len += data[skip]; + if (data[skip] != 0xff) + break; + } + skip++; + + /* this can not be possible, we have not enough data or the length + * decoding failed because we ran out of data. */ + if (skip + data_len > avail) + goto wrong_size; + + GST_LOG_OBJECT (rtpmp4adepay, + "subframe %u, header len %u, data len %u, left %u", i, skip, data_len, + avail); + + /* take data out, skip the header */ + pos += skip; + tmp = gst_buffer_create_sub (outbuf, pos, data_len); + + /* skip data too */ + skip += data_len; + pos += data_len; + + /* update our pointers whith what we consumed */ + data += skip; + avail -= skip; + + GST_BUFFER_TIMESTAMP (tmp) = timestamp; + gst_base_rtp_depayload_push (depayload, tmp); + + /* shift ts for next buffers */ + if (rtpmp4adepay->frame_len && timestamp != -1 + && depayload->clock_rate != 0) { + timestamp += + gst_util_uint64_scale_int (rtpmp4adepay->frame_len, GST_SECOND, + depayload->clock_rate); + } + } + + /* just a check that lengths match */ + if (avail) { + GST_ELEMENT_WARNING (depayload, STREAM, DECODE, + ("Packet invalid"), ("Not all payload consumed: " + "possible wrongly encoded packet.")); + } + + gst_buffer_unref (outbuf); + } + return NULL; + + /* ERRORS */ +wrong_size: + { + GST_ELEMENT_WARNING (rtpmp4adepay, STREAM, DECODE, + ("Packet did not validate"), ("wrong packet size")); + gst_buffer_unref (outbuf); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_mp4a_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpMP4ADepay *rtpmp4adepay; + GstStateChangeReturn ret; + + rtpmp4adepay = GST_RTP_MP4A_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (rtpmp4adepay->adapter); + rtpmp4adepay->frame_len = 0; + rtpmp4adepay->numSubFrames = 0; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + default: + break; + } + return ret; +} + +gboolean +gst_rtp_mp4a_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp4adepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP4A_DEPAY); +} diff --git a/gst/rtp/gstrtpmp4adepay.h b/gst/rtp/gstrtpmp4adepay.h new file mode 100644 index 0000000..33622fc --- /dev/null +++ b/gst/rtp/gstrtpmp4adepay.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (C) <2007> Nokia Corporation (contact ) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * 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_RTP_MP4A_DEPAY_H__ +#define __GST_RTP_MP4A_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MP4A_DEPAY \ + (gst_rtp_mp4a_depay_get_type()) +#define GST_RTP_MP4A_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4A_DEPAY,GstRtpMP4ADepay)) +#define GST_RTP_MP4A_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4A_DEPAY,GstRtpMP4ADepayClass)) +#define GST_IS_RTP_MP4A_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4A_DEPAY)) +#define GST_IS_RTP_MP4A_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4A_DEPAY)) + +typedef struct _GstRtpMP4ADepay GstRtpMP4ADepay; +typedef struct _GstRtpMP4ADepayClass GstRtpMP4ADepayClass; + +struct _GstRtpMP4ADepay +{ + GstBaseRTPDepayload depayload; + GstAdapter *adapter; + guint8 numSubFrames; + guint frame_len; +}; + +struct _GstRtpMP4ADepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_mp4a_depay_get_type (void); + +gboolean gst_rtp_mp4a_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP4A_DEPAY_H__ */ + diff --git a/gst/rtp/gstrtpmp4apay.c b/gst/rtp/gstrtpmp4apay.c new file mode 100644 index 0000000..bfafbd8 --- /dev/null +++ b/gst/rtp/gstrtpmp4apay.c @@ -0,0 +1,437 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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 + +#include + +#include "gstrtpmp4apay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmp4apay_debug); +#define GST_CAT_DEFAULT (rtpmp4apay_debug) + +/* FIXME: add framed=(boolean)true once our encoders have this field set + * on their output caps */ +static GstStaticPadTemplate gst_rtp_mp4a_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, mpegversion=(int)4, " + "stream-format=(string)raw") + ); + +static GstStaticPadTemplate gst_rtp_mp4a_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " + "encoding-name = (string) \"MP4A-LATM\"" + /* All optional parameters + * + * "cpresent = (string) \"0\"" + * "config=" + */ + ) + ); + +static void gst_rtp_mp4a_pay_finalize (GObject * object); + +static gboolean gst_rtp_mp4a_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_mp4a_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpMP4APay, gst_rtp_mp4a_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_mp4a_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4a_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4a_pay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG4 audio payloader", "Codec/Payloader/Network/RTP", + "Payload MPEG4 audio as RTP packets (RFC 3016)", + "Wim Taymans "); +} + +static void +gst_rtp_mp4a_pay_class_init (GstRtpMP4APayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mp4a_pay_finalize; + + gstbasertppayload_class->set_caps = gst_rtp_mp4a_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_mp4a_pay_handle_buffer; + + GST_DEBUG_CATEGORY_INIT (rtpmp4apay_debug, "rtpmp4apay", 0, + "MP4A-LATM RTP Payloader"); +} + +static void +gst_rtp_mp4a_pay_init (GstRtpMP4APay * rtpmp4apay, GstRtpMP4APayClass * klass) +{ + rtpmp4apay->rate = 90000; + rtpmp4apay->profile = g_strdup ("1"); +} + +static void +gst_rtp_mp4a_pay_finalize (GObject * object) +{ + GstRtpMP4APay *rtpmp4apay; + + rtpmp4apay = GST_RTP_MP4A_PAY (object); + + g_free (rtpmp4apay->params); + rtpmp4apay->params = NULL; + + if (rtpmp4apay->config) + gst_buffer_unref (rtpmp4apay->config); + rtpmp4apay->config = NULL; + + g_free (rtpmp4apay->profile); + rtpmp4apay->profile = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static const unsigned int sampling_table[16] = { + 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, + 16000, 12000, 11025, 8000, 7350, 0, 0, 0 +}; + +static gboolean +gst_rtp_mp4a_pay_parse_audio_config (GstRtpMP4APay * rtpmp4apay, + GstBuffer * buffer) +{ + guint8 *data; + guint size; + guint8 objectType; + guint8 samplingIdx; + guint8 channelCfg; + + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + if (size < 2) + goto too_short; + + /* any object type is fine, we need to copy it to the profile-level-id field. */ + objectType = (data[0] & 0xf8) >> 3; + if (objectType == 0) + goto invalid_object; + + samplingIdx = ((data[0] & 0x07) << 1) | ((data[1] & 0x80) >> 7); + /* only fixed values for now */ + if (samplingIdx > 12 && samplingIdx != 15) + goto wrong_freq; + + channelCfg = ((data[1] & 0x78) >> 3); + if (channelCfg > 7) + goto wrong_channels; + + /* rtp rate depends on sampling rate of the audio */ + if (samplingIdx == 15) { + if (size < 5) + goto too_short; + + /* index of 15 means we get the rate in the next 24 bits */ + rtpmp4apay->rate = ((data[1] & 0x7f) << 17) | + ((data[2]) << 9) | ((data[3]) << 1) | ((data[4] & 0x80) >> 7); + } else { + /* else use the rate from the table */ + rtpmp4apay->rate = sampling_table[samplingIdx]; + } + /* extra rtp params contain the number of channels */ + g_free (rtpmp4apay->params); + rtpmp4apay->params = g_strdup_printf ("%d", channelCfg); + /* audio stream type */ + rtpmp4apay->streamtype = "5"; + /* profile */ + g_free (rtpmp4apay->profile); + rtpmp4apay->profile = g_strdup_printf ("%d", objectType); + + GST_DEBUG_OBJECT (rtpmp4apay, + "objectType: %d, samplingIdx: %d (%d), channelCfg: %d", objectType, + samplingIdx, rtpmp4apay->rate, channelCfg); + + return TRUE; + + /* ERROR */ +too_short: + { + GST_ELEMENT_ERROR (rtpmp4apay, STREAM, FORMAT, + (NULL), ("config string too short, expected 2 bytes, got %d", size)); + return FALSE; + } +invalid_object: + { + GST_ELEMENT_ERROR (rtpmp4apay, STREAM, FORMAT, + (NULL), ("invalid object type 0")); + return FALSE; + } +wrong_freq: + { + GST_ELEMENT_ERROR (rtpmp4apay, STREAM, NOT_IMPLEMENTED, + (NULL), ("unsupported frequency index %d", samplingIdx)); + return FALSE; + } +wrong_channels: + { + GST_ELEMENT_ERROR (rtpmp4apay, STREAM, NOT_IMPLEMENTED, + (NULL), ("unsupported number of channels %d, must < 8", channelCfg)); + return FALSE; + } +} + +static gboolean +gst_rtp_mp4a_pay_new_caps (GstRtpMP4APay * rtpmp4apay) +{ + gchar *config; + GValue v = { 0 }; + gboolean res; + + g_value_init (&v, GST_TYPE_BUFFER); + gst_value_set_buffer (&v, rtpmp4apay->config); + config = gst_value_serialize (&v); + + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4apay), + "cpresent", G_TYPE_STRING, "0", "config", G_TYPE_STRING, config, NULL); + + g_value_unset (&v); + g_free (config); + + return res; +} + +static gboolean +gst_rtp_mp4a_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + GstRtpMP4APay *rtpmp4apay; + GstStructure *structure; + const GValue *codec_data; + gboolean res, framed = TRUE; + const gchar *stream_format; + + rtpmp4apay = GST_RTP_MP4A_PAY (payload); + + structure = gst_caps_get_structure (caps, 0); + + /* this is already handled by the template caps, but it is better + * to leave here to have meaningful warning messages when linking + * fails */ + stream_format = gst_structure_get_string (structure, "stream-format"); + if (stream_format) { + if (strcmp (stream_format, "raw") != 0) { + GST_WARNING_OBJECT (rtpmp4apay, "AAC's stream-format must be 'raw', " + "%s is not supported", stream_format); + return FALSE; + } + } else { + GST_WARNING_OBJECT (rtpmp4apay, "AAC's stream-format not specified, " + "assuming 'raw'"); + } + + codec_data = gst_structure_get_value (structure, "codec_data"); + if (codec_data) { + GST_LOG_OBJECT (rtpmp4apay, "got codec_data"); + if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { + GstBuffer *buffer, *cbuffer; + guint8 *config; + guint8 *data; + guint size, i; + + buffer = gst_value_get_buffer (codec_data); + GST_LOG_OBJECT (rtpmp4apay, "configuring codec_data"); + + /* parse buffer */ + res = gst_rtp_mp4a_pay_parse_audio_config (rtpmp4apay, buffer); + + if (!res) + goto config_failed; + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + + /* make the StreamMuxConfig, we need 15 bits for the header */ + config = g_malloc0 (size + 2); + + /* Create StreamMuxConfig according to ISO/IEC 14496-3: + * + * audioMuxVersion == 0 (1 bit) + * allStreamsSameTimeFraming == 1 (1 bit) + * numSubFrames == numSubFrames (6 bits) + * numProgram == 0 (4 bits) + * numLayer == 0 (3 bits) + */ + config[0] = 0x40; + config[1] = 0x00; + + /* append the config bits, shifting them 1 bit left */ + for (i = 0; i < size; i++) { + config[i + 1] |= ((data[i] & 0x80) >> 7); + config[i + 2] |= ((data[i] & 0x7f) << 1); + } + + cbuffer = gst_buffer_new (); + GST_BUFFER_DATA (cbuffer) = config; + GST_BUFFER_MALLOCDATA (cbuffer) = config; + GST_BUFFER_SIZE (cbuffer) = size + 2; + + /* now we can configure the buffer */ + if (rtpmp4apay->config) + gst_buffer_unref (rtpmp4apay->config); + rtpmp4apay->config = cbuffer; + } + } + + if (gst_structure_get_boolean (structure, "framed", &framed) && !framed) { + GST_WARNING_OBJECT (payload, "Need framed AAC data as input!"); + } + + gst_basertppayload_set_options (payload, "audio", TRUE, "MP4A-LATM", + rtpmp4apay->rate); + + res = gst_rtp_mp4a_pay_new_caps (rtpmp4apay); + + return res; + + /* ERRORS */ +config_failed: + { + GST_DEBUG_OBJECT (rtpmp4apay, "failed to parse config"); + return FALSE; + } +} + +/* we expect buffers as exactly one complete AU + */ +static GstFlowReturn +gst_rtp_mp4a_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpMP4APay *rtpmp4apay; + GstFlowReturn ret; + GstBuffer *outbuf; + guint count, mtu, size; + guint8 *data; + gboolean fragmented; + GstClockTime timestamp; + + ret = GST_FLOW_OK; + + rtpmp4apay = GST_RTP_MP4A_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + + fragmented = FALSE; + mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpmp4apay); + + while (size > 0) { + guint towrite; + guint8 *payload; + guint payload_len; + guint packet_len; + + /* this will be the total lenght of the packet */ + packet_len = gst_rtp_buffer_calc_packet_len (size, 0, 0); + + if (!fragmented) { + /* first packet calculate space for the packet including the header */ + count = size; + while (count >= 0xff) { + packet_len++; + count -= 0xff; + } + packet_len++; + } + + /* fill one MTU or all available bytes */ + towrite = MIN (packet_len, mtu); + + /* this is the payload length */ + payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); + + GST_DEBUG_OBJECT (rtpmp4apay, + "avail %d, towrite %d, packet_len %d, payload_len %d", size, towrite, + packet_len, payload_len); + + /* create buffer to hold the payload. */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + + /* copy payload */ + payload = gst_rtp_buffer_get_payload (outbuf); + + if (!fragmented) { + /* first packet write the header */ + count = size; + while (count >= 0xff) { + *payload++ = 0xff; + payload_len--; + count -= 0xff; + } + *payload++ = count; + payload_len--; + } + + /* copy data to payload */ + memcpy (payload, data, payload_len); + data += payload_len; + size -= payload_len; + + /* marker only if the packet is complete */ + gst_rtp_buffer_set_marker (outbuf, size == 0); + + /* copy incomming timestamp (if any) to outgoing buffers */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp4apay), outbuf); + + fragmented = TRUE; + } + + gst_buffer_unref (buffer); + + return ret; +} + +gboolean +gst_rtp_mp4a_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp4apay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP4A_PAY); +} diff --git a/gst/rtp/gstrtpmp4apay.h b/gst/rtp/gstrtpmp4apay.h new file mode 100644 index 0000000..0447d83 --- /dev/null +++ b/gst/rtp/gstrtpmp4apay.h @@ -0,0 +1,65 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_MP4A_PAY_H__ +#define __GST_RTP_MP4A_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MP4A_PAY \ + (gst_rtp_mp4a_pay_get_type()) +#define GST_RTP_MP4A_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4A_PAY,GstRtpMP4APay)) +#define GST_RTP_MP4A_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4A_PAY,GstRtpMP4APayClass)) +#define GST_IS_RTP_MP4A_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4A_PAY)) +#define GST_IS_RTP_MP4A_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4A_PAY)) + +typedef struct _GstRtpMP4APay GstRtpMP4APay; +typedef struct _GstRtpMP4APayClass GstRtpMP4APayClass; + +struct _GstRtpMP4APay +{ + GstBaseRTPPayload payload; + + gint rate; + gchar *params; + gchar *profile; + const gchar *streamtype; + GstBuffer *config; +}; + +struct _GstRtpMP4APayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_mp4a_pay_get_type (void); + +gboolean gst_rtp_mp4a_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP4A_PAY_H__ */ diff --git a/gst/rtp/gstrtpmp4gdepay.c b/gst/rtp/gstrtpmp4gdepay.c new file mode 100644 index 0000000..1dd049b --- /dev/null +++ b/gst/rtp/gstrtpmp4gdepay.c @@ -0,0 +1,775 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 +#include +#include + +#include "gstrtpmp4gdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmp4gdepay_debug); +#define GST_CAT_DEFAULT (rtpmp4gdepay_debug) + +static GstStaticPadTemplate gst_rtp_mp4g_depay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg," + "mpegversion=(int) 4," + "systemstream=(boolean)false;" + "audio/mpeg," "mpegversion=(int) 4, " "stream-format=(string)raw") + ); + +static GstStaticPadTemplate gst_rtp_mp4g_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) { \"video\", \"audio\", \"application\" }, " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " + "encoding-name = (string) \"MPEG4-GENERIC\", " + /* required string params */ + "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ + /* "profile-level-id = (string) [1,MAX], " */ + /* "config = (string) [1,MAX]" */ + "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" } " + /* Optional general parameters */ + /* "objecttype = (string) [1,MAX], " */ + /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */ + /* "constantduration = (string) [1,MAX], " *//* constant duration of each AU */ + /* "maxdisplacement = (string) [1,MAX], " */ + /* "de-interleavebuffersize = (string) [1,MAX], " */ + /* Optional configuration parameters */ + /* "sizelength = (string) [1, 32], " */ + /* "indexlength = (string) [1, 32], " */ + /* "indexdeltalength = (string) [1, 32], " */ + /* "ctsdeltalength = (string) [1, 32], " */ + /* "dtsdeltalength = (string) [1, 32], " */ + /* "randomaccessindication = (string) {0, 1}, " */ + /* "streamstateindication = (string) [0, 32], " */ + /* "auxiliarydatasizelength = (string) [0, 32]" */ ) + ); + +/* simple bitstream parser */ +typedef struct +{ + const guint8 *data; + const guint8 *end; + gint head; /* bitpos in the cache of next bit */ + guint64 cache; /* cached bytes */ +} GstBsParse; + +static void +gst_bs_parse_init (GstBsParse * bs, const guint8 * data, guint size) +{ + bs->data = data; + bs->end = data + size; + bs->head = 0; + bs->cache = 0xffffffff; +} + +static guint32 +gst_bs_parse_read (GstBsParse * bs, guint n) +{ + guint32 res = 0; + gint shift; + + if (n == 0) + return res; + + /* fill up the cache if we need to */ + while (bs->head < n) { + if (bs->data >= bs->end) { + /* we're at the end, can't produce more than head number of bits */ + n = bs->head; + break; + } + /* shift bytes in cache, moving the head bits of the cache left */ + bs->cache = (bs->cache << 8) | *bs->data++; + bs->head += 8; + } + + /* bring the required bits down and truncate */ + if ((shift = bs->head - n) > 0) + res = bs->cache >> shift; + else + res = bs->cache; + + /* mask out required bits */ + if (n < 32) + res &= (1 << n) - 1; + + bs->head = shift; + + return res; +} + + +GST_BOILERPLATE (GstRtpMP4GDepay, gst_rtp_mp4g_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_mp4g_depay_finalize (GObject * object); + +static gboolean gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_mp4g_depay_handle_event (GstBaseRTPDepayload * filter, + GstEvent * event); + +static GstStateChangeReturn gst_rtp_mp4g_depay_change_state (GstElement * + element, GstStateChange transition); + + +static void +gst_rtp_mp4g_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4g_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4g_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG4 ES depayloader", "Codec/Depayloader/Network/RTP", + "Extracts MPEG4 elementary streams from RTP packets (RFC 3640)", + "Wim Taymans "); +} + +static void +gst_rtp_mp4g_depay_class_init (GstRtpMP4GDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mp4g_depay_finalize; + + gstelement_class->change_state = gst_rtp_mp4g_depay_change_state; + + gstbasertpdepayload_class->process = gst_rtp_mp4g_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_mp4g_depay_setcaps; + gstbasertpdepayload_class->handle_event = gst_rtp_mp4g_depay_handle_event; + + GST_DEBUG_CATEGORY_INIT (rtpmp4gdepay_debug, "rtpmp4gdepay", 0, + "MP4-generic RTP Depayloader"); +} + +static void +gst_rtp_mp4g_depay_init (GstRtpMP4GDepay * rtpmp4gdepay, + GstRtpMP4GDepayClass * klass) +{ + rtpmp4gdepay->adapter = gst_adapter_new (); + rtpmp4gdepay->packets = g_queue_new (); +} + +static void +gst_rtp_mp4g_depay_finalize (GObject * object) +{ + GstRtpMP4GDepay *rtpmp4gdepay; + + rtpmp4gdepay = GST_RTP_MP4G_DEPAY (object); + + g_object_unref (rtpmp4gdepay->adapter); + rtpmp4gdepay->adapter = NULL; + g_queue_free (rtpmp4gdepay->packets); + rtpmp4gdepay->packets = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gint +gst_rtp_mp4g_depay_parse_int (GstStructure * structure, const gchar * field, + gint def) +{ + const gchar *str; + gint res; + + if ((str = gst_structure_get_string (structure, field))) + return atoi (str); + + if (gst_structure_get_int (structure, field, &res)) + return res; + + return def; +} + +static gboolean +gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpMP4GDepay *rtpmp4gdepay; + GstCaps *srccaps = NULL; + const gchar *str; + gint clock_rate; + gint someint; + gboolean res; + + rtpmp4gdepay = GST_RTP_MP4G_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + if ((str = gst_structure_get_string (structure, "media"))) { + if (strcmp (str, "audio") == 0) { + srccaps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 4, "stream-format", G_TYPE_STRING, "raw", + NULL); + } else if (strcmp (str, "video") == 0) { + srccaps = gst_caps_new_simple ("video/mpeg", + "mpegversion", G_TYPE_INT, 4, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + } + } + if (srccaps == NULL) + goto unknown_media; + + /* these values are optional and have a default value of 0 (no header) */ + rtpmp4gdepay->sizelength = + gst_rtp_mp4g_depay_parse_int (structure, "sizelength", 0); + rtpmp4gdepay->indexlength = + gst_rtp_mp4g_depay_parse_int (structure, "indexlength", 0); + rtpmp4gdepay->indexdeltalength = + gst_rtp_mp4g_depay_parse_int (structure, "indexdeltalength", 0); + rtpmp4gdepay->ctsdeltalength = + gst_rtp_mp4g_depay_parse_int (structure, "ctsdeltalength", 0); + rtpmp4gdepay->dtsdeltalength = + gst_rtp_mp4g_depay_parse_int (structure, "dtsdeltalength", 0); + someint = + gst_rtp_mp4g_depay_parse_int (structure, "randomaccessindication", 0); + rtpmp4gdepay->randomaccessindication = someint > 0 ? 1 : 0; + rtpmp4gdepay->streamstateindication = + gst_rtp_mp4g_depay_parse_int (structure, "streamstateindication", 0); + rtpmp4gdepay->auxiliarydatasizelength = + gst_rtp_mp4g_depay_parse_int (structure, "auxiliarydatasizelength", 0); + rtpmp4gdepay->constantSize = + gst_rtp_mp4g_depay_parse_int (structure, "constantsize", 0); + rtpmp4gdepay->constantDuration = + gst_rtp_mp4g_depay_parse_int (structure, "constantduration", 0); + rtpmp4gdepay->maxDisplacement = + gst_rtp_mp4g_depay_parse_int (structure, "maxdisplacement", 0); + + + /* get config string */ + if ((str = gst_structure_get_string (structure, "config"))) { + GValue v = { 0 }; + + g_value_init (&v, GST_TYPE_BUFFER); + if (gst_value_deserialize (&v, str)) { + GstBuffer *buffer; + + buffer = gst_value_get_buffer (&v); + gst_caps_set_simple (srccaps, + "codec_data", GST_TYPE_BUFFER, buffer, NULL); + g_value_unset (&v); + } else { + g_warning ("cannot convert config to buffer"); + } + } + + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return res; + + /* ERRORS */ +unknown_media: + { + GST_DEBUG_OBJECT (rtpmp4gdepay, "Unknown media type"); + return FALSE; + } +} + +static void +gst_rtp_mp4g_depay_clear_queue (GstRtpMP4GDepay * rtpmp4gdepay) +{ + GstBuffer *outbuf; + + while ((outbuf = g_queue_pop_head (rtpmp4gdepay->packets))) + gst_buffer_unref (outbuf); +} + +static void +gst_rtp_mp4g_depay_reset (GstRtpMP4GDepay * rtpmp4gdepay) +{ + gst_adapter_clear (rtpmp4gdepay->adapter); + rtpmp4gdepay->max_AU_index = -1; + rtpmp4gdepay->next_AU_index = -1; + rtpmp4gdepay->prev_AU_index = -1; + rtpmp4gdepay->prev_rtptime = -1; + rtpmp4gdepay->last_AU_index = -1; + gst_rtp_mp4g_depay_clear_queue (rtpmp4gdepay); +} + +static void +gst_rtp_mp4g_depay_flush_queue (GstRtpMP4GDepay * rtpmp4gdepay) +{ + GstBuffer *outbuf; + gboolean discont = FALSE; + guint AU_index; + + while ((outbuf = g_queue_pop_head (rtpmp4gdepay->packets))) { + AU_index = GST_BUFFER_OFFSET (outbuf); + + GST_DEBUG_OBJECT (rtpmp4gdepay, "next available AU_index %u", AU_index); + + if (rtpmp4gdepay->next_AU_index != AU_index) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "discont, expected AU_index %u", + rtpmp4gdepay->next_AU_index); + discont = TRUE; + } + + if (discont) { + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + discont = FALSE; + } + + GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing AU_index %u", AU_index); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmp4gdepay), outbuf); + rtpmp4gdepay->next_AU_index = AU_index + 1; + } +} + +static void +gst_rtp_mp4g_depay_queue (GstRtpMP4GDepay * rtpmp4gdepay, GstBuffer * outbuf) +{ + guint AU_index = GST_BUFFER_OFFSET (outbuf); + + if (rtpmp4gdepay->next_AU_index == -1) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "Init AU counter %u", AU_index); + rtpmp4gdepay->next_AU_index = AU_index; + } + + if (rtpmp4gdepay->next_AU_index == AU_index) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing expected AU_index %u", AU_index); + + /* we received the expected packet, push it and flush as much as we can from + * the queue */ + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmp4gdepay), outbuf); + rtpmp4gdepay->next_AU_index++; + + while ((outbuf = g_queue_peek_head (rtpmp4gdepay->packets))) { + AU_index = GST_BUFFER_OFFSET (outbuf); + + GST_DEBUG_OBJECT (rtpmp4gdepay, "next available AU_index %u", AU_index); + + if (rtpmp4gdepay->next_AU_index == AU_index) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing expected AU_index %u", + AU_index); + outbuf = g_queue_pop_head (rtpmp4gdepay->packets); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmp4gdepay), + outbuf); + rtpmp4gdepay->next_AU_index++; + } else { + GST_DEBUG_OBJECT (rtpmp4gdepay, "waiting for next AU_index %u", + rtpmp4gdepay->next_AU_index); + break; + } + } + } else { + GList *list; + + GST_DEBUG_OBJECT (rtpmp4gdepay, "queueing AU_index %u", AU_index); + + /* loop the list to skip strictly smaller AU_index buffers */ + for (list = rtpmp4gdepay->packets->head; list; list = g_list_next (list)) { + guint idx; + gint gap; + + idx = GST_BUFFER_OFFSET (GST_BUFFER_CAST (list->data)); + + /* compare the new seqnum to the one in the buffer */ + gap = (gint) (idx - AU_index); + + GST_DEBUG_OBJECT (rtpmp4gdepay, "compare with AU_index %u, gap %d", idx, + gap); + + /* AU_index <= idx, we can stop looking */ + if (G_LIKELY (gap > 0)) + break; + } + if (G_LIKELY (list)) + g_queue_insert_before (rtpmp4gdepay->packets, list, outbuf); + else + g_queue_push_tail (rtpmp4gdepay->packets, outbuf); + } +} + +static GstBuffer * +gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpMP4GDepay *rtpmp4gdepay; + GstBuffer *outbuf; + GstClockTime timestamp; + + rtpmp4gdepay = GST_RTP_MP4G_DEPAY (depayload); + + /* flush remaining data on discont */ + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "received DISCONT"); + gst_adapter_clear (rtpmp4gdepay->adapter); + } + + timestamp = GST_BUFFER_TIMESTAMP (buf); + + { + gint payload_len, payload_AU; + guint8 *payload; + guint32 rtptime; + guint AU_headers_len; + guint AU_size, AU_index, AU_index_delta, payload_AU_size; + gboolean M; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + payload = gst_rtp_buffer_get_payload (buf); + + GST_DEBUG_OBJECT (rtpmp4gdepay, "received payload of %d", payload_len); + + rtptime = gst_rtp_buffer_get_timestamp (buf); + M = gst_rtp_buffer_get_marker (buf); + + if (rtpmp4gdepay->sizelength > 0) { + gint num_AU_headers, AU_headers_bytes, i; + GstBsParse bs; + + if (payload_len < 2) + goto short_payload; + + /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ + * |AU-headers-length|AU-header|AU-header| |AU-header|padding| + * | | (1) | (2) | | (n) * | bits | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ + * + * The length is 2 bytes and contains the length of the following + * AU-headers in bits. + */ + AU_headers_len = (payload[0] << 8) | payload[1]; + AU_headers_bytes = (AU_headers_len + 7) / 8; + num_AU_headers = AU_headers_len / 16; + + GST_DEBUG_OBJECT (rtpmp4gdepay, "AU headers len %d, bytes %d, num %d", + AU_headers_len, AU_headers_bytes, num_AU_headers); + + /* skip header */ + payload += 2; + payload_len -= 2; + + if (payload_len < AU_headers_bytes) + goto short_payload; + + /* skip special headers, point to first payload AU */ + payload_AU = 2 + AU_headers_bytes; + payload_AU_size = payload_len - AU_headers_bytes; + + if (G_UNLIKELY (rtpmp4gdepay->auxiliarydatasizelength)) { + gint aux_size; + + /* point the bitstream parser to the first auxiliary data bit */ + gst_bs_parse_init (&bs, payload + AU_headers_bytes, + payload_len - AU_headers_bytes); + aux_size = + gst_bs_parse_read (&bs, rtpmp4gdepay->auxiliarydatasizelength); + /* convert to bytes */ + aux_size = (aux_size + 7) / 8; + /* AU data then follows auxiliary data */ + if (payload_AU_size < aux_size) + goto short_payload; + payload_AU += aux_size; + payload_AU_size -= aux_size; + } + + /* point the bitstream parser to the first AU header bit */ + gst_bs_parse_init (&bs, payload, payload_len); + AU_index = AU_index_delta = 0; + + for (i = 0; i < num_AU_headers && payload_AU_size > 0; i++) { + /* parse AU header + * +---------------------------------------+ + * | AU-size | + * +---------------------------------------+ + * | AU-Index / AU-Index-delta | + * +---------------------------------------+ + * | CTS-flag | + * +---------------------------------------+ + * | CTS-delta | + * +---------------------------------------+ + * | DTS-flag | + * +---------------------------------------+ + * | DTS-delta | + * +---------------------------------------+ + * | RAP-flag | + * +---------------------------------------+ + * | Stream-state | + * +---------------------------------------+ + */ + AU_size = gst_bs_parse_read (&bs, rtpmp4gdepay->sizelength); + + /* calculate the AU_index, which is only on the first AU of the packet + * and the AU_index_delta on the other AUs. This will be used to + * reconstruct the AU ordering when interleaving. */ + if (i == 0) { + AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexlength); + + GST_DEBUG_OBJECT (rtpmp4gdepay, "AU index %u", AU_index); + + if (AU_index == 0 && rtpmp4gdepay->prev_AU_index == 0) { + gint diff; + gint cd; + + /* if we see two consecutive packets with AU_index of 0, we can + * assume we have constantDuration packets. Since we don't have + * the index we must use the AU duration to calculate the + * index. Get the diff between the timestamps first, this can be + * positive or negative. */ + if (rtpmp4gdepay->prev_rtptime <= rtptime) + diff = rtptime - rtpmp4gdepay->prev_rtptime; + else + diff = -(rtpmp4gdepay->prev_rtptime - rtptime); + + /* if no constantDuration was given, make one */ + if (rtpmp4gdepay->constantDuration != 0) { + cd = rtpmp4gdepay->constantDuration; + GST_DEBUG_OBJECT (depayload, "using constantDuration %d", cd); + } else if (rtpmp4gdepay->prev_AU_num > 0) { + /* use number of packets and of previous frame */ + cd = diff / rtpmp4gdepay->prev_AU_num; + GST_DEBUG_OBJECT (depayload, "guessing constantDuration %d", cd); + } else { + /* assume this frame has the same number of packets as the + * previous one */ + cd = diff / num_AU_headers; + GST_DEBUG_OBJECT (depayload, "guessing constantDuration %d", cd); + } + + if (cd > 0) { + /* get the number of packets by dividing with the duration */ + diff /= cd; + } else { + diff = 0; + } + + rtpmp4gdepay->last_AU_index += diff; + rtpmp4gdepay->prev_AU_index = AU_index; + + AU_index = rtpmp4gdepay->last_AU_index; + + GST_DEBUG_OBJECT (rtpmp4gdepay, "diff %d, AU index %u", diff, + AU_index); + } else { + rtpmp4gdepay->prev_AU_index = AU_index; + rtpmp4gdepay->last_AU_index = AU_index; + } + + /* keep track of the higest AU_index */ + if (rtpmp4gdepay->max_AU_index != -1 + && rtpmp4gdepay->max_AU_index <= AU_index) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "new interleave group, flushing"); + /* a new interleave group started, flush */ + gst_rtp_mp4g_depay_flush_queue (rtpmp4gdepay); + } + if (G_UNLIKELY (!rtpmp4gdepay->maxDisplacement && + rtpmp4gdepay->max_AU_index != -1 + && rtpmp4gdepay->max_AU_index >= AU_index)) { + GstBuffer *outbuf; + + /* some broken non-interleaved streams have AU-index jumping around + * all over the place, apparently assuming receiver disregards */ + GST_DEBUG_OBJECT (rtpmp4gdepay, "non-interleaved broken AU indices;" + " forcing continuous flush"); + /* reset AU to avoid repeated DISCONT in such case */ + outbuf = g_queue_peek_head (rtpmp4gdepay->packets); + if (G_LIKELY (outbuf)) { + rtpmp4gdepay->next_AU_index = GST_BUFFER_OFFSET (outbuf); + gst_rtp_mp4g_depay_flush_queue (rtpmp4gdepay); + } + /* rebase next_AU_index to current rtp's first AU_index */ + rtpmp4gdepay->next_AU_index = AU_index; + } + rtpmp4gdepay->prev_rtptime = rtptime; + rtpmp4gdepay->prev_AU_num = num_AU_headers; + } else { + AU_index_delta = + gst_bs_parse_read (&bs, rtpmp4gdepay->indexdeltalength); + AU_index += AU_index_delta + 1; + } + /* keep track of highest AU_index */ + if (rtpmp4gdepay->max_AU_index == -1 + || AU_index > rtpmp4gdepay->max_AU_index) + rtpmp4gdepay->max_AU_index = AU_index; + + /* the presentation time offset, a 2s-complement value, we need this to + * calculate the timestamp on the output packet. */ + if (rtpmp4gdepay->ctsdeltalength > 0) { + if (gst_bs_parse_read (&bs, 1)) + gst_bs_parse_read (&bs, rtpmp4gdepay->ctsdeltalength); + } + /* the decoding time offset, a 2s-complement value */ + if (rtpmp4gdepay->dtsdeltalength > 0) { + if (gst_bs_parse_read (&bs, 1)) + gst_bs_parse_read (&bs, rtpmp4gdepay->dtsdeltalength); + } + /* RAP-flag to indicate that the AU contains a keyframe */ + if (rtpmp4gdepay->randomaccessindication) + gst_bs_parse_read (&bs, 1); + /* stream-state */ + if (rtpmp4gdepay->streamstateindication > 0) + gst_bs_parse_read (&bs, rtpmp4gdepay->streamstateindication); + + GST_DEBUG_OBJECT (rtpmp4gdepay, "size %d, index %d, delta %d", AU_size, + AU_index, AU_index_delta); + + /* fragmented pakets have the AU_size set to the size of the + * unfragmented AU. */ + if (AU_size > payload_AU_size) + AU_size = payload_AU_size; + + /* collect stuff in the adapter, strip header from payload and push in + * the adapter */ + outbuf = + gst_rtp_buffer_get_payload_subbuffer (buf, payload_AU, AU_size); + gst_adapter_push (rtpmp4gdepay->adapter, outbuf); + + if (M) { + guint avail; + + /* packet is complete, flush */ + avail = gst_adapter_available (rtpmp4gdepay->adapter); + + outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); + + /* copy some of the fields we calculated above on the buffer. We also + * copy the AU_index so that we can sort the packets in our queue. */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_OFFSET (outbuf) = AU_index; + + /* make sure we don't use the timestamp again for other AUs in this + * RTP packet. */ + timestamp = -1; + + GST_DEBUG_OBJECT (depayload, "pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + gst_rtp_mp4g_depay_queue (rtpmp4gdepay, outbuf); + + } + payload_AU += AU_size; + payload_AU_size -= AU_size; + } + } else { + /* push complete buffer in adapter */ + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 0, payload_len); + gst_adapter_push (rtpmp4gdepay->adapter, outbuf); + + /* if this was the last packet of the VOP, create and push a buffer */ + if (M) { + guint avail; + + avail = gst_adapter_available (rtpmp4gdepay->adapter); + + outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); + + GST_DEBUG ("gst_rtp_mp4g_depay_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + return outbuf; + } + } + } + return NULL; + + /* ERRORS */ +short_payload: + { + GST_ELEMENT_WARNING (rtpmp4gdepay, STREAM, DECODE, + ("Packet payload was too short."), (NULL)); + return NULL; + } +} + +static gboolean +gst_rtp_mp4g_depay_handle_event (GstBaseRTPDepayload * filter, GstEvent * event) +{ + gboolean ret; + GstRtpMP4GDepay *rtpmp4gdepay; + + rtpmp4gdepay = GST_RTP_MP4G_DEPAY (filter); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_rtp_mp4g_depay_reset (rtpmp4gdepay); + break; + default: + break; + } + + ret = + GST_BASE_RTP_DEPAYLOAD_CLASS (parent_class)->handle_event (filter, event); + + return ret; +} + +static GstStateChangeReturn +gst_rtp_mp4g_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpMP4GDepay *rtpmp4gdepay; + GstStateChangeReturn ret; + + rtpmp4gdepay = GST_RTP_MP4G_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_mp4g_depay_reset (rtpmp4gdepay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_mp4g_depay_reset (rtpmp4gdepay); + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_mp4g_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp4gdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP4G_DEPAY); +} diff --git a/gst/rtp/gstrtpmp4gdepay.h b/gst/rtp/gstrtpmp4gdepay.h new file mode 100644 index 0000000..cd088e5 --- /dev/null +++ b/gst/rtp/gstrtpmp4gdepay.h @@ -0,0 +1,86 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_MP4G_DEPAY_H__ +#define __GST_RTP_MP4G_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MP4G_DEPAY \ + (gst_rtp_mp4g_depay_get_type()) +#define GST_RTP_MP4G_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4G_DEPAY,GstRtpMP4GDepay)) +#define GST_RTP_MP4G_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4G_DEPAY,GstRtpMP4GDepayClass)) +#define GST_IS_RTP_MP4G_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4G_DEPAY)) +#define GST_IS_RTP_MP4G_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4G_DEPAY)) + +typedef struct _GstRtpMP4GDepay GstRtpMP4GDepay; +typedef struct _GstRtpMP4GDepayClass GstRtpMP4GDepayClass; + +struct _GstRtpMP4GDepay +{ + GstBaseRTPDepayload depayload; + + gint profile_level_id; + gint streamtype; + + gint constantSize; + gint constantDuration; + gint maxDisplacement; + + gint sizelength; + gint indexlength; + gint indexdeltalength; + gint ctsdeltalength; + gint dtsdeltalength; + gint randomaccessindication; + gint streamstateindication; + gint auxiliarydatasizelength; + + guint max_AU_index; + guint prev_AU_index; + guint last_AU_index; + guint next_AU_index; + guint32 prev_rtptime; + guint prev_AU_num; + + GQueue *packets; + + GstAdapter *adapter; +}; + +struct _GstRtpMP4GDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_mp4g_depay_get_type (void); + +gboolean gst_rtp_mp4g_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP4G_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpmp4gpay.c b/gst/rtp/gstrtpmp4gpay.c new file mode 100644 index 0000000..4100ab7 --- /dev/null +++ b/gst/rtp/gstrtpmp4gpay.c @@ -0,0 +1,631 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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 + +#include +#include + +#include "gstrtpmp4gpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmp4gpay_debug); +#define GST_CAT_DEFAULT (rtpmp4gpay_debug) + +static GstStaticPadTemplate gst_rtp_mp4g_pay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg," + "mpegversion=(int) 4," + "systemstream=(boolean)false;" + "audio/mpeg," "mpegversion=(int) 4, " "stream-format=(string) raw") + ); + +static GstStaticPadTemplate gst_rtp_mp4g_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) { \"video\", \"audio\", \"application\" }, " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " + "encoding-name = (string) \"MPEG4-GENERIC\", " + /* required string params */ + "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ + /* "profile-level-id = (string) [1,MAX], " */ + /* "config = (string) [1,MAX]" */ + "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" } " + /* Optional general parameters */ + /* "objecttype = (string) [1,MAX], " */ + /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */ + /* "constantduration = (string) [1,MAX], " *//* constant duration of each AU */ + /* "maxdisplacement = (string) [1,MAX], " */ + /* "de-interleavebuffersize = (string) [1,MAX], " */ + /* Optional configuration parameters */ + /* "sizelength = (string) [1, 16], " *//* max 16 bits, should be enough... */ + /* "indexlength = (string) [1, 8], " */ + /* "indexdeltalength = (string) [1, 8], " */ + /* "ctsdeltalength = (string) [1, 64], " */ + /* "dtsdeltalength = (string) [1, 64], " */ + /* "randomaccessindication = (string) {0, 1}, " */ + /* "streamstateindication = (string) [0, 64], " */ + /* "auxiliarydatasizelength = (string) [0, 64]" */ ) + ); + + +static void gst_rtp_mp4g_pay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_mp4g_pay_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_rtp_mp4g_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_mp4g_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); +static gboolean gst_rtp_mp4g_pay_handle_event (GstPad * pad, GstEvent * event); + +GST_BOILERPLATE (GstRtpMP4GPay, gst_rtp_mp4g_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_mp4g_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4g_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4g_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP MPEG4 ES payloader", + "Codec/Payloader/Network/RTP", + "Payload MPEG4 elementary streams as RTP packets (RFC 3640)", + "Wim Taymans "); +} + +static void +gst_rtp_mp4g_pay_class_init (GstRtpMP4GPayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mp4g_pay_finalize; + + gstelement_class->change_state = gst_rtp_mp4g_pay_change_state; + + gstbasertppayload_class->set_caps = gst_rtp_mp4g_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_mp4g_pay_handle_buffer; + gstbasertppayload_class->handle_event = gst_rtp_mp4g_pay_handle_event; + + GST_DEBUG_CATEGORY_INIT (rtpmp4gpay_debug, "rtpmp4gpay", 0, + "MP4-generic RTP Payloader"); +} + +static void +gst_rtp_mp4g_pay_init (GstRtpMP4GPay * rtpmp4gpay, GstRtpMP4GPayClass * klass) +{ + rtpmp4gpay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_mp4g_pay_reset (GstRtpMP4GPay * rtpmp4gpay) +{ + GST_DEBUG_OBJECT (rtpmp4gpay, "reset"); + + gst_adapter_clear (rtpmp4gpay->adapter); + rtpmp4gpay->offset = 0; +} + +static void +gst_rtp_mp4g_pay_cleanup (GstRtpMP4GPay * rtpmp4gpay) +{ + gst_rtp_mp4g_pay_reset (rtpmp4gpay); + + g_free (rtpmp4gpay->params); + rtpmp4gpay->params = NULL; + + if (rtpmp4gpay->config) + gst_buffer_unref (rtpmp4gpay->config); + rtpmp4gpay->config = NULL; + + g_free (rtpmp4gpay->profile); + rtpmp4gpay->profile = NULL; + + rtpmp4gpay->streamtype = NULL; + rtpmp4gpay->mode = NULL; + + rtpmp4gpay->frame_len = 0; +} + +static void +gst_rtp_mp4g_pay_finalize (GObject * object) +{ + GstRtpMP4GPay *rtpmp4gpay; + + rtpmp4gpay = GST_RTP_MP4G_PAY (object); + + gst_rtp_mp4g_pay_cleanup (rtpmp4gpay); + + g_object_unref (rtpmp4gpay->adapter); + rtpmp4gpay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static const unsigned int sampling_table[16] = { + 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, + 16000, 12000, 11025, 8000, 7350, 0, 0, 0 +}; + +static gboolean +gst_rtp_mp4g_pay_parse_audio_config (GstRtpMP4GPay * rtpmp4gpay, + GstBuffer * buffer) +{ + guint8 *data; + guint size; + guint8 objectType = 0; + guint8 samplingIdx = 0; + guint8 channelCfg = 0; + GstBitReader br; + + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + gst_bit_reader_init (&br, data, size); + + /* any object type is fine, we need to copy it to the profile-level-id field. */ + if (!gst_bit_reader_get_bits_uint8 (&br, &objectType, 5)) + goto too_short; + if (objectType == 0) + goto invalid_object; + + if (!gst_bit_reader_get_bits_uint8 (&br, &samplingIdx, 4)) + goto too_short; + /* only fixed values for now */ + if (samplingIdx > 12 && samplingIdx != 15) + goto wrong_freq; + + if (!gst_bit_reader_get_bits_uint8 (&br, &channelCfg, 4)) + goto too_short; + if (channelCfg > 7) + goto wrong_channels; + + /* rtp rate depends on sampling rate of the audio */ + if (samplingIdx == 15) { + guint32 rate = 0; + + /* index of 15 means we get the rate in the next 24 bits */ + if (!gst_bit_reader_get_bits_uint32 (&br, &rate, 24)) + goto too_short; + + rtpmp4gpay->rate = rate; + } else { + /* else use the rate from the table */ + rtpmp4gpay->rate = sampling_table[samplingIdx]; + } + + rtpmp4gpay->frame_len = 1024; + + switch (objectType) { + case 1: + case 2: + case 3: + case 4: + case 6: + case 7: + { + guint8 frameLenFlag = 0; + + if (gst_bit_reader_get_bits_uint8 (&br, &frameLenFlag, 1)) + if (frameLenFlag) + rtpmp4gpay->frame_len = 960; + + break; + } + default: + break; + } + + /* extra rtp params contain the number of channels */ + g_free (rtpmp4gpay->params); + rtpmp4gpay->params = g_strdup_printf ("%d", channelCfg); + /* audio stream type */ + rtpmp4gpay->streamtype = "5"; + /* mode only high bitrate for now */ + rtpmp4gpay->mode = "AAC-hbr"; + /* profile */ + g_free (rtpmp4gpay->profile); + rtpmp4gpay->profile = g_strdup_printf ("%d", objectType); + + GST_DEBUG_OBJECT (rtpmp4gpay, + "objectType: %d, samplingIdx: %d (%d), channelCfg: %d, frame_len %d", + objectType, samplingIdx, rtpmp4gpay->rate, channelCfg, + rtpmp4gpay->frame_len); + + return TRUE; + + /* ERROR */ +too_short: + { + GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, FORMAT, + (NULL), ("config string too short")); + return FALSE; + } +invalid_object: + { + GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, FORMAT, + (NULL), ("invalid object type")); + return FALSE; + } +wrong_freq: + { + GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, NOT_IMPLEMENTED, + (NULL), ("unsupported frequency index %d", samplingIdx)); + return FALSE; + } +wrong_channels: + { + GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, NOT_IMPLEMENTED, + (NULL), ("unsupported number of channels %d, must < 8", channelCfg)); + return FALSE; + } +} + +#define VOS_STARTCODE 0x000001B0 + +static gboolean +gst_rtp_mp4g_pay_parse_video_config (GstRtpMP4GPay * rtpmp4gpay, + GstBuffer * buffer) +{ + guint8 *data; + guint size; + guint32 code; + + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + if (size < 5) + goto too_short; + + code = GST_READ_UINT32_BE (data); + + g_free (rtpmp4gpay->profile); + if (code == VOS_STARTCODE) { + /* get profile */ + rtpmp4gpay->profile = g_strdup_printf ("%d", (gint) data[4]); + } else { + GST_ELEMENT_WARNING (rtpmp4gpay, STREAM, FORMAT, + (NULL), ("profile not found in config string, assuming \'1\'")); + rtpmp4gpay->profile = g_strdup ("1"); + } + + /* fixed rate */ + rtpmp4gpay->rate = 90000; + /* video stream type */ + rtpmp4gpay->streamtype = "4"; + /* no params for video */ + rtpmp4gpay->params = NULL; + /* mode */ + rtpmp4gpay->mode = "generic"; + + GST_LOG_OBJECT (rtpmp4gpay, "profile %s", rtpmp4gpay->profile); + + return TRUE; + + /* ERROR */ +too_short: + { + GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, FORMAT, + (NULL), ("config string too short")); + return FALSE; + } +} + +static gboolean +gst_rtp_mp4g_pay_new_caps (GstRtpMP4GPay * rtpmp4gpay) +{ + gchar *config; + GValue v = { 0 }; + gboolean res; + +#define MP4GCAPS \ + "streamtype", G_TYPE_STRING, rtpmp4gpay->streamtype, \ + "profile-level-id", G_TYPE_STRING, rtpmp4gpay->profile, \ + "mode", G_TYPE_STRING, rtpmp4gpay->mode, \ + "config", G_TYPE_STRING, config, \ + "sizelength", G_TYPE_STRING, "13", \ + "indexlength", G_TYPE_STRING, "3", \ + "indexdeltalength", G_TYPE_STRING, "3", \ + NULL + + g_value_init (&v, GST_TYPE_BUFFER); + gst_value_set_buffer (&v, rtpmp4gpay->config); + config = gst_value_serialize (&v); + + /* hmm, silly */ + if (rtpmp4gpay->params) { + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), + "encoding-params", G_TYPE_STRING, rtpmp4gpay->params, MP4GCAPS); + } else { + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), + MP4GCAPS); + } + + g_value_unset (&v); + g_free (config); + +#undef MP4GCAPS + return res; +} + +static gboolean +gst_rtp_mp4g_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + GstRtpMP4GPay *rtpmp4gpay; + GstStructure *structure; + const GValue *codec_data; + const gchar *media_type = NULL; + gboolean res; + + rtpmp4gpay = GST_RTP_MP4G_PAY (payload); + + structure = gst_caps_get_structure (caps, 0); + + codec_data = gst_structure_get_value (structure, "codec_data"); + if (codec_data) { + GST_LOG_OBJECT (rtpmp4gpay, "got codec_data"); + if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { + GstBuffer *buffer; + const gchar *name; + + buffer = gst_value_get_buffer (codec_data); + GST_LOG_OBJECT (rtpmp4gpay, "configuring codec_data"); + + name = gst_structure_get_name (structure); + + /* parse buffer */ + if (!strcmp (name, "audio/mpeg")) { + res = gst_rtp_mp4g_pay_parse_audio_config (rtpmp4gpay, buffer); + media_type = "audio"; + } else if (!strcmp (name, "video/mpeg")) { + res = gst_rtp_mp4g_pay_parse_video_config (rtpmp4gpay, buffer); + media_type = "video"; + } else { + res = FALSE; + } + if (!res) + goto config_failed; + + /* now we can configure the buffer */ + if (rtpmp4gpay->config) + gst_buffer_unref (rtpmp4gpay->config); + + rtpmp4gpay->config = gst_buffer_copy (buffer); + } + } + if (media_type == NULL) + goto config_failed; + + gst_basertppayload_set_options (payload, media_type, TRUE, "MPEG4-GENERIC", + rtpmp4gpay->rate); + + res = gst_rtp_mp4g_pay_new_caps (rtpmp4gpay); + + return res; + + /* ERRORS */ +config_failed: + { + GST_DEBUG_OBJECT (rtpmp4gpay, "failed to parse config"); + return FALSE; + } +} + +static GstFlowReturn +gst_rtp_mp4g_pay_flush (GstRtpMP4GPay * rtpmp4gpay) +{ + guint avail, total; + GstBuffer *outbuf; + GstFlowReturn ret; + guint mtu; + + /* the data available in the adapter is either smaller + * than the MTU or bigger. In the case it is smaller, the complete + * adapter contents can be put in one packet. In the case the + * adapter has more than one MTU, we need to fragment the MPEG data + * over multiple packets. */ + total = avail = gst_adapter_available (rtpmp4gpay->adapter); + + ret = GST_FLOW_OK; + mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpmp4gpay); + + while (avail > 0) { + guint towrite; + guint8 *payload; + guint payload_len; + guint packet_len; + + /* this will be the total lenght of the packet */ + packet_len = gst_rtp_buffer_calc_packet_len (avail, 0, 0); + + /* fill one MTU or all available bytes, we need 4 spare bytes for + * the AU header. */ + towrite = MIN (packet_len, mtu - 4); + + /* this is the payload length */ + payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); + + GST_DEBUG_OBJECT (rtpmp4gpay, + "avail %d, towrite %d, packet_len %d, payload_len %d", avail, towrite, + packet_len, payload_len); + + /* create buffer to hold the payload, also make room for the 4 header bytes. */ + outbuf = gst_rtp_buffer_new_allocate (payload_len + 4, 0, 0); + + /* copy payload */ + payload = gst_rtp_buffer_get_payload (outbuf); + + /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ + * |AU-headers-length|AU-header|AU-header| |AU-header|padding| + * | | (1) | (2) | | (n) | bits | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ + */ + /* AU-headers-length, we only have 1 AU-header */ + payload[0] = 0x00; + payload[1] = 0x10; /* we use 16 bits for the header */ + + /* +---------------------------------------+ + * | AU-size | + * +---------------------------------------+ + * | AU-Index / AU-Index-delta | + * +---------------------------------------+ + * | CTS-flag | + * +---------------------------------------+ + * | CTS-delta | + * +---------------------------------------+ + * | DTS-flag | + * +---------------------------------------+ + * | DTS-delta | + * +---------------------------------------+ + * | RAP-flag | + * +---------------------------------------+ + * | Stream-state | + * +---------------------------------------+ + */ + /* The AU-header, no CTS, DTS, RAP, Stream-state + * + * AU-size is always the total size of the AU, not the fragmented size + */ + payload[2] = (total & 0x1fe0) >> 5; + payload[3] = (total & 0x1f) << 3; /* we use 13 bits for the size, 3 bits index */ + + /* copy stuff from adapter to payload */ + gst_adapter_copy (rtpmp4gpay->adapter, &payload[4], 0, payload_len); + gst_adapter_flush (rtpmp4gpay->adapter, payload_len); + + /* marker only if the packet is complete */ + gst_rtp_buffer_set_marker (outbuf, avail <= payload_len); + + GST_BUFFER_TIMESTAMP (outbuf) = rtpmp4gpay->first_timestamp; + GST_BUFFER_DURATION (outbuf) = rtpmp4gpay->first_duration; + + if (rtpmp4gpay->frame_len) { + GST_BUFFER_OFFSET (outbuf) = rtpmp4gpay->offset; + rtpmp4gpay->offset += rtpmp4gpay->frame_len; + } + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), outbuf); + + avail -= payload_len; + } + + return ret; +} + +/* we expect buffers as exactly one complete AU + */ +static GstFlowReturn +gst_rtp_mp4g_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpMP4GPay *rtpmp4gpay; + + rtpmp4gpay = GST_RTP_MP4G_PAY (basepayload); + + rtpmp4gpay->first_timestamp = GST_BUFFER_TIMESTAMP (buffer); + rtpmp4gpay->first_duration = GST_BUFFER_DURATION (buffer); + + /* we always encode and flush a full AU */ + gst_adapter_push (rtpmp4gpay->adapter, buffer); + + return gst_rtp_mp4g_pay_flush (rtpmp4gpay); +} + +static gboolean +gst_rtp_mp4g_pay_handle_event (GstPad * pad, GstEvent * event) +{ + GstRtpMP4GPay *rtpmp4gpay; + + rtpmp4gpay = GST_RTP_MP4G_PAY (gst_pad_get_parent (pad)); + + GST_DEBUG ("Got event: %s", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + case GST_EVENT_EOS: + /* This flush call makes sure that the last buffer is always pushed + * to the base payloader */ + gst_rtp_mp4g_pay_flush (rtpmp4gpay); + break; + case GST_EVENT_FLUSH_STOP: + gst_rtp_mp4g_pay_reset (rtpmp4gpay); + break; + default: + break; + } + + g_object_unref (rtpmp4gpay); + + /* let parent handle event too */ + return FALSE; +} + +static GstStateChangeReturn +gst_rtp_mp4g_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstRtpMP4GPay *rtpmp4gpay; + + rtpmp4gpay = GST_RTP_MP4G_PAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_mp4g_pay_cleanup (rtpmp4gpay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_mp4g_pay_cleanup (rtpmp4gpay); + break; + default: + break; + } + + return ret; +} + +gboolean +gst_rtp_mp4g_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp4gpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP4G_PAY); +} diff --git a/gst/rtp/gstrtpmp4gpay.h b/gst/rtp/gstrtpmp4gpay.h new file mode 100644 index 0000000..d79e5df --- /dev/null +++ b/gst/rtp/gstrtpmp4gpay.h @@ -0,0 +1,73 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_MP4G_PAY_H__ +#define __GST_RTP_MP4G_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MP4G_PAY \ + (gst_rtp_mp4g_pay_get_type()) +#define GST_RTP_MP4G_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4G_PAY,GstRtpMP4GPay)) +#define GST_RTP_MP4G_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4G_PAY,GstRtpMP4GPayClass)) +#define GST_IS_RTP_MP4G_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4G_PAY)) +#define GST_IS_RTP_MP4G_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4G_PAY)) + +typedef struct _GstRtpMP4GPay GstRtpMP4GPay; +typedef struct _GstRtpMP4GPayClass GstRtpMP4GPayClass; + +struct _GstRtpMP4GPay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime first_timestamp; + GstClockTime first_duration; + GstClockTime duration; + guint64 offset; + + gint rate; + gchar *params; + gchar *profile; + const gchar *streamtype; + const gchar *mode; + GstBuffer *config; + guint frame_len; +}; + +struct _GstRtpMP4GPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_mp4g_pay_get_type (void); + +gboolean gst_rtp_mp4g_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP4G_PAY_H__ */ diff --git a/gst/rtp/gstrtpmp4vdepay.c b/gst/rtp/gstrtpmp4vdepay.c new file mode 100644 index 0000000..ba3fef2 --- /dev/null +++ b/gst/rtp/gstrtpmp4vdepay.c @@ -0,0 +1,231 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include +#include "gstrtpmp4vdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmp4vdepay_debug); +#define GST_CAT_DEFAULT (rtpmp4vdepay_debug) + +static GstStaticPadTemplate gst_rtp_mp4v_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg," + "mpegversion=(int) 4," "systemstream=(boolean)false") + ); + +static GstStaticPadTemplate gst_rtp_mp4v_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP4V-ES\"" + /* All optional parameters + * + * "profile-level-id=[1,MAX]" + * "config=" + */ + ) + ); + +GST_BOILERPLATE (GstRtpMP4VDepay, gst_rtp_mp4v_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_mp4v_depay_finalize (GObject * object); + +static gboolean gst_rtp_mp4v_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_mp4v_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static GstStateChangeReturn gst_rtp_mp4v_depay_change_state (GstElement * + element, GstStateChange transition); + + +static void +gst_rtp_mp4v_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4v_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4v_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG4 video depayloader", "Codec/Depayloader/Network/RTP", + "Extracts MPEG4 video from RTP packets (RFC 3016)", + "Wim Taymans "); +} + +static void +gst_rtp_mp4v_depay_class_init (GstRtpMP4VDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mp4v_depay_finalize; + + gstelement_class->change_state = gst_rtp_mp4v_depay_change_state; + + gstbasertpdepayload_class->process = gst_rtp_mp4v_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_mp4v_depay_setcaps; + + GST_DEBUG_CATEGORY_INIT (rtpmp4vdepay_debug, "rtpmp4vdepay", 0, + "MPEG4 video RTP Depayloader"); +} + +static void +gst_rtp_mp4v_depay_init (GstRtpMP4VDepay * rtpmp4vdepay, + GstRtpMP4VDepayClass * klass) +{ + rtpmp4vdepay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_mp4v_depay_finalize (GObject * object) +{ + GstRtpMP4VDepay *rtpmp4vdepay; + + rtpmp4vdepay = GST_RTP_MP4V_DEPAY (object); + + g_object_unref (rtpmp4vdepay->adapter); + rtpmp4vdepay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_mp4v_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstCaps *srccaps; + const gchar *str; + gint clock_rate; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("video/mpeg", + "mpegversion", G_TYPE_INT, 4, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + + if ((str = gst_structure_get_string (structure, "config"))) { + GValue v = { 0 }; + + g_value_init (&v, GST_TYPE_BUFFER); + if (gst_value_deserialize (&v, str)) { + GstBuffer *buffer; + + buffer = gst_value_get_buffer (&v); + gst_caps_set_simple (srccaps, + "codec_data", GST_TYPE_BUFFER, buffer, NULL); + /* caps takes ref */ + g_value_unset (&v); + } else { + g_warning ("cannot convert config to buffer"); + } + } + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return res; +} + +static GstBuffer * +gst_rtp_mp4v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpMP4VDepay *rtpmp4vdepay; + GstBuffer *outbuf; + + rtpmp4vdepay = GST_RTP_MP4V_DEPAY (depayload); + + /* flush remaining data on discont */ + if (GST_BUFFER_IS_DISCONT (buf)) + gst_adapter_clear (rtpmp4vdepay->adapter); + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + gst_adapter_push (rtpmp4vdepay->adapter, outbuf); + + /* if this was the last packet of the VOP, create and push a buffer */ + if (gst_rtp_buffer_get_marker (buf)) { + guint avail; + + avail = gst_adapter_available (rtpmp4vdepay->adapter); + + outbuf = gst_adapter_take_buffer (rtpmp4vdepay->adapter, avail); + + GST_DEBUG ("gst_rtp_mp4v_depay_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + return outbuf; + } + return NULL; +} + +static GstStateChangeReturn +gst_rtp_mp4v_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpMP4VDepay *rtpmp4vdepay; + GstStateChangeReturn ret; + + rtpmp4vdepay = GST_RTP_MP4V_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (rtpmp4vdepay->adapter); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + default: + break; + } + return ret; +} + +gboolean +gst_rtp_mp4v_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp4vdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP4V_DEPAY); +} diff --git a/gst/rtp/gstrtpmp4vdepay.h b/gst/rtp/gstrtpmp4vdepay.h new file mode 100644 index 0000000..043ea8b --- /dev/null +++ b/gst/rtp/gstrtpmp4vdepay.h @@ -0,0 +1,61 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_MP4V_DEPAY_H__ +#define __GST_RTP_MP4V_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MP4V_DEPAY \ + (gst_rtp_mp4v_depay_get_type()) +#define GST_RTP_MP4V_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4V_DEPAY,GstRtpMP4VDepay)) +#define GST_RTP_MP4V_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4V_DEPAY,GstRtpMP4VDepayClass)) +#define GST_IS_RTP_MP4V_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4V_DEPAY)) +#define GST_IS_RTP_MP4V_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4V_DEPAY)) + +typedef struct _GstRtpMP4VDepay GstRtpMP4VDepay; +typedef struct _GstRtpMP4VDepayClass GstRtpMP4VDepayClass; + +struct _GstRtpMP4VDepay +{ + GstBaseRTPDepayload depayload; + + GstAdapter *adapter; +}; + +struct _GstRtpMP4VDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_mp4v_depay_get_type (void); + +gboolean gst_rtp_mp4v_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP4V_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpmp4vpay.c b/gst/rtp/gstrtpmp4vpay.c new file mode 100644 index 0000000..5707a66 --- /dev/null +++ b/gst/rtp/gstrtpmp4vpay.c @@ -0,0 +1,676 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include + +#include "gstrtpmp4vpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmp4vpay_debug); +#define GST_CAT_DEFAULT (rtpmp4vpay_debug) + +static GstStaticPadTemplate gst_rtp_mp4v_pay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg," + "mpegversion=(int) 4," "systemstream=(boolean)false;" "video/x-xvid") + ); + +static GstStaticPadTemplate gst_rtp_mp4v_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP4V-ES\"" + /* two string params + * + "profile-level-id = (string) [1,MAX]" + "config = (string) [1,MAX]" + */ + ) + ); + +#define DEFAULT_SEND_CONFIG FALSE +#define DEFAULT_BUFFER_LIST FALSE +#define DEFAULT_CONFIG_INTERVAL 0 + +enum +{ + ARG_0, + ARG_SEND_CONFIG, + ARG_BUFFER_LIST, + ARG_CONFIG_INTERVAL +}; + + +static void gst_rtp_mp4v_pay_finalize (GObject * object); + +static void gst_rtp_mp4v_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_mp4v_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_rtp_mp4v_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_mp4v_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); +static gboolean gst_rtp_mp4v_pay_handle_event (GstPad * pad, GstEvent * event); + +GST_BOILERPLATE (GstRtpMP4VPay, gst_rtp_mp4v_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_mp4v_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4v_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mp4v_pay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG4 Video payloader", "Codec/Payloader/Network/RTP", + "Payload MPEG-4 video as RTP packets (RFC 3016)", + "Wim Taymans "); +} + +static void +gst_rtp_mp4v_pay_class_init (GstRtpMP4VPayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->set_property = gst_rtp_mp4v_pay_set_property; + gobject_class->get_property = gst_rtp_mp4v_pay_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SEND_CONFIG, + g_param_spec_boolean ("send-config", "Send Config", + "Send the config parameters in RTP packets as well(deprecated " + "see config-interval)", + DEFAULT_SEND_CONFIG, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFER_LIST, + g_param_spec_boolean ("buffer-list", "Buffer Array", + "Use Buffer Arrays", + DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CONFIG_INTERVAL, + g_param_spec_uint ("config-interval", "Config Send Interval", + "Send Config Insertion Interval in seconds (configuration headers " + "will be multiplexed in the data stream when detected.) (0 = disabled)", + 0, 3600, DEFAULT_CONFIG_INTERVAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) + ); + + gobject_class->finalize = gst_rtp_mp4v_pay_finalize; + + gstbasertppayload_class->set_caps = gst_rtp_mp4v_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_mp4v_pay_handle_buffer; + gstbasertppayload_class->handle_event = gst_rtp_mp4v_pay_handle_event; + + GST_DEBUG_CATEGORY_INIT (rtpmp4vpay_debug, "rtpmp4vpay", 0, + "MP4 video RTP Payloader"); +} + +static void +gst_rtp_mp4v_pay_init (GstRtpMP4VPay * rtpmp4vpay, GstRtpMP4VPayClass * klass) +{ + rtpmp4vpay->adapter = gst_adapter_new (); + rtpmp4vpay->rate = 90000; + rtpmp4vpay->profile = 1; + rtpmp4vpay->buffer_list = DEFAULT_BUFFER_LIST; + rtpmp4vpay->send_config = DEFAULT_SEND_CONFIG; + rtpmp4vpay->need_config = TRUE; + rtpmp4vpay->config_interval = DEFAULT_CONFIG_INTERVAL; + rtpmp4vpay->last_config = -1; + + rtpmp4vpay->config = NULL; +} + +static void +gst_rtp_mp4v_pay_finalize (GObject * object) +{ + GstRtpMP4VPay *rtpmp4vpay; + + rtpmp4vpay = GST_RTP_MP4V_PAY (object); + + if (rtpmp4vpay->config) { + gst_buffer_unref (rtpmp4vpay->config); + rtpmp4vpay->config = NULL; + } + g_object_unref (rtpmp4vpay->adapter); + rtpmp4vpay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_mp4v_pay_new_caps (GstRtpMP4VPay * rtpmp4vpay) +{ + gchar *profile, *config; + GValue v = { 0 }; + gboolean res; + + profile = g_strdup_printf ("%d", rtpmp4vpay->profile); + g_value_init (&v, GST_TYPE_BUFFER); + gst_value_set_buffer (&v, rtpmp4vpay->config); + config = gst_value_serialize (&v); + + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4vpay), + "profile-level-id", G_TYPE_STRING, profile, + "config", G_TYPE_STRING, config, NULL); + + g_value_unset (&v); + + g_free (profile); + g_free (config); + + return res; +} + +static gboolean +gst_rtp_mp4v_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + GstRtpMP4VPay *rtpmp4vpay; + GstStructure *structure; + const GValue *codec_data; + gboolean res; + + rtpmp4vpay = GST_RTP_MP4V_PAY (payload); + + gst_basertppayload_set_options (payload, "video", TRUE, "MP4V-ES", + rtpmp4vpay->rate); + + res = TRUE; + + structure = gst_caps_get_structure (caps, 0); + codec_data = gst_structure_get_value (structure, "codec_data"); + if (codec_data) { + GST_LOG_OBJECT (rtpmp4vpay, "got codec_data"); + if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { + GstBuffer *buffer; + guint8 *data; + guint size; + + buffer = gst_value_get_buffer (codec_data); + + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + if (size < 5) + goto done; + + rtpmp4vpay->profile = data[4]; + GST_LOG_OBJECT (rtpmp4vpay, "configuring codec_data, profile %d", + data[4]); + + if (rtpmp4vpay->config) + gst_buffer_unref (rtpmp4vpay->config); + rtpmp4vpay->config = gst_buffer_copy (buffer); + res = gst_rtp_mp4v_pay_new_caps (rtpmp4vpay); + } + } + +done: + return res; +} + +static void +gst_rtp_mp4v_pay_empty (GstRtpMP4VPay * rtpmp4vpay) +{ + gst_adapter_clear (rtpmp4vpay->adapter); +} + +static GstFlowReturn +gst_rtp_mp4v_pay_flush (GstRtpMP4VPay * rtpmp4vpay) +{ + guint avail; + GstBuffer *outbuf; + GstBuffer *outbuf_data = NULL; + GstFlowReturn ret; + GstBufferList *list = NULL; + GstBufferListIterator *it = NULL; + + /* the data available in the adapter is either smaller + * than the MTU or bigger. In the case it is smaller, the complete + * adapter contents can be put in one packet. In the case the + * adapter has more than one MTU, we need to split the MP4V data + * over multiple packets. */ + avail = gst_adapter_available (rtpmp4vpay->adapter); + + if (rtpmp4vpay->config == NULL && rtpmp4vpay->need_config) { + /* when we don't have a config yet, flush things out */ + gst_adapter_flush (rtpmp4vpay->adapter, avail); + avail = 0; + } + + if (!avail) + return GST_FLOW_OK; + + ret = GST_FLOW_OK; + + if (rtpmp4vpay->buffer_list) { + /* Use buffer lists. Each frame will be put into a list + * of buffers and the whole list will be pushed downstream + * at once */ + list = gst_buffer_list_new (); + it = gst_buffer_list_iterate (list); + } + + while (avail > 0) { + guint towrite; + guint8 *payload; + guint payload_len; + guint packet_len; + + /* this will be the total lenght of the packet */ + packet_len = gst_rtp_buffer_calc_packet_len (avail, 0, 0); + + /* fill one MTU or all available bytes */ + towrite = MIN (packet_len, GST_BASE_RTP_PAYLOAD_MTU (rtpmp4vpay)); + + /* this is the payload length */ + payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); + + if (rtpmp4vpay->buffer_list) { + /* create buffer without payload. The payload will be put + * in next buffer instead. Both buffers will be then added + * to the list */ + outbuf = gst_rtp_buffer_new_allocate (0, 0, 0); + + /* Take buffer with the payload from the adapter */ + outbuf_data = gst_adapter_take_buffer (rtpmp4vpay->adapter, payload_len); + } else { + /* create buffer to hold the payload */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + + /* copy payload */ + payload = gst_rtp_buffer_get_payload (outbuf); + + gst_adapter_copy (rtpmp4vpay->adapter, payload, 0, payload_len); + gst_adapter_flush (rtpmp4vpay->adapter, payload_len); + } + + avail -= payload_len; + + gst_rtp_buffer_set_marker (outbuf, avail == 0); + + GST_BUFFER_TIMESTAMP (outbuf) = rtpmp4vpay->first_timestamp; + + if (rtpmp4vpay->buffer_list) { + /* create a new group to hold the rtp header and the payload */ + gst_buffer_list_iterator_add_group (it); + gst_buffer_list_iterator_add (it, outbuf); + gst_buffer_list_iterator_add (it, outbuf_data); + } else { + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp4vpay), outbuf); + } + } + + if (rtpmp4vpay->buffer_list) { + gst_buffer_list_iterator_free (it); + /* push the whole buffer list at once */ + ret = + gst_basertppayload_push_list (GST_BASE_RTP_PAYLOAD (rtpmp4vpay), list); + } + + return ret; +} + +#define VOS_STARTCODE 0x000001B0 +#define VOS_ENDCODE 0x000001B1 +#define USER_DATA_STARTCODE 0x000001B2 +#define GOP_STARTCODE 0x000001B3 +#define VISUAL_OBJECT_STARTCODE 0x000001B5 +#define VOP_STARTCODE 0x000001B6 + +static gboolean +gst_rtp_mp4v_pay_depay_data (GstRtpMP4VPay * enc, guint8 * data, guint size, + gint * strip, gboolean * vopi) +{ + guint32 code; + gboolean result; + *vopi = FALSE; + + *strip = 0; + + if (size < 5) + return FALSE; + + code = GST_READ_UINT32_BE (data); + GST_DEBUG_OBJECT (enc, "start code 0x%08x", code); + + switch (code) { + case VOS_STARTCODE: + case 0x00000101: + { + gint i; + guint8 profile; + gboolean newprofile = FALSE; + gboolean equal; + + if (code == VOS_STARTCODE) { + /* profile_and_level_indication */ + profile = data[4]; + + GST_DEBUG_OBJECT (enc, "VOS profile 0x%08x", profile); + + if (profile != enc->profile) { + newprofile = TRUE; + enc->profile = profile; + } + } + + /* up to the next GOP_STARTCODE or VOP_STARTCODE is + * the config information */ + code = 0xffffffff; + for (i = 5; i < size - 4; i++) { + code = (code << 8) | data[i]; + if (code == GOP_STARTCODE || code == VOP_STARTCODE) + break; + } + i -= 3; + /* see if config changed */ + equal = FALSE; + if (enc->config) { + if (GST_BUFFER_SIZE (enc->config) == i) { + equal = memcmp (GST_BUFFER_DATA (enc->config), data, i) == 0; + } + } + /* if config string changed or new profile, make new caps */ + if (!equal || newprofile) { + if (enc->config) + gst_buffer_unref (enc->config); + enc->config = gst_buffer_new_and_alloc (i); + memcpy (GST_BUFFER_DATA (enc->config), data, i); + gst_rtp_mp4v_pay_new_caps (enc); + } + *strip = i; + /* we need to flush out the current packet. */ + result = TRUE; + break; + } + case VOP_STARTCODE: + GST_DEBUG_OBJECT (enc, "VOP"); + /* VOP startcode, we don't have to flush the packet */ + result = FALSE; + /* vop-coding-type == I-frame */ + if (size > 4 && (data[4] >> 6 == 0)) { + GST_DEBUG_OBJECT (enc, "VOP-I"); + *vopi = TRUE; + } + break; + case GOP_STARTCODE: + GST_DEBUG_OBJECT (enc, "GOP"); + *vopi = TRUE; + result = TRUE; + break; + case 0x00000100: + enc->need_config = FALSE; + result = TRUE; + break; + default: + if (code >= 0x20 && code <= 0x2f) { + GST_DEBUG_OBJECT (enc, "short header"); + result = FALSE; + } else { + GST_DEBUG_OBJECT (enc, "other startcode"); + /* all other startcodes need a flush */ + result = TRUE; + } + break; + } + return result; +} + +/* we expect buffers starting on startcodes. + */ +static GstFlowReturn +gst_rtp_mp4v_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpMP4VPay *rtpmp4vpay; + GstFlowReturn ret; + guint size, avail; + guint packet_len; + guint8 *data; + gboolean flush; + gint strip; + GstClockTime timestamp, duration; + gboolean vopi; + gboolean send_config; + + ret = GST_FLOW_OK; + send_config = FALSE; + + rtpmp4vpay = GST_RTP_MP4V_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + avail = gst_adapter_available (rtpmp4vpay->adapter); + + if (duration == -1) + duration = 0; + + /* empty buffer, take timestamp */ + if (avail == 0) { + rtpmp4vpay->first_timestamp = timestamp; + rtpmp4vpay->duration = 0; + } + + /* depay incomming data and see if we need to start a new RTP + * packet */ + flush = gst_rtp_mp4v_pay_depay_data (rtpmp4vpay, data, size, &strip, &vopi); + if (strip) { + /* strip off config if requested */ + if (!(rtpmp4vpay->config_interval > 0)) { + GstBuffer *subbuf; + + GST_LOG_OBJECT (rtpmp4vpay, "stripping config at %d, size %d", strip, + size - strip); + + /* strip off header */ + subbuf = gst_buffer_create_sub (buffer, strip, size - strip); + GST_BUFFER_TIMESTAMP (subbuf) = timestamp; + gst_buffer_unref (buffer); + buffer = subbuf; + + size = GST_BUFFER_SIZE (buffer); + } else { + GST_LOG_OBJECT (rtpmp4vpay, "found config in stream"); + rtpmp4vpay->last_config = timestamp; + } + } + + /* there is a config request, see if we need to insert it */ + if (vopi && (rtpmp4vpay->config_interval > 0) && rtpmp4vpay->config) { + if (rtpmp4vpay->last_config != -1) { + guint64 diff; + + GST_LOG_OBJECT (rtpmp4vpay, + "now %" GST_TIME_FORMAT ", last VOP-I %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp), GST_TIME_ARGS (rtpmp4vpay->last_config)); + + /* calculate diff between last config in milliseconds */ + if (timestamp > rtpmp4vpay->last_config) { + diff = timestamp - rtpmp4vpay->last_config; + } else { + diff = 0; + } + + GST_DEBUG_OBJECT (rtpmp4vpay, + "interval since last config %" GST_TIME_FORMAT, GST_TIME_ARGS (diff)); + + /* bigger than interval, queue config */ + /* FIXME should convert timestamps to running time */ + if (GST_TIME_AS_SECONDS (diff) >= rtpmp4vpay->config_interval) { + GST_DEBUG_OBJECT (rtpmp4vpay, "time to send config"); + send_config = TRUE; + } + } else { + /* no known previous config time, send now */ + GST_DEBUG_OBJECT (rtpmp4vpay, "no previous config time, send now"); + send_config = TRUE; + } + + if (send_config) { + /* we need to send config now first */ + GstBuffer *superbuf; + + GST_LOG_OBJECT (rtpmp4vpay, "inserting config in stream"); + + /* insert header */ + superbuf = gst_buffer_merge (rtpmp4vpay->config, buffer); + + GST_BUFFER_TIMESTAMP (superbuf) = timestamp; + gst_buffer_unref (buffer); + buffer = superbuf; + + size = GST_BUFFER_SIZE (buffer); + + if (timestamp != -1) { + rtpmp4vpay->last_config = timestamp; + } + } + } + + /* if we need to flush, do so now */ + if (flush) { + ret = gst_rtp_mp4v_pay_flush (rtpmp4vpay); + rtpmp4vpay->first_timestamp = timestamp; + rtpmp4vpay->duration = 0; + avail = 0; + } + + /* get packet length of data and see if we exceeded MTU. */ + packet_len = gst_rtp_buffer_calc_packet_len (avail + size, 0, 0); + + if (gst_basertppayload_is_filled (basepayload, + packet_len, rtpmp4vpay->duration + duration)) { + ret = gst_rtp_mp4v_pay_flush (rtpmp4vpay); + rtpmp4vpay->first_timestamp = timestamp; + rtpmp4vpay->duration = 0; + } + + /* push new data */ + gst_adapter_push (rtpmp4vpay->adapter, buffer); + + rtpmp4vpay->duration += duration; + + return ret; +} + +static gboolean +gst_rtp_mp4v_pay_handle_event (GstPad * pad, GstEvent * event) +{ + GstRtpMP4VPay *rtpmp4vpay; + + rtpmp4vpay = GST_RTP_MP4V_PAY (gst_pad_get_parent (pad)); + + GST_DEBUG ("Got event: %s", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + case GST_EVENT_EOS: + /* This flush call makes sure that the last buffer is always pushed + * to the base payloader */ + gst_rtp_mp4v_pay_flush (rtpmp4vpay); + break; + case GST_EVENT_FLUSH_STOP: + gst_rtp_mp4v_pay_empty (rtpmp4vpay); + break; + default: + break; + } + + g_object_unref (rtpmp4vpay); + + /* let parent handle event too */ + return FALSE; +} + +static void +gst_rtp_mp4v_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpMP4VPay *rtpmp4vpay; + + rtpmp4vpay = GST_RTP_MP4V_PAY (object); + + switch (prop_id) { + case ARG_SEND_CONFIG: + rtpmp4vpay->send_config = g_value_get_boolean (value); + /* send the configuration once every minute */ + if (rtpmp4vpay->send_config && !(rtpmp4vpay->config_interval > 0)) { + rtpmp4vpay->config_interval = 60; + } + break; + case ARG_BUFFER_LIST: + rtpmp4vpay->buffer_list = g_value_get_boolean (value); + break; + case ARG_CONFIG_INTERVAL: + rtpmp4vpay->config_interval = g_value_get_uint (value); + break; + default: + break; + } +} + +static void +gst_rtp_mp4v_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpMP4VPay *rtpmp4vpay; + + rtpmp4vpay = GST_RTP_MP4V_PAY (object); + + switch (prop_id) { + case ARG_SEND_CONFIG: + g_value_set_boolean (value, rtpmp4vpay->send_config); + break; + case ARG_BUFFER_LIST: + g_value_set_boolean (value, rtpmp4vpay->buffer_list); + break; + case ARG_CONFIG_INTERVAL: + g_value_set_uint (value, rtpmp4vpay->config_interval); + break; + default: + break; + } +} + +gboolean +gst_rtp_mp4v_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmp4vpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MP4V_PAY); +} diff --git a/gst/rtp/gstrtpmp4vpay.h b/gst/rtp/gstrtpmp4vpay.h new file mode 100644 index 0000000..0f8ab14 --- /dev/null +++ b/gst/rtp/gstrtpmp4vpay.h @@ -0,0 +1,76 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_MP4V_PAY_H__ +#define __GST_RTP_MP4V_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MP4V_PAY \ + (gst_rtp_mp4v_pay_get_type()) +#define GST_RTP_MP4V_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4V_PAY,GstRtpMP4VPay)) +#define GST_RTP_MP4V_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4V_PAY,GstRtpMP4VPayClass)) +#define GST_IS_RTP_MP4V_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4V_PAY)) +#define GST_IS_RTP_MP4V_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4V_PAY)) + +typedef struct _GstRtpMP4VPay GstRtpMP4VPay; +typedef struct _GstRtpMP4VPayClass GstRtpMP4VPayClass; + +struct _GstRtpMP4VPay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime first_timestamp; + GstClockTime duration; + + gint rate; + gint profile; + GstBuffer *config; + gboolean send_config; + gboolean need_config; + + gboolean buffer_list; + + /* naming might be confusing with send_config; but naming matches h264 + * payloader */ + guint config_interval; + GstClockTime last_config; +}; + +struct _GstRtpMP4VPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_mp4v_pay_get_type (void); + +gboolean gst_rtp_mp4v_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MP4V_PAY_H__ */ diff --git a/gst/rtp/gstrtpmpadepay.c b/gst/rtp/gstrtpmpadepay.c new file mode 100644 index 0000000..2b442c8 --- /dev/null +++ b/gst/rtp/gstrtpmpadepay.c @@ -0,0 +1,180 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include +#include "gstrtpmpadepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmpadepay_debug); +#define GST_CAT_DEFAULT (rtpmpadepay_debug) + +static GstStaticPadTemplate gst_rtp_mpa_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1") + ); + +static GstStaticPadTemplate gst_rtp_mpa_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\";" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_MPA_STRING ", " + "clock-rate = (int) 90000") + ); + +GST_BOILERPLATE (GstRtpMPADepay, gst_rtp_mpa_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_mpa_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_mpa_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_mpa_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpa_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpa_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG audio depayloader", "Codec/Depayloader/Network/RTP", + "Extracts MPEG audio from RTP packets (RFC 2038)", + "Wim Taymans "); +} + +static void +gst_rtp_mpa_depay_class_init (GstRtpMPADepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->set_caps = gst_rtp_mpa_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_mpa_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpmpadepay_debug, "rtpmpadepay", 0, + "MPEG Audio RTP Depayloader"); +} + +static void +gst_rtp_mpa_depay_init (GstRtpMPADepay * rtpmpadepay, + GstRtpMPADepayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static gboolean +gst_rtp_mpa_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstCaps *outcaps; + gint clock_rate; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; + depayload->clock_rate = clock_rate; + + outcaps = + gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, NULL); + res = gst_pad_set_caps (depayload->srcpad, outcaps); + gst_caps_unref (outcaps); + + return res; +} + +static GstBuffer * +gst_rtp_mpa_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpMPADepay *rtpmpadepay; + GstBuffer *outbuf; + + rtpmpadepay = GST_RTP_MPA_DEPAY (depayload); + + { + gint payload_len; + gboolean marker; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + if (payload_len <= 4) + goto empty_packet; + + /* strip off header + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | MBZ | Frag_offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + /* frag_offset = (payload[2] << 8) | payload[3]; */ + + /* subbuffer skipping the 4 header bytes */ + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 4, -1); + marker = gst_rtp_buffer_get_marker (buf); + + if (marker) { + /* mark start of talkspurt with discont */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + GST_DEBUG_OBJECT (rtpmpadepay, + "gst_rtp_mpa_depay_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + + /* FIXME, we can push half mpeg frames when they are split over multiple + * RTP packets */ + return outbuf; + } + + return NULL; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpmpadepay, STREAM, DECODE, + ("Empty Payload."), (NULL)); + return NULL; + } +} + +gboolean +gst_rtp_mpa_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmpadepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MPA_DEPAY); +} diff --git a/gst/rtp/gstrtpmpadepay.h b/gst/rtp/gstrtpmpadepay.h new file mode 100644 index 0000000..a6e9527 --- /dev/null +++ b/gst/rtp/gstrtpmpadepay.h @@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_MPA_DEPAY_H__ +#define __GST_RTP_MPA_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MPA_DEPAY \ + (gst_rtp_mpa_depay_get_type()) +#define GST_RTP_MPA_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPA_DEPAY,GstRtpMPADepay)) +#define GST_RTP_MPA_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPA_DEPAY,GstRtpMPADepayClass)) +#define GST_IS_RTP_MPA_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPA_DEPAY)) +#define GST_IS_RTP_MPA_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPA_DEPAY)) + +typedef struct _GstRtpMPADepay GstRtpMPADepay; +typedef struct _GstRtpMPADepayClass GstRtpMPADepayClass; + +struct _GstRtpMPADepay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpMPADepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_mpa_depay_get_type (void); + +gboolean gst_rtp_mpa_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MPA_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpmpapay.c b/gst/rtp/gstrtpmpapay.c new file mode 100644 index 0000000..af2b78e --- /dev/null +++ b/gst/rtp/gstrtpmpapay.c @@ -0,0 +1,327 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include + +#include "gstrtpmpapay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmpapay_debug); +#define GST_CAT_DEFAULT (rtpmpapay_debug) + +static GstStaticPadTemplate gst_rtp_mpa_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1") + ); + +static GstStaticPadTemplate gst_rtp_mpa_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_MPA_STRING ", " + "clock-rate = (int) 90000; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\"") + ); + +static void gst_rtp_mpa_pay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_mpa_pay_change_state (GstElement * element, + GstStateChange transition); + +static gboolean gst_rtp_mpa_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static gboolean gst_rtp_mpa_pay_handle_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_rtp_mpa_pay_flush (GstRtpMPAPay * rtpmpapay); +static GstFlowReturn gst_rtp_mpa_pay_handle_buffer (GstBaseRTPPayload * payload, + GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpMPAPay, gst_rtp_mpa_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_mpa_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpa_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpa_pay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG audio payloader", "Codec/Payloader/Network/RTP", + "Payload MPEG audio as RTP packets (RFC 2038)", + "Wim Taymans "); +} + +static void +gst_rtp_mpa_pay_class_init (GstRtpMPAPayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mpa_pay_finalize; + + gstelement_class->change_state = gst_rtp_mpa_pay_change_state; + + gstbasertppayload_class->set_caps = gst_rtp_mpa_pay_setcaps; + gstbasertppayload_class->handle_event = gst_rtp_mpa_pay_handle_event; + gstbasertppayload_class->handle_buffer = gst_rtp_mpa_pay_handle_buffer; + + GST_DEBUG_CATEGORY_INIT (rtpmpapay_debug, "rtpmpapay", 0, + "MPEG Audio RTP Depayloader"); +} + +static void +gst_rtp_mpa_pay_init (GstRtpMPAPay * rtpmpapay, GstRtpMPAPayClass * klass) +{ + rtpmpapay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_mpa_pay_finalize (GObject * object) +{ + GstRtpMPAPay *rtpmpapay; + + rtpmpapay = GST_RTP_MPA_PAY (object); + + g_object_unref (rtpmpapay->adapter); + rtpmpapay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_rtp_mpa_pay_reset (GstRtpMPAPay * pay) +{ + pay->first_ts = -1; + pay->duration = 0; + gst_adapter_clear (pay->adapter); + GST_DEBUG_OBJECT (pay, "reset depayloader"); +} + +static gboolean +gst_rtp_mpa_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + + gst_basertppayload_set_options (payload, "audio", TRUE, "MPA", 90000); + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; +} + +static gboolean +gst_rtp_mpa_pay_handle_event (GstPad * pad, GstEvent * event) +{ + GstRtpMPAPay *rtpmpapay; + + rtpmpapay = GST_RTP_MPA_PAY (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + /* make sure we push the last packets in the adapter on EOS */ + gst_rtp_mpa_pay_flush (rtpmpapay); + break; + case GST_EVENT_FLUSH_STOP: + gst_rtp_mpa_pay_reset (rtpmpapay); + break; + default: + break; + } + + gst_object_unref (rtpmpapay); + + /* FALSE to let the parent handle the event as well */ + return FALSE; +} + +static GstFlowReturn +gst_rtp_mpa_pay_flush (GstRtpMPAPay * rtpmpapay) +{ + guint avail; + GstBuffer *outbuf; + GstFlowReturn ret; + guint16 frag_offset; + + /* the data available in the adapter is either smaller + * than the MTU or bigger. In the case it is smaller, the complete + * adapter contents can be put in one packet. In the case the + * adapter has more than one MTU, we need to split the MPA data + * over multiple packets. The frag_offset in each packet header + * needs to be updated with the position in the MPA frame. */ + avail = gst_adapter_available (rtpmpapay->adapter); + + ret = GST_FLOW_OK; + + frag_offset = 0; + while (avail > 0) { + guint towrite; + guint8 *payload; + guint payload_len; + guint packet_len; + + /* this will be the total length of the packet */ + packet_len = gst_rtp_buffer_calc_packet_len (4 + avail, 0, 0); + + /* fill one MTU or all available bytes */ + towrite = MIN (packet_len, GST_BASE_RTP_PAYLOAD_MTU (rtpmpapay)); + + /* this is the payload length */ + payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); + + /* create buffer to hold the payload */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + + payload_len -= 4; + + gst_rtp_buffer_set_payload_type (outbuf, GST_RTP_PAYLOAD_MPA); + + /* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | MBZ | Frag_offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + payload = gst_rtp_buffer_get_payload (outbuf); + payload[0] = 0; + payload[1] = 0; + payload[2] = frag_offset >> 8; + payload[3] = frag_offset & 0xff; + + gst_adapter_copy (rtpmpapay->adapter, &payload[4], 0, payload_len); + gst_adapter_flush (rtpmpapay->adapter, payload_len); + + avail -= payload_len; + frag_offset += payload_len; + + if (avail == 0) + gst_rtp_buffer_set_marker (outbuf, TRUE); + + GST_BUFFER_TIMESTAMP (outbuf) = rtpmpapay->first_ts; + GST_BUFFER_DURATION (outbuf) = rtpmpapay->duration; + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmpapay), outbuf); + } + + return ret; +} + +static GstFlowReturn +gst_rtp_mpa_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpMPAPay *rtpmpapay; + GstFlowReturn ret; + guint size, avail; + guint packet_len; + GstClockTime duration, timestamp; + + rtpmpapay = GST_RTP_MPA_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + duration = GST_BUFFER_DURATION (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + + if (GST_BUFFER_IS_DISCONT (buffer)) { + GST_DEBUG_OBJECT (rtpmpapay, "DISCONT"); + gst_rtp_mpa_pay_reset (rtpmpapay); + } + + avail = gst_adapter_available (rtpmpapay->adapter); + + /* get packet length of previous data and this new data, + * payload length includes a 4 byte header */ + packet_len = gst_rtp_buffer_calc_packet_len (4 + avail + size, 0, 0); + + /* if this buffer is going to overflow the packet, flush what we + * have. */ + if (gst_basertppayload_is_filled (basepayload, + packet_len, rtpmpapay->duration + duration)) { + ret = gst_rtp_mpa_pay_flush (rtpmpapay); + avail = 0; + } else { + ret = GST_FLOW_OK; + } + + if (avail == 0) { + GST_DEBUG_OBJECT (rtpmpapay, + "first packet, save timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + rtpmpapay->first_ts = timestamp; + rtpmpapay->duration = 0; + } + + gst_adapter_push (rtpmpapay->adapter, buffer); + rtpmpapay->duration = duration; + + return ret; +} + +static GstStateChangeReturn +gst_rtp_mpa_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstRtpMPAPay *rtpmpapay; + GstStateChangeReturn ret; + + rtpmpapay = GST_RTP_MPA_PAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_mpa_pay_reset (rtpmpapay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_mpa_pay_reset (rtpmpapay); + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_mpa_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmpapay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MPA_PAY); +} diff --git a/gst/rtp/gstrtpmpapay.h b/gst/rtp/gstrtpmpapay.h new file mode 100644 index 0000000..cdab196 --- /dev/null +++ b/gst/rtp/gstrtpmpapay.h @@ -0,0 +1,63 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_MPA_PAY_H__ +#define __GST_RTP_MPA_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MPA_PAY \ + (gst_rtp_mpa_pay_get_type()) +#define GST_RTP_MPA_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPA_PAY,GstRtpMPAPay)) +#define GST_RTP_MPA_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPA_PAY,GstRtpMPAPayClass)) +#define GST_IS_RTP_MPA_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPA_PAY)) +#define GST_IS_RTP_MPA_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPA_PAY)) + +typedef struct _GstRtpMPAPay GstRtpMPAPay; +typedef struct _GstRtpMPAPayClass GstRtpMPAPayClass; + +struct _GstRtpMPAPay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime first_ts; + GstClockTime duration; +}; + +struct _GstRtpMPAPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_mpa_pay_get_type (void); + +gboolean gst_rtp_mpa_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MPA_PAY_H__ */ diff --git a/gst/rtp/gstrtpmparobustdepay.c b/gst/rtp/gstrtpmparobustdepay.c new file mode 100644 index 0000000..17645a4 --- /dev/null +++ b/gst/rtp/gstrtpmparobustdepay.c @@ -0,0 +1,792 @@ +/* GStreamer + * Copyright (C) <2010> Mark Nauwelaerts + * Copyright (C) <2010> Nokia Corporation + * + * 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 + +#include +#include +#include "gstrtpmparobustdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmparobustdepay_debug); +#define GST_CAT_DEFAULT (rtpmparobustdepay_debug) + +static GstStaticPadTemplate gst_rtp_mpa_robust_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1") + ); + +static GstStaticPadTemplate gst_rtp_mpa_robust_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " + "encoding-name = (string) \"MPA-ROBUST\" " "; " + /* draft versions appear still in use out there */ + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX], " + "encoding-name = (string) { \"X-MP3-DRAFT-00\", \"X-MP3-DRAFT-01\", " + " \"X-MP3-DRAFT-02\", \"X-MP3-DRAFT-03\", \"X-MP3-DRAFT-04\", " + " \"X-MP3-DRAFT-05\", \"X-MP3-DRAFT-06\" }") + ); + +typedef struct _GstADUFrame +{ + guint32 header; + gint size; + gint side_info; + gint data_size; + gint layer; + gint backpointer; + + GstBuffer *buffer; +} GstADUFrame; + +GST_BOILERPLATE (GstRtpMPARobustDepay, gst_rtp_mpa_robust_depay, + GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); + +static GstStateChangeReturn gst_rtp_mpa_robust_change_state (GstElement * + element, GstStateChange transition); + +static gboolean gst_rtp_mpa_robust_depay_setcaps (GstBaseRTPDepayload * + depayload, GstCaps * caps); +static GstBuffer *gst_rtp_mpa_robust_depay_process (GstBaseRTPDepayload * + depayload, GstBuffer * buf); + +static void +gst_rtp_mpa_robust_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpa_robust_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpa_robust_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG audio depayloader", "Codec/Depayloader/Network/RTP", + "Extracts MPEG audio from RTP packets (RFC 5219)", + "Mark Nauwelaerts "); +} + +static void +gst_rtp_mpa_robust_depay_finalize (GObject * object) +{ + GstRtpMPARobustDepay *rtpmpadepay; + + rtpmpadepay = (GstRtpMPARobustDepay *) object; + + g_object_unref (rtpmpadepay->adapter); + g_queue_free (rtpmpadepay->adu_frames); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static void +gst_rtp_mpa_robust_depay_class_init (GstRtpMPARobustDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mpa_robust_depay_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_rtp_mpa_robust_change_state); + + gstbasertpdepayload_class->set_caps = gst_rtp_mpa_robust_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_mpa_robust_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpmparobustdepay_debug, "rtpmparobustdepay", 0, + "Robust MPEG Audio RTP Depayloader"); +} + +static void +gst_rtp_mpa_robust_depay_init (GstRtpMPARobustDepay * rtpmpadepay, + GstRtpMPARobustDepayClass * klass) +{ + rtpmpadepay->adapter = gst_adapter_new (); + rtpmpadepay->adu_frames = g_queue_new (); +} + +static gboolean +gst_rtp_mpa_robust_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps) +{ + GstRtpMPARobustDepay *rtpmpadepay; + GstStructure *structure; + GstCaps *outcaps; + gint clock_rate, draft; + gboolean res; + const gchar *encoding; + + rtpmpadepay = GST_RTP_MPA_ROBUST_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; + depayload->clock_rate = clock_rate; + + rtpmpadepay->has_descriptor = TRUE; + if ((encoding = gst_structure_get_string (structure, "encoding-name"))) { + if (sscanf (encoding, "X-MP3-DRAFT-%d", &draft) && (draft == 0)) + rtpmpadepay->has_descriptor = FALSE; + } + + outcaps = + gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, NULL); + res = gst_pad_set_caps (depayload->srcpad, outcaps); + gst_caps_unref (outcaps); + + return res; +} + +/* thanks again go to mp3parse ... */ + +static const guint mp3types_bitrates[2][3][16] = { + { + {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,} + }, + { + {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,} + }, +}; + +static const guint mp3types_freqs[3][3] = { {44100, 48000, 32000}, +{22050, 24000, 16000}, +{11025, 12000, 8000} +}; + +static inline guint +mp3_type_frame_length_from_header (GstElement * mp3parse, guint32 header, + guint * put_version, guint * put_layer, guint * put_channels, + guint * put_bitrate, guint * put_samplerate, guint * put_mode, + guint * put_crc) +{ + guint length; + gulong mode, samplerate, bitrate, layer, channels, padding, crc; + gulong version; + gint lsf, mpg25; + + if (header & (1 << 20)) { + lsf = (header & (1 << 19)) ? 0 : 1; + mpg25 = 0; + } else { + lsf = 1; + mpg25 = 1; + } + + version = 1 + lsf + mpg25; + + layer = 4 - ((header >> 17) & 0x3); + + crc = (header >> 16) & 0x1; + + bitrate = (header >> 12) & 0xF; + bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000; + /* The caller has ensured we have a valid header, so bitrate can't be + zero here. */ + if (bitrate == 0) { + GST_DEBUG_OBJECT (mp3parse, "invalid bitrate"); + return 0; + } + + samplerate = (header >> 10) & 0x3; + samplerate = mp3types_freqs[lsf + mpg25][samplerate]; + + padding = (header >> 9) & 0x1; + + mode = (header >> 6) & 0x3; + channels = (mode == 3) ? 1 : 2; + + switch (layer) { + case 1: + length = 4 * ((bitrate * 12) / samplerate + padding); + break; + case 2: + length = (bitrate * 144) / samplerate + padding; + break; + default: + case 3: + length = (bitrate * 144) / (samplerate << lsf) + padding; + break; + } + + GST_LOG_OBJECT (mp3parse, "Calculated mp3 frame length of %u bytes", length); + GST_LOG_OBJECT (mp3parse, "samplerate = %lu, bitrate = %lu, version = %lu, " + "layer = %lu, channels = %lu, mode = %lu", samplerate, bitrate, version, + layer, channels, mode); + + if (put_version) + *put_version = version; + if (put_layer) + *put_layer = layer; + if (put_channels) + *put_channels = channels; + if (put_bitrate) + *put_bitrate = bitrate; + if (put_samplerate) + *put_samplerate = samplerate; + if (put_mode) + *put_mode = mode; + if (put_crc) + *put_crc = crc; + + GST_LOG_OBJECT (mp3parse, "size = %u", length); + return length; +} + +/* generate empty/silent/dummy frame that mimics @frame, + * except for rate, where maximum possible is selected */ +static GstADUFrame * +gst_rtp_mpa_robust_depay_generate_dummy_frame (GstRtpMPARobustDepay * + rtpmpadepay, GstADUFrame * frame) +{ + GstADUFrame *dummy; + + dummy = g_slice_dup (GstADUFrame, frame); + + /* go for maximum bitrate */ + dummy->header = (frame->header & ~(0xf << 12)) | (0xe << 12); + dummy->size = + mp3_type_frame_length_from_header (GST_ELEMENT_CAST (rtpmpadepay), + dummy->header, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + dummy->data_size = dummy->size - dummy->side_info; + dummy->backpointer = 0; + + dummy->buffer = gst_buffer_new_and_alloc (dummy->side_info + 4); + memset (GST_BUFFER_DATA (dummy->buffer), 0, dummy->side_info + 4); + GST_WRITE_UINT32_BE (GST_BUFFER_DATA (dummy->buffer), dummy->header); + GST_BUFFER_TIMESTAMP (dummy->buffer) = GST_BUFFER_TIMESTAMP (frame->buffer); + + return dummy; +} + +/* validates and parses @buf, and queues for further transformation if valid, + * otherwise discards @buf + * Takes ownership of @buf. */ +static gboolean +gst_rtp_mpa_robust_depay_queue_frame (GstRtpMPARobustDepay * rtpmpadepay, + GstBuffer * buf) +{ + GstADUFrame *frame = NULL; + guint version, layer, channels, size; + guint crc; + + g_return_val_if_fail (buf != NULL, FALSE); + + if (GST_BUFFER_SIZE (buf) < 6) { + goto corrupt_frame; + } + + frame = g_slice_new0 (GstADUFrame); + frame->header = GST_READ_UINT32_BE (GST_BUFFER_DATA (buf)); + + size = mp3_type_frame_length_from_header (GST_ELEMENT_CAST (rtpmpadepay), + frame->header, &version, &layer, &channels, NULL, NULL, NULL, &crc); + if (!size) + goto corrupt_frame; + + frame->size = size; + frame->layer = layer; + if (version == 1 && channels == 2) + frame->side_info = 32; + else if ((version == 1 && channels == 1) || (version >= 2 && channels == 2)) + frame->side_info = 17; + else if (version >= 2 && channels == 1) + frame->side_info = 9; + else { + g_assert_not_reached (); + goto corrupt_frame; + } + + /* backpointer */ + if (layer == 3) { + frame->backpointer = GST_READ_UINT16_BE (GST_BUFFER_DATA (buf) + 4); + frame->backpointer >>= 7; + GST_LOG_OBJECT (rtpmpadepay, "backpointer: %d", frame->backpointer); + } + + if (!crc) + frame->side_info += 2; + + GST_LOG_OBJECT (rtpmpadepay, "side info: %d", frame->side_info); + frame->data_size = frame->size - 4 - frame->side_info; + + /* some size validation checks */ + if (4 + frame->side_info > GST_BUFFER_SIZE (buf)) + goto corrupt_frame; + + /* ADU data would then extend past MP3 frame, + * even using past byte reservoir */ + if (-frame->backpointer + (gint) (GST_BUFFER_SIZE (buf)) > frame->size) + goto corrupt_frame; + + /* ok, take buffer and queue */ + frame->buffer = buf; + g_queue_push_tail (rtpmpadepay->adu_frames, frame); + + return TRUE; + + /* ERRORS */ +corrupt_frame: + { + GST_DEBUG_OBJECT (rtpmpadepay, "frame is corrupt"); + gst_buffer_unref (buf); + if (frame) + g_slice_free (GstADUFrame, frame); + return FALSE; + } +} + +static inline void +gst_rtp_mpa_robust_depay_free_frame (GstADUFrame * frame) +{ + if (frame->buffer) + gst_buffer_unref (frame->buffer); + g_slice_free (GstADUFrame, frame); +} + +static inline void +gst_rtp_mpa_robust_depay_dequeue_frame (GstRtpMPARobustDepay * rtpmpadepay) +{ + GstADUFrame *head; + + GST_LOG_OBJECT (rtpmpadepay, "dequeueing ADU frame"); + + if (rtpmpadepay->adu_frames->head == rtpmpadepay->cur_adu_frame) + rtpmpadepay->cur_adu_frame = NULL; + + head = g_queue_pop_head (rtpmpadepay->adu_frames); + g_assert (head->buffer); + gst_rtp_mpa_robust_depay_free_frame (head); + + return; +} + +/* returns TRUE if at least one new ADU frame was enqueued for MP3 conversion. + * Takes ownership of @buf. */ +static gboolean +gst_rtp_mpa_robust_depay_deinterleave (GstRtpMPARobustDepay * rtpmpadepay, + GstBuffer * buf) +{ + gboolean ret = FALSE; + guint8 *data; + guint val, iindex, icc; + + data = GST_BUFFER_DATA (buf); + val = GST_READ_UINT16_BE (data) >> 5; + iindex = val >> 3; + icc = val & 0x7; + + GST_LOG_OBJECT (rtpmpadepay, "sync: 0x%x, index: %u, cycle count: %u", + val, iindex, icc); + + /* basic case; no interleaving ever seen */ + if (val == 0x7ff && rtpmpadepay->last_icc < 0) { + ret = gst_rtp_mpa_robust_depay_queue_frame (rtpmpadepay, buf); + } else { + if (G_UNLIKELY (rtpmpadepay->last_icc < 0)) { + rtpmpadepay->last_icc = icc; + rtpmpadepay->last_ii = iindex; + } + if (icc != rtpmpadepay->last_icc || iindex == rtpmpadepay->last_ii) { + gint i; + + for (i = 0; i < 256; ++i) { + if (rtpmpadepay->deinter[i] != NULL) { + ret |= gst_rtp_mpa_robust_depay_queue_frame (rtpmpadepay, + rtpmpadepay->deinter[i]); + rtpmpadepay->deinter[i] = NULL; + } + } + } + /* rewrite buffer sync header */ + val = GST_READ_UINT16_BE (buf); + val = (0x7ff << 5) | val; + GST_WRITE_UINT16_BE (buf, val); + /* store and keep track of last indices */ + rtpmpadepay->last_icc = icc; + rtpmpadepay->last_ii = iindex; + rtpmpadepay->deinter[iindex] = buf; + } + + return ret; +} + +/* Head ADU frame corresponds to mp3_frame (i.e. in header in side-info) that + * is currently being written + * cur_adu_frame refers to ADU frame whose data should be bytewritten next + * (possibly starting from offset rather than start 0) (and is typicall tail + * at time of last push round). + * If at start, position where it should start writing depends on (data) sizes + * of previous mp3 frames (corresponding to foregoing ADU frames) kept in size, + * and its backpointer */ +static GstFlowReturn +gst_rtp_mpa_robust_depay_push_mp3_frames (GstRtpMPARobustDepay * rtpmpadepay) +{ + GstBuffer *buf; + GstADUFrame *frame, *head; + gint av; + GstFlowReturn ret = GST_FLOW_OK; + + while (1) { + + if (G_UNLIKELY (!rtpmpadepay->cur_adu_frame)) { + rtpmpadepay->cur_adu_frame = rtpmpadepay->adu_frames->head; + rtpmpadepay->offset = 0; + rtpmpadepay->size = 0; + } + + if (G_UNLIKELY (!rtpmpadepay->cur_adu_frame)) + break; + + frame = (GstADUFrame *) rtpmpadepay->cur_adu_frame->data; + head = (GstADUFrame *) rtpmpadepay->adu_frames->head->data; + + /* special case: non-layer III are sent straight through */ + if (G_UNLIKELY (frame->layer != 3)) { + GST_DEBUG_OBJECT (rtpmpadepay, "layer %d frame, sending as-is", + frame->layer); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmpadepay), + frame->buffer); + frame->buffer = NULL; + /* and remove it from any further consideration */ + g_slice_free (GstADUFrame, frame); + g_queue_delete_link (rtpmpadepay->adu_frames, rtpmpadepay->cur_adu_frame); + rtpmpadepay->cur_adu_frame = NULL; + continue; + } + + if (rtpmpadepay->offset == GST_BUFFER_SIZE (frame->buffer)) { + if (g_list_next (rtpmpadepay->cur_adu_frame)) { + GST_LOG_OBJECT (rtpmpadepay, + "moving to next ADU frame, size %d, side_info %d", + frame->size, frame->side_info); + rtpmpadepay->size += frame->data_size; + rtpmpadepay->cur_adu_frame = g_list_next (rtpmpadepay->cur_adu_frame); + frame = (GstADUFrame *) rtpmpadepay->cur_adu_frame->data; + rtpmpadepay->offset = 0; + /* layer I and II packets have no bitreservoir and must be sent as-is; + * so flush any pending frame */ + if (G_UNLIKELY (frame->layer != 3 && rtpmpadepay->mp3_frame)) + goto flush; + } else { + break; + } + } + + if (G_UNLIKELY (!rtpmpadepay->mp3_frame)) { + GST_LOG_OBJECT (rtpmpadepay, + "setting up new MP3 frame of size %d, side_info %d", + head->size, head->side_info); + rtpmpadepay->mp3_frame = gst_byte_writer_new_with_size (head->size, TRUE); + /* 0-fill possible gaps */ + gst_byte_writer_fill (rtpmpadepay->mp3_frame, 0, head->size); + gst_byte_writer_set_pos (rtpmpadepay->mp3_frame, 0); + /* bytewriter corresponds to head frame, + * i.e. the header and the side info must match */ + gst_byte_writer_put_data (rtpmpadepay->mp3_frame, + GST_BUFFER_DATA (head->buffer), 4 + head->side_info); + } + + buf = frame->buffer; + av = gst_byte_writer_get_remaining (rtpmpadepay->mp3_frame); + GST_LOG_OBJECT (rtpmpadepay, "current mp3 frame remaining: %d", av); + GST_LOG_OBJECT (rtpmpadepay, "accumulated ADU frame data_size: %d", + rtpmpadepay->size); + + if (rtpmpadepay->offset) { + /* no need to position, simply append */ + g_assert (GST_BUFFER_SIZE (buf) > rtpmpadepay->offset); + av = MIN (av, GST_BUFFER_SIZE (buf) - rtpmpadepay->offset); + GST_LOG_OBJECT (rtpmpadepay, + "appending %d bytes from ADU frame at offset %d", av, + rtpmpadepay->offset); + gst_byte_writer_put_data (rtpmpadepay->mp3_frame, + GST_BUFFER_DATA (buf) + rtpmpadepay->offset, av); + rtpmpadepay->offset += av; + } else { + gint pos, tpos; + + /* position writing according to ADU frame backpointer */ + pos = gst_byte_writer_get_pos (rtpmpadepay->mp3_frame); + tpos = rtpmpadepay->size - frame->backpointer + 4 + head->side_info; + GST_LOG_OBJECT (rtpmpadepay, "current MP3 frame at position %d, " + "starting new ADU frame data at offset %d", pos, tpos); + if (tpos < pos) { + GstADUFrame *dummy; + + /* try to insert as few frames as possible, + * so go for a reasonably large dummy frame size */ + GST_LOG_OBJECT (rtpmpadepay, + "overlapping previous data; inserting dummy frame"); + dummy = + gst_rtp_mpa_robust_depay_generate_dummy_frame (rtpmpadepay, frame); + g_queue_insert_before (rtpmpadepay->adu_frames, + rtpmpadepay->cur_adu_frame, dummy); + /* offset is known to be zero, so we can shift current one */ + rtpmpadepay->cur_adu_frame = rtpmpadepay->cur_adu_frame->prev; + if (!rtpmpadepay->size) { + g_assert (rtpmpadepay->cur_adu_frame == + rtpmpadepay->adu_frames->head); + GST_LOG_OBJECT (rtpmpadepay, "... which is new head frame"); + gst_byte_writer_free (rtpmpadepay->mp3_frame); + rtpmpadepay->mp3_frame = NULL; + } + /* ... and continue adding that empty one immediately, + * and then see if that provided enough extra space */ + continue; + } else if (tpos >= pos + av) { + /* ADU frame no longer needs current MP3 frame; move to its end */ + GST_LOG_OBJECT (rtpmpadepay, "passed current MP3 frame"); + gst_byte_writer_set_pos (rtpmpadepay->mp3_frame, pos + av); + } else { + /* position and append */ + GST_LOG_OBJECT (rtpmpadepay, "adding to current MP3 frame"); + gst_byte_writer_set_pos (rtpmpadepay->mp3_frame, tpos); + av = MIN (av, GST_BUFFER_SIZE (buf) - 4 - frame->side_info); + gst_byte_writer_put_data (rtpmpadepay->mp3_frame, + GST_BUFFER_DATA (buf) + 4 + frame->side_info, av); + rtpmpadepay->offset += av + 4 + frame->side_info; + } + } + + /* if mp3 frame filled, send on its way */ + if (gst_byte_writer_get_remaining (rtpmpadepay->mp3_frame) == 0) { + flush: + buf = gst_byte_writer_free_and_get_buffer (rtpmpadepay->mp3_frame); + rtpmpadepay->mp3_frame = NULL; + GST_BUFFER_TIMESTAMP (buf) = GST_BUFFER_TIMESTAMP (head->buffer); + /* no longer need head ADU frame header and side info */ + /* NOTE maybe head == current, then size and offset go off a bit, + * but current gets reset to NULL, and then also offset and size */ + rtpmpadepay->size -= head->data_size; + gst_rtp_mpa_robust_depay_dequeue_frame (rtpmpadepay); + /* send */ + ret = gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmpadepay), + buf); + } + } + + return ret; +} + +/* process ADU frame @buf through: + * - deinterleaving + * - converting to MP3 frames + * Takes ownership of @buf. + */ +static GstFlowReturn +gst_rtp_mpa_robust_depay_submit_adu (GstRtpMPARobustDepay * rtpmpadepay, + GstBuffer * buf) +{ + if (gst_rtp_mpa_robust_depay_deinterleave (rtpmpadepay, buf)) + return gst_rtp_mpa_robust_depay_push_mp3_frames (rtpmpadepay); + + return GST_FLOW_OK; +} + +static GstBuffer * +gst_rtp_mpa_robust_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf) +{ + GstRtpMPARobustDepay *rtpmpadepay; + gint payload_len, offset; + guint8 *payload; + gboolean cont, dtype; + guint av, size; + GstClockTime timestamp; + + rtpmpadepay = GST_RTP_MPA_ROBUST_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + timestamp = GST_BUFFER_TIMESTAMP (buf); + + if (payload_len <= 1) + goto short_read; + + payload = gst_rtp_buffer_get_payload (buf); + offset = 0; + GST_LOG_OBJECT (rtpmpadepay, "payload_len: %d", payload_len); + + /* strip off descriptor + * + * 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |C|T| ADU size | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * C: if 1, data is continuation + * T: if 1, size is 14 bits, otherwise 6 bits + * ADU size: size of following packet (not including descriptor) + */ + while (payload_len) { + if (G_LIKELY (rtpmpadepay->has_descriptor)) { + cont = !!(payload[offset] & 0x80); + dtype = !!(payload[offset] & 0x40); + if (dtype) { + size = (payload[offset] & 0x3f) << 8 | payload[offset + 1]; + payload_len--; + offset++; + } else if (payload_len >= 2) { + size = (payload[offset] & 0x3f); + payload_len -= 2; + offset += 2; + } else { + goto short_read; + } + } else { + cont = FALSE; + dtype = -1; + size = payload_len; + } + + GST_LOG_OBJECT (rtpmpadepay, "offset %d has cont: %d, dtype: %d, size: %d", + offset, cont, dtype, size); + + buf = gst_rtp_buffer_get_payload_subbuffer (buf, offset, + MIN (size, payload_len)); + + if (cont) { + av = gst_adapter_available (rtpmpadepay->adapter); + if (G_UNLIKELY (!av)) { + GST_DEBUG_OBJECT (rtpmpadepay, + "discarding continuation fragment without prior fragment"); + gst_buffer_unref (buf); + } else { + av += GST_BUFFER_SIZE (buf); + gst_adapter_push (rtpmpadepay->adapter, buf); + if (av == size) { + timestamp = gst_adapter_prev_timestamp (rtpmpadepay->adapter, NULL); + buf = gst_adapter_take_buffer (rtpmpadepay->adapter, size); + GST_BUFFER_TIMESTAMP (buf) = timestamp; + gst_rtp_mpa_robust_depay_submit_adu (rtpmpadepay, buf); + } else if (av > size) { + GST_DEBUG_OBJECT (rtpmpadepay, + "assembled ADU size %d larger than expected %d; discarding", + av, size); + gst_adapter_clear (rtpmpadepay->adapter); + } + } + size = payload_len; + } else { + /* not continuation, first fragment or whole ADU */ + if (payload_len == size) { + /* whole ADU */ + GST_BUFFER_TIMESTAMP (buf) = timestamp; + gst_rtp_mpa_robust_depay_submit_adu (rtpmpadepay, buf); + } else if (payload_len < size) { + /* first fragment */ + gst_adapter_push (rtpmpadepay->adapter, buf); + size = payload_len; + } + } + + offset += size; + payload_len -= size; + + /* timestamp applies to first payload, no idea for subsequent ones */ + timestamp = GST_CLOCK_TIME_NONE; + } + + return NULL; + + /* ERRORS */ +short_read: + { + GST_ELEMENT_WARNING (rtpmpadepay, STREAM, DECODE, + (NULL), ("Packet contains invalid data")); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_mpa_robust_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret; + GstRtpMPARobustDepay *rtpmpadepay; + + rtpmpadepay = GST_RTP_MPA_ROBUST_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + rtpmpadepay->last_ii = -1; + rtpmpadepay->last_icc = -1; + rtpmpadepay->size = 0; + rtpmpadepay->offset = 0; + 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_PAUSED_TO_READY: + { + gint i; + + gst_adapter_clear (rtpmpadepay->adapter); + for (i = 0; i < G_N_ELEMENTS (rtpmpadepay->deinter); i++) { + gst_buffer_replace (&rtpmpadepay->deinter[i], NULL); + } + rtpmpadepay->cur_adu_frame = NULL; + g_queue_foreach (rtpmpadepay->adu_frames, + (GFunc) gst_rtp_mpa_robust_depay_free_frame, NULL); + g_queue_clear (rtpmpadepay->adu_frames); + break; + } + default: + break; + } + + return ret; +} + +gboolean +gst_rtp_mpa_robust_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmparobustdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MPA_ROBUST_DEPAY); +} diff --git a/gst/rtp/gstrtpmparobustdepay.h b/gst/rtp/gstrtpmparobustdepay.h new file mode 100644 index 0000000..8ef5af1 --- /dev/null +++ b/gst/rtp/gstrtpmparobustdepay.h @@ -0,0 +1,78 @@ +/* GStreamer + * Copyright (C) <2010> Mark Nauwelaerts + * Copyright (C) <2010> Nokia Corporation + * + * 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_RTP_MPA_ROBUST_DEPAY_H__ +#define __GST_RTP_MPA_ROBUST_DEPAY_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MPA_ROBUST_DEPAY \ + (gst_rtp_mpa_robust_depay_get_type()) +#define GST_RTP_MPA_ROBUST_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPA_ROBUST_DEPAY,GstRtpMPARobustDepay)) +#define GST_RTP_MPA_ROBUST_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPA_ROBUST_DEPAY,GstRtpMPARobustDepayClass)) +#define GST_IS_RTP_MPA_ROBUST_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPA_ROBUST_DEPAY)) +#define GST_IS_RTP_MPA_ROBUST_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPA_ROBUST_DEPAY)) + +typedef struct _GstRtpMPARobustDepay GstRtpMPARobustDepay; +typedef struct _GstRtpMPARobustDepayClass GstRtpMPARobustDepayClass; + +struct _GstRtpMPARobustDepay +{ + GstBaseRTPDepayload depayload; + + GstAdapter *adapter; + gboolean has_descriptor; + + /* last interleave index */ + gint last_ii; + /* last interleave cycle count */ + gint last_icc; + /* buffers pending deinterleaving */ + GstBuffer *deinter[256]; + + /* ADU buffers pending MP3 transformation */ + GQueue *adu_frames; + GList *cur_adu_frame; + gint offset; + gint size; + GstByteWriter *mp3_frame; +}; + +struct _GstRtpMPARobustDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_mpa_robust_depay_get_type (void); + +gboolean gst_rtp_mpa_robust_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MPA_ROBUST_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpmpvdepay.c b/gst/rtp/gstrtpmpvdepay.c new file mode 100644 index 0000000..c48c82b --- /dev/null +++ b/gst/rtp/gstrtpmpvdepay.c @@ -0,0 +1,204 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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 + +#include +#include "gstrtpmpvdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmpvdepay_debug); +#define GST_CAT_DEFAULT (rtpmpvdepay_debug) + +/* FIXME, we set the mpeg version to 2, we should ideally be looking at contents + * of the stream to figure out the version */ +static GstStaticPadTemplate gst_rtp_mpv_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS + ("video/mpeg, mpegversion = (int) 2, systemstream = (boolean) FALSE") + ); + +static GstStaticPadTemplate gst_rtp_mpv_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"MPV\";" + "application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_MPV_STRING ", " + "clock-rate = (int) 90000") + ); + +GST_BOILERPLATE (GstRtpMPVDepay, gst_rtp_mpv_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_mpv_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_mpv_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void +gst_rtp_mpv_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpv_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpv_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP MPEG video depayloader", "Codec/Depayloader/Network/RTP", + "Extracts MPEG video from RTP packets (RFC 2250)", + "Wim Taymans "); +} + +static void +gst_rtp_mpv_depay_class_init (GstRtpMPVDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->set_caps = gst_rtp_mpv_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_mpv_depay_process; + + GST_DEBUG_CATEGORY_INIT (rtpmpvdepay_debug, "rtpmpvdepay", 0, + "MPEG Video RTP Depayloader"); +} + +static void +gst_rtp_mpv_depay_init (GstRtpMPVDepay * rtpmpvdepay, + GstRtpMPVDepayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static gboolean +gst_rtp_mpv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + gint clock_rate; + GstCaps *outcaps; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + outcaps = gst_caps_new_simple ("video/mpeg", + "mpegversion", G_TYPE_INT, 2, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + res = gst_pad_set_caps (depayload->srcpad, outcaps); + gst_caps_unref (outcaps); + + return res; +} + +static GstBuffer * +gst_rtp_mpv_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpMPVDepay *rtpmpvdepay; + GstBuffer *outbuf; + + rtpmpvdepay = GST_RTP_MPV_DEPAY (depayload); + + { + gint payload_len, payload_header; + guint8 *payload; + guint8 T; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + payload = gst_rtp_buffer_get_payload (buf); + payload_header = 0; + + if (payload_len <= 4) + goto empty_packet; + + /* 3.4 MPEG Video-specific header + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | MBZ |T| TR | |N|S|B|E| P | | BFC | | FFC | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * AN FBV FFV + */ + T = (payload[0] & 0x04); + + payload_len -= 4; + payload_header += 4; + payload += 4; + + if (T) { + /* + * 3.4.1 MPEG-2 Video-specific header extension + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |X|E|f_[0,0]|f_[0,1]|f_[1,0]|f_[1,1]| DC| PS|T|P|C|Q|V|A|R|H|G|D| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + if (payload_len <= 4) + goto empty_packet; + + payload_len -= 4; + payload_header += 4; + payload += 4; + } + + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, payload_header, -1); + + if (outbuf) { + GST_DEBUG_OBJECT (rtpmpvdepay, + "gst_rtp_mpv_depay_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); + } + + return outbuf; + } + + return NULL; + + /* ERRORS */ +empty_packet: + { + GST_ELEMENT_WARNING (rtpmpvdepay, STREAM, DECODE, + (NULL), ("Empty payload.")); + return NULL; + } +} + +gboolean +gst_rtp_mpv_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmpvdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MPV_DEPAY); +} diff --git a/gst/rtp/gstrtpmpvdepay.h b/gst/rtp/gstrtpmpvdepay.h new file mode 100644 index 0000000..ca366d5 --- /dev/null +++ b/gst/rtp/gstrtpmpvdepay.h @@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_MPV_DEPAY_H__ +#define __GST_RTP_MPV_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_MPV_DEPAY \ + (gst_rtp_mpv_depay_get_type()) +#define GST_RTP_MPV_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPV_DEPAY,GstRtpMPVDepay)) +#define GST_RTP_MPV_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPV_DEPAY,GstRtpMPVDepayClass)) +#define GST_IS_RTP_MPV_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPV_DEPAY)) +#define GST_IS_RTP_MPV_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPV_DEPAY)) + +typedef struct _GstRtpMPVDepay GstRtpMPVDepay; +typedef struct _GstRtpMPVDepayClass GstRtpMPVDepayClass; + +struct _GstRtpMPVDepay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpMPVDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_mpv_depay_get_type (void); + +gboolean gst_rtp_mpv_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MPV_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpmpvpay.c b/gst/rtp/gstrtpmpvpay.c new file mode 100644 index 0000000..9fa897f --- /dev/null +++ b/gst/rtp/gstrtpmpvpay.c @@ -0,0 +1,310 @@ +/* GStreamer + * Copyright (C) <2007> Thijs Vermeir + * + * 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 +#include +#include + +#include "gstrtpmpvpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpmpvpay_debug); +#define GST_CAT_DEFAULT (rtpmpvpay_debug) + +static GstStaticPadTemplate gst_rtp_mpv_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) 2, systemstream = (boolean) FALSE") + ); + +static GstStaticPadTemplate gst_rtp_mpv_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_MPV_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"MPV\"") + ); + +static GstStateChangeReturn gst_rtp_mpv_pay_change_state (GstElement * element, + GstStateChange transition); + +static void gst_rtp_mpv_pay_finalize (GObject * object); + +static GstFlowReturn gst_rtp_mpv_pay_flush (GstRTPMPVPay * rtpmpvpay); +static gboolean gst_rtp_mpv_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_mpv_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); +static gboolean gst_rtp_mpv_pay_handle_event (GstPad * pad, GstEvent * event); + +GST_BOILERPLATE (GstRTPMPVPay, gst_rtp_mpv_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_mpv_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpv_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_mpv_pay_src_template); + gst_element_class_set_details_simple (element_class, + "RTP MPEG2 ES video payloader", "Codec/Payloader/Network/RTP", + "Payload-encodes MPEG2 ES into RTP packets (RFC 2250)", + "Thijs Vermeir "); +} + +static void +gst_rtp_mpv_pay_class_init (GstRTPMPVPayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gobject_class->finalize = gst_rtp_mpv_pay_finalize; + + gstelement_class->change_state = gst_rtp_mpv_pay_change_state; + + gstbasertppayload_class->set_caps = gst_rtp_mpv_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_mpv_pay_handle_buffer; + gstbasertppayload_class->handle_event = gst_rtp_mpv_pay_handle_event; + + GST_DEBUG_CATEGORY_INIT (rtpmpvpay_debug, "rtpmpvpay", 0, + "MPEG2 ES Video RTP Payloader"); +} + +static void +gst_rtp_mpv_pay_init (GstRTPMPVPay * rtpmpvpay, GstRTPMPVPayClass * klass) +{ + GST_BASE_RTP_PAYLOAD (rtpmpvpay)->clock_rate = 90000; + GST_BASE_RTP_PAYLOAD_PT (rtpmpvpay) = GST_RTP_PAYLOAD_MPV; + + rtpmpvpay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_mpv_pay_finalize (GObject * object) +{ + GstRTPMPVPay *rtpmpvpay; + + rtpmpvpay = GST_RTP_MPV_PAY (object); + + g_object_unref (rtpmpvpay->adapter); + rtpmpvpay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_rtp_mpv_pay_reset (GstRTPMPVPay * pay) +{ + pay->first_ts = -1; + pay->duration = 0; + gst_adapter_clear (pay->adapter); + GST_DEBUG_OBJECT (pay, "reset depayloader"); +} + +static gboolean +gst_rtp_mpv_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gst_basertppayload_set_options (payload, "video", FALSE, "MPV", 90000); + return gst_basertppayload_set_outcaps (payload, NULL); +} + +static gboolean +gst_rtp_mpv_pay_handle_event (GstPad * pad, GstEvent * event) +{ + GstRTPMPVPay *rtpmpvpay; + + rtpmpvpay = GST_RTP_MPV_PAY (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + /* make sure we push the last packets in the adapter on EOS */ + gst_rtp_mpv_pay_flush (rtpmpvpay); + break; + case GST_EVENT_FLUSH_STOP: + gst_rtp_mpv_pay_reset (rtpmpvpay); + break; + default: + break; + } + + gst_object_unref (rtpmpvpay); + + /* FALSE to let the parent handle the event as well */ + return FALSE; +} + +static GstFlowReturn +gst_rtp_mpv_pay_flush (GstRTPMPVPay * rtpmpvpay) +{ + GstBuffer *outbuf; + GstFlowReturn ret; + guint avail; + + guint8 *payload; + + avail = gst_adapter_available (rtpmpvpay->adapter); + + ret = GST_FLOW_OK; + + while (avail > 0) { + guint towrite; + guint packet_len; + guint payload_len; + + packet_len = gst_rtp_buffer_calc_packet_len (avail, 4, 0); + + towrite = MIN (packet_len, GST_BASE_RTP_PAYLOAD_MTU (rtpmpvpay)); + + payload_len = gst_rtp_buffer_calc_payload_len (towrite, 4, 0); + + outbuf = gst_rtp_buffer_new_allocate (payload_len, 4, 0); + + payload = gst_rtp_buffer_get_payload (outbuf); + /* enable MPEG Video-specific header + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | MBZ |T| TR | |N|S|B|E| P | | BFC | | FFC | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * AN FBV FFV + */ + + /* fill in the MPEG Video-specific header + * data is set to 0x0 here + */ + memset (payload, 0x0, 4); + + gst_adapter_copy (rtpmpvpay->adapter, payload + 4, 0, payload_len); + gst_adapter_flush (rtpmpvpay->adapter, payload_len); + + avail -= payload_len; + + gst_rtp_buffer_set_marker (outbuf, avail == 0); + + GST_BUFFER_TIMESTAMP (outbuf) = rtpmpvpay->first_ts; + + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmpvpay), outbuf); + } + + return ret; +} + +static GstFlowReturn +gst_rtp_mpv_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRTPMPVPay *rtpmpvpay; + guint avail, packet_len; + GstClockTime timestamp, duration; + GstFlowReturn ret = GST_FLOW_OK; + + rtpmpvpay = GST_RTP_MPV_PAY (basepayload); + + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + + if (GST_BUFFER_IS_DISCONT (buffer)) { + GST_DEBUG_OBJECT (rtpmpvpay, "DISCONT"); + gst_rtp_mpv_pay_reset (rtpmpvpay); + } + + avail = gst_adapter_available (rtpmpvpay->adapter); + + if (duration == -1) + duration = 0; + + if (rtpmpvpay->first_ts == GST_CLOCK_TIME_NONE || avail == 0) + rtpmpvpay->first_ts = timestamp; + + if (avail == 0) { + rtpmpvpay->duration = duration; + } else { + rtpmpvpay->duration += duration; + } + + gst_adapter_push (rtpmpvpay->adapter, buffer); + avail = gst_adapter_available (rtpmpvpay->adapter); + + /* get packet length of previous data and this new data, + * payload length includes a 4 byte MPEG video-specific header */ + packet_len = gst_rtp_buffer_calc_packet_len (avail, 4, 0); + GST_LOG_OBJECT (rtpmpvpay, "available %d, rtp packet length %d", avail, + packet_len); + + if (gst_basertppayload_is_filled (basepayload, + packet_len, rtpmpvpay->duration)) { + ret = gst_rtp_mpv_pay_flush (rtpmpvpay); + } else { + rtpmpvpay->first_ts = timestamp; + } + + return ret; +} + +static GstStateChangeReturn +gst_rtp_mpv_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstRTPMPVPay *rtpmpvpay; + GstStateChangeReturn ret; + + rtpmpvpay = GST_RTP_MPV_PAY (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_mpv_pay_reset (rtpmpvpay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_mpv_pay_reset (rtpmpvpay); + break; + default: + break; + } + return ret; +} + + +gboolean +gst_rtp_mpv_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpmpvpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_MPV_PAY); +} diff --git a/gst/rtp/gstrtpmpvpay.h b/gst/rtp/gstrtpmpvpay.h new file mode 100644 index 0000000..d16162e --- /dev/null +++ b/gst/rtp/gstrtpmpvpay.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <2007> Thijs Vermeir + * + * 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_RTP_MPV_PAY_H__ +#define __GST_RTP_MPV_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRTPMPVPay GstRTPMPVPay; +typedef struct _GstRTPMPVPayClass GstRTPMPVPayClass; + +#define GST_TYPE_RTP_MPV_PAY \ + (gst_rtp_mpv_pay_get_type()) +#define GST_RTP_MPV_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPV_PAY,GstRTPMPVPay)) +#define GST_RTP_MPV_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPV_PAY,GstRTPMPVPayClass)) +#define GST_IS_RTP_MPV_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPV_PAY)) +#define GST_IS_RTP_MPV_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPV_PAY)) + +struct _GstRTPMPVPay +{ + GstBaseRTPPayload payload; + + GstAdapter *adapter; + GstClockTime first_ts; + GstClockTime duration; +}; + +struct _GstRTPMPVPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_mpv_pay_get_type (void); + +gboolean gst_rtp_mpv_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_MPV_PAY_H__ */ diff --git a/gst/rtp/gstrtppcmadepay.c b/gst/rtp/gstrtppcmadepay.c new file mode 100644 index 0000000..04e509e --- /dev/null +++ b/gst/rtp/gstrtppcmadepay.c @@ -0,0 +1,164 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2005> Edgard Lima + * Copyright (C) <2005> Zeeshan Ali + * + * 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 +#include +#include "gstrtppcmadepay.h" + +/* RtpPcmaDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +static GstStaticPadTemplate gst_rtp_pcma_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_PCMA_STRING ", " + "clock-rate = (int) 8000, encoding-name = (string) \"PCMA\";" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], encoding-name = (string) \"PCMA\"") + ); + +static GstStaticPadTemplate gst_rtp_pcma_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-alaw, channels = (int) 1, rate = (int) [1, MAX ]") + ); + +static GstBuffer *gst_rtp_pcma_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_pcma_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRtpPcmaDepay, gst_rtp_pcma_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_pcma_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_pcma_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_pcma_depay_sink_template); + gst_element_class_set_details_simple (element_class, "RTP PCMA depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts PCMA audio from RTP packets", + "Edgard Lima , Zeeshan Ali "); +} + +static void +gst_rtp_pcma_depay_class_init (GstRtpPcmaDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_pcma_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_pcma_depay_setcaps; +} + +static void +gst_rtp_pcma_depay_init (GstRtpPcmaDepay * rtppcmadepay, + GstRtpPcmaDepayClass * klass) +{ + GstBaseRTPDepayload *depayload; + + depayload = GST_BASE_RTP_DEPAYLOAD (rtppcmadepay); + + gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); +} + +static gboolean +gst_rtp_pcma_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + GstStructure *structure; + gboolean ret; + gint clock_rate; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 8000; /* default */ + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("audio/x-alaw", + "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, clock_rate, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return ret; +} + +static GstBuffer * +gst_rtp_pcma_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstBuffer *outbuf = NULL; + gboolean marker; + guint len; + + marker = gst_rtp_buffer_get_marker (buf); + + GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", + GST_BUFFER_SIZE (buf), marker, + gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); + + len = gst_rtp_buffer_get_payload_len (buf); + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + if (outbuf) { + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale_int (len, GST_SECOND, depayload->clock_rate); + + if (marker) { + /* mark start of talkspurt with DISCONT */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + } + + return outbuf; +} + +gboolean +gst_rtp_pcma_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtppcmadepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_PCMA_DEPAY); +} diff --git a/gst/rtp/gstrtppcmadepay.h b/gst/rtp/gstrtppcmadepay.h new file mode 100644 index 0000000..1240314 --- /dev/null +++ b/gst/rtp/gstrtppcmadepay.h @@ -0,0 +1,53 @@ +/* GStreamer + * Copyright (C) <2005> Edgard Lima + * + * 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 + */ + +#ifndef __GST_RTP_PCMA_DEPAY_H__ +#define __GST_RTP_PCMA_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpPcmaDepay GstRtpPcmaDepay; +typedef struct _GstRtpPcmaDepayClass GstRtpPcmaDepayClass; + +#define GST_TYPE_RTP_PCMA_DEPAY \ + (gst_rtp_pcma_depay_get_type()) +#define GST_RTP_PCMA_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PCMA_DEPAY,GstRtpPcmaDepay)) +#define GST_RTP_PCMA_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PCMA_DEPAY,GstRtpPcmaDepayClass)) +#define GST_IS_RTP_PCMA_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PCMA_DEPAY)) +#define GST_IS_RTP_PCMA_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PCMA_DEPAY)) + +struct _GstRtpPcmaDepay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpPcmaDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_pcma_depay_get_type (void); + +gboolean gst_rtp_pcma_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_PCMA_DEPAY_H__ */ diff --git a/gst/rtp/gstrtppcmapay.c b/gst/rtp/gstrtppcmapay.c new file mode 100644 index 0000000..ea379a0 --- /dev/null +++ b/gst/rtp/gstrtppcmapay.c @@ -0,0 +1,118 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2005> Edgard Lima + * Copyright (C) <2005> Nokia Corporation + * + * 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 +#include +#include + +#include "gstrtppcmapay.h" + +static GstStaticPadTemplate gst_rtp_pcma_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-alaw, channels=(int)1, rate=(int)8000") + ); + +static GstStaticPadTemplate gst_rtp_pcma_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_PCMA_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMA\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"PCMA\"") + ); + +static gboolean gst_rtp_pcma_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); + +GST_BOILERPLATE (GstRtpPcmaPay, gst_rtp_pcma_pay, GstBaseRTPAudioPayload, + GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); + +static void +gst_rtp_pcma_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_pcma_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_pcma_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP PCMA payloader", + "Codec/Payloader/Network/RTP", + "Payload-encodes PCMA audio into a RTP packet", + "Edgard Lima "); +} + +static void +gst_rtp_pcma_pay_class_init (GstRtpPcmaPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_pcma_pay_setcaps; +} + +static void +gst_rtp_pcma_pay_init (GstRtpPcmaPay * rtppcmapay, GstRtpPcmaPayClass * klass) +{ + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtppcmapay); + + GST_BASE_RTP_PAYLOAD (rtppcmapay)->clock_rate = 8000; + + /* tell basertpaudiopayload that this is a sample based codec */ + gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); + + /* octet-per-sample is 1 for PCM */ + gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, 1); +} + +static gboolean +gst_rtp_pcma_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + + payload->pt = GST_RTP_PAYLOAD_PCMA; + + gst_basertppayload_set_options (payload, "audio", FALSE, "PCMA", 8000); + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; +} + +gboolean +gst_rtp_pcma_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtppcmapay", + GST_RANK_SECONDARY, GST_TYPE_RTP_PCMA_PAY); +} diff --git a/gst/rtp/gstrtppcmapay.h b/gst/rtp/gstrtppcmapay.h new file mode 100644 index 0000000..a51e975 --- /dev/null +++ b/gst/rtp/gstrtppcmapay.h @@ -0,0 +1,54 @@ +/* GStreamer + * Copyright (C) <2005> Edgard Lima + * + * 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 + */ + + +#ifndef __GST_RTP_PCMA_PAY_H__ +#define __GST_RTP_PCMA_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpPcmaPay GstRtpPcmaPay; +typedef struct _GstRtpPcmaPayClass GstRtpPcmaPayClass; + +#define GST_TYPE_RTP_PCMA_PAY \ + (gst_rtp_pcma_pay_get_type()) +#define GST_RTP_PCMA_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PCMA_PAY,GstRtpPcmaPay)) +#define GST_RTP_PCMA_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PCMA_PAY,GstRtpPcmaPayClass)) +#define GST_IS_RTP_PCMA_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PCMA_PAY)) +#define GST_IS_RTP_PCMA_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PCMA_PAY)) + +struct _GstRtpPcmaPay +{ + GstBaseRTPAudioPayload audiopayload; +}; + +struct _GstRtpPcmaPayClass +{ + GstBaseRTPAudioPayloadClass parent_class; +}; + +GType gst_rtp_pcma_pay_get_type (void); + +gboolean gst_rtp_pcma_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_PCMA_PAY_H__ */ diff --git a/gst/rtp/gstrtppcmudepay.c b/gst/rtp/gstrtppcmudepay.c new file mode 100644 index 0000000..d09e061 --- /dev/null +++ b/gst/rtp/gstrtppcmudepay.c @@ -0,0 +1,165 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2005> Edgard Lima + * Copyright (C) <2005> Zeeshan Ali + * + * 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 +#include +#include "gstrtppcmudepay.h" + +/* RtpPcmuDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +static GstStaticPadTemplate gst_rtp_pcmu_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_PCMU_STRING ", " + "encoding-name = (string) \"PCMU\", clock-rate = (int) 8000; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "encoding-name = (string) \"PCMU\", clock-rate = (int) [1, MAX ]") + ); + +static GstStaticPadTemplate gst_rtp_pcmu_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-mulaw, " + "channels = (int) 1, rate = (int) [1, MAX ]") + ); + +static GstBuffer *gst_rtp_pcmu_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_pcmu_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRtpPcmuDepay, gst_rtp_pcmu_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_pcmu_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_pcmu_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_pcmu_depay_sink_template); + gst_element_class_set_details_simple (element_class, "RTP PCMU depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts PCMU audio from RTP packets", + "Edgard Lima , Zeeshan Ali "); +} + +static void +gst_rtp_pcmu_depay_class_init (GstRtpPcmuDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_pcmu_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_pcmu_depay_setcaps; +} + +static void +gst_rtp_pcmu_depay_init (GstRtpPcmuDepay * rtppcmudepay, + GstRtpPcmuDepayClass * klass) +{ + GstBaseRTPDepayload *depayload; + + depayload = GST_BASE_RTP_DEPAYLOAD (rtppcmudepay); + + gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); +} + +static gboolean +gst_rtp_pcmu_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + GstStructure *structure; + gboolean ret; + gint clock_rate; + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 8000; /* default */ + depayload->clock_rate = clock_rate; + + srccaps = gst_caps_new_simple ("audio/x-mulaw", + "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, clock_rate, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return ret; +} + +static GstBuffer * +gst_rtp_pcmu_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstBuffer *outbuf = NULL; + guint len; + gboolean marker; + + marker = gst_rtp_buffer_get_marker (buf); + + GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", + GST_BUFFER_SIZE (buf), marker, + gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); + + len = gst_rtp_buffer_get_payload_len (buf); + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + if (outbuf) { + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale_int (len, GST_SECOND, depayload->clock_rate); + + if (marker) { + /* mark start of talkspurt with DISCONT */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } + } + + return outbuf; +} + +gboolean +gst_rtp_pcmu_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtppcmudepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_PCMU_DEPAY); +} diff --git a/gst/rtp/gstrtppcmudepay.h b/gst/rtp/gstrtppcmudepay.h new file mode 100644 index 0000000..72a37d1 --- /dev/null +++ b/gst/rtp/gstrtppcmudepay.h @@ -0,0 +1,53 @@ +/* GStreamer + * Copyright (C) <2005> Edgard Lima + * + * 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 + */ + +#ifndef __GST_RTP_PCMU_DEPAY_H__ +#define __GST_RTP_PCMU_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpPcmuDepay GstRtpPcmuDepay; +typedef struct _GstRtpPcmuDepayClass GstRtpPcmuDepayClass; + +#define GST_TYPE_RTP_PCMU_DEPAY \ + (gst_rtp_pcmu_depay_get_type()) +#define GST_RTP_PCMU_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PCMU_DEPAY,GstRtpPcmuDepay)) +#define GST_RTP_PCMU_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PCMU_DEPAY,GstRtpPcmuDepayClass)) +#define GST_IS_RTP_PCMU_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PCMU_DEPAY)) +#define GST_IS_RTP_PCMU_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PCMU_DEPAY)) + +struct _GstRtpPcmuDepay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpPcmuDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_pcmu_depay_get_type (void); + +gboolean gst_rtp_pcmu_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_PCMU_DEPAY_H__ */ diff --git a/gst/rtp/gstrtppcmupay.c b/gst/rtp/gstrtppcmupay.c new file mode 100644 index 0000000..5b555b3 --- /dev/null +++ b/gst/rtp/gstrtppcmupay.c @@ -0,0 +1,118 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2005> Edgard Lima + * Copyright (C) <2005> Nokia Corporation + * + * 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 +#include +#include + +#include "gstrtppcmupay.h" + +static GstStaticPadTemplate gst_rtp_pcmu_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-mulaw, channels=(int)1, rate=(int)8000") + ); + +static GstStaticPadTemplate gst_rtp_pcmu_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_PCMU_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMU\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"PCMU\"") + ); + +static gboolean gst_rtp_pcmu_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); + +GST_BOILERPLATE (GstRtpPcmuPay, gst_rtp_pcmu_pay, GstBaseRTPAudioPayload, + GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); + +static void +gst_rtp_pcmu_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_pcmu_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_pcmu_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP PCMU payloader", + "Codec/Payloader/Network/RTP", + "Payload-encodes PCMU audio into a RTP packet", + "Edgard Lima "); +} + +static void +gst_rtp_pcmu_pay_class_init (GstRtpPcmuPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_pcmu_pay_setcaps; +} + +static void +gst_rtp_pcmu_pay_init (GstRtpPcmuPay * rtppcmupay, GstRtpPcmuPayClass * klass) +{ + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtppcmupay); + + GST_BASE_RTP_PAYLOAD (rtppcmupay)->clock_rate = 8000; + + /* tell basertpaudiopayload that this is a sample based codec */ + gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); + + /* octet-per-sample is 1 for PCM */ + gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, 1); +} + +static gboolean +gst_rtp_pcmu_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + gboolean res; + + payload->pt = GST_RTP_PAYLOAD_PCMU; + + gst_basertppayload_set_options (payload, "audio", FALSE, "PCMU", 8000); + res = gst_basertppayload_set_outcaps (payload, NULL); + + return res; +} + +gboolean +gst_rtp_pcmu_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtppcmupay", + GST_RANK_SECONDARY, GST_TYPE_RTP_PCMU_PAY); +} diff --git a/gst/rtp/gstrtppcmupay.h b/gst/rtp/gstrtppcmupay.h new file mode 100644 index 0000000..f43ec3b --- /dev/null +++ b/gst/rtp/gstrtppcmupay.h @@ -0,0 +1,54 @@ +/* GStreamer + * Copyright (C) <2005> Edgard Lima + * + * 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 + */ + + +#ifndef __GST_RTP_PCMU_PAY_H__ +#define __GST_RTP_PCMU_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpPcmuPay GstRtpPcmuPay; +typedef struct _GstRtpPcmuPayClass GstRtpPcmuPayClass; + +#define GST_TYPE_RTP_PCMU_PAY \ + (gst_rtp_pcmu_pay_get_type()) +#define GST_RTP_PCMU_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PCMU_PAY,GstRtpPcmuPay)) +#define GST_RTP_PCMU_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PCMU_PAY,GstRtpPcmuPayClass)) +#define GST_IS_RTP_PCMU_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PCMU_PAY)) +#define GST_IS_RTP_PCMU_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PCMU_PAY)) + +struct _GstRtpPcmuPay +{ + GstBaseRTPAudioPayload audiopayload; +}; + +struct _GstRtpPcmuPayClass +{ + GstBaseRTPAudioPayloadClass parent_class; +}; + +GType gst_rtp_pcmu_pay_get_type (void); + +gboolean gst_rtp_pcmu_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_PCMU_PAY_H__ */ diff --git a/gst/rtp/gstrtpqcelpdepay.c b/gst/rtp/gstrtpqcelpdepay.c new file mode 100644 index 0000000..810b58e --- /dev/null +++ b/gst/rtp/gstrtpqcelpdepay.c @@ -0,0 +1,432 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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 + +#include +#include +#include "gstrtpqcelpdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpqcelpdepay_debug); +#define GST_CAT_DEFAULT (rtpqcelpdepay_debug) + +/* references: + * + * RFC 2658 - RTP Payload Format for PureVoice(tm) Audio + */ +#define FRAME_DURATION (20 * GST_MSECOND) + +/* RtpQCELPDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +static GstStaticPadTemplate gst_rtp_qcelp_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"QCELP\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_QCELP_STRING ", " + "clock-rate = (int) 8000") + ); + +static GstStaticPadTemplate gst_rtp_qcelp_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/qcelp, " "channels = (int) 1," "rate = (int) 8000") + ); + +static void gst_rtp_qcelp_depay_finalize (GObject * object); + +static gboolean gst_rtp_qcelp_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_qcelp_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +GST_BOILERPLATE (GstRtpQCELPDepay, gst_rtp_qcelp_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_qcelp_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_qcelp_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_qcelp_depay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP QCELP depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts QCELP (PureVoice) audio from RTP packets (RFC 2658)", + "Wim Taymans "); +} + +static void +gst_rtp_qcelp_depay_class_init (GstRtpQCELPDepayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_qcelp_depay_finalize; + + gstbasertpdepayload_class->process = gst_rtp_qcelp_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_qcelp_depay_setcaps; + + GST_DEBUG_CATEGORY_INIT (rtpqcelpdepay_debug, "rtpqcelpdepay", 0, + "QCELP RTP Depayloader"); +} + +static void +gst_rtp_qcelp_depay_init (GstRtpQCELPDepay * rtpqcelpdepay, + GstRtpQCELPDepayClass * klass) +{ + GstBaseRTPDepayload G_GNUC_UNUSED *depayload; + + depayload = GST_BASE_RTP_DEPAYLOAD (rtpqcelpdepay); +} + +static void +gst_rtp_qcelp_depay_finalize (GObject * object) +{ + GstRtpQCELPDepay *depay; + + depay = GST_RTP_QCELP_DEPAY (object); + + if (depay->packets != NULL) { + g_ptr_array_foreach (depay->packets, (GFunc) gst_buffer_unref, NULL); + g_ptr_array_free (depay->packets, TRUE); + depay->packets = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static gboolean +gst_rtp_qcelp_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + gboolean res; + + srccaps = gst_caps_new_simple ("audio/qcelp", + "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL); + res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + return res; +} + +static const gint frame_size[16] = { + 1, 4, 8, 17, 35, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0 +}; + +/* get the frame length, 0 is invalid, negative values are invalid but can be + * recovered from. */ +static gint +get_frame_len (GstRtpQCELPDepay * depay, guint8 frame_type) +{ + if (frame_type >= G_N_ELEMENTS (frame_size)) + return 0; + + return frame_size[frame_type]; +} + +static guint +count_packets (GstRtpQCELPDepay * depay, guint8 * data, guint size) +{ + guint count = 0; + + while (size > 0) { + gint frame_len; + + frame_len = get_frame_len (depay, data[0]); + + /* 0 is invalid and we throw away the remainder of the frames */ + if (frame_len == 0) + break; + + if (frame_len < 0) + frame_len = -frame_len; + + if (frame_len > size) + break; + + size -= frame_len; + data += frame_len; + count++; + } + return count; +} + +static void +flush_packets (GstRtpQCELPDepay * depay) +{ + guint i, size; + + GST_DEBUG_OBJECT (depay, "flushing packets"); + + size = depay->packets->len; + + for (i = 0; i < size; i++) { + GstBuffer *outbuf; + + outbuf = g_ptr_array_index (depay->packets, i); + g_ptr_array_index (depay->packets, i) = NULL; + + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (depay), outbuf); + } + + /* and reset interleaving state */ + depay->interleaved = FALSE; + depay->bundling = 0; +} + +static void +add_packet (GstRtpQCELPDepay * depay, guint LLL, guint NNN, guint index, + GstBuffer * outbuf) +{ + guint idx; + GstBuffer *old; + + /* figure out the position in the array, note that index is never 0 because we + * push those packets immediately. */ + idx = NNN + ((LLL + 1) * (index - 1)); + + GST_DEBUG_OBJECT (depay, "adding packet at index %u", idx); + /* free old buffer (should not happen) */ + old = g_ptr_array_index (depay->packets, idx); + if (old) + gst_buffer_unref (old); + + /* store new buffer */ + g_ptr_array_index (depay->packets, idx) = outbuf; +} + +static GstBuffer * +create_erasure_buffer (GstRtpQCELPDepay * depay) +{ + GstBuffer *outbuf; + + outbuf = gst_buffer_new_and_alloc (1); + GST_BUFFER_DATA (outbuf)[0] = 14; + + return outbuf; +} + +static GstBuffer * +gst_rtp_qcelp_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpQCELPDepay *depay; + GstBuffer *outbuf; + GstClockTime timestamp; + guint payload_len, offset, index; + guint8 *payload; + guint LLL, NNN; + + depay = GST_RTP_QCELP_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + if (payload_len < 2) + goto too_small; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + + payload = gst_rtp_buffer_get_payload (buf); + + /* 0 1 2 3 4 5 6 7 + * +-+-+-+-+-+-+-+-+ + * |RR | LLL | NNN | + * +-+-+-+-+-+-+-+-+ + */ + /* RR = payload[0] >> 6; */ + LLL = (payload[0] & 0x38) >> 3; + NNN = (payload[0] & 0x07); + + payload_len--; + payload++; + + GST_DEBUG_OBJECT (depay, "LLL %u, NNN %u", LLL, NNN); + + if (LLL > 5) + goto invalid_lll; + + if (NNN > LLL) + goto invalid_nnn; + + if (LLL != 0) { + /* we are interleaved */ + if (!depay->interleaved) { + guint size; + + GST_DEBUG_OBJECT (depay, "starting interleaving group"); + /* bundling is not allowed to change in one interleave group */ + depay->bundling = count_packets (depay, payload, payload_len); + GST_DEBUG_OBJECT (depay, "got bundling of %u", depay->bundling); + /* we have one bundle where NNN goes from 0 to L, we don't store the index + * 0 frames, so L+1 packets. Each packet has 'bundling - 1' packets */ + size = (depay->bundling - 1) * (LLL + 1); + /* create the array to hold the packets */ + if (depay->packets == NULL) + depay->packets = g_ptr_array_sized_new (size); + GST_DEBUG_OBJECT (depay, "created packet array of size %u", size); + g_ptr_array_set_size (depay->packets, size); + /* we were previously not interleaved, figure out how much space we + * need to deinterleave */ + depay->interleaved = TRUE; + } + } else { + /* we are not interleaved */ + if (depay->interleaved) { + GST_DEBUG_OBJECT (depay, "stopping interleaving"); + /* flush packets if we were previously interleaved */ + flush_packets (depay); + } + depay->bundling = 0; + } + + index = 0; + offset = 1; + + while (payload_len > 0) { + gint frame_len; + gboolean do_erasure; + + frame_len = get_frame_len (depay, payload[0]); + GST_DEBUG_OBJECT (depay, "got frame len %d", frame_len); + + if (frame_len == 0) + goto invalid_frame; + + if (frame_len < 0) { + /* need to add an erasure frame but we can recover */ + frame_len = -frame_len; + do_erasure = TRUE; + } else { + do_erasure = FALSE; + } + + if (frame_len > payload_len) + goto invalid_frame; + + if (do_erasure) { + /* create erasure frame */ + outbuf = create_erasure_buffer (depay); + } else { + /* each frame goes into its buffer */ + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, offset, frame_len); + } + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = FRAME_DURATION; + + if (!depay->interleaved || index == 0) { + /* not interleaved or first frame in packet, just push */ + gst_base_rtp_depayload_push (depayload, outbuf); + + if (timestamp != -1) + timestamp += FRAME_DURATION; + } else { + /* put in interleave buffer */ + add_packet (depay, LLL, NNN, index, outbuf); + + if (timestamp != -1) + timestamp += (FRAME_DURATION * (LLL + 1)); + } + + payload_len -= frame_len; + payload += frame_len; + offset += frame_len; + index++; + + /* discard excess packets */ + if (depay->bundling > 0 && depay->bundling <= index) + break; + } + while (index < depay->bundling) { + GST_DEBUG_OBJECT (depay, "filling with erasure buffer"); + /* fill remainder with erasure packets */ + outbuf = create_erasure_buffer (depay); + add_packet (depay, LLL, NNN, index, outbuf); + index++; + } + if (depay->interleaved && LLL == NNN) { + GST_DEBUG_OBJECT (depay, "interleave group ended, flushing"); + /* we have the complete interleave group, flush */ + flush_packets (depay); + } + + return NULL; + + /* ERRORS */ +too_small: + { + GST_ELEMENT_WARNING (depay, STREAM, DECODE, + (NULL), ("QCELP RTP payload too small (%d)", payload_len)); + return NULL; + } +invalid_lll: + { + GST_ELEMENT_WARNING (depay, STREAM, DECODE, + (NULL), ("QCELP RTP invalid LLL received (%d)", LLL)); + return NULL; + } +invalid_nnn: + { + GST_ELEMENT_WARNING (depay, STREAM, DECODE, + (NULL), ("QCELP RTP invalid NNN received (%d)", NNN)); + return NULL; + } +invalid_frame: + { + GST_ELEMENT_WARNING (depay, STREAM, DECODE, + (NULL), ("QCELP RTP invalid frame received")); + return NULL; + } +} + +gboolean +gst_rtp_qcelp_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpqcelpdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_QCELP_DEPAY); +} diff --git a/gst/rtp/gstrtpqcelpdepay.h b/gst/rtp/gstrtpqcelpdepay.h new file mode 100644 index 0000000..e78c906 --- /dev/null +++ b/gst/rtp/gstrtpqcelpdepay.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (C) <2010> Wim Taymans + * + * 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_RTP_QCELP_DEPAY_H__ +#define __GST_RTP_QCELP_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_QCELP_DEPAY \ + (gst_rtp_qcelp_depay_get_type()) +#define GST_RTP_QCELP_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_QCELP_DEPAY,GstRtpQCELPDepay)) +#define GST_RTP_QCELP_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_QCELP_DEPAY,GstRtpQCELPDepayClass)) +#define GST_IS_RTP_QCELP_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_QCELP_DEPAY)) +#define GST_IS_RTP_QCELP_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_QCELP_DEPAY)) + +typedef struct _GstRtpQCELPDepay GstRtpQCELPDepay; +typedef struct _GstRtpQCELPDepayClass GstRtpQCELPDepayClass; + +struct _GstRtpQCELPDepay +{ + GstBaseRTPDepayload depayload; + + gboolean interleaved; + guint bundling; + GPtrArray *packets; +}; + +struct _GstRtpQCELPDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_qcelp_depay_get_type (void); + +gboolean gst_rtp_qcelp_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_QCELP_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpqdmdepay.c b/gst/rtp/gstrtpqdmdepay.c new file mode 100644 index 0000000..0139709 --- /dev/null +++ b/gst/rtp/gstrtpqdmdepay.c @@ -0,0 +1,419 @@ +/* GStreamer + * Copyright (C) <2009> Edward Hervey + * + * 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 + +#include +#include "gstrtpqdmdepay.h" + +GST_DEBUG_CATEGORY (rtpqdm2depay_debug); +#define GST_CAT_DEFAULT rtpqdm2depay_debug + +static GstStaticPadTemplate gst_rtp_qdm2_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-qdm2") + ); + +static GstStaticPadTemplate gst_rtp_qdm2_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "encoding-name = (string)\"X-QDM\"") + ); + +GST_BOILERPLATE (GstRtpQDM2Depay, gst_rtp_qdm2_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static const guint8 headheader[20] = { + 0x0, 0x0, 0x0, 0xc, 0x66, 0x72, 0x6d, 0x61, + 0x51, 0x44, 0x4d, 0x32, 0x0, 0x0, 0x0, 0x24, + 0x51, 0x44, 0x43, 0x41 +}; + +static void gst_rtp_qdm2_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_qdm2_depay_change_state (GstElement * + element, GstStateChange transition); + +static GstBuffer *gst_rtp_qdm2_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +gboolean gst_rtp_qdm2_depay_setcaps (GstBaseRTPDepayload * filter, + GstCaps * caps); + +static void +gst_rtp_qdm2_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_qdm2_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_qdm2_depay_sink_template); + + + gst_element_class_set_details_simple (element_class, "RTP QDM2 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts QDM2 audio from RTP packets (no RFC)", + "Edward Hervey "); +} + +static void +gst_rtp_qdm2_depay_class_init (GstRtpQDM2DepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_qdm2_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_qdm2_depay_setcaps; + + gobject_class->finalize = gst_rtp_qdm2_depay_finalize; + + gstelement_class->change_state = gst_rtp_qdm2_depay_change_state; +} + +static void +gst_rtp_qdm2_depay_init (GstRtpQDM2Depay * rtpqdm2depay, + GstRtpQDM2DepayClass * klass) +{ + rtpqdm2depay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_qdm2_depay_finalize (GObject * object) +{ + GstRtpQDM2Depay *rtpqdm2depay; + + rtpqdm2depay = GST_RTP_QDM2_DEPAY (object); + + g_object_unref (rtpqdm2depay->adapter); + rtpqdm2depay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +// only on the sink +gboolean +gst_rtp_qdm2_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) +{ + GstStructure *structure = gst_caps_get_structure (caps, 0); + gint clock_rate; + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 44100; // default + filter->clock_rate = clock_rate; + + /* will set caps later */ + + return TRUE; +} + +static void +flush_data (GstRtpQDM2Depay * depay) +{ + guint i; + guint avail; + + if ((avail = gst_adapter_available (depay->adapter))) + gst_adapter_flush (depay->adapter, avail); + + GST_DEBUG ("Flushing %d packets", depay->nbpackets); + + for (i = 0; depay->packets[i]; i++) { + QDM2Packet *pack = depay->packets[i]; + guint32 crc = 0; + int i = 0; + GstBuffer *buf; + guint8 *data; + + /* CRC is the sum of everything (including first bytes) */ + + data = pack->data; + + if (G_UNLIKELY (data == NULL)) + continue; + + /* If the packet size is bigger than 0xff, we need 2 bytes to store the size */ + if (depay->packetsize > 0xff) { + /* Expanded size 0x02 | 0x80 */ + data[0] = 0x82; + GST_WRITE_UINT16_BE (data + 1, depay->packetsize - 3); + } else { + data[0] = 0x2; + data[1] = depay->packetsize - 2; + } + + /* Calculate CRC */ + for (; i < depay->packetsize; i++) + crc += data[i]; + + GST_DEBUG ("CRC is 0x%x", crc); + + /* Write CRC */ + if (depay->packetsize > 0xff) + GST_WRITE_UINT16_BE (data + 3, crc); + else + GST_WRITE_UINT16_BE (data + 2, crc); + + GST_MEMDUMP ("Extracted packet", data, depay->packetsize); + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = data; + GST_BUFFER_MALLOCDATA (buf) = data; + GST_BUFFER_SIZE (buf) = depay->packetsize; + + gst_adapter_push (depay->adapter, buf); + + if (pack->data) { + pack->data = NULL; + } + } +} + +static void +add_packet (GstRtpQDM2Depay * depay, guint32 pid, guint32 len, guint8 * data) +{ + QDM2Packet *packet; + + if (G_UNLIKELY (!depay->configured)) + return; + + GST_DEBUG ("pid:%d, len:%d, data:%p", pid, len, data); + + if (G_UNLIKELY (depay->packets[pid] == NULL)) { + depay->packets[pid] = g_malloc0 (sizeof (QDM2Packet)); + depay->nbpackets = MAX (depay->nbpackets, pid + 1); + } + packet = depay->packets[pid]; + + GST_DEBUG ("packet:%p", packet); + GST_DEBUG ("packet->data:%p", packet->data); + + if (G_UNLIKELY (packet->data == NULL)) { + packet->data = g_malloc0 (depay->packetsize); + /* We leave space for the header/crc */ + if (depay->packetsize > 0xff) + packet->offs = 5; + else + packet->offs = 4; + } + + /* Finally copy the data over */ + memcpy (packet->data + packet->offs, data, len); + packet->offs += len; +} + +static GstBuffer * +gst_rtp_qdm2_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpQDM2Depay *rtpqdm2depay; + GstBuffer *outbuf; + guint16 seq; + + rtpqdm2depay = GST_RTP_QDM2_DEPAY (depayload); + + { + gint payload_len; + guint8 *payload; + guint avail; + guint pos = 0; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + if (payload_len < 3) + goto bad_packet; + + payload = gst_rtp_buffer_get_payload (buf); + seq = gst_rtp_buffer_get_seq (buf); + if (G_UNLIKELY (seq != rtpqdm2depay->nextseq)) { + GST_DEBUG ("GAP in sequence number, Resetting data !"); + /* Flush previous data */ + flush_data (rtpqdm2depay); + /* And store new timestamp */ + rtpqdm2depay->ptimestamp = rtpqdm2depay->timestamp; + rtpqdm2depay->timestamp = GST_BUFFER_TIMESTAMP (buf); + /* And that previous data will be pushed at the bottom */ + } + rtpqdm2depay->nextseq = seq + 1; + + GST_DEBUG ("Payload size %d 0x%x sequence:%d", payload_len, payload_len, + seq); + + GST_MEMDUMP ("Incoming payload", payload, payload_len); + + while (pos < payload_len) { + switch (payload[pos]) { + case 0x80:{ + GST_DEBUG ("Unrecognized 0x80 marker, skipping 12 bytes"); + pos += 12; + } + break; + case 0xff: + /* HEADERS */ + GST_DEBUG ("Headers"); + /* Store the incoming timestamp */ + rtpqdm2depay->ptimestamp = rtpqdm2depay->timestamp; + rtpqdm2depay->timestamp = GST_BUFFER_TIMESTAMP (buf); + /* flush the internal data if needed */ + flush_data (rtpqdm2depay); + if (G_UNLIKELY (!rtpqdm2depay->configured)) { + guint8 *ourdata; + GstBuffer *codecdata; + GstCaps *caps; + + /* First bytes are unknown */ + GST_MEMDUMP ("Header", payload + pos, 32); + ourdata = payload + pos + 10; + pos += 10; + rtpqdm2depay->channs = GST_READ_UINT32_BE (payload + pos + 4); + rtpqdm2depay->samplerate = GST_READ_UINT32_BE (payload + pos + 8); + rtpqdm2depay->bitrate = GST_READ_UINT32_BE (payload + pos + 12); + rtpqdm2depay->blocksize = GST_READ_UINT32_BE (payload + pos + 16); + rtpqdm2depay->framesize = GST_READ_UINT32_BE (payload + pos + 20); + rtpqdm2depay->packetsize = GST_READ_UINT32_BE (payload + pos + 24); + /* 16 bit empty block (0x02 0x00) */ + pos += 30; + GST_DEBUG + ("channs:%d, samplerate:%d, bitrate:%d, blocksize:%d, framesize:%d, packetsize:%d", + rtpqdm2depay->channs, rtpqdm2depay->samplerate, + rtpqdm2depay->bitrate, rtpqdm2depay->blocksize, + rtpqdm2depay->framesize, rtpqdm2depay->packetsize); + + /* Caps */ + codecdata = gst_buffer_new_and_alloc (48); + memcpy (GST_BUFFER_DATA (codecdata), headheader, 20); + memcpy (GST_BUFFER_DATA (codecdata) + 20, ourdata, 28); + + caps = gst_caps_new_simple ("audio/x-qdm2", + "samplesize", G_TYPE_INT, 16, + "rate", G_TYPE_INT, rtpqdm2depay->samplerate, + "channels", G_TYPE_INT, rtpqdm2depay->channs, + "codec_data", GST_TYPE_BUFFER, codecdata, NULL); + gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), caps); + gst_caps_unref (caps); + rtpqdm2depay->configured = TRUE; + } else { + GST_DEBUG ("Already configured, skipping headers"); + pos += 40; + } + break; + default:{ + /* Shuffled packet contents */ + guint packetid = payload[pos++]; + guint packettype = payload[pos++]; + guint packlen = payload[pos++]; + guint hsize = 2; + + GST_DEBUG ("Packet id:%d, type:0x%x, len:%d", + packetid, packettype, packlen); + + /* Packets bigger than 0xff bytes have a type with the high bit set */ + if (G_UNLIKELY (packettype & 0x80)) { + packettype &= 0x7f; + packlen <<= 8; + packlen |= payload[pos++]; + hsize = 3; + GST_DEBUG ("Packet id:%d, type:0x%x, len:%d", + packetid, packettype, packlen); + } + + if (packettype > 0x7f) { + GST_ERROR ("HOUSTON WE HAVE A PROBLEM !!!!"); + } + add_packet (rtpqdm2depay, packetid, packlen + hsize, + payload + pos - hsize); + pos += packlen; + } + } + } + + GST_DEBUG ("final pos %d", pos); + + avail = gst_adapter_available (rtpqdm2depay->adapter); + if (G_UNLIKELY (avail)) { + GST_DEBUG ("Pushing out %d bytes of collected data", avail); + outbuf = gst_adapter_take_buffer (rtpqdm2depay->adapter, avail); + GST_BUFFER_TIMESTAMP (outbuf) = rtpqdm2depay->ptimestamp; + GST_DEBUG ("Outgoing buffer timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (rtpqdm2depay->ptimestamp)); + return outbuf; + } + } + return NULL; + + /* ERRORS */ +bad_packet: + { + GST_ELEMENT_WARNING (rtpqdm2depay, STREAM, DECODE, + (NULL), ("Packet was too short")); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_qdm2_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpQDM2Depay *rtpqdm2depay; + GstStateChangeReturn ret; + + rtpqdm2depay = GST_RTP_QDM2_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (rtpqdm2depay->adapter); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_qdm2_depay_plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (rtpqdm2depay_debug, "rtpqdm2depay", 0, + "RTP QDM2 depayloader"); + + return gst_element_register (plugin, "rtpqdm2depay", + GST_RANK_SECONDARY, GST_TYPE_RTP_QDM2_DEPAY); +} diff --git a/gst/rtp/gstrtpqdmdepay.h b/gst/rtp/gstrtpqdmdepay.h new file mode 100644 index 0000000..e3ae3dc --- /dev/null +++ b/gst/rtp/gstrtpqdmdepay.h @@ -0,0 +1,85 @@ +/* GStreamer + * Copyright (C) <2009> Edward Hervey + * + * 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_RTP_QDM2_DEPAY_H__ +#define __GST_RTP_QDM2_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_QDM2_DEPAY \ + (gst_rtp_qdm2_depay_get_type()) +#define GST_RTP_QDM2_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_QDM2_DEPAY,GstRtpQDM2Depay)) +#define GST_RTP_QDM2_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_QDM2_DEPAY,GstRtpQDM2DepayClass)) +#define GST_IS_RTP_QDM2_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_QDM2_DEPAY)) +#define GST_IS_RTP_QDM2_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_QDM2_DEPAY)) + +typedef struct _GstRtpQDM2Depay GstRtpQDM2Depay; +typedef struct _GstRtpQDM2DepayClass GstRtpQDM2DepayClass; + +typedef struct _QDM2Packet { + guint8* data; + guint offs; /* Starts at 4 to give room for the prefix */ +} QDM2Packet; + +#define MAX_SCRAMBLED_PACKETS 64 + +struct _GstRtpQDM2Depay +{ + GstBaseRTPDepayload depayload; + + GstAdapter *adapter; + + guint16 nextseq; + gboolean configured; + + GstClockTime timestamp; /* Timestamp of current incoming data */ + GstClockTime ptimestamp; /* Timestamp of data stored in the adapter */ + + guint32 channs; + guint32 samplerate; + guint32 bitrate; + guint32 blocksize; + guint32 framesize; + guint32 packetsize; + + guint nbpackets; /* Number of packets to unscramble */ + + QDM2Packet *packets[MAX_SCRAMBLED_PACKETS]; +}; + +struct _GstRtpQDM2DepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_qdm2_depay_get_type (void); + +gboolean gst_rtp_qdm2_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_QDM2_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpsirendepay.c b/gst/rtp/gstrtpsirendepay.c new file mode 100644 index 0000000..9213f24 --- /dev/null +++ b/gst/rtp/gstrtpsirendepay.c @@ -0,0 +1,124 @@ +/* + * Siren Depayloader Gst Element + * + * @author: Youness Alaoui + * + * 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 +#include +#include +#include "gstrtpsirendepay.h" + +static GstStaticPadTemplate gst_rtp_siren_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 16000, " + "encoding-name = (string) \"SIREN\", " "dct-length = (int) 320") + ); + +static GstStaticPadTemplate gst_rtp_siren_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-siren, " "dct-length = (int) 320") + ); + +static GstBuffer *gst_rtp_siren_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_siren_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRTPSirenDepay, gst_rtp_siren_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_siren_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_siren_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_siren_depay_sink_template); + gst_element_class_set_details_simple (element_class, + "RTP Siren packet depayloader", "Codec/Depayloader/Network/RTP", + "Extracts Siren audio from RTP packets", + "Philippe Kalaf "); +} + +static void +gst_rtp_siren_depay_class_init (GstRTPSirenDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_siren_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_siren_depay_setcaps; +} + +static void +gst_rtp_siren_depay_init (GstRTPSirenDepay * rtpsirendepay, + GstRTPSirenDepayClass * klass) +{ + +} + +static gboolean +gst_rtp_siren_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstCaps *srccaps; + gboolean ret; + + srccaps = gst_caps_new_simple ("audio/x-siren", + "dct-length", G_TYPE_INT, 320, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + + GST_DEBUG ("set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); + gst_caps_unref (srccaps); + + /* always fixed clock rate of 16000 */ + depayload->clock_rate = 16000; + + return ret; +} + +static GstBuffer * +gst_rtp_siren_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstBuffer *outbuf; + + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + return outbuf; +} + +gboolean +gst_rtp_siren_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpsirendepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_SIREN_DEPAY); +} diff --git a/gst/rtp/gstrtpsirendepay.h b/gst/rtp/gstrtpsirendepay.h new file mode 100644 index 0000000..cbb18cb --- /dev/null +++ b/gst/rtp/gstrtpsirendepay.h @@ -0,0 +1,59 @@ +/* + * Siren Depayloader Gst Element + * + * @author: Youness Alaoui + * + * 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_RTP_SIREN_DEPAY_H__ +#define __GST_RTP_SIREN_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS typedef struct _GstRTPSirenDepay GstRTPSirenDepay; +typedef struct _GstRTPSirenDepayClass GstRTPSirenDepayClass; + +#define GST_TYPE_RTP_SIREN_DEPAY \ + (gst_rtp_siren_depay_get_type()) +#define GST_RTP_SIREN_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SIREN_DEPAY,GstRTPSirenDepay)) +#define GST_RTP_SIREN_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SIREN_DEPAY,GstRTPSirenDepayClass)) +#define GST_IS_RTP_SIREN_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SIREN_DEPAY)) +#define GST_IS_RTP_SIREN_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SIREN_DEPAY)) + + +struct _GstRTPSirenDepay +{ + GstBaseRTPDepayload depayload; + +}; + +struct _GstRTPSirenDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_siren_depay_get_type (void); + +gboolean gst_rtp_siren_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_RTP_SIREN_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpsirenpay.c b/gst/rtp/gstrtpsirenpay.c new file mode 100644 index 0000000..e878d4f --- /dev/null +++ b/gst/rtp/gstrtpsirenpay.c @@ -0,0 +1,152 @@ +/* + * Siren Payloader Gst Element + * + * @author: Youness Alaoui + * + * 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 "gstrtpsirenpay.h" +#include + +GST_DEBUG_CATEGORY_STATIC (rtpsirenpay_debug); +#define GST_CAT_DEFAULT (rtpsirenpay_debug) + +static GstStaticPadTemplate gst_rtp_siren_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-siren, " "dct-length = (int) 320") + ); + +static GstStaticPadTemplate gst_rtp_siren_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 16000, " + "encoding-name = (string) \"SIREN\", " + "bitrate = (string) \"16000\", " "dct-length = (int) 320") + ); + +static gboolean gst_rtp_siren_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); + +GST_BOILERPLATE (GstRTPSirenPay, gst_rtp_siren_pay, GstBaseRTPAudioPayload, + GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); + +static void +gst_rtp_siren_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_siren_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_siren_pay_src_template); + gst_element_class_set_details_simple (element_class, + "RTP Payloader for Siren Audio", "Codec/Payloader/Network/RTP", + "Packetize Siren audio streams into RTP packets", + "Youness Alaoui "); +} + +static void +gst_rtp_siren_pay_class_init (GstRTPSirenPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_siren_pay_setcaps; + + GST_DEBUG_CATEGORY_INIT (rtpsirenpay_debug, "rtpsirenpay", 0, + "siren audio RTP payloader"); +} + +static void +gst_rtp_siren_pay_init (GstRTPSirenPay * rtpsirenpay, + GstRTPSirenPayClass * klass) +{ + GstBaseRTPPayload *basertppayload; + GstBaseRTPAudioPayload *basertpaudiopayload; + + basertppayload = GST_BASE_RTP_PAYLOAD (rtpsirenpay); + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpsirenpay); + + /* we don't set the payload type, it should be set by the application using + * the pt property or the default 96 will be used */ + basertppayload->clock_rate = 16000; + + /* tell basertpaudiopayload that this is a frame based codec */ + gst_base_rtp_audio_payload_set_frame_based (basertpaudiopayload); +} + +static gboolean +gst_rtp_siren_pay_setcaps (GstBaseRTPPayload * basertppayload, GstCaps * caps) +{ + GstRTPSirenPay *rtpsirenpay; + GstBaseRTPAudioPayload *basertpaudiopayload; + gint dct_length; + GstStructure *structure; + const char *payload_name; + + rtpsirenpay = GST_RTP_SIREN_PAY (basertppayload); + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basertppayload); + + structure = gst_caps_get_structure (caps, 0); + + gst_structure_get_int (structure, "dct-length", &dct_length); + if (dct_length != 320) + goto wrong_dct; + + payload_name = gst_structure_get_name (structure); + if (g_ascii_strcasecmp ("audio/x-siren", payload_name)) + goto wrong_caps; + + gst_basertppayload_set_options (basertppayload, "audio", TRUE, "SIREN", + 16000); + /* set options for this frame based audio codec */ + gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, 20, 40); + + return gst_basertppayload_set_outcaps (basertppayload, NULL); + + /* ERRORS */ +wrong_dct: + { + GST_ERROR_OBJECT (rtpsirenpay, "dct-length must be 320, received %d", + dct_length); + return FALSE; + } +wrong_caps: + { + GST_ERROR_OBJECT (rtpsirenpay, "expected audio/x-siren, received %s", + payload_name); + return FALSE; + } +} + +gboolean +gst_rtp_siren_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpsirenpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_SIREN_PAY); +} diff --git a/gst/rtp/gstrtpsirenpay.h b/gst/rtp/gstrtpsirenpay.h new file mode 100644 index 0000000..cb6625e --- /dev/null +++ b/gst/rtp/gstrtpsirenpay.h @@ -0,0 +1,57 @@ +/* + * Siren Payloader Gst Element + * + * @author: Youness Alaoui + * + * 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_RTP_SIREN_PAY_H__ +#define __GST_RTP_SIREN_PAY_H__ + +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_RTP_SIREN_PAY \ + (gst_rtp_siren_pay_get_type()) +#define GST_RTP_SIREN_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SIREN_PAY,GstRTPSirenPay)) +#define GST_RTP_SIREN_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SIREN_PAY,GstRTPSirenPayClass)) +#define GST_IS_RTP_SIREN_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SIREN_PAY)) +#define GST_IS_RTP_SIREN_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SIREN_PAY)) +typedef struct _GstRTPSirenPay GstRTPSirenPay; +typedef struct _GstRTPSirenPayClass GstRTPSirenPayClass; + +struct _GstRTPSirenPay +{ + GstBaseRTPAudioPayload audiopayload; +}; + +struct _GstRTPSirenPayClass +{ + GstBaseRTPAudioPayloadClass parent_class; +}; + +GType gst_rtp_siren_pay_get_type (void); + +gboolean gst_rtp_siren_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_RTP_SIREN_PAY_H__ */ diff --git a/gst/rtp/gstrtpspeexdepay.c b/gst/rtp/gstrtpspeexdepay.c new file mode 100644 index 0000000..29903b9 --- /dev/null +++ b/gst/rtp/gstrtpspeexdepay.c @@ -0,0 +1,226 @@ +/* GStreamer + * Copyright (C) <2005> Edgard Lima + * + * 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 +#include +#include + +#include "gstrtpspeexdepay.h" + +/* RtpSPEEXDepay signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 +}; + +static GstStaticPadTemplate gst_rtp_speex_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [6000, 48000], " + "encoding-name = (string) \"SPEEX\", " + "encoding-params = (string) \"1\"") + ); + +static GstStaticPadTemplate gst_rtp_speex_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-speex") + ); + +static GstBuffer *gst_rtp_speex_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_speex_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); + +GST_BOILERPLATE (GstRtpSPEEXDepay, gst_rtp_speex_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void +gst_rtp_speex_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_speex_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_speex_depay_sink_template); + gst_element_class_set_details_simple (element_class, "RTP Speex depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts Speex audio from RTP packets", + "Edgard Lima "); +} + +static void +gst_rtp_speex_depay_class_init (GstRtpSPEEXDepayClass * klass) +{ + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_speex_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_speex_depay_setcaps; +} + +static void +gst_rtp_speex_depay_init (GstRtpSPEEXDepay * rtpspeexdepay, + GstRtpSPEEXDepayClass * klass) +{ +} + +static gint +gst_rtp_speex_depay_get_mode (gint rate) +{ + if (rate > 25000) + return 2; + else if (rate > 12500) + return 1; + else + return 0; +} + +/* len 4 bytes LE, + * vendor string (len bytes), + * user_len 4 (0) bytes LE + */ +static const gchar gst_rtp_speex_comment[] = + "\045\0\0\0Depayloaded with GStreamer speexdepay\0\0\0\0"; + +static gboolean +gst_rtp_speex_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpSPEEXDepay *rtpspeexdepay; + gint clock_rate, nb_channels; + GstBuffer *buf; + guint8 *data; + const gchar *params; + GstCaps *srccaps; + gboolean res; + + rtpspeexdepay = GST_RTP_SPEEX_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + goto no_clockrate; + depayload->clock_rate = clock_rate; + + if (!(params = gst_structure_get_string (structure, "encoding-params"))) + nb_channels = 1; + else { + nb_channels = atoi (params); + } + + /* construct minimal header and comment packet for the decoder */ + buf = gst_buffer_new_and_alloc (80); + data = GST_BUFFER_DATA (buf); + memcpy (data, "Speex ", 8); + data += 8; + memcpy (data, "1.1.12", 7); + data += 20; + GST_WRITE_UINT32_LE (data, 1); /* version */ + data += 4; + GST_WRITE_UINT32_LE (data, 80); /* header_size */ + data += 4; + GST_WRITE_UINT32_LE (data, clock_rate); /* rate */ + data += 4; + GST_WRITE_UINT32_LE (data, gst_rtp_speex_depay_get_mode (clock_rate)); /* mode */ + data += 4; + GST_WRITE_UINT32_LE (data, 4); /* mode_bitstream_version */ + data += 4; + GST_WRITE_UINT32_LE (data, nb_channels); /* nb_channels */ + data += 4; + GST_WRITE_UINT32_LE (data, -1); /* bitrate */ + data += 4; + GST_WRITE_UINT32_LE (data, 0xa0); /* frame_size */ + data += 4; + GST_WRITE_UINT32_LE (data, 0); /* VBR */ + data += 4; + GST_WRITE_UINT32_LE (data, 1); /* frames_per_packet */ + data += 4; + GST_WRITE_UINT32_LE (data, 0); /* extra_headers */ + data += 4; + GST_WRITE_UINT32_LE (data, 0); /* reserved1 */ + data += 4; + GST_WRITE_UINT32_LE (data, 0); /* reserved2 */ + + srccaps = gst_caps_new_simple ("audio/x-speex", NULL); + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpspeexdepay), buf); + + buf = gst_buffer_new_and_alloc (sizeof (gst_rtp_speex_comment)); + memcpy (GST_BUFFER_DATA (buf), gst_rtp_speex_comment, + sizeof (gst_rtp_speex_comment)); + + gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpspeexdepay), buf); + + return res; + + /* ERRORS */ +no_clockrate: + { + GST_DEBUG_OBJECT (depayload, "no clock-rate specified"); + return FALSE; + } +} + +static GstBuffer * +gst_rtp_speex_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstBuffer *outbuf = NULL; + + GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", + GST_BUFFER_SIZE (buf), + gst_rtp_buffer_get_marker (buf), + gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); + + /* nothing special to be done */ + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + + if (outbuf) + GST_BUFFER_DURATION (outbuf) = 20 * GST_MSECOND; + + return outbuf; +} + +gboolean +gst_rtp_speex_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpspeexdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_SPEEX_DEPAY); +} diff --git a/gst/rtp/gstrtpspeexdepay.h b/gst/rtp/gstrtpspeexdepay.h new file mode 100644 index 0000000..07b727f --- /dev/null +++ b/gst/rtp/gstrtpspeexdepay.h @@ -0,0 +1,53 @@ +/* GStreamer + * Copyright (C) <2005> Edgard Lima + * + * 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 + */ + +#ifndef __GST_RTP_SPEEX_DEPAY_H__ +#define __GST_RTP_SPEEX_DEPAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpSPEEXDepay GstRtpSPEEXDepay; +typedef struct _GstRtpSPEEXDepayClass GstRtpSPEEXDepayClass; + +#define GST_TYPE_RTP_SPEEX_DEPAY \ + (gst_rtp_speex_depay_get_type()) +#define GST_RTP_SPEEX_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SPEEX_DEPAY,GstRtpSPEEXDepay)) +#define GST_RTP_SPEEX_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SPEEX_DEPAY,GstRtpSPEEXDepayClass)) +#define GST_IS_RTP_SPEEX_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SPEEX_DEPAY)) +#define GST_IS_RTP_SPEEX_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SPEEX_DEPAY)) + +struct _GstRtpSPEEXDepay +{ + GstBaseRTPDepayload depayload; +}; + +struct _GstRtpSPEEXDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_speex_depay_get_type (void); + +gboolean gst_rtp_speex_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_SPEEX_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpspeexpay.c b/gst/rtp/gstrtpspeexpay.c new file mode 100644 index 0000000..bc69fb0 --- /dev/null +++ b/gst/rtp/gstrtpspeexpay.c @@ -0,0 +1,341 @@ +/* GStreamer + * Copyright (C) <2005> Edgard Lima + * + * 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 +#include +#include + +#include "gstrtpspeexpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpspeexpay_debug); +#define GST_CAT_DEFAULT (rtpspeexpay_debug) + +static GstStaticPadTemplate gst_rtp_speex_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-speex, " + "rate = (int) [ 6000, 48000 ], " "channels = (int) 1") + ); + +static GstStaticPadTemplate gst_rtp_speex_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [ 6000, 48000 ], " + "encoding-name = (string) \"SPEEX\", " + "encoding-params = (string) \"1\"") + ); + +static GstStateChangeReturn gst_rtp_speex_pay_change_state (GstElement * + element, GstStateChange transition); + +static gboolean gst_rtp_speex_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstCaps *gst_rtp_speex_pay_getcaps (GstBaseRTPPayload * payload, + GstPad * pad); +static GstFlowReturn gst_rtp_speex_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpSPEEXPay, gst_rtp_speex_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static void +gst_rtp_speex_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_speex_pay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_speex_pay_src_template); + gst_element_class_set_details_simple (element_class, "RTP Speex payloader", + "Codec/Payloader/Network/RTP", + "Payload-encodes Speex audio into a RTP packet", + "Edgard Lima "); + + GST_DEBUG_CATEGORY_INIT (rtpspeexpay_debug, "rtpspeexpay", 0, + "Speex RTP Payloader"); +} + +static void +gst_rtp_speex_pay_class_init (GstRtpSPEEXPayClass * klass) +{ + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstelement_class->change_state = gst_rtp_speex_pay_change_state; + + gstbasertppayload_class->set_caps = gst_rtp_speex_pay_setcaps; + gstbasertppayload_class->get_caps = gst_rtp_speex_pay_getcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_speex_pay_handle_buffer; +} + +static void +gst_rtp_speex_pay_init (GstRtpSPEEXPay * rtpspeexpay, + GstRtpSPEEXPayClass * klass) +{ + GST_BASE_RTP_PAYLOAD (rtpspeexpay)->clock_rate = 8000; + GST_BASE_RTP_PAYLOAD_PT (rtpspeexpay) = 110; /* Create String */ +} + +static gboolean +gst_rtp_speex_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + /* don't configure yet, we wait for the ident packet */ + return TRUE; +} + + +static GstCaps * +gst_rtp_speex_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad) +{ + GstCaps *otherpadcaps; + GstCaps *caps; + + otherpadcaps = gst_pad_get_allowed_caps (payload->srcpad); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + + if (otherpadcaps) { + if (!gst_caps_is_empty (otherpadcaps)) { + GstStructure *ps = gst_caps_get_structure (otherpadcaps, 0); + GstStructure *s = gst_caps_get_structure (caps, 0); + gint clock_rate; + + if (gst_structure_get_int (ps, "clock-rate", &clock_rate)) { + gst_structure_fixate_field_nearest_int (s, "rate", clock_rate); + } + } + gst_caps_unref (otherpadcaps); + } + + return caps; +} + +static gboolean +gst_rtp_speex_pay_parse_ident (GstRtpSPEEXPay * rtpspeexpay, + const guint8 * data, guint size) +{ + guint32 version, header_size, rate, mode, nb_channels; + GstBaseRTPPayload *payload; + gchar *cstr; + gboolean res; + + /* we need the header string (8), the version string (20), the version + * and the header length. */ + if (size < 36) + goto too_small; + + if (!g_str_has_prefix ((const gchar *) data, "Speex ")) + goto wrong_header; + + /* skip header and version string */ + data += 28; + + version = GST_READ_UINT32_LE (data); + if (version != 1) + goto wrong_version; + + data += 4; + /* ensure sizes */ + header_size = GST_READ_UINT32_LE (data); + if (header_size < 80) + goto header_too_small; + + if (size < header_size) + goto payload_too_small; + + data += 4; + rate = GST_READ_UINT32_LE (data); + data += 4; + mode = GST_READ_UINT32_LE (data); + data += 8; + nb_channels = GST_READ_UINT32_LE (data); + + GST_DEBUG_OBJECT (rtpspeexpay, "rate %d, mode %d, nb_channels %d", + rate, mode, nb_channels); + + payload = GST_BASE_RTP_PAYLOAD (rtpspeexpay); + + gst_basertppayload_set_options (payload, "audio", FALSE, "SPEEX", rate); + cstr = g_strdup_printf ("%d", nb_channels); + res = gst_basertppayload_set_outcaps (payload, "encoding-params", + G_TYPE_STRING, cstr, NULL); + g_free (cstr); + + return res; + + /* ERRORS */ +too_small: + { + GST_DEBUG_OBJECT (rtpspeexpay, + "ident packet too small, need at least 32 bytes"); + return FALSE; + } +wrong_header: + { + GST_DEBUG_OBJECT (rtpspeexpay, + "ident packet does not start with \"Speex \""); + return FALSE; + } +wrong_version: + { + GST_DEBUG_OBJECT (rtpspeexpay, "can only handle version 1, have version %d", + version); + return FALSE; + } +header_too_small: + { + GST_DEBUG_OBJECT (rtpspeexpay, + "header size too small, need at least 80 bytes, " "got only %d", + header_size); + return FALSE; + } +payload_too_small: + { + GST_DEBUG_OBJECT (rtpspeexpay, + "payload too small, need at least %d bytes, got only %d", header_size, + size); + return FALSE; + } +} + +static GstFlowReturn +gst_rtp_speex_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpSPEEXPay *rtpspeexpay; + guint size, payload_len; + GstBuffer *outbuf; + guint8 *payload, *data; + GstClockTime timestamp, duration; + GstFlowReturn ret; + + rtpspeexpay = GST_RTP_SPEEX_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + + switch (rtpspeexpay->packet) { + case 0: + /* ident packet. We need to parse the headers to construct the RTP + * properties. */ + if (!gst_rtp_speex_pay_parse_ident (rtpspeexpay, data, size)) + goto parse_error; + + ret = GST_FLOW_OK; + goto done; + case 1: + /* comment packet, we ignore it */ + ret = GST_FLOW_OK; + goto done; + default: + /* other packets go in the payload */ + break; + } + + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_GAP)) { + ret = GST_FLOW_OK; + goto done; + } + + timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); + + /* FIXME, only one SPEEX frame per RTP packet for now */ + payload_len = size; + + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + /* FIXME, assert for now */ + g_assert (payload_len <= GST_BASE_RTP_PAYLOAD_MTU (rtpspeexpay)); + + /* copy timestamp and duration */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = duration; + + /* get payload */ + payload = gst_rtp_buffer_get_payload (outbuf); + + /* copy data in payload */ + memcpy (&payload[0], data, size); + + ret = gst_basertppayload_push (basepayload, outbuf); + +done: + gst_buffer_unref (buffer); + + rtpspeexpay->packet++; + + return ret; + + /* ERRORS */ +parse_error: + { + GST_ELEMENT_ERROR (rtpspeexpay, STREAM, DECODE, (NULL), + ("Error parsing first identification packet.")); + gst_buffer_unref (buffer); + return GST_FLOW_ERROR; + } +} + +static GstStateChangeReturn +gst_rtp_speex_pay_change_state (GstElement * element, GstStateChange transition) +{ + GstRtpSPEEXPay *rtpspeexpay; + GstStateChangeReturn ret; + + rtpspeexpay = GST_RTP_SPEEX_PAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + rtpspeexpay->packet = 0; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_speex_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpspeexpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_SPEEX_PAY); +} diff --git a/gst/rtp/gstrtpspeexpay.h b/gst/rtp/gstrtpspeexpay.h new file mode 100644 index 0000000..f43986a --- /dev/null +++ b/gst/rtp/gstrtpspeexpay.h @@ -0,0 +1,56 @@ +/* GStreamer + * Copyright (C) <2005> Edgard Lima + * + * 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 + */ + + +#ifndef __GST_RTP_SPEEX_PAY_H__ +#define __GST_RTP_SPEEX_PAY_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstRtpSPEEXPay GstRtpSPEEXPay; +typedef struct _GstRtpSPEEXPayClass GstRtpSPEEXPayClass; + +#define GST_TYPE_RTP_SPEEX_PAY \ + (gst_rtp_speex_pay_get_type()) +#define GST_RTP_SPEEX_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SPEEX_PAY,GstRtpSPEEXPay)) +#define GST_RTP_SPEEX_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SPEEX_PAY,GstRtpSPEEXPayClass)) +#define GST_IS_RTP_SPEEX_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SPEEX_PAY)) +#define GST_IS_RTP_SPEEX_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SPEEX_PAY)) + +struct _GstRtpSPEEXPay +{ + GstBaseRTPPayload payload; + + guint64 packet; +}; + +struct _GstRtpSPEEXPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_speex_pay_get_type (void); + +gboolean gst_rtp_speex_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_SPEEX_PAY_H__ */ diff --git a/gst/rtp/gstrtpsv3vdepay.c b/gst/rtp/gstrtpsv3vdepay.c new file mode 100644 index 0000000..b29fe02 --- /dev/null +++ b/gst/rtp/gstrtpsv3vdepay.c @@ -0,0 +1,324 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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 + +#include +#include "gstrtpsv3vdepay.h" + +GST_DEBUG_CATEGORY (rtpsv3vdepay_debug); +#define GST_CAT_DEFAULT rtpsv3vdepay_debug + +static GstStaticPadTemplate gst_rtp_sv3v_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-svq, " "svqversion = (int) 3") + ); + +static GstStaticPadTemplate gst_rtp_sv3v_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " + "encoding-name = (string) { \"X-SV3V-ES\", \"X-SORENSON-VIDEO\" , \"X-SORENSONVIDEO\" , \"X-SorensonVideo\" }") + ); + +GST_BOILERPLATE (GstRtpSV3VDepay, gst_rtp_sv3v_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static void gst_rtp_sv3v_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_sv3v_depay_change_state (GstElement * + element, GstStateChange transition); + +static GstBuffer *gst_rtp_sv3v_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +gboolean gst_rtp_sv3v_depay_setcaps (GstBaseRTPDepayload * filter, + GstCaps * caps); + +static void +gst_rtp_sv3v_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_sv3v_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_sv3v_depay_sink_template); + + + gst_element_class_set_details_simple (element_class, "RTP SVQ3 depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts SVQ3 video from RTP packets (no RFC)", + "Wim Taymans "); +} + +static void +gst_rtp_sv3v_depay_class_init (GstRtpSV3VDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstbasertpdepayload_class->process = gst_rtp_sv3v_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_sv3v_depay_setcaps; + + gobject_class->finalize = gst_rtp_sv3v_depay_finalize; + + gstelement_class->change_state = gst_rtp_sv3v_depay_change_state; +} + +static void +gst_rtp_sv3v_depay_init (GstRtpSV3VDepay * rtpsv3vdepay, + GstRtpSV3VDepayClass * klass) +{ + rtpsv3vdepay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_sv3v_depay_finalize (GObject * object) +{ + GstRtpSV3VDepay *rtpsv3vdepay; + + rtpsv3vdepay = GST_RTP_SV3V_DEPAY (object); + + g_object_unref (rtpsv3vdepay->adapter); + rtpsv3vdepay->adapter = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +// only on the sink +gboolean +gst_rtp_sv3v_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) +{ + GstStructure *structure = gst_caps_get_structure (caps, 0); + gint clock_rate; + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; // default + filter->clock_rate = clock_rate; + + /* will set caps later */ + + return TRUE; +} + +static GstBuffer * +gst_rtp_sv3v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpSV3VDepay *rtpsv3vdepay; + static struct + { + guint width, height; + } resolutions[7] = { + { + 160, 128}, { + 128, 96}, { + 176, 144}, { + 352, 288}, { + 704, 576}, { + 240, 180}, { + 320, 240} + }; + gint payload_len; + guint8 *payload; + gboolean M; + gboolean C, S, E; + GstBuffer *outbuf = NULL; + guint16 seq; + + rtpsv3vdepay = GST_RTP_SV3V_DEPAY (depayload); + + /* flush on sequence number gaps */ + seq = gst_rtp_buffer_get_seq (buf); + + GST_DEBUG ("timestamp %" GST_TIME_FORMAT ", sequence number:%d", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), seq); + + if (seq != rtpsv3vdepay->nextseq) { + GST_DEBUG ("Sequence discontinuity, clearing adapter"); + gst_adapter_clear (rtpsv3vdepay->adapter); + } + rtpsv3vdepay->nextseq = seq + 1; + + payload_len = gst_rtp_buffer_get_payload_len (buf); + if (payload_len < 3) + goto bad_packet; + + payload = gst_rtp_buffer_get_payload (buf); + + M = gst_rtp_buffer_get_marker (buf); + + /* This is all a guess: + * 1 1 1 1 1 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |0|C|S|E|0|0|0|0|0|0|0|0|0|0|0|0| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * C: config, packet contains config info + * S: start, packet contains start of frame + * E: end, packet contains end of frame + */ + /* this seems to indicate a packet with a config string sent before each + * keyframe */ + C = (payload[0] & 0x40) == 0x40; + + /* redundant with the RTP marker bit */ + S = (payload[0] & 0x20) == 0x20; + E = (payload[0] & 0x10) == 0x10; + + GST_DEBUG ("M:%d, C:%d, S:%d, E:%d", M, C, S, E); + + GST_MEMDUMP ("incoming buffer", payload, payload_len); + + if (G_UNLIKELY (C)) { + GstCaps *caps; + GstBuffer *codec_data; + guint8 res; + + GST_DEBUG ("Configuration packet"); + + /* if we already have caps, we don't need to do anything. FIXME, check if + * something changed. */ + if (G_UNLIKELY (GST_PAD_CAPS (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)))) { + GST_DEBUG ("Already configured, skipping config parsing"); + goto beach; + } + + res = payload[2] >> 5; + + /* width and height, according to http://wiki.multimedia.cx/index.php?title=Sorenson_Video_1#Stream_Format_And_Header */ + if (G_LIKELY (res < 7)) { + rtpsv3vdepay->width = resolutions[res].width; + rtpsv3vdepay->height = resolutions[res].height; + } else { + /* extended width/height, they're contained in the following 24bit */ + rtpsv3vdepay->width = ((payload[2] & 0x1f) << 7) | (payload[3] >> 1); + rtpsv3vdepay->height = + (payload[3] & 0x1) << 11 | payload[4] << 3 | (payload[5] >> 5); + } + + /* CodecData needs to be 'SEQH' + len (32bit) + data according to + * ffmpeg's libavcodec/svq3.c:svq3_decode_init */ + codec_data = gst_buffer_new_and_alloc (payload_len + 6); + memcpy (GST_BUFFER_DATA (codec_data), "SEQH", 4); + GST_WRITE_UINT32_LE (GST_BUFFER_DATA (codec_data) + 4, payload_len - 2); + memcpy (GST_BUFFER_DATA (codec_data) + 8, payload + 2, payload_len - 2); + + GST_MEMDUMP ("codec_data", GST_BUFFER_DATA (codec_data), + GST_BUFFER_SIZE (codec_data)); + + caps = gst_caps_new_simple ("video/x-svq", + "svqversion", G_TYPE_INT, 3, + "width", G_TYPE_INT, rtpsv3vdepay->width, + "height", G_TYPE_INT, rtpsv3vdepay->height, + "codec_data", GST_TYPE_BUFFER, codec_data, NULL); + gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), caps); + gst_caps_unref (caps); + + GST_DEBUG ("Depayloader now configured"); + + rtpsv3vdepay->configured = TRUE; + + goto beach; + } + + if (G_LIKELY (rtpsv3vdepay->configured)) { + GstBuffer *tmpbuf; + + GST_DEBUG ("Storing incoming payload"); + /* store data in adapter, stip off 2 bytes header */ + tmpbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 2, -1); + gst_adapter_push (rtpsv3vdepay->adapter, tmpbuf); + + if (G_UNLIKELY (M)) { + /* frame is completed: push contents of adapter */ + guint avail; + + avail = gst_adapter_available (rtpsv3vdepay->adapter); + GST_DEBUG ("Returning completed output buffer [%d bytes]", avail); + outbuf = gst_adapter_take_buffer (rtpsv3vdepay->adapter, avail); + } + } + +beach: + return outbuf; + + /* ERRORS */ +bad_packet: + { + GST_ELEMENT_WARNING (rtpsv3vdepay, STREAM, DECODE, + (NULL), ("Packet was too short")); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_sv3v_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpSV3VDepay *rtpsv3vdepay; + GstStateChangeReturn ret; + + rtpsv3vdepay = GST_RTP_SV3V_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_adapter_clear (rtpsv3vdepay->adapter); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_sv3v_depay_plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (rtpsv3vdepay_debug, "rtpsv3vdepay", 0, + "RTP SV3V depayloader"); + + return gst_element_register (plugin, "rtpsv3vdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_SV3V_DEPAY); +} diff --git a/gst/rtp/gstrtpsv3vdepay.h b/gst/rtp/gstrtpsv3vdepay.h new file mode 100644 index 0000000..7c55afd --- /dev/null +++ b/gst/rtp/gstrtpsv3vdepay.h @@ -0,0 +1,67 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_SV3V_DEPAY_H__ +#define __GST_RTP_SV3V_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_SV3V_DEPAY \ + (gst_rtp_sv3v_depay_get_type()) +#define GST_RTP_SV3V_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SV3V_DEPAY,GstRtpSV3VDepay)) +#define GST_RTP_SV3V_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SV3V_DEPAY,GstRtpSV3VDepayClass)) +#define GST_IS_RTP_SV3V_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SV3V_DEPAY)) +#define GST_IS_RTP_SV3V_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SV3V_DEPAY)) + +typedef struct _GstRtpSV3VDepay GstRtpSV3VDepay; +typedef struct _GstRtpSV3VDepayClass GstRtpSV3VDepayClass; + +struct _GstRtpSV3VDepay +{ + GstBaseRTPDepayload depayload; + + GstAdapter *adapter; + + gboolean configured; + + guint16 nextseq; + guint width; + guint height; +}; + +struct _GstRtpSV3VDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_sv3v_depay_get_type (void); + +gboolean gst_rtp_sv3v_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_SV3V_DEPAY_H__ */ diff --git a/gst/rtp/gstrtptheoradepay.c b/gst/rtp/gstrtptheoradepay.c new file mode 100644 index 0000000..1e38262 --- /dev/null +++ b/gst/rtp/gstrtptheoradepay.c @@ -0,0 +1,666 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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 +#include + +#include +#include "gstrtptheoradepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtptheoradepay_debug); +#define GST_CAT_DEFAULT (rtptheoradepay_debug) + +static GstStaticPadTemplate gst_rtp_theora_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"THEORA\"" + /* All required parameters + * + * "sampling = (string) { "YCbCr-4:2:0", "YCbCr-4:2:2", "YCbCr-4:4:4" } " + * "width = (string) [1, 1048561] (multiples of 16) " + * "height = (string) [1, 1048561] (multiples of 16) " + * "delivery-method = (string) { inline, in_band, out_band/ } " + * "configuration = (string) ANY" + */ + /* All optional parameters + * + * "configuration-uri =" + */ + ) + ); + +static GstStaticPadTemplate gst_rtp_theora_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-theora") + ); + +GST_BOILERPLATE (GstRtpTheoraDepay, gst_rtp_theora_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_theora_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_theora_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); +static gboolean gst_rtp_theora_depay_packet_lost (GstBaseRTPDepayload * + depayload, GstEvent * event); + +static void gst_rtp_theora_depay_finalize (GObject * object); + + +static void +gst_rtp_theora_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_theora_depay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_theora_depay_src_template); + + gst_element_class_set_details_simple (element_class, "RTP Theora depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts Theora video from RTP packets (draft-01 of RFC XXXX)", + "Wim Taymans "); +} + +static void +gst_rtp_theora_depay_class_init (GstRtpTheoraDepayClass * klass) +{ + GObjectClass *gobject_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_theora_depay_finalize; + + gstbasertpdepayload_class->process = gst_rtp_theora_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_theora_depay_setcaps; + gstbasertpdepayload_class->packet_lost = gst_rtp_theora_depay_packet_lost; + + GST_DEBUG_CATEGORY_INIT (rtptheoradepay_debug, "rtptheoradepay", 0, + "Theora RTP Depayloader"); +} + +static void +gst_rtp_theora_depay_init (GstRtpTheoraDepay * rtptheoradepay, + GstRtpTheoraDepayClass * klass) +{ + rtptheoradepay->adapter = gst_adapter_new (); +} + +static void +gst_rtp_theora_depay_finalize (GObject * object) +{ + GstRtpTheoraDepay *rtptheoradepay = GST_RTP_THEORA_DEPAY (object); + + g_object_unref (rtptheoradepay->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_theora_depay_parse_configuration (GstRtpTheoraDepay * rtptheoradepay, + GstBuffer * confbuf) +{ + GstBuffer *buf; + guint32 num_headers; + guint8 *data; + guint size; + gint i, j; + + data = GST_BUFFER_DATA (confbuf); + size = GST_BUFFER_SIZE (confbuf); + + GST_DEBUG_OBJECT (rtptheoradepay, "config size %u", size); + + /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Number of packed headers | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Packed header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Packed header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | .... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + if (size < 4) + goto too_small; + + num_headers = GST_READ_UINT32_BE (data); + size -= 4; + data += 4; + + GST_DEBUG_OBJECT (rtptheoradepay, "have %u headers", num_headers); + + /* 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Ident | length .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | n. of headers | length1 | length2 .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | Identification Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | Comment Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. Comment Header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Setup Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. Setup Header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + for (i = 0; i < num_headers; i++) { + guint32 ident; + guint16 length; + guint8 n_headers, b; + GstRtpTheoraConfig *conf; + guint *h_sizes; + guint extra = 1; + + if (size < 6) + goto too_small; + + ident = (data[0] << 16) | (data[1] << 8) | data[2]; + length = (data[3] << 8) | data[4]; + n_headers = data[5]; + size -= 6; + data += 6; + + GST_DEBUG_OBJECT (rtptheoradepay, + "header %d, ident 0x%08x, length %u, left %u", i, ident, length, size); + + /* FIXME check if we already got this ident */ + + /* length might also include count of following size fields */ + if (size < length && size + 1 != length) + goto too_small; + + /* read header sizes we read 2 sizes, the third size (for which we allocate + * space) must be derived from the total packed header length. */ + h_sizes = g_newa (guint, n_headers + 1); + for (j = 0; j < n_headers; j++) { + guint h_size; + + h_size = 0; + do { + if (size < 1) + goto too_small; + b = *data++; + size--; + extra++; + h_size = (h_size << 7) | (b & 0x7f); + } while (b & 0x80); + GST_DEBUG_OBJECT (rtptheoradepay, "headers %d: size: %u", j, h_size); + h_sizes[j] = h_size; + length -= h_size; + } + /* last header length is the remaining space */ + GST_DEBUG_OBJECT (rtptheoradepay, "last header size: %u", length); + h_sizes[j] = length; + + GST_DEBUG_OBJECT (rtptheoradepay, "preparing headers"); + conf = g_new0 (GstRtpTheoraConfig, 1); + conf->ident = ident; + + for (j = 0; j <= n_headers; j++) { + guint h_size; + + h_size = h_sizes[j]; + if (size < h_size) { + if (j != n_headers || size + extra != h_size) { + goto too_small; + } else { + /* otherwise means that overall length field contained total length, + * including extra fields */ + h_size -= extra; + } + } + + GST_DEBUG_OBJECT (rtptheoradepay, "reading header %d, size %u", j, + h_size); + + buf = gst_buffer_new_and_alloc (h_size); + memcpy (GST_BUFFER_DATA (buf), data, h_size); + conf->headers = g_list_append (conf->headers, buf); + data += h_size; + size -= h_size; + } + rtptheoradepay->configs = g_list_append (rtptheoradepay->configs, conf); + } + return TRUE; + + /* ERRORS */ +too_small: + { + GST_DEBUG_OBJECT (rtptheoradepay, "configuration too small"); + return FALSE; + } +} + +static gboolean +gst_rtp_theora_depay_parse_inband_configuration (GstRtpTheoraDepay * + rtptheoradepay, guint ident, guint8 * configuration, guint size, + guint length) +{ + GstBuffer *confbuf; + guint8 *conf; + + if (G_UNLIKELY (size < 4)) + return FALSE; + + /* transform inline to out-of-band and parse that one */ + confbuf = gst_buffer_new_and_alloc (size + 9); + conf = GST_BUFFER_DATA (confbuf); + /* 1 header */ + GST_WRITE_UINT32_BE (conf, 1); + /* write Ident */ + GST_WRITE_UINT24_BE (conf + 4, ident); + /* write sort-of-length */ + GST_WRITE_UINT16_BE (conf + 7, length); + /* copy remainder */ + memcpy (conf + 9, configuration, size); + + return gst_rtp_theora_depay_parse_configuration (rtptheoradepay, confbuf); +} + +static gboolean +gst_rtp_theora_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpTheoraDepay *rtptheoradepay; + GstCaps *srccaps; + const gchar *configuration; + gboolean res; + + rtptheoradepay = GST_RTP_THEORA_DEPAY (depayload); + + rtptheoradepay->needs_keyframe = FALSE; + + structure = gst_caps_get_structure (caps, 0); + + /* read and parse configuration string */ + configuration = gst_structure_get_string (structure, "configuration"); + if (configuration) { + GstBuffer *confbuf; + guint8 *data; + gsize size; + + /* configure string should be in the caps */ + if (configuration == NULL) + goto no_configuration; + + /* deserialize base64 to buffer */ + data = g_base64_decode (configuration, &size); + + confbuf = gst_buffer_new (); + GST_BUFFER_DATA (confbuf) = data; + GST_BUFFER_MALLOCDATA (confbuf) = data; + GST_BUFFER_SIZE (confbuf) = size; + + if (!gst_rtp_theora_depay_parse_configuration (rtptheoradepay, confbuf)) + goto invalid_configuration; + } + + /* set caps on pad and on header */ + srccaps = gst_caps_new_simple ("video/x-theora", NULL); + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + /* Clock rate is always 90000 according to draft-barbato-avt-rtp-theora-01 */ + depayload->clock_rate = 90000; + + return res; + + /* ERRORS */ +no_configuration: + { + GST_ERROR_OBJECT (rtptheoradepay, "no configuration specified"); + return FALSE; + } +invalid_configuration: + { + GST_ERROR_OBJECT (rtptheoradepay, "invalid configuration specified"); + return FALSE; + } +} + +static gboolean +gst_rtp_theora_depay_switch_codebook (GstRtpTheoraDepay * rtptheoradepay, + guint32 ident) +{ + GList *walk; + gboolean res = FALSE; + + for (walk = rtptheoradepay->configs; walk; walk = g_list_next (walk)) { + GstRtpTheoraConfig *conf = (GstRtpTheoraConfig *) walk->data; + + if (conf->ident == ident) { + GList *headers; + + /* FIXME, remove pads, create new pad.. */ + + /* push out all the headers */ + for (headers = conf->headers; headers; headers = g_list_next (headers)) { + GstBuffer *header = GST_BUFFER_CAST (headers->data); + + gst_buffer_ref (header); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtptheoradepay), + header); + } + /* remember the current config */ + rtptheoradepay->config = conf; + res = TRUE; + } + } + if (!res) { + /* we don't know about the headers, figure out an alternative method for + * getting the codebooks. FIXME, fail for now. */ + } + return res; +} + +static GstBuffer * +gst_rtp_theora_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpTheoraDepay *rtptheoradepay; + GstBuffer *outbuf; + GstFlowReturn ret; + gint payload_len; + guint8 *payload, *to_free = NULL; + guint32 timestamp; + guint32 header, ident; + guint8 F, TDT, packets; + + rtptheoradepay = GST_RTP_THEORA_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + GST_DEBUG_OBJECT (depayload, "got RTP packet of size %d", payload_len); + + /* we need at least 4 bytes for the packet header */ + if (G_UNLIKELY (payload_len < 4)) + goto packet_short; + + payload = gst_rtp_buffer_get_payload (buf); + + header = GST_READ_UINT32_BE (payload); + /* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Ident | F |TDT|# pkts.| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * F: Fragment type (0=none, 1=start, 2=cont, 3=end) + * TDT: Theora data type (0=theora, 1=config, 2=comment, 3=reserved) + * pkts: number of packets. + */ + TDT = (header & 0x30) >> 4; + if (G_UNLIKELY (TDT == 3)) + goto ignore_reserved; + + ident = (header >> 8) & 0xffffff; + F = (header & 0xc0) >> 6; + packets = (header & 0xf); + + GST_DEBUG_OBJECT (depayload, "ident: 0x%08x, F: %d, TDT: %d, packets: %d", + ident, F, TDT, packets); + + if (TDT == 0) { + gboolean do_switch = FALSE; + + /* we have a raw payload, find the codebook for the ident */ + if (!rtptheoradepay->config) { + /* we don't have an active codebook, find the codebook and + * activate it */ + do_switch = TRUE; + } else if (rtptheoradepay->config->ident != ident) { + /* codebook changed */ + do_switch = TRUE; + } + if (do_switch) { + if (!gst_rtp_theora_depay_switch_codebook (rtptheoradepay, ident)) + goto switch_failed; + } + } + + /* skip header */ + payload += 4; + payload_len -= 4; + + /* fragmented packets, assemble */ + if (F != 0) { + GstBuffer *vdata; + guint headerskip; + + if (F == 1) { + /* if we start a packet, clear adapter and start assembling. */ + gst_adapter_clear (rtptheoradepay->adapter); + GST_DEBUG_OBJECT (depayload, "start assemble"); + rtptheoradepay->assembling = TRUE; + } + + if (!rtptheoradepay->assembling) + goto no_output; + + /* first assembled packet, reuse 2 bytes to store the length */ + headerskip = (F == 1 ? 4 : 6); + /* skip header and length. */ + vdata = gst_rtp_buffer_get_payload_subbuffer (buf, headerskip, -1); + + GST_DEBUG_OBJECT (depayload, "assemble theora packet"); + gst_adapter_push (rtptheoradepay->adapter, vdata); + + /* packet is not complete, we are done */ + if (F != 3) + goto no_output; + + /* construct assembled buffer */ + payload_len = gst_adapter_available (rtptheoradepay->adapter); + payload = gst_adapter_take (rtptheoradepay->adapter, payload_len); + /* fix the length */ + payload[0] = ((payload_len - 2) >> 8) & 0xff; + payload[1] = (payload_len - 2) & 0xff; + to_free = payload; + } + + GST_DEBUG_OBJECT (depayload, "assemble done, payload_len %d", payload_len); + + /* we not assembling anymore now */ + rtptheoradepay->assembling = FALSE; + gst_adapter_clear (rtptheoradepay->adapter); + + /* payload now points to a length with that many theora data bytes. + * Iterate over the packets and send them out. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | length | theora data .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. theora data | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | length | next theora packet data .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. theora data | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* + */ + timestamp = gst_rtp_buffer_get_timestamp (buf); + + while (payload_len >= 2) { + guint16 length; + + length = GST_READ_UINT16_BE (payload); + payload += 2; + payload_len -= 2; + + GST_DEBUG_OBJECT (depayload, "read length %u, avail: %d", length, + payload_len); + + /* skip packet if something odd happens */ + if (G_UNLIKELY (length > payload_len)) + goto length_short; + + /* handle in-band configuration */ + if (G_UNLIKELY (TDT == 1)) { + GST_DEBUG_OBJECT (rtptheoradepay, "in-band configuration"); + if (!gst_rtp_theora_depay_parse_inband_configuration (rtptheoradepay, + ident, payload, payload_len, length)) + goto invalid_configuration; + goto no_output; + } + + /* create buffer for packet */ + if (G_UNLIKELY (to_free)) { + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = payload; + GST_BUFFER_MALLOCDATA (outbuf) = to_free; + GST_BUFFER_SIZE (outbuf) = length; + to_free = NULL; + } else { + outbuf = gst_buffer_new_and_alloc (length); + memcpy (GST_BUFFER_DATA (outbuf), payload, length); + } + + if (payload_len > 0 && (payload[0] & 0xC0) == 0x0) + rtptheoradepay->needs_keyframe = FALSE; + + payload += length; + payload_len -= length; + + if (timestamp != -1) + /* push with timestamp of the last packet, which is the same timestamp that + * should apply to the first assembled packet. */ + ret = gst_base_rtp_depayload_push_ts (depayload, timestamp, outbuf); + else + ret = gst_base_rtp_depayload_push (depayload, outbuf); + + if (ret != GST_FLOW_OK) + break; + + /* make sure we don't set a timestamp on next buffers */ + timestamp = -1; + } + + g_free (to_free); + + if (rtptheoradepay->needs_keyframe) + goto request_keyframe; + + return NULL; + +no_output: + { + return NULL; + } + /* ERORRS */ +switch_failed: + { + GST_ELEMENT_WARNING (rtptheoradepay, STREAM, DECODE, + (NULL), ("Could not switch codebooks")); + goto request_config; + } +packet_short: + { + GST_ELEMENT_WARNING (rtptheoradepay, STREAM, DECODE, + (NULL), ("Packet was too short (%d < 4)", payload_len)); + goto request_keyframe; + } +ignore_reserved: + { + GST_WARNING_OBJECT (rtptheoradepay, "reserved TDT ignored"); + return NULL; + } +length_short: + { + GST_ELEMENT_WARNING (rtptheoradepay, STREAM, DECODE, + (NULL), ("Packet contains invalid data")); + goto request_keyframe; + } +invalid_configuration: + { + /* fatal, as we otherwise risk carrying on without output */ + GST_ELEMENT_ERROR (rtptheoradepay, STREAM, DECODE, + (NULL), ("Packet contains invalid configuration")); + goto request_config; + } +request_config: + { + gst_pad_push_event (GST_BASE_RTP_DEPAYLOAD_SINKPAD (depayload), + gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, + gst_structure_new ("GstForceKeyUnit", + "all-headers", G_TYPE_BOOLEAN, TRUE, NULL))); + return NULL; + } +request_keyframe: + { + rtptheoradepay->needs_keyframe = TRUE; + gst_pad_push_event (GST_BASE_RTP_DEPAYLOAD_SINKPAD (depayload), + gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, + gst_structure_new ("GstForceKeyUnit", NULL))); + return NULL; + } +} + +gboolean +gst_rtp_theora_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtptheoradepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_THEORA_DEPAY); +} + +static gboolean +gst_rtp_theora_depay_packet_lost (GstBaseRTPDepayload * depayload, + GstEvent * event) +{ + GstRtpTheoraDepay *rtptheoradepay = GST_RTP_THEORA_DEPAY (depayload); + guint seqnum = 0; + + gst_structure_get_uint (event->structure, "seqnum", &seqnum); + GST_LOG_OBJECT (depayload, "Requested keyframe because frame with seqnum %u" + " is missing", seqnum); + rtptheoradepay->needs_keyframe = TRUE; + + gst_pad_push_event (GST_BASE_RTP_DEPAYLOAD_SINKPAD (depayload), + gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, + gst_structure_new ("GstForceKeyUnit", NULL))); + + return TRUE; +} diff --git a/gst/rtp/gstrtptheoradepay.h b/gst/rtp/gstrtptheoradepay.h new file mode 100644 index 0000000..dff261c --- /dev/null +++ b/gst/rtp/gstrtptheoradepay.h @@ -0,0 +1,72 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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_RTP_THEORA_DEPAY_H__ +#define __GST_RTP_THEORA_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_THEORA_DEPAY \ + (gst_rtp_theora_depay_get_type()) +#define GST_RTP_THEORA_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_THEORA_DEPAY,GstRtpTheoraDepay)) +#define GST_RTP_THEORA_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_THEORA_DEPAY,GstRtpTheoraDepayClass)) +#define GST_IS_RTP_THEORA_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_THEORA_DEPAY)) +#define GST_IS_RTP_THEORA_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_THEORA_DEPAY)) + +typedef struct _GstRtpTheoraDepay GstRtpTheoraDepay; +typedef struct _GstRtpTheoraDepayClass GstRtpTheoraDepayClass; + +typedef struct _GstRtpTheoraConfig { + guint32 ident; + GList *headers; +} GstRtpTheoraConfig; + +struct _GstRtpTheoraDepay +{ + GstBaseRTPDepayload parent; + + GList *configs; + GstRtpTheoraConfig *config; + + GstAdapter *adapter; + gboolean assembling; + + gboolean needs_keyframe; +}; + +struct _GstRtpTheoraDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_theora_depay_get_type (void); + +gboolean gst_rtp_theora_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_THEORA_DEPAY_H__ */ diff --git a/gst/rtp/gstrtptheorapay.c b/gst/rtp/gstrtptheorapay.c new file mode 100644 index 0000000..a4c0919 --- /dev/null +++ b/gst/rtp/gstrtptheorapay.c @@ -0,0 +1,857 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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 + +#include + +#include "fnv1hash.h" +#include "gstrtptheorapay.h" + +#define THEORA_ID_LEN 42 + +GST_DEBUG_CATEGORY_STATIC (rtptheorapay_debug); +#define GST_CAT_DEFAULT (rtptheorapay_debug) + +/* references: + * http://svn.xiph.org/trunk/theora/doc/draft-ietf-avt-rtp-theora-01.txt + */ + +static GstStaticPadTemplate gst_rtp_theora_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"THEORA\"" + /* All required parameters + * + * "sampling = (string) { "YCbCr-4:2:0", "YCbCr-4:2:2", "YCbCr-4:4:4" } " + * "width = (string) [1, 1048561] (multiples of 16) " + * "height = (string) [1, 1048561] (multiples of 16) " + * "configuration = (string) ANY" + */ + /* All optional parameters + * + * "configuration-uri =" + * "delivery-method = (string) { inline, in_band, out_band/ } " + */ + ) + ); + +static GstStaticPadTemplate gst_rtp_theora_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-theora") + ); + +#define DEFAULT_CONFIG_INTERVAL 0 + +enum +{ + PROP_0, + PROP_CONFIG_INTERVAL +}; + +GST_BOILERPLATE (GstRtpTheoraPay, gst_rtp_theora_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static gboolean gst_rtp_theora_pay_setcaps (GstBaseRTPPayload * basepayload, + GstCaps * caps); +static GstStateChangeReturn gst_rtp_theora_pay_change_state (GstElement * + element, GstStateChange transition); +static GstFlowReturn gst_rtp_theora_pay_handle_buffer (GstBaseRTPPayload * pad, + GstBuffer * buffer); +static gboolean gst_rtp_theora_pay_handle_event (GstPad * pad, + GstEvent * event); + + +static void gst_rtp_theora_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_theora_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +gst_rtp_theora_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_theora_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_theora_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP Theora payloader", + "Codec/Payloader/Network/RTP", + "Payload-encode Theora video into RTP packets (draft-01 RFC XXXX)", + "Wim Taymans "); +} + +static void +gst_rtp_theora_pay_class_init (GstRtpTheoraPayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstelement_class->change_state = gst_rtp_theora_pay_change_state; + + gstbasertppayload_class->set_caps = gst_rtp_theora_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_theora_pay_handle_buffer; + gstbasertppayload_class->handle_event = gst_rtp_theora_pay_handle_event; + + gobject_class->set_property = gst_rtp_theora_pay_set_property; + gobject_class->get_property = gst_rtp_theora_pay_get_property; + + GST_DEBUG_CATEGORY_INIT (rtptheorapay_debug, "rtptheorapay", 0, + "Theora RTP Payloader"); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CONFIG_INTERVAL, + g_param_spec_uint ("config-interval", "Config Send Interval", + "Send Config Insertion Interval in seconds (configuration headers " + "will be multiplexed in the data stream when detected.) (0 = disabled)", + 0, 3600, DEFAULT_CONFIG_INTERVAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) + ); +} + +static void +gst_rtp_theora_pay_init (GstRtpTheoraPay * rtptheorapay, + GstRtpTheoraPayClass * klass) +{ + rtptheorapay->last_config = GST_CLOCK_TIME_NONE; +} + +static void +gst_rtp_theora_pay_clear_packet (GstRtpTheoraPay * rtptheorapay) +{ + if (rtptheorapay->packet) + gst_buffer_unref (rtptheorapay->packet); + rtptheorapay->packet = NULL; +} + +static void +gst_rtp_theora_pay_cleanup (GstRtpTheoraPay * rtptheorapay) +{ + g_list_foreach (rtptheorapay->headers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (rtptheorapay->headers); + rtptheorapay->headers = NULL; + + gst_rtp_theora_pay_clear_packet (rtptheorapay); + + if (rtptheorapay->config_data) + g_free (rtptheorapay->config_data); + rtptheorapay->config_data = NULL; + rtptheorapay->last_config = GST_CLOCK_TIME_NONE; +} + +static gboolean +gst_rtp_theora_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +{ + GstRtpTheoraPay *rtptheorapay; + + rtptheorapay = GST_RTP_THEORA_PAY (basepayload); + + rtptheorapay->need_headers = TRUE; + + return TRUE; +} + +static void +gst_rtp_theora_pay_reset_packet (GstRtpTheoraPay * rtptheorapay, guint8 TDT) +{ + guint payload_len; + + GST_DEBUG_OBJECT (rtptheorapay, "reset packet"); + + rtptheorapay->payload_pos = 4; + payload_len = gst_rtp_buffer_get_payload_len (rtptheorapay->packet); + rtptheorapay->payload_left = payload_len - 4; + rtptheorapay->payload_duration = 0; + rtptheorapay->payload_F = 0; + rtptheorapay->payload_TDT = TDT; + rtptheorapay->payload_pkts = 0; +} + +static void +gst_rtp_theora_pay_init_packet (GstRtpTheoraPay * rtptheorapay, guint8 TDT, + GstClockTime timestamp) +{ + GST_DEBUG_OBJECT (rtptheorapay, "starting new packet, TDT: %d", TDT); + + if (rtptheorapay->packet) + gst_buffer_unref (rtptheorapay->packet); + + /* new packet allocate max packet size */ + rtptheorapay->packet = + gst_rtp_buffer_new_allocate_len (GST_BASE_RTP_PAYLOAD_MTU + (rtptheorapay), 0, 0); + gst_rtp_theora_pay_reset_packet (rtptheorapay, TDT); + + GST_BUFFER_TIMESTAMP (rtptheorapay->packet) = timestamp; +} + +static GstFlowReturn +gst_rtp_theora_pay_flush_packet (GstRtpTheoraPay * rtptheorapay) +{ + GstFlowReturn ret; + guint8 *payload; + guint hlen; + + /* check for empty packet */ + if (!rtptheorapay->packet || rtptheorapay->payload_pos <= 4) + return GST_FLOW_OK; + + GST_DEBUG_OBJECT (rtptheorapay, "flushing packet"); + + /* fix header */ + payload = gst_rtp_buffer_get_payload (rtptheorapay->packet); + /* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Ident | F |TDT|# pkts.| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * F: Fragment type (0=none, 1=start, 2=cont, 3=end) + * TDT: Theora data type (0=theora, 1=config, 2=comment, 3=reserved) + * pkts: number of packets. + */ + payload[0] = (rtptheorapay->payload_ident >> 16) & 0xff; + payload[1] = (rtptheorapay->payload_ident >> 8) & 0xff; + payload[2] = (rtptheorapay->payload_ident) & 0xff; + payload[3] = (rtptheorapay->payload_F & 0x3) << 6 | + (rtptheorapay->payload_TDT & 0x3) << 4 | + (rtptheorapay->payload_pkts & 0xf); + + /* shrink the buffer size to the last written byte */ + hlen = gst_rtp_buffer_calc_header_len (0); + GST_BUFFER_SIZE (rtptheorapay->packet) = hlen + rtptheorapay->payload_pos; + + GST_BUFFER_DURATION (rtptheorapay->packet) = rtptheorapay->payload_duration; + + /* push, this gives away our ref to the packet, so clear it. */ + ret = + gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtptheorapay), + rtptheorapay->packet); + rtptheorapay->packet = NULL; + + return ret; +} + +static gboolean +gst_rtp_theora_pay_finish_headers (GstBaseRTPPayload * basepayload) +{ + GstRtpTheoraPay *rtptheorapay = GST_RTP_THEORA_PAY (basepayload); + GList *walk; + guint length, size, n_headers, configlen, extralen; + gchar *wstr, *hstr, *configuration; + guint8 *data, *config; + guint32 ident; + gboolean res; + + GST_DEBUG_OBJECT (rtptheorapay, "finish headers"); + + if (!rtptheorapay->headers) { + GST_DEBUG_OBJECT (rtptheorapay, "We need 2 headers but have none"); + goto no_headers; + } + + /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Number of packed headers | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Packed header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Packed header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | .... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * We only construct a config containing 1 packed header like this: + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Ident | length .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | n. of headers | length1 | length2 .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | Identification Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | Comment Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. Comment Header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Setup Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. Setup Header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + + /* we need 4 bytes for the number of headers (which is always 1), 3 bytes for + * the ident, 2 bytes for length, 1 byte for n. of headers. */ + size = 4 + 3 + 2 + 1; + + /* count the size of the headers first and update the hash */ + length = 0; + n_headers = 0; + ident = fnv1_hash_32_new (); + extralen = 1; + for (walk = rtptheorapay->headers; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + + guint bsize; + + bsize = GST_BUFFER_SIZE (buf); + length += bsize; + n_headers++; + + /* count number of bytes needed for length fields, we don't need this for + * the last header. */ + if (g_list_next (walk)) { + do { + size++; + extralen++; + bsize >>= 7; + } while (bsize); + } + /* update hash */ + ident = fnv1_hash_32_update (ident, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + } + + /* packet length is header size + packet length */ + configlen = size + length; + config = data = g_malloc (configlen); + + /* number of packed headers, we only pack 1 header */ + data[0] = 0; + data[1] = 0; + data[2] = 0; + data[3] = 1; + + ident = fnv1_hash_32_to_24 (ident); + rtptheorapay->payload_ident = ident; + GST_DEBUG_OBJECT (rtptheorapay, "ident 0x%08x", ident); + + /* take lower 3 bytes */ + data[4] = (ident >> 16) & 0xff; + data[5] = (ident >> 8) & 0xff; + data[6] = ident & 0xff; + + /* store length of all theora headers */ + data[7] = ((length) >> 8) & 0xff; + data[8] = (length) & 0xff; + + /* store number of headers minus one. */ + data[9] = n_headers - 1; + data += 10; + + /* store length for each header */ + for (walk = rtptheorapay->headers; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + + guint bsize, size, temp; + guint flag; + + /* only need to store the length when it's not the last header */ + if (!g_list_next (walk)) + break; + + bsize = GST_BUFFER_SIZE (buf); + + /* calc size */ + size = 0; + do { + size++; + bsize >>= 7; + } while (bsize); + temp = size; + + bsize = GST_BUFFER_SIZE (buf); + /* write the size backwards */ + flag = 0; + while (size) { + size--; + data[size] = (bsize & 0x7f) | flag; + bsize >>= 7; + flag = 0x80; + } + data += temp; + } + + /* copy header data */ + for (walk = rtptheorapay->headers; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + + memcpy (data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + data += GST_BUFFER_SIZE (buf); + } + + /* serialize to base64 */ + configuration = g_base64_encode (config, configlen); + + /* store for later re-sending */ + rtptheorapay->config_size = configlen - 4 - 3 - 2; + rtptheorapay->config_data = g_malloc (rtptheorapay->config_size); + rtptheorapay->config_extra_len = extralen; + memcpy (rtptheorapay->config_data, config + 4 + 3 + 2, + rtptheorapay->config_size); + + g_free (config); + + /* configure payloader settings */ + wstr = g_strdup_printf ("%d", rtptheorapay->width); + hstr = g_strdup_printf ("%d", rtptheorapay->height); + gst_basertppayload_set_options (basepayload, "video", TRUE, "THEORA", 90000); + res = gst_basertppayload_set_outcaps (basepayload, + "sampling", G_TYPE_STRING, "YCbCr-4:2:0", + "width", G_TYPE_STRING, wstr, + "height", G_TYPE_STRING, hstr, + "configuration", G_TYPE_STRING, configuration, + "delivery-method", G_TYPE_STRING, "inline", + /* don't set the other defaults + */ + NULL); + g_free (wstr); + g_free (hstr); + g_free (configuration); + + return res; + + /* ERRORS */ +no_headers: + { + GST_DEBUG_OBJECT (rtptheorapay, "finish headers"); + return FALSE; + } +} + +static gboolean +gst_rtp_theora_pay_parse_id (GstBaseRTPPayload * basepayload, guint8 * data, + guint size) +{ + GstRtpTheoraPay *rtptheorapay; + gint width, height; + + rtptheorapay = GST_RTP_THEORA_PAY (basepayload); + + if (G_UNLIKELY (size < 42)) + goto too_short; + + if (G_UNLIKELY (memcmp (data, "\200theora", 7))) + goto invalid_start; + data += 7; + + if (G_UNLIKELY (data[0] != 3)) + goto invalid_version; + if (G_UNLIKELY (data[1] != 2)) + goto invalid_version; + data += 3; + + width = GST_READ_UINT16_BE (data) << 4; + data += 2; + height = GST_READ_UINT16_BE (data) << 4; + data += 2; + + /* FIXME, parse pixel format */ + + /* store values */ + rtptheorapay->width = width; + rtptheorapay->height = height; + + return TRUE; + + /* ERRORS */ +too_short: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + (NULL), + ("Identification packet is too short, need at least 42, got %d", size)); + return FALSE; + } +invalid_start: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + (NULL), ("Invalid header start in identification packet")); + return FALSE; + } +invalid_version: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + (NULL), ("Invalid version")); + return FALSE; + } +} + +static GstFlowReturn +gst_rtp_theora_pay_payload_buffer (GstRtpTheoraPay * rtptheorapay, guint8 TDT, + guint8 * data, guint size, GstClockTime timestamp, GstClockTime duration, + guint not_in_length) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint newsize; + guint packet_len; + GstClockTime newduration; + gboolean flush; + guint plen; + guint8 *ppos, *payload; + gboolean fragmented; + + /* size increases with packet length and 2 bytes size eader. */ + newduration = rtptheorapay->payload_duration; + if (duration != GST_CLOCK_TIME_NONE) + newduration += duration; + + newsize = rtptheorapay->payload_pos + 2 + size; + packet_len = gst_rtp_buffer_calc_packet_len (newsize, 0, 0); + + /* check buffer filled against length and max latency */ + flush = gst_basertppayload_is_filled (GST_BASE_RTP_PAYLOAD (rtptheorapay), + packet_len, newduration); + /* we can store up to 15 theora packets in one RTP packet. */ + flush |= (rtptheorapay->payload_pkts == 15); + /* flush if we have a new TDT */ + if (rtptheorapay->packet) + flush |= (rtptheorapay->payload_TDT != TDT); + if (flush) + ret = gst_rtp_theora_pay_flush_packet (rtptheorapay); + + /* create new packet if we must */ + if (!rtptheorapay->packet) { + gst_rtp_theora_pay_init_packet (rtptheorapay, TDT, timestamp); + } + + payload = gst_rtp_buffer_get_payload (rtptheorapay->packet); + ppos = payload + rtptheorapay->payload_pos; + fragmented = FALSE; + + /* put buffer in packet, it either fits completely or needs to be fragmented + * over multiple RTP packets. */ + do { + plen = MIN (rtptheorapay->payload_left - 2, size); + + GST_DEBUG_OBJECT (rtptheorapay, "append %u bytes", plen); + + /* data is copied in the payload with a 2 byte length header */ + ppos[0] = ((plen - not_in_length) >> 8) & 0xff; + ppos[1] = ((plen - not_in_length) & 0xff); + if (plen) + memcpy (&ppos[2], data, plen); + + /* only first (only) configuration cuts length field */ + /* NOTE: spec (if any) is not clear on this ... */ + not_in_length = 0; + + size -= plen; + data += plen; + + rtptheorapay->payload_pos += plen + 2; + rtptheorapay->payload_left -= plen + 2; + + if (fragmented) { + if (size == 0) + /* last fragment, set F to 0x3. */ + rtptheorapay->payload_F = 0x3; + else + /* fragment continues, set F to 0x2. */ + rtptheorapay->payload_F = 0x2; + } else { + if (size > 0) { + /* fragmented packet starts, set F to 0x1, mark ourselves as + * fragmented. */ + rtptheorapay->payload_F = 0x1; + fragmented = TRUE; + } + } + if (fragmented) { + /* fragmented packets are always flushed and have ptks of 0 */ + rtptheorapay->payload_pkts = 0; + ret = gst_rtp_theora_pay_flush_packet (rtptheorapay); + + if (size > 0) { + /* start new packet and get pointers. TDT stays the same. */ + gst_rtp_theora_pay_init_packet (rtptheorapay, + rtptheorapay->payload_TDT, timestamp); + payload = gst_rtp_buffer_get_payload (rtptheorapay->packet); + ppos = payload + rtptheorapay->payload_pos; + } + } else { + /* unfragmented packet, update stats for next packet, size == 0 and we + * exit the while loop */ + rtptheorapay->payload_pkts++; + if (duration != GST_CLOCK_TIME_NONE) + rtptheorapay->payload_duration += duration; + } + } while (size); + + return ret; +} + +static GstFlowReturn +gst_rtp_theora_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpTheoraPay *rtptheorapay; + GstFlowReturn ret; + guint size; + guint8 *data; + GstClockTime duration, timestamp; + guint8 TDT; + gboolean keyframe = FALSE; + + rtptheorapay = GST_RTP_THEORA_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + duration = GST_BUFFER_DURATION (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + + GST_DEBUG_OBJECT (rtptheorapay, "size %u, duration %" GST_TIME_FORMAT, + size, GST_TIME_ARGS (duration)); + + if (G_UNLIKELY (size > 0xffff)) + goto wrong_size; + + /* find packet type */ + if (size == 0) { + TDT = 0; + keyframe = FALSE; + } else if (data[0] & 0x80) { + /* header */ + if (data[0] == 0x80) { + /* identification, we need to parse this in order to get the clock rate. + */ + if (G_UNLIKELY (!gst_rtp_theora_pay_parse_id (basepayload, data, size))) + goto parse_id_failed; + TDT = 1; + } else if (data[0] == 0x81) { + /* comment */ + TDT = 2; + } else if (data[0] == 0x82) { + /* setup */ + TDT = 1; + } else + goto unknown_header; + } else { + /* data */ + TDT = 0; + keyframe = ((data[0] & 0x40) == 0); + } + + if (rtptheorapay->need_headers) { + /* we need to collect the headers and construct a config string from them */ + if (TDT != 0) { + GST_DEBUG_OBJECT (rtptheorapay, "collecting header, buffer %p", buffer); + /* append header to the list of headers */ + rtptheorapay->headers = g_list_append (rtptheorapay->headers, buffer); + ret = GST_FLOW_OK; + goto done; + } else { + if (!gst_rtp_theora_pay_finish_headers (basepayload)) + goto header_error; + rtptheorapay->need_headers = FALSE; + } + } + + /* there is a config request, see if we need to insert it */ + if (keyframe && (rtptheorapay->config_interval > 0) && + rtptheorapay->config_data) { + gboolean send_config = FALSE; + + if (rtptheorapay->last_config != -1) { + guint64 diff; + + GST_LOG_OBJECT (rtptheorapay, + "now %" GST_TIME_FORMAT ", last VOP-I %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp), GST_TIME_ARGS (rtptheorapay->last_config)); + + /* calculate diff between last config in milliseconds */ + if (timestamp > rtptheorapay->last_config) { + diff = timestamp - rtptheorapay->last_config; + } else { + diff = 0; + } + + GST_DEBUG_OBJECT (rtptheorapay, + "interval since last config %" GST_TIME_FORMAT, GST_TIME_ARGS (diff)); + + /* bigger than interval, queue config */ + /* FIXME should convert timestamps to running time */ + if (GST_TIME_AS_SECONDS (diff) >= rtptheorapay->config_interval) { + GST_DEBUG_OBJECT (rtptheorapay, "time to send config"); + send_config = TRUE; + } + } else { + /* no known previous config time, send now */ + GST_DEBUG_OBJECT (rtptheorapay, "no previous config time, send now"); + send_config = TRUE; + } + + if (send_config) { + /* we need to send config now first */ + /* different TDT type forces flush */ + gst_rtp_theora_pay_payload_buffer (rtptheorapay, 1, + rtptheorapay->config_data, rtptheorapay->config_size, + timestamp, GST_CLOCK_TIME_NONE, rtptheorapay->config_extra_len); + + if (timestamp != -1) { + rtptheorapay->last_config = timestamp; + } + } + } + + ret = gst_rtp_theora_pay_payload_buffer (rtptheorapay, TDT, data, size, + timestamp, duration, 0); + gst_buffer_unref (buffer); + +done: + return ret; + + /* ERRORS */ +wrong_size: + { + GST_ELEMENT_WARNING (rtptheorapay, STREAM, DECODE, + ("Invalid packet size (%d <= 0xffff)", size), (NULL)); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +parse_id_failed: + { + gst_buffer_unref (buffer); + return GST_FLOW_ERROR; + } +unknown_header: + { + GST_ELEMENT_WARNING (rtptheorapay, STREAM, DECODE, + (NULL), ("Ignoring unknown header received")); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +header_error: + { + GST_ELEMENT_WARNING (rtptheorapay, STREAM, DECODE, + (NULL), ("Error initializing header config")); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +} + +static gboolean +gst_rtp_theora_pay_handle_event (GstPad * pad, GstEvent * event) +{ + GstRtpTheoraPay *rtptheorapay = GST_RTP_THEORA_PAY (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_rtp_theora_pay_clear_packet (rtptheorapay); + break; + default: + break; + } + /* false to let parent handle event as well */ + return FALSE; +} + +static GstStateChangeReturn +gst_rtp_theora_pay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpTheoraPay *rtptheorapay; + + GstStateChangeReturn ret; + + rtptheorapay = GST_RTP_THEORA_PAY (element); + + switch (transition) { + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_theora_pay_cleanup (rtptheorapay); + break; + default: + break; + } + return ret; +} + +static void +gst_rtp_theora_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpTheoraPay *rtptheorapay; + + rtptheorapay = GST_RTP_THEORA_PAY (object); + + switch (prop_id) { + case PROP_CONFIG_INTERVAL: + rtptheorapay->config_interval = g_value_get_uint (value); + break; + default: + break; + } +} + +static void +gst_rtp_theora_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpTheoraPay *rtptheorapay; + + rtptheorapay = GST_RTP_THEORA_PAY (object); + + switch (prop_id) { + case PROP_CONFIG_INTERVAL: + g_value_set_uint (value, rtptheorapay->config_interval); + break; + default: + break; + } +} + +gboolean +gst_rtp_theora_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtptheorapay", + GST_RANK_SECONDARY, GST_TYPE_RTP_THEORA_PAY); +} diff --git a/gst/rtp/gstrtptheorapay.h b/gst/rtp/gstrtptheorapay.h new file mode 100644 index 0000000..198e375 --- /dev/null +++ b/gst/rtp/gstrtptheorapay.h @@ -0,0 +1,84 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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_RTP_THEORA_PAY_H__ +#define __GST_RTP_THEORA_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_THEORA_PAY \ + (gst_rtp_theora_pay_get_type()) +#define GST_RTP_THEORA_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_THEORA_PAY,GstRtpTheoraPay)) +#define GST_RTP_THEORA_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_THEORA_PAY,GstRtpTheoraPayClass)) +#define GST_IS_RTP_THEORA_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_THEORA_PAY)) +#define GST_IS_RTP_THEORA_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_THEORA_PAY)) + +typedef struct _GstRtpTheoraPay GstRtpTheoraPay; +typedef struct _GstRtpTheoraPayClass GstRtpTheoraPayClass; + +struct _GstRtpTheoraPay +{ + GstBaseRTPPayload payload; + + /* the headers */ + gboolean need_headers; + GList *headers; + + /* queues of buffers along with some stats. */ + GstBuffer *packet; + guint payload_pos; + guint payload_left; + guint32 payload_ident; + guint8 payload_F; + guint8 payload_TDT; + guint payload_pkts; + GstClockTime payload_timestamp; + GstClockTime payload_duration; + + /* config (re-sending) */ + guint8 *config_data; + guint config_size; + guint config_extra_len; + guint config_interval; + GstClockTime last_config; + + gint width; + gint height; +}; + +struct _GstRtpTheoraPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_theora_pay_get_type (void); + +gboolean gst_rtp_theora_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_THEORA_PAY_H__ */ diff --git a/gst/rtp/gstrtpvorbisdepay.c b/gst/rtp/gstrtpvorbisdepay.c new file mode 100644 index 0000000..1694af8 --- /dev/null +++ b/gst/rtp/gstrtpvorbisdepay.c @@ -0,0 +1,700 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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 +#include + +#include +#include "gstrtpvorbisdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpvorbisdepay_debug); +#define GST_CAT_DEFAULT (rtpvorbisdepay_debug) + +/* references: + * http://www.rfc-editor.org/rfc/rfc5215.txt + */ + +static GstStaticPadTemplate gst_rtp_vorbis_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"VORBIS\"" + /* All required parameters + * + * "encoding-params = (string) " + * "configuration = (string) ANY" + */ + ) + ); + +static GstStaticPadTemplate gst_rtp_vorbis_depay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-vorbis") + ); + +GST_BOILERPLATE (GstRtpVorbisDepay, gst_rtp_vorbis_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_vorbis_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_vorbis_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static void gst_rtp_vorbis_depay_finalize (GObject * object); + +static GstStateChangeReturn gst_rtp_vorbis_depay_change_state (GstElement * + element, GstStateChange transition); + + +static void +gst_rtp_vorbis_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_vorbis_depay_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_vorbis_depay_src_template); + + gst_element_class_set_details_simple (element_class, "RTP Vorbis depayloader", + "Codec/Depayloader/Network/RTP", + "Extracts Vorbis Audio from RTP packets (RFC 5215)", + "Wim Taymans "); +} + +static void +gst_rtp_vorbis_depay_class_init (GstRtpVorbisDepayClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gobject_class->finalize = gst_rtp_vorbis_depay_finalize; + + gstelement_class->change_state = gst_rtp_vorbis_depay_change_state; + + gstbasertpdepayload_class->process = gst_rtp_vorbis_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_vorbis_depay_setcaps; + + GST_DEBUG_CATEGORY_INIT (rtpvorbisdepay_debug, "rtpvorbisdepay", 0, + "Vorbis RTP Depayloader"); +} + +static void +gst_rtp_vorbis_depay_init (GstRtpVorbisDepay * rtpvorbisdepay, + GstRtpVorbisDepayClass * klass) +{ + rtpvorbisdepay->adapter = gst_adapter_new (); +} + +static void +free_config (GstRtpVorbisConfig * conf) +{ + GList *headers; + + for (headers = conf->headers; headers; headers = g_list_next (headers)) { + GstBuffer *header = GST_BUFFER_CAST (headers->data); + + gst_buffer_unref (header); + } + g_list_free (conf->headers); + g_free (conf); +} + +static void +free_indents (GstRtpVorbisDepay * rtpvorbisdepay) +{ + GList *walk; + + for (walk = rtpvorbisdepay->configs; walk; walk = g_list_next (walk)) { + free_config ((GstRtpVorbisConfig *) walk->data); + } + g_list_free (rtpvorbisdepay->configs); + rtpvorbisdepay->configs = NULL; +} + +static void +gst_rtp_vorbis_depay_finalize (GObject * object) +{ + GstRtpVorbisDepay *rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (object); + + g_object_unref (rtpvorbisdepay->adapter); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* takes ownership of confbuf */ +static gboolean +gst_rtp_vorbis_depay_parse_configuration (GstRtpVorbisDepay * rtpvorbisdepay, + GstBuffer * confbuf) +{ + GstBuffer *buf; + guint32 num_headers; + guint8 *data; + guint size; + guint offset; + gint i, j; + + data = GST_BUFFER_DATA (confbuf); + size = GST_BUFFER_SIZE (confbuf); + + GST_DEBUG_OBJECT (rtpvorbisdepay, "config size %u", size); + + /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Number of packed headers | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Packed header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Packed header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | .... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + if (size < 4) + goto too_small; + + num_headers = GST_READ_UINT32_BE (data); + size -= 4; + data += 4; + offset = 4; + + GST_DEBUG_OBJECT (rtpvorbisdepay, "have %u headers", num_headers); + + /* 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Ident | length .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | n. of headers | length1 | length2 .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | Identification Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | Comment Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. Comment Header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Setup Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. Setup Header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + for (i = 0; i < num_headers; i++) { + guint32 ident; + guint16 length; + guint8 n_headers, b; + GstRtpVorbisConfig *conf; + guint *h_sizes; + guint extra = 1; + + if (size < 6) + goto too_small; + + ident = (data[0] << 16) | (data[1] << 8) | data[2]; + length = (data[3] << 8) | data[4]; + n_headers = data[5]; + size -= 6; + data += 6; + offset += 6; + + GST_DEBUG_OBJECT (rtpvorbisdepay, + "header %d, ident 0x%08x, length %u, left %u", i, ident, length, size); + + /* FIXME check if we already got this ident */ + + /* length might also include count of following size fields */ + if (size < length && size + 1 != length) + goto too_small; + + /* read header sizes we read 2 sizes, the third size (for which we allocate + * space) must be derived from the total packed header length. */ + h_sizes = g_newa (guint, n_headers + 1); + for (j = 0; j < n_headers; j++) { + guint h_size; + + h_size = 0; + do { + if (size < 1) + goto too_small; + b = *data++; + offset++; + extra++; + size--; + h_size = (h_size << 7) | (b & 0x7f); + } while (b & 0x80); + GST_DEBUG_OBJECT (rtpvorbisdepay, "headers %d: size: %u", j, h_size); + + if (length < h_size) + goto too_small; + + h_sizes[j] = h_size; + length -= h_size; + } + /* last header length is the remaining space */ + GST_DEBUG_OBJECT (rtpvorbisdepay, "last header size: %u", length); + h_sizes[j] = length; + + GST_DEBUG_OBJECT (rtpvorbisdepay, "preparing headers"); + conf = g_new0 (GstRtpVorbisConfig, 1); + conf->ident = ident; + + for (j = 0; j <= n_headers; j++) { + guint h_size; + + h_size = h_sizes[j]; + if (size < h_size) { + if (j != n_headers || size + extra != h_size) { + free_config (conf); + goto too_small; + } else { + /* otherwise means that overall length field contained total length, + * including extra fields */ + h_size -= extra; + } + } + + GST_DEBUG_OBJECT (rtpvorbisdepay, "reading header %d, size %u", j, + h_size); + + buf = gst_buffer_create_sub (confbuf, offset, h_size); + conf->headers = g_list_append (conf->headers, buf); + offset += h_size; + size -= h_size; + } + rtpvorbisdepay->configs = g_list_append (rtpvorbisdepay->configs, conf); + } + gst_buffer_unref (confbuf); + + return TRUE; + + /* ERRORS */ +too_small: + { + GST_DEBUG_OBJECT (rtpvorbisdepay, "configuration too small"); + gst_buffer_unref (confbuf); + return FALSE; + } +} + +static gboolean +gst_rtp_vorbis_depay_parse_inband_configuration (GstRtpVorbisDepay * + rtpvorbisdepay, guint ident, guint8 * configuration, guint size, + guint length) +{ + GstBuffer *confbuf; + guint8 *conf; + + if (G_UNLIKELY (size < 4)) + return FALSE; + + /* transform inline to out-of-band and parse that one */ + confbuf = gst_buffer_new_and_alloc (size + 9); + conf = GST_BUFFER_DATA (confbuf); + /* 1 header */ + GST_WRITE_UINT32_BE (conf, 1); + /* write Ident */ + GST_WRITE_UINT24_BE (conf + 4, ident); + /* write sort-of-length */ + GST_WRITE_UINT16_BE (conf + 7, length); + /* copy remainder */ + memcpy (conf + 9, configuration, size); + + return gst_rtp_vorbis_depay_parse_configuration (rtpvorbisdepay, confbuf); +} + +static gboolean +gst_rtp_vorbis_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpVorbisDepay *rtpvorbisdepay; + GstCaps *srccaps; + const gchar *configuration; + gint clock_rate; + gboolean res; + + rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + /* get clockrate */ + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + goto no_rate; + + /* read and parse configuration string */ + configuration = gst_structure_get_string (structure, "configuration"); + if (configuration) { + GstBuffer *confbuf; + guint8 *data; + gsize size; + + /* deserialize base64 to buffer */ + data = g_base64_decode (configuration, &size); + + confbuf = gst_buffer_new (); + GST_BUFFER_DATA (confbuf) = data; + GST_BUFFER_MALLOCDATA (confbuf) = data; + GST_BUFFER_SIZE (confbuf) = size; + if (!gst_rtp_vorbis_depay_parse_configuration (rtpvorbisdepay, confbuf)) + goto invalid_configuration; + } else { + GST_WARNING_OBJECT (rtpvorbisdepay, "no configuration specified"); + } + + /* caps seem good, configure element */ + depayload->clock_rate = clock_rate; + + /* set caps on pad and on header */ + srccaps = gst_caps_new_simple ("audio/x-vorbis", NULL); + res = gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + + return res; + + /* ERRORS */ +invalid_configuration: + { + GST_ERROR_OBJECT (rtpvorbisdepay, "invalid configuration specified"); + return FALSE; + } +no_rate: + { + GST_ERROR_OBJECT (rtpvorbisdepay, "no clock-rate specified"); + return FALSE; + } +} + +static gboolean +gst_rtp_vorbis_depay_switch_codebook (GstRtpVorbisDepay * rtpvorbisdepay, + guint32 ident) +{ + GList *walk; + gboolean res = FALSE; + + GST_DEBUG_OBJECT (rtpvorbisdepay, "Looking up code book ident 0x%08x", ident); + for (walk = rtpvorbisdepay->configs; walk; walk = g_list_next (walk)) { + GstRtpVorbisConfig *conf = (GstRtpVorbisConfig *) walk->data; + + if (conf->ident == ident) { + GList *headers; + + /* FIXME, remove pads, create new pad.. */ + + /* push out all the headers */ + for (headers = conf->headers; headers; headers = g_list_next (headers)) { + GstBuffer *header = GST_BUFFER_CAST (headers->data); + + gst_buffer_ref (header); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpvorbisdepay), + header); + } + /* remember the current config */ + rtpvorbisdepay->config = conf; + res = TRUE; + } + } + if (!res) { + /* we don't know about the headers, figure out an alternative method for + * getting the codebooks. FIXME, fail for now. */ + } + return res; +} + +static GstBuffer * +gst_rtp_vorbis_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpVorbisDepay *rtpvorbisdepay; + GstBuffer *outbuf; + GstFlowReturn ret; + gint payload_len; + guint8 *payload, *to_free = NULL; + guint32 timestamp; + guint32 header, ident; + guint8 F, VDT, packets; + + rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (depayload); + + payload_len = gst_rtp_buffer_get_payload_len (buf); + + GST_DEBUG_OBJECT (depayload, "got RTP packet of size %d", payload_len); + + /* we need at least 4 bytes for the packet header */ + if (G_UNLIKELY (payload_len < 4)) + goto packet_short; + + payload = gst_rtp_buffer_get_payload (buf); + + header = GST_READ_UINT32_BE (payload); + /* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Ident | F |VDT|# pkts.| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * F: Fragment type (0=none, 1=start, 2=cont, 3=end) + * VDT: Vorbis data type (0=vorbis, 1=config, 2=comment, 3=reserved) + * pkts: number of packets. + */ + VDT = (header & 0x30) >> 4; + if (G_UNLIKELY (VDT == 3)) + goto ignore_reserved; + + GST_DEBUG_OBJECT (depayload, "header: 0x%08x", header); + ident = (header >> 8) & 0xffffff; + F = (header & 0xc0) >> 6; + packets = (header & 0xf); + + if (VDT == 0) { + gboolean do_switch = FALSE; + + /* we have a raw payload, find the codebook for the ident */ + if (!rtpvorbisdepay->config) { + /* we don't have an active codebook, find the codebook and + * activate it */ + GST_DEBUG_OBJECT (rtpvorbisdepay, "No active codebook, switching"); + do_switch = TRUE; + } else if (rtpvorbisdepay->config->ident != ident) { + /* codebook changed */ + GST_DEBUG_OBJECT (rtpvorbisdepay, "codebook changed, switching"); + do_switch = TRUE; + } + if (do_switch) { + if (!gst_rtp_vorbis_depay_switch_codebook (rtpvorbisdepay, ident)) + goto switch_failed; + } + } + + /* skip header */ + payload += 4; + payload_len -= 4; + + GST_DEBUG_OBJECT (depayload, "ident: %u, F: %d, VDT: %d, packets: %d", ident, + F, VDT, packets); + + /* fragmented packets, assemble */ + if (F != 0) { + GstBuffer *vdata; + guint headerskip; + + if (F == 1) { + /* if we start a packet, clear adapter and start assembling. */ + gst_adapter_clear (rtpvorbisdepay->adapter); + GST_DEBUG_OBJECT (depayload, "start assemble"); + rtpvorbisdepay->assembling = TRUE; + } + + if (!rtpvorbisdepay->assembling) + goto no_output; + + /* first assembled packet, reuse 2 bytes to store the length */ + headerskip = (F == 1 ? 4 : 6); + /* skip header and length. */ + vdata = gst_rtp_buffer_get_payload_subbuffer (buf, headerskip, -1); + + GST_DEBUG_OBJECT (depayload, "assemble vorbis packet"); + gst_adapter_push (rtpvorbisdepay->adapter, vdata); + + /* packet is not complete, we are done */ + if (F != 3) + goto no_output; + + /* construct assembled buffer */ + payload_len = gst_adapter_available (rtpvorbisdepay->adapter); + payload = gst_adapter_take (rtpvorbisdepay->adapter, payload_len); + /* fix the length */ + payload[0] = ((payload_len - 2) >> 8) & 0xff; + payload[1] = (payload_len - 2) & 0xff; + to_free = payload; + } + + GST_DEBUG_OBJECT (depayload, "assemble done"); + + /* we not assembling anymore now */ + rtpvorbisdepay->assembling = FALSE; + gst_adapter_clear (rtpvorbisdepay->adapter); + + /* payload now points to a length with that many vorbis data bytes. + * Iterate over the packets and send them out. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | length | vorbis data .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. vorbis data | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | length | next vorbis packet data .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. vorbis data | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* + */ + timestamp = gst_rtp_buffer_get_timestamp (buf); + + while (payload_len > 2) { + guint16 length; + + length = GST_READ_UINT16_BE (payload); + payload += 2; + payload_len -= 2; + + GST_DEBUG_OBJECT (depayload, "read length %u, avail: %d", length, + payload_len); + + /* skip packet if something odd happens */ + if (G_UNLIKELY (length > payload_len)) + goto length_short; + + /* handle in-band configuration */ + if (G_UNLIKELY (VDT == 1)) { + GST_DEBUG_OBJECT (rtpvorbisdepay, "in-band configuration"); + if (!gst_rtp_vorbis_depay_parse_inband_configuration (rtpvorbisdepay, + ident, payload, payload_len, length)) + goto invalid_configuration; + goto no_output; + } + + /* create buffer for packet */ + if (G_UNLIKELY (to_free)) { + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = payload; + GST_BUFFER_MALLOCDATA (outbuf) = to_free; + GST_BUFFER_SIZE (outbuf) = length; + to_free = NULL; + } else { + outbuf = gst_buffer_new_and_alloc (length); + memcpy (GST_BUFFER_DATA (outbuf), payload, length); + } + + payload += length; + payload_len -= length; + + if (timestamp != -1) + /* push with timestamp of the last packet, which is the same timestamp that + * should apply to the first assembled packet. */ + ret = gst_base_rtp_depayload_push_ts (depayload, timestamp, outbuf); + else + ret = gst_base_rtp_depayload_push (depayload, outbuf); + + if (ret != GST_FLOW_OK) + break; + + /* make sure we don't set a timestamp on next buffers */ + timestamp = -1; + } + + g_free (to_free); + + return NULL; + +no_output: + { + return NULL; + } + /* ERORRS */ +switch_failed: + { + GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE, + (NULL), ("Could not switch codebooks")); + return NULL; + } +packet_short: + { + GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE, + (NULL), ("Packet was too short (%d < 4)", payload_len)); + return NULL; + } +ignore_reserved: + { + GST_WARNING_OBJECT (rtpvorbisdepay, "reserved VDT ignored"); + return NULL; + } +length_short: + { + GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE, + (NULL), ("Packet contains invalid data")); + return NULL; + } +invalid_configuration: + { + /* fatal, as we otherwise risk carrying on without output */ + GST_ELEMENT_ERROR (rtpvorbisdepay, STREAM, DECODE, + (NULL), ("Packet contains invalid configuration")); + return NULL; + } +} + +static GstStateChangeReturn +gst_rtp_vorbis_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpVorbisDepay *rtpvorbisdepay; + GstStateChangeReturn ret; + + rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + free_indents (rtpvorbisdepay); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_vorbis_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpvorbisdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_VORBIS_DEPAY); +} diff --git a/gst/rtp/gstrtpvorbisdepay.h b/gst/rtp/gstrtpvorbisdepay.h new file mode 100644 index 0000000..0b06118 --- /dev/null +++ b/gst/rtp/gstrtpvorbisdepay.h @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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_RTP_VORBIS_DEPAY_H__ +#define __GST_RTP_VORBIS_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_VORBIS_DEPAY \ + (gst_rtp_vorbis_depay_get_type()) +#define GST_RTP_VORBIS_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VORBIS_DEPAY,GstRtpVorbisDepay)) +#define GST_RTP_VORBIS_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VORBIS_DEPAY,GstRtpVorbisDepayClass)) +#define GST_IS_RTP_VORBIS_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VORBIS_DEPAY)) +#define GST_IS_RTP_VORBIS_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VORBIS_DEPAY)) + +typedef struct _GstRtpVorbisDepay GstRtpVorbisDepay; +typedef struct _GstRtpVorbisDepayClass GstRtpVorbisDepayClass; + +typedef struct _GstRtpVorbisConfig { + guint32 ident; + GList *headers; +} GstRtpVorbisConfig; + +struct _GstRtpVorbisDepay +{ + GstBaseRTPDepayload parent; + + GList *configs; + GstRtpVorbisConfig *config; + + GstAdapter *adapter; + gboolean assembling; +}; + +struct _GstRtpVorbisDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_vorbis_depay_get_type (void); + +gboolean gst_rtp_vorbis_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_VORBIS_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpvorbispay.c b/gst/rtp/gstrtpvorbispay.c new file mode 100644 index 0000000..12b82ec --- /dev/null +++ b/gst/rtp/gstrtpvorbispay.c @@ -0,0 +1,694 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans + * + * 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 + +#include + +#include "fnv1hash.h" +#include "gstrtpvorbispay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpvorbispay_debug); +#define GST_CAT_DEFAULT (rtpvorbispay_debug) + +/* references: + * http://www.rfc-editor.org/rfc/rfc5215.txt + */ + +static GstStaticPadTemplate gst_rtp_vorbis_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"VORBIS\"" + /* All required parameters + * + * "encoding-params = (string) " + * "configuration = (string) ANY" + */ + ) + ); + +static GstStaticPadTemplate gst_rtp_vorbis_pay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-vorbis") + ); + +GST_BOILERPLATE (GstRtpVorbisPay, gst_rtp_vorbis_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD); + +static gboolean gst_rtp_vorbis_pay_setcaps (GstBaseRTPPayload * basepayload, + GstCaps * caps); +static GstStateChangeReturn gst_rtp_vorbis_pay_change_state (GstElement * + element, GstStateChange transition); +static GstFlowReturn gst_rtp_vorbis_pay_handle_buffer (GstBaseRTPPayload * pad, + GstBuffer * buffer); +static gboolean gst_rtp_vorbis_pay_handle_event (GstPad * pad, + GstEvent * event); + +static void +gst_rtp_vorbis_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_vorbis_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_vorbis_pay_sink_template); + + gst_element_class_set_details_simple (element_class, "RTP Vorbis depayloader", + "Codec/Payloader/Network/RTP", + "Payload-encode Vorbis audio into RTP packets (RFC 5215)", + "Wim Taymans "); +} + +static void +gst_rtp_vorbis_pay_class_init (GstRtpVorbisPayClass * klass) +{ + GstElementClass *gstelement_class; + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstelement_class = (GstElementClass *) klass; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstelement_class->change_state = gst_rtp_vorbis_pay_change_state; + + gstbasertppayload_class->set_caps = gst_rtp_vorbis_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_vorbis_pay_handle_buffer; + gstbasertppayload_class->handle_event = gst_rtp_vorbis_pay_handle_event; + + GST_DEBUG_CATEGORY_INIT (rtpvorbispay_debug, "rtpvorbispay", 0, + "Vorbis RTP Payloader"); +} + +static void +gst_rtp_vorbis_pay_init (GstRtpVorbisPay * rtpvorbispay, + GstRtpVorbisPayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static void +gst_rtp_vorbis_pay_clear_packet (GstRtpVorbisPay * rtpvorbispay) +{ + if (rtpvorbispay->packet) + gst_buffer_unref (rtpvorbispay->packet); + rtpvorbispay->packet = NULL; +} + +static void +gst_rtp_vorbis_pay_cleanup (GstRtpVorbisPay * rtpvorbispay) +{ + g_list_foreach (rtpvorbispay->headers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (rtpvorbispay->headers); + rtpvorbispay->headers = NULL; + + gst_rtp_vorbis_pay_clear_packet (rtpvorbispay); +} + +static gboolean +gst_rtp_vorbis_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +{ + GstRtpVorbisPay *rtpvorbispay; + + rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); + + rtpvorbispay->need_headers = TRUE; + + return TRUE; +} + +static void +gst_rtp_vorbis_pay_reset_packet (GstRtpVorbisPay * rtpvorbispay, guint8 VDT) +{ + guint payload_len; + + GST_LOG_OBJECT (rtpvorbispay, "reset packet"); + + rtpvorbispay->payload_pos = 4; + payload_len = gst_rtp_buffer_get_payload_len (rtpvorbispay->packet); + rtpvorbispay->payload_left = payload_len - 4; + rtpvorbispay->payload_duration = 0; + rtpvorbispay->payload_F = 0; + rtpvorbispay->payload_VDT = VDT; + rtpvorbispay->payload_pkts = 0; +} + +static void +gst_rtp_vorbis_pay_init_packet (GstRtpVorbisPay * rtpvorbispay, guint8 VDT, + GstClockTime timestamp) +{ + GST_LOG_OBJECT (rtpvorbispay, "starting new packet, VDT: %d", VDT); + + if (rtpvorbispay->packet) + gst_buffer_unref (rtpvorbispay->packet); + + /* new packet allocate max packet size */ + rtpvorbispay->packet = + gst_rtp_buffer_new_allocate_len (GST_BASE_RTP_PAYLOAD_MTU + (rtpvorbispay), 0, 0); + gst_rtp_vorbis_pay_reset_packet (rtpvorbispay, VDT); + GST_BUFFER_TIMESTAMP (rtpvorbispay->packet) = timestamp; +} + +static GstFlowReturn +gst_rtp_vorbis_pay_flush_packet (GstRtpVorbisPay * rtpvorbispay) +{ + GstFlowReturn ret; + guint8 *payload; + guint hlen; + + /* check for empty packet */ + if (!rtpvorbispay->packet || rtpvorbispay->payload_pos <= 4) + return GST_FLOW_OK; + + GST_LOG_OBJECT (rtpvorbispay, "flushing packet"); + + /* fix header */ + payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); + /* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Ident | F |VDT|# pkts.| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * F: Fragment type (0=none, 1=start, 2=cont, 3=end) + * VDT: Vorbis data type (0=vorbis, 1=config, 2=comment, 3=reserved) + * pkts: number of packets. + */ + payload[0] = (rtpvorbispay->payload_ident >> 16) & 0xff; + payload[1] = (rtpvorbispay->payload_ident >> 8) & 0xff; + payload[2] = (rtpvorbispay->payload_ident) & 0xff; + payload[3] = (rtpvorbispay->payload_F & 0x3) << 6 | + (rtpvorbispay->payload_VDT & 0x3) << 4 | + (rtpvorbispay->payload_pkts & 0xf); + + /* shrink the buffer size to the last written byte */ + hlen = gst_rtp_buffer_calc_header_len (0); + GST_BUFFER_SIZE (rtpvorbispay->packet) = hlen + rtpvorbispay->payload_pos; + + GST_BUFFER_DURATION (rtpvorbispay->packet) = rtpvorbispay->payload_duration; + + /* push, this gives away our ref to the packet, so clear it. */ + ret = + gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpvorbispay), + rtpvorbispay->packet); + rtpvorbispay->packet = NULL; + + return ret; +} + +static gboolean +gst_rtp_vorbis_pay_finish_headers (GstBaseRTPPayload * basepayload) +{ + GstRtpVorbisPay *rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); + GList *walk; + guint length, size, n_headers, configlen; + gchar *cstr, *configuration; + guint8 *data, *config; + guint32 ident; + gboolean res; + + GST_DEBUG_OBJECT (rtpvorbispay, "finish headers"); + + if (!rtpvorbispay->headers) + goto no_headers; + + /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Number of packed headers | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Packed header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Packed header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | .... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * We only construct a config containing 1 packed header like this: + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Ident | length .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | n. of headers | length1 | length2 .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | Identification Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. | Comment Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. Comment Header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Setup Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * .. Setup Header | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + + /* we need 4 bytes for the number of headers (which is always 1), 3 bytes for + * the ident, 2 bytes for length, 1 byte for n. of headers. */ + size = 4 + 3 + 2 + 1; + + /* count the size of the headers first and update the hash */ + length = 0; + n_headers = 0; + ident = fnv1_hash_32_new (); + for (walk = rtpvorbispay->headers; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + guint bsize; + + bsize = GST_BUFFER_SIZE (buf); + length += bsize; + n_headers++; + + /* count number of bytes needed for length fields, we don't need this for + * the last header. */ + if (g_list_next (walk)) { + do { + size++; + bsize >>= 7; + } while (bsize); + } + /* update hash */ + ident = fnv1_hash_32_update (ident, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + } + + /* packet length is header size + packet length */ + configlen = size + length; + config = data = g_malloc (configlen); + + /* number of packed headers, we only pack 1 header */ + data[0] = 0; + data[1] = 0; + data[2] = 0; + data[3] = 1; + + ident = fnv1_hash_32_to_24 (ident); + rtpvorbispay->payload_ident = ident; + GST_DEBUG_OBJECT (rtpvorbispay, "ident 0x%08x", ident); + + /* take lower 3 bytes */ + data[4] = (ident >> 16) & 0xff; + data[5] = (ident >> 8) & 0xff; + data[6] = ident & 0xff; + + /* store length of all vorbis headers */ + data[7] = ((length) >> 8) & 0xff; + data[8] = (length) & 0xff; + + /* store number of headers minus one. */ + data[9] = n_headers - 1; + data += 10; + + /* store length for each header */ + for (walk = rtpvorbispay->headers; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + guint bsize, size, temp; + guint flag; + + /* only need to store the length when it's not the last header */ + if (!g_list_next (walk)) + break; + + bsize = GST_BUFFER_SIZE (buf); + + /* calc size */ + size = 0; + do { + size++; + bsize >>= 7; + } while (bsize); + temp = size; + + bsize = GST_BUFFER_SIZE (buf); + /* write the size backwards */ + flag = 0; + while (size) { + size--; + data[size] = (bsize & 0x7f) | flag; + bsize >>= 7; + flag = 0x80; /* Flag bit on all bytes of the length except the last */ + } + data += temp; + } + + /* copy header data */ + for (walk = rtpvorbispay->headers; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + + memcpy (data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + data += GST_BUFFER_SIZE (buf); + } + + /* serialize to base64 */ + configuration = g_base64_encode (config, configlen); + g_free (config); + + /* configure payloader settings */ + cstr = g_strdup_printf ("%d", rtpvorbispay->channels); + gst_basertppayload_set_options (basepayload, "audio", TRUE, "VORBIS", + rtpvorbispay->rate); + res = + gst_basertppayload_set_outcaps (basepayload, "encoding-params", + G_TYPE_STRING, cstr, "configuration", G_TYPE_STRING, configuration, NULL); + g_free (cstr); + g_free (configuration); + + return res; + + /* ERRORS */ +no_headers: + { + GST_DEBUG_OBJECT (rtpvorbispay, "finish headers"); + return FALSE; + } +} + +static gboolean +gst_rtp_vorbis_pay_parse_id (GstBaseRTPPayload * basepayload, guint8 * data, + guint size) +{ + GstRtpVorbisPay *rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); + guint8 channels; + gint32 rate, version; + + if (G_UNLIKELY (size < 16)) + goto too_short; + + if (G_UNLIKELY (memcmp (data, "\001vorbis", 7))) + goto invalid_start; + data += 7; + + if (G_UNLIKELY ((version = GST_READ_UINT32_LE (data)) != 0)) + goto invalid_version; + data += 4; + + if (G_UNLIKELY ((channels = *data++) < 1)) + goto invalid_channels; + + if (G_UNLIKELY ((rate = GST_READ_UINT32_LE (data)) < 1)) + goto invalid_rate; + + /* all fine, store the values */ + rtpvorbispay->channels = channels; + rtpvorbispay->rate = rate; + + return TRUE; + + /* ERRORS */ +too_short: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + ("Identification packet is too short, need at least 16, got %d", size), + (NULL)); + return FALSE; + } +invalid_start: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + ("Invalid header start in identification packet"), (NULL)); + return FALSE; + } +invalid_version: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + ("Invalid version, expected 0, got %d", version), (NULL)); + return FALSE; + } +invalid_rate: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + ("Invalid rate %d", rate), (NULL)); + return FALSE; + } +invalid_channels: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + ("Invalid channels %d", channels), (NULL)); + return FALSE; + } +} + +static GstFlowReturn +gst_rtp_vorbis_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) +{ + GstRtpVorbisPay *rtpvorbispay; + GstFlowReturn ret; + guint size, newsize; + guint8 *data; + guint packet_len; + GstClockTime duration, newduration, timestamp; + gboolean flush; + guint8 VDT; + guint plen; + guint8 *ppos, *payload; + gboolean fragmented; + + rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + duration = GST_BUFFER_DURATION (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); + + GST_LOG_OBJECT (rtpvorbispay, "size %u, duration %" GST_TIME_FORMAT, + size, GST_TIME_ARGS (duration)); + + if (G_UNLIKELY (size < 1 || size > 0xffff)) + goto wrong_size; + + /* find packet type */ + if (data[0] & 1) { + /* header */ + if (data[0] == 1) { + /* identification, we need to parse this in order to get the clock rate. */ + if (G_UNLIKELY (!gst_rtp_vorbis_pay_parse_id (basepayload, data, size))) + goto parse_id_failed; + VDT = 1; + } else if (data[0] == 3) { + /* comment */ + VDT = 2; + } else if (data[0] == 5) { + /* setup */ + VDT = 1; + } else + goto unknown_header; + } else + /* data */ + VDT = 0; + + if (rtpvorbispay->need_headers) { + /* we need to collect the headers and construct a config string from them */ + if (VDT != 0) { + GST_DEBUG_OBJECT (rtpvorbispay, "collecting header"); + /* append header to the list of headers */ + rtpvorbispay->headers = g_list_append (rtpvorbispay->headers, buffer); + ret = GST_FLOW_OK; + goto done; + } else { + if (!gst_rtp_vorbis_pay_finish_headers (basepayload)) + goto header_error; + rtpvorbispay->need_headers = FALSE; + } + } + + /* size increases with packet length and 2 bytes size eader. */ + newduration = rtpvorbispay->payload_duration; + if (duration != GST_CLOCK_TIME_NONE) + newduration += duration; + + newsize = rtpvorbispay->payload_pos + 2 + size; + packet_len = gst_rtp_buffer_calc_packet_len (newsize, 0, 0); + + /* check buffer filled against length and max latency */ + flush = gst_basertppayload_is_filled (basepayload, packet_len, newduration); + /* we can store up to 15 vorbis packets in one RTP packet. */ + flush |= (rtpvorbispay->payload_pkts == 15); + /* flush if we have a new VDT */ + if (rtpvorbispay->packet) + flush |= (rtpvorbispay->payload_VDT != VDT); + if (flush) + gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); + + /* create new packet if we must */ + if (!rtpvorbispay->packet) { + gst_rtp_vorbis_pay_init_packet (rtpvorbispay, VDT, timestamp); + } + + payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); + ppos = payload + rtpvorbispay->payload_pos; + fragmented = FALSE; + + ret = GST_FLOW_OK; + + /* put buffer in packet, it either fits completely or needs to be fragmented + * over multiple RTP packets. */ + while (size) { + plen = MIN (rtpvorbispay->payload_left - 2, size); + + GST_LOG_OBJECT (rtpvorbispay, "append %u bytes", plen); + + /* data is copied in the payload with a 2 byte length header */ + ppos[0] = (plen >> 8) & 0xff; + ppos[1] = (plen & 0xff); + memcpy (&ppos[2], data, plen); + + size -= plen; + data += plen; + + rtpvorbispay->payload_pos += plen + 2; + rtpvorbispay->payload_left -= plen + 2; + + if (fragmented) { + if (size == 0) + /* last fragment, set F to 0x3. */ + rtpvorbispay->payload_F = 0x3; + else + /* fragment continues, set F to 0x2. */ + rtpvorbispay->payload_F = 0x2; + } else { + if (size > 0) { + /* fragmented packet starts, set F to 0x1, mark ourselves as + * fragmented. */ + rtpvorbispay->payload_F = 0x1; + fragmented = TRUE; + } + } + if (fragmented) { + /* fragmented packets are always flushed and have ptks of 0 */ + rtpvorbispay->payload_pkts = 0; + ret = gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); + + if (size > 0) { + /* start new packet and get pointers. VDT stays the same. */ + gst_rtp_vorbis_pay_init_packet (rtpvorbispay, + rtpvorbispay->payload_VDT, timestamp); + payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); + ppos = payload + rtpvorbispay->payload_pos; + } + } else { + /* unfragmented packet, update stats for next packet, size == 0 and we + * exit the while loop */ + rtpvorbispay->payload_pkts++; + if (duration != GST_CLOCK_TIME_NONE) + rtpvorbispay->payload_duration += duration; + } + } + gst_buffer_unref (buffer); + +done: + return ret; + + /* ERRORS */ +wrong_size: + { + GST_ELEMENT_WARNING (rtpvorbispay, STREAM, DECODE, + ("Invalid packet size (1 < %d <= 0xffff)", size), (NULL)); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +parse_id_failed: + { + gst_buffer_unref (buffer); + return GST_FLOW_ERROR; + } +unknown_header: + { + GST_ELEMENT_WARNING (rtpvorbispay, STREAM, DECODE, + (NULL), ("Ignoring unknown header received")); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +header_error: + { + GST_ELEMENT_WARNING (rtpvorbispay, STREAM, DECODE, + (NULL), ("Error initializing header config")); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +} + +static gboolean +gst_rtp_vorbis_pay_handle_event (GstPad * pad, GstEvent * event) +{ + GstRtpVorbisPay *rtpvorbispay = GST_RTP_VORBIS_PAY (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_rtp_vorbis_pay_clear_packet (rtpvorbispay); + break; + default: + break; + } + /* false to let parent handle event as well */ + return FALSE; +} + +static GstStateChangeReturn +gst_rtp_vorbis_pay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpVorbisPay *rtpvorbispay; + GstStateChangeReturn ret; + + rtpvorbispay = GST_RTP_VORBIS_PAY (element); + + switch (transition) { + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_vorbis_pay_cleanup (rtpvorbispay); + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_vorbis_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpvorbispay", + GST_RANK_SECONDARY, GST_TYPE_RTP_VORBIS_PAY); +} diff --git a/gst/rtp/gstrtpvorbispay.h b/gst/rtp/gstrtpvorbispay.h new file mode 100644 index 0000000..9c86b5b --- /dev/null +++ b/gst/rtp/gstrtpvorbispay.h @@ -0,0 +1,77 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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_RTP_VORBIS_PAY_H__ +#define __GST_RTP_VORBIS_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_VORBIS_PAY \ + (gst_rtp_vorbis_pay_get_type()) +#define GST_RTP_VORBIS_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VORBIS_PAY,GstRtpVorbisPay)) +#define GST_RTP_VORBIS_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VORBIS_PAY,GstRtpVorbisPayClass)) +#define GST_IS_RTP_VORBIS_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VORBIS_PAY)) +#define GST_IS_RTP_VORBIS_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VORBIS_PAY)) + +typedef struct _GstRtpVorbisPay GstRtpVorbisPay; +typedef struct _GstRtpVorbisPayClass GstRtpVorbisPayClass; + +struct _GstRtpVorbisPay +{ + GstBaseRTPPayload payload; + + /* the headers */ + gboolean need_headers; + GList *headers; + + /* queues of buffers along with some stats. */ + GstBuffer *packet; + guint payload_pos; + guint payload_left; + guint32 payload_ident; + guint8 payload_F; + guint8 payload_VDT; + guint payload_pkts; + GstClockTime payload_timestamp; + GstClockTime payload_duration; + + gint rate; + gint channels; +}; + +struct _GstRtpVorbisPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_vorbis_pay_get_type (void); + +gboolean gst_rtp_vorbis_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_VORBIS_PAY_H__ */ diff --git a/gst/rtp/gstrtpvrawdepay.c b/gst/rtp/gstrtpvrawdepay.c new file mode 100644 index 0000000..a18167c --- /dev/null +++ b/gst/rtp/gstrtpvrawdepay.c @@ -0,0 +1,627 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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 + +#include +#include +#include "gstrtpvrawdepay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpvrawdepay_debug); +#define GST_CAT_DEFAULT (rtpvrawdepay_debug) + +static GstStaticPadTemplate gst_rtp_vraw_depay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-rgb; video/x-raw-yuv") + ); + +static GstStaticPadTemplate gst_rtp_vraw_depay_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"RAW\"") + ); + +GST_BOILERPLATE (GstRtpVRawDepay, gst_rtp_vraw_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); + +static gboolean gst_rtp_vraw_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_vraw_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); + +static GstStateChangeReturn gst_rtp_vraw_depay_change_state (GstElement * + element, GstStateChange transition); + +static gboolean gst_rtp_vraw_depay_handle_event (GstBaseRTPDepayload * filter, + GstEvent * event); + +static void +gst_rtp_vraw_depay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_vraw_depay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_vraw_depay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP Raw Video depayloader", "Codec/Depayloader/Network/RTP", + "Extracts raw video from RTP packets (RFC 4175)", + "Wim Taymans "); +} + +static void +gst_rtp_vraw_depay_class_init (GstRtpVRawDepayClass * klass) +{ + GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + + gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; + + gstelement_class->change_state = gst_rtp_vraw_depay_change_state; + + gstbasertpdepayload_class->set_caps = gst_rtp_vraw_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_vraw_depay_process; + gstbasertpdepayload_class->handle_event = gst_rtp_vraw_depay_handle_event; + + GST_DEBUG_CATEGORY_INIT (rtpvrawdepay_debug, "rtpvrawdepay", 0, + "raw video RTP Depayloader"); +} + +static void +gst_rtp_vraw_depay_init (GstRtpVRawDepay * rtpvrawdepay, + GstRtpVRawDepayClass * klass) +{ + /* needed because of GST_BOILERPLATE */ +} + +static void +gst_rtp_vraw_depay_reset (GstRtpVRawDepay * rtpvrawdepay) +{ + if (rtpvrawdepay->outbuf) { + gst_buffer_unref (rtpvrawdepay->outbuf); + rtpvrawdepay->outbuf = NULL; + } + rtpvrawdepay->timestamp = -1; +} + +static gboolean +gst_rtp_vraw_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +{ + GstStructure *structure; + GstRtpVRawDepay *rtpvrawdepay; + gint clock_rate; + const gchar *str, *type; + gint format, width, height, pgroup, xinc, yinc; + guint ystride, uvstride, yp, up, vp, outsize; + GstCaps *srccaps; + guint32 fourcc = 0; + gboolean res; + gint rmask = 0, gmask = 0, bmask = 0, amask = 0, bpp = 0, depth = 0; + + rtpvrawdepay = GST_RTP_VRAW_DEPAY (depayload); + + structure = gst_caps_get_structure (caps, 0); + + yp = up = vp = uvstride = 0; + xinc = yinc = 1; + + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + depayload->clock_rate = clock_rate; + + if (!(str = gst_structure_get_string (structure, "width"))) + goto no_width; + width = atoi (str); + + if (!(str = gst_structure_get_string (structure, "height"))) + goto no_height; + height = atoi (str); + + /* optional interlace value but we don't handle interlaced + * formats yet */ + if (gst_structure_get_string (structure, "interlace")) + goto interlaced; + + if (!(str = gst_structure_get_string (structure, "sampling"))) + goto no_sampling; + + if (!strcmp (str, "RGB")) { + format = GST_VIDEO_FORMAT_RGB; + pgroup = 3; + ystride = GST_ROUND_UP_4 (width * 3); + outsize = ystride * height; + type = "video/x-raw-rgb"; + rmask = 0x00ff0000; + gmask = 0x0000ff00; + bmask = 0x000000ff; + depth = 24; + bpp = 24; + } else if (!strcmp (str, "RGBA")) { + format = GST_VIDEO_FORMAT_RGBA; + pgroup = 4; + ystride = width * 4; + outsize = ystride * height; + type = "video/x-raw-rgb"; + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x000000ff; + depth = 32; + bpp = 32; + } else if (!strcmp (str, "BGR")) { + format = GST_VIDEO_FORMAT_BGR; + pgroup = 3; + ystride = GST_ROUND_UP_4 (width * 3); + outsize = ystride * height; + type = "video/x-raw-rgb"; + rmask = 0x000000ff; + gmask = 0x0000ff00; + bmask = 0x00ff0000; + depth = 24; + bpp = 24; + } else if (!strcmp (str, "BGRA")) { + format = GST_VIDEO_FORMAT_BGRA; + pgroup = 4; + ystride = width * 4; + outsize = ystride * height; + type = "video/x-raw-rgb"; + rmask = 0x0000ff00; + gmask = 0x00ff0000; + bmask = 0xff000000; + amask = 0x000000ff; + depth = 32; + bpp = 32; + } else if (!strcmp (str, "YCbCr-4:4:4")) { + format = GST_VIDEO_FORMAT_AYUV; + pgroup = 3; + ystride = width * 4; + outsize = ystride * height; + type = "video/x-raw-yuv"; + fourcc = GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'); + } else if (!strcmp (str, "YCbCr-4:2:2")) { + format = GST_VIDEO_FORMAT_UYVY; + pgroup = 4; + ystride = GST_ROUND_UP_2 (width) * 2; + outsize = ystride * height; + type = "video/x-raw-yuv"; + fourcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); + xinc = 2; + } else if (!strcmp (str, "YCbCr-4:2:0")) { + format = GST_VIDEO_FORMAT_I420; + pgroup = 6; + ystride = GST_ROUND_UP_4 (width); + uvstride = GST_ROUND_UP_8 (width) / 2; + up = ystride * GST_ROUND_UP_2 (height); + vp = up + uvstride * GST_ROUND_UP_2 (height) / 2; + outsize = vp + uvstride * GST_ROUND_UP_2 (height) / 2; + type = "video/x-raw-yuv"; + fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0'); + xinc = yinc = 2; + } else if (!strcmp (str, "YCbCr-4:1:1")) { + format = GST_VIDEO_FORMAT_Y41B; + pgroup = 6; + ystride = GST_ROUND_UP_4 (width); + uvstride = GST_ROUND_UP_8 (width) / 4; + up = ystride * height; + vp = up + uvstride * height; + outsize = vp + uvstride * height; + type = "video/x-raw-yuv"; + fourcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B'); + xinc = 4; + } else + goto unknown_format; + + rtpvrawdepay->width = width; + rtpvrawdepay->height = height; + rtpvrawdepay->format = format; + rtpvrawdepay->yp = yp; + rtpvrawdepay->up = up; + rtpvrawdepay->vp = vp; + rtpvrawdepay->pgroup = pgroup; + rtpvrawdepay->xinc = xinc; + rtpvrawdepay->yinc = yinc; + rtpvrawdepay->ystride = ystride; + rtpvrawdepay->uvstride = uvstride; + rtpvrawdepay->outsize = outsize; + + srccaps = gst_caps_new_simple (type, + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + "format", GST_TYPE_FOURCC, fourcc, + "framerate", GST_TYPE_FRACTION, 0, 1, NULL); + + if (!strcmp (type, "video/x-raw-rgb")) { + gst_caps_set_simple (srccaps, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "red_mask", G_TYPE_INT, rmask, + "green_mask", G_TYPE_INT, gmask, + "blue_mask", G_TYPE_INT, bmask, + "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, NULL); + + if (amask > 0) { + gst_caps_set_simple (srccaps, "alpha_mask", G_TYPE_INT, amask, NULL); + } + } + + res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + gst_caps_unref (srccaps); + + GST_DEBUG_OBJECT (depayload, "width %d, height %d, format %d", width, height, + format); + GST_DEBUG_OBJECT (depayload, "yp %d, up %d, vp %d", yp, up, vp); + GST_DEBUG_OBJECT (depayload, "xinc %d, yinc %d", xinc, yinc); + GST_DEBUG_OBJECT (depayload, "pgroup %d, ystride %d, uvstride %d", pgroup, + ystride, uvstride); + GST_DEBUG_OBJECT (depayload, "outsize %u", outsize); + + return res; + + /* ERRORS */ +no_width: + { + GST_ERROR_OBJECT (depayload, "no width specified"); + return FALSE; + } +no_height: + { + GST_ERROR_OBJECT (depayload, "no height specified"); + return FALSE; + } +interlaced: + { + GST_ERROR_OBJECT (depayload, "interlaced formats not supported yet"); + return FALSE; + } +no_sampling: + { + GST_ERROR_OBJECT (depayload, "no sampling specified"); + return FALSE; + } +unknown_format: + { + GST_ERROR_OBJECT (depayload, "unknown sampling format '%s'", str); + return FALSE; + } +} + +static GstBuffer * +gst_rtp_vraw_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +{ + GstRtpVRawDepay *rtpvrawdepay; + guint8 *payload, *data, *yp, *up, *vp, *headers; + guint32 timestamp; + guint cont, ystride, uvstride, pgroup, payload_len; + gint width, height, xinc, yinc; + + rtpvrawdepay = GST_RTP_VRAW_DEPAY (depayload); + + timestamp = gst_rtp_buffer_get_timestamp (buf); + + if (timestamp != rtpvrawdepay->timestamp || rtpvrawdepay->outbuf == NULL) { + GstBuffer *outbuf; + GstFlowReturn ret; + + GST_LOG_OBJECT (depayload, "new frame with timestamp %u", timestamp); + /* new timestamp, flush old buffer and create new output buffer */ + if (rtpvrawdepay->outbuf) { + gst_base_rtp_depayload_push_ts (depayload, rtpvrawdepay->timestamp, + rtpvrawdepay->outbuf); + rtpvrawdepay->outbuf = NULL; + } + + ret = gst_pad_alloc_buffer (depayload->srcpad, -1, rtpvrawdepay->outsize, + GST_PAD_CAPS (depayload->srcpad), &outbuf); + if (ret != GST_FLOW_OK) + goto alloc_failed; + + /* clear timestamp from alloc... */ + GST_BUFFER_TIMESTAMP (outbuf) = -1; + + rtpvrawdepay->outbuf = outbuf; + rtpvrawdepay->timestamp = timestamp; + } + + data = GST_BUFFER_DATA (rtpvrawdepay->outbuf); + + /* get pointer and strides of the planes */ + yp = data + rtpvrawdepay->yp; + up = data + rtpvrawdepay->up; + vp = data + rtpvrawdepay->vp; + + ystride = rtpvrawdepay->ystride; + uvstride = rtpvrawdepay->uvstride; + pgroup = rtpvrawdepay->pgroup; + width = rtpvrawdepay->width; + height = rtpvrawdepay->height; + xinc = rtpvrawdepay->xinc; + yinc = rtpvrawdepay->yinc; + + payload = gst_rtp_buffer_get_payload (buf); + payload_len = gst_rtp_buffer_get_payload_len (buf); + + if (payload_len < 3) + goto short_packet; + + /* skip extended seqnum */ + payload += 2; + payload_len -= 2; + + /* remember header position */ + headers = payload; + + /* find data start */ + do { + if (payload_len < 6) + goto short_packet; + + cont = payload[4] & 0x80; + + payload += 6; + payload_len -= 6; + } while (cont); + + while (TRUE) { + guint length, line, offs, plen; + guint8 *datap; + + /* stop when we run out of data */ + if (payload_len == 0) + break; + + /* read length and cont. This should work because we iterated the headers + * above. */ + length = (headers[0] << 8) | headers[1]; + line = ((headers[2] & 0x7f) << 8) | headers[3]; + offs = ((headers[4] & 0x7f) << 8) | headers[5]; + cont = headers[4] & 0x80; + headers += 6; + + /* length must be a multiple of pgroup */ + if (length % pgroup != 0) + goto wrong_length; + + if (length > payload_len) + length = payload_len; + + /* sanity check */ + if (line > (height - yinc)) { + GST_WARNING_OBJECT (depayload, "skipping line %d: out of range", line); + goto next; + } + if (offs > (width - xinc)) { + GST_WARNING_OBJECT (depayload, "skipping offset %d: out of range", offs); + goto next; + } + + /* calculate the maximim amount of bytes we can use per line */ + if (offs + ((length / pgroup) * xinc) > width) { + plen = ((width - offs) * pgroup) / xinc; + GST_WARNING_OBJECT (depayload, "clipping length %d, offset %d, plen %d", + length, offs, plen); + } else + plen = length; + + GST_LOG_OBJECT (depayload, + "writing length %u/%u, line %u, offset %u, remaining %u", plen, length, + line, offs, payload_len); + + switch (rtpvrawdepay->format) { + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGR: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_UYVY: + /* samples are packed just like gstreamer packs them */ + offs /= xinc; + datap = yp + (line * ystride) + (offs * pgroup); + + memcpy (datap, payload, plen); + break; + case GST_VIDEO_FORMAT_AYUV: + { + gint i; + guint8 *p; + + datap = yp + (line * ystride) + (offs * 4); + p = payload; + + /* samples are packed in order Cb-Y-Cr for both interlaced and + * progressive frames */ + for (i = 0; i < plen; i += pgroup) { + *datap++ = 0; + *datap++ = p[1]; + *datap++ = p[0]; + *datap++ = p[2]; + p += pgroup; + } + break; + } + case GST_VIDEO_FORMAT_I420: + { + gint i; + guint uvoff; + guint8 *yd1p, *yd2p, *udp, *vdp, *p; + + yd1p = yp + (line * ystride) + (offs); + yd2p = yd1p + ystride; + uvoff = (line / yinc * uvstride) + (offs / xinc); + + udp = up + uvoff; + vdp = vp + uvoff; + p = payload; + + /* line 0/1: Y00-Y01-Y10-Y11-Cb00-Cr00 Y02-Y03-Y12-Y13-Cb01-Cr01 ... */ + for (i = 0; i < plen; i += pgroup) { + *yd1p++ = p[0]; + *yd1p++ = p[1]; + *yd2p++ = p[2]; + *yd2p++ = p[3]; + *udp++ = p[4]; + *vdp++ = p[5]; + p += pgroup; + } + break; + } + case GST_VIDEO_FORMAT_Y41B: + { + gint i; + guint uvoff; + guint8 *ydp, *udp, *vdp, *p; + + ydp = yp + (line * ystride) + (offs); + uvoff = (line / yinc * uvstride) + (offs / xinc); + + udp = up + uvoff; + vdp = vp + uvoff; + p = payload; + + /* Samples are packed in order Cb0-Y0-Y1-Cr0-Y2-Y3 for both interlaced + * and progressive scan lines */ + for (i = 0; i < plen; i += pgroup) { + *udp++ = p[0]; + *ydp++ = p[1]; + *ydp++ = p[2]; + *vdp++ = p[3]; + *ydp++ = p[4]; + *ydp++ = p[5]; + p += pgroup; + } + break; + } + default: + goto unknown_sampling; + } + + next: + if (!cont) + break; + + payload += length; + payload_len -= length; + } + + if (gst_rtp_buffer_get_marker (buf)) { + GST_LOG_OBJECT (depayload, "marker, flushing frame"); + if (rtpvrawdepay->outbuf) { + gst_base_rtp_depayload_push_ts (depayload, timestamp, + rtpvrawdepay->outbuf); + rtpvrawdepay->outbuf = NULL; + } + rtpvrawdepay->timestamp = -1; + } + return NULL; + + /* ERRORS */ +unknown_sampling: + { + GST_ELEMENT_ERROR (depayload, STREAM, FORMAT, + (NULL), ("unimplemented sampling")); + return NULL; + } +alloc_failed: + { + GST_WARNING_OBJECT (depayload, "failed to alloc output buffer"); + return NULL; + } +wrong_length: + { + GST_WARNING_OBJECT (depayload, "length not multiple of pgroup"); + return NULL; + } +short_packet: + { + GST_WARNING_OBJECT (depayload, "short packet"); + return NULL; + } +} + +static gboolean +gst_rtp_vraw_depay_handle_event (GstBaseRTPDepayload * filter, GstEvent * event) +{ + gboolean ret; + GstRtpVRawDepay *rtpvrawdepay; + + rtpvrawdepay = GST_RTP_VRAW_DEPAY (filter); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_rtp_vraw_depay_reset (rtpvrawdepay); + break; + default: + break; + } + + ret = + GST_BASE_RTP_DEPAYLOAD_CLASS (parent_class)->handle_event (filter, event); + + return ret; +} + +static GstStateChangeReturn +gst_rtp_vraw_depay_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpVRawDepay *rtpvrawdepay; + GstStateChangeReturn ret; + + rtpvrawdepay = GST_RTP_VRAW_DEPAY (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_rtp_vraw_depay_reset (rtpvrawdepay); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtp_vraw_depay_reset (rtpvrawdepay); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +gboolean +gst_rtp_vraw_depay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpvrawdepay", + GST_RANK_SECONDARY, GST_TYPE_RTP_VRAW_DEPAY); +} diff --git a/gst/rtp/gstrtpvrawdepay.h b/gst/rtp/gstrtpvrawdepay.h new file mode 100644 index 0000000..77cb6bf --- /dev/null +++ b/gst/rtp/gstrtpvrawdepay.h @@ -0,0 +1,72 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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_RTP_VRAW_DEPAY_H__ +#define __GST_RTP_VRAW_DEPAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_VRAW_DEPAY \ + (gst_rtp_vraw_depay_get_type()) +#define GST_RTP_VRAW_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VRAW_DEPAY,GstRtpVRawDepay)) +#define GST_RTP_VRAW_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VRAW_DEPAY,GstRtpVRawDepayClass)) +#define GST_IS_RTP_VRAW_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VRAW_DEPAY)) +#define GST_IS_RTP_VRAW_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VRAW_DEPAY)) + +typedef struct _GstRtpVRawDepay GstRtpVRawDepay; +typedef struct _GstRtpVRawDepayClass GstRtpVRawDepayClass; + +struct _GstRtpVRawDepay +{ + GstBaseRTPDepayload payload; + + gint width, height; + GstVideoFormat format; + + GstBuffer *outbuf; + guint32 timestamp; + guint outsize; + + gint pgroup; + gint xinc, yinc; + guint yp, up, vp; + gint ystride; + gint uvstride; +}; + +struct _GstRtpVRawDepayClass +{ + GstBaseRTPDepayloadClass parent_class; +}; + +GType gst_rtp_vraw_depay_get_type (void); + +gboolean gst_rtp_vraw_depay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_VRAW_DEPAY_H__ */ diff --git a/gst/rtp/gstrtpvrawpay.c b/gst/rtp/gstrtpvrawpay.c new file mode 100644 index 0000000..7228ea8 --- /dev/null +++ b/gst/rtp/gstrtpvrawpay.c @@ -0,0 +1,639 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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 + +#include + +#include "gstrtpvrawpay.h" + +GST_DEBUG_CATEGORY_STATIC (rtpvrawpay_debug); +#define GST_CAT_DEFAULT (rtpvrawpay_debug) + +static GstStaticPadTemplate gst_rtp_vraw_pay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-rgb, " + "bpp = (int) 24, " + "depth = (int) 24, " + "endianness = (int) BIG_ENDIAN, " + "red_mask = (int) 0x00FF0000, " + "green_mask = (int) 0x0000FF00, " + "blue_mask = (int) 0x000000FF, " + "width = (int) [ 1, 32767 ], " + "height = (int) [ 1, 32767 ]; " + "video/x-raw-rgb, " + "bpp = (int) 32, " + "depth = (int) 32, " + "endianness = (int) BIG_ENDIAN, " + "red_mask = (int) 0xFF000000, " + "green_mask = (int) 0x00FF0000, " + "blue_mask = (int) 0x0000FF00, " + "alpha_mask = (int) 0x000000FF, " + "width = (int) [ 1, 32767 ], " + "height = (int) [ 1, 32767 ]; " + "video/x-raw-rgb, " + "bpp = (int) 24, " + "depth = (int) 24, " + "endianness = (int) BIG_ENDIAN, " + "red_mask = (int) 0x000000FF, " + "green_mask = (int) 0x0000FF00, " + "blue_mask = (int) 0x00FF0000, " + "width = (int) [ 1, 32767 ], " + "height = (int) [ 1, 32767 ]; " + "video/x-raw-rgb, " + "bpp = (int) 32, " + "depth = (int) 32, " + "endianness = (int) BIG_ENDIAN, " + "red_mask = (int) 0x0000FF00, " + "green_mask = (int) 0x00FF0000, " + "blue_mask = (int) 0xFF000000, " + "alpha_mask = (int) 0x000000FF, " + "width = (int) [ 1, 32767 ], " + "height = (int) [ 1, 32767 ]; " + "video/x-raw-yuv, " + "format = (fourcc) { AYUV, UYVY, I420, Y41B, UYVP }, " + "width = (int) [ 1, 32767 ], " "height = (int) [ 1, 32767 ]; ") + ); + +static GstStaticPadTemplate gst_rtp_vraw_pay_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 90000, " + "encoding-name = (string) \"RAW\"," + "sampling = (string) { \"RGB\", \"RGBA\", \"BGR\", \"BGRA\", " + "\"YCbCr-4:4:4\", \"YCbCr-4:2:2\", \"YCbCr-4:2:0\", " + "\"YCbCr-4:1:1\" }," + /* we cannot express these as strings + * "width = (string) [1 32767]," + * "height = (string) [1 32767]," + */ + "depth = (string) { \"8\", \"10\", \"12\", \"16\" }," + "colorimetry = (string) { \"BT601-5\", \"BT709-2\", \"SMPTE240M\" }" + /* optional + * interlace = + * top-field-first = + * chroma-position = (string) + * gamma = (float) + */ + ) + ); + +static gboolean gst_rtp_vraw_pay_setcaps (GstBaseRTPPayload * payload, + GstCaps * caps); +static GstFlowReturn gst_rtp_vraw_pay_handle_buffer (GstBaseRTPPayload * + payload, GstBuffer * buffer); + +GST_BOILERPLATE (GstRtpVRawPay, gst_rtp_vraw_pay, GstBaseRTPPayload, + GST_TYPE_BASE_RTP_PAYLOAD) + + static void gst_rtp_vraw_pay_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_vraw_pay_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_vraw_pay_sink_template); + + gst_element_class_set_details_simple (element_class, + "RTP Raw Video payloader", "Codec/Payloader/Network/RTP", + "Payload raw video as RTP packets (RFC 4175)", + "Wim Taymans "); +} + +static void +gst_rtp_vraw_pay_class_init (GstRtpVRawPayClass * klass) +{ + GstBaseRTPPayloadClass *gstbasertppayload_class; + + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + + gstbasertppayload_class->set_caps = gst_rtp_vraw_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_vraw_pay_handle_buffer; + + GST_DEBUG_CATEGORY_INIT (rtpvrawpay_debug, "rtpvrawpay", 0, + "Raw video RTP Payloader"); +} + +static void +gst_rtp_vraw_pay_init (GstRtpVRawPay * rtpvrawpay, GstRtpVRawPayClass * klass) +{ +} + +static gboolean +gst_rtp_vraw_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +{ + GstRtpVRawPay *rtpvrawpay; + GstStructure *s; + gboolean res; + const gchar *name; + gint width, height; + gint yp, up, vp; + gint pgroup, ystride, uvstride = 0, xinc, yinc; + GstVideoFormat sampling; + const gchar *depthstr, *samplingstr, *colorimetrystr; + gchar *wstr, *hstr; + gboolean interlaced; + const gchar *color_matrix; + gint depth; + + rtpvrawpay = GST_RTP_VRAW_PAY (payload); + + s = gst_caps_get_structure (caps, 0); + + /* start parsing the format */ + name = gst_structure_get_name (s); + + /* these values are the only thing we can do */ + depthstr = "8"; + + /* parse common width/height */ + res = gst_structure_get_int (s, "width", &width); + res &= gst_structure_get_int (s, "height", &height); + if (!res) + goto missing_dimension; + + if (!gst_structure_get_boolean (s, "interlaced", &interlaced)) + interlaced = FALSE; + + color_matrix = gst_structure_get_string (s, "color-matrix"); + colorimetrystr = "SMPTE240M"; + if (color_matrix) { + if (g_str_equal (color_matrix, "sdtv")) { + /* BT.601 implies a bit more than just color-matrix */ + colorimetrystr = "BT601-5"; + } else if (g_str_equal (color_matrix, "hdtv")) { + colorimetrystr = "BT709-2"; + } + } + + yp = up = vp = 0; + xinc = yinc = 1; + + if (!strcmp (name, "video/x-raw-rgb")) { + gint amask, rmask; + gboolean has_alpha; + + has_alpha = gst_structure_get_int (s, "alpha_mask", &amask); + depth = 8; + + if (!gst_structure_get_int (s, "red_mask", &rmask)) + goto unknown_mask; + + if (has_alpha) { + pgroup = 4; + ystride = width * 4; + if (rmask == 0xFF000000) { + sampling = GST_VIDEO_FORMAT_RGBA; + samplingstr = "RGBA"; + } else { + sampling = GST_VIDEO_FORMAT_BGRA; + samplingstr = "BGRA"; + } + } else { + pgroup = 3; + ystride = GST_ROUND_UP_4 (width * 3); + if (rmask == 0x00FF0000) { + sampling = GST_VIDEO_FORMAT_RGB; + samplingstr = "RGB"; + } else { + sampling = GST_VIDEO_FORMAT_BGR; + samplingstr = "BGR"; + } + } + } else if (!strcmp (name, "video/x-raw-yuv")) { + guint32 fourcc; + + if (!gst_structure_get_fourcc (s, "format", &fourcc)) + goto unknown_fourcc; + + GST_LOG_OBJECT (payload, "have fourcc %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (fourcc)); + + switch (fourcc) { + case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): + sampling = GST_VIDEO_FORMAT_AYUV; + samplingstr = "YCbCr-4:4:4"; + pgroup = 3; + ystride = width * 4; + depth = 8; + break; + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + sampling = GST_VIDEO_FORMAT_UYVY; + samplingstr = "YCbCr-4:2:2"; + pgroup = 4; + xinc = 2; + ystride = GST_ROUND_UP_2 (width) * 2; + depth = 8; + break; + case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): + sampling = GST_VIDEO_FORMAT_Y41B; + samplingstr = "YCbCr-4:1:1"; + pgroup = 6; + xinc = 4; + ystride = GST_ROUND_UP_4 (width); + uvstride = GST_ROUND_UP_8 (width) / 4; + up = ystride * height; + vp = up + uvstride * height; + depth = 8; + break; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + sampling = GST_VIDEO_FORMAT_I420; + samplingstr = "YCbCr-4:2:0"; + pgroup = 6; + xinc = yinc = 2; + ystride = GST_ROUND_UP_4 (width); + uvstride = GST_ROUND_UP_8 (width) / 2; + up = ystride * GST_ROUND_UP_2 (height); + vp = up + uvstride * GST_ROUND_UP_2 (height) / 2; + depth = 8; + break; + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'): +#define GST_VIDEO_FORMAT_UYVP GST_VIDEO_FORMAT_UYVY /* FIXME */ + sampling = GST_VIDEO_FORMAT_UYVP; + samplingstr = "YCbCr-4:2:2"; + pgroup = 4; + xinc = 2; + ystride = GST_ROUND_UP_2 (width) * 2; + depth = 10; + break; + default: + goto unknown_fourcc; + } + } else + goto unknown_format; + + if (interlaced) { + yinc *= 2; + } + if (depth == 10) { + depthstr = "10"; + } + + rtpvrawpay->width = width; + rtpvrawpay->height = height; + rtpvrawpay->sampling = sampling; + rtpvrawpay->pgroup = pgroup; + rtpvrawpay->xinc = xinc; + rtpvrawpay->yinc = yinc; + rtpvrawpay->yp = yp; + rtpvrawpay->up = up; + rtpvrawpay->vp = vp; + rtpvrawpay->ystride = ystride; + rtpvrawpay->uvstride = uvstride; + rtpvrawpay->interlaced = interlaced; + rtpvrawpay->depth = depth; + + GST_DEBUG_OBJECT (payload, "width %d, height %d, sampling %d", width, height, + sampling); + GST_DEBUG_OBJECT (payload, "yp %d, up %d, vp %d", yp, up, vp); + GST_DEBUG_OBJECT (payload, "pgroup %d, ystride %d, uvstride %d", pgroup, + ystride, uvstride); + + wstr = g_strdup_printf ("%d", rtpvrawpay->width); + hstr = g_strdup_printf ("%d", rtpvrawpay->height); + + gst_basertppayload_set_options (payload, "video", TRUE, "RAW", 90000); + if (interlaced) { + res = gst_basertppayload_set_outcaps (payload, "sampling", G_TYPE_STRING, + samplingstr, "depth", G_TYPE_STRING, depthstr, "width", G_TYPE_STRING, + wstr, "height", G_TYPE_STRING, hstr, "colorimetry", G_TYPE_STRING, + colorimetrystr, "interlace", G_TYPE_STRING, "true", NULL); + } else { + res = gst_basertppayload_set_outcaps (payload, "sampling", G_TYPE_STRING, + samplingstr, "depth", G_TYPE_STRING, depthstr, "width", G_TYPE_STRING, + wstr, "height", G_TYPE_STRING, hstr, "colorimetry", G_TYPE_STRING, + colorimetrystr, NULL); + } + g_free (wstr); + g_free (hstr); + + return res; + + /* ERRORS */ +unknown_mask: + { + GST_ERROR_OBJECT (payload, "unknown red mask specified"); + return FALSE; + } +unknown_format: + { + GST_ERROR_OBJECT (payload, "unknown caps format"); + return FALSE; + } +unknown_fourcc: + { + GST_ERROR_OBJECT (payload, "invalid or missing fourcc"); + return FALSE; + } +missing_dimension: + { + GST_ERROR_OBJECT (payload, "missing width or height property"); + return FALSE; + } +} + +static GstFlowReturn +gst_rtp_vraw_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer) +{ + GstRtpVRawPay *rtpvrawpay; + GstFlowReturn ret = GST_FLOW_OK; + guint line, offset; + guint8 *data, *yp, *up, *vp; + guint ystride, uvstride; + guint size, pgroup; + guint mtu; + guint width, height; + gint field; + + rtpvrawpay = GST_RTP_VRAW_PAY (payload); + + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + GST_LOG_OBJECT (rtpvrawpay, "new frame of %u bytes", size); + + /* get pointer and strides of the planes */ + yp = data + rtpvrawpay->yp; + up = data + rtpvrawpay->up; + vp = data + rtpvrawpay->vp; + + ystride = rtpvrawpay->ystride; + uvstride = rtpvrawpay->uvstride; + + mtu = GST_BASE_RTP_PAYLOAD_MTU (payload); + + /* amount of bytes for one pixel */ + pgroup = rtpvrawpay->pgroup; + width = rtpvrawpay->width; + height = rtpvrawpay->height; + + /* start with line 0, offset 0 */ + + for (field = 0; field < 1 + rtpvrawpay->interlaced; field++) { + line = field; + offset = 0; + + /* write all lines */ + while (line < height) { + guint left; + GstBuffer *out; + guint8 *outdata, *headers; + gboolean next_line; + guint length, cont, pixels; + + /* get the max allowed payload length size, we try to fill the complete MTU */ + left = gst_rtp_buffer_calc_payload_len (mtu, 0, 0); + out = gst_rtp_buffer_new_allocate (left, 0, 0); + + if (field == 0) { + GST_BUFFER_TIMESTAMP (out) = GST_BUFFER_TIMESTAMP (buffer); + } else { + GST_BUFFER_TIMESTAMP (out) = GST_BUFFER_TIMESTAMP (buffer) + + GST_BUFFER_DURATION (buffer) / 2; + } + + outdata = gst_rtp_buffer_get_payload (out); + + GST_LOG_OBJECT (rtpvrawpay, "created buffer of size %u for MTU %u", left, + mtu); + + /* + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Extended Sequence Number | Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |F| Line No |C| Offset | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Length |F| Line No | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |C| Offset | . + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ . + * . . + * . Two (partial) lines of video data . + * . . + * +---------------------------------------------------------------+ + */ + + /* need 2 bytes for the extended sequence number */ + *outdata++ = 0; + *outdata++ = 0; + left -= 2; + + /* the headers start here */ + headers = outdata; + + /* while we can fit at least one header and one pixel */ + while (left > (6 + pgroup)) { + /* we need a 6 bytes header */ + left -= 6; + + /* get how may bytes we need for the remaining pixels */ + pixels = width - offset; + length = (pixels * pgroup) / rtpvrawpay->xinc; + + if (left >= length) { + /* pixels and header fit completely, we will write them and skip to the + * next line. */ + next_line = TRUE; + } else { + /* line does not fit completely, see how many pixels fit */ + pixels = (left / pgroup) * rtpvrawpay->xinc; + length = (pixels * pgroup) / rtpvrawpay->xinc; + next_line = FALSE; + } + GST_LOG_OBJECT (rtpvrawpay, "filling %u bytes in %u pixels", length, + pixels); + left -= length; + + /* write length */ + *outdata++ = (length >> 8) & 0xff; + *outdata++ = length & 0xff; + + /* write line no */ + *outdata++ = ((line >> 8) & 0x7f) | ((field << 7) & 0x80); + *outdata++ = line & 0xff; + + if (next_line) { + /* go to next line we do this here to make the check below easier */ + line += rtpvrawpay->yinc; + } + + /* calculate continuation marker */ + cont = (left > (6 + pgroup) && line < height) ? 0x80 : 0x00; + + /* write offset and continuation marker */ + *outdata++ = ((offset >> 8) & 0x7f) | cont; + *outdata++ = offset & 0xff; + + if (next_line) { + /* reset offset */ + offset = 0; + GST_LOG_OBJECT (rtpvrawpay, "go to next line %u", line); + } else { + offset += pixels; + GST_LOG_OBJECT (rtpvrawpay, "next offset %u", offset); + } + + if (!cont) + break; + } + GST_LOG_OBJECT (rtpvrawpay, "consumed %u bytes", + (guint) (outdata - headers)); + + /* second pass, read headers and write the data */ + while (TRUE) { + guint offs, lin; + + /* read length and cont */ + length = (headers[0] << 8) | headers[1]; + lin = ((headers[2] & 0x7f) << 8) | headers[3]; + offs = ((headers[4] & 0x7f) << 8) | headers[5]; + cont = headers[4] & 0x80; + pixels = length / pgroup; + headers += 6; + + GST_LOG_OBJECT (payload, + "writing length %u, line %u, offset %u, cont %d", length, lin, offs, + cont); + + switch (rtpvrawpay->sampling) { + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGR: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_UYVY: + offs /= rtpvrawpay->xinc; + memcpy (outdata, yp + (lin * ystride) + (offs * pgroup), length); + outdata += length; + break; + case GST_VIDEO_FORMAT_AYUV: + { + gint i; + guint8 *datap; + + datap = yp + (lin * ystride) + (offs * 4); + + for (i = 0; i < pixels; i++) { + *outdata++ = datap[2]; + *outdata++ = datap[1]; + *outdata++ = datap[3]; + datap += 4; + } + break; + } + case GST_VIDEO_FORMAT_I420: + { + gint i; + guint uvoff; + guint8 *yd1p, *yd2p, *udp, *vdp; + + yd1p = yp + (lin * ystride) + (offs); + yd2p = yd1p + ystride; + uvoff = + (lin / rtpvrawpay->yinc * uvstride) + (offs / rtpvrawpay->xinc); + udp = up + uvoff; + vdp = vp + uvoff; + + for (i = 0; i < pixels; i++) { + *outdata++ = *yd1p++; + *outdata++ = *yd1p++; + *outdata++ = *yd2p++; + *outdata++ = *yd2p++; + *outdata++ = *udp++; + *outdata++ = *vdp++; + } + break; + } + case GST_VIDEO_FORMAT_Y41B: + { + gint i; + guint uvoff; + guint8 *ydp, *udp, *vdp; + + ydp = yp + (lin * ystride) + offs; + uvoff = + (lin / rtpvrawpay->yinc * uvstride) + (offs / rtpvrawpay->xinc); + udp = up + uvoff; + vdp = vp + uvoff; + + for (i = 0; i < pixels; i++) { + *outdata++ = *udp++; + *outdata++ = *ydp++; + *outdata++ = *ydp++; + *outdata++ = *vdp++; + *outdata++ = *ydp++; + *outdata++ = *ydp++; + } + break; + } + default: + gst_buffer_unref (out); + goto unknown_sampling; + } + + if (!cont) + break; + } + + if (line >= height) { + GST_LOG_OBJECT (rtpvrawpay, "field/frame complete, set marker"); + gst_rtp_buffer_set_marker (out, TRUE); + } + if (left > 0) { + GST_LOG_OBJECT (rtpvrawpay, "we have %u bytes left", left); + GST_BUFFER_SIZE (out) -= left; + } + + /* push buffer */ + ret = gst_basertppayload_push (payload, out); + } + + } + gst_buffer_unref (buffer); + + return ret; + + /* ERRORS */ +unknown_sampling: + { + GST_ELEMENT_ERROR (payload, STREAM, FORMAT, + (NULL), ("unimplemented sampling")); + gst_buffer_unref (buffer); + return GST_FLOW_NOT_SUPPORTED; + } +} + +gboolean +gst_rtp_vraw_pay_plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "rtpvrawpay", + GST_RANK_SECONDARY, GST_TYPE_RTP_VRAW_PAY); +} diff --git a/gst/rtp/gstrtpvrawpay.h b/gst/rtp/gstrtpvrawpay.h new file mode 100644 index 0000000..0e6adf4 --- /dev/null +++ b/gst/rtp/gstrtpvrawpay.h @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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_RTP_VRAW_PAY_H__ +#define __GST_RTP_VRAW_PAY_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_VRAW_PAY \ + (gst_rtp_vraw_pay_get_type()) +#define GST_RTP_VRAW_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VRAW_PAY,GstRtpVRawPay)) +#define GST_RTP_VRAW_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VRAW_PAY,GstRtpVRawPayClass)) +#define GST_IS_RTP_VRAW_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VRAW_PAY)) +#define GST_IS_RTP_VRAW_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VRAW_PAY)) + +typedef struct _GstRtpVRawPay GstRtpVRawPay; +typedef struct _GstRtpVRawPayClass GstRtpVRawPayClass; + +struct _GstRtpVRawPay +{ + GstBaseRTPPayload payload; + + gint width, height; + GstVideoFormat sampling; + + gint pgroup; + gint xinc, yinc; + guint yp, up, vp; + gint ystride; + gint uvstride; + gboolean interlaced; + gint depth; +}; + +struct _GstRtpVRawPayClass +{ + GstBaseRTPPayloadClass parent_class; +}; + +GType gst_rtp_vraw_pay_get_type (void); + +gboolean gst_rtp_vraw_pay_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_VRAW_PAY_H__ */ diff --git a/gst/rtpmanager/Makefile.am b/gst/rtpmanager/Makefile.am new file mode 100644 index 0000000..f61099c --- /dev/null +++ b/gst/rtpmanager/Makefile.am @@ -0,0 +1,64 @@ +plugin_LTLIBRARIES = libgstrtpmanager.la + +glib_enum_define = GST_RTP_BIN +glib_gen_prefix = gst_rtp_bin +glib_gen_basename = gstrtpbin + +include $(top_srcdir)/common/gst-glib-gen.mak + +built_sources = gstrtpbin-marshal.c +built_headers = gstrtpbin-marshal.h + +BUILT_SOURCES = $(built_sources) $(built_headers) + +libgstrtpmanager_la_SOURCES = gstrtpmanager.c \ + gstrtpbin.c \ + gstrtpjitterbuffer.c \ + gstrtpptdemux.c \ + gstrtpssrcdemux.c \ + rtpjitterbuffer.c \ + rtpsession.c \ + rtpsource.c \ + rtpstats.c \ + gstrtpsession.c + +nodist_libgstrtpmanager_la_SOURCES = \ + $(built_sources) + +noinst_HEADERS = gstrtpbin.h \ + gstrtpjitterbuffer.h \ + gstrtpptdemux.h \ + gstrtpssrcdemux.h \ + rtpjitterbuffer.h \ + rtpsession.h \ + rtpsource.h \ + rtpstats.h \ + gstrtpsession.h + +libgstrtpmanager_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(WARNING_CFLAGS) $(ERROR_CFLAGS) +libgstrtpmanager_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS_LIBS) +libgstrtpmanager_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstrtpmanager_la_LIBTOOLFLAGS = --tag=disable-static + +CLEANFILES = $(BUILT_SOURCES) + +EXTRA_DIST = gstrtpbin-marshal.list + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstrtpmanager -:SHARED libgstrtpmanager \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstrtpmanager_la_SOURCES) \ + $(nodist_libgstrtpmanager_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtpmanager_la_CFLAGS) \ + -:LDFLAGS $(libgstrtpmanager_la_LDFLAGS) \ + $(libgstrtpmanager_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/rtpmanager/Makefile.in b/gst/rtpmanager/Makefile.in new file mode 100644 index 0000000..212952f --- /dev/null +++ b/gst/rtpmanager/Makefile.in @@ -0,0 +1,999 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# these are the variables your Makefile.am should set +# the example is based on the colorbalance interface + +#glib_enum_headers=$(colorbalance_headers) +#glib_enum_define=GST_COLOR_BALANCE +#glib_gen_prefix=gst_color_balance +#glib_gen_basename=colorbalance + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/common/gst-glib-gen.mak +subdir = gst/rtpmanager +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstrtpmanager_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstrtpmanager_la_OBJECTS = libgstrtpmanager_la-gstrtpmanager.lo \ + libgstrtpmanager_la-gstrtpbin.lo \ + libgstrtpmanager_la-gstrtpjitterbuffer.lo \ + libgstrtpmanager_la-gstrtpptdemux.lo \ + libgstrtpmanager_la-gstrtpssrcdemux.lo \ + libgstrtpmanager_la-rtpjitterbuffer.lo \ + libgstrtpmanager_la-rtpsession.lo \ + libgstrtpmanager_la-rtpsource.lo \ + libgstrtpmanager_la-rtpstats.lo \ + libgstrtpmanager_la-gstrtpsession.lo +am__objects_1 = libgstrtpmanager_la-gstrtpbin-marshal.lo +nodist_libgstrtpmanager_la_OBJECTS = $(am__objects_1) +libgstrtpmanager_la_OBJECTS = $(am_libgstrtpmanager_la_OBJECTS) \ + $(nodist_libgstrtpmanager_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstrtpmanager_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) \ + $(libgstrtpmanager_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstrtpmanager_la_SOURCES) \ + $(nodist_libgstrtpmanager_la_SOURCES) +DIST_SOURCES = $(libgstrtpmanager_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstrtpmanager.la +glib_enum_define = GST_RTP_BIN +glib_gen_prefix = gst_rtp_bin +glib_gen_basename = gstrtpbin +enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") +built_sources = gstrtpbin-marshal.c +built_headers = gstrtpbin-marshal.h +BUILT_SOURCES = $(built_sources) $(built_headers) +libgstrtpmanager_la_SOURCES = gstrtpmanager.c \ + gstrtpbin.c \ + gstrtpjitterbuffer.c \ + gstrtpptdemux.c \ + gstrtpssrcdemux.c \ + rtpjitterbuffer.c \ + rtpsession.c \ + rtpsource.c \ + rtpstats.c \ + gstrtpsession.c + +nodist_libgstrtpmanager_la_SOURCES = \ + $(built_sources) + +noinst_HEADERS = gstrtpbin.h \ + gstrtpjitterbuffer.h \ + gstrtpptdemux.h \ + gstrtpssrcdemux.h \ + rtpjitterbuffer.h \ + rtpsession.h \ + rtpsource.h \ + rtpstats.h \ + gstrtpsession.h + +libgstrtpmanager_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(WARNING_CFLAGS) $(ERROR_CFLAGS) + +libgstrtpmanager_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS_LIBS) + +libgstrtpmanager_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstrtpmanager_la_LIBTOOLFLAGS = --tag=disable-static +CLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = gstrtpbin-marshal.list +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/gst-glib-gen.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/rtpmanager/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/rtpmanager/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/gst-glib-gen.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstrtpmanager.la: $(libgstrtpmanager_la_OBJECTS) $(libgstrtpmanager_la_DEPENDENCIES) $(EXTRA_libgstrtpmanager_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstrtpmanager_la_LINK) -rpath $(plugindir) $(libgstrtpmanager_la_OBJECTS) $(libgstrtpmanager_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpbin-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpbin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpjitterbuffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpmanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpptdemux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpsession.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpssrcdemux.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-rtpjitterbuffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-rtpsession.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-rtpsource.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-rtpstats.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstrtpmanager_la-gstrtpmanager.lo: gstrtpmanager.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpmanager.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpmanager.Tpo -c -o libgstrtpmanager_la-gstrtpmanager.lo `test -f 'gstrtpmanager.c' || echo '$(srcdir)/'`gstrtpmanager.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpmanager.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpmanager.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmanager.c' object='libgstrtpmanager_la-gstrtpmanager.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpmanager.lo `test -f 'gstrtpmanager.c' || echo '$(srcdir)/'`gstrtpmanager.c + +libgstrtpmanager_la-gstrtpbin.lo: gstrtpbin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpbin.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpbin.Tpo -c -o libgstrtpmanager_la-gstrtpbin.lo `test -f 'gstrtpbin.c' || echo '$(srcdir)/'`gstrtpbin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpbin.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpbin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpbin.c' object='libgstrtpmanager_la-gstrtpbin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpbin.lo `test -f 'gstrtpbin.c' || echo '$(srcdir)/'`gstrtpbin.c + +libgstrtpmanager_la-gstrtpjitterbuffer.lo: gstrtpjitterbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpjitterbuffer.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpjitterbuffer.Tpo -c -o libgstrtpmanager_la-gstrtpjitterbuffer.lo `test -f 'gstrtpjitterbuffer.c' || echo '$(srcdir)/'`gstrtpjitterbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpjitterbuffer.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpjitterbuffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpjitterbuffer.c' object='libgstrtpmanager_la-gstrtpjitterbuffer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpjitterbuffer.lo `test -f 'gstrtpjitterbuffer.c' || echo '$(srcdir)/'`gstrtpjitterbuffer.c + +libgstrtpmanager_la-gstrtpptdemux.lo: gstrtpptdemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpptdemux.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpptdemux.Tpo -c -o libgstrtpmanager_la-gstrtpptdemux.lo `test -f 'gstrtpptdemux.c' || echo '$(srcdir)/'`gstrtpptdemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpptdemux.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpptdemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpptdemux.c' object='libgstrtpmanager_la-gstrtpptdemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpptdemux.lo `test -f 'gstrtpptdemux.c' || echo '$(srcdir)/'`gstrtpptdemux.c + +libgstrtpmanager_la-gstrtpssrcdemux.lo: gstrtpssrcdemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpssrcdemux.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpssrcdemux.Tpo -c -o libgstrtpmanager_la-gstrtpssrcdemux.lo `test -f 'gstrtpssrcdemux.c' || echo '$(srcdir)/'`gstrtpssrcdemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpssrcdemux.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpssrcdemux.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpssrcdemux.c' object='libgstrtpmanager_la-gstrtpssrcdemux.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpssrcdemux.lo `test -f 'gstrtpssrcdemux.c' || echo '$(srcdir)/'`gstrtpssrcdemux.c + +libgstrtpmanager_la-rtpjitterbuffer.lo: rtpjitterbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-rtpjitterbuffer.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-rtpjitterbuffer.Tpo -c -o libgstrtpmanager_la-rtpjitterbuffer.lo `test -f 'rtpjitterbuffer.c' || echo '$(srcdir)/'`rtpjitterbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-rtpjitterbuffer.Tpo $(DEPDIR)/libgstrtpmanager_la-rtpjitterbuffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtpjitterbuffer.c' object='libgstrtpmanager_la-rtpjitterbuffer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-rtpjitterbuffer.lo `test -f 'rtpjitterbuffer.c' || echo '$(srcdir)/'`rtpjitterbuffer.c + +libgstrtpmanager_la-rtpsession.lo: rtpsession.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-rtpsession.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-rtpsession.Tpo -c -o libgstrtpmanager_la-rtpsession.lo `test -f 'rtpsession.c' || echo '$(srcdir)/'`rtpsession.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-rtpsession.Tpo $(DEPDIR)/libgstrtpmanager_la-rtpsession.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtpsession.c' object='libgstrtpmanager_la-rtpsession.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-rtpsession.lo `test -f 'rtpsession.c' || echo '$(srcdir)/'`rtpsession.c + +libgstrtpmanager_la-rtpsource.lo: rtpsource.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-rtpsource.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-rtpsource.Tpo -c -o libgstrtpmanager_la-rtpsource.lo `test -f 'rtpsource.c' || echo '$(srcdir)/'`rtpsource.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-rtpsource.Tpo $(DEPDIR)/libgstrtpmanager_la-rtpsource.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtpsource.c' object='libgstrtpmanager_la-rtpsource.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-rtpsource.lo `test -f 'rtpsource.c' || echo '$(srcdir)/'`rtpsource.c + +libgstrtpmanager_la-rtpstats.lo: rtpstats.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-rtpstats.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-rtpstats.Tpo -c -o libgstrtpmanager_la-rtpstats.lo `test -f 'rtpstats.c' || echo '$(srcdir)/'`rtpstats.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-rtpstats.Tpo $(DEPDIR)/libgstrtpmanager_la-rtpstats.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtpstats.c' object='libgstrtpmanager_la-rtpstats.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-rtpstats.lo `test -f 'rtpstats.c' || echo '$(srcdir)/'`rtpstats.c + +libgstrtpmanager_la-gstrtpsession.lo: gstrtpsession.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpsession.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpsession.Tpo -c -o libgstrtpmanager_la-gstrtpsession.lo `test -f 'gstrtpsession.c' || echo '$(srcdir)/'`gstrtpsession.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpsession.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpsession.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpsession.c' object='libgstrtpmanager_la-gstrtpsession.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpsession.lo `test -f 'gstrtpsession.c' || echo '$(srcdir)/'`gstrtpsession.c + +libgstrtpmanager_la-gstrtpbin-marshal.lo: gstrtpbin-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpbin-marshal.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpbin-marshal.Tpo -c -o libgstrtpmanager_la-gstrtpbin-marshal.lo `test -f 'gstrtpbin-marshal.c' || echo '$(srcdir)/'`gstrtpbin-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpbin-marshal.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpbin-marshal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpbin-marshal.c' object='libgstrtpmanager_la-gstrtpbin-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpbin-marshal.lo `test -f 'gstrtpbin-marshal.c' || echo '$(srcdir)/'`gstrtpbin-marshal.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# these are all the rules generating the relevant files +$(glib_gen_basename)-marshal.h: $(glib_gen_basename)-marshal.list + $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_gen_prefix)_marshal $^ > $(glib_gen_basename)-marshal.h.tmp && \ + mv $(glib_gen_basename)-marshal.h.tmp $(glib_gen_basename)-marshal.h + +$(glib_gen_basename)-marshal.c: $(glib_gen_basename)-marshal.list + $(AM_V_GEN)echo "#include \"$(glib_gen_basename)-marshal.h\"" >> $(glib_gen_basename)-marshal.c.tmp && \ + glib-genmarshal --body --prefix=$(glib_gen_prefix)_marshal $^ >> $(glib_gen_basename)-marshal.c.tmp && \ + mv $(glib_gen_basename)-marshal.c.tmp $(glib_gen_basename)-marshal.c + +$(glib_gen_basename)-enumtypes.h: $(glib_enum_headers) + $(AM_V_GEN)glib-mkenums \ + --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ + --fprod "\n/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ + $^ > $@ + +$(glib_gen_basename)-enumtypes.c: $(glib_enum_headers) + @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi + $(AM_V_GEN)glib-mkenums \ + --fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ + $^ > $@ + +# a hack rule to make sure .Plo files exist because they get include'd +# from Makefile's +.deps/%-marshal.Plo: + @touch $@ + +.deps/%-enumtypes.Plo: + @touch $@ + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstrtpmanager -:SHARED libgstrtpmanager \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstrtpmanager_la_SOURCES) \ + $(nodist_libgstrtpmanager_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtpmanager_la_CFLAGS) \ + -:LDFLAGS $(libgstrtpmanager_la_LDFLAGS) \ + $(libgstrtpmanager_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/rtpmanager/gstrtpbin-marshal.list b/gst/rtpmanager/gstrtpbin-marshal.list new file mode 100644 index 0000000..6606a42 --- /dev/null +++ b/gst/rtpmanager/gstrtpbin-marshal.list @@ -0,0 +1,10 @@ +UINT:UINT +BOXED:UINT +BOXED:UINT,UINT +OBJECT:UINT +VOID:UINT,OBJECT +VOID:UINT +VOID:UINT,UINT +VOID:OBJECT,OBJECT +UINT64:BOOL,UINT64 +VOID:UINT64 diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c new file mode 100644 index 0000000..f843ed2 --- /dev/null +++ b/gst/rtpmanager/gstrtpbin.c @@ -0,0 +1,3146 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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-gstrtpbin + * @see_also: gstrtpjitterbuffer, gstrtpsession, gstrtpptdemux, gstrtpssrcdemux + * + * RTP bin combines the functions of #GstRtpSession, #GstRtpSsrcDemux, + * #GstRtpJitterBuffer and #GstRtpPtDemux in one element. It allows for multiple + * RTP sessions that will be synchronized together using RTCP SR packets. + * + * #GstRtpBin is configured with a number of request pads that define the + * functionality that is activated, similar to the #GstRtpSession element. + * + * To use #GstRtpBin as an RTP receiver, request a recv_rtp_sink_\%d pad. The session + * number must be specified in the pad name. + * Data received on the recv_rtp_sink_\%d pad will be processed in the #GstRtpSession + * manager and after being validated forwarded on #GstRtpSsrcDemux element. Each + * RTP stream is demuxed based on the SSRC and send to a #GstRtpJitterBuffer. After + * the packets are released from the jitterbuffer, they will be forwarded to a + * #GstRtpPtDemux element. The #GstRtpPtDemux element will demux the packets based + * on the payload type and will create a unique pad recv_rtp_src_\%d_\%d_\%d on + * gstrtpbin with the session number, SSRC and payload type respectively as the pad + * name. + * + * To also use #GstRtpBin as an RTCP receiver, request a recv_rtcp_sink_\%d pad. The + * session number must be specified in the pad name. + * + * If you want the session manager to generate and send RTCP packets, request + * the send_rtcp_src_\%d pad with the session number in the pad name. Packet pushed + * on this pad contain SR/RR RTCP reports that should be sent to all participants + * in the session. + * + * To use #GstRtpBin as a sender, request a send_rtp_sink_\%d pad, which will + * automatically create a send_rtp_src_\%d pad. If the session number is not provided, + * the pad from the lowest available session will be returned. The session manager will modify the + * SSRC in the RTP packets to its own SSRC and wil forward the packets on the + * send_rtp_src_\%d pad after updating its internal state. + * + * The session manager needs the clock-rate of the payload types it is handling + * and will signal the #GstRtpSession::request-pt-map signal when it needs such a + * mapping. One can clear the cached values with the #GstRtpSession::clear-pt-map + * signal. + * + * Access to the internal statistics of gstrtpbin is provided with the + * get-internal-session property. This action signal gives access to the + * RTPSession object which further provides action signals to retrieve the + * internal source and other sources. + * + * + * Example pipelines + * |[ + * gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink_0 \ + * gstrtpbin ! rtptheoradepay ! theoradec ! xvimagesink + * ]| Receive RTP data from port 5000 and send to the session 0 in gstrtpbin. + * |[ + * gst-launch gstrtpbin name=rtpbin \ + * v4l2src ! ffmpegcolorspace ! ffenc_h263 ! rtph263ppay ! rtpbin.send_rtp_sink_0 \ + * rtpbin.send_rtp_src_0 ! udpsink port=5000 \ + * rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false \ + * udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \ + * audiotestsrc ! amrnbenc ! rtpamrpay ! rtpbin.send_rtp_sink_1 \ + * rtpbin.send_rtp_src_1 ! udpsink port=5002 \ + * rtpbin.send_rtcp_src_1 ! udpsink port=5003 sync=false async=false \ + * udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1 + * ]| Encode and payload H263 video captured from a v4l2src. Encode and payload AMR + * audio generated from audiotestsrc. The video is sent to session 0 in rtpbin + * and the audio is sent to session 1. Video packets are sent on UDP port 5000 + * and audio packets on port 5002. The video RTCP packets for session 0 are sent + * on port 5001 and the audio RTCP packets for session 0 are sent on port 5003. + * RTCP packets for session 0 are received on port 5005 and RTCP for session 1 + * is received on port 5007. Since RTCP packets from the sender should be sent + * as soon as possible and do not participate in preroll, sync=false and + * async=false is configured on udpsink + * |[ + * gst-launch -v gstrtpbin name=rtpbin \ + * udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998" \ + * port=5000 ! rtpbin.recv_rtp_sink_0 \ + * rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink \ + * udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ + * rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false \ + * udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1" \ + * port=5002 ! rtpbin.recv_rtp_sink_1 \ + * rtpbin. ! rtpamrdepay ! amrnbdec ! alsasink \ + * udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ + * rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false + * ]| Receive H263 on port 5000, send it through rtpbin in session 0, depayload, + * decode and display the video. + * Receive AMR on port 5002, send it through rtpbin in session 1, depayload, + * decode and play the audio. + * Receive server RTCP packets for session 0 on port 5001 and RTCP packets for + * session 1 on port 5003. These packets will be used for session management and + * synchronisation. + * Send RTCP reports for session 0 on port 5005 and RTCP reports for session 1 + * on port 5007. + * + * + * Last reviewed on 2007-08-30 (0.10.6) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include + +#include +#include + +#include "gstrtpbin-marshal.h" +#include "gstrtpbin.h" +#include "rtpsession.h" +#include "gstrtpsession.h" +#include "gstrtpjitterbuffer.h" + +#include + +GST_DEBUG_CATEGORY_STATIC (gst_rtp_bin_debug); +#define GST_CAT_DEFAULT gst_rtp_bin_debug + +/* sink pads */ +static GstStaticPadTemplate rtpbin_recv_rtp_sink_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtp_sink_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate rtpbin_recv_rtcp_sink_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtcp_sink_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate rtpbin_send_rtp_sink_template = +GST_STATIC_PAD_TEMPLATE ("send_rtp_sink_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtp") + ); + +/* src pads */ +static GstStaticPadTemplate rtpbin_recv_rtp_src_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtp_src_%d_%d_%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate rtpbin_send_rtcp_src_template = +GST_STATIC_PAD_TEMPLATE ("send_rtcp_src_%d", + GST_PAD_SRC, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate rtpbin_send_rtp_src_template = +GST_STATIC_PAD_TEMPLATE ("send_rtp_src_%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtp") + ); + +#define GST_RTP_BIN_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_RTP_BIN, GstRtpBinPrivate)) + +#define GST_RTP_BIN_LOCK(bin) g_mutex_lock ((bin)->priv->bin_lock) +#define GST_RTP_BIN_UNLOCK(bin) g_mutex_unlock ((bin)->priv->bin_lock) + +/* lock to protect dynamic callbacks, like pad-added and new ssrc. */ +#define GST_RTP_BIN_DYN_LOCK(bin) g_mutex_lock ((bin)->priv->dyn_lock) +#define GST_RTP_BIN_DYN_UNLOCK(bin) g_mutex_unlock ((bin)->priv->dyn_lock) + +/* lock for shutdown */ +#define GST_RTP_BIN_SHUTDOWN_LOCK(bin,label) \ +G_STMT_START { \ + if (g_atomic_int_get (&bin->priv->shutdown)) \ + goto label; \ + GST_RTP_BIN_DYN_LOCK (bin); \ + if (g_atomic_int_get (&bin->priv->shutdown)) { \ + GST_RTP_BIN_DYN_UNLOCK (bin); \ + goto label; \ + } \ +} G_STMT_END + +/* unlock for shutdown */ +#define GST_RTP_BIN_SHUTDOWN_UNLOCK(bin) \ + GST_RTP_BIN_DYN_UNLOCK (bin); \ + +struct _GstRtpBinPrivate +{ + GMutex *bin_lock; + + /* lock protecting dynamic adding/removing */ + GMutex *dyn_lock; + + /* if we are shutting down or not */ + gint shutdown; + + gboolean autoremove; + + /* UNIX (ntp) time of last SR sync used */ + guint64 last_unix; +}; + +/* signals and args */ +enum +{ + SIGNAL_REQUEST_PT_MAP, + SIGNAL_PAYLOAD_TYPE_CHANGE, + SIGNAL_CLEAR_PT_MAP, + SIGNAL_RESET_SYNC, + SIGNAL_GET_INTERNAL_SESSION, + + SIGNAL_ON_NEW_SSRC, + SIGNAL_ON_SSRC_COLLISION, + SIGNAL_ON_SSRC_VALIDATED, + SIGNAL_ON_SSRC_ACTIVE, + SIGNAL_ON_SSRC_SDES, + SIGNAL_ON_BYE_SSRC, + SIGNAL_ON_BYE_TIMEOUT, + SIGNAL_ON_TIMEOUT, + SIGNAL_ON_SENDER_TIMEOUT, + SIGNAL_ON_NPT_STOP, + LAST_SIGNAL +}; + +#define DEFAULT_LATENCY_MS 200 +#define DEFAULT_SDES NULL +#define DEFAULT_DO_LOST FALSE +#define DEFAULT_IGNORE_PT FALSE +#define DEFAULT_NTP_SYNC FALSE +#define DEFAULT_AUTOREMOVE FALSE +#define DEFAULT_BUFFER_MODE RTP_JITTER_BUFFER_MODE_SLAVE +#define DEFAULT_USE_PIPELINE_CLOCK FALSE +#define DEFAULT_RTCP_SYNC GST_RTP_BIN_RTCP_SYNC_ALWAYS +#define DEFAULT_RTCP_SYNC_INTERVAL 0 + +enum +{ + PROP_0, + PROP_LATENCY, + PROP_SDES, + PROP_DO_LOST, + PROP_IGNORE_PT, + PROP_NTP_SYNC, + PROP_RTCP_SYNC, + PROP_RTCP_SYNC_INTERVAL, + PROP_AUTOREMOVE, + PROP_BUFFER_MODE, + PROP_USE_PIPELINE_CLOCK, + PROP_LAST +}; + +enum +{ + GST_RTP_BIN_RTCP_SYNC_ALWAYS, + GST_RTP_BIN_RTCP_SYNC_INITIAL, + GST_RTP_BIN_RTCP_SYNC_RTP +}; + +#define GST_RTP_BIN_RTCP_SYNC_TYPE (gst_rtp_bin_rtcp_sync_get_type()) +static GType +gst_rtp_bin_rtcp_sync_get_type (void) +{ + static GType rtcp_sync_type = 0; + static const GEnumValue rtcp_sync_types[] = { + {GST_RTP_BIN_RTCP_SYNC_ALWAYS, "always", "always"}, + {GST_RTP_BIN_RTCP_SYNC_INITIAL, "initial", "initial"}, + {GST_RTP_BIN_RTCP_SYNC_RTP, "rtp-info", "rtp-info"}, + {0, NULL, NULL}, + }; + + if (!rtcp_sync_type) { + rtcp_sync_type = g_enum_register_static ("GstRTCPSync", rtcp_sync_types); + } + return rtcp_sync_type; +} + +/* helper objects */ +typedef struct _GstRtpBinSession GstRtpBinSession; +typedef struct _GstRtpBinStream GstRtpBinStream; +typedef struct _GstRtpBinClient GstRtpBinClient; + +static guint gst_rtp_bin_signals[LAST_SIGNAL] = { 0 }; + +static GstCaps *pt_map_requested (GstElement * element, guint pt, + GstRtpBinSession * session); +static void payload_type_change (GstElement * element, guint pt, + GstRtpBinSession * session); +static void free_client (GstRtpBinClient * client, GstRtpBin * bin); +static void free_stream (GstRtpBinStream * stream); + +/* Manages the RTP stream for one SSRC. + * + * We pipe the stream (comming from the SSRC demuxer) into a jitterbuffer. + * If we see an SDES RTCP packet that links multiple SSRCs together based on a + * common CNAME, we create a GstRtpBinClient structure to group the SSRCs + * together (see below). + */ +struct _GstRtpBinStream +{ + /* the SSRC of this stream */ + guint32 ssrc; + + /* parent bin */ + GstRtpBin *bin; + + /* the session this SSRC belongs to */ + GstRtpBinSession *session; + + /* the jitterbuffer of the SSRC */ + GstElement *buffer; + gulong buffer_handlesync_sig; + gulong buffer_ptreq_sig; + gulong buffer_ntpstop_sig; + gint percent; + + /* the PT demuxer of the SSRC */ + GstElement *demux; + gulong demux_newpad_sig; + gulong demux_padremoved_sig; + gulong demux_ptreq_sig; + gulong demux_ptchange_sig; + + /* if we have calculated a valid rt_delta for this stream */ + gboolean have_sync; + /* mapping to local RTP and NTP time */ + gint64 rt_delta; + gint64 rtp_delta; + /* base rtptime in gst time */ + gint64 clock_base; +}; + +#define GST_RTP_SESSION_LOCK(sess) g_mutex_lock ((sess)->lock) +#define GST_RTP_SESSION_UNLOCK(sess) g_mutex_unlock ((sess)->lock) + +/* Manages the receiving end of the packets. + * + * There is one such structure for each RTP session (audio/video/...). + * We get the RTP/RTCP packets and stuff them into the session manager. From + * there they are pushed into an SSRC demuxer that splits the stream based on + * SSRC. Each of the SSRC streams go into their own jitterbuffer (managed with + * the GstRtpBinStream above). + */ +struct _GstRtpBinSession +{ + /* session id */ + gint id; + /* the parent bin */ + GstRtpBin *bin; + /* the session element */ + GstElement *session; + /* the SSRC demuxer */ + GstElement *demux; + gulong demux_newpad_sig; + gulong demux_padremoved_sig; + + GMutex *lock; + + /* list of GstRtpBinStream */ + GSList *streams; + + /* mapping of payload type to caps */ + GHashTable *ptmap; + + /* 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 + * synchronized. + */ +struct _GstRtpBinClient +{ + /* the common CNAME for the streams */ + gchar *cname; + guint cname_len; + + /* the streams */ + guint nstreams; + GSList *streams; +}; + +/* find a session with the given id. Must be called with RTP_BIN_LOCK */ +static GstRtpBinSession * +find_session_by_id (GstRtpBin * rtpbin, gint id) +{ + GSList *walk; + + for (walk = rtpbin->sessions; walk; walk = g_slist_next (walk)) { + GstRtpBinSession *sess = (GstRtpBinSession *) walk->data; + + if (sess->id == id) + return sess; + } + return NULL; +} + +/* find a session with the given request pad. Must be called with RTP_BIN_LOCK */ +static GstRtpBinSession * +find_session_by_pad (GstRtpBin * rtpbin, GstPad * pad) +{ + GSList *walk; + + for (walk = rtpbin->sessions; walk; walk = g_slist_next (walk)) { + GstRtpBinSession *sess = (GstRtpBinSession *) walk->data; + + 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; +} + +static void +on_new_ssrc (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_NEW_SSRC], 0, + sess->id, ssrc); +} + +static void +on_ssrc_collision (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SSRC_COLLISION], 0, + sess->id, ssrc); +} + +static void +on_ssrc_validated (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SSRC_VALIDATED], 0, + sess->id, ssrc); +} + +static void +on_ssrc_active (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SSRC_ACTIVE], 0, + sess->id, ssrc); +} + +static void +on_ssrc_sdes (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SSRC_SDES], 0, + sess->id, ssrc); +} + +static void +on_bye_ssrc (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_BYE_SSRC], 0, + sess->id, ssrc); +} + +static void +on_bye_timeout (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_BYE_TIMEOUT], 0, + sess->id, ssrc); + + if (sess->bin->priv->autoremove) + g_signal_emit_by_name (sess->demux, "clear-ssrc", ssrc, NULL); +} + +static void +on_timeout (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_TIMEOUT], 0, + sess->id, ssrc); + + if (sess->bin->priv->autoremove) + g_signal_emit_by_name (sess->demux, "clear-ssrc", ssrc, NULL); +} + +static void +on_sender_timeout (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) +{ + g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SENDER_TIMEOUT], 0, + sess->id, ssrc); +} + +static void +on_npt_stop (GstElement * jbuf, GstRtpBinStream * stream) +{ + g_signal_emit (stream->bin, gst_rtp_bin_signals[SIGNAL_ON_NPT_STOP], 0, + 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) +{ + GstRtpBinSession *sess; + GstElement *session, *demux; + GstState target; + + if (!(session = gst_element_factory_make ("gstrtpsession", NULL))) + goto no_session; + + if (!(demux = gst_element_factory_make ("gstrtpssrcdemux", NULL))) + goto no_demux; + + sess = g_new0 (GstRtpBinSession, 1); + sess->lock = g_mutex_new (); + sess->id = id; + sess->bin = rtpbin; + sess->session = session; + sess->demux = demux; + sess->ptmap = g_hash_table_new_full (NULL, NULL, NULL, + (GDestroyNotify) gst_caps_unref); + rtpbin->sessions = g_slist_prepend (rtpbin->sessions, sess); + + /* configure SDES items */ + GST_OBJECT_LOCK (rtpbin); + g_object_set (session, "sdes", rtpbin->sdes, "use-pipeline-clock", + rtpbin->use_pipeline_clock, NULL); + GST_OBJECT_UNLOCK (rtpbin); + + /* provide clock_rate to the session manager when needed */ + g_signal_connect (session, "request-pt-map", + (GCallback) pt_map_requested, sess); + + g_signal_connect (sess->session, "on-new-ssrc", + (GCallback) on_new_ssrc, sess); + g_signal_connect (sess->session, "on-ssrc-collision", + (GCallback) on_ssrc_collision, sess); + g_signal_connect (sess->session, "on-ssrc-validated", + (GCallback) on_ssrc_validated, sess); + g_signal_connect (sess->session, "on-ssrc-active", + (GCallback) on_ssrc_active, sess); + g_signal_connect (sess->session, "on-ssrc-sdes", + (GCallback) on_ssrc_sdes, sess); + g_signal_connect (sess->session, "on-bye-ssrc", + (GCallback) on_bye_ssrc, sess); + g_signal_connect (sess->session, "on-bye-timeout", + (GCallback) on_bye_timeout, sess); + g_signal_connect (sess->session, "on-timeout", (GCallback) on_timeout, sess); + g_signal_connect (sess->session, "on-sender-timeout", + (GCallback) on_sender_timeout, sess); + + gst_bin_add (GST_BIN_CAST (rtpbin), session); + gst_bin_add (GST_BIN_CAST (rtpbin), demux); + + 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; + + /* ERRORS */ +no_session: + { + g_warning ("gstrtpbin: could not create gstrtpsession element"); + return NULL; + } +no_demux: + { + gst_object_unref (session); + g_warning ("gstrtpbin: could not create gstrtpssrcdemux element"); + return NULL; + } +} + +static void +free_session (GstRtpBinSession * sess, GstRtpBin * bin) +{ + GSList *client_walk; + + GST_DEBUG_OBJECT (bin, "freeing session %p", sess); + + gst_element_set_locked_state (sess->demux, TRUE); + gst_element_set_locked_state (sess->session, TRUE); + + 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); + gst_object_unref (sess->recv_rtp_sink); + } + if (sess->recv_rtp_src != NULL) + gst_object_unref (sess->recv_rtp_src); + if (sess->recv_rtcp_sink != NULL) { + gst_element_release_request_pad (sess->session, sess->recv_rtcp_sink); + gst_object_unref (sess->recv_rtcp_sink); + } + if (sess->sync_src != NULL) + gst_object_unref (sess->sync_src); + if (sess->send_rtp_sink != NULL) { + gst_element_release_request_pad (sess->session, sess->send_rtp_sink); + gst_object_unref (sess->send_rtp_sink); + } + if (sess->send_rtp_src != NULL) + gst_object_unref (sess->send_rtp_src); + if (sess->send_rtcp_src != NULL) { + gst_element_release_request_pad (sess->session, sess->send_rtcp_src); + gst_object_unref (sess->send_rtcp_src); + } + + gst_bin_remove (GST_BIN_CAST (bin), sess->session); + gst_bin_remove (GST_BIN_CAST (bin), sess->demux); + + /* remove any references in bin->clients to the streams in sess->streams */ + client_walk = bin->clients; + while (client_walk) { + GSList *client_node = client_walk; + GstRtpBinClient *client = (GstRtpBinClient *) client_node->data; + GSList *stream_walk = client->streams; + + while (stream_walk) { + GSList *stream_node = stream_walk; + GstRtpBinStream *stream = (GstRtpBinStream *) stream_node->data; + GSList *inner_walk; + + stream_walk = g_slist_next (stream_walk); + + for (inner_walk = sess->streams; inner_walk; + inner_walk = g_slist_next (inner_walk)) { + if ((GstRtpBinStream *) inner_walk->data == stream) { + client->streams = g_slist_delete_link (client->streams, stream_node); + --client->nstreams; + break; + } + } + } + client_walk = g_slist_next (client_walk); + + g_assert ((client->streams && client->nstreams > 0) || (!client->streams + && client->streams == 0)); + if (client->nstreams == 0) { + free_client (client, bin); + bin->clients = g_slist_delete_link (bin->clients, client_node); + } + } + + g_slist_foreach (sess->streams, (GFunc) free_stream, NULL); + g_slist_free (sess->streams); + + g_mutex_free (sess->lock); + g_hash_table_destroy (sess->ptmap); + + g_free (sess); +} + +/* get the payload type caps for the specific payload @pt in @session */ +static GstCaps * +get_pt_map (GstRtpBinSession * session, guint pt) +{ + GstCaps *caps = NULL; + GstRtpBin *bin; + GValue ret = { 0 }; + GValue args[3] = { {0}, {0}, {0} }; + + GST_DEBUG ("searching pt %d in cache", pt); + + GST_RTP_SESSION_LOCK (session); + + /* first look in the cache */ + caps = g_hash_table_lookup (session->ptmap, GINT_TO_POINTER (pt)); + if (caps) { + gst_caps_ref (caps); + goto done; + } + + bin = session->bin; + + GST_DEBUG ("emiting signal for pt %d in session %d", pt, session->id); + + /* not in cache, send signal to request caps */ + g_value_init (&args[0], GST_TYPE_ELEMENT); + g_value_set_object (&args[0], bin); + g_value_init (&args[1], G_TYPE_UINT); + g_value_set_uint (&args[1], session->id); + g_value_init (&args[2], G_TYPE_UINT); + g_value_set_uint (&args[2], pt); + + g_value_init (&ret, GST_TYPE_CAPS); + g_value_set_boxed (&ret, NULL); + + GST_RTP_SESSION_UNLOCK (session); + + g_signal_emitv (args, gst_rtp_bin_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret); + + GST_RTP_SESSION_LOCK (session); + + g_value_unset (&args[0]); + g_value_unset (&args[1]); + g_value_unset (&args[2]); + + /* look in the cache again because we let the lock go */ + caps = g_hash_table_lookup (session->ptmap, GINT_TO_POINTER (pt)); + if (caps) { + gst_caps_ref (caps); + g_value_unset (&ret); + goto done; + } + + caps = (GstCaps *) g_value_dup_boxed (&ret); + g_value_unset (&ret); + if (!caps) + goto no_caps; + + GST_DEBUG ("caching pt %d as %" GST_PTR_FORMAT, pt, caps); + + /* store in cache, take additional ref */ + g_hash_table_insert (session->ptmap, GINT_TO_POINTER (pt), + gst_caps_ref (caps)); + +done: + GST_RTP_SESSION_UNLOCK (session); + + return caps; + + /* ERRORS */ +no_caps: + { + GST_RTP_SESSION_UNLOCK (session); + GST_DEBUG ("no pt map could be obtained"); + return NULL; + } +} + +static gboolean +return_true (gpointer key, gpointer value, gpointer user_data) +{ + return TRUE; +} + +static void +gst_rtp_bin_reset_sync (GstRtpBin * rtpbin) +{ + GSList *clients, *streams; + + GST_DEBUG_OBJECT (rtpbin, "Reset sync on all clients"); + + GST_RTP_BIN_LOCK (rtpbin); + for (clients = rtpbin->clients; clients; clients = g_slist_next (clients)) { + GstRtpBinClient *client = (GstRtpBinClient *) clients->data; + + /* reset sync on all streams for this client */ + for (streams = client->streams; streams; streams = g_slist_next (streams)) { + GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; + + /* make use require a new SR packet for this stream before we attempt new + * lip-sync */ + stream->have_sync = FALSE; + stream->rt_delta = 0; + stream->rtp_delta = 0; + stream->clock_base = -100 * GST_SECOND; + } + } + GST_RTP_BIN_UNLOCK (rtpbin); +} + +static void +gst_rtp_bin_clear_pt_map (GstRtpBin * bin) +{ + GSList *sessions, *streams; + + GST_RTP_BIN_LOCK (bin); + GST_DEBUG_OBJECT (bin, "clearing pt map"); + for (sessions = bin->sessions; sessions; sessions = g_slist_next (sessions)) { + GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; + + GST_DEBUG_OBJECT (bin, "clearing session %p", session); + g_signal_emit_by_name (session->session, "clear-pt-map", NULL); + + GST_RTP_SESSION_LOCK (session); + g_hash_table_foreach_remove (session->ptmap, return_true, NULL); + + for (streams = session->streams; streams; streams = g_slist_next (streams)) { + GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; + + GST_DEBUG_OBJECT (bin, "clearing stream %p", stream); + g_signal_emit_by_name (stream->buffer, "clear-pt-map", NULL); + if (stream->demux) + g_signal_emit_by_name (stream->demux, "clear-pt-map", NULL); + } + GST_RTP_SESSION_UNLOCK (session); + } + GST_RTP_BIN_UNLOCK (bin); + + /* reset sync too */ + gst_rtp_bin_reset_sync (bin); +} + +static RTPSession * +gst_rtp_bin_get_internal_session (GstRtpBin * bin, guint session_id) +{ + RTPSession *internal_session = NULL; + GstRtpBinSession *session; + + GST_RTP_BIN_LOCK (bin); + GST_DEBUG_OBJECT (bin, "retrieving internal RTPSession object, index: %d", + session_id); + session = find_session_by_id (bin, (gint) session_id); + if (session) { + g_object_get (session->session, "internal-session", &internal_session, + NULL); + } + GST_RTP_BIN_UNLOCK (bin); + + return internal_session; +} + +static void +gst_rtp_bin_propagate_property_to_jitterbuffer (GstRtpBin * bin, + const gchar * name, const GValue * value) +{ + GSList *sessions, *streams; + + GST_RTP_BIN_LOCK (bin); + for (sessions = bin->sessions; sessions; sessions = g_slist_next (sessions)) { + GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; + + GST_RTP_SESSION_LOCK (session); + for (streams = session->streams; streams; streams = g_slist_next (streams)) { + GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; + + g_object_set_property (G_OBJECT (stream->buffer), name, value); + } + GST_RTP_SESSION_UNLOCK (session); + } + GST_RTP_BIN_UNLOCK (bin); +} + +/* get a client with the given SDES name. Must be called with RTP_BIN_LOCK */ +static GstRtpBinClient * +get_client (GstRtpBin * bin, guint8 len, guint8 * data, gboolean * created) +{ + GstRtpBinClient *result = NULL; + GSList *walk; + + for (walk = bin->clients; walk; walk = g_slist_next (walk)) { + GstRtpBinClient *client = (GstRtpBinClient *) walk->data; + + if (len != client->cname_len) + continue; + + if (!strncmp ((gchar *) data, client->cname, client->cname_len)) { + GST_DEBUG_OBJECT (bin, "found existing client %p with CNAME %s", client, + client->cname); + result = client; + break; + } + } + + /* nothing found, create one */ + if (result == NULL) { + result = g_new0 (GstRtpBinClient, 1); + result->cname = g_strndup ((gchar *) data, len); + result->cname_len = len; + bin->clients = g_slist_prepend (bin->clients, result); + GST_DEBUG_OBJECT (bin, "created new client %p with CNAME %s", result, + result->cname); + } + return result; +} + +static void +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); +} + +static void +get_current_times (GstRtpBin * bin, GstClockTime * running_time, + guint64 * ntpnstime) +{ + guint64 ntpns; + GstClock *clock; + GstClockTime base_time, rt, clock_time; + + GST_OBJECT_LOCK (bin); + if ((clock = GST_ELEMENT_CLOCK (bin))) { + base_time = GST_ELEMENT_CAST (bin)->base_time; + gst_object_ref (clock); + GST_OBJECT_UNLOCK (bin); + + clock_time = gst_clock_get_time (clock); + + if (bin->use_pipeline_clock) { + ntpns = clock_time; + } else { + GTimeVal current; + + /* get current NTP time */ + g_get_current_time (¤t); + ntpns = GST_TIMEVAL_TO_TIME (current); + } + + /* add constant to convert from 1970 based time to 1900 based time */ + ntpns += (2208988800LL * GST_SECOND); + + /* get current clock time and convert to running time */ + rt = clock_time - base_time; + + gst_object_unref (clock); + } else { + GST_OBJECT_UNLOCK (bin); + rt = -1; + ntpns = -1; + } + if (running_time) + *running_time = rt; + if (ntpnstime) + *ntpnstime = ntpns; +} + +static void +stream_set_ts_offset (GstRtpBin * bin, GstRtpBinStream * stream, + gint64 ts_offset) +{ + gint64 prev_ts_offset; + + g_object_get (stream->buffer, "ts-offset", &prev_ts_offset, NULL); + + /* delta changed, see how much */ + if (prev_ts_offset != ts_offset) { + gint64 diff; + + diff = prev_ts_offset - ts_offset; + + GST_DEBUG_OBJECT (bin, + "ts-offset %" G_GINT64_FORMAT ", prev %" G_GINT64_FORMAT + ", diff: %" G_GINT64_FORMAT, ts_offset, prev_ts_offset, diff); + + /* only change diff when it changed more than 4 milliseconds. This + * compensates for rounding errors in NTP to RTP timestamp + * conversions */ + if (ABS (diff) > 4 * GST_MSECOND) { + if (ABS (diff) < (3 * GST_SECOND)) { + g_object_set (stream->buffer, "ts-offset", ts_offset, NULL); + } else { + GST_WARNING_OBJECT (bin, "offset unusually large, ignoring"); + } + } else { + GST_DEBUG_OBJECT (bin, "offset too small, ignoring"); + } + } + GST_DEBUG_OBJECT (bin, "stream SSRC %08x, delta %" G_GINT64_FORMAT, + stream->ssrc, ts_offset); +} + +/* associate a stream to the given CNAME. This will make sure all streams for + * that CNAME are synchronized together. + * Must be called with GST_RTP_BIN_LOCK */ +static void +gst_rtp_bin_associate (GstRtpBin * bin, GstRtpBinStream * stream, guint8 len, + guint8 * data, guint64 ntptime, guint64 last_extrtptime, + guint64 base_rtptime, guint64 base_time, guint clock_rate, + gint64 rtp_clock_base) +{ + GstRtpBinClient *client; + gboolean created; + GSList *walk; + guint64 local_rt; + guint64 local_rtp; + GstClockTime running_time; + guint64 ntpnstime; + gint64 ntpdiff, rtdiff; + guint64 last_unix; + + /* first find or create the CNAME */ + client = get_client (bin, len, data, &created); + + /* find stream in the client */ + for (walk = client->streams; walk; walk = g_slist_next (walk)) { + GstRtpBinStream *ostream = (GstRtpBinStream *) walk->data; + + if (ostream == stream) + break; + } + /* not found, add it to the list */ + if (walk == NULL) { + GST_DEBUG_OBJECT (bin, + "new association of SSRC %08x with client %p with CNAME %s", + stream->ssrc, client, client->cname); + client->streams = g_slist_prepend (client->streams, stream); + client->nstreams++; + } else { + GST_DEBUG_OBJECT (bin, + "found association of SSRC %08x with client %p with CNAME %s", + stream->ssrc, client, client->cname); + } + + if (!GST_CLOCK_TIME_IS_VALID (last_extrtptime)) { + GST_DEBUG_OBJECT (bin, "invalidated sync data"); + if (bin->rtcp_sync == GST_RTP_BIN_RTCP_SYNC_RTP) { + /* we don't need that data, so carry on, + * but make some values look saner */ + last_extrtptime = base_rtptime; + } else { + /* nothing we can do with this data in this case */ + GST_DEBUG_OBJECT (bin, "bailing out"); + return; + } + } + + /* Take the extended rtptime we found in the SR packet and map it to the + * local rtptime. The local rtp time is used to construct timestamps on the + * buffers so we will calculate what running_time corresponds to the RTP + * timestamp in the SR packet. */ + local_rtp = last_extrtptime - base_rtptime; + + GST_DEBUG_OBJECT (bin, + "base %" G_GUINT64_FORMAT ", extrtptime %" G_GUINT64_FORMAT + ", local RTP %" G_GUINT64_FORMAT ", clock-rate %d, " + "clock-base %" G_GINT64_FORMAT, base_rtptime, + last_extrtptime, local_rtp, clock_rate, rtp_clock_base); + + /* calculate local RTP time in gstreamer timestamp, we essentially perform the + * same conversion that a jitterbuffer would use to convert an rtp timestamp + * into a corresponding gstreamer timestamp. Note that the base_time also + * contains the drift between sender and receiver. */ + local_rt = gst_util_uint64_scale_int (local_rtp, GST_SECOND, clock_rate); + local_rt += base_time; + + /* convert ntptime to unix time since 1900 */ + last_unix = gst_util_uint64_scale (ntptime, GST_SECOND, + (G_GINT64_CONSTANT (1) << 32)); + + stream->have_sync = TRUE; + + GST_DEBUG_OBJECT (bin, + "local UNIX %" G_GUINT64_FORMAT ", remote UNIX %" G_GUINT64_FORMAT, + local_rt, last_unix); + + /* recalc inter stream playout offset, but only if there is more than one + * stream or we're doing NTP sync. */ + if (bin->ntp_sync) { + /* For NTP sync we need to first get a snapshot of running_time and NTP + * time. We know at what running_time we play a certain RTP time, we also + * calculated when we would play the RTP time in the SR packet. Now we need + * to know how the running_time and the NTP time relate to eachother. */ + get_current_times (bin, &running_time, &ntpnstime); + + /* see how far away the NTP time is. This is the difference between the + * current NTP time and the NTP time in the last SR packet. */ + ntpdiff = ntpnstime - last_unix; + /* see how far away the running_time is. This is the difference between the + * current running_time and the running_time of the RTP timestamp in the + * last SR packet. */ + rtdiff = running_time - local_rt; + + GST_DEBUG_OBJECT (bin, + "NTP time %" G_GUINT64_FORMAT ", last unix %" G_GUINT64_FORMAT, + ntpnstime, last_unix); + GST_DEBUG_OBJECT (bin, + "NTP diff %" G_GINT64_FORMAT ", RT diff %" G_GINT64_FORMAT, ntpdiff, + rtdiff); + + /* combine to get the final diff to apply to the running_time */ + stream->rt_delta = rtdiff - ntpdiff; + + stream_set_ts_offset (bin, stream, stream->rt_delta); + } else { + gint64 min, rtp_min, clock_base = stream->clock_base; + gboolean all_sync, use_rtp; + gboolean rtcp_sync = g_atomic_int_get (&bin->rtcp_sync); + + /* calculate delta between server and receiver. last_unix is created by + * converting the ntptime in the last SR packet to a gstreamer timestamp. This + * delta expresses the difference to our timeline and the server timeline. The + * difference in itself doesn't mean much but we can combine the delta of + * multiple streams to create a stream specific offset. */ + stream->rt_delta = last_unix - local_rt; + + /* calculate the min of all deltas, ignoring streams that did not yet have a + * valid rt_delta because we did not yet receive an SR packet for those + * streams. + * We calculate the mininum because we would like to only apply positive + * offsets to streams, delaying their playback instead of trying to speed up + * other streams (which might be imposible when we have to create negative + * latencies). + * The stream that has the smallest diff is selected as the reference stream, + * all other streams will have a positive offset to this difference. */ + + /* some alternative setting allow ignoring RTCP as much as possible, + * for servers generating bogus ntp timeline */ + min = rtp_min = G_MAXINT64; + use_rtp = FALSE; + if (rtcp_sync == GST_RTP_BIN_RTCP_SYNC_RTP) { + guint64 ext_base; + + use_rtp = TRUE; + /* signed version for convienience */ + clock_base = base_rtptime; + /* deal with possible wrap-around */ + ext_base = base_rtptime; + rtp_clock_base = gst_rtp_buffer_ext_timestamp (&ext_base, rtp_clock_base); + /* sanity check; base rtp and provided clock_base should be close */ + if (rtp_clock_base >= clock_base) { + if (rtp_clock_base - clock_base < 10 * clock_rate) { + rtp_clock_base = base_time + + gst_util_uint64_scale_int (rtp_clock_base - clock_base, + GST_SECOND, clock_rate); + } else { + use_rtp = FALSE; + } + } else { + if (clock_base - rtp_clock_base < 10 * clock_rate) { + rtp_clock_base = base_time - + gst_util_uint64_scale_int (clock_base - rtp_clock_base, + GST_SECOND, clock_rate); + } else { + use_rtp = FALSE; + } + } + /* warn and bail for clarity out if no sane values */ + if (!use_rtp) { + GST_WARNING_OBJECT (bin, "unable to sync to provided rtptime"); + return; + } + /* store to track changes */ + clock_base = rtp_clock_base; + /* generate a fake as before, + * now equating rtptime obtained from RTP-Info, + * where the large time represent the otherwise irrelevant npt/ntp time */ + stream->rtp_delta = (GST_SECOND << 28) - rtp_clock_base; + } + + for (walk = client->streams; walk; walk = g_slist_next (walk)) { + GstRtpBinStream *ostream = (GstRtpBinStream *) walk->data; + + if (!ostream->have_sync) { + all_sync = FALSE; + continue; + } + + /* change in current stream's base from previously init'ed value + * leads to reset of all stream's base */ + if (stream != ostream && stream->clock_base >= 0 && + (stream->clock_base != clock_base)) { + GST_DEBUG_OBJECT (bin, "reset upon clock base change"); + ostream->clock_base = -100 * GST_SECOND; + ostream->rtp_delta = 0; + } + + if (ostream->rt_delta < min) + min = ostream->rt_delta; + if (ostream->rtp_delta < rtp_min) + rtp_min = ostream->rtp_delta; + } + + /* arrange to re-sync for each stream upon significant change, + * e.g. post-seek */ + all_sync = (stream->clock_base == clock_base); + stream->clock_base = clock_base; + + /* may need init performed above later on, but nothing more to do now */ + if (client->nstreams <= 1) + return; + + GST_DEBUG_OBJECT (bin, "client %p min delta %" G_GINT64_FORMAT + " all sync %d", client, min, all_sync); + GST_DEBUG_OBJECT (bin, "rtcp sync mode %d, use_rtp %d", rtcp_sync, use_rtp); + + switch (rtcp_sync) { + case GST_RTP_BIN_RTCP_SYNC_RTP: + if (!use_rtp) + break; + GST_DEBUG_OBJECT (bin, "using rtp generated reports; " + "client %p min rtp delta %" G_GINT64_FORMAT, client, rtp_min); + /* fall-through */ + case GST_RTP_BIN_RTCP_SYNC_INITIAL: + /* if all have been synced already, do not bother further */ + if (all_sync) { + GST_DEBUG_OBJECT (bin, "all streams already synced; done"); + return; + } + break; + default: + break; + } + + /* bail out if we adjusted recently enough */ + if (all_sync && (last_unix - bin->priv->last_unix) < + bin->rtcp_sync_interval * GST_MSECOND) { + GST_DEBUG_OBJECT (bin, "discarding RTCP sender packet for sync; " + "previous sender info too recent " + "(previous UNIX %" G_GUINT64_FORMAT ")", bin->priv->last_unix); + return; + } + bin->priv->last_unix = last_unix; + + /* calculate offsets for each stream */ + for (walk = client->streams; walk; walk = g_slist_next (walk)) { + GstRtpBinStream *ostream = (GstRtpBinStream *) walk->data; + gint64 ts_offset; + + /* ignore streams for which we didn't receive an SR packet yet, we + * can't synchronize them yet. We can however sync other streams just + * fine. */ + if (!ostream->have_sync) + continue; + + /* calculate offset to our reference stream, this should always give a + * positive number. */ + if (use_rtp) + ts_offset = ostream->rtp_delta - rtp_min; + else + ts_offset = ostream->rt_delta - min; + + stream_set_ts_offset (bin, ostream, ts_offset); + } + } + return; +} + +#define GST_RTCP_BUFFER_FOR_PACKETS(b,buffer,packet) \ + for ((b) = gst_rtcp_buffer_get_first_packet ((buffer), (packet)); (b); \ + (b) = gst_rtcp_packet_move_to_next ((packet))) + +#define GST_RTCP_SDES_FOR_ITEMS(b,packet) \ + for ((b) = gst_rtcp_packet_sdes_first_item ((packet)); (b); \ + (b) = gst_rtcp_packet_sdes_next_item ((packet))) + +#define GST_RTCP_SDES_FOR_ENTRIES(b,packet) \ + for ((b) = gst_rtcp_packet_sdes_first_entry ((packet)); (b); \ + (b) = gst_rtcp_packet_sdes_next_entry ((packet))) + +static void +gst_rtp_bin_handle_sync (GstElement * jitterbuffer, GstStructure * s, + GstRtpBinStream * stream) +{ + GstRtpBin *bin; + GstRTCPPacket packet; + guint32 ssrc; + guint64 ntptime; + gboolean have_sr, have_sdes; + gboolean more; + guint64 base_rtptime; + guint64 base_time; + guint clock_rate; + guint64 clock_base; + guint64 extrtptime; + GstBuffer *buffer; + + bin = stream->bin; + + GST_DEBUG_OBJECT (bin, "sync handler called"); + + /* get the last relation between the rtp timestamps and the gstreamer + * timestamps. We get this info directly from the jitterbuffer which + * constructs gstreamer timestamps from rtp timestamps and so it know exactly + * what the current situation is. */ + base_rtptime = + g_value_get_uint64 (gst_structure_get_value (s, "base-rtptime")); + base_time = g_value_get_uint64 (gst_structure_get_value (s, "base-time")); + clock_rate = g_value_get_uint (gst_structure_get_value (s, "clock-rate")); + clock_base = g_value_get_uint64 (gst_structure_get_value (s, "clock-base")); + extrtptime = + g_value_get_uint64 (gst_structure_get_value (s, "sr-ext-rtptime")); + buffer = gst_value_get_buffer (gst_structure_get_value (s, "sr-buffer")); + + have_sr = FALSE; + have_sdes = FALSE; + GST_RTCP_BUFFER_FOR_PACKETS (more, buffer, &packet) { + /* first packet must be SR or RR or else the validate would have failed */ + switch (gst_rtcp_packet_get_type (&packet)) { + case GST_RTCP_TYPE_SR: + /* only parse first. There is only supposed to be one SR in the packet + * but we will deal with malformed packets gracefully */ + if (have_sr) + break; + /* get NTP and RTP times */ + gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, NULL, + NULL, NULL); + + GST_DEBUG_OBJECT (bin, "received sync packet from SSRC %08x", ssrc); + /* ignore SR that is not ours */ + if (ssrc != stream->ssrc) + continue; + + have_sr = TRUE; + break; + case GST_RTCP_TYPE_SDES: + { + gboolean more_items, more_entries; + + /* only deal with first SDES, there is only supposed to be one SDES in + * the RTCP packet but we deal with bad packets gracefully. Also bail + * out if we have not seen an SR item yet. */ + if (have_sdes || !have_sr) + break; + + GST_RTCP_SDES_FOR_ITEMS (more_items, &packet) { + /* skip items that are not about the SSRC of the sender */ + if (gst_rtcp_packet_sdes_get_ssrc (&packet) != ssrc) + continue; + + /* find the CNAME entry */ + GST_RTCP_SDES_FOR_ENTRIES (more_entries, &packet) { + GstRTCPSDESType type; + guint8 len; + guint8 *data; + + gst_rtcp_packet_sdes_get_entry (&packet, &type, &len, &data); + + if (type == GST_RTCP_SDES_CNAME) { + GST_RTP_BIN_LOCK (bin); + /* associate the stream to CNAME */ + gst_rtp_bin_associate (bin, stream, len, data, + ntptime, extrtptime, base_rtptime, base_time, clock_rate, + clock_base); + GST_RTP_BIN_UNLOCK (bin); + } + } + } + have_sdes = TRUE; + break; + } + default: + /* we can ignore these packets */ + break; + } + } +} + +/* create a new stream with @ssrc in @session. Must be called with + * RTP_SESSION_LOCK. */ +static GstRtpBinStream * +create_stream (GstRtpBinSession * session, guint32 ssrc) +{ + GstElement *buffer, *demux = NULL; + GstRtpBinStream *stream; + GstRtpBin *rtpbin; + GstState target; + + rtpbin = session->bin; + + if (!(buffer = gst_element_factory_make ("gstrtpjitterbuffer", NULL))) + goto no_jitterbuffer; + + if (!rtpbin->ignore_pt) + if (!(demux = gst_element_factory_make ("gstrtpptdemux", NULL))) + goto no_demux; + + + stream = g_new0 (GstRtpBinStream, 1); + stream->ssrc = ssrc; + stream->bin = rtpbin; + stream->session = session; + stream->buffer = buffer; + stream->demux = demux; + + stream->have_sync = FALSE; + stream->rt_delta = 0; + stream->rtp_delta = 0; + stream->percent = 100; + stream->clock_base = -100 * GST_SECOND; + session->streams = g_slist_prepend (session->streams, stream); + + /* provide clock_rate to the jitterbuffer when needed */ + stream->buffer_ptreq_sig = g_signal_connect (buffer, "request-pt-map", + (GCallback) pt_map_requested, session); + stream->buffer_ntpstop_sig = g_signal_connect (buffer, "on-npt-stop", + (GCallback) on_npt_stop, stream); + + g_object_set_data (G_OBJECT (buffer), "GstRTPBin.session", session); + g_object_set_data (G_OBJECT (buffer), "GstRTPBin.stream", stream); + + /* configure latency and packet lost */ + g_object_set (buffer, "latency", rtpbin->latency_ms, NULL); + g_object_set (buffer, "do-lost", rtpbin->do_lost, NULL); + g_object_set (buffer, "mode", rtpbin->buffer_mode, NULL); + + if (!rtpbin->ignore_pt) + gst_bin_add (GST_BIN_CAST (rtpbin), demux); + gst_bin_add (GST_BIN_CAST (rtpbin), buffer); + + /* link stuff */ + if (demux) + gst_element_link (buffer, demux); + + if (rtpbin->buffering) { + guint64 last_out; + + GST_INFO_OBJECT (rtpbin, + "bin is buffering, set jitterbuffer as not active"); + g_signal_emit_by_name (buffer, "set-active", FALSE, (gint64) 0, &last_out); + } + + + GST_OBJECT_LOCK (rtpbin); + target = GST_STATE_TARGET (rtpbin); + GST_OBJECT_UNLOCK (rtpbin); + + /* from sink to source */ + if (demux) + gst_element_set_state (demux, target); + + gst_element_set_state (buffer, target); + + return stream; + + /* ERRORS */ +no_jitterbuffer: + { + g_warning ("gstrtpbin: could not create gstrtpjitterbuffer element"); + return NULL; + } +no_demux: + { + gst_object_unref (buffer); + g_warning ("gstrtpbin: could not create gstrtpptdemux element"); + return NULL; + } +} + +static void +free_stream (GstRtpBinStream * stream) +{ + GstRtpBinSession *session; + + session = stream->session; + + if (stream->demux) { + 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->demux, stream->demux_ptchange_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); + + if (stream->demux) + gst_element_set_locked_state (stream->demux, TRUE); + gst_element_set_locked_state (stream->buffer, TRUE); + + if (stream->demux) + gst_element_set_state (stream->demux, GST_STATE_NULL); + gst_element_set_state (stream->buffer, GST_STATE_NULL); + + /* now remove this signal, we need this while going to NULL because it to + * do some cleanups */ + if (stream->demux) + g_signal_handler_disconnect (stream->demux, stream->demux_padremoved_sig); + + gst_bin_remove (GST_BIN_CAST (session->bin), stream->buffer); + if (stream->demux) + gst_bin_remove (GST_BIN_CAST (session->bin), stream->demux); + + g_free (stream); +} + +/* GObject vmethods */ +static void gst_rtp_bin_dispose (GObject * object); +static void gst_rtp_bin_finalize (GObject * object); +static void gst_rtp_bin_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_bin_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +/* GstElement vmethods */ +static GstStateChangeReturn gst_rtp_bin_change_state (GstElement * element, + GstStateChange transition); +static GstPad *gst_rtp_bin_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_rtp_bin_release_pad (GstElement * element, GstPad * pad); +static void gst_rtp_bin_handle_message (GstBin * bin, GstMessage * message); + +GST_BOILERPLATE (GstRtpBin, gst_rtp_bin, GstBin, GST_TYPE_BIN); + +static void +gst_rtp_bin_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + /* sink pads */ + gst_element_class_add_static_pad_template (element_class, + &rtpbin_recv_rtp_sink_template); + gst_element_class_add_static_pad_template (element_class, + &rtpbin_recv_rtcp_sink_template); + gst_element_class_add_static_pad_template (element_class, + &rtpbin_send_rtp_sink_template); + + /* src pads */ + gst_element_class_add_static_pad_template (element_class, + &rtpbin_recv_rtp_src_template); + gst_element_class_add_static_pad_template (element_class, + &rtpbin_send_rtcp_src_template); + gst_element_class_add_static_pad_template (element_class, + &rtpbin_send_rtp_src_template); + + gst_element_class_set_details_simple (element_class, "RTP Bin", + "Filter/Network/RTP", + "Real-Time Transport Protocol bin", + "Wim Taymans "); +} + +static void +gst_rtp_bin_class_init (GstRtpBinClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBinClass *gstbin_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbin_class = (GstBinClass *) klass; + + g_type_class_add_private (klass, sizeof (GstRtpBinPrivate)); + + gobject_class->dispose = gst_rtp_bin_dispose; + gobject_class->finalize = gst_rtp_bin_finalize; + gobject_class->set_property = gst_rtp_bin_set_property; + gobject_class->get_property = gst_rtp_bin_get_property; + + g_object_class_install_property (gobject_class, PROP_LATENCY, + g_param_spec_uint ("latency", "Buffer latency in ms", + "Default amount of ms to buffer in the jitterbuffers", 0, + G_MAXUINT, DEFAULT_LATENCY_MS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRtpBin::request-pt-map: + * @rtpbin: the object which received the signal + * @session: the session + * @pt: the pt + * + * Request the payload type as #GstCaps for @pt in @session. + */ + gst_rtp_bin_signals[SIGNAL_REQUEST_PT_MAP] = + g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, request_pt_map), + NULL, NULL, gst_rtp_bin_marshal_BOXED__UINT_UINT, GST_TYPE_CAPS, 2, + G_TYPE_UINT, G_TYPE_UINT); + + /** + * GstRtpBin::payload-type-change: + * @rtpbin: the object which received the signal + * @session: the session + * @pt: the pt + * + * Signal that the current payload type changed to @pt in @session. + * + * Since: 0.10.17 + */ + gst_rtp_bin_signals[SIGNAL_PAYLOAD_TYPE_CHANGE] = + g_signal_new ("payload-type-change", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, payload_type_change), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + /** + * GstRtpBin::clear-pt-map: + * @rtpbin: the object which received the signal + * + * Clear all previously cached pt-mapping obtained with + * #GstRtpBin::request-pt-map. + */ + gst_rtp_bin_signals[SIGNAL_CLEAR_PT_MAP] = + g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpBinClass, + clear_pt_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, + 0, G_TYPE_NONE); + + /** + * GstRtpBin::reset-sync: + * @rtpbin: the object which received the signal + * + * Reset all currently configured lip-sync parameters and require new SR + * packets for all streams before lip-sync is attempted again. + */ + gst_rtp_bin_signals[SIGNAL_RESET_SYNC] = + g_signal_new ("reset-sync", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpBinClass, + reset_sync), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, + 0, G_TYPE_NONE); + + /** + * GstRtpBin::get-internal-session: + * @rtpbin: the object which received the signal + * @id: the session id + * + * Request the internal RTPSession object as #GObject in session @id. + */ + gst_rtp_bin_signals[SIGNAL_GET_INTERNAL_SESSION] = + g_signal_new ("get-internal-session", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpBinClass, + get_internal_session), NULL, NULL, gst_rtp_bin_marshal_OBJECT__UINT, + RTP_TYPE_SESSION, 1, G_TYPE_UINT); + + /** + * GstRtpBin::on-new-ssrc: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of a new SSRC that entered @session. + */ + gst_rtp_bin_signals[SIGNAL_ON_NEW_SSRC] = + g_signal_new ("on-new-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_new_ssrc), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRtpBin::on-ssrc-collision: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify when we have an SSRC collision + */ + gst_rtp_bin_signals[SIGNAL_ON_SSRC_COLLISION] = + g_signal_new ("on-ssrc-collision", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_ssrc_collision), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRtpBin::on-ssrc-validated: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of a new SSRC that became validated. + */ + gst_rtp_bin_signals[SIGNAL_ON_SSRC_VALIDATED] = + g_signal_new ("on-ssrc-validated", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_ssrc_validated), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRtpBin::on-ssrc-active: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of a SSRC that is active, i.e., sending RTCP. + */ + gst_rtp_bin_signals[SIGNAL_ON_SSRC_ACTIVE] = + g_signal_new ("on-ssrc-active", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_ssrc_active), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRtpBin::on-ssrc-sdes: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of a SSRC that is active, i.e., sending RTCP. + */ + gst_rtp_bin_signals[SIGNAL_ON_SSRC_SDES] = + g_signal_new ("on-ssrc-sdes", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_ssrc_sdes), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + /** + * GstRtpBin::on-bye-ssrc: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that became inactive because of a BYE packet. + */ + gst_rtp_bin_signals[SIGNAL_ON_BYE_SSRC] = + g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_bye_ssrc), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRtpBin::on-bye-timeout: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that has timed out because of BYE + */ + gst_rtp_bin_signals[SIGNAL_ON_BYE_TIMEOUT] = + g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_bye_timeout), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRtpBin::on-timeout: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that has timed out + */ + gst_rtp_bin_signals[SIGNAL_ON_TIMEOUT] = + g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_timeout), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRtpBin::on-sender-timeout: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of a sender SSRC that has timed out and became a receiver + */ + gst_rtp_bin_signals[SIGNAL_ON_SENDER_TIMEOUT] = + g_signal_new ("on-sender-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_sender_timeout), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + /** + * GstRtpBin::on-npt-stop: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify that SSRC sender has sent data up to the configured NPT stop time. + */ + gst_rtp_bin_signals[SIGNAL_ON_NPT_STOP] = + g_signal_new ("on-npt-stop", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_npt_stop), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + g_object_class_install_property (gobject_class, PROP_SDES, + g_param_spec_boxed ("sdes", "SDES", + "The SDES items of this session", + GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DO_LOST, + g_param_spec_boolean ("do-lost", "Do Lost", + "Send an event downstream when a packet is lost", DEFAULT_DO_LOST, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_AUTOREMOVE, + g_param_spec_boolean ("autoremove", "Auto Remove", + "Automatically remove timed out sources", DEFAULT_AUTOREMOVE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_IGNORE_PT, + g_param_spec_boolean ("ignore-pt", "Ignore PT", + "Do not demultiplex based on PT values", DEFAULT_IGNORE_PT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_USE_PIPELINE_CLOCK, + g_param_spec_boolean ("use-pipeline-clock", "Use pipeline clock", + "Use the pipeline clock to set the NTP time in the RTCP SR messages", + DEFAULT_USE_PIPELINE_CLOCK, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRtpBin::buffer-mode: + * + * Control the buffering and timestamping mode used by the jitterbuffer. + * + * Since: 0.10.17 + */ + g_object_class_install_property (gobject_class, PROP_BUFFER_MODE, + g_param_spec_enum ("buffer-mode", "Buffer Mode", + "Control the buffering algorithm in use", RTP_TYPE_JITTER_BUFFER_MODE, + DEFAULT_BUFFER_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRtpBin::ntp-sync: + * + * Synchronize received streams to the NTP clock. When the NTP clock is shared + * between the receivers and the senders (such as when using ntpd) this option + * can be used to synchronize receivers on multiple machines. + * + * Since: 0.10.21 + */ + g_object_class_install_property (gobject_class, PROP_NTP_SYNC, + g_param_spec_boolean ("ntp-sync", "Sync on NTP clock", + "Synchronize received streams to the NTP clock", DEFAULT_NTP_SYNC, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRtpBin::rtcp-sync: + * + * If not synchronizing (directly) to the NTP clock, determines how to sync + * the various streams. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_RTCP_SYNC, + g_param_spec_enum ("rtcp-sync", "RTCP Sync", + "Use of RTCP SR in synchronization", GST_RTP_BIN_RTCP_SYNC_TYPE, + DEFAULT_RTCP_SYNC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRtpBin::rtcp-sync-interval: + * + * Determines how often to sync streams using RTCP data. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_RTCP_SYNC_INTERVAL, + g_param_spec_uint ("rtcp-sync-interval", "RTCP Sync Interval", + "RTCP SR interval synchronization (ms) (0 = always)", + 0, G_MAXUINT, DEFAULT_RTCP_SYNC_INTERVAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_bin_change_state); + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_rtp_bin_request_new_pad); + gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_bin_release_pad); + + gstbin_class->handle_message = GST_DEBUG_FUNCPTR (gst_rtp_bin_handle_message); + + klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_bin_clear_pt_map); + klass->reset_sync = GST_DEBUG_FUNCPTR (gst_rtp_bin_reset_sync); + klass->get_internal_session = + GST_DEBUG_FUNCPTR (gst_rtp_bin_get_internal_session); + + GST_DEBUG_CATEGORY_INIT (gst_rtp_bin_debug, "rtpbin", 0, "RTP bin"); +} + +static void +gst_rtp_bin_init (GstRtpBin * rtpbin, GstRtpBinClass * klass) +{ + gchar *cname; + + rtpbin->priv = GST_RTP_BIN_GET_PRIVATE (rtpbin); + rtpbin->priv->bin_lock = g_mutex_new (); + rtpbin->priv->dyn_lock = g_mutex_new (); + + rtpbin->latency_ms = DEFAULT_LATENCY_MS; + rtpbin->latency_ns = DEFAULT_LATENCY_MS * GST_MSECOND; + rtpbin->do_lost = DEFAULT_DO_LOST; + rtpbin->ignore_pt = DEFAULT_IGNORE_PT; + rtpbin->ntp_sync = DEFAULT_NTP_SYNC; + rtpbin->rtcp_sync = DEFAULT_RTCP_SYNC; + rtpbin->rtcp_sync_interval = DEFAULT_RTCP_SYNC_INTERVAL; + rtpbin->priv->autoremove = DEFAULT_AUTOREMOVE; + rtpbin->buffer_mode = DEFAULT_BUFFER_MODE; + rtpbin->use_pipeline_clock = DEFAULT_USE_PIPELINE_CLOCK; + + /* some default SDES entries */ + cname = g_strdup_printf ("user%u@host-%x", g_random_int (), g_random_int ()); + rtpbin->sdes = gst_structure_new ("application/x-rtp-source-sdes", + "cname", G_TYPE_STRING, cname, "tool", G_TYPE_STRING, "GStreamer", NULL); + g_free (cname); +} + +static void +gst_rtp_bin_dispose (GObject * object) +{ + GstRtpBin *rtpbin; + + rtpbin = GST_RTP_BIN (object); + + GST_DEBUG_OBJECT (object, "freeing sessions"); + 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, rtpbin); + g_slist_free (rtpbin->clients); + rtpbin->clients = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_rtp_bin_finalize (GObject * object) +{ + GstRtpBin *rtpbin; + + rtpbin = GST_RTP_BIN (object); + + if (rtpbin->sdes) + gst_structure_free (rtpbin->sdes); + + g_mutex_free (rtpbin->priv->bin_lock); + g_mutex_free (rtpbin->priv->dyn_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static void +gst_rtp_bin_set_sdes_struct (GstRtpBin * bin, const GstStructure * sdes) +{ + GSList *item; + + if (sdes == NULL) + return; + + GST_RTP_BIN_LOCK (bin); + + GST_OBJECT_LOCK (bin); + if (bin->sdes) + gst_structure_free (bin->sdes); + bin->sdes = gst_structure_copy (sdes); + GST_OBJECT_UNLOCK (bin); + + /* store in all sessions */ + for (item = bin->sessions; item; item = g_slist_next (item)) { + GstRtpBinSession *session = item->data; + g_object_set (session->session, "sdes", sdes, NULL); + } + + GST_RTP_BIN_UNLOCK (bin); +} + +static GstStructure * +gst_rtp_bin_get_sdes_struct (GstRtpBin * bin) +{ + GstStructure *result; + + GST_OBJECT_LOCK (bin); + result = gst_structure_copy (bin->sdes); + GST_OBJECT_UNLOCK (bin); + + return result; +} + +static void +gst_rtp_bin_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpBin *rtpbin; + + rtpbin = GST_RTP_BIN (object); + + switch (prop_id) { + case PROP_LATENCY: + GST_RTP_BIN_LOCK (rtpbin); + rtpbin->latency_ms = g_value_get_uint (value); + rtpbin->latency_ns = rtpbin->latency_ms * GST_MSECOND; + GST_RTP_BIN_UNLOCK (rtpbin); + /* propagate the property down to the jitterbuffer */ + gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin, "latency", value); + break; + case PROP_SDES: + gst_rtp_bin_set_sdes_struct (rtpbin, g_value_get_boxed (value)); + break; + case PROP_DO_LOST: + GST_RTP_BIN_LOCK (rtpbin); + rtpbin->do_lost = g_value_get_boolean (value); + GST_RTP_BIN_UNLOCK (rtpbin); + gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin, "do-lost", value); + break; + case PROP_NTP_SYNC: + rtpbin->ntp_sync = g_value_get_boolean (value); + break; + case PROP_RTCP_SYNC: + g_atomic_int_set (&rtpbin->rtcp_sync, g_value_get_enum (value)); + break; + case PROP_RTCP_SYNC_INTERVAL: + rtpbin->rtcp_sync_interval = g_value_get_uint (value); + break; + case PROP_IGNORE_PT: + rtpbin->ignore_pt = g_value_get_boolean (value); + break; + case PROP_AUTOREMOVE: + rtpbin->priv->autoremove = g_value_get_boolean (value); + break; + case PROP_USE_PIPELINE_CLOCK: + { + GSList *sessions; + GST_RTP_BIN_LOCK (rtpbin); + rtpbin->use_pipeline_clock = g_value_get_boolean (value); + for (sessions = rtpbin->sessions; sessions; + sessions = g_slist_next (sessions)) { + GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; + + g_object_set (G_OBJECT (session->session), + "use-pipeline-clock", rtpbin->use_pipeline_clock, NULL); + } + GST_RTP_BIN_UNLOCK (rtpbin); + } + break; + case PROP_BUFFER_MODE: + GST_RTP_BIN_LOCK (rtpbin); + rtpbin->buffer_mode = g_value_get_enum (value); + GST_RTP_BIN_UNLOCK (rtpbin); + /* propagate the property down to the jitterbuffer */ + gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin, "mode", value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_bin_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpBin *rtpbin; + + rtpbin = GST_RTP_BIN (object); + + switch (prop_id) { + case PROP_LATENCY: + GST_RTP_BIN_LOCK (rtpbin); + g_value_set_uint (value, rtpbin->latency_ms); + GST_RTP_BIN_UNLOCK (rtpbin); + break; + case PROP_SDES: + g_value_take_boxed (value, gst_rtp_bin_get_sdes_struct (rtpbin)); + break; + case PROP_DO_LOST: + GST_RTP_BIN_LOCK (rtpbin); + g_value_set_boolean (value, rtpbin->do_lost); + GST_RTP_BIN_UNLOCK (rtpbin); + break; + case PROP_IGNORE_PT: + g_value_set_boolean (value, rtpbin->ignore_pt); + break; + case PROP_NTP_SYNC: + g_value_set_boolean (value, rtpbin->ntp_sync); + break; + case PROP_RTCP_SYNC: + g_value_set_enum (value, g_atomic_int_get (&rtpbin->rtcp_sync)); + break; + case PROP_RTCP_SYNC_INTERVAL: + g_value_set_uint (value, rtpbin->rtcp_sync_interval); + break; + case PROP_AUTOREMOVE: + g_value_set_boolean (value, rtpbin->priv->autoremove); + break; + case PROP_BUFFER_MODE: + g_value_set_enum (value, rtpbin->buffer_mode); + break; + case PROP_USE_PIPELINE_CLOCK: + g_value_set_boolean (value, rtpbin->use_pipeline_clock); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_bin_handle_message (GstBin * bin, GstMessage * message) +{ + GstRtpBin *rtpbin; + + rtpbin = GST_RTP_BIN (bin); + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ELEMENT: + { + const GstStructure *s = gst_message_get_structure (message); + + /* we change the structure name and add the session ID to it */ + if (gst_structure_has_name (s, "application/x-rtp-source-sdes")) { + GstRtpBinSession *sess; + + /* find the session we set it as object data */ + sess = g_object_get_data (G_OBJECT (GST_MESSAGE_SRC (message)), + "GstRTPBin.session"); + + if (G_LIKELY (sess)) { + message = gst_message_make_writable (message); + s = gst_message_get_structure (message); + gst_structure_set ((GstStructure *) s, "session", G_TYPE_UINT, + sess->id, NULL); + } + } + GST_BIN_CLASS (parent_class)->handle_message (bin, message); + break; + } + case GST_MESSAGE_BUFFERING: + { + gint percent; + gint min_percent = 100; + GSList *sessions, *streams; + GstRtpBinStream *stream; + gboolean change = FALSE, active = FALSE; + GstClockTime min_out_time; + GstBufferingMode mode; + gint avg_in, avg_out; + gint64 buffering_left; + + gst_message_parse_buffering (message, &percent); + gst_message_parse_buffering_stats (message, &mode, &avg_in, &avg_out, + &buffering_left); + + stream = + g_object_get_data (G_OBJECT (GST_MESSAGE_SRC (message)), + "GstRTPBin.stream"); + + GST_DEBUG_OBJECT (bin, "got percent %d from stream %p", percent, stream); + + /* get the stream */ + if (G_LIKELY (stream)) { + GST_RTP_BIN_LOCK (rtpbin); + /* fill in the percent */ + stream->percent = percent; + + /* calculate the min value for all streams */ + for (sessions = rtpbin->sessions; sessions; + sessions = g_slist_next (sessions)) { + GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; + + GST_RTP_SESSION_LOCK (session); + if (session->streams) { + for (streams = session->streams; streams; + streams = g_slist_next (streams)) { + GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; + + GST_DEBUG_OBJECT (bin, "stream %p percent %d", stream, + stream->percent); + + /* find min percent */ + if (min_percent > stream->percent) + min_percent = stream->percent; + } + } else { + GST_INFO_OBJECT (bin, + "session has no streams, setting min_percent to 0"); + min_percent = 0; + } + GST_RTP_SESSION_UNLOCK (session); + } + GST_DEBUG_OBJECT (bin, "min percent %d", min_percent); + + if (rtpbin->buffering) { + if (min_percent == 100) { + rtpbin->buffering = FALSE; + active = TRUE; + change = TRUE; + } + } else { + if (min_percent < 100) { + /* pause the streams */ + rtpbin->buffering = TRUE; + active = FALSE; + change = TRUE; + } + } + GST_RTP_BIN_UNLOCK (rtpbin); + + gst_message_unref (message); + + /* make a new buffering message with the min value */ + message = + gst_message_new_buffering (GST_OBJECT_CAST (bin), min_percent); + gst_message_set_buffering_stats (message, mode, avg_in, avg_out, + buffering_left); + + if (G_UNLIKELY (change)) { + GstClock *clock; + guint64 running_time = 0; + guint64 offset = 0; + + /* figure out the running time when we have a clock */ + if (G_LIKELY ((clock = + gst_element_get_clock (GST_ELEMENT_CAST (bin))))) { + guint64 now, base_time; + + now = gst_clock_get_time (clock); + base_time = gst_element_get_base_time (GST_ELEMENT_CAST (bin)); + running_time = now - base_time; + gst_object_unref (clock); + } + GST_DEBUG_OBJECT (bin, + "running time now %" GST_TIME_FORMAT, + GST_TIME_ARGS (running_time)); + + GST_RTP_BIN_LOCK (rtpbin); + + /* when we reactivate, calculate the offsets so that all streams have + * an output time that is at least as big as the running_time */ + offset = 0; + if (active) { + if (running_time > rtpbin->buffer_start) { + offset = running_time - rtpbin->buffer_start; + if (offset >= rtpbin->latency_ns) + offset -= rtpbin->latency_ns; + else + offset = 0; + } + } + + /* pause all streams */ + min_out_time = -1; + for (sessions = rtpbin->sessions; sessions; + sessions = g_slist_next (sessions)) { + GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; + + GST_RTP_SESSION_LOCK (session); + for (streams = session->streams; streams; + streams = g_slist_next (streams)) { + GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; + GstElement *element = stream->buffer; + guint64 last_out; + + g_signal_emit_by_name (element, "set-active", active, offset, + &last_out); + + if (!active) { + g_object_get (element, "percent", &stream->percent, NULL); + + if (last_out == -1) + last_out = 0; + if (min_out_time == -1 || last_out < min_out_time) + min_out_time = last_out; + } + + GST_DEBUG_OBJECT (bin, + "setting %p to %d, offset %" GST_TIME_FORMAT ", last %" + GST_TIME_FORMAT ", percent %d", element, active, + GST_TIME_ARGS (offset), GST_TIME_ARGS (last_out), + stream->percent); + } + GST_RTP_SESSION_UNLOCK (session); + } + GST_DEBUG_OBJECT (bin, + "min out time %" GST_TIME_FORMAT, GST_TIME_ARGS (min_out_time)); + + /* the buffer_start is the min out time of all paused jitterbuffers */ + if (!active) + rtpbin->buffer_start = min_out_time; + + GST_RTP_BIN_UNLOCK (rtpbin); + } + } + GST_BIN_CLASS (parent_class)->handle_message (bin, message); + break; + } + default: + { + GST_BIN_CLASS (parent_class)->handle_message (bin, message); + break; + } + } +} + +static GstStateChangeReturn +gst_rtp_bin_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn res; + GstRtpBin *rtpbin; + GstRtpBinPrivate *priv; + + rtpbin = GST_RTP_BIN (element); + priv = rtpbin->priv; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + priv->last_unix = 0; + GST_LOG_OBJECT (rtpbin, "clearing shutdown flag"); + g_atomic_int_set (&priv->shutdown, 0); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_LOG_OBJECT (rtpbin, "setting shutdown flag"); + g_atomic_int_set (&priv->shutdown, 1); + /* wait for all callbacks to end by taking the lock. No new callbacks will + * be able to happen as we set the shutdown flag. */ + GST_RTP_BIN_DYN_LOCK (rtpbin); + GST_LOG_OBJECT (rtpbin, "dynamic lock taken, we can continue shutdown"); + GST_RTP_BIN_DYN_UNLOCK (rtpbin); + break; + default: + break; + } + + res = 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: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return res; +} + +/* a new pad (SSRC) was created in @session. This signal is emited from the + * payload demuxer. */ +static void +new_payload_found (GstElement * element, guint pt, GstPad * pad, + GstRtpBinStream * stream) +{ + GstRtpBin *rtpbin; + GstElementClass *klass; + GstPadTemplate *templ; + gchar *padname; + GstPad *gpad; + + rtpbin = stream->bin; + + GST_DEBUG ("new payload pad %d", pt); + + GST_RTP_BIN_SHUTDOWN_LOCK (rtpbin, shutdown); + + /* ghost the pad to the parent */ + klass = GST_ELEMENT_GET_CLASS (rtpbin); + templ = gst_element_class_get_pad_template (klass, "recv_rtp_src_%d_%d_%d"); + padname = g_strdup_printf ("recv_rtp_src_%d_%u_%d", + stream->session->id, stream->ssrc, pt); + gpad = gst_ghost_pad_new_from_template (padname, pad, templ); + g_free (padname); + g_object_set_data (G_OBJECT (pad), "GstRTPBin.ghostpad", gpad); + + gst_pad_set_caps (gpad, GST_PAD_CAPS (pad)); + gst_pad_set_active (gpad, TRUE); + GST_RTP_BIN_SHUTDOWN_UNLOCK (rtpbin); + + gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), gpad); + + return; + +shutdown: + { + GST_DEBUG ("ignoring, we are shutting down"); + return; + } +} + +static void +payload_pad_removed (GstElement * element, GstPad * pad, + GstRtpBinStream * stream) +{ + GstRtpBin *rtpbin; + GstPad *gpad; + + rtpbin = stream->bin; + + GST_DEBUG ("payload pad removed"); + + GST_RTP_BIN_DYN_LOCK (rtpbin); + if ((gpad = g_object_get_data (G_OBJECT (pad), "GstRTPBin.ghostpad"))) { + g_object_set_data (G_OBJECT (pad), "GstRTPBin.ghostpad", NULL); + + gst_pad_set_active (gpad, FALSE); + gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin), gpad); + } + GST_RTP_BIN_DYN_UNLOCK (rtpbin); +} + +static GstCaps * +pt_map_requested (GstElement * element, guint pt, GstRtpBinSession * session) +{ + GstRtpBin *rtpbin; + GstCaps *caps; + + rtpbin = session->bin; + + GST_DEBUG_OBJECT (rtpbin, "payload map requested for pt %d in session %d", pt, + session->id); + + caps = get_pt_map (session, pt); + if (!caps) + goto no_caps; + + return caps; + + /* ERRORS */ +no_caps: + { + GST_DEBUG_OBJECT (rtpbin, "could not get caps"); + return NULL; + } +} + +static void +payload_type_change (GstElement * element, guint pt, GstRtpBinSession * session) +{ + GST_DEBUG_OBJECT (session->bin, + "emiting signal for pt type changed to %d in session %d", pt, + session->id); + + g_signal_emit (session->bin, gst_rtp_bin_signals[SIGNAL_PAYLOAD_TYPE_CHANGE], + 0, session->id, pt); +} + +/* emited when caps changed for the session */ +static void +caps_changed (GstPad * pad, GParamSpec * pspec, GstRtpBinSession * session) +{ + GstRtpBin *bin; + GstCaps *caps; + gint payload; + const GstStructure *s; + + bin = session->bin; + + g_object_get (pad, "caps", &caps, NULL); + + if (caps == NULL) + return; + + GST_DEBUG_OBJECT (bin, "got caps %" GST_PTR_FORMAT, caps); + + s = gst_caps_get_structure (caps, 0); + + /* get payload, finish when it's not there */ + if (!gst_structure_get_int (s, "payload", &payload)) + return; + + GST_RTP_SESSION_LOCK (session); + GST_DEBUG_OBJECT (bin, "insert caps for payload %d", payload); + g_hash_table_insert (session->ptmap, GINT_TO_POINTER (payload), caps); + GST_RTP_SESSION_UNLOCK (session); +} + +/* a new pad (SSRC) was created in @session */ +static void +new_ssrc_pad_found (GstElement * element, guint ssrc, GstPad * pad, + GstRtpBinSession * session) +{ + GstRtpBin *rtpbin; + GstRtpBinStream *stream; + GstPad *sinkpad, *srcpad; + gchar *padname; + + rtpbin = session->bin; + + GST_DEBUG_OBJECT (rtpbin, "new SSRC pad %08x, %s:%s", ssrc, + GST_DEBUG_PAD_NAME (pad)); + + GST_RTP_BIN_SHUTDOWN_LOCK (rtpbin, shutdown); + + GST_RTP_SESSION_LOCK (session); + + /* create new stream */ + stream = create_stream (session, ssrc); + if (!stream) + goto no_stream; + + /* get pad and link */ + GST_DEBUG_OBJECT (rtpbin, "linking jitterbuffer RTP"); + padname = g_strdup_printf ("src_%d", ssrc); + srcpad = gst_element_get_static_pad (element, padname); + g_free (padname); + sinkpad = gst_element_get_static_pad (stream->buffer, "sink"); + gst_pad_link (srcpad, sinkpad); + gst_object_unref (sinkpad); + gst_object_unref (srcpad); + + GST_DEBUG_OBJECT (rtpbin, "linking jitterbuffer RTCP"); + padname = g_strdup_printf ("rtcp_src_%d", ssrc); + srcpad = gst_element_get_static_pad (element, padname); + g_free (padname); + sinkpad = gst_element_get_request_pad (stream->buffer, "sink_rtcp"); + gst_pad_link (srcpad, sinkpad); + gst_object_unref (sinkpad); + gst_object_unref (srcpad); + + /* connect to the RTCP sync signal from the jitterbuffer */ + GST_DEBUG_OBJECT (rtpbin, "connecting sync signal"); + stream->buffer_handlesync_sig = g_signal_connect (stream->buffer, + "handle-sync", (GCallback) gst_rtp_bin_handle_sync, stream); + + if (stream->demux) { + /* connect to the new-pad signal of the payload demuxer, this will expose the + * new pad by ghosting it. */ + stream->demux_newpad_sig = g_signal_connect (stream->demux, + "new-payload-type", (GCallback) new_payload_found, stream); + stream->demux_padremoved_sig = g_signal_connect (stream->demux, + "pad-removed", (GCallback) payload_pad_removed, stream); + + /* connect to the request-pt-map signal. This signal will be emited by the + * demuxer so that it can apply a proper caps on the buffers for the + * depayloaders. */ + stream->demux_ptreq_sig = g_signal_connect (stream->demux, + "request-pt-map", (GCallback) pt_map_requested, session); + /* connect to the signal so it can be forwarded. */ + stream->demux_ptchange_sig = g_signal_connect (stream->demux, + "payload-type-change", (GCallback) payload_type_change, session); + } else { + /* add gstrtpjitterbuffer src pad to pads */ + GstElementClass *klass; + GstPadTemplate *templ; + gchar *padname; + GstPad *gpad, *pad; + + pad = gst_element_get_static_pad (stream->buffer, "src"); + + /* ghost the pad to the parent */ + klass = GST_ELEMENT_GET_CLASS (rtpbin); + templ = gst_element_class_get_pad_template (klass, "recv_rtp_src_%d_%d_%d"); + padname = g_strdup_printf ("recv_rtp_src_%d_%u_%d", + stream->session->id, stream->ssrc, 255); + gpad = gst_ghost_pad_new_from_template (padname, pad, templ); + g_free (padname); + + gst_pad_set_caps (gpad, GST_PAD_CAPS (pad)); + gst_pad_set_active (gpad, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), gpad); + + gst_object_unref (pad); + } + + GST_RTP_SESSION_UNLOCK (session); + GST_RTP_BIN_SHUTDOWN_UNLOCK (rtpbin); + + return; + + /* ERRORS */ +shutdown: + { + GST_DEBUG_OBJECT (rtpbin, "we are shutting down"); + return; + } +no_stream: + { + GST_RTP_SESSION_UNLOCK (session); + GST_RTP_BIN_SHUTDOWN_UNLOCK (rtpbin); + GST_DEBUG_OBJECT (rtpbin, "could not create stream"); + return; + } +} + +/* Create a pad for receiving RTP for the session in @name. Must be called with + * RTP_BIN_LOCK. + */ +static GstPad * +create_recv_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name) +{ + GstPad *sinkdpad; + guint sessid; + GstRtpBinSession *session; + GstPadLinkReturn lres; + + /* first get the session number */ + if (name == NULL || sscanf (name, "recv_rtp_sink_%d", &sessid) != 1) + goto no_name; + + GST_DEBUG_OBJECT (rtpbin, "finding session %d", sessid); + + /* get or create session */ + session = find_session_by_id (rtpbin, sessid); + if (!session) { + GST_DEBUG_OBJECT (rtpbin, "creating session %d", sessid); + /* create session now */ + session = create_session (rtpbin, sessid); + if (session == NULL) + goto create_error; + } + + /* check if pad was requested */ + 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 */ + session->recv_rtp_sink = + gst_element_get_request_pad (session->session, "recv_rtp_sink"); + if (session->recv_rtp_sink == NULL) + goto pad_failed; + + g_signal_connect (session->recv_rtp_sink, "notify::caps", + (GCallback) caps_changed, session); + + GST_DEBUG_OBJECT (rtpbin, "getting RTP src pad"); + /* get srcpad, link to SSRCDemux */ + session->recv_rtp_src = + gst_element_get_static_pad (session->session, "recv_rtp_src"); + if (session->recv_rtp_src == NULL) + goto pad_failed; + + GST_DEBUG_OBJECT (rtpbin, "getting demuxer RTP sink pad"); + sinkdpad = gst_element_get_static_pad (session->demux, "sink"); + GST_DEBUG_OBJECT (rtpbin, "linking demuxer RTP sink pad"); + lres = gst_pad_link (session->recv_rtp_src, sinkdpad); + gst_object_unref (sinkdpad); + if (lres != GST_PAD_LINK_OK) + goto link_failed; + + /* 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"); + session->recv_rtp_sink_ghost = + gst_ghost_pad_new_from_template (name, session->recv_rtp_sink, templ); + gst_pad_set_active (session->recv_rtp_sink_ghost, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->recv_rtp_sink_ghost); + + return session->recv_rtp_sink_ghost; + + /* ERRORS */ +no_name: + { + g_warning ("gstrtpbin: invalid name given"); + return NULL; + } +create_error: + { + /* create_session already warned */ + return NULL; + } +pad_failed: + { + g_warning ("gstrtpbin: failed to get session pad"); + return NULL; + } +link_failed: + { + g_warning ("gstrtpbin: failed to link pads"); + return NULL; + } +} + +static void +remove_recv_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session) +{ + 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 + * RTP_BIN_LOCK. + */ +static GstPad * +create_recv_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ, + const gchar * name) +{ + guint sessid; + GstRtpBinSession *session; + GstPad *sinkdpad; + GstPadLinkReturn lres; + + /* first get the session number */ + if (name == NULL || sscanf (name, "recv_rtcp_sink_%d", &sessid) != 1) + goto no_name; + + GST_DEBUG_OBJECT (rtpbin, "finding session %d", sessid); + + /* get or create the session */ + session = find_session_by_id (rtpbin, sessid); + if (!session) { + GST_DEBUG_OBJECT (rtpbin, "creating session %d", sessid); + /* create session now */ + session = create_session (rtpbin, sessid); + if (session == NULL) + goto create_error; + } + + /* check if pad was requested */ + 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"); + session->recv_rtcp_sink = + gst_element_get_request_pad (session->session, "recv_rtcp_sink"); + if (session->recv_rtcp_sink == NULL) + goto pad_failed; + + /* get srcpad, link to SSRCDemux */ + GST_DEBUG_OBJECT (rtpbin, "getting sync src pad"); + session->sync_src = gst_element_get_static_pad (session->session, "sync_src"); + if (session->sync_src == NULL) + goto pad_failed; + + GST_DEBUG_OBJECT (rtpbin, "getting demuxer RTCP sink pad"); + sinkdpad = gst_element_get_static_pad (session->demux, "rtcp_sink"); + lres = gst_pad_link (session->sync_src, sinkdpad); + gst_object_unref (sinkdpad); + if (lres != GST_PAD_LINK_OK) + goto link_failed; + + session->recv_rtcp_sink_ghost = + gst_ghost_pad_new_from_template (name, session->recv_rtcp_sink, templ); + gst_pad_set_active (session->recv_rtcp_sink_ghost, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), + session->recv_rtcp_sink_ghost); + + return session->recv_rtcp_sink_ghost; + + /* ERRORS */ +no_name: + { + g_warning ("gstrtpbin: invalid name given"); + return NULL; + } +create_error: + { + /* create_session already warned */ + return NULL; + } +pad_failed: + { + g_warning ("gstrtpbin: failed to get session pad"); + return NULL; + } +link_failed: + { + g_warning ("gstrtpbin: failed to link pads"); + return NULL; + } +} + +static void +remove_recv_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session) +{ + 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 + * RTP_BIN_LOCK. + */ +static GstPad * +create_send_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name) +{ + gchar *gname; + guint sessid; + GstRtpBinSession *session; + GstElementClass *klass; + + /* first get the session number */ + if (name == NULL || sscanf (name, "send_rtp_sink_%d", &sessid) != 1) + goto no_name; + + /* get or create session */ + session = find_session_by_id (rtpbin, sessid); + if (!session) { + /* create session now */ + session = create_session (rtpbin, sessid); + if (session == NULL) + goto create_error; + } + + /* check if pad was requested */ + if (session->send_rtp_sink_ghost != NULL) + return session->send_rtp_sink_ghost; + + /* get send_rtp pad and store */ + session->send_rtp_sink = + gst_element_get_request_pad (session->session, "send_rtp_sink"); + if (session->send_rtp_sink == NULL) + goto pad_failed; + + session->send_rtp_sink_ghost = + gst_ghost_pad_new_from_template (name, session->send_rtp_sink, templ); + 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 = + gst_element_get_static_pad (session->session, "send_rtp_src"); + if (session->send_rtp_src == NULL) + goto no_srcpad; + + /* ghost the new source pad */ + 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"); + session->send_rtp_src_ghost = + gst_ghost_pad_new_from_template (gname, session->send_rtp_src, templ); + 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 session->send_rtp_sink_ghost; + + /* ERRORS */ +no_name: + { + g_warning ("gstrtpbin: invalid name given"); + return NULL; + } +create_error: + { + /* create_session already warned */ + return NULL; + } +pad_failed: + { + g_warning ("gstrtpbin: failed to get session pad for session %d", sessid); + return NULL; + } +no_srcpad: + { + g_warning ("gstrtpbin: failed to get rtp source pad for session %d", + sessid); + return NULL; + } +} + +static void +remove_send_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session) +{ + 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 + * RTP_BIN_LOCK. + */ +static GstPad * +create_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name) +{ + guint sessid; + GstRtpBinSession *session; + + /* first get the session number */ + if (name == NULL || sscanf (name, "send_rtcp_src_%d", &sessid) != 1) + goto no_name; + + /* get or create session */ + session = find_session_by_id (rtpbin, sessid); + if (!session) + goto no_session; + + /* check if pad was requested */ + if (session->send_rtcp_src_ghost != NULL) + return session->send_rtcp_src_ghost; + + /* get rtcp_src pad and store */ + session->send_rtcp_src = + gst_element_get_request_pad (session->session, "send_rtcp_src"); + if (session->send_rtcp_src == NULL) + goto pad_failed; + + session->send_rtcp_src_ghost = + gst_ghost_pad_new_from_template (name, session->send_rtcp_src, templ); + gst_pad_set_active (session->send_rtcp_src_ghost, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtcp_src_ghost); + + return session->send_rtcp_src_ghost; + + /* ERRORS */ +no_name: + { + g_warning ("gstrtpbin: invalid name given"); + return NULL; + } +no_session: + { + g_warning ("gstrtpbin: session with id %d does not exist", sessid); + return NULL; + } +pad_failed: + { + g_warning ("gstrtpbin: failed to get rtcp pad for session %d", sessid); + return NULL; + } +} + +static void +remove_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session) +{ + 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 + * the session number assuming we want the lowest posible session + * with a free pad like the template */ +static gchar * +gst_rtp_bin_get_free_pad_name (GstElement * element, GstPadTemplate * templ) +{ + gboolean name_found = FALSE; + gint session = 0; + GstIterator *pad_it = NULL; + gchar *pad_name = NULL; + + GST_DEBUG_OBJECT (element, "find a free pad name for template"); + while (!name_found) { + gboolean done = FALSE; + g_free (pad_name); + pad_name = g_strdup_printf (templ->name_template, session++); + pad_it = gst_element_iterate_pads (GST_ELEMENT (element)); + name_found = TRUE; + while (!done) { + gpointer data; + + switch (gst_iterator_next (pad_it, &data)) { + case GST_ITERATOR_OK: + { + GstPad *pad; + gchar *name; + + pad = GST_PAD_CAST (data); + name = gst_pad_get_name (pad); + + if (strcmp (name, pad_name) == 0) { + done = TRUE; + name_found = FALSE; + } + g_free (name); + gst_object_unref (pad); + break; + } + case GST_ITERATOR_ERROR: + case GST_ITERATOR_RESYNC: + /* restart iteration */ + done = TRUE; + name_found = FALSE; + session = 0; + break; + case GST_ITERATOR_DONE: + done = TRUE; + break; + } + } + gst_iterator_free (pad_it); + } + + GST_DEBUG_OBJECT (element, "free pad name found: '%s'", pad_name); + return pad_name; +} + +/* + */ +static GstPad * +gst_rtp_bin_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name) +{ + GstRtpBin *rtpbin; + GstElementClass *klass; + GstPad *result; + + gchar *pad_name = NULL; + + g_return_val_if_fail (templ != NULL, NULL); + g_return_val_if_fail (GST_IS_RTP_BIN (element), NULL); + + rtpbin = GST_RTP_BIN (element); + klass = GST_ELEMENT_GET_CLASS (element); + + GST_RTP_BIN_LOCK (rtpbin); + + if (name == NULL) { + /* use a free pad name */ + pad_name = gst_rtp_bin_get_free_pad_name (element, templ); + } else { + /* use the provided name */ + pad_name = g_strdup (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")) { + result = create_recv_rtp (rtpbin, templ, pad_name); + } else if (templ == gst_element_class_get_pad_template (klass, + "recv_rtcp_sink_%d")) { + result = create_recv_rtcp (rtpbin, templ, pad_name); + } else if (templ == gst_element_class_get_pad_template (klass, + "send_rtp_sink_%d")) { + result = create_send_rtp (rtpbin, templ, pad_name); + } else if (templ == gst_element_class_get_pad_template (klass, + "send_rtcp_src_%d")) { + result = create_rtcp (rtpbin, templ, pad_name); + } else + goto wrong_template; + + g_free (pad_name); + GST_RTP_BIN_UNLOCK (rtpbin); + + return result; + + /* ERRORS */ +wrong_template: + { + g_free (pad_name); + GST_RTP_BIN_UNLOCK (rtpbin); + g_warning ("gstrtpbin: this is not our template"); + return NULL; + } +} + +static void +gst_rtp_bin_release_pad (GstElement * element, GstPad * pad) +{ + GstRtpBinSession *session; + GstRtpBin *rtpbin; + + g_return_if_fail (GST_IS_GHOST_PAD (pad)); + g_return_if_fail (GST_IS_RTP_BIN (element)); + + rtpbin = GST_RTP_BIN (element); + + GST_RTP_BIN_LOCK (rtpbin); + 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_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); + } + + /* 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; + + /* ERROR */ +unknown_pad: + { + GST_RTP_BIN_UNLOCK (rtpbin); + g_warning ("gstrtpbin: %s:%s is not one of our request pads", + GST_DEBUG_PAD_NAME (pad)); + return; + } +} diff --git a/gst/rtpmanager/gstrtpbin.h b/gst/rtpmanager/gstrtpbin.h new file mode 100644 index 0000000..a915787 --- /dev/null +++ b/gst/rtpmanager/gstrtpbin.h @@ -0,0 +1,100 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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_RTP_BIN_H__ +#define __GST_RTP_BIN_H__ + +#include + +#include "rtpsession.h" +#include "rtpjitterbuffer.h" + +#define GST_TYPE_RTP_BIN \ + (gst_rtp_bin_get_type()) +#define GST_RTP_BIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_BIN,GstRtpBin)) +#define GST_RTP_BIN_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_BIN,GstRtpBinClass)) +#define GST_IS_RTP_BIN(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_BIN)) +#define GST_IS_RTP_BIN_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_BIN)) + +typedef struct _GstRtpBin GstRtpBin; +typedef struct _GstRtpBinClass GstRtpBinClass; +typedef struct _GstRtpBinPrivate GstRtpBinPrivate; + +struct _GstRtpBin { + GstBin bin; + + /*< private >*/ + /* default latency for sessions */ + guint latency_ms; + guint64 latency_ns; + gboolean do_lost; + gboolean ignore_pt; + gboolean ntp_sync; + gint rtcp_sync; + guint rtcp_sync_interval; + RTPJitterBufferMode buffer_mode; + gboolean buffering; + gboolean use_pipeline_clock; + GstClockTime buffer_start; + /* a list of session */ + GSList *sessions; + + /* a list of clients, these are streams with the same CNAME */ + GSList *clients; + + /* the default SDES items for sessions */ + GstStructure *sdes; + + /*< private >*/ + GstRtpBinPrivate *priv; +}; + +struct _GstRtpBinClass { + GstBinClass parent_class; + + /* get the caps for pt */ + GstCaps* (*request_pt_map) (GstRtpBin *rtpbin, guint session, guint pt); + + void (*payload_type_change) (GstRtpBin *rtpbin, guint session, guint pt); + + /* action signals */ + void (*clear_pt_map) (GstRtpBin *rtpbin); + void (*reset_sync) (GstRtpBin *rtpbin); + RTPSession* (*get_internal_session) (GstRtpBin *rtpbin, guint session_id); + + /* session manager signals */ + void (*on_new_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_ssrc_collision) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_ssrc_validated) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_ssrc_active) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_ssrc_sdes) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_bye_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_bye_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_sender_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc); + void (*on_npt_stop) (GstRtpBin *rtpbin, guint session, guint32 ssrc); +}; + +GType gst_rtp_bin_get_type (void); + +#endif /* __GST_RTP_BIN_H__ */ diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c new file mode 100644 index 0000000..4c72fb6 --- /dev/null +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -0,0 +1,2299 @@ +/* + * Farsight Voice+Video library + * + * Copyright 2007 Collabora Ltd, + * Copyright 2007 Nokia Corporation + * @author: Philippe Kalaf . + * Copyright 2007 Wim Taymans + * + * 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-gstrtpjitterbuffer + * + * This element reorders and removes duplicate RTP packets as they are received + * from a network source. It will also wait for missing packets up to a + * configurable time limit using the #GstRtpJitterBuffer:latency property. + * Packets arriving too late are considered to be lost packets. + * + * This element acts as a live element and so adds #GstRtpJitterBuffer:latency + * to the pipeline. + * + * The element needs the clock-rate of the RTP payload in order to estimate the + * delay. This information is obtained either from the caps on the sink pad or, + * when no caps are present, from the #GstRtpJitterBuffer::request-pt-map signal. + * To clear the previous pt-map use the #GstRtpJitterBuffer::clear-pt-map signal. + * + * This element will automatically be used inside gstrtpbin. + * + * + * Example pipelines + * |[ + * gst-launch rtspsrc location=rtsp://192.168.1.133:8554/mpeg1or2AudioVideoTest ! gstrtpjitterbuffer ! rtpmpvdepay ! mpeg2dec ! xvimagesink + * ]| Connect to a streaming server and decode the MPEG video. The jitterbuffer is + * inserted into the pipeline to smooth out network jitter and to reorder the + * out-of-order RTP packets. + * + * + * Last reviewed on 2007-05-28 (0.10.5) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "gstrtpbin-marshal.h" + +#include "gstrtpjitterbuffer.h" +#include "rtpjitterbuffer.h" +#include "rtpstats.h" + +#include + +GST_DEBUG_CATEGORY (rtpjitterbuffer_debug); +#define GST_CAT_DEFAULT (rtpjitterbuffer_debug) + +/* RTPJitterBuffer signals and args */ +enum +{ + SIGNAL_REQUEST_PT_MAP, + SIGNAL_CLEAR_PT_MAP, + SIGNAL_HANDLE_SYNC, + SIGNAL_ON_NPT_STOP, + SIGNAL_SET_ACTIVE, + LAST_SIGNAL +}; + +#define DEFAULT_LATENCY_MS 200 +#define DEFAULT_DROP_ON_LATENCY FALSE +#define DEFAULT_TS_OFFSET 0 +#define DEFAULT_DO_LOST FALSE +#define DEFAULT_MODE RTP_JITTER_BUFFER_MODE_SLAVE +#define DEFAULT_PERCENT 0 + +enum +{ + PROP_0, + PROP_LATENCY, + PROP_DROP_ON_LATENCY, + PROP_TS_OFFSET, + PROP_DO_LOST, + PROP_MODE, + PROP_PERCENT, + PROP_LAST +}; + +#define JBUF_LOCK(priv) (g_mutex_lock ((priv)->jbuf_lock)) + +#define JBUF_LOCK_CHECK(priv,label) G_STMT_START { \ + JBUF_LOCK (priv); \ + if (G_UNLIKELY (priv->srcresult != GST_FLOW_OK)) \ + goto label; \ +} G_STMT_END + +#define JBUF_UNLOCK(priv) (g_mutex_unlock ((priv)->jbuf_lock)) +#define JBUF_WAIT(priv) (g_cond_wait ((priv)->jbuf_cond, (priv)->jbuf_lock)) + +#define JBUF_WAIT_CHECK(priv,label) G_STMT_START { \ + JBUF_WAIT(priv); \ + if (G_UNLIKELY (priv->srcresult != GST_FLOW_OK)) \ + goto label; \ +} G_STMT_END + +#define JBUF_SIGNAL(priv) (g_cond_signal ((priv)->jbuf_cond)) + +struct _GstRtpJitterBufferPrivate +{ + GstPad *sinkpad, *srcpad; + GstPad *rtcpsinkpad; + + RTPJitterBuffer *jbuf; + GMutex *jbuf_lock; + GCond *jbuf_cond; + gboolean waiting; + gboolean discont; + gboolean active; + guint64 out_offset; + + /* properties */ + guint latency_ms; + guint64 latency_ns; + gboolean drop_on_latency; + gint64 ts_offset; + gboolean do_lost; + + /* the last seqnum we pushed out */ + guint32 last_popped_seqnum; + /* the next expected seqnum we push */ + guint32 next_seqnum; + /* last output time */ + GstClockTime last_out_time; + /* the next expected seqnum we receive */ + guint32 next_in_seqnum; + + /* start and stop ranges */ + GstClockTime npt_start; + GstClockTime npt_stop; + guint64 ext_timestamp; + guint64 last_elapsed; + guint64 estimated_eos; + GstClockID eos_id; + gboolean reached_npt_stop; + + /* state */ + gboolean eos; + + /* clock rate and rtp timestamp offset */ + gint last_pt; + gint32 clock_rate; + gint64 clock_base; + gint64 prev_ts_offset; + + /* when we are shutting down */ + GstFlowReturn srcresult; + gboolean blocked; + + /* for sync */ + GstSegment segment; + GstClockID clock_id; + gboolean unscheduled; + /* the latency of the upstream peer, we have to take this into account when + * synchronizing the buffers. */ + GstClockTime peer_latency; + + /* some accounting */ + guint64 num_late; + guint64 num_duplicates; +}; + +#define GST_RTP_JITTER_BUFFER_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_RTP_JITTER_BUFFER, \ + GstRtpJitterBufferPrivate)) + +static GstStaticPadTemplate gst_rtp_jitter_buffer_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "clock-rate = (int) [ 1, 2147483647 ]" + /* "payload = (int) , " + * "encoding-name = (string) " + */ ) + ); + +static GstStaticPadTemplate gst_rtp_jitter_buffer_sink_rtcp_template = +GST_STATIC_PAD_TEMPLATE ("sink_rtcp", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate gst_rtp_jitter_buffer_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp" + /* "payload = (int) , " + * "clock-rate = (int) , " + * "encoding-name = (string) " + */ ) + ); + +static guint gst_rtp_jitter_buffer_signals[LAST_SIGNAL] = { 0 }; + +GST_BOILERPLATE (GstRtpJitterBuffer, gst_rtp_jitter_buffer, GstElement, + GST_TYPE_ELEMENT); + +/* object overrides */ +static void gst_rtp_jitter_buffer_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_rtp_jitter_buffer_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_rtp_jitter_buffer_finalize (GObject * object); + +/* element overrides */ +static GstStateChangeReturn gst_rtp_jitter_buffer_change_state (GstElement + * element, GstStateChange transition); +static GstPad *gst_rtp_jitter_buffer_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_rtp_jitter_buffer_release_pad (GstElement * element, + GstPad * pad); +static GstClock *gst_rtp_jitter_buffer_provide_clock (GstElement * element); + +/* pad overrides */ +static GstCaps *gst_rtp_jitter_buffer_getcaps (GstPad * pad); +static GstIterator *gst_rtp_jitter_buffer_iterate_internal_links (GstPad * pad); + +/* sinkpad overrides */ +static gboolean gst_jitter_buffer_sink_setcaps (GstPad * pad, GstCaps * caps); +static gboolean gst_rtp_jitter_buffer_sink_event (GstPad * pad, + GstEvent * event); +static GstFlowReturn gst_rtp_jitter_buffer_chain (GstPad * pad, + GstBuffer * buffer); + +static gboolean gst_rtp_jitter_buffer_sink_rtcp_event (GstPad * pad, + GstEvent * event); +static GstFlowReturn gst_rtp_jitter_buffer_chain_rtcp (GstPad * pad, + GstBuffer * buffer); + +/* srcpad overrides */ +static gboolean gst_rtp_jitter_buffer_src_event (GstPad * pad, + GstEvent * event); +static gboolean +gst_rtp_jitter_buffer_src_activate_push (GstPad * pad, gboolean active); +static void gst_rtp_jitter_buffer_loop (GstRtpJitterBuffer * jitterbuffer); +static gboolean gst_rtp_jitter_buffer_query (GstPad * pad, GstQuery * query); + +static void +gst_rtp_jitter_buffer_clear_pt_map (GstRtpJitterBuffer * jitterbuffer); +static GstClockTime +gst_rtp_jitter_buffer_set_active (GstRtpJitterBuffer * jitterbuffer, + gboolean active, guint64 base_time); + +static void +gst_rtp_jitter_buffer_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_jitter_buffer_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_jitter_buffer_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_jitter_buffer_sink_rtcp_template); + + gst_element_class_set_details_simple (element_class, + "RTP packet jitter-buffer", "Filter/Network/RTP", + "A buffer that deals with network jitter and other transmission faults", + "Philippe Kalaf , " + "Wim Taymans "); +} + +static void +gst_rtp_jitter_buffer_class_init (GstRtpJitterBufferClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + g_type_class_add_private (klass, sizeof (GstRtpJitterBufferPrivate)); + + gobject_class->finalize = gst_rtp_jitter_buffer_finalize; + + gobject_class->set_property = gst_rtp_jitter_buffer_set_property; + gobject_class->get_property = gst_rtp_jitter_buffer_get_property; + + /** + * GstRtpJitterBuffer::latency: + * + * The maximum latency of the jitterbuffer. Packets will be kept in the buffer + * for at most this time. + */ + g_object_class_install_property (gobject_class, PROP_LATENCY, + g_param_spec_uint ("latency", "Buffer latency in ms", + "Amount of ms to buffer", 0, G_MAXUINT, DEFAULT_LATENCY_MS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRtpJitterBuffer::drop-on-latency: + * + * Drop oldest buffers when the queue is completely filled. + */ + g_object_class_install_property (gobject_class, PROP_DROP_ON_LATENCY, + g_param_spec_boolean ("drop-on-latency", + "Drop buffers when maximum latency is reached", + "Tells the jitterbuffer to never exceed the given latency in size", + DEFAULT_DROP_ON_LATENCY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRtpJitterBuffer::ts-offset: + * + * Adjust GStreamer output buffer timestamps in the jitterbuffer with offset. + * This is mainly used to ensure interstream synchronisation. + */ + g_object_class_install_property (gobject_class, PROP_TS_OFFSET, + g_param_spec_int64 ("ts-offset", "Timestamp Offset", + "Adjust buffer timestamps with offset in nanoseconds", G_MININT64, + G_MAXINT64, DEFAULT_TS_OFFSET, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRtpJitterBuffer::do-lost: + * + * Send out a GstRTPPacketLost event downstream when a packet is considered + * lost. + */ + g_object_class_install_property (gobject_class, PROP_DO_LOST, + g_param_spec_boolean ("do-lost", "Do Lost", + "Send an event downstream when a packet is lost", DEFAULT_DO_LOST, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRtpJitterBuffer::mode: + * + * Control the buffering and timestamping mode used by the jitterbuffer. + */ + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", + "Control the buffering algorithm in use", RTP_TYPE_JITTER_BUFFER_MODE, + DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRtpJitterBuffer::percent: + * + * The percent of the jitterbuffer that is filled. + * + * Since: 0.10.19 + */ + g_object_class_install_property (gobject_class, PROP_PERCENT, + g_param_spec_int ("percent", "percent", + "The buffer filled percent", 0, 100, + 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + /** + * GstRtpJitterBuffer::request-pt-map: + * @buffer: the object which received the signal + * @pt: the pt + * + * Request the payload type as #GstCaps for @pt. + */ + gst_rtp_jitter_buffer_signals[SIGNAL_REQUEST_PT_MAP] = + g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpJitterBufferClass, + request_pt_map), NULL, NULL, gst_rtp_bin_marshal_BOXED__UINT, + GST_TYPE_CAPS, 1, G_TYPE_UINT); + /** + * GstRtpJitterBuffer::handle-sync: + * @buffer: the object which received the signal + * @struct: a GstStructure containing sync values. + * + * Be notified of new sync values. + */ + gst_rtp_jitter_buffer_signals[SIGNAL_HANDLE_SYNC] = + g_signal_new ("handle-sync", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpJitterBufferClass, + handle_sync), NULL, NULL, g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, GST_TYPE_STRUCTURE | G_SIGNAL_TYPE_STATIC_SCOPE); + + /** + * GstRtpJitterBuffer::on-npt-stop + * @buffer: the object which received the signal + * + * Signal that the jitterbufer has pushed the RTP packet that corresponds to + * the npt-stop position. + */ + gst_rtp_jitter_buffer_signals[SIGNAL_ON_NPT_STOP] = + g_signal_new ("on-npt-stop", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpJitterBufferClass, + on_npt_stop), NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + * GstRtpJitterBuffer::clear-pt-map: + * @buffer: the object which received the signal + * + * Invalidate the clock-rate as obtained with the + * #GstRtpJitterBuffer::request-pt-map signal. + */ + gst_rtp_jitter_buffer_signals[SIGNAL_CLEAR_PT_MAP] = + g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GstRtpJitterBufferClass, clear_pt_map), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + * GstRtpJitterBuffer::set-active: + * @buffer: the object which received the signal + * + * Start pushing out packets with the given base time. This signal is only + * useful in buffering mode. + * + * Returns: the time of the last pushed packet. + * + * Since: 0.10.19 + */ + gst_rtp_jitter_buffer_signals[SIGNAL_SET_ACTIVE] = + g_signal_new ("set-active", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GstRtpJitterBufferClass, set_active), NULL, NULL, + gst_rtp_bin_marshal_UINT64__BOOL_UINT64, G_TYPE_UINT64, 2, G_TYPE_BOOLEAN, + G_TYPE_UINT64); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_change_state); + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_request_new_pad); + gstelement_class->release_pad = + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_release_pad); + gstelement_class->provide_clock = + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_provide_clock); + + klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_clear_pt_map); + klass->set_active = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_set_active); + + GST_DEBUG_CATEGORY_INIT + (rtpjitterbuffer_debug, "gstrtpjitterbuffer", 0, "RTP Jitter Buffer"); +} + +static void +gst_rtp_jitter_buffer_init (GstRtpJitterBuffer * jitterbuffer, + GstRtpJitterBufferClass * klass) +{ + GstRtpJitterBufferPrivate *priv; + + priv = GST_RTP_JITTER_BUFFER_GET_PRIVATE (jitterbuffer); + jitterbuffer->priv = priv; + + priv->latency_ms = DEFAULT_LATENCY_MS; + priv->latency_ns = priv->latency_ms * GST_MSECOND; + priv->drop_on_latency = DEFAULT_DROP_ON_LATENCY; + priv->do_lost = DEFAULT_DO_LOST; + + priv->jbuf = rtp_jitter_buffer_new (); + priv->jbuf_lock = g_mutex_new (); + priv->jbuf_cond = g_cond_new (); + + /* reset skew detection initialy */ + rtp_jitter_buffer_reset_skew (priv->jbuf); + rtp_jitter_buffer_set_delay (priv->jbuf, priv->latency_ns); + rtp_jitter_buffer_set_buffering (priv->jbuf, FALSE); + priv->active = TRUE; + + priv->srcpad = + gst_pad_new_from_static_template (&gst_rtp_jitter_buffer_src_template, + "src"); + + gst_pad_set_activatepush_function (priv->srcpad, + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_src_activate_push)); + gst_pad_set_query_function (priv->srcpad, + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_query)); + gst_pad_set_getcaps_function (priv->srcpad, + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_getcaps)); + gst_pad_set_event_function (priv->srcpad, + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_src_event)); + + priv->sinkpad = + gst_pad_new_from_static_template (&gst_rtp_jitter_buffer_sink_template, + "sink"); + + gst_pad_set_chain_function (priv->sinkpad, + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_chain)); + gst_pad_set_event_function (priv->sinkpad, + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_sink_event)); + gst_pad_set_setcaps_function (priv->sinkpad, + GST_DEBUG_FUNCPTR (gst_jitter_buffer_sink_setcaps)); + gst_pad_set_getcaps_function (priv->sinkpad, + GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_getcaps)); + + gst_element_add_pad (GST_ELEMENT (jitterbuffer), priv->srcpad); + gst_element_add_pad (GST_ELEMENT (jitterbuffer), priv->sinkpad); +} + +static void +gst_rtp_jitter_buffer_finalize (GObject * object) +{ + GstRtpJitterBuffer *jitterbuffer; + + jitterbuffer = GST_RTP_JITTER_BUFFER (object); + + g_mutex_free (jitterbuffer->priv->jbuf_lock); + g_cond_free (jitterbuffer->priv->jbuf_cond); + + g_object_unref (jitterbuffer->priv->jbuf); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstIterator * +gst_rtp_jitter_buffer_iterate_internal_links (GstPad * pad) +{ + GstRtpJitterBuffer *jitterbuffer; + GstPad *otherpad = NULL; + GstIterator *it; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + + if (pad == jitterbuffer->priv->sinkpad) { + otherpad = jitterbuffer->priv->srcpad; + } else if (pad == jitterbuffer->priv->srcpad) { + otherpad = jitterbuffer->priv->sinkpad; + } else if (pad == jitterbuffer->priv->rtcpsinkpad) { + otherpad = NULL; + } + + it = gst_iterator_new_single (GST_TYPE_PAD, otherpad, + (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); + + gst_object_unref (jitterbuffer); + + return it; +} + +static GstPad * +create_rtcp_sink (GstRtpJitterBuffer * jitterbuffer) +{ + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + + GST_DEBUG_OBJECT (jitterbuffer, "creating RTCP sink pad"); + + priv->rtcpsinkpad = + gst_pad_new_from_static_template + (&gst_rtp_jitter_buffer_sink_rtcp_template, "sink_rtcp"); + gst_pad_set_chain_function (priv->rtcpsinkpad, + gst_rtp_jitter_buffer_chain_rtcp); + gst_pad_set_event_function (priv->rtcpsinkpad, + (GstPadEventFunction) gst_rtp_jitter_buffer_sink_rtcp_event); + gst_pad_set_iterate_internal_links_function (priv->rtcpsinkpad, + gst_rtp_jitter_buffer_iterate_internal_links); + gst_pad_set_active (priv->rtcpsinkpad, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (jitterbuffer), priv->rtcpsinkpad); + + return priv->rtcpsinkpad; +} + +static void +remove_rtcp_sink (GstRtpJitterBuffer * jitterbuffer) +{ + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + + GST_DEBUG_OBJECT (jitterbuffer, "removing RTCP sink pad"); + + gst_pad_set_active (priv->rtcpsinkpad, FALSE); + + gst_element_remove_pad (GST_ELEMENT_CAST (jitterbuffer), priv->rtcpsinkpad); + priv->rtcpsinkpad = NULL; +} + +static GstPad * +gst_rtp_jitter_buffer_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name) +{ + GstRtpJitterBuffer *jitterbuffer; + GstElementClass *klass; + GstPad *result; + GstRtpJitterBufferPrivate *priv; + + g_return_val_if_fail (templ != NULL, NULL); + g_return_val_if_fail (GST_IS_RTP_JITTER_BUFFER (element), NULL); + + jitterbuffer = GST_RTP_JITTER_BUFFER (element); + priv = jitterbuffer->priv; + klass = GST_ELEMENT_GET_CLASS (element); + + GST_DEBUG_OBJECT (element, "requesting pad %s", GST_STR_NULL (name)); + + /* figure out the template */ + if (templ == gst_element_class_get_pad_template (klass, "sink_rtcp")) { + if (priv->rtcpsinkpad != NULL) + goto exists; + + result = create_rtcp_sink (jitterbuffer); + } else + goto wrong_template; + + return result; + + /* ERRORS */ +wrong_template: + { + g_warning ("gstrtpjitterbuffer: this is not our template"); + return NULL; + } +exists: + { + g_warning ("gstrtpjitterbuffer: pad already requested"); + return NULL; + } +} + +static void +gst_rtp_jitter_buffer_release_pad (GstElement * element, GstPad * pad) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + + g_return_if_fail (GST_IS_RTP_JITTER_BUFFER (element)); + g_return_if_fail (GST_IS_PAD (pad)); + + jitterbuffer = GST_RTP_JITTER_BUFFER (element); + priv = jitterbuffer->priv; + + GST_DEBUG_OBJECT (element, "releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad)); + + if (priv->rtcpsinkpad == pad) { + remove_rtcp_sink (jitterbuffer); + } else + goto wrong_pad; + + return; + + /* ERRORS */ +wrong_pad: + { + g_warning ("gstjitterbuffer: asked to release an unknown pad"); + return; + } +} + +static GstClock * +gst_rtp_jitter_buffer_provide_clock (GstElement * element) +{ + return gst_system_clock_obtain (); +} + +static void +gst_rtp_jitter_buffer_clear_pt_map (GstRtpJitterBuffer * jitterbuffer) +{ + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + + /* this will trigger a new pt-map request signal, FIXME, do something better. */ + + JBUF_LOCK (priv); + priv->clock_rate = -1; + /* do not clear current content, but refresh state for new arrival */ + GST_DEBUG_OBJECT (jitterbuffer, "reset jitterbuffer"); + rtp_jitter_buffer_reset_skew (priv->jbuf); + priv->last_popped_seqnum = -1; + priv->next_seqnum = -1; + JBUF_UNLOCK (priv); +} + +static GstClockTime +gst_rtp_jitter_buffer_set_active (GstRtpJitterBuffer * jbuf, gboolean active, + guint64 offset) +{ + GstRtpJitterBufferPrivate *priv; + GstClockTime last_out; + GstBuffer *head; + + priv = jbuf->priv; + + JBUF_LOCK (priv); + GST_DEBUG_OBJECT (jbuf, "setting active %d with offset %" GST_TIME_FORMAT, + active, GST_TIME_ARGS (offset)); + + if (active != priv->active) { + /* add the amount of time spent in paused to the output offset. All + * outgoing buffers will have this offset applied to their timestamps in + * order to make them arrive in time in the sink. */ + priv->out_offset = offset; + GST_DEBUG_OBJECT (jbuf, "out offset %" GST_TIME_FORMAT, + GST_TIME_ARGS (priv->out_offset)); + priv->active = active; + JBUF_SIGNAL (priv); + } + if (!active) { + rtp_jitter_buffer_set_buffering (priv->jbuf, TRUE); + } + if ((head = rtp_jitter_buffer_peek (priv->jbuf))) { + /* head buffer timestamp and offset gives our output time */ + last_out = GST_BUFFER_TIMESTAMP (head) + priv->ts_offset; + } else { + /* use last known time when the buffer is empty */ + last_out = priv->last_out_time; + } + JBUF_UNLOCK (priv); + + return last_out; +} + +static GstCaps * +gst_rtp_jitter_buffer_getcaps (GstPad * pad) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + GstPad *other; + GstCaps *caps; + const GstCaps *templ; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + priv = jitterbuffer->priv; + + other = (pad == priv->srcpad ? priv->sinkpad : priv->srcpad); + + caps = gst_pad_peer_get_caps (other); + + templ = gst_pad_get_pad_template_caps (pad); + if (caps == NULL) { + GST_DEBUG_OBJECT (jitterbuffer, "copy template"); + caps = gst_caps_copy (templ); + } else { + GstCaps *intersect; + + GST_DEBUG_OBJECT (jitterbuffer, "intersect with template"); + + intersect = gst_caps_intersect (caps, templ); + gst_caps_unref (caps); + + caps = intersect; + } + gst_object_unref (jitterbuffer); + + return caps; +} + +/* + * Must be called with JBUF_LOCK held + */ + +static gboolean +gst_jitter_buffer_sink_parse_caps (GstRtpJitterBuffer * jitterbuffer, + GstCaps * caps) +{ + GstRtpJitterBufferPrivate *priv; + GstStructure *caps_struct; + guint val; + GstClockTime tval; + + priv = jitterbuffer->priv; + + /* first parse the caps */ + caps_struct = gst_caps_get_structure (caps, 0); + + GST_DEBUG_OBJECT (jitterbuffer, "got caps"); + + /* we need a clock-rate to convert the rtp timestamps to GStreamer time and to + * measure the amount of data in the buffer */ + if (!gst_structure_get_int (caps_struct, "clock-rate", &priv->clock_rate)) + goto error; + + if (priv->clock_rate <= 0) + goto wrong_rate; + + GST_DEBUG_OBJECT (jitterbuffer, "got clock-rate %d", priv->clock_rate); + + /* The clock base is the RTP timestamp corrsponding to the npt-start value. We + * can use this to track the amount of time elapsed on the sender. */ + if (gst_structure_get_uint (caps_struct, "clock-base", &val)) + priv->clock_base = val; + else + priv->clock_base = -1; + + priv->ext_timestamp = priv->clock_base; + + GST_DEBUG_OBJECT (jitterbuffer, "got clock-base %" G_GINT64_FORMAT, + priv->clock_base); + + if (gst_structure_get_uint (caps_struct, "seqnum-base", &val)) { + /* first expected seqnum, only update when we didn't have a previous base. */ + if (priv->next_in_seqnum == -1) + priv->next_in_seqnum = val; + if (priv->next_seqnum == -1) + priv->next_seqnum = val; + } + + GST_DEBUG_OBJECT (jitterbuffer, "got seqnum-base %d", priv->next_in_seqnum); + + /* the start and stop times. The seqnum-base corresponds to the start time. We + * will keep track of the seqnums on the output and when we reach the one + * corresponding to npt-stop, we emit the npt-stop-reached signal */ + if (gst_structure_get_clock_time (caps_struct, "npt-start", &tval)) + priv->npt_start = tval; + else + priv->npt_start = 0; + + if (gst_structure_get_clock_time (caps_struct, "npt-stop", &tval)) + priv->npt_stop = tval; + else + priv->npt_stop = -1; + + GST_DEBUG_OBJECT (jitterbuffer, + "npt start/stop: %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT, + GST_TIME_ARGS (priv->npt_start), GST_TIME_ARGS (priv->npt_stop)); + + return TRUE; + + /* ERRORS */ +error: + { + GST_DEBUG_OBJECT (jitterbuffer, "No clock-rate in caps!"); + return FALSE; + } +wrong_rate: + { + GST_DEBUG_OBJECT (jitterbuffer, "Invalid clock-rate %d", priv->clock_rate); + return FALSE; + } +} + +static gboolean +gst_jitter_buffer_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + gboolean res; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + priv = jitterbuffer->priv; + + JBUF_LOCK (priv); + res = gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); + JBUF_UNLOCK (priv); + + /* set same caps on srcpad on success */ + if (res) + gst_pad_set_caps (priv->srcpad, caps); + + gst_object_unref (jitterbuffer); + + return res; +} + +static void +gst_rtp_jitter_buffer_flush_start (GstRtpJitterBuffer * jitterbuffer) +{ + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + + JBUF_LOCK (priv); + /* mark ourselves as flushing */ + priv->srcresult = GST_FLOW_WRONG_STATE; + GST_DEBUG_OBJECT (jitterbuffer, "Disabling pop on queue"); + /* this unblocks any waiting pops on the src pad task */ + JBUF_SIGNAL (priv); + /* unlock clock, we just unschedule, the entry will be released by the + * locking streaming thread. */ + if (priv->clock_id) { + gst_clock_id_unschedule (priv->clock_id); + priv->unscheduled = TRUE; + } + JBUF_UNLOCK (priv); +} + +static void +gst_rtp_jitter_buffer_flush_stop (GstRtpJitterBuffer * jitterbuffer) +{ + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + + JBUF_LOCK (priv); + GST_DEBUG_OBJECT (jitterbuffer, "Enabling pop on queue"); + /* Mark as non flushing */ + priv->srcresult = GST_FLOW_OK; + gst_segment_init (&priv->segment, GST_FORMAT_TIME); + priv->last_popped_seqnum = -1; + priv->last_out_time = -1; + priv->next_seqnum = -1; + priv->next_in_seqnum = -1; + priv->clock_rate = -1; + priv->eos = FALSE; + priv->estimated_eos = -1; + priv->last_elapsed = 0; + priv->reached_npt_stop = FALSE; + priv->ext_timestamp = -1; + GST_DEBUG_OBJECT (jitterbuffer, "flush and reset jitterbuffer"); + rtp_jitter_buffer_flush (priv->jbuf); + rtp_jitter_buffer_reset_skew (priv->jbuf); + JBUF_UNLOCK (priv); +} + +static gboolean +gst_rtp_jitter_buffer_src_activate_push (GstPad * pad, gboolean active) +{ + gboolean result = TRUE; + GstRtpJitterBuffer *jitterbuffer = NULL; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + + if (active) { + /* allow data processing */ + gst_rtp_jitter_buffer_flush_stop (jitterbuffer); + + /* start pushing out buffers */ + GST_DEBUG_OBJECT (jitterbuffer, "Starting task on srcpad"); + gst_pad_start_task (jitterbuffer->priv->srcpad, + (GstTaskFunction) gst_rtp_jitter_buffer_loop, jitterbuffer); + } else { + /* make sure all data processing stops ASAP */ + gst_rtp_jitter_buffer_flush_start (jitterbuffer); + + /* NOTE this will hardlock if the state change is called from the src pad + * task thread because we will _join() the thread. */ + GST_DEBUG_OBJECT (jitterbuffer, "Stopping task on srcpad"); + result = gst_pad_stop_task (pad); + } + + gst_object_unref (jitterbuffer); + + return result; +} + +static GstStateChangeReturn +gst_rtp_jitter_buffer_change_state (GstElement * element, + GstStateChange transition) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + jitterbuffer = GST_RTP_JITTER_BUFFER (element); + priv = jitterbuffer->priv; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + JBUF_LOCK (priv); + /* reset negotiated values */ + priv->clock_rate = -1; + priv->clock_base = -1; + priv->peer_latency = 0; + priv->last_pt = -1; + /* block until we go to PLAYING */ + priv->blocked = TRUE; + JBUF_UNLOCK (priv); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + JBUF_LOCK (priv); + /* unblock to allow streaming in PLAYING */ + priv->blocked = FALSE; + JBUF_SIGNAL (priv); + JBUF_UNLOCK (priv); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + /* we are a live element because we sync to the clock, which we can only + * do in the PLAYING state */ + if (ret != GST_STATE_CHANGE_FAILURE) + ret = GST_STATE_CHANGE_NO_PREROLL; + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + JBUF_LOCK (priv); + /* block to stop streaming when PAUSED */ + priv->blocked = TRUE; + JBUF_UNLOCK (priv); + if (ret != GST_STATE_CHANGE_FAILURE) + ret = GST_STATE_CHANGE_NO_PREROLL; + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; +} + +static gboolean +gst_rtp_jitter_buffer_src_event (GstPad * pad, GstEvent * event) +{ + gboolean ret = TRUE; + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + if (G_UNLIKELY (jitterbuffer == NULL)) { + gst_event_unref (event); + return FALSE; + } + priv = jitterbuffer->priv; + + GST_DEBUG_OBJECT (jitterbuffer, "received %s", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_LATENCY: + { + GstClockTime latency; + + gst_event_parse_latency (event, &latency); + + JBUF_LOCK (priv); + /* adjust the overall buffer delay to the total pipeline latency in + * buffering mode because if downstream consumes too fast (because of + * large latency or queues, we would start rebuffering again. */ + if (rtp_jitter_buffer_get_mode (priv->jbuf) == + RTP_JITTER_BUFFER_MODE_BUFFER) { + rtp_jitter_buffer_set_delay (priv->jbuf, latency); + } + JBUF_UNLOCK (priv); + + ret = gst_pad_push_event (priv->sinkpad, event); + break; + } + default: + ret = gst_pad_push_event (priv->sinkpad, event); + break; + } + gst_object_unref (jitterbuffer); + + return ret; +} + +static gboolean +gst_rtp_jitter_buffer_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean ret = TRUE; + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + if (G_UNLIKELY (jitterbuffer == NULL)) { + gst_event_unref (event); + return FALSE; + } + priv = jitterbuffer->priv; + + GST_DEBUG_OBJECT (jitterbuffer, "received %s", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time; + gboolean update; + + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + + /* we need time for now */ + if (format != GST_FORMAT_TIME) + goto newseg_wrong_format; + + GST_DEBUG_OBJECT (jitterbuffer, + "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT + ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT, + update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop), + GST_TIME_ARGS (time)); + + /* now configure the values, we need these to time the release of the + * buffers on the srcpad. */ + gst_segment_set_newsegment_full (&priv->segment, update, + rate, arate, format, start, stop, time); + + /* FIXME, push SEGMENT in the queue. Sorting order might be difficult. */ + ret = gst_pad_push_event (priv->srcpad, event); + break; + } + case GST_EVENT_FLUSH_START: + gst_rtp_jitter_buffer_flush_start (jitterbuffer); + ret = gst_pad_push_event (priv->srcpad, event); + break; + case GST_EVENT_FLUSH_STOP: + ret = gst_pad_push_event (priv->srcpad, event); + ret = gst_rtp_jitter_buffer_src_activate_push (priv->srcpad, TRUE); + break; + case GST_EVENT_EOS: + { + /* push EOS in queue. We always push it at the head */ + JBUF_LOCK (priv); + /* check for flushing, we need to discard the event and return FALSE when + * we are flushing */ + ret = priv->srcresult == GST_FLOW_OK; + if (ret && !priv->eos) { + GST_INFO_OBJECT (jitterbuffer, "queuing EOS"); + priv->eos = TRUE; + JBUF_SIGNAL (priv); + } else if (priv->eos) { + GST_DEBUG_OBJECT (jitterbuffer, "dropping EOS, we are already EOS"); + } else { + GST_DEBUG_OBJECT (jitterbuffer, "dropping EOS, reason %s", + gst_flow_get_name (priv->srcresult)); + } + JBUF_UNLOCK (priv); + gst_event_unref (event); + break; + } + default: + ret = gst_pad_push_event (priv->srcpad, event); + break; + } + +done: + gst_object_unref (jitterbuffer); + + return ret; + + /* ERRORS */ +newseg_wrong_format: + { + GST_DEBUG_OBJECT (jitterbuffer, "received non TIME newsegment"); + ret = FALSE; + gst_event_unref (event); + goto done; + } +} + +static gboolean +gst_rtp_jitter_buffer_sink_rtcp_event (GstPad * pad, GstEvent * event) +{ + GstRtpJitterBuffer *jitterbuffer; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (jitterbuffer, "received %s", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_START: + break; + case GST_EVENT_FLUSH_STOP: + break; + default: + break; + } + gst_event_unref (event); + gst_object_unref (jitterbuffer); + + return TRUE; +} + +/* + * Must be called with JBUF_LOCK held, will release the LOCK when emiting the + * signal. The function returns GST_FLOW_ERROR when a parsing error happened and + * GST_FLOW_WRONG_STATE when the element is shutting down. On success + * GST_FLOW_OK is returned. + */ +static GstFlowReturn +gst_rtp_jitter_buffer_get_clock_rate (GstRtpJitterBuffer * jitterbuffer, + guint8 pt) +{ + GValue ret = { 0 }; + GValue args[2] = { {0}, {0} }; + GstCaps *caps; + gboolean res; + + g_value_init (&args[0], GST_TYPE_ELEMENT); + g_value_set_object (&args[0], jitterbuffer); + g_value_init (&args[1], G_TYPE_UINT); + g_value_set_uint (&args[1], pt); + + g_value_init (&ret, GST_TYPE_CAPS); + g_value_set_boxed (&ret, NULL); + + JBUF_UNLOCK (jitterbuffer->priv); + g_signal_emitv (args, gst_rtp_jitter_buffer_signals[SIGNAL_REQUEST_PT_MAP], 0, + &ret); + JBUF_LOCK_CHECK (jitterbuffer->priv, out_flushing); + + g_value_unset (&args[0]); + g_value_unset (&args[1]); + caps = (GstCaps *) g_value_dup_boxed (&ret); + g_value_unset (&ret); + if (!caps) + goto no_caps; + + res = gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); + gst_caps_unref (caps); + + if (G_UNLIKELY (!res)) + goto parse_failed; + + return GST_FLOW_OK; + + /* ERRORS */ +no_caps: + { + GST_DEBUG_OBJECT (jitterbuffer, "could not get caps"); + return GST_FLOW_ERROR; + } +out_flushing: + { + GST_DEBUG_OBJECT (jitterbuffer, "we are flushing"); + return GST_FLOW_WRONG_STATE; + } +parse_failed: + { + GST_DEBUG_OBJECT (jitterbuffer, "parse failed"); + return GST_FLOW_ERROR; + } +} + +/* call with jbuf lock held */ +static void +check_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint * percent) +{ + GstRtpJitterBufferPrivate *priv = jitterbuffer->priv; + + /* too short a stream, or too close to EOS will never really fill buffer */ + if (*percent != -1 && priv->npt_stop != -1 && + priv->npt_stop - priv->npt_start <= + rtp_jitter_buffer_get_delay (priv->jbuf)) { + GST_DEBUG_OBJECT (jitterbuffer, "short stream; faking full buffer"); + rtp_jitter_buffer_set_buffering (priv->jbuf, FALSE); + *percent = 100; + } +} + +static void +post_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint percent) +{ + GstMessage *message; + + /* Post a buffering message */ + message = gst_message_new_buffering (GST_OBJECT_CAST (jitterbuffer), percent); + gst_message_set_buffering_stats (message, GST_BUFFERING_LIVE, -1, -1, -1); + + gst_element_post_message (GST_ELEMENT_CAST (jitterbuffer), message); +} + +static GstFlowReturn +gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + guint16 seqnum; + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime timestamp; + guint64 latency_ts; + gboolean tail; + gint percent = -1; + guint8 pt; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + + if (G_UNLIKELY (!gst_rtp_buffer_validate (buffer))) + goto invalid_buffer; + + priv = jitterbuffer->priv; + + pt = gst_rtp_buffer_get_payload_type (buffer); + + /* take the timestamp of the buffer. This is the time when the packet was + * received and is used to calculate jitter and clock skew. We will adjust + * this timestamp with the smoothed value after processing it in the + * jitterbuffer. */ + timestamp = GST_BUFFER_TIMESTAMP (buffer); + /* bring to running time */ + timestamp = gst_segment_to_running_time (&priv->segment, GST_FORMAT_TIME, + timestamp); + + seqnum = gst_rtp_buffer_get_seq (buffer); + + GST_DEBUG_OBJECT (jitterbuffer, + "Received packet #%d at time %" GST_TIME_FORMAT, seqnum, + GST_TIME_ARGS (timestamp)); + + JBUF_LOCK_CHECK (priv, out_flushing); + + if (G_UNLIKELY (priv->last_pt != pt)) { + GstCaps *caps; + + GST_DEBUG_OBJECT (jitterbuffer, "pt changed from %u to %u", priv->last_pt, + pt); + + priv->last_pt = pt; + /* reset clock-rate so that we get a new one */ + priv->clock_rate = -1; + /* Try to get the clock-rate from the caps first if we can. If there are no + * caps we must fire the signal to get the clock-rate. */ + if ((caps = GST_BUFFER_CAPS (buffer))) { + gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); + } + } + + if (G_UNLIKELY (priv->clock_rate == -1)) { + /* no clock rate given on the caps, try to get one with the signal */ + if (gst_rtp_jitter_buffer_get_clock_rate (jitterbuffer, + pt) == GST_FLOW_WRONG_STATE) + goto out_flushing; + + if (G_UNLIKELY (priv->clock_rate == -1)) + goto no_clock_rate; + } + + /* don't accept more data on EOS */ + if (G_UNLIKELY (priv->eos)) + goto have_eos; + + /* now check against our expected seqnum */ + if (G_LIKELY (priv->next_in_seqnum != -1)) { + gint gap; + gboolean reset = FALSE; + + gap = gst_rtp_buffer_compare_seqnum (priv->next_in_seqnum, seqnum); + if (G_UNLIKELY (gap != 0)) { + GST_DEBUG_OBJECT (jitterbuffer, "expected #%d, got #%d, gap of %d", + priv->next_in_seqnum, seqnum, gap); + /* priv->next_in_seqnum >= seqnum, this packet is too late or the + * sender might have been restarted with different seqnum. */ + if (gap < -RTP_MAX_MISORDER) { + GST_DEBUG_OBJECT (jitterbuffer, "reset: buffer too old %d", gap); + reset = TRUE; + } + /* priv->next_in_seqnum < seqnum, this is a new packet */ + else if (G_UNLIKELY (gap > RTP_MAX_DROPOUT)) { + GST_DEBUG_OBJECT (jitterbuffer, "reset: too many dropped packets %d", + gap); + reset = TRUE; + } else { + GST_DEBUG_OBJECT (jitterbuffer, "tolerable gap"); + } + } + if (G_UNLIKELY (reset)) { + GST_DEBUG_OBJECT (jitterbuffer, "flush and reset jitterbuffer"); + rtp_jitter_buffer_flush (priv->jbuf); + rtp_jitter_buffer_reset_skew (priv->jbuf); + priv->last_popped_seqnum = -1; + priv->next_seqnum = seqnum; + } + } + priv->next_in_seqnum = (seqnum + 1) & 0xffff; + + /* let's check if this buffer is too late, we can only accept packets with + * bigger seqnum than the one we last pushed. */ + if (G_LIKELY (priv->last_popped_seqnum != -1)) { + gint gap; + + gap = gst_rtp_buffer_compare_seqnum (priv->last_popped_seqnum, seqnum); + + /* priv->last_popped_seqnum >= seqnum, we're too late. */ + if (G_UNLIKELY (gap <= 0)) + goto too_late; + } + + /* let's drop oldest packet if the queue is already full and drop-on-latency + * is set. We can only do this when there actually is a latency. When no + * latency is set, we just pump it in the queue and let the other end push it + * out as fast as possible. */ + if (priv->latency_ms && priv->drop_on_latency) { + latency_ts = + gst_util_uint64_scale_int (priv->latency_ms, priv->clock_rate, 1000); + + if (G_UNLIKELY (rtp_jitter_buffer_get_ts_diff (priv->jbuf) >= latency_ts)) { + GstBuffer *old_buf; + + old_buf = rtp_jitter_buffer_pop (priv->jbuf, &percent); + + GST_DEBUG_OBJECT (jitterbuffer, "Queue full, dropping old packet #%d", + gst_rtp_buffer_get_seq (old_buf)); + + gst_buffer_unref (old_buf); + } + } + + /* we need to make the metadata writable before pushing it in the jitterbuffer + * because the jitterbuffer will update the timestamp */ + buffer = gst_buffer_make_metadata_writable (buffer); + + /* now insert the packet into the queue in sorted order. This function returns + * FALSE if a packet with the same seqnum was already in the queue, meaning we + * have a duplicate. */ + if (G_UNLIKELY (!rtp_jitter_buffer_insert (priv->jbuf, buffer, timestamp, + priv->clock_rate, &tail, &percent))) + goto duplicate; + + /* signal addition of new buffer when the _loop is waiting. */ + if (priv->waiting) + JBUF_SIGNAL (priv); + + /* let's unschedule and unblock any waiting buffers. We only want to do this + * when the tail buffer changed */ + if (G_UNLIKELY (priv->clock_id && tail)) { + GST_DEBUG_OBJECT (jitterbuffer, + "Unscheduling waiting buffer, new tail buffer"); + gst_clock_id_unschedule (priv->clock_id); + priv->unscheduled = TRUE; + } + + GST_DEBUG_OBJECT (jitterbuffer, "Pushed packet #%d, now %d packets, tail: %d", + seqnum, rtp_jitter_buffer_num_packets (priv->jbuf), tail); + + check_buffering_percent (jitterbuffer, &percent); + +finished: + JBUF_UNLOCK (priv); + + if (percent != -1) + post_buffering_percent (jitterbuffer, percent); + + gst_object_unref (jitterbuffer); + + return ret; + + /* ERRORS */ +invalid_buffer: + { + /* this is not fatal but should be filtered earlier */ + GST_ELEMENT_WARNING (jitterbuffer, STREAM, DECODE, (NULL), + ("Received invalid RTP payload, dropping")); + gst_buffer_unref (buffer); + gst_object_unref (jitterbuffer); + return GST_FLOW_OK; + } +no_clock_rate: + { + GST_WARNING_OBJECT (jitterbuffer, + "No clock-rate in caps!, dropping buffer"); + gst_buffer_unref (buffer); + goto finished; + } +out_flushing: + { + ret = priv->srcresult; + GST_DEBUG_OBJECT (jitterbuffer, "flushing %s", gst_flow_get_name (ret)); + gst_buffer_unref (buffer); + goto finished; + } +have_eos: + { + ret = GST_FLOW_UNEXPECTED; + GST_WARNING_OBJECT (jitterbuffer, "we are EOS, refusing buffer"); + gst_buffer_unref (buffer); + goto finished; + } +too_late: + { + GST_WARNING_OBJECT (jitterbuffer, "Packet #%d too late as #%d was already" + " popped, dropping", seqnum, priv->last_popped_seqnum); + priv->num_late++; + gst_buffer_unref (buffer); + goto finished; + } +duplicate: + { + GST_WARNING_OBJECT (jitterbuffer, "Duplicate packet #%d detected, dropping", + seqnum); + priv->num_duplicates++; + gst_buffer_unref (buffer); + goto finished; + } +} + +static GstClockTime +apply_offset (GstRtpJitterBuffer * jitterbuffer, GstClockTime timestamp) +{ + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + + if (timestamp == -1) + return -1; + + /* apply the timestamp offset, this is used for inter stream sync */ + timestamp += priv->ts_offset; + /* add the offset, this is used when buffering */ + timestamp += priv->out_offset; + + return timestamp; +} + +static GstClockTime +get_sync_time (GstRtpJitterBuffer * jitterbuffer, GstClockTime timestamp) +{ + GstClockTime result; + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + + result = timestamp + GST_ELEMENT_CAST (jitterbuffer)->base_time; + /* add latency, this includes our own latency and the peer latency. */ + result += priv->latency_ns; + result += priv->peer_latency; + + return result; +} + +static gboolean +eos_reached (GstClock * clock, GstClockTime time, GstClockID id, + GstRtpJitterBuffer * jitterbuffer) +{ + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + + JBUF_LOCK_CHECK (priv, flushing); + if (priv->waiting) { + GST_INFO_OBJECT (jitterbuffer, "got the NPT timeout"); + priv->reached_npt_stop = TRUE; + JBUF_SIGNAL (priv); + } + JBUF_UNLOCK (priv); + + return TRUE; + + /* ERRORS */ +flushing: + { + JBUF_UNLOCK (priv); + return FALSE; + } +} + +static GstClockTime +compute_elapsed (GstRtpJitterBuffer * jitterbuffer, GstBuffer * outbuf) +{ + guint64 ext_time, elapsed; + guint32 rtp_time; + GstRtpJitterBufferPrivate *priv; + + priv = jitterbuffer->priv; + rtp_time = gst_rtp_buffer_get_timestamp (outbuf); + + GST_LOG_OBJECT (jitterbuffer, "rtp %" G_GUINT32_FORMAT ", ext %" + G_GUINT64_FORMAT, rtp_time, priv->ext_timestamp); + + if (rtp_time < priv->ext_timestamp) { + ext_time = priv->ext_timestamp; + } else { + ext_time = gst_rtp_buffer_ext_timestamp (&priv->ext_timestamp, rtp_time); + } + + if (ext_time > priv->clock_base) + elapsed = ext_time - priv->clock_base; + else + elapsed = 0; + + elapsed = gst_util_uint64_scale_int (elapsed, GST_SECOND, priv->clock_rate); + return elapsed; +} + +/* + * This funcion will push out buffers on the source pad. + * + * For each pushed buffer, the seqnum is recorded, if the next buffer B has a + * different seqnum (missing packets before B), this function will wait for the + * missing packet to arrive up to the timestamp of buffer B. + */ +static void +gst_rtp_jitter_buffer_loop (GstRtpJitterBuffer * jitterbuffer) +{ + GstRtpJitterBufferPrivate *priv; + GstBuffer *outbuf; + GstFlowReturn result; + guint16 seqnum; + guint32 next_seqnum; + GstClockTime timestamp, out_time; + gboolean discont = FALSE; + gint gap; + GstClock *clock; + GstClockID id; + GstClockTime sync_time; + gint percent = -1; + + priv = jitterbuffer->priv; + + JBUF_LOCK_CHECK (priv, flushing); +again: + GST_DEBUG_OBJECT (jitterbuffer, "Peeking item"); + while (TRUE) { + id = NULL; + /* always wait if we are blocked */ + if (G_LIKELY (!priv->blocked)) { + /* we're buffering but not EOS, wait. */ + if (!priv->eos && (!priv->active + || rtp_jitter_buffer_is_buffering (priv->jbuf))) { + GstClockTime elapsed, delay, left; + + if (priv->estimated_eos == -1) + goto do_wait; + + outbuf = rtp_jitter_buffer_peek (priv->jbuf); + if (outbuf != NULL) { + elapsed = compute_elapsed (jitterbuffer, outbuf); + if (GST_BUFFER_DURATION_IS_VALID (outbuf)) + elapsed += GST_BUFFER_DURATION (outbuf); + } else { + GST_INFO_OBJECT (jitterbuffer, "no buffer, using last_elapsed"); + elapsed = priv->last_elapsed; + } + + delay = rtp_jitter_buffer_get_delay (priv->jbuf); + + if (priv->estimated_eos > elapsed) + left = priv->estimated_eos - elapsed; + else + left = 0; + + GST_INFO_OBJECT (jitterbuffer, "buffering, elapsed %" GST_TIME_FORMAT + " estimated_eos %" GST_TIME_FORMAT " left %" GST_TIME_FORMAT + " delay %" GST_TIME_FORMAT, + GST_TIME_ARGS (elapsed), GST_TIME_ARGS (priv->estimated_eos), + GST_TIME_ARGS (left), GST_TIME_ARGS (delay)); + if (left > delay) + goto do_wait; + } + /* if we have a packet, we can exit the loop and grab it */ + if (rtp_jitter_buffer_num_packets (priv->jbuf) > 0) + break; + /* no packets but we are EOS, do eos logic */ + if (G_UNLIKELY (priv->eos)) + goto do_eos; + /* underrun, wait for packets or flushing now if we are expecting an EOS + * timeout, set the async timer for it too */ + if (priv->estimated_eos != -1 && !priv->reached_npt_stop) { + sync_time = get_sync_time (jitterbuffer, priv->estimated_eos); + + GST_OBJECT_LOCK (jitterbuffer); + clock = GST_ELEMENT_CLOCK (jitterbuffer); + if (clock) { + GST_INFO_OBJECT (jitterbuffer, "scheduling timeout"); + id = gst_clock_new_single_shot_id (clock, sync_time); + gst_clock_id_wait_async (id, (GstClockCallback) eos_reached, + jitterbuffer); + } + GST_OBJECT_UNLOCK (jitterbuffer); + } + } + do_wait: + /* now we wait */ + GST_DEBUG_OBJECT (jitterbuffer, "waiting"); + priv->waiting = TRUE; + JBUF_WAIT (priv); + priv->waiting = FALSE; + GST_DEBUG_OBJECT (jitterbuffer, "waiting done"); + + if (id) { + /* unschedule any pending async notifications we might have */ + gst_clock_id_unschedule (id); + gst_clock_id_unref (id); + } + if (G_UNLIKELY (priv->srcresult != GST_FLOW_OK)) + goto flushing; + + if (id && priv->reached_npt_stop) { + goto do_npt_stop; + } + } + + /* peek a buffer, we're just looking at the timestamp and the sequence number. + * If all is fine, we'll pop and push it. If the sequence number is wrong we + * wait on the timestamp. In the chain function we will unlock the wait when a + * new buffer is available. The peeked buffer is valid for as long as we hold + * the jitterbuffer lock. */ + outbuf = rtp_jitter_buffer_peek (priv->jbuf); + + /* get the seqnum and the next expected seqnum */ + seqnum = gst_rtp_buffer_get_seq (outbuf); + next_seqnum = priv->next_seqnum; + + /* get the timestamp, this is already corrected for clock skew by the + * jitterbuffer */ + timestamp = GST_BUFFER_TIMESTAMP (outbuf); + + GST_DEBUG_OBJECT (jitterbuffer, + "Peeked buffer #%d, expect #%d, timestamp %" GST_TIME_FORMAT + ", now %d left", seqnum, next_seqnum, GST_TIME_ARGS (timestamp), + rtp_jitter_buffer_num_packets (priv->jbuf)); + + /* apply our timestamp offset to the incomming buffer, this will be our output + * timestamp. */ + out_time = apply_offset (jitterbuffer, timestamp); + + /* get the gap between this and the previous packet. If we don't know the + * previous packet seqnum assume no gap. */ + if (G_LIKELY (next_seqnum != -1)) { + gap = gst_rtp_buffer_compare_seqnum (next_seqnum, seqnum); + + /* if we have a packet that we already pushed or considered dropped, pop it + * off and get the next packet */ + if (G_UNLIKELY (gap < 0)) { + GST_DEBUG_OBJECT (jitterbuffer, "Old packet #%d, next #%d dropping", + seqnum, next_seqnum); + outbuf = rtp_jitter_buffer_pop (priv->jbuf, &percent); + gst_buffer_unref (outbuf); + goto again; + } + } else { + GST_DEBUG_OBJECT (jitterbuffer, "no next seqnum known, first packet"); + gap = -1; + } + + /* If we don't know what the next seqnum should be (== -1) we have to wait + * because it might be possible that we are not receiving this buffer in-order, + * a buffer with a lower seqnum could arrive later and we want to push that + * earlier buffer before this buffer then. + * If we know the expected seqnum, we can compare it to the current seqnum to + * determine if we have missing a packet. If we have a missing packet (which + * must be before this packet) we can wait for it until the deadline for this + * packet expires. */ + if (G_UNLIKELY (gap != 0 && out_time != -1)) { + GstClockReturn ret; + GstClockTime duration = GST_CLOCK_TIME_NONE; + + if (gap > 0) { + /* we have a gap */ + GST_DEBUG_OBJECT (jitterbuffer, + "Sequence number GAP detected: expected %d instead of %d (%d missing)", + next_seqnum, seqnum, gap); + + if (priv->last_out_time != -1) { + GST_DEBUG_OBJECT (jitterbuffer, + "out_time %" GST_TIME_FORMAT ", last %" GST_TIME_FORMAT, + GST_TIME_ARGS (out_time), GST_TIME_ARGS (priv->last_out_time)); + /* interpolate between the current time and the last time based on + * number of packets we are missing, this is the estimated duration + * for the missing packet based on equidistant packet spacing. Also make + * sure we never go negative. */ + if (out_time >= priv->last_out_time) + duration = (out_time - priv->last_out_time) / (gap + 1); + else + goto lost; + + GST_DEBUG_OBJECT (jitterbuffer, "duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (duration)); + /* add this duration to the timestamp of the last packet we pushed */ + out_time = (priv->last_out_time + duration); + } + } else { + /* we don't know what the next_seqnum should be, wait for the last + * possible moment to push this buffer, maybe we get an earlier seqnum + * while we wait */ + GST_DEBUG_OBJECT (jitterbuffer, "First buffer %d, do sync", seqnum); + } + + GST_OBJECT_LOCK (jitterbuffer); + clock = GST_ELEMENT_CLOCK (jitterbuffer); + if (!clock) { + GST_OBJECT_UNLOCK (jitterbuffer); + /* let's just push if there is no clock */ + GST_DEBUG_OBJECT (jitterbuffer, "No clock, push right away"); + goto push_buffer; + } + + GST_DEBUG_OBJECT (jitterbuffer, "sync to timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (out_time)); + + /* prepare for sync against clock */ + sync_time = get_sync_time (jitterbuffer, out_time); + + /* create an entry for the clock */ + id = priv->clock_id = gst_clock_new_single_shot_id (clock, sync_time); + priv->unscheduled = FALSE; + GST_OBJECT_UNLOCK (jitterbuffer); + + /* release the lock so that the other end can push stuff or unlock */ + JBUF_UNLOCK (priv); + + ret = gst_clock_id_wait (id, NULL); + + JBUF_LOCK (priv); + /* and free the entry */ + gst_clock_id_unref (id); + priv->clock_id = NULL; + + /* at this point, the clock could have been unlocked by a timeout, a new + * tail element was added to the queue or because we are shutting down. Check + * for shutdown first. */ + if G_UNLIKELY + ((priv->srcresult != GST_FLOW_OK)) + goto flushing; + + /* if we got unscheduled and we are not flushing, it's because a new tail + * element became available in the queue or we flushed the queue. + * Grab it and try to push or sync. */ + if (ret == GST_CLOCK_UNSCHEDULED || priv->unscheduled) { + GST_DEBUG_OBJECT (jitterbuffer, + "Wait got unscheduled, will retry to push with new buffer"); + goto again; + } + + lost: + /* we now timed out, this means we lost a packet or finished synchronizing + * on the first buffer. */ + if (gap > 0) { + GstEvent *event; + + /* we had a gap and thus we lost a packet. Create an event for this. */ + GST_DEBUG_OBJECT (jitterbuffer, "Packet #%d lost", next_seqnum); + priv->num_late++; + discont = TRUE; + + /* update our expected next packet */ + priv->last_popped_seqnum = next_seqnum; + priv->last_out_time = out_time; + priv->next_seqnum = (next_seqnum + 1) & 0xffff; + + if (priv->do_lost) { + /* create paket lost event */ + event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, + gst_structure_new ("GstRTPPacketLost", + "seqnum", G_TYPE_UINT, (guint) next_seqnum, + "timestamp", G_TYPE_UINT64, out_time, + "duration", G_TYPE_UINT64, duration, NULL)); + + JBUF_UNLOCK (priv); + gst_pad_push_event (priv->srcpad, event); + JBUF_LOCK_CHECK (priv, flushing); + } + /* look for next packet */ + goto again; + } + + /* there was no known gap,just the first packet, exit the loop and push */ + GST_DEBUG_OBJECT (jitterbuffer, "First packet #%d synced", seqnum); + + /* get new timestamp, latency might have changed */ + out_time = apply_offset (jitterbuffer, timestamp); + } +push_buffer: + + /* when we get here we are ready to pop and push the buffer */ + outbuf = rtp_jitter_buffer_pop (priv->jbuf, &percent); + + check_buffering_percent (jitterbuffer, &percent); + + if (G_UNLIKELY (discont || priv->discont)) { + /* set DISCONT flag when we missed a packet. We pushed the buffer writable + * into the jitterbuffer so we can modify now. */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + priv->discont = FALSE; + } + + /* apply timestamp with offset to buffer now */ + GST_BUFFER_TIMESTAMP (outbuf) = out_time; + + /* update the elapsed time when we need to check against the npt stop time. */ + if (priv->npt_stop != -1 && priv->ext_timestamp != -1 + && priv->clock_base != -1 && priv->clock_rate > 0) { + guint64 elapsed, estimated; + + elapsed = compute_elapsed (jitterbuffer, outbuf); + + if (elapsed > priv->last_elapsed || !priv->last_elapsed) { + guint64 left; + + priv->last_elapsed = elapsed; + + left = priv->npt_stop - priv->npt_start; + GST_LOG_OBJECT (jitterbuffer, "left %" GST_TIME_FORMAT, + GST_TIME_ARGS (left)); + + if (elapsed > 0) + estimated = gst_util_uint64_scale (out_time, left, elapsed); + else { + /* if there is almost nothing left, + * we may never advance enough to end up in the above case */ + if (left < GST_SECOND) + estimated = GST_SECOND; + else + estimated = -1; + } + + GST_LOG_OBJECT (jitterbuffer, "elapsed %" GST_TIME_FORMAT ", estimated %" + GST_TIME_FORMAT, GST_TIME_ARGS (elapsed), GST_TIME_ARGS (estimated)); + + priv->estimated_eos = estimated; + } + } + + /* now we are ready to push the buffer. Save the seqnum and release the lock + * so the other end can push stuff in the queue again. */ + priv->last_popped_seqnum = seqnum; + priv->last_out_time = out_time; + priv->next_seqnum = (seqnum + 1) & 0xffff; + JBUF_UNLOCK (priv); + + if (percent != -1) + post_buffering_percent (jitterbuffer, percent); + + /* push buffer */ + GST_DEBUG_OBJECT (jitterbuffer, + "Pushing buffer %d, timestamp %" GST_TIME_FORMAT, seqnum, + GST_TIME_ARGS (out_time)); + result = gst_pad_push (priv->srcpad, outbuf); + if (G_UNLIKELY (result != GST_FLOW_OK)) + goto pause; + + return; + + /* ERRORS */ +do_eos: + { + /* store result, we are flushing now */ + GST_DEBUG_OBJECT (jitterbuffer, "We are EOS, pushing EOS downstream"); + priv->srcresult = GST_FLOW_UNEXPECTED; + gst_pad_pause_task (priv->srcpad); + JBUF_UNLOCK (priv); + gst_pad_push_event (priv->srcpad, gst_event_new_eos ()); + return; + } +do_npt_stop: + { + /* store result, we are flushing now */ + GST_DEBUG_OBJECT (jitterbuffer, "We reached the NPT stop"); + JBUF_UNLOCK (priv); + + g_signal_emit (jitterbuffer, + gst_rtp_jitter_buffer_signals[SIGNAL_ON_NPT_STOP], 0, NULL); + return; + } +flushing: + { + GST_DEBUG_OBJECT (jitterbuffer, "we are flushing"); + gst_pad_pause_task (priv->srcpad); + JBUF_UNLOCK (priv); + return; + } +pause: + { + GST_DEBUG_OBJECT (jitterbuffer, "pausing task, reason %s", + gst_flow_get_name (result)); + + JBUF_LOCK (priv); + /* store result */ + priv->srcresult = result; + /* we don't post errors or anything because upstream will do that for us + * when we pass the return value upstream. */ + gst_pad_pause_task (priv->srcpad); + JBUF_UNLOCK (priv); + return; + } +} + +static GstFlowReturn +gst_rtp_jitter_buffer_chain_rtcp (GstPad * pad, GstBuffer * buffer) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + GstFlowReturn ret = GST_FLOW_OK; + guint64 base_rtptime, base_time; + guint32 clock_rate; + guint64 last_rtptime; + guint32 ssrc; + GstRTCPPacket packet; + guint64 ext_rtptime, diff; + guint32 rtptime; + gboolean drop = FALSE; + guint64 clock_base; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + + if (G_UNLIKELY (!gst_rtcp_buffer_validate (buffer))) + goto invalid_buffer; + + priv = jitterbuffer->priv; + + if (!gst_rtcp_buffer_get_first_packet (buffer, &packet)) + goto invalid_buffer; + + /* first packet must be SR or RR or else the validate would have failed */ + switch (gst_rtcp_packet_get_type (&packet)) { + case GST_RTCP_TYPE_SR: + gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, NULL, &rtptime, + NULL, NULL); + break; + default: + goto ignore_buffer; + } + + GST_DEBUG_OBJECT (jitterbuffer, "received RTCP of SSRC %08x", ssrc); + + JBUF_LOCK (priv); + /* convert the RTP timestamp to our extended timestamp, using the same offset + * we used in the jitterbuffer */ + ext_rtptime = priv->jbuf->ext_rtptime; + ext_rtptime = gst_rtp_buffer_ext_timestamp (&ext_rtptime, rtptime); + + /* get the last values from the jitterbuffer */ + rtp_jitter_buffer_get_sync (priv->jbuf, &base_rtptime, &base_time, + &clock_rate, &last_rtptime); + + clock_base = priv->clock_base; + + GST_DEBUG_OBJECT (jitterbuffer, "ext SR %" G_GUINT64_FORMAT ", base %" + G_GUINT64_FORMAT ", clock-rate %" G_GUINT32_FORMAT + ", clock-base %" G_GUINT64_FORMAT, + ext_rtptime, base_rtptime, clock_rate, clock_base); + + if (base_rtptime == -1 || clock_rate == -1 || base_time == -1) { + GST_DEBUG_OBJECT (jitterbuffer, "dropping, no RTP values"); + drop = TRUE; + } else { + /* we can't accept anything that happened before we did the last resync */ + if (base_rtptime > ext_rtptime) { + GST_DEBUG_OBJECT (jitterbuffer, "dropping, older than base time"); + drop = TRUE; + } else { + /* the SR RTP timestamp must be something close to what we last observed + * in the jitterbuffer */ + if (ext_rtptime > last_rtptime) { + /* check how far ahead it is to our RTP timestamps */ + diff = ext_rtptime - last_rtptime; + /* if bigger than 1 second, we drop it */ + if (diff > clock_rate) { + GST_DEBUG_OBJECT (jitterbuffer, "too far ahead"); + /* should drop this, but some RTSP servers end up with bogus + * way too ahead RTCP packet when repeated PAUSE/PLAY, + * so still trigger rptbin sync but invalidate RTCP data + * (sync might use other methods) */ + ext_rtptime = -1; + } + GST_DEBUG_OBJECT (jitterbuffer, "ext last %" G_GUINT64_FORMAT ", diff %" + G_GUINT64_FORMAT, last_rtptime, diff); + } + } + } + JBUF_UNLOCK (priv); + + if (!drop) { + GstStructure *s; + + s = gst_structure_new ("application/x-rtp-sync", + "base-rtptime", G_TYPE_UINT64, base_rtptime, + "base-time", G_TYPE_UINT64, base_time, + "clock-rate", G_TYPE_UINT, clock_rate, + "clock-base", G_TYPE_UINT64, clock_base, + "sr-ext-rtptime", G_TYPE_UINT64, ext_rtptime, + "sr-buffer", GST_TYPE_BUFFER, buffer, NULL); + + GST_DEBUG_OBJECT (jitterbuffer, "signaling sync"); + g_signal_emit (jitterbuffer, + gst_rtp_jitter_buffer_signals[SIGNAL_HANDLE_SYNC], 0, s); + gst_structure_free (s); + } else { + GST_DEBUG_OBJECT (jitterbuffer, "dropping RTCP packet"); + ret = GST_FLOW_OK; + } + +done: + gst_buffer_unref (buffer); + gst_object_unref (jitterbuffer); + + return ret; + +invalid_buffer: + { + /* this is not fatal but should be filtered earlier */ + GST_ELEMENT_WARNING (jitterbuffer, STREAM, DECODE, (NULL), + ("Received invalid RTCP payload, dropping")); + ret = GST_FLOW_OK; + goto done; + } +ignore_buffer: + { + GST_DEBUG_OBJECT (jitterbuffer, "ignoring RTCP packet"); + ret = GST_FLOW_OK; + goto done; + } +} + +static gboolean +gst_rtp_jitter_buffer_query (GstPad * pad, GstQuery * query) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + gboolean res = FALSE; + + jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); + if (G_UNLIKELY (jitterbuffer == NULL)) + return FALSE; + priv = jitterbuffer->priv; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + /* We need to send the query upstream and add the returned latency to our + * own */ + GstClockTime min_latency, max_latency; + gboolean us_live; + GstClockTime our_latency; + + if ((res = gst_pad_peer_query (priv->sinkpad, query))) { + gst_query_parse_latency (query, &us_live, &min_latency, &max_latency); + + GST_DEBUG_OBJECT (jitterbuffer, "Peer latency: min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + /* store this so that we can safely sync on the peer buffers. */ + JBUF_LOCK (priv); + priv->peer_latency = min_latency; + our_latency = priv->latency_ns; + JBUF_UNLOCK (priv); + + GST_DEBUG_OBJECT (jitterbuffer, "Our latency: %" GST_TIME_FORMAT, + GST_TIME_ARGS (our_latency)); + + /* we add some latency but can buffer an infinite amount of time */ + min_latency += our_latency; + max_latency = -1; + + GST_DEBUG_OBJECT (jitterbuffer, "Calculated total latency : min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + gst_query_set_latency (query, TRUE, min_latency, max_latency); + } + break; + } + case GST_QUERY_POSITION: + { + GstClockTime start, last_out; + GstFormat fmt; + + gst_query_parse_position (query, &fmt, NULL); + if (fmt != GST_FORMAT_TIME) { + res = gst_pad_query_default (pad, query); + break; + } + + JBUF_LOCK (priv); + start = priv->npt_start; + last_out = priv->last_out_time; + JBUF_UNLOCK (priv); + + GST_DEBUG_OBJECT (jitterbuffer, "npt start %" GST_TIME_FORMAT + ", last out %" GST_TIME_FORMAT, GST_TIME_ARGS (start), + GST_TIME_ARGS (last_out)); + + if (GST_CLOCK_TIME_IS_VALID (start) && GST_CLOCK_TIME_IS_VALID (last_out)) { + /* bring 0-based outgoing time to stream time */ + gst_query_set_position (query, GST_FORMAT_TIME, start + last_out); + res = TRUE; + } else { + res = gst_pad_query_default (pad, query); + } + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + + gst_object_unref (jitterbuffer); + + return res; +} + +static void +gst_rtp_jitter_buffer_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + + jitterbuffer = GST_RTP_JITTER_BUFFER (object); + priv = jitterbuffer->priv; + + switch (prop_id) { + case PROP_LATENCY: + { + guint new_latency, old_latency; + + new_latency = g_value_get_uint (value); + + JBUF_LOCK (priv); + old_latency = priv->latency_ms; + priv->latency_ms = new_latency; + priv->latency_ns = priv->latency_ms * GST_MSECOND; + rtp_jitter_buffer_set_delay (priv->jbuf, priv->latency_ns); + JBUF_UNLOCK (priv); + + /* post message if latency changed, this will inform the parent pipeline + * that a latency reconfiguration is possible/needed. */ + if (new_latency != old_latency) { + GST_DEBUG_OBJECT (jitterbuffer, "latency changed to: %" GST_TIME_FORMAT, + GST_TIME_ARGS (new_latency * GST_MSECOND)); + + gst_element_post_message (GST_ELEMENT_CAST (jitterbuffer), + gst_message_new_latency (GST_OBJECT_CAST (jitterbuffer))); + } + break; + } + case PROP_DROP_ON_LATENCY: + JBUF_LOCK (priv); + priv->drop_on_latency = g_value_get_boolean (value); + JBUF_UNLOCK (priv); + break; + case PROP_TS_OFFSET: + JBUF_LOCK (priv); + priv->ts_offset = g_value_get_int64 (value); + /* FIXME, we don't really have a method for signaling a timestamp + * DISCONT without also making this a data discont. */ + /* priv->discont = TRUE; */ + JBUF_UNLOCK (priv); + break; + case PROP_DO_LOST: + JBUF_LOCK (priv); + priv->do_lost = g_value_get_boolean (value); + JBUF_UNLOCK (priv); + break; + case PROP_MODE: + JBUF_LOCK (priv); + rtp_jitter_buffer_set_mode (priv->jbuf, g_value_get_enum (value)); + JBUF_UNLOCK (priv); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_jitter_buffer_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstRtpJitterBuffer *jitterbuffer; + GstRtpJitterBufferPrivate *priv; + + jitterbuffer = GST_RTP_JITTER_BUFFER (object); + priv = jitterbuffer->priv; + + switch (prop_id) { + case PROP_LATENCY: + JBUF_LOCK (priv); + g_value_set_uint (value, priv->latency_ms); + JBUF_UNLOCK (priv); + break; + case PROP_DROP_ON_LATENCY: + JBUF_LOCK (priv); + g_value_set_boolean (value, priv->drop_on_latency); + JBUF_UNLOCK (priv); + break; + case PROP_TS_OFFSET: + JBUF_LOCK (priv); + g_value_set_int64 (value, priv->ts_offset); + JBUF_UNLOCK (priv); + break; + case PROP_DO_LOST: + JBUF_LOCK (priv); + g_value_set_boolean (value, priv->do_lost); + JBUF_UNLOCK (priv); + break; + case PROP_MODE: + JBUF_LOCK (priv); + g_value_set_enum (value, rtp_jitter_buffer_get_mode (priv->jbuf)); + JBUF_UNLOCK (priv); + break; + case PROP_PERCENT: + { + gint percent; + + JBUF_LOCK (priv); + if (priv->srcresult != GST_FLOW_OK) + percent = 100; + else + percent = rtp_jitter_buffer_get_percent (priv->jbuf); + + g_value_set_int (value, percent); + JBUF_UNLOCK (priv); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/rtpmanager/gstrtpjitterbuffer.h b/gst/rtpmanager/gstrtpjitterbuffer.h new file mode 100644 index 0000000..37ef7b3 --- /dev/null +++ b/gst/rtpmanager/gstrtpjitterbuffer.h @@ -0,0 +1,85 @@ +/* + * Farsight Voice+Video library + * + * Copyright 2007 Collabora Ltd, + * Copyright 2007 Nokia Corporation + * @author: Philippe Kalaf . + * Copyright 2007 Wim Taymans + * + * 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_RTP_JITTER_BUFFER_H__ +#define __GST_RTP_JITTER_BUFFER_H__ + +#include +#include + +G_BEGIN_DECLS + +/* #define's don't like whitespacey bits */ +#define GST_TYPE_RTP_JITTER_BUFFER \ + (gst_rtp_jitter_buffer_get_type()) +#define GST_RTP_JITTER_BUFFER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + GST_TYPE_RTP_JITTER_BUFFER,GstRtpJitterBuffer)) +#define GST_RTP_JITTER_BUFFER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + GST_TYPE_RTP_JITTER_BUFFER,GstRtpJitterBufferClass)) +#define GST_IS_RTP_JITTER_BUFFER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_JITTER_BUFFER)) +#define GST_IS_RTP_JITTER_BUFFER_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_JITTER_BUFFER)) + +typedef struct _GstRtpJitterBuffer GstRtpJitterBuffer; +typedef struct _GstRtpJitterBufferClass GstRtpJitterBufferClass; +typedef struct _GstRtpJitterBufferPrivate GstRtpJitterBufferPrivate; + +/** + * GstRtpJitterBuffer: + * + * Opaque jitterbuffer structure. + */ +struct _GstRtpJitterBuffer +{ + GstElement parent; + + /*< private >*/ + GstRtpJitterBufferPrivate *priv; /* FIXME: remove? */ +}; + +struct _GstRtpJitterBufferClass +{ + GstElementClass parent_class; + + /* signals */ + GstCaps* (*request_pt_map) (GstRtpJitterBuffer *buffer, guint pt); + + void (*handle_sync) (GstRtpJitterBuffer *buffer, GstStructure *s); + void (*on_npt_stop) (GstRtpJitterBuffer *buffer); + + /* actions */ + void (*clear_pt_map) (GstRtpJitterBuffer *buffer); + + GstClockTime (*set_active) (GstRtpJitterBuffer *buffer, gboolean active, guint64 elapsed); +}; + +GType gst_rtp_jitter_buffer_get_type (void); + +G_END_DECLS + +#endif /* __GST_RTP_JITTER_BUFFER_H__ */ diff --git a/gst/rtpmanager/gstrtpmanager.c b/gst/rtpmanager/gstrtpmanager.c new file mode 100644 index 0000000..f38a77a --- /dev/null +++ b/gst/rtpmanager/gstrtpmanager.c @@ -0,0 +1,60 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 "gstrtpbin.h" +#include "gstrtpjitterbuffer.h" +#include "gstrtpptdemux.h" +#include "gstrtpsession.h" +#include "gstrtpssrcdemux.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "gstrtpbin", GST_RANK_NONE, + GST_TYPE_RTP_BIN)) + return FALSE; + + if (!gst_element_register (plugin, "gstrtpjitterbuffer", GST_RANK_NONE, + GST_TYPE_RTP_JITTER_BUFFER)) + return FALSE; + + if (!gst_element_register (plugin, "gstrtpptdemux", GST_RANK_NONE, + GST_TYPE_RTP_PT_DEMUX)) + return FALSE; + + if (!gst_element_register (plugin, "gstrtpsession", GST_RANK_NONE, + GST_TYPE_RTP_SESSION)) + return FALSE; + + if (!gst_element_register (plugin, "gstrtpssrcdemux", GST_RANK_NONE, + GST_TYPE_RTP_SSRC_DEMUX)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "gstrtpmanager", + "RTP session management plugin library", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/rtpmanager/gstrtpptdemux.c b/gst/rtpmanager/gstrtpptdemux.c new file mode 100644 index 0000000..630212f --- /dev/null +++ b/gst/rtpmanager/gstrtpptdemux.c @@ -0,0 +1,578 @@ +/* + * RTP Demux element + * + * Copyright (C) 2005 Nokia Corporation. + * @author Kai Vehmanen + * + * Loosely based on GStreamer gstdecodebin + * Copyright (C) <2004> Wim Taymans + * + * 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-gstrtpptdemux + * + * gstrtpptdemux acts as a demuxer for RTP packets based on the payload type of + * the packets. Its main purpose is to allow an application to easily receive + * and decode an RTP stream with multiple payload types. + * + * For each payload type that is detected, a new pad will be created and the + * #GstRtpPtDemux::new-payload-type signal will be emitted. When the payload for + * the RTP stream changes, the #GstRtpPtDemux::payload-type-change signal will be + * emitted. + * + * The element will try to set complete and unique application/x-rtp caps on the + * outgoing buffers and pads based on the result of the + * #GstRtpPtDemux::request-pt-map signal. + * + * + * Example pipelines + * |[ + * gst-launch udpsrc caps="application/x-rtp" ! gstrtpptdemux ! fakesink + * ]| Takes an RTP stream and send the RTP packets with the first detected + * payload type to fakesink, discarding the other payload types. + * + * + * Last reviewed on 2007-05-28 (0.10.5) + */ + +/* + * Contributors: + * Andre Moreira Magalhaes + */ +/* + * Status: + * - works with the test_rtpdemux.c tool + * + * Check: + * - is emitting a signal enough, or should we + * use GstEvent to notify downstream elements + * of the new packet... no? + * + * Notes: + * - emits event both for new PTs, and whenever + * a PT is changed + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "gstrtpbin-marshal.h" +#include "gstrtpptdemux.h" + +/* generic templates */ +static GstStaticPadTemplate rtp_pt_demux_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate rtp_pt_demux_src_template = +GST_STATIC_PAD_TEMPLATE ("src_%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtp, " "payload = (int) [ 0, 255 ]") + ); + +GST_DEBUG_CATEGORY_STATIC (gst_rtp_pt_demux_debug); +#define GST_CAT_DEFAULT gst_rtp_pt_demux_debug + +/* + * Item for storing GstPad<->pt pairs. + */ +struct _GstRtpPtDemuxPad +{ + GstPad *pad; /**< pointer to the actual pad */ + gint pt; /**< RTP payload-type attached to pad */ + gboolean newcaps; +}; + +/* signals */ +enum +{ + SIGNAL_REQUEST_PT_MAP, + SIGNAL_NEW_PAYLOAD_TYPE, + SIGNAL_PAYLOAD_TYPE_CHANGE, + SIGNAL_CLEAR_PT_MAP, + LAST_SIGNAL +}; + +GST_BOILERPLATE (GstRtpPtDemux, gst_rtp_pt_demux, GstElement, GST_TYPE_ELEMENT); + +static void gst_rtp_pt_demux_finalize (GObject * object); + +static void gst_rtp_pt_demux_release (GstRtpPtDemux * ptdemux); +static gboolean gst_rtp_pt_demux_setup (GstRtpPtDemux * ptdemux); + +static gboolean gst_rtp_pt_demux_sink_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf); +static GstStateChangeReturn gst_rtp_pt_demux_change_state (GstElement * element, + GstStateChange transition); +static void gst_rtp_pt_demux_clear_pt_map (GstRtpPtDemux * rtpdemux); + +static GstRtpPtDemuxPad *find_pad_for_pt (GstRtpPtDemux * rtpdemux, guint8 pt); + +static gboolean gst_rtp_pt_demux_src_event (GstPad * pad, GstEvent * event); + + +static guint gst_rtp_pt_demux_signals[LAST_SIGNAL] = { 0 }; + +static void +gst_rtp_pt_demux_base_init (gpointer g_class) +{ + GstElementClass *gstelement_klass = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (gstelement_klass, + &rtp_pt_demux_sink_template); + gst_element_class_add_static_pad_template (gstelement_klass, + &rtp_pt_demux_src_template); + + gst_element_class_set_details_simple (gstelement_klass, "RTP Demux", + "Demux/Network/RTP", + "Parses codec streams transmitted in the same RTP session", + "Kai Vehmanen "); +} + +static void +gst_rtp_pt_demux_class_init (GstRtpPtDemuxClass * klass) +{ + GObjectClass *gobject_klass; + GstElementClass *gstelement_klass; + + gobject_klass = (GObjectClass *) klass; + gstelement_klass = (GstElementClass *) klass; + + /** + * GstRtpPtDemux::request-pt-map: + * @demux: the object which received the signal + * @pt: the payload type + * + * Request the payload type as #GstCaps for @pt. + */ + gst_rtp_pt_demux_signals[SIGNAL_REQUEST_PT_MAP] = + g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpPtDemuxClass, request_pt_map), + NULL, NULL, gst_rtp_bin_marshal_BOXED__UINT, GST_TYPE_CAPS, 1, + G_TYPE_UINT); + + /** + * GstRtpPtDemux::new-payload-type: + * @demux: the object which received the signal + * @pt: the payload type + * @pad: the pad with the new payload + * + * Emited when a new payload type pad has been created in @demux. + */ + gst_rtp_pt_demux_signals[SIGNAL_NEW_PAYLOAD_TYPE] = + g_signal_new ("new-payload-type", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpPtDemuxClass, new_payload_type), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_OBJECT, G_TYPE_NONE, 2, + G_TYPE_UINT, GST_TYPE_PAD); + + /** + * GstRtpPtDemux::payload-type-change: + * @demux: the object which received the signal + * @pt: the new payload type + * + * Emited when the payload type changed. + */ + gst_rtp_pt_demux_signals[SIGNAL_PAYLOAD_TYPE_CHANGE] = + g_signal_new ("payload-type-change", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpPtDemuxClass, + payload_type_change), NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + + /** + * GstRtpPtDemux::clear-pt-map: + * @demux: the object which received the signal + * + * The application can call this signal to instruct the element to discard the + * currently cached payload type map. + */ + gst_rtp_pt_demux_signals[SIGNAL_CLEAR_PT_MAP] = + g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_ACTION | G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpPtDemuxClass, + clear_pt_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + + gobject_klass->finalize = gst_rtp_pt_demux_finalize; + + gstelement_klass->change_state = + GST_DEBUG_FUNCPTR (gst_rtp_pt_demux_change_state); + + klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_pt_demux_clear_pt_map); + + GST_DEBUG_CATEGORY_INIT (gst_rtp_pt_demux_debug, + "rtpptdemux", 0, "RTP codec demuxer"); +} + +static void +gst_rtp_pt_demux_init (GstRtpPtDemux * ptdemux, GstRtpPtDemuxClass * g_class) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (ptdemux); + + ptdemux->sink = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "sink"), "sink"); + g_assert (ptdemux->sink != NULL); + + gst_pad_set_chain_function (ptdemux->sink, gst_rtp_pt_demux_chain); + gst_pad_set_event_function (ptdemux->sink, gst_rtp_pt_demux_sink_event); + + gst_element_add_pad (GST_ELEMENT (ptdemux), ptdemux->sink); +} + +static void +gst_rtp_pt_demux_finalize (GObject * object) +{ + gst_rtp_pt_demux_release (GST_RTP_PT_DEMUX (object)); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstCaps * +gst_rtp_pt_demux_get_caps (GstRtpPtDemux * rtpdemux, guint pt) +{ + GstCaps *caps; + GValue ret = { 0 }; + GValue args[2] = { {0}, {0} }; + + /* figure out the caps */ + g_value_init (&args[0], GST_TYPE_ELEMENT); + g_value_set_object (&args[0], rtpdemux); + g_value_init (&args[1], G_TYPE_UINT); + g_value_set_uint (&args[1], pt); + + g_value_init (&ret, GST_TYPE_CAPS); + g_value_set_boxed (&ret, NULL); + + g_signal_emitv (args, gst_rtp_pt_demux_signals[SIGNAL_REQUEST_PT_MAP], 0, + &ret); + + g_value_unset (&args[0]); + g_value_unset (&args[1]); + caps = g_value_dup_boxed (&ret); + g_value_unset (&ret); + if (caps == NULL) { + caps = GST_PAD_CAPS (rtpdemux->sink); + if (caps) + gst_caps_ref (caps); + } + + GST_DEBUG ("pt %d, got caps %" GST_PTR_FORMAT, pt, caps); + + return caps; +} + +static void +gst_rtp_pt_demux_clear_pt_map (GstRtpPtDemux * rtpdemux) +{ + GSList *walk; + + GST_OBJECT_LOCK (rtpdemux); + GST_DEBUG ("clearing pt map"); + for (walk = rtpdemux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpPtDemuxPad *pad = walk->data; + + pad->newcaps = TRUE; + } + GST_OBJECT_UNLOCK (rtpdemux); +} + +static GstFlowReturn +gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstRtpPtDemux *rtpdemux; + GstElement *element = GST_ELEMENT (GST_OBJECT_PARENT (pad)); + guint8 pt; + GstPad *srcpad; + GstRtpPtDemuxPad *rtpdemuxpad; + GstCaps *caps; + + rtpdemux = GST_RTP_PT_DEMUX (GST_OBJECT_PARENT (pad)); + + if (!gst_rtp_buffer_validate (buf)) + goto invalid_buffer; + + pt = gst_rtp_buffer_get_payload_type (buf); + + GST_DEBUG_OBJECT (rtpdemux, "received buffer for pt %d", pt); + + rtpdemuxpad = find_pad_for_pt (rtpdemux, pt); + if (rtpdemuxpad == NULL) { + /* new PT, create a src pad */ + GstElementClass *klass; + GstPadTemplate *templ; + gchar *padname; + + caps = gst_rtp_pt_demux_get_caps (rtpdemux, pt); + if (!caps) + goto no_caps; + + klass = GST_ELEMENT_GET_CLASS (rtpdemux); + templ = gst_element_class_get_pad_template (klass, "src_%d"); + padname = g_strdup_printf ("src_%d", pt); + srcpad = gst_pad_new_from_template (templ, padname); + gst_pad_use_fixed_caps (srcpad); + g_free (padname); + gst_pad_set_event_function (srcpad, gst_rtp_pt_demux_src_event); + + caps = gst_caps_make_writable (caps); + gst_caps_set_simple (caps, "payload", G_TYPE_INT, pt, NULL); + gst_pad_set_caps (srcpad, caps); + gst_caps_unref (caps); + + GST_DEBUG ("Adding pt=%d to the list.", pt); + rtpdemuxpad = g_new0 (GstRtpPtDemuxPad, 1); + rtpdemuxpad->pt = pt; + rtpdemuxpad->newcaps = FALSE; + rtpdemuxpad->pad = srcpad; + GST_OBJECT_LOCK (rtpdemux); + rtpdemux->srcpads = g_slist_append (rtpdemux->srcpads, rtpdemuxpad); + GST_OBJECT_UNLOCK (rtpdemux); + + gst_pad_set_active (srcpad, TRUE); + gst_element_add_pad (element, srcpad); + + GST_DEBUG ("emitting new-payload-type for pt %d", pt); + g_signal_emit (G_OBJECT (rtpdemux), + gst_rtp_pt_demux_signals[SIGNAL_NEW_PAYLOAD_TYPE], 0, pt, srcpad); + } + + srcpad = rtpdemuxpad->pad; + + if (pt != rtpdemux->last_pt) { + gint emit_pt = pt; + + /* our own signal with an extra flag that this is the only pad */ + rtpdemux->last_pt = pt; + GST_DEBUG ("emitting payload-type-changed for pt %d", emit_pt); + g_signal_emit (G_OBJECT (rtpdemux), + gst_rtp_pt_demux_signals[SIGNAL_PAYLOAD_TYPE_CHANGE], 0, emit_pt); + } + + if (rtpdemuxpad->newcaps) { + GST_DEBUG ("need new caps"); + caps = gst_rtp_pt_demux_get_caps (rtpdemux, pt); + if (!caps) + goto no_caps; + + caps = gst_caps_make_writable (caps); + gst_caps_set_simple (caps, "payload", G_TYPE_INT, pt, NULL); + gst_pad_set_caps (srcpad, caps); + gst_caps_unref (caps); + rtpdemuxpad->newcaps = FALSE; + } + + gst_buffer_set_caps (buf, GST_PAD_CAPS (srcpad)); + + /* push to srcpad */ + ret = gst_pad_push (srcpad, buf); + + return ret; + + /* ERRORS */ +invalid_buffer: + { + /* this is fatal and should be filtered earlier */ + GST_ELEMENT_ERROR (rtpdemux, STREAM, DECODE, (NULL), + ("Dropping invalid RTP payload")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +no_caps: + { + GST_ELEMENT_ERROR (rtpdemux, STREAM, DECODE, (NULL), + ("Could not get caps for payload")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +} + +static GstRtpPtDemuxPad * +find_pad_for_pt (GstRtpPtDemux * rtpdemux, guint8 pt) +{ + GstRtpPtDemuxPad *respad = NULL; + GSList *walk; + + for (walk = rtpdemux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpPtDemuxPad *pad = walk->data; + + if (pad->pt == pt) { + respad = pad; + break; + } + } + return respad; +} + +static gboolean +gst_rtp_pt_demux_sink_event (GstPad * pad, GstEvent * event) +{ + GstRtpPtDemux *rtpdemux; + gboolean res = FALSE; + + rtpdemux = GST_RTP_PT_DEMUX (gst_pad_get_parent (pad)); + if (G_UNLIKELY (rtpdemux == NULL)) { + gst_event_unref (event); + return FALSE; + } + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CUSTOM_DOWNSTREAM: + { + const GstStructure *s; + + s = gst_event_get_structure (event); + + if (gst_structure_has_name (s, "GstRTPPacketLost")) { + GstRtpPtDemuxPad *rtpdemuxpad = + find_pad_for_pt (rtpdemux, rtpdemux->last_pt); + + if (rtpdemuxpad) + res = gst_pad_push_event (rtpdemuxpad->pad, event); + else + gst_event_unref (event); + + } else { + res = gst_pad_event_default (pad, event); + } + break; + } + default: + res = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (rtpdemux); + return res; +} + + +static gboolean +gst_rtp_pt_demux_src_event (GstPad * pad, GstEvent * event) +{ + GstRtpPtDemux *demux; + const GstStructure *s; + + demux = GST_RTP_PT_DEMUX (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CUSTOM_UPSTREAM: + case GST_EVENT_CUSTOM_BOTH: + case GST_EVENT_CUSTOM_BOTH_OOB: + s = gst_event_get_structure (event); + if (s && !gst_structure_has_field (s, "payload")) { + GSList *walk; + + for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpPtDemuxPad *dpad = (GstRtpPtDemuxPad *) walk->data; + + if (dpad->pad == pad) { + event = + GST_EVENT_CAST (gst_mini_object_make_writable + (GST_MINI_OBJECT_CAST (event))); + gst_structure_set (event->structure, + "payload", G_TYPE_UINT, dpad->pt, NULL); + break; + } + } + } + break; + default: + break; + } + + gst_object_unref (demux); + + return gst_pad_event_default (pad, event); +} + + + +/* + * Reserves resources for the object. + */ +static gboolean +gst_rtp_pt_demux_setup (GstRtpPtDemux * ptdemux) +{ + ptdemux->srcpads = NULL; + ptdemux->last_pt = 0xFFFF; + + return TRUE; +} + +/* + * Free resources for the object. + */ +static void +gst_rtp_pt_demux_release (GstRtpPtDemux * ptdemux) +{ + GSList *walk; + + for (walk = ptdemux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpPtDemuxPad *pad = walk->data; + + gst_pad_set_active (pad->pad, FALSE); + gst_element_remove_pad (GST_ELEMENT_CAST (ptdemux), pad->pad); + g_free (pad); + } + g_slist_free (ptdemux->srcpads); + ptdemux->srcpads = NULL; +} + +static GstStateChangeReturn +gst_rtp_pt_demux_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstRtpPtDemux *ptdemux; + + ptdemux = GST_RTP_PT_DEMUX (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (gst_rtp_pt_demux_setup (ptdemux) != TRUE) + ret = GST_STATE_CHANGE_FAILURE; + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + gst_rtp_pt_demux_release (ptdemux); + break; + default: + break; + } + + return ret; +} diff --git a/gst/rtpmanager/gstrtpptdemux.h b/gst/rtpmanager/gstrtpptdemux.h new file mode 100644 index 0000000..028c97d --- /dev/null +++ b/gst/rtpmanager/gstrtpptdemux.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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_RTP_PT_DEMUX_H__ +#define __GST_RTP_PT_DEMUX_H__ + +#include + +#define GST_TYPE_RTP_PT_DEMUX (gst_rtp_pt_demux_get_type()) +#define GST_RTP_PT_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PT_DEMUX,GstRtpPtDemux)) +#define GST_RTP_PT_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PT_DEMUX,GstRtpPtDemuxClass)) +#define GST_IS_RTP_PT_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PT_DEMUX)) +#define GST_IS_RTP_PT_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PT_DEMUX)) + +typedef struct _GstRtpPtDemux GstRtpPtDemux; +typedef struct _GstRtpPtDemuxClass GstRtpPtDemuxClass; +typedef struct _GstRtpPtDemuxPad GstRtpPtDemuxPad; + +struct _GstRtpPtDemux +{ + GstElement parent; /**< parent class */ + + GstPad *sink; /**< the sink pad */ + guint16 last_pt; /**< pt of the last packet 0xFFFF if none */ + GSList *srcpads; /**< a linked list of GstRtpPtDemuxPad objects */ +}; + +struct _GstRtpPtDemuxClass +{ + GstElementClass parent_class; + + /* get the caps for pt */ + GstCaps* (*request_pt_map) (GstRtpPtDemux *demux, guint pt); + + /* signal emmited when a new PT is found from the incoming stream */ + void (*new_payload_type) (GstRtpPtDemux *demux, guint pt, GstPad * pad); + + /* signal emitted when the payload type changes */ + void (*payload_type_change) (GstRtpPtDemux *demux, guint pt); + + void (*clear_pt_map) (GstRtpPtDemux *demux); +}; + +GType gst_rtp_pt_demux_get_type (void); + +#endif /* __GST_RTP_PT_DEMUX_H__ */ diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c new file mode 100644 index 0000000..cf263e3 --- /dev/null +++ b/gst/rtpmanager/gstrtpsession.c @@ -0,0 +1,2204 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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-gstrtpsession + * @see_also: gstrtpjitterbuffer, gstrtpbin, gstrtpptdemux, gstrtpssrcdemux + * + * The RTP session manager models one participant with a unique SSRC in an RTP + * session. This session can be used to send and receive RTP and RTCP packets. + * Based on what REQUEST pads are requested from the session manager, specific + * functionality can be activated. + * + * The session manager currently implements RFC 3550 including: + * + * + * RTP packet validation based on consecutive sequence numbers. + * + * + * Maintainance of the SSRC participant database. + * + * + * Keeping per participant statistics based on received RTCP packets. + * + * + * Scheduling of RR/SR RTCP packets. + * + * + * + * The gstrtpsession will not demux packets based on SSRC or payload type, nor will + * it correct for packet reordering and jitter. Use #GstRtpsSrcDemux, + * #GstRtpPtDemux and GstRtpJitterBuffer in addition to #GstRtpSession to + * perform these tasks. It is usually a good idea to use #GstRtpBin, which + * combines all these features in one element. + * + * To use #GstRtpSession as an RTP receiver, request a recv_rtp_sink pad, which will + * automatically create recv_rtp_src pad. Data received on the recv_rtp_sink pad + * will be processed in the session and after being validated forwarded on the + * recv_rtp_src pad. + * + * To also use #GstRtpSession as an RTCP receiver, request a recv_rtcp_sink pad, + * which will automatically create a sync_src pad. Packets received on the RTCP + * pad will be used by the session manager to update the stats and database of + * the other participants. SR packets will be forwarded on the sync_src pad + * so that they can be used to perform inter-stream synchronisation when needed. + * + * If you want the session manager to generate and send RTCP packets, request + * the send_rtcp_src pad. Packet pushed on this pad contain SR/RR RTCP reports + * that should be sent to all participants in the session. + * + * To use #GstRtpSession as a sender, request a send_rtp_sink pad, which will + * automatically create a send_rtp_src pad. The session manager will modify the + * SSRC in the RTP packets to its own SSRC and wil forward the packets on the + * send_rtp_src pad after updating its internal state. + * + * The session manager needs the clock-rate of the payload types it is handling + * and will signal the #GstRtpSession::request-pt-map signal when it needs such a + * mapping. One can clear the cached values with the #GstRtpSession::clear-pt-map + * signal. + * + * + * Example pipelines + * |[ + * gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink gstrtpsession .recv_rtp_src ! rtptheoradepay ! theoradec ! xvimagesink + * ]| Receive theora RTP packets from port 5000 and send them to the depayloader, + * decoder and display. Note that the application/x-rtp caps on udpsrc should be + * configured based on some negotiation process such as RTSP for this pipeline + * to work correctly. + * |[ + * gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink gstrtpsession name=session \ + * .recv_rtp_src ! rtptheoradepay ! theoradec ! xvimagesink \ + * udpsrc port=5001 caps="application/x-rtcp" ! session.recv_rtcp_sink + * ]| Receive theora RTP packets from port 5000 and send them to the depayloader, + * decoder and display. Receive RTCP packets from port 5001 and process them in + * the session manager. + * Note that the application/x-rtp caps on udpsrc should be + * configured based on some negotiation process such as RTSP for this pipeline + * to work correctly. + * |[ + * gst-launch videotestsrc ! theoraenc ! rtptheorapay ! .send_rtp_sink gstrtpsession .send_rtp_src ! udpsink port=5000 + * ]| Send theora RTP packets through the session manager and out on UDP port + * 5000. + * |[ + * gst-launch videotestsrc ! theoraenc ! rtptheorapay ! .send_rtp_sink gstrtpsession name=session .send_rtp_src \ + * ! udpsink port=5000 session.send_rtcp_src ! udpsink port=5001 + * ]| Send theora RTP packets through the session manager and out on UDP port + * 5000. Send RTCP packets on port 5001. Note that this pipeline will not preroll + * correctly because the second udpsink will not preroll correctly (no RTCP + * packets are sent in the PAUSED state). Applications should manually set and + * keep (see gst_element_set_locked_state()) the RTCP udpsink to the PLAYING state. + * + * + * Last reviewed on 2007-05-28 (0.10.5) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include + +#include "gstrtpbin-marshal.h" +#include "gstrtpsession.h" +#include "rtpsession.h" + +GST_DEBUG_CATEGORY_STATIC (gst_rtp_session_debug); +#define GST_CAT_DEFAULT gst_rtp_session_debug + +/* sink pads */ +static GstStaticPadTemplate rtpsession_recv_rtp_sink_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtp_sink", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate rtpsession_recv_rtcp_sink_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtcp_sink", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate rtpsession_send_rtp_sink_template = +GST_STATIC_PAD_TEMPLATE ("send_rtp_sink", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtp") + ); + +/* src pads */ +static GstStaticPadTemplate rtpsession_recv_rtp_src_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtp_src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate rtpsession_sync_src_template = +GST_STATIC_PAD_TEMPLATE ("sync_src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate rtpsession_send_rtp_src_template = +GST_STATIC_PAD_TEMPLATE ("send_rtp_src", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate rtpsession_send_rtcp_src_template = +GST_STATIC_PAD_TEMPLATE ("send_rtcp_src", + GST_PAD_SRC, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +/* signals and args */ +enum +{ + SIGNAL_REQUEST_PT_MAP, + SIGNAL_CLEAR_PT_MAP, + + SIGNAL_ON_NEW_SSRC, + SIGNAL_ON_SSRC_COLLISION, + SIGNAL_ON_SSRC_VALIDATED, + SIGNAL_ON_SSRC_ACTIVE, + SIGNAL_ON_SSRC_SDES, + SIGNAL_ON_BYE_SSRC, + SIGNAL_ON_BYE_TIMEOUT, + SIGNAL_ON_TIMEOUT, + SIGNAL_ON_SENDER_TIMEOUT, + LAST_SIGNAL +}; + +#define DEFAULT_NTP_NS_BASE 0 +#define DEFAULT_BANDWIDTH RTP_STATS_BANDWIDTH +#define DEFAULT_RTCP_FRACTION (RTP_STATS_BANDWIDTH * RTP_STATS_RTCP_FRACTION) +#define DEFAULT_RTCP_RR_BANDWIDTH -1 +#define DEFAULT_RTCP_RS_BANDWIDTH -1 +#define DEFAULT_SDES NULL +#define DEFAULT_NUM_SOURCES 0 +#define DEFAULT_NUM_ACTIVE_SOURCES 0 +#define DEFAULT_USE_PIPELINE_CLOCK FALSE +#define DEFAULT_RTCP_MIN_INTERVAL (RTP_STATS_MIN_INTERVAL * GST_SECOND) + +enum +{ + PROP_0, + PROP_NTP_NS_BASE, + PROP_BANDWIDTH, + PROP_RTCP_FRACTION, + PROP_RTCP_RR_BANDWIDTH, + PROP_RTCP_RS_BANDWIDTH, + PROP_SDES, + PROP_NUM_SOURCES, + PROP_NUM_ACTIVE_SOURCES, + PROP_INTERNAL_SESSION, + PROP_USE_PIPELINE_CLOCK, + PROP_RTCP_MIN_INTERVAL, + PROP_LAST +}; + +#define GST_RTP_SESSION_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_RTP_SESSION, GstRtpSessionPrivate)) + +#define GST_RTP_SESSION_LOCK(sess) g_mutex_lock ((sess)->priv->lock) +#define GST_RTP_SESSION_UNLOCK(sess) g_mutex_unlock ((sess)->priv->lock) + +struct _GstRtpSessionPrivate +{ + GMutex *lock; + GstClock *sysclock; + + RTPSession *session; + + /* thread for sending out RTCP */ + GstClockID id; + gboolean stop_thread; + GThread *thread; + gboolean thread_stopped; + + /* caps mapping */ + GHashTable *ptmap; + + /* NTP base time */ + guint64 ntpnsbase; + gboolean use_pipeline_clock; +}; + +/* callbacks to handle actions from the session manager */ +static GstFlowReturn gst_rtp_session_process_rtp (RTPSession * sess, + RTPSource * src, GstBuffer * buffer, gpointer user_data); +static GstFlowReturn gst_rtp_session_send_rtp (RTPSession * sess, + RTPSource * src, gpointer data, gpointer user_data); +static GstFlowReturn gst_rtp_session_send_rtcp (RTPSession * sess, + RTPSource * src, GstBuffer * buffer, gboolean eos, gpointer user_data); +static GstFlowReturn gst_rtp_session_sync_rtcp (RTPSession * sess, + RTPSource * src, GstBuffer * buffer, gpointer user_data); +static gint gst_rtp_session_clock_rate (RTPSession * sess, guint8 payload, + gpointer user_data); +static void gst_rtp_session_reconsider (RTPSession * sess, gpointer user_data); +static void gst_rtp_session_request_key_unit (RTPSession * sess, + gboolean all_headers, gpointer user_data); +static GstClockTime gst_rtp_session_request_time (RTPSession * session, + gpointer user_data); + +static RTPSessionCallbacks callbacks = { + gst_rtp_session_process_rtp, + gst_rtp_session_send_rtp, + gst_rtp_session_sync_rtcp, + gst_rtp_session_send_rtcp, + gst_rtp_session_clock_rate, + gst_rtp_session_reconsider, + gst_rtp_session_request_key_unit, + gst_rtp_session_request_time +}; + +/* GObject vmethods */ +static void gst_rtp_session_finalize (GObject * object); +static void gst_rtp_session_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_session_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +/* GstElement vmethods */ +static GstStateChangeReturn gst_rtp_session_change_state (GstElement * element, + GstStateChange transition); +static GstPad *gst_rtp_session_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_rtp_session_release_pad (GstElement * element, GstPad * pad); + +static void gst_rtp_session_clear_pt_map (GstRtpSession * rtpsession); + +static guint gst_rtp_session_signals[LAST_SIGNAL] = { 0 }; + +static void +on_new_ssrc (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_NEW_SSRC], 0, + src->ssrc); +} + +static void +on_ssrc_collision (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_COLLISION], 0, + src->ssrc); +} + +static void +on_ssrc_validated (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_VALIDATED], 0, + src->ssrc); +} + +static void +on_ssrc_active (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_ACTIVE], 0, + src->ssrc); +} + +static void +on_ssrc_sdes (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + GstStructure *s; + GstMessage *m; + + /* convert the new SDES info into a message */ + RTP_SESSION_LOCK (session); + 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); + + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_SDES], 0, + src->ssrc); +} + +static void +on_bye_ssrc (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_BYE_SSRC], 0, + src->ssrc); +} + +static void +on_bye_timeout (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_BYE_TIMEOUT], 0, + src->ssrc); +} + +static void +on_timeout (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_TIMEOUT], 0, + src->ssrc); +} + +static void +on_sender_timeout (RTPSession * session, RTPSource * src, GstRtpSession * sess) +{ + g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SENDER_TIMEOUT], 0, + src->ssrc); +} + +GST_BOILERPLATE (GstRtpSession, gst_rtp_session, GstElement, GST_TYPE_ELEMENT); + +static void +gst_rtp_session_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + /* sink pads */ + gst_element_class_add_static_pad_template (element_class, + &rtpsession_recv_rtp_sink_template); + gst_element_class_add_static_pad_template (element_class, + &rtpsession_recv_rtcp_sink_template); + gst_element_class_add_static_pad_template (element_class, + &rtpsession_send_rtp_sink_template); + + /* src pads */ + gst_element_class_add_static_pad_template (element_class, + &rtpsession_recv_rtp_src_template); + gst_element_class_add_static_pad_template (element_class, + &rtpsession_sync_src_template); + gst_element_class_add_static_pad_template (element_class, + &rtpsession_send_rtp_src_template); + gst_element_class_add_static_pad_template (element_class, + &rtpsession_send_rtcp_src_template); + + gst_element_class_set_details_simple (element_class, "RTP Session", + "Filter/Network/RTP", + "Implement an RTP session", "Wim Taymans "); +} + +static void +gst_rtp_session_class_init (GstRtpSessionClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + g_type_class_add_private (klass, sizeof (GstRtpSessionPrivate)); + + gobject_class->finalize = gst_rtp_session_finalize; + gobject_class->set_property = gst_rtp_session_set_property; + gobject_class->get_property = gst_rtp_session_get_property; + + /** + * GstRtpSession::request-pt-map: + * @sess: the object which received the signal + * @pt: the pt + * + * Request the payload type as #GstCaps for @pt. + */ + gst_rtp_session_signals[SIGNAL_REQUEST_PT_MAP] = + g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, request_pt_map), + NULL, NULL, gst_rtp_bin_marshal_BOXED__UINT, GST_TYPE_CAPS, 1, + G_TYPE_UINT); + /** + * GstRtpSession::clear-pt-map: + * @sess: the object which received the signal + * + * Clear the cached pt-maps requested with #GstRtpSession::request-pt-map. + */ + gst_rtp_session_signals[SIGNAL_CLEAR_PT_MAP] = + g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpSessionClass, clear_pt_map), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + * GstRtpSession::on-new-ssrc: + * @sess: the object which received the signal + * @ssrc: the SSRC + * + * Notify of a new SSRC that entered @session. + */ + gst_rtp_session_signals[SIGNAL_ON_NEW_SSRC] = + g_signal_new ("on-new-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_new_ssrc), + NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); + /** + * GstRtpSession::on-ssrc_collision: + * @sess: the object which received the signal + * @ssrc: the SSRC + * + * Notify when we have an SSRC collision + */ + gst_rtp_session_signals[SIGNAL_ON_SSRC_COLLISION] = + g_signal_new ("on-ssrc-collision", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, + on_ssrc_collision), NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + /** + * GstRtpSession::on-ssrc_validated: + * @sess: the object which received the signal + * @ssrc: the SSRC + * + * Notify of a new SSRC that became validated. + */ + gst_rtp_session_signals[SIGNAL_ON_SSRC_VALIDATED] = + g_signal_new ("on-ssrc-validated", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, + on_ssrc_validated), NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + /** + * GstRtpSession::on-ssrc_active: + * @sess: the object which received the signal + * @ssrc: the SSRC + * + * Notify of a SSRC that is active, i.e., sending RTCP. + */ + gst_rtp_session_signals[SIGNAL_ON_SSRC_ACTIVE] = + g_signal_new ("on-ssrc-active", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, + on_ssrc_active), NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + /** + * GstRtpSession::on-ssrc-sdes: + * @session: the object which received the signal + * @src: the SSRC + * + * Notify that a new SDES was received for SSRC. + */ + gst_rtp_session_signals[SIGNAL_ON_SSRC_SDES] = + g_signal_new ("on-ssrc-sdes", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_ssrc_sdes), + NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); + + /** + * GstRtpSession::on-bye-ssrc: + * @sess: the object which received the signal + * @ssrc: the SSRC + * + * Notify of an SSRC that became inactive because of a BYE packet. + */ + gst_rtp_session_signals[SIGNAL_ON_BYE_SSRC] = + g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_bye_ssrc), + NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); + /** + * GstRtpSession::on-bye-timeout: + * @sess: the object which received the signal + * @ssrc: the SSRC + * + * Notify of an SSRC that has timed out because of BYE + */ + gst_rtp_session_signals[SIGNAL_ON_BYE_TIMEOUT] = + g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_bye_timeout), + NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); + /** + * GstRtpSession::on-timeout: + * @sess: the object which received the signal + * @ssrc: the SSRC + * + * Notify of an SSRC that has timed out + */ + gst_rtp_session_signals[SIGNAL_ON_TIMEOUT] = + g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_timeout), + NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); + /** + * GstRtpSession::on-sender-timeout: + * @sess: the object which received the signal + * @ssrc: the SSRC + * + * Notify of a sender SSRC that has timed out and became a receiver + */ + gst_rtp_session_signals[SIGNAL_ON_SENDER_TIMEOUT] = + g_signal_new ("on-sender-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, + on_sender_timeout), NULL, NULL, g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + + g_object_class_install_property (gobject_class, PROP_NTP_NS_BASE, + g_param_spec_uint64 ("ntp-ns-base", "NTP base time", + "The NTP base time corresponding to running_time 0 (deprecated)", 0, + G_MAXUINT64, DEFAULT_NTP_NS_BASE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_BANDWIDTH, + g_param_spec_double ("bandwidth", "Bandwidth", + "The bandwidth of the session in bytes per second (0 for auto-discover)", + 0.0, G_MAXDOUBLE, DEFAULT_BANDWIDTH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_FRACTION, + g_param_spec_double ("rtcp-fraction", "RTCP Fraction", + "The RTCP bandwidth of the session in bytes per second " + "(or as a real fraction of the RTP bandwidth if < 1.0)", + 0.0, G_MAXDOUBLE, DEFAULT_RTCP_FRACTION, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_RR_BANDWIDTH, + g_param_spec_int ("rtcp-rr-bandwidth", "RTCP RR bandwidth", + "The RTCP bandwidth used for receivers in bytes per second (-1 = default)", + -1, G_MAXINT, DEFAULT_RTCP_RR_BANDWIDTH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_RS_BANDWIDTH, + g_param_spec_int ("rtcp-rs-bandwidth", "RTCP RS bandwidth", + "The RTCP bandwidth used for senders in bytes per second (-1 = default)", + -1, G_MAXINT, DEFAULT_RTCP_RS_BANDWIDTH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_SDES, + g_param_spec_boxed ("sdes", "SDES", + "The SDES items of this session", + GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_NUM_SOURCES, + g_param_spec_uint ("num-sources", "Num Sources", + "The number of sources in the session", 0, G_MAXUINT, + DEFAULT_NUM_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_NUM_ACTIVE_SOURCES, + g_param_spec_uint ("num-active-sources", "Num Active Sources", + "The number of active sources in the session", 0, G_MAXUINT, + DEFAULT_NUM_ACTIVE_SOURCES, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INTERNAL_SESSION, + g_param_spec_object ("internal-session", "Internal Session", + "The internal RTPSession object", RTP_TYPE_SESSION, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_USE_PIPELINE_CLOCK, + g_param_spec_boolean ("use-pipeline-clock", "Use pipeline clock", + "Use the pipeline clock to set the NTP time in the RTCP SR messages", + DEFAULT_USE_PIPELINE_CLOCK, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_MIN_INTERVAL, + g_param_spec_uint64 ("rtcp-min-interval", "Minimum RTCP interval", + "Minimum interval between Regular RTCP packet (in ns)", + 0, G_MAXUINT64, DEFAULT_RTCP_MIN_INTERVAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_rtp_session_change_state); + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_rtp_session_request_new_pad); + gstelement_class->release_pad = + GST_DEBUG_FUNCPTR (gst_rtp_session_release_pad); + + klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_session_clear_pt_map); + + GST_DEBUG_CATEGORY_INIT (gst_rtp_session_debug, + "rtpsession", 0, "RTP Session"); +} + +static void +gst_rtp_session_init (GstRtpSession * rtpsession, GstRtpSessionClass * klass) +{ + rtpsession->priv = GST_RTP_SESSION_GET_PRIVATE (rtpsession); + rtpsession->priv->lock = g_mutex_new (); + rtpsession->priv->sysclock = gst_system_clock_obtain (); + rtpsession->priv->session = rtp_session_new (); + rtpsession->priv->use_pipeline_clock = DEFAULT_USE_PIPELINE_CLOCK; + + /* configure callbacks */ + rtp_session_set_callbacks (rtpsession->priv->session, &callbacks, rtpsession); + /* configure signals */ + g_signal_connect (rtpsession->priv->session, "on-new-ssrc", + (GCallback) on_new_ssrc, rtpsession); + g_signal_connect (rtpsession->priv->session, "on-ssrc-collision", + (GCallback) on_ssrc_collision, rtpsession); + g_signal_connect (rtpsession->priv->session, "on-ssrc-validated", + (GCallback) on_ssrc_validated, rtpsession); + g_signal_connect (rtpsession->priv->session, "on-ssrc-active", + (GCallback) on_ssrc_active, rtpsession); + g_signal_connect (rtpsession->priv->session, "on-ssrc-sdes", + (GCallback) on_ssrc_sdes, rtpsession); + g_signal_connect (rtpsession->priv->session, "on-bye-ssrc", + (GCallback) on_bye_ssrc, rtpsession); + g_signal_connect (rtpsession->priv->session, "on-bye-timeout", + (GCallback) on_bye_timeout, rtpsession); + g_signal_connect (rtpsession->priv->session, "on-timeout", + (GCallback) on_timeout, rtpsession); + g_signal_connect (rtpsession->priv->session, "on-sender-timeout", + (GCallback) on_sender_timeout, rtpsession); + rtpsession->priv->ptmap = g_hash_table_new_full (NULL, NULL, NULL, + (GDestroyNotify) gst_caps_unref); + + gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED); + gst_segment_init (&rtpsession->send_rtp_seg, GST_FORMAT_UNDEFINED); + + rtpsession->priv->thread_stopped = TRUE; +} + +static void +gst_rtp_session_finalize (GObject * object) +{ + GstRtpSession *rtpsession; + + rtpsession = GST_RTP_SESSION (object); + + g_hash_table_destroy (rtpsession->priv->ptmap); + g_mutex_free (rtpsession->priv->lock); + g_object_unref (rtpsession->priv->sysclock); + g_object_unref (rtpsession->priv->session); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_rtp_session_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRtpSession *rtpsession; + GstRtpSessionPrivate *priv; + + rtpsession = GST_RTP_SESSION (object); + priv = rtpsession->priv; + + switch (prop_id) { + case PROP_NTP_NS_BASE: + GST_OBJECT_LOCK (rtpsession); + priv->ntpnsbase = g_value_get_uint64 (value); + GST_DEBUG_OBJECT (rtpsession, "setting NTP base to %" GST_TIME_FORMAT, + GST_TIME_ARGS (priv->ntpnsbase)); + GST_OBJECT_UNLOCK (rtpsession); + break; + case PROP_BANDWIDTH: + g_object_set_property (G_OBJECT (priv->session), "bandwidth", value); + break; + case PROP_RTCP_FRACTION: + g_object_set_property (G_OBJECT (priv->session), "rtcp-fraction", value); + break; + case PROP_RTCP_RR_BANDWIDTH: + g_object_set_property (G_OBJECT (priv->session), "rtcp-rr-bandwidth", + value); + break; + case PROP_RTCP_RS_BANDWIDTH: + g_object_set_property (G_OBJECT (priv->session), "rtcp-rs-bandwidth", + value); + break; + case PROP_SDES: + rtp_session_set_sdes_struct (priv->session, g_value_get_boxed (value)); + break; + case PROP_USE_PIPELINE_CLOCK: + priv->use_pipeline_clock = g_value_get_boolean (value); + break; + case PROP_RTCP_MIN_INTERVAL: + g_object_set_property (G_OBJECT (priv->session), "rtcp-min-interval", + value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_session_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstRtpSession *rtpsession; + GstRtpSessionPrivate *priv; + + rtpsession = GST_RTP_SESSION (object); + priv = rtpsession->priv; + + switch (prop_id) { + case PROP_NTP_NS_BASE: + GST_OBJECT_LOCK (rtpsession); + g_value_set_uint64 (value, priv->ntpnsbase); + GST_OBJECT_UNLOCK (rtpsession); + break; + case PROP_BANDWIDTH: + g_object_get_property (G_OBJECT (priv->session), "bandwidth", value); + break; + case PROP_RTCP_FRACTION: + g_object_get_property (G_OBJECT (priv->session), "rtcp-fraction", value); + break; + case PROP_RTCP_RR_BANDWIDTH: + g_object_get_property (G_OBJECT (priv->session), "rtcp-rr-bandwidth", + value); + break; + case PROP_RTCP_RS_BANDWIDTH: + g_object_get_property (G_OBJECT (priv->session), "rtcp-rs-bandwidth", + value); + break; + case PROP_SDES: + g_value_take_boxed (value, rtp_session_get_sdes_struct (priv->session)); + break; + case PROP_NUM_SOURCES: + g_value_set_uint (value, rtp_session_get_num_sources (priv->session)); + break; + case PROP_NUM_ACTIVE_SOURCES: + g_value_set_uint (value, + rtp_session_get_num_active_sources (priv->session)); + break; + case PROP_INTERNAL_SESSION: + g_value_set_object (value, priv->session); + break; + case PROP_USE_PIPELINE_CLOCK: + g_value_set_boolean (value, priv->use_pipeline_clock); + break; + case PROP_RTCP_MIN_INTERVAL: + g_object_get_property (G_OBJECT (priv->session), "rtcp-min-interval", + value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +get_current_times (GstRtpSession * rtpsession, GstClockTime * running_time, + guint64 * ntpnstime) +{ + guint64 ntpns; + GstClock *clock; + GstClockTime base_time, rt, clock_time; + + GST_OBJECT_LOCK (rtpsession); + if ((clock = GST_ELEMENT_CLOCK (rtpsession))) { + base_time = GST_ELEMENT_CAST (rtpsession)->base_time; + gst_object_ref (clock); + GST_OBJECT_UNLOCK (rtpsession); + + clock_time = gst_clock_get_time (clock); + + if (rtpsession->priv->use_pipeline_clock) { + ntpns = clock_time; + } else { + GTimeVal current; + + /* get current NTP time */ + g_get_current_time (¤t); + ntpns = GST_TIMEVAL_TO_TIME (current); + } + + /* add constant to convert from 1970 based time to 1900 based time */ + ntpns += (2208988800LL * GST_SECOND); + + /* get current clock time and convert to running time */ + rt = clock_time - base_time; + + gst_object_unref (clock); + } else { + GST_OBJECT_UNLOCK (rtpsession); + rt = -1; + ntpns = -1; + } + if (running_time) + *running_time = rt; + if (ntpnstime) + *ntpnstime = ntpns; +} + +static void +rtcp_thread (GstRtpSession * rtpsession) +{ + GstClockID id; + GstClockTime current_time; + GstClockTime next_timeout; + guint64 ntpnstime; + GstClockTime running_time; + RTPSession *session; + GstClock *sysclock; + + GST_DEBUG_OBJECT (rtpsession, "entering RTCP thread"); + + GST_RTP_SESSION_LOCK (rtpsession); + + sysclock = rtpsession->priv->sysclock; + current_time = gst_clock_get_time (sysclock); + + session = rtpsession->priv->session; + + GST_DEBUG_OBJECT (rtpsession, "starting at %" GST_TIME_FORMAT, + GST_TIME_ARGS (current_time)); + session->start_time = current_time; + + while (!rtpsession->priv->stop_thread) { + GstClockReturn res; + + /* get initial estimate */ + next_timeout = rtp_session_next_timeout (session, current_time); + + GST_DEBUG_OBJECT (rtpsession, "next check time %" GST_TIME_FORMAT, + GST_TIME_ARGS (next_timeout)); + + /* leave if no more timeouts, the session ended */ + if (next_timeout == GST_CLOCK_TIME_NONE) + break; + + id = rtpsession->priv->id = + gst_clock_new_single_shot_id (sysclock, next_timeout); + GST_RTP_SESSION_UNLOCK (rtpsession); + + res = gst_clock_id_wait (id, NULL); + + GST_RTP_SESSION_LOCK (rtpsession); + gst_clock_id_unref (id); + rtpsession->priv->id = NULL; + + if (rtpsession->priv->stop_thread) + break; + + /* update current time */ + current_time = gst_clock_get_time (sysclock); + + /* get current NTP time */ + get_current_times (rtpsession, &running_time, &ntpnstime); + + /* we get unlocked because we need to perform reconsideration, don't perform + * the timeout but get a new reporting estimate. */ + GST_DEBUG_OBJECT (rtpsession, "unlocked %d, current %" GST_TIME_FORMAT, + res, GST_TIME_ARGS (current_time)); + + /* perform actions, we ignore result. Release lock because it might push. */ + GST_RTP_SESSION_UNLOCK (rtpsession); + rtp_session_on_timeout (session, current_time, ntpnstime, running_time); + GST_RTP_SESSION_LOCK (rtpsession); + } + /* mark the thread as stopped now */ + rtpsession->priv->thread_stopped = TRUE; + GST_RTP_SESSION_UNLOCK (rtpsession); + + GST_DEBUG_OBJECT (rtpsession, "leaving RTCP thread"); +} + +static gboolean +start_rtcp_thread (GstRtpSession * rtpsession) +{ + GError *error = NULL; + gboolean res; + + GST_DEBUG_OBJECT (rtpsession, "starting RTCP thread"); + + GST_RTP_SESSION_LOCK (rtpsession); + rtpsession->priv->stop_thread = FALSE; + if (rtpsession->priv->thread_stopped) { + /* if the thread stopped, and we still have a handle to the thread, join it + * now. We can safely join with the lock held, the thread will not take it + * anymore. */ + if (rtpsession->priv->thread) + g_thread_join (rtpsession->priv->thread); + /* only create a new thread if the old one was stopped. Otherwise we can + * just reuse the currently running one. */ +#if !GLIB_CHECK_VERSION (2, 31, 0) + rtpsession->priv->thread = + g_thread_create ((GThreadFunc) rtcp_thread, rtpsession, TRUE, &error); +#else + rtpsession->priv->thread = g_thread_try_new ("rtpsession-rtcp-thread", + (GThreadFunc) rtcp_thread, rtpsession, &error); +#endif + rtpsession->priv->thread_stopped = FALSE; + } + GST_RTP_SESSION_UNLOCK (rtpsession); + + if (error != NULL) { + res = FALSE; + GST_DEBUG_OBJECT (rtpsession, "failed to start thread, %s", error->message); + g_error_free (error); + } else { + res = TRUE; + } + return res; +} + +static void +stop_rtcp_thread (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "stopping RTCP thread"); + + GST_RTP_SESSION_LOCK (rtpsession); + rtpsession->priv->stop_thread = TRUE; + if (rtpsession->priv->id) + gst_clock_id_unschedule (rtpsession->priv->id); + GST_RTP_SESSION_UNLOCK (rtpsession); +} + +static void +join_rtcp_thread (GstRtpSession * rtpsession) +{ + GST_RTP_SESSION_LOCK (rtpsession); + /* don't try to join when we have no thread */ + if (rtpsession->priv->thread != NULL) { + GST_DEBUG_OBJECT (rtpsession, "joining RTCP thread"); + GST_RTP_SESSION_UNLOCK (rtpsession); + + g_thread_join (rtpsession->priv->thread); + + GST_RTP_SESSION_LOCK (rtpsession); + /* after the join, take the lock and clear the thread structure. The caller + * is supposed to not concurrently call start and join. */ + rtpsession->priv->thread = NULL; + } + GST_RTP_SESSION_UNLOCK (rtpsession); +} + +static GstStateChangeReturn +gst_rtp_session_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn res; + GstRtpSession *rtpsession; + + rtpsession = GST_RTP_SESSION (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; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + case GST_STATE_CHANGE_PAUSED_TO_READY: + /* no need to join yet, we might want to continue later. Also, the + * dataflow could block downstream so that a join could just block + * forever. */ + stop_rtcp_thread (rtpsession); + break; + default: + break; + } + + res = parent_class->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + if (!start_rtcp_thread (rtpsession)) + goto failed_thread; + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + /* downstream is now releasing the dataflow and we can join. */ + join_rtcp_thread (rtpsession); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return res; + + /* ERRORS */ +failed_thread: + { + return GST_STATE_CHANGE_FAILURE; + } +} + +static gboolean +return_true (gpointer key, gpointer value, gpointer user_data) +{ + return TRUE; +} + +static void +gst_rtp_session_clear_pt_map (GstRtpSession * rtpsession) +{ + g_hash_table_foreach_remove (rtpsession->priv->ptmap, return_true, NULL); +} + +/* called when the session manager has an RTP packet or a list of packets + * ready for further processing */ +static GstFlowReturn +gst_rtp_session_process_rtp (RTPSession * sess, RTPSource * src, + GstBuffer * buffer, gpointer user_data) +{ + GstFlowReturn result; + GstRtpSession *rtpsession; + GstPad *rtp_src; + + rtpsession = GST_RTP_SESSION (user_data); + + GST_RTP_SESSION_LOCK (rtpsession); + if ((rtp_src = rtpsession->recv_rtp_src)) + gst_object_ref (rtp_src); + GST_RTP_SESSION_UNLOCK (rtpsession); + + if (rtp_src) { + GST_LOG_OBJECT (rtpsession, "pushing received RTP packet"); + result = gst_pad_push (rtp_src, buffer); + gst_object_unref (rtp_src); + } else { + GST_DEBUG_OBJECT (rtpsession, "dropping received RTP packet"); + gst_buffer_unref (buffer); + result = GST_FLOW_OK; + } + return result; +} + +/* called when the session manager has an RTP packet ready for further + * sending */ +static GstFlowReturn +gst_rtp_session_send_rtp (RTPSession * sess, RTPSource * src, + gpointer data, gpointer user_data) +{ + GstFlowReturn result; + GstRtpSession *rtpsession; + GstPad *rtp_src; + + rtpsession = GST_RTP_SESSION (user_data); + + GST_RTP_SESSION_LOCK (rtpsession); + if ((rtp_src = rtpsession->send_rtp_src)) + gst_object_ref (rtp_src); + GST_RTP_SESSION_UNLOCK (rtpsession); + + if (rtp_src) { + if (GST_IS_BUFFER (data)) { + GST_LOG_OBJECT (rtpsession, "sending RTP packet"); + result = gst_pad_push (rtp_src, GST_BUFFER_CAST (data)); + } else { + GST_LOG_OBJECT (rtpsession, "sending RTP list"); + result = gst_pad_push_list (rtp_src, GST_BUFFER_LIST_CAST (data)); + } + gst_object_unref (rtp_src); + } else { + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); + result = GST_FLOW_OK; + } + return result; +} + +/* called when the session manager has an RTCP packet ready for further + * sending. The eos flag is set when an EOS event should be sent downstream as + * well. */ +static GstFlowReturn +gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src, + GstBuffer * buffer, gboolean eos, gpointer user_data) +{ + GstFlowReturn result; + GstRtpSession *rtpsession; + GstPad *rtcp_src; + + rtpsession = GST_RTP_SESSION (user_data); + + GST_RTP_SESSION_LOCK (rtpsession); + if (rtpsession->priv->stop_thread) + goto stopping; + + if ((rtcp_src = rtpsession->send_rtcp_src)) { + GstCaps *caps; + + /* set rtcp caps on output pad */ + if (!(caps = GST_PAD_CAPS (rtcp_src))) { + caps = gst_caps_new_simple ("application/x-rtcp", NULL); + gst_pad_set_caps (rtcp_src, caps); + } else + gst_caps_ref (caps); + gst_buffer_set_caps (buffer, caps); + gst_caps_unref (caps); + + gst_object_ref (rtcp_src); + GST_RTP_SESSION_UNLOCK (rtpsession); + + GST_LOG_OBJECT (rtpsession, "sending RTCP"); + result = gst_pad_push (rtcp_src, buffer); + + /* we have to send EOS after this packet */ + if (eos) { + GST_LOG_OBJECT (rtpsession, "sending EOS"); + gst_pad_push_event (rtcp_src, gst_event_new_eos ()); + } + gst_object_unref (rtcp_src); + } else { + GST_RTP_SESSION_UNLOCK (rtpsession); + + GST_DEBUG_OBJECT (rtpsession, "not sending RTCP, no output pad"); + gst_buffer_unref (buffer); + result = GST_FLOW_OK; + } + return result; + + /* ERRORS */ +stopping: + { + GST_DEBUG_OBJECT (rtpsession, "we are stopping"); + gst_buffer_unref (buffer); + GST_RTP_SESSION_UNLOCK (rtpsession); + return GST_FLOW_OK; + } +} + +/* called when the session manager has an SR RTCP packet ready for handling + * inter stream synchronisation */ +static GstFlowReturn +gst_rtp_session_sync_rtcp (RTPSession * sess, RTPSource * src, + GstBuffer * buffer, gpointer user_data) +{ + GstFlowReturn result; + GstRtpSession *rtpsession; + GstPad *sync_src; + + rtpsession = GST_RTP_SESSION (user_data); + + GST_RTP_SESSION_LOCK (rtpsession); + if (rtpsession->priv->stop_thread) + goto stopping; + + if ((sync_src = rtpsession->sync_src)) { + GstCaps *caps; + + /* set rtcp caps on output pad */ + if (!(caps = GST_PAD_CAPS (sync_src))) { + caps = gst_caps_new_simple ("application/x-rtcp", NULL); + gst_pad_set_caps (sync_src, caps); + } else + gst_caps_ref (caps); + gst_buffer_set_caps (buffer, caps); + gst_caps_unref (caps); + + gst_object_ref (sync_src); + GST_RTP_SESSION_UNLOCK (rtpsession); + + GST_LOG_OBJECT (rtpsession, "sending Sync RTCP"); + result = gst_pad_push (sync_src, buffer); + gst_object_unref (sync_src); + } else { + GST_RTP_SESSION_UNLOCK (rtpsession); + + GST_DEBUG_OBJECT (rtpsession, "not sending Sync RTCP, no output pad"); + gst_buffer_unref (buffer); + result = GST_FLOW_OK; + } + return result; + + /* ERRORS */ +stopping: + { + GST_DEBUG_OBJECT (rtpsession, "we are stopping"); + gst_buffer_unref (buffer); + GST_RTP_SESSION_UNLOCK (rtpsession); + return GST_FLOW_OK; + } +} + +static void +gst_rtp_session_cache_caps (GstRtpSession * rtpsession, GstCaps * caps) +{ + GstRtpSessionPrivate *priv; + const GstStructure *s; + gint payload; + + priv = rtpsession->priv; + + GST_DEBUG_OBJECT (rtpsession, "parsing caps"); + + s = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (s, "payload", &payload)) + return; + + if (g_hash_table_lookup (priv->ptmap, GINT_TO_POINTER (payload))) + return; + + g_hash_table_insert (priv->ptmap, GINT_TO_POINTER (payload), + gst_caps_ref (caps)); +} + +static GstCaps * +gst_rtp_session_get_caps_for_pt (GstRtpSession * rtpsession, guint payload) +{ + GstCaps *caps = NULL; + GValue args[2] = { {0}, {0} }; + GValue ret = { 0 }; + + GST_RTP_SESSION_LOCK (rtpsession); + caps = g_hash_table_lookup (rtpsession->priv->ptmap, + GINT_TO_POINTER (payload)); + if (caps) { + gst_caps_ref (caps); + goto done; + } + + /* not found in the cache, try to get it with a signal */ + g_value_init (&args[0], GST_TYPE_ELEMENT); + g_value_set_object (&args[0], rtpsession); + g_value_init (&args[1], G_TYPE_UINT); + g_value_set_uint (&args[1], payload); + + g_value_init (&ret, GST_TYPE_CAPS); + g_value_set_boxed (&ret, NULL); + + GST_RTP_SESSION_UNLOCK (rtpsession); + + g_signal_emitv (args, gst_rtp_session_signals[SIGNAL_REQUEST_PT_MAP], 0, + &ret); + + GST_RTP_SESSION_LOCK (rtpsession); + + g_value_unset (&args[0]); + g_value_unset (&args[1]); + caps = (GstCaps *) g_value_dup_boxed (&ret); + g_value_unset (&ret); + if (!caps) + goto no_caps; + + gst_rtp_session_cache_caps (rtpsession, caps); + +done: + GST_RTP_SESSION_UNLOCK (rtpsession); + + return caps; + +no_caps: + { + GST_DEBUG_OBJECT (rtpsession, "could not get caps"); + goto done; + } +} + +/* called when the session manager needs the clock rate */ +static gint +gst_rtp_session_clock_rate (RTPSession * sess, guint8 payload, + gpointer user_data) +{ + gint result = -1; + GstRtpSession *rtpsession; + GstCaps *caps; + const GstStructure *s; + + rtpsession = GST_RTP_SESSION_CAST (user_data); + + caps = gst_rtp_session_get_caps_for_pt (rtpsession, payload); + + if (!caps) + goto done; + + s = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (s, "clock-rate", &result)) + goto no_clock_rate; + + gst_caps_unref (caps); + + GST_DEBUG_OBJECT (rtpsession, "parsed clock-rate %d", result); + +done: + + return result; + + /* ERRORS */ +no_clock_rate: + { + gst_caps_unref (caps); + GST_DEBUG_OBJECT (rtpsession, "No clock-rate in caps!"); + goto done; + } +} + +/* called when the session manager asks us to reconsider the timeout */ +static void +gst_rtp_session_reconsider (RTPSession * sess, gpointer user_data) +{ + GstRtpSession *rtpsession; + + rtpsession = GST_RTP_SESSION_CAST (user_data); + + GST_RTP_SESSION_LOCK (rtpsession); + GST_DEBUG_OBJECT (rtpsession, "unlock timer for reconsideration"); + if (rtpsession->priv->id) + gst_clock_id_unschedule (rtpsession->priv->id); + GST_RTP_SESSION_UNLOCK (rtpsession); +} + +static gboolean +gst_rtp_session_event_recv_rtp_sink (GstPad * pad, GstEvent * event) +{ + GstRtpSession *rtpsession; + gboolean ret = FALSE; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + if (G_UNLIKELY (rtpsession == NULL)) { + gst_event_unref (event); + return FALSE; + } + + GST_DEBUG_OBJECT (rtpsession, "received event %s", + GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED); + ret = gst_pad_push_event (rtpsession->recv_rtp_src, event); + break; + case GST_EVENT_NEWSEGMENT: + { + gboolean update; + gdouble rate, arate; + GstFormat format; + gint64 start, stop, time; + GstSegment *segment; + + segment = &rtpsession->recv_rtp_seg; + + /* the newsegment event is needed to convert the RTP timestamp to + * running_time, which is needed to generate a mapping from RTP to NTP + * timestamps in SR reports */ + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + + GST_DEBUG_OBJECT (rtpsession, + "configured NEWSEGMENT update %d, rate %lf, applied rate %lf, " + "format GST_FORMAT_TIME, " + "%" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT + ", time %" GST_TIME_FORMAT ", accum %" GST_TIME_FORMAT, + update, rate, arate, GST_TIME_ARGS (segment->start), + GST_TIME_ARGS (segment->stop), GST_TIME_ARGS (segment->time), + GST_TIME_ARGS (segment->accum)); + + gst_segment_set_newsegment_full (segment, update, rate, + arate, format, start, stop, time); + + /* push event forward */ + ret = gst_pad_push_event (rtpsession->recv_rtp_src, event); + break; + } + default: + ret = gst_pad_push_event (rtpsession->recv_rtp_src, event); + break; + } + gst_object_unref (rtpsession); + + return ret; + +} + +static gboolean +gst_rtp_session_request_remote_key_unit (GstRtpSession * rtpsession, + guint32 ssrc, guint payload, gboolean all_headers, gint count) +{ + GstCaps *caps; + + caps = gst_rtp_session_get_caps_for_pt (rtpsession, payload); + + if (caps) { + const GstStructure *s = gst_caps_get_structure (caps, 0); + gboolean pli; + gboolean fir; + + pli = gst_structure_has_field (s, "rtcp-fb-nack-pli"); + fir = gst_structure_has_field (s, "rtcp-fb-ccm-fir") && all_headers; + + /* Google Talk uses FIR for repair, so send it even if we just want a + * regular PLI */ + if (!pli && + gst_structure_has_field (s, "rtcp-fb-x-gstreamer-fir-as-repair")) + fir = TRUE; + + gst_caps_unref (caps); + + if (pli || fir) + return rtp_session_request_key_unit (rtpsession->priv->session, ssrc, + gst_clock_get_time (rtpsession->priv->sysclock), fir, count); + } + + return FALSE; +} + +static gboolean +gst_rtp_session_event_recv_rtp_src (GstPad * pad, GstEvent * event) +{ + GstRtpSession *rtpsession; + gboolean forward = TRUE; + gboolean ret = TRUE; + const GstStructure *s; + guint32 ssrc; + guint pt; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + if (G_UNLIKELY (rtpsession == NULL)) { + gst_event_unref (event); + return FALSE; + } + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CUSTOM_UPSTREAM: + s = gst_event_get_structure (event); + if (gst_structure_has_name (s, "GstForceKeyUnit") && + gst_structure_get_uint (s, "ssrc", &ssrc) && + gst_structure_get_uint (s, "payload", &pt)) { + gboolean all_headers = FALSE; + gint count = -1; + + gst_structure_get_boolean (s, "all-headers", &all_headers); + if (gst_structure_get_int (s, "count", &count) && count < 0) + count += G_MAXINT; /* Make sure count is positive if present */ + if (gst_rtp_session_request_remote_key_unit (rtpsession, ssrc, pt, + all_headers, count)) + forward = FALSE; + } + break; + default: + break; + } + + if (forward) + ret = gst_pad_push_event (rtpsession->recv_rtp_sink, event); + + gst_object_unref (rtpsession); + + return ret; +} + + +static GstIterator * +gst_rtp_session_iterate_internal_links (GstPad * pad) +{ + GstRtpSession *rtpsession; + GstPad *otherpad = NULL; + GstIterator *it = NULL; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + if (G_UNLIKELY (rtpsession == NULL)) + return NULL; + + GST_RTP_SESSION_LOCK (rtpsession); + if (pad == rtpsession->recv_rtp_src) { + otherpad = gst_object_ref (rtpsession->recv_rtp_sink); + } else if (pad == rtpsession->recv_rtp_sink) { + otherpad = gst_object_ref (rtpsession->recv_rtp_src); + } else if (pad == rtpsession->send_rtp_src) { + otherpad = gst_object_ref (rtpsession->send_rtp_sink); + } else if (pad == rtpsession->send_rtp_sink) { + otherpad = gst_object_ref (rtpsession->send_rtp_src); + } + GST_RTP_SESSION_UNLOCK (rtpsession); + + if (otherpad) { + it = gst_iterator_new_single (GST_TYPE_PAD, otherpad, + (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); + gst_object_unref (otherpad); + } + + gst_object_unref (rtpsession); + + return it; +} + +static gboolean +gst_rtp_session_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstRtpSession *rtpsession; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + + GST_RTP_SESSION_LOCK (rtpsession); + gst_rtp_session_cache_caps (rtpsession, caps); + GST_RTP_SESSION_UNLOCK (rtpsession); + + gst_object_unref (rtpsession); + + return TRUE; +} + +/* receive a packet from a sender, send it to the RTP session manager and + * forward the packet on the rtp_src pad + */ +static GstFlowReturn +gst_rtp_session_chain_recv_rtp (GstPad * pad, GstBuffer * buffer) +{ + GstRtpSession *rtpsession; + GstRtpSessionPrivate *priv; + GstFlowReturn ret; + GstClockTime current_time, running_time; + GstClockTime timestamp; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + priv = rtpsession->priv; + + GST_LOG_OBJECT (rtpsession, "received RTP packet"); + + /* get NTP time when this packet was captured, this depends on the timestamp. */ + timestamp = GST_BUFFER_TIMESTAMP (buffer); + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + /* convert to running time using the segment values */ + running_time = + gst_segment_to_running_time (&rtpsession->recv_rtp_seg, GST_FORMAT_TIME, + timestamp); + } else { + get_current_times (rtpsession, &running_time, NULL); + } + current_time = gst_clock_get_time (priv->sysclock); + + ret = rtp_session_process_rtp (priv->session, buffer, current_time, + running_time); + if (ret != GST_FLOW_OK) + goto push_error; + +done: + gst_object_unref (rtpsession); + + return ret; + + /* ERRORS */ +push_error: + { + GST_DEBUG_OBJECT (rtpsession, "process returned %s", + gst_flow_get_name (ret)); + goto done; + } +} + +static gboolean +gst_rtp_session_event_recv_rtcp_sink (GstPad * pad, GstEvent * event) +{ + GstRtpSession *rtpsession; + gboolean ret = FALSE; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (rtpsession, "received event %s", + GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + default: + ret = gst_pad_push_event (rtpsession->sync_src, event); + break; + } + gst_object_unref (rtpsession); + + return ret; +} + +/* Receive an RTCP packet from a sender, send it to the RTP session manager and + * forward the SR packets to the sync_src pad. + */ +static GstFlowReturn +gst_rtp_session_chain_recv_rtcp (GstPad * pad, GstBuffer * buffer) +{ + GstRtpSession *rtpsession; + GstRtpSessionPrivate *priv; + GstClockTime current_time; + guint64 ntpnstime; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + priv = rtpsession->priv; + + GST_LOG_OBJECT (rtpsession, "received RTCP packet"); + + current_time = gst_clock_get_time (priv->sysclock); + get_current_times (rtpsession, NULL, &ntpnstime); + + rtp_session_process_rtcp (priv->session, buffer, current_time, ntpnstime); + + gst_object_unref (rtpsession); + + return GST_FLOW_OK; /* always return OK */ +} + +static gboolean +gst_rtp_session_query_send_rtcp_src (GstPad * pad, GstQuery * query) +{ + GstRtpSession *rtpsession; + gboolean ret = FALSE; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (rtpsession, "received QUERY"); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + ret = TRUE; + /* use the defaults for the latency query. */ + gst_query_set_latency (query, FALSE, 0, -1); + break; + default: + /* other queries simply fail for now */ + break; + } + + gst_object_unref (rtpsession); + + return ret; +} + +static gboolean +gst_rtp_session_event_send_rtcp_src (GstPad * pad, GstEvent * event) +{ + GstRtpSession *rtpsession; + gboolean ret = TRUE; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + if (G_UNLIKELY (rtpsession == NULL)) { + gst_event_unref (event); + return FALSE; + } + GST_DEBUG_OBJECT (rtpsession, "received EVENT"); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + case GST_EVENT_LATENCY: + gst_event_unref (event); + ret = TRUE; + break; + default: + /* other events simply fail for now */ + gst_event_unref (event); + ret = FALSE; + break; + } + + gst_object_unref (rtpsession); + return ret; +} + + +static gboolean +gst_rtp_session_event_send_rtp_sink (GstPad * pad, GstEvent * event) +{ + GstRtpSession *rtpsession; + gboolean ret = FALSE; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (rtpsession, "received event"); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_segment_init (&rtpsession->send_rtp_seg, GST_FORMAT_UNDEFINED); + ret = gst_pad_push_event (rtpsession->send_rtp_src, event); + break; + case GST_EVENT_NEWSEGMENT:{ + gboolean update; + gdouble rate, arate; + GstFormat format; + gint64 start, stop, time; + GstSegment *segment; + + segment = &rtpsession->send_rtp_seg; + + /* the newsegment event is needed to convert the RTP timestamp to + * running_time, which is needed to generate a mapping from RTP to NTP + * timestamps in SR reports */ + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + + GST_DEBUG_OBJECT (rtpsession, + "configured NEWSEGMENT update %d, rate %lf, applied rate %lf, " + "format GST_FORMAT_TIME, " + "%" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT + ", time %" GST_TIME_FORMAT ", accum %" GST_TIME_FORMAT, + update, rate, arate, GST_TIME_ARGS (segment->start), + GST_TIME_ARGS (segment->stop), GST_TIME_ARGS (segment->time), + GST_TIME_ARGS (segment->accum)); + + gst_segment_set_newsegment_full (segment, update, rate, + arate, format, start, stop, time); + + /* push event forward */ + ret = gst_pad_push_event (rtpsession->send_rtp_src, event); + break; + } + case GST_EVENT_EOS:{ + GstClockTime current_time; + + /* push downstream FIXME, we are not supposed to leave the session just + * because we stop sending. */ + ret = gst_pad_push_event (rtpsession->send_rtp_src, event); + current_time = gst_clock_get_time (rtpsession->priv->sysclock); + GST_DEBUG_OBJECT (rtpsession, "scheduling BYE message"); + rtp_session_schedule_bye (rtpsession->priv->session, "End of stream", + current_time); + break; + } + default:{ + GstPad *send_rtp_src = NULL; + GST_RTP_SESSION_LOCK (rtpsession); + if (rtpsession->send_rtp_src) + send_rtp_src = gst_object_ref (rtpsession->send_rtp_src); + GST_RTP_SESSION_UNLOCK (rtpsession); + + if (send_rtp_src) { + ret = gst_pad_push_event (send_rtp_src, event); + gst_object_unref (send_rtp_src); + } else + gst_event_unref (event); + + break; + } + } + gst_object_unref (rtpsession); + + return ret; +} + +static GstCaps * +gst_rtp_session_getcaps_send_rtp (GstPad * pad) +{ + GstRtpSession *rtpsession; + GstRtpSessionPrivate *priv; + GstCaps *result; + GstStructure *s1, *s2; + guint ssrc; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + priv = rtpsession->priv; + + ssrc = rtp_session_get_internal_ssrc (priv->session); + + /* we can basically accept anything but we prefer to receive packets with our + * internal SSRC so that we don't have to patch it. Create a structure with + * the SSRC and another one without. */ + s1 = gst_structure_new ("application/x-rtp", "ssrc", G_TYPE_UINT, ssrc, NULL); + s2 = gst_structure_new ("application/x-rtp", NULL); + + result = gst_caps_new_full (s1, s2, NULL); + + GST_DEBUG_OBJECT (rtpsession, "getting caps %" GST_PTR_FORMAT, result); + + gst_object_unref (rtpsession); + + return result; +} + +static gboolean +gst_rtp_session_setcaps_send_rtp (GstPad * pad, GstCaps * caps) +{ + GstRtpSession *rtpsession; + GstRtpSessionPrivate *priv; + GstStructure *s = gst_caps_get_structure (caps, 0); + guint ssrc; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + priv = rtpsession->priv; + + if (gst_structure_get_uint (s, "ssrc", &ssrc)) { + GST_DEBUG_OBJECT (rtpsession, "setting internal SSRC to %08x", ssrc); + rtp_session_set_internal_ssrc (priv->session, ssrc); + } + + gst_object_unref (rtpsession); + + return TRUE; +} + +/* Recieve an RTP packet or a list of packets to be send to the receivers, + * send to RTP session manager and forward to send_rtp_src. + */ +static GstFlowReturn +gst_rtp_session_chain_send_rtp_common (GstPad * pad, gpointer data, + gboolean is_list) +{ + GstRtpSession *rtpsession; + GstRtpSessionPrivate *priv; + GstFlowReturn ret; + GstClockTime timestamp, running_time; + GstClockTime current_time; + + rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); + priv = rtpsession->priv; + + GST_LOG_OBJECT (rtpsession, "received RTP %s", is_list ? "list" : "packet"); + + /* get NTP time when this packet was captured, this depends on the timestamp. */ + if (is_list) { + GstBuffer *buffer = NULL; + + /* All groups in an list have the same timestamp. + * So, just take it from the first group. */ + buffer = gst_buffer_list_get (GST_BUFFER_LIST_CAST (data), 0, 0); + if (buffer) + timestamp = GST_BUFFER_TIMESTAMP (buffer); + else + timestamp = -1; + } else { + timestamp = GST_BUFFER_TIMESTAMP (GST_BUFFER_CAST (data)); + } + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + /* convert to running time using the segment start value. */ + running_time = + gst_segment_to_running_time (&rtpsession->send_rtp_seg, GST_FORMAT_TIME, + timestamp); + } else { + /* no timestamp. */ + running_time = -1; + } + + current_time = gst_clock_get_time (priv->sysclock); + ret = rtp_session_send_rtp (priv->session, data, is_list, current_time, + running_time); + if (ret != GST_FLOW_OK) + goto push_error; + +done: + gst_object_unref (rtpsession); + + return ret; + + /* ERRORS */ +push_error: + { + GST_DEBUG_OBJECT (rtpsession, "process returned %s", + gst_flow_get_name (ret)); + goto done; + } +} + +static GstFlowReturn +gst_rtp_session_chain_send_rtp (GstPad * pad, GstBuffer * buffer) +{ + return gst_rtp_session_chain_send_rtp_common (pad, buffer, FALSE); +} + +static GstFlowReturn +gst_rtp_session_chain_send_rtp_list (GstPad * pad, GstBufferList * list) +{ + return gst_rtp_session_chain_send_rtp_common (pad, list, TRUE); +} + +/* Create sinkpad to receive RTP packets from senders. This will also create a + * srcpad for the RTP packets. + */ +static GstPad * +create_recv_rtp_sink (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "creating RTP sink pad"); + + rtpsession->recv_rtp_sink = + gst_pad_new_from_static_template (&rtpsession_recv_rtp_sink_template, + "recv_rtp_sink"); + gst_pad_set_chain_function (rtpsession->recv_rtp_sink, + gst_rtp_session_chain_recv_rtp); + gst_pad_set_event_function (rtpsession->recv_rtp_sink, + (GstPadEventFunction) gst_rtp_session_event_recv_rtp_sink); + gst_pad_set_setcaps_function (rtpsession->recv_rtp_sink, + gst_rtp_session_sink_setcaps); + gst_pad_set_iterate_internal_links_function (rtpsession->recv_rtp_sink, + gst_rtp_session_iterate_internal_links); + gst_pad_set_active (rtpsession->recv_rtp_sink, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->recv_rtp_sink); + + GST_DEBUG_OBJECT (rtpsession, "creating RTP src pad"); + rtpsession->recv_rtp_src = + gst_pad_new_from_static_template (&rtpsession_recv_rtp_src_template, + "recv_rtp_src"); + gst_pad_set_event_function (rtpsession->recv_rtp_src, + (GstPadEventFunction) gst_rtp_session_event_recv_rtp_src); + gst_pad_set_iterate_internal_links_function (rtpsession->recv_rtp_src, + gst_rtp_session_iterate_internal_links); + gst_pad_use_fixed_caps (rtpsession->recv_rtp_src); + gst_pad_set_active (rtpsession->recv_rtp_src, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->recv_rtp_src); + + return rtpsession->recv_rtp_sink; +} + +/* Remove sinkpad to receive RTP packets from senders. This will also remove + * the srcpad for the RTP packets. + */ +static void +remove_recv_rtp_sink (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "removing RTP sink pad"); + + /* deactivate from source to sink */ + gst_pad_set_active (rtpsession->recv_rtp_src, FALSE); + gst_pad_set_active (rtpsession->recv_rtp_sink, FALSE); + + /* remove pads */ + gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->recv_rtp_sink); + rtpsession->recv_rtp_sink = NULL; + + GST_DEBUG_OBJECT (rtpsession, "removing RTP src pad"); + gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->recv_rtp_src); + rtpsession->recv_rtp_src = NULL; +} + +/* Create a sinkpad to receive RTCP messages from senders, this will also create a + * sync_src pad for the SR packets. + */ +static GstPad * +create_recv_rtcp_sink (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "creating RTCP sink pad"); + + rtpsession->recv_rtcp_sink = + gst_pad_new_from_static_template (&rtpsession_recv_rtcp_sink_template, + "recv_rtcp_sink"); + gst_pad_set_chain_function (rtpsession->recv_rtcp_sink, + gst_rtp_session_chain_recv_rtcp); + gst_pad_set_event_function (rtpsession->recv_rtcp_sink, + (GstPadEventFunction) gst_rtp_session_event_recv_rtcp_sink); + gst_pad_set_iterate_internal_links_function (rtpsession->recv_rtcp_sink, + gst_rtp_session_iterate_internal_links); + gst_pad_set_active (rtpsession->recv_rtcp_sink, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->recv_rtcp_sink); + + GST_DEBUG_OBJECT (rtpsession, "creating sync src pad"); + rtpsession->sync_src = + gst_pad_new_from_static_template (&rtpsession_sync_src_template, + "sync_src"); + gst_pad_set_iterate_internal_links_function (rtpsession->sync_src, + gst_rtp_session_iterate_internal_links); + gst_pad_use_fixed_caps (rtpsession->sync_src); + gst_pad_set_active (rtpsession->sync_src, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->sync_src); + + return rtpsession->recv_rtcp_sink; +} + +static void +remove_recv_rtcp_sink (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "removing RTCP sink pad"); + + gst_pad_set_active (rtpsession->sync_src, FALSE); + gst_pad_set_active (rtpsession->recv_rtcp_sink, FALSE); + + gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->recv_rtcp_sink); + rtpsession->recv_rtcp_sink = NULL; + + GST_DEBUG_OBJECT (rtpsession, "removing sync src pad"); + gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->sync_src); + rtpsession->sync_src = NULL; +} + +/* Create a sinkpad to receive RTP packets for receivers. This will also create a + * send_rtp_src pad. + */ +static GstPad * +create_send_rtp_sink (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "creating pad"); + + rtpsession->send_rtp_sink = + gst_pad_new_from_static_template (&rtpsession_send_rtp_sink_template, + "send_rtp_sink"); + gst_pad_set_chain_function (rtpsession->send_rtp_sink, + gst_rtp_session_chain_send_rtp); + gst_pad_set_chain_list_function (rtpsession->send_rtp_sink, + gst_rtp_session_chain_send_rtp_list); + gst_pad_set_getcaps_function (rtpsession->send_rtp_sink, + gst_rtp_session_getcaps_send_rtp); + gst_pad_set_setcaps_function (rtpsession->send_rtp_sink, + gst_rtp_session_setcaps_send_rtp); + gst_pad_set_event_function (rtpsession->send_rtp_sink, + (GstPadEventFunction) gst_rtp_session_event_send_rtp_sink); + gst_pad_set_iterate_internal_links_function (rtpsession->send_rtp_sink, + gst_rtp_session_iterate_internal_links); + gst_pad_set_active (rtpsession->send_rtp_sink, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->send_rtp_sink); + + rtpsession->send_rtp_src = + gst_pad_new_from_static_template (&rtpsession_send_rtp_src_template, + "send_rtp_src"); + gst_pad_set_iterate_internal_links_function (rtpsession->send_rtp_src, + gst_rtp_session_iterate_internal_links); + gst_pad_set_active (rtpsession->send_rtp_src, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->send_rtp_src); + + return rtpsession->send_rtp_sink; +} + +static void +remove_send_rtp_sink (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "removing pad"); + + gst_pad_set_active (rtpsession->send_rtp_src, FALSE); + gst_pad_set_active (rtpsession->send_rtp_sink, FALSE); + + gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->send_rtp_sink); + rtpsession->send_rtp_sink = NULL; + + gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->send_rtp_src); + rtpsession->send_rtp_src = NULL; +} + +/* Create a srcpad with the RTCP packets to send out. + * This pad will be driven by the RTP session manager when it wants to send out + * RTCP packets. + */ +static GstPad * +create_send_rtcp_src (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "creating pad"); + + rtpsession->send_rtcp_src = + gst_pad_new_from_static_template (&rtpsession_send_rtcp_src_template, + "send_rtcp_src"); + gst_pad_use_fixed_caps (rtpsession->send_rtcp_src); + gst_pad_set_active (rtpsession->send_rtcp_src, TRUE); + gst_pad_set_iterate_internal_links_function (rtpsession->send_rtcp_src, + gst_rtp_session_iterate_internal_links); + gst_pad_set_query_function (rtpsession->send_rtcp_src, + gst_rtp_session_query_send_rtcp_src); + gst_pad_set_event_function (rtpsession->send_rtcp_src, + gst_rtp_session_event_send_rtcp_src); + gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->send_rtcp_src); + + return rtpsession->send_rtcp_src; +} + +static void +remove_send_rtcp_src (GstRtpSession * rtpsession) +{ + GST_DEBUG_OBJECT (rtpsession, "removing pad"); + + gst_pad_set_active (rtpsession->send_rtcp_src, FALSE); + + gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), + rtpsession->send_rtcp_src); + rtpsession->send_rtcp_src = NULL; +} + +static GstPad * +gst_rtp_session_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name) +{ + GstRtpSession *rtpsession; + GstElementClass *klass; + GstPad *result; + + g_return_val_if_fail (templ != NULL, NULL); + g_return_val_if_fail (GST_IS_RTP_SESSION (element), NULL); + + rtpsession = GST_RTP_SESSION (element); + klass = GST_ELEMENT_GET_CLASS (element); + + GST_DEBUG_OBJECT (element, "requesting pad %s", GST_STR_NULL (name)); + + GST_RTP_SESSION_LOCK (rtpsession); + + /* figure out the template */ + if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink")) { + if (rtpsession->recv_rtp_sink != NULL) + goto exists; + + result = create_recv_rtp_sink (rtpsession); + } else if (templ == gst_element_class_get_pad_template (klass, + "recv_rtcp_sink")) { + if (rtpsession->recv_rtcp_sink != NULL) + goto exists; + + result = create_recv_rtcp_sink (rtpsession); + } else if (templ == gst_element_class_get_pad_template (klass, + "send_rtp_sink")) { + if (rtpsession->send_rtp_sink != NULL) + goto exists; + + result = create_send_rtp_sink (rtpsession); + } else if (templ == gst_element_class_get_pad_template (klass, + "send_rtcp_src")) { + if (rtpsession->send_rtcp_src != NULL) + goto exists; + + result = create_send_rtcp_src (rtpsession); + } else + goto wrong_template; + + GST_RTP_SESSION_UNLOCK (rtpsession); + + return result; + + /* ERRORS */ +wrong_template: + { + GST_RTP_SESSION_UNLOCK (rtpsession); + g_warning ("gstrtpsession: this is not our template"); + return NULL; + } +exists: + { + GST_RTP_SESSION_UNLOCK (rtpsession); + g_warning ("gstrtpsession: pad already requested"); + return NULL; + } +} + +static void +gst_rtp_session_release_pad (GstElement * element, GstPad * pad) +{ + GstRtpSession *rtpsession; + + g_return_if_fail (GST_IS_RTP_SESSION (element)); + g_return_if_fail (GST_IS_PAD (pad)); + + rtpsession = GST_RTP_SESSION (element); + + GST_DEBUG_OBJECT (element, "releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad)); + + GST_RTP_SESSION_LOCK (rtpsession); + + if (rtpsession->recv_rtp_sink == pad) { + remove_recv_rtp_sink (rtpsession); + } else if (rtpsession->recv_rtcp_sink == pad) { + remove_recv_rtcp_sink (rtpsession); + } else if (rtpsession->send_rtp_sink == pad) { + remove_send_rtp_sink (rtpsession); + } else if (rtpsession->send_rtcp_src == pad) { + remove_send_rtcp_src (rtpsession); + } else + goto wrong_pad; + + GST_RTP_SESSION_UNLOCK (rtpsession); + + return; + + /* ERRORS */ +wrong_pad: + { + GST_RTP_SESSION_UNLOCK (rtpsession); + g_warning ("gstrtpsession: asked to release an unknown pad"); + return; + } +} + +static void +gst_rtp_session_request_key_unit (RTPSession * sess, + gboolean all_headers, gpointer user_data) +{ + GstRtpSession *rtpsession = GST_RTP_SESSION (user_data); + GstEvent *event; + + event = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, + gst_structure_new ("GstForceKeyUnit", + "all-headers", G_TYPE_BOOLEAN, all_headers, NULL)); + gst_pad_push_event (rtpsession->send_rtp_sink, event); +} + +static GstClockTime +gst_rtp_session_request_time (RTPSession * session, gpointer user_data) +{ + GstRtpSession *rtpsession = GST_RTP_SESSION (user_data); + + return gst_clock_get_time (rtpsession->priv->sysclock); +} diff --git a/gst/rtpmanager/gstrtpsession.h b/gst/rtpmanager/gstrtpsession.h new file mode 100644 index 0000000..bc3feb8 --- /dev/null +++ b/gst/rtpmanager/gstrtpsession.h @@ -0,0 +1,79 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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_RTP_SESSION_H__ +#define __GST_RTP_SESSION_H__ + +#include + +#define GST_TYPE_RTP_SESSION \ + (gst_rtp_session_get_type()) +#define GST_RTP_SESSION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SESSION,GstRtpSession)) +#define GST_RTP_SESSION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SESSION,GstRtpSessionClass)) +#define GST_IS_RTP_SESSION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SESSION)) +#define GST_IS_RTP_SESSION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SESSION)) +#define GST_RTP_SESSION_CAST(obj) ((GstRtpSession *)(obj)) + +typedef struct _GstRtpSession GstRtpSession; +typedef struct _GstRtpSessionClass GstRtpSessionClass; +typedef struct _GstRtpSessionPrivate GstRtpSessionPrivate; + +struct _GstRtpSession { + GstElement element; + + /*< private >*/ + GstPad *recv_rtp_sink; + GstSegment recv_rtp_seg; + GstPad *recv_rtcp_sink; + GstPad *send_rtp_sink; + GstSegment send_rtp_seg; + + GstPad *recv_rtp_src; + GstPad *sync_src; + GstPad *send_rtp_src; + GstPad *send_rtcp_src; + + GstRtpSessionPrivate *priv; +}; + +struct _GstRtpSessionClass { + GstElementClass parent_class; + + /* signals */ + GstCaps* (*request_pt_map) (GstRtpSession *sess, guint pt); + void (*clear_pt_map) (GstRtpSession *sess); + + void (*on_new_ssrc) (GstRtpSession *sess, guint32 ssrc); + void (*on_ssrc_collision) (GstRtpSession *sess, guint32 ssrc); + void (*on_ssrc_validated) (GstRtpSession *sess, guint32 ssrc); + void (*on_ssrc_active) (GstRtpSession *sess, guint32 ssrc); + void (*on_ssrc_sdes) (GstRtpSession *sess, guint32 ssrc); + void (*on_bye_ssrc) (GstRtpSession *sess, guint32 ssrc); + void (*on_bye_timeout) (GstRtpSession *sess, guint32 ssrc); + void (*on_timeout) (GstRtpSession *sess, guint32 ssrc); + void (*on_sender_timeout) (GstRtpSession *sess, guint32 ssrc); +}; + +GType gst_rtp_session_get_type (void); + +#endif /* __GST_RTP_SESSION_H__ */ diff --git a/gst/rtpmanager/gstrtpssrcdemux.c b/gst/rtpmanager/gstrtpssrcdemux.c new file mode 100644 index 0000000..523f9c5 --- /dev/null +++ b/gst/rtpmanager/gstrtpssrcdemux.c @@ -0,0 +1,823 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * RTP SSRC demuxer + * + * 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-gstrtpssrcdemux + * + * gstrtpssrcdemux acts as a demuxer for RTP packets based on the SSRC of the + * packets. Its main purpose is to allow an application to easily receive and + * decode an RTP stream with multiple SSRCs. + * + * For each SSRC that is detected, a new pad will be created and the + * #GstRtpSsrcDemux::new-ssrc-pad signal will be emitted. + * + * + * Example pipelines + * |[ + * gst-launch udpsrc caps="application/x-rtp" ! gstrtpssrcdemux ! fakesink + * ]| Takes an RTP stream and send the RTP packets with the first detected SSRC + * to fakesink, discarding the other SSRCs. + * + * + * Last reviewed on 2007-05-28 (0.10.5) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include +#include + +#include "gstrtpbin-marshal.h" +#include "gstrtpssrcdemux.h" + +GST_DEBUG_CATEGORY_STATIC (gst_rtp_ssrc_demux_debug); +#define GST_CAT_DEFAULT gst_rtp_ssrc_demux_debug + +/* generic templates */ +static GstStaticPadTemplate rtp_ssrc_demux_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate rtp_ssrc_demux_rtcp_sink_template = +GST_STATIC_PAD_TEMPLATE ("rtcp_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate rtp_ssrc_demux_src_template = +GST_STATIC_PAD_TEMPLATE ("src_%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate rtp_ssrc_demux_rtcp_src_template = +GST_STATIC_PAD_TEMPLATE ("rtcp_src_%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +#define GST_PAD_LOCK(obj) (g_static_rec_mutex_lock (&(obj)->padlock)) +#define GST_PAD_UNLOCK(obj) (g_static_rec_mutex_unlock (&(obj)->padlock)) + +/* signals */ +enum +{ + SIGNAL_NEW_SSRC_PAD, + SIGNAL_REMOVED_SSRC_PAD, + SIGNAL_CLEAR_SSRC, + LAST_SIGNAL +}; + +GST_BOILERPLATE (GstRtpSsrcDemux, gst_rtp_ssrc_demux, GstElement, + GST_TYPE_ELEMENT); + + +/* GObject vmethods */ +static void gst_rtp_ssrc_demux_dispose (GObject * object); +static void gst_rtp_ssrc_demux_finalize (GObject * object); + +/* GstElement vmethods */ +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); + +static GstFlowReturn gst_rtp_ssrc_demux_rtcp_chain (GstPad * pad, + GstBuffer * buf); +static gboolean gst_rtp_ssrc_demux_rtcp_sink_event (GstPad * pad, + GstEvent * event); +static GstIterator *gst_rtp_ssrc_demux_iterate_internal_links_sink (GstPad * + pad); + +/* srcpad stuff */ +static gboolean gst_rtp_ssrc_demux_src_event (GstPad * pad, GstEvent * event); +static GstIterator *gst_rtp_ssrc_demux_iterate_internal_links_src (GstPad * + pad); +static gboolean gst_rtp_ssrc_demux_src_query (GstPad * pad, GstQuery * query); + +static guint gst_rtp_ssrc_demux_signals[LAST_SIGNAL] = { 0 }; + +/* + * Item for storing GstPad <-> SSRC pairs. + */ +struct _GstRtpSsrcDemuxPad +{ + guint32 ssrc; + GstPad *rtp_pad; + GstCaps *caps; + GstPad *rtcp_pad; +}; + +/* find a src pad for a given SSRC, returns NULL if the SSRC was not found + */ +static GstRtpSsrcDemuxPad * +find_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc) +{ + GSList *walk; + + for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpSsrcDemuxPad *pad = (GstRtpSsrcDemuxPad *) walk->data; + + if (pad->ssrc == ssrc) + return pad; + } + return NULL; +} + +/* with PAD_LOCK */ +static GstRtpSsrcDemuxPad * +find_or_create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc) +{ + GstPad *rtp_pad, *rtcp_pad; + GstElementClass *klass; + GstPadTemplate *templ; + gchar *padname; + GstRtpSsrcDemuxPad *demuxpad; + + GST_DEBUG_OBJECT (demux, "creating pad for SSRC %08x", ssrc); + + demuxpad = find_demux_pad_for_ssrc (demux, ssrc); + if (demuxpad != NULL) { + return demuxpad; + } + + klass = GST_ELEMENT_GET_CLASS (demux); + templ = gst_element_class_get_pad_template (klass, "src_%d"); + padname = g_strdup_printf ("src_%d", ssrc); + rtp_pad = gst_pad_new_from_template (templ, padname); + g_free (padname); + + templ = gst_element_class_get_pad_template (klass, "rtcp_src_%d"); + padname = g_strdup_printf ("rtcp_src_%d", ssrc); + rtcp_pad = gst_pad_new_from_template (templ, padname); + g_free (padname); + + /* wrap in structure and add to list */ + demuxpad = g_new0 (GstRtpSsrcDemuxPad, 1); + demuxpad->ssrc = ssrc; + demuxpad->rtp_pad = rtp_pad; + demuxpad->rtcp_pad = rtcp_pad; + + gst_pad_set_element_private (rtp_pad, demuxpad); + gst_pad_set_element_private (rtcp_pad, demuxpad); + + demux->srcpads = g_slist_prepend (demux->srcpads, demuxpad); + + /* copy caps from input */ + gst_pad_set_caps (rtp_pad, GST_PAD_CAPS (demux->rtp_sink)); + gst_pad_use_fixed_caps (rtp_pad); + gst_pad_set_caps (rtcp_pad, GST_PAD_CAPS (demux->rtcp_sink)); + gst_pad_use_fixed_caps (rtcp_pad); + + gst_pad_set_event_function (rtp_pad, gst_rtp_ssrc_demux_src_event); + gst_pad_set_query_function (rtp_pad, gst_rtp_ssrc_demux_src_query); + gst_pad_set_iterate_internal_links_function (rtp_pad, + gst_rtp_ssrc_demux_iterate_internal_links_src); + gst_pad_set_active (rtp_pad, TRUE); + + gst_pad_set_event_function (rtcp_pad, gst_rtp_ssrc_demux_src_event); + gst_pad_set_iterate_internal_links_function (rtcp_pad, + gst_rtp_ssrc_demux_iterate_internal_links_src); + gst_pad_set_active (rtcp_pad, TRUE); + + gst_element_add_pad (GST_ELEMENT_CAST (demux), rtp_pad); + gst_element_add_pad (GST_ELEMENT_CAST (demux), rtcp_pad); + + g_signal_emit (G_OBJECT (demux), + gst_rtp_ssrc_demux_signals[SIGNAL_NEW_SSRC_PAD], 0, ssrc, rtp_pad); + + return demuxpad; +} + +static void +gst_rtp_ssrc_demux_base_init (gpointer g_class) +{ + GstElementClass *gstelement_klass = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (gstelement_klass, + &rtp_ssrc_demux_sink_template); + gst_element_class_add_static_pad_template (gstelement_klass, + &rtp_ssrc_demux_rtcp_sink_template); + gst_element_class_add_static_pad_template (gstelement_klass, + &rtp_ssrc_demux_src_template); + gst_element_class_add_static_pad_template (gstelement_klass, + &rtp_ssrc_demux_rtcp_src_template); + + gst_element_class_set_details_simple (gstelement_klass, "RTP SSRC Demux", + "Demux/Network/RTP", + "Splits RTP streams based on the SSRC", + "Wim Taymans "); +} + +static void +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_rtp_ssrc_demux_dispose; + gobject_klass->finalize = gst_rtp_ssrc_demux_finalize; + + /** + * GstRtpSsrcDemux::new-ssrc-pad: + * @demux: the object which received the signal + * @ssrc: the SSRC of the pad + * @pad: the new pad. + * + * Emited when a new SSRC pad has been created. + */ + gst_rtp_ssrc_demux_signals[SIGNAL_NEW_SSRC_PAD] = + g_signal_new ("new-ssrc-pad", + G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstRtpSsrcDemuxClass, new_ssrc_pad), + 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"); +} + +static void +gst_rtp_ssrc_demux_init (GstRtpSsrcDemux * demux, + GstRtpSsrcDemuxClass * g_class) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux); + + demux->rtp_sink = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "sink"), "sink"); + gst_pad_set_chain_function (demux->rtp_sink, gst_rtp_ssrc_demux_chain); + gst_pad_set_event_function (demux->rtp_sink, gst_rtp_ssrc_demux_sink_event); + gst_pad_set_iterate_internal_links_function (demux->rtp_sink, + gst_rtp_ssrc_demux_iterate_internal_links_sink); + gst_element_add_pad (GST_ELEMENT_CAST (demux), demux->rtp_sink); + + demux->rtcp_sink = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "rtcp_sink"), "rtcp_sink"); + gst_pad_set_chain_function (demux->rtcp_sink, gst_rtp_ssrc_demux_rtcp_chain); + gst_pad_set_event_function (demux->rtcp_sink, + gst_rtp_ssrc_demux_rtcp_sink_event); + gst_pad_set_iterate_internal_links_function (demux->rtcp_sink, + gst_rtp_ssrc_demux_iterate_internal_links_sink); + gst_element_add_pad (GST_ELEMENT_CAST (demux), demux->rtcp_sink); + + g_static_rec_mutex_init (&demux->padlock); + + gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); +} + +static void +gst_rtp_ssrc_demux_reset (GstRtpSsrcDemux * demux) +{ + GSList *walk; + + for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpSsrcDemuxPad *dpad = (GstRtpSsrcDemuxPad *) walk->data; + + gst_pad_set_active (dpad->rtp_pad, FALSE); + gst_pad_set_active (dpad->rtcp_pad, FALSE); + + 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); + } + g_slist_free (demux->srcpads); + demux->srcpads = NULL; +} + +static void +gst_rtp_ssrc_demux_dispose (GObject * object) +{ + GstRtpSsrcDemux *demux; + + demux = GST_RTP_SSRC_DEMUX (object); + + gst_rtp_ssrc_demux_reset (demux); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_rtp_ssrc_demux_finalize (GObject * object) +{ + GstRtpSsrcDemux *demux; + + demux = GST_RTP_SSRC_DEMUX (object); + g_static_rec_mutex_free (&demux->padlock); + + 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) { + GST_PAD_UNLOCK (demux); + 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: + { + GST_WARNING_OBJECT (demux, "unknown SSRC %08x", ssrc); + return; + } +} + +static gboolean +gst_rtp_ssrc_demux_sink_event (GstPad * pad, GstEvent * event) +{ + GstRtpSsrcDemux *demux; + gboolean res = FALSE; + + demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); + if (G_UNLIKELY (demux == NULL)) { + gst_event_unref (event); + return FALSE; + } + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); + case GST_EVENT_NEWSEGMENT: + default: + { + GSList *walk; + GSList *pads = NULL; + + res = TRUE; + /* need local snapshot of pads; + * should not push downstream while holding lock as that might deadlock + * with stuff traveling upstream tyring to get this lock while holding + * other (stream)lock */ + GST_PAD_LOCK (demux); + for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpSsrcDemuxPad *pad = (GstRtpSsrcDemuxPad *) walk->data; + + pads = g_slist_prepend (pads, gst_object_ref (pad->rtp_pad)); + } + GST_PAD_UNLOCK (demux); + for (walk = pads; walk; walk = g_slist_next (walk)) { + GstPad *pad = (GstPad *) walk->data; + + gst_event_ref (event); + res &= gst_pad_push_event (pad, event); + gst_object_unref (pad); + } + g_slist_free (pads); + gst_event_unref (event); + break; + } + } + + gst_object_unref (demux); + return res; +} + +static gboolean +gst_rtp_ssrc_demux_rtcp_sink_event (GstPad * pad, GstEvent * event) +{ + GstRtpSsrcDemux *demux; + gboolean res = FALSE; + + demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + default: + { + GSList *walk; + GSList *pads = NULL; + + res = TRUE; + GST_PAD_LOCK (demux); + for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpSsrcDemuxPad *pad = (GstRtpSsrcDemuxPad *) walk->data; + + pads = g_slist_prepend (pads, gst_object_ref (pad->rtcp_pad)); + } + GST_PAD_UNLOCK (demux); + for (walk = pads; walk; walk = g_slist_next (walk)) { + GstPad *pad = (GstPad *) walk->data; + + gst_event_ref (event); + res &= gst_pad_push_event (pad, event); + gst_object_unref (pad); + } + g_slist_free (pads); + gst_event_unref (event); + break; + } + } + gst_object_unref (demux); + return res; +} + +static GstFlowReturn +gst_rtp_ssrc_demux_chain (GstPad * pad, GstBuffer * buf) +{ + GstFlowReturn ret; + GstRtpSsrcDemux *demux; + guint32 ssrc; + GstRtpSsrcDemuxPad *dpad; + GstPad *srcpad; + + demux = GST_RTP_SSRC_DEMUX (GST_OBJECT_PARENT (pad)); + + if (!gst_rtp_buffer_validate (buf)) + goto invalid_payload; + + ssrc = gst_rtp_buffer_get_ssrc (buf); + + GST_DEBUG_OBJECT (demux, "received buffer of SSRC %08x", ssrc); + + GST_PAD_LOCK (demux); + dpad = find_or_create_demux_pad_for_ssrc (demux, ssrc); + if (dpad == NULL) { + GST_PAD_UNLOCK (demux); + goto create_failed; + } + srcpad = gst_object_ref (dpad->rtp_pad); + GST_PAD_UNLOCK (demux); + + /* push to srcpad */ + ret = gst_pad_push (srcpad, buf); + + gst_object_unref (srcpad); + + return ret; + + /* ERRORS */ +invalid_payload: + { + /* this is fatal and should be filtered earlier */ + GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL), + ("Dropping invalid RTP payload")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +create_failed: + { + GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL), + ("Could not create new pad")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_rtp_ssrc_demux_rtcp_chain (GstPad * pad, GstBuffer * buf) +{ + GstFlowReturn ret; + GstRtpSsrcDemux *demux; + guint32 ssrc; + GstRtpSsrcDemuxPad *dpad; + GstRTCPPacket packet; + GstPad *srcpad; + + demux = GST_RTP_SSRC_DEMUX (GST_OBJECT_PARENT (pad)); + + if (!gst_rtcp_buffer_validate (buf)) + goto invalid_rtcp; + + if (!gst_rtcp_buffer_get_first_packet (buf, &packet)) + goto invalid_rtcp; + + /* first packet must be SR or RR or else the validate would have failed */ + switch (gst_rtcp_packet_get_type (&packet)) { + case GST_RTCP_TYPE_SR: + /* get the ssrc so that we can route it to the right source pad */ + gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, NULL, NULL, NULL, + NULL); + break; + default: + goto unexpected_rtcp; + } + + GST_DEBUG_OBJECT (demux, "received RTCP of SSRC %08x", ssrc); + + GST_PAD_LOCK (demux); + dpad = find_or_create_demux_pad_for_ssrc (demux, ssrc); + if (dpad == NULL) { + GST_PAD_UNLOCK (demux); + goto create_failed; + } + srcpad = gst_object_ref (dpad->rtcp_pad); + GST_PAD_UNLOCK (demux); + + /* push to srcpad */ + ret = gst_pad_push (srcpad, buf); + + gst_object_unref (srcpad); + + return ret; + + /* ERRORS */ +invalid_rtcp: + { + /* this is fatal and should be filtered earlier */ + GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL), + ("Dropping invalid RTCP packet")); + 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), + ("Could not create new pad")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_rtp_ssrc_demux_src_event (GstPad * pad, GstEvent * event) +{ + GstRtpSsrcDemux *demux; + const GstStructure *s; + + demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CUSTOM_UPSTREAM: + case GST_EVENT_CUSTOM_BOTH: + case GST_EVENT_CUSTOM_BOTH_OOB: + s = gst_event_get_structure (event); + if (s && !gst_structure_has_field (s, "ssrc")) { + GSList *walk; + + for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { + GstRtpSsrcDemuxPad *dpad = (GstRtpSsrcDemuxPad *) walk->data; + + if (dpad->rtp_pad == pad || dpad->rtcp_pad == pad) { + event = + GST_EVENT_CAST (gst_mini_object_make_writable + (GST_MINI_OBJECT_CAST (event))); + gst_structure_set (event->structure, "ssrc", G_TYPE_UINT, + dpad->ssrc, NULL); + break; + } + } + } + break; + default: + break; + } + + gst_object_unref (demux); + + return gst_pad_event_default (pad, event); +} + +static GstIterator * +gst_rtp_ssrc_demux_iterate_internal_links_src (GstPad * pad) +{ + GstRtpSsrcDemux *demux; + GstPad *otherpad = NULL; + GstIterator *it = NULL; + GSList *current; + + demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); + + if (!demux) + return NULL; + + GST_PAD_LOCK (demux); + for (current = demux->srcpads; current; current = g_slist_next (current)) { + GstRtpSsrcDemuxPad *dpad = (GstRtpSsrcDemuxPad *) current->data; + + if (pad == dpad->rtp_pad) { + otherpad = demux->rtp_sink; + break; + } else if (pad == dpad->rtcp_pad) { + otherpad = demux->rtcp_sink; + break; + } + } + it = gst_iterator_new_single (GST_TYPE_PAD, otherpad, + (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); + GST_PAD_UNLOCK (demux); + + gst_object_unref (demux); + return it; +} + +/* Should return 0 for elements to be included */ +static gint +src_pad_compare_func (gconstpointer a, gconstpointer b) +{ + GstPad *pad = GST_PAD (a); + const gchar *prefix = b; + gint res = 1; + + GST_OBJECT_LOCK (pad); + res = !GST_PAD_NAME (pad) || g_str_has_prefix (GST_PAD_NAME (pad), prefix); + GST_OBJECT_UNLOCK (pad); + + return res; +} + +static GstIterator * +gst_rtp_ssrc_demux_iterate_internal_links_sink (GstPad * pad) +{ + GstRtpSsrcDemux *demux; + GstIterator *it = NULL; + const gchar *prefix = NULL; + + demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); + + if (!demux) + return NULL; + + if (pad == demux->rtp_sink) + prefix = "src_"; + else if (pad == demux->rtcp_sink) + prefix = "rtcp_src_"; + else + g_assert_not_reached (); + + it = gst_element_iterate_src_pads (GST_ELEMENT (demux)); + + it = gst_iterator_filter (it, src_pad_compare_func, (gpointer) prefix); + + gst_object_unref (demux); + return it; +} + + +static gboolean +gst_rtp_ssrc_demux_src_query (GstPad * pad, GstQuery * query) +{ + GstRtpSsrcDemux *demux; + gboolean res = FALSE; + + demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); + if (G_UNLIKELY (demux == NULL)) + return FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + + if ((res = gst_pad_peer_query (demux->rtp_sink, query))) { + gboolean live; + GstClockTime min_latency, max_latency; + GstRtpSsrcDemuxPad *demuxpad; + + demuxpad = gst_pad_get_element_private (pad); + + gst_query_parse_latency (query, &live, &min_latency, &max_latency); + + GST_DEBUG_OBJECT (demux, "peer min latency %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency)); + + GST_DEBUG_OBJECT (demux, "latency for SSRC %08x", demuxpad->ssrc); + + gst_query_set_latency (query, live, min_latency, max_latency); + } + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + gst_object_unref (demux); + + return res; +} + +static GstStateChangeReturn +gst_rtp_ssrc_demux_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret; + GstRtpSsrcDemux *demux; + + demux = GST_RTP_SSRC_DEMUX (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + case GST_STATE_CHANGE_READY_TO_PAUSED: + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + 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_rtp_ssrc_demux_reset (demux); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + default: + break; + } + return ret; +} diff --git a/gst/rtpmanager/gstrtpssrcdemux.h b/gst/rtpmanager/gstrtpssrcdemux.h new file mode 100644 index 0000000..6f792d9 --- /dev/null +++ b/gst/rtpmanager/gstrtpssrcdemux.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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_RTP_SSRC_DEMUX_H__ +#define __GST_RTP_SSRC_DEMUX_H__ + +#include + +#define GST_TYPE_RTP_SSRC_DEMUX (gst_rtp_ssrc_demux_get_type()) +#define GST_RTP_SSRC_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SSRC_DEMUX,GstRtpSsrcDemux)) +#define GST_RTP_SSRC_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SSRC_DEMUX,GstRtpSsrcDemuxClass)) +#define GST_IS_RTP_SSRC_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SSRC_DEMUX)) +#define GST_IS_RTP_SSRC_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SSRC_DEMUX)) + +typedef struct _GstRtpSsrcDemux GstRtpSsrcDemux; +typedef struct _GstRtpSsrcDemuxClass GstRtpSsrcDemuxClass; +typedef struct _GstRtpSsrcDemuxPad GstRtpSsrcDemuxPad; + +struct _GstRtpSsrcDemux +{ + GstElement parent; + + GstSegment segment; + + GstPad *rtp_sink; + GstPad *rtcp_sink; + + GStaticRecMutex padlock; + GSList *srcpads; +}; + +struct _GstRtpSsrcDemuxClass +{ + GstElementClass parent_class; + + /* signals */ + 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); + +#endif /* __GST_RTP_SSRC_DEMUX_H__ */ diff --git a/gst/rtpmanager/rtpjitterbuffer.c b/gst/rtpmanager/rtpjitterbuffer.c new file mode 100644 index 0000000..5db5da4 --- /dev/null +++ b/gst/rtpmanager/rtpjitterbuffer.c @@ -0,0 +1,907 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 +#include + +#include +#include + +#include "rtpjitterbuffer.h" + +GST_DEBUG_CATEGORY_STATIC (rtp_jitter_buffer_debug); +#define GST_CAT_DEFAULT rtp_jitter_buffer_debug + +#define MAX_WINDOW RTP_JITTER_BUFFER_MAX_WINDOW +#define MAX_TIME (2 * GST_SECOND) + +/* signals and args */ +enum +{ + LAST_SIGNAL +}; + +enum +{ + PROP_0 +}; + +/* GObject vmethods */ +static void rtp_jitter_buffer_finalize (GObject * object); + +GType +rtp_jitter_buffer_mode_get_type (void) +{ + static GType jitter_buffer_mode_type = 0; + static const GEnumValue jitter_buffer_modes[] = { + {RTP_JITTER_BUFFER_MODE_NONE, "Only use RTP timestamps", "none"}, + {RTP_JITTER_BUFFER_MODE_SLAVE, "Slave receiver to sender clock", "slave"}, + {RTP_JITTER_BUFFER_MODE_BUFFER, "Do low/high watermark buffering", + "buffer"}, + {0, NULL, NULL}, + }; + + if (!jitter_buffer_mode_type) { + jitter_buffer_mode_type = + g_enum_register_static ("RTPJitterBufferMode", jitter_buffer_modes); + } + return jitter_buffer_mode_type; +} + +/* static guint rtp_jitter_buffer_signals[LAST_SIGNAL] = { 0 }; */ + +G_DEFINE_TYPE (RTPJitterBuffer, rtp_jitter_buffer, G_TYPE_OBJECT); + +static void +rtp_jitter_buffer_class_init (RTPJitterBufferClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = rtp_jitter_buffer_finalize; + + GST_DEBUG_CATEGORY_INIT (rtp_jitter_buffer_debug, "rtpjitterbuffer", 0, + "RTP Jitter Buffer"); +} + +static void +rtp_jitter_buffer_init (RTPJitterBuffer * jbuf) +{ + jbuf->packets = g_queue_new (); + jbuf->mode = RTP_JITTER_BUFFER_MODE_SLAVE; + + rtp_jitter_buffer_reset_skew (jbuf); +} + +static void +rtp_jitter_buffer_finalize (GObject * object) +{ + RTPJitterBuffer *jbuf; + + jbuf = RTP_JITTER_BUFFER_CAST (object); + + rtp_jitter_buffer_flush (jbuf); + g_queue_free (jbuf->packets); + + G_OBJECT_CLASS (rtp_jitter_buffer_parent_class)->finalize (object); +} + +/** + * rtp_jitter_buffer_new: + * + * Create an #RTPJitterBuffer. + * + * Returns: a new #RTPJitterBuffer. Use g_object_unref() after usage. + */ +RTPJitterBuffer * +rtp_jitter_buffer_new (void) +{ + RTPJitterBuffer *jbuf; + + jbuf = g_object_new (RTP_TYPE_JITTER_BUFFER, NULL); + + return jbuf; +} + +/** + * rtp_jitter_buffer_get_mode: + * @jbuf: an #RTPJitterBuffer + * + * Get the current jitterbuffer mode. + * + * Returns: the current jitterbuffer mode. + */ +RTPJitterBufferMode +rtp_jitter_buffer_get_mode (RTPJitterBuffer * jbuf) +{ + return jbuf->mode; +} + +/** + * rtp_jitter_buffer_set_mode: + * @jbuf: an #RTPJitterBuffer + * @mode: a #RTPJitterBufferMode + * + * Set the buffering and clock slaving algorithm used in the @jbuf. + */ +void +rtp_jitter_buffer_set_mode (RTPJitterBuffer * jbuf, RTPJitterBufferMode mode) +{ + jbuf->mode = mode; +} + +GstClockTime +rtp_jitter_buffer_get_delay (RTPJitterBuffer * jbuf) +{ + return jbuf->delay; +} + +void +rtp_jitter_buffer_set_delay (RTPJitterBuffer * jbuf, GstClockTime delay) +{ + jbuf->delay = delay; + jbuf->low_level = (delay * 15) / 100; + /* the high level is at 90% in order to release packets before we fill up the + * buffer up to the latency */ + jbuf->high_level = (delay * 90) / 100; + + GST_DEBUG ("delay %" GST_TIME_FORMAT ", min %" GST_TIME_FORMAT ", max %" + GST_TIME_FORMAT, GST_TIME_ARGS (jbuf->delay), + GST_TIME_ARGS (jbuf->low_level), GST_TIME_ARGS (jbuf->high_level)); +} + + +/** + * rtp_jitter_buffer_reset_skew: + * @jbuf: an #RTPJitterBuffer + * + * Reset the skew calculations in @jbuf. + */ +void +rtp_jitter_buffer_reset_skew (RTPJitterBuffer * jbuf) +{ + jbuf->base_time = -1; + jbuf->base_rtptime = -1; + jbuf->base_extrtp = -1; + jbuf->clock_rate = -1; + jbuf->ext_rtptime = -1; + jbuf->last_rtptime = -1; + jbuf->window_pos = 0; + jbuf->window_filling = TRUE; + jbuf->window_min = 0; + jbuf->skew = 0; + jbuf->prev_send_diff = -1; + jbuf->prev_out_time = -1; + GST_DEBUG ("reset skew correction"); +} + +static void +rtp_jitter_buffer_resync (RTPJitterBuffer * jbuf, GstClockTime time, + GstClockTime gstrtptime, guint64 ext_rtptime, gboolean reset_skew) +{ + jbuf->base_time = time; + jbuf->base_rtptime = gstrtptime; + jbuf->base_extrtp = ext_rtptime; + jbuf->prev_out_time = -1; + jbuf->prev_send_diff = -1; + if (reset_skew) { + jbuf->window_filling = TRUE; + jbuf->window_pos = 0; + jbuf->window_min = 0; + jbuf->window_size = 0; + jbuf->skew = 0; + } +} + +static guint64 +get_buffer_level (RTPJitterBuffer * jbuf) +{ + GstBuffer *high_buf = NULL, *low_buf = NULL; + guint64 level; + GList *find; + + /* first first buffer with timestamp */ + find = g_queue_peek_head_link (jbuf->packets); + while (find) { + high_buf = find->data; + if (GST_BUFFER_TIMESTAMP (high_buf) != -1) + break; + + high_buf = NULL; + find = g_list_next (find); + } + + find = g_queue_peek_tail_link (jbuf->packets); + while (find) { + low_buf = find->data; + if (GST_BUFFER_TIMESTAMP (low_buf) != -1) + break; + + low_buf = NULL; + find = g_list_previous (find); + } + + if (!high_buf || !low_buf || high_buf == low_buf) { + level = 0; + } else { + guint64 high_ts, low_ts; + + high_ts = GST_BUFFER_TIMESTAMP (high_buf); + low_ts = GST_BUFFER_TIMESTAMP (low_buf); + + if (high_ts > low_ts) + level = high_ts - low_ts; + else + level = 0; + + GST_LOG_OBJECT (jbuf, + "low %" GST_TIME_FORMAT " high %" GST_TIME_FORMAT " level %" + G_GUINT64_FORMAT, GST_TIME_ARGS (low_ts), GST_TIME_ARGS (high_ts), + level); + } + return level; +} + +static void +update_buffer_level (RTPJitterBuffer * jbuf, gint * percent) +{ + gboolean post = FALSE; + guint64 level; + + level = get_buffer_level (jbuf); + GST_DEBUG ("buffer level %" GST_TIME_FORMAT, GST_TIME_ARGS (level)); + + if (jbuf->buffering) { + post = TRUE; + if (level > jbuf->high_level) { + GST_DEBUG ("buffering finished"); + jbuf->buffering = FALSE; + } + } else { + if (level < jbuf->low_level) { + GST_DEBUG ("buffering started"); + jbuf->buffering = TRUE; + post = TRUE; + } + } + if (post) { + gint perc; + + if (jbuf->buffering && (jbuf->high_level != 0)) { + perc = (level * 100 / jbuf->high_level); + perc = MIN (perc, 100); + } else { + perc = 100; + } + + if (percent) + *percent = perc; + + GST_DEBUG ("buffering %d", perc); + } +} + +/* For the clock skew we use a windowed low point averaging algorithm as can be + * found in Fober, Orlarey and Letz, 2005, "Real Time Clock Skew Estimation + * over Network Delays": + * http://www.grame.fr/Ressources/pub/TR-050601.pdf + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.1546 + * + * The idea is that the jitter is composed of: + * + * J = N + n + * + * N : a constant network delay. + * n : random added noise. The noise is concentrated around 0 + * + * In the receiver we can track the elapsed time at the sender with: + * + * send_diff(i) = (Tsi - Ts0); + * + * Tsi : The time at the sender at packet i + * Ts0 : The time at the sender at the first packet + * + * This is the difference between the RTP timestamp in the first received packet + * and the current packet. + * + * At the receiver we have to deal with the jitter introduced by the network. + * + * recv_diff(i) = (Tri - Tr0) + * + * Tri : The time at the receiver at packet i + * Tr0 : The time at the receiver at the first packet + * + * Both of these values contain a jitter Ji, a jitter for packet i, so we can + * write: + * + * recv_diff(i) = (Cri + D + ni) - (Cr0 + D + n0)) + * + * Cri : The time of the clock at the receiver for packet i + * D + ni : The jitter when receiving packet i + * + * We see that the network delay is irrelevant here as we can elliminate D: + * + * recv_diff(i) = (Cri + ni) - (Cr0 + n0)) + * + * The drift is now expressed as: + * + * Drift(i) = recv_diff(i) - send_diff(i); + * + * We now keep the W latest values of Drift and find the minimum (this is the + * one with the lowest network jitter and thus the one which is least affected + * by it). We average this lowest value to smooth out the resulting network skew. + * + * Both the window and the weighting used for averaging influence the accuracy + * of the drift estimation. Finding the correct parameters turns out to be a + * compromise between accuracy and inertia. + * + * We use a 2 second window or up to 512 data points, which is statistically big + * enough to catch spikes (FIXME, detect spikes). + * We also use a rather large weighting factor (125) to smoothly adapt. During + * startup, when filling the window, we use a parabolic weighting factor, the + * more the window is filled, the faster we move to the detected possible skew. + * + * Returns: @time adjusted with the clock skew. + */ +static GstClockTime +calculate_skew (RTPJitterBuffer * jbuf, guint32 rtptime, GstClockTime time, + guint32 clock_rate) +{ + guint64 ext_rtptime; + guint64 send_diff, recv_diff; + gint64 delta; + gint64 old; + gint pos, i; + GstClockTime gstrtptime, out_time; + guint64 slope; + + ext_rtptime = gst_rtp_buffer_ext_timestamp (&jbuf->ext_rtptime, rtptime); + + gstrtptime = gst_util_uint64_scale_int (ext_rtptime, GST_SECOND, clock_rate); + + /* keep track of the last extended rtptime */ + jbuf->last_rtptime = ext_rtptime; + + if (jbuf->clock_rate != clock_rate) { + if (jbuf->clock_rate == -1) { + GST_DEBUG ("Clock rate changed from %" G_GUINT32_FORMAT " to %" + G_GUINT32_FORMAT, jbuf->clock_rate, clock_rate); + } else { + GST_WARNING ("Clock rate changed from %" G_GUINT32_FORMAT " to %" + G_GUINT32_FORMAT, jbuf->clock_rate, clock_rate); + } + jbuf->base_time = -1; + jbuf->base_rtptime = -1; + jbuf->clock_rate = clock_rate; + jbuf->prev_out_time = -1; + jbuf->prev_send_diff = -1; + } + + /* first time, lock on to time and gstrtptime */ + if (G_UNLIKELY (jbuf->base_time == -1)) { + jbuf->base_time = time; + jbuf->prev_out_time = -1; + GST_DEBUG ("Taking new base time %" GST_TIME_FORMAT, GST_TIME_ARGS (time)); + } + if (G_UNLIKELY (jbuf->base_rtptime == -1)) { + jbuf->base_rtptime = gstrtptime; + jbuf->base_extrtp = ext_rtptime; + jbuf->prev_send_diff = -1; + GST_DEBUG ("Taking new base rtptime %" GST_TIME_FORMAT, + GST_TIME_ARGS (gstrtptime)); + } + + if (G_LIKELY (gstrtptime >= jbuf->base_rtptime)) + send_diff = gstrtptime - jbuf->base_rtptime; + else if (time != -1) { + /* elapsed time at sender, timestamps can go backwards and thus be smaller + * than our base time, take a new base time in that case. */ + GST_WARNING ("backward timestamps at server, taking new base time"); + rtp_jitter_buffer_resync (jbuf, time, gstrtptime, ext_rtptime, FALSE); + send_diff = 0; + } else { + GST_WARNING ("backward timestamps at server but no timestamps"); + send_diff = 0; + /* at least try to get a new timestamp.. */ + jbuf->base_time = -1; + } + + GST_DEBUG ("extrtp %" G_GUINT64_FORMAT ", gstrtp %" GST_TIME_FORMAT ", base %" + GST_TIME_FORMAT ", send_diff %" GST_TIME_FORMAT, ext_rtptime, + GST_TIME_ARGS (gstrtptime), GST_TIME_ARGS (jbuf->base_rtptime), + GST_TIME_ARGS (send_diff)); + + /* we don't have an arrival timestamp so we can't do skew detection. we + * should still apply a timestamp based on RTP timestamp and base_time */ + if (time == -1 || jbuf->base_time == -1) + goto no_skew; + + /* elapsed time at receiver, includes the jitter */ + recv_diff = time - jbuf->base_time; + + /* measure the diff */ + delta = ((gint64) recv_diff) - ((gint64) send_diff); + + /* measure the slope, this gives a rought estimate between the sender speed + * and the receiver speed. This should be approximately 8, higher values + * indicate a burst (especially when the connection starts) */ + if (recv_diff > 0) + slope = (send_diff * 8) / recv_diff; + else + slope = 8; + + GST_DEBUG ("time %" GST_TIME_FORMAT ", base %" GST_TIME_FORMAT ", recv_diff %" + GST_TIME_FORMAT ", slope %" G_GUINT64_FORMAT, GST_TIME_ARGS (time), + GST_TIME_ARGS (jbuf->base_time), GST_TIME_ARGS (recv_diff), slope); + + /* if the difference between the sender timeline and the receiver timeline + * changed too quickly we have to resync because the server likely restarted + * its timestamps. */ + if (ABS (delta - jbuf->skew) > GST_SECOND) { + GST_WARNING ("delta - skew: %" GST_TIME_FORMAT " too big, reset skew", + GST_TIME_ARGS (delta - jbuf->skew)); + rtp_jitter_buffer_resync (jbuf, time, gstrtptime, ext_rtptime, TRUE); + send_diff = 0; + delta = 0; + } + + pos = jbuf->window_pos; + + if (G_UNLIKELY (jbuf->window_filling)) { + /* we are filling the window */ + GST_DEBUG ("filling %d, delta %" G_GINT64_FORMAT, pos, delta); + jbuf->window[pos++] = delta; + /* calc the min delta we observed */ + if (G_UNLIKELY (pos == 1 || delta < jbuf->window_min)) + jbuf->window_min = delta; + + if (G_UNLIKELY (send_diff >= MAX_TIME || pos >= MAX_WINDOW)) { + jbuf->window_size = pos; + + /* window filled */ + GST_DEBUG ("min %" G_GINT64_FORMAT, jbuf->window_min); + + /* the skew is now the min */ + jbuf->skew = jbuf->window_min; + jbuf->window_filling = FALSE; + } else { + gint perc_time, perc_window, perc; + + /* figure out how much we filled the window, this depends on the amount of + * time we have or the max number of points we keep. */ + perc_time = send_diff * 100 / MAX_TIME; + perc_window = pos * 100 / MAX_WINDOW; + perc = MAX (perc_time, perc_window); + + /* make a parabolic function, the closer we get to the MAX, the more value + * we give to the scaling factor of the new value */ + perc = perc * perc; + + /* quickly go to the min value when we are filling up, slowly when we are + * just starting because we're not sure it's a good value yet. */ + jbuf->skew = + (perc * jbuf->window_min + ((10000 - perc) * jbuf->skew)) / 10000; + jbuf->window_size = pos + 1; + } + } else { + /* pick old value and store new value. We keep the previous value in order + * to quickly check if the min of the window changed */ + old = jbuf->window[pos]; + jbuf->window[pos++] = delta; + + if (G_UNLIKELY (delta <= jbuf->window_min)) { + /* if the new value we inserted is smaller or equal to the current min, + * it becomes the new min */ + jbuf->window_min = delta; + } else if (G_UNLIKELY (old == jbuf->window_min)) { + gint64 min = G_MAXINT64; + + /* if we removed the old min, we have to find a new min */ + for (i = 0; i < jbuf->window_size; i++) { + /* we found another value equal to the old min, we can stop searching now */ + if (jbuf->window[i] == old) { + min = old; + break; + } + if (jbuf->window[i] < min) + min = jbuf->window[i]; + } + jbuf->window_min = min; + } + /* average the min values */ + jbuf->skew = (jbuf->window_min + (124 * jbuf->skew)) / 125; + GST_DEBUG ("delta %" G_GINT64_FORMAT ", new min: %" G_GINT64_FORMAT, + delta, jbuf->window_min); + } + /* wrap around in the window */ + if (G_UNLIKELY (pos >= jbuf->window_size)) + pos = 0; + jbuf->window_pos = pos; + +no_skew: + /* the output time is defined as the base timestamp plus the RTP time + * adjusted for the clock skew .*/ + if (jbuf->base_time != -1) { + out_time = jbuf->base_time + send_diff; + /* skew can be negative and we don't want to make invalid timestamps */ + if (jbuf->skew < 0 && out_time < -jbuf->skew) { + out_time = 0; + } else { + out_time += jbuf->skew; + } + /* check if timestamps are not going backwards, we can only check this if we + * have a previous out time and a previous send_diff */ + if (G_LIKELY (jbuf->prev_out_time != -1 && jbuf->prev_send_diff != -1)) { + /* now check for backwards timestamps */ + if (G_UNLIKELY ( + /* if the server timestamps went up and the out_time backwards */ + (send_diff > jbuf->prev_send_diff + && out_time < jbuf->prev_out_time) || + /* if the server timestamps went backwards and the out_time forwards */ + (send_diff < jbuf->prev_send_diff + && out_time > jbuf->prev_out_time) || + /* if the server timestamps did not change */ + send_diff == jbuf->prev_send_diff)) { + GST_DEBUG ("backwards timestamps, using previous time"); + out_time = jbuf->prev_out_time; + } + } + if (time != -1 && out_time + jbuf->delay < time) { + /* if we are going to produce a timestamp that is later than the input + * timestamp, we need to reset the jitterbuffer. Likely the server paused + * temporarily */ + GST_DEBUG ("out %" GST_TIME_FORMAT " + %" G_GUINT64_FORMAT " < time %" + GST_TIME_FORMAT ", reset jitterbuffer", GST_TIME_ARGS (out_time), + jbuf->delay, GST_TIME_ARGS (time)); + rtp_jitter_buffer_resync (jbuf, time, gstrtptime, ext_rtptime, TRUE); + out_time = time; + send_diff = 0; + } + } else + out_time = -1; + + jbuf->prev_out_time = out_time; + jbuf->prev_send_diff = send_diff; + + GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT, + jbuf->skew, GST_TIME_ARGS (out_time)); + + return out_time; +} + +/** + * rtp_jitter_buffer_insert: + * @jbuf: an #RTPJitterBuffer + * @buf: a buffer + * @time: a running_time when this buffer was received in nanoseconds + * @clock_rate: the clock-rate of the payload of @buf + * @max_delay: the maximum lateness of @buf + * @tail: TRUE when the tail element changed. + * + * Inserts @buf into the packet queue of @jbuf. The sequence number of the + * packet will be used to sort the packets. This function takes ownerhip of + * @buf when the function returns %TRUE. + * @buf should have writable metadata when calling this function. + * + * Returns: %FALSE if a packet with the same number already existed. + */ +gboolean +rtp_jitter_buffer_insert (RTPJitterBuffer * jbuf, GstBuffer * buf, + GstClockTime time, guint32 clock_rate, gboolean * tail, gint * percent) +{ + GList *list; + guint32 rtptime; + guint16 seqnum; + + g_return_val_if_fail (jbuf != NULL, FALSE); + g_return_val_if_fail (buf != NULL, FALSE); + + seqnum = gst_rtp_buffer_get_seq (buf); + + /* loop the list to skip strictly smaller seqnum buffers */ + for (list = jbuf->packets->head; list; list = g_list_next (list)) { + guint16 qseq; + gint gap; + + qseq = gst_rtp_buffer_get_seq (GST_BUFFER_CAST (list->data)); + + /* compare the new seqnum to the one in the buffer */ + gap = gst_rtp_buffer_compare_seqnum (seqnum, qseq); + + /* we hit a packet with the same seqnum, notify a duplicate */ + if (G_UNLIKELY (gap == 0)) + goto duplicate; + + /* seqnum > qseq, we can stop looking */ + if (G_LIKELY (gap < 0)) + break; + } + + rtptime = gst_rtp_buffer_get_timestamp (buf); + /* rtp time jumps are checked for during skew calculation, but bypassed + * in other mode, so mind those here and reset jb if needed. + * Only reset if valid input time, which is likely for UDP input + * where we expect this might happen due to async thread effects + * (in seek and state change cycles), but not so much for TCP input */ + if (GST_CLOCK_TIME_IS_VALID (time) && + jbuf->mode != RTP_JITTER_BUFFER_MODE_SLAVE && + jbuf->base_time != -1 && jbuf->last_rtptime != -1) { + GstClockTime ext_rtptime = jbuf->ext_rtptime; + + ext_rtptime = gst_rtp_buffer_ext_timestamp (&ext_rtptime, rtptime); + if (ext_rtptime > jbuf->last_rtptime + 3 * clock_rate || + ext_rtptime + 3 * clock_rate < jbuf->last_rtptime) { + /* reset even if we don't have valid incoming time; + * still better than producing possibly very bogus output timestamp */ + GST_WARNING ("rtp delta too big, reset skew"); + rtp_jitter_buffer_reset_skew (jbuf); + } + } + + switch (jbuf->mode) { + case RTP_JITTER_BUFFER_MODE_NONE: + case RTP_JITTER_BUFFER_MODE_BUFFER: + /* send 0 as the first timestamp and -1 for the other ones. This will + * interpollate them from the RTP timestamps with a 0 origin. In buffering + * mode we will adjust the outgoing timestamps according to the amount of + * time we spent buffering. */ + if (jbuf->base_time == -1) + time = 0; + else + time = -1; + break; + case RTP_JITTER_BUFFER_MODE_SLAVE: + default: + break; + } + /* do skew calculation by measuring the difference between rtptime and the + * receive time, this function will retimestamp @buf with the skew corrected + * running time. */ + time = calculate_skew (jbuf, rtptime, time, clock_rate); + GST_BUFFER_TIMESTAMP (buf) = time; + + /* It's more likely that the packet was inserted in the front of the buffer */ + if (G_LIKELY (list)) + g_queue_insert_before (jbuf->packets, list, buf); + else + g_queue_push_tail (jbuf->packets, buf); + + /* buffering mode, update buffer stats */ + if (jbuf->mode == RTP_JITTER_BUFFER_MODE_BUFFER) + update_buffer_level (jbuf, percent); + else + *percent = -1; + + /* tail was changed when we did not find a previous packet, we set the return + * flag when requested. */ + if (G_LIKELY (tail)) + *tail = (list == NULL); + + return TRUE; + + /* ERRORS */ +duplicate: + { + GST_WARNING ("duplicate packet %d found", (gint) seqnum); + return FALSE; + } +} + +/** + * rtp_jitter_buffer_pop: + * @jbuf: an #RTPJitterBuffer + * @percent: the buffering percent + * + * Pops the oldest buffer from the packet queue of @jbuf. The popped buffer will + * have its timestamp adjusted with the incomming running_time and the detected + * clock skew. + * + * Returns: a #GstBuffer or %NULL when there was no packet in the queue. + */ +GstBuffer * +rtp_jitter_buffer_pop (RTPJitterBuffer * jbuf, gint * percent) +{ + GstBuffer *buf; + + g_return_val_if_fail (jbuf != NULL, NULL); + + buf = g_queue_pop_tail (jbuf->packets); + + /* buffering mode, update buffer stats */ + if (jbuf->mode == RTP_JITTER_BUFFER_MODE_BUFFER) + update_buffer_level (jbuf, percent); + else + *percent = -1; + + return buf; +} + +/** + * rtp_jitter_buffer_peek: + * @jbuf: an #RTPJitterBuffer + * + * Peek the oldest buffer from the packet queue of @jbuf. Register a callback + * with rtp_jitter_buffer_set_tail_changed() to be notified when an older packet + * was inserted in the queue. + * + * Returns: a #GstBuffer or %NULL when there was no packet in the queue. + */ +GstBuffer * +rtp_jitter_buffer_peek (RTPJitterBuffer * jbuf) +{ + GstBuffer *buf; + + g_return_val_if_fail (jbuf != NULL, NULL); + + buf = g_queue_peek_tail (jbuf->packets); + + return buf; +} + +/** + * rtp_jitter_buffer_flush: + * @jbuf: an #RTPJitterBuffer + * + * Flush all packets from the jitterbuffer. + */ +void +rtp_jitter_buffer_flush (RTPJitterBuffer * jbuf) +{ + GstBuffer *buffer; + + g_return_if_fail (jbuf != NULL); + + while ((buffer = g_queue_pop_head (jbuf->packets))) + gst_buffer_unref (buffer); +} + +/** + * rtp_jitter_buffer_is_buffering: + * @jbuf: an #RTPJitterBuffer + * + * Check if @jbuf is buffering currently. Users of the jitterbuffer should not + * pop packets while in buffering mode. + * + * Returns: the buffering state of @jbuf + */ +gboolean +rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf) +{ + return jbuf->buffering; +} + +/** + * rtp_jitter_buffer_set_buffering: + * @jbuf: an #RTPJitterBuffer + * @buffering: the new buffering state + * + * Forces @jbuf to go into the buffering state. + */ +void +rtp_jitter_buffer_set_buffering (RTPJitterBuffer * jbuf, gboolean buffering) +{ + jbuf->buffering = buffering; +} + +/** + * rtp_jitter_buffer_get_percent: + * @jbuf: an #RTPJitterBuffer + * + * Get the buffering percent of the jitterbuffer. + * + * Returns: the buffering percent + */ +gint +rtp_jitter_buffer_get_percent (RTPJitterBuffer * jbuf) +{ + gint percent; + guint64 level; + + if (G_UNLIKELY (jbuf->high_level == 0)) + return 100; + + level = get_buffer_level (jbuf); + percent = (level * 100 / jbuf->high_level); + percent = MIN (percent, 100); + + return percent; +} + +/** + * rtp_jitter_buffer_num_packets: + * @jbuf: an #RTPJitterBuffer + * + * Get the number of packets currently in "jbuf. + * + * Returns: The number of packets in @jbuf. + */ +guint +rtp_jitter_buffer_num_packets (RTPJitterBuffer * jbuf) +{ + g_return_val_if_fail (jbuf != NULL, 0); + + return jbuf->packets->length; +} + +/** + * rtp_jitter_buffer_get_ts_diff: + * @jbuf: an #RTPJitterBuffer + * + * Get the difference between the timestamps of first and last packet in the + * jitterbuffer. + * + * Returns: The difference expressed in the timestamp units of the packets. + */ +guint32 +rtp_jitter_buffer_get_ts_diff (RTPJitterBuffer * jbuf) +{ + guint64 high_ts, low_ts; + GstBuffer *high_buf, *low_buf; + guint32 result; + + g_return_val_if_fail (jbuf != NULL, 0); + + high_buf = g_queue_peek_head (jbuf->packets); + low_buf = g_queue_peek_tail (jbuf->packets); + + if (!high_buf || !low_buf || high_buf == low_buf) + return 0; + + high_ts = gst_rtp_buffer_get_timestamp (high_buf); + low_ts = gst_rtp_buffer_get_timestamp (low_buf); + + /* it needs to work if ts wraps */ + if (high_ts >= low_ts) { + result = (guint32) (high_ts - low_ts); + } else { + result = (guint32) (high_ts + G_MAXUINT32 + 1 - low_ts); + } + return result; +} + +/** + * rtp_jitter_buffer_get_sync: + * @jbuf: an #RTPJitterBuffer + * @rtptime: result RTP time + * @timestamp: result GStreamer timestamp + * @clock_rate: clock-rate of @rtptime + * @last_rtptime: last seen rtptime. + * + * Calculates the relation between the RTP timestamp and the GStreamer timestamp + * used for constructing timestamps. + * + * For extended RTP timestamp @rtptime with a clock-rate of @clock_rate, + * the GStreamer timestamp is currently @timestamp. + * + * The last seen extended RTP timestamp with clock-rate @clock-rate is returned in + * @last_rtptime. + */ +void +rtp_jitter_buffer_get_sync (RTPJitterBuffer * jbuf, guint64 * rtptime, + guint64 * timestamp, guint32 * clock_rate, guint64 * last_rtptime) +{ + if (rtptime) + *rtptime = jbuf->base_extrtp; + if (timestamp) + *timestamp = jbuf->base_time + jbuf->skew; + if (clock_rate) + *clock_rate = jbuf->clock_rate; + if (last_rtptime) + *last_rtptime = jbuf->last_rtptime; +} diff --git a/gst/rtpmanager/rtpjitterbuffer.h b/gst/rtpmanager/rtpjitterbuffer.h new file mode 100644 index 0000000..85bf977 --- /dev/null +++ b/gst/rtpmanager/rtpjitterbuffer.h @@ -0,0 +1,135 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 __RTP_JITTER_BUFFER_H__ +#define __RTP_JITTER_BUFFER_H__ + +#include +#include + +typedef struct _RTPJitterBuffer RTPJitterBuffer; +typedef struct _RTPJitterBufferClass RTPJitterBufferClass; + +#define RTP_TYPE_JITTER_BUFFER (rtp_jitter_buffer_get_type()) +#define RTP_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_CAST((src),RTP_TYPE_JITTER_BUFFER,RTPJitterBuffer)) +#define RTP_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_JITTER_BUFFER,RTPJitterBufferClass)) +#define RTP_IS_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_TYPE((src),RTP_TYPE_JITTER_BUFFER)) +#define RTP_IS_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_JITTER_BUFFER)) +#define RTP_JITTER_BUFFER_CAST(src) ((RTPJitterBuffer *)(src)) + +/** + * RTPJitterBufferMode: + * + * RTP_JITTER_BUFFER_MODE_NONE: don't do any skew correction, outgoing + * timestamps are calculated directly from the RTP timestamps. This mode is + * good for recording but not for real-time applications. + * RTP_JITTER_BUFFER_MODE_SLAVE: calculate the skew between sender and receiver + * and produce smoothed adjusted outgoing timestamps. This mode is good for + * low latency communications. + * RTP_JITTER_BUFFER_MODE_BUFFER: buffer packets between low/high watermarks. + * This mode is good for streaming communication. + * RTP_JITTER_BUFFER_MODE_LAST: last buffer mode. + * + * The different buffer modes for a jitterbuffer. + */ +typedef enum { + RTP_JITTER_BUFFER_MODE_NONE = 0, + RTP_JITTER_BUFFER_MODE_SLAVE = 1, + RTP_JITTER_BUFFER_MODE_BUFFER = 2, + RTP_JITTER_BUFFER_MODE_LAST +} RTPJitterBufferMode; + +#define RTP_TYPE_JITTER_BUFFER_MODE (rtp_jitter_buffer_mode_get_type()) +GType rtp_jitter_buffer_mode_get_type (void); + +#define RTP_JITTER_BUFFER_MAX_WINDOW 512 +/** + * RTPJitterBuffer: + * + * A JitterBuffer in the #RTPSession + */ +struct _RTPJitterBuffer { + GObject object; + + GQueue *packets; + + RTPJitterBufferMode mode; + + GstClockTime delay; + + /* for buffering */ + gboolean buffering; + guint64 low_level; + guint64 high_level; + + /* for calculating skew */ + GstClockTime base_time; + GstClockTime base_rtptime; + guint32 clock_rate; + GstClockTime base_extrtp; + GstClockTime prev_out_time; + guint64 ext_rtptime; + guint64 last_rtptime; + gint64 window[RTP_JITTER_BUFFER_MAX_WINDOW]; + guint window_pos; + guint window_size; + gboolean window_filling; + gint64 window_min; + gint64 skew; + gint64 prev_send_diff; +}; + +struct _RTPJitterBufferClass { + GObjectClass parent_class; +}; + +GType rtp_jitter_buffer_get_type (void); + +/* managing lifetime */ +RTPJitterBuffer* rtp_jitter_buffer_new (void); + +RTPJitterBufferMode rtp_jitter_buffer_get_mode (RTPJitterBuffer *jbuf); +void rtp_jitter_buffer_set_mode (RTPJitterBuffer *jbuf, RTPJitterBufferMode mode); + +GstClockTime rtp_jitter_buffer_get_delay (RTPJitterBuffer *jbuf); +void rtp_jitter_buffer_set_delay (RTPJitterBuffer *jbuf, GstClockTime delay); + +void rtp_jitter_buffer_reset_skew (RTPJitterBuffer *jbuf); + +gboolean rtp_jitter_buffer_insert (RTPJitterBuffer *jbuf, GstBuffer *buf, + GstClockTime time, + guint32 clock_rate, + gboolean *tail, gint *percent); +GstBuffer * rtp_jitter_buffer_peek (RTPJitterBuffer *jbuf); +GstBuffer * rtp_jitter_buffer_pop (RTPJitterBuffer *jbuf, gint *percent); + +void rtp_jitter_buffer_flush (RTPJitterBuffer *jbuf); + +gboolean rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf); +void rtp_jitter_buffer_set_buffering (RTPJitterBuffer * jbuf, gboolean buffering); +gint rtp_jitter_buffer_get_percent (RTPJitterBuffer * jbuf); + +guint rtp_jitter_buffer_num_packets (RTPJitterBuffer *jbuf); +guint32 rtp_jitter_buffer_get_ts_diff (RTPJitterBuffer *jbuf); + +void rtp_jitter_buffer_get_sync (RTPJitterBuffer *jbuf, guint64 *rtptime, + guint64 *timestamp, guint32 *clock_rate, + guint64 *last_rtptime); + +#endif /* __RTP_JITTER_BUFFER_H__ */ diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c new file mode 100644 index 0000000..9f15bd6 --- /dev/null +++ b/gst/rtpmanager/rtpsession.c @@ -0,0 +1,3447 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * + * 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 + +#include +#include +#include + +#include + +#include "gstrtpbin-marshal.h" +#include "rtpsession.h" + +GST_DEBUG_CATEGORY_STATIC (rtp_session_debug); +#define GST_CAT_DEFAULT rtp_session_debug + +/* signals and args */ +enum +{ + SIGNAL_GET_SOURCE_BY_SSRC, + SIGNAL_ON_NEW_SSRC, + SIGNAL_ON_SSRC_COLLISION, + SIGNAL_ON_SSRC_VALIDATED, + SIGNAL_ON_SSRC_ACTIVE, + SIGNAL_ON_SSRC_SDES, + SIGNAL_ON_BYE_SSRC, + SIGNAL_ON_BYE_TIMEOUT, + SIGNAL_ON_TIMEOUT, + SIGNAL_ON_SENDER_TIMEOUT, + SIGNAL_ON_SENDING_RTCP, + SIGNAL_ON_FEEDBACK_RTCP, + SIGNAL_SEND_RTCP, + LAST_SIGNAL +}; + +#define DEFAULT_INTERNAL_SOURCE NULL +#define DEFAULT_BANDWIDTH RTP_STATS_BANDWIDTH +#define DEFAULT_RTCP_FRACTION (RTP_STATS_RTCP_FRACTION * RTP_STATS_BANDWIDTH) +#define DEFAULT_RTCP_RR_BANDWIDTH -1 +#define DEFAULT_RTCP_RS_BANDWIDTH -1 +#define DEFAULT_RTCP_MTU 1400 +#define DEFAULT_SDES NULL +#define DEFAULT_NUM_SOURCES 0 +#define DEFAULT_NUM_ACTIVE_SOURCES 0 +#define DEFAULT_SOURCES NULL +#define DEFAULT_RTCP_MIN_INTERVAL (RTP_STATS_MIN_INTERVAL * GST_SECOND) +#define DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW (2 * GST_SECOND) +#define DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD (3) + +enum +{ + PROP_0, + PROP_INTERNAL_SSRC, + PROP_INTERNAL_SOURCE, + PROP_BANDWIDTH, + PROP_RTCP_FRACTION, + PROP_RTCP_RR_BANDWIDTH, + PROP_RTCP_RS_BANDWIDTH, + PROP_RTCP_MTU, + PROP_SDES, + PROP_NUM_SOURCES, + PROP_NUM_ACTIVE_SOURCES, + PROP_SOURCES, + PROP_FAVOR_NEW, + PROP_RTCP_MIN_INTERVAL, + PROP_RTCP_FEEDBACK_RETENTION_WINDOW, + PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD, + PROP_LAST +}; + +/* update average packet size */ +#define INIT_AVG(avg, val) \ + (avg) = (val); +#define UPDATE_AVG(avg, val) \ + if ((avg) == 0) \ + (avg) = (val); \ + else \ + (avg) = ((val) + (15 * (avg))) >> 4; + + +/* The number RTCP intervals after which to timeout entries in the + * collision table + */ +#define RTCP_INTERVAL_COLLISION_TIMEOUT 10 + +/* GObject vmethods */ +static void rtp_session_finalize (GObject * object); +static void rtp_session_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void rtp_session_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean rtp_session_on_sending_rtcp (RTPSession * sess, + GstBuffer * buffer, gboolean early); +static void rtp_session_send_rtcp (RTPSession * sess, + GstClockTimeDiff max_delay); + + +static guint rtp_session_signals[LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (RTPSession, rtp_session, G_TYPE_OBJECT); + +static RTPSource *obtain_source (RTPSession * sess, guint32 ssrc, + gboolean * created, RTPArrivalStats * arrival, gboolean rtp); +static GstFlowReturn rtp_session_schedule_bye_locked (RTPSession * sess, + const gchar * reason, GstClockTime current_time); +static GstClockTime calculate_rtcp_interval (RTPSession * sess, + gboolean deterministic, gboolean first); + +static gboolean +accumulate_trues (GSignalInvocationHint * ihint, GValue * return_accu, + const GValue * handler_return, gpointer data) +{ + if (g_value_get_boolean (handler_return)) + g_value_set_boolean (return_accu, TRUE); + + return TRUE; +} + +static void +gst_rtp_bin_marshal_BOOLEAN__MINIOBJECT_BOOLEAN (GClosure * closure, + GValue * return_value G_GNUC_UNUSED, guint n_param_values, + const GValue * param_values, gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__MINIOBJECT_BOOLEAN) (gpointer data1, + gpointer arg_1, gboolean arg_2, gpointer data2); + register GMarshalFunc_BOOLEAN__MINIOBJECT_BOOLEAN callback; + register GCClosure *cc = (GCClosure *) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } else { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = + (GMarshalFunc_BOOLEAN__MINIOBJECT_BOOLEAN) (marshal_data ? marshal_data : + cc->callback); + + v_return = callback (data1, + gst_value_get_mini_object (param_values + 1), + g_value_get_boolean (param_values + 2), data2); + + g_value_set_boolean (return_value, v_return); +} + +static void +gst_rtp_bin_marshal_VOID__UINT_UINT_UINT_UINT_MINIOBJECT (GClosure * closure, + GValue * return_value G_GNUC_UNUSED, guint n_param_values, + const GValue * param_values, gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_UINT_MINIOBJECT) (gpointer + data1, guint arg_1, guint arg_2, guint arg_3, guint arg_4, gpointer arg_5, + gpointer data2); + register GMarshalFunc_VOID__UINT_UINT_UINT_UINT_MINIOBJECT callback; + register GCClosure *cc = (GCClosure *) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 6); + + if (G_CCLOSURE_SWAP_DATA (closure)) { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } else { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = + (GMarshalFunc_VOID__UINT_UINT_UINT_UINT_MINIOBJECT) (marshal_data ? + marshal_data : cc->callback); + + callback (data1, + g_value_get_uint (param_values + 1), + g_value_get_uint (param_values + 2), + g_value_get_uint (param_values + 3), + g_value_get_uint (param_values + 4), + gst_value_get_mini_object (param_values + 5), data2); +} + + +static void +rtp_session_class_init (RTPSessionClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = rtp_session_finalize; + gobject_class->set_property = rtp_session_set_property; + gobject_class->get_property = rtp_session_get_property; + + /** + * RTPSession::get-source-by-ssrc: + * @session: the object which received the signal + * @ssrc: the SSRC of the RTPSource + * + * Request the #RTPSource object with SSRC @ssrc in @session. + */ + rtp_session_signals[SIGNAL_GET_SOURCE_BY_SSRC] = + g_signal_new ("get-source-by-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (RTPSessionClass, + get_source_by_ssrc), NULL, NULL, gst_rtp_bin_marshal_OBJECT__UINT, + RTP_TYPE_SOURCE, 1, G_TYPE_UINT); + + /** + * RTPSession::on-new-ssrc: + * @session: the object which received the signal + * @src: the new RTPSource + * + * Notify of a new SSRC that entered @session. + */ + rtp_session_signals[SIGNAL_ON_NEW_SSRC] = + g_signal_new ("on-new-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_new_ssrc), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + /** + * RTPSession::on-ssrc-collision: + * @session: the object which received the signal + * @src: the #RTPSource that caused a collision + * + * Notify when we have an SSRC collision + */ + rtp_session_signals[SIGNAL_ON_SSRC_COLLISION] = + g_signal_new ("on-ssrc-collision", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_ssrc_collision), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + /** + * RTPSession::on-ssrc-validated: + * @session: the object which received the signal + * @src: the new validated RTPSource + * + * Notify of a new SSRC that became validated. + */ + rtp_session_signals[SIGNAL_ON_SSRC_VALIDATED] = + g_signal_new ("on-ssrc-validated", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_ssrc_validated), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + /** + * RTPSession::on-ssrc-active: + * @session: the object which received the signal + * @src: the active RTPSource + * + * Notify of a SSRC that is active, i.e., sending RTCP. + */ + rtp_session_signals[SIGNAL_ON_SSRC_ACTIVE] = + g_signal_new ("on-ssrc-active", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_ssrc_active), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + /** + * RTPSession::on-ssrc-sdes: + * @session: the object which received the signal + * @src: the RTPSource + * + * Notify that a new SDES was received for SSRC. + */ + rtp_session_signals[SIGNAL_ON_SSRC_SDES] = + g_signal_new ("on-ssrc-sdes", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_ssrc_sdes), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + /** + * RTPSession::on-bye-ssrc: + * @session: the object which received the signal + * @src: the RTPSource that went away + * + * Notify of an SSRC that became inactive because of a BYE packet. + */ + rtp_session_signals[SIGNAL_ON_BYE_SSRC] = + g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_bye_ssrc), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + /** + * RTPSession::on-bye-timeout: + * @session: the object which received the signal + * @src: the RTPSource that timed out + * + * Notify of an SSRC that has timed out because of BYE + */ + rtp_session_signals[SIGNAL_ON_BYE_TIMEOUT] = + g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_bye_timeout), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + /** + * RTPSession::on-timeout: + * @session: the object which received the signal + * @src: the RTPSource that timed out + * + * Notify of an SSRC that has timed out + */ + rtp_session_signals[SIGNAL_ON_TIMEOUT] = + g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_timeout), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + /** + * RTPSession::on-sender-timeout: + * @session: the object which received the signal + * @src: the RTPSource that timed out + * + * Notify of an SSRC that was a sender but timed out and became a receiver. + */ + rtp_session_signals[SIGNAL_ON_SENDER_TIMEOUT] = + g_signal_new ("on-sender-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_sender_timeout), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, + RTP_TYPE_SOURCE); + + /** + * RTPSession::on-sending-rtcp + * @session: the object which received the signal + * @buffer: the #GstBuffer containing the RTCP packet about to be sent + * @early: %TRUE if the packet is early, %FALSE if it is regular + * + * This signal is emitted before sending an RTCP packet, it can be used + * to add extra RTCP Packets. + * + * Returns: %TRUE if the RTCP buffer should NOT be suppressed, %FALSE + * if suppressing it is acceptable + */ + rtp_session_signals[SIGNAL_ON_SENDING_RTCP] = + g_signal_new ("on-sending-rtcp", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_sending_rtcp), + accumulate_trues, NULL, gst_rtp_bin_marshal_BOOLEAN__MINIOBJECT_BOOLEAN, + G_TYPE_BOOLEAN, 2, GST_TYPE_BUFFER, G_TYPE_BOOLEAN); + + /** + * RTPSession::on-feedback-rtcp: + * @session: the object which received the signal + * @type: Type of RTCP packet, will be %GST_RTCP_TYPE_RTPFB or + * %GST_RTCP_TYPE_RTPFB + * @fbtype: The type of RTCP FB packet, probably part of #GstRTCPFBType + * @sender_ssrc: The SSRC of the sender + * @media_ssrc: The SSRC of the media this refers to + * @fci: a #GstBuffer with the FCI data from the FB packet or %NULL if + * there was no FCI + * + * Notify that a RTCP feedback packet has been received + */ + + rtp_session_signals[SIGNAL_ON_FEEDBACK_RTCP] = + g_signal_new ("on-feedback-rtcp", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_feedback_rtcp), + NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT_UINT_UINT_MINIOBJECT, + G_TYPE_NONE, 5, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, + GST_TYPE_BUFFER); + + /** + * RTPSession::send-rtcp: + * @session: the object which received the signal + * @max_delay: The maximum delay after which the feedback will not be useful + * anymore + * + * Requests that the #RTPSession initiate a new RTCP packet as soon as + * possible within the requested delay. + */ + + rtp_session_signals[SIGNAL_SEND_RTCP] = + g_signal_new ("send-rtcp", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (RTPSessionClass, send_rtcp), NULL, NULL, + gst_rtp_bin_marshal_VOID__UINT64, G_TYPE_NONE, 1, G_TYPE_UINT64); + + g_object_class_install_property (gobject_class, PROP_INTERNAL_SSRC, + g_param_spec_uint ("internal-ssrc", "Internal SSRC", + "The internal SSRC used for the session", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INTERNAL_SOURCE, + g_param_spec_object ("internal-source", "Internal Source", + "The internal source element of the session", + RTP_TYPE_SOURCE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_BANDWIDTH, + g_param_spec_double ("bandwidth", "Bandwidth", + "The bandwidth of the session (0 for auto-discover)", + 0.0, G_MAXDOUBLE, DEFAULT_BANDWIDTH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_FRACTION, + g_param_spec_double ("rtcp-fraction", "RTCP Fraction", + "The fraction of the bandwidth used for RTCP (or as a real fraction of the RTP bandwidth if < 1)", + 0.0, G_MAXDOUBLE, DEFAULT_RTCP_FRACTION, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_RR_BANDWIDTH, + g_param_spec_int ("rtcp-rr-bandwidth", "RTCP RR bandwidth", + "The RTCP bandwidth used for receivers in bytes per second (-1 = default)", + -1, G_MAXINT, DEFAULT_RTCP_RR_BANDWIDTH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_RS_BANDWIDTH, + g_param_spec_int ("rtcp-rs-bandwidth", "RTCP RS bandwidth", + "The RTCP bandwidth used for senders in bytes per second (-1 = default)", + -1, G_MAXINT, DEFAULT_RTCP_RS_BANDWIDTH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_MTU, + g_param_spec_uint ("rtcp-mtu", "RTCP MTU", + "The maximum size of the RTCP packets", + 16, G_MAXINT16, DEFAULT_RTCP_MTU, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_SDES, + g_param_spec_boxed ("sdes", "SDES", + "The SDES items of this session", + GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_NUM_SOURCES, + g_param_spec_uint ("num-sources", "Num Sources", + "The number of sources in the session", 0, G_MAXUINT, + DEFAULT_NUM_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_NUM_ACTIVE_SOURCES, + g_param_spec_uint ("num-active-sources", "Num Active Sources", + "The number of active sources in the session", 0, G_MAXUINT, + DEFAULT_NUM_ACTIVE_SOURCES, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + /** + * RTPSource::sources + * + * Get a GValue Array of all sources in the session. + * + * + * Getting the #RTPSources of a session + * <programlisting> + * { + * GValueArray *arr; + * GValue *val; + * guint i; + * + * g_object_get (sess, "sources", &arr, NULL); + * + * for (i = 0; i < arr->n_values; i++) { + * RTPSource *source; + * + * val = g_value_array_get_nth (arr, i); + * source = g_value_get_object (val); + * } + * g_value_array_free (arr); + * } + * </programlisting> + * </example> + */ + g_object_class_install_property (gobject_class, PROP_SOURCES, + g_param_spec_boxed ("sources", "Sources", + "An array of all known sources in the session", + G_TYPE_VALUE_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_FAVOR_NEW, + g_param_spec_boolean ("favor-new", "Favor new sources", + "Resolve SSRC conflict in favor of new sources", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RTCP_MIN_INTERVAL, + g_param_spec_uint64 ("rtcp-min-interval", "Minimum RTCP interval", + "Minimum interval between Regular RTCP packet (in ns)", + 0, G_MAXUINT64, DEFAULT_RTCP_MIN_INTERVAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_RTCP_FEEDBACK_RETENTION_WINDOW, + g_param_spec_uint64 ("rtcp-feedback-retention-window", + "RTCP Feedback retention window", + "Duration during which RTCP Feedback packets are retained (in ns)", + 0, G_MAXUINT64, DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD, + g_param_spec_uint ("rtcp-immediate-feedback-threshold", + "RTCP Immediate Feedback threshold", + "The maximum number of members of a RTP session for which immediate" + " feedback is used", + 0, G_MAXUINT, DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + klass->get_source_by_ssrc = + GST_DEBUG_FUNCPTR (rtp_session_get_source_by_ssrc); + klass->on_sending_rtcp = GST_DEBUG_FUNCPTR (rtp_session_on_sending_rtcp); + klass->send_rtcp = GST_DEBUG_FUNCPTR (rtp_session_send_rtcp); + + GST_DEBUG_CATEGORY_INIT (rtp_session_debug, "rtpsession", 0, "RTP Session"); +} + +static void +rtp_session_init (RTPSession * sess) +{ + gint i; + gchar *str; + + sess->lock = g_mutex_new (); + sess->key = g_random_int (); + sess->mask_idx = 0; + sess->mask = 0; + + for (i = 0; i < 32; i++) { + sess->ssrcs[i] = + g_hash_table_new_full (NULL, NULL, NULL, + (GDestroyNotify) g_object_unref); + } + sess->cnames = g_hash_table_new_full (NULL, NULL, g_free, NULL); + + rtp_stats_init_defaults (&sess->stats); + + sess->recalc_bandwidth = TRUE; + sess->bandwidth = DEFAULT_BANDWIDTH; + sess->rtcp_bandwidth = DEFAULT_RTCP_FRACTION; + sess->rtcp_rr_bandwidth = DEFAULT_RTCP_RR_BANDWIDTH; + sess->rtcp_rs_bandwidth = DEFAULT_RTCP_RS_BANDWIDTH; + + /* create an active SSRC for this session manager */ + sess->source = rtp_session_create_source (sess); + sess->source->validated = TRUE; + sess->source->internal = TRUE; + sess->stats.active_sources++; + INIT_AVG (sess->stats.avg_rtcp_packet_size, 100); + sess->source->stats.prev_rtcptime = 0; + sess->source->stats.last_rtcptime = 1; + + rtp_stats_set_min_interval (&sess->stats, + (gdouble) DEFAULT_RTCP_MIN_INTERVAL / GST_SECOND); + + /* default UDP header length */ + sess->header_len = 28; + sess->mtu = DEFAULT_RTCP_MTU; + + /* some default SDES entries */ + + /* we do not want to leak details like the username or hostname here */ + str = g_strdup_printf ("user%u@host-%x", g_random_int (), g_random_int ()); + rtp_source_set_sdes_string (sess->source, GST_RTCP_SDES_CNAME, str); + g_free (str); + +#if 0 + /* we do not want to leak the user's real name here */ + str = g_strdup_printf ("Anon%u", g_random_int ()); + rtp_source_set_sdes_string (sess->source, GST_RTCP_SDES_NAME, str); + g_free (str); +#endif + + rtp_source_set_sdes_string (sess->source, GST_RTCP_SDES_TOOL, "GStreamer"); + + sess->first_rtcp = TRUE; + sess->allow_early = TRUE; + sess->rtcp_feedback_retention_window = DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW; + sess->rtcp_immediate_feedback_threshold = + DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD; + + sess->last_keyframe_request = GST_CLOCK_TIME_NONE; + + GST_DEBUG ("%p: session using SSRC: %08x", sess, sess->source->ssrc); +} + +static void +rtp_session_finalize (GObject * object) +{ + RTPSession *sess; + gint i; + + sess = RTP_SESSION_CAST (object); + + g_mutex_free (sess->lock); + for (i = 0; i < 32; i++) + g_hash_table_destroy (sess->ssrcs[i]); + + g_free (sess->bye_reason); + + g_hash_table_destroy (sess->cnames); + g_object_unref (sess->source); + + G_OBJECT_CLASS (rtp_session_parent_class)->finalize (object); +} + +static void +copy_source (gpointer key, RTPSource * source, GValueArray * arr) +{ + GValue value = { 0 }; + + g_value_init (&value, RTP_TYPE_SOURCE); + g_value_take_object (&value, source); + /* copies the value */ + g_value_array_append (arr, &value); +} + +static GValueArray * +rtp_session_create_sources (RTPSession * sess) +{ + GValueArray *res; + guint size; + + RTP_SESSION_LOCK (sess); + /* get number of elements in the table */ + size = g_hash_table_size (sess->ssrcs[sess->mask_idx]); + /* create the result value array */ + res = g_value_array_new (size); + + /* and copy all values into the array */ + g_hash_table_foreach (sess->ssrcs[sess->mask_idx], (GHFunc) copy_source, res); + RTP_SESSION_UNLOCK (sess); + + return res; +} + +static void +rtp_session_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + RTPSession *sess; + + sess = RTP_SESSION (object); + + switch (prop_id) { + case PROP_INTERNAL_SSRC: + rtp_session_set_internal_ssrc (sess, g_value_get_uint (value)); + break; + case PROP_BANDWIDTH: + sess->bandwidth = g_value_get_double (value); + sess->recalc_bandwidth = TRUE; + break; + case PROP_RTCP_FRACTION: + sess->rtcp_bandwidth = g_value_get_double (value); + sess->recalc_bandwidth = TRUE; + break; + case PROP_RTCP_RR_BANDWIDTH: + sess->rtcp_rr_bandwidth = g_value_get_int (value); + sess->recalc_bandwidth = TRUE; + break; + case PROP_RTCP_RS_BANDWIDTH: + sess->rtcp_rs_bandwidth = g_value_get_int (value); + sess->recalc_bandwidth = TRUE; + break; + case PROP_RTCP_MTU: + sess->mtu = g_value_get_uint (value); + break; + case PROP_SDES: + rtp_session_set_sdes_struct (sess, g_value_get_boxed (value)); + break; + case PROP_FAVOR_NEW: + sess->favor_new = g_value_get_boolean (value); + break; + case PROP_RTCP_MIN_INTERVAL: + rtp_stats_set_min_interval (&sess->stats, + (gdouble) g_value_get_uint64 (value) / GST_SECOND); + /* trigger reconsideration */ + RTP_SESSION_LOCK (sess); + sess->next_rtcp_check_time = 0; + RTP_SESSION_UNLOCK (sess); + if (sess->callbacks.reconsider) + sess->callbacks.reconsider (sess, sess->reconsider_user_data); + break; + case PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD: + sess->rtcp_immediate_feedback_threshold = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +rtp_session_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + RTPSession *sess; + + sess = RTP_SESSION (object); + + switch (prop_id) { + case PROP_INTERNAL_SSRC: + g_value_set_uint (value, rtp_session_get_internal_ssrc (sess)); + break; + case PROP_INTERNAL_SOURCE: + g_value_take_object (value, rtp_session_get_internal_source (sess)); + break; + case PROP_BANDWIDTH: + g_value_set_double (value, sess->bandwidth); + break; + case PROP_RTCP_FRACTION: + g_value_set_double (value, sess->rtcp_bandwidth); + break; + case PROP_RTCP_RR_BANDWIDTH: + g_value_set_int (value, sess->rtcp_rr_bandwidth); + break; + case PROP_RTCP_RS_BANDWIDTH: + g_value_set_int (value, sess->rtcp_rs_bandwidth); + break; + case PROP_RTCP_MTU: + g_value_set_uint (value, sess->mtu); + break; + case PROP_SDES: + g_value_take_boxed (value, rtp_session_get_sdes_struct (sess)); + break; + case PROP_NUM_SOURCES: + g_value_set_uint (value, rtp_session_get_num_sources (sess)); + break; + case PROP_NUM_ACTIVE_SOURCES: + g_value_set_uint (value, rtp_session_get_num_active_sources (sess)); + break; + case PROP_SOURCES: + g_value_take_boxed (value, rtp_session_create_sources (sess)); + break; + case PROP_FAVOR_NEW: + g_value_set_boolean (value, sess->favor_new); + break; + case PROP_RTCP_MIN_INTERVAL: + g_value_set_uint64 (value, sess->stats.min_interval * GST_SECOND); + break; + case PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD: + g_value_set_uint (value, sess->rtcp_immediate_feedback_threshold); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +on_new_ssrc (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_NEW_SSRC], 0, source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +static void +on_ssrc_collision (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SSRC_COLLISION], 0, + source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +static void +on_ssrc_validated (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SSRC_VALIDATED], 0, + source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +static void +on_ssrc_active (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SSRC_ACTIVE], 0, source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +static void +on_ssrc_sdes (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + GST_DEBUG ("SDES changed for SSRC %08x", source->ssrc); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SSRC_SDES], 0, source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +static void +on_bye_ssrc (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_BYE_SSRC], 0, source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +static void +on_bye_timeout (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_BYE_TIMEOUT], 0, source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +static void +on_timeout (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_TIMEOUT], 0, source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +static void +on_sender_timeout (RTPSession * sess, RTPSource * source) +{ + g_object_ref (source); + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SENDER_TIMEOUT], 0, + source); + RTP_SESSION_LOCK (sess); + g_object_unref (source); +} + +/** + * rtp_session_new: + * + * Create a new session object. + * + * Returns: a new #RTPSession. g_object_unref() after usage. + */ +RTPSession * +rtp_session_new (void) +{ + RTPSession *sess; + + sess = g_object_new (RTP_TYPE_SESSION, NULL); + + return sess; +} + +/** + * rtp_session_set_callbacks: + * @sess: an #RTPSession + * @callbacks: callbacks to configure + * @user_data: user data passed in the callbacks + * + * Configure a set of callbacks to be notified of actions. + */ +void +rtp_session_set_callbacks (RTPSession * sess, RTPSessionCallbacks * callbacks, + gpointer user_data) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + if (callbacks->process_rtp) { + sess->callbacks.process_rtp = callbacks->process_rtp; + sess->process_rtp_user_data = user_data; + } + if (callbacks->send_rtp) { + sess->callbacks.send_rtp = callbacks->send_rtp; + sess->send_rtp_user_data = user_data; + } + if (callbacks->send_rtcp) { + sess->callbacks.send_rtcp = callbacks->send_rtcp; + sess->send_rtcp_user_data = user_data; + } + if (callbacks->sync_rtcp) { + sess->callbacks.sync_rtcp = callbacks->sync_rtcp; + sess->sync_rtcp_user_data = user_data; + } + if (callbacks->clock_rate) { + sess->callbacks.clock_rate = callbacks->clock_rate; + sess->clock_rate_user_data = user_data; + } + if (callbacks->reconsider) { + sess->callbacks.reconsider = callbacks->reconsider; + sess->reconsider_user_data = user_data; + } + if (callbacks->request_key_unit) { + sess->callbacks.request_key_unit = callbacks->request_key_unit; + sess->request_key_unit_user_data = user_data; + } + if (callbacks->request_time) { + sess->callbacks.request_time = callbacks->request_time; + sess->request_time_user_data = user_data; + } +} + +/** + * rtp_session_set_process_rtp_callback: + * @sess: an #RTPSession + * @callback: callback to set + * @user_data: user data passed in the callback + * + * Configure only the process_rtp callback to be notified of the process_rtp action. + */ +void +rtp_session_set_process_rtp_callback (RTPSession * sess, + RTPSessionProcessRTP callback, gpointer user_data) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + sess->callbacks.process_rtp = callback; + sess->process_rtp_user_data = user_data; +} + +/** + * rtp_session_set_send_rtp_callback: + * @sess: an #RTPSession + * @callback: callback to set + * @user_data: user data passed in the callback + * + * Configure only the send_rtp callback to be notified of the send_rtp action. + */ +void +rtp_session_set_send_rtp_callback (RTPSession * sess, + RTPSessionSendRTP callback, gpointer user_data) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + sess->callbacks.send_rtp = callback; + sess->send_rtp_user_data = user_data; +} + +/** + * rtp_session_set_send_rtcp_callback: + * @sess: an #RTPSession + * @callback: callback to set + * @user_data: user data passed in the callback + * + * Configure only the send_rtcp callback to be notified of the send_rtcp action. + */ +void +rtp_session_set_send_rtcp_callback (RTPSession * sess, + RTPSessionSendRTCP callback, gpointer user_data) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + sess->callbacks.send_rtcp = callback; + sess->send_rtcp_user_data = user_data; +} + +/** + * rtp_session_set_sync_rtcp_callback: + * @sess: an #RTPSession + * @callback: callback to set + * @user_data: user data passed in the callback + * + * Configure only the sync_rtcp callback to be notified of the sync_rtcp action. + */ +void +rtp_session_set_sync_rtcp_callback (RTPSession * sess, + RTPSessionSyncRTCP callback, gpointer user_data) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + sess->callbacks.sync_rtcp = callback; + sess->sync_rtcp_user_data = user_data; +} + +/** + * rtp_session_set_clock_rate_callback: + * @sess: an #RTPSession + * @callback: callback to set + * @user_data: user data passed in the callback + * + * Configure only the clock_rate callback to be notified of the clock_rate action. + */ +void +rtp_session_set_clock_rate_callback (RTPSession * sess, + RTPSessionClockRate callback, gpointer user_data) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + sess->callbacks.clock_rate = callback; + sess->clock_rate_user_data = user_data; +} + +/** + * rtp_session_set_reconsider_callback: + * @sess: an #RTPSession + * @callback: callback to set + * @user_data: user data passed in the callback + * + * Configure only the reconsider callback to be notified of the reconsider action. + */ +void +rtp_session_set_reconsider_callback (RTPSession * sess, + RTPSessionReconsider callback, gpointer user_data) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + sess->callbacks.reconsider = callback; + sess->reconsider_user_data = user_data; +} + +/** + * rtp_session_set_request_time_callback: + * @sess: an #RTPSession + * @callback: callback to set + * @user_data: user data passed in the callback + * + * Configure only the request_time callback + */ +void +rtp_session_set_request_time_callback (RTPSession * sess, + RTPSessionRequestTime callback, gpointer user_data) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + sess->callbacks.request_time = callback; + sess->request_time_user_data = user_data; +} + +/** + * rtp_session_set_bandwidth: + * @sess: an #RTPSession + * @bandwidth: the bandwidth allocated + * + * Set the session bandwidth in bytes per second. + */ +void +rtp_session_set_bandwidth (RTPSession * sess, gdouble bandwidth) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + RTP_SESSION_LOCK (sess); + sess->stats.bandwidth = bandwidth; + RTP_SESSION_UNLOCK (sess); +} + +/** + * rtp_session_get_bandwidth: + * @sess: an #RTPSession + * + * Get the session bandwidth. + * + * Returns: the session bandwidth. + */ +gdouble +rtp_session_get_bandwidth (RTPSession * sess) +{ + gdouble result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), 0); + + RTP_SESSION_LOCK (sess); + result = sess->stats.bandwidth; + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_set_rtcp_fraction: + * @sess: an #RTPSession + * @bandwidth: the RTCP bandwidth + * + * Set the bandwidth in bytes per second that should be used for RTCP + * messages. + */ +void +rtp_session_set_rtcp_fraction (RTPSession * sess, gdouble bandwidth) +{ + g_return_if_fail (RTP_IS_SESSION (sess)); + + RTP_SESSION_LOCK (sess); + sess->stats.rtcp_bandwidth = bandwidth; + RTP_SESSION_UNLOCK (sess); +} + +/** + * rtp_session_get_rtcp_fraction: + * @sess: an #RTPSession + * + * Get the session bandwidth used for RTCP. + * + * Returns: The bandwidth used for RTCP messages. + */ +gdouble +rtp_session_get_rtcp_fraction (RTPSession * sess) +{ + gdouble result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), 0.0); + + RTP_SESSION_LOCK (sess); + result = sess->stats.rtcp_bandwidth; + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_set_sdes_string: + * @sess: an #RTPSession + * @type: the type of the SDES item + * @item: a null-terminated string to set. + * + * Store an SDES item of @type in @sess. + * + * Returns: %FALSE if the data was unchanged @type is invalid. + */ +gboolean +rtp_session_set_sdes_string (RTPSession * sess, GstRTCPSDESType type, + const gchar * item) +{ + gboolean result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), FALSE); + + RTP_SESSION_LOCK (sess); + result = rtp_source_set_sdes_string (sess->source, type, item); + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_get_sdes_string: + * @sess: an #RTPSession + * @type: the type of the SDES item + * + * Get the SDES item of @type from @sess. + * + * Returns: a null-terminated copy of the SDES item or NULL when @type was not + * valid. g_free() after usage. + */ +gchar * +rtp_session_get_sdes_string (RTPSession * sess, GstRTCPSDESType type) +{ + gchar *result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); + + RTP_SESSION_LOCK (sess); + result = rtp_source_get_sdes_string (sess->source, type); + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_get_sdes_struct: + * @sess: an #RTSPSession + * + * Get the SDES data as a #GstStructure + * + * Returns: a GstStructure with SDES items for @sess. This function returns a + * copy of the SDES structure, use gst_structure_free() after usage. + */ +GstStructure * +rtp_session_get_sdes_struct (RTPSession * sess) +{ + const GstStructure *sdes; + GstStructure *result = NULL; + + g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); + + RTP_SESSION_LOCK (sess); + sdes = rtp_source_get_sdes_struct (sess->source); + if (sdes) + result = gst_structure_copy (sdes); + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_set_sdes_struct: + * @sess: an #RTSPSession + * @sdes: a #GstStructure + * + * Set the SDES data as a #GstStructure. This function makes a copy of @sdes. + */ +void +rtp_session_set_sdes_struct (RTPSession * sess, const GstStructure * sdes) +{ + g_return_if_fail (sdes); + g_return_if_fail (RTP_IS_SESSION (sess)); + + RTP_SESSION_LOCK (sess); + rtp_source_set_sdes_struct (sess->source, gst_structure_copy (sdes)); + RTP_SESSION_UNLOCK (sess); +} + +static GstFlowReturn +source_push_rtp (RTPSource * source, gpointer data, RTPSession * session) +{ + GstFlowReturn result = GST_FLOW_OK; + + if (source == session->source) { + GST_LOG ("source %08x pushed sender RTP packet", source->ssrc); + + RTP_SESSION_UNLOCK (session); + + if (session->callbacks.send_rtp) + result = + session->callbacks.send_rtp (session, source, data, + session->send_rtp_user_data); + else { + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); + } + } else { + GST_LOG ("source %08x pushed receiver RTP packet", source->ssrc); + RTP_SESSION_UNLOCK (session); + + if (session->callbacks.process_rtp) + result = + session->callbacks.process_rtp (session, source, + GST_BUFFER_CAST (data), session->process_rtp_user_data); + else + gst_buffer_unref (GST_BUFFER_CAST (data)); + } + RTP_SESSION_LOCK (session); + + return result; +} + +static gint +source_clock_rate (RTPSource * source, guint8 pt, RTPSession * session) +{ + gint result; + + RTP_SESSION_UNLOCK (session); + + if (session->callbacks.clock_rate) + result = + session->callbacks.clock_rate (session, pt, + session->clock_rate_user_data); + else + result = -1; + + RTP_SESSION_LOCK (session); + + GST_DEBUG ("got clock-rate %d for pt %d", result, pt); + + return result; +} + +static RTPSourceCallbacks callbacks = { + (RTPSourcePushRTP) source_push_rtp, + (RTPSourceClockRate) source_clock_rate, +}; + +static gboolean +check_collision (RTPSession * sess, RTPSource * source, + RTPArrivalStats * arrival, gboolean rtp) +{ + /* If we have no arrival address, we can't do collision checking */ + if (!arrival->have_address) + return FALSE; + + if (sess->source != source) { + GstNetAddress *from; + gboolean have_from; + + /* This is not our local source, but lets check if two remote + * source collide + */ + + if (rtp) { + from = &source->rtp_from; + have_from = source->have_rtp_from; + } else { + from = &source->rtcp_from; + have_from = source->have_rtcp_from; + } + + if (have_from) { + if (gst_netaddress_equal (from, &arrival->address)) { + /* Address is the same */ + return FALSE; + } else { + GST_LOG ("we have a third-party collision or loop ssrc:%x", + rtp_source_get_ssrc (source)); + if (sess->favor_new) { + if (rtp_source_find_conflicting_address (source, + &arrival->address, arrival->current_time)) { + gchar buf1[40]; + gst_netaddress_to_string (&arrival->address, buf1, 40); + GST_LOG ("Known conflict on %x for %s, dropping packet", + rtp_source_get_ssrc (source), buf1); + return TRUE; + } else { + gchar buf1[40], buf2[40]; + + /* Current address is not a known conflict, lets assume this is + * a new source. Save old address in possible conflict list + */ + rtp_source_add_conflicting_address (source, from, + arrival->current_time); + + gst_netaddress_to_string (from, buf1, 40); + gst_netaddress_to_string (&arrival->address, buf2, 40); + GST_DEBUG ("New conflict for ssrc %x, replacing %s with %s," + " saving old as known conflict", + rtp_source_get_ssrc (source), buf1, buf2); + + if (rtp) + rtp_source_set_rtp_from (source, &arrival->address); + else + rtp_source_set_rtcp_from (source, &arrival->address); + return FALSE; + } + } else { + /* Don't need to save old addresses, we ignore new sources */ + return TRUE; + } + } + } else { + /* We don't already have a from address for RTP, just set it */ + if (rtp) + rtp_source_set_rtp_from (source, &arrival->address); + else + rtp_source_set_rtcp_from (source, &arrival->address); + return FALSE; + } + + /* FIXME: Log 3rd party collision somehow + * Maybe should be done in upper layer, only the SDES can tell us + * if its a collision or a loop + */ + + /* If the source has been inactive for some time, we assume that it has + * simply changed its transport source address. Hence, there is no true + * third-party collision - only a simulated one. */ + if (arrival->current_time > source->last_activity) { + GstClockTime inactivity_period = + arrival->current_time - source->last_activity; + if (inactivity_period > 1 * GST_SECOND) { + /* Use new network address */ + if (rtp) { + g_assert (source->have_rtp_from); + rtp_source_set_rtp_from (source, &arrival->address); + } else { + g_assert (source->have_rtcp_from); + rtp_source_set_rtcp_from (source, &arrival->address); + } + return FALSE; + } + } + } else { + /* This is sending with our ssrc, is it an address we already know */ + + if (rtp_source_find_conflicting_address (source, &arrival->address, + arrival->current_time)) { + /* Its a known conflict, its probably a loop, not a collision + * lets just drop the incoming packet + */ + GST_DEBUG ("Our packets are being looped back to us, dropping"); + } else { + /* Its a new collision, lets change our SSRC */ + + rtp_source_add_conflicting_address (source, &arrival->address, + arrival->current_time); + + GST_DEBUG ("Collision for SSRC %x", rtp_source_get_ssrc (source)); + on_ssrc_collision (sess, source); + + rtp_session_schedule_bye_locked (sess, "SSRC Collision", + arrival->current_time); + + sess->change_ssrc = TRUE; + } + } + + return TRUE; +} + + +/* must be called with the session lock, the returned source needs to be + * unreffed after usage. */ +static RTPSource * +obtain_source (RTPSession * sess, guint32 ssrc, gboolean * created, + RTPArrivalStats * arrival, gboolean rtp) +{ + RTPSource *source; + + source = + g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc)); + if (source == NULL) { + /* make new Source in probation and insert */ + source = rtp_source_new (ssrc); + + /* for RTP packets we need to set the source in probation. Receiving RTCP + * packets of an SSRC, on the other hand, is a strong indication that we + * are dealing with a valid source. */ + if (rtp) + source->probation = RTP_DEFAULT_PROBATION; + else + source->probation = 0; + + /* store from address, if any */ + if (arrival->have_address) { + if (rtp) + rtp_source_set_rtp_from (source, &arrival->address); + else + rtp_source_set_rtcp_from (source, &arrival->address); + } + + /* configure a callback on the source */ + rtp_source_set_callbacks (source, &callbacks, sess); + + g_hash_table_insert (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc), + source); + + /* we have one more source now */ + sess->total_sources++; + *created = TRUE; + } else { + *created = FALSE; + /* check for collision, this updates the address when not previously set */ + if (check_collision (sess, source, arrival, rtp)) { + return NULL; + } + } + /* update last activity */ + source->last_activity = arrival->current_time; + if (rtp) + source->last_rtp_activity = arrival->current_time; + g_object_ref (source); + + return source; +} + +/** + * rtp_session_get_internal_source: + * @sess: a #RTPSession + * + * Get the internal #RTPSource of @sess. + * + * Returns: The internal #RTPSource. g_object_unref() after usage. + */ +RTPSource * +rtp_session_get_internal_source (RTPSession * sess) +{ + RTPSource *result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); + + result = g_object_ref (sess->source); + + return result; +} + +/** + * rtp_session_set_internal_ssrc: + * @sess: a #RTPSession + * @ssrc: an SSRC + * + * Set the SSRC of @sess to @ssrc. + */ +void +rtp_session_set_internal_ssrc (RTPSession * sess, guint32 ssrc) +{ + RTP_SESSION_LOCK (sess); + if (ssrc != sess->source->ssrc) { + g_hash_table_steal (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (sess->source->ssrc)); + + GST_DEBUG ("setting internal SSRC to %08x", ssrc); + /* After this call, any receiver of the old SSRC either in RTP or RTCP + * packets will timeout on the old SSRC, we could potentially schedule a + * BYE RTCP for the old SSRC... */ + sess->source->ssrc = ssrc; + rtp_source_reset (sess->source); + + /* rehash with the new SSRC */ + g_hash_table_insert (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (sess->source->ssrc), sess->source); + } + RTP_SESSION_UNLOCK (sess); + + g_object_notify (G_OBJECT (sess), "internal-ssrc"); +} + +/** + * rtp_session_get_internal_ssrc: + * @sess: a #RTPSession + * + * Get the internal SSRC of @sess. + * + * Returns: The SSRC of the session. + */ +guint32 +rtp_session_get_internal_ssrc (RTPSession * sess) +{ + guint32 ssrc; + + RTP_SESSION_LOCK (sess); + ssrc = sess->source->ssrc; + RTP_SESSION_UNLOCK (sess); + + return ssrc; +} + +/** + * rtp_session_add_source: + * @sess: a #RTPSession + * @src: #RTPSource to add + * + * Add @src to @session. + * + * Returns: %TRUE on success, %FALSE if a source with the same SSRC already + * existed in the session. + */ +gboolean +rtp_session_add_source (RTPSession * sess, RTPSource * src) +{ + gboolean result = FALSE; + RTPSource *find; + + g_return_val_if_fail (RTP_IS_SESSION (sess), FALSE); + g_return_val_if_fail (src != NULL, FALSE); + + RTP_SESSION_LOCK (sess); + find = + g_hash_table_lookup (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (src->ssrc)); + if (find == NULL) { + g_hash_table_insert (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (src->ssrc), src); + /* we have one more source now */ + sess->total_sources++; + result = TRUE; + } + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_get_num_sources: + * @sess: an #RTPSession + * + * Get the number of sources in @sess. + * + * Returns: The number of sources in @sess. + */ +guint +rtp_session_get_num_sources (RTPSession * sess) +{ + guint result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), FALSE); + + RTP_SESSION_LOCK (sess); + result = sess->total_sources; + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_get_num_active_sources: + * @sess: an #RTPSession + * + * Get the number of active sources in @sess. A source is considered active when + * it has been validated and has not yet received a BYE RTCP message. + * + * Returns: The number of active sources in @sess. + */ +guint +rtp_session_get_num_active_sources (RTPSession * sess) +{ + guint result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), 0); + + RTP_SESSION_LOCK (sess); + result = sess->stats.active_sources; + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_get_source_by_ssrc: + * @sess: an #RTPSession + * @ssrc: an SSRC + * + * Find the source with @ssrc in @sess. + * + * Returns: a #RTPSource with SSRC @ssrc or NULL if the source was not found. + * g_object_unref() after usage. + */ +RTPSource * +rtp_session_get_source_by_ssrc (RTPSession * sess, guint32 ssrc) +{ + RTPSource *result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); + + RTP_SESSION_LOCK (sess); + result = + g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc)); + if (result) + g_object_ref (result); + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_get_source_by_cname: + * @sess: a #RTPSession + * @cname: an CNAME + * + * Find the source with @cname in @sess. + * + * Returns: a #RTPSource with CNAME @cname or NULL if the source was not found. + * g_object_unref() after usage. + */ +RTPSource * +rtp_session_get_source_by_cname (RTPSession * sess, const gchar * cname) +{ + RTPSource *result; + + g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); + g_return_val_if_fail (cname != NULL, NULL); + + RTP_SESSION_LOCK (sess); + result = g_hash_table_lookup (sess->cnames, cname); + if (result) + g_object_ref (result); + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/* should be called with the SESSION lock */ +static guint32 +rtp_session_create_new_ssrc (RTPSession * sess) +{ + guint32 ssrc; + + while (TRUE) { + ssrc = g_random_int (); + + /* see if it exists in the session, we're done if it doesn't */ + if (g_hash_table_lookup (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (ssrc)) == NULL) + break; + } + return ssrc; +} + + +/** + * rtp_session_create_source: + * @sess: an #RTPSession + * + * Create an #RTPSource for use in @sess. This function will create a source + * with an ssrc that is currently not used by any participants in the session. + * + * Returns: an #RTPSource. + */ +RTPSource * +rtp_session_create_source (RTPSession * sess) +{ + guint32 ssrc; + RTPSource *source; + + RTP_SESSION_LOCK (sess); + ssrc = rtp_session_create_new_ssrc (sess); + source = rtp_source_new (ssrc); + rtp_source_set_callbacks (source, &callbacks, sess); + /* we need an additional ref for the source in the hashtable */ + g_object_ref (source); + g_hash_table_insert (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc), + source); + /* we have one more source now */ + sess->total_sources++; + RTP_SESSION_UNLOCK (sess); + + return source; +} + +/* update the RTPArrivalStats structure with the current time and other bits + * about the current buffer we are handling. + * This function is typically called when a validated packet is received. + * This function should be called with the SESSION_LOCK + */ +static void +update_arrival_stats (RTPSession * sess, RTPArrivalStats * arrival, + gboolean rtp, GstBuffer * buffer, GstClockTime current_time, + GstClockTime running_time, guint64 ntpnstime) +{ + /* get time of arrival */ + arrival->current_time = current_time; + arrival->running_time = running_time; + arrival->ntpnstime = ntpnstime; + + /* get packet size including header overhead */ + arrival->bytes = GST_BUFFER_SIZE (buffer) + sess->header_len; + + if (rtp) { + arrival->payload_len = gst_rtp_buffer_get_payload_len (buffer); + } else { + arrival->payload_len = 0; + } + + /* for netbuffer we can store the IP address to check for collisions */ + arrival->have_address = GST_IS_NETBUFFER (buffer); + if (arrival->have_address) { + GstNetBuffer *netbuf = (GstNetBuffer *) buffer; + + memcpy (&arrival->address, &netbuf->from, sizeof (GstNetAddress)); + } +} + +/** + * rtp_session_process_rtp: + * @sess: and #RTPSession + * @buffer: an RTP buffer + * @current_time: the current system time + * @running_time: the running_time of @buffer + * + * Process an RTP buffer in the session manager. This function takes ownership + * of @buffer. + * + * Returns: a #GstFlowReturn. + */ +GstFlowReturn +rtp_session_process_rtp (RTPSession * sess, GstBuffer * buffer, + GstClockTime current_time, GstClockTime running_time) +{ + GstFlowReturn result; + guint32 ssrc; + RTPSource *source; + gboolean created; + gboolean prevsender, prevactive; + RTPArrivalStats arrival; + guint32 csrcs[16]; + guint8 i, count; + guint64 oldrate; + + g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); + + if (!gst_rtp_buffer_validate (buffer)) + goto invalid_packet; + + RTP_SESSION_LOCK (sess); + /* update arrival stats */ + update_arrival_stats (sess, &arrival, TRUE, buffer, current_time, + running_time, -1); + + /* ignore more RTP packets when we left the session */ + if (sess->source->received_bye) + goto ignore; + + /* get SSRC and look up in session database */ + ssrc = gst_rtp_buffer_get_ssrc (buffer); + source = obtain_source (sess, ssrc, &created, &arrival, TRUE); + if (!source) + goto collision; + + prevsender = RTP_SOURCE_IS_SENDER (source); + prevactive = RTP_SOURCE_IS_ACTIVE (source); + oldrate = source->bitrate; + + /* copy available csrc for later */ + count = gst_rtp_buffer_get_csrc_count (buffer); + /* make sure to not overflow our array. An RTP buffer can maximally contain + * 16 CSRCs */ + count = MIN (count, 16); + + for (i = 0; i < count; i++) + csrcs[i] = gst_rtp_buffer_get_csrc (buffer, i); + + /* let source process the packet */ + result = rtp_source_process_rtp (source, buffer, &arrival); + + /* source became active */ + if (prevactive != RTP_SOURCE_IS_ACTIVE (source)) { + sess->stats.active_sources++; + GST_DEBUG ("source: %08x became active, %d active sources", ssrc, + sess->stats.active_sources); + on_ssrc_validated (sess, source); + } + if (prevsender != RTP_SOURCE_IS_SENDER (source)) { + sess->stats.sender_sources++; + GST_DEBUG ("source: %08x became sender, %d sender sources", ssrc, + sess->stats.sender_sources); + } + if (oldrate != source->bitrate) + sess->recalc_bandwidth = TRUE; + + if (created) + on_new_ssrc (sess, source); + + if (source->validated) { + gboolean created; + + /* for validated sources, we add the CSRCs as well */ + for (i = 0; i < count; i++) { + guint32 csrc; + RTPSource *csrc_src; + + csrc = csrcs[i]; + + /* get source */ + csrc_src = obtain_source (sess, csrc, &created, &arrival, TRUE); + if (!csrc_src) + continue; + + if (created) { + GST_DEBUG ("created new CSRC: %08x", csrc); + rtp_source_set_as_csrc (csrc_src); + if (RTP_SOURCE_IS_ACTIVE (csrc_src)) + sess->stats.active_sources++; + on_new_ssrc (sess, csrc_src); + } + g_object_unref (csrc_src); + } + } + g_object_unref (source); + + RTP_SESSION_UNLOCK (sess); + + return result; + + /* ERRORS */ +invalid_packet: + { + gst_buffer_unref (buffer); + GST_DEBUG ("invalid RTP packet received"); + return GST_FLOW_OK; + } +ignore: + { + gst_buffer_unref (buffer); + RTP_SESSION_UNLOCK (sess); + GST_DEBUG ("ignoring RTP packet because we are leaving"); + return GST_FLOW_OK; + } +collision: + { + gst_buffer_unref (buffer); + RTP_SESSION_UNLOCK (sess); + GST_DEBUG ("ignoring packet because its collisioning"); + return GST_FLOW_OK; + } +} + +static void +rtp_session_process_rb (RTPSession * sess, RTPSource * source, + GstRTCPPacket * packet, RTPArrivalStats * arrival) +{ + guint count, i; + + count = gst_rtcp_packet_get_rb_count (packet); + for (i = 0; i < count; i++) { + guint32 ssrc, exthighestseq, jitter, lsr, dlsr; + guint8 fractionlost; + gint32 packetslost; + + gst_rtcp_packet_get_rb (packet, i, &ssrc, &fractionlost, + &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); + + GST_DEBUG ("RB %d: SSRC %08x, jitter %" G_GUINT32_FORMAT, i, ssrc, jitter); + + if (ssrc == sess->source->ssrc) { + /* only deal with report blocks for our session, we update the stats of + * the sender of the RTCP message. We could also compare our stats against + * the other sender to see if we are better or worse. */ + rtp_source_process_rb (source, arrival->ntpnstime, fractionlost, + packetslost, exthighestseq, jitter, lsr, dlsr); + } + } + on_ssrc_active (sess, source); +} + +/* A Sender report contains statistics about how the sender is doing. This + * includes timing informataion such as the relation between RTP and NTP + * timestamps and the number of packets/bytes it sent to us. + * + * In this report is also included a set of report blocks related to how this + * sender is receiving data (in case we (or somebody else) is also sending stuff + * to it). This info includes the packet loss, jitter and seqnum. It also + * contains information to calculate the round trip time (LSR/DLSR). + */ +static void +rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet, + RTPArrivalStats * arrival, gboolean * do_sync) +{ + guint32 senderssrc, rtptime, packet_count, octet_count; + guint64 ntptime; + RTPSource *source; + gboolean created, prevsender; + + gst_rtcp_packet_sr_get_sender_info (packet, &senderssrc, &ntptime, &rtptime, + &packet_count, &octet_count); + + GST_DEBUG ("got SR packet: SSRC %08x, time %" GST_TIME_FORMAT, + senderssrc, GST_TIME_ARGS (arrival->current_time)); + + source = obtain_source (sess, senderssrc, &created, arrival, FALSE); + if (!source) + return; + + /* don't try to do lip-sync for sources that sent a BYE */ + if (rtp_source_received_bye (source)) + *do_sync = FALSE; + else + *do_sync = TRUE; + + prevsender = RTP_SOURCE_IS_SENDER (source); + + /* first update the source */ + rtp_source_process_sr (source, arrival->current_time, ntptime, rtptime, + packet_count, octet_count); + + if (prevsender != RTP_SOURCE_IS_SENDER (source)) { + sess->stats.sender_sources++; + GST_DEBUG ("source: %08x became sender, %d sender sources", senderssrc, + sess->stats.sender_sources); + } + + if (created) + on_new_ssrc (sess, source); + + rtp_session_process_rb (sess, source, packet, arrival); + g_object_unref (source); +} + +/* A receiver report contains statistics about how a receiver is doing. It + * includes stuff like packet loss, jitter and the seqnum it received last. It + * also contains info to calculate the round trip time. + * + * We are only interested in how the sender of this report is doing wrt to us. + */ +static void +rtp_session_process_rr (RTPSession * sess, GstRTCPPacket * packet, + RTPArrivalStats * arrival) +{ + guint32 senderssrc; + RTPSource *source; + gboolean created; + + senderssrc = gst_rtcp_packet_rr_get_ssrc (packet); + + GST_DEBUG ("got RR packet: SSRC %08x", senderssrc); + + source = obtain_source (sess, senderssrc, &created, arrival, FALSE); + if (!source) + return; + + if (created) + on_new_ssrc (sess, source); + + rtp_session_process_rb (sess, source, packet, arrival); + g_object_unref (source); +} + +/* Get SDES items and store them in the SSRC */ +static void +rtp_session_process_sdes (RTPSession * sess, GstRTCPPacket * packet, + RTPArrivalStats * arrival) +{ + guint items, i, j; + gboolean more_items, more_entries; + + items = gst_rtcp_packet_sdes_get_item_count (packet); + GST_DEBUG ("got SDES packet with %d items", items); + + more_items = gst_rtcp_packet_sdes_first_item (packet); + i = 0; + while (more_items) { + guint32 ssrc; + gboolean changed, created, validated; + RTPSource *source; + GstStructure *sdes; + + ssrc = gst_rtcp_packet_sdes_get_ssrc (packet); + + GST_DEBUG ("item %d, SSRC %08x", i, ssrc); + + changed = FALSE; + + /* find src, no probation when dealing with RTCP */ + source = obtain_source (sess, ssrc, &created, arrival, FALSE); + if (!source) + return; + + sdes = gst_structure_new ("application/x-rtp-source-sdes", NULL); + + more_entries = gst_rtcp_packet_sdes_first_entry (packet); + j = 0; + while (more_entries) { + GstRTCPSDESType type; + guint8 len; + guint8 *data; + gchar *name; + gchar *value; + + gst_rtcp_packet_sdes_get_entry (packet, &type, &len, &data); + + GST_DEBUG ("entry %d, type %d, len %d, data %.*s", j, type, len, len, + data); + + if (type == GST_RTCP_SDES_PRIV) { + name = g_strndup ((const gchar *) &data[1], data[0]); + len -= data[0] + 1; + data += data[0] + 1; + } else { + name = g_strdup (gst_rtcp_sdes_type_to_name (type)); + } + + value = g_strndup ((const gchar *) data, len); + + gst_structure_set (sdes, name, G_TYPE_STRING, value, NULL); + + g_free (name); + g_free (value); + + more_entries = gst_rtcp_packet_sdes_next_entry (packet); + j++; + } + + /* takes ownership of sdes */ + changed = rtp_source_set_sdes_struct (source, sdes); + + validated = !RTP_SOURCE_IS_ACTIVE (source); + source->validated = TRUE; + + /* source became active */ + if (validated) { + sess->stats.active_sources++; + GST_DEBUG ("source: %08x became active, %d active sources", ssrc, + sess->stats.active_sources); + on_ssrc_validated (sess, source); + } + + if (created) + on_new_ssrc (sess, source); + if (changed) + on_ssrc_sdes (sess, source); + + g_object_unref (source); + + more_items = gst_rtcp_packet_sdes_next_item (packet); + i++; + } +} + +/* BYE is sent when a client leaves the session + */ +static void +rtp_session_process_bye (RTPSession * sess, GstRTCPPacket * packet, + RTPArrivalStats * arrival) +{ + guint count, i; + gchar *reason; + gboolean reconsider = FALSE; + + reason = gst_rtcp_packet_bye_get_reason (packet); + GST_DEBUG ("got BYE packet (reason: %s)", GST_STR_NULL (reason)); + + count = gst_rtcp_packet_bye_get_ssrc_count (packet); + for (i = 0; i < count; i++) { + guint32 ssrc; + RTPSource *source; + gboolean created, prevactive, prevsender; + guint pmembers, members; + + ssrc = gst_rtcp_packet_bye_get_nth_ssrc (packet, i); + GST_DEBUG ("SSRC: %08x", ssrc); + + if (ssrc == sess->source->ssrc) + return; + + /* find src and mark bye, no probation when dealing with RTCP */ + source = obtain_source (sess, ssrc, &created, arrival, FALSE); + if (!source) + return; + + /* store time for when we need to time out this source */ + source->bye_time = arrival->current_time; + + prevactive = RTP_SOURCE_IS_ACTIVE (source); + prevsender = RTP_SOURCE_IS_SENDER (source); + + /* let the source handle the rest */ + rtp_source_process_bye (source, reason); + + pmembers = sess->stats.active_sources; + + if (prevactive && !RTP_SOURCE_IS_ACTIVE (source)) { + sess->stats.active_sources--; + GST_DEBUG ("source: %08x became inactive, %d active sources", ssrc, + sess->stats.active_sources); + } + if (prevsender && !RTP_SOURCE_IS_SENDER (source)) { + sess->stats.sender_sources--; + GST_DEBUG ("source: %08x became non sender, %d sender sources", ssrc, + sess->stats.sender_sources); + } + members = sess->stats.active_sources; + + if (!sess->source->received_bye && members < pmembers) { + /* some members went away since the previous timeout estimate. + * Perform reverse reconsideration but only when we are not scheduling a + * BYE ourselves. */ + if (arrival->current_time < sess->next_rtcp_check_time) { + GstClockTime time_remaining; + + time_remaining = sess->next_rtcp_check_time - arrival->current_time; + sess->next_rtcp_check_time = + gst_util_uint64_scale (time_remaining, members, pmembers); + + GST_DEBUG ("reverse reconsideration %" GST_TIME_FORMAT, + GST_TIME_ARGS (sess->next_rtcp_check_time)); + + sess->next_rtcp_check_time += arrival->current_time; + + /* mark pending reconsider. We only want to signal the reconsideration + * once after we handled all the source in the bye packet */ + reconsider = TRUE; + } + } + + if (created) + on_new_ssrc (sess, source); + + on_bye_ssrc (sess, source); + + g_object_unref (source); + } + if (reconsider) { + RTP_SESSION_UNLOCK (sess); + /* notify app of reconsideration */ + if (sess->callbacks.reconsider) + sess->callbacks.reconsider (sess, sess->reconsider_user_data); + RTP_SESSION_LOCK (sess); + } + g_free (reason); +} + +static void +rtp_session_process_app (RTPSession * sess, GstRTCPPacket * packet, + RTPArrivalStats * arrival) +{ + GST_DEBUG ("received APP"); +} + +static gboolean +rtp_session_request_local_key_unit (RTPSession * sess, RTPSource * src, + gboolean fir, GstClockTime current_time) +{ + guint32 round_trip = 0; + + rtp_source_get_last_rb (src, NULL, NULL, NULL, NULL, NULL, NULL, &round_trip); + + if (sess->last_keyframe_request != GST_CLOCK_TIME_NONE && round_trip) { + GstClockTime round_trip_in_ns = gst_util_uint64_scale (round_trip, + GST_SECOND, 65536); + + if (sess->last_keyframe_request != GST_CLOCK_TIME_NONE && + current_time - sess->last_keyframe_request < 2 * round_trip_in_ns) { + GST_DEBUG ("Ignoring %s request because one was send without one " + "RTT (%" GST_TIME_FORMAT " < %" GST_TIME_FORMAT ")", + fir ? "FIR" : "PLI", + GST_TIME_ARGS (current_time - sess->last_keyframe_request), + GST_TIME_ARGS (round_trip_in_ns));; + return FALSE; + } + } + + sess->last_keyframe_request = current_time; + + GST_LOG ("received %s request from %X %p(%p)", fir ? "FIR" : "PLI", + rtp_source_get_ssrc (src), sess->callbacks.process_rtp, + sess->callbacks.request_key_unit); + + RTP_SESSION_UNLOCK (sess); + sess->callbacks.request_key_unit (sess, fir, + sess->request_key_unit_user_data); + RTP_SESSION_LOCK (sess); + + return TRUE; +} + +static void +rtp_session_process_pli (RTPSession * sess, guint32 sender_ssrc, + guint32 media_ssrc, GstClockTime current_time) +{ + RTPSource *src; + + if (!sess->callbacks.request_key_unit) + return; + + src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (sender_ssrc)); + if (!src) + return; + + rtp_session_request_local_key_unit (sess, src, FALSE, current_time); +} + +static void +rtp_session_process_fir (RTPSession * sess, guint32 sender_ssrc, + guint8 * fci_data, guint fci_length, GstClockTime current_time) +{ + RTPSource *src; + guint32 ssrc; + guint position = 0; + gboolean our_request = FALSE; + + if (!sess->callbacks.request_key_unit) + return; + + if (fci_length < 8) + return; + + src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (sender_ssrc)); + + /* Hack because Google fails to set the sender_ssrc correctly */ + if (!src && sender_ssrc == 1) { + GHashTableIter iter; + + if (sess->stats.sender_sources > + RTP_SOURCE_IS_SENDER (sess->source) ? 2 : 1) + return; + + g_hash_table_iter_init (&iter, sess->ssrcs[sess->mask_idx]); + + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) & src)) { + if (src != sess->source && rtp_source_is_sender (src)) + break; + src = NULL; + } + } + + if (!src) + return; + + for (position = 0; position < fci_length; position += 8) { + guint8 *data = fci_data + position; + + ssrc = GST_READ_UINT32_BE (data); + + if (ssrc == rtp_source_get_ssrc (sess->source)) { + our_request = TRUE; + break; + } + } + if (!our_request) + return; + + rtp_session_request_local_key_unit (sess, src, TRUE, current_time); +} + +static void +rtp_session_process_feedback (RTPSession * sess, GstRTCPPacket * packet, + RTPArrivalStats * arrival, GstClockTime current_time) +{ + GstRTCPType type = gst_rtcp_packet_get_type (packet); + GstRTCPFBType fbtype = gst_rtcp_packet_fb_get_type (packet); + guint32 sender_ssrc = gst_rtcp_packet_fb_get_sender_ssrc (packet); + guint32 media_ssrc = gst_rtcp_packet_fb_get_media_ssrc (packet); + guint8 *fci_data = gst_rtcp_packet_fb_get_fci (packet); + guint fci_length = 4 * gst_rtcp_packet_fb_get_fci_length (packet); + + GST_DEBUG ("received feedback %d:%d from %08X about %08X with FCI of " + "length %d", type, fbtype, sender_ssrc, media_ssrc, fci_length); + + if (g_signal_has_handler_pending (sess, + rtp_session_signals[SIGNAL_ON_FEEDBACK_RTCP], 0, TRUE)) { + GstBuffer *fci_buffer = NULL; + + if (fci_length > 0) { + fci_buffer = gst_buffer_create_sub (packet->buffer, + fci_data - GST_BUFFER_DATA (packet->buffer), fci_length); + GST_BUFFER_TIMESTAMP (fci_buffer) = arrival->running_time; + } + + RTP_SESSION_UNLOCK (sess); + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_FEEDBACK_RTCP], 0, + type, fbtype, sender_ssrc, media_ssrc, fci_buffer); + RTP_SESSION_LOCK (sess); + + if (fci_buffer) + gst_buffer_unref (fci_buffer); + } + + if (sess->rtcp_feedback_retention_window) { + RTPSource *src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (media_ssrc)); + + if (src) + rtp_source_retain_rtcp_packet (src, packet, arrival->running_time); + } + + if (rtp_source_get_ssrc (sess->source) == media_ssrc || + /* PSFB FIR puts the media ssrc inside the FCI */ + (type == GST_RTCP_TYPE_PSFB && fbtype == GST_RTCP_PSFB_TYPE_FIR)) { + switch (type) { + case GST_RTCP_TYPE_PSFB: + switch (fbtype) { + case GST_RTCP_PSFB_TYPE_PLI: + rtp_session_process_pli (sess, sender_ssrc, media_ssrc, + current_time); + break; + case GST_RTCP_PSFB_TYPE_FIR: + rtp_session_process_fir (sess, sender_ssrc, fci_data, fci_length, + current_time); + break; + default: + break; + } + break; + case GST_RTCP_TYPE_RTPFB: + default: + break; + } + } +} + +/** + * rtp_session_process_rtcp: + * @sess: and #RTPSession + * @buffer: an RTCP buffer + * @current_time: the current system time + * @ntpnstime: the current NTP time in nanoseconds + * + * Process an RTCP buffer in the session manager. This function takes ownership + * of @buffer. + * + * Returns: a #GstFlowReturn. + */ +GstFlowReturn +rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer, + GstClockTime current_time, guint64 ntpnstime) +{ + GstRTCPPacket packet; + gboolean more, is_bye = FALSE, do_sync = FALSE; + RTPArrivalStats arrival; + GstFlowReturn result = GST_FLOW_OK; + + g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); + + if (!gst_rtcp_buffer_validate (buffer)) + goto invalid_packet; + + GST_DEBUG ("received RTCP packet"); + + RTP_SESSION_LOCK (sess); + /* update arrival stats */ + update_arrival_stats (sess, &arrival, FALSE, buffer, current_time, -1, + ntpnstime); + + if (sess->sent_bye) + goto ignore; + + /* start processing the compound packet */ + more = gst_rtcp_buffer_get_first_packet (buffer, &packet); + while (more) { + GstRTCPType type; + + type = gst_rtcp_packet_get_type (&packet); + + /* when we are leaving the session, we should ignore all non-BYE messages */ + if (sess->source->received_bye && type != GST_RTCP_TYPE_BYE) { + GST_DEBUG ("ignoring non-BYE RTCP packet because we are leaving"); + goto next; + } + + switch (type) { + case GST_RTCP_TYPE_SR: + rtp_session_process_sr (sess, &packet, &arrival, &do_sync); + break; + case GST_RTCP_TYPE_RR: + rtp_session_process_rr (sess, &packet, &arrival); + break; + case GST_RTCP_TYPE_SDES: + rtp_session_process_sdes (sess, &packet, &arrival); + break; + case GST_RTCP_TYPE_BYE: + is_bye = TRUE; + /* don't try to attempt lip-sync anymore for streams with a BYE */ + do_sync = FALSE; + rtp_session_process_bye (sess, &packet, &arrival); + break; + case GST_RTCP_TYPE_APP: + rtp_session_process_app (sess, &packet, &arrival); + break; + case GST_RTCP_TYPE_RTPFB: + case GST_RTCP_TYPE_PSFB: + rtp_session_process_feedback (sess, &packet, &arrival, current_time); + break; + default: + GST_WARNING ("got unknown RTCP packet"); + break; + } + next: + more = gst_rtcp_packet_move_to_next (&packet); + } + + /* if we are scheduling a BYE, we only want to count bye packets, else we + * count everything */ + if (sess->source->received_bye) { + if (is_bye) { + sess->stats.bye_members++; + UPDATE_AVG (sess->stats.avg_rtcp_packet_size, arrival.bytes); + } + } else { + /* keep track of average packet size */ + UPDATE_AVG (sess->stats.avg_rtcp_packet_size, arrival.bytes); + } + GST_DEBUG ("%p, received RTCP packet, avg size %u, %u", &sess->stats, + sess->stats.avg_rtcp_packet_size, arrival.bytes); + RTP_SESSION_UNLOCK (sess); + + /* notify caller of sr packets in the callback */ + if (do_sync && sess->callbacks.sync_rtcp) { + /* make writable, we might want to change the buffer */ + buffer = gst_buffer_make_metadata_writable (buffer); + + result = sess->callbacks.sync_rtcp (sess, sess->source, buffer, + sess->sync_rtcp_user_data); + } else + gst_buffer_unref (buffer); + + return result; + + /* ERRORS */ +invalid_packet: + { + GST_DEBUG ("invalid RTCP packet received"); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +ignore: + { + gst_buffer_unref (buffer); + RTP_SESSION_UNLOCK (sess); + GST_DEBUG ("ignoring RTP packet because we left"); + return GST_FLOW_OK; + } +} + +/** + * rtp_session_send_rtp: + * @sess: an #RTPSession + * @data: pointer to either an RTP buffer or a list of RTP buffers + * @is_list: TRUE when @data is a buffer list + * @current_time: the current system time + * @running_time: the running time of @data + * + * Send the RTP buffer in the session manager. This function takes ownership of + * @buffer. + * + * Returns: a #GstFlowReturn. + */ +GstFlowReturn +rtp_session_send_rtp (RTPSession * sess, gpointer data, gboolean is_list, + GstClockTime current_time, GstClockTime running_time) +{ + GstFlowReturn result; + RTPSource *source; + gboolean prevsender; + gboolean valid_packet; + guint64 oldrate; + + g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); + g_return_val_if_fail (is_list || GST_IS_BUFFER (data), GST_FLOW_ERROR); + + if (is_list) { + valid_packet = gst_rtp_buffer_list_validate (GST_BUFFER_LIST_CAST (data)); + } else { + valid_packet = gst_rtp_buffer_validate (GST_BUFFER_CAST (data)); + } + + if (!valid_packet) + goto invalid_packet; + + GST_LOG ("received RTP %s for sending", is_list ? "list" : "packet"); + + RTP_SESSION_LOCK (sess); + source = sess->source; + + /* update last activity */ + source->last_rtp_activity = current_time; + + prevsender = RTP_SOURCE_IS_SENDER (source); + oldrate = source->bitrate; + + /* we use our own source to send */ + result = rtp_source_send_rtp (source, data, is_list, running_time); + + if (RTP_SOURCE_IS_SENDER (source) && !prevsender) + sess->stats.sender_sources++; + if (oldrate != source->bitrate) + sess->recalc_bandwidth = TRUE; + RTP_SESSION_UNLOCK (sess); + + return result; + + /* ERRORS */ +invalid_packet: + { + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); + GST_DEBUG ("invalid RTP packet received"); + return GST_FLOW_OK; + } +} + +static void +add_bitrates (gpointer key, RTPSource * source, gdouble * bandwidth) +{ + *bandwidth += source->bitrate; +} + +static GstClockTime +calculate_rtcp_interval (RTPSession * sess, gboolean deterministic, + gboolean first) +{ + GstClockTime result; + + /* recalculate bandwidth when it changed */ + if (sess->recalc_bandwidth) { + gdouble bandwidth; + + if (sess->bandwidth > 0) + bandwidth = sess->bandwidth; + else { + /* If it is <= 0, then try to estimate the actual bandwidth */ + bandwidth = sess->source->bitrate; + + g_hash_table_foreach (sess->cnames, (GHFunc) add_bitrates, &bandwidth); + bandwidth /= 8.0; + } + if (bandwidth < 8000) + bandwidth = RTP_STATS_BANDWIDTH; + + rtp_stats_set_bandwidths (&sess->stats, bandwidth, + sess->rtcp_bandwidth, sess->rtcp_rs_bandwidth, sess->rtcp_rr_bandwidth); + + sess->recalc_bandwidth = FALSE; + } + + if (sess->source->received_bye) { + result = rtp_stats_calculate_bye_interval (&sess->stats); + } else { + result = rtp_stats_calculate_rtcp_interval (&sess->stats, + RTP_SOURCE_IS_SENDER (sess->source), first); + } + + GST_DEBUG ("next deterministic interval: %" GST_TIME_FORMAT ", first %d", + GST_TIME_ARGS (result), first); + + if (!deterministic && result != GST_CLOCK_TIME_NONE) + result = rtp_stats_add_rtcp_jitter (&sess->stats, result); + + GST_DEBUG ("next interval: %" GST_TIME_FORMAT, GST_TIME_ARGS (result)); + + return result; +} + +/* Stop the current @sess and schedule a BYE message for the other members. + * One must have the session lock to call this function + */ +static GstFlowReturn +rtp_session_schedule_bye_locked (RTPSession * sess, const gchar * reason, + GstClockTime current_time) +{ + GstFlowReturn result = GST_FLOW_OK; + RTPSource *source; + GstClockTime interval; + + g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); + + source = sess->source; + + /* ignore more BYEs */ + if (source->received_bye) + goto done; + + /* we have BYE now */ + source->received_bye = TRUE; + /* at least one member wants to send a BYE */ + g_free (sess->bye_reason); + sess->bye_reason = g_strdup (reason); + INIT_AVG (sess->stats.avg_rtcp_packet_size, 100); + sess->stats.bye_members = 1; + sess->first_rtcp = TRUE; + sess->sent_bye = FALSE; + sess->allow_early = TRUE; + + /* reschedule transmission */ + sess->last_rtcp_send_time = current_time; + interval = calculate_rtcp_interval (sess, FALSE, TRUE); + sess->next_rtcp_check_time = current_time + interval; + + GST_DEBUG ("Schedule BYE for %" GST_TIME_FORMAT ", %" GST_TIME_FORMAT, + GST_TIME_ARGS (interval), GST_TIME_ARGS (sess->next_rtcp_check_time)); + + RTP_SESSION_UNLOCK (sess); + /* notify app of reconsideration */ + if (sess->callbacks.reconsider) + sess->callbacks.reconsider (sess, sess->reconsider_user_data); + RTP_SESSION_LOCK (sess); +done: + + return result; +} + +/** + * rtp_session_schedule_bye: + * @sess: an #RTPSession + * @reason: a reason or NULL + * @current_time: the current system time + * + * Stop the current @sess and schedule a BYE message for the other members. + * + * Returns: a #GstFlowReturn. + */ +GstFlowReturn +rtp_session_schedule_bye (RTPSession * sess, const gchar * reason, + GstClockTime current_time) +{ + GstFlowReturn result = GST_FLOW_OK; + + g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); + + RTP_SESSION_LOCK (sess); + result = rtp_session_schedule_bye_locked (sess, reason, current_time); + RTP_SESSION_UNLOCK (sess); + + return result; +} + +/** + * rtp_session_next_timeout: + * @sess: an #RTPSession + * @current_time: the current system time + * + * Get the next time we should perform session maintenance tasks. + * + * Returns: a time when rtp_session_on_timeout() should be called with the + * current system time. + */ +GstClockTime +rtp_session_next_timeout (RTPSession * sess, GstClockTime current_time) +{ + GstClockTime result, interval = 0; + + g_return_val_if_fail (RTP_IS_SESSION (sess), GST_CLOCK_TIME_NONE); + + RTP_SESSION_LOCK (sess); + + if (GST_CLOCK_TIME_IS_VALID (sess->next_early_rtcp_time)) { + result = sess->next_early_rtcp_time; + goto early_exit; + } + + result = sess->next_rtcp_check_time; + + GST_DEBUG ("current time: %" GST_TIME_FORMAT ", next :%" GST_TIME_FORMAT, + GST_TIME_ARGS (current_time), GST_TIME_ARGS (result)); + + if (result < current_time) { + GST_DEBUG ("take current time as base"); + /* our previous check time expired, start counting from the current time + * again. */ + result = current_time; + } + + if (sess->source->received_bye) { + if (sess->sent_bye) { + GST_DEBUG ("we sent BYE already"); + interval = GST_CLOCK_TIME_NONE; + } else if (sess->stats.active_sources >= 50) { + GST_DEBUG ("reconsider BYE, more than 50 sources"); + /* reconsider BYE if members >= 50 */ + interval = calculate_rtcp_interval (sess, FALSE, TRUE); + } + } else { + if (sess->first_rtcp) { + GST_DEBUG ("first RTCP packet"); + /* we are called for the first time */ + interval = calculate_rtcp_interval (sess, FALSE, TRUE); + } else if (sess->next_rtcp_check_time < current_time) { + GST_DEBUG ("old check time expired, getting new timeout"); + /* get a new timeout when we need to */ + interval = calculate_rtcp_interval (sess, FALSE, FALSE); + } + } + + if (interval != GST_CLOCK_TIME_NONE) + result += interval; + else + result = GST_CLOCK_TIME_NONE; + + sess->next_rtcp_check_time = result; + +early_exit: + + GST_DEBUG ("current time: %" GST_TIME_FORMAT + ", next time: %" GST_TIME_FORMAT, + GST_TIME_ARGS (current_time), GST_TIME_ARGS (result)); + RTP_SESSION_UNLOCK (sess); + + return result; +} + +typedef struct +{ + RTPSession *sess; + GstBuffer *rtcp; + GstClockTime current_time; + guint64 ntpnstime; + GstClockTime running_time; + GstClockTime interval; + GstRTCPPacket packet; + gboolean is_bye; + gboolean has_sdes; + gboolean is_early; + gboolean may_suppress; +} ReportData; + +static void +session_start_rtcp (RTPSession * sess, ReportData * data) +{ + GstRTCPPacket *packet = &data->packet; + RTPSource *own = sess->source; + + data->rtcp = gst_rtcp_buffer_new (sess->mtu); + + if (RTP_SOURCE_IS_SENDER (own)) { + guint64 ntptime; + guint32 rtptime; + guint32 packet_count, octet_count; + + /* we are a sender, create SR */ + GST_DEBUG ("create SR for SSRC %08x", own->ssrc); + gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_SR, packet); + + /* get latest stats */ + rtp_source_get_new_sr (own, data->ntpnstime, data->running_time, + &ntptime, &rtptime, &packet_count, &octet_count); + /* store stats */ + rtp_source_process_sr (own, data->current_time, ntptime, rtptime, + packet_count, octet_count); + + /* fill in sender report info */ + gst_rtcp_packet_sr_set_sender_info (packet, own->ssrc, + ntptime, rtptime, packet_count, octet_count); + } else { + /* we are only receiver, create RR */ + GST_DEBUG ("create RR for SSRC %08x", own->ssrc); + gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_RR, packet); + gst_rtcp_packet_rr_set_ssrc (packet, own->ssrc); + } +} + +/* construct a Sender or Receiver Report */ +static void +session_report_blocks (const gchar * key, RTPSource * source, ReportData * data) +{ + RTPSession *sess = data->sess; + GstRTCPPacket *packet = &data->packet; + + /* create a new buffer if needed */ + if (data->rtcp == NULL) { + session_start_rtcp (sess, data); + } else if (data->is_early) { + /* Put a single RR or SR in minimal compound packets */ + return; + } + if (gst_rtcp_packet_get_rb_count (packet) < GST_RTCP_MAX_RB_COUNT) { + /* only report about other sender sources */ + if (source != sess->source && RTP_SOURCE_IS_SENDER (source)) { + guint8 fractionlost; + gint32 packetslost; + guint32 exthighestseq, jitter; + guint32 lsr, dlsr; + + /* get new stats */ + rtp_source_get_new_rb (source, data->current_time, &fractionlost, + &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); + + /* store last generated RR packet */ + source->last_rr.is_valid = TRUE; + source->last_rr.fractionlost = fractionlost; + source->last_rr.packetslost = packetslost; + source->last_rr.exthighestseq = exthighestseq; + source->last_rr.jitter = jitter; + source->last_rr.lsr = lsr; + source->last_rr.dlsr = dlsr; + + /* packet is not yet filled, add report block for this source. */ + gst_rtcp_packet_add_rb (packet, source->ssrc, fractionlost, packetslost, + exthighestseq, jitter, lsr, dlsr); + } + } +} + +/* perform cleanup of sources that timed out */ +static void +session_cleanup (const gchar * key, RTPSource * source, ReportData * data) +{ + gboolean remove = FALSE; + gboolean byetimeout = FALSE; + gboolean sendertimeout = FALSE; + gboolean is_sender, is_active; + RTPSession *sess = data->sess; + GstClockTime interval, binterval; + GstClockTime btime; + + is_sender = RTP_SOURCE_IS_SENDER (source); + is_active = RTP_SOURCE_IS_ACTIVE (source); + + /* our own rtcp interval may have been forced low by secondary configuration, + * while sender side may still operate with higher interval, + * so do not just take our interval to decide on timing out sender, + * but take (if data->interval <= 5 * GST_SECOND): + * interval = CLAMP (sender_interval, data->interval, 5 * GST_SECOND) + * where sender_interval is difference between last 2 received RTCP reports + */ + if (data->interval >= 5 * GST_SECOND || (source == sess->source)) { + binterval = data->interval; + } else { + GST_LOG ("prev_rtcp %" GST_TIME_FORMAT ", last_rtcp %" GST_TIME_FORMAT, + GST_TIME_ARGS (source->stats.prev_rtcptime), + GST_TIME_ARGS (source->stats.last_rtcptime)); + /* if not received enough yet, fallback to larger default */ + if (source->stats.last_rtcptime > source->stats.prev_rtcptime) + binterval = source->stats.last_rtcptime - source->stats.prev_rtcptime; + else + binterval = 5 * GST_SECOND; + binterval = CLAMP (binterval, data->interval, 5 * GST_SECOND); + } + GST_LOG ("timeout base interval %" GST_TIME_FORMAT, + GST_TIME_ARGS (binterval)); + + /* check for our own source, we don't want to delete our own source. */ + if (!(source == sess->source)) { + if (source->received_bye) { + /* if we received a BYE from the source, remove the source after some + * time. */ + if (data->current_time > source->bye_time && + data->current_time - source->bye_time > sess->stats.bye_timeout) { + GST_DEBUG ("removing BYE source %08x", source->ssrc); + remove = TRUE; + byetimeout = TRUE; + } + } + /* sources that were inactive for more than 5 times the deterministic reporting + * interval get timed out. the min timeout is 5 seconds. */ + /* mind old time that might pre-date last time going to PLAYING */ + btime = MAX (source->last_activity, sess->start_time); + if (data->current_time > btime) { + interval = MAX (binterval * 5, 5 * GST_SECOND); + if (data->current_time - btime > interval) { + GST_DEBUG ("removing timeout source %08x, last %" GST_TIME_FORMAT, + source->ssrc, GST_TIME_ARGS (btime)); + remove = TRUE; + } + } + } + + /* senders that did not send for a long time become a receiver, this also + * holds for our own source. */ + if (is_sender) { + /* mind old time that might pre-date last time going to PLAYING */ + btime = MAX (source->last_rtp_activity, sess->start_time); + if (data->current_time > btime) { + interval = MAX (binterval * 2, 5 * GST_SECOND); + if (data->current_time - btime > interval) { + GST_DEBUG ("sender source %08x timed out and became receiver, last %" + GST_TIME_FORMAT, source->ssrc, GST_TIME_ARGS (btime)); + source->is_sender = FALSE; + sess->stats.sender_sources--; + sendertimeout = TRUE; + } + } + } + + if (remove) { + sess->total_sources--; + if (is_sender) + sess->stats.sender_sources--; + if (is_active) + sess->stats.active_sources--; + + if (byetimeout) + on_bye_timeout (sess, source); + else + on_timeout (sess, source); + } else { + if (sendertimeout) + on_sender_timeout (sess, source); + } + + source->closing = remove; +} + +static void +session_sdes (RTPSession * sess, ReportData * data) +{ + GstRTCPPacket *packet = &data->packet; + const GstStructure *sdes; + gint i, n_fields; + + /* add SDES packet */ + gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_SDES, packet); + + gst_rtcp_packet_sdes_add_item (packet, sess->source->ssrc); + + sdes = rtp_source_get_sdes_struct (sess->source); + + /* add all fields in the structure, the order is not important. */ + n_fields = gst_structure_n_fields (sdes); + for (i = 0; i < n_fields; ++i) { + const gchar *field; + const gchar *value; + GstRTCPSDESType type; + + field = gst_structure_nth_field_name (sdes, i); + if (field == NULL) + continue; + value = gst_structure_get_string (sdes, field); + if (value == NULL) + continue; + type = gst_rtcp_sdes_name_to_type (field); + + /* Early packets are minimal and only include the CNAME */ + if (data->is_early && type != GST_RTCP_SDES_CNAME) + continue; + + if (type > GST_RTCP_SDES_END && type < GST_RTCP_SDES_PRIV) { + gst_rtcp_packet_sdes_add_entry (packet, type, strlen (value), + (const guint8 *) value); + } else if (type == GST_RTCP_SDES_PRIV) { + gsize prefix_len; + gsize value_len; + gsize data_len; + guint8 data[256]; + + /* don't accept entries that are too big */ + prefix_len = strlen (field); + if (prefix_len > 255) + continue; + value_len = strlen (value); + if (value_len > 255) + continue; + data_len = 1 + prefix_len + value_len; + if (data_len > 255) + continue; + + data[0] = prefix_len; + memcpy (&data[1], field, prefix_len); + memcpy (&data[1 + prefix_len], value, value_len); + + gst_rtcp_packet_sdes_add_entry (packet, type, data_len, data); + } + } + + data->has_sdes = TRUE; +} + +/* schedule a BYE packet */ +static void +session_bye (RTPSession * sess, ReportData * data) +{ + GstRTCPPacket *packet = &data->packet; + + /* open packet */ + session_start_rtcp (sess, data); + + /* add SDES */ + session_sdes (sess, data); + + /* add a BYE packet */ + gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_BYE, packet); + gst_rtcp_packet_bye_add_ssrc (packet, sess->source->ssrc); + if (sess->bye_reason) + gst_rtcp_packet_bye_set_reason (packet, sess->bye_reason); + + /* we have a BYE packet now */ + data->is_bye = TRUE; +} + +static gboolean +is_rtcp_time (RTPSession * sess, GstClockTime current_time, ReportData * data) +{ + GstClockTime new_send_time, elapsed; + + if (data->is_early && sess->next_early_rtcp_time < current_time) + goto early; + + /* no need to check yet */ + if (sess->next_rtcp_check_time > current_time) { + GST_DEBUG ("no check time yet, next %" GST_TIME_FORMAT " > now %" + GST_TIME_FORMAT, GST_TIME_ARGS (sess->next_rtcp_check_time), + GST_TIME_ARGS (current_time)); + return FALSE; + } + + /* get elapsed time since we last reported */ + elapsed = current_time - sess->last_rtcp_send_time; + + /* perform forward reconsideration */ + new_send_time = rtp_stats_add_rtcp_jitter (&sess->stats, data->interval); + + GST_DEBUG ("forward reconsideration %" GST_TIME_FORMAT ", elapsed %" + GST_TIME_FORMAT, GST_TIME_ARGS (new_send_time), GST_TIME_ARGS (elapsed)); + + new_send_time += sess->last_rtcp_send_time; + + /* check if reconsideration */ + if (current_time < new_send_time) { + GST_DEBUG ("reconsider RTCP for %" GST_TIME_FORMAT, + GST_TIME_ARGS (new_send_time)); + /* store new check time */ + sess->next_rtcp_check_time = new_send_time; + return FALSE; + } + +early: + + new_send_time = calculate_rtcp_interval (sess, FALSE, FALSE); + + GST_DEBUG ("can send RTCP now, next interval %" GST_TIME_FORMAT, + GST_TIME_ARGS (new_send_time)); + sess->next_rtcp_check_time = current_time + new_send_time; + + /* Apply the rules from RFC 4585 section 3.5.3 */ + if (sess->stats.min_interval != 0 && !sess->first_rtcp) { + GstClockTimeDiff T_rr_current_interval = g_random_double_range (0.5, 1.5) * + sess->stats.min_interval; + + /* This will caused the RTCP to be suppressed if no FB packets are added */ + if (sess->last_rtcp_send_time + T_rr_current_interval > + sess->next_rtcp_check_time) { + GST_DEBUG ("RTCP packet could be suppressed min: %" GST_TIME_FORMAT + " last: %" GST_TIME_FORMAT + " + T_rr_current_interval: %" GST_TIME_FORMAT + " > sess->next_rtcp_check_time: %" GST_TIME_FORMAT, + GST_TIME_ARGS (sess->stats.min_interval), + GST_TIME_ARGS (sess->last_rtcp_send_time), + GST_TIME_ARGS (T_rr_current_interval), + GST_TIME_ARGS (sess->next_rtcp_check_time)); + data->may_suppress = TRUE; + } + } + + return TRUE; +} + +static void +clone_ssrcs_hashtable (gchar * key, RTPSource * source, GHashTable * hash_table) +{ + g_hash_table_insert (hash_table, key, g_object_ref (source)); +} + +static gboolean +remove_closing_sources (const gchar * key, RTPSource * source, gpointer * data) +{ + return source->closing; +} + +/** + * rtp_session_on_timeout: + * @sess: an #RTPSession + * @current_time: the current system time + * @ntpnstime: the current NTP time in nanoseconds + * @running_time: the current running_time of the pipeline + * + * Perform maintenance actions after the timeout obtained with + * rtp_session_next_timeout() expired. + * + * This function will perform timeouts of receivers and senders, send a BYE + * packet or generate RTCP packets with current session stats. + * + * This function can call the #RTPSessionSendRTCP callback, possibly multiple + * times, for each packet that should be processed. + * + * Returns: a #GstFlowReturn. + */ +GstFlowReturn +rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time, + guint64 ntpnstime, GstClockTime running_time) +{ + GstFlowReturn result = GST_FLOW_OK; + ReportData data; + RTPSource *own; + GHashTable *table_copy; + gboolean notify = FALSE; + + g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); + + GST_DEBUG ("reporting at %" GST_TIME_FORMAT ", NTP time %" GST_TIME_FORMAT, + GST_TIME_ARGS (current_time), GST_TIME_ARGS (ntpnstime)); + + data.sess = sess; + data.rtcp = NULL; + data.current_time = current_time; + data.ntpnstime = ntpnstime; + data.is_bye = FALSE; + data.has_sdes = FALSE; + data.may_suppress = FALSE; + data.running_time = running_time; + + own = sess->source; + + RTP_SESSION_LOCK (sess); + /* get a new interval, we need this for various cleanups etc */ + data.interval = calculate_rtcp_interval (sess, TRUE, sess->first_rtcp); + + /* Make a local copy of the hashtable. We need to do this because the + * cleanup stage below releases the session lock. */ + table_copy = g_hash_table_new_full (NULL, NULL, NULL, + (GDestroyNotify) g_object_unref); + g_hash_table_foreach (sess->ssrcs[sess->mask_idx], + (GHFunc) clone_ssrcs_hashtable, table_copy); + + /* Clean up the session, mark the source for removing, this might release the + * session lock. */ + g_hash_table_foreach (table_copy, (GHFunc) session_cleanup, &data); + g_hash_table_destroy (table_copy); + + /* Now remove the marked sources */ + g_hash_table_foreach_remove (sess->ssrcs[sess->mask_idx], + (GHRFunc) remove_closing_sources, NULL); + + if (GST_CLOCK_TIME_IS_VALID (sess->next_early_rtcp_time)) + data.is_early = TRUE; + else + data.is_early = FALSE; + + /* see if we need to generate SR or RR packets */ + if (is_rtcp_time (sess, current_time, &data)) { + if (own->received_bye) { + /* generate BYE instead */ + GST_DEBUG ("generating BYE message"); + session_bye (sess, &data); + sess->sent_bye = TRUE; + } else { + /* loop over all known sources and do something */ + g_hash_table_foreach (sess->ssrcs[sess->mask_idx], + (GHFunc) session_report_blocks, &data); + } + } + + if (data.rtcp) { + /* we keep track of the last report time in order to timeout inactive + * receivers or senders */ + if (!data.is_early && !data.may_suppress) + sess->last_rtcp_send_time = data.current_time; + sess->first_rtcp = FALSE; + sess->next_early_rtcp_time = GST_CLOCK_TIME_NONE; + + /* add SDES for this source when not already added */ + if (!data.has_sdes) + session_sdes (sess, &data); + } + + /* check for outdated collisions */ + GST_DEBUG ("Timing out collisions"); + rtp_source_timeout (sess->source, current_time, + /* "a relatively long time" -- RFC 3550 section 8.2 */ + RTP_STATS_MIN_INTERVAL * GST_SECOND * 10, + running_time - sess->rtcp_feedback_retention_window); + + if (sess->change_ssrc) { + GST_DEBUG ("need to change our SSRC (%08x)", own->ssrc); + g_hash_table_steal (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (own->ssrc)); + + own->ssrc = rtp_session_create_new_ssrc (sess); + rtp_source_reset (own); + + g_hash_table_insert (sess->ssrcs[sess->mask_idx], + GINT_TO_POINTER (own->ssrc), own); + + g_free (sess->bye_reason); + sess->bye_reason = NULL; + sess->sent_bye = FALSE; + sess->change_ssrc = FALSE; + notify = TRUE; + GST_DEBUG ("changed our SSRC to %08x", own->ssrc); + } + + sess->allow_early = TRUE; + + RTP_SESSION_UNLOCK (sess); + + if (notify) + g_object_notify (G_OBJECT (sess), "internal-ssrc"); + + /* push out the RTCP packet */ + if (data.rtcp) { + gboolean do_not_suppress; + + /* Give the user a change to add its own packet */ + g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SENDING_RTCP], 0, + data.rtcp, data.is_early, &do_not_suppress); + + if (sess->callbacks.send_rtcp && (do_not_suppress || !data.may_suppress)) { + guint packet_size; + + /* close the RTCP packet */ + gst_rtcp_buffer_end (data.rtcp); + + packet_size = GST_BUFFER_SIZE (data.rtcp) + sess->header_len; + + UPDATE_AVG (sess->stats.avg_rtcp_packet_size, packet_size); + GST_DEBUG ("%p, sending RTCP packet, avg size %u, %u", &sess->stats, + sess->stats.avg_rtcp_packet_size, packet_size); + result = + sess->callbacks.send_rtcp (sess, own, data.rtcp, sess->sent_bye, + sess->send_rtcp_user_data); + } else { + GST_DEBUG ("freeing packet callback: %p" + " do_not_suppress: %d may_suppress: %d", + sess->callbacks.send_rtcp, do_not_suppress, data.may_suppress); + gst_buffer_unref (data.rtcp); + } + } + + return result; +} + +void +rtp_session_request_early_rtcp (RTPSession * sess, GstClockTime current_time, + GstClockTimeDiff max_delay) +{ + GstClockTime T_dither_max; + + /* Implements the algorithm described in RFC 4585 section 3.5.2 */ + + RTP_SESSION_LOCK (sess); + + /* Check if already requested */ + /* RFC 4585 section 3.5.2 step 2 */ + if (GST_CLOCK_TIME_IS_VALID (sess->next_early_rtcp_time)) + goto dont_send; + + /* Ignore the request a scheduled packet will be in time anyway */ + if (current_time + max_delay > sess->next_rtcp_check_time) + goto dont_send; + + /* RFC 4585 section 3.5.2 step 2b */ + /* If the total sources is <=2, then there is only us and one peer */ + if (sess->total_sources <= 2) { + T_dither_max = 0; + } else { + /* Divide by 2 because l = 0.5 */ + T_dither_max = sess->next_rtcp_check_time - sess->last_rtcp_send_time; + T_dither_max /= 2; + } + + /* RFC 4585 section 3.5.2 step 3 */ + if (current_time + T_dither_max > sess->next_rtcp_check_time) + goto dont_send; + + /* RFC 4585 section 3.5.2 step 4 + * Don't send if allow_early is FALSE, but not if we are in + * immediate mode, meaning we are part of a group of at most the + * application-specific threshold. + */ + if (sess->total_sources > sess->rtcp_immediate_feedback_threshold && + sess->allow_early == FALSE) + goto dont_send; + + if (T_dither_max) { + /* Schedule an early transmission later */ + sess->next_early_rtcp_time = g_random_double () * T_dither_max + + current_time; + } else { + /* If no dithering, schedule it for NOW */ + sess->next_early_rtcp_time = current_time; + } + + RTP_SESSION_UNLOCK (sess); + + /* notify app of need to send packet early + * and therefore of timeout change */ + if (sess->callbacks.reconsider) + sess->callbacks.reconsider (sess, sess->reconsider_user_data); + + return; + +dont_send: + + RTP_SESSION_UNLOCK (sess); +} + +gboolean +rtp_session_request_key_unit (RTPSession * sess, guint32 ssrc, GstClockTime now, + gboolean fir, gint count) +{ + RTPSource *src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], + GUINT_TO_POINTER (ssrc)); + + if (!src) + return FALSE; + + if (fir) { + src->send_pli = FALSE; + src->send_fir = TRUE; + + if (count == -1 || count != src->last_fir_count) + src->current_send_fir_seqnum++; + src->last_fir_count = count; + } else if (!src->send_fir) { + src->send_pli = TRUE; + } + + rtp_session_request_early_rtcp (sess, now, 200 * GST_MSECOND); + + return TRUE; +} + +static gboolean +has_pli_compare_func (gconstpointer a, gconstpointer ignored) +{ + GstRTCPPacket packet; + + packet.buffer = (GstBuffer *) a; + packet.offset = 0; + + if (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_PSFB && + gst_rtcp_packet_fb_get_type (&packet) == GST_RTCP_PSFB_TYPE_PLI) + return TRUE; + else + return FALSE; +} + +static gboolean +rtp_session_on_sending_rtcp (RTPSession * sess, GstBuffer * buffer, + gboolean early) +{ + gboolean ret = FALSE; + GHashTableIter iter; + gpointer key, value; + gboolean started_fir = FALSE; + GstRTCPPacket fir_rtcppacket; + + RTP_SESSION_LOCK (sess); + + g_hash_table_iter_init (&iter, sess->ssrcs[sess->mask_idx]); + while (g_hash_table_iter_next (&iter, &key, &value)) { + guint media_ssrc = GPOINTER_TO_UINT (key); + RTPSource *media_src = value; + guint8 *fci_data; + + if (media_src->send_fir) { + if (!started_fir) { + if (!gst_rtcp_buffer_add_packet (buffer, GST_RTCP_TYPE_PSFB, + &fir_rtcppacket)) + break; + gst_rtcp_packet_fb_set_type (&fir_rtcppacket, GST_RTCP_PSFB_TYPE_FIR); + gst_rtcp_packet_fb_set_sender_ssrc (&fir_rtcppacket, + rtp_source_get_ssrc (sess->source)); + gst_rtcp_packet_fb_set_media_ssrc (&fir_rtcppacket, 0); + + if (!gst_rtcp_packet_fb_set_fci_length (&fir_rtcppacket, 2)) { + gst_rtcp_packet_remove (&fir_rtcppacket); + break; + } + ret = TRUE; + started_fir = TRUE; + } else { + if (!gst_rtcp_packet_fb_set_fci_length (&fir_rtcppacket, + !gst_rtcp_packet_fb_get_fci_length (&fir_rtcppacket) + 2)) + break; + } + + fci_data = gst_rtcp_packet_fb_get_fci (&fir_rtcppacket) - + ((gst_rtcp_packet_fb_get_fci_length (&fir_rtcppacket) - 2) * 4); + + GST_WRITE_UINT32_BE (fci_data, media_ssrc); + fci_data += 4; + fci_data[0] = media_src->current_send_fir_seqnum; + fci_data[1] = fci_data[2] = fci_data[3] = 0; + media_src->send_fir = FALSE; + } + } + + g_hash_table_iter_init (&iter, sess->ssrcs[sess->mask_idx]); + while (g_hash_table_iter_next (&iter, &key, &value)) { + guint media_ssrc = GPOINTER_TO_UINT (key); + RTPSource *media_src = value; + GstRTCPPacket pli_rtcppacket; + + if (media_src->send_pli && !rtp_source_has_retained (media_src, + has_pli_compare_func, NULL)) { + if (gst_rtcp_buffer_add_packet (buffer, GST_RTCP_TYPE_PSFB, + &pli_rtcppacket)) { + gst_rtcp_packet_fb_set_type (&pli_rtcppacket, GST_RTCP_PSFB_TYPE_PLI); + gst_rtcp_packet_fb_set_sender_ssrc (&pli_rtcppacket, + rtp_source_get_ssrc (sess->source)); + gst_rtcp_packet_fb_set_media_ssrc (&pli_rtcppacket, media_ssrc); + ret = TRUE; + } else { + /* Break because the packet is full, will put next request in a + * further packet + */ + break; + } + } + media_src->send_pli = FALSE; + } + + RTP_SESSION_UNLOCK (sess); + + return ret; +} + +static void +rtp_session_send_rtcp (RTPSession * sess, GstClockTimeDiff max_delay) +{ + GstClockTime now; + + if (!sess->callbacks.send_rtcp) + return; + + now = sess->callbacks.request_time (sess, sess->request_time_user_data); + + rtp_session_request_early_rtcp (sess, now, max_delay); +} diff --git a/gst/rtpmanager/rtpsession.h b/gst/rtpmanager/rtpsession.h new file mode 100644 index 0000000..ecc0b98 --- /dev/null +++ b/gst/rtpmanager/rtpsession.h @@ -0,0 +1,358 @@ +/* GStreamer + * Copyright (C) <2007> 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. + */ + +#ifndef __RTP_SESSION_H__ +#define __RTP_SESSION_H__ + +#include <gst/gst.h> +#include <gst/netbuffer/gstnetbuffer.h> + +#include "rtpsource.h" + +typedef struct _RTPSession RTPSession; +typedef struct _RTPSessionClass RTPSessionClass; + +#define RTP_TYPE_SESSION (rtp_session_get_type()) +#define RTP_SESSION(sess) (G_TYPE_CHECK_INSTANCE_CAST((sess),RTP_TYPE_SESSION,RTPSession)) +#define RTP_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_SESSION,RTPSessionClass)) +#define RTP_IS_SESSION(sess) (G_TYPE_CHECK_INSTANCE_TYPE((sess),RTP_TYPE_SESSION)) +#define RTP_IS_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_SESSION)) +#define RTP_SESSION_CAST(sess) ((RTPSession *)(sess)) + +#define RTP_SESSION_LOCK(sess) (g_mutex_lock ((sess)->lock)) +#define RTP_SESSION_UNLOCK(sess) (g_mutex_unlock ((sess)->lock)) + +/** + * RTPSessionProcessRTP: + * @sess: an #RTPSession + * @src: the #RTPSource + * @buffer: the RTP buffer ready for processing + * @user_data: user data specified when registering + * + * This callback will be called when @sess has @buffer ready for further + * processing. Processing the buffer typically includes decoding and displaying + * the buffer. + * + * Returns: a #GstFlowReturn. + */ +typedef GstFlowReturn (*RTPSessionProcessRTP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data); + +/** + * RTPSessionSendRTP: + * @sess: an #RTPSession + * @src: the #RTPSource + * @buffer: the RTP buffer ready for sending + * @user_data: user data specified when registering + * + * This callback will be called when @sess has @buffer ready for sending to + * all listening participants in this session. + * + * Returns: a #GstFlowReturn. + */ +typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, gpointer data, gpointer user_data); + +/** + * RTPSessionSendRTCP: + * @sess: an #RTPSession + * @src: the #RTPSource + * @buffer: the RTCP buffer ready for sending + * @eos: if an EOS event should be pushed + * @user_data: user data specified when registering + * + * This callback will be called when @sess has @buffer ready for sending to + * all listening participants in this session. + * + * Returns: a #GstFlowReturn. + */ +typedef GstFlowReturn (*RTPSessionSendRTCP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, + gboolean eos, gpointer user_data); + +/** + * RTPSessionSyncRTCP: + * @sess: an #RTPSession + * @src: the #RTPSource + * @buffer: the RTCP buffer ready for synchronisation + * @user_data: user data specified when registering + * + * This callback will be called when @sess has an SR @buffer ready for doing + * synchronisation between streams. + * + * Returns: a #GstFlowReturn. + */ +typedef GstFlowReturn (*RTPSessionSyncRTCP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data); + +/** + * RTPSessionClockRate: + * @sess: an #RTPSession + * @payload: the payload + * @user_data: user data specified when registering + * + * This callback will be called when @sess needs the clock-rate of @payload. + * + * Returns: the clock-rate of @pt. + */ +typedef gint (*RTPSessionClockRate) (RTPSession *sess, guint8 payload, gpointer user_data); + +/** + * RTPSessionReconsider: + * @sess: an #RTPSession + * @user_data: user data specified when registering + * + * This callback will be called when @sess needs to cancel the current timeout. + * The currently running timeout should be canceled and a new reporting interval + * should be requested from @sess. + */ +typedef void (*RTPSessionReconsider) (RTPSession *sess, gpointer user_data); + +/** + * RTPSessionRequestKeyUnit: + * @sess: an #RTPSession + * @all_headers: %TRUE if "all-headers" property should be set on the key unit + * request + * @user_data: user data specified when registering +* + * Asks the encoder to produce a key unit as soon as possibly within the + * bandwidth constraints + */ +typedef void (*RTPSessionRequestKeyUnit) (RTPSession *sess, + gboolean all_headers, gpointer user_data); + +/** + * RTPSessionRequestTime: + * @sess: an #RTPSession + * @user_data: user data specified when registering + * + * This callback will be called when @sess needs the current time. The time + * should be returned as a #GstClockTime + */ +typedef GstClockTime (*RTPSessionRequestTime) (RTPSession *sess, + gpointer user_data); + +/** + * RTPSessionCallbacks: + * @RTPSessionProcessRTP: callback to process RTP packets + * @RTPSessionSendRTP: callback for sending RTP packets + * @RTPSessionSendRTCP: callback for sending RTCP packets + * @RTPSessionSyncRTCP: callback for handling SR packets + * @RTPSessionReconsider: callback for reconsidering the timeout + * @RTPSessionRequestKeyUnit: callback for requesting a new key unit + * + * These callbacks can be installed on the session manager to get notification + * when RTP and RTCP packets are ready for further processing. These callbacks + * are not implemented with signals for performance reasons. + */ +typedef struct { + RTPSessionProcessRTP process_rtp; + RTPSessionSendRTP send_rtp; + RTPSessionSyncRTCP sync_rtcp; + RTPSessionSendRTCP send_rtcp; + RTPSessionClockRate clock_rate; + RTPSessionReconsider reconsider; + RTPSessionRequestKeyUnit request_key_unit; + RTPSessionRequestTime request_time; +} RTPSessionCallbacks; + +/** + * RTPSession: + * @lock: lock to protect the session + * @source: the source of this session + * @ssrcs: Hashtable of sources indexed by SSRC + * @cnames: Hashtable of sources indexed by CNAME + * @num_sources: the number of sources + * @activecount: the number of active sources + * @callbacks: callbacks + * @user_data: user data passed in callbacks + * @stats: session statistics + * + * The RTP session manager object + */ +struct _RTPSession { + GObject object; + + GMutex *lock; + + guint header_len; + guint mtu; + + /* bandwidths */ + gboolean recalc_bandwidth; + guint bandwidth; + gdouble rtcp_bandwidth; + guint rtcp_rr_bandwidth; + guint rtcp_rs_bandwidth; + + RTPSource *source; + + /* for sender/receiver counting */ + guint32 key; + guint32 mask_idx; + guint32 mask; + GHashTable *ssrcs[32]; + GHashTable *cnames; + guint total_sources; + + GstClockTime next_rtcp_check_time; + GstClockTime last_rtcp_send_time; + GstClockTime start_time; + gboolean first_rtcp; + gboolean allow_early; + + GstClockTime next_early_rtcp_time; + + gchar *bye_reason; + gboolean sent_bye; + + RTPSessionCallbacks callbacks; + gpointer process_rtp_user_data; + gpointer send_rtp_user_data; + gpointer send_rtcp_user_data; + gpointer sync_rtcp_user_data; + gpointer clock_rate_user_data; + gpointer reconsider_user_data; + gpointer request_key_unit_user_data; + gpointer request_time_user_data; + + RTPSessionStats stats; + + gboolean change_ssrc; + gboolean favor_new; + GstClockTime rtcp_feedback_retention_window; + guint rtcp_immediate_feedback_threshold; + + GstClockTime last_keyframe_request; + gboolean last_keyframe_all_headers; +}; + +/** + * RTPSessionClass: + * @on_new_ssrc: emited when a new source is found + * @on_bye_ssrc: emited when a source is gone + * + * The session class. + */ +struct _RTPSessionClass { + GObjectClass parent_class; + + /* action signals */ + RTPSource* (*get_source_by_ssrc) (RTPSession *sess, guint32 ssrc); + + /* signals */ + void (*on_new_ssrc) (RTPSession *sess, RTPSource *source); + void (*on_ssrc_collision) (RTPSession *sess, RTPSource *source); + void (*on_ssrc_validated) (RTPSession *sess, RTPSource *source); + void (*on_ssrc_active) (RTPSession *sess, RTPSource *source); + void (*on_ssrc_sdes) (RTPSession *sess, RTPSource *source); + void (*on_bye_ssrc) (RTPSession *sess, RTPSource *source); + void (*on_bye_timeout) (RTPSession *sess, RTPSource *source); + void (*on_timeout) (RTPSession *sess, RTPSource *source); + void (*on_sender_timeout) (RTPSession *sess, RTPSource *source); + gboolean (*on_sending_rtcp) (RTPSession *sess, GstBuffer *buffer, + gboolean early); + void (*on_feedback_rtcp) (RTPSession *sess, guint type, guint fbtype, + guint sender_ssrc, guint media_ssrc, GstBuffer *fci); + void (*send_rtcp) (RTPSession *sess, GstClockTimeDiff max_delay); +}; + +GType rtp_session_get_type (void); + +/* create and configure */ +RTPSession* rtp_session_new (void); +void rtp_session_set_callbacks (RTPSession *sess, + RTPSessionCallbacks *callbacks, + gpointer user_data); +void rtp_session_set_process_rtp_callback (RTPSession * sess, + RTPSessionProcessRTP callback, + gpointer user_data); +void rtp_session_set_send_rtp_callback (RTPSession * sess, + RTPSessionSendRTP callback, + gpointer user_data); +void rtp_session_set_send_rtcp_callback (RTPSession * sess, + RTPSessionSendRTCP callback, + gpointer user_data); +void rtp_session_set_sync_rtcp_callback (RTPSession * sess, + RTPSessionSyncRTCP callback, + gpointer user_data); +void rtp_session_set_clock_rate_callback (RTPSession * sess, + RTPSessionClockRate callback, + gpointer user_data); +void rtp_session_set_reconsider_callback (RTPSession * sess, + RTPSessionReconsider callback, + gpointer user_data); +void rtp_session_set_request_time_callback (RTPSession * sess, + RTPSessionRequestTime callback, + gpointer user_data); + +void rtp_session_set_bandwidth (RTPSession *sess, gdouble bandwidth); +gdouble rtp_session_get_bandwidth (RTPSession *sess); +void rtp_session_set_rtcp_fraction (RTPSession *sess, gdouble fraction); +gdouble rtp_session_get_rtcp_fraction (RTPSession *sess); + +gboolean rtp_session_set_sdes_string (RTPSession *sess, GstRTCPSDESType type, + const gchar *cname); +gchar* rtp_session_get_sdes_string (RTPSession *sess, GstRTCPSDESType type); + +GstStructure * rtp_session_get_sdes_struct (RTPSession *sess); +void rtp_session_set_sdes_struct (RTPSession *sess, const GstStructure *sdes); + +/* handling sources */ +RTPSource* rtp_session_get_internal_source (RTPSession *sess); + +void rtp_session_set_internal_ssrc (RTPSession *sess, guint32 ssrc); +guint32 rtp_session_get_internal_ssrc (RTPSession *sess); + +gboolean rtp_session_add_source (RTPSession *sess, RTPSource *src); +guint rtp_session_get_num_sources (RTPSession *sess); +guint rtp_session_get_num_active_sources (RTPSession *sess); +RTPSource* rtp_session_get_source_by_ssrc (RTPSession *sess, guint32 ssrc); +RTPSource* rtp_session_get_source_by_cname (RTPSession *sess, const gchar *cname); +RTPSource* rtp_session_create_source (RTPSession *sess); + +/* processing packets from receivers */ +GstFlowReturn rtp_session_process_rtp (RTPSession *sess, GstBuffer *buffer, + GstClockTime current_time, + GstClockTime running_time); +GstFlowReturn rtp_session_process_rtcp (RTPSession *sess, GstBuffer *buffer, + GstClockTime current_time, + guint64 ntpnstime); + +/* processing packets for sending */ +GstFlowReturn rtp_session_send_rtp (RTPSession *sess, gpointer data, gboolean is_list, + GstClockTime current_time, GstClockTime running_time); + +/* stopping the session */ +GstFlowReturn rtp_session_schedule_bye (RTPSession *sess, const gchar *reason, + GstClockTime current_time); + +/* get interval for next RTCP interval */ +GstClockTime rtp_session_next_timeout (RTPSession *sess, GstClockTime current_time); +GstFlowReturn rtp_session_on_timeout (RTPSession *sess, GstClockTime current_time, + guint64 ntpnstime, GstClockTime running_time); + +/* request the transmittion of an early RTCP packet */ +void rtp_session_request_early_rtcp (RTPSession * sess, GstClockTime current_time, + GstClockTimeDiff max_delay); + +/* Notify session of a request for a new key unit */ +gboolean rtp_session_request_key_unit (RTPSession * sess, + guint32 ssrc, + GstClockTime now, + gboolean fir, + gint count); + +#endif /* __RTP_SESSION_H__ */ diff --git a/gst/rtpmanager/rtpsource.c b/gst/rtpmanager/rtpsource.c new file mode 100644 index 0000000..f1ee4ac --- /dev/null +++ b/gst/rtpmanager/rtpsource.c @@ -0,0 +1,1801 @@ +/* GStreamer + * Copyright (C) <2007> 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 <string.h> + +#include <gst/rtp/gstrtpbuffer.h> +#include <gst/rtp/gstrtcpbuffer.h> + +#include "rtpsource.h" + +GST_DEBUG_CATEGORY_STATIC (rtp_source_debug); +#define GST_CAT_DEFAULT rtp_source_debug + +#define RTP_MAX_PROBATION_LEN 32 + +/* signals and args */ +enum +{ + LAST_SIGNAL +}; + +#define DEFAULT_SSRC 0 +#define DEFAULT_IS_CSRC FALSE +#define DEFAULT_IS_VALIDATED FALSE +#define DEFAULT_IS_SENDER FALSE +#define DEFAULT_SDES NULL + +enum +{ + PROP_0, + PROP_SSRC, + PROP_IS_CSRC, + PROP_IS_VALIDATED, + PROP_IS_SENDER, + PROP_SDES, + PROP_STATS, + PROP_LAST +}; + +/* GObject vmethods */ +static void rtp_source_finalize (GObject * object); +static void rtp_source_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void rtp_source_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +/* static guint rtp_source_signals[LAST_SIGNAL] = { 0 }; */ + +G_DEFINE_TYPE (RTPSource, rtp_source, G_TYPE_OBJECT); + +static void +rtp_source_class_init (RTPSourceClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = rtp_source_finalize; + + gobject_class->set_property = rtp_source_set_property; + gobject_class->get_property = rtp_source_get_property; + + g_object_class_install_property (gobject_class, PROP_SSRC, + g_param_spec_uint ("ssrc", "SSRC", + "The SSRC of this source", 0, G_MAXUINT, DEFAULT_SSRC, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_IS_CSRC, + g_param_spec_boolean ("is-csrc", "Is CSRC", + "If this SSRC is acting as a contributing source", + DEFAULT_IS_CSRC, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_IS_VALIDATED, + g_param_spec_boolean ("is-validated", "Is Validated", + "If this SSRC is validated", DEFAULT_IS_VALIDATED, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_IS_SENDER, + g_param_spec_boolean ("is-sender", "Is Sender", + "If this SSRC is a sender", DEFAULT_IS_SENDER, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * RTPSource::sdes + * + * The current SDES items of the source. Returns a structure with name + * application/x-rtp-source-sdes and may contain the following fields: + * + * 'cname' G_TYPE_STRING : The canonical name + * 'name' G_TYPE_STRING : The user name + * 'email' G_TYPE_STRING : The user's electronic mail address + * 'phone' G_TYPE_STRING : The user's phone number + * 'location' G_TYPE_STRING : The geographic user location + * 'tool' G_TYPE_STRING : The name of application or tool + * 'note' G_TYPE_STRING : A notice about the source + * + * other fields may be present and these represent private items in + * the SDES where the field name is the prefix. + */ + g_object_class_install_property (gobject_class, PROP_SDES, + g_param_spec_boxed ("sdes", "SDES", + "The SDES information for this source", + GST_TYPE_STRUCTURE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * RTPSource::stats + * + * The statistics of the source. This property returns a GstStructure with + * name application/x-rtp-source-stats with the following fields: + * + * "ssrc" G_TYPE_UINT The SSRC of this source + * "internal" G_TYPE_BOOLEAN If this source is the source of the session + * "validated" G_TYPE_BOOLEAN If the source is validated + * "received-bye" G_TYPE_BOOLEAN If we received a BYE from this source + * "is-csrc" G_TYPE_BOOLEAN If this source was found as CSRC + * "is-sender" G_TYPE_BOOLEAN If this source is a sender + * "seqnum-base" G_TYPE_INT first seqnum if known + * "clock-rate" G_TYPE_INT the clock rate of the media + * + * The following two fields are only present when known. + * + * "rtp-from" G_TYPE_STRING where we received the last RTP packet from + * "rtcp-from" G_TYPE_STRING where we received the last RTCP packet from + * + * The following fields make sense for internal sources and will only increase + * when "is-sender" is TRUE: + * + * "octets-sent" G_TYPE_UINT64 number of bytes we sent + * "packets-sent" G_TYPE_UINT64 number of packets we sent + * + * The following fields make sense for non-internal sources and will only + * increase when "is-sender" is TRUE. + * + * "octets-received" G_TYPE_UINT64 total number of bytes received + * "packets-received" G_TYPE_UINT64 total number of packets received + * + * Following fields are updated when "is-sender" is TRUE. + * + * "bitrate" G_TYPE_UINT64 bitrate in bits per second + * "jitter" G_TYPE_UINT estimated jitter + * "packets-lost" G_TYPE_INT estimated amount of packets lost + * + * The last SR report this source sent. This only updates when "is-sender" is + * TRUE. + * + * "have-sr" G_TYPE_BOOLEAN the source has sent SR + * "sr-ntptime" G_TYPE_UINT64 ntptime of SR + * "sr-rtptime" G_TYPE_UINT rtptime of SR + * "sr-octet-count" G_TYPE_UINT the number of bytes in the SR + * "sr-packet-count" G_TYPE_UINT the number of packets in the SR + * + * The following fields are only present for non-internal sources and + * represent the content of the last RB packet that was sent to this source. + * These values are only updated when the source is sending. + * + * "sent-rb" G_TYPE_BOOLEAN we have sent an RB + * "sent-rb-fractionlost" G_TYPE_UINT calculated lost fraction + * "sent-rb-packetslost" G_TYPE_INT lost packets + * "sent-rb-exthighestseq" G_TYPE_UINT last seen seqnum + * "sent-rb-jitter" G_TYPE_UINT jitter + * "sent-rb-lsr" G_TYPE_UINT last SR time + * "sent-rb-dlsr" G_TYPE_UINT delay since last SR + * + * The following fields are only present for non-internal sources and + * represents the last RB that this source sent. This is only updated + * when the source is receiving data and sending RB blocks. + * + * "have-rb" G_TYPE_BOOLEAN the source has sent RB + * "rb-fractionlost" G_TYPE_UINT lost fraction + * "rb-packetslost" G_TYPE_INT lost packets + * "rb-exthighestseq" G_TYPE_UINT highest received seqnum + * "rb-jitter" G_TYPE_UINT reception jitter + * "rb-lsr" G_TYPE_UINT last SR time + * "rb-dlsr" G_TYPE_UINT delay since last SR + * + * The round trip of this source. This is calculated from the last RB + * values and the recption time of the last RB packet. Only present for + * non-internal sources. + * + * "rb-round-trip" G_TYPE_UINT the round trip time in nanoseconds + */ + g_object_class_install_property (gobject_class, PROP_STATS, + g_param_spec_boxed ("stats", "Stats", + "The stats of this source", GST_TYPE_STRUCTURE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (rtp_source_debug, "rtpsource", 0, "RTP Source"); +} + +/** + * rtp_source_reset: + * @src: an #RTPSource + * + * Reset the stats of @src. + */ +void +rtp_source_reset (RTPSource * src) +{ + src->received_bye = FALSE; + + src->stats.cycles = -1; + src->stats.jitter = 0; + src->stats.transit = -1; + src->stats.curr_sr = 0; + src->stats.curr_rr = 0; +} + +static void +rtp_source_init (RTPSource * src) +{ + /* sources are initialy on probation until we receive enough valid RTP + * packets or a valid RTCP packet */ + src->validated = FALSE; + src->internal = FALSE; + src->probation = RTP_DEFAULT_PROBATION; + src->closing = FALSE; + + src->sdes = gst_structure_new ("application/x-rtp-source-sdes", NULL); + + src->payload = -1; + src->clock_rate = -1; + src->packets = g_queue_new (); + src->seqnum_base = -1; + src->last_rtptime = -1; + + src->retained_feedback = g_queue_new (); + + rtp_source_reset (src); +} + +static void +rtp_source_finalize (GObject * object) +{ + RTPSource *src; + GstBuffer *buffer; + + src = RTP_SOURCE_CAST (object); + + while ((buffer = g_queue_pop_head (src->packets))) + gst_buffer_unref (buffer); + g_queue_free (src->packets); + + gst_structure_free (src->sdes); + + g_free (src->bye_reason); + + gst_caps_replace (&src->caps, NULL); + + g_list_foreach (src->conflicting_addresses, (GFunc) g_free, NULL); + g_list_free (src->conflicting_addresses); + + while ((buffer = g_queue_pop_head (src->retained_feedback))) + gst_buffer_unref (buffer); + g_queue_free (src->retained_feedback); + + G_OBJECT_CLASS (rtp_source_parent_class)->finalize (object); +} + +static GstStructure * +rtp_source_create_stats (RTPSource * src) +{ + GstStructure *s; + gboolean is_sender = src->is_sender; + gboolean internal = src->internal; + gchar address_str[GST_NETADDRESS_MAX_LEN]; + gboolean have_rb; + guint8 fractionlost = 0; + gint32 packetslost = 0; + guint32 exthighestseq = 0; + guint32 jitter = 0; + guint32 lsr = 0; + guint32 dlsr = 0; + guint32 round_trip = 0; + gboolean have_sr; + GstClockTime time = 0; + guint64 ntptime = 0; + guint32 rtptime = 0; + guint32 packet_count = 0; + guint32 octet_count = 0; + + + /* common data for all types of sources */ + s = gst_structure_new ("application/x-rtp-source-stats", + "ssrc", G_TYPE_UINT, (guint) src->ssrc, + "internal", G_TYPE_BOOLEAN, internal, + "validated", G_TYPE_BOOLEAN, src->validated, + "received-bye", G_TYPE_BOOLEAN, src->received_bye, + "is-csrc", G_TYPE_BOOLEAN, src->is_csrc, + "is-sender", G_TYPE_BOOLEAN, is_sender, + "seqnum-base", G_TYPE_INT, src->seqnum_base, + "clock-rate", G_TYPE_INT, src->clock_rate, NULL); + + /* add address and port */ + if (src->have_rtp_from) { + gst_netaddress_to_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) { + gst_netaddress_to_string (&src->rtcp_from, address_str, + sizeof (address_str)); + gst_structure_set (s, "rtcp-from", G_TYPE_STRING, address_str, NULL); + } + + gst_structure_set (s, + "octets-sent", G_TYPE_UINT64, src->stats.octets_sent, + "packets-sent", G_TYPE_UINT64, src->stats.packets_sent, + "octets-received", G_TYPE_UINT64, src->stats.octets_received, + "packets-received", G_TYPE_UINT64, src->stats.packets_received, + "bitrate", G_TYPE_UINT64, src->bitrate, + "packets-lost", G_TYPE_INT, + (gint) rtp_stats_get_packets_lost (&src->stats), "jitter", G_TYPE_UINT, + (guint) (src->stats.jitter >> 4), NULL); + + /* get the last SR. */ + have_sr = rtp_source_get_last_sr (src, &time, &ntptime, &rtptime, + &packet_count, &octet_count); + gst_structure_set (s, + "have-sr", G_TYPE_BOOLEAN, have_sr, + "sr-ntptime", G_TYPE_UINT64, ntptime, + "sr-rtptime", G_TYPE_UINT, (guint) rtptime, + "sr-octet-count", G_TYPE_UINT, (guint) octet_count, + "sr-packet-count", G_TYPE_UINT, (guint) packet_count, NULL); + + if (!internal) { + /* get the last RB we sent */ + gst_structure_set (s, + "sent-rb", G_TYPE_BOOLEAN, src->last_rr.is_valid, + "sent-rb-fractionlost", G_TYPE_UINT, (guint) src->last_rr.fractionlost, + "sent-rb-packetslost", G_TYPE_INT, (gint) src->last_rr.packetslost, + "sent-rb-exthighestseq", G_TYPE_UINT, + (guint) src->last_rr.exthighestseq, "sent-rb-jitter", G_TYPE_UINT, + (guint) src->last_rr.jitter, "sent-rb-lsr", G_TYPE_UINT, + (guint) src->last_rr.lsr, "sent-rb-dlsr", G_TYPE_UINT, + (guint) src->last_rr.dlsr, NULL); + + /* get the last RB */ + have_rb = rtp_source_get_last_rb (src, &fractionlost, &packetslost, + &exthighestseq, &jitter, &lsr, &dlsr, &round_trip); + + gst_structure_set (s, + "have-rb", G_TYPE_BOOLEAN, have_rb, + "rb-fractionlost", G_TYPE_UINT, (guint) fractionlost, + "rb-packetslost", G_TYPE_INT, (gint) packetslost, + "rb-exthighestseq", G_TYPE_UINT, (guint) exthighestseq, + "rb-jitter", G_TYPE_UINT, (guint) jitter, + "rb-lsr", G_TYPE_UINT, (guint) lsr, + "rb-dlsr", G_TYPE_UINT, (guint) dlsr, + "rb-round-trip", G_TYPE_UINT, (guint) round_trip, NULL); + } + + return s; +} + +/** + * rtp_source_get_sdes_struct: + * @src: an #RTPSource + * + * Get the SDES from @src. See the SDES property for more details. + * + * Returns: %GstStructure of type "application/x-rtp-source-sdes". The result is + * valid until the SDES items of @src are modified. + */ +const GstStructure * +rtp_source_get_sdes_struct (RTPSource * src) +{ + g_return_val_if_fail (RTP_IS_SOURCE (src), NULL); + + return src->sdes; +} + +static gboolean +sdes_struct_compare_func (GQuark field_id, const GValue * value, + gpointer user_data) +{ + GstStructure *old; + const gchar *field; + + old = GST_STRUCTURE (user_data); + field = g_quark_to_string (field_id); + + if (!gst_structure_has_field (old, field)) + return FALSE; + + g_assert (G_VALUE_HOLDS_STRING (value)); + + return strcmp (g_value_get_string (value), gst_structure_get_string (old, + field)) == 0; +} + +/** + * rtp_source_set_sdes: + * @src: an #RTPSource + * @sdes: the SDES structure + * + * Store the @sdes in @src. @sdes must be a structure of type + * "application/x-rtp-source-sdes", see the SDES property for more details. + * + * This function takes ownership of @sdes. + * + * Returns: %FALSE if the SDES was unchanged. + */ +gboolean +rtp_source_set_sdes_struct (RTPSource * src, GstStructure * sdes) +{ + gboolean changed; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + g_return_val_if_fail (strcmp (gst_structure_get_name (sdes), + "application/x-rtp-source-sdes") == 0, FALSE); + + changed = !gst_structure_foreach (sdes, sdes_struct_compare_func, src->sdes); + + if (changed) { + gst_structure_free (src->sdes); + src->sdes = sdes; + } else { + gst_structure_free (sdes); + } + + return changed; +} + +static void +rtp_source_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + RTPSource *src; + + src = RTP_SOURCE (object); + + switch (prop_id) { + case PROP_SSRC: + src->ssrc = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +rtp_source_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + RTPSource *src; + + src = RTP_SOURCE (object); + + switch (prop_id) { + case PROP_SSRC: + g_value_set_uint (value, rtp_source_get_ssrc (src)); + break; + case PROP_IS_CSRC: + g_value_set_boolean (value, rtp_source_is_as_csrc (src)); + break; + case PROP_IS_VALIDATED: + g_value_set_boolean (value, rtp_source_is_validated (src)); + break; + case PROP_IS_SENDER: + g_value_set_boolean (value, rtp_source_is_sender (src)); + break; + case PROP_SDES: + g_value_set_boxed (value, rtp_source_get_sdes_struct (src)); + break; + case PROP_STATS: + g_value_take_boxed (value, rtp_source_create_stats (src)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * rtp_source_new: + * @ssrc: an SSRC + * + * Create a #RTPSource with @ssrc. + * + * Returns: a new #RTPSource. Use g_object_unref() after usage. + */ +RTPSource * +rtp_source_new (guint32 ssrc) +{ + RTPSource *src; + + src = g_object_new (RTP_TYPE_SOURCE, NULL); + src->ssrc = ssrc; + + return src; +} + +/** + * rtp_source_set_callbacks: + * @src: an #RTPSource + * @cb: callback functions + * @user_data: user data + * + * Set the callbacks for the source. + */ +void +rtp_source_set_callbacks (RTPSource * src, RTPSourceCallbacks * cb, + gpointer user_data) +{ + g_return_if_fail (RTP_IS_SOURCE (src)); + + src->callbacks.push_rtp = cb->push_rtp; + src->callbacks.clock_rate = cb->clock_rate; + src->user_data = user_data; +} + +/** + * rtp_source_get_ssrc: + * @src: an #RTPSource + * + * Get the SSRC of @source. + * + * Returns: the SSRC of src. + */ +guint32 +rtp_source_get_ssrc (RTPSource * src) +{ + guint32 result; + + g_return_val_if_fail (RTP_IS_SOURCE (src), 0); + + result = src->ssrc; + + return result; +} + +/** + * rtp_source_set_as_csrc: + * @src: an #RTPSource + * + * Configure @src as a CSRC, this will also validate @src. + */ +void +rtp_source_set_as_csrc (RTPSource * src) +{ + g_return_if_fail (RTP_IS_SOURCE (src)); + + src->validated = TRUE; + src->is_csrc = TRUE; +} + +/** + * rtp_source_is_as_csrc: + * @src: an #RTPSource + * + * Check if @src is a contributing source. + * + * Returns: %TRUE if @src is acting as a contributing source. + */ +gboolean +rtp_source_is_as_csrc (RTPSource * src) +{ + gboolean result; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + + result = src->is_csrc; + + return result; +} + +/** + * rtp_source_is_active: + * @src: an #RTPSource + * + * Check if @src is an active source. A source is active if it has been + * validated and has not yet received a BYE packet + * + * Returns: %TRUE if @src is an qactive source. + */ +gboolean +rtp_source_is_active (RTPSource * src) +{ + gboolean result; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + + result = RTP_SOURCE_IS_ACTIVE (src); + + return result; +} + +/** + * rtp_source_is_validated: + * @src: an #RTPSource + * + * Check if @src is a validated source. + * + * Returns: %TRUE if @src is a validated source. + */ +gboolean +rtp_source_is_validated (RTPSource * src) +{ + gboolean result; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + + result = src->validated; + + return result; +} + +/** + * rtp_source_is_sender: + * @src: an #RTPSource + * + * Check if @src is a sending source. + * + * Returns: %TRUE if @src is a sending source. + */ +gboolean +rtp_source_is_sender (RTPSource * src) +{ + gboolean result; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + + result = RTP_SOURCE_IS_SENDER (src); + + return result; +} + +/** + * rtp_source_received_bye: + * @src: an #RTPSource + * + * Check if @src has receoved a BYE packet. + * + * Returns: %TRUE if @src has received a BYE packet. + */ +gboolean +rtp_source_received_bye (RTPSource * src) +{ + gboolean result; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + + result = src->received_bye; + + return result; +} + + +/** + * rtp_source_get_bye_reason: + * @src: an #RTPSource + * + * Get the BYE reason for @src. Check if the source receoved a BYE message first + * with rtp_source_received_bye(). + * + * Returns: The BYE reason or NULL when no reason was given or the source did + * not receive a BYE message yet. g_fee() after usage. + */ +gchar * +rtp_source_get_bye_reason (RTPSource * src) +{ + gchar *result; + + g_return_val_if_fail (RTP_IS_SOURCE (src), NULL); + + result = g_strdup (src->bye_reason); + + return result; +} + +/** + * rtp_source_update_caps: + * @src: an #RTPSource + * @caps: a #GstCaps + * + * Parse @caps and store all relevant information in @source. + */ +void +rtp_source_update_caps (RTPSource * src, GstCaps * caps) +{ + GstStructure *s; + guint val; + gint ival; + + /* nothing changed, return */ + if (caps == NULL || src->caps == caps) + return; + + s = gst_caps_get_structure (caps, 0); + + if (gst_structure_get_int (s, "payload", &ival)) + src->payload = ival; + else + src->payload = -1; + GST_DEBUG ("got payload %d", src->payload); + + if (gst_structure_get_int (s, "clock-rate", &ival)) + src->clock_rate = ival; + else + src->clock_rate = -1; + + GST_DEBUG ("got clock-rate %d", src->clock_rate); + + if (gst_structure_get_uint (s, "seqnum-base", &val)) + src->seqnum_base = val; + else + src->seqnum_base = -1; + + GST_DEBUG ("got seqnum-base %" G_GINT32_FORMAT, src->seqnum_base); + + gst_caps_replace (&src->caps, caps); +} + +/** + * rtp_source_set_sdes_string: + * @src: an #RTPSource + * @type: the type of the SDES item + * @data: the SDES data + * + * Store an SDES item of @type in @src. + * + * Returns: %FALSE if the SDES item was unchanged or @type is unknown. + */ +gboolean +rtp_source_set_sdes_string (RTPSource * src, GstRTCPSDESType type, + const gchar * data) +{ + const gchar *old; + const gchar *field; + + field = gst_rtcp_sdes_type_to_name (type); + + if (gst_structure_has_field (src->sdes, field)) + old = gst_structure_get_string (src->sdes, field); + else + old = NULL; + + if (old == NULL && data == NULL) + return FALSE; + + if (old != NULL && data != NULL && strcmp (old, data) == 0) + return FALSE; + + if (data == NULL) + gst_structure_remove_field (src->sdes, field); + else + gst_structure_set (src->sdes, field, G_TYPE_STRING, data, NULL); + + return TRUE; +} + +/** + * rtp_source_get_sdes_string: + * @src: an #RTPSource + * @type: the type of the SDES item + * + * Get the SDES item of @type from @src. + * + * Returns: a null-terminated copy of the SDES item or NULL when @type was not + * valid or the SDES item was unset. g_free() after usage. + */ +gchar * +rtp_source_get_sdes_string (RTPSource * src, GstRTCPSDESType type) +{ + gchar *result; + const gchar *type_name; + + g_return_val_if_fail (RTP_IS_SOURCE (src), NULL); + + if (type < 0 || type > GST_RTCP_SDES_PRIV - 1) + return NULL; + + type_name = gst_rtcp_sdes_type_to_name (type); + + if (!gst_structure_has_field (src->sdes, type_name)) + return NULL; + + result = g_strdup (gst_structure_get_string (src->sdes, type_name)); + + return result; +} + +/** + * rtp_source_set_rtp_from: + * @src: an #RTPSource + * @address: the RTP address to set + * + * Set that @src is receiving RTP packets from @address. This is used for + * collistion checking. + */ +void +rtp_source_set_rtp_from (RTPSource * src, GstNetAddress * address) +{ + g_return_if_fail (RTP_IS_SOURCE (src)); + + src->have_rtp_from = TRUE; + memcpy (&src->rtp_from, address, sizeof (GstNetAddress)); +} + +/** + * rtp_source_set_rtcp_from: + * @src: an #RTPSource + * @address: the RTCP address to set + * + * Set that @src is receiving RTCP packets from @address. This is used for + * collistion checking. + */ +void +rtp_source_set_rtcp_from (RTPSource * src, GstNetAddress * address) +{ + g_return_if_fail (RTP_IS_SOURCE (src)); + + src->have_rtcp_from = TRUE; + memcpy (&src->rtcp_from, address, sizeof (GstNetAddress)); +} + +static GstFlowReturn +push_packet (RTPSource * src, GstBuffer * buffer) +{ + GstFlowReturn ret = GST_FLOW_OK; + + /* push queued packets first if any */ + while (!g_queue_is_empty (src->packets)) { + GstBuffer *buffer = GST_BUFFER_CAST (g_queue_pop_head (src->packets)); + + GST_LOG ("pushing queued packet"); + if (src->callbacks.push_rtp) + src->callbacks.push_rtp (src, buffer, src->user_data); + else + gst_buffer_unref (buffer); + } + GST_LOG ("pushing new packet"); + /* push packet */ + if (src->callbacks.push_rtp) + ret = src->callbacks.push_rtp (src, buffer, src->user_data); + else + gst_buffer_unref (buffer); + + return ret; +} + +static gint +get_clock_rate (RTPSource * src, guint8 payload) +{ + if (src->payload == -1) { + /* first payload received, nothing was in the caps, lock on to this payload */ + src->payload = payload; + GST_DEBUG ("first payload %d", payload); + } else if (payload != src->payload) { + /* we have a different payload than before, reset the clock-rate */ + GST_DEBUG ("new payload %d", payload); + src->payload = payload; + src->clock_rate = -1; + src->stats.transit = -1; + } + + if (src->clock_rate == -1) { + gint clock_rate = -1; + + if (src->callbacks.clock_rate) + clock_rate = src->callbacks.clock_rate (src, payload, src->user_data); + + GST_DEBUG ("got clock-rate %d", clock_rate); + + src->clock_rate = clock_rate; + } + return src->clock_rate; +} + +/* Jitter is the variation in the delay of received packets in a flow. It is + * measured by comparing the interval when RTP packets were sent to the interval + * at which they were received. For instance, if packet #1 and packet #2 leave + * 50 milliseconds apart and arrive 60 milliseconds apart, then the jitter is 10 + * milliseconds. */ +static void +calculate_jitter (RTPSource * src, GstBuffer * buffer, + RTPArrivalStats * arrival) +{ + GstClockTime running_time; + guint32 rtparrival, transit, rtptime; + gint32 diff; + gint clock_rate; + guint8 pt; + + /* get arrival time */ + if ((running_time = arrival->running_time) == GST_CLOCK_TIME_NONE) + goto no_time; + + pt = gst_rtp_buffer_get_payload_type (buffer); + + GST_LOG ("SSRC %08x got payload %d", src->ssrc, pt); + + /* get clockrate */ + if ((clock_rate = get_clock_rate (src, pt)) == -1) + goto no_clock_rate; + + rtptime = gst_rtp_buffer_get_timestamp (buffer); + + /* convert arrival time to RTP timestamp units, truncate to 32 bits, we don't + * care about the absolute value, just the difference. */ + rtparrival = gst_util_uint64_scale_int (running_time, clock_rate, GST_SECOND); + + /* transit time is difference with RTP timestamp */ + transit = rtparrival - rtptime; + + /* get ABS diff with previous transit time */ + if (src->stats.transit != -1) { + if (transit > src->stats.transit) + diff = transit - src->stats.transit; + else + diff = src->stats.transit - transit; + } else + diff = 0; + + src->stats.transit = transit; + + /* update jitter, the value we store is scaled up so we can keep precision. */ + src->stats.jitter += diff - ((src->stats.jitter + 8) >> 4); + + src->stats.prev_rtptime = src->stats.last_rtptime; + src->stats.last_rtptime = rtparrival; + + GST_LOG ("rtparrival %u, rtptime %u, clock-rate %d, diff %d, jitter: %f", + rtparrival, rtptime, clock_rate, diff, (src->stats.jitter) / 16.0); + + return; + + /* ERRORS */ +no_time: + { + GST_WARNING ("cannot get current running_time"); + return; + } +no_clock_rate: + { + GST_WARNING ("cannot get clock-rate for pt %d", pt); + return; + } +} + +static void +init_seq (RTPSource * src, guint16 seq) +{ + src->stats.base_seq = seq; + src->stats.max_seq = seq; + src->stats.bad_seq = RTP_SEQ_MOD + 1; /* so seq == bad_seq is false */ + src->stats.cycles = 0; + src->stats.packets_received = 0; + src->stats.octets_received = 0; + src->stats.bytes_received = 0; + src->stats.prev_received = 0; + src->stats.prev_expected = 0; + + GST_DEBUG ("base_seq %d", seq); +} + +#define BITRATE_INTERVAL (2 * GST_SECOND) + +static void +do_bitrate_estimation (RTPSource * src, GstClockTime running_time, + guint64 * bytes_handled) +{ + guint64 elapsed; + + if (src->prev_rtime) { + elapsed = running_time - src->prev_rtime; + + if (elapsed > BITRATE_INTERVAL) { + guint64 rate; + + rate = gst_util_uint64_scale (*bytes_handled, 8 * GST_SECOND, elapsed); + + GST_LOG ("Elapsed %" G_GUINT64_FORMAT ", bytes %" G_GUINT64_FORMAT + ", rate %" G_GUINT64_FORMAT, elapsed, *bytes_handled, rate); + + if (src->bitrate == 0) + src->bitrate = rate; + else + src->bitrate = ((src->bitrate * 3) + rate) / 4; + + src->prev_rtime = running_time; + *bytes_handled = 0; + } + } else { + GST_LOG ("Reset bitrate measurement"); + src->prev_rtime = running_time; + src->bitrate = 0; + } +} + +/** + * rtp_source_process_rtp: + * @src: an #RTPSource + * @buffer: an RTP buffer + * + * Let @src handle the incomming RTP @buffer. + * + * Returns: a #GstFlowReturn. + */ +GstFlowReturn +rtp_source_process_rtp (RTPSource * src, GstBuffer * buffer, + RTPArrivalStats * arrival) +{ + GstFlowReturn result = GST_FLOW_OK; + guint16 seqnr, udelta; + RTPSourceStats *stats; + guint16 expected; + + g_return_val_if_fail (RTP_IS_SOURCE (src), GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); + + stats = &src->stats; + + seqnr = gst_rtp_buffer_get_seq (buffer); + + rtp_source_update_caps (src, GST_BUFFER_CAPS (buffer)); + + if (stats->cycles == -1) { + GST_DEBUG ("received first buffer"); + /* first time we heard of this source */ + init_seq (src, seqnr); + src->stats.max_seq = seqnr - 1; + src->probation = RTP_DEFAULT_PROBATION; + } + + udelta = seqnr - stats->max_seq; + + /* if we are still on probation, check seqnum */ + if (src->probation) { + expected = src->stats.max_seq + 1; + + /* when in probation, we require consecutive seqnums */ + if (seqnr == expected) { + /* expected packet */ + GST_DEBUG ("probation: seqnr %d == expected %d", seqnr, expected); + src->probation--; + src->stats.max_seq = seqnr; + if (src->probation == 0) { + GST_DEBUG ("probation done!"); + init_seq (src, seqnr); + } else { + GstBuffer *q; + + GST_DEBUG ("probation %d: queue buffer", src->probation); + /* when still in probation, keep packets in a list. */ + g_queue_push_tail (src->packets, buffer); + /* remove packets from queue if there are too many */ + while (g_queue_get_length (src->packets) > RTP_MAX_PROBATION_LEN) { + q = g_queue_pop_head (src->packets); + gst_buffer_unref (q); + } + goto done; + } + } else { + /* unexpected seqnum in probation */ + goto probation_seqnum; + } + } else if (udelta < RTP_MAX_DROPOUT) { + /* in order, with permissible gap */ + if (seqnr < stats->max_seq) { + /* sequence number wrapped - count another 64K cycle. */ + stats->cycles += RTP_SEQ_MOD; + } + stats->max_seq = seqnr; + } else if (udelta <= RTP_SEQ_MOD - RTP_MAX_MISORDER) { + /* the sequence number made a very large jump */ + if (seqnr == stats->bad_seq) { + /* two sequential packets -- assume that the other side + * restarted without telling us so just re-sync + * (i.e., pretend this was the first packet). */ + init_seq (src, seqnr); + } else { + /* unacceptable jump */ + stats->bad_seq = (seqnr + 1) & (RTP_SEQ_MOD - 1); + goto bad_sequence; + } + } else { + /* duplicate or reordered packet, will be filtered by jitterbuffer. */ + GST_WARNING ("duplicate or reordered packet"); + } + + src->stats.octets_received += arrival->payload_len; + src->stats.bytes_received += arrival->bytes; + src->stats.packets_received++; + /* for the bitrate estimation */ + src->bytes_received += arrival->payload_len; + /* the source that sent the packet must be a sender */ + src->is_sender = TRUE; + src->validated = TRUE; + + do_bitrate_estimation (src, arrival->running_time, &src->bytes_received); + + GST_LOG ("seq %d, PC: %" G_GUINT64_FORMAT ", OC: %" G_GUINT64_FORMAT, + seqnr, src->stats.packets_received, src->stats.octets_received); + + /* calculate jitter for the stats */ + calculate_jitter (src, buffer, arrival); + + /* we're ready to push the RTP packet now */ + result = push_packet (src, buffer); + +done: + return result; + + /* ERRORS */ +bad_sequence: + { + GST_WARNING ("unacceptable seqnum received"); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +probation_seqnum: + { + GST_WARNING ("probation: seqnr %d != expected %d", seqnr, expected); + src->probation = RTP_DEFAULT_PROBATION; + src->stats.max_seq = seqnr; + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +} + +/** + * rtp_source_process_bye: + * @src: an #RTPSource + * @reason: the reason for leaving + * + * Notify @src that a BYE packet has been received. This will make the source + * inactive. + */ +void +rtp_source_process_bye (RTPSource * src, const gchar * reason) +{ + g_return_if_fail (RTP_IS_SOURCE (src)); + + GST_DEBUG ("marking SSRC %08x as BYE, reason: %s", src->ssrc, + GST_STR_NULL (reason)); + + /* copy the reason and mark as received_bye */ + g_free (src->bye_reason); + src->bye_reason = g_strdup (reason); + src->received_bye = TRUE; +} + +static GstBufferListItem +set_ssrc (GstBuffer ** buffer, guint group, guint idx, RTPSource * src) +{ + *buffer = gst_buffer_make_writable (*buffer); + gst_rtp_buffer_set_ssrc (*buffer, src->ssrc); + return GST_BUFFER_LIST_SKIP_GROUP; +} + +/** + * rtp_source_send_rtp: + * @src: an #RTPSource + * @data: an RTP buffer or a list of RTP buffers + * @is_list: if @data is a buffer or list + * @running_time: the running time of @data + * + * Send @data (an RTP buffer or list of buffers) originating from @src. + * This will make @src a sender. This function takes ownership of @data and + * modifies the SSRC in the RTP packet to that of @src when needed. + * + * Returns: a #GstFlowReturn. + */ +GstFlowReturn +rtp_source_send_rtp (RTPSource * src, gpointer data, gboolean is_list, + GstClockTime running_time) +{ + GstFlowReturn result; + guint len; + guint32 rtptime; + guint64 ext_rtptime; + guint64 rt_diff, rtp_diff; + GstBufferList *list = NULL; + GstBuffer *buffer = NULL; + guint packets; + guint32 ssrc; + + g_return_val_if_fail (RTP_IS_SOURCE (src), GST_FLOW_ERROR); + g_return_val_if_fail (is_list || GST_IS_BUFFER (data), GST_FLOW_ERROR); + + if (is_list) { + list = GST_BUFFER_LIST_CAST (data); + + /* We can grab the caps from the first group, since all + * groups of a buffer list have same caps. */ + buffer = gst_buffer_list_get (list, 0, 0); + if (!buffer) + goto no_buffer; + } else { + buffer = GST_BUFFER_CAST (data); + } + rtp_source_update_caps (src, GST_BUFFER_CAPS (buffer)); + + /* we are a sender now */ + src->is_sender = TRUE; + + if (is_list) { + /* Each group makes up a network packet. */ + packets = gst_buffer_list_n_groups (list); + len = gst_rtp_buffer_list_get_payload_len (list); + } else { + packets = 1; + len = gst_rtp_buffer_get_payload_len (buffer); + } + + /* update stats for the SR */ + src->stats.packets_sent += packets; + src->stats.octets_sent += len; + src->bytes_sent += len; + + do_bitrate_estimation (src, running_time, &src->bytes_sent); + + if (is_list) { + rtptime = gst_rtp_buffer_list_get_timestamp (list); + } else { + rtptime = gst_rtp_buffer_get_timestamp (buffer); + } + ext_rtptime = src->last_rtptime; + ext_rtptime = gst_rtp_buffer_ext_timestamp (&ext_rtptime, rtptime); + + GST_LOG ("SSRC %08x, RTP %" G_GUINT64_FORMAT ", running_time %" + GST_TIME_FORMAT, src->ssrc, ext_rtptime, GST_TIME_ARGS (running_time)); + + if (ext_rtptime > src->last_rtptime) { + rtp_diff = ext_rtptime - src->last_rtptime; + rt_diff = running_time - src->last_rtime; + + /* calc the diff so we can detect drift at the sender. This can also be used + * to guestimate the clock rate if the NTP time is locked to the RTP + * timestamps (as is the case when the capture device is providing the clock). */ + GST_LOG ("SSRC %08x, diff RTP %" G_GUINT64_FORMAT ", diff running_time %" + GST_TIME_FORMAT, src->ssrc, rtp_diff, GST_TIME_ARGS (rt_diff)); + } + + /* we keep track of the last received RTP timestamp and the corresponding + * buffer running_time so that we can use this info when constructing SR reports */ + src->last_rtime = running_time; + src->last_rtptime = ext_rtptime; + + /* push packet */ + if (!src->callbacks.push_rtp) + goto no_callback; + + if (is_list) { + ssrc = gst_rtp_buffer_list_get_ssrc (list); + } else { + ssrc = gst_rtp_buffer_get_ssrc (buffer); + } + + if (ssrc != src->ssrc) { + /* the SSRC of the packet is not correct, make a writable buffer and + * update the SSRC. This could involve a complete copy of the packet when + * it is not writable. Usually the payloader will use caps negotiation to + * get the correct SSRC from the session manager before pushing anything. */ + + /* FIXME, we don't want to warn yet because we can't inform any payloader + * of the changes SSRC yet because we don't implement pad-alloc. */ + GST_LOG ("updating SSRC from %08x to %08x, fix the payloader", ssrc, + src->ssrc); + + if (is_list) { + list = gst_buffer_list_make_writable (list); + gst_buffer_list_foreach (list, (GstBufferListFunc) set_ssrc, src); + } else { + set_ssrc (&buffer, 0, 0, src); + } + } + GST_LOG ("pushing RTP %s %" G_GUINT64_FORMAT, is_list ? "list" : "packet", + src->stats.packets_sent); + + result = src->callbacks.push_rtp (src, data, src->user_data); + + return result; + + /* ERRORS */ +no_buffer: + { + GST_WARNING ("no buffers in buffer list"); + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); + return GST_FLOW_OK; + } +no_callback: + { + GST_WARNING ("no callback installed, dropping packet"); + gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); + return GST_FLOW_OK; + } +} + +/** + * rtp_source_process_sr: + * @src: an #RTPSource + * @time: time of packet arrival + * @ntptime: the NTP time in 32.32 fixed point + * @rtptime: the RTP time + * @packet_count: the packet count + * @octet_count: the octect count + * + * Update the sender report in @src. + */ +void +rtp_source_process_sr (RTPSource * src, GstClockTime time, guint64 ntptime, + guint32 rtptime, guint32 packet_count, guint32 octet_count) +{ + RTPSenderReport *curr; + gint curridx; + + g_return_if_fail (RTP_IS_SOURCE (src)); + + GST_DEBUG ("got SR packet: SSRC %08x, NTP %08x:%08x, RTP %" G_GUINT32_FORMAT + ", PC %" G_GUINT32_FORMAT ", OC %" G_GUINT32_FORMAT, src->ssrc, + (guint32) (ntptime >> 32), (guint32) (ntptime & 0xffffffff), rtptime, + packet_count, octet_count); + + curridx = src->stats.curr_sr ^ 1; + curr = &src->stats.sr[curridx]; + + /* this is a sender now */ + src->is_sender = TRUE; + + /* update current */ + curr->is_valid = TRUE; + curr->ntptime = ntptime; + curr->rtptime = rtptime; + curr->packet_count = packet_count; + curr->octet_count = octet_count; + curr->time = time; + + /* make current */ + src->stats.curr_sr = curridx; + + src->stats.prev_rtcptime = src->stats.last_rtcptime; + src->stats.last_rtcptime = time; +} + +/** + * rtp_source_process_rb: + * @src: an #RTPSource + * @ntpnstime: the current time in nanoseconds since 1970 + * @fractionlost: fraction lost since last SR/RR + * @packetslost: the cumululative number of packets lost + * @exthighestseq: the extended last sequence number received + * @jitter: the interarrival jitter + * @lsr: the last SR packet from this source + * @dlsr: the delay since last SR packet + * + * Update the report block in @src. + */ +void +rtp_source_process_rb (RTPSource * src, guint64 ntpnstime, + guint8 fractionlost, gint32 packetslost, guint32 exthighestseq, + guint32 jitter, guint32 lsr, guint32 dlsr) +{ + RTPReceiverReport *curr; + gint curridx; + guint32 ntp, A; + guint64 f_ntp; + + g_return_if_fail (RTP_IS_SOURCE (src)); + + GST_DEBUG ("got RB packet: SSRC %08x, FL %2x, PL %d, HS %" G_GUINT32_FORMAT + ", jitter %" G_GUINT32_FORMAT ", LSR %04x:%04x, DLSR %04x:%04x", + src->ssrc, fractionlost, packetslost, exthighestseq, jitter, lsr >> 16, + lsr & 0xffff, dlsr >> 16, dlsr & 0xffff); + + curridx = src->stats.curr_rr ^ 1; + curr = &src->stats.rr[curridx]; + + /* update current */ + curr->is_valid = TRUE; + curr->fractionlost = fractionlost; + curr->packetslost = packetslost; + curr->exthighestseq = exthighestseq; + curr->jitter = jitter; + curr->lsr = lsr; + curr->dlsr = dlsr; + + /* convert the NTP time in nanoseconds to 32.32 fixed point */ + f_ntp = gst_util_uint64_scale (ntpnstime, (1LL << 32), GST_SECOND); + /* calculate round trip, round the time up */ + ntp = ((f_ntp + 0xffff) >> 16) & 0xffffffff; + + A = dlsr + lsr; + if (A > 0 && ntp > A) + A = ntp - A; + else + A = 0; + curr->round_trip = A; + + GST_DEBUG ("NTP %04x:%04x, round trip %04x:%04x", ntp >> 16, ntp & 0xffff, + A >> 16, A & 0xffff); + + /* make current */ + src->stats.curr_rr = curridx; +} + +/** + * rtp_source_get_new_sr: + * @src: an #RTPSource + * @ntpnstime: the current time in nanoseconds since 1970 + * @running_time: the current running_time of the pipeline. + * @ntptime: the NTP time in 32.32 fixed point + * @rtptime: the RTP time corresponding to @ntptime + * @packet_count: the packet count + * @octet_count: the octect count + * + * Get new values to put into a new SR report from this source. + * + * @running_time and @ntpnstime are captured at the same time and represent the + * running time of the pipeline clock and the absolute current system time in + * nanoseconds respectively. Together with the last running_time and rtp timestamp + * we have observed in the source, we can generate @ntptime and @rtptime for an SR + * packet. @ntptime is basically the fixed point representation of @ntpnstime + * and @rtptime the associated RTP timestamp. + * + * Returns: %TRUE on success. + */ +gboolean +rtp_source_get_new_sr (RTPSource * src, guint64 ntpnstime, + GstClockTime running_time, guint64 * ntptime, guint32 * rtptime, + guint32 * packet_count, guint32 * octet_count) +{ + guint64 t_rtp; + guint64 t_current_ntp; + GstClockTimeDiff diff; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + + /* We last saw a buffer with last_rtptime at last_rtime. Given a running_time + * and an NTP time, we can scale the RTP timestamps so that they match the + * given NTP time. for scaling, we assume that the slope of the rtptime vs + * running_time vs ntptime curve is close to 1, which is certainly + * sufficient for the frequency at which we report SR and the rate we send + * out RTP packets. */ + t_rtp = src->last_rtptime; + + GST_DEBUG ("last_rtime %" GST_TIME_FORMAT ", last_rtptime %" + G_GUINT64_FORMAT, GST_TIME_ARGS (src->last_rtime), t_rtp); + + if (src->clock_rate != -1) { + /* get the diff between the clock running_time and the buffer running_time. + * This is the elapsed time, as measured against the pipeline clock, between + * when the rtp timestamp was observed and the current running_time. + * + * We need to apply this diff to the RTP timestamp to get the RTP timestamp + * for the given ntpnstime. */ + diff = GST_CLOCK_DIFF (src->last_rtime, running_time); + + /* now translate the diff to RTP time, handle positive and negative cases. + * If there is no diff, we already set rtptime correctly above. */ + if (diff > 0) { + GST_DEBUG ("running_time %" GST_TIME_FORMAT ", diff %" GST_TIME_FORMAT, + GST_TIME_ARGS (running_time), GST_TIME_ARGS (diff)); + t_rtp += gst_util_uint64_scale_int (diff, src->clock_rate, GST_SECOND); + } else { + diff = -diff; + GST_DEBUG ("running_time %" GST_TIME_FORMAT ", diff -%" GST_TIME_FORMAT, + GST_TIME_ARGS (running_time), GST_TIME_ARGS (diff)); + t_rtp -= gst_util_uint64_scale_int (diff, src->clock_rate, GST_SECOND); + } + } else { + GST_WARNING ("no clock-rate, cannot interpolate rtp time"); + } + + /* convert the NTP time in nanoseconds to 32.32 fixed point */ + t_current_ntp = gst_util_uint64_scale (ntpnstime, (1LL << 32), GST_SECOND); + + GST_DEBUG ("NTP %08x:%08x, RTP %" G_GUINT32_FORMAT, + (guint32) (t_current_ntp >> 32), (guint32) (t_current_ntp & 0xffffffff), + (guint32) t_rtp); + + if (ntptime) + *ntptime = t_current_ntp; + if (rtptime) + *rtptime = t_rtp; + if (packet_count) + *packet_count = src->stats.packets_sent; + if (octet_count) + *octet_count = src->stats.octets_sent; + + return TRUE; +} + +/** + * rtp_source_get_new_rb: + * @src: an #RTPSource + * @time: the current time of the system clock + * @fractionlost: fraction lost since last SR/RR + * @packetslost: the cumululative number of packets lost + * @exthighestseq: the extended last sequence number received + * @jitter: the interarrival jitter + * @lsr: the last SR packet from this source + * @dlsr: the delay since last SR packet + * + * Get new values to put into a new report block from this source. + * + * Returns: %TRUE on success. + */ +gboolean +rtp_source_get_new_rb (RTPSource * src, GstClockTime time, + guint8 * fractionlost, gint32 * packetslost, guint32 * exthighestseq, + guint32 * jitter, guint32 * lsr, guint32 * dlsr) +{ + RTPSourceStats *stats; + guint64 extended_max, expected; + guint64 expected_interval, received_interval, ntptime; + gint64 lost, lost_interval; + guint32 fraction, LSR, DLSR; + GstClockTime sr_time; + + stats = &src->stats; + + extended_max = stats->cycles + stats->max_seq; + expected = extended_max - stats->base_seq + 1; + + GST_DEBUG ("ext_max %" G_GUINT64_FORMAT ", expected %" G_GUINT64_FORMAT + ", received %" G_GUINT64_FORMAT ", base_seq %" G_GUINT32_FORMAT, + extended_max, expected, stats->packets_received, stats->base_seq); + + lost = expected - stats->packets_received; + lost = CLAMP (lost, -0x800000, 0x7fffff); + + expected_interval = expected - stats->prev_expected; + stats->prev_expected = expected; + received_interval = stats->packets_received - stats->prev_received; + stats->prev_received = stats->packets_received; + + lost_interval = expected_interval - received_interval; + + if (expected_interval == 0 || lost_interval <= 0) + fraction = 0; + else + fraction = (lost_interval << 8) / expected_interval; + + GST_DEBUG ("add RR for SSRC %08x", src->ssrc); + /* we scaled the jitter up for additional precision */ + GST_DEBUG ("fraction %" G_GUINT32_FORMAT ", lost %" G_GINT64_FORMAT + ", extseq %" G_GUINT64_FORMAT ", jitter %d", fraction, lost, + extended_max, stats->jitter >> 4); + + if (rtp_source_get_last_sr (src, &sr_time, &ntptime, NULL, NULL, NULL)) { + GstClockTime diff; + + /* LSR is middle 32 bits of the last ntptime */ + LSR = (ntptime >> 16) & 0xffffffff; + diff = time - sr_time; + GST_DEBUG ("last SR time diff %" GST_TIME_FORMAT, GST_TIME_ARGS (diff)); + /* DLSR, delay since last SR is expressed in 1/65536 second units */ + DLSR = gst_util_uint64_scale_int (diff, 65536, GST_SECOND); + } else { + /* No valid SR received, LSR/DLSR are set to 0 then */ + GST_DEBUG ("no valid SR received"); + LSR = 0; + DLSR = 0; + } + GST_DEBUG ("LSR %04x:%04x, DLSR %04x:%04x", LSR >> 16, LSR & 0xffff, + DLSR >> 16, DLSR & 0xffff); + + if (fractionlost) + *fractionlost = fraction; + if (packetslost) + *packetslost = lost; + if (exthighestseq) + *exthighestseq = extended_max; + if (jitter) + *jitter = stats->jitter >> 4; + if (lsr) + *lsr = LSR; + if (dlsr) + *dlsr = DLSR; + + return TRUE; +} + +/** + * rtp_source_get_last_sr: + * @src: an #RTPSource + * @time: time of packet arrival + * @ntptime: the NTP time in 32.32 fixed point + * @rtptime: the RTP time + * @packet_count: the packet count + * @octet_count: the octect count + * + * Get the values of the last sender report as set with rtp_source_process_sr(). + * + * Returns: %TRUE if there was a valid SR report. + */ +gboolean +rtp_source_get_last_sr (RTPSource * src, GstClockTime * time, guint64 * ntptime, + guint32 * rtptime, guint32 * packet_count, guint32 * octet_count) +{ + RTPSenderReport *curr; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + + curr = &src->stats.sr[src->stats.curr_sr]; + if (!curr->is_valid) + return FALSE; + + if (ntptime) + *ntptime = curr->ntptime; + if (rtptime) + *rtptime = curr->rtptime; + if (packet_count) + *packet_count = curr->packet_count; + if (octet_count) + *octet_count = curr->octet_count; + if (time) + *time = curr->time; + + return TRUE; +} + +/** + * rtp_source_get_last_rb: + * @src: an #RTPSource + * @fractionlost: fraction lost since last SR/RR + * @packetslost: the cumululative number of packets lost + * @exthighestseq: the extended last sequence number received + * @jitter: the interarrival jitter + * @lsr: the last SR packet from this source + * @dlsr: the delay since last SR packet + * @round_trip: the round trip time + * + * Get the values of the last RB report set with rtp_source_process_rb(). + * + * Returns: %TRUE if there was a valid SB report. + */ +gboolean +rtp_source_get_last_rb (RTPSource * src, guint8 * fractionlost, + gint32 * packetslost, guint32 * exthighestseq, guint32 * jitter, + guint32 * lsr, guint32 * dlsr, guint32 * round_trip) +{ + RTPReceiverReport *curr; + + g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); + + curr = &src->stats.rr[src->stats.curr_rr]; + if (!curr->is_valid) + return FALSE; + + if (fractionlost) + *fractionlost = curr->fractionlost; + if (packetslost) + *packetslost = curr->packetslost; + if (exthighestseq) + *exthighestseq = curr->exthighestseq; + if (jitter) + *jitter = curr->jitter; + if (lsr) + *lsr = curr->lsr; + if (dlsr) + *dlsr = curr->dlsr; + if (round_trip) + *round_trip = curr->round_trip; + + return TRUE; +} + +/** + * rtp_source_find_conflicting_address: + * @src: The source the packet came in + * @address: address to check for + * @time: The time when the packet that is possibly in conflict arrived + * + * Checks if an address which has a conflict is already known. If it is + * a known conflict, remember the time + * + * Returns: TRUE if it was a known conflict, FALSE otherwise + */ +gboolean +rtp_source_find_conflicting_address (RTPSource * src, GstNetAddress * address, + GstClockTime time) +{ + GList *item; + + for (item = g_list_first (src->conflicting_addresses); + item; item = g_list_next (item)) { + RTPConflictingAddress *known_conflict = item->data; + + if (gst_netaddress_equal (address, &known_conflict->address)) { + known_conflict->time = time; + return TRUE; + } + } + + return FALSE; +} + +/** + * rtp_source_add_conflicting_address: + * @src: The source the packet came in + * @address: address to remember + * @time: The time when the packet that is in conflict arrived + * + * Adds a new conflict address + */ +void +rtp_source_add_conflicting_address (RTPSource * src, + GstNetAddress * address, GstClockTime time) +{ + RTPConflictingAddress *new_conflict; + + new_conflict = g_new0 (RTPConflictingAddress, 1); + + memcpy (&new_conflict->address, address, sizeof (GstNetAddress)); + new_conflict->time = time; + + src->conflicting_addresses = g_list_prepend (src->conflicting_addresses, + new_conflict); +} + +/** + * rtp_source_timeout: + * @src: The #RTPSource + * @current_time: The current time + * @collision_timeout: The amount of time after which a collision is timed out + * @feedback_retention_window: The running time before which retained feedback + * packets have to be discarded + * + * This is processed on each RTCP interval. It times out old collisions. + * It also times out old retained feedback packets + */ +void +rtp_source_timeout (RTPSource * src, GstClockTime current_time, + GstClockTime collision_timeout, GstClockTime feedback_retention_window) +{ + GList *item; + GstRTCPPacket *pkt; + + item = g_list_first (src->conflicting_addresses); + while (item) { + RTPConflictingAddress *known_conflict = item->data; + GList *next_item = g_list_next (item); + + if (known_conflict->time < current_time - collision_timeout) { + gchar buf[40]; + + src->conflicting_addresses = + g_list_delete_link (src->conflicting_addresses, item); + gst_netaddress_to_string (&known_conflict->address, buf, 40); + GST_DEBUG ("collision %p timed out: %s", known_conflict, buf); + g_free (known_conflict); + } + item = next_item; + } + + /* Time out AVPF packets that are older than the desired length */ + while ((pkt = g_queue_peek_tail (src->retained_feedback)) && + GST_BUFFER_TIMESTAMP (pkt) < feedback_retention_window) + gst_buffer_unref (g_queue_pop_tail (src->retained_feedback)); +} + +static gint +compare_buffers (gconstpointer a, gconstpointer b, gpointer user_data) +{ + const GstBuffer *bufa = a; + const GstBuffer *bufb = b; + + return GST_BUFFER_TIMESTAMP (bufa) - GST_BUFFER_TIMESTAMP (bufb); +} + +void +rtp_source_retain_rtcp_packet (RTPSource * src, GstRTCPPacket * packet, + GstClockTime running_time) +{ + GstBuffer *buffer; + + buffer = gst_buffer_create_sub (packet->buffer, packet->offset, + (gst_rtcp_packet_get_length (packet) + 1) * 4); + + GST_BUFFER_TIMESTAMP (buffer) = running_time; + + g_queue_insert_sorted (src->retained_feedback, buffer, compare_buffers, NULL); +} + +gboolean +rtp_source_has_retained (RTPSource * src, GCompareFunc func, gconstpointer data) +{ + if (g_queue_find_custom (src->retained_feedback, data, func)) + return TRUE; + else + return FALSE; +} diff --git a/gst/rtpmanager/rtpsource.h b/gst/rtpmanager/rtpsource.h new file mode 100644 index 0000000..fc204ae --- /dev/null +++ b/gst/rtpmanager/rtpsource.h @@ -0,0 +1,270 @@ +/* GStreamer + * Copyright (C) <2007> 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. + */ + +#ifndef __RTP_SOURCE_H__ +#define __RTP_SOURCE_H__ + +#include <gst/gst.h> +#include <gst/rtp/gstrtcpbuffer.h> +#include <gst/netbuffer/gstnetbuffer.h> + +#include "rtpstats.h" + +/* the default number of consecutive RTP packets we need to receive before the + * source is considered valid */ +#define RTP_NO_PROBATION 0 +#define RTP_DEFAULT_PROBATION 2 + +#define RTP_SEQ_MOD (1 << 16) + +typedef struct _RTPSource RTPSource; +typedef struct _RTPSourceClass RTPSourceClass; + +#define RTP_TYPE_SOURCE (rtp_source_get_type()) +#define RTP_SOURCE(src) (G_TYPE_CHECK_INSTANCE_CAST((src),RTP_TYPE_SOURCE,RTPSource)) +#define RTP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_SOURCE,RTPSourceClass)) +#define RTP_IS_SOURCE(src) (G_TYPE_CHECK_INSTANCE_TYPE((src),RTP_TYPE_SOURCE)) +#define RTP_IS_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_SOURCE)) +#define RTP_SOURCE_CAST(src) ((RTPSource *)(src)) + +/** + * RTP_SOURCE_IS_ACTIVE: + * @src: an #RTPSource + * + * Check if @src is active. A source is active when it has been validated + * and has not yet received a BYE packet. + */ +#define RTP_SOURCE_IS_ACTIVE(src) (src->validated && !src->received_bye) + +/** + * RTP_SOURCE_IS_SENDER: + * @src: an #RTPSource + * + * Check if @src is a sender. + */ +#define RTP_SOURCE_IS_SENDER(src) (src->is_sender) + +/** + * RTPSourcePushRTP: + * @src: an #RTPSource + * @buffer: the RTP buffer ready for processing + * @user_data: user data specified when registering + * + * This callback will be called when @src has @buffer ready for further + * processing. + * + * Returns: a #GstFlowReturn. + */ +typedef GstFlowReturn (*RTPSourcePushRTP) (RTPSource *src, GstBuffer *buffer, + gpointer user_data); + +/** + * RTPSourceClockRate: + * @src: an #RTPSource + * @payload: a payload type + * @user_data: user data specified when registering + * + * This callback will be called when @src needs the clock-rate of the + * @payload. + * + * Returns: a clock-rate for @payload. + */ +typedef gint (*RTPSourceClockRate) (RTPSource *src, guint8 payload, gpointer user_data); + +/** + * RTPSourceCallbacks: + * @push_rtp: a packet becomes available for handling + * @clock_rate: a clock-rate is requested + * @get_time: the current clock time is requested + * + * Callbacks performed by #RTPSource when actions need to be performed. + */ +typedef struct { + RTPSourcePushRTP push_rtp; + RTPSourceClockRate clock_rate; +} RTPSourceCallbacks; + +/** + * RTPConflictingAddress: + * @address: #GstNetAddress which conflicted + * @last_conflict_time: time when the last conflict was seen + * + * This structure is used to account for addresses that have conflicted to find + * loops. + */ +typedef struct { + GstNetAddress address; + GstClockTime time; +} RTPConflictingAddress; + +/** + * RTPSource: + * + * A source in the #RTPSession + * + * @conflicting_addresses: GList of conflicting addresses + */ +struct _RTPSource { + GObject object; + + /*< private >*/ + guint32 ssrc; + + gint probation; + gboolean validated; + gboolean internal; + gboolean is_csrc; + gboolean is_sender; + gboolean closing; + + GstStructure *sdes; + + gboolean received_bye; + gchar *bye_reason; + + gboolean have_rtp_from; + GstNetAddress rtp_from; + gboolean have_rtcp_from; + GstNetAddress rtcp_from; + + gint payload; + GstCaps *caps; + gint clock_rate; + gint32 seqnum_base; + + GstClockTime bye_time; + GstClockTime last_activity; + GstClockTime last_rtp_activity; + + GstClockTime last_rtime; + GstClockTime last_rtptime; + + /* for bitrate estimation */ + guint64 bitrate; + GstClockTime prev_rtime; + guint64 bytes_sent; + guint64 bytes_received; + + GQueue *packets; + + RTPSourceCallbacks callbacks; + gpointer user_data; + + RTPSourceStats stats; + RTPReceiverReport last_rr; + + GList *conflicting_addresses; + + GQueue *retained_feedback; + + gboolean send_pli; + gboolean send_fir; + guint8 current_send_fir_seqnum; + gint last_fir_count; +}; + +struct _RTPSourceClass { + GObjectClass parent_class; +}; + +GType rtp_source_get_type (void); + +/* managing lifetime of sources */ +RTPSource* rtp_source_new (guint32 ssrc); +void rtp_source_set_callbacks (RTPSource *src, RTPSourceCallbacks *cb, gpointer data); + +/* properties */ +guint32 rtp_source_get_ssrc (RTPSource *src); + +void rtp_source_set_as_csrc (RTPSource *src); +gboolean rtp_source_is_as_csrc (RTPSource *src); + +gboolean rtp_source_is_active (RTPSource *src); +gboolean rtp_source_is_validated (RTPSource *src); +gboolean rtp_source_is_sender (RTPSource *src); + +gboolean rtp_source_received_bye (RTPSource *src); +gchar * rtp_source_get_bye_reason (RTPSource *src); + +void rtp_source_update_caps (RTPSource *src, GstCaps *caps); + +/* SDES info */ +gboolean rtp_source_set_sdes_string (RTPSource *src, GstRTCPSDESType type, + const gchar *data); +gchar* rtp_source_get_sdes_string (RTPSource *src, GstRTCPSDESType type); +const GstStructure * + rtp_source_get_sdes_struct (RTPSource * src); +gboolean rtp_source_set_sdes_struct (RTPSource * src, GstStructure *sdes); + +/* handling network address */ +void rtp_source_set_rtp_from (RTPSource *src, GstNetAddress *address); +void rtp_source_set_rtcp_from (RTPSource *src, GstNetAddress *address); + +/* handling RTP */ +GstFlowReturn rtp_source_process_rtp (RTPSource *src, GstBuffer *buffer, RTPArrivalStats *arrival); + +GstFlowReturn rtp_source_send_rtp (RTPSource *src, gpointer data, gboolean is_list, + GstClockTime running_time); +/* RTCP messages */ +void rtp_source_process_bye (RTPSource *src, const gchar *reason); +void rtp_source_process_sr (RTPSource *src, GstClockTime time, guint64 ntptime, + guint32 rtptime, guint32 packet_count, guint32 octet_count); +void rtp_source_process_rb (RTPSource *src, guint64 ntpnstime, guint8 fractionlost, + gint32 packetslost, guint32 exthighestseq, guint32 jitter, + guint32 lsr, guint32 dlsr); + +gboolean rtp_source_get_new_sr (RTPSource *src, guint64 ntpnstime, GstClockTime running_time, + guint64 *ntptime, guint32 *rtptime, guint32 *packet_count, + guint32 *octet_count); +gboolean rtp_source_get_new_rb (RTPSource *src, GstClockTime time, guint8 *fractionlost, + gint32 *packetslost, guint32 *exthighestseq, guint32 *jitter, + guint32 *lsr, guint32 *dlsr); + +gboolean rtp_source_get_last_sr (RTPSource *src, GstClockTime *time, guint64 *ntptime, + guint32 *rtptime, guint32 *packet_count, + guint32 *octet_count); +gboolean rtp_source_get_last_rb (RTPSource *src, guint8 *fractionlost, gint32 *packetslost, + guint32 *exthighestseq, guint32 *jitter, + guint32 *lsr, guint32 *dlsr, guint32 *round_trip); + +void rtp_source_reset (RTPSource * src); + +gboolean rtp_source_find_conflicting_address (RTPSource * src, + GstNetAddress *address, + GstClockTime time); + +void rtp_source_add_conflicting_address (RTPSource * src, + GstNetAddress *address, + GstClockTime time); + +void rtp_source_timeout (RTPSource * src, + GstClockTime current_time, + GstClockTime collision_timeout, + GstClockTime feedback_retention_window); + +void rtp_source_retain_rtcp_packet (RTPSource * src, + GstRTCPPacket *pkt, + GstClockTime running_time); + +gboolean rtp_source_has_retained (RTPSource * src, + GCompareFunc func, + gconstpointer data); + + +#endif /* __RTP_SOURCE_H__ */ diff --git a/gst/rtpmanager/rtpstats.c b/gst/rtpmanager/rtpstats.c new file mode 100644 index 0000000..8fe1d1f --- /dev/null +++ b/gst/rtpmanager/rtpstats.c @@ -0,0 +1,294 @@ +/* GStreamer + * Copyright (C) <2007> 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 "rtpstats.h" + +/** + * rtp_stats_init_defaults: + * @stats: an #RTPSessionStats struct + * + * Initialize @stats with its default values. + */ +void +rtp_stats_init_defaults (RTPSessionStats * stats) +{ + rtp_stats_set_bandwidths (stats, -1, -1, -1, -1); + stats->min_interval = RTP_STATS_MIN_INTERVAL; + stats->bye_timeout = RTP_STATS_BYE_TIMEOUT; +} + +/** + * rtp_stats_set_bandwidths: + * @stats: an #RTPSessionStats struct + * @rtp_bw: RTP bandwidth + * @rtcp_bw: RTCP bandwidth + * @rs: sender RTCP bandwidth + * @rr: receiver RTCP bandwidth + * + * Configure the bandwidth parameters in the stats. When an input variable is + * set to -1, it will be calculated from the other input variables and from the + * defaults. + */ +void +rtp_stats_set_bandwidths (RTPSessionStats * stats, guint rtp_bw, + gdouble rtcp_bw, guint rs, guint rr) +{ + GST_DEBUG ("recalc bandwidths: RTP %u, RTCP %f, RS %u, RR %u", rtp_bw, + rtcp_bw, rs, rr); + + /* when given, sender and receive bandwidth add up to the total + * rtcp bandwidth */ + if (rs != -1 && rr != -1) + rtcp_bw = rs + rr; + + /* If rtcp_bw is between 0 and 1, it is a fraction of rtp_bw */ + if (rtcp_bw > 0.0 && rtcp_bw < 1.0) { + if (rtp_bw > 0.0) + rtcp_bw = rtp_bw * rtcp_bw; + else + rtcp_bw = -1.0; + } + + /* RTCP is 5% of the RTP bandwidth */ + if (rtp_bw == -1 && rtcp_bw > 1.0) + rtp_bw = rtcp_bw * 20; + else if (rtp_bw != -1 && rtcp_bw < 0.0) + rtcp_bw = rtp_bw / 20; + else if (rtp_bw == -1 && rtcp_bw < 0.0) { + /* nothing given, take defaults */ + rtp_bw = RTP_STATS_BANDWIDTH; + rtcp_bw = rtp_bw * RTP_STATS_RTCP_FRACTION; + } + + stats->bandwidth = rtp_bw; + stats->rtcp_bandwidth = rtcp_bw; + + /* now figure out the fractions */ + if (rs == -1) { + /* rs unknown */ + if (rr == -1) { + /* both not given, use defaults */ + rs = stats->rtcp_bandwidth * RTP_STATS_SENDER_FRACTION; + rr = stats->rtcp_bandwidth * RTP_STATS_RECEIVER_FRACTION; + } else { + /* rr known, calculate rs */ + if (stats->rtcp_bandwidth > rr) + rs = stats->rtcp_bandwidth - rr; + else + rs = 0; + } + } else if (rr == -1) { + /* rs known, calculate rr */ + if (stats->rtcp_bandwidth > rs) + rr = stats->rtcp_bandwidth - rs; + else + rr = 0; + } + + if (stats->rtcp_bandwidth > 0) { + stats->sender_fraction = ((gdouble) rs) / ((gdouble) stats->rtcp_bandwidth); + stats->receiver_fraction = 1.0 - stats->sender_fraction; + } else { + /* no RTCP bandwidth, set dummy values */ + stats->sender_fraction = 0.0; + stats->receiver_fraction = 0.0; + } + GST_DEBUG ("bandwidths: RTP %u, RTCP %u, RS %f, RR %f", stats->bandwidth, + stats->rtcp_bandwidth, stats->sender_fraction, stats->receiver_fraction); +} + +/** + * rtp_stats_calculate_rtcp_interval: + * @stats: an #RTPSessionStats struct + * @sender: if we are a sender + * @first: if this is the first time + * + * Calculate the RTCP interval. The result of this function is the amount of + * time to wait (in nanoseconds) before sending a new RTCP message. + * + * Returns: the RTCP interval. + */ +GstClockTime +rtp_stats_calculate_rtcp_interval (RTPSessionStats * stats, gboolean we_send, + gboolean first) +{ + gdouble members, senders, n; + gdouble avg_rtcp_size, rtcp_bw; + gdouble interval; + gdouble rtcp_min_time; + + /* Very first call at application start-up uses half the min + * delay for quicker notification while still allowing some time + * before reporting for randomization and to learn about other + * sources so the report interval will converge to the correct + * interval more quickly. + */ + rtcp_min_time = stats->min_interval; + if (first) + rtcp_min_time /= 2.0; + + /* Dedicate a fraction of the RTCP bandwidth to senders unless + * the number of senders is large enough that their share is + * more than that fraction. + */ + n = members = stats->active_sources; + senders = (gdouble) stats->sender_sources; + rtcp_bw = stats->rtcp_bandwidth; + + if (senders <= members * stats->sender_fraction) { + if (we_send) { + rtcp_bw *= stats->sender_fraction; + n = senders; + } else { + rtcp_bw *= stats->receiver_fraction; + n -= senders; + } + } + + /* no bandwidth for RTCP, return NONE to signal that we don't want to send + * RTCP packets */ + if (rtcp_bw <= 0.00001) + return GST_CLOCK_TIME_NONE; + + avg_rtcp_size = stats->avg_rtcp_packet_size; + /* + * The effective number of sites times the average packet size is + * the total number of octets sent when each site sends a report. + * Dividing this by the effective bandwidth gives the time + * interval over which those packets must be sent in order to + * meet the bandwidth target, with a minimum enforced. In that + * time interval we send one report so this time is also our + * average time between reports. + */ + GST_DEBUG ("avg size %f, n %f, rtcp_bw %f", avg_rtcp_size, n, rtcp_bw); + interval = avg_rtcp_size * n / rtcp_bw; + if (interval < rtcp_min_time) + interval = rtcp_min_time; + + return interval * GST_SECOND; +} + +/** + * rtp_stats_add_rtcp_jitter: + * @stats: an #RTPSessionStats struct + * @interval: an RTCP interval + * + * Apply a random jitter to the @interval. @interval is typically obtained with + * rtp_stats_calculate_rtcp_interval(). + * + * Returns: the new RTCP interval. + */ +GstClockTime +rtp_stats_add_rtcp_jitter (RTPSessionStats * stats, GstClockTime interval) +{ + gdouble temp; + + /* see RFC 3550 p 30 + * To compensate for "unconditional reconsideration" converging to a + * value below the intended average. + */ +#define COMPENSATION (2.71828 - 1.5); + + temp = (interval * g_random_double_range (0.5, 1.5)) / COMPENSATION; + + return (GstClockTime) temp; +} + + +/** + * rtp_stats_calculate_bye_interval: + * @stats: an #RTPSessionStats struct + * + * Calculate the BYE interval. The result of this function is the amount of + * time to wait (in nanoseconds) before sending a BYE message. + * + * Returns: the BYE interval. + */ +GstClockTime +rtp_stats_calculate_bye_interval (RTPSessionStats * stats) +{ + gdouble members; + gdouble avg_rtcp_size, rtcp_bw; + gdouble interval; + gdouble rtcp_min_time; + + /* no interval when we have less than 50 members */ + if (stats->active_sources < 50) + return 0; + + rtcp_min_time = (stats->min_interval) / 2.0; + + /* Dedicate a fraction of the RTCP bandwidth to senders unless + * the number of senders is large enough that their share is + * more than that fraction. + */ + members = stats->bye_members; + rtcp_bw = stats->rtcp_bandwidth * stats->receiver_fraction; + + /* no bandwidth for RTCP, return NONE to signal that we don't want to send + * RTCP packets */ + if (rtcp_bw <= 0.0001) + return GST_CLOCK_TIME_NONE; + + avg_rtcp_size = stats->avg_rtcp_packet_size; + /* + * The effective number of sites times the average packet size is + * the total number of octets sent when each site sends a report. + * Dividing this by the effective bandwidth gives the time + * interval over which those packets must be sent in order to + * meet the bandwidth target, with a minimum enforced. In that + * time interval we send one report so this time is also our + * average time between reports. + */ + interval = avg_rtcp_size * members / rtcp_bw; + if (interval < rtcp_min_time) + interval = rtcp_min_time; + + return interval * GST_SECOND; +} + +/** + * rtp_stats_get_packets_lost: + * @stats: an #RTPSourceStats struct + * + * Calculate the total number of RTP packets lost since beginning of + * reception. Packets that arrive late are not considered lost, and + * duplicates are not taken into account. Hence, the loss may be negative + * if there are duplicates. + * + * Returns: total RTP packets lost. + */ +gint64 +rtp_stats_get_packets_lost (const RTPSourceStats * stats) +{ + gint64 lost; + guint64 extended_max, expected; + + extended_max = stats->cycles + stats->max_seq; + expected = extended_max - stats->base_seq + 1; + lost = expected - stats->packets_received; + + return lost; +} + +void +rtp_stats_set_min_interval (RTPSessionStats * stats, gdouble min_interval) +{ + stats->min_interval = min_interval; +} diff --git a/gst/rtpmanager/rtpstats.h b/gst/rtpmanager/rtpstats.h new file mode 100644 index 0000000..4560595 --- /dev/null +++ b/gst/rtpmanager/rtpstats.h @@ -0,0 +1,203 @@ +/* GStreamer + * Copyright (C) <2007> 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. + */ + +#ifndef __RTP_STATS_H__ +#define __RTP_STATS_H__ + +#include <gst/gst.h> +#include <gst/netbuffer/gstnetbuffer.h> + +/** + * RTPSenderReport: + * + * A sender report structure. + */ +typedef struct { + gboolean is_valid; + guint64 ntptime; + guint32 rtptime; + guint32 packet_count; + guint32 octet_count; + GstClockTime time; +} RTPSenderReport; + +/** + * RTPReceiverReport: + * + * A receiver report structure. + */ +typedef struct { + gboolean is_valid; + guint32 ssrc; /* who the report is from */ + guint8 fractionlost; + guint32 packetslost; + guint32 exthighestseq; + guint32 jitter; + guint32 lsr; + guint32 dlsr; + guint32 round_trip; +} RTPReceiverReport; + +/** + * RTPArrivalStats: + * @current_time: current time according to the system clock + * @running_time: arrival time of a packet as buffer running_time + * @ntpnstime: arrival time of a packet NTP time in nanoseconds + * @have_address: if the @address field contains a valid address + * @address: address of the sender of the packet + * @bytes: bytes of the packet including lowlevel overhead + * @payload_len: bytes of the RTP payload + * + * Structure holding information about the arrival stats of a packet. + */ +typedef struct { + GstClockTime current_time; + GstClockTime running_time; + guint64 ntpnstime; + gboolean have_address; + GstNetAddress address; + guint bytes; + guint payload_len; +} RTPArrivalStats; + +/** + * RTPSourceStats: + * @packetsreceived: number of received packets in total + * @prevpacketsreceived: number of packets received in previous reporting + * interval + * @octetsreceived: number of payload bytes received + * @bytesreceived: number of total bytes received including headers and lower + * protocol level overhead + * @max_seqnr: highest sequence number received + * @transit: previous transit time used for calculating @jitter + * @jitter: current jitter + * @prev_rtptime: previous time when an RTP packet was received + * @prev_rtcptime: previous time when an RTCP packet was received + * @last_rtptime: time when last RTP packet received + * @last_rtcptime: time when last RTCP packet received + * @curr_rr: index of current @rr block + * @rr: previous and current receiver report block + * @curr_sr: index of current @sr block + * @sr: previous and current sender report block + * + * Stats about a source. + */ +typedef struct { + guint64 packets_received; + guint64 octets_received; + guint64 bytes_received; + + guint32 prev_expected; + guint32 prev_received; + + guint16 max_seq; + guint64 cycles; + guint32 base_seq; + guint32 bad_seq; + guint32 transit; + guint32 jitter; + + guint64 packets_sent; + guint64 octets_sent; + + /* when we received stuff */ + GstClockTime prev_rtptime; + GstClockTime prev_rtcptime; + GstClockTime last_rtptime; + GstClockTime last_rtcptime; + + /* sender and receiver reports */ + gint curr_rr; + RTPReceiverReport rr[2]; + gint curr_sr; + RTPSenderReport sr[2]; +} RTPSourceStats; + +#define RTP_STATS_BANDWIDTH 64000 +#define RTP_STATS_RTCP_FRACTION 0.05 +/* + * Minimum average time between RTCP packets from this site (in + * seconds). This time prevents the reports from `clumping' when + * sessions are small and the law of large numbers isn't helping + * to smooth out the traffic. It also keeps the report interval + * from becoming ridiculously small during transient outages like + * a network partition. + */ +#define RTP_STATS_MIN_INTERVAL 5.0 +/* + * Fraction of the RTCP bandwidth to be shared among active + * senders. (This fraction was chosen so that in a typical + * session with one or two active senders, the computed report + * time would be roughly equal to the minimum report time so that + * we don't unnecessarily slow down receiver reports.) The + * receiver fraction must be 1 - the sender fraction. + */ +#define RTP_STATS_SENDER_FRACTION (0.25) +#define RTP_STATS_RECEIVER_FRACTION (1.0 - RTP_STATS_SENDER_FRACTION) + +/* + * When receiving a BYE from a source, remove the source from the database + * after this timeout. + */ +#define RTP_STATS_BYE_TIMEOUT (2 * GST_SECOND) + +/* + * The maximum number of missing packets we tollerate. These are packets with a + * sequence number bigger than the last seen packet. + */ +#define RTP_MAX_DROPOUT 3000 +/* + * The maximum number of misordered packets we tollerate. These are packets with + * a sequence number smaller than the last seen packet. + */ +#define RTP_MAX_MISORDER 100 + +/** + * RTPSessionStats: + * + * Stats kept for a session and used to produce RTCP packet timeouts. + */ +typedef struct { + guint bandwidth; + guint rtcp_bandwidth; + gdouble sender_fraction; + gdouble receiver_fraction; + gdouble min_interval; + GstClockTime bye_timeout; + guint sender_sources; + guint active_sources; + guint avg_rtcp_packet_size; + guint bye_members; +} RTPSessionStats; + +void rtp_stats_init_defaults (RTPSessionStats *stats); + +void rtp_stats_set_bandwidths (RTPSessionStats *stats, + guint rtp_bw, + gdouble rtcp_bw, + guint rs, guint rr); + +GstClockTime rtp_stats_calculate_rtcp_interval (RTPSessionStats *stats, gboolean sender, gboolean first); +GstClockTime rtp_stats_add_rtcp_jitter (RTPSessionStats *stats, GstClockTime interval); +GstClockTime rtp_stats_calculate_bye_interval (RTPSessionStats *stats); +gint64 rtp_stats_get_packets_lost (const RTPSourceStats *stats); + +void rtp_stats_set_min_interval (RTPSessionStats *stats, + gdouble min_interval); +#endif /* __RTP_STATS_H__ */ diff --git a/gst/rtsp/Makefile.am b/gst/rtsp/Makefile.am new file mode 100644 index 0000000..8e65ced --- /dev/null +++ b/gst/rtsp/Makefile.am @@ -0,0 +1,31 @@ +plugin_LTLIBRARIES = libgstrtsp.la + +libgstrtsp_la_SOURCES = gstrtsp.c gstrtspsrc.c \ + gstrtpdec.c gstrtspext.c + +libgstrtsp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstrtsp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ + -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstrtp-@GST_MAJORMINOR@ -lgstrtsp-@GST_MAJORMINOR@ \ + -lgstsdp-@GST_MAJORMINOR@ $(GST_LIBS) $(WIN32_LIBS) +libgstrtsp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstrtsp_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstrtspsrc.h \ + gstrtsp.h \ + gstrtpdec.h \ + gstrtspext.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstrtsp -:SHARED libgstrtsp \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstrtsp_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtsp_la_CFLAGS) \ + -:LDFLAGS $(libgstrtsp_la_LDFLAGS) \ + $(libgstrtsp_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/rtsp/Makefile.in b/gst/rtsp/Makefile.in new file mode 100644 index 0000000..bb7928e --- /dev/null +++ b/gst/rtsp/Makefile.in @@ -0,0 +1,856 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/rtsp +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstrtsp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstrtsp_la_OBJECTS = libgstrtsp_la-gstrtsp.lo \ + libgstrtsp_la-gstrtspsrc.lo libgstrtsp_la-gstrtpdec.lo \ + libgstrtsp_la-gstrtspext.lo +libgstrtsp_la_OBJECTS = $(am_libgstrtsp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstrtsp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstrtsp_la_CFLAGS) $(CFLAGS) \ + $(libgstrtsp_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstrtsp_la_SOURCES) +DIST_SOURCES = $(libgstrtsp_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstrtsp.la +libgstrtsp_la_SOURCES = gstrtsp.c gstrtspsrc.c \ + gstrtpdec.c gstrtspext.c + +libgstrtsp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstrtsp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ + -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstrtp-@GST_MAJORMINOR@ -lgstrtsp-@GST_MAJORMINOR@ \ + -lgstsdp-@GST_MAJORMINOR@ $(GST_LIBS) $(WIN32_LIBS) + +libgstrtsp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstrtsp_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstrtspsrc.h \ + gstrtsp.h \ + gstrtpdec.h \ + gstrtspext.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/rtsp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/rtsp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstrtsp.la: $(libgstrtsp_la_OBJECTS) $(libgstrtsp_la_DEPENDENCIES) $(EXTRA_libgstrtsp_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstrtsp_la_LINK) -rpath $(plugindir) $(libgstrtsp_la_OBJECTS) $(libgstrtsp_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_la-gstrtpdec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_la-gstrtsp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_la-gstrtspext.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_la-gstrtspsrc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstrtsp_la-gstrtsp.lo: gstrtsp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_la-gstrtsp.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_la-gstrtsp.Tpo -c -o libgstrtsp_la-gstrtsp.lo `test -f 'gstrtsp.c' || echo '$(srcdir)/'`gstrtsp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_la-gstrtsp.Tpo $(DEPDIR)/libgstrtsp_la-gstrtsp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtsp.c' object='libgstrtsp_la-gstrtsp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_la-gstrtsp.lo `test -f 'gstrtsp.c' || echo '$(srcdir)/'`gstrtsp.c + +libgstrtsp_la-gstrtspsrc.lo: gstrtspsrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_la-gstrtspsrc.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_la-gstrtspsrc.Tpo -c -o libgstrtsp_la-gstrtspsrc.lo `test -f 'gstrtspsrc.c' || echo '$(srcdir)/'`gstrtspsrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_la-gstrtspsrc.Tpo $(DEPDIR)/libgstrtsp_la-gstrtspsrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtspsrc.c' object='libgstrtsp_la-gstrtspsrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_la-gstrtspsrc.lo `test -f 'gstrtspsrc.c' || echo '$(srcdir)/'`gstrtspsrc.c + +libgstrtsp_la-gstrtpdec.lo: gstrtpdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_la-gstrtpdec.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_la-gstrtpdec.Tpo -c -o libgstrtsp_la-gstrtpdec.lo `test -f 'gstrtpdec.c' || echo '$(srcdir)/'`gstrtpdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_la-gstrtpdec.Tpo $(DEPDIR)/libgstrtsp_la-gstrtpdec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpdec.c' object='libgstrtsp_la-gstrtpdec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_la-gstrtpdec.lo `test -f 'gstrtpdec.c' || echo '$(srcdir)/'`gstrtpdec.c + +libgstrtsp_la-gstrtspext.lo: gstrtspext.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_la-gstrtspext.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_la-gstrtspext.Tpo -c -o libgstrtsp_la-gstrtspext.lo `test -f 'gstrtspext.c' || echo '$(srcdir)/'`gstrtspext.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_la-gstrtspext.Tpo $(DEPDIR)/libgstrtsp_la-gstrtspext.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtspext.c' object='libgstrtsp_la-gstrtspext.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_la-gstrtspext.lo `test -f 'gstrtspext.c' || echo '$(srcdir)/'`gstrtspext.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstrtsp -:SHARED libgstrtsp \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstrtsp_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtsp_la_CFLAGS) \ + -:LDFLAGS $(libgstrtsp_la_LDFLAGS) \ + $(libgstrtsp_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/rtsp/README b/gst/rtsp/README new file mode 100644 index 0000000..0245891 --- /dev/null +++ b/gst/rtsp/README @@ -0,0 +1,377 @@ +RTSP source +----------- + +The RTSP source establishes a connection to an RTSP server and sets up +the UDP sources and RTP session handlers. + +An RTSP session is created as follows: + +- Parse RTSP URL: + + ex: + rtsp://thread:5454/south-rtsp.mp3 + +- Open a connection to the server with the url. All further conversation with + the server should be done with this connection. Each request/reply has + a CSeq number added to the header. + +- Send a DESCRIBE request for the url. We currently support a response in + SDP. + + ex: + + >> DESCRIBE rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 + >> Accept: application/sdp + >> CSeq: 0 + >> + << RTSP/1.0 200 OK + << Content-Length: 84 + << Content-Type: application/sdp + << CSeq: 0 + << Date: Wed May 11 13:09:37 2005 GMT + << + << v=0 + << o=- 0 0 IN IP4 192.168.1.1 + << s=No Title + << m=audio 0 RTP/AVP 14 + << a=control:streamid=0 + +- Parse the SDP message, for each stream (m=) we create an GstRTPStream. We need + to allocate two local UDP ports for receiving the RTP and RTCP data because we + need to send the port numbers to the server in the next request. + + In RTSPSrc we first create an element that can handle the udp://0.0.0.0:0 uri. This + will create an udp source element with a random port number. We get the port + number by getting the "port" property of the element after setting the element to + PAUSED. This element is used for the RTP packets and has to be an even number. If + the random port number is not an even number we retry to allocate a new udp source. + + We then create another UDP source element with the next (uneven) port number to + receive the RTCP packet on. After this step we have two udp ports we can use to + accept RTP packets. + + +-----------------+ + | +------------+ | + | | udpsrc0 | | + | | port=5000 | | + | +------------+ | + | +------------+ | + | | udpsrc1 | | + | | port=5001 | | + | +------------+ | + +-----------------+ + +- Send a SETUP message to the server with the RTP ports. We get the setup URI from + the a= attribute in the SDP message. This can be an absolute URL or a relative + url. + + ex: + + >> SETUP rtsp://thread:5454/south-rtsp.mp3/streamid=0 RTSP/1.0 + >> CSeq: 1 + >> Transport: RTP/AVP/UDP;unicast;client_port=5000-5001,RTP/AVP/UDP;multicast,RTP/AVP/TCP + >> + << RTSP/1.0 200 OK + << Transport: RTP/AVP/UDP;unicast;client_port=5000-5001;server_port=6000-6001 + << CSeq: 1 + << Date: Wed May 11 13:21:43 2005 GMT + << Session: 5d5cb94413288ccd + << + + The client needs to send the local ports to the server along with the supported + transport types. The server selects the final transport which it returns in the + Transport header field. The server also includes its ports where RTP and RTCP + messages can be sent to. + + In the above example UDP was choosen as a transport. At this point the RTSPSrc element + will furter configure its elements to process this stream. + + The RTSPSrc will create and connect an RTP session manager element and will + connect it to the src pads of the udp element. The data pad from the RTP session + manager is ghostpadded to RTPSrc. + The RTCP pad of the rtpdec is routed to a new udpsink that sends data to the RTCP + port of the server as returned in the Transport: header field. + + +---------------------------------------------+ + | +------------+ | + | | udpsrc0 | +--------+ | + | | port=5000 ----- rtpdec -------------------- + | +------------+ | | | + | +------------+ | | +------------+ | + | | udpsrc1 ----- RTCP ---- udpsink | | + | | port=5001 | +--------+ | port=6001 | | + | +------------+ +------------+ | + +---------------------------------------------+ + + The output type of rtpdec is configured as the media type specified in the SDP + message. + +- All the elements are set to PAUSED/PLAYING and the PLAY RTSP message is + sent. + + >> PLAY rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 + >> CSeq: 2 + >> Session: 5d5cb94413288ccd + >> + << RTSP/1.0 200 OK + << CSeq: 2 + << Date: Wed May 11 13:21:43 2005 GMT + << Session: 5d5cb94413288ccd + << + +- The udp source elements receive data from that point and the RTP/RTCP messages + are processed by the elements. + +- In the case of interleaved mode, the SETUP method yields: + + >> SETUP rtsp://thread:5454/south-rtsp.mp3/streamid=0 RTSP/1.0 + >> CSeq: 1 + >> Transport: RTP/AVP/UDP;unicast;client_port=5000-5001,RTP/AVP/UDP;multicast,RTP/AVP/TCP + >> + << RTSP/1.0 200 OK + << Transport: RTP/AVP/TCP;interleaved=0-1 + << CSeq: 1 + << Date: Wed May 11 13:21:43 2005 GMT + << Session: 5d5cb94413288ccd + << + + This means that RTP/RTCP messages will be sent on channel 0/1 respectively and that + the data will be received on the same connection as the RTSP connection. + + At this point, we remove the UDP source elements as we don't need them anymore. We + set up the rtpsess session manager element though as follows: + + +---------------------------------------------+ + | +------------+ | + | | _loop() | +--------+ | + | | ----- rtpses -------------------- + | | | | | | + | | | | | +------------+ | + | | ----- RTCP ---- udpsink | | + | | | +--------+ | port=6001 | | + | +------------+ +------------+ | + +---------------------------------------------+ + + We start an interal task to start reading from the RTSP connection waiting + for data. The received data is then pushed to the rtpdec element. + + When reading from the RTSP connection we receive data packets in the + following layout (see also RFC2326) + + $<1 byte channel><2 bytes length, big endian><length bytes of data> + + +RTSP server +----------- + +An RTSP server listen on a port (default 554) for client connections. The client +typically keeps this channel open during the RTSP session to instruct the server +to pause/play/stop the stream. + +The server exposes a stream consisting of one or more media streams using an +URL. The media streams are typically audio and video. + + ex: + rtsp://thread:5454/alien-rtsp.mpeg + + exposes an audio/video stream. The video is mpeg packetized in RTP and + the audio is mp3 in RTP. + +The streaming server typically uses a different channel to send the media +data to clients, typically using RTP over UDP. It is also possible to stream +the data to the client using the initial RTSP TCP session (the interleaved +mode). This last mode is usufull when the client is behind a firewall but +does not take advantage of the RTP/UDP features. + +In both cases, media data is send to the clients in an unmultiplexed format +packetized as RTP packets. + +The streaming server has to negotiate a connection protocol for each of the +media streams with the client. + +Minimal server requirements: + +- The server should copy the CSeq header field in a client request to the + response so that the client can match the response to the request. + +- The server should keep a session for each client after the client issued + a SETUP command. The client should use the same session id for all future + request to this server. + +- the server must support an OPTIONS request send over the RTSP connection. + + >> OPTIONS * RTSP/1.0 + >> CSeq: 1 + >> + << RTSP/1.0 200 OK + << CSeq: 1 + << Date: Wed May 11 13:21:43 2005 GMT + << Session: 5d5cb94413288ccd + << Public: DESCRIBE, SETUP, TEARDOWN, PLAY + << + + The OPTIONS request should list all supported methods on the server. + + - The server should support the DESCRIBE method. + + >> DESCRIBE rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 + >> Accept: application/sdp + >> CSeq: 2 + >> + << RTSP/1.0 200 OK + << Content-Length: 84 + << Content-Type: application/sdp + << CSeq: 2 + << Date: Wed May 11 13:09:37 2005 GMT + << + << v=0 + << o=- 0 0 IN IP4 192.168.1.1 + << s=No Title + << m=audio 0 RTP/AVP 14 + << a=control:streamid=0 + + The client issues a DESCRIBE command for a specific URL that corresponds + to an available stream. The client will also send an Accept header to + list its supported formats. + + The server answers this request with a reply in one of the client supported + formats (application/sdp is the most common). The server typically sends a + fixed reply to all clients for each configured stream. + + - The server must support the SETUP command to configure the media streams + that were listed in the DESCRIBE command. + + >> SETUP rtsp://thread:5454/south-rtsp.mp3/streamid=0 RTSP/1.0 + >> CSeq: 3 + >> Transport: RTP/AVP/UDP;unicast;client_port=5000-5001,RTP/AVP/UDP;multicast,RTP/AVP/TCP + >> + << RTSP/1.0 200 OK + << Transport: RTP/AVP/UDP;unicast;client_port=5000-5001;server_port=6000-6001 + << CSeq: 3 + << Date: Wed May 11 13:21:43 2005 GMT + << Session: 5d5cb94413288ccd + + The client will send a SETUP command for each of the streams listed in the + DESCRIBE reply. For sdp will use a URL as listed in the a=control: property. + + The client will list the supported transports in the Transport: header field. + Each transport is separated with a comma (,) and listed in order of preference. + The server has to select the first supported transport. + + In the above example 3 transport are listed: + + RTP/AVP/UDP;unicast;client_port=5000-5001 + + The client will accept RTP over UDP on the port pair 5000-5001. Port + 5000 will accept the RTP packets, 5001 the RTSP packets send by the + server. + + RTP/AVP/UDP;multicast + + The client can join a multicast group for the specific media stream. + The port numbers of the multicast group it will connect to have to + be specified by the server in the reply. + + RTP/AVP/TCP + + the client can accept RTP packets interleaved on the RTSP connection. + + The server selects a supported transport an allocates an RTP port pair to + receive RTP and RTSP data from the client. This last step is optional when + the server does not accept RTP data. + + The server should allocate a session for the client and should send the + sessionId to the client. The client should use this session id for all + future requests. + + The server may refuse a client that does not use the same transport method + for all media streams. + + The server stores all client port pairs in the server client session along + with the transport method. + + ex: + + For an on-demand stream the server could construct a (minimal) RTP GStreamer + pipeline for the client as follows (for an mp3 stream): + + +---------+ +-----------+ +------------+ +-------------+ + | filesrc | | rtpmp3enc | | rtpsession | | udpsink | + | | | | | | | host=XXX | + | | | | | | | port=5000 | + | src--sink src--rtpsink rtpsrc--sink | + +---------+ +-----------+ | | +-------------+ + | | +-------------+ + | | | udpsink | + | | | host=XXX | + | | | port=5001 | + | rtspsrc--sink | + +------------+ +-------------+ + + The server would set the above pipeline to PAUSE to make sure no data + is sent to the client yet. + + optionally udpsrc elements can be configured to receive client RTP and + RTSP messages. + + ex: + + For a live stream the server could construct a (minimal) RTP GStreamer + pipeline for the clients as follows (for an mp3 stream): + + +---------+ +--------+ +-----------+ +------------+ +--------------+ + | source | | mp3enc | | rtpmp3enc | | rtpsession | | multiudpsink | + | | | | | | | | | host=... | + | | | | | | | | | port=... | + | src--sink src--sink src--rtpsink rtpsrc--sink | + +---------+ +--------+ +-----------+ | | +--------------+ + | | +--------------+ + | | | multiudpsink | + | | | host=... | + | | | port=... | + | rtspsrc--sink | + +------------+ +--------------+ + + Media data is streamed to clients by adding the client host and port numbers + to the multiudpsinks. + + optionally udpsrc elements can be configured to receive client RTP and + RTSP messages. + + - The server must support the PLAY command to start playback of the configured + media streams. + + >> PLAY rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 + >> CSeq: 2 + >> Session: 5d5cb94413288ccd + >> + << RTSP/1.0 200 OK + << CSeq: 2 + << Date: Wed May 11 13:21:43 2005 GMT + << Session: 5d5cb94413288ccd + << + + Using the Session: header field, the server finds the pipeline of the session + to PLAY and sets the pipeline to PLAYING at which point the client receives + the media stream data. + + In case of a live stream, the server adds the port numbers to a multiudpsink + element. + + - The server must support the TEARDOWN command to stop playback and free the + session of a client. + + >> TEARDOWN rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 + >> CSeq: 4 + >> Session: 5d5cb94413288ccd + >> + << RTSP/1.0 200 OK + << CSeq: 4 + << Date: Wed May 11 13:21:43 2005 GMT + << + + The server destroys the client pipeline in case of an on-demand stream or + removes the client ports from the multiudpsinks. This effectively stops + streaming to the client. + + diff --git a/gst/rtsp/gstrtpdec.c b/gst/rtsp/gstrtpdec.c new file mode 100644 index 0000000..02e68dd --- /dev/null +++ b/gst/rtsp/gstrtpdec.c @@ -0,0 +1,969 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans <wim@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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/* Element-Checklist-Version: 5 */ + +/** + * SECTION:element-rtpdec + * + * A simple RTP session manager used internally by rtspsrc. + * + * Last reviewed on 2006-06-20 (0.10.4) + */ + +/* #define HAVE_RTCP */ + +#include <gst/rtp/gstrtpbuffer.h> + +#ifdef HAVE_RTCP +#include <gst/rtp/gstrtcpbuffer.h> +#endif + +#include "gstrtpdec.h" +#include <stdio.h> + +GST_DEBUG_CATEGORY_STATIC (rtpdec_debug); +#define GST_CAT_DEFAULT (rtpdec_debug) + +/* GstRTPDec signals and args */ +enum +{ + SIGNAL_REQUEST_PT_MAP, + SIGNAL_CLEAR_PT_MAP, + + SIGNAL_ON_NEW_SSRC, + SIGNAL_ON_SSRC_COLLISION, + SIGNAL_ON_SSRC_VALIDATED, + SIGNAL_ON_BYE_SSRC, + SIGNAL_ON_BYE_TIMEOUT, + SIGNAL_ON_TIMEOUT, + LAST_SIGNAL +}; + +#define DEFAULT_LATENCY_MS 200 + +enum +{ + PROP_0, + PROP_LATENCY +}; + +static GstStaticPadTemplate gst_rtp_dec_recv_rtp_sink_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtp_sink_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate gst_rtp_dec_recv_rtcp_sink_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtcp_sink_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static GstStaticPadTemplate gst_rtp_dec_recv_rtp_src_template = +GST_STATIC_PAD_TEMPLATE ("recv_rtp_src_%d_%d_%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtp") + ); + +static GstStaticPadTemplate gst_rtp_dec_rtcp_src_template = +GST_STATIC_PAD_TEMPLATE ("rtcp_src_%d", + GST_PAD_SRC, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("application/x-rtcp") + ); + +static void gst_rtp_dec_finalize (GObject * object); +static void gst_rtp_dec_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_rtp_dec_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static GstClock *gst_rtp_dec_provide_clock (GstElement * element); +static GstStateChangeReturn gst_rtp_dec_change_state (GstElement * element, + GstStateChange transition); +static GstPad *gst_rtp_dec_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_rtp_dec_release_pad (GstElement * element, GstPad * pad); + +static GstFlowReturn gst_rtp_dec_chain_rtp (GstPad * pad, GstBuffer * buffer); +static GstFlowReturn gst_rtp_dec_chain_rtcp (GstPad * pad, GstBuffer * buffer); + + +/* Manages the receiving end of the packets. + * + * There is one such structure for each RTP session (audio/video/...). + * We get the RTP/RTCP packets and stuff them into the session manager. + */ +struct _GstRTPDecSession +{ + /* session id */ + gint id; + /* the parent bin */ + GstRTPDec *dec; + + gboolean active; + /* we only support one ssrc and one pt */ + guint32 ssrc; + guint8 pt; + GstCaps *caps; + + /* the pads of the session */ + GstPad *recv_rtp_sink; + GstPad *recv_rtp_src; + GstPad *recv_rtcp_sink; + GstPad *rtcp_src; +}; + +/* find a session with the given id */ +static GstRTPDecSession * +find_session_by_id (GstRTPDec * rtpdec, gint id) +{ + GSList *walk; + + for (walk = rtpdec->sessions; walk; walk = g_slist_next (walk)) { + GstRTPDecSession *sess = (GstRTPDecSession *) walk->data; + + if (sess->id == id) + return sess; + } + return NULL; +} + +/* create a session with the given id */ +static GstRTPDecSession * +create_session (GstRTPDec * rtpdec, gint id) +{ + GstRTPDecSession *sess; + + sess = g_new0 (GstRTPDecSession, 1); + sess->id = id; + sess->dec = rtpdec; + rtpdec->sessions = g_slist_prepend (rtpdec->sessions, sess); + + return sess; +} + +static void +free_session (GstRTPDecSession * session) +{ + g_free (session); +} + +static guint gst_rtp_dec_signals[LAST_SIGNAL] = { 0 }; + +GST_BOILERPLATE (GstRTPDec, gst_rtp_dec, GstElement, GST_TYPE_ELEMENT); + +static void +gst_rtp_dec_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + /* sink pads */ + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_dec_recv_rtp_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_dec_recv_rtcp_sink_template); + /* src pads */ + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_dec_recv_rtp_src_template); + gst_element_class_add_static_pad_template (element_class, + &gst_rtp_dec_rtcp_src_template); + + gst_element_class_set_details_simple (element_class, "RTP Decoder", + "Codec/Parser/Network", + "Accepts raw RTP and RTCP packets and sends them forward", + "Wim Taymans <wim@fluendo.com>"); +} + +/* BOXED:UINT,UINT */ +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) + +static void +gst_rtp_dec_marshal_BOXED__UINT_UINT (GClosure * closure, + GValue * return_value, + guint n_param_values, + const GValue * param_values, + gpointer invocation_hint, gpointer marshal_data) +{ + typedef gpointer (*GMarshalFunc_BOXED__UINT_UINT) (gpointer data1, + guint arg_1, guint arg_2, gpointer data2); + register GMarshalFunc_BOXED__UINT_UINT callback; + register GCClosure *cc = (GCClosure *) closure; + register gpointer data1, data2; + gpointer v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } else { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = + (GMarshalFunc_BOXED__UINT_UINT) (marshal_data ? marshal_data : + cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), data2); + + g_value_take_boxed (return_value, v_return); +} + +static void +gst_rtp_dec_marshal_VOID__UINT_UINT (GClosure * closure, + GValue * return_value, + guint n_param_values, + const GValue * param_values, + gpointer invocation_hint, gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, + guint arg_1, guint arg_2, gpointer data2); + register GMarshalFunc_VOID__UINT_UINT callback; + register GCClosure *cc = (GCClosure *) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } else { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = + (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : + cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_uint (param_values + 2), data2); +} + +static void +gst_rtp_dec_class_init (GstRTPDecClass * g_class) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstRTPDecClass *klass; + + klass = (GstRTPDecClass *) g_class; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_rtp_dec_finalize; + gobject_class->set_property = gst_rtp_dec_set_property; + gobject_class->get_property = gst_rtp_dec_get_property; + + g_object_class_install_property (gobject_class, PROP_LATENCY, + g_param_spec_uint ("latency", "Buffer latency in ms", + "Amount of ms to buffer", 0, G_MAXUINT, DEFAULT_LATENCY_MS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRTPDec::request-pt-map: + * @rtpdec: the object which received the signal + * @session: the session + * @pt: the pt + * + * Request the payload type as #GstCaps for @pt in @session. + */ + gst_rtp_dec_signals[SIGNAL_REQUEST_PT_MAP] = + g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, request_pt_map), + NULL, NULL, gst_rtp_dec_marshal_BOXED__UINT_UINT, GST_TYPE_CAPS, 2, + G_TYPE_UINT, G_TYPE_UINT); + + gst_rtp_dec_signals[SIGNAL_CLEAR_PT_MAP] = + g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, clear_pt_map), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + + /** + * GstRTPDec::on-new-ssrc: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of a new SSRC that entered @session. + */ + gst_rtp_dec_signals[SIGNAL_ON_NEW_SSRC] = + g_signal_new ("on-new-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_new_ssrc), + NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRTPDec::on-ssrc_collision: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify when we have an SSRC collision + */ + gst_rtp_dec_signals[SIGNAL_ON_SSRC_COLLISION] = + g_signal_new ("on-ssrc-collision", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_ssrc_collision), + NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRTPDec::on-ssrc_validated: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of a new SSRC that became validated. + */ + gst_rtp_dec_signals[SIGNAL_ON_SSRC_VALIDATED] = + g_signal_new ("on-ssrc-validated", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_ssrc_validated), + NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + /** + * GstRTPDec::on-bye-ssrc: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that became inactive because of a BYE packet. + */ + gst_rtp_dec_signals[SIGNAL_ON_BYE_SSRC] = + g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_bye_ssrc), + NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRTPDec::on-bye-timeout: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that has timed out because of BYE + */ + gst_rtp_dec_signals[SIGNAL_ON_BYE_TIMEOUT] = + g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_bye_timeout), + NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + /** + * GstRTPDec::on-timeout: + * @rtpbin: the object which received the signal + * @session: the session + * @ssrc: the SSRC + * + * Notify of an SSRC that has timed out + */ + gst_rtp_dec_signals[SIGNAL_ON_TIMEOUT] = + g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_timeout), + NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + + gstelement_class->provide_clock = + GST_DEBUG_FUNCPTR (gst_rtp_dec_provide_clock); + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_dec_change_state); + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_rtp_dec_request_new_pad); + gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_dec_release_pad); + + GST_DEBUG_CATEGORY_INIT (rtpdec_debug, "rtpdec", 0, "RTP decoder"); +} + +static void +gst_rtp_dec_init (GstRTPDec * rtpdec, GstRTPDecClass * klass) +{ + rtpdec->provided_clock = gst_system_clock_obtain (); + rtpdec->latency = DEFAULT_LATENCY_MS; +} + +static void +gst_rtp_dec_finalize (GObject * object) +{ + GstRTPDec *rtpdec; + + rtpdec = GST_RTP_DEC (object); + + g_slist_foreach (rtpdec->sessions, (GFunc) free_session, NULL); + g_slist_free (rtpdec->sessions); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_rtp_dec_query_src (GstPad * pad, GstQuery * query) +{ + gboolean res; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + /* we pretend to be live with a 3 second latency */ + gst_query_set_latency (query, TRUE, 3 * GST_SECOND, -1); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + return res; +} + +static GstFlowReturn +gst_rtp_dec_chain_rtp (GstPad * pad, GstBuffer * buffer) +{ + GstFlowReturn res; + GstRTPDec *rtpdec; + GstRTPDecSession *session; + guint32 ssrc; + guint8 pt; + + rtpdec = GST_RTP_DEC (GST_PAD_PARENT (pad)); + + GST_DEBUG_OBJECT (rtpdec, "got rtp packet"); + + if (!gst_rtp_buffer_validate (buffer)) + goto bad_packet; + + ssrc = gst_rtp_buffer_get_ssrc (buffer); + pt = gst_rtp_buffer_get_payload_type (buffer); + + GST_DEBUG_OBJECT (rtpdec, "SSRC %08x, PT %d", ssrc, pt); + + /* find session */ + session = gst_pad_get_element_private (pad); + + /* see if we have the pad */ + if (!session->active) { + GstPadTemplate *templ; + GstElementClass *klass; + gchar *name; + GstCaps *caps; + GValue ret = { 0 }; + GValue args[3] = { {0} + , {0} + , {0} + }; + + GST_DEBUG_OBJECT (rtpdec, "creating stream"); + + session->ssrc = ssrc; + session->pt = pt; + + /* get pt map */ + g_value_init (&args[0], GST_TYPE_ELEMENT); + g_value_set_object (&args[0], rtpdec); + g_value_init (&args[1], G_TYPE_UINT); + g_value_set_uint (&args[1], session->id); + g_value_init (&args[2], G_TYPE_UINT); + g_value_set_uint (&args[2], pt); + + g_value_init (&ret, GST_TYPE_CAPS); + g_value_set_boxed (&ret, NULL); + + g_signal_emitv (args, gst_rtp_dec_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret); + + caps = (GstCaps *) g_value_get_boxed (&ret); + + name = g_strdup_printf ("recv_rtp_src_%d_%u_%d", session->id, ssrc, pt); + klass = GST_ELEMENT_GET_CLASS (rtpdec); + templ = gst_element_class_get_pad_template (klass, "recv_rtp_src_%d_%d_%d"); + session->recv_rtp_src = gst_pad_new_from_template (templ, name); + g_free (name); + + gst_pad_set_caps (session->recv_rtp_src, caps); + + gst_pad_set_element_private (session->recv_rtp_src, session); + gst_pad_set_query_function (session->recv_rtp_src, gst_rtp_dec_query_src); + gst_pad_set_active (session->recv_rtp_src, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpdec), session->recv_rtp_src); + + session->active = TRUE; + } + + gst_buffer_set_caps (buffer, GST_PAD_CAPS (session->recv_rtp_src)); + + res = gst_pad_push (session->recv_rtp_src, buffer); + + return res; + +bad_packet: + { + GST_ELEMENT_WARNING (rtpdec, STREAM, DECODE, (NULL), + ("RTP packet did not validate, dropping")); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +} + +static GstFlowReturn +gst_rtp_dec_chain_rtcp (GstPad * pad, GstBuffer * buffer) +{ + GstRTPDec *src; + +#ifdef HAVE_RTCP + gboolean valid; + GstRTCPPacket packet; + gboolean more; +#endif + + src = GST_RTP_DEC (GST_PAD_PARENT (pad)); + + GST_DEBUG_OBJECT (src, "got rtcp packet"); + +#ifdef HAVE_RTCP + valid = gst_rtcp_buffer_validate (buffer); + if (!valid) + goto bad_packet; + + /* position on first packet */ + more = gst_rtcp_buffer_get_first_packet (buffer, &packet); + while (more) { + switch (gst_rtcp_packet_get_type (&packet)) { + case GST_RTCP_TYPE_SR: + { + guint32 ssrc, rtptime, packet_count, octet_count; + guint64 ntptime; + guint count, i; + + gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, &rtptime, + &packet_count, &octet_count); + + GST_DEBUG_OBJECT (src, + "got SR packet: SSRC %08x, NTP %" G_GUINT64_FORMAT + ", RTP %u, PC %u, OC %u", ssrc, ntptime, rtptime, packet_count, + octet_count); + + count = gst_rtcp_packet_get_rb_count (&packet); + for (i = 0; i < count; i++) { + guint32 ssrc, exthighestseq, jitter, lsr, dlsr; + guint8 fractionlost; + gint32 packetslost; + + gst_rtcp_packet_get_rb (&packet, i, &ssrc, &fractionlost, + &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); + + GST_DEBUG_OBJECT (src, "got RB packet %d: SSRC %08x, FL %u" + ", PL %u, HS %u, JITTER %u, LSR %u, DLSR %u", ssrc, fractionlost, + packetslost, exthighestseq, jitter, lsr, dlsr); + } + break; + } + case GST_RTCP_TYPE_RR: + { + guint32 ssrc; + guint count, i; + + ssrc = gst_rtcp_packet_rr_get_ssrc (&packet); + + GST_DEBUG_OBJECT (src, "got RR packet: SSRC %08x", ssrc); + + count = gst_rtcp_packet_get_rb_count (&packet); + for (i = 0; i < count; i++) { + guint32 ssrc, exthighestseq, jitter, lsr, dlsr; + guint8 fractionlost; + gint32 packetslost; + + gst_rtcp_packet_get_rb (&packet, i, &ssrc, &fractionlost, + &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); + + GST_DEBUG_OBJECT (src, "got RB packet %d: SSRC %08x, FL %u" + ", PL %u, HS %u, JITTER %u, LSR %u, DLSR %u", ssrc, fractionlost, + packetslost, exthighestseq, jitter, lsr, dlsr); + } + break; + } + case GST_RTCP_TYPE_SDES: + { + guint chunks, i, j; + gboolean more_chunks, more_items; + + chunks = gst_rtcp_packet_sdes_get_chunk_count (&packet); + GST_DEBUG_OBJECT (src, "got SDES packet with %d chunks", chunks); + + more_chunks = gst_rtcp_packet_sdes_first_chunk (&packet); + i = 0; + while (more_chunks) { + guint32 ssrc; + + ssrc = gst_rtcp_packet_sdes_get_ssrc (&packet); + + GST_DEBUG_OBJECT (src, "chunk %d, SSRC %08x", i, ssrc); + + more_items = gst_rtcp_packet_sdes_first_item (&packet); + j = 0; + while (more_items) { + GstRTCPSDESType type; + guint8 len; + gchar *data; + + gst_rtcp_packet_sdes_get_item (&packet, &type, &len, &data); + + GST_DEBUG_OBJECT (src, "item %d, type %d, len %d, data %s", j, + type, len, data); + + more_items = gst_rtcp_packet_sdes_next_item (&packet); + j++; + } + more_chunks = gst_rtcp_packet_sdes_next_chunk (&packet); + i++; + } + break; + } + case GST_RTCP_TYPE_BYE: + { + guint count, i; + gchar *reason; + + reason = gst_rtcp_packet_bye_get_reason (&packet); + GST_DEBUG_OBJECT (src, "got BYE packet (reason: %s)", + GST_STR_NULL (reason)); + g_free (reason); + + count = gst_rtcp_packet_bye_get_ssrc_count (&packet); + for (i = 0; i < count; i++) { + guint32 ssrc; + + + ssrc = gst_rtcp_packet_bye_get_nth_ssrc (&packet, i); + + GST_DEBUG_OBJECT (src, "SSRC: %08x", ssrc); + } + break; + } + case GST_RTCP_TYPE_APP: + GST_DEBUG_OBJECT (src, "got APP packet"); + break; + default: + GST_WARNING_OBJECT (src, "got unknown RTCP packet"); + break; + } + more = gst_rtcp_packet_move_to_next (&packet); + } + gst_buffer_unref (buffer); + return GST_FLOW_OK; + +bad_packet: + { + GST_WARNING_OBJECT (src, "got invalid RTCP packet"); + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +#else + gst_buffer_unref (buffer); + return GST_FLOW_OK; +#endif +} + +static void +gst_rtp_dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstRTPDec *src; + + src = GST_RTP_DEC (object); + + switch (prop_id) { + case PROP_LATENCY: + src->latency = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtp_dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstRTPDec *src; + + src = GST_RTP_DEC (object); + + switch (prop_id) { + case PROP_LATENCY: + g_value_set_uint (value, src->latency); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstClock * +gst_rtp_dec_provide_clock (GstElement * element) +{ + GstRTPDec *rtpdec; + + rtpdec = GST_RTP_DEC (element); + + return GST_CLOCK_CAST (gst_object_ref (rtpdec->provided_clock)); +} + +static GstStateChangeReturn +gst_rtp_dec_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + + switch (transition) { + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + /* we're NO_PREROLL when going to PAUSED */ + ret = GST_STATE_CHANGE_NO_PREROLL; + break; + default: + break; + } + + return ret; +} + +/* Create a pad for receiving RTP for the session in @name + */ +static GstPad * +create_recv_rtp (GstRTPDec * rtpdec, GstPadTemplate * templ, const gchar * name) +{ + guint sessid; + GstRTPDecSession *session; + + /* first get the session number */ + if (name == NULL || sscanf (name, "recv_rtp_sink_%d", &sessid) != 1) + goto no_name; + + GST_DEBUG_OBJECT (rtpdec, "finding session %d", sessid); + + /* get or create session */ + session = find_session_by_id (rtpdec, sessid); + if (!session) { + GST_DEBUG_OBJECT (rtpdec, "creating session %d", sessid); + /* create session now */ + session = create_session (rtpdec, sessid); + if (session == NULL) + goto create_error; + } + /* check if pad was requested */ + if (session->recv_rtp_sink != NULL) + goto existed; + + GST_DEBUG_OBJECT (rtpdec, "getting RTP sink pad"); + + session->recv_rtp_sink = gst_pad_new_from_template (templ, name); + gst_pad_set_element_private (session->recv_rtp_sink, session); + gst_pad_set_chain_function (session->recv_rtp_sink, gst_rtp_dec_chain_rtp); + gst_pad_set_active (session->recv_rtp_sink, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpdec), session->recv_rtp_sink); + + return session->recv_rtp_sink; + + /* ERRORS */ +no_name: + { + g_warning ("rtpdec: invalid name given"); + return NULL; + } +create_error: + { + /* create_session already warned */ + return NULL; + } +existed: + { + g_warning ("rtpdec: recv_rtp pad already requested for session %d", sessid); + return NULL; + } +} + +/* Create a pad for receiving RTCP for the session in @name + */ +static GstPad * +create_recv_rtcp (GstRTPDec * rtpdec, GstPadTemplate * templ, + const gchar * name) +{ + guint sessid; + GstRTPDecSession *session; + + /* first get the session number */ + if (name == NULL || sscanf (name, "recv_rtcp_sink_%d", &sessid) != 1) + goto no_name; + + GST_DEBUG_OBJECT (rtpdec, "finding session %d", sessid); + + /* get the session, it must exist or we error */ + session = find_session_by_id (rtpdec, sessid); + if (!session) + goto no_session; + + /* check if pad was requested */ + if (session->recv_rtcp_sink != NULL) + goto existed; + + GST_DEBUG_OBJECT (rtpdec, "getting RTCP sink pad"); + + session->recv_rtcp_sink = gst_pad_new_from_template (templ, name); + gst_pad_set_element_private (session->recv_rtp_sink, session); + gst_pad_set_chain_function (session->recv_rtcp_sink, gst_rtp_dec_chain_rtcp); + gst_pad_set_active (session->recv_rtcp_sink, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpdec), session->recv_rtcp_sink); + + return session->recv_rtcp_sink; + + /* ERRORS */ +no_name: + { + g_warning ("rtpdec: invalid name given"); + return NULL; + } +no_session: + { + g_warning ("rtpdec: no session with id %d", sessid); + return NULL; + } +existed: + { + g_warning ("rtpdec: recv_rtcp pad already requested for session %d", + sessid); + return NULL; + } +} + +/* Create a pad for sending RTCP for the session in @name + */ +static GstPad * +create_rtcp (GstRTPDec * rtpdec, GstPadTemplate * templ, const gchar * name) +{ + guint sessid; + GstRTPDecSession *session; + + /* first get the session number */ + if (name == NULL || sscanf (name, "rtcp_src_%d", &sessid) != 1) + goto no_name; + + /* get or create session */ + session = find_session_by_id (rtpdec, sessid); + if (!session) + goto no_session; + + /* check if pad was requested */ + if (session->rtcp_src != NULL) + goto existed; + + session->rtcp_src = gst_pad_new_from_template (templ, name); + gst_pad_set_active (session->rtcp_src, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (rtpdec), session->rtcp_src); + + return session->rtcp_src; + + /* ERRORS */ +no_name: + { + g_warning ("rtpdec: invalid name given"); + return NULL; + } +no_session: + { + g_warning ("rtpdec: session with id %d does not exist", sessid); + return NULL; + } +existed: + { + g_warning ("rtpdec: rtcp_src pad already requested for session %d", sessid); + return NULL; + } +} + +/* + */ +static GstPad * +gst_rtp_dec_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name) +{ + GstRTPDec *rtpdec; + GstElementClass *klass; + GstPad *result; + + g_return_val_if_fail (templ != NULL, NULL); + g_return_val_if_fail (GST_IS_RTP_DEC (element), NULL); + + rtpdec = GST_RTP_DEC (element); + klass = GST_ELEMENT_GET_CLASS (element); + + /* figure out the template */ + if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink_%d")) { + result = create_recv_rtp (rtpdec, templ, name); + } else if (templ == gst_element_class_get_pad_template (klass, + "recv_rtcp_sink_%d")) { + result = create_recv_rtcp (rtpdec, templ, name); + } else if (templ == gst_element_class_get_pad_template (klass, "rtcp_src_%d")) { + result = create_rtcp (rtpdec, templ, name); + } else + goto wrong_template; + + return result; + + /* ERRORS */ +wrong_template: + { + g_warning ("rtpdec: this is not our template"); + return NULL; + } +} + +static void +gst_rtp_dec_release_pad (GstElement * element, GstPad * pad) +{ +} diff --git a/gst/rtsp/gstrtpdec.h b/gst/rtsp/gstrtpdec.h new file mode 100644 index 0000000..08128f4 --- /dev/null +++ b/gst/rtsp/gstrtpdec.h @@ -0,0 +1,88 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans <wim@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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_RTP_DEC_H__ +#define __GST_RTP_DEC_H__ + +#include <gst/gst.h> + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_DEC (gst_rtp_dec_get_type()) +#define GST_IS_RTP_DEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DEC)) +#define GST_IS_RTP_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DEC)) +#define GST_RTP_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DEC, GstRTPDec)) +#define GST_RTP_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DEC, GstRTPDecClass)) + +typedef struct _GstRTPDec GstRTPDec; +typedef struct _GstRTPDecClass GstRTPDecClass; +typedef struct _GstRTPDecSession GstRTPDecSession; + +struct _GstRTPDec { + GstElement element; + + guint latency; + GSList *sessions; + GstClock *provided_clock; +}; + +struct _GstRTPDecClass { + GstElementClass parent_class; + + /* get the caps for pt */ + GstCaps* (*request_pt_map) (GstRTPDec *rtpdec, guint session, guint pt); + + void (*clear_pt_map) (GstRTPDec *rtpdec); + + void (*on_new_ssrc) (GstRTPDec *rtpdec, guint session, guint32 ssrc); + void (*on_ssrc_collision) (GstRTPDec *rtpdec, guint session, guint32 ssrc); + void (*on_ssrc_validated) (GstRTPDec *rtpdec, guint session, guint32 ssrc); + void (*on_bye_ssrc) (GstRTPDec *rtpdec, guint session, guint32 ssrc); + void (*on_bye_timeout) (GstRTPDec *rtpdec, guint session, guint32 ssrc); + void (*on_timeout) (GstRTPDec *rtpdec, guint session, guint32 ssrc); +}; + +GType gst_rtp_dec_get_type(void); + +G_END_DECLS + +#endif /* __GST_RTP_DEC_H__ */ diff --git a/gst/rtsp/gstrtsp.c b/gst/rtsp/gstrtsp.c new file mode 100644 index 0000000..37d7fba --- /dev/null +++ b/gst/rtsp/gstrtsp.c @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> + * <2006> Wim Taymans <wim@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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gst/gst-i18n-plugin.h" + +#include "gstrtpdec.h" +#include "gstrtspsrc.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + + if (!gst_element_register (plugin, "rtspsrc", GST_RANK_NONE, + GST_TYPE_RTSPSRC)) + return FALSE; + if (!gst_element_register (plugin, "rtpdec", GST_RANK_NONE, GST_TYPE_RTP_DEC)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "rtsp", + "transfer data via RTSP", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/rtsp/gstrtsp.h b/gst/rtsp/gstrtsp.h new file mode 100644 index 0000000..f29c359 --- /dev/null +++ b/gst/rtsp/gstrtsp.h @@ -0,0 +1,53 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> + * <2006> Wim Taymans <wim@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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_RTSP_H__ +#define __GST_RTSP_H__ + +G_BEGIN_DECLS + + +G_END_DECLS + +#endif /* __GST_RTSP_H__ */ + diff --git a/gst/rtsp/gstrtspext.c b/gst/rtsp/gstrtspext.c new file mode 100644 index 0000000..638ffdd --- /dev/null +++ b/gst/rtsp/gstrtspext.c @@ -0,0 +1,268 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans <wim@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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "gstrtspext.h" + +GST_DEBUG_CATEGORY_STATIC (rtspext_debug); +#define GST_CAT_DEFAULT (rtspext_debug) + +static GList *extensions; + +static gboolean +gst_rtsp_ext_list_filter (GstPluginFeature * feature, gpointer user_data) +{ + GstElementFactory *factory; + guint rank; + + /* we only care about element factories */ + if (!GST_IS_ELEMENT_FACTORY (feature)) + return FALSE; + + factory = GST_ELEMENT_FACTORY (feature); + + if (!gst_element_factory_has_interface (factory, "GstRTSPExtension")) + return FALSE; + + /* only select elements with autoplugging rank */ + rank = gst_plugin_feature_get_rank (feature); + if (rank < GST_RANK_MARGINAL) + return FALSE; + + return TRUE; +} + +void +gst_rtsp_ext_list_init (void) +{ + GST_DEBUG_CATEGORY_INIT (rtspext_debug, "rtspext", 0, "RTSP extension"); + + /* get a list of all extensions */ + extensions = gst_registry_feature_filter (gst_registry_get_default (), + (GstPluginFeatureFilter) gst_rtsp_ext_list_filter, FALSE, NULL); +} + +GstRTSPExtensionList * +gst_rtsp_ext_list_get (void) +{ + GstRTSPExtensionList *result; + GList *walk; + + result = g_new0 (GstRTSPExtensionList, 1); + + for (walk = extensions; walk; walk = g_list_next (walk)) { + GstElementFactory *factory = GST_ELEMENT_FACTORY (walk->data); + GstElement *element; + + element = gst_element_factory_create (factory, NULL); + if (!element) { + GST_ERROR ("could not create extension instance"); + continue; + } + + GST_DEBUG ("added extension interface for '%s'", + GST_ELEMENT_NAME (element)); + result->extensions = g_list_prepend (result->extensions, element); + } + return result; +} + +void +gst_rtsp_ext_list_free (GstRTSPExtensionList * ext) +{ + GList *walk; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + gst_object_unref (GST_OBJECT_CAST (elem)); + } + g_list_free (ext->extensions); + g_free (ext); +} + +gboolean +gst_rtsp_ext_list_detect_server (GstRTSPExtensionList * ext, + GstRTSPMessage * resp) +{ + GList *walk; + gboolean res = TRUE; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_detect_server (elem, resp); + } + return res; +} + +GstRTSPResult +gst_rtsp_ext_list_before_send (GstRTSPExtensionList * ext, GstRTSPMessage * req) +{ + GList *walk; + GstRTSPResult res = GST_RTSP_OK; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_before_send (elem, req); + } + return res; +} + +GstRTSPResult +gst_rtsp_ext_list_after_send (GstRTSPExtensionList * ext, GstRTSPMessage * req, + GstRTSPMessage * resp) +{ + GList *walk; + GstRTSPResult res = GST_RTSP_OK; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_after_send (elem, req, resp); + } + return res; +} + +GstRTSPResult +gst_rtsp_ext_list_parse_sdp (GstRTSPExtensionList * ext, GstSDPMessage * sdp, + GstStructure * s) +{ + GList *walk; + GstRTSPResult res = GST_RTSP_OK; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_parse_sdp (elem, sdp, s); + } + return res; +} + +GstRTSPResult +gst_rtsp_ext_list_setup_media (GstRTSPExtensionList * ext, GstSDPMedia * media) +{ + GList *walk; + GstRTSPResult res = GST_RTSP_OK; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_setup_media (elem, media); + } + return res; +} + +gboolean +gst_rtsp_ext_list_configure_stream (GstRTSPExtensionList * ext, GstCaps * caps) +{ + GList *walk; + gboolean res = TRUE; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_configure_stream (elem, caps); + if (!res) + break; + } + return res; +} + +GstRTSPResult +gst_rtsp_ext_list_get_transports (GstRTSPExtensionList * ext, + GstRTSPLowerTrans protocols, gchar ** transport) +{ + GList *walk; + GstRTSPResult res = GST_RTSP_OK; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_get_transports (elem, protocols, transport); + } + return res; +} + +GstRTSPResult +gst_rtsp_ext_list_stream_select (GstRTSPExtensionList * ext, GstRTSPUrl * url) +{ + GList *walk; + GstRTSPResult res = GST_RTSP_OK; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_stream_select (elem, url); + } + return res; +} + +void +gst_rtsp_ext_list_connect (GstRTSPExtensionList * ext, + const gchar * detailed_signal, GCallback c_handler, gpointer data) +{ + GList *walk; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + g_signal_connect (elem, detailed_signal, c_handler, data); + } +} + +GstRTSPResult +gst_rtsp_ext_list_receive_request (GstRTSPExtensionList * ext, + GstRTSPMessage * req) +{ + GList *walk; + GstRTSPResult res = GST_RTSP_ENOTIMPL; + + for (walk = ext->extensions; walk; walk = g_list_next (walk)) { + GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; + + res = gst_rtsp_extension_receive_request (elem, req); + if (res != GST_RTSP_ENOTIMPL) + break; + } + return res; +} diff --git a/gst/rtsp/gstrtspext.h b/gst/rtsp/gstrtspext.h new file mode 100644 index 0000000..f30b302 --- /dev/null +++ b/gst/rtsp/gstrtspext.h @@ -0,0 +1,83 @@ +/* GStreamer + * Copyright (C) <2006> Wim Taymans <wim@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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_RTSP_EXT_H__ +#define __GST_RTSP_EXT_H__ + +#include <gst/gst.h> +#include <gst/rtsp/gstrtspextension.h> + +G_BEGIN_DECLS + +typedef struct _GstRTSPExtensionList GstRTSPExtensionList; + +struct _GstRTSPExtensionList +{ + GList *extensions; +}; + +void gst_rtsp_ext_list_init (void); + +GstRTSPExtensionList * gst_rtsp_ext_list_get (void); +void gst_rtsp_ext_list_free (GstRTSPExtensionList *ext); + +gboolean gst_rtsp_ext_list_detect_server (GstRTSPExtensionList *ext, GstRTSPMessage *resp); + +GstRTSPResult gst_rtsp_ext_list_before_send (GstRTSPExtensionList *ext, GstRTSPMessage *req); +GstRTSPResult gst_rtsp_ext_list_after_send (GstRTSPExtensionList *ext, GstRTSPMessage *req, + GstRTSPMessage *resp); +GstRTSPResult gst_rtsp_ext_list_parse_sdp (GstRTSPExtensionList *ext, GstSDPMessage *sdp, + GstStructure *s); +GstRTSPResult gst_rtsp_ext_list_setup_media (GstRTSPExtensionList *ext, GstSDPMedia *media); +gboolean gst_rtsp_ext_list_configure_stream (GstRTSPExtensionList *ext, GstCaps *caps); +GstRTSPResult gst_rtsp_ext_list_get_transports (GstRTSPExtensionList *ext, GstRTSPLowerTrans protocols, + gchar **transport); +GstRTSPResult gst_rtsp_ext_list_stream_select (GstRTSPExtensionList *ext, GstRTSPUrl *url); + +void gst_rtsp_ext_list_connect (GstRTSPExtensionList *ext, + const gchar *detailed_signal, GCallback c_handler, + gpointer data); +GstRTSPResult gst_rtsp_ext_list_receive_request (GstRTSPExtensionList *ext, GstRTSPMessage *req); + +G_END_DECLS + +#endif /* __GST_RTSP_EXT_H__ */ diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c new file mode 100644 index 0000000..20fb6e1 --- /dev/null +++ b/gst/rtsp/gstrtspsrc.c @@ -0,0 +1,6854 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans <wim at fluendo dot com> + * <2006> Lutz Mueller <lutz at topfrose dot 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * SECTION:element-rtspsrc + * + * Makes a connection to an RTSP server and read the data. + * rtspsrc strictly follows RFC 2326 and therefore does not (yet) support + * RealMedia/Quicktime/Microsoft extensions. + * + * RTSP supports transport over TCP or UDP in unicast or multicast mode. By + * default rtspsrc will negotiate a connection in the following order: + * UDP unicast/UDP multicast/TCP. The order cannot be changed but the allowed + * protocols can be controlled with the #GstRTSPSrc:protocols property. + * + * rtspsrc currently understands SDP as the format of the session description. + * For each stream listed in the SDP a new rtp_stream%d pad will be created + * with caps derived from the SDP media description. This is a caps of mime type + * "application/x-rtp" that can be connected to any available RTP depayloader + * element. + * + * rtspsrc will internally instantiate an RTP session manager element + * that will handle the RTCP messages to and from the server, jitter removal, + * packet reordering along with providing a clock for the pipeline. + * This feature is implemented using the gstrtpbin element. + * + * rtspsrc acts like a live source and will therefore only generate data in the + * PLAYING state. + * + * <refsect2> + * <title>Example launch line + * |[ + * gst-launch rtspsrc location=rtsp://some.server/url ! fakesink + * ]| Establish a connection to an RTSP server and send the raw RTP packets to a + * fakesink. + * + * + * Last reviewed on 2006-08-18 (0.10.5) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#ifdef HAVE_UNISTD_H +#include +#endif /* HAVE_UNISTD_H */ +#include +#include +#include +#include +#include + +#include +#include + +#include "gst/gst-i18n-plugin.h" + +#include "gstrtspsrc.h" + +#ifdef G_OS_WIN32 +#include +#endif + +GST_DEBUG_CATEGORY_STATIC (rtspsrc_debug); +#define GST_CAT_DEFAULT (rtspsrc_debug) + +static GstStaticPadTemplate rtptemplate = GST_STATIC_PAD_TEMPLATE ("stream%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("application/x-rtp; application/x-rdt")); + +/* templates used internally */ +static GstStaticPadTemplate anysrctemplate = +GST_STATIC_PAD_TEMPLATE ("internalsrc%d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate anysinktemplate = +GST_STATIC_PAD_TEMPLATE ("internalsink%d", + GST_PAD_SINK, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); + +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum _GstRtspSrcRtcpSyncMode +{ + RTCP_SYNC_ALWAYS, + RTCP_SYNC_INITIAL, + RTCP_SYNC_RTP +}; + +enum _GstRtspSrcBufferMode +{ + BUFFER_MODE_NONE, + BUFFER_MODE_SLAVE, + BUFFER_MODE_BUFFER, + BUFFER_MODE_AUTO +}; + +#define GST_TYPE_RTSP_SRC_BUFFER_MODE (gst_rtsp_src_buffer_mode_get_type()) +static GType +gst_rtsp_src_buffer_mode_get_type (void) +{ + static GType buffer_mode_type = 0; + static const GEnumValue buffer_modes[] = { + {BUFFER_MODE_NONE, "Only use RTP timestamps", "none"}, + {BUFFER_MODE_SLAVE, "Slave receiver to sender clock", "slave"}, + {BUFFER_MODE_BUFFER, "Do low/high watermark buffering", "buffer"}, + {BUFFER_MODE_AUTO, "Choose mode depending on stream live", "auto"}, + {0, NULL, NULL}, + }; + + if (!buffer_mode_type) { + buffer_mode_type = + g_enum_register_static ("GstRTSPSrcBufferMode", buffer_modes); + } + return buffer_mode_type; +} + +#define DEFAULT_LOCATION NULL +#define DEFAULT_PROTOCOLS GST_RTSP_LOWER_TRANS_UDP | GST_RTSP_LOWER_TRANS_UDP_MCAST | GST_RTSP_LOWER_TRANS_TCP +#define DEFAULT_DEBUG FALSE +#define DEFAULT_RETRY 20 +#define DEFAULT_TIMEOUT 5000000 +#define DEFAULT_UDP_BUFFER_SIZE 0x80000 +#define DEFAULT_TCP_TIMEOUT 20000000 +#define DEFAULT_LATENCY_MS 2000 +#define DEFAULT_CONNECTION_SPEED 0 +#define DEFAULT_NAT_METHOD GST_RTSP_NAT_DUMMY +#define DEFAULT_DO_RTCP TRUE +#define DEFAULT_PROXY NULL +#define DEFAULT_RTP_BLOCKSIZE 0 +#define DEFAULT_USER_ID NULL +#define DEFAULT_USER_PW NULL +#define DEFAULT_BUFFER_MODE BUFFER_MODE_AUTO +#define DEFAULT_PORT_RANGE NULL +#define DEFAULT_SHORT_HEADER FALSE + +enum +{ + PROP_0, + PROP_LOCATION, + PROP_PROTOCOLS, + PROP_DEBUG, + PROP_RETRY, + PROP_TIMEOUT, + PROP_TCP_TIMEOUT, + PROP_LATENCY, + PROP_CONNECTION_SPEED, + PROP_NAT_METHOD, + PROP_DO_RTCP, + PROP_PROXY, + PROP_RTP_BLOCKSIZE, + PROP_USER_ID, + PROP_USER_PW, + PROP_BUFFER_MODE, + PROP_PORT_RANGE, + PROP_UDP_BUFFER_SIZE, + PROP_SHORT_HEADER, + PROP_LAST +}; + +#define GST_TYPE_RTSP_NAT_METHOD (gst_rtsp_nat_method_get_type()) +static GType +gst_rtsp_nat_method_get_type (void) +{ + static GType rtsp_nat_method_type = 0; + static const GEnumValue rtsp_nat_method[] = { + {GST_RTSP_NAT_NONE, "None", "none"}, + {GST_RTSP_NAT_DUMMY, "Send Dummy packets", "dummy"}, + {0, NULL, NULL}, + }; + + if (!rtsp_nat_method_type) { + rtsp_nat_method_type = + g_enum_register_static ("GstRTSPNatMethod", rtsp_nat_method); + } + return rtsp_nat_method_type; +} + +static void gst_rtspsrc_finalize (GObject * object); + +static void gst_rtspsrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtspsrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_rtspsrc_uri_handler_init (gpointer g_iface, + gpointer iface_data); + +static void gst_rtspsrc_sdp_attributes_to_caps (GArray * attributes, + GstCaps * caps); + +static gboolean gst_rtspsrc_set_proxy (GstRTSPSrc * rtsp, const gchar * proxy); +static void gst_rtspsrc_set_tcp_timeout (GstRTSPSrc * rtspsrc, guint64 timeout); + +static GstCaps *gst_rtspsrc_media_to_caps (gint pt, const GstSDPMedia * media); + +static GstStateChangeReturn gst_rtspsrc_change_state (GstElement * element, + GstStateChange transition); +static gboolean gst_rtspsrc_send_event (GstElement * element, GstEvent * event); +static void gst_rtspsrc_handle_message (GstBin * bin, GstMessage * message); + +static gboolean gst_rtspsrc_setup_auth (GstRTSPSrc * src, + GstRTSPMessage * response); + +static void gst_rtspsrc_loop_send_cmd (GstRTSPSrc * src, gint cmd, + gboolean flush); +static GstRTSPResult gst_rtspsrc_send_cb (GstRTSPExtension * ext, + GstRTSPMessage * request, GstRTSPMessage * response, GstRTSPSrc * src); + +static GstRTSPResult gst_rtspsrc_open (GstRTSPSrc * src, gboolean async); +static GstRTSPResult gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, + gboolean async); +static GstRTSPResult gst_rtspsrc_pause (GstRTSPSrc * src, gboolean idle, + gboolean async); +static GstRTSPResult gst_rtspsrc_close (GstRTSPSrc * src, gboolean async, + gboolean only_close); + +static gboolean gst_rtspsrc_uri_set_uri (GstURIHandler * handler, + const gchar * uri); + +static gboolean gst_rtspsrc_activate_streams (GstRTSPSrc * src); +static gboolean gst_rtspsrc_loop (GstRTSPSrc * src); +static gboolean gst_rtspsrc_stream_push_event (GstRTSPSrc * src, + GstRTSPStream * stream, GstEvent * event, gboolean source); +static gboolean gst_rtspsrc_push_event (GstRTSPSrc * src, GstEvent * event, + gboolean source); + +/* commands we send to out loop to notify it of events */ +#define CMD_OPEN 0 +#define CMD_PLAY 1 +#define CMD_PAUSE 2 +#define CMD_CLOSE 3 +#define CMD_WAIT 4 +#define CMD_RECONNECT 5 +#define CMD_LOOP 6 + +#define GST_ELEMENT_PROGRESS(el, type, code, text) \ +G_STMT_START { \ + gchar *__txt = _gst_element_error_printf text; \ + gst_element_post_message (GST_ELEMENT_CAST (el), \ + gst_message_new_progress (GST_OBJECT_CAST (el), \ + GST_PROGRESS_TYPE_ ##type, code, __txt)); \ + g_free (__txt); \ +} G_STMT_END + +/*static guint gst_rtspsrc_signals[LAST_SIGNAL] = { 0 }; */ + +static void +_do_init (GType rtspsrc_type) +{ + static const GInterfaceInfo urihandler_info = { + gst_rtspsrc_uri_handler_init, + NULL, + NULL + }; + + GST_DEBUG_CATEGORY_INIT (rtspsrc_debug, "rtspsrc", 0, "RTSP src"); + + g_type_add_interface_static (rtspsrc_type, GST_TYPE_URI_HANDLER, + &urihandler_info); +} + +GST_BOILERPLATE_FULL (GstRTSPSrc, gst_rtspsrc, GstBin, GST_TYPE_BIN, _do_init); + +static void +gst_rtspsrc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &rtptemplate); + + gst_element_class_set_details_simple (element_class, "RTSP packet receiver", + "Source/Network", + "Receive data over the network via RTSP (RFC 2326)", + "Wim Taymans , " + "Thijs Vermeir , " + "Lutz Mueller "); +} + +static void +gst_rtspsrc_class_init (GstRTSPSrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBinClass *gstbin_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbin_class = (GstBinClass *) klass; + + gobject_class->set_property = gst_rtspsrc_set_property; + gobject_class->get_property = gst_rtspsrc_get_property; + + gobject_class->finalize = gst_rtspsrc_finalize; + + g_object_class_install_property (gobject_class, PROP_LOCATION, + g_param_spec_string ("location", "RTSP Location", + "Location of the RTSP url to read", + DEFAULT_LOCATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_PROTOCOLS, + g_param_spec_flags ("protocols", "Protocols", + "Allowed lower transport protocols", GST_TYPE_RTSP_LOWER_TRANS, + DEFAULT_PROTOCOLS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DEBUG, + g_param_spec_boolean ("debug", "Debug", + "Dump request and response messages to stdout", + DEFAULT_DEBUG, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_RETRY, + g_param_spec_uint ("retry", "Retry", + "Max number of retries when allocating RTP ports.", + 0, G_MAXUINT16, DEFAULT_RETRY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TIMEOUT, + g_param_spec_uint64 ("timeout", "Timeout", + "Retry TCP transport after UDP timeout microseconds (0 = disabled)", + 0, G_MAXUINT64, DEFAULT_TIMEOUT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TCP_TIMEOUT, + g_param_spec_uint64 ("tcp-timeout", "TCP Timeout", + "Fail after timeout microseconds on TCP connections (0 = disabled)", + 0, G_MAXUINT64, DEFAULT_TCP_TIMEOUT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_LATENCY, + g_param_spec_uint ("latency", "Buffer latency in ms", + "Amount of ms to buffer", 0, G_MAXUINT, DEFAULT_LATENCY_MS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_CONNECTION_SPEED, + g_param_spec_uint ("connection-speed", "Connection Speed", + "Network connection speed in kbps (0 = unknown)", + 0, G_MAXINT / 1000, DEFAULT_CONNECTION_SPEED, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_NAT_METHOD, + g_param_spec_enum ("nat-method", "NAT Method", + "Method to use for traversing firewalls and NAT", + GST_TYPE_RTSP_NAT_METHOD, DEFAULT_NAT_METHOD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRTSPSrc::do-rtcp + * + * Enable RTCP support. Some old server don't like RTCP and then this property + * needs to be set to FALSE. + * + * Since: 0.10.15 + */ + g_object_class_install_property (gobject_class, PROP_DO_RTCP, + g_param_spec_boolean ("do-rtcp", "Do RTCP", + "Send RTCP packets, disable for old incompatible server.", + DEFAULT_DO_RTCP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRTSPSrc::proxy + * + * Set the proxy parameters. This has to be a string of the format + * [http://][user:passwd@]host[:port]. + * + * Since: 0.10.15 + */ + g_object_class_install_property (gobject_class, PROP_PROXY, + g_param_spec_string ("proxy", "Proxy", + "Proxy settings for HTTP tunneling. Format: [http://][user:passwd@]host[:port]", + DEFAULT_PROXY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRTSPSrc::rtp_blocksize + * + * RTP package size to suggest to server. + * + * Since: 0.10.16 + */ + g_object_class_install_property (gobject_class, PROP_RTP_BLOCKSIZE, + g_param_spec_uint ("rtp-blocksize", "RTP Blocksize", + "RTP package size to suggest to server (0 = disabled)", + 0, 65536, DEFAULT_RTP_BLOCKSIZE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_USER_ID, + g_param_spec_string ("user-id", "user-id", + "RTSP location URI user id for authentication", DEFAULT_USER_ID, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_USER_PW, + g_param_spec_string ("user-pw", "user-pw", + "RTSP location URI user password for authentication", DEFAULT_USER_PW, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRTSPSrc::buffer-mode: + * + * Control the buffering and timestamping mode used by the jitterbuffer. + * + * Since: 0.10.22 + */ + g_object_class_install_property (gobject_class, PROP_BUFFER_MODE, + g_param_spec_enum ("buffer-mode", "Buffer Mode", + "Control the buffering algorithm in use", + GST_TYPE_RTSP_SRC_BUFFER_MODE, DEFAULT_BUFFER_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRTSPSrc::port-range: + * + * Configure the client port numbers that can be used to recieve RTP and + * RTCP. + * + * Since: 0.10.25 + */ + g_object_class_install_property (gobject_class, PROP_PORT_RANGE, + g_param_spec_string ("port-range", "Port range", + "Client port range that can be used to receive RTP and RTCP data, " + "eg. 3000-3005 (NULL = no restrictions)", DEFAULT_PORT_RANGE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRTSPSrc::udp-buffer-size: + * + * Size of the kernel UDP receive buffer in bytes. + * + * Since: 0.10.26 + */ + g_object_class_install_property (gobject_class, PROP_UDP_BUFFER_SIZE, + g_param_spec_int ("udp-buffer-size", "UDP Buffer Size", + "Size of the kernel UDP receive buffer in bytes, 0=default", + 0, G_MAXINT, DEFAULT_UDP_BUFFER_SIZE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstRTSPSrc::short-header: + * + * Only send the basic RTSP headers for broken encoders. + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_SHORT_HEADER, + g_param_spec_boolean ("short-header", "Short Header", + "Only send the basic RTSP headers for broken encoders", + DEFAULT_SHORT_HEADER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->send_event = gst_rtspsrc_send_event; + gstelement_class->change_state = gst_rtspsrc_change_state; + + gstbin_class->handle_message = gst_rtspsrc_handle_message; + + gst_rtsp_ext_list_init (); +} + + +static void +gst_rtspsrc_init (GstRTSPSrc * src, GstRTSPSrcClass * g_class) +{ +#ifdef G_OS_WIN32 + WSADATA wsa_data; + + if (WSAStartup (MAKEWORD (2, 2), &wsa_data) != 0) { + GST_ERROR_OBJECT (src, "WSAStartup failed: 0x%08x", WSAGetLastError ()); + } +#endif + + src->conninfo.location = g_strdup (DEFAULT_LOCATION); + src->protocols = DEFAULT_PROTOCOLS; + src->debug = DEFAULT_DEBUG; + src->retry = DEFAULT_RETRY; + src->udp_timeout = DEFAULT_TIMEOUT; + gst_rtspsrc_set_tcp_timeout (src, DEFAULT_TCP_TIMEOUT); + src->latency = DEFAULT_LATENCY_MS; + src->connection_speed = DEFAULT_CONNECTION_SPEED; + src->nat_method = DEFAULT_NAT_METHOD; + src->do_rtcp = DEFAULT_DO_RTCP; + gst_rtspsrc_set_proxy (src, DEFAULT_PROXY); + src->rtp_blocksize = DEFAULT_RTP_BLOCKSIZE; + src->user_id = g_strdup (DEFAULT_USER_ID); + src->user_pw = g_strdup (DEFAULT_USER_PW); + src->buffer_mode = DEFAULT_BUFFER_MODE; + src->client_port_range.min = 0; + src->client_port_range.max = 0; + src->udp_buffer_size = DEFAULT_UDP_BUFFER_SIZE; + src->short_header = DEFAULT_SHORT_HEADER; + +#ifdef GST_EXT_RTSPSRC_MODIFICATION + src->wait_pause_response = FALSE; +#endif + + /* get a list of all extensions */ + src->extensions = gst_rtsp_ext_list_get (); + + /* connect to send signal */ + gst_rtsp_ext_list_connect (src->extensions, "send", + (GCallback) gst_rtspsrc_send_cb, src); + + /* protects the streaming thread in interleaved mode or the polling + * thread in UDP mode. */ + src->stream_rec_lock = g_new (GStaticRecMutex, 1); + g_static_rec_mutex_init (src->stream_rec_lock); + + /* protects our state changes from multiple invocations */ + src->state_rec_lock = g_new (GStaticRecMutex, 1); + g_static_rec_mutex_init (src->state_rec_lock); + + src->state = GST_RTSP_STATE_INVALID; + + GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); +} + +static void +gst_rtspsrc_finalize (GObject * object) +{ + GstRTSPSrc *rtspsrc; + + rtspsrc = GST_RTSPSRC (object); + + gst_rtsp_ext_list_free (rtspsrc->extensions); + g_free (rtspsrc->conninfo.location); + gst_rtsp_url_free (rtspsrc->conninfo.url); + g_free (rtspsrc->conninfo.url_str); + g_free (rtspsrc->user_id); + g_free (rtspsrc->user_pw); + + if (rtspsrc->sdp) { + gst_sdp_message_free (rtspsrc->sdp); + rtspsrc->sdp = NULL; + } + + /* free locks */ + g_static_rec_mutex_free (rtspsrc->stream_rec_lock); + g_free (rtspsrc->stream_rec_lock); + g_static_rec_mutex_free (rtspsrc->state_rec_lock); + g_free (rtspsrc->state_rec_lock); + +#ifdef G_OS_WIN32 + WSACleanup (); +#endif + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* a proxy string of the format [user:passwd@]host[:port] */ +static gboolean +gst_rtspsrc_set_proxy (GstRTSPSrc * rtsp, const gchar * proxy) +{ + gchar *p, *at, *col; + + g_free (rtsp->proxy_user); + rtsp->proxy_user = NULL; + g_free (rtsp->proxy_passwd); + rtsp->proxy_passwd = NULL; + g_free (rtsp->proxy_host); + rtsp->proxy_host = NULL; + rtsp->proxy_port = 0; + + p = (gchar *) proxy; + + if (p == NULL) + return TRUE; + + /* we allow http:// in front but ignore it */ + if (g_str_has_prefix (p, "http://")) + p += 7; + + at = strchr (p, '@'); + if (at) { + /* look for user:passwd */ + col = strchr (proxy, ':'); + if (col == NULL || col > at) + return FALSE; + + rtsp->proxy_user = g_strndup (p, col - p); + col++; + rtsp->proxy_passwd = g_strndup (col, at - col); + + /* move to host */ + p = at + 1; + } + col = strchr (p, ':'); + + if (col) { + /* everything before the colon is the hostname */ + rtsp->proxy_host = g_strndup (p, col - p); + p = col + 1; + rtsp->proxy_port = strtoul (p, (char **) &p, 10); + } else { + rtsp->proxy_host = g_strdup (p); + rtsp->proxy_port = 8080; + } + return TRUE; +} + +static void +gst_rtspsrc_set_tcp_timeout (GstRTSPSrc * rtspsrc, guint64 timeout) +{ + rtspsrc->tcp_timeout.tv_sec = timeout / G_USEC_PER_SEC; + rtspsrc->tcp_timeout.tv_usec = timeout % G_USEC_PER_SEC; + + if (timeout != 0) + rtspsrc->ptcp_timeout = &rtspsrc->tcp_timeout; + else + rtspsrc->ptcp_timeout = NULL; +} + +static void +gst_rtspsrc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstRTSPSrc *rtspsrc; + + rtspsrc = GST_RTSPSRC (object); + + switch (prop_id) { + case PROP_LOCATION: + gst_rtspsrc_uri_set_uri (GST_URI_HANDLER (rtspsrc), + g_value_get_string (value)); + break; + case PROP_PROTOCOLS: + rtspsrc->protocols = g_value_get_flags (value); + break; + case PROP_DEBUG: + rtspsrc->debug = g_value_get_boolean (value); + break; + case PROP_RETRY: + rtspsrc->retry = g_value_get_uint (value); + break; + case PROP_TIMEOUT: + rtspsrc->udp_timeout = g_value_get_uint64 (value); + break; + case PROP_TCP_TIMEOUT: + gst_rtspsrc_set_tcp_timeout (rtspsrc, g_value_get_uint64 (value)); + break; + case PROP_LATENCY: + rtspsrc->latency = g_value_get_uint (value); + break; + case PROP_CONNECTION_SPEED: + rtspsrc->connection_speed = g_value_get_uint (value); + break; + case PROP_NAT_METHOD: + rtspsrc->nat_method = g_value_get_enum (value); + break; + case PROP_DO_RTCP: + rtspsrc->do_rtcp = g_value_get_boolean (value); + break; + case PROP_PROXY: + gst_rtspsrc_set_proxy (rtspsrc, g_value_get_string (value)); + break; + case PROP_RTP_BLOCKSIZE: + rtspsrc->rtp_blocksize = g_value_get_uint (value); + break; + case PROP_USER_ID: + if (rtspsrc->user_id) + g_free (rtspsrc->user_id); + rtspsrc->user_id = g_value_dup_string (value); + break; + case PROP_USER_PW: + if (rtspsrc->user_pw) + g_free (rtspsrc->user_pw); + rtspsrc->user_pw = g_value_dup_string (value); + break; + case PROP_BUFFER_MODE: + rtspsrc->buffer_mode = g_value_get_enum (value); + break; + case PROP_PORT_RANGE: + { + const gchar *str; + + str = g_value_get_string (value); + if (str) { + sscanf (str, "%u-%u", + &rtspsrc->client_port_range.min, &rtspsrc->client_port_range.max); + } else { + rtspsrc->client_port_range.min = 0; + rtspsrc->client_port_range.max = 0; + } + break; + } + case PROP_UDP_BUFFER_SIZE: + rtspsrc->udp_buffer_size = g_value_get_int (value); + break; + case PROP_SHORT_HEADER: + rtspsrc->short_header = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_rtspsrc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstRTSPSrc *rtspsrc; + + rtspsrc = GST_RTSPSRC (object); + + switch (prop_id) { + case PROP_LOCATION: + g_value_set_string (value, rtspsrc->conninfo.location); + break; + case PROP_PROTOCOLS: + g_value_set_flags (value, rtspsrc->protocols); + break; + case PROP_DEBUG: + g_value_set_boolean (value, rtspsrc->debug); + break; + case PROP_RETRY: + g_value_set_uint (value, rtspsrc->retry); + break; + case PROP_TIMEOUT: + g_value_set_uint64 (value, rtspsrc->udp_timeout); + break; + case PROP_TCP_TIMEOUT: + { + guint64 timeout; + + timeout = rtspsrc->tcp_timeout.tv_sec * G_USEC_PER_SEC + + rtspsrc->tcp_timeout.tv_usec; + g_value_set_uint64 (value, timeout); + break; + } + case PROP_LATENCY: + g_value_set_uint (value, rtspsrc->latency); + break; + case PROP_CONNECTION_SPEED: + g_value_set_uint (value, rtspsrc->connection_speed); + break; + case PROP_NAT_METHOD: + g_value_set_enum (value, rtspsrc->nat_method); + break; + case PROP_DO_RTCP: + g_value_set_boolean (value, rtspsrc->do_rtcp); + break; + case PROP_PROXY: + { + gchar *str; + + if (rtspsrc->proxy_host) { + str = + g_strdup_printf ("%s:%d", rtspsrc->proxy_host, rtspsrc->proxy_port); + } else { + str = NULL; + } + g_value_take_string (value, str); + break; + } + case PROP_RTP_BLOCKSIZE: + g_value_set_uint (value, rtspsrc->rtp_blocksize); + break; + case PROP_USER_ID: + g_value_set_string (value, rtspsrc->user_id); + break; + case PROP_USER_PW: + g_value_set_string (value, rtspsrc->user_pw); + break; + case PROP_BUFFER_MODE: + g_value_set_enum (value, rtspsrc->buffer_mode); + break; + case PROP_PORT_RANGE: + { + gchar *str; + + if (rtspsrc->client_port_range.min != 0) { + str = g_strdup_printf ("%u-%u", rtspsrc->client_port_range.min, + rtspsrc->client_port_range.max); + } else { + str = NULL; + } + g_value_take_string (value, str); + break; + } + case PROP_UDP_BUFFER_SIZE: + g_value_set_int (value, rtspsrc->udp_buffer_size); + break; + case PROP_SHORT_HEADER: + g_value_set_boolean (value, rtspsrc->short_header); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gint +find_stream_by_id (GstRTSPStream * stream, gint * id) +{ + if (stream->id == *id) + return 0; + + return -1; +} + +static gint +find_stream_by_channel (GstRTSPStream * stream, gint * channel) +{ + if (stream->channel[0] == *channel || stream->channel[1] == *channel) + return 0; + + return -1; +} + +static gint +find_stream_by_pt (GstRTSPStream * stream, gint * pt) +{ + if (stream->pt == *pt) + return 0; + + return -1; +} + +static gint +find_stream_by_udpsrc (GstRTSPStream * stream, gconstpointer a) +{ + GstElement *src = (GstElement *) a; + + if (stream->udpsrc[0] == src) + return 0; + if (stream->udpsrc[1] == src) + return 0; + + return -1; +} + +static gint +find_stream_by_setup (GstRTSPStream * stream, gconstpointer a) +{ + /* check qualified setup_url */ + if (!strcmp (stream->conninfo.location, (gchar *) a)) + return 0; + /* check original control_url */ + if (!strcmp (stream->control_url, (gchar *) a)) + return 0; + + /* check if qualified setup_url ends with string */ + if (g_str_has_suffix (stream->control_url, (gchar *) a)) + return 0; + + return -1; +} + +static GstRTSPStream * +find_stream (GstRTSPSrc * src, gconstpointer data, gconstpointer func) +{ + GList *lstream; + + /* find and get stream */ + if ((lstream = g_list_find_custom (src->streams, data, (GCompareFunc) func))) + return (GstRTSPStream *) lstream->data; + + return NULL; +} + +static const GstSDPBandwidth * +gst_rtspsrc_get_bandwidth (GstRTSPSrc * src, const GstSDPMessage * sdp, + const GstSDPMedia * media, const gchar * type) +{ + guint i, len; + + /* first look in the media specific section */ + len = gst_sdp_media_bandwidths_len (media); + for (i = 0; i < len; i++) { + const GstSDPBandwidth *bw = gst_sdp_media_get_bandwidth (media, i); + + if (strcmp (bw->bwtype, type) == 0) + return bw; + } + /* then look in the message specific section */ + len = gst_sdp_message_bandwidths_len (sdp); + for (i = 0; i < len; i++) { + const GstSDPBandwidth *bw = gst_sdp_message_get_bandwidth (sdp, i); + + if (strcmp (bw->bwtype, type) == 0) + return bw; + } + return NULL; +} + +static void +gst_rtspsrc_collect_bandwidth (GstRTSPSrc * src, const GstSDPMessage * sdp, + const GstSDPMedia * media, GstRTSPStream * stream) +{ + const GstSDPBandwidth *bw; + + if ((bw = gst_rtspsrc_get_bandwidth (src, sdp, media, GST_SDP_BWTYPE_AS))) + stream->as_bandwidth = bw->bandwidth; + else + stream->as_bandwidth = -1; + + if ((bw = gst_rtspsrc_get_bandwidth (src, sdp, media, GST_SDP_BWTYPE_RR))) + stream->rr_bandwidth = bw->bandwidth; + else + stream->rr_bandwidth = -1; + + if ((bw = gst_rtspsrc_get_bandwidth (src, sdp, media, GST_SDP_BWTYPE_RS))) + stream->rs_bandwidth = bw->bandwidth; + else + stream->rs_bandwidth = -1; +} + +static void +gst_rtspsrc_do_stream_connection (GstRTSPSrc * src, GstRTSPStream * stream, + const GstSDPConnection * conn) +{ + if (conn->nettype == NULL || strcmp (conn->nettype, "IN") != 0) + return; + + if (conn->addrtype == NULL) + return; + + /* check for IPV6 */ + if (strcmp (conn->addrtype, "IP4") == 0) + stream->is_ipv6 = FALSE; + else if (strcmp (conn->addrtype, "IP6") == 0) + stream->is_ipv6 = TRUE; + else + return; + + /* save address */ + g_free (stream->destination); + stream->destination = g_strdup (conn->address); + + /* check for multicast */ + stream->is_multicast = + gst_sdp_address_is_multicast (conn->nettype, conn->addrtype, + conn->address); + stream->ttl = conn->ttl; +} + +/* Go over the connections for a stream. + * - If we are dealing with IPV6, we will setup IPV6 sockets for sending and + * receiving. + * - If we are dealing with a localhost address, we disable multicast + */ +static void +gst_rtspsrc_collect_connections (GstRTSPSrc * src, const GstSDPMessage * sdp, + const GstSDPMedia * media, GstRTSPStream * stream) +{ + const GstSDPConnection *conn; + guint i, len; + + /* first look in the media specific section */ + len = gst_sdp_media_connections_len (media); + for (i = 0; i < len; i++) { + conn = gst_sdp_media_get_connection (media, i); + + gst_rtspsrc_do_stream_connection (src, stream, conn); + } + /* then look in the message specific section */ + if ((conn = gst_sdp_message_get_connection (sdp))) { + gst_rtspsrc_do_stream_connection (src, stream, conn); + } +} + +static GstRTSPStream * +gst_rtspsrc_create_stream (GstRTSPSrc * src, GstSDPMessage * sdp, gint idx) +{ + GstRTSPStream *stream; + const gchar *control_url; + const gchar *payload; + const GstSDPMedia *media; + + /* get media, should not return NULL */ + media = gst_sdp_message_get_media (sdp, idx); + if (media == NULL) + return NULL; + + stream = g_new0 (GstRTSPStream, 1); + stream->parent = src; + /* we mark the pad as not linked, we will mark it as OK when we add the pad to + * the element. */ + stream->last_ret = GST_FLOW_NOT_LINKED; + stream->added = FALSE; + stream->disabled = FALSE; + stream->id = src->numstreams++; + stream->eos = FALSE; + stream->discont = TRUE; + stream->seqbase = -1; + stream->timebase = -1; + + /* collect bandwidth information for this steam. FIXME, configure in the RTP + * session manager to scale RTCP. */ + gst_rtspsrc_collect_bandwidth (src, sdp, media, stream); + + /* collect connection info */ + gst_rtspsrc_collect_connections (src, sdp, media, stream); + + /* we must have a payload. No payload means we cannot create caps */ + /* FIXME, handle multiple formats. The problem here is that we just want to + * take the first available format that we can handle but in order to do that + * we need to scan for depayloader plugins. Scanning for payloader plugins is + * also suboptimal because the user maybe just wants to save the raw stream + * and then we don't care. */ + if ((payload = gst_sdp_media_get_format (media, 0))) { + stream->pt = atoi (payload); + /* convert caps */ + stream->caps = gst_rtspsrc_media_to_caps (stream->pt, media); + + GST_DEBUG ("mapping sdp session level attributes to caps"); + gst_rtspsrc_sdp_attributes_to_caps (sdp->attributes, stream->caps); + GST_DEBUG ("mapping sdp media level attributes to caps"); + gst_rtspsrc_sdp_attributes_to_caps (media->attributes, stream->caps); + + if (stream->pt >= 96) { + /* If we have a dynamic payload type, see if we have a stream with the + * same payload number. If there is one, they are part of the same + * container and we only need to add one pad. */ + if (find_stream (src, &stream->pt, (gpointer) find_stream_by_pt)) { + stream->container = TRUE; + GST_DEBUG ("found another stream with pt %d, marking as container", + stream->pt); + } + } + } + /* collect port number */ + stream->port = gst_sdp_media_get_port (media); + + /* get control url to construct the setup url. The setup url is used to + * configure the transport of the stream and is used to identity the stream in + * the RTP-Info header field returned from PLAY. */ + control_url = gst_sdp_media_get_attribute_val (media, "control"); + if (control_url == NULL) + control_url = gst_sdp_message_get_attribute_val_n (sdp, "control", 0); + + GST_DEBUG_OBJECT (src, "stream %d, (%p)", stream->id, stream); + GST_DEBUG_OBJECT (src, " pt: %d", stream->pt); + GST_DEBUG_OBJECT (src, " port: %d", stream->port); + GST_DEBUG_OBJECT (src, " container: %d", stream->container); + GST_DEBUG_OBJECT (src, " caps: %" GST_PTR_FORMAT, stream->caps); + GST_DEBUG_OBJECT (src, " control: %s", GST_STR_NULL (control_url)); + + if (control_url != NULL) { + stream->control_url = g_strdup (control_url); + /* Build a fully qualified url using the content_base if any or by prefixing + * the original request. + * If the control_url starts with a '/' or a non rtsp: protocol we will most + * likely build a URL that the server will fail to understand, this is ok, + * we will fail then. */ + if (g_str_has_prefix (control_url, "rtsp://")) + stream->conninfo.location = g_strdup (control_url); + else { + const gchar *base; + gboolean has_slash; + + if (g_strcmp0 (control_url, "*") == 0) + control_url = ""; + + if (src->control) + base = src->control; + else if (src->content_base) + base = src->content_base; + else if (src->conninfo.url_str) + base = src->conninfo.url_str; + else + base = "/"; + + /* check if the base ends or control starts with / */ + has_slash = g_str_has_prefix (control_url, "/"); + has_slash = has_slash || g_str_has_suffix (base, "/"); + + /* concatenate the two strings, insert / when not present */ + stream->conninfo.location = + g_strdup_printf ("%s%s%s", base, has_slash ? "" : "/", control_url); + } + } + GST_DEBUG_OBJECT (src, " setup: %s", + GST_STR_NULL (stream->conninfo.location)); + + /* we keep track of all streams */ + src->streams = g_list_append (src->streams, stream); + + return stream; + + /* ERRORS */ +} + +static void +gst_rtspsrc_stream_free (GstRTSPSrc * src, GstRTSPStream * stream) +{ + gint i; + + GST_DEBUG_OBJECT (src, "free stream %p", stream); + + if (stream->caps) + gst_caps_unref (stream->caps); + + g_free (stream->destination); + g_free (stream->control_url); + g_free (stream->conninfo.location); + + for (i = 0; i < 2; i++) { + if (stream->udpsrc[i]) { + gst_element_set_state (stream->udpsrc[i], GST_STATE_NULL); + gst_bin_remove (GST_BIN_CAST (src), stream->udpsrc[i]); + gst_object_unref (stream->udpsrc[i]); + stream->udpsrc[i] = NULL; + } + if (stream->channelpad[i]) { + gst_object_unref (stream->channelpad[i]); + stream->channelpad[i] = NULL; + } + if (stream->udpsink[i]) { + gst_element_set_state (stream->udpsink[i], GST_STATE_NULL); + gst_bin_remove (GST_BIN_CAST (src), stream->udpsink[i]); + gst_object_unref (stream->udpsink[i]); + stream->udpsink[i] = NULL; + } + } + if (stream->fakesrc) { + gst_element_set_state (stream->fakesrc, GST_STATE_NULL); + gst_bin_remove (GST_BIN_CAST (src), stream->fakesrc); + gst_object_unref (stream->fakesrc); + stream->fakesrc = NULL; + } + if (stream->srcpad) { + gst_pad_set_active (stream->srcpad, FALSE); + if (stream->added) { + gst_element_remove_pad (GST_ELEMENT_CAST (src), stream->srcpad); + stream->added = FALSE; + } + stream->srcpad = NULL; + } + if (stream->rtcppad) { + gst_object_unref (stream->rtcppad); + stream->rtcppad = NULL; + } + if (stream->session) { + g_object_unref (stream->session); + stream->session = NULL; + } + g_free (stream); +} + +static void +gst_rtspsrc_cleanup (GstRTSPSrc * src) +{ + GList *walk; + + GST_DEBUG_OBJECT (src, "cleanup"); + + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + + gst_rtspsrc_stream_free (src, stream); + } + g_list_free (src->streams); + src->streams = NULL; + if (src->manager) { + if (src->manager_sig_id) { + g_signal_handler_disconnect (src->manager, src->manager_sig_id); + src->manager_sig_id = 0; + } + gst_element_set_state (src->manager, GST_STATE_NULL); + gst_bin_remove (GST_BIN_CAST (src), src->manager); + src->manager = NULL; + } + src->numstreams = 0; + if (src->props) + gst_structure_free (src->props); + src->props = NULL; + + g_free (src->content_base); + src->content_base = NULL; + + g_free (src->control); + src->control = NULL; + + if (src->range) + gst_rtsp_range_free (src->range); + src->range = NULL; + + /* don't clear the SDP when it was used in the url */ + if (src->sdp && !src->from_sdp) { + gst_sdp_message_free (src->sdp); + src->sdp = NULL; + } +} + +#define PARSE_INT(p, del, res) \ +G_STMT_START { \ + gchar *t = p; \ + p = strstr (p, del); \ + if (p == NULL) \ + res = -1; \ + else { \ + *p = '\0'; \ + p++; \ + res = atoi (t); \ + } \ +} G_STMT_END + +#define PARSE_STRING(p, del, res) \ +G_STMT_START { \ + gchar *t = p; \ + p = strstr (p, del); \ + if (p == NULL) { \ + res = NULL; \ + p = t; \ + } \ + else { \ + *p = '\0'; \ + p++; \ + res = t; \ + } \ +} G_STMT_END + +#define SKIP_SPACES(p) \ + while (*p && g_ascii_isspace (*p)) \ + p++; + +/* rtpmap contains: + * + * /[/] + */ +static gboolean +gst_rtspsrc_parse_rtpmap (const gchar * rtpmap, gint * payload, gchar ** name, + gint * rate, gchar ** params) +{ + gchar *p, *t; + + p = (gchar *) rtpmap; + + PARSE_INT (p, " ", *payload); + if (*payload == -1) + return FALSE; + + SKIP_SPACES (p); + if (*p == '\0') + return FALSE; + + PARSE_STRING (p, "/", *name); + if (*name == NULL) { + GST_DEBUG ("no rate, name %s", p); + /* no rate, assume -1 then, this is not supposed to happen but RealMedia + * streams seem to omit the rate. */ + *name = p; + *rate = -1; + return TRUE; + } + + t = p; + p = strstr (p, "/"); + if (p == NULL) { + *rate = atoi (t); + return TRUE; + } + *p = '\0'; + p++; + *rate = atoi (t); + + t = p; + if (*p == '\0') + return TRUE; + *params = t; + + return TRUE; +} + +/* + * Mapping SDP attributes to caps + * + * prepend 'a-' to IANA registered sdp attributes names + * (ie: not prefixed with 'x-') in order to avoid + * collision with gstreamer standard caps properties names + */ +static void +gst_rtspsrc_sdp_attributes_to_caps (GArray * attributes, GstCaps * caps) +{ + if (attributes->len > 0) { + GstStructure *s; + guint i; + + s = gst_caps_get_structure (caps, 0); + + for (i = 0; i < attributes->len; i++) { + GstSDPAttribute *attr = &g_array_index (attributes, GstSDPAttribute, i); + gchar *tofree, *key; + + key = attr->key; + + /* skip some of the attribute we already handle */ + if (!strcmp (key, "fmtp")) + continue; + if (!strcmp (key, "rtpmap")) + continue; + if (!strcmp (key, "control")) + continue; + if (!strcmp (key, "range")) + continue; + + /* string must be valid UTF8 */ + if (!g_utf8_validate (attr->value, -1, NULL)) + continue; + + if (!g_str_has_prefix (key, "x-")) + tofree = key = g_strdup_printf ("a-%s", key); + else + tofree = NULL; + + GST_DEBUG ("adding caps: %s=%s", key, attr->value); + gst_structure_set (s, key, G_TYPE_STRING, attr->value, NULL); + g_free (tofree); + } + } +} + +/* + * Mapping of caps to and from SDP fields: + * + * m= RTP/AVP + * a=rtpmap: /[/] + * a=fmtp: [=];... + */ +static GstCaps * +gst_rtspsrc_media_to_caps (gint pt, const GstSDPMedia * media) +{ + GstCaps *caps; + const gchar *rtpmap; + const gchar *fmtp; + gchar *name = NULL; + gint rate = -1; + gchar *params = NULL; + gchar *tmp; + GstStructure *s; + gint payload = 0; + gboolean ret; + + /* get and parse rtpmap */ + if ((rtpmap = gst_sdp_media_get_attribute_val (media, "rtpmap"))) { + ret = gst_rtspsrc_parse_rtpmap (rtpmap, &payload, &name, &rate, ¶ms); + if (ret) { + if (payload != pt) { + /* we ignore the rtpmap if the payload type is different. */ + g_warning ("rtpmap of wrong payload type, ignoring"); + name = NULL; + rate = -1; + params = NULL; + } + } else { + /* if we failed to parse the rtpmap for a dynamic payload type, we have an + * error */ + if (pt >= 96) + goto no_rtpmap; + /* else we can ignore */ + g_warning ("error parsing rtpmap, ignoring"); + } + } else { + /* dynamic payloads need rtpmap or we fail */ + if (pt >= 96) + goto no_rtpmap; + } + /* check if we have a rate, if not, we need to look up the rate from the + * default rates based on the payload types. */ + if (rate == -1) { + const GstRTPPayloadInfo *info; + + if (GST_RTP_PAYLOAD_IS_DYNAMIC (pt)) { + /* dynamic types, use media and encoding_name */ + tmp = g_ascii_strdown (media->media, -1); + info = gst_rtp_payload_info_for_name (tmp, name); + g_free (tmp); + } else { + /* static types, use payload type */ + info = gst_rtp_payload_info_for_pt (pt); + } + + if (info) { + if ((rate = info->clock_rate) == 0) + rate = -1; + } + /* we fail if we cannot find one */ + if (rate == -1) + goto no_rate; + } + + tmp = g_ascii_strdown (media->media, -1); + caps = gst_caps_new_simple ("application/x-unknown", + "media", G_TYPE_STRING, tmp, "payload", G_TYPE_INT, pt, NULL); + g_free (tmp); + s = gst_caps_get_structure (caps, 0); + + gst_structure_set (s, "clock-rate", G_TYPE_INT, rate, NULL); + + /* encoding name must be upper case */ + if (name != NULL) { + tmp = g_ascii_strup (name, -1); + gst_structure_set (s, "encoding-name", G_TYPE_STRING, tmp, NULL); + g_free (tmp); + } + + /* params must be lower case */ + if (params != NULL) { + tmp = g_ascii_strdown (params, -1); + gst_structure_set (s, "encoding-params", G_TYPE_STRING, tmp, NULL); + g_free (tmp); + } + + /* parse optional fmtp: field */ + if ((fmtp = gst_sdp_media_get_attribute_val (media, "fmtp"))) { + gchar *p; + gint payload = 0; + + p = (gchar *) fmtp; + + /* p is now of the format [=];... */ + PARSE_INT (p, " ", payload); + if (payload != -1 && payload == pt) { + gchar **pairs; + gint i; + + /* [=] are separated with ';' */ + pairs = g_strsplit (p, ";", 0); + for (i = 0; pairs[i]; i++) { + gchar *valpos; + const gchar *val, *key; + + /* the key may not have a '=', the value can have other '='s */ + valpos = strstr (pairs[i], "="); + if (valpos) { + /* we have a '=' and thus a value, remove the '=' with \0 */ + *valpos = '\0'; + /* value is everything between '=' and ';'. We split the pairs at ; + * boundaries so we can take the remainder of the value. Some servers + * put spaces around the value which we strip off here. Alternatively + * we could strip those spaces in the depayloaders should these spaces + * actually carry any meaning in the future. */ + val = g_strstrip (valpos + 1); + } else { + /* simple ;.. is translated into =1;... */ + val = "1"; + } + /* strip the key of spaces, convert key to lowercase but not the value. */ + key = g_strstrip (pairs[i]); + if (strlen (key) > 1) { + tmp = g_ascii_strdown (key, -1); + gst_structure_set (s, tmp, G_TYPE_STRING, val, NULL); + g_free (tmp); + } + } + g_strfreev (pairs); + } + } + return caps; + + /* ERRORS */ +no_rtpmap: + { + g_warning ("rtpmap type not given for dynamic payload %d", pt); + return NULL; + } +no_rate: + { + g_warning ("rate unknown for payload type %d", pt); + return NULL; + } +} + +static gboolean +gst_rtspsrc_alloc_udp_ports (GstRTSPStream * stream, + gint * rtpport, gint * rtcpport) +{ + GstRTSPSrc *src; + GstStateChangeReturn ret; + GstElement *udpsrc0, *udpsrc1; + gint tmp_rtp, tmp_rtcp; + guint count; + const gchar *host; + + src = stream->parent; + + udpsrc0 = NULL; + udpsrc1 = NULL; + count = 0; + + /* Start at next port */ + tmp_rtp = src->next_port_num; + + if (stream->is_ipv6) + host = "udp://[::0]"; + else + host = "udp://0.0.0.0"; + + /* try to allocate 2 UDP ports, the RTP port should be an even + * number and the RTCP port should be the next (uneven) port */ +again: + + if (tmp_rtp != 0 && src->client_port_range.max > 0 && + tmp_rtp >= src->client_port_range.max) + goto no_ports; + + udpsrc0 = gst_element_make_from_uri (GST_URI_SRC, host, NULL); + if (udpsrc0 == NULL) + goto no_udp_protocol; + g_object_set (G_OBJECT (udpsrc0), "port", tmp_rtp, "reuse", FALSE, NULL); + + if (src->udp_buffer_size != 0) + g_object_set (G_OBJECT (udpsrc0), "buffer-size", src->udp_buffer_size, + NULL); + + ret = gst_element_set_state (udpsrc0, GST_STATE_PAUSED); + if (ret == GST_STATE_CHANGE_FAILURE) { + if (tmp_rtp != 0) { + GST_DEBUG_OBJECT (src, "Unable to make udpsrc from RTP port %d", tmp_rtp); + + tmp_rtp += 2; + if (++count > src->retry) + goto no_ports; + + GST_DEBUG_OBJECT (src, "free RTP udpsrc"); + gst_element_set_state (udpsrc0, GST_STATE_NULL); + gst_object_unref (udpsrc0); + + GST_DEBUG_OBJECT (src, "retry %d", count); + goto again; + } + goto no_udp_protocol; + } + + g_object_get (G_OBJECT (udpsrc0), "port", &tmp_rtp, NULL); + GST_DEBUG_OBJECT (src, "got RTP port %d", tmp_rtp); + + /* check if port is even */ + if ((tmp_rtp & 0x01) != 0) { + /* port not even, close and allocate another */ + if (++count > src->retry) + goto no_ports; + + GST_DEBUG_OBJECT (src, "RTP port not even"); + + GST_DEBUG_OBJECT (src, "free RTP udpsrc"); + gst_element_set_state (udpsrc0, GST_STATE_NULL); + gst_object_unref (udpsrc0); + + GST_DEBUG_OBJECT (src, "retry %d", count); + tmp_rtp++; + goto again; + } + + /* allocate port+1 for RTCP now */ + udpsrc1 = gst_element_make_from_uri (GST_URI_SRC, host, NULL); + if (udpsrc1 == NULL) + goto no_udp_rtcp_protocol; + + /* set port */ + tmp_rtcp = tmp_rtp + 1; + if (src->client_port_range.max > 0 && tmp_rtcp >= src->client_port_range.max) + goto no_ports; + + g_object_set (G_OBJECT (udpsrc1), "port", tmp_rtcp, "reuse", FALSE, NULL); + + GST_DEBUG_OBJECT (src, "starting RTCP on port %d", tmp_rtcp); + ret = gst_element_set_state (udpsrc1, GST_STATE_PAUSED); + /* tmp_rtcp port is busy already : retry to make rtp/rtcp pair */ + if (ret == GST_STATE_CHANGE_FAILURE) { + GST_DEBUG_OBJECT (src, "Unable to make udpsrc from RTCP port %d", tmp_rtcp); + + if (++count > src->retry) + goto no_ports; + + GST_DEBUG_OBJECT (src, "free RTP udpsrc"); + gst_element_set_state (udpsrc0, GST_STATE_NULL); + gst_object_unref (udpsrc0); + + GST_DEBUG_OBJECT (src, "free RTCP udpsrc"); + gst_element_set_state (udpsrc1, GST_STATE_NULL); + gst_object_unref (udpsrc1); + udpsrc1 = NULL; + + tmp_rtp += 2; + GST_DEBUG_OBJECT (src, "retry %d", count); + goto again; + } + + /* all fine, do port check */ + g_object_get (G_OBJECT (udpsrc0), "port", rtpport, NULL); + g_object_get (G_OBJECT (udpsrc1), "port", rtcpport, NULL); + + /* this should not happen... */ + if (*rtpport != tmp_rtp || *rtcpport != tmp_rtcp) + goto port_error; + + /* we keep these elements, we configure all in configure_transport when the + * server told us to really use the UDP ports. */ + stream->udpsrc[0] = gst_object_ref (udpsrc0); + stream->udpsrc[1] = gst_object_ref (udpsrc1); + + /* keep track of next available port number when we have a range + * configured */ + if (src->next_port_num != 0) + src->next_port_num = tmp_rtcp + 1; + + /* they are ours now */ + gst_object_sink (udpsrc0); + gst_object_sink (udpsrc1); + + return TRUE; + + /* ERRORS */ +no_udp_protocol: + { + GST_DEBUG_OBJECT (src, "could not get UDP source"); + goto cleanup; + } +no_ports: + { + GST_DEBUG_OBJECT (src, "could not allocate UDP port pair after %d retries", + count); + goto cleanup; + } +no_udp_rtcp_protocol: + { + GST_DEBUG_OBJECT (src, "could not get UDP source for RTCP"); + goto cleanup; + } +port_error: + { + GST_DEBUG_OBJECT (src, "ports don't match rtp: %d<->%d, rtcp: %d<->%d", + tmp_rtp, *rtpport, tmp_rtcp, *rtcpport); + goto cleanup; + } +cleanup: + { + if (udpsrc0) { + gst_element_set_state (udpsrc0, GST_STATE_NULL); + gst_object_unref (udpsrc0); + } + if (udpsrc1) { + gst_element_set_state (udpsrc1, GST_STATE_NULL); + gst_object_unref (udpsrc1); + } + return FALSE; + } +} + +static void +gst_rtspsrc_flush (GstRTSPSrc * src, gboolean flush, gboolean playing) +{ + GstEvent *event; + gint cmd, i; + GstState state; + GList *walk; + GstClock *clock; + GstClockTime base_time = GST_CLOCK_TIME_NONE; + + if (flush) { + event = gst_event_new_flush_start (); + GST_DEBUG_OBJECT (src, "start flush"); + cmd = CMD_WAIT; + state = GST_STATE_PAUSED; + } else { + event = gst_event_new_flush_stop (); + GST_DEBUG_OBJECT (src, "stop flush; playing %d", playing); + cmd = CMD_LOOP; + if (playing) + state = GST_STATE_PLAYING; + else + state = GST_STATE_PAUSED; + clock = gst_element_get_clock (GST_ELEMENT_CAST (src)); + if (clock) { + base_time = gst_clock_get_time (clock); + gst_object_unref (clock); + } + } + gst_rtspsrc_push_event (src, event, FALSE); + gst_rtspsrc_loop_send_cmd (src, cmd, flush); + + /* set up manager before data-flow resumes */ + /* to manage jitterbuffer buffer mode */ + if (src->manager) { + gst_element_set_base_time (GST_ELEMENT_CAST (src->manager), base_time); + /* and to have base_time trickle further down, + * e.g. to jitterbuffer for its timeout handling */ + if (base_time != -1) + gst_element_set_state (GST_ELEMENT_CAST (src->manager), state); + } + + /* make running time start start at 0 again */ + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + + for (i = 0; i < 2; i++) { + /* for udp case */ + if (stream->udpsrc[i]) { + if (base_time != -1) + gst_element_set_base_time (stream->udpsrc[i], base_time); + gst_element_set_state (stream->udpsrc[i], state); + } + } + } + /* for tcp interleaved case */ + if (base_time != -1) + gst_element_set_base_time (GST_ELEMENT_CAST (src), base_time); +} + +static GstRTSPResult +gst_rtspsrc_connection_send (GstRTSPSrc * src, GstRTSPConnection * conn, + GstRTSPMessage * message, GTimeVal * timeout) +{ + GstRTSPResult ret; + + if (conn) + ret = gst_rtsp_connection_send (conn, message, timeout); + else + ret = GST_RTSP_ERROR; + + return ret; +} + +static GstRTSPResult +gst_rtspsrc_connection_receive (GstRTSPSrc * src, GstRTSPConnection * conn, + GstRTSPMessage * message, GTimeVal * timeout) +{ + GstRTSPResult ret; + + if (conn) + ret = gst_rtsp_connection_receive (conn, message, timeout); + else + ret = GST_RTSP_ERROR; + + return ret; +} + +static void +gst_rtspsrc_get_position (GstRTSPSrc * src) +{ + GstQuery *query; + GList *walk; + + query = gst_query_new_position (GST_FORMAT_TIME); + /* should be known somewhere down the stream (e.g. jitterbuffer) */ + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + GstFormat fmt; + gint64 pos; + + if (stream->srcpad) { + if (gst_pad_query (stream->srcpad, query)) { + gst_query_parse_position (query, &fmt, &pos); + GST_DEBUG_OBJECT (src, "retaining position %" GST_TIME_FORMAT, + GST_TIME_ARGS (pos)); + src->last_pos = pos; + return; + } + } + } + + src->last_pos = 0; +} + +static gboolean +gst_rtspsrc_do_seek (GstRTSPSrc * src, GstSegment * segment) +{ + src->state = GST_RTSP_STATE_SEEKING; + /* PLAY will add the range header now. */ + src->need_range = TRUE; + + return TRUE; +} + +static gboolean +gst_rtspsrc_perform_seek (GstRTSPSrc * src, GstEvent * event) +{ + gdouble rate; + GstFormat format; + GstSeekFlags flags; + GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type; + gint64 cur, stop; + gboolean flush, skip; + gboolean update; + gboolean playing; + GstSegment seeksegment = { 0, }; + GList *walk; + + if (event) { + GST_DEBUG_OBJECT (src, "doing seek with event"); + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + /* no negative rates yet */ + if (rate < 0.0) + goto negative_rate; + + /* we need TIME format */ + if (format != src->segment.format) + goto no_format; + } else { + GST_DEBUG_OBJECT (src, "doing seek without event"); + flags = 0; + cur_type = GST_SEEK_TYPE_SET; + stop_type = GST_SEEK_TYPE_SET; + } + + /* get flush flag */ + flush = flags & GST_SEEK_FLAG_FLUSH; + skip = flags & GST_SEEK_FLAG_SKIP; + + /* now we need to make sure the streaming thread is stopped. We do this by + * either sending a FLUSH_START event downstream which will cause the + * streaming thread to stop with a WRONG_STATE. + * For a non-flushing seek we simply pause the task, which will happen as soon + * as it completes one iteration (and thus might block when the sink is + * blocking in preroll). */ + if (flush) { + GST_DEBUG_OBJECT (src, "starting flush"); + gst_rtspsrc_flush (src, TRUE, FALSE); + } else { + if (src->task) { + gst_task_pause (src->task); + } + } + + /* we should now be able to grab the streaming thread because we stopped it + * with the above flush/pause code */ + GST_RTSP_STREAM_LOCK (src); + + GST_DEBUG_OBJECT (src, "stopped streaming"); + + /* copy segment, we need this because we still need the old + * segment when we close the current segment. */ + memcpy (&seeksegment, &src->segment, sizeof (GstSegment)); + + /* configure the seek parameters in the seeksegment. We will then have the + * right values in the segment to perform the seek */ + if (event) { + GST_DEBUG_OBJECT (src, "configuring seek"); + gst_segment_set_seek (&seeksegment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + } + + /* figure out the last position we need to play. If it's configured (stop != + * -1), use that, else we play until the total duration of the file */ + if ((stop = seeksegment.stop) == -1) + stop = seeksegment.duration; + + playing = (src->state == GST_RTSP_STATE_PLAYING); + + /* if we were playing, pause first */ + if (playing) { + /* obtain current position in case seek fails */ + gst_rtspsrc_get_position (src); + gst_rtspsrc_pause (src, FALSE, FALSE); + } + + gst_rtspsrc_do_seek (src, &seeksegment); + + /* and continue playing */ + if (playing) + gst_rtspsrc_play (src, &seeksegment, FALSE); + + /* prepare for streaming again */ + if (flush) { + /* if we started flush, we stop now */ + GST_DEBUG_OBJECT (src, "stopping flush"); + gst_rtspsrc_flush (src, FALSE, playing); + } else if (src->running) { + /* re-engage loop */ + gst_rtspsrc_loop_send_cmd (src, CMD_LOOP, FALSE); + + /* we are running the current segment and doing a non-flushing seek, + * close the segment first based on the previous last_stop. */ + GST_DEBUG_OBJECT (src, "closing running segment %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, src->segment.accum, src->segment.last_stop); + + /* queue the segment for sending in the stream thread */ + if (src->close_segment) + gst_event_unref (src->close_segment); + src->close_segment = gst_event_new_new_segment (TRUE, + src->segment.rate, src->segment.format, + src->segment.accum, src->segment.last_stop, src->segment.accum); + + /* keep track of our last_stop */ + seeksegment.accum = src->segment.last_stop; + } + + /* now we did the seek and can activate the new segment values */ + memcpy (&src->segment, &seeksegment, sizeof (GstSegment)); + + /* if we're doing a segment seek, post a SEGMENT_START message */ + if (src->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT_CAST (src), + gst_message_new_segment_start (GST_OBJECT_CAST (src), + src->segment.format, src->segment.last_stop)); + } + + /* now create the newsegment */ + GST_DEBUG_OBJECT (src, "Creating newsegment from %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, src->segment.last_stop, stop); + + /* store the newsegment event so it can be sent from the streaming thread. */ + if (src->start_segment) + gst_event_unref (src->start_segment); + src->start_segment = + gst_event_new_new_segment (FALSE, src->segment.rate, + src->segment.format, src->segment.last_stop, stop, + src->segment.last_stop); + + /* mark discont */ + GST_DEBUG_OBJECT (src, "mark DISCONT, we did a seek to another position"); + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + stream->discont = TRUE; + } + src->skip = skip; + + GST_RTSP_STREAM_UNLOCK (src); + + return TRUE; + + /* ERRORS */ +negative_rate: + { + GST_DEBUG_OBJECT (src, "negative playback rates are not supported yet."); + return FALSE; + } +no_format: + { + GST_DEBUG_OBJECT (src, "unsupported format given, seek aborted."); + return FALSE; + } +} + +static gboolean +gst_rtspsrc_handle_src_event (GstPad * pad, GstEvent * event) +{ + GstRTSPSrc *src; + gboolean res = TRUE; + gboolean forward; + + src = GST_RTSPSRC_CAST (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (src, "pad %s:%s received event %s", + GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + res = gst_rtspsrc_perform_seek (src, event); + forward = FALSE; + break; + case GST_EVENT_QOS: + case GST_EVENT_NAVIGATION: + case GST_EVENT_LATENCY: + default: + forward = TRUE; + break; + } + if (forward) { + GstPad *target; + + if ((target = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (pad)))) { + res = gst_pad_send_event (target, event); + gst_object_unref (target); + } else { + gst_event_unref (event); + } + } else { + gst_event_unref (event); + } + gst_object_unref (src); + + return res; +} + +/* this is the final event function we receive on the internal source pad when + * we deal with TCP connections */ +static gboolean +gst_rtspsrc_handle_internal_src_event (GstPad * pad, GstEvent * event) +{ + gboolean res; + + GST_DEBUG_OBJECT (pad, "received event %s", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + case GST_EVENT_QOS: + case GST_EVENT_NAVIGATION: + case GST_EVENT_LATENCY: + default: + gst_event_unref (event); + res = TRUE; + break; + } + return res; +} + +/* this is the final query function we receive on the internal source pad when + * we deal with TCP connections */ +static gboolean +gst_rtspsrc_handle_internal_src_query (GstPad * pad, GstQuery * query) +{ + GstRTSPSrc *src; + gboolean res = TRUE; + + src = GST_RTSPSRC_CAST (gst_pad_get_element_private (pad)); + + GST_DEBUG_OBJECT (src, "pad %s:%s received query %s", + GST_DEBUG_PAD_NAME (pad), GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + /* no idea */ + break; + } + case GST_QUERY_DURATION: + { + GstFormat format; + + gst_query_parse_duration (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME: + gst_query_set_duration (query, format, src->segment.duration); + break; + default: + res = FALSE; + break; + } + break; + } + case GST_QUERY_LATENCY: + { + /* we are live with a min latency of 0 and unlimited max latency, this + * result will be updated by the session manager if there is any. */ + gst_query_set_latency (query, TRUE, 0, -1); + break; + } + default: + break; + } + + return res; +} + +/* this query is executed on the ghost source pad exposed on rtspsrc. */ +static gboolean +gst_rtspsrc_handle_src_query (GstPad * pad, GstQuery * query) +{ + GstRTSPSrc *src; + gboolean res = FALSE; + + src = GST_RTSPSRC_CAST (gst_pad_get_parent (pad)); + + GST_DEBUG_OBJECT (src, "pad %s:%s received query %s", + GST_DEBUG_PAD_NAME (pad), GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_DURATION: + { + GstFormat format; + + gst_query_parse_duration (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME: + gst_query_set_duration (query, format, src->segment.duration); + res = TRUE; + break; + default: + break; + } + break; + } + case GST_QUERY_SEEKING: + { + GstFormat format; + + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + if (format == GST_FORMAT_TIME) { + gboolean seekable = + src->cur_protocols != GST_RTSP_LOWER_TRANS_UDP_MCAST; + + /* seeking without duration is unlikely */ + seekable = seekable && src->seekable && src->segment.duration && + GST_CLOCK_TIME_IS_VALID (src->segment.duration); + + /* FIXME ?? should we have 0 and segment.duration here; see demuxers */ + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, + src->segment.start, src->segment.stop); + res = TRUE; + } + break; + } + default: + { + GstPad *target = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (pad)); + + /* forward the query to the proxy target pad */ + if (target) { + res = gst_pad_query (target, query); + gst_object_unref (target); + } + break; + } + } + gst_object_unref (src); + + return res; +} + +/* callback for RTCP messages to be sent to the server when operating in TCP + * mode. */ +static GstFlowReturn +gst_rtspsrc_sink_chain (GstPad * pad, GstBuffer * buffer) +{ + GstRTSPSrc *src; + GstRTSPStream *stream; + GstFlowReturn res = GST_FLOW_OK; + guint8 *data; + guint size; + GstRTSPResult ret; + GstRTSPMessage message = { 0 }; + GstRTSPConnection *conn; + + stream = (GstRTSPStream *) gst_pad_get_element_private (pad); + src = stream->parent; + + data = GST_BUFFER_DATA (buffer); + size = GST_BUFFER_SIZE (buffer); + + gst_rtsp_message_init_data (&message, stream->channel[1]); + + /* lend the body data to the message */ + gst_rtsp_message_take_body (&message, data, size); + + if (stream->conninfo.connection) + conn = stream->conninfo.connection; + else + conn = src->conninfo.connection; + + GST_DEBUG_OBJECT (src, "sending %u bytes RTCP", size); + ret = gst_rtspsrc_connection_send (src, conn, &message, NULL); + GST_DEBUG_OBJECT (src, "sent RTCP, %d", ret); + + /* and steal it away again because we will free it when unreffing the + * buffer */ + gst_rtsp_message_steal_body (&message, &data, &size); + gst_rtsp_message_unset (&message); + + gst_buffer_unref (buffer); + + return res; +} + +static void +pad_unblocked (GstPad * pad, gboolean blocked, GstRTSPSrc * src) +{ + GST_DEBUG_OBJECT (src, "pad %s:%s unblocked", GST_DEBUG_PAD_NAME (pad)); +} + +static void +pad_blocked (GstPad * pad, gboolean blocked, GstRTSPSrc * src) +{ + GST_DEBUG_OBJECT (src, "pad %s:%s blocked, activating streams", + GST_DEBUG_PAD_NAME (pad)); + + /* activate the streams */ + GST_OBJECT_LOCK (src); + if (!src->need_activate) + goto was_ok; + + src->need_activate = FALSE; + GST_OBJECT_UNLOCK (src); + + gst_rtspsrc_activate_streams (src); + + return; + +was_ok: + { + GST_OBJECT_UNLOCK (src); + return; + } +} + +/* this callback is called when the session manager generated a new src pad with + * payloaded RTP packets. We simply ghost the pad here. */ +static void +new_manager_pad (GstElement * manager, GstPad * pad, GstRTSPSrc * src) +{ + gchar *name; + GstPadTemplate *template; + gint id, ssrc, pt; + GList *lstream; + GstRTSPStream *stream; + gboolean all_added; + + GST_DEBUG_OBJECT (src, "got new manager pad %" GST_PTR_FORMAT, pad); + + GST_RTSP_STATE_LOCK (src); + /* find stream */ + name = gst_object_get_name (GST_OBJECT_CAST (pad)); + if (sscanf (name, "recv_rtp_src_%d_%d_%d", &id, &ssrc, &pt) != 3) + goto unknown_stream; + + GST_DEBUG_OBJECT (src, "stream: %u, SSRC %d, PT %d", id, ssrc, pt); + + stream = find_stream (src, &id, (gpointer) find_stream_by_id); + if (stream == NULL) + goto unknown_stream; + + /* create a new pad we will use to stream to */ + template = gst_static_pad_template_get (&rtptemplate); + stream->srcpad = gst_ghost_pad_new_from_template (name, pad, template); + gst_object_unref (template); + g_free (name); + + stream->added = TRUE; + gst_pad_set_event_function (stream->srcpad, gst_rtspsrc_handle_src_event); + gst_pad_set_query_function (stream->srcpad, gst_rtspsrc_handle_src_query); + gst_pad_set_active (stream->srcpad, TRUE); + gst_element_add_pad (GST_ELEMENT_CAST (src), stream->srcpad); + + /* check if we added all streams */ + all_added = TRUE; + for (lstream = src->streams; lstream; lstream = g_list_next (lstream)) { + stream = (GstRTSPStream *) lstream->data; + + GST_DEBUG_OBJECT (src, "stream %p, container %d, disabled %d, added %d", + stream, stream->container, stream->disabled, stream->added); + + /* a container stream only needs one pad added. Also disabled streams don't + * count */ + if (!stream->container && !stream->disabled && !stream->added) { + all_added = FALSE; + break; + } + } + GST_RTSP_STATE_UNLOCK (src); + + if (all_added) { + GST_DEBUG_OBJECT (src, "We added all streams"); + /* when we get here, all stream are added and we can fire the no-more-pads + * signal. */ + gst_element_no_more_pads (GST_ELEMENT_CAST (src)); + } + + return; + + /* ERRORS */ +unknown_stream: + { + GST_DEBUG_OBJECT (src, "ignoring unknown stream"); + GST_RTSP_STATE_UNLOCK (src); + g_free (name); + return; + } +} + +static GstCaps * +request_pt_map (GstElement * manager, guint session, guint pt, GstRTSPSrc * src) +{ + GstRTSPStream *stream; + GstCaps *caps; + + GST_DEBUG_OBJECT (src, "getting pt map for pt %d in session %d", pt, session); + + GST_RTSP_STATE_LOCK (src); + stream = find_stream (src, &session, (gpointer) find_stream_by_id); + if (!stream) + goto unknown_stream; + + caps = stream->caps; + if (caps) + gst_caps_ref (caps); + GST_RTSP_STATE_UNLOCK (src); + + return caps; + +unknown_stream: + { + GST_DEBUG_OBJECT (src, "unknown stream %d", session); + GST_RTSP_STATE_UNLOCK (src); + return NULL; + } +} + +static void +gst_rtspsrc_do_stream_eos (GstRTSPSrc * src, GstRTSPStream * stream) +{ + GST_DEBUG_OBJECT (src, "setting stream for session %u to EOS", stream->id); + + if (stream->eos) + goto was_eos; + + stream->eos = TRUE; + gst_rtspsrc_stream_push_event (src, stream, gst_event_new_eos (), TRUE); + return; + + /* ERRORS */ +was_eos: + { + GST_DEBUG_OBJECT (src, "stream for session %u was already EOS", stream->id); + return; + } +} + +static void +on_bye_ssrc (GObject * session, GObject * source, GstRTSPStream * stream) +{ + GstRTSPSrc *src = stream->parent; + + GST_DEBUG_OBJECT (src, "source in session %u received BYE", stream->id); + + gst_rtspsrc_do_stream_eos (src, stream); +} + +static void +on_timeout (GObject * session, GObject * source, GstRTSPStream * stream) +{ + GstRTSPSrc *src = stream->parent; + + GST_DEBUG_OBJECT (src, "source in session %u timed out", stream->id); + + gst_rtspsrc_do_stream_eos (src, stream); +} + +static void +on_npt_stop (GstElement * rtpbin, guint session, guint ssrc, GstRTSPSrc * src) +{ + GstRTSPStream *stream; + + GST_DEBUG_OBJECT (src, "source in session %u reached NPT stop", session); + + /* get stream for session */ + stream = find_stream (src, &session, (gpointer) find_stream_by_id); + if (stream) { + gst_rtspsrc_do_stream_eos (src, stream); + } +} + +static void +on_ssrc_active (GObject * session, GObject * source, GstRTSPStream * stream) +{ + GST_DEBUG_OBJECT (stream->parent, "source in session %u is active", + stream->id); +} + +/* try to get and configure a manager */ +static gboolean +gst_rtspsrc_stream_configure_manager (GstRTSPSrc * src, GstRTSPStream * stream, + GstRTSPTransport * transport) +{ + const gchar *manager; + gchar *name; + GstStateChangeReturn ret; + + /* find a manager */ + if (gst_rtsp_transport_get_manager (transport->trans, &manager, 0) < 0) + goto no_manager; + + if (manager) { + GST_DEBUG_OBJECT (src, "using manager %s", manager); + + /* configure the manager */ + if (src->manager == NULL) { + GObjectClass *klass; + GstState target; + + if (!(src->manager = gst_element_factory_make (manager, NULL))) { + /* fallback */ + if (gst_rtsp_transport_get_manager (transport->trans, &manager, 1) < 0) + goto no_manager; + + if (!manager) + goto use_no_manager; + + if (!(src->manager = gst_element_factory_make (manager, NULL))) + goto manager_failed; + } + + /* we manage this element */ + gst_bin_add (GST_BIN_CAST (src), src->manager); + + GST_OBJECT_LOCK (src); + target = GST_STATE_TARGET (src); + GST_OBJECT_UNLOCK (src); + + ret = gst_element_set_state (src->manager, target); + if (ret == GST_STATE_CHANGE_FAILURE) + goto start_manager_failure; + + g_object_set (src->manager, "latency", src->latency, NULL); + + klass = G_OBJECT_GET_CLASS (G_OBJECT (src->manager)); + if (g_object_class_find_property (klass, "buffer-mode")) { + if (src->buffer_mode != BUFFER_MODE_AUTO) { + g_object_set (src->manager, "buffer-mode", src->buffer_mode, NULL); + } else { + gboolean need_slave; + GstStructure *s; + const gchar *encoding; + + /* buffer mode pauses are handled by adding offsets to buffer times, + * but some depayloaders may have a hard time syncing output times + * with such input times, e.g. container ones, most notably ASF */ + /* TODO alternatives are having an event that indicates these shifts, + * or having rtsp extensions provide suggestion on buffer mode */ + need_slave = stream->container; + if (stream->caps && (s = gst_caps_get_structure (stream->caps, 0)) && + (encoding = gst_structure_get_string (s, "encoding-name"))) + need_slave = need_slave || (strcmp (encoding, "X-ASF-PF") == 0); + GST_DEBUG_OBJECT (src, "auto buffering mode, need_slave %d", + need_slave); + /* valid duration implies not likely live pipeline, + * so slaving in jitterbuffer does not make much sense + * (and might mess things up due to bursts) */ + if (GST_CLOCK_TIME_IS_VALID (src->segment.duration) && + src->segment.duration && !need_slave) { + GST_DEBUG_OBJECT (src, "selected buffer"); + g_object_set (src->manager, "buffer-mode", BUFFER_MODE_BUFFER, + NULL); + } else { + GST_DEBUG_OBJECT (src, "selected slave"); + g_object_set (src->manager, "buffer-mode", BUFFER_MODE_SLAVE, NULL); + } + } + } + + /* connect to signals if we did not already do so */ + GST_DEBUG_OBJECT (src, "connect to signals on session manager, stream %p", + stream); + src->manager_sig_id = + g_signal_connect (src->manager, "pad-added", + (GCallback) new_manager_pad, src); + src->manager_ptmap_id = + g_signal_connect (src->manager, "request-pt-map", + (GCallback) request_pt_map, src); + + g_signal_connect (src->manager, "on-npt-stop", (GCallback) on_npt_stop, + src); + } + + /* we stream directly to the manager, get some pads. Each RTSP stream goes + * into a separate RTP session. */ + name = g_strdup_printf ("recv_rtp_sink_%d", stream->id); + stream->channelpad[0] = gst_element_get_request_pad (src->manager, name); + g_free (name); + name = g_strdup_printf ("recv_rtcp_sink_%d", stream->id); + stream->channelpad[1] = gst_element_get_request_pad (src->manager, name); + g_free (name); + + /* now configure the bandwidth in the manager */ + if (g_signal_lookup ("get-internal-session", + G_OBJECT_TYPE (src->manager)) != 0) { + GObject *rtpsession; + + g_signal_emit_by_name (src->manager, "get-internal-session", stream->id, + &rtpsession); + if (rtpsession) { + GST_INFO_OBJECT (src, "configure bandwidth in session %p", rtpsession); + + stream->session = rtpsession; + + if (stream->as_bandwidth != -1) { + GST_INFO_OBJECT (src, "setting AS: %f", + (gdouble) (stream->as_bandwidth * 1000)); + g_object_set (rtpsession, "bandwidth", + (gdouble) (stream->as_bandwidth * 1000), NULL); + } + if (stream->rr_bandwidth != -1) { + GST_INFO_OBJECT (src, "setting RR: %u", stream->rr_bandwidth); + g_object_set (rtpsession, "rtcp-rr-bandwidth", stream->rr_bandwidth, + NULL); + } + if (stream->rs_bandwidth != -1) { + GST_INFO_OBJECT (src, "setting RS: %u", stream->rs_bandwidth); + g_object_set (rtpsession, "rtcp-rs-bandwidth", stream->rs_bandwidth, + NULL); + } + g_signal_connect (rtpsession, "on-bye-ssrc", (GCallback) on_bye_ssrc, + stream); + g_signal_connect (rtpsession, "on-bye-timeout", (GCallback) on_timeout, + stream); + g_signal_connect (rtpsession, "on-timeout", (GCallback) on_timeout, + stream); + g_signal_connect (rtpsession, "on-ssrc-active", + (GCallback) on_ssrc_active, stream); + } + } + } + +use_no_manager: + return TRUE; + + /* ERRORS */ +no_manager: + { + GST_DEBUG_OBJECT (src, "cannot get a session manager"); + return FALSE; + } +manager_failed: + { + GST_DEBUG_OBJECT (src, "no session manager element %s found", manager); + return FALSE; + } +start_manager_failure: + { + GST_DEBUG_OBJECT (src, "could not start session manager"); + return FALSE; + } +} + +/* free the UDP sources allocated when negotiating a transport. + * This function is called when the server negotiated to a transport where the + * UDP sources are not needed anymore, such as TCP or multicast. */ +static void +gst_rtspsrc_stream_free_udp (GstRTSPStream * stream) +{ + gint i; + + for (i = 0; i < 2; i++) { + if (stream->udpsrc[i]) { + gst_element_set_state (stream->udpsrc[i], GST_STATE_NULL); + gst_object_unref (stream->udpsrc[i]); + stream->udpsrc[i] = NULL; + } + } +} + +/* for TCP, create pads to send and receive data to and from the manager and to + * intercept various events and queries + */ +static gboolean +gst_rtspsrc_stream_configure_tcp (GstRTSPSrc * src, GstRTSPStream * stream, + GstRTSPTransport * transport, GstPad ** outpad) +{ + gchar *name; + GstPadTemplate *template; + GstPad *pad0, *pad1; + + /* configure for interleaved delivery, nothing needs to be done + * here, the loop function will call the chain functions of the + * session manager. */ + stream->channel[0] = transport->interleaved.min; + stream->channel[1] = transport->interleaved.max; + GST_DEBUG_OBJECT (src, "stream %p on channels %d-%d", stream, + stream->channel[0], stream->channel[1]); + + /* we can remove the allocated UDP ports now */ + gst_rtspsrc_stream_free_udp (stream); + + /* no session manager, send data to srcpad directly */ + if (!stream->channelpad[0]) { + GST_DEBUG_OBJECT (src, "no manager, creating pad"); + + /* create a new pad we will use to stream to */ + name = g_strdup_printf ("stream%d", stream->id); + template = gst_static_pad_template_get (&rtptemplate); + stream->channelpad[0] = gst_pad_new_from_template (template, name); + gst_object_unref (template); + g_free (name); + + /* set caps and activate */ + gst_pad_use_fixed_caps (stream->channelpad[0]); + gst_pad_set_active (stream->channelpad[0], TRUE); + + *outpad = gst_object_ref (stream->channelpad[0]); + } else { + GST_DEBUG_OBJECT (src, "using manager source pad"); + + template = gst_static_pad_template_get (&anysrctemplate); + + /* allocate pads for sending the channel data into the manager */ + pad0 = gst_pad_new_from_template (template, "internalsrc0"); + gst_pad_link (pad0, stream->channelpad[0]); + gst_object_unref (stream->channelpad[0]); + stream->channelpad[0] = pad0; + gst_pad_set_event_function (pad0, gst_rtspsrc_handle_internal_src_event); + gst_pad_set_query_function (pad0, gst_rtspsrc_handle_internal_src_query); + gst_pad_set_element_private (pad0, src); + gst_pad_set_active (pad0, TRUE); + + if (stream->channelpad[1]) { + /* if we have a sinkpad for the other channel, create a pad and link to the + * manager. */ + pad1 = gst_pad_new_from_template (template, "internalsrc1"); + gst_pad_set_event_function (pad1, gst_rtspsrc_handle_internal_src_event); + gst_pad_link (pad1, stream->channelpad[1]); + gst_object_unref (stream->channelpad[1]); + stream->channelpad[1] = pad1; + gst_pad_set_active (pad1, TRUE); + } + gst_object_unref (template); + } + /* setup RTCP transport back to the server if we have to. */ + if (src->manager && src->do_rtcp) { + GstPad *pad; + + template = gst_static_pad_template_get (&anysinktemplate); + + stream->rtcppad = gst_pad_new_from_template (template, "internalsink0"); + gst_pad_set_chain_function (stream->rtcppad, gst_rtspsrc_sink_chain); + gst_pad_set_element_private (stream->rtcppad, stream); + gst_pad_set_active (stream->rtcppad, TRUE); + + /* get session RTCP pad */ + name = g_strdup_printf ("send_rtcp_src_%d", stream->id); + pad = gst_element_get_request_pad (src->manager, name); + g_free (name); + + /* and link */ + if (pad) { + gst_pad_link (pad, stream->rtcppad); + gst_object_unref (pad); + } + + gst_object_unref (template); + } + return TRUE; +} + +static void +gst_rtspsrc_get_transport_info (GstRTSPSrc * src, GstRTSPStream * stream, + GstRTSPTransport * transport, const gchar ** destination, gint * min, + gint * max, guint * ttl) +{ + if (transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST) { + if (destination) { + if (!(*destination = transport->destination)) + *destination = stream->destination; + } + if (min && max) { + /* transport first */ + *min = transport->port.min; + *max = transport->port.max; + if (*min == -1 && *max == -1) { + /* then try from SDP */ + if (stream->port != 0) { + *min = stream->port; + *max = stream->port + 1; + } + } + } + + if (ttl) { + if (!(*ttl = transport->ttl)) + *ttl = stream->ttl; + } + } else { + if (destination) { + /* first take the source, then the endpoint to figure out where to send + * the RTCP. */ + if (!(*destination = transport->source)) { + if (src->conninfo.connection) + *destination = gst_rtsp_connection_get_ip (src->conninfo.connection); + else if (stream->conninfo.connection) + *destination = + gst_rtsp_connection_get_ip (stream->conninfo.connection); + } + } + if (min && max) { + /* for unicast we only expect the ports here */ + *min = transport->server_port.min; + *max = transport->server_port.max; + } + } +} + +/* For multicast create UDP sources and join the multicast group. */ +static gboolean +gst_rtspsrc_stream_configure_mcast (GstRTSPSrc * src, GstRTSPStream * stream, + GstRTSPTransport * transport, GstPad ** outpad) +{ + gchar *uri; + const gchar *destination; + gint min, max; + + GST_DEBUG_OBJECT (src, "creating UDP sources for multicast"); + + /* we can remove the allocated UDP ports now */ + gst_rtspsrc_stream_free_udp (stream); + + gst_rtspsrc_get_transport_info (src, stream, transport, &destination, &min, + &max, NULL); + + /* we need a destination now */ + if (destination == NULL) + goto no_destination; + + /* we really need ports now or we won't be able to receive anything at all */ + if (min == -1 && max == -1) + goto no_ports; + + GST_DEBUG_OBJECT (src, "have destination '%s' and ports (%d)-(%d)", + destination, min, max); + + /* creating UDP source for RTP */ + if (min != -1) { + uri = g_strdup_printf ("udp://%s:%d", destination, min); + stream->udpsrc[0] = gst_element_make_from_uri (GST_URI_SRC, uri, NULL); + g_free (uri); + if (stream->udpsrc[0] == NULL) + goto no_element; + + /* take ownership */ + gst_object_ref (stream->udpsrc[0]); + gst_object_sink (stream->udpsrc[0]); + + /* change state */ + gst_element_set_state (stream->udpsrc[0], GST_STATE_PAUSED); + } + + /* creating another UDP source for RTCP */ + if (max != -1) { + uri = g_strdup_printf ("udp://%s:%d", destination, max); + stream->udpsrc[1] = gst_element_make_from_uri (GST_URI_SRC, uri, NULL); + g_free (uri); + if (stream->udpsrc[1] == NULL) + goto no_element; + + /* take ownership */ + gst_object_ref (stream->udpsrc[1]); + gst_object_sink (stream->udpsrc[1]); + + gst_element_set_state (stream->udpsrc[1], GST_STATE_PAUSED); + } + return TRUE; + + /* ERRORS */ +no_element: + { + GST_DEBUG_OBJECT (src, "no UDP source element found"); + return FALSE; + } +no_destination: + { + GST_DEBUG_OBJECT (src, "no destination found"); + return FALSE; + } +no_ports: + { + GST_DEBUG_OBJECT (src, "no ports found"); + return FALSE; + } +} + +/* configure the remainder of the UDP ports */ +static gboolean +gst_rtspsrc_stream_configure_udp (GstRTSPSrc * src, GstRTSPStream * stream, + GstRTSPTransport * transport, GstPad ** outpad) +{ + /* we manage the UDP elements now. For unicast, the UDP sources where + * allocated in the stream when we suggested a transport. */ + if (stream->udpsrc[0]) { + gst_bin_add (GST_BIN_CAST (src), stream->udpsrc[0]); + + GST_DEBUG_OBJECT (src, "setting up UDP source"); + + /* configure a timeout on the UDP port. When the timeout message is + * posted, we assume UDP transport is not possible. We reconnect using TCP + * if we can. */ + g_object_set (G_OBJECT (stream->udpsrc[0]), "timeout", src->udp_timeout, + NULL); + + /* get output pad of the UDP source. */ + *outpad = gst_element_get_static_pad (stream->udpsrc[0], "src"); + + /* save it so we can unblock */ + stream->blockedpad = *outpad; + + /* configure pad block on the pad. As soon as there is dataflow on the + * UDP source, we know that UDP is not blocked by a firewall and we can + * configure all the streams to let the application autoplug decoders. */ + gst_pad_set_blocked_async (stream->blockedpad, TRUE, + (GstPadBlockCallback) pad_blocked, src); + + if (stream->channelpad[0]) { + GST_DEBUG_OBJECT (src, "connecting UDP source 0 to manager"); + /* configure for UDP delivery, we need to connect the UDP pads to + * the session plugin. */ + gst_pad_link (*outpad, stream->channelpad[0]); + gst_object_unref (*outpad); + *outpad = NULL; + /* we connected to pad-added signal to get pads from the manager */ + } else { + GST_DEBUG_OBJECT (src, "using UDP src pad as output"); + } + } + + /* RTCP port */ + if (stream->udpsrc[1]) { + gst_bin_add (GST_BIN_CAST (src), stream->udpsrc[1]); + + if (stream->channelpad[1]) { + GstPad *pad; + + GST_DEBUG_OBJECT (src, "connecting UDP source 1 to manager"); + + pad = gst_element_get_static_pad (stream->udpsrc[1], "src"); + gst_pad_link (pad, stream->channelpad[1]); + gst_object_unref (pad); + } else { + /* leave unlinked */ + } + } + return TRUE; +} + +/* configure the UDP sink back to the server for status reports */ +static gboolean +gst_rtspsrc_stream_configure_udp_sinks (GstRTSPSrc * src, + GstRTSPStream * stream, GstRTSPTransport * transport) +{ + GstPad *pad; + gint rtp_port, rtcp_port, sockfd = -1; + gboolean do_rtp, do_rtcp; + const gchar *destination; + gchar *uri, *name; + guint ttl = 0; + + /* get transport info */ + gst_rtspsrc_get_transport_info (src, stream, transport, &destination, + &rtp_port, &rtcp_port, &ttl); + + /* see what we need to do */ + do_rtp = (rtp_port != -1); + /* it's possible that the server does not want us to send RTCP in which case + * the port is -1 */ + do_rtcp = (rtcp_port != -1 && src->manager != NULL && src->do_rtcp); + + /* we need a destination when we have RTP or RTCP ports */ + if (destination == NULL && (do_rtp || do_rtcp)) + goto no_destination; + + /* try to construct the fakesrc to the RTP port of the server to open up any + * NAT firewalls */ + if (do_rtp) { + GST_DEBUG_OBJECT (src, "configure RTP UDP sink for %s:%d", destination, + rtp_port); + + uri = g_strdup_printf ("udp://%s:%d", destination, rtp_port); + stream->udpsink[0] = gst_element_make_from_uri (GST_URI_SINK, uri, NULL); + g_free (uri); + if (stream->udpsink[0] == NULL) + goto no_sink_element; + + /* don't join multicast group, we will have the source socket do that */ + /* no sync or async state changes needed */ + g_object_set (G_OBJECT (stream->udpsink[0]), "auto-multicast", FALSE, + "loop", FALSE, "sync", FALSE, "async", FALSE, NULL); + if (ttl > 0) + g_object_set (G_OBJECT (stream->udpsink[0]), "ttl", ttl, NULL); + + if (stream->udpsrc[0]) { + /* configure socket, we give it the same UDP socket as the udpsrc for RTP + * so that NAT firewalls will open a hole for us */ + g_object_get (G_OBJECT (stream->udpsrc[0]), "sock", &sockfd, NULL); + GST_DEBUG_OBJECT (src, "RTP UDP src has sock %d", sockfd); + /* configure socket and make sure udpsink does not close it when shutting + * down, it belongs to udpsrc after all. */ + g_object_set (G_OBJECT (stream->udpsink[0]), "sockfd", sockfd, + "closefd", FALSE, NULL); + } + + /* the source for the dummy packets to open up NAT */ + stream->fakesrc = gst_element_factory_make ("fakesrc", NULL); + if (stream->fakesrc == NULL) + goto no_fakesrc_element; + + /* random data in 5 buffers, a size of 200 bytes should be fine */ + g_object_set (G_OBJECT (stream->fakesrc), "filltype", 3, "num-buffers", 5, + "sizetype", 2, "sizemax", 200, "silent", TRUE, NULL); + + /* we don't want to consider this a sink */ + GST_OBJECT_FLAG_UNSET (stream->udpsink[0], GST_ELEMENT_IS_SINK); + + /* keep everything locked */ + gst_element_set_locked_state (stream->udpsink[0], TRUE); + gst_element_set_locked_state (stream->fakesrc, TRUE); + + gst_object_ref (stream->udpsink[0]); + gst_bin_add (GST_BIN_CAST (src), stream->udpsink[0]); + gst_object_ref (stream->fakesrc); + gst_bin_add (GST_BIN_CAST (src), stream->fakesrc); + + gst_element_link (stream->fakesrc, stream->udpsink[0]); + } + if (do_rtcp) { + GST_DEBUG_OBJECT (src, "configure RTCP UDP sink for %s:%d", destination, + rtcp_port); + + uri = g_strdup_printf ("udp://%s:%d", destination, rtcp_port); + stream->udpsink[1] = gst_element_make_from_uri (GST_URI_SINK, uri, NULL); + g_free (uri); + if (stream->udpsink[1] == NULL) + goto no_sink_element; + + /* don't join multicast group, we will have the source socket do that */ + /* no sync or async state changes needed */ + g_object_set (G_OBJECT (stream->udpsink[1]), "auto-multicast", FALSE, + "loop", FALSE, "sync", FALSE, "async", FALSE, NULL); + if (ttl > 0) + g_object_set (G_OBJECT (stream->udpsink[0]), "ttl", ttl, NULL); + + if (stream->udpsrc[1]) { + /* configure socket, we give it the same UDP socket as the udpsrc for RTCP + * because some servers check the port number of where it sends RTCP to identify + * the RTCP packets it receives */ + g_object_get (G_OBJECT (stream->udpsrc[1]), "sock", &sockfd, NULL); + GST_DEBUG_OBJECT (src, "RTCP UDP src has sock %d", sockfd); + /* configure socket and make sure udpsink does not close it when shutting + * down, it belongs to udpsrc after all. */ + g_object_set (G_OBJECT (stream->udpsink[1]), "sockfd", sockfd, + "closefd", FALSE, NULL); + } + + /* we don't want to consider this a sink */ + GST_OBJECT_FLAG_UNSET (stream->udpsink[1], GST_ELEMENT_IS_SINK); + + /* we keep this playing always */ + gst_element_set_locked_state (stream->udpsink[1], TRUE); + gst_element_set_state (stream->udpsink[1], GST_STATE_PLAYING); + + gst_object_ref (stream->udpsink[1]); + gst_bin_add (GST_BIN_CAST (src), stream->udpsink[1]); + + stream->rtcppad = gst_element_get_static_pad (stream->udpsink[1], "sink"); + + /* get session RTCP pad */ + name = g_strdup_printf ("send_rtcp_src_%d", stream->id); + pad = gst_element_get_request_pad (src->manager, name); + g_free (name); + + /* and link */ + if (pad) { + gst_pad_link (pad, stream->rtcppad); + gst_object_unref (pad); + } + } + + return TRUE; + + /* ERRORS */ +no_destination: + { + GST_DEBUG_OBJECT (src, "no destination address specified"); + return FALSE; + } +no_sink_element: + { + GST_DEBUG_OBJECT (src, "no UDP sink element found"); + return FALSE; + } +no_fakesrc_element: + { + GST_DEBUG_OBJECT (src, "no fakesrc element found"); + return FALSE; + } +} + +/* sets up all elements needed for streaming over the specified transport. + * Does not yet expose the element pads, this will be done when there is actuall + * dataflow detected, which might never happen when UDP is blocked in a + * firewall, for example. + */ +static gboolean +gst_rtspsrc_stream_configure_transport (GstRTSPStream * stream, + GstRTSPTransport * transport) +{ + GstRTSPSrc *src; + GstPad *outpad = NULL; + GstPadTemplate *template; + gchar *name; + GstStructure *s; + const gchar *mime; + + src = stream->parent; + + GST_DEBUG_OBJECT (src, "configuring transport for stream %p", stream); + + s = gst_caps_get_structure (stream->caps, 0); + + /* get the proper mime type for this stream now */ + if (gst_rtsp_transport_get_mime (transport->trans, &mime) < 0) + goto unknown_transport; + if (!mime) + goto unknown_transport; + + /* configure the final mime type */ + GST_DEBUG_OBJECT (src, "setting mime to %s", mime); + gst_structure_set_name (s, mime); + + /* try to get and configure a manager, channelpad[0-1] will be configured with + * the pads for the manager, or NULL when no manager is needed. */ + if (!gst_rtspsrc_stream_configure_manager (src, stream, transport)) + goto no_manager; + + switch (transport->lower_transport) { + case GST_RTSP_LOWER_TRANS_TCP: + if (!gst_rtspsrc_stream_configure_tcp (src, stream, transport, &outpad)) + goto transport_failed; + break; + case GST_RTSP_LOWER_TRANS_UDP_MCAST: + if (!gst_rtspsrc_stream_configure_mcast (src, stream, transport, &outpad)) + goto transport_failed; + /* fallthrough, the rest is the same for UDP and MCAST */ + case GST_RTSP_LOWER_TRANS_UDP: + if (!gst_rtspsrc_stream_configure_udp (src, stream, transport, &outpad)) + goto transport_failed; + /* configure udpsinks back to the server for RTCP messages and for the + * dummy RTP messages to open NAT. */ + if (!gst_rtspsrc_stream_configure_udp_sinks (src, stream, transport)) + goto transport_failed; + break; + default: + goto unknown_transport; + } + + if (outpad) { + GST_DEBUG_OBJECT (src, "creating ghostpad"); + + gst_pad_use_fixed_caps (outpad); + + /* create ghostpad, don't add just yet, this will be done when we activate + * the stream. */ + name = g_strdup_printf ("stream%d", stream->id); + template = gst_static_pad_template_get (&rtptemplate); + stream->srcpad = gst_ghost_pad_new_from_template (name, outpad, template); + gst_pad_set_event_function (stream->srcpad, gst_rtspsrc_handle_src_event); + gst_pad_set_query_function (stream->srcpad, gst_rtspsrc_handle_src_query); + gst_object_unref (template); + g_free (name); + + gst_object_unref (outpad); + } + /* mark pad as ok */ + stream->last_ret = GST_FLOW_OK; + + return TRUE; + + /* ERRORS */ +transport_failed: + { + GST_DEBUG_OBJECT (src, "failed to configure transport"); + return FALSE; + } +unknown_transport: + { + GST_DEBUG_OBJECT (src, "unknown transport"); + return FALSE; + } +no_manager: + { + GST_DEBUG_OBJECT (src, "cannot get a session manager"); + return FALSE; + } +} + +/* send a couple of dummy random packets on the receiver RTP port to the server, + * this should make a firewall think we initiated the data transfer and + * hopefully allow packets to go from the sender port to our RTP receiver port */ +static gboolean +gst_rtspsrc_send_dummy_packets (GstRTSPSrc * src) +{ + GList *walk; + + if (src->nat_method != GST_RTSP_NAT_DUMMY) + return TRUE; + + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + + if (stream->fakesrc && stream->udpsink[0]) { + GST_DEBUG_OBJECT (src, "sending dummy packet to stream %p", stream); + gst_element_set_state (stream->udpsink[0], GST_STATE_NULL); + gst_element_set_state (stream->fakesrc, GST_STATE_NULL); + gst_element_set_state (stream->udpsink[0], GST_STATE_PLAYING); + gst_element_set_state (stream->fakesrc, GST_STATE_PLAYING); + } + } + return TRUE; +} + +/* Adds the source pads of all configured streams to the element. + * This code is performed when we detected dataflow. + * + * We detect dataflow from either the _loop function or with pad probes on the + * udp sources. + */ +static gboolean +gst_rtspsrc_activate_streams (GstRTSPSrc * src) +{ + GList *walk; + + GST_DEBUG_OBJECT (src, "activating streams"); + + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + + if (stream->udpsrc[0]) { + /* remove timeout, we are streaming now and timeouts will be handled by + * the session manager and jitter buffer */ + g_object_set (G_OBJECT (stream->udpsrc[0]), "timeout", (guint64) 0, NULL); + } + if (stream->srcpad) { + /* if we don't have a session manager, set the caps now. If we have a + * session, we will get a notification of the pad and the caps. */ + if (!src->manager) { + GST_DEBUG_OBJECT (src, "setting pad caps for stream %p", stream); + gst_pad_set_caps (stream->srcpad, stream->caps); + } + + GST_DEBUG_OBJECT (src, "activating stream pad %p", stream); + gst_pad_set_active (stream->srcpad, TRUE); + /* add the pad */ + if (!stream->added) { + GST_DEBUG_OBJECT (src, "adding stream pad %p", stream); + gst_element_add_pad (GST_ELEMENT_CAST (src), stream->srcpad); + stream->added = TRUE; + } + } + } + + /* unblock all pads */ + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + + if (stream->blockedpad) { + GST_DEBUG_OBJECT (src, "unblocking stream pad %p", stream); + gst_pad_set_blocked_async (stream->blockedpad, FALSE, + (GstPadBlockCallback) pad_unblocked, src); + stream->blockedpad = NULL; + } + } + + return TRUE; +} + +static void +gst_rtspsrc_configure_caps (GstRTSPSrc * src, GstSegment * segment) +{ + GList *walk; + guint64 start, stop; + gdouble play_speed, play_scale; + + GST_DEBUG_OBJECT (src, "configuring stream caps"); + + start = segment->last_stop; + stop = segment->duration; + play_speed = segment->rate; + play_scale = segment->applied_rate; + + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + GstCaps *caps; + + if ((caps = stream->caps)) { + caps = gst_caps_make_writable (caps); + /* update caps */ + if (stream->timebase != -1) + gst_caps_set_simple (caps, "clock-base", G_TYPE_UINT, + (guint) stream->timebase, NULL); + if (stream->seqbase != -1) + gst_caps_set_simple (caps, "seqnum-base", G_TYPE_UINT, + (guint) stream->seqbase, NULL); + gst_caps_set_simple (caps, "npt-start", G_TYPE_UINT64, start, NULL); + if (stop != -1) + gst_caps_set_simple (caps, "npt-stop", G_TYPE_UINT64, stop, NULL); + gst_caps_set_simple (caps, "play-speed", G_TYPE_DOUBLE, play_speed, NULL); + gst_caps_set_simple (caps, "play-scale", G_TYPE_DOUBLE, play_scale, NULL); + + stream->caps = caps; + } + GST_DEBUG_OBJECT (src, "stream %p, caps %" GST_PTR_FORMAT, stream, caps); + } + if (src->manager) { + GST_DEBUG_OBJECT (src, "clear session"); + g_signal_emit_by_name (src->manager, "clear-pt-map", NULL); + } +} + +static GstFlowReturn +gst_rtspsrc_combine_flows (GstRTSPSrc * src, GstRTSPStream * stream, + GstFlowReturn ret) +{ + GList *streams; + + /* store the value */ + stream->last_ret = ret; + + /* if it's success we can return the value right away */ + if (ret == GST_FLOW_OK) + goto done; + + /* any other error that is not-linked can be returned right + * away */ + if (ret != GST_FLOW_NOT_LINKED) + goto done; + + /* only return NOT_LINKED if all other pads returned NOT_LINKED */ + for (streams = src->streams; streams; streams = g_list_next (streams)) { + GstRTSPStream *ostream = (GstRTSPStream *) streams->data; + + ret = ostream->last_ret; + /* some other return value (must be SUCCESS but we can return + * other values as well) */ + if (ret != GST_FLOW_NOT_LINKED) + goto done; + } + /* if we get here, all other pads were unlinked and we return + * NOT_LINKED then */ +done: + return ret; +} + +static gboolean +gst_rtspsrc_stream_push_event (GstRTSPSrc * src, GstRTSPStream * stream, + GstEvent * event, gboolean source) +{ + gboolean res = TRUE; + + /* only streams that have a connection to the outside world */ + if (stream->srcpad == NULL) + goto done; + + if (source && stream->udpsrc[0]) { + gst_event_ref (event); + res = gst_element_send_event (stream->udpsrc[0], event); + } else if (stream->channelpad[0]) { + gst_event_ref (event); + if (GST_PAD_IS_SRC (stream->channelpad[0])) + res = gst_pad_push_event (stream->channelpad[0], event); + else + res = gst_pad_send_event (stream->channelpad[0], event); + } + + if (source && stream->udpsrc[1]) { + gst_event_ref (event); + res &= gst_element_send_event (stream->udpsrc[1], event); + } else if (stream->channelpad[1]) { + gst_event_ref (event); + if (GST_PAD_IS_SRC (stream->channelpad[1])) + res &= gst_pad_push_event (stream->channelpad[1], event); + else + res &= gst_pad_send_event (stream->channelpad[1], event); + } + +done: + gst_event_unref (event); + + return res; +} + +static gboolean +gst_rtspsrc_push_event (GstRTSPSrc * src, GstEvent * event, gboolean source) +{ + GList *streams; + gboolean res = TRUE; + + for (streams = src->streams; streams; streams = g_list_next (streams)) { + GstRTSPStream *ostream = (GstRTSPStream *) streams->data; + + gst_event_ref (event); + res &= gst_rtspsrc_stream_push_event (src, ostream, event, source); + } + gst_event_unref (event); + + return res; +} + +static GstRTSPResult +gst_rtsp_conninfo_connect (GstRTSPSrc * src, GstRTSPConnInfo * info, + gboolean async) +{ + GstRTSPResult res; + + if (info->connection == NULL) { + if (info->url == NULL) { + GST_DEBUG_OBJECT (src, "parsing uri (%s)...", info->location); + if ((res = gst_rtsp_url_parse (info->location, &info->url)) < 0) + goto parse_error; + } + + /* create connection */ + GST_DEBUG_OBJECT (src, "creating connection (%s)...", info->location); + if ((res = gst_rtsp_connection_create (info->url, &info->connection)) < 0) + goto could_not_create; + + if (info->url_str) + g_free (info->url_str); + info->url_str = gst_rtsp_url_get_request_uri (info->url); + + GST_DEBUG_OBJECT (src, "sanitized uri %s", info->url_str); + + if (info->url->transports & GST_RTSP_LOWER_TRANS_HTTP) + gst_rtsp_connection_set_tunneled (info->connection, TRUE); + + if (src->proxy_host) { + GST_DEBUG_OBJECT (src, "setting proxy %s:%d", src->proxy_host, + src->proxy_port); + gst_rtsp_connection_set_proxy (info->connection, src->proxy_host, + src->proxy_port); + } + } + + if (!info->connected) { + /* connect */ + if (async) + GST_ELEMENT_PROGRESS (src, CONTINUE, "connect", + ("Connecting to %s", info->location)); + GST_DEBUG_OBJECT (src, "connecting (%s)...", info->location); + if ((res = + gst_rtsp_connection_connect (info->connection, + src->ptcp_timeout)) < 0) + goto could_not_connect; + + info->connected = TRUE; + } + return GST_RTSP_OK; + + /* ERRORS */ +parse_error: + { + GST_ERROR_OBJECT (src, "No valid RTSP URL was provided"); + return res; + } +could_not_create: + { + gchar *str = gst_rtsp_strresult (res); + GST_ERROR_OBJECT (src, "Could not create connection. (%s)", str); + g_free (str); + return res; + } +could_not_connect: + { + gchar *str = gst_rtsp_strresult (res); + GST_ERROR_OBJECT (src, "Could not connect to server. (%s)", str); + g_free (str); + return res; + } +} + +static GstRTSPResult +gst_rtsp_conninfo_close (GstRTSPSrc * src, GstRTSPConnInfo * info, + gboolean free) +{ + if (info->connected) { + GST_DEBUG_OBJECT (src, "closing connection..."); + gst_rtsp_connection_close (info->connection); + info->connected = FALSE; + } + if (free && info->connection) { + /* free connection */ + GST_DEBUG_OBJECT (src, "freeing connection..."); + gst_rtsp_connection_free (info->connection); + info->connection = NULL; + } + return GST_RTSP_OK; +} + +static GstRTSPResult +gst_rtsp_conninfo_reconnect (GstRTSPSrc * src, GstRTSPConnInfo * info, + gboolean async) +{ + GstRTSPResult res; + + GST_DEBUG_OBJECT (src, "reconnecting connection..."); + gst_rtsp_conninfo_close (src, info, FALSE); + res = gst_rtsp_conninfo_connect (src, info, async); + + return res; +} + +static void +gst_rtspsrc_connection_flush (GstRTSPSrc * src, gboolean flush) +{ + GList *walk; + + GST_DEBUG_OBJECT (src, "set flushing %d", flush); + if (src->conninfo.connection) { + GST_DEBUG_OBJECT (src, "connection flush"); + gst_rtsp_connection_flush (src->conninfo.connection, flush); + } + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + GST_DEBUG_OBJECT (src, "stream %p flush", stream); + if (stream->conninfo.connection) + gst_rtsp_connection_flush (stream->conninfo.connection, flush); + } +} + +/* FIXME, handle server request, reply with OK, for now */ +static GstRTSPResult +gst_rtspsrc_handle_request (GstRTSPSrc * src, GstRTSPConnection * conn, + GstRTSPMessage * request) +{ + GstRTSPMessage response = { 0 }; + GstRTSPResult res; + + GST_DEBUG_OBJECT (src, "got server request message"); + + if (src->debug) + gst_rtsp_message_dump (request); + + res = gst_rtsp_ext_list_receive_request (src->extensions, request); + + if (res == GST_RTSP_ENOTIMPL) { + /* default implementation, send OK */ + res = + gst_rtsp_message_init_response (&response, GST_RTSP_STS_OK, "OK", + request); + if (res < 0) + goto send_error; + + GST_DEBUG_OBJECT (src, "replying with OK"); + + if (src->debug) + gst_rtsp_message_dump (&response); + + res = gst_rtspsrc_connection_send (src, conn, &response, NULL); + if (res < 0) + goto send_error; + + gst_rtsp_message_unset (&response); + } else if (res == GST_RTSP_EEOF) + return res; + + return GST_RTSP_OK; + + /* ERRORS */ +send_error: + { + gst_rtsp_message_unset (&response); + return res; + } +} + +/* send server keep-alive */ +static GstRTSPResult +gst_rtspsrc_send_keep_alive (GstRTSPSrc * src) +{ + GstRTSPMessage request = { 0 }; + GstRTSPResult res; + GstRTSPMethod method; + gchar *control; + + GST_DEBUG_OBJECT (src, "creating server keep-alive"); + + /* find a method to use for keep-alive */ + if (src->methods & GST_RTSP_GET_PARAMETER) + method = GST_RTSP_GET_PARAMETER; + else + method = GST_RTSP_OPTIONS; + + if (src->control) + control = src->control; + else + control = src->conninfo.url_str; + + if (control == NULL) + goto no_control; + + res = gst_rtsp_message_init_request (&request, method, control); + if (res < 0) + goto send_error; + + if (src->debug) + gst_rtsp_message_dump (&request); + + res = + gst_rtspsrc_connection_send (src, src->conninfo.connection, &request, + NULL); + if (res < 0) + goto send_error; + + gst_rtsp_connection_reset_timeout (src->conninfo.connection); + gst_rtsp_message_unset (&request); + + return GST_RTSP_OK; + + /* ERRORS */ +no_control: + { + GST_WARNING_OBJECT (src, "no control url to send keepalive"); + return GST_RTSP_OK; + } +send_error: + { + gchar *str = gst_rtsp_strresult (res); + + gst_rtsp_message_unset (&request); + GST_ELEMENT_WARNING (src, RESOURCE, WRITE, (NULL), + ("Could not send keep-alive. (%s)", str)); + g_free (str); + return res; + } +} + +static GstFlowReturn +gst_rtspsrc_loop_interleaved (GstRTSPSrc * src) +{ + GstRTSPMessage message = { 0 }; + GstRTSPResult res; + gint channel; + GstRTSPStream *stream; + GstPad *outpad = NULL; + guint8 *data; + guint size; + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *buf; + gboolean is_rtcp, have_data; + + /* here we are only interested in data messages */ + have_data = FALSE; + do { + GTimeVal tv_timeout; + + /* get the next timeout interval */ + gst_rtsp_connection_next_timeout (src->conninfo.connection, &tv_timeout); + + /* see if the timeout period expired */ + if ((tv_timeout.tv_sec | tv_timeout.tv_usec) == 0) { + GST_DEBUG_OBJECT (src, "timout, sending keep-alive"); + /* send keep-alive, only act on interrupt, a warning will be posted for + * other errors. */ + if ((res = gst_rtspsrc_send_keep_alive (src)) == GST_RTSP_EINTR) + goto interrupt; + /* get new timeout */ + gst_rtsp_connection_next_timeout (src->conninfo.connection, &tv_timeout); + } + + GST_DEBUG_OBJECT (src, "doing receive with timeout %ld seconds, %ld usec", + tv_timeout.tv_sec, tv_timeout.tv_usec); + + /* protect the connection with the connection lock so that we can see when + * we are finished doing server communication */ + res = + gst_rtspsrc_connection_receive (src, src->conninfo.connection, + &message, src->ptcp_timeout); + + switch (res) { + case GST_RTSP_OK: + GST_DEBUG_OBJECT (src, "we received a server message"); + break; + case GST_RTSP_EINTR: + /* we got interrupted this means we need to stop */ + goto interrupt; + case GST_RTSP_ETIMEOUT: + /* no reply, send keep alive */ + GST_DEBUG_OBJECT (src, "timeout, sending keep-alive"); + if ((res = gst_rtspsrc_send_keep_alive (src)) == GST_RTSP_EINTR) + goto interrupt; + continue; + case GST_RTSP_EEOF: + /* go EOS when the server closed the connection */ + goto server_eof; + default: + goto receive_error; + } + + switch (message.type) { + case GST_RTSP_MESSAGE_REQUEST: + /* server sends us a request message, handle it */ + res = + gst_rtspsrc_handle_request (src, src->conninfo.connection, + &message); + if (res == GST_RTSP_EEOF) + goto server_eof; + else if (res < 0) + goto handle_request_failed; + break; + case GST_RTSP_MESSAGE_RESPONSE: + /* we ignore response messages */ + GST_DEBUG_OBJECT (src, "ignoring response message"); + if (src->debug) + gst_rtsp_message_dump (&message); + break; + case GST_RTSP_MESSAGE_DATA: + GST_DEBUG_OBJECT (src, "got data message"); + have_data = TRUE; + break; + default: + GST_WARNING_OBJECT (src, "ignoring unknown message type %d", + message.type); + break; + } + } + while (!have_data); + + channel = message.type_data.data.channel; + + stream = find_stream (src, &channel, (gpointer) find_stream_by_channel); + if (!stream) + goto unknown_stream; + + if (channel == stream->channel[0]) { + outpad = stream->channelpad[0]; + is_rtcp = FALSE; + } else if (channel == stream->channel[1]) { + outpad = stream->channelpad[1]; + is_rtcp = TRUE; + } else { + is_rtcp = FALSE; + } + + /* take a look at the body to figure out what we have */ + gst_rtsp_message_get_body (&message, &data, &size); + if (size < 2) + goto invalid_length; + + /* channels are not correct on some servers, do extra check */ + if (data[1] >= 200 && data[1] <= 204) { + /* hmm RTCP message switch to the RTCP pad of the same stream. */ + outpad = stream->channelpad[1]; + is_rtcp = TRUE; + } + + /* we have no clue what this is, just ignore then. */ + if (outpad == NULL) + goto unknown_stream; + + /* take the message body for further processing */ + gst_rtsp_message_steal_body (&message, &data, &size); + + /* strip the trailing \0 */ + size -= 1; + + buf = gst_buffer_new (); + GST_BUFFER_DATA (buf) = data; + GST_BUFFER_MALLOCDATA (buf) = data; + GST_BUFFER_SIZE (buf) = size; + + /* don't need message anymore */ + gst_rtsp_message_unset (&message); + + GST_DEBUG_OBJECT (src, "pushing data of size %d on channel %d", size, + channel); + + if (src->need_activate) { + gst_rtspsrc_activate_streams (src); + src->need_activate = FALSE; + } + + if (!src->manager) { + /* set stream caps on buffer when we don't have a session manager to do it + * for us */ + gst_buffer_set_caps (buf, stream->caps); + } + + if (src->base_time == -1) { + /* Take current running_time. This timestamp will be put on + * the first buffer of each stream because we are a live source and so we + * timestamp with the running_time. When we are dealing with TCP, we also + * only timestamp the first buffer (using the DISCONT flag) because a server + * typically bursts data, for which we don't want to compensate by speeding + * up the media. The other timestamps will be interpollated from this one + * using the RTP timestamps. */ + GST_OBJECT_LOCK (src); + if (GST_ELEMENT_CLOCK (src)) { + GstClockTime now; + GstClockTime base_time; + + now = gst_clock_get_time (GST_ELEMENT_CLOCK (src)); + base_time = GST_ELEMENT_CAST (src)->base_time; + + src->base_time = now - base_time; + + GST_DEBUG_OBJECT (src, "first buffer at time %" GST_TIME_FORMAT ", base %" + GST_TIME_FORMAT, GST_TIME_ARGS (now), GST_TIME_ARGS (base_time)); + } + GST_OBJECT_UNLOCK (src); + } + + if (stream->discont && !is_rtcp) { + /* mark first RTP buffer as discont */ + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + stream->discont = FALSE; + /* first buffer gets the timestamp, other buffers are not timestamped and + * their presentation time will be interpollated from the rtp timestamps. */ + GST_DEBUG_OBJECT (src, "setting timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (src->base_time)); + + GST_BUFFER_TIMESTAMP (buf) = src->base_time; + } + + /* chain to the peer pad */ + if (GST_PAD_IS_SINK (outpad)) + ret = gst_pad_chain (outpad, buf); + else + ret = gst_pad_push (outpad, buf); + + if (!is_rtcp) { + /* combine all stream flows for the data transport */ + ret = gst_rtspsrc_combine_flows (src, stream, ret); + } + return ret; + + /* ERRORS */ +unknown_stream: + { + GST_DEBUG_OBJECT (src, "unknown stream on channel %d, ignored", channel); + gst_rtsp_message_unset (&message); + return GST_FLOW_OK; + } +server_eof: + { + GST_DEBUG_OBJECT (src, "we got an eof from the server"); + GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), + ("The server closed the connection.")); + src->conninfo.connected = FALSE; + gst_rtsp_message_unset (&message); + return GST_FLOW_UNEXPECTED; + } +interrupt: + { + gst_rtsp_message_unset (&message); + GST_DEBUG_OBJECT (src, "got interrupted: stop connection flush"); + gst_rtspsrc_connection_flush (src, FALSE); + return GST_FLOW_WRONG_STATE; + } +receive_error: + { + gchar *str = gst_rtsp_strresult (res); + + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("Could not receive message. (%s)", str)); + g_free (str); + + gst_rtsp_message_unset (&message); + return GST_FLOW_ERROR; + } +handle_request_failed: + { + gchar *str = gst_rtsp_strresult (res); + + GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), + ("Could not handle server message. (%s)", str)); + g_free (str); + gst_rtsp_message_unset (&message); + return GST_FLOW_ERROR; + } +invalid_length: + { + GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), + ("Short message received, ignoring.")); + gst_rtsp_message_unset (&message); + return GST_FLOW_OK; + } +} + +static GstFlowReturn +gst_rtspsrc_loop_udp (GstRTSPSrc * src) +{ + GstRTSPResult res; + GstRTSPMessage message = { 0 }; + gint retry = 0; + + while (TRUE) { + GTimeVal tv_timeout; + + /* get the next timeout interval */ + gst_rtsp_connection_next_timeout (src->conninfo.connection, &tv_timeout); + + GST_DEBUG_OBJECT (src, "doing receive with timeout %d seconds", + (gint) tv_timeout.tv_sec); + + gst_rtsp_message_unset (&message); + + /* we should continue reading the TCP socket because the server might + * send us requests. When the session timeout expires, we need to send a + * keep-alive request to keep the session open. */ + res = gst_rtspsrc_connection_receive (src, src->conninfo.connection, + &message, &tv_timeout); + + switch (res) { + case GST_RTSP_OK: + GST_DEBUG_OBJECT (src, "we received a server message"); + break; + case GST_RTSP_EINTR: + /* we got interrupted, see what we have to do */ + goto interrupt; + case GST_RTSP_ETIMEOUT: + /* send keep-alive, ignore the result, a warning will be posted. */ + GST_DEBUG_OBJECT (src, "timeout, sending keep-alive"); + if ((res = gst_rtspsrc_send_keep_alive (src)) == GST_RTSP_EINTR) + goto interrupt; + continue; + case GST_RTSP_EEOF: + /* server closed the connection. not very fatal for UDP, reconnect and + * see what happens. */ + GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), + ("The server closed the connection.")); + if ((res = + gst_rtsp_conninfo_reconnect (src, &src->conninfo, FALSE)) < 0) + goto connect_error; + + continue; + default: + goto receive_error; + } + + switch (message.type) { + case GST_RTSP_MESSAGE_REQUEST: + /* server sends us a request message, handle it */ + res = + gst_rtspsrc_handle_request (src, src->conninfo.connection, + &message); + if (res == GST_RTSP_EEOF) + goto server_eof; + else if (res < 0) + goto handle_request_failed; + break; + case GST_RTSP_MESSAGE_RESPONSE: + /* we ignore response and data messages */ + GST_DEBUG_OBJECT (src, "ignoring response message"); + if (src->debug) + gst_rtsp_message_dump (&message); + if (message.type_data.response.code == GST_RTSP_STS_UNAUTHORIZED) { + GST_DEBUG_OBJECT (src, "but is Unauthorized response ..."); + if (gst_rtspsrc_setup_auth (src, &message) && !(retry++)) { + GST_DEBUG_OBJECT (src, "so retrying keep-alive"); + if ((res = gst_rtspsrc_send_keep_alive (src)) == GST_RTSP_EINTR) + goto interrupt; + } + } else { + retry = 0; + } + break; + case GST_RTSP_MESSAGE_DATA: + /* we ignore response and data messages */ + GST_DEBUG_OBJECT (src, "ignoring data message"); + break; + default: + GST_WARNING_OBJECT (src, "ignoring unknown message type %d", + message.type); + break; + } + } + + /* we get here when the connection got interrupted */ +interrupt: + { + gst_rtsp_message_unset (&message); + GST_DEBUG_OBJECT (src, "got interrupted: stop connection flush"); + gst_rtspsrc_connection_flush (src, FALSE); + return GST_FLOW_WRONG_STATE; + } +connect_error: + { + gchar *str = gst_rtsp_strresult (res); + GstFlowReturn ret; + + src->conninfo.connected = FALSE; + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), + ("Could not connect to server. (%s)", str)); + g_free (str); + ret = GST_FLOW_ERROR; + } else { + ret = GST_FLOW_WRONG_STATE; + } + return ret; + } +receive_error: + { + gchar *str = gst_rtsp_strresult (res); + + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("Could not receive message. (%s)", str)); + g_free (str); + return GST_FLOW_ERROR; + } +handle_request_failed: + { + gchar *str = gst_rtsp_strresult (res); + GstFlowReturn ret; + + gst_rtsp_message_unset (&message); + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), + ("Could not handle server message. (%s)", str)); + g_free (str); + ret = GST_FLOW_ERROR; + } else { + ret = GST_FLOW_WRONG_STATE; + } + return ret; + } +server_eof: + { + GST_DEBUG_OBJECT (src, "we got an eof from the server"); + GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), + ("The server closed the connection.")); + src->conninfo.connected = FALSE; + gst_rtsp_message_unset (&message); + return GST_FLOW_UNEXPECTED; + } +} + +static GstRTSPResult +gst_rtspsrc_reconnect (GstRTSPSrc * src, gboolean async) +{ + GstRTSPResult res = GST_RTSP_OK; + gboolean restart; + + GST_DEBUG_OBJECT (src, "doing reconnect"); + + GST_OBJECT_LOCK (src); + /* only restart when the pads were not yet activated, else we were + * streaming over UDP */ + restart = src->need_activate; + GST_OBJECT_UNLOCK (src); + + /* no need to restart, we're done */ + if (!restart) + goto done; + + /* we can try only TCP now */ + src->cur_protocols = GST_RTSP_LOWER_TRANS_TCP; + + /* close and cleanup our state */ + if ((res = gst_rtspsrc_close (src, async, FALSE)) < 0) + goto done; + + /* see if we have TCP left to try. Also don't try TCP when we were configured + * with an SDP. */ + if (!(src->protocols & GST_RTSP_LOWER_TRANS_TCP) || src->from_sdp) + goto no_protocols; + + /* We post a warning message now to inform the user + * that nothing happened. It's most likely a firewall thing. */ + GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), + ("Could not receive any UDP packets for %.4f seconds, maybe your " + "firewall is blocking it. Retrying using a TCP connection.", + gst_guint64_to_gdouble (src->udp_timeout / 1000000.0))); + + /* open new connection using tcp */ + if (gst_rtspsrc_open (src, async) < 0) + goto open_failed; + + /* start playback */ + if (gst_rtspsrc_play (src, &src->segment, async) < 0) + goto play_failed; + +done: + return res; + + /* ERRORS */ +no_protocols: + { + src->cur_protocols = 0; + /* no transport possible, post an error and stop */ + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("Could not receive any UDP packets for %.4f seconds, maybe your " + "firewall is blocking it. No other protocols to try.", + gst_guint64_to_gdouble (src->udp_timeout / 1000000.0))); + return GST_FLOW_ERROR; + } +open_failed: + { + GST_DEBUG_OBJECT (src, "open failed"); + return GST_FLOW_OK; + } +play_failed: + { + GST_DEBUG_OBJECT (src, "play failed"); + return GST_FLOW_OK; + } +} + +static void +gst_rtspsrc_loop_start_cmd (GstRTSPSrc * src, gint cmd) +{ + switch (cmd) { + case CMD_OPEN: + GST_ELEMENT_PROGRESS (src, START, "open", ("Opening Stream")); + break; + case CMD_PLAY: + GST_ELEMENT_PROGRESS (src, START, "request", ("Sending PLAY request")); + break; + case CMD_PAUSE: + GST_ELEMENT_PROGRESS (src, START, "request", ("Sending PAUSE request")); + break; + case CMD_CLOSE: + GST_ELEMENT_PROGRESS (src, START, "close", ("Closing Stream")); + break; + default: + break; + } +} + +static void +gst_rtspsrc_loop_complete_cmd (GstRTSPSrc * src, gint cmd) +{ + switch (cmd) { + case CMD_OPEN: + GST_ELEMENT_PROGRESS (src, COMPLETE, "open", ("Opened Stream")); + break; + case CMD_PLAY: + GST_ELEMENT_PROGRESS (src, COMPLETE, "request", ("Sent PLAY request")); + break; + case CMD_PAUSE: + GST_ELEMENT_PROGRESS (src, COMPLETE, "request", ("Sent PAUSE request")); + break; + case CMD_CLOSE: + GST_ELEMENT_PROGRESS (src, COMPLETE, "close", ("Closed Stream")); + break; + default: + break; + } +} + +static void +gst_rtspsrc_loop_cancel_cmd (GstRTSPSrc * src, gint cmd) +{ + switch (cmd) { + case CMD_OPEN: + GST_ELEMENT_PROGRESS (src, CANCELED, "open", ("Open canceled")); + break; + case CMD_PLAY: + GST_ELEMENT_PROGRESS (src, CANCELED, "request", ("PLAY canceled")); + break; + case CMD_PAUSE: + GST_ELEMENT_PROGRESS (src, CANCELED, "request", ("PAUSE canceled")); + break; + case CMD_CLOSE: + GST_ELEMENT_PROGRESS (src, CANCELED, "close", ("Close canceled")); + break; + default: + break; + } +} + +static void +gst_rtspsrc_loop_error_cmd (GstRTSPSrc * src, gint cmd) +{ + switch (cmd) { + case CMD_OPEN: + GST_ELEMENT_PROGRESS (src, ERROR, "open", ("Open failed")); + break; + case CMD_PLAY: + GST_ELEMENT_PROGRESS (src, ERROR, "request", ("PLAY failed")); + break; + case CMD_PAUSE: + GST_ELEMENT_PROGRESS (src, ERROR, "request", ("PAUSE failed")); + break; + case CMD_CLOSE: + GST_ELEMENT_PROGRESS (src, ERROR, "close", ("Close failed")); + break; + default: + break; + } +} + +static void +gst_rtspsrc_loop_end_cmd (GstRTSPSrc * src, gint cmd, GstRTSPResult ret) +{ + if (ret == GST_RTSP_OK) + gst_rtspsrc_loop_complete_cmd (src, cmd); + else if (ret == GST_RTSP_EINTR) + gst_rtspsrc_loop_cancel_cmd (src, cmd); + else + gst_rtspsrc_loop_error_cmd (src, cmd); +} + +static void +gst_rtspsrc_loop_send_cmd (GstRTSPSrc * src, gint cmd, gboolean flush) +{ + gint old; + + /* FIXME flush param mute; remove at discretion */ + + /* start new request */ + gst_rtspsrc_loop_start_cmd (src, cmd); + + GST_DEBUG_OBJECT (src, "sending cmd %d", cmd); + + GST_OBJECT_LOCK (src); + old = src->loop_cmd; + if (old != CMD_WAIT) { + src->loop_cmd = CMD_WAIT; + GST_OBJECT_UNLOCK (src); + /* cancel previous request */ + gst_rtspsrc_loop_cancel_cmd (src, old); + GST_OBJECT_LOCK (src); + } + src->loop_cmd = cmd; + /* interrupt if allowed */ + if (src->waiting) { + GST_DEBUG_OBJECT (src, "start connection flush"); + gst_rtspsrc_connection_flush (src, TRUE); + } + if (src->task) + gst_task_start (src->task); + GST_OBJECT_UNLOCK (src); +} + +static gboolean +gst_rtspsrc_loop (GstRTSPSrc * src) +{ + GstFlowReturn ret; + + if (!src->conninfo.connection || !src->conninfo.connected) + goto no_connection; + + if (src->interleaved) + ret = gst_rtspsrc_loop_interleaved (src); + else + ret = gst_rtspsrc_loop_udp (src); + + if (ret != GST_FLOW_OK) + goto pause; + + return TRUE; + + /* ERRORS */ +no_connection: + { + GST_WARNING_OBJECT (src, "we are not connected"); + ret = GST_FLOW_WRONG_STATE; + goto pause; + } +pause: + { + const gchar *reason = gst_flow_get_name (ret); + + GST_DEBUG_OBJECT (src, "pausing task, reason %s", reason); + src->running = FALSE; + if (ret == GST_FLOW_UNEXPECTED) { + /* perform EOS logic */ + if (src->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT_CAST (src), + gst_message_new_segment_done (GST_OBJECT_CAST (src), + src->segment.format, src->segment.last_stop)); + } else { + gst_rtspsrc_push_event (src, gst_event_new_eos (), FALSE); + } + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + /* for fatal errors we post an error message, post the error before the + * EOS so the app knows about the error first. */ + GST_ELEMENT_ERROR (src, STREAM, FAILED, + ("Internal data flow error."), + ("streaming task paused, reason %s (%d)", reason, ret)); + gst_rtspsrc_push_event (src, gst_event_new_eos (), FALSE); + } + return FALSE; + } +} + +#ifndef GST_DISABLE_GST_DEBUG +static const gchar * +gst_rtsp_auth_method_to_string (GstRTSPAuthMethod method) +{ + gint index = 0; + + while (method != 0) { + index++; + method >>= 1; + } + switch (index) { + case 0: + return "None"; + case 1: + return "Basic"; + case 2: + return "Digest"; + } + + return "Unknown"; +} +#endif + +static const gchar * +gst_rtspsrc_skip_lws (const gchar * s) +{ + while (g_ascii_isspace (*s)) + s++; + return s; +} + +static const gchar * +gst_rtspsrc_unskip_lws (const gchar * s, const gchar * start) +{ + while (s > start && g_ascii_isspace (*(s - 1))) + s--; + return s; +} + +static const gchar * +gst_rtspsrc_skip_commas (const gchar * s) +{ + /* The grammar allows for multiple commas */ + while (g_ascii_isspace (*s) || *s == ',') + s++; + return s; +} + +static const gchar * +gst_rtspsrc_skip_item (const gchar * s) +{ + gboolean quoted = FALSE; + const gchar *start = s; + + /* A list item ends at the last non-whitespace character + * before a comma which is not inside a quoted-string. Or at + * the end of the string. + */ + while (*s) { + if (*s == '"') + quoted = !quoted; + else if (quoted) { + if (*s == '\\' && *(s + 1)) + s++; + } else { + if (*s == ',') + break; + } + s++; + } + + return gst_rtspsrc_unskip_lws (s, start); +} + +static void +gst_rtsp_decode_quoted_string (gchar * quoted_string) +{ + gchar *src, *dst; + + src = quoted_string + 1; + dst = quoted_string; + while (*src && *src != '"') { + if (*src == '\\' && *(src + 1)) + src++; + *dst++ = *src++; + } + *dst = '\0'; +} + +/* Extract the authentication tokens that the server provided for each method + * into an array of structures and give those to the connection object. + */ +static void +gst_rtspsrc_parse_digest_challenge (GstRTSPConnection * conn, + const gchar * header, gboolean * stale) +{ + GSList *list = NULL, *iter; + const gchar *end; + gchar *item, *eq, *name_end, *value; + + g_return_if_fail (stale != NULL); + + gst_rtsp_connection_clear_auth_params (conn); + *stale = FALSE; + + /* Parse a header whose content is described by RFC2616 as + * "#something", where "something" does not itself contain commas, + * except as part of quoted-strings, into a list of allocated strings. + */ + header = gst_rtspsrc_skip_commas (header); + while (*header) { + end = gst_rtspsrc_skip_item (header); + list = g_slist_prepend (list, g_strndup (header, end - header)); + header = gst_rtspsrc_skip_commas (end); + } + if (!list) + return; + + list = g_slist_reverse (list); + for (iter = list; iter; iter = iter->next) { + item = iter->data; + + eq = strchr (item, '='); + if (eq) { + name_end = (gchar *) gst_rtspsrc_unskip_lws (eq, item); + if (name_end == item) { + /* That's no good... */ + g_free (item); + continue; + } + + *name_end = '\0'; + + value = (gchar *) gst_rtspsrc_skip_lws (eq + 1); + if (*value == '"') + gst_rtsp_decode_quoted_string (value); + } else + value = NULL; + + if (item && (strcmp (item, "stale") == 0) && + value && (strcmp (value, "TRUE") == 0)) + *stale = TRUE; + gst_rtsp_connection_set_auth_param (conn, item, value); + g_free (item); + } + + g_slist_free (list); +} + +/* Parse a WWW-Authenticate Response header and determine the + * available authentication methods + * + * This code should also cope with the fact that each WWW-Authenticate + * header can contain multiple challenge methods + tokens + * + * At the moment, for Basic auth, we just do a minimal check and don't + * even parse out the realm */ +static void +gst_rtspsrc_parse_auth_hdr (gchar * hdr, GstRTSPAuthMethod * methods, + GstRTSPConnection * conn, gboolean * stale) +{ + gchar *start; + + g_return_if_fail (hdr != NULL); + g_return_if_fail (methods != NULL); + g_return_if_fail (stale != NULL); + + /* Skip whitespace at the start of the string */ + for (start = hdr; start[0] != '\0' && g_ascii_isspace (start[0]); start++); + + if (g_ascii_strncasecmp (start, "basic", 5) == 0) + *methods |= GST_RTSP_AUTH_BASIC; + else if (g_ascii_strncasecmp (start, "digest ", 7) == 0) { + *methods |= GST_RTSP_AUTH_DIGEST; + gst_rtspsrc_parse_digest_challenge (conn, &start[7], stale); + } +} + +/** + * gst_rtspsrc_setup_auth: + * @src: the rtsp source + * + * Configure a username and password and auth method on the + * connection object based on a response we received from the + * peer. + * + * Currently, this requires that a username and password were supplied + * in the uri. In the future, they may be requested on demand by sending + * a message up the bus. + * + * Returns: TRUE if authentication information could be set up correctly. + */ +static gboolean +gst_rtspsrc_setup_auth (GstRTSPSrc * src, GstRTSPMessage * response) +{ + gchar *user = NULL; + gchar *pass = NULL; + GstRTSPAuthMethod avail_methods = GST_RTSP_AUTH_NONE; + GstRTSPAuthMethod method; + GstRTSPResult auth_result; + GstRTSPUrl *url; + GstRTSPConnection *conn; + gchar *hdr; + gboolean stale = FALSE; + + conn = src->conninfo.connection; + + /* Identify the available auth methods and see if any are supported */ + if (gst_rtsp_message_get_header (response, GST_RTSP_HDR_WWW_AUTHENTICATE, + &hdr, 0) == GST_RTSP_OK) { + gst_rtspsrc_parse_auth_hdr (hdr, &avail_methods, conn, &stale); + } + + if (avail_methods == GST_RTSP_AUTH_NONE) + goto no_auth_available; + + /* For digest auth, if the response indicates that the session + * data are stale, we just update them in the connection object and + * return TRUE to retry the request */ + if (stale) + src->tried_url_auth = FALSE; + + url = gst_rtsp_connection_get_url (conn); + + /* Do we have username and password available? */ + if (url != NULL && !src->tried_url_auth && url->user != NULL + && url->passwd != NULL) { + user = url->user; + pass = url->passwd; + src->tried_url_auth = TRUE; + GST_DEBUG_OBJECT (src, + "Attempting authentication using credentials from the URL"); + } else { + user = src->user_id; + pass = src->user_pw; + GST_DEBUG_OBJECT (src, + "Attempting authentication using credentials from the properties"); + } + + /* FIXME: If the url didn't contain username and password or we tried them + * already, request a username and passwd from the application via some kind + * of credentials request message */ + + /* If we don't have a username and passwd at this point, bail out. */ + if (user == NULL || pass == NULL) + goto no_user_pass; + + /* Try to configure for each available authentication method, strongest to + * weakest */ + for (method = GST_RTSP_AUTH_MAX; method != GST_RTSP_AUTH_NONE; method >>= 1) { + /* Check if this method is available on the server */ + if ((method & avail_methods) == 0) + continue; + + /* Pass the credentials to the connection to try on the next request */ + auth_result = gst_rtsp_connection_set_auth (conn, method, user, pass); + /* INVAL indicates an invalid username/passwd were supplied, so we'll just + * ignore it and end up retrying later */ + if (auth_result == GST_RTSP_OK || auth_result == GST_RTSP_EINVAL) { + GST_DEBUG_OBJECT (src, "Attempting %s authentication", + gst_rtsp_auth_method_to_string (method)); + break; + } + } + + if (method == GST_RTSP_AUTH_NONE) + goto no_auth_available; + + return TRUE; + +no_auth_available: + { + /* Output an error indicating that we couldn't connect because there were + * no supported authentication protocols */ + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), + ("No supported authentication protocol was found")); + return FALSE; + } +no_user_pass: + { + /* We don't fire an error message, we just return FALSE and let the + * normal NOT_AUTHORIZED error be propagated */ + return FALSE; + } +} + +static GstRTSPResult +gst_rtspsrc_try_send (GstRTSPSrc * src, GstRTSPConnection * conn, + GstRTSPMessage * request, GstRTSPMessage * response, + GstRTSPStatusCode * code) +{ + GstRTSPResult res; + GstRTSPStatusCode thecode; + gchar *content_base = NULL; + gint try = 0; + +again: + if (!src->short_header) + gst_rtsp_ext_list_before_send (src->extensions, request); + + GST_DEBUG_OBJECT (src, "sending message"); + + if (src->debug) + gst_rtsp_message_dump (request); + + res = gst_rtspsrc_connection_send (src, conn, request, src->ptcp_timeout); + if (res < 0) + goto send_error; + + gst_rtsp_connection_reset_timeout (conn); + +#ifdef GST_EXT_RTSPSRC_MODIFICATION + if(request->type_data.request.method == GST_RTSP_PAUSE) + src->wait_pause_response = TRUE; +#endif + +next: + res = gst_rtspsrc_connection_receive (src, conn, response, src->ptcp_timeout); + if (res < 0) + goto receive_error; + + if (src->debug) + gst_rtsp_message_dump (response); + +#ifdef GST_EXT_RTSPSRC_MODIFICATION + if(request->type_data.request.method != GST_RTSP_PAUSE && src->wait_pause_response) { + GST_DEBUG_OBJECT(src, "ignoring PAUSE response message"); + src->wait_pause_response = FALSE; + goto next; + } +#endif + + + switch (response->type) { + case GST_RTSP_MESSAGE_REQUEST: + res = gst_rtspsrc_handle_request (src, conn, response); + if (res == GST_RTSP_EEOF) + goto server_eof; + else if (res < 0) + goto handle_request_failed; + goto next; + case GST_RTSP_MESSAGE_RESPONSE: + /* ok, a response is good */ + GST_DEBUG_OBJECT (src, "received response message"); + break; + case GST_RTSP_MESSAGE_DATA: + /* get next response */ + GST_DEBUG_OBJECT (src, "ignoring data response message"); + goto next; + default: + GST_WARNING_OBJECT (src, "ignoring unknown message type %d", + response->type); + goto next; + } + + thecode = response->type_data.response.code; + + GST_DEBUG_OBJECT (src, "got response message %d", thecode); + +#ifdef GST_EXT_RTSPSRC_MODIFICATION + if(request->type_data.request.method == GST_RTSP_PAUSE) + src->wait_pause_response = FALSE; +#endif + + /* if the caller wanted the result code, we store it. */ + if (code) + *code = thecode; + + /* If the request didn't succeed, bail out before doing any more */ + if (thecode != GST_RTSP_STS_OK) + return GST_RTSP_OK; + + /* store new content base if any */ + gst_rtsp_message_get_header (response, GST_RTSP_HDR_CONTENT_BASE, + &content_base, 0); + if (content_base) { + g_free (src->content_base); + src->content_base = g_strdup (content_base); + } + gst_rtsp_ext_list_after_send (src->extensions, request, response); + + return GST_RTSP_OK; + + /* ERRORS */ +send_error: + { + gchar *str = gst_rtsp_strresult (res); + + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), + ("Could not send message. (%s)", str)); + } else { + GST_WARNING_OBJECT (src, "send interrupted"); + } + g_free (str); + return res; + } +receive_error: + { + switch (res) { + case GST_RTSP_EEOF: + GST_WARNING_OBJECT (src, "server closed connection, doing reconnect"); +#ifdef GST_EXT_RTSPSRC_MODIFICATION + if(request->type_data.request.method == GST_RTSP_PAUSE) + src->wait_pause_response = FALSE; +#endif + if (try == 0) { + try++; + /* if reconnect succeeds, try again */ + if ((res = + gst_rtsp_conninfo_reconnect (src, &src->conninfo, + FALSE)) == 0) + goto again; + } + /* only try once after reconnect, then fallthrough and error out */ + default: + { + gchar *str = gst_rtsp_strresult (res); + + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("Could not receive message. (%s)", str)); + } else { + GST_WARNING_OBJECT (src, "receive interrupted"); + } + g_free (str); + break; + } + } + return res; + } +handle_request_failed: + { + /* ERROR was posted */ + gst_rtsp_message_unset (response); + return res; + } +server_eof: + { + GST_DEBUG_OBJECT (src, "we got an eof from the server"); + GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), + ("The server closed the connection.")); + gst_rtsp_message_unset (response); + return res; + } +} + +/** + * gst_rtspsrc_send: + * @src: the rtsp source + * @conn: the connection to send on + * @request: must point to a valid request + * @response: must point to an empty #GstRTSPMessage + * @code: an optional code result + * + * send @request and retrieve the response in @response. optionally @code can be + * non-NULL in which case it will contain the status code of the response. + * + * If This function returns #GST_RTSP_OK, @response will contain a valid response + * message that should be cleaned with gst_rtsp_message_unset() after usage. + * + * If @code is NULL, this function will return #GST_RTSP_ERROR (with an invalid + * @response message) if the response code was not 200 (OK). + * + * If the attempt results in an authentication failure, then this will attempt + * to retrieve authentication credentials via gst_rtspsrc_setup_auth and retry + * the request. + * + * Returns: #GST_RTSP_OK if the processing was successful. + */ +static GstRTSPResult +gst_rtspsrc_send (GstRTSPSrc * src, GstRTSPConnection * conn, + GstRTSPMessage * request, GstRTSPMessage * response, + GstRTSPStatusCode * code) +{ + GstRTSPStatusCode int_code = GST_RTSP_STS_OK; + GstRTSPResult res = GST_RTSP_ERROR; + gint count; + gboolean retry; + GstRTSPMethod method = GST_RTSP_INVALID; + + count = 0; + do { + retry = FALSE; + + /* make sure we don't loop forever */ + if (count++ > 8) + break; + + /* save method so we can disable it when the server complains */ + method = request->type_data.request.method; + + if ((res = + gst_rtspsrc_try_send (src, conn, request, response, &int_code)) < 0) + goto error; + + switch (int_code) { + case GST_RTSP_STS_UNAUTHORIZED: + if (gst_rtspsrc_setup_auth (src, response)) { + /* Try the request/response again after configuring the auth info + * and loop again */ + retry = TRUE; + } + break; + default: + break; + } + } while (retry == TRUE); + + /* If the user requested the code, let them handle errors, otherwise + * post an error below */ + if (code != NULL) + *code = int_code; + else if (int_code != GST_RTSP_STS_OK) + goto error_response; + + return res; + + /* ERRORS */ +error: + { + GST_DEBUG_OBJECT (src, "got error %d", res); + return res; + } +error_response: + { + res = GST_RTSP_ERROR; + + switch (response->type_data.response.code) { + case GST_RTSP_STS_NOT_FOUND: + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), ("%s", + response->type_data.response.reason)); + break; + case GST_RTSP_STS_MOVED_PERMANENTLY: + case GST_RTSP_STS_MOVE_TEMPORARILY: + { + gchar *new_location; + GstRTSPLowerTrans transports; + + GST_DEBUG_OBJECT (src, "got redirection"); + /* if we don't have a Location Header, we must error */ + if (gst_rtsp_message_get_header (response, GST_RTSP_HDR_LOCATION, + &new_location, 0) < 0) + break; + + /* When we receive a redirect result, we go back to the INIT state after + * parsing the new URI. The caller should do the needed steps to issue + * a new setup when it detects this state change. */ + GST_DEBUG_OBJECT (src, "redirection to %s", new_location); + + /* save current transports */ + if (src->conninfo.url) + transports = src->conninfo.url->transports; + else + transports = GST_RTSP_LOWER_TRANS_UNKNOWN; + + gst_rtspsrc_uri_set_uri (GST_URI_HANDLER (src), new_location); + + /* set old transports */ + if (src->conninfo.url && transports != GST_RTSP_LOWER_TRANS_UNKNOWN) + src->conninfo.url->transports = transports; + + src->need_redirect = TRUE; + src->state = GST_RTSP_STATE_INIT; + res = GST_RTSP_OK; + break; + } + case GST_RTSP_STS_NOT_ACCEPTABLE: + case GST_RTSP_STS_NOT_IMPLEMENTED: + case GST_RTSP_STS_METHOD_NOT_ALLOWED: + GST_WARNING_OBJECT (src, "got NOT IMPLEMENTED, disable method %s", + gst_rtsp_method_as_text (method)); + src->methods &= ~method; + res = GST_RTSP_OK; + break; + default: + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("Got error response: %d (%s).", response->type_data.response.code, + response->type_data.response.reason)); + break; + } + /* if we return ERROR we should unset the response ourselves */ + if (res == GST_RTSP_ERROR) + gst_rtsp_message_unset (response); + + return res; + } +} + +static GstRTSPResult +gst_rtspsrc_send_cb (GstRTSPExtension * ext, GstRTSPMessage * request, + GstRTSPMessage * response, GstRTSPSrc * src) +{ + return gst_rtspsrc_send (src, src->conninfo.connection, request, response, + NULL); +} + + +/* parse the response and collect all the supported methods. We need this + * information so that we don't try to send an unsupported request to the + * server. + */ +static gboolean +gst_rtspsrc_parse_methods (GstRTSPSrc * src, GstRTSPMessage * response) +{ + GstRTSPHeaderField field; + gchar *respoptions; + gchar **options; + gint indx = 0; + gint i; + + /* reset supported methods */ + src->methods = 0; + + /* Try Allow Header first */ + field = GST_RTSP_HDR_ALLOW; + while (TRUE) { + respoptions = NULL; + gst_rtsp_message_get_header (response, field, &respoptions, indx); + if (indx == 0 && !respoptions) { + /* if no Allow header was found then try the Public header... */ + field = GST_RTSP_HDR_PUBLIC; + gst_rtsp_message_get_header (response, field, &respoptions, indx); + } + if (!respoptions) + break; + + /* If we get here, the server gave a list of supported methods, parse + * them here. The string is like: + * + * OPTIONS, DESCRIBE, ANNOUNCE, PLAY, SETUP, ... + */ + options = g_strsplit (respoptions, ",", 0); + + for (i = 0; options[i]; i++) { + gchar *stripped; + gint method; + + stripped = g_strstrip (options[i]); + method = gst_rtsp_find_method (stripped); + + /* keep bitfield of supported methods */ + if (method != GST_RTSP_INVALID) + src->methods |= method; + } + g_strfreev (options); + + indx++; + } + + if (src->methods == 0) { + /* neither Allow nor Public are required, assume the server supports + * at least DESCRIBE, SETUP, we always assume it supports PLAY as + * well. */ + GST_DEBUG_OBJECT (src, "could not get OPTIONS"); + src->methods = GST_RTSP_DESCRIBE | GST_RTSP_SETUP; + } + /* always assume PLAY, FIXME, extensions should be able to override + * this */ + src->methods |= GST_RTSP_PLAY; + /* also assume it will support Range */ + src->seekable = TRUE; + + /* we need describe and setup */ + if (!(src->methods & GST_RTSP_DESCRIBE)) + goto no_describe; + if (!(src->methods & GST_RTSP_SETUP)) + goto no_setup; + + return TRUE; + + /* ERRORS */ +no_describe: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), + ("Server does not support DESCRIBE.")); + return FALSE; + } +no_setup: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), + ("Server does not support SETUP.")); + return FALSE; + } +} + +/* masks to be kept in sync with the hardcoded protocol order of preference + * in code below */ +static guint protocol_masks[] = { + GST_RTSP_LOWER_TRANS_UDP, + GST_RTSP_LOWER_TRANS_UDP_MCAST, + GST_RTSP_LOWER_TRANS_TCP, + 0 +}; + +static GstRTSPResult +gst_rtspsrc_create_transports_string (GstRTSPSrc * src, + GstRTSPLowerTrans protocols, gchar ** transports) +{ + GstRTSPResult res; + GString *result; + gboolean add_udp_str; + + *transports = NULL; + + res = + gst_rtsp_ext_list_get_transports (src->extensions, protocols, transports); + + if (res < 0) + goto failed; + + GST_DEBUG_OBJECT (src, "got transports %s", GST_STR_NULL (*transports)); + + /* extension listed transports, use those */ + if (*transports != NULL) + return GST_RTSP_OK; + + /* it's the default */ + add_udp_str = FALSE; + + /* the default RTSP transports */ + result = g_string_new (""); + if (protocols & GST_RTSP_LOWER_TRANS_UDP) { + GST_DEBUG_OBJECT (src, "adding UDP unicast"); + + g_string_append (result, "RTP/AVP"); + if (add_udp_str) + g_string_append (result, "/UDP"); + g_string_append (result, ";unicast;client_port=%%u1-%%u2"); + } else if (protocols & GST_RTSP_LOWER_TRANS_UDP_MCAST) { + GST_DEBUG_OBJECT (src, "adding UDP multicast"); + + /* we don't have to allocate any UDP ports yet, if the selected transport + * turns out to be multicast we can create them and join the multicast + * group indicated in the transport reply */ + if (result->len > 0) + g_string_append (result, ","); + g_string_append (result, "RTP/AVP"); + if (add_udp_str) + g_string_append (result, "/UDP"); + g_string_append (result, ";multicast"); + } else if (protocols & GST_RTSP_LOWER_TRANS_TCP) { + GST_DEBUG_OBJECT (src, "adding TCP"); + + if (result->len > 0) + g_string_append (result, ","); + g_string_append (result, "RTP/AVP/TCP;unicast;interleaved=%%i1-%%i2"); + } + *transports = g_string_free (result, FALSE); + + GST_DEBUG_OBJECT (src, "prepared transports %s", GST_STR_NULL (*transports)); + + return GST_RTSP_OK; + + /* ERRORS */ +failed: + { + return res; + } +} + +static GstRTSPResult +gst_rtspsrc_prepare_transports (GstRTSPStream * stream, gchar ** transports, + gint orig_rtpport, gint orig_rtcpport) +{ + GstRTSPSrc *src; + gint nr_udp, nr_int; + gchar *next, *p; + gint rtpport = 0, rtcpport = 0; + GString *str; + + src = stream->parent; + + /* find number of placeholders first */ + if (strstr (*transports, "%%i2")) + nr_int = 2; + else if (strstr (*transports, "%%i1")) + nr_int = 1; + else + nr_int = 0; + + if (strstr (*transports, "%%u2")) + nr_udp = 2; + else if (strstr (*transports, "%%u1")) + nr_udp = 1; + else + nr_udp = 0; + + if (nr_udp == 0 && nr_int == 0) + goto done; + + if (nr_udp > 0) { + if (!orig_rtpport || !orig_rtcpport) { + if (!gst_rtspsrc_alloc_udp_ports (stream, &rtpport, &rtcpport)) + goto failed; + } else { + rtpport = orig_rtpport; + rtcpport = orig_rtcpport; + } + } + + str = g_string_new (""); + p = *transports; + while ((next = strstr (p, "%%"))) { + g_string_append_len (str, p, next - p); + if (next[2] == 'u') { + if (next[3] == '1') + g_string_append_printf (str, "%d", rtpport); + else if (next[3] == '2') + g_string_append_printf (str, "%d", rtcpport); + } + if (next[2] == 'i') { + if (next[3] == '1') + g_string_append_printf (str, "%d", src->free_channel); + else if (next[3] == '2') + g_string_append_printf (str, "%d", src->free_channel + 1); + } + + p = next + 4; + } + /* append final part */ + g_string_append (str, p); + + g_free (*transports); + *transports = g_string_free (str, FALSE); + +done: + return GST_RTSP_OK; + + /* ERRORS */ +failed: + { + return GST_RTSP_ERROR; + } +} + +static gboolean +gst_rtspsrc_stream_is_real_media (GstRTSPStream * stream) +{ + gboolean res = FALSE; + + if (stream->caps) { + GstStructure *s; + const gchar *enc = NULL; + + s = gst_caps_get_structure (stream->caps, 0); + if ((enc = gst_structure_get_string (s, "encoding-name"))) { + res = (strstr (enc, "-REAL") != NULL); + } + } + return res; +} + +/* Perform the SETUP request for all the streams. + * + * We ask the server for a specific transport, which initially includes all the + * ones we can support (UDP/TCP/MULTICAST). For the UDP transport we allocate + * two local UDP ports that we send to the server. + * + * Once the server replied with a transport, we configure the other streams + * with the same transport. + * + * This function will also configure the stream for the selected transport, + * which basically means creating the pipeline. + */ +static GstRTSPResult +gst_rtspsrc_setup_streams (GstRTSPSrc * src, gboolean async) +{ + GList *walk; + GstRTSPResult res = GST_RTSP_ERROR; + GstRTSPMessage request = { 0 }; + GstRTSPMessage response = { 0 }; + GstRTSPStream *stream = NULL; + GstRTSPLowerTrans protocols; + GstRTSPStatusCode code; + gboolean unsupported_real = FALSE; + gint rtpport, rtcpport; + GstRTSPUrl *url; + gchar *hval; + + if (src->conninfo.connection) { + url = gst_rtsp_connection_get_url (src->conninfo.connection); + /* we initially allow all configured lower transports. based on the URL + * transports and the replies from the server we narrow them down. */ + protocols = url->transports & src->cur_protocols; + } else { + url = NULL; + protocols = src->cur_protocols; + } + + if (protocols == 0) + goto no_protocols; + + /* reset some state */ + src->free_channel = 0; + src->interleaved = FALSE; + src->need_activate = FALSE; + /* keep track of next port number, 0 is random */ + src->next_port_num = src->client_port_range.min; + rtpport = rtcpport = 0; + + if (G_UNLIKELY (src->streams == NULL)) + goto no_streams; + + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPConnection *conn; + gchar *transports; + gint retry = 0; + guint mask = 0; + + stream = (GstRTSPStream *) walk->data; + + /* see if we need to configure this stream */ + if (!gst_rtsp_ext_list_configure_stream (src->extensions, stream->caps)) { + GST_DEBUG_OBJECT (src, "skipping stream %p, disabled by extension", + stream); + stream->disabled = TRUE; + continue; + } + + /* merge/overwrite global caps */ + if (stream->caps) { + guint j, num; + GstStructure *s; + + s = gst_caps_get_structure (stream->caps, 0); + + num = gst_structure_n_fields (src->props); + for (j = 0; j < num; j++) { + const gchar *name; + const GValue *val; + + name = gst_structure_nth_field_name (src->props, j); + val = gst_structure_get_value (src->props, name); + gst_structure_set_value (s, name, val); + + GST_DEBUG_OBJECT (src, "copied %s", name); + } + } + + /* skip setup if we have no URL for it */ + if (stream->conninfo.location == NULL) { + GST_DEBUG_OBJECT (src, "skipping stream %p, no setup", stream); + continue; + } + + if (src->conninfo.connection == NULL) { + if (!gst_rtsp_conninfo_connect (src, &stream->conninfo, async)) { + GST_DEBUG_OBJECT (src, "skipping stream %p, failed to connect", stream); + continue; + } + conn = stream->conninfo.connection; + } else { + conn = src->conninfo.connection; + } + GST_DEBUG_OBJECT (src, "doing setup of stream %p with %s", stream, + stream->conninfo.location); + + /* if we have a multicast connection, only suggest multicast from now on */ + if (stream->is_multicast) + protocols &= GST_RTSP_LOWER_TRANS_UDP_MCAST; + + next_protocol: + /* first selectable protocol */ + while (protocol_masks[mask] && !(protocols & protocol_masks[mask])) + mask++; + if (!protocol_masks[mask]) + goto no_protocols; + + retry: + GST_DEBUG_OBJECT (src, "protocols = 0x%x, protocol mask = 0x%x", protocols, + protocol_masks[mask]); + /* create a string with first transport in line */ + transports = NULL; + res = gst_rtspsrc_create_transports_string (src, + protocols & protocol_masks[mask], &transports); + if (res < 0 || transports == NULL) + goto setup_transport_failed; + + if (strlen (transports) == 0) { + g_free (transports); + GST_DEBUG_OBJECT (src, "no transports found"); + mask++; + goto next_protocol; + } + + GST_DEBUG_OBJECT (src, "replace ports in %s", GST_STR_NULL (transports)); + + /* replace placeholders with real values, this function will optionally + * allocate UDP ports and other info needed to execute the setup request */ + res = gst_rtspsrc_prepare_transports (stream, &transports, + retry > 0 ? rtpport : 0, retry > 0 ? rtcpport : 0); + if (res < 0) { + g_free (transports); + goto setup_transport_failed; + } + + GST_DEBUG_OBJECT (src, "transport is now %s", GST_STR_NULL (transports)); + + /* create SETUP request */ + res = + gst_rtsp_message_init_request (&request, GST_RTSP_SETUP, + stream->conninfo.location); + if (res < 0) { + g_free (transports); + goto create_request_failed; + } + + /* select transport, copy is made when adding to header so we can free it. */ + gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT, transports); + g_free (transports); + + /* if the user wants a non default RTP packet size we add the blocksize + * parameter */ + if (src->rtp_blocksize > 0) { + hval = g_strdup_printf ("%d", src->rtp_blocksize); + gst_rtsp_message_add_header (&request, GST_RTSP_HDR_BLOCKSIZE, hval); + g_free (hval); + } + + if (async) + GST_ELEMENT_PROGRESS (src, CONTINUE, "request", ("SETUP stream %d", + stream->id)); + + /* handle the code ourselves */ + if ((res = gst_rtspsrc_send (src, conn, &request, &response, &code) < 0)) + goto send_error; + + switch (code) { + case GST_RTSP_STS_OK: + break; + case GST_RTSP_STS_UNSUPPORTED_TRANSPORT: + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + /* cleanup of leftover transport */ + gst_rtspsrc_stream_free_udp (stream); + /* MS WMServer RTSP MUST use same UDP pair in all SETUP requests; + * we might be in this case */ + if (stream->container && rtpport && rtcpport && !retry) { + GST_DEBUG_OBJECT (src, "retrying with original port pair %u-%u", + rtpport, rtcpport); + retry++; + goto retry; + } + /* this transport did not go down well, but we may have others to try + * that we did not send yet, try those and only give up then + * but not without checking for lost cause/extension so we can + * post a nicer/more useful error message later */ + if (!unsupported_real) + unsupported_real = gst_rtspsrc_stream_is_real_media (stream); + /* select next available protocol, give up on this stream if none */ + mask++; + while (protocol_masks[mask] && !(protocols & protocol_masks[mask])) + mask++; + if (!protocol_masks[mask] || unsupported_real) + continue; + else + goto retry; + default: + /* cleanup of leftover transport and move to the next stream */ + gst_rtspsrc_stream_free_udp (stream); + goto response_error; + } + + /* parse response transport */ + { + gchar *resptrans = NULL; + GstRTSPTransport transport = { 0 }; + + gst_rtsp_message_get_header (&response, GST_RTSP_HDR_TRANSPORT, + &resptrans, 0); + if (!resptrans) { + gst_rtspsrc_stream_free_udp (stream); + goto no_transport; + } + + /* parse transport, go to next stream on parse error */ + if (gst_rtsp_transport_parse (resptrans, &transport) != GST_RTSP_OK) { + GST_WARNING_OBJECT (src, "failed to parse transport %s", resptrans); + goto next; + } + + /* update allowed transports for other streams. once the transport of + * one stream has been determined, we make sure that all other streams + * are configured in the same way */ + switch (transport.lower_transport) { + case GST_RTSP_LOWER_TRANS_TCP: + GST_DEBUG_OBJECT (src, "stream %p as TCP interleaved", stream); + protocols = GST_RTSP_LOWER_TRANS_TCP; + src->interleaved = TRUE; + /* update free channels */ + src->free_channel = + MAX (transport.interleaved.min, src->free_channel); + src->free_channel = + MAX (transport.interleaved.max, src->free_channel); + src->free_channel++; + break; + case GST_RTSP_LOWER_TRANS_UDP_MCAST: + /* only allow multicast for other streams */ + GST_DEBUG_OBJECT (src, "stream %p as UDP multicast", stream); + protocols = GST_RTSP_LOWER_TRANS_UDP_MCAST; + break; + case GST_RTSP_LOWER_TRANS_UDP: + /* only allow unicast for other streams */ + GST_DEBUG_OBJECT (src, "stream %p as UDP unicast", stream); + protocols = GST_RTSP_LOWER_TRANS_UDP; + break; + default: + GST_DEBUG_OBJECT (src, "stream %p unknown transport %d", stream, + transport.lower_transport); + break; + } + + if (!stream->container || (!src->interleaved && !retry)) { + /* now configure the stream with the selected transport */ + if (!gst_rtspsrc_stream_configure_transport (stream, &transport)) { + GST_DEBUG_OBJECT (src, + "could not configure stream %p transport, skipping stream", + stream); + goto next; + } else if (stream->udpsrc[0] && stream->udpsrc[1]) { + /* retain the first allocated UDP port pair */ + g_object_get (G_OBJECT (stream->udpsrc[0]), "port", &rtpport, NULL); + g_object_get (G_OBJECT (stream->udpsrc[1]), "port", &rtcpport, NULL); + } + } + /* we need to activate at least one streams when we detect activity */ + src->need_activate = TRUE; + next: + /* clean up our transport struct */ + gst_rtsp_transport_init (&transport); + /* clean up used RTSP messages */ + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + } + } + + /* store the transport protocol that was configured */ + src->cur_protocols = protocols; + + gst_rtsp_ext_list_stream_select (src->extensions, url); + + /* if there is nothing to activate, error out */ + if (!src->need_activate) + goto nothing_to_activate; + + return res; + + /* ERRORS */ +no_protocols: + { + /* no transport possible, post an error and stop */ + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("Could not connect to server, no protocols left")); + return GST_RTSP_ERROR; + } +no_streams: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("SDP contains no streams")); + return GST_RTSP_ERROR; + } +create_request_failed: + { + gchar *str = gst_rtsp_strresult (res); + + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Could not create request. (%s)", str)); + g_free (str); + goto cleanup_error; + } +setup_transport_failed: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Could not setup transport.")); + res = GST_RTSP_ERROR; + goto cleanup_error; + } +response_error: + { + const gchar *str = gst_rtsp_status_as_text (code); + + GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), + ("Error (%d): %s", code, GST_STR_NULL (str))); + res = GST_RTSP_ERROR; + goto cleanup_error; + } +send_error: + { + gchar *str = gst_rtsp_strresult (res); + + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), + ("Could not send message. (%s)", str)); + } else { + GST_WARNING_OBJECT (src, "send interrupted"); + } + g_free (str); + goto cleanup_error; + } +no_transport: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Server did not select transport.")); + res = GST_RTSP_ERROR; + goto cleanup_error; + } +nothing_to_activate: + { + /* none of the available error codes is really right .. */ + if (unsupported_real) { + GST_ELEMENT_ERROR (src, STREAM, CODEC_NOT_FOUND, + (_("No supported stream was found. You might need to install a " + "GStreamer RTSP extension plugin for Real media streams.")), + (NULL)); + } else { + GST_ELEMENT_ERROR (src, STREAM, CODEC_NOT_FOUND, + (_("No supported stream was found. You might need to allow " + "more transport protocols or may otherwise be missing " + "the right GStreamer RTSP extension plugin.")), (NULL)); + } + return GST_RTSP_ERROR; + } +cleanup_error: + { + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + return res; + } +} + +static gboolean +gst_rtspsrc_parse_range (GstRTSPSrc * src, const gchar * range, + GstSegment * segment) +{ + gint64 seconds; + GstRTSPTimeRange *therange; + + if (src->range) + gst_rtsp_range_free (src->range); + + if (gst_rtsp_range_parse (range, &therange) == GST_RTSP_OK) { + GST_DEBUG_OBJECT (src, "parsed range %s", range); + src->range = therange; + } else { + GST_DEBUG_OBJECT (src, "failed to parse range %s", range); + src->range = NULL; + gst_segment_init (segment, GST_FORMAT_TIME); + return FALSE; + } + + GST_DEBUG_OBJECT (src, "range: type %d, min %f - type %d, max %f ", + therange->min.type, therange->min.seconds, therange->max.type, + therange->max.seconds); + + if (therange->min.type == GST_RTSP_TIME_NOW) + seconds = 0; + else if (therange->min.type == GST_RTSP_TIME_END) + seconds = 0; + else + seconds = therange->min.seconds * GST_SECOND; + + GST_DEBUG_OBJECT (src, "range: min %" GST_TIME_FORMAT, + GST_TIME_ARGS (seconds)); + + /* we need to start playback without clipping from the position reported by + * the server */ + segment->start = seconds; + segment->last_stop = seconds; + + if (therange->max.type == GST_RTSP_TIME_NOW) + seconds = -1; + else if (therange->max.type == GST_RTSP_TIME_END) + seconds = -1; + else + seconds = therange->max.seconds * GST_SECOND; + + GST_DEBUG_OBJECT (src, "range: max %" GST_TIME_FORMAT, + GST_TIME_ARGS (seconds)); + + /* live (WMS) server might send overflowed large max as its idea of infinity, + * compensate to prevent problems later on */ + if (seconds != -1 && seconds < 0) { + seconds = -1; + GST_DEBUG_OBJECT (src, "insane range, set to NONE"); + } + + /* live (WMS) might send min == max, which is not worth recording */ + if (segment->duration == -1 && seconds == segment->start) + seconds = -1; + + /* don't change duration with unknown value, we might have a valid value + * there that we want to keep. */ + if (seconds != -1) + gst_segment_set_duration (segment, GST_FORMAT_TIME, seconds); + + return TRUE; +} + +/* must be called with the RTSP state lock */ +static GstRTSPResult +gst_rtspsrc_open_from_sdp (GstRTSPSrc * src, GstSDPMessage * sdp, + gboolean async) +{ + GstRTSPResult res; + gint i, n_streams; + + /* prepare global stream caps properties */ + if (src->props) + gst_structure_remove_all_fields (src->props); + else + src->props = gst_structure_empty_new ("RTSPProperties"); + + if (src->debug) + gst_sdp_message_dump (sdp); + + gst_rtsp_ext_list_parse_sdp (src->extensions, sdp, src->props); + + gst_segment_init (&src->segment, GST_FORMAT_TIME); + + /* parse range for duration reporting. */ + { + const gchar *range; + + for (i = 0;; i++) { + range = gst_sdp_message_get_attribute_val_n (sdp, "range", i); + if (range == NULL) + break; + + /* keep track of the range and configure it in the segment */ + if (gst_rtspsrc_parse_range (src, range, &src->segment)) + break; + } + } + /* try to find a global control attribute. Note that a '*' means that we should + * do aggregate control with the current url (so we don't do anything and + * leave the current connection as is) */ + { + const gchar *control; + + for (i = 0;; i++) { + control = gst_sdp_message_get_attribute_val_n (sdp, "control", i); + if (control == NULL) + break; + + /* only take fully qualified urls */ + if (g_str_has_prefix (control, "rtsp://")) + break; + } + if (control) { + g_free (src->conninfo.location); + src->conninfo.location = g_strdup (control); + /* make a connection for this, if there was a connection already, nothing + * happens. */ + if (gst_rtsp_conninfo_connect (src, &src->conninfo, async) < 0) { + GST_ERROR_OBJECT (src, "could not connect"); + } + } + /* we need to keep the control url separate from the connection url because + * the rules for constructing the media control url need it */ + g_free (src->control); + src->control = g_strdup (control); + } + + /* create streams */ + n_streams = gst_sdp_message_medias_len (sdp); + for (i = 0; i < n_streams; i++) { + gst_rtspsrc_create_stream (src, sdp, i); + } + + src->state = GST_RTSP_STATE_INIT; + + /* setup streams */ + if ((res = gst_rtspsrc_setup_streams (src, async)) < 0) + goto setup_failed; + + /* reset our state */ + src->need_range = TRUE; + src->skip = FALSE; + + src->state = GST_RTSP_STATE_READY; + + return res; + + /* ERRORS */ +setup_failed: + { + GST_ERROR_OBJECT (src, "setup failed"); + return res; + } +} + +static GstRTSPResult +gst_rtspsrc_retrieve_sdp (GstRTSPSrc * src, GstSDPMessage ** sdp, + gboolean async) +{ + GstRTSPResult res; + GstRTSPMessage request = { 0 }; + GstRTSPMessage response = { 0 }; + guint8 *data; + guint size; + gchar *respcont = NULL; + +restart: + src->need_redirect = FALSE; + + /* can't continue without a valid url */ + if (G_UNLIKELY (src->conninfo.url == NULL)) { + res = GST_RTSP_EINVAL; + goto no_url; + } + src->tried_url_auth = FALSE; + + if ((res = gst_rtsp_conninfo_connect (src, &src->conninfo, async)) < 0) + goto connect_failed; + + /* create OPTIONS */ + GST_DEBUG_OBJECT (src, "create options..."); + res = + gst_rtsp_message_init_request (&request, GST_RTSP_OPTIONS, + src->conninfo.url_str); + if (res < 0) + goto create_request_failed; + + /* send OPTIONS */ + GST_DEBUG_OBJECT (src, "send options..."); + + if (async) + GST_ELEMENT_PROGRESS (src, CONTINUE, "open", ("Retrieving server options")); + + if ((res = + gst_rtspsrc_send (src, src->conninfo.connection, &request, &response, + NULL)) < 0) + goto send_error; + + /* parse OPTIONS */ + if (!gst_rtspsrc_parse_methods (src, &response)) + goto methods_error; + + /* create DESCRIBE */ + GST_DEBUG_OBJECT (src, "create describe..."); + res = + gst_rtsp_message_init_request (&request, GST_RTSP_DESCRIBE, + src->conninfo.url_str); + if (res < 0) + goto create_request_failed; + + /* we only accept SDP for now */ + gst_rtsp_message_add_header (&request, GST_RTSP_HDR_ACCEPT, + "application/sdp"); + + /* send DESCRIBE */ + GST_DEBUG_OBJECT (src, "send describe..."); + + if (async) + GST_ELEMENT_PROGRESS (src, CONTINUE, "open", ("Retrieving media info")); + + if ((res = + gst_rtspsrc_send (src, src->conninfo.connection, &request, &response, + NULL)) < 0) + goto send_error; + + /* we only perform redirect for the describe, currently */ + if (src->need_redirect) { + /* close connection, we don't have to send a TEARDOWN yet, ignore the + * result. */ + gst_rtsp_conninfo_close (src, &src->conninfo, TRUE); + + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + + /* and now retry */ + goto restart; + } + + /* it could be that the DESCRIBE method was not implemented */ + if (!src->methods & GST_RTSP_DESCRIBE) + goto no_describe; + + /* check if reply is SDP */ + gst_rtsp_message_get_header (&response, GST_RTSP_HDR_CONTENT_TYPE, &respcont, + 0); + /* could not be set but since the request returned OK, we assume it + * was SDP, else check it. */ + if (respcont) { + if (!g_ascii_strcasecmp (respcont, "application/sdp") == 0) + goto wrong_content_type; + } + + /* get message body and parse as SDP */ + gst_rtsp_message_get_body (&response, &data, &size); + if (data == NULL || size == 0) + goto no_describe; + + GST_DEBUG_OBJECT (src, "parse SDP..."); + gst_sdp_message_new (sdp); + gst_sdp_message_parse_buffer (data, size, *sdp); + + /* clean up any messages */ + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + + return res; + + /* ERRORS */ +no_url: + { + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), + ("No valid RTSP URL was provided")); + goto cleanup_error; + } +connect_failed: + { + gchar *str = gst_rtsp_strresult (res); + + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), + ("Failed to connect. (%s)", str)); + } else { + GST_WARNING_OBJECT (src, "connect interrupted"); + } + g_free (str); + goto cleanup_error; + } +create_request_failed: + { + gchar *str = gst_rtsp_strresult (res); + + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Could not create request. (%s)", str)); + g_free (str); + goto cleanup_error; + } +send_error: + { + /* Don't post a message - the rtsp_send method will have + * taken care of it because we passed NULL for the response code */ + goto cleanup_error; + } +methods_error: + { + /* error was posted */ + res = GST_RTSP_ERROR; + goto cleanup_error; + } +wrong_content_type: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Server does not support SDP, got %s.", respcont)); + res = GST_RTSP_ERROR; + goto cleanup_error; + } +no_describe: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("Server can not provide an SDP.")); + res = GST_RTSP_ERROR; + goto cleanup_error; + } +cleanup_error: + { + if (src->conninfo.connection) { + GST_DEBUG_OBJECT (src, "free connection"); + gst_rtsp_conninfo_close (src, &src->conninfo, TRUE); + } + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + return res; + } +} + +static GstRTSPResult +gst_rtspsrc_open (GstRTSPSrc * src, gboolean async) +{ + GstRTSPResult ret; + + src->methods = + GST_RTSP_SETUP | GST_RTSP_PLAY | GST_RTSP_PAUSE | GST_RTSP_TEARDOWN; + + if (src->sdp == NULL) { + if ((ret = gst_rtspsrc_retrieve_sdp (src, &src->sdp, async)) < 0) + goto no_sdp; + } + + if ((ret = gst_rtspsrc_open_from_sdp (src, src->sdp, async)) < 0) + goto open_failed; + +done: + if (async) + gst_rtspsrc_loop_end_cmd (src, CMD_OPEN, ret); + + return ret; + + /* ERRORS */ +no_sdp: + { + GST_WARNING_OBJECT (src, "can't get sdp"); + src->open_error = TRUE; + goto done; + } +open_failed: + { + GST_WARNING_OBJECT (src, "can't setup streaming from sdp"); + src->open_error = TRUE; + goto done; + } +} + +static GstRTSPResult +gst_rtspsrc_close (GstRTSPSrc * src, gboolean async, gboolean only_close) +{ + GstRTSPMessage request = { 0 }; + GstRTSPMessage response = { 0 }; + GstRTSPResult res = GST_RTSP_OK; + GList *walk; + gchar *control; + + GST_DEBUG_OBJECT (src, "TEARDOWN..."); + + if (src->state < GST_RTSP_STATE_READY) { + GST_DEBUG_OBJECT (src, "not ready, doing cleanup"); + goto close; + } + + if (only_close) + goto close; + + /* construct a control url */ + if (src->control) + control = src->control; + else + control = src->conninfo.url_str; + + if (!(src->methods & (GST_RTSP_PLAY | GST_RTSP_TEARDOWN))) + goto not_supported; + + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + gchar *setup_url; + GstRTSPConnInfo *info; + + /* try aggregate control first but do non-aggregate control otherwise */ + if (control) + setup_url = control; + else if ((setup_url = stream->conninfo.location) == NULL) + continue; + + if (src->conninfo.connection) { + info = &src->conninfo; + } else if (stream->conninfo.connection) { + info = &stream->conninfo; + } else { + continue; + } + if (!info->connected) + goto next; + + /* do TEARDOWN */ + res = + gst_rtsp_message_init_request (&request, GST_RTSP_TEARDOWN, setup_url); + if (res < 0) + goto create_request_failed; + + if (async) + GST_ELEMENT_PROGRESS (src, CONTINUE, "close", ("Closing stream")); + + if ((res = + gst_rtspsrc_send (src, info->connection, &request, &response, + NULL)) < 0) + goto send_error; + + /* FIXME, parse result? */ + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + + next: + /* early exit when we did aggregate control */ + if (control) + break; + } + +close: + /* close connections */ + GST_DEBUG_OBJECT (src, "closing connection..."); + gst_rtsp_conninfo_close (src, &src->conninfo, TRUE); + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + gst_rtsp_conninfo_close (src, &stream->conninfo, TRUE); + } + + /* cleanup */ + gst_rtspsrc_cleanup (src); + + src->state = GST_RTSP_STATE_INVALID; + + if (async) + gst_rtspsrc_loop_end_cmd (src, CMD_CLOSE, res); + + return res; + + /* ERRORS */ +create_request_failed: + { + gchar *str = gst_rtsp_strresult (res); + + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Could not create request. (%s)", str)); + g_free (str); + goto close; + } +send_error: + { + gchar *str = gst_rtsp_strresult (res); + + gst_rtsp_message_unset (&request); + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), + ("Could not send message. (%s)", str)); + } else { + GST_WARNING_OBJECT (src, "TEARDOWN interrupted"); + } + g_free (str); + goto close; + } +not_supported: + { + GST_DEBUG_OBJECT (src, + "TEARDOWN and PLAY not supported, can't do TEARDOWN"); + goto close; + } +} + +/* RTP-Info is of the format: + * + * url=;[seq=;rtptime=] [, url=...] + * + * rtptime corresponds to the timestamp for the NPT time given in the header + * seqbase corresponds to the next sequence number we received. This number + * indicates the first seqnum after the seek and should be used to discard + * packets that are from before the seek. + */ +static gboolean +gst_rtspsrc_parse_rtpinfo (GstRTSPSrc * src, gchar * rtpinfo) +{ + gchar **infos; + gint i, j; + + GST_DEBUG_OBJECT (src, "parsing RTP-Info %s", rtpinfo); + + infos = g_strsplit (rtpinfo, ",", 0); + for (i = 0; infos[i]; i++) { + gchar **fields; + GstRTSPStream *stream; + gint32 seqbase; + gint64 timebase; + + GST_DEBUG_OBJECT (src, "parsing info %s", infos[i]); + + /* init values, types of seqbase and timebase are bigger than needed so we + * can store -1 as uninitialized values */ + stream = NULL; + seqbase = -1; + timebase = -1; + + /* parse url, find stream for url. + * parse seq and rtptime. The seq number should be configured in the rtp + * depayloader or session manager to detect gaps. Same for the rtptime, it + * should be used to create an initial time newsegment. */ + fields = g_strsplit (infos[i], ";", 0); + for (j = 0; fields[j]; j++) { + GST_DEBUG_OBJECT (src, "parsing field %s", fields[j]); + /* remove leading whitespace */ + fields[j] = g_strchug (fields[j]); + if (g_str_has_prefix (fields[j], "url=")) { + /* get the url and the stream */ + stream = + find_stream (src, (fields[j] + 4), (gpointer) find_stream_by_setup); + } else if (g_str_has_prefix (fields[j], "seq=")) { + seqbase = atoi (fields[j] + 4); + } else if (g_str_has_prefix (fields[j], "rtptime=")) { + timebase = g_ascii_strtoll (fields[j] + 8, NULL, 10); + } + } + g_strfreev (fields); + /* now we need to store the values for the caps of the stream */ + if (stream != NULL) { + GST_DEBUG_OBJECT (src, + "found stream %p, setting: seqbase %d, timebase %" G_GINT64_FORMAT, + stream, seqbase, timebase); + + /* we have a stream, configure detected params */ + stream->seqbase = seqbase; + stream->timebase = timebase; + } + } + g_strfreev (infos); + + return TRUE; +} + +static void +gst_rtspsrc_handle_rtcp_interval (GstRTSPSrc * src, gchar * rtcp) +{ + guint64 interval; + GList *walk; + + interval = strtoul (rtcp, NULL, 10); + GST_DEBUG_OBJECT (src, "rtcp interval: %" G_GUINT64_FORMAT " ms", interval); + + if (!interval) + return; + + interval *= GST_MSECOND; + + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + + /* already (optionally) retrieved this when configuring manager */ + if (stream->session) { + GObject *rtpsession = stream->session; + + GST_DEBUG_OBJECT (src, "configure rtcp interval in session %p", + rtpsession); + g_object_set (rtpsession, "rtcp-min-interval", interval, NULL); + } + } + + /* now it happens that (Xenon) server sending this may also provide bogus + * RTCP SR sync data (i.e. with quite some jitter), so never mind those + * and just use RTP-Info to sync */ + if (src->manager) { + GObjectClass *klass; + + klass = G_OBJECT_GET_CLASS (G_OBJECT (src->manager)); + if (g_object_class_find_property (klass, "rtcp-sync")) { + GST_DEBUG_OBJECT (src, "configuring rtp sync method"); + g_object_set (src->manager, "rtcp-sync", RTCP_SYNC_RTP, NULL); + } + } +} + +static gdouble +gst_rtspsrc_get_float (const gchar * dstr) +{ + gchar s[G_ASCII_DTOSTR_BUF_SIZE] = { 0, }; + + /* canonicalise floating point string so we can handle float strings + * in the form "24.930" or "24,930" irrespective of the current locale */ + g_strlcpy (s, dstr, sizeof (s)); + g_strdelimit (s, ",", '.'); + return g_ascii_strtod (s, NULL); +} + +static gchar * +gen_range_header (GstRTSPSrc * src, GstSegment * segment) +{ + gchar val_str[G_ASCII_DTOSTR_BUF_SIZE] = { 0, }; + + if (src->range && src->range->min.type == GST_RTSP_TIME_NOW) { + g_strlcpy (val_str, "now", sizeof (val_str)); + } else { + if (segment->last_stop == 0) { + g_strlcpy (val_str, "0", sizeof (val_str)); + } else { + g_ascii_dtostr (val_str, sizeof (val_str), + ((gdouble) segment->last_stop) / GST_SECOND); + } + } + return g_strdup_printf ("npt=%s-", val_str); +} + +static void +clear_rtp_base (GstRTSPSrc * src, GstRTSPStream * stream) +{ + stream->timebase = -1; + stream->seqbase = -1; + if (stream->caps) { + GstStructure *s; + + stream->caps = gst_caps_make_writable (stream->caps); + s = gst_caps_get_structure (stream->caps, 0); + gst_structure_remove_fields (s, "clock-base", "seqnum-base", NULL); + } +} + +static GstRTSPResult +gst_rtspsrc_ensure_open (GstRTSPSrc * src, gboolean async) +{ + GstRTSPResult res = GST_RTSP_OK; + + if (src->state < GST_RTSP_STATE_READY) { + res = GST_RTSP_ERROR; + if (src->open_error) { + GST_DEBUG_OBJECT (src, "the stream was in error"); + goto done; + } + if (async) + gst_rtspsrc_loop_start_cmd (src, CMD_OPEN); + + if ((res = gst_rtspsrc_open (src, async)) < 0) { + GST_DEBUG_OBJECT (src, "failed to open stream"); + goto done; + } + } + +done: + return res; +} + +static GstRTSPResult +gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async) +{ + GstRTSPMessage request = { 0 }; + GstRTSPMessage response = { 0 }; + GstRTSPResult res = GST_RTSP_OK; + GList *walk; + gchar *hval; + gint hval_idx; + gchar *control; + + GST_DEBUG_OBJECT (src, "PLAY..."); + + if ((res = gst_rtspsrc_ensure_open (src, async)) < 0) + goto open_failed; + + if (!(src->methods & GST_RTSP_PLAY)) + goto not_supported; + +#ifdef GST_EXT_RTSPSRC_MODIFICATION + if (src->state == GST_RTSP_STATE_PLAYING) { + if(src->wait_pause_response == FALSE) + goto was_playing; + } +#else + if (src->state == GST_RTSP_STATE_PLAYING) + goto was_playing; +#endif + + if (!src->conninfo.connection || !src->conninfo.connected) + goto done; + + /* send some dummy packets before we activate the receive in the + * udp sources */ + gst_rtspsrc_send_dummy_packets (src); + + /* activate receive elements; + * only in async case, since receive elements may not have been affected + * by overall state change (e.g. not around yet), + * do not mess with state in sync case (e.g. seeking) */ + if (async) + gst_element_set_state (GST_ELEMENT_CAST (src), GST_STATE_PLAYING); + + /* construct a control url */ + if (src->control) + control = src->control; + else + control = src->conninfo.url_str; + + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + gchar *setup_url; + GstRTSPConnection *conn; + + /* try aggregate control first but do non-aggregate control otherwise */ + if (control) + setup_url = control; + else if ((setup_url = stream->conninfo.location) == NULL) + continue; + + if (src->conninfo.connection) { + conn = src->conninfo.connection; + } else if (stream->conninfo.connection) { + conn = stream->conninfo.connection; + } else { + continue; + } + + /* do play */ + res = gst_rtsp_message_init_request (&request, GST_RTSP_PLAY, setup_url); + if (res < 0) + goto create_request_failed; + + if (src->need_range) { + hval = gen_range_header (src, segment); + + gst_rtsp_message_add_header (&request, GST_RTSP_HDR_RANGE, hval); + g_free (hval); + } + + if (segment->rate != 1.0) { + gchar hval[G_ASCII_DTOSTR_BUF_SIZE]; + + g_ascii_dtostr (hval, sizeof (hval), segment->rate); + if (src->skip) + gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SCALE, hval); + else + gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SPEED, hval); + } + + if (async) + GST_ELEMENT_PROGRESS (src, CONTINUE, "request", ("Sending PLAY request")); + + if ((res = gst_rtspsrc_send (src, conn, &request, &response, NULL)) < 0) + goto send_error; + + /* seek may have silently failed as it is not supported */ + if (!(src->methods & GST_RTSP_PLAY)) { + GST_DEBUG_OBJECT (src, "PLAY Range not supported; re-enable PLAY"); + /* obviously it is supported as we made it here */ + src->methods |= GST_RTSP_PLAY; + src->seekable = FALSE; + /* but there is nothing to parse in the response, + * so convey we have no idea and not to expect anything particular */ + clear_rtp_base (src, stream); + if (control) { + GList *run; + + /* need to do for all streams */ + for (run = src->streams; run; run = g_list_next (run)) + clear_rtp_base (src, (GstRTSPStream *) run->data); + } + /* NOTE the above also disables npt based eos detection */ + /* and below forces position to 0, + * which is visible feedback we lost the plot */ + segment->start = segment->last_stop = src->last_pos; + } + + gst_rtsp_message_unset (&request); + + /* parse RTP npt field. This is the current position in the stream (Normal + * Play Time) and should be put in the NEWSEGMENT position field. */ + if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_RANGE, &hval, + 0) == GST_RTSP_OK) + gst_rtspsrc_parse_range (src, hval, segment); + + /* assume 1.0 rate now, overwrite when the SCALE or SPEED headers are present. */ + segment->rate = 1.0; + + /* parse Speed header. This is the intended playback rate of the stream + * and should be put in the NEWSEGMENT rate field. */ + if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_SPEED, &hval, + 0) == GST_RTSP_OK) { + segment->rate = gst_rtspsrc_get_float (hval); + } else if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_SCALE, + &hval, 0) == GST_RTSP_OK) { + segment->rate = gst_rtspsrc_get_float (hval); + } + + /* parse the RTP-Info header field (if ANY) to get the base seqnum and timestamp + * for the RTP packets. If this is not present, we assume all starts from 0... + * This is info for the RTP session manager that we pass to it in caps. */ + hval_idx = 0; + while (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_RTP_INFO, + &hval, hval_idx++) == GST_RTSP_OK) + gst_rtspsrc_parse_rtpinfo (src, hval); + + /* some servers indicate RTCP parameters in PLAY response, + * rather than properly in SDP */ + if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_RTCP_INTERVAL, + &hval, 0) == GST_RTSP_OK) + gst_rtspsrc_handle_rtcp_interval (src, hval); + + gst_rtsp_message_unset (&response); + + /* early exit when we did aggregate control */ + if (control) + break; + } + /* set again when needed */ + src->need_range = FALSE; + + /* configure the caps of the streams after we parsed all headers. */ + gst_rtspsrc_configure_caps (src, segment); + + src->running = TRUE; + src->base_time = -1; + src->state = GST_RTSP_STATE_PLAYING; + + /* mark discont */ + GST_DEBUG_OBJECT (src, "mark DISCONT, we did a seek to another position"); + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + stream->discont = TRUE; + } + +done: + if (async) + gst_rtspsrc_loop_end_cmd (src, CMD_PLAY, res); + + return res; + + /* ERRORS */ +open_failed: + { + GST_DEBUG_OBJECT (src, "failed to open stream"); + goto done; + } +not_supported: + { + GST_DEBUG_OBJECT (src, "PLAY is not supported"); + goto done; + } +was_playing: + { + GST_DEBUG_OBJECT (src, "we were already PLAYING"); + goto done; + } +create_request_failed: + { + gchar *str = gst_rtsp_strresult (res); + + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Could not create request. (%s)", str)); + g_free (str); + goto done; + } +send_error: + { + gchar *str = gst_rtsp_strresult (res); + + gst_rtsp_message_unset (&request); + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), + ("Could not send message. (%s)", str)); + } else { + GST_WARNING_OBJECT (src, "PLAY interrupted"); + } + g_free (str); + goto done; + } +} + +static GstRTSPResult +gst_rtspsrc_pause (GstRTSPSrc * src, gboolean idle, gboolean async) +{ + GstRTSPResult res = GST_RTSP_OK; + GstRTSPMessage request = { 0 }; + GstRTSPMessage response = { 0 }; + GList *walk; + gchar *control; + + GST_DEBUG_OBJECT (src, "PAUSE..."); + + if ((res = gst_rtspsrc_ensure_open (src, async)) < 0) + goto open_failed; + + if (!(src->methods & GST_RTSP_PAUSE)) + goto not_supported; + + if (src->state == GST_RTSP_STATE_READY) + goto was_paused; + + if (!src->conninfo.connection || !src->conninfo.connected) + goto no_connection; + + /* construct a control url */ + if (src->control) + control = src->control; + else + control = src->conninfo.url_str; + + /* loop over the streams. We might exit the loop early when we could do an + * aggregate control */ + for (walk = src->streams; walk; walk = g_list_next (walk)) { + GstRTSPStream *stream = (GstRTSPStream *) walk->data; + GstRTSPConnection *conn; + gchar *setup_url; + + /* try aggregate control first but do non-aggregate control otherwise */ + if (control) + setup_url = control; + else if ((setup_url = stream->conninfo.location) == NULL) + continue; + + if (src->conninfo.connection) { + conn = src->conninfo.connection; + } else if (stream->conninfo.connection) { + conn = stream->conninfo.connection; + } else { + continue; + } + + if (async) + GST_ELEMENT_PROGRESS (src, CONTINUE, "request", + ("Sending PAUSE request")); + + if ((res = + gst_rtsp_message_init_request (&request, GST_RTSP_PAUSE, + setup_url)) < 0) + goto create_request_failed; + + if ((res = gst_rtspsrc_send (src, conn, &request, &response, NULL)) < 0) + goto send_error; + + gst_rtsp_message_unset (&request); + gst_rtsp_message_unset (&response); + + /* exit early when we did agregate control */ + if (control) + break; + } + +no_connection: + src->state = GST_RTSP_STATE_READY; + +done: + if (async) + gst_rtspsrc_loop_end_cmd (src, CMD_PAUSE, res); + + return res; + + /* ERRORS */ +open_failed: + { + GST_DEBUG_OBJECT (src, "failed to open stream"); + goto done; + } +not_supported: + { + GST_DEBUG_OBJECT (src, "PAUSE is not supported"); + goto done; + } +was_paused: + { + GST_DEBUG_OBJECT (src, "we were already PAUSED"); + goto done; + } +create_request_failed: + { + gchar *str = gst_rtsp_strresult (res); + + GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), + ("Could not create request. (%s)", str)); + g_free (str); + goto done; + } +send_error: + { + gchar *str = gst_rtsp_strresult (res); + + gst_rtsp_message_unset (&request); + if (res != GST_RTSP_EINTR) { + GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), + ("Could not send message. (%s)", str)); + } else { + GST_WARNING_OBJECT (src, "PAUSE interrupted"); + } + g_free (str); + goto done; + } +} + +static void +gst_rtspsrc_handle_message (GstBin * bin, GstMessage * message) +{ + GstRTSPSrc *rtspsrc; + + rtspsrc = GST_RTSPSRC (bin); + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_EOS: + gst_message_unref (message); + break; + case GST_MESSAGE_ELEMENT: + { + const GstStructure *s = gst_message_get_structure (message); + + if (gst_structure_has_name (s, "GstUDPSrcTimeout")) { + gboolean ignore_timeout; + + GST_DEBUG_OBJECT (bin, "timeout on UDP port"); + + GST_OBJECT_LOCK (rtspsrc); + ignore_timeout = rtspsrc->ignore_timeout; + rtspsrc->ignore_timeout = TRUE; + GST_OBJECT_UNLOCK (rtspsrc); + + /* we only act on the first udp timeout message, others are irrelevant + * and can be ignored. */ + if (!ignore_timeout) + gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_RECONNECT, TRUE); + /* eat and free */ + gst_message_unref (message); + return; + } + GST_BIN_CLASS (parent_class)->handle_message (bin, message); + break; + } + case GST_MESSAGE_ERROR: + { + GstObject *udpsrc; + GstRTSPStream *stream; + GstFlowReturn ret; + + udpsrc = GST_MESSAGE_SRC (message); + + GST_DEBUG_OBJECT (rtspsrc, "got error from %s", + GST_ELEMENT_NAME (udpsrc)); + + stream = find_stream (rtspsrc, udpsrc, (gpointer) find_stream_by_udpsrc); + if (!stream) + goto forward; + + /* we ignore the RTCP udpsrc */ + if (stream->udpsrc[1] == GST_ELEMENT_CAST (udpsrc)) + goto done; + + /* if we get error messages from the udp sources, that's not a problem as + * long as not all of them error out. We also don't really know what the + * problem is, the message does not give enough detail... */ + ret = gst_rtspsrc_combine_flows (rtspsrc, stream, GST_FLOW_NOT_LINKED); + GST_DEBUG_OBJECT (rtspsrc, "combined flows: %s", gst_flow_get_name (ret)); + if (ret != GST_FLOW_OK) + goto forward; + + done: + gst_message_unref (message); + break; + + forward: + /* fatal but not our message, forward */ + GST_BIN_CLASS (parent_class)->handle_message (bin, message); + break; + } + default: + { + GST_BIN_CLASS (parent_class)->handle_message (bin, message); + break; + } + } +} + +/* the thread where everything happens */ +static void +gst_rtspsrc_thread (GstRTSPSrc * src) +{ + gint cmd; + GstRTSPResult ret; + gboolean running = FALSE; + + GST_OBJECT_LOCK (src); + cmd = src->loop_cmd; + src->loop_cmd = CMD_WAIT; + GST_DEBUG_OBJECT (src, "got command %d", cmd); + + /* we got the message command, so ensure communication is possible again */ + gst_rtspsrc_connection_flush (src, FALSE); + + /* we allow these to be interrupted */ + if (cmd == CMD_LOOP || cmd == CMD_CLOSE || cmd == CMD_PAUSE) + src->waiting = TRUE; + GST_OBJECT_UNLOCK (src); + + switch (cmd) { + case CMD_OPEN: + ret = gst_rtspsrc_open (src, TRUE); + break; + case CMD_PLAY: + ret = gst_rtspsrc_play (src, &src->segment, TRUE); + if (ret == GST_RTSP_OK) + running = TRUE; + break; + case CMD_PAUSE: + ret = gst_rtspsrc_pause (src, TRUE, TRUE); + if (ret == GST_RTSP_OK) + running = TRUE; + break; + case CMD_CLOSE: + ret = gst_rtspsrc_close (src, TRUE, FALSE); + break; + case CMD_LOOP: + running = gst_rtspsrc_loop (src); + break; + case CMD_RECONNECT: + ret = gst_rtspsrc_reconnect (src, FALSE); + if (ret == GST_RTSP_OK) + running = TRUE; + break; + default: + break; + } + + GST_OBJECT_LOCK (src); + /* and go back to sleep */ + if (src->loop_cmd == CMD_WAIT) { + if (running) + src->loop_cmd = CMD_LOOP; + else if (src->task) + gst_task_pause (src->task); + } + /* reset waiting */ + src->waiting = FALSE; + GST_OBJECT_UNLOCK (src); +} + +static gboolean +gst_rtspsrc_start (GstRTSPSrc * src) +{ + GST_DEBUG_OBJECT (src, "starting"); + + GST_OBJECT_LOCK (src); + + src->loop_cmd = CMD_WAIT; + + if (src->task == NULL) { + src->task = gst_task_create ((GstTaskFunction) gst_rtspsrc_thread, src); + if (src->task == NULL) + goto task_error; + + gst_task_set_lock (src->task, GST_RTSP_STREAM_GET_LOCK (src)); + } + GST_OBJECT_UNLOCK (src); + + return TRUE; + + /* ERRORS */ +task_error: + { + GST_ERROR_OBJECT (src, "failed to create task"); + return FALSE; + } +} + +static gboolean +gst_rtspsrc_stop (GstRTSPSrc * src) +{ + GstTask *task; + + GST_DEBUG_OBJECT (src, "stopping"); + + /* also cancels pending task */ + gst_rtspsrc_loop_send_cmd (src, CMD_WAIT, TRUE); + + GST_OBJECT_LOCK (src); + if ((task = src->task)) { + src->task = NULL; + GST_OBJECT_UNLOCK (src); + + gst_task_stop (task); + + /* make sure it is not running */ + GST_RTSP_STREAM_LOCK (src); + GST_RTSP_STREAM_UNLOCK (src); + + /* now wait for the task to finish */ + gst_task_join (task); + + /* and free the task */ + gst_object_unref (GST_OBJECT (task)); + + GST_OBJECT_LOCK (src); + } + GST_OBJECT_UNLOCK (src); + + /* ensure synchronously all is closed and clean */ + gst_rtspsrc_close (src, FALSE, TRUE); + + return TRUE; +} + +static GstStateChangeReturn +gst_rtspsrc_change_state (GstElement * element, GstStateChange transition) +{ + GstRTSPSrc *rtspsrc; + GstStateChangeReturn ret; + + rtspsrc = GST_RTSPSRC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_rtspsrc_start (rtspsrc)) + goto start_failed; + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + /* init some state */ + rtspsrc->cur_protocols = rtspsrc->protocols; + /* first attempt, don't ignore timeouts */ + rtspsrc->ignore_timeout = FALSE; + rtspsrc->open_error = FALSE; + gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_OPEN, FALSE); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + /* unblock the tcp tasks and make the loop waiting */ + gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_WAIT, TRUE); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + goto done; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_PLAY, FALSE); + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + /* send pause request and keep the idle task around */ + gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_PAUSE, FALSE); + ret = GST_STATE_CHANGE_NO_PREROLL; + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + ret = GST_STATE_CHANGE_NO_PREROLL; + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_CLOSE, FALSE); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + gst_rtspsrc_stop (rtspsrc); + break; + default: + break; + } + +done: + return ret; + +start_failed: + { + GST_DEBUG_OBJECT (rtspsrc, "start failed"); + return GST_STATE_CHANGE_FAILURE; + } +} + +static gboolean +gst_rtspsrc_send_event (GstElement * element, GstEvent * event) +{ + gboolean res; + GstRTSPSrc *rtspsrc; + + rtspsrc = GST_RTSPSRC (element); + + if (GST_EVENT_IS_DOWNSTREAM (event)) { + res = gst_rtspsrc_push_event (rtspsrc, event, TRUE); + } else { + res = GST_ELEMENT_CLASS (parent_class)->send_event (element, event); + } + + return res; +} + + +/*** GSTURIHANDLER INTERFACE *************************************************/ + +static GstURIType +gst_rtspsrc_uri_get_type (void) +{ + return GST_URI_SRC; +} + +static gchar ** +gst_rtspsrc_uri_get_protocols (void) +{ + static const gchar *protocols[] = + { "rtsp", "rtspu", "rtspt", "rtsph", "rtsp-sdp", NULL }; + + return (gchar **) protocols; +} + +static const gchar * +gst_rtspsrc_uri_get_uri (GstURIHandler * handler) +{ + GstRTSPSrc *src = GST_RTSPSRC (handler); + + /* should not dup */ + return src->conninfo.location; +} + +static gboolean +gst_rtspsrc_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + GstRTSPSrc *src; + GstRTSPResult res; + GstRTSPUrl *newurl = NULL; + GstSDPMessage *sdp = NULL; + + src = GST_RTSPSRC (handler); + + /* same URI, we're fine */ + if (src->conninfo.location && uri && !strcmp (uri, src->conninfo.location)) + goto was_ok; + + if (g_str_has_prefix (uri, "rtsp-sdp://")) { + if ((res = gst_sdp_message_new (&sdp) < 0)) + goto sdp_failed; + + GST_DEBUG_OBJECT (src, "parsing SDP message"); + if ((res = gst_sdp_message_parse_uri (uri, sdp) < 0)) + goto invalid_sdp; + } else { + /* try to parse */ + GST_DEBUG_OBJECT (src, "parsing URI"); + if ((res = gst_rtsp_url_parse (uri, &newurl)) < 0) + goto parse_error; + } + + /* if worked, free previous and store new url object along with the original + * location. */ + GST_DEBUG_OBJECT (src, "configuring URI"); + g_free (src->conninfo.location); + src->conninfo.location = g_strdup (uri); + gst_rtsp_url_free (src->conninfo.url); + src->conninfo.url = newurl; + g_free (src->conninfo.url_str); + if (newurl) + src->conninfo.url_str = gst_rtsp_url_get_request_uri (src->conninfo.url); + else + src->conninfo.url_str = NULL; + + if (src->sdp) + gst_sdp_message_free (src->sdp); + src->sdp = sdp; + src->from_sdp = sdp != NULL; + + GST_DEBUG_OBJECT (src, "set uri: %s", GST_STR_NULL (uri)); + GST_DEBUG_OBJECT (src, "request uri is: %s", + GST_STR_NULL (src->conninfo.url_str)); + + return TRUE; + + /* Special cases */ +was_ok: + { + GST_DEBUG_OBJECT (src, "URI was ok: '%s'", GST_STR_NULL (uri)); + return TRUE; + } +sdp_failed: + { + GST_ERROR_OBJECT (src, "Could not create new SDP (%d)", res); + return FALSE; + } +invalid_sdp: + { + GST_ERROR_OBJECT (src, "Not a valid SDP (%d) '%s'", res, + GST_STR_NULL (uri)); + gst_sdp_message_free (sdp); + return FALSE; + } +parse_error: + { + GST_ERROR_OBJECT (src, "Not a valid RTSP url '%s' (%d)", + GST_STR_NULL (uri), res); + return FALSE; + } +} + +static void +gst_rtspsrc_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_rtspsrc_uri_get_type; + iface->get_protocols = gst_rtspsrc_uri_get_protocols; + iface->get_uri = gst_rtspsrc_uri_get_uri; + iface->set_uri = gst_rtspsrc_uri_set_uri; +} diff --git a/gst/rtsp/gstrtspsrc.h b/gst/rtsp/gstrtspsrc.h new file mode 100644 index 0000000..c4f4a73 --- /dev/null +++ b/gst/rtsp/gstrtspsrc.h @@ -0,0 +1,260 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * <2006> Wim Taymans + * + * 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. + */ +/* + * Unless otherwise indicated, Source Code is licensed under MIT license. + * See further explanation attached in License Statement (distributed in the file + * LICENSE). + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_RTSPSRC_H__ +#define __GST_RTSPSRC_H__ + +#include + +G_BEGIN_DECLS + +#include +#include +#include +#include + +#include "gstrtspext.h" + +#define GST_TYPE_RTSPSRC \ + (gst_rtspsrc_get_type()) +#define GST_RTSPSRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTSPSRC,GstRTSPSrc)) +#define GST_RTSPSRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTSPSRC,GstRTSPSrcClass)) +#define GST_IS_RTSPSRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTSPSRC)) +#define GST_IS_RTSPSRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTSPSRC)) +#define GST_RTSPSRC_CAST(obj) \ + ((GstRTSPSrc *)(obj)) + +typedef struct _GstRTSPSrc GstRTSPSrc; +typedef struct _GstRTSPSrcClass GstRTSPSrcClass; + +#define GST_RTSP_STATE_GET_LOCK(rtsp) (GST_RTSPSRC_CAST(rtsp)->state_rec_lock) +#define GST_RTSP_STATE_LOCK(rtsp) (g_static_rec_mutex_lock (GST_RTSP_STATE_GET_LOCK(rtsp))) +#define GST_RTSP_STATE_UNLOCK(rtsp) (g_static_rec_mutex_unlock (GST_RTSP_STATE_GET_LOCK(rtsp))) + +#define GST_RTSP_STREAM_GET_LOCK(rtsp) (GST_RTSPSRC_CAST(rtsp)->stream_rec_lock) +#define GST_RTSP_STREAM_LOCK(rtsp) (g_static_rec_mutex_lock (GST_RTSP_STREAM_GET_LOCK(rtsp))) +#define GST_RTSP_STREAM_UNLOCK(rtsp) (g_static_rec_mutex_unlock (GST_RTSP_STREAM_GET_LOCK(rtsp))) + +typedef struct _GstRTSPConnInfo GstRTSPConnInfo; + +struct _GstRTSPConnInfo { + gchar *location; + GstRTSPUrl *url; + gchar *url_str; + GstRTSPConnection *connection; + gboolean connected; +}; + +typedef struct _GstRTSPStream GstRTSPStream; + +struct _GstRTSPStream { + gint id; + + GstRTSPSrc *parent; /* parent, no extra ref to parent is taken */ + + /* pad we expose or NULL when it does not have an actual pad */ + GstPad *srcpad; + GstFlowReturn last_ret; + gboolean added; + gboolean disabled; + gboolean eos; + gboolean discont; + + /* for interleaved mode */ + guint8 channel[2]; + GstCaps *caps; + GstPad *channelpad[2]; + + /* our udp sources */ + GstElement *udpsrc[2]; + GstPad *blockedpad; + gboolean is_ipv6; + + /* our udp sinks back to the server */ + GstElement *udpsink[2]; + GstPad *rtcppad; + + /* fakesrc for sending dummy data */ + GstElement *fakesrc; + + /* state */ + gint pt; + guint port; + gboolean container; + /* original control url */ + gchar *control_url; + guint32 ssrc; + guint32 seqbase; + guint64 timebase; + + /* per stream connection */ + GstRTSPConnInfo conninfo; + + /* session */ + GObject *session; + + /* bandwidth */ + guint as_bandwidth; + guint rs_bandwidth; + guint rr_bandwidth; + + /* destination */ + gchar *destination; + gboolean is_multicast; + guint ttl; +}; + +/** + * GstRTSPNatMethod: + * @GST_RTSP_NAT_NONE: none + * @GST_RTSP_NAT_DUMMY: send dummy packets + * + * Different methods for trying to traverse firewalls. + */ +typedef enum +{ + GST_RTSP_NAT_NONE, + GST_RTSP_NAT_DUMMY +} GstRTSPNatMethod; + +struct _GstRTSPSrc { + GstBin parent; + + /* task and mutex for interleaved mode */ + gboolean interleaved; + GstTask *task; + GStaticRecMutex *stream_rec_lock; + GstSegment segment; + gboolean running; + gboolean need_range; + gboolean skip; + gint free_channel; + GstEvent *close_segment; + GstEvent *start_segment; + GstClockTime base_time; + + /* UDP mode loop */ + gint loop_cmd; + gboolean ignore_timeout; + gboolean waiting; + gboolean open_error; + + /* mutex for protecting state changes */ + GStaticRecMutex *state_rec_lock; + + GstSDPMessage *sdp; + gboolean from_sdp; + gint numstreams; + GList *streams; + GstStructure *props; + gboolean need_activate; + + /* properties */ + GstRTSPLowerTrans protocols; + gboolean debug; + guint retry; + guint64 udp_timeout; + GTimeVal tcp_timeout; + GTimeVal *ptcp_timeout; + guint latency; + guint connection_speed; + GstRTSPNatMethod nat_method; + gboolean do_rtcp; + gchar *proxy_host; + guint proxy_port; + gchar *proxy_user; + gchar *proxy_passwd; + guint rtp_blocksize; + gchar *user_id; + gchar *user_pw; + gint buffer_mode; + GstRTSPRange client_port_range; + gint udp_buffer_size; + gboolean short_header; + + /* state */ + GstRTSPState state; + gchar *content_base; + GstRTSPLowerTrans cur_protocols; + gboolean tried_url_auth; + gchar *addr; + gboolean need_redirect; + GstRTSPTimeRange *range; + gchar *control; + guint next_port_num; + +#ifdef GST_EXT_RTSPSRC_MODIFICATION + gboolean wait_pause_response; +#endif + + + /* supported methods */ + gint methods; + + gboolean seekable; + GstClockTime last_pos; + + /* session management */ + GstElement *manager; + gulong manager_sig_id; + gulong manager_ptmap_id; + + GstRTSPConnInfo conninfo; + + /* a list of RTSP extensions as GstElement */ + GstRTSPExtensionList *extensions; +}; + +struct _GstRTSPSrcClass { + GstBinClass parent_class; +}; + +GType gst_rtspsrc_get_type(void); + +G_END_DECLS + +#endif /* __GST_RTSPSRC_H__ */ diff --git a/gst/shapewipe/Makefile.am b/gst/shapewipe/Makefile.am new file mode 100644 index 0000000..35cf5df --- /dev/null +++ b/gst/shapewipe/Makefile.am @@ -0,0 +1,25 @@ +plugin_LTLIBRARIES = libgstshapewipe.la + +libgstshapewipe_la_SOURCES = gstshapewipe.c + +libgstshapewipe_la_CFLAGS = $(GIO_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) +libgstshapewipe_la_LIBADD = $(GIO_LIBS) $(GST_LIBS) $(GST_CONTROLLER_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ +libgstshapewipe_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstshapewipe_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstshapewipe.h + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstshapewhipe -:SHARED libgstshapewhipe \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstshapewhipe_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstshapewhipe_la_CFLAGS) \ + -:LDFLAGS $(libgstshapewhipe_la_LDFLAGS) \ + $(libgstshapewhipe_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/shapewipe/Makefile.in b/gst/shapewipe/Makefile.in new file mode 100644 index 0000000..8de2d57 --- /dev/null +++ b/gst/shapewipe/Makefile.in @@ -0,0 +1,820 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/shapewipe +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstshapewipe_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstshapewipe_la_OBJECTS = libgstshapewipe_la-gstshapewipe.lo +libgstshapewipe_la_OBJECTS = $(am_libgstshapewipe_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstshapewipe_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstshapewipe_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstshapewipe_la_CFLAGS) $(CFLAGS) \ + $(libgstshapewipe_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstshapewipe_la_SOURCES) +DIST_SOURCES = $(libgstshapewipe_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstshapewipe.la +libgstshapewipe_la_SOURCES = gstshapewipe.c +libgstshapewipe_la_CFLAGS = $(GIO_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) +libgstshapewipe_la_LIBADD = $(GIO_LIBS) $(GST_LIBS) $(GST_CONTROLLER_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ +libgstshapewipe_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstshapewipe_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstshapewipe.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/shapewipe/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/shapewipe/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstshapewipe.la: $(libgstshapewipe_la_OBJECTS) $(libgstshapewipe_la_DEPENDENCIES) $(EXTRA_libgstshapewipe_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstshapewipe_la_LINK) -rpath $(plugindir) $(libgstshapewipe_la_OBJECTS) $(libgstshapewipe_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstshapewipe_la-gstshapewipe.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstshapewipe_la-gstshapewipe.lo: gstshapewipe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstshapewipe_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstshapewipe_la_CFLAGS) $(CFLAGS) -MT libgstshapewipe_la-gstshapewipe.lo -MD -MP -MF $(DEPDIR)/libgstshapewipe_la-gstshapewipe.Tpo -c -o libgstshapewipe_la-gstshapewipe.lo `test -f 'gstshapewipe.c' || echo '$(srcdir)/'`gstshapewipe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstshapewipe_la-gstshapewipe.Tpo $(DEPDIR)/libgstshapewipe_la-gstshapewipe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstshapewipe.c' object='libgstshapewipe_la-gstshapewipe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstshapewipe_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstshapewipe_la_CFLAGS) $(CFLAGS) -c -o libgstshapewipe_la-gstshapewipe.lo `test -f 'gstshapewipe.c' || echo '$(srcdir)/'`gstshapewipe.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstshapewhipe -:SHARED libgstshapewhipe \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstshapewhipe_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstshapewhipe_la_CFLAGS) \ + -:LDFLAGS $(libgstshapewhipe_la_LDFLAGS) \ + $(libgstshapewhipe_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/shapewipe/gstshapewipe.c b/gst/shapewipe/gstshapewipe.c new file mode 100644 index 0000000..b8c91b5 --- /dev/null +++ b/gst/shapewipe/gstshapewipe.c @@ -0,0 +1,1162 @@ +/* GStreamer + * Copyright (C) 2009,2010 Sebastian Dröge + * + * 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-shapewipe + * + * The shapewipe element provides custom transitions on video streams + * based on a grayscale bitmap. The state of the transition can be + * controlled by the position property and an optional blended border + * can be added by the border property. + * + * Transition bitmaps can be downloaded from the + * Cinelerra transition + * page. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! shapewipe position=0.5 name=shape ! videomixer name=mixer ! ffmpegcolorspace ! autovideosink filesrc location=mask.png ! typefind ! decodebin2 ! ffmpegcolorspace ! videoscale ! queue ! shape.mask_sink videotestsrc pattern=snow ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! queue ! mixer. + * ]| This pipeline adds the transition from mask.png with position 0.5 to an SMPTE test screen and snow. + * + */ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include +#include +#include + +#include "gstshapewipe.h" + +static void gst_shape_wipe_finalize (GObject * object); +static void gst_shape_wipe_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_shape_wipe_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static void gst_shape_wipe_reset (GstShapeWipe * self); +static void gst_shape_wipe_update_qos (GstShapeWipe * self, gdouble proportion, + GstClockTimeDiff diff, GstClockTime time); +static void gst_shape_wipe_reset_qos (GstShapeWipe * self); +static void gst_shape_wipe_read_qos (GstShapeWipe * self, gdouble * proportion, + GstClockTime * time); + +static GstStateChangeReturn gst_shape_wipe_change_state (GstElement * element, + GstStateChange transition); + +static GstFlowReturn gst_shape_wipe_video_sink_chain (GstPad * pad, + GstBuffer * buffer); +static gboolean gst_shape_wipe_video_sink_event (GstPad * pad, + GstEvent * event); +static gboolean gst_shape_wipe_video_sink_setcaps (GstPad * pad, + GstCaps * caps); +static GstCaps *gst_shape_wipe_video_sink_getcaps (GstPad * pad); +static GstFlowReturn gst_shape_wipe_video_sink_bufferalloc (GstPad * pad, + guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); +static gboolean gst_shape_wipe_video_sink_query (GstPad * pad, + GstQuery * query); +static GstFlowReturn gst_shape_wipe_mask_sink_chain (GstPad * pad, + GstBuffer * buffer); +static gboolean gst_shape_wipe_mask_sink_event (GstPad * pad, GstEvent * event); +static gboolean gst_shape_wipe_mask_sink_setcaps (GstPad * pad, GstCaps * caps); +static GstCaps *gst_shape_wipe_mask_sink_getcaps (GstPad * pad); +static gboolean gst_shape_wipe_src_event (GstPad * pad, GstEvent * event); +static GstCaps *gst_shape_wipe_src_getcaps (GstPad * pad); +static gboolean gst_shape_wipe_src_query (GstPad * pad, GstQuery * query); + +enum +{ + PROP_0, + PROP_POSITION, + PROP_BORDER +}; + +#define DEFAULT_POSITION 0.0 +#define DEFAULT_BORDER 0.0 + +static GstStaticPadTemplate video_sink_pad_template = + GST_STATIC_PAD_TEMPLATE ("video_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") " ; " GST_VIDEO_CAPS_ARGB " ; " + GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA)); + +static GstStaticPadTemplate mask_sink_pad_template = + GST_STATIC_PAD_TEMPLATE ("mask_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-gray, " + "bpp = 8, " + "depth = 8, " + "width = " GST_VIDEO_SIZE_RANGE ", " + "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = 0/1 ; " + "video/x-raw-gray, " "bpp = 16, " "depth = 16, " + "endianness = BYTE_ORDER, " "width = " GST_VIDEO_SIZE_RANGE ", " + "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = 0/1")); + +static GstStaticPadTemplate src_pad_template = + GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") " ; " GST_VIDEO_CAPS_ARGB " ; " + GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA)); + +GST_DEBUG_CATEGORY_STATIC (gst_shape_wipe_debug); +#define GST_CAT_DEFAULT gst_shape_wipe_debug + +GST_BOILERPLATE (GstShapeWipe, gst_shape_wipe, GstElement, GST_TYPE_ELEMENT); + +static void +gst_shape_wipe_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (gstelement_class, + "Shape Wipe transition filter", + "Filter/Editor/Video", + "Adds a shape wipe transition to a video stream", + "Sebastian Dröge "); + + gst_element_class_add_static_pad_template (gstelement_class, + &video_sink_pad_template); + gst_element_class_add_static_pad_template (gstelement_class, + &mask_sink_pad_template); + gst_element_class_add_static_pad_template (gstelement_class, + &src_pad_template); +} + +static void +gst_shape_wipe_class_init (GstShapeWipeClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + gobject_class->finalize = gst_shape_wipe_finalize; + gobject_class->set_property = gst_shape_wipe_set_property; + gobject_class->get_property = gst_shape_wipe_get_property; + + g_object_class_install_property (gobject_class, PROP_POSITION, + g_param_spec_float ("position", "Position", "Position of the mask", + 0.0, 1.0, DEFAULT_POSITION, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (gobject_class, PROP_BORDER, + g_param_spec_float ("border", "Border", "Border of the mask", + 0.0, 1.0, DEFAULT_BORDER, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_shape_wipe_change_state); +} + +static void +gst_shape_wipe_init (GstShapeWipe * self, GstShapeWipeClass * g_class) +{ + self->video_sinkpad = + gst_pad_new_from_static_template (&video_sink_pad_template, "video_sink"); + gst_pad_set_chain_function (self->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_chain)); + gst_pad_set_event_function (self->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_event)); + gst_pad_set_setcaps_function (self->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_setcaps)); + gst_pad_set_getcaps_function (self->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_getcaps)); + gst_pad_set_bufferalloc_function (self->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_bufferalloc)); + gst_pad_set_query_function (self->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_query)); + gst_element_add_pad (GST_ELEMENT (self), self->video_sinkpad); + + self->mask_sinkpad = + gst_pad_new_from_static_template (&mask_sink_pad_template, "mask_sink"); + gst_pad_set_chain_function (self->mask_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_chain)); + gst_pad_set_event_function (self->mask_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_event)); + gst_pad_set_setcaps_function (self->mask_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_setcaps)); + gst_pad_set_getcaps_function (self->mask_sinkpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_getcaps)); + gst_element_add_pad (GST_ELEMENT (self), self->mask_sinkpad); + + self->srcpad = gst_pad_new_from_static_template (&src_pad_template, "src"); + gst_pad_set_event_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_src_event)); + gst_pad_set_getcaps_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_src_getcaps)); + gst_pad_set_query_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_shape_wipe_src_query)); + gst_element_add_pad (GST_ELEMENT (self), self->srcpad); + + self->mask_mutex = g_mutex_new (); + self->mask_cond = g_cond_new (); + + gst_shape_wipe_reset (self); +} + +static void +gst_shape_wipe_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (object); + + switch (prop_id) { + case PROP_POSITION: + g_value_set_float (value, self->mask_position); + break; + case PROP_BORDER: + g_value_set_float (value, self->mask_border); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_shape_wipe_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (object); + + switch (prop_id) { + case PROP_POSITION:{ + gfloat f = g_value_get_float (value); + + GST_LOG_OBJECT (self, "Setting mask position: %f", f); + self->mask_position = f; + break; + } + case PROP_BORDER:{ + gfloat f = g_value_get_float (value); + + GST_LOG_OBJECT (self, "Setting mask border: %f", f); + self->mask_border = f; + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_shape_wipe_finalize (GObject * object) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (object); + + gst_shape_wipe_reset (self); + + if (self->mask_cond) + g_cond_free (self->mask_cond); + self->mask_cond = NULL; + + if (self->mask_mutex) + g_mutex_free (self->mask_mutex); + self->mask_mutex = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_shape_wipe_reset (GstShapeWipe * self) +{ + GST_DEBUG_OBJECT (self, "Resetting internal state"); + + if (self->mask) + gst_buffer_unref (self->mask); + self->mask = NULL; + + g_mutex_lock (self->mask_mutex); + g_cond_signal (self->mask_cond); + g_mutex_unlock (self->mask_mutex); + + self->fmt = GST_VIDEO_FORMAT_UNKNOWN; + self->width = self->height = 0; + self->mask_bpp = 0; + + gst_segment_init (&self->segment, GST_FORMAT_TIME); + + gst_shape_wipe_reset_qos (self); + self->frame_duration = 0; +} + +static GstFlowReturn +gst_shape_wipe_video_sink_bufferalloc (GstPad * pad, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + GstFlowReturn ret = GST_FLOW_OK; + + GST_LOG_OBJECT (pad, "Allocating buffer with offset 0x%" G_GINT64_MODIFIER + "x and size %u with caps: %" GST_PTR_FORMAT, offset, size, caps); + + *buf = NULL; + + ret = gst_pad_alloc_buffer (self->srcpad, offset, size, caps, buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + GST_ERROR_OBJECT (pad, "Allocating buffer failed: %s", + gst_flow_get_name (ret)); + + gst_object_unref (self); + + return ret; +} + +static gboolean +gst_shape_wipe_video_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + gboolean ret = TRUE; + GstStructure *s; + GstVideoFormat fmt; + gint width, height; + gint fps_n, fps_d; + + GST_DEBUG_OBJECT (pad, "Setting caps: %" GST_PTR_FORMAT, caps); + + s = gst_caps_get_structure (caps, 0); + + if (!gst_video_format_parse_caps (caps, &fmt, &width, &height) || + !gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d)) { + GST_ERROR_OBJECT (pad, "Invalid caps"); + ret = FALSE; + goto done; + } + + self->fmt = fmt; + if (self->width != width || self->height != height) { + g_mutex_lock (self->mask_mutex); + self->width = width; + self->height = height; + + if (self->mask) + gst_buffer_unref (self->mask); + self->mask = NULL; + g_mutex_unlock (self->mask_mutex); + } + + if (fps_n != 0) + self->frame_duration = gst_util_uint64_scale (GST_SECOND, fps_d, fps_n); + else + self->frame_duration = 0; + + ret = gst_pad_set_caps (self->srcpad, caps); + +done: + gst_object_unref (self); + + return ret; +} + +static GstCaps * +gst_shape_wipe_video_sink_getcaps (GstPad * pad) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + GstCaps *ret, *tmp; + + if (GST_PAD_CAPS (pad)) + return gst_caps_copy (GST_PAD_CAPS (pad)); + + tmp = gst_pad_peer_get_caps (self->srcpad); + if (tmp) { + ret = gst_caps_intersect (tmp, gst_pad_get_pad_template_caps (pad)); + gst_caps_unref (tmp); + } else { + ret = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + } + + GST_LOG_OBJECT (pad, "srcpad accepted caps: %" GST_PTR_FORMAT, ret); + + if (gst_caps_is_empty (ret)) + goto done; + + tmp = gst_pad_peer_get_caps (pad); + + GST_LOG_OBJECT (pad, "peerpad accepted caps: %" GST_PTR_FORMAT, tmp); + if (tmp) { + GstCaps *intersection; + + intersection = gst_caps_intersect (tmp, ret); + gst_caps_unref (tmp); + gst_caps_unref (ret); + ret = intersection; + } + + GST_LOG_OBJECT (pad, "intersection: %" GST_PTR_FORMAT, tmp); + + if (gst_caps_is_empty (ret)) + goto done; + + if (self->height && self->width) { + guint i, n; + + n = gst_caps_get_size (ret); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (ret, i); + + gst_structure_set (s, "width", G_TYPE_INT, self->width, "height", + G_TYPE_INT, self->height, NULL); + } + } + + tmp = gst_pad_peer_get_caps (self->mask_sinkpad); + + GST_LOG_OBJECT (pad, "mask accepted caps: %" GST_PTR_FORMAT, tmp); + if (tmp) { + GstCaps *intersection, *tmp2; + guint i, n; + + tmp = gst_caps_make_writable (tmp); + + tmp2 = gst_caps_copy (gst_pad_get_pad_template_caps (self->mask_sinkpad)); + + intersection = gst_caps_intersect (tmp, tmp2); + gst_caps_unref (tmp); + gst_caps_unref (tmp2); + tmp = intersection; + + n = gst_caps_get_size (tmp); + + tmp2 = gst_caps_new_empty (); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (tmp, i); + GstStructure *c; + + gst_structure_remove_fields (s, "format", "bpp", "depth", "endianness", + "framerate", "red_mask", "green_mask", "blue_mask", "alpha_mask", + NULL); + gst_structure_set_name (s, "video/x-raw-yuv"); + c = gst_structure_copy (s); + gst_structure_set_name (c, "video/x-raw-rgb"); + gst_caps_append_structure (tmp2, c); + } + gst_caps_append (tmp, tmp2); + + intersection = gst_caps_intersect (tmp, ret); + gst_caps_unref (tmp); + gst_caps_unref (ret); + ret = intersection; + } +done: + + gst_object_unref (self); + + GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); + + return ret; +} + +static gboolean +gst_shape_wipe_mask_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + gboolean ret = TRUE; + GstStructure *s; + gint width, height, bpp; + + GST_DEBUG_OBJECT (pad, "Setting caps: %" GST_PTR_FORMAT, caps); + + s = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (s, "width", &width) || + !gst_structure_get_int (s, "height", &height) || + !gst_structure_get_int (s, "bpp", &bpp)) { + ret = FALSE; + goto done; + } + + if ((self->width != width || self->height != height) && + self->width > 0 && self->height > 0) { + GST_ERROR_OBJECT (pad, "Mask caps must have the same width/height " + "as the video caps"); + ret = FALSE; + goto done; + } else { + self->width = width; + self->height = height; + } + + self->mask_bpp = bpp; + +done: + gst_object_unref (self); + + return ret; +} + +static GstCaps * +gst_shape_wipe_mask_sink_getcaps (GstPad * pad) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + GstCaps *ret, *tmp; + guint i, n; + + if (GST_PAD_CAPS (pad)) + return gst_caps_copy (GST_PAD_CAPS (pad)); + + tmp = gst_pad_peer_get_caps (self->video_sinkpad); + if (tmp) { + ret = + gst_caps_intersect (tmp, + gst_pad_get_pad_template_caps (self->video_sinkpad)); + gst_caps_unref (tmp); + } else { + ret = gst_caps_copy (gst_pad_get_pad_template_caps (self->video_sinkpad)); + } + + GST_LOG_OBJECT (pad, "video sink accepted caps: %" GST_PTR_FORMAT, ret); + + if (gst_caps_is_empty (ret)) + goto done; + + tmp = gst_pad_peer_get_caps (self->srcpad); + GST_LOG_OBJECT (pad, "srcpad accepted caps: %" GST_PTR_FORMAT, ret); + + if (tmp) { + GstCaps *intersection; + + intersection = gst_caps_intersect (ret, tmp); + gst_caps_unref (ret); + gst_caps_unref (tmp); + ret = intersection; + } + + GST_LOG_OBJECT (pad, "intersection: %" GST_PTR_FORMAT, ret); + + if (gst_caps_is_empty (ret)) + goto done; + + n = gst_caps_get_size (ret); + tmp = gst_caps_new_empty (); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (ret, i); + GstStructure *t; + + gst_structure_set_name (s, "video/x-raw-gray"); + gst_structure_remove_fields (s, "format", "framerate", "bpp", "depth", + "endianness", "framerate", "red_mask", "green_mask", "blue_mask", + "alpha_mask", NULL); + + if (self->width && self->height) + gst_structure_set (s, "width", G_TYPE_INT, self->width, "height", + G_TYPE_INT, self->height, NULL); + + gst_structure_set (s, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); + + t = gst_structure_copy (s); + + gst_structure_set (s, "bpp", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); + gst_structure_set (t, "bpp", G_TYPE_INT, 8, "depth", G_TYPE_INT, 8, NULL); + + gst_caps_append_structure (tmp, t); + } + gst_caps_append (ret, tmp); + + tmp = gst_pad_peer_get_caps (pad); + GST_LOG_OBJECT (pad, "peer accepted caps: %" GST_PTR_FORMAT, tmp); + + if (tmp) { + GstCaps *intersection; + + intersection = gst_caps_intersect (tmp, ret); + gst_caps_unref (tmp); + gst_caps_unref (ret); + ret = intersection; + } + +done: + gst_object_unref (self); + + GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); + + return ret; +} + +static GstCaps * +gst_shape_wipe_src_getcaps (GstPad * pad) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + GstCaps *ret, *tmp; + + if (GST_PAD_CAPS (pad)) + return gst_caps_copy (GST_PAD_CAPS (pad)); + else if (GST_PAD_CAPS (self->video_sinkpad)) + return gst_caps_copy (GST_PAD_CAPS (self->video_sinkpad)); + + tmp = gst_pad_peer_get_caps (self->video_sinkpad); + if (tmp) { + ret = + gst_caps_intersect (tmp, + gst_pad_get_pad_template_caps (self->video_sinkpad)); + gst_caps_unref (tmp); + } else { + ret = gst_caps_copy (gst_pad_get_pad_template_caps (self->video_sinkpad)); + } + + GST_LOG_OBJECT (pad, "video sink accepted caps: %" GST_PTR_FORMAT, ret); + + if (gst_caps_is_empty (ret)) + goto done; + + tmp = gst_pad_peer_get_caps (pad); + GST_LOG_OBJECT (pad, "peer accepted caps: %" GST_PTR_FORMAT, ret); + if (tmp) { + GstCaps *intersection; + + intersection = gst_caps_intersect (tmp, ret); + gst_caps_unref (tmp); + gst_caps_unref (ret); + ret = intersection; + } + + GST_LOG_OBJECT (pad, "intersection: %" GST_PTR_FORMAT, ret); + + if (gst_caps_is_empty (ret)) + goto done; + + if (self->height && self->width) { + guint i, n; + + n = gst_caps_get_size (ret); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (ret, i); + + gst_structure_set (s, "width", G_TYPE_INT, self->width, "height", + G_TYPE_INT, self->height, NULL); + } + } + + tmp = gst_pad_peer_get_caps (self->mask_sinkpad); + GST_LOG_OBJECT (pad, "mask sink accepted caps: %" GST_PTR_FORMAT, ret); + if (tmp) { + GstCaps *intersection, *tmp2; + guint i, n; + + tmp = gst_caps_make_writable (tmp); + tmp2 = gst_caps_copy (gst_pad_get_pad_template_caps (self->mask_sinkpad)); + + intersection = gst_caps_intersect (tmp, tmp2); + gst_caps_unref (tmp); + gst_caps_unref (tmp2); + + tmp = intersection; + n = gst_caps_get_size (tmp); + + tmp2 = gst_caps_new_empty (); + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (tmp, i); + GstStructure *c; + + gst_structure_remove_fields (s, "format", "bpp", "depth", "endianness", + "framerate", "red_mask", "green_mask", "blue_mask", "alpha_mask", + NULL); + gst_structure_set_name (s, "video/x-raw-yuv"); + c = gst_structure_copy (s); + + gst_caps_append_structure (tmp2, c); + } + gst_caps_append (tmp, tmp2); + + intersection = gst_caps_intersect (tmp, ret); + gst_caps_unref (tmp); + gst_caps_unref (ret); + ret = intersection; + } + +done: + + gst_object_unref (self); + + GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); + + return ret; +} + +static gboolean +gst_shape_wipe_video_sink_query (GstPad * pad, GstQuery * query) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + gboolean ret; + GstPad *peer = gst_pad_get_peer (self->srcpad); + + GST_LOG_OBJECT (pad, "Handling query of type '%s'", + gst_query_type_get_name (GST_QUERY_TYPE (query))); + + if (!peer) { + GST_INFO_OBJECT (pad, "No peer yet, dropping query"); + ret = FALSE; + } else { + ret = gst_pad_query (peer, query); + gst_object_unref (peer); + } + + gst_object_unref (self); + return ret; +} + +static gboolean +gst_shape_wipe_src_query (GstPad * pad, GstQuery * query) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + gboolean ret; + GstPad *peer = gst_pad_get_peer (self->video_sinkpad); + + GST_LOG_OBJECT (pad, "Handling query of type '%s'", + gst_query_type_get_name (GST_QUERY_TYPE (query))); + + if (!peer) { + GST_INFO_OBJECT (pad, "No peer yet, dropping query"); + ret = FALSE; + } else { + ret = gst_pad_query (peer, query); + gst_object_unref (peer); + } + + gst_object_unref (self); + return ret; +} + +static void +gst_shape_wipe_update_qos (GstShapeWipe * self, gdouble proportion, + GstClockTimeDiff diff, GstClockTime timestamp) +{ + GST_OBJECT_LOCK (self); + self->proportion = proportion; + if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { + if (G_UNLIKELY (diff > 0)) + self->earliest_time = timestamp + 2 * diff + self->frame_duration; + else + self->earliest_time = timestamp + diff; + } else { + self->earliest_time = GST_CLOCK_TIME_NONE; + } + GST_OBJECT_UNLOCK (self); +} + +static void +gst_shape_wipe_reset_qos (GstShapeWipe * self) +{ + gst_shape_wipe_update_qos (self, 0.5, 0, GST_CLOCK_TIME_NONE); +} + +static void +gst_shape_wipe_read_qos (GstShapeWipe * self, gdouble * proportion, + GstClockTime * time) +{ + GST_OBJECT_LOCK (self); + *proportion = self->proportion; + *time = self->earliest_time; + GST_OBJECT_UNLOCK (self); +} + +/* Perform qos calculations before processing the next frame. Returns TRUE if + * the frame should be processed, FALSE if the frame can be dropped entirely */ +static gboolean +gst_shape_wipe_do_qos (GstShapeWipe * self, GstClockTime timestamp) +{ + GstClockTime qostime, earliest_time; + gdouble proportion; + + /* no timestamp, can't do QoS => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { + GST_LOG_OBJECT (self, "invalid timestamp, can't do QoS, process frame"); + return TRUE; + } + + /* get latest QoS observation values */ + gst_shape_wipe_read_qos (self, &proportion, &earliest_time); + + /* skip qos if we have no observation (yet) => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { + GST_LOG_OBJECT (self, "no observation yet, process frame"); + return TRUE; + } + + /* qos is done on running time */ + qostime = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME, + timestamp); + + /* see how our next timestamp relates to the latest qos timestamp */ + GST_LOG_OBJECT (self, "qostime %" GST_TIME_FORMAT ", earliest %" + GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); + + if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { + GST_DEBUG_OBJECT (self, "we are late, drop frame"); + return FALSE; + } + + GST_LOG_OBJECT (self, "process frame"); + return TRUE; +} + +#define CREATE_ARGB_FUNCTIONS(depth, name, shift, a, r, g, b) \ +static void \ +gst_shape_wipe_blend_##name##_##depth (GstShapeWipe * self, GstBuffer * inbuf, \ + GstBuffer * maskbuf, GstBuffer * outbuf) \ +{ \ + const guint##depth *mask = (const guint##depth *) GST_BUFFER_DATA (maskbuf); \ + const guint8 *input = (const guint8 *) GST_BUFFER_DATA (inbuf); \ + guint8 *output = (guint8 *) GST_BUFFER_DATA (outbuf); \ + guint i, j; \ + guint mask_increment = ((depth == 16) ? GST_ROUND_UP_2 (self->width) : \ + GST_ROUND_UP_4 (self->width)) - self->width; \ + gfloat position = self->mask_position; \ + gfloat low = position - (self->mask_border / 2.0f); \ + gfloat high = position + (self->mask_border / 2.0f); \ + guint32 low_i, high_i, round_i; \ + gint width = self->width, height = self->height; \ + \ + if (low < 0.0f) { \ + high = 0.0f; \ + low = 0.0f; \ + } \ + \ + if (high > 1.0f) { \ + low = 1.0f; \ + high = 1.0f; \ + } \ + \ + low_i = low * 65536; \ + high_i = high * 65536; \ + round_i = (high_i - low_i) >> 1; \ + \ + for (i = 0; i < height; i++) { \ + for (j = 0; j < width; j++) { \ + guint32 in = *mask << shift; \ + \ + if (in < low_i) { \ + output[a] = 0x00; /* A */ \ + output[r] = input[r]; /* R */ \ + output[g] = input[g]; /* G */ \ + output[b] = input[b]; /* B */ \ + } else if (in >= high_i) { \ + output[a] = input[a]; /* A */ \ + output[r] = input[r]; /* R */ \ + output[g] = input[g]; /* G */ \ + output[b] = input[b]; /* B */ \ + } else { \ + guint32 val; \ + /* Note: This will never overflow or be larger than 255! */ \ + val = (((in - low_i) << 16) + round_i) / (high_i - low_i); \ + val = (val * input[a] + 32768) >> 16; \ + \ + output[a] = val; /* A */ \ + output[r] = input[r]; /* R */ \ + output[g] = input[g]; /* G */ \ + output[b] = input[b]; /* B */ \ + } \ + \ + mask++; \ + input += 4; \ + output += 4; \ + } \ + mask += mask_increment; \ + } \ +} + +CREATE_ARGB_FUNCTIONS (16, argb, 0, 0, 1, 2, 3); +CREATE_ARGB_FUNCTIONS (8, argb, 8, 0, 1, 2, 3); + +CREATE_ARGB_FUNCTIONS (16, bgra, 0, 3, 2, 1, 0); +CREATE_ARGB_FUNCTIONS (8, bgra, 8, 3, 2, 1, 0); + +static GstFlowReturn +gst_shape_wipe_video_sink_chain (GstPad * pad, GstBuffer * buffer) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (GST_PAD_PARENT (pad)); + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *mask = NULL, *outbuf = NULL; + GstClockTime timestamp; + gboolean new_outbuf = FALSE; + + if (G_UNLIKELY (self->fmt == GST_VIDEO_FORMAT_UNKNOWN)) + goto not_negotiated; + + timestamp = GST_BUFFER_TIMESTAMP (buffer); + timestamp = + gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME, timestamp); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) + gst_object_sync_values (G_OBJECT (self), timestamp); + + GST_LOG_OBJECT (self, + "Blending buffer with timestamp %" GST_TIME_FORMAT " at position %f", + GST_TIME_ARGS (timestamp), self->mask_position); + + g_mutex_lock (self->mask_mutex); + if (self->shutdown) + goto shutdown; + + if (!self->mask) + g_cond_wait (self->mask_cond, self->mask_mutex); + + if (self->mask == NULL || self->shutdown) { + goto shutdown; + } else { + mask = gst_buffer_ref (self->mask); + } + g_mutex_unlock (self->mask_mutex); + + if (!gst_shape_wipe_do_qos (self, GST_BUFFER_TIMESTAMP (buffer))) + goto qos; + + /* Try to blend inplace, if it's not possible + * get a new buffer from downstream. */ + if (!gst_buffer_is_writable (buffer)) { + ret = + gst_pad_alloc_buffer_and_set_caps (self->srcpad, GST_BUFFER_OFFSET_NONE, + GST_BUFFER_SIZE (buffer), GST_PAD_CAPS (self->srcpad), &outbuf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto alloc_failed; + + gst_buffer_copy_metadata (outbuf, buffer, GST_BUFFER_COPY_ALL); + new_outbuf = TRUE; + } else { + outbuf = buffer; + } + + switch (self->fmt) { + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + if (self->mask_bpp == 16) + gst_shape_wipe_blend_argb_16 (self, buffer, mask, outbuf); + else + gst_shape_wipe_blend_argb_8 (self, buffer, mask, outbuf); + break; + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_RGBA: + if (self->mask_bpp == 16) + gst_shape_wipe_blend_bgra_16 (self, buffer, mask, outbuf); + else + gst_shape_wipe_blend_bgra_8 (self, buffer, mask, outbuf); + break; + default: + g_assert_not_reached (); + break; + } + + gst_buffer_unref (mask); + if (new_outbuf) + gst_buffer_unref (buffer); + + ret = gst_pad_push (self->srcpad, outbuf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto push_failed; + + return ret; + + /* Errors */ +not_negotiated: + GST_ERROR_OBJECT (self, "No valid caps yet"); + gst_buffer_unref (buffer); + return GST_FLOW_NOT_NEGOTIATED; +shutdown: + GST_DEBUG_OBJECT (self, "Shutting down"); + gst_buffer_unref (buffer); + return GST_FLOW_WRONG_STATE; +qos: + GST_DEBUG_OBJECT (self, "Dropping buffer because of QoS"); + gst_buffer_unref (buffer); + gst_buffer_unref (mask); + return GST_FLOW_OK; +alloc_failed: + GST_ERROR_OBJECT (self, "Buffer allocation from downstream failed: %s", + gst_flow_get_name (ret)); + gst_buffer_unref (buffer); + gst_buffer_unref (mask); + return ret; +push_failed: + GST_ERROR_OBJECT (self, "Pushing buffer downstream failed: %s", + gst_flow_get_name (ret)); + return ret; +} + +static GstFlowReturn +gst_shape_wipe_mask_sink_chain (GstPad * pad, GstBuffer * buffer) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (GST_PAD_PARENT (pad)); + GstFlowReturn ret = GST_FLOW_OK; + + g_mutex_lock (self->mask_mutex); + GST_DEBUG_OBJECT (self, "Setting new mask buffer: %" GST_PTR_FORMAT, buffer); + + gst_buffer_replace (&self->mask, buffer); + g_cond_signal (self->mask_cond); + g_mutex_unlock (self->mask_mutex); + + gst_buffer_unref (buffer); + + return ret; +} + +static GstStateChangeReturn +gst_shape_wipe_change_state (GstElement * element, GstStateChange transition) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + self->shutdown = FALSE; + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + /* Unblock video sink chain function */ + g_mutex_lock (self->mask_mutex); + self->shutdown = TRUE; + g_cond_signal (self->mask_cond); + g_mutex_unlock (self->mask_mutex); + break; + default: + break; + } + + if (GST_ELEMENT_CLASS (parent_class)->change_state) + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_shape_wipe_reset (self); + break; + default: + break; + } + + return ret; +} + +static gboolean +gst_shape_wipe_video_sink_event (GstPad * pad, GstEvent * event) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + gboolean ret; + + GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT:{ + GstFormat fmt; + gboolean is_update; + gint64 start, end, base; + gdouble rate; + + gst_event_parse_new_segment (event, &is_update, &rate, &fmt, &start, + &end, &base); + if (fmt == GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (pad, + "Got NEWSEGMENT event in GST_FORMAT_TIME, passing on (%" + GST_TIME_FORMAT " - %" GST_TIME_FORMAT ")", GST_TIME_ARGS (start), + GST_TIME_ARGS (end)); + gst_segment_set_newsegment (&self->segment, is_update, rate, fmt, start, + end, base); + } else { + gst_segment_init (&self->segment, GST_FORMAT_TIME); + } + } + /* fall through */ + case GST_EVENT_FLUSH_STOP: + gst_shape_wipe_reset_qos (self); + /* fall through */ + default: + ret = gst_pad_push_event (self->srcpad, event); + break; + } + + gst_object_unref (self); + return ret; +} + +static gboolean +gst_shape_wipe_mask_sink_event (GstPad * pad, GstEvent * event) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + + GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + g_mutex_lock (self->mask_mutex); + gst_buffer_replace (&self->mask, NULL); + g_mutex_unlock (self->mask_mutex); + break; + default: + break; + } + + /* Dropping all events here */ + gst_event_unref (event); + + gst_object_unref (self); + return TRUE; +} + +static gboolean +gst_shape_wipe_src_event (GstPad * pad, GstEvent * event) +{ + GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); + gboolean ret; + + GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS:{ + GstClockTimeDiff diff; + GstClockTime timestamp; + gdouble proportion; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + gst_shape_wipe_update_qos (self, proportion, diff, timestamp); + } + /* fall through */ + default: + ret = gst_pad_push_event (self->video_sinkpad, event); + break; + } + + gst_object_unref (self); + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_shape_wipe_debug, "shapewipe", 0, + "shapewipe element"); + + gst_controller_init (NULL, NULL); + + if (!gst_element_register (plugin, "shapewipe", GST_RANK_NONE, + GST_TYPE_SHAPE_WIPE)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "shapewipe", + "Shape Wipe transition filter", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/shapewipe/gstshapewipe.h b/gst/shapewipe/gstshapewipe.h new file mode 100644 index 0000000..36b4fc5 --- /dev/null +++ b/gst/shapewipe/gstshapewipe.h @@ -0,0 +1,81 @@ +/* GStreamer + * Copyright (C) 2009,2010 Sebastian Dröge + * + * 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_SHAPE_WIPE_H__ +#define __GST_SHAPE_WIPE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SHAPE_WIPE \ + (gst_shape_wipe_get_type()) +#define GST_SHAPE_WIPE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SHAPE_WIPE,GstShapeWipe)) +#define GST_SHAPE_WIPE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SHAPE_WIPE,GstShapeWipeClass)) +#define GST_SHAPE_WIPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_SHAPE_WIPE,GstShapeWipeClass)) +#define GST_IS_SHAPE_WIPE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SHAPE_WIPE)) +#define GST_IS_SHAPE_WIPE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SHAPE_WIPE)) + +typedef struct _GstShapeWipe GstShapeWipe; +typedef struct _GstShapeWipeClass GstShapeWipeClass; + +struct _GstShapeWipe +{ + GstElement parent; + + /* private */ + GstPad *video_sinkpad; + GstPad *mask_sinkpad; + + GstPad *srcpad; + + GstSegment segment; + + GstBuffer *mask; + gfloat mask_position; + gfloat mask_border; + GMutex *mask_mutex; + GCond *mask_cond; + gint mask_bpp; + + GstVideoFormat fmt; + gint width, height; + + gboolean shutdown; + + gdouble proportion; + GstClockTime earliest_time; + GstClockTime frame_duration; +}; + +struct _GstShapeWipeClass +{ + GstElementClass parent_class; +}; + +GType gst_shape_wipe_get_type (void); + +G_END_DECLS + +#endif /* __GST_SHAPE_WIPE_H__ */ diff --git a/gst/smpte/Makefile.am b/gst/smpte/Makefile.am new file mode 100644 index 0000000..34bb039 --- /dev/null +++ b/gst/smpte/Makefile.am @@ -0,0 +1,26 @@ +plugin_LTLIBRARIES = libgstsmpte.la + +libgstsmpte_la_SOURCES = gstsmpte.c gstmask.c barboxwipes.c paint.c gstsmptealpha.c plugin.c + +noinst_HEADERS = gstsmpte.h gstmask.h paint.h gstsmptealpha.h + +libgstsmpte_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) +libgstsmpte_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(LIBM) \ + -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_CONTROLLER_LIBS) +libgstsmpte_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstsmpte_la_LIBTOOLFLAGS = --tag=disable-static + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstsmpte -:SHARED libgstsmpte \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstsmpte_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstsmpte_la_CFLAGS) \ + -:LDFLAGS $(libgstsmpte_la_LDFLAGS) \ + $(libgstsmpte_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/smpte/Makefile.in b/gst/smpte/Makefile.in new file mode 100644 index 0000000..e6ceb90 --- /dev/null +++ b/gst/smpte/Makefile.in @@ -0,0 +1,866 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/smpte +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstsmpte_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstsmpte_la_OBJECTS = libgstsmpte_la-gstsmpte.lo \ + libgstsmpte_la-gstmask.lo libgstsmpte_la-barboxwipes.lo \ + libgstsmpte_la-paint.lo libgstsmpte_la-gstsmptealpha.lo \ + libgstsmpte_la-plugin.lo +libgstsmpte_la_OBJECTS = $(am_libgstsmpte_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstsmpte_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstsmpte_la_CFLAGS) $(CFLAGS) \ + $(libgstsmpte_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstsmpte_la_SOURCES) +DIST_SOURCES = $(libgstsmpte_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstsmpte.la +libgstsmpte_la_SOURCES = gstsmpte.c gstmask.c barboxwipes.c paint.c gstsmptealpha.c plugin.c +noinst_HEADERS = gstsmpte.h gstmask.h paint.h gstsmptealpha.h +libgstsmpte_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) +libgstsmpte_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(LIBM) \ + -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_CONTROLLER_LIBS) + +libgstsmpte_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstsmpte_la_LIBTOOLFLAGS = --tag=disable-static +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/smpte/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/smpte/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstsmpte.la: $(libgstsmpte_la_OBJECTS) $(libgstsmpte_la_DEPENDENCIES) $(EXTRA_libgstsmpte_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstsmpte_la_LINK) -rpath $(plugindir) $(libgstsmpte_la_OBJECTS) $(libgstsmpte_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-barboxwipes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-gstmask.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-gstsmpte.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-gstsmptealpha.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-paint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-plugin.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstsmpte_la-gstsmpte.lo: gstsmpte.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-gstsmpte.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-gstsmpte.Tpo -c -o libgstsmpte_la-gstsmpte.lo `test -f 'gstsmpte.c' || echo '$(srcdir)/'`gstsmpte.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-gstsmpte.Tpo $(DEPDIR)/libgstsmpte_la-gstsmpte.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmpte.c' object='libgstsmpte_la-gstsmpte.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-gstsmpte.lo `test -f 'gstsmpte.c' || echo '$(srcdir)/'`gstsmpte.c + +libgstsmpte_la-gstmask.lo: gstmask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-gstmask.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-gstmask.Tpo -c -o libgstsmpte_la-gstmask.lo `test -f 'gstmask.c' || echo '$(srcdir)/'`gstmask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-gstmask.Tpo $(DEPDIR)/libgstsmpte_la-gstmask.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmask.c' object='libgstsmpte_la-gstmask.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-gstmask.lo `test -f 'gstmask.c' || echo '$(srcdir)/'`gstmask.c + +libgstsmpte_la-barboxwipes.lo: barboxwipes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-barboxwipes.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-barboxwipes.Tpo -c -o libgstsmpte_la-barboxwipes.lo `test -f 'barboxwipes.c' || echo '$(srcdir)/'`barboxwipes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-barboxwipes.Tpo $(DEPDIR)/libgstsmpte_la-barboxwipes.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='barboxwipes.c' object='libgstsmpte_la-barboxwipes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-barboxwipes.lo `test -f 'barboxwipes.c' || echo '$(srcdir)/'`barboxwipes.c + +libgstsmpte_la-paint.lo: paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-paint.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-paint.Tpo -c -o libgstsmpte_la-paint.lo `test -f 'paint.c' || echo '$(srcdir)/'`paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-paint.Tpo $(DEPDIR)/libgstsmpte_la-paint.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint.c' object='libgstsmpte_la-paint.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-paint.lo `test -f 'paint.c' || echo '$(srcdir)/'`paint.c + +libgstsmpte_la-gstsmptealpha.lo: gstsmptealpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-gstsmptealpha.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-gstsmptealpha.Tpo -c -o libgstsmpte_la-gstsmptealpha.lo `test -f 'gstsmptealpha.c' || echo '$(srcdir)/'`gstsmptealpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-gstsmptealpha.Tpo $(DEPDIR)/libgstsmpte_la-gstsmptealpha.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmptealpha.c' object='libgstsmpte_la-gstsmptealpha.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-gstsmptealpha.lo `test -f 'gstsmptealpha.c' || echo '$(srcdir)/'`gstsmptealpha.c + +libgstsmpte_la-plugin.lo: plugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-plugin.Tpo -c -o libgstsmpte_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-plugin.Tpo $(DEPDIR)/libgstsmpte_la-plugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstsmpte_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstsmpte -:SHARED libgstsmpte \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstsmpte_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstsmpte_la_CFLAGS) \ + -:LDFLAGS $(libgstsmpte_la_LDFLAGS) \ + $(libgstsmpte_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/smpte/barboxwipes.c b/gst/smpte/barboxwipes.c new file mode 100644 index 0000000..b8f00f7 --- /dev/null +++ b/gst/smpte/barboxwipes.c @@ -0,0 +1,957 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 "paint.h" +#include "gstmask.h" + +enum +{ + BOX_VERTICAL = 1, + BOX_HORIZONTAL = 2, + BOX_CLOCK = 3, + TRIGANLE_LINEAR = 4 +}; + +static const gint boxes_1b[][7] = { +#define WIPE_B1_1 0 + {BOX_VERTICAL, 0, 0, 0, 1, 1, 1}, +#define WIPE_B1_2 1 + {BOX_HORIZONTAL, 0, 0, 0, 1, 1, 1} +}; + +static const gint boxes_2b[][7 * 2] = { +#define WIPE_B2_21 0 + {BOX_VERTICAL, 0, 0, 1, 1, 2, 0, + BOX_VERTICAL, 1, 0, 0, 2, 2, 1}, +#define WIPE_B2_22 1 + {BOX_HORIZONTAL, 0, 0, 1, 2, 1, 0, + BOX_HORIZONTAL, 0, 1, 0, 2, 2, 1}, +}; + +static const gint box_clock_1b[][1 * 10] = { +#define WIPE_B1_241 0 + {BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 1, 1}, +#define WIPE_B1_242 1 + {BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1}, +#define WIPE_B1_243 2 + {BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, +#define WIPE_B1_244 3 + {BOX_CLOCK, 1, 0, 0, 0, 0, 0, 1, 1, 1}, +}; + +#define WIPE_B2_221 0 +static const gint box_clock_2b[][2 * 10] = { +#define WIPE_B2_221 0 + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, + BOX_CLOCK, 1, 0, 0, 1, 2, 1, 0, 0, 2}, +#define WIPE_B2_222 1 + {BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 0, 2}, +#define WIPE_B2_223 2 + {BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2}, +#define WIPE_B2_224 3 + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, + BOX_CLOCK, 0, 1, 0, 2, 1, 1, 0, 2, 2}, +#define WIPE_B2_225 4 + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, + BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1}, +#define WIPE_B2_226 5 + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, + BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1}, +#define WIPE_B2_231 6 + {BOX_CLOCK, 1, 0, 0, 1, 2, 0, 2, 0, 1, + BOX_CLOCK, 1, 0, 0, 1, 2, 0, 0, 0, 1}, +#define WIPE_B2_232 7 + {BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 0, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 2, 1}, +#define WIPE_B2_233 8 + {BOX_CLOCK, 1, 2, 0, 1, 0, 0, 2, 2, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 0, 0, 2, 1}, +#define WIPE_B2_234 9 + {BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 0, 1, + BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 2, 1}, +#define WIPE_B2_251 10 + {BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 2, 1, + BOX_CLOCK, 2, 0, 0, 1, 0, 0, 2, 2, 1}, +#define WIPE_B2_252 11 + {BOX_CLOCK, 0, 0, 0, 0, 1, 0, 2, 0, 1, + BOX_CLOCK, 0, 2, 0, 0, 1, 0, 2, 2, 1}, +#define WIPE_B2_253 12 + {BOX_CLOCK, 0, 2, 0, 1, 2, 0, 0, 0, 1, + BOX_CLOCK, 2, 2, 0, 1, 2, 0, 2, 0, 1}, +#define WIPE_B2_254 13 + {BOX_CLOCK, 2, 0, 0, 2, 1, 0, 0, 0, 1, + BOX_CLOCK, 2, 2, 0, 2, 1, 0, 0, 2, 1}, +}; + +static const gint box_clock_4b[][4 * 10] = { +#define WIPE_B4_201 0 + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 2, 2, 0, 1, 3, + BOX_CLOCK, 1, 1, 0, 0, 1, 3, 1, 0, 4}, +#define WIPE_B4_202 1 + {BOX_CLOCK, 1, 1, 0, 1, 0, 3, 2, 1, 4, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 0, 1, 2, 1, 0, 3}, +#define WIPE_B4_203 2 + {BOX_CLOCK, 1, 1, 0, 1, 0, 2, 2, 1, 3, + BOX_CLOCK, 1, 1, 0, 2, 1, 3, 1, 2, 4, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2}, +#define WIPE_B4_204 3 + {BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 2, 1, 2, 3, + BOX_CLOCK, 1, 1, 0, 1, 2, 3, 0, 1, 4, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, +#define WIPE_B4_205 4 + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2}, +#define WIPE_B4_206 5 + {BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, +#define WIPE_B4_207 6 + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, +#define WIPE_B4_211 7 + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 2, 2}, +#define WIPE_B4_212 8 + {BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 1, 0, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2}, +#define WIPE_B4_213 9 + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1}, +#define WIPE_B4_214 10 + {BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 2, 1}, +#define WIPE_B4_227 11 + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 1, 1, + BOX_CLOCK, 1, 0, 0, 1, 1, 1, 0, 0, 2, + BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 1, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 1, 0, 2, 2}, +#define WIPE_B4_228 12 + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 1, 1, 1, + BOX_CLOCK, 0, 1, 0, 1, 1, 1, 0, 2, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 0, 1, 1, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 1, 2, 2, 2}, +#define WIPE_B4_235 13 + {BOX_CLOCK, 1, 0, 0, 1, 1, 0, 0, 0, 1, + BOX_CLOCK, 1, 0, 0, 1, 1, 0, 2, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 0, 2, 2, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 0, 0, 2, 1}, +#define WIPE_B4_236 14 + {BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1, + BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 2, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 0, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 2, 1}, +}; + +static const gint box_clock_8b[][8 * 10] = { +#define WIPE_B8_261 0 + {BOX_CLOCK, 2, 1, 0, 2, 2, 0, 4, 1, 1, + BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 0, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 2, 0, 1, 3, + BOX_CLOCK, 2, 1, 0, 0, 1, 3, 2, 2, 4, + BOX_CLOCK, 2, 3, 0, 2, 2, 0, 4, 3, 1, + BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 4, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 2, 0, 3, 3, + BOX_CLOCK, 2, 3, 0, 0, 3, 3, 2, 2, 4}, +#define WIPE_B8_262 1 + {BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 0, 2, 2, + BOX_CLOCK, 1, 2, 0, 0, 2, 2, 1, 4, 3, + BOX_CLOCK, 1, 2, 0, 1, 4, 3, 2, 2, 4, + BOX_CLOCK, 3, 2, 0, 2, 2, 0, 3, 0, 1, + BOX_CLOCK, 3, 2, 0, 3, 0, 1, 4, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 2, 3, 4, 3, + BOX_CLOCK, 3, 2, 0, 3, 4, 3, 2, 2, 4}, +#define WIPE_B8_263 2 + {BOX_CLOCK, 2, 1, 0, 2, 0, 0, 4, 1, 1, + BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 2, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 0, 0, 1, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 2, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 0, 4, 3, 1, + BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 2, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 0, 0, 3, 1, + BOX_CLOCK, 2, 3, 0, 0, 3, 1, 2, 2, 2}, +#define WIPE_B8_264 3 + {BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2, + BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 4, 1, + BOX_CLOCK, 1, 2, 0, 1, 4, 1, 2, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 0, 1, + BOX_CLOCK, 3, 2, 0, 3, 0, 1, 2, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 4, 1, + BOX_CLOCK, 3, 2, 0, 3, 4, 1, 2, 2, 2}, +}; + +static const gint triangles_2t[][2 * 9] = { + /* 3 -> 6 */ +#define WIPE_T2_3 0 + {0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 1, 1, 1}, +#define WIPE_T2_4 WIPE_T2_3+1 + {0, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 1, 1, 1, 1, 1}, +#define WIPE_T2_5 WIPE_T2_4+1 + {0, 0, 1, 0, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 0, 1, 1, 1, 0}, +#define WIPE_T2_6 WIPE_T2_5+1 + {0, 0, 1, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 1, 1}, +#define WIPE_T2_41 WIPE_T2_6+1 + {0, 0, 0, 1, 0, 1, 0, 1, 1, + 1, 0, 1, 0, 1, 1, 1, 1, 2}, +#define WIPE_T2_42 WIPE_T2_41+1 + {0, 0, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 0, 1, 2, 1, 1, 1}, +#define WIPE_T2_45 WIPE_T2_42+1 + {0, 0, 1, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 1, 1, 1}, +#define WIPE_T2_46 WIPE_T2_45+1 + {0, 0, 0, 1, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0}, +#define WIPE_T2_245 WIPE_T2_46+1 + {0, 0, 0, 2, 0, 0, 2, 2, 1, + 2, 2, 0, 0, 2, 0, 0, 0, 1}, +#define WIPE_T2_246 WIPE_T2_245+1 + {0, 2, 0, 0, 0, 0, 2, 0, 1, + 2, 0, 0, 2, 2, 0, 0, 2, 1}, +}; + +static const gint triangles_3t[][3 * 9] = { + /* 23 -> 26 */ +#define WIPE_T3_23 0 + {0, 0, 1, 1, 0, 0, 0, 2, 1, + 1, 0, 0, 0, 2, 1, 2, 2, 1, + 1, 0, 0, 2, 0, 1, 2, 2, 1}, +#define WIPE_T3_24 1 + {0, 0, 1, 2, 0, 1, 2, 1, 0, + 0, 0, 1, 2, 1, 0, 0, 2, 1, + 2, 1, 0, 0, 2, 1, 2, 2, 1}, +#define WIPE_T3_25 2 + {0, 0, 1, 0, 2, 1, 1, 2, 0, + 0, 0, 1, 2, 0, 1, 1, 2, 0, + 2, 0, 1, 1, 2, 0, 2, 2, 1}, +#define WIPE_T3_26 3 + {0, 0, 1, 2, 0, 1, 0, 1, 0, + 2, 0, 1, 0, 1, 0, 2, 2, 1, + 0, 1, 0, 0, 2, 1, 2, 2, 1}, +}; + +static const gint triangles_4t[][4 * 9] = { +#define WIPE_T4_61 0 + {0, 0, 1, 1, 0, 0, 1, 2, 1, + 0, 0, 1, 0, 2, 2, 1, 2, 1, + 1, 0, 0, 2, 0, 1, 1, 2, 1, + 2, 0, 1, 1, 2, 1, 2, 2, 2}, +#define WIPE_T4_62 1 + {0, 0, 2, 2, 0, 1, 0, 1, 1, + 2, 0, 1, 0, 1, 1, 2, 1, 0, + 0, 1, 1, 2, 1, 0, 2, 2, 1, + 0, 1, 1, 0, 2, 2, 2, 2, 1}, +#define WIPE_T4_63 2 + {0, 0, 2, 1, 0, 1, 0, 2, 1, + 1, 0, 1, 0, 2, 1, 1, 2, 0, + 1, 0, 1, 1, 2, 0, 2, 2, 1, + 1, 0, 1, 2, 0, 2, 2, 2, 1}, +#define WIPE_T4_64 3 + {0, 0, 1, 2, 0, 2, 2, 1, 1, + 0, 0, 1, 0, 1, 0, 2, 1, 1, + 0, 1, 0, 2, 1, 1, 0, 2, 1, + 2, 1, 1, 0, 2, 1, 2, 2, 2}, +#define WIPE_T4_65 4 + {0, 0, 0, 1, 0, 1, 1, 2, 0, + 0, 0, 0, 0, 2, 1, 1, 2, 0, + 1, 0, 1, 2, 0, 0, 1, 2, 0, + 2, 0, 0, 1, 2, 0, 2, 2, 1}, +#define WIPE_T4_66 5 + {0, 0, 1, 2, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 1, 0, 2, 1, 1, + 0, 1, 0, 2, 1, 1, 2, 2, 0, + 0, 1, 0, 0, 2, 1, 2, 2, 0}, +#define WIPE_T4_67 6 + {0, 0, 1, 1, 0, 0, 0, 2, 0, + 1, 0, 0, 0, 2, 0, 1, 2, 1, + 1, 0, 0, 1, 2, 1, 2, 2, 0, + 1, 0, 0, 2, 0, 1, 2, 2, 0}, +#define WIPE_T4_68 7 + {0, 0, 0, 2, 0, 1, 2, 1, 0, + 0, 0, 0, 0, 1, 1, 2, 1, 0, + 0, 1, 1, 2, 1, 0, 0, 2, 0, + 2, 1, 0, 0, 2, 0, 2, 2, 1}, +#define WIPE_T4_101 8 + {0, 0, 1, 2, 0, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 2, 1, + 1, 1, 0, 0, 2, 1, 2, 2, 1, + 2, 0, 1, 1, 1, 0, 2, 2, 1}, +}; + +static const gint triangles_8t[][8 * 9] = { + /* 7 */ +#define WIPE_T8_7 0 + {0, 0, 0, 1, 0, 1, 1, 1, 1, + 1, 0, 1, 2, 0, 0, 1, 1, 1, + 2, 0, 0, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 2, 0, + 1, 1, 1, 1, 2, 1, 2, 2, 0, + 1, 1, 1, 0, 2, 0, 1, 2, 1, + 0, 1, 1, 1, 1, 1, 0, 2, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1}, +#define WIPE_T8_43 1 + {0, 0, 1, 1, 0, 0, 1, 1, 1, + 1, 0, 0, 2, 0, 1, 1, 1, 1, + 2, 0, 1, 1, 1, 1, 2, 1, 2, + 1, 1, 1, 2, 1, 2, 2, 2, 1, + 1, 1, 1, 1, 2, 0, 2, 2, 1, + 1, 1, 1, 0, 2, 1, 1, 2, 0, + 0, 1, 2, 1, 1, 1, 0, 2, 1, + 0, 0, 1, 0, 1, 2, 1, 1, 1}, +#define WIPE_T8_44 2 + {0, 0, 1, 1, 0, 2, 1, 1, 1, + 1, 0, 2, 2, 0, 1, 1, 1, 1, + 2, 0, 1, 1, 1, 1, 2, 1, 0, + 1, 1, 1, 2, 1, 0, 2, 2, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 1, + 1, 1, 1, 0, 2, 1, 1, 2, 2, + 0, 1, 0, 1, 1, 1, 0, 2, 1, + 0, 0, 1, 0, 1, 0, 1, 1, 1}, +#define WIPE_T8_47 3 + {0, 0, 0, 1, 0, 1, 1, 1, 0, + 1, 0, 1, 2, 0, 0, 1, 1, 0, + 2, 0, 0, 1, 1, 0, 2, 1, 1, + 1, 1, 0, 2, 1, 1, 2, 2, 0, + 1, 1, 0, 1, 2, 1, 2, 2, 0, + 1, 1, 0, 0, 2, 0, 1, 2, 1, + 0, 1, 1, 1, 1, 0, 0, 2, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0}, +#define WIPE_T8_48 4 + {0, 0, 1, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 1, 1, 1, + 1, 0, 0, 2, 0, 1, 2, 1, 0, + 1, 0, 0, 1, 1, 1, 2, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 2, 0, + 0, 1, 0, 0, 2, 1, 1, 2, 0, + 1, 1, 1, 2, 1, 0, 1, 2, 0, + 2, 1, 0, 1, 2, 0, 2, 2, 1}, +}; + +static const gint triangles_16t[][16 * 9] = { + /* 8 */ +#define WIPE_T16_8 0 + {0, 0, 1, 2, 0, 1, 1, 1, 0, + 2, 0, 1, 1, 1, 0, 2, 2, 1, + 1, 1, 0, 0, 2, 1, 2, 2, 1, + 0, 0, 1, 1, 1, 0, 0, 2, 1, + 2, 0, 1, 4, 0, 1, 3, 1, 0, + 4, 0, 1, 3, 1, 0, 4, 2, 1, + 3, 1, 0, 2, 2, 1, 4, 2, 1, + 2, 0, 1, 3, 1, 0, 2, 2, 1, + 0, 2, 1, 2, 2, 1, 1, 3, 0, + 2, 2, 1, 1, 3, 0, 2, 4, 1, + 1, 3, 0, 0, 4, 1, 2, 4, 1, + 0, 2, 1, 1, 3, 0, 0, 4, 1, + 2, 2, 1, 4, 2, 1, 3, 3, 0, + 4, 2, 1, 3, 3, 0, 4, 4, 1, + 3, 3, 0, 2, 4, 1, 4, 4, 1, + 2, 2, 1, 3, 3, 0, 2, 4, 1} +}; + +typedef struct _GstWipeConfig GstWipeConfig; + +struct _GstWipeConfig +{ + const gint *objects; + gint nobjects; + gint xscale; + gint yscale; + gint cscale; +}; + +static const GstWipeConfig wipe_config[] = { +#define WIPE_CONFIG_1 0 + {boxes_1b[WIPE_B1_1], 1, 0, 0, 0}, /* 1 */ +#define WIPE_CONFIG_2 WIPE_CONFIG_1+1 + {boxes_1b[WIPE_B1_2], 1, 0, 0, 0}, /* 2 */ +#define WIPE_CONFIG_3 WIPE_CONFIG_2+1 + {triangles_2t[WIPE_T2_3], 2, 0, 0, 0}, /* 3 */ +#define WIPE_CONFIG_4 WIPE_CONFIG_3+1 + {triangles_2t[WIPE_T2_4], 2, 0, 0, 0}, /* 4 */ +#define WIPE_CONFIG_5 WIPE_CONFIG_4+1 + {triangles_2t[WIPE_T2_5], 2, 0, 0, 0}, /* 5 */ +#define WIPE_CONFIG_6 WIPE_CONFIG_5+1 + {triangles_2t[WIPE_T2_6], 2, 0, 0, 0}, /* 6 */ +#define WIPE_CONFIG_7 WIPE_CONFIG_6+1 + {triangles_8t[WIPE_T8_7], 8, 1, 1, 0}, /* 7 */ +#define WIPE_CONFIG_8 WIPE_CONFIG_7+1 + {triangles_16t[WIPE_T16_8], 16, 2, 2, 0}, /* 8 */ + +#define WIPE_CONFIG_21 WIPE_CONFIG_8+1 + {boxes_2b[WIPE_B2_21], 2, 1, 1, 0}, /* 21 */ +#define WIPE_CONFIG_22 WIPE_CONFIG_21+1 + {boxes_2b[WIPE_B2_22], 2, 1, 1, 0}, /* 22 */ + +#define WIPE_CONFIG_23 WIPE_CONFIG_22+1 + {triangles_3t[WIPE_T3_23], 3, 1, 1, 0}, /* 23 */ +#define WIPE_CONFIG_24 WIPE_CONFIG_23+1 + {triangles_3t[WIPE_T3_24], 3, 1, 1, 0}, /* 24 */ +#define WIPE_CONFIG_25 WIPE_CONFIG_24+1 + {triangles_3t[WIPE_T3_25], 3, 1, 1, 0}, /* 25 */ +#define WIPE_CONFIG_26 WIPE_CONFIG_25+1 + {triangles_3t[WIPE_T3_26], 3, 1, 1, 0}, /* 26 */ +#define WIPE_CONFIG_41 WIPE_CONFIG_26+1 + {triangles_2t[WIPE_T2_41], 2, 0, 0, 1}, /* 41 */ +#define WIPE_CONFIG_42 WIPE_CONFIG_41+1 + {triangles_2t[WIPE_T2_42], 2, 0, 0, 1}, /* 42 */ +#define WIPE_CONFIG_43 WIPE_CONFIG_42+1 + {triangles_8t[WIPE_T8_43], 8, 1, 1, 1}, /* 43 */ +#define WIPE_CONFIG_44 WIPE_CONFIG_43+1 + {triangles_8t[WIPE_T8_44], 8, 1, 1, 1}, /* 44 */ +#define WIPE_CONFIG_45 WIPE_CONFIG_44+1 + {triangles_2t[WIPE_T2_45], 2, 0, 0, 0}, /* 45 */ +#define WIPE_CONFIG_46 WIPE_CONFIG_45+1 + {triangles_2t[WIPE_T2_46], 2, 0, 0, 0}, /* 46 */ +#define WIPE_CONFIG_47 WIPE_CONFIG_46+1 + {triangles_8t[WIPE_T8_47], 8, 1, 1, 0}, /* 47 */ +#define WIPE_CONFIG_48 WIPE_CONFIG_47+1 + {triangles_8t[WIPE_T8_48], 8, 1, 1, 0}, /* 48 */ +#define WIPE_CONFIG_61 WIPE_CONFIG_48+1 + {triangles_4t[WIPE_T4_61], 4, 1, 1, 1}, /* 61 */ +#define WIPE_CONFIG_62 WIPE_CONFIG_61+1 + {triangles_4t[WIPE_T4_62], 4, 1, 1, 1}, /* 62 */ +#define WIPE_CONFIG_63 WIPE_CONFIG_62+1 + {triangles_4t[WIPE_T4_63], 4, 1, 1, 1}, /* 63 */ +#define WIPE_CONFIG_64 WIPE_CONFIG_63+1 + {triangles_4t[WIPE_T4_64], 4, 1, 1, 1}, /* 64 */ +#define WIPE_CONFIG_65 WIPE_CONFIG_64+1 + {triangles_4t[WIPE_T4_65], 4, 1, 1, 0}, /* 65 */ +#define WIPE_CONFIG_66 WIPE_CONFIG_65+1 + {triangles_4t[WIPE_T4_66], 4, 1, 1, 0}, /* 66 */ +#define WIPE_CONFIG_67 WIPE_CONFIG_66+1 + {triangles_4t[WIPE_T4_67], 4, 1, 1, 0}, /* 67 */ +#define WIPE_CONFIG_68 WIPE_CONFIG_67+1 + {triangles_4t[WIPE_T4_68], 4, 1, 1, 0}, /* 68 */ +#define WIPE_CONFIG_101 WIPE_CONFIG_68+1 + {triangles_4t[WIPE_T4_101], 4, 1, 1, 0}, /* 101 */ +#define WIPE_CONFIG_201 WIPE_CONFIG_101+1 + {box_clock_4b[WIPE_B4_201], 4, 1, 1, 2}, /* 201 */ +#define WIPE_CONFIG_202 WIPE_CONFIG_201+1 + {box_clock_4b[WIPE_B4_202], 4, 1, 1, 2}, /* 202 */ +#define WIPE_CONFIG_203 WIPE_CONFIG_202+1 + {box_clock_4b[WIPE_B4_203], 4, 1, 1, 2}, /* 203 */ +#define WIPE_CONFIG_204 WIPE_CONFIG_203+1 + {box_clock_4b[WIPE_B4_204], 4, 1, 1, 2}, /* 204 */ +#define WIPE_CONFIG_205 WIPE_CONFIG_204+1 + {box_clock_4b[WIPE_B4_205], 4, 1, 1, 1}, /* 205 */ +#define WIPE_CONFIG_206 WIPE_CONFIG_205+1 + {box_clock_4b[WIPE_B4_206], 4, 1, 1, 1}, /* 206 */ +#define WIPE_CONFIG_207 WIPE_CONFIG_206+1 + {box_clock_4b[WIPE_B4_207], 4, 1, 1, 0}, /* 207 */ +#define WIPE_CONFIG_211 WIPE_CONFIG_207+1 + {box_clock_4b[WIPE_B4_211], 4, 1, 1, 1}, /* 211 */ +#define WIPE_CONFIG_212 WIPE_CONFIG_211+1 + {box_clock_4b[WIPE_B4_212], 4, 1, 1, 1}, /* 212 */ +#define WIPE_CONFIG_213 WIPE_CONFIG_212+1 + {box_clock_4b[WIPE_B4_213], 4, 1, 1, 0}, /* 213 */ +#define WIPE_CONFIG_214 WIPE_CONFIG_213+1 + {box_clock_4b[WIPE_B4_214], 4, 1, 1, 0}, /* 214 */ +#define WIPE_CONFIG_221 WIPE_CONFIG_214+1 + {box_clock_2b[WIPE_B2_221], 2, 1, 1, 1}, /* 221 */ +#define WIPE_CONFIG_222 WIPE_CONFIG_221+1 + {box_clock_2b[WIPE_B2_222], 2, 1, 1, 1}, /* 222 */ +#define WIPE_CONFIG_223 WIPE_CONFIG_222+1 + {box_clock_2b[WIPE_B2_223], 2, 1, 1, 1}, /* 223 */ +#define WIPE_CONFIG_224 WIPE_CONFIG_223+1 + {box_clock_2b[WIPE_B2_224], 2, 1, 1, 1}, /* 224 */ +#define WIPE_CONFIG_225 WIPE_CONFIG_224+1 + {box_clock_2b[WIPE_B2_225], 2, 1, 1, 0}, /* 225 */ +#define WIPE_CONFIG_226 WIPE_CONFIG_225+1 + {box_clock_2b[WIPE_B2_226], 2, 1, 1, 0}, /* 226 */ +#define WIPE_CONFIG_227 WIPE_CONFIG_226+1 + {box_clock_4b[WIPE_B4_227], 4, 1, 1, 1}, /* 227 */ +#define WIPE_CONFIG_228 WIPE_CONFIG_227+1 + {box_clock_4b[WIPE_B4_228], 4, 1, 1, 1}, /* 228 */ +#define WIPE_CONFIG_231 WIPE_CONFIG_228+1 + {box_clock_2b[WIPE_B2_231], 2, 1, 1, 0}, /* 231 */ +#define WIPE_CONFIG_232 WIPE_CONFIG_231+1 + {box_clock_2b[WIPE_B2_232], 2, 1, 1, 0}, /* 232 */ +#define WIPE_CONFIG_233 WIPE_CONFIG_232+1 + {box_clock_2b[WIPE_B2_233], 2, 1, 1, 0}, /* 233 */ +#define WIPE_CONFIG_234 WIPE_CONFIG_233+1 + {box_clock_2b[WIPE_B2_234], 2, 1, 1, 0}, /* 234 */ +#define WIPE_CONFIG_235 WIPE_CONFIG_234+1 + {box_clock_4b[WIPE_B4_235], 4, 1, 1, 0}, /* 235 */ +#define WIPE_CONFIG_236 WIPE_CONFIG_235+1 + {box_clock_4b[WIPE_B4_236], 4, 1, 1, 0}, /* 236 */ +#define WIPE_CONFIG_241 WIPE_CONFIG_236+1 + {box_clock_1b[WIPE_B1_241], 1, 0, 0, 0}, /* 241 */ +#define WIPE_CONFIG_242 WIPE_CONFIG_241+1 + {box_clock_1b[WIPE_B1_242], 1, 0, 0, 0}, /* 242 */ +#define WIPE_CONFIG_243 WIPE_CONFIG_242+1 + {box_clock_1b[WIPE_B1_243], 1, 0, 0, 0}, /* 243 */ +#define WIPE_CONFIG_244 WIPE_CONFIG_243+1 + {box_clock_1b[WIPE_B1_244], 1, 0, 0, 0}, /* 244 */ +#define WIPE_CONFIG_245 WIPE_CONFIG_244+1 + {triangles_2t[WIPE_T2_245], 2, 1, 1, 0}, /* 245 */ +#define WIPE_CONFIG_246 WIPE_CONFIG_245+1 + {triangles_2t[WIPE_T2_246], 2, 1, 1, 0}, /* 246 */ +#define WIPE_CONFIG_251 WIPE_CONFIG_246+1 + {box_clock_2b[WIPE_B2_251], 2, 1, 1, 0}, /* 251 */ +#define WIPE_CONFIG_252 WIPE_CONFIG_251+1 + {box_clock_2b[WIPE_B2_252], 2, 1, 1, 0}, /* 252 */ +#define WIPE_CONFIG_253 WIPE_CONFIG_252+1 + {box_clock_2b[WIPE_B2_253], 2, 1, 1, 0}, /* 253 */ +#define WIPE_CONFIG_254 WIPE_CONFIG_253+1 + {box_clock_2b[WIPE_B2_254], 2, 1, 1, 0}, /* 254 */ + +#define WIPE_CONFIG_261 WIPE_CONFIG_254+1 + {box_clock_8b[WIPE_B8_261], 8, 2, 2, 2}, /* 261 */ +#define WIPE_CONFIG_262 WIPE_CONFIG_261+1 + {box_clock_8b[WIPE_B8_262], 8, 2, 2, 2}, /* 262 */ +#define WIPE_CONFIG_263 WIPE_CONFIG_262+1 + {box_clock_8b[WIPE_B8_263], 8, 2, 2, 1}, /* 263 */ +#define WIPE_CONFIG_264 WIPE_CONFIG_263+1 + {box_clock_8b[WIPE_B8_264], 8, 2, 2, 1}, /* 264 */ +}; + +static void +gst_wipe_boxes_draw (GstMask * mask) +{ + const GstWipeConfig *config = mask->user_data; + const gint *impacts = config->objects; + gint width = (mask->width >> config->xscale); + gint height = (mask->height >> config->yscale); + gint depth = (1 << mask->bpp) >> config->cscale; + + gint i; + + for (i = 0; i < config->nobjects; i++) { + switch (impacts[0]) { + case BOX_VERTICAL: + /* vbox does not draw last pixels */ + gst_smpte_paint_vbox (mask->data, mask->width, + impacts[1] * width, impacts[2] * height, impacts[3] * depth, + impacts[4] * width, impacts[5] * height, impacts[6] * depth); + impacts += 7; + break; + case BOX_HORIZONTAL: + /* hbox does not draw last pixels */ + gst_smpte_paint_hbox (mask->data, mask->width, + impacts[1] * width, impacts[2] * height, impacts[3] * depth, + impacts[4] * width, impacts[5] * height, impacts[6] * depth); + impacts += 7; + break; + case BOX_CLOCK: + { + gint x0, y0, x1, y1, x2, y2; + + /* make sure not to draw outside the area */ + x0 = MIN (impacts[1] * width, mask->width - 1); + y0 = MIN (impacts[2] * height, mask->height - 1); + x1 = MIN (impacts[4] * width, mask->width - 1); + y1 = MIN (impacts[5] * height, mask->height - 1); + x2 = MIN (impacts[7] * width, mask->width - 1); + y2 = MIN (impacts[8] * height, mask->height - 1); + + gst_smpte_paint_box_clock (mask->data, mask->width, + x0, y0, impacts[3] * depth, x1, y1, impacts[6] * depth, + x2, y2, impacts[9] * depth); + impacts += 10; + } + default: + break; + } + } +} + +static void +gst_wipe_triangles_clock_draw (GstMask * mask) +{ + const GstWipeConfig *config = mask->user_data; + const gint *impacts = config->objects; + gint width = (mask->width >> config->xscale); + gint height = (mask->height >> config->yscale); + gint depth = (1 << mask->bpp) >> config->cscale; + gint i; + + for (i = 0; i < config->nobjects; i++) { + gint x0, y0, x1, y1, x2, y2; + + /* make sure not to draw outside the area */ + x0 = MIN (impacts[0] * width, mask->width - 1); + y0 = MIN (impacts[1] * height, mask->height - 1); + x1 = MIN (impacts[3] * width, mask->width - 1); + y1 = MIN (impacts[4] * height, mask->height - 1); + x2 = MIN (impacts[6] * width, mask->width - 1); + y2 = MIN (impacts[7] * height, mask->height - 1); + + gst_smpte_paint_triangle_clock (mask->data, mask->width, + x0, y0, impacts[2] * depth, x1, y1, impacts[5] * depth, + x2, y2, impacts[8] * depth); + impacts += 9; + } +} + +static void +gst_wipe_triangles_draw (GstMask * mask) +{ + const GstWipeConfig *config = mask->user_data; + const gint *impacts = config->objects; + gint width = (mask->width >> config->xscale); + gint height = (mask->height >> config->yscale); + gint depth = (1 << mask->bpp) >> config->cscale; + + gint i; + + for (i = 0; i < config->nobjects; i++) { + gint x0, y0, x1, y1, x2, y2; + + /* make sure not to draw outside the area */ + x0 = MIN (impacts[0] * width, mask->width - 1); + y0 = MIN (impacts[1] * height, mask->height - 1); + x1 = MIN (impacts[3] * width, mask->width - 1); + y1 = MIN (impacts[4] * height, mask->height - 1); + x2 = MIN (impacts[6] * width, mask->width - 1); + y2 = MIN (impacts[7] * height, mask->height - 1); + + gst_smpte_paint_triangle_linear (mask->data, mask->width, + x0, y0, impacts[2] * depth, x1, y1, impacts[5] * depth, + x2, y2, impacts[8] * depth); + impacts += 9; + } +} + +/* see also: + * http://www.w3c.rl.ac.uk/pasttalks/slidemaker/XML_Multimedia/htmls/transitions.html + */ +static const GstMaskDefinition definitions[] = { + {1, "bar-wipe-lr", + "A bar moves from left to right", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_1]}, + {2, "bar-wipe-tb", + "A bar moves from top to bottom", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_2]}, + {3, "box-wipe-tl", + "A box expands from the upper-left corner to the lower-right corner", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_3]}, + {4, "box-wipe-tr", + "A box expands from the upper-right corner to the lower-left corner", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_4]}, + {5, "box-wipe-br", + "A box expands from the lower-right corner to the upper-left corner", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_5]}, + {6, "box-wipe-bl", + "A box expands from the lower-left corner to the upper-right corner", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_6]}, + {7, "four-box-wipe-ci", + "A box shape expands from each of the four corners toward the center", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_7]}, + {8, "four-box-wipe-co", + "A box shape expands from the center of each quadrant toward the corners of each quadrant", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_8]}, + {21, "barndoor-v", + "A central, vertical line splits and expands toward the left and right edges", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_21]}, + {22, "barndoor-h", + "A central, horizontal line splits and expands toward the top and bottom edges", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_22]}, + {23, "box-wipe-tc", + "A box expands from the top edge's midpoint to the bottom corners", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_23]}, + {24, "box-wipe-rc", + "A box expands from the right edge's midpoint to the left corners", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_24]}, + {25, "box-wipe-bc", + "A box expands from the bottom edge's midpoint to the top corners", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_25]}, + {26, "box-wipe-lc", + "A box expands from the left edge's midpoint to the right corners", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_26]}, + {41, "diagonal-tl", + "A diagonal line moves from the upper-left corner to the lower-right corner", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_41]}, + {42, "diagonal-tr", + "A diagonal line moves from the upper right corner to the lower-left corner", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_42]}, + {43, "bowtie-v", + "Two wedge shapes slide in from the top and bottom edges toward the center", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_43]}, + {44, "bowtie-h", + "Two wedge shapes slide in from the left and right edges toward the center", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_44]}, + {45, "barndoor-dbl", + "A diagonal line from the lower-left to upper-right corners splits and expands toward the opposite corners", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_45]}, + {46, "barndoor-dtl", + "A diagonal line from upper-left to lower-right corners splits and expands toward the opposite corners", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_46]}, + {47, "misc-diagonal-dbd", + "Four wedge shapes split from the center and retract toward the four edges", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_47]}, + {48, "misc-diagonal-dd", + "A diamond connecting the four edge midpoints simultaneously contracts toward the center and expands toward the edges", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_48]}, + {61, "vee-d", + "A wedge shape moves from top to bottom", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_61]}, + {62, "vee-l", + "A wedge shape moves from right to left", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_62]}, + {63, "vee-u", + "A wedge shape moves from bottom to top", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_63]}, + {64, "vee-r", + "A wedge shape moves from left to right", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_64]}, + {65, "barnvee-d", + "A 'V' shape extending from the bottom edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_65]}, + {66, "barnvee-l", + "A 'V' shape extending from the left edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_66]}, + {67, "barnvee-u", + "A 'V' shape extending from the top edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_67]}, + {68, "barnvee-r", + "A 'V' shape extending from the right edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_68]}, + {101, "iris-rect", + "A rectangle expands from the center.", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_101]}, + {201, "clock-cw12", + "A radial hand sweeps clockwise from the twelve o'clock position", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_201]}, + {202, "clock-cw3", + "A radial hand sweeps clockwise from the three o'clock position", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_202]}, + {203, "clock-cw6", + "A radial hand sweeps clockwise from the six o'clock position", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_203]}, + {204, "clock-cw9", + "A radial hand sweeps clockwise from the nine o'clock position", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_204]}, + {205, "pinwheel-tbv", + "Two radial hands sweep clockwise from the twelve and six o'clock positions", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_205]}, + {206, "pinwheel-tbh", + "Two radial hands sweep clockwise from the nine and three o'clock positions", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_206]}, + {207, "pinwheel-fb", + "Four radial hands sweep clockwise", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_207]}, + {211, "fan-ct", + "A fan unfolds from the top edge, the fan axis at the center", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_211]}, + {212, "fan-cr", + "A fan unfolds from the right edge, the fan axis at the center", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_212]}, + {213, "doublefan-fov", + "Two fans, their axes at the center, unfold from the top and bottom", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_213]}, + {214, "doublefan-foh", + "Two fans, their axes at the center, unfold from the left and right", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_214]}, + {221, "singlesweep-cwt", + "A radial hand sweeps clockwise from the top edge's midpoint", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_221]}, + {222, "singlesweep-cwr", + "A radial hand sweeps clockwise from the right edge's midpoint", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_222]}, + {223, "singlesweep-cwb", + "A radial hand sweeps clockwise from the bottom edge's midpoint", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_223]}, + {224, "singlesweep-cwl", + "A radial hand sweeps clockwise from the left edge's midpoint", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_224]}, + {225, "doublesweep-pv", + "Two radial hands sweep clockwise and counter-clockwise from the top and bottom edges' midpoints", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_225]}, + {226, "doublesweep-pd", + "Two radial hands sweep clockwise and counter-clockwise from the left and right edges' midpoints", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_226]}, + {227, "doublesweep-ov", + "Two radial hands attached at the top and bottom edges' midpoints sweep from right to left", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_227]}, + {228, "doublesweep-oh", + "Two radial hands attached at the left and right edges' midpoints sweep from top to bottom", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_228]}, + {231, "fan-t", + "A fan unfolds from the bottom, the fan axis at the top edge's midpoint", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_231]}, + {232, "fan-r", + "A fan unfolds from the left, the fan axis at the right edge's midpoint", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_232]}, + {233, "fan-b", + "A fan unfolds from the top, the fan axis at the bottom edge's midpoint", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_233]}, + {234, "fan-l", + "A fan unfolds from the right, the fan axis at the left edge's midpoint", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_234]}, + {235, "doublefan-fiv", + "Two fans, their axes at the top and bottom, unfold from the center", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_235]}, + {236, "doublefan-fih", + "Two fans, their axes at the left and right, unfold from the center", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_236]}, + {241, "singlesweep-cwtl", + "A radial hand sweeps clockwise from the upper-left corner", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_241]}, + {242, "singlesweep-cwbl", + "A radial hand sweeps counter-clockwise from the lower-left corner.", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_242]}, + {243, "singlesweep-cwbr", + "A radial hand sweeps clockwise from the lower-right corner", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_243]}, + {244, "singlesweep-cwtr", + "A radial hand sweeps counter-clockwise from the upper-right corner", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_244]}, + {245, "doublesweep-pdtl", + "Two radial hands attached at the upper-left and lower-right corners sweep down and up", + gst_wipe_triangles_clock_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_245]}, + {246, "doublesweep-pdbl", + "Two radial hands attached at the lower-left and upper-right corners sweep down and up", + gst_wipe_triangles_clock_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_246]}, + {251, "saloondoor-t", + "Two radial hands attached at the upper-left and upper-right corners sweep down", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_251]}, + {252, "saloondoor-l", + "Two radial hands attached at the upper-left and lower-left corners sweep to the right", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_252]}, + {253, "saloondoor-b", + "Two radial hands attached at the lower-left and lower-right corners sweep up", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_253]}, + {254, "saloondoor-r", + "Two radial hands attached at the upper-right and lower-right corners sweep to the left", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_254]}, + {261, "windshield-r", + "Two radial hands attached at the midpoints of the top and bottom halves sweep from right to left", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_261]}, + {262, "windshield-u", + "Two radial hands attached at the midpoints of the left and right halves sweep from top to bottom", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_262]}, + {263, "windshield-v", + "Two sets of radial hands attached at the midpoints of the top and bottom halves sweep from top to bottom and bottom to top", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_263]}, + {264, "windshield-h", + "Two sets of radial hands attached at the midpoints of the left and right halves sweep from left to right and right to left", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_264]}, + {0, NULL, NULL, NULL} +}; + +void +_gst_barboxwipes_register (void) +{ + gint i = 0; + + while (definitions[i].short_name) { + _gst_mask_register (&definitions[i]); + i++; + } +} diff --git a/gst/smpte/gstmask.c b/gst/smpte/gstmask.c new file mode 100644 index 0000000..940bf82 --- /dev/null +++ b/gst/smpte/gstmask.c @@ -0,0 +1,121 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 "gstmask.h" +#include "paint.h" + +static GList *masks = NULL; + +void +_gst_mask_init (void) +{ + _gst_barboxwipes_register (); +} + +static gint +gst_mask_compare (GstMaskDefinition * def1, GstMaskDefinition * def2) +{ + return (def1->type - def2->type); +} + +void +_gst_mask_register (const GstMaskDefinition * definition) +{ + masks = + g_list_insert_sorted (masks, (gpointer) definition, + (GCompareFunc) gst_mask_compare); +} + +const GList * +gst_mask_get_definitions (void) +{ + return masks; +} + +static GstMaskDefinition * +gst_mask_find_definition (gint type) +{ + GList *walk = masks; + + while (walk) { + GstMaskDefinition *def = (GstMaskDefinition *) walk->data; + + if (def->type == type) + return def; + + walk = g_list_next (walk); + } + return NULL; +} + +GstMask * +gst_mask_factory_new (gint type, gboolean invert, gint bpp, gint width, + gint height) +{ + GstMaskDefinition *definition; + GstMask *mask = NULL; + + definition = gst_mask_find_definition (type); + if (definition) { + mask = g_new0 (GstMask, 1); + + mask->type = definition->type; + mask->bpp = bpp; + mask->width = width; + mask->height = height; + mask->destroy_func = definition->destroy_func; + mask->user_data = definition->user_data; + mask->data = g_malloc (width * height * sizeof (guint32)); + + definition->draw_func (mask); + + if (invert) { + gint i, j; + guint32 *datap = mask->data; + guint32 max = (1 << bpp); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + *datap = max - *datap; + datap++; + } + } + } + } + + return mask; +} + +void +_gst_mask_default_destroy (GstMask * mask) +{ + g_free (mask->data); + g_free (mask); +} + +void +gst_mask_destroy (GstMask * mask) +{ + if (mask->destroy_func) + mask->destroy_func (mask); +} diff --git a/gst/smpte/gstmask.h b/gst/smpte/gstmask.h new file mode 100644 index 0000000..576475c --- /dev/null +++ b/gst/smpte/gstmask.h @@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_MASK_H__ +#define __GST_MASK_H__ + +#include + +typedef struct _GstMask GstMask; +typedef struct _GstMaskDefinition GstMaskDefinition; + +typedef void (*GstMaskDrawFunc) (GstMask *mask); +typedef void (*GstMaskDestroyFunc) (GstMask *mask); + +struct _GstMaskDefinition { + gint type; + const gchar *short_name; + const gchar *long_name; + GstMaskDrawFunc draw_func; + GstMaskDestroyFunc destroy_func; + gconstpointer user_data; +}; + +struct _GstMask { + gint type; + guint32 *data; + gconstpointer user_data; + + gint width; + gint height; + gint bpp; + + GstMaskDestroyFunc destroy_func; +}; + +void _gst_mask_init (void); +void _gst_mask_register (const GstMaskDefinition *definition); + +void _gst_mask_default_destroy (GstMask *mask); + +const GList* gst_mask_get_definitions (void); +GstMask* gst_mask_factory_new (gint type, gboolean invert, gint bpp, gint width, gint height); +void gst_mask_destroy (GstMask *mask); + +void _gst_barboxwipes_register (void); + +#endif /* __GST_MASK_H__ */ diff --git a/gst/smpte/gstsmpte.c b/gst/smpte/gstsmpte.c new file mode 100644 index 0000000..4b21cd0 --- /dev/null +++ b/gst/smpte/gstsmpte.c @@ -0,0 +1,655 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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-smpte + * + * smpte can accept I420 video streams with the same width, height and + * framerate. The two incomming buffers are blended together using an effect + * specific alpha mask. + * + * The #GstSmpte:depth property defines the presision in bits of the mask. A + * higher presision will create a mask with smoother gradients in order to avoid + * banding. + * + * + * Sample pipelines + * |[ + * gst-launch -v videotestsrc pattern=1 ! smpte name=s border=20000 type=234 duration=2000000000 ! ffmpegcolorspace ! ximagesink videotestsrc ! s. + * ]| A pipeline to demonstrate the smpte transition. + * It shows a pinwheel transition a from a snow videotestsrc to an smpte + * pattern videotestsrc. The transition will take 2 seconds to complete. The + * edges of the transition are smoothed with a 20000 big border. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include "gstsmpte.h" +#include +#include "paint.h" + +GST_DEBUG_CATEGORY_STATIC (gst_smpte_debug); +#define GST_CAT_DEFAULT gst_smpte_debug + +static GstStaticPadTemplate gst_smpte_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); + +static GstStaticPadTemplate gst_smpte_sink1_template = +GST_STATIC_PAD_TEMPLATE ("sink1", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); + +static GstStaticPadTemplate gst_smpte_sink2_template = +GST_STATIC_PAD_TEMPLATE ("sink2", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); + + +/* SMPTE signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_PROP_TYPE 1 +#define DEFAULT_PROP_BORDER 0 +#define DEFAULT_PROP_DEPTH 16 +#define DEFAULT_PROP_FPS 0. +#define DEFAULT_PROP_DURATION GST_SECOND +#define DEFAULT_PROP_INVERT FALSE + +enum +{ + PROP_0, + PROP_TYPE, + PROP_BORDER, + PROP_DEPTH, + PROP_FPS, + PROP_DURATION, + PROP_INVERT, + PROP_LAST, +}; + +#define I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) +#define I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) +#define I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(I420_Y_ROWSTRIDE(width)))/2) + +#define I420_Y_OFFSET(w,h) (0) +#define I420_U_OFFSET(w,h) (I420_Y_OFFSET(w,h)+(I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) +#define I420_V_OFFSET(w,h) (I420_U_OFFSET(w,h)+(I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + +#define I420_SIZE(w,h) (I420_V_OFFSET(w,h)+(I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) + + +#define GST_TYPE_SMPTE_TRANSITION_TYPE (gst_smpte_transition_type_get_type()) +static GType +gst_smpte_transition_type_get_type (void) +{ + static GType smpte_transition_type = 0; + GEnumValue *smpte_transitions; + + if (!smpte_transition_type) { + const GList *definitions; + gint i = 0; + + definitions = gst_mask_get_definitions (); + smpte_transitions = + g_new0 (GEnumValue, g_list_length ((GList *) definitions) + 1); + + while (definitions) { + GstMaskDefinition *definition = (GstMaskDefinition *) definitions->data; + + definitions = g_list_next (definitions); + + smpte_transitions[i].value = definition->type; + /* older GLib versions have the two fields as non-const, hence the cast */ + smpte_transitions[i].value_nick = (gchar *) definition->short_name; + smpte_transitions[i].value_name = (gchar *) definition->long_name; + + i++; + } + + smpte_transition_type = + g_enum_register_static ("GstSMPTETransitionType", smpte_transitions); + } + return smpte_transition_type; +} + + +static void gst_smpte_class_init (GstSMPTEClass * klass); +static void gst_smpte_base_init (GstSMPTEClass * klass); +static void gst_smpte_init (GstSMPTE * smpte); +static void gst_smpte_finalize (GstSMPTE * smpte); + +static GstFlowReturn gst_smpte_collected (GstCollectPads * pads, + GstSMPTE * smpte); + +static void gst_smpte_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_smpte_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstStateChangeReturn gst_smpte_change_state (GstElement * element, + GstStateChange transition); + +static GstElementClass *parent_class = NULL; + +/*static guint gst_smpte_signals[LAST_SIGNAL] = { 0 }; */ + +static GType +gst_smpte_get_type (void) +{ + static GType smpte_type = 0; + + if (!smpte_type) { + static const GTypeInfo smpte_info = { + sizeof (GstSMPTEClass), + (GBaseInitFunc) gst_smpte_base_init, + NULL, + (GClassInitFunc) gst_smpte_class_init, + NULL, + NULL, + sizeof (GstSMPTE), + 0, + (GInstanceInitFunc) gst_smpte_init, + }; + + smpte_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSMPTE", &smpte_info, 0); + } + return smpte_type; +} + +static void +gst_smpte_base_init (GstSMPTEClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_smpte_sink1_template); + gst_element_class_add_static_pad_template (element_class, + &gst_smpte_sink2_template); + gst_element_class_add_static_pad_template (element_class, + &gst_smpte_src_template); + gst_element_class_set_details_simple (element_class, "SMPTE transitions", + "Filter/Editor/Video", + "Apply the standard SMPTE transitions on video images", + "Wim Taymans "); +} + +static void +gst_smpte_class_init (GstSMPTEClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_smpte_set_property; + gobject_class->get_property = gst_smpte_get_property; + gobject_class->finalize = (GObjectFinalizeFunc) gst_smpte_finalize; + + _gst_mask_init (); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TYPE, + g_param_spec_enum ("type", "Type", "The type of transition to use", + GST_TYPE_SMPTE_TRANSITION_TYPE, DEFAULT_PROP_TYPE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FPS, + g_param_spec_float ("fps", "FPS", + "Frames per second if no input files are given (deprecated)", 0., + G_MAXFLOAT, DEFAULT_PROP_FPS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BORDER, + g_param_spec_int ("border", "Border", + "The border width of the transition", 0, G_MAXINT, + DEFAULT_PROP_BORDER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEPTH, + g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", 1, 24, + DEFAULT_PROP_DEPTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DURATION, + g_param_spec_uint64 ("duration", "Duration", + "Duration of the transition effect in nanoseconds", 0, G_MAXUINT64, + DEFAULT_PROP_DURATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_INVERT, + g_param_spec_boolean ("invert", "Invert", + "Invert transition mask", DEFAULT_PROP_INVERT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_smpte_change_state); +} + +/* wht yel cya grn mag red blu blk -I Q */ +static const int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 0 }; +static const int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 0, 128 }; +static const int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 128, 255 }; + +static void +fill_i420 (guint8 * data, gint width, gint height, gint color) +{ + gint size = I420_Y_ROWSTRIDE (width) * GST_ROUND_UP_2 (height); + gint size4 = size >> 2; + guint8 *yp = data; + guint8 *up = data + I420_U_OFFSET (width, height); + guint8 *vp = data + I420_V_OFFSET (width, height); + + memset (yp, y_colors[color], size); + memset (up, u_colors[color], size4); + memset (vp, v_colors[color], size4); +} + +static gboolean +gst_smpte_update_mask (GstSMPTE * smpte, gint type, gboolean invert, + gint depth, gint width, gint height) +{ + GstMask *newmask; + + if (smpte->mask) { + if (smpte->type == type && + smpte->invert == invert && + smpte->depth == depth && + smpte->width == width && smpte->height == height) + return TRUE; + } + + newmask = gst_mask_factory_new (type, invert, depth, width, height); + if (newmask) { + if (smpte->mask) { + gst_mask_destroy (smpte->mask); + } + smpte->mask = newmask; + smpte->type = type; + smpte->invert = invert; + smpte->depth = depth; + smpte->width = width; + smpte->height = height; + + return TRUE; + } + return FALSE; +} + +static gboolean +gst_smpte_setcaps (GstPad * pad, GstCaps * caps) +{ + GstSMPTE *smpte; + GstStructure *structure; + gboolean ret; + + smpte = GST_SMPTE (GST_PAD_PARENT (pad)); + + structure = gst_caps_get_structure (caps, 0); + + ret = gst_structure_get_int (structure, "width", &smpte->width); + ret &= gst_structure_get_int (structure, "height", &smpte->height); + ret &= gst_structure_get_fraction (structure, "framerate", + &smpte->fps_num, &smpte->fps_denom); + if (!ret) + return FALSE; + + /* for backward compat, we store these here */ + smpte->fps = ((gdouble) smpte->fps_num) / smpte->fps_denom; + + /* figure out the duration in frames */ + smpte->end_position = gst_util_uint64_scale (smpte->duration, + smpte->fps_num, GST_SECOND * smpte->fps_denom); + + GST_DEBUG_OBJECT (smpte, "duration: %d frames", smpte->end_position); + + ret = + gst_smpte_update_mask (smpte, smpte->type, smpte->invert, smpte->depth, + smpte->width, smpte->height); + + return ret; +} + +static void +gst_smpte_init (GstSMPTE * smpte) +{ + smpte->sinkpad1 = + gst_pad_new_from_static_template (&gst_smpte_sink1_template, "sink1"); + gst_pad_set_setcaps_function (smpte->sinkpad1, + GST_DEBUG_FUNCPTR (gst_smpte_setcaps)); + gst_pad_set_getcaps_function (smpte->sinkpad1, + GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); + gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad1); + + smpte->sinkpad2 = + gst_pad_new_from_static_template (&gst_smpte_sink2_template, "sink2"); + gst_pad_set_setcaps_function (smpte->sinkpad2, + GST_DEBUG_FUNCPTR (gst_smpte_setcaps)); + gst_pad_set_getcaps_function (smpte->sinkpad2, + GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); + gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad2); + + smpte->srcpad = + gst_pad_new_from_static_template (&gst_smpte_src_template, "src"); + gst_element_add_pad (GST_ELEMENT (smpte), smpte->srcpad); + + smpte->collect = gst_collect_pads_new (); + gst_collect_pads_set_function (smpte->collect, + (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_smpte_collected), smpte); + gst_collect_pads_start (smpte->collect); + + gst_collect_pads_add_pad (smpte->collect, smpte->sinkpad1, + sizeof (GstCollectData)); + gst_collect_pads_add_pad (smpte->collect, smpte->sinkpad2, + sizeof (GstCollectData)); + + smpte->fps = DEFAULT_PROP_FPS; + smpte->type = DEFAULT_PROP_TYPE; + smpte->border = DEFAULT_PROP_BORDER; + smpte->depth = DEFAULT_PROP_DEPTH; + smpte->duration = DEFAULT_PROP_DURATION; + smpte->invert = DEFAULT_PROP_INVERT; + smpte->fps_num = 0; + smpte->fps_denom = 1; +} + +static void +gst_smpte_finalize (GstSMPTE * smpte) +{ + if (smpte->collect) { + gst_object_unref (smpte->collect); + } + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) smpte); +} + +static void +gst_smpte_reset (GstSMPTE * smpte) +{ + smpte->width = -1; + smpte->height = -1; + smpte->position = 0; + smpte->end_position = 0; +} + +static void +gst_smpte_blend_i420 (guint8 * in1, guint8 * in2, guint8 * out, GstMask * mask, + gint width, gint height, gint border, gint pos) +{ + guint32 *maskp; + gint value; + gint i, j; + gint min, max; + guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv; + gint lumsize = width * height; + gint chromsize = lumsize >> 2; + + if (border == 0) + border++; + + min = pos - border; + max = pos; + + in1u = in1 + lumsize; + in1v = in1u + chromsize; + in2u = in2 + lumsize; + in2v = in2u + chromsize; + outu = out + lumsize; + outv = outu + chromsize; + + maskp = mask->data; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + value = *maskp++; + value = ((CLAMP (value, min, max) - min) << 8) / border; + + *out++ = ((*in1++ * value) + (*in2++ * (256 - value))) >> 8; + if (!(i & 1) && !(j & 1)) { + *outu++ = ((*in1u++ * value) + (*in2u++ * (256 - value))) >> 8; + *outv++ = ((*in1v++ * value) + (*in2v++ * (256 - value))) >> 8; + } + } + } +} + +static GstFlowReturn +gst_smpte_collected (GstCollectPads * pads, GstSMPTE * smpte) +{ + GstBuffer *outbuf; + GstClockTime ts; + GstBuffer *in1 = NULL, *in2 = NULL; + GSList *collected; + + if (G_UNLIKELY (smpte->fps_num == 0)) + goto not_negotiated; + + if (!GST_PAD_CAPS (smpte->sinkpad1) || !GST_PAD_CAPS (smpte->sinkpad2)) + goto not_negotiated; + + ts = gst_util_uint64_scale_int (smpte->position * GST_SECOND, + smpte->fps_denom, smpte->fps_num); + + for (collected = pads->data; collected; collected = g_slist_next (collected)) { + GstCollectData *data; + + data = (GstCollectData *) collected->data; + + if (data->pad == smpte->sinkpad1) + in1 = gst_collect_pads_pop (pads, data); + else if (data->pad == smpte->sinkpad2) + in2 = gst_collect_pads_pop (pads, data); + } + + if (in1 == NULL) { + /* if no input, make picture black */ + in1 = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height)); + fill_i420 (GST_BUFFER_DATA (in1), smpte->width, smpte->height, 7); + } + if (in2 == NULL) { + /* if no input, make picture white */ + in2 = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height)); + fill_i420 (GST_BUFFER_DATA (in2), smpte->width, smpte->height, 0); + } + + if (GST_BUFFER_SIZE (in1) != GST_BUFFER_SIZE (in2)) + goto input_formats_do_not_match; + + if (smpte->position < smpte->end_position) { + outbuf = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height)); + + /* set caps if not done yet */ + if (!GST_PAD_CAPS (smpte->srcpad)) { + GstCaps *caps; + + caps = + gst_caps_copy (gst_static_caps_get + (&gst_smpte_src_template.static_caps)); + gst_caps_set_simple (caps, "width", G_TYPE_INT, smpte->width, "height", + G_TYPE_INT, smpte->height, "framerate", GST_TYPE_FRACTION, + smpte->fps_num, smpte->fps_denom, NULL); + + gst_pad_set_caps (smpte->srcpad, caps); + + gst_pad_push_event (smpte->srcpad, + gst_event_new_new_segment_full (FALSE, + 1.0, 1.0, GST_FORMAT_TIME, 0, -1, 0)); + + } + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smpte->srcpad)); + + gst_smpte_blend_i420 (GST_BUFFER_DATA (in1), + GST_BUFFER_DATA (in2), + GST_BUFFER_DATA (outbuf), + smpte->mask, smpte->width, smpte->height, + smpte->border, + ((1 << smpte->depth) + smpte->border) * + smpte->position / smpte->end_position); + + } else { + outbuf = in2; + gst_buffer_ref (in2); + } + + smpte->position++; + + if (in1) + gst_buffer_unref (in1); + if (in2) + gst_buffer_unref (in2); + + GST_BUFFER_TIMESTAMP (outbuf) = ts; + + return gst_pad_push (smpte->srcpad, outbuf); + + /* ERRORS */ +not_negotiated: + { + GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), + ("No input format negotiated")); + return GST_FLOW_NOT_NEGOTIATED; + } +input_formats_do_not_match: + { + GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), + ("input formats don't match: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, + GST_PAD_CAPS (smpte->sinkpad1), GST_PAD_CAPS (smpte->sinkpad2))); + return GST_FLOW_ERROR; + } +} + +static void +gst_smpte_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSMPTE *smpte; + + smpte = GST_SMPTE (object); + + switch (prop_id) { + case PROP_TYPE: + smpte->type = g_value_get_enum (value); + break; + case PROP_BORDER: + smpte->border = g_value_get_int (value); + break; + case PROP_FPS: + smpte->fps = g_value_get_float (value); + break; + case PROP_DEPTH: + smpte->depth = g_value_get_int (value); + break; + case PROP_DURATION: + smpte->duration = g_value_get_uint64 (value); + break; + case PROP_INVERT: + smpte->invert = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_smpte_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstSMPTE *smpte; + + smpte = GST_SMPTE (object); + + switch (prop_id) { + case PROP_TYPE: + g_value_set_enum (value, smpte->type); + break; + case PROP_FPS: + g_value_set_float (value, smpte->fps); + break; + case PROP_BORDER: + g_value_set_int (value, smpte->border); + break; + case PROP_DEPTH: + g_value_set_int (value, smpte->depth); + break; + case PROP_DURATION: + g_value_set_uint64 (value, smpte->duration); + break; + case PROP_INVERT: + g_value_set_boolean (value, smpte->invert); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_smpte_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstSMPTE *smpte; + + smpte = GST_SMPTE (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_smpte_reset (smpte); + GST_LOG_OBJECT (smpte, "starting collectpads"); + gst_collect_pads_start (smpte->collect); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_LOG_OBJECT (smpte, "stopping collectpads"); + gst_collect_pads_stop (smpte->collect); + break; + default: + break; + } + + ret = parent_class->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_smpte_reset (smpte); + break; + default: + break; + } + return ret; +} + +gboolean +gst_smpte_plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_smpte_debug, "smpte", 0, + "SMPTE transition effect"); + + return gst_element_register (plugin, "smpte", GST_RANK_NONE, GST_TYPE_SMPTE); +} diff --git a/gst/smpte/gstsmpte.h b/gst/smpte/gstsmpte.h new file mode 100644 index 0000000..dc6bc6d --- /dev/null +++ b/gst/smpte/gstsmpte.h @@ -0,0 +1,82 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_SMPTE_H__ +#define __GST_SMPTE_H__ + +#include +#include + +G_BEGIN_DECLS + +#include "gstmask.h" + +#define GST_TYPE_SMPTE \ + (gst_smpte_get_type()) +#define GST_SMPTE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMPTE,GstSMPTE)) +#define GST_SMPTE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMPTE,GstSMPTEClass)) +#define GST_IS_SMPTE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMPTE)) +#define GST_IS_SMPTE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMPTE)) + +typedef struct _GstSMPTE GstSMPTE; +typedef struct _GstSMPTEClass GstSMPTEClass; + +struct _GstSMPTE { + GstElement element; + + /* pads */ + GstPad *srcpad, + *sinkpad1, + *sinkpad2; + GstCollectPads *collect; + + /* properties */ + gint type; + gint border; + gint depth; + guint64 duration; + gboolean invert; + + /* negotiated format */ + gint format; + gint width; + gint height; + gdouble fps; + gint fps_num; + gint fps_denom; + + /* state of the effect */ + gint position; + gint end_position; + GstMask *mask; +}; + +struct _GstSMPTEClass { + GstElementClass parent_class; +}; + +gboolean gst_smpte_plugin_init (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_SMPTE_H__ */ diff --git a/gst/smpte/gstsmptealpha.c b/gst/smpte/gstsmptealpha.c new file mode 100644 index 0000000..3fb9ca8 --- /dev/null +++ b/gst/smpte/gstsmptealpha.c @@ -0,0 +1,753 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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-smptealpha + * + * smptealpha can accept an I420 or AYUV video stream. An alpha channel is added + * using an effect specific SMPTE mask in the I420 input case. In the AYUV case, + * the alpha channel is modified using the effect specific SMPTE mask. + * + * The #GstSmpteAlpha:position property is a controllabe double between 0.0 and + * 1.0 that specifies the position in the transition. 0.0 is the start of the + * transition with the alpha channel to complete opaque where 1.0 has the alpha + * channel set to completely transparent. + * + * The #GstSmpteAlpha:depth property defines the precision in bits of the mask. + * A higher presision will create a mask with smoother gradients in order to + * avoid banding. + * + * + * Sample pipelines + * + * Here is a pipeline to demonstrate the smpte transition : + * + * gst-launch -v videotestsrc ! smptealpha border=20000 type=44 + * position=0.5 ! videomixer ! ffmpegcolorspace ! ximagesink + * + * This shows a midway bowtie-h transition a from a videotestsrc to a + * transparent image. The edges of the transition are smoothed with a + * 20000 big border. + * + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#include + +#include "gstsmptealpha.h" +#include "paint.h" + +GST_DEBUG_CATEGORY_STATIC (gst_smpte_alpha_debug); +#define GST_CAT_DEFAULT gst_smpte_alpha_debug + +static GstStaticPadTemplate gst_smpte_alpha_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ARGB) + ); + +static GstStaticPadTemplate gst_smpte_alpha_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") + ";" GST_VIDEO_CAPS_YUV ("AYUV") + ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_RGBA + ";" GST_VIDEO_CAPS_ARGB) + ); + +/* SMPTE signals and properties */ + +#define DEFAULT_PROP_TYPE 1 +#define DEFAULT_PROP_BORDER 0 +#define DEFAULT_PROP_DEPTH 16 +#define DEFAULT_PROP_POSITION 0.0 +#define DEFAULT_PROP_INVERT FALSE + +enum +{ + PROP_0, + PROP_TYPE, + PROP_BORDER, + PROP_DEPTH, + PROP_POSITION, + PROP_INVERT, + PROP_LAST, +}; + +#define AYUV_SIZE(w,h) ((w) * (h) * 4) + +#define GST_TYPE_SMPTE_TRANSITION_TYPE (gst_smpte_alpha_transition_type_get_type()) +static GType +gst_smpte_alpha_transition_type_get_type (void) +{ + static GType smpte_transition_type = 0; + GEnumValue *smpte_transitions; + + if (!smpte_transition_type) { + const GList *definitions; + gint i = 0; + + definitions = gst_mask_get_definitions (); + smpte_transitions = + g_new0 (GEnumValue, g_list_length ((GList *) definitions) + 1); + + while (definitions) { + GstMaskDefinition *definition = (GstMaskDefinition *) definitions->data; + + definitions = g_list_next (definitions); + + smpte_transitions[i].value = definition->type; + /* older GLib versions have the two fields as non-const, hence the cast */ + smpte_transitions[i].value_nick = (gchar *) definition->short_name; + smpte_transitions[i].value_name = (gchar *) definition->long_name; + + i++; + } + + smpte_transition_type = + g_enum_register_static ("GstSMPTEAlphaTransitionType", + smpte_transitions); + } + return smpte_transition_type; +} + + +static void gst_smpte_alpha_finalize (GstSMPTEAlpha * smpte); + +static void gst_smpte_alpha_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_smpte_alpha_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_smpte_alpha_setcaps (GstBaseTransform * btrans, + GstCaps * incaps, GstCaps * outcaps); +static gboolean gst_smpte_alpha_get_unit_size (GstBaseTransform * btrans, + GstCaps * caps, guint * size); +static GstFlowReturn gst_smpte_alpha_transform (GstBaseTransform * trans, + GstBuffer * in, GstBuffer * out); +static void gst_smpte_alpha_before_transform (GstBaseTransform * trans, + GstBuffer * buf); +static GstCaps *gst_smpte_alpha_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * from); + +GST_BOILERPLATE (GstSMPTEAlpha, gst_smpte_alpha, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +static void +gst_smpte_alpha_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, + &gst_smpte_alpha_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_smpte_alpha_src_template); + gst_element_class_set_details_simple (element_class, "SMPTE transitions", + "Filter/Editor/Video", + "Apply the standard SMPTE transitions as alpha on video images", + "Wim Taymans "); +} + +static void +gst_smpte_alpha_class_init (GstSMPTEAlphaClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_smpte_alpha_set_property; + gobject_class->get_property = gst_smpte_alpha_get_property; + + gobject_class->finalize = (GObjectFinalizeFunc) gst_smpte_alpha_finalize; + + _gst_mask_init (); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TYPE, + g_param_spec_enum ("type", "Type", "The type of transition to use", + GST_TYPE_SMPTE_TRANSITION_TYPE, DEFAULT_PROP_TYPE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BORDER, + g_param_spec_int ("border", "Border", + "The border width of the transition", 0, G_MAXINT, + DEFAULT_PROP_BORDER, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEPTH, + g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", 1, 24, + DEFAULT_PROP_DEPTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_POSITION, + g_param_spec_double ("position", "Position", + "Position of the transition effect", 0.0, 1.0, DEFAULT_PROP_POSITION, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstSMPTEAlpha:invert: + * + * Set to TRUE to invert the transition mask (ie. flip it horizontally). + * + * Since: 0.10.23 + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_INVERT, + g_param_spec_boolean ("invert", "Invert", + "Invert transition mask", DEFAULT_PROP_POSITION, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_smpte_alpha_setcaps); + trans_class->get_unit_size = + GST_DEBUG_FUNCPTR (gst_smpte_alpha_get_unit_size); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_smpte_alpha_transform); + trans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_smpte_alpha_before_transform); + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_smpte_alpha_transform_caps); +} + +static gboolean +gst_smpte_alpha_update_mask (GstSMPTEAlpha * smpte, gint type, + gboolean invert, gint depth, gint width, gint height) +{ + GstMask *newmask; + + /* try to avoid regenerating the mask if we already have one that is + * correct */ + if (smpte->mask) { + if (smpte->type == type && + smpte->invert == invert && + smpte->depth == depth && + smpte->width == width && smpte->height == height) + return TRUE; + } + + smpte->type = type; + smpte->invert = invert; + smpte->depth = depth; + smpte->width = width; + smpte->height = height; + + /* Not negotiated yet */ + if (width == 0 || height == 0) { + return TRUE; + } + + newmask = gst_mask_factory_new (type, invert, depth, width, height); + if (!newmask) + goto mask_failed; + + if (smpte->mask) + gst_mask_destroy (smpte->mask); + + smpte->mask = newmask; + + return TRUE; + + /* ERRORS */ +mask_failed: + { + GST_ERROR_OBJECT (smpte, "failed to create a mask"); + return FALSE; + } +} + +static void +gst_smpte_alpha_init (GstSMPTEAlpha * smpte, GstSMPTEAlphaClass * klass) +{ + smpte->type = DEFAULT_PROP_TYPE; + smpte->border = DEFAULT_PROP_BORDER; + smpte->depth = DEFAULT_PROP_DEPTH; + smpte->position = DEFAULT_PROP_POSITION; + smpte->invert = DEFAULT_PROP_INVERT; +} + +#define CREATE_ARGB_FUNC(name, A, R, G, B) \ +static void \ +gst_smpte_alpha_process_##name##_##name (GstSMPTEAlpha * smpte, const guint8 * in, \ + guint8 * out, GstMask * mask, gint width, gint height, gint border, \ + gint pos) \ +{ \ + gint i, j; \ + const guint32 *maskp; \ + gint value; \ + gint min, max; \ + \ + if (border == 0) \ + border++; \ + \ + min = pos - border; \ + max = pos; \ + GST_DEBUG_OBJECT (smpte, "pos %d, min %d, max %d, border %d", pos, min, max, \ + border); \ + \ + maskp = mask->data; \ + \ + /* we basically copy the source to dest but we scale the alpha channel with \ + * the mask */ \ + for (i = 0; i < height; i++) { \ + for (j = 0; j < width; j++) { \ + value = *maskp++; \ + out[A] = (in[A] * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; \ + out[R] = in[R]; \ + out[G] = in[G]; \ + out[B] = in[B]; \ + out += 4; \ + in += 4; \ + } \ + } \ +} + +CREATE_ARGB_FUNC (argb, 0, 1, 2, 3); +CREATE_ARGB_FUNC (bgra, 3, 2, 1, 0); +CREATE_ARGB_FUNC (abgr, 0, 3, 2, 1); +CREATE_ARGB_FUNC (rgba, 3, 0, 1, 2); + +static void +gst_smpte_alpha_process_ayuv_ayuv (GstSMPTEAlpha * smpte, const guint8 * in, + guint8 * out, GstMask * mask, gint width, gint height, gint border, + gint pos) +{ + gint i, j; + const guint32 *maskp; + gint value; + gint min, max; + + if (border == 0) + border++; + + min = pos - border; + max = pos; + GST_DEBUG_OBJECT (smpte, "pos %d, min %d, max %d, border %d", pos, min, max, + border); + + maskp = mask->data; + + /* we basically copy the source to dest but we scale the alpha channel with + * the mask */ + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + value = *maskp++; + *out++ = (*in++ * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; + *out++ = *in++; + *out++ = *in++; + *out++ = *in++; + } + } +} + +static void +gst_smpte_alpha_process_i420_ayuv (GstSMPTEAlpha * smpte, const guint8 * in, + guint8 * out, GstMask * mask, gint width, gint height, gint border, + gint pos) +{ + const guint8 *srcY; + const guint8 *srcU; + const guint8 *srcV; + gint i, j; + gint src_wrap, src_uv_wrap; + gint y_stride, uv_stride; + gboolean odd_width; + const guint32 *maskp; + gint value; + gint min, max; + + if (border == 0) + border++; + + min = pos - border; + max = pos; + GST_DEBUG_OBJECT (smpte, "pos %d, min %d, max %d, border %d", pos, min, max, + border); + + maskp = mask->data; + + y_stride = gst_video_format_get_row_stride (smpte->in_format, 0, width); + uv_stride = gst_video_format_get_row_stride (smpte->in_format, 1, width); + + src_wrap = y_stride - width; + src_uv_wrap = uv_stride - (width / 2); + + srcY = in; + srcU = in + gst_video_format_get_component_offset (smpte->in_format, + 1, width, height); + srcV = in + gst_video_format_get_component_offset (smpte->in_format, + 2, width, height); + + odd_width = (width % 2 != 0); + + for (i = 0; i < height; i++) { + for (j = 0; j < width / 2; j++) { + value = *maskp++; + *out++ = (0xff * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; + *out++ = *srcY++; + *out++ = *srcU; + *out++ = *srcV; + value = *maskp++; + *out++ = (0xff * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; + *out++ = *srcY++; + *out++ = *srcU++; + *out++ = *srcV++; + } + /* Might have one odd column left to do */ + if (odd_width) { + value = *maskp++; + *out++ = (0xff * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; + *out++ = *srcY++; + *out++ = *srcU; + *out++ = *srcV; + } + if (i % 2 == 0) { + srcU -= width / 2; + srcV -= width / 2; + } else { + srcU += src_uv_wrap; + srcV += src_uv_wrap; + } + srcY += src_wrap; + } +} + +static void +gst_smpte_alpha_before_transform (GstBaseTransform * trans, GstBuffer * buf) +{ + GstSMPTEAlpha *smpte = GST_SMPTE_ALPHA (trans); + GstClockTime timestamp, stream_time; + + /* first sync the controller to the current stream_time of the buffer */ + timestamp = GST_BUFFER_TIMESTAMP (buf); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (smpte, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (smpte), stream_time); +} + +static GstFlowReturn +gst_smpte_alpha_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstSMPTEAlpha *smpte = GST_SMPTE_ALPHA (trans); + gdouble position; + gint border; + + if (G_UNLIKELY (!smpte->process)) + goto not_negotiated; + + /* these are the propertis we update with only the object lock, others are + * only updated with the TRANSFORM_LOCK. */ + GST_OBJECT_LOCK (smpte); + position = smpte->position; + border = smpte->border; + GST_OBJECT_UNLOCK (smpte); + + /* run the type specific filter code */ + smpte->process (smpte, GST_BUFFER_DATA (in), GST_BUFFER_DATA (out), + smpte->mask, smpte->width, smpte->height, border, + ((1 << smpte->depth) + border) * position); + + return GST_FLOW_OK; + + /* ERRORS */ +not_negotiated: + { + GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), + ("No input format negotiated")); + return GST_FLOW_NOT_NEGOTIATED; + } +} + +static GstCaps * +gst_smpte_alpha_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * from) +{ + GstCaps *to = gst_caps_copy (from); + GstStructure *s; + + gst_caps_truncate (to); + s = gst_caps_get_structure (to, 0); + + if (gst_structure_has_name (s, "video/x-raw-yuv")) { + GValue list = { 0, }; + GValue val = { 0, }; + + gst_structure_remove_field (s, "format"); + + g_value_init (&list, GST_TYPE_LIST); + g_value_init (&val, GST_TYPE_FOURCC); + gst_value_set_fourcc (&val, GST_STR_FOURCC ("AYUV")); + gst_value_list_append_value (&list, &val); + g_value_reset (&val); + gst_value_set_fourcc (&val, GST_STR_FOURCC ("I420")); + gst_value_list_append_value (&list, &val); + g_value_reset (&val); + gst_value_set_fourcc (&val, GST_STR_FOURCC ("YV12")); + gst_value_list_append_value (&list, &val); + g_value_unset (&val); + gst_structure_set_value (s, "format", &list); + g_value_unset (&list); + } else if (!gst_structure_has_name (s, "video/x-raw-rgb")) { + gst_caps_unref (to); + to = gst_caps_new_empty (); + } + + return to; +} + +static gboolean +gst_smpte_alpha_setcaps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstSMPTEAlpha *smpte = GST_SMPTE_ALPHA (btrans); + gboolean ret; + gint width, height; + + smpte->process = NULL; + + if (!gst_video_format_parse_caps (incaps, &smpte->in_format, &width, &height)) + goto invalid_caps; + if (!gst_video_format_parse_caps (outcaps, &smpte->out_format, &width, + &height)) + goto invalid_caps; + + /* try to update the mask now, this will also adjust the width/height on + * success */ + GST_OBJECT_LOCK (smpte); + ret = + gst_smpte_alpha_update_mask (smpte, smpte->type, smpte->invert, + smpte->depth, width, height); + GST_OBJECT_UNLOCK (smpte); + if (!ret) + goto mask_failed; + + switch (smpte->out_format) { + case GST_VIDEO_FORMAT_AYUV: + switch (smpte->in_format) { + case GST_VIDEO_FORMAT_AYUV: + smpte->process = gst_smpte_alpha_process_ayuv_ayuv; + break; + case GST_VIDEO_FORMAT_I420: + smpte->process = gst_smpte_alpha_process_i420_ayuv; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_ARGB: + switch (smpte->in_format) { + case GST_VIDEO_FORMAT_ARGB: + smpte->process = gst_smpte_alpha_process_argb_argb; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_RGBA: + switch (smpte->in_format) { + case GST_VIDEO_FORMAT_RGBA: + smpte->process = gst_smpte_alpha_process_rgba_rgba; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_ABGR: + switch (smpte->in_format) { + case GST_VIDEO_FORMAT_ABGR: + smpte->process = gst_smpte_alpha_process_abgr_abgr; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_BGRA: + switch (smpte->in_format) { + case GST_VIDEO_FORMAT_BGRA: + smpte->process = gst_smpte_alpha_process_bgra_bgra; + break; + default: + break; + } + break; + default: + break; + } + + return ret; + + /* ERRORS */ +invalid_caps: + { + GST_ERROR_OBJECT (smpte, "Invalid caps: %" GST_PTR_FORMAT, incaps); + return FALSE; + } +mask_failed: + { + GST_ERROR_OBJECT (smpte, "failed creating the mask"); + return FALSE; + } +} + +static gboolean +gst_smpte_alpha_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, + guint * size) +{ + gint width, height; + GstVideoFormat format; + + if (!gst_video_format_parse_caps (caps, &format, &width, &height)) + return FALSE; + + *size = gst_video_format_get_size (format, width, height); + + return TRUE; +} + +static void +gst_smpte_alpha_finalize (GstSMPTEAlpha * smpte) +{ + if (smpte->mask) + gst_mask_destroy (smpte->mask); + smpte->mask = NULL; + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) smpte); +} + +static void +gst_smpte_alpha_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSMPTEAlpha *smpte = GST_SMPTE_ALPHA (object); + + switch (prop_id) { + case PROP_TYPE:{ + gint type; + + type = g_value_get_enum (value); + + GST_BASE_TRANSFORM_LOCK (smpte); + GST_OBJECT_LOCK (smpte); + gst_smpte_alpha_update_mask (smpte, type, smpte->invert, + smpte->depth, smpte->width, smpte->height); + GST_OBJECT_UNLOCK (smpte); + GST_BASE_TRANSFORM_UNLOCK (smpte); + break; + } + case PROP_BORDER: + GST_OBJECT_LOCK (smpte); + smpte->border = g_value_get_int (value); + GST_OBJECT_UNLOCK (smpte); + break; + case PROP_DEPTH:{ + gint depth; + + depth = g_value_get_int (value); + + GST_BASE_TRANSFORM_LOCK (smpte); + /* also lock with the object lock so that reading the property doesn't + * have to wait for the transform lock */ + GST_OBJECT_LOCK (smpte); + gst_smpte_alpha_update_mask (smpte, smpte->type, smpte->invert, + depth, smpte->width, smpte->height); + GST_OBJECT_UNLOCK (smpte); + GST_BASE_TRANSFORM_UNLOCK (smpte); + break; + } + case PROP_POSITION: + GST_OBJECT_LOCK (smpte); + smpte->position = g_value_get_double (value); + GST_OBJECT_UNLOCK (smpte); + break; + case PROP_INVERT:{ + gboolean invert; + + invert = g_value_get_boolean (value); + GST_BASE_TRANSFORM_LOCK (smpte); + /* also lock with the object lock so that reading the property doesn't + * have to wait for the transform lock */ + GST_OBJECT_LOCK (smpte); + gst_smpte_alpha_update_mask (smpte, smpte->type, invert, + smpte->depth, smpte->width, smpte->height); + GST_OBJECT_UNLOCK (smpte); + GST_BASE_TRANSFORM_UNLOCK (smpte); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_smpte_alpha_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstSMPTEAlpha *smpte; + + smpte = GST_SMPTE_ALPHA (object); + + switch (prop_id) { + case PROP_TYPE: + GST_OBJECT_LOCK (smpte); + g_value_set_enum (value, smpte->type); + GST_OBJECT_UNLOCK (smpte); + break; + case PROP_BORDER: + GST_OBJECT_LOCK (smpte); + g_value_set_int (value, smpte->border); + GST_OBJECT_UNLOCK (smpte); + break; + case PROP_DEPTH: + GST_OBJECT_LOCK (smpte); + g_value_set_int (value, smpte->depth); + GST_OBJECT_UNLOCK (smpte); + break; + case PROP_POSITION: + GST_OBJECT_LOCK (smpte); + g_value_set_double (value, smpte->position); + GST_OBJECT_UNLOCK (smpte); + break; + case PROP_INVERT: + GST_OBJECT_LOCK (smpte); + g_value_set_boolean (value, smpte->invert); + GST_OBJECT_UNLOCK (smpte); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_smpte_alpha_plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_smpte_alpha_debug, "smptealpha", 0, + "SMPTE alpha effect"); + + /* initialize gst controller library */ + gst_controller_init (NULL, NULL); + + return gst_element_register (plugin, "smptealpha", GST_RANK_NONE, + GST_TYPE_SMPTE_ALPHA); +} diff --git a/gst/smpte/gstsmptealpha.h b/gst/smpte/gstsmptealpha.h new file mode 100644 index 0000000..efa599a --- /dev/null +++ b/gst/smpte/gstsmptealpha.h @@ -0,0 +1,79 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_SMPTE_ALPHA_H__ +#define __GST_SMPTE_ALPHA_H__ + +#include +#include +#include + + +G_BEGIN_DECLS + +#include "gstmask.h" + +#define GST_TYPE_SMPTE_ALPHA \ + (gst_smpte_alpha_get_type()) +#define GST_SMPTE_ALPHA(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMPTE_ALPHA,GstSMPTEAlpha)) +#define GST_SMPTE_ALPHA_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMPTE_ALPHA,GstSMPTEAlphaClass)) +#define GST_IS_SMPTE_ALPHA(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMPTE_ALPHA)) +#define GST_IS_SMPTE_ALPHA_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMPTE_ALPHA)) + +typedef struct _GstSMPTEAlpha GstSMPTEAlpha; +typedef struct _GstSMPTEAlphaClass GstSMPTEAlphaClass; + +struct _GstSMPTEAlpha { + GstVideoFilter element; + + /* properties */ + gint type; + gint border; + gint depth; + gdouble position; + gboolean invert; + + /* negotiated format */ + GstVideoFormat in_format, out_format; + gint width; + gint height; + + /* state of the effect */ + GstMask *mask; + + /* processing function */ + void (*process) (GstSMPTEAlpha * smpte, const guint8 * in, guint8 * out, + GstMask * mask, gint width, gint height, gint border, gint pos); +}; + +struct _GstSMPTEAlphaClass { + GstVideoFilterClass parent_class; +}; + +GType gst_smpte_alpha_get_type (void); +gboolean gst_smpte_alpha_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_SMPTE_ALPHA_H__ */ diff --git a/gst/smpte/paint.c b/gst/smpte/paint.c new file mode 100644 index 0000000..7c2ba0d --- /dev/null +++ b/gst/smpte/paint.c @@ -0,0 +1,338 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 +#include +#include "paint.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +void +gst_smpte_paint_vbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1) +{ + gint i, j; + gint width, height; + + width = x1 - x0; + height = y1 - y0; + + g_assert (width > 0); + g_assert (height > 0); + + dest = dest + y0 * stride + x0; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[j] = (c1 * j + c0 * (width - j)) / width; + } + dest += stride; + } +} + +void +gst_smpte_paint_hbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1) +{ + gint i, j; + gint width, height; + + width = x1 - x0; + height = y1 - y0; + + g_assert (width > 0); + g_assert (height > 0); + + dest = dest + y0 * stride + x0; + + for (i = 0; i < height; i++) { + guint32 value = (c1 * i + c0 * (height - i)) / height; + + for (j = 0; j < width; j++) { + dest[j] = value; + } + dest += stride; + } +} + +#define STEP_3D_LINE(dxabs,dyabs,dzabs,sdx,sdy,sdz,xr,yr,zr,px,py,pz) \ +G_STMT_START { \ + if (dxabs >= dyabs && dxabs >= dzabs) { \ + yr += dyabs; \ + zr += dzabs; \ + if (yr >= dxabs) { \ + py += sdy; \ + yr -= dxabs; \ + } \ + if (zr >= dzabs) { \ + pz += sdz; \ + zr -= dxabs; \ + } \ + px += sdx; \ + } else if (dyabs >= dxabs && dyabs >= dzabs) { \ + xr += dxabs; \ + zr += dzabs; \ + if (xr >= dyabs) { \ + px += sdx; \ + xr -= dyabs; \ + } \ + if (zr >= dzabs) { \ + pz += sdz; \ + zr -= dyabs; \ + } \ + py += sdy; \ + } else { \ + yr += dyabs; \ + xr += dxabs; \ + if (yr >= dyabs) { \ + py += sdy; \ + yr -= dzabs; \ + } \ + if (xr >= dyabs) { \ + px += sdx; \ + xr -= dzabs; \ + } \ + pz += sdz; \ + } \ +} G_STMT_END + +#define SWAP_INT(a,b) \ +G_STMT_START { \ + gint tmp; \ + tmp = (a); \ + (a) = (b); \ + (b) = (tmp); \ +} G_STMT_END + +#define SIGN(a) ((a) < 0 ? -1 : 1) + +#define PREPARE_3D_LINE(x0,y0,z0,x1,y1,z1,dxabs,dyabs,dzabs,sdx,sdy,sdz,xr,yr,zr,px,py,pz)\ +G_STMT_START { \ + gint dx, dy, dz; \ + dx = x1 - x0; \ + dy = y1 - y0; \ + dz = z1 - z0; \ + dxabs = abs (dx); \ + dyabs = abs (dy); \ + dzabs = abs (dz); \ + sdx = SIGN (dx); \ + sdy = SIGN (dy); \ + sdz = SIGN (dz); \ + xr = dxabs >> 1; \ + yr = dyabs >> 1; \ + zr = dzabs >> 1; \ + px = x0; \ + py = y0; \ + pz = z0; \ +} G_STMT_END + +void +gst_smpte_paint_triangle_linear (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) +{ + gint sdxl, sdyl, sdcl, dxlabs, dylabs, dclabs, xrl, yrl, crl, pxl, pyl, pcl; + gint sdxr, sdyr, sdcr, dxrabs, dyrabs, dcrabs, xrr, yrr, crr, pxr, pyr, pcr; + gint i, j, k, seg_start, seg_end; + + if (y0 > y1) { + SWAP_INT (x0, x1); + SWAP_INT (y0, y1); + SWAP_INT (c0, c1); + } + if (y0 > y2) { + SWAP_INT (x0, x2); + SWAP_INT (y0, y2); + SWAP_INT (c0, c2); + } + if (y1 > y2) { + SWAP_INT (x1, x2); + SWAP_INT (y1, y2); + SWAP_INT (c1, c2); + } + + PREPARE_3D_LINE (x0, y0, c0, x2, y2, c2, + dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, xrl, yrl, crl, pxl, pyl, pcl); + + PREPARE_3D_LINE (x0, y0, c0, x1, y1, c1, + dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); + + dest = dest + stride * y0; + seg_start = y0; + seg_end = y1; + + /* do two passes */ + for (k = 0; k < 2; k++) { + for (i = seg_start; i < seg_end; i++) { + gint s = pxl, e = pxr, sc = pcl, ec = pcr; + gint sign = SIGN (e - s); + + e += sign; + for (j = s; j != e; j += sign) { + dest[j] = (ec * (j - s) + sc * (e - j)) / (e - s); + } + + while (pyr == i) { + STEP_3D_LINE (dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, + xrr, yrr, crr, pxr, pyr, pcr); + } + while (pyl == i) { + STEP_3D_LINE (dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, + xrl, yrl, crl, pxl, pyl, pcl); + } + dest += stride; + } + + PREPARE_3D_LINE (x1, y1, c1, x2, y2, c2, + dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); + + seg_start = y1; + seg_end = y2; + } +} + +static void +draw_bresenham_line (guint32 * dest, gint stride, + gint x0, gint y0, gint x1, gint y1, guint32 col) +{ + gint dx, dy; + gint x_incr, y_incr; + gint i, dpr, dpru, P, indep; + + dx = abs (x1 - x0); + dy = abs (y1 - y0); + + dest = dest + y0 * stride + x0; + + x_incr = SIGN (x1 - x0); + y_incr = SIGN (y1 - y0) * stride; + + if (dx >= dy) { + dpr = dy << 1; + i = dx; + indep = x_incr; + } else { + dpr = dx << 1; + i = dy; + indep = y_incr; + } + + dpru = dpr - (i << 1); + P = dpr - i; + + for (; i >= 0; i--) { + *dest = col; + + if (P > 0) { + dest += x_incr; + dest += y_incr; + P += dpru; + } else { + dest += indep; + P += dpr; + } + } +} + +void +gst_smpte_paint_triangle_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) +{ + gint i; + gint sign; + gfloat angle, angle_e; + gfloat len1; + + angle_e = acos (((x1 - x0) * (x2 - x0) + (y1 - y0) * (y2 - y0)) / + (sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) * + sqrt ((x2 - x0) * (x2 - x0) + (y2 - y0) * (y2 - y0)))); + + len1 = sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + + if (x1 == x2) { + sign = SIGN (y2 - y1); + + for (i = y1; i != (y2 + sign); i += sign) { + if (y1 == i) + angle = 0; + else + angle = acos (((x1 - x0) * (x2 - x0) + (y1 - y0) * (i - y0)) / + (len1 * sqrt ((x1 - x0) * (x1 - x0) + (i - y0) * (i - + y0)))) / angle_e; + + draw_bresenham_line (dest, stride, + x0, y0, x1, i, (c2 * angle + c1 * (1.0 - angle))); + } + } else if (y1 == y2) { + sign = SIGN (x2 - x1); + + for (i = x1; i != (x2 + sign); i += sign) { + if (x1 == i) + angle = 0; + else + angle = acos (((x1 - x0) * (i - x0) + (y1 - y0) * (y2 - y0)) / + (len1 * sqrt ((i - x0) * (i - x0) + (y2 - y0) * (y2 - + y0)))) / angle_e; + + draw_bresenham_line (dest, stride, + x0, y0, i, y1, (c2 * angle + c1 * (1.0 - angle))); + } + } else { + g_warning ("paint triangle clock: not supported"); + return; + } +} + +void +gst_smpte_paint_box_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) +{ + gfloat angle_m, col_m; + gint xv, yv; + + if (x1 == x0) { + xv = x2; + yv = y1; + } else if (y1 == y0) { + xv = x1; + yv = y2; + } else { + g_warning ("paint box clock: not supported"); + return; + } + + angle_m = 2 * acos (((x1 - x0) * (xv - x0) + (y1 - y0) * (yv - y0)) / + (sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) * + sqrt ((xv - x0) * (xv - x0) + (yv - y0) * (yv - y0)))) / M_PI; + + col_m = c2 * angle_m + c1 * (1.0 - angle_m); + + gst_smpte_paint_triangle_clock (dest, stride, + x0, y0, c0, x1, y1, c1, xv, yv, col_m); + gst_smpte_paint_triangle_clock (dest, stride, + x0, y0, c0, xv, yv, col_m, x2, y2, c2); +} diff --git a/gst/smpte/paint.h b/gst/smpte/paint.h new file mode 100644 index 0000000..3de7481 --- /dev/null +++ b/gst/smpte/paint.h @@ -0,0 +1,47 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_SMPTE_PAINT_H__ +#define __GST_SMPTE_PAINT_H__ + +#include + +void gst_smpte_paint_vbox (guint32 *dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1); +void gst_smpte_paint_hbox (guint32 *dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1); + +void gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, + gint x2, gint y2, gint c2); + +void gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, + gint x2, gint y2, gint c2); + +void gst_smpte_paint_box_clock (guint32 *dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, + gint x2, gint y2, gint c2); + +#endif /* __GST_SMPTE_PAINT_H__ */ diff --git a/gst/smpte/plugin.c b/gst/smpte/plugin.c new file mode 100644 index 0000000..cacc80c --- /dev/null +++ b/gst/smpte/plugin.c @@ -0,0 +1,43 @@ +/* GStreamer + * Copyright (C) <2008> Wim Taymans + * + * 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 "gstsmpte.h" +#include "gstsmptealpha.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_smpte_plugin_init (plugin)) + return FALSE; + + if (!gst_smpte_alpha_plugin_init (plugin)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "smpte", + "Apply the standard SMPTE transitions on video images", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/spectrum/Makefile.am b/gst/spectrum/Makefile.am new file mode 100644 index 0000000..99c4384 --- /dev/null +++ b/gst/spectrum/Makefile.am @@ -0,0 +1,27 @@ +plugin_LTLIBRARIES = libgstspectrum.la + +libgstspectrum_la_SOURCES = gstspectrum.c +libgstspectrum_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) +libgstspectrum_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstfft-$(GST_MAJORMINOR) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) +libgstspectrum_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstspectrum_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstspectrum.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstspectrum -:SHARED libgstspectrum \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstspectrum_la_SOURCES) \ + $(nodist_libgstspectrum_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstspectrum_la_CFLAGS) \ + -:LDFLAGS $(libgstspectrum_la_LDFLAGS) \ + $(libgstspectrum_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/spectrum/Makefile.in b/gst/spectrum/Makefile.in new file mode 100644 index 0000000..d667424 --- /dev/null +++ b/gst/spectrum/Makefile.in @@ -0,0 +1,826 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/spectrum +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstspectrum_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstspectrum_la_OBJECTS = libgstspectrum_la-gstspectrum.lo +libgstspectrum_la_OBJECTS = $(am_libgstspectrum_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstspectrum_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstspectrum_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstspectrum_la_CFLAGS) $(CFLAGS) \ + $(libgstspectrum_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstspectrum_la_SOURCES) +DIST_SOURCES = $(libgstspectrum_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstspectrum.la +libgstspectrum_la_SOURCES = gstspectrum.c +libgstspectrum_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) + +libgstspectrum_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstfft-$(GST_MAJORMINOR) -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) + +libgstspectrum_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstspectrum_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstspectrum.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/spectrum/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/spectrum/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstspectrum.la: $(libgstspectrum_la_OBJECTS) $(libgstspectrum_la_DEPENDENCIES) $(EXTRA_libgstspectrum_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstspectrum_la_LINK) -rpath $(plugindir) $(libgstspectrum_la_OBJECTS) $(libgstspectrum_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstspectrum_la-gstspectrum.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstspectrum_la-gstspectrum.lo: gstspectrum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspectrum_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspectrum_la_CFLAGS) $(CFLAGS) -MT libgstspectrum_la-gstspectrum.lo -MD -MP -MF $(DEPDIR)/libgstspectrum_la-gstspectrum.Tpo -c -o libgstspectrum_la-gstspectrum.lo `test -f 'gstspectrum.c' || echo '$(srcdir)/'`gstspectrum.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstspectrum_la-gstspectrum.Tpo $(DEPDIR)/libgstspectrum_la-gstspectrum.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstspectrum.c' object='libgstspectrum_la-gstspectrum.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspectrum_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspectrum_la_CFLAGS) $(CFLAGS) -c -o libgstspectrum_la-gstspectrum.lo `test -f 'gstspectrum.c' || echo '$(srcdir)/'`gstspectrum.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstspectrum -:SHARED libgstspectrum \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstspectrum_la_SOURCES) \ + $(nodist_libgstspectrum_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstspectrum_la_CFLAGS) \ + -:LDFLAGS $(libgstspectrum_la_LDFLAGS) \ + $(libgstspectrum_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/spectrum/README b/gst/spectrum/README new file mode 100644 index 0000000..8755571 --- /dev/null +++ b/gst/spectrum/README @@ -0,0 +1,5 @@ +This is a simple, rather lame spectrum analyzer made from the fix_fft.c +code, as found I think in xmms-0.9.1 (the 75-wide output sounds like xmms +to me), which is actually written by other people (see fix_fft.c for +credits). It worked last time I had GiST working, which was a while ago. +Yes, GiST is not included here yet, it will be in 0.1.0. diff --git a/gst/spectrum/gstspectrum.c b/gst/spectrum/gstspectrum.c new file mode 100644 index 0000000..4d7250b --- /dev/null +++ b/gst/spectrum/gstspectrum.c @@ -0,0 +1,1164 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * <2006,2011> Stefan Kost + * <2007-2009> Sebastian Dröge + * + * 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-spectrum + * + * The Spectrum element analyzes the frequency spectrum of an audio signal. + * If the #GstSpectrum:post-messages property is #TRUE, it sends analysis results + * as application messages named + * "spectrum" after each interval of time given + * by the #GstSpectrum:interval property. + * + * The message's structure contains some combination of these fields: + * + * + * + * #GstClockTime + * "timestamp": + * the timestamp of the buffer that triggered the message. + * + * + * + * + * #GstClockTime + * "stream-time": + * the stream time of the buffer. + * + * + * + * + * #GstClockTime + * "running-time": + * the running_time of the buffer. + * + * + * + * + * #GstClockTime + * "duration": + * the duration of the buffer. + * + * + * + * + * #GstClockTime + * "endtime": + * the end time of the buffer that triggered the message as stream time (this + * is deprecated, as it can be calculated from stream-time + duration) + * + * + * + * + * #GstValueList of #gfloat + * "magnitude": + * the level for each frequency band in dB. All values below the value of the + * #GstSpectrum:threshold property will be set to the threshold. Only present + * if the #GstSpectrum:message-magnitude property is %TRUE. + * + * + * + * + * #GstValueList of #gfloat + * "phase": + * The phase for each frequency band. The value is between -pi and pi. Only + * present if the #GstSpectrum:message-phase property is %TRUE. + * + * + * + * + * If #GstSpectrum:multi-channel property is set to true. magnitude and phase + * fields will be each a nested #GstValueArray. The first dimension are the + * channels and the second dimension are the values. + * + * + * Example application + * |[ + * + * ]| + * + * + * Last reviewed on 2011-03-10 (0.10.29) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "gstspectrum.h" + +GST_DEBUG_CATEGORY_STATIC (gst_spectrum_debug); +#define GST_CAT_DEFAULT gst_spectrum_debug + +/* elementfactory information */ + +#define ALLOWED_CAPS \ + "audio/x-raw-int, " \ + " width = (int) 16, " \ + " depth = (int) [ 1, 16 ], " \ + " signed = (boolean) true, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) [ 1, MAX ], " \ + " channels = (int) [ 1, MAX ]; " \ + "audio/x-raw-int, " \ + " width = (int) 24, " \ + " depth = (int) [ 1, 24 ], " \ + " signed = (boolean) true, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) [ 1, MAX ], " \ + " channels = (int) [ 1, MAX ]; " \ + "audio/x-raw-int, " \ + " width = (int) 32, " \ + " depth = (int) [ 1, 32 ], " \ + " signed = (boolean) true, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) [ 1, MAX ], " \ + " channels = (int) [ 1, MAX ]; " \ + "audio/x-raw-float, " \ + " width = (int) { 32, 64 }, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) [ 1, MAX ], " \ + " channels = (int) [ 1, MAX ]" + +/* Spectrum properties */ +#define DEFAULT_MESSAGE TRUE +#define DEFAULT_POST_MESSAGES TRUE +#define DEFAULT_MESSAGE_MAGNITUDE TRUE +#define DEFAULT_MESSAGE_PHASE FALSE +#define DEFAULT_INTERVAL (GST_SECOND / 10) +#define DEFAULT_BANDS 128 +#define DEFAULT_THRESHOLD -60 +#define DEFAULT_MULTI_CHANNEL FALSE + +enum +{ + PROP_0, + PROP_MESSAGE, + PROP_POST_MESSAGES, + PROP_MESSAGE_MAGNITUDE, + PROP_MESSAGE_PHASE, + PROP_INTERVAL, + PROP_BANDS, + PROP_THRESHOLD, + PROP_MULTI_CHANNEL +}; + +GST_BOILERPLATE (GstSpectrum, gst_spectrum, GstAudioFilter, + GST_TYPE_AUDIO_FILTER); + +static void gst_spectrum_finalize (GObject * object); +static void gst_spectrum_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_spectrum_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static gboolean gst_spectrum_start (GstBaseTransform * trans); +static gboolean gst_spectrum_stop (GstBaseTransform * trans); +static GstFlowReturn gst_spectrum_transform_ip (GstBaseTransform * trans, + GstBuffer * in); +static gboolean gst_spectrum_setup (GstAudioFilter * base, + GstRingBufferSpec * format); + +static void +gst_spectrum_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstCaps *caps; + + gst_element_class_set_details_simple (element_class, "Spectrum analyzer", + "Filter/Analyzer/Audio", + "Run an FFT on the audio signal, output spectrum data", + "Erik Walthinsen , " + "Stefan Kost , " + "Sebastian Dröge "); + + caps = gst_caps_from_string (ALLOWED_CAPS); + gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (g_class), + caps); + gst_caps_unref (caps); +} + +static void +gst_spectrum_class_init (GstSpectrumClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + GstAudioFilterClass *filter_class = GST_AUDIO_FILTER_CLASS (klass); + + gobject_class->set_property = gst_spectrum_set_property; + gobject_class->get_property = gst_spectrum_get_property; + gobject_class->finalize = gst_spectrum_finalize; + + trans_class->start = GST_DEBUG_FUNCPTR (gst_spectrum_start); + trans_class->stop = GST_DEBUG_FUNCPTR (gst_spectrum_stop); + trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_spectrum_transform_ip); + trans_class->passthrough_on_same_caps = TRUE; + + filter_class->setup = GST_DEBUG_FUNCPTR (gst_spectrum_setup); + + /* FIXME 0.11, remove in favour of post-messages */ + g_object_class_install_property (gobject_class, PROP_MESSAGE, + g_param_spec_boolean ("message", "Message", + "Whether to post a 'spectrum' element message on the bus for each " + "passed interval (deprecated, use post-messages)", DEFAULT_MESSAGE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstSpectrum:post-messages + * + * Post messages on the bus with spectrum information. + * + * Since: 0.10.17 + */ + g_object_class_install_property (gobject_class, PROP_POST_MESSAGES, + g_param_spec_boolean ("post-messages", "Post Messages", + "Whether to post a 'spectrum' element message on the bus for each " + "passed interval", DEFAULT_POST_MESSAGES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_MESSAGE_MAGNITUDE, + g_param_spec_boolean ("message-magnitude", "Magnitude", + "Whether to add a 'magnitude' field to the structure of any " + "'spectrum' element messages posted on the bus", + DEFAULT_MESSAGE_MAGNITUDE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_MESSAGE_PHASE, + g_param_spec_boolean ("message-phase", "Phase", + "Whether to add a 'phase' field to the structure of any " + "'spectrum' element messages posted on the bus", + DEFAULT_MESSAGE_PHASE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INTERVAL, + g_param_spec_uint64 ("interval", "Interval", + "Interval of time between message posts (in nanoseconds)", + 1, G_MAXUINT64, DEFAULT_INTERVAL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_BANDS, + g_param_spec_uint ("bands", "Bands", "Number of frequency bands", + 0, G_MAXUINT, DEFAULT_BANDS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_THRESHOLD, + g_param_spec_int ("threshold", "Threshold", + "dB threshold for result. All lower values will be set to this", + G_MININT, 0, DEFAULT_THRESHOLD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstSpectrum:multi-channel + * + * Send separate results for each channel + * + * Since: 0.10.29 + */ + g_object_class_install_property (gobject_class, PROP_MULTI_CHANNEL, + g_param_spec_boolean ("multi-channel", "Multichannel results", + "Send separate results for each channel", + DEFAULT_MULTI_CHANNEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (gst_spectrum_debug, "spectrum", 0, + "audio spectrum analyser element"); +} + +static void +gst_spectrum_init (GstSpectrum * spectrum, GstSpectrumClass * g_class) +{ + spectrum->post_messages = DEFAULT_POST_MESSAGES; + spectrum->message_magnitude = DEFAULT_MESSAGE_MAGNITUDE; + spectrum->message_phase = DEFAULT_MESSAGE_PHASE; + spectrum->interval = DEFAULT_INTERVAL; + spectrum->bands = DEFAULT_BANDS; + spectrum->threshold = DEFAULT_THRESHOLD; +} + +static void +gst_spectrum_alloc_channel_data (GstSpectrum * spectrum) +{ + gint i; + GstSpectrumChannel *cd; + guint bands = spectrum->bands; + guint nfft = 2 * bands - 2; + + g_assert (spectrum->channel_data == NULL); + + spectrum->num_channels = (spectrum->multi_channel) ? + GST_AUDIO_FILTER (spectrum)->format.channels : 1; + + GST_DEBUG_OBJECT (spectrum, "allocating data for %d channels", + spectrum->num_channels); + + spectrum->channel_data = g_new (GstSpectrumChannel, spectrum->num_channels); + for (i = 0; i < spectrum->num_channels; i++) { + cd = &spectrum->channel_data[i]; + cd->fft_ctx = gst_fft_f32_new (nfft, FALSE); + cd->input = g_new0 (gfloat, nfft); + cd->input_tmp = g_new0 (gfloat, nfft); + cd->freqdata = g_new0 (GstFFTF32Complex, bands); + cd->spect_magnitude = g_new0 (gfloat, bands); + cd->spect_phase = g_new0 (gfloat, bands); + } +} + +static void +gst_spectrum_free_channel_data (GstSpectrum * spectrum) +{ + if (spectrum->channel_data) { + gint i; + GstSpectrumChannel *cd; + + GST_DEBUG_OBJECT (spectrum, "freeing data for %d channels", + spectrum->num_channels); + + for (i = 0; i < spectrum->num_channels; i++) { + cd = &spectrum->channel_data[i]; + if (cd->fft_ctx) + gst_fft_f32_free (cd->fft_ctx); + g_free (cd->input); + g_free (cd->input_tmp); + g_free (cd->freqdata); + g_free (cd->spect_magnitude); + g_free (cd->spect_phase); + } + g_free (spectrum->channel_data); + spectrum->channel_data = NULL; + } +} + +static void +gst_spectrum_flush (GstSpectrum * spectrum) +{ + spectrum->num_frames = 0; + spectrum->num_fft = 0; + + spectrum->accumulated_error = 0; +} + +static void +gst_spectrum_reset_state (GstSpectrum * spectrum) +{ + GST_DEBUG_OBJECT (spectrum, "resetting state"); + + gst_spectrum_free_channel_data (spectrum); + gst_spectrum_flush (spectrum); +} + +static void +gst_spectrum_finalize (GObject * object) +{ + GstSpectrum *spectrum = GST_SPECTRUM (object); + + gst_spectrum_reset_state (spectrum); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_spectrum_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSpectrum *filter = GST_SPECTRUM (object); + + switch (prop_id) { + case PROP_MESSAGE: + case PROP_POST_MESSAGES: + filter->post_messages = g_value_get_boolean (value); + break; + case PROP_MESSAGE_MAGNITUDE: + filter->message_magnitude = g_value_get_boolean (value); + break; + case PROP_MESSAGE_PHASE: + filter->message_phase = g_value_get_boolean (value); + break; + case PROP_INTERVAL:{ + guint64 interval = g_value_get_uint64 (value); + if (filter->interval != interval) { + GST_BASE_TRANSFORM_LOCK (filter); + filter->interval = interval; + gst_spectrum_reset_state (filter); + GST_BASE_TRANSFORM_UNLOCK (filter); + } + } + break; + case PROP_BANDS:{ + guint bands = g_value_get_uint (value); + if (filter->bands != bands) { + GST_BASE_TRANSFORM_LOCK (filter); + filter->bands = bands; + gst_spectrum_reset_state (filter); + GST_BASE_TRANSFORM_UNLOCK (filter); + } + } + break; + case PROP_THRESHOLD: + filter->threshold = g_value_get_int (value); + break; + case PROP_MULTI_CHANNEL:{ + gboolean multi_channel = g_value_get_boolean (value); + if (filter->multi_channel != multi_channel) { + GST_BASE_TRANSFORM_LOCK (filter); + filter->multi_channel = multi_channel; + gst_spectrum_reset_state (filter); + GST_BASE_TRANSFORM_UNLOCK (filter); + } + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_spectrum_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstSpectrum *filter = GST_SPECTRUM (object); + + switch (prop_id) { + case PROP_MESSAGE: + case PROP_POST_MESSAGES: + g_value_set_boolean (value, filter->post_messages); + break; + case PROP_MESSAGE_MAGNITUDE: + g_value_set_boolean (value, filter->message_magnitude); + break; + case PROP_MESSAGE_PHASE: + g_value_set_boolean (value, filter->message_phase); + break; + case PROP_INTERVAL: + g_value_set_uint64 (value, filter->interval); + break; + case PROP_BANDS: + g_value_set_uint (value, filter->bands); + break; + case PROP_THRESHOLD: + g_value_set_int (value, filter->threshold); + break; + case PROP_MULTI_CHANNEL: + g_value_set_boolean (value, filter->multi_channel); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_spectrum_start (GstBaseTransform * trans) +{ + GstSpectrum *spectrum = GST_SPECTRUM (trans); + + gst_spectrum_reset_state (spectrum); + + return TRUE; +} + +static gboolean +gst_spectrum_stop (GstBaseTransform * trans) +{ + GstSpectrum *spectrum = GST_SPECTRUM (trans); + + gst_spectrum_reset_state (spectrum); + + return TRUE; +} + +/* mixing data readers */ + +static void +input_data_mixed_float (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint i, j, ip = 0; + gfloat v; + gfloat *in = (gfloat *) _in; + + for (j = 0; j < len; j++) { + v = in[ip++]; + for (i = 1; i < channels; i++) + v += in[ip++]; + out[op] = v / channels; + op = (op + 1) % nfft; + } +} + +static void +input_data_mixed_double (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint i, j, ip = 0; + gfloat v; + gdouble *in = (gdouble *) _in; + + for (j = 0; j < len; j++) { + v = in[ip++]; + for (i = 1; i < channels; i++) + v += in[ip++]; + out[op] = v / channels; + op = (op + 1) % nfft; + } +} + +static void +input_data_mixed_int32 (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint i, j, ip = 0; + gint32 *in = (gint32 *) _in; + gfloat v; + + for (j = 0; j < len; j++) { + v = in[ip++] * 2 + 1; + for (i = 1; i < channels; i++) + v += in[ip++] * 2 + 1; + out[op] = v / channels; + op = (op + 1) % nfft; + } +} + +static void +input_data_mixed_int32_max (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint i, j, ip = 0; + gint32 *in = (gint32 *) _in; + gfloat v; + + for (j = 0; j < len; j++) { + v = in[ip++] / max_value; + for (i = 1; i < channels; i++) + v += in[ip++] / max_value; + out[op] = v / channels; + op = (op + 1) % nfft; + } +} + +static void +input_data_mixed_int24 (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint i, j; + gfloat v = 0.0; + + for (j = 0; j < len; j++) { + for (i = 0; i < channels; i++) { +#if G_BYTE_ORDER == G_BIG_ENDIAN + gint32 value = GST_READ_UINT24_BE (_in); +#else + gint32 value = GST_READ_UINT24_LE (_in); +#endif + if (value & 0x00800000) + value |= 0xff000000; + v += value * 2 + 1; + _in += 3; + } + out[op] = v / channels; + op = (op + 1) % nfft; + } +} + +static void +input_data_mixed_int24_max (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint i, j; + gfloat v = 0.0; + + for (j = 0; j < len; j++) { + for (i = 0; i < channels; i++) { +#if G_BYTE_ORDER == G_BIG_ENDIAN + gint32 value = GST_READ_UINT24_BE (_in); +#else + gint32 value = GST_READ_UINT24_LE (_in); +#endif + if (value & 0x00800000) + value |= 0xff000000; + v += value / max_value; + _in += 3; + } + out[op] = v / channels; + op = (op + 1) % nfft; + } +} + +static void +input_data_mixed_int16 (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint i, j, ip = 0; + gint16 *in = (gint16 *) _in; + gfloat v; + + for (j = 0; j < len; j++) { + v = in[ip++] * 2 + 1; + for (i = 1; i < channels; i++) + v += in[ip++] * 2 + 1; + out[op] = v / channels; + op = (op + 1) % nfft; + } +} + +static void +input_data_mixed_int16_max (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint i, j, ip = 0; + gint16 *in = (gint16 *) _in; + gfloat v; + + for (j = 0; j < len; j++) { + v = in[ip++] / max_value; + for (i = 1; i < channels; i++) + v += in[ip++] / max_value; + out[op] = v / channels; + op = (op + 1) % nfft; + } +} + +/* non mixing data readers */ + +static void +input_data_float (const guint8 * _in, gfloat * out, guint len, guint channels, + gfloat max_value, guint op, guint nfft) +{ + guint j, ip; + gfloat *in = (gfloat *) _in; + + for (j = 0, ip = 0; j < len; j++, ip += channels) { + out[op] = in[ip]; + op = (op + 1) % nfft; + } +} + +static void +input_data_double (const guint8 * _in, gfloat * out, guint len, guint channels, + gfloat max_value, guint op, guint nfft) +{ + guint j, ip; + gdouble *in = (gdouble *) _in; + + for (j = 0, ip = 0; j < len; j++, ip += channels) { + out[op] = in[ip]; + op = (op + 1) % nfft; + } +} + +static void +input_data_int32 (const guint8 * _in, gfloat * out, guint len, guint channels, + gfloat max_value, guint op, guint nfft) +{ + guint j, ip; + gint32 *in = (gint32 *) _in; + + for (j = 0, ip = 0; j < len; j++, ip += channels) { + out[op] = in[ip] * 2 + 1; + op = (op + 1) % nfft; + } +} + +static void +input_data_int32_max (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint j, ip; + gint32 *in = (gint32 *) _in; + + for (j = 0, ip = 0; j < len; j++, ip += channels) { + out[op] = in[ip] / max_value; + op = (op + 1) % nfft; + } +} + +static void +input_data_int24 (const guint8 * _in, gfloat * out, guint len, guint channels, + gfloat max_value, guint op, guint nfft) +{ + guint j; + + for (j = 0; j < len; j++) { +#if G_BYTE_ORDER == G_BIG_ENDIAN + gint32 v = GST_READ_UINT24_BE (_in); +#else + gint32 v = GST_READ_UINT24_LE (_in); +#endif + if (v & 0x00800000) + v |= 0xff000000; + _in += 3 * channels; + out[op] = v * 2 + 1; + op = (op + 1) % nfft; + } +} + +static void +input_data_int24_max (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint j; + + for (j = 0; j < len; j++) { +#if G_BYTE_ORDER == G_BIG_ENDIAN + gint32 v = GST_READ_UINT24_BE (_in); +#else + gint32 v = GST_READ_UINT24_LE (_in); +#endif + if (v & 0x00800000) + v |= 0xff000000; + _in += 3 * channels; + out[op] = v / max_value; + op = (op + 1) % nfft; + } +} + +static void +input_data_int16 (const guint8 * _in, gfloat * out, guint len, guint channels, + gfloat max_value, guint op, guint nfft) +{ + guint j, ip; + gint16 *in = (gint16 *) _in; + + for (j = 0, ip = 0; j < len; j++, ip += channels) { + out[op] = in[ip] * 2 + 1; + op = (op + 1) % nfft; + } +} + +static void +input_data_int16_max (const guint8 * _in, gfloat * out, guint len, + guint channels, gfloat max_value, guint op, guint nfft) +{ + guint j, ip; + gint16 *in = (gint16 *) _in; + + for (j = 0, ip = 0; j < len; j++, ip += channels) { + out[op] = in[ip] / max_value; + op = (op + 1) % nfft; + } +} + +static gboolean +gst_spectrum_setup (GstAudioFilter * base, GstRingBufferSpec * format) +{ + GstSpectrum *spectrum = GST_SPECTRUM (base); + guint width = format->width / 8; + gboolean is_float = (format->type == GST_BUFTYPE_FLOAT); + /* max_value will be 0 when depth is 1, + * interpret -1 and 0 as -1 and +1 if that's the case. */ + guint max_value = (1UL << (format->depth - 1)) - 1; + gboolean multi_channel = spectrum->multi_channel; + GstSpectrumInputData input_data = NULL; + + if (is_float) { + if (width == 4) { + input_data = multi_channel ? input_data_float : input_data_mixed_float; + } else if (width == 8) { + input_data = multi_channel ? input_data_double : input_data_mixed_double; + } else { + g_assert_not_reached (); + } + } else { + if (width == 4) { + if (max_value) { + input_data = + multi_channel ? input_data_int32_max : input_data_mixed_int32_max; + } else { + input_data = multi_channel ? input_data_int32 : input_data_mixed_int32; + } + } else if (width == 3) { + if (max_value) { + input_data = + multi_channel ? input_data_int24_max : input_data_mixed_int24_max; + } else { + input_data = multi_channel ? input_data_int24 : input_data_mixed_int24; + } + } else if (width == 2) { + if (max_value) { + input_data = + multi_channel ? input_data_int16_max : input_data_mixed_int16_max; + } else { + input_data = multi_channel ? input_data_int16 : input_data_mixed_int16; + } + } else { + g_assert_not_reached (); + } + } + + spectrum->input_data = input_data; + gst_spectrum_reset_state (spectrum); + return TRUE; +} + +static GValue * +gst_spectrum_message_add_container (GstStructure * s, GType type, + const gchar * name) +{ + GValue v = { 0, }; + + g_value_init (&v, type); + /* will copy-by-value */ + gst_structure_set_value (s, name, &v); + g_value_unset (&v); + return (GValue *) gst_structure_get_value (s, name); +} + +static void +gst_spectrum_message_add_list (GValue * cv, gfloat * data, guint num_values) +{ + GValue v = { 0, }; + guint i; + + g_value_init (&v, G_TYPE_FLOAT); + for (i = 0; i < num_values; i++) { + g_value_set_float (&v, data[i]); + gst_value_list_append_value (cv, &v); /* copies by value */ + } + g_value_unset (&v); +} + +static void +gst_spectrum_message_add_array (GValue * cv, gfloat * data, guint num_values) +{ + GValue v = { 0, }; + GValue a = { 0, }; + guint i; + + g_value_init (&a, GST_TYPE_ARRAY); + + g_value_init (&v, G_TYPE_FLOAT); + for (i = 0; i < num_values; i++) { + g_value_set_float (&v, data[i]); + gst_value_array_append_value (&a, &v); /* copies by value */ + } + g_value_unset (&v); + + gst_value_array_append_value (cv, &a); /* copies by value */ + g_value_unset (&a); +} + +static GstMessage * +gst_spectrum_message_new (GstSpectrum * spectrum, GstClockTime timestamp, + GstClockTime duration) +{ + GstBaseTransform *trans = GST_BASE_TRANSFORM_CAST (spectrum); + GstSpectrumChannel *cd; + GstStructure *s; + GValue *mcv = NULL, *pcv = NULL; + GstClockTime endtime, running_time, stream_time; + + GST_DEBUG_OBJECT (spectrum, "preparing message, bands =%d ", spectrum->bands); + + running_time = gst_segment_to_running_time (&trans->segment, GST_FORMAT_TIME, + timestamp); + stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, + timestamp); + /* endtime is for backwards compatibility */ + endtime = stream_time + duration; + + s = gst_structure_new ("spectrum", + "endtime", GST_TYPE_CLOCK_TIME, endtime, + "timestamp", G_TYPE_UINT64, timestamp, + "stream-time", G_TYPE_UINT64, stream_time, + "running-time", G_TYPE_UINT64, running_time, + "duration", G_TYPE_UINT64, duration, NULL); + + if (!spectrum->multi_channel) { + cd = &spectrum->channel_data[0]; + + if (spectrum->message_magnitude) { + /* FIXME 0.11: this should be an array, not a list */ + mcv = gst_spectrum_message_add_container (s, GST_TYPE_LIST, "magnitude"); + gst_spectrum_message_add_list (mcv, cd->spect_magnitude, spectrum->bands); + } + if (spectrum->message_phase) { + /* FIXME 0.11: this should be an array, not a list */ + pcv = gst_spectrum_message_add_container (s, GST_TYPE_LIST, "phase"); + gst_spectrum_message_add_list (pcv, cd->spect_phase, spectrum->bands); + } + } else { + guint c; + guint channels = GST_AUDIO_FILTER (spectrum)->format.channels; + + if (spectrum->message_magnitude) { + mcv = gst_spectrum_message_add_container (s, GST_TYPE_ARRAY, "magnitude"); + } + if (spectrum->message_phase) { + pcv = gst_spectrum_message_add_container (s, GST_TYPE_ARRAY, "phase"); + } + + for (c = 0; c < channels; c++) { + cd = &spectrum->channel_data[c]; + + if (spectrum->message_magnitude) { + gst_spectrum_message_add_array (mcv, cd->spect_magnitude, + spectrum->bands); + } + if (spectrum->message_phase) { + gst_spectrum_message_add_array (pcv, cd->spect_magnitude, + spectrum->bands); + } + } + } + return gst_message_new_element (GST_OBJECT (spectrum), s); +} + +static void +gst_spectrum_run_fft (GstSpectrum * spectrum, GstSpectrumChannel * cd, + guint input_pos) +{ + guint i; + guint bands = spectrum->bands; + guint nfft = 2 * bands - 2; + gint threshold = spectrum->threshold; + gfloat *input = cd->input; + gfloat *input_tmp = cd->input_tmp; + gfloat *spect_magnitude = cd->spect_magnitude; + gfloat *spect_phase = cd->spect_phase; + GstFFTF32Complex *freqdata = cd->freqdata; + GstFFTF32 *fft_ctx = cd->fft_ctx; + + for (i = 0; i < nfft; i++) + input_tmp[i] = input[(input_pos + i) % nfft]; + + gst_fft_f32_window (fft_ctx, input_tmp, GST_FFT_WINDOW_HAMMING); + + gst_fft_f32_fft (fft_ctx, input_tmp, freqdata); + + if (spectrum->message_magnitude) { + gdouble val; + /* Calculate magnitude in db */ + for (i = 0; i < bands; i++) { + val = freqdata[i].r * freqdata[i].r; + val += freqdata[i].i * freqdata[i].i; + val /= nfft * nfft; + val = 10.0 * log10 (val); + if (val < threshold) + val = threshold; + spect_magnitude[i] += val; + } + } + + if (spectrum->message_phase) { + /* Calculate phase */ + for (i = 0; i < bands; i++) + spect_phase[i] += atan2 (freqdata[i].i, freqdata[i].r); + } +} + +static void +gst_spectrum_prepare_message_data (GstSpectrum * spectrum, + GstSpectrumChannel * cd) +{ + guint i; + guint bands = spectrum->bands; + guint num_fft = spectrum->num_fft; + + /* Calculate average */ + if (spectrum->message_magnitude) { + gfloat *spect_magnitude = cd->spect_magnitude; + for (i = 0; i < bands; i++) + spect_magnitude[i] /= num_fft; + } + if (spectrum->message_phase) { + gfloat *spect_phase = cd->spect_phase; + for (i = 0; i < bands; i++) + spect_phase[i] /= num_fft; + } +} + +static void +gst_spectrum_reset_message_data (GstSpectrum * spectrum, + GstSpectrumChannel * cd) +{ + guint bands = spectrum->bands; + gfloat *spect_magnitude = cd->spect_magnitude; + gfloat *spect_phase = cd->spect_phase; + + /* reset spectrum accumulators */ + memset (spect_magnitude, 0, bands * sizeof (gfloat)); + memset (spect_phase, 0, bands * sizeof (gfloat)); +} + +static GstFlowReturn +gst_spectrum_transform_ip (GstBaseTransform * trans, GstBuffer * buffer) +{ + GstSpectrum *spectrum = GST_SPECTRUM (trans); + GstRingBufferSpec *format = &GST_AUDIO_FILTER (spectrum)->format; + guint rate = format->rate; + guint channels = format->channels; + guint output_channels = spectrum->multi_channel ? channels : 1; + guint c; + guint width = format->width / 8; + gfloat max_value = (1UL << (format->depth - 1)) - 1; + guint bands = spectrum->bands; + guint nfft = 2 * bands - 2; + guint input_pos; + gfloat *input; + const guint8 *data = GST_BUFFER_DATA (buffer); + guint size = GST_BUFFER_SIZE (buffer); + guint frame_size = width * channels; + guint fft_todo, msg_todo, block_size; + gboolean have_full_interval; + GstSpectrumChannel *cd; + GstSpectrumInputData input_data; + + GST_LOG_OBJECT (spectrum, "input size: %d bytes", GST_BUFFER_SIZE (buffer)); + + if (GST_BUFFER_IS_DISCONT (buffer)) { + GST_DEBUG_OBJECT (spectrum, "Discontinuity detected -- flushing"); + gst_spectrum_flush (spectrum); + } + + /* If we don't have a FFT context yet (or it was reset due to parameter + * changes) get one and allocate memory for everything + */ + if (spectrum->channel_data == NULL) { + GST_DEBUG_OBJECT (spectrum, "allocating for bands %u", bands); + + gst_spectrum_alloc_channel_data (spectrum); + + /* number of sample frames we process before posting a message + * interval is in ns */ + spectrum->frames_per_interval = + gst_util_uint64_scale (spectrum->interval, rate, GST_SECOND); + spectrum->frames_todo = spectrum->frames_per_interval; + /* rounding error for frames_per_interval in ns, + * aggregated it in accumulated_error */ + spectrum->error_per_interval = (spectrum->interval * rate) % GST_SECOND; + if (spectrum->frames_per_interval == 0) + spectrum->frames_per_interval = 1; + + GST_INFO_OBJECT (spectrum, "interval %" GST_TIME_FORMAT ", fpi %" + G_GUINT64_FORMAT ", error %" GST_TIME_FORMAT, + GST_TIME_ARGS (spectrum->interval), spectrum->frames_per_interval, + GST_TIME_ARGS (spectrum->error_per_interval)); + + spectrum->input_pos = 0; + + gst_spectrum_flush (spectrum); + } + + if (spectrum->num_frames == 0) + spectrum->message_ts = GST_BUFFER_TIMESTAMP (buffer); + + input_pos = spectrum->input_pos; + input_data = spectrum->input_data; + + while (size >= frame_size) { + /* run input_data for a chunk of data */ + fft_todo = nfft - (spectrum->num_frames % nfft); + msg_todo = spectrum->frames_todo - spectrum->num_frames; + GST_LOG_OBJECT (spectrum, + "message frames todo: %u, fft frames todo: %u, input frames %u", + msg_todo, fft_todo, (size / frame_size)); + block_size = msg_todo; + if (block_size > (size / frame_size)) + block_size = (size / frame_size); + if (block_size > fft_todo) + block_size = fft_todo; + + for (c = 0; c < output_channels; c++) { + cd = &spectrum->channel_data[c]; + input = cd->input; + /* Move the current frames into our ringbuffers */ + input_data (data + c * width, input, block_size, channels, max_value, + input_pos, nfft); + } + data += block_size * frame_size; + size -= block_size * frame_size; + input_pos = (input_pos + block_size) % nfft; + spectrum->num_frames += block_size; + + have_full_interval = (spectrum->num_frames == spectrum->frames_todo); + + GST_LOG_OBJECT (spectrum, "size: %u, do-fft = %d, do-message = %d", size, + (spectrum->num_frames % nfft == 0), have_full_interval); + + /* If we have enough frames for an FFT or we have all frames required for + * the interval and we haven't run a FFT, then run an FFT */ + if ((spectrum->num_frames % nfft == 0) || + (have_full_interval && !spectrum->num_fft)) { + for (c = 0; c < output_channels; c++) { + cd = &spectrum->channel_data[c]; + gst_spectrum_run_fft (spectrum, cd, input_pos); + } + spectrum->num_fft++; + } + + /* Do we have the FFTs for one interval? */ + if (have_full_interval) { + GST_DEBUG_OBJECT (spectrum, "nfft: %u frames: %" G_GUINT64_FORMAT + " fpi: %" G_GUINT64_FORMAT " error: %" GST_TIME_FORMAT, nfft, + spectrum->num_frames, spectrum->frames_per_interval, + GST_TIME_ARGS (spectrum->accumulated_error)); + + spectrum->frames_todo = spectrum->frames_per_interval; + if (spectrum->accumulated_error >= GST_SECOND) { + spectrum->accumulated_error -= GST_SECOND; + spectrum->frames_todo++; + } + spectrum->accumulated_error += spectrum->error_per_interval; + + if (spectrum->post_messages) { + GstMessage *m; + + for (c = 0; c < output_channels; c++) { + cd = &spectrum->channel_data[c]; + gst_spectrum_prepare_message_data (spectrum, cd); + } + + m = gst_spectrum_message_new (spectrum, spectrum->message_ts, + spectrum->interval); + + gst_element_post_message (GST_ELEMENT (spectrum), m); + } + + if (GST_CLOCK_TIME_IS_VALID (spectrum->message_ts)) + spectrum->message_ts += + gst_util_uint64_scale (spectrum->num_frames, GST_SECOND, rate); + + for (c = 0; c < output_channels; c++) { + cd = &spectrum->channel_data[c]; + gst_spectrum_reset_message_data (spectrum, cd); + } + spectrum->num_frames = 0; + spectrum->num_fft = 0; + } + } + + spectrum->input_pos = input_pos; + + g_assert (size == 0); + + return GST_FLOW_OK; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "spectrum", GST_RANK_NONE, + GST_TYPE_SPECTRUM); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "spectrum", + "Run an FFT on the audio signal, output spectrum data", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/spectrum/gstspectrum.h b/gst/spectrum/gstspectrum.h new file mode 100644 index 0000000..416072f --- /dev/null +++ b/gst/spectrum/gstspectrum.h @@ -0,0 +1,93 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2009> Sebastian Dröge + * + * 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_SPECTRUM_H__ +#define __GST_SPECTRUM_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SPECTRUM (gst_spectrum_get_type()) +#define GST_SPECTRUM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPECTRUM,GstSpectrum)) +#define GST_IS_SPECTRUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPECTRUM)) +#define GST_SPECTRUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_SPECTRUM,GstSpectrumClass)) +#define GST_IS_SPECTRUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_SPECTRUM)) +typedef struct _GstSpectrum GstSpectrum; +typedef struct _GstSpectrumClass GstSpectrumClass; +typedef struct _GstSpectrumChannel GstSpectrumChannel; + +typedef void (*GstSpectrumInputData)(const guint8 * in, gfloat * out, + guint len, guint channels, gfloat max_value, guint op, guint nfft); + +struct _GstSpectrumChannel +{ + gfloat *input; + gfloat *input_tmp; + GstFFTF32Complex *freqdata; + gfloat *spect_magnitude; /* accumulated mangitude and phase */ + gfloat *spect_phase; /* will be scaled by num_fft before sending */ + GstFFTF32 *fft_ctx; +}; + +struct _GstSpectrum +{ + GstAudioFilter parent; + + /* properties */ + gboolean post_messages; /* whether or not to post messages */ + gboolean message_magnitude; + gboolean message_phase; + guint64 interval; /* how many nanoseconds between emits */ + guint64 frames_per_interval; /* how many frames per interval */ + guint64 frames_todo; + guint bands; /* number of spectrum bands */ + gint threshold; /* energy level treshold */ + gboolean multi_channel; /* send separate channel results */ + + guint64 num_frames; /* frame count (1 sample per channel) + * since last emit */ + guint64 num_fft; /* number of FFTs since last emit */ + GstClockTime message_ts; /* starttime for next message */ + + /* */ + GstSpectrumChannel *channel_data; + guint num_channels; + + guint input_pos; + guint64 error_per_interval; + guint64 accumulated_error; + + GstSpectrumInputData input_data; +}; + +struct _GstSpectrumClass +{ + GstAudioFilterClass parent_class; +}; + +GType gst_spectrum_get_type (void); + +G_END_DECLS + +#endif /* __GST_SPECTRUM_H__ */ diff --git a/gst/udp/Makefile.am b/gst/udp/Makefile.am new file mode 100644 index 0000000..71a5971 --- /dev/null +++ b/gst/udp/Makefile.am @@ -0,0 +1,48 @@ +plugin_LTLIBRARIES = libgstudp.la + +# variables used for enum/marshal generation +glib_enum_headers = gstudp.h +glib_enum_define = GST_UDP +glib_gen_prefix = gst_udp +glib_gen_basename = gstudp + +include $(top_srcdir)/common/gst-glib-gen.mak + +built_sources = gstudp-enumtypes.c gstudp-marshal.c +built_headers = gstudp-enumtypes.h gstudp-marshal.h + +BUILT_SOURCES = $(built_sources) $(built_headers) + +libgstudp_la_SOURCES = gstudp.c gstudpsrc.c gstudpsink.c gstmultiudpsink.c gstdynudpsink.c gstudpnetutils.c + +# adding -D_GNU_SOURCE to get non-POSIX extensions like EAI_ADDRFAMILY +# with glibc >= 2.8 when including netdb.h (see glibc sources bug 6452) +libgstudp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) -D_GNU_SOURCE +libgstudp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstnetbuffer-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(WIN32_LIBS) +libgstudp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstudp_la_LIBTOOLFLAGS = --tag=disable-static + +nodist_libgstudp_la_SOURCES = \ + $(built_sources) + +noinst_HEADERS = gstudpsink.h gstudpsrc.h gstudp.h gstmultiudpsink.h gstdynudpsink.h gstudpnetutils.h + +EXTRA_DIST = README gstudp-marshal.list + +CLEANFILES = $(BUILT_SOURCES) + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstudp -:SHARED libgstudp \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstudp_la_SOURCES) \ + $(nodist_libgstudp_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstudp_la_CFLAGS) \ + -:LDFLAGS $(libgstudp_la_LDFLAGS) \ + $(libgstudp_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/udp/Makefile.in b/gst/udp/Makefile.in new file mode 100644 index 0000000..d842e69 --- /dev/null +++ b/gst/udp/Makefile.in @@ -0,0 +1,953 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# these are the variables your Makefile.am should set +# the example is based on the colorbalance interface + +#glib_enum_headers=$(colorbalance_headers) +#glib_enum_define=GST_COLOR_BALANCE +#glib_gen_prefix=gst_color_balance +#glib_gen_basename=colorbalance + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/common/gst-glib-gen.mak +subdir = gst/udp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstudp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstudp_la_OBJECTS = libgstudp_la-gstudp.lo \ + libgstudp_la-gstudpsrc.lo libgstudp_la-gstudpsink.lo \ + libgstudp_la-gstmultiudpsink.lo libgstudp_la-gstdynudpsink.lo \ + libgstudp_la-gstudpnetutils.lo +am__objects_1 = libgstudp_la-gstudp-enumtypes.lo \ + libgstudp_la-gstudp-marshal.lo +nodist_libgstudp_la_OBJECTS = $(am__objects_1) +libgstudp_la_OBJECTS = $(am_libgstudp_la_OBJECTS) \ + $(nodist_libgstudp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstudp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstudp_la_CFLAGS) $(CFLAGS) \ + $(libgstudp_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstudp_la_SOURCES) $(nodist_libgstudp_la_SOURCES) +DIST_SOURCES = $(libgstudp_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstudp.la + +# variables used for enum/marshal generation +glib_enum_headers = gstudp.h +glib_enum_define = GST_UDP +glib_gen_prefix = gst_udp +glib_gen_basename = gstudp +enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") +built_sources = gstudp-enumtypes.c gstudp-marshal.c +built_headers = gstudp-enumtypes.h gstudp-marshal.h +BUILT_SOURCES = $(built_sources) $(built_headers) +libgstudp_la_SOURCES = gstudp.c gstudpsrc.c gstudpsink.c gstmultiudpsink.c gstdynudpsink.c gstudpnetutils.c + +# adding -D_GNU_SOURCE to get non-POSIX extensions like EAI_ADDRFAMILY +# with glibc >= 2.8 when including netdb.h (see glibc sources bug 6452) +libgstudp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) -D_GNU_SOURCE +libgstudp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstnetbuffer-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(WIN32_LIBS) + +libgstudp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstudp_la_LIBTOOLFLAGS = --tag=disable-static +nodist_libgstudp_la_SOURCES = \ + $(built_sources) + +noinst_HEADERS = gstudpsink.h gstudpsrc.h gstudp.h gstmultiudpsink.h gstdynudpsink.h gstudpnetutils.h +EXTRA_DIST = README gstudp-marshal.list +CLEANFILES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/gst-glib-gen.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/udp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/udp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/gst-glib-gen.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstudp.la: $(libgstudp_la_OBJECTS) $(libgstudp_la_DEPENDENCIES) $(EXTRA_libgstudp_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstudp_la_LINK) -rpath $(plugindir) $(libgstudp_la_OBJECTS) $(libgstudp_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstdynudpsink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstmultiudpsink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudp-enumtypes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudp-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudpnetutils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudpsink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudpsrc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstudp_la-gstudp.lo: gstudp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudp.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudp.Tpo -c -o libgstudp_la-gstudp.lo `test -f 'gstudp.c' || echo '$(srcdir)/'`gstudp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudp.Tpo $(DEPDIR)/libgstudp_la-gstudp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudp.c' object='libgstudp_la-gstudp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudp.lo `test -f 'gstudp.c' || echo '$(srcdir)/'`gstudp.c + +libgstudp_la-gstudpsrc.lo: gstudpsrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudpsrc.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudpsrc.Tpo -c -o libgstudp_la-gstudpsrc.lo `test -f 'gstudpsrc.c' || echo '$(srcdir)/'`gstudpsrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudpsrc.Tpo $(DEPDIR)/libgstudp_la-gstudpsrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudpsrc.c' object='libgstudp_la-gstudpsrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudpsrc.lo `test -f 'gstudpsrc.c' || echo '$(srcdir)/'`gstudpsrc.c + +libgstudp_la-gstudpsink.lo: gstudpsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudpsink.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudpsink.Tpo -c -o libgstudp_la-gstudpsink.lo `test -f 'gstudpsink.c' || echo '$(srcdir)/'`gstudpsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudpsink.Tpo $(DEPDIR)/libgstudp_la-gstudpsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudpsink.c' object='libgstudp_la-gstudpsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudpsink.lo `test -f 'gstudpsink.c' || echo '$(srcdir)/'`gstudpsink.c + +libgstudp_la-gstmultiudpsink.lo: gstmultiudpsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstmultiudpsink.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstmultiudpsink.Tpo -c -o libgstudp_la-gstmultiudpsink.lo `test -f 'gstmultiudpsink.c' || echo '$(srcdir)/'`gstmultiudpsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstmultiudpsink.Tpo $(DEPDIR)/libgstudp_la-gstmultiudpsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmultiudpsink.c' object='libgstudp_la-gstmultiudpsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstmultiudpsink.lo `test -f 'gstmultiudpsink.c' || echo '$(srcdir)/'`gstmultiudpsink.c + +libgstudp_la-gstdynudpsink.lo: gstdynudpsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstdynudpsink.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstdynudpsink.Tpo -c -o libgstudp_la-gstdynudpsink.lo `test -f 'gstdynudpsink.c' || echo '$(srcdir)/'`gstdynudpsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstdynudpsink.Tpo $(DEPDIR)/libgstudp_la-gstdynudpsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdynudpsink.c' object='libgstudp_la-gstdynudpsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstdynudpsink.lo `test -f 'gstdynudpsink.c' || echo '$(srcdir)/'`gstdynudpsink.c + +libgstudp_la-gstudpnetutils.lo: gstudpnetutils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudpnetutils.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudpnetutils.Tpo -c -o libgstudp_la-gstudpnetutils.lo `test -f 'gstudpnetutils.c' || echo '$(srcdir)/'`gstudpnetutils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudpnetutils.Tpo $(DEPDIR)/libgstudp_la-gstudpnetutils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudpnetutils.c' object='libgstudp_la-gstudpnetutils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudpnetutils.lo `test -f 'gstudpnetutils.c' || echo '$(srcdir)/'`gstudpnetutils.c + +libgstudp_la-gstudp-enumtypes.lo: gstudp-enumtypes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudp-enumtypes.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudp-enumtypes.Tpo -c -o libgstudp_la-gstudp-enumtypes.lo `test -f 'gstudp-enumtypes.c' || echo '$(srcdir)/'`gstudp-enumtypes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudp-enumtypes.Tpo $(DEPDIR)/libgstudp_la-gstudp-enumtypes.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudp-enumtypes.c' object='libgstudp_la-gstudp-enumtypes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudp-enumtypes.lo `test -f 'gstudp-enumtypes.c' || echo '$(srcdir)/'`gstudp-enumtypes.c + +libgstudp_la-gstudp-marshal.lo: gstudp-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudp-marshal.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudp-marshal.Tpo -c -o libgstudp_la-gstudp-marshal.lo `test -f 'gstudp-marshal.c' || echo '$(srcdir)/'`gstudp-marshal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudp-marshal.Tpo $(DEPDIR)/libgstudp_la-gstudp-marshal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudp-marshal.c' object='libgstudp_la-gstudp-marshal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudp-marshal.lo `test -f 'gstudp-marshal.c' || echo '$(srcdir)/'`gstudp-marshal.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# these are all the rules generating the relevant files +$(glib_gen_basename)-marshal.h: $(glib_gen_basename)-marshal.list + $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_gen_prefix)_marshal $^ > $(glib_gen_basename)-marshal.h.tmp && \ + mv $(glib_gen_basename)-marshal.h.tmp $(glib_gen_basename)-marshal.h + +$(glib_gen_basename)-marshal.c: $(glib_gen_basename)-marshal.list + $(AM_V_GEN)echo "#include \"$(glib_gen_basename)-marshal.h\"" >> $(glib_gen_basename)-marshal.c.tmp && \ + glib-genmarshal --body --prefix=$(glib_gen_prefix)_marshal $^ >> $(glib_gen_basename)-marshal.c.tmp && \ + mv $(glib_gen_basename)-marshal.c.tmp $(glib_gen_basename)-marshal.c + +$(glib_gen_basename)-enumtypes.h: $(glib_enum_headers) + $(AM_V_GEN)glib-mkenums \ + --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ + --fprod "\n/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ + $^ > $@ + +$(glib_gen_basename)-enumtypes.c: $(glib_enum_headers) + @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi + $(AM_V_GEN)glib-mkenums \ + --fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ + $^ > $@ + +# a hack rule to make sure .Plo files exist because they get include'd +# from Makefile's +.deps/%-marshal.Plo: + @touch $@ + +.deps/%-enumtypes.Plo: + @touch $@ + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstudp -:SHARED libgstudp \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstudp_la_SOURCES) \ + $(nodist_libgstudp_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstudp_la_CFLAGS) \ + -:LDFLAGS $(libgstudp_la_LDFLAGS) \ + $(libgstudp_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/udp/README b/gst/udp/README new file mode 100644 index 0000000..9b7cebb --- /dev/null +++ b/gst/udp/README @@ -0,0 +1,7 @@ +* What is UDP src/sink? + +It is a set of element to transfer data using UDP, nothing more, nothing less. +Its main purpose is to be used in conjunction with RTP but they are kept as +separate elements because we can. + + diff --git a/gst/udp/gstdynudpsink.c b/gst/udp/gstdynudpsink.c new file mode 100644 index 0000000..18c58ca --- /dev/null +++ b/gst/udp/gstdynudpsink.c @@ -0,0 +1,397 @@ +/* GStreamer + * Copyright (C) <2005> Philippe Khalaf + * Copyright (C) <2005> Nokia Corporation + * Copyright (C) <2006> Joni Valtanen + * + * 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 "gstudp-marshal.h" +#include "gstdynudpsink.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#include + +GST_DEBUG_CATEGORY_STATIC (dynudpsink_debug); +#define GST_CAT_DEFAULT (dynudpsink_debug) + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +/* DynUDPSink signals and args */ +enum +{ + /* methods */ + SIGNAL_GET_STATS, + + /* signals */ + + /* FILL ME */ + LAST_SIGNAL +}; + +#define UDP_DEFAULT_SOCKFD -1 +#define UDP_DEFAULT_CLOSEFD TRUE + +enum +{ + PROP_0, + PROP_SOCKFD, + PROP_CLOSEFD +}; + +#define CLOSE_IF_REQUESTED(udpctx) \ +G_STMT_START { \ + if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \ + CLOSE_SOCKET(udpctx->sock); \ + if (udpctx->sock == udpctx->sockfd) \ + udpctx->sockfd = UDP_DEFAULT_SOCKFD; \ + } \ + udpctx->sock = -1; \ +} G_STMT_END + +static void gst_dynudpsink_base_init (gpointer g_class); +static void gst_dynudpsink_class_init (GstDynUDPSink * klass); +static void gst_dynudpsink_init (GstDynUDPSink * udpsink); +static void gst_dynudpsink_finalize (GObject * object); + +static GstFlowReturn gst_dynudpsink_render (GstBaseSink * sink, + GstBuffer * buffer); +static void gst_dynudpsink_close (GstDynUDPSink * sink); +static GstStateChangeReturn gst_dynudpsink_change_state (GstElement * element, + GstStateChange transition); + +static void gst_dynudpsink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_dynudpsink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstElementClass *parent_class = NULL; + +static guint gst_dynudpsink_signals[LAST_SIGNAL] = { 0 }; + +GType +gst_dynudpsink_get_type (void) +{ + static GType dynudpsink_type = 0; + + if (!dynudpsink_type) { + static const GTypeInfo dynudpsink_info = { + sizeof (GstDynUDPSinkClass), + gst_dynudpsink_base_init, + NULL, + (GClassInitFunc) gst_dynudpsink_class_init, + NULL, + NULL, + sizeof (GstDynUDPSink), + 0, + (GInstanceInitFunc) gst_dynudpsink_init, + NULL + }; + + dynudpsink_type = + g_type_register_static (GST_TYPE_BASE_SINK, "GstDynUDPSink", + &dynudpsink_info, 0); + } + return dynudpsink_type; +} + +static void +gst_dynudpsink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + + gst_element_class_set_details_simple (element_class, "UDP packet sender", + "Sink/Network", + "Send data over the network via UDP", + "Philippe Khalaf "); +} + +static void +gst_dynudpsink_class_init (GstDynUDPSink * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_dynudpsink_set_property; + gobject_class->get_property = gst_dynudpsink_get_property; + gobject_class->finalize = gst_dynudpsink_finalize; + + gst_dynudpsink_signals[SIGNAL_GET_STATS] = + g_signal_new ("get-stats", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstDynUDPSinkClass, get_stats), + NULL, NULL, gst_udp_marshal_BOXED__STRING_INT, G_TYPE_VALUE_ARRAY, 2, + G_TYPE_STRING, G_TYPE_INT); + + g_object_class_install_property (gobject_class, PROP_SOCKFD, + g_param_spec_int ("sockfd", "socket handle", + "Socket to use for UDP sending. (-1 == allocate)", + -1, G_MAXINT16, UDP_DEFAULT_SOCKFD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CLOSEFD, + g_param_spec_boolean ("closefd", "Close sockfd", + "Close sockfd if passed as property on state change", + UDP_DEFAULT_CLOSEFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = gst_dynudpsink_change_state; + + gstbasesink_class->render = gst_dynudpsink_render; + + GST_DEBUG_CATEGORY_INIT (dynudpsink_debug, "dynudpsink", 0, "UDP sink"); +} + +static void +gst_dynudpsink_init (GstDynUDPSink * sink) +{ + WSA_STARTUP (sink); + + sink->sockfd = UDP_DEFAULT_SOCKFD; + sink->closefd = UDP_DEFAULT_CLOSEFD; + sink->externalfd = FALSE; + + sink->sock = -1; +} + +static void +gst_dynudpsink_finalize (GObject * object) +{ + GstDynUDPSink *udpsink; + + udpsink = GST_DYNUDPSINK (object); + + if (udpsink->sockfd >= 0 && udpsink->closefd) + CLOSE_SOCKET (udpsink->sockfd); + + G_OBJECT_CLASS (parent_class)->finalize (object); + + WSA_CLEANUP (object); +} + +static GstFlowReturn +gst_dynudpsink_render (GstBaseSink * bsink, GstBuffer * buffer) +{ + GstDynUDPSink *sink; + gint ret, size; + guint8 *data; + GstNetBuffer *netbuf; + struct sockaddr_in theiraddr; + guint16 destport; + guint32 destaddr; + + memset (&theiraddr, 0, sizeof (theiraddr)); + + if (GST_IS_NETBUFFER (buffer)) { + netbuf = GST_NETBUFFER (buffer); + } else { + GST_DEBUG ("Received buffer is not a GstNetBuffer, skipping"); + return GST_FLOW_OK; + } + + sink = GST_DYNUDPSINK (bsink); + + size = GST_BUFFER_SIZE (netbuf); + data = GST_BUFFER_DATA (netbuf); + + GST_DEBUG ("about to send %d bytes", size); + + // let's get the address from the netbuffer + gst_netaddress_get_ip4_address (&netbuf->to, &destaddr, &destport); + + GST_DEBUG ("sending %d bytes to client %d port %d", size, destaddr, destport); + + theiraddr.sin_family = AF_INET; + theiraddr.sin_addr.s_addr = destaddr; + theiraddr.sin_port = destport; +#ifdef G_OS_WIN32 + ret = sendto (sink->sock, (char *) data, size, 0, +#else + ret = sendto (sink->sock, data, size, 0, +#endif + (struct sockaddr *) &theiraddr, sizeof (theiraddr)); + + if (ret < 0) { + if (errno != EINTR && errno != EAGAIN) { + goto send_error; + } + } + + GST_DEBUG ("sent %d bytes", size); + + return GST_FLOW_OK; + +send_error: + { + GST_DEBUG ("got send error %s (%d)", g_strerror (errno), errno); + return GST_FLOW_ERROR; + } +} + +static void +gst_dynudpsink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstDynUDPSink *udpsink; + + udpsink = GST_DYNUDPSINK (object); + + switch (prop_id) { + case PROP_SOCKFD: + if (udpsink->sockfd >= 0 && udpsink->sockfd != udpsink->sock && + udpsink->closefd) + CLOSE_SOCKET (udpsink->sockfd); + udpsink->sockfd = g_value_get_int (value); + GST_DEBUG ("setting SOCKFD to %d", udpsink->sockfd); + break; + case PROP_CLOSEFD: + udpsink->closefd = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_dynudpsink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstDynUDPSink *udpsink; + + udpsink = GST_DYNUDPSINK (object); + + switch (prop_id) { + case PROP_SOCKFD: + g_value_set_int (value, udpsink->sockfd); + break; + case PROP_CLOSEFD: + g_value_set_boolean (value, udpsink->closefd); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +/* create a socket for sending to remote machine */ +static gboolean +gst_dynudpsink_init_send (GstDynUDPSink * sink) +{ + guint bc_val; + + if (sink->sockfd == -1) { + /* create sender socket if none available */ + if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) < 0) + goto no_socket; + + bc_val = 1; + if (setsockopt (sink->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, + sizeof (bc_val)) < 0) + goto no_broadcast; + + sink->externalfd = TRUE; + } else { + sink->sock = sink->sockfd; + sink->externalfd = TRUE; + } + return TRUE; + + /* ERRORS */ +no_socket: + { + perror ("socket"); + return FALSE; + } +no_broadcast: + { + perror ("setsockopt"); + CLOSE_IF_REQUESTED (sink); + return FALSE; + } +} + +GValueArray * +gst_dynudpsink_get_stats (GstDynUDPSink * sink, const gchar * host, gint port) +{ + return NULL; +} + +static void +gst_dynudpsink_close (GstDynUDPSink * sink) +{ + CLOSE_IF_REQUESTED (sink); +} + +static GstStateChangeReturn +gst_dynudpsink_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstDynUDPSink *sink; + + sink = GST_DYNUDPSINK (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + if (!gst_dynudpsink_init_send (sink)) + goto no_init; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_dynudpsink_close (sink); + break; + default: + break; + } + return ret; + + /* ERRORS */ +no_init: + { + return GST_STATE_CHANGE_FAILURE; + } +} diff --git a/gst/udp/gstdynudpsink.h b/gst/udp/gstdynudpsink.h new file mode 100644 index 0000000..d46dfdf --- /dev/null +++ b/gst/udp/gstdynudpsink.h @@ -0,0 +1,71 @@ +/* GStreamer + * Copyright (C) <2005> Philippe Khalaf + * + * 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_DYNUDPSINK_H__ +#define __GST_DYNUDPSINK_H__ + +#include +#include + +G_BEGIN_DECLS + +#include "gstudpnetutils.h" + +#include "gstudp.h" + +#define GST_TYPE_DYNUDPSINK (gst_dynudpsink_get_type()) +#define GST_DYNUDPSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DYNUDPSINK,GstDynUDPSink)) +#define GST_DYNUDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DYNUDPSINK,GstDynUDPSinkClass)) +#define GST_IS_DYNUDPSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DYNUDPSINK)) +#define GST_IS_DYNUDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DYNUDPSINK)) + +typedef struct _GstDynUDPSink GstDynUDPSink; +typedef struct _GstDynUDPSinkClass GstDynUDPSinkClass; + + +/* sends udp packets to host/port pairs contained in the GstNetBuffer received. + */ +struct _GstDynUDPSink { + GstBaseSink parent; + + /* properties */ + gint sockfd; + gboolean closefd; + + /* the socket in use */ + int sock; + gboolean externalfd; +}; + +struct _GstDynUDPSinkClass { + GstBaseSinkClass parent_class; + + /* element methods */ + GValueArray* (*get_stats) (GstDynUDPSink *sink, const gchar *host, gint port); + + /* signals */ +}; + +GType gst_dynudpsink_get_type(void); + +GValueArray* gst_dynudpsink_get_stats (GstDynUDPSink *sink, const gchar *host, gint port); + +G_END_DECLS + +#endif /* __GST_DYNUDPSINK_H__ */ diff --git a/gst/udp/gstmultiudpsink.c b/gst/udp/gstmultiudpsink.c new file mode 100644 index 0000000..52e2333 --- /dev/null +++ b/gst/udp/gstmultiudpsink.c @@ -0,0 +1,1299 @@ +/* GStreamer + * Copyright (C) <2007> Wim Taymans + * Copyright (C) <2009> Jarkko Palviainen + * + * 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-multiudpsink + * @see_also: udpsink, multifdsink + * + * multiudpsink is a network sink that sends UDP packets to multiple + * clients. + * It can be combined with rtp payload encoders to implement RTP streaming. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "gstudp-marshal.h" +#include "gstmultiudpsink.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +#include "gst/glib-compat-private.h" + +GST_DEBUG_CATEGORY_STATIC (multiudpsink_debug); +#define GST_CAT_DEFAULT (multiudpsink_debug) + +#define UDP_MAX_SIZE 65507 + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +/* MultiUDPSink signals and args */ +enum +{ + /* methods */ + SIGNAL_ADD, + SIGNAL_REMOVE, + SIGNAL_CLEAR, + SIGNAL_GET_STATS, + + /* signals */ + SIGNAL_CLIENT_ADDED, + SIGNAL_CLIENT_REMOVED, + + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_SOCKFD -1 +#define DEFAULT_CLOSEFD TRUE +#define DEFAULT_SOCK -1 +#define DEFAULT_CLIENTS NULL +#define DEFAULT_FAMILY 0 +/* FIXME, this should be disabled by default, we don't need to join a multicast + * group for sending, if this socket is also used for receiving, it should + * be configured in the element that does the receive. */ +#define DEFAULT_AUTO_MULTICAST TRUE +#define DEFAULT_TTL 64 +#define DEFAULT_TTL_MC 1 +#define DEFAULT_LOOP TRUE +#define DEFAULT_QOS_DSCP -1 +#define DEFAULT_SEND_DUPLICATES TRUE +#define DEFAULT_BUFFER_SIZE 0 + +enum +{ + PROP_0, + PROP_BYTES_TO_SERVE, + PROP_BYTES_SERVED, + PROP_SOCKFD, + PROP_CLOSEFD, + PROP_SOCK, + PROP_CLIENTS, + PROP_AUTO_MULTICAST, + PROP_TTL, + PROP_TTL_MC, + PROP_LOOP, + PROP_QOS_DSCP, + PROP_SEND_DUPLICATES, + PROP_BUFFER_SIZE, + PROP_LAST +}; + +#define CLOSE_IF_REQUESTED(udpctx) \ +G_STMT_START { \ + if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \ + CLOSE_SOCKET(udpctx->sock); \ + if (udpctx->sock == udpctx->sockfd) \ + udpctx->sockfd = DEFAULT_SOCKFD; \ + } \ + udpctx->sock = DEFAULT_SOCK; \ +} G_STMT_END + +static void gst_multiudpsink_base_init (gpointer g_class); +static void gst_multiudpsink_class_init (GstMultiUDPSinkClass * klass); +static void gst_multiudpsink_init (GstMultiUDPSink * udpsink); +static void gst_multiudpsink_finalize (GObject * object); + +static GstFlowReturn gst_multiudpsink_render (GstBaseSink * sink, + GstBuffer * buffer); +#ifndef G_OS_WIN32 /* sendmsg() is not available on Windows */ +static GstFlowReturn gst_multiudpsink_render_list (GstBaseSink * bsink, + GstBufferList * list); +#endif +static GstStateChangeReturn gst_multiudpsink_change_state (GstElement * + element, GstStateChange transition); + +static void gst_multiudpsink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_multiudpsink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_multiudpsink_add_internal (GstMultiUDPSink * sink, + const gchar * host, gint port, gboolean lock); +static void gst_multiudpsink_clear_internal (GstMultiUDPSink * sink, + gboolean lock); + +static GstElementClass *parent_class = NULL; + +static guint gst_multiudpsink_signals[LAST_SIGNAL] = { 0 }; + +GType +gst_multiudpsink_get_type (void) +{ + static GType multiudpsink_type = 0; + + if (!multiudpsink_type) { + static const GTypeInfo multiudpsink_info = { + sizeof (GstMultiUDPSinkClass), + gst_multiudpsink_base_init, + NULL, + (GClassInitFunc) gst_multiudpsink_class_init, + NULL, + NULL, + sizeof (GstMultiUDPSink), + 0, + (GInstanceInitFunc) gst_multiudpsink_init, + NULL + }; + + multiudpsink_type = + g_type_register_static (GST_TYPE_BASE_SINK, "GstMultiUDPSink", + &multiudpsink_info, 0); + } + return multiudpsink_type; +} + +static void +gst_multiudpsink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + + gst_element_class_set_details_simple (element_class, "UDP packet sender", + "Sink/Network", + "Send data over the network via UDP", + "Wim Taymans "); +} + +static void +gst_multiudpsink_class_init (GstMultiUDPSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_multiudpsink_set_property; + gobject_class->get_property = gst_multiudpsink_get_property; + gobject_class->finalize = gst_multiudpsink_finalize; + + /** + * GstMultiUDPSink::add: + * @gstmultiudpsink: the sink on which the signal is emitted + * @host: the hostname/IP address of the client to add + * @port: the port of the client to add + * + * Add a client with destination @host and @port to the list of + * clients. When the same host/port pair is added multiple times, the + * send-duplicates property defines if the packets are sent multiple times to + * the same host/port pair or not. + * + * When a host/port pair is added multiple times, an equal amount of remove + * calls must be performed to actually remove the host/port pair from the list + * of destinations. + */ + gst_multiudpsink_signals[SIGNAL_ADD] = + g_signal_new ("add", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GstMultiUDPSinkClass, add), + NULL, NULL, gst_udp_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, + G_TYPE_STRING, G_TYPE_INT); + /** + * GstMultiUDPSink::remove: + * @gstmultiudpsink: the sink on which the signal is emitted + * @host: the hostname/IP address of the client to remove + * @port: the port of the client to remove + * + * Remove the client with destination @host and @port from the list of + * clients. + */ + gst_multiudpsink_signals[SIGNAL_REMOVE] = + g_signal_new ("remove", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GstMultiUDPSinkClass, remove), + NULL, NULL, gst_udp_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, + G_TYPE_STRING, G_TYPE_INT); + /** + * GstMultiUDPSink::clear: + * @gstmultiudpsink: the sink on which the signal is emitted + * + * Clear the list of clients. + */ + gst_multiudpsink_signals[SIGNAL_CLEAR] = + g_signal_new ("clear", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GstMultiUDPSinkClass, clear), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + /** + * GstMultiUDPSink::get-stats: + * @gstmultiudpsink: the sink on which the signal is emitted + * @host: the hostname/IP address of the client to get stats on + * @port: the port of the client to get stats on + * + * Get the statistics of the client with destination @host and @port. + * + * Returns: a GValueArray of uint64: bytes_sent, packets_sent, + * connect_time (in epoch seconds), disconnect_time (in epoch seconds) + */ + gst_multiudpsink_signals[SIGNAL_GET_STATS] = + g_signal_new ("get-stats", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GstMultiUDPSinkClass, get_stats), + NULL, NULL, gst_udp_marshal_BOXED__STRING_INT, G_TYPE_VALUE_ARRAY, 2, + G_TYPE_STRING, G_TYPE_INT); + /** + * GstMultiUDPSink::client-added: + * @gstmultiudpsink: the sink emitting the signal + * @host: the hostname/IP address of the added client + * @port: the port of the added client + * + * Signal emited when a new client is added to the list of + * clients. + */ + gst_multiudpsink_signals[SIGNAL_CLIENT_ADDED] = + g_signal_new ("client-added", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiUDPSinkClass, client_added), + NULL, NULL, gst_udp_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, + G_TYPE_STRING, G_TYPE_INT); + /** + * GstMultiUDPSink::client-removed: + * @gstmultiudpsink: the sink emitting the signal + * @host: the hostname/IP address of the removed client + * @port: the port of the removed client + * + * Signal emited when a client is removed from the list of + * clients. + */ + gst_multiudpsink_signals[SIGNAL_CLIENT_REMOVED] = + g_signal_new ("client-removed", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiUDPSinkClass, + client_removed), NULL, NULL, gst_udp_marshal_VOID__STRING_INT, + G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BYTES_TO_SERVE, + g_param_spec_uint64 ("bytes-to-serve", "Bytes to serve", + "Number of bytes received to serve to clients", 0, G_MAXUINT64, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BYTES_SERVED, + g_param_spec_uint64 ("bytes-served", "Bytes served", + "Total number of bytes sent to all clients", 0, G_MAXUINT64, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SOCKFD, + g_param_spec_int ("sockfd", "Socket Handle", + "Socket to use for UDP sending. (-1 == allocate)", + -1, G_MAXINT, DEFAULT_SOCKFD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CLOSEFD, + g_param_spec_boolean ("closefd", "Close sockfd", + "Close sockfd if passed as property on state change", + DEFAULT_CLOSEFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SOCK, + g_param_spec_int ("sock", "Socket Handle", + "Socket currently in use for UDP sending. (-1 == no socket)", + -1, G_MAXINT, DEFAULT_SOCK, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CLIENTS, + g_param_spec_string ("clients", "Clients", + "A comma separated list of host:port pairs with destinations", + DEFAULT_CLIENTS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_AUTO_MULTICAST, + g_param_spec_boolean ("auto-multicast", + "Automatically join/leave multicast groups", + "Automatically join/leave the multicast groups, FALSE means user" + " has to do it himself", DEFAULT_AUTO_MULTICAST, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_TTL, + g_param_spec_int ("ttl", "Unicast TTL", + "Used for setting the unicast TTL parameter", + 0, 255, DEFAULT_TTL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_TTL_MC, + g_param_spec_int ("ttl-mc", "Multicast TTL", + "Used for setting the multicast TTL parameter", + 0, 255, DEFAULT_TTL_MC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_LOOP, + g_param_spec_boolean ("loop", "Multicast Loopback", + "Used for setting the multicast loop parameter. TRUE = enable," + " FALSE = disable", DEFAULT_LOOP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QOS_DSCP, + g_param_spec_int ("qos-dscp", "QoS diff srv code point", + "Quality of Service, differentiated services code point (-1 default)", + -1, 63, DEFAULT_QOS_DSCP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstMultiUDPSink::send-duplicates + * + * When a host/port pair is added mutliple times, send the packet to the host + * multiple times as well. + * + * Since: 0.10.26 + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEND_DUPLICATES, + g_param_spec_boolean ("send-duplicates", "Send Duplicates", + "When a distination/port pair is added multiple times, send packets " + "multiple times as well", DEFAULT_SEND_DUPLICATES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_SIZE, + g_param_spec_int ("buffer-size", "Buffer Size", + "Size of the kernel send buffer in bytes, 0=default", 0, G_MAXINT, + DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = gst_multiudpsink_change_state; + + gstbasesink_class->render = gst_multiudpsink_render; +#ifndef G_OS_WIN32 + gstbasesink_class->render_list = gst_multiudpsink_render_list; +#endif + klass->add = gst_multiudpsink_add; + klass->remove = gst_multiudpsink_remove; + klass->clear = gst_multiudpsink_clear; + klass->get_stats = gst_multiudpsink_get_stats; + + GST_DEBUG_CATEGORY_INIT (multiudpsink_debug, "multiudpsink", 0, "UDP sink"); +} + + +static void +gst_multiudpsink_init (GstMultiUDPSink * sink) +{ + WSA_STARTUP (sink); + + sink->client_lock = g_mutex_new (); + sink->sock = DEFAULT_SOCK; + sink->sockfd = DEFAULT_SOCKFD; + sink->closefd = DEFAULT_CLOSEFD; + sink->externalfd = (sink->sockfd != -1); + sink->auto_multicast = DEFAULT_AUTO_MULTICAST; + sink->ttl = DEFAULT_TTL; + sink->ttl_mc = DEFAULT_TTL_MC; + sink->loop = DEFAULT_LOOP; + sink->qos_dscp = DEFAULT_QOS_DSCP; + sink->ss_family = DEFAULT_FAMILY; + sink->send_duplicates = DEFAULT_SEND_DUPLICATES; +} + +static GstUDPClient * +create_client (GstMultiUDPSink * sink, const gchar * host, gint port) +{ + GstUDPClient *client; + + client = g_slice_new0 (GstUDPClient); + client->refcount = 1; + client->host = g_strdup (host); + client->port = port; + + return client; +} + +static void +free_client (GstUDPClient * client) +{ + g_free (client->host); + g_slice_free (GstUDPClient, client); +} + +static gint +client_compare (GstUDPClient * a, GstUDPClient * b) +{ + if ((a->port == b->port) && (strcmp (a->host, b->host) == 0)) + return 0; + + return 1; +} + +static void +gst_multiudpsink_finalize (GObject * object) +{ + GstMultiUDPSink *sink; + + sink = GST_MULTIUDPSINK (object); + + g_list_foreach (sink->clients, (GFunc) free_client, NULL); + g_list_free (sink->clients); + + if (sink->sockfd >= 0 && sink->closefd) + CLOSE_SOCKET (sink->sockfd); + + g_mutex_free (sink->client_lock); + + WSA_CLEANUP (object); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +socket_error_is_ignorable (void) +{ +#ifdef G_OS_WIN32 + /* Windows doesn't seem to have an EAGAIN for sockets */ + return WSAGetLastError () == WSAEINTR; +#else + return errno == EINTR || errno == EAGAIN; +#endif +} + +static int +socket_last_error_code (void) +{ +#ifdef G_OS_WIN32 + return WSAGetLastError (); +#else + return errno; +#endif +} + +static gchar * +socket_last_error_message (void) +{ +#ifdef G_OS_WIN32 + int errorcode = WSAGetLastError (); + wchar_t buf[1024]; + DWORD result = + FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, errorcode, 0, (LPSTR) buf, sizeof (buf) / sizeof (wchar_t), NULL); + if (FAILED (result)) { + return g_strdup ("failed to get error message from system"); + } else { + gchar *res = + g_convert ((gchar *) buf, -1, "UTF-16", "UTF-8", NULL, NULL, NULL); + /* g_convert() internally calls windows functions which reset the + windows error code, so fix it up again like this */ + WSASetLastError (errorcode); + return res; + } +#else + return g_strdup (g_strerror (errno)); +#endif +} + +static GstFlowReturn +gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer) +{ + GstMultiUDPSink *sink; + gint ret, size, num = 0, no_clients = 0; + guint8 *data; + GList *clients; + gint len; + + sink = GST_MULTIUDPSINK (bsink); + + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + + if (size > UDP_MAX_SIZE) { + GST_WARNING ("Attempting to send a UDP packet larger than maximum " + "size (%d > %d)", size, UDP_MAX_SIZE); + } + + sink->bytes_to_serve += size; + + /* grab lock while iterating and sending to clients, this should be + * fast as UDP never blocks */ + g_mutex_lock (sink->client_lock); + GST_LOG_OBJECT (bsink, "about to send %d bytes", size); + + for (clients = sink->clients; clients; clients = g_list_next (clients)) { + GstUDPClient *client; + gint count; + + client = (GstUDPClient *) clients->data; + no_clients++; + GST_LOG_OBJECT (sink, "sending %d bytes to client %p", size, client); + + count = sink->send_duplicates ? client->refcount : 1; + + while (count--) { + while (TRUE) { + len = gst_udp_get_sockaddr_length (&client->theiraddr); + + ret = sendto (*client->sock, +#ifdef G_OS_WIN32 + (char *) data, +#else + data, +#endif + size, 0, (struct sockaddr *) &client->theiraddr, len); + + if (ret < 0) { + /* some error, just warn, it's likely recoverable and we don't want to + * break streaming. We break so that we stop retrying for this client. */ + if (!socket_error_is_ignorable ()) { + gchar *errormessage = socket_last_error_message (); + GST_WARNING_OBJECT (sink, "client %p gave error %d (%s)", client, + socket_last_error_code (), errormessage); + g_free (errormessage); + break; + } + } else { + num++; + client->bytes_sent += ret; + client->packets_sent++; + sink->bytes_served += ret; + break; + } + } + } + } + g_mutex_unlock (sink->client_lock); + + GST_LOG_OBJECT (sink, "sent %d bytes to %d (of %d) clients", size, num, + no_clients); + + return GST_FLOW_OK; +} + +#ifndef G_OS_WIN32 +static GstFlowReturn +gst_multiudpsink_render_list (GstBaseSink * bsink, GstBufferList * list) +{ + GstMultiUDPSink *sink; + GList *clients; + gint ret, size = 0, num = 0, no_clients = 0; + struct iovec *iov; + struct msghdr msg = { 0 }; + + GstBufferListIterator *it; + guint gsize; + GstBuffer *buf; + + sink = GST_MULTIUDPSINK (bsink); + + g_return_val_if_fail (list != NULL, GST_FLOW_ERROR); + + it = gst_buffer_list_iterate (list); + g_return_val_if_fail (it != NULL, GST_FLOW_ERROR); + + while (gst_buffer_list_iterator_next_group (it)) { + msg.msg_iovlen = 0; + size = 0; + + if ((gsize = gst_buffer_list_iterator_n_buffers (it)) == 0) { + goto invalid_list; + } + + iov = (struct iovec *) g_malloc (gsize * sizeof (struct iovec)); + msg.msg_iov = iov; + + while ((buf = gst_buffer_list_iterator_next (it))) { + if (GST_BUFFER_SIZE (buf) > UDP_MAX_SIZE) { + GST_WARNING ("Attempting to send a UDP packet larger than maximum " + "size (%d > %d)", GST_BUFFER_SIZE (buf), UDP_MAX_SIZE); + } + + msg.msg_iov[msg.msg_iovlen].iov_len = GST_BUFFER_SIZE (buf); + msg.msg_iov[msg.msg_iovlen].iov_base = GST_BUFFER_DATA (buf); + msg.msg_iovlen++; + size += GST_BUFFER_SIZE (buf); + } + + sink->bytes_to_serve += size; + + /* grab lock while iterating and sending to clients, this should be + * fast as UDP never blocks */ + g_mutex_lock (sink->client_lock); + GST_LOG_OBJECT (bsink, "about to send %d bytes", size); + + for (clients = sink->clients; clients; clients = g_list_next (clients)) { + GstUDPClient *client; + gint count; + + client = (GstUDPClient *) clients->data; + no_clients++; + GST_LOG_OBJECT (sink, "sending %d bytes to client %p", size, client); + + count = sink->send_duplicates ? client->refcount : 1; + + while (count--) { + while (TRUE) { + msg.msg_name = (void *) &client->theiraddr; + msg.msg_namelen = sizeof (client->theiraddr); + ret = sendmsg (*client->sock, &msg, 0); + + if (ret < 0) { + if (!socket_error_is_ignorable ()) { + break; + } + } else { + num++; + client->bytes_sent += ret; + client->packets_sent++; + sink->bytes_served += ret; + break; + } + } + } + } + g_mutex_unlock (sink->client_lock); + + g_free (iov); + msg.msg_iov = NULL; + + GST_LOG_OBJECT (sink, "sent %d bytes to %d (of %d) clients", size, num, + no_clients); + } + + gst_buffer_list_iterator_free (it); + + return GST_FLOW_OK; + +invalid_list: + gst_buffer_list_iterator_free (it); + return GST_FLOW_ERROR; +} +#endif + +static void +gst_multiudpsink_set_clients_string (GstMultiUDPSink * sink, + const gchar * string) +{ + gchar **clients; + gint i; + + clients = g_strsplit (string, ",", 0); + + g_mutex_lock (sink->client_lock); + /* clear all existing clients */ + gst_multiudpsink_clear_internal (sink, FALSE); + for (i = 0; clients[i]; i++) { + gchar *host, *p; + gint port = 0; + + host = clients[i]; + p = strstr (clients[i], ":"); + if (p != NULL) { + *p = '\0'; + port = atoi (p + 1); + } + if (port != 0) + gst_multiudpsink_add_internal (sink, host, port, FALSE); + } + g_mutex_unlock (sink->client_lock); + + g_strfreev (clients); +} + +static gchar * +gst_multiudpsink_get_clients_string (GstMultiUDPSink * sink) +{ + GString *str; + GList *clients; + + str = g_string_new (""); + + g_mutex_lock (sink->client_lock); + clients = sink->clients; + while (clients) { + GstUDPClient *client; + gint count; + + client = (GstUDPClient *) clients->data; + + clients = g_list_next (clients); + + count = client->refcount; + while (count--) { + g_string_append_printf (str, "%s:%d%s", client->host, client->port, + (clients || count > 1 ? "," : "")); + } + } + g_mutex_unlock (sink->client_lock); + + return g_string_free (str, FALSE); +} + +static void +gst_multiudpsink_setup_qos_dscp (GstMultiUDPSink * sink) +{ + gint tos; + + /* don't touch on -1 */ + if (sink->qos_dscp < 0) + return; + + if (sink->sock < 0) + return; + + GST_DEBUG_OBJECT (sink, "setting TOS to %d", sink->qos_dscp); + + /* Extract and shift 6 bits of DSFIELD */ + tos = (sink->qos_dscp & 0x3f) << 2; + + if (setsockopt (sink->sock, IPPROTO_IP, IP_TOS, &tos, sizeof (tos)) < 0) { + gchar *errormessage = socket_last_error_message (); + GST_ERROR_OBJECT (sink, "could not set TOS: %s", errormessage); + g_free (errormessage); + } +#ifdef IPV6_TCLASS + if (setsockopt (sink->sock, IPPROTO_IPV6, IPV6_TCLASS, &tos, + sizeof (tos)) < 0) { + gchar *errormessage = socket_last_error_message (); + GST_ERROR_OBJECT (sink, "could not set TCLASS: %s", errormessage); + g_free (errormessage); + } +#endif +} + +static void +gst_multiudpsink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMultiUDPSink *udpsink; + + udpsink = GST_MULTIUDPSINK (object); + + switch (prop_id) { + case PROP_SOCKFD: + if (udpsink->sockfd >= 0 && udpsink->sockfd != udpsink->sock && + udpsink->closefd) + CLOSE_SOCKET (udpsink->sockfd); + udpsink->sockfd = g_value_get_int (value); + GST_DEBUG_OBJECT (udpsink, "setting SOCKFD to %d", udpsink->sockfd); + break; + case PROP_CLOSEFD: + udpsink->closefd = g_value_get_boolean (value); + break; + case PROP_CLIENTS: + gst_multiudpsink_set_clients_string (udpsink, g_value_get_string (value)); + break; + case PROP_AUTO_MULTICAST: + udpsink->auto_multicast = g_value_get_boolean (value); + break; + case PROP_TTL: + udpsink->ttl = g_value_get_int (value); + break; + case PROP_TTL_MC: + udpsink->ttl_mc = g_value_get_int (value); + break; + case PROP_LOOP: + udpsink->loop = g_value_get_boolean (value); + break; + case PROP_QOS_DSCP: + udpsink->qos_dscp = g_value_get_int (value); + gst_multiudpsink_setup_qos_dscp (udpsink); + break; + case PROP_SEND_DUPLICATES: + udpsink->send_duplicates = g_value_get_boolean (value); + break; + case PROP_BUFFER_SIZE: + udpsink->buffer_size = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_multiudpsink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstMultiUDPSink *udpsink; + + udpsink = GST_MULTIUDPSINK (object); + + switch (prop_id) { + case PROP_BYTES_TO_SERVE: + g_value_set_uint64 (value, udpsink->bytes_to_serve); + break; + case PROP_BYTES_SERVED: + g_value_set_uint64 (value, udpsink->bytes_served); + break; + case PROP_SOCKFD: + g_value_set_int (value, udpsink->sockfd); + break; + case PROP_CLOSEFD: + g_value_set_boolean (value, udpsink->closefd); + break; + case PROP_SOCK: + g_value_set_int (value, udpsink->sock); + break; + case PROP_CLIENTS: + g_value_take_string (value, + gst_multiudpsink_get_clients_string (udpsink)); + break; + case PROP_AUTO_MULTICAST: + g_value_set_boolean (value, udpsink->auto_multicast); + break; + case PROP_TTL: + g_value_set_int (value, udpsink->ttl); + break; + case PROP_TTL_MC: + g_value_set_int (value, udpsink->ttl_mc); + break; + case PROP_LOOP: + g_value_set_boolean (value, udpsink->loop); + break; + case PROP_QOS_DSCP: + g_value_set_int (value, udpsink->qos_dscp); + break; + case PROP_SEND_DUPLICATES: + g_value_set_boolean (value, udpsink->send_duplicates); + break; + case PROP_BUFFER_SIZE: + g_value_set_int (value, udpsink->buffer_size); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_multiudpsink_configure_client (GstMultiUDPSink * sink, + GstUDPClient * client) +{ + GST_DEBUG_OBJECT (sink, "configuring client %p", client); + + if (gst_udp_is_multicast (&client->theiraddr)) { + GST_DEBUG_OBJECT (sink, "we have a multicast client %p", client); + if (sink->auto_multicast) { + GST_DEBUG_OBJECT (sink, "autojoining group"); + if (gst_udp_join_group (*(client->sock), &client->theiraddr, NULL) + != 0) + goto join_group_failed; + } + GST_DEBUG_OBJECT (sink, "setting loop to %d", sink->loop); + if (gst_udp_set_loop (sink->sock, sink->ss_family, sink->loop) != 0) + goto loop_failed; + GST_DEBUG_OBJECT (sink, "setting ttl to %d", sink->ttl_mc); + if (gst_udp_set_ttl (sink->sock, sink->ss_family, sink->ttl_mc, TRUE) != 0) + goto ttl_failed; + } else { + GST_DEBUG_OBJECT (sink, "setting unicast ttl to %d", sink->ttl); + if (gst_udp_set_ttl (sink->sock, sink->ss_family, sink->ttl, FALSE) != 0) + goto ttl_failed; + } + return TRUE; + + /* ERRORS */ +join_group_failed: + { + gchar *errormessage = socket_last_error_message (); + int errorcode = socket_last_error_code (); + CLOSE_IF_REQUESTED (sink); + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), + ("Could not join multicast group (%d): %s", errorcode, errormessage)); + g_free (errormessage); + return FALSE; + } +ttl_failed: + { + gchar *errormessage = socket_last_error_message (); + int errorcode = socket_last_error_code (); + CLOSE_IF_REQUESTED (sink); + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), + ("Could not set TTL socket option (%d): %s", errorcode, errormessage)); + g_free (errormessage); + return FALSE; + } +loop_failed: + { + gchar *errormessage = socket_last_error_message (); + int errorcode = socket_last_error_code (); + CLOSE_IF_REQUESTED (sink); + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), + ("Could not set loopback socket option (%d): %s", + errorcode, errormessage)); + g_free (errormessage); + return FALSE; + } +} + +/* create a socket for sending to remote machine */ +static gboolean +gst_multiudpsink_init_send (GstMultiUDPSink * sink) +{ + guint bc_val; + GList *clients; + GstUDPClient *client; + int sndsize, ret; + socklen_t len; + + if (sink->sockfd == -1) { + GST_DEBUG_OBJECT (sink, "creating sockets"); + /* create sender socket try IP6, fall back to IP4 */ + sink->ss_family = AF_INET6; + if ((sink->sock = socket (AF_INET6, SOCK_DGRAM, 0)) == -1) { + sink->ss_family = AF_INET; + if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) + goto no_socket; + } + + GST_DEBUG_OBJECT (sink, "have socket"); + sink->externalfd = FALSE; + } else { + struct sockaddr_storage myaddr; + + GST_DEBUG_OBJECT (sink, "using configured socket"); + /* we use the configured socket, try to get some info about it */ + len = sizeof (myaddr); + if (getsockname (sink->sockfd, (struct sockaddr *) &myaddr, &len) < 0) + goto getsockname_error; + + sink->ss_family = myaddr.ss_family; + /* we use the configured socket */ + sink->sock = sink->sockfd; + sink->externalfd = TRUE; + } + + len = sizeof (sndsize); +#if 0 //WFD wifi Device socket size issue, kernel 3.4.5 patch (sendto() performance -to use default buffer size) + + if (sink->buffer_size != 0) { + sndsize = sink->buffer_size; + + GST_DEBUG_OBJECT (sink, "setting udp buffer of %d bytes", sndsize); + /* set buffer size, Note that on Linux this is typically limited to a + * maximum of around 100K. Also a minimum of 128 bytes is required on + * Linux. */ + ret = + setsockopt (sink->sockfd, SOL_SOCKET, SO_SNDBUF, (void *) &sndsize, + len); + if (ret != 0) { + GST_ELEMENT_WARNING (sink, RESOURCE, SETTINGS, (NULL), + ("Could not create a buffer of requested %d bytes, %d: %s (%d)", + sndsize, ret, g_strerror (errno), errno)); + } + } +#endif + /* read the value of the receive buffer. Note that on linux this returns 2x the + * value we set because the kernel allocates extra memory for metadata. + * The default on Linux is about 100K (which is about 50K without metadata) */ + ret = + getsockopt (sink->sockfd, SOL_SOCKET, SO_SNDBUF, (void *) &sndsize, &len); + if (ret == 0) + GST_DEBUG_OBJECT (sink, "have udp buffer of %d bytes", sndsize); + else + GST_DEBUG_OBJECT (sink, "could not get udp buffer size"); + + + bc_val = 1; + if (setsockopt (sink->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, + sizeof (bc_val)) < 0) + goto no_broadcast; + + sink->bytes_to_serve = 0; + sink->bytes_served = 0; + + gst_multiudpsink_setup_qos_dscp (sink); + + /* look for multicast clients and join multicast groups appropriately + set also ttl and multicast loopback delivery appropriately */ + for (clients = sink->clients; clients; clients = g_list_next (clients)) { + client = (GstUDPClient *) clients->data; + + if (!gst_multiudpsink_configure_client (sink, client)) + return FALSE; + } + return TRUE; + + /* ERRORS */ +no_socket: + { + gchar *errormessage = socket_last_error_message (); + int errorcode = socket_last_error_code (); + GST_ELEMENT_ERROR (sink, RESOURCE, FAILED, (NULL), + ("Could not create socket (%d): %s", errorcode, errormessage)); + g_free (errormessage); + return FALSE; + } +getsockname_error: + { + gchar *errormessage = socket_last_error_message (); + int errorcode = socket_last_error_code (); + GST_ELEMENT_ERROR (sink, RESOURCE, FAILED, (NULL), + ("Could not getsockname (%d): %s", errorcode, errormessage)); + g_free (errormessage); + return FALSE; + } +no_broadcast: + { + gchar *errormessage = socket_last_error_message (); + int errorcode = socket_last_error_code (); + CLOSE_IF_REQUESTED (sink); + GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), + ("Could not set broadcast socket option (%d): %s", + errorcode, errormessage)); + g_free (errormessage); + return FALSE; + } +} + +static void +gst_multiudpsink_close (GstMultiUDPSink * sink) +{ + CLOSE_IF_REQUESTED (sink); +} + +static void +gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host, + gint port, gboolean lock) +{ + GstUDPClient *client; + GstUDPClient udpclient; + GTimeVal now; + GList *find; + + udpclient.host = (gchar *) host; + udpclient.port = port; + + GST_DEBUG_OBJECT (sink, "adding client on host %s, port %d", host, port); + + if (lock) + g_mutex_lock (sink->client_lock); + + find = g_list_find_custom (sink->clients, &udpclient, + (GCompareFunc) client_compare); + if (find) { + client = (GstUDPClient *) find->data; + + GST_DEBUG_OBJECT (sink, "found %d existing clients with host %s, port %d", + client->refcount, host, port); + client->refcount++; + } else { + client = create_client (sink, host, port); + + client->sock = &sink->sock; + + if (gst_udp_get_addr (host, port, &client->theiraddr) < 0) + goto getaddrinfo_error; + + g_get_current_time (&now); + client->connect_time = GST_TIMEVAL_TO_TIME (now); + + if (*client->sock > 0) { + gst_multiudpsink_configure_client (sink, client); + } + + GST_DEBUG_OBJECT (sink, "add client with host %s, port %d", host, port); + sink->clients = g_list_prepend (sink->clients, client); + } + + if (lock) + g_mutex_unlock (sink->client_lock); + + g_signal_emit (G_OBJECT (sink), + gst_multiudpsink_signals[SIGNAL_CLIENT_ADDED], 0, host, port); + + GST_DEBUG_OBJECT (sink, "added client on host %s, port %d", host, port); + return; + + /* ERRORS */ +getaddrinfo_error: + { + GST_DEBUG_OBJECT (sink, "did not add client on host %s, port %d", host, + port); + GST_WARNING_OBJECT (sink, "getaddrinfo lookup error?"); + free_client (client); + if (lock) + g_mutex_unlock (sink->client_lock); + return; + } +} + +void +gst_multiudpsink_add (GstMultiUDPSink * sink, const gchar * host, gint port) +{ + gst_multiudpsink_add_internal (sink, host, port, TRUE); +} + +void +gst_multiudpsink_remove (GstMultiUDPSink * sink, const gchar * host, gint port) +{ + GList *find; + GstUDPClient udpclient; + GstUDPClient *client; + GTimeVal now; + + udpclient.host = (gchar *) host; + udpclient.port = port; + + g_mutex_lock (sink->client_lock); + find = g_list_find_custom (sink->clients, &udpclient, + (GCompareFunc) client_compare); + if (!find) + goto not_found; + + client = (GstUDPClient *) find->data; + + GST_DEBUG_OBJECT (sink, "found %d clients with host %s, port %d", + client->refcount, host, port); + + client->refcount--; + if (client->refcount == 0) { + GST_DEBUG_OBJECT (sink, "remove client with host %s, port %d", host, port); + + g_get_current_time (&now); + client->disconnect_time = GST_TIMEVAL_TO_TIME (now); + + if (*(client->sock) != -1 && sink->auto_multicast + && gst_udp_is_multicast (&client->theiraddr)) + gst_udp_leave_group (*(client->sock), &client->theiraddr); + + /* Unlock to emit signal before we delete the actual client */ + g_mutex_unlock (sink->client_lock); + g_signal_emit (G_OBJECT (sink), + gst_multiudpsink_signals[SIGNAL_CLIENT_REMOVED], 0, host, port); + g_mutex_lock (sink->client_lock); + + sink->clients = g_list_delete_link (sink->clients, find); + + free_client (client); + } + g_mutex_unlock (sink->client_lock); + + return; + + /* ERRORS */ +not_found: + { + g_mutex_unlock (sink->client_lock); + GST_WARNING_OBJECT (sink, "client at host %s, port %d not found", + host, port); + return; + } +} + +static void +gst_multiudpsink_clear_internal (GstMultiUDPSink * sink, gboolean lock) +{ + GST_DEBUG_OBJECT (sink, "clearing"); + /* we only need to remove the client structure, there is no additional + * socket or anything to free for UDP */ + if (lock) + g_mutex_lock (sink->client_lock); + g_list_foreach (sink->clients, (GFunc) free_client, sink); + g_list_free (sink->clients); + sink->clients = NULL; + if (lock) + g_mutex_unlock (sink->client_lock); +} + +void +gst_multiudpsink_clear (GstMultiUDPSink * sink) +{ + gst_multiudpsink_clear_internal (sink, TRUE); +} + +GValueArray * +gst_multiudpsink_get_stats (GstMultiUDPSink * sink, const gchar * host, + gint port) +{ + GstUDPClient *client; + GValueArray *result = NULL; + GstUDPClient udpclient; + GList *find; + GValue value = { 0 }; + + udpclient.host = (gchar *) host; + udpclient.port = port; + + g_mutex_lock (sink->client_lock); + + find = g_list_find_custom (sink->clients, &udpclient, + (GCompareFunc) client_compare); + if (!find) + goto not_found; + + GST_DEBUG_OBJECT (sink, "stats for client with host %s, port %d", host, port); + + client = (GstUDPClient *) find->data; + + /* Result is a value array of (bytes_sent, packets_sent, + * connect_time, disconnect_time), all as uint64 */ + result = g_value_array_new (4); + + g_value_init (&value, G_TYPE_UINT64); + g_value_set_uint64 (&value, client->bytes_sent); + result = g_value_array_append (result, &value); + g_value_unset (&value); + + g_value_init (&value, G_TYPE_UINT64); + g_value_set_uint64 (&value, client->packets_sent); + result = g_value_array_append (result, &value); + g_value_unset (&value); + + g_value_init (&value, G_TYPE_UINT64); + g_value_set_uint64 (&value, client->connect_time); + result = g_value_array_append (result, &value); + g_value_unset (&value); + + g_value_init (&value, G_TYPE_UINT64); + g_value_set_uint64 (&value, client->disconnect_time); + result = g_value_array_append (result, &value); + g_value_unset (&value); + + g_mutex_unlock (sink->client_lock); + + return result; + + /* ERRORS */ +not_found: + { + g_mutex_unlock (sink->client_lock); + GST_WARNING_OBJECT (sink, "client with host %s, port %d not found", + host, port); + /* Apparently (see comment in gstmultifdsink.c) returning NULL from here may + * confuse/break python bindings */ + return g_value_array_new (0); + } +} + +static GstStateChangeReturn +gst_multiudpsink_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstMultiUDPSink *sink; + + sink = GST_MULTIUDPSINK (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + if (!gst_multiudpsink_init_send (sink)) + goto no_init; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_multiudpsink_close (sink); + break; + default: + break; + } + return ret; + + /* ERRORS */ +no_init: + { + /* _init_send() posted specific error already */ + return GST_STATE_CHANGE_FAILURE; + } +} diff --git a/gst/udp/gstmultiudpsink.h b/gst/udp/gstmultiudpsink.h new file mode 100644 index 0000000..c31dbad --- /dev/null +++ b/gst/udp/gstmultiudpsink.h @@ -0,0 +1,109 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymand + * + * 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_MULTIUDPSINK_H__ +#define __GST_MULTIUDPSINK_H__ + +#include +#include + +G_BEGIN_DECLS + +#include "gstudpnetutils.h" +#include "gstudp.h" + +#define GST_TYPE_MULTIUDPSINK (gst_multiudpsink_get_type()) +#define GST_MULTIUDPSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTIUDPSINK,GstMultiUDPSink)) +#define GST_MULTIUDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIUDPSINK,GstMultiUDPSinkClass)) +#define GST_IS_MULTIUDPSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTIUDPSINK)) +#define GST_IS_MULTIUDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIUDPSINK)) + +typedef struct _GstMultiUDPSink GstMultiUDPSink; +typedef struct _GstMultiUDPSinkClass GstMultiUDPSinkClass; + +typedef struct { + gint refcount; + + int *sock; + + struct sockaddr_storage theiraddr; + + gchar *host; + gint port; + + /* Per-client stats */ + guint64 bytes_sent; + guint64 packets_sent; + guint64 connect_time; + guint64 disconnect_time; +} GstUDPClient; + +/* sends udp packets to multiple host/port pairs. + */ +struct _GstMultiUDPSink { + GstBaseSink parent; + + int sock; + + GMutex *client_lock; + GList *clients; + + /* properties */ + guint64 bytes_to_serve; + guint64 bytes_served; + int sockfd; + gboolean closefd; + + gboolean externalfd; + + gboolean auto_multicast; + gint ttl; + gint ttl_mc; + gboolean loop; + gint qos_dscp; + guint16 ss_family; + + gboolean send_duplicates; + gint buffer_size; +}; + +struct _GstMultiUDPSinkClass { + GstBaseSinkClass parent_class; + + /* element methods */ + void (*add) (GstMultiUDPSink *sink, const gchar *host, gint port); + void (*remove) (GstMultiUDPSink *sink, const gchar *host, gint port); + void (*clear) (GstMultiUDPSink *sink); + GValueArray* (*get_stats) (GstMultiUDPSink *sink, const gchar *host, gint port); + + /* signals */ + void (*client_added) (GstElement *element, const gchar *host, gint port); + void (*client_removed) (GstElement *element, const gchar *host, gint port); +}; + +GType gst_multiudpsink_get_type(void); + +void gst_multiudpsink_add (GstMultiUDPSink *sink, const gchar *host, gint port); +void gst_multiudpsink_remove (GstMultiUDPSink *sink, const gchar *host, gint port); +void gst_multiudpsink_clear (GstMultiUDPSink *sink); +GValueArray* gst_multiudpsink_get_stats (GstMultiUDPSink *sink, const gchar *host, gint port); + +G_END_DECLS + +#endif /* __GST_MULTIUDPSINK_H__ */ diff --git a/gst/udp/gstudp-marshal.list b/gst/udp/gstudp-marshal.list new file mode 100644 index 0000000..b53e79c --- /dev/null +++ b/gst/udp/gstudp-marshal.list @@ -0,0 +1,2 @@ +VOID:STRING,INT +BOXED:STRING,INT diff --git a/gst/udp/gstudp.c b/gst/udp/gstudp.c new file mode 100644 index 0000000..fbdbfea --- /dev/null +++ b/gst/udp/gstudp.c @@ -0,0 +1,65 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 + +#include "gstudpsrc.h" +#include "gstmultiudpsink.h" +#include "gstudpsink.h" +#include "gstdynudpsink.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ +#ifdef G_OS_WIN32 + if (!gst_udp_net_utils_win32_wsa_startup (GST_OBJECT (plugin))) + return FALSE; +#endif + + /* register type of the netbuffer so that we can use it from multiple threads + * right away. Note that the plugin loading is always serialized */ + gst_netbuffer_get_type (); + + if (!gst_element_register (plugin, "udpsink", GST_RANK_NONE, + GST_TYPE_UDPSINK)) + return FALSE; + + if (!gst_element_register (plugin, "multiudpsink", GST_RANK_NONE, + GST_TYPE_MULTIUDPSINK)) + return FALSE; + + if (!gst_element_register (plugin, "dynudpsink", GST_RANK_NONE, + GST_TYPE_DYNUDPSINK)) + return FALSE; + + if (!gst_element_register (plugin, "udpsrc", GST_RANK_NONE, GST_TYPE_UDPSRC)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "udp", + "transfer data via UDP", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/udp/gstudp.h b/gst/udp/gstudp.h new file mode 100644 index 0000000..f687937 --- /dev/null +++ b/gst/udp/gstudp.h @@ -0,0 +1,39 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 "gstudp-enumtypes.h" +#include + +#ifndef __GST_UDP_H__ +#define __GST_UDP_H__ + +G_BEGIN_DECLS + +typedef enum +{ + CONTROL_ZERO, + CONTROL_NONE, + CONTROL_UDP, + CONTROL_TCP +} GstUDPControl; + +G_END_DECLS + +#endif /* __GST_UDP_H__ */ + diff --git a/gst/udp/gstudpnetutils.c b/gst/udp/gstudpnetutils.c new file mode 100644 index 0000000..bdbffbc --- /dev/null +++ b/gst/udp/gstudpnetutils.c @@ -0,0 +1,470 @@ +/* GStreamer UDP network utility functions + * Copyright (C) 2006 Tim-Philipp Müller + * Copyright (C) 2006 Joni Valtanen + * Copyright (C) 2009 Jarkko Palviainen + * + * 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 +#include +#include +#include + +#include + +#include "gstudpnetutils.h" + +/* EAI_ADDRFAMILY was obsoleted in BSD at some point */ +#ifndef EAI_ADDRFAMILY +#define EAI_ADDRFAMILY 1 +#endif + +#ifdef G_OS_WIN32 + +gboolean +gst_udp_net_utils_win32_wsa_startup (GstObject * obj) +{ + WSADATA w; + int error; + + error = WSAStartup (0x0202, &w); + + if (error) { + GST_WARNING_OBJECT (obj, "WSAStartup error: %d", error); + return FALSE; + } + + if (w.wVersion != 0x0202) { + WSACleanup (); + GST_WARNING_OBJECT (obj, "Winsock version wrong : 0x%x", w.wVersion); + return FALSE; + } + + return TRUE; +} + +#endif + +int +gst_udp_get_sockaddr_length (struct sockaddr_storage *addr) +{ + /* MacOS is picky about passing precisely the correct length, + * so we calculate it here for the given socket type. + */ + switch (addr->ss_family) { + case AF_INET: + return sizeof (struct sockaddr_in); + case AF_INET6: + return sizeof (struct sockaddr_in6); + default: + /* don't know, Screw MacOS and use the full length */ + return sizeof (*addr); + } +} + +int +gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr) +{ + struct addrinfo hints, *res = NULL, *nres; + char service[NI_MAXSERV]; + int ret; + + memset (&hints, 0, sizeof (hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + g_snprintf (service, sizeof (service) - 1, "%d", port); + service[sizeof (service) - 1] = '\0'; + + if ((ret = getaddrinfo (hostname, (port == -1) ? NULL : service, &hints, + &res)) < 0) { + goto beach; + } + + nres = res; + while (nres) { + if (nres->ai_family == AF_INET || nres->ai_family == AF_INET6) + break; + nres = nres->ai_next; + } + + if (nres) { + memcpy (addr, nres->ai_addr, nres->ai_addrlen); + } else { + ret = EAI_ADDRFAMILY; + } + + freeaddrinfo (res); +beach: + return ret; +} + +int +gst_udp_set_loop (int sockfd, guint16 ss_family, gboolean loop) +{ + int ret = -1; + int l = (loop == FALSE) ? 0 : 1; + + switch (ss_family) { + case AF_INET: + { + ret = setsockopt (sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &l, sizeof (l)); + if (ret < 0) + return ret; + + break; + } + case AF_INET6: + { + ret = + setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &l, + sizeof (l)); + if (ret < 0) + return ret; + + break; + } + default: +#ifdef G_OS_WIN32 + WSASetLastError (WSAEAFNOSUPPORT); +#else + errno = EAFNOSUPPORT; +#endif + } + + return ret; +} + +int +gst_udp_set_ttl (int sockfd, guint16 ss_family, int ttl, gboolean is_multicast) +{ + int optname = -1; + int ret = -1; + + switch (ss_family) { + case AF_INET: + { + optname = (is_multicast == TRUE) ? IP_MULTICAST_TTL : IP_TTL; + ret = setsockopt (sockfd, IPPROTO_IP, optname, &ttl, sizeof (ttl)); + if (ret < 0) + return ret; + break; + } + case AF_INET6: + { + optname = + (is_multicast == TRUE) ? IPV6_MULTICAST_HOPS : IPV6_UNICAST_HOPS; + ret = setsockopt (sockfd, IPPROTO_IPV6, optname, &ttl, sizeof (ttl)); + if (ret < 0) + return ret; + + /* When using IPV4 address with IPV6 socket, both TTL values + must be set in order to actually use the given value. + Has no effect when IPV6 address is used. */ + optname = (is_multicast == TRUE) ? IP_MULTICAST_TTL : IP_TTL; + ret = setsockopt (sockfd, IPPROTO_IP, optname, &ttl, sizeof (ttl)); + if (ret < 0) + return ret; + break; + } + default: +#ifdef G_OS_WIN32 + WSASetLastError (WSAEAFNOSUPPORT); +#else + errno = EAFNOSUPPORT; +#endif + } + return ret; +} + +/* FIXME: Add interface selection for windows hosts. */ +int +gst_udp_join_group (int sockfd, struct sockaddr_storage *addr, gchar * iface) +{ + int ret = -1; + + switch (addr->ss_family) { + case AF_INET: + { +#ifdef HAVE_IP_MREQN + struct ip_mreqn mreq4; +#else + struct ip_mreq mreq4; +#endif + + memset (&mreq4, 0, sizeof (mreq4)); + mreq4.imr_multiaddr.s_addr = + ((struct sockaddr_in *) addr)->sin_addr.s_addr; +#ifdef HAVE_IP_MREQN + if (iface) + mreq4.imr_ifindex = if_nametoindex (iface); + else + mreq4.imr_ifindex = 0; /* Pick any. */ +#else + mreq4.imr_interface.s_addr = INADDR_ANY; +#endif + + if ((ret = + setsockopt (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, + (const void *) &mreq4, sizeof (mreq4))) < 0) + return ret; + + break; + } + case AF_INET6: + { + struct ipv6_mreq mreq6; + + memset (&mreq6, 0, sizeof (mreq6)); + memcpy (&mreq6.ipv6mr_multiaddr, + &(((struct sockaddr_in6 *) addr)->sin6_addr), + sizeof (struct in6_addr)); + mreq6.ipv6mr_interface = 0; +#if !defined(G_OS_WIN32) + if (iface) + mreq6.ipv6mr_interface = if_nametoindex (iface); +#endif + + if ((ret = + setsockopt (sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, + (const void *) &mreq6, sizeof (mreq6))) < 0) + return ret; + + break; + } + default: +#ifdef G_OS_WIN32 + WSASetLastError (WSAEAFNOSUPPORT); +#else + errno = EAFNOSUPPORT; +#endif + } + return ret; +} + +int +gst_udp_leave_group (int sockfd, struct sockaddr_storage *addr) +{ + int ret = -1; + + switch (addr->ss_family) { + case AF_INET: + { + struct ip_mreq mreq4; + + memset (&mreq4, 0, sizeof (mreq4)); + mreq4.imr_multiaddr.s_addr = + ((struct sockaddr_in *) addr)->sin_addr.s_addr; + mreq4.imr_interface.s_addr = INADDR_ANY; + + if ((ret = + setsockopt (sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, + (const void *) &mreq4, sizeof (mreq4))) < 0) + return ret; + } + break; + + case AF_INET6: + { + struct ipv6_mreq mreq6; + + memset (&mreq6, 0, sizeof (mreq6)); + memcpy (&mreq6.ipv6mr_multiaddr, + &(((struct sockaddr_in6 *) addr)->sin6_addr), + sizeof (struct in6_addr)); + mreq6.ipv6mr_interface = 0; + + if ((ret = + setsockopt (sockfd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, + (const void *) &mreq6, sizeof (mreq6))) < 0) + return ret; + } + break; + + default: +#ifdef G_OS_WIN32 + WSASetLastError (WSAEAFNOSUPPORT); +#else + errno = EAFNOSUPPORT; +#endif + } + + return ret; +} + +int +gst_udp_is_multicast (struct sockaddr_storage *addr) +{ + int ret = -1; + + switch (addr->ss_family) { + case AF_INET: + { + struct sockaddr_in *addr4 = (struct sockaddr_in *) addr; + + ret = IN_MULTICAST (g_ntohl (addr4->sin_addr.s_addr)); + } + break; + + case AF_INET6: + { + struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addr; + + ret = IN6_IS_ADDR_MULTICAST (&addr6->sin6_addr); + } + break; + + default: +#ifdef G_OS_WIN32 + WSASetLastError (WSAEAFNOSUPPORT); +#else + errno = EAFNOSUPPORT; +#endif + } + + return ret; +} + +void +gst_udp_uri_init (GstUDPUri * uri, const gchar * host, gint port) +{ + uri->host = NULL; + uri->port = -1; + gst_udp_uri_update (uri, host, port); +} + +int +gst_udp_uri_update (GstUDPUri * uri, const gchar * host, gint port) +{ + if (host) { + g_free (uri->host); + uri->host = g_strdup (host); + if (strchr (host, ':')) + uri->is_ipv6 = TRUE; + else + uri->is_ipv6 = FALSE; + } + if (port != -1) + uri->port = port; + + return 0; +} + +int +gst_udp_parse_uri (const gchar * uristr, GstUDPUri * uri) +{ + gchar *protocol, *location_start; + gchar *location, *location_end; + gchar *colptr; + + /* consider no protocol to be udp:// */ + protocol = gst_uri_get_protocol (uristr); + if (!protocol) + goto no_protocol; + if (strcmp (protocol, "udp") != 0) + goto wrong_protocol; + g_free (protocol); + + location_start = gst_uri_get_location (uristr); + if (!location_start) + return FALSE; + + GST_DEBUG ("got location '%s'", location_start); + + /* VLC compatibility, strip everything before the @ sign. VLC uses that as the + * remote address. */ + location = g_strstr_len (location_start, -1, "@"); + if (location == NULL) + location = location_start; + else + location += 1; + + if (location[0] == '[') { + GST_DEBUG ("parse IPV6 address '%s'", location); + location_end = strchr (location, ']'); + if (location_end == NULL) + goto wrong_address; + + uri->is_ipv6 = TRUE; + g_free (uri->host); + uri->host = g_strndup (location + 1, location_end - location - 1); + colptr = strrchr (location_end, ':'); + } else { + GST_DEBUG ("parse IPV4 address '%s'", location); + uri->is_ipv6 = FALSE; + colptr = strrchr (location, ':'); + + g_free (uri->host); + if (colptr != NULL) { + uri->host = g_strndup (location, colptr - location); + } else { + uri->host = g_strdup (location); + } + } + GST_DEBUG ("host set to '%s'", uri->host); + + if (colptr != NULL) { + uri->port = atoi (colptr + 1); + } + g_free (location_start); + + return 0; + + /* ERRORS */ +no_protocol: + { + GST_ERROR ("error parsing uri %s: no protocol", uristr); + return -1; + } +wrong_protocol: + { + GST_ERROR ("error parsing uri %s: wrong protocol (%s != udp)", uristr, + protocol); + g_free (protocol); + return -1; + } +wrong_address: + { + GST_ERROR ("error parsing uri %s", uristr); + g_free (location); + return -1; + } +} + +gchar * +gst_udp_uri_string (GstUDPUri * uri) +{ + gchar *result; + + if (uri->is_ipv6) { + result = g_strdup_printf ("udp://[%s]:%d", uri->host, uri->port); + } else { + result = g_strdup_printf ("udp://%s:%d", uri->host, uri->port); + } + return result; +} + +void +gst_udp_uri_free (GstUDPUri * uri) +{ + g_free (uri->host); + uri->host = NULL; + uri->port = -1; +} diff --git a/gst/udp/gstudpnetutils.h b/gst/udp/gstudpnetutils.h new file mode 100644 index 0000000..9b52ed9 --- /dev/null +++ b/gst/udp/gstudpnetutils.h @@ -0,0 +1,110 @@ +/* GStreamer UDP network utility functions + * Copyright (C) 2006 Tim-Philipp Müller + * Copyright (C) 2006 Joni Valtanen + * + * 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_UDP_NET_UTILS_H__ +#define __GST_UDP_NET_UTILS_H__ + +#include + +/* Needed for G_OS_XXXX */ +#include + +#ifdef G_OS_WIN32 +/* 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 +#include +#ifndef socklen_t +#define socklen_t int +#endif + +/* Needed for GstObject and GST_WARNING_OBJECT */ +#include +#include + +#else +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#include + +#ifdef G_OS_WIN32 + +#define IOCTL_SOCKET ioctlsocket +#define CLOSE_SOCKET(sock) closesocket(sock) +#define setsockopt(sock,l,opt,val,len) setsockopt(sock,l,opt,(char *)(val),len) +#define WSA_STARTUP(obj) gst_udp_net_utils_win32_wsa_startup(GST_OBJECT(obj)) +#define WSA_CLEANUP(obj) WSACleanup () + +#else + +#define IOCTL_SOCKET ioctl +#define CLOSE_SOCKET(sock) close(sock) +#define setsockopt(sock,l,opt,val,len) setsockopt(sock,l,opt,(void *)(val),len) +#define WSA_STARTUP(obj) +#define WSA_CLEANUP(obj) + +#endif + +#ifdef G_OS_WIN32 + +gboolean gst_udp_net_utils_win32_wsa_startup (GstObject * obj); + +#endif + +typedef struct { + gchar *host; + gint port; + gboolean is_ipv6; +} GstUDPUri; + +int gst_udp_get_sockaddr_length (struct sockaddr_storage *addr); + +int gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr); +int gst_udp_is_multicast (struct sockaddr_storage *addr); + +int gst_udp_set_loop (int sockfd, guint16 ss_family, gboolean loop); +int gst_udp_set_ttl (int sockfd, guint16 ss_family, int ttl, gboolean is_multicast); + +/* multicast groups */ +int gst_udp_join_group (int sockfd, struct sockaddr_storage *addr, + gchar *iface); +int gst_udp_leave_group (int sockfd, struct sockaddr_storage *addr); + +/* uri handling */ +void gst_udp_uri_init (GstUDPUri *uri, const gchar *host, gint port); +int gst_udp_uri_update (GstUDPUri *uri, const gchar *host, gint port); +int gst_udp_parse_uri (const gchar *uristr, GstUDPUri *uri); +gchar * gst_udp_uri_string (GstUDPUri *uri); +void gst_udp_uri_free (GstUDPUri *uri); + +#endif /* __GST_UDP_NET_UTILS_H__*/ + diff --git a/gst/udp/gstudpsink.c b/gst/udp/gstudpsink.c new file mode 100644 index 0000000..26c70cd --- /dev/null +++ b/gst/udp/gstudpsink.c @@ -0,0 +1,298 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * + * 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-udpsink + * @see_also: udpsrc, multifdsink + * + * udpsink is a network sink that sends UDP packets to the network. + * It can be combined with RTP payloaders to implement RTP streaming. + * + * + * Examples + * |[ + * gst-launch -v audiotestsrc ! udpsink + * ]| + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "gstudpsink.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +#define UDP_DEFAULT_HOST "localhost" +#define UDP_DEFAULT_PORT 4951 + +/* UDPSink signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_HOST, + PROP_PORT, + PROP_URI, + /* FILL ME */ +}; + +static void gst_udpsink_base_init (gpointer g_class); +static void gst_udpsink_class_init (GstUDPSink * klass); +static void gst_udpsink_init (GstUDPSink * udpsink); +static void gst_udpsink_finalize (GstUDPSink * udpsink); + +static void gst_udpsink_uri_handler_init (gpointer g_iface, + gpointer iface_data); + +static void gst_udpsink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_udpsink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstElementClass *parent_class = NULL; + +/*static guint gst_udpsink_signals[LAST_SIGNAL] = { 0 }; */ + +GType +gst_udpsink_get_type (void) +{ + static GType udpsink_type = 0; + + if (!udpsink_type) { + static const GTypeInfo udpsink_info = { + sizeof (GstUDPSinkClass), + gst_udpsink_base_init, + NULL, + (GClassInitFunc) gst_udpsink_class_init, + NULL, + NULL, + sizeof (GstUDPSink), + 0, + (GInstanceInitFunc) gst_udpsink_init, + NULL + }; + static const GInterfaceInfo urihandler_info = { + gst_udpsink_uri_handler_init, + NULL, + NULL + }; + + udpsink_type = + g_type_register_static (GST_TYPE_MULTIUDPSINK, "GstUDPSink", + &udpsink_info, 0); + + g_type_add_interface_static (udpsink_type, GST_TYPE_URI_HANDLER, + &urihandler_info); + + } + return udpsink_type; +} + +static void +gst_udpsink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "UDP packet sender", + "Sink/Network", + "Send data over the network via UDP", "Wim Taymans "); +} + +static void +gst_udpsink_class_init (GstUDPSink * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_udpsink_set_property; + gobject_class->get_property = gst_udpsink_get_property; + + gobject_class->finalize = (GObjectFinalizeFunc) gst_udpsink_finalize; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HOST, + g_param_spec_string ("host", "host", + "The host/IP/Multicast group to send the packets to", + UDP_DEFAULT_HOST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, + g_param_spec_int ("port", "port", "The port to send the packets to", + 0, 65535, UDP_DEFAULT_PORT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + + +static void +gst_udpsink_init (GstUDPSink * udpsink) +{ + gst_udp_uri_init (&udpsink->uri, UDP_DEFAULT_HOST, UDP_DEFAULT_PORT); + + gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink), udpsink->uri.host, + udpsink->uri.port); +} + +static void +gst_udpsink_finalize (GstUDPSink * udpsink) +{ + gst_udp_uri_free (&udpsink->uri); + g_free (udpsink->uristr); + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) udpsink); +} + +static gboolean +gst_udpsink_set_uri (GstUDPSink * sink, const gchar * uri) +{ + gst_multiudpsink_remove (GST_MULTIUDPSINK (sink), sink->uri.host, + sink->uri.port); + + if (gst_udp_parse_uri (uri, &sink->uri) < 0) + goto wrong_uri; + + gst_multiudpsink_add (GST_MULTIUDPSINK (sink), sink->uri.host, + sink->uri.port); + + return TRUE; + + /* ERRORS */ +wrong_uri: + { + GST_ELEMENT_ERROR (sink, RESOURCE, READ, (NULL), + ("error parsing uri %s", uri)); + return FALSE; + } +} + +static void +gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstUDPSink *udpsink; + + udpsink = GST_UDPSINK (object); + + /* remove old host */ + gst_multiudpsink_remove (GST_MULTIUDPSINK (udpsink), + udpsink->uri.host, udpsink->uri.port); + + switch (prop_id) { + case PROP_HOST: + { + const gchar *host; + + host = g_value_get_string (value); + + if (host) + gst_udp_uri_update (&udpsink->uri, host, -1); + else + gst_udp_uri_update (&udpsink->uri, UDP_DEFAULT_HOST, -1); + break; + } + case PROP_PORT: + gst_udp_uri_update (&udpsink->uri, NULL, g_value_get_int (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + /* add new host */ + gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink), + udpsink->uri.host, udpsink->uri.port); +} + +static void +gst_udpsink_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstUDPSink *udpsink; + + udpsink = GST_UDPSINK (object); + + switch (prop_id) { + case PROP_HOST: + g_value_set_string (value, udpsink->uri.host); + break; + case PROP_PORT: + g_value_set_int (value, udpsink->uri.port); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/*** GSTURIHANDLER INTERFACE *************************************************/ + +static GstURIType +gst_udpsink_uri_get_type (void) +{ + return GST_URI_SINK; +} + +static gchar ** +gst_udpsink_uri_get_protocols (void) +{ + static gchar *protocols[] = { (char *) "udp", NULL }; + + return protocols; +} + +static const gchar * +gst_udpsink_uri_get_uri (GstURIHandler * handler) +{ + GstUDPSink *sink = GST_UDPSINK (handler); + + g_free (sink->uristr); + sink->uristr = gst_udp_uri_string (&sink->uri); + + return sink->uristr; +} + +static gboolean +gst_udpsink_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + gboolean ret; + GstUDPSink *sink = GST_UDPSINK (handler); + + ret = gst_udpsink_set_uri (sink, uri); + + return ret; +} + +static void +gst_udpsink_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_udpsink_uri_get_type; + iface->get_protocols = gst_udpsink_uri_get_protocols; + iface->get_uri = gst_udpsink_uri_get_uri; + iface->set_uri = gst_udpsink_uri_set_uri; +} diff --git a/gst/udp/gstudpsink.h b/gst/udp/gstudpsink.h new file mode 100644 index 0000000..d45045e --- /dev/null +++ b/gst/udp/gstudpsink.h @@ -0,0 +1,56 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_UDPSINK_H__ +#define __GST_UDPSINK_H__ + +#include +#include "gstmultiudpsink.h" + +G_BEGIN_DECLS + +#include "gstudp.h" +#include "gstudpnetutils.h" + +#define GST_TYPE_UDPSINK (gst_udpsink_get_type()) +#define GST_UDPSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_UDPSINK,GstUDPSink)) +#define GST_UDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_UDPSINK,GstUDPSinkClass)) +#define GST_IS_UDPSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_UDPSINK)) +#define GST_IS_UDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_UDPSINK)) + +typedef struct _GstUDPSink GstUDPSink; +typedef struct _GstUDPSinkClass GstUDPSinkClass; + +struct _GstUDPSink { + GstMultiUDPSink parent; + + GstUDPUri uri; + gchar *uristr; +}; + +struct _GstUDPSinkClass { + GstMultiUDPSinkClass parent_class; +}; + +GType gst_udpsink_get_type(void); + +G_END_DECLS + +#endif /* __GST_UDPSINK_H__ */ diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c new file mode 100644 index 0000000..3377df2 --- /dev/null +++ b/gst/udp/gstudpsrc.c @@ -0,0 +1,1079 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans + * Copyright (C) <2005> Nokia Corporation + * + * 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-udpsrc + * @see_also: udpsink, multifdsink + * + * udpsrc is a network source that reads UDP packets from the network. + * It can be combined with RTP depayloaders to implement RTP streaming. + * + * The udpsrc element supports automatic port allocation by setting the + * #GstUDPSrc:port property to 0. After setting the udpsrc to PAUSED, the + * allocated port can be obtained by reading the port property. + * + * udpsrc can read from multicast groups by setting the #GstUDPSrc:multicast-group + * property to the IP address of the multicast group. + * + * Alternatively one can provide a custom socket to udpsrc with the #GstUDPSrc:sockfd + * property, udpsrc will then not allocate a socket itself but use the provided + * one. + * + * The #GstUDPSrc:caps property is mainly used to give a type to the UDP packet + * so that they can be autoplugged in GStreamer pipelines. This is very usefull + * for RTP implementations where the contents of the UDP packets is transfered + * out-of-bounds using SDP or other means. + * + * The #GstUDPSrc:buffer-size property is used to change the default kernel + * buffersizes used for receiving packets. The buffer size may be increased for + * high-volume connections, or may be decreased to limit the possible backlog of + * incoming data. The system places an absolute limit on these values, on Linux, + * for example, the default buffer size is typically 50K and can be increased to + * maximally 100K. + * + * The #GstUDPSrc:skip-first-bytes property is used to strip off an arbitrary + * number of bytes from the start of the raw udp packet and can be used to strip + * off proprietary header, for example. + * + * The udpsrc is always a live source. It does however not provide a #GstClock, + * this is left for upstream elements such as an RTP session manager or demuxer + * (such as an MPEG demuxer). As with all live sources, the captured buffers + * will have their timestamp set to the current running time of the pipeline. + * + * udpsrc implements a #GstURIHandler interface that handles udp://host:port + * type URIs. + * + * If the #GstUDPSrc:timeout property is set to a value bigger than 0, udpsrc + * will generate an element message named + * "GstUDPSrcTimeout" + * if no data was recieved in the given timeout. + * The message's structure contains one field: + * + * + * + * #guint64 + * "timeout": the timeout in microseconds that + * expired when waiting for data. + * + * + * + * The message is typically used to detect that no UDP arrives in the receiver + * because it is blocked by a firewall. + * + * + * A custom file descriptor can be configured with the + * #GstUDPSrc:sockfd property. The socket will be closed when setting the + * element to READY by default. This behaviour can be + * overriden with the #GstUDPSrc:closefd property, in which case the application + * is responsible for closing the file descriptor. + * + * + * Examples + * |[ + * gst-launch -v udpsrc ! fakesink dump=1 + * ]| A pipeline to read from the default port and dump the udp packets. + * To actually generate udp packets on the default port one can use the + * udpsink element. When running the following pipeline in another terminal, the + * above mentioned pipeline should dump data packets to the console. + * |[ + * gst-launch -v audiotestsrc ! udpsink + * ]| + * |[ + * gst-launch -v udpsrc port=0 ! fakesink + * ]| read udp packets from a free port. + * + * + * Last reviewed on 2007-09-20 (0.10.7) + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstudpsrc.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#if defined _MSC_VER && (_MSC_VER >= 1400) +#include +#endif + +#include + +#ifdef HAVE_FIONREAD_IN_SYS_FILIO +#include +#endif + +GST_DEBUG_CATEGORY_STATIC (udpsrc_debug); +#define GST_CAT_DEFAULT (udpsrc_debug) + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +#define UDP_DEFAULT_PORT 4951 +#define UDP_DEFAULT_MULTICAST_GROUP "0.0.0.0" +#define UDP_DEFAULT_MULTICAST_IFACE NULL +#define UDP_DEFAULT_URI "udp://"UDP_DEFAULT_MULTICAST_GROUP":"G_STRINGIFY(UDP_DEFAULT_PORT) +#define UDP_DEFAULT_CAPS NULL +#define UDP_DEFAULT_SOCKFD -1 +#define UDP_DEFAULT_BUFFER_SIZE 0 +#define UDP_DEFAULT_TIMEOUT 0 +#define UDP_DEFAULT_SKIP_FIRST_BYTES 0 +#define UDP_DEFAULT_CLOSEFD TRUE +#define UDP_DEFAULT_SOCK -1 +#define UDP_DEFAULT_AUTO_MULTICAST TRUE +#define UDP_DEFAULT_REUSE TRUE + +enum +{ + PROP_0, + + PROP_PORT, + PROP_MULTICAST_GROUP, + PROP_MULTICAST_IFACE, + PROP_URI, + PROP_CAPS, + PROP_SOCKFD, + PROP_BUFFER_SIZE, + PROP_TIMEOUT, + PROP_SKIP_FIRST_BYTES, + PROP_CLOSEFD, + PROP_SOCK, + PROP_AUTO_MULTICAST, + PROP_REUSE, + + PROP_LAST +}; + +#define CLOSE_IF_REQUESTED(udpctx) \ +G_STMT_START { \ + if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \ + CLOSE_SOCKET(udpctx->sock.fd); \ + if (udpctx->sock.fd == udpctx->sockfd) \ + udpctx->sockfd = UDP_DEFAULT_SOCKFD; \ + } \ + udpctx->sock.fd = UDP_DEFAULT_SOCK; \ +} G_STMT_END + +static void gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data); + +static GstCaps *gst_udpsrc_getcaps (GstBaseSrc * src); + +static GstFlowReturn gst_udpsrc_create (GstPushSrc * psrc, GstBuffer ** buf); + +static gboolean gst_udpsrc_start (GstBaseSrc * bsrc); + +static gboolean gst_udpsrc_stop (GstBaseSrc * bsrc); + +static gboolean gst_udpsrc_unlock (GstBaseSrc * bsrc); + +static gboolean gst_udpsrc_unlock_stop (GstBaseSrc * bsrc); + +static void gst_udpsrc_finalize (GObject * object); + +static void gst_udpsrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_udpsrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +_do_init (GType type) +{ + static const GInterfaceInfo urihandler_info = { + gst_udpsrc_uri_handler_init, + NULL, + NULL + }; + + g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); + + GST_DEBUG_CATEGORY_INIT (udpsrc_debug, "udpsrc", 0, "UDP src"); +} + +GST_BOILERPLATE_FULL (GstUDPSrc, gst_udpsrc, GstPushSrc, GST_TYPE_PUSH_SRC, + _do_init); + +static void +gst_udpsrc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, "UDP packet receiver", + "Source/Network", + "Receive data over the network via UDP", + "Wim Taymans , " + "Thijs Vermeir "); +} + +static void +gst_udpsrc_class_init (GstUDPSrcClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + GstPushSrcClass *gstpushsrc_class; + + gobject_class = (GObjectClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; + + gobject_class->set_property = gst_udpsrc_set_property; + gobject_class->get_property = gst_udpsrc_get_property; + gobject_class->finalize = gst_udpsrc_finalize; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, + g_param_spec_int ("port", "Port", + "The port to receive the packets from, 0=allocate", 0, G_MAXUINT16, + UDP_DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_MULTICAST_GROUP, + g_param_spec_string ("multicast-group", "Multicast Group", + "The Address of multicast group to join", UDP_DEFAULT_MULTICAST_GROUP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_MULTICAST_IFACE, + g_param_spec_string ("multicast-iface", "Multicast Interface", + "The network interface on which to join the multicast group", + UDP_DEFAULT_MULTICAST_IFACE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_URI, + g_param_spec_string ("uri", "URI", + "URI in the form of udp://multicast_group:port", UDP_DEFAULT_URI, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CAPS, + g_param_spec_boxed ("caps", "Caps", + "The caps of the source pad", GST_TYPE_CAPS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SOCKFD, + g_param_spec_int ("sockfd", "Socket Handle", + "Socket to use for UDP reception. (-1 == allocate)", + -1, G_MAXINT, UDP_DEFAULT_SOCKFD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_SIZE, + g_param_spec_int ("buffer-size", "Buffer Size", + "Size of the kernel receive buffer in bytes, 0=default", 0, G_MAXINT, + UDP_DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TIMEOUT, + g_param_spec_uint64 ("timeout", "Timeout", + "Post a message after timeout microseconds (0 = disabled)", 0, + G_MAXUINT64, UDP_DEFAULT_TIMEOUT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_SKIP_FIRST_BYTES, g_param_spec_int ("skip-first-bytes", + "Skip first bytes", "number of bytes to skip for each udp packet", 0, + G_MAXINT, UDP_DEFAULT_SKIP_FIRST_BYTES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CLOSEFD, + g_param_spec_boolean ("closefd", "Close sockfd", + "Close sockfd if passed as property on state change", + UDP_DEFAULT_CLOSEFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SOCK, + g_param_spec_int ("sock", "Socket Handle", + "Socket currently in use for UDP reception. (-1 = no socket)", + -1, G_MAXINT, UDP_DEFAULT_SOCK, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_AUTO_MULTICAST, + g_param_spec_boolean ("auto-multicast", "Auto Multicast", + "Automatically join/leave multicast groups", + UDP_DEFAULT_AUTO_MULTICAST, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_REUSE, + g_param_spec_boolean ("reuse", "Reuse", "Enable reuse of the port", + UDP_DEFAULT_REUSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasesrc_class->start = gst_udpsrc_start; + gstbasesrc_class->stop = gst_udpsrc_stop; + gstbasesrc_class->unlock = gst_udpsrc_unlock; + gstbasesrc_class->unlock_stop = gst_udpsrc_unlock_stop; + gstbasesrc_class->get_caps = gst_udpsrc_getcaps; + + gstpushsrc_class->create = gst_udpsrc_create; +} + +static void +gst_udpsrc_init (GstUDPSrc * udpsrc, GstUDPSrcClass * g_class) +{ + WSA_STARTUP (udpsrc); + + gst_udp_uri_init (&udpsrc->uri, UDP_DEFAULT_MULTICAST_GROUP, + UDP_DEFAULT_PORT); + + udpsrc->sockfd = UDP_DEFAULT_SOCKFD; + udpsrc->multi_iface = g_strdup (UDP_DEFAULT_MULTICAST_IFACE); + udpsrc->buffer_size = UDP_DEFAULT_BUFFER_SIZE; + udpsrc->timeout = UDP_DEFAULT_TIMEOUT; + udpsrc->skip_first_bytes = UDP_DEFAULT_SKIP_FIRST_BYTES; + udpsrc->closefd = UDP_DEFAULT_CLOSEFD; + udpsrc->externalfd = (udpsrc->sockfd != -1); + udpsrc->auto_multicast = UDP_DEFAULT_AUTO_MULTICAST; + udpsrc->sock.fd = UDP_DEFAULT_SOCK; + udpsrc->reuse = UDP_DEFAULT_REUSE; + + /* configure basesrc to be a live source */ + gst_base_src_set_live (GST_BASE_SRC (udpsrc), TRUE); + /* make basesrc output a segment in time */ + gst_base_src_set_format (GST_BASE_SRC (udpsrc), GST_FORMAT_TIME); + /* make basesrc set timestamps on outgoing buffers based on the running_time + * when they were captured */ + gst_base_src_set_do_timestamp (GST_BASE_SRC (udpsrc), TRUE); +} + +static void +gst_udpsrc_finalize (GObject * object) +{ + GstUDPSrc *udpsrc; + + udpsrc = GST_UDPSRC (object); + + if (udpsrc->caps) + gst_caps_unref (udpsrc->caps); + + g_free (udpsrc->multi_iface); + + gst_udp_uri_free (&udpsrc->uri); + g_free (udpsrc->uristr); + + if (udpsrc->sockfd >= 0 && udpsrc->closefd) + CLOSE_SOCKET (udpsrc->sockfd); + + WSA_CLEANUP (object); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstCaps * +gst_udpsrc_getcaps (GstBaseSrc * src) +{ + GstUDPSrc *udpsrc; + + udpsrc = GST_UDPSRC (src); + + if (udpsrc->caps) + return gst_caps_ref (udpsrc->caps); + else + return gst_caps_new_any (); +} + +/* read a message from the error queue */ +static void +clear_error (GstUDPSrc * udpsrc) +{ +#if defined (MSG_ERRQUEUE) + struct msghdr cmsg; + char cbuf[128]; + char msgbuf[CMSG_SPACE (128)]; + struct iovec iov; + + /* Flush ERRORS from fd so next poll will not return at once */ + /* No need for address : We look for local error */ + cmsg.msg_name = NULL; + cmsg.msg_namelen = 0; + + /* IOV */ + memset (&cbuf, 0, sizeof (cbuf)); + iov.iov_base = cbuf; + iov.iov_len = sizeof (cbuf); + cmsg.msg_iov = &iov; + cmsg.msg_iovlen = 1; + + /* msg_control */ + memset (&msgbuf, 0, sizeof (msgbuf)); + cmsg.msg_control = &msgbuf; + cmsg.msg_controllen = sizeof (msgbuf); + + recvmsg (udpsrc->sock.fd, &cmsg, MSG_ERRQUEUE); +#endif +} + +static GstFlowReturn +gst_udpsrc_create (GstPushSrc * psrc, GstBuffer ** buf) +{ + GstUDPSrc *udpsrc; + GstNetBuffer *outbuf; + union gst_sockaddr + { + struct sockaddr sa; + struct sockaddr_in sa_in; + struct sockaddr_in6 sa_in6; + struct sockaddr_storage sa_stor; + } sa; + socklen_t slen; + guint8 *pktdata; + gint pktsize; +#ifdef G_OS_UNIX + gint readsize; +#elif defined G_OS_WIN32 + gulong readsize; +#endif + GstClockTime timeout; + gint ret; + gboolean try_again; + + udpsrc = GST_UDPSRC_CAST (psrc); + +retry: + /* quick check, avoid going in select when we already have data */ + readsize = 0; + if (G_UNLIKELY ((ret = + IOCTL_SOCKET (udpsrc->sock.fd, FIONREAD, &readsize)) < 0)) + goto ioctl_failed; + + if (readsize > 0) + goto no_select; + + if (udpsrc->timeout > 0) { + timeout = udpsrc->timeout * GST_USECOND; + } else { + timeout = GST_CLOCK_TIME_NONE; + } + + do { + try_again = FALSE; + + GST_LOG_OBJECT (udpsrc, "doing select, timeout %" G_GUINT64_FORMAT, + udpsrc->timeout); + + ret = gst_poll_wait (udpsrc->fdset, timeout); + GST_LOG_OBJECT (udpsrc, "select returned %d", ret); + if (G_UNLIKELY (ret < 0)) { + if (errno == EBUSY) + goto stopped; +#ifdef G_OS_WIN32 + if (WSAGetLastError () != WSAEINTR) + goto select_error; +#else + if (errno != EAGAIN && errno != EINTR) + goto select_error; +#endif + try_again = TRUE; + } else if (G_UNLIKELY (ret == 0)) { + /* timeout, post element message */ + gst_element_post_message (GST_ELEMENT_CAST (udpsrc), + gst_message_new_element (GST_OBJECT_CAST (udpsrc), + gst_structure_new ("GstUDPSrcTimeout", + "timeout", G_TYPE_UINT64, udpsrc->timeout, NULL))); + try_again = TRUE; + } + } while (G_UNLIKELY (try_again)); + + /* ask how much is available for reading on the socket, this should be exactly + * one UDP packet. We will check the return value, though, because in some + * case it can return 0 and we don't want a 0 sized buffer. */ + readsize = 0; + if (G_UNLIKELY ((ret = + IOCTL_SOCKET (udpsrc->sock.fd, FIONREAD, &readsize)) < 0)) + goto ioctl_failed; + + /* If we get here and the readsize is zero, then either select was woken up + * by activity that is not a read, or a poll error occurred, or a UDP packet + * was received that has no data. Since we cannot identify which case it is, + * we handle all of them. This could possibly lead to a UDP packet getting + * lost, but since UDP is not reliable, we can accept this. */ + if (G_UNLIKELY (!readsize)) { + /* try to read a packet (and it will be ignored), + * in case a packet with no data arrived */ + slen = sizeof (sa); + recvfrom (udpsrc->sock.fd, (char *) &slen, 0, 0, &sa.sa, &slen); + + /* clear any error, in case a poll error occurred */ + clear_error (udpsrc); + + /* poll again */ + goto retry; + } + +no_select: + GST_LOG_OBJECT (udpsrc, "ioctl says %d bytes available", (int) readsize); + + pktdata = g_malloc (readsize); + pktsize = readsize; + + while (TRUE) { + slen = sizeof (sa); +#ifdef G_OS_WIN32 + ret = recvfrom (udpsrc->sock.fd, (char *) pktdata, pktsize, 0, &sa.sa, + &slen); +#else + ret = recvfrom (udpsrc->sock.fd, pktdata, pktsize, 0, &sa.sa, &slen); +#endif + if (G_UNLIKELY (ret < 0)) { +#ifdef G_OS_WIN32 + /* WSAECONNRESET for a UDP socket means that a packet sent with udpsink + * generated a "port unreachable" ICMP response. We ignore that and try + * again. */ + if (WSAGetLastError () == WSAECONNRESET) { + g_free (pktdata); + pktdata = NULL; + goto retry; + } + if (WSAGetLastError () != WSAEINTR) + goto receive_error; +#else + if (errno != EAGAIN && errno != EINTR) + goto receive_error; +#endif + } else + break; + } + + /* special case buffer so receivers can also track the address */ + outbuf = gst_netbuffer_new (); + GST_BUFFER_MALLOCDATA (outbuf) = pktdata; + + /* patch pktdata and len when stripping off the headers */ + if (G_UNLIKELY (udpsrc->skip_first_bytes != 0)) { + if (G_UNLIKELY (readsize < udpsrc->skip_first_bytes)) + goto skip_error; + + pktdata += udpsrc->skip_first_bytes; + ret -= udpsrc->skip_first_bytes; + } + GST_BUFFER_DATA (outbuf) = pktdata; + GST_BUFFER_SIZE (outbuf) = ret; + + switch (sa.sa.sa_family) { + case AF_INET: + { + gst_netaddress_set_ip4_address (&outbuf->from, sa.sa_in.sin_addr.s_addr, + sa.sa_in.sin_port); + } + break; + case AF_INET6: + { + guint8 ip6[16]; + + memcpy (ip6, &sa.sa_in6.sin6_addr, sizeof (ip6)); + gst_netaddress_set_ip6_address (&outbuf->from, ip6, sa.sa_in6.sin6_port); + } + break; + default: +#ifdef G_OS_WIN32 + WSASetLastError (WSAEAFNOSUPPORT); +#else + errno = EAFNOSUPPORT; +#endif + goto receive_error; + } + GST_LOG_OBJECT (udpsrc, "read %d bytes", (int) readsize); + + *buf = GST_BUFFER_CAST (outbuf); + + return GST_FLOW_OK; + + /* ERRORS */ +select_error: + { + GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), + ("select error %d: %s (%d)", ret, g_strerror (errno), errno)); + return GST_FLOW_ERROR; + } +stopped: + { + GST_DEBUG ("stop called"); + return GST_FLOW_WRONG_STATE; + } +ioctl_failed: + { + GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), + ("ioctl failed %d: %s (%d)", ret, g_strerror (errno), errno)); + return GST_FLOW_ERROR; + } +receive_error: + { + g_free (pktdata); +#ifdef G_OS_WIN32 + GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), + ("receive error %d (WSA error: %d)", ret, WSAGetLastError ())); +#else + GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), + ("receive error %d: %s (%d)", ret, g_strerror (errno), errno)); +#endif + return GST_FLOW_ERROR; + } +skip_error: + { + GST_ELEMENT_ERROR (udpsrc, STREAM, DECODE, (NULL), + ("UDP buffer to small to skip header")); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_udpsrc_set_uri (GstUDPSrc * src, const gchar * uri) +{ + if (gst_udp_parse_uri (uri, &src->uri) < 0) + goto wrong_uri; + + if (src->uri.port == -1) + src->uri.port = UDP_DEFAULT_PORT; + + return TRUE; + + /* ERRORS */ +wrong_uri: + { + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("error parsing uri %s", uri)); + return FALSE; + } +} + +static void +gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstUDPSrc *udpsrc = GST_UDPSRC (object); + + switch (prop_id) { + case PROP_BUFFER_SIZE: + udpsrc->buffer_size = g_value_get_int (value); + break; + case PROP_PORT: + gst_udp_uri_update (&udpsrc->uri, NULL, g_value_get_int (value)); + break; + case PROP_MULTICAST_GROUP: + { + const gchar *group; + + if ((group = g_value_get_string (value))) + gst_udp_uri_update (&udpsrc->uri, group, -1); + else + gst_udp_uri_update (&udpsrc->uri, UDP_DEFAULT_MULTICAST_GROUP, -1); + break; + } + case PROP_MULTICAST_IFACE: + g_free (udpsrc->multi_iface); + + if (g_value_get_string (value) == NULL) + udpsrc->multi_iface = g_strdup (UDP_DEFAULT_MULTICAST_IFACE); + else + udpsrc->multi_iface = g_value_dup_string (value); + break; + case PROP_URI: + gst_udpsrc_set_uri (udpsrc, g_value_get_string (value)); + break; + case PROP_CAPS: + { + const GstCaps *new_caps_val = gst_value_get_caps (value); + + GstCaps *new_caps; + + GstCaps *old_caps; + + if (new_caps_val == NULL) { + new_caps = gst_caps_new_any (); + } else { + new_caps = gst_caps_copy (new_caps_val); + } + + old_caps = udpsrc->caps; + udpsrc->caps = new_caps; + if (old_caps) + gst_caps_unref (old_caps); + gst_pad_set_caps (GST_BASE_SRC (udpsrc)->srcpad, new_caps); + break; + } + case PROP_SOCKFD: + if (udpsrc->sockfd >= 0 && udpsrc->sockfd != udpsrc->sock.fd && + udpsrc->closefd) + CLOSE_SOCKET (udpsrc->sockfd); + udpsrc->sockfd = g_value_get_int (value); + GST_DEBUG ("setting SOCKFD to %d", udpsrc->sockfd); + break; + case PROP_TIMEOUT: + udpsrc->timeout = g_value_get_uint64 (value); + break; + case PROP_SKIP_FIRST_BYTES: + udpsrc->skip_first_bytes = g_value_get_int (value); + break; + case PROP_CLOSEFD: + udpsrc->closefd = g_value_get_boolean (value); + break; + case PROP_AUTO_MULTICAST: + udpsrc->auto_multicast = g_value_get_boolean (value); + break; + case PROP_REUSE: + udpsrc->reuse = g_value_get_boolean (value); + break; + default: + break; + } +} + +static void +gst_udpsrc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstUDPSrc *udpsrc = GST_UDPSRC (object); + + switch (prop_id) { + case PROP_BUFFER_SIZE: + g_value_set_int (value, udpsrc->buffer_size); + break; + case PROP_PORT: + g_value_set_int (value, udpsrc->uri.port); + break; + case PROP_MULTICAST_GROUP: + g_value_set_string (value, udpsrc->uri.host); + break; + case PROP_MULTICAST_IFACE: + g_value_set_string (value, udpsrc->multi_iface); + break; + case PROP_URI: + g_value_take_string (value, gst_udp_uri_string (&udpsrc->uri)); + break; + case PROP_CAPS: + gst_value_set_caps (value, udpsrc->caps); + break; + case PROP_SOCKFD: + g_value_set_int (value, udpsrc->sockfd); + break; + case PROP_TIMEOUT: + g_value_set_uint64 (value, udpsrc->timeout); + break; + case PROP_SKIP_FIRST_BYTES: + g_value_set_int (value, udpsrc->skip_first_bytes); + break; + case PROP_CLOSEFD: + g_value_set_boolean (value, udpsrc->closefd); + break; + case PROP_SOCK: + g_value_set_int (value, udpsrc->sock.fd); + break; + case PROP_AUTO_MULTICAST: + g_value_set_boolean (value, udpsrc->auto_multicast); + break; + case PROP_REUSE: + g_value_set_boolean (value, udpsrc->reuse); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* create a socket for sending to remote machine */ +static gboolean +gst_udpsrc_start (GstBaseSrc * bsrc) +{ + guint bc_val; + guint err_val; + gint reuse; + int port; + GstUDPSrc *src; + gint ret; + int rcvsize; + struct sockaddr_storage bind_address; + socklen_t len; + src = GST_UDPSRC (bsrc); + + if (src->sockfd == -1) { + /* need to allocate a socket */ + GST_DEBUG_OBJECT (src, "allocating socket for %s:%d", src->uri.host, + src->uri.port); + if ((ret = + gst_udp_get_addr (src->uri.host, src->uri.port, &src->myaddr)) < 0) + goto getaddrinfo_error; + + if ((ret = socket (src->myaddr.ss_family, SOCK_DGRAM, IPPROTO_UDP)) < 0) + goto no_socket; + + src->sock.fd = ret; + src->externalfd = FALSE; + + GST_DEBUG_OBJECT (src, "got socket %d", src->sock.fd); + + GST_DEBUG_OBJECT (src, "setting reuse %d", src->reuse); + reuse = src->reuse ? 1 : 0; + if ((ret = + setsockopt (src->sock.fd, SOL_SOCKET, SO_REUSEADDR, &reuse, + sizeof (reuse))) < 0) + goto setsockopt_error; + + GST_DEBUG_OBJECT (src, "binding on port %d", src->uri.port); + + /* Take a temporary copy of the address in case we need to fix it for bind */ + memcpy (&bind_address, &src->myaddr, sizeof (struct sockaddr_storage)); + +#ifdef G_OS_WIN32 + /* Windows does not allow binding to a multicast group so fix source address */ + if (gst_udp_is_multicast (&src->myaddr)) { + switch (((struct sockaddr *) &bind_address)->sa_family) { + case AF_INET: + ((struct sockaddr_in *) &bind_address)->sin_addr.s_addr = + htonl (INADDR_ANY); + break; + case AF_INET6: + ((struct sockaddr_in6 *) &bind_address)->sin6_addr = in6addr_any; + break; + default: + break; + } + } +#endif + + len = gst_udp_get_sockaddr_length (&bind_address); + if ((ret = bind (src->sock.fd, (struct sockaddr *) &bind_address, len)) < 0) + goto bind_error; + + if (!gst_udp_is_multicast (&src->myaddr)) { + len = sizeof (src->myaddr); + if ((ret = getsockname (src->sock.fd, (struct sockaddr *) &src->myaddr, + &len)) < 0) + goto getsockname_error; + } + } else { + GST_DEBUG_OBJECT (src, "using provided socket %d", src->sockfd); + /* we use the configured socket, try to get some info about it */ + len = sizeof (src->myaddr); + if ((ret = + getsockname (src->sockfd, (struct sockaddr *) &src->myaddr, + &len)) < 0) + goto getsockname_error; + + src->sock.fd = src->sockfd; + src->externalfd = TRUE; + } + + len = sizeof (rcvsize); + if (src->buffer_size != 0) { + rcvsize = src->buffer_size; + + GST_DEBUG_OBJECT (src, "setting udp buffer of %d bytes", rcvsize); + /* set buffer size, Note that on Linux this is typically limited to a + * maximum of around 100K. Also a minimum of 128 bytes is required on + * Linux. */ + ret = + setsockopt (src->sock.fd, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, + len); + if (ret != 0) { + GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL), + ("Could not create a buffer of requested %d bytes, %d: %s (%d)", + rcvsize, ret, g_strerror (errno), errno)); + } + } + + /* read the value of the receive buffer. Note that on linux this returns 2x the + * value we set because the kernel allocates extra memory for metadata. + * The default on Linux is about 100K (which is about 50K without metadata) */ + ret = + getsockopt (src->sock.fd, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, &len); + if (ret == 0) + GST_DEBUG_OBJECT (src, "have udp buffer of %d bytes", rcvsize); + else + GST_DEBUG_OBJECT (src, "could not get udp buffer size"); + + bc_val = 1; + if ((ret = setsockopt (src->sock.fd, SOL_SOCKET, SO_BROADCAST, &bc_val, + sizeof (bc_val))) < 0) { + GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL), + ("could not configure socket for broadcast %d: %s (%d)", ret, + g_strerror (errno), errno)); + } + + /* Accept ERRQUEUE to get and flush icmp errors */ + err_val = 1; +#if defined (IP_RECVERR) + if ((ret = setsockopt (src->sock.fd, IPPROTO_IP, IP_RECVERR, &err_val, + sizeof (err_val))) < 0) { + GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL), + ("could not configure socket for IP_RECVERR %d: %s (%d)", ret, + g_strerror (errno), errno)); + } +#endif + + if (src->auto_multicast && gst_udp_is_multicast (&src->myaddr)) { + GST_DEBUG_OBJECT (src, "joining multicast group %s", src->uri.host); + ret = gst_udp_join_group (src->sock.fd, &src->myaddr, src->multi_iface); + if (ret < 0) + goto membership; + } + + /* NOTE: sockaddr_in.sin_port works for ipv4 and ipv6 because sin_port + * follows ss_family on both */ + port = g_ntohs (((struct sockaddr_in *) &src->myaddr)->sin_port); + GST_DEBUG_OBJECT (src, "bound, on port %d", port); + if (port != src->uri.port) { + src->uri.port = port; + GST_DEBUG_OBJECT (src, "notifying port %d", port); + g_object_notify (G_OBJECT (src), "port"); + } + + if ((src->fdset = gst_poll_new (TRUE)) == NULL) + goto no_fdset; + + gst_poll_add_fd (src->fdset, &src->sock); + gst_poll_fd_ctl_read (src->fdset, &src->sock, TRUE); + + return TRUE; + + /* ERRORS */ +getaddrinfo_error: + { + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("getaddrinfo failed: %s (%d)", gai_strerror (ret), ret)); + return FALSE; + } +no_socket: + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), + ("no socket error %d: %s (%d)", ret, g_strerror (errno), errno)); + return FALSE; + } +setsockopt_error: + { + CLOSE_IF_REQUESTED (src); + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("setsockopt failed %d: %s (%d)", ret, g_strerror (errno), errno)); + return FALSE; + } +bind_error: + { + CLOSE_IF_REQUESTED (src); + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("bind failed %d: %s (%d)", ret, g_strerror (errno), errno)); + return FALSE; + } +membership: + { + CLOSE_IF_REQUESTED (src); + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("could add membership %d: %s (%d)", ret, g_strerror (errno), errno)); + return FALSE; + } +getsockname_error: + { + CLOSE_IF_REQUESTED (src); + GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), + ("getsockname failed %d: %s (%d)", ret, g_strerror (errno), errno)); + return FALSE; + } +no_fdset: + { + CLOSE_IF_REQUESTED (src); + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), + ("could not create an fdset %d: %s (%d)", ret, g_strerror (errno), + errno)); + return FALSE; + } +} + +static gboolean +gst_udpsrc_unlock (GstBaseSrc * bsrc) +{ + GstUDPSrc *src; + + src = GST_UDPSRC (bsrc); + + GST_LOG_OBJECT (src, "Flushing"); + gst_poll_set_flushing (src->fdset, TRUE); + + return TRUE; +} + +static gboolean +gst_udpsrc_unlock_stop (GstBaseSrc * bsrc) +{ + GstUDPSrc *src; + + src = GST_UDPSRC (bsrc); + + GST_LOG_OBJECT (src, "No longer flushing"); + gst_poll_set_flushing (src->fdset, FALSE); + + return TRUE; +} + +static gboolean +gst_udpsrc_stop (GstBaseSrc * bsrc) +{ + GstUDPSrc *src; + + src = GST_UDPSRC (bsrc); + + GST_DEBUG ("stopping, closing sockets"); + + if (src->sock.fd >= 0) { + if (src->auto_multicast && gst_udp_is_multicast (&src->myaddr)) { + GST_DEBUG_OBJECT (src, "leaving multicast group %s", src->uri.host); + gst_udp_leave_group (src->sock.fd, &src->myaddr); + } + CLOSE_IF_REQUESTED (src); + } + + if (src->fdset) { + gst_poll_free (src->fdset); + src->fdset = NULL; + } + + return TRUE; +} + +/*** GSTURIHANDLER INTERFACE *************************************************/ + +static GstURIType +gst_udpsrc_uri_get_type (void) +{ + return GST_URI_SRC; +} + +static gchar ** +gst_udpsrc_uri_get_protocols (void) +{ + static gchar *protocols[] = { (char *) "udp", NULL }; + + return protocols; +} + +static const gchar * +gst_udpsrc_uri_get_uri (GstURIHandler * handler) +{ + GstUDPSrc *src = GST_UDPSRC (handler); + + g_free (src->uristr); + src->uristr = gst_udp_uri_string (&src->uri); + + return src->uristr; +} + +static gboolean +gst_udpsrc_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + gboolean ret; + + GstUDPSrc *src = GST_UDPSRC (handler); + + ret = gst_udpsrc_set_uri (src, uri); + + return ret; +} + +static void +gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_udpsrc_uri_get_type; + iface->get_protocols = gst_udpsrc_uri_get_protocols; + iface->get_uri = gst_udpsrc_uri_get_uri; + iface->set_uri = gst_udpsrc_uri_set_uri; +} diff --git a/gst/udp/gstudpsrc.h b/gst/udp/gstudpsrc.h new file mode 100644 index 0000000..48c9f16 --- /dev/null +++ b/gst/udp/gstudpsrc.h @@ -0,0 +1,88 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_UDPSRC_H__ +#define __GST_UDPSRC_H__ + +#include +#include + +G_BEGIN_DECLS + +#include +#include +#include + +#include "gstudpnetutils.h" + +#include "gstudp.h" + +#define GST_TYPE_UDPSRC \ + (gst_udpsrc_get_type()) +#define GST_UDPSRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_UDPSRC,GstUDPSrc)) +#define GST_UDPSRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_UDPSRC,GstUDPSrcClass)) +#define GST_IS_UDPSRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_UDPSRC)) +#define GST_IS_UDPSRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_UDPSRC)) +#define GST_UDPSRC_CAST(obj) ((GstUDPSrc *)(obj)) + +typedef struct _GstUDPSrc GstUDPSrc; +typedef struct _GstUDPSrcClass GstUDPSrcClass; + +struct _GstUDPSrc { + GstPushSrc parent; + + /* properties */ + GstUDPUri uri; + gchar *multi_iface; + gint ttl; + GstCaps *caps; + gint buffer_size; + guint64 timeout; + gint skip_first_bytes; + int sockfd; + gboolean closefd; + gboolean auto_multicast; + gboolean reuse; + + /* our sockets */ + GstPollFD sock; + GstPoll *fdset; + gboolean externalfd; + gboolean is_ipv6; + + struct sockaddr_storage myaddr; + + gchar *uristr; +}; + +struct _GstUDPSrcClass { + GstPushSrcClass parent_class; +}; + +GType gst_udpsrc_get_type(void); + +G_END_DECLS + + +#endif /* __GST_UDPSRC_H__ */ diff --git a/gst/videobox/Makefile.am b/gst/videobox/Makefile.am new file mode 100644 index 0000000..90dcd4b --- /dev/null +++ b/gst/videobox/Makefile.am @@ -0,0 +1,38 @@ +plugin_LTLIBRARIES = libgstvideobox.la + +ORC_SOURCE=gstvideoboxorc +include $(top_srcdir)/common/orc.mak + +libgstvideobox_la_SOURCES = gstvideobox.c +nodist_libgstvideobox_la_SOURCES = $(ORC_NODIST_SOURCES) +libgstvideobox_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(ORC_CFLAGS) +libgstvideobox_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + $(GST_CONTROLLER_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(ORC_LIBS) \ + -lgstvideo-@GST_MAJORMINOR@ +libgstvideobox_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideobox_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstvideobox.h +EXTRA_DIST += README + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideobox -:SHARED libgstvideobox \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideobox_la_SOURCES) \ + $(nodist_libgstvideobox_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideobox_la_CFLAGS) \ + -:LDFLAGS $(libgstvideobox_la_LDFLAGS) \ + $(libgstvideobox_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/videobox/Makefile.in b/gst/videobox/Makefile.in new file mode 100644 index 0000000..17680da --- /dev/null +++ b/gst/videobox/Makefile.in @@ -0,0 +1,922 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# This is a makefile.am fragment to build Orc code. +# +# Define ORC_SOURCE and then include this file, such as: +# +# ORC_SOURCE=gstadderorc +# include $(top_srcdir)/common/orc.mak +# +# This fragment will create tmp-orc.c and gstadderorc.h from +# gstadderorc.orc. +# +# When 'make dist' is run at the top level, or 'make orc-update' +# in a directory including this fragment, the generated source +# files will be copied to $(ORC_SOURCE)-dist.[ch]. These files +# should be checked in to git, since they are used if Orc is +# disabled. +# +# Note that this file defines BUILT_SOURCES, so any later usage +# of BUILT_SOURCES in the Makefile.am that includes this file +# must use '+='. +# + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/common/orc.mak +subdir = gst/videobox +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstvideobox_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstvideobox_la_OBJECTS = libgstvideobox_la-gstvideobox.lo +am__objects_1 = libgstvideobox_la-tmp-orc.lo +nodist_libgstvideobox_la_OBJECTS = $(am__objects_1) +libgstvideobox_la_OBJECTS = $(am_libgstvideobox_la_OBJECTS) \ + $(nodist_libgstvideobox_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstvideobox_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstvideobox_la_CFLAGS) $(CFLAGS) \ + $(libgstvideobox_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstvideobox_la_SOURCES) \ + $(nodist_libgstvideobox_la_SOURCES) +DIST_SOURCES = $(libgstvideobox_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstvideobox.la +ORC_SOURCE = gstvideoboxorc +EXTRA_DIST = $(ORC_SOURCE).orc README +ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h +BUILT_SOURCES = tmp-orc.c $(ORC_SOURCE).h +orcc_v_gen = $(orcc_v_gen_$(V)) +orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) +orcc_v_gen_0 = @echo " ORCC $@"; +cp_v_gen = $(cp_v_gen_$(V)) +cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) +cp_v_gen_0 = @echo " CP $@"; +libgstvideobox_la_SOURCES = gstvideobox.c +nodist_libgstvideobox_la_SOURCES = $(ORC_NODIST_SOURCES) +libgstvideobox_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(ORC_CFLAGS) + +libgstvideobox_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + $(GST_CONTROLLER_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(ORC_LIBS) \ + -lgstvideo-@GST_MAJORMINOR@ + +libgstvideobox_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideobox_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstvideobox.h +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/orc.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videobox/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/videobox/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/orc.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstvideobox.la: $(libgstvideobox_la_OBJECTS) $(libgstvideobox_la_DEPENDENCIES) $(EXTRA_libgstvideobox_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstvideobox_la_LINK) -rpath $(plugindir) $(libgstvideobox_la_OBJECTS) $(libgstvideobox_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideobox_la-gstvideobox.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideobox_la-tmp-orc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstvideobox_la-gstvideobox.lo: gstvideobox.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideobox_la_CFLAGS) $(CFLAGS) -MT libgstvideobox_la-gstvideobox.lo -MD -MP -MF $(DEPDIR)/libgstvideobox_la-gstvideobox.Tpo -c -o libgstvideobox_la-gstvideobox.lo `test -f 'gstvideobox.c' || echo '$(srcdir)/'`gstvideobox.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideobox_la-gstvideobox.Tpo $(DEPDIR)/libgstvideobox_la-gstvideobox.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvideobox.c' object='libgstvideobox_la-gstvideobox.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideobox_la_CFLAGS) $(CFLAGS) -c -o libgstvideobox_la-gstvideobox.lo `test -f 'gstvideobox.c' || echo '$(srcdir)/'`gstvideobox.c + +libgstvideobox_la-tmp-orc.lo: tmp-orc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideobox_la_CFLAGS) $(CFLAGS) -MT libgstvideobox_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstvideobox_la-tmp-orc.Tpo -c -o libgstvideobox_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideobox_la-tmp-orc.Tpo $(DEPDIR)/libgstvideobox_la-tmp-orc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tmp-orc.c' object='libgstvideobox_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideobox_la_CFLAGS) $(CFLAGS) -c -o libgstvideobox_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local \ + clean-pluginLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-local clean-pluginLTLIBRARIES ctags \ + dist-hook distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pluginLTLIBRARIES install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-pluginLTLIBRARIES + + +orc-update: tmp-orc.c $(ORC_SOURCE).h + $(top_srcdir)/common/gst-indent tmp-orc.c + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h + +@HAVE_ORCC_TRUE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --implementation --include glib.h -o tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc + +@HAVE_ORCC_TRUE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --header --include glib.h -o $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_FALSE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c +@HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c + +@HAVE_ORCC_FALSE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c +@HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h + +clean-local: clean-orc +.PHONY: clean-orc +clean-orc: + rm -f tmp-orc.c $(ORC_SOURCE).h + +dist-hook: dist-hook-orc +.PHONY: dist-hook-orc + +# we try and copy updated orc -dist files below, but don't fail if it +# doesn't work as the srcdir might not be writable +dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h + $(top_srcdir)/common/gst-indent tmp-orc.c + rm -f tmp-orc.c~ + cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || true + cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || true + cp -p tmp-orc.c $(distdir)/$(ORC_SOURCE)-dist.c + cp -p $(ORC_SOURCE).h $(distdir)/$(ORC_SOURCE)-dist.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideobox -:SHARED libgstvideobox \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideobox_la_SOURCES) \ + $(nodist_libgstvideobox_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideobox_la_CFLAGS) \ + -:LDFLAGS $(libgstvideobox_la_LDFLAGS) \ + $(libgstvideobox_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/videobox/README b/gst/videobox/README new file mode 100644 index 0000000..e71da59 --- /dev/null +++ b/gst/videobox/README @@ -0,0 +1,21 @@ +Videobox +-------- + +This plugin crops or enlarges the image. It takes 4 values as input, a +top, bottom, left and right offset. Positive values will crop that much +pixels from the respective border of the image, negative values will add +that much pixels. When pixels are added, you can specify their color. +Some predefined colors are usable with an enum property. + +The plugin is alpha channel aware and will try to negotiate with a format +that supports alpha channels first. When alpha channel is active two +other properties, alpha and border_alpha can be used to set the alpha +values of the inner picture and the border respectively. an alpha value of +0.0 means total transparency, 1.0 is opaque. + +The videobox plugin has many uses such as doing a mosaic of pictures, +letterboxing video, cutting out pieces of video, picture in picture, etc.. + +TODO + +- add enum to specify common aspect ratios/sizes and add borders/crop diff --git a/gst/videobox/gstvideobox.c b/gst/videobox/gstvideobox.c new file mode 100644 index 0000000..213aa9e --- /dev/null +++ b/gst/videobox/gstvideobox.c @@ -0,0 +1,3407 @@ +/* GStreamer + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2006 Tim-Philipp Müller + * Copyright (C) 2010 Sebastian Dröge + * + * 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-videobox + * @see_also: #GstVideoCrop + * + * This plugin crops or enlarges the image. It takes 4 values as input, a + * top, bottom, left and right offset. Positive values will crop that much + * pixels from the respective border of the image, negative values will add + * that much pixels. When pixels are added, you can specify their color. + * Some predefined colors are usable with an enum property. + * + * The plugin is alpha channel aware and will try to negotiate with a format + * that supports alpha channels first. When alpha channel is active two + * other properties, alpha and border_alpha can be used to set the alpha + * values of the inner picture and the border respectively. an alpha value of + * 0.0 means total transparency, 1.0 is opaque. + * + * The videobox plugin has many uses such as doing a mosaic of pictures, + * letterboxing video, cutting out pieces of video, picture in picture, etc.. + * + * Setting autocrop to true changes the behavior of the plugin so that + * caps determine crop properties rather than the other way around: given + * input and output dimensions, the crop values are selected so that the + * smaller frame is effectively centered in the larger frame. This + * involves either cropping or padding. + * + * If you use autocrop there is little point in setting the other + * properties manually because they will be overriden if the caps change, + * but nothing stops you from doing so. + * + * Sample pipeline: + * |[ + * gst-launch videotestsrc ! videobox autocrop=true ! \ + * "video/x-raw-yuv, width=600, height=400" ! ffmpegcolorspace ! ximagesink + * ]| + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvideobox.h" +#include "gstvideoboxorc.h" + +#include +#include + +#include + +#include "gst/glib-compat-private.h" + +GST_DEBUG_CATEGORY_STATIC (videobox_debug); +#define GST_CAT_DEFAULT videobox_debug + +/* From videotestsrc.c */ +static const guint8 yuv_sdtv_colors_Y[VIDEO_BOX_FILL_LAST] = + { 16, 145, 41, 81, 210, 235 }; +static const guint8 yuv_sdtv_colors_U[VIDEO_BOX_FILL_LAST] = + { 128, 54, 240, 90, 16, 128 }; +static const guint8 yuv_sdtv_colors_V[VIDEO_BOX_FILL_LAST] = + { 128, 34, 110, 240, 146, 128 }; + +static const guint8 yuv_hdtv_colors_Y[VIDEO_BOX_FILL_LAST] = + { 16, 173, 32, 63, 219, 235 }; +static const guint8 yuv_hdtv_colors_U[VIDEO_BOX_FILL_LAST] = + { 128, 42, 240, 102, 16, 128 }; +static const guint8 yuv_hdtv_colors_V[VIDEO_BOX_FILL_LAST] = + { 128, 26, 118, 240, 138, 128 }; + +static const guint8 rgb_colors_R[VIDEO_BOX_FILL_LAST] = + { 0, 0, 0, 255, 255, 255 }; +static const guint8 rgb_colors_G[VIDEO_BOX_FILL_LAST] = + { 0, 255, 0, 0, 255, 255 }; +static const guint8 rgb_colors_B[VIDEO_BOX_FILL_LAST] = + { 0, 0, 255, 0, 0, 255 }; + +/* Generated by -bad/ext/cog/generate_tables */ +static const int cog_ycbcr_to_rgb_matrix_8bit_hdtv[] = { + 298, 0, 459, -63514, + 298, -55, -136, 19681, + 298, 541, 0, -73988, +}; + +static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { + 298, 0, 409, -57068, + 298, -100, -208, 34707, + 298, 516, 0, -70870, +}; + +static const gint cog_rgb_to_ycbcr_matrix_8bit_hdtv[] = { + 47, 157, 16, 4096, + -26, -87, 112, 32768, + 112, -102, -10, 32768, +}; + +static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { + 66, 129, 25, 4096, + -38, -74, 112, 32768, + 112, -94, -18, 32768, +}; + +static const gint cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit[] = { + 256, -30, -53, 10600, + 0, 261, 29, -4367, + 0, 19, 262, -3289, +}; + +static const gint cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit[] = { + 256, 25, 49, -9536, + 0, 253, -28, 3958, + 0, -19, 252, 2918, +}; + +static const gint cog_identity_matrix_8bit[] = { + 256, 0, 0, 0, + 0, 256, 0, 0, + 0, 0, 256, 0, +}; + +#define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8) + +static void +fill_ayuv (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, + guint8 * dest, gboolean sdtv, gint width, gint height) +{ + guint32 empty_pixel; + + b_alpha = CLAMP (b_alpha, 0, 255); + + if (sdtv) + empty_pixel = GUINT32_FROM_BE ((b_alpha << 24) | + (yuv_sdtv_colors_Y[fill_type] << 16) | + (yuv_sdtv_colors_U[fill_type] << 8) | yuv_sdtv_colors_V[fill_type]); + else + empty_pixel = GUINT32_FROM_BE ((b_alpha << 24) | + (yuv_hdtv_colors_Y[fill_type] << 16) | + (yuv_hdtv_colors_U[fill_type] << 8) | yuv_hdtv_colors_V[fill_type]); + + orc_splat_u32 ((guint32 *) dest, empty_pixel, width * height); +} + +static void +copy_ayuv_ayuv (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + gint src_stride = 4 * src_width; + gint dest_stride = 4 * dest_width; + + dest = dest + dest_y * dest_width * 4 + dest_x * 4; + src = src + src_y * src_width * 4 + src_x * 4; + + w *= 4; + + if (dest_sdtv != src_sdtv) { + gint matrix[12]; + gint y, u, v; + + memcpy (matrix, + dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + /* ORC FIXME */ + dest[j] = (src[j] * i_alpha) >> 8; + y = src[j + 1]; + u = src[j + 2]; + v = src[j + 3]; + dest[j + 1] = APPLY_MATRIX (matrix, 0, y, u, v); + dest[j + 2] = APPLY_MATRIX (matrix, 1, y, u, v); + dest[j + 3] = APPLY_MATRIX (matrix, 2, y, u, v); + } + dest += dest_stride; + src += src_stride; + } + } else { + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + /* ORC FIXME */ + dest[j] = (src[j] * i_alpha) >> 8; + dest[j + 1] = src[j + 1]; + dest[j + 2] = src[j + 2]; + dest[j + 3] = src[j + 3]; + } + dest += dest_stride; + src += src_stride; + } + } +} + +static void +copy_ayuv_i420 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + guint8 *destY, *destY2, *destU, *destV; + gint dest_strideY, dest_strideUV; + const guint8 *src2; + gint src_stride; + gint y_idx, uv_idx; + gint y1, y2, y3, y4; + gint u1, u2, u3, u4; + gint v1, v2, v3, v4; + gint matrix[12]; + + dest_strideY = gst_video_format_get_row_stride (dest_format, 0, dest_width); + dest_strideUV = gst_video_format_get_row_stride (dest_format, 1, dest_width); + + src_stride = 4 * src_width; + + destY = + dest + gst_video_format_get_component_offset (dest_format, 0, + dest_width, dest_height); + destU = + dest + gst_video_format_get_component_offset (dest_format, 1, + dest_width, dest_height); + destV = + dest + gst_video_format_get_component_offset (dest_format, 2, + dest_width, dest_height); + + destY = destY + dest_y * dest_strideY + dest_x; + destY2 = (dest_y < dest_height) ? destY + dest_strideY : destY; + destU = destU + (dest_y / 2) * dest_strideUV + dest_x / 2; + destV = destV + (dest_y / 2) * dest_strideUV + dest_x / 2; + + src = src + src_y * src_stride + src_x * 4; + src2 = (src_y < src_height) ? src + src_stride : src; + + h = dest_y + h; + w = dest_x + w; + + if (src_sdtv != dest_sdtv) + memcpy (matrix, + dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + else + memcpy (matrix, cog_identity_matrix_8bit, 12 * sizeof (gint)); + + /* 1. Handle the first destination scanline specially if it + * doesn't start at the macro pixel boundary, i.e. blend + * with the background! */ + if (dest_y % 2 == 1) { + /* 1.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 2 == 1) { + y1 = src[4 * 0 + 1]; + u1 = src[4 * 0 + 2]; + v1 = src[4 * 0 + 3]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[0] = + CLAMP ((3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, + 255); + destV[0] = + CLAMP ((3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, + 255); + + j = dest_x + 1; + y_idx = uv_idx = 1; + } else { + j = dest_x; + y_idx = uv_idx = 0; + } + + /* 1.2. Copy all macro pixels from the source to the destination + * but blend with the background because we're only filling + * the lower part of the macro pixels. */ + for (; j < w - 1; j += 2) { + y1 = src[4 * y_idx + 1]; + y2 = src[4 * y_idx + 4 + 1]; + + u1 = src[4 * y_idx + 2]; + u2 = src[4 * y_idx + 4 + 2]; + + v1 = src[4 * y_idx + 3]; + v2 = src[4 * y_idx + 4 + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destU[uv_idx] = CLAMP ( + (2 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); + destV[uv_idx] = CLAMP ( + (2 * destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + + y_idx += 2; + uv_idx++; + } + + /* 1.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = src[4 * y_idx + 1]; + u1 = src[4 * y_idx + 2]; + v1 = src[4 * y_idx + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[uv_idx] = CLAMP ( + (destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); + destV[uv_idx] = CLAMP ( + (destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); + } else if (j == w - 1) { + y1 = src[4 * y_idx + 1]; + u1 = src[4 * y_idx + 2]; + v1 = src[4 * y_idx + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[uv_idx] = CLAMP ( + (3 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, + 255); + destV[uv_idx] = + CLAMP ((3 * destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, + 0, 255); + } + + destY += dest_strideY; + destY2 += dest_strideY; + destU += dest_strideUV; + destV += dest_strideUV; + src += src_stride; + src2 += src_stride; + i = dest_y + 1; + } else { + i = dest_y; + } + + /* 2. Copy all macro pixel scanlines, the destination scanline + * now starts at macro pixel boundary. */ + for (; i < h - 1; i += 2) { + /* 2.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 2 == 1) { + y1 = src[4 * 0 + 1]; + y2 = src2[4 * 0 + 1]; + u1 = src[4 * 0 + 2]; + u2 = src2[4 * 0 + 2]; + v1 = src[4 * 0 + 3]; + v2 = src2[4 * 0 + 3]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY2[0] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destU[0] = CLAMP ( + (2 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); + destV[0] = CLAMP ( + (2 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + j = dest_x + 1; + y_idx = uv_idx = 1; + } else { + j = dest_x; + y_idx = uv_idx = 0; + } + + /* 2.2. Copy all macro pixels from the source to the destination. + * All pixels now start at macro pixel boundary, i.e. no + * blending with the background is necessary. */ + for (; j < w - 1; j += 2) { + y1 = src[4 * y_idx + 1]; + y2 = src[4 * y_idx + 4 + 1]; + y3 = src2[4 * y_idx + 1]; + y4 = src2[4 * y_idx + 4 + 1]; + + u1 = src[4 * y_idx + 2]; + u2 = src[4 * y_idx + 4 + 2]; + u3 = src2[4 * y_idx + 2]; + u4 = src2[4 * y_idx + 4 + 2]; + + v1 = src[4 * y_idx + 3]; + v2 = src[4 * y_idx + 4 + 3]; + v3 = src2[4 * y_idx + 3]; + v4 = src2[4 * y_idx + 4 + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destY2[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u3, v3), 0, 255); + destY2[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y4, u4, v4), 0, 255); + + destU[uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, + u2, v2) + APPLY_MATRIX (matrix, 1, y3, u3, + v3) + APPLY_MATRIX (matrix, 1, y4, u4, v4)) / 4, 0, 255); + destV[uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, + u2, v2) + APPLY_MATRIX (matrix, 2, y3, u3, + v3) + APPLY_MATRIX (matrix, 2, y4, u4, v4)) / 4, 0, 255); + + y_idx += 2; + uv_idx++; + } + + /* 2.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = src[4 * y_idx + 1]; + y2 = src2[4 * y_idx + 1]; + + u1 = src[4 * y_idx + 2]; + u2 = src2[4 * y_idx + 2]; + + v1 = src[4 * y_idx + 3]; + v2 = src2[4 * y_idx + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY2[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destU[uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, + u2, v2)) / 2, 0, 255); + destV[uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, + u2, v2)) / 2, 0, 255); + } else if (j == w - 1) { + y1 = src[4 * y_idx + 1]; + y2 = src2[4 * y_idx + 1]; + + u1 = src[4 * y_idx + 2]; + u2 = src2[4 * y_idx + 2]; + + v1 = src[4 * y_idx + 3]; + v2 = src2[4 * y_idx + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY2[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destU[uv_idx] = CLAMP ( + (2 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + destV[uv_idx] = CLAMP ( + (2 * destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + } + + destY += 2 * dest_strideY; + destY2 += 2 * dest_strideY; + destU += dest_strideUV; + destV += dest_strideUV; + src += 2 * src_stride; + src2 += 2 * src_stride; + } + + /* 3. Handle the last scanline if one exists. This again + * doesn't start at macro pixel boundary but should + * only fill the upper part of the macro pixels. */ + if (i == h - 1 && i == dest_height - 1) { + /* 3.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 2 == 1) { + y1 = src[4 * 0 + 1]; + u1 = src[4 * 0 + 2]; + v1 = src[4 * 0 + 3]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[0] = + CLAMP ((destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); + destV[0] = + CLAMP ((destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); + + j = dest_x + 1; + y_idx = uv_idx = 1; + } else { + j = dest_x; + y_idx = uv_idx = 0; + } + + /* 3.2. Copy all macro pixels from the source to the destination + * but blend with the background because we're only filling + * the upper part of the macro pixels. */ + for (; j < w - 1; j += 2) { + y1 = src[4 * y_idx + 1]; + y2 = src[4 * y_idx + 4 + 1]; + + u1 = src[4 * y_idx + 2]; + u2 = src[4 * y_idx + 4 + 2]; + + v1 = src[4 * y_idx + 3]; + v2 = src[4 * y_idx + 4 + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + + destU[uv_idx] = CLAMP ( + (2 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); + destV[uv_idx] = CLAMP ( + (2 * destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + + y_idx += 2; + uv_idx++; + } + + /* 3.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = src[4 * y_idx + 1]; + u1 = src[4 * y_idx + 2]; + v1 = src[4 * y_idx + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[uv_idx] = CLAMP ( + (destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); + destV[uv_idx] = CLAMP ( + (destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); + } else if (j == w - 1) { + y1 = src[4 * y_idx + 1]; + u1 = src[4 * y_idx + 2]; + v1 = src[4 * y_idx + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[uv_idx] = CLAMP ( + (3 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, + 255); + destV[uv_idx] = + CLAMP ((3 * destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, + 0, 255); + } + } else if (i == h - 1) { + /* 3.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 2 == 1) { + y1 = src[4 * 0 + 1]; + u1 = src[4 * 0 + 2]; + v1 = src[4 * 0 + 3]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[0] = + CLAMP ((3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, + 255); + destV[0] = + CLAMP ((3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, + 255); + + j = dest_x + 1; + y_idx = uv_idx = 1; + } else { + j = dest_x; + y_idx = uv_idx = 0; + } + + /* 3.2. Copy all macro pixels from the source to the destination + * but blend with the background because we're only filling + * the upper part of the macro pixels. */ + for (; j < w - 1; j += 2) { + y1 = src[4 * y_idx + 1]; + y2 = src[4 * y_idx + 4 + 1]; + + u1 = src[4 * y_idx + 2]; + u2 = src[4 * y_idx + 4 + 2]; + + v1 = src[4 * y_idx + 3]; + v2 = src[4 * y_idx + 4 + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + + destU[uv_idx] = CLAMP ( + (2 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); + destV[uv_idx] = CLAMP ( + (2 * destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + + y_idx += 2; + uv_idx++; + } + + /* 3.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = src[4 * y_idx + 1]; + u1 = src[4 * y_idx + 2]; + v1 = src[4 * y_idx + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[uv_idx] = CLAMP ( + (destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); + destV[uv_idx] = CLAMP ( + (destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); + } else if (j == w - 1) { + y1 = src[4 * y_idx + 1]; + u1 = src[4 * y_idx + 2]; + v1 = src[4 * y_idx + 3]; + + destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[uv_idx] = CLAMP ( + (3 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, + 255); + destV[uv_idx] = + CLAMP ((3 * destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, + 0, 255); + } + } +} + +static void +fill_planar_yuv (GstVideoBoxFill fill_type, guint b_alpha, + GstVideoFormat format, guint8 * dest, gboolean sdtv, gint width, + gint height) +{ + guint8 empty_pixel[3]; + guint8 *destY, *destU, *destV; + gint strideY, strideUV; + gint heightY, heightUV; + + if (sdtv) { + empty_pixel[0] = yuv_sdtv_colors_Y[fill_type]; + empty_pixel[1] = yuv_sdtv_colors_U[fill_type]; + empty_pixel[2] = yuv_sdtv_colors_V[fill_type]; + } else { + empty_pixel[0] = yuv_hdtv_colors_Y[fill_type]; + empty_pixel[1] = yuv_hdtv_colors_U[fill_type]; + empty_pixel[2] = yuv_hdtv_colors_V[fill_type]; + } + + strideY = gst_video_format_get_row_stride (format, 0, width); + strideUV = gst_video_format_get_row_stride (format, 1, width); + + destY = + dest + gst_video_format_get_component_offset (format, 0, width, height); + destU = + dest + gst_video_format_get_component_offset (format, 1, width, height); + destV = + dest + gst_video_format_get_component_offset (format, 2, width, height); + + heightY = gst_video_format_get_component_height (format, 0, height); + heightUV = gst_video_format_get_component_height (format, 1, height); + + memset (destY, empty_pixel[0], strideY * heightY); + memset (destU, empty_pixel[1], strideUV * heightUV); + memset (destV, empty_pixel[2], strideUV * heightUV); +} + +static void +copy_y444_y444 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + guint8 *destY, *destU, *destV; + const guint8 *srcY, *srcU, *srcV; + gint dest_stride; + gint src_stride; + + dest_stride = gst_video_format_get_row_stride (dest_format, 0, dest_width); + src_stride = gst_video_format_get_row_stride (src_format, 0, src_width); + + destY = + dest + gst_video_format_get_component_offset (dest_format, 0, + dest_width, dest_height); + destU = + dest + gst_video_format_get_component_offset (dest_format, 1, + dest_width, dest_height); + destV = + dest + gst_video_format_get_component_offset (dest_format, 2, + dest_width, dest_height); + + srcY = + src + gst_video_format_get_component_offset (src_format, 0, + src_width, src_height); + srcU = + src + gst_video_format_get_component_offset (src_format, 1, + src_width, src_height); + srcV = + src + gst_video_format_get_component_offset (src_format, 2, + src_width, src_height); + + destY = destY + dest_y * dest_stride + dest_x; + destU = destU + dest_y * dest_stride + dest_x; + destV = destV + dest_y * dest_stride + dest_x; + + srcY = srcY + src_y * src_stride + src_x; + srcU = srcU + src_y * src_stride + src_x; + srcV = srcV + src_y * src_stride + src_x; + + if (src_sdtv != dest_sdtv) { + gint matrix[12]; + gint y, u, v; + + memcpy (matrix, + dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + y = APPLY_MATRIX (matrix, 0, srcY[j], srcU[j], srcV[j]); + u = APPLY_MATRIX (matrix, 1, srcY[j], srcU[j], srcV[j]); + v = APPLY_MATRIX (matrix, 2, srcY[j], srcU[j], srcV[j]); + + destY[j] = y; + destU[j] = u; + destV[j] = v; + } + destY += dest_stride; + destU += dest_stride; + destV += dest_stride; + + srcY += src_stride; + srcU += src_stride; + srcV += src_stride; + } + } else { + for (i = 0; i < h; i++) { + memcpy (destY, srcY, w); + memcpy (destU, srcU, w); + memcpy (destV, srcV, w); + + destY += dest_stride; + destU += dest_stride; + destV += dest_stride; + + srcY += src_stride; + srcU += src_stride; + srcV += src_stride; + } + } +} + +static void +copy_y42b_y42b (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + guint8 *destY, *destU, *destV; + const guint8 *srcY, *srcU, *srcV; + gint dest_strideY, dest_strideUV; + gint src_strideY, src_strideUV; + gint src_y_idx, src_uv_idx; + gint dest_y_idx, dest_uv_idx; + gint matrix[12]; + gint y1, y2; + gint u1, u2; + gint v1, v2; + + dest_strideY = gst_video_format_get_row_stride (dest_format, 0, dest_width); + dest_strideUV = gst_video_format_get_row_stride (dest_format, 1, dest_width); + src_strideY = gst_video_format_get_row_stride (src_format, 0, src_width); + src_strideUV = gst_video_format_get_row_stride (src_format, 1, src_width); + + destY = + dest + gst_video_format_get_component_offset (dest_format, 0, + dest_width, dest_height); + destU = + dest + gst_video_format_get_component_offset (dest_format, 1, + dest_width, dest_height); + destV = + dest + gst_video_format_get_component_offset (dest_format, 2, + dest_width, dest_height); + + srcY = + src + gst_video_format_get_component_offset (src_format, 0, + src_width, src_height); + srcU = + src + gst_video_format_get_component_offset (src_format, 1, + src_width, src_height); + srcV = + src + gst_video_format_get_component_offset (src_format, 2, + src_width, src_height); + + + destY = destY + dest_y * dest_strideY + dest_x; + destU = destU + dest_y * dest_strideUV + dest_x / 2; + destV = destV + dest_y * dest_strideUV + dest_x / 2; + + srcY = srcY + src_y * src_strideY + src_x; + srcU = srcU + src_y * src_strideUV + src_x / 2; + srcV = srcV + src_y * src_strideUV + src_x / 2; + + h = dest_y + h; + w = dest_x + w; + + if (src_sdtv != dest_sdtv) + memcpy (matrix, + dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + else + memcpy (matrix, cog_identity_matrix_8bit, 12 * sizeof (gint)); + + /* 1. Copy all macro pixel scanlines, the destination scanline + * now starts at macro pixel boundary. */ + for (i = dest_y; i < h; i++) { + /* 1.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 2 == 1) { + y1 = srcY[0]; + u1 = srcU[0]; + v1 = srcV[0]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[0] = CLAMP ( + (destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); + destV[0] = CLAMP ( + (destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); + j = dest_x + 1; + src_y_idx = dest_y_idx = dest_uv_idx = 1; + src_uv_idx = (src_x % 2) + 1; + } else { + j = dest_x; + src_y_idx = dest_y_idx = dest_uv_idx = 0; + src_uv_idx = (src_x % 2); + } + + /* 1.2. Copy all macro pixels from the source to the destination. + * All pixels now start at macro pixel boundary, i.e. no + * blending with the background is necessary. */ + for (; j < w - 1; j += 2) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + src_uv_idx++; + u2 = srcU[src_uv_idx / 2]; + v2 = srcV[src_uv_idx / 2]; + src_uv_idx++; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + + destU[dest_uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, + u2, v2)) / 2, 0, 255); + destV[dest_uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, + u2, v2)) / 2, 0, 255); + + dest_y_idx += 2; + src_y_idx += 2; + dest_uv_idx++; + } + + /* 1.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); + destV[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); + } else if (j == w - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 2, 0, 255); + destV[dest_uv_idx] = CLAMP ( + (destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 2, 0, 255); + } + + destY += dest_strideY; + destU += dest_strideUV; + destV += dest_strideUV; + srcY += src_strideY; + + srcU += src_strideUV; + srcV += src_strideUV; + } +} + +static void +copy_y41b_y41b (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + guint8 *destY, *destU, *destV; + const guint8 *srcY, *srcU, *srcV; + gint dest_strideY, dest_strideUV; + gint src_strideY, src_strideUV; + gint src_y_idx, src_uv_idx; + gint dest_y_idx, dest_uv_idx; + gint matrix[12]; + gint y1, y2, y3, y4; + gint u1, u2, u3, u4; + gint v1, v2, v3, v4; + + dest_strideY = gst_video_format_get_row_stride (dest_format, 0, dest_width); + dest_strideUV = gst_video_format_get_row_stride (dest_format, 1, dest_width); + src_strideY = gst_video_format_get_row_stride (src_format, 0, src_width); + src_strideUV = gst_video_format_get_row_stride (src_format, 1, src_width); + + destY = + dest + gst_video_format_get_component_offset (dest_format, 0, + dest_width, dest_height); + destU = + dest + gst_video_format_get_component_offset (dest_format, 1, + dest_width, dest_height); + destV = + dest + gst_video_format_get_component_offset (dest_format, 2, + dest_width, dest_height); + + srcY = + src + gst_video_format_get_component_offset (src_format, 0, + src_width, src_height); + srcU = + src + gst_video_format_get_component_offset (src_format, 1, + src_width, src_height); + srcV = + src + gst_video_format_get_component_offset (src_format, 2, + src_width, src_height); + + + destY = destY + dest_y * dest_strideY + dest_x; + destU = destU + dest_y * dest_strideUV + dest_x / 4; + destV = destV + dest_y * dest_strideUV + dest_x / 4; + + srcY = srcY + src_y * src_strideY + src_x; + srcU = srcU + src_y * src_strideUV + src_x / 4; + srcV = srcV + src_y * src_strideUV + src_x / 4; + + h = dest_y + h; + w = dest_x + w; + + if (src_sdtv != dest_sdtv) + memcpy (matrix, + dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + else + memcpy (matrix, cog_identity_matrix_8bit, 12 * sizeof (gint)); + + /* 1. Copy all macro pixel scanlines, the destination scanline + * now starts at macro pixel boundary. */ + for (i = dest_y; i < h; i++) { + /* 1.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 4 == 1) { + y1 = srcY[0]; + y2 = srcY[1]; + y3 = srcY[2]; + u1 = srcU[0]; + v1 = srcV[0]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); + destY[2] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u1, v1), 0, 255); + + destU[0] = CLAMP ( + (destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u1, + v1) + APPLY_MATRIX (matrix, 1, y3, u1, v1)) / 4, 0, 255); + destV[0] = + CLAMP ((destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u1, + v1) + APPLY_MATRIX (matrix, 2, y3, u1, v1)) / 4, 0, 255); + + j = dest_x + 3; + src_y_idx = dest_y_idx = 3; + dest_uv_idx = 1; + src_uv_idx = (src_x % 4) + 3; + } else if (dest_x % 4 == 2) { + y1 = srcY[0]; + y2 = srcY[1]; + u1 = srcU[0]; + v1 = srcV[0]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); + + destU[0] = CLAMP ( + (2 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u1, v1)) / 4, 0, 255); + destV[0] = + CLAMP ((2 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u1, v1)) / 4, 0, 255); + + j = dest_x + 2; + src_y_idx = dest_y_idx = 2; + dest_uv_idx = 1; + src_uv_idx = (src_x % 4) + 2; + } else if (dest_x % 4 == 3) { + y1 = srcY[0]; + u1 = srcU[0]; + v1 = srcV[0]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + + destU[0] = CLAMP ( + (3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); + destV[0] = CLAMP ( + (3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, 255); + + j = dest_x + 1; + src_y_idx = dest_y_idx = 1; + dest_uv_idx = 1; + src_uv_idx = (src_x % 4) + 1; + } else { + j = dest_x; + src_y_idx = dest_y_idx = dest_uv_idx = 0; + src_uv_idx = (src_x % 4); + } + + /* 1.2. Copy all macro pixels from the source to the destination. + * All pixels now start at macro pixel boundary, i.e. no + * blending with the background is necessary. */ + for (; j < w - 3; j += 4) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + y3 = srcY[src_y_idx + 2]; + y4 = srcY[src_y_idx + 3]; + + u1 = srcU[src_uv_idx / 4]; + v1 = srcV[src_uv_idx / 4]; + src_uv_idx++; + u2 = srcU[src_uv_idx / 4]; + v2 = srcV[src_uv_idx / 4]; + src_uv_idx++; + u3 = srcU[src_uv_idx / 4]; + v3 = srcV[src_uv_idx / 4]; + src_uv_idx++; + u4 = srcU[src_uv_idx / 4]; + v4 = srcV[src_uv_idx / 4]; + src_uv_idx++; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destY[dest_y_idx + 2] = + CLAMP (APPLY_MATRIX (matrix, 0, y3, u3, v3), 0, 255); + destY[dest_y_idx + 3] = + CLAMP (APPLY_MATRIX (matrix, 0, y4, u4, v4), 0, 255); + + destU[dest_uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, + u2, v2) + APPLY_MATRIX (matrix, 1, y3, u3, + v3) + APPLY_MATRIX (matrix, 1, y4, u4, v4)) / 4, 0, 255); + destV[dest_uv_idx] = + CLAMP ((APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, + 2, y2, u2, v2) + APPLY_MATRIX (matrix, 2, y3, u3, + v3) + APPLY_MATRIX (matrix, 2, y4, u4, v4)) / 4, 0, 255); + + dest_y_idx += 4; + src_y_idx += 4; + dest_uv_idx++; + } + + /* 1.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 4]; + v1 = srcV[src_uv_idx / 4]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); + destV[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); + } else if (j == w - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 4]; + v1 = srcV[src_uv_idx / 4]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (destU[dest_uv_idx] + 3 * APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 4, 0, 255); + destV[dest_uv_idx] = CLAMP ( + (destV[dest_uv_idx] + 3 * APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 4, 0, 255); + } else if (j == w - 2 && j == dest_width - 2) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + u1 = srcU[src_uv_idx / 4]; + v1 = srcV[src_uv_idx / 4]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); + destV[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); + } else if (j == w - 2) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + u1 = srcU[src_uv_idx / 4]; + v1 = srcV[src_uv_idx / 4]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); + destU[dest_uv_idx] = + CLAMP ((destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 2, 0, 255); + destV[dest_uv_idx] = + CLAMP ((destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 2, 0, 255); + } else if (j == w - 3 && j == dest_width - 3) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + y3 = srcY[src_y_idx + 2]; + u1 = srcU[src_uv_idx / 4]; + v1 = srcV[src_uv_idx / 4]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); + destY[dest_y_idx + 2] = + CLAMP (APPLY_MATRIX (matrix, 0, y3, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); + destV[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); + } else if (j == w - 3) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + y3 = srcY[src_y_idx + 2]; + u1 = srcU[src_uv_idx / 4]; + v1 = srcV[src_uv_idx / 4]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); + destY[dest_y_idx + 2] = + CLAMP (APPLY_MATRIX (matrix, 0, y3, u1, v1), 0, 255); + destU[dest_uv_idx] = + CLAMP ((3 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 4, 0, 255); + destV[dest_uv_idx] = + CLAMP ((3 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 4, 0, 255); + } + + destY += dest_strideY; + destU += dest_strideUV; + destV += dest_strideUV; + srcY += src_strideY; + srcU += src_strideUV; + srcV += src_strideUV; + } +} + +static void +copy_i420_i420 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + guint8 *destY, *destU, *destV; + const guint8 *srcY, *srcU, *srcV; + guint8 *destY2; + const guint8 *srcY2, *srcU2, *srcV2; + gint dest_strideY, dest_strideUV; + gint src_strideY, src_strideUV; + gint src_y_idx, src_uv_idx; + gint dest_y_idx, dest_uv_idx; + gint matrix[12]; + gint y1, y2, y3, y4; + gint u1, u2, u3, u4; + gint v1, v2, v3, v4; + + dest_strideY = + gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 0, dest_width); + dest_strideUV = + gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 1, dest_width); + src_strideY = + gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 0, src_width); + src_strideUV = + gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 1, src_width); + + destY = + dest + gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 0, + dest_width, dest_height); + destU = + dest + gst_video_format_get_component_offset (dest_format, 1, + dest_width, dest_height); + destV = + dest + gst_video_format_get_component_offset (dest_format, 2, + dest_width, dest_height); + + srcY = + src + gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 0, + src_width, src_height); + srcU = + src + gst_video_format_get_component_offset (src_format, 1, + src_width, src_height); + srcV = + src + gst_video_format_get_component_offset (src_format, 2, + src_width, src_height); + + + destY = destY + dest_y * dest_strideY + dest_x; + destU = destU + (dest_y / 2) * dest_strideUV + dest_x / 2; + destV = destV + (dest_y / 2) * dest_strideUV + dest_x / 2; + + srcY = srcY + src_y * src_strideY + src_x; + srcU = srcU + (src_y / 2) * src_strideUV + src_x / 2; + srcV = srcV + (src_y / 2) * src_strideUV + src_x / 2; + + destY2 = destY + dest_strideY; + srcY2 = srcY + src_strideY; + + h = dest_y + h; + w = dest_x + w; + + if (src_sdtv != dest_sdtv) + memcpy (matrix, + dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + else + memcpy (matrix, cog_identity_matrix_8bit, 12 * sizeof (gint)); + + /* 1. Handle the first destination scanline specially if it + * doesn't start at the macro pixel boundary, i.e. blend + * with the background! */ + if (dest_y % 2 == 1) { + /* 1.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 2 == 1) { + y1 = srcY[0]; + u1 = srcU[0]; + v1 = srcV[0]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[0] = + CLAMP ((3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, + 255); + destV[0] = + CLAMP ((3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, + 255); + + j = dest_x + 1; + src_y_idx = dest_y_idx = dest_uv_idx = 1; + src_uv_idx = (src_x % 2) + 1; + } else { + j = dest_x; + src_y_idx = dest_y_idx = dest_uv_idx = 0; + src_uv_idx = (src_x % 2); + } + + /* 1.2. Copy all macro pixels from the source to the destination + * but blend with the background because we're only filling + * the lower part of the macro pixels. */ + for (; j < w - 1; j += 2) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + src_uv_idx++; + u2 = srcU[src_uv_idx / 2]; + v2 = srcV[src_uv_idx / 2]; + src_uv_idx++; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destU[dest_uv_idx] = + CLAMP ((2 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); + destV[dest_uv_idx] = + CLAMP ((2 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + + dest_y_idx += 2; + src_y_idx += 2; + dest_uv_idx++; + } + + /* 1.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, + 255); + destV[dest_uv_idx] = + CLAMP ((destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, + v1)) / 2, 0, 255); + } else if (j == w - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (3 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, + 0, 255); + destV[dest_uv_idx] = + CLAMP ((3 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, + v1)) / 4, 0, 255); + } + + destY += dest_strideY; + destY2 += dest_strideY; + destU += dest_strideUV; + destV += dest_strideUV; + srcY += src_strideY; + srcY2 += src_strideY; + src_y++; + if (src_y % 2 == 0) { + srcU += src_strideUV; + srcV += src_strideUV; + } + i = dest_y + 1; + } else { + i = dest_y; + } + + /* 2. Copy all macro pixel scanlines, the destination scanline + * now starts at macro pixel boundary. */ + for (; i < h - 1; i += 2) { + /* 2.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + + srcU2 = srcU; + srcV2 = srcV; + if (src_y % 2 == 1) { + srcU2 += src_strideUV; + srcV2 += src_strideUV; + } + + if (dest_x % 2 == 1) { + y1 = srcY[0]; + y2 = srcY2[0]; + u1 = srcU[0]; + v1 = srcV[0]; + u2 = srcU2[0]; + v2 = srcV2[0]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY2[0] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destU[0] = CLAMP ( + (2 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); + destV[0] = CLAMP ( + (2 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + j = dest_x + 1; + src_y_idx = dest_y_idx = dest_uv_idx = 1; + src_uv_idx = (src_x % 2) + 1; + } else { + j = dest_x; + src_y_idx = dest_y_idx = dest_uv_idx = 0; + src_uv_idx = (src_x % 2); + } + + /* 2.2. Copy all macro pixels from the source to the destination. + * All pixels now start at macro pixel boundary, i.e. no + * blending with the background is necessary. */ + for (; j < w - 1; j += 2) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + y3 = srcY2[src_y_idx]; + y4 = srcY2[src_y_idx + 1]; + + u1 = srcU[src_uv_idx / 2]; + u3 = srcU2[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + v3 = srcV2[src_uv_idx / 2]; + src_uv_idx++; + u2 = srcU[src_uv_idx / 2]; + u4 = srcU2[src_uv_idx / 2]; + v2 = srcV[src_uv_idx / 2]; + v4 = srcV2[src_uv_idx / 2]; + src_uv_idx++; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destY2[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u3, v3), 0, 255); + destY2[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y4, u4, v4), 0, 255); + + destU[dest_uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, + u2, v2) + APPLY_MATRIX (matrix, 1, y3, u3, + v3) + APPLY_MATRIX (matrix, 1, y4, u4, v4)) / 4, 0, 255); + destV[dest_uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, + u2, v2) + APPLY_MATRIX (matrix, 2, y3, u3, + v3) + APPLY_MATRIX (matrix, 2, y4, u4, v4)) / 4, 0, 255); + + dest_y_idx += 2; + src_y_idx += 2; + dest_uv_idx++; + } + + /* 2.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = srcY[src_y_idx]; + y2 = srcY2[src_y_idx]; + + u1 = srcU[src_uv_idx / 2]; + u2 = srcU2[src_uv_idx / 2]; + + v1 = srcV[src_uv_idx / 2]; + v2 = srcV2[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY2[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, + u2, v2)) / 2, 0, 255); + destV[dest_uv_idx] = CLAMP ( + (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, + u2, v2)) / 2, 0, 255); + } else if (j == w - 1) { + y1 = srcY[src_y_idx]; + y2 = srcY2[src_y_idx]; + + u1 = srcU[src_uv_idx / 2]; + u2 = srcU2[src_uv_idx / 2]; + + v1 = srcV[src_uv_idx / 2]; + v2 = srcV2[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY2[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (2 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + destV[dest_uv_idx] = CLAMP ( + (2 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + } + + destY += 2 * dest_strideY; + destY2 += 2 * dest_strideY; + destU += dest_strideUV; + destV += dest_strideUV; + srcY += 2 * src_strideY; + srcY2 += 2 * src_strideY; + + src_y += 2; + srcU += src_strideUV; + srcV += src_strideUV; + } + + /* 3. Handle the last scanline if one exists. This again + * doesn't start at macro pixel boundary but should + * only fill the upper part of the macro pixels. */ + if (i == h - 1 && i == dest_height - 1) { + /* 3.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 2 == 1) { + y1 = srcY[0]; + u1 = srcU[0]; + v1 = srcV[0]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[0] = + CLAMP ((destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); + destV[0] = + CLAMP ((destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); + + j = dest_x + 1; + src_y_idx = dest_y_idx = dest_uv_idx = 1; + src_uv_idx = (src_x % 2) + 1; + } else { + j = dest_x; + src_y_idx = dest_y_idx = dest_uv_idx = 0; + src_uv_idx = (src_x % 2); + } + + /* 3.2. Copy all macro pixels from the source to the destination + * but blend with the background because we're only filling + * the upper part of the macro pixels. */ + for (; j < w - 1; j += 2) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + src_uv_idx++; + u2 = srcU[src_uv_idx / 2]; + v2 = srcV[src_uv_idx / 2]; + src_uv_idx++; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + + destU[dest_uv_idx] = CLAMP ( + (2 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); + destV[dest_uv_idx] = CLAMP ( + (2 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + + dest_y_idx += 2; + src_y_idx += 2; + dest_uv_idx++; + } + + /* 3.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, + 255); + destV[dest_uv_idx] = + CLAMP ((destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 2, 0, 255); + } else if (j == w - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (3 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, + 0, 255); + destV[dest_uv_idx] = + CLAMP ((3 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 4, 0, 255); + } + } else if (i == h - 1) { + /* 3.1. Handle the first destination pixel if it doesn't + * start at the macro pixel boundary, i.e. blend with + * the background! */ + if (dest_x % 2 == 1) { + y1 = srcY[0]; + u1 = srcU[0]; + v1 = srcV[0]; + + destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[0] = + CLAMP ((3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, + 255); + destV[0] = + CLAMP ((3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, + 255); + + j = dest_x + 1; + src_y_idx = dest_y_idx = dest_uv_idx = 1; + src_uv_idx = (src_x % 2) + 1; + } else { + j = dest_x; + src_y_idx = dest_y_idx = dest_uv_idx = 0; + src_uv_idx = (src_x % 2); + } + + /* 3.2. Copy all macro pixels from the source to the destination + * but blend with the background because we're only filling + * the upper part of the macro pixels. */ + for (; j < w - 1; j += 2) { + y1 = srcY[src_y_idx]; + y2 = srcY[src_y_idx + 1]; + + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + src_uv_idx++; + u2 = srcU[src_uv_idx / 2]; + v2 = srcV[src_uv_idx / 2]; + src_uv_idx++; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destY[dest_y_idx + 1] = + CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); + + destU[dest_uv_idx] = CLAMP ( + (2 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); + destV[dest_uv_idx] = CLAMP ( + (2 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, + v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); + + dest_y_idx += 2; + src_y_idx += 2; + dest_uv_idx++; + } + + /* 3.3. Now copy the last pixel if one exists and blend it + * with the background because we only fill part of + * the macro pixel. In case this is the last pixel of + * the destination we will a larger part. */ + if (j == w - 1 && j == dest_width - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, + 255); + destV[dest_uv_idx] = + CLAMP ((destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 2, 0, 255); + } else if (j == w - 1) { + y1 = srcY[src_y_idx]; + u1 = srcU[src_uv_idx / 2]; + v1 = srcV[src_uv_idx / 2]; + + destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); + destU[dest_uv_idx] = CLAMP ( + (3 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, + 0, 255); + destV[dest_uv_idx] = + CLAMP ((3 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, + v1)) / 4, 0, 255); + } + } +} + +static void +copy_i420_ayuv (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + const guint8 *srcY, *srcU, *srcV; + gint src_strideY, src_strideUV; + gint dest_stride; + + src_strideY = + gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 0, src_width); + src_strideUV = + gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 1, src_width); + + srcY = + src + gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 0, + src_width, src_height); + srcU = + src + gst_video_format_get_component_offset (src_format, 1, + src_width, src_height); + srcV = + src + gst_video_format_get_component_offset (src_format, 2, + src_width, src_height); + + dest_stride = dest_width * 4; + + dest = dest + dest_y * dest_stride + dest_x * 4; + + srcY = srcY + src_y * src_strideY + src_x; + srcU = srcU + (src_y / 2) * src_strideUV + src_x / 2; + srcV = srcV + (src_y / 2) * src_strideUV + src_x / 2; + + i_alpha = CLAMP (i_alpha, 0, 255); + + if (src_sdtv != dest_sdtv) { + gint i, j, uv_idx; + gint y, u, v; + gint y1, u1, v1; + gint matrix[12]; + + memcpy (matrix, + dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + + for (i = 0; i < h; i++) { + for (j = 0, uv_idx = src_x % 2; j < w; j++, uv_idx++) { + y = srcY[j]; + u = srcU[uv_idx / 2]; + v = srcV[uv_idx / 2]; + + y1 = APPLY_MATRIX (matrix, 0, y, u, v); + u1 = APPLY_MATRIX (matrix, 1, y, u, v); + v1 = APPLY_MATRIX (matrix, 2, y, u, v); + + dest[4 * j + 0] = i_alpha; + dest[4 * j + 1] = y1; + dest[4 * j + 2] = u1; + dest[4 * j + 3] = v1; + } + dest += dest_stride; + + src_y++; + srcY += src_strideY; + if (src_y % 2 == 0) { + srcU += src_strideUV; + srcV += src_strideUV; + } + } + } else { + gint i, j, uv_idx; + gint y, u, v; + + for (i = 0; i < h; i++) { + for (j = 0, uv_idx = src_x % 2; j < w; j++, uv_idx++) { + y = srcY[j]; + u = srcU[uv_idx / 2]; + v = srcV[uv_idx / 2]; + + dest[4 * j + 0] = i_alpha; + dest[4 * j + 1] = y; + dest[4 * j + 2] = u; + dest[4 * j + 3] = v; + } + dest += dest_stride; + + src_y++; + srcY += src_strideY; + if (src_y % 2 == 0) { + srcU += src_strideUV; + srcV += src_strideUV; + } + } + } +} + +static void +fill_rgb32 (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, + guint8 * dest, gboolean sdtv, gint width, gint height) +{ + guint32 empty_pixel; + gint p[4]; + + p[0] = gst_video_format_get_component_offset (format, 3, width, height); + p[1] = gst_video_format_get_component_offset (format, 0, width, height); + p[2] = gst_video_format_get_component_offset (format, 1, width, height); + p[3] = gst_video_format_get_component_offset (format, 2, width, height); + + b_alpha = CLAMP (b_alpha, 0, 255); + + empty_pixel = GUINT32_FROM_LE ((b_alpha << (p[0] * 8)) | + (rgb_colors_R[fill_type] << (p[1] * 8)) | + (rgb_colors_G[fill_type] << (p[2] * 8)) | + (rgb_colors_B[fill_type] << (p[3] * 8))); + + orc_splat_u32 ((guint32 *) dest, empty_pixel, width * height); +} + +static void +fill_rgb24 (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, + guint8 * dest, gboolean sdtv, gint width, gint height) +{ + gint dest_stride = GST_ROUND_UP_4 (width * 3); + gint p[4]; + gint i, j; + + p[0] = gst_video_format_get_component_offset (format, 3, width, height); + p[1] = gst_video_format_get_component_offset (format, 0, width, height); + p[2] = gst_video_format_get_component_offset (format, 1, width, height); + p[3] = gst_video_format_get_component_offset (format, 2, width, height); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[3 * j + p[1]] = rgb_colors_R[fill_type]; + dest[3 * j + p[2]] = rgb_colors_G[fill_type]; + dest[3 * j + p[3]] = rgb_colors_B[fill_type]; + } + dest += dest_stride; + } +} + +static void +copy_rgb32 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + gint src_stride, dest_stride; + gboolean in_alpha, out_alpha; + gint in_bpp, out_bpp; + gint p_out[4]; + gint p_in[4]; + gboolean packed_out = (dest_format == GST_VIDEO_FORMAT_RGB + || dest_format == GST_VIDEO_FORMAT_BGR); + gboolean packed_in = (src_format == GST_VIDEO_FORMAT_RGB + || src_format == GST_VIDEO_FORMAT_BGR); + + src_stride = (packed_in) ? GST_ROUND_UP_4 (3 * src_width) : 4 * src_width; + dest_stride = (packed_out) ? GST_ROUND_UP_4 (3 * dest_width) : 4 * dest_width; + in_bpp = (packed_in) ? 3 : 4; + out_bpp = (packed_out) ? 3 : 4; + + out_alpha = gst_video_format_has_alpha (dest_format); + p_out[0] = + gst_video_format_get_component_offset (dest_format, 3, dest_width, + dest_height); + p_out[1] = + gst_video_format_get_component_offset (dest_format, 0, dest_width, + dest_height); + p_out[2] = + gst_video_format_get_component_offset (dest_format, 1, dest_width, + dest_height); + p_out[3] = + gst_video_format_get_component_offset (dest_format, 2, dest_width, + dest_height); + + in_alpha = gst_video_format_has_alpha (src_format); + p_in[0] = + gst_video_format_get_component_offset (src_format, 3, src_width, + src_height); + p_in[1] = + gst_video_format_get_component_offset (src_format, 0, src_width, + src_height); + p_in[2] = + gst_video_format_get_component_offset (src_format, 1, src_width, + src_height); + p_in[3] = + gst_video_format_get_component_offset (src_format, 2, src_width, + src_height); + + dest = dest + dest_y * dest_stride + dest_x * out_bpp; + src = src + src_y * src_stride + src_x * in_bpp; + + if (in_alpha && out_alpha) { + w *= 4; + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + dest[j + p_out[0]] = (src[j + p_in[0]] * i_alpha) >> 8; + dest[j + p_out[1]] = src[j + p_in[1]]; + dest[j + p_out[2]] = src[j + p_in[2]]; + dest[j + p_out[3]] = src[j + p_in[3]]; + } + dest += dest_stride; + src += src_stride; + } + } else if (out_alpha && !packed_in) { + w *= 4; + i_alpha = CLAMP (i_alpha, 0, 255); + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + dest[j + p_out[0]] = i_alpha; + dest[j + p_out[1]] = src[j + p_in[1]]; + dest[j + p_out[2]] = src[j + p_in[2]]; + dest[j + p_out[3]] = src[j + p_in[3]]; + } + dest += dest_stride; + src += src_stride; + } + } else if (out_alpha && packed_in) { + i_alpha = CLAMP (i_alpha, 0, 255); + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + dest[4 * j + p_out[0]] = i_alpha; + dest[4 * j + p_out[1]] = src[in_bpp * j + p_in[1]]; + dest[4 * j + p_out[2]] = src[in_bpp * j + p_in[2]]; + dest[4 * j + p_out[3]] = src[in_bpp * j + p_in[3]]; + } + dest += dest_stride; + src += src_stride; + } + } else if (!packed_out && !packed_in) { + w *= 4; + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + dest[j + p_out[1]] = src[j + p_in[1]]; + dest[j + p_out[2]] = src[j + p_in[2]]; + dest[j + p_out[3]] = src[j + p_in[3]]; + } + dest += dest_stride; + src += src_stride; + } + } else { + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + dest[out_bpp * j + p_out[1]] = src[in_bpp * j + p_in[1]]; + dest[out_bpp * j + p_out[2]] = src[in_bpp * j + p_in[2]]; + dest[out_bpp * j + p_out[3]] = src[in_bpp * j + p_in[3]]; + } + dest += dest_stride; + src += src_stride; + } + } +} + +static void +copy_rgb32_ayuv (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + gint src_stride, dest_stride; + gboolean in_alpha; + gint in_bpp; + gint p_in[4]; + gboolean packed_in = (src_format == GST_VIDEO_FORMAT_RGB + || src_format == GST_VIDEO_FORMAT_BGR); + gint matrix[12]; + gint a; + gint y, u, v; + gint r, g, b; + + src_stride = (packed_in) ? GST_ROUND_UP_4 (3 * src_width) : 4 * src_width; + dest_stride = 4 * dest_width; + in_bpp = (packed_in) ? 3 : 4; + + in_alpha = gst_video_format_has_alpha (src_format); + p_in[0] = + gst_video_format_get_component_offset (src_format, 3, src_width, + src_height); + p_in[1] = + gst_video_format_get_component_offset (src_format, 0, src_width, + src_height); + p_in[2] = + gst_video_format_get_component_offset (src_format, 1, src_width, + src_height); + p_in[3] = + gst_video_format_get_component_offset (src_format, 2, src_width, + src_height); + + memcpy (matrix, + (dest_sdtv) ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : + cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); + + dest = dest + dest_y * dest_stride + dest_x * 4; + src = src + src_y * src_stride + src_x * in_bpp; + + if (in_alpha) { + w *= 4; + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + a = (src[j + p_in[0]] * i_alpha) >> 8; + r = src[j + p_in[1]]; + g = src[j + p_in[2]]; + b = src[j + p_in[3]]; + + y = APPLY_MATRIX (matrix, 0, r, g, b); + u = APPLY_MATRIX (matrix, 1, r, g, b); + v = APPLY_MATRIX (matrix, 2, r, g, b); + + dest[j + 0] = a; + dest[j + 1] = CLAMP (y, 0, 255); + dest[j + 2] = CLAMP (u, 0, 255); + dest[j + 3] = CLAMP (v, 0, 255); + } + dest += dest_stride; + src += src_stride; + } + } else if (!packed_in) { + w *= 4; + i_alpha = CLAMP (i_alpha, 0, 255); + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + a = i_alpha; + r = src[j + p_in[1]]; + g = src[j + p_in[2]]; + b = src[j + p_in[3]]; + + y = APPLY_MATRIX (matrix, 0, r, g, b); + u = APPLY_MATRIX (matrix, 1, r, g, b); + v = APPLY_MATRIX (matrix, 2, r, g, b); + + dest[j + 0] = a; + dest[j + 1] = CLAMP (y, 0, 255); + dest[j + 2] = CLAMP (u, 0, 255); + dest[j + 3] = CLAMP (v, 0, 255); + } + dest += dest_stride; + src += src_stride; + } + } else { + i_alpha = CLAMP (i_alpha, 0, 255); + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + a = i_alpha; + r = src[in_bpp * j + p_in[1]]; + g = src[in_bpp * j + p_in[2]]; + b = src[in_bpp * j + p_in[3]]; + + y = APPLY_MATRIX (matrix, 0, r, g, b); + u = APPLY_MATRIX (matrix, 1, r, g, b); + v = APPLY_MATRIX (matrix, 2, r, g, b); + + dest[4 * j + 0] = a; + dest[4 * j + 1] = CLAMP (y, 0, 255); + dest[4 * j + 2] = CLAMP (u, 0, 255); + dest[4 * j + 3] = CLAMP (v, 0, 255); + } + dest += dest_stride; + src += src_stride; + } + } +} + +static void +copy_ayuv_rgb32 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + gint src_stride, dest_stride; + gboolean out_alpha; + gint out_bpp; + gint p_out[4]; + gboolean packed_out = (dest_format == GST_VIDEO_FORMAT_RGB + || dest_format == GST_VIDEO_FORMAT_BGR); + gint matrix[12]; + gint a; + gint y, u, v; + gint r, g, b; + + dest_stride = (packed_out) ? GST_ROUND_UP_4 (3 * dest_width) : 4 * dest_width; + src_stride = 4 * src_width; + out_bpp = (packed_out) ? 3 : 4; + + out_alpha = gst_video_format_has_alpha (dest_format); + p_out[0] = + gst_video_format_get_component_offset (dest_format, 3, dest_width, + dest_height); + p_out[1] = + gst_video_format_get_component_offset (dest_format, 0, dest_width, + dest_height); + p_out[2] = + gst_video_format_get_component_offset (dest_format, 1, dest_width, + dest_height); + p_out[3] = + gst_video_format_get_component_offset (dest_format, 2, dest_width, + dest_height); + + memcpy (matrix, + (src_sdtv) ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : + cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); + + dest = dest + dest_y * dest_stride + dest_x * out_bpp; + src = src + src_y * src_stride + src_x * 4; + + if (out_alpha) { + w *= 4; + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + a = (src[j + 0] * i_alpha) >> 8; + y = src[j + 1]; + u = src[j + 2]; + v = src[j + 3]; + + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + + dest[j + p_out[0]] = a; + dest[j + p_out[1]] = CLAMP (r, 0, 255); + dest[j + p_out[2]] = CLAMP (g, 0, 255); + dest[j + p_out[3]] = CLAMP (b, 0, 255); + } + dest += dest_stride; + src += src_stride; + } + } else if (!packed_out) { + w *= 4; + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 4) { + y = src[j + 1]; + u = src[j + 2]; + v = src[j + 3]; + + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + + dest[j + p_out[1]] = CLAMP (r, 0, 255); + dest[j + p_out[2]] = CLAMP (g, 0, 255); + dest[j + p_out[3]] = CLAMP (b, 0, 255); + } + dest += dest_stride; + src += src_stride; + } + } else { + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + y = src[4 * j + 1]; + u = src[4 * j + 2]; + v = src[4 * j + 3]; + + r = APPLY_MATRIX (matrix, 0, y, u, v); + g = APPLY_MATRIX (matrix, 1, y, u, v); + b = APPLY_MATRIX (matrix, 2, y, u, v); + + dest[out_bpp * j + p_out[1]] = CLAMP (r, 0, 255); + dest[out_bpp * j + p_out[2]] = CLAMP (g, 0, 255); + dest[out_bpp * j + p_out[3]] = CLAMP (b, 0, 255); + } + dest += dest_stride; + src += src_stride; + } + } +} + +static void +fill_gray (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, + guint8 * dest, gboolean sdtv, gint width, gint height) +{ + gint i, j; + gint dest_stride; + + if (format == GST_VIDEO_FORMAT_GRAY8) { + guint8 val = yuv_sdtv_colors_Y[fill_type]; + + dest_stride = GST_ROUND_UP_4 (width); + for (i = 0; i < height; i++) { + memset (dest, val, width); + dest += dest_stride; + } + } else { + guint16 val = yuv_sdtv_colors_Y[fill_type] << 8; + + dest_stride = GST_ROUND_UP_4 (width * 2); + if (format == GST_VIDEO_FORMAT_GRAY16_BE) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + GST_WRITE_UINT16_BE (dest + 2 * j, val); + } + dest += dest_stride; + } + } else { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + GST_WRITE_UINT16_LE (dest + 2 * j, val); + } + dest += dest_stride; + } + } + } +} + +static void +copy_packed_simple (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i; + gint src_stride, dest_stride; + gint pixel_stride, row_size; + + src_stride = gst_video_format_get_row_stride (src_format, 0, src_width); + dest_stride = gst_video_format_get_row_stride (dest_format, 0, dest_width); + pixel_stride = gst_video_format_get_pixel_stride (dest_format, 0); + row_size = w * pixel_stride; + + dest = dest + dest_y * dest_stride + dest_x * pixel_stride; + src = src + src_y * src_stride + src_x * pixel_stride; + + for (i = 0; i < h; i++) { + memcpy (dest, src, row_size); + dest += dest_stride; + src += src_stride; + } +} + +static void +fill_yuy2 (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, + guint8 * dest, gboolean sdtv, gint width, gint height) +{ + guint8 y, u, v; + gint i, j; + gint stride = gst_video_format_get_row_stride (format, 0, width); + + y = (sdtv) ? yuv_sdtv_colors_Y[fill_type] : yuv_hdtv_colors_Y[fill_type]; + u = (sdtv) ? yuv_sdtv_colors_U[fill_type] : yuv_hdtv_colors_U[fill_type]; + v = (sdtv) ? yuv_sdtv_colors_V[fill_type] : yuv_hdtv_colors_V[fill_type]; + + width = width + (width % 2); + + if (format == GST_VIDEO_FORMAT_YUY2) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j += 2) { + dest[j * 2 + 0] = y; + dest[j * 2 + 1] = u; + dest[j * 2 + 2] = y; + dest[j * 2 + 3] = v; + } + + dest += stride; + } + } else if (format == GST_VIDEO_FORMAT_YVYU) { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j += 2) { + dest[j * 2 + 0] = y; + dest[j * 2 + 1] = v; + dest[j * 2 + 2] = y; + dest[j * 2 + 3] = u; + } + + dest += stride; + } + } else { + for (i = 0; i < height; i++) { + for (j = 0; j < width; j += 2) { + dest[j * 2 + 0] = u; + dest[j * 2 + 1] = y; + dest[j * 2 + 2] = v; + dest[j * 2 + 3] = y; + } + + dest += stride; + } + } +} + +static void +copy_yuy2_yuy2 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, + gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, + gint dest_y, GstVideoFormat src_format, const guint8 * src, + gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, + gint w, gint h) +{ + gint i, j; + gint src_stride, dest_stride; + + src_stride = gst_video_format_get_row_stride (src_format, 0, src_width); + dest_stride = gst_video_format_get_row_stride (dest_format, 0, dest_width); + + dest_x = (dest_x & ~1); + src_x = (src_x & ~1); + + w = w + (w % 2); + + dest = dest + dest_y * dest_stride + dest_x * 2; + src = src + src_y * src_stride + src_x * 2; + + if (src_sdtv != dest_sdtv) { + gint y1, u1, v1; + gint y2, u2, v2; + gint matrix[12]; + + memcpy (matrix, + dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : + cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); + + if (src_format == GST_VIDEO_FORMAT_YUY2) { + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 2) { + y1 = src[j * 2 + 0]; + y2 = src[j * 2 + 2]; + u1 = u2 = src[j * 2 + 1]; + v1 = v2 = src[j * 2 + 3]; + + dest[j * 2 + 0] = APPLY_MATRIX (matrix, 0, y1, u1, v1); + dest[j * 2 + 1] = APPLY_MATRIX (matrix, 1, y1, u1, v1); + dest[j * 2 + 2] = APPLY_MATRIX (matrix, 0, y1, u2, v2); + dest[j * 2 + 3] = APPLY_MATRIX (matrix, 2, y2, u2, v2); + } + dest += dest_stride; + src += src_stride; + } + } else if (src_format == GST_VIDEO_FORMAT_YVYU) { + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 2) { + y1 = src[j * 2 + 0]; + y2 = src[j * 2 + 2]; + v1 = v2 = src[j * 2 + 1]; + u1 = u2 = src[j * 2 + 3]; + + dest[j * 2 + 0] = APPLY_MATRIX (matrix, 0, y1, u1, v1); + dest[j * 2 + 1] = APPLY_MATRIX (matrix, 2, y1, u1, v1); + dest[j * 2 + 2] = APPLY_MATRIX (matrix, 0, y1, u2, v2); + dest[j * 2 + 3] = APPLY_MATRIX (matrix, 1, y2, u2, v2); + } + dest += dest_stride; + src += src_stride; + } + } else { + for (i = 0; i < h; i++) { + for (j = 0; j < w; j += 2) { + u1 = u2 = src[j * 2 + 0]; + v1 = v2 = src[j * 2 + 2]; + y1 = src[j * 2 + 1]; + y2 = src[j * 2 + 3]; + + dest[j * 2 + 1] = APPLY_MATRIX (matrix, 0, y1, u1, v1); + dest[j * 2 + 0] = APPLY_MATRIX (matrix, 1, y1, u1, v1); + dest[j * 2 + 3] = APPLY_MATRIX (matrix, 0, y1, u2, v2); + dest[j * 2 + 2] = APPLY_MATRIX (matrix, 2, y2, u2, v2); + } + dest += dest_stride; + src += src_stride; + } + } + } else { + for (i = 0; i < h; i++) { + memcpy (dest, src, w * 2); + dest += dest_stride; + src += src_stride; + } + } +} + +#define DEFAULT_LEFT 0 +#define DEFAULT_RIGHT 0 +#define DEFAULT_TOP 0 +#define DEFAULT_BOTTOM 0 +#define DEFAULT_FILL_TYPE VIDEO_BOX_FILL_BLACK +#define DEFAULT_ALPHA 1.0 +#define DEFAULT_BORDER_ALPHA 1.0 + +enum +{ + PROP_0, + PROP_LEFT, + PROP_RIGHT, + PROP_TOP, + PROP_BOTTOM, + PROP_FILL_TYPE, + PROP_ALPHA, + PROP_BORDER_ALPHA, + PROP_AUTOCROP + /* FILL ME */ +}; + +static GstStaticPadTemplate gst_video_box_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("Y41B") ";" + GST_VIDEO_CAPS_GRAY8 ";" + GST_VIDEO_CAPS_GRAY16 ("BIG_ENDIAN") ";" + GST_VIDEO_CAPS_GRAY16 ("LITTLE_ENDIAN")) + ); + +static GstStaticPadTemplate gst_video_box_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("Y41B") ";" + GST_VIDEO_CAPS_GRAY8 ";" + GST_VIDEO_CAPS_GRAY16 ("BIG_ENDIAN") ";" + GST_VIDEO_CAPS_GRAY16 ("LITTLE_ENDIAN")) + ); + +GST_BOILERPLATE (GstVideoBox, gst_video_box, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void gst_video_box_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_video_box_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_video_box_recalc_transform (GstVideoBox * video_box); +static GstCaps *gst_video_box_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * from); +static gboolean gst_video_box_set_caps (GstBaseTransform * trans, + GstCaps * in, GstCaps * out); +static gboolean gst_video_box_get_unit_size (GstBaseTransform * trans, + GstCaps * caps, guint * size); +static GstFlowReturn gst_video_box_transform (GstBaseTransform * trans, + GstBuffer * in, GstBuffer * out); +static void gst_video_box_before_transform (GstBaseTransform * trans, + GstBuffer * in); +static void gst_video_box_fixate_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); +static gboolean gst_video_box_src_event (GstBaseTransform * trans, + GstEvent * event); + +#define GST_TYPE_VIDEO_BOX_FILL (gst_video_box_fill_get_type()) +static GType +gst_video_box_fill_get_type (void) +{ + static GType video_box_fill_type = 0; + static const GEnumValue video_box_fill[] = { + {VIDEO_BOX_FILL_BLACK, "Black", "black"}, + {VIDEO_BOX_FILL_GREEN, "Green", "green"}, + {VIDEO_BOX_FILL_BLUE, "Blue", "blue"}, + {VIDEO_BOX_FILL_RED, "Red", "red"}, + {VIDEO_BOX_FILL_YELLOW, "Yellow", "yellow"}, + {VIDEO_BOX_FILL_WHITE, "White", "white"}, + {0, NULL, NULL}, + }; + + if (!video_box_fill_type) { + video_box_fill_type = + g_enum_register_static ("GstVideoBoxFill", video_box_fill); + } + return video_box_fill_type; +} + + +static void +gst_video_box_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Video box filter", + "Filter/Effect/Video", + "Resizes a video by adding borders or cropping", + "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &gst_video_box_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_video_box_src_template); +} + +static void +gst_video_box_finalize (GObject * object) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (object); + + if (video_box->mutex) { + g_mutex_free (video_box->mutex); + video_box->mutex = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_video_box_class_init (GstVideoBoxClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_video_box_set_property; + gobject_class->get_property = gst_video_box_get_property; + gobject_class->finalize = gst_video_box_finalize; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FILL_TYPE, + g_param_spec_enum ("fill", "Fill", "How to fill the borders", + GST_TYPE_VIDEO_BOX_FILL, DEFAULT_FILL_TYPE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LEFT, + g_param_spec_int ("left", "Left", + "Pixels to box at left (<0 = add a border)", G_MININT, G_MAXINT, + DEFAULT_LEFT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_RIGHT, + g_param_spec_int ("right", "Right", + "Pixels to box at right (<0 = add a border)", G_MININT, G_MAXINT, + DEFAULT_RIGHT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TOP, + g_param_spec_int ("top", "Top", + "Pixels to box at top (<0 = add a border)", G_MININT, G_MAXINT, + DEFAULT_TOP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BOTTOM, + g_param_spec_int ("bottom", "Bottom", + "Pixels to box at bottom (<0 = add a border)", G_MININT, G_MAXINT, + DEFAULT_BOTTOM, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ALPHA, + g_param_spec_double ("alpha", "Alpha", "Alpha value picture", 0.0, 1.0, + DEFAULT_ALPHA, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BORDER_ALPHA, + g_param_spec_double ("border-alpha", "Border Alpha", + "Alpha value of the border", 0.0, 1.0, DEFAULT_BORDER_ALPHA, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + /** + * GstVideoBox:autocrop + * + * If set to %TRUE videobox will automatically crop/pad the input + * video to be centered in the output. + * + * Since: 0.10.16 + **/ + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_AUTOCROP, + g_param_spec_boolean ("autocrop", "Auto crop", + "Auto crop", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->transform = GST_DEBUG_FUNCPTR (gst_video_box_transform); + trans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_video_box_before_transform); + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_video_box_transform_caps); + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_box_set_caps); + trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_video_box_get_unit_size); + trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_video_box_fixate_caps); + trans_class->src_event = GST_DEBUG_FUNCPTR (gst_video_box_src_event); +} + +static void +gst_video_box_init (GstVideoBox * video_box, GstVideoBoxClass * g_class) +{ + video_box->box_right = DEFAULT_RIGHT; + video_box->box_left = DEFAULT_LEFT; + video_box->box_top = DEFAULT_TOP; + video_box->box_bottom = DEFAULT_BOTTOM; + video_box->crop_right = 0; + video_box->crop_left = 0; + video_box->crop_top = 0; + video_box->crop_bottom = 0; + video_box->fill_type = DEFAULT_FILL_TYPE; + video_box->alpha = DEFAULT_ALPHA; + video_box->border_alpha = DEFAULT_BORDER_ALPHA; + video_box->autocrop = FALSE; + + video_box->mutex = g_mutex_new (); +} + +static void +gst_video_box_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (object); + + g_mutex_lock (video_box->mutex); + switch (prop_id) { + case PROP_LEFT: + video_box->box_left = g_value_get_int (value); + if (video_box->box_left < 0) { + video_box->border_left = -video_box->box_left; + video_box->crop_left = 0; + } else { + video_box->border_left = 0; + video_box->crop_left = video_box->box_left; + } + break; + case PROP_RIGHT: + video_box->box_right = g_value_get_int (value); + if (video_box->box_right < 0) { + video_box->border_right = -video_box->box_right; + video_box->crop_right = 0; + } else { + video_box->border_right = 0; + video_box->crop_right = video_box->box_right; + } + break; + case PROP_TOP: + video_box->box_top = g_value_get_int (value); + if (video_box->box_top < 0) { + video_box->border_top = -video_box->box_top; + video_box->crop_top = 0; + } else { + video_box->border_top = 0; + video_box->crop_top = video_box->box_top; + } + break; + case PROP_BOTTOM: + video_box->box_bottom = g_value_get_int (value); + if (video_box->box_bottom < 0) { + video_box->border_bottom = -video_box->box_bottom; + video_box->crop_bottom = 0; + } else { + video_box->border_bottom = 0; + video_box->crop_bottom = video_box->box_bottom; + } + break; + case PROP_FILL_TYPE: + video_box->fill_type = g_value_get_enum (value); + break; + case PROP_ALPHA: + video_box->alpha = g_value_get_double (value); + break; + case PROP_BORDER_ALPHA: + video_box->border_alpha = g_value_get_double (value); + break; + case PROP_AUTOCROP: + video_box->autocrop = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + gst_video_box_recalc_transform (video_box); + + GST_DEBUG_OBJECT (video_box, "Calling reconfigure"); + gst_base_transform_reconfigure (GST_BASE_TRANSFORM_CAST (video_box)); + + g_mutex_unlock (video_box->mutex); +} + +static void +gst_video_box_autocrop (GstVideoBox * video_box) +{ + gint crop_w = video_box->in_width - video_box->out_width; + gint crop_h = video_box->in_height - video_box->out_height; + + video_box->box_left = crop_w / 2; + if (video_box->box_left < 0) { + video_box->border_left = -video_box->box_left; + video_box->crop_left = 0; + } else { + video_box->border_left = 0; + video_box->crop_left = video_box->box_left; + } + + /* Round down/up for odd width differences */ + if (crop_w < 0) + crop_w -= 1; + else + crop_w += 1; + + video_box->box_right = crop_w / 2; + if (video_box->box_right < 0) { + video_box->border_right = -video_box->box_right; + video_box->crop_right = 0; + } else { + video_box->border_right = 0; + video_box->crop_right = video_box->box_right; + } + + video_box->box_top = crop_h / 2; + if (video_box->box_top < 0) { + video_box->border_top = -video_box->box_top; + video_box->crop_top = 0; + } else { + video_box->border_top = 0; + video_box->crop_top = video_box->box_top; + } + + /* Round down/up for odd height differences */ + if (crop_h < 0) + crop_h -= 1; + else + crop_h += 1; + video_box->box_bottom = crop_h / 2; + + if (video_box->box_bottom < 0) { + video_box->border_bottom = -video_box->box_bottom; + video_box->crop_bottom = 0; + } else { + video_box->border_bottom = 0; + video_box->crop_bottom = video_box->box_bottom; + } +} + +static void +gst_video_box_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (object); + + switch (prop_id) { + case PROP_LEFT: + g_value_set_int (value, video_box->box_left); + break; + case PROP_RIGHT: + g_value_set_int (value, video_box->box_right); + break; + case PROP_TOP: + g_value_set_int (value, video_box->box_top); + break; + case PROP_BOTTOM: + g_value_set_int (value, video_box->box_bottom); + break; + case PROP_FILL_TYPE: + g_value_set_enum (value, video_box->fill_type); + break; + case PROP_ALPHA: + g_value_set_double (value, video_box->alpha); + break; + case PROP_BORDER_ALPHA: + g_value_set_double (value, video_box->border_alpha); + break; + case PROP_AUTOCROP: + g_value_set_boolean (value, video_box->autocrop); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static inline gint +gst_video_box_transform_dimension (gint val, gint delta) +{ + gint64 new_val = (gint64) val + (gint64) delta; + + new_val = CLAMP (new_val, 1, G_MAXINT); + + return (gint) new_val; +} + +static gboolean +gst_video_box_transform_dimension_value (const GValue * src_val, + gint delta, GValue * dest_val) +{ + gboolean ret = TRUE; + + g_value_init (dest_val, G_VALUE_TYPE (src_val)); + + if (G_VALUE_HOLDS_INT (src_val)) { + gint ival = g_value_get_int (src_val); + + ival = gst_video_box_transform_dimension (ival, delta); + g_value_set_int (dest_val, ival); + } else if (GST_VALUE_HOLDS_INT_RANGE (src_val)) { + gint min = gst_value_get_int_range_min (src_val); + gint max = gst_value_get_int_range_max (src_val); + + min = gst_video_box_transform_dimension (min, delta); + max = gst_video_box_transform_dimension (max, delta); + if (min > max) { + ret = FALSE; + g_value_unset (dest_val); + } else { + gst_value_set_int_range (dest_val, min, max); + } + } else if (GST_VALUE_HOLDS_LIST (src_val)) { + gint i; + + for (i = 0; i < gst_value_list_get_size (src_val); ++i) { + const GValue *list_val; + GValue newval = { 0, }; + + list_val = gst_value_list_get_value (src_val, i); + if (gst_video_box_transform_dimension_value (list_val, delta, &newval)) + gst_value_list_append_value (dest_val, &newval); + g_value_unset (&newval); + } + + if (gst_value_list_get_size (dest_val) == 0) { + g_value_unset (dest_val); + ret = FALSE; + } + } else { + g_value_unset (dest_val); + ret = FALSE; + } + + return ret; +} + +static GstCaps * +gst_video_box_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * from) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (trans); + GstCaps *to, *ret; + const GstCaps *templ; + const gchar *name; + GstStructure *structure; + GstPad *other; + + to = gst_caps_copy (from); + /* Just to be sure... */ + gst_caps_truncate (to); + structure = gst_caps_get_structure (to, 0); + + /* Transform width/height */ + if (video_box->autocrop) { + gst_structure_remove_field (structure, "width"); + gst_structure_remove_field (structure, "height"); + } else { + gint dw = 0, dh = 0; + const GValue *v; + GValue w_val = { 0, }; + GValue h_val = { 0, }; + + /* calculate width and height */ + if (direction == GST_PAD_SINK) { + dw -= video_box->box_left; + dw -= video_box->box_right; + } else { + dw += video_box->box_left; + dw += video_box->box_right; + } + + if (direction == GST_PAD_SINK) { + dh -= video_box->box_top; + dh -= video_box->box_bottom; + } else { + dh += video_box->box_top; + dh += video_box->box_bottom; + } + + v = gst_structure_get_value (structure, "width"); + if (!gst_video_box_transform_dimension_value (v, dw, &w_val)) { + GST_WARNING_OBJECT (video_box, "could not tranform width value with dw=%d" + ", caps structure=%" GST_PTR_FORMAT, dw, structure); + gst_caps_unref (to); + to = gst_caps_new_empty (); + return to; + } + gst_structure_set_value (structure, "width", &w_val); + + v = gst_structure_get_value (structure, "height"); + if (!gst_video_box_transform_dimension_value (v, dh, &h_val)) { + g_value_unset (&w_val); + GST_WARNING_OBJECT (video_box, + "could not tranform height value with dh=%d" ", caps structure=%" + GST_PTR_FORMAT, dh, structure); + gst_caps_unref (to); + to = gst_caps_new_empty (); + return to; + } + gst_structure_set_value (structure, "height", &h_val); + g_value_unset (&w_val); + g_value_unset (&h_val); + } + + /* Supported conversions: + * I420->AYUV + * I420->YV12 + * YV12->AYUV + * YV12->I420 + * AYUV->I420 + * AYUV->YV12 + * AYUV->xRGB (24bpp, 32bpp, incl. alpha) + * xRGB->xRGB (24bpp, 32bpp, from/to all variants, incl. alpha) + * xRGB->AYUV (24bpp, 32bpp, incl. alpha) + * + * Passthrough only for everything else. + */ + name = gst_structure_get_name (structure); + if (g_str_equal (name, "video/x-raw-yuv")) { + guint32 fourcc; + + if (gst_structure_get_fourcc (structure, "format", &fourcc) && + (fourcc == GST_STR_FOURCC ("AYUV") || + fourcc == GST_STR_FOURCC ("I420") || + fourcc == GST_STR_FOURCC ("YV12"))) { + GValue list = { 0, }; + GValue val = { 0, }; + GstStructure *s2; + + /* get rid of format */ + gst_structure_remove_field (structure, "format"); + gst_structure_remove_field (structure, "color-matrix"); + gst_structure_remove_field (structure, "chroma-site"); + + s2 = gst_structure_copy (structure); + + g_value_init (&list, GST_TYPE_LIST); + g_value_init (&val, GST_TYPE_FOURCC); + gst_value_set_fourcc (&val, GST_STR_FOURCC ("AYUV")); + gst_value_list_append_value (&list, &val); + g_value_reset (&val); + gst_value_set_fourcc (&val, GST_STR_FOURCC ("I420")); + gst_value_list_append_value (&list, &val); + g_value_reset (&val); + gst_value_set_fourcc (&val, GST_STR_FOURCC ("YV12")); + gst_value_list_append_value (&list, &val); + g_value_unset (&val); + gst_structure_set_value (structure, "format", &list); + g_value_unset (&list); + + /* We can only convert to RGB if input is AYUV */ + if (fourcc == GST_STR_FOURCC ("AYUV")) { + gst_structure_set_name (s2, "video/x-raw-rgb"); + g_value_init (&list, GST_TYPE_LIST); + g_value_init (&val, G_TYPE_INT); + g_value_set_int (&val, 32); + gst_value_list_append_value (&list, &val); + g_value_reset (&val); + g_value_set_int (&val, 24); + gst_value_list_append_value (&list, &val); + g_value_unset (&val); + gst_structure_set_value (s2, "depth", &list); + gst_structure_set_value (s2, "bpp", &list); + g_value_unset (&list); + gst_caps_append_structure (to, s2); + } else { + gst_structure_free (s2); + } + } + } else if (g_str_equal (name, "video/x-raw-rgb")) { + gint bpp; + + if (gst_structure_get_int (structure, "bpp", &bpp) && + (bpp == 32 || bpp == 24)) { + GValue list = { 0, }; + GValue val = { 0, }; + GstStructure *s2; + + /* get rid of format */ + gst_structure_remove_field (structure, "depth"); + gst_structure_remove_field (structure, "bpp"); + gst_structure_remove_field (structure, "red_mask"); + gst_structure_remove_field (structure, "green_mask"); + gst_structure_remove_field (structure, "blue_mask"); + gst_structure_remove_field (structure, "alpha_mask"); + + s2 = gst_structure_copy (structure); + + g_value_init (&list, GST_TYPE_LIST); + g_value_init (&val, G_TYPE_INT); + g_value_set_int (&val, 32); + gst_value_list_append_value (&list, &val); + g_value_reset (&val); + g_value_set_int (&val, 24); + gst_value_list_append_value (&list, &val); + g_value_unset (&val); + gst_structure_set_value (structure, "depth", &list); + gst_structure_set_value (structure, "bpp", &list); + g_value_unset (&list); + + gst_structure_set_name (s2, "video/x-raw-yuv"); + gst_structure_set (s2, "format", GST_TYPE_FOURCC, GST_STR_FOURCC ("AYUV"), + NULL); + gst_caps_append_structure (to, s2); + } + } + + /* filter against set allowed caps on the pad */ + other = (direction == GST_PAD_SINK) ? trans->srcpad : trans->sinkpad; + + templ = gst_pad_get_pad_template_caps (other); + ret = gst_caps_intersect (to, templ); + gst_caps_unref (to); + + GST_DEBUG_OBJECT (video_box, "direction %d, transformed %" GST_PTR_FORMAT + " to %" GST_PTR_FORMAT, direction, from, ret); + + return ret; +} + +static gboolean +gst_video_box_recalc_transform (GstVideoBox * video_box) +{ + gboolean res = TRUE; + + /* if we have the same format in and out and we don't need to perform any + * cropping at all, we can just operate in passthrough mode */ + if (video_box->in_format == video_box->out_format && + video_box->box_left == 0 && video_box->box_right == 0 && + video_box->box_top == 0 && video_box->box_bottom == 0 && + video_box->in_sdtv == video_box->out_sdtv) { + + GST_LOG_OBJECT (video_box, "we are using passthrough"); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM_CAST (video_box), + TRUE); + } else { + GST_LOG_OBJECT (video_box, "we are not using passthrough"); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM_CAST (video_box), + FALSE); + } + return res; +} + +static gboolean +gst_video_box_select_processing_functions (GstVideoBox * video_box) +{ + switch (video_box->out_format) { + case GST_VIDEO_FORMAT_AYUV: + video_box->fill = fill_ayuv; + switch (video_box->in_format) { + case GST_VIDEO_FORMAT_AYUV: + video_box->copy = copy_ayuv_ayuv; + break; + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + video_box->copy = copy_i420_ayuv; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + video_box->copy = copy_rgb32_ayuv; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + video_box->fill = fill_planar_yuv; + switch (video_box->in_format) { + case GST_VIDEO_FORMAT_AYUV: + video_box->copy = copy_ayuv_i420; + break; + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + video_box->copy = copy_i420_i420; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + video_box->fill = (video_box->out_format == GST_VIDEO_FORMAT_BGR + || video_box->out_format == + GST_VIDEO_FORMAT_RGB) ? fill_rgb24 : fill_rgb32; + switch (video_box->in_format) { + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + video_box->copy = copy_rgb32; + break; + case GST_VIDEO_FORMAT_AYUV: + video_box->copy = copy_ayuv_rgb32; + default: + break; + } + break; + case GST_VIDEO_FORMAT_GRAY8: + case GST_VIDEO_FORMAT_GRAY16_BE: + case GST_VIDEO_FORMAT_GRAY16_LE: + video_box->fill = fill_gray; + switch (video_box->in_format) { + case GST_VIDEO_FORMAT_GRAY8: + case GST_VIDEO_FORMAT_GRAY16_BE: + case GST_VIDEO_FORMAT_GRAY16_LE: + video_box->copy = copy_packed_simple; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_YVYU: + case GST_VIDEO_FORMAT_UYVY: + video_box->fill = fill_yuy2; + switch (video_box->in_format) { + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_YVYU: + case GST_VIDEO_FORMAT_UYVY: + video_box->copy = copy_yuy2_yuy2; + break; + default: + break; + } + break; + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_Y41B: + video_box->fill = fill_planar_yuv; + switch (video_box->in_format) { + case GST_VIDEO_FORMAT_Y444: + video_box->copy = copy_y444_y444; + break; + case GST_VIDEO_FORMAT_Y42B: + video_box->copy = copy_y42b_y42b; + break; + case GST_VIDEO_FORMAT_Y41B: + video_box->copy = copy_y41b_y41b; + break; + default: + break; + } + break; + default: + break; + } + + return video_box->fill != NULL && video_box->copy != NULL; +} + +static gboolean +gst_video_box_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (trans); + gboolean ret; + const gchar *matrix; + + g_mutex_lock (video_box->mutex); + + ret = + gst_video_format_parse_caps (in, &video_box->in_format, + &video_box->in_width, &video_box->in_height); + ret &= + gst_video_format_parse_caps (out, &video_box->out_format, + &video_box->out_width, &video_box->out_height); + + matrix = gst_video_parse_caps_color_matrix (in); + video_box->in_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; + matrix = gst_video_parse_caps_color_matrix (out); + video_box->out_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; + + /* something wrong getting the caps */ + if (!ret) + goto no_caps; + + GST_DEBUG_OBJECT (trans, "Input w: %d h: %d", video_box->in_width, + video_box->in_height); + GST_DEBUG_OBJECT (trans, "Output w: %d h: %d", video_box->out_width, + video_box->out_height); + + if (video_box->autocrop) + gst_video_box_autocrop (video_box); + + /* recalc the transformation strategy */ + ret = gst_video_box_recalc_transform (video_box); + + if (ret) + ret = gst_video_box_select_processing_functions (video_box); + g_mutex_unlock (video_box->mutex); + + return ret; + + /* ERRORS */ +no_caps: + { + GST_DEBUG_OBJECT (video_box, + "Invalid caps: %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, in, out); + g_mutex_unlock (video_box->mutex); + return FALSE; + } +} + +static gboolean +gst_video_box_get_unit_size (GstBaseTransform * trans, GstCaps * caps, + guint * size) +{ + GstVideoFormat format; + gint width, height; + gboolean ret; + + g_assert (size); + + ret = gst_video_format_parse_caps (caps, &format, &width, &height); + if (!ret) { + GST_ERROR_OBJECT (trans, "Invalid caps: %" GST_PTR_FORMAT, caps); + return FALSE; + } + + *size = gst_video_format_get_size (format, width, height); + + GST_LOG_OBJECT (trans, "Returning from _unit_size %d", *size); + + return TRUE; +} + +static void +gst_video_box_fixate_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) +{ + gint width, height; + GstStructure *s; + gboolean ret; + + ret = gst_video_format_parse_caps (caps, NULL, &width, &height); + if (!ret) + return; + + s = gst_caps_get_structure (othercaps, 0); + gst_structure_fixate_field_nearest_int (s, "width", width); + gst_structure_fixate_field_nearest_int (s, "height", height); +} + +static gboolean +gst_video_box_src_event (GstBaseTransform * trans, GstEvent * event) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (trans); + GstStructure *new_structure; + const GstStructure *structure; + const gchar *event_name; + gdouble pointer_x; + gdouble pointer_y; + + GST_OBJECT_LOCK (video_box); + if (GST_EVENT_TYPE (event) == GST_EVENT_NAVIGATION && + (video_box->box_left != 0 || video_box->box_top != 0)) { + structure = gst_event_get_structure (event); + event_name = gst_structure_get_string (structure, "event"); + + if (event_name && + (strcmp (event_name, "mouse-move") == 0 || + strcmp (event_name, "mouse-button-press") == 0 || + strcmp (event_name, "mouse-button-release") == 0)) { + if (gst_structure_get_double (structure, "pointer_x", &pointer_x) && + gst_structure_get_double (structure, "pointer_y", &pointer_y)) { + gdouble new_pointer_x, new_pointer_y; + GstEvent *new_event; + + new_pointer_x = pointer_x + video_box->box_left; + new_pointer_y = pointer_y + video_box->box_top; + + new_structure = gst_structure_copy (structure); + gst_structure_set (new_structure, + "pointer_x", G_TYPE_DOUBLE, (gdouble) (new_pointer_x), + "pointer_y", G_TYPE_DOUBLE, (gdouble) (new_pointer_y), NULL); + + new_event = gst_event_new_navigation (new_structure); + gst_event_unref (event); + event = new_event; + } else { + GST_WARNING_OBJECT (video_box, "Failed to read navigation event"); + } + } + } + GST_OBJECT_UNLOCK (video_box); + + return GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, event); +} + +static void +gst_video_box_process (GstVideoBox * video_box, const guint8 * src, + guint8 * dest) +{ + guint b_alpha = CLAMP (video_box->border_alpha * 256, 0, 255); + guint i_alpha = CLAMP (video_box->alpha * 256, 0, 255); + GstVideoBoxFill fill_type = video_box->fill_type; + gint br, bl, bt, bb, crop_w, crop_h; + + crop_h = 0; + crop_w = 0; + + br = video_box->box_right; + bl = video_box->box_left; + bt = video_box->box_top; + bb = video_box->box_bottom; + + if (br >= 0 && bl >= 0) { + crop_w = video_box->in_width - (br + bl); + } else if (br >= 0 && bl < 0) { + crop_w = video_box->in_width - (br); + } else if (br < 0 && bl >= 0) { + crop_w = video_box->in_width - (bl); + } else if (br < 0 && bl < 0) { + crop_w = video_box->in_width; + } + + if (bb >= 0 && bt >= 0) { + crop_h = video_box->in_height - (bb + bt); + } else if (bb >= 0 && bt < 0) { + crop_h = video_box->in_height - (bb); + } else if (bb < 0 && bt >= 0) { + crop_h = video_box->in_height - (bt); + } else if (bb < 0 && bt < 0) { + crop_h = video_box->in_height; + } + + GST_DEBUG_OBJECT (video_box, "Borders are: L:%d, R:%d, T:%d, B:%d", bl, br, + bt, bb); + GST_DEBUG_OBJECT (video_box, "Alpha value is: %u (frame) %u (border)", + i_alpha, b_alpha); + + if (crop_h < 0 || crop_w < 0) { + video_box->fill (fill_type, b_alpha, video_box->out_format, dest, + video_box->out_sdtv, video_box->out_width, video_box->out_height); + } else if (bb == 0 && bt == 0 && br == 0 && bl == 0) { + video_box->copy (i_alpha, video_box->out_format, dest, video_box->out_sdtv, + video_box->out_width, video_box->out_height, 0, 0, video_box->in_format, + src, video_box->in_sdtv, video_box->in_width, video_box->in_height, 0, + 0, crop_w, crop_h); + } else { + gint src_x = 0, src_y = 0; + gint dest_x = 0, dest_y = 0; + + /* Fill everything if a border should be added somewhere */ + if (bt < 0 || bb < 0 || br < 0 || bl < 0) + video_box->fill (fill_type, b_alpha, video_box->out_format, dest, + video_box->out_sdtv, video_box->out_width, video_box->out_height); + + /* Top border */ + if (bt < 0) { + dest_y += -bt; + } else { + src_y += bt; + } + + /* Left border */ + if (bl < 0) { + dest_x += -bl; + } else { + src_x += bl; + } + + /* Frame */ + video_box->copy (i_alpha, video_box->out_format, dest, video_box->out_sdtv, + video_box->out_width, video_box->out_height, dest_x, dest_y, + video_box->in_format, src, video_box->in_sdtv, video_box->in_width, + video_box->in_height, src_x, src_y, crop_w, crop_h); + } + + GST_LOG_OBJECT (video_box, "image created"); +} + +static void +gst_video_box_before_transform (GstBaseTransform * trans, GstBuffer * in) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (trans); + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (video_box, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (video_box), stream_time); +} + +static GstFlowReturn +gst_video_box_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstVideoBox *video_box = GST_VIDEO_BOX (trans); + const guint8 *indata; + guint8 *outdata; + + indata = GST_BUFFER_DATA (in); + outdata = GST_BUFFER_DATA (out); + + g_mutex_lock (video_box->mutex); + gst_video_box_process (video_box, indata, outdata); + g_mutex_unlock (video_box->mutex); + return GST_FLOW_OK; +} + +/* FIXME: 0.11 merge with videocrop plugin */ +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_controller_init (NULL, NULL); + + GST_DEBUG_CATEGORY_INIT (videobox_debug, "videobox", 0, + "Resizes a video by adding borders or cropping"); + + return gst_element_register (plugin, "videobox", GST_RANK_NONE, + GST_TYPE_VIDEO_BOX); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videobox", + "resizes a video by adding borders or cropping", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/videobox/gstvideobox.h b/gst/videobox/gstvideobox.h new file mode 100644 index 0000000..f85f216 --- /dev/null +++ b/gst/videobox/gstvideobox.h @@ -0,0 +1,92 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 +#include +#include + +#ifndef __GST_VIDEO_BOX_H__ +#define __GST_VIDEO_BOX_H__ + +#define GST_TYPE_VIDEO_BOX \ + (gst_video_box_get_type()) +#define GST_VIDEO_BOX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_BOX,GstVideoBox)) +#define GST_VIDEO_BOX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_BOX,GstVideoBoxClass)) +#define GST_IS_VIDEO_BOX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_BOX)) +#define GST_IS_VIDEO_BOX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_BOX)) + +typedef struct _GstVideoBox GstVideoBox; +typedef struct _GstVideoBoxClass GstVideoBoxClass; + +typedef enum +{ + VIDEO_BOX_FILL_BLACK, + VIDEO_BOX_FILL_GREEN, + VIDEO_BOX_FILL_BLUE, + VIDEO_BOX_FILL_RED, + VIDEO_BOX_FILL_YELLOW, + VIDEO_BOX_FILL_WHITE, + VIDEO_BOX_FILL_LAST +} +GstVideoBoxFill; + +struct _GstVideoBox +{ + GstBaseTransform element; + + /* */ + + /* Guarding everything below */ + GMutex *mutex; + /* caps */ + GstVideoFormat in_format; + gint in_width, in_height; + gboolean in_sdtv; + GstVideoFormat out_format; + gint out_width, out_height; + gboolean out_sdtv; + + gint box_left, box_right, box_top, box_bottom; + + gint border_left, border_right, border_top, border_bottom; + gint crop_left, crop_right, crop_top, crop_bottom; + + gdouble alpha; + gdouble border_alpha; + + GstVideoBoxFill fill_type; + + gboolean autocrop; + + void (*fill) (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, guint8 *dest, gboolean sdtv, gint width, gint height); + void (*copy) (guint i_alpha, GstVideoFormat dest_format, guint8 *dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 *src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h); +}; + +struct _GstVideoBoxClass +{ + GstBaseTransformClass parent_class; +}; + +GType gst_video_box_get_type (void); + +#endif /* __GST_VIDEO_BOX_H__ */ diff --git a/gst/videobox/gstvideoboxorc-dist.c b/gst/videobox/gstvideoboxorc-dist.c new file mode 100644 index 0000000..1e00246 --- /dev/null +++ b/gst/videobox/gstvideoboxorc-dist.c @@ -0,0 +1,215 @@ + +/* autogenerated from gstvideoboxorc.orc */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#ifndef _ORC_INTEGER_TYPEDEFS_ +#define _ORC_INTEGER_TYPEDEFS_ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +typedef int8_t orc_int8; +typedef int16_t orc_int16; +typedef int32_t orc_int32; +typedef int64_t orc_int64; +typedef uint8_t orc_uint8; +typedef uint16_t orc_uint16; +typedef uint32_t orc_uint32; +typedef uint64_t orc_uint64; +#define ORC_UINT64_C(x) UINT64_C(x) +#elif defined(_MSC_VER) +typedef signed __int8 orc_int8; +typedef signed __int16 orc_int16; +typedef signed __int32 orc_int32; +typedef signed __int64 orc_int64; +typedef unsigned __int8 orc_uint8; +typedef unsigned __int16 orc_uint16; +typedef unsigned __int32 orc_uint32; +typedef unsigned __int64 orc_uint64; +#define ORC_UINT64_C(x) (x##Ui64) +#define inline __inline +#else +#include +typedef signed char orc_int8; +typedef short orc_int16; +typedef int orc_int32; +typedef unsigned char orc_uint8; +typedef unsigned short orc_uint16; +typedef unsigned int orc_uint32; +#if INT_MAX == LONG_MAX +typedef long long orc_int64; +typedef unsigned long long orc_uint64; +#define ORC_UINT64_C(x) (x##ULL) +#else +typedef long orc_int64; +typedef unsigned long orc_uint64; +#define ORC_UINT64_C(x) (x##UL) +#endif +#endif +typedef union +{ + orc_int16 i; + orc_int8 x2[2]; +} orc_union16; +typedef union +{ + orc_int32 i; + float f; + orc_int16 x2[2]; + orc_int8 x4[4]; +} orc_union32; +typedef union +{ + orc_int64 i; + double f; + orc_int32 x2[2]; + float x2f[2]; + orc_int16 x4[4]; +} orc_union64; +#endif +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif + +#ifndef DISABLE_ORC +#include +#endif +void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n); + + +/* begin Orc C target preamble */ +#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) +#define ORC_ABS(a) ((a)<0 ? -(a) : (a)) +#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) +#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) +#define ORC_SB_MAX 127 +#define ORC_SB_MIN (-1-ORC_SB_MAX) +#define ORC_UB_MAX 255 +#define ORC_UB_MIN 0 +#define ORC_SW_MAX 32767 +#define ORC_SW_MIN (-1-ORC_SW_MAX) +#define ORC_UW_MAX 65535 +#define ORC_UW_MIN 0 +#define ORC_SL_MAX 2147483647 +#define ORC_SL_MIN (-1-ORC_SL_MAX) +#define ORC_UL_MAX 4294967295U +#define ORC_UL_MIN 0 +#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) +#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) +#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) +#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) +#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) +#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) +#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) +#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) +#define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56)) +#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) +#define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff)) +#define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0)) +#define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff))) +#define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0)) +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif +/* end Orc C target preamble */ + + + +/* orc_splat_u32 */ +#ifdef DISABLE_ORC +void +orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n) +{ + int i; + orc_union32 *ORC_RESTRICT ptr0; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (orc_union32 *) d1; + + /* 0: loadpl */ + var32.i = p1; + + for (i = 0; i < n; i++) { + /* 1: copyl */ + var33.i = var32.i; + /* 2: storel */ + ptr0[i] = var33; + } + +} + +#else +static void +_backup_orc_splat_u32 (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_union32 *ORC_RESTRICT ptr0; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (orc_union32 *) ex->arrays[0]; + + /* 0: loadpl */ + var32.i = ex->params[24]; + + for (i = 0; i < n; i++) { + /* 1: copyl */ + var33.i = var32.i; + /* 2: storel */ + ptr0[i] = var33; + } + +} + +void +orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "orc_splat_u32"); + orc_program_set_backup_function (p, _backup_orc_splat_u32); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_parameter (p, 4, "p1"); + + orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif diff --git a/gst/videobox/gstvideoboxorc-dist.h b/gst/videobox/gstvideoboxorc-dist.h new file mode 100644 index 0000000..1a711a5 --- /dev/null +++ b/gst/videobox/gstvideoboxorc-dist.h @@ -0,0 +1,77 @@ + +/* autogenerated from gstvideoboxorc.orc */ + +#ifndef _GSTVIDEOBOXORC_H_ +#define _GSTVIDEOBOXORC_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + + +#ifndef _ORC_INTEGER_TYPEDEFS_ +#define _ORC_INTEGER_TYPEDEFS_ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +typedef int8_t orc_int8; +typedef int16_t orc_int16; +typedef int32_t orc_int32; +typedef int64_t orc_int64; +typedef uint8_t orc_uint8; +typedef uint16_t orc_uint16; +typedef uint32_t orc_uint32; +typedef uint64_t orc_uint64; +#define ORC_UINT64_C(x) UINT64_C(x) +#elif defined(_MSC_VER) +typedef signed __int8 orc_int8; +typedef signed __int16 orc_int16; +typedef signed __int32 orc_int32; +typedef signed __int64 orc_int64; +typedef unsigned __int8 orc_uint8; +typedef unsigned __int16 orc_uint16; +typedef unsigned __int32 orc_uint32; +typedef unsigned __int64 orc_uint64; +#define ORC_UINT64_C(x) (x##Ui64) +#define inline __inline +#else +#include +typedef signed char orc_int8; +typedef short orc_int16; +typedef int orc_int32; +typedef unsigned char orc_uint8; +typedef unsigned short orc_uint16; +typedef unsigned int orc_uint32; +#if INT_MAX == LONG_MAX +typedef long long orc_int64; +typedef unsigned long long orc_uint64; +#define ORC_UINT64_C(x) (x##ULL) +#else +typedef long orc_int64; +typedef unsigned long orc_uint64; +#define ORC_UINT64_C(x) (x##UL) +#endif +#endif +typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; +typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; +typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; +#endif +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif +void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/gst/videobox/gstvideoboxorc.orc b/gst/videobox/gstvideoboxorc.orc new file mode 100644 index 0000000..30abfb1 --- /dev/null +++ b/gst/videobox/gstvideoboxorc.orc @@ -0,0 +1,7 @@ + +.function orc_splat_u32 +.dest 4 d1 guint32 +.param 4 p1 + +copyl d1, p1 + diff --git a/gst/videocrop/Makefile.am b/gst/videocrop/Makefile.am new file mode 100644 index 0000000..2b9838b --- /dev/null +++ b/gst/videocrop/Makefile.am @@ -0,0 +1,28 @@ +plugin_LTLIBRARIES = libgstvideocrop.la + +# Note: we only use defines from gst/video/video.h, but none +# of the functions, so we don't need to link to libgstvideo + +libgstvideocrop_la_SOURCES = gstvideocrop.c gstaspectratiocrop.c +libgstvideocrop_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) +libgstvideocrop_la_LIBADD = $(GST_BASE_LIBS) +libgstvideocrop_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideocrop_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstvideocrop.h gstaspectratiocrop.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideocrop -:SHARED libgstvideocrop \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideocrop_la_SOURCES) \ + $(nodist_libgstvideocrop_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideocrop_la_CFLAGS) \ + -:LDFLAGS $(libgstvideocrop_la_LDFLAGS) \ + $(libgstvideocrop_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/videocrop/Makefile.in b/gst/videocrop/Makefile.in new file mode 100644 index 0000000..506a237 --- /dev/null +++ b/gst/videocrop/Makefile.in @@ -0,0 +1,833 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/videocrop +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstvideocrop_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libgstvideocrop_la_OBJECTS = libgstvideocrop_la-gstvideocrop.lo \ + libgstvideocrop_la-gstaspectratiocrop.lo +libgstvideocrop_la_OBJECTS = $(am_libgstvideocrop_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstvideocrop_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) \ + $(libgstvideocrop_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstvideocrop_la_SOURCES) +DIST_SOURCES = $(libgstvideocrop_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstvideocrop.la + +# Note: we only use defines from gst/video/video.h, but none +# of the functions, so we don't need to link to libgstvideo +libgstvideocrop_la_SOURCES = gstvideocrop.c gstaspectratiocrop.c +libgstvideocrop_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) + +libgstvideocrop_la_LIBADD = $(GST_BASE_LIBS) +libgstvideocrop_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideocrop_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstvideocrop.h gstaspectratiocrop.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videocrop/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/videocrop/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstvideocrop.la: $(libgstvideocrop_la_OBJECTS) $(libgstvideocrop_la_DEPENDENCIES) $(EXTRA_libgstvideocrop_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstvideocrop_la_LINK) -rpath $(plugindir) $(libgstvideocrop_la_OBJECTS) $(libgstvideocrop_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideocrop_la-gstvideocrop.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstvideocrop_la-gstvideocrop.lo: gstvideocrop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -MT libgstvideocrop_la-gstvideocrop.lo -MD -MP -MF $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Tpo -c -o libgstvideocrop_la-gstvideocrop.lo `test -f 'gstvideocrop.c' || echo '$(srcdir)/'`gstvideocrop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Tpo $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvideocrop.c' object='libgstvideocrop_la-gstvideocrop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -c -o libgstvideocrop_la-gstvideocrop.lo `test -f 'gstvideocrop.c' || echo '$(srcdir)/'`gstvideocrop.c + +libgstvideocrop_la-gstaspectratiocrop.lo: gstaspectratiocrop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -MT libgstvideocrop_la-gstaspectratiocrop.lo -MD -MP -MF $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Tpo -c -o libgstvideocrop_la-gstaspectratiocrop.lo `test -f 'gstaspectratiocrop.c' || echo '$(srcdir)/'`gstaspectratiocrop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Tpo $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstaspectratiocrop.c' object='libgstvideocrop_la-gstaspectratiocrop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -c -o libgstvideocrop_la-gstaspectratiocrop.lo `test -f 'gstaspectratiocrop.c' || echo '$(srcdir)/'`gstaspectratiocrop.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideocrop -:SHARED libgstvideocrop \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideocrop_la_SOURCES) \ + $(nodist_libgstvideocrop_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideocrop_la_CFLAGS) \ + -:LDFLAGS $(libgstvideocrop_la_LDFLAGS) \ + $(libgstvideocrop_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/videocrop/gstaspectratiocrop.c b/gst/videocrop/gstaspectratiocrop.c new file mode 100644 index 0000000..150df37 --- /dev/null +++ b/gst/videocrop/gstaspectratiocrop.c @@ -0,0 +1,453 @@ +/* GStreamer video frame cropping to aspect-ratio + * Copyright (C) 2009 Thijs Vermeir + * + * 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-aspectratiocrop + * @see_also: #GstVideoCrop + * + * This element crops video frames to a specified #GstAspectRatioCrop:aspect-ratio. + * + * If the aspect-ratio is already correct, the element will operate + * in pass-through mode. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! video/x-raw-rgb,height=640,width=480 ! aspectratiocrop aspect-ratio=16/9 ! ximagesink + * ]| This pipeline generates a videostream in 4/3 and crops it to 16/9. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstaspectratiocrop.h" + +#include "gst/glib-compat-private.h" + +GST_DEBUG_CATEGORY_STATIC (aspect_ratio_crop_debug); +#define GST_CAT_DEFAULT aspect_ratio_crop_debug + +enum +{ + ARG_0, + ARG_ASPECT_RATIO_CROP, +}; + +/* we support the same caps as videocrop */ +#define ASPECT_RATIO_CROP_CAPS \ + GST_VIDEO_CAPS_RGBx ";" \ + GST_VIDEO_CAPS_xRGB ";" \ + GST_VIDEO_CAPS_BGRx ";" \ + GST_VIDEO_CAPS_xBGR ";" \ + GST_VIDEO_CAPS_RGBA ";" \ + GST_VIDEO_CAPS_ARGB ";" \ + GST_VIDEO_CAPS_BGRA ";" \ + GST_VIDEO_CAPS_ABGR ";" \ + GST_VIDEO_CAPS_RGB ";" \ + GST_VIDEO_CAPS_BGR ";" \ + GST_VIDEO_CAPS_YUV ("AYUV") ";" \ + GST_VIDEO_CAPS_YUV ("YUY2") ";" \ + GST_VIDEO_CAPS_YUV ("YVYU") ";" \ + GST_VIDEO_CAPS_YUV ("UYVY") ";" \ + GST_VIDEO_CAPS_YUV ("Y800") ";" \ + GST_VIDEO_CAPS_YUV ("I420") ";" \ + GST_VIDEO_CAPS_YUV ("YV12") ";" \ + GST_VIDEO_CAPS_RGB_16 ";" \ + GST_VIDEO_CAPS_RGB_15 + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (ASPECT_RATIO_CROP_CAPS) + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (ASPECT_RATIO_CROP_CAPS) + ); + +GST_BOILERPLATE (GstAspectRatioCrop, gst_aspect_ratio_crop, GstBin, + GST_TYPE_BIN); + +static void gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_aspect_ratio_crop_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_aspect_ratio_crop_set_cropping (GstAspectRatioCrop * + aspect_ratio_crop, gint top, gint right, gint bottom, gint left); +static GstCaps *gst_aspect_ratio_crop_get_caps (GstPad * pad); +static gboolean gst_aspect_ratio_crop_set_caps (GstPad * pad, GstCaps * caps); +static void gst_aspect_ratio_crop_finalize (GObject * object); +static void gst_aspect_ratio_transform_structure (GstAspectRatioCrop * + aspect_ratio_crop, GstStructure * structure, GstStructure ** new_structure, + gboolean set_videocrop); + +static void +gst_aspect_ratio_crop_set_cropping (GstAspectRatioCrop * aspect_ratio_crop, + gint top, gint right, gint bottom, gint left) +{ + GValue value = { 0 }; + if (G_UNLIKELY (!aspect_ratio_crop->videocrop)) { + GST_WARNING_OBJECT (aspect_ratio_crop, + "Can't set the settings if there is no cropping element"); + return; + } + + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, top); + GST_DEBUG_OBJECT (aspect_ratio_crop, "set top cropping to: %d", top); + g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "top", + &value); + g_value_set_int (&value, right); + GST_DEBUG_OBJECT (aspect_ratio_crop, "set right cropping to: %d", right); + g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "right", + &value); + g_value_set_int (&value, bottom); + GST_DEBUG_OBJECT (aspect_ratio_crop, "set bottom cropping to: %d", bottom); + g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "bottom", + &value); + g_value_set_int (&value, left); + GST_DEBUG_OBJECT (aspect_ratio_crop, "set left cropping to: %d", left); + g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "left", + &value); + + g_value_unset (&value); +} + +static gboolean +gst_aspect_ratio_crop_set_caps (GstPad * pad, GstCaps * caps) +{ + GstAspectRatioCrop *aspect_ratio_crop; + GstPad *peer_pad; + GstStructure *structure; + gboolean ret; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); + + g_mutex_lock (aspect_ratio_crop->crop_lock); + + structure = gst_caps_get_structure (caps, 0); + gst_aspect_ratio_transform_structure (aspect_ratio_crop, structure, NULL, + TRUE); + peer_pad = + gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), + "sink"); + ret = gst_pad_set_caps (peer_pad, caps); + gst_object_unref (peer_pad); + gst_object_unref (aspect_ratio_crop); + g_mutex_unlock (aspect_ratio_crop->crop_lock); + return ret; +} + +static void +gst_aspect_ratio_crop_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "aspectratiocrop", + "Filter/Effect/Video", + "Crops video into a user-defined aspect-ratio", + "Thijs Vermeir "); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); +} + +static void +gst_aspect_ratio_crop_class_init (GstAspectRatioCropClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_aspect_ratio_crop_set_property; + gobject_class->get_property = gst_aspect_ratio_crop_get_property; + gobject_class->finalize = gst_aspect_ratio_crop_finalize; + + g_object_class_install_property (gobject_class, ARG_ASPECT_RATIO_CROP, + gst_param_spec_fraction ("aspect-ratio", "aspect-ratio", + "Target aspect-ratio of video", 0, 1, G_MAXINT, 1, 0, 1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_aspect_ratio_crop_finalize (GObject * object) +{ + GstAspectRatioCrop *aspect_ratio_crop; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); + + if (aspect_ratio_crop->crop_lock) + g_mutex_free (aspect_ratio_crop->crop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_aspect_ratio_crop_init (GstAspectRatioCrop * aspect_ratio_crop, + GstAspectRatioCropClass * klass) +{ + GstPad *link_pad; + GstPad *src_pad; + + GST_DEBUG_CATEGORY_INIT (aspect_ratio_crop_debug, "aspectratiocrop", 0, + "aspectratiocrop"); + + aspect_ratio_crop->ar_num = 0; + aspect_ratio_crop->ar_denom = 1; + + aspect_ratio_crop->crop_lock = g_mutex_new (); + + /* add the transform element */ + aspect_ratio_crop->videocrop = gst_element_factory_make ("videocrop", NULL); + gst_bin_add (GST_BIN (aspect_ratio_crop), aspect_ratio_crop->videocrop); + + /* create ghost pad src */ + link_pad = + gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), + "src"); + src_pad = gst_ghost_pad_new ("src", link_pad); + gst_pad_set_getcaps_function (src_pad, + GST_DEBUG_FUNCPTR (gst_aspect_ratio_crop_get_caps)); + gst_element_add_pad (GST_ELEMENT (aspect_ratio_crop), src_pad); + gst_object_unref (link_pad); + /* create ghost pad sink */ + link_pad = + gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), + "sink"); + aspect_ratio_crop->sink = gst_ghost_pad_new ("sink", link_pad); + gst_element_add_pad (GST_ELEMENT (aspect_ratio_crop), + aspect_ratio_crop->sink); + gst_object_unref (link_pad); + gst_pad_set_setcaps_function (aspect_ratio_crop->sink, + GST_DEBUG_FUNCPTR (gst_aspect_ratio_crop_set_caps)); +} + +static void +gst_aspect_ratio_transform_structure (GstAspectRatioCrop * aspect_ratio_crop, + GstStructure * structure, GstStructure ** new_structure, + gboolean set_videocrop) +{ + gdouble incoming_ar; + gdouble requested_ar; + gint width, height; + gint cropvalue; + gint par_d, par_n; + + /* Check if we need to change the aspect ratio */ + if (aspect_ratio_crop->ar_num < 1) { + GST_DEBUG_OBJECT (aspect_ratio_crop, "No cropping requested"); + goto beach; + } + + /* get the information from the caps */ + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) + goto beach; + + if (!gst_structure_get_fraction (structure, "pixel-aspect-ratio", + &par_n, &par_d)) { + par_d = par_n = 1; + } + + incoming_ar = ((gdouble) (width * par_n)) / (height * par_d); + GST_LOG_OBJECT (aspect_ratio_crop, + "incoming caps width(%d), height(%d), par (%d/%d) : ar = %f", width, + height, par_n, par_d, incoming_ar); + + requested_ar = + (gdouble) aspect_ratio_crop->ar_num / aspect_ratio_crop->ar_denom; + + /* check if the original aspect-ratio is the aspect-ratio that we want */ + if (requested_ar == incoming_ar) { + GST_DEBUG_OBJECT (aspect_ratio_crop, + "Input video already has the correct aspect ratio (%.3f == %.3f)", + incoming_ar, requested_ar); + goto beach; + } else if (requested_ar > incoming_ar) { + /* fix aspect ratio with cropping on top and bottom */ + cropvalue = + ((((double) aspect_ratio_crop->ar_denom / + (double) (aspect_ratio_crop->ar_num)) * ((double) par_n / + (double) par_d) * width) - height) / 2; + if (cropvalue < 0) { + cropvalue *= -1; + } + if (cropvalue >= (height / 2)) + goto crop_failed; + if (set_videocrop) { + gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, cropvalue, 0, + cropvalue, 0); + } + if (new_structure) { + *new_structure = gst_structure_copy (structure); + gst_structure_set (*new_structure, + "height", G_TYPE_INT, (int) (height - (cropvalue * 2)), NULL); + } + } else { + /* fix aspect ratio with cropping on left and right */ + cropvalue = + ((((double) aspect_ratio_crop->ar_num / + (double) (aspect_ratio_crop->ar_denom)) * ((double) par_d / + (double) par_n) * height) - width) / 2; + if (cropvalue < 0) { + cropvalue *= -1; + } + if (cropvalue >= (width / 2)) + goto crop_failed; + if (set_videocrop) { + gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, 0, cropvalue, + 0, cropvalue); + } + if (new_structure) { + *new_structure = gst_structure_copy (structure); + gst_structure_set (*new_structure, + "width", G_TYPE_INT, (int) (width - (cropvalue * 2)), NULL); + } + } + + return; + +crop_failed: + GST_WARNING_OBJECT (aspect_ratio_crop, + "can't crop to aspect ratio requested"); + goto beach; +beach: + if (set_videocrop) { + gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, 0, 0, 0, 0); + } + + if (new_structure) { + *new_structure = gst_structure_copy (structure); + } +} + +static GstCaps * +gst_aspect_ratio_crop_transform_caps (GstAspectRatioCrop * aspect_ratio_crop, + GstCaps * caps) +{ + GstCaps *transform; + gint size, i; + + transform = gst_caps_new_empty (); + + size = gst_caps_get_size (caps); + + for (i = 0; i < size; i++) { + GstStructure *s; + GstStructure *trans_s; + + s = gst_caps_get_structure (caps, i); + + gst_aspect_ratio_transform_structure (aspect_ratio_crop, s, &trans_s, + FALSE); + gst_caps_append_structure (transform, trans_s); + } + + return transform; +} + +static GstCaps * +gst_aspect_ratio_crop_get_caps (GstPad * pad) +{ + GstPad *peer; + GstAspectRatioCrop *aspect_ratio_crop; + GstCaps *return_caps; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); + + g_mutex_lock (aspect_ratio_crop->crop_lock); + + peer = gst_pad_get_peer (aspect_ratio_crop->sink); + if (peer == NULL) { + return_caps = gst_static_pad_template_get_caps (&src_template); + gst_caps_ref (return_caps); + } else { + GstCaps *peer_caps; + + peer_caps = gst_pad_get_caps (peer); + return_caps = + gst_aspect_ratio_crop_transform_caps (aspect_ratio_crop, peer_caps); + gst_caps_unref (peer_caps); + gst_object_unref (peer); + } + + g_mutex_unlock (aspect_ratio_crop->crop_lock); + gst_object_unref (aspect_ratio_crop); + + return return_caps; +} + +static void +gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAspectRatioCrop *aspect_ratio_crop; + gboolean recheck = FALSE; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); + + GST_OBJECT_LOCK (aspect_ratio_crop); + switch (prop_id) { + case ARG_ASPECT_RATIO_CROP: + if (GST_VALUE_HOLDS_FRACTION (value)) { + aspect_ratio_crop->ar_num = gst_value_get_fraction_numerator (value); + aspect_ratio_crop->ar_denom = + gst_value_get_fraction_denominator (value); + recheck = (GST_PAD_CAPS (aspect_ratio_crop->sink) != NULL); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (aspect_ratio_crop); + + if (recheck) { + gst_aspect_ratio_crop_set_caps (aspect_ratio_crop->sink, + GST_PAD_CAPS (aspect_ratio_crop->sink)); + } +} + +static void +gst_aspect_ratio_crop_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAspectRatioCrop *aspect_ratio_crop; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); + + GST_OBJECT_LOCK (aspect_ratio_crop); + switch (prop_id) { + case ARG_ASPECT_RATIO_CROP: + gst_value_set_fraction (value, aspect_ratio_crop->ar_num, + aspect_ratio_crop->ar_denom); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (aspect_ratio_crop); +} diff --git a/gst/videocrop/gstaspectratiocrop.h b/gst/videocrop/gstaspectratiocrop.h new file mode 100644 index 0000000..dc2e7cd --- /dev/null +++ b/gst/videocrop/gstaspectratiocrop.h @@ -0,0 +1,67 @@ +/* GStreamer video frame cropping to aspect-ratio + * Copyright (C) 2009 Thijs Vermeir + * + * 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_ASPECT_RATIO_CROP_H__ +#define __GST_ASPECT_RATIO_CROP_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_ASPECT_RATIO_CROP \ + (gst_aspect_ratio_crop_get_type()) +#define GST_ASPECT_RATIO_CROP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ASPECT_RATIO_CROP,GstAspectRatioCrop)) +#define GST_ASPECT_RATIO_CROP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ASPECT_RATIO_CROP,GstAspectRatioCropClass)) +#define GST_IS_ASPECT_RATIO_CROP(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ASPECT_RATIO_CROP)) +#define GST_IS_ASPECT_RATIO_CROP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ASPECT_RATIO_CROP)) + +typedef struct _GstAspectRatioCrop GstAspectRatioCrop; +typedef struct _GstAspectRatioCropClass GstAspectRatioCropClass; + +struct _GstAspectRatioCrop +{ + GstBin parent; + + /* our videocrop element */ + GstElement *videocrop; + + GstPad *sink; + + /* target aspect ratio */ + gint ar_num; /* if < 1 then don't change ar */ + gint ar_denom; + + GMutex *crop_lock; +}; + +struct _GstAspectRatioCropClass +{ + GstBinClass parent_class; +}; + +GType gst_aspect_ratio_crop_get_type (void); + +G_END_DECLS + +#endif /* __GST_ASPECT_RATIO_CROP_H__ */ + diff --git a/gst/videocrop/gstvideocrop.c b/gst/videocrop/gstvideocrop.c new file mode 100644 index 0000000..04b6e61 --- /dev/null +++ b/gst/videocrop/gstvideocrop.c @@ -0,0 +1,760 @@ +/* GStreamer video frame cropping + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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-videocrop + * @see_also: #GstVideoBox + * + * This element crops video frames, meaning it can remove parts of the + * picture on the left, right, top or bottom of the picture and output + * a smaller picture than the input picture, with the unwanted parts at the + * border removed. + * + * The videocrop element is similar to the videobox element, but its main + * goal is to support a multitude of formats as efficiently as possible. + * Unlike videbox, it cannot add borders to the picture and unlike videbox + * it will always output images in exactly the same format as the input image. + * + * If there is nothing to crop, the element will operate in pass-through mode. + * + * Note that no special efforts are made to handle chroma-subsampled formats + * in the case of odd-valued cropping and compensate for sub-unit chroma plane + * shifts for such formats in the case where the #GstVideoCrop:left or + * #GstVideoCrop:top property is set to an odd number. This doesn't matter for + * most use cases, but it might matter for yours. + * + * + * Example launch line + * |[ + * gst-launch -v videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! ximagesink + * ]| + * + */ + +/* TODO: + * - for packed formats, we could avoid memcpy() in case crop_left + * and crop_right are 0 and just create a sub-buffer of the input + * buffer + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstvideocrop.h" +#include "gstaspectratiocrop.h" + +#include + +GST_DEBUG_CATEGORY_STATIC (videocrop_debug); +#define GST_CAT_DEFAULT videocrop_debug + +enum +{ + ARG_0, + ARG_LEFT, + ARG_RIGHT, + ARG_TOP, + ARG_BOTTOM +}; + +/* the formats we support */ +#define GST_VIDEO_CAPS_GRAY "video/x-raw-gray, " \ + "bpp = (int) 8, " \ + "width = " GST_VIDEO_SIZE_RANGE ", " \ + "height = " GST_VIDEO_SIZE_RANGE ", " \ + "framerate = " GST_VIDEO_FPS_RANGE + +#define VIDEO_CROP_CAPS \ + GST_VIDEO_CAPS_RGBx ";" \ + GST_VIDEO_CAPS_xRGB ";" \ + GST_VIDEO_CAPS_BGRx ";" \ + GST_VIDEO_CAPS_xBGR ";" \ + GST_VIDEO_CAPS_RGBA ";" \ + GST_VIDEO_CAPS_ARGB ";" \ + GST_VIDEO_CAPS_BGRA ";" \ + GST_VIDEO_CAPS_ABGR ";" \ + GST_VIDEO_CAPS_RGB ";" \ + GST_VIDEO_CAPS_BGR ";" \ + GST_VIDEO_CAPS_YUV ("AYUV") ";" \ + GST_VIDEO_CAPS_YUV ("YUY2") ";" \ + GST_VIDEO_CAPS_YUV ("YVYU") ";" \ + GST_VIDEO_CAPS_YUV ("UYVY") ";" \ + GST_VIDEO_CAPS_YUV ("Y800") ";" \ + GST_VIDEO_CAPS_YUV ("I420") ";" \ + GST_VIDEO_CAPS_YUV ("YV12") ";" \ + GST_VIDEO_CAPS_RGB_16 ";" \ + GST_VIDEO_CAPS_RGB_15 ";" \ + GST_VIDEO_CAPS_GRAY + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CROP_CAPS) + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CROP_CAPS) + ); + +GST_BOILERPLATE (GstVideoCrop, gst_video_crop, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void gst_video_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_video_crop_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_video_crop_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps); +static GstFlowReturn gst_video_crop_transform (GstBaseTransform * trans, + GstBuffer * inbuf, GstBuffer * outbuf); +static gboolean gst_video_crop_get_unit_size (GstBaseTransform * trans, + GstCaps * caps, guint * size); +static gboolean gst_video_crop_set_caps (GstBaseTransform * trans, + GstCaps * in_caps, GstCaps * outcaps); +static gboolean gst_video_crop_src_event (GstBaseTransform * trans, + GstEvent * event); + +static void +gst_video_crop_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Crop", + "Filter/Effect/Video", + "Crops video into a user-defined region", + "Tim-Philipp Müller "); + + gst_element_class_add_static_pad_template (element_class, + &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); +} + +static gboolean +gst_video_crop_src_event (GstBaseTransform * trans, GstEvent * event) +{ + GstEvent *new_event; + GstStructure *new_structure; + const GstStructure *structure; + const gchar *event_name; + double pointer_x; + double pointer_y; + + GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); + new_event = NULL; + + GST_OBJECT_LOCK (vcrop); + if (GST_EVENT_TYPE (event) == GST_EVENT_NAVIGATION && + (vcrop->crop_left != 0 || vcrop->crop_top != 0)) { + structure = gst_event_get_structure (event); + event_name = gst_structure_get_string (structure, "event"); + + if (event_name && + (strcmp (event_name, "mouse-move") == 0 || + strcmp (event_name, "mouse-button-press") == 0 || + strcmp (event_name, "mouse-button-release") == 0)) { + + if (gst_structure_get_double (structure, "pointer_x", &pointer_x) && + gst_structure_get_double (structure, "pointer_y", &pointer_y)) { + + new_structure = gst_structure_copy (structure); + gst_structure_set (new_structure, + "pointer_x", G_TYPE_DOUBLE, (double) (pointer_x + vcrop->crop_left), + "pointer_y", G_TYPE_DOUBLE, (double) (pointer_y + vcrop->crop_top), + NULL); + + new_event = gst_event_new_navigation (new_structure); + gst_event_unref (event); + } else { + GST_WARNING_OBJECT (vcrop, "Failed to read navigation event"); + } + } + } + + GST_OBJECT_UNLOCK (vcrop); + return GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, + (new_event ? new_event : event)); +} + +static void +gst_video_crop_class_init (GstVideoCropClass * klass) +{ + GObjectClass *gobject_class; + GstBaseTransformClass *basetransform_class; + + gobject_class = (GObjectClass *) klass; + basetransform_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_video_crop_set_property; + gobject_class->get_property = gst_video_crop_get_property; + + g_object_class_install_property (gobject_class, ARG_LEFT, + g_param_spec_int ("left", "Left", "Pixels to crop at left", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_RIGHT, + g_param_spec_int ("right", "Right", "Pixels to crop at right", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_TOP, + g_param_spec_int ("top", "Top", "Pixels to crop at top", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_BOTTOM, + g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + basetransform_class->transform = GST_DEBUG_FUNCPTR (gst_video_crop_transform); + basetransform_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_video_crop_transform_caps); + basetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_crop_set_caps); + basetransform_class->get_unit_size = + GST_DEBUG_FUNCPTR (gst_video_crop_get_unit_size); + + basetransform_class->passthrough_on_same_caps = FALSE; + basetransform_class->src_event = GST_DEBUG_FUNCPTR (gst_video_crop_src_event); +} + +static void +gst_video_crop_init (GstVideoCrop * vcrop, GstVideoCropClass * klass) +{ + vcrop->crop_right = 0; + vcrop->crop_left = 0; + vcrop->crop_top = 0; + vcrop->crop_bottom = 0; +} + +static gboolean +gst_video_crop_get_image_details_from_caps (GstVideoCrop * vcrop, + GstVideoCropImageDetails * details, GstCaps * caps) +{ + GstStructure *structure; + gint width, height; + + structure = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) { + goto incomplete_format; + } + + details->width = width; + details->height = height; + + if (gst_structure_has_name (structure, "video/x-raw-rgb") || + gst_structure_has_name (structure, "video/x-raw-gray")) { + gint bpp = 0; + + if (!gst_structure_get_int (structure, "bpp", &bpp) || (bpp & 0x07) != 0) + goto incomplete_format; + + details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; + details->bytes_per_pixel = bpp / 8; + details->stride = GST_ROUND_UP_4 (width * details->bytes_per_pixel); + details->size = details->stride * height; + } else if (gst_structure_has_name (structure, "video/x-raw-yuv")) { + guint32 format = 0; + + if (!gst_structure_get_fourcc (structure, "format", &format)) + goto incomplete_format; + + switch (format) { + case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): + details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; + details->bytes_per_pixel = 4; + details->stride = GST_ROUND_UP_4 (width * 4); + details->size = details->stride * height; + break; + case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'): + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX; + details->bytes_per_pixel = 2; + details->stride = GST_ROUND_UP_4 (width * 2); + details->size = details->stride * height; + if (format == GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y')) { + /* UYVY = 4:2:2 - [U0 Y0 V0 Y1] [U2 Y2 V2 Y3] [U4 Y4 V4 Y5] */ + details->macro_y_off = 1; + } else { + /* YUYV = 4:2:2 - [Y0 U0 Y1 V0] [Y2 U2 Y3 V2] [Y4 U4 Y5 V4] = YUY2 */ + details->macro_y_off = 0; + } + break; + case GST_MAKE_FOURCC ('Y', '8', '0', '0'): + details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; + details->bytes_per_pixel = 1; + details->stride = GST_ROUND_UP_4 (width); + details->size = details->stride * height; + break; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):{ + details->packing = VIDEO_CROP_PIXEL_FORMAT_PLANAR; + + details->y_stride = GST_ROUND_UP_4 (width); + details->u_stride = GST_ROUND_UP_8 (width) / 2; + details->v_stride = GST_ROUND_UP_8 (width) / 2; + + /* I420 and YV12 have U/V planes swapped, but doesn't matter for us */ + details->y_off = 0; + details->u_off = 0 + details->y_stride * GST_ROUND_UP_2 (height); + details->v_off = details->u_off + + details->u_stride * (GST_ROUND_UP_2 (height) / 2); + details->size = details->v_off + + details->v_stride * (GST_ROUND_UP_2 (height) / 2); + break; + } + default: + goto unknown_format; + } + } else { + goto unknown_format; + } + + return TRUE; + + /* ERRORS */ +unknown_format: + { + GST_ELEMENT_ERROR (vcrop, STREAM, NOT_IMPLEMENTED, (NULL), + ("Unsupported format")); + return FALSE; + } + +incomplete_format: + { + GST_ELEMENT_ERROR (vcrop, CORE, NEGOTIATION, (NULL), + ("Incomplete caps, some required field is missing")); + return FALSE; + } +} + +static gboolean +gst_video_crop_get_unit_size (GstBaseTransform * trans, GstCaps * caps, + guint * size) +{ + GstVideoCropImageDetails img_details = { 0, }; + GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); + + if (!gst_video_crop_get_image_details_from_caps (vcrop, &img_details, caps)) + return FALSE; + + *size = img_details.size; + return TRUE; +} + +#define ROUND_DOWN_2(n) ((n)&(~1)) + +static void +gst_video_crop_transform_packed_complex (GstVideoCrop * vcrop, + GstBuffer * inbuf, GstBuffer * outbuf) +{ + guint8 *in_data, *out_data; + guint i, dx; + + in_data = GST_BUFFER_DATA (inbuf); + out_data = GST_BUFFER_DATA (outbuf); + + in_data += vcrop->crop_top * vcrop->in.stride; + + /* rounding down here so we end up at the start of a macro-pixel and not + * in the middle of one */ + in_data += ROUND_DOWN_2 (vcrop->crop_left) * vcrop->in.bytes_per_pixel; + + dx = vcrop->out.width * vcrop->out.bytes_per_pixel; + + /* UYVY = 4:2:2 - [U0 Y0 V0 Y1] [U2 Y2 V2 Y3] [U4 Y4 V4 Y5] + * YUYV = 4:2:2 - [Y0 U0 Y1 V0] [Y2 U2 Y3 V2] [Y4 U4 Y5 V4] = YUY2 */ + if ((vcrop->crop_left % 2) != 0) { + for (i = 0; i < vcrop->out.height; ++i) { + gint j; + + memcpy (out_data, in_data, dx); + + /* move just the Y samples one pixel to the left, don't worry about + * chroma shift */ + for (j = vcrop->in.macro_y_off; j < vcrop->out.stride - 2; j += 2) + out_data[j] = in_data[j + 2]; + + in_data += vcrop->in.stride; + out_data += vcrop->out.stride; + } + } else { + for (i = 0; i < vcrop->out.height; ++i) { + memcpy (out_data, in_data, dx); + in_data += vcrop->in.stride; + out_data += vcrop->out.stride; + } + } +} + +static void +gst_video_crop_transform_packed_simple (GstVideoCrop * vcrop, + GstBuffer * inbuf, GstBuffer * outbuf) +{ + guint8 *in_data, *out_data; + guint i, dx; + + in_data = GST_BUFFER_DATA (inbuf); + out_data = GST_BUFFER_DATA (outbuf); + + in_data += vcrop->crop_top * vcrop->in.stride; + in_data += vcrop->crop_left * vcrop->in.bytes_per_pixel; + + dx = vcrop->out.width * vcrop->out.bytes_per_pixel; + + for (i = 0; i < vcrop->out.height; ++i) { + memcpy (out_data, in_data, dx); + in_data += vcrop->in.stride; + out_data += vcrop->out.stride; + } +} + +static void +gst_video_crop_transform_planar (GstVideoCrop * vcrop, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + guint8 *y_out, *u_out, *v_out; + guint8 *y_in, *u_in, *v_in; + guint i, dx; + + /* Y plane */ + y_in = GST_BUFFER_DATA (inbuf); + y_out = GST_BUFFER_DATA (outbuf); + + y_in += (vcrop->crop_top * vcrop->in.y_stride) + vcrop->crop_left; + dx = vcrop->out.width * 1; + + for (i = 0; i < vcrop->out.height; ++i) { + memcpy (y_out, y_in, dx); + y_in += vcrop->in.y_stride; + y_out += vcrop->out.y_stride; + } + + /* U + V planes */ + u_in = GST_BUFFER_DATA (inbuf) + vcrop->in.u_off; + u_out = GST_BUFFER_DATA (outbuf) + vcrop->out.u_off; + + u_in += (vcrop->crop_top / 2) * vcrop->in.u_stride; + u_in += vcrop->crop_left / 2; + + v_in = GST_BUFFER_DATA (inbuf) + vcrop->in.v_off; + v_out = GST_BUFFER_DATA (outbuf) + vcrop->out.v_off; + + v_in += (vcrop->crop_top / 2) * vcrop->in.v_stride; + v_in += vcrop->crop_left / 2; + + dx = GST_ROUND_UP_2 (vcrop->out.width) / 2; + + for (i = 0; i < GST_ROUND_UP_2 (vcrop->out.height) / 2; ++i) { + memcpy (u_out, u_in, dx); + memcpy (v_out, v_in, dx); + u_in += vcrop->in.u_stride; + u_out += vcrop->out.u_stride; + v_in += vcrop->in.v_stride; + v_out += vcrop->out.v_stride; + } +} + +static GstFlowReturn +gst_video_crop_transform (GstBaseTransform * trans, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); + + switch (vcrop->in.packing) { + case VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE: + gst_video_crop_transform_packed_simple (vcrop, inbuf, outbuf); + break; + case VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX: + gst_video_crop_transform_packed_complex (vcrop, inbuf, outbuf); + break; + case VIDEO_CROP_PIXEL_FORMAT_PLANAR: + gst_video_crop_transform_planar (vcrop, inbuf, outbuf); + break; + default: + g_assert_not_reached (); + } + + return GST_FLOW_OK; +} + +static gint +gst_video_crop_transform_dimension (gint val, gint delta) +{ + gint64 new_val = (gint64) val + (gint64) delta; + + new_val = CLAMP (new_val, 1, G_MAXINT); + + return (gint) new_val; +} + +static gboolean +gst_video_crop_transform_dimension_value (const GValue * src_val, + gint delta, GValue * dest_val) +{ + gboolean ret = TRUE; + + g_value_init (dest_val, G_VALUE_TYPE (src_val)); + + if (G_VALUE_HOLDS_INT (src_val)) { + gint ival = g_value_get_int (src_val); + + ival = gst_video_crop_transform_dimension (ival, delta); + g_value_set_int (dest_val, ival); + } else if (GST_VALUE_HOLDS_INT_RANGE (src_val)) { + gint min = gst_value_get_int_range_min (src_val); + gint max = gst_value_get_int_range_max (src_val); + + min = gst_video_crop_transform_dimension (min, delta); + max = gst_video_crop_transform_dimension (max, delta); + gst_value_set_int_range (dest_val, min, max); + } else if (GST_VALUE_HOLDS_LIST (src_val)) { + gint i; + + for (i = 0; i < gst_value_list_get_size (src_val); ++i) { + const GValue *list_val; + GValue newval = { 0, }; + + list_val = gst_value_list_get_value (src_val, i); + if (gst_video_crop_transform_dimension_value (list_val, delta, &newval)) + gst_value_list_append_value (dest_val, &newval); + g_value_unset (&newval); + } + + if (gst_value_list_get_size (dest_val) == 0) { + g_value_unset (dest_val); + ret = FALSE; + } + } else { + g_value_unset (dest_val); + ret = FALSE; + } + + return ret; +} + +static GstCaps * +gst_video_crop_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps) +{ + GstVideoCrop *vcrop; + GstCaps *other_caps; + gint dy, dx, i; + + vcrop = GST_VIDEO_CROP (trans); + + GST_OBJECT_LOCK (vcrop); + + GST_LOG_OBJECT (vcrop, "l=%d,r=%d,b=%d,t=%d", + vcrop->crop_left, vcrop->crop_right, vcrop->crop_bottom, vcrop->crop_top); + + if (direction == GST_PAD_SRC) { + dx = vcrop->crop_left + vcrop->crop_right; + dy = vcrop->crop_top + vcrop->crop_bottom; + } else { + dx = 0 - (vcrop->crop_left + vcrop->crop_right); + dy = 0 - (vcrop->crop_top + vcrop->crop_bottom); + } + GST_OBJECT_UNLOCK (vcrop); + + GST_LOG_OBJECT (vcrop, "transforming caps %" GST_PTR_FORMAT, caps); + + other_caps = gst_caps_new_empty (); + + for (i = 0; i < gst_caps_get_size (caps); ++i) { + const GValue *v; + GstStructure *structure, *new_structure; + GValue w_val = { 0, }, h_val = { + 0,}; + + structure = gst_caps_get_structure (caps, i); + + v = gst_structure_get_value (structure, "width"); + if (!gst_video_crop_transform_dimension_value (v, dx, &w_val)) { + GST_WARNING_OBJECT (vcrop, "could not tranform width value with dx=%d" + ", caps structure=%" GST_PTR_FORMAT, dx, structure); + continue; + } + + v = gst_structure_get_value (structure, "height"); + if (!gst_video_crop_transform_dimension_value (v, dy, &h_val)) { + g_value_unset (&w_val); + GST_WARNING_OBJECT (vcrop, "could not tranform height value with dy=%d" + ", caps structure=%" GST_PTR_FORMAT, dy, structure); + continue; + } + + new_structure = gst_structure_copy (structure); + gst_structure_set_value (new_structure, "width", &w_val); + gst_structure_set_value (new_structure, "height", &h_val); + g_value_unset (&w_val); + g_value_unset (&h_val); + GST_LOG_OBJECT (vcrop, "transformed structure %2d: %" GST_PTR_FORMAT + " => %" GST_PTR_FORMAT, i, structure, new_structure); + gst_caps_append_structure (other_caps, new_structure); + } + + if (gst_caps_is_empty (other_caps)) { + gst_caps_unref (other_caps); + other_caps = NULL; + } + + return other_caps; +} + +static gboolean +gst_video_crop_set_caps (GstBaseTransform * trans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstVideoCrop *crop = GST_VIDEO_CROP (trans); + + if (!gst_video_crop_get_image_details_from_caps (crop, &crop->in, incaps)) + goto wrong_input; + + if (!gst_video_crop_get_image_details_from_caps (crop, &crop->out, outcaps)) + goto wrong_output; + + if (G_UNLIKELY ((crop->crop_left + crop->crop_right) >= crop->in.width || + (crop->crop_top + crop->crop_bottom) >= crop->in.height)) + goto cropping_too_much; + + GST_LOG_OBJECT (crop, "incaps = %" GST_PTR_FORMAT ", outcaps = %" + GST_PTR_FORMAT, incaps, outcaps); + + if ((crop->crop_left | crop->crop_right | crop->crop_top | crop-> + crop_bottom) == 0) { + GST_LOG_OBJECT (crop, "we are using passthrough"); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (crop), TRUE); + } else { + GST_LOG_OBJECT (crop, "we are not using passthrough"); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (crop), FALSE); + } + + return TRUE; + + /* ERROR */ +wrong_input: + { + GST_DEBUG_OBJECT (crop, "failed to parse input caps %" GST_PTR_FORMAT, + incaps); + return FALSE; + } +wrong_output: + { + GST_DEBUG_OBJECT (crop, "failed to parse output caps %" GST_PTR_FORMAT, + outcaps); + return FALSE; + } +cropping_too_much: + { + GST_DEBUG_OBJECT (crop, "we are cropping too much"); + return FALSE; + } +} + +static void +gst_video_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideoCrop *video_crop; + + video_crop = GST_VIDEO_CROP (object); + + /* don't modify while we are transforming */ + GST_BASE_TRANSFORM_LOCK (GST_BASE_TRANSFORM_CAST (video_crop)); + + /* protect with the object lock so that we can read them */ + GST_OBJECT_LOCK (video_crop); + switch (prop_id) { + case ARG_LEFT: + video_crop->crop_left = g_value_get_int (value); + break; + case ARG_RIGHT: + video_crop->crop_right = g_value_get_int (value); + break; + case ARG_TOP: + video_crop->crop_top = g_value_get_int (value); + break; + case ARG_BOTTOM: + video_crop->crop_bottom = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (video_crop); + + GST_LOG_OBJECT (video_crop, "l=%d,r=%d,b=%d,t=%d", + video_crop->crop_left, video_crop->crop_right, video_crop->crop_bottom, + video_crop->crop_top); + + gst_base_transform_reconfigure (GST_BASE_TRANSFORM (video_crop)); + GST_BASE_TRANSFORM_UNLOCK (GST_BASE_TRANSFORM_CAST (video_crop)); +} + +static void +gst_video_crop_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVideoCrop *video_crop; + + video_crop = GST_VIDEO_CROP (object); + + GST_OBJECT_LOCK (video_crop); + switch (prop_id) { + case ARG_LEFT: + g_value_set_int (value, video_crop->crop_left); + break; + case ARG_RIGHT: + g_value_set_int (value, video_crop->crop_right); + break; + case ARG_TOP: + g_value_set_int (value, video_crop->crop_top); + break; + case ARG_BOTTOM: + g_value_set_int (value, video_crop->crop_bottom); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (video_crop); +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (videocrop_debug, "videocrop", 0, "videocrop"); + + if (gst_element_register (plugin, "videocrop", GST_RANK_NONE, + GST_TYPE_VIDEO_CROP) + && gst_element_register (plugin, "aspectratiocrop", GST_RANK_NONE, + GST_TYPE_ASPECT_RATIO_CROP)) + return TRUE; + + return FALSE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videocrop", + "Crops video into a user-defined region", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/videocrop/gstvideocrop.h b/gst/videocrop/gstvideocrop.h new file mode 100644 index 0000000..477f21b --- /dev/null +++ b/gst/videocrop/gstvideocrop.h @@ -0,0 +1,92 @@ +/* GStreamer video frame cropping + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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_VIDEO_CROP_H__ +#define __GST_VIDEO_CROP_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEO_CROP \ + (gst_video_crop_get_type()) +#define GST_VIDEO_CROP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_CROP,GstVideoCrop)) +#define GST_VIDEO_CROP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_CROP,GstVideoCropClass)) +#define GST_IS_VIDEO_CROP(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_CROP)) +#define GST_IS_VIDEO_CROP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_CROP)) + +typedef enum { + VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE = 0, /* RGBx, AYUV */ + VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX, /* UYVY, YVYU */ + VIDEO_CROP_PIXEL_FORMAT_PLANAR /* I420, YV12 */ +} VideoCropPixelFormat; + +typedef struct _GstVideoCropImageDetails GstVideoCropImageDetails; +struct _GstVideoCropImageDetails +{ + /*< private >*/ + VideoCropPixelFormat packing; + + guint width; + guint height; + guint size; + + /* for packed RGB and YUV */ + guint stride; + guint bytes_per_pixel; + guint8 macro_y_off; /* for YUY2, YVYU, UYVY, Y offset within macropixel in bytes */ + + /* for planar YUV */ + guint y_stride, y_off; + guint u_stride, u_off; + guint v_stride, v_off; +}; + +typedef struct _GstVideoCrop GstVideoCrop; +typedef struct _GstVideoCropClass GstVideoCropClass; + +struct _GstVideoCrop +{ + GstBaseTransform basetransform; + + /*< private >*/ + gint crop_left; + gint crop_right; + gint crop_top; + gint crop_bottom; + + GstVideoCropImageDetails in; /* details of input image */ + GstVideoCropImageDetails out; /* details of output image */ +}; + +struct _GstVideoCropClass +{ + GstBaseTransformClass basetransform_class; +}; + +GType gst_video_crop_get_type (void); + +G_END_DECLS + +#endif /* __GST_VIDEO_CROP_H__ */ + diff --git a/gst/videofilter/Makefile.am b/gst/videofilter/Makefile.am new file mode 100644 index 0000000..4838c17 --- /dev/null +++ b/gst/videofilter/Makefile.am @@ -0,0 +1,39 @@ +plugin_LTLIBRARIES = libgstvideofilter.la + +noinst_HEADERS = gstvideoflip.h gstvideobalance.h gstgamma.h + +EXTRA_DIST = gstvideotemplate.c make_filter +CLEANFILES = gstvideoexample.c + +libgstvideofilter_la_SOURCES = plugin.c \ + gstvideoflip.c \ + gstvideobalance.c \ + gstgamma.c +libgstvideofilter_la_CFLAGS = $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) +libgstvideofilter_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-@GST_MAJORMINOR@ \ + -lgstinterfaces-@GST_MAJORMINOR@ \ + $(GST_CONTROLLER_LIBS) \ + $(GST_BASE_LIBS) $(GST_LIBS) +libgstvideofilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBM) +libgstvideofilter_la_LIBTOOLFLAGS = --tag=disable-static + +gstvideoexample.c: $(srcdir)/make_filter $(srcdir)/gstvideotemplate.c + $(srcdir)/make_filter Videoexample $(srcdir)/gstvideotemplate.c + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideofilter -:SHARED libgstvideofilter \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideofilter_la_SOURCES) \ + $(nodist_libgstvideofilter_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideofilter_la_CFLAGS) \ + -:LDFLAGS $(libgstvideofilter_la_LDFLAGS) \ + $(libgstvideofilter_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/videofilter/Makefile.in b/gst/videofilter/Makefile.in new file mode 100644 index 0000000..c49db72 --- /dev/null +++ b/gst/videofilter/Makefile.in @@ -0,0 +1,866 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/videofilter +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstvideofilter_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstvideofilter_la_OBJECTS = libgstvideofilter_la-plugin.lo \ + libgstvideofilter_la-gstvideoflip.lo \ + libgstvideofilter_la-gstvideobalance.lo \ + libgstvideofilter_la-gstgamma.lo +libgstvideofilter_la_OBJECTS = $(am_libgstvideofilter_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstvideofilter_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) \ + $(libgstvideofilter_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstvideofilter_la_SOURCES) +DIST_SOURCES = $(libgstvideofilter_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstvideofilter.la +noinst_HEADERS = gstvideoflip.h gstvideobalance.h gstgamma.h +EXTRA_DIST = gstvideotemplate.c make_filter +CLEANFILES = gstvideoexample.c +libgstvideofilter_la_SOURCES = plugin.c \ + gstvideoflip.c \ + gstvideobalance.c \ + gstgamma.c + +libgstvideofilter_la_CFLAGS = $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) + +libgstvideofilter_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-@GST_MAJORMINOR@ \ + -lgstinterfaces-@GST_MAJORMINOR@ \ + $(GST_CONTROLLER_LIBS) \ + $(GST_BASE_LIBS) $(GST_LIBS) + +libgstvideofilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBM) +libgstvideofilter_la_LIBTOOLFLAGS = --tag=disable-static +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videofilter/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/videofilter/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstvideofilter.la: $(libgstvideofilter_la_OBJECTS) $(libgstvideofilter_la_DEPENDENCIES) $(EXTRA_libgstvideofilter_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstvideofilter_la_LINK) -rpath $(plugindir) $(libgstvideofilter_la_OBJECTS) $(libgstvideofilter_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideofilter_la-gstgamma.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideofilter_la-gstvideobalance.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideofilter_la-gstvideoflip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideofilter_la-plugin.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstvideofilter_la-plugin.lo: plugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -MT libgstvideofilter_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstvideofilter_la-plugin.Tpo -c -o libgstvideofilter_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideofilter_la-plugin.Tpo $(DEPDIR)/libgstvideofilter_la-plugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstvideofilter_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -c -o libgstvideofilter_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c + +libgstvideofilter_la-gstvideoflip.lo: gstvideoflip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -MT libgstvideofilter_la-gstvideoflip.lo -MD -MP -MF $(DEPDIR)/libgstvideofilter_la-gstvideoflip.Tpo -c -o libgstvideofilter_la-gstvideoflip.lo `test -f 'gstvideoflip.c' || echo '$(srcdir)/'`gstvideoflip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideofilter_la-gstvideoflip.Tpo $(DEPDIR)/libgstvideofilter_la-gstvideoflip.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvideoflip.c' object='libgstvideofilter_la-gstvideoflip.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -c -o libgstvideofilter_la-gstvideoflip.lo `test -f 'gstvideoflip.c' || echo '$(srcdir)/'`gstvideoflip.c + +libgstvideofilter_la-gstvideobalance.lo: gstvideobalance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -MT libgstvideofilter_la-gstvideobalance.lo -MD -MP -MF $(DEPDIR)/libgstvideofilter_la-gstvideobalance.Tpo -c -o libgstvideofilter_la-gstvideobalance.lo `test -f 'gstvideobalance.c' || echo '$(srcdir)/'`gstvideobalance.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideofilter_la-gstvideobalance.Tpo $(DEPDIR)/libgstvideofilter_la-gstvideobalance.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvideobalance.c' object='libgstvideofilter_la-gstvideobalance.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -c -o libgstvideofilter_la-gstvideobalance.lo `test -f 'gstvideobalance.c' || echo '$(srcdir)/'`gstvideobalance.c + +libgstvideofilter_la-gstgamma.lo: gstgamma.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -MT libgstvideofilter_la-gstgamma.lo -MD -MP -MF $(DEPDIR)/libgstvideofilter_la-gstgamma.Tpo -c -o libgstvideofilter_la-gstgamma.lo `test -f 'gstgamma.c' || echo '$(srcdir)/'`gstgamma.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideofilter_la-gstgamma.Tpo $(DEPDIR)/libgstvideofilter_la-gstgamma.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgamma.c' object='libgstvideofilter_la-gstgamma.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -c -o libgstvideofilter_la-gstgamma.lo `test -f 'gstgamma.c' || echo '$(srcdir)/'`gstgamma.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +gstvideoexample.c: $(srcdir)/make_filter $(srcdir)/gstvideotemplate.c + $(srcdir)/make_filter Videoexample $(srcdir)/gstvideotemplate.c + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideofilter -:SHARED libgstvideofilter \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideofilter_la_SOURCES) \ + $(nodist_libgstvideofilter_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideofilter_la_CFLAGS) \ + -:LDFLAGS $(libgstvideofilter_la_LDFLAGS) \ + $(libgstvideofilter_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/videofilter/gstgamma.c b/gst/videofilter/gstgamma.c new file mode 100644 index 0000000..76d60b6 --- /dev/null +++ b/gst/videofilter/gstgamma.c @@ -0,0 +1,471 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) 2003 Arwed v. Merkatz + * Copyright (C) 2006 Mark Nauwelaerts + * Copyright (C) 2010 Sebastian Dröge + * + * 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 was (probably) generated from + * gstvideotemplate.c,v 1.12 2004/01/07 21:07:12 ds Exp + * and + * make_filter,v 1.6 2004/01/07 21:33:01 ds Exp + */ + +/** + * SECTION:element-gamma + * + * Performs gamma correction on a video stream. + * + * + * Example launch line + * |[ + * gst-launch videotestsrc ! gamma gamma=2.0 ! ffmpegcolorspace ! ximagesink + * ]| This pipeline will make the image "brighter". + * |[ + * gst-launch videotestsrc ! gamma gamma=0.5 ! ffmpegcolorspace ! ximagesink + * ]| This pipeline will make the image "darker". + * + * + * Last reviewed on 2010-04-18 (0.10.22) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstgamma.h" +#include +#include + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (gamma_debug); +#define GST_CAT_DEFAULT gamma_debug + +/* GstGamma properties */ +enum +{ + PROP_0, + PROP_GAMMA + /* FILL ME */ +}; + +#define DEFAULT_PROP_GAMMA 1 + +static GstStaticPadTemplate gst_gamma_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("NV12") ";" + GST_VIDEO_CAPS_YUV ("NV21") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" + GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B") + ) + ); + +static GstStaticPadTemplate gst_gamma_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("NV12") ";" + GST_VIDEO_CAPS_YUV ("NV21") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" + GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B") + ) + ); + +static void gst_gamma_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_gamma_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_gamma_set_caps (GstBaseTransform * base, GstCaps * incaps, + GstCaps * outcaps); +static GstFlowReturn gst_gamma_transform_ip (GstBaseTransform * transform, + GstBuffer * buf); +static void gst_gamma_before_transform (GstBaseTransform * transform, + GstBuffer * buf); + +static void gst_gamma_calculate_tables (GstGamma * gamma); + +GST_BOILERPLATE (GstGamma, gst_gamma, GstVideoFilter, GST_TYPE_VIDEO_FILTER); + +static void +gst_gamma_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Video gamma correction", + "Filter/Effect/Video", + "Adjusts gamma on a video stream", + "Arwed v. Merkatz "); + + gst_element_class_add_static_pad_template (element_class, + &gst_gamma_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_gamma_src_template); +} + +static void +gst_gamma_class_init (GstGammaClass * g_class) +{ + GObjectClass *gobject_class = (GObjectClass *) g_class; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) g_class; + + GST_DEBUG_CATEGORY_INIT (gamma_debug, "gamma", 0, "gamma"); + + gobject_class->set_property = gst_gamma_set_property; + gobject_class->get_property = gst_gamma_get_property; + + g_object_class_install_property (gobject_class, PROP_GAMMA, + g_param_spec_double ("gamma", "Gamma", "gamma", + 0.01, 10, DEFAULT_PROP_GAMMA, + GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_gamma_set_caps); + trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_gamma_transform_ip); + trans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_gamma_before_transform); +} + +static void +gst_gamma_init (GstGamma * gamma, GstGammaClass * g_class) +{ + /* properties */ + gamma->gamma = DEFAULT_PROP_GAMMA; + gst_gamma_calculate_tables (gamma); +} + +static void +gst_gamma_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstGamma *gamma = GST_GAMMA (object); + + switch (prop_id) { + case PROP_GAMMA:{ + gdouble val = g_value_get_double (value); + + GST_DEBUG_OBJECT (gamma, "Changing gamma from %lf to %lf", gamma->gamma, + val); + GST_OBJECT_LOCK (gamma); + gamma->gamma = val; + gst_gamma_calculate_tables (gamma); + GST_OBJECT_UNLOCK (gamma); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_gamma_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstGamma *gamma = GST_GAMMA (object); + + switch (prop_id) { + case PROP_GAMMA: + g_value_set_double (value, gamma->gamma); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_gamma_calculate_tables (GstGamma * gamma) +{ + gint n; + gdouble val; + gdouble exp; + + if (gamma->gamma == 1.0) { + GST_BASE_TRANSFORM (gamma)->passthrough = TRUE; + return; + } + GST_BASE_TRANSFORM (gamma)->passthrough = FALSE; + + exp = 1.0 / gamma->gamma; + for (n = 0; n < 256; n++) { + val = n / 255.0; + val = pow (val, exp); + val = 255.0 * val; + gamma->gamma_table[n] = (guint8) floor (val + 0.5); + } +} + +static void +gst_gamma_planar_yuv_ip (GstGamma * gamma, guint8 * data) +{ + gint i, j, height; + gint width, row_stride, row_wrap; + const guint8 *table = gamma->gamma_table; + + data = + data + gst_video_format_get_component_offset (gamma->format, 0, + gamma->width, gamma->height); + + width = gst_video_format_get_component_width (gamma->format, 0, gamma->width); + height = gst_video_format_get_component_height (gamma->format, 0, + gamma->height); + row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width); + row_wrap = row_stride - width; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + *data = table[*data]; + data++; + } + data += row_wrap; + } +} + +static void +gst_gamma_packed_yuv_ip (GstGamma * gamma, guint8 * data) +{ + gint i, j, height; + gint width, row_stride, row_wrap; + gint pixel_stride; + const guint8 *table = gamma->gamma_table; + + data = data + gst_video_format_get_component_offset (gamma->format, 0, + gamma->width, gamma->height); + + width = gst_video_format_get_component_width (gamma->format, 0, gamma->width); + height = gst_video_format_get_component_height (gamma->format, 0, + gamma->height); + row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width); + pixel_stride = gst_video_format_get_pixel_stride (gamma->format, 0); + row_wrap = row_stride - pixel_stride * width; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + *data = table[*data]; + data += pixel_stride; + } + data += row_wrap; + } +} + +static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { + 298, 0, 409, -57068, + 298, -100, -208, 34707, + 298, 516, 0, -70870, +}; + +static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { + 66, 129, 25, 4096, + -38, -74, 112, 32768, + 112, -94, -18, 32768, +}; + +#define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8) + +static void +gst_gamma_packed_rgb_ip (GstGamma * gamma, guint8 * data) +{ + gint i, j, height; + gint width, row_stride, row_wrap; + gint pixel_stride; + const guint8 *table = gamma->gamma_table; + gint offsets[3]; + gint r, g, b; + gint y, u, v; + + offsets[0] = gst_video_format_get_component_offset (gamma->format, 0, + gamma->width, gamma->height); + offsets[1] = gst_video_format_get_component_offset (gamma->format, 1, + gamma->width, gamma->height); + offsets[2] = gst_video_format_get_component_offset (gamma->format, 2, + gamma->width, gamma->height); + + width = gst_video_format_get_component_width (gamma->format, 0, gamma->width); + height = gst_video_format_get_component_height (gamma->format, 0, + gamma->height); + row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width); + pixel_stride = gst_video_format_get_pixel_stride (gamma->format, 0); + row_wrap = row_stride - pixel_stride * width; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + r = data[offsets[0]]; + g = data[offsets[1]]; + b = data[offsets[2]]; + + y = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 0, r, g, b); + u = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 1, r, g, b); + v = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 2, r, g, b); + + y = table[CLAMP (y, 0, 255)]; + r = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 0, y, u, v); + g = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 1, y, u, v); + b = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 2, y, u, v); + + data[offsets[0]] = CLAMP (r, 0, 255); + data[offsets[1]] = CLAMP (g, 0, 255); + data[offsets[2]] = CLAMP (b, 0, 255); + data += pixel_stride; + } + data += row_wrap; + } +} + +static gboolean +gst_gamma_set_caps (GstBaseTransform * base, GstCaps * incaps, + GstCaps * outcaps) +{ + GstGamma *gamma = GST_GAMMA (base); + + GST_DEBUG_OBJECT (gamma, + "setting caps: in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, + outcaps); + + if (!gst_video_format_parse_caps (incaps, &gamma->format, &gamma->width, + &gamma->height)) + goto invalid_caps; + + gamma->size = + gst_video_format_get_size (gamma->format, gamma->width, gamma->height); + + switch (gamma->format) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y41B: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + gamma->process = gst_gamma_planar_yuv_ip; + break; + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_UYVY: + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_YVYU: + gamma->process = gst_gamma_packed_yuv_ip; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + gamma->process = gst_gamma_packed_rgb_ip; + break; + default: + goto invalid_caps; + break; + } + + return TRUE; + +invalid_caps: + GST_ERROR_OBJECT (gamma, "Invalid caps: %" GST_PTR_FORMAT, incaps); + return FALSE; +} + +static void +gst_gamma_before_transform (GstBaseTransform * base, GstBuffer * outbuf) +{ + GstGamma *gamma = GST_GAMMA (base); + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (outbuf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (gamma, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (gamma), stream_time); +} + +static GstFlowReturn +gst_gamma_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) +{ + GstGamma *gamma = GST_GAMMA (base); + guint8 *data; + guint size; + + if (!gamma->process) + goto not_negotiated; + + if (base->passthrough) + goto done; + + data = GST_BUFFER_DATA (outbuf); + size = GST_BUFFER_SIZE (outbuf); + + if (size != gamma->size) + goto wrong_size; + + GST_OBJECT_LOCK (gamma); + gamma->process (gamma, data); + GST_OBJECT_UNLOCK (gamma); + +done: + return GST_FLOW_OK; + + /* ERRORS */ +wrong_size: + { + GST_ELEMENT_ERROR (gamma, STREAM, FORMAT, + (NULL), ("Invalid buffer size %d, expected %d", size, gamma->size)); + return GST_FLOW_ERROR; + } +not_negotiated: + { + GST_ERROR_OBJECT (gamma, "Not negotiated yet"); + return GST_FLOW_NOT_NEGOTIATED; + } +} diff --git a/gst/videofilter/gstgamma.h b/gst/videofilter/gstgamma.h new file mode 100644 index 0000000..85d2e27 --- /dev/null +++ b/gst/videofilter/gstgamma.h @@ -0,0 +1,82 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) 2003 Arwed v. Merkatz + * Copyright (C) 2006 Mark Nauwelaerts + * + * 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_VIDEO_GAMMA_H__ +#define __GST_VIDEO_GAMMA_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_GAMMA \ + (gst_gamma_get_type()) +#define GST_GAMMA(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GAMMA,GstGamma)) +#define GST_GAMMA_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GAMMA,GstGammaClass)) +#define GST_IS_GAMMA(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GAMMA)) +#define GST_IS_GAMMA_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GAMMA)) + +typedef struct _GstGamma GstGamma; +typedef struct _GstGammaClass GstGammaClass; + +/** + * GstGamma: + * + * Opaque data structure. + */ +struct _GstGamma +{ + GstVideoFilter videofilter; + + /* < private > */ + + /* format */ + GstVideoFormat format; + gint width; + gint height; + gint size; + + /* properties */ + gdouble gamma; + + /* tables */ + guint8 gamma_table[256]; + + void (*process) (GstGamma *gamma, guint8 *data); +}; + +struct _GstGammaClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_gamma_get_type(void); + +G_END_DECLS + +#endif /* __GST_VIDEO_GAMMA_H__ */ diff --git a/gst/videofilter/gstvideobalance.c b/gst/videofilter/gstvideobalance.c new file mode 100644 index 0000000..83a2afd --- /dev/null +++ b/gst/videofilter/gstvideobalance.c @@ -0,0 +1,839 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) <2010> Sebastian Dröge + * + * 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 was (probably) generated from gstvideobalance.c, + * gstvideobalance.c,v 1.7 2003/11/08 02:48:59 dschleef Exp + */ + +/** + * SECTION:element-videobalance + * + * Adjusts brightness, contrast, hue, saturation on a video stream. + * + * + * Example launch line + * |[ + * gst-launch videotestsrc ! videobalance saturation=0.0 ! ffmpegcolorspace ! ximagesink + * ]| This pipeline converts the image to black and white by setting the + * saturation to 0.0. + * + * + * Last reviewed on 2010-04-18 (0.10.22) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstvideobalance.h" +#include + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (videobalance_debug); +#define GST_CAT_DEFAULT videobalance_debug + +/* GstVideoBalance properties */ +#define DEFAULT_PROP_CONTRAST 1.0 +#define DEFAULT_PROP_BRIGHTNESS 0.0 +#define DEFAULT_PROP_HUE 0.0 +#define DEFAULT_PROP_SATURATION 1.0 + +enum +{ + PROP_0, + PROP_CONTRAST, + PROP_BRIGHTNESS, + PROP_HUE, + PROP_SATURATION +}; + +static GstStaticPadTemplate gst_video_balance_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" + GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B") + ) + ); + +static GstStaticPadTemplate gst_video_balance_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" + GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B") + ) + ); + +static void gst_video_balance_colorbalance_init (GstColorBalanceClass * iface); +static void gst_video_balance_interface_init (GstImplementsInterfaceClass * + klass); + +static void gst_video_balance_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_video_balance_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void +_do_init (GType video_balance_type) +{ + static const GInterfaceInfo iface_info = { + (GInterfaceInitFunc) gst_video_balance_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo colorbalance_info = { + (GInterfaceInitFunc) gst_video_balance_colorbalance_init, + NULL, + NULL, + }; + + g_type_add_interface_static (video_balance_type, + GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info); + g_type_add_interface_static (video_balance_type, GST_TYPE_COLOR_BALANCE, + &colorbalance_info); +} + +GST_BOILERPLATE_FULL (GstVideoBalance, gst_video_balance, GstVideoFilter, + GST_TYPE_VIDEO_FILTER, _do_init); + +/* + * look-up tables (LUT). + */ +static void +gst_video_balance_update_tables (GstVideoBalance * vb) +{ + gint i, j; + gdouble y, u, v, hue_cos, hue_sin; + + /* Y */ + for (i = 0; i < 256; i++) { + y = 16 + ((i - 16) * vb->contrast + vb->brightness * 255); + if (y < 0) + y = 0; + else if (y > 255) + y = 255; + vb->tabley[i] = rint (y); + } + + hue_cos = cos (G_PI * vb->hue); + hue_sin = sin (G_PI * vb->hue); + + /* U/V lookup tables are 2D, since we need both U/V for each table + * separately. */ + for (i = -128; i < 128; i++) { + for (j = -128; j < 128; j++) { + u = 128 + ((i * hue_cos + j * hue_sin) * vb->saturation); + v = 128 + ((-i * hue_sin + j * hue_cos) * vb->saturation); + if (u < 0) + u = 0; + else if (u > 255) + u = 255; + if (v < 0) + v = 0; + else if (v > 255) + v = 255; + vb->tableu[i + 128][j + 128] = rint (u); + vb->tablev[i + 128][j + 128] = rint (v); + } + } +} + +static gboolean +gst_video_balance_is_passthrough (GstVideoBalance * videobalance) +{ + return videobalance->contrast == 1.0 && + videobalance->brightness == 0.0 && + videobalance->hue == 0.0 && videobalance->saturation == 1.0; +} + +static void +gst_video_balance_update_properties (GstVideoBalance * videobalance) +{ + gboolean passthrough = gst_video_balance_is_passthrough (videobalance); + GstBaseTransform *base = GST_BASE_TRANSFORM (videobalance); + + base->passthrough = passthrough; + + if (!passthrough) + gst_video_balance_update_tables (videobalance); +} + +static void +gst_video_balance_planar_yuv (GstVideoBalance * videobalance, guint8 * data) +{ + gint x, y; + guint8 *ydata; + guint8 *udata, *vdata; + gint ystride, ustride, vstride; + GstVideoFormat format; + gint width, height; + gint width2, height2; + guint8 *tabley = videobalance->tabley; + guint8 **tableu = videobalance->tableu; + guint8 **tablev = videobalance->tablev; + + format = videobalance->format; + width = videobalance->width; + height = videobalance->height; + + ydata = + data + gst_video_format_get_component_offset (format, 0, width, height); + ystride = gst_video_format_get_row_stride (format, 0, width); + + for (y = 0; y < height; y++) { + guint8 *yptr; + + yptr = ydata + y * ystride; + for (x = 0; x < width; x++) { + *yptr = tabley[*yptr]; + yptr++; + } + } + + width2 = gst_video_format_get_component_width (format, 1, width); + height2 = gst_video_format_get_component_height (format, 1, height); + + udata = + data + gst_video_format_get_component_offset (format, 1, width, height); + vdata = + data + gst_video_format_get_component_offset (format, 2, width, height); + ustride = gst_video_format_get_row_stride (format, 1, width); + vstride = gst_video_format_get_row_stride (format, 1, width); + + for (y = 0; y < height2; y++) { + guint8 *uptr, *vptr; + guint8 u1, v1; + + uptr = udata + y * ustride; + vptr = vdata + y * vstride; + + for (x = 0; x < width2; x++) { + u1 = *uptr; + v1 = *vptr; + + *uptr++ = tableu[u1][v1]; + *vptr++ = tablev[u1][v1]; + } + } +} + +static void +gst_video_balance_packed_yuv (GstVideoBalance * videobalance, guint8 * data) +{ + gint x, y; + guint8 *ydata; + guint8 *udata, *vdata; + gint ystride, ustride, vstride; + gint yoff, uoff, voff; + GstVideoFormat format; + gint width, height; + gint width2, height2; + guint8 *tabley = videobalance->tabley; + guint8 **tableu = videobalance->tableu; + guint8 **tablev = videobalance->tablev; + + format = videobalance->format; + width = videobalance->width; + height = videobalance->height; + + ydata = + data + gst_video_format_get_component_offset (format, 0, width, height); + ystride = gst_video_format_get_row_stride (format, 0, width); + yoff = gst_video_format_get_pixel_stride (format, 0); + + for (y = 0; y < height; y++) { + guint8 *yptr; + + yptr = ydata + y * ystride; + for (x = 0; x < width; x++) { + *yptr = tabley[*yptr]; + yptr += yoff; + } + } + + width2 = gst_video_format_get_component_width (format, 1, width); + height2 = gst_video_format_get_component_height (format, 1, height); + + udata = + data + gst_video_format_get_component_offset (format, 1, width, height); + vdata = + data + gst_video_format_get_component_offset (format, 2, width, height); + ustride = gst_video_format_get_row_stride (format, 1, width); + vstride = gst_video_format_get_row_stride (format, 1, width); + uoff = gst_video_format_get_pixel_stride (format, 1); + voff = gst_video_format_get_pixel_stride (format, 2); + + for (y = 0; y < height2; y++) { + guint8 *uptr, *vptr; + guint8 u1, v1; + + uptr = udata + y * ustride; + vptr = vdata + y * vstride; + + for (x = 0; x < width2; x++) { + u1 = *uptr; + v1 = *vptr; + + *uptr = tableu[u1][v1]; + *vptr = tablev[u1][v1]; + + uptr += uoff; + vptr += voff; + } + } +} + +static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { + 298, 0, 409, -57068, + 298, -100, -208, 34707, + 298, 516, 0, -70870, +}; + +static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { + 66, 129, 25, 4096, + -38, -74, 112, 32768, + 112, -94, -18, 32768, +}; + +#define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8) + +static void +gst_video_balance_packed_rgb (GstVideoBalance * videobalance, guint8 * data) +{ + gint i, j, height; + gint width, row_stride, row_wrap; + gint pixel_stride; + gint offsets[3]; + gint r, g, b; + gint y, u, v; + gint u_tmp, v_tmp; + guint8 *tabley = videobalance->tabley; + guint8 **tableu = videobalance->tableu; + guint8 **tablev = videobalance->tablev; + + offsets[0] = gst_video_format_get_component_offset (videobalance->format, 0, + videobalance->width, videobalance->height); + offsets[1] = gst_video_format_get_component_offset (videobalance->format, 1, + videobalance->width, videobalance->height); + offsets[2] = gst_video_format_get_component_offset (videobalance->format, 2, + videobalance->width, videobalance->height); + + width = + gst_video_format_get_component_width (videobalance->format, 0, + videobalance->width); + height = + gst_video_format_get_component_height (videobalance->format, 0, + videobalance->height); + row_stride = + gst_video_format_get_row_stride (videobalance->format, 0, + videobalance->width); + pixel_stride = gst_video_format_get_pixel_stride (videobalance->format, 0); + row_wrap = row_stride - pixel_stride * width; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + r = data[offsets[0]]; + g = data[offsets[1]]; + b = data[offsets[2]]; + + y = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 0, r, g, b); + u_tmp = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 1, r, g, b); + v_tmp = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 2, r, g, b); + + y = CLAMP (y, 0, 255); + u_tmp = CLAMP (u_tmp, 0, 255); + v_tmp = CLAMP (v_tmp, 0, 255); + + y = tabley[y]; + u = tableu[u_tmp][v_tmp]; + v = tablev[u_tmp][v_tmp]; + + r = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 0, y, u, v); + g = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 1, y, u, v); + b = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 2, y, u, v); + + data[offsets[0]] = CLAMP (r, 0, 255); + data[offsets[1]] = CLAMP (g, 0, 255); + data[offsets[2]] = CLAMP (b, 0, 255); + data += pixel_stride; + } + data += row_wrap; + } +} + +/* get notified of caps and plug in the correct process function */ +static gboolean +gst_video_balance_set_caps (GstBaseTransform * base, GstCaps * incaps, + GstCaps * outcaps) +{ + GstVideoBalance *videobalance = GST_VIDEO_BALANCE (base); + + GST_DEBUG_OBJECT (videobalance, + "in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps); + + videobalance->process = NULL; + + if (!gst_video_format_parse_caps (incaps, &videobalance->format, + &videobalance->width, &videobalance->height)) + goto invalid_caps; + + videobalance->size = + gst_video_format_get_size (videobalance->format, videobalance->width, + videobalance->height); + + switch (videobalance->format) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y41B: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_Y444: + videobalance->process = gst_video_balance_planar_yuv; + break; + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_UYVY: + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_YVYU: + videobalance->process = gst_video_balance_packed_yuv; + break; + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + videobalance->process = gst_video_balance_packed_rgb; + break; + default: + break; + } + + return videobalance->process != NULL; + +invalid_caps: + GST_ERROR_OBJECT (videobalance, "Invalid caps: %" GST_PTR_FORMAT, incaps); + return FALSE; +} + +static void +gst_video_balance_before_transform (GstBaseTransform * base, GstBuffer * buf) +{ + GstVideoBalance *balance = GST_VIDEO_BALANCE (base); + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (buf); + stream_time = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (balance, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (balance), stream_time); +} + +static GstFlowReturn +gst_video_balance_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) +{ + GstVideoBalance *videobalance = GST_VIDEO_BALANCE (base); + guint8 *data; + guint size; + + if (!videobalance->process) + goto not_negotiated; + + /* if no change is needed, we are done */ + if (base->passthrough) + goto done; + + data = GST_BUFFER_DATA (outbuf); + size = GST_BUFFER_SIZE (outbuf); + + if (size != videobalance->size) + goto wrong_size; + + GST_OBJECT_LOCK (videobalance); + videobalance->process (videobalance, data); + GST_OBJECT_UNLOCK (videobalance); + +done: + return GST_FLOW_OK; + + /* ERRORS */ +wrong_size: + { + GST_ELEMENT_ERROR (videobalance, STREAM, FORMAT, + (NULL), ("Invalid buffer size %d, expected %d", size, + videobalance->size)); + return GST_FLOW_ERROR; + } +not_negotiated: + GST_ERROR_OBJECT (videobalance, "Not negotiated yet"); + return GST_FLOW_NOT_NEGOTIATED; +} + +static void +gst_video_balance_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Video balance", + "Filter/Effect/Video", + "Adjusts brightness, contrast, hue, saturation on a video stream", + "David Schleef "); + + gst_element_class_add_static_pad_template (element_class, + &gst_video_balance_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_video_balance_src_template); +} + +static void +gst_video_balance_finalize (GObject * object) +{ + GList *channels = NULL; + GstVideoBalance *balance = GST_VIDEO_BALANCE (object); + + g_free (balance->tableu[0]); + + channels = balance->channels; + while (channels) { + GstColorBalanceChannel *channel = channels->data; + + g_object_unref (channel); + channels->data = NULL; + channels = g_list_next (channels); + } + + if (balance->channels) + g_list_free (balance->channels); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_video_balance_class_init (GstVideoBalanceClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + GST_DEBUG_CATEGORY_INIT (videobalance_debug, "videobalance", 0, + "videobalance"); + + gobject_class->finalize = gst_video_balance_finalize; + gobject_class->set_property = gst_video_balance_set_property; + gobject_class->get_property = gst_video_balance_get_property; + + g_object_class_install_property (gobject_class, PROP_CONTRAST, + g_param_spec_double ("contrast", "Contrast", "contrast", + 0.0, 2.0, DEFAULT_PROP_CONTRAST, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_BRIGHTNESS, + g_param_spec_double ("brightness", "Brightness", "brightness", -1.0, 1.0, + DEFAULT_PROP_BRIGHTNESS, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_HUE, + g_param_spec_double ("hue", "Hue", "hue", -1.0, 1.0, DEFAULT_PROP_HUE, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SATURATION, + g_param_spec_double ("saturation", "Saturation", "saturation", 0.0, 2.0, + DEFAULT_PROP_SATURATION, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_balance_set_caps); + trans_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_video_balance_transform_ip); + trans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_video_balance_before_transform); +} + +static void +gst_video_balance_init (GstVideoBalance * videobalance, + GstVideoBalanceClass * klass) +{ + const gchar *channels[4] = { "HUE", "SATURATION", + "BRIGHTNESS", "CONTRAST" + }; + gint i; + + /* Initialize propertiews */ + videobalance->contrast = DEFAULT_PROP_CONTRAST; + videobalance->brightness = DEFAULT_PROP_BRIGHTNESS; + videobalance->hue = DEFAULT_PROP_HUE; + videobalance->saturation = DEFAULT_PROP_SATURATION; + + videobalance->tableu[0] = g_new (guint8, 256 * 256 * 2); + for (i = 0; i < 256; i++) { + videobalance->tableu[i] = + videobalance->tableu[0] + i * 256 * sizeof (guint8); + videobalance->tablev[i] = + videobalance->tableu[0] + 256 * 256 * sizeof (guint8) + + i * 256 * sizeof (guint8); + } + + gst_video_balance_update_properties (videobalance); + + /* Generate the channels list */ + for (i = 0; i < G_N_ELEMENTS (channels); i++) { + GstColorBalanceChannel *channel; + + channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); + channel->label = g_strdup (channels[i]); + channel->min_value = -1000; + channel->max_value = 1000; + + videobalance->channels = g_list_append (videobalance->channels, channel); + } +} + +static gboolean +gst_video_balance_interface_supported (GstImplementsInterface * iface, + GType type) +{ + g_assert (type == GST_TYPE_COLOR_BALANCE); + return TRUE; +} + +static void +gst_video_balance_interface_init (GstImplementsInterfaceClass * klass) +{ + klass->supported = gst_video_balance_interface_supported; +} + +static const GList * +gst_video_balance_colorbalance_list_channels (GstColorBalance * balance) +{ + GstVideoBalance *videobalance = GST_VIDEO_BALANCE (balance); + + g_return_val_if_fail (videobalance != NULL, NULL); + g_return_val_if_fail (GST_IS_VIDEO_BALANCE (videobalance), NULL); + + return videobalance->channels; +} + +static void +gst_video_balance_colorbalance_set_value (GstColorBalance * balance, + GstColorBalanceChannel * channel, gint value) +{ + GstVideoBalance *vb = GST_VIDEO_BALANCE (balance); + gdouble new_val; + gboolean changed = FALSE; + + g_return_if_fail (vb != NULL); + g_return_if_fail (GST_IS_VIDEO_BALANCE (vb)); + g_return_if_fail (GST_IS_VIDEO_FILTER (vb)); + g_return_if_fail (channel->label != NULL); + + GST_BASE_TRANSFORM_LOCK (vb); + GST_OBJECT_LOCK (vb); + if (!g_ascii_strcasecmp (channel->label, "HUE")) { + new_val = (value + 1000.0) * 2.0 / 2000.0 - 1.0; + changed = new_val != vb->hue; + vb->hue = new_val; + } else if (!g_ascii_strcasecmp (channel->label, "SATURATION")) { + new_val = (value + 1000.0) * 2.0 / 2000.0; + changed = new_val != vb->saturation; + vb->saturation = new_val; + } else if (!g_ascii_strcasecmp (channel->label, "BRIGHTNESS")) { + new_val = (value + 1000.0) * 2.0 / 2000.0 - 1.0; + changed = new_val != vb->brightness; + vb->brightness = new_val; + } else if (!g_ascii_strcasecmp (channel->label, "CONTRAST")) { + new_val = (value + 1000.0) * 2.0 / 2000.0; + changed = new_val != vb->contrast; + vb->contrast = new_val; + } + + if (changed) + gst_video_balance_update_properties (vb); + GST_OBJECT_UNLOCK (vb); + GST_BASE_TRANSFORM_UNLOCK (vb); + + if (changed) { + gst_color_balance_value_changed (balance, channel, + gst_color_balance_get_value (balance, channel)); + } +} + +static gint +gst_video_balance_colorbalance_get_value (GstColorBalance * balance, + GstColorBalanceChannel * channel) +{ + GstVideoBalance *vb = GST_VIDEO_BALANCE (balance); + gint value = 0; + + g_return_val_if_fail (vb != NULL, 0); + g_return_val_if_fail (GST_IS_VIDEO_BALANCE (vb), 0); + g_return_val_if_fail (channel->label != NULL, 0); + + if (!g_ascii_strcasecmp (channel->label, "HUE")) { + value = (vb->hue + 1) * 2000.0 / 2.0 - 1000.0; + } else if (!g_ascii_strcasecmp (channel->label, "SATURATION")) { + value = vb->saturation * 2000.0 / 2.0 - 1000.0; + } else if (!g_ascii_strcasecmp (channel->label, "BRIGHTNESS")) { + value = (vb->brightness + 1) * 2000.0 / 2.0 - 1000.0; + } else if (!g_ascii_strcasecmp (channel->label, "CONTRAST")) { + value = vb->contrast * 2000.0 / 2.0 - 1000.0; + } + + return value; +} + +static void +gst_video_balance_colorbalance_init (GstColorBalanceClass * iface) +{ + GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_SOFTWARE; + iface->list_channels = gst_video_balance_colorbalance_list_channels; + iface->set_value = gst_video_balance_colorbalance_set_value; + iface->get_value = gst_video_balance_colorbalance_get_value; +} + +static GstColorBalanceChannel * +gst_video_balance_find_channel (GstVideoBalance * balance, const gchar * label) +{ + GList *l; + + for (l = balance->channels; l; l = l->next) { + GstColorBalanceChannel *channel = l->data; + + if (g_ascii_strcasecmp (channel->label, label) == 0) + return channel; + } + return NULL; +} + +static void +gst_video_balance_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideoBalance *balance = GST_VIDEO_BALANCE (object); + gdouble d; + const gchar *label = NULL; + + GST_BASE_TRANSFORM_LOCK (balance); + GST_OBJECT_LOCK (balance); + switch (prop_id) { + case PROP_CONTRAST: + d = g_value_get_double (value); + GST_DEBUG_OBJECT (balance, "Changing contrast from %lf to %lf", + balance->contrast, d); + if (d != balance->contrast) + label = "CONTRAST"; + balance->contrast = d; + break; + case PROP_BRIGHTNESS: + d = g_value_get_double (value); + GST_DEBUG_OBJECT (balance, "Changing brightness from %lf to %lf", + balance->brightness, d); + if (d != balance->brightness) + label = "BRIGHTNESS"; + balance->brightness = d; + break; + case PROP_HUE: + d = g_value_get_double (value); + GST_DEBUG_OBJECT (balance, "Changing hue from %lf to %lf", balance->hue, + d); + if (d != balance->hue) + label = "HUE"; + balance->hue = d; + break; + case PROP_SATURATION: + d = g_value_get_double (value); + GST_DEBUG_OBJECT (balance, "Changing saturation from %lf to %lf", + balance->saturation, d); + if (d != balance->saturation) + label = "SATURATION"; + balance->saturation = d; + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + gst_video_balance_update_properties (balance); + GST_OBJECT_UNLOCK (balance); + GST_BASE_TRANSFORM_UNLOCK (balance); + + if (label) { + GstColorBalanceChannel *channel = + gst_video_balance_find_channel (balance, label); + gst_color_balance_value_changed (GST_COLOR_BALANCE (balance), channel, + gst_color_balance_get_value (GST_COLOR_BALANCE (balance), channel)); + } +} + +static void +gst_video_balance_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVideoBalance *balance = GST_VIDEO_BALANCE (object); + + switch (prop_id) { + case PROP_CONTRAST: + g_value_set_double (value, balance->contrast); + break; + case PROP_BRIGHTNESS: + g_value_set_double (value, balance->brightness); + break; + case PROP_HUE: + g_value_set_double (value, balance->hue); + break; + case PROP_SATURATION: + g_value_set_double (value, balance->saturation); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/gst/videofilter/gstvideobalance.h b/gst/videofilter/gstvideobalance.h new file mode 100644 index 0000000..c9484e3 --- /dev/null +++ b/gst/videofilter/gstvideobalance.h @@ -0,0 +1,85 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_VIDEO_BALANCE_H__ +#define __GST_VIDEO_BALANCE_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEO_BALANCE \ + (gst_video_balance_get_type()) +#define GST_VIDEO_BALANCE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_BALANCE,GstVideoBalance)) +#define GST_VIDEO_BALANCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_BALANCE,GstVideoBalanceClass)) +#define GST_IS_VIDEO_BALANCE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_BALANCE)) +#define GST_IS_VIDEO_BALANCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_BALANCE)) + +typedef struct _GstVideoBalance GstVideoBalance; +typedef struct _GstVideoBalanceClass GstVideoBalanceClass; + +/** + * GstVideoBalance: + * + * Opaque data structure. + */ +struct _GstVideoBalance { + GstVideoFilter videofilter; + + /* < private > */ + + /* channels for interface */ + GList *channels; + + /* properties */ + gdouble contrast; + gdouble brightness; + gdouble hue; + gdouble saturation; + + /* format */ + GstVideoFormat format; + gint width; + gint height; + gint size; + + /* tables */ + guint8 tabley[256]; + guint8 *tableu[256]; + guint8 *tablev[256]; + + void (*process) (GstVideoBalance *balance, guint8 *data); +}; + +struct _GstVideoBalanceClass { + GstVideoFilterClass parent_class; +}; + +GType gst_video_balance_get_type(void); + +G_END_DECLS + +#endif /* __GST_VIDEO_BALANCE_H__ */ diff --git a/gst/videofilter/gstvideoflip.c b/gst/videofilter/gstvideoflip.c new file mode 100644 index 0000000..7137057 --- /dev/null +++ b/gst/videofilter/gstvideoflip.c @@ -0,0 +1,1091 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) <2010> Sebastian Dröge + * Copyright (C) <2011> Youness Alaoui + * + * 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 was (probably) generated from gstvideoflip.c, + * gstvideoflip.c,v 1.7 2003/11/08 02:48:59 dschleef Exp + */ +/** + * SECTION:element-videoflip + * + * Flips and rotates video. + * + * + * Example launch line + * |[ + * gst-launch videotestsrc ! videoflip method=clockwise ! ffmpegcolorspace ! ximagesink + * ]| This pipeline flips the test image 90 degrees clockwise. + * + * + * Last reviewed on 2010-04-18 (0.10.22) + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvideoflip.h" + +#include +#include +#include +#include + +/* GstVideoFlip properties */ +enum +{ + PROP_0, + PROP_METHOD + /* FILL ME */ +}; + +#define PROP_METHOD_DEFAULT GST_VIDEO_FLIP_METHOD_IDENTITY + +GST_DEBUG_CATEGORY_STATIC (video_flip_debug); +#define GST_CAT_DEFAULT video_flip_debug + +static GstStaticPadTemplate gst_video_flip_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") + + ) + ); + +static GstStaticPadTemplate gst_video_flip_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" + GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" + GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" + GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" + GST_VIDEO_CAPS_YUV ("I420") ";" + GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") + ) + ); + +#define GST_TYPE_VIDEO_FLIP_METHOD (gst_video_flip_method_get_type()) + +static const GEnumValue video_flip_methods[] = { + {GST_VIDEO_FLIP_METHOD_IDENTITY, "Identity (no rotation)", "none"}, + {GST_VIDEO_FLIP_METHOD_90R, "Rotate clockwise 90 degrees", "clockwise"}, + {GST_VIDEO_FLIP_METHOD_180, "Rotate 180 degrees", "rotate-180"}, + {GST_VIDEO_FLIP_METHOD_90L, "Rotate counter-clockwise 90 degrees", + "counterclockwise"}, + {GST_VIDEO_FLIP_METHOD_HORIZ, "Flip horizontally", "horizontal-flip"}, + {GST_VIDEO_FLIP_METHOD_VERT, "Flip vertically", "vertical-flip"}, + {GST_VIDEO_FLIP_METHOD_TRANS, + "Flip across upper left/lower right diagonal", "upper-left-diagonal"}, + {GST_VIDEO_FLIP_METHOD_OTHER, + "Flip across upper right/lower left diagonal", "upper-right-diagonal"}, + {0, NULL, NULL}, +}; + +static GType +gst_video_flip_method_get_type (void) +{ + static GType video_flip_method_type = 0; + + if (!video_flip_method_type) { + video_flip_method_type = g_enum_register_static ("GstVideoFlipMethod", + video_flip_methods); + } + return video_flip_method_type; +} + +GST_BOILERPLATE (GstVideoFlip, gst_video_flip, GstVideoFilter, + GST_TYPE_VIDEO_FILTER); + +static GstCaps * +gst_video_flip_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps) +{ + GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans); + GstCaps *ret; + gint width, height, i; + + ret = gst_caps_copy (caps); + + for (i = 0; i < gst_caps_get_size (ret); i++) { + GstStructure *structure = gst_caps_get_structure (ret, i); + gint par_n, par_d; + + if (gst_structure_get_int (structure, "width", &width) && + gst_structure_get_int (structure, "height", &height)) { + + switch (videoflip->method) { + case GST_VIDEO_FLIP_METHOD_90R: + case GST_VIDEO_FLIP_METHOD_90L: + case GST_VIDEO_FLIP_METHOD_TRANS: + case GST_VIDEO_FLIP_METHOD_OTHER: + gst_structure_set (structure, "width", G_TYPE_INT, height, + "height", G_TYPE_INT, width, NULL); + if (gst_structure_get_fraction (structure, "pixel-aspect-ratio", + &par_n, &par_d)) { + if (par_n != 1 || par_d != 1) { + GValue val = { 0, }; + + g_value_init (&val, GST_TYPE_FRACTION); + gst_value_set_fraction (&val, par_d, par_n); + gst_structure_set_value (structure, "pixel-aspect-ratio", &val); + g_value_unset (&val); + } + } + break; + case GST_VIDEO_FLIP_METHOD_IDENTITY: + case GST_VIDEO_FLIP_METHOD_180: + case GST_VIDEO_FLIP_METHOD_HORIZ: + case GST_VIDEO_FLIP_METHOD_VERT: + gst_structure_set (structure, "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, NULL); + break; + default: + g_assert_not_reached (); + break; + } + } + } + + GST_DEBUG_OBJECT (videoflip, "transformed %" GST_PTR_FORMAT " to %" + GST_PTR_FORMAT, caps, ret); + + return ret; +} + +static gboolean +gst_video_flip_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, + guint * size) +{ + GstVideoFormat format; + gint width, height; + + if (!gst_video_format_parse_caps (caps, &format, &width, &height)) + return FALSE; + + *size = gst_video_format_get_size (format, width, height); + + GST_DEBUG_OBJECT (btrans, "our frame size is %d bytes (%dx%d)", *size, + width, height); + + return TRUE; +} + +static void +gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest, + const guint8 * src) +{ + gint x, y; + guint8 const *s; + guint8 *d; + GstVideoFormat format = videoflip->format; + gint sw = videoflip->from_width; + gint sh = videoflip->from_height; + gint dw = videoflip->to_width; + gint dh = videoflip->to_height; + gint src_y_stride, src_u_stride, src_v_stride; + gint src_y_offset, src_u_offset, src_v_offset; + gint src_y_height, src_u_height, src_v_height; + gint src_y_width, src_u_width, src_v_width; + gint dest_y_stride, dest_u_stride, dest_v_stride; + gint dest_y_offset, dest_u_offset, dest_v_offset; + gint dest_y_height, dest_u_height, dest_v_height; + gint dest_y_width, dest_u_width, dest_v_width; + + src_y_stride = gst_video_format_get_row_stride (format, 0, sw); + src_u_stride = gst_video_format_get_row_stride (format, 1, sw); + src_v_stride = gst_video_format_get_row_stride (format, 2, sw); + + dest_y_stride = gst_video_format_get_row_stride (format, 0, dw); + dest_u_stride = gst_video_format_get_row_stride (format, 1, dw); + dest_v_stride = gst_video_format_get_row_stride (format, 2, dw); + + src_y_offset = gst_video_format_get_component_offset (format, 0, sw, sh); + src_u_offset = gst_video_format_get_component_offset (format, 1, sw, sh); + src_v_offset = gst_video_format_get_component_offset (format, 2, sw, sh); + + dest_y_offset = gst_video_format_get_component_offset (format, 0, dw, dh); + dest_u_offset = gst_video_format_get_component_offset (format, 1, dw, dh); + dest_v_offset = gst_video_format_get_component_offset (format, 2, dw, dh); + + src_y_width = gst_video_format_get_component_width (format, 0, sw); + src_u_width = gst_video_format_get_component_width (format, 1, sw); + src_v_width = gst_video_format_get_component_width (format, 2, sw); + + dest_y_width = gst_video_format_get_component_width (format, 0, dw); + dest_u_width = gst_video_format_get_component_width (format, 1, dw); + dest_v_width = gst_video_format_get_component_width (format, 2, dw); + + src_y_height = gst_video_format_get_component_height (format, 0, sh); + src_u_height = gst_video_format_get_component_height (format, 1, sh); + src_v_height = gst_video_format_get_component_height (format, 2, sh); + + dest_y_height = gst_video_format_get_component_height (format, 0, dh); + dest_u_height = gst_video_format_get_component_height (format, 1, dh); + dest_v_height = gst_video_format_get_component_height (format, 2, dh); + + switch (videoflip->method) { + case GST_VIDEO_FLIP_METHOD_90R: + /* Flip Y */ + s = src + src_y_offset; + d = dest + dest_y_offset; + for (y = 0; y < dest_y_height; y++) { + for (x = 0; x < dest_y_width; x++) { + d[y * dest_y_stride + x] = + s[(src_y_height - 1 - x) * src_y_stride + y]; + } + } + /* Flip U */ + s = src + src_u_offset; + d = dest + dest_u_offset; + for (y = 0; y < dest_u_height; y++) { + for (x = 0; x < dest_u_width; x++) { + d[y * dest_u_stride + x] = + s[(src_u_height - 1 - x) * src_u_stride + y]; + } + } + /* Flip V */ + s = src + src_v_offset; + d = dest + dest_v_offset; + for (y = 0; y < dest_v_height; y++) { + for (x = 0; x < dest_v_width; x++) { + d[y * dest_v_stride + x] = + s[(src_v_height - 1 - x) * src_v_stride + y]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_90L: + /* Flip Y */ + s = src + src_y_offset; + d = dest + dest_y_offset; + for (y = 0; y < dest_y_height; y++) { + for (x = 0; x < dest_y_width; x++) { + d[y * dest_y_stride + x] = + s[x * src_y_stride + (src_y_width - 1 - y)]; + } + } + /* Flip U */ + s = src + src_u_offset; + d = dest + dest_u_offset; + for (y = 0; y < dest_u_height; y++) { + for (x = 0; x < dest_u_width; x++) { + d[y * dest_u_stride + x] = + s[x * src_u_stride + (src_u_width - 1 - y)]; + } + } + /* Flip V */ + s = src + src_v_offset; + d = dest + dest_v_offset; + for (y = 0; y < dest_v_height; y++) { + for (x = 0; x < dest_v_width; x++) { + d[y * dest_v_stride + x] = + s[x * src_v_stride + (src_v_width - 1 - y)]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_180: + /* Flip Y */ + s = src + src_y_offset; + d = dest + dest_y_offset; + for (y = 0; y < dest_y_height; y++) { + for (x = 0; x < dest_y_width; x++) { + d[y * dest_y_stride + x] = + s[(src_y_height - 1 - y) * src_y_stride + (src_y_width - 1 - x)]; + } + } + /* Flip U */ + s = src + src_u_offset; + d = dest + dest_u_offset; + for (y = 0; y < dest_u_height; y++) { + for (x = 0; x < dest_u_width; x++) { + d[y * dest_u_stride + x] = + s[(src_u_height - 1 - y) * src_u_stride + (src_u_width - 1 - x)]; + } + } + /* Flip V */ + s = src + src_v_offset; + d = dest + dest_v_offset; + for (y = 0; y < dest_v_height; y++) { + for (x = 0; x < dest_v_width; x++) { + d[y * dest_v_stride + x] = + s[(src_v_height - 1 - y) * src_v_stride + (src_v_width - 1 - x)]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_HORIZ: + /* Flip Y */ + s = src + src_y_offset; + d = dest + dest_y_offset; + for (y = 0; y < dest_y_height; y++) { + for (x = 0; x < dest_y_width; x++) { + d[y * dest_y_stride + x] = + s[y * src_y_stride + (src_y_width - 1 - x)]; + } + } + /* Flip U */ + s = src + src_u_offset; + d = dest + dest_u_offset; + for (y = 0; y < dest_u_height; y++) { + for (x = 0; x < dest_u_width; x++) { + d[y * dest_u_stride + x] = + s[y * src_u_stride + (src_u_width - 1 - x)]; + } + } + /* Flip V */ + s = src + src_v_offset; + d = dest + dest_v_offset; + for (y = 0; y < dest_v_height; y++) { + for (x = 0; x < dest_v_width; x++) { + d[y * dest_v_stride + x] = + s[y * src_v_stride + (src_v_width - 1 - x)]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_VERT: + /* Flip Y */ + s = src + src_y_offset; + d = dest + dest_y_offset; + for (y = 0; y < dest_y_height; y++) { + for (x = 0; x < dest_y_width; x++) { + d[y * dest_y_stride + x] = + s[(src_y_height - 1 - y) * src_y_stride + x]; + } + } + /* Flip U */ + s = src + src_u_offset; + d = dest + dest_u_offset; + for (y = 0; y < dest_u_height; y++) { + for (x = 0; x < dest_u_width; x++) { + d[y * dest_u_stride + x] = + s[(src_u_height - 1 - y) * src_u_stride + x]; + } + } + /* Flip V */ + s = src + src_v_offset; + d = dest + dest_v_offset; + for (y = 0; y < dest_v_height; y++) { + for (x = 0; x < dest_v_width; x++) { + d[y * dest_v_stride + x] = + s[(src_v_height - 1 - y) * src_v_stride + x]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_TRANS: + /* Flip Y */ + s = src + src_y_offset; + d = dest + dest_y_offset; + for (y = 0; y < dest_y_height; y++) { + for (x = 0; x < dest_y_width; x++) { + d[y * dest_y_stride + x] = s[x * src_y_stride + y]; + } + } + /* Flip U */ + s = src + src_u_offset; + d = dest + dest_u_offset; + for (y = 0; y < dest_u_height; y++) { + for (x = 0; x < dest_u_width; x++) { + d[y * dest_u_stride + x] = s[x * src_u_stride + y]; + } + } + /* Flip V */ + s = src + src_v_offset; + d = dest + dest_v_offset; + for (y = 0; y < dest_u_height; y++) { + for (x = 0; x < dest_u_width; x++) { + d[y * dest_v_stride + x] = s[x * src_v_stride + y]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_OTHER: + /* Flip Y */ + s = src + src_y_offset; + d = dest + dest_y_offset; + for (y = 0; y < dest_y_height; y++) { + for (x = 0; x < dest_y_width; x++) { + d[y * dest_y_stride + x] = + s[(src_y_height - 1 - x) * src_y_stride + (src_y_width - 1 - y)]; + } + } + /* Flip U */ + s = src + src_u_offset; + d = dest + dest_u_offset; + for (y = 0; y < dest_u_height; y++) { + for (x = 0; x < dest_u_width; x++) { + d[y * dest_u_stride + x] = + s[(src_u_height - 1 - x) * src_u_stride + (src_u_width - 1 - y)]; + } + } + /* Flip V */ + s = src + src_v_offset; + d = dest + dest_v_offset; + for (y = 0; y < dest_v_height; y++) { + for (x = 0; x < dest_v_width; x++) { + d[y * dest_v_stride + x] = + s[(src_v_height - 1 - x) * src_v_stride + (src_v_width - 1 - y)]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_IDENTITY: + g_assert_not_reached (); + break; + default: + g_assert_not_reached (); + break; + } +} + +static void +gst_video_flip_packed_simple (GstVideoFlip * videoflip, guint8 * dest, + const guint8 * src) +{ + gint x, y, z; + guint8 const *s = src; + guint8 *d = dest; + GstVideoFormat format = videoflip->format; + gint sw = videoflip->from_width; + gint sh = videoflip->from_height; + gint dw = videoflip->to_width; + gint dh = videoflip->to_height; + gint src_stride, dest_stride; + gint bpp; + + src_stride = gst_video_format_get_row_stride (format, 0, sw); + dest_stride = gst_video_format_get_row_stride (format, 0, dw); + /* This is only true for non-subsampled formats! */ + bpp = gst_video_format_get_pixel_stride (format, 0); + + switch (videoflip->method) { + case GST_VIDEO_FLIP_METHOD_90R: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x++) { + for (z = 0; z < bpp; z++) { + d[y * dest_stride + x * bpp + z] = + s[(sh - 1 - x) * src_stride + y * bpp + z]; + } + } + } + break; + case GST_VIDEO_FLIP_METHOD_90L: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x++) { + for (z = 0; z < bpp; z++) { + d[y * dest_stride + x * bpp + z] = + s[x * src_stride + (sw - 1 - y) * bpp + z]; + } + } + } + break; + case GST_VIDEO_FLIP_METHOD_180: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x++) { + for (z = 0; z < bpp; z++) { + d[y * dest_stride + x * bpp + z] = + s[(sh - 1 - y) * src_stride + (sw - 1 - x) * bpp + z]; + } + } + } + break; + case GST_VIDEO_FLIP_METHOD_HORIZ: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x++) { + for (z = 0; z < bpp; z++) { + d[y * dest_stride + x * bpp + z] = + s[y * src_stride + (sw - 1 - x) * bpp + z]; + } + } + } + break; + case GST_VIDEO_FLIP_METHOD_VERT: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x++) { + for (z = 0; z < bpp; z++) { + d[y * dest_stride + x * bpp + z] = + s[(sh - 1 - y) * src_stride + x * bpp + z]; + } + } + } + break; + case GST_VIDEO_FLIP_METHOD_TRANS: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x++) { + for (z = 0; z < bpp; z++) { + d[y * dest_stride + x * bpp + z] = s[x * src_stride + y * bpp + z]; + } + } + } + break; + case GST_VIDEO_FLIP_METHOD_OTHER: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x++) { + for (z = 0; z < bpp; z++) { + d[y * dest_stride + x * bpp + z] = + s[(sh - 1 - x) * src_stride + (sw - 1 - y) * bpp + z]; + } + } + } + break; + case GST_VIDEO_FLIP_METHOD_IDENTITY: + g_assert_not_reached (); + break; + default: + g_assert_not_reached (); + break; + } +} + + +static void +gst_video_flip_y422 (GstVideoFlip * videoflip, guint8 * dest, + const guint8 * src) +{ + gint x, y; + guint8 const *s = src; + guint8 *d = dest; + GstVideoFormat format = videoflip->format; + gint sw = videoflip->from_width; + gint sh = videoflip->from_height; + gint dw = videoflip->to_width; + gint dh = videoflip->to_height; + gint src_stride, dest_stride; + gint bpp; + gint y_offset; + gint u_offset; + gint v_offset; + gint y_stride; + + src_stride = gst_video_format_get_row_stride (format, 0, sw); + dest_stride = gst_video_format_get_row_stride (format, 0, dw); + + y_offset = gst_video_format_get_component_offset (format, 0, sw, sh); + u_offset = gst_video_format_get_component_offset (format, 1, sw, sh); + v_offset = gst_video_format_get_component_offset (format, 2, sw, sh); + y_stride = gst_video_format_get_pixel_stride (format, 0); + bpp = y_stride; + + switch (videoflip->method) { + case GST_VIDEO_FLIP_METHOD_90R: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x += 2) { + guint8 u; + guint8 v; + /* u/v must be calculated using the offset of the even column */ + gint even_y = (y & ~1); + + u = s[(sh - 1 - x) * src_stride + even_y * bpp + u_offset]; + if (x + 1 < dw) + u = (s[(sh - 1 - (x + 1)) * src_stride + even_y * bpp + u_offset] + + u) >> 1; + v = s[(sh - 1 - x) * src_stride + even_y * bpp + v_offset]; + if (x + 1 < dw) + v = (s[(sh - 1 - (x + 1)) * src_stride + even_y * bpp + v_offset] + + v) >> 1; + + d[y * dest_stride + x * bpp + u_offset] = u; + d[y * dest_stride + x * bpp + v_offset] = v; + d[y * dest_stride + x * bpp + y_offset] = + s[(sh - 1 - x) * src_stride + y * bpp + y_offset]; + if (x + 1 < dw) + d[y * dest_stride + (x + 1) * bpp + y_offset] = + s[(sh - 1 - (x + 1)) * src_stride + y * bpp + y_offset]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_90L: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x += 2) { + guint8 u; + guint8 v; + /* u/v must be calculated using the offset of the even column */ + gint even_y = ((sw - 1 - y) & ~1); + + u = s[x * src_stride + even_y * bpp + u_offset]; + if (x + 1 < dw) + u = (s[(x + 1) * src_stride + even_y * bpp + u_offset] + u) >> 1; + v = s[x * src_stride + even_y * bpp + v_offset]; + if (x + 1 < dw) + v = (s[(x + 1) * src_stride + even_y * bpp + v_offset] + v) >> 1; + + d[y * dest_stride + x * bpp + u_offset] = u; + d[y * dest_stride + x * bpp + v_offset] = v; + d[y * dest_stride + x * bpp + y_offset] = + s[x * src_stride + (sw - 1 - y) * bpp + y_offset]; + if (x + 1 < dw) + d[y * dest_stride + (x + 1) * bpp + y_offset] = + s[(x + 1) * src_stride + (sw - 1 - y) * bpp + y_offset]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_180: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x += 2) { + guint8 u; + guint8 v; + /* u/v must be calculated using the offset of the even column */ + gint even_x = ((sw - 1 - x) & ~1); + + u = (s[(sh - 1 - y) * src_stride + even_x * bpp + u_offset] + + s[(sh - 1 - y) * src_stride + even_x * bpp + u_offset]) / 2; + v = (s[(sh - 1 - y) * src_stride + even_x * bpp + v_offset] + + s[(sh - 1 - y) * src_stride + even_x * bpp + v_offset]) / 2; + + d[y * dest_stride + x * bpp + u_offset] = u; + d[y * dest_stride + x * bpp + v_offset] = v; + d[y * dest_stride + x * bpp + y_offset] = + s[(sh - 1 - y) * src_stride + (sw - 1 - x) * bpp + y_offset]; + if (x + 1 < dw) + d[y * dest_stride + (x + 1) * bpp + y_offset] = + s[(sh - 1 - y) * src_stride + (sw - 1 - (x + 1)) * bpp + + y_offset]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_HORIZ: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x += 2) { + guint8 u; + guint8 v; + /* u/v must be calculated using the offset of the even column */ + gint even_x = ((sw - 1 - x) & ~1); + + u = (s[y * src_stride + even_x * bpp + u_offset] + + s[y * src_stride + even_x * bpp + u_offset]) / 2; + v = (s[y * src_stride + even_x * bpp + v_offset] + + s[y * src_stride + even_x * bpp + v_offset]) / 2; + + d[y * dest_stride + x * bpp + u_offset] = u; + d[y * dest_stride + x * bpp + v_offset] = v; + d[y * dest_stride + x * bpp + y_offset] = + s[y * src_stride + (sw - 1 - x) * bpp + y_offset]; + if (x + 1 < dw) + d[y * dest_stride + (x + 1) * bpp + y_offset] = + s[y * src_stride + (sw - 1 - (x + 1)) * bpp + y_offset]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_VERT: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x += 2) { + guint8 u; + guint8 v; + /* u/v must be calculated using the offset of the even column */ + gint even_x = (x & ~1); + + u = (s[(sh - 1 - y) * src_stride + even_x * bpp + u_offset] + + s[(sh - 1 - y) * src_stride + even_x * bpp + u_offset]) / 2; + v = (s[(sh - 1 - y) * src_stride + even_x * bpp + v_offset] + + s[(sh - 1 - y) * src_stride + even_x * bpp + v_offset]) / 2; + + d[y * dest_stride + x * bpp + u_offset] = u; + d[y * dest_stride + x * bpp + v_offset] = v; + d[y * dest_stride + x * bpp + y_offset] = + s[(sh - 1 - y) * src_stride + x * bpp + y_offset]; + if (x + 1 < dw) + d[y * dest_stride + (x + 1) * bpp + y_offset] = + s[(sh - 1 - y) * src_stride + (x + 1) * bpp + y_offset]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_TRANS: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x += 2) { + guint8 u; + guint8 v; + /* u/v must be calculated using the offset of the even column */ + gint even_y = (y & ~1); + + u = s[x * src_stride + even_y * bpp + u_offset]; + if (x + 1 < dw) + u = (s[(x + 1) * src_stride + even_y * bpp + u_offset] + u) >> 1; + v = s[x * src_stride + even_y * bpp + v_offset]; + if (x + 1 < dw) + v = (s[(x + 1) * src_stride + even_y * bpp + v_offset] + v) >> 1; + + d[y * dest_stride + x * bpp + u_offset] = u; + d[y * dest_stride + x * bpp + v_offset] = v; + d[y * dest_stride + x * bpp + y_offset] = + s[x * src_stride + y * bpp + y_offset]; + if (x + 1 < dw) + d[y * dest_stride + (x + 1) * bpp + y_offset] = + s[(x + 1) * src_stride + y * bpp + y_offset]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_OTHER: + for (y = 0; y < dh; y++) { + for (x = 0; x < dw; x += 2) { + guint8 u; + guint8 v; + /* u/v must be calculated using the offset of the even column */ + gint even_y = ((sw - 1 - y) & ~1); + + u = s[(sh - 1 - x) * src_stride + even_y * bpp + u_offset]; + if (x + 1 < dw) + u = (s[(sh - 1 - (x + 1)) * src_stride + even_y * bpp + u_offset] + + u) >> 1; + v = s[(sh - 1 - x) * src_stride + even_y * bpp + v_offset]; + if (x + 1 < dw) + v = (s[(sh - 1 - (x + 1)) * src_stride + even_y * bpp + v_offset] + + v) >> 1; + + d[y * dest_stride + x * bpp + u_offset] = u; + d[y * dest_stride + x * bpp + v_offset] = v; + d[y * dest_stride + x * bpp + y_offset] = + s[(sh - 1 - x) * src_stride + (sw - 1 - y) * bpp + y_offset]; + if (x + 1 < dw) + d[y * dest_stride + (x + 1) * bpp + y_offset] = + s[(sh - 1 - (x + 1)) * src_stride + (sw - 1 - y) * bpp + + y_offset]; + } + } + break; + case GST_VIDEO_FLIP_METHOD_IDENTITY: + g_assert_not_reached (); + break; + default: + g_assert_not_reached (); + break; + } +} + + +static gboolean +gst_video_flip_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstVideoFlip *vf = GST_VIDEO_FLIP (btrans); + GstVideoFormat in_format, out_format; + gboolean ret = FALSE; + + vf->process = NULL; + + if (!gst_video_format_parse_caps (incaps, &in_format, &vf->from_width, + &vf->from_height) + || !gst_video_format_parse_caps (outcaps, &out_format, &vf->to_width, + &vf->to_height)) + goto invalid_caps; + + if (in_format != out_format) + goto invalid_caps; + vf->format = in_format; + + /* Check that they are correct */ + switch (vf->method) { + case GST_VIDEO_FLIP_METHOD_90R: + case GST_VIDEO_FLIP_METHOD_90L: + case GST_VIDEO_FLIP_METHOD_TRANS: + case GST_VIDEO_FLIP_METHOD_OTHER: + if ((vf->from_width != vf->to_height) || + (vf->from_height != vf->to_width)) { + GST_ERROR_OBJECT (vf, "we are inverting width and height but caps " + "are not correct : %dx%d to %dx%d", vf->from_width, + vf->from_height, vf->to_width, vf->to_height); + goto beach; + } + break; + case GST_VIDEO_FLIP_METHOD_IDENTITY: + + break; + case GST_VIDEO_FLIP_METHOD_180: + case GST_VIDEO_FLIP_METHOD_HORIZ: + case GST_VIDEO_FLIP_METHOD_VERT: + if ((vf->from_width != vf->to_width) || + (vf->from_height != vf->to_height)) { + GST_ERROR_OBJECT (vf, "we are keeping width and height but caps " + "are not correct : %dx%d to %dx%d", vf->from_width, + vf->from_height, vf->to_width, vf->to_height); + goto beach; + } + break; + default: + g_assert_not_reached (); + break; + } + + ret = TRUE; + + switch (vf->format) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_Y444: + vf->process = gst_video_flip_planar_yuv; + break; + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_UYVY: + case GST_VIDEO_FORMAT_YVYU: + vf->process = gst_video_flip_y422; + break; + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_xRGB: + case GST_VIDEO_FORMAT_xBGR: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + vf->process = gst_video_flip_packed_simple; + break; + default: + break; + } + +beach: + return ret && (vf->process != NULL); + +invalid_caps: + GST_ERROR_OBJECT (vf, "Invalid caps: %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, + incaps, outcaps); + return FALSE; +} + +static void +gst_video_flip_before_transform (GstBaseTransform * trans, GstBuffer * in) +{ + GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans); + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_TIMESTAMP (in); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + GST_DEBUG_OBJECT (videoflip, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (timestamp)); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (videoflip), stream_time); +} + +static GstFlowReturn +gst_video_flip_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) +{ + GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans); + guint8 *dest; + const guint8 *src; + + if (G_UNLIKELY (videoflip->process == NULL)) + goto not_negotiated; + + src = GST_BUFFER_DATA (in); + dest = GST_BUFFER_DATA (out); + + GST_LOG_OBJECT (videoflip, "videoflip: flipping %dx%d to %dx%d (%s)", + videoflip->from_width, videoflip->from_height, videoflip->to_width, + videoflip->to_height, video_flip_methods[videoflip->method].value_nick); + + GST_OBJECT_LOCK (videoflip); + videoflip->process (videoflip, dest, src); + GST_OBJECT_UNLOCK (videoflip); + + return GST_FLOW_OK; + +not_negotiated: + GST_ERROR_OBJECT (videoflip, "Not negotiated yet"); + return GST_FLOW_NOT_NEGOTIATED; +} + +static gboolean +gst_video_flip_src_event (GstBaseTransform * trans, GstEvent * event) +{ + GstVideoFlip *vf = GST_VIDEO_FLIP (trans); + gdouble new_x, new_y, x, y; + GstStructure *structure; + gboolean ret; + + GST_DEBUG_OBJECT (vf, "handling %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NAVIGATION: + event = + GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event))); + + structure = (GstStructure *) gst_event_get_structure (event); + if (gst_structure_get_double (structure, "pointer_x", &x) && + gst_structure_get_double (structure, "pointer_y", &y)) { + GST_DEBUG_OBJECT (vf, "converting %fx%f", x, y); + switch (vf->method) { + case GST_VIDEO_FLIP_METHOD_90R: + new_x = y; + new_y = vf->to_width - x; + break; + case GST_VIDEO_FLIP_METHOD_90L: + new_x = vf->to_height - y; + new_y = x; + break; + case GST_VIDEO_FLIP_METHOD_OTHER: + new_x = vf->to_height - y; + new_y = vf->to_width - x; + break; + case GST_VIDEO_FLIP_METHOD_TRANS: + new_x = y; + new_y = x; + break; + case GST_VIDEO_FLIP_METHOD_180: + new_x = vf->to_width - x; + new_y = vf->to_height - y; + break; + case GST_VIDEO_FLIP_METHOD_HORIZ: + new_x = vf->to_width - x; + new_y = y; + break; + case GST_VIDEO_FLIP_METHOD_VERT: + new_x = x; + new_y = vf->to_height - y; + break; + default: + new_x = x; + new_y = y; + break; + } + GST_DEBUG_OBJECT (vf, "to %fx%f", new_x, new_y); + gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, new_x, + "pointer_y", G_TYPE_DOUBLE, new_y, NULL); + } + break; + default: + break; + } + + ret = GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, event); + + return ret; +} + +static void +gst_video_flip_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideoFlip *videoflip = GST_VIDEO_FLIP (object); + + switch (prop_id) { + case PROP_METHOD: + { + GstVideoFlipMethod method; + + method = g_value_get_enum (value); + GST_OBJECT_LOCK (videoflip); + if (method != videoflip->method) { + GstBaseTransform *btrans = GST_BASE_TRANSFORM (videoflip); + + GST_DEBUG_OBJECT (videoflip, "Changing method from %s to %s", + video_flip_methods[videoflip->method].value_nick, + video_flip_methods[method].value_nick); + + videoflip->method = method; + GST_OBJECT_UNLOCK (videoflip); + + gst_base_transform_set_passthrough (btrans, + method == GST_VIDEO_FLIP_METHOD_IDENTITY); + gst_base_transform_reconfigure (btrans); + } else { + GST_OBJECT_UNLOCK (videoflip); + } + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_video_flip_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVideoFlip *videoflip = GST_VIDEO_FLIP (object); + + switch (prop_id) { + case PROP_METHOD: + g_value_set_enum (value, videoflip->method); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_video_flip_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Video flipper", + "Filter/Effect/Video", + "Flips and rotates video", "David Schleef "); + + gst_element_class_add_static_pad_template (element_class, + &gst_video_flip_sink_template); + gst_element_class_add_static_pad_template (element_class, + &gst_video_flip_src_template); +} + +static void +gst_video_flip_class_init (GstVideoFlipClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + + GST_DEBUG_CATEGORY_INIT (video_flip_debug, "videoflip", 0, "videoflip"); + + gobject_class->set_property = gst_video_flip_set_property; + gobject_class->get_property = gst_video_flip_get_property; + + g_object_class_install_property (gobject_class, PROP_METHOD, + g_param_spec_enum ("method", "method", "method", + GST_TYPE_VIDEO_FLIP_METHOD, PROP_METHOD_DEFAULT, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_video_flip_transform_caps); + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_flip_set_caps); + trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_video_flip_get_unit_size); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_video_flip_transform); + trans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_video_flip_before_transform); + trans_class->src_event = GST_DEBUG_FUNCPTR (gst_video_flip_src_event); +} + +static void +gst_video_flip_init (GstVideoFlip * videoflip, GstVideoFlipClass * klass) +{ + videoflip->method = PROP_METHOD_DEFAULT; + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (videoflip), TRUE); +} diff --git a/gst/videofilter/gstvideoflip.h b/gst/videofilter/gstvideoflip.h new file mode 100644 index 0000000..a998fa7 --- /dev/null +++ b/gst/videofilter/gstvideoflip.h @@ -0,0 +1,92 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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_VIDEO_FLIP_H__ +#define __GST_VIDEO_FLIP_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +/** + * GstVideoFlipMethod: + * @GST_VIDEO_FLIP_METHOD_IDENTITY: Identity (no rotation) + * @GST_VIDEO_FLIP_METHOD_90R: Rotate clockwise 90 degrees + * @GST_VIDEO_FLIP_METHOD_180: Rotate 180 degrees + * @GST_VIDEO_FLIP_METHOD_90L: Rotate counter-clockwise 90 degrees + * @GST_VIDEO_FLIP_METHOD_HORIZ: Flip horizontally + * @GST_VIDEO_FLIP_METHOD_VERT: Flip vertically + * @GST_VIDEO_FLIP_METHOD_TRANS: Flip across upper left/lower right diagonal + * @GST_VIDEO_FLIP_METHOD_OTHER: Flip across upper right/lower left diagonal + * + * The different flip methods. + */ +typedef enum { + GST_VIDEO_FLIP_METHOD_IDENTITY, + GST_VIDEO_FLIP_METHOD_90R, + GST_VIDEO_FLIP_METHOD_180, + GST_VIDEO_FLIP_METHOD_90L, + GST_VIDEO_FLIP_METHOD_HORIZ, + GST_VIDEO_FLIP_METHOD_VERT, + GST_VIDEO_FLIP_METHOD_TRANS, + GST_VIDEO_FLIP_METHOD_OTHER +} GstVideoFlipMethod; + +#define GST_TYPE_VIDEO_FLIP \ + (gst_video_flip_get_type()) +#define GST_VIDEO_FLIP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_FLIP,GstVideoFlip)) +#define GST_VIDEO_FLIP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_FLIP,GstVideoFlipClass)) +#define GST_IS_VIDEO_FLIP(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_FLIP)) +#define GST_IS_VIDEO_FLIP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_FLIP)) + +typedef struct _GstVideoFlip GstVideoFlip; +typedef struct _GstVideoFlipClass GstVideoFlipClass; + +/** + * GstVideoFlip: + * + * Opaque datastructure. + */ +struct _GstVideoFlip { + GstVideoFilter videofilter; + + /* < private > */ + GstVideoFormat format; + gint from_width, from_height; + gint to_width, to_height; + + GstVideoFlipMethod method; + void (*process) (GstVideoFlip *videoflip, guint8 *dest, const guint8 *src); +}; + +struct _GstVideoFlipClass { + GstVideoFilterClass parent_class; +}; + +GType gst_video_flip_get_type (void); + +G_END_DECLS + +#endif /* __GST_VIDEO_FLIP_H__ */ diff --git a/gst/videofilter/gstvideotemplate.c b/gst/videofilter/gstvideotemplate.c new file mode 100644 index 0000000..3b8882a --- /dev/null +++ b/gst/videofilter/gstvideotemplate.c @@ -0,0 +1,253 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * + * 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 was (probably) generated from + * $Id$ + * and + * MAKEFILTERVERSION + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#define GST_TYPE_VIDEOTEMPLATE \ + (gst_videotemplate_get_type()) +#define GST_VIDEOTEMPLATE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEOTEMPLATE,GstVideotemplate)) +#define GST_VIDEOTEMPLATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEOTEMPLATE,GstVideotemplateClass)) +#define GST_IS_VIDEOTEMPLATE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEOTEMPLATE)) +#define GST_IS_VIDEOTEMPLATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEOTEMPLATE)) + +typedef struct _GstVideotemplate GstVideotemplate; +typedef struct _GstVideotemplateClass GstVideotemplateClass; + +struct _GstVideotemplate +{ + GstVideofilter videofilter; + +}; + +struct _GstVideotemplateClass +{ + GstVideofilterClass parent_class; +}; + + +/* GstVideotemplate signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0 + /* FILL ME */ +}; + +static void gst_videotemplate_base_init (gpointer g_class); +static void gst_videotemplate_class_init (gpointer g_class, + gpointer class_data); +static void gst_videotemplate_init (GTypeInstance * instance, gpointer g_class); + +static void gst_videotemplate_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_videotemplate_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_videotemplate_planar411 (GstVideofilter * videofilter, + void *dest, void *src); +static void gst_videotemplate_setup (GstVideofilter * videofilter); + +GType +gst_videotemplate_get_type (void) +{ + static GType videotemplate_type = 0; + + if (!videotemplate_type) { + static const GTypeInfo videotemplate_info = { + sizeof (GstVideotemplateClass), + gst_videotemplate_base_init, + NULL, + gst_videotemplate_class_init, + NULL, + NULL, + sizeof (GstVideotemplate), + 0, + gst_videotemplate_init, + }; + + videotemplate_type = g_type_register_static (GST_TYPE_VIDEOFILTER, + "GstVideotemplate", &videotemplate_info, 0); + } + return videotemplate_type; +} + +static GstVideofilterFormat gst_videotemplate_formats[] = { + {"I420", 12, gst_videotemplate_planar411,}, +}; + + +static void +gst_videotemplate_base_init (gpointer g_class) +{ + + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); + int i; + + gst_element_class_set_details_simple (element_class, "Video filter template", + "Filter/Effect/Video", + "Template for a video filter", "David Schleef "); + + for (i = 0; i < G_N_ELEMENTS (gst_videotemplate_formats); i++) { + gst_videofilter_class_add_format (videofilter_class, + gst_videotemplate_formats + i); + } + + gst_videofilter_class_add_pad_templates (GST_VIDEOFILTER_CLASS (g_class)); +} + +static void +gst_videotemplate_class_init (gpointer g_class, gpointer class_data) +{ + GObjectClass *gobject_class; + GstVideofilterClass *videofilter_class; + + gobject_class = G_OBJECT_CLASS (g_class); + videofilter_class = GST_VIDEOFILTER_CLASS (g_class); + +#if 0 + g_object_class_install_property (gobject_class, ARG_METHOD, + g_param_spec_enum ("method", "method", "method", + GST_TYPE_VIDEOTEMPLATE_METHOD, GST_VIDEOTEMPLATE_METHOD_1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +#endif + + gobject_class->set_property = gst_videotemplate_set_property; + gobject_class->get_property = gst_videotemplate_get_property; + + videofilter_class->setup = gst_videotemplate_setup; +} + +static void +gst_videotemplate_init (GTypeInstance * instance, gpointer g_class) +{ + GstVideotemplate *videotemplate = GST_VIDEOTEMPLATE (instance); + GstVideofilter *videofilter; + + GST_DEBUG ("gst_videotemplate_init"); + + videofilter = GST_VIDEOFILTER (videotemplate); + + /* do stuff */ +} + +static void +gst_videotemplate_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideotemplate *src; + + g_return_if_fail (GST_IS_VIDEOTEMPLATE (object)); + src = GST_VIDEOTEMPLATE (object); + + GST_DEBUG ("gst_videotemplate_set_property"); + switch (prop_id) { +#if 0 + case ARG_METHOD: + src->method = g_value_get_enum (value); + break; +#endif + default: + break; + } +} + +static void +gst_videotemplate_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVideotemplate *src; + + g_return_if_fail (GST_IS_VIDEOTEMPLATE (object)); + src = GST_VIDEOTEMPLATE (object); + + switch (prop_id) { +#if 0 + case ARG_METHOD: + g_value_set_enum (value, src->method); + break; +#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "videotemplate", GST_RANK_NONE, + GST_TYPE_VIDEOTEMPLATE); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videotemplate", + "Template for a video filter", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) + + static void gst_videotemplate_setup (GstVideofilter * videofilter) +{ + GstVideotemplate *videotemplate; + + g_return_if_fail (GST_IS_VIDEOTEMPLATE (videofilter)); + videotemplate = GST_VIDEOTEMPLATE (videofilter); + + /* if any setup needs to be done, do it here */ + +} + +static void +gst_videotemplate_planar411 (GstVideofilter * videofilter, + void *dest, void *src) +{ + GstVideotemplate *videotemplate; + int width = gst_videofilter_get_input_width (videofilter); + int height = gst_videofilter_get_input_height (videofilter); + + g_return_if_fail (GST_IS_VIDEOTEMPLATE (videofilter)); + videotemplate = GST_VIDEOTEMPLATE (videofilter); + + /* do something interesting here. This simply copies the source + * to the destination. */ + memcpy (dest, src, width * height + (width / 2) * (height / 2) * 2); +} diff --git a/gst/videofilter/make_filter b/gst/videofilter/make_filter new file mode 100755 index 0000000..692d0d5 --- /dev/null +++ b/gst/videofilter/make_filter @@ -0,0 +1,39 @@ +#!/bin/sh + +LANG=C +export LANG +LC_COLLATE=C +export LC_COLLATE + +Template=$1; +srcfile=$2; + +if test x"$1" = x ; then + echo "$0 Objectname [srcfile]\n"; + echo " creates gstobjectname.{c,h} implementing GstObjectname,\n"; + echo " subclassing GstVideofilter.\n"; + exit 1; +fi + +if test x"$2" = x ; then + srcfile="gstvideotemplate.c" +fi + +id=`echo '$Id$' | sed \ + -e 's/\$I[d]: \([^$]*\)\$/\1/g'` +echo $id + +TEMPLATE=`echo $Template | tr [:lower:] [:upper:]` +template=`echo $Template | tr [:upper:] [:lower:]` + +# remember to break up the Id: in the line below +sed \ + -e 's/gstvideotemplate\.c/SOURCEFILE/g' \ + -e "s/Videotemplate/$Template/g" \ + -e "s/videotemplate/$template/g" \ + -e "s/VIDEOTEMPLATE/$TEMPLATE/g" \ + -e 's/\$I[d]: \([^$]*\)\$/\1/g' \ + -e 's/SOURCEFILE/gstvideotemplate\.c/g' \ + -e "s%MAKEFILTERVERSION%$id%g" \ + $srcfile >gst$template.c.tmp && mv gst$template.c.tmp gst$template.c + diff --git a/gst/videofilter/plugin.c b/gst/videofilter/plugin.c new file mode 100644 index 0000000..e0fcede --- /dev/null +++ b/gst/videofilter/plugin.c @@ -0,0 +1,47 @@ +/* GStreamer + * Copyright (C) 2010 Sebastian Dröge + * + * 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 +#include + +#include "gstgamma.h" +#include "gstvideoflip.h" +#include "gstvideobalance.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_controller_init (NULL, NULL); + + return (gst_element_register (plugin, "gamma", GST_RANK_NONE, GST_TYPE_GAMMA) + && gst_element_register (plugin, "videobalance", GST_RANK_NONE, + GST_TYPE_VIDEO_BALANCE) + && gst_element_register (plugin, "videoflip", GST_RANK_NONE, + GST_TYPE_VIDEO_FLIP)); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videofilter", + "Video filters plugin", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/gst/videomixer/Makefile.am b/gst/videomixer/Makefile.am new file mode 100644 index 0000000..0cda826 --- /dev/null +++ b/gst/videomixer/Makefile.am @@ -0,0 +1,41 @@ +plugin_LTLIBRARIES = libgstvideomixer.la + +ORC_SOURCE=blendorc +include $(top_srcdir)/common/orc.mak + +libgstvideomixer_la_SOURCES = \ + videomixer.c \ + blend.c \ + videomixer2.c + +nodist_libgstvideomixer_la_SOURCES = $(ORC_NODIST_SOURCES) +libgstvideomixer_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) +libgstvideomixer_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(ORC_LIBS) +libgstvideomixer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideomixer_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = \ + videomixer.h \ + videomixerpad.h \ + blend.h \ + videomixer2.h \ + videomixer2pad.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideomixer -:SHARED libgstvideomixer \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideomixer_la_SOURCES) \ + $(nodist_libgstvideomixer_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideomixer_la_CFLAGS) \ + -:LDFLAGS $(libgstvideomixer_la_LDFLAGS) \ + $(libgstvideomixer_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/videomixer/Makefile.in b/gst/videomixer/Makefile.in new file mode 100644 index 0000000..d6445e3 --- /dev/null +++ b/gst/videomixer/Makefile.in @@ -0,0 +1,946 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# This is a makefile.am fragment to build Orc code. +# +# Define ORC_SOURCE and then include this file, such as: +# +# ORC_SOURCE=gstadderorc +# include $(top_srcdir)/common/orc.mak +# +# This fragment will create tmp-orc.c and gstadderorc.h from +# gstadderorc.orc. +# +# When 'make dist' is run at the top level, or 'make orc-update' +# in a directory including this fragment, the generated source +# files will be copied to $(ORC_SOURCE)-dist.[ch]. These files +# should be checked in to git, since they are used if Orc is +# disabled. +# +# Note that this file defines BUILT_SOURCES, so any later usage +# of BUILT_SOURCES in the Makefile.am that includes this file +# must use '+='. +# + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/common/orc.mak +subdir = gst/videomixer +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstvideomixer_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstvideomixer_la_OBJECTS = libgstvideomixer_la-videomixer.lo \ + libgstvideomixer_la-blend.lo \ + libgstvideomixer_la-videomixer2.lo +am__objects_1 = libgstvideomixer_la-tmp-orc.lo +nodist_libgstvideomixer_la_OBJECTS = $(am__objects_1) +libgstvideomixer_la_OBJECTS = $(am_libgstvideomixer_la_OBJECTS) \ + $(nodist_libgstvideomixer_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstvideomixer_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) \ + $(libgstvideomixer_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstvideomixer_la_SOURCES) \ + $(nodist_libgstvideomixer_la_SOURCES) +DIST_SOURCES = $(libgstvideomixer_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstvideomixer.la +ORC_SOURCE = blendorc +EXTRA_DIST = $(ORC_SOURCE).orc +ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h +BUILT_SOURCES = tmp-orc.c $(ORC_SOURCE).h +orcc_v_gen = $(orcc_v_gen_$(V)) +orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) +orcc_v_gen_0 = @echo " ORCC $@"; +cp_v_gen = $(cp_v_gen_$(V)) +cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) +cp_v_gen_0 = @echo " CP $@"; +libgstvideomixer_la_SOURCES = \ + videomixer.c \ + blend.c \ + videomixer2.c + +nodist_libgstvideomixer_la_SOURCES = $(ORC_NODIST_SOURCES) +libgstvideomixer_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) + +libgstvideomixer_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(ORC_LIBS) + +libgstvideomixer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideomixer_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = \ + videomixer.h \ + videomixerpad.h \ + blend.h \ + videomixer2.h \ + videomixer2pad.h + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/orc.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videomixer/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/videomixer/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/orc.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstvideomixer.la: $(libgstvideomixer_la_OBJECTS) $(libgstvideomixer_la_DEPENDENCIES) $(EXTRA_libgstvideomixer_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstvideomixer_la_LINK) -rpath $(plugindir) $(libgstvideomixer_la_OBJECTS) $(libgstvideomixer_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideomixer_la-blend.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideomixer_la-tmp-orc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideomixer_la-videomixer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideomixer_la-videomixer2.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstvideomixer_la-videomixer.lo: videomixer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -MT libgstvideomixer_la-videomixer.lo -MD -MP -MF $(DEPDIR)/libgstvideomixer_la-videomixer.Tpo -c -o libgstvideomixer_la-videomixer.lo `test -f 'videomixer.c' || echo '$(srcdir)/'`videomixer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideomixer_la-videomixer.Tpo $(DEPDIR)/libgstvideomixer_la-videomixer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videomixer.c' object='libgstvideomixer_la-videomixer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -c -o libgstvideomixer_la-videomixer.lo `test -f 'videomixer.c' || echo '$(srcdir)/'`videomixer.c + +libgstvideomixer_la-blend.lo: blend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -MT libgstvideomixer_la-blend.lo -MD -MP -MF $(DEPDIR)/libgstvideomixer_la-blend.Tpo -c -o libgstvideomixer_la-blend.lo `test -f 'blend.c' || echo '$(srcdir)/'`blend.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideomixer_la-blend.Tpo $(DEPDIR)/libgstvideomixer_la-blend.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='blend.c' object='libgstvideomixer_la-blend.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -c -o libgstvideomixer_la-blend.lo `test -f 'blend.c' || echo '$(srcdir)/'`blend.c + +libgstvideomixer_la-videomixer2.lo: videomixer2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -MT libgstvideomixer_la-videomixer2.lo -MD -MP -MF $(DEPDIR)/libgstvideomixer_la-videomixer2.Tpo -c -o libgstvideomixer_la-videomixer2.lo `test -f 'videomixer2.c' || echo '$(srcdir)/'`videomixer2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideomixer_la-videomixer2.Tpo $(DEPDIR)/libgstvideomixer_la-videomixer2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videomixer2.c' object='libgstvideomixer_la-videomixer2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -c -o libgstvideomixer_la-videomixer2.lo `test -f 'videomixer2.c' || echo '$(srcdir)/'`videomixer2.c + +libgstvideomixer_la-tmp-orc.lo: tmp-orc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -MT libgstvideomixer_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstvideomixer_la-tmp-orc.Tpo -c -o libgstvideomixer_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideomixer_la-tmp-orc.Tpo $(DEPDIR)/libgstvideomixer_la-tmp-orc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tmp-orc.c' object='libgstvideomixer_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -c -o libgstvideomixer_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local \ + clean-pluginLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-local clean-pluginLTLIBRARIES ctags \ + dist-hook distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pluginLTLIBRARIES install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-pluginLTLIBRARIES + + +orc-update: tmp-orc.c $(ORC_SOURCE).h + $(top_srcdir)/common/gst-indent tmp-orc.c + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h + +@HAVE_ORCC_TRUE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --implementation --include glib.h -o tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc + +@HAVE_ORCC_TRUE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --header --include glib.h -o $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc +@HAVE_ORCC_FALSE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c +@HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c + +@HAVE_ORCC_FALSE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c +@HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h + +clean-local: clean-orc +.PHONY: clean-orc +clean-orc: + rm -f tmp-orc.c $(ORC_SOURCE).h + +dist-hook: dist-hook-orc +.PHONY: dist-hook-orc + +# we try and copy updated orc -dist files below, but don't fail if it +# doesn't work as the srcdir might not be writable +dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h + $(top_srcdir)/common/gst-indent tmp-orc.c + rm -f tmp-orc.c~ + cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || true + cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || true + cp -p tmp-orc.c $(distdir)/$(ORC_SOURCE)-dist.c + cp -p $(ORC_SOURCE).h $(distdir)/$(ORC_SOURCE)-dist.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideomixer -:SHARED libgstvideomixer \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideomixer_la_SOURCES) \ + $(nodist_libgstvideomixer_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideomixer_la_CFLAGS) \ + -:LDFLAGS $(libgstvideomixer_la_LDFLAGS) \ + $(libgstvideomixer_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/videomixer/README b/gst/videomixer/README new file mode 100644 index 0000000..6794a48 --- /dev/null +++ b/gst/videomixer/README @@ -0,0 +1,27 @@ +Video Mixer +----------- + +A generice video mixer, it blends the ayuv buffers from all pads onto +a new buffer. The new buffer has by default a checkerboard pattern but +its color can be changed with a property. +The mixer can mix streams with different framerates and video sizes. It +uses the duration value of the buffer to schedule the rendering of the +buffers. For streams with a different resoltion than the final output +resolution one can specify the position of the top left corner where this +image should be placed with the pad properties xpos and ypos. +The overall alpha value of a stream can also be specified with a pad +property. +By default, the streams are blended in the order that the pads were +requested from the element. This can be overridden by changing the +zorder pad property of the stream, a stream with lower zorder gets +drawn first. + + +TODO +---- + +- really implement zorder +- take I420 yuv as well +- output AYUV if possible. +- implement different blend modes, some code is already done +- use filter caps on srcpad to decide on the final output size diff --git a/gst/videomixer/blend.c b/gst/videomixer/blend.c new file mode 100644 index 0000000..aeeeef1 --- /dev/null +++ b/gst/videomixer/blend.c @@ -0,0 +1,770 @@ +/* + * Copyright (C) 2004 Wim Taymans + * Copyright (C) 2006 Mindfruit Bv. + * Author: Sjoerd Simons + * Author: Alex Ugarte + * Copyright (C) 2009 Alex Ugarte + * Copyright (C) 2009 Sebastian Dröge + * + * 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 "blend.h" +#include "blendorc.h" + +#include + +#include + +#define BLEND(D,S,alpha) (((D) * (256 - (alpha)) + (S) * (alpha)) >> 8) + +GST_DEBUG_CATEGORY_STATIC (gst_videomixer_blend_debug); +#define GST_CAT_DEFAULT gst_videomixer_blend_debug + +/* Below are the implementations of everything */ + +/* A32 is for AYUV, ARGB and BGRA */ +#define BLEND_A32(name, method, LOOP) \ +static void \ +method##_ ##name (const guint8 * src, gint xpos, gint ypos, \ + gint src_width, gint src_height, gdouble src_alpha, \ + guint8 * dest, gint dest_width, gint dest_height) \ +{ \ + guint s_alpha; \ + gint src_stride, dest_stride; \ + \ + src_stride = src_width * 4; \ + dest_stride = dest_width * 4; \ + \ + s_alpha = CLAMP ((gint) (src_alpha * 256), 0, 256); \ + \ + /* If it's completely transparent... we just return */ \ + if (G_UNLIKELY (s_alpha == 0)) \ + return; \ + \ + /* adjust src pointers for negative sizes */ \ + if (xpos < 0) { \ + src += -xpos * 4; \ + src_width -= -xpos; \ + xpos = 0; \ + } \ + if (ypos < 0) { \ + src += -ypos * src_stride; \ + src_height -= -ypos; \ + ypos = 0; \ + } \ + /* adjust width/height if the src is bigger than dest */ \ + if (xpos + src_width > dest_width) { \ + src_width = dest_width - xpos; \ + } \ + if (ypos + src_height > dest_height) { \ + src_height = dest_height - ypos; \ + } \ + \ + dest = dest + 4 * xpos + (ypos * dest_stride); \ + \ + LOOP (dest, src, src_height, src_width, src_stride, dest_stride, s_alpha); \ +} + +#define BLEND_A32_LOOP(name, method) \ +static inline void \ +_##method##_loop_##name (guint8 * dest, const guint8 * src, gint src_height, \ + gint src_width, gint src_stride, gint dest_stride, guint s_alpha) \ +{ \ + s_alpha = MIN (255, s_alpha); \ + orc_##method##_##name (dest, dest_stride, src, src_stride, \ + s_alpha, src_width, src_height); \ +} + +BLEND_A32_LOOP (argb, blend); +BLEND_A32_LOOP (bgra, blend); +BLEND_A32_LOOP (argb, overlay); +BLEND_A32_LOOP (bgra, overlay); + +#if G_BYTE_ORDER == LITTLE_ENDIAN +BLEND_A32 (argb, blend, _blend_loop_argb); +BLEND_A32 (bgra, blend, _blend_loop_bgra); +BLEND_A32 (argb, overlay, _overlay_loop_argb); +BLEND_A32 (bgra, overlay, _overlay_loop_bgra); +#else +BLEND_A32 (argb, blend, _blend_loop_bgra); +BLEND_A32 (bgra, blend, _blend_loop_argb); +BLEND_A32 (argb, overlay, _overlay_loop_bgra); +BLEND_A32 (bgra, overlay, _overlay_loop_argb); +#endif + +#define A32_CHECKER_C(name, RGB, A, C1, C2, C3) \ +static void \ +fill_checker_##name##_c (guint8 * dest, gint width, gint height) \ +{ \ + gint i, j; \ + gint val; \ + static const gint tab[] = { 80, 160, 80, 160 }; \ + \ + if (!RGB) { \ + for (i = 0; i < height; i++) { \ + for (j = 0; j < width; j++) { \ + dest[A] = 0xff; \ + dest[C1] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ + dest[C2] = 128; \ + dest[C3] = 128; \ + dest += 4; \ + } \ + } \ + } else { \ + for (i = 0; i < height; i++) { \ + for (j = 0; j < width; j++) { \ + val = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ + dest[A] = 0xFF; \ + dest[C1] = val; \ + dest[C2] = val; \ + dest[C3] = val; \ + dest += 4; \ + } \ + } \ + } \ +} + +A32_CHECKER_C (argb, TRUE, 0, 1, 2, 3); +A32_CHECKER_C (bgra, TRUE, 3, 2, 1, 0); +A32_CHECKER_C (ayuv, FALSE, 0, 1, 2, 3); + +#define YUV_TO_R(Y,U,V) (CLAMP (1.164 * (Y - 16) + 1.596 * (V - 128), 0, 255)) +#define YUV_TO_G(Y,U,V) (CLAMP (1.164 * (Y - 16) - 0.813 * (V - 128) - 0.391 * (U - 128), 0, 255)) +#define YUV_TO_B(Y,U,V) (CLAMP (1.164 * (Y - 16) + 2.018 * (U - 128), 0, 255)) + +#define A32_COLOR(name, RGB, A, C1, C2, C3) \ +static void \ +fill_color_##name (guint8 * dest, gint width, gint height, gint Y, gint U, gint V) \ +{ \ + gint c1, c2, c3; \ + guint32 val; \ + \ + if (RGB) { \ + c1 = YUV_TO_R (Y, U, V); \ + c2 = YUV_TO_G (Y, U, V); \ + c3 = YUV_TO_B (Y, U, V); \ + } else { \ + c1 = Y; \ + c2 = U; \ + c3 = V; \ + } \ + val = GUINT32_FROM_BE ((0xff << A) | (c1 << C1) | (c2 << C2) | (c3 << C3)); \ + \ + orc_splat_u32 ((guint32 *) dest, val, height * width); \ +} + +A32_COLOR (argb, TRUE, 24, 16, 8, 0); +A32_COLOR (bgra, TRUE, 0, 8, 16, 24); +A32_COLOR (abgr, TRUE, 24, 0, 8, 16); +A32_COLOR (rgba, TRUE, 0, 24, 16, 8); +A32_COLOR (ayuv, FALSE, 24, 16, 8, 0); + +/* Y444, Y42B, I420, YV12, Y41B */ +#define PLANAR_YUV_BLEND(format_name,format_enum,x_round,y_round,MEMCPY,BLENDLOOP) \ +inline static void \ +_blend_##format_name (const guint8 * src, guint8 * dest, \ + gint src_stride, gint dest_stride, gint src_width, gint src_height, \ + gdouble src_alpha) \ +{ \ + gint i; \ + gint b_alpha; \ + \ + /* If it's completely transparent... we just return */ \ + if (G_UNLIKELY (src_alpha == 0.0)) { \ + GST_INFO ("Fast copy (alpha == 0.0)"); \ + return; \ + } \ + \ + /* If it's completely opaque, we do a fast copy */ \ + if (G_UNLIKELY (src_alpha == 1.0)) { \ + GST_INFO ("Fast copy (alpha == 1.0)"); \ + for (i = 0; i < src_height; i++) { \ + MEMCPY (dest, src, src_width); \ + src += src_stride; \ + dest += dest_stride; \ + } \ + return; \ + } \ + \ + b_alpha = CLAMP ((gint) (src_alpha * 256), 0, 256); \ + \ + BLENDLOOP(dest, dest_stride, src, src_stride, b_alpha, src_width, src_height); \ +} \ +\ +static void \ +blend_##format_name (const guint8 * src, gint xpos, gint ypos, \ + gint src_width, gint src_height, gdouble src_alpha, \ + guint8 * dest, gint dest_width, gint dest_height) \ +{ \ + const guint8 *b_src; \ + guint8 *b_dest; \ + gint b_src_width = src_width; \ + gint b_src_height = src_height; \ + gint xoffset = 0; \ + gint yoffset = 0; \ + gint src_comp_rowstride, dest_comp_rowstride; \ + gint src_comp_height; \ + gint src_comp_width; \ + gint comp_ypos, comp_xpos; \ + gint comp_yoffset, comp_xoffset; \ + \ + xpos = x_round (xpos); \ + ypos = y_round (ypos); \ + \ + /* adjust src pointers for negative sizes */ \ + if (xpos < 0) { \ + xoffset = -xpos; \ + b_src_width -= -xpos; \ + xpos = 0; \ + } \ + if (ypos < 0) { \ + yoffset += -ypos; \ + b_src_height -= -ypos; \ + ypos = 0; \ + } \ + /* If x or y offset are larger then the source it's outside of the picture */ \ + if (xoffset > src_width || yoffset > src_width) { \ + return; \ + } \ + \ + /* adjust width/height if the src is bigger than dest */ \ + if (xpos + src_width > dest_width) { \ + b_src_width = dest_width - xpos; \ + } \ + if (ypos + src_height > dest_height) { \ + b_src_height = dest_height - ypos; \ + } \ + if (b_src_width < 0 || b_src_height < 0) { \ + return; \ + } \ + \ + /* First mix Y, then U, then V */ \ + b_src = src + gst_video_format_get_component_offset (format_enum, 0, src_width, src_height); \ + b_dest = dest + gst_video_format_get_component_offset (format_enum, 0, dest_width, dest_height); \ + src_comp_rowstride = gst_video_format_get_row_stride (format_enum, 0, src_width); \ + dest_comp_rowstride = gst_video_format_get_row_stride (format_enum, 0, dest_width); \ + src_comp_height = gst_video_format_get_component_height (format_enum, 0, b_src_height); \ + src_comp_width = gst_video_format_get_component_width (format_enum, 0, b_src_width); \ + comp_xpos = (xpos == 0) ? 0 : gst_video_format_get_component_width (format_enum, 0, xpos); \ + comp_ypos = (ypos == 0) ? 0 : gst_video_format_get_component_height (format_enum, 0, ypos); \ + comp_xoffset = (xoffset == 0) ? 0 : gst_video_format_get_component_width (format_enum, 0, xoffset); \ + comp_yoffset = (yoffset == 0) ? 0 : gst_video_format_get_component_height (format_enum, 0, yoffset); \ + _blend_##format_name (b_src + comp_xoffset + comp_yoffset * src_comp_rowstride, \ + b_dest + comp_xpos + comp_ypos * dest_comp_rowstride, \ + src_comp_rowstride, \ + dest_comp_rowstride, src_comp_width, src_comp_height, \ + src_alpha); \ + \ + b_src = src + gst_video_format_get_component_offset (format_enum, 1, src_width, src_height); \ + b_dest = dest + gst_video_format_get_component_offset (format_enum, 1, dest_width, dest_height); \ + src_comp_rowstride = gst_video_format_get_row_stride (format_enum, 1, src_width); \ + dest_comp_rowstride = gst_video_format_get_row_stride (format_enum, 1, dest_width); \ + src_comp_height = gst_video_format_get_component_height (format_enum, 1, b_src_height); \ + src_comp_width = gst_video_format_get_component_width (format_enum, 1, b_src_width); \ + comp_xpos = (xpos == 0) ? 0 : gst_video_format_get_component_width (format_enum, 1, xpos); \ + comp_ypos = (ypos == 0) ? 0 : gst_video_format_get_component_height (format_enum, 1, ypos); \ + comp_xoffset = (xoffset == 0) ? 0 : gst_video_format_get_component_width (format_enum, 1, xoffset); \ + comp_yoffset = (yoffset == 0) ? 0 : gst_video_format_get_component_height (format_enum, 1, yoffset); \ + _blend_##format_name (b_src + comp_xoffset + comp_yoffset * src_comp_rowstride, \ + b_dest + comp_xpos + comp_ypos * dest_comp_rowstride, \ + src_comp_rowstride, \ + dest_comp_rowstride, src_comp_width, src_comp_height, \ + src_alpha); \ + \ + b_src = src + gst_video_format_get_component_offset (format_enum, 2, src_width, src_height); \ + b_dest = dest + gst_video_format_get_component_offset (format_enum, 2, dest_width, dest_height); \ + src_comp_rowstride = gst_video_format_get_row_stride (format_enum, 2, src_width); \ + dest_comp_rowstride = gst_video_format_get_row_stride (format_enum, 2, dest_width); \ + src_comp_height = gst_video_format_get_component_height (format_enum, 2, b_src_height); \ + src_comp_width = gst_video_format_get_component_width (format_enum, 2, b_src_width); \ + comp_xpos = (xpos == 0) ? 0 : gst_video_format_get_component_width (format_enum, 2, xpos); \ + comp_ypos = (ypos == 0) ? 0 : gst_video_format_get_component_height (format_enum, 2, ypos); \ + comp_xoffset = (xoffset == 0) ? 0 : gst_video_format_get_component_width (format_enum, 2, xoffset); \ + comp_yoffset = (yoffset == 0) ? 0 : gst_video_format_get_component_height (format_enum, 2, yoffset); \ + _blend_##format_name (b_src + comp_xoffset + comp_yoffset * src_comp_rowstride, \ + b_dest + comp_xpos + comp_ypos * dest_comp_rowstride, \ + src_comp_rowstride, \ + dest_comp_rowstride, src_comp_width, src_comp_height, \ + src_alpha); \ +} + +#define PLANAR_YUV_FILL_CHECKER(format_name, format_enum, MEMSET) \ +static void \ +fill_checker_##format_name (guint8 * dest, gint width, gint height) \ +{ \ + gint i, j; \ + static const int tab[] = { 80, 160, 80, 160 }; \ + guint8 *p; \ + gint comp_width, comp_height; \ + gint rowstride; \ + \ + p = dest + gst_video_format_get_component_offset (format_enum, 0, width, height); \ + comp_width = gst_video_format_get_component_width (format_enum, 0, width); \ + comp_height = gst_video_format_get_component_height (format_enum, 0, height); \ + rowstride = gst_video_format_get_row_stride (format_enum, 0, width); \ + \ + for (i = 0; i < comp_height; i++) { \ + for (j = 0; j < comp_width; j++) { \ + *p++ = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ + } \ + p += rowstride - comp_width; \ + } \ + \ + p = dest + gst_video_format_get_component_offset (format_enum, 1, width, height); \ + comp_width = gst_video_format_get_component_width (format_enum, 1, width); \ + comp_height = gst_video_format_get_component_height (format_enum, 1, height); \ + rowstride = gst_video_format_get_row_stride (format_enum, 1, width); \ + \ + for (i = 0; i < comp_height; i++) { \ + MEMSET (p, 0x80, comp_width); \ + p += rowstride; \ + } \ + \ + p = dest + gst_video_format_get_component_offset (format_enum, 2, width, height); \ + comp_width = gst_video_format_get_component_width (format_enum, 2, width); \ + comp_height = gst_video_format_get_component_height (format_enum, 2, height); \ + rowstride = gst_video_format_get_row_stride (format_enum, 2, width); \ + \ + for (i = 0; i < comp_height; i++) { \ + MEMSET (p, 0x80, comp_width); \ + p += rowstride; \ + } \ +} + +#define PLANAR_YUV_FILL_COLOR(format_name,format_enum,MEMSET) \ +static void \ +fill_color_##format_name (guint8 * dest, gint width, gint height, \ + gint colY, gint colU, gint colV) \ +{ \ + guint8 *p; \ + gint comp_width, comp_height; \ + gint rowstride; \ + gint i; \ + \ + p = dest + gst_video_format_get_component_offset (format_enum, 0, width, height); \ + comp_width = gst_video_format_get_component_width (format_enum, 0, width); \ + comp_height = gst_video_format_get_component_height (format_enum, 0, height); \ + rowstride = gst_video_format_get_row_stride (format_enum, 0, width); \ + \ + for (i = 0; i < comp_height; i++) { \ + MEMSET (p, colY, comp_width); \ + p += rowstride; \ + } \ + \ + p = dest + gst_video_format_get_component_offset (format_enum, 1, width, height); \ + comp_width = gst_video_format_get_component_width (format_enum, 1, width); \ + comp_height = gst_video_format_get_component_height (format_enum, 1, height); \ + rowstride = gst_video_format_get_row_stride (format_enum, 1, width); \ + \ + for (i = 0; i < comp_height; i++) { \ + MEMSET (p, colU, comp_width); \ + p += rowstride; \ + } \ + \ + p = dest + gst_video_format_get_component_offset (format_enum, 2, width, height); \ + comp_width = gst_video_format_get_component_width (format_enum, 2, width); \ + comp_height = gst_video_format_get_component_height (format_enum, 2, height); \ + rowstride = gst_video_format_get_row_stride (format_enum, 2, width); \ + \ + for (i = 0; i < comp_height; i++) { \ + MEMSET (p, colV, comp_width); \ + p += rowstride; \ + } \ +} + +#define GST_ROUND_UP_1(x) (x) + +PLANAR_YUV_BLEND (i420, GST_VIDEO_FORMAT_I420, GST_ROUND_UP_2, + GST_ROUND_UP_2, memcpy, orc_blend_u8); +PLANAR_YUV_FILL_CHECKER (i420, GST_VIDEO_FORMAT_I420, memset); +PLANAR_YUV_FILL_COLOR (i420, GST_VIDEO_FORMAT_I420, memset); +PLANAR_YUV_FILL_COLOR (yv12, GST_VIDEO_FORMAT_YV12, memset); +PLANAR_YUV_BLEND (y444, GST_VIDEO_FORMAT_Y444, GST_ROUND_UP_1, + GST_ROUND_UP_1, memcpy, orc_blend_u8); +PLANAR_YUV_FILL_CHECKER (y444, GST_VIDEO_FORMAT_Y444, memset); +PLANAR_YUV_FILL_COLOR (y444, GST_VIDEO_FORMAT_Y444, memset); +PLANAR_YUV_BLEND (y42b, GST_VIDEO_FORMAT_Y42B, GST_ROUND_UP_2, + GST_ROUND_UP_1, memcpy, orc_blend_u8); +PLANAR_YUV_FILL_CHECKER (y42b, GST_VIDEO_FORMAT_Y42B, memset); +PLANAR_YUV_FILL_COLOR (y42b, GST_VIDEO_FORMAT_Y42B, memset); +PLANAR_YUV_BLEND (y41b, GST_VIDEO_FORMAT_Y41B, GST_ROUND_UP_4, + GST_ROUND_UP_1, memcpy, orc_blend_u8); +PLANAR_YUV_FILL_CHECKER (y41b, GST_VIDEO_FORMAT_Y41B, memset); +PLANAR_YUV_FILL_COLOR (y41b, GST_VIDEO_FORMAT_Y41B, memset); + +/* RGB, BGR, xRGB, xBGR, RGBx, BGRx */ + +#define RGB_BLEND(name, bpp, MEMCPY, BLENDLOOP) \ +static void \ +blend_##name (const guint8 * src, gint xpos, gint ypos, \ + gint src_width, gint src_height, gdouble src_alpha, \ + guint8 * dest, gint dest_width, gint dest_height) \ +{ \ + gint b_alpha; \ + gint i; \ + gint src_stride, dest_stride; \ + \ + src_stride = GST_ROUND_UP_4 (src_width * bpp); \ + dest_stride = GST_ROUND_UP_4 (dest_width * bpp); \ + \ + b_alpha = CLAMP ((gint) (src_alpha * 256), 0, 256); \ + \ + /* adjust src pointers for negative sizes */ \ + if (xpos < 0) { \ + src += -xpos * bpp; \ + src_width -= -xpos; \ + xpos = 0; \ + } \ + if (ypos < 0) { \ + src += -ypos * src_stride; \ + src_height -= -ypos; \ + ypos = 0; \ + } \ + /* adjust width/height if the src is bigger than dest */ \ + if (xpos + src_width > dest_width) { \ + src_width = dest_width - xpos; \ + } \ + if (ypos + src_height > dest_height) { \ + src_height = dest_height - ypos; \ + } \ + \ + dest = dest + bpp * xpos + (ypos * dest_stride); \ + /* If it's completely transparent... we just return */ \ + if (G_UNLIKELY (src_alpha == 0.0)) { \ + GST_INFO ("Fast copy (alpha == 0.0)"); \ + return; \ + } \ + \ + /* If it's completely opaque, we do a fast copy */ \ + if (G_UNLIKELY (src_alpha == 1.0)) { \ + GST_INFO ("Fast copy (alpha == 1.0)"); \ + for (i = 0; i < src_height; i++) { \ + MEMCPY (dest, src, bpp * src_width); \ + src += src_stride; \ + dest += dest_stride; \ + } \ + return; \ + } \ + \ + BLENDLOOP(dest, dest_stride, src, src_stride, b_alpha, src_width * bpp, src_height); \ +} + +#define RGB_FILL_CHECKER_C(name, bpp, r, g, b) \ +static void \ +fill_checker_##name##_c (guint8 * dest, gint width, gint height) \ +{ \ + gint i, j; \ + static const int tab[] = { 80, 160, 80, 160 }; \ + gint dest_add = GST_ROUND_UP_4 (width * bpp) - width * bpp; \ + \ + for (i = 0; i < height; i++) { \ + for (j = 0; j < width; j++) { \ + dest[r] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; /* red */ \ + dest[g] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; /* green */ \ + dest[b] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; /* blue */ \ + dest += bpp; \ + } \ + dest += dest_add; \ + } \ +} + +#define RGB_FILL_COLOR(name, bpp, MEMSET_RGB) \ +static void \ +fill_color_##name (guint8 * dest, gint width, gint height, \ + gint colY, gint colU, gint colV) \ +{ \ + gint red, green, blue; \ + gint i; \ + gint dest_stride = GST_ROUND_UP_4 (width * bpp); \ + \ + red = YUV_TO_R (colY, colU, colV); \ + green = YUV_TO_G (colY, colU, colV); \ + blue = YUV_TO_B (colY, colU, colV); \ + \ + for (i = 0; i < height; i++) { \ + MEMSET_RGB (dest, red, green, blue, width); \ + dest += dest_stride; \ + } \ +} + +#define MEMSET_RGB_C(name, r, g, b) \ +static inline void \ +_memset_##name##_c (guint8* dest, gint red, gint green, gint blue, gint width) { \ + gint j; \ + \ + for (j = 0; j < width; j++) { \ + dest[r] = red; \ + dest[g] = green; \ + dest[b] = blue; \ + dest += 3; \ + } \ +} + +#define MEMSET_XRGB(name, r, g, b) \ +static inline void \ +_memset_##name (guint8* dest, gint red, gint green, gint blue, gint width) { \ + guint32 val; \ + \ + val = GUINT32_FROM_BE ((red << r) | (green << g) | (blue << b)); \ + orc_splat_u32 ((guint32 *) dest, val, width); \ +} + +#define _orc_memcpy_u32(dest,src,len) orc_memcpy_u32((guint32 *) dest, (const guint32 *) src, len/4) + +RGB_BLEND (rgb, 3, memcpy, orc_blend_u8); +RGB_FILL_CHECKER_C (rgb, 3, 0, 1, 2); +MEMSET_RGB_C (rgb, 0, 1, 2); +RGB_FILL_COLOR (rgb_c, 3, _memset_rgb_c); + +MEMSET_RGB_C (bgr, 2, 1, 0); +RGB_FILL_COLOR (bgr_c, 3, _memset_bgr_c); + +RGB_BLEND (xrgb, 4, _orc_memcpy_u32, orc_blend_u8); +RGB_FILL_CHECKER_C (xrgb, 4, 1, 2, 3); +MEMSET_XRGB (xrgb, 24, 16, 0); +RGB_FILL_COLOR (xrgb, 4, _memset_xrgb); + +MEMSET_XRGB (xbgr, 0, 16, 24); +RGB_FILL_COLOR (xbgr, 4, _memset_xbgr); + +MEMSET_XRGB (rgbx, 24, 16, 8); +RGB_FILL_COLOR (rgbx, 4, _memset_rgbx); + +MEMSET_XRGB (bgrx, 8, 16, 24); +RGB_FILL_COLOR (bgrx, 4, _memset_bgrx); + +/* YUY2, YVYU, UYVY */ + +#define PACKED_422_BLEND(name, MEMCPY, BLENDLOOP) \ +static void \ +blend_##name (const guint8 * src, gint xpos, gint ypos, \ + gint src_width, gint src_height, gdouble src_alpha, \ + guint8 * dest, gint dest_width, gint dest_height) \ +{ \ + gint b_alpha; \ + gint i; \ + gint src_stride, dest_stride; \ + \ + src_stride = GST_ROUND_UP_4 (src_width * 2); \ + dest_stride = GST_ROUND_UP_4 (dest_width * 2); \ + \ + b_alpha = CLAMP ((gint) (src_alpha * 256), 0, 256); \ + \ + xpos = GST_ROUND_UP_2 (xpos); \ + \ + /* adjust src pointers for negative sizes */ \ + if (xpos < 0) { \ + src += -xpos * 2; \ + src_width -= -xpos; \ + xpos = 0; \ + } \ + if (ypos < 0) { \ + src += -ypos * src_stride; \ + src_height -= -ypos; \ + ypos = 0; \ + } \ + \ + /* adjust width/height if the src is bigger than dest */ \ + if (xpos + src_width > dest_width) { \ + src_width = dest_width - xpos; \ + } \ + if (ypos + src_height > dest_height) { \ + src_height = dest_height - ypos; \ + } \ + \ + dest = dest + 2 * xpos + (ypos * dest_stride); \ + /* If it's completely transparent... we just return */ \ + if (G_UNLIKELY (src_alpha == 0.0)) { \ + GST_INFO ("Fast copy (alpha == 0.0)"); \ + return; \ + } \ + \ + /* If it's completely opaque, we do a fast copy */ \ + if (G_UNLIKELY (src_alpha == 1.0)) { \ + GST_INFO ("Fast copy (alpha == 1.0)"); \ + for (i = 0; i < src_height; i++) { \ + MEMCPY (dest, src, 2 * src_width); \ + src += src_stride; \ + dest += dest_stride; \ + } \ + return; \ + } \ + \ + BLENDLOOP(dest, dest_stride, src, src_stride, b_alpha, 2 * src_width, src_height); \ +} + +#define PACKED_422_FILL_CHECKER_C(name, Y1, U, Y2, V) \ +static void \ +fill_checker_##name##_c (guint8 * dest, gint width, gint height) \ +{ \ + gint i, j; \ + static const int tab[] = { 80, 160, 80, 160 }; \ + gint dest_add; \ + \ + width = GST_ROUND_UP_2 (width); \ + dest_add = GST_ROUND_UP_4 (width * 2) - width * 2; \ + width /= 2; \ + \ + for (i = 0; i < height; i++) { \ + for (j = 0; j < width; j++) { \ + dest[Y1] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ + dest[Y2] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ + dest[U] = 128; \ + dest[V] = 128; \ + dest += 4; \ + } \ + dest += dest_add; \ + } \ +} + +#define PACKED_422_FILL_COLOR(name, Y1, U, Y2, V) \ +static void \ +fill_color_##name (guint8 * dest, gint width, gint height, \ + gint colY, gint colU, gint colV) \ +{ \ + gint i; \ + gint dest_stride; \ + guint32 val; \ + \ + width = GST_ROUND_UP_2 (width); \ + dest_stride = GST_ROUND_UP_4 (width * 2); \ + width /= 2; \ + \ + val = GUINT32_FROM_BE ((colY << Y1) | (colY << Y2) | (colU << U) | (colV << V)); \ + \ + for (i = 0; i < height; i++) { \ + orc_splat_u32 ((guint32 *) dest, val, width); \ + dest += dest_stride; \ + } \ +} + +PACKED_422_BLEND (yuy2, memcpy, orc_blend_u8); +PACKED_422_FILL_CHECKER_C (yuy2, 0, 1, 2, 3); +PACKED_422_FILL_CHECKER_C (uyvy, 1, 0, 3, 2); +PACKED_422_FILL_COLOR (yuy2, 24, 16, 8, 0); +PACKED_422_FILL_COLOR (yvyu, 24, 0, 8, 16); +PACKED_422_FILL_COLOR (uyvy, 16, 24, 0, 8); + +/* Init function */ +BlendFunction gst_video_mixer_blend_argb; +BlendFunction gst_video_mixer_blend_bgra; +BlendFunction gst_video_mixer_overlay_argb; +BlendFunction gst_video_mixer_overlay_bgra; +/* AYUV/ABGR is equal to ARGB, RGBA is equal to BGRA */ +BlendFunction gst_video_mixer_blend_y444; +BlendFunction gst_video_mixer_blend_y42b; +BlendFunction gst_video_mixer_blend_i420; +/* I420 is equal to YV12 */ +BlendFunction gst_video_mixer_blend_y41b; +BlendFunction gst_video_mixer_blend_rgb; +/* BGR is equal to RGB */ +BlendFunction gst_video_mixer_blend_rgbx; +/* BGRx, xRGB, xBGR are equal to RGBx */ +BlendFunction gst_video_mixer_blend_yuy2; +/* YVYU and UYVY are equal to YUY2 */ + +FillCheckerFunction gst_video_mixer_fill_checker_argb; +FillCheckerFunction gst_video_mixer_fill_checker_bgra; +/* ABGR is equal to ARGB, RGBA is equal to BGRA */ +FillCheckerFunction gst_video_mixer_fill_checker_ayuv; +FillCheckerFunction gst_video_mixer_fill_checker_y444; +FillCheckerFunction gst_video_mixer_fill_checker_y42b; +FillCheckerFunction gst_video_mixer_fill_checker_i420; +/* I420 is equal to YV12 */ +FillCheckerFunction gst_video_mixer_fill_checker_y41b; +FillCheckerFunction gst_video_mixer_fill_checker_rgb; +/* BGR is equal to RGB */ +FillCheckerFunction gst_video_mixer_fill_checker_xrgb; +/* BGRx, xRGB, xBGR are equal to RGBx */ +FillCheckerFunction gst_video_mixer_fill_checker_yuy2; +/* YVYU is equal to YUY2 */ +FillCheckerFunction gst_video_mixer_fill_checker_uyvy; + +FillColorFunction gst_video_mixer_fill_color_argb; +FillColorFunction gst_video_mixer_fill_color_bgra; +FillColorFunction gst_video_mixer_fill_color_abgr; +FillColorFunction gst_video_mixer_fill_color_rgba; +FillColorFunction gst_video_mixer_fill_color_ayuv; +FillColorFunction gst_video_mixer_fill_color_y444; +FillColorFunction gst_video_mixer_fill_color_y42b; +FillColorFunction gst_video_mixer_fill_color_i420; +FillColorFunction gst_video_mixer_fill_color_yv12; +FillColorFunction gst_video_mixer_fill_color_y41b; +FillColorFunction gst_video_mixer_fill_color_rgb; +FillColorFunction gst_video_mixer_fill_color_bgr; +FillColorFunction gst_video_mixer_fill_color_xrgb; +FillColorFunction gst_video_mixer_fill_color_xbgr; +FillColorFunction gst_video_mixer_fill_color_rgbx; +FillColorFunction gst_video_mixer_fill_color_bgrx; +FillColorFunction gst_video_mixer_fill_color_yuy2; +FillColorFunction gst_video_mixer_fill_color_yvyu; +FillColorFunction gst_video_mixer_fill_color_uyvy; + +void +gst_video_mixer_init_blend (void) +{ + GST_DEBUG_CATEGORY_INIT (gst_videomixer_blend_debug, "videomixer_blend", 0, + "video mixer blending functions"); + + gst_video_mixer_blend_argb = blend_argb; + gst_video_mixer_blend_bgra = blend_bgra; + gst_video_mixer_overlay_argb = overlay_argb; + gst_video_mixer_overlay_bgra = overlay_bgra; + gst_video_mixer_blend_i420 = blend_i420; + gst_video_mixer_blend_y444 = blend_y444; + gst_video_mixer_blend_y42b = blend_y42b; + gst_video_mixer_blend_y41b = blend_y41b; + gst_video_mixer_blend_rgb = blend_rgb; + gst_video_mixer_blend_xrgb = blend_xrgb; + gst_video_mixer_blend_yuy2 = blend_yuy2; + + gst_video_mixer_fill_checker_argb = fill_checker_argb_c; + gst_video_mixer_fill_checker_bgra = fill_checker_bgra_c; + gst_video_mixer_fill_checker_ayuv = fill_checker_ayuv_c; + gst_video_mixer_fill_checker_i420 = fill_checker_i420; + gst_video_mixer_fill_checker_y444 = fill_checker_y444; + gst_video_mixer_fill_checker_y42b = fill_checker_y42b; + gst_video_mixer_fill_checker_y41b = fill_checker_y41b; + gst_video_mixer_fill_checker_rgb = fill_checker_rgb_c; + gst_video_mixer_fill_checker_xrgb = fill_checker_xrgb_c; + gst_video_mixer_fill_checker_yuy2 = fill_checker_yuy2_c; + gst_video_mixer_fill_checker_uyvy = fill_checker_uyvy_c; + + gst_video_mixer_fill_color_argb = fill_color_argb; + gst_video_mixer_fill_color_bgra = fill_color_bgra; + gst_video_mixer_fill_color_abgr = fill_color_abgr; + gst_video_mixer_fill_color_rgba = fill_color_rgba; + gst_video_mixer_fill_color_ayuv = fill_color_ayuv; + gst_video_mixer_fill_color_i420 = fill_color_i420; + gst_video_mixer_fill_color_yv12 = fill_color_yv12; + gst_video_mixer_fill_color_y444 = fill_color_y444; + gst_video_mixer_fill_color_y42b = fill_color_y42b; + gst_video_mixer_fill_color_y41b = fill_color_y41b; + gst_video_mixer_fill_color_rgb = fill_color_rgb_c; + gst_video_mixer_fill_color_bgr = fill_color_bgr_c; + gst_video_mixer_fill_color_xrgb = fill_color_xrgb; + gst_video_mixer_fill_color_xbgr = fill_color_xbgr; + gst_video_mixer_fill_color_rgbx = fill_color_rgbx; + gst_video_mixer_fill_color_bgrx = fill_color_bgrx; + gst_video_mixer_fill_color_yuy2 = fill_color_yuy2; + gst_video_mixer_fill_color_yvyu = fill_color_yvyu; + gst_video_mixer_fill_color_uyvy = fill_color_uyvy; +} diff --git a/gst/videomixer/blend.h b/gst/videomixer/blend.h new file mode 100644 index 0000000..ef60c91 --- /dev/null +++ b/gst/videomixer/blend.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2009 Sebastian Dröge + * + * 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 __BLEND_H__ +#define __BLEND_H__ + +#include + +typedef void (*BlendFunction) (const guint8 * src, gint xpos, gint ypos, gint src_width, gint src_height, gdouble src_alpha, guint8 * dest, gint dest_width, gint dest_height); +typedef void (*FillCheckerFunction) (guint8 * dest, gint width, gint height); +typedef void (*FillColorFunction) (guint8 * dest, gint width, gint height, gint c1, gint c2, gint c3); + +extern BlendFunction gst_video_mixer_blend_argb; +extern BlendFunction gst_video_mixer_blend_bgra; +#define gst_video_mixer_blend_ayuv gst_video_mixer_blend_argb +#define gst_video_mixer_blend_abgr gst_video_mixer_blend_argb +#define gst_video_mixer_blend_rgba gst_video_mixer_blend_bgra +extern BlendFunction gst_video_mixer_overlay_argb; +extern BlendFunction gst_video_mixer_overlay_bgra; +#define gst_video_mixer_overlay_ayuv gst_video_mixer_overlay_argb +#define gst_video_mixer_overlay_abgr gst_video_mixer_overlay_argb +#define gst_video_mixer_overlay_rgba gst_video_mixer_overlay_bgra +extern BlendFunction gst_video_mixer_blend_i420; +#define gst_video_mixer_blend_yv12 gst_video_mixer_blend_i420 +extern BlendFunction gst_video_mixer_blend_y41b; +extern BlendFunction gst_video_mixer_blend_y42b; +extern BlendFunction gst_video_mixer_blend_y444; +extern BlendFunction gst_video_mixer_blend_rgb; +#define gst_video_mixer_blend_bgr gst_video_mixer_blend_rgb +extern BlendFunction gst_video_mixer_blend_rgbx; +#define gst_video_mixer_blend_bgrx gst_video_mixer_blend_rgbx +#define gst_video_mixer_blend_xrgb gst_video_mixer_blend_rgbx +#define gst_video_mixer_blend_xbgr gst_video_mixer_blend_rgbx +extern BlendFunction gst_video_mixer_blend_yuy2; +#define gst_video_mixer_blend_uyvy gst_video_mixer_blend_yuy2; +#define gst_video_mixer_blend_yvyu gst_video_mixer_blend_yuy2; + +extern FillCheckerFunction gst_video_mixer_fill_checker_argb; +#define gst_video_mixer_fill_checker_abgr gst_video_mixer_fill_checker_argb +extern FillCheckerFunction gst_video_mixer_fill_checker_bgra; +#define gst_video_mixer_fill_checker_rgba gst_video_mixer_fill_checker_bgra +extern FillCheckerFunction gst_video_mixer_fill_checker_ayuv; +extern FillCheckerFunction gst_video_mixer_fill_checker_i420; +#define gst_video_mixer_fill_checker_yv12 gst_video_mixer_fill_checker_i420 +extern FillCheckerFunction gst_video_mixer_fill_checker_y41b; +extern FillCheckerFunction gst_video_mixer_fill_checker_y42b; +extern FillCheckerFunction gst_video_mixer_fill_checker_y444; +extern FillCheckerFunction gst_video_mixer_fill_checker_rgb; +#define gst_video_mixer_fill_checker_bgr gst_video_mixer_fill_checker_rgb +extern FillCheckerFunction gst_video_mixer_fill_checker_rgbx; +#define gst_video_mixer_fill_checker_bgrx gst_video_mixer_fill_checker_rgbx +#define gst_video_mixer_fill_checker_xrgb gst_video_mixer_fill_checker_rgbx +#define gst_video_mixer_fill_checker_xbgr gst_video_mixer_fill_checker_rgbx +extern FillCheckerFunction gst_video_mixer_fill_checker_yuy2; +#define gst_video_mixer_fill_checker_yvyu gst_video_mixer_fill_checker_yuy2; +extern FillCheckerFunction gst_video_mixer_fill_checker_uyvy; + +extern FillColorFunction gst_video_mixer_fill_color_argb; +extern FillColorFunction gst_video_mixer_fill_color_abgr; +extern FillColorFunction gst_video_mixer_fill_color_bgra; +extern FillColorFunction gst_video_mixer_fill_color_rgba; +extern FillColorFunction gst_video_mixer_fill_color_ayuv; +extern FillColorFunction gst_video_mixer_fill_color_i420; +extern FillColorFunction gst_video_mixer_fill_color_yv12; +extern FillColorFunction gst_video_mixer_fill_color_y41b; +extern FillColorFunction gst_video_mixer_fill_color_y42b; +extern FillColorFunction gst_video_mixer_fill_color_y444; +extern FillColorFunction gst_video_mixer_fill_color_rgb; +extern FillColorFunction gst_video_mixer_fill_color_bgr; +extern FillColorFunction gst_video_mixer_fill_color_xrgb; +extern FillColorFunction gst_video_mixer_fill_color_xbgr; +extern FillColorFunction gst_video_mixer_fill_color_rgbx; +extern FillColorFunction gst_video_mixer_fill_color_bgrx; +extern FillColorFunction gst_video_mixer_fill_color_yuy2; +extern FillColorFunction gst_video_mixer_fill_color_yvyu; +extern FillColorFunction gst_video_mixer_fill_color_uyvy; + +void gst_video_mixer_init_blend (void); + +#endif /* __BLEND_H__ */ diff --git a/gst/videomixer/blendorc-dist.c b/gst/videomixer/blendorc-dist.c new file mode 100644 index 0000000..ee783d8 --- /dev/null +++ b/gst/videomixer/blendorc-dist.c @@ -0,0 +1,2203 @@ + +/* autogenerated from blendorc.orc */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +#ifndef _ORC_INTEGER_TYPEDEFS_ +#define _ORC_INTEGER_TYPEDEFS_ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +typedef int8_t orc_int8; +typedef int16_t orc_int16; +typedef int32_t orc_int32; +typedef int64_t orc_int64; +typedef uint8_t orc_uint8; +typedef uint16_t orc_uint16; +typedef uint32_t orc_uint32; +typedef uint64_t orc_uint64; +#define ORC_UINT64_C(x) UINT64_C(x) +#elif defined(_MSC_VER) +typedef signed __int8 orc_int8; +typedef signed __int16 orc_int16; +typedef signed __int32 orc_int32; +typedef signed __int64 orc_int64; +typedef unsigned __int8 orc_uint8; +typedef unsigned __int16 orc_uint16; +typedef unsigned __int32 orc_uint32; +typedef unsigned __int64 orc_uint64; +#define ORC_UINT64_C(x) (x##Ui64) +#define inline __inline +#else +#include +typedef signed char orc_int8; +typedef short orc_int16; +typedef int orc_int32; +typedef unsigned char orc_uint8; +typedef unsigned short orc_uint16; +typedef unsigned int orc_uint32; +#if INT_MAX == LONG_MAX +typedef long long orc_int64; +typedef unsigned long long orc_uint64; +#define ORC_UINT64_C(x) (x##ULL) +#else +typedef long orc_int64; +typedef unsigned long orc_uint64; +#define ORC_UINT64_C(x) (x##UL) +#endif +#endif +typedef union +{ + orc_int16 i; + orc_int8 x2[2]; +} orc_union16; +typedef union +{ + orc_int32 i; + float f; + orc_int16 x2[2]; + orc_int8 x4[4]; +} orc_union32; +typedef union +{ + orc_int64 i; + double f; + orc_int32 x2[2]; + float x2f[2]; + orc_int16 x4[4]; +} orc_union64; +#endif +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif + +#ifndef DISABLE_ORC +#include +#endif +void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n); +void orc_memcpy_u32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, + int n); +void orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); +void orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); +void orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); +void orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); +void orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); + + +/* begin Orc C target preamble */ +#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) +#define ORC_ABS(a) ((a)<0 ? -(a) : (a)) +#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) +#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) +#define ORC_SB_MAX 127 +#define ORC_SB_MIN (-1-ORC_SB_MAX) +#define ORC_UB_MAX 255 +#define ORC_UB_MIN 0 +#define ORC_SW_MAX 32767 +#define ORC_SW_MIN (-1-ORC_SW_MAX) +#define ORC_UW_MAX 65535 +#define ORC_UW_MIN 0 +#define ORC_SL_MAX 2147483647 +#define ORC_SL_MIN (-1-ORC_SL_MAX) +#define ORC_UL_MAX 4294967295U +#define ORC_UL_MIN 0 +#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) +#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) +#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) +#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) +#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) +#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) +#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) +#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) +#define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56)) +#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) +#define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff)) +#define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0)) +#define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff))) +#define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0)) +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif +/* end Orc C target preamble */ + + + +/* orc_splat_u32 */ +#ifdef DISABLE_ORC +void +orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n) +{ + int i; + orc_union32 *ORC_RESTRICT ptr0; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (orc_union32 *) d1; + + /* 0: loadpl */ + var32.i = p1; + + for (i = 0; i < n; i++) { + /* 1: copyl */ + var33.i = var32.i; + /* 2: storel */ + ptr0[i] = var33; + } + +} + +#else +static void +_backup_orc_splat_u32 (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_union32 *ORC_RESTRICT ptr0; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (orc_union32 *) ex->arrays[0]; + + /* 0: loadpl */ + var32.i = ex->params[24]; + + for (i = 0; i < n; i++) { + /* 1: copyl */ + var33.i = var32.i; + /* 2: storel */ + ptr0[i] = var33; + } + +} + +void +orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "orc_splat_u32"); + orc_program_set_backup_function (p, _backup_orc_splat_u32); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_parameter (p, 4, "p1"); + + orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_memcpy_u32 */ +#ifdef DISABLE_ORC +void +orc_memcpy_u32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, + int n) +{ + int i; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (orc_union32 *) d1; + ptr4 = (orc_union32 *) s1; + + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var32 = ptr4[i]; + /* 1: copyl */ + var33.i = var32.i; + /* 2: storel */ + ptr0[i] = var33; + } + +} + +#else +static void +_backup_orc_memcpy_u32 (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (orc_union32 *) ex->arrays[0]; + ptr4 = (orc_union32 *) ex->arrays[4]; + + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var32 = ptr4[i]; + /* 1: copyl */ + var33.i = var32.i; + /* 2: storel */ + ptr0[i] = var33; + } + +} + +void +orc_memcpy_u32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, + int n) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_name (p, "orc_memcpy_u32"); + orc_program_set_backup_function (p, _backup_orc_memcpy_u32); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_source (p, 4, "s1"); + + orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->arrays[ORC_VAR_S1] = (void *) s1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_blend_u8 */ +#ifdef DISABLE_ORC +void +orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + int i; + int j; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + orc_int8 var34; + orc_int8 var35; + orc_union16 var36; + orc_int8 var37; + orc_union16 var38; + orc_union16 var39; + orc_union16 var40; + orc_union16 var41; + orc_union16 var42; + orc_union16 var43; + orc_union16 var44; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); + ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); + + /* 5: loadpw */ + var36.i = p1; + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var34 = ptr0[i]; + /* 1: convubw */ + var38.i = (orc_uint8) var34; + /* 2: loadb */ + var35 = ptr4[i]; + /* 3: convubw */ + var39.i = (orc_uint8) var35; + /* 4: subw */ + var40.i = var39.i - var38.i; + /* 6: mullw */ + var41.i = (var40.i * var36.i) & 0xffff; + /* 7: shlw */ + var42.i = var38.i << 8; + /* 8: addw */ + var43.i = var42.i + var41.i; + /* 9: shruw */ + var44.i = ((orc_uint16) var43.i) >> 8; + /* 10: convsuswb */ + var37 = ORC_CLAMP_UB (var44.i); + /* 11: storeb */ + ptr0[i] = var37; + } + } + +} + +#else +static void +_backup_orc_blend_u8 (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int j; + int n = ex->n; + int m = ex->params[ORC_VAR_A1]; + orc_int8 *ORC_RESTRICT ptr0; + const orc_int8 *ORC_RESTRICT ptr4; + orc_int8 var34; + orc_int8 var35; + orc_union16 var36; + orc_int8 var37; + orc_union16 var38; + orc_union16 var39; + orc_union16 var40; + orc_union16 var41; + orc_union16 var42; + orc_union16 var43; + orc_union16 var44; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); + ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); + + /* 5: loadpw */ + var36.i = ex->params[24]; + + for (i = 0; i < n; i++) { + /* 0: loadb */ + var34 = ptr0[i]; + /* 1: convubw */ + var38.i = (orc_uint8) var34; + /* 2: loadb */ + var35 = ptr4[i]; + /* 3: convubw */ + var39.i = (orc_uint8) var35; + /* 4: subw */ + var40.i = var39.i - var38.i; + /* 6: mullw */ + var41.i = (var40.i * var36.i) & 0xffff; + /* 7: shlw */ + var42.i = var38.i << 8; + /* 8: addw */ + var43.i = var42.i + var41.i; + /* 9: shruw */ + var44.i = ((orc_uint16) var43.i) >> 8; + /* 10: convsuswb */ + var37 = ORC_CLAMP_UB (var44.i); + /* 11: storeb */ + ptr0[i] = var37; + } + } + +} + +void +orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_2d (p); + orc_program_set_name (p, "orc_blend_u8"); + orc_program_set_backup_function (p, _backup_orc_blend_u8); + orc_program_add_destination (p, 1, "d1"); + orc_program_add_source (p, 1, "s1"); + orc_program_add_constant (p, 1, 0x00000008, "c1"); + orc_program_add_parameter (p, 2, "p1"); + orc_program_add_temporary (p, 2, "t1"); + orc_program_add_temporary (p, 2, "t2"); + + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1, + ORC_VAR_D1); + orc_program_append_2 (p, "shlw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T2, + ORC_VAR_D1); + orc_program_append_2 (p, "shruw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T2, + ORC_VAR_D1, ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ORC_EXECUTOR_M (ex) = m; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_D1] = d1_stride; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->params[ORC_VAR_S1] = s1_stride; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_blend_argb */ +#ifdef DISABLE_ORC +void +orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + int i; + int j; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union64 var39; + orc_union32 var40; + orc_union32 var41; + orc_union16 var42; + orc_int8 var43; + orc_union32 var44; + orc_union64 var45; + orc_union64 var46; + orc_union64 var47; + orc_union64 var48; + orc_union32 var49; + orc_union64 var50; + orc_union64 var51; + orc_union64 var52; + orc_union64 var53; + orc_union64 var54; + orc_union32 var55; + orc_union32 var56; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); + ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); + + /* 5: loadpw */ + var39.x4[0] = p1; + var39.x4[1] = p1; + var39.x4[2] = p1; + var39.x4[3] = p1; + /* 16: loadpl */ + var40.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var41 = ptr4[i]; + /* 1: convlw */ + var42.i = var41.i; + /* 2: convwb */ + var43 = var42.i; + /* 3: splatbl */ + var44.i = + ((var43 & 0xff) << 24) | ((var43 & 0xff) << 16) | ((var43 & 0xff) << + 8) | (var43 & 0xff); + /* 4: convubw */ + var45.x4[0] = (orc_uint8) var44.x4[0]; + var45.x4[1] = (orc_uint8) var44.x4[1]; + var45.x4[2] = (orc_uint8) var44.x4[2]; + var45.x4[3] = (orc_uint8) var44.x4[3]; + /* 6: mullw */ + var46.x4[0] = (var45.x4[0] * var39.x4[0]) & 0xffff; + var46.x4[1] = (var45.x4[1] * var39.x4[1]) & 0xffff; + var46.x4[2] = (var45.x4[2] * var39.x4[2]) & 0xffff; + var46.x4[3] = (var45.x4[3] * var39.x4[3]) & 0xffff; + /* 7: shruw */ + var47.x4[0] = ((orc_uint16) var46.x4[0]) >> 8; + var47.x4[1] = ((orc_uint16) var46.x4[1]) >> 8; + var47.x4[2] = ((orc_uint16) var46.x4[2]) >> 8; + var47.x4[3] = ((orc_uint16) var46.x4[3]) >> 8; + /* 8: convubw */ + var48.x4[0] = (orc_uint8) var41.x4[0]; + var48.x4[1] = (orc_uint8) var41.x4[1]; + var48.x4[2] = (orc_uint8) var41.x4[2]; + var48.x4[3] = (orc_uint8) var41.x4[3]; + /* 9: loadl */ + var49 = ptr0[i]; + /* 10: convubw */ + var50.x4[0] = (orc_uint8) var49.x4[0]; + var50.x4[1] = (orc_uint8) var49.x4[1]; + var50.x4[2] = (orc_uint8) var49.x4[2]; + var50.x4[3] = (orc_uint8) var49.x4[3]; + /* 11: subw */ + var51.x4[0] = var48.x4[0] - var50.x4[0]; + var51.x4[1] = var48.x4[1] - var50.x4[1]; + var51.x4[2] = var48.x4[2] - var50.x4[2]; + var51.x4[3] = var48.x4[3] - var50.x4[3]; + /* 12: mullw */ + var52.x4[0] = (var51.x4[0] * var47.x4[0]) & 0xffff; + var52.x4[1] = (var51.x4[1] * var47.x4[1]) & 0xffff; + var52.x4[2] = (var51.x4[2] * var47.x4[2]) & 0xffff; + var52.x4[3] = (var51.x4[3] * var47.x4[3]) & 0xffff; + /* 13: div255w */ + var53.x4[0] = + ((orc_uint16) (((orc_uint16) (var52.x4[0] + 128)) + + (((orc_uint16) (var52.x4[0] + 128)) >> 8))) >> 8; + var53.x4[1] = + ((orc_uint16) (((orc_uint16) (var52.x4[1] + 128)) + + (((orc_uint16) (var52.x4[1] + 128)) >> 8))) >> 8; + var53.x4[2] = + ((orc_uint16) (((orc_uint16) (var52.x4[2] + 128)) + + (((orc_uint16) (var52.x4[2] + 128)) >> 8))) >> 8; + var53.x4[3] = + ((orc_uint16) (((orc_uint16) (var52.x4[3] + 128)) + + (((orc_uint16) (var52.x4[3] + 128)) >> 8))) >> 8; + /* 14: addw */ + var54.x4[0] = var50.x4[0] + var53.x4[0]; + var54.x4[1] = var50.x4[1] + var53.x4[1]; + var54.x4[2] = var50.x4[2] + var53.x4[2]; + var54.x4[3] = var50.x4[3] + var53.x4[3]; + /* 15: convwb */ + var55.x4[0] = var54.x4[0]; + var55.x4[1] = var54.x4[1]; + var55.x4[2] = var54.x4[2]; + var55.x4[3] = var54.x4[3]; + /* 17: orl */ + var56.i = var55.i | var40.i; + /* 18: storel */ + ptr0[i] = var56; + } + } + +} + +#else +static void +_backup_orc_blend_argb (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int j; + int n = ex->n; + int m = ex->params[ORC_VAR_A1]; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union64 var39; + orc_union32 var40; + orc_union32 var41; + orc_union16 var42; + orc_int8 var43; + orc_union32 var44; + orc_union64 var45; + orc_union64 var46; + orc_union64 var47; + orc_union64 var48; + orc_union32 var49; + orc_union64 var50; + orc_union64 var51; + orc_union64 var52; + orc_union64 var53; + orc_union64 var54; + orc_union32 var55; + orc_union32 var56; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); + ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); + + /* 5: loadpw */ + var39.x4[0] = ex->params[24]; + var39.x4[1] = ex->params[24]; + var39.x4[2] = ex->params[24]; + var39.x4[3] = ex->params[24]; + /* 16: loadpl */ + var40.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var41 = ptr4[i]; + /* 1: convlw */ + var42.i = var41.i; + /* 2: convwb */ + var43 = var42.i; + /* 3: splatbl */ + var44.i = + ((var43 & 0xff) << 24) | ((var43 & 0xff) << 16) | ((var43 & 0xff) << + 8) | (var43 & 0xff); + /* 4: convubw */ + var45.x4[0] = (orc_uint8) var44.x4[0]; + var45.x4[1] = (orc_uint8) var44.x4[1]; + var45.x4[2] = (orc_uint8) var44.x4[2]; + var45.x4[3] = (orc_uint8) var44.x4[3]; + /* 6: mullw */ + var46.x4[0] = (var45.x4[0] * var39.x4[0]) & 0xffff; + var46.x4[1] = (var45.x4[1] * var39.x4[1]) & 0xffff; + var46.x4[2] = (var45.x4[2] * var39.x4[2]) & 0xffff; + var46.x4[3] = (var45.x4[3] * var39.x4[3]) & 0xffff; + /* 7: shruw */ + var47.x4[0] = ((orc_uint16) var46.x4[0]) >> 8; + var47.x4[1] = ((orc_uint16) var46.x4[1]) >> 8; + var47.x4[2] = ((orc_uint16) var46.x4[2]) >> 8; + var47.x4[3] = ((orc_uint16) var46.x4[3]) >> 8; + /* 8: convubw */ + var48.x4[0] = (orc_uint8) var41.x4[0]; + var48.x4[1] = (orc_uint8) var41.x4[1]; + var48.x4[2] = (orc_uint8) var41.x4[2]; + var48.x4[3] = (orc_uint8) var41.x4[3]; + /* 9: loadl */ + var49 = ptr0[i]; + /* 10: convubw */ + var50.x4[0] = (orc_uint8) var49.x4[0]; + var50.x4[1] = (orc_uint8) var49.x4[1]; + var50.x4[2] = (orc_uint8) var49.x4[2]; + var50.x4[3] = (orc_uint8) var49.x4[3]; + /* 11: subw */ + var51.x4[0] = var48.x4[0] - var50.x4[0]; + var51.x4[1] = var48.x4[1] - var50.x4[1]; + var51.x4[2] = var48.x4[2] - var50.x4[2]; + var51.x4[3] = var48.x4[3] - var50.x4[3]; + /* 12: mullw */ + var52.x4[0] = (var51.x4[0] * var47.x4[0]) & 0xffff; + var52.x4[1] = (var51.x4[1] * var47.x4[1]) & 0xffff; + var52.x4[2] = (var51.x4[2] * var47.x4[2]) & 0xffff; + var52.x4[3] = (var51.x4[3] * var47.x4[3]) & 0xffff; + /* 13: div255w */ + var53.x4[0] = + ((orc_uint16) (((orc_uint16) (var52.x4[0] + 128)) + + (((orc_uint16) (var52.x4[0] + 128)) >> 8))) >> 8; + var53.x4[1] = + ((orc_uint16) (((orc_uint16) (var52.x4[1] + 128)) + + (((orc_uint16) (var52.x4[1] + 128)) >> 8))) >> 8; + var53.x4[2] = + ((orc_uint16) (((orc_uint16) (var52.x4[2] + 128)) + + (((orc_uint16) (var52.x4[2] + 128)) >> 8))) >> 8; + var53.x4[3] = + ((orc_uint16) (((orc_uint16) (var52.x4[3] + 128)) + + (((orc_uint16) (var52.x4[3] + 128)) >> 8))) >> 8; + /* 14: addw */ + var54.x4[0] = var50.x4[0] + var53.x4[0]; + var54.x4[1] = var50.x4[1] + var53.x4[1]; + var54.x4[2] = var50.x4[2] + var53.x4[2]; + var54.x4[3] = var50.x4[3] + var53.x4[3]; + /* 15: convwb */ + var55.x4[0] = var54.x4[0]; + var55.x4[1] = var54.x4[1]; + var55.x4[2] = var54.x4[2]; + var55.x4[3] = var54.x4[3]; + /* 17: orl */ + var56.i = var55.i | var40.i; + /* 18: storel */ + ptr0[i] = var56; + } + } + +} + +void +orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_2d (p); + orc_program_set_name (p, "orc_blend_argb"); + orc_program_set_backup_function (p, _backup_orc_blend_argb); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_source (p, 4, "s1"); + orc_program_add_constant (p, 4, 0x000000ff, "c1"); + orc_program_add_constant (p, 4, 0x00000008, "c2"); + orc_program_add_parameter (p, 2, "p1"); + orc_program_add_temporary (p, 4, "t1"); + orc_program_add_temporary (p, 2, "t2"); + orc_program_add_temporary (p, 1, "t3"); + orc_program_add_temporary (p, 4, "t4"); + orc_program_add_temporary (p, 8, "t5"); + orc_program_add_temporary (p, 8, "t6"); + orc_program_add_temporary (p, 8, "t7"); + + orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_P1, + ORC_VAR_D1); + orc_program_append_2 (p, "shruw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C2, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "subw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T7, + ORC_VAR_D1); + orc_program_append_2 (p, "div255w", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T6, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ORC_EXECUTOR_M (ex) = m; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_D1] = d1_stride; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->params[ORC_VAR_S1] = s1_stride; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_blend_bgra */ +#ifdef DISABLE_ORC +void +orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + int i; + int j; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union64 var40; + orc_union32 var41; + orc_union32 var42; + orc_union32 var43; + orc_union16 var44; + orc_int8 var45; + orc_union32 var46; + orc_union64 var47; + orc_union64 var48; + orc_union64 var49; + orc_union64 var50; + orc_union32 var51; + orc_union64 var52; + orc_union64 var53; + orc_union64 var54; + orc_union64 var55; + orc_union64 var56; + orc_union32 var57; + orc_union32 var58; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); + ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); + + /* 6: loadpw */ + var40.x4[0] = p1; + var40.x4[1] = p1; + var40.x4[2] = p1; + var40.x4[3] = p1; + /* 17: loadpl */ + var41.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var42 = ptr4[i]; + /* 1: shrul */ + var43.i = ((orc_uint32) var42.i) >> 24; + /* 2: convlw */ + var44.i = var43.i; + /* 3: convwb */ + var45 = var44.i; + /* 4: splatbl */ + var46.i = + ((var45 & 0xff) << 24) | ((var45 & 0xff) << 16) | ((var45 & 0xff) << + 8) | (var45 & 0xff); + /* 5: convubw */ + var47.x4[0] = (orc_uint8) var46.x4[0]; + var47.x4[1] = (orc_uint8) var46.x4[1]; + var47.x4[2] = (orc_uint8) var46.x4[2]; + var47.x4[3] = (orc_uint8) var46.x4[3]; + /* 7: mullw */ + var48.x4[0] = (var47.x4[0] * var40.x4[0]) & 0xffff; + var48.x4[1] = (var47.x4[1] * var40.x4[1]) & 0xffff; + var48.x4[2] = (var47.x4[2] * var40.x4[2]) & 0xffff; + var48.x4[3] = (var47.x4[3] * var40.x4[3]) & 0xffff; + /* 8: shruw */ + var49.x4[0] = ((orc_uint16) var48.x4[0]) >> 8; + var49.x4[1] = ((orc_uint16) var48.x4[1]) >> 8; + var49.x4[2] = ((orc_uint16) var48.x4[2]) >> 8; + var49.x4[3] = ((orc_uint16) var48.x4[3]) >> 8; + /* 9: convubw */ + var50.x4[0] = (orc_uint8) var42.x4[0]; + var50.x4[1] = (orc_uint8) var42.x4[1]; + var50.x4[2] = (orc_uint8) var42.x4[2]; + var50.x4[3] = (orc_uint8) var42.x4[3]; + /* 10: loadl */ + var51 = ptr0[i]; + /* 11: convubw */ + var52.x4[0] = (orc_uint8) var51.x4[0]; + var52.x4[1] = (orc_uint8) var51.x4[1]; + var52.x4[2] = (orc_uint8) var51.x4[2]; + var52.x4[3] = (orc_uint8) var51.x4[3]; + /* 12: subw */ + var53.x4[0] = var50.x4[0] - var52.x4[0]; + var53.x4[1] = var50.x4[1] - var52.x4[1]; + var53.x4[2] = var50.x4[2] - var52.x4[2]; + var53.x4[3] = var50.x4[3] - var52.x4[3]; + /* 13: mullw */ + var54.x4[0] = (var53.x4[0] * var49.x4[0]) & 0xffff; + var54.x4[1] = (var53.x4[1] * var49.x4[1]) & 0xffff; + var54.x4[2] = (var53.x4[2] * var49.x4[2]) & 0xffff; + var54.x4[3] = (var53.x4[3] * var49.x4[3]) & 0xffff; + /* 14: div255w */ + var55.x4[0] = + ((orc_uint16) (((orc_uint16) (var54.x4[0] + 128)) + + (((orc_uint16) (var54.x4[0] + 128)) >> 8))) >> 8; + var55.x4[1] = + ((orc_uint16) (((orc_uint16) (var54.x4[1] + 128)) + + (((orc_uint16) (var54.x4[1] + 128)) >> 8))) >> 8; + var55.x4[2] = + ((orc_uint16) (((orc_uint16) (var54.x4[2] + 128)) + + (((orc_uint16) (var54.x4[2] + 128)) >> 8))) >> 8; + var55.x4[3] = + ((orc_uint16) (((orc_uint16) (var54.x4[3] + 128)) + + (((orc_uint16) (var54.x4[3] + 128)) >> 8))) >> 8; + /* 15: addw */ + var56.x4[0] = var52.x4[0] + var55.x4[0]; + var56.x4[1] = var52.x4[1] + var55.x4[1]; + var56.x4[2] = var52.x4[2] + var55.x4[2]; + var56.x4[3] = var52.x4[3] + var55.x4[3]; + /* 16: convwb */ + var57.x4[0] = var56.x4[0]; + var57.x4[1] = var56.x4[1]; + var57.x4[2] = var56.x4[2]; + var57.x4[3] = var56.x4[3]; + /* 18: orl */ + var58.i = var57.i | var41.i; + /* 19: storel */ + ptr0[i] = var58; + } + } + +} + +#else +static void +_backup_orc_blend_bgra (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int j; + int n = ex->n; + int m = ex->params[ORC_VAR_A1]; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union64 var40; + orc_union32 var41; + orc_union32 var42; + orc_union32 var43; + orc_union16 var44; + orc_int8 var45; + orc_union32 var46; + orc_union64 var47; + orc_union64 var48; + orc_union64 var49; + orc_union64 var50; + orc_union32 var51; + orc_union64 var52; + orc_union64 var53; + orc_union64 var54; + orc_union64 var55; + orc_union64 var56; + orc_union32 var57; + orc_union32 var58; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); + ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); + + /* 6: loadpw */ + var40.x4[0] = ex->params[24]; + var40.x4[1] = ex->params[24]; + var40.x4[2] = ex->params[24]; + var40.x4[3] = ex->params[24]; + /* 17: loadpl */ + var41.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var42 = ptr4[i]; + /* 1: shrul */ + var43.i = ((orc_uint32) var42.i) >> 24; + /* 2: convlw */ + var44.i = var43.i; + /* 3: convwb */ + var45 = var44.i; + /* 4: splatbl */ + var46.i = + ((var45 & 0xff) << 24) | ((var45 & 0xff) << 16) | ((var45 & 0xff) << + 8) | (var45 & 0xff); + /* 5: convubw */ + var47.x4[0] = (orc_uint8) var46.x4[0]; + var47.x4[1] = (orc_uint8) var46.x4[1]; + var47.x4[2] = (orc_uint8) var46.x4[2]; + var47.x4[3] = (orc_uint8) var46.x4[3]; + /* 7: mullw */ + var48.x4[0] = (var47.x4[0] * var40.x4[0]) & 0xffff; + var48.x4[1] = (var47.x4[1] * var40.x4[1]) & 0xffff; + var48.x4[2] = (var47.x4[2] * var40.x4[2]) & 0xffff; + var48.x4[3] = (var47.x4[3] * var40.x4[3]) & 0xffff; + /* 8: shruw */ + var49.x4[0] = ((orc_uint16) var48.x4[0]) >> 8; + var49.x4[1] = ((orc_uint16) var48.x4[1]) >> 8; + var49.x4[2] = ((orc_uint16) var48.x4[2]) >> 8; + var49.x4[3] = ((orc_uint16) var48.x4[3]) >> 8; + /* 9: convubw */ + var50.x4[0] = (orc_uint8) var42.x4[0]; + var50.x4[1] = (orc_uint8) var42.x4[1]; + var50.x4[2] = (orc_uint8) var42.x4[2]; + var50.x4[3] = (orc_uint8) var42.x4[3]; + /* 10: loadl */ + var51 = ptr0[i]; + /* 11: convubw */ + var52.x4[0] = (orc_uint8) var51.x4[0]; + var52.x4[1] = (orc_uint8) var51.x4[1]; + var52.x4[2] = (orc_uint8) var51.x4[2]; + var52.x4[3] = (orc_uint8) var51.x4[3]; + /* 12: subw */ + var53.x4[0] = var50.x4[0] - var52.x4[0]; + var53.x4[1] = var50.x4[1] - var52.x4[1]; + var53.x4[2] = var50.x4[2] - var52.x4[2]; + var53.x4[3] = var50.x4[3] - var52.x4[3]; + /* 13: mullw */ + var54.x4[0] = (var53.x4[0] * var49.x4[0]) & 0xffff; + var54.x4[1] = (var53.x4[1] * var49.x4[1]) & 0xffff; + var54.x4[2] = (var53.x4[2] * var49.x4[2]) & 0xffff; + var54.x4[3] = (var53.x4[3] * var49.x4[3]) & 0xffff; + /* 14: div255w */ + var55.x4[0] = + ((orc_uint16) (((orc_uint16) (var54.x4[0] + 128)) + + (((orc_uint16) (var54.x4[0] + 128)) >> 8))) >> 8; + var55.x4[1] = + ((orc_uint16) (((orc_uint16) (var54.x4[1] + 128)) + + (((orc_uint16) (var54.x4[1] + 128)) >> 8))) >> 8; + var55.x4[2] = + ((orc_uint16) (((orc_uint16) (var54.x4[2] + 128)) + + (((orc_uint16) (var54.x4[2] + 128)) >> 8))) >> 8; + var55.x4[3] = + ((orc_uint16) (((orc_uint16) (var54.x4[3] + 128)) + + (((orc_uint16) (var54.x4[3] + 128)) >> 8))) >> 8; + /* 15: addw */ + var56.x4[0] = var52.x4[0] + var55.x4[0]; + var56.x4[1] = var52.x4[1] + var55.x4[1]; + var56.x4[2] = var52.x4[2] + var55.x4[2]; + var56.x4[3] = var52.x4[3] + var55.x4[3]; + /* 16: convwb */ + var57.x4[0] = var56.x4[0]; + var57.x4[1] = var56.x4[1]; + var57.x4[2] = var56.x4[2]; + var57.x4[3] = var56.x4[3]; + /* 18: orl */ + var58.i = var57.i | var41.i; + /* 19: storel */ + ptr0[i] = var58; + } + } + +} + +void +orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_2d (p); + orc_program_set_name (p, "orc_blend_bgra"); + orc_program_set_backup_function (p, _backup_orc_blend_bgra); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_source (p, 4, "s1"); + orc_program_add_constant (p, 4, 0xff000000, "c1"); + orc_program_add_constant (p, 4, 0x00000018, "c2"); + orc_program_add_constant (p, 4, 0x00000008, "c3"); + orc_program_add_parameter (p, 2, "p1"); + orc_program_add_temporary (p, 4, "t1"); + orc_program_add_temporary (p, 4, "t2"); + orc_program_add_temporary (p, 2, "t3"); + orc_program_add_temporary (p, 1, "t4"); + orc_program_add_temporary (p, 4, "t5"); + orc_program_add_temporary (p, 8, "t6"); + orc_program_add_temporary (p, 8, "t7"); + orc_program_add_temporary (p, 8, "t8"); + + orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C2, + ORC_VAR_D1); + orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_P1, + ORC_VAR_D1); + orc_program_append_2 (p, "shruw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_C3, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "subw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T8, + ORC_VAR_D1); + orc_program_append_2 (p, "div255w", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T7, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, + ORC_VAR_D1); + orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ORC_EXECUTOR_M (ex) = m; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_D1] = d1_stride; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->params[ORC_VAR_S1] = s1_stride; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_overlay_argb */ +#ifdef DISABLE_ORC +void +orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + int i; + int j; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union64 var41; + orc_union32 var42; + orc_union32 var43; + orc_union32 var44; + orc_union16 var45; + orc_int8 var46; + orc_union32 var47; + orc_union64 var48; + orc_union64 var49; + orc_union64 var50; + orc_union64 var51; + orc_union64 var52; + orc_union32 var53; + orc_union64 var54; + orc_union64 var55; + orc_union32 var56; + orc_union16 var57; + orc_int8 var58; + orc_union32 var59; + orc_union64 var60; + orc_union64 var61; + orc_union64 var62; + orc_union64 var63; + orc_union64 var64; + orc_union64 var65; + orc_union64 var66; + orc_union64 var67; + orc_union32 var68; + orc_union32 var69; + orc_union32 var70; + orc_union32 var71; + orc_union32 var72; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); + ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); + + /* 5: loadpw */ + var41.x4[0] = p1; + var41.x4[1] = p1; + var41.x4[2] = p1; + var41.x4[3] = p1; + /* 10: loadpl */ + var53.i = (int) 0xffffffff; /* -1 or 2.122e-314f */ + /* 26: loadpl */ + var42.i = (int) 0xffffff00; /* -256 or 2.122e-314f */ + /* 29: loadpl */ + var43.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var44 = ptr4[i]; + /* 1: convlw */ + var45.i = var44.i; + /* 2: convwb */ + var46 = var45.i; + /* 3: splatbl */ + var47.i = + ((var46 & 0xff) << 24) | ((var46 & 0xff) << 16) | ((var46 & 0xff) << + 8) | (var46 & 0xff); + /* 4: convubw */ + var48.x4[0] = (orc_uint8) var47.x4[0]; + var48.x4[1] = (orc_uint8) var47.x4[1]; + var48.x4[2] = (orc_uint8) var47.x4[2]; + var48.x4[3] = (orc_uint8) var47.x4[3]; + /* 6: mullw */ + var49.x4[0] = (var48.x4[0] * var41.x4[0]) & 0xffff; + var49.x4[1] = (var48.x4[1] * var41.x4[1]) & 0xffff; + var49.x4[2] = (var48.x4[2] * var41.x4[2]) & 0xffff; + var49.x4[3] = (var48.x4[3] * var41.x4[3]) & 0xffff; + /* 7: shruw */ + var50.x4[0] = ((orc_uint16) var49.x4[0]) >> 8; + var50.x4[1] = ((orc_uint16) var49.x4[1]) >> 8; + var50.x4[2] = ((orc_uint16) var49.x4[2]) >> 8; + var50.x4[3] = ((orc_uint16) var49.x4[3]) >> 8; + /* 8: convubw */ + var51.x4[0] = (orc_uint8) var44.x4[0]; + var51.x4[1] = (orc_uint8) var44.x4[1]; + var51.x4[2] = (orc_uint8) var44.x4[2]; + var51.x4[3] = (orc_uint8) var44.x4[3]; + /* 9: mullw */ + var52.x4[0] = (var51.x4[0] * var50.x4[0]) & 0xffff; + var52.x4[1] = (var51.x4[1] * var50.x4[1]) & 0xffff; + var52.x4[2] = (var51.x4[2] * var50.x4[2]) & 0xffff; + var52.x4[3] = (var51.x4[3] * var50.x4[3]) & 0xffff; + /* 11: convubw */ + var54.x4[0] = (orc_uint8) var53.x4[0]; + var54.x4[1] = (orc_uint8) var53.x4[1]; + var54.x4[2] = (orc_uint8) var53.x4[2]; + var54.x4[3] = (orc_uint8) var53.x4[3]; + /* 12: subw */ + var55.x4[0] = var54.x4[0] - var50.x4[0]; + var55.x4[1] = var54.x4[1] - var50.x4[1]; + var55.x4[2] = var54.x4[2] - var50.x4[2]; + var55.x4[3] = var54.x4[3] - var50.x4[3]; + /* 13: loadl */ + var56 = ptr0[i]; + /* 14: convlw */ + var57.i = var56.i; + /* 15: convwb */ + var58 = var57.i; + /* 16: splatbl */ + var59.i = + ((var58 & 0xff) << 24) | ((var58 & 0xff) << 16) | ((var58 & 0xff) << + 8) | (var58 & 0xff); + /* 17: convubw */ + var60.x4[0] = (orc_uint8) var59.x4[0]; + var60.x4[1] = (orc_uint8) var59.x4[1]; + var60.x4[2] = (orc_uint8) var59.x4[2]; + var60.x4[3] = (orc_uint8) var59.x4[3]; + /* 18: mullw */ + var61.x4[0] = (var60.x4[0] * var55.x4[0]) & 0xffff; + var61.x4[1] = (var60.x4[1] * var55.x4[1]) & 0xffff; + var61.x4[2] = (var60.x4[2] * var55.x4[2]) & 0xffff; + var61.x4[3] = (var60.x4[3] * var55.x4[3]) & 0xffff; + /* 19: div255w */ + var62.x4[0] = + ((orc_uint16) (((orc_uint16) (var61.x4[0] + 128)) + + (((orc_uint16) (var61.x4[0] + 128)) >> 8))) >> 8; + var62.x4[1] = + ((orc_uint16) (((orc_uint16) (var61.x4[1] + 128)) + + (((orc_uint16) (var61.x4[1] + 128)) >> 8))) >> 8; + var62.x4[2] = + ((orc_uint16) (((orc_uint16) (var61.x4[2] + 128)) + + (((orc_uint16) (var61.x4[2] + 128)) >> 8))) >> 8; + var62.x4[3] = + ((orc_uint16) (((orc_uint16) (var61.x4[3] + 128)) + + (((orc_uint16) (var61.x4[3] + 128)) >> 8))) >> 8; + /* 20: convubw */ + var63.x4[0] = (orc_uint8) var56.x4[0]; + var63.x4[1] = (orc_uint8) var56.x4[1]; + var63.x4[2] = (orc_uint8) var56.x4[2]; + var63.x4[3] = (orc_uint8) var56.x4[3]; + /* 21: mullw */ + var64.x4[0] = (var63.x4[0] * var62.x4[0]) & 0xffff; + var64.x4[1] = (var63.x4[1] * var62.x4[1]) & 0xffff; + var64.x4[2] = (var63.x4[2] * var62.x4[2]) & 0xffff; + var64.x4[3] = (var63.x4[3] * var62.x4[3]) & 0xffff; + /* 22: addw */ + var65.x4[0] = var64.x4[0] + var52.x4[0]; + var65.x4[1] = var64.x4[1] + var52.x4[1]; + var65.x4[2] = var64.x4[2] + var52.x4[2]; + var65.x4[3] = var64.x4[3] + var52.x4[3]; + /* 23: addw */ + var66.x4[0] = var62.x4[0] + var50.x4[0]; + var66.x4[1] = var62.x4[1] + var50.x4[1]; + var66.x4[2] = var62.x4[2] + var50.x4[2]; + var66.x4[3] = var62.x4[3] + var50.x4[3]; + /* 24: divluw */ + var67.x4[0] = + ((var66.x4[0] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[0]) / + ((orc_uint16) var66.x4[0] & 0xff)); + var67.x4[1] = + ((var66.x4[1] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[1]) / + ((orc_uint16) var66.x4[1] & 0xff)); + var67.x4[2] = + ((var66.x4[2] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[2]) / + ((orc_uint16) var66.x4[2] & 0xff)); + var67.x4[3] = + ((var66.x4[3] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[3]) / + ((orc_uint16) var66.x4[3] & 0xff)); + /* 25: convwb */ + var68.x4[0] = var67.x4[0]; + var68.x4[1] = var67.x4[1]; + var68.x4[2] = var67.x4[2]; + var68.x4[3] = var67.x4[3]; + /* 27: andl */ + var69.i = var68.i & var42.i; + /* 28: convwb */ + var70.x4[0] = var66.x4[0]; + var70.x4[1] = var66.x4[1]; + var70.x4[2] = var66.x4[2]; + var70.x4[3] = var66.x4[3]; + /* 30: andl */ + var71.i = var70.i & var43.i; + /* 31: orl */ + var72.i = var69.i | var71.i; + /* 32: storel */ + ptr0[i] = var72; + } + } + +} + +#else +static void +_backup_orc_overlay_argb (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int j; + int n = ex->n; + int m = ex->params[ORC_VAR_A1]; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union64 var41; + orc_union32 var42; + orc_union32 var43; + orc_union32 var44; + orc_union16 var45; + orc_int8 var46; + orc_union32 var47; + orc_union64 var48; + orc_union64 var49; + orc_union64 var50; + orc_union64 var51; + orc_union64 var52; + orc_union32 var53; + orc_union64 var54; + orc_union64 var55; + orc_union32 var56; + orc_union16 var57; + orc_int8 var58; + orc_union32 var59; + orc_union64 var60; + orc_union64 var61; + orc_union64 var62; + orc_union64 var63; + orc_union64 var64; + orc_union64 var65; + orc_union64 var66; + orc_union64 var67; + orc_union32 var68; + orc_union32 var69; + orc_union32 var70; + orc_union32 var71; + orc_union32 var72; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); + ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); + + /* 5: loadpw */ + var41.x4[0] = ex->params[24]; + var41.x4[1] = ex->params[24]; + var41.x4[2] = ex->params[24]; + var41.x4[3] = ex->params[24]; + /* 10: loadpl */ + var53.i = (int) 0xffffffff; /* -1 or 2.122e-314f */ + /* 26: loadpl */ + var42.i = (int) 0xffffff00; /* -256 or 2.122e-314f */ + /* 29: loadpl */ + var43.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var44 = ptr4[i]; + /* 1: convlw */ + var45.i = var44.i; + /* 2: convwb */ + var46 = var45.i; + /* 3: splatbl */ + var47.i = + ((var46 & 0xff) << 24) | ((var46 & 0xff) << 16) | ((var46 & 0xff) << + 8) | (var46 & 0xff); + /* 4: convubw */ + var48.x4[0] = (orc_uint8) var47.x4[0]; + var48.x4[1] = (orc_uint8) var47.x4[1]; + var48.x4[2] = (orc_uint8) var47.x4[2]; + var48.x4[3] = (orc_uint8) var47.x4[3]; + /* 6: mullw */ + var49.x4[0] = (var48.x4[0] * var41.x4[0]) & 0xffff; + var49.x4[1] = (var48.x4[1] * var41.x4[1]) & 0xffff; + var49.x4[2] = (var48.x4[2] * var41.x4[2]) & 0xffff; + var49.x4[3] = (var48.x4[3] * var41.x4[3]) & 0xffff; + /* 7: shruw */ + var50.x4[0] = ((orc_uint16) var49.x4[0]) >> 8; + var50.x4[1] = ((orc_uint16) var49.x4[1]) >> 8; + var50.x4[2] = ((orc_uint16) var49.x4[2]) >> 8; + var50.x4[3] = ((orc_uint16) var49.x4[3]) >> 8; + /* 8: convubw */ + var51.x4[0] = (orc_uint8) var44.x4[0]; + var51.x4[1] = (orc_uint8) var44.x4[1]; + var51.x4[2] = (orc_uint8) var44.x4[2]; + var51.x4[3] = (orc_uint8) var44.x4[3]; + /* 9: mullw */ + var52.x4[0] = (var51.x4[0] * var50.x4[0]) & 0xffff; + var52.x4[1] = (var51.x4[1] * var50.x4[1]) & 0xffff; + var52.x4[2] = (var51.x4[2] * var50.x4[2]) & 0xffff; + var52.x4[3] = (var51.x4[3] * var50.x4[3]) & 0xffff; + /* 11: convubw */ + var54.x4[0] = (orc_uint8) var53.x4[0]; + var54.x4[1] = (orc_uint8) var53.x4[1]; + var54.x4[2] = (orc_uint8) var53.x4[2]; + var54.x4[3] = (orc_uint8) var53.x4[3]; + /* 12: subw */ + var55.x4[0] = var54.x4[0] - var50.x4[0]; + var55.x4[1] = var54.x4[1] - var50.x4[1]; + var55.x4[2] = var54.x4[2] - var50.x4[2]; + var55.x4[3] = var54.x4[3] - var50.x4[3]; + /* 13: loadl */ + var56 = ptr0[i]; + /* 14: convlw */ + var57.i = var56.i; + /* 15: convwb */ + var58 = var57.i; + /* 16: splatbl */ + var59.i = + ((var58 & 0xff) << 24) | ((var58 & 0xff) << 16) | ((var58 & 0xff) << + 8) | (var58 & 0xff); + /* 17: convubw */ + var60.x4[0] = (orc_uint8) var59.x4[0]; + var60.x4[1] = (orc_uint8) var59.x4[1]; + var60.x4[2] = (orc_uint8) var59.x4[2]; + var60.x4[3] = (orc_uint8) var59.x4[3]; + /* 18: mullw */ + var61.x4[0] = (var60.x4[0] * var55.x4[0]) & 0xffff; + var61.x4[1] = (var60.x4[1] * var55.x4[1]) & 0xffff; + var61.x4[2] = (var60.x4[2] * var55.x4[2]) & 0xffff; + var61.x4[3] = (var60.x4[3] * var55.x4[3]) & 0xffff; + /* 19: div255w */ + var62.x4[0] = + ((orc_uint16) (((orc_uint16) (var61.x4[0] + 128)) + + (((orc_uint16) (var61.x4[0] + 128)) >> 8))) >> 8; + var62.x4[1] = + ((orc_uint16) (((orc_uint16) (var61.x4[1] + 128)) + + (((orc_uint16) (var61.x4[1] + 128)) >> 8))) >> 8; + var62.x4[2] = + ((orc_uint16) (((orc_uint16) (var61.x4[2] + 128)) + + (((orc_uint16) (var61.x4[2] + 128)) >> 8))) >> 8; + var62.x4[3] = + ((orc_uint16) (((orc_uint16) (var61.x4[3] + 128)) + + (((orc_uint16) (var61.x4[3] + 128)) >> 8))) >> 8; + /* 20: convubw */ + var63.x4[0] = (orc_uint8) var56.x4[0]; + var63.x4[1] = (orc_uint8) var56.x4[1]; + var63.x4[2] = (orc_uint8) var56.x4[2]; + var63.x4[3] = (orc_uint8) var56.x4[3]; + /* 21: mullw */ + var64.x4[0] = (var63.x4[0] * var62.x4[0]) & 0xffff; + var64.x4[1] = (var63.x4[1] * var62.x4[1]) & 0xffff; + var64.x4[2] = (var63.x4[2] * var62.x4[2]) & 0xffff; + var64.x4[3] = (var63.x4[3] * var62.x4[3]) & 0xffff; + /* 22: addw */ + var65.x4[0] = var64.x4[0] + var52.x4[0]; + var65.x4[1] = var64.x4[1] + var52.x4[1]; + var65.x4[2] = var64.x4[2] + var52.x4[2]; + var65.x4[3] = var64.x4[3] + var52.x4[3]; + /* 23: addw */ + var66.x4[0] = var62.x4[0] + var50.x4[0]; + var66.x4[1] = var62.x4[1] + var50.x4[1]; + var66.x4[2] = var62.x4[2] + var50.x4[2]; + var66.x4[3] = var62.x4[3] + var50.x4[3]; + /* 24: divluw */ + var67.x4[0] = + ((var66.x4[0] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[0]) / + ((orc_uint16) var66.x4[0] & 0xff)); + var67.x4[1] = + ((var66.x4[1] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[1]) / + ((orc_uint16) var66.x4[1] & 0xff)); + var67.x4[2] = + ((var66.x4[2] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[2]) / + ((orc_uint16) var66.x4[2] & 0xff)); + var67.x4[3] = + ((var66.x4[3] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[3]) / + ((orc_uint16) var66.x4[3] & 0xff)); + /* 25: convwb */ + var68.x4[0] = var67.x4[0]; + var68.x4[1] = var67.x4[1]; + var68.x4[2] = var67.x4[2]; + var68.x4[3] = var67.x4[3]; + /* 27: andl */ + var69.i = var68.i & var42.i; + /* 28: convwb */ + var70.x4[0] = var66.x4[0]; + var70.x4[1] = var66.x4[1]; + var70.x4[2] = var66.x4[2]; + var70.x4[3] = var66.x4[3]; + /* 30: andl */ + var71.i = var70.i & var43.i; + /* 31: orl */ + var72.i = var69.i | var71.i; + /* 32: storel */ + ptr0[i] = var72; + } + } + +} + +void +orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_2d (p); + orc_program_set_name (p, "orc_overlay_argb"); + orc_program_set_backup_function (p, _backup_orc_overlay_argb); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_source (p, 4, "s1"); + orc_program_add_constant (p, 4, 0xffffffff, "c1"); + orc_program_add_constant (p, 4, 0x000000ff, "c2"); + orc_program_add_constant (p, 4, 0xffffff00, "c3"); + orc_program_add_constant (p, 4, 0x00000008, "c4"); + orc_program_add_parameter (p, 2, "p1"); + orc_program_add_temporary (p, 4, "t1"); + orc_program_add_temporary (p, 2, "t2"); + orc_program_add_temporary (p, 1, "t3"); + orc_program_add_temporary (p, 8, "t4"); + orc_program_add_temporary (p, 8, "t5"); + orc_program_add_temporary (p, 8, "t6"); + orc_program_add_temporary (p, 4, "t7"); + orc_program_add_temporary (p, 8, "t8"); + orc_program_add_temporary (p, 8, "t9"); + + orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T4, ORC_VAR_T7, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_P1, + ORC_VAR_D1); + orc_program_append_2 (p, "shruw", 2, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_C4, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T4, + ORC_VAR_D1); + orc_program_append_2 (p, "loadpl", 0, ORC_VAR_T7, ORC_VAR_C1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T7, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "subw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T4, + ORC_VAR_D1); + orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T7, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "div255w", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T8, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T6, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T9, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T4, + ORC_VAR_D1); + orc_program_append_2 (p, "divluw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T6, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "andl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C3, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 2, ORC_VAR_T7, ORC_VAR_T6, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "andl", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C2, + ORC_VAR_D1); + orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T7, + ORC_VAR_D1); + orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ORC_EXECUTOR_M (ex) = m; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_D1] = d1_stride; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->params[ORC_VAR_S1] = s1_stride; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_overlay_bgra */ +#ifdef DISABLE_ORC +void +orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + int i; + int j; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union64 var42; + orc_union32 var43; + orc_union32 var44; + orc_union32 var45; + orc_union32 var46; + orc_union16 var47; + orc_int8 var48; + orc_union32 var49; + orc_union64 var50; + orc_union64 var51; + orc_union64 var52; + orc_union64 var53; + orc_union64 var54; + orc_union32 var55; + orc_union64 var56; + orc_union64 var57; + orc_union32 var58; + orc_union32 var59; + orc_union16 var60; + orc_int8 var61; + orc_union32 var62; + orc_union64 var63; + orc_union64 var64; + orc_union64 var65; + orc_union64 var66; + orc_union64 var67; + orc_union64 var68; + orc_union64 var69; + orc_union64 var70; + orc_union32 var71; + orc_union32 var72; + orc_union32 var73; + orc_union32 var74; + orc_union32 var75; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); + ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); + + /* 6: loadpw */ + var42.x4[0] = p1; + var42.x4[1] = p1; + var42.x4[2] = p1; + var42.x4[3] = p1; + /* 11: loadpl */ + var55.i = (int) 0xffffffff; /* -1 or 2.122e-314f */ + /* 28: loadpl */ + var43.i = (int) 0x00ffffff; /* 16777215 or 8.28905e-317f */ + /* 31: loadpl */ + var44.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var45 = ptr4[i]; + /* 1: shrul */ + var46.i = ((orc_uint32) var45.i) >> 24; + /* 2: convlw */ + var47.i = var46.i; + /* 3: convwb */ + var48 = var47.i; + /* 4: splatbl */ + var49.i = + ((var48 & 0xff) << 24) | ((var48 & 0xff) << 16) | ((var48 & 0xff) << + 8) | (var48 & 0xff); + /* 5: convubw */ + var50.x4[0] = (orc_uint8) var49.x4[0]; + var50.x4[1] = (orc_uint8) var49.x4[1]; + var50.x4[2] = (orc_uint8) var49.x4[2]; + var50.x4[3] = (orc_uint8) var49.x4[3]; + /* 7: mullw */ + var51.x4[0] = (var50.x4[0] * var42.x4[0]) & 0xffff; + var51.x4[1] = (var50.x4[1] * var42.x4[1]) & 0xffff; + var51.x4[2] = (var50.x4[2] * var42.x4[2]) & 0xffff; + var51.x4[3] = (var50.x4[3] * var42.x4[3]) & 0xffff; + /* 8: shruw */ + var52.x4[0] = ((orc_uint16) var51.x4[0]) >> 8; + var52.x4[1] = ((orc_uint16) var51.x4[1]) >> 8; + var52.x4[2] = ((orc_uint16) var51.x4[2]) >> 8; + var52.x4[3] = ((orc_uint16) var51.x4[3]) >> 8; + /* 9: convubw */ + var53.x4[0] = (orc_uint8) var45.x4[0]; + var53.x4[1] = (orc_uint8) var45.x4[1]; + var53.x4[2] = (orc_uint8) var45.x4[2]; + var53.x4[3] = (orc_uint8) var45.x4[3]; + /* 10: mullw */ + var54.x4[0] = (var53.x4[0] * var52.x4[0]) & 0xffff; + var54.x4[1] = (var53.x4[1] * var52.x4[1]) & 0xffff; + var54.x4[2] = (var53.x4[2] * var52.x4[2]) & 0xffff; + var54.x4[3] = (var53.x4[3] * var52.x4[3]) & 0xffff; + /* 12: convubw */ + var56.x4[0] = (orc_uint8) var55.x4[0]; + var56.x4[1] = (orc_uint8) var55.x4[1]; + var56.x4[2] = (orc_uint8) var55.x4[2]; + var56.x4[3] = (orc_uint8) var55.x4[3]; + /* 13: subw */ + var57.x4[0] = var56.x4[0] - var52.x4[0]; + var57.x4[1] = var56.x4[1] - var52.x4[1]; + var57.x4[2] = var56.x4[2] - var52.x4[2]; + var57.x4[3] = var56.x4[3] - var52.x4[3]; + /* 14: loadl */ + var58 = ptr0[i]; + /* 15: shrul */ + var59.i = ((orc_uint32) var58.i) >> 24; + /* 16: convlw */ + var60.i = var59.i; + /* 17: convwb */ + var61 = var60.i; + /* 18: splatbl */ + var62.i = + ((var61 & 0xff) << 24) | ((var61 & 0xff) << 16) | ((var61 & 0xff) << + 8) | (var61 & 0xff); + /* 19: convubw */ + var63.x4[0] = (orc_uint8) var62.x4[0]; + var63.x4[1] = (orc_uint8) var62.x4[1]; + var63.x4[2] = (orc_uint8) var62.x4[2]; + var63.x4[3] = (orc_uint8) var62.x4[3]; + /* 20: mullw */ + var64.x4[0] = (var63.x4[0] * var57.x4[0]) & 0xffff; + var64.x4[1] = (var63.x4[1] * var57.x4[1]) & 0xffff; + var64.x4[2] = (var63.x4[2] * var57.x4[2]) & 0xffff; + var64.x4[3] = (var63.x4[3] * var57.x4[3]) & 0xffff; + /* 21: div255w */ + var65.x4[0] = + ((orc_uint16) (((orc_uint16) (var64.x4[0] + 128)) + + (((orc_uint16) (var64.x4[0] + 128)) >> 8))) >> 8; + var65.x4[1] = + ((orc_uint16) (((orc_uint16) (var64.x4[1] + 128)) + + (((orc_uint16) (var64.x4[1] + 128)) >> 8))) >> 8; + var65.x4[2] = + ((orc_uint16) (((orc_uint16) (var64.x4[2] + 128)) + + (((orc_uint16) (var64.x4[2] + 128)) >> 8))) >> 8; + var65.x4[3] = + ((orc_uint16) (((orc_uint16) (var64.x4[3] + 128)) + + (((orc_uint16) (var64.x4[3] + 128)) >> 8))) >> 8; + /* 22: convubw */ + var66.x4[0] = (orc_uint8) var58.x4[0]; + var66.x4[1] = (orc_uint8) var58.x4[1]; + var66.x4[2] = (orc_uint8) var58.x4[2]; + var66.x4[3] = (orc_uint8) var58.x4[3]; + /* 23: mullw */ + var67.x4[0] = (var66.x4[0] * var65.x4[0]) & 0xffff; + var67.x4[1] = (var66.x4[1] * var65.x4[1]) & 0xffff; + var67.x4[2] = (var66.x4[2] * var65.x4[2]) & 0xffff; + var67.x4[3] = (var66.x4[3] * var65.x4[3]) & 0xffff; + /* 24: addw */ + var68.x4[0] = var67.x4[0] + var54.x4[0]; + var68.x4[1] = var67.x4[1] + var54.x4[1]; + var68.x4[2] = var67.x4[2] + var54.x4[2]; + var68.x4[3] = var67.x4[3] + var54.x4[3]; + /* 25: addw */ + var69.x4[0] = var65.x4[0] + var52.x4[0]; + var69.x4[1] = var65.x4[1] + var52.x4[1]; + var69.x4[2] = var65.x4[2] + var52.x4[2]; + var69.x4[3] = var65.x4[3] + var52.x4[3]; + /* 26: divluw */ + var70.x4[0] = + ((var69.x4[0] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[0]) / + ((orc_uint16) var69.x4[0] & 0xff)); + var70.x4[1] = + ((var69.x4[1] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[1]) / + ((orc_uint16) var69.x4[1] & 0xff)); + var70.x4[2] = + ((var69.x4[2] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[2]) / + ((orc_uint16) var69.x4[2] & 0xff)); + var70.x4[3] = + ((var69.x4[3] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[3]) / + ((orc_uint16) var69.x4[3] & 0xff)); + /* 27: convwb */ + var71.x4[0] = var70.x4[0]; + var71.x4[1] = var70.x4[1]; + var71.x4[2] = var70.x4[2]; + var71.x4[3] = var70.x4[3]; + /* 29: andl */ + var72.i = var71.i & var43.i; + /* 30: convwb */ + var73.x4[0] = var69.x4[0]; + var73.x4[1] = var69.x4[1]; + var73.x4[2] = var69.x4[2]; + var73.x4[3] = var69.x4[3]; + /* 32: andl */ + var74.i = var73.i & var44.i; + /* 33: orl */ + var75.i = var72.i | var74.i; + /* 34: storel */ + ptr0[i] = var75; + } + } + +} + +#else +static void +_backup_orc_overlay_bgra (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int j; + int n = ex->n; + int m = ex->params[ORC_VAR_A1]; + orc_union32 *ORC_RESTRICT ptr0; + const orc_union32 *ORC_RESTRICT ptr4; + orc_union64 var42; + orc_union32 var43; + orc_union32 var44; + orc_union32 var45; + orc_union32 var46; + orc_union16 var47; + orc_int8 var48; + orc_union32 var49; + orc_union64 var50; + orc_union64 var51; + orc_union64 var52; + orc_union64 var53; + orc_union64 var54; + orc_union32 var55; + orc_union64 var56; + orc_union64 var57; + orc_union32 var58; + orc_union32 var59; + orc_union16 var60; + orc_int8 var61; + orc_union32 var62; + orc_union64 var63; + orc_union64 var64; + orc_union64 var65; + orc_union64 var66; + orc_union64 var67; + orc_union64 var68; + orc_union64 var69; + orc_union64 var70; + orc_union32 var71; + orc_union32 var72; + orc_union32 var73; + orc_union32 var74; + orc_union32 var75; + + for (j = 0; j < m; j++) { + ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); + ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); + + /* 6: loadpw */ + var42.x4[0] = ex->params[24]; + var42.x4[1] = ex->params[24]; + var42.x4[2] = ex->params[24]; + var42.x4[3] = ex->params[24]; + /* 11: loadpl */ + var55.i = (int) 0xffffffff; /* -1 or 2.122e-314f */ + /* 28: loadpl */ + var43.i = (int) 0x00ffffff; /* 16777215 or 8.28905e-317f */ + /* 31: loadpl */ + var44.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */ + + for (i = 0; i < n; i++) { + /* 0: loadl */ + var45 = ptr4[i]; + /* 1: shrul */ + var46.i = ((orc_uint32) var45.i) >> 24; + /* 2: convlw */ + var47.i = var46.i; + /* 3: convwb */ + var48 = var47.i; + /* 4: splatbl */ + var49.i = + ((var48 & 0xff) << 24) | ((var48 & 0xff) << 16) | ((var48 & 0xff) << + 8) | (var48 & 0xff); + /* 5: convubw */ + var50.x4[0] = (orc_uint8) var49.x4[0]; + var50.x4[1] = (orc_uint8) var49.x4[1]; + var50.x4[2] = (orc_uint8) var49.x4[2]; + var50.x4[3] = (orc_uint8) var49.x4[3]; + /* 7: mullw */ + var51.x4[0] = (var50.x4[0] * var42.x4[0]) & 0xffff; + var51.x4[1] = (var50.x4[1] * var42.x4[1]) & 0xffff; + var51.x4[2] = (var50.x4[2] * var42.x4[2]) & 0xffff; + var51.x4[3] = (var50.x4[3] * var42.x4[3]) & 0xffff; + /* 8: shruw */ + var52.x4[0] = ((orc_uint16) var51.x4[0]) >> 8; + var52.x4[1] = ((orc_uint16) var51.x4[1]) >> 8; + var52.x4[2] = ((orc_uint16) var51.x4[2]) >> 8; + var52.x4[3] = ((orc_uint16) var51.x4[3]) >> 8; + /* 9: convubw */ + var53.x4[0] = (orc_uint8) var45.x4[0]; + var53.x4[1] = (orc_uint8) var45.x4[1]; + var53.x4[2] = (orc_uint8) var45.x4[2]; + var53.x4[3] = (orc_uint8) var45.x4[3]; + /* 10: mullw */ + var54.x4[0] = (var53.x4[0] * var52.x4[0]) & 0xffff; + var54.x4[1] = (var53.x4[1] * var52.x4[1]) & 0xffff; + var54.x4[2] = (var53.x4[2] * var52.x4[2]) & 0xffff; + var54.x4[3] = (var53.x4[3] * var52.x4[3]) & 0xffff; + /* 12: convubw */ + var56.x4[0] = (orc_uint8) var55.x4[0]; + var56.x4[1] = (orc_uint8) var55.x4[1]; + var56.x4[2] = (orc_uint8) var55.x4[2]; + var56.x4[3] = (orc_uint8) var55.x4[3]; + /* 13: subw */ + var57.x4[0] = var56.x4[0] - var52.x4[0]; + var57.x4[1] = var56.x4[1] - var52.x4[1]; + var57.x4[2] = var56.x4[2] - var52.x4[2]; + var57.x4[3] = var56.x4[3] - var52.x4[3]; + /* 14: loadl */ + var58 = ptr0[i]; + /* 15: shrul */ + var59.i = ((orc_uint32) var58.i) >> 24; + /* 16: convlw */ + var60.i = var59.i; + /* 17: convwb */ + var61 = var60.i; + /* 18: splatbl */ + var62.i = + ((var61 & 0xff) << 24) | ((var61 & 0xff) << 16) | ((var61 & 0xff) << + 8) | (var61 & 0xff); + /* 19: convubw */ + var63.x4[0] = (orc_uint8) var62.x4[0]; + var63.x4[1] = (orc_uint8) var62.x4[1]; + var63.x4[2] = (orc_uint8) var62.x4[2]; + var63.x4[3] = (orc_uint8) var62.x4[3]; + /* 20: mullw */ + var64.x4[0] = (var63.x4[0] * var57.x4[0]) & 0xffff; + var64.x4[1] = (var63.x4[1] * var57.x4[1]) & 0xffff; + var64.x4[2] = (var63.x4[2] * var57.x4[2]) & 0xffff; + var64.x4[3] = (var63.x4[3] * var57.x4[3]) & 0xffff; + /* 21: div255w */ + var65.x4[0] = + ((orc_uint16) (((orc_uint16) (var64.x4[0] + 128)) + + (((orc_uint16) (var64.x4[0] + 128)) >> 8))) >> 8; + var65.x4[1] = + ((orc_uint16) (((orc_uint16) (var64.x4[1] + 128)) + + (((orc_uint16) (var64.x4[1] + 128)) >> 8))) >> 8; + var65.x4[2] = + ((orc_uint16) (((orc_uint16) (var64.x4[2] + 128)) + + (((orc_uint16) (var64.x4[2] + 128)) >> 8))) >> 8; + var65.x4[3] = + ((orc_uint16) (((orc_uint16) (var64.x4[3] + 128)) + + (((orc_uint16) (var64.x4[3] + 128)) >> 8))) >> 8; + /* 22: convubw */ + var66.x4[0] = (orc_uint8) var58.x4[0]; + var66.x4[1] = (orc_uint8) var58.x4[1]; + var66.x4[2] = (orc_uint8) var58.x4[2]; + var66.x4[3] = (orc_uint8) var58.x4[3]; + /* 23: mullw */ + var67.x4[0] = (var66.x4[0] * var65.x4[0]) & 0xffff; + var67.x4[1] = (var66.x4[1] * var65.x4[1]) & 0xffff; + var67.x4[2] = (var66.x4[2] * var65.x4[2]) & 0xffff; + var67.x4[3] = (var66.x4[3] * var65.x4[3]) & 0xffff; + /* 24: addw */ + var68.x4[0] = var67.x4[0] + var54.x4[0]; + var68.x4[1] = var67.x4[1] + var54.x4[1]; + var68.x4[2] = var67.x4[2] + var54.x4[2]; + var68.x4[3] = var67.x4[3] + var54.x4[3]; + /* 25: addw */ + var69.x4[0] = var65.x4[0] + var52.x4[0]; + var69.x4[1] = var65.x4[1] + var52.x4[1]; + var69.x4[2] = var65.x4[2] + var52.x4[2]; + var69.x4[3] = var65.x4[3] + var52.x4[3]; + /* 26: divluw */ + var70.x4[0] = + ((var69.x4[0] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[0]) / + ((orc_uint16) var69.x4[0] & 0xff)); + var70.x4[1] = + ((var69.x4[1] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[1]) / + ((orc_uint16) var69.x4[1] & 0xff)); + var70.x4[2] = + ((var69.x4[2] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[2]) / + ((orc_uint16) var69.x4[2] & 0xff)); + var70.x4[3] = + ((var69.x4[3] & 0xff) == + 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[3]) / + ((orc_uint16) var69.x4[3] & 0xff)); + /* 27: convwb */ + var71.x4[0] = var70.x4[0]; + var71.x4[1] = var70.x4[1]; + var71.x4[2] = var70.x4[2]; + var71.x4[3] = var70.x4[3]; + /* 29: andl */ + var72.i = var71.i & var43.i; + /* 30: convwb */ + var73.x4[0] = var69.x4[0]; + var73.x4[1] = var69.x4[1]; + var73.x4[2] = var69.x4[2]; + var73.x4[3] = var69.x4[3]; + /* 32: andl */ + var74.i = var73.i & var44.i; + /* 33: orl */ + var75.i = var72.i | var74.i; + /* 34: storel */ + ptr0[i] = var75; + } + } + +} + +void +orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, + const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) +{ + OrcExecutor _ex, *ex = &_ex; + static volatile int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + + p = orc_program_new (); + orc_program_set_2d (p); + orc_program_set_name (p, "orc_overlay_bgra"); + orc_program_set_backup_function (p, _backup_orc_overlay_bgra); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_source (p, 4, "s1"); + orc_program_add_constant (p, 4, 0xffffffff, "c1"); + orc_program_add_constant (p, 4, 0xff000000, "c2"); + orc_program_add_constant (p, 4, 0x00ffffff, "c3"); + orc_program_add_constant (p, 4, 0x00000018, "c4"); + orc_program_add_constant (p, 4, 0x00000008, "c5"); + orc_program_add_parameter (p, 2, "p1"); + orc_program_add_temporary (p, 4, "t1"); + orc_program_add_temporary (p, 4, "t2"); + orc_program_add_temporary (p, 2, "t3"); + orc_program_add_temporary (p, 1, "t4"); + orc_program_add_temporary (p, 8, "t5"); + orc_program_add_temporary (p, 8, "t6"); + orc_program_add_temporary (p, 8, "t7"); + orc_program_add_temporary (p, 4, "t8"); + orc_program_add_temporary (p, 8, "t9"); + orc_program_add_temporary (p, 8, "t10"); + + orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C4, + ORC_VAR_D1); + orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T8, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_P1, + ORC_VAR_D1); + orc_program_append_2 (p, "shruw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_C5, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T10, ORC_VAR_T1, + ORC_VAR_D1, ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T10, ORC_VAR_T10, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "loadpl", 0, ORC_VAR_T8, ORC_VAR_C1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T8, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "subw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C4, + ORC_VAR_D1); + orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6, + ORC_VAR_D1); + orc_program_append_2 (p, "div255w", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "convubw", 2, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "mullw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T7, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T10, + ORC_VAR_D1); + orc_program_append_2 (p, "addw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T5, + ORC_VAR_D1); + orc_program_append_2 (p, "divluw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T7, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "andl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C3, + ORC_VAR_D1); + orc_program_append_2 (p, "convwb", 2, ORC_VAR_T8, ORC_VAR_T7, ORC_VAR_D1, + ORC_VAR_D1); + orc_program_append_2 (p, "andl", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_C2, + ORC_VAR_D1); + orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T8, + ORC_VAR_D1); + orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, + ORC_VAR_D1); + + orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ORC_EXECUTOR_M (ex) = m; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_D1] = d1_stride; + ex->arrays[ORC_VAR_S1] = (void *) s1; + ex->params[ORC_VAR_S1] = s1_stride; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif diff --git a/gst/videomixer/blendorc-dist.h b/gst/videomixer/blendorc-dist.h new file mode 100644 index 0000000..9346540 --- /dev/null +++ b/gst/videomixer/blendorc-dist.h @@ -0,0 +1,83 @@ + +/* autogenerated from blendorc.orc */ + +#ifndef _BLENDORC_H_ +#define _BLENDORC_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + + +#ifndef _ORC_INTEGER_TYPEDEFS_ +#define _ORC_INTEGER_TYPEDEFS_ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +typedef int8_t orc_int8; +typedef int16_t orc_int16; +typedef int32_t orc_int32; +typedef int64_t orc_int64; +typedef uint8_t orc_uint8; +typedef uint16_t orc_uint16; +typedef uint32_t orc_uint32; +typedef uint64_t orc_uint64; +#define ORC_UINT64_C(x) UINT64_C(x) +#elif defined(_MSC_VER) +typedef signed __int8 orc_int8; +typedef signed __int16 orc_int16; +typedef signed __int32 orc_int32; +typedef signed __int64 orc_int64; +typedef unsigned __int8 orc_uint8; +typedef unsigned __int16 orc_uint16; +typedef unsigned __int32 orc_uint32; +typedef unsigned __int64 orc_uint64; +#define ORC_UINT64_C(x) (x##Ui64) +#define inline __inline +#else +#include +typedef signed char orc_int8; +typedef short orc_int16; +typedef int orc_int32; +typedef unsigned char orc_uint8; +typedef unsigned short orc_uint16; +typedef unsigned int orc_uint32; +#if INT_MAX == LONG_MAX +typedef long long orc_int64; +typedef unsigned long long orc_uint64; +#define ORC_UINT64_C(x) (x##ULL) +#else +typedef long orc_int64; +typedef unsigned long orc_uint64; +#define ORC_UINT64_C(x) (x##UL) +#endif +#endif +typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; +typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; +typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; +#endif +#ifndef ORC_RESTRICT +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +#endif +void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n); +void orc_memcpy_u32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, int n); +void orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); +void orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); +void orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); +void orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); +void orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/gst/videomixer/blendorc.orc b/gst/videomixer/blendorc.orc new file mode 100644 index 0000000..9140345 --- /dev/null +++ b/gst/videomixer/blendorc.orc @@ -0,0 +1,220 @@ +.function orc_splat_u32 +.dest 4 d1 guint32 +.param 4 p1 guint32 + +copyl d1, p1 + +.function orc_memcpy_u32 +.dest 4 d1 guint32 +.source 4 s1 guint32 + +copyl d1, s1 + +.function orc_blend_u8 +.flags 2d +.dest 1 d1 guint8 +.source 1 s1 guint8 +.param 2 p1 +.temp 2 t1 +.temp 2 t2 +.const 1 c1 8 + +convubw t1, d1 +convubw t2, s1 +subw t2, t2, t1 +mullw t2, t2, p1 +shlw t1, t1, c1 +addw t2, t1, t2 +shruw t2, t2, c1 +convsuswb d1, t2 + + +.function orc_blend_argb +.flags 2d +.dest 4 d guint8 +.source 4 s guint8 +.param 2 alpha +.temp 4 t +.temp 2 tw +.temp 1 tb +.temp 4 a +.temp 8 d_wide +.temp 8 s_wide +.temp 8 a_wide +.const 4 a_alpha 0x000000ff + +loadl t, s +convlw tw, t +convwb tb, tw +splatbl a, tb +x4 convubw a_wide, a +x4 mullw a_wide, a_wide, alpha +x4 shruw a_wide, a_wide, 8 +x4 convubw s_wide, t +loadl t, d +x4 convubw d_wide, t +x4 subw s_wide, s_wide, d_wide +x4 mullw s_wide, s_wide, a_wide +x4 div255w s_wide, s_wide +x4 addw d_wide, d_wide, s_wide +x4 convwb t, d_wide +orl t, t, a_alpha +storel d, t + +.function orc_blend_bgra +.flags 2d +.dest 4 d guint8 +.source 4 s guint8 +.param 2 alpha +.temp 4 t +.temp 4 t2 +.temp 2 tw +.temp 1 tb +.temp 4 a +.temp 8 d_wide +.temp 8 s_wide +.temp 8 a_wide +.const 4 a_alpha 0xff000000 + +loadl t, s +shrul t2, t, 24 +convlw tw, t2 +convwb tb, tw +splatbl a, tb +x4 convubw a_wide, a +x4 mullw a_wide, a_wide, alpha +x4 shruw a_wide, a_wide, 8 +x4 convubw s_wide, t +loadl t, d +x4 convubw d_wide, t +x4 subw s_wide, s_wide, d_wide +x4 mullw s_wide, s_wide, a_wide +x4 div255w s_wide, s_wide +x4 addw d_wide, d_wide, s_wide +x4 convwb t, d_wide +orl t, t, a_alpha +storel d, t + + +.function orc_overlay_argb +.flags 2d +.dest 4 d guint8 +.source 4 s guint8 +.param 2 alpha +.temp 4 t +.temp 2 tw +.temp 1 tb +.temp 8 alpha_s +.temp 8 alpha_s_inv +.temp 8 alpha_d +.temp 4 a +.temp 8 d_wide +.temp 8 s_wide +.const 4 xfs 0xffffffff +.const 4 a_alpha 0x000000ff +.const 4 a_alpha_inv 0xffffff00 + +# calc source alpha as alpha_s = alpha_s * alpha / 256 +loadl t, s +convlw tw, t +convwb tb, tw +splatbl a, tb +x4 convubw alpha_s, a +x4 mullw alpha_s, alpha_s, alpha +x4 shruw alpha_s, alpha_s, 8 +x4 convubw s_wide, t +x4 mullw s_wide, s_wide, alpha_s + +# calc destination alpha as alpha_d = (255-alpha_s) * alpha_d / 255 +loadpl a, xfs +x4 convubw alpha_s_inv, a +x4 subw alpha_s_inv, alpha_s_inv, alpha_s +loadl t, d +convlw tw, t +convwb tb, tw +splatbl a, tb +x4 convubw alpha_d, a +x4 mullw alpha_d, alpha_d, alpha_s_inv +x4 div255w alpha_d, alpha_d +x4 convubw d_wide, t +x4 mullw d_wide, d_wide, alpha_d + +# calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_d*(255-alpha_s)/255 +x4 addw d_wide, d_wide, s_wide + +# calc the final destination alpha_d = alpha_s + alpha_d * (255-alpha_s)/255 +x4 addw alpha_d, alpha_d, alpha_s + +# now normalize the pix_d by the final alpha to make it associative +x4 divluw, d_wide, d_wide, alpha_d + +# pack the new alpha into the correct spot +x4 convwb t, d_wide +andl t, t, a_alpha_inv +x4 convwb a, alpha_d +andl a, a, a_alpha +orl t, t, a +storel d, t + +.function orc_overlay_bgra +.flags 2d +.dest 4 d guint8 +.source 4 s guint8 +.param 2 alpha +.temp 4 t +.temp 4 t2 +.temp 2 tw +.temp 1 tb +.temp 8 alpha_s +.temp 8 alpha_s_inv +.temp 8 alpha_d +.temp 4 a +.temp 8 d_wide +.temp 8 s_wide +.const 4 xfs 0xffffffff +.const 4 a_alpha 0xff000000 +.const 4 a_alpha_inv 0x00ffffff + +# calc source alpha as alpha_s = alpha_s * alpha / 256 +loadl t, s +shrul t2, t, 24 +convlw tw, t2 +convwb tb, tw +splatbl a, tb +x4 convubw alpha_s, a +x4 mullw alpha_s, alpha_s, alpha +x4 shruw alpha_s, alpha_s, 8 +x4 convubw s_wide, t +x4 mullw s_wide, s_wide, alpha_s + +# calc destination alpha as alpha_d = (255-alpha_s) * alpha_d / 255 +loadpl a, xfs +x4 convubw alpha_s_inv, a +x4 subw alpha_s_inv, alpha_s_inv, alpha_s +loadl t, d +shrul t2, t, 24 +convlw tw, t2 +convwb tb, tw +splatbl a, tb +x4 convubw alpha_d, a +x4 mullw alpha_d, alpha_d, alpha_s_inv +x4 div255w alpha_d, alpha_d +x4 convubw d_wide, t +x4 mullw d_wide, d_wide, alpha_d + +# calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_d*(255-alpha_s)/255 +x4 addw d_wide, d_wide, s_wide + +# calc the final destination alpha_d = alpha_s + alpha_d * (255-alpha_s)/255 +x4 addw alpha_d, alpha_d, alpha_s + +# now normalize the pix_d by the final alpha to make it associative +x4 divluw, d_wide, d_wide, alpha_d + +# pack the new alpha into the correct spot +x4 convwb t, d_wide +andl t, t, a_alpha_inv +x4 convwb a, alpha_d +andl a, a, a_alpha +orl t, t, a +storel d, t diff --git a/gst/videomixer/videomixer.c b/gst/videomixer/videomixer.c new file mode 100644 index 0000000..5a49b39 --- /dev/null +++ b/gst/videomixer/videomixer.c @@ -0,0 +1,1908 @@ +/* Generic video mixer plugin + * Copyright (C) 2004 Wim Taymans + * + * 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-videomixer + * + * Videomixer can accept AYUV, ARGB and BGRA video streams. For each of the requested + * sink pads it will compare the incoming geometry and framerate to define the + * output parameters. Indeed output video frames will have the geometry of the + * biggest incoming video stream and the framerate of the fastest incoming one. + * + * All sink pads must be either AYUV, ARGB or BGRA, but a mixture of them is not + * supported. The src pad will have the same colorspace as the sinks. + * No colorspace conversion is done. + * + * Individual parameters for each input stream can be configured on the + * #GstVideoMixerPad. + * + * + * Sample pipelines + * |[ + * gst-launch-0.10 \ + * videotestsrc pattern=1 ! \ + * video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! \ + * videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! \ + * videomixer name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! \ + * ffmpegcolorspace ! xvimagesink \ + * videotestsrc ! \ + * video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix. + * ]| A pipeline to demonstrate videomixer used together with videobox. + * This should show a 320x240 pixels video test source with some transparency + * showing the background checker pattern. Another video test source with just + * the snow pattern of 100x100 pixels is overlayed on top of the first one on + * the left vertically centered with a small transparency showing the first + * video test source behind and the checker pattern under it. Note that the + * framerate of the output video is 10 frames per second. + * |[ + * gst-launch videotestsrc pattern=1 ! \ + * video/x-raw-rgb, framerate=\(fraction\)10/1, width=100, height=100 ! \ + * videomixer name=mix ! ffmpegcolorspace ! ximagesink \ + * videotestsrc ! \ + * video/x-raw-rgb, framerate=\(fraction\)5/1, width=320, height=240 ! mix. + * ]| A pipeline to demostrate bgra mixing. (This does not demonstrate alpha blending). + * |[ + * gst-launch videotestsrc pattern=1 ! \ + * video/x-raw-yuv,format =\(fourcc\)I420, framerate=\(fraction\)10/1, width=100, height=100 ! \ + * videomixer name=mix ! ffmpegcolorspace ! ximagesink \ + * videotestsrc ! \ + * video/x-raw-yuv,format=\(fourcc\)I420, framerate=\(fraction\)5/1, width=320, height=240 ! mix. + * ]| A pipeline to test I420 + * |[ + * gst-launch videotestsrc pattern="snow" ! video/x-raw-yuv, framerate=\(fraction\)10/1, width=200, height=150 ! videomixer name=mix sink_1::xpos=20 sink_1::ypos=20 sink_1::alpha=0.5 ! ffmpegcolorspace ! xvimagesink videotestsrc ! video/x-raw-yuv, framerate=\(fraction\)10/1, width=640, height=360 ! mix. + * ]| Set position and alpha on the mixer using #GstVideoMixerPad properties. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "videomixer.h" +#include "videomixer2.h" + +#include "gst/glib-compat-private.h" + +#ifdef DISABLE_ORC +#define orc_memset memset +#else +#include +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_videomixer_debug); +#define GST_CAT_DEFAULT gst_videomixer_debug + +#define GST_VIDEO_MIXER_GET_STATE_LOCK(mix) \ + (GST_VIDEO_MIXER(mix)->state_lock) +#define GST_VIDEO_MIXER_STATE_LOCK(mix) \ + (g_mutex_lock(GST_VIDEO_MIXER_GET_STATE_LOCK (mix))) +#define GST_VIDEO_MIXER_STATE_UNLOCK(mix) \ + (g_mutex_unlock(GST_VIDEO_MIXER_GET_STATE_LOCK (mix))) + +static GType gst_videomixer_get_type (void); + +static void gst_videomixer_pad_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_videomixer_pad_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static gboolean gst_videomixer_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_videomixer_sink_event (GstPad * pad, GstEvent * event); + +static void gst_videomixer_sort_pads (GstVideoMixer * mix); + +#define DEFAULT_PAD_ZORDER 0 +#define DEFAULT_PAD_XPOS 0 +#define DEFAULT_PAD_YPOS 0 +#define DEFAULT_PAD_ALPHA 1.0 +enum +{ + PROP_PAD_0, + PROP_PAD_ZORDER, + PROP_PAD_XPOS, + PROP_PAD_YPOS, + PROP_PAD_ALPHA +}; + +GType gst_videomixer_pad_get_type (void); +G_DEFINE_TYPE (GstVideoMixerPad, gst_videomixer_pad, GST_TYPE_PAD); + +static void +gst_videomixer_pad_class_init (GstVideoMixerPadClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_videomixer_pad_set_property; + gobject_class->get_property = gst_videomixer_pad_get_property; + + g_object_class_install_property (gobject_class, PROP_PAD_ZORDER, + g_param_spec_uint ("zorder", "Z-Order", "Z Order of the picture", + 0, 10000, DEFAULT_PAD_ZORDER, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_XPOS, + g_param_spec_int ("xpos", "X Position", "X Position of the picture", + G_MININT, G_MAXINT, DEFAULT_PAD_XPOS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_YPOS, + g_param_spec_int ("ypos", "Y Position", "Y Position of the picture", + G_MININT, G_MAXINT, DEFAULT_PAD_YPOS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_ALPHA, + g_param_spec_double ("alpha", "Alpha", "Alpha of the picture", 0.0, 1.0, + DEFAULT_PAD_ALPHA, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_videomixer_pad_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (object); + + switch (prop_id) { + case PROP_PAD_ZORDER: + g_value_set_uint (value, pad->zorder); + break; + case PROP_PAD_XPOS: + g_value_set_int (value, pad->xpos); + break; + case PROP_PAD_YPOS: + g_value_set_int (value, pad->ypos); + break; + case PROP_PAD_ALPHA: + g_value_set_double (value, pad->alpha); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_videomixer_pad_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (object); + GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (GST_PAD (pad))); + + switch (prop_id) { + case PROP_PAD_ZORDER: + GST_VIDEO_MIXER_STATE_LOCK (mix); + pad->zorder = g_value_get_uint (value); + gst_videomixer_sort_pads (mix); + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + break; + case PROP_PAD_XPOS: + pad->xpos = g_value_get_int (value); + break; + case PROP_PAD_YPOS: + pad->ypos = g_value_get_int (value); + break; + case PROP_PAD_ALPHA: + pad->alpha = g_value_get_double (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + gst_object_unref (mix); +} + +static void +gst_videomixer_update_qos (GstVideoMixer * mix, gdouble proportion, + GstClockTimeDiff diff, GstClockTime timestamp) +{ + GST_DEBUG_OBJECT (mix, + "Updating QoS: proportion %lf, diff %s%" GST_TIME_FORMAT ", timestamp %" + GST_TIME_FORMAT, proportion, (diff < 0) ? "-" : "", + GST_TIME_ARGS (ABS (diff)), GST_TIME_ARGS (timestamp)); + + GST_OBJECT_LOCK (mix); + mix->proportion = proportion; + if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { + if (G_UNLIKELY (diff > 0)) + mix->earliest_time = + timestamp + 2 * diff + gst_util_uint64_scale_int (GST_SECOND, + mix->fps_d, mix->fps_n); + else + mix->earliest_time = timestamp + diff; + } else { + mix->earliest_time = GST_CLOCK_TIME_NONE; + } + GST_OBJECT_UNLOCK (mix); +} + +static void +gst_videomixer_reset_qos (GstVideoMixer * mix) +{ + gst_videomixer_update_qos (mix, 0.5, 0, GST_CLOCK_TIME_NONE); +} + +static void +gst_videomixer_read_qos (GstVideoMixer * mix, gdouble * proportion, + GstClockTime * time) +{ + GST_OBJECT_LOCK (mix); + *proportion = mix->proportion; + *time = mix->earliest_time; + GST_OBJECT_UNLOCK (mix); +} + +/* Perform qos calculations before processing the next frame. Returns TRUE if + * the frame should be processed, FALSE if the frame can be dropped entirely */ +static gboolean +gst_videomixer_do_qos (GstVideoMixer * mix, GstClockTime timestamp) +{ + GstClockTime qostime, earliest_time; + gdouble proportion; + + /* no timestamp, can't do QoS => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { + GST_LOG_OBJECT (mix, "invalid timestamp, can't do QoS, process frame"); + return TRUE; + } + + /* get latest QoS observation values */ + gst_videomixer_read_qos (mix, &proportion, &earliest_time); + + /* skip qos if we have no observation (yet) => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { + GST_LOG_OBJECT (mix, "no observation yet, process frame"); + return TRUE; + } + + /* qos is done on running time */ + qostime = + gst_segment_to_running_time (&mix->segment, GST_FORMAT_TIME, timestamp); + + /* see how our next timestamp relates to the latest qos timestamp */ + GST_LOG_OBJECT (mix, "qostime %" GST_TIME_FORMAT ", earliest %" + GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); + + if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { + GST_DEBUG_OBJECT (mix, "we are late, drop frame"); + return FALSE; + } + + GST_LOG_OBJECT (mix, "process frame"); + return TRUE; +} + +static void +gst_videomixer_set_master_geometry (GstVideoMixer * mix) +{ + GSList *walk; + gint width = 0, height = 0, fps_n = 0, fps_d = 0, par_n = 0, par_d = 0; + GstVideoMixerPad *master = NULL; + + walk = mix->sinkpads; + while (walk) { + GstVideoMixerPad *mixpad = GST_VIDEO_MIXER_PAD (walk->data); + + walk = g_slist_next (walk); + + /* Biggest input geometry will be our output geometry */ + width = MAX (width, mixpad->in_width); + height = MAX (height, mixpad->in_height); + + /* If mix framerate < mixpad framerate, using fractions */ + GST_DEBUG_OBJECT (mixpad, "comparing framerate %d/%d to mixpad's %d/%d", + fps_n, fps_d, mixpad->fps_n, mixpad->fps_d); + if ((!fps_n && !fps_d) || + ((gint64) fps_n * mixpad->fps_d < (gint64) mixpad->fps_n * fps_d)) { + fps_n = mixpad->fps_n; + fps_d = mixpad->fps_d; + par_n = mixpad->par_n; + par_d = mixpad->par_d; + GST_DEBUG_OBJECT (mixpad, "becomes the master pad"); + master = mixpad; + } + } + + /* set results */ + if (mix->master != master || mix->in_width != width + || mix->in_height != height || mix->fps_n != fps_n + || mix->fps_d != fps_d || mix->par_n != par_n || mix->par_d != par_d) { + mix->setcaps = TRUE; + mix->sendseg = TRUE; + gst_videomixer_reset_qos (mix); + mix->master = master; + mix->in_width = width; + mix->in_height = height; + mix->fps_n = fps_n; + mix->fps_d = fps_d; + mix->par_n = par_n; + mix->par_d = par_d; + } +} + +static gboolean +gst_videomixer_pad_sink_setcaps (GstPad * pad, GstCaps * vscaps) +{ + GstVideoMixer *mix; + GstVideoMixerPad *mixpad; + GstStructure *structure; + gint in_width, in_height; + gboolean ret = FALSE; + const GValue *framerate, *par; + + GST_INFO_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, vscaps); + + mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); + mixpad = GST_VIDEO_MIXER_PAD (pad); + + if (!mixpad) + goto beach; + + structure = gst_caps_get_structure (vscaps, 0); + + if (!gst_structure_get_int (structure, "width", &in_width) + || !gst_structure_get_int (structure, "height", &in_height) + || (framerate = gst_structure_get_value (structure, "framerate")) == NULL) + goto beach; + par = gst_structure_get_value (structure, "pixel-aspect-ratio"); + + GST_VIDEO_MIXER_STATE_LOCK (mix); + mixpad->fps_n = gst_value_get_fraction_numerator (framerate); + mixpad->fps_d = gst_value_get_fraction_denominator (framerate); + if (par) { + mixpad->par_n = gst_value_get_fraction_numerator (par); + mixpad->par_d = gst_value_get_fraction_denominator (par); + } else { + mixpad->par_n = mixpad->par_d = 1; + } + + mixpad->in_width = in_width; + mixpad->in_height = in_height; + + gst_videomixer_set_master_geometry (mix); + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + + ret = TRUE; + +beach: + gst_object_unref (mix); + + return ret; +} + +static GstCaps * +gst_videomixer_pad_sink_getcaps (GstPad * pad) +{ + GstVideoMixer *mix; + GstVideoMixerPad *mixpad; + GstCaps *res = NULL; + GstCaps *mastercaps; + GstStructure *st; + + mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); + mixpad = GST_VIDEO_MIXER_PAD (pad); + + if (!mixpad) + goto beach; + + /* Get downstream allowed caps */ + res = gst_pad_get_allowed_caps (mix->srcpad); + if (G_UNLIKELY (res == NULL)) { + res = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + goto beach; + } + + GST_VIDEO_MIXER_STATE_LOCK (mix); + + /* Return as-is if not other sinkpad set as master */ + if (mix->master == NULL) { + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + goto beach; + } + + mastercaps = gst_pad_get_fixed_caps_func (GST_PAD (mix->master)); + + /* If master pad caps aren't negotiated yet, return downstream + * allowed caps */ + if (!GST_CAPS_IS_SIMPLE (mastercaps)) { + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + gst_caps_unref (mastercaps); + goto beach; + } + + gst_caps_unref (res); + res = gst_caps_make_writable (mastercaps); + st = gst_caps_get_structure (res, 0); + gst_structure_set (st, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + if (!gst_structure_has_field (st, "pixel-aspect-ratio")) + gst_structure_set (st, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); + + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + + +beach: + GST_DEBUG_OBJECT (pad, "Returning %" GST_PTR_FORMAT, res); + + return res; +} + +/* +* We accept the caps if it has the same format as other sink pads in +* the element. +*/ +static gboolean +gst_videomixer_pad_sink_acceptcaps (GstPad * pad, GstCaps * vscaps) +{ + gboolean ret; + GstVideoMixer *mix; + GstCaps *acceptedCaps; + + mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); + GST_DEBUG_OBJECT (pad, "%" GST_PTR_FORMAT, vscaps); + GST_VIDEO_MIXER_STATE_LOCK (mix); + + if (mix->master) { + acceptedCaps = gst_pad_get_fixed_caps_func (GST_PAD (mix->master)); + acceptedCaps = gst_caps_make_writable (acceptedCaps); + GST_LOG_OBJECT (pad, "master's caps %" GST_PTR_FORMAT, acceptedCaps); + if (GST_CAPS_IS_SIMPLE (acceptedCaps)) { + GstStructure *s; + s = gst_caps_get_structure (acceptedCaps, 0); + gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + if (!gst_structure_has_field (s, "pixel-aspect-ratio")) + gst_structure_set (s, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, + NULL); + } + } else { + acceptedCaps = gst_pad_get_fixed_caps_func (pad); + } + + GST_INFO_OBJECT (pad, "vscaps: %" GST_PTR_FORMAT, vscaps); + GST_INFO_OBJECT (pad, "acceptedCaps: %" GST_PTR_FORMAT, acceptedCaps); + + ret = gst_caps_can_intersect (vscaps, acceptedCaps); + GST_INFO_OBJECT (pad, "%saccepted caps %" GST_PTR_FORMAT, (ret ? "" : "not "), + vscaps); + gst_caps_unref (acceptedCaps); + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + gst_object_unref (mix); + return ret; +} + + + +static void +gst_videomixer_pad_init (GstVideoMixerPad * mixerpad) +{ + /* setup some pad functions */ + gst_pad_set_setcaps_function (GST_PAD (mixerpad), + gst_videomixer_pad_sink_setcaps); + gst_pad_set_acceptcaps_function (GST_PAD (mixerpad), + GST_DEBUG_FUNCPTR (gst_videomixer_pad_sink_acceptcaps)); + gst_pad_set_getcaps_function (GST_PAD (mixerpad), + gst_videomixer_pad_sink_getcaps); + + mixerpad->zorder = DEFAULT_PAD_ZORDER; + mixerpad->xpos = DEFAULT_PAD_XPOS; + mixerpad->ypos = DEFAULT_PAD_YPOS; + mixerpad->alpha = DEFAULT_PAD_ALPHA; +} + +/* VideoMixer signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_BACKGROUND VIDEO_MIXER_BACKGROUND_CHECKER +enum +{ + PROP_0, + PROP_BACKGROUND +}; + +#define GST_TYPE_VIDEO_MIXER_BACKGROUND (gst_video_mixer_background_get_type()) +static GType +gst_video_mixer_background_get_type (void) +{ + static GType video_mixer_background_type = 0; + + static const GEnumValue video_mixer_background[] = { + {VIDEO_MIXER_BACKGROUND_CHECKER, "Checker pattern", "checker"}, + {VIDEO_MIXER_BACKGROUND_BLACK, "Black", "black"}, + {VIDEO_MIXER_BACKGROUND_WHITE, "White", "white"}, + {VIDEO_MIXER_BACKGROUND_TRANSPARENT, + "Transparent Background to enable further mixing", "transparent"}, + {0, NULL, NULL}, + }; + + if (!video_mixer_background_type) { + video_mixer_background_type = + g_enum_register_static ("GstVideoMixerBackground", + video_mixer_background); + } + return video_mixer_background_type; +} + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_RGB ";" + GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" + GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx) + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_RGB ";" + GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" + GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx) + ); + +static void gst_videomixer_finalize (GObject * object); + +static GstCaps *gst_videomixer_getcaps (GstPad * pad); +static gboolean gst_videomixer_setcaps (GstPad * pad, GstCaps * caps); +static gboolean gst_videomixer_query (GstPad * pad, GstQuery * query); + +static GstFlowReturn gst_videomixer_collected (GstCollectPads * pads, + GstVideoMixer * mix); +static GstPad *gst_videomixer_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_videomixer_release_pad (GstElement * element, GstPad * pad); + +static void gst_videomixer_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_videomixer_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstStateChangeReturn gst_videomixer_change_state (GstElement * element, + GstStateChange transition); + +/*static guint gst_videomixer_signals[LAST_SIGNAL] = { 0 }; */ + +static void gst_videomixer_child_proxy_init (gpointer g_iface, + gpointer iface_data); +static void _do_init (GType object_type); + +GST_BOILERPLATE_FULL (GstVideoMixer, gst_videomixer, GstElement, + GST_TYPE_ELEMENT, _do_init); + +static void +_do_init (GType object_type) +{ + static const GInterfaceInfo child_proxy_info = { + (GInterfaceInitFunc) gst_videomixer_child_proxy_init, + NULL, + NULL + }; + + g_type_add_interface_static (object_type, GST_TYPE_CHILD_PROXY, + &child_proxy_info); + GST_INFO ("GstChildProxy interface registered"); +} + +static GstObject * +gst_videomixer_child_proxy_get_child_by_index (GstChildProxy * child_proxy, + guint index) +{ + GstVideoMixer *mix = GST_VIDEO_MIXER (child_proxy); + GstObject *obj; + + GST_VIDEO_MIXER_STATE_LOCK (mix); + if ((obj = g_slist_nth_data (mix->sinkpads, index))) + gst_object_ref (obj); + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + return obj; +} + +static guint +gst_videomixer_child_proxy_get_children_count (GstChildProxy * child_proxy) +{ + guint count = 0; + GstVideoMixer *mix = GST_VIDEO_MIXER (child_proxy); + + GST_VIDEO_MIXER_STATE_LOCK (mix); + count = mix->numpads; + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + GST_INFO_OBJECT (mix, "Children Count: %d", count); + return count; +} + +static void +gst_videomixer_child_proxy_init (gpointer g_iface, gpointer iface_data) +{ + GstChildProxyInterface *iface = g_iface; + + GST_INFO ("intializing child proxy interface"); + iface->get_child_by_index = gst_videomixer_child_proxy_get_child_by_index; + iface->get_children_count = gst_videomixer_child_proxy_get_children_count; +} + +static void +gst_videomixer_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "Video mixer", + "Filter/Editor/Video", + "Mix multiple video streams", "Wim Taymans "); +} + +static void +gst_videomixer_class_init (GstVideoMixerClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_videomixer_finalize; + + gobject_class->get_property = gst_videomixer_get_property; + gobject_class->set_property = gst_videomixer_set_property; + + g_object_class_install_property (gobject_class, PROP_BACKGROUND, + g_param_spec_enum ("background", "Background", "Background type", + GST_TYPE_VIDEO_MIXER_BACKGROUND, + DEFAULT_BACKGROUND, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_videomixer_request_new_pad); + gstelement_class->release_pad = + GST_DEBUG_FUNCPTR (gst_videomixer_release_pad); + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_videomixer_change_state); + + /* Register the pad class */ + (void) (GST_TYPE_VIDEO_MIXER_PAD); + /* Register the background enum */ + (void) (GST_TYPE_VIDEO_MIXER_BACKGROUND); +} + +static void +gst_videomixer_collect_free (GstVideoMixerCollect * mixcol) +{ + if (mixcol->buffer) { + gst_buffer_unref (mixcol->buffer); + mixcol->buffer = NULL; + } +} + +static void +gst_videomixer_reset (GstVideoMixer * mix) +{ + GSList *walk; + + mix->in_width = 0; + mix->in_height = 0; + mix->out_width = 0; + mix->out_height = 0; + mix->fps_n = mix->fps_d = 0; + mix->par_n = mix->par_d = 1; + mix->setcaps = FALSE; + mix->sendseg = FALSE; + + mix->segment_position = 0; + gst_segment_init (&mix->segment, GST_FORMAT_TIME); + + gst_videomixer_reset_qos (mix); + + mix->fmt = GST_VIDEO_FORMAT_UNKNOWN; + + mix->last_ts = 0; + mix->last_duration = -1; + + /* clean up collect data */ + walk = mix->collect->data; + while (walk) { + GstVideoMixerCollect *data = (GstVideoMixerCollect *) walk->data; + + gst_videomixer_collect_free (data); + walk = g_slist_next (walk); + } + + mix->next_sinkpad = 0; + mix->flush_stop_pending = FALSE; +} + +static void +gst_videomixer_init (GstVideoMixer * mix, GstVideoMixerClass * g_class) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (mix); + + mix->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); + gst_pad_set_getcaps_function (GST_PAD (mix->srcpad), + GST_DEBUG_FUNCPTR (gst_videomixer_getcaps)); + gst_pad_set_setcaps_function (GST_PAD (mix->srcpad), + GST_DEBUG_FUNCPTR (gst_videomixer_setcaps)); + gst_pad_set_query_function (GST_PAD (mix->srcpad), + GST_DEBUG_FUNCPTR (gst_videomixer_query)); + gst_pad_set_event_function (GST_PAD (mix->srcpad), + GST_DEBUG_FUNCPTR (gst_videomixer_src_event)); + gst_element_add_pad (GST_ELEMENT (mix), mix->srcpad); + + mix->collect = gst_collect_pads_new (); + mix->background = DEFAULT_BACKGROUND; + + gst_collect_pads_set_function (mix->collect, + (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_videomixer_collected), + mix); + + mix->state_lock = g_mutex_new (); + /* initialize variables */ + gst_videomixer_reset (mix); +} + +static void +gst_videomixer_finalize (GObject * object) +{ + GstVideoMixer *mix = GST_VIDEO_MIXER (object); + + gst_object_unref (mix->collect); + g_mutex_free (mix->state_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_videomixer_query_duration (GstVideoMixer * mix, GstQuery * query) +{ + gint64 max; + gboolean res; + GstFormat format; + GstIterator *it; + gboolean done; + + /* parse format */ + gst_query_parse_duration (query, &format, NULL); + + max = -1; + res = TRUE; + done = FALSE; + + /* Take maximum of all durations */ + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); + while (!done) { + GstIteratorResult ires; + gpointer item; + + ires = gst_iterator_next (it, &item); + switch (ires) { + case GST_ITERATOR_DONE: + done = TRUE; + break; + case GST_ITERATOR_OK: + { + GstPad *pad = GST_PAD_CAST (item); + gint64 duration; + + /* ask sink peer for duration */ + res &= gst_pad_query_peer_duration (pad, &format, &duration); + /* take max from all valid return values */ + if (res) { + /* valid unknown length, stop searching */ + if (duration == -1) { + max = duration; + done = TRUE; + } + /* else see if bigger than current max */ + else if (duration > max) + max = duration; + } + gst_object_unref (pad); + break; + } + case GST_ITERATOR_RESYNC: + max = -1; + res = TRUE; + gst_iterator_resync (it); + break; + default: + res = FALSE; + done = TRUE; + break; + } + } + gst_iterator_free (it); + + if (res) { + /* and store the max */ + GST_DEBUG_OBJECT (mix, "Total duration in format %s: %" + GST_TIME_FORMAT, gst_format_get_name (format), GST_TIME_ARGS (max)); + gst_query_set_duration (query, format, max); + } + + return res; +} + +static gboolean +gst_videomixer_query_latency (GstVideoMixer * mix, GstQuery * query) +{ + GstClockTime min, max; + gboolean live; + gboolean res; + GstIterator *it; + gboolean done; + + res = TRUE; + done = FALSE; + live = FALSE; + min = 0; + max = GST_CLOCK_TIME_NONE; + + /* Take maximum of all latency values */ + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); + while (!done) { + GstIteratorResult ires; + gpointer item; + + ires = gst_iterator_next (it, &item); + switch (ires) { + case GST_ITERATOR_DONE: + done = TRUE; + break; + case GST_ITERATOR_OK: + { + GstPad *pad = GST_PAD_CAST (item); + + GstQuery *peerquery; + + GstClockTime min_cur, max_cur; + + gboolean live_cur; + + peerquery = gst_query_new_latency (); + + /* Ask peer for latency */ + res &= gst_pad_peer_query (pad, peerquery); + + /* take max from all valid return values */ + if (res) { + gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur); + + if (min_cur > min) + min = min_cur; + + if (max_cur != GST_CLOCK_TIME_NONE && + ((max != GST_CLOCK_TIME_NONE && max_cur > max) || + (max == GST_CLOCK_TIME_NONE))) + max = max_cur; + + live = live || live_cur; + } + + gst_query_unref (peerquery); + gst_object_unref (pad); + break; + } + case GST_ITERATOR_RESYNC: + live = FALSE; + min = 0; + max = GST_CLOCK_TIME_NONE; + res = TRUE; + gst_iterator_resync (it); + break; + default: + res = FALSE; + done = TRUE; + break; + } + } + gst_iterator_free (it); + + if (res) { + /* store the results */ + GST_DEBUG_OBJECT (mix, "Calculated total latency: live %s, min %" + GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, + (live ? "yes" : "no"), GST_TIME_ARGS (min), GST_TIME_ARGS (max)); + gst_query_set_latency (query, live, min, max); + } + + return res; +} + +static gboolean +gst_videomixer_query (GstPad * pad, GstQuery * query) +{ + GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + + gst_query_parse_position (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME: + /* FIXME, bring to stream time, might be tricky */ + gst_query_set_position (query, format, mix->last_ts); + res = TRUE; + break; + default: + break; + } + break; + } + case GST_QUERY_DURATION: + res = gst_videomixer_query_duration (mix, query); + break; + case GST_QUERY_LATENCY: + res = gst_videomixer_query_latency (mix, query); + break; + default: + /* FIXME, needs a custom query handler because we have multiple + * sinkpads, send to the master pad until then */ + res = gst_pad_query (GST_PAD_CAST (mix->master), query); + break; + } + + gst_object_unref (mix); + return res; +} + +static GstCaps * +gst_videomixer_getcaps (GstPad * pad) +{ + GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); + GstCaps *caps; + GstStructure *structure; + int numCaps; + + if (mix->master) { + caps = + gst_caps_copy (gst_pad_get_pad_template_caps (GST_PAD (mix->master))); + } else { + caps = gst_caps_copy (gst_pad_get_pad_template_caps (mix->srcpad)); + } + + numCaps = gst_caps_get_size (caps) - 1; + for (; numCaps >= 0; numCaps--) { + structure = gst_caps_get_structure (caps, numCaps); + if (mix->out_width != 0) { + gst_structure_set (structure, "width", G_TYPE_INT, mix->out_width, NULL); + } + if (mix->out_height != 0) { + gst_structure_set (structure, "height", G_TYPE_INT, mix->out_height, + NULL); + } + if (mix->fps_d != 0) { + gst_structure_set (structure, + "framerate", GST_TYPE_FRACTION, mix->fps_n, mix->fps_d, NULL); + } + } + + gst_object_unref (mix); + + return caps; +} + +static gboolean +gst_videomixer_setcaps (GstPad * pad, GstCaps * caps) +{ + GstVideoMixer *mixer = GST_VIDEO_MIXER (gst_pad_get_parent_element (pad)); + gboolean ret = FALSE; + + GST_INFO_OBJECT (mixer, "set src caps: %" GST_PTR_FORMAT, caps); + + mixer->blend = NULL; + mixer->overlay = NULL; + mixer->fill_checker = NULL; + mixer->fill_color = NULL; + + if (!gst_video_format_parse_caps (caps, &mixer->fmt, NULL, NULL)) + goto done; + + switch (mixer->fmt) { + case GST_VIDEO_FORMAT_AYUV: + mixer->blend = gst_video_mixer_blend_ayuv; + mixer->overlay = gst_video_mixer_overlay_ayuv; + mixer->fill_checker = gst_video_mixer_fill_checker_ayuv; + mixer->fill_color = gst_video_mixer_fill_color_ayuv; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_ARGB: + mixer->blend = gst_video_mixer_blend_argb; + mixer->overlay = gst_video_mixer_overlay_argb; + mixer->fill_checker = gst_video_mixer_fill_checker_argb; + mixer->fill_color = gst_video_mixer_fill_color_argb; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_BGRA: + mixer->blend = gst_video_mixer_blend_bgra; + mixer->overlay = gst_video_mixer_overlay_bgra; + mixer->fill_checker = gst_video_mixer_fill_checker_bgra; + mixer->fill_color = gst_video_mixer_fill_color_bgra; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_ABGR: + mixer->blend = gst_video_mixer_blend_abgr; + mixer->overlay = gst_video_mixer_overlay_abgr; + mixer->fill_checker = gst_video_mixer_fill_checker_abgr; + mixer->fill_color = gst_video_mixer_fill_color_abgr; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_RGBA: + mixer->blend = gst_video_mixer_blend_rgba; + mixer->overlay = gst_video_mixer_overlay_rgba; + mixer->fill_checker = gst_video_mixer_fill_checker_rgba; + mixer->fill_color = gst_video_mixer_fill_color_rgba; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_Y444: + mixer->blend = gst_video_mixer_blend_y444; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_y444; + mixer->fill_color = gst_video_mixer_fill_color_y444; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_Y42B: + mixer->blend = gst_video_mixer_blend_y42b; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_y42b; + mixer->fill_color = gst_video_mixer_fill_color_y42b; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_YUY2: + mixer->blend = gst_video_mixer_blend_yuy2; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_yuy2; + mixer->fill_color = gst_video_mixer_fill_color_yuy2; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_UYVY: + mixer->blend = gst_video_mixer_blend_uyvy; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_uyvy; + mixer->fill_color = gst_video_mixer_fill_color_uyvy; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_YVYU: + mixer->blend = gst_video_mixer_blend_yvyu; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_yvyu; + mixer->fill_color = gst_video_mixer_fill_color_yvyu; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_I420: + mixer->blend = gst_video_mixer_blend_i420; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_i420; + mixer->fill_color = gst_video_mixer_fill_color_i420; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_YV12: + mixer->blend = gst_video_mixer_blend_yv12; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_yv12; + mixer->fill_color = gst_video_mixer_fill_color_yv12; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_Y41B: + mixer->blend = gst_video_mixer_blend_y41b; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_y41b; + mixer->fill_color = gst_video_mixer_fill_color_y41b; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_RGB: + mixer->blend = gst_video_mixer_blend_rgb; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_rgb; + mixer->fill_color = gst_video_mixer_fill_color_rgb; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_BGR: + mixer->blend = gst_video_mixer_blend_bgr; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_bgr; + mixer->fill_color = gst_video_mixer_fill_color_bgr; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_xRGB: + mixer->blend = gst_video_mixer_blend_xrgb; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_xrgb; + mixer->fill_color = gst_video_mixer_fill_color_xrgb; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_xBGR: + mixer->blend = gst_video_mixer_blend_xbgr; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_xbgr; + mixer->fill_color = gst_video_mixer_fill_color_xbgr; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_RGBx: + mixer->blend = gst_video_mixer_blend_rgbx; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_rgbx; + mixer->fill_color = gst_video_mixer_fill_color_rgbx; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_BGRx: + mixer->blend = gst_video_mixer_blend_bgrx; + mixer->overlay = mixer->blend; + mixer->fill_checker = gst_video_mixer_fill_checker_bgrx; + mixer->fill_color = gst_video_mixer_fill_color_bgrx; + ret = TRUE; + break; + default: + break; + } + +done: + gst_object_unref (mixer); + + return ret; +} + +static GstPad * +gst_videomixer_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) +{ + GstVideoMixer *mix = NULL; + GstVideoMixerPad *mixpad = NULL; + GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); + + g_return_val_if_fail (templ != NULL, NULL); + + if (G_UNLIKELY (templ->direction != GST_PAD_SINK)) { + g_warning ("videomixer: request pad that is not a SINK pad"); + return NULL; + } + + g_return_val_if_fail (GST_IS_VIDEO_MIXER (element), NULL); + + mix = GST_VIDEO_MIXER (element); + + if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) { + gint serial = 0; + gchar *name = NULL; + GstVideoMixerCollect *mixcol = NULL; + + GST_VIDEO_MIXER_STATE_LOCK (mix); + if (req_name == NULL || strlen (req_name) < 6 + || !g_str_has_prefix (req_name, "sink_")) { + /* no name given when requesting the pad, use next available int */ + serial = mix->next_sinkpad++; + } else { + /* parse serial number from requested padname */ + serial = atoi (&req_name[5]); + if (serial >= mix->next_sinkpad) + mix->next_sinkpad = serial + 1; + } + /* create new pad with the name */ + name = g_strdup_printf ("sink_%d", serial); + mixpad = g_object_new (GST_TYPE_VIDEO_MIXER_PAD, "name", name, "direction", + templ->direction, "template", templ, NULL); + g_free (name); + + mixpad->zorder = mix->numpads; + mixpad->xpos = DEFAULT_PAD_XPOS; + mixpad->ypos = DEFAULT_PAD_YPOS; + mixpad->alpha = DEFAULT_PAD_ALPHA; + + mixcol = (GstVideoMixerCollect *) + gst_collect_pads_add_pad (mix->collect, GST_PAD (mixpad), + sizeof (GstVideoMixerCollect)); + + /* 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 */ + mix->collect_event = + (GstPadEventFunction) GST_PAD_EVENTFUNC (GST_PAD (mixpad)); + gst_pad_set_event_function (GST_PAD (mixpad), + GST_DEBUG_FUNCPTR (gst_videomixer_sink_event)); + + /* Keep track of each other */ + mixcol->mixpad = mixpad; + mixpad->mixcol = mixcol; + + /* Keep an internal list of mixpads for zordering */ + mix->sinkpads = g_slist_append (mix->sinkpads, mixpad); + mix->numpads++; + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + } else { + g_warning ("videomixer: this is not our template!"); + return NULL; + } + + /* add the pad to the element */ + gst_element_add_pad (element, GST_PAD (mixpad)); + gst_child_proxy_child_added (GST_OBJECT (mix), GST_OBJECT (mixpad)); + + return GST_PAD (mixpad); +} + +static void +gst_videomixer_release_pad (GstElement * element, GstPad * pad) +{ + GstVideoMixer *mix = NULL; + GstVideoMixerPad *mixpad; + + mix = GST_VIDEO_MIXER (element); + GST_VIDEO_MIXER_STATE_LOCK (mix); + if (G_UNLIKELY (g_slist_find (mix->sinkpads, pad) == NULL)) { + g_warning ("Unknown pad %s", GST_PAD_NAME (pad)); + goto error; + } + + mixpad = GST_VIDEO_MIXER_PAD (pad); + + mix->sinkpads = g_slist_remove (mix->sinkpads, pad); + gst_videomixer_collect_free (mixpad->mixcol); + gst_collect_pads_remove_pad (mix->collect, pad); + gst_child_proxy_child_removed (GST_OBJECT (mix), GST_OBJECT (mixpad)); + /* determine possibly new geometry and master */ + gst_videomixer_set_master_geometry (mix); + mix->numpads--; + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + + gst_element_remove_pad (element, pad); + return; +error: + GST_VIDEO_MIXER_STATE_UNLOCK (mix); +} + +static int +pad_zorder_compare (const GstVideoMixerPad * pad1, + const GstVideoMixerPad * pad2) +{ + return pad1->zorder - pad2->zorder; +} + +static void +gst_videomixer_sort_pads (GstVideoMixer * mix) +{ + mix->sinkpads = g_slist_sort (mix->sinkpads, + (GCompareFunc) pad_zorder_compare); +} + +/* try to get a buffer on all pads. As long as the queued value is + * negative, we skip buffers */ +static gboolean +gst_videomixer_fill_queues (GstVideoMixer * mix) +{ + GSList *walk = NULL; + gboolean eos = TRUE; + + g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), FALSE); + + /* try to make sure we have a buffer from each usable pad first */ + walk = mix->collect->data; + while (walk) { + GstCollectData *data = (GstCollectData *) walk->data; + GstVideoMixerCollect *mixcol = (GstVideoMixerCollect *) data; + GstVideoMixerPad *mixpad = mixcol->mixpad; + + walk = g_slist_next (walk); + + if (mixcol->buffer == NULL) { + GstBuffer *buf = NULL; + + GST_LOG_OBJECT (mix, "we need a new buffer"); + + buf = gst_collect_pads_peek (mix->collect, data); + + if (buf) { + guint64 duration; + + mixcol->buffer = buf; + duration = GST_BUFFER_DURATION (mixcol->buffer); + + GST_LOG_OBJECT (mix, "we have a buffer with duration %" GST_TIME_FORMAT + ", queued %" GST_TIME_FORMAT, GST_TIME_ARGS (duration), + GST_TIME_ARGS (mixpad->queued)); + + /* no duration on the buffer, use the framerate */ + if (!GST_CLOCK_TIME_IS_VALID (duration)) { + if (mixpad->fps_n == 0) { + duration = GST_CLOCK_TIME_NONE; + } else { + duration = + gst_util_uint64_scale_int (GST_SECOND, mixpad->fps_d, + mixpad->fps_n); + } + } + if (GST_CLOCK_TIME_IS_VALID (duration)) + mixpad->queued += duration; + else if (!mixpad->queued) + mixpad->queued = GST_CLOCK_TIME_NONE; + + GST_LOG_OBJECT (mix, "now queued: %" GST_TIME_FORMAT, + GST_TIME_ARGS (mixpad->queued)); + } else { + GST_LOG_OBJECT (mix, "pop returned a NULL buffer"); + } + } + if (mix->sendseg && (mixpad == mix->master)) { + GstEvent *event; + gint64 stop, start; + GstSegment *segment = &data->segment; + + /* FIXME, use rate/applied_rate as set on all sinkpads. + * - currently we just set rate as received from last seek-event + * We could potentially figure out the duration as well using + * the current segment positions and the stated stop positions. + * Also we just start from stream time 0 which is rather + * weird. For non-synchronized mixing, the time should be + * the min of the stream times of all received segments, + * rationale being that the duration is at least going to + * be as long as the earliest stream we start mixing. This + * would also be correct for synchronized mixing but then + * the later streams would be delayed until the stream times + * match. + */ + GST_INFO_OBJECT (mix, "_sending play segment"); + + start = segment->accum; + + /* get the duration of the segment if we can and add it to the accumulated + * time on the segment. */ + if (segment->stop != -1 && segment->start != -1) + stop = start + (segment->stop - segment->start); + else + stop = -1; + + gst_segment_set_newsegment (&mix->segment, FALSE, segment->rate, + segment->format, start, stop, start + mix->segment_position); + event = + gst_event_new_new_segment_full (FALSE, segment->rate, 1.0, + segment->format, start, stop, start + mix->segment_position); + gst_pad_push_event (mix->srcpad, event); + mix->sendseg = FALSE; + } + + if (mixcol->buffer != NULL && GST_CLOCK_TIME_IS_VALID (mixpad->queued)) { + /* got a buffer somewhere so we're not eos */ + eos = FALSE; + } + } + + return eos; +} + +/* blend all buffers present on the pads */ +static void +gst_videomixer_blend_buffers (GstVideoMixer * mix, GstBuffer * outbuf) +{ + GSList *walk; + BlendFunction blend; + if (mix->background == VIDEO_MIXER_BACKGROUND_TRANSPARENT) { + blend = mix->overlay; + } else { + blend = mix->blend; + } + + + walk = mix->sinkpads; + while (walk) { /* We walk with this list because it's ordered */ + GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (walk->data); + GstVideoMixerCollect *mixcol = pad->mixcol; + + walk = g_slist_next (walk); + + if (mixcol->buffer != NULL) { + GstClockTime timestamp; + gint64 stream_time; + GstSegment *seg; + + seg = &mixcol->collect.segment; + + timestamp = GST_BUFFER_TIMESTAMP (mixcol->buffer); + + stream_time = + gst_segment_to_stream_time (seg, GST_FORMAT_TIME, timestamp); + + /* sync object properties on stream time */ + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (pad), stream_time); + + blend (GST_BUFFER_DATA (mixcol->buffer), + pad->xpos, pad->ypos, pad->in_width, pad->in_height, pad->alpha, + GST_BUFFER_DATA (outbuf), mix->out_width, mix->out_height); + } + } +} + +/* remove buffers from the queue that were expired in the + * interval of the master, we also prepare the queued value + * in the pad so that we can skip and fill buffers later on */ +static void +gst_videomixer_update_queues (GstVideoMixer * mix) +{ + GSList *walk; + gint64 interval; + + interval = mix->master->queued; + if (interval <= 0) { + if (mix->fps_n == 0) { + interval = G_MAXINT64; + } else { + interval = gst_util_uint64_scale_int (GST_SECOND, mix->fps_d, mix->fps_n); + } + GST_LOG_OBJECT (mix, "set interval to %" G_GINT64_FORMAT " nanoseconds", + interval); + } + + walk = mix->sinkpads; + while (walk) { + GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (walk->data); + GstVideoMixerCollect *mixcol = pad->mixcol; + + walk = g_slist_next (walk); + + if (mixcol->buffer != NULL) { + pad->queued -= interval; + GST_LOG_OBJECT (pad, "queued now %" G_GINT64_FORMAT, pad->queued); + if (pad->queued <= 0) { + GstBuffer *buffer = + gst_collect_pads_pop (mix->collect, &mixcol->collect); + + GST_LOG_OBJECT (pad, "unreffing buffer"); + if (buffer) + gst_buffer_unref (buffer); + else + GST_WARNING_OBJECT (pad, + "Buffer was removed by GstCollectPads in the meantime"); + + gst_buffer_unref (mixcol->buffer); + mixcol->buffer = NULL; + } + } + } +} + +static GstFlowReturn +gst_videomixer_collected (GstCollectPads * pads, GstVideoMixer * mix) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *outbuf = NULL; + size_t outsize = 0; + gboolean eos = FALSE; + GstClockTime timestamp = GST_CLOCK_TIME_NONE; + GstClockTime duration = GST_CLOCK_TIME_NONE; + + g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), GST_FLOW_ERROR); + + /* This must be set, otherwise we have no caps */ + if (G_UNLIKELY (mix->in_width == 0)) + return GST_FLOW_NOT_NEGOTIATED; + + if (g_atomic_int_compare_and_exchange (&mix->flush_stop_pending, TRUE, FALSE)) { + GST_DEBUG_OBJECT (mix, "pending flush stop"); + gst_pad_push_event (mix->srcpad, gst_event_new_flush_stop ()); + } + + GST_LOG_OBJECT (mix, "all pads are collected"); + GST_VIDEO_MIXER_STATE_LOCK (mix); + + eos = gst_videomixer_fill_queues (mix); + + if (eos) { + /* Push EOS downstream */ + GST_LOG_OBJECT (mix, "all our sinkpads are EOS, pushing downstream"); + gst_pad_push_event (mix->srcpad, gst_event_new_eos ()); + ret = GST_FLOW_WRONG_STATE; + goto error; + } + + /* If geometry has changed we need to set new caps on the buffer */ + if (mix->in_width != mix->out_width || mix->in_height != mix->out_height + || mix->setcaps) { + GstCaps *newcaps = NULL; + + newcaps = gst_caps_make_writable + (gst_pad_get_negotiated_caps (GST_PAD (mix->master))); + gst_caps_set_simple (newcaps, + "width", G_TYPE_INT, mix->in_width, + "height", G_TYPE_INT, mix->in_height, + "pixel-aspect-ratio", GST_TYPE_FRACTION, mix->par_n, mix->par_d, NULL); + + mix->out_width = mix->in_width; + mix->out_height = mix->in_height; + mix->setcaps = FALSE; + + /* Calculating out buffer size from input size */ + gst_pad_set_caps (mix->srcpad, newcaps); + gst_caps_unref (newcaps); + } + + /* Get timestamp & duration */ + if (mix->master->mixcol->buffer != NULL) { + GstClockTime in_ts; + GstSegment *seg; + GstVideoMixerCollect *mixcol = mix->master->mixcol; + + seg = &mixcol->collect.segment; + in_ts = GST_BUFFER_TIMESTAMP (mixcol->buffer); + + timestamp = gst_segment_to_running_time (seg, GST_FORMAT_TIME, in_ts); + duration = GST_BUFFER_DURATION (mixcol->buffer); + + mix->last_ts = timestamp; + mix->last_duration = duration; + } else { + timestamp = mix->last_ts; + duration = mix->last_duration; + } + + if (GST_CLOCK_TIME_IS_VALID (duration)) + mix->last_ts += duration; + + if (!gst_videomixer_do_qos (mix, timestamp)) { + gst_videomixer_update_queues (mix); + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + ret = GST_FLOW_OK; + goto beach; + } + + /* allocate an output buffer */ + outsize = + gst_video_format_get_size (mix->fmt, mix->out_width, mix->out_height); + ret = + gst_pad_alloc_buffer_and_set_caps (mix->srcpad, GST_BUFFER_OFFSET_NONE, + outsize, GST_PAD_CAPS (mix->srcpad), &outbuf); + + /* This must be set at this point, otherwise we have no src caps */ + g_assert (mix->blend != NULL); + + if (ret != GST_FLOW_OK) { + goto error; + } + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_DURATION (outbuf) = duration; + + switch (mix->background) { + case VIDEO_MIXER_BACKGROUND_CHECKER: + mix->fill_checker (GST_BUFFER_DATA (outbuf), mix->out_width, + mix->out_height); + break; + case VIDEO_MIXER_BACKGROUND_BLACK: + mix->fill_color (GST_BUFFER_DATA (outbuf), mix->out_width, + mix->out_height, 16, 128, 128); + break; + case VIDEO_MIXER_BACKGROUND_WHITE: + mix->fill_color (GST_BUFFER_DATA (outbuf), mix->out_width, + mix->out_height, 240, 128, 128); + break; + case VIDEO_MIXER_BACKGROUND_TRANSPARENT: + orc_memset (GST_BUFFER_DATA (outbuf), 0, + gst_video_format_get_row_stride (mix->fmt, 0, + mix->out_width) * mix->out_height); + break; + } + + gst_videomixer_blend_buffers (mix, outbuf); + + gst_videomixer_update_queues (mix); + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + + ret = gst_pad_push (mix->srcpad, outbuf); + +beach: + return ret; + + /* ERRORS */ +error: + { + if (outbuf) + gst_buffer_unref (outbuf); + + GST_VIDEO_MIXER_STATE_UNLOCK (mix); + goto beach; + } +} + +static gboolean +forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) +{ + gst_event_ref (event); + GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event)); + if (!gst_pad_push_event (pad, event)) { + g_value_set_boolean (ret, FALSE); + GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", + event, GST_EVENT_TYPE_NAME (event)); + } else { + GST_LOG_OBJECT (pad, "Sent event %p (%s).", + event, GST_EVENT_TYPE_NAME (event)); + } + gst_object_unref (pad); + return TRUE; +} + +/* forwards the event to all sinkpads, takes ownership of the + * event + * + * Returns: TRUE if the event could be forwarded on all + * sinkpads. + */ +static gboolean +forward_event (GstVideoMixer * mix, GstEvent * event) +{ + GstIterator *it; + GValue vret = { 0 }; + + GST_LOG_OBJECT (mix, "Forwarding event %p (%s)", event, + GST_EVENT_TYPE_NAME (event)); + + g_value_init (&vret, G_TYPE_BOOLEAN); + g_value_set_boolean (&vret, TRUE); + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); + gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func, &vret, + event); + gst_iterator_free (it); + gst_event_unref (event); + + return g_value_get_boolean (&vret); +} + +static gboolean +gst_videomixer_src_event (GstPad * pad, GstEvent * event) +{ + GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); + gboolean result; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS:{ + GstClockTimeDiff diff; + GstClockTime timestamp; + gdouble proportion; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + gst_videomixer_update_qos (mix, proportion, diff, timestamp); + gst_event_unref (event); + + /* TODO: The QoS event should be transformed and send upstream */ + result = TRUE; + break; + } + case GST_EVENT_SEEK: + { + GstSeekFlags flags; + GstSeekType curtype; + gint64 cur; + + /* parse the seek parameters */ + gst_event_parse_seek (event, NULL, NULL, &flags, &curtype, + &cur, NULL, NULL); + + /* check if we are flushing */ + if (flags & GST_SEEK_FLAG_FLUSH) { + /* make sure we accept nothing anymore and return WRONG_STATE */ + gst_collect_pads_set_flushing (mix->collect, TRUE); + + /* flushing seek, start flush downstream, the flush will be done + * when all pads received a FLUSH_STOP. */ + gst_pad_push_event (mix->srcpad, gst_event_new_flush_start ()); + } + + /* now wait for the collected to be finished and mark a new + * segment */ + GST_OBJECT_LOCK (mix->collect); + if (curtype == GST_SEEK_TYPE_SET) + mix->segment_position = cur; + else + mix->segment_position = 0; + mix->sendseg = TRUE; + + if (flags & GST_SEEK_FLAG_FLUSH) { + gst_collect_pads_set_flushing (mix->collect, FALSE); + + /* we can't send FLUSH_STOP here since upstream could start pushing data + * after we unlock mix->collect. + * We set flush_stop_pending to TRUE instead and send FLUSH_STOP after + * forwarding the seek upstream or from gst_videomixer_collected, + * whichever happens first. + */ + mix->flush_stop_pending = TRUE; + } + + GST_OBJECT_UNLOCK (mix->collect); + gst_videomixer_reset_qos (mix); + + result = forward_event (mix, event); + + if (g_atomic_int_compare_and_exchange (&mix->flush_stop_pending, + TRUE, FALSE)) { + GST_DEBUG_OBJECT (mix, "pending flush stop"); + gst_pad_push_event (mix->srcpad, gst_event_new_flush_stop ()); + } + + break; + } + case GST_EVENT_NAVIGATION: + /* navigation is rather pointless. */ + result = FALSE; + break; + default: + /* just forward the rest for now */ + result = forward_event (mix, event); + break; + } + gst_object_unref (mix); + + return result; +} + +static gboolean +gst_videomixer_sink_event (GstPad * pad, GstEvent * event) +{ + GstVideoMixerPad *vpad = GST_VIDEO_MIXER_PAD (pad); + GstVideoMixer *videomixer = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); + gboolean ret; + + GST_DEBUG_OBJECT (pad, "Got %s event on pad %s:%s", + GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + /* mark a pending new segment. This event is synchronized + * with the streaming thread so we can safely update the + * variable without races. It's somewhat weird because we + * assume the collectpads forwarded the FLUSH_STOP past us + * and downstream (using our source pad, the bastard!). + */ + videomixer->sendseg = TRUE; + videomixer->flush_stop_pending = FALSE; + gst_videomixer_reset_qos (videomixer); + + /* Reset pad state after FLUSH_STOP */ + if (vpad->mixcol->buffer) + gst_buffer_unref (vpad->mixcol->buffer); + vpad->mixcol->buffer = NULL; + vpad->queued = 0; + break; + case GST_EVENT_NEWSEGMENT: + if (!videomixer->master || vpad == videomixer->master) { + videomixer->sendseg = TRUE; + gst_videomixer_reset_qos (videomixer); + } + break; + default: + break; + } + + /* now GstCollectPads can take care of the rest, e.g. EOS */ + ret = videomixer->collect_event (pad, event); + + gst_object_unref (videomixer); + return ret; +} + + +static void +gst_videomixer_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstVideoMixer *mix = GST_VIDEO_MIXER (object); + + switch (prop_id) { + case PROP_BACKGROUND: + g_value_set_enum (value, mix->background); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_videomixer_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstVideoMixer *mix = GST_VIDEO_MIXER (object); + + switch (prop_id) { + case PROP_BACKGROUND: + mix->background = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_videomixer_change_state (GstElement * element, GstStateChange transition) +{ + GstVideoMixer *mix; + GstStateChangeReturn ret; + + g_return_val_if_fail (GST_IS_VIDEO_MIXER (element), GST_STATE_CHANGE_FAILURE); + + mix = GST_VIDEO_MIXER (element); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + GST_LOG_OBJECT (mix, "starting collectpads"); + gst_collect_pads_start (mix->collect); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_LOG_OBJECT (mix, "stopping collectpads"); + gst_collect_pads_stop (mix->collect); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_videomixer_reset (mix); + break; + default: + break; + } + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_videomixer_debug, "videomixer", 0, + "video mixer"); + + gst_video_mixer_init_blend (); + + return gst_element_register (plugin, "videomixer", GST_RANK_PRIMARY, + GST_TYPE_VIDEO_MIXER) && gst_videomixer2_register (plugin); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videomixer", + "Video mixer", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN) diff --git a/gst/videomixer/videomixer.h b/gst/videomixer/videomixer.h new file mode 100644 index 0000000..fe55a5e --- /dev/null +++ b/gst/videomixer/videomixer.h @@ -0,0 +1,132 @@ +/* Generic video mixer plugin + * Copyright (C) 2008 Wim Taymans + * + * 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_VIDEO_MIXER_H__ +#define __GST_VIDEO_MIXER_H__ + +#include +#include +#include "videomixerpad.h" +#include "blend.h" + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEO_MIXER (gst_videomixer_get_type()) +#define GST_VIDEO_MIXER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_MIXER, GstVideoMixer)) +#define GST_VIDEO_MIXER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_MIXER, GstVideoMixerClass)) +#define GST_IS_VIDEO_MIXER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_MIXER)) +#define GST_IS_VIDEO_MIXER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_MIXER)) + +typedef struct _GstVideoMixer GstVideoMixer; +typedef struct _GstVideoMixerClass GstVideoMixerClass; + +/** + * GstVideoMixerBackground: + * @VIDEO_MIXER_BACKGROUND_CHECKER: checker pattern background + * @VIDEO_MIXER_BACKGROUND_BLACK: solid color black background + * @VIDEO_MIXER_BACKGROUND_WHITE: solid color white background + * @VIDEO_MIXER_BACKGROUND_TRANSPARENT: background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing. + * + * The different backgrounds videomixer can blend over. + */ +typedef enum +{ + VIDEO_MIXER_BACKGROUND_CHECKER, + VIDEO_MIXER_BACKGROUND_BLACK, + VIDEO_MIXER_BACKGROUND_WHITE, + VIDEO_MIXER_BACKGROUND_TRANSPARENT, +} +GstVideoMixerBackground; + +/** + * GstVideoMixer: + * + * The opaque #GstVideoMixer structure. + */ +struct _GstVideoMixer +{ + GstElement element; + + /* pad */ + GstPad *srcpad; + + /* Lock to prevent the state to change while blending */ + GMutex *state_lock; + /* Sink pads using Collect Pads from core's base library */ + GstCollectPads *collect; + /* sinkpads, a GSList of GstVideoMixerPads */ + GSList *sinkpads; + + gint numpads; + + GstClockTime last_ts; + GstClockTime last_duration; + + /* the master pad */ + GstVideoMixerPad *master; + + GstVideoFormat fmt; + + gint in_width, in_height; + gint out_width, out_height; + gboolean setcaps; + gboolean sendseg; + + GstVideoMixerBackground background; + + gint fps_n; + gint fps_d; + + gint par_n; + gint par_d; + + /* Next available sinkpad index */ + gint next_sinkpad; + + /* sink event handling */ + GstPadEventFunction collect_event; + guint64 segment_position; + + /* Current downstream segment */ + GstSegment segment; + + /* QoS stuff */ + gdouble proportion; + GstClockTime earliest_time; + + BlendFunction blend, overlay; + FillCheckerFunction fill_checker; + FillColorFunction fill_color; + + gboolean flush_stop_pending; +}; + +struct _GstVideoMixerClass +{ + GstElementClass parent_class; +}; + +GType gst_video_mixer_get_type (void); + +G_END_DECLS +#endif /* __GST_VIDEO_MIXER_H__ */ diff --git a/gst/videomixer/videomixer2.c b/gst/videomixer/videomixer2.c new file mode 100644 index 0000000..585f3aa --- /dev/null +++ b/gst/videomixer/videomixer2.c @@ -0,0 +1,2019 @@ +/* Generic video mixer plugin + * Copyright (C) 2004, 2008 Wim Taymans + * Copyright (C) 2010 Sebastian Dröge + * + * 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-videomixer2 + * + * Videomixer2 can accept AYUV, ARGB and BGRA video streams. For each of the requested + * sink pads it will compare the incoming geometry and framerate to define the + * output parameters. Indeed output video frames will have the geometry of the + * biggest incoming video stream and the framerate of the fastest incoming one. + * + * All sink pads must be either AYUV, ARGB or BGRA, but a mixture of them is not + * supported. The src pad will have the same colorspace as the sinks. + * No colorspace conversion is done. + * + * Individual parameters for each input stream can be configured on the + * #GstVideoMixer2Pad. + * + * At this stage, videomixer2 is considered UNSTABLE. The API provided in the + * properties may yet change in the near future. When videomixer2 is stable, + * it will replace #videomixer + * + * + * Sample pipelines + * |[ + * gst-launch-0.10 \ + * videotestsrc pattern=1 ! \ + * video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! \ + * videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! \ + * videomixer2 name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! \ + * ffmpegcolorspace ! xvimagesink \ + * videotestsrc ! \ + * video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix. + * ]| A pipeline to demonstrate videomixer used together with videobox. + * This should show a 320x240 pixels video test source with some transparency + * showing the background checker pattern. Another video test source with just + * the snow pattern of 100x100 pixels is overlayed on top of the first one on + * the left vertically centered with a small transparency showing the first + * video test source behind and the checker pattern under it. Note that the + * framerate of the output video is 10 frames per second. + * |[ + * gst-launch videotestsrc pattern=1 ! \ + * video/x-raw-rgb, framerate=\(fraction\)10/1, width=100, height=100 ! \ + * videomixer2 name=mix ! ffmpegcolorspace ! ximagesink \ + * videotestsrc ! \ + * video/x-raw-rgb, framerate=\(fraction\)5/1, width=320, height=240 ! mix. + * ]| A pipeline to demostrate bgra mixing. (This does not demonstrate alpha blending). + * |[ + * gst-launch videotestsrc pattern=1 ! \ + * video/x-raw-yuv,format =\(fourcc\)I420, framerate=\(fraction\)10/1, width=100, height=100 ! \ + * videomixer2 name=mix ! ffmpegcolorspace ! ximagesink \ + * videotestsrc ! \ + * video/x-raw-yuv,format=\(fourcc\)I420, framerate=\(fraction\)5/1, width=320, height=240 ! mix. + * ]| A pipeline to test I420 + * |[ + * gst-launch videomixer2 name=mixer sink_1::alpha=0.5 sink_1::xpos=50 sink_1::ypos=50 ! \ + * ffmpegcolorspace ! ximagesink \ + * videotestsrc pattern=snow timestamp-offset=3000000000 ! \ + * "video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480,framerate=(fraction)30/1" ! \ + * timeoverlay ! queue2 ! mixer. \ + * videotestsrc pattern=smpte ! \ + * "video/x-raw-yuv,format=(fourcc)AYUV,width=800,height=600,framerate=(fraction)10/1" ! \ + * timeoverlay ! queue2 ! mixer. + * ]| A pipeline to demonstrate synchronized mixing (the second stream starts after 3 seconds) + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +#include "videomixer2.h" +#include "videomixer2pad.h" + +#include + +#include "gst/glib-compat-private.h" + +#ifdef DISABLE_ORC +#define orc_memset memset +#else +#include +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_videomixer2_debug); +#define GST_CAT_DEFAULT gst_videomixer2_debug + +#define GST_VIDEO_MIXER2_GET_LOCK(mix) \ + (GST_VIDEO_MIXER2(mix)->lock) +#define GST_VIDEO_MIXER2_LOCK(mix) \ + (g_mutex_lock(GST_VIDEO_MIXER2_GET_LOCK (mix))) +#define GST_VIDEO_MIXER2_UNLOCK(mix) \ + (g_mutex_unlock(GST_VIDEO_MIXER2_GET_LOCK (mix))) + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_RGB ";" + GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" + GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx) + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";" + GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";" + GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" + GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" + GST_VIDEO_CAPS_YUV ("YVYU") ";" + GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" + GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_RGB ";" + GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" + GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx) + ); + +static void gst_videomixer2_child_proxy_init (gpointer g_iface, + gpointer iface_data); +static gboolean gst_videomixer2_push_sink_event (GstVideoMixer2 * mix, + GstEvent * event); +static void gst_videomixer2_release_pad (GstElement * element, GstPad * pad); +static void gst_videomixer2_reset_qos (GstVideoMixer2 * mix); + +static void +_do_init (GType object_type) +{ + static const GInterfaceInfo child_proxy_info = { + (GInterfaceInitFunc) gst_videomixer2_child_proxy_init, + NULL, + NULL + }; + + g_type_add_interface_static (object_type, GST_TYPE_CHILD_PROXY, + &child_proxy_info); +} + +struct _GstVideoMixer2Collect +{ + GstCollectData2 collect; /* we extend the CollectData */ + + GstVideoMixer2Pad *mixpad; + + GstBuffer *queued; /* buffer for which we don't know the end time yet */ + + GstBuffer *buffer; /* buffer that should be blended now */ + GstClockTime start_time; + GstClockTime end_time; +}; + +#define DEFAULT_PAD_ZORDER 0 +#define DEFAULT_PAD_XPOS 0 +#define DEFAULT_PAD_YPOS 0 +#define DEFAULT_PAD_ALPHA 1.0 +enum +{ + PROP_PAD_0, + PROP_PAD_ZORDER, + PROP_PAD_XPOS, + PROP_PAD_YPOS, + PROP_PAD_ALPHA +}; + +G_DEFINE_TYPE (GstVideoMixer2Pad, gst_videomixer2_pad, GST_TYPE_PAD); + +static void +gst_videomixer2_collect_free (GstCollectData2 * data) +{ + GstVideoMixer2Collect *cdata = (GstVideoMixer2Collect *) data; + + gst_buffer_replace (&cdata->buffer, NULL); +} + +static gboolean +gst_videomixer2_update_src_caps (GstVideoMixer2 * mix) +{ + GSList *l; + gint best_width = -1, best_height = -1; + gdouble best_fps = -1, cur_fps; + gint best_fps_n = -1, best_fps_d = -1; + gboolean ret = TRUE; + + GST_VIDEO_MIXER2_LOCK (mix); + + for (l = mix->sinkpads; l; l = l->next) { + GstVideoMixer2Pad *mpad = l->data; + gint this_width, this_height; + + if (mpad->fps_n == 0 || mpad->fps_d == 0 || + mpad->width == 0 || mpad->height == 0) + continue; + + this_width = mpad->width + MAX (mpad->xpos, 0); + this_height = mpad->height + MAX (mpad->ypos, 0); + + if (best_width < this_width) + best_width = this_width; + if (best_height < this_height) + best_height = this_height; + + if (mpad->fps_d == 0) + cur_fps = 0.0; + else + gst_util_fraction_to_double (mpad->fps_n, mpad->fps_d, &cur_fps); + if (best_fps < cur_fps) { + best_fps = cur_fps; + best_fps_n = mpad->fps_n; + best_fps_d = mpad->fps_d; + } + } + + if (best_fps_n <= 0 && best_fps_d <= 0) { + best_fps_n = 25; + best_fps_d = 1; + best_fps = 25.0; + } + + if (best_width > 0 && best_height > 0 && best_fps > 0) { + GstCaps *caps, *peercaps; + GstStructure *s; + + if (mix->fps_n != best_fps_n || mix->fps_d != best_fps_d) { + if (mix->segment.last_stop != -1) { + mix->ts_offset = mix->segment.last_stop - mix->segment.start; + mix->nframes = 0; + } + } + + caps = gst_video_format_new_caps (mix->format, + best_width, best_height, best_fps_n, best_fps_d, + mix->par_n, mix->par_d); + + peercaps = gst_pad_peer_get_caps (mix->srcpad); + if (peercaps) { + GstCaps *tmp; + + s = gst_caps_get_structure (caps, 0); + gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", + GST_TYPE_INT_RANGE, 1, G_MAXINT, "framerate", GST_TYPE_FRACTION_RANGE, + 0, 1, G_MAXINT, 1, NULL); + + tmp = gst_caps_intersect (caps, peercaps); + gst_caps_unref (caps); + gst_caps_unref (peercaps); + caps = tmp; + if (gst_caps_is_empty (caps)) { + ret = FALSE; + GST_VIDEO_MIXER2_UNLOCK (mix); + goto done; + } + + gst_caps_truncate (caps); + s = gst_caps_get_structure (caps, 0); + gst_structure_fixate_field_nearest_int (s, "width", best_width); + gst_structure_fixate_field_nearest_int (s, "height", best_height); + gst_structure_fixate_field_nearest_fraction (s, "framerate", best_fps_n, + best_fps_d); + + gst_structure_get_int (s, "width", &best_width); + gst_structure_get_int (s, "height", &best_height); + gst_structure_get_fraction (s, "fraction", &best_fps_n, &best_fps_d); + } + + mix->fps_n = best_fps_n; + mix->fps_d = best_fps_d; + mix->width = best_width; + mix->height = best_height; + + GST_VIDEO_MIXER2_UNLOCK (mix); + ret = gst_pad_set_caps (mix->srcpad, caps); + gst_caps_unref (caps); + } else { + GST_VIDEO_MIXER2_UNLOCK (mix); + } + +done: + return ret; +} + + +static gboolean +gst_videomixer2_pad_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstVideoMixer2 *mix; + GstVideoMixer2Pad *mixpad; + GstVideoFormat fmt; + gint width, height; + gint fps_n = 0, fps_d = 0; + gint par_n = 1, par_d = 1; + gboolean ret = FALSE; + GstStructure *s; + + GST_INFO_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, caps); + + mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); + mixpad = GST_VIDEO_MIXER2_PAD (pad); + + if (!gst_video_format_parse_caps (caps, &fmt, &width, &height) || + !gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d)) { + GST_ERROR_OBJECT (pad, "Failed to parse caps"); + goto beach; + } + + s = gst_caps_get_structure (caps, 0); + if (gst_structure_has_field (s, "framerate") + && !gst_video_parse_caps_framerate (caps, &fps_n, &fps_d)) { + GST_ERROR_OBJECT (pad, "Failed to parse caps"); + goto beach; + } + + GST_VIDEO_MIXER2_LOCK (mix); + if (mix->format != GST_VIDEO_FORMAT_UNKNOWN) { + if (mix->format != fmt || mix->par_n != par_n || mix->par_d != par_d) { + GST_ERROR_OBJECT (pad, "Caps not compatible with other pads' caps"); + GST_VIDEO_MIXER2_UNLOCK (mix); + goto beach; + } + } + + mix->format = fmt; + mix->par_n = par_n; + mix->par_d = par_d; + mixpad->fps_n = fps_n; + mixpad->fps_d = fps_d; + mixpad->width = width; + mixpad->height = height; + + GST_VIDEO_MIXER2_UNLOCK (mix); + + ret = gst_videomixer2_update_src_caps (mix); + +beach: + gst_object_unref (mix); + + return ret; +} + +static GstCaps * +gst_videomixer2_pad_sink_getcaps (GstPad * pad) +{ + GstVideoMixer2 *mix; + GstCaps *srccaps; + GstStructure *s; + gint i, n; + + mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); + + srccaps = gst_pad_get_fixed_caps_func (GST_PAD (mix->srcpad)); + srccaps = gst_caps_make_writable (srccaps); + + n = gst_caps_get_size (srccaps); + for (i = 0; i < n; i++) { + s = gst_caps_get_structure (srccaps, i); + gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + if (!gst_structure_has_field (s, "pixel-aspect-ratio")) + gst_structure_set (s, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, + NULL); + } + + GST_DEBUG_OBJECT (pad, "Returning %" GST_PTR_FORMAT, srccaps); + + return srccaps; +} + +static gboolean +gst_videomixer2_pad_sink_acceptcaps (GstPad * pad, GstCaps * caps) +{ + gboolean ret; + GstVideoMixer2 *mix; + GstCaps *accepted_caps; + gint i, n; + GstStructure *s; + + mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); + GST_DEBUG_OBJECT (pad, "%" GST_PTR_FORMAT, caps); + + accepted_caps = gst_pad_get_fixed_caps_func (GST_PAD (mix->srcpad)); + accepted_caps = gst_caps_make_writable (accepted_caps); + GST_LOG_OBJECT (pad, "src caps %" GST_PTR_FORMAT, accepted_caps); + + n = gst_caps_get_size (accepted_caps); + for (i = 0; i < n; i++) { + s = gst_caps_get_structure (accepted_caps, i); + gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + if (!gst_structure_has_field (s, "pixel-aspect-ratio")) + gst_structure_set (s, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, + NULL); + } + + ret = gst_caps_can_intersect (caps, accepted_caps); + GST_INFO_OBJECT (pad, "%saccepted caps %" GST_PTR_FORMAT, (ret ? "" : "not "), + caps); + GST_INFO_OBJECT (pad, "acceptable caps are %" GST_PTR_FORMAT, accepted_caps); + + gst_caps_unref (accepted_caps); + + gst_object_unref (mix); + return ret; +} + +static void +gst_videomixer2_pad_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVideoMixer2Pad *pad = GST_VIDEO_MIXER2_PAD (object); + + switch (prop_id) { + case PROP_PAD_ZORDER: + g_value_set_uint (value, pad->zorder); + break; + case PROP_PAD_XPOS: + g_value_set_int (value, pad->xpos); + break; + case PROP_PAD_YPOS: + g_value_set_int (value, pad->ypos); + break; + case PROP_PAD_ALPHA: + g_value_set_double (value, pad->alpha); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static int +pad_zorder_compare (const GstVideoMixer2Pad * pad1, + const GstVideoMixer2Pad * pad2) +{ + return pad1->zorder - pad2->zorder; +} + +static void +gst_videomixer2_pad_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideoMixer2Pad *pad = GST_VIDEO_MIXER2_PAD (object); + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (GST_PAD (pad))); + + switch (prop_id) { + case PROP_PAD_ZORDER: + GST_VIDEO_MIXER2_LOCK (mix); + pad->zorder = g_value_get_uint (value); + + mix->sinkpads = g_slist_sort (mix->sinkpads, + (GCompareFunc) pad_zorder_compare); + GST_VIDEO_MIXER2_UNLOCK (mix); + break; + case PROP_PAD_XPOS: + pad->xpos = g_value_get_int (value); + break; + case PROP_PAD_YPOS: + pad->ypos = g_value_get_int (value); + break; + case PROP_PAD_ALPHA: + pad->alpha = g_value_get_double (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + gst_object_unref (mix); +} + +static void +gst_videomixer2_pad_class_init (GstVideoMixer2PadClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_videomixer2_pad_set_property; + gobject_class->get_property = gst_videomixer2_pad_get_property; + + g_object_class_install_property (gobject_class, PROP_PAD_ZORDER, + g_param_spec_uint ("zorder", "Z-Order", "Z Order of the picture", + 0, 10000, DEFAULT_PAD_ZORDER, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_XPOS, + g_param_spec_int ("xpos", "X Position", "X Position of the picture", + G_MININT, G_MAXINT, DEFAULT_PAD_XPOS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_YPOS, + g_param_spec_int ("ypos", "Y Position", "Y Position of the picture", + G_MININT, G_MAXINT, DEFAULT_PAD_YPOS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_ALPHA, + g_param_spec_double ("alpha", "Alpha", "Alpha of the picture", 0.0, 1.0, + DEFAULT_PAD_ALPHA, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_videomixer2_pad_init (GstVideoMixer2Pad * mixerpad) +{ + /* setup some pad functions */ + gst_pad_set_setcaps_function (GST_PAD (mixerpad), + gst_videomixer2_pad_sink_setcaps); + gst_pad_set_acceptcaps_function (GST_PAD (mixerpad), + GST_DEBUG_FUNCPTR (gst_videomixer2_pad_sink_acceptcaps)); + gst_pad_set_getcaps_function (GST_PAD (mixerpad), + gst_videomixer2_pad_sink_getcaps); + + mixerpad->zorder = DEFAULT_PAD_ZORDER; + mixerpad->xpos = DEFAULT_PAD_XPOS; + mixerpad->ypos = DEFAULT_PAD_YPOS; + mixerpad->alpha = DEFAULT_PAD_ALPHA; +} + +/* GstVideoMixer2 */ +#define DEFAULT_BACKGROUND VIDEO_MIXER2_BACKGROUND_CHECKER +enum +{ + PROP_0, + PROP_BACKGROUND +}; + +#define GST_TYPE_VIDEO_MIXER2_BACKGROUND (gst_videomixer2_background_get_type()) +static GType +gst_videomixer2_background_get_type (void) +{ + static GType video_mixer_background_type = 0; + + static const GEnumValue video_mixer_background[] = { + {VIDEO_MIXER2_BACKGROUND_CHECKER, "Checker pattern", "checker"}, + {VIDEO_MIXER2_BACKGROUND_BLACK, "Black", "black"}, + {VIDEO_MIXER2_BACKGROUND_WHITE, "White", "white"}, + {VIDEO_MIXER2_BACKGROUND_TRANSPARENT, + "Transparent Background to enable further mixing", "transparent"}, + {0, NULL, NULL}, + }; + + if (!video_mixer_background_type) { + video_mixer_background_type = + g_enum_register_static ("GstVideoMixer2Background", + video_mixer_background); + } + return video_mixer_background_type; +} + + +GST_BOILERPLATE_FULL (GstVideoMixer2, gst_videomixer2, GstElement, + GST_TYPE_ELEMENT, _do_init); + +static void +gst_videomixer2_update_qos (GstVideoMixer2 * mix, gdouble proportion, + GstClockTimeDiff diff, GstClockTime timestamp) +{ + GST_DEBUG_OBJECT (mix, + "Updating QoS: proportion %lf, diff %s%" GST_TIME_FORMAT ", timestamp %" + GST_TIME_FORMAT, proportion, (diff < 0) ? "-" : "", + GST_TIME_ARGS (ABS (diff)), GST_TIME_ARGS (timestamp)); + + GST_OBJECT_LOCK (mix); + mix->proportion = proportion; + if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { + if (G_UNLIKELY (diff > 0)) + mix->earliest_time = + timestamp + 2 * diff + gst_util_uint64_scale_int (GST_SECOND, + mix->fps_d, mix->fps_n); + else + mix->earliest_time = timestamp + diff; + } else { + mix->earliest_time = GST_CLOCK_TIME_NONE; + } + GST_OBJECT_UNLOCK (mix); +} + +static void +gst_videomixer2_reset_qos (GstVideoMixer2 * mix) +{ + gst_videomixer2_update_qos (mix, 0.5, 0, GST_CLOCK_TIME_NONE); + mix->qos_processed = mix->qos_dropped = 0; +} + +static void +gst_videomixer2_read_qos (GstVideoMixer2 * mix, gdouble * proportion, + GstClockTime * time) +{ + GST_OBJECT_LOCK (mix); + *proportion = mix->proportion; + *time = mix->earliest_time; + GST_OBJECT_UNLOCK (mix); +} + +static void +gst_videomixer2_reset (GstVideoMixer2 * mix) +{ + GSList *l; + + mix->format = GST_VIDEO_FORMAT_UNKNOWN; + mix->width = mix->height = 0; + mix->fps_n = mix->fps_d = 0; + mix->par_n = mix->par_d = 0; + mix->ts_offset = 0; + mix->nframes = 0; + + gst_segment_init (&mix->segment, GST_FORMAT_TIME); + mix->segment.last_stop = -1; + + gst_videomixer2_reset_qos (mix); + + for (l = mix->sinkpads; l; l = l->next) { + GstVideoMixer2Pad *p = l->data; + GstVideoMixer2Collect *mixcol = p->mixcol; + + gst_buffer_replace (&mixcol->buffer, NULL); + mixcol->start_time = -1; + mixcol->end_time = -1; + + p->fps_n = p->fps_d = 0; + p->width = p->height = 0; + } + + mix->newseg_pending = TRUE; + mix->flush_stop_pending = FALSE; +} + +/* 1 == OK + * 0 == need more data + * -1 == EOS + * -2 == error + */ +static gint +gst_videomixer2_fill_queues (GstVideoMixer2 * mix, + GstClockTime output_start_time, GstClockTime output_end_time) +{ + GSList *l; + gboolean eos = TRUE; + gboolean need_more_data = FALSE; + + for (l = mix->sinkpads; l; l = l->next) { + GstVideoMixer2Pad *pad = l->data; + GstVideoMixer2Collect *mixcol = pad->mixcol; + GstSegment *segment = &pad->mixcol->collect.segment; + GstBuffer *buf; + + buf = gst_collect_pads2_peek (mix->collect, &mixcol->collect); + if (buf) { + GstClockTime start_time, end_time; + + start_time = GST_BUFFER_TIMESTAMP (buf); + if (start_time == -1) { + gst_buffer_unref (buf); + GST_ERROR_OBJECT (pad, "Need timestamped buffers!"); + return -2; + } + + /* FIXME: Make all this work with negative rates */ + + if ((mixcol->buffer && start_time < GST_BUFFER_TIMESTAMP (mixcol->buffer)) + || (mixcol->queued + && start_time < GST_BUFFER_TIMESTAMP (mixcol->queued))) { + GST_WARNING_OBJECT (pad, "Buffer from the past, dropping"); + gst_buffer_unref (buf); + buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); + gst_buffer_unref (buf); + need_more_data = TRUE; + continue; + } + + if (mixcol->queued) { + end_time = start_time - GST_BUFFER_TIMESTAMP (mixcol->queued); + start_time = GST_BUFFER_TIMESTAMP (mixcol->queued); + gst_buffer_unref (buf); + buf = gst_buffer_ref (mixcol->queued); + } else { + end_time = GST_BUFFER_DURATION (buf); + + if (end_time == -1) { + mixcol->queued = buf; + need_more_data = TRUE; + continue; + } + } + + g_assert (start_time != -1 && end_time != -1); + end_time += start_time; /* convert from duration to position */ + + if (mixcol->end_time != -1 && mixcol->end_time > end_time) { + GST_WARNING_OBJECT (pad, "Buffer from the past, dropping"); + if (buf == mixcol->queued) { + gst_buffer_unref (buf); + gst_buffer_replace (&mixcol->queued, NULL); + } else { + gst_buffer_unref (buf); + buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); + gst_buffer_unref (buf); + } + + need_more_data = TRUE; + continue; + } + + /* Check if it's inside the segment */ + if (start_time >= segment->stop || end_time < segment->start) { + GST_DEBUG_OBJECT (pad, "Buffer outside the segment"); + + if (buf == mixcol->queued) { + gst_buffer_unref (buf); + gst_buffer_replace (&mixcol->queued, NULL); + } else { + gst_buffer_unref (buf); + buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); + gst_buffer_unref (buf); + } + + need_more_data = TRUE; + continue; + } + + /* Clip to segment and convert to running time */ + start_time = MAX (start_time, segment->start); + if (segment->stop != -1) + end_time = MIN (end_time, segment->stop); + start_time = + gst_segment_to_running_time (segment, GST_FORMAT_TIME, start_time); + end_time = + gst_segment_to_running_time (segment, GST_FORMAT_TIME, end_time); + g_assert (start_time != -1 && end_time != -1); + + /* Convert to the output segment rate */ + if (mix->segment.abs_rate != 1.0) { + start_time *= mix->segment.abs_rate; + end_time *= mix->segment.abs_rate; + } + + if (end_time >= output_start_time && start_time < output_end_time) { + GST_DEBUG_OBJECT (pad, + "Taking new buffer with start time %" GST_TIME_FORMAT, + GST_TIME_ARGS (start_time)); + gst_buffer_replace (&mixcol->buffer, buf); + mixcol->start_time = start_time; + mixcol->end_time = end_time; + + if (buf == mixcol->queued) { + gst_buffer_unref (buf); + gst_buffer_replace (&mixcol->queued, NULL); + } else { + gst_buffer_unref (buf); + buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); + gst_buffer_unref (buf); + } + eos = FALSE; + } else if (start_time >= output_end_time) { + GST_DEBUG_OBJECT (pad, "Keeping buffer until %" GST_TIME_FORMAT, + GST_TIME_ARGS (start_time)); + gst_buffer_unref (buf); + eos = FALSE; + } else { + GST_DEBUG_OBJECT (pad, "Too old buffer -- dropping"); + if (buf == mixcol->queued) { + gst_buffer_unref (buf); + gst_buffer_replace (&mixcol->queued, NULL); + } else { + gst_buffer_unref (buf); + buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); + gst_buffer_unref (buf); + } + + need_more_data = TRUE; + continue; + } + } else { + if (mixcol->end_time != -1) { + if (mixcol->end_time < output_start_time) { + gst_buffer_replace (&mixcol->buffer, NULL); + mixcol->start_time = mixcol->end_time = -1; + if (!GST_COLLECT_PADS2_STATE_IS_SET (mixcol, + GST_COLLECT_PADS2_STATE_EOS)) + need_more_data = TRUE; + } else { + eos = FALSE; + } + } + } + } + + if (need_more_data) + return 0; + if (eos) + return -1; + + return 1; +} + +static GstFlowReturn +gst_videomixer2_blend_buffers (GstVideoMixer2 * mix, + GstClockTime output_start_time, GstClockTime output_end_time, + GstBuffer ** outbuf) +{ + GSList *l; + GstFlowReturn ret; + guint outsize; + BlendFunction composite; + + outsize = gst_video_format_get_size (mix->format, mix->width, mix->height); + ret = gst_pad_alloc_buffer_and_set_caps (mix->srcpad, GST_BUFFER_OFFSET_NONE, + outsize, GST_PAD_CAPS (mix->srcpad), outbuf); + if (ret != GST_FLOW_OK) + return ret; + + GST_BUFFER_TIMESTAMP (*outbuf) = output_start_time; + GST_BUFFER_DURATION (*outbuf) = output_end_time - output_start_time; + + /* default to blending */ + composite = mix->blend; + switch (mix->background) { + case VIDEO_MIXER2_BACKGROUND_CHECKER: + mix->fill_checker (GST_BUFFER_DATA (*outbuf), mix->width, mix->height); + break; + case VIDEO_MIXER2_BACKGROUND_BLACK: + mix->fill_color (GST_BUFFER_DATA (*outbuf), mix->width, + mix->height, 16, 128, 128); + break; + case VIDEO_MIXER2_BACKGROUND_WHITE: + mix->fill_color (GST_BUFFER_DATA (*outbuf), mix->width, + mix->height, 240, 128, 128); + break; + case VIDEO_MIXER2_BACKGROUND_TRANSPARENT: + orc_memset (GST_BUFFER_DATA (*outbuf), 0, + gst_video_format_get_row_stride (mix->format, 0, + mix->width) * mix->height); + /* use overlay to keep background transparent */ + composite = mix->overlay; + break; + } + + for (l = mix->sinkpads; l; l = l->next) { + GstVideoMixer2Pad *pad = l->data; + GstVideoMixer2Collect *mixcol = pad->mixcol; + + if (mixcol->buffer != NULL) { + GstClockTime timestamp; + gint64 stream_time; + GstSegment *seg; + + seg = &mixcol->collect.segment; + + timestamp = GST_BUFFER_TIMESTAMP (mixcol->buffer); + + stream_time = + gst_segment_to_stream_time (seg, GST_FORMAT_TIME, timestamp); + + /* sync object properties on stream time */ + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (G_OBJECT (pad), stream_time); + + composite (GST_BUFFER_DATA (mixcol->buffer), + pad->xpos, pad->ypos, pad->width, pad->height, pad->alpha, + GST_BUFFER_DATA (*outbuf), mix->width, mix->height); + } + } + + return GST_FLOW_OK; +} + +/* Perform qos calculations before processing the next frame. Returns TRUE if + * the frame should be processed, FALSE if the frame can be dropped entirely */ +static gint64 +gst_videomixer2_do_qos (GstVideoMixer2 * mix, GstClockTime timestamp) +{ + GstClockTime qostime, earliest_time; + gdouble proportion; + gint64 jitter; + + /* no timestamp, can't do QoS => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { + GST_LOG_OBJECT (mix, "invalid timestamp, can't do QoS, process frame"); + return -1; + } + + /* get latest QoS observation values */ + gst_videomixer2_read_qos (mix, &proportion, &earliest_time); + + /* skip qos if we have no observation (yet) => process frame */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { + GST_LOG_OBJECT (mix, "no observation yet, process frame"); + return -1; + } + + /* qos is done on running time */ + qostime = + gst_segment_to_running_time (&mix->segment, GST_FORMAT_TIME, timestamp); + + /* see how our next timestamp relates to the latest qos timestamp */ + GST_LOG_OBJECT (mix, "qostime %" GST_TIME_FORMAT ", earliest %" + GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); + + jitter = GST_CLOCK_DIFF (qostime, earliest_time); + if (qostime != GST_CLOCK_TIME_NONE && jitter > 0) { + GST_DEBUG_OBJECT (mix, "we are late, drop frame"); + return jitter; + } + + GST_LOG_OBJECT (mix, "process frame"); + return jitter; +} + +static GstFlowReturn +gst_videomixer2_collected (GstCollectPads2 * pads, GstVideoMixer2 * mix) +{ + GstFlowReturn ret; + GstClockTime output_start_time, output_end_time; + GstBuffer *outbuf = NULL; + gint res; + gint64 jitter; + + /* If we're not negotiated yet... */ + if (mix->format == GST_VIDEO_FORMAT_UNKNOWN) + return GST_FLOW_NOT_NEGOTIATED; + + if (g_atomic_int_compare_and_exchange (&mix->flush_stop_pending, TRUE, FALSE)) { + GST_DEBUG_OBJECT (mix, "pending flush stop"); + gst_pad_push_event (mix->srcpad, gst_event_new_flush_stop ()); + } + + GST_VIDEO_MIXER2_LOCK (mix); + + if (mix->newseg_pending) { + GST_DEBUG_OBJECT (mix, "Sending NEWSEGMENT event"); + if (!gst_pad_push_event (mix->srcpad, gst_event_new_new_segment_full (FALSE, + mix->segment.rate, mix->segment.applied_rate, + mix->segment.format, mix->segment.start, mix->segment.stop, + mix->segment.time))) { + ret = GST_FLOW_ERROR; + goto done; + } + mix->newseg_pending = FALSE; + } + + if (mix->segment.last_stop == -1) + output_start_time = mix->segment.start; + else + output_start_time = mix->segment.last_stop; + + if (output_start_time >= mix->segment.stop) { + GST_DEBUG_OBJECT (mix, "Segment done"); + gst_pad_push_event (mix->srcpad, gst_event_new_eos ()); + ret = GST_FLOW_UNEXPECTED; + goto done; + } + + output_end_time = + mix->ts_offset + gst_util_uint64_scale (mix->nframes + 1, + GST_SECOND * mix->fps_d, mix->fps_n); + if (mix->segment.stop != -1) + output_end_time = MIN (output_end_time, mix->segment.stop); + + res = gst_videomixer2_fill_queues (mix, output_start_time, output_end_time); + + if (res == 0) { + GST_DEBUG_OBJECT (mix, "Need more data for decisions"); + ret = GST_FLOW_OK; + goto done; + } else if (res == -1) { + GST_DEBUG_OBJECT (mix, "All sinkpads are EOS -- forwarding"); + gst_pad_push_event (mix->srcpad, gst_event_new_eos ()); + ret = GST_FLOW_UNEXPECTED; + goto done; + } else if (res == -2) { + GST_ERROR_OBJECT (mix, "Error collecting buffers"); + ret = GST_FLOW_ERROR; + goto done; + } + + jitter = gst_videomixer2_do_qos (mix, output_start_time); + if (jitter <= 0) { + ret = + gst_videomixer2_blend_buffers (mix, output_start_time, + output_end_time, &outbuf); + mix->qos_processed++; + } else { + GstMessage *msg; + + mix->qos_dropped++; + + /* TODO: live */ + msg = + gst_message_new_qos (GST_OBJECT_CAST (mix), FALSE, + gst_segment_to_running_time (&mix->segment, GST_FORMAT_TIME, + output_start_time), gst_segment_to_stream_time (&mix->segment, + GST_FORMAT_TIME, output_start_time), output_start_time, + output_end_time - output_start_time); + gst_message_set_qos_values (msg, jitter, mix->proportion, 1000000); + gst_message_set_qos_stats (msg, GST_FORMAT_BUFFERS, mix->qos_processed, + mix->qos_dropped); + gst_element_post_message (GST_ELEMENT_CAST (mix), msg); + + ret = GST_FLOW_OK; + } + + gst_segment_set_last_stop (&mix->segment, GST_FORMAT_TIME, output_end_time); + mix->nframes++; + + GST_VIDEO_MIXER2_UNLOCK (mix); + if (outbuf) { + GST_LOG_OBJECT (mix, + "Pushing buffer with ts %" GST_TIME_FORMAT " and duration %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf))); + ret = gst_pad_push (mix->srcpad, outbuf); + } + GST_VIDEO_MIXER2_LOCK (mix); + +done: + GST_VIDEO_MIXER2_UNLOCK (mix); + + return ret; +} + +static GstCaps * +gst_videomixer2_src_getcaps (GstPad * pad) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); + GstCaps *caps; + GstStructure *s; + gint n; + + if (mix->format != GST_VIDEO_FORMAT_UNKNOWN) { + caps = gst_caps_copy (GST_PAD_CAPS (mix->srcpad)); + } else { + caps = gst_caps_copy (gst_pad_get_pad_template_caps (mix->srcpad)); + } + + n = gst_caps_get_size (caps) - 1; + for (; n >= 0; n--) { + s = gst_caps_get_structure (caps, n); + gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); + if (mix->fps_d != 0) { + gst_structure_set (s, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + } + } + + gst_object_unref (mix); + + return caps; +} + +static gboolean +gst_videomixer2_query_duration (GstVideoMixer2 * mix, GstQuery * query) +{ + gint64 max; + gboolean res; + GstFormat format; + GstIterator *it; + gboolean done; + + /* parse format */ + gst_query_parse_duration (query, &format, NULL); + + max = -1; + res = TRUE; + done = FALSE; + + /* Take maximum of all durations */ + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); + while (!done) { + GstIteratorResult ires; + gpointer item; + + ires = gst_iterator_next (it, &item); + switch (ires) { + case GST_ITERATOR_DONE: + done = TRUE; + break; + case GST_ITERATOR_OK: + { + GstPad *pad = GST_PAD_CAST (item); + gint64 duration; + + /* ask sink peer for duration */ + res &= gst_pad_query_peer_duration (pad, &format, &duration); + /* take max from all valid return values */ + if (res) { + /* valid unknown length, stop searching */ + if (duration == -1) { + max = duration; + done = TRUE; + } + /* else see if bigger than current max */ + else if (duration > max) + max = duration; + } + gst_object_unref (pad); + break; + } + case GST_ITERATOR_RESYNC: + max = -1; + res = TRUE; + gst_iterator_resync (it); + break; + default: + res = FALSE; + done = TRUE; + break; + } + } + gst_iterator_free (it); + + if (res) { + /* and store the max */ + GST_DEBUG_OBJECT (mix, "Total duration in format %s: %" + GST_TIME_FORMAT, gst_format_get_name (format), GST_TIME_ARGS (max)); + gst_query_set_duration (query, format, max); + } + + return res; +} + +static gboolean +gst_videomixer2_query_latency (GstVideoMixer2 * mix, GstQuery * query) +{ + GstClockTime min, max; + gboolean live; + gboolean res; + GstIterator *it; + gboolean done; + + res = TRUE; + done = FALSE; + live = FALSE; + min = 0; + max = GST_CLOCK_TIME_NONE; + + /* Take maximum of all latency values */ + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); + while (!done) { + GstIteratorResult ires; + gpointer item; + + ires = gst_iterator_next (it, &item); + switch (ires) { + case GST_ITERATOR_DONE: + done = TRUE; + break; + case GST_ITERATOR_OK: + { + GstPad *pad = GST_PAD_CAST (item); + GstQuery *peerquery; + GstClockTime min_cur, max_cur; + gboolean live_cur; + + peerquery = gst_query_new_latency (); + + /* Ask peer for latency */ + res &= gst_pad_peer_query (pad, peerquery); + + /* take max from all valid return values */ + if (res) { + gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur); + + if (min_cur > min) + min = min_cur; + + if (max_cur != GST_CLOCK_TIME_NONE && + ((max != GST_CLOCK_TIME_NONE && max_cur > max) || + (max == GST_CLOCK_TIME_NONE))) + max = max_cur; + + live = live || live_cur; + } + + gst_query_unref (peerquery); + gst_object_unref (pad); + break; + } + case GST_ITERATOR_RESYNC: + live = FALSE; + min = 0; + max = GST_CLOCK_TIME_NONE; + res = TRUE; + gst_iterator_resync (it); + break; + default: + res = FALSE; + done = TRUE; + break; + } + } + gst_iterator_free (it); + + if (res) { + /* store the results */ + GST_DEBUG_OBJECT (mix, "Calculated total latency: live %s, min %" + GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, + (live ? "yes" : "no"), GST_TIME_ARGS (min), GST_TIME_ARGS (max)); + gst_query_set_latency (query, live, min, max); + } + + return res; +} + +static gboolean +gst_videomixer2_src_query (GstPad * pad, GstQuery * query) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + + gst_query_parse_position (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME: + gst_query_set_position (query, format, + gst_segment_to_stream_time (&mix->segment, GST_FORMAT_TIME, + mix->segment.last_stop)); + res = TRUE; + break; + default: + break; + } + break; + } + case GST_QUERY_DURATION: + res = gst_videomixer2_query_duration (mix, query); + break; + case GST_QUERY_LATENCY: + res = gst_videomixer2_query_latency (mix, query); + break; + default: + /* FIXME, needs a custom query handler because we have multiple + * sinkpads */ + res = FALSE; + gst_query_unref (query); + break; + } + + gst_object_unref (mix); + return res; +} + +static gboolean +gst_videomixer2_src_event (GstPad * pad, GstEvent * event) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); + gboolean result; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS:{ + GstClockTimeDiff diff; + GstClockTime timestamp; + gdouble proportion; + + gst_event_parse_qos (event, &proportion, &diff, ×tamp); + + gst_videomixer2_update_qos (mix, proportion, diff, timestamp); + + result = gst_videomixer2_push_sink_event (mix, event); + break; + } + case GST_EVENT_SEEK: + { + gdouble rate; + GstFormat fmt; + GstSeekFlags flags; + GstSeekType start_type, stop_type; + gint64 start, stop; + GSList *l; + gdouble abs_rate; + + /* parse the seek parameters */ + gst_event_parse_seek (event, &rate, &fmt, &flags, &start_type, + &start, &stop_type, &stop); + + if (rate <= 0.0) { + GST_ERROR_OBJECT (mix, "Negative rates not supported yet"); + result = FALSE; + gst_event_unref (event); + break; + } + + GST_DEBUG_OBJECT (mix, "Handling SEEK event"); + + /* check if we are flushing */ + if (flags & GST_SEEK_FLAG_FLUSH) { + /* flushing seek, start flush downstream, the flush will be done + * when all pads received a FLUSH_STOP. */ + gst_pad_push_event (mix->srcpad, gst_event_new_flush_start ()); + + /* make sure we accept nothing anymore and return WRONG_STATE */ + gst_collect_pads2_set_flushing (mix->collect, TRUE); + } + + /* now wait for the collected to be finished and mark a new + * segment */ + GST_COLLECT_PADS2_STREAM_LOCK (mix->collect); + + abs_rate = ABS (rate); + + GST_VIDEO_MIXER2_LOCK (mix); + for (l = mix->sinkpads; l; l = l->next) { + GstVideoMixer2Pad *p = l->data; + + if (flags & GST_SEEK_FLAG_FLUSH) { + gst_buffer_replace (&p->mixcol->buffer, NULL); + p->mixcol->start_time = p->mixcol->end_time = -1; + continue; + } + + /* Convert to the output segment rate */ + if (mix->segment.abs_rate != abs_rate) { + if (mix->segment.abs_rate != 1.0 && p->mixcol->buffer) { + p->mixcol->start_time /= mix->segment.abs_rate; + p->mixcol->end_time /= mix->segment.abs_rate; + } + if (abs_rate != 1.0 && p->mixcol->buffer) { + p->mixcol->start_time *= abs_rate; + p->mixcol->end_time *= abs_rate; + } + } + } + GST_VIDEO_MIXER2_UNLOCK (mix); + + gst_segment_set_seek (&mix->segment, rate, fmt, flags, start_type, start, + stop_type, stop, NULL); + mix->segment.last_stop = -1; + mix->ts_offset = 0; + mix->nframes = 0; + mix->newseg_pending = TRUE; + + if (flags & GST_SEEK_FLAG_FLUSH) { + gst_collect_pads2_set_flushing (mix->collect, FALSE); + + /* we can't send FLUSH_STOP here since upstream could start pushing data + * after we unlock mix->collect. + * We set flush_stop_pending to TRUE instead and send FLUSH_STOP after + * forwarding the seek upstream or from gst_videomixer_collected, + * whichever happens first. + */ + mix->flush_stop_pending = TRUE; + } + + GST_COLLECT_PADS2_STREAM_UNLOCK (mix->collect); + + gst_videomixer2_reset_qos (mix); + + result = gst_videomixer2_push_sink_event (mix, event); + + if (g_atomic_int_compare_and_exchange (&mix->flush_stop_pending, TRUE, + FALSE)) { + GST_DEBUG_OBJECT (mix, "pending flush stop"); + gst_pad_push_event (mix->srcpad, gst_event_new_flush_stop ()); + } + + break; + } + case GST_EVENT_NAVIGATION: + /* navigation is rather pointless. */ + result = FALSE; + gst_event_unref (event); + break; + default: + /* just forward the rest for now */ + result = gst_videomixer2_push_sink_event (mix, event); + break; + } + gst_object_unref (mix); + + return result; +} + +static gboolean +gst_videomixer2_src_setcaps (GstPad * pad, GstCaps * caps) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent_element (pad)); + gboolean ret = FALSE; + GstVideoFormat fmt; + gint width, height; + gint fps_n, fps_d; + gint par_n, par_d; + + GST_INFO_OBJECT (pad, "set src caps: %" GST_PTR_FORMAT, caps); + + mix->blend = NULL; + mix->overlay = NULL; + mix->fill_checker = NULL; + mix->fill_color = NULL; + + if (!gst_video_format_parse_caps (caps, &fmt, &width, &height) || + !gst_video_parse_caps_framerate (caps, &fps_n, &fps_d) || + !gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d)) + goto done; + + GST_VIDEO_MIXER2_LOCK (mix); + + if (mix->fps_n != fps_n || mix->fps_d != fps_d) { + if (mix->segment.last_stop != -1) { + mix->ts_offset = mix->segment.last_stop - mix->segment.start; + mix->nframes = 0; + } + gst_videomixer2_reset_qos (mix); + } + + mix->format = fmt; + mix->width = width; + mix->height = height; + mix->fps_n = fps_n; + mix->fps_d = fps_d; + mix->par_n = par_n; + mix->par_d = par_d; + + switch (mix->format) { + case GST_VIDEO_FORMAT_AYUV: + mix->blend = gst_video_mixer_blend_ayuv; + mix->overlay = gst_video_mixer_overlay_ayuv; + mix->fill_checker = gst_video_mixer_fill_checker_ayuv; + mix->fill_color = gst_video_mixer_fill_color_ayuv; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_ARGB: + mix->blend = gst_video_mixer_blend_argb; + mix->overlay = gst_video_mixer_overlay_argb; + mix->fill_checker = gst_video_mixer_fill_checker_argb; + mix->fill_color = gst_video_mixer_fill_color_argb; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_BGRA: + mix->blend = gst_video_mixer_blend_bgra; + mix->overlay = gst_video_mixer_overlay_bgra; + mix->fill_checker = gst_video_mixer_fill_checker_bgra; + mix->fill_color = gst_video_mixer_fill_color_bgra; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_ABGR: + mix->blend = gst_video_mixer_blend_abgr; + mix->overlay = gst_video_mixer_overlay_abgr; + mix->fill_checker = gst_video_mixer_fill_checker_abgr; + mix->fill_color = gst_video_mixer_fill_color_abgr; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_RGBA: + mix->blend = gst_video_mixer_blend_rgba; + mix->overlay = gst_video_mixer_overlay_rgba; + mix->fill_checker = gst_video_mixer_fill_checker_rgba; + mix->fill_color = gst_video_mixer_fill_color_rgba; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_Y444: + mix->blend = gst_video_mixer_blend_y444; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_y444; + mix->fill_color = gst_video_mixer_fill_color_y444; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_Y42B: + mix->blend = gst_video_mixer_blend_y42b; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_y42b; + mix->fill_color = gst_video_mixer_fill_color_y42b; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_YUY2: + mix->blend = gst_video_mixer_blend_yuy2; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_yuy2; + mix->fill_color = gst_video_mixer_fill_color_yuy2; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_UYVY: + mix->blend = gst_video_mixer_blend_uyvy; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_uyvy; + mix->fill_color = gst_video_mixer_fill_color_uyvy; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_YVYU: + mix->blend = gst_video_mixer_blend_yvyu; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_yvyu; + mix->fill_color = gst_video_mixer_fill_color_yvyu; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_I420: + mix->blend = gst_video_mixer_blend_i420; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_i420; + mix->fill_color = gst_video_mixer_fill_color_i420; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_YV12: + mix->blend = gst_video_mixer_blend_yv12; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_yv12; + mix->fill_color = gst_video_mixer_fill_color_yv12; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_Y41B: + mix->blend = gst_video_mixer_blend_y41b; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_y41b; + mix->fill_color = gst_video_mixer_fill_color_y41b; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_RGB: + mix->blend = gst_video_mixer_blend_rgb; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_rgb; + mix->fill_color = gst_video_mixer_fill_color_rgb; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_BGR: + mix->blend = gst_video_mixer_blend_bgr; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_bgr; + mix->fill_color = gst_video_mixer_fill_color_bgr; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_xRGB: + mix->blend = gst_video_mixer_blend_xrgb; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_xrgb; + mix->fill_color = gst_video_mixer_fill_color_xrgb; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_xBGR: + mix->blend = gst_video_mixer_blend_xbgr; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_xbgr; + mix->fill_color = gst_video_mixer_fill_color_xbgr; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_RGBx: + mix->blend = gst_video_mixer_blend_rgbx; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_rgbx; + mix->fill_color = gst_video_mixer_fill_color_rgbx; + ret = TRUE; + break; + case GST_VIDEO_FORMAT_BGRx: + mix->blend = gst_video_mixer_blend_bgrx; + mix->overlay = mix->blend; + mix->fill_checker = gst_video_mixer_fill_checker_bgrx; + mix->fill_color = gst_video_mixer_fill_color_bgrx; + ret = TRUE; + break; + default: + break; + } + GST_VIDEO_MIXER2_UNLOCK (mix); + +done: + gst_object_unref (mix); + + return ret; +} + +static GstFlowReturn +gst_videomixer2_sink_clip (GstCollectPads2 * pads, + GstCollectData2 * data, GstBuffer * buf, GstBuffer ** outbuf, + GstVideoMixer2 * mix) +{ + GstVideoMixer2Pad *pad = GST_VIDEO_MIXER2_PAD (data->pad); + GstVideoMixer2Collect *mixcol = pad->mixcol; + GstClockTime start_time, end_time; + + start_time = GST_BUFFER_TIMESTAMP (buf); + if (start_time == -1) { + GST_ERROR_OBJECT (pad, "Timestamped buffers required!"); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } + + end_time = GST_BUFFER_DURATION (buf); + if (end_time == -1) + end_time = gst_util_uint64_scale_int (GST_SECOND, pad->fps_d, pad->fps_n); + if (end_time == -1) { + *outbuf = buf; + return GST_FLOW_OK; + } + + start_time = MAX (start_time, mixcol->collect.segment.start); + start_time = + gst_segment_to_running_time (&mixcol->collect.segment, + GST_FORMAT_TIME, start_time); + + end_time += GST_BUFFER_TIMESTAMP (buf); + if (mixcol->collect.segment.stop != -1) + end_time = MIN (end_time, mixcol->collect.segment.stop); + end_time = + gst_segment_to_running_time (&mixcol->collect.segment, + GST_FORMAT_TIME, end_time); + + /* Convert to the output segment rate */ + if (mix->segment.abs_rate != 1.0) { + start_time *= mix->segment.abs_rate; + end_time *= mix->segment.abs_rate; + } + + if (mixcol->buffer != NULL && end_time < mixcol->end_time) { + gst_buffer_unref (buf); + *outbuf = NULL; + return GST_FLOW_OK; + } + + *outbuf = buf; + return GST_FLOW_OK; +} + +static gboolean +gst_videomixer2_sink_event (GstCollectPads2 * pads, GstCollectData2 * cdata, + GstEvent * event, GstVideoMixer2 * mix) +{ + GstVideoMixer2Pad *pad = GST_VIDEO_MIXER2_PAD (cdata->pad); + gboolean ret = TRUE; + + GST_DEBUG_OBJECT (pad, "Got %s event on pad %s:%s", + GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (pad)); + + /* return FALSE => event will be forwarded */ + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT:{ + GstFormat fmt; + gst_event_parse_new_segment (event, NULL, NULL, &fmt, NULL, NULL, NULL); + + g_assert (fmt == GST_FORMAT_TIME); + /* eat NEWSEGMENT events, collectpads2 unrefs the event */ + ret = FALSE; + break; + } + case GST_EVENT_FLUSH_STOP: + mix->newseg_pending = TRUE; + mix->flush_stop_pending = FALSE; + gst_videomixer2_reset_qos (mix); + gst_buffer_replace (&pad->mixcol->buffer, NULL); + pad->mixcol->start_time = -1; + pad->mixcol->end_time = -1; + + gst_segment_init (&mix->segment, GST_FORMAT_TIME); + mix->segment.last_stop = -1; + mix->ts_offset = 0; + mix->nframes = 0; + + gst_pad_push_event (mix->srcpad, event); + break; + default: + gst_pad_push_event (mix->srcpad, event); + break; + } + + return ret; +} + +static gboolean +forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) +{ + gst_event_ref (event); + GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event)); + if (!gst_pad_push_event (pad, event)) { + g_value_set_boolean (ret, FALSE); + GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", + event, GST_EVENT_TYPE_NAME (event)); + } else { + GST_LOG_OBJECT (pad, "Sent event %p (%s).", + event, GST_EVENT_TYPE_NAME (event)); + } + gst_object_unref (pad); + return TRUE; +} + +static gboolean +gst_videomixer2_push_sink_event (GstVideoMixer2 * mix, GstEvent * event) +{ + GstIterator *it; + GValue vret = { 0 }; + + GST_LOG_OBJECT (mix, "Forwarding event %p (%s)", event, + GST_EVENT_TYPE_NAME (event)); + + g_value_init (&vret, G_TYPE_BOOLEAN); + g_value_set_boolean (&vret, TRUE); + it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); + gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func, &vret, + event); + gst_iterator_free (it); + gst_event_unref (event); + + return g_value_get_boolean (&vret); +} + +/* GstElement vmethods */ +static GstStateChangeReturn +gst_videomixer2_change_state (GstElement * element, GstStateChange transition) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + GST_LOG_OBJECT (mix, "starting collectpads"); + gst_collect_pads2_start (mix->collect); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_LOG_OBJECT (mix, "stopping collectpads"); + gst_collect_pads2_stop (mix->collect); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_videomixer2_reset (mix); + break; + default: + break; + } + + return ret; +} + +static GstPad * +gst_videomixer2_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) +{ + GstVideoMixer2 *mix; + GstVideoMixer2Pad *mixpad; + GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); + + mix = GST_VIDEO_MIXER2 (element); + + if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) { + gint serial = 0; + gchar *name = NULL; + GstVideoMixer2Collect *mixcol = NULL; + + GST_VIDEO_MIXER2_LOCK (mix); + if (req_name == NULL || strlen (req_name) < 6 + || !g_str_has_prefix (req_name, "sink_")) { + /* no name given when requesting the pad, use next available int */ + serial = mix->next_sinkpad++; + } else { + /* parse serial number from requested padname */ + serial = g_ascii_strtoull (&req_name[5], NULL, 10); + if (serial >= mix->next_sinkpad) + mix->next_sinkpad = serial + 1; + } + /* create new pad with the name */ + name = g_strdup_printf ("sink_%d", serial); + mixpad = g_object_new (GST_TYPE_VIDEO_MIXER2_PAD, "name", name, "direction", + templ->direction, "template", templ, NULL); + g_free (name); + + mixpad->zorder = mix->numpads; + mixpad->xpos = DEFAULT_PAD_XPOS; + mixpad->ypos = DEFAULT_PAD_YPOS; + mixpad->alpha = DEFAULT_PAD_ALPHA; + + mixcol = (GstVideoMixer2Collect *) + gst_collect_pads2_add_pad_full (mix->collect, GST_PAD (mixpad), + sizeof (GstVideoMixer2Collect), + (GstCollectData2DestroyNotify) gst_videomixer2_collect_free, TRUE); + + /* Keep track of each other */ + mixcol->mixpad = mixpad; + mixpad->mixcol = mixcol; + + mixcol->start_time = -1; + mixcol->end_time = -1; + + /* Keep an internal list of mixpads for zordering */ + mix->sinkpads = g_slist_append (mix->sinkpads, mixpad); + mix->numpads++; + GST_VIDEO_MIXER2_UNLOCK (mix); + } else { + return NULL; + } + + GST_DEBUG_OBJECT (element, "Adding pad %s", GST_PAD_NAME (mixpad)); + + /* add the pad to the element */ + gst_element_add_pad (element, GST_PAD (mixpad)); + gst_child_proxy_child_added (GST_OBJECT (mix), GST_OBJECT (mixpad)); + + return GST_PAD (mixpad); +} + +static void +gst_videomixer2_release_pad (GstElement * element, GstPad * pad) +{ + GstVideoMixer2 *mix = NULL; + GstVideoMixer2Pad *mixpad; + gboolean update_caps; + + mix = GST_VIDEO_MIXER2 (element); + + GST_VIDEO_MIXER2_LOCK (mix); + if (G_UNLIKELY (g_slist_find (mix->sinkpads, pad) == NULL)) { + g_warning ("Unknown pad %s", GST_PAD_NAME (pad)); + goto error; + } + + mixpad = GST_VIDEO_MIXER2_PAD (pad); + + mix->sinkpads = g_slist_remove (mix->sinkpads, pad); + gst_child_proxy_child_removed (GST_OBJECT (mix), GST_OBJECT (mixpad)); + mix->numpads--; + + update_caps = mix->format != GST_VIDEO_FORMAT_UNKNOWN; + GST_VIDEO_MIXER2_UNLOCK (mix); + + gst_collect_pads2_remove_pad (mix->collect, pad); + + if (update_caps) + gst_videomixer2_update_src_caps (mix); + + gst_element_remove_pad (element, pad); + return; +error: + GST_VIDEO_MIXER2_UNLOCK (mix); +} + +/* GObject vmethods */ +static void +gst_videomixer2_finalize (GObject * o) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (o); + + gst_object_unref (mix->collect); + g_mutex_free (mix->lock); + + G_OBJECT_CLASS (parent_class)->finalize (o); +} + +static void +gst_videomixer2_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (object); + + switch (prop_id) { + case PROP_BACKGROUND: + g_value_set_enum (value, mix->background); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_videomixer2_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (object); + + switch (prop_id) { + case PROP_BACKGROUND: + mix->background = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstChildProxy implementation */ +static GstObject * +gst_videomixer2_child_proxy_get_child_by_index (GstChildProxy * child_proxy, + guint index) +{ + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (child_proxy); + GstObject *obj; + + GST_VIDEO_MIXER2_LOCK (mix); + if ((obj = g_slist_nth_data (mix->sinkpads, index))) + gst_object_ref (obj); + GST_VIDEO_MIXER2_UNLOCK (mix); + return obj; +} + +static guint +gst_videomixer2_child_proxy_get_children_count (GstChildProxy * child_proxy) +{ + guint count = 0; + GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (child_proxy); + + GST_VIDEO_MIXER2_LOCK (mix); + count = mix->numpads; + GST_VIDEO_MIXER2_UNLOCK (mix); + GST_INFO_OBJECT (mix, "Children Count: %d", count); + return count; +} + +static void +gst_videomixer2_child_proxy_init (gpointer g_iface, gpointer iface_data) +{ + GstChildProxyInterface *iface = g_iface; + + GST_INFO ("intializing child proxy interface"); + iface->get_child_by_index = gst_videomixer2_child_proxy_get_child_by_index; + iface->get_children_count = gst_videomixer2_child_proxy_get_children_count; +} + +/* GObject boilerplate */ +static void +gst_videomixer2_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "Video mixer 2", + "Filter/Editor/Video", + "Mix multiple video streams", "Wim Taymans , " + "Sebastian Dröge "); +} + +static void +gst_videomixer2_class_init (GstVideoMixer2Class * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_videomixer2_finalize; + + gobject_class->get_property = gst_videomixer2_get_property; + gobject_class->set_property = gst_videomixer2_set_property; + + g_object_class_install_property (gobject_class, PROP_BACKGROUND, + g_param_spec_enum ("background", "Background", "Background type", + GST_TYPE_VIDEO_MIXER2_BACKGROUND, + DEFAULT_BACKGROUND, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_videomixer2_request_new_pad); + gstelement_class->release_pad = + GST_DEBUG_FUNCPTR (gst_videomixer2_release_pad); + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_videomixer2_change_state); + + /* Register the pad class */ + g_type_class_ref (GST_TYPE_VIDEO_MIXER2_PAD); +} + +static void +gst_videomixer2_init (GstVideoMixer2 * mix, GstVideoMixer2Class * g_class) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (mix); + + mix->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); + gst_pad_set_getcaps_function (GST_PAD (mix->srcpad), + GST_DEBUG_FUNCPTR (gst_videomixer2_src_getcaps)); + gst_pad_set_setcaps_function (GST_PAD (mix->srcpad), + GST_DEBUG_FUNCPTR (gst_videomixer2_src_setcaps)); + gst_pad_set_query_function (GST_PAD (mix->srcpad), + GST_DEBUG_FUNCPTR (gst_videomixer2_src_query)); + gst_pad_set_event_function (GST_PAD (mix->srcpad), + GST_DEBUG_FUNCPTR (gst_videomixer2_src_event)); + gst_element_add_pad (GST_ELEMENT (mix), mix->srcpad); + + mix->collect = gst_collect_pads2_new (); + mix->background = DEFAULT_BACKGROUND; + + gst_collect_pads2_set_function (mix->collect, + (GstCollectPads2Function) GST_DEBUG_FUNCPTR (gst_videomixer2_collected), + mix); + gst_collect_pads2_set_event_function (mix->collect, + (GstCollectPads2EventFunction) gst_videomixer2_sink_event, mix); + gst_collect_pads2_set_clip_function (mix->collect, + (GstCollectPads2ClipFunction) gst_videomixer2_sink_clip, mix); + + mix->lock = g_mutex_new (); + /* initialize variables */ + gst_videomixer2_reset (mix); +} + +/* Element registration */ +gboolean +gst_videomixer2_register (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_videomixer2_debug, "videomixer2", 0, + "video mixer 2"); + + return gst_element_register (plugin, "videomixer2", GST_RANK_SECONDARY, + GST_TYPE_VIDEO_MIXER2); +} diff --git a/gst/videomixer/videomixer2.h b/gst/videomixer/videomixer2.h new file mode 100644 index 0000000..3c73f4d --- /dev/null +++ b/gst/videomixer/videomixer2.h @@ -0,0 +1,125 @@ +/* Generic video mixer plugin + * Copyright (C) 2008 Wim Taymans + * Copyright (C) 2010 Sebastian Dröge + * + * 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_VIDEO_MIXER2_H__ +#define __GST_VIDEO_MIXER2_H__ + +#include +#include + +#include "blend.h" +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEO_MIXER2 (gst_videomixer2_get_type()) +#define GST_VIDEO_MIXER2(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_MIXER2, GstVideoMixer2)) +#define GST_VIDEO_MIXER2_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_MIXER2, GstVideoMixer2Class)) +#define GST_IS_VIDEO_MIXER2(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_MIXER2)) +#define GST_IS_VIDEO_MIXER2_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_MIXER2)) + +typedef struct _GstVideoMixer2 GstVideoMixer2; +typedef struct _GstVideoMixer2Class GstVideoMixer2Class; + +/** + * GstVideoMixer2Background: + * @VIDEO_MIXER2_BACKGROUND_CHECKER: checker pattern background + * @VIDEO_MIXER2_BACKGROUND_BLACK: solid color black background + * @VIDEO_MIXER2_BACKGROUND_WHITE: solid color white background + * @VIDEO_MIXER2_BACKGROUND_TRANSPARENT: background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing. + * + * The different backgrounds videomixer can blend over. + */ +typedef enum +{ + VIDEO_MIXER2_BACKGROUND_CHECKER, + VIDEO_MIXER2_BACKGROUND_BLACK, + VIDEO_MIXER2_BACKGROUND_WHITE, + VIDEO_MIXER2_BACKGROUND_TRANSPARENT, +} +GstVideoMixer2Background; + +/** + * GstVideoMixer2: + * + * The opaque #GstVideoMixer2 structure. + */ +struct _GstVideoMixer2 +{ + GstElement element; + + /* < private > */ + + /* pad */ + GstPad *srcpad; + + /* Lock to prevent the state to change while blending */ + GMutex *lock; + /* Sink pads using Collect Pads 2*/ + GstCollectPads2 *collect; + + /* sinkpads, a GSList of GstVideoMixer2Pads */ + GSList *sinkpads; + gint numpads; + /* Next available sinkpad index */ + gint next_sinkpad; + + /* Output caps */ + GstVideoFormat format; + gint width, height; + gint fps_n; + gint fps_d; + gint par_n; + gint par_d; + + gboolean newseg_pending; + gboolean flush_stop_pending; + + GstVideoMixer2Background background; + + /* Current downstream segment */ + GstSegment segment; + GstClockTime ts_offset; + guint64 nframes; + + /* QoS stuff */ + gdouble proportion; + GstClockTime earliest_time; + guint64 qos_processed, qos_dropped; + + BlendFunction blend, overlay; + FillCheckerFunction fill_checker; + FillColorFunction fill_color; +}; + +struct _GstVideoMixer2Class +{ + GstElementClass parent_class; +}; + +GType gst_videomixer2_get_type (void); +gboolean gst_videomixer2_register (GstPlugin * plugin); + +G_END_DECLS +#endif /* __GST_VIDEO_MIXER2_H__ */ diff --git a/gst/videomixer/videomixer2pad.h b/gst/videomixer/videomixer2pad.h new file mode 100644 index 0000000..a2412da --- /dev/null +++ b/gst/videomixer/videomixer2pad.h @@ -0,0 +1,77 @@ +/* Generic video mixer plugin + * Copyright (C) 2008 Wim Taymans + * Copyright (C) 2010 Sebastian Dröge + * + * 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_VIDEO_MIXER2_PAD_H__ +#define __GST_VIDEO_MIXER2_PAD_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEO_MIXER2_PAD (gst_videomixer2_pad_get_type()) +#define GST_VIDEO_MIXER2_PAD(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_MIXER2_PAD, GstVideoMixer2Pad)) +#define GST_VIDEO_MIXER2_PAD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_MIXER_PAD, GstVideoMixer2PadClass)) +#define GST_IS_VIDEO_MIXER2_PAD(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_MIXER2_PAD)) +#define GST_IS_VIDEO_MIXER2_PAD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_MIXER2_PAD)) + +typedef struct _GstVideoMixer2Pad GstVideoMixer2Pad; +typedef struct _GstVideoMixer2PadClass GstVideoMixer2PadClass; +typedef struct _GstVideoMixer2Collect GstVideoMixer2Collect; + +/** + * GstVideoMixer2Pad: + * + * The opaque #GstVideoMixer2Pad structure. + */ +struct _GstVideoMixer2Pad +{ + GstPad parent; + + /* < private > */ + + /* caps */ + gint width, height; + gint fps_n; + gint fps_d; + + /* properties */ + gint xpos, ypos; + guint zorder; + gdouble alpha; + + GstVideoMixer2Collect *mixcol; +}; + +struct _GstVideoMixer2PadClass +{ + GstPadClass parent_class; +}; + +GType gst_videomixer2_pad_get_type (void); + +G_END_DECLS +#endif /* __GST_VIDEO_MIXER2_PAD_H__ */ diff --git a/gst/videomixer/videomixerpad.h b/gst/videomixer/videomixerpad.h new file mode 100644 index 0000000..03835d6 --- /dev/null +++ b/gst/videomixer/videomixerpad.h @@ -0,0 +1,78 @@ +/* Video mixer pad + * Copyright (C) 2008 Wim Taymans + * + * 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_VIDEO_MIXER_PAD_H__ +#define __GST_VIDEO_MIXER_PAD_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEO_MIXER_PAD (gst_videomixer_pad_get_type()) +#define GST_VIDEO_MIXER_PAD(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_MIXER_PAD, GstVideoMixerPad)) +#define GST_VIDEO_MIXER_PAD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_MIXER_PAD, GstVideoMixerPadiClass)) +#define GST_IS_VIDEO_MIXER_PAD(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_MIXER_PAD)) +#define GST_IS_VIDEO_MIXER_PAD_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_MIXER_PAD)) + +typedef struct _GstVideoMixerPad GstVideoMixerPad; +typedef struct _GstVideoMixerPadClass GstVideoMixerPadClass; +typedef struct _GstVideoMixerCollect GstVideoMixerCollect; + +struct _GstVideoMixerCollect +{ + GstCollectData collect; /* we extend the CollectData */ + + GstBuffer *buffer; /* the queued buffer for this pad */ + + GstVideoMixerPad *mixpad; +}; + +/* all information needed for one video stream */ +struct _GstVideoMixerPad +{ + GstPad parent; /* subclass the pad */ + + gint64 queued; + + guint in_width, in_height; + gint fps_n; + gint fps_d; + gint par_n; + gint par_d; + + gint xpos, ypos; + guint zorder; + gint blend_mode; + gdouble alpha; + + GstVideoMixerCollect *mixcol; +}; + +struct _GstVideoMixerPadClass +{ + GstPadClass parent_class; +}; + +G_END_DECLS +#endif /* __GST_VIDEO_MIXER_PAD_H__ */ diff --git a/gst/wavenc/Makefile.am b/gst/wavenc/Makefile.am new file mode 100644 index 0000000..a213b00 --- /dev/null +++ b/gst/wavenc/Makefile.am @@ -0,0 +1,28 @@ +plugin_LTLIBRARIES = libgstwavenc.la + +libgstwavenc_la_SOURCES = gstwavenc.c +libgstwavenc_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CFLAGS) +libgstwavenc_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + $(GST_LIBS) +libgstwavenc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstwavenc_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstwavenc.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstwavenc -:SHARED libgstwavenc \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstwavenc_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstwavenc_la_CFLAGS) \ + -:LDFLAGS $(libgstwavenc_la_LDFLAGS) \ + $(libgstwavenc_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/wavenc/Makefile.in b/gst/wavenc/Makefile.in new file mode 100644 index 0000000..66b6a4d --- /dev/null +++ b/gst/wavenc/Makefile.in @@ -0,0 +1,826 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/wavenc +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstwavenc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstwavenc_la_OBJECTS = libgstwavenc_la-gstwavenc.lo +libgstwavenc_la_OBJECTS = $(am_libgstwavenc_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstwavenc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstwavenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstwavenc_la_CFLAGS) $(CFLAGS) \ + $(libgstwavenc_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstwavenc_la_SOURCES) +DIST_SOURCES = $(libgstwavenc_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstwavenc.la +libgstwavenc_la_SOURCES = gstwavenc.c +libgstwavenc_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CFLAGS) + +libgstwavenc_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + $(GST_LIBS) + +libgstwavenc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstwavenc_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstwavenc.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/wavenc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/wavenc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstwavenc.la: $(libgstwavenc_la_OBJECTS) $(libgstwavenc_la_DEPENDENCIES) $(EXTRA_libgstwavenc_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstwavenc_la_LINK) -rpath $(plugindir) $(libgstwavenc_la_OBJECTS) $(libgstwavenc_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavenc_la-gstwavenc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstwavenc_la-gstwavenc.lo: gstwavenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavenc_la_CFLAGS) $(CFLAGS) -MT libgstwavenc_la-gstwavenc.lo -MD -MP -MF $(DEPDIR)/libgstwavenc_la-gstwavenc.Tpo -c -o libgstwavenc_la-gstwavenc.lo `test -f 'gstwavenc.c' || echo '$(srcdir)/'`gstwavenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavenc_la-gstwavenc.Tpo $(DEPDIR)/libgstwavenc_la-gstwavenc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavenc.c' object='libgstwavenc_la-gstwavenc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavenc_la_CFLAGS) $(CFLAGS) -c -o libgstwavenc_la-gstwavenc.lo `test -f 'gstwavenc.c' || echo '$(srcdir)/'`gstwavenc.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstwavenc -:SHARED libgstwavenc \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstwavenc_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstwavenc_la_CFLAGS) \ + -:LDFLAGS $(libgstwavenc_la_LDFLAGS) \ + $(libgstwavenc_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/wavenc/gstwavenc.c b/gst/wavenc/gstwavenc.c new file mode 100644 index 0000000..e6b06d9 --- /dev/null +++ b/gst/wavenc/gstwavenc.c @@ -0,0 +1,747 @@ +/* -*- mOde: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ +/* GStreamer .wav encoder + * Copyright (C) <2002> Iain Holmes + * Copyright (C) <2006> Tim-Philipp Müller + * + * 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-wavenc + * + * Format a audio stream into the wav format. + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "gstwavenc.h" + +#include + +GST_DEBUG_CATEGORY_STATIC (wavenc_debug); +#define GST_CAT_DEFAULT wavenc_debug + +struct riff_struct +{ + guint8 id[4]; /* RIFF */ + guint32 len; + guint8 wav_id[4]; /* WAVE */ +}; + +struct chunk_struct +{ + guint8 id[4]; + guint32 len; +}; + +struct common_struct +{ + guint16 wFormatTag; + guint16 wChannels; + guint32 dwSamplesPerSec; + guint32 dwAvgBytesPerSec; + guint16 wBlockAlign; + guint16 wBitsPerSample; /* Only for PCM */ +}; + +struct wave_header +{ + struct riff_struct riff; + struct chunk_struct format; + struct common_struct common; + struct chunk_struct data; +}; + +/* FIXME: mono doesn't produce correct files it seems, at least mplayer xruns */ +/* Max. of two channels, more channels need WAVFORMATEX with + * channel layout, which we do not support yet */ +#define SINK_CAPS \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 2 ], " \ + "endianness = (int) LITTLE_ENDIAN, " \ + "width = (int) 32, " \ + "depth = (int) 32, " \ + "signed = (boolean) true" \ + "; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 2 ], " \ + "endianness = (int) LITTLE_ENDIAN, " \ + "width = (int) 24, " \ + "depth = (int) 24, " \ + "signed = (boolean) true" \ + "; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 2 ], " \ + "endianness = (int) LITTLE_ENDIAN, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (boolean) true" \ + "; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 2 ], " \ + "width = (int) 8, " \ + "depth = (int) 8, " \ + "signed = (boolean) false" \ + "; " \ + "audio/x-raw-float, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 2 ], " \ + "endianness = (int) LITTLE_ENDIAN, " \ + "width = (int) { 32, 64 }; " \ + "audio/x-alaw, " \ + "rate = (int) [ 8000, 192000 ], " \ + "channels = (int) [ 1, 2 ], " \ + "width = (int) 8, " \ + "depth = (int) 8, " \ + "signed = (boolean) false; " \ + "audio/x-mulaw, " \ + "rate = (int) [ 8000, 192000 ], " \ + "channels = (int) [ 1, 2 ], " \ + "width = (int) 8, " \ + "depth = (int) 8, " \ + "signed = (boolean) false" + + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS) + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wav") + ); + +GST_BOILERPLATE (GstWavEnc, gst_wavenc, GstElement, GST_TYPE_ELEMENT); + +static GstFlowReturn gst_wavenc_chain (GstPad * pad, GstBuffer * buf); +static gboolean gst_wavenc_event (GstPad * pad, GstEvent * event); +static GstStateChangeReturn gst_wavenc_change_state (GstElement * element, + GstStateChange transition); +static gboolean gst_wavenc_sink_setcaps (GstPad * pad, GstCaps * caps); + +static void +gst_wavenc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "WAV audio muxer", + "Codec/Muxer/Audio", + "Encode raw audio into WAV", "Iain Holmes "); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + GST_DEBUG_CATEGORY_INIT (wavenc_debug, "wavenc", 0, "WAV encoder element"); +} + +static void +gst_wavenc_class_init (GstWavEncClass * klass) +{ + GstElementClass *element_class; + + element_class = (GstElementClass *) klass; + + element_class->change_state = GST_DEBUG_FUNCPTR (gst_wavenc_change_state); +} + +static void +gst_wavenc_init (GstWavEnc * wavenc, GstWavEncClass * klass) +{ + wavenc->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); + gst_pad_set_chain_function (wavenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavenc_chain)); + gst_pad_set_event_function (wavenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavenc_event)); + gst_pad_set_setcaps_function (wavenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavenc_sink_setcaps)); + gst_pad_use_fixed_caps (wavenc->sinkpad); + gst_element_add_pad (GST_ELEMENT (wavenc), wavenc->sinkpad); + + wavenc->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); + gst_pad_use_fixed_caps (wavenc->srcpad); + gst_pad_set_caps (wavenc->srcpad, + gst_static_pad_template_get_caps (&src_factory)); + gst_element_add_pad (GST_ELEMENT (wavenc), wavenc->srcpad); +} + +#define WAV_HEADER_LEN 44 + +static GstBuffer * +gst_wavenc_create_header_buf (GstWavEnc * wavenc, guint audio_data_size) +{ + struct wave_header wave; + GstBuffer *buf; + guint8 *header; + + buf = gst_buffer_new_and_alloc (WAV_HEADER_LEN); + header = GST_BUFFER_DATA (buf); + memset (header, 0, WAV_HEADER_LEN); + + wave.common.wChannels = wavenc->channels; + wave.common.wBitsPerSample = wavenc->width; + wave.common.dwSamplesPerSec = wavenc->rate; + + /* Fill out our wav-header with some information */ + memcpy (wave.riff.id, "RIFF", 4); + wave.riff.len = audio_data_size + WAV_HEADER_LEN - 8; + memcpy (wave.riff.wav_id, "WAVE", 4); + + memcpy (wave.format.id, "fmt ", 4); + wave.format.len = 16; + + wave.common.wFormatTag = wavenc->format; + wave.common.wBlockAlign = (wavenc->width / 8) * wave.common.wChannels; + wave.common.dwAvgBytesPerSec = + wave.common.wBlockAlign * wave.common.dwSamplesPerSec; + + memcpy (wave.data.id, "data", 4); + wave.data.len = audio_data_size; + + memcpy (header, (char *) wave.riff.id, 4); + GST_WRITE_UINT32_LE (header + 4, wave.riff.len); + memcpy (header + 8, (char *) wave.riff.wav_id, 4); + memcpy (header + 12, (char *) wave.format.id, 4); + GST_WRITE_UINT32_LE (header + 16, wave.format.len); + GST_WRITE_UINT16_LE (header + 20, wave.common.wFormatTag); + GST_WRITE_UINT16_LE (header + 22, wave.common.wChannels); + GST_WRITE_UINT32_LE (header + 24, wave.common.dwSamplesPerSec); + GST_WRITE_UINT32_LE (header + 28, wave.common.dwAvgBytesPerSec); + GST_WRITE_UINT16_LE (header + 32, wave.common.wBlockAlign); + GST_WRITE_UINT16_LE (header + 34, wave.common.wBitsPerSample); + memcpy (header + 36, (char *) wave.data.id, 4); + GST_WRITE_UINT32_LE (header + 40, wave.data.len); + + gst_buffer_set_caps (buf, GST_PAD_CAPS (wavenc->srcpad)); + + return buf; +} + +static GstFlowReturn +gst_wavenc_push_header (GstWavEnc * wavenc, guint audio_data_size) +{ + GstFlowReturn ret; + GstBuffer *outbuf; + + /* seek to beginning of file */ + gst_pad_push_event (wavenc->srcpad, + gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)); + + GST_DEBUG_OBJECT (wavenc, "writing header with datasize=%u", audio_data_size); + + outbuf = gst_wavenc_create_header_buf (wavenc, audio_data_size); + GST_BUFFER_OFFSET (outbuf) = 0; + + ret = gst_pad_push (wavenc->srcpad, outbuf); + + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (wavenc, "push header failed: flow = %s", + gst_flow_get_name (ret)); + } + + return ret; +} + +static gboolean +gst_wavenc_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + GstWavEnc *wavenc; + GstStructure *structure; + const gchar *name; + gint chans, rate, width; + + wavenc = GST_WAVENC (gst_pad_get_parent (pad)); + + if (wavenc->sent_header && !gst_caps_can_intersect (caps, GST_PAD_CAPS (pad))) { + GST_WARNING_OBJECT (wavenc, "cannot change format in middle of stream"); + goto fail; + } + + GST_DEBUG_OBJECT (wavenc, "got caps: %" GST_PTR_FORMAT, caps); + + structure = gst_caps_get_structure (caps, 0); + name = gst_structure_get_name (structure); + + if (!gst_structure_get_int (structure, "channels", &chans) || + !gst_structure_get_int (structure, "rate", &rate)) { + GST_WARNING_OBJECT (wavenc, "caps incomplete"); + goto fail; + } + + if (strcmp (name, "audio/x-raw-int") == 0) { + if (!gst_structure_get_int (structure, "width", &width)) { + GST_WARNING_OBJECT (wavenc, "caps incomplete"); + goto fail; + } + wavenc->format = GST_RIFF_WAVE_FORMAT_PCM; + wavenc->width = width; + } else if (strcmp (name, "audio/x-raw-float") == 0) { + if (!gst_structure_get_int (structure, "width", &width)) { + GST_WARNING_OBJECT (wavenc, "caps incomplete"); + goto fail; + } + wavenc->format = GST_RIFF_WAVE_FORMAT_IEEE_FLOAT; + wavenc->width = width; + } else if (strcmp (name, "audio/x-alaw") == 0) { + wavenc->format = GST_RIFF_WAVE_FORMAT_ALAW; + wavenc->width = 8; + } else if (strcmp (name, "audio/x-mulaw") == 0) { + wavenc->format = GST_RIFF_WAVE_FORMAT_MULAW; + wavenc->width = 8; + } else { + GST_WARNING_OBJECT (wavenc, "Unsupported format %s", name); + goto fail; + } + + wavenc->channels = chans; + wavenc->rate = rate; + + GST_LOG_OBJECT (wavenc, + "accepted caps: format=0x%04x chans=%u width=%u rate=%u", + wavenc->format, wavenc->channels, wavenc->width, wavenc->rate); + + gst_object_unref (wavenc); + return TRUE; + +fail: + gst_object_unref (wavenc); + return FALSE; +} + +#if 0 +static struct _maps +{ + const guint32 id; + const gchar *name; +} maps[] = { + { + GST_RIFF_INFO_IARL, "Location"}, { + GST_RIFF_INFO_IART, "Artist"}, { + GST_RIFF_INFO_ICMS, "Commissioner"}, { + GST_RIFF_INFO_ICMT, "Comment"}, { + GST_RIFF_INFO_ICOP, "Copyright"}, { + GST_RIFF_INFO_ICRD, "Creation Date"}, { + GST_RIFF_INFO_IENG, "Engineer"}, { + GST_RIFF_INFO_IGNR, "Genre"}, { + GST_RIFF_INFO_IKEY, "Keywords"}, { + GST_RIFF_INFO_INAM, "Title"}, { + GST_RIFF_INFO_IPRD, "Product"}, { + GST_RIFF_INFO_ISBJ, "Subject"}, { + GST_RIFF_INFO_ISFT, "Software"}, { + GST_RIFF_INFO_ITCH, "Technician"} +}; + +static guint32 +get_id_from_name (const char *name) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (maps); i++) { + if (strcasecmp (maps[i].name, name) == 0) { + return maps[i].id; + } + } + + return 0; +} + +static void +write_metadata (GstWavEnc * wavenc) +{ + GString *info_str; + GList *props; + int total = 4; + gboolean need_to_write = FALSE; + + info_str = g_string_new ("LIST INFO"); + + for (props = wavenc->metadata->properties->properties; props; + props = props->next) { + GstPropsEntry *entry = props->data; + const char *name; + guint32 id; + + name = gst_props_entry_get_name (entry); + id = get_id_from_name (name); + if (id != 0) { + const char *text; + char *tmp; + int len, req, i; + + need_to_write = TRUE; /* We've got at least one entry */ + + gst_props_entry_get_string (entry, &text); + len = strlen (text) + 1; /* The length in the file includes the \0 */ + + tmp = g_strdup_printf ("%" GST_FOURCC_FORMAT "%d%s", GST_FOURCC_ARGS (id), + GUINT32_TO_LE (len), text); + g_string_append (info_str, tmp); + g_free (tmp); + + /* Check that we end on an even boundary */ + req = ((len + 8) + 1) & ~1; + for (i = 0; i < req - len; i++) { + g_string_append_printf (info_str, "%c", 0); + } + + total += req; + } + } + + if (need_to_write) { + GstBuffer *buf; + + /* Now we've got all the strings together, we can write our length in */ + info_str->str[4] = GUINT32_TO_LE (total); + + buf = gst_buffer_new (); + gst_buffer_set_data (buf, info_str->str, info_str->len); + + gst_pad_push (wavenc->srcpad, GST_DATA (buf)); + g_string_free (info_str, FALSE); + } +} + +static void +write_cues (GstWavEnc * wavenc) +{ + GString *cue_string, *point_string; + GstBuffer *buf; + GList *cue_list, *c; + int num_cues, total = 4; + + if (gst_props_get (wavenc->metadata->properties, + "cues", &cue_list, NULL) == FALSE) { + /* No cues, move along please, nothing to see here */ + return; + } + + /* Space for 'cue ', chunk size and number of cuepoints */ + cue_string = g_string_new ("cue "); +#define CUEPOINT_SIZE 24 + point_string = g_string_sized_new (CUEPOINT_SIZE); + + for (c = cue_list, num_cues = 0; c; c = c->next, num_cues++) { + GstCaps *cue_caps = c->data; + guint32 pos; + + gst_props_get (cue_caps->properties, "position", &pos, NULL); + + point_string->str[0] = GUINT32_TO_LE (num_cues + 1); + point_string->str[4] = GUINT32_TO_LE (0); + /* Fixme: There is probably a macro for this */ + point_string->str[8] = 'd'; + point_string->str[9] = 'a'; + point_string->str[10] = 't'; + point_string->str[11] = 'a'; + point_string->str[12] = GUINT32_TO_LE (0); + point_string->str[16] = GUINT32_TO_LE (0); + point_string->str[20] = GUINT32_TO_LE (pos); + + total += CUEPOINT_SIZE; + } + + /* Set the length and chunk size */ + cue_string->str[4] = GUINT32_TO_LE (total); + cue_string->str[8] = GUINT32_TO_LE (num_cues); + /* Stick the cue points on the end */ + g_string_append (cue_string, point_string->str); + g_string_free (point_string, TRUE); + + buf = gst_buffer_new (); + gst_buffer_set_data (buf, cue_string->str, cue_string->len); + + gst_pad_push (wavenc->srcpad, GST_DATA (buf)); + g_string_free (cue_string, FALSE); +} + +static void +write_labels (GstWavEnc * wavenc) +{ + GstBuffer *buf; + GString *info_str; + int total = 4; + GList *caps; + + info_str = g_string_new ("LIST adtl"); + if (gst_props_get (wavenc->metadata->properties, "ltxts", &caps, NULL)) { + GList *p; + int i; + + for (p = caps, i = 1; p; p = p->next, i++) { + GstCaps *ltxt_caps = p->data; + GString *ltxt; + char *label = NULL; + int len, req, j; + + gst_props_get (ltxt_caps->properties, "name", &label, NULL); + len = strlen (label); + +#define LTXT_SIZE 28 + ltxt = g_string_new ("ltxt "); + ltxt->str[8] = GUINT32_TO_LE (i); /* Identifier */ + ltxt->str[12] = GUINT32_TO_LE (0); /* Sample Length */ + ltxt->str[16] = GUINT32_TO_LE (0); /* FIXME: Don't save the purpose yet */ + ltxt->str[20] = GUINT16_TO_LE (0); /* Country */ + ltxt->str[22] = GUINT16_TO_LE (0); /* Language */ + ltxt->str[24] = GUINT16_TO_LE (0); /* Dialect */ + ltxt->str[26] = GUINT16_TO_LE (0); /* Code Page */ + g_string_append (ltxt, label); + g_free (label); + + len += LTXT_SIZE; + + ltxt->str[4] = GUINT32_TO_LE (len); + + /* Check that we end on an even boundary */ + req = ((len + 8) + 1) & ~1; + for (j = 0; j < req - len; j++) { + g_string_append_printf (ltxt, "%c", 0); + } + + total += req; + + g_string_append (info_str, ltxt->str); + g_string_free (ltxt, TRUE); + } + } + + if (gst_props_get (wavenc->metadata->properties, "labels", &caps, NULL)) { + GList *p; + int i; + + for (p = caps, i = 1; p; p = p->next, i++) { + GstCaps *labl_caps = p->data; + GString *labl; + char *label = NULL; + int len, req, j; + + gst_props_get (labl_caps->properties, "name", &label, NULL); + len = strlen (label); + +#define LABL_SIZE 4 + labl = g_string_new ("labl "); + labl->str[8] = GUINT32_TO_LE (i); + g_string_append (labl, label); + g_free (label); + + len += LABL_SIZE; + + labl->str[4] = GUINT32_TO_LE (len); + + /* Check our size */ + req = ((len + 8) + 1) & ~1; + for (j = 0; j < req - len; j++) { + g_string_append_printf (labl, "%c", 0); + } + + total += req; + + g_string_append (info_str, labl->str); + g_string_free (labl, TRUE); + } + } + + if (gst_props_get (wavenc->metadata->properties, "notes", &caps, NULL)) { + GList *p; + int i; + + for (p = caps, i = 1; p; p = p->next, i++) { + GstCaps *note_caps = p->data; + GString *note; + char *label = NULL; + int len, req, j; + + gst_props_get (note_caps->properties, "name", &label, NULL); + len = strlen (label); + +#define NOTE_SIZE 4 + note = g_string_new ("note "); + note->str[8] = GUINT32_TO_LE (i); + g_string_append (note, label); + g_free (label); + + len += NOTE_SIZE; + + note->str[4] = GUINT32_TO_LE (len); + + /* Size check */ + req = ((len + 8) + 1) & ~1; + for (j = 0; j < req - len; j++) { + g_string_append_printf (note, "%c", 0); + } + + total += req; + + g_string_append (info_str, note->str); + g_string_free (note, TRUE); + } + } + + info_str->str[4] = GUINT32_TO_LE (total); + + buf = gst_buffer_new (); + gst_buffer_set_data (buf, info_str->str, info_str->len); + + gst_pad_push (wavenc->srcpad, GST_DATA (buf)); + g_string_free (info_str, FALSE); +} +#endif + +static gboolean +gst_wavenc_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstWavEnc *wavenc; + + wavenc = GST_WAVENC (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS:{ + GST_DEBUG_OBJECT (wavenc, "got EOS"); +#if 0 + /* Write our metadata if we have any */ + if (wavenc->metadata) { + write_metadata (wavenc); + write_cues (wavenc); + write_labels (wavenc); + } +#endif + /* write header with correct length values */ + gst_wavenc_push_header (wavenc, wavenc->length); + + /* we're done with this file */ + wavenc->finished_properly = TRUE; + + /* and forward the EOS event */ + res = gst_pad_event_default (pad, event); + break; + } + case GST_EVENT_NEWSEGMENT: + /* Just drop it, it's probably in TIME format + * anyway. We'll send our own newsegment event */ + gst_event_unref (event); + break; + default: + res = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (wavenc); + return res; +} + +static GstFlowReturn +gst_wavenc_chain (GstPad * pad, GstBuffer * buf) +{ + GstWavEnc *wavenc = GST_WAVENC (GST_PAD_PARENT (pad)); + GstFlowReturn flow = GST_FLOW_OK; + + g_return_val_if_fail (wavenc->channels > 0, GST_FLOW_WRONG_STATE); + + if (!wavenc->sent_header) { + /* use bogus size initially, we'll write the real + * header when we get EOS and know the exact length */ + flow = gst_wavenc_push_header (wavenc, 0x7FFF0000); + + /* starting a file, means we have to finish it properly */ + wavenc->finished_properly = FALSE; + + if (flow != GST_FLOW_OK) + return flow; + + GST_DEBUG_OBJECT (wavenc, "wrote dummy header"); + wavenc->sent_header = TRUE; + } + + GST_LOG_OBJECT (wavenc, "pushing %u bytes raw audio, ts=%" GST_TIME_FORMAT, + GST_BUFFER_SIZE (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + buf = gst_buffer_make_metadata_writable (buf); + + gst_buffer_set_caps (buf, GST_PAD_CAPS (wavenc->srcpad)); + GST_BUFFER_OFFSET (buf) = WAV_HEADER_LEN + wavenc->length; + GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE; + + wavenc->length += GST_BUFFER_SIZE (buf); + + flow = gst_pad_push (wavenc->srcpad, buf); + + return flow; +} + +static GstStateChangeReturn +gst_wavenc_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstWavEnc *wavenc = GST_WAVENC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + wavenc->format = 0; + wavenc->channels = 0; + wavenc->width = 0; + wavenc->rate = 0; + wavenc->length = 0; + wavenc->sent_header = FALSE; + /* its true because we haven't writen anything */ + wavenc->finished_properly = TRUE; + break; + default: + break; + } + + ret = parent_class->change_state (element, transition); + if (ret != GST_STATE_CHANGE_SUCCESS) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + if (!wavenc->finished_properly) { + GST_ELEMENT_WARNING (wavenc, STREAM, MUX, + ("Wav stream not finished properly"), + ("Wav stream not finished properly, no EOS received " + "before shutdown")); + } + break; + default: + break; + } + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "wavenc", GST_RANK_PRIMARY, + GST_TYPE_WAVENC); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "wavenc", + "Encode raw audio into WAV", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/wavenc/gstwavenc.h b/gst/wavenc/gstwavenc.h new file mode 100644 index 0000000..3fe167e --- /dev/null +++ b/gst/wavenc/gstwavenc.h @@ -0,0 +1,68 @@ +/* GStreamer + * Copyright (C) 2002, Iain Holmes + * + * 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_WAV_ENC_H__ +#define __GST_WAV_ENC_H__ + + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_WAVENC \ + (gst_wavenc_get_type()) +#define GST_WAVENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVENC,GstWavEnc)) +#define GST_WAVENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVENC,GstWavEncClass)) +#define GST_IS_WAVENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVENC)) +#define GST_IS_WAVENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVENC)) + +typedef struct _GstWavEnc GstWavEnc; +typedef struct _GstWavEncClass GstWavEncClass; + +struct _GstWavEnc { + GstElement element; + + GstPad *sinkpad; + GstPad *srcpad; + + /* useful audio data */ + guint16 format; + guint width; + guint rate; + guint channels; + guint32 length; + + gboolean sent_header; + gboolean finished_properly; +}; + +struct _GstWavEncClass { + GstElementClass parent_class; +}; + +GType gst_wavenc_get_type (void); + +G_END_DECLS + +#endif /* __GST_WAV_ENC_H__ */ diff --git a/gst/wavparse/Makefile.am b/gst/wavparse/Makefile.am new file mode 100644 index 0000000..24d3896 --- /dev/null +++ b/gst/wavparse/Makefile.am @@ -0,0 +1,33 @@ +plugin_LTLIBRARIES = libgstwavparse.la + +libgstwavparse_la_SOURCES = gstwavparse.c +libgstwavparse_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) +libgstwavparse_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(LIBM) +libgstwavparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstwavparse_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstwavparse.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstwavparse -:SHARED libgstwavparse \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstwavparse_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstwavparse_la_CFLAGS) \ + -:LDFLAGS $(libgstwavparse_la_LDFLAGS) \ + $(libgstwavparse_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/wavparse/Makefile.in b/gst/wavparse/Makefile.in new file mode 100644 index 0000000..186977f --- /dev/null +++ b/gst/wavparse/Makefile.in @@ -0,0 +1,832 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/wavparse +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstwavparse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstwavparse_la_OBJECTS = libgstwavparse_la-gstwavparse.lo +libgstwavparse_la_OBJECTS = $(am_libgstwavparse_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstwavparse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstwavparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstwavparse_la_CFLAGS) $(CFLAGS) \ + $(libgstwavparse_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstwavparse_la_SOURCES) +DIST_SOURCES = $(libgstwavparse_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstwavparse.la +libgstwavparse_la_SOURCES = gstwavparse.c +libgstwavparse_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) + +libgstwavparse_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstriff-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + -lgsttag-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(LIBM) + +libgstwavparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstwavparse_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstwavparse.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/wavparse/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/wavparse/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstwavparse.la: $(libgstwavparse_la_OBJECTS) $(libgstwavparse_la_DEPENDENCIES) $(EXTRA_libgstwavparse_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstwavparse_la_LINK) -rpath $(plugindir) $(libgstwavparse_la_OBJECTS) $(libgstwavparse_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavparse_la-gstwavparse.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstwavparse_la-gstwavparse.lo: gstwavparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavparse_la_CFLAGS) $(CFLAGS) -MT libgstwavparse_la-gstwavparse.lo -MD -MP -MF $(DEPDIR)/libgstwavparse_la-gstwavparse.Tpo -c -o libgstwavparse_la-gstwavparse.lo `test -f 'gstwavparse.c' || echo '$(srcdir)/'`gstwavparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavparse_la-gstwavparse.Tpo $(DEPDIR)/libgstwavparse_la-gstwavparse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavparse.c' object='libgstwavparse_la-gstwavparse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavparse_la_CFLAGS) $(CFLAGS) -c -o libgstwavparse_la-gstwavparse.lo `test -f 'gstwavparse.c' || echo '$(srcdir)/'`gstwavparse.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstwavparse -:SHARED libgstwavparse \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstwavparse_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstwavparse_la_CFLAGS) \ + -:LDFLAGS $(libgstwavparse_la_LDFLAGS) \ + $(libgstwavparse_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c new file mode 100644 index 0000000..cce76d0 --- /dev/null +++ b/gst/wavparse/gstwavparse.c @@ -0,0 +1,2676 @@ +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Nokia Corporation, Stefan Kost . + * + * 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-wavparse + * + * Parse a .wav file into raw or compressed audio. + * + * Wavparse supports both push and pull mode operations, making it possible to + * stream from a network source. + * + * + * Example launch line + * |[ + * gst-launch filesrc location=sine.wav ! wavparse ! audioconvert ! alsasink + * ]| Read a wav file and output to the soundcard using the ALSA element. The + * wav file is assumed to contain raw uncompressed samples. + * |[ + * gst-launch gnomevfssrc location=http://www.example.org/sine.wav ! queue ! wavparse ! audioconvert ! alsasink + * ]| Stream data from a network url. + * + * + * Last reviewed on 2007-02-14 (0.10.6) + */ + +/* + * TODO: + * http://replaygain.hydrogenaudio.org/file_format_wav.html + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include + +#include "gstwavparse.h" +#include "gst/riff/riff-ids.h" +#include "gst/riff/riff-media.h" +#include +#include + +GST_DEBUG_CATEGORY_STATIC (wavparse_debug); +#define GST_CAT_DEFAULT (wavparse_debug) + +static void gst_wavparse_dispose (GObject * object); + +static gboolean gst_wavparse_sink_activate (GstPad * sinkpad); +static gboolean gst_wavparse_sink_activate_pull (GstPad * sinkpad, + gboolean active); +static gboolean gst_wavparse_send_event (GstElement * element, + GstEvent * event); +static GstStateChangeReturn gst_wavparse_change_state (GstElement * element, + GstStateChange transition); + +static const GstQueryType *gst_wavparse_get_query_types (GstPad * pad); +static gboolean gst_wavparse_pad_query (GstPad * pad, GstQuery * query); +static gboolean gst_wavparse_pad_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); + +static GstFlowReturn gst_wavparse_chain (GstPad * pad, GstBuffer * buf); +static gboolean gst_wavparse_sink_event (GstPad * pad, GstEvent * event); +static void gst_wavparse_loop (GstPad * pad); +static gboolean gst_wavparse_srcpad_event (GstPad * pad, GstEvent * event); + +static GstStaticPadTemplate sink_template_factory = +GST_STATIC_PAD_TEMPLATE ("wavparse_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wav") + ); + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (wavparse_debug, "wavparse", 0, "WAV parser"); + +GST_BOILERPLATE_FULL (GstWavParse, gst_wavparse, GstElement, + GST_TYPE_ELEMENT, DEBUG_INIT); + +static void +gst_wavparse_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstPadTemplate *src_template; + + /* register pads */ + gst_element_class_add_static_pad_template (element_class, + &sink_template_factory); + + src_template = gst_pad_template_new ("wavparse_src", GST_PAD_SRC, + GST_PAD_SOMETIMES, gst_riff_create_audio_template_caps ()); + gst_element_class_add_pad_template (element_class, src_template); + gst_object_unref (src_template); + + gst_element_class_set_details_simple (element_class, "WAV audio demuxer", + "Codec/Demuxer/Audio", + "Parse a .wav file into raw audio", + "Erik Walthinsen "); +} + +static void +gst_wavparse_class_init (GstWavParseClass * klass) +{ + GstElementClass *gstelement_class; + GObjectClass *object_class; + + gstelement_class = (GstElementClass *) klass; + object_class = (GObjectClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + object_class->dispose = gst_wavparse_dispose; + + gstelement_class->change_state = gst_wavparse_change_state; + gstelement_class->send_event = gst_wavparse_send_event; +} + +static void +gst_wavparse_reset (GstWavParse * wav) +{ + wav->state = GST_WAVPARSE_START; + + /* These will all be set correctly in the fmt chunk */ + wav->depth = 0; + wav->rate = 0; + wav->width = 0; + wav->channels = 0; + wav->blockalign = 0; + wav->bps = 0; + wav->fact = 0; + wav->offset = 0; + wav->end_offset = 0; + wav->dataleft = 0; + wav->datasize = 0; + wav->datastart = 0; + wav->duration = 0; + wav->got_fmt = FALSE; + wav->first = TRUE; + + if (wav->seek_event) + gst_event_unref (wav->seek_event); + wav->seek_event = NULL; + if (wav->adapter) { + gst_adapter_clear (wav->adapter); + g_object_unref (wav->adapter); + wav->adapter = NULL; + } + if (wav->tags) + gst_tag_list_free (wav->tags); + wav->tags = NULL; + if (wav->caps) + gst_caps_unref (wav->caps); + wav->caps = NULL; + if (wav->start_segment) + gst_event_unref (wav->start_segment); + wav->start_segment = NULL; + if (wav->close_segment) + gst_event_unref (wav->close_segment); + wav->close_segment = NULL; +} + +static void +gst_wavparse_dispose (GObject * object) +{ + GstWavParse *wav = GST_WAVPARSE (object); + + GST_DEBUG_OBJECT (wav, "WAV: Dispose"); + gst_wavparse_reset (wav); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_wavparse_init (GstWavParse * wavparse, GstWavParseClass * g_class) +{ + gst_wavparse_reset (wavparse); + + /* sink */ + wavparse->sinkpad = + gst_pad_new_from_static_template (&sink_template_factory, "sink"); + gst_pad_set_activate_function (wavparse->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavparse_sink_activate)); + gst_pad_set_activatepull_function (wavparse->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavparse_sink_activate_pull)); + gst_pad_set_chain_function (wavparse->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavparse_chain)); + gst_pad_set_event_function (wavparse->sinkpad, + GST_DEBUG_FUNCPTR (gst_wavparse_sink_event)); + gst_element_add_pad (GST_ELEMENT_CAST (wavparse), wavparse->sinkpad); + + /* src, will be created later */ + wavparse->srcpad = NULL; +} + +static void +gst_wavparse_destroy_sourcepad (GstWavParse * wavparse) +{ + if (wavparse->srcpad) { + gst_element_remove_pad (GST_ELEMENT_CAST (wavparse), wavparse->srcpad); + wavparse->srcpad = NULL; + } +} + +static void +gst_wavparse_create_sourcepad (GstWavParse * wavparse) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (wavparse); + GstPadTemplate *src_template; + + /* destroy previous one */ + gst_wavparse_destroy_sourcepad (wavparse); + + /* source */ + src_template = gst_element_class_get_pad_template (klass, "wavparse_src"); + wavparse->srcpad = gst_pad_new_from_template (src_template, "src"); + gst_pad_use_fixed_caps (wavparse->srcpad); + gst_pad_set_query_type_function (wavparse->srcpad, + GST_DEBUG_FUNCPTR (gst_wavparse_get_query_types)); + gst_pad_set_query_function (wavparse->srcpad, + GST_DEBUG_FUNCPTR (gst_wavparse_pad_query)); + gst_pad_set_event_function (wavparse->srcpad, + GST_DEBUG_FUNCPTR (gst_wavparse_srcpad_event)); + + GST_DEBUG_OBJECT (wavparse, "srcpad created"); +} + +/* Compute (value * nom) % denom, avoiding overflow. This can be used + * to perform ceiling or rounding division together with + * gst_util_uint64_scale[_int]. */ +#define uint64_scale_modulo(val, nom, denom) \ + ((val % denom) * (nom % denom) % denom) + +/* Like gst_util_uint64_scale, but performs ceiling division. */ +static guint64 +uint64_ceiling_scale_int (guint64 val, gint num, gint denom) +{ + guint64 result = gst_util_uint64_scale_int (val, num, denom); + + if (uint64_scale_modulo (val, num, denom) == 0) + return result; + else + return result + 1; +} + +/* Like gst_util_uint64_scale, but performs ceiling division. */ +static guint64 +uint64_ceiling_scale (guint64 val, guint64 num, guint64 denom) +{ + guint64 result = gst_util_uint64_scale (val, num, denom); + + if (uint64_scale_modulo (val, num, denom) == 0) + return result; + else + return result + 1; +} + + +/* FIXME: why is that not in use? */ +#if 0 +static void +gst_wavparse_parse_adtl (GstWavParse * wavparse, int len) +{ + guint32 got_bytes; + GstByteStream *bs = wavparse->bs; + gst_riff_chunk *temp_chunk, chunk; + guint8 *tempdata; + struct _gst_riff_labl labl, *temp_labl; + struct _gst_riff_ltxt ltxt, *temp_ltxt; + struct _gst_riff_note note, *temp_note; + char *label_name; + GstProps *props; + GstPropsEntry *entry; + GstCaps *new_caps; + GList *caps = NULL; + + props = wavparse->metadata->properties; + + while (len > 0) { + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk)); + if (got_bytes != sizeof (gst_riff_chunk)) { + return; + } + temp_chunk = (gst_riff_chunk *) tempdata; + + chunk.id = GUINT32_FROM_LE (temp_chunk->id); + chunk.size = GUINT32_FROM_LE (temp_chunk->size); + + if (chunk.size == 0) { + gst_bytestream_flush (bs, sizeof (gst_riff_chunk)); + len -= sizeof (gst_riff_chunk); + continue; + } + + switch (chunk.id) { + case GST_RIFF_adtl_labl: + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, + sizeof (struct _gst_riff_labl)); + if (got_bytes != sizeof (struct _gst_riff_labl)) { + return; + } + + temp_labl = (struct _gst_riff_labl *) tempdata; + labl.id = GUINT32_FROM_LE (temp_labl->id); + labl.size = GUINT32_FROM_LE (temp_labl->size); + labl.identifier = GUINT32_FROM_LE (temp_labl->identifier); + + gst_bytestream_flush (bs, sizeof (struct _gst_riff_labl)); + len -= sizeof (struct _gst_riff_labl); + + got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, labl.size - 4); + if (got_bytes != labl.size - 4) { + return; + } + + label_name = (char *) tempdata; + + gst_bytestream_flush (bs, ((labl.size - 4) + 1) & ~1); + len -= (((labl.size - 4) + 1) & ~1); + + new_caps = gst_caps_new ("label", + "application/x-gst-metadata", + gst_props_new ("identifier", G_TYPE_INT (labl.identifier), + "name", G_TYPE_STRING (label_name), NULL)); + + if (gst_props_get (props, "labels", &caps, NULL)) { + caps = g_list_append (caps, new_caps); + } else { + caps = g_list_append (NULL, new_caps); + + entry = gst_props_entry_new ("labels", GST_PROPS_GLIST (caps)); + gst_props_add_entry (props, entry); + } + + break; + + case GST_RIFF_adtl_ltxt: + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, + sizeof (struct _gst_riff_ltxt)); + if (got_bytes != sizeof (struct _gst_riff_ltxt)) { + return; + } + + temp_ltxt = (struct _gst_riff_ltxt *) tempdata; + ltxt.id = GUINT32_FROM_LE (temp_ltxt->id); + ltxt.size = GUINT32_FROM_LE (temp_ltxt->size); + ltxt.identifier = GUINT32_FROM_LE (temp_ltxt->identifier); + ltxt.length = GUINT32_FROM_LE (temp_ltxt->length); + ltxt.purpose = GUINT32_FROM_LE (temp_ltxt->purpose); + ltxt.country = GUINT16_FROM_LE (temp_ltxt->country); + ltxt.language = GUINT16_FROM_LE (temp_ltxt->language); + ltxt.dialect = GUINT16_FROM_LE (temp_ltxt->dialect); + ltxt.codepage = GUINT16_FROM_LE (temp_ltxt->codepage); + + gst_bytestream_flush (bs, sizeof (struct _gst_riff_ltxt)); + len -= sizeof (struct _gst_riff_ltxt); + + if (ltxt.size - 20 > 0) { + got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, ltxt.size - 20); + if (got_bytes != ltxt.size - 20) { + return; + } + + gst_bytestream_flush (bs, ((ltxt.size - 20) + 1) & ~1); + len -= (((ltxt.size - 20) + 1) & ~1); + + label_name = (char *) tempdata; + } else { + label_name = ""; + } + + new_caps = gst_caps_new ("ltxt", + "application/x-gst-metadata", + gst_props_new ("identifier", G_TYPE_INT (ltxt.identifier), + "name", G_TYPE_STRING (label_name), + "length", G_TYPE_INT (ltxt.length), NULL)); + + if (gst_props_get (props, "ltxts", &caps, NULL)) { + caps = g_list_append (caps, new_caps); + } else { + caps = g_list_append (NULL, new_caps); + + entry = gst_props_entry_new ("ltxts", GST_PROPS_GLIST (caps)); + gst_props_add_entry (props, entry); + } + + break; + + case GST_RIFF_adtl_note: + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, + sizeof (struct _gst_riff_note)); + if (got_bytes != sizeof (struct _gst_riff_note)) { + return; + } + + temp_note = (struct _gst_riff_note *) tempdata; + note.id = GUINT32_FROM_LE (temp_note->id); + note.size = GUINT32_FROM_LE (temp_note->size); + note.identifier = GUINT32_FROM_LE (temp_note->identifier); + + gst_bytestream_flush (bs, sizeof (struct _gst_riff_note)); + len -= sizeof (struct _gst_riff_note); + + got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, note.size - 4); + if (got_bytes != note.size - 4) { + return; + } + + gst_bytestream_flush (bs, ((note.size - 4) + 1) & ~1); + len -= (((note.size - 4) + 1) & ~1); + + label_name = (char *) tempdata; + + new_caps = gst_caps_new ("note", + "application/x-gst-metadata", + gst_props_new ("identifier", G_TYPE_INT (note.identifier), + "name", G_TYPE_STRING (label_name), NULL)); + + if (gst_props_get (props, "notes", &caps, NULL)) { + caps = g_list_append (caps, new_caps); + } else { + caps = g_list_append (NULL, new_caps); + + entry = gst_props_entry_new ("notes", GST_PROPS_GLIST (caps)); + gst_props_add_entry (props, entry); + } + + break; + + default: + g_print ("Unknown chunk: %" GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (chunk.id)); + return; + } + } + + g_object_notify (G_OBJECT (wavparse), "metadata"); +} + +static void +gst_wavparse_parse_cues (GstWavParse * wavparse, int len) +{ + guint32 got_bytes; + GstByteStream *bs = wavparse->bs; + struct _gst_riff_cue *temp_cue, cue; + struct _gst_riff_cuepoints *points; + guint8 *tempdata; + int i; + GList *cues = NULL; + GstPropsEntry *entry; + + while (len > 0) { + int required; + + got_bytes = + gst_bytestream_peek_bytes (bs, &tempdata, + sizeof (struct _gst_riff_cue)); + temp_cue = (struct _gst_riff_cue *) tempdata; + + /* fixup for our big endian friends */ + cue.id = GUINT32_FROM_LE (temp_cue->id); + cue.size = GUINT32_FROM_LE (temp_cue->size); + cue.cuepoints = GUINT32_FROM_LE (temp_cue->cuepoints); + + gst_bytestream_flush (bs, sizeof (struct _gst_riff_cue)); + if (got_bytes != sizeof (struct _gst_riff_cue)) { + return; + } + + len -= sizeof (struct _gst_riff_cue); + + /* -4 because cue.size contains the cuepoints size + and we've already flushed that out of the system */ + required = cue.size - 4; + got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, required); + gst_bytestream_flush (bs, ((required) + 1) & ~1); + if (got_bytes != required) { + return; + } + + len -= (((cue.size - 4) + 1) & ~1); + + /* now we have an array of struct _gst_riff_cuepoints in tempdata */ + points = (struct _gst_riff_cuepoints *) tempdata; + + for (i = 0; i < cue.cuepoints; i++) { + GstCaps *caps; + + caps = gst_caps_new ("cues", + "application/x-gst-metadata", + gst_props_new ("identifier", G_TYPE_INT (points[i].identifier), + "position", G_TYPE_INT (points[i].offset), NULL)); + cues = g_list_append (cues, caps); + } + + entry = gst_props_entry_new ("cues", GST_PROPS_GLIST (cues)); + gst_props_add_entry (wavparse->metadata->properties, entry); + } + + g_object_notify (G_OBJECT (wavparse), "metadata"); +} + +/* Read 'fmt ' header */ +static gboolean +gst_wavparse_fmt (GstWavParse * wav) +{ + gst_riff_strf_auds *header = NULL; + GstCaps *caps; + + if (!gst_riff_read_strf_auds (wav, &header)) + goto no_fmt; + + wav->format = header->format; + wav->rate = header->rate; + wav->channels = header->channels; + if (wav->channels == 0) + goto no_channels; + + wav->blockalign = header->blockalign; + wav->width = (header->blockalign * 8) / header->channels; + wav->depth = header->size; + wav->bps = header->av_bps; + if (wav->bps <= 0) + goto no_bps; + + /* Note: gst_riff_create_audio_caps might need to fix values in + * the header header depending on the format, so call it first */ + caps = gst_riff_create_audio_caps (header->format, NULL, header, NULL); + g_free (header); + + if (caps == NULL) + goto no_caps; + + gst_wavparse_create_sourcepad (wav); + gst_pad_use_fixed_caps (wav->srcpad); + gst_pad_set_active (wav->srcpad, TRUE); + gst_pad_set_caps (wav->srcpad, caps); + gst_caps_free (caps); + gst_element_add_pad (GST_ELEMENT_CAST (wav), wav->srcpad); + gst_element_no_more_pads (GST_ELEMENT_CAST (wav)); + + GST_DEBUG ("frequency %d, channels %d", wav->rate, wav->channels); + + return TRUE; + + /* ERRORS */ +no_fmt: + { + GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), + ("No FMT tag found")); + return FALSE; + } +no_channels: + { + GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), + ("Stream claims to contain zero channels - invalid data")); + g_free (header); + return FALSE; + } +no_bps: + { + GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), + ("Stream claims to bitrate of <= zero - invalid data")); + g_free (header); + return FALSE; + } +no_caps: + { + GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), (NULL)); + return FALSE; + } +} + +static gboolean +gst_wavparse_other (GstWavParse * wav) +{ + guint32 tag, length; + + if (!gst_riff_peek_head (wav, &tag, &length, NULL)) { + GST_WARNING_OBJECT (wav, "could not peek head"); + return FALSE; + } + GST_DEBUG_OBJECT (wav, "got tag (%08x) %4.4s, length %d", tag, + (gchar *) & tag, length); + + switch (tag) { + case GST_RIFF_TAG_LIST: + if (!(tag = gst_riff_peek_list (wav))) { + GST_WARNING_OBJECT (wav, "could not peek list"); + return FALSE; + } + + switch (tag) { + case GST_RIFF_LIST_INFO: + if (!gst_riff_read_list (wav, &tag) || !gst_riff_read_info (wav)) { + GST_WARNING_OBJECT (wav, "could not read list"); + return FALSE; + } + break; + + case GST_RIFF_LIST_adtl: + if (!gst_riff_read_skip (wav)) { + GST_WARNING_OBJECT (wav, "could not read skip"); + return FALSE; + } + break; + + default: + GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag, + (gchar *) & tag); + if (!gst_riff_read_skip (wav)) { + GST_WARNING_OBJECT (wav, "could not read skip"); + return FALSE; + } + break; + } + + break; + + case GST_RIFF_TAG_data: + if (!gst_bytestream_flush (wav->bs, 8)) { + GST_WARNING_OBJECT (wav, "could not flush 8 bytes"); + return FALSE; + } + + GST_DEBUG_OBJECT (wav, "switching to data mode"); + wav->state = GST_WAVPARSE_DATA; + wav->datastart = gst_bytestream_tell (wav->bs); + if (length == 0) { + guint64 file_length; + + /* length is 0, data probably stretches to the end + * of file */ + GST_DEBUG_OBJECT (wav, "length is 0 trying to find length"); + /* get length of file */ + file_length = gst_bytestream_length (wav->bs); + if (file_length == -1) { + GST_DEBUG_OBJECT (wav, + "could not get file length, assuming data to eof"); + /* could not get length, assuming till eof */ + length = G_MAXUINT32; + } + if (file_length > G_MAXUINT32) { + GST_DEBUG_OBJECT (wav, "file length %" G_GUINT64_FORMAT + ", clipping to 32 bits", file_length); + /* could not get length, assuming till eof */ + length = G_MAXUINT32; + } else { + GST_DEBUG_OBJECT (wav, "file length %" G_GUINT64_FORMAT + ", datalength %u", file_length, length); + /* substract offset of datastart from length */ + length = file_length - wav->datastart; + GST_DEBUG_OBJECT (wav, "datalength %u", length); + } + } + wav->datasize = (guint64) length; + GST_DEBUG_OBJECT (wav, "datasize = %ld", length) + break; + + case GST_RIFF_TAG_cue: + if (!gst_riff_read_skip (wav)) { + GST_WARNING_OBJECT (wav, "could not read skip"); + return FALSE; + } + break; + + default: + GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag, (gchar *) & tag); + if (!gst_riff_read_skip (wav)) + return FALSE; + break; + } + + return TRUE; +} +#endif + + +static gboolean +gst_wavparse_parse_file_header (GstElement * element, GstBuffer * buf) +{ + guint32 doctype; + + if (!gst_riff_parse_file_header (element, buf, &doctype)) + return FALSE; + + if (doctype != GST_RIFF_RIFF_WAVE) + goto not_wav; + + return TRUE; + + /* ERRORS */ +not_wav: + { + GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), + ("File is not a WAVE file: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (doctype))); + return FALSE; + } +} + +static GstFlowReturn +gst_wavparse_stream_init (GstWavParse * wav) +{ + GstFlowReturn res; + GstBuffer *buf = NULL; + + if ((res = gst_pad_pull_range (wav->sinkpad, + wav->offset, 12, &buf)) != GST_FLOW_OK) + return res; + else if (!gst_wavparse_parse_file_header (GST_ELEMENT_CAST (wav), buf)) + return GST_FLOW_ERROR; + + wav->offset += 12; + + return GST_FLOW_OK; +} + +static gboolean +gst_wavparse_time_to_bytepos (GstWavParse * wav, gint64 ts, gint64 * bytepos) +{ + /* -1 always maps to -1 */ + if (ts == -1) { + *bytepos = -1; + return TRUE; + } + + /* 0 always maps to 0 */ + if (ts == 0) { + *bytepos = 0; + return TRUE; + } + + if (wav->bps > 0) { + *bytepos = uint64_ceiling_scale (ts, (guint64) wav->bps, GST_SECOND); + return TRUE; + } else if (wav->fact) { + guint64 bps = + gst_util_uint64_scale_int (wav->datasize, wav->rate, wav->fact); + *bytepos = uint64_ceiling_scale (ts, bps, GST_SECOND); + return TRUE; + } + + return FALSE; +} + +/* This function is used to perform seeks on the element. + * + * It also works when event is NULL, in which case it will just + * start from the last configured segment. This technique is + * used when activating the element and to perform the seek in + * READY. + */ +static gboolean +gst_wavparse_perform_seek (GstWavParse * wav, GstEvent * event) +{ + gboolean res; + gdouble rate; + GstFormat format, bformat; + GstSeekFlags flags; + GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type; + gint64 cur, stop, upstream_size; + gboolean flush; + gboolean update; + GstSegment seeksegment = { 0, }; + gint64 last_stop; + + if (event) { + GST_DEBUG_OBJECT (wav, "doing seek with event"); + + gst_event_parse_seek (event, &rate, &format, &flags, + &cur_type, &cur, &stop_type, &stop); + + /* no negative rates yet */ + if (rate < 0.0) + goto negative_rate; + + if (format != wav->segment.format) { + GST_INFO_OBJECT (wav, "converting seek-event from %s to %s", + gst_format_get_name (format), + gst_format_get_name (wav->segment.format)); + res = TRUE; + if (cur_type != GST_SEEK_TYPE_NONE) + res = + gst_pad_query_convert (wav->srcpad, format, cur, + &wav->segment.format, &cur); + if (res && stop_type != GST_SEEK_TYPE_NONE) + res = + gst_pad_query_convert (wav->srcpad, format, stop, + &wav->segment.format, &stop); + if (!res) + goto no_format; + + format = wav->segment.format; + } + } else { + GST_DEBUG_OBJECT (wav, "doing seek without event"); + flags = 0; + rate = 1.0; + cur_type = GST_SEEK_TYPE_SET; + stop_type = GST_SEEK_TYPE_SET; + } + + /* in push mode, we must delegate to upstream */ + if (wav->streaming) { + gboolean res = FALSE; + + /* if streaming not yet started; only prepare initial newsegment */ + if (!event || wav->state != GST_WAVPARSE_DATA) { + if (wav->start_segment) + gst_event_unref (wav->start_segment); + wav->start_segment = + gst_event_new_new_segment (FALSE, wav->segment.rate, + wav->segment.format, wav->segment.last_stop, wav->segment.duration, + wav->segment.last_stop); + res = TRUE; + } else { + /* convert seek positions to byte positions in data sections */ + if (format == GST_FORMAT_TIME) { + /* should not fail */ + if (!gst_wavparse_time_to_bytepos (wav, cur, &cur)) + goto no_position; + if (!gst_wavparse_time_to_bytepos (wav, stop, &stop)) + goto no_position; + } + /* mind sample boundary and header */ + if (cur >= 0) { + cur -= (cur % wav->bytes_per_sample); + cur += wav->datastart; + } + if (stop >= 0) { + stop -= (stop % wav->bytes_per_sample); + stop += wav->datastart; + } + GST_DEBUG_OBJECT (wav, "Pushing BYTE seek rate %g, " + "start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, rate, cur, + stop); + /* BYTE seek event */ + event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, cur_type, cur, + stop_type, stop); + res = gst_pad_push_event (wav->sinkpad, event); + } + return res; + } + + /* get flush flag */ + flush = flags & GST_SEEK_FLAG_FLUSH; + + /* now we need to make sure the streaming thread is stopped. We do this by + * either sending a FLUSH_START event downstream which will cause the + * streaming thread to stop with a WRONG_STATE. + * For a non-flushing seek we simply pause the task, which will happen as soon + * as it completes one iteration (and thus might block when the sink is + * blocking in preroll). */ + if (flush) { + if (wav->srcpad) { + GST_DEBUG_OBJECT (wav, "sending flush start"); + gst_pad_push_event (wav->srcpad, gst_event_new_flush_start ()); + } + } else { + gst_pad_pause_task (wav->sinkpad); + } + + /* we should now be able to grab the streaming thread because we stopped it + * with the above flush/pause code */ + GST_PAD_STREAM_LOCK (wav->sinkpad); + + /* save current position */ + last_stop = wav->segment.last_stop; + + GST_DEBUG_OBJECT (wav, "stopped streaming at %" G_GINT64_FORMAT, last_stop); + + /* copy segment, we need this because we still need the old + * segment when we close the current segment. */ + memcpy (&seeksegment, &wav->segment, sizeof (GstSegment)); + + /* configure the seek parameters in the seeksegment. We will then have the + * right values in the segment to perform the seek */ + if (event) { + GST_DEBUG_OBJECT (wav, "configuring seek"); + gst_segment_set_seek (&seeksegment, rate, format, flags, + cur_type, cur, stop_type, stop, &update); + } + + /* figure out the last position we need to play. If it's configured (stop != + * -1), use that, else we play until the total duration of the file */ + if ((stop = seeksegment.stop) == -1) + stop = seeksegment.duration; + + GST_DEBUG_OBJECT (wav, "cur_type =%d", cur_type); + if ((cur_type != GST_SEEK_TYPE_NONE)) { + /* bring offset to bytes, if the bps is 0, we have the segment in BYTES and + * we can just copy the last_stop. If not, we use the bps to convert TIME to + * bytes. */ + if (!gst_wavparse_time_to_bytepos (wav, seeksegment.last_stop, + (gint64 *) & wav->offset)) + wav->offset = seeksegment.last_stop; + GST_LOG_OBJECT (wav, "offset=%" G_GUINT64_FORMAT, wav->offset); + wav->offset -= (wav->offset % wav->bytes_per_sample); + GST_LOG_OBJECT (wav, "offset=%" G_GUINT64_FORMAT, wav->offset); + wav->offset += wav->datastart; + GST_LOG_OBJECT (wav, "offset=%" G_GUINT64_FORMAT, wav->offset); + } else { + GST_LOG_OBJECT (wav, "continue from offset=%" G_GUINT64_FORMAT, + wav->offset); + } + + if (stop_type != GST_SEEK_TYPE_NONE) { + if (!gst_wavparse_time_to_bytepos (wav, stop, (gint64 *) & wav->end_offset)) + wav->end_offset = stop; + GST_LOG_OBJECT (wav, "end_offset=%" G_GUINT64_FORMAT, wav->end_offset); + wav->end_offset -= (wav->end_offset % wav->bytes_per_sample); + GST_LOG_OBJECT (wav, "end_offset=%" G_GUINT64_FORMAT, wav->end_offset); + wav->end_offset += wav->datastart; + GST_LOG_OBJECT (wav, "end_offset=%" G_GUINT64_FORMAT, wav->end_offset); + } else { + GST_LOG_OBJECT (wav, "continue to end_offset=%" G_GUINT64_FORMAT, + wav->end_offset); + } + + /* make sure filesize is not exceeded due to rounding errors or so, + * same precaution as in _stream_headers */ + bformat = GST_FORMAT_BYTES; + if (gst_pad_query_peer_duration (wav->sinkpad, &bformat, &upstream_size)) + wav->end_offset = MIN (wav->end_offset, upstream_size); + + /* this is the range of bytes we will use for playback */ + wav->offset = MIN (wav->offset, wav->end_offset); + wav->dataleft = wav->end_offset - wav->offset; + + GST_DEBUG_OBJECT (wav, + "seek: rate %lf, offset %" G_GUINT64_FORMAT ", end %" G_GUINT64_FORMAT + ", segment %" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT, rate, wav->offset, + wav->end_offset, GST_TIME_ARGS (seeksegment.start), GST_TIME_ARGS (stop)); + + /* prepare for streaming again */ + if (wav->srcpad) { + if (flush) { + /* if we sent a FLUSH_START, we now send a FLUSH_STOP */ + GST_DEBUG_OBJECT (wav, "sending flush stop"); + gst_pad_push_event (wav->srcpad, gst_event_new_flush_stop ()); + } else if (wav->segment_running) { + /* we are running the current segment and doing a non-flushing seek, + * close the segment first based on the previous last_stop. */ + GST_DEBUG_OBJECT (wav, "closing running segment %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, wav->segment.start, wav->segment.last_stop); + + /* queue the segment for sending in the stream thread */ + if (wav->close_segment) + gst_event_unref (wav->close_segment); + wav->close_segment = gst_event_new_new_segment (TRUE, + wav->segment.rate, wav->segment.format, + wav->segment.start, wav->segment.last_stop, wav->segment.start); + } + } + + /* now we did the seek and can activate the new segment values */ + memcpy (&wav->segment, &seeksegment, sizeof (GstSegment)); + + /* if we're doing a segment seek, post a SEGMENT_START message */ + if (wav->segment.flags & GST_SEEK_FLAG_SEGMENT) { + gst_element_post_message (GST_ELEMENT_CAST (wav), + gst_message_new_segment_start (GST_OBJECT_CAST (wav), + wav->segment.format, wav->segment.last_stop)); + } + + /* now create the newsegment */ + GST_DEBUG_OBJECT (wav, "Creating newsegment from %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, wav->segment.last_stop, stop); + + /* store the newsegment event so it can be sent from the streaming thread. */ + if (wav->start_segment) + gst_event_unref (wav->start_segment); + wav->start_segment = + gst_event_new_new_segment (FALSE, wav->segment.rate, + wav->segment.format, wav->segment.last_stop, stop, + wav->segment.last_stop); + + /* mark discont if we are going to stream from another position. */ + if (last_stop != wav->segment.last_stop) { + GST_DEBUG_OBJECT (wav, "mark DISCONT, we did a seek to another position"); + wav->discont = TRUE; + } + + /* and start the streaming task again */ + wav->segment_running = TRUE; + if (!wav->streaming) { + gst_pad_start_task (wav->sinkpad, (GstTaskFunction) gst_wavparse_loop, + wav->sinkpad); + } + + GST_PAD_STREAM_UNLOCK (wav->sinkpad); + + return TRUE; + + /* ERRORS */ +negative_rate: + { + GST_DEBUG_OBJECT (wav, "negative playback rates are not supported yet."); + return FALSE; + } +no_format: + { + GST_DEBUG_OBJECT (wav, "unsupported format given, seek aborted."); + return FALSE; + } +no_position: + { + GST_DEBUG_OBJECT (wav, + "Could not determine byte position for desired time"); + return FALSE; + } +} + +/* + * gst_wavparse_peek_chunk_info: + * @wav Wavparse object + * @tag holder for tag + * @size holder for tag size + * + * Peek next chunk info (tag and size) + * + * Returns: %TRUE when the chunk info (header) is available + */ +static gboolean +gst_wavparse_peek_chunk_info (GstWavParse * wav, guint32 * tag, guint32 * size) +{ + const guint8 *data = NULL; + + if (gst_adapter_available (wav->adapter) < 8) + return FALSE; + + data = gst_adapter_peek (wav->adapter, 8); + *tag = GST_READ_UINT32_LE (data); + *size = GST_READ_UINT32_LE (data + 4); + + GST_DEBUG ("Next chunk size is %d bytes, type %" GST_FOURCC_FORMAT, *size, + GST_FOURCC_ARGS (*tag)); + + return TRUE; +} + +/* + * gst_wavparse_peek_chunk: + * @wav Wavparse object + * @tag holder for tag + * @size holder for tag size + * + * Peek enough data for one full chunk + * + * Returns: %TRUE when the full chunk is available + */ +static gboolean +gst_wavparse_peek_chunk (GstWavParse * wav, guint32 * tag, guint32 * size) +{ + guint32 peek_size = 0; + guint available; + + if (!gst_wavparse_peek_chunk_info (wav, tag, size)) + return FALSE; + + /* size 0 -> empty data buffer would surprise most callers, + * large size -> do not bother trying to squeeze that into adapter, + * so we throw poor man's exception, which can be caught if caller really + * wants to handle 0 size chunk */ + if (!(*size) || (*size) >= (1 << 30)) { + GST_INFO ("Invalid/unexpected chunk size %d for tag %" GST_FOURCC_FORMAT, + *size, GST_FOURCC_ARGS (*tag)); + /* chain should give up */ + wav->abort_buffering = TRUE; + return FALSE; + } + peek_size = (*size + 1) & ~1; + available = gst_adapter_available (wav->adapter); + + if (available >= (8 + peek_size)) { + return TRUE; + } else { + GST_LOG ("but only %u bytes available now", available); + return FALSE; + } +} + +/* + * gst_wavparse_calculate_duration: + * @wav: wavparse object + * + * Calculate duration on demand and store in @wav. Prefer bps, but use fact as a + * fallback. + * + * Returns: %TRUE if duration is available. + */ +static gboolean +gst_wavparse_calculate_duration (GstWavParse * wav) +{ + if (wav->duration > 0) + return TRUE; + + if (wav->bps > 0) { + GST_INFO_OBJECT (wav, "Got datasize %" G_GUINT64_FORMAT, wav->datasize); + wav->duration = + uint64_ceiling_scale (wav->datasize, GST_SECOND, (guint64) wav->bps); + GST_INFO_OBJECT (wav, "Got duration (bps) %" GST_TIME_FORMAT, + GST_TIME_ARGS (wav->duration)); + return TRUE; + } else if (wav->fact) { + wav->duration = uint64_ceiling_scale_int (GST_SECOND, wav->fact, wav->rate); + GST_INFO_OBJECT (wav, "Got duration (fact) %" GST_TIME_FORMAT, + GST_TIME_ARGS (wav->duration)); + return TRUE; + } + return FALSE; +} + +static gboolean +gst_waveparse_ignore_chunk (GstWavParse * wav, GstBuffer * buf, guint32 tag, + guint32 size) +{ + guint flush; + + if (wav->streaming) { + if (!gst_wavparse_peek_chunk (wav, &tag, &size)) + return FALSE; + } + GST_DEBUG_OBJECT (wav, "Ignoring tag %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (tag)); + flush = 8 + ((size + 1) & ~1); + wav->offset += flush; + if (wav->streaming) { + gst_adapter_flush (wav->adapter, flush); + } else { + gst_buffer_unref (buf); + } + + return TRUE; +} + +#define MAX_BUFFER_SIZE 4096 + +static GstFlowReturn +gst_wavparse_stream_headers (GstWavParse * wav) +{ + GstFlowReturn res = GST_FLOW_OK; + GstBuffer *buf = NULL; + gst_riff_strf_auds *header = NULL; + guint32 tag, size; + gboolean gotdata = FALSE; + GstCaps *caps = NULL; + gchar *codec_name = NULL; + GstEvent **event_p; + GstFormat bformat; + gint64 upstream_size = 0; + + /* search for "_fmt" chunk, which should be first */ + while (!wav->got_fmt) { + GstBuffer *extra; + + /* The header starts with a 'fmt ' tag */ + if (wav->streaming) { + if (!gst_wavparse_peek_chunk (wav, &tag, &size)) + return res; + + gst_adapter_flush (wav->adapter, 8); + wav->offset += 8; + + if (size) { + buf = gst_adapter_take_buffer (wav->adapter, size); + if (size & 1) + gst_adapter_flush (wav->adapter, 1); + wav->offset += GST_ROUND_UP_2 (size); + } else { + buf = gst_buffer_new (); + } + } else { + if ((res = gst_riff_read_chunk (GST_ELEMENT_CAST (wav), wav->sinkpad, + &wav->offset, &tag, &buf)) != GST_FLOW_OK) + return res; + } + + if (tag == GST_RIFF_TAG_JUNK || tag == GST_RIFF_TAG_JUNQ || + tag == GST_RIFF_TAG_bext || tag == GST_RIFF_TAG_BEXT || + tag == GST_RIFF_TAG_LIST || tag == GST_RIFF_TAG_ID32 || + tag == GST_RIFF_TAG_IDVX) { + GST_DEBUG_OBJECT (wav, "skipping %" GST_FOURCC_FORMAT " chunk", + GST_FOURCC_ARGS (tag)); + gst_buffer_unref (buf); + buf = NULL; + continue; + } + + if (tag != GST_RIFF_TAG_fmt) + goto invalid_wav; + + if (!(gst_riff_parse_strf_auds (GST_ELEMENT_CAST (wav), buf, &header, + &extra))) + goto parse_header_error; + + buf = NULL; /* parse_strf_auds() took ownership of buffer */ + + /* do sanity checks of header fields */ + if (header->channels == 0) + goto no_channels; + if (header->rate == 0) + goto no_rate; + + GST_DEBUG_OBJECT (wav, "creating the caps"); + + /* Note: gst_riff_create_audio_caps might need to fix values in + * the header header depending on the format, so call it first */ + caps = gst_riff_create_audio_caps (header->format, NULL, header, extra, + NULL, &codec_name); + + if (extra) + gst_buffer_unref (extra); + + if (!caps) + goto unknown_format; + + /* do more sanity checks of header fields + * (these can be sanitized by gst_riff_create_audio_caps() + */ + wav->format = header->format; + wav->rate = header->rate; + wav->channels = header->channels; + wav->blockalign = header->blockalign; + wav->depth = header->size; + wav->av_bps = header->av_bps; + wav->vbr = FALSE; + + g_free (header); + header = NULL; + + /* do format specific handling */ + switch (wav->format) { + case GST_RIFF_WAVE_FORMAT_MPEGL12: + case GST_RIFF_WAVE_FORMAT_MPEGL3: + { + /* Note: workaround for mp2/mp3 embedded in wav, that relies on the + * bitrate inside the mpeg stream */ + GST_INFO ("resetting bps from %d to 0 for mp2/3", wav->av_bps); + wav->bps = 0; + break; + } + case GST_RIFF_WAVE_FORMAT_PCM: + if (wav->blockalign > wav->channels * (guint) ceil (wav->depth / 8.0)) + goto invalid_blockalign; + /* fall through */ + default: + if (wav->av_bps > wav->blockalign * wav->rate) + goto invalid_bps; + /* use the configured bps */ + wav->bps = wav->av_bps; + break; + } + + wav->width = (wav->blockalign * 8) / wav->channels; + wav->bytes_per_sample = wav->channels * wav->width / 8; + + if (wav->bytes_per_sample <= 0) + goto no_bytes_per_sample; + + GST_DEBUG_OBJECT (wav, "blockalign = %u", (guint) wav->blockalign); + GST_DEBUG_OBJECT (wav, "width = %u", (guint) wav->width); + GST_DEBUG_OBJECT (wav, "depth = %u", (guint) wav->depth); + GST_DEBUG_OBJECT (wav, "av_bps = %u", (guint) wav->av_bps); + GST_DEBUG_OBJECT (wav, "frequency = %u", (guint) wav->rate); + GST_DEBUG_OBJECT (wav, "channels = %u", (guint) wav->channels); + GST_DEBUG_OBJECT (wav, "bytes_per_sample = %u", wav->bytes_per_sample); + + /* bps can be 0 when we don't have a valid bitrate (mostly for compressed + * formats). This will make the element output a BYTE format segment and + * will not timestamp the outgoing buffers. + */ + GST_DEBUG_OBJECT (wav, "bps = %u", (guint) wav->bps); + + GST_DEBUG_OBJECT (wav, "caps = %" GST_PTR_FORMAT, caps); + + /* create pad later so we can sniff the first few bytes + * of the real data and correct our caps if necessary */ + gst_caps_replace (&wav->caps, caps); + gst_caps_replace (&caps, NULL); + + wav->got_fmt = TRUE; + + if (codec_name) { + wav->tags = gst_tag_list_new (); + + gst_tag_list_add (wav->tags, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, codec_name, NULL); +#ifdef WAVPARSER_MODIFICATION + gst_tag_list_add (wav->tags, GST_TAG_MERGE_REPLACE, + GST_TAG_BITRATE, (guint)(wav->av_bps*8), NULL); // bitrate +#endif + g_free (codec_name); + codec_name = NULL; + } + + } + + bformat = GST_FORMAT_BYTES; + gst_pad_query_peer_duration (wav->sinkpad, &bformat, &upstream_size); + GST_DEBUG_OBJECT (wav, "upstream size %" G_GUINT64_FORMAT, upstream_size); + + /* loop headers until we get data */ + while (!gotdata) { + if (wav->streaming) { + if (!gst_wavparse_peek_chunk_info (wav, &tag, &size)) + goto exit; + } else { + if ((res = + gst_pad_pull_range (wav->sinkpad, wav->offset, 8, + &buf)) != GST_FLOW_OK) + goto header_read_error; + tag = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); + size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf) + 4); + } + + GST_INFO_OBJECT (wav, + "Got TAG: %" GST_FOURCC_FORMAT ", offset %" G_GUINT64_FORMAT, + GST_FOURCC_ARGS (tag), wav->offset); + + /* wav is a st00pid format, we don't know for sure where data starts. + * So we have to go bit by bit until we find the 'data' header + */ + switch (tag) { + case GST_RIFF_TAG_data:{ + GST_DEBUG_OBJECT (wav, "Got 'data' TAG, size : %d", size); + if (wav->streaming) { + gst_adapter_flush (wav->adapter, 8); + gotdata = TRUE; + } else { + gst_buffer_unref (buf); + } + wav->offset += 8; + wav->datastart = wav->offset; + /* If size is zero, then the data chunk probably actually extends to + the end of the file */ + if (size == 0 && upstream_size) { + size = upstream_size - wav->datastart; + } + /* Or the file might be truncated */ + else if (upstream_size) { + size = MIN (size, (upstream_size - wav->datastart)); + } + wav->datasize = (guint64) size; + wav->dataleft = (guint64) size; + wav->end_offset = size + wav->datastart; + if (!wav->streaming) { + /* We will continue parsing tags 'till end */ + wav->offset += size; + } + GST_DEBUG_OBJECT (wav, "datasize = %d", size); + break; + } + case GST_RIFF_TAG_fact:{ + if (wav->format != GST_RIFF_WAVE_FORMAT_MPEGL12 && + wav->format != GST_RIFF_WAVE_FORMAT_MPEGL3) { + const guint data_size = 4; + + GST_INFO_OBJECT (wav, "Have fact chunk"); + if (size < data_size) { + if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) { + /* need more data */ + goto exit; + } + GST_DEBUG_OBJECT (wav, "need %d, available %d; ignoring chunk", + data_size, size); + break; + } + /* number of samples (for compressed formats) */ + if (wav->streaming) { + const guint8 *data = NULL; + + if (!gst_wavparse_peek_chunk (wav, &tag, &size)) { + goto exit; + } + gst_adapter_flush (wav->adapter, 8); + data = gst_adapter_peek (wav->adapter, data_size); + wav->fact = GST_READ_UINT32_LE (data); + gst_adapter_flush (wav->adapter, GST_ROUND_UP_2 (size)); + } else { + gst_buffer_unref (buf); + if ((res = + gst_pad_pull_range (wav->sinkpad, wav->offset + 8, + data_size, &buf)) != GST_FLOW_OK) + goto header_read_error; + wav->fact = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); + gst_buffer_unref (buf); + } + GST_DEBUG_OBJECT (wav, "have fact %u", wav->fact); + wav->offset += 8 + GST_ROUND_UP_2 (size); + break; + } else { + if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) { + /* need more data */ + goto exit; + } + } + break; + } + case GST_RIFF_TAG_acid:{ + const gst_riff_acid *acid = NULL; + const guint data_size = sizeof (gst_riff_acid); + + GST_INFO_OBJECT (wav, "Have acid chunk"); + if (size < data_size) { + if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) { + /* need more data */ + goto exit; + } + GST_DEBUG_OBJECT (wav, "need %d, available %d; ignoring chunk", + data_size, size); + break; + } + if (wav->streaming) { + if (!gst_wavparse_peek_chunk (wav, &tag, &size)) { + goto exit; + } + gst_adapter_flush (wav->adapter, 8); + acid = (const gst_riff_acid *) gst_adapter_peek (wav->adapter, + data_size); + } else { + gst_buffer_unref (buf); + if ((res = + gst_pad_pull_range (wav->sinkpad, wav->offset + 8, + size, &buf)) != GST_FLOW_OK) + goto header_read_error; + acid = (const gst_riff_acid *) GST_BUFFER_DATA (buf); + } + /* send data as tags */ + if (!wav->tags) + wav->tags = gst_tag_list_new (); + gst_tag_list_add (wav->tags, GST_TAG_MERGE_REPLACE, + GST_TAG_BEATS_PER_MINUTE, acid->tempo, NULL); + + size = GST_ROUND_UP_2 (size); + if (wav->streaming) { + gst_adapter_flush (wav->adapter, size); + } else { + gst_buffer_unref (buf); + } + wav->offset += 8 + size; + break; + } + /* FIXME: all list tags after data are ignored in streaming mode */ + case GST_RIFF_TAG_LIST:{ + guint32 ltag; + + if (wav->streaming) { + const guint8 *data = NULL; + + if (gst_adapter_available (wav->adapter) < 12) { + goto exit; + } + data = gst_adapter_peek (wav->adapter, 12); + ltag = GST_READ_UINT32_LE (data + 8); + } else { + gst_buffer_unref (buf); + if ((res = + gst_pad_pull_range (wav->sinkpad, wav->offset, 12, + &buf)) != GST_FLOW_OK) + goto header_read_error; + ltag = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf) + 8); + } + switch (ltag) { + case GST_RIFF_LIST_INFO:{ + const gint data_size = size - 4; + GstTagList *new; + + GST_INFO_OBJECT (wav, "Have LIST chunk INFO size %u", data_size); + if (wav->streaming) { + if (!gst_wavparse_peek_chunk (wav, &tag, &size)) { + goto exit; + } + gst_adapter_flush (wav->adapter, 12); + wav->offset += 12; + if (data_size > 0) { + buf = gst_adapter_take_buffer (wav->adapter, data_size); + if (data_size & 1) + gst_adapter_flush (wav->adapter, 1); + } + } else { + wav->offset += 12; + gst_buffer_unref (buf); + if (data_size > 0) { + if ((res = + gst_pad_pull_range (wav->sinkpad, wav->offset, + data_size, &buf)) != GST_FLOW_OK) + goto header_read_error; + } + } + if (data_size > 0) { + /* parse tags */ + gst_riff_parse_info (GST_ELEMENT (wav), buf, &new); + if (new) { + GstTagList *old = wav->tags; + wav->tags = + gst_tag_list_merge (old, new, GST_TAG_MERGE_REPLACE); + if (old) + gst_tag_list_free (old); + gst_tag_list_free (new); + } + gst_buffer_unref (buf); + wav->offset += GST_ROUND_UP_2 (data_size); + } + break; + } + default: + GST_INFO_OBJECT (wav, "Ignoring LIST chunk %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (ltag)); + if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) + /* need more data */ + goto exit; + break; + } + break; + } + default: + if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) + /* need more data */ + goto exit; + break; + } + + if (upstream_size && (wav->offset >= upstream_size)) { + /* Now we are gone through the whole file */ + gotdata = TRUE; + } + } + + GST_DEBUG_OBJECT (wav, "Finished parsing headers"); + + if (wav->bps <= 0 && wav->fact) { +#if 0 + /* not a good idea, as for embedded mp2/mp3 we set bps to 0 earlier */ + wav->bps = + (guint32) gst_util_uint64_scale ((guint64) wav->rate, wav->datasize, + (guint64) wav->fact); + GST_INFO_OBJECT (wav, "calculated bps : %d, enabling VBR", wav->bps); +#endif + wav->vbr = TRUE; + } + + if (gst_wavparse_calculate_duration (wav)) { + gst_segment_init (&wav->segment, GST_FORMAT_TIME); + gst_segment_set_duration (&wav->segment, GST_FORMAT_TIME, wav->duration); + } else { + /* no bitrate, let downstream peer do the math, we'll feed it bytes. */ + gst_segment_init (&wav->segment, GST_FORMAT_BYTES); + gst_segment_set_duration (&wav->segment, GST_FORMAT_BYTES, wav->datasize); + } + + /* now we have all the info to perform a pending seek if any, if no + * event, this will still do the right thing and it will also send + * the right newsegment event downstream. */ + gst_wavparse_perform_seek (wav, wav->seek_event); + /* remove pending event */ + event_p = &wav->seek_event; + gst_event_replace (event_p, NULL); + + /* we just started, we are discont */ + wav->discont = TRUE; + + wav->state = GST_WAVPARSE_DATA; + + /* determine reasonable max buffer size, + * that is, buffers not too small either size or time wise + * so we do not end up with too many of them */ + /* var abuse */ + upstream_size = 0; + gst_wavparse_time_to_bytepos (wav, 40 * GST_MSECOND, &upstream_size); + wav->max_buf_size = upstream_size; + wav->max_buf_size = MAX (wav->max_buf_size, MAX_BUFFER_SIZE); + if (wav->blockalign > 0) + wav->max_buf_size -= (wav->max_buf_size % wav->blockalign); + + GST_DEBUG_OBJECT (wav, "max buffer size %d", wav->max_buf_size); + + return GST_FLOW_OK; + + /* ERROR */ +exit: + { + if (codec_name) + g_free (codec_name); + if (header) + g_free (header); + if (caps) + gst_caps_unref (caps); + return res; + } +fail: + { + res = GST_FLOW_ERROR; + goto exit; + } +invalid_wav: + { + GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), + ("Invalid WAV header (no fmt at start): %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + goto fail; + } +parse_header_error: + { + GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), + ("Couldn't parse audio header")); + goto fail; + } +no_channels: + { + GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), + ("Stream claims to contain no channels - invalid data")); + goto fail; + } +no_rate: + { + GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), + ("Stream with sample_rate == 0 - invalid data")); + goto fail; + } +invalid_blockalign: + { + GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), + ("Stream claims blockalign = %u, which is more than %u - invalid data", + wav->blockalign, wav->channels * (guint) ceil (wav->depth / 8.0))); + goto fail; + } +invalid_bps: + { + GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), + ("Stream claims av_bsp = %u, which is more than %u - invalid data", + wav->av_bps, wav->blockalign * wav->rate)); + goto fail; + } +no_bytes_per_sample: + { + GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), + ("Could not caluclate bytes per sample - invalid data")); + goto fail; + } +unknown_format: + { + GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), + ("No caps found for format 0x%x, %d channels, %d Hz", + wav->format, wav->channels, wav->rate)); + goto fail; + } +header_read_error: + { + GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), + ("Couldn't read in header %d (%s)", res, gst_flow_get_name (res))); + goto fail; + } +} + +/* + * Read WAV file tag when streaming + */ +static GstFlowReturn +gst_wavparse_parse_stream_init (GstWavParse * wav) +{ + if (gst_adapter_available (wav->adapter) >= 12) { + GstBuffer *tmp; + + /* _take flushes the data */ + tmp = gst_adapter_take_buffer (wav->adapter, 12); + + GST_DEBUG ("Parsing wav header"); + if (!gst_wavparse_parse_file_header (GST_ELEMENT_CAST (wav), tmp)) + return GST_FLOW_ERROR; + + wav->offset += 12; + /* Go to next state */ + wav->state = GST_WAVPARSE_HEADER; + } + return GST_FLOW_OK; +} + +/* handle an event sent directly to the element. + * + * This event can be sent either in the READY state or the + * >READY state. The only event of interest really is the seek + * event. + * + * In the READY state we can only store the event and try to + * respect it when going to PAUSED. We assume we are in the + * READY state when our parsing state != GST_WAVPARSE_DATA. + * + * When we are steaming, we can simply perform the seek right + * away. + */ +static gboolean +gst_wavparse_send_event (GstElement * element, GstEvent * event) +{ + GstWavParse *wav = GST_WAVPARSE (element); + gboolean res = FALSE; + GstEvent **event_p; + + GST_DEBUG_OBJECT (wav, "received event %s", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + if (wav->state == GST_WAVPARSE_DATA) { + /* we can handle the seek directly when streaming data */ + res = gst_wavparse_perform_seek (wav, event); + } else { + GST_DEBUG_OBJECT (wav, "queuing seek for later"); + + event_p = &wav->seek_event; + gst_event_replace (event_p, event); + + /* we always return true */ + res = TRUE; + } + break; + default: + break; + } + gst_event_unref (event); + return res; +} + +static gboolean +gst_wavparse_have_dts_caps (const GstCaps * caps, GstTypeFindProbability prob) +{ + GstStructure *s; + + s = gst_caps_get_structure (caps, 0); + if (!gst_structure_has_name (s, "audio/x-dts")) + return FALSE; + if (prob >= GST_TYPE_FIND_LIKELY) + return TRUE; + /* DTS at non-0 offsets and without second sync may yield POSSIBLE .. */ + if (prob < GST_TYPE_FIND_POSSIBLE) + return FALSE; + /* .. in which case we want at least a valid-looking rate and channels */ + if (!gst_structure_has_field (s, "channels")) + return FALSE; + /* and for extra assurance we could also check the rate from the DTS frame + * against the one in the wav header, but for now let's not do that */ + return gst_structure_has_field (s, "rate"); +} + +static void +gst_wavparse_add_src_pad (GstWavParse * wav, GstBuffer * buf) +{ + GstStructure *s; + + GST_DEBUG_OBJECT (wav, "adding src pad"); + + if (wav->caps) { + s = gst_caps_get_structure (wav->caps, 0); + if (s && gst_structure_has_name (s, "audio/x-raw-int") && buf != NULL) { + GstTypeFindProbability prob; + GstCaps *tf_caps; + + tf_caps = gst_type_find_helper_for_buffer (GST_OBJECT (wav), buf, &prob); + if (tf_caps != NULL) { + GST_LOG ("typefind caps = %" GST_PTR_FORMAT ", P=%d", tf_caps, prob); + if (gst_wavparse_have_dts_caps (tf_caps, prob)) { + GST_INFO_OBJECT (wav, "Found DTS marker in file marked as raw PCM"); + gst_caps_unref (wav->caps); + wav->caps = tf_caps; + + gst_tag_list_add (wav->tags, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, "dts", NULL); + } else { + GST_DEBUG_OBJECT (wav, "found caps %" GST_PTR_FORMAT " for stream " + "marked as raw PCM audio, but ignoring for now", tf_caps); + gst_caps_unref (tf_caps); + } + } + } + } + + gst_wavparse_create_sourcepad (wav); + gst_pad_set_active (wav->srcpad, TRUE); + gst_pad_set_caps (wav->srcpad, wav->caps); + gst_caps_replace (&wav->caps, NULL); + + gst_element_add_pad (GST_ELEMENT_CAST (wav), wav->srcpad); + gst_element_no_more_pads (GST_ELEMENT_CAST (wav)); + + if (wav->close_segment) { + GST_DEBUG_OBJECT (wav, "Send close segment event on newpad"); + gst_pad_push_event (wav->srcpad, wav->close_segment); + wav->close_segment = NULL; + } + if (wav->start_segment) { + GST_DEBUG_OBJECT (wav, "Send start segment event on newpad"); + gst_pad_push_event (wav->srcpad, wav->start_segment); + wav->start_segment = NULL; + } + + if (wav->tags) { + gst_element_found_tags_for_pad (GST_ELEMENT_CAST (wav), wav->srcpad, + wav->tags); + wav->tags = NULL; + } +} + +static GstFlowReturn +gst_wavparse_stream_data (GstWavParse * wav) +{ + GstBuffer *buf = NULL; + GstFlowReturn res = GST_FLOW_OK; + guint64 desired, obtained; + GstClockTime timestamp, next_timestamp, duration; + guint64 pos, nextpos; + +iterate_adapter: + GST_LOG_OBJECT (wav, + "offset: %" G_GINT64_FORMAT " , end: %" G_GINT64_FORMAT " , dataleft: %" + G_GINT64_FORMAT, wav->offset, wav->end_offset, wav->dataleft); + + /* Get the next n bytes and output them */ + if (wav->dataleft == 0 || wav->dataleft < wav->blockalign) + goto found_eos; + + /* scale the amount of data by the segment rate so we get equal + * amounts of data regardless of the playback rate */ + desired = + MIN (gst_guint64_to_gdouble (wav->dataleft), + wav->max_buf_size * wav->segment.abs_rate); + + if (desired >= wav->blockalign && wav->blockalign > 0) + desired -= (desired % wav->blockalign); + + GST_LOG_OBJECT (wav, "Fetching %" G_GINT64_FORMAT " bytes of data " + "from the sinkpad", desired); + + if (wav->streaming) { + guint avail = gst_adapter_available (wav->adapter); + guint extra; + + /* flush some bytes if evil upstream sends segment that starts + * before data or does is not send sample aligned segment */ + if (G_LIKELY (wav->offset >= wav->datastart)) { + extra = (wav->offset - wav->datastart) % wav->bytes_per_sample; + } else { + extra = wav->datastart - wav->offset; + } + + if (G_UNLIKELY (extra)) { + extra = wav->bytes_per_sample - extra; + if (extra <= avail) { + GST_DEBUG_OBJECT (wav, "flushing %d bytes to sample boundary", extra); + gst_adapter_flush (wav->adapter, extra); + wav->offset += extra; + wav->dataleft -= extra; + goto iterate_adapter; + } else { + GST_DEBUG_OBJECT (wav, "flushing %d bytes", avail); + gst_adapter_clear (wav->adapter); + wav->offset += avail; + wav->dataleft -= avail; + return GST_FLOW_OK; + } + } + + if (avail < desired) { + GST_LOG_OBJECT (wav, "Got only %d bytes of data from the sinkpad", avail); + return GST_FLOW_OK; + } + + buf = gst_adapter_take_buffer (wav->adapter, desired); + } else { + if ((res = gst_pad_pull_range (wav->sinkpad, wav->offset, + desired, &buf)) != GST_FLOW_OK) + goto pull_error; + + /* we may get a short buffer at the end of the file */ + if (GST_BUFFER_SIZE (buf) < desired) { + GST_LOG_OBJECT (wav, "Got only %u bytes of data", GST_BUFFER_SIZE (buf)); + if (GST_BUFFER_SIZE (buf) >= wav->blockalign) { + buf = gst_buffer_make_metadata_writable (buf); + GST_BUFFER_SIZE (buf) -= (GST_BUFFER_SIZE (buf) % wav->blockalign); + } else { + gst_buffer_unref (buf); + goto found_eos; + } + } + } + + obtained = GST_BUFFER_SIZE (buf); + + /* our positions in bytes */ + pos = wav->offset - wav->datastart; + nextpos = pos + obtained; + + /* update offsets, does not overflow. */ + GST_BUFFER_OFFSET (buf) = pos / wav->bytes_per_sample; + GST_BUFFER_OFFSET_END (buf) = nextpos / wav->bytes_per_sample; + + /* first chunk of data? create the source pad. We do this only here so + * we can detect broken .wav files with dts disguised as raw PCM (sigh) */ + if (G_UNLIKELY (wav->first)) { + wav->first = FALSE; + /* this will also push the segment events */ + gst_wavparse_add_src_pad (wav, buf); + } else { + /* If we have a pending close/start segment, send it now. */ + if (G_UNLIKELY (wav->close_segment != NULL)) { + gst_pad_push_event (wav->srcpad, wav->close_segment); + wav->close_segment = NULL; + } + if (G_UNLIKELY (wav->start_segment != NULL)) { + gst_pad_push_event (wav->srcpad, wav->start_segment); + wav->start_segment = NULL; + } + } + + if (wav->bps > 0) { + /* and timestamps if we have a bitrate, be careful for overflows */ + timestamp = uint64_ceiling_scale (pos, GST_SECOND, (guint64) wav->bps); + next_timestamp = + uint64_ceiling_scale (nextpos, GST_SECOND, (guint64) wav->bps); + duration = next_timestamp - timestamp; + + /* update current running segment position */ + if (G_LIKELY (next_timestamp >= wav->segment.start)) + gst_segment_set_last_stop (&wav->segment, GST_FORMAT_TIME, + next_timestamp); + } else if (wav->fact) { + guint64 bps = + gst_util_uint64_scale_int (wav->datasize, wav->rate, wav->fact); + /* and timestamps if we have a bitrate, be careful for overflows */ + timestamp = uint64_ceiling_scale (pos, GST_SECOND, bps); + next_timestamp = uint64_ceiling_scale (nextpos, GST_SECOND, bps); + duration = next_timestamp - timestamp; + } else { + /* no bitrate, all we know is that the first sample has timestamp 0, all + * other positions and durations have unknown timestamp. */ + if (pos == 0) + timestamp = 0; + else + timestamp = GST_CLOCK_TIME_NONE; + duration = GST_CLOCK_TIME_NONE; + /* update current running segment position with byte offset */ + if (G_LIKELY (nextpos >= wav->segment.start)) + gst_segment_set_last_stop (&wav->segment, GST_FORMAT_BYTES, nextpos); + } + if ((pos > 0) && wav->vbr) { + /* don't set timestamps for VBR files if it's not the first buffer */ + timestamp = GST_CLOCK_TIME_NONE; + duration = GST_CLOCK_TIME_NONE; + } + if (wav->discont) { + GST_DEBUG_OBJECT (wav, "marking DISCONT"); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + wav->discont = FALSE; + } + + GST_BUFFER_TIMESTAMP (buf) = timestamp; + GST_BUFFER_DURATION (buf) = duration; + + /* don't forget to set the caps on the buffer */ + gst_buffer_set_caps (buf, GST_PAD_CAPS (wav->srcpad)); + + GST_LOG_OBJECT (wav, + "Got buffer. timestamp:%" GST_TIME_FORMAT " , duration:%" GST_TIME_FORMAT + ", size:%u", GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration), + GST_BUFFER_SIZE (buf)); + + if ((res = gst_pad_push (wav->srcpad, buf)) != GST_FLOW_OK) + goto push_error; + + if (obtained < wav->dataleft) { + wav->offset += obtained; + wav->dataleft -= obtained; + } else { + wav->offset += wav->dataleft; + wav->dataleft = 0; + } + + /* Iterate until need more data, so adapter size won't grow */ + if (wav->streaming) { + GST_LOG_OBJECT (wav, + "offset: %" G_GINT64_FORMAT " , end: %" G_GINT64_FORMAT, wav->offset, + wav->end_offset); + goto iterate_adapter; + } + return res; + + /* ERROR */ +found_eos: + { + GST_DEBUG_OBJECT (wav, "found EOS"); + return GST_FLOW_UNEXPECTED; + } +pull_error: + { + /* check if we got EOS */ + if (res == GST_FLOW_UNEXPECTED) + goto found_eos; + + GST_WARNING_OBJECT (wav, + "Error getting %" G_GINT64_FORMAT " bytes from the " + "sinkpad (dataleft = %" G_GINT64_FORMAT ")", desired, wav->dataleft); + return res; + } +push_error: + { + GST_INFO_OBJECT (wav, + "Error pushing on srcpad %s:%s, reason %s, is linked? = %d", + GST_DEBUG_PAD_NAME (wav->srcpad), gst_flow_get_name (res), + gst_pad_is_linked (wav->srcpad)); + return res; + } +} + +static void +gst_wavparse_loop (GstPad * pad) +{ + GstFlowReturn ret; + GstWavParse *wav = GST_WAVPARSE (GST_PAD_PARENT (pad)); + + GST_LOG_OBJECT (wav, "process data"); + + switch (wav->state) { + case GST_WAVPARSE_START: + GST_INFO_OBJECT (wav, "GST_WAVPARSE_START"); + if ((ret = gst_wavparse_stream_init (wav)) != GST_FLOW_OK) + goto pause; + + wav->state = GST_WAVPARSE_HEADER; + /* fall-through */ + + case GST_WAVPARSE_HEADER: + GST_INFO_OBJECT (wav, "GST_WAVPARSE_HEADER"); + if ((ret = gst_wavparse_stream_headers (wav)) != GST_FLOW_OK) + goto pause; + + wav->state = GST_WAVPARSE_DATA; + GST_INFO_OBJECT (wav, "GST_WAVPARSE_DATA"); + /* fall-through */ + + case GST_WAVPARSE_DATA: + if ((ret = gst_wavparse_stream_data (wav)) != GST_FLOW_OK) + goto pause; + break; + default: + g_assert_not_reached (); + } + return; + + /* ERRORS */ +pause: + { + const gchar *reason = gst_flow_get_name (ret); + + GST_DEBUG_OBJECT (wav, "pausing task, reason %s", reason); + wav->segment_running = FALSE; + gst_pad_pause_task (pad); + + if (ret == GST_FLOW_UNEXPECTED) { + /* add pad before we perform EOS */ + if (G_UNLIKELY (wav->first)) { + wav->first = FALSE; + gst_wavparse_add_src_pad (wav, NULL); + } + + if (wav->state == GST_WAVPARSE_START) + GST_ELEMENT_ERROR (wav, STREAM, WRONG_TYPE, + ("No valid input found before end of stream"), (NULL)); + + /* perform EOS logic */ + if (wav->segment.flags & GST_SEEK_FLAG_SEGMENT) { + GstClockTime stop; + + if ((stop = wav->segment.stop) == -1) + stop = wav->segment.duration; + + gst_element_post_message (GST_ELEMENT_CAST (wav), + gst_message_new_segment_done (GST_OBJECT_CAST (wav), + wav->segment.format, stop)); + } else { + if (wav->srcpad != NULL) + gst_pad_push_event (wav->srcpad, gst_event_new_eos ()); + } + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + /* for fatal errors we post an error message, post the error + * first so the app knows about the error first. */ + GST_ELEMENT_ERROR (wav, STREAM, FAILED, + (_("Internal data flow error.")), + ("streaming task paused, reason %s (%d)", reason, ret)); + if (wav->srcpad != NULL) + gst_pad_push_event (wav->srcpad, gst_event_new_eos ()); + } + return; + } +} + +static GstFlowReturn +gst_wavparse_chain (GstPad * pad, GstBuffer * buf) +{ + GstFlowReturn ret; + GstWavParse *wav = GST_WAVPARSE (GST_PAD_PARENT (pad)); + + GST_LOG_OBJECT (wav, "adapter_push %u bytes", GST_BUFFER_SIZE (buf)); + + gst_adapter_push (wav->adapter, buf); + + switch (wav->state) { + case GST_WAVPARSE_START: + GST_INFO_OBJECT (wav, "GST_WAVPARSE_START"); + if ((ret = gst_wavparse_parse_stream_init (wav)) != GST_FLOW_OK) + goto done; + + if (wav->state != GST_WAVPARSE_HEADER) + break; + + /* otherwise fall-through */ + case GST_WAVPARSE_HEADER: + GST_INFO_OBJECT (wav, "GST_WAVPARSE_HEADER"); + if ((ret = gst_wavparse_stream_headers (wav)) != GST_FLOW_OK) + goto done; + + if (!wav->got_fmt || wav->datastart == 0) + break; + + wav->state = GST_WAVPARSE_DATA; + GST_INFO_OBJECT (wav, "GST_WAVPARSE_DATA"); + + /* fall-through */ + case GST_WAVPARSE_DATA: + if (buf && GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) + wav->discont = TRUE; + if ((ret = gst_wavparse_stream_data (wav)) != GST_FLOW_OK) + goto done; + break; + default: + g_return_val_if_reached (GST_FLOW_ERROR); + } +done: + if (G_UNLIKELY (wav->abort_buffering)) { + wav->abort_buffering = FALSE; + ret = GST_FLOW_ERROR; + /* sort of demux/parse error */ + GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), ("unhandled buffer size")); + } + + return ret; +} + +static GstFlowReturn +gst_wavparse_flush_data (GstWavParse * wav) +{ + GstFlowReturn ret = GST_FLOW_OK; + guint av; + + if ((av = gst_adapter_available (wav->adapter)) > 0) { + wav->dataleft = av; + wav->end_offset = wav->offset + av; + ret = gst_wavparse_stream_data (wav); + } + + return ret; +} + +static gboolean +gst_wavparse_sink_event (GstPad * pad, GstEvent * event) +{ + GstWavParse *wav = GST_WAVPARSE (GST_PAD_PARENT (pad)); + gboolean ret = TRUE; + + GST_LOG_OBJECT (wav, "handling %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time, offset = 0, end_offset = -1; + gboolean update; + GstSegment segment; + + /* some debug output */ + gst_segment_init (&segment, GST_FORMAT_UNDEFINED); + gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, + &start, &stop, &time); + gst_segment_set_newsegment_full (&segment, update, rate, arate, format, + start, stop, time); + GST_DEBUG_OBJECT (wav, + "received format %d newsegment %" GST_SEGMENT_FORMAT, format, + &segment); + + if (wav->state != GST_WAVPARSE_DATA) { + GST_DEBUG_OBJECT (wav, "still starting, eating event"); + goto exit; + } + + /* now we are either committed to TIME or BYTE format, + * and we only expect a BYTE segment, e.g. following a seek */ + if (format == GST_FORMAT_BYTES) { + if (start > 0) { + offset = start; + start -= wav->datastart; + start = MAX (start, 0); + } + if (stop > 0) { + end_offset = stop; + stop -= wav->datastart; + stop = MAX (stop, 0); + } + if (wav->segment.format == GST_FORMAT_TIME) { + guint64 bps = wav->bps; + + /* operating in format TIME, so we can convert */ + if (!bps && wav->fact) + bps = + gst_util_uint64_scale_int (wav->datasize, wav->rate, wav->fact); + if (bps) { + if (start >= 0) + start = + uint64_ceiling_scale (start, GST_SECOND, (guint64) wav->bps); + if (stop >= 0) + stop = + uint64_ceiling_scale (stop, GST_SECOND, (guint64) wav->bps); + } + } + } else { + GST_DEBUG_OBJECT (wav, "unsupported segment format, ignoring"); + goto exit; + } + + /* accept upstream's notion of segment and distribute along */ + gst_segment_set_newsegment_full (&wav->segment, update, rate, arate, + wav->segment.format, start, stop, start); + /* also store the newsegment event for the streaming thread */ + if (wav->start_segment) + gst_event_unref (wav->start_segment); + wav->start_segment = + gst_event_new_new_segment_full (update, rate, arate, + wav->segment.format, start, stop, start); + GST_DEBUG_OBJECT (wav, "Pushing newseg update %d, rate %g, " + "applied rate %g, format %d, start %" G_GINT64_FORMAT ", " + "stop %" G_GINT64_FORMAT, update, rate, arate, wav->segment.format, + start, stop); + + /* stream leftover data in current segment */ + gst_wavparse_flush_data (wav); + /* and set up streaming thread for next one */ + wav->offset = offset; + wav->end_offset = end_offset; + if (wav->end_offset > 0) { + wav->dataleft = wav->end_offset - wav->offset; + } else { + /* infinity; upstream will EOS when done */ + wav->dataleft = G_MAXUINT64; + } + exit: + gst_event_unref (event); + break; + } + case GST_EVENT_EOS: + /* add pad if needed so EOS is seen downstream */ + if (G_UNLIKELY (wav->first)) { + wav->first = FALSE; + gst_wavparse_add_src_pad (wav, NULL); + } else { + /* stream leftover data in current segment */ + gst_wavparse_flush_data (wav); + } + + if (wav->state == GST_WAVPARSE_START) + GST_ELEMENT_ERROR (wav, STREAM, WRONG_TYPE, + ("No valid input found before end of stream"), (NULL)); + + /* fall-through */ + case GST_EVENT_FLUSH_STOP: + gst_adapter_clear (wav->adapter); + wav->discont = TRUE; + /* fall-through */ + default: + ret = gst_pad_event_default (wav->sinkpad, event); + break; + } + + return ret; +} + +#if 0 +/* convert and query stuff */ +static const GstFormat * +gst_wavparse_get_formats (GstPad * pad) +{ + static GstFormat formats[] = { + GST_FORMAT_TIME, + GST_FORMAT_BYTES, + GST_FORMAT_DEFAULT, /* a "frame", ie a set of samples per Hz */ + 0 + }; + + return formats; +} +#endif + +static gboolean +gst_wavparse_pad_convert (GstPad * pad, + GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) +{ + GstWavParse *wavparse; + gboolean res = TRUE; + + wavparse = GST_WAVPARSE (GST_PAD_PARENT (pad)); + + if (*dest_format == src_format) { + *dest_value = src_value; + return TRUE; + } + + if ((wavparse->bps == 0) && !wavparse->fact) + goto no_bps_fact; + + GST_INFO_OBJECT (wavparse, "converting value from %s to %s", + gst_format_get_name (src_format), gst_format_get_name (*dest_format)); + + switch (src_format) { + case GST_FORMAT_BYTES: + switch (*dest_format) { + case GST_FORMAT_DEFAULT: + *dest_value = src_value / wavparse->bytes_per_sample; + /* make sure we end up on a sample boundary */ + *dest_value -= *dest_value % wavparse->bytes_per_sample; + break; + case GST_FORMAT_TIME: + /* src_value + datastart = offset */ + GST_INFO_OBJECT (wavparse, + "src=%" G_GINT64_FORMAT ", offset=%" G_GINT64_FORMAT, src_value, + wavparse->offset); + if (wavparse->bps > 0) + *dest_value = uint64_ceiling_scale (src_value, GST_SECOND, + (guint64) wavparse->bps); + else if (wavparse->fact) { + guint64 bps = uint64_ceiling_scale_int (wavparse->datasize, + wavparse->rate, wavparse->fact); + + *dest_value = uint64_ceiling_scale_int (src_value, GST_SECOND, bps); + } else { + res = FALSE; + } + break; + default: + res = FALSE; + goto done; + } + break; + + case GST_FORMAT_DEFAULT: + switch (*dest_format) { + case GST_FORMAT_BYTES: + *dest_value = src_value * wavparse->bytes_per_sample; + break; + case GST_FORMAT_TIME: + *dest_value = gst_util_uint64_scale (src_value, GST_SECOND, + (guint64) wavparse->rate); + break; + default: + res = FALSE; + goto done; + } + break; + + case GST_FORMAT_TIME: + switch (*dest_format) { + case GST_FORMAT_BYTES: + if (wavparse->bps > 0) + *dest_value = gst_util_uint64_scale (src_value, + (guint64) wavparse->bps, GST_SECOND); + else { + guint64 bps = gst_util_uint64_scale_int (wavparse->datasize, + wavparse->rate, wavparse->fact); + + *dest_value = gst_util_uint64_scale (src_value, bps, GST_SECOND); + } + /* make sure we end up on a sample boundary */ + *dest_value -= *dest_value % wavparse->blockalign; + break; + case GST_FORMAT_DEFAULT: + *dest_value = gst_util_uint64_scale (src_value, + (guint64) wavparse->rate, GST_SECOND); + break; + default: + res = FALSE; + goto done; + } + break; + + default: + res = FALSE; + goto done; + } + +done: + return res; + + /* ERRORS */ +no_bps_fact: + { + GST_DEBUG_OBJECT (wavparse, "bps 0 or no fact chunk, cannot convert"); + res = FALSE; + goto done; + } +} + +static const GstQueryType * +gst_wavparse_get_query_types (GstPad * pad) +{ + static const GstQueryType types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + GST_QUERY_CONVERT, + GST_QUERY_SEEKING, + 0 + }; + + return types; +} + +/* handle queries for location and length in requested format */ +static gboolean +gst_wavparse_pad_query (GstPad * pad, GstQuery * query) +{ + gboolean res = TRUE; + GstWavParse *wav = GST_WAVPARSE (gst_pad_get_parent (pad)); + + /* only if we know */ + if (wav->state != GST_WAVPARSE_DATA) { + gst_object_unref (wav); + return FALSE; + } + + GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + gint64 curb; + gint64 cur; + GstFormat format; + + /* this is not very precise, as we have pushed severla buffer upstream for prerolling */ + curb = wav->offset - wav->datastart; + gst_query_parse_position (query, &format, NULL); + GST_INFO_OBJECT (wav, "pos query at %" G_GINT64_FORMAT, curb); + + switch (format) { + case GST_FORMAT_TIME: + res = gst_wavparse_pad_convert (pad, GST_FORMAT_BYTES, curb, + &format, &cur); + break; + default: + format = GST_FORMAT_BYTES; + cur = curb; + break; + } + if (res) + gst_query_set_position (query, format, cur); + break; + } + case GST_QUERY_DURATION: + { + gint64 duration = 0; + GstFormat format; + + gst_query_parse_duration (query, &format, NULL); + + switch (format) { + case GST_FORMAT_TIME:{ + if ((res = gst_wavparse_calculate_duration (wav))) { + duration = wav->duration; + } + break; + } + default: + format = GST_FORMAT_BYTES; + duration = wav->datasize; + break; + } + gst_query_set_duration (query, format, duration); + break; + } + case GST_QUERY_CONVERT: + { + gint64 srcvalue, dstvalue; + GstFormat srcformat, dstformat; + + gst_query_parse_convert (query, &srcformat, &srcvalue, + &dstformat, &dstvalue); + res = gst_wavparse_pad_convert (pad, srcformat, srcvalue, + &dstformat, &dstvalue); + if (res) + gst_query_set_convert (query, srcformat, srcvalue, dstformat, dstvalue); + break; + } + case GST_QUERY_SEEKING:{ + GstFormat fmt; + gboolean seekable = FALSE; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if (fmt == wav->segment.format) { + if (wav->streaming) { + GstQuery *q; + + q = gst_query_new_seeking (GST_FORMAT_BYTES); + if ((res = gst_pad_peer_query (wav->sinkpad, q))) { + gst_query_parse_seeking (q, &fmt, &seekable, NULL, NULL); + GST_LOG_OBJECT (wav, "upstream BYTE seekable %d", seekable); + } + gst_query_unref (q); + } else { + GST_LOG_OBJECT (wav, "looping => seekable"); + seekable = TRUE; + res = TRUE; + } + } else if (fmt == GST_FORMAT_TIME) { + res = TRUE; + } + if (res) { + gst_query_set_seeking (query, fmt, seekable, 0, wav->segment.duration); + } + break; + } + default: + res = gst_pad_query_default (pad, query); + break; + } + gst_object_unref (wav); + return res; +} + +static gboolean +gst_wavparse_srcpad_event (GstPad * pad, GstEvent * event) +{ + GstWavParse *wavparse = GST_WAVPARSE (gst_pad_get_parent (pad)); + gboolean res = FALSE; + + GST_DEBUG_OBJECT (wavparse, "%s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + /* can only handle events when we are in the data state */ + if (wavparse->state == GST_WAVPARSE_DATA) { + res = gst_wavparse_perform_seek (wavparse, event); + } + gst_event_unref (event); + break; + default: + res = gst_pad_push_event (wavparse->sinkpad, event); + break; + } + gst_object_unref (wavparse); + return res; +} + +static gboolean +gst_wavparse_sink_activate (GstPad * sinkpad) +{ + GstWavParse *wav = GST_WAVPARSE (gst_pad_get_parent (sinkpad)); + gboolean res; + + if (wav->adapter) { + gst_adapter_clear (wav->adapter); + g_object_unref (wav->adapter); + wav->adapter = NULL; + } + + if (gst_pad_check_pull_range (sinkpad)) { + GST_DEBUG ("going to pull mode"); + wav->streaming = FALSE; + res = gst_pad_activate_pull (sinkpad, TRUE); + } else { + GST_DEBUG ("going to push (streaming) mode"); + wav->streaming = TRUE; + wav->adapter = gst_adapter_new (); + res = gst_pad_activate_push (sinkpad, TRUE); + } + gst_object_unref (wav); + return res; +} + + +static gboolean +gst_wavparse_sink_activate_pull (GstPad * sinkpad, gboolean active) +{ + GstWavParse *wav = GST_WAVPARSE (GST_OBJECT_PARENT (sinkpad)); + + if (active) { + /* if we have a scheduler we can start the task */ + wav->segment_running = TRUE; + return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_wavparse_loop, + sinkpad); + } else { + wav->segment_running = FALSE; + return gst_pad_stop_task (sinkpad); + } +}; + +static GstStateChangeReturn +gst_wavparse_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstWavParse *wav = GST_WAVPARSE (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_wavparse_reset (wav); + 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: + gst_wavparse_destroy_sourcepad (wav); + gst_wavparse_reset (wav); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gst_riff_init (); + + return gst_element_register (plugin, "wavparse", GST_RANK_PRIMARY, + GST_TYPE_WAVPARSE); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "wavparse", + "Parse a .wav file into raw audio", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/wavparse/gstwavparse.h b/gst/wavparse/gstwavparse.h new file mode 100644 index 0000000..c5e7237 --- /dev/null +++ b/gst/wavparse/gstwavparse.h @@ -0,0 +1,133 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Nokia Corporation, Stefan Kost . + * + * 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_WAVPARSE_H__ +#define __GST_WAVPARSE_H__ + + +#include +#include "gst/riff/riff-ids.h" +#include "gst/riff/riff-read.h" +#include + +G_BEGIN_DECLS + +#define GST_TYPE_WAVPARSE \ + (gst_wavparse_get_type()) +#define GST_WAVPARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVPARSE,GstWavParse)) +#define GST_WAVPARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVPARSE,GstWavParseClass)) +#define GST_IS_WAVPARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVPARSE)) +#define GST_IS_WAVPARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVPARSE)) + +#define WAVPARSER_MODIFICATION + +typedef enum { + GST_WAVPARSE_START, + GST_WAVPARSE_HEADER, + GST_WAVPARSE_DATA +} GstWavParseState; + +typedef struct _GstWavParse GstWavParse; +typedef struct _GstWavParseClass GstWavParseClass; + +/** + * GstWavParse: + * + * Opaque data structure. + */ +struct _GstWavParse { + GstElement parent; + + /* pads */ + GstPad *sinkpad,*srcpad; + + /* for delayed source pad creation for when + * we have the first chunk of data and know + * the format for sure */ + GstCaps *caps; + GstTagList *tags; + GstEvent *close_segment; + GstEvent *start_segment; + + /* WAVE decoding state */ + GstWavParseState state; + gboolean abort_buffering; + + /* format of audio, see defines below */ + gint format; + + /* useful audio data */ + guint16 depth; + guint32 rate; + guint16 channels; + guint16 blockalign; + guint16 width; + guint32 av_bps; + guint32 fact; + + /* real bps used or 0 when no bitrate is known */ + guint32 bps; + gboolean vbr; + + guint bytes_per_sample; + guint max_buf_size; + + /* position in data part */ + guint64 offset; + guint64 end_offset; + guint64 dataleft; + /* offset/length of data part */ + guint64 datastart; + guint64 datasize; + /* duration in time */ + guint64 duration; + + /* pending seek */ + GstEvent *seek_event; + + /* For streaming */ + GstAdapter *adapter; + gboolean got_fmt; + gboolean streaming; + + /* configured segment, start/stop expressed in time */ + GstSegment segment; + gboolean segment_running; + + /* for late pad configuration */ + gboolean first; + /* discont after seek */ + gboolean discont; +}; + +struct _GstWavParseClass { + GstElementClass parent_class; +}; + +GType gst_wavparse_get_type(void); + +G_END_DECLS + +#endif /* __GST_WAVPARSE_H__ */ diff --git a/gst/y4m/Makefile.am b/gst/y4m/Makefile.am new file mode 100644 index 0000000..3548d8d --- /dev/null +++ b/gst/y4m/Makefile.am @@ -0,0 +1,24 @@ + +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 + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgsty4menc -:SHARED libgsty4menc \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgsty4menc_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsty4menc_la_CFLAGS) \ + -:LDFLAGS $(libgsty4menc_la_LDFLAGS) \ + $(libgsty4menc_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/y4m/Makefile.in b/gst/y4m/Makefile.in new file mode 100644 index 0000000..1791a24 --- /dev/null +++ b/gst/y4m/Makefile.in @@ -0,0 +1,818 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/y4m +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgsty4menc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libgsty4menc_la_OBJECTS = libgsty4menc_la-gsty4mencode.lo +libgsty4menc_la_OBJECTS = $(am_libgsty4menc_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgsty4menc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgsty4menc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgsty4menc_la_CFLAGS) $(CFLAGS) \ + $(libgsty4menc_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgsty4menc_la_SOURCES) +DIST_SOURCES = $(libgsty4menc_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +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 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/y4m/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/y4m/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgsty4menc.la: $(libgsty4menc_la_OBJECTS) $(libgsty4menc_la_DEPENDENCIES) $(EXTRA_libgsty4menc_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgsty4menc_la_LINK) -rpath $(plugindir) $(libgsty4menc_la_OBJECTS) $(libgsty4menc_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsty4menc_la-gsty4mencode.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgsty4menc_la-gsty4mencode.lo: gsty4mencode.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsty4menc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsty4menc_la_CFLAGS) $(CFLAGS) -MT libgsty4menc_la-gsty4mencode.lo -MD -MP -MF $(DEPDIR)/libgsty4menc_la-gsty4mencode.Tpo -c -o libgsty4menc_la-gsty4mencode.lo `test -f 'gsty4mencode.c' || echo '$(srcdir)/'`gsty4mencode.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsty4menc_la-gsty4mencode.Tpo $(DEPDIR)/libgsty4menc_la-gsty4mencode.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsty4mencode.c' object='libgsty4menc_la-gsty4mencode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsty4menc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsty4menc_la_CFLAGS) $(CFLAGS) -c -o libgsty4menc_la-gsty4mencode.lo `test -f 'gsty4mencode.c' || echo '$(srcdir)/'`gsty4mencode.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgsty4menc -:SHARED libgsty4menc \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgsty4menc_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsty4menc_la_CFLAGS) \ + -:LDFLAGS $(libgsty4menc_la_LDFLAGS) \ + $(libgsty4menc_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/y4m/gsty4mencode.c b/gst/y4m/gsty4mencode.c new file mode 100644 index 0000000..7830c95 --- /dev/null +++ b/gst/y4m/gsty4mencode.c @@ -0,0 +1,377 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Mark Nauwelaerts + * + * 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 + * + * + * + * Creates a YU4MPEG2 raw video stream as defined by the mjpegtools project. + * + * Example launch line + * + * (write everything in one line, without the backslash characters) + * + * 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 + * + * + * + * + */ + +/* see mjpegtools/yuv4mpeg.h for yuv4mpeg format */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include "gsty4mencode.h" + +/* 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, Y42B, Y41B, Y444 }")) + ); + + +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_static_pad_template (element_class, + &y4mencode_src_factory); + gst_element_class_add_static_pad_template (element_class, + &y4mencode_sink_factory); + gst_element_class_set_details_simple (element_class, "YUV4MPEG video encoder", + "Codec/Encoder/Video", + "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)", + "Wim Taymans "); +} + +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; + filter->colorspace = "unknown"; +} + +static gboolean +gst_y4m_encode_setcaps (GstPad * pad, GstCaps * vscaps) +{ + GstY4mEncode *filter; + GstStructure *structure; + gboolean res; + gint w, h; + guint32 fourcc; + const GValue *fps, *par, *interlaced; + + 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); + res &= gst_structure_get_fourcc (structure, "format", &fourcc); + + switch (fourcc) { /* Translate fourcc to Y4M colorspace code */ + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('I', 'Y', 'U', 'V'): + filter->colorspace = "420"; + break; + case GST_MAKE_FOURCC ('Y', '4', '2', 'B'): + filter->colorspace = "422"; + break; + case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): + filter->colorspace = "411"; + break; + case GST_MAKE_FOURCC ('Y', '4', '4', '4'): + filter->colorspace = "444"; + break; + default: + res = FALSE; + break; + } + + if (!res || w <= 0 || h <= 0 || !GST_VALUE_HOLDS_FRACTION (fps)) + return FALSE; + + /* optional interlaced info */ + interlaced = gst_structure_get_value (structure, "interlaced"); + + /* 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; + } + if ((interlaced != NULL) && G_VALUE_HOLDS (interlaced, G_TYPE_BOOLEAN)) { + filter->interlaced = g_value_get_boolean (interlaced); + } else { + /* assume progressive if no interlaced property in caps */ + filter->interlaced = FALSE; + } + /* 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; + gchar interlaced; + + interlaced = 'p'; + + if (filter->interlaced && filter->top_field_first) + interlaced = 't'; + else if (filter->interlaced) + interlaced = 'b'; + + header = g_strdup_printf ("YUV4MPEG2 C%s W%d H%d I%c F%d:%d A%d:%d\n", + filter->colorspace, filter->width, filter->height, interlaced, + 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; + GstClockTime timestamp; + + /* 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; + } + + timestamp = GST_BUFFER_TIMESTAMP (buf); + + if (G_UNLIKELY (!filter->header)) { + if (filter->interlaced == TRUE) { + if (GST_BUFFER_FLAG_IS_SET (buf, GST_VIDEO_BUFFER_TFF)) { + filter->top_field_first = TRUE; + } else { + filter->top_field_first = FALSE; + } + } + 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)); + + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + + 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 G_GNUC_UNUSED *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 G_GNUC_UNUSED *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_PRIMARY, + 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 new file mode 100644 index 0000000..624ab37 --- /dev/null +++ b/gst/y4m/gsty4mencode.h @@ -0,0 +1,69 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * 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 + +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; + gboolean interlaced; + gboolean top_field_first; + const gchar *colorspace; + /* 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/install-sh b/install-sh new file mode 100755 index 0000000..a9244eb --- /dev/null +++ b/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-01-19.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for `test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/ltmain.sh b/ltmain.sh new file mode 100644 index 0000000..c7d06c3 --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,9661 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.2 Debian-2.4.2-1" +TIMESTAMP="" +package_revision=1.3337 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/m4/Makefile.am b/m4/Makefile.am new file mode 100644 index 0000000..a2a60f8 --- /dev/null +++ b/m4/Makefile.am @@ -0,0 +1,39 @@ +EXTRA_DIST = \ + a52.m4 \ + aalib.m4 \ + as-arts.m4 \ + as-ffmpeg.m4 \ + as-liblame.m4 \ + as-slurp-ffmpeg.m4 \ + check-libheader.m4 \ + codeset.m4 \ + esd.m4 \ + freetype2.m4 \ + gconf-2.m4 \ + gettext.m4 \ + glibc21.m4 \ + glib.m4 \ + gst-alsa.m4 \ + gst-artsc.m4 \ + gst-fionread.m4 \ + gst-ivorbis.m4 \ + gst-matroska.m4 \ + gst-sdl.m4 \ + gst-shout2.m4 \ + gst-sid.m4 \ + gtk.m4 \ + iconv.m4 \ + intdiv0.m4 \ + inttypes_h.m4 \ + inttypes-pri.m4 \ + lcmessage.m4 \ + libfame.m4 \ + lib-ld.m4 \ + lib-link.m4 \ + libmikmod.m4 \ + lib-prefix.m4 \ + ogg.m4 \ + progtest.m4 \ + stdint_h.m4 \ + uintmax_t.m4 \ + vorbis.m4 diff --git a/m4/Makefile.in b/m4/Makefile.in new file mode 100644 index 0000000..b206372 --- /dev/null +++ b/m4/Makefile.in @@ -0,0 +1,644 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = m4 +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + a52.m4 \ + aalib.m4 \ + as-arts.m4 \ + as-ffmpeg.m4 \ + as-liblame.m4 \ + as-slurp-ffmpeg.m4 \ + check-libheader.m4 \ + codeset.m4 \ + esd.m4 \ + freetype2.m4 \ + gconf-2.m4 \ + gettext.m4 \ + glibc21.m4 \ + glib.m4 \ + gst-alsa.m4 \ + gst-artsc.m4 \ + gst-fionread.m4 \ + gst-ivorbis.m4 \ + gst-matroska.m4 \ + gst-sdl.m4 \ + gst-shout2.m4 \ + gst-sid.m4 \ + gtk.m4 \ + iconv.m4 \ + intdiv0.m4 \ + inttypes_h.m4 \ + inttypes-pri.m4 \ + lcmessage.m4 \ + libfame.m4 \ + lib-ld.m4 \ + lib-link.m4 \ + libmikmod.m4 \ + lib-prefix.m4 \ + ogg.m4 \ + progtest.m4 \ + stdint_h.m4 \ + uintmax_t.m4 \ + vorbis.m4 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu m4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/m4/README b/m4/README new file mode 100644 index 0000000..f044598 --- /dev/null +++ b/m4/README @@ -0,0 +1,3 @@ +All aclocal .m4 files we need are put here and cat'd to acinclude.m4 in +the source root. Official ones (taken from the relevant devel packages) +are named as-is, unofficial ones (or changed ones) get a gst-prefix. diff --git a/m4/a52.m4 b/m4/a52.m4 new file mode 100644 index 0000000..0065dee --- /dev/null +++ b/m4/a52.m4 @@ -0,0 +1,125 @@ +dnl +dnl A52_CHECK-LIBHEADER(FEATURE-NAME, LIB-NAME, LIB-FUNCTION, HEADER-NAME, +dnl ACTION-IF-FOUND, ACTION-IF-NOT-FOUND, +dnl EXTRA-LDFLAGS, EXTRA-CPPFLAGS) +dnl +dnl FEATURE-NAME - feature name; library and header files are treated +dnl as feature, which we look for +dnl LIB-NAME - library name as in AC_CHECK_LIB macro +dnl LIB-FUNCTION - library symbol as in AC_CHECK_LIB macro +dnl HEADER-NAME - header file name as in AC_CHECK_HEADER +dnl ACTION-IF-FOUND - when feature is found then execute given action +dnl ACTION-IF-NOT-FOUND - when feature is not found then execute given action +dnl EXTRA-LDFLAGS - extra linker flags (-L or -l) +dnl EXTRA-CPPFLAGS - extra C preprocessor flags, i.e. -I/usr/X11R6/include +dnl +dnl Based on GST_CHECK_LIBHEADER from gstreamer plugins 0.3.1. +dnl +AC_DEFUN([A52_CHECK_LIBHEADER], +[ + AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no, [$7]) + check_libheader_feature_name=translit([$1], A-Z, a-z) + + if test "x$HAVE_[$1]" = "xyes"; then + check_libheader_save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="[$8] $CPPFLAGS" + AC_CHECK_HEADER([$4], :, HAVE_[$1]=no) + CPPFLAGS=$check_libheader_save_CPPFLAGS + fi + + if test "x$HAVE_[$1]" = "xyes"; then + ifelse([$5], , :, [$5]) + else + ifelse([$6], , :, [$6]) + fi +] +) + +dnl +dnl AC_CHECK_A52DEC(ACTION-IF-FOUND, ACTION-IF-NOT-FOUND) +dnl +dnl ACTION-IF-FOUND - when feature is found then execute given action +dnl ACTION-IF-NOT-FOUND - when feature is not found then execute given action +dnl +dnl Defines HAVE_A52DEC to yes if liba52 is found +dnl +dnl CFLAGS and LDFLAGS for the library are stored in A52DEC_CFLAGS and +dnl A52DEC_LIBS, respectively +dnl +dnl Based on GST_CHECK_A52DEC from gstreamer plugins 0.3.3.1 +dnl Thomas Vander Stichele , Andy Wingo +dnl +AC_DEFUN([AC_CHECK_A52DEC], +[dnl +AC_ARG_WITH(a52dec-prefix, + AC_HELP_STRING([--with-a52dec-prefix=PFX], + [prefix where a52dec is installed (optional)]), + a52dec_config_prefix="$withval", a52dec_config_prefix="") + +if test x$a52dec_config_prefix = x ; then + A52_CHECK_LIBHEADER(A52DEC, a52, a52_init, a52dec/a52.h, + A52DEC_LIBS="-la52 -lm", , -lm) +else + A52_CHECK_LIBHEADER(A52DEC, a52, a52_init, a52dec/a52.h, [ + A52DEC_LIBS="-la52 -L$a52dec_config_prefix/lib -lm" + A52DEC_CFLAGS="-I$a52dec_config_prefix/include" + ], , -L$a52dec_config_prefix/lib, -I$a52dec_config_prefix/include) +fi + +if test $HAVE_A52DEC = "yes"; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $A52DEC_CFLAGS" + LIBS="$A52DEC_LIBS $LIBS" + AC_TRY_RUN([ +#include +#include + +int +main () +{ + a52_state_t *state; + state = a52_init (0); + a52_free (state); + return 0; +} + ],, HAVE_A52DEC=no, [echo $ac_n "cross compiling; assumed OK... $ac_c"]) + + if test HAVE_A52DEC = "no"; then + echo "*** Your a52dec is borked somehow. Please update to 0.7.4." + else + AC_TRY_RUN([ +#include +#include + +int +main () +{ + int i = sizeof (a52_state_t); + if ( i ) + return 0; +} + ], HAVE_A52DEC=no,, [echo $ac_n "cross compiling; assumed OK... $ac_c"]) + + if test HAVE_A52DEC = "no"; then + echo "*** Your a52dec is too old. Please update to 0.7.4." + fi + fi + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" +fi + +if test HAVE_A52DEC = "no"; then + A52DEC_CFLAGS="" + A52DEC_LIBS="" +fi + +if test "x$HAVE_A52DEC" = "xyes"; then + ifelse([$1], , :, [$1]) +else + ifelse([$2], , :, [$2]) +fi + +AC_SUBST(A52DEC_CFLAGS) +AC_SUBST(A52DEC_LIBS) +]) diff --git a/m4/aalib.m4 b/m4/aalib.m4 new file mode 100644 index 0000000..10e0a64 --- /dev/null +++ b/m4/aalib.m4 @@ -0,0 +1,178 @@ +# Configure paths for AALIB +# touched up for clean output by Thomas Vander Stichele +# Jan Hubicka 4/22/2001 +# stolen from Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_AALIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for AALIB, and define AALIB_CFLAGS and AALIB_LIBS +dnl +AC_DEFUN([AM_PATH_AALIB], +[dnl +dnl Get the cflags and libraries from the aalib-config script +dnl +AC_ARG_WITH(aalib-prefix, + AC_HELP_STRING([--with-aalib-prefix=PFX], + [prefix where AALIB is installed (optional)]), + aalib_prefix="$withval", aalib_prefix="") + +AC_ARG_WITH(aalib-exec-prefix, + AC_HELP_STRING([--with-aalib-exec-prefix=PFX], + [exec prefix where AALIB is installed (optional)]), + aalib_exec_prefix="$withval", aalib_exec_prefix="") + +AC_ARG_ENABLE(aalibtest, + AC_HELP_STRING([--disable-aalibtest], + [do not try to compile and run a test AALIB program]), + , enable_aalibtest=yes) + + if test x$aalib_exec_prefix != x ; then + aalib_args="$aalib_args --exec-prefix=$aalib_exec_prefix" + if test x${AALIB_CONFIG+set} != xset ; then + AALIB_CONFIG=$aalib_exec_prefix/bin/aalib-config + fi + fi + if test x$aalib_prefix != x ; then + aalib_args="$aalib_args --prefix=$aalib_prefix" + if test x${AALIB_CONFIG+set} != xset ; then + AALIB_CONFIG=$aalib_prefix/bin/aalib-config + fi + fi + + AC_PATH_PROG(AALIB_CONFIG, aalib-config, no) + min_aalib_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for AALIB - version >= $min_aalib_version) + no_aalib="" + if test "$AALIB_CONFIG" = "no" ; then + no_aalib=yes + else + AALIB_CFLAGS=`$AALIB_CONFIG $aalibconf_args --cflags` + AALIB_LIBS=`$AALIB_CONFIG $aalibconf_args --libs` + + aalib_major_version=`$AALIB_CONFIG $aalib_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + aalib_minor_version=`$AALIB_CONFIG $aalib_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + aalib_micro_version=`$AALIB_CONFIG $aalib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_aalibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $AALIB_CFLAGS" + LIBS="$LIBS $AALIB_LIBS" +dnl +dnl Now check if the installed AALIB is sufficiently new. (Also sanity +dnl checks the results of aalib-config to some extent +dnl + rm -f conf.aalibtest + AC_TRY_RUN([ +#include +#include +#include +#include "aalib.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.aalibtest"); + */ + { FILE *fp = fopen("conf.aalibtest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_aalib_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_aalib_version"); + exit(1); + } + + if (($aalib_major_version > major) || + (($aalib_major_version == major) && ($aalib_minor_version > minor)) || + (($aalib_major_version == major) && ($aalib_minor_version == minor) && ($aalib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'aalib-config --version' returned %d.%d.%d, but the minimum version\n", $aalib_major_version, $aalib_minor_version, $aalib_micro_version); + printf("*** of AALIB required is %d.%d.%d. If aalib-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If aalib-config was wrong, set the environment variable AALIB_CONFIG\n"); + printf("*** to point to the correct copy of aalib-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_aalib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_aalib" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$AALIB_CONFIG" = "no" ; then + echo "*** The aalib-config script installed by AALIB could not be found" + echo "*** If AALIB was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the AALIB_CONFIG environment variable to the" + echo "*** full path to aalib-config." + else + if test -f conf.aalibtest ; then + : + else + echo "*** Could not run AALIB test program, checking why..." + CFLAGS="$CFLAGS $AALIB_CFLAGS" + LIBS="$LIBS $AALIB_LIBS" + AC_TRY_LINK([ +#include +#include "AALIB.h" +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding AALIB or finding the wrong" + echo "*** version of AALIB. If it is not finding AALIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means AALIB was incorrectly installed" + echo "*** or that you have moved AALIB since it was installed. In the latter case, you" + echo "*** may want to edit the aalib-config script: $AALIB_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + AALIB_CFLAGS="" + AALIB_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(AALIB_CFLAGS) + AC_SUBST(AALIB_LIBS) + rm -f conf.aalibtest +]) diff --git a/m4/as-arts.m4 b/m4/as-arts.m4 new file mode 100644 index 0000000..a66a8c2 --- /dev/null +++ b/m4/as-arts.m4 @@ -0,0 +1,209 @@ +dnl as-arts.m4 0.1.0 + +dnl $Id: as-arts.m4,v 1.5 2004/05/21 11:20:49 thomasvs Exp $ +dnl if you copy this file to your cvs, +dnl add this file using cvs -ko add to retain this header + +dnl This is an example arts .m4 adapted and scrubbed by thomasvs + +# Configure paths for ARTS +# Philip Stadermann 2001-06-21 +# stolen from esd.m4 + +dnl AM_PATH_ARTS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for ARTS, and define ARTS_CXXFLAGS and ARTS_LIBS +dnl +AC_DEFUN([AM_PATH_ARTS], +[dnl +dnl Get the cflags and libraries from the artsc-config script +dnl +AC_ARG_WITH(arts-prefix, + AC_HELP_STRING([--with-arts-prefix=PFX], + [prefix where ARTS is installed (optional)]), + arts_prefix="$withval", arts_prefix="") + +AC_ARG_WITH(arts-exec-prefix, + AC_HELP_STRING([--with-arts-exec-prefix=PFX], + [exec prefix where ARTS is installed (optional)]), + arts_exec_prefix="$withval", arts_exec_prefix="") + +AC_ARG_ENABLE(artstest, + AC_HELP_STRING([--disable-artstest], + [do not try to compile and run a test ARTS program]), + , enable_artstest=yes) + + if test x$arts_exec_prefix != x ; then + arts_args="$arts_args --exec-prefix=$arts_exec_prefix" + if test x${ARTS_CONFIG+set} != xset ; then + ARTS_CONFIG=$arts_exec_prefix/bin/artsc-config + fi + fi + if test x$arts_prefix != x ; then + arts_args="$arts_args --prefix=$arts_prefix" + if test x${ARTS_CONFIG+set} != xset ; then + ARTS_CONFIG=$arts_prefix/bin/artsc-config + fi + fi + + AC_PATH_PROG(ARTS_CONFIG, artsc-config, no) + min_arts_version=ifelse([$1], ,0.9.5,$1) + AC_MSG_CHECKING(for ARTS artsc - version >= $min_arts_version) + no_arts="" + if test "$ARTS_CONFIG" = "no" ; then + no_arts=yes + else + # FIXME: thomas added this sed to get arts path instead of artsc + # replace -I.../artsc with -I.../arts + ARTS_CXXFLAGS=`$ARTS_CONFIG $artsconf_args --cflags | artsc-config --cflags | sed 's/\(-I.*\)artsc/\1arts/'` + ARTS_LIBS=`$ARTS_CONFIG $artsconf_args --libs | sed 's/artsc$/arts/'` + + arts_major_version=`$ARTS_CONFIG $arts_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + arts_minor_version=`$ARTS_CONFIG $arts_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + arts_micro_version=`$ARTS_CONFIG $arts_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_artstest" = "xyes" ; then + dnl ac_save_CXXFLAGS="$CXXFLAGS" + dnl ac_save_LIBS="$LIBS" + dnl CFLAGS="$CFLAGS $ARTS_CXXFLAGS" + dnl LIBS="$LIBS $ARTS_LIBS" +dnl +dnl Now check if the installed ARTS is sufficiently new. (Also sanity +dnl checks the results of artsc-config to some extent) +dnl + +dnl a*s: to successfully compile the C++ test app, we need to +dnl first make sure we're going to compile it as C++ (with AC_LANG_PUSH), +dnl then add the CFLAGS and CLIBS of arts which we just discovered to the +dnl C++ compilation and linking flags. +dnl We also need to clean up after the test; this means using AC_LANG_POP +dnl and restoring the CPPFLAGS and LDFLAGS from the saved values we take +dnl here. + +dnl ask nicely for C++ compilation + AC_LANG_PUSH(C++) + +dnl save compilation and link flags and make our own + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + AC_SUBST(CPPFLAGS,"$CPPFLAGS $ARTS_CXXFLAGS") + AC_SUBST(LDFLAGS,"$LDFLAGS $ARTS_CLIBS") + + rm -f conf.artstest + AC_TRY_RUN([ +#include +#include +#include +#include + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + // thomas: the original test did not have the typecast + new_str = (char *) malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.artstest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_arts_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_arts_version"); + exit(1); + } + + if (($arts_major_version > major) || + (($arts_major_version == major) && ($arts_minor_version > minor)) || + (($arts_major_version == major) && ($arts_minor_version == minor) && ($arts_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'artsc-config --version' returned %d.%d.%d, but the minimum version\n", $arts_major_version, $arts_minor_version, $arts_micro_version); + printf("*** of ARTS required is %d.%d.%d. If artsc-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If artsc-config was wrong, set the environment variable ARTS_CONFIG\n"); + printf("*** to point to the correct copy of artsc-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_arts=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + dnl CFLAGS="$ac_save_CFLAGS" + dnl LIBS="$ac_save_LIBS" + dnl a*s this is were we clean up after the test + AC_LANG_POP(C++) + CXXFLAGS="$ac_save_CXXFLAGS" + LDFLAGS="$ac_save_LDFLAGS" + dnl a*s we are sure that these are right, so we make them active + AC_SUBST(CXXFLAGS,"$CXXFLAGS") + AC_SUBST(LDFLAGS,"$LDFLAGS") + fi + fi + if test "x$no_arts" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$ARTS_CONFIG" = "no" ; then + echo "*** The artsc-config script installed by ARTS could not be found" + echo "*** If ARTS was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the ARTS_CONFIG environment variable to the" + echo "*** full path to artsc-config." + else + if test -f conf.artstest ; then + : + else + echo "*** Could not run ARTS test program, checking why..." + CFLAGS="$CFLAGS $ARTS_CXXFLAGS" + LIBS="$LIBS $ARTS_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding ARTS or finding the wrong" + echo "*** version of ARTS. If it is not finding ARTS, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means ARTS was incorrectly installed" + echo "*** or that you have moved ARTS since it was installed. In the latter case, you" + echo "*** may want to edit the artsc-config script: $ARTS_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + ARTS_CXXFLAGS="" + ARTS_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(ARTS_CXXFLAGS) + AC_SUBST(ARTS_LIBS) + rm -f conf.artstest +]) + +dnl release C++ question + diff --git a/m4/as-ffmpeg.m4 b/m4/as-ffmpeg.m4 new file mode 100644 index 0000000..fa0c38d --- /dev/null +++ b/m4/as-ffmpeg.m4 @@ -0,0 +1,99 @@ +# CFLAGS and library paths for FFMPEG +# taken from Autostar Sandbox, http://autostars.sourceforge.net/ + +dnl Usage: +dnl AM_PATH_FFMPEG([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl FIXME: version checking does not work currently +dnl +dnl Example: +dnl AM_PATH_FFMPEG(0.4.6, , AC_MSG_ERROR([*** FFMPEG >= 0.4.6 not installed)) +dnl +dnl Defines FFMPEG_LIBS +dnl FIXME: should define FFMPEG_VERSION +dnl + +AC_DEFUN([AM_PATH_FFMPEG], +[ + dnl allow for specification of a source path (for uninstalled) + AC_ARG_WITH(ffmpeg-source, + AC_HELP_STRING([--with-ffmpeg-source=DIR], + [Directory where FFmpeg source is (optional)]), + ffmpeg_source="$withval") + + dnl save CFLAGS and LIBS here + CFLAGS_save=$CFLAGS + LIBS_save=$LIBS + if test "x$ffmpeg_source" != "x"; then + dnl uninstalled FFmpeg copy + AC_MSG_NOTICE([Looking for FFmpeg source in $ffmpeg_source]) + CFLAGS="-I$ffmpeg_source/libav -I$ffmpeg_source/libavcodec" + LIBS="-L$ffmpeg_source/libav -L$ffmpeg_source/libavcodec" + AC_DEFINE_UNQUOTED(HAVE_FFMPEG_UNINSTALLED, 1, + [defined if we compile against uninstalled FFmpeg]) + FFMPEG_COMMON_INCLUDE="#include " + else + FFMPEG_COMMON_INCLUDE="#include " + fi + + dnl check for libavcodec + AC_CHECK_LIB(avcodec, avcodec_init, HAVE_FFMPEG=yes, HAVE_FFMPEG=no) + + dnl check for avcodec.h and avformat.h + if test "x$ffmpeg_source" != "x"; then + dnl uninstalled + AC_CHECK_HEADER(avcodec.h, , HAVE_FFMPEG=no, [/* only compile */]) + AC_CHECK_HEADER(avformat.h, , HAVE_FFMPEG=no, [/* only compile */]) + else + AC_CHECK_HEADER(ffmpeg/avcodec.h, , HAVE_FFMPEG=no) + AC_CHECK_HEADER(ffmpeg/avformat.h, , HAVE_FFMPEG=no) + fi + +dnl now check if it's sufficiently new + + AC_LANG_SAVE() + AC_LANG_C() + + dnl FIXME: we use strcmp, which we know is going to break if ffmpeg ever uses + dnl two digits for any of their version numbers. It makes the test so much + dnl easier though so let's ignore that + AC_TRY_RUN([ +$FFMPEG_COMMON_INCLUDE +#include +#include + +int +main () +{ + if (strcmp (FFMPEG_VERSION, "$1") == -1) + { + fprintf (stderr, + "ERROR: your copy of ffmpeg is too old (%s)\n", FFMPEG_VERSION); + return 1; + } + else + return 0; +} +], , HAVE_FFMPEG=no) + +dnl now do the actual "do we have it ?" test + if test "x$HAVE_FFMPEG" = "xyes"; then + FFMPEG_LIBS="$LIBS -lavcodec -lavformat" + FFMPEG_CFLAGS="$CFLAGS" + AC_MSG_NOTICE(we have ffmpeg) + dnl execute what we have to because it's found + ifelse([$2], , :, [$2]) + else + FFMPEG_LIBS="" + FFMPEG_CFLAGS="" + dnl execute what we have to because it's not found + ifelse([$3], , :, [$3]) + fi + +dnl make variables available + AC_SUBST(FFMPEG_LIBS) + AC_SUBST(FFMPEG_CFLAGS) + AC_SUBST(HAVE_FFMPEG) + AC_LANG_RESTORE() + CFLAGS=$CFLAGS_save + LIBS=$LIBS_save +]) diff --git a/m4/as-liblame.m4 b/m4/as-liblame.m4 new file mode 100644 index 0000000..ed7070c --- /dev/null +++ b/m4/as-liblame.m4 @@ -0,0 +1,50 @@ +# CFLAGS and library paths for LIBLAME +# taken from Autostar Sandbox, http://autostars.sourceforge.net/ +# inspired by xmms.m4 + +dnl Usage: +dnl AM_PATH_LIBLAME([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl FIXME: version checking does not work currently +dnl +dnl Example: +dnl AM_PATH_LIBLAME(3.89, , AC_MSG_ERROR([*** LIBLAME >= 3.89 not installed)) +dnl +dnl Defines LIBLAME_LIBS +dnl FIXME: should define LIBLAME_VERSION +dnl + +AC_DEFUN([AM_PATH_LIBLAME], +[ + dnl check for the library + AC_CHECK_LIB(mp3lame, lame_init, HAVE_LIBLAME=yes, HAVE_LIBLAME=no, -lm) + dnl check if lame.h is available in the standard location or not + HAVE_LAME_H_STD=no + AC_CHECK_HEADER(lame.h, HAVE_LAME_H_STD=no, :) + AC_CHECK_HEADER(lame/lame.h, HAVE_LAME_H_STD=yes, :) + AC_MSG_CHECKING(for lame.h in right location) + if test "x$HAVE_LAME_H_STD" = "xyes"; then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + HAVE_LIBLAME=no + if test "x$HAVE_LAME_H_STD"="xno"; then + AC_MSG_WARN(lame.h found in include dir,) + AC_MSG_WARN( while it should be in it's own lame/ dir !) + fi + fi + + dnl now do the actual "do we have it ?" test + if test "x$HAVE_LIBLAME" = "xyes"; then + LIBLAME_LIBS="-lmp3lame -lm" + dnl execute what we have to because it's found + ifelse([$2], , :, [$2]) + else + LIBLAME_LIBS="" + dnl execute what we have to because it's not found + ifelse([$3], , :, [$3]) + fi + + dnl make variables available + AC_SUBST(LIBLAME_LIBS) + AC_SUBST(HAVE_LIBLAME) +]) diff --git a/m4/as-slurp-ffmpeg.m4 b/m4/as-slurp-ffmpeg.m4 new file mode 100644 index 0000000..fd54b42 --- /dev/null +++ b/m4/as-slurp-ffmpeg.m4 @@ -0,0 +1,59 @@ +dnl slurp-ffmpeg.m4 0.1.1 +dnl a macro to slurp in ffmpeg's cvs source inside a project tree +dnl taken from Autostar Sandbox, http://autostars.sourceforge.net/ + +dnl Usage: +dnl AS_SLURP_FFMPEG(DIRECTORY, DATE, [ACTION-IF-WORKED [, ACTION-IF-NOT-WORKED]]]) +dnl +dnl Example: +dnl AM_PATH_FFMPEG(lib/ffmpeg, 2002-12-14 12:00 GMT) +dnl +dnl make sure you have a Tag file in the dir where you check out that +dnl is the Tag of CVS you want to have checked out +dnl it should correspond to the DATE argument you supply, ie resolve to +dnl the same date +dnl (in an ideal world, cvs would understand it's own Tag file format as +dnl a date spec) + +AC_DEFUN([AS_SLURP_FFMPEG], +[ + # save original dir + FAILED="" + DIRECTORY=`pwd` + # get/update cvs + if test ! -d $1; then mkdir -p $1; fi + dnl we need to check $srcdir/$1 or it will always checkout ffmpeg even if it is there + dnl at least when top_srcdir != top_builddir. + dnl FIXME: unfortunately this makes the checkout go into top_srcdir + cd $srcdir/$1 + + if test ! -e ffmpeg/README; then + # check out cvs code + AC_MSG_NOTICE(checking out ffmpeg cvs code from $2 into $1) + cvs -Q -z4 -d:pserver:anonymous@mplayerhq.hu:/cvsroot/ffmpeg co -D '$2' ffmpeg || FAILED=yes + else + # compare against Tag file and see if it needs updating + if test "`cat Tag`" == "$2"; then + AC_MSG_NOTICE(ffmpeg cvs code in sync) + else + cd ffmpeg + AC_MSG_NOTICE(updating ffmpeg cvs code to $2) + cvs -Q -z4 update -dP -D '$2' || FAILED=yes + cd .. + fi + fi + if test "x$FAILED" != "xyes"; then + echo "$2" > Tag + fi + + # now go back + cd $DIRECTORY + + if test "x$FAILED" == "xyes"; then + [$4] + false + else + [$3] + true + fi +]) diff --git a/m4/check-libheader.m4 b/m4/check-libheader.m4 new file mode 100644 index 0000000..a7fc5a6 --- /dev/null +++ b/m4/check-libheader.m4 @@ -0,0 +1,39 @@ +dnl +dnl CHECK-LIBHEADER(FEATURE-NAME, LIB-NAME, LIB-FUNCTION, HEADER-NAME, +dnl ACTION-IF-FOUND, ACTION-IF-NOT-FOUND, +dnl EXTRA-LDFLAGS, EXTRA-CPPFLAGS) +dnl +dnl FEATURE-NAME - feature name; library and header files are treated +dnl as feature, which we look for +dnl LIB-NAME - library name as in AC_CHECK_LIB macro +dnl LIB-FUNCTION - library symbol as in AC_CHECK_LIB macro +dnl HEADER-NAME - header file name as in AC_CHECK_HEADER +dnl ACTION-IF-FOUND - when feature is found then execute given action +dnl ACTION-IF-NOT-FOUND - when feature is not found then execute given action +dnl EXTRA-LDFLAGS - extra linker flags (-L or -l) +dnl EXTRA-CPPFLAGS - extra C preprocessor flags, i.e. -I/usr/X11R6/include +dnl +dnl Based on GST_CHECK_LIBHEADER from gstreamer plugins 0.3.1. +dnl +AC_DEFUN([CHECK_LIBHEADER], +[ + AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no, [$7]) + check_libheader_feature_name=translit([$1], A-Z, a-z) + + if test "x$HAVE_[$1]" = "xyes"; then + check_libheader_save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="[$8] $CPPFLAGS" + AC_CHECK_HEADER([$4], :, HAVE_[$1]=no) + CPPFLAGS=$check_libheader_save_CPPFLAGS + fi + + if test "x$HAVE_[$1]" = "xyes"; then + ifelse([$5], , :, [$5]) + AC_MSG_NOTICE($check_libheader_feature_name was found) + else + ifelse([$6], , :, [$6]) + AC_MSG_WARN($check_libheader_feature_name not found) + fi + AC_SUBST(HAVE_[$1]) +] +) diff --git a/m4/codeset.m4 b/m4/codeset.m4 new file mode 100644 index 0000000..223955b --- /dev/null +++ b/m4/codeset.m4 @@ -0,0 +1,21 @@ +# codeset.m4 serial 2 (gettext-0.16) +dnl Copyright (C) 2000-2002, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET); return !cs;], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +]) diff --git a/m4/esd.m4 b/m4/esd.m4 new file mode 100644 index 0000000..1812fd0 --- /dev/null +++ b/m4/esd.m4 @@ -0,0 +1,202 @@ +# Configure paths for ESD +# Manish Singh 98-9-30 +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_ESD([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for ESD, and define ESD_CFLAGS and ESD_LIBS +dnl +AC_DEFUN([AM_PATH_ESD], +[dnl +dnl Get the cflags and libraries from the esd-config script +dnl +AC_ARG_WITH(esd-prefix, + AC_HELP_STRING([--with-esd-prefix=PFX], + [prefix where ESD is installed (optional)]), + esd_prefix="$withval", esd_prefix="") + +AC_ARG_WITH(esd-exec-prefix, + AC_HELP_STRING([--with-esd-exec-prefix=PFX], + [exec prefix where ESD is installed (optional)]), + esd_exec_prefix="$withval", esd_exec_prefix="") + +AC_ARG_ENABLE(esdtest, + AC_HELP_STRING([--disable-esdtest], + [do not try to compile and run a test ESD program]), + , enable_esdtest=yes) + + if test x$esd_exec_prefix != x ; then + esd_args="$esd_args --exec-prefix=$esd_exec_prefix" + if test x${ESD_CONFIG+set} != xset ; then + ESD_CONFIG=$esd_exec_prefix/bin/esd-config + fi + fi + if test x$esd_prefix != x ; then + esd_args="$esd_args --prefix=$esd_prefix" + if test x${ESD_CONFIG+set} != xset ; then + ESD_CONFIG=$esd_prefix/bin/esd-config + fi + fi + + AC_PATH_PROG(ESD_CONFIG, esd-config, no) + min_esd_version=ifelse([$1], ,0.2.7,$1) + AC_MSG_CHECKING(for ESD - version >= $min_esd_version) + no_esd="" + if test "$ESD_CONFIG" = "no" ; then + no_esd=yes + else + AC_LANG_SAVE + AC_LANG_C + ESD_CFLAGS=`$ESD_CONFIG $esdconf_args --cflags` + ESD_LIBS=`$ESD_CONFIG $esdconf_args --libs` + + esd_major_version=`$ESD_CONFIG $esd_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + esd_minor_version=`$ESD_CONFIG $esd_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + esd_micro_version=`$ESD_CONFIG $esd_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_esdtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $ESD_CFLAGS" + LIBS="$LIBS $ESD_LIBS" +dnl +dnl Now check if the installed ESD is sufficiently new. (Also sanity +dnl checks the results of esd-config to some extent +dnl + rm -f conf.esdtest + AC_TRY_RUN([ +#include +#include +#include +#include + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.esdtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_esd_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_esd_version"); + exit(1); + } + + if (($esd_major_version > major) || + (($esd_major_version == major) && ($esd_minor_version > minor)) || + (($esd_major_version == major) && ($esd_minor_version == minor) && ($esd_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'esd-config --version' returned %d.%d.%d, but the minimum version\n", $esd_major_version, $esd_minor_version, $esd_micro_version); + printf("*** of ESD required is %d.%d.%d. If esd-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If esd-config was wrong, set the environment variable ESD_CONFIG\n"); + printf("*** to point to the correct copy of esd-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_esd=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + AC_LANG_RESTORE + fi + fi + if test "x$no_esd" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$ESD_CONFIG" = "no" ; then + echo "*** The esd-config script installed by ESD could not be found" + echo "*** If ESD was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the ESD_CONFIG environment variable to the" + echo "*** full path to esd-config." + else + if test -f conf.esdtest ; then + : + else + echo "*** Could not run ESD test program, checking why..." + CFLAGS="$CFLAGS $ESD_CFLAGS" + LIBS="$LIBS $ESD_LIBS" + AC_LANG_SAVE + AC_LANG_C + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding ESD or finding the wrong" + echo "*** version of ESD. If it is not finding ESD, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means ESD was incorrectly installed" + echo "*** or that you have moved ESD since it was installed. In the latter case, you" + echo "*** may want to edit the esd-config script: $ESD_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + AC_LANG_RESTORE + fi + fi + ESD_CFLAGS="" + ESD_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(ESD_CFLAGS) + AC_SUBST(ESD_LIBS) + rm -f conf.esdtest +]) + +dnl AM_ESD_SUPPORTS_MULTIPLE_RECORD([ACTION-IF-SUPPORTS [, ACTION-IF-NOT-SUPPORTS]]) +dnl Test, whether esd supports multiple recording clients (version >=0.2.21) +dnl +AC_DEFUN([AM_ESD_SUPPORTS_MULTIPLE_RECORD], +[dnl + AC_MSG_NOTICE([whether installed esd version supports multiple recording clients]) + ac_save_ESD_CFLAGS="$ESD_CFLAGS" + ac_save_ESD_LIBS="$ESD_LIBS" + AM_PATH_ESD(0.2.21, + ifelse([$1], , [ + AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, true) + AC_DEFINE(ESD_SUPPORTS_MULTIPLE_RECORD, 1, + [Define if you have esound with support of multiple recording clients.])], + [$1]), + ifelse([$2], , [AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, false)], [$2]) + if test "x$ac_save_ESD_CFLAGS" != x ; then + ESD_CFLAGS="$ac_save_ESD_CFLAGS" + fi + if test "x$ac_save_ESD_LIBS" != x ; then + ESD_LIBS="$ac_save_ESD_LIBS" + fi + ) +]) diff --git a/m4/freetype2.m4 b/m4/freetype2.m4 new file mode 100644 index 0000000..7199071 --- /dev/null +++ b/m4/freetype2.m4 @@ -0,0 +1,143 @@ +# Configure paths for FreeType2 +# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor + +dnl AC_CHECK_FT2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for FreeType2, and define FT2_CFLAGS and FT2_LIBS +dnl +AC_DEFUN([AC_CHECK_FT2], +[dnl +dnl Get the cflags and libraries from the freetype-config script +dnl +AC_ARG_WITH(ft-prefix, +[ --with-ft-prefix=PREFIX + Prefix where FreeType is installed (optional)], + ft_config_prefix="$withval", ft_config_prefix="") +AC_ARG_WITH(ft-exec-prefix, +[ --with-ft-exec-prefix=PREFIX + Exec prefix where FreeType is installed (optional)], + ft_config_exec_prefix="$withval", ft_config_exec_prefix="") +AC_ARG_ENABLE(freetypetest, +[ --disable-freetypetest Do not try to compile and run + a test FreeType program], + [], enable_fttest=yes) + +if test x$ft_config_exec_prefix != x ; then + ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix" + if test x${FT2_CONFIG+set} != xset ; then + FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config + fi +fi +if test x$ft_config_prefix != x ; then + ft_config_args="$ft_config_args --prefix=$ft_config_prefix" + if test x${FT2_CONFIG+set} != xset ; then + FT2_CONFIG=$ft_config_prefix/bin/freetype-config + fi +fi +AC_PATH_PROG(FT2_CONFIG, freetype-config, no) + +min_ft_version=ifelse([$1], ,6.1.0,$1) +AC_MSG_CHECKING(for FreeType - version >= $min_ft_version) +no_ft="" +if test "$FT2_CONFIG" = "no" ; then + no_ft=yes +else + FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` + FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` + ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + ft_min_major_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_min_minor_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_min_micro_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test x$enable_fttest = xyes ; then + ft_config_is_lt="" + if test $ft_config_major_version -lt $ft_min_major_version ; then + ft_config_is_lt=yes + else + if test $ft_config_major_version -eq $ft_min_major_version ; then + if test $ft_config_minor_version -lt $ft_min_minor_version ; then + ft_config_is_lt=yes + else + if test $ft_config_minor_version -eq $ft_min_minor_version ; then + if test $ft_config_micro_version -lt $ft_min_micro_version ; then + ft_config_is_lt=yes + fi + fi + fi + fi + fi + if test x$ft_config_is_lt = xyes ; then + no_ft=yes + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" +dnl +dnl Sanity checks for the results of freetype-config to some extent +dnl + AC_TRY_RUN([ +#include +#include FT_FREETYPE_H +#include +#include + +int +main() +{ + FT_Library library; + FT_Error error; + + error = FT_Init_FreeType(&library); + + if (error) + return 1; + else + { + FT_Done_FreeType(library); + return 0; + } +} +],, no_ft=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi # test $ft_config_version -lt $ft_min_version + fi # test x$enable_fttest = xyes +fi # test "$FT2_CONFIG" = "no" +if test x$no_ft = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + if test "$FT2_CONFIG" = "no" ; then + echo "*** The freetype-config script installed by FreeType 2 could not be found." + echo "*** If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the FT2_CONFIG environment variable to the" + echo "*** full path to freetype-config." + else + if test x$ft_config_is_lt = xyes ; then + echo "*** Your installed version of the FreeType 2 library is too old." + echo "*** If you have different versions of FreeType 2, make sure that" + echo "*** correct values for --with-ft-prefix or --with-ft-exec-prefix" + echo "*** are used, or set the FT2_CONFIG environment variable to the" + echo "*** full path to freetype-config." + else + echo "*** The FreeType test program failed to run. If your system uses" + echo "*** shared libraries and they are installed outside the normal" + echo "*** system library path, make sure the variable LD_LIBRARY_PATH" + echo "*** (or whatever is appropiate for your system) is correctly set." + fi + fi + FT2_CFLAGS="" + FT2_LIBS="" + ifelse([$3], , :, [$3]) +fi +AC_SUBST(FT2_CFLAGS) +AC_SUBST(FT2_LIBS) +]) diff --git a/m4/gconf-2.m4 b/m4/gconf-2.m4 new file mode 100644 index 0000000..088c93f --- /dev/null +++ b/m4/gconf-2.m4 @@ -0,0 +1,40 @@ +dnl AM_GCONF_SOURCE_2 +dnl Defines GCONF_SCHEMA_CONFIG_SOURCE which is where you should install schemas +dnl (i.e. pass to gconftool-2 +dnl Defines GCONF_SCHEMA_FILE_DIR which is a filesystem directory where +dnl you should install foo.schemas files +dnl + +AC_DEFUN([AM_GCONF_SOURCE_2], +[ + if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then + GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` + else + GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE + fi + + AC_ARG_WITH(gconf-source, + [ --with-gconf-source=sourceaddress Config database for installing schema files.],GCONF_SCHEMA_CONFIG_SOURCE="$withval",) + + AC_SUBST(GCONF_SCHEMA_CONFIG_SOURCE) + AC_MSG_RESULT([Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation]) + + if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then + GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas' + fi + + AC_ARG_WITH(gconf-schema-file-dir, + [ --with-gconf-schema-file-dir=dir Directory for installing schema files.],GCONF_SCHEMA_FILE_DIR="$withval",) + + AC_SUBST(GCONF_SCHEMA_FILE_DIR) + AC_MSG_RESULT([Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files]) + + AC_ARG_ENABLE(schemas-install, + [ --disable-schemas-install Disable the schemas installation], + [case "${enableval}" in + yes) schemas_install=true ;; + no) schemas_install=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-schemas-install) ;; + esac],[schemas_install=true]) + AM_CONDITIONAL(GCONF_SCHEMAS_INSTALL, test x$schemas_install = xtrue) +]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 new file mode 100644 index 0000000..c9ae1f7 --- /dev/null +++ b/m4/gettext.m4 @@ -0,0 +1,381 @@ +# gettext.m4 serial 60 (gettext-0.17) +dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2006. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define([gt_included_intl], + ifelse([$1], [external], + ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), + [yes])) + define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) + gt_NEEDS_INIT + AM_GNU_GETTEXT_NEED([$2]) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. + gt_INTL_MACOSX + + dnl Set USE_NLS. + AC_REQUIRE([AM_NLS]) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl Add a version number to the cache macros. + case " $gt_needs " in + *" need-formatstring-macros "*) gt_api_version=3 ;; + *" need-ngettext "*) gt_api_version=2 ;; + *) gt_api_version=1 ;; + esac + gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" + gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + if test $gt_api_version -ge 3; then + gt_revision_test_code=' +#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +' + else + gt_revision_test_code= + fi + if test $gt_api_version -ge 2; then + gt_expression_test_code=' + * ngettext ("", "", 0)' + else + gt_expression_test_code= + fi + + AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], + [AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], + [eval "$gt_func_gnugettext_libc=yes"], + [eval "$gt_func_gnugettext_libc=no"])]) + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + [$gt_func_gnugettext_libintl], + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [eval "$gt_func_gnugettext_libintl=yes"], + [eval "$gt_func_gnugettext_libintl=no"]) + dnl Now see whether libintl exists and depends on libiconv. + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + eval "$gt_func_gnugettext_libintl=yes" + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ + || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + CATOBJEXT= + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Some extra flags are needed during linking. + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLOBJS= + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST(INTLOBJS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. +m4_define([gt_NEEDS_INIT], +[ + m4_divert_text([DEFAULTS], [gt_needs=]) + m4_define([gt_NEEDS_INIT], []) +]) + + +dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) +AC_DEFUN([AM_GNU_GETTEXT_NEED], +[ + m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/m4/glib.m4 b/m4/glib.m4 new file mode 100644 index 0000000..b3c632b --- /dev/null +++ b/m4/glib.m4 @@ -0,0 +1,196 @@ +# Configure paths for GLIB +# Owen Taylor 97-11-3 + +dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or +dnl gthread is specified in MODULES, pass to glib-config +dnl +AC_DEFUN([AM_PATH_GLIB], +[dnl +dnl Get the cflags and libraries from the glib-config script +dnl +AC_ARG_WITH(glib-prefix,[ --with-glib-prefix=PFX Prefix where GLIB is installed (optional)], + glib_config_prefix="$withval", glib_config_prefix="") +AC_ARG_WITH(glib-exec-prefix,[ --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)], + glib_config_exec_prefix="$withval", glib_config_exec_prefix="") +AC_ARG_ENABLE(glibtest, [ --disable-glibtest Do not try to compile and run a test GLIB program], + , enable_glibtest=yes) + + if test x$glib_config_exec_prefix != x ; then + glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config + fi + fi + if test x$glib_config_prefix != x ; then + glib_config_args="$glib_config_args --prefix=$glib_config_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_prefix/bin/glib-config + fi + fi + + for module in . $4 + do + case "$module" in + gmodule) + glib_config_args="$glib_config_args gmodule" + ;; + gthread) + glib_config_args="$glib_config_args gthread" + ;; + esac + done + + AC_PATH_PROG(GLIB_CONFIG, glib-config, no) + min_glib_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) + no_glib="" + if test "$GLIB_CONFIG" = "no" ; then + no_glib=yes + else + GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags` + GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs` + glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_glibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$GLIB_LIBS $LIBS" +dnl +dnl Now check if the installed GLIB is sufficiently new. (Also sanity +dnl checks the results of glib-config to some extent +dnl + rm -f conf.glibtest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.glibtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_glib_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_glib_version"); + exit(1); + } + + if ((glib_major_version != $glib_config_major_version) || + (glib_minor_version != $glib_config_minor_version) || + (glib_micro_version != $glib_config_micro_version)) + { + printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", + $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, + glib_major_version, glib_minor_version, glib_micro_version); + printf ("*** was found! If glib-config was correct, then it is best\n"); + printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n"); + printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } + else if ((glib_major_version != GLIB_MAJOR_VERSION) || + (glib_minor_version != GLIB_MINOR_VERSION) || + (glib_micro_version != GLIB_MICRO_VERSION)) + { + printf("*** GLIB header files (version %d.%d.%d) do not match\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + glib_major_version, glib_minor_version, glib_micro_version); + } + else + { + if ((glib_major_version > major) || + ((glib_major_version == major) && (glib_minor_version > minor)) || + ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the glib-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n"); + printf("*** correct copy of glib-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_glib" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GLIB_CONFIG" = "no" ; then + echo "*** The glib-config script installed by GLIB could not be found" + echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GLIB_CONFIG environment variable to the" + echo "*** full path to glib-config." + else + if test -f conf.glibtest ; then + : + else + echo "*** Could not run GLIB test program, checking why..." + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$LIBS $GLIB_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GLIB or finding the wrong" + echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GLIB was incorrectly installed" + echo "*** or that you have moved GLIB since it was installed. In the latter case, you" + echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GLIB_CFLAGS="" + GLIB_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + rm -f conf.glibtest +]) diff --git a/m4/glibc21.m4 b/m4/glibc21.m4 new file mode 100644 index 0000000..d95fd98 --- /dev/null +++ b/m4/glibc21.m4 @@ -0,0 +1,30 @@ +# glibc21.m4 serial 3 +dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([gl_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) diff --git a/m4/gst-alsa.m4 b/m4/gst-alsa.m4 new file mode 100644 index 0000000..4141d06 --- /dev/null +++ b/m4/gst-alsa.m4 @@ -0,0 +1,150 @@ +dnl Configure Paths for Alsa +dnl Some modifications by Richard Boulton +dnl Christopher Lansdown +dnl Jaroslav Kysela +dnl Last modification: alsa.m4,v 1.23 2004/01/16 18:14:22 tiwai Exp +dnl AM_PATH_ALSA([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for libasound, and define ALSA_CFLAGS and ALSA_LIBS as appropriate. +dnl enables arguments --with-alsa-prefix= +dnl --with-alsa-enc-prefix= +dnl --disable-alsatest +dnl +dnl For backwards compatibility, if ACTION_IF_NOT_FOUND is not specified, +dnl and the alsa libraries are not found, a fatal AC_MSG_ERROR() will result. +dnl +AC_DEFUN([AM_PATH_ALSA], +[dnl Save the original CFLAGS, LDFLAGS, and LIBS +alsa_save_CFLAGS="$CFLAGS" +alsa_save_LDFLAGS="$LDFLAGS" +alsa_save_LIBS="$LIBS" +alsa_found=yes + +dnl +dnl Get the cflags and libraries for alsa +dnl +AC_ARG_WITH(alsa-prefix, + AC_HELP_STRING([--with-alsa-prefix=PFX], + [prefix where Alsa library is installed(optional)]), + [alsa_prefix="$withval"], [alsa_prefix=""]) + +AC_ARG_WITH(alsa-inc-prefix, + AC_HELP_STRING([--with-alsa-inc-prefix=PFX], + [prefix where include libraries are (optional)]), + [alsa_inc_prefix="$withval"], [alsa_inc_prefix=""]) + +dnl FIXME: this is not yet implemented +dnl AC_ARG_ENABLE(alsatest, +dnl AC_HELP_STRING([--disable-alsatest], +dnl [do not try to compile and run a test Alsa program], +dnl [enable_alsatest=no], [enable_alsatest=yes]) + +dnl Add any special include directories +AC_MSG_CHECKING(for ALSA CFLAGS) +if test "$alsa_inc_prefix" != "" ; then + ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" + CFLAGS="$CFLAGS -I$alsa_inc_prefix" +fi +AC_MSG_RESULT($ALSA_CFLAGS) + +dnl add any special lib dirs +AC_MSG_CHECKING(for ALSA LDFLAGS) +if test "$alsa_prefix" != "" ; then + ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" + LDFLAGS="$LDFLAGS $ALSA_LIBS" +fi + +dnl add the alsa library +ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" +LIBS=`echo $LIBS | sed 's/-lm//'` +LIBS=`echo $LIBS | sed 's/-ldl//'` +LIBS=`echo $LIBS | sed 's/-lpthread//'` +LIBS=`echo $LIBS | sed 's/ //'` +LIBS="$ALSA_LIBS $LIBS" +AC_MSG_RESULT($ALSA_LIBS) + +dnl Check for a working version of libasound that is of the right version. +min_alsa_version=ifelse([$1], ,0.1.1,$1) +AC_MSG_CHECKING(for libasound headers version >= $min_alsa_version) +no_alsa="" + alsa_min_major_version=`echo $min_alsa_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + alsa_min_minor_version=`echo $min_alsa_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + alsa_min_micro_version=`echo $min_alsa_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + +AC_LANG_SAVE +AC_LANG_C +AC_TRY_COMPILE([ +#include +], [ +void main(void) +{ +/* ensure backward compatibility */ +#if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) +#define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR +#endif +#if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) +#define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR +#endif +#if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) +#define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR +#endif + +# if(SND_LIB_MAJOR > $alsa_min_major_version) + exit(0); +# else +# if(SND_LIB_MAJOR < $alsa_min_major_version) +# error not present +# endif + +# if(SND_LIB_MINOR > $alsa_min_minor_version) + exit(0); +# else +# if(SND_LIB_MINOR < $alsa_min_minor_version) +# error not present +# endif + +# if(SND_LIB_SUBMINOR < $alsa_min_micro_version) +# error not present +# endif +# endif +# endif +exit(0); +} +], + [AC_MSG_RESULT(found.)], + [AC_MSG_RESULT(not present.) + ifelse([$3], , [AC_MSG_ERROR(Sufficiently new version of libasound not found.)]) + alsa_found=no] +) +AC_LANG_RESTORE + +dnl Now that we know that we have the right version, let's see if we have the library and not just the headers. +if test "x$enable_alsatest" = "xyes"; then +AC_CHECK_LIB([asound], [snd_ctl_open],, + [ifelse([$3], , [AC_MSG_ERROR(No linkable libasound was found.)]) + alsa_found=no] +) +fi + +if test "x$alsa_found" = "xyes" ; then + ifelse([$2], , :, [$2]) + LIBS=`echo $LIBS | sed 's/-lasound//g'` + LIBS=`echo $LIBS | sed 's/ //'` + LIBS="-lasound $LIBS" +fi +if test "x$alsa_found" = "xno" ; then + ifelse([$3], , :, [$3]) + CFLAGS="$alsa_save_CFLAGS" + LDFLAGS="$alsa_save_LDFLAGS" + LIBS="$alsa_save_LIBS" + ALSA_CFLAGS="" + ALSA_LIBS="" +fi + +dnl That should be it. Now just export out symbols: +AC_SUBST(ALSA_CFLAGS) +AC_SUBST(ALSA_LIBS) +]) + diff --git a/m4/gst-artsc.m4 b/m4/gst-artsc.m4 new file mode 100644 index 0000000..4659960 --- /dev/null +++ b/m4/gst-artsc.m4 @@ -0,0 +1,28 @@ +dnl Perform a check for existence of ARTSC +dnl Richard Boulton +dnl Last modification: 26/06/2001 +dnl GST_CHECK_ARTSC() +dnl +dnl This check was written for GStreamer: it should be renamed and checked +dnl for portability if you decide to use it elsewhere. +dnl +AC_DEFUN([GST_CHECK_ARTSC], +[ + AC_PATH_PROG(ARTSC_CONFIG, artsc-config, no) + if test "x$ARTSC_CONFIG" = "xno"; then + AC_MSG_WARN([Couldn't find artsc-config]) + HAVE_ARTSC=no + ARTSC_LIBS= + ARTSC_CFLAGS= + else + ARTSC_LIBS=`artsc-config --libs` + ARTSC_CFLAGS=`artsc-config --cflags` + dnl AC_CHECK_HEADER uses CPPFLAGS, but not CFLAGS. + dnl FIXME: Ensure only suitable flags result from artsc-config --cflags + CPPFLAGS="$CPPFLAGS $ARTSC_CFLAGS" + AC_CHECK_HEADER(artsc.h, HAVE_ARTSC=yes, HAVE_ARTSC=no) + fi + AC_SUBST(ARTSC_LIBS) + AC_SUBST(ARTSC_CFLAGS) +]) + diff --git a/m4/gst-fionread.m4 b/m4/gst-fionread.m4 new file mode 100644 index 0000000..603aa45 --- /dev/null +++ b/m4/gst-fionread.m4 @@ -0,0 +1,42 @@ +AC_DEFUN([GST_CHECK_FIONREAD], [ + + AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h) + AC_CACHE_VAL(_cv_gst_fionread_in_sys_ioctl, [ + AC_TRY_COMPILE([ +#include +#include +], [ +int x = FIONREAD; +if ( x ) + return 0; + ], _cv_gst_fionread_in_sys_ioctl="yes",_cv_gst_fionread_in_sys_ioctl="no") + ]) + + AC_MSG_RESULT($_cv_gst_fionread_in_sys_ioctl) + + 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(_cv_gst_fionread_in_sys_filio, [ + AC_TRY_COMPILE([ + #include + #include + ], [ + int x = FIONREAD; + if ( x ) + return 0; + ], _cv_gst_fionread_in_sys_filio="yes",_cv_gst_fionread_in_sys_filio="no") + ]) + + AC_MSG_RESULT($_cv_gst_fionread_in_sys_filio) + + 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 + + fi + +]) diff --git a/m4/gst-ivorbis.m4 b/m4/gst-ivorbis.m4 new file mode 100644 index 0000000..ae35bbb --- /dev/null +++ b/m4/gst-ivorbis.m4 @@ -0,0 +1,68 @@ +# Configure paths for Tremor + +dnl XIPH_PATH_IVORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libivorbis, and define IVORBIS_CFLAGS and IVORBIS_LIBS +dnl +AC_DEFUN([XIPH_PATH_IVORBIS], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(ivorbis,[ --with-ivorbis=PFX Prefix where libivorbis is installed (optional)], ivorbis_prefix="$withval", ivorbis_prefix="") +AC_ARG_WITH(ivorbis-libraries,[ --with-ivorbis-libraries=DIR Directory where libivorbis library is installed (optional)], ivorbis_libraries="$withval", ivorbis_libraries="") +AC_ARG_WITH(ivorbis-includes,[ --with-ivorbis-includes=DIR Directory where libivorbis header files are installed (optional)], ivorbis_includes="$withval", ivorbis_includes="") +AC_ARG_ENABLE(ivorbistest, [ --disable-ivorbistest Do not try to compile and run a test Ivorbis program],, enable_ivorbistest=yes) + + if test "x$ivorbis_libraries" != "x" ; then + IVORBIS_LIBS="-L$ivorbis_libraries" + elif test "x$ivorbis_prefix" != "x" ; then + IVORBIS_LIBS="-L$ivorbis_prefix/lib" + elif test "x$prefix" != "xNONE"; then + IVORBIS_LIBS="-L$prefix/lib" + fi + + IVORBIS_LIBS="$IVORBIS_LIBS -lvorbisidec -lm" + + if test "x$ivorbis_includes" != "x" ; then + IVORBIS_CFLAGS="-I$ivorbis_includes" + elif test "x$ivorbis_prefix" != "x" ; then + IVORBIS_CFLAGS="-I$ivorbis_prefix/include" + elif test "x$prefix" != "xNONE"; then + IVORBIS_CFLAGS="-I$prefix/include" + fi + + AC_MSG_CHECKING(for Tremor) + no_ivorbis="" + + if test "x$enable_ivorbistest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $IVORBIS_CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $IVORBIS_LIBS $OGG_LIBS" +dnl +dnl Now check if the installed Tremor is sufficiently new. +dnl + rm -f conf.ivorbistest + AC_TRY_COMPILE([ +#include +#include +#include +#include +],,, no_ivorbis=yes) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_ivorbis" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + IVORBIS_CFLAGS="" + IVORBIS_LIBS="" + IVORBISFILE_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(IVORBIS_CFLAGS) + AC_SUBST(IVORBIS_LIBS) + AC_SUBST(IVORBISFILE_LIBS) +]) diff --git a/m4/gst-matroska.m4 b/m4/gst-matroska.m4 new file mode 100644 index 0000000..b50caaa --- /dev/null +++ b/m4/gst-matroska.m4 @@ -0,0 +1,262 @@ +# Configure paths for libebml + +dnl PATH_EBML([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libebml, and define EBML_CFLAGS and EBML_LIBS +dnl +AC_DEFUN([PATH_EBML], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(ebml-prefix,[ --with-ebml-prefix=PFX Prefix where libebml is installed (optional)], ebml_prefix="$withval", ebml_prefix="") +AC_ARG_WITH(ebml-include,[ --with-ebml-include=DIR Path to where the libebml include files installed (optional)], ebml_include="$withval", ebml_include="") +AC_ARG_WITH(ebml-lib,[ --with-ebml-lib=DIR Path to where the libebml library installed (optional)], ebml_lib="$withval", ebml_lib="") +AC_ARG_ENABLE(ebmltest, [ --disable-ebmltest Do not try to compile and run a test EBML program],, enable_ebmltest=yes) + + if test "x$ebml_prefix" != "x"; then + ebml_args="$ebml_args --prefix=$ebml_prefix" + if test "x$ebml_include" != "x"; then + EBML_CFLAGS="-I$ebml_include" + else + EBML_CFLAGS="-I$ebml_prefix/include/ebml" + fi + if test "x$ebml_lib" != "x"; then + EBML_LIBS="-L$ebml_lib" + else + EBML_LIBS="-L$ebml_prefix/lib" + fi + elif test "x$prefix" != "xNONE"; then + ebml_args="$ebml_args --prefix=$prefix" + if test "x$ebml_include" != "x"; then + EBML_CFLAGS="-I$ebml_include" + else + EBML_CFLAGS="-I$prefix/include/ebml" + fi + if test "x$ebml_lib" != "x"; then + EBML_LIBS="-L$ebml_lib" + else + EBML_LIBS="-L$prefix/lib" + fi + else + if test "x$ebml_include" != "x"; then + EBML_CFLAGS="-I$ebml_include" + else + EBML_CFLAGS="-I/usr/include/ebml -I/usr/local/include/ebml" + fi + if test "x$ebml_lib" != "x"; then + EBML_LIBS="-L$ebml_lib" + else + EBML_LIBS="-L/usr/local/lib" + fi + fi + + EBML_LIBS="$EBML_LIBS -lebml" + + AC_MSG_CHECKING(for EBML) + no_ebml="" + + + if test "x$enable_ebmltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $EBML_CFLAGS" + LIBS="$LIBS $EBML_LIBS" +dnl +dnl Now check if the installed EBML is sufficiently new. +dnl + rm -f conf.ebmltest + AC_TRY_RUN([ +#include +#include +#include +#include + +int main () +{ + system("touch conf.ebmltest"); + return 0; +} + +],, no_ebml=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_ebml" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + if test -f conf.ebmltest ; then + : + else + echo "*** Could not run Ebml test program, checking why..." + CFLAGS="$CFLAGS $EBML_CFLAGS" + LIBS="$LIBS $EBML_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding EBML or finding the wrong" + echo "*** version of EBML. If it is not finding EBML, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means EBML was incorrectly installed" + echo "*** or that you have moved EBML since it was installed." ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + EBML_CFLAGS="" + EBML_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(EBML_CFLAGS) + AC_SUBST(EBML_LIBS) + rm -f conf.ebmltest +]) + +# Configure paths for libmatroska + +dnl PATH_MATROSKA(MIN_VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libmatroska, and define MATROSKA_CFLAGS and MATROSKA_LIBS +dnl +AC_DEFUN([PATH_MATROSKA], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(matroska-prefix,[ --with-matroska-prefix=PFX Prefix where libmatroska is installed (optional)], matroska_prefix="$withval", matroska_prefix="") +AC_ARG_WITH(matroska-include,[ --with-matroska-include=DIR Path to where the libmatroska include files installed (optional)], matroska_include="$withval", matroska_include="") +AC_ARG_WITH(matroska-lib,[ --with-matroska-lib=DIR Path to where the libmatroska library installed (optional)], matroska_lib="$withval", matroska_lib="") +AC_ARG_ENABLE(matroskatest, [ --disable-matroskatest Do not try to compile and run a test Matroska program],, enable_matroskatest=yes) + + if test "x$matroska_prefix" != "x"; then + matroska_args="$matroska_args --prefix=$matroska_prefix" + if test "x$matroska_include" != "x"; then + MATROSKA_CFLAGS="-I$matroska_include" + else + MATROSKA_CFLAGS="-I$matroska_prefix/include/matroska" + fi + if test "x$matroska_lib" != "x"; then + MATROSKA_LIBS="-L$matroska_lib" + else + MATROSKA_LIBS="-L$matroska_prefix/lib" + fi + elif test "x$prefix" != "xNONE"; then + matroska_args="$matroska_args --prefix=$prefix" + if test "x$matroska_include" != "x"; then + MATROSKA_CFLAGS="-I$matroska_include" + else + MATROSKA_CFLAGS="-I$prefix/include/matroska" + fi + if test "x$matroska_lib" != "x"; then + MATROSKA_LIBS="-L$matroska_lib" + else + MATROSKA_LIBS="-L$prefix/lib" + fi + else + if test "x$matroska_include" != "x"; then + MATROSKA_CFLAGS="-I$matroska_include" + else + MATROSKA_CFLAGS="-I/usr/include/matroska -I/usr/local/include/matroska" + fi + if test "x$matroska_lib" != "x"; then + MATROSKA_LIBS="-L$matroska_lib" + else + MATROSKA_LIBS="-L/usr/local/lib" + fi + fi + + MATROSKA_LIBS="$MATROSKA_LIBS -lmatroska" + + AC_MSG_CHECKING(for Matroska) + no_matroska="" + + + if test "x$enable_matroskatest" = "xyes" ; then + ac_save_CXXFLAGS="$CXXFLAGS" + ac_save_LIBS="$LIBS" + CXXFLAGS="$CXXFLAGS $MATROSKA_CFLAGS $EBML_CFLAGS" + LIBS="$LIBS $MATROSKA_LIBS $EBML_LIBS" +dnl +dnl Now check if the installed Matroska is sufficiently new. +dnl + rm -f conf.matroskatest + AC_LANG_CPLUSPLUS + AC_TRY_RUN([ +#include +#include +#include +#include +#include + +using namespace LIBMATROSKA_NAMESPACE; + +int main () +{ + FILE *f; + f = fopen("conf.matroskatest", "wb"); + if (f == NULL) + return 1; + fprintf(f, "%s\n", KaxCodeVersion.c_str()); + fclose(f); + return 0; +} + +],, no_matroska=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + AC_LANG_C + CXXFLAGS="$ac_save_CXXFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_matroska" = "x" -a -f conf.matroskatest ; then + AC_MSG_RESULT(yes) + + AC_MSG_CHECKING(Matroska version) + + matroska_version=`cat conf.matroskatest` + mk_MAJVER=`echo $1 | cut -d"." -f1` + mk_MINVER=`echo $1 | cut -d"." -f2` + mk_RELVER=`echo $1 | cut -d"." -f3` + mver_ok=`sed 's;\.;\ ;g' < conf.matroskatest | (read -a mver + if test ${mver[[0]]} -gt $mk_MAJVER ; then + mver_ok=1 + elif test ${mver[[0]]} -lt $mk_MAJVER ; then + mver_ok=0 + else + if test ${mver[[1]]} -gt $mk_MINVER ; then + mver_ok=1 + elif test ${mver[[1]]} -lt $mk_MINVER ; then + mver_ok=0 + else + if test ${mver[[2]]} -ge $mk_RELVER ; then + mver_ok=1 + else + mver_ok=0 + fi + fi + fi + echo $mver_ok )` + if test "$mver_ok" = "1" ; then + AC_MSG_RESULT($matroska_version ok) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT($matroska_version too old) + echo '*** Your Matroska version is too old. Upgrade to at least version' + echo '*** $1 and re-run configure.' + ifelse([$3], , :, [$3]) + fi + + else + AC_MSG_RESULT(no) + ifelse([$3], , :, [$3]) + fi + + AC_SUBST(MATROSKA_CFLAGS) + AC_SUBST(MATROSKA_LIBS) + rm -f conf.matroskatest +]) diff --git a/m4/gst-sdl.m4 b/m4/gst-sdl.m4 new file mode 100644 index 0000000..cfc3196 --- /dev/null +++ b/m4/gst-sdl.m4 @@ -0,0 +1,184 @@ +# stuff for SDL, hope this helps if we put it here + +# Configure paths for SDL +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN([AM_PATH_SDL], +[dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix, + AC_HELP_STRING([--with-sdl-prefix=PFX], + [prefix where SDL is installed (optional)]), + sdl_prefix="$withval", sdl_prefix="") + +AC_ARG_WITH(sdl-exec-prefix, + AC_HELP_STRING([--with-sdl-exec-prefix=PFX], + [exec prefix where SDL is installed (optional)]), + sdl_exec_prefix="$withval", sdl_exec_prefix="") + +AC_ARG_ENABLE(sdltest, + AC_HELP_STRING([--disable-sdltest], + [do not try to compile and run a test SDL program]), + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + AC_PATH_PROG(SDL_CONFIG, sdl-config, no) + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include +#include +#include +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) + diff --git a/m4/gst-shout2.m4 b/m4/gst-shout2.m4 new file mode 100644 index 0000000..e85a767 --- /dev/null +++ b/m4/gst-shout2.m4 @@ -0,0 +1,102 @@ +# Configure paths for libshout +# Jack Moffitt 08-06-2001 +# Shamelessly stolen from Owen Taylor and Manish Singh + +dnl AM_PATH_SHOUT2([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libshout 2, and define SHOUT2_CFLAGS and SHOUT2_LIBS +dnl +AC_DEFUN([AM_PATH_SHOUT2], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(shout2-prefix,[ --with-shout2-prefix=PFX Prefix where libshout2 is installed (optional)], shout2_prefix="$withval", shout2_prefix="") +AC_ARG_ENABLE(shout2test, [ --disable-shout2test Do not try to compile and run a test shout2 program],, enable_shout2test=yes) + + if test "x$shout2_prefix" != "xNONE" ; then + SHOUT2_CFLAGS="-I$shout2_prefix/include" + SHOUT2_LIBS="-L$shout2_prefix/lib" + elif test "x$prefix" != "x"; then + SHOUT2_CFLAGS="-I$prefix/include" + SHOUT2_LIBS="-L$prefix/lib" + fi + + SHOUT2_LIBS="$SHOUT2_LIBS -lshout -lpthread" + + case $host in + *-*-solaris*) + SHOUT2_LIBS="$SHOUT2_LIBS -lnsl -lsocket -lresolv" + esac + + AC_MSG_CHECKING(for shout2) + no_shout2="" + + if test "x$enable_shout2test" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SHOUT2_CFLAGS $OGG_CFLAGS $VORBIS_CFLAGS" + LIBS="$LIBS $SHOUT2_LIBS $OGG_LIBS $VORBIS_LIBS" +dnl +dnl Now check if the installed shout2 is sufficiently new. +dnl + rm -f conf.shout2test + AC_TRY_RUN([ +#include +#include +#include +#include + +int main () +{ + int major, minor, patch; + + system("touch conf.shout2test"); + shout_version(&major, &minor, &patch); + if (major < 2) + return 1; + return 0; +} + +],, no_shout2=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_shout2" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + if test -f conf.shout2test ; then + : + else + echo "*** Could not run Shout2 test program, checking why..." + CFLAGS="$CFLAGS $SHOUT2_CFLAGS $OGG_CFLAGS $VORBIS_CFLAGS" + LIBS="$LIBS $SHOUT2_LIBS $OGG_LIBS $VORBIS_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding Shout2 or finding the wrong" + echo "*** version of Shout2. If it is not finding Shout2, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means Shout2 was incorrectly installed" + echo "*** or that you have moved Shout2 since it was installed. In the latter case, you" + echo "*** may want to edit the shout-config script: $SHOUT2_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + SHOUT2_CFLAGS="" + SHOUT2_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(SHOUT2_CFLAGS) + AC_SUBST(SHOUT2_LIBS) + rm -f conf.shout2test +]) diff --git a/m4/gst-sid.m4 b/m4/gst-sid.m4 new file mode 100644 index 0000000..8ae2877 --- /dev/null +++ b/m4/gst-sid.m4 @@ -0,0 +1,39 @@ +dnl check for sidplay + +AC_DEFUN([GST_PATH_SIDPLAY], +[ +AC_MSG_CHECKING([for libsidplay 1.36.x]) + +AC_LANG_PUSH(C++) + +AC_CHECK_HEADER(sidplay/player.h, HAVE_SIDPLAY="yes", HAVE_SIDPLAY="no") + +if test $HAVE_SIDPLAY = "yes"; then + SIDPLAY_LIBS="-lsidplay" + + AC_MSG_CHECKING([whether -lsidplay works]) + ac_libs_safe=$LIBS + + LIBS="-lsidplay" + + AC_TRY_RUN([ + #include + int main() + { sidTune tune = sidTune(0); } + ], + HAVE_SIDPLAY="yes", + HAVE_SIDPLAY="no", + HAVE_SIDPLAY="no") + + LIBS="$ac_libs_safe" + + AC_MSG_RESULT([$HAVE_SIDPLAY]) +fi + +SIDPLAY_CFLAGS= +SIDPLAY_LIBS="-lsidplay" +AC_SUBST(SIDPLAY_CFLAGS) +AC_SUBST(SIDPLAY_LIBS) + +AC_LANG_POP(C++) +]) diff --git a/m4/gtk.m4 b/m4/gtk.m4 new file mode 100644 index 0000000..f2dd472 --- /dev/null +++ b/m4/gtk.m4 @@ -0,0 +1,194 @@ +# Configure paths for GTK+ +# Owen Taylor 97-11-3 + +dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS +dnl +AC_DEFUN([AM_PATH_GTK], +[dnl +dnl Get the cflags and libraries from the gtk-config script +dnl +AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], + gtk_config_prefix="$withval", gtk_config_prefix="") +AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], + gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") +AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], + , enable_gtktest=yes) + + for module in . $4 + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + AC_PATH_PROG(GTK_CONFIG, gtk-config, no) + min_gtk_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" +dnl +dnl Now check if the installed GTK is sufficiently new. (Also sanity +dnl checks the results of gtk-config to some extent +dnl + rm -f conf.gtktest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GTK_CFLAGS) + AC_SUBST(GTK_LIBS) + rm -f conf.gtktest +]) diff --git a/m4/iconv.m4 b/m4/iconv.m4 new file mode 100644 index 0000000..66bc76f --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,180 @@ +# iconv.m4 serial AM6 (gettext-0.17) +dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ + dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + AC_TRY_RUN([ +#include +#include +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], + [case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac]) + LIBS="$am_save_LIBS" + ]) + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, + [Define if you have the iconv() function and it works.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/m4/intdiv0.m4 b/m4/intdiv0.m4 new file mode 100644 index 0000000..8c8a670 --- /dev/null +++ b/m4/intdiv0.m4 @@ -0,0 +1,84 @@ +# intdiv0.m4 serial 2 (gettext-0.17) +dnl Copyright (C) 2002, 2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([gt_INTDIV0], +[ + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + + AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], + gt_cv_int_divbyzero_sigfpe, + [ + gt_cv_int_divbyzero_sigfpe= +changequote(,)dnl + case "$host_os" in + macos* | darwin[6-9]* | darwin[1-9][0-9]*) + # On MacOS X 10.2 or newer, just assume the same as when cross- + # compiling. If we were to perform the real test, 1 Crash Report + # dialog window would pop up. + case "$host_cpu" in + i[34567]86 | x86_64) + gt_cv_int_divbyzero_sigfpe="guessing yes" ;; + esac + ;; + esac +changequote([,])dnl + if test -z "$gt_cv_int_divbyzero_sigfpe"; then + AC_TRY_RUN([ +#include +#include + +static void +sigfpe_handler (int sig) +{ + /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ + exit (sig != SIGFPE); +} + +int x = 1; +int y = 0; +int z; +int nan; + +int main () +{ + signal (SIGFPE, sigfpe_handler); +/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ +#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) + signal (SIGTRAP, sigfpe_handler); +#endif +/* Linux/SPARC yields signal SIGILL. */ +#if defined (__sparc__) && defined (__linux__) + signal (SIGILL, sigfpe_handler); +#endif + + z = x / y; + nan = y / y; + exit (1); +} +], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, + [ + # Guess based on the CPU. +changequote(,)dnl + case "$host_cpu" in + alpha* | i[34567]86 | x86_64 | m68k | s390*) + gt_cv_int_divbyzero_sigfpe="guessing yes";; + *) + gt_cv_int_divbyzero_sigfpe="guessing no";; + esac +changequote([,])dnl + ]) + fi + ]) + case "$gt_cv_int_divbyzero_sigfpe" in + *yes) value=1;; + *) value=0;; + esac + AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, + [Define if integer division by zero raises signal SIGFPE.]) +]) diff --git a/m4/intlmacosx.m4 b/m4/intlmacosx.m4 new file mode 100644 index 0000000..d3f0d90 --- /dev/null +++ b/m4/intlmacosx.m4 @@ -0,0 +1,51 @@ +# intlmacosx.m4 serial 1 (gettext-0.17) +dnl Copyright (C) 2004-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Checks for special options needed on MacOS X. +dnl Defines INTL_MACOSX_LIBS. +AC_DEFUN([gt_INTL_MACOSX], +[ + dnl Check for API introduced in MacOS X 10.2. + AC_CACHE_CHECK([for CFPreferencesCopyAppValue], + gt_cv_func_CFPreferencesCopyAppValue, + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#include ], + [CFPreferencesCopyAppValue(NULL, NULL)], + [gt_cv_func_CFPreferencesCopyAppValue=yes], + [gt_cv_func_CFPreferencesCopyAppValue=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1, + [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) + fi + dnl Check for API introduced in MacOS X 10.3. + AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent, + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], + [gt_cv_func_CFLocaleCopyCurrent=yes], + [gt_cv_func_CFLocaleCopyCurrent=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1, + [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + AC_SUBST([INTL_MACOSX_LIBS]) +]) diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4 new file mode 100644 index 0000000..7c7f894 --- /dev/null +++ b/m4/inttypes-pri.m4 @@ -0,0 +1,36 @@ +# inttypes-pri.m4 serial 4 (gettext-0.16) +dnl Copyright (C) 1997-2002, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ(2.52) + +# Define PRI_MACROS_BROKEN if exists and defines the PRI* +# macros to non-string values. This is the case on AIX 4.3.3. + +AC_DEFUN([gt_INTTYPES_PRI], +[ + AC_CHECK_HEADERS([inttypes.h]) + if test $ac_cv_header_inttypes_h = yes; then + AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], + gt_cv_inttypes_pri_broken, + [ + AC_TRY_COMPILE([#include +#ifdef PRId32 +char *p = PRId32; +#endif +], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) + ]) + fi + if test "$gt_cv_inttypes_pri_broken" = yes; then + AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, + [Define if exists and defines unusable PRI* macros.]) + PRI_MACROS_BROKEN=1 + else + PRI_MACROS_BROKEN=0 + fi + AC_SUBST([PRI_MACROS_BROKEN]) +]) diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4 new file mode 100644 index 0000000..edc8ecb --- /dev/null +++ b/m4/inttypes_h.m4 @@ -0,0 +1,26 @@ +# inttypes_h.m4 serial 7 +dnl Copyright (C) 1997-2004, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([gl_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1; return !i;], + gl_cv_header_inttypes_h=yes, + gl_cv_header_inttypes_h=no)]) + if test $gl_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4 new file mode 100644 index 0000000..19aa77e --- /dev/null +++ b/m4/lcmessage.m4 @@ -0,0 +1,30 @@ +# lcmessage.m4 serial 4 (gettext-0.14.2) +dnl Copyright (C) 1995-2002, 2004-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995. + +# Check whether LC_MESSAGES is available in . + +AC_DEFUN([gt_LC_MESSAGES], +[ + AC_CACHE_CHECK([for LC_MESSAGES], gt_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + gt_cv_val_LC_MESSAGES=yes, gt_cv_val_LC_MESSAGES=no)]) + if test $gt_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi +]) diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4 new file mode 100644 index 0000000..96c4e2c --- /dev/null +++ b/m4/lib-ld.m4 @@ -0,0 +1,110 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/m4/lib-link.m4 b/m4/lib-link.m4 new file mode 100644 index 0000000..e3d26fc --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,709 @@ +# lib-link.m4 serial 13 (gettext-0.17) +dnl Copyright (C) 2001-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ(2.54) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + LIB[]NAME[]_PREFIX= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl acl_libext, +dnl acl_shlibext, +dnl acl_hardcode_libdir_flag_spec, +dnl acl_hardcode_libdir_separator, +dnl acl_hardcode_direct, +dnl acl_hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found +dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl Autoconf >= 2.61 supports dots in --with options. + define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], +[ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + LIB[]NAME[]_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + dnl The same code as in the loop below: + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$acl_hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIB[]NAME[]_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 new file mode 100644 index 0000000..a8684e1 --- /dev/null +++ b/m4/lib-prefix.m4 @@ -0,0 +1,185 @@ +# lib-prefix.m4 serial 5 (gettext-0.15) +dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing +dnl the basename of the libdir, either "lib" or "lib64". +AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +[ + dnl There is no formal standard regarding lib and lib64. The current + dnl practice is that on a system supporting 32-bit and 64-bit instruction + dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit + dnl libraries go under $prefix/lib. We determine the compiler's default + dnl mode by looking at the compiler's library search path. If at least + dnl of its elements ends in /lib64 or points to a directory whose absolute + dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the + dnl default, namely "lib". + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi +]) diff --git a/m4/libfame.m4 b/m4/libfame.m4 new file mode 100644 index 0000000..b570584 --- /dev/null +++ b/m4/libfame.m4 @@ -0,0 +1,182 @@ +dnl AM_PATH_LIBFAME([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for libfame, and define LIBFAME_CFLAGS and LIBFAME_LIBS +dnl Vivien Chappelier 12/11/00 +dnl stolen from ORBit autoconf +dnl +AC_DEFUN([AM_PATH_LIBFAME], +[dnl +dnl Get the cflags and libraries from the libfame-config script +dnl +AC_ARG_WITH(libfame-prefix,[ --with-libfame-prefix=PFX Prefix where libfame is installed (optional)], + libfame_config_prefix="$withval", libfame_config_prefix="") +AC_ARG_WITH(libfame-exec-prefix,[ --with-libfame-exec-prefix=PFX Exec prefix where libfame is installed (optional)], + libfame_config_exec_prefix="$withval", libfame_config_exec_prefix="") +AC_ARG_ENABLE(libfametest, [ --disable-libfametest Do not try to compile and run a test libfame program], + , enable_libfametest=yes) + + if test x$libfame_config_exec_prefix != x ; then + libfame_config_args="$libfame_config_args --exec-prefix=$libfame_config_exec_prefix" + if test x${LIBFAME_CONFIG+set} != xset ; then + LIBFAME_CONFIG=$libfame_config_exec_prefix/bin/libfame-config + fi + fi + if test x$libfame_config_prefix != x ; then + libfame_config_args="$libfame_config_args --prefix=$libfame_config_prefix" + if test x${LIBFAME_CONFIG+set} != xset ; then + LIBFAME_CONFIG=$libfame_config_prefix/bin/libfame-config + fi + fi + + AC_PATH_PROG(LIBFAME_CONFIG, libfame-config, no) + min_libfame_version=ifelse([$1], , 0.9.0, $1) + AC_MSG_CHECKING(for libfame - version >= $min_libfame_version) + no_libfame="" + if test "$LIBFAME_CONFIG" = "no" ; then + no_libfame=yes + else + LIBFAME_CFLAGS=`$LIBFAME_CONFIG $libfame_config_args --cflags` + LIBFAME_LIBS=`$LIBFAME_CONFIG $libfame_config_args --libs` + libfame_config_major_version=`$LIBFAME_CONFIG $libfame_config_args --version | \ + sed -e 's,[[^0-9.]],,g' -e 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + libfame_config_minor_version=`$LIBFAME_CONFIG $libfame_config_args --version | \ + sed -e 's,[[^0-9.]],,g' -e 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + libfame_config_micro_version=`$LIBFAME_CONFIG $libfame_config_args --version | \ + sed -e 's,[[^0-9.]],,g' -e 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_libfametest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $LIBFAME_CFLAGS" + LIBS="$LIBFAME_LIBS $LIBS" +dnl +dnl Now check if the installed LIBFAME is sufficiently new. (Also sanity +dnl checks the results of libfame-config to some extent +dnl + rm -f conf.libfametest + AC_TRY_RUN([ +#include +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.libfametest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = strdup("$min_libfame_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_libfame_version"); + exit(1); + } + + if ((libfame_major_version != $libfame_config_major_version) || + (libfame_minor_version != $libfame_config_minor_version) || + (libfame_micro_version != $libfame_config_micro_version)) + { + printf("\n*** 'libfame-config --version' returned %d.%d.%d, but Libfame (%d.%d.%d)\n", + $libfame_config_major_version, $libfame_config_minor_version, $libfame_config_micro_version, + libfame_major_version, libfame_minor_version, libfame_micro_version); + printf ("*** was found! If libfame-config was correct, then it is best\n"); + printf ("*** to remove the old version of libfame. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If libfame-config was wrong, set the environment variable LIBFAME_CONFIG\n"); + printf("*** to point to the correct copy of libfame-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (LIBFAME_MAJOR_VERSION) && defined (LIBFAME_MINOR_VERSION) && defined (LIBFAME_MICRO_VERSION) + else if ((libfame_major_version != LIBFAME_MAJOR_VERSION) || + (libfame_minor_version != LIBFAME_MINOR_VERSION) || + (libfame_micro_version != LIBFAME_MICRO_VERSION)) + { + printf("*** libfame header files (version %d.%d.%d) do not match\n", + LIBFAME_MAJOR_VERSION, LIBFAME_MINOR_VERSION, LIBFAME_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + libfame_major_version, libfame_minor_version, libfame_micro_version); + } +#endif /* defined (LIBFAME_MAJOR_VERSION) ... */ + else + { + if ((libfame_major_version > major) || + ((libfame_major_version == major) && (libfame_minor_version > minor)) || + ((libfame_major_version == major) && (libfame_minor_version == minor) && (libfame_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of libfame (%d.%d.%d) was found.\n", + libfame_major_version, libfame_minor_version, libfame_micro_version); + printf("*** You need a version of libfame newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** libfame is always available from http://www-eleves.enst-bretagne.fr/~chappeli/fame\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the libfame-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of libfame, but you can also set the LIBFAME_CONFIG environment to point to the\n"); + printf("*** correct copy of libfame-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_libfame=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_libfame" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$LIBFAME_CONFIG" = "no" ; then + echo "*** The libfame-config script installed by libfame could not be found" + echo "*** If libfame was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the LIBFAME_CONFIG environment variable to the" + echo "*** full path to libfame-config." + else + if test -f conf.libfametest ; then + : + else + echo "*** Could not run libfame test program, checking why..." + CFLAGS="$CFLAGS $LIBFAME_CFLAGS" + LIBS="$LIBS $LIBFAME_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((libfame_major_version) || (libfame_minor_version) || (libfame_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding libfame or finding the wrong" + echo "*** version of LIBFAME. If it is not finding libfame, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means libfame was incorrectly installed" + echo "*** or that you have moved libfame since it was installed. In the latter case, you" + echo "*** may want to edit the libfame-config script: $LIBFAME_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + LIBFAME_CFLAGS="" + LIBFAME_LIBS="" + ifelse([$3], , :, [$3]) + fi + + AC_SUBST(LIBFAME_CFLAGS) + AC_SUBST(LIBFAME_LIBS) + rm -f conf.libfametest +]) diff --git a/m4/libmikmod.m4 b/m4/libmikmod.m4 new file mode 100644 index 0000000..9368d75 --- /dev/null +++ b/m4/libmikmod.m4 @@ -0,0 +1,216 @@ +# Configure paths for libmikmod +# +# Derived from glib.m4 (Owen Taylor 97-11-3) +# Improved by Chris Butler +# + +dnl AM_PATH_LIBMIKMOD([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libmikmod, and define LIBMIKMOD_CFLAGS, LIBMIKMOD_LIBS and +dnl LIBMIKMOD_LDADD +dnl +AC_DEFUN([AM_PATH_LIBMIKMOD], +[dnl +dnl Get the cflags and libraries from the libmikmod-config script +dnl +AC_ARG_WITH(libmikmod-prefix, + AC_HELP_STRING([--with-libmikmod-prefix=PFX], + [prefix where libmikmod is installed (optional)]), + libmikmod_config_prefix="$withval", libmikmod_config_prefix="") + +AC_ARG_WITH(libmikmod-exec-prefix, + AC_HELP_STRING([--with-libmikmod-exec-prefix=PFX], + [exec prefix where libmikmod is installed (optional)]), + libmikmod_config_exec_prefix="$withval", libmikmod_config_exec_prefix="") + +AC_ARG_ENABLE(libmikmodtest, + AC_HELP_STRING([--disable-libmikmodtest], + [Do not try to compile and run a test libmikmod program]), + , enable_libmikmodtest=yes) + + if test x$libmikmod_config_exec_prefix != x ; then + libmikmod_config_args="$libmikmod_config_args --exec-prefix=$libmikmod_config_exec_prefix" + if test x${LIBMIKMOD_CONFIG+set} != xset ; then + LIBMIKMOD_CONFIG=$libmikmod_config_exec_prefix/bin/libmikmod-config + fi + fi + if test x$libmikmod_config_prefix != x ; then + libmikmod_config_args="$libmikmod_config_args --prefix=$libmikmod_config_prefix" + if test x${LIBMIKMOD_CONFIG+set} != xset ; then + LIBMIKMOD_CONFIG=$libmikmod_config_prefix/bin/libmikmod-config + fi + fi + + AC_PATH_PROG(LIBMIKMOD_CONFIG, libmikmod-config, no) + min_libmikmod_version=ifelse([$1], ,3.1.5,$1) + AC_MSG_CHECKING(for libmikmod - version >= $min_libmikmod_version) + no_libmikmod="" + if test "$LIBMIKMOD_CONFIG" = "no" ; then + no_libmikmod=yes + else + LIBMIKMOD_CFLAGS=`$LIBMIKMOD_CONFIG $libmikmod_config_args --cflags` + LIBMIKMOD_LIBS=`$LIBMIKMOD_CONFIG $libmikmod_config_args --libs` + LIBMIKMOD_LDADD=`$LIBMIKMOD_CONFIG $libmikmod_config_args --ldadd` + libmikmod_config_major_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\1/'` + libmikmod_config_minor_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\2/'` + libmikmod_config_micro_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\3/'` + if test "x$enable_libmikmodtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + AC_LANG_SAVE + AC_LANG_C + CFLAGS="$CFLAGS $LIBMIKMOD_CFLAGS $LIBMIKMOD_LDADD" + LIBS="$LIBMIKMOD_LIBS $LIBS" +dnl +dnl Now check if the installed libmikmod is sufficiently new. (Also sanity +dnl checks the results of libmikmod-config to some extent +dnl + rm -f conf.mikmodtest + AC_TRY_RUN([ +#include +#include +#include +#include + +char* my_strdup (char *str) +{ + char *new_str; + + if (str) { + new_str = malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } else + new_str = NULL; + + return new_str; +} + +int main() +{ + int major,minor,micro; + int libmikmod_major_version,libmikmod_minor_version,libmikmod_micro_version; + char *tmp_version; + + system("touch conf.mikmodtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_libmikmod_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_libmikmod_version"); + exit(1); + } + + libmikmod_major_version=(MikMod_GetVersion() >> 16) & 255; + libmikmod_minor_version=(MikMod_GetVersion() >> 8) & 255; + libmikmod_micro_version=(MikMod_GetVersion() ) & 255; + + if ((libmikmod_major_version != $libmikmod_config_major_version) || + (libmikmod_minor_version != $libmikmod_config_minor_version) || + (libmikmod_micro_version != $libmikmod_config_micro_version)) + { + printf("\n*** 'libmikmod-config --version' returned %d.%d.%d, but libmikmod (%d.%d.%d)\n", + $libmikmod_config_major_version, $libmikmod_config_minor_version, $libmikmod_config_micro_version, + libmikmod_major_version, libmikmod_minor_version, libmikmod_micro_version); + printf ("*** was found! If libmikmod-config was correct, then it is best\n"); + printf ("*** to remove the old version of libmikmod. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If libmikmod-config was wrong, set the environment variable LIBMIKMOD_CONFIG\n"); + printf("*** to point to the correct copy of libmikmod-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } + else if ((libmikmod_major_version != LIBMIKMOD_VERSION_MAJOR) || + (libmikmod_minor_version != LIBMIKMOD_VERSION_MINOR) || + (libmikmod_micro_version != LIBMIKMOD_REVISION)) + { + printf("*** libmikmod header files (version %ld.%ld.%ld) do not match\n", + LIBMIKMOD_VERSION_MAJOR, LIBMIKMOD_VERSION_MINOR, LIBMIKMOD_REVISION); + printf("*** library (version %d.%d.%d)\n", + libmikmod_major_version, libmikmod_minor_version, libmikmod_micro_version); + } + else + { + if ((libmikmod_major_version > major) || + ((libmikmod_major_version == major) && (libmikmod_minor_version > minor)) || + ((libmikmod_major_version == major) && (libmikmod_minor_version == minor) && (libmikmod_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of libmikmod (%d.%d.%d) was found.\n", + libmikmod_major_version, libmikmod_minor_version, libmikmod_micro_version); + printf("*** You need a version of libmikmod newer than %d.%d.%d.\n", + major, minor, micro); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the libmikmod-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of libmikmod, but you can also set the LIBMIKMOD_CONFIG environment to point to the\n"); + printf("*** correct copy of libmikmod-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_libmikmod=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + AC_LANG_RESTORE + fi + fi + if test "x$no_libmikmod" = x ; then + AC_MSG_RESULT([yes, `$LIBMIKMOD_CONFIG --version`]) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$LIBMIKMOD_CONFIG" = "no" ; then + echo "*** The libmikmod-config script installed by libmikmod could not be found" + echo "*** If libmikmod was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the LIBMIKMOD_CONFIG environment variable to the" + echo "*** full path to libmikmod-config." + else + if test -f conf.mikmodtest ; then + : + else + echo "*** Could not run libmikmod test program, checking why..." + CFLAGS="$CFLAGS $LIBMIKMOD_CFLAGS" + LIBS="$LIBS $LIBMIKMOD_LIBS" + AC_LANG_SAVE + AC_LANG_C + AC_TRY_LINK([ +#include +#include +], [ return (MikMod_GetVersion()!=0); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding libmikmod or finding the wrong" + echo "*** version of libmikmod. If it is not finding libmikmod, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location. Also, make sure you have run ldconfig if that" + echo "*** is required on your system." + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means libmikmod was incorrectly installed" + echo "*** or that you have moved libmikmod since it was installed. In the latter case, you" + echo "*** may want to edit the libmikmod-config script: $LIBMIKMOD_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + AC_LANG_RESTORE + fi + fi + LIBMIKMOD_CFLAGS="" + LIBMIKMOD_LIBS="" + LIBMIKMOD_LDADD="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(LIBMIKMOD_CFLAGS) + AC_SUBST(LIBMIKMOD_LIBS) + AC_SUBST(LIBMIKMOD_LDADD) + rm -f conf.mikmodtest +]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..828104c --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,8001 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100644 index 0000000..5d9acd8 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,384 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 new file mode 100644 index 0000000..07a8602 --- /dev/null +++ b/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c573da9 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -0,0 +1,98 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/m4/nls.m4 b/m4/nls.m4 new file mode 100644 index 0000000..7967cc2 --- /dev/null +++ b/m4/nls.m4 @@ -0,0 +1,31 @@ +# nls.m4 serial 3 (gettext-0.15) +dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ(2.50) + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) +]) diff --git a/m4/ogg.m4 b/m4/ogg.m4 new file mode 100644 index 0000000..0e1f1ab --- /dev/null +++ b/m4/ogg.m4 @@ -0,0 +1,102 @@ +# Configure paths for libogg +# Jack Moffitt 10-21-2000 +# Shamelessly stolen from Owen Taylor and Manish Singh + +dnl XIPH_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS +dnl +AC_DEFUN([XIPH_PATH_OGG], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(ogg,[ --with-ogg=PFX Prefix where libogg is installed (optional)], ogg_prefix="$withval", ogg_prefix="") +AC_ARG_WITH(ogg-libraries,[ --with-ogg-libraries=DIR Directory where libogg library is installed (optional)], ogg_libraries="$withval", ogg_libraries="") +AC_ARG_WITH(ogg-includes,[ --with-ogg-includes=DIR Directory where libogg header files are installed (optional)], ogg_includes="$withval", ogg_includes="") +AC_ARG_ENABLE(oggtest, [ --disable-oggtest Do not try to compile and run a test Ogg program],, enable_oggtest=yes) + + if test "x$ogg_libraries" != "x" ; then + OGG_LIBS="-L$ogg_libraries" + elif test "x$ogg_prefix" != "x" ; then + OGG_LIBS="-L$ogg_prefix/lib" + elif test "x$prefix" != "xNONE" ; then + OGG_LIBS="-L$prefix/lib" + fi + + OGG_LIBS="$OGG_LIBS -logg" + + if test "x$ogg_includes" != "x" ; then + OGG_CFLAGS="-I$ogg_includes" + elif test "x$ogg_prefix" != "x" ; then + OGG_CFLAGS="-I$ogg_prefix/include" + elif test "x$prefix" != "xNONE"; then + OGG_CFLAGS="-I$prefix/include" + fi + + AC_MSG_CHECKING(for Ogg) + no_ogg="" + + + if test "x$enable_oggtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $OGG_LIBS" +dnl +dnl Now check if the installed Ogg is sufficiently new. +dnl + rm -f conf.oggtest + AC_TRY_RUN([ +#include +#include +#include +#include + +int main () +{ + system("touch conf.oggtest"); + return 0; +} + +],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_ogg" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + if test -f conf.oggtest ; then + : + else + echo "*** Could not run Ogg test program, checking why..." + CFLAGS="$CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $OGG_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding Ogg or finding the wrong" + echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means Ogg was incorrectly installed" + echo "*** or that you have moved Ogg since it was installed." ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + OGG_CFLAGS="" + OGG_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(OGG_CFLAGS) + AC_SUBST(OGG_LIBS) + rm -f conf.oggtest +]) diff --git a/m4/po.m4 b/m4/po.m4 new file mode 100644 index 0000000..0734762 --- /dev/null +++ b/m4/po.m4 @@ -0,0 +1,449 @@ +# po.m4 serial 15 (gettext-0.17) +dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ(2.50) + +dnl Checks for all prerequisites of the po subdirectory. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake + AC_REQUIRE([AM_NLS])dnl + + dnl Release version of the gettext macros. This is used to ensure that + dnl the gettext macros and po/Makefile.in.in are in sync. + AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Test whether it is GNU msgfmt >= 0.15. +changequote(,)dnl + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([MSGFMT_015]) +changequote(,)dnl + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([GMSGFMT_015]) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Test whether it is GNU xgettext >= 0.15. +changequote(,)dnl + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac +changequote([,])dnl + AC_SUBST([XGETTEXT_015]) + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) + + dnl Installation directories. + dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we + dnl have to define it here, so that it can be used in po/Makefile. + test -n "$localedir" || localedir='${datadir}/locale' + AC_SUBST([localedir]) + + dnl Support for AM_XGETTEXT_OPTION. + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) + + AC_CONFIG_COMMANDS([po-directories], [[ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done]], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + +dnl Postprocesses a Makefile in a directory containing PO files. +AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +[ + # When this code is run, in config.status, two variables have already been + # set: + # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, + # - LINGUAS is the value of the environment variable LINGUAS at configure + # time. + +changequote(,)dnl + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + # Find a way to echo strings without interpreting backslash. + if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='echo' + else + if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='printf %s\n' + else + echo_func () { + cat < "$ac_file.tmp" + if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + cat >> "$ac_file.tmp" < /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` + cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. + +AC_PREREQ(2.50) + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[ +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4 new file mode 100644 index 0000000..db9a8ac --- /dev/null +++ b/m4/stdint_h.m4 @@ -0,0 +1,26 @@ +# stdint_h.m4 serial 6 +dnl Copyright (C) 1997-2004, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([gl_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1; return !i;], + gl_cv_header_stdint_h=yes, + gl_cv_header_stdint_h=no)]) + if test $gl_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/uintmax_t.m4 b/m4/uintmax_t.m4 new file mode 100644 index 0000000..641c489 --- /dev/null +++ b/m4/uintmax_t.m4 @@ -0,0 +1,30 @@ +# uintmax_t.m4 serial 10 +dnl Copyright (C) 1997-2004, 2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define uintmax_t to 'unsigned long' or 'unsigned long long' +# if it is not already defined in or . + +AC_DEFUN([gl_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gl_AC_HEADER_STDINT_H]) + if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then + AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT]) + test $ac_cv_type_unsigned_long_long_int = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, + [Define to unsigned long or unsigned long long + if and don't define.]) + else + AC_DEFINE(HAVE_UINTMAX_T, 1, + [Define if you have the 'uintmax_t' type in or .]) + fi +]) diff --git a/m4/vorbis.m4 b/m4/vorbis.m4 new file mode 100644 index 0000000..6a28893 --- /dev/null +++ b/m4/vorbis.m4 @@ -0,0 +1,128 @@ +# Configure paths for libvorbis +# Jack Moffitt 10-21-2000 +# Shamelessly stolen from Owen Taylor and Manish Singh +# thomasvs added check for vorbis_bitrate_addblock which is new in rc3 +# thomasvs added check for OV_ECTL_RATEMANAGE_SET which is new in 1.0 final + +dnl XIPH_PATH_VORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libvorbis, and define VORBIS_CFLAGS and VORBIS_LIBS +dnl +AC_DEFUN([XIPH_PATH_VORBIS], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(vorbis,[ --with-vorbis=PFX Prefix where libvorbis is installed (optional)], vorbis_prefix="$withval", vorbis_prefix="") +AC_ARG_WITH(vorbis-libraries,[ --with-vorbis-libraries=DIR Directory where libvorbis library is installed (optional)], vorbis_libraries="$withval", vorbis_libraries="") +AC_ARG_WITH(vorbis-includes,[ --with-vorbis-includes=DIR Directory where libvorbis header files are installed (optional)], vorbis_includes="$withval", vorbis_includes="") +AC_ARG_ENABLE(vorbistest, [ --disable-vorbistest Do not try to compile and run a test Vorbis program],, enable_vorbistest=yes) + + if test "x$vorbis_libraries" != "x" ; then + VORBIS_LIBS="-L$vorbis_libraries" + elif test "x$vorbis_prefix" != "x" ; then + VORBIS_LIBS="-L$vorbis_prefix/lib" + elif test "x$prefix" != "xNONE"; then + VORBIS_LIBS="-L$prefix/lib" + fi + + VORBIS_LIBS="$VORBIS_LIBS -lvorbis -lm" + VORBISFILE_LIBS="-lvorbisfile" + VORBISENC_LIBS="-lvorbisenc" + + if test "x$vorbis_includes" != "x" ; then + VORBIS_CFLAGS="-I$vorbis_includes" + elif test "x$vorbis_prefix" != "x" ; then + VORBIS_CFLAGS="-I$vorbis_prefix/include" + elif test "x$prefix" != "xNONE"; then + VORBIS_CFLAGS="-I$prefix/include" + fi + + + AC_MSG_CHECKING(for Vorbis) + no_vorbis="" + + + if test "x$enable_vorbistest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $VORBIS_CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $VORBIS_LIBS $VORBISENC_LIBS $OGG_LIBS" +dnl +dnl Now check if the installed Vorbis is sufficiently new. +dnl + rm -f conf.vorbistest + AC_TRY_RUN([ +#include +#include +#include +#include +#include + +int main () +{ + vorbis_block vb; + vorbis_dsp_state vd; + vorbis_info vi; + + vorbis_info_init (&vi); + vorbis_encode_init (&vi, 2, 44100, -1, 128000, -1); + vorbis_analysis_init (&vd, &vi); + vorbis_block_init (&vd, &vb); + /* this function was added in 1.0rc3, so this is what we're testing for */ + vorbis_bitrate_addblock (&vb); + + /* this define was added in 1.0 final */ +#ifdef OV_ECTL_RATEMANAGE_SET + system("touch conf.vorbistest"); + return 0; +#else + return -1; +#endif +} + +],, no_vorbis=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_vorbis" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + if test -f conf.vorbistest ; then + : + else + echo "*** Could not run Vorbis test program, checking why..." + CFLAGS="$CFLAGS $VORBIS_CFLAGS" + LIBS="$LIBS $VORBIS_LIBS $OGG_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding Vorbis or finding the wrong" + echo "*** version of Vorbis. If it is not finding Vorbis, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means Vorbis was incorrectly installed" + echo "*** or that you have moved Vorbis since it was installed." ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + VORBIS_CFLAGS="" + VORBIS_LIBS="" + VORBISFILE_LIBS="" + VORBISENC_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(VORBIS_CFLAGS) + AC_SUBST(VORBIS_LIBS) + AC_SUBST(VORBISFILE_LIBS) + AC_SUBST(VORBISENC_LIBS) + rm -f conf.vorbistest +]) diff --git a/missing b/missing new file mode 100755 index 0000000..86a8fc3 --- /dev/null +++ b/missing @@ -0,0 +1,331 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2012-01-06.13; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/packaging/gst-plugins-good-disable-gtk-doc.patch b/packaging/gst-plugins-good-disable-gtk-doc.patch new file mode 100644 index 0000000..89d83fc --- /dev/null +++ b/packaging/gst-plugins-good-disable-gtk-doc.patch @@ -0,0 +1,13 @@ +Index: gst-plugins-good-0.10.29/autogen.sh +=================================================================== +--- gst-plugins-good-0.10.29.orig/autogen.sh 2011-09-15 14:49:32.512952082 +0900 ++++ gst-plugins-good-0.10.29/autogen.sh 2011-09-15 14:49:40.016951607 +0900 +@@ -30,7 +30,7 @@ + fi + + +-CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc' ++CONFIGURE_DEF_OPT='--enable-maintainer-mode' + + autogen_options $@ + diff --git a/packaging/gst-plugins-good.spec b/packaging/gst-plugins-good.spec new file mode 100644 index 0000000..db7de8a --- /dev/null +++ b/packaging/gst-plugins-good.spec @@ -0,0 +1,154 @@ +#sbs-git:slp/pkgs/g/gst-plugins-good0.10 gst-plugins-good 0.10.31 6e8625ba6fe94fb9d09e6c3be220b54ffaa01273 +Name: gst-plugins-good +Summary: GStreamer plugins from the "good" set +Version: 0.10.31 +Release: 18 +Group: Applications/Multimedia +License: LGPLv2+ +Source0: %{name}-%{version}.tar.gz +#Patch0 : gst-plugins-good-divx-drm.patch +#Patch1 : gst-plugins-good-ebml-read.patch +#Patch2 : gst-plugins-good-gstrtph264pay.patch +#Patch3 : gst-plugins-good-mkv-demux.patch +#Patch4 : gst-plugins-good-parse-frame.patch +#Patch5 : gst-plugins-good-qtdemux.patch +Patch6 : gst-plugins-good-disable-gtk-doc.patch +BuildRequires: gettext +BuildRequires: which +BuildRequires: gst-plugins-base-devel +BuildRequires: libjpeg-turbo-devel +BuildRequires: pkgconfig(gstreamer-0.10) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(libpng) +BuildRequires: pkgconfig(libsoup-2.4) +BuildRequires: pkgconfig(libpulse) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(xfixes) +BuildRequires: pkgconfig(xdamage) +BuildRequires: pkgconfig(xext) + +%description +GStreamer is a streaming media framework, based on graphs of filters +which operate on media data. Applications using this library can do +anything from real-time sound processing to playing videos, and just +about anything else media-related. Its plugin-based architecture means +that new data types or processing capabilities can be added simply by +installing new plug-ins. +This package contains the GStreamer plugins from the "good" set, a set +of good-quality plug-ins under the LGPL license. + + +%prep +%setup -q +#%patch0 -p1 +#%patch1 -p1 +#%patch2 -p1 +#%patch3 -p1 +#%patch4 -p1 +#%patch5 -p1 +%patch6 -p1 + + +%build +./autogen.sh + +export CFLAGS+=" -Wall -g -fPIC\ + -DGST_EXT_SOUP_MODIFICATION \ + -DGST_EXT_RTSPSRC_MODIFICATION \ + -DGST_EXT_AMRPARSER_MODIFICATION \ + -DGST_EXT_AACPARSER_MODIFICATION \ + -DGST_EXT_MPEGAUDIO_MODIFICATION" + +%configure --prefix=%{_prefix}\ + --disable-static\ +%ifarch %{arm} + --enable-divx-drm\ +%endif + --disable-nls\ + --with-html-dir=/tmp/dump\ + --disable-examples\ + --disable-gconftool\ + --disable-alpha\ + --disable-apetag\ + --disable-audiofx\ + --disable-auparse\ + --disable-cutter\ + --disable-debugutils\ + --disable-deinterlace\ + --disable-effectv\ + --disable-equalizer\ + --disable-icydemux\ + --disable-flx\ + --disable-goom\ + --disable-goom2k1\ + --disable-level\ + --disable-monoscope\ + --disable-replaygain\ + --disable-smpte\ + --disable-spectrum\ + --disable-videobox\ + --disable-videomixer\ + --disable-y4m\ + --disable-directsound\ + --disable-oss\ + --disable-sunaudio\ + --disable-osx_aidio\ + --disable-osx_video\ + --disable-aalib\ + --disable-aalibtest\ + --disable-annodex\ + --disable-cairo\ + --disable-esd\ + --disable-esdtest\ + --disable-flac\ + --disable-gconf\ + --disable-hal\ + --disable-libcaca\ + --disable-libdv\ + --disable-dv1394\ + --disable-shout2\ + --disable-shout2test\ + --disable-speex\ + --disable-taglib + + +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + + + + +%files +%manifest gst-plugins-good.manifest +%defattr(-,root,root,-) +%{_libdir}/gstreamer-0.10 +%{_libdir}/gstreamer-0.10/libgstavi.so +%{_libdir}/gstreamer-0.10/libgstrtsp.so +%{_libdir}/gstreamer-0.10/libgstisomp4.so +%{_libdir}/gstreamer-0.10/libgstvideocrop.so +%{_libdir}/gstreamer-0.10/libgstid3demux.so +%{_libdir}/gstreamer-0.10/libgstpulse.so +%{_libdir}/gstreamer-0.10/libgstmultifile.so +%{_libdir}/gstreamer-0.10/libgstpng.so +%{_libdir}/gstreamer-0.10/libgstflv.so +%{_libdir}/gstreamer-0.10/libgstudp.so +%{_libdir}/gstreamer-0.10/libgstximagesrc.so +%{_libdir}/gstreamer-0.10/libgstalaw.so +%{_libdir}/gstreamer-0.10/libgstrtpmanager.so +%{_libdir}/gstreamer-0.10/libgstaudioparsers.so +%{_libdir}/gstreamer-0.10/libgstimagefreeze.so +%{_libdir}/gstreamer-0.10/libgstjpeg.so +%{_libdir}/gstreamer-0.10/libgstautodetect.so +%{_libdir}/gstreamer-0.10/libgstvideofilter.so +%{_libdir}/gstreamer-0.10/libgstmatroska.so +%{_libdir}/gstreamer-0.10/libgstmulaw.so +%{_libdir}/gstreamer-0.10/libgstrtp.so +%{_libdir}/gstreamer-0.10/libgstwavparse.so +%{_libdir}/gstreamer-0.10/libgstwavenc.so +%{_libdir}/gstreamer-0.10/libgstvideo4linux2.so +%{_libdir}/gstreamer-0.10/libgstshapewipe.so +%{_libdir}/gstreamer-0.10/libgstoss4audio.so +%{_libdir}/gstreamer-0.10/libgstsouphttpsrc.so diff --git a/pkgconfig/Makefile.am b/pkgconfig/Makefile.am new file mode 100644 index 0000000..1d26798 --- /dev/null +++ b/pkgconfig/Makefile.am @@ -0,0 +1,31 @@ +### all of the standard pc files we need to generate +pcverfiles = \ + gstreamer-plugins-good-@GST_MAJORMINOR@.pc +pcverfiles_uninstalled = \ + gstreamer-plugins-good-@GST_MAJORMINOR@-uninstalled.pc + +### all-local: $(pcverfiles) $(pcverfiles_uninstalled) +all-local: $(pcverfiles_uninstalled) + +cp_verbose = $(cp_verbose_$(V)) +cp_verbose_ = $(cp_verbose_$(AM_DEFAULT_VERBOSITY)) +cp_verbose_0 = @echo " CP $@"; + +### how to generate versioned .pc files from .pc files in this dir +%-@GST_MAJORMINOR@.pc: %.pc + $(cp_verbose)cp $< $@ +%-@GST_MAJORMINOR@-uninstalled.pc: %-uninstalled.pc + $(cp_verbose)cp $< $@ + +# do not install for now +# pkgconfigdir = $(libdir)/pkgconfig +# pkgconfig_DATA = $(pcverfiles) + +CLEANFILES = $(pcverfiles) $(pcverfiles_uninstalled) +# pcinfiles = \ +# gstreamer-plugins-good.pc.in gstreamer-plugins-good-uninstalled.pc.in +pcinfiles = \ + gstreamer-plugins-good-uninstalled.pc.in + +DISTCLEANFILES = $(pcinfiles:.in=) +EXTRA_DIST = $(pcinfiles) diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in new file mode 100644 index 0000000..7a5838e --- /dev/null +++ b/pkgconfig/Makefile.in @@ -0,0 +1,642 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = pkgconfig +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/gstreamer-plugins-good-uninstalled.pc.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = gstreamer-plugins-good-uninstalled.pc +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +### all of the standard pc files we need to generate +pcverfiles = \ + gstreamer-plugins-good-@GST_MAJORMINOR@.pc + +pcverfiles_uninstalled = \ + gstreamer-plugins-good-@GST_MAJORMINOR@-uninstalled.pc + +cp_verbose = $(cp_verbose_$(V)) +cp_verbose_ = $(cp_verbose_$(AM_DEFAULT_VERBOSITY)) +cp_verbose_0 = @echo " CP $@"; + +# do not install for now +# pkgconfigdir = $(libdir)/pkgconfig +# pkgconfig_DATA = $(pcverfiles) +CLEANFILES = $(pcverfiles) $(pcverfiles_uninstalled) +# pcinfiles = \ +# gstreamer-plugins-good.pc.in gstreamer-plugins-good-uninstalled.pc.in +pcinfiles = \ + gstreamer-plugins-good-uninstalled.pc.in + +DISTCLEANFILES = $(pcinfiles:.in=) +EXTRA_DIST = $(pcinfiles) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu pkgconfig/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu pkgconfig/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +gstreamer-plugins-good-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-plugins-good-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-libtool distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am + + +### all-local: $(pcverfiles) $(pcverfiles_uninstalled) +all-local: $(pcverfiles_uninstalled) + +### how to generate versioned .pc files from .pc files in this dir +%-@GST_MAJORMINOR@.pc: %.pc + $(cp_verbose)cp $< $@ +%-@GST_MAJORMINOR@-uninstalled.pc: %-uninstalled.pc + $(cp_verbose)cp $< $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/pkgconfig/gstreamer-plugins-good-uninstalled.pc.in b/pkgconfig/gstreamer-plugins-good-uninstalled.pc.in new file mode 100644 index 0000000..7294834 --- /dev/null +++ b/pkgconfig/gstreamer-plugins-good-uninstalled.pc.in @@ -0,0 +1,13 @@ +prefix= +exec_prefix= +libdir=@abs_top_builddir@/gst-libs/gst +includedir=@abs_top_builddir@/gst-libs +pluginsdir=@abs_top_builddir@ + +Name: GStreamer Good Plugins, Uninstalled +Description: Streaming media framework, good plugins, uninstalled +Version: @VERSION@ +Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-plugins-base-@GST_MAJORMINOR@ + +Libs: +Cflags: diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..73d8b85 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1 @@ +af az bg ca cs da de el en_GB eo es eu fi fr gl hu id it ja lt lv mt nb nl or pl pt_BR ro ru sk sl sq sr sv tr uk vi zh_CN zh_HK zh_TW diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..1283c32 --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,432 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.17 +GETTEXT_MACRO_VERSION = 0.17 + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + +# thomas: add GETTEXT_PACKAGE substitution as used in Makevars +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +localedir = @localedir@ +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +# We use $(mkdir_p). +# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as +# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, +# @install_sh@ does not start with $(SHELL), so we add it. +# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined +# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake +# versions, $(mkinstalldirs) and $(install_sh) are unused. +mkinstalldirs = $(SHELL) @install_sh@ -d +install_sh = $(SHELL) @install_sh@ +MKDIR_P = @MKDIR_P@ +mkdir_p = @mkdir_p@ + +GMSGFMT_ = @GMSGFMT@ +GMSGFMT_no = @GMSGFMT@ +GMSGFMT_yes = @GMSGFMT_015@ +GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) +MSGFMT_ = @MSGFMT@ +MSGFMT_no = @MSGFMT@ +MSGFMT_yes = @MSGFMT_015@ +MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) +XGETTEXT_ = @XGETTEXT@ +XGETTEXT_no = @XGETTEXT@ +XGETTEXT_yes = @XGETTEXT_015@ +XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: check-macro-version all-@USE_NLS@ + +all-yes: stamp-po +all-no: + +# Ensure that the gettext macros and this Makefile.in.in are in sync. +check-macro-version: + @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ + || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ + exit 1; \ + } + +# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no +# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because +# we don't want to bother translators with empty POT files). We assume that +# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. +# In this case, stamp-po is a nop (i.e. a phony target). + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + test ! -f $(srcdir)/$(DOMAIN).pot || \ + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @test ! -f $(srcdir)/$(DOMAIN).pot || { \ + echo "touch stamp-po" && \ + echo timestamp > stamp-poT && \ + mv stamp-poT stamp-po; \ + } + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ + package_gnu='GNU '; \ + else \ + package_gnu=''; \ + fi; \ + if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ + msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ + else \ + msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ + fi; \ + case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + *) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --package-name="$${package_gnu}@PACKAGE@" \ + --package-version='@VERSION@' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + ;; \ + esac + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkdir_p) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + $(mkdir_p) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: stamp-po $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + dists="$$dists $(DOMAIN).pot stamp-po"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir) || exit 1; \ + else \ + cp -p $(srcdir)/$$file $(distdir) || exit 1; \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ + cd $(top_builddir) \ + && $(SHELL) ./config.status $(subdir)/$@.in po-directories + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 0000000..b8fd89c --- /dev/null +++ b/po/Makevars @@ -0,0 +1,46 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(GETTEXT_PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +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 --backup=off +MSGFILTER = msgfilter --no-location diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..95fc75e --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,26 @@ +ext/esd/esdsink.c +ext/pulse/pulsesink.c +ext/flac/gstflacdec.c +ext/jpeg/gstjpegdec.c +ext/libpng/gstpngdec.c +ext/shout2/gstshout2.c +ext/soup/gstsouphttpsrc.c +ext/wavpack/gstwavpackparse.c +gconf/gstreamer.schemas.in +gst/avi/gstavidemux.c +gst/avi/gstavimux.c +gst/isomp4/qtdemux.c +gst/rtsp/gstrtspsrc.c +gst/wavparse/gstwavparse.c +sys/oss/gstossmixer.c +sys/oss/gstossmixertrack.c +sys/oss/gstosssink.c +sys/oss/gstosssrc.c +sys/oss4/oss4-mixer.c +sys/oss4/oss4-sink.c +sys/oss4/oss4-source.c +sys/sunaudio/gstsunaudiomixertrack.c +sys/v4l2/gstv4l2src.c +sys/v4l2/v4l2_calls.c +sys/v4l2/v4l2src_calls.c +sys/ximage/gstximagesrc.c diff --git a/po/Rules-quot b/po/Rules-quot new file mode 100644 index 0000000..9c2a995 --- /dev/null +++ b/po/Rules-quot @@ -0,0 +1,47 @@ +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-create: + $(MAKE) en@quot.po-update +en@boldquot.po-create: + $(MAKE) en@boldquot.po-update + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/po/af.gmo b/po/af.gmo new file mode 100644 index 0000000000000000000000000000000000000000..dcbdd6037f6b3c4713c121272c6b360f9689b060 GIT binary patch literal 1489 zcmZva&u<(x6vquTK$k+H{3^dB3#k%P@$BrTN~39u+9n01%C<|o%^7Fs?ZlZ`d+>OY zrigQoTz~@-7sL^9+rwfXW+j+f(G`%qe2`5HHc44&>RO%WE1%@_ypqjz{kN)B0rD(GR}Vub};`9I0t?g z#_z{9 z@;#r2KMUu(zY2d5j;qYhoYjy1)9~lu`^NRX90#lywo`Dv4;$ZuYu>jPxN}uEjaXV1 z%cd|vSE_f=>mT&y#fnvhHdd?}OIR{Pe-HC}z~sP;y{k8!C3NqQ7XxQaa9-SS(s^m@ zwysPL)@_iw&5e6oURhs}P4J|ra>rDa+#or2-nVr~#LYJBWgRXJ1YGsSkWW|0wbyZN z5NjF-i8aEuT->Tjm&kl;*M?0o^0ZNrST{L2vF@sNN@D2U7L9{i$<;df#yFeFq6w<5 z+QQgIrpftap|eJ{^Fa-o!sO~|TQq9qGPxN-oprk#ZE+X1>ZGu4N{RDDw==vsQcJi- zz=3L62g+nW?e$gKSN)z$)2x@CO<`E5)@a*s;)8YRIhD?<-lFWC%X$lE(>~U%Y7{l{ z+BTKO8)kAy!5ewqxh9aj=*yk0dh2rCmWduGclA5iV2f54q(*qmOkSCIQ)+CN7fo-` zUe*&X^nsO`)RWF&WpM5AC3;EPS#mazMe^Mmw+M76bn6N~|AHKEYTr<}bbIu!T0C6G zMNY`8Yj*5%V~b2KZkW(vX&ox-h_uk%*A}`nac$#Q1o9EN*Ly@(x`}j%R=FuimX)?;aJ22n&qSsmGUukU(UmM`0+TyLO(JfappIrg r)Y^zD;%uDypx>H(#oZv9N>_{3*5pm?X(l^^rwgVb@;T~znEw6;W~xKa literal 0 HcmV?d00001 diff --git a/po/af.po b/po/af.po new file mode 100644 index 0000000..091d1da --- /dev/null +++ b/po/af.po @@ -0,0 +1,744 @@ +# Translation of gstreamer plugin messages to Afrikaans. +# Copyright (C) 2004 Free Software Foundation, Inc. +# This file is put in the public domain. +# Petri Jooste , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins 0.7.6\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2004-03-18 14:16+0200\n" +"Last-Translator: Petri Jooste \n" +"Language-Team: Afrikaans \n" +"Language: af\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +msgid "Internal data stream error." +msgstr "" + +msgid "Failed to decode JPEG image" +msgstr "" + +#, fuzzy +msgid "Could not connect to server" +msgstr "Kon nie beheertoestel \"%s\" toemaak nie." + +msgid "Server does not support seeking." +msgstr "" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "Kon nie beheertoestel \"%s\" toemaak nie." + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "Kon nie beheertoestel \"%s\" toemaak nie." + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Geen of ongeldige klanktoevoer, AVI-stroom sal korrup wees." + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +msgid "Internal data flow error." +msgstr "" + +msgid "Volume" +msgstr "Volume" + +msgid "Bass" +msgstr "Bas" + +msgid "Treble" +msgstr "Treble" + +msgid "Synth" +msgstr "Sintetiseerder" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Luidspreker" + +msgid "Line-in" +msgstr "Lyn-in" + +msgid "Microphone" +msgstr "Mikrofoon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Menger" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Neem op" + +msgid "In-gain" +msgstr "In-versterking" + +msgid "Out-gain" +msgstr "Uit-versterking" + +msgid "Line-1" +msgstr "Lyn-1" + +msgid "Line-2" +msgstr "Lyn-2" + +msgid "Line-3" +msgstr "Lyn-3" + +msgid "Digital-1" +msgstr "Digitaal-1" + +msgid "Digital-2" +msgstr "Digitaal-2" + +msgid "Digital-3" +msgstr "Digitaal-3" + +msgid "Phone-in" +msgstr "Telefoon-in" + +msgid "Phone-out" +msgstr "Telefoon-uit" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +#, fuzzy +msgid "Could not open audio device for playback." +msgstr "Kon nie oudio-toestel \"%s\" oopmaak vir skryf nie." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +#, fuzzy +msgid "Could not open audio device for recording." +msgstr "Kon nie CD-toestel oopmaak om te lees nie." + +#, fuzzy +msgid "Could not open audio device for mixer control handling." +msgstr "Kon nie oudio-toestel \"%s\" oopmaak vir skryf nie." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" + +msgid "Master" +msgstr "" + +msgid "Front" +msgstr "" + +#, fuzzy +msgid "Rear" +msgstr "Neem op" + +msgid "Headphones" +msgstr "" + +msgid "Center" +msgstr "" + +msgid "LFE" +msgstr "" + +msgid "Surround" +msgstr "" + +#, fuzzy +msgid "Side" +msgstr "Video" + +#, fuzzy +msgid "Built-in Speaker" +msgstr "Luidspreker" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "" + +msgid "3D Depth" +msgstr "" + +msgid "3D Center" +msgstr "" + +msgid "3D Enhance" +msgstr "" + +msgid "Telephone" +msgstr "" + +msgid "Line Out" +msgstr "" + +#, fuzzy +msgid "Line In" +msgstr "Lyn-in" + +msgid "Internal CD" +msgstr "" + +#, fuzzy +msgid "Video In" +msgstr "Video" + +msgid "AUX 1 In" +msgstr "" + +msgid "AUX 2 In" +msgstr "" + +msgid "AUX In" +msgstr "" + +#, fuzzy +msgid "Record Gain" +msgstr "Neem op" + +#, fuzzy +msgid "Output Gain" +msgstr "Uit-versterking" + +#, fuzzy +msgid "Microphone Boost" +msgstr "Mikrofoon" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "" + +#, fuzzy +msgid "Record Source" +msgstr "Neem op" + +#, fuzzy +msgid "Monitor Source" +msgstr "Monitor" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "" + +msgid "Surround Sound" +msgstr "" + +#, fuzzy +msgid "Microphone Gain" +msgstr "Mikrofoon" + +#, fuzzy +msgid "Speaker Source" +msgstr "Luidspreker" + +#, fuzzy +msgid "Microphone Source" +msgstr "Mikrofoon" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "" + +msgid "Stereo Mix" +msgstr "" + +msgid "Mono Mix" +msgstr "" + +msgid "Input Mix" +msgstr "" + +msgid "SPDIF In" +msgstr "" + +msgid "SPDIF Out" +msgstr "" + +#, fuzzy +msgid "Microphone 1" +msgstr "Mikrofoon" + +#, fuzzy +msgid "Microphone 2" +msgstr "Mikrofoon" + +#, fuzzy +msgid "Digital Out" +msgstr "Digitaal-1" + +#, fuzzy +msgid "Digital In" +msgstr "Digitaal-1" + +msgid "HDMI" +msgstr "" + +msgid "Modem" +msgstr "" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "" + +msgid "None" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Off" +msgstr "" + +msgid "Mute" +msgstr "" + +msgid "Fast" +msgstr "" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "" + +#, fuzzy +msgid "Front Panel Microphone" +msgstr "Mikrofoon" + +msgid "Front Panel Line In" +msgstr "" + +msgid "Front Panel Headphones" +msgstr "" + +msgid "Front Panel Line Out" +msgstr "" + +msgid "Green Connector" +msgstr "" + +msgid "Pink Connector" +msgstr "" + +msgid "Blue Connector" +msgstr "" + +msgid "White Connector" +msgstr "" + +msgid "Black Connector" +msgstr "" + +msgid "Gray Connector" +msgstr "" + +msgid "Orange Connector" +msgstr "" + +msgid "Red Connector" +msgstr "" + +msgid "Yellow Connector" +msgstr "" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +msgid "Virtual Mixer Input" +msgstr "" + +msgid "Virtual Mixer Output" +msgstr "" + +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" + +msgid "Playback is not supported by this audio device." +msgstr "" + +msgid "Audio playback error." +msgstr "" + +msgid "Recording is not supported by this audio device." +msgstr "" + +msgid "Error recording from audio device." +msgstr "" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "" + +#, fuzzy, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Cannot identify device '%s'." +msgstr "Kon nie skryf na toestel \"%s\" nie." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Kon nie toestel \"%s\" oopmaak vir lees en skryf nie." + +#, fuzzy, c-format +msgid "Device '%s' is not a capture device." +msgstr "Toestel \"%s\" is nie 'n vasleggingtoestel nie." + +#, fuzzy, c-format +msgid "Device '%s' is not a output device." +msgstr "Toestel \"%s\" is nie 'n vasleggingtoestel nie." + +#, fuzzy, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." + +#, fuzzy, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Kon nie beheertoestel \"%s\" toemaak nie." + +#, fuzzy, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Kon nie beheertoestel \"%s\" toemaak nie." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to set input %d on device %s." +msgstr "Kon nie oudio-toestel \"%s\" toemaak nie." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Kon nie oudio-toestel \"%s\" toemaak nie." + +#, fuzzy, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." + +#, fuzzy, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, fuzzy, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, fuzzy, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "" + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "Kon nie lêer \"%s\" oopmaak om in te skryf nie." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Fout tydens toemaak van lêer \"%s\"." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "Kon nie lêer \"%s\" oopmaak om te lees nie." + +#~ msgid "No filename specified." +#~ msgstr "Geen lêernaam gespesifiseer." + +#~ msgid "Could not write to file \"%s\"." +#~ msgstr "Kon nie skryf na lêer \"%s\" nie." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "Kon nie beheertoestel \"%s\" oopmaak vir skryf nie." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "Kon nie oudio-toestel \"%s\" konfigureer nie." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "Kon nie klanktoestel \"%s\" verstel na %d Hz nie." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "Kon nie video-toestel \"%s\" oopmaak vir skryf nie." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "Kon nie video-toestel \"%s\" toemaak nie." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "OSS-toestel \"%s\" is reeds in gebruik deur 'n ander program." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "Kon nie toegang kry tot toestel \"%s\" nie, kyk na toegangsregte." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Toestel \"%s\" bestaan nie." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "Kon nie toestel \"%s\" oopmaak vir skryf nie." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "Kon nie toestel \"%s\" oopmaak vir lees nie." + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "Kon nie vfs-lêer \"%s\" oopmaak vir lees nie." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Geen lêernaam gespesifiseer." + +#, fuzzy +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "Kon nie vfs-lêer \"%s\" oopmaak vir skryf nie." + +#, fuzzy +#~ msgid "No filename given" +#~ msgstr "Geen lêernaam gespesifiseer." + +#~ msgid "Could not close vfs file \"%s\"." +#~ msgstr "Kon nie vfs-lêer \"%s\" toemaak nie." + +#~ msgid "No device specified." +#~ msgstr "Geen toestel gespesifiseer" + +#~ msgid "Device is not open." +#~ msgstr "Toestel is nie oop nie." + +#~ msgid "Device is open." +#~ msgstr "Toestel is oop." diff --git a/po/az.gmo b/po/az.gmo new file mode 100644 index 0000000000000000000000000000000000000000..10d856a34e52ed2b88e3a796a298299ce3978231 GIT binary patch literal 1544 zcmYk5&u<$=6vqep18RP>lwYNA7$Jd>%B9_Xu8)j~-?0C@4WZY=GAZPzM%)pMsCUe;Ygweirye;Fn?lTd;=x z@4;i>Pr?5Scpmm$@Nw`VcmzC#7o9r+lK&(~`OgIZt03ij1El=*;D0;#F9mxs*zbYg zpthSJ9`+B4Ln`(Fq___Qk0UABr@$w`vmnKPJunJ94?YS1EJ*je2GV^xVgEyL7IqJO z8vGihyb}-)`w_2`;LqT*;IF~|J4k*11EhF=2K%pI-v{xqe}n%B4$)8c67&p|gz}M4 zd=k1J)kOWLT&JK^`&sDoP|8O!Dc=jwr=ZV3_l4?wF&H#2B&VTN4+-^&dbBUk(PCZ} z1zT8Ti#pX_W}{wq!&qwPDw_Q8==Pq(ZX-Hru-AY(BI`VY#IoYg?neb?kl1 zt>fBk%1rmcy!2d_eQn?5b8Aby@J`7Q|3qgQ?<(H2&Xu{3*p1RxS(g{u3@Q?~Owk2$ zRSR2swjvRTttfofXREoA8_2vmHh#!DPIWWI)^uN4wq~<(q}Z~v>#FC)QeUhoS7>Wm zJT1J)voh7D5OFjU#kCccTjxc)NOfP#muVq7w#A3u=dF6ZTc+E%tBg`(M=G)|t=E=s zbi@M6@CYatrB^MU#EnG6iAWkej$4iRTnxcMv7$CLB|bP8za`?PXk6fpnO1V)T%6$C zb%{%LoHRuy(Zd#RE3XZo8);_;1AcKt=H(6PRH{tWv!hvjV$xEkN_5c97N6Tzt}FGr zG@4)ZArhta*cNj8a;6JkM1?I~PYqCoij4AyVOm^n*V;?%D~FA0pfwBDcx7<6agHLr z+Vb^0!)(06dqe381~LPQvisRAU-ly*IhqcsBjP^mcc`;NpG-`wuhcWk~=4 literal 0 HcmV?d00001 diff --git a/po/az.po b/po/az.po new file mode 100644 index 0000000..a061a71 --- /dev/null +++ b/po/az.po @@ -0,0 +1,745 @@ +# Translation of 'gst-plugins' messages to Azerbaijani. +# Copyright (C) 2004 Free Software Foundation, Inc. +# This file is put in the public domain. +# Mətin Əmirov , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-0.8.0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2004-03-19 18:29+0200\n" +"Last-Translator: Metin Amiroff \n" +"Language-Team: Azerbaijani \n" +"Language: az\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.2\n" + +msgid "Could not establish connection to sound server" +msgstr "" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +msgid "Internal data stream error." +msgstr "" + +msgid "Failed to decode JPEG image" +msgstr "" + +#, fuzzy +msgid "Could not connect to server" +msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." + +msgid "Server does not support seeking." +msgstr "" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Səhv ya da olmayan audio girişi, AVI yayımı pozulacaqdır." + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +msgid "Internal data flow error." +msgstr "" + +msgid "Volume" +msgstr "Səs" + +msgid "Bass" +msgstr "Bas" + +msgid "Treble" +msgstr "İncə" + +msgid "Synth" +msgstr "Sint" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Spiker" + +msgid "Line-in" +msgstr "Xətd-giriş" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mikser" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Qeyd" + +msgid "In-gain" +msgstr "Giriş-gain" + +msgid "Out-gain" +msgstr "Çıxış-gain" + +msgid "Line-1" +msgstr "Xətd-1" + +msgid "Line-2" +msgstr "Xətd-2" + +msgid "Line-3" +msgstr "Xətd-3" + +msgid "Digital-1" +msgstr "Dijital-1" + +msgid "Digital-2" +msgstr "Dijital-2" + +msgid "Digital-3" +msgstr "Dijital-3" + +msgid "Phone-in" +msgstr "Telefon-girişi" + +msgid "Phone-out" +msgstr "Telefon-çıxışı" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +#, fuzzy +msgid "Could not open audio device for playback." +msgstr "\"%s\" audio avadanlığı yazma üçün açıla bilmədi." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +#, fuzzy +msgid "Could not open audio device for recording." +msgstr "CD avadanlığı oxuma üçün açıla bilmədi." + +#, fuzzy +msgid "Could not open audio device for mixer control handling." +msgstr "\"%s\" audio avadanlığı yazma üçün açıla bilmədi." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" + +msgid "Master" +msgstr "" + +msgid "Front" +msgstr "" + +#, fuzzy +msgid "Rear" +msgstr "Qeyd" + +msgid "Headphones" +msgstr "" + +msgid "Center" +msgstr "" + +msgid "LFE" +msgstr "" + +msgid "Surround" +msgstr "" + +#, fuzzy +msgid "Side" +msgstr "Video" + +#, fuzzy +msgid "Built-in Speaker" +msgstr "Spiker" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "" + +msgid "3D Depth" +msgstr "" + +msgid "3D Center" +msgstr "" + +msgid "3D Enhance" +msgstr "" + +msgid "Telephone" +msgstr "" + +msgid "Line Out" +msgstr "" + +#, fuzzy +msgid "Line In" +msgstr "Xətd-giriş" + +msgid "Internal CD" +msgstr "" + +#, fuzzy +msgid "Video In" +msgstr "Video" + +msgid "AUX 1 In" +msgstr "" + +msgid "AUX 2 In" +msgstr "" + +msgid "AUX In" +msgstr "" + +#, fuzzy +msgid "Record Gain" +msgstr "Qeyd" + +#, fuzzy +msgid "Output Gain" +msgstr "Çıxış-gain" + +#, fuzzy +msgid "Microphone Boost" +msgstr "Mikrofon" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "" + +#, fuzzy +msgid "Record Source" +msgstr "Qeyd" + +#, fuzzy +msgid "Monitor Source" +msgstr "Monitor" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "" + +msgid "Surround Sound" +msgstr "" + +#, fuzzy +msgid "Microphone Gain" +msgstr "Mikrofon" + +#, fuzzy +msgid "Speaker Source" +msgstr "Spiker" + +#, fuzzy +msgid "Microphone Source" +msgstr "Mikrofon" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "" + +msgid "Stereo Mix" +msgstr "" + +msgid "Mono Mix" +msgstr "" + +msgid "Input Mix" +msgstr "" + +msgid "SPDIF In" +msgstr "" + +msgid "SPDIF Out" +msgstr "" + +#, fuzzy +msgid "Microphone 1" +msgstr "Mikrofon" + +#, fuzzy +msgid "Microphone 2" +msgstr "Mikrofon" + +#, fuzzy +msgid "Digital Out" +msgstr "Dijital-1" + +#, fuzzy +msgid "Digital In" +msgstr "Dijital-1" + +msgid "HDMI" +msgstr "" + +msgid "Modem" +msgstr "" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "" + +msgid "None" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Off" +msgstr "" + +msgid "Mute" +msgstr "" + +msgid "Fast" +msgstr "" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "" + +#, fuzzy +msgid "Front Panel Microphone" +msgstr "Mikrofon" + +msgid "Front Panel Line In" +msgstr "" + +msgid "Front Panel Headphones" +msgstr "" + +msgid "Front Panel Line Out" +msgstr "" + +msgid "Green Connector" +msgstr "" + +msgid "Pink Connector" +msgstr "" + +msgid "Blue Connector" +msgstr "" + +msgid "White Connector" +msgstr "" + +msgid "Black Connector" +msgstr "" + +msgid "Gray Connector" +msgstr "" + +msgid "Orange Connector" +msgstr "" + +msgid "Red Connector" +msgstr "" + +msgid "Yellow Connector" +msgstr "" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +msgid "Virtual Mixer Input" +msgstr "" + +msgid "Virtual Mixer Output" +msgstr "" + +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" + +msgid "Playback is not supported by this audio device." +msgstr "" + +msgid "Audio playback error." +msgstr "" + +msgid "Recording is not supported by this audio device." +msgstr "" + +msgid "Error recording from audio device." +msgstr "" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "" + +#, fuzzy, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Cannot identify device '%s'." +msgstr "\"%s\" avadanlığına yazıla bilmədi." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "\"%s\" avadanlığı oxuma və yazma üçün açıla bilmədi." + +#, fuzzy, c-format +msgid "Device '%s' is not a capture device." +msgstr "\"%s\" avadanlığı capture avadanlığı deyil." + +#, fuzzy, c-format +msgid "Device '%s' is not a output device." +msgstr "\"%s\" avadanlığı capture avadanlığı deyil." + +#, fuzzy, c-format +msgid "Failed to set norm for device '%s'." +msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." + +#, fuzzy, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." + +#, fuzzy, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to set input %d on device %s." +msgstr "\"%s\" audio avadanlığı bağlana bilmədi." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "\"%s\" audio avadanlığı bağlana bilmədi." + +#, fuzzy, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." + +#, fuzzy, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, fuzzy, c-format +msgid "Could not get parameters on device '%s'" +msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, fuzzy, c-format +msgid "Could not map buffers from device '%s'" +msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "" + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "\"%s\" faylı yazma üçün açıla bilmədi." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "\"%s\" faylı bağlana bilmədi." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "\"%s\" faylı oxuma üçün açıla bilmədi." + +#~ msgid "No filename specified." +#~ msgstr "Fayl adı verilməyib." + +#~ msgid "Could not write to file \"%s\"." +#~ msgstr "\"%s\" faylına yazıla bilmədi." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "\"%s\" idarə avadanlığı yazma üçün açıla bilmədi." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "\"%s\" audio avadanlığı quraşdırıla bilmədi." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "\"%s\" audio avadanlığı %d Hz-ə keçirilə bilmədi." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "\"%s\" video avadanlığı yazma üçün açıla bilmədi." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "\"%s\" video avadanlığı bağlana bilmədi." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "\"%s\" OSS avadanlığı başqa bir proqram tərəfindən istifadədədir." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "\"%s\" avadanlığına yetişə bilmədi, səlahiyyətlərini yoxlayın." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "\"%s\" avadanlığı mövcud deyil." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "\"%s\" avadanlığı yazma üçün açıla bilmədi." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "\"%s\" avadanlığı oxuma üçün açıla bilmədi." + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "\"%s\" vfs faylı oxuma üçün açıla bilmədi." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Fayl adı verilməyib." + +#, fuzzy +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "\"%s\" vfs faylı yazma üçün açıla bilmədi." + +#, fuzzy +#~ msgid "No filename given" +#~ msgstr "Fayl adı verilməyib." + +#~ msgid "Could not close vfs file \"%s\"." +#~ msgstr "\"%s\" vfs faylı bağlana bilmədi." + +#~ msgid "No device specified." +#~ msgstr "Avadanlıq bildirilməyib." + +#~ msgid "Device is not open." +#~ msgstr "Avadanlıq açıq deyil." + +#~ msgid "Device is open." +#~ msgstr "Avadanlıq açıqdır." diff --git a/po/bg.gmo b/po/bg.gmo new file mode 100644 index 0000000000000000000000000000000000000000..668edc53238f55017328cd302671d42c3fd049b0 GIT binary patch literal 19615 zcmc(l3vgW3dB-mV2r-24OatU`AQ(ez$+m1B5jfx{HrQCPZ1YIc_DXvtEne*v`>+w@ zA#9%J6&x^xIzTW9Nyx*-7FMt=I@1Z0wrRSWOedjj+J@;gO`A?r(n->pr0ws2&bhmH zSG$%OoMcBw|9kE|_nhzjedp}{!>PwS8t{3U_HNqg#|6PrM+L!&C+cnxoP2T+oCKZ% zo&Xw9k7j{y13w5J4=x6$fh)nQ!R!3}XF!d6-uFj+e;j0~;M?F^!M_I20KX3&1O5l7 z`CbR#0saO&8+`jIj-Cs_v*=$6@+jyAj|MZK_~-}U3*G^0ot>cQ{t7rB+y`pDpMn>H z$Diu318k@NQE&!$A9y~v2fPIQTkuohsi(Q|+raho4}dp=r=1S(;GN(Hz#oFwgU7?% zJTL@B*Q4Nh;9l_k;H#kc{f)=t-|6Ii8Yua_&*Oz2=Yf*j0x$%Zf){|#fugqpo(ujG z>;TXD1Ba_X@jU`w1?~WsgZ~U(47R;12iutlqW@Q*=$>_^n)eY+6GKkJ`=1(clkfTHUl zC_R41_kRq|rvD32{Gb0mH~(Bv^jrc;u9t&aXE7)}tOn>SqW)6T(m!4B{P;2_urKJNRkfTI7uK&^KI&aC-P1-0J0L9H|0_h*71q(2{& zKjlIB)19FF>9e5b`8p{6MnT#2w?OIhN1*iiI=J&F#=PIjY0r6XzVCVbH&F8)HQmv7 z2B>*vgC7U40VRiTgPQmIzW=Yj|4UHzeEj)t+!^2k`sab-s|SSTU;{`<3LXGupI`9( zzxVzB1|_eV2=i$02Cy6aD7X;Z1!|qwLFxDZz(>I|Eq||o}W7_2%ge&@T=h25VIBhHh2Tr-5vxZ;MYLS*N#yy0=I*! z!B;`8dm%<4ecb|z&WAwp{RQx3@Sw-1$Z;K6rt3J73Qhx0y3Fb2Ob`(S=YuoA^&p}TKI!j&2|Stp z55RTcPe94%ipyR8UI(5@e=7(H!L#5o;15B)_nOC_dprgsJCXZmfbRj%1!Zqnf(Bdx z%C2t$c_sKHcqO|eI2lf8-9z#(4-Q=toSGfFsrpHAfE)Z-0HGUhY^>>1r@9Q8Y5gY{H3;ri4J3Hx0 zR~JkN3-p(RzXJDz-v#&LJfd?8#;W!22Q~jw;CsMbpycyiQ0twr*u{x=g6Gn|7<>zO z19&X>F;MIGf(G0SN^d(s>FppWdHe!g3!b{f<%51u^KbU}fXBx{t+Nv};49$O;EzGg z)3MaW)oVe?;a*VmKMpEBd>O=~gWrIdelUNTd!7Z)p?@nVdUt?&z8^H;&p_$tl&jqO z?*%pgLQvzoz|+Cl-@gO=IQ`Fn5qR?QAYh7MBX~P_5L^#lvBL4a9aR6{!SlgIFs1df zpyI(sQ1<^II1PLjl)ZifydV5C5Z4X5u5o(53&hofG4NgBPeHwZ>`KSi*`Vg_0ws?D z@F?($w2id4(*BsH&)aCS1$|y}5Uc{H)6S!PorXCCpP}ufC7*n90YaY5g9pGb&~(5|JugZ3cp0or}Ei)c^Nq|eQ??X+>4 zKC+QHwBu=*R`4WEb|&BNqD`ZnNYm#Y+T*mB)$yOtgHO=zqP>$gNP8cx@w3n0xWnW7 zLD{`*{TP35F_@vvqA3PEOZyz{(=>f9pncL_xqo5mI=S4%h4RL&{>E0YNZaQ735;;D z(03jMZ=rS2$b@&`hTSmKI z9X>l~C)ukY*bNTTK14g(-}|!1Pl1ooK1kc^@BIn5l6EJp}% zroDysQCjl(gunPB@ETf7Yp0z+`x@;s+B}**OKI<-eO4VlXX)ScqM4pC%gXuQQZ~-3 zTfLq!y*R`43>#rEZ;4qP(W4Eicw)>R4~1{xEN*Zo!&T~kL;SJoR4l9;yTLYhTDUM>#jF*&5FFgSY0mJ ztB&MWhe>YvF}7RIWMeaw3x|8cUQa}OuqZ4R?LV_9j*F#WQBDsRyOraD?=LIF`I6}h z^HHwuSvhL#wisE?=1OhZyy+f_!VL&$@seP1n9s*0lg%KqY~QfSL>sfck(Fe7@-QBX z3SlWSo3f>WxLh)!#M8SW@M3mgW}B7EmIjLvbALA9ZwgT{&XuJq6P8S&%=Cki$rg>4 z8;(k*SRNXR3&@gn;&LuyA9!J#QtUO6dKTqxE=Ta%Q|{}F3Pl4W_0(2piHfDLCzmY_ zn3VFWQ>NEzIWjKiGm}Z^hwh=U5DrGzSJA**ih>lWgW*t>%)UZA*kTxhMLO0Z{5*Y_ z;b8U_Ss=PD#5sdJGdTpBruq%NXVwlNb&R?wUBrFXs8?&{Zp&o%aIq8(CYq^gMgCOM zn^7(r#5ks2KQZbzFcSZ?=EgETk*uaHuVdv9D;Yov;m}Yn+Z)P^-pI7SbC%5waoJ?z z{EQL`+ZY)V5cS4|%wcK0HuTNWkTPT=D=b8z2tX4Vv#F3R zH4tOn8%BM+%;OU6f!C%D$KKP472!~c5L@NF=^(<&5RoO3&ysA|pC=GzdxIs}{%k4C zDX1owilhFzZEp3dqk1(jSQ2l_<3_kuOTZo@@?YqN3$7#dD`wK@==XfuY$r zKi6S0g)C0fZWa$j#Nuq9$!dUmIyZUhS4f0Kg6bJAY4!%EZ*MiQK7`bUdHuVI(jlTf zSQch;cuCkt3{pxg72u~m2{F^TEIOCA8LrbzFD9>41>s@~%#?V!r!0ya3Gu67y%~%# z6Pc^KmR@DDgJFM^Ovf_?L=tF$06{#K3LEAztHNP?yDGdwsQl*y-(ntb3vYg+68XA- z1S9fBzIV7$~K8oH<6e8`L$hLuq28xT>{ye5xEWv+&X<(`aHikLUmz*mJ?uT3f zstZKIl!~xHD`Q@(CBK?_;lsU?j|+o`Al(frrczv;YowS&BvtiJAx)+1>AA95ersB; znxIN^O_&&I!zz|!i6-TfjbprF)Cq0!Ois!SI!r+qh7}vU4Q!+kiZL0&Su-bI7E+wq z;>!K^#n^IU<c8GPV*B)F|z{eI>i$&W_PoI7ik@p+>&BrcZvT8-JobZnhgDQu$t75P` z+dmMj$hY;2<`uF`_us4{^sZ0|F7KeotX^lrQfT^e@g`S&w>LbIBZY&tXQ(nupes>8 ziTn28YRcl^nrOHu4htExD2j#x6`hHoElRk$AT?O%a4^pSl&*~9Ar;?TYzkJP(Wnrt ziZa>qV31No?b6Im-8UWSj;q#FL#_H!eM+nXyAA}RMF^v;5$CfdYI={V!t9VZ9~%j7 z72!CzHa6?ltR%ZqcX5qhWb;lM&YNsTm}M5OUtyyULfe$hSrONB6BRCR8K3UMj!jdLUjDpTyt)@7TrMe6W~ zQk5D<-a~Cuu#;WYZFNZ8U9+~k%S5-7qP#7GhH_>01(usPMwW~n(n!2h%xxWhO@zq} zqRr3?hDdWQo*As}>kC%rgVk`>pWZL|8_j)SwTjRHi*h#3g;JbVa@XQj0j;eg=#uBN zt@0N!_Scoor?+pm+kAztWGC2#w2MKt>&vH_sFHHLz82^z#F?_&5U){Y4dB1PKa~$2 z9J%gRVr;G_%^l`CYcP>o*if%IJKbGNRxC3s@`1aMFLp=TVW)RuSao^G^w~0|o#%GP zor#IK+8cV7vHfTR6jlcmRb%uJ^%O+7OQh!CU^%C)X*W(B#X+*M^_Z~RJ){Cn+i}IH zWUPI~x?DFEjJzU9F5K2A=pN2#x>}nF1X2{`oht)?thbviML;%`HSvTgSLFWv1Gh@f}Qn!Wp19GyX*yK`yTZhBU zn~W>PF-{99$sn^jpBuLCO8I@+La{^%nR*p_@DapT{=M#a09O}P+N;-AVQ4nr8xIcU z*bN`vXdlqoQnZ*jslZdRWywMWqrrNWLpJBwD@E`1O4shcjLvp_z2RrbkU(TrVQ()- zLBzUEKAqYV4J^@ZY}RKBr81Gj25L%v*p6~VCQRRUDX#vWx2g4VGnI9GHr0Lh}voTi={RfR*P-@ahx%8+UL$`@3^$RW7?WX z(YtL`u|Jz>TU72Zwyljj%|NL%)H!>0Pr3hAvPIa=9*b>TTQuHXR+E^Dde>XCC8L zl33f;Dv#ixaiP;J%tg0QO^_M72jZc4qq#gR4qUk*9PA16VIdoejt}u#zQ4>Kqirpf zK&M$$&h_hI-dvu^_Li>fD~4@7{q;jTO;7){RV!94tx0BX`FWnPDmCtI4SCwKBXGLK z1s#{+61rTFH|H!cb1$0~RGyvKQaM<8Y2vQR*u+DI%Ux`~%xiaSe{EzdUe^41@Y=|e z(~GZ->@bz_iOnYI>Cp1Ekw*-ZjaCj$Y@XOUF_PS??48(J*v`+QO%a!rU zUfS-75xplug330A?^CDpk|nBgz&?GEaW6n)WskZO_wba?7&DKViQBbcE|7d&$*F$ z-taW2d?rn}Xc-gz`yfm55yfJ9)TsiBwji4^iMcWkWe;=b_R3gL*(u-!$5t|Yw|hLX zISMMzA)gV)@*X?yK1sRNeZQU)&R)?Vb9mVbZM3pKsC=H~4o=)J3D!;5{Qi{FZL=EO z1xYY$U}Fr1#?iqz(@V$W5)E8yaq4j~j75#`?3=o>Balhe__QKoIKY4xb+H%2U`npW z+#`J!OeLF!2zR`DNr~B7w=oKgP@Q!ej)i;}w>M-Q46#=FBZ5#fziR;8kv?@jU3E z<#>GJUQe49pco#z3FBif|6NA28#*H2O$R;x2@AtX7sXS__gf8#w=*zO&;8zA><cD zcAEWN(ARzhwRA*{t%WcTk`NBqgn;2I?aCKOLDoC4dG(IC+?X5d8T znxs9eQ~j%wblCIBcwFs?Cyh6q9`YVx*e<-!R|@o~WmTL|@W2nYq%3Z0+J?K;>Fe%S zc5xD!ew`bXwW;~IF)ye*VT%EYs!g_x(~}2nobWVLs5Yy2Z4g0Jq&}Isf}g^?6pjbf zS6R09ff2Opo;MS*eLJz6PH#AjCoD1jH(7*eY`-HTOt^x~-f~uB%MXaRwT>%)sx_Al z^UY?Oi`<*?CV|75D7KvG`z}?3)UCG0Y?W`T)zM*3Y{k_ud#ie3s@bd7DGi83LX+Qm zG_^WO96~>b1TlF`V07Y6B?M*jy_RJaZB__~yotTn2r?D+5VqV@U29EX4?^_2JNso| z-8%O$MtMe=sNRUY0jU^MQ7+3@P3?_`GK*Vd>@&AOJ<4t+EAdt%ubxT2xXN}d!`_TJ zot_=(N|J6byGt7pEngX(WvGv}qp=a+elOV|ys4OiCRT* zDcUWziBcljZY$p;71i+Z`=g__rK&|@HS$7qLszfl-1PQTADfzr&6mX1G(Us%>;_Zi4cw;vrd?VR39NFRwruf4^_8& zGwdd@NJ-wimUJdI(+(_`aOpouZoiF1#i#e%gj2k*_1?C*@w8%Tid;u5nQC__Vr=;J z5kxC-_E8g^wYggKsM$)5i9`F#lt$~e?opzW>x!vc1ywJxr*2(dXghG2(1Ic}z}It)vez?(w8l_VLIs*kr~X@TEe3Tv=HHkq!?r z^G+XUeK-m#Pw|?oJ(S>i*XPs&){`b~PfquAl0oDz>pZ}oY9I%Msrs;XCM|yTn+OCm z#yFl&I$&+QJ0-=BQ7yQGmB#5>J(+4s``d~J-Lc1LP-c@G+fb-K+O3|9BQ&>}f#d2K zcJ-+yvC`sA1+M*`Hot|@)@B>FrDUKYQFG~pxc(kWNmY?3z*dZsf1)EBCJ*xZ7_vX~ z%g#P*5#e6frQ0?n6Hp0T3sU42Q*ty2)Nzor0%s@+zvGnythik!z#fXR?j5DKE#gTQ zsldOLS4Jo9N}c+9S4e%SP!*bXZ2qzKYRM(LwCYPw+OJqdf#oN4uB)m;TB4+tv+9cx zcls?2TaxsZ0M8mcXVMLRc+xnApPy739LVeQK)oAEuZKNQ&aSHNZs@|9eJE>~agrg4 zI2G+|G~A`4jiwoKBAq;ADgnDQgVY<%tyG8VR#uOp*FDu(SB)JQisA(tc8S`51LDFf z#VV#zJAX`59{Q}@L%I(`bpsC3b{Bz!f@yD~HzbDrkXZtPvnWn)ZG zQ6#d*zO4eR#@PXi!OcT!b;z4$syY*_JO>jaiU=aVq3~(_Y)X~*lxOTuy3$tRZxHQB zwRQWZhA%#GBX6K?F&n~kn3|mTpwm({7F7FVPFYnt9^k0K#~Uk68-gTWegr`kppb~MD5y;ShP{Q-3Al%PsdoM= z722Q<9m#>U$byF|1x?dsJ&{g^@|A;?y>+kS3x=`EM775(#(@L;VN#$?GK2J|wo zl^Qvu*)$S&dIqhmQ%?mO@2@(pwdPbmnUOgqfy;Rk<%DI1f4jseFId`SVM>nrtIo~-ap!cT&xbL1zWr`UX3g&U)tp~7`_0vMrGCk%VY24;r<(5n0l9oB&j0`b literal 0 HcmV?d00001 diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..8d97a10 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,673 @@ +# Bulgarian translation of gst-plugins-good. +# Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-good package. +# Alexander Shopov , 2007, 2008, 2009, 2010, 2011. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-04-26 22:35+0300\n" +"Last-Translator: Alexander Shopov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "Could not establish connection to sound server" +msgstr "Не може да се осъществи връзка към звуковия сървър." + +msgid "Failed to query sound server capabilities" +msgstr "Неуспешно запитване за възможностите на звуковия сървър." + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "„%s“ от „%s“" + +msgid "Internal data stream error." +msgstr "Вътрешна грешка на потока от данни." + +msgid "Failed to decode JPEG image" +msgstr "Неуспешно декодиране на изображение, формат JPEG." + +msgid "Could not connect to server" +msgstr "Не може да се осъществи връзка към сървър." + +msgid "Server does not support seeking." +msgstr "Сървърът не поддържа търсене." + +msgid "Could not resolve server name." +msgstr "Сървърът не може да се открие по име." + +msgid "Could not establish connection to server." +msgstr "Не може да се осъществи връзка към сървъра." + +msgid "Secure connection setup failed." +msgstr "Неуспешно осъществяване на шифрирана връзка." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Възникна мрежова грешка или сървърът неочаквано прекъсна връзката." + +msgid "Server sent bad data." +msgstr "Сървърът изпрати лоши данни." + +msgid "No URL set." +msgstr "Не е зададен адрес." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Аудио входът липсва или е грешен. Потокът с AVI ще бъде повреден." + +msgid "This file contains no playable streams." +msgstr "Този файл не съдържа изпълними потоци." + +msgid "This file is invalid and cannot be played." +msgstr "Този файл е повреден и не може да бъде изпълнен." + +msgid "This file is corrupt and cannot be played." +msgstr "Този файл е повреден и не може да бъде изпълнен." + +msgid "Invalid atom size." +msgstr "Неправилен размер на атом." + +msgid "This file is incomplete and cannot be played." +msgstr "Този файл е непълен и не може да бъде изпълнен." + +msgid "The video in this file might not play correctly." +msgstr "Видео потокът в този файл може да не се покаже правилно." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Този файл съдържа прекалено много потоци. Изпълняват се само първите %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Не е открит поддържан поток. Може да трябва да инсталирате приставката на " +"GStreamer — RTSP, който поддържа потоци на Real." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Не е открит поддържан поток. Може би трябва да разрешите повече транспортни " +"протоколи или ви липсва правилната приставка на GStreamer за RTSP." + +msgid "Internal data flow error." +msgstr "Вътрешна грешка в потока с данни." + +msgid "Volume" +msgstr "Сила на звука" + +msgid "Bass" +msgstr "Баси" + +msgid "Treble" +msgstr "Високи" + +msgid "Synth" +msgstr "Синтезатор" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Високоговорител" + +msgid "Line-in" +msgstr "Вход" + +msgid "Microphone" +msgstr "Микрофон" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Смесител" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Запис" + +msgid "In-gain" +msgstr "Входно усилване" + +msgid "Out-gain" +msgstr "Изходно усилване" + +msgid "Line-1" +msgstr "Вход-1" + +msgid "Line-2" +msgstr "Вход-2" + +msgid "Line-3" +msgstr "Вход-3" + +msgid "Digital-1" +msgstr "Цифрова-1" + +msgid "Digital-2" +msgstr "Цифрова-2" + +msgid "Digital-3" +msgstr "Цифрова-3" + +msgid "Phone-in" +msgstr "Вход за слушалки" + +msgid "Phone-out" +msgstr "Изход за слушалки" + +msgid "Video" +msgstr "Видео" + +msgid "Radio" +msgstr "Радио" + +msgid "Monitor" +msgstr "Монитор" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Аудио устройството не може да се отвори за изпълнение, използва се от друго " +"приложение." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Аудио устройството не може да се отвори за изпълнение, нямате права за това." + +msgid "Could not open audio device for playback." +msgstr "Устройството не може да се отвори за изпълнение." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Аудио устройството не може да се отвори за запис, нямате права за това." + +msgid "Could not open audio device for recording." +msgstr "Аудио устройството не може да се отвори за запис." + +msgid "Could not open audio device for mixer control handling." +msgstr "Аудио устройството не може да се отвори за управление на смесването." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Аудио устройството не може да се отвори за управление на смесването. " +"Елементът не поддържа тази версия на OSS." + +msgid "Master" +msgstr "Основна" + +msgid "Front" +msgstr "Отпред" + +msgid "Rear" +msgstr "Отзад" + +msgid "Headphones" +msgstr "Слушалки" + +msgid "Center" +msgstr "Център" + +msgid "LFE" +msgstr "Баси" + +msgid "Surround" +msgstr "Съраунд" + +msgid "Side" +msgstr "Отстрани" + +msgid "Built-in Speaker" +msgstr "Вграден високоговорител" + +msgid "AUX 1 Out" +msgstr "Изход AUX 1" + +msgid "AUX 2 Out" +msgstr "Изход AUX 2" + +msgid "AUX Out" +msgstr "Изход AUX" + +msgid "3D Depth" +msgstr "3D — дълбочина" + +msgid "3D Center" +msgstr "3D — център" + +msgid "3D Enhance" +msgstr "3D — подобрения" + +msgid "Telephone" +msgstr "Телефон" + +msgid "Line Out" +msgstr "Изход" + +msgid "Line In" +msgstr "Вход" + +msgid "Internal CD" +msgstr "Вътрешно CD" + +msgid "Video In" +msgstr "Видео вход" + +msgid "AUX 1 In" +msgstr "Вход AUX 1" + +msgid "AUX 2 In" +msgstr "Вход AUX 2" + +msgid "AUX In" +msgstr "Вход AUX" + +msgid "Record Gain" +msgstr "Усилване на записа" + +msgid "Output Gain" +msgstr "Усилване на изхода" + +msgid "Microphone Boost" +msgstr "Усилване на микрофона" + +msgid "Loopback" +msgstr "Обратна връзка" + +msgid "Diagnostic" +msgstr "Диагностика" + +msgid "Bass Boost" +msgstr "Усилване на баситe" + +msgid "Playback Ports" +msgstr "Изходни гнезда" + +msgid "Input" +msgstr "Вход" + +msgid "Record Source" +msgstr "Източник за запис" + +msgid "Monitor Source" +msgstr "Източник за звуков монитор" + +msgid "Keyboard Beep" +msgstr "Клавиатурен звънец" + +msgid "Simulate Stereo" +msgstr "Симулирано стерео" + +msgid "Stereo" +msgstr "Стерео" + +msgid "Surround Sound" +msgstr "Стерео и съраунд" + +msgid "Microphone Gain" +msgstr "Усилване на микрофона" + +msgid "Speaker Source" +msgstr "Източник за високоговорител" + +msgid "Microphone Source" +msgstr "Източник за микрофон" + +msgid "Jack" +msgstr "Жак" + +msgid "Center / LFE" +msgstr "Център/баси" + +msgid "Stereo Mix" +msgstr "Смесител на стерео" + +msgid "Mono Mix" +msgstr "Смесител на моно" + +msgid "Input Mix" +msgstr "Смесител на входа" + +msgid "SPDIF In" +msgstr "Вход SPDIF" + +msgid "SPDIF Out" +msgstr "Изход SPDIF" + +msgid "Microphone 1" +msgstr "Микрофон 1" + +msgid "Microphone 2" +msgstr "Микрофон 2" + +msgid "Digital Out" +msgstr "Цифров изход" + +msgid "Digital In" +msgstr "Цифров вход" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Модем" + +msgid "Handset" +msgstr "Слушалка" + +msgid "Other" +msgstr "Друго" + +msgid "None" +msgstr "Няма" + +msgid "On" +msgstr "Включено" + +msgid "Off" +msgstr "Изключено" + +msgid "Mute" +msgstr "Заглушаване" + +msgid "Fast" +msgstr "Бързо" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Много ниско" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Ниско" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Средно" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Високо" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Много високо" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Професионално" + +msgid "Front Panel Microphone" +msgstr "Микрофон на предния панел" + +msgid "Front Panel Line In" +msgstr "Вход на предния панел" + +msgid "Front Panel Headphones" +msgstr "Слушалки на предния панел" + +msgid "Front Panel Line Out" +msgstr "Изход на предния панел" + +msgid "Green Connector" +msgstr "Зелено гнездо" + +msgid "Pink Connector" +msgstr "Розово гнездо" + +msgid "Blue Connector" +msgstr "Синьо гнездо" + +msgid "White Connector" +msgstr "Бяло гнездо" + +msgid "Black Connector" +msgstr "Черно гнездо" + +msgid "Gray Connector" +msgstr "Сиво гнездо" + +msgid "Orange Connector" +msgstr "Оранжево гнездо" + +msgid "Red Connector" +msgstr "Червено гнездо" + +msgid "Yellow Connector" +msgstr "Жълто гнездо" + +msgid "Green Front Panel Connector" +msgstr "Зелено гнездо на предния панел" + +msgid "Pink Front Panel Connector" +msgstr "Розово гнездо на предния панел" + +msgid "Blue Front Panel Connector" +msgstr "Синьо гнездо на предния панел" + +msgid "White Front Panel Connector" +msgstr "Бяло гнездо на предния панел" + +msgid "Black Front Panel Connector" +msgstr "Черно гнездо на предния панел" + +msgid "Gray Front Panel Connector" +msgstr "Сиво гнездо на предния панел" + +msgid "Orange Front Panel Connector" +msgstr "Оранжево гнездо на предния панел" + +msgid "Red Front Panel Connector" +msgstr "Червено гнездо на предния панел" + +msgid "Yellow Front Panel Connector" +msgstr "Жълто гнездо на предния панел" + +msgid "Spread Output" +msgstr "Към повече изходи" + +msgid "Downmix" +msgstr "Към по-малко изходи" + +msgid "Virtual Mixer Input" +msgstr "Вход на виртуален смесител" + +msgid "Virtual Mixer Output" +msgstr "Изход на виртуален смесител" + +msgid "Virtual Mixer Channels" +msgstr "Канали на виртуален смесител" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Функция на %s № %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Функция на %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Аудио устройството не може да се отвори за изпълнение. Елементът не поддържа " +"тази версия на OSS." + +msgid "Playback is not supported by this audio device." +msgstr "Това аудио устройство не поддържа изпълнение." + +msgid "Audio playback error." +msgstr "Грешка при изпълнение на аудиото." + +msgid "Recording is not supported by this audio device." +msgstr "Това аудио устройство не поддържа запис." + +msgid "Error recording from audio device." +msgstr "Грешка при записа от аудио устройството." + +msgid "Gain" +msgstr "Усилване" + +msgid "Headphone" +msgstr "Слушалки" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Грешка при прочитане %d байта от устройство „%s“." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Получена е рамка с размер %u вместо очаквания %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Грешка при прочитане на %d байта на устройство „%s“." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Грешка при получаването на възможностите на устройството „%s“: не е драйвер " +"v4l2. Проверете дали всъщност не е драйвер v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Неуспешно запитване за атрибутите за вход %d на устройство „%s“." + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Неуспешно получаване на настройките на тунер %d на устройство „%s“." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Неуспешно запитване за нормата на устройство „%s“." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Неуспешно получаване на контролните атрибути на устройството „%s“." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Устройството „%s“ не може да се идентифицира." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "„%s“ не е устройство." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Устройството „%s“ не може да се отвори за четене и запис." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Устройството „%s“ не е устройство за запис." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Устройството „%s“ не е изходно устройство." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Неуспешно задаване на нормата на устройство „%s“." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Неуспешно получаване на текущата настройка на честотата за устройство „%s“." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Неуспешно задаване на текущата настройка на честотата на устройство „%s“ да " +"е %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Неуспешно получаване на силата на сигнала на устройство „%s“." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Неуспешно получаване на стойността на контрол %d на устройство „%s“." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Неуспешно задаване на стойността %d на контрол %d на устройство „%s“." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Неуспешно получаване на текущия вход на устройство „%s“. Може би е радио." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Неуспешно задаване на вход %d на устройство „%s“." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Неуспешно получаване на текущия изход на устройство „%s“. Може би е радио." + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Неуспешно задаване на изход %d на устройство „%s“." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Буферите в устройство „%s“ не могат да се подредят в опашка." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Неуспешен опит за получаване на видео кадрите от устройство „%s“." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Неуспех след %d опита. Устройство „%s“. Системна грешка: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Не могат да се получат параметрите на устройството „%s“." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Устройството за видео вход не приема новите настройки за честотата на кадри." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Не могат да се получат буферите от устройството „%s“." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Драйверът за устройството „%s“ не поддържа познати методи за запис." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" +"Промяната на разделителната способност по време на работа все още не се " +"поддържа." + +msgid "Cannot operate without a clock" +msgstr "Работата без часовник е невъзможна." diff --git a/po/boldquot.sed b/po/boldquot.sed new file mode 100644 index 0000000..4b937aa --- /dev/null +++ b/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g +s/“/“/g +s/”/”/g +s/‘/‘/g +s/’/’/g diff --git a/po/ca.gmo b/po/ca.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b1228dd97b8ae09978a56f0d14c1489784b41dfb GIT binary patch literal 16154 zcmchd3y>T~dB@uiK#>s`+2&y$9><(zA>B!LGJeRGv2+hfw$3{1B>BNBbGvhUW9`nY zXJ#dxNrDZS@Q9t**o22e1STNkn1>8@00W7yAfzG)RU~no0Eq*YltZWrq!OG0Qu+OR zdUj`5d$I&1Ti5rSp6%(!*I$4A^*8&SKEnXzZzan{tZy~AAuUr z6L0`NgGqWNTm|j;q2~8)_zd_yNEgikhzQNY5RsX`aQFWas{D_k`twsLeO$#LxHRjb z^kWy)xB~vE{4G%Oc`KCsZikZZd))W;y6+D{_2ZLJYHu~vdN?0S?>0D&IbI1>ZU!F^nxbJI@5mbL$P!JGRL)Bl0D%XON$6KJdLi{r@3Ud#A9NRo`-`_Fe+j&Vb9Wf)|rNA8I{CQ0wVdsP*(-sCqsQ zHNMY4>GhYP=JN@t`TP-l?+KJSCm-*9FVDyMFqED>3e}Ilf*S94-1k3#yU0HUC8w(f za=ym#2FLwS^Y&K9JE6w?0jT~Rh8p)bq5Am)NSDmdpxX1!H3pHGHBjsEYIq{7!d0*a zRsLO2^Y;*34ZjFS;rAg!Gi#WH9dH_IUOob4ryhfs!e!^>_VEh1oBW;dUic*31aDhu z%wG5ncn93fB<_KaL$xzbXCnA^I02u6{FztL8MU*=@q_Rb@{d7{_q&e&0VU^?5RSOa z@dfZ%9C zsONs{?r&sMP<`))7r}2q)pN#3p5G6pf1h&vKAa>!fYHAmrtq2Y>rnmwYlw+4--hSF zpFmW{oOOP#hhy*=88umo3UHhgzSj94~lDn{=6TmANN9)d%*Ft(5_c_8uy=o%i(`Qm0xmUUe9uG0K#O{jUi6>1*uf@i>oAfh#gq2}#GjHBvb1~tCZp`Lpgd_Ek6dTtCN0&_i7 z|L%b5-@Q=t^i{{dftuIvLCxpsm*jrZg;4T(9n?5xU49=_eQ$(n?+&PWJqV>gpMuYZ zf9m*ksP_IIs@#+CdiW#wDmaNzVF{Ys;Fa(Z$PzJ2Hss^J1S)?cRR2Bc5Fe^0_!!=J#Hz-unc*Hz|tCsaM3gzEQ0Q1yQWN}f+b&BIgh1o#osUXo<; zYb1TtzI08W&*jM1HrJB%$4Q$=?;_nxDn3zh0k0s9kscvQ-v&vjlC_C5P_lnB=`$pK z9?W6p;4tZO(q~C;C+V|;R445tAxd+Qq>pq$pWh-e)#iR>_(<11(iYOWq#EfBr1D4d zyN<+CFin!=s?R5Km_K%$h1Za-CP|jNNX6%m+(iZ6NV=Bv2c%b!G;h*{FOXhJ(&u+b zzfRIzmOm{rcadJ~ZmxhIB3(t&Jl;;ajr2~^D@g}PFCe{%^ls7@N&3iEtR+b&w~{_U z+D%GGQzYq>^jM#_k={f4k}~e|LHIt>TS;064boYp-p|AC##=iZw z&XX=9o#^h}=lDkWd!&m=pLX}&54VwSC1vhj2yY!IvSOd2AcLVAF7327ZkpK;O)N$*vL&zbr+ka`1EZ=w}dvM`R6ZC|e#NLP3>^PXtd zjd`O%lm&^d#)4)xr;G7u&W|dA+2}<Tw!W?VU;-MS*S8Yem8SCf7l=K0jnO?z+|+_O?duVtXsIS0lx(5wE!A%GhkH8pd9; z?$6Ko71xO&v&m0W`_J1H$7yCZ)%E3Q-g2C{{6rE*nK$J}LA~p{R?wSWq+~0sXMnP+G;lA1XD$DIHS~6}$)g!x5qu)(G z@f!j9m3oY=)Pqu28-BCh&DkVwEK&@?A|0y{uAW)cuo3Q;1~S)4T=$S?wT?i`y*{qz zyq$AM9i>h+7xAoB>g{TI+75DhKFxwgF*EI1(R#}CWKa(pD96*cUnuo)lw^Hcb)%V? zKw8t%s-tBeEtx|KezRE*E56j|c&hz>AF_8{-14e%v?61|_68m+rV*xA;^>{7FIks- zmY;qkNl=NC>M_lFr|2)%hmsg`Lytfw<}c{5OFFC&)3ka4qV&9PhQ z*b2XyVPe~3?^_77(!{b9@)-;LT7)4CD`qULg_&QMQ7tZIN8R<{aQkYceYMVv#rqi;vt0(?USZ6FjYR6a_^LlS9Rxs5B`rh92>myz@30X8l-soI_Ee>bBPzCaD zhl_7r3x%-Qpl0SX)!wt{hZZZ?Z9+Q5-2CSil}*Hunef9ptHhth25C#o62>!Bn3w@B z(|k$W9d5lhkQR@$1(Dkp29xpdOiMlP?TBjy?X9AW)xf)AYJ9U7HvC#pRL6HRh-{z< z1_FDmDeS4ooAl>d+il?`zV^Rd@Qc*rbm14TC}Y1)kYK>R5mn}Ur@SpmH;&Y)iAYWiV&`7V(6Sb7q~Z{J(R?wqPrpb8!@~(n>zs zwlE50w~n|c16IB{8CH_mR$w;!VPrPrB6WPtygObR-V|v29%vy^wrn5mRBp&@PFQ23 zZD-MD%hi{^3fT91^ZmD?+9 zT&n{ovwdClGvAx7$NO^cd#L9dEhN9u`Hra!F?1OYltw>fuD~reR|fMlv7c1EO+nB! zaykn^TS~aPU~8}#$+0d6J>3?^O*!9O>@$OdfB1T#t-aTI3w^p5hvY>_yMJqd0Sb8N1PyHTbL?Nf>TI4 zHSMf(pE{x{-0^N-U@D2Lt^7c|Lp!Ts{0aZ$J~-sv&2JUTmgh8c$JoveRHS1zl8Y`;6W-Ryxx%0bg{TsEpGYag*oZW<3ptHKl)`O(Ns&qqWL zc5(vBjq^^q@YXGq=`HP4xc)u8_oI1lPlOxV_J27u&cz&dRY|_hu!q|d)-3)UOUbT9 z1fX-2UB*Nj6lbu98C#};-{!L(kdrONAr}waE;!V@Pq{3PS+sPeDCBLA>htzlP5x|{ zq!}(`=~48-SrF^_SMu-xOI^LvS-sN=MZ>5PH=1=$!^c+I8FY>mi&R{A;3e78WD+n? zvs>7nwTGKc85vU!g5$c zjmyulgL+DZ<=god*L~0F)NW!Ojlf(p7b1$zLdo;}m&$d4wYQzZ?neL8Ec6@DhrzAY zK}Ii&y56g$*dSobF4q~ce7@6sC1 znXWExci}Rgh-xj47lS)-0@iz@Ec3b_d6!oF%d2sy%oL3N4-7Iyv5v$MDeF zrHGRqhnDA?3?XCxS%c<=(IsAG&QF-{4ZC(u3|`bJrydec8XQNJb>Lm^T{IJBOQ-6s z#IFz1;YPaNix4x}bi>FcECgL{h`h5mc*B=0HHt!p3lDP4(n{*&%%k@Yq>p}Hp#U$x zv;i|r;kq%ybk1UMIN4^(PBI;F;_GsH#hkBQx7u3xguFl(r{n;(-%s}Y1S*Nh*kgBC zWlN@TMqra_>KwJ@1MXL6@PAT8?W#DkirtJ8Op@Sj%+gGw8(}+F{%)k}yOHv96$;8-1gruZk$6_&e+g>WHIx|c}8)er|LC05XK zvu9lwSC)WILNT@^{2=Bi(OS+p87mfwb`&#hW1`-9!K{MDDZR1-#s%g~y70)tK{Ur- ziI8d2mr+;sM2@r*Uu3;~CaC8YT@Q9J_D;i6J37>qpF6@597qgBuw4QHCpZTeKcG z)_5kdJt!BfI*qq$-paMc2(=znBa>nyy1M3gS*iO>O0PtIS=D+QIps4QdEnRffCYJE z*cYW+xKDe2qlxX8KjAlKJl{Tyd|l|*Y0goH?jOE6f470XvtxIbpwdr4k8PM;HF&!s zA9ZGV5fxTYIA0BEws64XJp*CAn|wUPuBkgV=^nl3-I9zC-(r_!e^Ca9Z~3LjGB=zZ zHR=`wvmyO&SzEF2fVCN3ABp~4qhAq3Nl*)M7~R(KbIg5j9bQ+DLkUT{;?LRT(!MIA zRUx|Udm-A*no2?in>ikI_u86I?H*_cK960Fg;`{C?6cZsjkPc^?j=irHOj-;v~XNc zrTLCah+L8Fg+n&9U2MG7JjC7JV2k{*#kd!77%+0HHp;$J(U7)O0#TVlYd2ZFm3?89rS9iu zqiq=qFQ^buKVPD|O6Gnsp)D>Et1Y;ZR*&S1Me}s)X?xe+X$wckF6 z$Rc0}Je{`ihI0q1q=Ym&UQqd8f(FdOFTFSq-_m@Z2v&V`ThMm+FdQ zwagL~uH|n@n3=r`59qZ?AA4FXx*ZD#njxoScX->_O2P_}JAOlMW53_v=DGzB)jf zjx@V2S>eVGvLngjJkR?Moj*!njE?0ezG$%}ZqI|-d3b-*+AmgpCcM01cLgjKEx)ZJ zVnqn_a>uzIdlwGyz6aOJzUG;hLe=qf=_qe>CdQxk9Nnuornu2o5_d}P9 z9_rCLv#C|#IK(`2o>v6Jm()0C60ON@@FTK?dUdYcyP{m_Mvjblpj}QSi>YCVoqH3w z0d~}#Tlq}s_&&LCsQmt@Q?_`al+S5{7fA%h>%8&~+xt>TtVuy4+(5lp8sfbdK?h<< z-J&mT0EH*CT0XO#a=mPlal#28s9YyDVBf9Sm;!H%;u%-JE!;U!4&hN$lZ6Lx9{C+z zzzZYoJeVbWX!jcOtgtWcEfadh2IO8o#oo-qeHc{hkf8kZn9i_a=m&W$H$_0$AXA;N z?dv8fOy@0;0@(_@bZqnS_A-C>^ytG_DxCz5xn*l~t<+-cHu9E&pT8-X;(K~Sh0XAr zW@FQ@q1uFh5M{{_VIh4Ho6xe$KB~CkwVz^g;-n4 zd9LFJVT)0&*|5gp)y6dtq184U%}oQ{w@1#lLxkY4zX}yvw<$;zvgs}|Cl`zuA0|bn zT9M?1Ly>+gWVR9ESDbR3P2?bN&hVb?n>6F1q{dkn3<4n+#ZB8?r)SKPRM$>TQA4q% zU?FUclvnF9PcuQ?8SM?3^VIcvE!V*Dc8JV+@LJ19xbKC%>X;WBuaa3~d1d;Yk|bw; za%M$}#vkRXfg4SEym2L1FU;X%@MJRm8yDGMZFC}P!fZA=_0G8|_KbFNg;)OzY(~@r6 z`V#b@D@?4y*X`c-HgAjQDanjib;taa40FCEFZxKhf8kIuCEbyd!tvXP{8N7GQ0En# z91?q_sK0M^+Zicb63tsaM?I01vKv^;B4a|i^LKivH=5E31JfUVirMksBp>FPHDrH7 z%Ery, 2005. +# Jordi Estrada , 2011. +# Gil Forcada , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2012-01-01 14:19+0100\n" +"Last-Translator: Gil Forcada \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "Could not establish connection to sound server" +msgstr "No s'ha pogut establir la connexió al servidor de so" + +msgid "Failed to query sound server capabilities" +msgstr "Ha fallat en consultar les capacitats del servidor de so" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "«%s» per «%s»" + +msgid "Internal data stream error." +msgstr "S'ha produït un error intern de flux de dades." + +msgid "Failed to decode JPEG image" +msgstr "Ha fallat en descodificar la imatge JPEG" + +msgid "Could not connect to server" +msgstr "No s'ha pogut connectar al servidor" + +msgid "Server does not support seeking." +msgstr "El servidor no ademet les cerques." + +msgid "Could not resolve server name." +msgstr "No s'ha pogut resoldre el nom del servidor." + +msgid "Could not establish connection to server." +msgstr "No s'ha pogut establir la connexió al servidor." + +msgid "Secure connection setup failed." +msgstr "Ha fallat la configuració de connexió segura." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"S'ha produït un error de xarxa, o el servidor ha tancat la connexió " +"inesperadament." + +msgid "Server sent bad data." +msgstr "El servidor ha enviat dades errònies." + +msgid "No URL set." +msgstr "No s'ha indicat cap URL." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Manca o no és vàlida l'entrada d'àudio, el flux AVI estarà malmès." + +msgid "This file contains no playable streams." +msgstr "Aquest fitxer no conté cap flux reproduïble." + +msgid "This file is invalid and cannot be played." +msgstr "Aquest fitxer no és vàlid i no es pot reproduir." + +msgid "This file is corrupt and cannot be played." +msgstr "Aquest fitxer està malmès i no es pot reproduir." + +msgid "Invalid atom size." +msgstr "La mida de l'àtom no és vàlida." + +msgid "This file is incomplete and cannot be played." +msgstr "Aquest fitxer no està complet i no es pot reproduir." + +msgid "The video in this file might not play correctly." +msgstr "El vídeo en aquest fitxer podria no reproduir-se correctament." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Aquest fitxer conté massa fluxos. Només s'estan reproduint els primers %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"No s'ha trobat cap flux compatible. Podríeu necessitar instal·lar un " +"connector d'extensió RTSP del GStreamer per a fluxos de multimèdia Real." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"No s'ha trobat cap flux compatible. Podríeu necessitar permetre més " +"protocols de transport o bé potser manca el connector d'extensió RTSP del " +"GStreamer correcte." + +msgid "Internal data flow error." +msgstr "S'ha produït un error intern de flux de dades." + +msgid "Volume" +msgstr "Volum" + +msgid "Bass" +msgstr "Baixos" + +msgid "Treble" +msgstr "Aguts" + +msgid "Synth" +msgstr "Sintetitzador" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Altaveu" + +msgid "Line-in" +msgstr "Línia d'entrada" + +msgid "Microphone" +msgstr "Micròfon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mesclador" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Enregistrament" + +msgid "In-gain" +msgstr "Guany d'entrada" + +msgid "Out-gain" +msgstr "Guany de sortida" + +msgid "Line-1" +msgstr "Línia-1" + +msgid "Line-2" +msgstr "Línia-2" + +msgid "Line-3" +msgstr "Línia-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +msgid "Phone-in" +msgstr "Entrada del telèfon" + +msgid "Phone-out" +msgstr "Sortida del telèfon" + +msgid "Video" +msgstr "Vídeo" + +msgid "Radio" +msgstr "Ràdio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. Una altra " +"aplicació està utilitzant el dispositiu." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. No teniu " +"permís per obrir el dispositiu." + +msgid "Could not open audio device for playback." +msgstr "No s'ha pogut obrir el dispositiu d'àudio per a la reproducció." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"No s'ha pogut obrir el dispositiu d'àudio per a l'enregistrament. No teniu " +"permís per obrir el dispositiu." + +msgid "Could not open audio device for recording." +msgstr "No s'ha pogut obrir el dispositiu d'àudio per a l'enregistrament." + +msgid "Could not open audio device for mixer control handling." +msgstr "" +"No s'ha pogut obrir el dispositiu d'àudio per a la gestió del control del " +"mesclador." + +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 obrir el dispositiu d'àudio per a la gestió del control del " +"mesclador. Aquesta versió de l'Open Sound System no és compatible amb aquest " +"element." + +msgid "Master" +msgstr "Mestre" + +msgid "Front" +msgstr "Frontal" + +msgid "Rear" +msgstr "Posterior" + +msgid "Headphones" +msgstr "Auriculars" + +msgid "Center" +msgstr "Central" + +msgid "LFE" +msgstr "LFE (efectes de baixa freqüència)" + +msgid "Surround" +msgstr "So envoltant" + +msgid "Side" +msgstr "Lateral" + +msgid "Built-in Speaker" +msgstr "Altaveu incorporat" + +msgid "AUX 1 Out" +msgstr "Sortida AUX 1" + +msgid "AUX 2 Out" +msgstr "Sortida AUX 2" + +msgid "AUX Out" +msgstr "Sortida AUX" + +msgid "3D Depth" +msgstr "Profunditat 3D" + +msgid "3D Center" +msgstr "Centre 3D" + +msgid "3D Enhance" +msgstr "Millora 3D" + +msgid "Telephone" +msgstr "Telèfon" + +msgid "Line Out" +msgstr "Línia de sortida" + +msgid "Line In" +msgstr "Línia d'entrada" + +msgid "Internal CD" +msgstr "CD intern" + +msgid "Video In" +msgstr "Entrada de vídeo" + +msgid "AUX 1 In" +msgstr "Entrada AUX 1" + +msgid "AUX 2 In" +msgstr "Entrada AUX 2" + +msgid "AUX In" +msgstr "Entrada AUX" + +msgid "Record Gain" +msgstr "Guany d'enregistrament" + +msgid "Output Gain" +msgstr "Guany de sortida" + +msgid "Microphone Boost" +msgstr "Amplificació del micròfon" + +msgid "Loopback" +msgstr "Bucle local" + +msgid "Diagnostic" +msgstr "Diagnòstic" + +msgid "Bass Boost" +msgstr "Amplificació dels baixos" + +msgid "Playback Ports" +msgstr "Ports de reproducció" + +msgid "Input" +msgstr "Entrada" + +msgid "Record Source" +msgstr "Font d'enregistrament" + +msgid "Monitor Source" +msgstr "Font del monitor" + +msgid "Keyboard Beep" +msgstr "So del teclat" + +msgid "Simulate Stereo" +msgstr "Estèreo simulat" + +msgid "Stereo" +msgstr "Estèreo" + +msgid "Surround Sound" +msgstr "So envoltant" + +msgid "Microphone Gain" +msgstr "Guany del micròfon" + +msgid "Speaker Source" +msgstr "Font de l'altaveu" + +msgid "Microphone Source" +msgstr "Font del micròfon" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Centre / LFE (efectes de baixa freqüència)" + +msgid "Stereo Mix" +msgstr "Mescla estèreo" + +msgid "Mono Mix" +msgstr "Mescla mono" + +msgid "Input Mix" +msgstr "Mescla d'entrada" + +msgid "SPDIF In" +msgstr "Entrada SPDIF" + +msgid "SPDIF Out" +msgstr "Sortida SPDIF" + +msgid "Microphone 1" +msgstr "Micròfon 1" + +msgid "Microphone 2" +msgstr "Micròfon 2" + +msgid "Digital Out" +msgstr "Sortida digital" + +msgid "Digital In" +msgstr "Entrada digital" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Mòdem" + +msgid "Handset" +msgstr "Comandament a distància" + +msgid "Other" +msgstr "Altres" + +msgid "None" +msgstr "Cap" + +msgid "On" +msgstr "Encès" + +msgid "Off" +msgstr "Apagat" + +msgid "Mute" +msgstr "Silenci" + +msgid "Fast" +msgstr "Ràpid" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Molt baixa" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Baixa" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Mitjana" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Alta" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Molt alta" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Producció" + +msgid "Front Panel Microphone" +msgstr "Micròfon del quadre frontal" + +msgid "Front Panel Line In" +msgstr "Línia d'entrada del quadre frontal" + +msgid "Front Panel Headphones" +msgstr "Auriculars del quadre frontal" + +msgid "Front Panel Line Out" +msgstr "Línia de sortida del quadre frontal" + +msgid "Green Connector" +msgstr "Connector verd" + +msgid "Pink Connector" +msgstr "Connector rosa" + +msgid "Blue Connector" +msgstr "Connector blau" + +msgid "White Connector" +msgstr "Connector blanc" + +msgid "Black Connector" +msgstr "Connector negre" + +msgid "Gray Connector" +msgstr "Connector gris" + +msgid "Orange Connector" +msgstr "Connector taronja" + +msgid "Red Connector" +msgstr "Connector vermell" + +msgid "Yellow Connector" +msgstr "Connector groc" + +msgid "Green Front Panel Connector" +msgstr "Connector verd del quadre frontal" + +msgid "Pink Front Panel Connector" +msgstr "Connector rosa del quadre frontal" + +msgid "Blue Front Panel Connector" +msgstr "Connector blau del quadre frontal" + +msgid "White Front Panel Connector" +msgstr "Connector blanc del quadre frontal" + +msgid "Black Front Panel Connector" +msgstr "Connector negre del quadre frontal" + +msgid "Gray Front Panel Connector" +msgstr "Connector gris del quadre frontal" + +msgid "Orange Front Panel Connector" +msgstr "Connector taronja del quadre frontal" + +msgid "Red Front Panel Connector" +msgstr "Connector vermell del quadre frontal" + +msgid "Yellow Front Panel Connector" +msgstr "Connector groc del quadre frontal" + +msgid "Spread Output" +msgstr "Sortida de propagació" + +msgid "Downmix" +msgstr "Downmix" + +msgid "Virtual Mixer Input" +msgstr "Entrada del mesclador virtual" + +msgid "Virtual Mixer Output" +msgstr "Sortida del mesclador virtual" + +msgid "Virtual Mixer Channels" +msgstr "Canals del mesclador virtual" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Funció %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Funció %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. Aquesta " +"versió de l'Open Sound System no és compatible amb aquest element." + +msgid "Playback is not supported by this audio device." +msgstr "Aquest dispositiu d'àudio no permet la reproducció." + +msgid "Audio playback error." +msgstr "S'ha produït un error al reproduir l'àudio." + +msgid "Recording is not supported by this audio device." +msgstr "Aquest dispositiu d'àudio no permet l'enregistrament." + +msgid "Error recording from audio device." +msgstr "S'ha produït un error a l'enregistrar des del dispositiu d'àudio." + +msgid "Gain" +msgstr "Guany" + +msgid "Headphone" +msgstr "Auriculars" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "S'ha produït un error al llegir %d bytes des del dispositiu «%s»." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "S'ha obtingut una mida de fotograma inesperada de %u en lloc de %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "S'ha produït un error al llegir %d bytes en el dispositiu «%s»." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"S'ha produït un error en obtenir les capacitats del dispositiu «%s»: no és " +"un controlador v4l2. Comproveu si és un controlador v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" +"S'ha produït un error en consultar els atributs de l'entrada %d en el " +"dispositiu %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"No s'han pogut obtenir els paràmetres del sintonitzador %d en el dispositiu " +"«%s»." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "S'ha produït un error en consultar la norma en el dispositiu «%s»." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" +"No s'ha pogut obtenir els atributs dels controls en el dispositiu «%s»." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "No es pot identificar el dispositiu «%s»." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Això no és un dispositiu «%s»." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "No s'ha pogut obrir el dispositiu «%s» per a lectura i l'escriptura." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "El dispositiu «%s» no és un dispositiu de captura." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "El dispositiu «%s» no és un dispositiu de sortida." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "No s'ha pogut establir la norma per al dispositiu «%s»." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"No s'ha pogut obtenir la freqüència actual del sintonitzador per al " +"dispositiu «%s»." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"No s'ha pogut establir la freqüència actual del sintonitzador per al " +"dispositiu «%s» a %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "No s'ha pogut obtenir la intensitat del senyal per al dispositiu «%s»." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" +"No s'ha pogut obtenir el valor per al control %d en el dispositiu «%s»." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"No s'ha pogut establir el valor %d per al control %d en el dispositiu «%s»." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"No s'ha pogut obtenir l'entrada actual en el dispositiu «%s». Potser és un " +"dispositiu de ràdio" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "No s'ha pogut establir l'entrada %d en el dispositiu %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"No s'ha pogut obtenir la sortida actual en el dispositiu «%s». Potser és un " +"dispositiu de ràdio" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "No s'ha pogut establir la sortida %d en el dispositiu %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "" +"No s'han pogut enviar a la cua les memòries intermèdies en el dispositiu " +"«%s»." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "" +"S'ha produït un error en provar d'obtenir fotogrames de vídeo des del " +"dispositiu «%s»." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Ha fallat després de %d intents. Dispositiu %s. Error de sistema: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "No s'han pogut obtenir els paràmetres del dispositiu «%s»" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"El dispositiu d'entrada de vídeo no ha acceptat el paràmetre nou de " +"fotogrames per segon." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "No s'han pogut mapejar les memòries intermèdies del dispositiu «%s»" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"El controlador del dispositiu «%s» no és compatible amb cap mètode de " +"captura conegut." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Encara no es permet el canvi de la resolució en temps d'execució." + +msgid "Cannot operate without a clock" +msgstr "No es pot operar sense un rellotge" + +#~ msgid "Describes the selected input element." +#~ msgstr "Descriu l'element d'entrada seleccionat." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "" +#~ "Descriu l'element de sortida seleccionat per a les conferències d'àudio/" +#~ "vídeo." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "" +#~ "Descriu l'element de sortida seleccionat per a la música i les " +#~ "pel·lícules." + +#~ msgid "Describes the selected output element." +#~ msgstr "Descriu l'element de sortida seleccionat." + +#~ msgid "GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "L'audiosink del GStreamer per a les conferències d'àudio/vídeo" + +#~ msgid "GStreamer audiosink for Music and Movies" +#~ msgstr "L'audiosink del GStreamer per a la música i les pel·lícules" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "El GStreamer pot reproduir l'àudio utilitzant qualsevol nombre d'elements " +#~ "de sortida. Algunes opcions possibles són l'osssink, l'esdsink i " +#~ "l'alsasink. L'audiosink pot ser un conducte parcial en lloc d'un sol " +#~ "element." + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "El GStreamer pot reproduir el vídeo utilitzant qualsevol nombre " +#~ "d'elements de sortida. Algunes opcions possibles són el xvimagesink, el " +#~ "ximagesink, el sdlvideosink i l'aasink. El videosink pot ser un conducte " +#~ "parcial en lloc d'un sol element." + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "El GStreamer pot posar els connectors de visualització en un conducte per " +#~ "transformar el flux d'àudio en els fotogrames del vídeo. Per defecte és " +#~ "el goom però aviat s'importaran més connectors de visualització. El " +#~ "connector de visualització pot ser un conducte parcial en lloc d'un sol " +#~ "element." + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "El GStreamer pot enregistrar l'àudio utilitzant qualsevol nombre " +#~ "d'elements d'entrada. Algunes opcions possibles són l'osssrc, l'esdsrc i " +#~ "l'alsasrc. La font d'àudio pot ser un conducte parcial en lloc d'un sol " +#~ "element." + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "El GStreamer pot enregistrar el vídeo de qualsevol nombre d'elements " +#~ "d'entrada. Algunes opcions possibles són el v4lsrc i el videotestsrc. La " +#~ "font del vídeo pot ser un conducte parcial en lloc d'un sol element." + +#~ msgid "default GStreamer audio source" +#~ msgstr "font d'àudio del GStreamer per defecte" + +#~ msgid "default GStreamer audiosink" +#~ msgstr "audiosink del GStreamer per defecte" + +#~ msgid "default GStreamer video source" +#~ msgstr "font de vídeo del GStreamer per defecte" + +#~ msgid "default GStreamer videosink" +#~ msgstr "videosink del GStreamer per defecte" + +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "connector de visualització del GStreamer per defecte" + +#~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "" +#~ "descripció de l'audiosink del GStreamer per a les conferències d'àudio/" +#~ "vídeo" + +#~ msgid "description for GStreamer audiosink for Music and Movies" +#~ msgstr "" +#~ "descripció de l'audiosink del GStreamer per a la música i les pel·lícules" + +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "descripció de l'audiosink del GStreamer per defecte" + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "descripció de l'audiosrc del GStreamer per defecte" diff --git a/po/cs.gmo b/po/cs.gmo new file mode 100644 index 0000000000000000000000000000000000000000..128ade35b7fc4390c0315a3d947cf6ae187b4e87 GIT binary patch literal 15862 zcmchd3zQ^PdB=;F!h$Fd1@UzS7g*V8W@eYyu#2$og`M4TW?5h&(VFg>>DunDYOAYe znK6m@z!(HIMwC~O@ePO=5%9sHC$p2ICnlQYDtHFziy@D^F?b}bK=oq^z7oC@s-BNQwfla!7Cr`5-jCrbcf@Iu&ky5|kR3X~o`1oi#`RQvxMs@s-Eva>FY_T`u+{7{r>~i&;NrO_Z6>Ttle&c24!dAKyxyhX3pIXsL$&KssCvH&`R9FuKL-9YWXgFf zNT_@RrPq~E`nv$Co$I0M*#TAmI8^(5sPgMj`7$Vdyc4Rvo8cz-L8$h92c830yc*ku zgYdPm0sG+XF8wD^?f-YE`i^HZtGtt;>U%j3Tx&B`X)t<8)*Fu`$ZH8+1UP#ltS%}N>?tw?bMA;KlHVj^Y8< z{EXw5q4fWCcsKk$RCzaIJmTk}{Phpu>)>f6&)W&Ffi%_oB%FfZhE;emo!<`U;ClEk za2;GlCr98Ul%5`g@)Q3H<;Mr9Y*f#o?CwiY_5TNdr0111VmG`VN{^q1&xij7kA=U4 zOmXjd6sGZ52{q2!pzN>#HGVfkm46$2A^aB9`2PcZ5j+ZI>%CLq(eM(e`Ft7F`@0?A z2vz@HcnVD5G4NgRWOxfa0e%F^KYRwtp1ujC@1H=Gf7}J0himjsgh#>E@I=@T)t=Wu z)idIFt>c@Z@>QYo?Q{3v4WCE){qQ*WVJQ8~LAC#W$4B6)q`&6)*HHTS5tRM>9I8Lh zV~|w;2~hQ&3RT}(?*3YrUI(w>{xEzDz7O63w=#ID|4FEFe&qNxl-_<0&w(dm)T-}7 z_+q%uaTH1~RrkCOReu7d=XW@M2r@Oj`=I*uZFo8SC#ZVQX3(XVlH&zX;_zh_5gDUSScqRM^WN5rgF3sm(42MbI0sG+(q2|r$Ogg2ngtGs)K$UYl zRQvCB{4A8-ABU>%kKqpZ=TQB78I#z+%b?P4gtDu*L)ptMQ1j<*sP=yiYX1BMJOX|a znMPFin-KlM35zjz*;K-89Z zAdevWJ)Fb(DCy^NdCU$rr6c^t%w*Wv}wJOqXNGqsXU};CBqN1-V5Des?1$+AGidBRGRx zh8*ec-RJmL_+jJ{519ka2hKEAV>c_mQKJHz4ibZ@Y^(!mE%N zDIv!r4?r6PMnS#8GNS{3xg|dX@#f$z^h8VLj~&BQw?v{2B_{ zxXIh-M^T)bu!73M$r)1#ro(bzHCbvujGIB?r-9iQrqwu0jW6|-Yo1ec4s*WQv1PNj z5j9VR(UeJoR$R|CRK`zDl2LpkFk#E6x|tv~t*qIM6Ld*EaaOO`2Ts{0jonBTo(0jH zvw*%%WRsIY(lT^paceuJ1g+GcsE4hpDGXkx$YOoV=8Utba&Qx-Xm`_3{6>I%wG4eL zw4l(`hTrTob25n=%Va~bXvbQFD`yfjY=k$+0vYQht{e1OsiV+hs}Jivv%8AcG3u7a zBA&EHy-PKZ*-nnlw9=r_9+}RlXg;NSGpGj*jN{qsZyWVtyvM)0_oMM0NT{hRnnW@ClIVl4+9T;XzBWziXV|RAE_9bE3(-=Fw>8SIU5mTb%xzV)l*v)i&h2KnZv7Npz znF+Vj#Iv;ZvnlkaA{=2@_BMr6Vd~fARNI&GqwczIpmR0Yxmx3GiuXlKBX6_y@yuE^ zUoG(`!a98kTDFgcJ`b7gc)^wi&^Oa->w~6}giM-}*;ozm#o?q0l_7sR(0=M_Xe)~a zYGNi;={=Lav|Pr;E~J~yjelNH(M6QJEq+*MmiUwSAT5b$LVrqa7qgPfRz9We3O8g{ zw%V_B6p{NDI+OD9M5Y$^HpJC}^;R&(N?@)W*}T<+4SyL>ABl2Z2A<5cZT~ zhW#1lc1L-Muk|li{4(V@TX^mTrL5Np8Vp!BqVi1dkaslc`q6S`A{S}jM7KSS=xK2) zoQg2bR!aY;((1ESFzwe_zBIYo&ixr{pw$VUurNf}pw%(2br-+x@Y0X`ohVKk&(QQd zQ>(DVEt(pIPNI^|@IH$+wPdfXXJ*@MQLieX)8?)+G18t|Y?Gy$!kp~Q;|ybw(he>u z*D{$7QPIhae1o%rX#$}blfj)WHHo+Q1ZOt5%Ky4xY#Y9^S&gHBnO2C=c7#zNzje?( zIk4i*;jo;i6 z6rG!95~p!FuCqW8nPO))F54Hjh{FRyRbm{?9%7rs7PfWFjv;<`bobbZ32sP($c919 zdd9xM_U7=KC1a;)EWFQBww>^!0VdaAG<~NSJk3sKrnhTy(%ThzyXe_ealhnlEIkKy zDG2qjsNBZ6&=O|{d1T|Thx844BbxbatK3D5{f&fCarc-U*JN?UvU`y6~y1 zs&+WOI2IU5;!2iph)1=udh|cxkHQCsyt(8F_q5)RW=t(24DH0f>=~;un_U%>FEgy+c84`dJjYbBa}fn-A7!U8 zCk;Ahu$vj1r%c@DGat~C&BZ2{2;5FM%zTM_X&f_YX-Yej*%j4i?7JHL$uMc9gph?- zu?OctY~)|gj|Z6QYL)it-CD>RM&-ECtg{*kD zj=hri-lOF@|0|=jNf&Rp5-KbpvMRq^<|qhXx6du7_Cy0q%r`cB!X(Y`9M(}2^3(00 z-lD+b?R<$_e9zg`9?m)%fp<+cL>1kMlBbuRD%Sj)DxPKL}#kS6A;c-l|Qx@Ik!2ri$F z>(NZ9JbM|Lqp6IYMc;1L{~@z+HYiukI=c$-wyGlDY4nv_mvgF{uL;hb%^%NH0fB%s&qc~97dO#a@9|;g7sJL-qLq*H=o+g zAyeOG3|!mbA#?FWn64P9XNh0$+d_QZ8Zr^eC)rxR=2E7IF4vzMtzSQ|%Dm3>n;~;< zblLhrbN1OLTDN|!ZVqsB@X{66_H7N=ndEBO5!d{>Lc4*|zzTQBdG2Hu)ylytB|Fz= zu56uY;))URVGDQQgjtjt|@#)aK`={pi45CacBKfm=hiKuye( za!THwmYlmi8};_g?=Pl0*Mp0mkZM0E-sdQhGg8x}fz^Zx=jSLt@1s31o$OFii&-x>EOvI@4W+LC}_ zsART6g58}#ozX6<*73%HyXXbw*TaQ5Thgp=7^tcapqgSx0TcIT( zgG}t!9xr=s7hodO#aYyDKX3N*48=qm^fJ0``ZOU8rI)4pR;(uSseLvdxuvS?ZPs%6 zW!X{(`+#K{yBB4oXvVhB9?&KW4=vTio?dcNYc<4sOZSqo?CoVw5pfz!=d;LKC&k&x zSQvKf!^9JbAX~e=s$*z#O<0H!Cl2XfO0k?vfcVC~Yq> zN1QD@G5??}I5vC3h%;87^Wd7y@K@2-Vqa4F^=jv!&h88v^K*m?aZ~OMcPis$Pz&bN zRmUN#H1fON@>hGw9A?9Ehu5`(-sw^>3^s8!gFk47EzT`E{zhI%V^gaWrQ>Iq?rx%! zt7sE;4b07!QgE-0+$$8SY%Kc*{zK~wT5c5Wm=`+7%{4ziM4q3kYcQsjfAO8Xj79g{ z5wv^99Yed+8gGn(7M^epnfZ~K8mq=!o#m>tz=i1K!IoCl+%JR?p-sa&TfB9-8aH(q zu9zq*w%mpSLk!p6fCX(%TEx#xqeL8vJ;W}VD+3c{sn(fURz-bL(pt0H;H8y6YQMYq z#Q{E1v{&D-J*#!rJmK$6m-egA@r|O{8u?u3aTL}RXTexdujWc>a^6S;6xaA>RIV=e z9XbTpcdhyRWFT`kl=1CJc*o}KGB{gUHqcuum7W>++@Wd!(78O~a(!N0T!qN!VZwsE zf$;?MdbXC?lk={z=N0GUEhF=5X_i|HeYF;sEwyfy%&-j@>@d3lkBvP}XX=D|v1&%W zFsYuop4^U~LruLMDrmCXBOSiira64)NJ&TP*%Ah<4Sv1q6PFZ6BVsW4kR}DWHyP|h zh&YO6C^}^8%OO4bUApSU<5zr{NQ`~s3=QrY0|O*u$e4JQGY_RTl{oFhKQz8$Vqtrr z5AGDl`HLIXQ-(b#e`ZB!V)K?it0s2b2TrCtr}8i=>#3@s^urrNRn$KGU)=gak$4E6_`X+&Cw3#T!e$WxreK%#Qv@?S!_u3OOEJ;?no_%(UVfO1HaEy)oO_SLXM;v2L91 zCa$-KL;Qt1l$$MIH=#YVuM*b{d$_daK5kX6WWg}!n0p;eA0SgpGXb>BR? z@ibbsUa`hDVmfF={BNE1H;{rU=wpXVx`;(Ld_HC5v>!!C+pi+U_r{y-?QAg7m^pAO z@z758uF}ph4wPPdSAPQ>J&@71+-xSl@p3T(TT{meJPo{jp__nO2DbG4W~usp`ZOdWfx2P6%}ul+KC#qdBEr?$hf}juX*itM|N5$gE*iE9nlbuD(-{-y-At3( z7(G9yzQ`;*A?0)ra+bKaDILu2=9GdEj5X;bzh3!b81H zJNVX;Ez|cMPTm>C?*7dB`EC;HRO1Lh8+c8(TC*iDtP_hi<}sdSet!~A_}(b?$k(57 z->w=v3wyxgoO637=AoTPo#bu|uw7s89zVD6jNN!KL@(K+HN|IzLDFg4;#*5oXb}c`_+iU^3DNXu9?D-UgnK*)JEuS`|9Ef++hB_sjx7( z!bUnrthsyf4!WVQN&&jp0i`oBZ&!QQRv2p=6KF~3^fY%noPx~KtA^O#1ar;zCHw&< zVgC!mG+%UOMVypR#Khfpuh+;3i90q(|Jx@Id}HBwyq%jmIj!=mR=N64!e*G^kZ;uI zsAA4eJ_d_un?pF$h+-QjlY8MIykXbk^SCG@@*#?rrR&R6u{3++<6JIB1^EHf-e7OH z$vxHQ6K4L)OFj)_XZerHxL%#Qc6L%F?<#wMFhf~GqlBt-jiN(mM`q*fBzO=>b. +# This file is put in the public domain. +# Miloslav Trmac , 2004. +# Petr Kovar , 2007, 2008, 2009, 2010, 2011. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good-0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-01-12 23:07+0100\n" +"Last-Translator: Petr Kovar \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Lokalize 1.1\n" + +msgid "Could not establish connection to sound server" +msgstr "Nezdařilo se navázání spojení se zvukovým serverem" + +msgid "Failed to query sound server capabilities" +msgstr "Nezdařil se dotaz na schopnosti zvukového serveru" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "\"%s\" od \"%s\"" + +msgid "Internal data stream error." +msgstr "Vnitřní chyba datového proudu." + +msgid "Failed to decode JPEG image" +msgstr "Nezdařilo se dekódování obrázku JPEG" + +msgid "Could not connect to server" +msgstr "Nezdařilo se spojení se serverem" + +msgid "Server does not support seeking." +msgstr "Server nepodporuje hledání." + +msgid "Could not resolve server name." +msgstr "Nezdařil se překlad názvu serveru." + +msgid "Could not establish connection to server." +msgstr "Nezdařilo se navázání spojení se serverem." + +msgid "Secure connection setup failed." +msgstr "Zabezpečené připojení selhalo." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Došlo k síťové chybě, nebo server neočekávaně ukončil spojení." + +msgid "Server sent bad data." +msgstr "Server odeslal chybná data." + +msgid "No URL set." +msgstr "Nenastaveno URL." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Žádný nebo neplatný zvukový vstup, proud AVI bude poškozen." + +msgid "This file contains no playable streams." +msgstr "Tento soubor neobsahuje hratelné proudy." + +msgid "This file is invalid and cannot be played." +msgstr "Tento soubor je neplatný a nelze jej přehrát." + +msgid "This file is corrupt and cannot be played." +msgstr "Tento soubor je poškozen a nelze jej přehrát." + +msgid "Invalid atom size." +msgstr "Atom - neplatná velikost." + +msgid "This file is incomplete and cannot be played." +msgstr "Tento soubor není úplný a nelze jej přehrát." + +msgid "The video in this file might not play correctly." +msgstr "Video v tomto souboru se nemusí přehrát správně." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Tento soubor obsahuje příliš mnoho proudů. Přehrává se pouze první %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Nebyl nalezen žádný podporovaný proud. Bude patrně nutné nainstalovat " +"zásuvný modul rozšíření GStreamer RTSP pro multimediální proudy Real." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Nebyl nalezen žádný podporovaný proud. Patrně bude nutné povolit více " +"přenosových protokolů, jinak asi bude scházet potřebný zásuvný modul " +"rozšíření GStreamer RTSP." + +msgid "Internal data flow error." +msgstr "Vnitřní chyba datového toku." + +msgid "Volume" +msgstr "Hlasitost" + +msgid "Bass" +msgstr "Basy" + +msgid "Treble" +msgstr "Výšky" + +msgid "Synth" +msgstr "Syntezátor" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Reproduktor" + +msgid "Line-in" +msgstr "Linkový vstup" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Směšovač" + +msgid "PCM-2" +msgstr "PCM 2" + +msgid "Record" +msgstr "Nahrávání" + +msgid "In-gain" +msgstr "Vstupní zesílení" + +msgid "Out-gain" +msgstr "Výstupní zesílení" + +msgid "Line-1" +msgstr "Linka 1" + +msgid "Line-2" +msgstr "Linka 2" + +msgid "Line-3" +msgstr "Linka 3" + +msgid "Digital-1" +msgstr "Digitální 1" + +msgid "Digital-2" +msgstr "Digitální 2" + +msgid "Digital-3" +msgstr "Digitální 3" + +msgid "Phone-in" +msgstr "Telefonní vstup" + +msgid "Phone-out" +msgstr "Telefonní výstup" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Rádio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Zvukové zařízení nelze otevřít k přehrávání. Zařízení je používáno jinou " +"aplikací." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Zvukové zařízení nelze otevřít k přehrávání. Nemáte oprávnění k otevření " +"zařízení." + +msgid "Could not open audio device for playback." +msgstr "Zvukové zařízení nelze otevřít ke čtení." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Zvukové zařízení nelze otevřít k nahrávání. Nemáte oprávnění k otevření " +"zařízení." + +msgid "Could not open audio device for recording." +msgstr "Zvukové zařízení nelze otevřít k nahrávání." + +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." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +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." + +msgid "Master" +msgstr "Master" + +msgid "Front" +msgstr "Přední" + +msgid "Rear" +msgstr "Zadní" + +msgid "Headphones" +msgstr "Sluchátka" + +msgid "Center" +msgstr "Středový" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Prostorový zvuk" + +msgid "Side" +msgstr "Boční" + +msgid "Built-in Speaker" +msgstr "Zabudovaný reproduktor" + +msgid "AUX 1 Out" +msgstr "Výstup AUX 1" + +msgid "AUX 2 Out" +msgstr "Výstup AUX 2" + +msgid "AUX Out" +msgstr "Výstup AUX" + +msgid "3D Depth" +msgstr "Hloubka prostorového zvuku" + +msgid "3D Center" +msgstr "Střed prostorového zvuku" + +msgid "3D Enhance" +msgstr "Prostorové rozšíření" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Linkový výstup" + +msgid "Line In" +msgstr "Linkový vstup" + +msgid "Internal CD" +msgstr "Vnitřní CD" + +msgid "Video In" +msgstr "Vstup videa" + +msgid "AUX 1 In" +msgstr "Vstup AUX 1" + +msgid "AUX 2 In" +msgstr "Vstup AUX 2" + +msgid "AUX In" +msgstr "Vstup AUX" + +msgid "Record Gain" +msgstr "Zesílení záznamu" + +msgid "Output Gain" +msgstr "Výstupní zesílení" + +msgid "Microphone Boost" +msgstr "Zesílení mikrofonu" + +msgid "Loopback" +msgstr "Zpětná smyčka" + +msgid "Diagnostic" +msgstr "Diagnostika" + +msgid "Bass Boost" +msgstr "Zesílení basů" + +msgid "Playback Ports" +msgstr "Porty přehrávání" + +msgid "Input" +msgstr "Vstup" + +msgid "Record Source" +msgstr "Zdroj záznamu" + +msgid "Monitor Source" +msgstr "Zdroj monitoru" + +msgid "Keyboard Beep" +msgstr "Zvukové znamení klávesnice" + +msgid "Simulate Stereo" +msgstr "Napodobit stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Prostorový zvuk" + +msgid "Microphone Gain" +msgstr "Zesílení mikrofonu" + +msgid "Speaker Source" +msgstr "Zdroj reproduktoru" + +msgid "Microphone Source" +msgstr "Zdroj mikrofonu" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Středový / LFE" + +msgid "Stereo Mix" +msgstr "Směšovač stereo" + +msgid "Mono Mix" +msgstr "Směšovač mono" + +msgid "Input Mix" +msgstr "Směšovač vstupu" + +msgid "SPDIF In" +msgstr "Vstup SPDIF" + +msgid "SPDIF Out" +msgstr "Výstup SPDIF" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Digitální výstup" + +msgid "Digital In" +msgstr "Digitální vstup" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Telefonní sluchátko" + +msgid "Other" +msgstr "Jiné" + +msgid "None" +msgstr "Žádné" + +msgid "On" +msgstr "Zapnuto" + +msgid "Off" +msgstr "Vypnuto" + +msgid "Mute" +msgstr "Ztlumit" + +msgid "Fast" +msgstr "Rychlé" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Velmi nízké" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Nízké" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Střední" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Vysoké" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Velmi vysoké" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Výroba" + +msgid "Front Panel Microphone" +msgstr "Mikrofon na předním panelu" + +msgid "Front Panel Line In" +msgstr "Linkový vstup na předním panelu" + +msgid "Front Panel Headphones" +msgstr "Sluchátka na předním panelu" + +msgid "Front Panel Line Out" +msgstr "Linkový výstup na předním panelu" + +msgid "Green Connector" +msgstr "Zelený konektor" + +msgid "Pink Connector" +msgstr "Růžový konektor" + +msgid "Blue Connector" +msgstr "Modrý konektor" + +msgid "White Connector" +msgstr "Bílý konektor" + +msgid "Black Connector" +msgstr "Černý konektor" + +msgid "Gray Connector" +msgstr "Šedý konektor" + +msgid "Orange Connector" +msgstr "Oranžový konektor" + +msgid "Red Connector" +msgstr "Červený konektor" + +msgid "Yellow Connector" +msgstr "Žlutý konektor" + +msgid "Green Front Panel Connector" +msgstr "Zelený konektor na předním panelu" + +msgid "Pink Front Panel Connector" +msgstr "Růžový konektor na předním panelu" + +msgid "Blue Front Panel Connector" +msgstr "Modrý konektor na předním panelu" + +msgid "White Front Panel Connector" +msgstr "Bílý konektor na předním panelu" + +msgid "Black Front Panel Connector" +msgstr "Černý konektor na předním panelu" + +msgid "Gray Front Panel Connector" +msgstr "Šedý konektor na předním panelu" + +msgid "Orange Front Panel Connector" +msgstr "Oranžový konektor na předním panelu" + +msgid "Red Front Panel Connector" +msgstr "Červený konektor na předním panelu" + +msgid "Yellow Front Panel Connector" +msgstr "Žlutý konektor na předním panelu" + +msgid "Spread Output" +msgstr "Rozložený výstup" + +msgid "Downmix" +msgstr "Snížení počtu kanálů" + +msgid "Virtual Mixer Input" +msgstr "Vstup virtuálního směšovače" + +msgid "Virtual Mixer Output" +msgstr "Výstup virtuálního směšovače" + +msgid "Virtual Mixer Channels" +msgstr "Kanály virtuálního směšovače" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d (funkce)" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s (funkce)" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +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." + +msgid "Playback is not supported by this audio device." +msgstr "Přehrávání není tímto zvukovým zařízením podporováno." + +msgid "Audio playback error." +msgstr "Chyba přehrávání zvuku." + +msgid "Recording is not supported by this audio device." +msgstr "Toto zvukové zařízení nepodporuje nahrávání." + +msgid "Error recording from audio device." +msgstr "Chyba při nahrávání ze zvukového zařízení." + +msgid "Gain" +msgstr "Zesílení" + +msgid "Headphone" +msgstr "Sluchátko" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Chyba při čtení %d bajtů na zařízení \"%s\"." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Získána neočekávaná velikost snímku %u namísto %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Chyba při čtení %d bajtů na zařízení \"%s\"." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Chyba při získávání informací o schopnostech u zařízení \"%s\": Nejedná se o " +"ovladač v4l2. Je nutné zkontrolovat, zda se nejedná o ovladač v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Nezdařilo se dotázání na vlastnosti vstupu %d na zařízení %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Selhalo zjištění nastavení tuneru %d na zařízení \"%s\"." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Nezdařilo se dotázání na norm na zařízení \"%s\"." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Nezdařilo se zjištění vlastností ovládacích prvků na zařízení \"%s\"." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Nelze rozpoznat zařízení \"%s\"." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Toto není zařízení \"%s\"." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Nelze otevřít zařízení \"%s\" ke čtení a k zápisu." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Zařízení \"%s\" není záznamovým zařízením." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Zařízení \"%s\" není výstupním zařízením." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Nezdařilo se nastavení norm u zařízení \"%s\"." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Nezdařilo se zjištění aktuální frekvence tuneru u zařízení \"%s\"." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Nezdařilo se nastavení aktuální frekvence tuneru u zařízení \"%s\" na %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Nezdařilo se zjištění síly signálu u zařízení \"%s\"." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" +"Nezdařilo se zjištění hodnoty u ovládacího prvku \"%d\" na zařízení \"%s\"." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Nezdařilo se nastavení hodnoty \"%d\" u ovládacího prvku \"%d\" na zařízení " +"\"%s\"." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Nezdařilo se získání aktuálního vstupu na zařízení \"%s\". Možná se jedná o " +"radiopřijímač." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Nezdařilo se nastavení vstupu \"%d\" na zařízení \"%s\"." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Nezdařilo se získání aktuálního výstupu na zařízení \"%s\". Možná se jedná o " +"radiopřijímač" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Nezdařilo se nastavení výstupu %d na zařízení %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Nezdařilo se zařazení vyrovnávací paměti na zařízení \"%s\"." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Nezdařil se pokus o získání videosnímků ze zařízení \"%s\"." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Selhání po %d pokusech. Zařízení %s. Systémová chyba: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Nezdařilo se zjištění parametrů na zařízení \"%s\"" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Vstupní videozařízení nepřijalo nové nastavení vzorkovací frekvence." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Nezdařilo se mapování vyrovnávací paměti ze zařízení \"%s\"" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Ovladač zařízení \"%s\" nepodporuje žádnou známou záznamovou metodu." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Změna rozlišení za běhu doposud není podporována." + +msgid "Cannot operate without a clock" +msgstr "Není možné fungovat bez hodin" diff --git a/po/da.gmo b/po/da.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9a5c6eac61aa337b602660b2e2f71602e808b0cb GIT binary patch literal 14553 zcmchd3zQ^PdB+O`#pNLaK0RAS(fC@&5Br!k`O(4pmLLwRz7DX|cgE2miIVaIX^E4;wF)=UCiJFt>$?t#ft?ugC zSr#-&o&EY(x9Zk?eD}NGz4x2_n=?+hHQ;&_c^-1sQ-k2RePJ_>c zCqo1EY8`w!d?`E$ZiB1fZg?rY!asjMRKELs`V&6=8Aw&Z=i$@fSKzbYpTiU2KSP!G zefSLcWBBv%)MvW(tcGWkz6kOvn1aW{8dN{(@CEQ~Q1yHOs@?a(P4FS8^1cUG!;{W% z9D!BRuZ8Eqo8YFYzlN`ZC(*f$FobH? zt?rnmuvFAz8cKSXON`Ei(TfS=LW$BScB5TZBXAo2G#x_LA86`&$<4;5^g5_MyThHK=tRF za0s5rAYB00Lfe0+@x2wE2=9P2F}Mq&!r&o@%7QQY=YI#4|A$cR`EMwDTuUdo4Mw5t zV;@w%B7T(rdMN$e2&KQ9q4ayZfBymh{zFjh_$XAq2chizvyd(XUxNG#zReFq9~_Ty zsr+ZbQ{mb0De!!#`qn|shfPp+cZuhi=Veg&_Cn=*HPrXB{(apufog9T%5Jaod>53x z-vQO{`yeJ9de&W04twA*e4S6<3^ji5gKF1mmR5>4k z>fa}z?D{dN@%$##czz!)9!H)Rx&FN4#ZJ$+L)qcoQ2qWGR68Dl`u;IE4!;J~PBY}* zuYpQ$^yy2W^tuD8J(ojVPp}WlURqG&dKFZ;Z-TOqn|=DjKK)6k{(Ti555EghRq#Ei zew}u%t7i>VyGP&__zH+=1=mCQqq`vgf0OUfz$9l$W*d}ta@L-V58#T63;h4>GQ2n{l3|!?|@GyeaQ2E&xhgD zc)kSN@QZLAym+l+3=Qeqp#1hjQ1kmAAwv_KLuR#m2fQ5K24#oef-i@LPOIOq=SP0~ zT~Kzl1j!Qo7}BL+O_eg>G^7c^d*OQcIjHwPfGXGU@M8EH_*8g1JQ3arHLi!C=HF+b z?DT6;e)gZ>$?zv|6I?ay?BNwq-%Ud0Ye0?no8bxY4k*3d2~U9^hNr;?{rkt@Ge~~{ zN{`=ws^{;azWWy_d;F2-=`4mypAS|3W~g$vL)q(IsPFc}li(Ym%8fm*@?3<e$P)rwfiw>?H-;=`nyoy{}4*AKY^zBgqUt{C43QlJ5)dJgX-t!q5APP~R;=>F2Fb`nd(lp6-WQXC8&P{oo#C0a4v= zKy>MQjlHfpbNB$mNK}?Pla%$W6!v$X&>DkhdVWA)i5XX|4<-Cn4j=ZzKDW44Fh^Te5Fm zzl_|DJgS7heh1!x+=x6IX(2B}mR}F~2XFJ#9E*_a5zQ}M+mIR}yO+(~jr4xw zXwIxgbiD-GWAEHruG=Z(LF9uCDuJ<9Q**knETtr@u9Pgif*z;QWo5)L% zkNaoug}ad(kla6u;Q^$9yxKqe6nq`>>&R1(*CNIBCV%sKco~u+Rpeyk_mGz%8xdXG zk>?`sQG)Ai{S0-?P|fV)iCW-QcY1S}NmZh0VXJ@-vR9k1b&*vl4iL!+#GqcUK6V>dK*)&NaTc_zJ(baA4 zqgr#Z8f@A3Dzm|iC;nznH@9~q#iJ2ZJo0&LvRjK&({6@~GvTanL^aqNb~^UQY)#Wn z9&Byu6 zLuJC;WL=7HMJDbTRks-BrqgY=(+piwPugwP>* zwvLhw#iAW+5x$%`%&-+-Eem9&vJawJ?rj*IyX*lgP>ZwB|-NGm)&Ot64|QAyzVv7Q%MB8PA3? zqbF1B|9h9sm1)=1(&W6H0b7U+Go}@Htj4iBJ6`fGZj_JRlPsD|v)U6H^?uf$tqmnZ zHnPGj3e^BcqGk?ealWiEc6!rM?=KUkL^bfEY2C4(>G+DUo#SGAeP1yXZl#T9DfBZI zhxG(U7|#Y{aXrq%rkrYVD?jS*D;s)uBfYzg!B~1QVHyS7t&eBcs`+Y3I1@MNOVqJ_ zEcJQRjN=768o-qe# zDp&}cEMJ;jg>!%08fbNfCoBySHfVLsXZ^*mKfLtAeUqeF>v5XyGIdHz+`!Z*brO~I zhW8lS)RH~a?3!KIl=Z3tdTs726C+(#i*2%0Q<{^@^LWD;P}-3tIW3dv2`V~UlyC4h zu)szr#bj`2D^21ZA)7P1xpKdLGqwv~*`806h?!Q}qwS89NPg>xXL4ZWhZFH^mf8Y> zonf2=JJ}-j_nNLbrW0QiY55-NqEVLY5bIQ`8tlxNW7~S0MVl-aUw##_?k`WToOjpQ z#CWg^_sD~EJ|B!HmAcwIF3WVkW&+nct}VD`2b;{^eJ#vGGuKQHy4`nm z*&9uyu+@LZP{ugAoDGzEUkxs0TO3>#EzYE2Rx?|ps2yn2St#04%GC`^gT;u$Mh9BD zJ5Af#d~gBOPZucikrY42bZU2-`?GRD{JG1+;gK>v_c*ItfJ&tA%dz;J_wsXpkA%1u7^wgw@uFj*xZiCv*F6RQ5}ZWaouHTW+o!&&itYH|USKjy zYh8CB-m8^0p#K>^+CF%==DJ6PvAL8+?g`ej7Zd5b4W(A@&eY`C_zp9k1nx$2aVpXY zyL=MEs=IA7XSXp`-rEy*Eyd&NZ0Ng;?MDq-*vrt-9%BZtCnv&FJT*V9Zc|6oDJF50 z2F1bFv*_+rTN^YT$K|7ny!I12<)+xdXjTNpjXN3zQ;P}FgK17c&N)wO3vaiDa=oRM zimm^$)`!WWX(Vhzd;4F`jPognT@~V%8P;%n!kS}0$5gU&5e4WRWv4Nb2E`fdVaDc} zW#1MuAJCJ{#UYm+xSepA`3m{+G-cA#lp>SalQb9Yw;KGpIP2tWAxocP58i{=o&T&0 z4=~l$DxKB)wU9MVX46)?$!YkB<@OGpBgIh)E_UE0-BM*1(a~VPwnKK!v3K&``?XxV zUm2ZE`u&D4p~eCts|sgl2?gQn4*KQPMl`TQcd*$XXL%RTVI4JFe!3ksI}})c?3TE} zXWpjv6YFS2!4>l{s_0J?mtJ|QTp3w^+t2JDtel&PegJ!@jMpmkULJMS)H`{_xz$dk zo~E_RaCO6Qb>t=0kyU#mdGE?ZrykcTTf6m6WjY--^LgGLUB7;&Tfc_YBCK-8;@FmE z_4TVJ_e@u|F-vsPu8c9IM$O3ZhLOtfNM&S$86FEuiuvVtEjxa&fY}8zuMuzPK)7V^mAdPBaGf$I|&5PlDnpSI#m-9tZ z?{d7TOtT3XHDh6-2+qYdzG-Z>zm+;m8yP#s={URio*!eX1g zat zn!I)=YTh=xjYh=5tGht4?4v1ZCQfSDB^vNSN7DYT>uyFc|KiR+DjtyBK|O?mYNokZ z3+FoRxT#jz_@ly)m8HXV+sr8~{iXT>_dt8ww!)9)S6iD)hX(Sx2P@_sPiixZbsZY# zmku9bS!Z?KRtqi*6BEJFDyb!Gs8zXr$5Dus!ZbI!|1 zir^#)8f-y1XE;X?1iLzVd&{|(4$YtjYIVaQ4a_ecN@}d0UcIfjL4(v4;*|rff3n{a z4wTLbyVxxwLw97H66GE_S{mgVz8s?|qLn2jx@Pp-U$*=svJLdKlv95}U^Wu3O_+~0 zmV4^N068G>%Qm^rq48L~FPHa!+1I0XVysJi(rYl&;#b!k)1VThFX?HS8LlvpX*-#4$F03Ea;_z|n4@Ls*0j6y zS$a{(MiE-H&b0_b;!mGg6td@aHAk%*lIher7|99XEI3;AJIBh0L6w@luxUd-8hM$U zW?CrhpA~FQ`bMUHP_kEHbLk%E_o#5l#U@RAnJRy}%)L>yj;63TA~virTC}1fI!Wg` zEGt#t!+v;jj+{0)xvQiV??sBB7fxoGc8orwf+}a~PIJ+&knBTczTsS>h*MVZaLQG7 zWX?e*U9Gs9z#2;zj~GyY)l4iM>aZM8wPrTDwJ}ROK#yCVvz=w_{ppLd@wN)l%Le|& z#jE>9QY8-4wWV|SY{_*%;@`|MGnkxms?7#q4hbt zgz4{8nAh^JcE_EbxqD?-mX9o-#XZv~nn$Rn|0SpYq^5As(YjL3j3GK#z~8M(6U^C6 zdG!36T{4Hq)wgw#MR>EMJ6}v;N&`wzXmY$iGE!ErFN3No`aPg%U$nQXBT7E95q?a_ zDNXsAw9>fja8uG|W8U}?)lrHitR)K?+`SOxDP|gW*UeZpT=>%c+8trX%%^NDbJpKE z!XeqfD-831oo_2V)vmO+S7a-ZrFWj@<%s!VWXCNDv$44(;0;7c4yx5zcaH8!jasbDHP}Ov8nKz*L)EoUk9T;>HF`-7_01b+^U2 zqR3TNNAawoO{ofG0xt`dPBm~hEuVonX-g`bvgad(oSEn*tnn8~>_PwgU_sk=_t+h& zYSCQ8E}Onct@sEVIb|E|TT67u&acQx}N1-ANz0)Gl z*R*bEFbrDs^a(YU4F}Ot*G?Z-wI?mkQOhb~gv?+?w(fp-wc@m)Kl@r$+wlmdm+rw} zd`z`G$BIWQ&ZsTYWw38>n(T9{b43%gH+T9`*WH|htZ_nF@gio!@Rg@=>EX)N_D;Yy z*3Ewo>OJV~zXsKc3+D(>IuBI?8-aD90T+SY%C?yP1behWcE4t@6ZVa9=4|h+C&Pk{ zcCZ<&aqseOx(6$E(S>29CwGUY_O#`;ifw2|b=pl<;VBi=@4Ndc7o9Du!M9VpI+aom z(Bl71*Eu92rOdT*oR(_zx0WciZqXh7zcg^Trvuh!G#DrTU~LaFL}%GNR$T~@&tpH(#9djq6)9VG|Ge3TJANAoFetf)cX&2ZjwbLA*mHPz$;Y$z88!;~`463v_f6}W?Lq9|>@A}T0c zl}YQSQN&MrEiG3?=I$K-!AfDML`%j0;urSF?F|C0S%r6e%w{ac-6T1GTPp%S{BZDC-5%MQU o)|0`fzU*aBz1iVd+%7oSMMDPsiF>f(MB9mTF8e#1UNPtY0PolA6951J literal 0 HcmV?d00001 diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..2cfb6df --- /dev/null +++ b/po/da.po @@ -0,0 +1,682 @@ +# Danish translation of gst-plugins-good. +# Copyright (C) 2010 gst. +# This file is distributed under the same license as the gst-plugins-good package. +# +# Mogens Jaeger , 2007. +# Joe Hansen , 2008, 2009, 2010, 2011. +# +# gain -> forhøjelse +# boost -> øgning? +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good-0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-01-07 23:54+0200\n" +"Last-Translator: Joe Hansen \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "Kunne ikke skabe kontakt til lyd-serveren" + +msgid "Failed to query sound server capabilities" +msgstr "Listning af lydservers egenskaber fejlede" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' af '%s'" + +msgid "Internal data stream error." +msgstr "Intern datastrømsfejl." + +msgid "Failed to decode JPEG image" +msgstr "Mislykkedes i at afkode JPEG-billede" + +msgid "Could not connect to server" +msgstr "Kunne ikke forbinde til server" + +msgid "Server does not support seeking." +msgstr "Server understøtter ikke søgning." + +msgid "Could not resolve server name." +msgstr "Kunne ikke slå servernavn op." + +msgid "Could not establish connection to server." +msgstr "Kunne ikke skabe kontakt til serveren." + +msgid "Secure connection setup failed." +msgstr "Opsætning af sikker forbindelse mislykkedes." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Der opstod en netværksfejl, eller serveren lukkede uventet forbindelsen." + +msgid "Server sent bad data." +msgstr "Server sendte ugyldige data." + +msgid "No URL set." +msgstr "Ingen adresse angivet." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Ingen eller defekt inddatalyd, AVI-sekvens vil blive ødelagt." + +msgid "This file contains no playable streams." +msgstr "Denne fil indeholder ingen spilbar strøm." + +msgid "This file is invalid and cannot be played." +msgstr "Denne fil er ufuldstændig og kan ikke afspilles." + +msgid "This file is corrupt and cannot be played." +msgstr "Denne fil er ødelagt og kan ikke afspilles." + +msgid "Invalid atom size." +msgstr "Ugyldig atomstørrelse." + +msgid "This file is incomplete and cannot be played." +msgstr "Denne fil er ufuldstændig og kan ikke afspilles." + +msgid "The video in this file might not play correctly." +msgstr "Videoen i denne fil afspilles måske ikke korrekt." + +# hvad er %d i dette program? Umiddelbart ville jeg tro det skulle +# hedde, "Afpiller kun første %d" men det kommer selvfølgelig an på +# sammenhængen. +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Denne fil indeholder for mange strømme. Afspil først kun %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Ingen understøttet strøm blev fundet. Du skal måske installere et " +"udvidelsesmodul for GStreamer RTSP til Real media-strømme." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Ingen understøttet strøm blev fundet. Du mangler måske at tillade yderligere " +"transportprotokoller eller mangler måske det korrekte udvidelsesmodul til " +"GStreamer RTSP." + +msgid "Internal data flow error." +msgstr "Intern datastrømsfejl." + +msgid "Volume" +msgstr "Lydstyrke" + +msgid "Bass" +msgstr "Bas" + +msgid "Treble" +msgstr "Diskant" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Højtaler" + +msgid "Line-in" +msgstr "Linje-ind" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "Cd" + +msgid "Mixer" +msgstr "Mikser" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Optag" + +msgid "In-gain" +msgstr "Ind-forhøjelse" + +msgid "Out-gain" +msgstr "Ud-forhøjelse" + +msgid "Line-1" +msgstr "Linje-1" + +msgid "Line-2" +msgstr "Linje-2" + +msgid "Line-3" +msgstr "Linje-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +# Eller Phono-ind +msgid "Phone-in" +msgstr "Lyd-ind" + +# Eller Phono-ud +msgid "Phone-out" +msgstr "Lyd-ud" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Kunne ikke åbne lydenhed til afspilning. Enheden anvendes af et andet " +"program." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Kunne ikke åbne lydenhed til afspilning. Du har ikke rettighed til at åbne " +"enheden." + +msgid "Could not open audio device for playback." +msgstr "Kunne ikke åbne enhed til afspilning." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Kunne ikke åbne lydenhed til optagelse. Du har ikke rettighed til at åbne " +"enheden." + +msgid "Could not open audio device for recording." +msgstr "Kunne ikke åbne lydenhed til optagelse." + +msgid "Could not open audio device for mixer control handling." +msgstr "Kunne ikke åbne lydenhed til håndtering af mikserkontrol." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Kunne ikke åbne lydenhed til håndtering af mikserkontrol. Denne version af " +"Open Sound System er ikke understøttet af dette element." + +msgid "Master" +msgstr "Master" + +msgid "Front" +msgstr "Front" + +msgid "Rear" +msgstr "Bagende" + +msgid "Headphones" +msgstr "Hovedtelefoner" + +msgid "Center" +msgstr "Centrum" + +# Low-frequency effect +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Side" + +msgid "Built-in Speaker" +msgstr "Indbygget højtaler" + +msgid "AUX 1 Out" +msgstr "AUX 1 ud" + +msgid "AUX 2 Out" +msgstr "AUX 2 ud" + +msgid "AUX Out" +msgstr "AUX ud" + +msgid "3D Depth" +msgstr "3D-dybde" + +msgid "3D Center" +msgstr "3D-centrum" + +msgid "3D Enhance" +msgstr "3D-forstærkning" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Linje ud" + +msgid "Line In" +msgstr "Linje ind" + +msgid "Internal CD" +msgstr "Intern cd" + +msgid "Video In" +msgstr "Video ind" + +msgid "AUX 1 In" +msgstr "AUX 1 ind" + +msgid "AUX 2 In" +msgstr "AUX 2 ind" + +msgid "AUX In" +msgstr "AUX ind" + +msgid "Record Gain" +msgstr "Optag - forhøjelse" + +msgid "Output Gain" +msgstr "Uddata - forhøjelse" + +msgid "Microphone Boost" +msgstr "Mikrofonøgning" + +msgid "Loopback" +msgstr "Loopback" + +msgid "Diagnostic" +msgstr "Diagnostik" + +msgid "Bass Boost" +msgstr "Bas-øgning" + +msgid "Playback Ports" +msgstr "Afspilningsporte" + +msgid "Input" +msgstr "Inddata" + +msgid "Record Source" +msgstr "Optag kilde" + +msgid "Monitor Source" +msgstr "Skærmkilde" + +msgid "Keyboard Beep" +msgstr "Tastaturbeep" + +msgid "Simulate Stereo" +msgstr "Simuler stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Surroundlyd" + +msgid "Microphone Gain" +msgstr "Mikrofonforhøjelse" + +msgid "Speaker Source" +msgstr "Højtalerkilde" + +msgid "Microphone Source" +msgstr "Mikrofonkilde" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Center / LFE" + +msgid "Stereo Mix" +msgstr "Stereomiks" + +msgid "Mono Mix" +msgstr "Monomiks" + +msgid "Input Mix" +msgstr "Inddatamiks" + +msgid "SPDIF In" +msgstr "SPDIF ind" + +msgid "SPDIF Out" +msgstr "SPDIF ud" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Digital ud" + +msgid "Digital In" +msgstr "Digital ind" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Håndsæt" + +msgid "Other" +msgstr "Andet" + +msgid "None" +msgstr "Ingen" + +msgid "On" +msgstr "Tænd" + +msgid "Off" +msgstr "Sluk" + +msgid "Mute" +msgstr "Slukket" + +msgid "Fast" +msgstr "Hurtig" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Meget lav" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Lav" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Mellem" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Høj" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Meget høj" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produktion" + +msgid "Front Panel Microphone" +msgstr "Frontpanelmikrofon" + +msgid "Front Panel Line In" +msgstr "Frontpanels linje ind" + +msgid "Front Panel Headphones" +msgstr "Frontpanels hovedtelefoner" + +msgid "Front Panel Line Out" +msgstr "Frontpanels linje ud" + +msgid "Green Connector" +msgstr "Grøn forbindelse " + +msgid "Pink Connector" +msgstr "Lyserød forbindelse" + +msgid "Blue Connector" +msgstr "Blå forbindelse" + +msgid "White Connector" +msgstr "Hvid forbindelse" + +msgid "Black Connector" +msgstr "Sort forbindelse" + +msgid "Gray Connector" +msgstr "Grå forbindelse" + +msgid "Orange Connector" +msgstr "Orange forbindelse" + +msgid "Red Connector" +msgstr "Rød forbindelse" + +msgid "Yellow Connector" +msgstr "Gul forbindelse" + +msgid "Green Front Panel Connector" +msgstr "Grøn frontpanelforbindelse" + +msgid "Pink Front Panel Connector" +msgstr "Lyserød frontpanelforbindelse" + +msgid "Blue Front Panel Connector" +msgstr "Blå frontpanelforbindelse" + +msgid "White Front Panel Connector" +msgstr "Hvid frontpanelforbindelse" + +msgid "Black Front Panel Connector" +msgstr "Sort frontpanelforbindelse" + +msgid "Gray Front Panel Connector" +msgstr "Grå frontpanelforbindelse" + +msgid "Orange Front Panel Connector" +msgstr "Orange frontpanelforbindelse" + +msgid "Red Front Panel Connector" +msgstr "Rød frontpanelforbindelse" + +msgid "Yellow Front Panel Connector" +msgstr "Gul frontpanelforbindelse" + +msgid "Spread Output" +msgstr "Spred uddata" + +msgid "Downmix" +msgstr "Downmix" + +msgid "Virtual Mixer Input" +msgstr "Virtuel mikserinddata" + +msgid "Virtual Mixer Output" +msgstr "Virtuel mikseruddata" + +msgid "Virtual Mixer Channels" +msgstr "Virtuel mikserkanaler" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d funktion" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s funktion" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Kunne ikke åbne lydenhed til afspilning. Denne version af Open Sound System " +"er ikke understøttet af dette element." + +msgid "Playback is not supported by this audio device." +msgstr "Afspilning er ikke understøttet af denne lydenhed." + +msgid "Audio playback error." +msgstr "Fejl ved lydafspilning." + +msgid "Recording is not supported by this audio device." +msgstr "Optagelse er ikke understøttet af denne lydenhed." + +msgid "Error recording from audio device." +msgstr "Fejl ved optagelse fra lydenhed." + +msgid "Gain" +msgstr "Forhøjelse" + +msgid "Headphone" +msgstr "Hovedtelefon" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Fejl ved læsning af %d byte på enhed '%s'." + +# Er rammestørrelse ikke mere passende? Jeg er dog ikke helt sikker på +# konteksten her. +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Fik uventet billedstørrelse på %u i steden for %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Fejl ved læsning af %d byte på enhed '%s'." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Fejl ved hentning af egenskaber for enhed '%s': Det er ikke en v412 driver. " +"Kontroller om det er en v411 driver." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Listning af inddata-attributter for %d i enhed %s fejlede" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Hentning af indstillinger for tuner %d på enhed '%s' fejlede." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Listning af standard på enhed '%s' fejlede." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Hentning af kontrolattributter for enhed '%s' fejlede." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Kan ikke identificere enhed '%s'." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Dette er ikke en enheds '%s'." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Kunne ikke tilgå enhed '%s'." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Enhed '%s' er ikke en optageenhed." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Enhed '%s' er ikke en uddataenhed." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Indstilling af standard for enhed '%s' fejlede." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Kunne ikke hente nuværende tuner-frekvens for enhed '%s'." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "Kunne ikke sætte nuværende tuner-frekvens for enhed '%s' til %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Kunne ikke hente signalstyrke for enhed '%s'." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Kunne ikke hente værdi af kontrol %d for enhed '%s'." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Kunne ikke sætte værdi %d på kontrol %d for enhed '%s'." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Kunne ikke hente nuværende inddata for enhed '%s'. Måske er det en radioenhed" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Kunne ikke sætte inddata %d for enhed %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Kunne ikke hente nuværende uddata for enhed '%s'. Måske er det en radioenhed" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Kunne ikke sætte uddata %d for enhed %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Kunne ikke sætte mellemlager fra enhed '%s' i kø." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Forsøg på at hente videorammer fra enhed '%s' mislykkedes." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Fejlede efter %d forsøg. enhed %s. systemfejl: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Kunne ikke hente parametre fra enhed '%s'" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Enheden til videoinddata accepterede ikke ny indstilling for billedrate." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Kunne ikke afbilde mellemlager fra enhed '%s'" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Driveren til enhed '%s' understøtter ingen kendt optagemetode." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Ændring af opløsning under kørsel er endnu ikke understøttet." + +msgid "Cannot operate without a clock" +msgstr "Kan ikke fungere uden et ur" diff --git a/po/de.gmo b/po/de.gmo new file mode 100644 index 0000000000000000000000000000000000000000..7dfb40415b79c07d020ef473a929daa3a4a19c0e GIT binary patch literal 15852 zcmchd3y>vMdB+jCq=9Rg6?6QLJbglZqx4HNXEkr|<1M zGy4Fla%<20`gET@kMDfvJKy?@Lc$DsQ&&Xd7w^hhzPweKt$&Kxx4>esPaFB>d*f|>Ernff=h1$ zlz!}i8du04m47RgeBJ>izuTeYdzX9uG57ovQ2lrSs@wr6J^wOf2;O6mf8M|HhpG3D zMY&Y}sqjR28hi#k7plEAQ0w6WD81Y0IO@0qs@x=0x$B|cue#?A#~7-=9VorM+3~$l z`hGXmxbKIku=fzuIKJ-qH&E?-3rb#(L$&u~sQ&*q)Hr_uHSep=V6Nc^OyNI3mD_=` zs(%wu>uWbu``18T^_o!a-U3zsZBX^z0rlQT-ShqK`6r>|{5hz8Jq$IEkGcH!;9Bzk z1vUP&&$RUqLG|ZiD7jt^)y`(9dDsQl!PmL`?NIY~4^+PnK(+e_ zBBT0!D7g+m$?rm_er|+nXD3wq*F*I$fU3U*RjvaikGDg$cPku)cR=;;TkssX>gDJz z9ERt?Sy+L0x%^k5`v31x?LCLZtolxdYVUNYb_QJje0VAO3!v6h47Hwafm%-=f~x1! zP~&?LO0T~HHJ^_|&F4?xFOQ+jS#~@p4Olt94645KpxVE}aVylgC*WTAdMG&^aQqX; zzjpjC)V%%3@qeJ&eb(7l{%1k;=Ugbgz7*0WZwFL6G1UD1D#T=YAA!fh2jL+6B9y)P z9y|`7fw0xyS#S)lg?iqBlGpu?{{pWdf9AQKcNx6F@ou<@{5Rn(@FlA~?^W<#*n$59 z?|^%l#GBv`;6_+K-}C0-eyDa|w#LqL4XXd|gG{aW8F&KxE2w$-j^mG@=KB|p$D$m zMgHAT{r_9YKkqae)A)A42|b6Z|J#s%-iz2Q^n5# z@jSl@s=g^G{d^5nzZ>p(4Aq}G$G5>3kbf^!|L=p6#{*FHJOU-JKXv)9!&Aur9aOm| z-1DD7$@dpf^ZH_p{{!#__+fa`#a52@L-p$csPPJSyJ9ZQ0w9QQ0<(AF@8Qg6{>&dK(%{;<5sBoxgM&&0aSld zsD9i8RnM(Za(O?TfOo+y@Cm5)*D*-l58##Xvv4!~4=DR{F^lO%a355Aw?oPQPN;s} z3)Rl2pvL=IcpdyQls!3(#V20wcmvct-V8Ml?}0wN2ddu>L#?OB;4$#`Nc%_{!y8EY z8M|XIy+3vwhXbTnl0Hq6jr>j0$4JF5E-v6zB<+I-Nxw^~keE8}e9|;YGW~VZgCzYv zXW=!W?8=p-KO()Gq~9c|MVccqbng=+{Z6&;-U$)8cfZSTg+6H;>1yWvF^ip^89C#n;YLe#hcG7!Ew~;O+eUv15lMRsGNmsX%ew(zH zl#--}T5HlP{oX~oi}Z*x?)N+JZqhqQFC@*9q%TWy)4WyToK1n)}BpbV$q~ArPUFHhE*KrCSAbs5BkAquC?{WEi;B(#eAHsRk6{KU` zz2A3y3;Zq8rKHchdmn~7Nw<)4cQ1l(B+ZbnclREGuOs~i=^3Qgl8WE2x{KGt9i)Ub zNO}(G4@j4h)|2!bBfXgPA!YcTrauFjKTz|xbmD3rC9$&I>vIOObNuOfU-Z_G`kTWz z4^v%@hV8tmi?O&F#MRIn@#8R`OVSxXOw%OwlWMh-hP5?5*LgGavoPHkrhc`RWMR$R zsU~q8nl}AT9NyUGI;^$k2fdL!*ZM>L_SjwQ>g48XxVSa!7q?s)lkL=^#BaBP`RSnQ zIx*;N3bM@n@i!$&mV298dbruPoTM(lB~9Yop9tcx)%UCuF3ldIWG8Cnl_>V7+F>w* zfHseMn}aw`azCmevZy}q*TQ{KH8heOEFLE9Fb(q1pNsNl(#icm;;GJfPRthmT7T!3 zF>fSseg%6v69ALf46X}6OUS<+6@Y1PaFCu~1Y+)R|7 zh4Gs@A!D8H)azlI`3$7Lx7}L8EDxqzQP%WJlh>`X+}j?oBLPaQR!jc$|%GS_L+@{wn)g+R-_ep2uGyPHTI zrOq@LN!=**F10*m201mK<>72GGu>Iyddl@?*a~M+jw82UDD{&l$@(aHt8-K*j5)p~C24^^<=g!GEJ`L`97O~jzLC5T$AlAw+a(w3N~jAyVgF#}v?c1fEZ zZi7FN6|Zy!VQmY8$$5FYqaH8qh-(Gyt)Yyy(7$S8Y^xv5292<&j%PB6Y@jIy0(-0} zTvCre9?Y}0yTVHY?SEGAhp5Nt!qcxPXTMI7V934^SLc^bc~_Ed9GO!SnMm^{vR%@N zB|XlfMvQ7^Ipc5S%_B9iFKDrSX>k?C{je?2>l8~^nj&=2$e7o9n_q8w8Har*PSV-K zbln!pN?Tmt(kKlQk#wi`2-4J+J<#g-+ZM`lRR!HX_k@X(E@{PdS)wVe$)#nSV)O}Z zc}-Tz6go;lr}MH6P6zhk2qmZt=4_=!yd}UnGtQO$>zuJ|*vfV@i9=Re$w%86#i8uh zvU@UM<(uPCHBC$f-qs+By{))NJzvvy$IqgLP}}!F2Z^#}2WY2qgWlGZHMY6yEShY& z`tqZYeSc|w<+9sG$G3aiF#pV<*BxQ+D)Y8Qji$Fft~Au=?b1y9*B{69ZkG$L)q#`Q zy{-j$;MZHpob|p3mpsuz3TAuHn92x4m*YTb^n>12xW(R%aDF-o(we_14BMWZ&O*?J z60R=T8VrUl)?3iiok`M`^UcMaH_nWPsW%?hqRy;Wnuy+|KUBK!50^96TQ3zg(^tyl zVx^oq5QrMVjM7FDM>#&dqr5OvB#9GWf*Z#idsip^p2?l;uJ~PCvo508O2e)uvm>nW zNA_+v)(4@@MXi<$EgMJLY1`L&&YY9%T%e5)*LKi23$sjM&VeXo6G{A_rHPqM*sJq2 zh%5?CjBelJ zZ;w5Dp|v;_>V#cBiJ{e zpV>}JN7E@5ahQ0;!Pc=D?o?Y2nvUbLQAJtvidk|~craQOUU6ZMM&8tXO!QzkCm?H_ zcgux0ZlO$XX{W;VU()*^p7&>B+|aK7%bBs6aM)EPcAH@jHz%w*{v1omtVIN%bCg-e zL>d%lFozjari$MdupW?;Da9cd58Ny`)O>|o(FH1A+JjG@NmXV_sY zqr&oSyT$e2b2_z`SjTMWUDJ#ZMQ@?l{K`w^y3p9$USW4*<8NtaoKRYecomrcNWP>`pfL%{*^!Si5$*(^z1) z2nIQ0acoP{#@baAyLMMLvr2T*u8gvzHu%HqhK4KahAYEE{9z%DN$y8y?=U{-X2O4N-0<8*62^_7N6nl5Rk#X~c;xi2WT=%KqE*FRvE2250Q8 zD;Y+Ecmt+k5Y4)RTH;2BBS&R7j==_hE5~XoxZLbd)T>V53C&h&;g!UD@@x>VmfaNB zuMrLs>Fd?7f%Up-eEaxVPkuv#>sBFtb|`u}-)6`;`_)=BJ&G^$tIZ%qKQ`{!y`^$V zubf6i_^C36>g#~K!M|iW%2!=mnMl}m@=DR;qO-jxM7ap*%=2Jua(v|K>sC#)I%&|V zY{6U4Huy19NjBR!d>M;PmmANG{g-d_hgM&9ju7XN^=1f<8%-ctx$D?X~S(&Zlsfya>cXZzGpV) zo|T_?TWr?|4*4UBlU1&XLVDB)rtt>5QPX{_hIzxB7scMtnEU4Q#CwKPmWp{l1 zrM>Ks>>0MN3b1n8>b}vRU0z&W4W|PepW7%G&wQQC!F-%!AwpYbgIFYjsTEv_bofO=C6yp(j)&GI*}0@ z)|8EO>aE2CndWDqld6~X1?s>}#Bq)jG{yD`l{CUTm@hDWrCD9*%og)L!_k6~+7}pR zgQzLStLTnLTUwdrVVgH%e@0{RCrrRr<7!Ca$f7)YTe&T{a{J4hv~oMln^swz-Y$RN zn<#>~z8zdKN&7gX_75dMe{lftK3uN}Gj)elV=>v{T)1`EUtuF`CS6GpA;ST;eRHk! z$+o_DkOfDP@rbq7?(kwGTs%;(W68QQd-_%Qi~#=~VH?j}gIFF9K6lsD)M}?LMt}P? zzRU!#4CNQ2#J)~ngSF#gyaiD%gW+|fg^Yi97<}shW zRp%DB_DGp3*;gZ$hOv8t#U|W+-qZe~#PzHR7uOE4AttI_?3LZT+bz5KmBZWHLVZs& zpBUJ72rzYb$yufzCu^23Hf9^xvbet)HRv%Ldf(JLYqh~2!;3El_2@&2d_Q_Wew#!_ z@O$wd&`uW*)_I>9!zq~d(IAPylpgApRy~C5N`0}@panoUZj%X&FEg-5e1pj-mb#sU z{x>ucA^I8n`v?=2ZR?;%t1@yOghT*|Q-?eqb}#&xfORprq+Z{C3R9sFhjk$HMy3e` z5-!k=y2A#|@j6}1T+UK|4ZdpbaIT^T)>b%!hiHtE7Mz#)b`Wy1E>W9$z8XgZbQ zVi^Zoy(#st=uXeJ9%6hYbsFiak*mziwi{P;nE5W0(k}3;73x2d7)s49GYDl*$(n-x zMZ$v4@>ZyAq+dagIJN4P{UT7-cdg!Xg@vBGksnEf{VyNQ==ti zefcSA!6?e(%n}QW00!SACE8`Ck$KG)I@UOpm!l3egeO||8-lkZY1f;J2U4n7cCIlI za3f+40xLf?5?Sf#cr=qHb&U72_a;z>mba&S?hAJ4W#}W5q{%;>O~^79LsXkMKRC z5EXGucSzkGNLZb;G7*JsP8;118(km4%%z*HqK|y!aJ?oFU0k_O9mR0a7Ip_h09SK% zCQ8po9X=4GA%PaYLKGi9>|A@@N!LdYH~+)kOI+#RLA!Wvg;(VGxX5P28;DNz_kHs) z?!+9iAB=idl;p!lNzzk!XLgovJUTdz)c9`(oK)&q3?0H6_!oL&BNNo&L~53y>}Q@3 zw$NJQ!$^fM5qJdVcwi@}$tQEd%K8d1mN}I)&Rp3aH(I6_8)2Q0u)G9$srO_DoIBh~;RH3Di#!5l^(eTWYVEqpxbiP84O1Nv`V z_M41xZtRrc?clpaw3hPU;JR1#>q>9oF3B%nxFhEHhUaC&Ms8*H=iH|k^C`}%C?nH4 z?&@h^-}WYxEa)1Ia%OqMJ%^o0o<7C&Zde_XQFG_GvX{AH9L0Q=vC%pES!To?7bX`E zR%cK_B6G#9?uA`P#cj7bitLl`!(_q$W?s%O^-P2eb zSP}oz@xeIN8dk~@ox?dEv2 z!j4@Yn~Q$Q98HG`1nLY{%%}Ytq^(fL|Kh`iRWQ4?L~hD^*1}41h7Y{q3@1|?31#QP z#88ci>1a=id`whxaX+R;){P^?bk?Sp=|FK2*0+}MAzoPM81tkLYPOiphc;U0#~ff; z0GKuWa&x5X>q1`-q!ZIRXf5uqMGgILhFUq!+4o{EvQ-*_D(J-fu%p^=Vk&v6b+}F9 z=w8ROQ!HJro1MYN83w&=iwAVjo(h|(-<0QIu41>LmOevu*U(-R-rTo$rkN)bA+?^6 zYCi~k?L`VwmZ literal 0 HcmV?d00001 diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..3281ae5 --- /dev/null +++ b/po/de.po @@ -0,0 +1,844 @@ +# German translations for gst-plugins-bad +# Copyright (C) 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-good package. +# +# PCM = PCM +# Line-in = Line-Eingang +# Line-out = Line-Ausgang +# Pipeline = Weiterleitung +# Stream = Strom +# mixer = +# Christian Kirbach , 2010, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-01-21 22:36+0100\n" +"Last-Translator: Christian Kirbach \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not establish connection to sound server" +msgstr "Es konnte keine Verbindung zum Audio-Server hergestellt werden" + +msgid "Failed to query sound server capabilities" +msgstr "Abfrage der Fähigkeiten des Audio-Servers ist fehlgeschlagen" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "»%s« durch »%s«" + +msgid "Internal data stream error." +msgstr "Interner Datenstromfehler." + +msgid "Failed to decode JPEG image" +msgstr "Dekodieren des JPEG-Bildes schlug fehl" + +msgid "Could not connect to server" +msgstr "Verbindung zum Server konnte nicht hergestellt werden" + +msgid "Server does not support seeking." +msgstr "Suchlauf wird nicht vom Server unterstützt." + +msgid "Could not resolve server name." +msgstr "Servername konnte nicht aufgelöst werden." + +msgid "Could not establish connection to server." +msgstr "Es konnte keine Verbindung zum Server hergestellt werden." + +msgid "Secure connection setup failed." +msgstr "Aufbau einer sichern Verbindung ist gescheitert." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Ein Netzwerkfehler ist aufgetreten, oder der Server schloss die Verbindung " +"unerwartet." + +msgid "Server sent bad data." +msgstr "Server gab unerwartete Daten zurück." + +msgid "No URL set." +msgstr "Keine Adresse festgelegt." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Kein oder ungültiger Eingabeton, der AVI-Strom wird fehlerhaft sein." + +msgid "This file contains no playable streams." +msgstr "Diese Datei enthält keine abspielbaren Ströme." + +msgid "This file is invalid and cannot be played." +msgstr "Diese Datei ist ungültig und kann nicht wiedergegeben werden." + +msgid "This file is corrupt and cannot be played." +msgstr "Diese Datei ist beschädigt und kann nicht wiedergegeben werden." + +msgid "Invalid atom size." +msgstr "Ungültige Atom-Größe." + +msgid "This file is incomplete and cannot be played." +msgstr "Diese Datei ist unvollständig und kann nicht wiedergegeben werden." + +msgid "The video in this file might not play correctly." +msgstr "Das Video in dieser Datei wird vielleicht nicht korrekt wiedergegeben." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Diese Datei enthält zu viele Ströme. Es werden nur die ersten %d " +"wiedergegeben" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Es wurde kein unterstützter Strom gefunden. Sie müssen vielleicht ein Plugin " +"zur RTSP-Erweiterung von GStreamer für »Real«-Medienströme installieren." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Es wurde kein unterstützter Strom gefunden. Sie müssen eventuell zusätzliche " +"Transport-Protokolle erlauben oder es fehlt vielleicht das richtige Plugin " +"zur RTSP-Erweiterung." + +msgid "Internal data flow error." +msgstr "Interner Datenstromfehler." + +msgid "Volume" +msgstr "Lautstärke" + +msgid "Bass" +msgstr "Bass" + +msgid "Treble" +msgstr "Höhen" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Lautsprecher" + +msgid "Line-in" +msgstr "Line-Eingang" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mischer" + +msgid "PCM-2" +msgstr "PCM 2" + +msgid "Record" +msgstr "Aufnahme" + +msgid "In-gain" +msgstr "Eingangspegel" + +msgid "Out-gain" +msgstr "Ausgangspegel" + +msgid "Line-1" +msgstr "Eingang-1" + +msgid "Line-2" +msgstr "Eingang-2" + +msgid "Line-3" +msgstr "Eingang-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +# Mikrofon? Zweifelhaft. Eher Kopfhörer oder Telefon. +msgid "Phone-in" +msgstr "Mikrofoneingang" + +# Ist hier Kopfhörer oder Telefon gemeint? +msgid "Phone-out" +msgstr "Mikrofonausgang" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +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." + +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." + +msgid "Could not open audio device for playback." +msgstr "Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. " + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Das Audio-Gerät konnte nicht zur Aufnahme geöffnet werden. Sie haben nicht " +"die Berechtigungen zum Öffnen des Gerätes." + +msgid "Could not open audio device for recording." +msgstr "Das Audio-Gerät konnte nicht zur Aufnahme geöffnet werden. " + +msgid "Could not open audio device for mixer control handling." +msgstr "Das Audio-Gerät konnte nicht für das Mischpult geöffnet werden." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Das Audio-Gerät konnte nicht für das Mischpult geöffnet werden. Diese " +"Version des Open Sound System (OSS) wird nicht unterstützt." + +msgid "Master" +msgstr "Hauptregler" + +msgid "Front" +msgstr "Front" + +msgid "Rear" +msgstr "AufnahmeRückseite" + +msgid "Headphones" +msgstr "Kopfhörer" + +msgid "Center" +msgstr "Mitte" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Seite" + +msgid "Built-in Speaker" +msgstr "Eingebaute Lautsprecher" + +msgid "AUX 1 Out" +msgstr "AUX-Ausgang 1" + +msgid "AUX 2 Out" +msgstr "AUX-Ausgang 2" + +msgid "AUX Out" +msgstr "AUX-Ausgang" + +msgid "3D Depth" +msgstr "3D-Tiefe" + +msgid "3D Center" +msgstr "3D-Mitte" + +msgid "3D Enhance" +msgstr "Erweitertes 3D" + +msgid "Telephone" +msgstr "Telefon" + +# Hier ist mir noch nichts Besseres eingefallen. +msgid "Line Out" +msgstr "Line-Ausgang" + +msgid "Line In" +msgstr "Line-Eingang" + +msgid "Internal CD" +msgstr "Interne CD" + +msgid "Video In" +msgstr "Video-Eingang" + +msgid "AUX 1 In" +msgstr "AUX-Eingang 1" + +msgid "AUX 2 In" +msgstr "AUX-Eingang 2" + +msgid "AUX In" +msgstr "AUX-Eingang" + +msgid "Record Gain" +msgstr "Aufnahmepegel" + +msgid "Output Gain" +msgstr "Ausgangspegel" + +msgid "Microphone Boost" +msgstr "Mikrofonverstärkung" + +msgid "Loopback" +msgstr "Schleife" + +msgid "Diagnostic" +msgstr "Zur Diagnose" + +msgid "Bass Boost" +msgstr "Bassverstärkung" + +msgid "Playback Ports" +msgstr "Wiedergabe-Ports" + +msgid "Input" +msgstr "Eingang" + +msgid "Record Source" +msgstr "Aufnahmequelle" + +msgid "Monitor Source" +msgstr "Überwachungsquelle" + +msgid "Keyboard Beep" +msgstr "Tastatur-Piepsen" + +msgid "Simulate Stereo" +msgstr "Stereo simulieren" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Surround-Audio" + +msgid "Microphone Gain" +msgstr "Mikrofonpegel" + +msgid "Speaker Source" +msgstr "Lautsprecherquelle" + +msgid "Microphone Source" +msgstr "Mikrofonquelle" + +msgid "Jack" +msgstr "Stecker" + +msgid "Center / LFE" +msgstr "Mitte / LFE" + +msgid "Stereo Mix" +msgstr "Stereo-Mischpult" + +msgid "Mono Mix" +msgstr "Mono-Mischpult" + +msgid "Input Mix" +msgstr "Eingangs-Mischpult" + +msgid "SPDIF In" +msgstr "SPDIF-Eingang" + +msgid "SPDIF Out" +msgstr "SPDIF-Ausgang" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Digital-Ausgang" + +msgid "Digital In" +msgstr "Digital-Eingang" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Hörer" + +msgid "Other" +msgstr "Anderes" + +msgid "None" +msgstr "Kein" + +msgid "On" +msgstr "Aktiviert" + +msgid "Off" +msgstr "Deaktiviert" + +msgid "Mute" +msgstr "Stumm" + +msgid "Fast" +msgstr "Schnell" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Sehr niedrig" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Niedrig" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Medium" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Hoch" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Sehr hoch" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produktion" + +msgid "Front Panel Microphone" +msgstr "Mikrofon am Vordereingang" + +msgid "Front Panel Line In" +msgstr "Line-Eingang am Vordereingang" + +msgid "Front Panel Headphones" +msgstr "Kopfhörer am Vordereingang" + +msgid "Front Panel Line Out" +msgstr "Line-Ausgang am Vordereingang" + +msgid "Green Connector" +msgstr "Grüner Stecker" + +msgid "Pink Connector" +msgstr "Rosa Stecker" + +msgid "Blue Connector" +msgstr "Blauer Stecker" + +msgid "White Connector" +msgstr "Weißer Stecker" + +msgid "Black Connector" +msgstr "Schwarzer Stecker" + +msgid "Gray Connector" +msgstr "Grauer Stecker" + +msgid "Orange Connector" +msgstr "Oranger Stecker" + +msgid "Red Connector" +msgstr "Roter Stecker" + +msgid "Yellow Connector" +msgstr "Gelber Stecker" + +msgid "Green Front Panel Connector" +msgstr "Grüner Stecker am Vordereingang" + +msgid "Pink Front Panel Connector" +msgstr "Rosa Stecker am Vordereingang" + +msgid "Blue Front Panel Connector" +msgstr "Blauer Stecker am Vordereingang" + +msgid "White Front Panel Connector" +msgstr "Weißer Stecker am Vordereingang" + +msgid "Black Front Panel Connector" +msgstr "Schwarzer Stecker am Vordereingang" + +msgid "Gray Front Panel Connector" +msgstr "Grauer Stecker am Vordereingang" + +msgid "Orange Front Panel Connector" +msgstr "Oranger Stecker am Vordereingang" + +msgid "Red Front Panel Connector" +msgstr "Roter Stecker am Vordereingang" + +msgid "Yellow Front Panel Connector" +msgstr "Gelber Stecker am Vordereingang" + +msgid "Spread Output" +msgstr "Ausgabe verstreuen" + +msgid "Downmix" +msgstr "Heruntermischen" + +msgid "Virtual Mixer Input" +msgstr "Eingang des virtuellen Mischpults" + +msgid "Virtual Mixer Output" +msgstr "Ausgang des virtuellen Mischpults" + +msgid "Virtual Mixer Channels" +msgstr "Kanäle des virtuellen Mischpults" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d Function" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s-Funktion" + +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." + +msgid "Playback is not supported by this audio device." +msgstr "Wiedergabe wird von diesem Audio-Gerät nicht unterstützt." + +msgid "Audio playback error." +msgstr "Fehler bei Audio-Wiedergabe." + +msgid "Recording is not supported by this audio device." +msgstr "Aufnahme wird von diesem Audio-Gerät nicht unterstützt." + +msgid "Error recording from audio device." +msgstr "Fehler beim Aufnehmen vom Audio-Gerät." + +msgid "Gain" +msgstr "Pegel" + +msgid "Headphone" +msgstr "Kopfhörer" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Fehler beim Lesen von %d Bytes von Gerät »%s«." + +# »Frame« sollten wir im Zusammenhang mit Videos vielleicht besser so belassen. Habe ich in gnome-subtitles auch so gemacht. +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Unerwartete Frame-Größe von %u anstatt %u wurde erhalten." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Fehler beim Lesen von %d Bytes auf Gerät »%s«." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Fehler beim Bestimmen der Fähigkeiten des Gerätes »%s«: Es ist kein »v4l2«-" +"Treiber. Überprüfen Sie, ob es ein »v4l1«-Treiber ist." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Abfrage der Attribute der Eingabe »%d« im Gerät »%s« schlug fehl" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"Auslesen der Einstellungen der Senderwahl »%d« auf Gerät »%s« schlug fehl." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Abfragen der Norm auf Gerät »%s« schlug fehl." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Abfrage der Kontrollattribute auf Gerät »%s« schlug fehl." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Gerät »%s« kann nicht identifiziert werden." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "»%s« ist kein Gerät." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Gerät »%s« konnte nicht zum Lesen oder Schreiben geöffnet werden." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "»%s« ist kein Aufnahmegerät." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "»%s« ist kein Wiedergabegerät." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Festlegen der Norm auf Gerät »%s« schlug fehl." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Auslesen der aktuellen Sendefrequenz des Geräts »%s« schlug fehl." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Festlegen der aktuellen Sendefrequenz des Geräts »%s« auf %lu Hz schlug fehl." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Auslesen der aktuellen Signalstärke des Geräts »%s« schlug fehl." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Auslesen des Wertes der Einstellung »%d« des Geräts »%s« schlug fehl." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Festlegen des Wertes »%d« der Einstellung »%d« des Geräts »%s« schlug fehl." + +# Sendegerät sicherlich nicht, eben eher ein Radio. Warum diese Fehlermeldung beie einem Radiogerät kommen könnte, weiß ich allerdings auch nicht. +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Auslesen der aktuellen Eingabe auf dem Gerät »%s« schlug fehl. Vielleicht " +"ist es ein Funkgerät." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Festlegen der Eingabe »%d« des Geräts »%s« schlug fehl." + +# Sendegerät sicherlich nicht, eben eher ein Radio. Warum diese Fehlermeldung beie einem Radiogerät kommen könnte, weiß ich allerdings auch nicht. +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Auslesen der aktuellen Ausgabe des Geräts »%s« schlug fehl. Vielleicht ist " +"es ein Funkgerät." + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Festlegen der Ausgabe »%d« des Geräts »%s« schlug fehl." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Auf Gerät »%s« konnten keine Puffer eingereiht werden." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Der Versuch Videobilder von Gerät »%s« auszulesen schlug fehl." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "%d Versuche sind fehlgeschlagen. Gerät »%s«. Systemfehler: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Parameter konnten nicht von Gerät »%s« ausgelesen werden" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Vom Video-Eingabegerät wurde die Einstellung zur Bildwiederholungsrate nicht " +"akzeptiert." + +# »Geholt« ist auch noch nicht optimal, aber »abgebildet« geht auch nicht wirklich. +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Die Puffer des Gerätes »%s« konnten nicht geholt werden." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Der Treiber von Gerät »%s« unterstützt keine der bekannten Aufnahmemethoden." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Ein Wechsel der Auflösung zur Laufzeit wird noch nicht unterstützt." + +# Taktgeber klingt gut. +msgid "Cannot operate without a clock" +msgstr "Es kann nicht ohne einen Taktgeber gearbeitet werden." + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Aufzählen möglicher Videoformate, mit denen Gerät »%s« arbeiten kann, " +#~ "schlug fehl" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "Der Puffertyp wird nicht unterstützt, der Index ist außerhalb seiner " +#~ "Grenzwerte, es sind bisher noch keine Puffer angefordert worden oder " +#~ "»userptr« oder die Länge sind ungültig. Gerät »%s«" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "Der Versuch Videobilder von Gerät »%s« auszulesen schlug fehl. Nicht " +#~ "genug Arbeitsspeicher." + +# Was ist ein Zeigerpuffer? +#, fuzzy +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "Ungenügend Arbeitsspeicher, um einen Zeigerpuffer eines Benutzers " +#~ "einzureihen. Gerät »%s«." + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "Es wurden keine freien Puffer im Vorrat bei Index %d gefunden." + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "Das Gerät »%s« kann nicht bei %dx%d aufnehmen" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "Das angegebene Format kann nicht vom Gerät »%s« ausgelesen werden" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "Die Puffer konnten nicht von Gerät »%s« ausgelesen werden." + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "Es konnten nicht genug Puffer von Gerät »%s« ausgelesen werden." + +# »Stromaufnahme« klingt nach Energieverbrauch. +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Fehler beim Start der Aufzeichnung des Stroms von Gerät »%s«." + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Fehler beim Stoppen der Aufzeichnung des Stroms von Gerät »%s«." + +#~ msgid "Describes the selected input element." +#~ msgstr "Beschreibt das ausgewählte Eingabeelement." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "" +#~ "Beschreibt das ausgewählte Ausgabeelement für Audio/Video-Konferenzen." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "Beschreibt das ausgewählte Ausgabeelement für Musik und Videos." + +#~ msgid "Describes the selected output element." +#~ msgstr "Beschreibt das ausgewählte Ausgabeelement." + +# »sink« hatte ich z.B. in Conduit auch mit Ziel übersetzt. +#~ msgid "GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "Gstreamer-Audioziel für Audio/Video-Konferenzen." + +#~ msgid "GStreamer audiosink for Music and Movies" +#~ msgstr "Gstreamer-Audioziel für Musik und Videos" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer kann Klänge mittels einer beliebigen Anzahl von " +#~ "Ausgabeelementen wiedergeben. Einige mögliche Werte sind osssink, esdsink " +#~ "und alsasink. Das Audioziel kann eine teilweise Weiterleitung anstelle " +#~ "eines Elementes sein." + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer kann Videos mittels einer beliebigen Anzahl von " +#~ "Ausgabeelementen wiedergeben. Einige mögliche Werte sind xvimagesink, " +#~ "ximagesink, sdlvideosink und aasink. Das Videoziel kann eine teilweise " +#~ "Weiterleitung anstelle eines Elementes sein." + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "GStreamer kann Visualisierungs-Plugins in eine Weiterleitung setzen, um " +#~ "Audioströme in Videobilder umzuwandeln. Das Standard-Plugin ist »goom«. " +#~ "Weitere Plugins werden demnächst portiert. Das Visualisierungs-Plugin " +#~ "kann eine teilweise Weiterleitung anstelle eines Elementes sein." + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer kann Klänge mittels einer beliebigen Anzahl von " +#~ "Eingabeelementen aufzeichnen. Einige mögliche Werte sind osssrc, esdsrc " +#~ "und alsasrc. Die Audioquelle kann eine teilweise Weiterleitung anstelle " +#~ "eines Elementes sein." + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer kann Videos mittels einer beliebigen Anzahl von " +#~ "Eingabeelementen aufzeichnen. Einige mögliche Werte sind v4lsrc und " +#~ "videotestsrc. Die Videoquelle kann eine teilweise Weiterleitung anstelle " +#~ "eines Elementes sein." + +#~ msgid "default GStreamer audio source" +#~ msgstr "Vorgegebene GStreamer-Audioquelle" + +#~ msgid "default GStreamer audiosink" +#~ msgstr "Vorgegebenes GStreamer-Audioziel" + +#~ msgid "default GStreamer video source" +#~ msgstr "Vorgegebene GStreamer-Videoquelle" + +#~ msgid "default GStreamer videosink" +#~ msgstr "Vorgegebenes GStreamer-Videoziel" + +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "Vorgegebenes GStreamer-Visualisierungs-Plugin" + +#~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "Beschreibung der GStreamer-Audioquelle für Audio/Video-Konferenzen" + +#~ msgid "description for GStreamer audiosink for Music and Movies" +#~ msgstr "Beschreibung der GStreamer-Audioquelle für Musik und Videos" + +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "Beschreibung des vorgegebenen GStreamer-Audioziels" + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "Beschreibung der vorgegebenen GStreamer-Audioquelle" diff --git a/po/el.gmo b/po/el.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9d51ab277f9a909f483d2a34a90e75458eb72872 GIT binary patch literal 19693 zcmd6td5~RIoyV_iN)&Jb!3{2>Aqk{A-JJ;75GG^~q)nR+VRd=k?{@biuitIolF+y% zWXA*zF`^+tfVd1K-P42+vOrL0YDTQOJ*8EQGi6ya`p1aWl$N8;lv>W`d(OG<-S=KE ziJ;C)PJiz?_uO-S`}v)7?~mSk#x9TFamu?XzdzISeh2>Wjr`&F&*ypGx!`v|HT?j5 z6Zli`Z19)h8^GUzlfX0H?0GkU=YeX!4OG7_SMPK6)!D9RlA4{v#-QUIO0<{sQE`_r|w)-f7^wLGf`3crkb_sCjM&MRzAS3k*Sxw-1~K zKJV~lu#x)tZ}q$>;5_g$a20qJct7|V@C8uM-S9TgTL~7ykAvR@Zw6#?hi6`B`Mw%lMEeTxN^lR@41OOJ|7TugpPL1W?jBI|J_s6lfpe(8?Aot* zhvlOkd_V0)P|rOMN}oRhF)i;WAf$Ld0}+)`BBJrmN11A$2CDxYP;@K+rSBrhe{Vg1 zWDgI4(%&Gc{x5)%#|UWT1xlVTx%;oU`@aN5$Nz%r_eW52KAXWH$-4m5xHI^pac>0A z0o%dT!Hp;=B z36vk*3u^xDAYHwOK+Sgy)cD^7HSPV|95x)$Dri3PjZ2X&Ari?*V6k z(?Rin2dMFTK+)X?O0IcO^9+E}!$zpyvHGcnSDN&<8J}f{S=_ zK#ji=lw5BICBIdm=qiAk=N?e=e;yQl4}co~QBeJ!07dUnQ1d+x&IexrMc;Y8jURKs zR_eXr<=|sr0~opb??KT&iHW$$>TOq^Ynu2!B2vk z&zo%Ny#Q4G5?7xE5+c3pK#lhyuo3J8CC?ooqVo2D;{P}(zFq`H$D1#+@pdXWjrzyH z)4+Sd72tNT4g3#Ke$zC?+V^bmv($^=GEhPBCZHW`2fqg10{#}vsGY%=gGa%g;5jJi z9OUu{sCYhf1v&*UosKNQSHSOpKR}6k{!y6vCitcqp7$v*0`=U|Cc6$k2QHv~Ho;Z; zS_a|@UNwCYF13Rjz{_SaH~0iN z2>uVa7W_IvS@cdN2z(5@AG{O%mBWu*W!t|4_R@a&)pop{UsDA$jYQEosn*WSBtWDshU^Di+7JQldlh@mRUzuy;^y8rX zXb{xA!ysL}?}KjuFPLZfzS!Z_;OVq42Sv|HP|w`~UIKm^lzbloF){Bc@V(&6pzQVB z`Ii4)P<(s>)I6I&V>h7qc?f(5cpQ|Sz3AGfF0gj65R@D@fM*_|w;J3BejI$)4L0B04!({0w;a9*N^UQMqC-rGzH`8J;52YL_=LkB zfR|H0bE)m$1d5N@;0M5)LCJ9kI2#-SUk74#-eZ)#6#Z_qV8+_SHPhGq^0Yib`Ix)& z_n=}-59JZpCU_?W@tM8DMQY$jxG?MWS*BL`vztpqVs!Eia1BNJ*KY?!vgo8dNYQUU zWtfto5Nb^f5WkMkdzvDfkAF9DF~?Q9z!YVQtKSUa5uAG_z*aq@^y-SpS0j@2NzJDq->?gmi603`8?$iWius9X{E?l3zYch zy9?R)HST%(XX9?xqI7G;nz*+p!8Bsr|7rEg7IB<>3zXn$X{o;>(7FB zQYN|jJ>Wy``Wf(S%5uso*Cv=t`6A^UN*_f(`J{eLl-E-}qYA%kDYu&|>z70BI)*eC zODSKbe2r3~yoI7)Gvx}(GRjoS2FjI`1C)Cy`zW8FTu~~F=4N$s zo}D?&yZXX>m@E42sa%k)x>pKnt7G&mWwOPFOwRA<4^pcT(7gHHyi_h17X3^bk!89E z{B*E7(-jy=HpVx@{ve+!2L75%u{SIg{glMhwaRm1w&2h3m$HV1+$EXX^Mc8eOdYNYK zFids~6pBG#teLV_YW1~KWp7^IRH>T+fWHlvu9W$q}l3t{c>hI5H zx>7QuQyKOz&a!`NSn|_hZb}h_tqy!VrY}=4636b0z7$=omM7*UA9RKJ^hs&G()HER zkT7IlR+tY`A^=UK{WbYav4$Aq-Z1LoWe%5U^qe+LICh>+tVs1239)6~N9{yd=_j(p z@|mAW_2dYInJ#aBrYBQOWffH8OT|%l-OyaVYAIjM^yY_aa=4MVz{GgGR^*G4RA(j& zFG0cZnBck9UqTctNP#JT^{i}*pU!7+nnr(KZ$K>0bo&`~uy>o|yKaV9SS(PT14WHq zB0tlY>IvfExTk=~0-7g45Raw8nsNNL)BwI+ z7G6H3_0I}^jB$!Avw0W~2=}?Jfm%(K1>mMHIPEI3nI{oR4G}dH6*4_JEUHk1?4Dxp zL=&t|Wm$FP6LCx)cLu1=6TlLZ#dM5lc&xH!RkQ*h_L*Fm?;D47+o_OPnW`*0!6YIn zYh?myYNef=E%}S@PRdmSlxeOA6Wgkp#gHt~BwVSskCh+HpQH%$19DcU-PL3!A;v&_ z8O^H}rpT5|wqyUg>}WB;tG_qQ1(<#!XsG39q>!!S^x?avK@eorZ1ELDS&q%H`|23jo4v;bL4!?0heFBfaPHq;m7y|y5o zDfM{?saG!j=0v;SlC0QVInmYVDp4oF$&>TLy(S@uF-Mro6v?O^DhD!M!d&P}N^Jx~ z?}MR#)AFUPZDc)MW8Rq@R-BRlD#n?3Jl(&3O-3;Cl~_82XRAhS$DU$EaxqQv!3K`#Wjp>@XM3}dRUY-Xf7mtqvZB^Z62ke#cP+F zv#D_xA@WraJlz?eRXW9cdT5a@8d-6;Z{>aP>;uo)6O{yB%GwbQj4vVp?P81@v(MKq-)tpJpDwbd6#jsmOfR;WFwaW)-I;u$NCKC56nk(H#N^#wc5{xaiz@AuE3?owlj{om z`m^jsPp-EOVM^%77&y*<6S8H>d;p`~N@X=>fiYK#-Yc~>+rKh8Q*{y2jgTf}%BoUb zT^z&^>(;on)0`(@iFRADGLtWsh#V$RlW@a!kS#D^ve~X@)osqER&vtN7kD@KW)MZi zQEYv5SGhGX@wU?0HH_XHN52z$XjqbNfO|#MR==lEY_MUq(9jcxX}_tlxv8<`{f#px zEe{mE8`=sznRLV4Qcs~_McC^17K{C@GiG#_dhTYmNHwyOY=};bY#dn^ z9gK#eVKzqczA z8d*QGnHknchfUjF_2sFfv~7tF`5J(U>9vVxk449+L{CLW=&)gAyNL6nL7(AG<8XA8 zr;kJTdMF=c9u37~Vr9LCdk*?GF(d;-`+Yhc*4W!=c`7<2DjL0Lm#AVKreOqgXqh;% zOxzYDy4~WAF|~Zu-}a&{OsnBse=mA0$<44h99c_Q7Y#=TN46qtL;B#zW-;hRd$_wF zl7=;Uwan-;48w<`V*i>1>^pvR9E~A$BeNrne_~|2uNk>K z6dkkEBf|O-=~Ul7@p$mSTwA3}lqi&vQQ>jsI|!$nXrw`>tcYg z2c>qnq!~_Srs8%eIxHm`#iAUhk!c-8wHu90Wuj=<4SIsr`S^S9yBLMXFfKR7m{KEp^j9Z79hT5|- zd&7lkIBHmTmTPQ&KeWIg7L8|EORpkZ!(iLU&RT>~^I`E3J&jx>R`|zr;0BFUq%)?- ztNg`iP4u2H+7TI$lW;;W+7T;_@fAe~0SBZdqafK8o{6iiGY%=$yOUsv$~kC4i|(X7 z*5PYJWtS20fV+70soLe*+wH0DYMG7UA(Q8w4wtKN;wB5 zU&4;@43}-AkmtCb^%-FUD_D!5P!6*l1KC$IilP4Q=;waC!*(qIt`M4WQ z(VUP&JUD2DXQoiAEQgR!e8%C%6zE@#rf7!=LM9}cB}c*D1tP6c^=}VO#wX26YU3N6 zDPUNaK-!2$(d)!`cKa%&VeGPQVfu5*f2eyuXB@7`HUB^RH_tv7a80u|gD)9`)EvjdctozE2^; zHY&?A`qv`)z;)SB`SMM@=!gMU_2ubJupzpQL_Z1z(!-NBGbtV7EE5~Mc-hOO^yTB4FxZ|>0p;o zclSVL2T^rzWE;oE$)RXysco34F>v@yl(qa*MU*w>Q+ZtJI7zw5@9|m2q_z-|QHLHd>#2aNXFYg)aIl-W|8-r4|U=9-MJ<9n@;5O%`9GDE?pgo=>`#7W!Dm?k_&w|GD<7m68V)5lFgc;4GO}?4E4?gPa!(g4|xg?-_K&m z(VBc_t4UQ@8D$!WwZuas2iO$7*uhA=XyQ|9e<~lZutnIF+^W?05B9{+&YdL5@=mDg zj&?1Hj@q*%tL#{k)mlmKz_j%0Kw)4LJm3t--K;kWKBU&2JZjc8da%uD<0W5^hlM?8 zNy!=+vnn-SIZ6{B)ztUn#ZTP}83b-d6KQ6bWrUmXVyt|$9(&P?PX0%~3%$^4Gv<5T zhdI&1(K8q+UgnWYx}4f-)hv!i9#Xj(Sewc{+|_%Bq~|c7*&2G$V_Y0$92V5_5vyXZ zg5@)^8g^uSk)vmfH& zI@BR!<#~p8$GcC`e4sqDdK+3fVm2`aPms>#YfmEvy*n}i$IM{1lJUzOL{OJ$n*&5` z0>rQOLql-}uHG)c=LMwvSu!+E&6Mknsi_7XEJX5nX4e}J^Y%vivoBRD`v5U)U+!?? zrSws$KGT|%TdCuaCQt}gG-nE4187t`!8S{vxo5sn(iKs?{B_Y^N@8%!T4X6TEWovS zM`&aO0|%W(iT*ShLn^<&m8g=Ol&SX(Pdw|k8+zr+M7#s$!h9WtM0s6gBBFWOrfk)` z6^_4=iuNK9`<6pSa!l)6?XojLj|rEaXp_Jo_#z%JvJR@5bVH0PvHS({zrw~^TqcX>X;)NB0_4T#jqiRU#-)$WK zD3&`~rZe8%i8W)_Sd;eo=G(Ny7ix8z27K=*{}k`yO_$sc&gBif&X-SBy|p#Rn-ANg z_?jbB8G}76t%Pj%Bg31y1J~bqFWK61qS7tXWklA189kP4hXe<|@NHjxk z$<*g3?y$A&=JdC#s(jd3z<#X6#FFxB$*N(U$+?vl?V9()P=ZmHN5!M>gE4Ji6|`g= z^wd%P*drqmn~}#u8WCx+)(TS|!mo;e+QXK=jo|IHg0qQ$YZ1kL(vkTP%1Ez@jaYCJ zk0_VF*gS`X)1(zPH+EmVXuZv%};txc&-4PV8KMzJ#C`tg-VE0N-C(S6|)AKfc#3}Gb0{#3p;)a~2G z@0?6S#MU_DZZXnw8;1w+8|i~Rc})&B)*WN_@, 2009. +# Michael Kotsarinis , 2010 +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.25.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-10-27 12:16+0200\n" +"Last-Translator: Michael Kotsarinis \n" +"Language-Team: Greek \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not establish connection to sound server" +msgstr "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή ήχου" + +msgid "Failed to query sound server capabilities" +msgstr "Αποτυχία αναζήτησης των δυνατοτήτων του διακομιστή ήχου" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' από '%s'" + +msgid "Internal data stream error." +msgstr "Εσωτερικό σφάλμα ροής δεδομένων." + +msgid "Failed to decode JPEG image" +msgstr "Αποτυχία αποκωδικοποίησης της εικόνας JPEG" + +msgid "Could not connect to server" +msgstr "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή" + +msgid "Server does not support seeking." +msgstr "Ο διακομιστής δεν υποστηρίζει αναζήτηση." + +msgid "Could not resolve server name." +msgstr "Δεν ήταν δυνατός ο προσδιορισμός του ονόματος του διακομιστή." + +msgid "Could not establish connection to server." +msgstr "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή." + +msgid "Secure connection setup failed." +msgstr "Αποτυχία εκκίνησης ασφαλούς σύνδεσης." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Προέκυψε ένα σφάλμα δικτύου ή ο διακομιστής έκλεισε ξαφνικά τη σύνδεση." + +msgid "Server sent bad data." +msgstr "Ο διακομιστής έστειλε λάθος δεδομένα." + +msgid "No URL set." +msgstr "Δεν ορίσθηκε URL." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Καμία ή άκυρη εισαγωγή ήχου, η AVI ροή θα καταρρεύσει." + +msgid "This file contains no playable streams." +msgstr "Αυτό το αρχείο δεν περιέχει αναπαραγώγιμες ροές." + +msgid "This file is invalid and cannot be played." +msgstr "Το αρχείο αυτό δεν είναι έγκυρο και δεν μπορεί να αναπαραχθεί." + +msgid "This file is corrupt and cannot be played." +msgstr "Το αρχείο αυτό είναι κατεστραμμένο και δεν μπορεί να αναπαραχθεί. " + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Το αρχείο αυτό είναι ανολοκλήρωτο και δεν μπορεί να αναπαραχθεί." + +msgid "The video in this file might not play correctly." +msgstr "Το βίντεο σε αυτό το αρχείο μπορεί να μην αναπαραχθεί σωστά." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Αυτό το αρχείο περιέχει πολλές ροές. Αναπαράγεται μόνο η πρώτη %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Δεν βρέθηκε καμία υποστηριζόμενη ροή. Είναι πιθανόν να πρέπει να κάνετε " +"εγκατάσταση ένα πρόσθετο GStreamer RTSP για τις ροές Real μέσων. " + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Δεν βρέθηκε καμία υποστηριζόμενη ροή. Είναι πιθανόν να χρειασθεί να " +"επιτρέψετε περισσότερα πρωτόκολλα μεταγωγής ή αλλιώς να σας λείπει το σωστό " +"πρόσθετο RTSP του GStreamer." + +msgid "Internal data flow error." +msgstr "Εσωτερικό σφάλμα ροής δεδομένων." + +msgid "Volume" +msgstr "Ένταση" + +msgid "Bass" +msgstr "Μπάσα" + +msgid "Treble" +msgstr "Πρίμα (treble)" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Μεγάφωνο" + +msgid "Line-in" +msgstr "Γραμμή-εισόδου" + +msgid "Microphone" +msgstr "Μικρόφωνο" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Μείκτης" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Εγγραφή" + +msgid "In-gain" +msgstr "Κέρδος εισόδου" + +msgid "Out-gain" +msgstr "Κέρδος εξόδου" + +msgid "Line-1" +msgstr "Γραμμή-1" + +msgid "Line-2" +msgstr "Γραμμή-2" + +msgid "Line-3" +msgstr "Γραμμή-3" + +msgid "Digital-1" +msgstr "Ψηφιακό-1" + +msgid "Digital-2" +msgstr "Ψηφιακό-2" + +msgid "Digital-3" +msgstr "Ψηφιακό-3" + +msgid "Phone-in" +msgstr "Είσοδος τηλεφώνου" + +msgid "Phone-out" +msgstr "Έξοδος τηλεφώνου" + +msgid "Video" +msgstr "Βίντεο" + +msgid "Radio" +msgstr "Ράδιο" + +msgid "Monitor" +msgstr "Οθόνη" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Η συσκευή " +"χρησιμοποιείται από μια άλλη εφαρμογή." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Δεν έχετε τα " +"δικαιώματα να ανοίξετε την συσκευή." + +msgid "Could not open audio device for playback." +msgstr "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. " + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για εγγραφή. Δεν έχετε τα " +"δικαιώματα να ανοίξετε την συσκευή." + +msgid "Could not open audio device for recording." +msgstr "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για εγγραφή. " + +msgid "Could not open audio device for mixer control handling." +msgstr "" +"Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για χειρισμό του ελέγχου του " +"μίκτη. " + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για χειρισμό του ελέγχου του " +"μίκτη. Αυτή η έκδοση του Open Sound System δεν υποστηρίζεται από αυτό οτ " +"στοιχείο." + +msgid "Master" +msgstr "Γενικός (Master)" + +msgid "Front" +msgstr "Μπροστά" + +msgid "Rear" +msgstr "Πίσω" + +msgid "Headphones" +msgstr "Ακουστικά" + +msgid "Center" +msgstr "Κέντρο" + +msgid "LFE" +msgstr "Χαμηλών συχνοτήτων (LFE)" + +msgid "Surround" +msgstr "Περιβάλλων (Surround)" + +msgid "Side" +msgstr "Πλευρικό" + +msgid "Built-in Speaker" +msgstr "Ενσωματωμένο μεγάφωνο" + +msgid "AUX 1 Out" +msgstr "AUX 1 Out" + +msgid "AUX 2 Out" +msgstr "AUX 2 Out" + +msgid "AUX Out" +msgstr "Έξοδος AUX" + +msgid "3D Depth" +msgstr "Βάθος 3D" + +msgid "3D Center" +msgstr "Κέντρο 3D" + +msgid "3D Enhance" +msgstr "Ενίσχυση 3D" + +msgid "Telephone" +msgstr "Τηλέφωνο" + +msgid "Line Out" +msgstr "Γραμμή εξόδου" + +msgid "Line In" +msgstr "Είσοδος γραμμής" + +msgid "Internal CD" +msgstr "Εσωτερικό CD" + +msgid "Video In" +msgstr "Είσοδος βίντεο" + +msgid "AUX 1 In" +msgstr "Είσοδις AUX 1" + +msgid "AUX 2 In" +msgstr "Είσοδος AUX 2" + +msgid "AUX In" +msgstr "Είσοδος AUX" + +msgid "Record Gain" +msgstr "Κέρδος Εγγραφής" + +msgid "Output Gain" +msgstr "Κέρδος εξόδου" + +msgid "Microphone Boost" +msgstr "Ενίσχυση μικροφώνου" + +msgid "Loopback" +msgstr "Ανατροφοδότηση" + +msgid "Diagnostic" +msgstr "Διαγνωστικό" + +msgid "Bass Boost" +msgstr "Ενίσχυση χαμηλών" + +msgid "Playback Ports" +msgstr "Θύρες Αναπαραγωγής" + +msgid "Input" +msgstr "Είσοδος" + +msgid "Record Source" +msgstr "Πηγή εγγραφής" + +msgid "Monitor Source" +msgstr "Παρακολούθηση πηγής" + +msgid "Keyboard Beep" +msgstr "Ήχος πληκτρολογίου" + +msgid "Simulate Stereo" +msgstr "Προσομοίωση στέρεο" + +msgid "Stereo" +msgstr "Στέρεο" + +msgid "Surround Sound" +msgstr "Ήχος Surround" + +msgid "Microphone Gain" +msgstr "Κέρδος μικροφώνου" + +msgid "Speaker Source" +msgstr "Πηγή μεγαφώνου" + +msgid "Microphone Source" +msgstr "Πηγή μικροφώνου" + +msgid "Jack" +msgstr "Βύσμα" + +msgid "Center / LFE" +msgstr "Κεντρικό / Χαμηλών συχνοτήτων" + +msgid "Stereo Mix" +msgstr "Στερεοφωνική μίξη" + +msgid "Mono Mix" +msgstr "Μονοφωνική μίξη" + +msgid "Input Mix" +msgstr "Μίξη εισόδου" + +msgid "SPDIF In" +msgstr "Είσδος SPDIF" + +msgid "SPDIF Out" +msgstr "SPDIF Out" + +msgid "Microphone 1" +msgstr "Μικρόφωνο 1" + +msgid "Microphone 2" +msgstr "Μικρόφωνο 2" + +msgid "Digital Out" +msgstr "Ψηφιακή έξοδος" + +msgid "Digital In" +msgstr "Ψηφιακή είσοδος" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Τηλεφωνική συσκευή" + +msgid "Other" +msgstr "Άλλο" + +msgid "None" +msgstr "Κανένα" + +msgid "On" +msgstr "On" + +msgid "Off" +msgstr "Off" + +msgid "Mute" +msgstr "Σίγαση" + +msgid "Fast" +msgstr "Γρήγορα" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Πολύ χαμηλή" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Χαμηλή" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Μεσαία" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Υψηλή" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Πολύ υψηλή" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Παραγωγής" + +msgid "Front Panel Microphone" +msgstr "Μικρόφωνο μπροστινού πάνελ" + +msgid "Front Panel Line In" +msgstr "Είσοδος γραμμής μπροστινού πάνελ" + +msgid "Front Panel Headphones" +msgstr "Ακουστικά μπροστινού πάνελ" + +msgid "Front Panel Line Out" +msgstr "Έξοδος γραμμής μπροστινού πάνελ" + +msgid "Green Connector" +msgstr "Πράσινη υποδοχή" + +msgid "Pink Connector" +msgstr "Ροζ υποδοχή" + +msgid "Blue Connector" +msgstr "Μπλε υποδοχή" + +msgid "White Connector" +msgstr "Λευκή υποδοχή" + +msgid "Black Connector" +msgstr "Μαύρη υποδοχή" + +msgid "Gray Connector" +msgstr "Γκρι υποδοχή" + +msgid "Orange Connector" +msgstr "Πορτοκαλί υποδοχή" + +msgid "Red Connector" +msgstr "Κόκκινη υποδοχή" + +msgid "Yellow Connector" +msgstr "Κίτρινη υποδοχή" + +msgid "Green Front Panel Connector" +msgstr "Πράσινη υποδοχή μπροστινού πάνελ" + +msgid "Pink Front Panel Connector" +msgstr "Ροζ υποδοχή μπροστινού πάνελ" + +msgid "Blue Front Panel Connector" +msgstr "Μπλε υποδοχή μπροστινού πάνελ" + +msgid "White Front Panel Connector" +msgstr "Λευκή υποδοχή μπροστινού πάνελ" + +msgid "Black Front Panel Connector" +msgstr "Μαύρη υποδοχή μπροστινού πάνελ" + +msgid "Gray Front Panel Connector" +msgstr "Γκρι υποδοχή μπροστινού πάνελ" + +msgid "Orange Front Panel Connector" +msgstr "Πορτοκαλί υποδοχή μπροστινού πάνελ" + +msgid "Red Front Panel Connector" +msgstr "Κόκκινη υποδοχή μπροστινού πάνελ" + +msgid "Yellow Front Panel Connector" +msgstr "Κίτρινη υποδοχή μπροστινού πάνελ" + +msgid "Spread Output" +msgstr "Ευρεία έξοδος" + +msgid "Downmix" +msgstr "Μίξη συγχώνευσης (Downmix)" + +msgid "Virtual Mixer Input" +msgstr "Είσοδος εικονικού μίκτη" + +msgid "Virtual Mixer Output" +msgstr "Έξοδος εικονικού μίκτη" + +msgid "Virtual Mixer Channels" +msgstr "Κανάλια εικονικού μίκτη" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Λειτουργία %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Λειτουργία %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Αυτή η έκδοση " +"του Open Sound System δεν υποστηρίζεται από αυτό το στοιχείο." + +msgid "Playback is not supported by this audio device." +msgstr "Αυτή η συσκευή ήχου δεν υποστηρίζει αναπαραγωγή." + +msgid "Audio playback error." +msgstr "Σφάλμα αναπαραγωγής ήχου" + +msgid "Recording is not supported by this audio device." +msgstr "Αυτή η συσκευή ήχου δεν υποστηρίζει εγγραφή." + +msgid "Error recording from audio device." +msgstr "Σφάλμα κατά την εγγραφή από τη συσκευή ήχου." + +msgid "Gain" +msgstr "Κέρδος" + +msgid "Headphone" +msgstr "Ακουστικό" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Σφάλμα κατά την ανάγνωση %d bytes απο την συσκευή '%s'." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Απροσδόκητο μέγεθος πλαισίου από %u αντί του %u" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Σφάλμα κατά την ανάγνωση %d bytes στην συσκευή '%s'." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Σφάλμα κατά τη λήψη δυνατοτήτων της συσκευής '%s': Δεν είναι οδηγός v4l2. " +"Ελέγξτε αν είναι οδηγός v4l2." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Αποτυχία ανίχνευσης ιδιοτήτων της εισόδου %d στη συσκευή %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Αποτυχία ανάγνωσης των ρυθμίσεων δέκτη %d στην συσκευή '%s'." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Αποτυχία ανίχνευσης κανονικοποίησης στη συσκευή '%s'." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" +"Αποτυχία κατά την ανάγνωση των χαρακτηριστικών ελέγχου στην συσκευή '%s'." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Δεν ήταν δυνατή η ταυτοποίηση της συσκευής '%s'." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Αυτή δεν είναι μια συκευή '%s'." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "" +"Δεν ήταν δυνατό το άνοιγμα της συσκευής '%s' για ανάγνωση και γράψιμο. " + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Η συσκευή '%s' δεν είναι μια συσκευή λήψης." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Η συσκευή '%s' δεν είναι συσκευή εξόδου." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Αποτυχία ρύθμισης κανόνα για την συσκευή '%s'." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Αποτυχία ανάγνωσης της τρέχουσας συχνότητας δέκτη για την συσκευή '%s'." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Αποτυχία ρύθμισης τρέχουσας συχνότητας δέκτη για την συσκευή '%s' στα %lu Hz" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Αποτυχία ανάγνωσης ισχύς σήματος για την συσκευή '%s'." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Αποτυχία ανάγνωσης τιμής για τον έλεγχο %d στην συσκευή '%s'." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Αποτυχία ρύθμισης τιμής %d για τον έλεγχο %d στην συσκευή '%s'." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Αποτυχία ανάγνωσης της τρέχουσας εισαγωγής στην συσκευή '%s'. Πιθανόν να " +"είναι μια συσκευή ράδιο" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Αποτυχία ρύθμισης εισαγωγής %d στην συσκευή %s." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Αποτυχία ανάγνωσης της τρέχουσας εισαγωγής στην συσκευή '%s'. Πιθανόν να " +"είναι μια συσκευή ράδιο" + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Αποτυχία ρύθμισης εισαγωγής %d στην συσκευή %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Αδυναμία θέσης σε σειρά των buffer στη συσκευή '%s'." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Αποτυχία ανάγνωσης πλαισίων βίντεο από την συσκευή '%s'." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Αποτυχία έπειτα από %d προσπάθειες. συσκευή %s. σφάλμα συστήματος: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Δεν ήταν δυνατή η ανάγνωση των παραμέτρων στην συσκευή '%s'" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Η συσκευή εισόδου βίντεο δεν αποδέχθηκε τη νέα ρύθμιση ταχύτητας καρέ." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Αδυναμία χαρτογράφησης buffer για τη συσκευή '%s'" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Ο οδηγός της συσκευής '%s' δεν υποστηρίζει κάποια γνωστή μέθοδο λήψης." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" +"Η αλλαγή της ανάλυσης κατά τη διάρκεια λειτουργίας δεν υποστηρίζεται ακόμα." + +msgid "Cannot operate without a clock" +msgstr "Δεν είναι δυνατή η λειτουργία χωρίς ρολόι " + +#~ msgid "Describes the selected input element." +#~ msgstr "Περιγράφει το επιλεγμένο στοιχείο εισαγωγής." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "" +#~ "Περιγράφει το επιλεγμένο στοιχείο εξόδου για το Audio/Video Conferencing." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "Περιγράφει το επιλεγμένο στοιχείο εξόδου για μουσική και ταινίες." + +#~ msgid "Describes the selected output element." +#~ msgstr "Περιγράφει το επιλεγμένο στοιχείο εξαγωγής." diff --git a/po/en@boldquot.header b/po/en@boldquot.header new file mode 100644 index 0000000..fedb6a0 --- /dev/null +++ b/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/po/en@quot.header b/po/en@quot.header new file mode 100644 index 0000000..a9647fc --- /dev/null +++ b/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/po/en_GB.gmo b/po/en_GB.gmo new file mode 100644 index 0000000000000000000000000000000000000000..404c65e832fd6c681f05808d236601de8c6fd815 GIT binary patch literal 1461 zcmd^-yKfXR5XQ}$9IxUM~;?Ei_0J z2pU9zL_vXQsVHd>)O1MHlu#iGzR8*7k6^T)f8+6-XJ&7|ZCm|}!S+K3pkL5o=<^CJ zu)vXk62KOeFEv;FM(eJ zzk_t|50L8o4E!Cq0?pC+dXVNC1gYQsA$|~~xsHO=|8)?hnFjH&UWgYU)xRI&4?(K; z7^M53hWLvRe--v`!u}mdf7xDW4@9=P54I(c>QfEsb2~H$(d_%6oe)M^?1}2`f;K^0 zp?|g!&hD_G?}cm|MDvhsfT-7hwu78eSrlw+oQ>;Ldzp#)k{2&|Lu}HBRBFSfv{6V| zMBK+vA2@92wzGNH8U^>Ra;#yE_SUh>mRrZQxh*r@0rS#xS$4EN&d<+J^1?eMd;E^h zGTu_WZJjG~UuDy!?^m4}YcNQ}Y=&+ZsMU9D>DjErMQm2#XB{?|D|ri*=N63bvZhn5 zOtE?0QI^fytn4W^HRwJCU19j?|ZvnsdFi$;;^ju6pP>f5j5*|nOSVXai>pY5*dUPy; zAyLe#+nNe5ct%o?u@x>(3Dj#qbmEzj^3oaXJWbcOOGSDP2a@Nyn?dqX)fVcNE%O`7oGmiCqZ H?i>3Hm-sb0 literal 0 HcmV?d00001 diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..e3eae96 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,747 @@ +# English (British) translation. +# Copyright (C) 2004 Free Software Foundation, Inc. +# Gareth Owen , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins 0.8.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2004-04-26 10:41-0400\n" +"Last-Translator: Gareth Owen \n" +"Language-Team: English (British) \n" +"Language: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +msgid "Internal data stream error." +msgstr "" + +msgid "Failed to decode JPEG image" +msgstr "" + +#, fuzzy +msgid "Could not connect to server" +msgstr "Could not close control device \"%s\"." + +#, fuzzy +msgid "Server does not support seeking." +msgstr "Your oss device could not be probed correctly" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "Could not close control device \"%s\"." + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "Could not close control device \"%s\"." + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "No or invalid input audio, AVI stream will be corrupt." + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +msgid "Internal data flow error." +msgstr "" + +msgid "Volume" +msgstr "Volume" + +msgid "Bass" +msgstr "Bass" + +msgid "Treble" +msgstr "Treble" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Speaker" + +msgid "Line-in" +msgstr "Line-in" + +msgid "Microphone" +msgstr "Microphone" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mixer" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Record" + +msgid "In-gain" +msgstr "In-gain" + +msgid "Out-gain" +msgstr "Out-gain" + +msgid "Line-1" +msgstr "Line-1" + +msgid "Line-2" +msgstr "Line-2" + +msgid "Line-3" +msgstr "Line-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +msgid "Phone-in" +msgstr "Phone-in" + +msgid "Phone-out" +msgstr "Phone-out" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +#, fuzzy +msgid "Could not open audio device for playback." +msgstr "Could not open audio device \"%s\" for writing." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +#, fuzzy +msgid "Could not open audio device for recording." +msgstr "Could not open CD device for reading." + +#, fuzzy +msgid "Could not open audio device for mixer control handling." +msgstr "Could not open audio device \"%s\" for writing." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" + +msgid "Master" +msgstr "" + +msgid "Front" +msgstr "" + +#, fuzzy +msgid "Rear" +msgstr "Record" + +msgid "Headphones" +msgstr "" + +msgid "Center" +msgstr "" + +msgid "LFE" +msgstr "" + +msgid "Surround" +msgstr "" + +#, fuzzy +msgid "Side" +msgstr "Video" + +#, fuzzy +msgid "Built-in Speaker" +msgstr "Speaker" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "" + +msgid "3D Depth" +msgstr "" + +msgid "3D Center" +msgstr "" + +msgid "3D Enhance" +msgstr "" + +msgid "Telephone" +msgstr "" + +msgid "Line Out" +msgstr "" + +#, fuzzy +msgid "Line In" +msgstr "Line-in" + +msgid "Internal CD" +msgstr "" + +#, fuzzy +msgid "Video In" +msgstr "Video" + +msgid "AUX 1 In" +msgstr "" + +msgid "AUX 2 In" +msgstr "" + +msgid "AUX In" +msgstr "" + +#, fuzzy +msgid "Record Gain" +msgstr "Record" + +#, fuzzy +msgid "Output Gain" +msgstr "Out-gain" + +#, fuzzy +msgid "Microphone Boost" +msgstr "Microphone" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "" + +#, fuzzy +msgid "Record Source" +msgstr "Record" + +#, fuzzy +msgid "Monitor Source" +msgstr "Monitor" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "" + +msgid "Surround Sound" +msgstr "" + +#, fuzzy +msgid "Microphone Gain" +msgstr "Microphone" + +#, fuzzy +msgid "Speaker Source" +msgstr "Speaker" + +#, fuzzy +msgid "Microphone Source" +msgstr "Microphone" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "" + +msgid "Stereo Mix" +msgstr "" + +msgid "Mono Mix" +msgstr "" + +msgid "Input Mix" +msgstr "" + +msgid "SPDIF In" +msgstr "" + +msgid "SPDIF Out" +msgstr "" + +#, fuzzy +msgid "Microphone 1" +msgstr "Microphone" + +#, fuzzy +msgid "Microphone 2" +msgstr "Microphone" + +#, fuzzy +msgid "Digital Out" +msgstr "Digital-1" + +#, fuzzy +msgid "Digital In" +msgstr "Digital-1" + +msgid "HDMI" +msgstr "" + +msgid "Modem" +msgstr "" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "" + +msgid "None" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Off" +msgstr "" + +msgid "Mute" +msgstr "" + +msgid "Fast" +msgstr "" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "" + +#, fuzzy +msgid "Front Panel Microphone" +msgstr "Microphone" + +msgid "Front Panel Line In" +msgstr "" + +msgid "Front Panel Headphones" +msgstr "" + +msgid "Front Panel Line Out" +msgstr "" + +msgid "Green Connector" +msgstr "" + +msgid "Pink Connector" +msgstr "" + +msgid "Blue Connector" +msgstr "" + +msgid "White Connector" +msgstr "" + +msgid "Black Connector" +msgstr "" + +msgid "Gray Connector" +msgstr "" + +msgid "Orange Connector" +msgstr "" + +msgid "Red Connector" +msgstr "" + +msgid "Yellow Connector" +msgstr "" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +msgid "Virtual Mixer Input" +msgstr "" + +msgid "Virtual Mixer Output" +msgstr "" + +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" + +msgid "Playback is not supported by this audio device." +msgstr "" + +msgid "Audio playback error." +msgstr "" + +msgid "Recording is not supported by this audio device." +msgstr "" + +msgid "Error recording from audio device." +msgstr "" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "" + +#, fuzzy, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Could not get buffers from device \"%s\"." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Could not get enough buffers from device \"%s\"." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Cannot identify device '%s'." +msgstr "Could not write to device \"%s\"." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Could not open device \"%s\" for reading and writing." + +#, fuzzy, c-format +msgid "Device '%s' is not a capture device." +msgstr "Device \"%s\" is not a capture device." + +#, fuzzy, c-format +msgid "Device '%s' is not a output device." +msgstr "Device \"%s\" is not a capture device." + +#, fuzzy, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Could not get buffers from device \"%s\"." + +#, fuzzy, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Could not get enough buffers from device \"%s\"." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Could not close control device \"%s\"." + +#, fuzzy, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Could not close control device \"%s\"." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to set input %d on device %s." +msgstr "Could not close audio device \"%s\"." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "Could not get enough buffers from device \"%s\"." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Could not close audio device \"%s\"." + +#, fuzzy, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Could not get buffers from device \"%s\"." + +#, fuzzy, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Could not get enough buffers from device \"%s\"." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, fuzzy, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Could not get buffers from device \"%s\"." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, fuzzy, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Could not get buffers from device \"%s\"." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "" + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "Could not open file \"%s\" for writing." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Error closing file \"%s\"." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "Could not open file \"%s\" for reading." + +#~ msgid "No filename specified." +#~ msgstr "No filename specified." + +#~ msgid "Could not write to file \"%s\"." +#~ msgstr "Could not write to file \"%s\"." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "Could not open control device \"%s\" for writing." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "Could not configure audio device \"%s\"." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "Could not set audio device \"%s\" to %d Hz." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "Could not open video device \"%s\" for writing." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "Could not close video device \"%s\"." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "OSS device \"%s\" is already in use by another program." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "Could not access device \"%s\", check its permissions." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Device \"%s\" does not exist." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "Could not open device \"%s\" for writing." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "Could not open device \"%s\" for reading." + +#, fuzzy +#~ msgid "Your OSS device could not be probed correctly" +#~ msgstr "Your oss device could not be probed correctly" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "Could not open vfs file \"%s\" for reading." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "No filename given" + +#, fuzzy +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "Could not open vfs file \"%s\" for writing." + +#~ msgid "No filename given" +#~ msgstr "No filename given" + +#~ msgid "Could not close vfs file \"%s\"." +#~ msgstr "Could not close vfs file \"%s\"." + +#~ msgid "No device specified." +#~ msgstr "No device specified." + +#~ msgid "Device is not open." +#~ msgstr "Device is not open." + +#~ msgid "Device is open." +#~ msgstr "Device is open." diff --git a/po/eo.gmo b/po/eo.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ecb4ae29cf766fff60ab4430f08a8431f9d3d22c GIT binary patch literal 2586 zcmbW1ON^}wKVT%=C25J3Skj{O*n!gE>zH`<4cfq?c{{SRE zeGKAZpP_pg`~qADego3FA3;3q8amQ@9sCMD{{y@i^Dm*C)?WtcUf+Xc$Il?y`722K zZh+*UKfxxr4a$#$ZIEL5K1k~>fmp&WgA~6jAnCgbk{!Q*TfiG2t=ovh>HQXv)@=vL zo}K7u|K5tDAg!MO>71F09S{#YfsXXVAjRoq#R4R~uTNfkO~#^o`;~Z8v07Ib!TS z@JR@VY=tbh9T*Hls8;A+%Z*||jcj?m94+~WVo3IEhdc(kAMym`DacO9UI^vk0}zTo zHM&2w2baM1RNPpR;!BPENO#-}p%_wrPzDP$h8!P?`Bb4JuZ*VY%6NFl4fBOX zPGpCLb8LKqjZ5vNW#gvEVy=znka)>uQnlSa`vmw^9tawAR>=&6t;18wzmewv1IVU~LsyQ!2S> z$Qw6LnwXrX9VV98V6^fEv%*XEJPv2Gy&jv@Y?iLY<^+7l=A^)|G@5l(ELkU)BE{zp zj+TaX3fNQVcxAvlOVdT|`>flC*Ob%4o{Qx$P)I{IFYO{P?^=%NI`dF(*u2S#fn>+5 zIf>8)({X?W4!&*i#Q7l4ibQD_B*w(N9yaP>b2Mz$=45WH585tKad5auT+lTw-uFIl zjf^Z5$r+VpB22Uy$k5niq;_n!8;rxD6t!SNc-i93dZQWCn?bX|>-AQnzNe0cg~1#W zfGk*D*9hv*1oeHq*=X$>-BWL1-3)>ebgj@X6Yy$_AGON)lS1>(_>uPXM3)~(t2d#G z`U4gFgSbSJ$$?N=7@5Jd(4mt;Br@nC(k(veatVdV?gPG3OjdY&45T@jLB9)~DQqN> z+ldUd^s7o*T$);Yx;?q-z(!cFjU(SsM?rTn$DO@A?MF})O7G`UUsxyo*zxXEFuJ;q zPVPw?OzOx`;KWdDIW4kopF~%Fa_t&aI?-e?Y zkWxdAV@RX2%44}w<%S(ys&b2jlw2<0iabSTre1N>0TsE*%<8v+$Y9z)@eK80w8({p z^EF2@a4U0b;v)4THsSx+!Y{n7xO84PUYtRKAb(+l5~%k~rQ*W*|J3?#D-wjsmNv|Z zoGR#$_Tu74k{uPfml;B*4Lg*f1}C*j%yQLJ(HDbWRs_fai?iAy6SV5WYqBR%^k>ki z)S7bt%BU>(>Mf^wPaS!zta!sFQ$!O*t1_g3N)+6pRlz2+i|;_UDs5O99>Qg-zW|+G zSv@Dq3n?~*S1Ae=#$|NGM3D;otjIuR)AEMPqcS*jEK(1ZXjm72WsLxr-lZ%Es?de3 XYst;9ga(LjIbQlT%s{EfuZaB(BR*!= literal 0 HcmV?d00001 diff --git a/po/eo.po b/po/eo.po new file mode 100644 index 0000000..4813b1a --- /dev/null +++ b/po/eo.po @@ -0,0 +1,651 @@ +# Esperanto translation for gst-plugins-good. +# Copyright (C) 2011 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-good package. +# Kristjan SCHMIDT , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-06-04 21:48+0100\n" +"Last-Translator: Kristjan SCHMIDT \n" +"Language-Team: Esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not establish connection to sound server" +msgstr "" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' de '%s'" + +msgid "Internal data stream error." +msgstr "Interna datumflu-eraro." + +msgid "Failed to decode JPEG image" +msgstr "" + +msgid "Could not connect to server" +msgstr "Ne eblis konekti al servilo" + +msgid "Server does not support seeking." +msgstr "" + +msgid "Could not resolve server name." +msgstr "" + +msgid "Could not establish connection to server." +msgstr "" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +msgid "Internal data flow error." +msgstr "" + +msgid "Volume" +msgstr "Laŭteco" + +msgid "Bass" +msgstr "Baso" + +msgid "Treble" +msgstr "" + +msgid "Synth" +msgstr "Sintezilo" + +msgid "PCM" +msgstr "" + +msgid "Speaker" +msgstr "Parolilo" + +msgid "Line-in" +msgstr "" + +msgid "Microphone" +msgstr "Mikrofono" + +msgid "CD" +msgstr "KD" + +msgid "Mixer" +msgstr "Miksilo" + +msgid "PCM-2" +msgstr "" + +msgid "Record" +msgstr "Registri" + +msgid "In-gain" +msgstr "" + +msgid "Out-gain" +msgstr "" + +msgid "Line-1" +msgstr "" + +msgid "Line-2" +msgstr "" + +msgid "Line-3" +msgstr "" + +msgid "Digital-1" +msgstr "" + +msgid "Digital-2" +msgstr "" + +msgid "Digital-3" +msgstr "" + +msgid "Phone-in" +msgstr "" + +msgid "Phone-out" +msgstr "" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Ekrano" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Ne eblis malfermi la sonaparaton por reproduktado. Ĝi estas uzate de alia " +"aplikaĵo." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +msgid "Could not open audio device for playback." +msgstr "Ne eblis malfermi la sonaparaton por reproduktado." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +msgid "Could not open audio device for recording." +msgstr "Ne eblis malfermi sonaparaton por registrado." + +msgid "Could not open audio device for mixer control handling." +msgstr "" + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" + +msgid "Master" +msgstr "Ĉefe" + +msgid "Front" +msgstr "Antaŭe" + +msgid "Rear" +msgstr "Malantaŭe" + +msgid "Headphones" +msgstr "Kaptelefono" + +msgid "Center" +msgstr "Centre" + +msgid "LFE" +msgstr "" + +msgid "Surround" +msgstr "Ĉirkaŭe" + +msgid "Side" +msgstr "Flanke" + +msgid "Built-in Speaker" +msgstr "" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "" + +msgid "3D Depth" +msgstr "" + +msgid "3D Center" +msgstr "" + +msgid "3D Enhance" +msgstr "" + +msgid "Telephone" +msgstr "" + +msgid "Line Out" +msgstr "" + +msgid "Line In" +msgstr "" + +msgid "Internal CD" +msgstr "" + +msgid "Video In" +msgstr "" + +msgid "AUX 1 In" +msgstr "" + +msgid "AUX 2 In" +msgstr "" + +msgid "AUX In" +msgstr "" + +msgid "Record Gain" +msgstr "" + +msgid "Output Gain" +msgstr "" + +msgid "Microphone Boost" +msgstr "" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "Enigo" + +msgid "Record Source" +msgstr "" + +msgid "Monitor Source" +msgstr "" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "Dukanale" + +msgid "Surround Sound" +msgstr "Ĉirkaŭa sono" + +msgid "Microphone Gain" +msgstr "" + +msgid "Speaker Source" +msgstr "" + +msgid "Microphone Source" +msgstr "" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "" + +msgid "Stereo Mix" +msgstr "" + +msgid "Mono Mix" +msgstr "" + +msgid "Input Mix" +msgstr "" + +msgid "SPDIF In" +msgstr "" + +msgid "SPDIF Out" +msgstr "" + +msgid "Microphone 1" +msgstr "Mikrofono 1" + +msgid "Microphone 2" +msgstr "Mikrofono 2" + +msgid "Digital Out" +msgstr "" + +msgid "Digital In" +msgstr "" + +msgid "HDMI" +msgstr "" + +msgid "Modem" +msgstr "Modemo" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "Alia" + +msgid "None" +msgstr "Neniu" + +msgid "On" +msgstr "Enŝaltite" + +msgid "Off" +msgstr "Elŝaltite" + +msgid "Mute" +msgstr "Silentigi" + +msgid "Fast" +msgstr "Rapide" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Tre malalte" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Malalte" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Meze" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Alte" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Tre alte" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "" + +msgid "Front Panel Microphone" +msgstr "" + +msgid "Front Panel Line In" +msgstr "" + +msgid "Front Panel Headphones" +msgstr "" + +msgid "Front Panel Line Out" +msgstr "" + +msgid "Green Connector" +msgstr "" + +msgid "Pink Connector" +msgstr "" + +msgid "Blue Connector" +msgstr "" + +msgid "White Connector" +msgstr "" + +msgid "Black Connector" +msgstr "" + +msgid "Gray Connector" +msgstr "" + +msgid "Orange Connector" +msgstr "" + +msgid "Red Connector" +msgstr "" + +msgid "Yellow Connector" +msgstr "" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +msgid "Virtual Mixer Input" +msgstr "" + +msgid "Virtual Mixer Output" +msgstr "" + +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d funkcio" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s funcio" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" + +msgid "Playback is not supported by this audio device." +msgstr "" + +msgid "Audio playback error." +msgstr "" + +msgid "Recording is not supported by this audio device." +msgstr "" + +msgid "Error recording from audio device." +msgstr "" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "" + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "" + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Tio ne estas '%s'-aparato." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "" + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "" + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "" + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "" + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "" + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "" + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "" + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "" diff --git a/po/es.gmo b/po/es.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b0ff14a27fae49e055015ed0696908d7e67dcc73 GIT binary patch literal 15813 zcmchd50o8Mea8m`#2^-dsG!zCSxF$f$!_?&5GC2&{3FY**(4x>I{V)2+X?e#9y9Yc zY;1+7SSv;9A5>6VBUVL(s!>r;@wl~BOON!}(@M{2Ev-juwdbhkDD64u>F0azo%iN# zHY8E&JGuLrJ9Fp$`Q6|B-QWF9{`J)3?(q0MOnL$7^b)u@XTVF~iEsoigWKR%c$K^VA*gcqy8LHd{>zZ2ysyKj!*9Xm@Sosu@V}wz z`x*Q__)GYFc=EGte^$aX$zKe4Z4$X^T3fw#h!!UOOk_|Nbrc!9v`5o$b- z!#;RClXL+*51R2q&F>xXcz742i{1wzBJ>`Bh|K$2cmLm@%0B_spC_U8@jM2>r8f+v zA3LGO74k>r_d&_$%~0}t8z?23o_`FgAD@IO_cvrz5c0#*O5Q1!kG>b(!T=O1>@KMp1515o|?64X3C;_^R$tI7WY zYWy#Kk*$9asy`P&$@Ma*c1ED)VFIp!*SY-Lpyu!WQ2qKGRJ#vD{(0Zvj}LzcS#sVo zGOFK)l4~E7{4Rj%=Q^l%wn4Rj4OIUEsQP25a&0Jiya}qkx582QE~x%J2G4=Z&O&$L z5Ih$)VLyDY%l|c0|9=YA-bpNG)psgXdoO@$r_bfjgO`v$A8I`%Q0wUysP%LwR6X}Y zjqkHidi^!1`FtE|K7R(katvi&V#o97*;dZqh0?PhLG|O8P~&}ipUpo9PLTJZS82lC-h0A%!lzG>{0Nw;&3m=D5aKmbJ8@?NE zg#Q8c{<#cx6KuhY;pd^`@>BR4cpjUD?%xV^|F7Uh@K;dvUC8F4_TLDf4!`dBD8$5g z-+^bqUqH4N?-V9O_g6yc`6j4&nS>|9+o0zEeehZEA?U+zLg~+s;7RZ&j!!zCc)opp zIy{Z%XF&C*AD#{`fXm=kDE-(8eK-#>Mc!Rd^?w0A8-5u+4L<7f{{T-R|9z-_KjElJ zR{j}K@0|+Ozq6t0TLaaP3*hl^9aKL?;4|Tsj<14R*RznV+PeuZhwp*Xll!3RdBE{u zsP_H_N=}bKmHSU9`Th)UfTy60_rWQ+4<5thsh&4F-U{{JJE6w+0r+BgKUDw!9-a#S z(eZ~+a(NPJJW`I+!3j`ue?HVau7;Y&b?|xcI>;;D9F%8-T=>r2cYKpJ5cpM2{pdsFv`j=hmzk5q1NSU zC^@_wYP?&Z`g1K*xdzmH&Aa<=hC9i>9d3a?fGjm{5TkPid@W=OyiY)l``@9)aVE-s z7My@5z#E|S=SIhU?*3b$+I>5`8r}^xuTMIjxz5_bi=oD|6KWjSLDk=cdjEDPIqZkW zz>kpTNP6eBB>gmQjak13Exd8qN0Kb>CrOvyNxGX<{*v+nZY7P9zDW8DQa_2QGd6J= zO7?FgeU_x(0Sj*y4w5b>eS!4HB>lFNV$vQGL-syK(r>wi_eT(sd-uBhCg_tklh^`` zt$rP>{$4=ll_bqai}Wgzet&7d`cE^6=wlIG^mN#~L@pD!nU ziS$B}ez%kUfTX#o{@P^TMS8xwc@F##=}MC3@ol8rNVk$MAbpVZT+$mz?cFCBuR&*xB9(>^j^}#%DCTtco*r-B(1w9N$YFz?*Vt?O^z>tA!#4! zICpOZ)=8^KXOKQj`T*%qN&2lIz202eKSAZXy!<2=t4Vv^jkm&_^bVIVaWfa|UFHsW zBWZ{vTdsA6x_h4{y_$3u>Eoo6NvD%mlJvWfG-0mrdmX3X=SUxQ`Qzb6(x15e`{A?P z^{3!G>1Cv2-MxDpZ-Vb3T|)YdyZ1i0jdTmCaQ7m(n{++t8h7s@cpd5Oq^FUtC6&KF zbQiCIvNI`ZfOHb+KGLP6wIuzn!To<#UpNH98 znEACh&BMC6Q%jR1G;R9rB)qZ3by$z*2fXz=ul5K1Es49BXcy*csJu1gm$zIQlWo_d z)NjSX{B%%rofz;o1bJ@$_#4tRFT4%09*)?S)6C^JW@%FRlR*;3J!=LLeGhH=?BBXJMYkZB3OQ6n@sG`ex`yxv%Et!@|$otyY>LOWH}>aos#{ z!uE^Q%|zu{nB33~8S8X=W+u#XpMmuDwo^-(7r}HK<+FZe@;X&k+dE{*w4Kxs?m~lp zw}LEahUi!BGqy?(DqU>`txh**vb1@KVh9%L7>#iC%%FzN=tgNEbDgEJk38!!0);oC2j`Y1}WK8?E3 z%ycNNX=~Nda)6f1B88yUilbT}H9DGVf9FH?UzxW3dYYV5Fky3{&x&bAxsf<}XXZ=R z#m@5KN0NoLG^-!ctapq4W__qAvM(*n!ayBhChGp4EGiat#w>3J>g;90k{IyZY#MXy zRywvKXcd^)&e)eMgjs1}SxWhgMnNON5Joj`G-^ae5X-2Rm$IYox__{9HPpFU>y4&+ z5|)uSW^6pGR^3-mg6Sw`EMacOSQ+!MzXdCpYXSp*?)-SjuV)d9X22hr4Y9@1j323h zeL7e^buE;_VuPBVFI4-YML%$;g1siBTg=VBt*B}u2E2_y6thZ#8ElZY#3Exn1Eq=S z<1)8P+U#({eqUa`(h-EUEexjM<>|J1ytpH-6|}dGGS)+X>*UxbKWYYzu&j<}GKg%T z83qD-tSMYnk3SyFv$i|J%L46xR`7?Y$LYdvUQxk*ogu-HeIu#OFP`#_B;7c2rzSFy z=1pX~s1u8NoJWlW)yxaV-za7e*T7s5vwdlCmB#%kTcFn&masBK=%A4?uXQ)S?({Ma z`%aQ(&8O(PEtFTbxSpj^86+afIedRvnIhWflknrZ*~2Daa56jB^`Hp+nK<2Jz3+iVPqdJNX7?FW8DZ!O94L)`z}t#j>|GJgPp3gv_cw%L z%ahYt3ffS@)dgFF!H~sT3wpXOOBvb0ERY0L(JXNsN~zidyG&oWqK1cGu}kvO)#=X z^}OV6EWHLMuq}=-mab1WBeI^vy?CMDjt!}sc8RNzb@Z6lZ>nRpjXG1q+bU(bF9(D@k@-e2d zdNLy1#ZvR9*^YHIonjG(saGCs9n0ZPwdA1bI4&DimNl=KB{zi!qgCOR7xrl6P0c4n z4|Z?@vc`FbTzKOa%Jf!tDqR0Xy$_Ok|M~JnzCr=N?FLCNaA_(t|osb z%JKpivhphW;4Fyo{A)Hmz*1MQbXM=SLeVIxrOj5%Y52%WJA=-V;t&;=9(YBzG?|4A z)Y~O@$m}`hO4fUqwrl%WN@udp-*7e5*+8UKL9Iq82wS(uZKo!pfhO96&8{db+E@-_ zsB!rjb{OYWSiNnxxZZnCr*;wRXolWZvk{``E)<(zda1lJH1@Vz*xgvVGz)z<`q00n z-p}Y|QHT9TUi4eDn)f%-wC=AN7+f_1!7Da1# z_3G(%V=uc!Fu)m$V_TXvRxg{J*wH`2D$z;1f0QLP><_IO9O_>))IT)nuURuZxaPby z{3zJJokP2N&@DHpa)U$u;KjphDK|*DZEURlJG76mK+|m4-%2~7zbQ@jF6@uPy_KuW zf;i<26JOqFViN{Xsh9D3(r9zm=-+`yFigZMNEFYxEX*&DBXzl3WY`b$W#e1M$GVak z99Xjq!Ls+zhxrzRDcFftqr*{hsb8B7GG>0=&K(>3FYcC8UkNPrkD=5$`VRXSPe;YF ztNS;FoFnWYuGkPv6MY*T7#tipf7xW*&VsmqBkp!S>?h0x*?is5rK}cRu3M4#XRY%G zS6;fzQ?N2xIFN80(~7HPy|3Qemw)vkpBeM*rHQO%slRsAW8P=5Oi>;CMRq*goo0cq zCUoqgLL5aG%H)hjB-2lc*qCE^RHwokhd>I&oWt3rZZtihAii-kV5Nk)VtaM$=@{WA zE_@T!^riwluQF48G*o>wRDG-Rz#Vo?hj1X+q3qDPk>mZ;Qy1}E&zec_Jh(p{>`rr! zIYY_mb`mzSbWxUKG0`_gKWF4+2XVJRu(!P^w?ygnaS_a=dl_~?^+BBmM&(`M%e2}d zop4c50#2EPSdZ|5a>503shb$tvL~148g|y4y{g1=YKd=va)kYfeXIoHi`# z#DR{`6-`bSR^=2dJebJF6P;YxkI1x^sju5Qb!$3n1%x9E&CFg0 zOZRzk4Mbk?fO^L(y*YR;yKmz9PG`|UQ{L&N3Hjoe5bYo&r8TUjN~Orc#Aqqm4ENUJ z#dGvqtkxgnoI;x>7Mn^roLZQPvf*9zOk%j^t3~cFuXy7^up89KQPQKuph$a3+4IB3snOay=tF9}7do zkx+mQ3YY45K2cpUzhi@Ci#DZ+}8LzTq);NAE2wl^5jv-#!Fb!*hc*=mCfx)h1)(9yw zO-LH2J8Oq{<$3fJB?rrJGF^y6%xYg5o?g1)U%$B3tb@kW(LY7<;ut@KQMcL)_h{(q zjdo%j07BNImAzIWY%4pX9oCw;IJT*!DpHnHV1w9PNhzF7KJ+H%xfXsS^}*Ul~DJXOXegG z7e0lkjoCZmK2ea9X1Qj_l}bT(4yF3t>7a1l##OXlM2~XOp;8By99f?}wUjDasVBgO z$>Bb-VGylo@V%T4F!ItkN*>l}!V~E+Bb6q59kAbMu8FsG!};Zqdh0)oD5~1h`{L0E zqxVg>J`N%LL$ugYhrYUTD~&68R4QTZ6cbV|)ml5K%Q0nA<`(YLH-kgz)%Jz`EjBkB z@8`&}zMVxif>v_G^-k}BX3SZbgP*t)*})G?wE2;JGm0M{{B#q0k(Lu-Hg&$uQHFh` z2%5pdr_6!Gj--1Ov%Nki!Ii)GLM4O$`d_N^f*PC6Uy!p~l zkxNxZz1MM(@`c2XNPTk}SZ>}NkF6JOI$k~;88!P%maxg2@4?n0&BX29MgqhWnMqAC zMan(UWz|S;LE~+d@-v?%kUMiZM^wX{Y|S@{NluM8y1ZS4=3HREQ!Lzg^wjCpZcJ~hy@DT1F;&`jqs z0u(ytprQKuQ7(NW)-k>SnExpwaob|%7}OR0Djmt}Wa+zz-sS{}?KdApI;UqHiCJYh zBQ#@+cTd>svts&wy1{3l)m024-;klifjgjVJa7RV_Ac90_|DuhaO7raAXV z-&NeVm99NxA;k;#7-jC5!pgmlk-;igx})3@ePNb44x0g&CpF{1cw zl}GNy0hB*Q5qip52`0{1 zDHJAiieOp;Yyy=@$YH?SM*NxZsr$UcagpG`J^H@mB6uYwGiO!CZe$~^vq+s*NqCR! z(>vWgp;OIRGMC14SW&(pnRp}{N%xLSe_?%L^Xt13!41Y(oA_J;bLE1~^KdKhH2S;Zbzr;RyQqcR=)p%^OP#x>&V zE9$HXJD4S%cjGyHOF_mx#XDs&-9a8PK&*oHM^0i>3kPD;fpVopva0m9mGM71b*SvE zOH%GyU19;)RwgCjAV`X45;C`=t>6X# literal 0 HcmV?d00001 diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..487fd7f --- /dev/null +++ b/po/es.po @@ -0,0 +1,746 @@ +# translation of gst-plugins-good-0.10.26.2.po to Español +# spanish translation for gst-plugins-good +# This file is put in the public domain. +# Jorge González González , 2007, 2008, 2009, 2010, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-02-12 18:30+0100\n" +"Last-Translator: Jorge González González \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not establish connection to sound server" +msgstr "No se pudo establecer la conexión con el servidor de sonido" + +msgid "Failed to query sound server capabilities" +msgstr "Falló al preguntar al servidor de sonido sus capacidades" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "«%s» por «%s»" + +msgid "Internal data stream error." +msgstr "Error interno de flujo de datos." + +msgid "Failed to decode JPEG image" +msgstr "Falló al decodificar la imagen JPEG" + +msgid "Could not connect to server" +msgstr "No se pudo conectar con el servidor" + +msgid "Server does not support seeking." +msgstr "El servidor no soporta la búsqueda." + +msgid "Could not resolve server name." +msgstr "No se pudo resolver el nombre del servidor." + +msgid "Could not establish connection to server." +msgstr "No se pudo establecer la conexión con el servidor." + +msgid "Secure connection setup failed." +msgstr "Falló la configuración de la conexión segura." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Ocurrió un error de red o el servidor cerró la conexión de forma inesperada." + +msgid "Server sent bad data." +msgstr "El servidor envió datos erróneos." + +msgid "No URL set." +msgstr "No existe un URL establecido." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "El audio no existe o no es válido, el flujo AVI estará corrupto." + +msgid "This file contains no playable streams." +msgstr "Este archivo no contiene flujos reproducibles." + +msgid "This file is invalid and cannot be played." +msgstr "Este archivo no es válido y no se puede reproducir." + +msgid "This file is corrupt and cannot be played." +msgstr "Este archivo está corrupto y no se puede reproducir." + +msgid "Invalid atom size." +msgstr "El tamaño atom no es válido." + +msgid "This file is incomplete and cannot be played." +msgstr "Este archivo está incompleto y no se puede reproducir." + +msgid "The video in this file might not play correctly." +msgstr "" +"Puede que el vídeo en este archivo no se pueda reproducir correctamente." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Este archivo contiene demasiados flujos. Sólo se reproducirá el primer %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"No se encontró un flujo soportado. Puede que necesite instalar una extensión " +"RTSP de GStreamer para los formatos de flujo Real." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"No se encontró un flujo soportado. Puede que necesite permitir más " +"protocolos de transporte o de otra forma puede que le falte la extensión " +"correcta de RTSP de GStreamer." + +msgid "Internal data flow error." +msgstr "Error en el flujo de datos interno." + +msgid "Volume" +msgstr "Volumen" + +msgid "Bass" +msgstr "Bass" + +msgid "Treble" +msgstr "Agudos" + +msgid "Synth" +msgstr "Sintetizador" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Altavoz" + +msgid "Line-in" +msgstr "Línea de entrada" + +msgid "Microphone" +msgstr "Micrófono" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mezclador" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Grabación" + +msgid "In-gain" +msgstr "Ganancia de entrada" + +msgid "Out-gain" +msgstr "Ganancia de salida" + +msgid "Line-1" +msgstr "Línea-1" + +msgid "Line-2" +msgstr "Línea-2" + +msgid "Line-3" +msgstr "Línea-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +msgid "Phone-in" +msgstr "Entrada de teléfono" + +msgid "Phone-out" +msgstr "Salida de teléfono" + +msgid "Video" +msgstr "Vídeo" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"No se pudo abrir el dispositivo para reproducir. Otra aplicación está usando " +"el dispositivo." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"No se pudo abrir el dispositivo de sonido para reproducir. No tiene permisos " +"para abrir el dispositivo." + +msgid "Could not open audio device for playback." +msgstr "No se pudo abrir el dispositivo para reproducir." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"No se pudo abrir el dispositivo de sonido para grabar. No tiene permisos " +"para abrir el dispositivo." + +msgid "Could not open audio device for recording." +msgstr "No se pudo abrir el dispositivo para grabar." + +msgid "Could not open audio device for mixer control handling." +msgstr "" +"No se pudo abrir el dispositivo de sonido para su gestión por el control de " +"mezclado." + +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 se pudo abrir el dispositivo de sonido para su gestión por el control de " +"mezclado. Este elemento no soporta esta versión del Sistema de sonido " +"abierto (OSS)." + +msgid "Master" +msgstr "Maestro" + +msgid "Front" +msgstr "Frontal" + +msgid "Rear" +msgstr "Trasero" + +msgid "Headphones" +msgstr "Auriculares" + +msgid "Center" +msgstr "Centro" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Envolvente" + +msgid "Side" +msgstr "Lateral" + +msgid "Built-in Speaker" +msgstr "Altavoz integrado" + +msgid "AUX 1 Out" +msgstr "Salida AUX 1" + +msgid "AUX 2 Out" +msgstr "Salida AUX 2" + +msgid "AUX Out" +msgstr "Salida AUX" + +msgid "3D Depth" +msgstr "Profundidad 3D" + +msgid "3D Center" +msgstr "Centro 3D" + +msgid "3D Enhance" +msgstr "Mejora 3D" + +msgid "Telephone" +msgstr "Teléfono" + +msgid "Line Out" +msgstr "Línea de salida" + +msgid "Line In" +msgstr "Línea de entrada" + +msgid "Internal CD" +msgstr "CD interno" + +msgid "Video In" +msgstr "Entrada de vídeo" + +msgid "AUX 1 In" +msgstr "Entrada AUX 1" + +msgid "AUX 2 In" +msgstr "Entrada AUX 2" + +msgid "AUX In" +msgstr "Entrada AUX" + +msgid "Record Gain" +msgstr "Ganancia de grabación" + +msgid "Output Gain" +msgstr "Ganancia de salida" + +msgid "Microphone Boost" +msgstr "Aumento del micrófono" + +msgid "Loopback" +msgstr "Bucle local" + +msgid "Diagnostic" +msgstr "Diagnóstico" + +msgid "Bass Boost" +msgstr "Aumento de bajos" + +msgid "Playback Ports" +msgstr "Puertos de reproducción" + +msgid "Input" +msgstr "Entrada" + +msgid "Record Source" +msgstr "Origen de la grabación" + +msgid "Monitor Source" +msgstr "Monitor de origen" + +msgid "Keyboard Beep" +msgstr "Pitido de teclado" + +msgid "Simulate Stereo" +msgstr "Simular estéreo" + +msgid "Stereo" +msgstr "Estéreo" + +msgid "Surround Sound" +msgstr "Sonido envolvente" + +msgid "Microphone Gain" +msgstr "Ganancia del micrófono" + +msgid "Speaker Source" +msgstr "Altavoz de origen" + +msgid "Microphone Source" +msgstr "Micrófono de origen" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Centrado / LFE" + +msgid "Stereo Mix" +msgstr "Mezclador estéreo" + +msgid "Mono Mix" +msgstr "Mezclador mono" + +msgid "Input Mix" +msgstr "Mezclador de entrada" + +msgid "SPDIF In" +msgstr "Entrada S/PDIF" + +msgid "SPDIF Out" +msgstr "Salida S/PDIF" + +msgid "Microphone 1" +msgstr "Micrófono 1" + +msgid "Microphone 2" +msgstr "Micrófono 2" + +msgid "Digital Out" +msgstr "Salida digital" + +msgid "Digital In" +msgstr "Entrada digital" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Módem" + +msgid "Handset" +msgstr "Auriculares" + +msgid "Other" +msgstr "Otro" + +msgid "None" +msgstr "Ninguno" + +msgid "On" +msgstr "Encendido" + +msgid "Off" +msgstr "Apagado" + +msgid "Mute" +msgstr "Silenciar" + +msgid "Fast" +msgstr "Rápido" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Muy bajo" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Bajo" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Medio" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Alto" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Muy alto" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Producción" + +msgid "Front Panel Microphone" +msgstr "Micrófono del panel frontal" + +msgid "Front Panel Line In" +msgstr "Entrada del panel frontal" + +msgid "Front Panel Headphones" +msgstr "Auriculares del panel frontal" + +msgid "Front Panel Line Out" +msgstr "Salida del panel frontal" + +msgid "Green Connector" +msgstr "Conector verde" + +msgid "Pink Connector" +msgstr "Conector rosa" + +msgid "Blue Connector" +msgstr "Conector azul" + +msgid "White Connector" +msgstr "Conector blanco" + +msgid "Black Connector" +msgstr "Conector negro" + +msgid "Gray Connector" +msgstr "Conector gris" + +msgid "Orange Connector" +msgstr "Conector naranja" + +msgid "Red Connector" +msgstr "Conector rojo" + +msgid "Yellow Connector" +msgstr "Conector amarillo" + +msgid "Green Front Panel Connector" +msgstr "Conector verde del panel frontal" + +msgid "Pink Front Panel Connector" +msgstr "Conector rosa del panel frontal" + +msgid "Blue Front Panel Connector" +msgstr "Conector azul del panel frontal" + +msgid "White Front Panel Connector" +msgstr "Conector blanco del panel frontal" + +msgid "Black Front Panel Connector" +msgstr "Conector negro del panel frontal" + +msgid "Gray Front Panel Connector" +msgstr "Conector gris del panel frontal" + +msgid "Orange Front Panel Connector" +msgstr "Conector naranja del panel frontal" + +msgid "Red Front Panel Connector" +msgstr "Conector rojo del panel frontal" + +msgid "Yellow Front Panel Connector" +msgstr "Conector amarillo del panel frontal" + +msgid "Spread Output" +msgstr "Expandir salida" + +msgid "Downmix" +msgstr "Reducción de canales" + +msgid "Virtual Mixer Input" +msgstr "Entrada del mezclador virtual" + +msgid "Virtual Mixer Output" +msgstr "Salida del mezclador virtual" + +msgid "Virtual Mixer Channels" +msgstr "Canales del mezclador virtual" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Función %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Función %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"No se pudo abrir el dispositivo de sonido para su gestión por el control de " +"mezclado. Este elemento no soporta esta versión del Sistema de sonido " +"abierto (OSS)." + +msgid "Playback is not supported by this audio device." +msgstr "Este dispositivo de sonido no soporta la reproducción." + +msgid "Audio playback error." +msgstr "Error de reproducción de sonido." + +msgid "Recording is not supported by this audio device." +msgstr "Este dispositivo de sonido no soporta la grabación." + +msgid "Error recording from audio device." +msgstr "Error al grabar del dispositivo de sonido." + +msgid "Gain" +msgstr "Ganancia" + +msgid "Headphone" +msgstr "Auriculares" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Error al leer %d bytes del dispositivo «%s»." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Se obtuvo un tamaño de cuadro inesperado %u en lugar de %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Error al leer %d bytes del dispositivo «%s»." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Error al obtener las capacidades del dispositivo «%s»: No es un controlador " +"para v4l2. Compruebe si es un controlador para v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Falló al consultar los atributos de la entrada %d en el dispositivo %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"Falló al obtener la posición del sintonizador %d en el dispositivo «%s»." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Falló al consultar la norma para el dispositivo «%s»." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Falló al obtener los atributos de control en el dispositivo «%s»." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "No se puede identificar el dispositivo «%s»." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Esto no es un dispositivo «%s»." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "No se pudo abrir el dispositivo «%s» para lectura y escritura." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "El dispositivo «%s» no es un dispositivo de captura." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "El dispositivo «%s» no es un dispositivo de salida." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Falló al establecer la norma para el dispositivo «%s»." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Falló al obtener la frecuencia actual del sintonizador para el dispositivo " +"«%s»." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Falló al establecer la frecuencia actual del sintonizador para el " +"dispositivo «%s» a %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Falló al obtener la potencia de la señal para el dispositivo «%s»." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Falló al obtener el valor para el control %d del dispositivo «%s»." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Falló al establecer el valor %ds para el control %d del dispositivo «%s»." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Falló al obtener la entrada actual en el dispositivo «%s». Quizá sea un " +"dispositivo de radio." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Falló al establecer la entrada %d en el dispositivo %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Falló al obtener la salida actual en el dispositivo «%s». Quizá sea un " +"dispositivo de radio." + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Falló al establecer la salida %d en el dispositivo %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "No se pueden encolar los búferes en el dispositivo «%s»." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Falló al intentar obtener cuadros de vídeo del dispositivo «%s»." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Falló después de %d intentos. Dispositivo %s. Error del sistema: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "No se pudieron obtener los parámetros para el dispositivo «%s»" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"El dispositivo de entrada de vídeo no aceptó el ajuste de la nueva tasa de " +"fotogramas." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "No se pudieron mapear los búferes del dispositivo «%s»" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"El controlador del dispositivo «%s» no soporta ningún método de captura " +"conocido." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "El cambio de resolución durante la reproducción aún no está soportado." + +msgid "Cannot operate without a clock" +msgstr "No se puede operar sin reloj" + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Falló al enumerar los posibles formatos de vídeo con los que el " +#~ "dispositivo «%s» puede trabajar" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "El tipo de búfer no está soportado o el índice está fuera de los límites " +#~ "o no se han registrado búferes todavía o la longitud o el userptr son " +#~ "inválidos. Dispositivo %s" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "Falló al intentar obtener cuadros de vídeo del dispositivo «%s». No hay " +#~ "memoria suficiente." + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "Memoria insuficiente para encolar un búfer puntero de usuario. " +#~ "Dispositivo %s." + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "No se encontraron búferes libres en el índice %d del «pool»." + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "El dispositivo «%s» no puede capturar a %dx%d" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "El dispositivo «%s» no puede capturar en el formato especificado" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "No se pudieron obtener búferes del dispositivo «%s»." + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "No se pudieron obtener búferes suficientes del dispositivo «%s»." + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Error al iniciar el flujo de captura del dispositivo «%s»." + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Error al parar el flujo de captura del dispositivo «%s»." + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "Falló al obtener los atributos de control en el dispositivo «%s»." + +#~ msgid "Could not read from CD." +#~ msgstr "No se pudo leer del CD." + +#~ msgid "Disc is not an Audio CD." +#~ msgstr "El disco no es un CD de sonido." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Este archivo está cifrado y no se puede reproducir." diff --git a/po/eu.gmo b/po/eu.gmo new file mode 100644 index 0000000000000000000000000000000000000000..778aa0ebfb6f40621fbdfef9018ba874c927e2ee GIT binary patch literal 14506 zcmc(l36LCDdB>Z>7z+bFF^3J$#%oEoXSKWXxwb&ZuB5fK(xP1(%Rubjo!;5j%yh4N zx-IQ+n9H1o1Ow(aXNZA72$*t0h>I!$6#^uc$_-V9qNpOIid+N|lFIS>zxR5kXSFNI zkV@MA=GVtNzxTcGeebOvIqUK747eUd&PTptOsIBW0G|!Vq3SsV)!y6T6|fCe-bdhO_%IxXe+xIl^Ue%{OW^b2)o>Bs z1@DJS|Ln7Z;AXfN-T^-dUkJ}UI|wd?F}wx718#*sh8M#N&k2I(!rf5)JM39N>GhRR z`n<>UKF<$9>FJX&gr9?(;5jHw?c4@0f^|3sU+?)vsDAz!?t!O0EeNiHFMy-)4N(35 zB2>N~LACe%^IUspp!!?D?eK&C{r8~yamv$!;7Yg|D&K8T+eF6dBwPQ9kO&mTbP>6=jXeFv)jKY&-k zAHn;ep>r902b)PToCl!v_Gu{n{618Bz6w>|pF`F2eW-T)2&$ZaflBwEQ2jm~r=fDsf)nt3sCI;K zBfJ-m!!N>1;ZI==n&-IZ{ZQ>(fvWHAQ02WBs=kjw)$?ip{CRjS&tHO?CqILlCr>tR zo?Hl3&Q(zT+XiK?(@^6ULsT1d;rAaC1n+{w2jEO~4&+4octm!L9IN&wqyUQky(1TTVbh6Vf~JOp1t zq009VoYi}H4ZLoX^LIHUY49GX`T1q2{(Z~y5h%U>gXe#Ep1RrT<81gcz7Ii_`w`FY zK$;$$gVAh**TU=J5lEAR2jQ*o+i(xO^0FYf0lpk6-5)~f<&?{vUG9PM-}gY-&%Ks1E0+Md*D;xd*Kt{Cp3db-tAC&Jq)G)0;>L(!2|G35LX|3+w8-rp$;}6m0+C(I zS805g5r%f)n&(NjrYlD3_RjstHr|2AhE|X%b2WH{0fYa z6uA_+7dah~t^O+V8_3znZy|HYwTR}4E`z)Qxg8lswjd)&dA*gJqsT_&y~w%9i;<@y zuR=Bi@@YhK^i)LG z1o9Ll(L?2WLFN7}+`kOD1(`-(fqVkF7!V?rhMho*vFzCr)IeouFQuEO%r8Vnhgg#!%oNkn4M|b$%CCOecY8MNwkos znSb7$rAcmP!X#=9d@G{WkL#o?;#OXZ6EnLUg-v?3Ya-YcCP|u`xK2Og#T8SJ?u-{A z+x_A4W4at=VIG+yalVumxe3ieD_v*?UN;VAi`ln(GT4P~8gbGvS=32eg>-7d+++pC zw<8mGjH+9Sa?>f6m(whd>eQ1Kt-AfN;JR$`)O4ckPPMW3ElTbvBKkUCEG|Y_$Iy|% z*7j3&@^HQtcb1GVPpwdqX_3^AEx18zmcuM;M+|kxkhW58r2*}5xmWpOmbTYPhPvpp z9cN$8Vw#zDd^F0`o;*ui1})WFsHxibN0raaEul*k)KTBkMUyW@=74IRwVj+@>Euzn z)OSzUGVNSBqgK>r$WL5)mY)CekAb^CXy*S2RpZwNEVx=i?TQjXJgyl}?SDDV$eFBNUoDuV{^# zdKNP)hRv>}2p1YJnpg?k*U|E;uc6e&kgPLT>8ob-@OlXceMCQ*A7EEd)dvg*yTiD} zGzb@QGKL!SjQ$LlK4gg7j+?V~O&B*roia;L5zcwgnVih?g<8D2A-)#OvyQdZBXh&d zN;i_`XbhyIg?I|w{wQM=XuTxH5By?;si}2FP!piEA z>M6ii-|?d>*JX2}l2wgZRZ%ByBv@1@r`e5s=|mOW8Mas~Wb~!eJ#G!OI>SR%G>hq2 z)sU^f)bvM%ez-hInzfJ9beE{Q^bA;ZrIV0sZ6ESX`KG({7I@XThV0oqkAU-MT#-7rmi)sc83HxHb`;5KB(D?cUoRblL*tV z#5()pB$6XJ=AArB_2qQDkfpYOU{4q)!5%^lZ0qPUQB*`n)Ev`^yO9>mp#oj8NQT&* zo`!=x8AiXW7j)UjYVp-i5i9NL=e5)BotT~q_Tq3EouJpl{#_^78#k7Msif9Wo2O)R z?$=D?3#Sx+%I*o)diV7(56xmLJyHgcgI_d7!gl%X24czJ#%N_e4YRu08AZ#1BDGSh zmeQndaLg8C4qF{)*1j}dR>aE9kzktPi?U!ks>ek;sA#=^Yep;Y%~MaB*6iC)~IeQ{EM}X{D9)R04s7v z%#D<92Xxf*DP1_8q`J?sk89U3Q*N1N&~_*2J^Fy9KZ0e1JGlDJ zWNE!{TfBo>%L4kJ@uLOX!!_5vDh$ zg&fxV+dH||o3(JdUs;EJ^sda8P{+4vT*8F~P9$(jNBqKO_vk*X8YX9!7ff;MMTv&# zcGT*udhHgQ!KB`%Zf5u1j)E61#i*ih(e8O|n?4j-$JkHoU#y*)8F?6cs7=*t^j@xS z+%!6Q&H2Aht&yhn+Q{%I|6emaw&7qTH(Q(TG~#+~XVK`?=F)Mql;_LiTei#>jV^9I z9A^8`j)v2$v1P-|fw|f)W{Gy0wF#!wxEUK69jlFu)y786$jJEU$Ymp3B&;1|!>Sha z(~ZO*j7uD6Q_WvT(hBkfvLZ0GbM?+g<) zvdj^HHKM^1#!Xagn4X%R?CWlHcw_^rXBnZDE6a2@XHnULmB-0-W??DJu#Igu&F!vT z(@&?~aF|k?#O$>(95>g@$N7d^YI`E0dDqPwcZT!yb98ugboh!5GcEels_iD|?Tnj* z(c-bQZR|SclWw(b1u2z8#;37f17nY~|1 z=OfHE7-csUvOmc}(+V2}TFtW9zQ(Mh)vw3aPR;AJQqQhY@YEWm+FfWAx)35%G!?PP z*NbkPccYLMdS`f)rrKY&BpeO3@@`lUgB$5i6ARJGuUEkiZMDKyJ!<0RbbO~9b$TFG zKU<+wf)i%*sdk1L1*K*_?KaYkO(t#HH4z4rUF}*zt8qhU$@}t{FK&i8@vcizlw*|e zl3upb!$lT1$ub|Y{jJAMM(QAWmY$Y^I#lUTtv(xr>B26y3Cx9N8u2 zuq>n6Nd~5p$CZ5)3#6$wX(x@7qIRNs>|u!0n#R^24`wM9N1djobWyEFO^maxic^ll*6fRI@j!0|XUy7dKZ#syS=erHXxPGT@g-&+XWqnYG93$f1+Jx+ zlPUZEMGt0@SyObGBO!<4iJfe2e##2g9p_{F(?A95+r@FyKl(OQ>>Ix-bH(bJ3bwr_ zVn-U+!!AREkyg`M7h#(AJTcV%fO894y;dUcuFGlRlJ!m%<%mk>U3ce;VNiPR-V2tF z-aRWo?|y6LelBfcQ-zyvO`7h``Ed3Pj9h+b&~a)qGBsP)hxz%hHDKIo(Vsk)vlZ{9 z@K;^LbQ>s%@;I9u?ak+Y3PNuAE1h?)u6*ob{u1TpQ(}fjFLq~?eVuCs`lT}tc%fW| z=q*a6?=5ovP{3vsW7UaeCuH(zoKaFb%mHON_slHOO4JT(%y@Og9$r>+=c}Eg*HtZa z2bo3Rt-7VPn%N&=X8c7ZL|>gICjweSlEDV{O%C(n)Q8_Pgs6LsKYwr)`vAZvT>+Cs5DQ5O5{?O zQ~EmRfC0@h3-+eqcmT&V4f2ct(fcfL>+OX-|vSDtL#+i zkE%-T5E$82f87zY-Nv62Kn!MBH4tm8-Ia+sm~}ntIGG`IN2|4*_(FqWt!-6P)*efz zgX3iC&1tJA+vD|X*xGXe((;(Br8-K^eoi=6eN)i{pVtPnw#Z=>Q@vfau|yNxjT5nL z+--6|HV}jkJoE$EP~jqn7Nl;j9qRgdNGDpHF|Jcg-}fIUQ9EvC=_03oa{R1)%(vhs zd{2{LmEwEdV(8jLs3GBDhre5dX46oy`Es54a^4ehXntca`fg-#XPqXYY#*Y#MEy*} zLPTV1_qLzQr?Mx&>;asXF01rm5|5$HjSbp+DXbn_+6MX6j-IiKxZe6#l}|Qkw2N4| z6;Sxkj<={SwhFc=Zbq|9DE;%W`>FxfhH@4_flsW|w15$rbHU zeC4U1%=Wk3j19i-sd3e7{?s{NXg|8YAA!50XEn>7Ju}?BJJk^P^6)xkwp5}Cj-&aH z4Faae=E$zHWv?-V%S}{Q7>kqDE=w!Xusx#gjflc>c1qe%HPVD4Na2d}JFT2eGtR&b zptftwLPE!4m{Uw9Vx02X9!WRTmj2$i#GhtWrQ%JwGopD;1T-_$lvM}DOHn=4KP8~< zCJWkPi2pW3HC-F{E0f#q9j6h4r`x_j)?0f^ed-maN+75I%_4+5-{i%wU zde&UdaF@v*Q&gJAu%st;G(Hu9ojYu3>hMGb@)w_`^{@IvtP7&6TQ?%F>ghypD~HuI z)3~c}0*|R+2L;Ih>}f=(zj?{8poHGtK%WQS_Dp_<{pT&mHiI>VxL5XNErh+~fUCt` zRsZpiLpa4yDt9nmD%U;vH6qy2n#aIN<4(&twqOn5xSZ3N$|*?Y-u9{2`devaizx3KMWM#1Xd0*Bs+wO9Y z#KC&XtRyht=qqjx2LmzdVw@i(NNvP+?{4RyUDTP%T|ceo$;z?8Dx=^pyp^mNjEirW z&$xz4T3+}Vx$0q#$=&RIwf;p7s#_1#GhR;03jWa*|8}EkTG0|#JXGJ5ZN`i%4GHZT zgmZRk3CPETf7f=4*iMC6n4^uhN+WhJWsCj|9>*>Ir70W}z$mc-M7d+a2_{BmX7v{StO?Pa=~`^gpZT{G|W@ literal 0 HcmV?d00001 diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..61db9d0 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,782 @@ +# translation of gst-plugins-good.master.po to Basque +# Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-good package. +# +# Iñaki Larrañaga Murgoitio , 2009, 2010. +# Mikel Olasagasti Uranga , 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good-0.10.18.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-03-25 12:37+0100\n" +"Last-Translator: Mikel Olasagasti Uranga \n" +"Language-Team: Basque \n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not establish connection to sound server" +msgstr "Ezin izan da konexioa ezarri soinu-zerbitzariarekin" + +msgid "Failed to query sound server capabilities" +msgstr "Huts egin du soinu-zerbitzariaren ahalmena kontsultatzean" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' - '%s'" + +msgid "Internal data stream error." +msgstr "Datu-korrontearen barne-errorea." + +msgid "Failed to decode JPEG image" +msgstr "Huts egin du JPEG irudia deskodetzean" + +msgid "Could not connect to server" +msgstr "Ezin izan da konektatu zerbitzariarekin" + +msgid "Server does not support seeking." +msgstr "" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "Ezin izan da konektatu zerbitzariarekin" + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "Ezin izan da konexioa ezarri soinu-zerbitzariarekin" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" +"Ez dago audio-sarrerarik, edo baliogabea da. AVI korrontea hondatua egongo " +"da." + +msgid "This file contains no playable streams." +msgstr "Fitxategi horretan ez dago erreproduzi daitekeen korronterik." + +msgid "This file is invalid and cannot be played." +msgstr "Fitxategi hau ez da baliozkoa eta ezin da erreproduzitu." + +msgid "This file is corrupt and cannot be played." +msgstr "Fitxategi hau hondatua dago, eta ezin da erreproduzitu." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Fitxategi hau osatu gabea dago, eta ezin da erreproduzitu." + +msgid "The video in this file might not play correctly." +msgstr "" +"Litekeena da fitxategi honetako bideoa ez behar bezala erreproduzitzea." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Fitxategi horrek korronte gehiegi ditu. Erreproduzitu soilik lehen %d(r)ak" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Ez da onartutako korronterik aurkitu. GStreamer RTSP hedapena instalatu " +"beharko duzu Real multimediako korronteentzako." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Ez da onartutako korronterik aurkitu. Garraioko protokolo gehiago baimentzea " +"behar da edo GStreamer RTSP hedapen egokia falta zaizu." + +msgid "Internal data flow error." +msgstr "Datu-fluxuaren barne-errorea." + +msgid "Volume" +msgstr "Bolumena" + +msgid "Bass" +msgstr "Baxua" + +msgid "Treble" +msgstr "Altua" + +msgid "Synth" +msgstr "Sintetizadorea" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Bozgorailua" + +msgid "Line-in" +msgstr "Linea-sarrera" + +msgid "Microphone" +msgstr "Mikrofonoa" + +msgid "CD" +msgstr "CDa" + +msgid "Mixer" +msgstr "Nahastailea" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Grabazioa" + +msgid "In-gain" +msgstr "Sarrerako irabazia" + +msgid "Out-gain" +msgstr "Irteerako irabazia" + +msgid "Line-1" +msgstr "1. linea" + +msgid "Line-2" +msgstr "2. linea" + +msgid "Line-3" +msgstr "3. linea" + +msgid "Digital-1" +msgstr "1. digitala" + +msgid "Digital-2" +msgstr "2. digitala" + +msgid "Digital-3" +msgstr "3. digitala" + +msgid "Phone-in" +msgstr "Aurikularren sarrera" + +msgid "Phone-out" +msgstr "Aurikularren irteera" + +msgid "Video" +msgstr "Bideoa" + +msgid "Radio" +msgstr "Irratia" + +msgid "Monitor" +msgstr "Monitorea" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Ezin izan da audioaren gailua ireki erreproduzitzeko. Beste aplikazio batek " +"darabil gailua." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Ezin izan da audioaren gailua ireki erreproduzitzeko. Ez duzu baimenik " +"gailua irekitzeko." + +msgid "Could not open audio device for playback." +msgstr "Ezin izan da audioaren gailua ireki erreproduzitzeko." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Ezin izan da audioaren gailua ireki grabatzeko. Ez duzu baimenik gailua " +"irekitzeko." + +msgid "Could not open audio device for recording." +msgstr "Ezin izan da audioaren gailua ireki grabatzeko." + +msgid "Could not open audio device for mixer control handling." +msgstr "Ezin izan da audioko gailua ireki nahastailearen kontrola kudeatzeko." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Ezin izan da audioko gailua ireki nahastailearen kontrola kudeatzeko. " +"Elementu honek ez du onartzen Open Sound System-en bertsio hau." + +msgid "Master" +msgstr "Maisua" + +msgid "Front" +msgstr "Aurrealdekoa" + +msgid "Rear" +msgstr "Atzealdekoa" + +msgid "Headphones" +msgstr "Aurikularrak" + +msgid "Center" +msgstr "Erdikoa" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Inguratzailea" + +msgid "Side" +msgstr "Albokoa" + +msgid "Built-in Speaker" +msgstr "Barneko bozgorailua" + +msgid "AUX 1 Out" +msgstr "1. irteera lagungarria" + +msgid "AUX 2 Out" +msgstr "2. irteera lagungarria" + +msgid "AUX Out" +msgstr "Irteera lagungarria" + +msgid "3D Depth" +msgstr "3D sakonera" + +msgid "3D Center" +msgstr "3D zentrua" + +msgid "3D Enhance" +msgstr "3D hobetua" + +msgid "Telephone" +msgstr "Telefonoa" + +msgid "Line Out" +msgstr "Irteerako linea" + +msgid "Line In" +msgstr "Sarrerako linea" + +msgid "Internal CD" +msgstr "Barneko CDa" + +msgid "Video In" +msgstr "Bideo-sarrera" + +msgid "AUX 1 In" +msgstr "1. sarrera lagungarria" + +msgid "AUX 2 In" +msgstr "2. sarrera lagungarria" + +msgid "AUX In" +msgstr "Sarrera lagungarria" + +msgid "Record Gain" +msgstr "Grabazioaren irabazia" + +msgid "Output Gain" +msgstr "Irteeraren irabazia" + +msgid "Microphone Boost" +msgstr "Mikrofonoaren bultzada" + +msgid "Loopback" +msgstr "Atzera-begizta" + +msgid "Diagnostic" +msgstr "Diagnostikoa" + +msgid "Bass Boost" +msgstr "Baxuaren bultzada" + +msgid "Playback Ports" +msgstr "Erreprodukzioaren atakak" + +msgid "Input" +msgstr "Sarrera" + +msgid "Record Source" +msgstr "Grabazioaren iturburua" + +msgid "Monitor Source" +msgstr "Monitorearen iturburua" + +msgid "Keyboard Beep" +msgstr "Teklatuaren soinua" + +msgid "Simulate Stereo" +msgstr "Simulatu estereoa" + +msgid "Stereo" +msgstr "Estereoa" + +msgid "Surround Sound" +msgstr "Soinu inguratzailea" + +msgid "Microphone Gain" +msgstr "Mikrofonoaren irabazia" + +msgid "Speaker Source" +msgstr "Bozgorailuaren iturburua" + +msgid "Microphone Source" +msgstr "Mikrofonoaren iturburua" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Zentratua / LFE" + +msgid "Stereo Mix" +msgstr "Estereozko nahasketa" + +msgid "Mono Mix" +msgstr "Monozko nahasketa" + +msgid "Input Mix" +msgstr "Sarrerako nahasketa" + +msgid "SPDIF In" +msgstr "SPDIF sarrera" + +msgid "SPDIF Out" +msgstr "SPDIF irteera" + +msgid "Microphone 1" +msgstr "1. mikrofonoa" + +msgid "Microphone 2" +msgstr "2. mikrofonoa" + +msgid "Digital Out" +msgstr "Irteera digitala" + +msgid "Digital In" +msgstr "Sarrera digitala" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modema" + +msgid "Handset" +msgstr "Aurikular+mikrofonoa" + +msgid "Other" +msgstr "Bestelakoa" + +msgid "None" +msgstr "Bat ere ez" + +msgid "On" +msgstr "Piztu" + +msgid "Off" +msgstr "Itzali" + +msgid "Mute" +msgstr "Mututu" + +msgid "Fast" +msgstr "Bizkorra" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Oso motela" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Motela" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Tartekoa" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Altua" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Oso altua" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Ekoizpena" + +msgid "Front Panel Microphone" +msgstr "Aurrealdeko paneleko mikrofonoa" + +msgid "Front Panel Line In" +msgstr "Aurrealdeko paneleko sarrerako linea" + +msgid "Front Panel Headphones" +msgstr "Aurrealdeko paneleko aurikularrak" + +msgid "Front Panel Line Out" +msgstr "Aurrealdeko paneleko irteerako linea" + +msgid "Green Connector" +msgstr "Konektore berdea" + +msgid "Pink Connector" +msgstr "Konektore arrosa" + +msgid "Blue Connector" +msgstr "Konektore urdina" + +msgid "White Connector" +msgstr "Konektore zuria" + +msgid "Black Connector" +msgstr "Konektore beltza" + +msgid "Gray Connector" +msgstr "Konektore grisa" + +msgid "Orange Connector" +msgstr "Konektore laranja" + +msgid "Red Connector" +msgstr "Konektore gorria" + +msgid "Yellow Connector" +msgstr "Konektore horia" + +msgid "Green Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore berdea" + +msgid "Pink Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore arrosa" + +msgid "Blue Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore urdina" + +msgid "White Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore zuria" + +msgid "Black Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore beltza" + +msgid "Gray Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore grisa" + +msgid "Orange Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore laranja" + +msgid "Red Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore gorria" + +msgid "Yellow Front Panel Connector" +msgstr "Aurrealdeko paneleko konektore horia" + +msgid "Spread Output" +msgstr "Zabaldu irteera" + +msgid "Downmix" +msgstr "Tolestu nahasketa" + +msgid "Virtual Mixer Input" +msgstr "Nahastaile birtualaren sarrera" + +msgid "Virtual Mixer Output" +msgstr "Nahastaile birtualaren irteera" + +msgid "Virtual Mixer Channels" +msgstr "Nahastaile birtualaren kanalak" + +#. TRANSLATORS: name + number of a volume mixer control +#, fuzzy, c-format +msgid "%s %d Function" +msgstr "%s funtzioa" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s funtzioa" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Ezin izan da audioaren gailua ireki erreproduzitzeko. Elementu honek ez du " +"onartzen Open Sound System-en bertsio hau." + +msgid "Playback is not supported by this audio device." +msgstr "Audio gailu honek ez du erreproduzitzea onartzen." + +msgid "Audio playback error." +msgstr "Errorea audioa erreproduzitzean." + +msgid "Recording is not supported by this audio device." +msgstr "Audio gailu honek ez du grabatzea onartzen." + +msgid "Error recording from audio device." +msgstr "Errorea audioko gailutik grabatzean." + +msgid "Gain" +msgstr "Irabazia" + +msgid "Headphone" +msgstr "Entzungailua" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Errorea gertatu da '%2$s' gailuan %1$d byte irakurtzean." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Ustekabeko fotograma-tamaina jaso da (%u), %u ordez." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Errorea gertatu da '%2$s' gailuan %1$d byte irakurtzean." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Errorea gertatu da '%s' gailuaren ahalmena eskuratzean: Ez da v4l2 " +"kontrolatzaile bat. Begiratu v4l1 kontrolatzaile bat den." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Huts egin du %2$s gailuko %1$d. sarreraren atributuak kontsultatzean" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"Huts egin du '%2$s' gailuko %1$d. sintonizadorearen ezarpenak eskuratzean." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Huts egin du '%s' gailuaren araua kontsultatzean." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Huts egin dut '%s' gailuaren kontrol-atributuak eskuratzean." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Ezin da '%s' gailua identifikatu." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Hau ez da '%s' gailu bat." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Ezin izan da '%s' gailua ireki irakurtzeko eta idazteko." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "'%s' gailua ez da kaptura-gailu bat." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "'%s' gailua ez da irteerako gailu bat." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Huts egin du '%s' gailuaren araua ezartzean." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Huts egin du '%s' gailuaren uneko sintonizazio-frekuentzia eskuratzean." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Huts egin du '%s' gailuaren uneko sintonizazio-frekuentzia %lu Hz-tan " +"ezartzean." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Huts egin du '%s' gailuaren seinalearen indarra eskuratzean." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Huts egin du '%2$s' gailuko %1$d. kontrolaren balioa eskuratzean." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Huts egin du '%3$s' gailuko %2$d. kontrolaren %1$d. balioa eskuratzean." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Huts egin du '%s' gailuko uneko sarrera eskuratzean. Litekeena da irrati-" +"gailu bat izatea." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Huts egin du '%2$s' gailuko %1$d. sarrera ezartzean." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Huts egin du '%s' gailuko uneko sarrera eskuratzean. Litekeena da irrati-" +"gailu bat izatea." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Huts egin du '%2$s' gailuko %1$d. sarrera ezartzean." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Ezin izan dira bufferrak ilaran jarri '%s' gailuan." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Huts egin du '%s' gailutik bideo-fotogramak eskuratzen saiatzean." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Huts egin du %d saio eta gero. %s gailua. Sistema-errorea: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Ezin izan dira '%s' gailuaren parametroak eskuratu" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Bideoaren sarrerako gailuak ez du fotograma-tamainaren ezarpen berria " +"onartzen." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Ezin izan dira '%s' gailuaren bufferrak mapatu." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"'%s' gailuaren kontrolatzaileak ez du onartzen kaptura-metodo ezagunik." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Oraindik ez dago onartua exekutatu bitartean bereizmena aldatzea." + +msgid "Cannot operate without a clock" +msgstr "Ezin du funtzionatu erlojurik gabe" + +#~ msgid "Describes the selected input element." +#~ msgstr "Sarrerako elementu hautatua deskribatzen du." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "" +#~ "Audio-/Bideo-konferentziak egiteko irteerako elementu hautatua " +#~ "deskribatzen du." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "Musikaren eta filmen irteerako elementu hautatua deskribatzen du." + +#~ msgid "Describes the selected output element." +#~ msgstr "Irteerako elementu hautatua deskribatzen du." + +#~ msgid "GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "Audio-/Bideo-konferentziak egiteko GStreamen audio-kolektorea" + +#~ msgid "GStreamer audiosink for Music and Movies" +#~ msgstr "Musikaren eta filmen GStreamer audio-kolektorea" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "Hainbat irteerako elementu erabiliz erreproduzi dezake audioa GStreamer-" +#~ "ek. Hala nola osssink, esdsink eta alsasink. Audio-kolektorea kanalizazio " +#~ "partzial bat izan daiteke, elementu bat izan beharrean." + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "Hainbat irteerako elementu erabiliz erreproduzi dezake bideoa GStreamer-" +#~ "ek. Hala nola xvimagesink, ximagesink, sdlvideosink eta aasink. Bideo-" +#~ "kolektorea kanalizazio partzial bat izan daiteke, elementu bat izan " +#~ "beharrean." + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "Kanalizazioetan bistaratzeko pluginak jar ditzake GStreamer-ek, audio-" +#~ "korronteak bideo-fotograma bihurtzeko. Goom da lehenetsia, baina laster " +#~ "izango da bistaratzeko plugin gehiago. Bistaratzeko plugina kanalizazio " +#~ "partzial bat izan daiteke, elementu bat izan beharrean." + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "Hainbat sarrerako elementu erabiliz graba dezake audioa GStreamer-ek. " +#~ "Hala nola osssrc, esdsrc eta alsasrc. Audio-iturburua kanalizazio " +#~ "partzial bat izan daiteke, elementu bat izan beharrean." + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "Hainbat sarrerako elementu erabiliz graba dezake bideoa GStreamer-ek. " +#~ "Hala nola v4lsrc eta videotestsrc. Bideo-iturburua kanalizazio partzial " +#~ "bat izan daiteke, elementu bat izan beharrean." + +#~ msgid "default GStreamer audio source" +#~ msgstr "GStreamer audio-iturburu lehenetsia" + +#~ msgid "default GStreamer audiosink" +#~ msgstr "GStreamer audio-kolektore lehenetsia" + +#~ msgid "default GStreamer video source" +#~ msgstr "GStreamer bideo-iturburu lehenetsia" + +#~ msgid "default GStreamer videosink" +#~ msgstr "GStreamer bideo-kolektore lehenetsia" + +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "GStreamer bistaratzeko plugin lehenetsia" + +#~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "" +#~ "Audio-/Bideo-konferentziak egiteko GStreamen audio-kolektorearen " +#~ "deskribapena" + +#~ msgid "description for GStreamer audiosink for Music and Movies" +#~ msgstr "Musikaren eta filmen GStreamer audio-kolektorearen deskribapena" + +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "GStreamer audio-kolektore lehenetsiaren deskribapena" + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "GStreamer audiosrc lehenetsiaren deskribapena" diff --git a/po/fi.gmo b/po/fi.gmo new file mode 100644 index 0000000000000000000000000000000000000000..d22480c26fcffae206e8bb9c7e41db62214ce283 GIT binary patch literal 14534 zcmchd3y>vMdB3WZIp6tS=R4o*_nva{yFISYL(hPIwa)W?34ZrU{BV8c49`0q{5w#O z{uw+K{1JEx_z?J8;4i`T;K@(+yeq*oKs|pksD87q-Er+j@CiJBHTXpE4d6N8+rg8; zkANEQV<1C&p8hK1KH-YN+Mo|530rmau?)?WGE`j3nZcz4l z)ZsEHyZ$<;^*#V%n%+a8_D*Y38?YsLGj%ICD#PhJUvi)cs)1--s;+40;RWafa2??pyvHK_)PF& z(16dRfs1(CL5)8RO0L&|l3xoHUn!`0UIS|WTR`#m9#G?d2vonjLGk-JQ1jgf?gsA% z#ormGh#%X*QQA%LdEke^8u*W{{VP!XZ+uoU-wsgY?E^L6VNmm2=h{Aa8SMp7{;~wh zkM0HKM_&WQ_m4oW?I;i&>LCwD#6hGsj z^l%Nh4V(ofhdV*Z=N{L-*R}5lWzXLNHO>z}@%a-_>v(ybL@Eya9X;_)1WG-U+S)zW|EAFM;Ck>maK4PQRdt+cl6!UI0oDZwBk&QBd*m zU%^Yj^EToe-~=c=eFdBb{|i)nAKz5O_b-Bqm*-wswD*HMXx|C)%KITGK2K#bmg)_G zlE>Ac>~IE@KVJ`Oy>D`OyTgxyTF+;}2Dl80-%S@4cnyf^yqm$@;9a2N?!SY$n)lqz z*bKN6lsxVLF9*L1DlVVL;>7NgHP3B1PPEO;jE7}R=i0?z<%0X5GD9exzl z_xHH>p98hN`$3KOO;B?C7jO#vZ}3y#L6q489|qO0hw{YV>p_k87Etrv21?E!0k!@w zxc7hS@bBI8Z-ZLbcR+pjeeg{1KS0UvaTgbH_B>E>zYN5syfIMxc0hf<2uh!?0L8~m zp!D`;Q0u=P)OUBe_SZqh$M1uh_ZOh_atg-22|ODV|Jy))Hw|k1SAtIlUjs^>w}P7I zeW1p<3zR(m3eG!G}QE|Huo9I1+=qXulVPHSc?19Xt!C zqN}$Pls{e%N-np7;_Jf>KMiW0FN2cDS3&-H-{MDc`?O1o^<4-`4m&}~{UxBri9p52 z8(sUou6;L1c=uiieHi*6r0c~6*cf;-_gA`h6%rbELx12N-UD6_%|my(X9CST27Mkn z57Nc7*4`xB>h)e4`=RGRABB!U(u1ydK<7X+(EA`=e-8Zx6hbvfI@S8$4oRNB3mt`C z3YFK@+-!G^SmrwUfO%giADM2{5lDe zeZCr!oxKEl6{HK3@!kVXtHJew0_^^ix%=0Hmq8ao=R&W9J^}59o(=sTv>Ey{NY^V0 z@ZJjUfj$NO5p))$>)p^T&}X1GKy7FgdJ2?6kK`4h8RW_wtJ^?*7f-0wf>T^&037dx!6Xr$C3HmU|}H3Ec)M zUUVQ`Hx*#_!Y6WnqibIQUgz#l1wZNTOK5O&5V{@uQz(bdgmeu<7eR-hP0;J07eF6} z-UKZ{e+cb>y3n;yd5v(h6}lMOrH30*v!P+e@@O^-<4Dc^{l*RHMl;hhLT~GCvnz_ozvt|aDA8ipwaHty&YG-$PAnPk-IsRXZCKSd^BRpN3M@;=8Z5m-L~JG@n;%(cDD6$S21&(xb|2QN12)MqoBRwT^_7%9;as>wzFConaOV8w-C^- z-QF%gisH6pFk8&Qu|3`{ z#5^BH^Ck(>xSdN?#?MTWGkhm7VQMs8FUU-qce`Z^%K7nU|*?WZ50kG ztakivpUt@>?i{BZf<-#kBHTE0m|-WpUKWV1lele=XQPckt6V>(@61#asbkcsbP>;4 zqdugWC+#99dubMQO3n1OB7e&CWzY^f7{`g{FOB*!^u#}{xiQU5AgjscbHLfPbXIR-HZ_1U;CP!2rFG8 zODUh-p+6rH2*X)#cQ_wrep^Acyj2`^_qE~v-AMm#tG7Eo65&SP9vkEFTCp!q{F$)L zT7uNBv9jh-v!5uKN`byvytqAL8cB%L)XlDDKr9aDOsEdU+u`!9o1qjI8`MlM)99<5 zzJ9!pD?`Yjo6~ZGGaR#_f2w)Y-Vmekdd^Xs#23lbq#Wzu$bRL2AqElMgnO0bIWs!)auay%> zQ#NN>Lj5*>c%*d!6DhIM%;wUzf(m27;yDBzUA3n(5 zM%KeU<{d^@aVY;)jI;50v)M7d-v$vRbR=xI73K)rN!~3!8>CWBj7NNJJ0zBMyH$74 zR>pB8AcV)pZ%YfEn4L09{3um!Y`RID#j|mn@JwEaQQ55MNSKlZ2PBGQ7;+Udi^LAL zchV}1@OgM@a>4}HXF+6>kZwCCE4Qn8Y;4K0VU2C?1Y=w8J{(|Q9kl5?!4NR6!VSGc zb93II$UDT!=BuX__h4;5`X$sLEt`M!X3i!Nb>7?aZX+hV>SX4YjO_<4 zIP7;wwZqR4;uJA>N?7Knlecv+oWzNP*ej2f4$I|Ec9kCKFsy)7_O+i_mzyMikXLx+ zO>r>sCVLTQ_bJXFMI@e50&SBr#o5Y+L*l)Pdq3)#Rzwom&ptV^HDivN8l>1$*oy7> zW{zwMSF*l{0CbA6Zp=Afr+j;quzhC9ntc2LIoVzuG0A_e!(rxY^vmKHr-hZWlQ|T% zd-hu?e=bbYj0CRoDfZwZh|Rlai^DmtF0OP^9?U}5Fq(}!-8N^@N7uUuVM^$aGjN&z zR%FYRNx(wAX=OEbgRyst-qYHfi(eU?ZMq2QMraT+WmW#{EQJ_i-4VBU+Ij+(SR5;+ z!z9az95zssaI@^7oibqcaj~DReCBLwno2__@UCfwh+^Omxi+xzcF@^9Si3il zzJNW{_BU#*UJ-TF%%@qc2&-vrK8_n^s6ISYA9;R#>-xiiqIYdPoevweo%wuPn~FzG zGt0W8Tei&P^Ea?t_;pS=9Gc=}e#`oaLsPX~c!|!rwcWVXs2Ld=9;pqD)JBHQ(9r1c z&_zRBbgUib$Se*9{f278!?oc{%*fW!p{*AUjnMBP8*6P!`v?viC!=O6?sP&kjs1o# zen>j5u#f7MN87_zSf2}D$k)+)PNH9%V)q|4V__7jm~w^Pm>5vAlkaqDbK!Q%ELmD7 zD`guc!J7~26xaqsjAG{N$M=u#83=B;KC~XWvo*nDugh99HmWU{co#4w{42dv$mPx z3ol>q3W&8V4m)9##cB^4KX~;AHl+L*Kgn1Tg)-li&!`{PT0zmnrrkc_)aJ&;~dK_8FIDxx$2Qi?;J)G(>c zXDiubpYWYkjBmm=G1Ii`3ySyX;9I`g zg2i{q-bFIi59^P`#~!3cZxPvLCjn?1U7}ksR9|H4#3Qx&A-DGgHe;9pvMx ziCHKCXPm1Mn&gJ-5Y%A$n93xITV6WRyw>KmkVU_hhL5qgIVdUUXU(EZnRi#${wYwJ)P~t4Y9Q#0bd5Mw<9I}%# zd5@xV&${5k@>08n8IRiF7EsXKY$+(T*eNf6qg5#{{WM8qU3H3a#{~s^%y5XqKSGd;wiV6iL__ zY+8Ro9}^ z%B*%eY$n?V-L5tYSB-TlI4ETlVz;+NNp`_! zvnkqJ3$*&0@=4pNCboJRi9FsxZI;3xsik$4eucJF*?6fuTc34LZF$z+4^A6p&!URg z|B&3gNfC**GEG~a4LTu*DQtn_R6e*XdzLj?j;w?{d)UzFfl}?Ln6v>92hF20zfou= zvSam?*Gc3x$Bi=oYKgUFV0Ybb!Yi!=f)Eu6~@?S znV@5H{(i}K)g(nyY(pr@OGBf&Z_UjymUQ;DgO;KHv%j4&D0ET#*J9A?s1piED*A zT%mX(Z>rX^#^!3%-%?*4`3D|iOAv)SEB9CY%s2u_iDA$n+mDrL69+g&u{bK7MN(Fz zacu7#!SOPC>Sw|7O8tSQ{8-aj(aYR9P}-&WL>wDDtb_Es7X2(+3KKfTE5fJ~rEq;& zgd#RZ{W+&Y?uqJ((y`;U2xs)Qk&4NcYo=PN$}KBct?;NA=(B&W(I2l?JwvCaKA$#Z zIxWkSj-93Yl{@bj;a6En&`&Wam>`uxeaaw|aw%Z3%iA4w@Ssy{LNI0(#z7^ rJ2%;}FA5uV1-E{Z%u&s6w>T9tLYZRp9~|SK2UOmv_8mMprtkj&c2}4= literal 0 HcmV?d00001 diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..7363d97 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,793 @@ +# This file is distributed under the same license as the gst-plugins-good package. +# Finnish messages for gst-plugins-good. +# Copyright (C) 2009-2010 Tommi Vainikainen. +# Copyright (C) 2007 Ilkka Tuohela. +# Suomennos: http://gnome.fi/ +# +# Tommi Vainikainen , 2009-2010. +# Ilkka Tuohela , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.25.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-11-17 23:03+0200\n" +"Last-Translator: Tommi Vainikainen \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not establish connection to sound server" +msgstr "Yhteyttä äänipalvelimeen ei voitu avata" + +msgid "Failed to query sound server capabilities" +msgstr "Äänipalvelimen ominaisuuksia ei voitu selvittää" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "”%s” artistilta ”%s”" + +msgid "Internal data stream error." +msgstr "Sisäisen tietovirran virhe." + +msgid "Failed to decode JPEG image" +msgstr "JPEG-kuvan purku epäonnistui" + +msgid "Could not connect to server" +msgstr "Palvelimeen ei saatu yhteyttä" + +msgid "Server does not support seeking." +msgstr "Pavelin ei tue kelausta." + +msgid "Could not resolve server name." +msgstr "Palvelimen nimeä ei saatu selvitettyä." + +msgid "Could not establish connection to server." +msgstr "Yhteyttä palvelimeen ei voitu avata." + +msgid "Secure connection setup failed." +msgstr "Turvallisen yhteyden avaus epäonnistui." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Tapahtui verkkovirhe tai palvelin sulki yhteyden yllättäen." + +msgid "Server sent bad data." +msgstr "Palvelin lähetti virheellistä dataa." + +msgid "No URL set." +msgstr "Ei URL:ää asetettuna." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" +"Ääntä ei ole tai äänilähde on viallinen, AVI-virta tulee olemaan " +"vaurioitunut." + +msgid "This file contains no playable streams." +msgstr "Tiedosto ei sisällä soitettavia virtoja." + +msgid "This file is invalid and cannot be played." +msgstr "Tiedosto on virheellinen eikä sitä voida esittää." + +msgid "This file is corrupt and cannot be played." +msgstr "Tiedosto on vioittunut eikä sitä voida näyttää." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Tiedosto on vajaa eikä sitä voida esittää." + +msgid "The video in this file might not play correctly." +msgstr "Tiedostossa olevaa videota ei ehkä voida näyttää oikein." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Tiedosto sisältää useita virtoja. Soitetaan vain ensimmäiset %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Tuettua virtaa ei löytynyt. Kenties sinun tarvitsee asentaa GStreamer-RTSP-" +"laajennus käyttääksesi Real-media-virtoja." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Tuettua virtaa ei löytynyt. Sinun kenties tarvitsee sallia useampia " +"siirtoprotokollia, tai vaihtoehtoisesti sinulta saattaa puuttua oikea " +"GStreamer-RTSP-laajennusliitännäinen." + +msgid "Internal data flow error." +msgstr "Sisäisen tietovirran virhe." + +msgid "Volume" +msgstr "Äänenvoimakkuus" + +msgid "Bass" +msgstr "Basso" + +msgid "Treble" +msgstr "Ylä-äänet" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Kaiutin" + +msgid "Line-in" +msgstr "Linjatulo" + +msgid "Microphone" +msgstr "Mikrofoni" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mikseri" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Nauhoitus" + +msgid "In-gain" +msgstr "Gain-sisään" + +msgid "Out-gain" +msgstr "Gain-ulos" + +msgid "Line-1" +msgstr "Linja-1" + +msgid "Line-2" +msgstr "Linja-2" + +msgid "Line-3" +msgstr "Linja-3" + +msgid "Digital-1" +msgstr "Digitaalinen-1" + +msgid "Digital-2" +msgstr "Digitaalinen-2" + +msgid "Digital-3" +msgstr "Digitaalinen-3" + +msgid "Phone-in" +msgstr "Levysoitintulo" + +msgid "Phone-out" +msgstr "Levysoitinlähtö" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Tarkkailu" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Äänilaitetta ei voitu avata toistettavaksi. Laite on toisen sovelluksen " +"käytössä." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Äänilaitetta ei voitu avata toistamista varten. Laitteen avaamiseen ei ole " +"oikeuksia." + +msgid "Could not open audio device for playback." +msgstr "Äänilaitetta ei voitu avata toistettavaksi." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Äänilaitetta ei voitu avata nauhoitusta varten. Laitteen avaamiseen ei ole " +"oikeuksia." + +msgid "Could not open audio device for recording." +msgstr "Äänilaitetta ei voitu avata nauhoitusta varten." + +msgid "Could not open audio device for mixer control handling." +msgstr "Äänilaitetta ei voitu avata mikserinhallintaa varten." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Äänilaitetta ei voitu avata mikserinhallintaa varten. Tämä elementti ei tue " +"tätä versiota Open Sound Systemistä." + +msgid "Master" +msgstr "Pää" + +msgid "Front" +msgstr "Etu" + +msgid "Rear" +msgstr "Taka" + +msgid "Headphones" +msgstr "Kuulokkeet" + +msgid "Center" +msgstr "Keski" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Sivu" + +msgid "Built-in Speaker" +msgstr "Sisäänrakennettu kaiutin" + +msgid "AUX 1 Out" +msgstr "AUX 1 ulos" + +msgid "AUX 2 Out" +msgstr "AUX 2 ulos" + +msgid "AUX Out" +msgstr "AUX ulos" + +msgid "3D Depth" +msgstr "3D-syvyys" + +msgid "3D Center" +msgstr "3D-keski" + +msgid "3D Enhance" +msgstr "3D-tehostus" + +msgid "Telephone" +msgstr "Puhelin" + +msgid "Line Out" +msgstr "Linja ulos" + +msgid "Line In" +msgstr "Linjatulo" + +msgid "Internal CD" +msgstr "Sisäinen CD" + +msgid "Video In" +msgstr "Videotulo" + +msgid "AUX 1 In" +msgstr "AUX 1 sisään" + +msgid "AUX 2 In" +msgstr "AUX 2 sisään" + +msgid "AUX In" +msgstr "AUX sisään" + +msgid "Record Gain" +msgstr "Nauhoitusgain" + +msgid "Output Gain" +msgstr "Gain-ulos" + +msgid "Microphone Boost" +msgstr "Mikrofonitehostin" + +msgid "Loopback" +msgstr "Takaisinkytkentä" + +msgid "Diagnostic" +msgstr "Diagnosointi" + +msgid "Bass Boost" +msgstr "Bassotehostin" + +msgid "Playback Ports" +msgstr "Toistoportit" + +msgid "Input" +msgstr "Sisään" + +msgid "Record Source" +msgstr "Nauhoituslähde" + +msgid "Monitor Source" +msgstr "Tarkkailulähde" + +msgid "Keyboard Beep" +msgstr "Näppäimistöpiippaus" + +msgid "Simulate Stereo" +msgstr "Simuloitu stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Surround-ääni" + +msgid "Microphone Gain" +msgstr "Mikrofoni-gain" + +msgid "Speaker Source" +msgstr "Kaiutinlähde" + +msgid "Microphone Source" +msgstr "Mikrofonilähde" + +msgid "Jack" +msgstr "Pistoke" + +msgid "Center / LFE" +msgstr "Keski / LFE" + +msgid "Stereo Mix" +msgstr "Stereo Mix" + +msgid "Mono Mix" +msgstr "Mono Mix" + +msgid "Input Mix" +msgstr "Sisään Mix" + +msgid "SPDIF In" +msgstr "SPDIF sisään" + +msgid "SPDIF Out" +msgstr "SPDIF ulos" + +msgid "Microphone 1" +msgstr "Mikrofoni 1" + +msgid "Microphone 2" +msgstr "Mikrofoni 2" + +msgid "Digital Out" +msgstr "Digitaalinen ulos" + +msgid "Digital In" +msgstr "Digitaalinen sisään" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modeemi" + +msgid "Handset" +msgstr "Kuulokkeet" + +msgid "Other" +msgstr "Muu" + +msgid "None" +msgstr "Ei mikään" + +msgid "On" +msgstr "Päällä" + +msgid "Off" +msgstr "Poissa" + +msgid "Mute" +msgstr "Vaimennettu" + +msgid "Fast" +msgstr "Nopea" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Erittäin matala" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Matala" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Medium" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Korkea" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Erittäin korkea" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Tuotanto" + +msgid "Front Panel Microphone" +msgstr "Etupaneelin mikrofoni" + +msgid "Front Panel Line In" +msgstr "Etupaneelin linjatulo" + +msgid "Front Panel Headphones" +msgstr "Etupaneelin kuulokkeet" + +msgid "Front Panel Line Out" +msgstr "Etupaneelin linja ulos" + +msgid "Green Connector" +msgstr "Vihreä liitin" + +msgid "Pink Connector" +msgstr "Vaaleanpunainen liitin" + +msgid "Blue Connector" +msgstr "Sininen liitin" + +msgid "White Connector" +msgstr "Valkoinen liitin" + +msgid "Black Connector" +msgstr "Musta liitin" + +msgid "Gray Connector" +msgstr "Harmaa liitin" + +msgid "Orange Connector" +msgstr "Oranssi liitin" + +msgid "Red Connector" +msgstr "Punainen liitin" + +msgid "Yellow Connector" +msgstr "Keltainen liitin" + +msgid "Green Front Panel Connector" +msgstr "Vihreä etupaneeliliitin" + +msgid "Pink Front Panel Connector" +msgstr "Vaaleanpunainen etupaneeliliitin" + +msgid "Blue Front Panel Connector" +msgstr "Sininen etupaneeliliitin" + +msgid "White Front Panel Connector" +msgstr "Valkoinen etupaneeliliitin" + +msgid "Black Front Panel Connector" +msgstr "Musta etupaneeliliitin" + +msgid "Gray Front Panel Connector" +msgstr "Harmaa etupaneeliliitin" + +msgid "Orange Front Panel Connector" +msgstr "Oranssi etupaneeliliitin" + +msgid "Red Front Panel Connector" +msgstr "Punainen etupaneeliliitin" + +msgid "Yellow Front Panel Connector" +msgstr "Keltainen etupaneeliliitin" + +msgid "Spread Output" +msgstr "Levitetty ulos" + +msgid "Downmix" +msgstr "Alasmiksaus" + +msgid "Virtual Mixer Input" +msgstr "Virtuaalinen mikseritulo" + +msgid "Virtual Mixer Output" +msgstr "Virtuaalinen mikseri ulos" + +msgid "Virtual Mixer Channels" +msgstr "Virtuaaliset mikserikanavat" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d -toiminto" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s -toiminto" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Äänilaitetta ei voitu avata toistamista varten. Tämä elementti ei tue tätä " +"versiota Open Sound Systemistä." + +msgid "Playback is not supported by this audio device." +msgstr "Tämä äänilaite ei tue toistamista." + +msgid "Audio playback error." +msgstr "Äänentoistovirhe." + +msgid "Recording is not supported by this audio device." +msgstr "Tämä äänilaite ei tue nauhoitusta." + +msgid "Error recording from audio device." +msgstr "Virhe luettaessa äänilaitteelta." + +msgid "Gain" +msgstr "Herkkyys" + +msgid "Headphone" +msgstr "Kuulokkeet" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Virhe luettaessa %d tavua laitteelta ”%s”." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Saatiin odottamaton kehys kooltaan %u odotetun %u sijaan." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Virhe luettaessa %d tavua laitteelta ”%s”." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Virhe haettaessa laitteen ”%s” ominaisuuksia: se ei ole v4l2-ajuri.Tarkista, " +"onko se v4l1-ajuri." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Lähteen %d ominaisuuksia laitteelta %s ei voitu kysyä" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Virittimen %d asetuksia ei voitu lukea laitteelta ”%s”." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Laitteen ”%s” videostandardia ei voitu kysyä." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Laitteen ”%s” ohjainattribuutteja ei voitu lukea." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Laitetta ”%s” ei voi tunnistaa." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Tämä ei ole laite ”%s”." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Laitetta ”%s” ei voitu avata luettavaksi ja kirjoitettavaksi." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Laitteelta ”%s” ei voi kaapata." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Laite ”%s” ei ole ulostulolaite." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Laitteen ”%s” videostandardia ei voitu asettaa." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Nyt viritettyä taajuutta ei voitu lukea laitteelta ”%s”." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "Laitteen ”%s” virittimen taajutta ei voitu asettaa arvoon %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Laitteelta ”%s” ei saatu signaalinvoimakkuutta." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Ohjaimelle %d ei saatu arvoa laitteelta ”%s”." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Arvoa %d ei voitu asettaa ohjaimelle %d laitteella ”%s”." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Laitteen ”%s” tämänhetkistä sisääntuloa ei voitu lukea, se ei ehkä ole " +"radiolaite" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Sisääntuloa %d ei voitu asettaa laitteelle %s." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Laitteen ”%s” tämänhetkistä sisääntuloa ei voitu lukea, se ei ehkä ole " +"radiolaite" + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Sisääntuloa %d ei voitu asettaa laitteelle %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Puskureita ei voitu laittaa jonoon laitteella ”%s”." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Videoruutujen noutaminen laitteelta ”%s” epäonnistui." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Epäonnistui %d yrityksen jälkeen: laite %s, järjestelmävirhe: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Laitteelta ”%s” ei voitu saada parametreja" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Videosyötelaite ei hyväksy uutta kehysnopeusasetusta." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Puskereita laitteelta ”%s” ei voitu kartoittaa" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Laitteen ”%s” ajuri ei tue mitään tunnettua kaappaustapaa." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Resoluution vaihto käytön aikana ei ole vielä mahdollista." + +msgid "Cannot operate without a clock" +msgstr "Ei voitu toimia ilman kelloa" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "Puskurityyppi ei ole tuettu, indeksi on rajojen ulkopuolella, puskureita " +#~ "ei ole vielä varattu tai käyttäjän osoitin tai pituus ovat virheelliset. " +#~ "laite %s" + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "muisti ei riitä käyttäjän osoitinpuskurin jonoon lisäämiseen. laite %s" + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "Vapaita puskureita ei löytynyt indeksillä %d." + +#~ msgid "Could not read from CD." +#~ msgstr "CD-levyltä ei voitu lukea." + +#~ msgid "Disc is not an Audio CD." +#~ msgstr "Levy ei ole ääni-CD." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Tiedosto on salattu eikä sitä voida näyttää." + +#~ msgid "Describes the selected input element." +#~ msgstr "Kuvaa valitun lähde-elementin." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "Kuvaa ääni- ja videoneuvotteluille valitun ulostuloelementin." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "Kuvaa musiikille ja elokuville valitun ulostuloelementin." + +#~ msgid "Describes the selected output element." +#~ msgstr "Kuvaa valitun ulostuloelementin." + +#~ msgid "GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "GStreamer-ääninielu ääni- ja videoneuvotteluille" + +#~ msgid "GStreamer audiosink for Music and Movies" +#~ msgstr "GStreamer-ääninielu äänelle ja elokuville" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer voi soittaa ääntä käyttäen useita eri nieluelementtejä. " +#~ "Muutamia vaihtoehtoja ovat osssink, esdsink ja alsasink. Ääninielu voi " +#~ "olla myös liukuhihnan osa eikä vain yksi elementti." + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer voi toistaa videota käyttäen useita eri nieluelementtejä. " +#~ "Muutamia vaihtoehtoja ovat xvimagesink, ximagesink, sdlvideosink ja " +#~ "aasink. Videonielu voi olla myös liukuhihnan osa eikä vain yksi elementti." + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "Gstreamer voi laittaa visualisointiliitännäisiä liukuhihnalle, jolle se " +#~ "muuntaa äänivirran videoruuduiksi. Oletusliitännäinen on goom, mutta " +#~ "muita ollaan lisäämässä pian. Visualisoinnin liitännäinen voi olla myös " +#~ "liukuhihnan osa eikä vain yksi elementti." + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer voi nauhoittaa ääntä käyttäen useita eri lähde-elementtejä. " +#~ "Muutamia vaihtoehtoja ovat osssrc, esdsrc ja alsasrc. Äänilähde voi olla " +#~ "myös liukuhihnan osa eikä vain yksi elementti." + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer voi nauhoittaa videota käyttäen useita eri lähde-elementtejä. " +#~ "Muutamia vaihtoehtoja ovat v4lsrc ja videotestsrc.. Videolähde voi olla " +#~ "myös liukuhihnan osa eikä vain yksi elementti." + +#~ msgid "default GStreamer audio source" +#~ msgstr "GStreamerin oletusäänilähde" + +#~ msgid "default GStreamer audiosink" +#~ msgstr "GStreamerin oletusääninielu" + +#~ msgid "default GStreamer video source" +#~ msgstr "GStreamerin oletusvideolähde" + +#~ msgid "default GStreamer videosink" +#~ msgstr "GStreamerin oletusvideonielu" + +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "Gstreamerin visualisointien oletusliitännäinen" + +#~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "kuvaus ääni- ja videoneuvottelun GStreamer-ääninielulle" + +#~ msgid "description for GStreamer audiosink for Music and Movies" +#~ msgstr "kuvaus musiikin ja elokuvien GStreamer-ääninielulle" + +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "GStreamerin oletusääninielun kuvaus" + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "GStreamerin oletusäänilähteen kuvaus" diff --git a/po/fr.gmo b/po/fr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c61c1ad2f95da8f93029cf0bfc3d749fbab0b1f3 GIT binary patch literal 16175 zcmd6t3y>T~dB?|K8(YSJUp$O~<{_Vrb*HBN}Zg*~P?u93MvJLA_F{!R8XSeI-~_w|-r(+k5USh*F8`3re*sdJ_f_~b_;q+5{1!YJ z{s`)OkHcreU%}_YGtbJ~b1^)h{07J)ZwfvIR-yV)gD-?{fvV>|sCM5E*TaXQzV~17 zVtCrwIfvl@`B%d}cn7=?ehR(9o`OK4!;L)gs0KD zbpFy>I&GYj9Uk|S)|3;|$ zk3jY3`*1Zpg+aO$UIK0Zp~m+fcnbUgq>0`khzPxhAtLks&fWhPsPaFBYR@mB^zjlp z!KJqmNMP~~<(mAe`0{fc{DbBv(cn?dRA zn;h?i()SNQ_4@&c3VWY}>c`(ZeiN#m$Dri(eW?2W8>;<3hwA6Ap~ijH3m9uS0u%Uc zsB+h$tZLs*DErzCRsRi;SG`%NdT)pN{vA-?y&LMiL+<&9-1GaP(fy6ei8D|`x^fl z_(O=vd8^3i`vyv`tD)p~DO5W*LDe$>RsYRU?en3&UxzA}LCNDSQ1!h7j={U3+V>dj zgR5SQ?!saCa@c_V@O>`-6{z+Kj+x$9m2bx`A0hmzj`h)eNqgKFQsQ0=`Bs-2&K27cA$f9Uc*hbnjeg}Gj? zh4M4QkbmAR|D6io1!X_)g?r(BkXOB5z}?U=80%pMH6HiF5%}-$D%f`sz6H*}2jC;{ zN;rG5=gq+n!@J-G4B~C@6L2$JcZuh{9nQgV=&i}e`5Jf)*$j@tFG0!SWCmaU<(W|S z{1W(dxZZKZ@j57ZzY4w;*5TFg$Byd<^7=Elh5Mg@lknG&A@wFOt_U_A{~6v){yLOX z@>qa+@7HhwjxiZ*gYSV?z{lXV@VsHqdoA>#^zKVg{rQE~z`J{Ijls z9j}H@BY!P?2Ap#FX?QOAeNg3Zg_6@d96t`_pS}V0{U1TS|2TXqJn6DrzfXZ0uXCX4 zF^(5G4#G3JzX9s~tx)gpff~=7pyaa8u?h9PImg?e?D^gBZ1^Flc0UZ&?nj~C{}xpL zzXw(B2T*eRIaImRUy9dVW6Ca|6}?wNUNZ1Pz>o>VE`fceg^d^RJ=ae-x@e-+=ngcj0;P zKjCwrjCLz{F4T8k2VV@EQ1#sfCC5XMCVC%(FNZ&Xn5K6YN-e$I1l7MWsPcQ^vtb45 zy9c4#aR<~m+zln4!%*)%2-V)NxciU7Y4YEO*TXAt8Uyf7I0_$ugV5WQ`<)?3m%KV$ z13v;K_isY=72$vHurgw#z?<+k$#JGmNKPZ#`WE#=ev7-@Pnl5NV1=IlI|qkLAsQ5h$MUXUDA6= zUm)oxU6r0mcgIP8LfT78NIOZgHR-#4zejo>>5Iy^-=Dz`klsp?Jv2x!BK7_rb~oPQ z_)-{<-b|9;)NhnjB}u=ZNBR)yk4f()>30$7ckEUEpI^EzEk?7Y7uy_WQ1()}danSAQSB>gTU?XXw*+^EYb(x*uuRfgXw zq^+diSBBrcq-WTx+^^1aeHG~`?%smqt?&;?my;fJ_x=b@kZvcn+`SO)Bi%x}+1>jb zd=2S6q^FWzO)7rB?JiyiuO-E#0n!@nDz|t}%sI?jGqH7xH;R~RVN^3okjC{)LuLGyNisg)2uzq7RW~2BOqw;D zae^$VC(i0s`@jj?v|=|BrDs9(hAg13)7i{Skfer=bhozsl^|{T)AcZ&HKoC8f3jTP ziY4PLsxECpjdnNv#BT)XS8C{6sRgB`HvDG0nKMb;SfLn#MLJd^+;?VB!$x>O8pv2D zaor%#Y8`==Tm6LIGrMPzI!c{tEaDlf)H_u3lP9uwfwU%*)lsvLmdqjrzuByZ6<=!fL_Yf)@3Ofm&P+9q`dSRwTwt)6 zMwnWOqjz?^>sbkzCF z2$LA_+-O>N>?|E$;Wt~j*mmESEreTX;#ms$jD>zJ!V!iQZ!D~ZEx#_OT3pJHy6gU- z_SJCvYMnP0?~gDeZ;SQuSgo3`miW_QoxTLA?PICW8_hUgFx3G1W^R3b*i@4cqZu%x zvjM(1oH3ya=%VSWHmU^DTY7$LI%ED%kBpI>p@h=N~G&hyib_AJ(xFe+D0< zDY2E%pMk=~tmZP!P1??I8_nvpc%?0f+_%t~7B5d{YH@EvTrFsC6=kdj=9-;bwwbWu z*Mj16Jd;CY0!?rb_+t%W&v(qEKaXvUw6jA1upNA85C^BTSUE zrxx2}iKb+ey=9zYbO~+gmvSjn=r{$P%*!`89hf5!icuNd*>Xm_)h9T!!Bzgh3&ytN zE1R=%6kutk7;Peq0{N{a_vFCJHz&hN659`W+x#%{wh~}p@U|t`*l0UgwAu3K%Z~!){oefYWw(z_j(gj2|BRv6?qTOD^|pt#S#Lb*uc^)B z(#-sSGl}aRR|qcaAjoWASN)c6X6o_&Jo+B!c_Ksd8=YqiWr(9|5kRT;1Ku@+#oo2S z{B-OmRkJw=nx2BrLeQ2Ht}d7wEQWKe%Rx&g;<%~cn~VM4BqJIm-egb>vxZk1h|Z-M zD&053_1uM3vx1sUwcU7BRh}qA*(|j$$LhP2!Hd>teHK*95aG zaTnLvMHuDM$gRoF2y4v9-f`=F5ZeB*UYDa~;z+V){#qxPbCTWfYvLoc9k9Vdg8^)@ zAPSg7V&m5}FpZeGx|R4*s_5J_leiUE;yM!qktup+N*o>#suJVKdWdZj`>}0P zb`0^myLM0QG{J#Z5ZN%OS^22XPxmg()7 znelc+-VSKDuWtF>#(Z8KxR9?Q> z?D942ELMU$k#_2}vo3t#c7UuoyiSyHU< z;UWSr$(AaUfR1{56%N@s$6m>M@6~jj|1YJpSr>1(FI1U8q*Z>U!d4KzZoivO?T!YT zm@jPhhDj^Kb67`B$WOO}dddgOxAQ5k`<~OOz3g=~0`G>|5K(jtCC@K!DmMkz-*yVS z8_So*(D$Ja{o~bsdM}T<(bUpbf9_V({#qPY&EUY$;K1;Pf#FrV0(tNL$+Q+$`!{E` zw10QJ(ag45&5di16G;7!GgUn8%>a#8EZK z66Ho3iwpHIM)8oHZtNjEWR0fB$>Ks9_?b!j*pbqtTg{|NY%0jY$cH-!#_MW*~{xcq3i{8s6KmaM9lL93&Ba^iOK z$+s(sbw@D$aK>%V;F{Bvn@*qgVibq$G3Ie;kvG*0dC^`v>(BX7t6Tsp&wBGqU)b(5 zA0u-LD=bo&8E7kWywQvaN8}T$eQrZDBoHCrTwF-P=B)l_@lzTsBGA%XTAbwru7zWY zQkdB|smCmNwaJ+jaC@B-KG9OOBLM`ZaV)kyiL@)kb}6k14lFKI^3BjFA7KJ9v|F)O zGf^<5!sup=Ah)|kJhS7=t}_~dhUCi7Q;Nxj=F!#Ew0wF*%lV?6G^%|pA!$8&guISl z7=4Qib{93#Qlz6}b|+DvaSiEi?{U5)ol4onFL$*so~D_hnwaLBtc!=~6XHW-RvN#q zFEEL+UuZ|XBZi~B-P86sn@eo{z4hfWSChe%xz#XHS#XuMF*F$5gK9EeYJ>-HU;js6 z1>|#d>thda4Rbavag(LcXipJp{)m0p|`*tfR%tW@3q5 z%J*Rs@7RDLvb|I z_NfEjQk5)K&@rnl>h%z~_#R1~_^0F=HE*+@-q{8(X74B?0I;)IF;kcBT-Scco<%7$ zT+XcXCNY1z3TC!aoY9`>a~IrkZtRy=!WL6nu6a296&>-BLmLg}hTSp>>#;l*yXgaF zubMp*qTy+1Ds~c-7~4gL?A~`zyn&NrBQIv|!xWA^eJu@GPV58qShF_MY0s#d#Y1vS zEhdSj(~66Y7T;dszyN=hEFQKe)|z_>`R24o-y=Tl)w=*tTlR~G8-e7wI_;X)x+cbA zJJ`0bJ^L)voQ~oSc&<(KsERv@t4vaP_w07Q-PvEEMg))tls*9<3l`ox%52PGNgmw< zL}-im%Wp3=6?+1(LUnA~{3aYOs+A@_Hjkk_VL9D ze;{!54mm~c*ryHulepF%sA8>zt`lI|fH~X8e4spS)e&Is(z?ctdKVXFLK}S|3oF;&Hn0^&=V)&_ zt;yf)xSnOdRQ5g-UDJy8mUXzo7TDqfCxJ(CCtW?-H z_FQLk*wjba8Jc6+ZVz_4#ECQ~q>kJ63 zpi4UZvBh;Pq+6ZB>@Gy?X(J~_mC(T($tujJIv8^9s{(3gWVX?^E>$+g5ABR(c}2xVa-jwLf@zmEf_vgPM@mYVX27P`(zHG63d z(3|a?Iu)i-@l#}3*oMoM>QDGX#&Ye-FRk02K53}j5=xU$v6||{^viE2^hUKV5N7kU z`)Fz;Ny5d$ba6}9QmNyX%1hC?ON9*p{#p=P literal 0 HcmV?d00001 diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..945e1e5 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,693 @@ +# Translation of gst-plugins-good to French +# Copyright (C) 2003-2011 GStreamer core team +# This file is distributed under the same license as the gst-plugins-good package. +# +# Nicolas Velin , 2008. +# Claude Paroz , 2008-2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-04-28 09:22+0200\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "Impossible d'établir une connexion vers le serveur de son" + +msgid "Failed to query sound server capabilities" +msgstr "" +"Échec lors de l'interrogation du serveur de son au sujet de ses capacités" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "« %s » par « %s »" + +msgid "Internal data stream error." +msgstr "Erreur interne de flux de données." + +msgid "Failed to decode JPEG image" +msgstr "Échec de décodage de l'image JPEG" + +msgid "Could not connect to server" +msgstr "Impossible de se connecter au serveur" + +msgid "Server does not support seeking." +msgstr "Le serveur ne gère pas le positionnement." + +msgid "Could not resolve server name." +msgstr "Impossible de résoudre le nom du serveur." + +msgid "Could not establish connection to server." +msgstr "Impossible d'établir une connexion vers le serveur." + +msgid "Secure connection setup failed." +msgstr "La configuration d'une connexion sécurisée a échoué." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Une erreur réseau s'est produite ou le serveur a fermé abruptement la " +"connexion." + +msgid "Server sent bad data." +msgstr "Le serveur a envoyé de mauvaises données." + +msgid "No URL set." +msgstr "Aucun URL défini." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Entrée audio absente ou non valide, le flux AVI sera corrompu." + +msgid "This file contains no playable streams." +msgstr "Ce fichier ne contient aucun flux exploitable." + +msgid "This file is invalid and cannot be played." +msgstr "Ce fichier n'est pas valide et ne peut donc pas être lu." + +msgid "This file is corrupt and cannot be played." +msgstr "Ce fichier est corrompu et ne peut pas être lu." + +msgid "Invalid atom size." +msgstr "Taille d'atome non valide." + +msgid "This file is incomplete and cannot be played." +msgstr "Ce fichier n'est pas complet et ne peut donc pas être lu." + +msgid "The video in this file might not play correctly." +msgstr "" +"Il est possible que la vidéo de ce fichier ne puisse pas être lue " +"correctement." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Ce fichier contient trop de flux. Seuls les %d premiers seront lus." + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Aucun flux pris en charge n'a été trouvé. Il faut peut-être installer un " +"greffon d'extension GStreamer RTSP pour les flux Real media." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Aucun flux pris en charge n'a été trouvé. Il faut peut-être autoriser " +"davantage de protocoles de transport ou il manque peut-être le bon greffon " +"d'extension GStreamer RTSP." + +msgid "Internal data flow error." +msgstr "Erreur interne de flux de données." + +msgid "Volume" +msgstr "Volume" + +msgid "Bass" +msgstr "Basses" + +msgid "Treble" +msgstr "Aiguës" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Haut-parleur" + +msgid "Line-in" +msgstr "Entrée ligne" + +msgid "Microphone" +msgstr "Micro" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mélangeur" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Enregistrement" + +msgid "In-gain" +msgstr "Gain d'entrée" + +msgid "Out-gain" +msgstr "Gain de sortie" + +msgid "Line-1" +msgstr "Ligne 1" + +msgid "Line-2" +msgstr "Ligne 2" + +msgid "Line-3" +msgstr "Ligne 3" + +msgid "Digital-1" +msgstr "Numérique 1" + +msgid "Digital-2" +msgstr "Numérique 2" + +msgid "Digital-3" +msgstr "Numérique 3" + +msgid "Phone-in" +msgstr "Entrée casque" + +msgid "Phone-out" +msgstr "Sortie casque" + +msgid "Video" +msgstr "Vidéo" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Moniteur" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Impossible d'ouvrir le périphérique audio pour la lecture. Le périphérique " +"est utilisé par une autre application." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +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." + +msgid "Could not open audio device for playback." +msgstr "Impossible d'ouvrir le périphérique audio pour la lecture." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Impossible d'ouvrir le périphérique audio pour l'enregistrement. Vous n'avez " +"pas les droits nécessaires pour ouvrir le périphérique." + +msgid "Could not open audio device for recording." +msgstr "Impossible d'ouvrir le périphérique audio pour l'enregistrement." + +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." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Impossible d'ouvrir le périphérique audio pour la gestion des contrôles de " +"mixage. Cette version de OSS (Open Sound System) n'est pas prise en charge " +"par cet élément." + +msgid "Master" +msgstr "Volume général" + +msgid "Front" +msgstr "Avant" + +msgid "Rear" +msgstr "Arrière" + +msgid "Headphones" +msgstr "Écouteurs" + +msgid "Center" +msgstr "Centre" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Ambiophonie" + +msgid "Side" +msgstr "Côté" + +msgid "Built-in Speaker" +msgstr "Haut-parleur interne" + +msgid "AUX 1 Out" +msgstr "Sortie AUX 1" + +msgid "AUX 2 Out" +msgstr "Sortie AUX 2" + +msgid "AUX Out" +msgstr "Sortie AUX" + +msgid "3D Depth" +msgstr "Profondeur 3D" + +msgid "3D Center" +msgstr "Centre 3D" + +msgid "3D Enhance" +msgstr "Amélioration 3D" + +msgid "Telephone" +msgstr "Téléphone" + +msgid "Line Out" +msgstr "Sortie ligne" + +msgid "Line In" +msgstr "Entrée ligne" + +msgid "Internal CD" +msgstr "CD interne" + +msgid "Video In" +msgstr "Entrée vidéo" + +msgid "AUX 1 In" +msgstr "Entrée AUX 1" + +msgid "AUX 2 In" +msgstr "Entrée AUX 2" + +msgid "AUX In" +msgstr "Entrée AUX" + +msgid "Record Gain" +msgstr "Gain d'enregistrement" + +msgid "Output Gain" +msgstr "Gain de sortie" + +msgid "Microphone Boost" +msgstr "Amplification micro" + +msgid "Loopback" +msgstr "Boucle interne" + +msgid "Diagnostic" +msgstr "Diagnostic" + +msgid "Bass Boost" +msgstr "Amplification basses" + +msgid "Playback Ports" +msgstr "Ports de lecture" + +msgid "Input" +msgstr "Entrée" + +msgid "Record Source" +msgstr "Source d'enregistrement" + +msgid "Monitor Source" +msgstr "Source de moniteur" + +msgid "Keyboard Beep" +msgstr "Bip de clavier" + +msgid "Simulate Stereo" +msgstr "Stéréo simulée" + +msgid "Stereo" +msgstr "Stéréo" + +msgid "Surround Sound" +msgstr "Son ambiophonique" + +msgid "Microphone Gain" +msgstr "Gain de microphone" + +msgid "Speaker Source" +msgstr "Source de haut-parleur" + +msgid "Microphone Source" +msgstr "Source de microphone" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Centre / LFE" + +msgid "Stereo Mix" +msgstr "Mélangeur stéréo" + +msgid "Mono Mix" +msgstr "Mélangeur mono" + +msgid "Input Mix" +msgstr "Mélangeur d'entrée" + +msgid "SPDIF In" +msgstr "Entrée SPDIF" + +msgid "SPDIF Out" +msgstr "Sortie SPDIF" + +msgid "Microphone 1" +msgstr "Microphone 1" + +msgid "Microphone 2" +msgstr "Microphone 2" + +msgid "Digital Out" +msgstr "Sortie numérique" + +msgid "Digital In" +msgstr "Entrée numérique" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Combiné" + +msgid "Other" +msgstr "Autre" + +msgid "None" +msgstr "Aucun" + +msgid "On" +msgstr "Activé" + +msgid "Off" +msgstr "Désactivé" + +msgid "Mute" +msgstr "Son coupé" + +msgid "Fast" +msgstr "Rapide" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Très bas" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Bas" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Moyen" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Élevé" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Très élevé" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Production" + +msgid "Front Panel Microphone" +msgstr "Micro du panneau avant" + +msgid "Front Panel Line In" +msgstr "Entrée ligne du panneau avant" + +msgid "Front Panel Headphones" +msgstr "Écouteurs du panneau avant" + +msgid "Front Panel Line Out" +msgstr "Sortie ligne du panneau avant" + +msgid "Green Connector" +msgstr "Connecteur vert" + +msgid "Pink Connector" +msgstr "Connecteur rose" + +msgid "Blue Connector" +msgstr "Connecteur bleu" + +msgid "White Connector" +msgstr "Connecteur blanc" + +msgid "Black Connector" +msgstr "Connecteur noir" + +msgid "Gray Connector" +msgstr "Connecteur gris" + +msgid "Orange Connector" +msgstr "Connecteur orange" + +msgid "Red Connector" +msgstr "Connecteur rouge" + +msgid "Yellow Connector" +msgstr "Connecteur jaune" + +msgid "Green Front Panel Connector" +msgstr "Connecteur vert du panneau avant" + +msgid "Pink Front Panel Connector" +msgstr "Connecteur rose du panneau avant" + +msgid "Blue Front Panel Connector" +msgstr "Connecteur bleu du panneau avant" + +msgid "White Front Panel Connector" +msgstr "Connecteur blanc du panneau avant" + +msgid "Black Front Panel Connector" +msgstr "Connecteur noir du panneau avant" + +msgid "Gray Front Panel Connector" +msgstr "Connecteur gris du panneau avant" + +msgid "Orange Front Panel Connector" +msgstr "Connecteur orange du panneau avant" + +msgid "Red Front Panel Connector" +msgstr "Connecteur rouge du panneau avant" + +msgid "Yellow Front Panel Connector" +msgstr "Connecteur jaune du panneau avant" + +msgid "Spread Output" +msgstr "Sortie partagée" + +msgid "Downmix" +msgstr "Mélange réduit" + +msgid "Virtual Mixer Input" +msgstr "Entrée de mélangeur virtuel" + +msgid "Virtual Mixer Output" +msgstr "Sortie de mélangeur virtuel" + +msgid "Virtual Mixer Channels" +msgstr "Canaux de mélangeur virtuel" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Fonction %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Fonction %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +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." + +msgid "Playback is not supported by this audio device." +msgstr "La lecture n'est pas prise en charge par ce périphérique audio." + +msgid "Audio playback error." +msgstr "Erreur de lecture audio." + +msgid "Recording is not supported by this audio device." +msgstr "L'enregistrement n'est pas pris en charge par ce périphérique audio." + +msgid "Error recording from audio device." +msgstr "Erreur lors de l'enregistrement à partir du périphérique audio." + +msgid "Gain" +msgstr "Gain" + +msgid "Headphone" +msgstr "Écouteurs" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Erreur de lecture de %d octets sur le périphérique « %s »." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Taille de trame imprévue de %u à la place de %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Erreur de lecture de %d octets sur le périphérique « %s »." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Erreur d'obtention des capacités pour le périphérique « %s » : ce n'est pas " +"un pilote v4l2. Vérifiez si c'est un pilote v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Impossible d'obtenir les attributs de l'entrée %d du périphérique %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"Impossible d'obtenir les paramètres du syntoniseur %d du périphérique « %s »." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Impossible d'obtenir la norme du périphérique « %s »." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Impossible d'obtenir les attributs de contrôle du périphérique « %s »." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Impossible d'identifier le périphérique « %s »." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Ceci n'est pas un périphérique « %s »." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Impossible d'ouvrir le périphérique « %s » en lecture et écriture." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Le périphérique « %s » n'est pas un périphérique d'enregistrement." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Le périphérique « %s » n'est pas un périphérique de sortie." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "La définition de la norme du périphérique « %s » a échoué." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Impossible d'obtenir la fréquence actuelle de syntonisation du périphérique " +"« %s »." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Impossible de définir la fréquence de syntonisation du périphérique « %s » à " +"%lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Impossible d'obtenir la force du signal du périphérique « %s »." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Impossible d'obtenir la valeur du contrôle %d du périphérique « %s »." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Impossible de définir la valeur %d du contrôle %d du périphérique « %s »." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Impossible d'obtenir l'entrée actuelle du périphérique « %s ». C'est peut-" +"être un périphérique radio" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Impossible de définir l'entrée %d du périphérique %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Impossible d'obtenir la sortie actuelle du périphérique « %s ». C'est peut-" +"être un périphérique radio" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Impossible de définir la sortie %d du périphérique %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "" +"Impossible de mettre les tampons en file d'attente sur le périphérique " +"« %s »." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "L'obtention de trames vidéo du périphérique « %s » a échoué." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Échec après %d tentatives. périphérique %s. erreur système : %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Impossible d'obtenir les paramètres du périphérique « %s »" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Le périphérique d'entrée vidéo n'a pas accepté le nouveau paramètre de " +"fréquence d'image." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Impossible de mapper les tampons du périphérique « %s »." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Le pilote du périphérique « %s » ne prend en charge aucune méthode " +"d'enregistrement connue." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" +"La modification de résolution en cours d'exécution n'est pas encore prise en " +"charge." + +msgid "Cannot operate without a clock" +msgstr "Impossible de fonctionner sans horloge" diff --git a/po/gl.gmo b/po/gl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..027c028f1afdbf72171c93e23ca0a2e3da4cb46e GIT binary patch literal 16016 zcmchd3zQ^PdB+O`#pNL{Q9+~-hUZT2&MeP?CG5`3K46C#cXpSD4^q=z(^Jx2)l_xQ z&a6rB0VYBuia?N%L6F!g4eqHABHOTxXVA~@}Gq?<^2_W8T<--CH#AM82k}b zeLsP(fWLsJz@v||{W%w&O#TwcPu?Uv6jq?dQH8IAw?eh^5LCZE3NL{Bpz8Y}JQp5u zyyYM)k$)3B8{PrWf_ve`@SE@!c>D>r{9SMd`A@@};Rz=)c6b{+4}Ke72ajNIYhVD? zuY2H`@JV<^g!=J%Hc=D?( z$DqdjcDNBf05`$!!HZ!3t37W3R-oi?FVyqTLiPXWQ2k!{8aw_sz$?kW4eI`}?e zrTSk9kA^41m%wwN+FJ>=9xi~=yS0uZj#opK+X_|g2B_!D?)R!=4AtKjl-|DG@x4&` zem~T>ABU*0_bI4x{I%oPq1yQdl)RpUYVY5m`v0F$(En_-2>C6Keh*fa=#Lq1t^0^5=blFCYF3WXX9e z$f$lFO0IoS^1BeKpKGDo*#g!64N(0Hpz5zdm1{xC<5sBlZigfAZm9l!1D*|6oR03o zL3kdl!+v<5%YPoK|Njov-jOV3)ptBpd#{CRr_bfjhnJGS0BSwOQ0wV7sP*(gsCqsI zHNK~y^!iz-`Fsv)K7RrqJ%lo6*zxQ;)5`htPEo90=~S@%IO9u zy`6FSmdn2jYTn)l_1ptc?LG?CzrTQL=Sxui`Zh!a-jAW$JN7I)Z$8xc*1<#Jb|^b_ z9aQ-{;7j2isD3;NN8q1B$^WH%T?tE2_9=mv!AIb)z~`XkdHOk?_eS_ecpuycuY?ol zdfqPhe)t}E6q9%(ycb>pe+qAg7oLx8hL1wc?~kC?+bJt8w?g&rJy7Gj7fO#l0ww3C z9G`Lg0@S#_4&MQP0M%YZuN-zHzO3x3wz{>k*_zLpZKp(yZ9t&@Qr^ENb!{8_2k#HZ>{4cot7v1lF z2T$Psx8Td*ze275pTQOIXp}+o^lHZqQ0uS>RsWsvIQRi5`}PP_KXya)?`f!dzv%ci z$8SQF`z}=f{sSHk{~M~GhocnA9|hHq8RLAq+E6HCBPl97miHd)SiS{n9;V^(FoCa!?}X~_Bkum= zj-Q2+%ip-){}xJK--7DTkD&VVOX$O6P}-B=Du}9h8=%HB4^{uIQ0?CiHNFo(mA@Zq z{7=Bu@L8AtDZ~_cD=@A{!&OjnTnqX0uHsAMzYS^}4?~UjFQNMP6{z|74m=V55URh2 zU>wwsGx%V-M3VPp% z>enf2?Rc+%YIhW>-fP_b>!9R%BbSuF0Vx^xt$7C{!FO)FM^uS>){!& z1`mNBArdt4bl8%aKC z6X`5cmGm}J@gwUahW zN$(&X=I#x{3TY+jHKd10zfXD}NuP5_zhSQIS5UalFF(%3D$*`@<93*l?sEAYZ|7p2 z%iII!NQ0!;k+jZO9^NNNZy}vd`Y7pW(ut&VN%~ww8aG#VE$ecU^hwgA%J4ayw1M>7 z%J6xBbd0&Oc6FZXD@cdBd%GQPfxk<-l=P&#_j_;)={8c+-HYH`NjH&haQ8k1-%NTx z=_RB$k@C;4yNes))ue<}A{|NEL%NK#hNRCZ>D8nUD#Pbwef4F2U&Y_hip$L?iIr_% zpWT<8?N817qPJ$m9}eSYnCfaIY&2(dF&fVVaXIwX`El6XnWQ)QVVWkXpOnk3G_0)j zxo*yceio*)Vd|G_NfuVjopKV#p=r}^#o=6o>#$OrFL~>>U*`|_n`3t|-fEhw!Ti>s zpWkw2Otw{t62DOk=BI+P>qN<0A7q*N^4BLx*7Vlb^y9E?IZ0i9Lz=`*e5iY`;~AuDu+grrToXF5vD;i^mj(h znWWY91Bs`6ljp>2;ji+yY#8;15py+)t9}}0Nv)-+@`I+Iwy3@y`cdYqx%sf^XRSsf zNs%S(B&}M-{NRM`HxoA#h2O&X=2pm9r&`m~VVe02q`SB6TEeUuOx2=n#xG1>yUJpF z%a%-9ab;;2s`R@Nq(MDIzcQb(6?#zUYCUMQyE&aE^<|17Sfpb#!qqd48rGvZX&`f* zCN&>j=QGou6|JYHo(yYY9p%`6 z`?*pdL`l}CQ8${I3Z*qItvXr`(2^OX5HuRKs2oU*4yM}w_aXb&CoR8{#Ai2|u-VXO z#nhwBNF2R0^CjzIXLOAFI5PzRWaioY|Bnu|JPmNx@+ z_A+Kklsq?^#vHqqj;#n9O-yWi>^%!%RvK8ATs|XFP>nH!QP~@bs!=nj$*AU+vZL<0 zf1rIe*uGlhjU+o`mXSAVY&@%0-B(Y7si?+S!pw}ZFy1+_uHl140= zl0Q5XVvD0`KT-kv>p=diYatgF8`RW%Q?)Nz^rhtrcAJn+F*pCVqN0f?c^iVL#wrP> zu|e7rnHHC}n@yCLB)^=NXX`ubj3VxY-oG!fhikj@#DH06XH{$aA z;wf)S(v2f?Y9bS9oYx$dY73Hc5+I{W_ z6D3{Lis`aMQ&^LW%Q(g8657(5tduEqfPzlvWgDCh%;E?os0`+;*CO5!;G7xf%6>a% zY!kM!F_Xk0E3M$8ZHeMgc5BH!8L;Bbv8bFTrUGwc5XIg`T%?Y#X}jZR(XLS2cV7#M zvSkNor*b84W6ByEZaa%6TdcnLQ^>x*IN!VMrjfDD-X_dHbLh24*tyEQO;L5m+Z^{- z)#uI9O#AJRVR|>q1=s4p$!uR&f@a`P*OHyq`z|f|MGGmYcYb3kBMe;=2TG$ac~{{U zdsm0^Q%R6k{Pkhj@Z@ynf;N|-5g&PjG>pp6gLwq%@z zIuqFBKoqixBz{oS#MBe^>Sh|mnY?qqktWTgoYdGL@J!J&GW_rmR}~*es|VjE zHI;3gG;@gE-MVdZ!Vl+~VQk!>MyMbLx+P_&YizvxsoO00tsyE`XEp;T7%a^- ztW0lwdfFS0y>UiXEuNR$joxcuTu!KmMp+%_LR*}f=`vMbbQfb)(@mB4u9^+5>lKbFbyK8Ud%4Tz# zxdUuxD=N}48_M+_&g8_%<_-Sl*s~W}i<6;F*u|3=THR{+)5eV{@w+*3R}w6)&W3Kt z=ze$;J!}`q^<+f2i>2nP-m2+nI>{mq6E8p5I_ATjY{)^=aa=YkFKZq#OKuVm zMytZhFYM9Co1Bk{9&FAjibF0QxLI(hd5?0~B(Ae8f zVRxfRu1jzL8sh6|7!j&^#=!r1}Qf{xh-t0{oAyUut1Y^2!j#C z{z$a2yV?qO`IqBk#g!;j=E~L-;h|OuUAltj;%bXSM*lWkfgy|+=l_T&FJ~v3LjuW_ zY))C6l!)VXN+XQgim}aOqaEoClvb}mxa>dlW4^(Fn(Ria(Bmk+%rDObDYL(J`?d}J zmvqXhzXX^1M^S7Ye~0`_rlRJGiCQZSYW*AVtFs|LM(AX-wS$+jEOfc{ocQ#$1Lt10 z!c$B#TG$(N>e9k0WWCQl-j{vuQ$7>p+e;HbOA~+1h{yC!V}PPcz)6ezn3N+8+)tSJ zh{y;&q4ABdJRHyYBIaP@WKo4miA)lnQ*@5~XwGzkGI+uDfHe_jisDtUoTCJmxbRK< z(whtx_Ovs_p9YIR4Hlm&{9ul?wm-~|`l+$gY^H$C`XHK1GH)GABgVnt_LRNDyfBr4 zdL4(=H1QVSz@QRnQ=oHN4s}o~mI!vWmgJW{u&&ljrh{651~7a%qck%jX8@T*OhdM? zXNm?~=#wZD(O|z4;rC>O2xb#EOU8fj7j}1^Ae@s@m<@?(s3mjM%lI@30~ZNhx3DKh zurcj1bwQ;r(~w~J>Qj-Cg^iFpiJ?X6Xh4k}LE5IfdaJoba_FufbmrcSs@O#np!8$u zLM`wU!fOjpqt|AWT6Tj!leWIjxe^ZG_jXzQkV=-hDwG+m9;le`H-1_~Tu3L7x{M z)EZ)r!a5FG75N$Chy#sL3|!!M_Js+xyJ;l19|0M0+CCYfVu?*>xYd#QK}oUX?;wIH zGc6OqHspfBxl;EK-$B)%t7bI~W&>kIUhL!lXC2OWKHi-8SQM=lAE{<#;>uk2=(h_m zYf;Kak#$$3S^Hec>sBOJxrB@bWQ#1Wc%*OR&ouG^A2YG&g}n+!C+%IZ63r8gHcHNpn4(ke8myK7DNe0EC*>Ml~+R*I4 zokcR+szTT$JW*Cwg7?mL(X-4zX_+3>FvY~sY&5$PW(cxZ^9S~L?`c5Aw?b76?ZX&Uj0wn<O{WPS z={}~7IwQ8^2Y1d~a$mvng}u{?elPiLV-WLCJ5k_`Pc;|z%l#6$~zuAEOpMQXzp0>robH~OxN>Yhez5+*lxu)CefX4HR$PDYt9ISASqj7 zuLZfJR9-cKHYZv0#zpd+U3ic;FzhGh#mfZ8V&;fmH^Xub+wESyEIfhX>*adK)9^b&RO@F|J%b%Jr=>@l5`;2qiP21HvE*T$;Bt38Kk0rEuw9&NvMk?8F)f ze0IurB;IwqQ=|Hyq`ajmOn^7Gu(#I>n;u1ZYeIBkk~pr^HRXiKn-4i1(pSC6X`2Ki z&2jfnKSpJ3IRZDz;iNg4^B-w$HuaK+=Q%AYGK)uN>bQo|tOpu2PD)EH+1Xb}HekJA za!dY%UfuJ;mpDr~B(CB9HKoaUw{HB1hI_$dEdd^geeq+0OByMMF<#l3ZKILbRb!g4 zDO83ZZ{P6f;HmB@I3Z!0w?DA`&c-_VFQ~`%4G@dD#Xs>C8(h+e+jq@>cht24)DOPo3Qon`&j{?w`YWHqyU<8KuK2Bfd}u zcnhI)0>ti3RcaRUZoR51geQyF9YZua$Ie<|ojR3bDi_R?g)Ks6!Q2~-XOr42hLm?= zOfS7@XSF*tt*fn9Sx)1|b0@;M;Iit4!&Bi%?UW?8>js;#yP4QMz@4k9XW@yEGb+1; z(KhEy5O7BII0el}cZj7_!gOJejfb{XRAJ2AYA8m`D}GZ)`!U%>8MuYr=&b95UC((P z*3K<@EPn*^9b^$h#3E>C@`8h^1|${CBGQNzA^x2MmJ}6}D`KZDTpc z4t6TYmh{>_(|$R2z|Ud*^^mcm`+Lak7K`E?`LSYMwZ)+MAA^Y3`nVjrFtK-Uhw=4t ze?#hKCk$OLssQ(y4|5)E7qM$V@6pVQhhVN{tc&J!Hoz_8KuXzZ{$YS6jo?|%Cdi@H z+76MXy!{+>)T literal 0 HcmV?d00001 diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..b0b12f2 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,790 @@ +# Galician translation of gst-plugins-good. +# Copyright (C) 2009 gst-plugins-good's COPYRIGHT HOLDER +# This file is distributed under the same license as the gst-plugins-good package. +# Fran Diéguez , 2009, 2010, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-01-09 21:20+0100\n" +"Last-Translator: Fran Diéguez \n" +"Language-Team: Galician \n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Could not establish connection to sound server" +msgstr "Non foi posíbel estabelecer a conexión co servidor de son" + +msgid "Failed to query sound server capabilities" +msgstr "Produciuse un erro ao consultar as capacidades do servidor de son" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "«%s» por «%s»" + +msgid "Internal data stream error." +msgstr "Produciuse un erro no fluxo de datos interno." + +msgid "Failed to decode JPEG image" +msgstr "Produciuse un erro ao descodificar a imaxe JPEG" + +msgid "Could not connect to server" +msgstr "Non foi posíbel conectarse ao servidor" + +msgid "Server does not support seeking." +msgstr "O servidor non admite a busca." + +msgid "Could not resolve server name." +msgstr "Non foi posíbel resolver o nome do servidor." + +msgid "Could not establish connection to server." +msgstr "Non foi posíbel estabelecer a conexión co servidor." + +msgid "Secure connection setup failed." +msgstr "Produciuse un fallo de configuración da conexión segura." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Produciuse un erro de rede ou o servidor pechou a conexión de forma " +"inesperada." + +msgid "Server sent bad data." +msgstr "O servidor enviou datos erróneos." + +msgid "No URL set." +msgstr "No existe un URL estabelecido." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "O audio non existe ou non é válido, o fluxo AVI está corrompido." + +msgid "This file contains no playable streams." +msgstr "Este ficheiro non contén ningún fluxo reproducíbel." + +msgid "This file is invalid and cannot be played." +msgstr "Este ficheiro é incorrecto e non pode reproducirse." + +msgid "This file is corrupt and cannot be played." +msgstr "Este ficheiro está danado e non pode reproducirse." + +msgid "Invalid atom size." +msgstr "Tamaño atom non válido." + +msgid "This file is incomplete and cannot be played." +msgstr "Este ficheiro está incompleto e non pode reproducirse." + +msgid "The video in this file might not play correctly." +msgstr "Este vídeo neste ficheiro podería non reproducirse correctamente." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Este ficheiro contén demasiados fluxos. Só se reproducirá o primeiro %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Non se encontrou un fluxo compatíbel. Pode que necesite instalar unha " +"extensión RTSP de GStreamer para os formatos de fluxo Real." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Non se encontrou un fluxo compatíbel. Pode que necesite permitir máis " +"protocolos de transporte ou de outra forma pode que lle falte a extensión " +"correcta de RTSP de GStreamer." + +msgid "Internal data flow error." +msgstr "Produciuse un erro interno no fluxo de datos." + +msgid "Volume" +msgstr "Volume" + +msgid "Bass" +msgstr "Baixos" + +msgid "Treble" +msgstr "Agudos" + +msgid "Synth" +msgstr "Sintetizador" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Altofalante" + +msgid "Line-in" +msgstr "Liña de entrada" + +msgid "Microphone" +msgstr "Micrófono" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Misturador" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Gravar" + +msgid "In-gain" +msgstr "Ganancia de entrada" + +msgid "Out-gain" +msgstr "Ganancia de saída" + +msgid "Line-1" +msgstr "Liña 1" + +msgid "Line-2" +msgstr "Liña 2" + +msgid "Line-3" +msgstr "Liña 3" + +msgid "Digital-1" +msgstr "Dixital 1" + +msgid "Digital-2" +msgstr "Dixital 2" + +msgid "Digital-3" +msgstr "Dixital 3" + +msgid "Phone-in" +msgstr "Entrada teléfono" + +msgid "Phone-out" +msgstr "Saída teléfono" + +msgid "Video" +msgstr "Vídeo" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Non foi posíbel abrir o dispositivo de son para a reprodución. O dispositivo " +"está sendo empregado por outro aplicativo." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Non foi posíbel abrir o dispositivo de son. Vostede non ten permisos para " +"abrir o dispositivo." + +msgid "Could not open audio device for playback." +msgstr "Non foi posíbel abrir o dispositivo de son para a reprodución." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Non foi posíbel abrir o dispositivo de son para a gravación. Vostede non ten " +"permisos para abrir o dispositivo." + +msgid "Could not open audio device for recording." +msgstr "Non foi posíbel abrir o dispositivo de son para a gravación." + +msgid "Could not open audio device for mixer control handling." +msgstr "" +"Non foi posíbel abrir o dispositivo de son para a súa xestión polo control " +"de misturado." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Non foi posíbel abrir o dispositivo de son para a súa xestión polo control " +"de misturado. Este elemento non admite esta versión do Open Sound System." + +msgid "Master" +msgstr "Mestre" + +msgid "Front" +msgstr "Frontal" + +msgid "Rear" +msgstr "Treseiro" + +msgid "Headphones" +msgstr "Auriculares" + +msgid "Center" +msgstr "Centro" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Envolvente" + +msgid "Side" +msgstr "Lateral" + +msgid "Built-in Speaker" +msgstr "Altofalante interno" + +msgid "AUX 1 Out" +msgstr "Saída AUX 1" + +msgid "AUX 2 Out" +msgstr "Saída AUX 2" + +msgid "AUX Out" +msgstr "Saída AUX" + +msgid "3D Depth" +msgstr "Profundidade 3D" + +msgid "3D Center" +msgstr "Centro 3D" + +msgid "3D Enhance" +msgstr "Mellora 3D" + +msgid "Telephone" +msgstr "Teléfono" + +msgid "Line Out" +msgstr "Liña de saída" + +msgid "Line In" +msgstr "Liña de entrada" + +msgid "Internal CD" +msgstr "CD interno" + +msgid "Video In" +msgstr "Entrada de vídeo" + +msgid "AUX 1 In" +msgstr "Entrada AUX 1" + +msgid "AUX 2 In" +msgstr "Entrada AUX 2" + +msgid "AUX In" +msgstr "Entrada AUX" + +msgid "Record Gain" +msgstr "Ganancia de gravación" + +msgid "Output Gain" +msgstr "Ganancia de saída" + +msgid "Microphone Boost" +msgstr "Aumento do micrófono" + +msgid "Loopback" +msgstr "Bucle local" + +msgid "Diagnostic" +msgstr "Diagnóstico" + +msgid "Bass Boost" +msgstr "Aumento de baixos" + +msgid "Playback Ports" +msgstr "Portos de reprodución" + +msgid "Input" +msgstr "Entrada" + +msgid "Record Source" +msgstr "Orixe da gravación" + +msgid "Monitor Source" +msgstr "Monitor de orixe" + +msgid "Keyboard Beep" +msgstr "Pitido de teclado" + +msgid "Simulate Stereo" +msgstr "Simular estéreo" + +msgid "Stereo" +msgstr "Estéreo" + +msgid "Surround Sound" +msgstr "Son envolvente" + +msgid "Microphone Gain" +msgstr "Ganancia do micrófono" + +msgid "Speaker Source" +msgstr "Altofalante de orixe" + +msgid "Microphone Source" +msgstr "Micrófono de orixe" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Centro / LFE" + +msgid "Stereo Mix" +msgstr "Misturador estéreo" + +msgid "Mono Mix" +msgstr "Misturador mono" + +msgid "Input Mix" +msgstr "Misturador de entrada" + +msgid "SPDIF In" +msgstr "Entrada SPDIF" + +msgid "SPDIF Out" +msgstr "Saída SPDIF" + +msgid "Microphone 1" +msgstr "Micrófono 1" + +msgid "Microphone 2" +msgstr "Micrófono 2" + +msgid "Digital Out" +msgstr "Saída dixital" + +msgid "Digital In" +msgstr "Entrada dixital" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Módem" + +msgid "Handset" +msgstr "Auriculares" + +msgid "Other" +msgstr "Outro" + +msgid "None" +msgstr "Ningún" + +msgid "On" +msgstr "Acendido" + +msgid "Off" +msgstr "Apagado" + +msgid "Mute" +msgstr "Silenciar" + +msgid "Fast" +msgstr "Rápido" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Moi baixo" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Baixo" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Medio" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Alto" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Moi alto" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produción" + +msgid "Front Panel Microphone" +msgstr "Micrófono do panel frontal" + +msgid "Front Panel Line In" +msgstr "Entrada do panel frontal" + +msgid "Front Panel Headphones" +msgstr "Auriculares do panel frontal" + +msgid "Front Panel Line Out" +msgstr "Saída do panel frontal" + +msgid "Green Connector" +msgstr "Conectador verde" + +msgid "Pink Connector" +msgstr "Conectador rosa" + +msgid "Blue Connector" +msgstr "Conectador azul" + +msgid "White Connector" +msgstr "Conectador branco" + +msgid "Black Connector" +msgstr "Conectador negro" + +msgid "Gray Connector" +msgstr "Conectador gris" + +msgid "Orange Connector" +msgstr "Conectador laranxa" + +msgid "Red Connector" +msgstr "Conectador vermello" + +msgid "Yellow Connector" +msgstr "Conectador amarelo" + +msgid "Green Front Panel Connector" +msgstr "Conectador verde do panel frontal" + +msgid "Pink Front Panel Connector" +msgstr "Conectador rosa do panel frontal" + +msgid "Blue Front Panel Connector" +msgstr "Conectador azul do panel frontal" + +msgid "White Front Panel Connector" +msgstr "Conectador branco do panel frontal" + +msgid "Black Front Panel Connector" +msgstr "Conectador negro do panel frontal" + +msgid "Gray Front Panel Connector" +msgstr "Conectador gris do panel frontal" + +msgid "Orange Front Panel Connector" +msgstr "Conectador laranxado panel frontal" + +msgid "Red Front Panel Connector" +msgstr "Conectador vermello do panel frontal" + +msgid "Yellow Front Panel Connector" +msgstr "Conectador amarelo do panel frontal" + +msgid "Spread Output" +msgstr "Expandir saída" + +msgid "Downmix" +msgstr "Redución de canles" + +msgid "Virtual Mixer Input" +msgstr "Entrada do misturador virtual" + +msgid "Virtual Mixer Output" +msgstr "Saída do misturador virtual" + +msgid "Virtual Mixer Channels" +msgstr "Canles do misturador virtual" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Función %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Función %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Non foi posíbel abrir o dispositivo de son para a reprodución. Esta versión " +"do Open Sound System non está admitida por este elemento." + +msgid "Playback is not supported by this audio device." +msgstr "Este dispositivo de son non admite a reprodución." + +msgid "Audio playback error." +msgstr "Erro de reprodución de son." + +msgid "Recording is not supported by this audio device." +msgstr "Este dispositivo de son non admite a gravación." + +msgid "Error recording from audio device." +msgstr "Erro ao gravar do dispositivo de son." + +msgid "Gain" +msgstr "Ganancia" + +msgid "Headphone" +msgstr "Cascos" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Produciuse un erro ao ler %d bytes desde o dispositivo «%s»." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Obtívose un tamaño de marco de %u non esperado no lugar de %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Produciuse un erro ao ler %d bytes do dispositivo «%s»." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Produciuse un erro ao obter as capacidades do dispositivo «%s»: Non é un " +"controlador v4l2. Comprobe se é un controlador v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" +"Produciuse un erro ao consultar os atributos de entrada %d no dispositivo %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"Produciuse un erro ao configurar o sintonizador %d no dispositivo «%s»." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Produciuse un erro ao consultar a norma no dispositivo «%s»." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" +"Produciuse un erro ao obter os atributos de control do dispositivo «%s»." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Non foi posíbel identificar o dispositivo «%s»." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Este non é un dispositivo «%s»." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Non foi posíbel abrir o dispositivo «%s» para lectura e escritura." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "O dispositivo «%s» non é un dispositivo de captura." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "O dispositivo «%s» non é un dispositivo de captura." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Produciuse un fallo ao estabelecer a norma no dispositivo «%s»." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Produciuse un fallo ao obter a frecuencia actual do sintonizador para o " +"dispositivo «%s»." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Produciuse un erro ao estabelecer a frecuencia actual do sintonizador para o " +"dispositivo «%s» a %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" +"Produciuse un erro ao obter a potencia do sinal para o dispositivo «%s»." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" +"Produciuse un erro ao obter o valor para o control %d do dispositivo «%s»." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Produciuse un fallo ao estabelecer o valor %ds para o control %d do " +"dispositivo «%s»." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Produciuse un fallo ao obter a entrada actual no dispositivo «%s». Cicáis " +"sexa un dispositivo de radio." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Produciuse un fallo ao estabelecer a entrada %d no dispositivo %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Produciuse un fallo ao obter a entrada actual no dispositivo «%s». Quizais " +"sexa un dispositivo de radio" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Produciuse un fallo ao estabelecer a saída %d no dispositivo %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Non é posíbel meter na cola os búferes no dispositivo «%s»." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "" +"Produciuse un fallo ao tentar obter cadros de vídeo do dispositivo «%s»." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" +"Prouciuse un fallo despois de %d intentos. Dispositivo %s. Error do sistema: " +"%s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Non foi posíbel obter os parámetros para o dispositivo «%s»" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"O dispositivo de entrada de vídeo non aceptou o axuste da nova taxa de " +"fotogramas." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Non foi posíbel mapear os búferes do dispositivo «%s»" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"O controlador do dispositivo «%s» non admite ningún método de captura " +"coñecido." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Aínda non se admite o cambio de resolución durante a reprodución." + +msgid "Cannot operate without a clock" +msgstr "Non é posíbel operar sen reloxo" + +#~ msgid "Describes the selected input element." +#~ msgstr "Describe o elemento de entrada seleccionado." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "" +#~ "Describe o elemento de saída seleccionado para a Conferencia de Audio/" +#~ "Vídeo." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "" +#~ "Describe o elemento de saída seleccionado para a Música e Películas." + +#~ msgid "Describes the selected output element." +#~ msgstr "Describe o elemento de saída seleccionado." + +#~ msgid "GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "GStreamer audiosink para a Conferencia de Audio/Video" + +#~ msgid "GStreamer audiosink for Music and Movies" +#~ msgstr "GStreamer audiosink para Música e Filmes" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer pode reproducir audio empregando calquera número de elementos " +#~ "de saída. Algunha elección posíbel é ossink, esdsink e alsasink. O " +#~ "audiosink pode ser un pipeline parcial no cando de só un elemento único." + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer pode reproducir vídeo usando calquera número de elementos de " +#~ "saída. As posíbeis eleccións son xvimagesink, ximagesink, sdlvideosink e " +#~ "aasink. O videosink pode ser un pipeline parcial no lugar de un elemento " +#~ "único." + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "GStreamer pode poñer engadidos de visualización nun pipeline para " +#~ "transformar un fluxo de audio en marcos de vídeo. Por omisión é goom pero " +#~ "pronto convertiránse máis visualizacións. O engadido de visualización " +#~ "pode ser un pipeline parcial no lugar de só un elemento." + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer pode gravar audio usando calquera número de elementos de " +#~ "entrada. Algunhas das posíbeis eleccións son osssrc, esdsrc e alsasrc. A " +#~ "orixe do audio pode ser un pipeline parcial no lugar de un só elemento." + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer pode gravar audio usando calquera número de elementos de " +#~ "entrada. Algunhas das posíbeis eleccións son v4lsrc e videotestsrc. A " +#~ "orixe do audio pode ser un pipeline parcial no lugar de un só elemento." + +#~ msgid "default GStreamer audio source" +#~ msgstr "orixe de son de GStreamer predefinida" + +#~ msgid "default GStreamer audiosink" +#~ msgstr "orixe do audiosink GStreamer predefinida" + +#~ msgid "default GStreamer video source" +#~ msgstr "orixe do vídeo de GStreamer predefinido" + +#~ msgid "default GStreamer videosink" +#~ msgstr "videosink de GStreamer predefinido" + +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "engadido de visualización GStreamer predefinido" + +#~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "" +#~ "descrición para o audiosink GStreamer para a conferencia de audio/vídeo" + +#~ msgid "description for GStreamer audiosink for Music and Movies" +#~ msgstr "descrición para o audiosink de GStreamer para Música e Filmes" + +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "descrición para o audiosink de GStreamer predefinido" + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "descrición para o audiosrc de GStreamer predefinido" diff --git a/po/gst-plugins-good-0.10.pot b/po/gst-plugins-good-0.10.pot new file mode 100644 index 0000000..c9aee42 --- /dev/null +++ b/po/gst-plugins-good-0.10.pot @@ -0,0 +1,850 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.31\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ext/esd/esdsink.c:252 ext/esd/esdsink.c:357 +msgid "Could not establish connection to sound server" +msgstr "" + +#: ext/esd/esdsink.c:259 +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#: ext/pulse/pulsesink.c:2889 +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +#: ext/flac/gstflacdec.c:1150 ext/libpng/gstpngdec.c:343 +#: ext/libpng/gstpngdec.c:354 ext/libpng/gstpngdec.c:553 +#: ext/wavpack/gstwavpackparse.c:1173 gst/avi/gstavidemux.c:5211 +msgid "Internal data stream error." +msgstr "" + +#: ext/jpeg/gstjpegdec.c:289 +msgid "Failed to decode JPEG image" +msgstr "" + +#: ext/shout2/gstshout2.c:588 +msgid "Could not connect to server" +msgstr "" + +#: ext/soup/gstsouphttpsrc.c:873 +msgid "Server does not support seeking." +msgstr "" + +#: ext/soup/gstsouphttpsrc.c:1080 +msgid "Could not resolve server name." +msgstr "" + +#: ext/soup/gstsouphttpsrc.c:1086 +msgid "Could not establish connection to server." +msgstr "" + +#: ext/soup/gstsouphttpsrc.c:1091 +msgid "Secure connection setup failed." +msgstr "" + +#: ext/soup/gstsouphttpsrc.c:1096 +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +#: ext/soup/gstsouphttpsrc.c:1102 +msgid "Server sent bad data." +msgstr "" + +#: ext/soup/gstsouphttpsrc.c:1251 +msgid "No URL set." +msgstr "" + +#: gst/avi/gstavimux.c:1806 +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" + +#: gst/isomp4/qtdemux.c:522 gst/isomp4/qtdemux.c:526 +msgid "This file contains no playable streams." +msgstr "" + +#: gst/isomp4/qtdemux.c:561 gst/isomp4/qtdemux.c:4080 +#: gst/isomp4/qtdemux.c:4150 gst/isomp4/qtdemux.c:4299 +msgid "This file is invalid and cannot be played." +msgstr "" + +#: gst/isomp4/qtdemux.c:2464 gst/isomp4/qtdemux.c:2540 +#: gst/isomp4/qtdemux.c:2583 gst/isomp4/qtdemux.c:4881 +#: gst/isomp4/qtdemux.c:4888 gst/isomp4/qtdemux.c:5479 +#: gst/isomp4/qtdemux.c:5907 gst/isomp4/qtdemux.c:5914 +#: gst/isomp4/qtdemux.c:7477 +msgid "This file is corrupt and cannot be played." +msgstr "" + +#: gst/isomp4/qtdemux.c:2672 +msgid "Invalid atom size." +msgstr "" + +#: gst/isomp4/qtdemux.c:2741 +msgid "This file is incomplete and cannot be played." +msgstr "" + +#: gst/isomp4/qtdemux.c:5077 +msgid "The video in this file might not play correctly." +msgstr "" + +#: gst/isomp4/qtdemux.c:7506 +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +#: gst/rtsp/gstrtspsrc.c:5380 +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +#: gst/rtsp/gstrtspsrc.c:5385 +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +#: gst/wavparse/gstwavparse.c:2109 +msgid "Internal data flow error." +msgstr "" + +#: sys/oss/gstossmixertrack.c:98 sys/oss4/oss4-mixer.c:728 +#: sys/sunaudio/gstsunaudiomixertrack.c:69 +msgid "Volume" +msgstr "" + +#: sys/oss/gstossmixertrack.c:99 sys/oss4/oss4-mixer.c:741 +msgid "Bass" +msgstr "" + +#: sys/oss/gstossmixertrack.c:100 sys/oss4/oss4-mixer.c:742 +msgid "Treble" +msgstr "" + +#: sys/oss/gstossmixertrack.c:101 +msgid "Synth" +msgstr "" + +#: sys/oss/gstossmixertrack.c:102 sys/oss4/oss4-mixer.c:756 +msgid "PCM" +msgstr "" + +#: sys/oss/gstossmixertrack.c:103 +msgid "Speaker" +msgstr "" + +#: sys/oss/gstossmixertrack.c:104 +msgid "Line-in" +msgstr "" + +#: sys/oss/gstossmixertrack.c:105 sys/oss4/oss4-mixer.c:747 +msgid "Microphone" +msgstr "" + +#: sys/oss/gstossmixertrack.c:106 +msgid "CD" +msgstr "" + +#: sys/oss/gstossmixertrack.c:107 +msgid "Mixer" +msgstr "" + +#: sys/oss/gstossmixertrack.c:108 +msgid "PCM-2" +msgstr "" + +#: sys/oss/gstossmixertrack.c:109 +msgid "Record" +msgstr "" + +#: sys/oss/gstossmixertrack.c:110 +msgid "In-gain" +msgstr "" + +#: sys/oss/gstossmixertrack.c:111 +msgid "Out-gain" +msgstr "" + +#: sys/oss/gstossmixertrack.c:112 +msgid "Line-1" +msgstr "" + +#: sys/oss/gstossmixertrack.c:113 +msgid "Line-2" +msgstr "" + +#: sys/oss/gstossmixertrack.c:114 +msgid "Line-3" +msgstr "" + +#: sys/oss/gstossmixertrack.c:115 +msgid "Digital-1" +msgstr "" + +#: sys/oss/gstossmixertrack.c:116 +msgid "Digital-2" +msgstr "" + +#: sys/oss/gstossmixertrack.c:117 +msgid "Digital-3" +msgstr "" + +#: sys/oss/gstossmixertrack.c:118 +msgid "Phone-in" +msgstr "" + +#: sys/oss/gstossmixertrack.c:119 +msgid "Phone-out" +msgstr "" + +#: sys/oss/gstossmixertrack.c:120 +msgid "Video" +msgstr "" + +#: sys/oss/gstossmixertrack.c:121 +msgid "Radio" +msgstr "" + +#: sys/oss/gstossmixertrack.c:122 sys/oss4/oss4-mixer.c:770 +#: sys/sunaudio/gstsunaudiomixertrack.c:71 +msgid "Monitor" +msgstr "" + +#: sys/oss/gstosssink.c:399 sys/oss4/oss4-sink.c:495 +#: sys/oss4/oss4-source.c:362 +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +#: sys/oss/gstosssink.c:406 sys/oss4/oss4-sink.c:505 +#: sys/oss4/oss4-source.c:372 +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +#: sys/oss/gstosssink.c:414 sys/oss4/oss4-sink.c:516 +#: sys/oss4/oss4-source.c:383 +msgid "Could not open audio device for playback." +msgstr "" + +#: sys/oss/gstosssrc.c:370 +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +#: sys/oss/gstosssrc.c:378 +msgid "Could not open audio device for recording." +msgstr "" + +#: sys/oss4/oss4-mixer.c:303 +msgid "Could not open audio device for mixer control handling." +msgstr "" + +#: sys/oss4/oss4-mixer.c:317 +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:729 +msgid "Master" +msgstr "" + +#: sys/oss4/oss4-mixer.c:730 +msgid "Front" +msgstr "" + +#: sys/oss4/oss4-mixer.c:731 +msgid "Rear" +msgstr "" + +#: sys/oss4/oss4-mixer.c:732 +msgid "Headphones" +msgstr "" + +#: sys/oss4/oss4-mixer.c:733 +msgid "Center" +msgstr "" + +#: sys/oss4/oss4-mixer.c:734 +msgid "LFE" +msgstr "" + +#: sys/oss4/oss4-mixer.c:735 +msgid "Surround" +msgstr "" + +#: sys/oss4/oss4-mixer.c:736 +msgid "Side" +msgstr "" + +#: sys/oss4/oss4-mixer.c:737 sys/sunaudio/gstsunaudiomixertrack.c:72 +msgid "Built-in Speaker" +msgstr "" + +#: sys/oss4/oss4-mixer.c:738 sys/sunaudio/gstsunaudiomixertrack.c:76 +msgid "AUX 1 Out" +msgstr "" + +#: sys/oss4/oss4-mixer.c:739 sys/sunaudio/gstsunaudiomixertrack.c:77 +msgid "AUX 2 Out" +msgstr "" + +#: sys/oss4/oss4-mixer.c:740 +msgid "AUX Out" +msgstr "" + +#: sys/oss4/oss4-mixer.c:743 +msgid "3D Depth" +msgstr "" + +#: sys/oss4/oss4-mixer.c:744 +msgid "3D Center" +msgstr "" + +#: sys/oss4/oss4-mixer.c:745 +msgid "3D Enhance" +msgstr "" + +#: sys/oss4/oss4-mixer.c:746 +msgid "Telephone" +msgstr "" + +#: sys/oss4/oss4-mixer.c:748 sys/sunaudio/gstsunaudiomixertrack.c:74 +msgid "Line Out" +msgstr "" + +#: sys/oss4/oss4-mixer.c:749 sys/oss4/oss4-mixer.c:750 +msgid "Line In" +msgstr "" + +#: sys/oss4/oss4-mixer.c:751 +msgid "Internal CD" +msgstr "" + +#: sys/oss4/oss4-mixer.c:752 +msgid "Video In" +msgstr "" + +#: sys/oss4/oss4-mixer.c:753 +msgid "AUX 1 In" +msgstr "" + +#: sys/oss4/oss4-mixer.c:754 +msgid "AUX 2 In" +msgstr "" + +#: sys/oss4/oss4-mixer.c:755 +msgid "AUX In" +msgstr "" + +#: sys/oss4/oss4-mixer.c:757 sys/oss4/oss4-mixer.c:758 +msgid "Record Gain" +msgstr "" + +#: sys/oss4/oss4-mixer.c:759 +msgid "Output Gain" +msgstr "" + +#: sys/oss4/oss4-mixer.c:760 +msgid "Microphone Boost" +msgstr "" + +#: sys/oss4/oss4-mixer.c:761 +msgid "Loopback" +msgstr "" + +#: sys/oss4/oss4-mixer.c:762 +msgid "Diagnostic" +msgstr "" + +#: sys/oss4/oss4-mixer.c:763 +msgid "Bass Boost" +msgstr "" + +#: sys/oss4/oss4-mixer.c:764 +msgid "Playback Ports" +msgstr "" + +#: sys/oss4/oss4-mixer.c:765 +msgid "Input" +msgstr "" + +#: sys/oss4/oss4-mixer.c:766 sys/oss4/oss4-mixer.c:767 +msgid "Record Source" +msgstr "" + +#: sys/oss4/oss4-mixer.c:768 +msgid "Monitor Source" +msgstr "" + +#: sys/oss4/oss4-mixer.c:769 +msgid "Keyboard Beep" +msgstr "" + +#: sys/oss4/oss4-mixer.c:771 +msgid "Simulate Stereo" +msgstr "" + +#: sys/oss4/oss4-mixer.c:772 sys/oss4/oss4-mixer.c:792 +msgid "Stereo" +msgstr "" + +#: sys/oss4/oss4-mixer.c:773 +msgid "Surround Sound" +msgstr "" + +#: sys/oss4/oss4-mixer.c:774 +msgid "Microphone Gain" +msgstr "" + +#: sys/oss4/oss4-mixer.c:775 +msgid "Speaker Source" +msgstr "" + +#: sys/oss4/oss4-mixer.c:776 +msgid "Microphone Source" +msgstr "" + +#: sys/oss4/oss4-mixer.c:777 +msgid "Jack" +msgstr "" + +#: sys/oss4/oss4-mixer.c:778 +msgid "Center / LFE" +msgstr "" + +#: sys/oss4/oss4-mixer.c:779 +msgid "Stereo Mix" +msgstr "" + +#: sys/oss4/oss4-mixer.c:780 +msgid "Mono Mix" +msgstr "" + +#: sys/oss4/oss4-mixer.c:781 +msgid "Input Mix" +msgstr "" + +#: sys/oss4/oss4-mixer.c:782 +msgid "SPDIF In" +msgstr "" + +#: sys/oss4/oss4-mixer.c:783 sys/sunaudio/gstsunaudiomixertrack.c:75 +msgid "SPDIF Out" +msgstr "" + +#: sys/oss4/oss4-mixer.c:784 +msgid "Microphone 1" +msgstr "" + +#: sys/oss4/oss4-mixer.c:785 +msgid "Microphone 2" +msgstr "" + +#: sys/oss4/oss4-mixer.c:786 +msgid "Digital Out" +msgstr "" + +#: sys/oss4/oss4-mixer.c:787 +msgid "Digital In" +msgstr "" + +#: sys/oss4/oss4-mixer.c:788 +msgid "HDMI" +msgstr "" + +#: sys/oss4/oss4-mixer.c:789 +msgid "Modem" +msgstr "" + +#: sys/oss4/oss4-mixer.c:790 +msgid "Handset" +msgstr "" + +#: sys/oss4/oss4-mixer.c:791 +msgid "Other" +msgstr "" + +#: sys/oss4/oss4-mixer.c:793 +msgid "None" +msgstr "" + +#: sys/oss4/oss4-mixer.c:794 +msgid "On" +msgstr "" + +#: sys/oss4/oss4-mixer.c:795 +msgid "Off" +msgstr "" + +#: sys/oss4/oss4-mixer.c:796 +msgid "Mute" +msgstr "" + +#: sys/oss4/oss4-mixer.c:797 +msgid "Fast" +msgstr "" + +#. TRANSLATORS: "Very Low" is a quality setting here +#: sys/oss4/oss4-mixer.c:799 +msgid "Very Low" +msgstr "" + +#. TRANSLATORS: "Low" is a quality setting here +#: sys/oss4/oss4-mixer.c:801 +msgid "Low" +msgstr "" + +#. TRANSLATORS: "Medium" is a quality setting here +#: sys/oss4/oss4-mixer.c:803 +msgid "Medium" +msgstr "" + +#. TRANSLATORS: "High" is a quality setting here +#: sys/oss4/oss4-mixer.c:805 +msgid "High" +msgstr "" + +#. TRANSLATORS: "Very High" is a quality setting here +#: sys/oss4/oss4-mixer.c:807 sys/oss4/oss4-mixer.c:808 +msgid "Very High" +msgstr "" + +#. TRANSLATORS: "Production" is a quality setting here +#: sys/oss4/oss4-mixer.c:810 +msgid "Production" +msgstr "" + +#: sys/oss4/oss4-mixer.c:811 +msgid "Front Panel Microphone" +msgstr "" + +#: sys/oss4/oss4-mixer.c:812 +msgid "Front Panel Line In" +msgstr "" + +#: sys/oss4/oss4-mixer.c:813 +msgid "Front Panel Headphones" +msgstr "" + +#: sys/oss4/oss4-mixer.c:814 +msgid "Front Panel Line Out" +msgstr "" + +#: sys/oss4/oss4-mixer.c:815 +msgid "Green Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:816 +msgid "Pink Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:817 +msgid "Blue Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:818 +msgid "White Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:819 +msgid "Black Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:820 +msgid "Gray Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:821 +msgid "Orange Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:822 +msgid "Red Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:823 +msgid "Yellow Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:824 +msgid "Green Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:825 +msgid "Pink Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:826 +msgid "Blue Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:827 +msgid "White Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:828 +msgid "Black Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:829 +msgid "Gray Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:830 +msgid "Orange Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:831 +msgid "Red Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:832 +msgid "Yellow Front Panel Connector" +msgstr "" + +#: sys/oss4/oss4-mixer.c:833 +msgid "Spread Output" +msgstr "" + +#: sys/oss4/oss4-mixer.c:834 +msgid "Downmix" +msgstr "" + +#: sys/oss4/oss4-mixer.c:878 +msgid "Virtual Mixer Input" +msgstr "" + +#: sys/oss4/oss4-mixer.c:880 +msgid "Virtual Mixer Output" +msgstr "" + +#: sys/oss4/oss4-mixer.c:882 +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#: sys/oss4/oss4-mixer.c:933 +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#: sys/oss4/oss4-mixer.c:940 +#, c-format +msgid "%s Function" +msgstr "" + +#: sys/oss4/oss4-sink.c:525 sys/oss4/oss4-source.c:393 +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:641 +msgid "Playback is not supported by this audio device." +msgstr "" + +#: sys/oss4/oss4-sink.c:648 +msgid "Audio playback error." +msgstr "" + +#: sys/oss4/oss4-source.c:515 +msgid "Recording is not supported by this audio device." +msgstr "" + +#: sys/oss4/oss4-source.c:522 +msgid "Error recording from audio device." +msgstr "" + +#: sys/sunaudio/gstsunaudiomixertrack.c:70 +msgid "Gain" +msgstr "" + +#: sys/sunaudio/gstsunaudiomixertrack.c:73 +msgid "Headphone" +msgstr "" + +#: sys/v4l2/gstv4l2src.c:892 +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "" + +#: sys/v4l2/gstv4l2src.c:918 +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#: sys/v4l2/gstv4l2src.c:936 +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:99 +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:139 +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#: sys/v4l2/v4l2_calls.c:169 +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:213 +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:347 +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:492 +#, c-format +msgid "Cannot identify device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:499 +#, c-format +msgid "This isn't a device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:506 +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:513 +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:522 +#, c-format +msgid "Device '%s' is not a output device." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:622 +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:660 +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:702 +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:736 +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:772 +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:807 +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:839 +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#: sys/v4l2/v4l2_calls.c:864 +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "" + +#: sys/v4l2/v4l2_calls.c:896 +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" + +#: sys/v4l2/v4l2_calls.c:921 +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "" + +#: sys/v4l2/v4l2src_calls.c:81 +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "" + +#: sys/v4l2/v4l2src_calls.c:197 +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "" + +#: sys/v4l2/v4l2src_calls.c:199 +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#: sys/v4l2/v4l2src_calls.c:234 +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "" + +#: sys/v4l2/v4l2src_calls.c:261 +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#: sys/v4l2/v4l2src_calls.c:331 +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "" + +#: sys/v4l2/v4l2src_calls.c:339 +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +#: sys/ximage/gstximagesrc.c:796 +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +#: sys/ximage/gstximagesrc.c:810 +msgid "Cannot operate without a clock" +msgstr "" diff --git a/po/hu.gmo b/po/hu.gmo new file mode 100644 index 0000000000000000000000000000000000000000..11bfbb012ed10c2257fcf17048655ad11c2a518c GIT binary patch literal 15235 zcmchd36LCDd4M}$V=Qb8*kGH>&o;6oq#5n3D2NH=6h{s!1tbLt`TqA_&-AW# zEeTRg>EEwk_v?53?|=XM-)nvMX=mN#@Oub(Hu9^p9p{(uJ5S;dzb{?jI8TOOhH~p4 z;Cb)|@Lc#)_(b?ixD1~46vx>GFMx9YW+?e8Hr=%88TbV5-vQ5oZ-7sSZ-ZyS4?`*M zBnX8x$p)k_1prb-DS8QMo`MT53Yj8 zEq?@yq%V4!BFA|?ybJD!$Kg77 zDV>ydjlk!@0A2|XLh0}4EssOd_gA3k?^~9SSpFD_-hKvM_&;zZeAzQhd+&r-kp2`L zgkQ5f`(o4Y>)>|oPr_^92Ve<)9ZLVtzQnw@9!k4wP}=)`sPzRmlKzpszxqP z_fshEeH_Yoeivd|&Obw%;`|VzDm{p(#<_^Wl>4iocExSNkF!gHb2a{&}RT@0nZtDv-hEtLMPhceC^;k)51jNy}?WAeQUO8Z_9Wgfi= zO8swzWOeR=Qs0A6%KvjHHs*-?q>H35tGy2&G;B2~oB4IE-J?&w*><8Yun0 z6-xOvDD7@S(Q6E)o;fJv@H#jE-)Yl-31!^A2Blp;fl}|!;AQaFP{GScFh!h=P|Dv2 zMX$F&(O&~fyAmk%yc$aVZ->&p_dqHCUMTtQhtl3-Q0hAlx59^^wC@6C{KrN(M7j>2 z4?hG8@NaDTS5Vr&;&M~pCMf0YfKuN$lzMKlX&1hL^fZ+Davzj=^dOXZ^i?SB{sEN! z{TO00&M%>i=fyY$8PApQS_XO;N`GGYJfr8gKxxl=q3GeWP}*@EihX_=j>B(4Y3Hit zhU+XhSZ;^Xju%<(htl4cLDBaNl=j>Paiz}NASUA6YwsV2((b>5xFqLaAqfLR#T|30i~Y%q4e*Ya3{QwM$uL0CD4bjh5O;Z!56{pMaS6;-v=k* zci=8qVlqlOudw_gbV>glZiV|%-u3WqcnkbTxDj5>qH#8yfnq1GfHKangEHSfVEI}2 zRMKC9PlDfuG9HgYvEPds1g5I98cM!h@Y(QIcov+4=fT@7-we+u{az^be*}she*&HZ zAB0j)7oH2h0mY8KXZZ^#==BGRA6o^bo`U5Nlzwfu9J9R1J}<)ycplmNx7+)7 z+VowP_dx0QM=g)Q3rYW(<=3H<^Dj`^{|hMn`n64;jj=w3^!ZTw`CKUWQGlZF>!6I& zD11MB7mVNli?NjRK`8U*BbJBZg`__LMeoPq6X5rtl>aDv8vGd)y*%+6^ZYz0?Yq$O zSy1$PCAQ{Dk>4kf&mcY`_8@ar^zb%B`YS&0C?dW%``yUJMw_TW@n0)!x&uArCCCQkUgRCf zdy#h{e}a4*c^Q)bEhq6gArnX)c|0P&I}M!6Ed}qg*WxGF z+UqyNX=IsAzZ%|SufG7#MaGeay(id=yc;Bjx4q;`h( zVziy=tHJEnpvrF9JUZE~`jKh{?p)ce*hUnc&2EzDKWcLnC8@JHkcV4L%~5RA+u|rp z)tDQ4!MtZ}Z((wYoNYfy3x233TAtfLL0h&uTih^=Qsq}snLjnBs@{xW@w6t3*~6&i z#ct}USwF2u?NqsoJ6)6KY z<0)oL(@(Uu=YFoFOZ*!q{`A0gOad&BlJZpfP%S z(^2a$L#9O0v7@Qov7PDo3b&QwVtajGG!t&6g=fk1v(}1gLzuYp4u8RWwAh&=Ta$s!K5!Pm2tic>1VU!Zwku0h@!L2^#f*! zJB1IDB{7ZZPcd^b%ehR#te;QK28^oiK`|bx-#ypUjS!`BqbBUI8v}69-=x7Jdt5uIe57W;D zO?&*%6Gw8=J@F{{nld~U9pC`*qx+`&h{9i z-_ncTbTVIj{*lK*yfD3Z-W^*tX*Yad!B%y0bGZ)TGTj#pcXkHG(hP zDKW9wJyBopy6UE`nhK&>6Al*_Jdr8lHnV5D2uhvZ-ds6y4GOtTUild!nc%p)VJ+&IrTj#mZQ8LXr*jNJY0CB+(1U58L?8Pu^T25 z8>?0vrBNjcaL>er7?qBSX8nXH*dtIR!jP##WD)Dawom8*!+nlVPK+t+t~vBS=8r7i7N)u8R%UD_B_ns5^^9X8eIFsI#k(^xwsq$=wKH_g zh0MhXPxiO@eGpdNZmB69L=<_h_q){y_bNLx+huIuYtX`8hD28QGA>R$26u7G{AsoW z*%(eRiM`0lww0DycPCmB9?51{98#87zoMty1o4B+3MacT8xv<@E@baM$^OH5;z63w<^pC6}fJcoAF1l)An3la*< z-!|*n{Cn1>_HokC^qd#heN@q(C?>u5RJqC1{!w03Q|UF)z~xJ7n2 zY?`9DwszUr=wx9Fvqbi}g{@4fAvHKq8Y~P976wadU|^^;uzG+W84KfVnWY8&d;^72 zsW7l!4U~okOREP;IiE{Yw=jG_t2)!!z_kVb4PL8CFBmFaH&nXXsBM2?yT_)&sABhKx6BDzsaPr% z*Pn4wV?jH1gTgjq^<+q?5ECGsY#6+rNh+5cR)*^G4XU*2`epXaa;hCRDt`BfBzxE2 zzvG_e$@lNLThWaZ2ZJG%-H_ADM)zo^d$^UHI4G%R_i!*L7t`)c_kpx~h)Az{DCi#P zFea+*mtB>1kH%^DaG0)9Gj5IThidpqCkkphpPK0&qVs_pwgVM-9a4mSYx>S%L`5%jDjj**1V^?yN4Sm-&i8^W)H2QB6KPTXEoY%B&G^N-o2c0 zxgEm1gy(fP?H*C?%Fe2u+Lf1dMD0bV`_9-^Av$k#9};!dX>b}4rn{u7}0J5tq^k|5S@>zh(jnIak58g8-403K>aH5myB9=W0G?RPx% z7mR5=>gaq7aFF$=p^_-Z8eG-VXQW=fuGo zZ2xeKp>d<54YGTKW&k)>&1gSRAtyy9gR?&~#)9PBx~r8779X2ZJfXXe8ZuQ{3Rq<+IS2d)?n zu_()iK9V&l76z7+svO{Ac^(Bg?-K`Ozti#7sCq;e@wj9wiN%;~1&*(G$V$pN zRk?d;nuAO`POMUVhma+C#!GPVckP?9Jp=An$2oFihI3?}K}9)k*2}6a1@qgvc-<16*$K6rlN)oMTK4FSth?IR z^h?!6E^5H&E8kDi-84ZsJ<~>Q)p6RbGU}IEE{*Dqr-b#m6^R8Il=<@{U;W};%@@jy zHsh2t5hC@T{uWmr5w0Bz%94-mgvsui_RVTsPlS9xv4js;L}%1&#_6%_AU}qLc6fqQ z8N59yFT^+t?KDOAnV!zPII#hvpx@|S8T{uhAFO8MO-uSl>GG&loo^Vda;Mczvv3k6 z;FKR?{_FFS24DQUhZ=m#H=cLNbxKc{?Q>C_IKu(&%O+-+kSlOozMA4jo%2K@UBdF- z?U{&!X{*QuckL3?zuWX1aWuvM02!9KBU6xtV_&wxA+U?Rl(3q=YUT3wD$$Mvd+Z1} zsIPkg|M!3ea-!3Hi2MBjo91Nqme^d}+&#+wQpoRI%$+5&>*M;7h!2hg80?Yx?BGrJ z`@U_SCPv(v%WlalXop}swb{%-ZrfG3w@z;6c!YI`ZH>KhIhLD>f;riofIe%aqK6m0X=%vEZUX3x5qx^mOanOlO{VeBtkYpt{7cAoDLg&i{Z=YTTL`hMA zZ*(^CKUtC}oO8C(UfCf?2leL3V>#z&-VP?^_Xd_Kde>Qoyj~vb9%m5}Pw|;T2mDK% z`rBNtd9vj1AMGpDiE1N^B05-sMa*af# zd>$y6F;RpqW-0}EM>D-RRcE%E{R*o{w)s>25u3l@vBNKy6}yNT4!PJP>rVrXC}4ha zm=h=l(PLwZd3QqJo&w;|4ux|a3HN2<6GDisE)G&J)QK+-q$6}qm{MQ-@@bhylySKzF8?McD50`m=-ptu; z;?}&;$QJ_)OR$3xDiE-05~_}Ok8~3DK-~v8FU}oI=`!90S>+Ofy{01?5zrXQAe${G@gDxajH`w`2S_3N{Y83@I(LrSN}e65>VKpzGy| zt(6HWdc~tn*{5f1=($OTUpHue%ljF%&b(mSWB+^_Su;=l7}<0CM;pNQPh^XHrp04yt3Kk z;-C7#94gn}J-EYGTd!6p4(c^F=G>;S$ix0}%qNt2uVtn#GeWP$+q^pZndkWIt)<)m Ru@>hpc~3cEZY}Y`{{hFPMNt3% literal 0 HcmV?d00001 diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..9c0b115 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,682 @@ +# Hungarian translation of gst-plugins-good +# This file is distributed under the same license as the gst-plugins-good package. +# Copyright (C) 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# Laszlo Dvornik , 2004. +# Gabor Kelemen , 2007, 2008, 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.25.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-11-04 01:21+0100\n" +"Last-Translator: Gabor Kelemen \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Rosetta-Export-Date: 2007-07-27 19:18:15+0000\n" +"X-Generator: KBabel 1.11.4\n" +"X-Rosetta-Export-Date: 2007-07-27 19:18:15+0000\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Could not establish connection to sound server" +msgstr "Nem hozható létre kapcsolat a hangkiszolgálóhoz" + +msgid "Failed to query sound server capabilities" +msgstr "A hangkiszolgáló képességeinek lekérdezése meghiúsult" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "„%s” ettől: „%s”" + +msgid "Internal data stream error." +msgstr "Belső adatfolyam-hiba." + +msgid "Failed to decode JPEG image" +msgstr "A JPEG kép visszafejtése meghiúsult" + +msgid "Could not connect to server" +msgstr "Nem lehet csatlakozni a kiszolgálóhoz" + +msgid "Server does not support seeking." +msgstr "A kiszolgáló nem támogatja a tekerést." + +msgid "Could not resolve server name." +msgstr "Nem lehet feloldani a kiszolgáló nevét." + +msgid "Could not establish connection to server." +msgstr "Nem hozható létre kapcsolat a kiszolgálóhoz." + +msgid "Secure connection setup failed." +msgstr "A biztonságos kapcsolat kialakítása meghiúsult." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Hálózati hiba történt, vagy a kiszolgáló váratlanul lezárta a kapcsolatot." + +msgid "Server sent bad data." +msgstr "A kiszolgáló hibás adatokat küldött." + +msgid "No URL set." +msgstr "Nincs beállítva URL." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Nincs vagy érvénytelen bemeneti hang, az AVI-folyam sérült lesz." + +msgid "This file contains no playable streams." +msgstr "A fájl nem tartalmaz lejátszható adatfolyamokat." + +msgid "This file is invalid and cannot be played." +msgstr "A fájl nem érvényes és nem játszható le." + +msgid "This file is corrupt and cannot be played." +msgstr "A fájl sérült és nem játszható le." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "A fájl nem teljes és nem játszható le." + +msgid "The video in this file might not play correctly." +msgstr "A fájlban található videó lehet, hogy nem játszható le megfelelően." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"A fájl túl sok adatfolyamot tartalmaz. Csak az első %d kerül lejátszásra." + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Nem található támogatott adatfolyam. Telepítse a GStreamer RTSP bővítményt a " +"Real media adatfolyamokhoz." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Nem található támogatott adatfolyam. Lehet, hogy több átviteli protokollt " +"kell engedélyezni, vagy hiányzik a megfelelő GStreamer RTSP bővítmény." + +msgid "Internal data flow error." +msgstr "Belső adatfolyam-hiba." + +msgid "Volume" +msgstr "Hangerő" + +msgid "Bass" +msgstr "Basszus" + +msgid "Treble" +msgstr "Magas" + +msgid "Synth" +msgstr "Szintet." + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Hangfal" + +msgid "Line-in" +msgstr "Vonalbemenet" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Keverő" + +msgid "PCM-2" +msgstr "2. PCM" + +msgid "Record" +msgstr "Felvétel" + +msgid "In-gain" +msgstr "Be-erősítés" + +msgid "Out-gain" +msgstr "Ki-erősítés" + +msgid "Line-1" +msgstr "1. vonal" + +msgid "Line-2" +msgstr "2. vonal" + +msgid "Line-3" +msgstr "3. vonal" + +msgid "Digital-1" +msgstr "1. digitális" + +msgid "Digital-2" +msgstr "2. digitális" + +msgid "Digital-3" +msgstr "3. digitális" + +msgid "Phone-in" +msgstr "Hang-be" + +msgid "Phone-out" +msgstr "Hang-ki" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Rádió" + +msgid "Monitor" +msgstr "Monitor" + +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." + +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." + +msgid "Could not open audio device for playback." +msgstr "Nem nyitható meg hangeszköz a lejátszáshoz." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Nem nyitható meg hangeszköz a felvételhez. Nincs jogosultsága az eszköz " +"megnyitására." + +msgid "Could not open audio device for recording." +msgstr "Nem nyitható meg hangeszköz a felvételhez." + +msgid "Could not open audio device for mixer control handling." +msgstr "Nem nyitható meg hangeszköz a keverővezérlő kezeléséhez." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Nem nyitható meg hangeszköz a keverővezérlő kezeléséhez. Az Open Sound " +"System ezen verzióját az elem nem támogatja." + +msgid "Master" +msgstr "Fő hangerő" + +msgid "Front" +msgstr "Elülső" + +msgid "Rear" +msgstr "Hátsó" + +msgid "Headphones" +msgstr "Fülhallgató" + +msgid "Center" +msgstr "Középső" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Térhatású" + +msgid "Side" +msgstr "Oldalsó" + +msgid "Built-in Speaker" +msgstr "Beépített hangszóró" + +msgid "AUX 1 Out" +msgstr "1. AUX ki" + +msgid "AUX 2 Out" +msgstr "2. AUX ki" + +msgid "AUX Out" +msgstr "AUX ki" + +msgid "3D Depth" +msgstr "3D mély" + +msgid "3D Center" +msgstr "3D középső" + +msgid "3D Enhance" +msgstr "3D javítás" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Vonalkimenet" + +msgid "Line In" +msgstr "Vonalbemenet" + +msgid "Internal CD" +msgstr "Belső CD" + +msgid "Video In" +msgstr "Video be" + +msgid "AUX 1 In" +msgstr "1. AUX be" + +msgid "AUX 2 In" +msgstr "2. AUX be" + +msgid "AUX In" +msgstr "AUX be" + +msgid "Record Gain" +msgstr "Felvételerősítés" + +msgid "Output Gain" +msgstr "Kimeneterősítés" + +msgid "Microphone Boost" +msgstr "Mikrofonerősítés" + +msgid "Loopback" +msgstr "Visszacsatolás" + +msgid "Diagnostic" +msgstr "Diagnosztika" + +msgid "Bass Boost" +msgstr "Basszuskiemelés" + +msgid "Playback Ports" +msgstr "Lejátszási portok" + +msgid "Input" +msgstr "Bemenet" + +msgid "Record Source" +msgstr "Felvétel forrása" + +msgid "Monitor Source" +msgstr "Monitor forrása" + +msgid "Keyboard Beep" +msgstr "Billentyűzetcsengő" + +msgid "Simulate Stereo" +msgstr "Sztereó szimulálása" + +msgid "Stereo" +msgstr "Sztereó" + +msgid "Surround Sound" +msgstr "Térhatású hang" + +msgid "Microphone Gain" +msgstr "Mikrofonerősítés" + +msgid "Speaker Source" +msgstr "Hangfalforrás" + +msgid "Microphone Source" +msgstr "Mikrofonforrás" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Középső / LFE" + +msgid "Stereo Mix" +msgstr "Sztereó keverés" + +msgid "Mono Mix" +msgstr "Monó keverés" + +msgid "Input Mix" +msgstr "Bemeneti keverés" + +msgid "SPDIF In" +msgstr "SPDIF be" + +msgid "SPDIF Out" +msgstr "SPDIF ki" + +msgid "Microphone 1" +msgstr "1. mikrofon" + +msgid "Microphone 2" +msgstr "2. mikrofon" + +msgid "Digital Out" +msgstr "Digitális ki" + +msgid "Digital In" +msgstr "Digitális be" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Mobiltelefon" + +msgid "Other" +msgstr "Egyéb" + +msgid "None" +msgstr "Nincs" + +msgid "On" +msgstr "Be" + +msgid "Off" +msgstr "Ki" + +msgid "Mute" +msgstr "Némítás" + +msgid "Fast" +msgstr "Gyors" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Nagyon alacsony" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Alacsony" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Közepes" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Magas" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Nagyon magas" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Éles" + +msgid "Front Panel Microphone" +msgstr "Előlapi mikrofon" + +msgid "Front Panel Line In" +msgstr "Előlapi vonalbemenet" + +msgid "Front Panel Headphones" +msgstr "Előlapi fülhallgató" + +msgid "Front Panel Line Out" +msgstr "Előlapi vonalkimenet" + +msgid "Green Connector" +msgstr "Zöld csatlakozó" + +msgid "Pink Connector" +msgstr "Rózsaszín csatlakozó" + +msgid "Blue Connector" +msgstr "Kék csatlakozó" + +msgid "White Connector" +msgstr "Fehér csatlakozó" + +msgid "Black Connector" +msgstr "Fekete csatlakozó" + +msgid "Gray Connector" +msgstr "Szürke csatlakozó" + +msgid "Orange Connector" +msgstr "Narancs csatlakozó" + +msgid "Red Connector" +msgstr "Vörös csatlakozó" + +msgid "Yellow Connector" +msgstr "Sárga csatlakozó" + +msgid "Green Front Panel Connector" +msgstr "Zöld előoldali csatlakozó" + +msgid "Pink Front Panel Connector" +msgstr "Rózsaszín előoldali csatlakozó" + +msgid "Blue Front Panel Connector" +msgstr "Kék előoldali csatlakozó" + +msgid "White Front Panel Connector" +msgstr "Fehér előoldali csatlakozó" + +msgid "Black Front Panel Connector" +msgstr "Fekete előoldali csatlakozó" + +msgid "Gray Front Panel Connector" +msgstr "Szürke előoldali csatlakozó" + +msgid "Orange Front Panel Connector" +msgstr "Narancs előoldali csatlakozó" + +msgid "Red Front Panel Connector" +msgstr "Vörös előoldali csatlakozó" + +msgid "Yellow Front Panel Connector" +msgstr "Sárga előoldali csatlakozó" + +msgid "Spread Output" +msgstr "Szóráskimenet" + +msgid "Downmix" +msgstr "Lekeverés" + +msgid "Virtual Mixer Input" +msgstr "Virtuális keverőbemenet" + +msgid "Virtual Mixer Output" +msgstr "Virtuális keverőkimenet" + +msgid "Virtual Mixer Channels" +msgstr "Virtuális keverőcsatornák" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d funkció" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s funkció" + +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. Az Open Sound System ezen " +"verzióját az elem nem támogatja." + +msgid "Playback is not supported by this audio device." +msgstr "Ez a hangeszköz nem támogatja a lejátszást." + +msgid "Audio playback error." +msgstr "Hanglejátszási hiba." + +msgid "Recording is not supported by this audio device." +msgstr "Ez a hangeszköz nem támogatja a felvételt." + +msgid "Error recording from audio device." +msgstr "Hiba a hangeszközről való felvételkor." + +msgid "Gain" +msgstr "Erősítés" + +msgid "Headphone" +msgstr "Fejhallgató" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Hiba %d bájt olvasásakor a következő eszközről: „%s”." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Váratlan keretméret (%u) érkezett %u helyett." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Hiba %d bájt olvasásakor a következő eszközről: „%s”." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"hiba a(z) „%s” eszköz képességeinek lekérésekor. Ez nem egy v4l2 meghajtó. " +"Ellenőrizze, hogy nem v4l1 meghajtó-e." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "A(z) %d bemenet attribútumainak lekérése meghiúsult a(z) %s eszközön" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "A(z) %d. tuner beállításának lekérése a(z) „%s” eszközön meghiúsult." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "A norma lekérdezése meghiúsult a(z) „%s” eszköztől." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "A vezérlőattribútumok lekérése meghiúsult a(z) „%s” eszközön." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Nem azonosítható a(z) „%s” eszköz." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Ez nem egy eszköz: „%s”." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Nem lehet olvasásra és írásra megnyitni a(z) „%s” eszközt." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "A(z) „%s” eszköz nem rögzítőeszköz." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "A(z) „%s” eszköz nem kimeneti eszköz." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "A norma beállítása meghiúsult a(z) „%s” eszközön." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"A tuner aktuális frekvenciájának lekérdezése meghiúsult a(z) „%s” eszköztől." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"A tuner aktuális frekvenciájának beállítása meghiúsult a(z) „%s” eszközön " +"%lu Hz-re." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "A jelerősség lekérdezése meghiúsult a(z) „%s” eszközön." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "A(z) %d. vezérlőelem értékének lekérése meghiúsult a(z) „%s” eszközön." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"A(z) $%2d érték beállítása $%1d vezérlőelemhez meghiúsult a(z) „%s” eszközön." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Az aktuális bemenet lekérése meghiúsult a(z) „%s” eszközről. Lehet, hogy ez " +"egy rádióeszköz." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "A(z) %d. bemenet beállítása meghiúsult a(z) „%s” eszközön." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Az aktuális bemenet lekérése meghiúsult a(z) „%s” eszközről. Lehet, hogy ez " +"egy rádióeszköz." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "A(z) %d. bemenet beállítása meghiúsult a(z) „%s” eszközön." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Nem állíthatók sorba a pufferek a(z) „%s” eszközben." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Nem sikerült videokockákat lekérni a(z) „%s” eszköztől." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Hiba %d próbálkozás után. Eszköz: %s. Rendszerhiba: %s." + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Nem kérhetők le a(z) „%s” eszköz paraméterei" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"A videobemeneti eszköz nem fogadta el az új képkockasebesség-beállítást." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Nem képezhetők le a(z) „%s” eszköz pufferei" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"A(z) „%s” eszköz illesztőprogramja nem támogat egyetlen ismert felvételi " +"módot sem." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "A felbontás módosítása futás közben még nem támogatott." + +msgid "Cannot operate without a clock" +msgstr "Óra nélkül lehetetlen a működés" diff --git a/po/id.gmo b/po/id.gmo new file mode 100644 index 0000000000000000000000000000000000000000..451ab4f25a2a6a5c7ec780404c3525c497b613d8 GIT binary patch literal 14636 zcmchd3y>T~dB?|3glywC7z1$|Tb6C%@BkuFsI3Njm4`AUN*0AUO3@Jq?00&Ip31z%$_~ z&_KOf3!e|gO|Y-XE{#5 z3i%hp)$sN368JE@68=5B4W4zjEB_{Vfc&HIrSR-?7(2WZUJkzjZ-grt+y)pz_3IvZ zG5j#R2!0)Eyg&6^@l+@8v!Ud7f#+qO8=&NN9Sq@Ccqx1@RDZt&pA8>_6Y%_}IZi{3 z`*ye;z76hx{{*jqW9J3IIIKg-;muIre-^6${{_|WwNH2Be?GjP{L7%8KMFOTZ^Kpa zBqr%Oa1FHMhnnAe;7Ra4NEd^5LPQvR6e6H^DE-(E zHLi#sm479ad|nMDzq_F1`xgKHUH<+1p!)GasB#~H((^xo3?cXeQK?p~~%pDt8mq_ci~%;h8}7w}8^y+dba^rSJDa zjr&1}3J0Hr8pmIIei^EruS3b}+feO&AFBWV4K>dHg_`%3&tk6OW|+ahgDSThWmW%X zpw`zMRQoqTJ`I{s?cNDh|LdXZy&LMgcl!75_V3>hCFh5s`t>QOdHjOU|0`Ta{y(9{ zf5`=|{&A@OTnQ!DYoXeigqnxFa6NpH&))?#e{X~8*GHh*{S4$^@E80T_+7}73s#a* z{RT>|tDxlf9H@R?2i49VsP=Dy>R$*|e;cY?0VR(+pxS#KoPu{l_3!I&HC%Zix(g@Z z<*)0YRMJ^(eo zN1*ijvrzN-ZK(PDA$d*Ui$4DI8e>$*=|0&kV{A-3B$zN1*28Zz2DJ6Zm)yyc}vC4!{b$16~IohKukAPoK`5q0n_D0!Sf;~L*-P~(0E)bq&p5K9n{3&Z)yKAAf=TPmw8Sa9gfV<&I40a2AK9qd!h8y8u!mHrp zkSc?#5Qe_5Lxvi>22R2cLAC#5$dH3)t#j|ULw(xKX>-F$NxF72Ko8TGnKB)P75IzNd9_qWVL6!d@lzbk8lHcQ=PeuqQlRq1t3eSfs zw;G-T*Lhw8wJx?p^{WP@XRm;&|896XyceDTAAtJ)A*gyk4pr~xJpab?t5D^>30J`H zLG|ZHol3!Cq0j(dAp1B2GZ+E&mp~&^fc11lip1FG)b3qLVBk)w3GCEqywakG((auYklZ? z4e2eU&nV-s--q{+UQLodbx0SGMz4?h2X}a01S8TbNm^gJCP{VDTGG==?9n%CD^?GMl)`9CjMq`k=wh8^3jATANeviTh!y!blc%#HLUqgRDvyGuV;VEmNf0< z!IrjOPP&%U%;&ddX_A|nFp1hr-WAbk_An)jxSfy1iJ9$2VG99GP6d-;lBBtb>xe9# zUo`dTU|fr=BrE01v>Rn%9+`zWZ>B|VLW!r=3cQ#d%sR7Y+ty$bF*o9*VX~-~whK*_ z33HPbRNskA+%sx!G0IJ^=yuZ#S<+5gwCnbT7q-b$KNCamqU5DT#8|7v{Ct%43blxiUUbQ@H2RXag z%cD*?GyPf7ddl@>)Q&nR$C2AFmHHS;vOcZ4(M&ax))ZQGv>c)(O{5TZyY09ZN{x=C z+F$sP%?r}P)YD{j&V(I|3@fG+_pHRxJ3C*pE^d~OJd!M`rCI%`W_?if=j+3eA{%L8 z7KQ2nGf_7SS)7k_#x8FL>g{F1lBfiJHmy1KD;--Ac5_T@f9%T^!mM<$ETw#=;;@lm z2;*8X6*uBMY|E&Yx3Z)Der&vdH_^Y_5KN^D3Ck$hYHd8LR^3-m!fM=REK$#nacIn& z%ucLePZJoLgB#lurk=$tnu?ihM%dzb-oz^4-j0`VeG8?q*r2M5xoRI-^p(RETxvoF z#r*uciiS-@CD<0mZB|J*j}6k6m}iWqQks}m-1gj(wmaM=v#M8q(ieoYEes~-<7%NE zk9Nejg7(%?#(HFS&1~In;!fCz%IbJ0gUAM&VIZ)_n!=HK%yhWO+U^T43$_0_!5^j` zuM0naMLGL*h6E$_jik0XI^}&y`f>EUn#e@jFOls?Cq{bQiyH~5*~=M!BX1t5frDY2 z?MsWRH11E>0=>?#ghNw=4q6%W*c=J&coJ zJ1)||*L2-6z4+Eh+xMyhiLzyfXs2?OV0*?Io9sJ_HalGX@T-V@e>A^**&S2UJA)mV zf95dgk8p6;3wFefX0S6EYpBmVrJ3&6Ok;X?$_3Zzz{%|2*TXzC^X+uOdEb?hH(E$x zXYh`xj4^aM4wOb;33lNY2fL%iY8qyBvn7hUft=1#(3TReZrB+LiOo z%|bBEj7C{79o6Ha6AVqn;MR-}JvS4>8RxAJ6}8hhl*h%&ICUTpHG&zXjWmgKe0ooL zVYWz`q(*|9#vBLFOU?d$d)Qs^ySQgv#EFxJTTOOHSZg*P*lDc~LR*O2Z5diNj;!dq z&j!w%m+V5QjStthVx5H!6PR-#ir7R_6Sg%mos_*g&%&f9@7#2=G*4@3n+*cb6g{(k z*+SgI507wF@o}_z@NF_%+4fmGhuGbHbF(uhx+RYi>jrh(1?K`gnq%vhl%1}z@gAXW zyWsals9cBH4835mG|yvY27Bk{gS|1~x(aPsoNpJ>f_kw=byH5jAmG1abUtlIn>xDZI@6*m2 zF#e1mxep$$yY5k`Y%ZsnJIZ$Up&|pbq1^JrnVp&1xy|fM0(YaeI2-ANJ$w>FtBbCg zw{A>@_x8kHPqDZ<8~P!m`%#M?_6zjnV^pzvG9o<1QuEU(+B%xfvWTNJC=a%t<#1=a za?o@fmyIgR+E46~o5h3CstC#(cQguS7ZaifbDV&jah{V4Z{0$f-l3fe*MFq$m~tpi}qVh{(PMEa$LxvPtgZ&L9FLrbKwD&x_YIv`k)nx z#z`&hblaSUkFK;g=o~2yQ*r5m56PA$vxtEP2jmXfJ;&b3dLPhs?S7?nHtYQjUqhV@ zL|PTrYJ`HYbqjtwwGj<8(H(3K#93ZoIjo_^u zMihgE;_}Ncl@~NyLvDvH*U*aVaBi8wEpTf>#wBT z9yZpoIqf4X&@|g*HYfFF+zN4->YZ>QOw6_T7J5?Y`X|>nI@p8?D)n4GPZ|Yhjj=gA z0uE;hhwG>p>odDKQK@=>8`K$#>(>+P$$J%CTDDUBzD86b%r~fI69KN3(>tfP4um&e zS-%q5vpvzx#V+H`*{s%~=5cb3sWrn4<+yJD+_tf+2IVvyVozgR(R-baH<_!dalSGj z64~g*oV2u<`kBBUgwuA^>_;Z&I4FcoT$p;;4q2II!xYC>q6MsnMk8)2KNn>;W6Lps z)go+~1|@TIbC}Uyn5@Me3XAgCO<<;wEo~v379HqCHKJ1{kE`LBe##)_bl59eK2Eti zY8UJgie64|IxAmHn4uSg$L?W>Pinh?{R}g#a64|fz?F?%4u>vxt1C=6D>V;0K|kxl zmc(Nj^vJ6%aaJr}(7u^LW&|L6W|n@32JuwmBvkNnE^M(IbP*4NK+~Dacpi;H67~3C zh=I}!U_koisu7O1DvM1XCfyLZb`ZFo6bB#2oaR|kMf@&~DcOd!vk?l*e@`fS)B}7o>}7vRA}M*|O98mL{V8vwdTx zoK6zrL<01O`LrUn9SR9_TFsRK`kDIli@!RIl|&s>H8BK0IdRy9P8@V#eE2hf zUi*c>T4(B8VfP8jw5)v&(E%R?jeFd=AgHs;WzHMyqYH&P`#rqu(dDqyE$Cf2)V|47 zG!!#ecAe9lLZZY%Bj&e@(l!a`70f$FO{>D*E2h*q@d&$BSeu3Dh{Ui*N`yRxOs)V-1TcYT&!EUq@|vMuXZ=(`twiOUWxNN+C>m4_6_=r66wRzFR62 zbh;h0$=bLmUzZh>T~SM=a%0ChQRBwMrWWIt*cjUj%cHvWhW0&ic-$Q@n-uu8f(EjBeRM zw2F}Zm$_i?E9L1&J}l_rrji)T=tbYs?!`1Q)yucWh|soj7EAdrDc+xdSC$|HbrOGE zIyb)eP8hD_VBPpXez>i*uS`}T3OgU2SPffw88{uO<1qamnh4ic+4m=!GFP&%J|m(y zq)I1kO8Jo=N#M+sR@`7|^z{p84T~51Gw-2RU=o**zvsv?90V7AVAVafRu662Mf^Nl z^2S-fWnWFltt_1<~XD^hEBN-|-~`4G0Sm44}(_S>*dMaB6vopN{3f2@%I+=y=_zQ_c$qbf&6 zly#AQ_G7j>+}J*}q9!&|&Nk5-MPChvMEcMBkx;5_w~BM({qSS#8QU#?`LR8-!P+A= z=WL3V%OGBhOst>2xgH|gJm${}^`bjiT)U+G;UGV}*!;UaEN^7N@mfdRa*32VGZMG8 zaXn%PP7BLi%YHj(W}4Gt)9eayWCst2+a4~!b8MYXhBG=S2lm$=mzO(*_$|+!kL+2* z26Q>f2QHku1&@ZAZV=1GC3e4V9A0njbJqNfbDC-S=-TO@%We0cU}Qd$>(;i5>iV^< zbGhI9Im+4iL#U8OBg99llyP0x9dyH;k#*c9MnNE_U&8857ITh9Yx$o-c74neVe;W! z)YXS<)#4x$5O@)cJnc{SY*b|m{HL;y{&qHEjybO&RTohhelUpm@_)>xT&#C=&+=!U zazvbr_4jcGW@o=E54p=x-7jW*6^X;eCh;z?NSyO@@-*ej))~shG3v29XA;WLvh_=H z%it3yPU=8D&a${>Xp{dw;l3s&Gx)$4#iF*^K1*YvwO29xb#GCjfR2sou-UVa3EG6i z-`n}1cPQ3qFPF6AI@YG&9B+=gJO=V`Wp^T={t09#mg9oKv$AWs@mr$L`3+<^D(v)j z${ol$Zs+u_h&#FRUj+D14Vt}DnH3#M`z`@G#GhDqhx${d-9L;E0Qc?x(x-j(Tl&}s di2KV9%McR>EQ4jk24&>c?jn(@E?d;U`#-WStFiz9 literal 0 HcmV?d00001 diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..14130d9 --- /dev/null +++ b/po/id.po @@ -0,0 +1,718 @@ +# Indonesian translations for gst-plugins-good package. +# This file is put in the public domain. +# +# Andhika Padmawan , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-02-26 18:09+0700\n" +"Last-Translator: Andhika Padmawan \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "Tak dapat membangun koneksi ke server suara" + +msgid "Failed to query sound server capabilities" +msgstr "Gagal untuk kueri kemampuan server suara" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' oleh '%s'" + +msgid "Internal data stream error." +msgstr "Galat arus data internal." + +msgid "Failed to decode JPEG image" +msgstr "Gagal untuk mengawasandi citra JPEG" + +msgid "Could not connect to server" +msgstr "Tak dapat menghubungi server" + +msgid "Server does not support seeking." +msgstr "Server tidak mendukung pencarian." + +msgid "Could not resolve server name." +msgstr "Tak dapat menemukan nama server." + +msgid "Could not establish connection to server." +msgstr "Tak dapat membangun koneksi ke server." + +msgid "Secure connection setup failed." +msgstr "Pengaturan koneksi aman gagal." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Terjadi sebuah galat jaringan, atau server menutup koneksi secara tiba-tiba." + +msgid "Server sent bad data." +msgstr "Server mengirim data rusak." + +msgid "No URL set." +msgstr "Tak ada URL yang ditentukan." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Masukan audio tidak ada atau tidak sah, arus AVI akan rusak." + +msgid "This file contains no playable streams." +msgstr "Berkas ini tidak berisi arus yang dapat diputar." + +msgid "This file is invalid and cannot be played." +msgstr "Berkas ini tidak sah dan tak dapat diputar." + +msgid "This file is corrupt and cannot be played." +msgstr "Berkas ini rusak dan tak dapat diputar." + +msgid "Invalid atom size." +msgstr "Ukuran atom tidak sah." + +msgid "This file is incomplete and cannot be played." +msgstr "Berkas ini tidak lengkap dan tak dapat diputar." + +msgid "The video in this file might not play correctly." +msgstr "Video di berkas ini mungkin tak dapat diputar dengan benar." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Berkas ini berisi terlalu banyak arus. Hanya memutar %d pertama" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Tak ada arus didukung yang ditemukan. Anda mungkin perlu menginstal plugin " +"ekstensi GStreamer RTSP untuk arus Real media." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Tak ada arus didukung yang ditemukan. Anda mungkin ingin mengizinkan lebih " +"banyak transportasi atau kehilangan plugin ekstensi GStreamer RTSP yang " +"benar." + +msgid "Internal data flow error." +msgstr "Galat aliran data internal." + +msgid "Volume" +msgstr "Volume" + +msgid "Bass" +msgstr "Bas" + +msgid "Treble" +msgstr "Treble" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Pengeras Suara" + +msgid "Line-in" +msgstr "Jalur masuk" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mixer" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Rekam" + +msgid "In-gain" +msgstr "Masukan-gain" + +msgid "Out-gain" +msgstr "Keluaran-gain" + +msgid "Line-1" +msgstr "Jalur-1" + +msgid "Line-2" +msgstr "Jalur-2" + +msgid "Line-3" +msgstr "Jalur-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +msgid "Phone-in" +msgstr "Telepon-masuk" + +msgid "Phone-out" +msgstr "Telepon-keluar" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Tak dapat membuka divais audio untuk putar kembali. Divais sedang digunakan " +"oleh aplikasi lain." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Tak dapat membuka divais audio untuk putar kembali. Anda tak memiliki hak " +"akses untuk membuka divais." + +msgid "Could not open audio device for playback." +msgstr "Tak dapat membuka divais audio untuk putar kembali." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Tak dapat membuka divais audio untuk merekam. Anda tak memiliki hak akses " +"untuk membuka divais." + +msgid "Could not open audio device for recording." +msgstr "Tak dapat membuka divais audio untuk merekam." + +msgid "Could not open audio device for mixer control handling." +msgstr "Tak dapat membuka divais audio untuk menangani kontrol mixer." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Tak dapat membuka divais audio untuk menangani kontrol mixer. Versi Open " +"Sound System ini tidak didukung oleh elemen ini." + +msgid "Master" +msgstr "Master" + +msgid "Front" +msgstr "Depan" + +msgid "Rear" +msgstr "Belakang" + +msgid "Headphones" +msgstr "Headphone" + +msgid "Center" +msgstr "Tengah" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Sekeliling" + +msgid "Side" +msgstr "Sisi" + +msgid "Built-in Speaker" +msgstr "Pengeras Suara Terbina" + +msgid "AUX 1 Out" +msgstr "AUX 1 Keluar" + +msgid "AUX 2 Out" +msgstr "AUX 2 Keluar" + +msgid "AUX Out" +msgstr "AUX Keluaran" + +msgid "3D Depth" +msgstr "Kedalaman 3D" + +msgid "3D Center" +msgstr "3D Tengah" + +msgid "3D Enhance" +msgstr "Dipercanggih 3D" + +msgid "Telephone" +msgstr "Telepon" + +msgid "Line Out" +msgstr "Jalur Keluar" + +msgid "Line In" +msgstr "Jalur Masuk" + +msgid "Internal CD" +msgstr "CD Internal" + +msgid "Video In" +msgstr "Video Masuk" + +msgid "AUX 1 In" +msgstr "AUX 1 Masuk" + +msgid "AUX 2 In" +msgstr "AUX 2 Masuk" + +msgid "AUX In" +msgstr "AUX Masuk" + +msgid "Record Gain" +msgstr "Rekam Gain" + +msgid "Output Gain" +msgstr "Keluaran Gain" + +msgid "Microphone Boost" +msgstr "Mikrofon Boost" + +msgid "Loopback" +msgstr "Loopback" + +msgid "Diagnostic" +msgstr "Diagnosis" + +msgid "Bass Boost" +msgstr "Bass Boost" + +msgid "Playback Ports" +msgstr "Pangkalan Putar" + +msgid "Input" +msgstr "Masukan" + +msgid "Record Source" +msgstr "Sumber Rekaman" + +msgid "Monitor Source" +msgstr "Sumber Monitor" + +msgid "Keyboard Beep" +msgstr "Bip Papan Ketik" + +msgid "Simulate Stereo" +msgstr "Simulasi Stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Suara Sekeliling" + +msgid "Microphone Gain" +msgstr "Mikrofon Gain" + +msgid "Speaker Source" +msgstr "Sumber Pengeras Suara" + +msgid "Microphone Source" +msgstr "Sumber Mikrofon" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Tengah / LFE" + +msgid "Stereo Mix" +msgstr "Mix Stereo" + +msgid "Mono Mix" +msgstr "Mix Mono" + +msgid "Input Mix" +msgstr "Mix Masukan" + +msgid "SPDIF In" +msgstr "SPDIF Masuk" + +msgid "SPDIF Out" +msgstr "SPDIF Keluar" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Digital Keluar" + +msgid "Digital In" +msgstr "Digital Masuk" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Handset" + +msgid "Other" +msgstr "Lainnya" + +msgid "None" +msgstr "Tidak Ada" + +msgid "On" +msgstr "Hidup" + +msgid "Off" +msgstr "Mati" + +msgid "Mute" +msgstr "Diam" + +msgid "Fast" +msgstr "Cepat" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Sangat Rendah" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Rendah" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Sedang" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Tinggi" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Sangat Tinggi" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produksi" + +msgid "Front Panel Microphone" +msgstr "Mikrofon Panel Depan" + +msgid "Front Panel Line In" +msgstr "Masukan Jalur Panel Depan" + +msgid "Front Panel Headphones" +msgstr "Headphone Panel Depan" + +msgid "Front Panel Line Out" +msgstr "Keluaran Jalur Panel Depan" + +msgid "Green Connector" +msgstr "Konektor Hijau" + +msgid "Pink Connector" +msgstr "Konektor Merah Jambu" + +msgid "Blue Connector" +msgstr "Konektor Biru" + +msgid "White Connector" +msgstr "Konektor Putih" + +msgid "Black Connector" +msgstr "Konektor Hitam" + +msgid "Gray Connector" +msgstr "Konektor Abu-Abu" + +msgid "Orange Connector" +msgstr "Konektor Jingga" + +msgid "Red Connector" +msgstr "Konektor Merah" + +msgid "Yellow Connector" +msgstr "Konektor Kuning" + +msgid "Green Front Panel Connector" +msgstr "Konektor Panel Depan Hijau" + +msgid "Pink Front Panel Connector" +msgstr "Konektor Panel Depan Merah Jambu" + +msgid "Blue Front Panel Connector" +msgstr "Konektor Panel Depan Biru" + +msgid "White Front Panel Connector" +msgstr "Konektor Panel Depan Putih" + +msgid "Black Front Panel Connector" +msgstr "Konektor Panel Depan Hitam" + +msgid "Gray Front Panel Connector" +msgstr "Konektor Panel Depan Abu-Abu" + +msgid "Orange Front Panel Connector" +msgstr "Konektor Panel Depan Jingga" + +msgid "Red Front Panel Connector" +msgstr "Konektor Panel Depan Merah" + +msgid "Yellow Front Panel Connector" +msgstr "Konektor Panel Depan Kuning" + +msgid "Spread Output" +msgstr "Keluaran Sebar" + +msgid "Downmix" +msgstr "Downmix" + +msgid "Virtual Mixer Input" +msgstr "Masukan Mixer Virtual" + +msgid "Virtual Mixer Output" +msgstr "Keluaran Mixer Virtual" + +msgid "Virtual Mixer Channels" +msgstr "Kanal Mixer Virtual" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Fungsi %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Fungsi %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Tak dapat membuka divais audio untuk putar kembali. Versi Open Sound System " +"ini tidak didukung oleh elemen ini." + +msgid "Playback is not supported by this audio device." +msgstr "Putar balik tidak didukung oleh divais audio ini." + +msgid "Audio playback error." +msgstr "Galat putar balik audio." + +msgid "Recording is not supported by this audio device." +msgstr "Perekaman tidak didukung oleh divais audio ini." + +msgid "Error recording from audio device." +msgstr "Galat merekam dari divais audio." + +msgid "Gain" +msgstr "Gain" + +msgid "Headphone" +msgstr "Headphone" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Galat membaca %d bita dari divais '%s'." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Mendapatkan ukuran bingkai %u ketimbang %u yang tak diharapkan." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Galat membaca %d bita pada divais '%s'." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Galat mendapatkan kemampuan untuk divais '%s': Itu bukan diver v4l2. Cek " +"apakah itu merupakan driver v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Gagal kueri atribut masukan %d di divais %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Gagal mendapatkan pengaturan tuner %d di divais '%s'." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Gagal kueri standar di divais '%s'." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Gagal mendapatkan kendali atribut di divais '%s'." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Tak dapat mengidentifikasi divais '%s'." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Ini bukan divais '%s'." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Tak dapat membuka divais '%s' untuk dibaca dan ditulis." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Divais '%s' bukan divais penangkap." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Divais '%s' bukan divais keluaran." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Gagal mengatur standar untuk divais '%s'." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Gagal untuk mendapatkan frekuensi tuner terkini untuk divais '%s'." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "Gagal mengatur frekuensi tuner terkini untuk divais '%s' ke %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Gagal mendapatkan kekuatan sinyal untuk divais '%s'." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Gagal mendapatkan nilai untuk kendali %d di divais '%s'." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Gagal mengatur nilai %d untuk kendali %d di divais '%s'." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Gagal mendapatkan masukan terkini di divais '%s'. Mungkin itu divais radio" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Gagal mengatur masukan %d di divais %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Gagal mendapatkan keluaran terkini di divais '%s'. Mungkin itu divais radio" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Gagal mengatur keluaran %d di divais %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Tak dapat mengantrekan penyangga di divais '%s'." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Gagal mencoba untuk mendapatkan bingkai video dari divais '%s'." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Gagal setelah %d percobaan. divais %s. galat sistem: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Tak bisa mendapatkan parameter di divais '%s'" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Divais masukan video tak menerima pengaturan rasio bingkai baru." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Tak dapat memetakan penyangga dari divais '%s'" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Driver dari divais '%s' tak mendukung metode penangkap apapun yang dikenal." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Mengubah resolusi saat waktu berjalan belum didukung." + +msgid "Cannot operate without a clock" +msgstr "Tak dapat beroperasi tanpa jam" + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Gagal menyebutkan kemungkinan format video yang dapat bekerja dengan " +#~ "divais '%s'." + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "Tipe penyangga tidak didukung, atau indeks di luar batas, atau tak ada " +#~ "penyangga yang telah dialokasikan, atau userptr atau panjang tidak sah. " +#~ "divais %s" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "Gagal mencoba untuk mendapatkan bingkai video dari divais '%s'. Tak cukup " +#~ "memori." + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "kekurangan memori untuk mengantrekan penyangga penunjuk pengguna. divais " +#~ "%s." + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "Tak ada penyangga bebas ditemukan di lubuk pada indeks %d." + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "Divais '%s' tak dapat menangkap di %dx%d" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "Divais '%s' tak dapat menangkap dalam format yang ditentukan" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "Tak bisa mendapatkan penyangga dari divais '%s'." + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "Tak bisa mendapatkan penyangga yang cukup dari divais '%s'." + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Galat memulai penangkapan arus dari divais '%s'." + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Galat menghentikan penangkapan arus dari divais '%s'." + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "Gagal mendapatkan kendali atribut di divais '%s.'" diff --git a/po/insert-header.sin b/po/insert-header.sin new file mode 100644 index 0000000..b26de01 --- /dev/null +++ b/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/it.gmo b/po/it.gmo new file mode 100644 index 0000000000000000000000000000000000000000..23802b50dc171cb4d1a6d456e60ac800fa9bfa6a GIT binary patch literal 15204 zcmd6t36LCDdB-0<0Lx%wurZf$bI9_wqurIUjWD2NSJDc}T5Hz=V~+IB^v<@`(>-+e zNM41@CKzJkaK(T*48bNGj)9Os0J{o>1I5n+;8VbV2l;1CKFyfpz^8#)$JyZ1!OK9+b2TWw7r=|a4AgkH zgXe+wc>FQgpndw|jadV32G0Taf|r2r0AB~*2kO1;PcUW=Sc0ztzX84&eE#XioDbd% zz687nTn9dxMT)PT;IqL5d=~h2Q0x7y$9q7@`x~I-_g#+D<{x&0gr!T$o!1z-6@ z$M2iLXVU%@I0=5sXq{5(+oH-O?}8q|K5 zApgu8_)q$9E2#bZB&h!Pfs)5JK`Sp%@_fMm{!{<^gP{2MC8&PC1|{c{7z~!o8KA~p z%YPd8Mc`w>S@3x96`0Hxp8fYPtR;{lJ?f$H~WQ2pKp>it{%?;r4ZJ19Qy0HvRw z^LQ^Pz5ZKJ>wN%3HO+&d_&**c7oG%ao>M`|=}b`bodb&hwV>8_5vYCM0KN;{59Z)0 zXSsgYf#UB5P1u8THQ!yJ#{V*?aqk25-go@(-}Ar!0F-=x1d6YRKtyeh zL;2M{3tS6c2x|Q=12ujd6yF_Ca?L@_vkYn<-UyC^@AU1jg4(xlf#U0@pyvHKcsBTJ zFaXb{fr*$6pvK<=O0HLflHXoXd=;SPxgON~Zv(~OyFrcrVNm_<0LAYYLCtp$I0fDZ zioa6>=RY=p>uE26=YzL_W8nS1{V*v0*F3|`w-MBM+d$2?8`L~k`*sLEm-aQF?B#Y) zc61jgJNhOlzJCa6eLn$F8S^Vp`*|i#LHl_wxcmt03)FhP^eiXm`$6^l9w? zt@ir{;%dzX@HlV|lpObfux_pc#mDWS-n$dr4&DuFyhokm_TxNoE$x?r7lAi|@{3;r z<@f#r+yy>+jWO>9OYk!A)N_qF0PX;<2fq$>!R_ba$`@G;;kLA{rN8gD;{YMA$e8uuRXvEbLhk@{bP?0d3@O8i3BJ$5Y&91_Rqfn%CCJH+zx&hydQifO8!3ZK~V4CL{OI8Zuah}y#_BH`(J#!#iXcj@q<2|6pzYP>0 z9|y(Pr@<$JpZEApP00-4I( z>hU`uF3p@m5YYP9ftv5RpyW8^pU;Ate-9}8dL<}+?*z{T@Ad6}1jYA*;A!A5K-tYI zoPgR5Q0)!iBS7(X8}uPa*GnB(A8`Zs(wWgK=fNG&@Aw}+4PFbip+EM|1W$n^le?iO zLAnr!U6**QU+<+c1BthfLHnUoAYE^Vv{v~W>8!3lh5ihRp)p9d`ef*>&{@z6q0d3D zfU4_CZZ`Nv6AYm>zI_0UpqE4PJ0FJL0lf!$C-gz+6OdwC{aQ`qFQ6AgFY!O5p!QOi zY$${FL0^EX>*>`Ecs3;6cmt$8)}=lEB6JS475a1NiO}WHN1*pZe+g}abbTCp8gv{a zdwV_9faK#}3+cK9dN;I34XzJ3u=-c}`!|B9q_vqd!Ph{agr=ZpLRUb95c5$;*Q*_v zo4{%4GtlotPk?mY480BdEc7NQf!0Iv0R>cDfxmewh-%tvng8dZKZNdrUIpozgXY`9S`Yxvjc1M{?`1FzmeZq>+jzJUIWSIbX^bKYVYtl;7QPKXs>@J*aW=` zdMwm|bY17b=5~+b{&l{68F;n7e+>93e_uh1n;pSx)i3($ZQPKsNA3BdxI#?vpmR}&0Ze0E)2LYm!hDE@_kVrG?T1| zTJ}jZOVh~C8T8WV+AjA|D_L%sjaR-Tm(PU6P@_lTx*NU^Cn}o{? zVbe3wFq^`nu>S>{vaBf0rbIt(b~9(WZ*R%7vqVo@L-g#$NjVm$!CW^A z_adOpQ)Y9Rrdb)pEkqVCE(fh>U)+qWBpcO_SvShVG79#`Gh%MXX*_dY5LNvx}TtF3PA=?M#1HWKX5ujFPB>avXX7N~w>bC-!O8jcFDlX-!X7 z$IKyGvV;`EZa0aWq15PDhW$TZa&T4F3tCyarewqRMFAGmi3=-n^v>>=yo=lABd;Wn znpxgDs$Cy+{mpo&DRLk!%%e~YuoJCde;$`3%vkegq26Dnm_)<)-L&r5TROfX?3TFL z{@PdUgj?z2St|KV#bGqPadpP>>K z0cv5n)aWBd-#ApqVHYy!=J($XRCf^#vn7lZtR!5-2Pq_$IqPXuE@m~ig)?az;noMM zi|UoWAe?VuF(ofA^u+NfBYqaNw}mpcqG0>%^wuEmgzcyrj^E@E37|O+0)MP692qCr z87^bnec|Py;-3@zA;u{QvpEZoaQA6*d32}x0`Supes|^B?3;*Wgo%-finyJkQAG*c z?Q-cz6YL8UqK<5$^2vvt0j_f#SWU91juj2B4Pw?{S6GL8C(ZKCVOV#aidtkE(&*YE z5lMenjv!4%+SN%f*mj^UR}IkTc_2)5Yh)J7vP4rerO`f4ek}edMVK$kSpDwqBQwcR z2K>uPR<$K0Te8`X``>3r+i+gpr7Vq5{aVtrBTgeZl7pVfqtqYnjGK982QXX1I5k_z zSq90UV<#x$1CiqC>K?KphKA^!S`D)`N9i~Bvp3tU4`2T&A`p+ZSMIxQYUhmEhCgO^ zOn-%gyTWXX+e>C99czo{8R?w+KiG*coKa3Jy(jDI-?zdt3>K4Yze|T3BfrQ*!cO(u zc9K%_qG)*`3-ea6DT=yADPJX3i;|>naLg7a9jtQzTRXC>tJIg9{bncI7v*MW)QWo@ zQxek1q^1?wPSp1PSerlSFO~x1IO8?zKTG<;A!^RM;W0 zY}ioUVYf<-BM~k<3&KRZ(8-9DWge!5a^s+zXJyvR65KO+AxdSlqWy6}795c%l3~bH z$SiU@*w#6_VYtuT^K-L7bZr@>HVNq_J+gAUnqy;2nhk4&y(5fmt$TNbes$Q*&nc6cVOS2S>T6%ICO1d^ zAgeIdjXRi_x#g6z`#k3l=ZWW)K-;8Dezq2HNW4e557XsfZ%Pu_&ptV^EoB@vHHeET zgkpQXStOgnl&mcx0G(p28FS9pDc>F?Y@a4sQ;0nvC)icR0t?#g$IVgIVYrr_HR>O*o4lU2o^Yl+Yhy z;41&E$(AYeh=rOx%4%$Yv3K&`dlZ}9|57^J^d8cW(86U(tHNfJLJYoczmJ`^o`5F0 zW5u30FMD_n>!?Y%S$32Z3|N2c;@R*suTy)dG;|{K;-wf-3=GA!S2mTaBI|Dlo&AHA zdt>O=pbuj+tuaa~lp z`D}f#RF>WKYu7IH+6RahVS^J6ho&rVuU$2}Ykq7qR-$w6*c2wUKA0Szm>e6Q9Gjd7 z#>dxBj9)O$MaQw-9GS(zpx^k|#Q50cbAk!_Op$8V0yR4-o5UoXp7 zb1n|<{g^5u@uF%A8L6F1aqurO2j4QH9N6v3Z^j%GoQGWEB)b&%iY!RDQ*LLE_jE~# z+N}&E=cnjZ6$S}Ou0p7gq`OJF_?zmHf1sv4sz#VdLM$ilw{)rsk~KEsxC&uxX3}PE zt1%hAnE8#>-;y2Hn|U_crdTCYN|Zs%dtt}5Hx`oKNOOh$85+q)r)9yAe7h#g~Z%4htBB67ZYa^JXL2Q)`1a= zK`^Q*I(Z!OIQTUW2g5zGgCQLAbs`PpIsa^T>&@BId5nV7#K~x@-bRb1%7xBC?3rCX? z^okpC?Bb5v1gYGq<8S!(Z@$+ zJ^PmFhxCe%H?8Xzk&M{p2S4gpdPS3JE0x@S0X8J)w5j$I_*$+M8<{I@uR*&i%=U}1 zoYSjkBgI%7;gU6dSB9@&bRnKxL*ZKbFmOI@iR-P_U@=;wI{~OfOKsK_G7}e5sL1H- zT*~z0;l2~Tvg!hC61CeBFEuHZYcabK0UfsYK^}LgckZ=NPFKU$Ox}m`Eu5#xxHz?R zsl9Rd#}3H+_Qj3rbBJoVJ|AEq1zH_-LR-k?=-5L-3W)85=;f=7F>UtSOJjwgUbfe9*&?qL%J&UTZALmemxW?hI&qLNhGz=4WMq4a$s_7% z>%fN?+?RgI5bWyHlA6td13t{Gq#yM;QQjez;Z+GpXI_rmWc$tMAkD3FhTQ9%1sunexA_HCn`c$xNc`CPU7of3p?6dnw5L_gSt+HD z#v=+%q-k!%i<}g#b9S52oidF=EC8kL3gE@VtX9vCeIvSjWEip|4*Lt;{=A zx9fh2zRn(L!z*{(f7^@YC{)kpUe$Y;zu#kK{NHTzy!Q-py_EiZ_P0n)uuVa{6Z=ZW zLGG(A3bbxd#OHdx+UN+t0YJeQwL9o!pn7eHWgqe96#zW^E_hg01 zYi|)usaK6YSm7O8W8c`zV~Va}?u8Y4nHimhjMfBy7=g-Jlq_ht0Lj6KdrX4`d-v^| z_V}=v^js7rFqCmWXw84wf3OoOdoT8>KEO$S+=eo20B6VryO!a z6V=URb>oWfu6Musj%sCQHs@RycXjkq4L)NzeE8624(_S~yxro-`Vq9#?_BLO2Y~AR zISL!hq0(CQ$d-3T>hObZRbd{1cErGR(L`XGxt!dC;Gu%N_vH3GR|O!K`*IkzlVw)* zZJ{e`1UvfjRH>e{s+X`ka@*3>c00C5!^_>Fkq|*p=5H?c3B#n>L#6$8^bZvbI-61Q zTc9QfUrHkQ;~?(BoKvd%x{TiNIv-a1<$EGEnoMe9tNQwT09Rb#k3Yl^b`b9igKjl2 zHN)yGt!kh&p8}u?__ZRu28>A{INwwTrJBF3w=3TM7M9~{|5^_laI_p)Pp5d~WjFXH z0B?3LZKYW1w~?|SJ6y9%{5pz9PCrR^JHxcLLRstqNl^ z{d;RR1Lu-w1-3riUSUpsEYKGhTcxq*GhO=}KAObj2Ah8H`$7f6Go|6r%?J}w|ecOw}N zg+1K)ND-un`3Mo#qmn{wb)*^Qk=$QLajlkbzG#Wkjam_o$RM+|-ceOM>m+wjGPMOH z_elcP!!pq?)vm%kF@33FZ}y2wM}uR`;v&cI>dS;Yx_`g=AiAqsJt?~JnL8ZL{_R~hz|BJ@4yr=Pb*E#*8o6o;8awc(yP3pHz z{%(;tg|28F#6o+U*pONO=z$FkPUCE5l?eDv)GYe)p#v!vk@g5JRSdJ%Y!hw!w+#WZ z;t!~72#;MEjX~_^j|lzu2XI?n8$9>N@R6tfV@S=i7bxO4huo}tvVv{b-Xc0uIIg=x J_hf~){s-^q6WRa( literal 0 HcmV?d00001 diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..f4e2f5d --- /dev/null +++ b/po/it.po @@ -0,0 +1,695 @@ +# Italian translation for gst-plugins-good package of GStreamer project. +# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 GStreamer core team +# This file is distributed under the same license as the gst-plugins-good package. +# +# Luca Ferretti , 2004, 2005, 2006, 2007, 2008, 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.25.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-10-25 10:11+0200\n" +"Last-Translator: Luca Ferretti \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "Impossibile stabilire la connessione al server audio" + +msgid "Failed to query sound server capabilities" +msgstr "Interrogazione delle funzionalità del server audio non riuscita" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "«%s» di «%s»" + +msgid "Internal data stream error." +msgstr "Errore interno nello stream dei dati." + +msgid "Failed to decode JPEG image" +msgstr "Decodifica dell'immagine JPEG non riuscita" + +msgid "Could not connect to server" +msgstr "Impossibile connettersi al server" + +msgid "Server does not support seeking." +msgstr "Il server non supporta il posizionamento." + +msgid "Could not resolve server name." +msgstr "Impossibile risolvere il nome del server." + +msgid "Could not establish connection to server." +msgstr "Impossibile stabilire la connessione al server." + +msgid "Secure connection setup failed." +msgstr "Impostazione della connessione sicura non riuscita." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Si è verificato un errore di rete, oppure il server ha chiuso la connessione " +"in modo inatteso." + +msgid "Server sent bad data." +msgstr "In server ha inviato dati errati." + +msgid "No URL set." +msgstr "Nessun URL impostato." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" +"Ingresso audio assente o non valido. Lo stream AVI risulterà danneggiato." + +msgid "This file contains no playable streams." +msgstr "Questo file non contiene alcuno stream riproducibile." + +msgid "This file is invalid and cannot be played." +msgstr "Questo file non è valido e non può essere riprodotto." + +msgid "This file is corrupt and cannot be played." +msgstr "Questo file è alterato e non può essere riprodotto." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Questo file è incompleto e non può essere riprodotto." + +msgid "The video in this file might not play correctly." +msgstr "Il video in questo file potrebbe non essere riprodotto correttamente." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Questo file contiene troppi stream. Riprodotti solo i primi %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Non è stato trovato alcuno stream supportato. Potrebbe essere necessario " +"installare un plugin GStreamer di tipo estensione RTSP per gli stream Real " +"media." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Non è stato trovato alcuno stream supportato. Potrebbe essere necessario " +"abilitare altri protocolli di trasporto oppure in alternativa potrebbe " +"mancare il corretto plugin GStreamer di tipo estensione RTSP." + +msgid "Internal data flow error." +msgstr "Errore interno nel flusso di dati." + +msgid "Volume" +msgstr "Volume" + +msgid "Bass" +msgstr "Bassi" + +msgid "Treble" +msgstr "Acuti" + +msgid "Synth" +msgstr "Sintetiz" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Altoparl" + +msgid "Line-in" +msgstr "Linea in" + +msgid "Microphone" +msgstr "Microfono" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mixer" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Registr" + +msgid "In-gain" +msgstr "Guad in" + +msgid "Out-gain" +msgstr "Guad out" + +msgid "Line-1" +msgstr "Canale 1" + +msgid "Line-2" +msgstr "Canale 2" + +msgid "Line-3" +msgstr "Canale 3" + +msgid "Digital-1" +msgstr "Digital 1" + +msgid "Digital-2" +msgstr "Digital 2" + +msgid "Digital-3" +msgstr "Digital 3" + +msgid "Phone-in" +msgstr "Telefono in" + +msgid "Phone-out" +msgstr "Telefono out" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Impossibile aprire il dispositivo audio per la riproduzione. Il dispositivo " +"è attualmente usato da un'altra applicazione." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Impossibile aprire il dispositivo audio per la riproduzione. Permessi non " +"sufficienti per aprire il dispositivo." + +msgid "Could not open audio device for playback." +msgstr "Impossibile aprire il dispositivo audio per la riproduzione." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Impossibile aprire il dispositivo audio per la registrazione. Permessi non " +"sufficienti per aprire il dispositivo." + +msgid "Could not open audio device for recording." +msgstr "Impossibile aprire il dispositivo audio per la registrazione." + +msgid "Could not open audio device for mixer control handling." +msgstr "" +"Impossibile aprire il device audio per la gestione della regolazione del " +"mixer." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Impossibile aprire il device audio per la gestione della regolazione del " +"mixer. Questa versione di Open Sound System non è supportata da questo " +"elemento." + +msgid "Master" +msgstr "Principale" + +msgid "Front" +msgstr "Fronte" + +msgid "Rear" +msgstr "Dietro" + +msgid "Headphones" +msgstr "Cuffie" + +msgid "Center" +msgstr "Centrale" + +# NdT: lfe andrebbe tradotto come effetti a bassa frequenza e andrebbe aperto un bug per low frequency emitter che al limite è la cassa ma non il canale +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Laterale" + +msgid "Built-in Speaker" +msgstr "Altop. incorporato" + +msgid "AUX 1 Out" +msgstr "AUX 1 out" + +msgid "AUX 2 Out" +msgstr "AUX 2 out" + +msgid "AUX Out" +msgstr "AUX out" + +msgid "3D Depth" +msgstr "Profondità 3D" + +msgid "3D Center" +msgstr "Centro 3D" + +msgid "3D Enhance" +msgstr "Profondità 3D" + +msgid "Telephone" +msgstr "Telefono" + +msgid "Line Out" +msgstr "Linea out" + +msgid "Line In" +msgstr "Linea in" + +msgid "Internal CD" +msgstr "CD interno" + +msgid "Video In" +msgstr "Video in" + +msgid "AUX 1 In" +msgstr "AUX 1 in" + +msgid "AUX 2 In" +msgstr "AUX 2 in" + +msgid "AUX In" +msgstr "AUX in" + +msgid "Record Gain" +msgstr "Guadagno registrazione" + +msgid "Output Gain" +msgstr "Guadagno uscita" + +msgid "Microphone Boost" +msgstr "Incremento microfono" + +msgid "Loopback" +msgstr "Loopback" + +msgid "Diagnostic" +msgstr "Diagnostica" + +msgid "Bass Boost" +msgstr "Incremento bassi" + +msgid "Playback Ports" +msgstr "Porte riproduzione" + +msgid "Input" +msgstr "Input" + +msgid "Record Source" +msgstr "Sorgente registrazione" + +msgid "Monitor Source" +msgstr "Sorgente monitor" + +msgid "Keyboard Beep" +msgstr "Beep tastiera" + +msgid "Simulate Stereo" +msgstr "Simula stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Suono surround" + +msgid "Microphone Gain" +msgstr "Guadagno microfono" + +msgid "Speaker Source" +msgstr "Sorgente altoparlante" + +msgid "Microphone Source" +msgstr "Sorgente microfono" + +msgid "Jack" +msgstr "Jack" + +# vedi prima per LFE +msgid "Center / LFE" +msgstr "Centrale / LFE" + +msgid "Stereo Mix" +msgstr "Mix stereo" + +msgid "Mono Mix" +msgstr "Mix mono" + +msgid "Input Mix" +msgstr "Mix ingresso" + +msgid "SPDIF In" +msgstr "SPDIF in" + +msgid "SPDIF Out" +msgstr "SPDIF out" + +msgid "Microphone 1" +msgstr "Microfono 1" + +msgid "Microphone 2" +msgstr "Microfono 2" + +msgid "Digital Out" +msgstr "Uscita digitale" + +msgid "Digital In" +msgstr "Ingresso digitale" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Auricolare" + +msgid "Other" +msgstr "Altro" + +msgid "None" +msgstr "Nessuno" + +msgid "On" +msgstr "Acceso" + +msgid "Off" +msgstr "Spento" + +msgid "Mute" +msgstr "Escluso" + +msgid "Fast" +msgstr "Veloce" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Molto lento" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Lento" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Medio" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Alto" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Molto alto" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produzione" + +msgid "Front Panel Microphone" +msgstr "Microfono pannello frontale" + +msgid "Front Panel Line In" +msgstr "Linea in pannello frontale" + +msgid "Front Panel Headphones" +msgstr "Cuffie pannello frontale" + +msgid "Front Panel Line Out" +msgstr "Linea out pannello frontale" + +msgid "Green Connector" +msgstr "Connettore verde" + +msgid "Pink Connector" +msgstr "Connettore rosa" + +msgid "Blue Connector" +msgstr "Connettore blu" + +msgid "White Connector" +msgstr "Connettore bianco" + +msgid "Black Connector" +msgstr "Connettore nero" + +msgid "Gray Connector" +msgstr "Connettore grigio" + +msgid "Orange Connector" +msgstr "Connettore arancione" + +msgid "Red Connector" +msgstr "Connettore rosso" + +msgid "Yellow Connector" +msgstr "Connettore giallo" + +msgid "Green Front Panel Connector" +msgstr "Connettore verde pannello frontale" + +msgid "Pink Front Panel Connector" +msgstr "Connettore rosa pannello frontale" + +msgid "Blue Front Panel Connector" +msgstr "Connettore blu pannello frontale" + +msgid "White Front Panel Connector" +msgstr "Connettore bianco pannello frontale" + +msgid "Black Front Panel Connector" +msgstr "Connettore nero pannello frontale" + +msgid "Gray Front Panel Connector" +msgstr "Connettore grigio pannello frontale" + +msgid "Orange Front Panel Connector" +msgstr "Connettore arancione pannello frontale" + +msgid "Red Front Panel Connector" +msgstr "Connettore rosso pannello frontale" + +msgid "Yellow Front Panel Connector" +msgstr "Connettore giallo pannello frontale" + +# int spread; /* copy front to surr/center channels */ +msgid "Spread Output" +msgstr "Uscita diffusa" + +msgid "Downmix" +msgstr "Downmix" + +msgid "Virtual Mixer Input" +msgstr "Ingresso mixer virtuale" + +msgid "Virtual Mixer Output" +msgstr "Uscita mixer virtuale" + +msgid "Virtual Mixer Channels" +msgstr "Canali mixer virtuale" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Funzione %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Funzione %s" + +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 per la riproduzione. Questa versione di " +"Open Sound System non è supportata da questo elemento." + +msgid "Playback is not supported by this audio device." +msgstr "Questo device audio non supporta la riproduzione." + +msgid "Audio playback error." +msgstr "Errore nel riprodurre l'audio." + +msgid "Recording is not supported by this audio device." +msgstr "Questo dispositivo audio non supporta la registrazione." + +msgid "Error recording from audio device." +msgstr "Errore nel registrare dal dispositivo audio." + +msgid "Gain" +msgstr "Guadagno" + +msgid "Headphone" +msgstr "Cuffia" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Errore nel leggere %d byte dal device «%s»." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Ottenuta dimensione inattesa del fotogramma: %u invece di %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Errore nel leggere %d byte sul device «%s»." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Errore nell'ottenere le funzionalità per il device «%s»: non è un driver " +"v4l2. Controllare se si tratta di un driver v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" +"Interrogazione degli attributi dell'input %d nel device %s non riuscita" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"Recupero delle impostazioni del sintonizzatore %d sul device «%s» non " +"riuscito." + +# norm è un paramentro pari a ntsc o pal (e forse altro. Si evince ad esempio +# dal comando di Video Lan Clien +# +# vlc --color # v4l:/dev/video2:norm=ntsc:frequency=77250:size=640x480:# adev=/dev/dsp2:audio=0 (...) +# +# Qualche idea diversa da norma? -Luca +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Interrogazione di norm sul device «%s» non riuscita." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Recupero degli attributi dei controlli sul device «%s» non riuscito." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Impossibile identificare il device «%s»." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Questo non è un dispositivo «%s»." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Impossibile aprire il device «%s» in lettura e scrittura." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Il device «%s» non è un dispositivo di cattura." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Il device «%s» non è un dispositivo di uscita." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Impostazione di norm per il device «%s» non riuscita." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Recupero dell'attuale frequenza di sintonizzazione per il device «%s» non " +"riuscita." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Impostazione dell'attuale frequenza di sintonizzazione per il device «%s» a " +"%lu Hz non riuscita." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Recupero dell'intensità del segnale per il device «%s» non riuscito." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Recupero del valore per il controllo %d sul device «%s» non riuscito." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Impostazione al valore %d per il controllo %d sul device «%s» non riuscito." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Recupero dell'attuale ingresso sul device «%s» non riuscito. Forse è un " +"dispositivo radio" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Impostazione dell'ingresso %d sul device «%s» non riuscita." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Recupero dell'attuale ingresso sul device «%s» non riuscito. Forse è un " +"dispositivo radio" + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Impostazione dell'ingresso %d sul device «%s» non riuscita." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Impossibile accodare i buffer nel device «%s»." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Tentativo di ottenere fotogrammi video dal device «%s» non riuscito." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Fallito dopo %d tentativi. Device %s. Errore di sistema: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Impossibile ottenere i parametri sul device «%s»" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Il device di ingresso video non accetta la nuova impostazione sul frame rate." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Impossibile mappare dei buffer dal device «%s»." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Il driver del device «%s» non supporta alcun metodo di cattura noto." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" +"Il cambio della risoluzione durante l'esecuzione non è ancora supportato." + +msgid "Cannot operate without a clock" +msgstr "Impossibile operare senza un clock" diff --git a/po/ja.gmo b/po/ja.gmo new file mode 100644 index 0000000000000000000000000000000000000000..e4cdf394dcadf4c280f9adfea7667a25d5d9ef53 GIT binary patch literal 15359 zcmchd3y@S-nSgJ6#U*M?d~VeBs*EHdJrZ$g3$i6lZGfLdjh>#F5z|NrL<|9bUX1}v_%BN^-349#h1Ahze zgwd-k>w0(^-UWwXEBwOMx<45>nfxR06YvC-@w{v}1g{|fTPX5))$sE7==@bs6|85W^!s~; zKY&v2PoT)*XHe=dL6OrdP{#E;_-XhW+zvm@Ak*;2P|DqWjULZzDEi+4rTzI(+WRt; zdZSS4OF$X_D)av9=6wN*yf;AU&w$|pIF0;qDE0YJ+8u==uUDYd`=3zcdl|xSf>%Px z-wdVw+o9BdC;TXMpbhg->e~lJ9#27O{}`0|&q9&&_o3ADcjo=iq4Z}2O1-bZcKCZJ z?a#m{O@T?+2DiiO;orju{Da9~{}HV>cR*>+gHrDbDD8b6eip8QsI+wsihlnLihln) zlKFr zSB9?{Ui~qx_YF|=;1(!yXopHap?p_>GvNT74F3hnI(`+(IGaDN-!C^DgkR$MZ{a_~ z`53Qxa55k7f_?CZa8iS1ZGu0AGhy_TI)4b>N&ZF#A@bh{XTuZlbMRFt<7&HB_wN?N z#ZctdW4OX_4a6i_+u(QLGw?6q^6Me4;525sL z#trxsIAHi|DD`xpEQ{ezDDC_PegSq;SrTr7x5Ga`k@IaV78&PVkfB*c!y}MSt$&0v zzn3vNOW+ldrEM*RGCyB~Z-Eb){8qz5hA+Y^dH*9Qa{GmO?!&i}|1T)>`Wlq>Cu7`M z64rbu{p&UP927gS1xkGbh6mvlCX(f3bsS(?-}?-cr}ZA1&l$_*O#HZzaHZ_58ek+8S4j7>iKUd^;$RS_9nq7 z*=wN8>o?#B;U2>mp?vobP{#Xn!(YM6$Ui}vM3S-IOOi3ldXnoy8mfPfaWCVO>+>YB zC2}#%>XJUY=KfB&#oWK!P;ARP&AmW;4P8*Ol>DEQQlyondq{goGVX7Xc9G=zI%x*! z{iHdh4J5gkO0}lGrgHiRvuHg?5*`1tex!bH=J!pcB`RlGt05-BT4(YB^5$k0lyxsx zKMC=xct-Ner~Ulx!u zB)PJruaIsdeU(g#Q%Aq7_hH&2pwn+Mk#UIllU`&PsE!jGBzqG8m~YHhb?xyh`X zwr;VLZg!=YUT(YTw3oKMXf&60V>j5`XM0^chfjE$|hhu)-|wA1G@ zn;Dx)iMcD{QP-Z*keL$dK%bMcm*%>=rBHX;>l>#S;!4_%niEq`H;T{~UnM%=C9`QS zVI!qj0x^YqeM#Thi+hnJYLyWs^178;Es&NMsX;F4&t%=cK;C6p+e`Z?$(L@z?L&Jn z-hQA~mr&Af*W#m@rLO2gPV}CZ9p=6lDLAQAA|7=_IWDEz|Mwx=cY8TI<|U_OnXnbE z%{u6dXOzUzJ2hXjzV$3$d?aZ%>ZM~7n)OQ2*Vl)TBHN;cY1fesFcUF*Wjda%>5N*m z4AfYxBuk>vGP5a*An6@?ERd?yXF+jI7zp%Cc&u`_dCD_qHi3pV6_RU6f^U$D+-&4Mr)1} zPq0dyZfuZEi`g{eX$%I_z->k^Y2{Gk83+(T0whbC}YgE zZ|#~r*N*o&J#J7P@5CVD!qONBJD!v&tf|NDboyD_W#OeA@jzPe zMjb2jMaT3vnUFiGQsYpE=ze)BE;4d)nhlAZJ@4MI45R`h`>J7}Q8mrzaZ_l5Lr?e1 z@-t#y5s$eZvx3E_w@&7yQBF(!+Fef4P1y6WM5$gc>7vK-(mb9YPr70i#yk`A5PsMh zkET6Ufi>5OC#|`J6_r>@_r%V`?{&pFHsqKI9HPVAORmwHn?{3Ym4l(VX&2X7$CJ26fj5)vjcZNyLI`GZnXa3%B-jdsr6>ZD8;qwyi$<#kJ)Q4) zDG3m*P6tt>t&jvOw{~;rx!n@Z=rA%=RLMP*C-O)~T|Obwu{yCXef%clS%OVN2~JcI zFX`DLtxl|zb-QQZv2Z?4hj4^@7G6B5MWEM_GL$#iw=C(fjigq_6A7_D*wb__r9Z30 zI6)yt`~eYPqw=AB@t)o+k-Cd*^=v00v(e|_!m?>6nUPS`PNlu97xfa@O#(I)M1?CW z;~7^PQ?6e$9+#h1mCaqGCJuA7aPgup+g+7)lPWq$C2|D8YBZPDEzwfChCjMU-D;68 zbkVauHx_q{U|7?)v!tvA-QCuLq_u#N^@M}`1rmN)Xo}WdZp65&dF-0iX^|o=R+p?w zb^_+cL$A8x$?(>pE7)puA+?NE&f-WVx~~j5h&HQT-9qse7M)M?BQDWEcSJu5G)3pc z&`h*)=C`tr7j?CF%&|L?mcEfSvdER)S$GeD;^k6yw{pOZyjQ!mn1>+?jRy5}m#c7T z5vI-xc1eaocNej+T+h-_8omfWDoSVtH#$JK7WF5yz1CvlaBajEOCYI&6ERVt7={3} zrYBCa-(H?17%E3$>|A<1Hd0cFw!}Cd73X&oRiL>_^_d!p=GCfU$0_?w6;i7*;_DpL zk1?xKY_*63m42gDb;@Nuk2OM9f2 zaH3H+C3a+`@iA&^j0)*kdPzK;&9N$#5hTiFjBX-Bh2h8AXH-AaYtdT5rn%3x?(B^- z?us7Y?J9d!dC-;imNAEsj#y-g-UPPUJ(+AoTb@j$$Ma%#Q)6>eW6Si$mPrd;F>sO2 zOiw%(nVIX!L>7B(c5gPDYMVA~X|Cs9464&ebWXtUrF*7L>RPZkG7GOHd$dS9yZ<)3 zrK!0k($o@ZX||i1+M1iDHgQofvXJebn7vB5=19}@NXvA)rM2x-pPkzDS<21F=|mQb zsZHS6(rxx)P8l-2aeJQA=VYAaar<+5V99^m5pBFmhcIVQ+fSHTfYrH(dxnKP-gqjPpec+HJX zlMpW!oNo4~7;hGPJ`L53CvUQ&y-u1ro^i+GIg#m=axxr_10u80RoPdy+0&QCvy<+M z%ykJ;^*HBy%bkS8Ax({~le!YQw3CR;@zQ;nHap2|kvx*_2Tuj} zEurTvrSkL2Q}fI(JfoU^&@b%gzVyH*>070@Px<*BK5d;p^U&z-;|6|lyL?o5ks(^6 zrym(v_btD0Tt+P;J!g$RG3Jq9-0ByPh)4r9aj34hi3!YLy0ekL=wzw4>nX2S=XTUn*`cojO!Hux@DQ z^Hi$@{)8I%T0cMF7dHC&Lw^4LnkK@ta?;F1byw&|RUuj{&)D$3Q^Q9#)b0BVe&LWv zp}20`@AF4W2c8=mKuP##CLP6kP_zUQ7G6|mUH18t>uJ+3Zc*yBS4s37>QdUgy>yl@ z#|myt6{3TMbxQltS%k5d@BQMFN`>oHfg+UlKO63g`T(^#YK9}qz(4e#IYqIL3~xK^ z=Z}nTM;x2|{8m3t7Ma)S-NkFEQQ4Y)T%-+Yk}>T@hsK<}i6EtKh*Pb^!b!jQlng{Z zLM`Rh$f5l3^LrSJUqEyAi`s|=TuhhhifrVWqkjGzGvyc7PgFp9f$Gx#SAwXLV1DEI z)7wP`g?)bUQNQ?%UwBSw)rqn&N^7519jIA1JFGXPbMk~=woDSnRDU2Q?3;d( z6`>UIQYY*U8A@pBDT}UG0~$}K2Zs(nJ-XvzwJZuKM3pJ3t3IO}zs2*3Do(ic8=^Sk zq9#0`u*zvehCs%whr>fVPh$8-&f+%DO=O@|=D74Q{^${m|Il-%>YAEbTdEub25Y}k z{JgrUlnJar)#TK%$kd{JYj}+HKOQ-JYH0gWRR^|4VuvHfLCd%0N7{RbAF=1J%C=Nz zTgk2tT+D7?d)2~=s!+B2ki{(y8TYYO)_U;)pEw{tsNIKhpIExOv5WCZZTgf}Tp0n5 z)P)Xfds!tZ3@*pH&GwjrID7oA3WJJ7LKs{f1Yo6c$#@H_?SPaKuOC`Lc0QE~@7Bhp7Ly~1M8}?>hB54HPpKI z(sNG^t!C1V-ryd`wrt74_3*aSgkn;MC^*#+91z#mD?YYq9qSBlK3m#F_%NuK%7q(M z!$mNxE`$_b%%}~q;iD?_LzN}2tX3~I+S(@7QhZ~Zr1tUzi_n|TqcAJwR%ymytMkjCDyD~cjh&NLj|FYzF%OsMKJqP?M8d}#FpAe>hB;G5y{RNS&203NNvm` zV^hlmGIBGIi=kM8r8%jhjb_h}9ojf?%XF^R+W<@+y=H z?pqL3a4$hr@QprW5%p7zsQsbt2HRxD!kLF`m}P!zRHNQg3Et`ymd5Kmt~zX~U!pu+ zQ2COl4~alT1|c<28SSCgTKr9jpkrv` zgUXSxJn9{*1S+Piw%CaMVkU@Hjy|URda!o#8;0-STU!63S}24lm?E`PTAi0aE9t|h ziUtvM?_VD{b9G`Ric{H_>uBCphBoXi zy~HqR8&!PPG$|)1%Di9;$Elt5@p?zE{#2zl(0Y#c1w+*nC)V7|NPe*9Pha)B{klbF z>61amCT>Lo+b=ncBZsdiYmK3we}ZmupkbLUS$U<@<|}_pqiXF{jP0xB1K+SsHFj)F zV=_(ORCC1fk=n!r`e#l?WVX%eM78$IIyA?6#xGP&-#9BtDTPF~ELt&`mfk%W_~o(c z$Dzf1@jjs7=6K6|OwT9MrI8m7)QUy@9nZ*8-y1pNn#717r02oeDnW|zS3DFMBGP(+ zoeDjqKP)?SR43g#p{yJ?EX{h#FAJ`6e5|}maUJRtI*ATvLh_O#?2VXPL>_KJpRKVaO!w-% Z(58t|jXt>98s2fH)|ic+zQ6X-{{j|qh7$k) literal 0 HcmV?d00001 diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..58df5a4 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,848 @@ +# Japanese translation for gst-plugins-good. +# This file is put in the public domain. +# +# Takao Fujiwara , 2006. +# Makoto Kato , 2009-2011. +# Takeshi Hamasaki , 2011 +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-08-28 23:59+0900\n" +"Last-Translator: Takeshi Hamasaki \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Could not establish connection to sound server" +msgstr "サウンドサーバーへの接続に失敗しました" + +msgid "Failed to query sound server capabilities" +msgstr "サウンドサーバーのケイパビリティのクエリーに失敗しました" + +#. TRANSLATORS: 'song title' by 'artist name' +#, fuzzy, c-format +msgid "'%s' by '%s'" +msgstr "対" + +msgid "Internal data stream error." +msgstr "内部データストリームエラー" + +msgid "Failed to decode JPEG image" +msgstr "JPEG画像のデコードに失敗しました" + +msgid "Could not connect to server" +msgstr "サーバーへ接続できません" + +msgid "Server does not support seeking." +msgstr "サーバーはシークをサポートしていません。" + +msgid "Could not resolve server name." +msgstr "サーバー名を解決できません。" + +msgid "Could not establish connection to server." +msgstr "サーバーへの接続を確立できません。" + +msgid "Secure connection setup failed." +msgstr "セキュア接続のセットアップに失敗しました。" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "ネットワークエラーが発生したか、サーバーが予期せず接続を閉じました。" + +#, fuzzy +msgid "Server sent bad data." +msgstr "データストリーム (サーバープッシュ型)" + +msgid "No URL set." +msgstr "URLが指定されていません。" + +# SUN REVIEWED +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "入力オーディオが存在しないか無効であるため、AVI ストリームは壊れます。" + +msgid "This file contains no playable streams." +msgstr "このファイルには再生不可能なストリームが含まれています" + +msgid "This file is invalid and cannot be played." +msgstr "このファイルは不正なため再生することができません" + +msgid "This file is corrupt and cannot be played." +msgstr "このファイルは壊れているため再生することができません" + +msgid "Invalid atom size." +msgstr "不正なアトムサイズ" + +msgid "This file is incomplete and cannot be played." +msgstr "このファイルは正常ではないため、再生することができません" + +msgid "The video in this file might not play correctly." +msgstr "このファイルの中の動画は正しく再生できないかもしれません" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"このファイルには多くのストリームが格納されているため、最初の %d 個のみ再生し" +"ます" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"サポートしているストリームが見つかりません。Real メディアストリームのための" +"GStreamer RTSP 拡張プラグインをインストールする必要があるかもしれません。" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"サポートしているストリームが見つかりません。別の転送プロトコルをインストール" +"する必要があるかもしれません。または、正しい GStreamer RTSP 拡張プラグインが" +"ないのかもしれません。" + +msgid "Internal data flow error." +msgstr "内部データフローエラー。" + +# SUN REVIEWED +msgid "Volume" +msgstr "音量" + +# SUN REVIEWED +msgid "Bass" +msgstr "低音" + +# SUN REVIEWED +msgid "Treble" +msgstr "高音" + +# SUN REVIEWED +msgid "Synth" +msgstr "シンセ" + +# SUN REVIEWED +msgid "PCM" +msgstr "PCM" + +# SUN REVIEWED +msgid "Speaker" +msgstr "スピーカ" + +msgid "Line-in" +msgstr "ライン入力" + +# SUN REVIEWED +msgid "Microphone" +msgstr "マイクロフォン" + +# SUN REVIEWED +msgid "CD" +msgstr "CD" + +# SUN REVIEWED +msgid "Mixer" +msgstr "ミキサー" + +# SUN REVIEWED +msgid "PCM-2" +msgstr "PCM-2" + +# SUN REVIEWED +msgid "Record" +msgstr "録音" + +# SUN REVIEWED +msgid "In-gain" +msgstr "入力ゲイン" + +# SUN REVIEWED +msgid "Out-gain" +msgstr "出力ゲイン" + +# SUN REVIEWED +msgid "Line-1" +msgstr "ライン 1" + +# SUN REVIEWED +msgid "Line-2" +msgstr "ライン 2" + +# SUN REVIEWED +msgid "Line-3" +msgstr "ライン 3" + +# SUN REVIEWED +msgid "Digital-1" +msgstr "デジタル 1" + +# SUN REVIEWED +msgid "Digital-2" +msgstr "デジタル 2" + +# SUN REVIEWED +msgid "Digital-3" +msgstr "デジタル 3" + +# SUN REVIEWED +msgid "Phone-in" +msgstr "フォン入力" + +# SUN REVIEWED +msgid "Phone-out" +msgstr "フォン出力" + +# SUN REVIEWED +msgid "Video" +msgstr "ビデオ" + +# SUN REVIEWED +msgid "Radio" +msgstr "ラジオ" + +# SUN REVIEWED +msgid "Monitor" +msgstr "モニター" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"再生用にオーディオデバイスを開くことができませんでした。デバイスが他のアプリ" +"ケーションで利用されています" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"再生用にオーディオデバイスを開くことができませんでした。デバイスを開くための" +"権限がありません。" + +# SUN REVIEWED +msgid "Could not open audio device for playback." +msgstr "音声デバイスを読み取り用に開くことができません。" + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"録音用にオーディオデバイスを開くことができませんでした。デバイスを開くための" +"権限がありません。" + +# SUN REVIEWED +msgid "Could not open audio device for recording." +msgstr "音声デバイスを録音用に開くことができません。" + +# SUN REVIEWED +msgid "Could not open audio device for mixer control handling." +msgstr "音声デバイスをミキサーコントロール用に開くことができません。" + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"ミキサーコントロール用にオーディオデバイスを開くことができませんでした。Open " +"Sound Systemのこのバージョンではこの要素によってサポートされていません。" + +msgid "Master" +msgstr "マスタ" + +msgid "Front" +msgstr "フロント" + +msgid "Rear" +msgstr "リア" + +msgid "Headphones" +msgstr "ヘッドフォン" + +msgid "Center" +msgstr "センター" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "サラウンド" + +msgid "Side" +msgstr "サイド" + +msgid "Built-in Speaker" +msgstr "ビルトインスピーカ" + +msgid "AUX 1 Out" +msgstr "AUX 1出力" + +msgid "AUX 2 Out" +msgstr "AUX 2出力" + +msgid "AUX Out" +msgstr "AUX出力" + +#, fuzzy +msgid "3D Depth" +msgstr "最大深度: " + +msgid "3D Center" +msgstr "3Dセンター" + +#, fuzzy +msgid "3D Enhance" +msgstr "色を強調しています" + +msgid "Telephone" +msgstr "電話" + +msgid "Line Out" +msgstr "ライン出力" + +msgid "Line In" +msgstr "ライン入力" + +msgid "Internal CD" +msgstr "内蔵CD" + +msgid "Video In" +msgstr "ビデオ入力" + +msgid "AUX 1 In" +msgstr "AUX 1入力" + +msgid "AUX 2 In" +msgstr "AUX 2入力" + +msgid "AUX In" +msgstr "AUX入力" + +msgid "Record Gain" +msgstr "録音ゲイン" + +msgid "Output Gain" +msgstr "出力ゲイン" + +msgid "Microphone Boost" +msgstr "マイクロフォンブースト" + +msgid "Loopback" +msgstr "ループバック" + +msgid "Diagnostic" +msgstr "診断" + +msgid "Bass Boost" +msgstr "低音ブースト" + +msgid "Playback Ports" +msgstr "プレイバックポート" + +msgid "Input" +msgstr "入力" + +msgid "Record Source" +msgstr "録音ソース" + +msgid "Monitor Source" +msgstr "モニターソース" + +msgid "Keyboard Beep" +msgstr "キーボードビープ音" + +#, fuzzy +msgid "Simulate Stereo" +msgstr "彫金を表現します" + +msgid "Stereo" +msgstr "ステレオ" + +msgid "Surround Sound" +msgstr "サラウンドサウンド" + +msgid "Microphone Gain" +msgstr "マイクロフォンゲイン" + +msgid "Speaker Source" +msgstr "スピーカソース" + +msgid "Microphone Source" +msgstr "マイクロフォンソース" + +msgid "Jack" +msgstr "ジャック" + +msgid "Center / LFE" +msgstr "センター / LFE" + +msgid "Stereo Mix" +msgstr "ステレオミックス" + +msgid "Mono Mix" +msgstr "モノラルミックス" + +msgid "Input Mix" +msgstr "入力ミックス" + +msgid "SPDIF In" +msgstr "SPDIF入力" + +msgid "SPDIF Out" +msgstr "SPDIF出力" + +msgid "Microphone 1" +msgstr "マイクロフォン1" + +msgid "Microphone 2" +msgstr "マイクロフォン2" + +msgid "Digital Out" +msgstr "デジタル出力" + +msgid "Digital In" +msgstr "デジタル入力" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "モデム" + +msgid "Handset" +msgstr "ヘッドセット" + +msgid "Other" +msgstr "その他" + +msgid "None" +msgstr "なし" + +msgid "On" +msgstr "オン" + +msgid "Off" +msgstr "オフ" + +msgid "Mute" +msgstr "ミュート" + +#, fuzzy +msgid "Fast" +msgstr "速い" + +#. TRANSLATORS: "Very Low" is a quality setting here +#, fuzzy +msgid "Very Low" +msgstr "低品位" + +#. TRANSLATORS: "Low" is a quality setting here +#, fuzzy +msgid "Low" +msgstr "低音" + +#. TRANSLATORS: "Medium" is a quality setting here +#, fuzzy +msgid "Medium" +msgstr "中音" + +#. TRANSLATORS: "High" is a quality setting here +#, fuzzy +msgid "High" +msgstr "高音" + +#. TRANSLATORS: "Very High" is a quality setting here +#, fuzzy +msgid "Very High" +msgstr "高品位" + +#. TRANSLATORS: "Production" is a quality setting here +#, fuzzy +msgid "Production" +msgstr "プロダクション" + +msgid "Front Panel Microphone" +msgstr "フロントパネルのマイクロフォン" + +msgid "Front Panel Line In" +msgstr "フロントパネルのライン入力" + +msgid "Front Panel Headphones" +msgstr "フロントパネルのヘッドフォン" + +msgid "Front Panel Line Out" +msgstr "フロントパネルのライン出力" + +msgid "Green Connector" +msgstr "緑色コネクタ" + +msgid "Pink Connector" +msgstr "ピンク色コネクタ" + +msgid "Blue Connector" +msgstr "青色コネクタ" + +msgid "White Connector" +msgstr "白色コネクタ" + +msgid "Black Connector" +msgstr "黒色コネクタ" + +msgid "Gray Connector" +msgstr "グレー色コネクタ" + +msgid "Orange Connector" +msgstr "オレンジ色コネクタ" + +msgid "Red Connector" +msgstr "赤色コネクタ" + +msgid "Yellow Connector" +msgstr "黄色コネクタ" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +#, fuzzy +msgid "Spread Output" +msgstr "情報出力:\n" + +msgid "Downmix" +msgstr "ダウンミックス" + +msgid "Virtual Mixer Input" +msgstr "仮想ミキサー入力" + +msgid "Virtual Mixer Output" +msgstr "仮想ミキサー出力" + +msgid "Virtual Mixer Channels" +msgstr "仮想ミキサーチャンネル" + +#. TRANSLATORS: name + number of a volume mixer control +#, fuzzy, c-format +msgid "%s %d Function" +msgstr "機能" + +#. TRANSLATORS: name of a volume mixer control +#, fuzzy, c-format +msgid "%s Function" +msgstr "機能" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"再生用にオーディオデバイスを開くことができませんでした。このバージョンの " +"Open Sound System は、このエレメントによってサポートされていません。" + +msgid "Playback is not supported by this audio device." +msgstr "再生はこのオーディオデバイスではサポートされていません。" + +msgid "Audio playback error." +msgstr "オーディオ再生エラーです。" + +msgid "Recording is not supported by this audio device." +msgstr "このオーディオデバイスによって録音はサポートされていません。" + +msgid "Error recording from audio device." +msgstr "オーディオデバイスからの録音時にエラーが発生しました。" + +# SUN REVIEWED +msgid "Gain" +msgstr "ゲイン" + +msgid "Headphone" +msgstr "ヘッドフォン" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "デバイス %2$s から %1$d バイト読み込み時にエラーが発生しました。" + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "予期しないフレームサイズ (%2$u ではなく %1$u) を取得しました。" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "デバイス '%2$s' 上で %1$d バイトの読み込み時にエラーが発生しました。" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"デバイス '%s' ケイパビリティの取得時にエラーが発生しました: v4l2 ドライバでは" +"ありません。v4l1 ドライバでないか、チェックしてください。" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "デバイス %2$s 内の入力 %1$d の属性のクエリーに失敗しました" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "デバイス '%2$s' 上のチューナー %1$d の設定の取得に失敗しました。" + +#, fuzzy, c-format +msgid "Failed to query norm on device '%s'." +msgstr "デバイス '%2$s' 上のチューナー %1$d の設定の取得に失敗しました。" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "デバイス '%s' のコントロール属性の取得に失敗しました" + +#, fuzzy, c-format +msgid "Cannot identify device '%s'." +msgstr "ミキサーデバイス'%s'を開けません" + +#, c-format +msgid "This isn't a device '%s'." +msgstr "これはデバイス '%s' ではありません" + +# SUN REVIEWED +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "デバイス '%s' を読み取り用と書き込み用に開くことができません" + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "デバイス '%s' はキャプチャデバイスではありません" + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "デバイス '%s' は出力デバイスではありません" + +#, fuzzy, c-format +msgid "Failed to set norm for device '%s'." +msgstr "" +"デバイス '%3$s' 上のコントロール %2$d の値を %1$d へ設定することに失敗しまし" +"た。" + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "デバイス '%s' の現在のチューナーの周波数の取得に失敗しました" + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "デバイス '%s' のチューナーの周波数の %lu Hz への設定に失敗しました" + +#, fuzzy, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "デバイス '%s' の現在のチューナーの周波数の取得に失敗しました" + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "デバイス '%2$s' 上のコントロール %1$d の値の取得に失敗しました。" + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"デバイス '%3$s' 上のコントロール %2$d の値を %1$d へ設定することに失敗しまし" +"た。" + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"デバイス '%s' 上の現在の入力の取得に失敗しました。ラジオデバイスかもしれませ" +"ん" + +#, fuzzy, c-format +msgid "Failed to set input %d on device %s." +msgstr "" +"デバイス '%3$s' 上のコントロール %2$d の値を %1$d へ設定することに失敗しまし" +"た。" + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"デバイス '%s' 上の現在の出力の取得に失敗しました。ラジオデバイスかもしれませ" +"ん" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "出力%dをデバイス %s に設定できませんでした。" + +#, fuzzy, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "デバイス '%s' からバッファをマップできません。" + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "デバイス '%s' からビデオフレームの取得に失敗しました。" + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "%d 回リトライしましたが失敗しました。デバイス %s。システムエラー: %s" + +# SUN REVIEWED +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "デバイス '%s' 上のパラメータを取得できません。" + +msgid "Video input device did not accept new frame rate setting." +msgstr "ビデオ入力デバイスは新しいフレームレート設定にすることができません" + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "デバイス '%s' からバッファをマップできません。" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"デバイス '%s' のドライバーはよく知られたキャプチャーメソッドをサポートしてい" +"ません" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "実行時の解像度変更はサポートされていません。" + +msgid "Cannot operate without a clock" +msgstr "クロックなしでは動作できません。" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "デバイス '%s' からビデオフレームを取得しようとしましたが失敗しました。メモ" +#~ "リが十分にありません。" + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "インデックス %d でプール内に空きバッファがありません。" + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "デバイス '%s' は %dx%d でキャプチャできません" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "デバイス '%s' は指定されたフォーマットでキャプチャできません" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "デバイス '%s' からバッファを取得できませんでした。" + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "" +#~ "デバイス '%s' から十分なバッファー領域を取得することができませんでした" + +# SUN REVIEWED +#, fuzzy +#~ msgid "Could not read from CD." +#~ msgstr "ファイル \"%s\" に書き込むことができません。" + +# SUN REVIEWED +#, fuzzy +#~ msgid "Disc is not an Audio CD." +#~ msgstr "デバイスが開いていません。" + +# SUN REVIEWED +#, fuzzy +#~ msgid "Could not set parameters on device '%s'" +#~ msgstr "CD デバイスを読み取り用に開くことができません。" + +# SUN REVIEWED +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "オーディオを再生するとき、GStreamer は任意の数の出力要素を使用できます。使" +#~ "用できる出力要素は、osssink、esdsink、および alsasink です。audiosink は単" +#~ "なる 1 つの要素ではなく、パイプラインの一部になることができます。" + +# SUN REVIEWED +#, fuzzy +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "ビデオを再生するとき、GStreamer は任意の数の出力要素を使用できます。使用で" +#~ "きる出力要素は、xvideosink、sdlvideosink、および aasink です。videosink は" +#~ "単なる 1 つの要素ではなく、パイプラインの一部になることができます。" + +# SUN REVIEWED +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "GStreamer は視覚化プラグインをパイプラインに設定して、オーディオストリーム" +#~ "をビデオフレームに変換できます。デフォルトは goom ですが、より多くの視覚化" +#~ "プラグインがすぐに移植される予定です。視覚化プラグインは単なる 1 つの要素" +#~ "ではなく、パイプラインの一部になることができます。" + +# SUN REVIEWED +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "オーディオを記録するとき、GStreamer は任意の数の入力要素を使用できます。使" +#~ "用できる入力要素は、osssrc、esdsrc、および alsasrc です。オーディオソース" +#~ "は単なる 1 つの要素ではなく、パイプラインの一部になることができます。" + +# SUN REVIEWED +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "ビデオを記録するとき、GStreamer は任意の数の入力要素を使用できます。使用で" +#~ "きる入力要素は、v4lsrc および videotestsrc です。ビデオソースは単なる 1 つ" +#~ "の要素ではなく、パイプラインの一部になることができます。" + +# SUN REVIEWED +#~ msgid "default GStreamer audio source" +#~ msgstr "デフォルトの GStreamer オーディオソース" + +# SUN REVIEWED +#~ msgid "default GStreamer audiosink" +#~ msgstr "デフォルトの GStreamer audiosink" + +# SUN REVIEWED +#~ msgid "default GStreamer video source" +#~ msgstr "デフォルトの GStreamer ビデオソース" + +# SUN REVIEWED +#~ msgid "default GStreamer videosink" +#~ msgstr "デフォルトの GStreamer videosink" + +# SUN REVIEWED +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "デフォルトの GStreamer 視覚化プラグイン" + +# SUN REVIEWED +#, fuzzy +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "デフォルトの GStreamer audiosink" + +# SUN REVIEWED +#, fuzzy +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "デフォルトの GStreamer オーディオソース" + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "デバイス '%s' のコントロール属性の取得に失敗しました" diff --git a/po/lt.gmo b/po/lt.gmo new file mode 100644 index 0000000000000000000000000000000000000000..95e36472781439f8ff7dd20604837708ec583b03 GIT binary patch literal 14302 zcmchdd5|1eea9PQu&mhF7;|3_(AqNgtoAT6UR$*7>mP@2vCeLBt@hE*(nl^q(TUZL*Nf5q>_SELIPE(Q~~*XyI;@r zu2zSkiZ1=;)35vWJAUu?e((3*>IWB|b-%;)DDnbi;VF*u6WI7Iez*qCcbuoeL8wO? z;JI)+JO|zaSHfwy3N~zdpM8J8rth`s_ra%<@5AtH_;L75_-S|+{3=vAUxWN}zRl0` z;p0&4_yv3(JnsU>;h(dHpC`kspxS>8d=b0_s-8Qb+Ittg0=^xpysyAZ;rC%bJp1X6 za|v7rFNUvySHgSXUGNxG{`D6+&R$r9x5MM`COGg6$9Xw?3%nT~g~RaNiyUV)+yGw& zJ*fV@)$%?ly?z8rpNB0Uwfr+EJ^dwg;orbDa2Tbjowvf5!n@%ReAx0asD7UNEXNsz zYv4NAf`jmrQ2l-k>bsTC&f9x6RC`0H{@w>Sz~lD$FQNLe`ZGM(h{>%1#2dW+4g39-|P7PRNd-V(R^4CJO=M_-;9D%B5Bb5Hf;Q)M< zO}`y#ygmrkuFpf&dkm_auR-bUn^5}sC#d%P3siak169wHa0+V2N~m(40hR9sQ2o9P zs@y@i8D0(5jsx%#_y`<fOO zZiL@}cf#{7cAU%My>J|U5zfG;@X;RFfED;vcoY0Dcs1Nc;j-5^LXG?9q4fAesDA$h zYMjo#H1Ge5EGw4RK-t%gFo1jED`5w!oxgxI#km4wQGKt1ny&{TO?UnZ-VA>VH^A}B zSj*r$;T7;3Hm%OdZq`Hj-F;B~ISeG@>fr$Qhj$3JPTe0RnN6>CERMc(>}i$ zs+`;G^V@BDKU95hgG>$Q0n0BymHS;Nd-@(+0e=cr&i_KS;~WN0^*!HmwPgjWzw6+6 za07e_+yOPtyY2hipz5E4=fc$T4N&9%E~xqWFx0yCC8+#=4b|U&wCTs8?B+k9%3r~v ztNPD}Tj6uzeegEef+Fn?}YmPeekL9Vf+3wP~UwCs+q~Y ze+;+5D=}`(uLDr?>XVQuhoS0y1giY6 zK+T6$SLWZZfwIq0sCL$%%4l09V`D6Gbs5;~qK7#1lfE+A|M7H^EYw6H*I7M^83iMkXIuYAa6h}MK&RyMvALpZ-y;jZ~1vBzpZN@5+RQuA3`)g zH76fNo{h*~-HhmBd2v3AtU^{Iy0#$aBcT$dYgg(1o!tK(atpEpxeNJ2qz`!=ayIf_ zMA!Am7;-Q2HstxpOA%e4L_U$-;VZ?y*z{G+)-;$-{4h|mdw)q^e2JNA8_^lwY&Lm8 z;zhdK?6s0v-E0YF-C){tHtxCE44SdP-t0`1>~5%dG-QfLHcysJtA1!&4YxhzPS=eW zMPbzMT<^wl_G7LO!#HuSZ|LQwFbKTqB#dl&YZL~FnQ#NIvFKguElr*zXX-bSiXWKC zmgm;#)uzqPCN~Je#Q0VE>Cd!H)tmRHy{!BF#mlheMQ-AmeSR_lSAdx~cg=%|u=tHd5)=xQU5Uif?+xkBzEpdx?qDRx6AWuSz{(+NfqPrt>bF zBs8%X&8v;wcV2LN>e1J!bY{kjVnat3x3-rvPTZ-6AI}Q+7zh0T*>LtXSa8)sY2Och^S`D zlP#pNS5?g}V?T=)+*YgMPrEXXCsOQhyvyd6Fg4XMxFlh~<~_qaX!>!cajYpDFR48r z<u)8N+$S8X?!rU(pyc)yQX7^qWny9xl|MF}^b7ZwHIFwuV9*ECy5U zM5Qm8)%_>SxY$SZve^O73o847erK!eH<$+Q3{FPNPZH6e{=$d!aU17zHd_-$OkZ4l z(p5z6Jm^fq$5W|VytE;<7RbvdoFonC*i7W%rGx4A(vj*az*ZmI(Ut4UzC~?Nqe4IOZ-Ovto}%e_rt;FW$f8S~ zL?zu(IgK{8n)NkOvu%G_uPUJ1=AJUKttGW&O_pj(Q)y|QTz_=_3{@DlHCgTG&J$3C z7z1nSaTC-u`Vfv+5XS*MGawI1_lSe5(9QUWAFe|_rb^X8@ zCDg#S?r0H3d2~e0F|ohj(}LNTqAM0j7rRrc-x-ZC`c2)SD@&G(FTe6wX_uy#&%15& z_?WW|hs)?V-5&PtVrQFQn{~#5N=CL+G3_o@UZMjc_`D-gC+kdtKzgV0Dz z<2XZS2WxV~pklec=B)f$=7TRc8~2W7jsvai^BWDhHe7X-wupfEtQQ|y)$Mb&)DSK9 zXX|g15lT$pVMG|X+mPm)A**8&xk0Qj*0iE938%vbE}38tL&`#(eSS>9>Jj}BHfVYf zE<{;jqm$Vn;WBsao}4h=9f=oYkwvSK5!mtSC2PZlwHdU?(<>J4j{7nb6c`|6y-JY;M92 z%KMxwxqJ;1#g=ITZO2YGX#c&0|~5Sm5M0ntzk{On#baLz}HhW|$W`#a7L-XxC&*v5PjC z@)kwj?2~LhOtQGke4XMZ-xfHN?SM_}ZleF(P3~6snng@1j?Ra7z2^!j|pPZCKUMmr;^3#WOETG)%X>M!e*4zSu0zYHeySyZ5H&+%)T> zik?O1>E&(u7B6#*z0CH(^0}FjbJ#;=tXiS>a(yGF7AKY5|HYMB7*@?d|KLFX&~X3I zs$HJkY-K#I`PItxX)Uho4oA#vlC(zFuANG2`*G`TKiiL{*B?f;wW}s}?yhWNmS~q* z+02w0F+&4`LzRJ{%Fv)07#JBGxNLxnjFnw%Sk;1FzJbcXm6gGDX7H+!;VUj17$)C# zR=vt@IeaE)7>$_Dv38Bf8VinDR-<&`9d*}Slls+x4Q{>B-$<_Io1m5wdslX|Adi^s zoS>v`;JbmjrjDJxwvlY8hXKbKgv|b27%%#0#59ss<74AndI}osA6SKcSu1EtyG5T8 zR*topvL9S+rf1y<16aRj_twfQd->F4s;F$iwzc~kF|VBRlT{OqG;$l2t%R@fhzZa; z$$0(n)yxdtu3r=M4GyedKWHw#*ywiPCF=(V&2?tLke&3k>xc9z%QkS$;DEXF&O9G4 z1}-JzAQ^`)y?WKnl~Iq)L9R7fn~Px%^snn5TxHMVX40UJ0$e4#_m3ZVurGf6z=w#+ z8@`8biw8P|!{MZnANa8nH6LRw5-rZQ8jOiOms>b8@3AE6@zCInDt4S+a9 zDK|;$y$59Q>f|9Tskf_MgPUHS@r8qpcChHP?xRzFs0gtZrJ;!Ar~pqsQ4AGK(gm9?VKI`M&5Bedew$*+?I7fR3TEUca5EU36DJ0Lm`jHo6* z5gg@{W_xPkAYJu*6hOE9$ak9y_slKa!&Y>PU(Qk@H=6;5hE&_AmDPpA7dJA&!odjj zb{k1IV}CAX59kwh`K%Y&Ng++>W|5+cei+YhEF9Fqofr8GLeaDKoYys|Qm_?a4Id zwyI%fi>Y7g$gf(0={&?bXwL^3#Q@{bIERLM!+4oPMq0{%;JnVD`T3-wq2>u?UifTo zjtfUjKwuZnxy%XnKt$a&c6DX*IBCCoRsV*1cthu~)W_7!8gaO6z% zMsBxrsNFoXAui=MzeX#HCYCIe$?N)w+F^W-6T59H2B;nPWx1suV%>En)dr5QeQF?+_2-M87Nx|c%zn)FwwH_K(BkAU;c_;=@PN*Z znOkQ9rU6TQw=HE|6e|_WCsAzfsPa?DWZsSH?K+O9pRT*sQ5^j$W#TX}LD^pZ3G95*PV9+q-;lRG-RU>TF7e+2XuOEeh~B zoumDxG=4g|oW!wvO}s=l)KJ0uQAm*oMgkGbIrN3WiBna&|Z1ii^_ObWlaf^be_9x z-49DDvn}i9Kz~JP<+Z1@Xq@nIk-uDfehkWrq);Mlo>-$4oi7m77@@Pyp=Pd^+=rGc zFV&cKjx%_QP)ZtH(q^JFw-~;jrb=JxV9{lWN^`fY`(?jbyuf0FS-ikf-OGK-xa7n^ zpab30(XJJi%P0)wgzlB}(aV2gr+nOBvFI=RNofp*R-ZWT!>hBnwlp|>gR9w!b{ktv z8GnD3=+CVZQJmZZj8cx`-3c2w_U=j{BqN(mk8ZBgyM-hCnGPr5n+6ddQFu{ODG&bP z^qHCp2WLX!Qx0GW3i3dAl=+_p68OP|gSu6Zm@@4ukp}0m^S+m`8O#o0C;SGna4F)o z4;1O0G%D^K!)O+LRXjQ6XW7y0F1BaSkUa6AVJ_pDpX%x+JJ;3CaMlR|64{Lx<$jhOTAJ-!umHD)XUjU1MfRC*s;}wb!g< zH=|%PkAqqN^0Cx9cthIMeu`a@CNtK}9Lje&RhM&IH|-q}qYs@C*TY8VsNw*%Vo`*c zw&%yXFw zlsk>lR2~8IsJLA;33?BE27SiW?$UN>@qs}1(J8x{A3XP>=j=dQ+RIN%IuG$D7qxz@ zNffFmOn>v?Y;shyH$OZ;J*AX3h{b%ItlL>&3tTv|P(Ihfq-W=xaOCIQq&SyH1|!9LJMuDbewEp=4`oi_?oXej3rpUpPnv ztDV1&(`-0o1McF?O1lz@&knt{He?2thrxB1zn@~O%fIc;faPEJW`s*p@#4 literal 0 HcmV?d00001 diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..aeae1c0 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,776 @@ +# Lithuanian translation for gst-plugins-good. +# This file is put in the public domain. +# Gintautas Miliauskas , 2008. +# Aurimas Černius , 2010. +# Žygimantas Beručka , 2010. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.23.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-07-16 19:34+0300\n" +"Last-Translator: Žygimantas Beručka \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Virtaal 0.6.1\n" + +msgid "Could not establish connection to sound server" +msgstr "Nepavyko prisijungti prie garso serverio" + +msgid "Failed to query sound server capabilities" +msgstr "Nepavyko užklausti garso serverio galimybių" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "„%s“ atlieka „%s“" + +msgid "Internal data stream error." +msgstr "Vidinė duomenų srauto klaida." + +msgid "Failed to decode JPEG image" +msgstr "Nepavyko dekoduoti JPEG paveikslėlio" + +msgid "Could not connect to server" +msgstr "Nepavyko prisijungti prie serverio" + +msgid "Server does not support seeking." +msgstr "" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "Nepavyko prisijungti prie serverio" + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "Nepavyko prisijungti prie garso serverio" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Nėra įvesties garso arba jis netinkamas, AVI srautas bus sugadintas." + +msgid "This file contains no playable streams." +msgstr "Šiame faile nėra atkurtinų srautų." + +msgid "This file is invalid and cannot be played." +msgstr "Failas netinkamas ir negali būti atkurtas." + +msgid "This file is corrupt and cannot be played." +msgstr "Failas sugadintas ir negali būti atkurtas." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Failas nebaigtas ir negali būti atkurtas." + +msgid "The video in this file might not play correctly." +msgstr "Šiame faile esantis vaizdo įrašas gali būti atkurtas nekorektiškai." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Šiame faile per daug srautų. Grojami tik pirmieji %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Nerasta palaikomų srautų. Jums gali reikėti įdiegti GStreamer RTSP " +"papildinio įskiepį Real media srautams." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Nerasta palaikomų srautų. Jums gali reikėti leisti daugiau transporto " +"protokolų, arba jūs neturite tinkamo GStreamer RTSP papildinio įskiepio." + +msgid "Internal data flow error." +msgstr "Vidinė duomenų srauto klaida." + +msgid "Volume" +msgstr "Garsumas" + +msgid "Bass" +msgstr "Žemi dažniai" + +msgid "Treble" +msgstr "Aukšti dažniai" + +msgid "Synth" +msgstr "Sintezatorius" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Garsiakalbiai" + +msgid "Line-in" +msgstr "Įvedimas" + +msgid "Microphone" +msgstr "Mikrofonas" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Maišiklis" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Įrašymas" + +msgid "In-gain" +msgstr "Garsinimo ribose" + +msgid "Out-gain" +msgstr "Už garsinimo ribų" + +msgid "Line-1" +msgstr "Linija-1" + +msgid "Line-2" +msgstr "Linija-2" + +msgid "Line-3" +msgstr "Linija-3" + +msgid "Digital-1" +msgstr "Skaitmeninis-1" + +msgid "Digital-2" +msgstr "Skaitmeninis-2" + +msgid "Digital-3" +msgstr "Skaitmeninis-3" + +msgid "Phone-in" +msgstr "Telefonas-įv" + +msgid "Phone-out" +msgstr "Telefonas-išv" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radijas" + +msgid "Monitor" +msgstr "Monitorius" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Nepavyko atverti garso įrenginio grojimui. Įrenginį naudoja kita programa." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Nepavyko atverti garso įrenginio grojimui. Jūs neturite leidimo atverti " +"įrenginį." + +msgid "Could not open audio device for playback." +msgstr "Nepavyko atverti garso įrenginio grojimui. " + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Nepavyko atverti garso įrenginio įrašymui. Jūs neturite leidimo atverti " +"įrenginį." + +msgid "Could not open audio device for recording." +msgstr "Nepavyko atverti garso įrenginio įrašymui." + +msgid "Could not open audio device for mixer control handling." +msgstr "Nepavyko atverti garso įrenginio maišiklio valdymo apdorojimui." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Nepavyko atverti garso įrenginio maišiklio valdymo apdorojimui. Šis " +"elementas nepalaiko šios Open Sound System versijos." + +msgid "Master" +msgstr "Pagrindinis" + +msgid "Front" +msgstr "Priekinis" + +msgid "Rear" +msgstr "Galinis" + +msgid "Headphones" +msgstr "Ausinės" + +msgid "Center" +msgstr "Vidurinis" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Supantis" + +msgid "Side" +msgstr "Šoninis" + +msgid "Built-in Speaker" +msgstr "Integruotas garsiakalbis" + +msgid "AUX 1 Out" +msgstr "AUX 1 išvestis" + +msgid "AUX 2 Out" +msgstr "AUX 2 išvestis" + +msgid "AUX Out" +msgstr "AUX išvestis" + +msgid "3D Depth" +msgstr "3D giluminis" + +msgid "3D Center" +msgstr "3D vidurinis" + +msgid "3D Enhance" +msgstr "3D pakeltas" + +msgid "Telephone" +msgstr "Telefonas" + +msgid "Line Out" +msgstr "Išeinanti linija" + +msgid "Line In" +msgstr "Įeinanti linija" + +msgid "Internal CD" +msgstr "Vidinis CD" + +msgid "Video In" +msgstr "Vaizdo įvestis" + +msgid "AUX 1 In" +msgstr "AUX 1 įvestis" + +msgid "AUX 2 In" +msgstr "AUX 2 įvestis" + +msgid "AUX In" +msgstr "AUX įvestis" + +msgid "Record Gain" +msgstr "Įrašymo garsinimas" + +msgid "Output Gain" +msgstr "Išvesties garsinimas" + +msgid "Microphone Boost" +msgstr "Mikrofono pagarsinimas" + +msgid "Loopback" +msgstr "Perduoti ratu" + +msgid "Diagnostic" +msgstr "Diagnostika" + +msgid "Bass Boost" +msgstr "Žemųjų dažnių sustiprinimas" + +msgid "Playback Ports" +msgstr "Grojimo prievadai" + +msgid "Input" +msgstr "Įvestis" + +msgid "Record Source" +msgstr "Įrašymo šaltinis" + +msgid "Monitor Source" +msgstr "Monitoriaus šaltinis" + +msgid "Keyboard Beep" +msgstr "Klaviatūros pypsėjimas" + +msgid "Simulate Stereo" +msgstr "Imituoti stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Erdvinis garsas" + +msgid "Microphone Gain" +msgstr "Mikrofono garsinimas" + +msgid "Speaker Source" +msgstr "Garsiakalbio šaltinis" + +msgid "Microphone Source" +msgstr "Mikrofono šaltinis" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Centras / LFE" + +msgid "Stereo Mix" +msgstr "Stereo maiša" + +msgid "Mono Mix" +msgstr "Mono maiša" + +msgid "Input Mix" +msgstr "Įvesties maiša" + +msgid "SPDIF In" +msgstr "SPDIF įvestis" + +msgid "SPDIF Out" +msgstr "SPDIF išvestis" + +msgid "Microphone 1" +msgstr "Mikrofonas 1" + +msgid "Microphone 2" +msgstr "Mikrofonas 2" + +msgid "Digital Out" +msgstr "Skaitmeninė išvestis" + +msgid "Digital In" +msgstr "Skaitmeninė įvestis" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modemas" + +msgid "Handset" +msgstr "Ragelis" + +msgid "Other" +msgstr "Kita" + +msgid "None" +msgstr "Nėra" + +msgid "On" +msgstr "Įjungta" + +msgid "Off" +msgstr "Išjungta" + +msgid "Mute" +msgstr "Nutildyta" + +msgid "Fast" +msgstr "Greitas" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Labai žema" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Žema" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Vidutinė" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Aukšta" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Labai aukšta" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Sukūrimo" + +msgid "Front Panel Microphone" +msgstr "Priekinio skydelio mikrofonas" + +msgid "Front Panel Line In" +msgstr "Priekinio skydelio įeinanti linija" + +msgid "Front Panel Headphones" +msgstr "Priekinio skydelio ausinės" + +msgid "Front Panel Line Out" +msgstr "Priekinio skydelio išeinanti linija" + +msgid "Green Connector" +msgstr "Žalias kištukas" + +msgid "Pink Connector" +msgstr "Rožinis kištukas" + +msgid "Blue Connector" +msgstr "Mėlynas kištukas" + +msgid "White Connector" +msgstr "Baltas kištukas" + +msgid "Black Connector" +msgstr "Juodas kištukas" + +msgid "Gray Connector" +msgstr "Pilkas kištukas" + +msgid "Orange Connector" +msgstr "Oranžinis kištukas" + +msgid "Red Connector" +msgstr "Raudonas kištukas" + +msgid "Yellow Connector" +msgstr "Geltonas kištukas" + +msgid "Green Front Panel Connector" +msgstr "Žalias priekinio skydelio kištukas" + +msgid "Pink Front Panel Connector" +msgstr "Rožinis priekinio skydelio kištukas" + +msgid "Blue Front Panel Connector" +msgstr "Mėlynas priekinio skydelio kištukas" + +msgid "White Front Panel Connector" +msgstr "Baltas priekinio skydelio kištukas" + +msgid "Black Front Panel Connector" +msgstr "Juodas priekinio skydelio kištukas" + +msgid "Gray Front Panel Connector" +msgstr "Pilkas priekinio skydelio kištukas" + +msgid "Orange Front Panel Connector" +msgstr "Oranžinis priekinio skydelio kištukas" + +msgid "Red Front Panel Connector" +msgstr "Raudonas priekinio skydelio kištukas" + +msgid "Yellow Front Panel Connector" +msgstr "Geltonas priekinio skydelio kištukas" + +msgid "Spread Output" +msgstr "Skleisti išvestį" + +msgid "Downmix" +msgstr "Sumaišyti" + +msgid "Virtual Mixer Input" +msgstr "Virtualaus maišiklio įvestis" + +msgid "Virtual Mixer Output" +msgstr "Virtualaus maišiklio išvestis" + +msgid "Virtual Mixer Channels" +msgstr "Virtualaus maišiklio kanalai" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d funkcija" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s funkcija" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Nepavyko atverti garso įrenginio grojimui. Šis elementas nepalaiko šios Open " +"Sound System versijos." + +msgid "Playback is not supported by this audio device." +msgstr "Šis garso įrenginys nepalaiko grojimo." + +msgid "Audio playback error." +msgstr "Garso grojimo klaida." + +msgid "Recording is not supported by this audio device." +msgstr "Šis garso įrenginys nepalaiko grojimo." + +msgid "Error recording from audio device." +msgstr "Klaida įrašant iš garso įrenginio." + +msgid "Gain" +msgstr "Garsinimas" + +msgid "Headphone" +msgstr "Ausinės" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Klaida skaitant %d baitus (-ų) iš įrenginio „%s“." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Gautas netikėtas kadro dydis %u vietoje %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Klaida skaitant %d baitus (-ų) įrenginyje „%s“." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Klaida gaunant įrenginio „%s“ funkcijas: tai nėra v4l2 tvarkyklė. " +"Patikrinkite, ar tai v4l1 tvarkyklė." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Nepavyko užklausti įvesties %d įrenginyje %s atributų" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Nepavyko gauti derintuvo %d įrenginyje „%s“ parametrų." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Nepavyko užklausti normalės įrenginyje „%s“." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Nepavyko gauti valdymo atributų įrenginyje „%s“." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Nepavyko nustatyti įrenginio „%s“." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Tai nėra įrenginys „%s“." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Nepavyko atverti įrenginio „%s“ skaitymui ir rašymui." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Įrenginys „%s“ nėra įrašymo įrenginys." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Įrenginys „%s“ nėra išvesties įrenginys." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Nepavyko nustatyti normalės įrenginiui „%s“." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Nepavyko gauti įrenginio „%s“ dabartinio derintuvo dažnio." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "Nepavyko nustatyti įrenginio „%s“ derintuvo dažnio į %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Nepavyko gauti įrenginio „%s“ signalo stiprumo." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Nepavyko gauti valdiklio %d reikšmės įrenginyje „%s“." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Nepavyko nustatyti valdiklio %2$d įrenginyje „%3$s“ reikšmės %1$d." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Nepavyko gauti dabartinės įvesties įrenginyje „%s“. Galbūt tai radijo " +"įrenginys" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Nepavyko nustatyti įvesties %d įrenginyje %s." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Nepavyko gauti dabartinės įvesties įrenginyje „%s“. Galbūt tai radijo " +"įrenginys" + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Nepavyko nustatyti įvesties %d įrenginyje %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Nepavyko sustatyti į eilė buferių įrenginyje „%s“." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Nepavyko gauti vaizdo kadrų iš įrenginio „%s“." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Nepavyko po %d bandymų. Įrenginys %s. Sistemos klaida: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Nepavyko įrenginio „%s“ parametrų" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Vaizdo įvesties įrenginys nepriėmė naujų kadrų dažnio nustatymų." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Nepavyko išdėstyti buferių iš įrenginio „%s“" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Įrenginio „%s“ tvarkyklė nepalaiko jokių žinomų įrašymo būdų." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Galimybės keisti skiriamąją gebą operacijos vykdymo metu dar nėra." + +msgid "Cannot operate without a clock" +msgstr "Negali veikti be laikrodžio" + +#~ msgid "Describes the selected input element." +#~ msgstr "Aprašo pasirinktą įvesties elementą." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "Aprašo pasirinktą išvesties elementą garso/vaizdo konferencijoms." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "Aprašo pasirinktą išvesties elementą muzikai ir filmams." + +#~ msgid "Describes the selected output element." +#~ msgstr "Aprašo pasirinktą išvesties elementą." + +#~ msgid "GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "GStreamer garso išvesties elementas garso/vaizdo konferencijoms" + +#~ msgid "GStreamer audiosink for Music and Movies" +#~ msgstr "GStreamer garso išvesties elementas muzikai ir filmams" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer gali groti garsą naudodamas bet kokį išvesties elementų kiekį. " +#~ "Keletas galimų pasirinkimų: osssink, esdsink ir alsasink. Garso išvesties " +#~ "elementą gali sudaryti dalinis konvejeris, ne tik vienas elementas." + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer gali groti vaizdo įrašus naudodamas bet kokį išvesties elementų " +#~ "kiekį. Keletas galimų pasirinkimų: xvimagesink, ximagesink, sdlvideosink " +#~ "ir aasink. Vaizdo išvesties elementą gali sudaryti dalinis konvejeris, ne " +#~ "tik vienas elementas." + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "GStreamer gali įdėti vaizdo efektų įskiepius į konvejerį, kad " +#~ "transformuotų garso srautą vaizdo kadruose. Numatytasis įskiepis yra " +#~ "goom, tačiau greitu metu bus realizuota daugiau vaizdo efektų įskiepių. " +#~ "Vaizdo efekto įskiepį gali sudaryti dalinis konvejeris, ne tik vienas " +#~ "elementas." + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer gali įrašyti garsą naudodamas bet kokį įvesties elementų " +#~ "skaičių. Keletas galimų pasirinkimų: osssrc, esdsrc ir alsasrc. Garso " +#~ "šaltinį gali sudaryti dalinis konvejeris, ne tik vienas elementas." + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer gali įrašyti vaizdą iš bet kokio skaičiaus įvesties elementų. " +#~ "Keletas galimų pasirinkimų: v4lsrc ir videotestsrc. Vaizdo šaltinį gali " +#~ "sudaryti dalinis konvejeris, ne tik vienas elementas." + +#~ msgid "default GStreamer audio source" +#~ msgstr "numatytasis GStreamer garso šaltinis" + +#~ msgid "default GStreamer audiosink" +#~ msgstr "numatytasis GStreamer garso išvesties elementas" + +#~ msgid "default GStreamer video source" +#~ msgstr "numatytasis GStreamer vaizdo šaltinis" + +#~ msgid "default GStreamer videosink" +#~ msgstr "numatytasis GStreamer vaizdo išvesties elementas" + +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "numatytasis GStreamer vaizdo efekto įskiepis" + +#~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "" +#~ "GStreamer garso išvesties elemento garso/vaizdo konferencijoms aprašymas" + +#~ msgid "description for GStreamer audiosink for Music and Movies" +#~ msgstr "GStreamer garso išvesties elemento muzikai ir filmams aprašymas" + +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "numatytojo GStreamer garso išvesties elemento aprašymas" + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "numatytojo GStreamer garso šaltinio aprašymas" + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Šis failas užšifruotas ir negali būti pagrotas." + +#~ msgid "Disc is not an Audio CD." +#~ msgstr "Diskas nėra Audio CD" + +#~ msgid "Could not read from CD." +#~ msgstr "Nepavyko skaityti iš CD." diff --git a/po/lv.gmo b/po/lv.gmo new file mode 100644 index 0000000000000000000000000000000000000000..1dce489833f38132aebf910172087536e9185fe7 GIT binary patch literal 15371 zcmchd36v#OdB+P7!C_GrH*mS24U9~`>FxoAh7pG8S(@3}>0y9T606^XKw%MR^7VGcfb4H?|yH-efl%*^te7xdJ*Z&XL{Z-$9Ue!C+n%_J?A-|cPcy$ zo&*ilt5xt>@KSgpTn|^kt?+7it$Y3!OI;D@35`*nCO{4pGWXFWgX zHmGsm3^&0Kz|HU<;45M83p}qM)}Z9@Ua0Tqq5A(5sD7_{VLtxXz$?kW0qXf7sPTLU z_Q2zrq>JH&(2gH!e(!|G!@D6}^zMU*(0ddjGVe?7`QJg6|1ng5{s&4QFJuthdV^5< zaShbC0{*D{ekl3e3MIcgpyc~L_x^tO{v%NR_yknBN1*il_aQ^@z6|;2eV0E>y>~3i zrTU)>Pl0E_(N zyP?KC3sGV3vryysisPR_wetj&yuJg~-oHZi|G%Kd`6Sf5uXr(Y4cEa0ehaGH7L--} z8-ZG1yP(>?7V@b#3Dxc`Q1#yiRquPCzPr!8f55$e5K7LUhU(Ynpyu(*F8@8an*4u4 zjsLut=JoeO_2*Ska=jd?o%K-jumkqN8(jVlsQLQxRH$%1eb~psz1J%DL;Q4UHIp{7N zfUkf}*bCq1@_z)?|9^vO?<5wp>N_2(y%#~X)8q0N!b{0t1ht+bsP%LU)Ovb9R6QSq z8sEcEdOZ&{pWlI+&mY1kkD<)V^6{M7lgs(Vjw_-1ak0x^0VS6$P~*JbJ-^rSLB~fN z{{ZUyuR4AUqH5mXL&;ypOY?C&RKL%LD`6khc=o^xU<5H)-d*rm_;IN5d;e+Ftkz6<&1oknA?hL^%Oz?fhuDlc~$ zoZo^9Z`B({MezPbwVzzTpX1>kcnW+yWQltbMAf|89Y5)w z{{?&&&wm6}|C3O9U16|@!rK6)A2&kD^HwPR`2;)>J`DB!0m|F1??;;&XdL5~_e%0OlGTcInNfpvbq~9f7 zMp{GCwSn{k()*R+I!k|gQqxm28{1Je3*$)H&i(m4>G@`C+KAqoA+tV+vLMmjP|(UI zb+aLw^rLFvtus-O?TeGT36dmEOkAzDlc2WBaGy;ECJmCQATiZOoCY=fq#8$2VB0k9 zD7dM`eNbymSG;xCTxa^taO7@wv@?4*P&^ti#Uoe7X4|zeHm!y~J?2+kCo0}mewx}p z=BhYOGw-T~UarqujuV&Pn8Z11rf&@iJ}&iJt{#UzknC?acTRPqpqjG3PL=&DM<@y!D8AB8(sWhy zJV;W*Ko<74Q%jI${#YYSCrxScI#rh2J7USW9n}u+!UX+p`H9~Q(67`mwo(sDU2XcU zPB+JsxOs$P2o~vBjd1mhqlV4!CTSpZox}};JZlXETJH7J`p)c{MCvGYs=0{Aty1q$ z%cFLXqtj^?G>e((%!<}irZ0m=&_p?wZ@*CLr%{siY1NHp#sX} z`cP72BP~nTtFPK24?kWnpeWk=n8Z-3`*pmVpz8;bWuEF*7&wehT4bzeR4$HE3< z2~s=8(wGO$Fjg?t1o~#`qQ-!!B_WHZV%ARv*y3>9ges7~?JwTC77AgpL5)pks(sO- zuN>9ZEMYvA!o>7&o90W}?r?*qCoMkd2qL#F z3?}2_v9@}=xFfC=w6}&b)&g_&$c9ZOZ2A*HQ62AO5ZOQz3rwc!SMH%~bf&>Hhji@@kc*;AHbmK^!n#e@jFOlt{PAuwi8csy0W|}en ziEMJY2B!Q5+m{wsVcegx1$v!e2}@Ii4q6%WS$Fg6PA}ugzlq|c`4nBx3#FwkZo$$h z4HA)brgs@>YRm3vw9V$3vRqX`r_WtsqNIyjv0avEN^5d)8K)Qvgm!pMxs)k%l!8vC zWgDChOyLN{s0`+8sYSfe$2qgkRsPpGW1F#+t;skFSZO66ZEF|>vRj8elL0F~+!j`o z*jC_e^25m6gp1VmHS_M6G@J>vefPAHC|kCVb}Co#HYKdF^&Mx?X3N!=Uj^*@i}OpD z-8{5y*xQWxXAZs22)lQww>g}c^oFC}3H5ncnwkGK+c3Sua>2Daa56jhH9zyscq87I zd*78sZ?us7X7?Ra8Di)%94L*x;$4kf>}?6A$6`OJnX7`J<;m$R1Z^qd>V~bsVj#zw z9Q1T+9Jl0rbF6cmM2%oZ zX(Nup44>XnUYIQsN3oIMwqcIF?XkIL=T>%C{4VZU7h#l3BVSE+M_6Un?H;z)2chi? z8x0v+Hjbp-%0KHmb564Rd~JNVwiW9vG?~DR15v;x5*xpviD|~{)mh?4sl0R3O5!Z8 z#tk+IJX7?{`epmV6hAz`RmI2A>cO{3Y-O89?HpovckUV;F~Ln)5Lq{<)o61ru%mf; z-IB7?H8$R5>b47hXMoBznN8mb21~P@mFevmANO`d-VR1KQ9duZ2TQMk9dbfFG%D9| zZnVYONgi3h%_H>=cq3Z*9IM<-jQ)*;QTh00vrD%yQk(=wkap^Ivd(?#imGtO7y1Gt zNnC5^2jZRDSv|&|@JH^0L*Cu|QK4*kPBV9u?d(KFx@JSUrH3;*GBmu=3`bsmqqR61 z=!9K9iJ{f)mKnEhOojLM#9fQAxH=oUA*1_2ogQ`yr1CMwuzE5gJjGJ;r`c}kXgbOw z4q~r3*g6)&9c{@$({Wrjswiteu}f|g4@RrPD{k_mkvBRW5k1(&2`D$tyX3-Kw@{|H zv{T{wFY3J?O`Cdz8`|-IIWtbi9ClSnzRj?Q+Y{C}{v1omu0;f(bCg}iL>d%lu!k92 zri$O@vmTI>EyW=h58N&|)O?9@Ssb%y=}J+^?1&oE_FGN-ksn z@Bm9)z0z5|+X_X)s2Vq04Nk*HSK1kLjuc0zxbVPBvZcu+V4&V^xkGl(v3IiGyR}{C zf2DLb>--H@LyZkYTIE-(go3bj``mVFBN}L8ez4gcCRrQHVGT7dKf?|hDHWC<=Ud#u zXHKVf6YFRO-nEkMmVn2=4Lb0=klbb3D<}^sPYX>`U}-y2U^qSbNQ`jlGw2%V``0oq9K* z@H!R`noGvQY{f{Uo%oI3jriN?poy3avgz72m$6)QyY_;pr@wFQ+J1B1c}BN==dA7T zH&>WGLveG?T5hf&h={OPUbf=8-c11~mRww0Tr z>#-3O=&UlXB-LGQCY(FeZrc0yOv4|G_bRtN&ceEHvbouM!#DN0L-VsWf0dc?LwA_h zmJs06*-0{fI5RbOAYnW8r@|mo9k`r%>@y4kI^*tViu(c6ea^jmzP|L-J+px?KTGTW z{H^i)K|jJfas9C&(a?rOeIjl|0??FbZoeJDwxALD^wRYx<8g`ymp_z7)#ne+9oRd! zpD&|e?og-idC5H?Q@!YG_iXu(hl8>CSpx9yY?d0^Epzj*Ov;OtW^&y!}F8iht16Ja!Yhm-IJ` zYFH8Ct3lGnxZ45D9k3%Psz4ipu%>Ogs}7~QmMx~aW)usXj^c)&N@gy$s@B=!@($2f ztK0byXg>@x+An&!bUDci2}pCX{Z`S6`Dli9T1WHqAPCh@`KY>;Xjt_Bs6J&J(P z)Zw4uBQxxjv*phpl>VSfO+VrgP$k$Vr+c{33mj)GPg zRKtKdZK{1g!w9rlJ*y0ZE#%5MI+p^Y)Y5$louQ!5Dm^+aSzLJOe&NBfN-@w=XrLmJ zn1uGx_s@0RE)537*SP{)JAQ=DI>VH&J=8Ex{dV1&^I5A4QJJiwe5v0Pp&=i<38$MHSb+iq#`&K
Gc)r4T+qN%o3{3gmI*qI`C+z%^{V_VpKQtZW(`Q%M*|qU!kA(56MAQLmu)5G z$2E3{s`}8JJ1}>@+bzSOSt%q!B$(JR)@bg4%#jnE4G?b+!Wlef$ukTl<}t-x^XMx^ z%%jeh5agShn(ln%XZ5(owwQ;B30lq_Xtc`(^68O@pFf!J9ji?i9_0xSv-On)Qzhl$ z_Xr(ti;*l}v9z-N|4=dGEO{%$mg`f*mX{d9QeDhF9eE+X=BYiyRP1N(kxzB_j<-O* zh4>V5){@{vhfBnFhmUcomb~F7fA*9$-}J zxQ;}PD3s8>r)r{8)CvZbEKE~p(Uz<3h->i@U!YQ&pt(bZJK3F}_Dm-{UFzt!#tfS_o^2-gcR1~L0+IZAeFPNiZ>JAgUyrLy_B#$oC{n}D~RK=USSqFrX zj-QONE#*pHv)@L^}o1~O|Ct60|&UHOg!d&&-~Wt3|BcZ0Q0^nw!<4!-qInUi66j!~yLUKClRO9ZUV z33GlnE!lDH&2@M1Nsm-ydr;F>KOvteZWhu+$G3(PGd1610Gze6`Pqb?v^XN70YMbz zQTBYIwL|ErH|pHmd}g=iFBNomcf{S@-I{LM{J_W&NsF`^)`_v~37GFqegiuyO(cfH z*1&nLqZOSy8;EzhV&m}n{SpU6_bqQaLN03ISTGec4Ojc^YTl6cExO?1@tvEZAkPV+ zg(?4GhVE@?Fu{~obY2cbca_UfSl?5}WPU@&dx$#Hwi_LjZg=la+}51NH> ze8$Zj$=KDgM#D2H%X-4DrQ%Lu{Q1WZTfg1M%dg<|p=xyQY*%sYld>jtBmasFW4KsG zc1_zzah|uecst`6R%>zUwqc6=(ej;Hw=gWCXkO^qb5-F0D!LG$Vx6;O`C!Ol(*87% zhl}!`21e)hvyz94qYOXRb#BYU>pZnyHY#hE%MqF;0xdOVlV@Vw`G~ehee#FLXu6M= z7eM|4f-^PtSB2cr3?=OCU8$mIvSKzUVLOaOirt!i*xwegpCvIhgF4!yvg&B3K%C;@ z>U5qGLy@m5Bg>i|;lCv1zca|Ypn1eCU~=P%7;QcFNtkrgIu8k4+n55Vg&W)^O9h%cXNGdkdkH z8Zm=BP>u`~B-0NuK*1~4IN=hfdYQyVL$73!R%+n~ zdGQt}7TKm68az{2Gi=K)R(!WnB9nwCLo9c~*&Uy$+;W&WOPTWfxY|Fw&#tE}+f&MG z2>jnNti^Jldk$YC@a?9?)Z6TM*Exq}JN#uJRjstkc(I$2z=pA1=R)hh_qO&u>->%%FX2H~hllvllbnO9pKJ E4, 2009. +# Rihards Prieditis , 2010. +# Rihards Prieditis , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-09-02 11:23-0000\n" +"Last-Translator: Rihards Priedītis \n" +"Language-Team: Latvian \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " +"2);\n" +"X-Generator: Lokalize 1.0\n" + +msgid "Could not establish connection to sound server" +msgstr "Nevar izveidot savienojumu ar skaņas serveri" + +msgid "Failed to query sound server capabilities" +msgstr "Neizdevās noskaidrot skaņas servera iespējas" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "\"%s\"ko \"%s\"" + +msgid "Internal data stream error." +msgstr "Iekšējās datu plūsmas kļūda." + +msgid "Failed to decode JPEG image" +msgstr "Neizdevās atkodēt JPEG attēlu" + +msgid "Could not connect to server" +msgstr "Nevar savienoties ar serveri" + +msgid "Server does not support seeking." +msgstr "Serveris neatbalsta meklēšanu." + +msgid "Could not resolve server name." +msgstr "Nevar atpazīt servera nosaukumu." + +msgid "Could not establish connection to server." +msgstr "Nevar izveidot savienojumu ar serveri." + +msgid "Secure connection setup failed." +msgstr "Drošā savienojuma izveidošana neizdevās." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Notika tīkla kļūda, vai serveris negaidīti aizvēra savienojumu." + +msgid "Server sent bad data." +msgstr "Serveris nosūtija sliktus datus." + +msgid "No URL set." +msgstr "URL nav uzstādīts." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Nav neviena vai nederīgs ievades audio, AVI straume tiks bojāta." + +msgid "This file contains no playable streams." +msgstr "Šis fails nesatur nevienu atskaņojamu straumi." + +msgid "This file is invalid and cannot be played." +msgstr "Šis fails ir nederīgs un nevar tikt atskaņots." + +msgid "This file is corrupt and cannot be played." +msgstr "Šis fails ir bojāts un nevar tikt atskaņots." + +msgid "Invalid atom size." +msgstr "Nederīgs atoma izmērs." + +msgid "This file is incomplete and cannot be played." +msgstr "Šis pails ir nepabeigts un nevar tikt atskaņots." + +msgid "The video in this file might not play correctly." +msgstr "Video šajā failā var tikt atskaņots nepareizi." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Šis fails satur pārāk daudz straumes. Tiek atskaņota tikai pirmā %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Netika atrasta atbalstīta straume. Iespējams jums jāinstalē GStreamer RTSP " +"paplašinājuma spraudni priekš Real media straumēm." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Netika atrasta atbalstīta straume. Jums iespējams jāatļauj vairāk transporta " +"protokoli vai arī trūkst GStreamer RTSP paplašinājuma spraudnis. " + +msgid "Internal data flow error." +msgstr "Iekšējā datu plūsmas kļūda." + +msgid "Volume" +msgstr "Skaļums" + +msgid "Bass" +msgstr "Basi" + +msgid "Treble" +msgstr "Diskants" + +msgid "Synth" +msgstr "Sintēze" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Skaļrunis" + +msgid "Line-in" +msgstr "Skaņas ieeja" + +msgid "Microphone" +msgstr "Mikrofons" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Jaucējs" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Ierakstīt" + +msgid "In-gain" +msgstr "Ievades pieaugums" + +msgid "Out-gain" +msgstr "Izvades pieaugums" + +msgid "Line-1" +msgstr "Līnija-1" + +msgid "Line-2" +msgstr "Līnija-2" + +msgid "Line-3" +msgstr "Līnija-3" + +msgid "Digital-1" +msgstr "Digitālais-1" + +msgid "Digital-2" +msgstr "Digitālais-2" + +msgid "Digital-3" +msgstr "Digitālais-3" + +msgid "Phone-in" +msgstr "Telefona ievade" + +msgid "Phone-out" +msgstr "Telefona izvade" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitors" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Nav iespējams atvērt audio ierīci atskaņošanai. Ierīci pašlaik izmanto cita " +"programma." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Nav iespējams atvērt audio ierīci atskaņošanai. Jums nav nepieciešamās " +"atļaujas, lai atvērtu ierīci." + +msgid "Could not open audio device for playback." +msgstr "Nav iespējams atvērt audio ierīci atskaņošanai." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Nevar atvērt audio ierīci ierakstīšanai. Jums nav nepieciešamo piekļuves " +"tiesību, lai atvērtu ierīci." + +msgid "Could not open audio device for recording." +msgstr "Nevarēja atvērt audio ierīci ierakstīšanai." + +msgid "Could not open audio device for mixer control handling." +msgstr "Nevarēja atvērt audio ierīci miksera kontroles vadīšanai." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Nevar atvērt audio ierīci miksera kontrolas vadīšanai. Šī Atvertās Skaņas " +"Sistemas versija neatbalsta šo elementu." + +msgid "Master" +msgstr "Galvenais" + +msgid "Front" +msgstr "Priekšējais" + +msgid "Rear" +msgstr "Sāni" + +msgid "Headphones" +msgstr "Austiņas" + +msgid "Center" +msgstr "Centrs" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Ieskaujošā" + +msgid "Side" +msgstr "Puse" + +msgid "Built-in Speaker" +msgstr "Iebūvētais skaļrunis" + +msgid "AUX 1 Out" +msgstr "AUX 1 izeja" + +msgid "AUX 2 Out" +msgstr "AUX 2 izeja" + +msgid "AUX Out" +msgstr "AUX izeja" + +msgid "3D Depth" +msgstr "3D dziļums" + +msgid "3D Center" +msgstr "3D centrs" + +msgid "3D Enhance" +msgstr "3D uzlabojums" + +msgid "Telephone" +msgstr "Telefons" + +msgid "Line Out" +msgstr "Skaņas izeja" + +msgid "Line In" +msgstr "Līnijas ieeja" + +msgid "Internal CD" +msgstr "Iekšējais CD" + +msgid "Video In" +msgstr "Video ieeja" + +msgid "AUX 1 In" +msgstr "AUX 1 ieeja" + +msgid "AUX 2 In" +msgstr "AUX 2 ieeja" + +msgid "AUX In" +msgstr "AUC ieeja" + +msgid "Record Gain" +msgstr "Ierakstīta pieaugums" + +msgid "Output Gain" +msgstr "Izvada pieaugums" + +msgid "Microphone Boost" +msgstr "Mikrofona pastiprinājums" + +msgid "Loopback" +msgstr "Atpakaļcikls" + +msgid "Diagnostic" +msgstr "Diagnostika" + +msgid "Bass Boost" +msgstr "Bassa pastiprinājums" + +msgid "Playback Ports" +msgstr "Atskaņošanas porti" + +msgid "Input" +msgstr "Ievads" + +msgid "Record Source" +msgstr "Ierakstīšanas avots" + +msgid "Monitor Source" +msgstr "Monitora avots" + +msgid "Keyboard Beep" +msgstr "Klaviatūras pīkstieni" + +msgid "Simulate Stereo" +msgstr "Simulēt stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Ieskaujošā skaņa" + +msgid "Microphone Gain" +msgstr "Mikrofona pieaugums" + +msgid "Speaker Source" +msgstr "Skaļruņa avots" + +msgid "Microphone Source" +msgstr "Mikrofona avots" + +msgid "Jack" +msgstr "Ligzda" + +msgid "Center / LFE" +msgstr "Centrs / LFE" + +msgid "Stereo Mix" +msgstr "Stereo mikseris" + +msgid "Mono Mix" +msgstr "Mono miskeris" + +msgid "Input Mix" +msgstr "Ieejas mikseris" + +msgid "SPDIF In" +msgstr "SPDIF ieeja" + +msgid "SPDIF Out" +msgstr "SPDIF izeja" + +msgid "Microphone 1" +msgstr "Mikrofons 1" + +msgid "Microphone 2" +msgstr "Mikrofons 2" + +msgid "Digital Out" +msgstr "Digitālā izeja" + +msgid "Digital In" +msgstr "Digitālā ieeja" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modēms" + +msgid "Handset" +msgstr "Klausule" + +msgid "Other" +msgstr "Cits" + +msgid "None" +msgstr "Nekas" + +msgid "On" +msgstr "Ieslēgts" + +msgid "Off" +msgstr "Izslēgts" + +msgid "Mute" +msgstr "Klusums" + +msgid "Fast" +msgstr "Ātrs" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Ļoti zems" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Zems" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Vidējs" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Augsts" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Ļoti augsts" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produkcija" + +msgid "Front Panel Microphone" +msgstr "Priekšējā paneļa mikrofons" + +msgid "Front Panel Line In" +msgstr "Priekšējā paneļa ieejas līnija" + +msgid "Front Panel Headphones" +msgstr "Priekšējā paneļa austiņas" + +msgid "Front Panel Line Out" +msgstr "Priekšējā paneļa līnijas izeja" + +msgid "Green Connector" +msgstr "Zaļais savienotājs" + +msgid "Pink Connector" +msgstr "Rozā savienotājs" + +msgid "Blue Connector" +msgstr "Zilais savienotājs" + +msgid "White Connector" +msgstr "Baltais savienotājs" + +msgid "Black Connector" +msgstr "Melnais savienotājs" + +msgid "Gray Connector" +msgstr "Pelākais savienotājs" + +msgid "Orange Connector" +msgstr "Oranžais savienotājs" + +msgid "Red Connector" +msgstr "Sarkanais savienotājs" + +msgid "Yellow Connector" +msgstr "Dzeltains savienotājs" + +msgid "Green Front Panel Connector" +msgstr "Zaļais priekšējā paneļa savienotājs" + +msgid "Pink Front Panel Connector" +msgstr "Rozā priekšējā paneļa savienotājs" + +msgid "Blue Front Panel Connector" +msgstr "Zilais priekšējā paneļa savienotājs" + +msgid "White Front Panel Connector" +msgstr "Baltais priekšējā paneļa savienotājs" + +msgid "Black Front Panel Connector" +msgstr "Melnais priekšējā paneļa savienotājs" + +msgid "Gray Front Panel Connector" +msgstr "Pelēkais priekšējā paneļa savienotājs" + +msgid "Orange Front Panel Connector" +msgstr "Oranžais priekšējā paneļa savienotājs" + +msgid "Red Front Panel Connector" +msgstr "Sarkanais priekšējā paneļa savienotājs" + +msgid "Yellow Front Panel Connector" +msgstr "Dzeltenais priekšējā paneļa savienotājs" + +msgid "Spread Output" +msgstr "Izplest izvadu" + +msgid "Downmix" +msgstr "Lejupmiksēšana" + +msgid "Virtual Mixer Input" +msgstr "Virtuālā miksera ievads" + +msgid "Virtual Mixer Output" +msgstr "Virtuālā miksera izvads" + +msgid "Virtual Mixer Channels" +msgstr "Virtuālā miksera kanāli" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d funkcija" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s funkcija" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Nav iespējams atvērt audio ierīci atskaņošanai. Šī Atvērtās Skaņas Sistemas " +"versija neatbalsta šo elementu." + +msgid "Playback is not supported by this audio device." +msgstr "Šī audio ierīce neatbalsta atskaņošanu." + +msgid "Audio playback error." +msgstr "Audio atskaņošanas kļūda." + +msgid "Recording is not supported by this audio device." +msgstr "Šī audio ierīce neatablsta ierkastīšanu." + +msgid "Error recording from audio device." +msgstr "Kļūda ierakstot no audio iekārtas." + +msgid "Gain" +msgstr "Pieaugums" + +msgid "Headphone" +msgstr "Austiņas" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Radās kļūda nolasot %d baitus no ierīces \"%s\"." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Saņēmu negaidītu kadra izmēru %u, nevis %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Radās kļūda nolasot %d baitus no ierīces \"%s\"." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Radās kļūda saņemot ierīces \"%s\" iespējas: Iespējams tas nav v4I2 " +"draiveris. Pārbaudiet vai tas ir v4I1 draiveris." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Neizdevās noteikt atribūtus ievadei %d no ierīces %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Neizdevās saņemt skaņotāja %d uzstādījumus no ierīces \"%s\"." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Neizdevās noskaidrot normu ierīcei \"%s\"." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Neizdevās iegūt kontroles atribūtus ierīcei \"%s\"." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Nevar atpazīt ierīci \"%s\"" + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Šī nav ierīce \"%s\"" + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Nevarēja atvērt ierīci \"%s\" lasīšanai vai rakstīšanai." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Ierīce \"%s\" nav ierakstīšanas ierīce." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Ierīce \"%s\" nav izvades ierīce." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Neizdevās uzstādīt normu ierīcei \"%s\"." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Neizdevās saņemt pašreizējo atkaņošanas frekvenci no ierīces \"%s\"." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Neizdevās uzstādīt ierīces \"%s\" pašreizējo atkaļošanas frekvenci uz %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Neizdevās saņemt signāla stiprumu no ierīces \"%s\"." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Neizdevās saņemt kontroles vērtību %d ierīcei \"%s\"." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Neizdevās uzstādīt vērtību %d kontrolei %d no ierīces \"%s\"." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Neizdevās saņemt pašreizējo ievadi no ierīces \"%s\". Iespējams tā ir radio " +"ierīce" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Neizdevās uzstādīt ievadi %d uz ierīces %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Neizdevās saņemt pašreizējo izvadu no ierīces \"%s\". Iespējams tā ir radio " +"ierīce" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Neizdevās uzstādīt izvadu %d uz ierīces %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Nevar ierindod buferus ierīcē \"%s\"." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Neizdevās saņemt video kadrus no ierīces \"%s\"." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Neveiksme pēc %d mēģinājumiem. ierīce %s. sistēmas kļūda: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Nevar nolasīt parametrus no ierīces \"%s\"" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Video ievades ierīce nepieņem jaunos kadra frekvences uzstādījumus." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Nevar izvietot buferus no ierīces \"%s\"" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Ierīces \"%s\" draiveris neatbalsta nevienu zināmo ierakstīšanas metodi." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Izšķirtspējas mainīšana izpildlaikā pašalik netiek atbalstīta." + +msgid "Cannot operate without a clock" +msgstr "Nevar veikt darbības bez pulksteņa" diff --git a/po/mt.gmo b/po/mt.gmo new file mode 100644 index 0000000000000000000000000000000000000000..6e01553d53fee524cbeb6121a6d0a7f95a2f8438 GIT binary patch literal 8330 zcmchbTZ|-Ed4LbZ4zT8utht8UiSc^lOZE25+QvJ!vB$F)kD2j~cgAajMWoYRr@O1W zx~iux+cPT>hy)Lo5k!%YB?M7cvgBM8k+(eHypUPtLP)|zN`wCq5XyKjkw_ywZF+2{x1Mh&ZeS=aTgm*$2 z*FdTNuka$g<%m+-umkUc--ajQPvGtFQ!<2x=a=AZ@Sor!{Bg+^!iszb zo`WBU_rt4j0sbEpd0THP+ID_q*^u_$4Uqz6C{p zuX~G9qS`k?xjzb9@EwpTsk7ztry#0T7opVuP53V8Ly`Np;4i~3l)O^%51_RBGW;d@ zXXW#+KW=YI}m{I5cJ|2I(DeFL6`{|MXgJ-=Gm%Q{@*K8JU~KZPEA zwY-1B(Lz7>Lh0{GDE&PRPr>KP=bwjPdyP_Ggrdj6TMIcq1;wtPhwp`-fydwX%)-v#f6TTs^VlThk?87{+rhM$G+d%IE^{s~-xe+R|hkG`X@x8H^L zalZ#O{1FuWzWbd8kCi+Dhde(8W&SV0Gw_>G?ChNwiO9VMKME5l@4pTog17#fQV+ll z_%M7PiadV_kHcF~%7gGE+=4Nbb=ZS4-~Wb>!T00*_rea8b$$`bdVaCIe+f$ee+b1c zzF$87Pbl^N2i^>S0wsRjjM6o{9m@KhDY;g16H2>}Lb1nA`Md{3Ph%+kO`+8LIFxyR z8cO}IL0R9whho>?ET6v$rQP?+=l>3+zaPR6!vBRLe;XmC-h)u)y9`Cnv+zN%gJ9-g{p8o zTPWf`;#1F19;Q^6_|MbT4SbZcL3xTIzHx5j_HoHO_DfismDy3s+H4f#Y9n@>A<&97W8(tZ!ZO1 ztB)T`kGHCq@x&%3vw9k2gE-H$(cLiaj?@ZmY@$!-wXLMEtC&faC$==1mO35ugUp29Lj7y8 z{&iBF5%1L4rSvFmO(zKH-llHYh8RnF6}L^JlrqTk5O{Le|an#Ji9AI!hS8RT=#;ex`+yxmdEKkEKI9c+XqKgRs-f8|HqKTBH5P56I2r#8(ThsWSUG2bjY*=CdR4BYO$oop z!dyRoxv5v_pq6>2Ol)i4C{AQiO~dr}*D3VJ{*>NL8Q*HiD3jg6E-W$h|*4{!DTC<_*l-Q2)_mck-L_9oZpi{9NAPo9`pxl zHS+q>&8n;y|M4)f6yIb<_riEuZO`*>#E{Imdbbutmhj=QSm0yv0rhaiX4#H3|(P^cIN4h*!A?aF1TTxa!Q7(WXHdienKHlYGL4alY46 z=OcAK&x$#0tgI`Fx2QH`h909AKR6?(jq1EX1d@&ar#GVcn6r_@e%_UhL0u3JRu`;E z_$L9mge=+(_O{8Qs?CWtBc{EHl5MOuccW~ew%9F;Kq*VqFe>fG7(hc*V*9QhMe#JM zV>su8LCmp5Iw|Z1cXPXHkBG@m-ydYI3)wrJ;;@o%R~jI=t0Nwc0mw-1OvZ5q`*G`w z?H^Dti(@?&QL0M%d=&1wwxW<;kfa$wy3v%O$~AM_Q@1$bv63Q{oVsSCP&J6U@puw) z0=luKkg9k2Yd~;w!jWBj- z^h0BJizwVZnwXBs#wN^6i>3JxjiY|fuIOzM1Zc_|n_B%)R`w@@6LZGiID3?{Zqfh%=EU1n9Xe6@ zFjHsWE*dvd5+3NiD}mj?$xX+d`1X&=>rR!cBtfC1iR3Ps%hj4n*rp4nRAozJtlQ(@ zUDut{SkTMN-pg_@ckgTEYtdhL&E%z_^PjH=eVWi2gdQi>%R}}hW_0|3G^SYXG(|pK zcqrQ>YfGL+>(HxnndN5Eg))c5;tqo-%dfs-T4fSk2Acya=%?7stLnuNlO*o5yOT=U zy_Y3rzL7b1WD$eNkGHp5OcBF!Q@r}hVdglfCTR{cN$tkY0?x`KHq9Zkp7WcTmlP|O z7Y(rI1cecBqhOTT&c0S+`-e+m2+o9hbnN7boZ+H{5xLCX3#2~7fU}>ovxZF)4rHXc zJZ5$8g}oQ-XheV<0$o<9QyE>yj?kOUS`zMt!Pf@el3k+^Y>KICTzQh@m&{OhPmTm6 zTCLg*B*(e>N*S1Nbj*nvxlCuxt4`j9&5nvxCv*l}8koxf(LjW1r#tn?1UX`yBs;Qm zi)3P^KF#>C|6(Mkdp(=wZJL?5mwu3wIMIN<530q)|9NN*=PmNOK&# zNJ{pv#lDb@Hr!}IHC)37kQ}RO>;U^#i2Y3TO3TBoQ8}+F-b-|%RV&8R^X1-H^k6Wq{McF(8YGa4Pm_r$#l9;iCN;Bj*Bu5K> z5G0(`>~zW&yE=Q*3phxXYpw69F} G)c*r~c1^7S literal 0 HcmV?d00001 diff --git a/po/mt.po b/po/mt.po new file mode 100644 index 0000000..bcac65a --- /dev/null +++ b/po/mt.po @@ -0,0 +1,754 @@ +# Maltese translation for gst-plugins-good. +# This file is distributed under the same license as the gst-plugins-good package. +# NAME OF AUTHOR , 2008. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good-0.10.10.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2008-10-26 19:09+0100\n" +"Last-Translator: Michel Bugeja \n" +"Language-Team: Maltese \n" +"Language: mt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Maltese\n" +"X-Poedit-Country: MALTA\n" + +msgid "Could not establish connection to sound server" +msgstr "Kuntatt mas-sound server ma ġiex stabbilit" + +msgid "Failed to query sound server capabilities" +msgstr "Mhux possibli t-tfittxija għall-kapaċita tas-sound server" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +msgid "Internal data stream error." +msgstr "Problema interna fid-data stream" + +msgid "Failed to decode JPEG image" +msgstr "Problem fid-decoding tal-istampa JPEG" + +msgid "Could not connect to server" +msgstr "Mhux possibli naqbad mas-server" + +#, fuzzy +msgid "Server does not support seeking." +msgstr "Appart '%s' ma jagħmilx video capture" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "Mhux possibli naqbad mas-server" + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "Kuntatt mas-sound server ma ġiex stabbilit" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Input audio ma nstabx jew mhux validu. AVI stream jista jkun korrott." + +msgid "This file contains no playable streams." +msgstr "Il-fajl ma fiħ l-ebda stream li tista tindaqq." + +msgid "This file is invalid and cannot be played." +msgstr "Il-fajl mhux validu u ma jistax jindaqq" + +msgid "This file is corrupt and cannot be played." +msgstr "Il-fajl huwa korrott u ma jistax jinfetaħ." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Il-fajl mhux komplut u ma jistax jindaqq," + +msgid "The video in this file might not play correctly." +msgstr "Jista jkun illi l-vidjo ġo dan il-fajl ma jidhirx sewwa." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Il-fajl fiħ aktar streams milli suppost. Ser indoqq l-ewwel %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +msgid "Internal data flow error." +msgstr "Problema interna ta' data flow" + +msgid "Volume" +msgstr "Volum" + +msgid "Bass" +msgstr "Bass" + +msgid "Treble" +msgstr "Treble" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Speaker" + +msgid "Line-in" +msgstr "Line-in" + +msgid "Microphone" +msgstr "Mikrofonu" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mixer" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Record" + +msgid "In-gain" +msgstr "In-gain" + +msgid "Out-gain" +msgstr "Out-gain" + +msgid "Line-1" +msgstr "Line-1" + +msgid "Line-2" +msgstr "Line-2" + +msgid "Line-3" +msgstr "Line-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +msgid "Phone-in" +msgstr "Phone-in" + +msgid "Phone-out" +msgstr "Phone-out" + +msgid "Video" +msgstr "Vidjo" + +msgid "Radio" +msgstr "Radju" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "Audio device ma jistax jintuża. Qed jintuża minn programm ieħor." + +#, fuzzy +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "Audio device ma jistax jintuża. M'għandex aċċess għalih." + +msgid "Could not open audio device for playback." +msgstr "Audio device ma jistax jintuża." + +#, fuzzy +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Audio device ma jistax jintuża biex tirrekordja. M'għandex aċċess għalih." + +msgid "Could not open audio device for recording." +msgstr "Audio device ma jistax jintuża biex tirrekordja." + +msgid "Could not open audio device for mixer control handling." +msgstr "Ma nistax niftaħ apparat tal-awdjo għal mixer control handling." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +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." + +#, fuzzy +msgid "Master" +msgstr "Fast" + +msgid "Front" +msgstr "Quddiem" + +msgid "Rear" +msgstr "Wara" + +msgid "Headphones" +msgstr "Headphones" + +#, fuzzy +msgid "Center" +msgstr "Center / LFE" + +msgid "LFE" +msgstr "" + +#, fuzzy +msgid "Surround" +msgstr "Surround sound" + +msgid "Side" +msgstr "Ġenb" + +#, fuzzy +msgid "Built-in Speaker" +msgstr "Speaker" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "" + +msgid "3D Depth" +msgstr "" + +msgid "3D Center" +msgstr "" + +msgid "3D Enhance" +msgstr "" + +#, fuzzy +msgid "Telephone" +msgstr "Headphones" + +msgid "Line Out" +msgstr "" + +#, fuzzy +msgid "Line In" +msgstr "Line-in" + +msgid "Internal CD" +msgstr "" + +msgid "Video In" +msgstr "" + +msgid "AUX 1 In" +msgstr "" + +msgid "AUX 2 In" +msgstr "" + +msgid "AUX In" +msgstr "" + +msgid "Record Gain" +msgstr "" + +msgid "Output Gain" +msgstr "" + +#, fuzzy +msgid "Microphone Boost" +msgstr "Mikrofonu" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "Input" + +msgid "Record Source" +msgstr "" + +msgid "Monitor Source" +msgstr "" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "Stereo" + +#, fuzzy +msgid "Surround Sound" +msgstr "Surround sound" + +#, fuzzy +msgid "Microphone Gain" +msgstr "Mikrofonu" + +msgid "Speaker Source" +msgstr "" + +#, fuzzy +msgid "Microphone Source" +msgstr "Mikrofonu" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "Center / LFE" + +#, fuzzy +msgid "Stereo Mix" +msgstr "Stereo" + +msgid "Mono Mix" +msgstr "" + +#, fuzzy +msgid "Input Mix" +msgstr "Input mix" + +msgid "SPDIF In" +msgstr "" + +msgid "SPDIF Out" +msgstr "" + +#, fuzzy +msgid "Microphone 1" +msgstr "Mikrofonu" + +#, fuzzy +msgid "Microphone 2" +msgstr "Mikrofonu" + +msgid "Digital Out" +msgstr "" + +msgid "Digital In" +msgstr "" + +msgid "HDMI" +msgstr "" + +msgid "Modem" +msgstr "" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "" + +msgid "None" +msgstr "" + +msgid "On" +msgstr "On" + +msgid "Off" +msgstr "Off" + +msgid "Mute" +msgstr "" + +msgid "Fast" +msgstr "Fast" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Low" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Medium" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "High" + +#. TRANSLATORS: "Very High" is a quality setting here +#, fuzzy +msgid "Very High" +msgstr "Very high" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Production" + +#, fuzzy +msgid "Front Panel Microphone" +msgstr "Mikrofonu tal-panella ta' quddiem" + +#, fuzzy +msgid "Front Panel Line In" +msgstr "Front panel line-in" + +#, fuzzy +msgid "Front Panel Headphones" +msgstr "Front panel headphones" + +#, fuzzy +msgid "Front Panel Line Out" +msgstr "Front panel line-in" + +#, fuzzy +msgid "Green Connector" +msgstr "Connector aħdar" + +#, fuzzy +msgid "Pink Connector" +msgstr "Connector roża" + +#, fuzzy +msgid "Blue Connector" +msgstr "Connector Blu" + +#, fuzzy +msgid "White Connector" +msgstr "Connector abjad" + +#, fuzzy +msgid "Black Connector" +msgstr "Connector iswed" + +#, fuzzy +msgid "Gray Connector" +msgstr "Connector Griż" + +#, fuzzy +msgid "Orange Connector" +msgstr "Connector oranġjo" + +#, fuzzy +msgid "Red Connector" +msgstr "Connector aħmar" + +#, fuzzy +msgid "Yellow Connector" +msgstr "Connector isfar" + +#, fuzzy +msgid "Green Front Panel Connector" +msgstr "Front panel connector aħdar" + +#, fuzzy +msgid "Pink Front Panel Connector" +msgstr "Front panel connector roża" + +#, fuzzy +msgid "Blue Front Panel Connector" +msgstr "Front panel connector blu" + +#, fuzzy +msgid "White Front Panel Connector" +msgstr "Front panel connector abjad" + +#, fuzzy +msgid "Black Front Panel Connector" +msgstr "Front panel connector iswed" + +#, fuzzy +msgid "Gray Front Panel Connector" +msgstr "Front panel connector Griż" + +#, fuzzy +msgid "Orange Front Panel Connector" +msgstr "Front Panel connector oranġjo" + +#, fuzzy +msgid "Red Front Panel Connector" +msgstr "Front panel connector aħmar" + +#, fuzzy +msgid "Yellow Front Panel Connector" +msgstr "Front panel connector isfar" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +#, fuzzy +msgid "Virtual Mixer Input" +msgstr "Virtual mixer input" + +#, fuzzy +msgid "Virtual Mixer Output" +msgstr "Virtual mixer output" + +#, fuzzy +msgid "Virtual Mixer Channels" +msgstr "Virtual mixer input" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Ma nistax niftaħ apparat tal-awdjo biex indoqq. Dil il-verżjoni ta' Open " +"Sound System mhux issapportjatha minn dan l-element." + +msgid "Playback is not supported by this audio device." +msgstr "Id-daqq mhux issappartjat minn dan l-apparat tal-awdjo." + +msgid "Audio playback error." +msgstr "Żball fiid-daqq tal-awdjo." + +msgid "Recording is not supported by this audio device." +msgstr "Irrekordjar mhux issapportjat minn dan l-apparat tal-awdjo." + +msgid "Error recording from audio device." +msgstr "Żball fl-irrekordjar mill-apparat tal-awdjo." + +msgid "Gain" +msgstr "Gain" + +msgid "Headphone" +msgstr "" + +#, fuzzy, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Problema fil-qar()i %d bytes fid-device '%s'." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Irċivejt frame size ta' %u minflok kif kien mistenni ta' %u." + +#, fuzzy, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Problema fil-qar()i %d bytes fid-device '%s'." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Problema biex nġib il-kapaċitajiet tal-apparat '%s': Mhux v4l2 driver. " +"Iċċekkja jekk hux v4l1 driver. " + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Mhux possibli tfittxja għal attributi ta' input %d ġol-apparat %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Problema biex inġib settings tat-tuner %d fuq l-appart '%s'" + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Ma stajx nfittex norm fuq apparat '%s'." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "L-attributi ta' kontroll ta' device '%s' ma nqrawx." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Device '%s' mhux identifikat." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Dan mhux device %s." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Device '%s' ma nistax niftaħu biex naqra jew nikteb." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Device '%s' mhux capture device." + +#, fuzzy, c-format +msgid "Device '%s' is not a output device." +msgstr "Device '%s' mhux capture device." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Ma stajtx nissetja norm fuq apparat '%s'." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Problema biex inġib il-frekwenza li jitrażmetti fuqha apparat '%s'." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Problema biex nissettja l-frekwenza li jitrażmetti fuqha apparat '%s' għal " +"%lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Problema biex inġib signal strength fuq l-apparat '%s'." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Problema biex inġib valur ta' control %d fuq l-apparat '%s'." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Problema biex nissetja valur %d lil control %d fuq l-apparat '%s'." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Problema biex inġib current input fuq apparat '%s'. Jista jkun li huwa " +"apparat tar-radju." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Problema biex nissettja input %d fuq apparat %s." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Problema biex inġib current input fuq apparat '%s'. Jista jkun li huwa " +"apparat tar-radju." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Problema biex nissettja input %d fuq apparat %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Could not enqueue buffers in device '%s'." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Problema biex inġib video frames mill-apparat '%s'." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Problema wara li pruvajt %d drabi. apparat %s. żball fis-sistema: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Mhux possibli nġib parametri tal-apparat '%s'" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Apparat li jaqra video input ma aċċettax is-settings ġodda tal-frame rate." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Ma nistax nqabbel buffers mill-apparat '%s'." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Id-driver tal-apparat '%s' ma jissapportja l-ebda capture method mifhum." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Ma tistax tibdel ir-resolution waqt runtime." + +msgid "Cannot operate without a clock" +msgstr "Ma nistax nħaddem mingħajr arloġġ" + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Problem biex inwaqqaf streaming capture mill-apparat '%s'." + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Problem biex nibda streaming capture mill-apparat '%s'." + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "Ma nistax nirċievi biżżejjed buffers mill-apparat '%s'." + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "Ma nistax nirċievi buffers mill-apparat '%s'." + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "Appart '%s' ma jistax jagħmel capture f'dan il-format" + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "Appart '%s' ma jistax jagħmel capture bi %dx%d" + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "Ma nstab l-ebda buffer free fl-indiċi %d tal-pool." + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "insufficient memory to enqueue a user pointer buffer. device %s." + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "Problema biex inġib video frames mill-apparat '%s'. Il-memorja allokata " +#~ "mhijiex biżżejjed." + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Failed to enumerate possible video formats device '%s' can work with" + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "L-attributi ta' kontroll ta' device '%s' ma nqrawx." diff --git a/po/nb.gmo b/po/nb.gmo new file mode 100644 index 0000000000000000000000000000000000000000..368885efaadeb3cf549118498e5d2d829668da9b GIT binary patch literal 4456 zcmb7_O^h5z6@Uv8aI%2&LqdKGq>Q~dw(0TAY#f$}?Ra-*?Om_OyV)IEkq9C^)3r0b z)7w4ipRp$>LWn~WDFO*8;=(Pm5Q1<6SptESmEd40iZ}oVlpBIWLdXRf2^7B9Q$0Iz zf)K5F{k^JwRrTuCt2b}nee27Lr-^(P`Q=BIdImoAF$IbJgF z^HA)+2W9^6Lz(9lDE7aGxS)OuWj}9N{=xE1D0Y8_x4^e;|GSnqpse#Al=x545Z(vH zzk`-Xpv+T-;?FD;e@@!=GL-o*K#BJ{l<^mB|5t7M>rnhPkR??J`Kc?s#Qxh*=6?~& ze!c@Af-gf2e+KV`zlUP?78JkUg<}6tDD#VRGT-e`*0}>d03U#2H)H#2Q0(ha>>IYd z0mbeq_`*k&YD3AVw+N2R_irfU_Izs8z7tCOLEAoH+YS`}9)&XBDJXs~LfOYTDDiq4 z9)N8q`+XjY{STq!?N8wmcpZKT{sSI{2lgs84IA({OyEKIBe);F4sl)m9TFP#FDU-+ zxnsn;EcZc8|1=c;&OnLBifumuW!xnw^F0l5K?U~vv-bNpp~U$`+kOQ~Twa9|ho4*i z%JMf*=6xMX{`?V&pMSF7{{m(FJGTFZdI$q`#6+wC!xe=35xx?Z9i$-El7H*hmkYLG;$2tK;&6N#6NlD zyyQ8A96>&fkPhSLv9X39=yHydlgr3Gh=a&;3OR{<1v!n#^JS!jNR7lLwSt^O&Lb7% zEb<`o1S0&W9s8JR`qk)z1nh}?zZc@#zNfSixS zZV4%#`%u=AFCr5E!$|SSxvbj8BK!g(v98%Zft-QdSGk+=$XUz7F{=A>O{o)b!Rq@h zZ-$()y&PI)HA{1?T69%) z(PeFMtu{zsnM7H zv>Roqc6B?5+C61GTZpp2(=tmt3PaOQbsFi!!~1feDXIEyJhh+XQ6hY9Kh0ue{l&=d_^BJn2^Ojxn$?}kSgVe;8Fj|> z1LH{uJ$B$3eQs^>toFCvj^SI9sxxsErfR9)SXN88oERGHpx=!`v#TX)$?tU4vLsoE z59GvH_uSOgNy@&rwTa^>E~)c=XvEK);-n~en4>zv%m_YK(Ph=Z7c!w?JU`o34Zj^n zBNuj6U76_DRT@`h1e;<&6#8jID@%>K5b2BS=ZSDyLT4MRo11DiRI6#10c#5l5vQuw zWRGOJRY+R37DryzPRTm8?vgBO-MBF?IefKY+HxK?e;uc&jM?ZaEo-y^|VBeVO%R!T(%9OU?R1V5l9kQZ45(hbJGN76pm(>{P2_T zkX*2d)GMiGY+8X)mrOj=`C;Xn#P$*kM5DJH%B3jCwvB9ci)-jCdk&Tf+o|bJk~;k$ z>-b^fbfU=9fO&0!bmkbm~-wny!{BRi|8asuf)>*DB?sWgZNjb@E?4*tIJ=m9kTPL{}@d z<1zZEKa^utub;FHaH_<10+qrUj?8GU?gq@6Bcba5pO<#!O z%ckQqW8ZwYV{tc5l~Q?XfqTP2I?Z99 zt)=EldW>@7hmYxY*Nw@HlNXz3oY`GF@qE+7&SJ<#WSN?tZTabxdhN&4$!ovR?m&+; zDdLhM^(La_)ykJttMAtE!8xsw=!%oMfy1R32m{LKQnESgz z6#QP#6jj})7#nTEE|w!lO1m~v+~qUZE5t_kf{3AHeD3B-#v-H1dJ##eQ$Nt@mI(={ zn)qm>xXUzr7ej*Z|C$CvZ#41bygOI>tk0*B_fm!3LDDB9^J_QZ!G~Bz{eJ59-sk7Y zYBCggWe-du9!DLW^kRQ-^V~_Wb5%1NHGL53K8+#-ixWZBy&~?L{XEo3CiURMn{D7=kcaz@x3jEI1yuwrBu}mo{n-sbUoy=Gw zNz|ye?^b!eX*f|oca}=Ob8S1X@mnm8!&G%N+#M--nWrPK^Dr;;g{eDWy@BxtQiLes zo@ast_TorKR?Z8bMgYdcrf99c<8AJ==S zqAZg8Tr0k;@WKrmh4<{$rYXrt=rLb1mi8jxIv7 zb8S@gi?1g1IIOHQ3_O2)?s@H(klTCt-^;&5r;aOJQM*EZ6DMzL-A_oalt0npwp%qI O>XUy0a%lO#fcg)thVp#? literal 0 HcmV?d00001 diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000..ebda484 --- /dev/null +++ b/po/nb.po @@ -0,0 +1,651 @@ +# Norwegian bokmaal translation of gst-utils. +# This file is put in the public domain. +# Kjartan Maraas , 2004-2010. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.25.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-10-24 21:53+0200\n" +"Last-Translator: Kjartan Maraas \n" +"Language-Team: Norwegian Bokmaal \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "Kunne ikke etablere tilkobling til lydtjener" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "«%s» av «%s»" + +msgid "Internal data stream error." +msgstr "Intern feil i datastrøm." + +msgid "Failed to decode JPEG image" +msgstr "Klarte ikke å dekode JPEG-bilde" + +msgid "Could not connect to server" +msgstr "Kunne ikke koble til tjener." + +msgid "Server does not support seeking." +msgstr "Tjener støtter ikke søking." + +msgid "Could not resolve server name." +msgstr "Kunne ikke slå opp navn på tjener." + +msgid "Could not establish connection to server." +msgstr "Kunne ikke etablere tilkobling til tjener." + +msgid "Secure connection setup failed." +msgstr "Oppsett av sikker tilkobling feilet." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "Tjener sendte ugyldige data." + +msgid "No URL set." +msgstr "Ingen URL satt." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +msgid "Internal data flow error." +msgstr "" + +msgid "Volume" +msgstr "Volum" + +msgid "Bass" +msgstr "Bass" + +msgid "Treble" +msgstr "Diskant" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Høyttaler" + +msgid "Line-in" +msgstr "Linje inn" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mikser" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Opptak" + +msgid "In-gain" +msgstr "" + +msgid "Out-gain" +msgstr "" + +msgid "Line-1" +msgstr "Linje 1" + +msgid "Line-2" +msgstr "Linje 2" + +msgid "Line-3" +msgstr "Linje 3" + +msgid "Digital-1" +msgstr "Digital 1" + +msgid "Digital-2" +msgstr "Digital 2" + +msgid "Digital-3" +msgstr "Digital 3" + +msgid "Phone-in" +msgstr "Telefon inn" + +msgid "Phone-out" +msgstr "Telefon ut" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +msgid "Could not open audio device for playback." +msgstr "Kunne ikke åpne lydenhet for avspilling." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +msgid "Could not open audio device for recording." +msgstr "Kunne ikke åpne lydenhet for opptak." + +#, fuzzy +msgid "Could not open audio device for mixer control handling." +msgstr "Kunne ikke åpne filen «%s» for lesing." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" + +msgid "Master" +msgstr "Hovedvolum" + +msgid "Front" +msgstr "Front" + +msgid "Rear" +msgstr "Bak" + +msgid "Headphones" +msgstr "Hodetelefoner" + +msgid "Center" +msgstr "Senter" + +msgid "LFE" +msgstr "" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Side" + +msgid "Built-in Speaker" +msgstr "Innebygget høyttaler" + +msgid "AUX 1 Out" +msgstr "AUX 1 ut" + +msgid "AUX 2 Out" +msgstr "AUX 2 ut" + +msgid "AUX Out" +msgstr "AUX ut" + +msgid "3D Depth" +msgstr "3D dybde" + +msgid "3D Center" +msgstr "3D senter" + +msgid "3D Enhance" +msgstr "" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Linje ut" + +msgid "Line In" +msgstr "Linje inn" + +msgid "Internal CD" +msgstr "Intern CD" + +msgid "Video In" +msgstr "Video inn" + +msgid "AUX 1 In" +msgstr "AUX 1 inn" + +msgid "AUX 2 In" +msgstr "AUX 2 inn" + +msgid "AUX In" +msgstr "AUX inn" + +msgid "Record Gain" +msgstr "" + +msgid "Output Gain" +msgstr "" + +msgid "Microphone Boost" +msgstr "" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "" + +msgid "Record Source" +msgstr "" + +msgid "Monitor Source" +msgstr "" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "" + +msgid "Microphone Gain" +msgstr "" + +msgid "Speaker Source" +msgstr "" + +msgid "Microphone Source" +msgstr "" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "" + +msgid "Stereo Mix" +msgstr "" + +msgid "Mono Mix" +msgstr "" + +msgid "Input Mix" +msgstr "" + +msgid "SPDIF In" +msgstr "" + +msgid "SPDIF Out" +msgstr "" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Digital ut" + +msgid "Digital In" +msgstr "Digital inn" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Håndsett" + +msgid "Other" +msgstr "Annet" + +msgid "None" +msgstr "Ingen" + +msgid "On" +msgstr "På" + +msgid "Off" +msgstr "Av" + +msgid "Mute" +msgstr "Demp" + +msgid "Fast" +msgstr "Rask" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Meget lav" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Lav" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Middels" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Høy" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Meget høy" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produksjon" + +msgid "Front Panel Microphone" +msgstr "" + +msgid "Front Panel Line In" +msgstr "" + +msgid "Front Panel Headphones" +msgstr "" + +msgid "Front Panel Line Out" +msgstr "" + +msgid "Green Connector" +msgstr "" + +msgid "Pink Connector" +msgstr "" + +msgid "Blue Connector" +msgstr "" + +msgid "White Connector" +msgstr "" + +msgid "Black Connector" +msgstr "" + +msgid "Gray Connector" +msgstr "" + +msgid "Orange Connector" +msgstr "" + +msgid "Red Connector" +msgstr "" + +msgid "Yellow Connector" +msgstr "" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +msgid "Virtual Mixer Input" +msgstr "" + +msgid "Virtual Mixer Output" +msgstr "" + +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" + +msgid "Playback is not supported by this audio device." +msgstr "" + +msgid "Audio playback error." +msgstr "" + +msgid "Recording is not supported by this audio device." +msgstr "" + +msgid "Error recording from audio device." +msgstr "" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "Hodetelefon" + +#, fuzzy, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Kunne ikke lukke VFS-fil «%s»." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, fuzzy, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Kunne ikke lukke VFS-fil «%s»." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Kunne ikke lukke VFS-fil «%s»." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Kunne ikke lukke VFS-fil «%s»." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Kan ikke identifisere enhet «%s»." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Dette er ikke en enhet «%s»." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Kunne ikke åpne enhet «%s» for lesing og skriving." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Enhet «%s» kan ikke fange data." + +#, fuzzy, c-format +msgid "Device '%s' is not a output device." +msgstr "Enhet «%s» kan ikke fange data." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "" + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Kunne ikke lukke VFS-fil «%s»." + +#, fuzzy, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Kunne ikke lukke VFS-fil «%s»." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "" + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, fuzzy, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Kunne ikke lukke VFS-fil «%s»." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, fuzzy, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Kunne ikke lukke VFS-fil «%s»." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "Kan ikke operere uten en klokke" + +#~ msgid "Describes the selected input element." +#~ msgstr "Beskriver valgt inndataelement." diff --git a/po/nl.gmo b/po/nl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..20ca783b7073a345d1a6bbdde07ebbdf27b5a3b9 GIT binary patch literal 15064 zcmc(l3zQ^PdB+O`g#{EA6(J@T=&;~!_s+~NvJ5P;JF|~rcbIW!cUkdS-Cf;NGu>5f zb@dFhYD5KJC>j+-vQb166^!BwlHennqsQmboE&3_NenUOX-r~rViKb#zyH0rx@&r8 zWmnHh`poTL-Ktyn@!ju!_q$)uU#valc8||zNKYm`{?VRy(n+3o=9#+dd1s&Pd5?wX zz%!r^^=Jb;9bN%XgX3@w+zYRT*Sq_7LzTPN@>ia&t6rQ%$ zauk-yKNqfpx5A6z$Kd7gPvOhp+H-CBH^YPEKM7w1&wV^&hqu6|!#{_I;AsqQ6AYmG zbvt|-{5X6ndf!)L(KlRR$()}Z9@HmLVM57qzwgzEQ(^X>Sb1+O9hVyOF{gc{Go za0s5tBwYsALo~Lo zrTU)$&w>}gN5M;=+S>rN9yUYi-B!m5$30Nx_Cb}q0qXs#d){!2q59i}(%YLH-vFiW zcS4Q(UWf{N4?>OOYmR>e)y_ju@_HDmy?=q~|9?S^^QTbrzUG&iYq$-j@K2!1?Lk@9 zzZt0YwI8be>mjdtb5QNx0#*O5Q1!kQ>b<+%^Y^;v_dv<{V^ID26x2L^)#d*dZY2L7 zP~*S&DYpI*sQz3ICD*H<+8KwMhiNzrpXc(oLCxP0sD9lK)$V5?f8Lk)^5Ne@mYlbS zjOzEH#^!F6!Wh3GCE zg-?eqSb}%B{1>45|F2N(oxx&OeQTlGdoolzLoUA_UO|2{)Ow1c*3&Ie>**a(^?V3w ze4l{Q>(4{Y=fhC*`9t{mlPL34JKk?T&C2<^P~-b&sB!-ksz0X>*>dN?edI5M>R$%+ z{G~4cYL|Z#R6p*7lJC1ACdK;zRK1^rdhcsc{rVQveEprvpLVg$pAR+8E8xj+22#YE zg+5${kA`}W2ya_)4Qfwyt4%9qPFsXXpg<4+^K_8yI-u80@(gp8&D0%%VJOjQOs=sf6lE+<+ z_d4DWAH)66!rS1Np!$1=&Wg7})%$5EJN`W=Jv$HOl6>~TL-0m84gU~IZ!To;*TCn% zE$|4u3VsuAg=<-qH08~}%i&Al9{6!c5i@8#-^k#p(t8fP8om~)Utff$z#l`6SDnMe zc&9_n<2uL|ea2?e1 zXTY`aO897a9h968IKB`*jr;;sJ8yzohxb9f|7G|%_;vUw_#LSBz6&+3e}t;{-yMJK zcru%x%AF2X?i{H4E`Tck6vvC9^uGi({>vT5q1v5>TF)q{vY53+`^(-4_^u=;Rhgp-oH6+U=h+aFNE3;k3iE7RR2Hc z_*JNO{urwLKZASV_uv!Z2$T8*xEm_}e5ihRq5Am}$kyt;9!g&KLdom*AZFkDEz%-M zGI=3MAGN>MTv5(ZV;dq#h94ryM!tpg9#Z~^^9y(_Npkok={HH51C3uYsgNZ5SCT$K z(&u9q-W+6U8{71|@U`y#KG-BJkz}XdPtr$Y*XPwFhUDF=44+*jpR}8FF{wd%F{$`@ zGMQ(Sm@=2&eaCG%F2_Go?9k?tm4N76jrMtTG3R?=mpyGZAeUO{>r>C+^Av^IxH(iQ35 zJ4pvgDQSiz9Xpex&ud6`kUpb~`@9?8NqQAY`qUz6{SST~a5rvtd@2k{FDISi?v2A5 zX#?qe(tAn2L3$HOpG!!;YOd^8P`J)7@8e=4>9D);I@lq-+2wQG#Kkt3xgFj}8YM~h zF>z*3`zU-q=|a*yq_aqmCtXU?=NY7FbA{jQI1BG5z0c)Og*!>FcljgmvF`dKaG7*9 z>122B1CB3)Zzo+r`nbFI>u@jW7E0+4r)n?KO zYvxWhiQ~|;>38Gs#x~bst+`zGwjDU+kNA_ZyO{1~=4v#*HR|WLTp5$?)}q93H-qI$ zP<5Rsd)tFf$9(zQlcbY*+nahgZd*=Lm*1HtapuniaoAk(tQ!tyk5RH4HM3F_`?KvZ zSU^DI6W(|b$4TZ#HAEKGm;G9}7*#_f$#VWMX@_Z$h5k~M%_ZH;4?NWU!^rMci=9a_E?{wSkBt@3AlXROk^S}w)&k{Ei zg=b;>qHf4oE8TiMOglaUS=rlOEnz1MD$S@f=NBfgS7ouiW0p+1aqZ|XH0XCbNP||0 zesz4tR_H;YtF55j>t;PoTE{4cV3Cf|2v<)XHEcyUN&}heG->+Cv(`kQ#a^G#d;b18 zq>fT|G#5$TDD|{jo;8DEtKPt+s~Ey1WK|#jk?iHC6v~5 zwd!a&KuhM3LeOqEqiP^EI+1Gs&xhVT+;9ifKh1BXRW3%$KZ-o#jU! zNg7s@w02yx-Y@!#^`W51zO*n619gCzsQF82lnr#oEN=$t>}AZ7D0^-;jX8EJ9a|B! zGfZr6?5h^SthBK#xqK#~pb=vTqpCL%HKHtN%Bbd-vZL<0G}5~o?Okp1CX%I?W#sKJ zHl9_h?yDz3C2BI3uw%wp81tAvi52W<0t0_>b92UCT57sj$P7b zha2;UI{7O-L0H?uU@~5=bk*a*j<{CP-WtkS3;kUbuD$Of8XAh5@p z!hw4HsbHD4-4k9KX#cZJ+xP6-%QqNJP?`-baw8w(Oy1*WZ1(C|6a`>vLb2DCs~erpppdVNDK}af-1* zXh+v%rA(pY6m+^Q+u(Fy5l1LNWiV%}E#jR4&Y5wp?6-5qc4I5sb4eVs(h5G>-Y5=b zw~o3e16I5_6;;#3RN(CjqS)Joi`4fuZFl@mbU4)ZJ=8^_Y}o7A4duGN8) z*}JXV^3$&&TH%L7lekb+kK8B-Zy=rSBAjlS$%i(BmN370ELkk|K}m2lnk{cg64GnspJyRvLCSnH^z+ zzwO|pu|5cGDQY%lXxTW@Zri@rcjlaAmjZ2kxVB~EEVP)wi~~`~CX)C;Qxnrl*sHTN zh&%Gm{dSsUNi}J*LExF9XT~pEiaPk=A+9Puj#dx8O=>FJHEZS&ySs1y?2I4Yn1!)% zgWAn5=K?dD6YG|govyL*K0@7Q!S4%ExfZh-IKg0Pu483-)AhPH9edM^tWi8Kxf`pm zfoVCR9vWqJoC|GnW|C*dr#w<=)SJ=D=UC+~67+8-ii^iLlU==qnfxR;gS0zdFYDZ= zzNm6{e5EfilP0yUJrM8H&gwD#lrOmt4z|1YR<3L|rcJ`qneY2t5>cg3xnV8(^ zPsX0T&{~`gb;2&5#L(()+pilprp$A5;;toFT%8TwkkS2cfgbh>bmU`HuzE5g+{IG! z)#^5NG@WG;hl!UTY#sCA&bH;C={PPMm6tWIm?bxh2cuQtj62LQXF#ez|Dd~%~vUxB?*g`uH=RM>A1OU-qqySqqLLZLKa>{ zADjg-o`2Pb2UzOrmCow@Rwx?9)uh#KavDCq($1iBq&P;!xd&d5Els8&1N9Ed9Wr~4 zxsvrhsO{Q*OX*D3`5Uf=8XJhTDyUWo1!3!!+;(ar8fcE^cRZFuf9~C9U6PvFYIotUYdnIk3N(pYb8c6i#p~v zI$6n@)lR9ABsG7yJThD!-BKQ1voDnOE=_eBQLVJS+vt?`Cu9CxmbJ$=Zme`0huJNH zGG{D~ZAseLxMpU0e`%amqLX%Mf+aQPj}DKFmWD@5qa*(C@Yu-k`e8m4EbZgat{(Ku zjg*ErmqssFx#7#!506rAFB@xVzxELpXp)X$Fj&wm8h=mPjppnARrPW$EH9YMHH{Y5 zpo}tI&5LoP%PFI@A75b1pXg@QIsYn-V(bDa?KO*OG~cPtrBOXo*ZVJw`Ehg2)a2BT zzJx}~!)p*Qdk}qDZZoKi9cd%F9K~1q)wv)=1GXO6zq7QZUrv1{z*O3Sa_a~@=5MJ) z*_uP8T_NWQJD9!60=>Z@8!3;hnQ3;@pjq09*WIBLObOY}*3m0jG`idx`xkEYN3LAs zVwiOk!wkul>?Pq$b7rn3Y_cwhS*p_M6rW_%M5z{`yP>WSLq)NtFy=t1ZMx>mqf<;X zOc&VNIe@jTamtV8b75H5$yyLA?=nnh7Fu5l!u6CbU_iHXG5* zZ;j@++>KH_LP6Xy(@3Vn8$iZ2Y_7<^%p{k@WOml&}+)WP<O#Nfg;0PU0HwjKsXqOcu&Gb2Z*@aAD8=(LDD${v7qys6SF^Dxwp4AT-1d zHEhj|a4DKU95slnuutcWHq=C6l3K)QV|*F5M6*Sjo|!^<1T;$+8kQ=S3|5TH4&&H0 z(yzfvS8bVcc3wM$;@m6-LE9^vwnL=01r}-pK}n#zl6QJ>^;uX%HCaP=$WLeYwP6Vh}RUI8J)x@!#NPmoeaEc(r zjUPbYYD9{9QB#fnczV-cHz)jtzb#j4vn4ZQ6|CxlUy0_8+H!_NwfnJD4pJxH#{aii z`~!%wk})_Y9K}cAt(Ke^4u?j*xeTx_R#A?Blu0{QjQhl2_<1|k)9bz!Dk^sq6^woU z%sw~2n0KwWYU6+tpIZ}$jS;|j=K?Twq6tP)42@Vu-rliFVaFE}_BK}qkz5;q4P8u? z-Hlzr#$36U+3#iY2rT#W5G7rQzFEi@Z5UxA7$tMLVl8rc}H+zQvg99t(d!^XlwYs&FjZFY`o#NTaatCg^AMDzT>$!jL& zJ6N$(xm=3}I`8(5@*~%0!jdk=OJLuq)$s|UKQ!}FKjwS9k~HC8JU#re1+30dnsbzN zav3ZIgs*r(n}udl^M8Evw{p(aB5@&B?qCf=oDt35)Lu++!<=cOO%rEby{%-h?9q); z!3uX^Wh43Ua@{#o2hZ-k-l!TUrrH( zuFmPi)k4UAmm`y00S3lNjQThM+88#cQtLSeXfB;HezAV}%qogam_zb>H=^su2sMW; z-175xj*dx6t4Ff)>aB%QB)eoH*%A@45P5We@L?MbXN3L3qlD}oz$e=l*Z}u@ad9cY zUA!^4xTX*KY_r^m zM0h5v>00%eMF?0siH=z-kBMF$4i7yW4d2G}hbj6*ta#dZ!VX2Pw-1a;bE$*Ci8i}W zzmHdYKftZb4i42s#^p}i3$6R@*c$#Xp+PNltQVwdA0|9WZ}5Kkp{3bf;8&d+jJNMP zXvL5p<=tki!yYQEA9?tPj64ctoM!4zVyEGa(AqDm#81;kGmEG~{_jdLbrWIQTL_;N zu8pKn4dZtxyrKZg%BZ?A3wbcT7gaCWWnT!Z87Uq#Mr7vI zM%T^%p!B2b(h!~U^*=1KFFmi+I0=e#6H>JiFlk?ZMNJf5tb~h%i_8`tSS_stoTg=l z%$f1%vhoF~u2;n0)@*9k(^=N7%nM$Gjr~ABz zs3l`o{LlCyr4F9a9QtNey%E}|zKmhn#_BOi_W$QfsC0k@8N6-xpTWD>ENL@Nmkr}b Zth>U3zJ6tXa7FJ@tNrD_GCNrKe*v_BZZZG> literal 0 HcmV?d00001 diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..f768f9f --- /dev/null +++ b/po/nl.po @@ -0,0 +1,676 @@ +# translation of gst-plugins-good-0.10.28.2.nl.po to Dutch +# This file is put in the public domain. +# +# Freek de Kruijf , 2007, 2008, 2009, 2010, 2011. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-04-27 00:05+0200\n" +"Last-Translator: Freek de Kruijf \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.1\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "Could not establish connection to sound server" +msgstr "Kan geen verbinding maken met de geluidsserver" + +msgid "Failed to query sound server capabilities" +msgstr "Kan de eigenschappen van de geluidsserver niet opvragen" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' door '%s'" + +msgid "Internal data stream error." +msgstr "Interne fout in gegevensstroom." + +msgid "Failed to decode JPEG image" +msgstr "Kan de JPEG-afbeelding niet decoderen" + +msgid "Could not connect to server" +msgstr "Kan geen verbinding maken met server" + +msgid "Server does not support seeking." +msgstr "Zoeken wordt door de server niet ondersteund." + +msgid "Could not resolve server name." +msgstr "Kan de servernaam niet opzoeken." + +msgid "Could not establish connection to server." +msgstr "Kan geen verbinding maken met de server" + +msgid "Secure connection setup failed." +msgstr "Beveiligde verbinding opzetten is mislukt." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Er trad een netwerkfout op of de server heeft de verbinding onverwacht " +"afgesloten." + +msgid "Server sent bad data." +msgstr "De server stuurde onjuiste gegevens." + +msgid "No URL set." +msgstr "Geen URL ingesteld." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Geen of ongeldig invoergeluid, AVI-stroom zal slecht zijn." + +msgid "This file contains no playable streams." +msgstr "Dit bestand bevat geen afspeelbare stromen." + +msgid "This file is invalid and cannot be played." +msgstr "Dit bestand is ongeldig en kan niet afgespeeld worden." + +msgid "This file is corrupt and cannot be played." +msgstr "Dit bestand is beschadigd en kan niet afgespeeld worden." + +msgid "Invalid atom size." +msgstr "Ongeldige \"atom\"-grootte." + +msgid "This file is incomplete and cannot be played." +msgstr "Dit bestand is incompleet en kan niet afgespeeld worden." + +msgid "The video in this file might not play correctly." +msgstr "De video in dit bestand zal mogelijk niet correct afgespeeld worden." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Dit bestand bevat te veel stromen. Alleen de eerste %d worden afgespeeld." + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Er is geen ondersteunde stroom gevonden. Misschien moet er een GStreamer " +"RTSP extensie-plugin voor Real-media-streams geïnstalleerd worden." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Er is geen ondersteunde stroom gevonden. Misschien moet u meer " +"overdrachtsprotocollen toestaan of anders ontbreekt de juiste GStreamer RTSP " +"extensie-plugin." + +msgid "Internal data flow error." +msgstr "Interne fout in de gegevensdoorvoer." + +msgid "Volume" +msgstr "Volume" + +msgid "Bass" +msgstr "Lage tonen" + +msgid "Treble" +msgstr "Hoge tonen" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Luidspreker" + +msgid "Line-in" +msgstr "Lijn-in" + +msgid "Microphone" +msgstr "Microfoon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mixer" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Opname" + +msgid "In-gain" +msgstr "Ingangsversterking" + +msgid "Out-gain" +msgstr "Uitgangsversterking" + +msgid "Line-1" +msgstr "Lijn-1" + +msgid "Line-2" +msgstr "Lijn-2" + +msgid "Line-3" +msgstr "Lijn-3" + +msgid "Digital-1" +msgstr "Digitaal-1" + +msgid "Digital-2" +msgstr "Digitaal-2" + +msgid "Digital-3" +msgstr "Digitaal-3" + +msgid "Phone-in" +msgstr "Telefooningang" + +msgid "Phone-out" +msgstr "Telefoonuitgang" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Kan het audio-apparaat niet openen voor afspelen. Apparaat is in gebruik bij " +"een andere applicatie." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Kan het audio-apparaat niet openen voor afspelen. U hebt geen toestemming om " +"het apparaat te openen." + +msgid "Could not open audio device for playback." +msgstr "Kan het audio-apparaat niet openen voor afspelen." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Kan het audio-apparaat niet openen voor opnemen. U hebt geen toestemming om " +"het apparaat te openen." + +msgid "Could not open audio device for recording." +msgstr "Kan het audio-apparaat niet openen voor opnemen." + +msgid "Could not open audio device for mixer control handling." +msgstr "Kan het audio-apparaat niet openen voor het besturen van de mixer." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Kan het audio-apparaat niet openen voor besturen van de mixer. Deze versie " +"van het Open Sound System wordt niet ondersteunt door dit element." + +msgid "Master" +msgstr "Master" + +msgid "Front" +msgstr "Voorkant" + +msgid "Rear" +msgstr "Achterzijde" + +msgid "Headphones" +msgstr "Hoofdtelefoons" + +msgid "Center" +msgstr "Midden" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Zijkant" + +msgid "Built-in Speaker" +msgstr "Ingebouwde luidspreker" + +msgid "AUX 1 Out" +msgstr "AUX 1-out" + +msgid "AUX 2 Out" +msgstr "AUX 2-out" + +msgid "AUX Out" +msgstr "AUX-uit" + +msgid "3D Depth" +msgstr "3D-diepte" + +msgid "3D Center" +msgstr "3D-centrum" + +msgid "3D Enhance" +msgstr "3D-verbeteren" + +msgid "Telephone" +msgstr "Telefoon" + +msgid "Line Out" +msgstr "Line-out" + +msgid "Line In" +msgstr "Lijn-in" + +msgid "Internal CD" +msgstr "Interne cd" + +msgid "Video In" +msgstr "Video-in" + +msgid "AUX 1 In" +msgstr "AUX 1-in" + +msgid "AUX 2 In" +msgstr "AUX 2-in" + +msgid "AUX In" +msgstr "AUX-in" + +msgid "Record Gain" +msgstr "Opnameversterking" + +msgid "Output Gain" +msgstr "Uitgangsversterking" + +msgid "Microphone Boost" +msgstr "Microfoon-boost" + +msgid "Loopback" +msgstr "Loopback" + +msgid "Diagnostic" +msgstr "Diagnose" + +msgid "Bass Boost" +msgstr "Bas-boost" + +msgid "Playback Ports" +msgstr "Afspeelpoorten" + +msgid "Input" +msgstr "Invoer" + +msgid "Record Source" +msgstr "Opnamebron" + +msgid "Monitor Source" +msgstr "Monitorbron" + +msgid "Keyboard Beep" +msgstr "Toetsenbordpiep" + +msgid "Simulate Stereo" +msgstr "Stereo simuleren" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Surround-geluid" + +msgid "Microphone Gain" +msgstr "Microfoonversterking" + +msgid "Speaker Source" +msgstr "Luidsprekerbron" + +msgid "Microphone Source" +msgstr "Microfoonbron" + +msgid "Jack" +msgstr "Plug" + +msgid "Center / LFE" +msgstr "Midden / LFE" + +msgid "Stereo Mix" +msgstr "Stereo-mix" + +msgid "Mono Mix" +msgstr "Mono-mix" + +msgid "Input Mix" +msgstr "Invoer-mix" + +msgid "SPDIF In" +msgstr "SPDIF-in" + +msgid "SPDIF Out" +msgstr "SPDIF-out" + +msgid "Microphone 1" +msgstr "Microfoon-1" + +msgid "Microphone 2" +msgstr "Microfoon-2" + +msgid "Digital Out" +msgstr "Digitaal-uit" + +msgid "Digital In" +msgstr "Digitaal-in" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Handset" + +msgid "Other" +msgstr "Overig" + +msgid "None" +msgstr "Geen" + +msgid "On" +msgstr "Aan" + +msgid "Off" +msgstr "Uit" + +msgid "Mute" +msgstr "Dempen" + +msgid "Fast" +msgstr "Snel" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Zeer laag" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Laag" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Middel" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Hoog" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Zeer hoog" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Productie" + +msgid "Front Panel Microphone" +msgstr "Microfoon in frontpaneel" + +msgid "Front Panel Line In" +msgstr "Lijn-in in frontpaneel" + +msgid "Front Panel Headphones" +msgstr "Hoofdtelefoons in frontpaneel" + +msgid "Front Panel Line Out" +msgstr "Lijn-uit in frontpaneel" + +msgid "Green Connector" +msgstr "Groene connector" + +msgid "Pink Connector" +msgstr "Roze connector" + +msgid "Blue Connector" +msgstr "Blauwe connector" + +msgid "White Connector" +msgstr "Witte connector" + +msgid "Black Connector" +msgstr "Zwarte connector" + +msgid "Gray Connector" +msgstr "Grijze connector" + +msgid "Orange Connector" +msgstr "Oranje connector" + +msgid "Red Connector" +msgstr "Rode connector" + +msgid "Yellow Connector" +msgstr "Gele connector" + +msgid "Green Front Panel Connector" +msgstr "Groene connector in frontpaneel" + +msgid "Pink Front Panel Connector" +msgstr "Roze connector in frontpaneel" + +msgid "Blue Front Panel Connector" +msgstr "Blauwe connector in frontpaneel" + +msgid "White Front Panel Connector" +msgstr "Witte connector in frontpaneel" + +msgid "Black Front Panel Connector" +msgstr "Zwarte connector in frontpaneel" + +msgid "Gray Front Panel Connector" +msgstr "Grijze connector in frontpaneel" + +msgid "Orange Front Panel Connector" +msgstr "Oranje connector in frontpaneel" + +msgid "Red Front Panel Connector" +msgstr "Rode connector in frontpaneel" + +msgid "Yellow Front Panel Connector" +msgstr "Gele connector in frontpaneel" + +msgid "Spread Output" +msgstr "Uitvoer spreiden" + +msgid "Downmix" +msgstr "Downmix" + +msgid "Virtual Mixer Input" +msgstr "Virtuele mixer-invoer" + +msgid "Virtual Mixer Output" +msgstr "Virtuele mixer-uitvoer" + +msgid "Virtual Mixer Channels" +msgstr "Virtuele mixer-kanalen" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d functie" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s-function" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Kan het audio-apparaat niet openen voor afspelen. Deze versie van het Open " +"Sound System wordt niet ondersteunt door dit element." + +msgid "Playback is not supported by this audio device." +msgstr "Afspelen wordt niet ondersteund door dit audio-apparaat" + +msgid "Audio playback error." +msgstr "Fout in geluid afspelen." + +msgid "Recording is not supported by this audio device." +msgstr "Opnemen wordt niet ondersteund door dit audio-apparaat" + +msgid "Error recording from audio device." +msgstr "Fout bij opnemen vanaf audio-apparaat." + +msgid "Gain" +msgstr "Versterking" + +msgid "Headphone" +msgstr "Hoofdtelefoon" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Fout bij het lezen van %d bytes van apparaat '%s'." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Onverwachte framegrootte, %u in plaats van %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Fout bij het lezen van %d bytes van apparaat '%s'." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Fout bij het verkrijgen van de eigenschappen van apparaat '%s': het is geen " +"v4l2-stuurprogramma. Controleer of het een v4l1-stuurprogramma is." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Kan eigenschappen van invoer %d op apparaat %s niet opvragen." + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Kan de instelling van tuner %d op apparaat '%s' niet verkrijgen." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Kan de norm op apparaat '%s' niet opvragen." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Kan de knopeigenschappen op apparaat '%s' niet verkrijgen." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Kan apparaat '%s' niet identificeren." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Dit is geen apparaat '%s'." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Kan apparaat '%s' niet openen voor lezen en schrijven." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Apparaat '%s' is geen opnameapparaat." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Apparaat '%s' is geen uitvoerapparaat." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Kan norm niet instellen voor apparaat '%s'." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Kan de tunerfrequentie van apparaat '%s' niet verkrijgen." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Kan de huidige tunerfrequentie voor apparaat '%s' niet instellen op %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Kan de signaalsterkte van apparaat '%s' niet verkrijgen." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Kan de waarde voor knop %d op apparaat '%s' niet verkrijgen." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Kan de waarde %d voor knop %d op apparaat '%s' niet instellen." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Kan de huidige instellingen van apparaat '%s' niet verkrijgen. Het is " +"mogelijk een radio" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Kan invoer %d op apparaat '%s' niet instellen." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Kan de huidige uitvoer niet op apparaat '%s' krijgen. Het is mogelijk een " +"radio" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Kan uitvoer %d op apparaat %s niet instellen." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Kan geen buffers toekennen in apparaat '%s'." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Kan geen videoframes verkrijgen van apparaat '%s'." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Fout na %d pogingen. Apparaat %s. Systeemfout: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Kan de parameters op apparaat '%s' niet verkrijgen" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Invoerapparaat voor video heeft de nieuwe frame-snelheid niet geaccepteerd." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Kan de buffers van apparaat '%s' niet vinden" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Het stuurprogramma van apparaat '%s' ondersteunt geen bekende opnamemethode." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Tijdens het draaien kan de resolutie nog niet gewijzigd worden." + +msgid "Cannot operate without a clock" +msgstr "Kan niet werken zonder een klok." diff --git a/po/or.gmo b/po/or.gmo new file mode 100644 index 0000000000000000000000000000000000000000..95b061556b03531252823ea5aae534dba57a65d1 GIT binary patch literal 2058 zcma))&u<$=6vv0s0yUIEfl_`5rj;s?%52tlp}|lDO$rLCNk~nuu(7A>1!u?F9hU@& zL-|z@s&YUn5x$kDO8Mh_A~R|oA=(l zH^1-LyudK-!@M8!3g%wSU#`Os8rb;_q_uJs`z<7^L_^PJY1254!!R z+dmJ^;%+a355oR3E_W;VCrJ1I+i@p?(!LDt0VlxQz|`>_#|7{X$QQxg;1A$l@K^8w za1)ZF0`CS%z6#z2{s!Iy{^ht0$y2d(j{}8dN{39o3(5ru(4G>|RXrL48KrSv_}x+c0m(?2lWpxZ7>$z0lZ!iBe|c zX8e)HVBAToLqVFdkx@1pg^>SV?5P~3}*Q2QLDwLC9kU_>9n=S z#ydKXIx$jZn4-ic$h$zSe4#p;O$KnpCMAwF*wMBOUPI)gbFpr+S|X=gl1)Voso0ci zb!H@+NYtycuEkhGOvxmTR9xX~5-qA}7&XM9PMC_Cs_>@P z?aI*5bSHcRxdvVss~PF3BpfPCjMu~nuA$*jj0Rd(c*!r8gkKV+BKQ4D(ckA|z)(!e z;}HcO*!lZ~|F|d};Kg#KT-xV9TJ{S^0wh&Sf;epjs9}Xar;>nIRWpe79Dg#z?&X<$ z_w-!QRLZL>FN&YS!8q&$p%gU~wZg}fXfF6a_7(J~P#votUaL#d^9v&?)-pyab8Xy7 z%UM0tZs93B!RyT+Nu@scQteqWyk3)n_ zY+UK{c_7#MdDzj}4WwuU)!kJO&T{{*jT>mzB14G{vZIG(%}3Y|ULx8C5yivP%C2}8 z>a|yyRV#Njcp(ei_RdfO>$^mE=u5xM;z5!>qtD, 2004. +# $Id: or.po,v 1.30 2008-04-23 23:18:43 thaytan Exp $ +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-0.8.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2004-09-27 13:32+0530\n" +"Last-Translator: Gora Mohanty \n" +"Language-Team: Oriya \n" +"Language: or\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +msgid "Internal data stream error." +msgstr "" + +msgid "Failed to decode JPEG image" +msgstr "" + +#, fuzzy +msgid "Could not connect to server" +msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#, fuzzy +msgid "Server does not support seeking." +msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." + +#, fuzzy +msgid "Could not resolve server name." +msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "ନିବେଶ ଧ୍ବନି ନାହିଁ ବା ଅବୈଧ ଅଛି. ଏ.ଭି.ଆଇ. ଧାରା ଭ୍ରଷ୍ଟ ହୋଇଯିବ." + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +msgid "Internal data flow error." +msgstr "" + +msgid "Volume" +msgstr "ପ୍ରବଳତା" + +msgid "Bass" +msgstr "ଅନୁଚ୍ଚ ସ୍ବର" + +msgid "Treble" +msgstr "ଉଚ୍ଚ ସ୍ବର" + +msgid "Synth" +msgstr "ସିନ୍ଥେସାଇଜର" + +msgid "PCM" +msgstr "ପି.ସି.ଏମ." + +msgid "Speaker" +msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର" + +msgid "Line-in" +msgstr "ଲାଇନ-ଇନ" + +msgid "Microphone" +msgstr "ମାଇକ୍ରୋଫୋନ୍" + +msgid "CD" +msgstr "ସି.ଡି." + +msgid "Mixer" +msgstr "ମିଶ୍ରଣ ଯନ୍ତ୍ର" + +msgid "PCM-2" +msgstr "ପି.ସି.ଏମ.-୨" + +msgid "Record" +msgstr "ଅନୁଲିପିକରଣ" + +msgid "In-gain" +msgstr "ନିବେଶ-ବୃଦ୍ଧି" + +msgid "Out-gain" +msgstr "ନିର୍ଗମ-ବୃଦ୍ଧି" + +msgid "Line-1" +msgstr "ଲାଇନ-୧" + +msgid "Line-2" +msgstr "ଲାଇନ-୨" + +msgid "Line-3" +msgstr "ଲାଇନ-୩" + +msgid "Digital-1" +msgstr "ସାଂଖ୍ଯିକ-୧" + +msgid "Digital-2" +msgstr "ସାଂଖ୍ଯିକ-୨" + +msgid "Digital-3" +msgstr "ସାଂଖ୍ଯିକ-୩" + +msgid "Phone-in" +msgstr "ଫୋନ-ନିବେଶ" + +msgid "Phone-out" +msgstr "ଫୋନ-ନିର୍ଗମ" + +msgid "Video" +msgstr "ଭିଡିଓ" + +msgid "Radio" +msgstr "ରେଡିଓ" + +msgid "Monitor" +msgstr "ପ୍ରଦର୍ଶିକା" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +#, fuzzy +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, fuzzy +msgid "Could not open audio device for playback." +msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, fuzzy +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, fuzzy +msgid "Could not open audio device for recording." +msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, fuzzy +msgid "Could not open audio device for mixer control handling." +msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, 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\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +msgid "Master" +msgstr "" + +msgid "Front" +msgstr "" + +#, fuzzy +msgid "Rear" +msgstr "ଅନୁଲିପିକରଣ" + +msgid "Headphones" +msgstr "" + +msgid "Center" +msgstr "" + +msgid "LFE" +msgstr "" + +msgid "Surround" +msgstr "" + +#, fuzzy +msgid "Side" +msgstr "ଭିଡିଓ" + +#, fuzzy +msgid "Built-in Speaker" +msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "" + +msgid "3D Depth" +msgstr "" + +msgid "3D Center" +msgstr "" + +msgid "3D Enhance" +msgstr "" + +msgid "Telephone" +msgstr "" + +msgid "Line Out" +msgstr "" + +#, fuzzy +msgid "Line In" +msgstr "ଲାଇନ-ଇନ" + +msgid "Internal CD" +msgstr "" + +msgid "Video In" +msgstr "" + +msgid "AUX 1 In" +msgstr "" + +msgid "AUX 2 In" +msgstr "" + +msgid "AUX In" +msgstr "" + +msgid "Record Gain" +msgstr "" + +#, fuzzy +msgid "Output Gain" +msgstr "ନିର୍ଗମ-ବୃଦ୍ଧି" + +#, fuzzy +msgid "Microphone Boost" +msgstr "ମାଇକ୍ରୋଫୋନ୍" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "" + +msgid "Record Source" +msgstr "" + +#, fuzzy +msgid "Monitor Source" +msgstr "ପ୍ରଦର୍ଶିକା" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "" + +msgid "Surround Sound" +msgstr "" + +#, fuzzy +msgid "Microphone Gain" +msgstr "ମାଇକ୍ରୋଫୋନ୍" + +#, fuzzy +msgid "Speaker Source" +msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର" + +#, fuzzy +msgid "Microphone Source" +msgstr "ମାଇକ୍ରୋଫୋନ୍" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "" + +msgid "Stereo Mix" +msgstr "" + +msgid "Mono Mix" +msgstr "" + +msgid "Input Mix" +msgstr "" + +msgid "SPDIF In" +msgstr "" + +msgid "SPDIF Out" +msgstr "" + +#, fuzzy +msgid "Microphone 1" +msgstr "ମାଇକ୍ରୋଫୋନ୍" + +#, fuzzy +msgid "Microphone 2" +msgstr "ମାଇକ୍ରୋଫୋନ୍" + +#, fuzzy +msgid "Digital Out" +msgstr "ସାଂଖ୍ଯିକ-୧" + +#, fuzzy +msgid "Digital In" +msgstr "ସାଂଖ୍ଯିକ-୧" + +msgid "HDMI" +msgstr "" + +msgid "Modem" +msgstr "" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "" + +msgid "None" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Off" +msgstr "" + +msgid "Mute" +msgstr "" + +msgid "Fast" +msgstr "" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "" + +#, fuzzy +msgid "Front Panel Microphone" +msgstr "ମାଇକ୍ରୋଫୋନ୍" + +msgid "Front Panel Line In" +msgstr "" + +msgid "Front Panel Headphones" +msgstr "" + +msgid "Front Panel Line Out" +msgstr "" + +msgid "Green Connector" +msgstr "" + +msgid "Pink Connector" +msgstr "" + +msgid "Blue Connector" +msgstr "" + +msgid "White Connector" +msgstr "" + +msgid "Black Connector" +msgstr "" + +msgid "Gray Connector" +msgstr "" + +msgid "Orange Connector" +msgstr "" + +msgid "Red Connector" +msgstr "" + +msgid "Yellow Connector" +msgstr "" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +msgid "Virtual Mixer Input" +msgstr "" + +msgid "Virtual Mixer Output" +msgstr "" + +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" + +msgid "Playback is not supported by this audio device." +msgstr "" + +msgid "Audio playback error." +msgstr "" + +msgid "Recording is not supported by this audio device." +msgstr "" + +msgid "Error recording from audio device." +msgstr "" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "" + +#, fuzzy, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Cannot identify device '%s'." +msgstr "\"%s\" ଯନ୍ତ୍ରରେ ଲେଖିହେଲା ନାହିଁ." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ଓ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, fuzzy, c-format +msgid "Device '%s' is not a capture device." +msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." + +#, fuzzy, c-format +msgid "Device '%s' is not a output device." +msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." + +#, fuzzy, c-format +msgid "Failed to set norm for device '%s'." +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, fuzzy, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#, fuzzy, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to set input %d on device %s." +msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#, fuzzy, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, fuzzy, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, fuzzy, c-format +msgid "Could not get parameters on device '%s'" +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, fuzzy, c-format +msgid "Could not map buffers from device '%s'" +msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "" + +#, fuzzy +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." + +#, fuzzy +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, fuzzy +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#, fuzzy +#~ msgid "Could not read from CD." +#~ msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିଁ." + +#, fuzzy +#~ msgid "Disc is not an Audio CD." +#~ msgstr "ଯନ୍ତ୍ର ଖୋଲାଯାଇ ନାହିଁ." + +#, fuzzy +#~ msgid "Could not set parameters on device '%s'" +#~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "\"%s\" ଫାଇଲ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "\"%s\" ଫାଇଲ ବନ୍ଦ କରିବାରେ ତ୍ରୁଟି." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "\"%s\" ଫାଇଲ ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "No filename specified." +#~ msgstr "କୌଣସି ଫାଇଲନାମ ଉଲ୍ଲେଖିତ ହୋଇ ନାହିଁ." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବିନ୍ଯାସ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ରକୁ %d ହର୍ଜରେ ବିନ୍ଯାସ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "\"%s\" ଭିଡିଓ ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "\"%s\" ଭିଡିଓ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "\"%s\" ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ର ପୂର୍ବରୁ ଅନ୍ଯ କାରିକା ଦ୍ବାରା ବ୍ଯବହାର କରାଯାଉଛି." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ବ୍ଯବହାର କରିହେଲା ନାହିଁ, ତାହାର ଅନୁମତି ଦେଖନ୍ତୁ." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଅବସ୍ଥିତ ନାହିଁ." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#~ msgid "Your OSS device could not be probed correctly" +#~ msgstr "ଆପଣଙ୍କର ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ରର ଠିକ ଭାବରେ ଅନୁସନ୍ଧାନ କରିହେଲା ନାହିଁ." + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "କୌଣସି ଫାଇଲନାମ ଦିଆଯାଇ ନାହିଁ" + +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ: %s." + +#~ msgid "No filename given" +#~ msgstr "କୌଣସି ଫାଇଲନାମ ଦିଆଯାଇ ନାହିଁ" + +#~ msgid "Could not close vfs file \"%s\"." +#~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ବନ୍ଦ କରିହେଲା ନାହିଁ." + +#, fuzzy +#~ msgid "Your OSS device doesn't support mono or stereo." +#~ msgstr "ଆପଣଙ୍କର ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ରର ଠିକ ଭାବରେ ଅନୁସନ୍ଧାନ କରିହେଲା ନାହିଁ." + +#~ msgid "No device specified." +#~ msgstr "କୌଣସି ଯନ୍ତ୍ର ଉଲ୍ଲେଖିତ କରାଯାଇ ନାହିଁ." + +#~ msgid "Device is open." +#~ msgstr "ଯନ୍ତ୍ର ଖୋଲାଯାଇଚ୍ଛି." + +#~ msgid "" +#~ "The %s element could not be found. This element is essential for " +#~ "playback. Please install the right plug-in and verify that it works by " +#~ "running 'gst-inspect %s'" +#~ msgstr "" +#~ "%s ଉପାଦାନ ମିଳିଲା ନାହିଁ. ପୁନଃପ୍ରଦର୍ଶନ ପାଇଁ ଏହି ଉପାଦାନଟି ଆବଶ୍ଯକ. ଦୟା କରି ସଠିକ ପ୍ଲଗ୍ଇନ୍ " +#~ "ସ୍ଥାପିତ କରନ୍ତୁ, ଓ 'gst-inspect %s' ଚଳାଇ ଯାଞ୍ଚ କରନ୍ତୁ କି ଏହା କାର୍ଯ୍ଯକାରୀ ଅଛି" + +#~ msgid "" +#~ "No usable colorspace element could be found.\n" +#~ "Please install one and restart." +#~ msgstr "" +#~ "କୌଣସି ବ୍ଯବହାରଯୋଗ୍ଯ ରଙ୍ଗକ୍ଷେତ୍ର ଉପାଦାନ ମିଳିଲା ନାହିଁ.\n" +#~ "ଦୟା କରି ଗୋଟିଏ ଉପାଦାନ ସ୍ଥାପିତ କରି ପୁନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ." diff --git a/po/pl.gmo b/po/pl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..5f0f5c08bab01498cbb7daf181ef1b5246ea92ab GIT binary patch literal 15730 zcmd6t36LCDd4L;Z8zbWzV`Cfh2*?N0jCNP@wLW5NSI1gf?V{Cz6)@?U>7DJJneK6S zkH*tLFp7o2#)g2cAVZ9~9d0AAIm8ufsU&s+RVfNc3Rhf7ppptz2~+{8#8kfj_3LAH zN7ezA%9Q^7`gOm4$N&EKzyH0~(`TRffW_~d$VJGDPqwV*JhAf?tHMgg=7P-)9X^c}b%0bD-$&<%X9Vu7;ww>!A(T!OP$$ptSdU@b}=a;0V0n zyo8fb`h5r706zdX!heQW!qWMcH4JM|^so=g`wLLo|7$4iUis3b|F3~Jl71tU`v;-) z=NY&hp2Q$s0arlXe<Dti z3dKIQL+O{pAIbk#DEfID6#d-?MZfPe&p%?GKLVv4pNEp~F(`KaEl3xvry&2VpYVsF zw@$#gr2KQ?Y48I0e0Uj@`c^`j4{M;<-Svj!hMS<|+X^M$E-3F;&GWjU2c^9oD0X{? z;k{7o{Xr=G{uIQ7t*=4p$KM$K9h7>01VvxZK&kIPptS$Lp!D-MP{w`P%NT2T6Aa)F zq2$|yu}b@7T+?q<;ye|ChWxDSsGBd#-|_*Xy9vGX`ZGrr;2Ky-D8(W&Az>rCpCfsrQ?Zf7V~| zN5OxEOgU>A2`OJe(d%+3`nv*3JFkaQ&t@p~?}E}k8%p_2DET^2^l>MY`tF9~@O~)m z`w_epE_(&G3rFCqVGEYv`%L;fP}={WQ0hCC$t>la4W+(|pwzS6q*uUeNUwo1pFAk@ zX)l!dv>!@2pM}!DFF~>E1t{bB43zQwIegdi$n(mizaM;6($CL8DeucB{S*}a{{TvP z{{%O~UqI2rjmr~G8QyBxf@05aGJFTb)U16_+V@2$<$cZYNl25de}Gc|Z{Q{HZ2m|; zuYo7PX}A*3KpEdVpp4(cP{!>MH~}An{L_PQm4Lxm4c`E-gYSjnuf7N6`N@|t2jC6x z-SBQW1~0svv4(GeZ-?K9O?WGVxfVVN8}RfMmi7BEhBD4yg;&FWfl}|qH2PGy70Ni= zYUslklD@<6Zo~Vb_@Rg3Zulq^ySa=%!X5l6!#kn0+oJE{d^M2{WFFVeQbeZXK#bM;J4r!cp;0%wQw3r`kinS{5BLjKaEA?WVq3A z3d*?efS9-yK^f5{xp3xO|8Gal}eV>Jr|8Xeo`Hs2&l;QUcpN7)@pBnxgo=y5$DD|I-Ql#CNK+)?cl=5zZ zQvU`h`KO@FrwWwv0{CM1W_UAv5Bxm*F?kSlPFC3bsm(og3`VbDEhx1PQ!JOrda!+_<`@j_3#WP3o5sEK)P|W*HFrN2~J7cbFtwHD0;aXO22M^JK-d}5Pl3^1ix+gG?e%M8;TvA!sM3z zpAV(o*Fw?PB*g7oA4hg0QuiMs@{{opTaw>b6KEf@oNIaavxtnrdy$VI>Ca0q;LXT5 zauE3#f;-ZBSph4E=>Ct9FCp?fkieRQ!^n-uR}isL`E5m-NEe}N)+31g&P`z51yQy2 zDU;p+6|xbz1gRr$M2f$QNZf+Rc(jo}K;-wi1lE@gXQAl)HHhePJCgoBZ7!{w<0H+dtJS1ar5(fZU3_0{J9z8X`XBazuVtB2)T`xYuw7K8Ae4q)&qDk$0N( z2jJ=E`cc?JZa_{j_x{}QE$~l~YmhIRd+&#vk-bP{?zwOtX&}4Iy|2O7BY%QCA9)>; z{@!dZ-T*ftK2kyZEw+=ZU*)Iux7s#LGp;}&3>pNaGa(z#d+4ZH%!%J1A zr-at(aW&?6krT+(xYLg2{(W8>DC?RkEr+!`u#XM3vV>~^b;)?_(-=(nA~jvUo>qdC75DO=Q2ZCFOl z3DhdJdHp(T3^mtXudV_o^qU&Maowa&H$4WUK?fsnBPwi9(C5KBo87 zwmGzpQHL@X{;W3YDXDozcXFl|MoudonQT;KK1K4T({x%G$C2w#jrtgJGC#GsQBB1W ztLezBqh=c`nL`V9yWMoFwwTee6#IYPWp#_+Q8nMYG-AMZJBk_8azm|g>`srDc$Z|9 zkKB{Msro_fs75`{`rEakV8}|WFmP;X03%UT-N20&HAYWwI%@o-$CM~rW;C@sHZvVx zVYee(Y}WUInQ$v@JWHydao4VUI6}8-jk|R>vYX;m(@XKA=DIYTU5#W{tF3Xr>oJY2 zb=t=>Yo+5CKUJ{I~sswVJ)p$wp{cCTrUs9NAMY07GB&cPSEv&xkW$8UywP3w9jIrjZo2S=pP;SevJ85w|6NktG8sH%C z$1;SA%2AVckGY*GFR*3(OB8>Ya*Qqf_60?(*8v)ISU0?CZ}E_4nl$|gjhTpx)Ni8O zMU7b0;?S*om}VH!|9UicqzZQ1O_nd2T&Z(^&KhWSfF~>r5jLoG%xn4Lmk%%fNZ#@M zp!FP0PcnstC9ZF36gr7Yvf({~Hf70P-t4H2aZ#^QK-T75nHcG!T6B{|HHA63IFB)m zKBX-!DbX^Sj#AM7Fmo`s`WhQ^sB(8TtLU5TK z1ew`&&5mp}+w{9h^j%)`L?)8m%AYZmE{-lDfRf&qt(ysptxZm^;@d$@t#zEXB|&GZ zXiZVBT(C4~j3ii{fR=9d{k8<(Ty(8TM$`$cNvGy^T2^5o@=G;bxUWWvi6mMtWYxo0 zNE2cO>^e}0RDv6&4&QSlVtPY~!gLnj^OY!W5_fEE@zwUNn^|3nySQdvxL%@-WH#v) zVWqlh$AtDiD6Q)@o8o9$ID$?)c`Xm-jApyGEPRBvWgRTE7{G`Pk;5Y5E4wKJ)ACuX zqrmn;iOy9!@FTzKH(4NvOtCW^mv!BcINTvrCB~82Lu?c1!Zyt4F~sj~-8M6=oZBPE z(_v7%*kp%gkq6WiEW|Z`$>W+c%vYT*Gv_6P!ldp_L^~ z_>`+E4afUqf$6}nb&?J7R#{ms`XBH|!Uuz-xyh~6*pift+)>uE6%)zbhNK2}XJ&eQ zV!fL1tmH!G;*29Z?BY%gtM0VbtPW$!Jl8w!nvchoy`kwcw(m4(VU{737^8yM6DPu5 zJT-q>ou+I}XPCr}Z>1Ys!?e3IZ3)n1J1#yd&8uJ0Q*MR`MrMVTUL;#1Yo_OMda#Wh zP~x1oNeHjQLUFx?m5R`RQR{85ry3q%XcqsnXPood>`EcYGQ%3KcUZH;b4(>Y7g2!h zqx3Z9q(ROZ^kzoqsS>x@%m?(ObFs-K0@o7`GaryI@_i;PO-VDUDX-bn@50Vt7Na9*Fsj;tNN{Wlil#q|{)*A*q=`372{jfFu`0V-9xy8}`HqUHs49?9&pT{0b6SWe( z7mqrs>S0t$+-g{=`+iLgm4}DQBUhG3mTh&!dzU7|x?3x)?bO54Hh)yjMNxZn)v8LT z9Snvqsc^nk?}V|s?zRdCU2`|K zo3&EY^*XmpD{kN=uijyYQQAfvFsi0~eTZ|NUXCb6>Ll=K(d!#|5`|@gSQbwry}DE8 zU@tFW6oXwhIWf5|SJ!ZPXc^jOL84*3Ha(13o>pPlu6M1f&e;LxaQ*ge>q}SX`J@A! zHkH<4>9QXlRaaNsXqm;?W1~86v$>M_lcy}b`L#QAIgGk?awNI%Aa2@esMX`vhJ`(c z_E%V)xZdi=VeAC4`@i6?d1TM2Amv`E}yu>4Jm#v-7{KEUIWYEWyl--{!J{{?QO0w{@@0qnWX_sH4Z$V50 zY*kzMYS%rqzd<0n#SI&-V@>!G_;Cy3Fvs4f{Y=}VTm9oW?*Tg8c0?9@2{w9J^MG{>L2TCPp;fgjgm*J)N`8c=mr zSGvw%D(>0~d$iu@g_`I5QU1gac?ZTDA*B-%Bou0q$9tR8^@A{cH&;x(A6d9sRP@& zE$IKpkZ4ZAvjX#ek~*8eXmRBHpfp*lE+E+e;ar`Qi8VFy*Lr(k8r-D}UT2ck}Q zfHyeGAukm1yKb&t=cLQEYTS!BlVBxkyP;kM`aKuUF!L>*9kZGxD;eD?T97U4*g1C#~po?y<~~Vt7^zrz>_7Rn*>6A^Es(TO)|I~l=w=YXdhi^ ziH-d(N}ISKoMn{Ej%-Ywd9j)!x4^HpdyyVe&Ih$=^zzYKR01dDi|s0VUCy2DrW>n=R+4w#ZZNryfAll^Ysl$OBc0cSJl;&)t2BITI*6Y*zyS|d%1*D_a0hN3(tQtG zQg?6;nZk$e!fhWm3rj=b&+@Hfz_w;*-14iQD?2o6Dk30l@u9nKN7s|R1Dl9IN!Ms5 z$Ng;aTz1p?tUucXh3usYdm^12RAu&p>__Avbn%TrFX^-YUGkqJaJQ+-@X-bR6)(pL z{8&Qs&S8n!65F>{8h^^eu6JlZ8ep5o&djU@-NId2^V>L=E?$Mr94pA6T%2olTB1)J zUm@528s(;nl1p1ZEiC+eR5mXPgz^#JE_L6Y2zVc5h3 z3H7H1(yQ~%PSYzqaNOnG+_U+-u&~FGO+O14Nj8nLzm*RHiIHR%`Xhre9FCOJ9W=WT zZA_g$?dEqEzQX!ilTBiNkFs$`i@r7#GA7?2Xj>k`wD|ZySF316+vXP8eCkOqUnTew zQ6gB=@va<1(1EtE<6felbjqZ$Kxd^KHp-w763h3A%Ax(T7pAnSKX*rjhSayOL`b%EB);v``lpS@8fQ;9NF>-BMCv0`Uvg% zD$MIj>J~qosX^r*HIh+asFEWUna?}(%WP`5{T93Gg*!QaU?vW}J!sxfaO~MB4H`SM}Deqcq~LW}+&s}SQ{IM~;O^vscOEoP@l7?y_& zoU)iBDQYg``T0a5XLVNcg=8DLv$mvrtN!lhk*<|bn8MBcwc~D1rW=lYf^MHfPVWrT zP3D&Lhn3tdCCTmB7atq+!oqjCxXrm?tRvXI!yG0qVR_f}wa1WSCH-~9oGPZ%urr@* z;Jfa;jkn9P;E{VQ26!}mJc*A*)9m)KNx$Lpu|&Sb$eE}Fa~#X#_44DlT%Gx;9Q&}X ze$3SE+Gfv?#uL^|QbfT;nL^VqG}gEoW4;%qA8+_t2E(>0H;-id zrN_@$l5}|CpiO_~#VZN;SmW3DP?Byu(|!1qY#`Y3MLl+VGThyj9EkTX6Td0+$FPpmo6AbnRbLDGwrUk#_PAp*hs$mu*e?6dlej& zUYMWzox-j-AGGv;q;f=#tvUQ(*?^@)_diRt^jfP&C|i${FKvCt1!l#6>so)#E4 zM^v(sGLd8zGCLz#@0aYglCZOEZQ`g_Hb5=C, 2007-2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-01-07 21:53+0100\n" +"Last-Translator: Jakub Bogusz \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "Nie udało się nawiązać połączenia z serwerem dźwięku" + +msgid "Failed to query sound server capabilities" +msgstr "Nie udało się odpytać o możliwości serwera dźwięku" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' autorstwa '%s'" + +msgid "Internal data stream error." +msgstr "Błąd wewnętrzny strumienia danych." + +msgid "Failed to decode JPEG image" +msgstr "Nie udało się zdekodować obrazu JPEG" + +msgid "Could not connect to server" +msgstr "Nie udało się połączyć z serwerem" + +msgid "Server does not support seeking." +msgstr "Serwer nie obsługuje przewijania." + +msgid "Could not resolve server name." +msgstr "Nie udało się rozwiązać nazwy serwera." + +msgid "Could not establish connection to server." +msgstr "Nie udało się nawiązać połączenia z serwerem." + +msgid "Secure connection setup failed." +msgstr "Ustanowienie bezpiecznego połączenia nie powiodło się." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Wystąpił błąd sieciowy lub serwer nieoczekiwanie zamknął połączenie." + +msgid "Server sent bad data." +msgstr "Serwer przysłał błędne dane." + +msgid "No URL set." +msgstr "Nie ustawiono URL-a." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Brak lub niepoprawne wejście dźwięku, strumień AVI będzie uszkodzony." + +msgid "This file contains no playable streams." +msgstr "Ten plik nie zawiera strumieni nadających się do odtworzenia." + +msgid "This file is invalid and cannot be played." +msgstr "Ten plik jest błędny i nie może być odtworzony." + +msgid "This file is corrupt and cannot be played." +msgstr "Ten plik jest uszkodzony i nie może być odtworzony." + +msgid "Invalid atom size." +msgstr "Błędny rozmiar atomu." + +msgid "This file is incomplete and cannot be played." +msgstr "Ten plik jest niekompletny i nie może być odtworzony." + +msgid "The video in this file might not play correctly." +msgstr "Obraz w tym pliku może nie być odtwarzany prawidłowo." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Ten plik zawiera zbyt dużo strumieni. Odtwarzanie tylko %d pierwszych" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Nie znaleziono obsługiwanego strumienia. Być może trzeba zainstalować " +"wtyczkę rozszerzenia GStreamera RTSP dla strumieni Real media." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Nie znaleziono obsługiwanego strumienia. Być może trzeba zezwolić na więcej " +"protokołów transportu, albo może brakować właściwej wtyczki rozszerzenia " +"RTSP GStreamera." + +msgid "Internal data flow error." +msgstr "Błąd wewnętrzny przepływu danych." + +msgid "Volume" +msgstr "Głośność" + +msgid "Bass" +msgstr "Niskie" + +msgid "Treble" +msgstr "Wysokie" + +msgid "Synth" +msgstr "Syntezator" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Głośniczek" + +msgid "Line-in" +msgstr "Wejście" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mikser" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Nagrywanie" + +msgid "In-gain" +msgstr "Wzmocnienie we" + +msgid "Out-gain" +msgstr "Wzmocnienie wy" + +msgid "Line-1" +msgstr "Linia 1" + +msgid "Line-2" +msgstr "Linia 2" + +msgid "Line-3" +msgstr "Linia 3" + +msgid "Digital-1" +msgstr "Cyfrowe 1" + +msgid "Digital-2" +msgstr "Cyfrowe 2" + +msgid "Digital-3" +msgstr "Cyfrowe 3" + +msgid "Phone-in" +msgstr "Mikrofon" + +msgid "Phone-out" +msgstr "Słuchawki" + +msgid "Video" +msgstr "Obraz" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Urządzenie " +"jest używane przez inną aplikację." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Brak uprawnień " +"do otwarcia urządzenia." + +msgid "Could not open audio device for playback." +msgstr "Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Nie udało się otworzyć urządzenia dźwiękowego do nagrywania. Brak uprawnień " +"do otwarcia urządzenia." + +msgid "Could not open audio device for recording." +msgstr "Nie udało się otworzyć urządzenia dźwiękowego do nagrywania." + +msgid "Could not open audio device for mixer control handling." +msgstr "Nie udało się otworzyć urządzenia dźwiękowego do sterowania mikserem." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +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 element." + +msgid "Master" +msgstr "Główna" + +msgid "Front" +msgstr "Przód" + +msgid "Rear" +msgstr "Tył" + +msgid "Headphones" +msgstr "Słuchawki" + +msgid "Center" +msgstr "Środek" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Boki" + +msgid "Built-in Speaker" +msgstr "Wbudowany głośniczek" + +msgid "AUX 1 Out" +msgstr "Wyjście AUX 1" + +msgid "AUX 2 Out" +msgstr "Wyjście AUX 2" + +msgid "AUX Out" +msgstr "Wyjście AUX" + +msgid "3D Depth" +msgstr "Głębia 3D" + +msgid "3D Center" +msgstr "Środek 3D" + +msgid "3D Enhance" +msgstr "Rozszerzenie 3D" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Wyjście linii" + +msgid "Line In" +msgstr "Wejście linii" + +msgid "Internal CD" +msgstr "Wewnętrzny CD" + +msgid "Video In" +msgstr "Wejście video" + +msgid "AUX 1 In" +msgstr "Wejście AUX 1" + +msgid "AUX 2 In" +msgstr "Wejście AUX 2" + +msgid "AUX In" +msgstr "Wejście AUX" + +msgid "Record Gain" +msgstr "Wzmocnienie nagrywania" + +msgid "Output Gain" +msgstr "Wzmocnienie wyjścia" + +msgid "Microphone Boost" +msgstr "Podbicie mikrofonu" + +msgid "Loopback" +msgstr "Pętla zwrotna" + +msgid "Diagnostic" +msgstr "Diagnostyka" + +msgid "Bass Boost" +msgstr "Podbicie basów" + +msgid "Playback Ports" +msgstr "Porty odtwarzania" + +msgid "Input" +msgstr "Wejście" + +msgid "Record Source" +msgstr "Źródło nagrywania" + +msgid "Monitor Source" +msgstr "Źródło monitora" + +msgid "Keyboard Beep" +msgstr "Piszczenie klawiatury" + +msgid "Simulate Stereo" +msgstr "Symulacja stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Dźwięk surround" + +msgid "Microphone Gain" +msgstr "Wzmocnienie mikrofonu" + +msgid "Speaker Source" +msgstr "Źródło głośniczka" + +msgid "Microphone Source" +msgstr "Źródło mikrofonu" + +msgid "Jack" +msgstr "Gniazdo jack" + +msgid "Center / LFE" +msgstr "Środek / LFE" + +msgid "Stereo Mix" +msgstr "Miksowanie stereo" + +msgid "Mono Mix" +msgstr "Miksowanie mono" + +msgid "Input Mix" +msgstr "Miksowanie wejścia" + +msgid "SPDIF In" +msgstr "Wejście SPDIF" + +msgid "SPDIF Out" +msgstr "Wyjście SPDIF" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Wyjście cyfrowe" + +msgid "Digital In" +msgstr "Wejście cyfrowe" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Zestaw słuchawkowy" + +msgid "Other" +msgstr "Inne" + +msgid "None" +msgstr "Brak" + +msgid "On" +msgstr "Włączone" + +msgid "Off" +msgstr "Wyłączone" + +msgid "Mute" +msgstr "Wyciszenie" + +msgid "Fast" +msgstr "Szybko" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Bardzo małe" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Małe" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Średnie" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Duże" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Bardzo duże" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produkcja" + +msgid "Front Panel Microphone" +msgstr "Mikrofon na panelu przednim" + +msgid "Front Panel Line In" +msgstr "Wejście linii na panelu przednim" + +msgid "Front Panel Headphones" +msgstr "Słuchawki na panelu przednim" + +msgid "Front Panel Line Out" +msgstr "Wyjśćie linii na panelu przednim" + +msgid "Green Connector" +msgstr "Złącze zielone" + +msgid "Pink Connector" +msgstr "Złącze różowe" + +msgid "Blue Connector" +msgstr "Złącze niebieskie" + +msgid "White Connector" +msgstr "Złącze białe" + +msgid "Black Connector" +msgstr "Złącze czarne" + +msgid "Gray Connector" +msgstr "Złącze szare" + +msgid "Orange Connector" +msgstr "Złącze pomarańczowe" + +msgid "Red Connector" +msgstr "Złącze czerwone" + +msgid "Yellow Connector" +msgstr "Złącze żółte" + +msgid "Green Front Panel Connector" +msgstr "Złącze zielone na panelu przednim" + +msgid "Pink Front Panel Connector" +msgstr "Złącze różowe na panelu przednim" + +msgid "Blue Front Panel Connector" +msgstr "Złącze niebieskie na panelu przednim" + +msgid "White Front Panel Connector" +msgstr "Złącze białe na panelu przednim" + +msgid "Black Front Panel Connector" +msgstr "Złącze czarne na panelu przednim" + +msgid "Gray Front Panel Connector" +msgstr "Złącze szare na panelu przednim" + +msgid "Orange Front Panel Connector" +msgstr "Złącze pomarańczowe na panelu przednim" + +msgid "Red Front Panel Connector" +msgstr "Złącze czerwone na panelu przednim" + +msgid "Yellow Front Panel Connector" +msgstr "Złącze żółte na panelu przednim" + +msgid "Spread Output" +msgstr "Rozprowadzenie wyjścia" + +msgid "Downmix" +msgstr "Miksowanie w dół" + +msgid "Virtual Mixer Input" +msgstr "Wejście miksera wirtualnego" + +msgid "Virtual Mixer Output" +msgstr "Wyjście miksera wirtualnego" + +msgid "Virtual Mixer Channels" +msgstr "Kanały miksera wirtualnego" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Funkcja %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Funkcja %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Ta wersja Open " +"Sound System nie jest obsługiwana przez ten element." + +msgid "Playback is not supported by this audio device." +msgstr "Odtwarzanie nie jest obsługiwane przez to urządzenie dźwiękowe." + +msgid "Audio playback error." +msgstr "Błąd odtwarzania dźwięku." + +msgid "Recording is not supported by this audio device." +msgstr "Nagrywanie nie jest obsługiwane przez to urządzenie dźwiękowe." + +msgid "Error recording from audio device." +msgstr "Błąd nagrywania z urządzenia dźwiękowego." + +msgid "Gain" +msgstr "Wzmocnienie" + +msgid "Headphone" +msgstr "Słuchawki" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Błąd odczytu %d bajtów z urządzenia '%s'." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Otrzymano nieoczekiwany rozmiar klatki %u zamiast %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Błąd odczytu %d bajtów z urządzenia '%s'." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Błąd pobierania możliwości urządzenia '%s': to nie jest sterownik v4l2. " +"Proszę sprawdzić czy to sterownik v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Nie udało się odpytać o atrybuty wejścia %d urządzenia %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Nie udało się uzyskać ustawień tunera %d urządzenia '%s'." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Nie udało się odpytać normalizacji urządzenia '%s'." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Nie udało się uzyskać atrybutów sterujących urządzenia '%s'." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Nie można zidentyfikować urządzenia '%s'." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "To nie jest urządzenie '%s'." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Nie udało się otworzyć urządzenia '%s' do odczytu i zapisu." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Urządzenie '%s' nie jest urządzeniem przechwytującym." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Urządzenie '%s' nie jest urządzeniem wyjściowym." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Nie udało się ustawić normalizacji dla urządzenia '%s'." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Nie udało się uzyskać aktualnej częstotliwości tunera dla urządzenia '%s'." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Nie udało się ustawić aktualnej częstotliwości tunera dla urządzenia '%s' na " +"%lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Nie udało się uzyskać siły sygnału dla urządzenia '%s'." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Nie udało się uzyskać wartości sterującej %d urządzenia '%s'." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Nie udało się ustawić %d jako wartości sterującej %d urządzenia '%s'." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Nie udało się uzyskać aktualnego wejścia urządzenia '%s'. Może to radio" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Nie udało się ustawić wejścia %d urządzenia %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Nie udało się uzyskać aktualnego wyjścia urządzenia '%s'. Może to radio" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Nie udało się ustawić wyjścia %d urządzenia %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Nie udało się skolejkować buforów urządzenia '%s'." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Nie udało się uzyskać klatek obrazu z urządzenia '%s'." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Niepowodzenie po %d próbach. Urządzenie %s. Błąd systemowy: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Nie udało się uzyskać parametrów urządzenia '%s'" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Urządzenie wejściowe obrazu nie przyjęło nowego ustawienia częstotliwości " +"klatek." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Nie udało się odwzorować buforów z urządzenia '%s'" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Sterownik urządzenia '%s' nie obsługuje żadnej znanej metody przechwytywania." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Zmiana rozdzielczości w czasie działania nie jest jeszcze obsługiwana." + +msgid "Cannot operate without a clock" +msgstr "Nie można pracować bez zegara" diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo new file mode 100644 index 0000000000000000000000000000000000000000..057a223c8e1bc1d7a58dacfbf494ff92ea2324f5 GIT binary patch literal 15692 zcmchd3y>vMdB>ZVl3kIvA|M{c0akYI&dee#!$Wpw_60laxHG$;@zry0&rGxTc3-;h zo!!|O9}(1uNXVoYVLA z%--DvB;MLHzdqfk&*MAa`ObH~-hVpf*gFD#kCM(No%XySIO?b%c)<&FHwaETDF|K& zPln5(fqJwO{u;a#9uG(0GPng^4X^X}?}aM&ai4$K=f4PPD)=gVKKv#;9sUD67XApT zz9->{@aOO>c*4o9KP%vw@E_sz@OTEd8ir8) zx&yuvJ_OH&k3o(1=bp#E$jSRuDEYn2bA{(>D7jq$L%1GZ0PlzD@3-J9;7{NXJoCkl zV^HIM2iyqnhMVB`;l;53j35|)!s^|^>7iC-d*82>Uj-RxouG8UJvzt)jyx{OrZMPhSJ-2czys% z-|vDN_s1bB9DE*X9N+N#HdH&0LCNcJsP_IFs{cQQ8s{&d=6%^qnQOQfX7D>u<*q?l z)xUA5^)(6A{&kR7gITC{Z-%P>7N~k}hkEZG|NNu=`FpuUla25Hd zpvHgR%Uu0~Q2n_CO0JhfwKD=W4_n~?e522Q5NiJJhU(X+q1t^E@-O%s{uuc0kR=x^ zBcu8alwA9u8?YaK*ysNms{c+1jJE8V>RJ=FNW12yg+Le=vGRKJeu3xdsXIg}i> zLzS=jeCG4-gwp3*q2}*ysQLI9JPv*pN}vB0s-Evb1OE%EzLU;#<_^K;-%J%)54xYKh1(#7CM@JjfiiW}c{$kYb6!t3Fu;B|00ol^g*p8KKX@dVWS z7oxP{4N&^K&-1%*8~NpI7P|i?DEodZ36F!zsB|4X3BC|cKm(_I{#`zQ8$6c#2jKDWv;O&Cz!S-T%Rm1fJc;}d;Pc^A z@D%t9D7`+JNs&ID?RhzreR=~_{kx$0@m6>YyalShTcO&y2ddsrdVbdPOHk#$3e~^I zpvLzvQ1kn5@Okh_pZ_UbPW~8_MLZFn2G4@(?*Kd%jzHCOo#z{&%2y#+q?cfyVELHG!K3f=?{uo^;d-cct5EW~!QaoJ#{D*^aoh&Aj_-#j!ymwN z;ZLC2ISXah_*X!!lZzosJ9rCZiwWKfHDC8bjqejs<-Y{guW$JL_o4dn1XQ{I_4(x( zag{&K^W{+GDsU2B0=0hL4+r4a;ClEoC_A%`KjPc?gD8T}L2HMhhfz2;Kt`aqw}U-v|w96X`tC4CyyW<=@$4 zUPsbAG)ccs((e-v!Dl_E;dP|fk|ewBq~iCd{-O$RBwbJX2#IaM&Vy{>7f3H9>31vX ztt8E5`PU|MJLxQc^L%(O=~|NJ@q?rfkZvKpnsg6I^Z#3<50Sn|(obt;fFzyVO!_0z z4pK%MCuyxofAxDW>BFQ)mGQs5@GjE3Nm>sLlGg3g-)H;{*%1BCB}Jrnl8z?3McymadD-Pjaz}w8!6gAIwR&`Fw$QaIw~B?tr^VL!@&^ z7m-l+;8UbGkzP*PPdb4ln<6`*-^HY@_R6hgT~3fbO}bwhe#enEklwEhzq?5u`F;8MW@_Gu z!Rk>n5+$uD)75CyY|ZLoeKH#+)hJkNlBl&S&32k7%hJrG)oMG7YAX%bt=Y)rQ8pK4 zrdm()sAlg}(AeKEEMLla?6|lc>JvSvy*qJw(ZNTyOQq ziJ53d;Z6iJG8&A8Ns_iqTtj5>^t`D>b8$7YlB^UD(`J-~t;p<(TeE4qWkQLkx-;-% zb}*~VmJREJ5yU(bCo?9C^0eO8RGF}4vNqK>A`|CE&CN$Glee4AG((oOleX(M`@jp^ zv{FA4rDsucV>@E3Q|;;LD9a54S=`%BEm7VIr|NM&Yf6*Xsj}SOAxoz1q;_x@X6Sb_ z%)&;5e&vR-m3mO>Y9nlRx;dStjYAYeut>*hgs*2BHEhJYrGddVeJClikrrlAs17g_HM1*=TT41)mp23T_A+5fR02Pn)*Snl zj;#orElg}@>^%!%R+?CrLO!E$IFn!q<7zM(&%~{;E~8pp%8vT${=v@GQ0HoOFq-a4 zSVqBmYvWn9>b`msPQ`V`66JP`r7;hi%~-))6BwGgi|RwBmc=ZZiW!-Wu*LDTiB-To z9W0*u77AgpK~2rKRQr-eUpZ94#U`X%%+J58sB9uC!G>9ZR>pWLg^B6o zGIvYb?r_7VFE3u{2*TMG2Gio@skVB&v?IP1w6}&b)*^HD`1*||ZiF*YQ60}@5ZOR8 z3%uQzQH%XLLxK_eMpB($I^`Wn`f=o5O=KeN zo5*%aCzkX$k7p88GjB2enbz!)8kh^~Y+qVjg>gS@3-mg}5|*Y29kep$weIHEonFS_ z-bvD|ahR^VLV0P6TeLJvgG3~q={%;5;7s0`+;*CO5!;+$FM%Ki1u*d}acb2d#PR$9qN z+Y%>{?AAf|WWdTd$Kq<1+6sb=VVndTagn;drt6N$<2{kK@4hw?Wy=oHPUR}W#*8&K z(s34Twp@MrQN+H#G~c`IrqQv@!6wWY^hUwib z7hJ0YC$n>13tOR?uBW@4_gz`?L<=cwbe}PmF@~;%1EtYdf~#?hgKMJssWi-LW?d9D z138_Ape-d_U9dG+3^}ZJpr>2Xv?=GCi(SDOGa6;VSX7JKji59U-AglAx^ITc8RxB+ zirVQb<#DkxP8|qDjbKJ;BTeEKKE0>BFk2)|QX|2QVUB}qQ?q^B7Is(sF0NS@apI)m zR+HTkR+_atHe2h1(00Z3x(qEFN7in-*SgM}m+Y=k8y~K1#X1WOCa}eUC}I;yO<32& zG*b5JRu(3?ymQmc(pFkc>ueBsrs$dV%XY;%et3kdijSk!gKv}B$~I2eImGU6o17Ro z(e751SU0FyZ*wlNqj_fClCsk^Hr^xDZ5RBu2$gFvo1qsBmgZVkX0Ua7I@p>7TN&9* z`Ml(B^j-s7<%9-kl+$r8w8hy;9v>MCNc}^>xK=*LDu0opf8%jdKEBy(?-s_3li)bg z&Vx?YyH8zF74GeVELfoe6Ge$N%NbIGb|VRV8klVGp+_tZDo?mXckI z2tem3yNro6D9&IHGqy|>zb#}vASYXjLoOb;U2v#*k8-UvWzo`=qLA5|)aUKHn*8ZF z%UigRrB~4hZ$Yf*Uv=RDmb!YSvwF7`ipEJbZ8YnghM!((Z_qhX9HQdF124&zCbNiv z20P>q**(Wz$$Ib5cJ2O3>1@{f8@`4b8;G0HkQL0 zYFvJX9o2IxEZ=rp+~Rv)r*;tQXhgwvvoWIRE)~Hig%|gEcedym@ z>u2<`sKaI^Z}mH~n)lD7Y0V5&1_vrb7gvUsZHr{R`^WN`xYoa}J(KrOro(2o)oKo} zS~b<4*~4xTRybpEY)iA5Rm;Y=PWF$mN_5ihA7x1mo1uZhq5grP{-HrLFfcqgaNz(y z3ifZ~(5@bI%MJDq@NbP77#tp2(?779a$DF~`zN)Jut3vn*lY-=vV{k#acVZEwRGNG zp6?7ZM9{iwrhzG_ph;KqRx;D(h|xcZBQR{%Wg$I{!^FruwrAQA`_AR{TC;yDyJ{-j z6K1?-qjPhiDyU3l-8zO%v-Re6+m?-O9$ViP+F)g188T;EqI>gA#@S+%T7`PY$z`TG z8)hiQ7278_^snib(=doR^{+?Ybt)bt=t)7YT67IN5HJt|9HClbficIOgd za5$Cohy9onSDTn++qgJcT%*G2s7iQF(K$r2d*Qy6l@R5M-PLes88N3zHB}3VIqk0C z)=Y#84|H>j9u6&fIJD@^@*{h$bv?sXsI?dFSHpC2VXxv^);XOc?8@p$@G*EWlMx`v z1LgpIrrX%&R=OmMJtfXY_v@@y8NGV9K)9#9B-f+#+IlPPpAPFG!$u5pMQLL+*lKDq zj!jMsU@o;&U=nq>x$qEOBbZS{LJ2z6=>4^NxUi22%kzZ?=I9TxoGi>J+A!?~y3=4T z<2@86oXQY2lb);Ony!r#By8K5UD&J54MoOUnnt@8CJXn6PIiiwI?*Z0Nv~5wXp$GA z-E5yNyzrtk(`j7ljnjVm6LuBBb-LSQ`~p^8LZKpZx^NGszfQN9kR{^qLtfm9jgqnp zR*_G;QBp9LoP@@9mS)fXO^F~+8?N7rTTZ8#I+Ny#x-Q(y7MgM0quagSB?yZ%)EP7? zwREt(-oi@7w795jN1bi(S37Fl#P9IBo@&7o8?04ovL3$rnwib)e5T?fvpY0^b zEIW;U4r=)S?6=!MHTrrK6Il+8+fxqHc^|CSvX;lAHQKdWi}lUcZp}4T9|K=D8JGbV z%nmDu+(>%9mD_!m__)H_3kMX}PCGkl%>}rNO|{4t!R|rcauM)OfZMDlUXfSp7&qML zFwWg3%ogCxC7%S^S&pG(oaO#&Y{OKJCCY%bp2qoqTX>|wmSC9M)#8(Qvn$NVZFSf54hn+VZ{zS(hcS?5B6-lL_R zOhItP{_RXVqvzw`_Vq$gp^JV?Qucrki1jvPX+v)tbq$J{Rpl+Bbwfv@KiMt24bHbhl!sPtSe53Y9NBvamm?5^&M6;PW#vlr{fvcCEMe}oQjv$gU<94#lfQ_erx?B+YioW`tZ7BW0ppj=Ei#q zhGV82OIO}+&XM%x@C`@1!$vGW356)B1_s8v%?H=er*A7>r#i0_WK%fX;-Cds>Tc%+ z+AFWw!ZsCtQKyAkG#w{+C&W;n#Y`F8zHWrxce-2U;RadibmxW6AdfsRop+4a++Kq0 z(MIZLlH$*JGIhYyR2B{-UUf~*BP)H5Qx8%8o;GXS!rms{tP9WM%WvSAVqZ$z@^bak zl7q>5uN+idkNICFJ&O2q)?rH6knuEa^>}+@n9R~4{C)3up>R6>`HH~ zJ}yX1d->FWA8EfZtc#l(UMpgcMHh6ATRO{~?b^?}zAiBLgP!)I1Nqelzu5Wwur6ef z9Qz5P#Z6RgY+)Z^YlhCpAS=PnRq+MFD#%dxFs-9TQP_*Jd}}KqdC9PR&jz>_e~Hks zg}AsYOCZvHpK$I}XCksZKtItuG{H>wmH=WNKvNgyHOJA@6K*ag8L z@QOO$F5If;Xzspg$ho;8^v<*v6yG-5+_O#*%bO1s`cG2opZ$6vZ+pq7hf?nq0wo&L zdM2HBUcIe^=tniqk%Ifo!3DB?T3yiYX62L{g^Juqk3xd{SB$(K&sgns=&WAc#xS{| zwEX>z9t)b_W|nprsWaXO<-1=(N?KqQxNG-pw$ladaH)OedNi(xA6qEXP(G!(Bm3fm zZ~3`B9->zm(vm+&B}F`nFq@B31=xDISCd(oM{$NV>KuW(W9%M_N=u}4v&T8S`}ByN z=|}_%+lcCz`GfBCkW3+F`;DbAL@vYY9p?+RW!zP4u?+_1k(@F)<$v^{v6Wy8p<>0n+?SY4OL}3SKE;$Ha2?UAdmYD{wfql0mPhd_VMfjem^}WMWz4~c zk2;HLkudj`Of83I+mmkKvs06`=j9%_cRSyD2u(iycR4^7JHV0N>rT-@hiLw@?Tq%G zG08wW#5QR!r|cfO!#Z^3O~}m`|JyezytBpX!0Z-ND)Syz2_+~L>-=lQIFocP#Le2R zyWYoQX87;2+F6jb4f63J&we24Hof#gVFH)l_aBT#3YTmOqfAg>NxsM8@07rY$ylo0 KSNx40@BAMN0lrEA literal 0 HcmV?d00001 diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..77a15af --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,684 @@ +# Brazilian Portuguese translation of gst-plugins-good. +# This file is distributed under the same license as the gst-plugins-good package. +# Copyright (C) 2008-2011 Free Software Foundation, Inc. +# Fabrício Godoy , 2008-2011. +# +# data flow -> fluxo de dados +# streaming -> fluxo contínuo +# clock -> temporizador +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-01-08 01:28-0300\n" +"Last-Translator: Fabrício Godoy \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Could not establish connection to sound server" +msgstr "Não foi possível estabelecer uma conexão com servidor de som" + +msgid "Failed to query sound server capabilities" +msgstr "Falha ao examinar os recursos do servidor de som" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "\"%s\" por \"%s\"" + +msgid "Internal data stream error." +msgstr "Erro interno no fluxo de dados." + +msgid "Failed to decode JPEG image" +msgstr "Falha ao decodificar a imagem JPEG" + +msgid "Could not connect to server" +msgstr "Não foi possível conectar ao servidor" + +msgid "Server does not support seeking." +msgstr "Nâo há suporte a busca pelo servidor." + +msgid "Could not resolve server name." +msgstr "Não foi possível resolver o nome do servidor." + +msgid "Could not establish connection to server." +msgstr "Não foi possível estabelecer uma conexão com servidor." + +msgid "Secure connection setup failed." +msgstr "Configuração de conexão segura falhou." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Um erro de rede ocorreu, ou o servidor fechou a conexão inesperadamente." + +msgid "Server sent bad data." +msgstr "O servidor enviou dados ruins." + +msgid "No URL set." +msgstr "Nenhum URL definido." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Entrada de áudio nula ou inválida, o fluxo AVI pode estar corrompido." + +msgid "This file contains no playable streams." +msgstr "Este arquivo não contêm fluxos reproduzíveis." + +msgid "This file is invalid and cannot be played." +msgstr "Este arquivo é inválido e não pôde ser reproduzido." + +msgid "This file is corrupt and cannot be played." +msgstr "Este arquivo está corrompido e não pôde ser reproduzido." + +msgid "Invalid atom size." +msgstr "Tamanho de Atom inválido." + +msgid "This file is incomplete and cannot be played." +msgstr "Este arquivo está incompleto e não pôde ser reproduzido." + +msgid "The video in this file might not play correctly." +msgstr "O vídeo neste arquivo pode não ser reproduzido corretamente." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Este arquivo contêm muitos fluxos. Apenas reproduzindo o primeiro %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Nenhum fluxo com suporte foi localizado. Você pode precisar instalar um plug-" +"in de extensão GStreamer RTSP para fluxos Real media." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Nenhum fluxo com suporte foi localizado. Talvez haja necessidade de que mais " +"protocolos de transporte sejam permitidos ou senão o plug-in de extensão " +"GStreamer RTSP pode estar incorreto." + +msgid "Internal data flow error." +msgstr "Erro interno no fluxo de dados." + +msgid "Volume" +msgstr "Volume" + +msgid "Bass" +msgstr "Grave" + +msgid "Treble" +msgstr "Agudo" + +msgid "Synth" +msgstr "Sintetizador" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Alto-falante" + +msgid "Line-in" +msgstr "Entrada de linha" + +msgid "Microphone" +msgstr "Microfone" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mixer" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Gravação" + +msgid "In-gain" +msgstr "Ganho de entrada" + +msgid "Out-gain" +msgstr "Ganho de saída" + +msgid "Line-1" +msgstr "Linha 1" + +msgid "Line-2" +msgstr "Linha 2" + +msgid "Line-3" +msgstr "Linha 3" + +msgid "Digital-1" +msgstr "Digital 1" + +msgid "Digital-2" +msgstr "Digital 2" + +msgid "Digital-3" +msgstr "Digital 3" + +msgid "Phone-in" +msgstr "Entrada de fone" + +msgid "Phone-out" +msgstr "Saída de fone" + +msgid "Video" +msgstr "Vídeo" + +msgid "Radio" +msgstr "Rádio" + +msgid "Monitor" +msgstr "Monitorador" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Não foi possível abrir o dispositivo de áudio para reprodução. O dispositivo " +"está sendo usado por outro aplicativo." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Não foi possível abrir o dispositivo de áudio para reprodução. Você não tem " +"permissão para abrir o dispositivo." + +msgid "Could not open audio device for playback." +msgstr "Não foi possível abrir o dispositivo de áudio para reprodução." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Não foi possível abrir o dispositivo de áudio para gravação. Você não tem " +"permissão para abrir o dispositivo." + +msgid "Could not open audio device for recording." +msgstr "Não foi possível abrir o dispositivo de áudio para gravação." + +msgid "Could not open audio device for mixer control handling." +msgstr "" +"Não foi possível abrir o dispositivo de áudio para manipulação do " +"controlador do mixer." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Não foi possível abrir o dispositivo de áudio para manipulação do " +"controlador do mixer. Não há suporte a este elemento com esta versão do " +"Sistema Aberto de Som (OSS)." + +msgid "Master" +msgstr "Principal" + +msgid "Front" +msgstr "Frontal" + +msgid "Rear" +msgstr "Traseira" + +msgid "Headphones" +msgstr "Fones de ouvido" + +msgid "Center" +msgstr "Central" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Lateral" + +msgid "Built-in Speaker" +msgstr "Alto-falante interno" + +msgid "AUX 1 Out" +msgstr "Saída aux. 1" + +msgid "AUX 2 Out" +msgstr "Saída aux. 2" + +msgid "AUX Out" +msgstr "Saída aux." + +msgid "3D Depth" +msgstr "Profundidade 3D" + +msgid "3D Center" +msgstr "3D central" + +msgid "3D Enhance" +msgstr "Realce 3D" + +msgid "Telephone" +msgstr "Telefone" + +msgid "Line Out" +msgstr "Saída de linha" + +msgid "Line In" +msgstr "Entrada de linha" + +msgid "Internal CD" +msgstr "CD interno" + +msgid "Video In" +msgstr "Entrada de vídeo" + +msgid "AUX 1 In" +msgstr "Entrada aux. 1" + +msgid "AUX 2 In" +msgstr "Entrada aux. 2" + +msgid "AUX In" +msgstr "Entrada aux." + +msgid "Record Gain" +msgstr "Ganho de gravação" + +msgid "Output Gain" +msgstr "Ganho de saída" + +msgid "Microphone Boost" +msgstr "Aumento do microfone" + +msgid "Loopback" +msgstr "Loopback" + +msgid "Diagnostic" +msgstr "Diagnóstico" + +msgid "Bass Boost" +msgstr "Aumento de graves" + +msgid "Playback Ports" +msgstr "Portas de reprodução" + +msgid "Input" +msgstr "Entrada" + +msgid "Record Source" +msgstr "Origem de gravação" + +msgid "Monitor Source" +msgstr "Origem de monitoração" + +msgid "Keyboard Beep" +msgstr "Bip do teclado" + +msgid "Simulate Stereo" +msgstr "Simular estéreo" + +msgid "Stereo" +msgstr "Estéreo" + +msgid "Surround Sound" +msgstr "Som surround" + +msgid "Microphone Gain" +msgstr "Ganho do microfone" + +msgid "Speaker Source" +msgstr "Origem do alto-falante" + +msgid "Microphone Source" +msgstr "Origem do microfone" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Central/LFE" + +msgid "Stereo Mix" +msgstr "Mixagem estéreo" + +msgid "Mono Mix" +msgstr "Mixagem mono" + +msgid "Input Mix" +msgstr "Mixagem de entrada" + +msgid "SPDIF In" +msgstr "Entrada SPDIF" + +msgid "SPDIF Out" +msgstr "Saída SPDIF" + +msgid "Microphone 1" +msgstr "Microfone 1" + +msgid "Microphone 2" +msgstr "Microfone 2" + +msgid "Digital Out" +msgstr "Saída digital" + +msgid "Digital In" +msgstr "Entrada digital" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Monofone" + +msgid "Other" +msgstr "Outro" + +msgid "None" +msgstr "Nenhum" + +msgid "On" +msgstr "Ligado" + +msgid "Off" +msgstr "Desligado" + +msgid "Mute" +msgstr "Mudo" + +msgid "Fast" +msgstr "Rápido" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Muito baixa" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Baixa" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Média" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Alta" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Muito alta" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produção" + +msgid "Front Panel Microphone" +msgstr "Microfone do painel frontal" + +msgid "Front Panel Line In" +msgstr "Entrada de linha do painel frontal" + +msgid "Front Panel Headphones" +msgstr "Fones de ouvido do painel frontal" + +msgid "Front Panel Line Out" +msgstr "Saída de linha do painel frontal" + +msgid "Green Connector" +msgstr "Conector verde" + +msgid "Pink Connector" +msgstr "Conector rosa" + +msgid "Blue Connector" +msgstr "Conector azul" + +msgid "White Connector" +msgstr "Conector branco" + +msgid "Black Connector" +msgstr "Conector preto" + +msgid "Gray Connector" +msgstr "Conector cinza" + +msgid "Orange Connector" +msgstr "Conector laranja" + +msgid "Red Connector" +msgstr "Conector vermelho" + +msgid "Yellow Connector" +msgstr "Conector amarelo" + +msgid "Green Front Panel Connector" +msgstr "Conector verde do painel frontal" + +msgid "Pink Front Panel Connector" +msgstr "Conector rosa do painel frontal" + +msgid "Blue Front Panel Connector" +msgstr "Conector azul do painel frontal" + +msgid "White Front Panel Connector" +msgstr "Conector branco do painel frontal" + +msgid "Black Front Panel Connector" +msgstr "Conector preto do painel frontal" + +msgid "Gray Front Panel Connector" +msgstr "Conector cinza do painel frontal" + +msgid "Orange Front Panel Connector" +msgstr "Conector laranja do painel frontal" + +msgid "Red Front Panel Connector" +msgstr "Conector vermelho do painel frontal" + +msgid "Yellow Front Panel Connector" +msgstr "Conector amarelo do painel frontal" + +msgid "Spread Output" +msgstr "Saída comum" + +msgid "Downmix" +msgstr "Mesclar canais" + +msgid "Virtual Mixer Input" +msgstr "Entrada do mixer virtual" + +msgid "Virtual Mixer Output" +msgstr "Saída do mixer virtual" + +msgid "Virtual Mixer Channels" +msgstr "Canais do mixer virtual" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +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 Sistema Aberto de Som (OSS)." + +msgid "Playback is not supported by this audio device." +msgstr "Não há suporte a reprodução por este dispositivo de áudio." + +msgid "Audio playback error." +msgstr "Erro de reprodução de áudio." + +msgid "Recording is not supported by this audio device." +msgstr "Não há suporte a gravação por este dispositivo de áudio." + +msgid "Error recording from audio device." +msgstr "Erro ao gravar do dispositivo de áudio." + +msgid "Gain" +msgstr "Ganho" + +msgid "Headphone" +msgstr "Fone de ouvido" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Erro ao ler %d bytes do dispositivo \"%s\"." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Foi obtido um tamanho de quadro inesperado de %u, ao invés de %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Erro ao ler %d bytes no dispositivo \"%s\"." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Erro ao obter recursos do dispositivo \"%s\": Ele não é um driver v4l2. " +"Verifique se ele é um driver v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Falha ao examinar os atributos da entrada %d no dispositivo %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Falha ao obter configurações do sintonizador %d no dispositivo \"%s\"." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Falha ao examinar as normas no dispositivo \"%s\"." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Falha ao obter atributos de controle no dispositivo \"%s\"." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "O dispositivo \"%s\" não pôde ser identificado." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "\"%s\" não é um dispositivo." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Não foi possível abrir o dispositivo \"%s\" para leitura e gravação." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "O dispositivo \"%s\" não é um dispositivo de captura." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "O dispositivo \"%s\" não é um dispositivo de saída." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Falha ao definir as normas para o dispositivo \"%s\"." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Falha ao obter a freqüência do sintonizador para o dispositivo \"%s\"." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Falha ao definir a freqüência do sintonizador para o dispositivo \"%s\" à " +"%lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Falha ao obter a força do sinal para o dispositivo \"%s\"." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Falha ao obter o valor para o controle %d no dispositivo \"%s\"." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Falha ao definir o valor %d para o controle %d no dispositivo \"%s\"." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Falha ao obter a entrada atual no dispositivo \"%s\". Talvez seja um " +"dispositivo de rádio" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Falha ao definir a entrada %d no dispositivo %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Falha ao obter a saída atual no dispositivo \"%s\". Talvez seja um " +"dispositivo de rádio" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Falha ao definir a saída %d no dispositivo %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Não possível adicionar buffers à fila no dispositivo \"%s\"." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Falha ao tentar obter os quadros de vídeo do dispositivo \"%s\"." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Falha após %d tentativas. Dispositivo %s. Erro do sistema: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Não foi possível obter os parâmetros no dispositivo \"%s\"" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"A entrada do dispositivo de vídeo não aceita definir uma nova taxa de " +"quadros." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Não foi possível mapear buffers do dispositivo \"%s\"" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"O driver do dispositivo \"%s\" não tem suporte a nenhum método conhecido de " +"captura." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Ainda não há suporte a mudança de resolução enquanto está executando." + +msgid "Cannot operate without a clock" +msgstr "Não é possível operar sem um temporizador" diff --git a/po/quot.sed b/po/quot.sed new file mode 100644 index 0000000..0122c46 --- /dev/null +++ b/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin new file mode 100644 index 0000000..2436c49 --- /dev/null +++ b/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/ro.gmo b/po/ro.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a0f36346fcc84d88c7e501b04a6d9e39ff0e5903 GIT binary patch literal 14664 zcmchd36LCDdB+=Mun|508-uz0j4eyDHM57XFe}TJw5wx{)>`k%vK0)Zccy2y?V0Xz zPq(BM1RDzy+i|!rV=##^V2%(B7(x+qSp<_Jhe<+05sreSDlVv^2&71na>(!h`gPCD zY9&i{DpUK-ug`aU?|a|--Z%S$XPxj)kI((c3y?!k@w{Ka*3wE^UM- z!yWKxa1T5Q*5Gp3a_9Tp{hQqRZSMT-@Tolaet06h2R<8q0-gZB235{CAb;Ms`FcM5 zF;qML2R;v;@(j=8&s)XUli|yt+J6ar5!?e+&wi-(-Uwd;Z-*-Ht8g{^KCHqMpXqrk z;W~Ied=-2td?UOOJ^=OnhG%)+ZrFr3z%Rk8;qd96cLBTwUIRY^*TR#}@VxWjMtCj^ zp!#>K<2#`A`T;0?e%$eX$1g+a>6_4p55rY(ElN{6uZ1s$2jM9Eu;X{3`g!u1p0^FI zg6m)hj=+yV_4~U}@169VyuIt8+8aal_Z@H}{F1x=Td01V_gv4r2yTb!=j))x@6!+y z@;(nK+Is+^3hy5vP51uYU4Inn`7_SS+i@1u_-=<9->adfhtl)+A%ET@e5u@JRHkyzhNr;u;4(N0RnIyo`@R&)p0+t& z;dm9)bJs#WSBHAP?e5>;xF4#WH$vItZI17Tn4otLRDbV>n40%>sP_Mp#0X1J{pz6H}^5-@9Qhf)Z%DojzUvGnY z?=E-$Zg>A)D81eX)t)axn&SPHJO4L0#QCqF`hDID^YVwF+H(<ak~YgTJH|Hl>z-6RDT}D8AzWepPQHS zT&Q+bpzQ9YQ1fvDN0Rmf6u}VoZkX99)Ah1giku( z^Zo?R!k5DTg!8b%;N1e>1w(lDD%t>Vg)w{xZh;q5*~Rd6Q15>p%3gjB)t}!up3GoB zjq?{du5uiO($^*MAlwe+AHN0VU!Qzo&WoV>GY_}Jd*M0o7qAIWUqc_@Yv4}!w{R;w z8)Lf!HlW)3K`8rq1WFI*qSR~QtKfS0MW}xK8onG34ds6PHSj5%{{?(1{2FAb@V*IU zUq5vGZz#Kb4wK;NunM=qF{p968EU@28J-G11~vX)fG5E3z!Ty39Dm~YQz-rY5aL$UlGk%4)cqGjOvqc~I1N>93RT|%Tn2A}r@-4C-wRdmy^f!9{Bw8zD^UIZ8>o8z z(eZ~+dU*t%1b+^f!~b$z#vsc6PleBf=fczAMNsc;aeO&c{Z~S@a}QK`^HA-*0bT(! z_+@wq-UQ#kBC6+}@{+vXQ=!T^3u?Ze17#-{LDhFPl>T1n7(tbPqq~0)s(rUQ-T^gk zAB7sX&q1~CVJJKO5mbNA{)boGm_yeeZ z{0vHOzjEhKU6;RiD%ABCLXFE1R6Eu|>0=XA`IkerYY$X;uZFu}6KdXm38F&p*HH88 zLX02N@~($;&3hlL!iVAcP%o*Rl~8&da@+`2&y`U9xEgBy1n^n#KB)0HU_%L}PORxg7Z@vID6j8dH64N95=A znML*^yO0dI2a)g7=dC%sKZWl>WSa+(-$(SBM$SXtfM~q*d1DUyeLvqCH`%5>n3Xq& ztU<0tHX$b_)aDe}LSAOd!uj z=8^u-Hh1!B*g!hSg~;2HQ;@Tfw;=Z-XCR+Ku0qBTt$+HQgWQVv$PhA&j3CA5%^WNs ztB^a9Gm%#!&p>WQRwLucCy?UPatCW2U+?%?_*{3q4<^Wc$or5BkQX5zMxKLczF&jr zqdEIYL_XmpM4v6lX-KS-zRyhG@tZjQJ!B7Z1#%R7=A+(rJ0Taz%HgnOiWTw|2se2T>X%I+_SN>AViM zMDu=B3%pHNU1LVfWaJKZW~n_IEiR3k;*xvDo@VthHl3EgFz45 zY>wk@>TPc6=6D=MK`o6FcfK`=qts0MQP3K=mj#PYkMLv`w$e%%nb}U@Ur(>bC%kb# zisICSb@~}L7EC?Z8`c8b{c3SD?gWXS24-KF&c|75d{b-1wd*~nn;d4y?AW@+8%H1LfyoTNdWdg82Aw>N5emrWX*ZjkI%8_Rn^ zbVC-<*SW0G2$HU$BZIB&J=snDxmMVnH?BOjLPf?|R6o4nCavlCiQf(w>aOA0zH<8- z(DplJ<&7k6AK@|7MW5|ByK)+FV%p*UAW?hLByJhBRBxfC{=OgAduG=>x4cdjiOI^#fQ@t6qf;L0`*!35tdK^zORjd(F&0HW`$htvYHT#VH zJX-KOomN=$WgN#-?Eib0&7L?j^*CCYGGKcH!#rq*U8`}d$&Q!Qo{#cl_aq5waZ*2~ zQSUwa#M;nj$VOI}1il);NYu@~Bus5%+;Caf=O!pq-0!4W((Bxk58(|uID|q06QSRX z@Lyrgn+Tg>>bK+zi$l3TcU&1Mk4DR*wcbR$FJhi}TjUiD(^BnIOZ>U8MPq}m?L=Rv z#>^zntE&<6&EA)^Mom2lnH5ztJ|Eyh!-fgtw83I9w~(szMYFnkqz4Cm zMDH;-zV6Mo}6^o>g-RZ3AZA&ov@iOSLr~SqE-wIf17oRWv?DmPNNpCw2m(lUc z9`=s9-uAFL?@dOPrrJCyo6En=6uxj$@u%#bV68l^`>Aglt$1G%Kn~u~6!F`|y~~Lu zy_W|IbFrV)&E_EJc#6~tty)TxI>0eojOJLIgJ$iB&JB*fSBUX|d)s3VR-1;UOBa_l2<6dP%23TNnD!J3>f zs90{OIV-w5)qpreO(@EkquEi}}GQl2(WJ8^OVV8h4Ao?S0(DWc&NNi!-X6+#1 zGG}(pPMctV8bmg-=(I8d=*Q74Su;&zse6pF?TnrYu&Fj9=sU&WB(7lUc{>{oZ)fD~ zq-V|kjfK0gw2|*rT<2j$xe;?9<=cUs9-s1%%BVN3sm=bw9mLq&bQtyTbL{ETHB1*< zrfIa@^~zHhu=GZ-h;Rp2-{~Z-XZdz-Mr)Zz{}aBnU_0c^%`X)OmY-?ljEsTeHltAohx_nq$$f*^XitZ7}66if8RBc0SCq zxXXOK;vnA^c(V%;o7i1M|GAsorSR28Omc#Ks{vszo?Cl0r&&VA1#^8wgjR-z?3d
XWD(yadweV;d)#7%i#ZK_p zp3Z%Z!s#OvTm+|mx~0k_prhVyg&fxV+atNw-C8*FZ&`;ub*{{nP{+4vT>M&%j08?; zpIg}M9^HjiRo+a}j45utDA6$84qDwsm-EGD@KI+|yVvI7nXjS8F?M{P?@Y(=)GLum}z#?O78!+m zvN>yZE4$(`GoPlNv7w>4ta$*p?pN74W?@7z@xXO?J}S(#u;jhWHmk&)=lvC+{Bhu8Al4pzO&E;)QAXq=3h z9a$~(BeRJK1hysNby!bkE@|28)uy|!vDqf{uVPo1QbyFwh{Y?rSfIzuOpGn-WS>m@UTZwMFV9=?_?SH(uvgnP?@qRXT7)eteLrK7ikQn9w z8|=MVtJIWI+z?fNUUvYf!dG#sUa3FF*sYB z58HF}&_@9Wa4s6Okd%t4V@-s!N!Fs2FjTz(@ugfbWwQJ*?|sH)uwte7ND7!(+q+r-P))4(hQ*OEgwTwxwtd1Kf;Ix4)Ngm#9zFO;GJQ*R{WxkuVOUp}+Ec5S zijUT8t??W^q){%jsGgCYLoZ9$>E3oPlWIJyxy;RDd9@yNQ8kSk=vp2Pxdt@RFOJ3z z2HI0bGHYd_deRQ}``6|DFZK6-QKH!-%U~4qoTWy~H#=u%&8owama9t(=#9Oa=GSO; zk+>XG*DXhzB-J`;1f~Q z<8KIah@>Z-ad}ToG2adZUrX57@z=xzOoAq>oZRdaeBC_0<`#Zz$sYB5p_@20d?Y@a zg}`)ch%*d9&kuG0fK=y;o*gi)EZ3Xfm7}Lz z2@n12v?OKSVtvAkI^QK{U1neH!q{SSdo(XLreUzNLmkgI7D~%j4Q6eZIN4L(muElx zu@NOw?HcJ6y@K2fsT=!_b?-f0_N`P$c}vU7(jMMbL}v%A&>A=w2i|f^^(Mm*Wc->{ z&pNc9#_?(`Na#!wR{LHd7O9ebu|4Tx-T|Q=iNl@wiXg4}E`ck3$|!Otd{ouq2J-3; zn<#{BzD@D6-1s)(+g}wcJ!^9kDz(V^gTWtV73x)Drg3hpu%=5_8^l+GmTVKk)&6?O z{MPmc(L;B#s^?Wv7}waO#H{TsFUMA~SE{++3gf5|HZ$9iaIjQ{;b;X9v@znhfqbd! z25pjR$J4C7(PPs`91+R_j#hO~nFTC!nN_!kwc2| z#p=MDhtKFdXevSg8_bmNdJ{n-jPQCyc~5MFnN@kpx-1)CRu+EzI_$eU$VIgqJ`(+NAFu)|(Y33uhi`IUol zEf0!ZyT*ESU^Ce+9xb(0ULi3k&t9I}Jkg?Td+|&!`Cew*3pKNp+5dEiSoZg`)KO%Y zEs$N?qrhgz4jo+Mlq_?RifuZ6FREvyU~RBTc!Evx(ggU;LkAUAM_~;^v@e!>z^cJu z2|!5pv(uw0w#fkxYfa;qd8I$uHTj_-hsvT;PvmgF zqP-ZXn|Wp*9}yM}Se)ah0ajmG3zvGpC(*sv=iiYW%Xy~W$2EQ)=}Ri~t}U8?n_4Nw zm6lUj@nIKw3I0j9l%?dCWuQgMq&P3zk;Dgjlb@4CHBZyb32TDg4M&iVkDb9RD*Q?i*J&oRr`Y=tAM$S^HF-C@t#Umb7i`w# z6xdz`M2v1Bwey^O7jr@Oz)$3MHde82yiD=9jH4D4eJbTrOfdeDtwW|9H)G$#wQns8 zFCW$~Db`_>@8M?hy7bRK@(l^=B0hxl;$WTD%jF)-?g?o_nK839F40K$j{S|{NH6tT zDYq*9SVwxK$8Do}200k07ePx^mXF8d-$3XSMJDAE>MqFT, 2010. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.23.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-08-16 03:22+0300\n" +"Last-Translator: Lucian Adrian Grijincu \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2);;\n" +"X-Generator: Virtaal 0.6.1\n" +"X-Launchpad-Export-Date: 2010-08-16 00:08+0000\n" + +msgid "Could not establish connection to sound server" +msgstr "Nu se poate stabili o conexiune la serverul de sunet" + +msgid "Failed to query sound server capabilities" +msgstr "Interogarea capabilităților serverului de sunet a eșuat" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "„%s” de „%s”" + +msgid "Internal data stream error." +msgstr "Eroare internă a fluxului de date." + +msgid "Failed to decode JPEG image" +msgstr "Nu s-a putut decoda imaginea JPEG" + +msgid "Could not connect to server" +msgstr "Nu se poate stabili o conexiune la server" + +msgid "Server does not support seeking." +msgstr "" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "Nu se poate stabili o conexiune la server" + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "Nu se poate stabili o conexiune la serverul de sunet" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" +"Intrarea audio nu există sau este nevalidă, fluxul de date AVI va fi corupt." + +msgid "This file contains no playable streams." +msgstr "Acest fișier nu conține fluxuri ce pot fi redate." + +msgid "This file is invalid and cannot be played." +msgstr "Fișierul nu este valid și nu poate fi redat." + +msgid "This file is corrupt and cannot be played." +msgstr "Acest fișier este corupt și nu poate fi redat." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Acest fișier nu este complet și nu poate fi redat." + +msgid "The video in this file might not play correctly." +msgstr "Este posibil ca fișierul video să nu fie redat corect." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Fișierul conține prea multe fluxuri. Se redau doar primele %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Nu s-a găsit nici un flux suportat. Pentru fluxuri Real media s-ar putea să " +"fie nevoie să instalați extensia GStreamer RTSP." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Nu a fost găsit niciun flux suportat. S-ar putea să necesite permiterea mai " +"multor protocoale de transport sau de altfel s-ar putea să lipsească modulul " +"corect de extensie GStreamer RTSP." + +msgid "Internal data flow error." +msgstr "Eroare internă a fluxului de date." + +msgid "Volume" +msgstr "Volum" + +msgid "Bass" +msgstr "Bas" + +msgid "Treble" +msgstr "Înalte" + +msgid "Synth" +msgstr "Synth" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Difuzor" + +msgid "Line-in" +msgstr "Linie intrare" + +msgid "Microphone" +msgstr "Microfon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mixer" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Înregistrare" + +msgid "In-gain" +msgstr "Câștig intrare" + +msgid "Out-gain" +msgstr "Câștig ieșire" + +msgid "Line-1" +msgstr "Linia-1" + +msgid "Line-2" +msgstr "Linia-2" + +msgid "Line-3" +msgstr "Linia-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +msgid "Phone-in" +msgstr "Intrare telefon" + +msgid "Phone-out" +msgstr "Ieșire telefon" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Nu s-a putut deschide dispozitivul audio pentru redare. Dispozitivul este " +"folosit de o altă aplicație." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Nu s-a putut deschide dispozitivul audio pentru redare. Nu aveți permisiunea " +"de a deschide dispozitivul." + +msgid "Could not open audio device for playback." +msgstr "Nu s-a putut deschide dispozitivul audio pentru redare." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Nu s-a putut deschide dispozitivul audio pentru înregistrare Nu aveți " +"permisiunea de a deschide dispozitivul." + +msgid "Could not open audio device for recording." +msgstr "Nu s-a putut deschide dispozitivul audio pentru înregistrare." + +msgid "Could not open audio device for mixer control handling." +msgstr "" +"Nu s-a putut deschide dispozitivul audio pentru gestionarea controlului de " +"mixaj." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Nu s-a putut deschide dispozitivul audio pentru gestionarea controlului de " +"mixaj. Această versiune a OSS (Open Sound System) nu este suportată de acest " +"element" + +msgid "Master" +msgstr "Principal" + +msgid "Front" +msgstr "Față" + +msgid "Rear" +msgstr "Spate" + +msgid "Headphones" +msgstr "Căști" + +msgid "Center" +msgstr "Centru" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Lateral" + +msgid "Built-in Speaker" +msgstr "Boxe integrate" + +msgid "AUX 1 Out" +msgstr "Ieșire AUX 1" + +msgid "AUX 2 Out" +msgstr "Ieșire AUX 2" + +msgid "AUX Out" +msgstr "Ieșire AUX" + +msgid "3D Depth" +msgstr "Adâncime 3D" + +msgid "3D Center" +msgstr "Centru 3D" + +msgid "3D Enhance" +msgstr "Îmbunătățire 3D" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Linie ieșire" + +msgid "Line In" +msgstr "Linie intrare" + +msgid "Internal CD" +msgstr "CD intern" + +msgid "Video In" +msgstr "Intrare video" + +msgid "AUX 1 In" +msgstr "Intrare AUX 1" + +msgid "AUX 2 In" +msgstr "Intrare AUX 2" + +msgid "AUX In" +msgstr "Intrare AUX" + +msgid "Record Gain" +msgstr "Câștig înregistrare" + +msgid "Output Gain" +msgstr "Câștig ieșire" + +msgid "Microphone Boost" +msgstr "Amplificare microfon" + +msgid "Loopback" +msgstr "Buclă" + +msgid "Diagnostic" +msgstr "Diagnostic" + +msgid "Bass Boost" +msgstr "Amplificare bas" + +msgid "Playback Ports" +msgstr "Porturi redare" + +msgid "Input" +msgstr "Intrare" + +msgid "Record Source" +msgstr "Sursă înregistrare" + +msgid "Monitor Source" +msgstr "Sursă monitor" + +msgid "Keyboard Beep" +msgstr "Bip tastatură" + +msgid "Simulate Stereo" +msgstr "Simulează stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Sunet surround" + +msgid "Microphone Gain" +msgstr "Câștig microfon" + +msgid "Speaker Source" +msgstr "Sursă difuzor" + +msgid "Microphone Source" +msgstr "Sursă microfon" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Centru / LFE" + +msgid "Stereo Mix" +msgstr "Stereo Mix" + +msgid "Mono Mix" +msgstr "Mono Mix" + +msgid "Input Mix" +msgstr "Mix intrare" + +msgid "SPDIF In" +msgstr "Intrare SPDIF" + +msgid "SPDIF Out" +msgstr "Ieșire SPDIF" + +msgid "Microphone 1" +msgstr "Microfon 1" + +msgid "Microphone 2" +msgstr "Microfon 2" + +msgid "Digital Out" +msgstr "Ieșire digitală" + +msgid "Digital In" +msgstr "Intrare digitală" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Căști" + +msgid "Other" +msgstr "Altul" + +msgid "None" +msgstr "Niciunul" + +msgid "On" +msgstr "Activat" + +msgid "Off" +msgstr "Dezactivat" + +msgid "Mute" +msgstr "Mut" + +msgid "Fast" +msgstr "Rapid" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Foarte scăzută" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Scăzută" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Medie" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Ridicată" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Foarte ridicată" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Producție" + +msgid "Front Panel Microphone" +msgstr "Microfon panou frontal" + +msgid "Front Panel Line In" +msgstr "Linie intrare panou frontal" + +msgid "Front Panel Headphones" +msgstr "Căști panou frontal" + +msgid "Front Panel Line Out" +msgstr "Linie ieșire panou frontal" + +msgid "Green Connector" +msgstr "Conector verde" + +msgid "Pink Connector" +msgstr "Conector roz" + +msgid "Blue Connector" +msgstr "Conector albastru" + +msgid "White Connector" +msgstr "Conector alb" + +msgid "Black Connector" +msgstr "Conector negru" + +msgid "Gray Connector" +msgstr "Conector gri" + +msgid "Orange Connector" +msgstr "Conector portocaliu" + +msgid "Red Connector" +msgstr "Conector roșu" + +msgid "Yellow Connector" +msgstr "Conector galben" + +msgid "Green Front Panel Connector" +msgstr "Conector verde panou frontal" + +msgid "Pink Front Panel Connector" +msgstr "Conector roz panou frontal" + +msgid "Blue Front Panel Connector" +msgstr "Conector albastru panou frontal" + +msgid "White Front Panel Connector" +msgstr "Conector alb panou frontal" + +msgid "Black Front Panel Connector" +msgstr "Conector negru panou frontal" + +msgid "Gray Front Panel Connector" +msgstr "Conector gri panou frontal" + +msgid "Orange Front Panel Connector" +msgstr "Conector portocaliu panou frontal" + +msgid "Red Front Panel Connector" +msgstr "Conector roșu panou frontal" + +msgid "Yellow Front Panel Connector" +msgstr "Conector galben panou frontal" + +msgid "Spread Output" +msgstr "Împarte ieșirea" + +msgid "Downmix" +msgstr "Mixaj redus" + +msgid "Virtual Mixer Input" +msgstr "Intrare mixer video" + +msgid "Virtual Mixer Output" +msgstr "Ieșire mixer video" + +msgid "Virtual Mixer Channels" +msgstr "Canale mixer video" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Funcție %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Funcție %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Nu s-a putut deschide dispozitivul audio pentru redare. Versiunea aceasta a " +"OSS (Open Sound System) nu este suportată de acest element." + +msgid "Playback is not supported by this audio device." +msgstr "Redarea nu este suportată de acest dispozitiv audio." + +msgid "Audio playback error." +msgstr "Eroare redare audio." + +msgid "Recording is not supported by this audio device." +msgstr "Înregistrarea nu este suportată de acest dispozitiv audio." + +msgid "Error recording from audio device." +msgstr "Eroare la înregistrarea de la dispozitivul audio." + +msgid "Gain" +msgstr "Amplificare" + +msgid "Headphone" +msgstr "Căști" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Eroare citire %d octeți de la dispozitivul „%s”." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "S-a obținut o dimensiune neașteptată pentru cadru, %u în loc de %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Eroare citire %d octeți pe dispozitivul „%s”." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Eroare la obținerea capabilităților pentru dispozitivul „%s”: Nu este un " +"driver v4l2. Verificați dacă este un driver v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Interogarea atributelor de intrare %d pentru dispozitivul %s a eșuat" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"A eșuat obținerea configurării receptorului %d pentru dispozitivul „%s”." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Interogarea normei pentru dispozitivul „%s” a eșuat." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Obținerea atributelor de control pentru dispozitivul „%s” a eșuat." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Dispozitivul „%s” nu poate fi identificat." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Acesta nu este un dispozitiv „%s”." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Nu se poate deschide dispozitivul „%s” pentru citire și scriere." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Dispozitivul „%s” nu este un dispozitiv de captură." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Dispozitivul „%s” nu este un dispozitiv de ieșire." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Definirea normei pentru dispozitivul „%s” a eșuat." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Obținerea frecvenței curent a receptorului pentru dispozitivul „%s” a eșuat." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Definirea frecvenței curent a receptorului pentru dispozitivul „%s” la %lu " +"Hz a eșuat." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Obținerea nivelului semnalului pentru dispozitivul „%s” a eșuat." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Obținerea valorii %d pentru dispozitivul „%s” a eșuat." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Definirii valorii %d pentru controlul %d al dispozitivul „%s” a eșuat." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Obținerea intrări curente pentru dispozitivul „%s” a eșuat. Posibil să fie " +"un dispozitiv radio." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Definirea valorii %d pentru dispozitivul „%s” a eșuat." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Obținerea intrări curente pentru dispozitivul „%s” a eșuat. Posibil să fie " +"un dispozitiv radio." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Definirea valorii %d pentru dispozitivul „%s” a eșuat." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Nu s-a putut programa memoria tampon în dispozitivul „%s”." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Obținerea cadrelor video pentru dispozitivul „%s” a eșuat." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "A eșuat după %d încercări. dispozitiv %s. eroare sistem: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Nu s-au putut obține parametrii pentru dispozitivul „%s”" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Dispozitivul de intrare video nu a acceptat noua configurare de rate cadre." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Nu s-a putut mapa memoria tampon din dispozitivul „%s”" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Driverul pentru dispozitivul „%s” nu suport nici o metodă de captură " +"cunoscută." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Schimbarea rezoluției pe durata rulării nu este incă suportată." + +msgid "Cannot operate without a clock" +msgstr "Nu se poate opera fără un ceas" diff --git a/po/ru.gmo b/po/ru.gmo new file mode 100644 index 0000000000000000000000000000000000000000..57e2706b8c1d384ae9016b7c701f557b43946ab8 GIT binary patch literal 19812 zcmds-dyrgJoyRXI8Y8UAQxWAr970TbGBXLUAweK70tp#2Av}C-&-9&{COv(}ek2UC zk_QhVkeCRHh(HAKfvZEpkdVjVTE&)It84eJ<*Ujqty*=rbS<@Nb$118Ki_lC?Y`5~ zlT0M?$KIMV-+RtI_nhDPz0bM*uP49u!GP-p%2||CUl#<&9Tx;Ao~YI!c=MZs;IF{9 zfNum1s7G_aH-MLb)4)aGbZ`ZDHF&*m{~V}(Py70)uaALD6?_wXJ@_5)H1PZ2Yr+2n zHQw*QH-RsMZwF6$i=$^2cqa9WK^_I&;PGGv)H?dXcY=3-n&$~nbblF~5AFpu-mkz} z;Ixw+c7Uza-w)0Nw}R(^d%%mpAAz@nC!gZ_?*!LUKL~ypJmpl@4&DjA8~ibN12~Pv z%>&b*=z0)*7x*kV1NT!3xmBNEDQe8xBmoG|384D=Os}3 zIGaUq8+3xwkLy6KE99U0Zvw@iyFl@88z}xhD@w)i#=Wgs^4l*{cZyFey@Mt?=cUG z-ZCh?-RSXtQ2PEbsC7RLqQb!eQ0w@%$A1Ae&ksTI>!+aR`wb}i{|D4M{{%|z)8B!t z!7IQ5_ybV=u0dHvUl%C*S_5kS>p@-(20+bwC#dnaf*SV$Q13nNpFioJe;E{?_kg17 z5GXl*%h!Ja&ZYi)Q0qVMY&U*8D0(ge#n%O(=2-+v4y(X6@B_ZS4V3&I0Y%qypyqu6 zQ}eLn+?bB^Ag{_8oY>l+P8li)ViPY_;qjr^&f$_sNf8k zC%(-EAu+faJRaNzE&+Fd8t?m{T*c-ky%5iEo62fqn+ zgDnW{e$2D z_z0K*Pnhrg{LSD))c1f7gDWl|R)W6(#gA1NI(okb-bVctn7Ic0ICu^CGf;eKzc>hr z;N9T0;2*(N;MFK$7x*xE7x+tX5G)|HH-kR`wcg)?kQPk4)X8@ND7g%SYTpM+Z+-^!}-!=AGf|^Fc#>5jYLZfYPHuP~-0a z86xz65Ii7d`&K<1az=`x7X=d@ITzJD35g z-Uf=^OF@l$HK=jk=P?hWn!zUU9Pnun6%W1*YMlQ9HO}#uJN-BbRKIgQE(SGTA9yM_ z3_bvE1E(Da9ao^^)aP93#(N1Af8Maj`Hhpov#GxgzU$DrOjYpI)mHuzrZ3qVvm*am7HFM@V_jOZQI&j4qD7l19`jiBba9n}20 zeEU~H$@9A&e+`PS)2?#ky#u_T`W!G1?gv+bvz7H>hN}3s?hQ4}Kn;555eF zt`3Y&^IQQ+Ki>yV2aDh-;77sR!JVMqJ9&kRGt0mZ>bHOz=V?&y?+0Z+{|su}lORg^ zJ`+R@f~P3!DX*veHAUAOD3YD7{SNF}#GiLjzDf}aur=%#j zj9@mUhaw%>LK&s#+T+0bFxlVbl;|&Z2T7=%-b`6XxyiR306#$4L3s`3 z{gn9n8-Md5@ES@)X{Ef8^0$;rDf1}0mQdbG`LrrrXX;-|(X?dD(sI7Hl#TML*6wGv z6la>AVIvIYEjEk7d?_sGZgDtN8qm#>{6IS28wOXHd|28L71o)sP>2d9>g_ET!pt1Q zeQ6*x#jvnGESTP0R17n=r8mmwLp!G_=fhiuxDPYA;nv`a>uxaZW_jMEWJquP354xH4TV+JENCC@PkMD|33d$juxTe0^yl%9l)6Iv?i7 zJu8Qe)k%7mv$;|#n>XDjwNb)iDczIH76(j1 zc(oyu^G(__D(5p3N$7{}p>!cV7@}WA!`c!QBuE`h57o%*D@22nbc3;Q$7+Nhrw=t8 z%-$jmMAn5UXW(Zh2SbxoAJuzi%>Z0Ssf&_D)Mu4?m1gd?i|igQmcqeUGBv5lo=SQ% z%!Pv}$C2lcmHH@pVxLysn5HL`)|6#+%$!C`2H-+^XegKMO-qfAX4qGK$>zqWY%)=P zW(k3<4-FPGm@Qh4qjy$b@-9xwM_x%G?2QVUDM`KF^_9_(P-G)5EQDzhfFv?zLm^vg zAjX4OO1g;F zU}-v=!%EV9_#lPEQi1if#xACX+oCgR8{s-lOEG?>#t7$ISWJnRd&;7?kq|!%+M7Wc zGoiVFb5 zfP*1%Bi}pRDDoO7{W^+XP2?i&oA9=Qhz5#_+5SALSuC;s{?fpaCRm@&5x!(xv2#D{ z3{YLb6DCB24q6`bT0QvH#mhR}JNc+Eco@=Mr(z<+jWdnJB4J5Qyhq@sLUv28Y_7UB z$yW_fqq)vZl(b@oqFSB~hMT=w1C@I;1`9;`n@lvx~I zi3CckZw;;{Ee@^;hkK%QA!Du#!=XS)XUu4eVybKU9{L|5`I?y-w(-f_cOlZ^;-%oS^wTkiwYHe_=-Ia&fop*-YXt0!}w zvm4S1e5AImHdz=%fF(9WAweWE>6`>J7!j*Wg>=5C?A#0$qEgfw

aDrs$c?%Qj?- za3UOA*U5i!*lvGF1 zCCg`9VNuPd8RZr^OR`3zn0POuAZ7lT^Wr%!cO#p(F?T%fBEWy)?tyjqbpVEqOD zDShzZ$aPJzvbmZhH^q5Yqat;;p<46hbayRYzSJzw2ku6;*d1zzo!p6`)#V}6XVaKg zp4%OFCc@)tZ|Ikd?uYB3u-2id9HR%XCnrKHo|=Dy<(#&r-57Bg1@Xq#W4zq%Ath+q zj>|{IeeEmOoh8S*lSbgMkn3A(pA#ItIhw`hhI0 zs2hr_H#e0VL+fwroqa>|-WdAL=tF9GCdKOIQ9Dh4v6OOdwV3LUqKs*4ZEtJsxVW`r z`sz^LJGHXdpUtGMEcX{vYobmwP$~^|&Yjy+?!T32k#1#=#kMUf^v|8%wQ5aj5mus| zc4{#u)oD7~+B;Hh9jT6X)7IA6-Zs09i;k()Y}!RZyv_IC3g(`M*S{j!A}@uLL`=j+zK z(YBzy&D?gIdxbu2vv{YScRFTWIz6a7S=~}ORM}s>tFo`UoeiCAc0yzDji+0R-#B3C zv#IhzWvp_ba;Un!GFshi+!LLHGQ=p&o2wgDtL&*9VCZKm`xt)2KHs92>fP0ksUPj5 zLFKXPMn>CL*;^T-`9NjFFag8TV|Qf)f^7RfhS|?EIv%L(b6qylVYIr@Fw!VPJjb(V zDOMxFXX&B7cIMWgva@<8?avx})~f2(#)kUyj>hMEV!4YTHZXtTUxLu*}#Mmnnr@k7pglL z?GUSb-f%Ng*;~E0x}$P%@+V>w{Chzxv(t+c&#OT!8x>oF$}Xl8cNzz6-ae%vcS7YB zsf1mH8{A7`q;inC_UojWb&nd$h7ne_xw;9yXkB6(GTJNRX}*s>Jkw}nmFIPb4vcvX zgnN(r^^JICwkx9t103Z4a~eim9Ifm%)w}KRW0l=O^~h!d3)zmlrIPb{Pv-fq$pO=N9|iBX*MXIGSsGo=EW|E4CW)XAUX9 zfw<*sn)Aa-4yx~t`GNhwMX9nxg}*s^9(X;sDk7!96dkW$31^YgX6FFiST!e;ay)0Y zqzNJD15!k!ZI|+x1ZAA%O5@eLxgcIu3QXkzD{}b>mSMFTJyJxQ_&MUp z=2pEQ?(M4_G}Zg9|MfP;+7BMn#U3^?yoxiK3b97|J6aM)0H;j{A=M+g;m5!3TNcHiEQ{aLXlgsjI?i_!@0OR7WTxT=O ziwRI(K$^W<&belN%}B;oi7XOWWzCzdPd;V??HWTBr?s}-M$xf8jQ$a_* zvfw5hjnkG+>+D$Y^O}t9M$^8EC^l``Z4&_*tc@OTjAeWWj|bPqT%`^$rE-gRyj$!kxk=1(tfv`Fp=Aw)-7E-j*YNQ zX_#i*4f|^D*YCX`eS3x4F?*(3I8dI1Q@>)aKc!xZ!ql ziL6okUa8-1zdwu(@vwxN%1#JM*v1@EAFbMLFYWfUnZU+g8Da5``*1vb1*A2qQiFt9 zAA(@+dqBK^-4SZh2%bECb9I}wYb@@tyql=9jq_Ly!EW6y2i+Y%II4X(1{`sGbbO38 z)Eu&6%s%U(M=%|mC@8sqWplVaI6FV)Q6Nm(0vpn8mWg|`*=^h~jL3G6VsaZ^Wf&|2 z;wPG6tkFE3Y-B!MkGJpfgIeDpc@WY_Wr>$ZL!gWq+b|lltix zR8ta;fKZZSp`Y5b>*IOl6Vo1Sd9m9#1_UAw#fQ3HC&#RN`(vx&UV-Z2Y=3ZOnm%l zb2$!}V=0V~H(*Eg9B<72L;`NZuf%)tS#0z6DG~iC$URWq;aSWI5=Xp~Kby+X_NNz> zPss1Vah)`6(eMqr&`_;#IIQz=ohB-C84W5=P#JePZB@s+4t4Oy>p{f{jq`Bk(J7yF ziSzB6pV8#aj)`?H+|Z60ZZ~Ll;&5FVqRj`Tx&8xyPV%vWSM)ND2wG(b?wB2hX_|wM zaS3TVE%Cn};RxFLcN_{@Bh?`QGY(rO$LZ=;S!cts@?<6zRGK{T_A=p__D&7mwRdW4 zV(-+@R1<`ZL!Vwq79@Z7CBh2(QNn{ga)x*~61xVZ++dLt8u)=rV;_Fz(%2O1IZn+g z6>4b>0DB#0zVX4Mk^}1jq&sLLyp?X%KM5d|ah^i`Vm(Brswn?vd*E)ZC0Lg!=eB2( zK@%I{_%-q!H`N6F4l18Q&h{gi^ws)d{qBbG(S7A3R$HZ~F5dcMeIC~LNOg_YOG-?e z90|FPVj9;jDds|riQ+E%&6=gypY~{5qwe-hNp@-F`W)c~uLDuYp9$#!Lz3@0@)f!! z`BuU1t6?vpY*$L78RHKcG}OPFSmwxj+0an2T0HpaY_Lk zay=v1H8tUtU#gv01{sGz;+sAWJqvL(HT)3hRbYe-FHd1tq&|8U8z$EG_BCDq$1A0=OD;Ze(;L-r(B+8&3(IHVo^`BdUh~Mq1vVPdgV1MIlc1ywdN;mkKhGK!;0>CGoacqv=Xe~psGw(q5a;IMY4=I+>H~xOE zHQ_cjgnR{K9N|-b^H^+S2z1#%8Ec@@B=;i*jVWWaRA?9dtg?*6#EHsbqOEci`y&Xi z6fP0t_XXr+lRep`=%%R@k3kIBdkvOt6AaF~rD}&i{!Jd&+X&VqG)gAPh^ph**f&@{ zqsrAgwLYa_imr%d;-UUd-cjB{-eC`P?IE2F3(zYv?SYRX1W{12{TZE?+FkvmPKU9Y z=!^Y5%9CzPrs7)c*P+P0@Puy0a{se``t|Zb? zc@M9+iCevFe?v7%L{XY%l|5zcv-WYzOUU{>?035yvD%y?!;>@|LDskM^q^PcSug8* z7>&S-yTp=tZ6x1f8#pcD9iMq=SK)v5Af~uqfHCM)U+{^DOlNAZj0?j-We2uT@~b7t hE!BSa)x2FyVHbM%1D#Kzzz4h!9zW=0Po^^L{{dQ&u|5C* literal 0 HcmV?d00001 diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..636b4ed --- /dev/null +++ b/po/ru.po @@ -0,0 +1,744 @@ +# Translation for gst-plugins-good messages to Russian +# This file is put in the public domain. +# +# Артём Попов , 2009. +# Pavel Maryanov , 2009. +# Yuri Kozlov , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-04-26 21:13+0400\n" +"Last-Translator: Yuri Kozlov \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Could not establish connection to sound server" +msgstr "Не удалось установить соединение с сервером звука" + +msgid "Failed to query sound server capabilities" +msgstr "Ошибка при запросе возможностей сервера звука" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "«%s» исполняет «%s»" + +msgid "Internal data stream error." +msgstr "Внутренняя ошибка потока данных." + +msgid "Failed to decode JPEG image" +msgstr "Не удалось декодировать JPEG-изображение" + +msgid "Could not connect to server" +msgstr "Не удалось соединиться с сервером" + +msgid "Server does not support seeking." +msgstr "Сервер не поддерживает поиск." + +msgid "Could not resolve server name." +msgstr "Не удалось определить имя сервера." + +msgid "Could not establish connection to server." +msgstr "Не удалось установить соединение с сервером." + +msgid "Secure connection setup failed." +msgstr "Не удалось настроить защищённое соединение." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Произошла сетевая ошибка или сервер неожиданно закрыл соединение." + +msgid "Server sent bad data." +msgstr "Сервер прислал некорректные данные." + +msgid "No URL set." +msgstr "URL не задан." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" +"Входящие аудио-данные отсутствуют или недействительны, поток AVI будет " +"повреждён." + +msgid "This file contains no playable streams." +msgstr "Файл не содержит воспроизводимых потоков." + +msgid "This file is invalid and cannot be played." +msgstr "Файл некорректен и не может быть воспроизведён." + +msgid "This file is corrupt and cannot be played." +msgstr "Файл повреждён и не может быть воспроизведён." + +msgid "Invalid atom size." +msgstr "Неверный атомарный размер." + +msgid "This file is incomplete and cannot be played." +msgstr "Файл не полон и не может быть воспроизведён." + +msgid "The video in this file might not play correctly." +msgstr "Видео из этого файла может быть воспроизведено некорректно." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Файл содержит слишком много потоков. Будет воспроизведёно только первых %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Ни один поток не поддерживается. Возможно требуется установка " +"дополнительного модуля GStreamer RTSP для потоков Real media." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Ни один поток не поддерживается. Возможно требуется разрешить дополнительные " +"протоколы передачи или же отсутствует правильный модуль GStreamer RTSP." + +msgid "Internal data flow error." +msgstr "Внутренняя ошибка потока данных." + +msgid "Volume" +msgstr "Уровень" + +msgid "Bass" +msgstr "Низкие" + +msgid "Treble" +msgstr "Высокие" + +msgid "Synth" +msgstr "Синтезатор" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Внутренний динамик" + +msgid "Line-in" +msgstr "Линейный вход" + +msgid "Microphone" +msgstr "Микрофон" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Микшер" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Запись" + +msgid "In-gain" +msgstr "Усиление на входе" + +msgid "Out-gain" +msgstr "Усиление на выходе" + +msgid "Line-1" +msgstr "Линейный-1" + +msgid "Line-2" +msgstr "Линейный-2" + +msgid "Line-3" +msgstr "Линейный-3" + +msgid "Digital-1" +msgstr "Цифровой-1" + +msgid "Digital-2" +msgstr "Цифровой-2" + +msgid "Digital-3" +msgstr "Цифровой-3" + +msgid "Phone-in" +msgstr "Тел. вход" + +msgid "Phone-out" +msgstr "Тел. выход" + +msgid "Video" +msgstr "Видео" + +msgid "Radio" +msgstr "Радио" + +msgid "Monitor" +msgstr "Мониторинг" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Не удалось открыть аудио-устройство для воспроизведения. Устройство " +"используется другим приложением." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Не удалось открыть аудио-устройство для воспроизведения. Отсутствуют права " +"доступа к устройству." + +msgid "Could not open audio device for playback." +msgstr "Не удалось открыть аудио-устройство для воспроизведения." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Не удалось открыть аудио-устройство для записи. Отсутствуют права доступа к " +"устройству." + +msgid "Could not open audio device for recording." +msgstr "Не удалось открыть аудио-устройство для записи." + +msgid "Could not open audio device for mixer control handling." +msgstr "Не удалось открыть аудио-устройство для обработки параметров микшера." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Не удалось открыть аудио-устройство для обработки параметров микшера. Данная " +"версия Open Sound System не поддерживается этим элементом." + +msgid "Master" +msgstr "Общий" + +msgid "Front" +msgstr "Фронтальные" + +msgid "Rear" +msgstr "Тыловые" + +msgid "Headphones" +msgstr "Наушники" + +msgid "Center" +msgstr "Центр" + +msgid "LFE" +msgstr "Сабвуфер" + +msgid "Surround" +msgstr "Объёмный звук" + +msgid "Side" +msgstr "Боковые" + +msgid "Built-in Speaker" +msgstr "Внутренний динамик" + +msgid "AUX 1 Out" +msgstr "Выход AUX 1" + +msgid "AUX 2 Out" +msgstr "Выход AUX 2" + +msgid "AUX Out" +msgstr "Выход AUX" + +msgid "3D Depth" +msgstr "3D глубина" + +msgid "3D Center" +msgstr "3D центр" + +msgid "3D Enhance" +msgstr "3D улучшение" + +msgid "Telephone" +msgstr "Телефон" + +msgid "Line Out" +msgstr "Линейный выход" + +msgid "Line In" +msgstr "Линейный вход" + +msgid "Internal CD" +msgstr "Внутренний CD" + +msgid "Video In" +msgstr "Видео вход" + +msgid "AUX 1 In" +msgstr "Вход AUX 1" + +msgid "AUX 2 In" +msgstr "Вход AUX 2" + +msgid "AUX In" +msgstr "Вход AUX" + +msgid "Record Gain" +msgstr "Уровень записи" + +msgid "Output Gain" +msgstr "Выходной уровень" + +msgid "Microphone Boost" +msgstr "Микрофонный усилитель" + +msgid "Loopback" +msgstr "Петля" + +msgid "Diagnostic" +msgstr "Диагностика" + +msgid "Bass Boost" +msgstr "Усиление баса" + +msgid "Playback Ports" +msgstr "Порты воспроизведения" + +msgid "Input" +msgstr "Вход" + +msgid "Record Source" +msgstr "Устройство записи" + +msgid "Monitor Source" +msgstr "Устройство вывода" + +msgid "Keyboard Beep" +msgstr "Озвучка клавиатуры" + +msgid "Simulate Stereo" +msgstr "Имитация стерео" + +msgid "Stereo" +msgstr "Стерео" + +msgid "Surround Sound" +msgstr "Объёмный звук" + +msgid "Microphone Gain" +msgstr "Уровень микрофона" + +msgid "Speaker Source" +msgstr "Устройство динамика" + +msgid "Microphone Source" +msgstr "Устройство микрофона" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Центр / Сабвуфер" + +msgid "Stereo Mix" +msgstr "Стерео микширование" + +msgid "Mono Mix" +msgstr "Моно микширование" + +msgid "Input Mix" +msgstr "Микширование входа" + +msgid "SPDIF In" +msgstr "Вход SPDIF" + +msgid "SPDIF Out" +msgstr "Выход SPDIF" + +msgid "Microphone 1" +msgstr "Микрофон 1" + +msgid "Microphone 2" +msgstr "Микрофон 2" + +msgid "Digital Out" +msgstr "Цифровой выход" + +msgid "Digital In" +msgstr "Цифровой вход" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Модем" + +msgid "Handset" +msgstr "Гарнитура" + +msgid "Other" +msgstr "Другой" + +msgid "None" +msgstr "Ничего" + +msgid "On" +msgstr "Вкл" + +msgid "Off" +msgstr "Выкл" + +msgid "Mute" +msgstr "Заглушить" + +msgid "Fast" +msgstr "Скорость" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Очень низкое" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Низкое" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Среднее" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Высокое" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Очень высокое" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Выдача" + +msgid "Front Panel Microphone" +msgstr "Микрофон на передней панели" + +msgid "Front Panel Line In" +msgstr "Линейный вход на передней панели" + +msgid "Front Panel Headphones" +msgstr "Наушники на передней панели" + +msgid "Front Panel Line Out" +msgstr "Линейный выход на передней панели" + +msgid "Green Connector" +msgstr "Зелёный разъём" + +msgid "Pink Connector" +msgstr "Розовый разъём" + +msgid "Blue Connector" +msgstr "Синий разъём" + +msgid "White Connector" +msgstr "Белый разъём" + +msgid "Black Connector" +msgstr "Чёрный разъём" + +msgid "Gray Connector" +msgstr "Серый разъём" + +msgid "Orange Connector" +msgstr "Оранжевый разъём" + +msgid "Red Connector" +msgstr "Красный разъём" + +msgid "Yellow Connector" +msgstr "Жёлтый разъём" + +msgid "Green Front Panel Connector" +msgstr "Зелёный разъём на передней панели" + +msgid "Pink Front Panel Connector" +msgstr "Розовый разъём на передней панели" + +msgid "Blue Front Panel Connector" +msgstr "Синий разъём на передней панели" + +msgid "White Front Panel Connector" +msgstr "Белый разъём на передней панели" + +msgid "Black Front Panel Connector" +msgstr "Чёрный разъём на передней панели" + +msgid "Gray Front Panel Connector" +msgstr "Серый разъём на передней панели" + +msgid "Orange Front Panel Connector" +msgstr "Оранжевый разъём на передней панели" + +msgid "Red Front Panel Connector" +msgstr "Красный разъём на передней панели" + +msgid "Yellow Front Panel Connector" +msgstr "Жёлтый разъём на передней панели" + +msgid "Spread Output" +msgstr "Развёрнутый вывод" + +msgid "Downmix" +msgstr "Низведение" + +msgid "Virtual Mixer Input" +msgstr "Вход виртуального микшера" + +msgid "Virtual Mixer Output" +msgstr "Выход виртуального микшера" + +msgid "Virtual Mixer Channels" +msgstr "Каналы виртуального микшера" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Функция %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Функция %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Не удалось открыть аудио-устройство для воспроизведения. Данная версия Open " +"Sound System не поддерживается этим элементом." + +msgid "Playback is not supported by this audio device." +msgstr "Воспроизведение не поддерживается данным аудио-устройством." + +msgid "Audio playback error." +msgstr "Ошибка воспроизведения аудио." + +msgid "Recording is not supported by this audio device." +msgstr "Запись не поддерживается данным аудио-устройством." + +msgid "Error recording from audio device." +msgstr "Ошибка записи с аудио-устройства." + +msgid "Gain" +msgstr "Уровень" + +msgid "Headphone" +msgstr "Наушник" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Ошибка чтения %d байт из устройства «%s»." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Получен неожиданный размер кадра: %u вместо %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Ошибка чтения %d байт из устройства «%s»." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Ошибка получения возможностей устройства «%s»: драйвер устройства " +"несовместим с v4l2. Проверьте, не использует ли устройство драйвер v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Ошибка запроса атрибутов входа %d устройства %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Ошибка получения установок тюнера %d устройства «%s»." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Ошибка запроса стандарта устройства «%s»." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Ошибка получения атрибутов управления устройства «%s»." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Не удаётся распознать устройство «%s»." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "«%s» не является устройством." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Не удалось открыть устройство «%s» для чтения и записи." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Устройство «%s» не является устройством захвата." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Устройство «%s» не является устройством вывода." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Ошибка установки стандарта устройства «%s»." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Ошибка получения текущей частоты тюнера устройства «%s»." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "Ошибка установки текущей частоты тюнера устройства «%s» в %lu Гц." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Ошибка получения мощности сигнала для устройства «%s»." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Ошибка получения значения управляющего параметра %d устройства «%s»." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Ошибка установки значения %d для управляющего параметра %d устройства «%s»." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Не удалось определить активный вход устройства «%s». Возможно, это радио-" +"устройство" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Не удалось выбрать вход %d для устройства %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Не удалось определить активный выход устройства «%s». Возможно, это радио-" +"устройство" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Не удалось выбрать выход %d для устройства %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Не удалось добавить в очередь буферы устройства «%s»" + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Ошибка при попытке получения кадров видео с устройства «%s»." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Ошибка после %d попыток. Устройство: %s. Системная ошибка: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Не удалось получить параметры устройства «%s»" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Устройство видео-захвата не приняло новый параметр кадровой частоты." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Не удалось распределить буферы устройства «%s»" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Драйвер устройства «%s» не поддерживает ни один из известных методов захвата." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" +"Изменение разрешения видео во время выполнения не поддерживается в настоящий " +"момент." + +msgid "Cannot operate without a clock" +msgstr "Операция невозможна без часов" + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Не удалось создать список видео-форматов, с которыми может работать " +#~ "устройство «%s»" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "Неподдерживаемый тип буфера, либо индекс вне диапазона, либо буферы не " +#~ "были распределены, либо неверные значения длины или userptr (устройство " +#~ "%s)" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "Ошибка при попытке получения кадров видео с устройства «%s». Не хватает " +#~ "памяти." + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "не хватает памяти для постановки в очередь буфера пользовательского " +#~ "указателя (устройство %s)" + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "В пуле не найдено свободных буферов для индекса %d." + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "Устройство «%s» не может осуществлять захват в разрешении %dx%d" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "Устройство «%s» не может осуществлять захват в указанном формате" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "Не удалось получить буферы устройства «%s»" + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "Не удалось получить необходимое количество буферов устройства «%s»" + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Ошибка при запуске потокового захвата с устройства «%s»." + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Ошибка при остановке потокового захвата с устройства «%s»." + +#~ msgid "Could not read from CD." +#~ msgstr "Не удалось прочитать CD." + +#~ msgid "Disc is not an Audio CD." +#~ msgstr "Диск не является аудио-CD." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Файл зашифрован и не может быть воспроизведён." + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "Ошибка получения атрибутов управления устройства «%s»." + +#~ msgid "Could not set parameters on device '%s'" +#~ msgstr "Не удалось установить параметры устройства «%s»" + +#~ msgid "Device '%s' cannot capture at %d/%d frames per second" +#~ msgstr "" +#~ "Устройство «%s» не может осуществить захват при %d/%d кадрах в секунду" diff --git a/po/sk.gmo b/po/sk.gmo new file mode 100644 index 0000000000000000000000000000000000000000..d6afaebc562bfa9168ce84e36186dec4bc19e766 GIT binary patch literal 15146 zcmchd3y>T~d4PvtV=No|;9)S2G}y9btXF-Hvv4 zW<8IU_JBAL8-i^?2#|;4U>~*v3LG&uCU7n(1$#k@j=g)7!v(HP%aSnVn`L$5mxgJWtr{ERvEl}$F zAiNAdZ1`1JB!AlZmUSsy4=;f?!`H)i!rR~yl<$ULWLbM)1>OoDhd08)i!JMQ@D6wr zd>F2WXEI3X*Cu!|yaiqa-vMR34;elTMc$7?k@G(oe%bJAP~`UC(1zcKYv9C7)BYZS zuO)vU9D-jk{0WqCuerdocEC}16}%e`!Zwug{{+f+7r!j+_l;2cdl%I5f}6>I)jWU2 z%hPdehF9{u0%g4SK$*{fhNzbHB%}-0S0JLYeh3kbbsCc?&tDFu`~Z}GTnS~qE0BLy z#2?Xz_d*%RhoO{Tf+DBCgCfT-n&-!$$muIk+W#h$a^Ha>-ycD`VEqD0eHZXY>RS(A z05`zr!tGG%xekgRPeIYEn+;2bE|hW&DCG`7`TiZ|{T+sPL+R%Spy=g?4L=S=pFay_ zoL_{fr1cdj{r{ffkD#>kQz-KJC6xAF$Rd{hUjSu%uY@wcYv7;2x4;noFO+ibtJ41Y zP}WZfrTqj_#CjK$b{~LJ{~;*#J_2Q2N6h;#nDv?R zW&ER1>YsqppBtdabuW~5Y$)?khXe4fCjSX2^R@(~U&o-d`*rx+@HS-xJ0m7P2H!w_3d%aU8_N250LuFLTPXeh z5|r^h2~i2_TTtfnmr&;OT#Ulco}oBT18{|1!reqf$I1!bJ4txo0tYKZByE`rjps~}ymc0lR(K1f%sc_{7P3q>zK z4ljY9giNjVZ&3RAV<`Rk1>6A7q>y~S6>f$VC~|)Yz8*daWuDGrlCFUp;WqeI_-^=l zxCM@_u`CbX1#gE>!34hjvh=(Efnx86m|UsnK}ZqnTTtxg*_X5Tz-yuO&x11F15n2Q z9=HnLYxq&aM+^_cChwnsVwbO_GU2UI>V1GeTj9UJo$y5rlCE2~zzKLe+y#%pQTUo- zDxX<+9r^oA{<~1>yJ%f%uP5P6R&eelHoBZ<^BUox$nW} z!T&SwpUYBozq^!wF@uY=O=RZzyg3ran=K&ht=WgIb-_UECr_f9DFzTZ5* z2g>^Y2;2@o2mc0&Q*$SH7|J-WzB2u8v*8$g5znU}OU0UnQtoaj{dvFP0u;G?3QB(- zgVK-3q4f73;d$_D@FMtqcs@MuDtsDvF_iI_pp45ijG)M49?HDE3rf8ogkskofKt!b z;l=QWP|CjqWs~x+ftSN|Q1s(|Lz%aypvdF-S6kL|pxC01 zknSVN^`;c5FUq~N)qCB_gTE%d#k>%G+E1D#-A~G{3%S`&dYtq!^AIuUafod5*PoLa zBZ-cDl++|i|K<84(o0A-=^m0?A16Ibs*(yM(ao2W-b)g@axLjG(wj-ybptn>O{N5Y zmvpJgw_t^I3rXf}f%JaTpOXHV^kLE=((jP+m#mFP&4U{a>rm!QF4=2+QbPJHDZ4}$ zvkMnM`@rvnqDyj#&U}t^326uE5z(`8HCKbTjGg zB)L#s?bGeiIdsoZ)=y;aZ-;LnT}HZq^fuBWX_WL@(i=&lw|_;F>#ZrQyWuv{r$~QD z65Aoy2TAWEeVX(xQjLTP>a`Za>{90D74T|ve*n&q4w9Bg4U$}wr0Yp{NruZIO_SzG zVvFQ@cM7fR=GOXvxj7fEGxv8wmn3UOu6L0BQs3bt!81uyqNpqi}%*`&+pOGFS#ia8{at)F$Cryynkp6&l73mYC_mCbS z&6Bo}0@6*S>>A=`J?RS4h&)^!snr#=J@L!28~Bp#++Vsnx>S`~N@%SgRU?icJE7c- zI*qt0H{1NG?Ux;Ei}Ia#e-PG`6NW*kf^s(p<}lRg^RuL5M7ACrG@Ceqn^I;=s&A?w#Y`nmCNLl+4aL zVWb$y%HDQraiZ8Rd2UoyxykEPnQ!leC4q z&W1t#1jP_6($N}W>X}6i>+S*3K;}9OJcT?f9sxG%p(b%au8NdYSz0&f3-g3 z6j_NDhK?;AU?wVRf9S?Nozcsiff{@1vm}a^nN4ku%}U2s*o_zy+ZlV`LYS2XmL-$V zsB6#p7(%yfjkD$5Vt!W_>78_Kl6-(_si@tcG zf-6l(x0sp#w4%I;C|cWX*JG8~v)CZn6628Z6f+aEn%gK{(t3v*R;#1zla3%#+rnUC zJ}xEFX#oF!&FSKR< zO9g*|dSbTOkbygxd%xW3ovDrhO!JYMU9oKXOGMJsiJpcccg{znqL^;a#noqOplN&T zI1qea7K-94*2D~u!k#t*{!({w#86yn) zcG}fmqIS;b_PC5zR}ZWGTWKpC(v{Z`d> z8*fQ_JLzBJ9qq(;HL8K{p!zwdX_xCeVn~jACKe_CaNI42fv&*XVY|My1D~bq{H5Jd zkvs3me!4nAR_viRdMCM}wIf97M>^h{&gQGnzjD}!d-MIv?i?K-vpOT|-bL0zL?T`d5u(1INS{7JbLt>)coD*jBS%us?N!i#=~-Y1sAb-E}yl*7Z)S6xd-! zZFQW6C9Ym3O-+%Y++dJ3hEl9gLAQ1VK|@?#ZuVQ_Oq&y0<4(m*>Q+wL-CH%7d#;A^ znbb$l71eW;%j4LD`1*`q8o_wcM&P?Kp0uI(KDtQY2TG(gjuEtW2kM5YUF>OiJKUqz zu8;P*vTnt;X*;}DZP_!XjRz9i?|Pn?H_UaIG}6zyE|d}Dep|L19Ll2JqU+37%rV5l zbO*}zWEScHJ7gT%ek4AzYJ@=?lmid5j6aAnX>Vx18{z#rIEZ)_vPAGGLS5O8X+2?> z&8eB`N#z`f9bY>i4KKkP*P}VLZizsaowX)> zYl4x@&AJF+@iJ?s>S zWM?m7+Qee;6m!g7)Ui32Nd@rYaeT2|u%6LmQ>j63GQXDPud-Z}t&HI##gMdX#SF%EC!uMMG zTbcY>H;iH&x7?@bgRvmm-!7+za+bREN>0e#Rw(NF<)Gg1ID?*C>C}XYBY%R5Gru<{ zTbc|V25RjQZ$@u0`cAC(9@&%AzoK+HYb>Oxp@PX2t+LBy0x;OR{btY9aRf9mJx=U# z!#KfmXhV&o&9EIWqQd;+bU$19%;?k}A`ErMy0Pjaita*5^Zl2~n;dO#yM@hz{-s&y z`_PBNSf#+|#i92Lsu5pubOhidKbo{Ik!^Sn#@IonP6B| zb`CGldaWiJWf>qb#XmH8e0dR2Ud43=OJ*f#Jb{ z%Llk9SeW9dEIsI!8z>A876vw`!7GQa*l_v4Amw(ku@+`zA7Oz8;jo&NNQIh7s_lg^ zs_9YT65$c1>-JY6W+2gTI+TN*onE*G~?t zC_b#B+N$xf@oin%3>F7gAzF4HdeLeyoS4069a`-ASF5tL?8KXHnAu*~&@CsuC7@H- zhFZ&!b69OCx$&w=F9~h0upOs38dg3cCmU^Ae>ICjZa1y*H*FfcOkJx6)UaCPU$bdQ zU2=)?H*UH@9uD$w=;~YiRW}uOI26U5Ff{n7sD-vR?E-#g8w%j#a*sh}sj_zTrOiru#g5IwGy(WH{AOx5lr2-NA*5XzOJx>ZWAG68N1?mh3&)LPkQowzL*>#?11l6Npu@Hth-Tq2~MTq zNwY$3IU3L?sRBu1XQ#z52r@h!2PreD?t~6bHUPhj2gNib>3F?W zMiGu4k%)0nioB%SlBj6=P>71I?8LLIMa{GqaJ~uf%rm&-qoGCt@)NIOgvU3HuvrW0 zr`C^bF!?2SYBhA^v7!pKx4ROOqoSz%Z7()$wqvY}P4EVR!~!DACiH>CUnvs-14vZyY_Iq7wtuDABq*+Ca%xctzR?qRN)cO%(V zG0uxB!hSa-a?E{K1+?`VRx=!`Gt(Y4z4k)IUOuRUy+t+6&L+RNB>Q4#EmC#G{!@HK zxj`cLoo0>XX^7BP$=(+u*?zYCSNXzd5wn0srw05`_34zmK{T&|8K@;uP_7p9_CW%} z@>@^)P`&Gd=;-iDed+82w#0_pOEJ-hR9NNqV!4{yzy3pASy9EQwI8jd8$?iIway1M z9YyX@Q06Zd?Tp$>_&*W*bgCi!q^ZVHWzJ#giX9#uPGk6a?H5`9Lor6;)^_5`gP(cqMD zoJv3GPKHbcB9#e0iK?>gy*sUX9VYU9uK&cP_j;|WjmO#$vtd{4X3gd_M{K&Edas=G zj_k8_$nxy!ZTe%8-828GWLIdwsmz%4DvMyR>`b>}JyIFy$`MFBI~^=`p*z1PIo59V z+4Pv1=r=5^rq=7AE^bHXO)eI zU^%-gKUiT~B~*U&ey5T@B=qF_wMSq`Y((cMvbX0!pKo;Ne7Y+pD}T=kEvU5*S$pIx zB{ieOwKSLh)zPXwKBh1TIhk=R$ubO)-I23YjKx*$rHZ{TXcmuujjyuAv7%EzN7N_V ziw&RuA>pVRGuLz?pZ|H0Mb>juCLwf_HT$GIu+vC8)S-5$W9|9xrW@@CWAOv=pqCG_ z2k&k#&et4kr)P5vF{dH+d8;$M-8&tA&nA7y+8ac!mpWVZOcxSMrXI)K6eC|DUXp)6 zU>Vz4-tm7P$|1P)Gz9Ix~SiJwtp2+iz(&xyZIh+pqq^A5peEBN{5i8>mOZUg{Hgl)3+(3Nrli--N1g4uDHtwiD!t?qBMJL zb0e|*qeo=$-8I?gS)XM&Cd#)bRcetyy6}4P-H^Y8gvAIIQU|h|HOpd(!_UfY9QUM8 zCnmEnNLjXa;&&}EtXX8l$sERX49ibpOz0lZOcWXG7{DoQFg53@sIk*ApPAS6|1>7GS!AXb$bY?G@Rvw z3 z4o>XOi@C}aiyME%5g?mo6Axjx>yA{L62>}@!L29!7#8FF%4U~MI_Ir4Qr={@kU#?d zZb^RjGls!;w6Us&5`(Gnq89teB<(|5R<_qtWLHJ9X?wCz(N#NUqZLVN3)sp`V9(c` zZz;8ixE5615A<9z0i0g4?MZd?pU9gI6w2C`A1t&yOkcEt=@?dypFTS|dyRHL^eB3o z=L6qqFEu>T&yy;i8TtN&bEmn^#AI$XMuo1m`1NA>NZlp!X14e=i*F_SVE%WERQLC0 zt`-p}{T~nXV`h>6FDbudpp>#Rp+jO*I|qW!@q*ul#BU2~MeBMA7V@i4Q+~{lbFYJ> w(;${@+=~9MQVs6^9Xof#&)7Ir)>gK#Ts(GVw$Bnjde|d?)wK&f`95F#KZVV~8~^|S literal 0 HcmV?d00001 diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..fc0e190 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,836 @@ +# Slovak translations for gst-plugins-good. +# This file is put in the public domain. +# +# Peter Tuhársky , 2007, 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.25.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-11-08 15:48+0100\n" +"Last-Translator: Peter Tuhársky \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\\n\n" +"X-Generator: KBabel 1.11.4\n" +"X-Poedit-Country: SLOVAKIA\n" + +msgid "Could not establish connection to sound server" +msgstr "Nepodarilo sa nadviazať spojenie so zvukovým serverom" + +msgid "Failed to query sound server capabilities" +msgstr "Nepodarilo sa zistiť schopnosti zvukového servera" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' od '%s'" + +msgid "Internal data stream error." +msgstr "Vnútorná chyba prúdu údajov." + +msgid "Failed to decode JPEG image" +msgstr "Nepodarilo sa dekódovať obrázok JPEG" + +msgid "Could not connect to server" +msgstr "Nepodarilo sa pripojiť k serveru" + +msgid "Server does not support seeking." +msgstr "Server nepodporuje zmenu pozície" + +msgid "Could not resolve server name." +msgstr "Nepodarilo sa preložiť názov servera." + +msgid "Could not establish connection to server." +msgstr "Nepodarilo sa nadviazať spojenie so serverom" + +msgid "Secure connection setup failed." +msgstr "Nastavenie bezpečného pripojenia zlyhalo." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Vyskytla sa sieťová chyba, alebo server neočakávane uzavrel spojenie." + +msgid "Server sent bad data." +msgstr "Server odoslal chybné údaje." + +msgid "No URL set." +msgstr "Nebolo nastavené URL." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Žiadny alebo chybný vstup zvuku, prúd údajov AVI bude poškodený." + +msgid "This file contains no playable streams." +msgstr "Tento súbor neobsahuje žiadne prehrateľné prúdy údajov." + +msgid "This file is invalid and cannot be played." +msgstr "Tento súbor je chybný a nedá sa prehrať." + +msgid "This file is corrupt and cannot be played." +msgstr "Tento súbor je poškodený a nedá sa prehrať." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Tento súbor je neúplný a nedá sa prehrať." + +msgid "The video in this file might not play correctly." +msgstr "Video v tomto súbore možno nebude hrať korektne." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Tento súbor obsahuje príliš mnoho prúdov údajov. Prehrávam iba prvý %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Nenašiel sa žiaden podporovaný prúd údajov. Možno je potrebné nainštalovať " +"zásuvný modul GStreamer RTSP pre prúdy Real media.." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Nenašiel sa žiaden podporovaný prúd údajov. Možno by ste mali povoliť " +"viacero prenosových protokolov, alebo vám možno chýba správny zásuvný modul " +"GStreamer RTSP." + +msgid "Internal data flow error." +msgstr "Vnútorná chyba toku údajov." + +msgid "Volume" +msgstr "Hlasitosť" + +msgid "Bass" +msgstr "Basy" + +msgid "Treble" +msgstr "Výšky" + +msgid "Synth" +msgstr "Syntetizér" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Reproduktor" + +msgid "Line-in" +msgstr "Linkový vstup" + +msgid "Microphone" +msgstr "Mikrofón" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mixér" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Nahrávanie" + +msgid "In-gain" +msgstr "Vstupný zisk" + +msgid "Out-gain" +msgstr "Výstupný zisk" + +msgid "Line-1" +msgstr "Linka-1" + +msgid "Line-2" +msgstr "Linka-2" + +msgid "Line-3" +msgstr "Linka-3" + +msgid "Digital-1" +msgstr "Digitál-1" + +msgid "Digital-2" +msgstr "Digitál-2" + +msgid "Digital-3" +msgstr "Digitál-3" + +msgid "Phone-in" +msgstr "Telefón-vstup" + +msgid "Phone-out" +msgstr "Telefón-výstup" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Rádio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Zariadenie už " +"používa iná aplikácia." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Nemáte " +"oprávnenie na otvorenie tohto zariadenia." + +msgid "Could not open audio device for playback." +msgstr "Nepodarilo sa otvoriť zvukové zariadenie vrežime prehrávania." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Nepodarilo sa otvoriť zvukové zariadenie v režime záznamu. Nemáte oprávnenie " +"na otvorenie tohto zariadenia." + +msgid "Could not open audio device for recording." +msgstr "Nepodarilo sa otvoriť zvukové zariadenie v režime záznamu." + +msgid "Could not open audio device for mixer control handling." +msgstr "Nepodarilo sa otvoriť zvukové zariadenie v režime obsluhy mixéru." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Nepodarilo sa otvoriť zvukové zariadenie v režime obsluhy mixéru. Táto " +"verzia Open Sound System nie je podporovaná týmto prvkom." + +msgid "Master" +msgstr "Hlavný" + +msgid "Front" +msgstr "Predný" + +msgid "Rear" +msgstr "Zadné" + +msgid "Headphones" +msgstr "Slúchadlá" + +msgid "Center" +msgstr "Stredný" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Priestorový" + +msgid "Side" +msgstr "Strana" + +msgid "Built-in Speaker" +msgstr "PC reproduktor" + +msgid "AUX 1 Out" +msgstr "AUX 1 výstup" + +msgid "AUX 2 Out" +msgstr "AUX 2 výstup" + +msgid "AUX Out" +msgstr "AUX výstup" + +msgid "3D Depth" +msgstr "3D hĺbka" + +msgid "3D Center" +msgstr "3D stred" + +msgid "3D Enhance" +msgstr "3D vylepšenie" + +msgid "Telephone" +msgstr "Telefón" + +msgid "Line Out" +msgstr "Linkový výstup" + +msgid "Line In" +msgstr "Linkový vstup" + +msgid "Internal CD" +msgstr "Vnútorne CD" + +msgid "Video In" +msgstr "Video vstup" + +msgid "AUX 1 In" +msgstr "AUX 1 vstup" + +msgid "AUX 2 In" +msgstr "AUX 2 vstup" + +msgid "AUX In" +msgstr "AUX vstup" + +msgid "Record Gain" +msgstr "Zisk záznamu" + +msgid "Output Gain" +msgstr "Výstupný zisk" + +msgid "Microphone Boost" +msgstr "Zosilnenie mikrofónu" + +msgid "Loopback" +msgstr "Spätná slučka" + +msgid "Diagnostic" +msgstr "Diagnostika" + +msgid "Bass Boost" +msgstr "Zvýraznenie basov" + +msgid "Playback Ports" +msgstr "Prehrávacie porty" + +msgid "Input" +msgstr "Vstup" + +msgid "Record Source" +msgstr "Zdroj záznamu" + +msgid "Monitor Source" +msgstr "Monitor zdroja" + +msgid "Keyboard Beep" +msgstr "Pípnutie klávesnice" + +msgid "Simulate Stereo" +msgstr "Simulovať stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Priestorový zvuk" + +msgid "Microphone Gain" +msgstr "Zisk mikrofónu" + +msgid "Speaker Source" +msgstr "Zdroj reproduktora" + +msgid "Microphone Source" +msgstr "Zdroj mikrofónu" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Stred / LFE" + +msgid "Stereo Mix" +msgstr "Stereo Mix" + +msgid "Mono Mix" +msgstr "Mono Mix" + +msgid "Input Mix" +msgstr "Vstup Mix" + +msgid "SPDIF In" +msgstr "SPDIF vstup" + +msgid "SPDIF Out" +msgstr "SPDIF výstup" + +msgid "Microphone 1" +msgstr "Mikrofón 1" + +msgid "Microphone 2" +msgstr "Mikrofón 2" + +msgid "Digital Out" +msgstr "Digitálny výstup" + +msgid "Digital In" +msgstr "Digitálny vstup" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "Iné" + +msgid "None" +msgstr "Nič" + +msgid "On" +msgstr "Zapnuté" + +msgid "Off" +msgstr "Vypnuté" + +msgid "Mute" +msgstr "Stlmiť" + +msgid "Fast" +msgstr "Rýchlo" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Veľmi nízke" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Nízke" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Stredné" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Vysoké" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Veľmi vysoké" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produkcia" + +msgid "Front Panel Microphone" +msgstr "Mikrofón na prednom paneli" + +msgid "Front Panel Line In" +msgstr "Linkový vstup na prednom paneli" + +msgid "Front Panel Headphones" +msgstr "Slúchadlá na prednom paneli" + +msgid "Front Panel Line Out" +msgstr "Linkový výstup na prednom paneli" + +msgid "Green Connector" +msgstr "Zelený konektor" + +msgid "Pink Connector" +msgstr "Ružový konektor" + +msgid "Blue Connector" +msgstr "Modrý konektor" + +msgid "White Connector" +msgstr "Biely konektor" + +msgid "Black Connector" +msgstr "Čierny konektor" + +msgid "Gray Connector" +msgstr "Šedý konektor" + +msgid "Orange Connector" +msgstr "Oranžový konektor" + +msgid "Red Connector" +msgstr "Červený konektor" + +msgid "Yellow Connector" +msgstr "Žltý konektor" + +msgid "Green Front Panel Connector" +msgstr "Zelený konektor na prednom paneli" + +msgid "Pink Front Panel Connector" +msgstr "Ružový konektor na prednom paneli" + +msgid "Blue Front Panel Connector" +msgstr "Modrý konektor na prednom paneli" + +msgid "White Front Panel Connector" +msgstr "Biely konektor na prednom paneli" + +msgid "Black Front Panel Connector" +msgstr "Čierny konektor na prednom paneli" + +msgid "Gray Front Panel Connector" +msgstr "Šedý konektor na prednom paneli" + +msgid "Orange Front Panel Connector" +msgstr "Oranžový konektor na prednom paneli" + +msgid "Red Front Panel Connector" +msgstr "Červený konektor na prednom paneli" + +msgid "Yellow Front Panel Connector" +msgstr "Žltý konektor na prednom paneli" + +msgid "Spread Output" +msgstr "Rozdeliť výstup" + +msgid "Downmix" +msgstr "Zmiešanie" + +msgid "Virtual Mixer Input" +msgstr "Vstup virtuálneho mixéra" + +msgid "Virtual Mixer Output" +msgstr "Výstup virtuálneho mixéra" + +msgid "Virtual Mixer Channels" +msgstr "Kanály virtuálneho mixéra" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d funkcia" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s funkcia" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Táto verzia " +"Open Sound System nie je podporovaná týmto prvkom." + +msgid "Playback is not supported by this audio device." +msgstr "Prehrávanie nie je podporované týmto zvukovým zariadením" + +msgid "Audio playback error." +msgstr "Chyba prehrávania zvuku." + +msgid "Recording is not supported by this audio device." +msgstr "Záznam nie je podporovaný týmto zvukovým zariadením." + +msgid "Error recording from audio device." +msgstr "Chyba pri zázname zo zvukového zariadenia." + +msgid "Gain" +msgstr "Zisk" + +msgid "Headphone" +msgstr "Slúchadlá" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Chyba pri čítaní %d bajtov na zariadení '%s'." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Nastala neočakávaná veľkosť snímky %u namiesto %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Chyba pri čítaní %d bajtov na zariadení '%s'." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Chyba pri zisťovaní schopností zariadenia '%s': Toto nie je ovládač v4l2. " +"Skontrolujte, či je to ovládač v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Nepodarilo sa získať atribúty vstupu %d zariadenia %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Nepodarilo sa získať nastavenie prijímača %d od zariadenia '%s'." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Zlyhala požiadavka norm na zariadení '%s'." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Nepodarilo sa získať atribúty ovládacích prvkov na zariadení '%s'." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Neviem identifikovať zariadenie '%s'." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Toto nie je zariadenie '%s'." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Nepodarilo sa otvoriť zariadenie '%s' pre čítanie a zápis." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Zariadenie '%s' nie je určené pre zachytávanie." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Zariadenie '%s' nie je určené pre výstup." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Zlyhalo nastavenie norm na zariadení '%s'." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Nepodarilo sa zistiť súčasnú frekvenciu prijímača pre zariadenie '%s'." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Nepodarilo sa nastaviť súčasnú frekvenciu prijímača pre zariadenie '%s' na " +"%lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Nepodarilo sa zistiť silu signálu pre zariadenie '%s'." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" +"Nepodarilo sa zistiť hodnotu pre ovládací prvok %d pre zariadenie '%s'." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Nepodarilo sa nastaviť hodnotu %d pre ovládací prvok %d na zariadení '%s'." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Nepodarilo sa zistiť súčasný vstup na zariadení '%s'. Možno je to rádio." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Nepodarilo sa nastaviť vstup %d na zariadení %s." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Nepodarilo sa zistiť súčasný vstup na zariadení '%s'. Možno je to rádio." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Nepodarilo sa nastaviť vstup %d na zariadení %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Nepodarilo sa zaradiť vyrovnávaciu pamäť na zariadení '%s'." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Nepodarilo sa získať videosnímky zo zariadenia '%s'." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Nepodarilo sa po %d pokusoch. Zariadenie %s. Systémová chyba: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Nepodarilo sa získať parametre zariadenia '%s'" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Zariadenie video vstupu neakceptovalo nové nastavenie frekvencie snímok." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Nepodarilo sa namapovať vyrovnávaciu pamäť zariadenia '%s'" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Tento ovládač zariadenia '%s' nepodporuje žiadnu známu metódu nahrávania." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Zmena rozlíšenia za chodu nie je zatiaľ podporovaná." + +msgid "Cannot operate without a clock" +msgstr "Nemôžem fungovať bez hodín" + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "Nepodarilo sa získať atribúty ovládacích prvkov na zariadení '%s.'" + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Nepodarilo sa zistiť možné video formáty, '%s' s ktorými vie zariadenie " +#~ "pracovať" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "Tento typ vyrovnávacej pamäte nie je podporovaný, alebo je tento index " +#~ "mimo medzí, alebo zatiaľ nebola alokovaná žiadna vyrovnávacia pamäť, " +#~ "alebo userptr alebo dĺžka sú chybné. Zariadenie %s" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "Nepodarilo sa získať videosnímky zo zariadenia '%s'. Nedostatok pamäte." + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "nedostatok pamäte pre zaradenie požiadavky na používateľskú vyrovnávaciu " +#~ "pamäť ukazovateľa. zariadenie %s." + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "" +#~ "Nenašli sa žiadne voľné oblasti vyrovnávacei pamäte v bloku na indexe %d." + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "Zariadenie '%s' nevie zachytávať na %dx%d" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "Zariadenie '%s' nedokáže zachytávať v uvedenom formáte" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "Nepodarilo sa získať vyrovnávaciu pamäť od zariadenia '%s'." + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "" +#~ "Nepodarilo sa získať dostatok vyrovnávacej pamäte od zariadenia '%s'." + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Chyba pri štartovaní zachytávania prúdu údajov zo zariadenia '%s'." + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Chyba pri zastavovaní zachytávania prúdu údajov zo zariadenia '%s'." + +#~ msgid "Could not read from CD." +#~ msgstr "Nepodarilo sa čítať z CD." + +#~ msgid "Disc is not an Audio CD." +#~ msgstr "Tento disk nie je zvukové CD." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Tento súbor je zašifrovaný a nedá sa prehrať." + +#~ msgid "Could not set parameters on device '%s'" +#~ msgstr "Nepodarilo sa nastaviť parametre zariadeniu '%s'" + +#~ msgid "Device '%s' cannot capture at %d/%d frames per second" +#~ msgstr "Zariadenie '%s' nedokáže zachytávať pri %d/%d snímkach za sekundu" + +#~ msgid "Could not exchange data with device '%s'." +#~ msgstr "Nepodarila sa výmena údajov so zariadením '%s'." + +#~ msgid "Describes the selected input element." +#~ msgstr "Opisuje vybraný vstupný prvok." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "Opisuje vybraný výstupný prvok pre hlasové/video konferencie." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "Opisuje vybraný výstupný prvok pre hudbu a filmy." + +#~ msgid "Describes the selected output element." +#~ msgstr "Opisuje vybraný výstupný prvok." + +#~ msgid "GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "GStreamer audiosink pre hlasové/video konferencie" + +#~ msgid "GStreamer audiosink for Music and Movies" +#~ msgstr "GStreamer audiosink pre hudbu a filmy" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer dokáže prehrávať zvuk pomocou ľubovoľného počtu výstupných " +#~ "prvkov. Možnosťami sú napríklad osssink, esdsink a alsasink. Audiosink " +#~ "môže byť čiastočne rúrou, nielen jediným prvkom." + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer dokáže prehrávať video pomocou ľubovoľného počtu výstupných " +#~ "prvkov. Možnosťami sú napríklad xvimagesink, ximagesink, sdlvideosink a " +#~ "aasink. Videosink môže byť čiastočne rúrou, nielen jediným prvkom." + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "GStreamer dokáže vsunúť vizualizačné zásuvné moduly do rúry a " +#~ "transformovať zvukový prúd údajov na videosnímky. Predvolený je goom, ale " +#~ "čoskoro bude dostupných viacero vizualizačných zásuvných modulov. " +#~ "Vizualizačný zásuvný modul môže byť čiastočne rúrou, nielen jediným " +#~ "prvkom." + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer dokáže nahrávať zvuk pomocou ľubovoľného počtu vstupných " +#~ "prvkov. Možnosťami sú napríklad osssrc, esdsrc, alsasrc. Zvukový zdroj " +#~ "môže byť čiastočne rúrou, nielen jediným prvkom." + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer dokáže nahrať video pomocou ľubovoľného počtu vstupných prvkov. " +#~ "Možnosťami sú napríklad v4lsrc a videotestsrc. Video zdroj môže byť " +#~ "čiastočne rúrou, nielen jediným prvkom." + +#~ msgid "default GStreamer audio source" +#~ msgstr "predvolený zdroj zvuku pre GStreamer" + +#~ msgid "default GStreamer audiosink" +#~ msgstr "predvolený audiosink pre GStreamer" + +#~ msgid "default GStreamer video source" +#~ msgstr "predvolený zdroj videa pre GStreamer" + +#~ msgid "default GStreamer videosink" +#~ msgstr "predvolený videosink pre GStreamer" + +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "predvolený vizualizačný zásuvný modul pre GStreamer" + +#~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "popis pre audiosink pre GStreamer pre hlasové/video konferencie" + +#~ msgid "description for GStreamer audiosink for Music and Movies" +#~ msgstr "popis pre audiosink pre GStreamer pre hudbu a filmy" + +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "popis pre predvolený audiosink pre GStreamer" + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "popis pre predvolený audiosrc pre GStreamer" diff --git a/po/sl.gmo b/po/sl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..6c7e1808a5fe123ebd43dcee72f4110e0ef65938 GIT binary patch literal 15183 zcmc(l3y>T~dB+E1gOP2(@)PqK1F|ioUEQ5zY@aP`y>*sOI__lIRv>upc5ZKOcW2f! zvn$_1VgokeVUgfqY+eZlClC_|F9QK%Cn+gK3Me2Hl{hJ=xS&E_qzDN(sluuJ{@uN^ zb0?i8Ln@h4-*0-RrypN`{q@)1>U%3szT4w^g!BT^+0XF2r#;Q{PCs2wJ@2{C^}J`p zGvR5_hkCUZJ_}v}Pla3H3b-3y3$J(2KLl0oV=n)o%RdZh%KHj@Cj16G2mTd28U6^W zzMsJ7z$f7I;TdPz{;Y-hMMIcBpnf4At)k;0E}4sQUf|u7;bs|@~?&$!?(kW;Ah}v@NeL)aOGLH{9SNA`G?@m@T{{LJG=wF9DWzx08eFb>tO)Z zue;&P;Ai1W;iFLFeZuk7bFIA3f|B2h9alT9hmzYy7{G1t68I6Q{(cj_1U?Q&;05Pd zjzf+6Hn;=6AMS)dfUkg+^F41E)}Z9@Zm92%K=uDWq58e{d3OA-g4d9L9n|xOpvLnU zTm?^Ik}id7pcy~Z{N4>uf$xQM(fc4ogx=>NBJ;lLp8p+G`NyI9^K&SDT*Dx^^+uue z<2tBuh5S+ZH$chf%~0}t2b6s8b?-my-hULTAD@IO_c6Uz%$?l@agapsP@)Et%nUzdbiPWtK%-Ha+6Ty4nTcBP{tQ&Vz6>>wUvv2%!gb_- z1~vYRUTo_hhU(8{P;$Krs+}!R^RO2V!PmI_JD}$8{ZRe-98|lHK>m4u!5<&~BV@^W zE6AvRA4;yPpyYQcR6jRDwX++l{R2?_3!v(6LY3=4$>VmY_TC1!!goRS?@@R$TyY_~ z3rFC~VGCB^y)OUfQ2qZmsP;}{F{{3nQ0=_{s-0CXzXo1Gego8cilNri9Z>7(Jy7+0 z0&08@Lh1DpsQG*hYCeAgcb-IB z6srES5cV1Hh46B?2EGi|pzPXPq2&G$)H?VlsCl~Z63a=b@7@G^DhKu5Wvl5coQFC5 zGQ1IvFqzWdJK=u#5S0BpYmJ@vF^EXKo1qWyfv3SQK*{ki)cC&*HNNjV{)gi!YpuSX z3v0Yz3)TO3Iz9p!g7+i12cE-A^}hx+?hioq`_JH%-dC;tkKh*apN5ygpTTQjmBA>V zK-uq)z$@Y3!ZCOr!jilK{zxu&LG2$$pz3=Zz7k%^!&6`no(gY+XTrBat-tp{>FuZB zbKzIuv*4p}H~hYPK13tulivha!UItDqXkcfZ-J`k5Y+egJAMK_gZvku>VE{P{5RpV z;dkI^@COjp@qP?hdfs^qTJ>K6^?o0G4!j9UU)%5um_ya`M)&@mj`ul!3aZ?nLY4al zlsvu%)vq7GXTpDmlFz?Gt+SsyK68Uz&nq1-f~s#6YMeWv>YIeB?*@1}d@WSDCe(O) zQ0wDX$P{`XfOo>L!<*p&lvU-v1~uMqLG|Oi@ND=GPEN-wRnP-UCqWeh2FN$DqdZLnyiYD_jX5hw9e~lyfya2kQCN zQ1dkj^}YpF-z|`(>)j4D{*Oc1i?2dcFI4{@cllFUG?LqyQ1kU-sD4zT#&aoD{o7oA z0!rRDLCs?eZiO8<3cm=~!k@y8@Ff^)hTz=iVLEvGuFCe;Mf$q|Kz?CViOHzvBK4yp|++JVg3EQiX&lyfvh0lKS>0(t{*jpRw@f zAWPraqCbXjb0e#X=(nX{?>2;*?C3)RQLIu1w z=~qa){>Z}ng5xZ_p7bh`bm%%#|N29BGXrlX-9Y+X(#uKGpQ}kx*Ug>%6O``zx1Z!@9jWIYybWfgyIj7H+ql`}GIzsUNF$^dkuY^;4SpK_ zD(OPf10=0?**Mt~U9TYRHFwy3$0_(Z(nnnW6u6yqr^~+|KHJ@Y3NDadNjk|r`vb>Y z;XR})NS}4j-UoM+?jYsvSp?@v4blPk>`U-9q<4~@PI@(|fBl-fc`e*UN=Q}GX{3*n zt|YA|>Dop*pY$GOxGvD2Rhhr4=5O!BGkKK6$`TYY; z&gXQqEuIVFnb6zh$6TSC227lNei`~uMPHyf-`j1BZ{v%h$WIMGe@!QQ{VLF&`ov3=7 zgDf+D{LM*{<=*C|UT(21C#lPCPm?(JCxSR^E_&Aqmu8nK*@>EYC5rv2b{I4e(3Y*< zmLQIk+>dIAESg>LYhgE<35_JH{g+8QOoKf14@UW1(#icm;+bi9PRthmI)C@}ZQd5d zT#w?qpN3h|>}aa|AotS_)we=F%6v7q5axc?X}6OUS<+6@Y1YgOCu~1Y+)R|-h4Iau zkg-m8W@p1R^BKtE-WIilSsqL`qioJEOHNs)bNVHyVN05ehZ52jJRq%&rDGf-zQW0pkKbF*p8v0LfbilCiiVvDgK zvk+#bjb-V}XKNJHV+>(5<86)VQ64m9RQtEGqwc;kT-=Qmck8{a$-$Uqi;v zt0%#9)MPASX2w_=^Qb?D70fh&f#2QG9Pw*u#GUbxE$Of8XAh5@p!X@?i za_fPRu`Z=oKRz+-2U*s6OY7#g)4HJSNSwfBkVx@0eV0tqz>b;=UH- zfj`?!4qETKy5x-(QqUT_V=5yIU5*2#(O11|af`iO;lgwhq&0tY7`8n*oqa(YO1QdV zYcLqGSZ_g3cPB|(&Nnv)y>VtVOug~27Ij))X(9%<{&4BJKT^(EZ@pC1OkXLFin3-zyW)3o&$@_WD-FAv%#N_u-?V?s zSRaITFlshsXxTW@PTPJqaORw34+h%!aBZu`S!gkVIR~PUO(gMyrY5G9uvh145NGnv z{dSt<$xPB@gTOOI&x~JoFv{@5LtIsS9IYOFo77acW6I1Sc6V~$)Px`2l83QzgWAmw z=K?dDr`9bgJ6&VrJx<+b!B2*$T#MNZoM5mtdsvy?-q~4iZ|v=5WcBiS$vrss8rUl* z)I+1Jj&q|e&P?*emT`|%8Sy5x@;O$yn*{xvh~o0`&18?=!bJZhIDxb?ugE(0X&|b; zJHFT#m`Iaa#~z3$wX=GRKjn|y2M60-`>3yMHm8|8!FDE5k%8Gz?%2bbn%FwF-5-lR zd!w~D73zdtK8c~#owh$~+?Xow&565~U~zRebVEk>!v;Mp3S{yzrm=c5B0R-X^QYBm z>S#K}A`TO;f3S7z4|l392TjLu*{FV5^NCq%XM;LA>BMV%*Te|K-d$mvGosC3c%(4>u>QS^PPcl39xgK<6m4jEOWT z&R`BRrpyd}TflliPNo!xTs&~I;862pl*^NZMN3!uh5Ws7bHRM8$)AnVEXRc`eTqIf z3t~L~85lXD ztoMFx*Y>ZJ&Sagx;cBR{fk>-@nHfSs*t&ymJ2epvG|?Vx_D5;n!EzWwjmyul!)8W> z<;Ql5Tl~!F)P7d)nQdvx8p=}x`JZV^;D zV{vRt()zj;6MOenwy;Wc(ynY}Nsam=L&GDLp^?hSus<|3Iy|&yh>L=iNe=Dm!Jyo5 zWoUh6c*GyRe02S#Ylem?x0{W%vQPU63p7bb{aq%G;O|O~+!v+(RSlD^Hj*q#uc^0g zsiH}*g&V*+B93>S2}O z-k_3EKWnZS9~<8`5ZQ2bXay2yQ=)SVZAO{1MXf`*qxedHW-drkiH+Co+g`bRP)>s& z;#Ap&w(Cqh>R&z`tEl0wSiabc{Q~9$`vJ5jBOgc zvW^A1tTB!HoqU!-c?3-xGtqp&u}~|&l=aNHy;4L`GvcCA94LBPZzj|3HtJ0$&G{qu z1>L}#NTVb7H4}dxvxt+@O2Z=$Pb;{e?1N6akXjs z@S!*&R=QQ)OBEY3Vy4wrQs<>a*MvkR6hJ}Y)oFh^4ST-!%|StL%1lVsh|FC)AGw&T zwzpOko6-8Jt2rNa6+JPcsP*e?`A6q5wKa5C!d*I$W6uV%%$kgpjvX+QXY|=jT&W|HV2FTw5=X5k-#BDV7#UT6;Sc=@ zW*9$#MS}cm?I;a!#lyIh^B@g+O%{%#^BHz8Yz6*NQQQ-4n$Gu^$1n1UZ&f+*JM1zz zAy|`I+NtZXfZn%$p(_7BhVJhnp2db;OS;&!FrL?ZTDfZtT1DsBd18u?#moucJ>~Kz z+KuH5NJ$x|*{kR|o@G1AY-h%Z-rK{FSx_kK!1SO~th4*f^02iB#j>`e4Jn88thW4lr>+K@_NlN+XZ!9d5+pk9<28cs2i9uYa|;10S2r% zof;T^v);{nEPpFu(8d(n;aKa-Rvh_t&f!|GCfZxo(j(l<*09!>QAUX60>jmEBUZ{S z1z)Fw`5X%r_4?Xk-)rqt-@k=WA$2q$OngGR$=QFeE$X26V%XYX_rO~bb z%{mo9Zs3MucsuoGV6?Bl84mW4C+S>_E3B;!uVYCC%w1V8pQMhK=8;)cz}c)x`(1Lh zx-FJ<7fWv!z+kH~trm(RcVuzHN!06x*hJZn7U4JZ69KwlC#%$FLeJ$HS^OO?a5u)q zlOM8pkQ27xG`3bNv|hL?)>{hEi(>ybiclz3P;SqPmCeU=^Modejub)aQqLFHR2pU> zB!!um{b2c#F8hg7(#13Jq>T(Fl8>IkT*@-w+?BL~RcE5yEL^!0*qO!Cvoqp{XF@5` zoOyiBW=Eb4YrO9WZ<5um_pS6%PtDkh!sAgRO=dAw{c?p1jy0oK{i6WAa;nO2)tD5c zH%X%#rFa*Ytm>?mi9S|o426Q=QxPsH^%ai%(g#Hc4iL|w^X0NfKPpO_FgU00j6*DI z5CzJdK!Sm2N_YFCENKvvu-jtNKW~@^xS)tq8?@0e0+Tw`;>YWBVDF9L(q@MEbG2vW zfKd%{PE07_v5KkqpalCEi-NUR2-1YmF`o#q5YI%EHT*nkQ)`S*Y2xUMCe|x*cDF9F z>N}hD;{3>x{QAXtIr&6f=utjJ}qb$%oKejv!2{P&?f#%u4)vldJ!o;aDC8`QGJ<|U&gvn{_+7KxnB zW(vy}ra+P~FELz=V6C0AhKb5gbF@W!gOtw^yj-+g)tG73mNsz0VqA!*>hB5WaX{un ze0>yzf9z>8k@lE~i^g;wK12lsJ)@7OF(e9ofzv9zs{$4;xFu=5&5Z z)6$*Ay<4_3`kCLH@s_DvhRKdF^c9Kc$Q9}2O@}zAJKc*}9fMoN-{qL{-9R~y^{`lx zTRCbZ_Sla;4OUoTSn$T=Rwz90Li7sZVuLt3TTirtAh1T(ogGRF?Hoa@jNVyAHMg=KnSQXb ztrqT~bjnU8p5kN;WmzoLqaO_hr6p}b_AZ=a@AnKG7c|)n%0zLDdJZ;aj4vu@P8a2o zV_?uorho93p5v=F^_zJ!P*B-eElx}nA;_l4h9dg%EO7x$NdG`Tf}&+@N6hIQ>Gc#x zjO<+Vy^a6dn0~R8o!wT&gIm?opdq4wdDK&I(uDZY4}N%cXM*yMSRPZHOj~o%!?m$y z0Wll1W{*e=*G8dx0VgoOOMG!&zgQ$WaW4J1CU=+cj){C(#X$4%4x2HvM&MNiO_6RE zPIn|QZ3I|px3&i7_M&jVq_YpUxH-|-!ik#Wmx3O#FU$+)1Ok7>*Je(frNV|uAhJFs z1Jzey6QL@4C}nFW&G;#NqiT!Y>9|epL$mv?qdk^Nw(PDE%FnjJrk!BE&30?, 2010. +# Matej Urbančič , 2010 - 2011. +# Klemen Košir , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-03-12 18:35+0100\n" +"Last-Translator: Klemen Košir \n" +"Language-Team: Slovenian \n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" +"%100==4 ? 3 : 0);\n" +"X-Poedit-Language: Slovenian\n" +"X-Poedit-Country: SLOVENIA\n" +"X-Poedit-SourceCharset: utf-8\n" + +msgid "Could not establish connection to sound server" +msgstr "Povezave z zvočnim strežnikom ni mogoče vzpostaviti" + +msgid "Failed to query sound server capabilities" +msgstr "Poizvedba o zmogljivosti zvočnega strežnika je spodletela" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' - '%s'" + +msgid "Internal data stream error." +msgstr "Notranja napaka pretoka podatkov." + +msgid "Failed to decode JPEG image" +msgstr "Odkodiranje slike JPEG je spodletelo" + +msgid "Could not connect to server" +msgstr "S strežnikom se ni mogoče povezati" + +msgid "Server does not support seeking." +msgstr "Strežnik ne podpira iskanja." + +msgid "Could not resolve server name." +msgstr "Imena strežnika ni mogoče razrešiti." + +msgid "Could not establish connection to server." +msgstr "Povezave s strežnikom ni mogoče vzpostaviti" + +msgid "Secure connection setup failed." +msgstr "Nastavitev varne povezave je spodletela." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Prišlo je do omrežne napake ali pa se je povezava nepričakovano prekinila." + +msgid "Server sent bad data." +msgstr "Strežnik je poslal slabe podatke." + +msgid "No URL set." +msgstr "Ni nastavljenega naslova URL." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Napaka vhodnega zvoka, pretok AVI bo pokvarjen." + +msgid "This file contains no playable streams." +msgstr "Datoteka ne vsebuje pretokov za predvajanje." + +msgid "This file is invalid and cannot be played." +msgstr "Datoteka je neveljavna, zato je ni mogoče predvajati." + +msgid "This file is corrupt and cannot be played." +msgstr "Datoteka je pokvarjena, zato je ni mogoče predvajati." + +msgid "Invalid atom size." +msgstr "Neveljavna velikost atoma." + +msgid "This file is incomplete and cannot be played." +msgstr "Datoteka ni popolna, zato je ni mogoče predvajati." + +msgid "The video in this file might not play correctly." +msgstr "Video zapis v tej datoteki morda ne bo predvajan pravilno." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Datoteka vsebuje več pretokov. Predvajano bo le začetnih %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Ni mogoče najti podprtega pretoka. Najverjetneje je treba namestiti vstavek " +"GStreamer RTSP za pretoke RealMedia." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Podprtega pretoka ni mogoče najti. Najverjetneje je treba omogočiti več " +"protokolov prenosa ali pa manjka ustrezen vstavek GStreamer RTSP." + +msgid "Internal data flow error." +msgstr "Notranja napaka pretočnosti podatkov." + +msgid "Volume" +msgstr "Glasnost" + +msgid "Bass" +msgstr "Bas" + +msgid "Treble" +msgstr "Visoki toni" + +msgid "Synth" +msgstr "Sintetizator" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Zvočnik" + +msgid "Line-in" +msgstr "Analogni vhod" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Mešalnik" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Snemanje" + +msgid "In-gain" +msgstr "Vhodna ojačitev" + +msgid "Out-gain" +msgstr "Izhodna ojačitev" + +msgid "Line-1" +msgstr "Analogni vhod 1" + +msgid "Line-2" +msgstr "Analogni vhod 2" + +msgid "Line-3" +msgstr "Analogni vhod 3" + +msgid "Digital-1" +msgstr "Digitalni vhod 1" + +msgid "Digital-2" +msgstr "Digitalni vhod 2" + +msgid "Digital-3" +msgstr "Digitalni vhod 3" + +msgid "Phone-in" +msgstr "Telefonski vhod" + +msgid "Phone-out" +msgstr "Telefonski izhod" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Zaslon" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Zvočne naprave ni mogoče odpreti za predvajanje. Napravo uporablja drug " +"program." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Zvočne naprave ni mogoče odpreti za predvajanje. Nimate dovoljenj za " +"odpiranje naprave." + +msgid "Could not open audio device for playback." +msgstr "Zvočne naprave ni mogoče odpreti za predvajanje." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Zvočne naprave ni mogoče odpreti za snemanje. Nimate dovoljenj za odpiranje " +"naprave." + +msgid "Could not open audio device for recording." +msgstr "Zvočne naprave ni mogoče odpreti za snemanje." + +msgid "Could not open audio device for mixer control handling." +msgstr "Zvočne naprave ni mogoče odpreti za nadzor mešalnika." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Zvočne naprave ni mogoče odpreti za nadzor mešalnika. Predmet ne podpira " +"trenutne različice sistema Open Sound System." + +msgid "Master" +msgstr "Glavni" + +msgid "Front" +msgstr "Sprednji" + +msgid "Rear" +msgstr "Zadnji" + +msgid "Headphones" +msgstr "Slušalke" + +msgid "Center" +msgstr "Sredinski" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Prostorski" + +msgid "Side" +msgstr "Stranski" + +msgid "Built-in Speaker" +msgstr "Vgrajen zvočnik" + +msgid "AUX 1 Out" +msgstr "Izhod AUX 1" + +msgid "AUX 2 Out" +msgstr "Izhod AUX 2" + +msgid "AUX Out" +msgstr "Izhod AUX" + +msgid "3D Depth" +msgstr "3D globina" + +msgid "3D Center" +msgstr "3D sredina" + +msgid "3D Enhance" +msgstr "3D izboljšava" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Analogni izhod" + +msgid "Line In" +msgstr "Analogni vhod" + +msgid "Internal CD" +msgstr "Notranji CD" + +msgid "Video In" +msgstr "Video vhod" + +msgid "AUX 1 In" +msgstr "Vhod AUX 1" + +msgid "AUX 2 In" +msgstr "Vhod AUX 2" + +msgid "AUX In" +msgstr "Vhod AUX" + +msgid "Record Gain" +msgstr "Ojačitev snemanja" + +msgid "Output Gain" +msgstr "Ojačitev izhoda" + +msgid "Microphone Boost" +msgstr "Ojačitev mikrofona" + +msgid "Loopback" +msgstr "Povratna zanka" + +msgid "Diagnostic" +msgstr "Diagnostika" + +msgid "Bass Boost" +msgstr "Ojačitev basov" + +msgid "Playback Ports" +msgstr "Vrata predvajanja" + +msgid "Input" +msgstr "Vhod" + +msgid "Record Source" +msgstr "Snemaj vir" + +msgid "Monitor Source" +msgstr "Nadzoruj vir" + +msgid "Keyboard Beep" +msgstr "Pisk tipkovnice" + +msgid "Simulate Stereo" +msgstr "Simuliran stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Prostorski zvok" + +msgid "Microphone Gain" +msgstr "Ojačitev mikrofona" + +msgid "Speaker Source" +msgstr "Vir zvočnika" + +msgid "Microphone Source" +msgstr "Vir mikrofona" + +msgid "Jack" +msgstr "Priključek" + +msgid "Center / LFE" +msgstr "Srednji / LFE" + +msgid "Stereo Mix" +msgstr "Stereo mešanje" + +msgid "Mono Mix" +msgstr "Mono mešanje" + +msgid "Input Mix" +msgstr "Mešanje vhoda" + +msgid "SPDIF In" +msgstr "Vhod SPDIF" + +msgid "SPDIF Out" +msgstr "Izhod SPDIF" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Digitalni izhod" + +msgid "Digital In" +msgstr "Digitalni vhod" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Prostoročna slušalka" + +msgid "Other" +msgstr "Drugo" + +msgid "None" +msgstr "Brez" + +msgid "On" +msgstr "Vključeno" + +msgid "Off" +msgstr "Izključeno" + +msgid "Mute" +msgstr "Nemo" + +msgid "Fast" +msgstr "Hitro" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Zelo nizko" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Nizko" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Srednje" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Visoko" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Zelo visoko" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Proizvodnja" + +msgid "Front Panel Microphone" +msgstr "Mikrofon spredaj" + +msgid "Front Panel Line In" +msgstr "Analogni vhod spredaj" + +msgid "Front Panel Headphones" +msgstr "Slušalke spredaj" + +msgid "Front Panel Line Out" +msgstr "Analogni izhod spredaj" + +msgid "Green Connector" +msgstr "Zeleni priključek" + +msgid "Pink Connector" +msgstr "Roza priključek" + +msgid "Blue Connector" +msgstr "Modri priključek" + +msgid "White Connector" +msgstr "Beli priključek" + +msgid "Black Connector" +msgstr "Črni priključek" + +msgid "Gray Connector" +msgstr "Sivi priključek" + +msgid "Orange Connector" +msgstr "Oranžni priključek" + +msgid "Red Connector" +msgstr "Rdeči priključek" + +msgid "Yellow Connector" +msgstr "Rumeni priključek" + +msgid "Green Front Panel Connector" +msgstr "Zeleni priključek spredaj" + +msgid "Pink Front Panel Connector" +msgstr "Roza priključek spredaj" + +msgid "Blue Front Panel Connector" +msgstr "Modri priključek spredaj" + +msgid "White Front Panel Connector" +msgstr "Beli priključek spredaj" + +msgid "Black Front Panel Connector" +msgstr "Črni priključek spredaj" + +msgid "Gray Front Panel Connector" +msgstr "Sivi priključek spredaj" + +msgid "Orange Front Panel Connector" +msgstr "Oranžni priključek spredaj" + +msgid "Red Front Panel Connector" +msgstr "Rdeči priključek spredaj" + +msgid "Yellow Front Panel Connector" +msgstr "Rumeni priključek spredaj" + +msgid "Spread Output" +msgstr "Razširi izhod" + +msgid "Downmix" +msgstr "Zmanjševanje kanalov" + +msgid "Virtual Mixer Input" +msgstr "Vhod navideznega mešalnika" + +msgid "Virtual Mixer Output" +msgstr "Izhod navideznega mešalnika" + +msgid "Virtual Mixer Channels" +msgstr "Kanali navideznega mešalnika" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Funkcija %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Funkcija %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Zvočne naprave ni mogoče odpreti za predvajanje. Predmet ne podpira trenutne " +"različice sistema Open Sound System." + +msgid "Playback is not supported by this audio device." +msgstr "Ta zvočna naprava ne podpira predvajanja." + +msgid "Audio playback error." +msgstr "Napaka med predvajanjem zvoka." + +msgid "Recording is not supported by this audio device." +msgstr "Snemanje s to zvočno napravo ni podprto." + +msgid "Error recording from audio device." +msgstr "Napaka med snemanjem z zvočno napravo." + +msgid "Gain" +msgstr "Ojačitev" + +msgid "Headphone" +msgstr "Slušalke" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Napaka med branjem %d bajtov iz naprave '%s'." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" +"Nepričakovana vrednost velikosti okvirja (%u). Pričakovana vrednost je %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Napaka med branjem %d bajtov na napravi '%s'." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Napaka med pridobivanjem zmožnosti naprave '%s': ni gonilnik v4l2. " +"Preverite, če je gonilnik v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Napaka med poizvedovanjem atributov vhoda %d naprave %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Napaka med pridobivanjem nastavitev uglaševalnika %d naprave '%s'." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Napaka med poizvedovanjem uravnanosti naprave '%s'." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Napaka med pridobivanjem atributov nadzora naprave '%s'." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Naprave '%s' ni mogoče določiti." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "To ni naprava '%s'." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Naprave '%s' ni mogoče odpreti za branje in pisanje." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Naprava '%s' ni naprava za zajemanje." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Naprava '%s' ni izhodna naprava." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Napaka med nastavljanjem uravnanosti naprave '%s'." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Napaka med pridobivanjem trenutne frekvence uglaševalnika naprave '%s'." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Napaka med nastavljanjem frekvence uglaševalnika naprave '%s' na %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Napaka med pridobivanjem moči signala za napravo '%s'." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Napaka med pridobivanjem vrednosti za nadzor %d na napravi '%s'." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Napaka med nastavljanjem vrednosti %d za nadzor %d na napravi '%s'." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Napaka med pridobivanjem trenutnega vhoda naprave '%s'. Morda je radijska " +"naprava." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Napaka med nastavljanjem vhoda %d na napravi %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Napaka med pridobivanjem trenutnega izhoda naprave '%s'. Morda je radijska " +"naprava." + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Napaka med nastavljanjem izhoda %d na napravi %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Medpomnilnika na napravi '%s' ni mogoče uvrstiti." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Napaka med poskusom pridobivanja video sličic z naprave '%s'." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" +"Neuspešen zagon po %d poskusih na napravi %s. Sporočilo sistemske napake: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Parametrov na napravi '%s' ni mogoče pridobiti." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Vhodni video napravi ni mogoče določiti novih nastavitev hitrosti sličic." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Medpomnilnika naprave '%s' ni mogoče preslikati" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Gonilnik naprave '%s' ne podpira nobenega znanega načina zajemanja." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Spreminjanje ločljivosti med delovanjem še ni podprto." + +msgid "Cannot operate without a clock" +msgstr "Delovanje brez ure ni mogoče" + +#~ msgid "Describes the selected input element." +#~ msgstr "Opisuje izbran vnosni predmet." + +#~ msgid "Describes the selected output element for Audio/Video Conferencing." +#~ msgstr "Opisuje izbran izhodni predmet za zvočne/video konference." + +#~ msgid "Describes the selected output element for Music and Movies." +#~ msgstr "Opisuje izbran predmet za glasbo in filme." + +#~ msgid "Describes the selected output element." +#~ msgstr "Opisuje izbran izhodni predmet." + +#~ msgid "GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "GStreamer odvod za zvočne/video konference" + +#~ msgid "GStreamer audiosink for Music and Movies" +#~ msgstr "GStreamer odvod glasbe in filmov" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "S programom GStreamer je mogoče predvajati zvok z uporabo več izhodnih " +#~ "predmetov. Med razpoložljivi so ossink, edsink in alsasink. Audiosink je " +#~ "lahko delni cevovod namesto enega predmeta." + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "S programom GStreamer je mogoče predvajati video z uporabo več izhodnih " +#~ "predmetov. Med razpoložljivimi so xvimagesink, ximagesink, sdlvideosink " +#~ "in aasink. Videosink je lahko delni cevovod namesto enega predmeta." + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "stream in video frames. Default is goom but more visualization plugins " +#~ "will be ported soon. The visualization plugin can be a partial pipeline " +#~ "instead of just one element." +#~ msgstr "" +#~ "S programom GStreamer je mogoče v cevovod vključiti vstavek predočenja za " +#~ "pretvorbo zvočnega pretoka v slikovni učinek. Privzeti vstavek je Goom, " +#~ "kmalu pa mu bodo sledili še drugi. Vstavek predočenja je lahko delni " +#~ "cevovod namesto samo enega predmeta." + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " +#~ "a partial pipeline instead of just one element." +#~ msgstr "" +#~ "S programom GStreamer je mogoče posneti zvok z uporabo več vhodnih " +#~ "predmetov. Med razpoložljivimi so osssrc, esdsrc in alsasrc. Vir zvoka je " +#~ "lahko delni cevovod namesto samo enega predmeta." + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc and videotestsrc. The video source can be a " +#~ "partial pipeline instead of just one element." +#~ msgstr "" +#~ "S programom GStreamer je mogoče posneti video z uporabo več vhodnih " +#~ "predmetov. Med razpoložljivimi sta v4lsrc in videotestsrc. Vir videa je " +#~ "lahko delni cevovod namesto samo enega predmeta." + +#~ msgid "default GStreamer audio source" +#~ msgstr "privzeti vir zvoka" + +#~ msgid "default GStreamer audiosink" +#~ msgstr "privzeti zvočni ponor" + +#~ msgid "default GStreamer video source" +#~ msgstr "privzeti vir videa" + +#~ msgid "default GStreamer videosink" +#~ msgstr "privzeti video ponor" + +#~ msgid "default GStreamer visualization plugin" +#~ msgstr "privzeti vstavek predočenja" + +#~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "opis GStreamer zvočnega ponora za zvočno/video konferenco" + +#~ msgid "description for GStreamer audiosink for Music and Movies" +#~ msgstr "opis GStreamer zvočnega ponora za glasbo in filme" + +#~ msgid "description for default GStreamer audiosink" +#~ msgstr "opis za privzeti GStreamer zvočni ponor" + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "opis za privzeti GStreamer zvočni vir" diff --git a/po/sq.gmo b/po/sq.gmo new file mode 100644 index 0000000000000000000000000000000000000000..21e110b1246b5c9c9c021283b5b45b6997c304aa GIT binary patch literal 1521 zcmaKqJ!~9B6vqchAUQq~!dHM4BP39yWbXFXh?pfoaeR(s@DXDlE~uEh9q-L~c4nEK zHFhLw=nzF{5FHYQ=_n8dmE{5{1tkqssZvo;P*CuHzByZw5Tkwbn|U+y-kaI~ALmZo zVQ4SIF2MeRy$ZYg5IVGv9%k$WC_#K|6WwW0N7j*_f{(%f8TcspMdVkJ-^BHA!4}rP z2Ty`OM*q*?8<-z}r@()}N5GTlXy0j&{AWPQe?IzO0V&@_kn(q;|4Q^{!<{GI}1`>7r|UJT2kDo+2s;m>_S6*YOeE!} z8Yv#tcos%?e+l*+3|BjhN%5bDJqddnHfxmsg*YL-P&)^s`%t5M(3{NKvoyFN>zXb0 zSWg!^NF%yOqx5Jr$Cj-qq_%8DTZJu$NT-;a0*ie;@~#>?t1#SAp7ov8!Fl$cw~%>#*M>10cr`SNZRlJ%w&6@uDz@s~M2&)2&c%lEwRSe+MIA(C znnK%}C++$6Tx(5L&Ii%23!RG_O;L-1%lJ5iD(iHHO>rBw%64I0soKsLo!08Dfmp;f z0s@Mj3@YPk(oIE@inPmmr#K$rT*Q(l;+9DfX>M6gBYD z)<)tDGrl4luWaDGu`VUQYNk_tU7DfMw%KW072d`%TQsszVt^;j_<|WqtEJ^vhpO;$ za((PVDYa>jTzR}Xn9|#E$=p=G4?Jh_0Aa0HQ%QHtOHxxLOB}BJyIJM3ps40=dM<~Y;57|<(c|Oh;ZdR z?C24E)B*rK^7AYW$RM24-stBnf<+*t!un#(6<{^>;KTF GX8!^&T2m_k literal 0 HcmV?d00001 diff --git a/po/sq.po b/po/sq.po new file mode 100644 index 0000000..6d593a0 --- /dev/null +++ b/po/sq.po @@ -0,0 +1,763 @@ +# Përkthimi i mesazheve të gst-plugins në shqip. +# Copyright (C) 2004 Free Software Foundation, Inc. +# Laurent Dhima , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins 0.8.3\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2004-08-07 20:29+0200\n" +"Last-Translator: Laurent Dhima \n" +"Language-Team: Albanian \n" +"Language: sq\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +msgid "Internal data stream error." +msgstr "" + +msgid "Failed to decode JPEG image" +msgstr "" + +#, fuzzy +msgid "Could not connect to server" +msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." + +#, fuzzy +msgid "Server does not support seeking." +msgstr "Dispozitivi juaj OSS mund të mos provohet korrektësisht" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Input audio i gabuar ose mungon, stream AVI mund të jetë i dëmtuar." + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +msgid "Internal data flow error." +msgstr "" + +msgid "Volume" +msgstr "Volumi" + +msgid "Bass" +msgstr "Bas" + +msgid "Treble" +msgstr "Treble" + +msgid "Synth" +msgstr "Sintetizuesi" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Zë folës" + +msgid "Line-in" +msgstr "Linja-hyrje" + +msgid "Microphone" +msgstr "Mikrofoni" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Kontrolli i volumit" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Regjistrimi" + +msgid "In-gain" +msgstr "In-gain" + +msgid "Out-gain" +msgstr "Out-gain" + +msgid "Line-1" +msgstr "Linja-1" + +msgid "Line-2" +msgstr "Linja-2" + +msgid "Line-3" +msgstr "Linja-3" + +msgid "Digital-1" +msgstr "Dixhitale-1" + +msgid "Digital-2" +msgstr "Dixhitale-2" + +msgid "Digital-3" +msgstr "Dixhitale-3" + +msgid "Phone-in" +msgstr "Phone-hyrja" + +msgid "Phone-out" +msgstr "Phone-dalja" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Ekrani" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +#, fuzzy +msgid "Could not open audio device for playback." +msgstr "E pamundur hapja e dispozitivit të zërit \"%s\" për shkrim." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +#, fuzzy +msgid "Could not open audio device for recording." +msgstr "I pamundur hapja e dispozitivit CD për lexim." + +#, fuzzy +msgid "Could not open audio device for mixer control handling." +msgstr "E pamundur hapja e dispozitivit të zërit \"%s\" për shkrim." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" + +msgid "Master" +msgstr "" + +msgid "Front" +msgstr "" + +#, fuzzy +msgid "Rear" +msgstr "Regjistrimi" + +msgid "Headphones" +msgstr "" + +msgid "Center" +msgstr "" + +msgid "LFE" +msgstr "" + +msgid "Surround" +msgstr "" + +#, fuzzy +msgid "Side" +msgstr "Video" + +#, fuzzy +msgid "Built-in Speaker" +msgstr "Zë folës" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "" + +msgid "3D Depth" +msgstr "" + +msgid "3D Center" +msgstr "" + +msgid "3D Enhance" +msgstr "" + +msgid "Telephone" +msgstr "" + +msgid "Line Out" +msgstr "" + +#, fuzzy +msgid "Line In" +msgstr "Linja-hyrje" + +msgid "Internal CD" +msgstr "" + +#, fuzzy +msgid "Video In" +msgstr "Video" + +msgid "AUX 1 In" +msgstr "" + +msgid "AUX 2 In" +msgstr "" + +msgid "AUX In" +msgstr "" + +#, fuzzy +msgid "Record Gain" +msgstr "Regjistrimi" + +#, fuzzy +msgid "Output Gain" +msgstr "Out-gain" + +#, fuzzy +msgid "Microphone Boost" +msgstr "Mikrofoni" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "" + +#, fuzzy +msgid "Record Source" +msgstr "Regjistrimi" + +#, fuzzy +msgid "Monitor Source" +msgstr "Ekrani" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "" + +msgid "Surround Sound" +msgstr "" + +#, fuzzy +msgid "Microphone Gain" +msgstr "Mikrofoni" + +#, fuzzy +msgid "Speaker Source" +msgstr "Zë folës" + +#, fuzzy +msgid "Microphone Source" +msgstr "Mikrofoni" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "" + +msgid "Stereo Mix" +msgstr "" + +msgid "Mono Mix" +msgstr "" + +msgid "Input Mix" +msgstr "" + +msgid "SPDIF In" +msgstr "" + +msgid "SPDIF Out" +msgstr "" + +#, fuzzy +msgid "Microphone 1" +msgstr "Mikrofoni" + +#, fuzzy +msgid "Microphone 2" +msgstr "Mikrofoni" + +#, fuzzy +msgid "Digital Out" +msgstr "Dixhitale-1" + +#, fuzzy +msgid "Digital In" +msgstr "Dixhitale-1" + +msgid "HDMI" +msgstr "" + +msgid "Modem" +msgstr "" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "" + +msgid "None" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Off" +msgstr "" + +msgid "Mute" +msgstr "" + +msgid "Fast" +msgstr "" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "" + +#, fuzzy +msgid "Front Panel Microphone" +msgstr "Mikrofoni" + +msgid "Front Panel Line In" +msgstr "" + +msgid "Front Panel Headphones" +msgstr "" + +msgid "Front Panel Line Out" +msgstr "" + +msgid "Green Connector" +msgstr "" + +msgid "Pink Connector" +msgstr "" + +msgid "Blue Connector" +msgstr "" + +msgid "White Connector" +msgstr "" + +msgid "Black Connector" +msgstr "" + +msgid "Gray Connector" +msgstr "" + +msgid "Orange Connector" +msgstr "" + +msgid "Red Connector" +msgstr "" + +msgid "Yellow Connector" +msgstr "" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +msgid "Virtual Mixer Input" +msgstr "" + +msgid "Virtual Mixer Output" +msgstr "" + +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" + +msgid "Playback is not supported by this audio device." +msgstr "" + +msgid "Audio playback error." +msgstr "" + +msgid "Recording is not supported by this audio device." +msgstr "" + +msgid "Error recording from audio device." +msgstr "" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "" + +#, fuzzy, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Cannot identify device '%s'." +msgstr "I pamundur shkrimi në dispozitivin \"%s\"." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim dhe shkrim." + +#, fuzzy, c-format +msgid "Device '%s' is not a capture device." +msgstr "Dispozitivi \"%s\" nuk është një dispozitiv marrje." + +#, fuzzy, c-format +msgid "Device '%s' is not a output device." +msgstr "Dispozitivi \"%s\" nuk është një dispozitiv marrje." + +#, fuzzy, c-format +msgid "Failed to set norm for device '%s'." +msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." + +#, fuzzy, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, fuzzy, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." + +#, fuzzy, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to set input %d on device %s." +msgstr "E pamundur mbyllja e dispozitivit audio \"%s\"." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "E pamundur mbyllja e dispozitivit audio \"%s\"." + +#, fuzzy, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." + +#, fuzzy, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, fuzzy, c-format +msgid "Could not get parameters on device '%s'" +msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, fuzzy, c-format +msgid "Could not map buffers from device '%s'" +msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "" + +#~ msgid "" +#~ "No usable colorspace element could be found.\n" +#~ "Please install one and restart." +#~ msgstr "" +#~ "Nuk arrin të gjehet asnjë element ngjyra e hapësirës.\n" +#~ "Ju lutem instaloni një dhe rinisni." + +#~ msgid "" +#~ "The %s element could not be found. This element is essential for " +#~ "playback. Please install the right plug-in and verify that it works by " +#~ "running 'gst-inspect %s'" +#~ msgstr "" +#~ "E pamundur gjetja e elementit %s. Ky element është thelbësor për " +#~ "playback. Ju lutem instaloni plug-in e duhur dhe kontrollo funksionimin " +#~ "duke ekzekutuar 'gst-inspect %s'" + +#~ msgid "Device is open." +#~ msgstr "Dispozitivi është i hapur." + +#~ msgid "Device is not open." +#~ msgstr "Dispozitivi nuk është hapur." + +#~ msgid "No device specified." +#~ msgstr "Nuk është përcaktuar asnjë dispozitiv." + +#~ msgid "Could not close vfs file \"%s\"." +#~ msgstr "E pamundur mbyllja e file vfs \"%s\"." + +#~ msgid "No filename given" +#~ msgstr "Nuk është dhënë asnjë emër file" + +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "E pamundur hapja e file vfs \"%s\" për shkrim: %s." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Nuk është dhënë asnjë emër file" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "E pamundur hapja e file vfs \"%s\" për lexim." + +#~ msgid "Your OSS device could not be probed correctly" +#~ msgstr "Dispozitivi juaj OSS mund të mos provohet korrektësisht" + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "E pamundur hapja e dispozitivit \"%s\" për shkrim." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Dispozitivi \"%s\" nuk ekziston." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "" +#~ "E pamundur futja në dispozitivin \"%s\", kontrollo të drejtat e tij." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "" +#~ "Dispozitivi OSS \"%s\" është duke u përdorur nga një tjetër program." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "E pamundur mbyllja e dispozitivit video \"%s\"." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "E pamundur hapja e dispozitivit video \"%s\" për shkrim." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "I pamundur rregullimi i dispozitivit audio \"%s\" në %d Hz." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "I pamundur konfigurimi i dispozitivit të zërit \"%s\"." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "E pamundur hapja e dispozitivit të kontrollit \"%s\" për shkrim." + +#~ msgid "Could not write to file \"%s\"." +#~ msgstr "I pamundur shkrimi tek file \"%s\"." + +#~ msgid "No filename specified." +#~ msgstr "Nuk është përcaktuar emri i file." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "E pamundur hapja e file \"%s\" për lexim." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Gabim gjatë mbylljes së file \"%s\"." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "E pamundur hapja e file \"%s\" në shkrim." diff --git a/po/sr.gmo b/po/sr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..3f27d9a8ef0487560c6878c1d7042f2fc45f3e51 GIT binary patch literal 19603 zcmd6t3zS_|dB+bZit&Zus|e*N27<{9Gn4QN1oM7CLdGP7NAYoI=FH4BckUVPBVkZ$ zNO%dwLJ}ZAcm~lzD`Orc=2^Sc)>YASTURYzZI`%et4r-tm(MPB_4ohwzW1Jc=guS% zvAt{d{hxi#KHvV{``i1@zn}cddjmd)X{XWN{Hh>0?zkX$-RpEW2u?aF2;Km`34ARW zf_gL!d<}RJcp^9toCGcfF9Wag_n!bY?it_T?fZv7rV9QJd^PxW@Gams!B>Jm1V!&B z;2Xi;fbRfb|0c)JIpC@EF9dlMtOSn-`#{Mt0RAy}GpKpCgW~&Xa0a*s6ulpS=YS`k z?63=Lr+*!IHh3p^7Pu3<0Q?v5X(s0?!0r0448lJf8Sgr|(lh>F*4W=XjhBN^i5k47dQC0)844zX|v*@E2eg zcFY&M^Zf`E|Gxqy=WjvTebVXJ8k_?b zz<&lc?sA+}{B?thuT`MtzY65lU=Y;2w}7I5Cn&mGK)v^vfBvL@{xm2(?*zryK~Q%5 zs_*|7crN{)gOdNOGaUU+Q2bl~O0SoInr9v;J1hq~!1w$9Cqdb78z{b>12ykqkiXz7 ze1+imKte8PP!AbALcfl_3J>U@725$BJFN5O$$DrnWEx{~$Cxe>rG*I(Q_Wh~gMf7KYil;oN zc)A5tJUsx4&Syc%w;PmSe+iU5Uj${(pMVz~&zLhEoh6eUoezPSBq)KRw;9xXp8+-B z=fRJG2`GQO;w=9jsD8=!Zv{2~gZ}>0;Dz)LfUg3721@Q2#o6OJQ1sS-CGZwd9TN}gHZ_rR;bYr#1rY2h}o8~g?MVQ?`?Hw*3r=YXfr zAV$Ftf_H)62PNMKNjeYy2+ZjD`EEV?0{B7t(=QVn5WSPPy9nL0QQrJ(BI0`MfT2V4Ob!FPaP24%l* zgR=h_bY_F^1x0^7cry42kJ~&x3r^zx-+6@d}($_fH4k0AA#AvB#@Gjq3+BZapY|wt>>er#!zXKAI!7n|Y29u}LpACx62Rvp$&0hjF-$w9F;KLrD1qqSh3*a#LJ@As_@SWMj z4*mOa64Cp_T$gXQfUla`H|AMejUNcDfuCAJ>6z z1=oUl|1R(ja2wbQo{iEj2k!*c|0Z}9c<~aKhc<(MLjQ;0S>Te(9KB&sa@^+eA#f7? zXMKMkSfu|oupOMsB<}&Q2Nhr2K*{wLQ1ZM8;_AU~e1GOr*Iy0d2EkJ_<%3t#K19>! zH8lC6KKmS4%unX}-L%iraED+sZ9A>{$yYBx*t2!;0Qf1Iax^I;m`XGIfg5SNY5MGR z5DbEfzuC0U(>_7dM>!!!TSt>TpP}g^+vsx}P4WATI(#rg5YkY)>30D92rd0Njm|Z+ z3uuZB*+ZXa9Rzzl_JgwB`)Kc?T}i8c{?cE_#@ExXraelNO1?6NX8N2>dxCZa?Txfg(v-jNq@725j3zs8pxsA1MAJvU(?L6thHC|n&{oq5 zv~JoY+Uscg+)mp{JFJfXJPtlcyOk#Y9-=A!nm>E|jhj852}ZP=Xs`75=7D{*X*9*m zleC9vchmHlLipruqZ@{~j{0&V?ZKQYuMRuIC3%0byj-%YuIjC>uzJgnv2M99 z8;8TW%t%kB*E7)`%*_;w_7%>J<6ngSvhL%jx(~H z&6V1+`EccMlv#s<=FJc0W%BvB6lVKSS+;*9?2FcBdn40id-Y*F92GL9C|s8<4aVhC zn2~yV*92b84#IQ8r3)7X^HB3ZHa`#+qGFsY%T!^e6c);mABw_kG1PP;Q7J5zhlk?= zx@4ZXoa?g(UfE$O_LfLJi}Kf(BV_F<_xDGIVu&D(+}5Z>#Zsmxmn{y4DdW{hrso@X zWL(bojb&i~zK1h~%us}X6+>i8agbtlC^KARv%e4zjWZ0zq8;-HPp2O@9LnAx55(4m zI2WSNz8nfobA3$jg{ub9I!;}bE#iK2>gAewr3txmq*#iEs+Or)Me$V9n^7(r!a0sS zf7PjvVI=Ws?#47dk-Vm?sAJ{~UNVRlGQ-2UY;Q(xbSz~5;39|D#O1Ir&YxYvU~8k0 zh#ATjP2>2T*-P2QS^3D46r$d^(05c;uMd4`Jfs{slouAFj2OTYec`%7w$#Log*Srw ze3>UC+5>M*OUFLa$rYL55-GMOd&@zjm0>bVRX_8ynSnfsFxwl<&kkfunVgbp^-_7% zU$=GEuDWVh(}Vf(x;$YNEU+9;)QWv^lIh9jkR>Xbj47FChD*qTMHw&?uAPzV3i}FK zf~Gy3HyDwNv;ARK1KiWj>Qg^MRaq=hJtHMiZwmVM@dh@gkoquhe@7^tBHDw6nQV?I z$@G(hv?P`a$kSd;F_XD0x{$UNZe}>SSbe3Y2$x$Bro_uVWpUihh@S=T?ZX-SqVTfr z1&hM$P-Y;ilH-{YA`57N1VKKQ37hDI%Q7Rxc1?MOjMhJ=_;KiXUwG++O03rfG#IgN z$G;v(a4&-soVhQ;NN`pt5U~MMH@}=OaCie+vfa?O8 zFl8cq&~(ge^~JAlUgU7^~VQAy3bN6@C0?8&)uxcJ7jUPYkB zb6uG@Y11smvQ(3b$>uTMF&dOMmXgylgN{6^>4y@l8a1dB4+e6WZTsa|V3cEV!z#z@Qe za_=p3dGpFTCr%|H2L(Sh;_fY-+Jug`OB6Bi%I|3FsMmbzbXccvjc;{ zl6>2McwQpUbl>4JQtuL#;EE24%-VHdrj!Z$bMZP?eYZC~Q6Oc8>d!D`mPA*gfRgm> z!DW=i!R66NPn;?Ag>$25I8f19RkWd$s|%I}gDwZt9l+_*I38B<&BeN485WHS!Lq0? zTOJBhhNxeLovHg_SGwb>_0&)^U#d@uRbbbFLNp0!lsV#jwnR9#>O4rudoFW$Us<>hOqC zl^RFULv2$qVvAOq4avJJR;}y~qZ>+5-pZiiT$z1=Npoy$$=P9zh4%=wE#Ox~xZDud z%y`9+X|5nLgXR7G!SZ~t9LWaK`z3#)bqp+55gOo8&d0gX5@$y4p0_NZwRHvEihQDokiWo}$_EdQ zU3aVMY_2EE9pyYLaFKf2P_MN(E4$|}Sr{(K2kt_#xH8fXJG~RbtINY-zm+lVJhvTp zUrff;-q4GT??-Fkur{Em8l#7-rzFB%GBsaA<(#&rD+%H#4yqelk5zG34y!=Zc3e5C zI@VsXkXuOwqo@d~7jA15tQ^U6da#NekW0?1RKixhUry~r15b1to7LGusZ8duL`}($*io(s!Srpn#5LaYKDC;&j-e>HYA}l`>Ve|= ztwZIS$ntG{u)ooIG=ctM{Gn}0UmMaZqs|NmilsJ}R*P)|aopF|(can7-gRMn*Q6DZ zvUl6E;y|{qZEks>*tRO384i|8!!yr4x2HUCBdbNGojn%Ywzx2G?xgPJtJ>xfCE97X z%_pR0hFu+3Op`7>wCnA*|BxTP$t zZL7475TJ2kW|(YC_Ey#>hblKE`;*aRN0>aE>`nG1hv@FDJQQ9slr6*zUYpOZiP`ke zE^x*am4-+Y?ReRxP|OdM*?zRGqDYt-k~ey?nS6N3K)yVi0AEXRAxeGR%&=IPv~0<; z1$B*ews%ZI;jBsUHZqKmC03|&@$GE>;;?rxQ@|r;UAbyu+lBRUl7R!Kwgou5w!|~T z3wyGqN!__}A(LxcNUdF*8Rjtr-Quk27ZWPFoHZpsxwB)|tj_SPvqD{VymMA(XZYT* zBV;)JOJ{XeA6+tQhA!=mj!QZ_!jFE`y~3D|b9kqdce>8Gc+%Bviy}5PPNVX~3{Kn8 zegSe_-B$IHm8Fp!qM3Ck`E%3C&6SPG!DL_MR+POp8P)AE_rAUUk;%nxuiqA8m_5l3 zOtUN58&>ZI(~~V>8$UTksy2gy^5-&}onkl76 zY_5rgM2C$VBr#_{pc@-ac~T6|(KNL7C8Mx;4-(uIB#$BjMnXbUUWhKak8+czAa)R? zc&hu*@J0sFj#JEn!aGt!RAdepyHQ(9DxLwcg8M?rkM8G5v`iRq1dlNrA0 z80X2BfOLQl9KdmQRyN8#Mnl+@*m9;l3>{4lU>V5(p;08LdM1i%{j&U&mrx&mfba6w z25IqerwE+*LCIe4noo0-ojjC0ncRz37ID98=25 zm=pJxW63A?NoR^fy$-!yO!J(1v7DfVEO@`S7jHjDLla1&uUc4$(N-@j(xgr)LX)B5 z%0tX=+J+Kc!o`?D@o5Fqomj;iopneGs1?af**@r6GuT?ZW2ch}n{j0(XsSFN#tb-< zELqvW6|$Q_Q{I#kwk5>_ynYxx8JQz%(yWsrkFlz{Y)M|0*(c6q8JQ{-A`M2dG)HJy z&N$>9Y_~j1j)=sS2h8V;h~!lUCPTE;yg9_nJ8hUe0+S?Tg#~U%IKb^qXi{Dy|04$; zs^x9TPYOuccidQkrsOxL+fDisEnbHdPX1EGHC<}?YfRTK7uhh`F5_2RVoNBC=sFd_ zf?R?Hf~;tE->FM^qgzx)tBd-}$K3yC6OQ8g%JUQ!sd%%+L-(5v7%IQY>*RgTgIM`k zkRL+*@=e?n_15B%Vcus`)L(iy)%=T4&?+c~SSXItgh!IOiRd3x<_0TNb6(vXL3oj>IKTA4hhJ3Mv$(M3n%0xZKgW?n!Cs=&8*q#a6V)Hn3#&ZBWqeBNAXzU;c?^ z13li|V$+N!J9)_d2I*AmQD^XgnfYqS>d&#y>XWp3v$NIBu2wgv2g&2iK|zl4 zG^z5UTLyw;;?h*5f-ReV5y3*fA|pI%!ucgA6%VzwjeXw3Ug^n>8OeUDrPB-3ZD__~ zQiYYue-`ET&=*>i4&0Hx2t!qXD66^wAgfc*L(+=)Ba%FVqzzukj|Em?Z)IXzQGM-_ z5)fXhZiT@oRN@gxqekks6zNpqaYWJ$xx#UYW3qo>QnzlVDf^JJ;8Mlt$}F}{E|j$Q zKB!+1eX?U$LK0%%(cZuxKOk}=wP15?i;=A7HgBW$E2CMSIBuHC>{xRwoZM0;wx3jysH`y#9Y{jf>R0%c#1s?>CR~0Gy z(A`58_~MSe#Dx6mtm6=6x+F)Rka_X1hK@IkI8*vUdBqd>BX@1ms>F-A% zHsSc#E;zQ;!&e{;A;H`)NhamXL$=Urr`93@%}hF+8`VV4ptXWjvll1y(`Nc6%X&_8 z*vkLThERm6HgGJrT!|P_-vFD3`NNcnxwZU&w_;6nQHyXV_Dk?%Cv5e1@QDK3w*3ki z$AUkW8qdi3nfvIerIr6XdT1kisZ=wL7ak*n%^okRR(AhhoxX9=v8^I`L(3oQmmRuj zwYS}9V_qT%Qmg$v#15xE?lj1qpXt!ZPJvi4wWhEGqhe7IxaaENW3|&Y)((t9F^aua z{}63{9Xa}UQbw3yCQjMy9N|#qW*9g)5mS$931-Fjr;I8kmH75nZjl?0Ibl^O>ug8j zQo~z5tSNGIn*K2Xu~cfR0zPE_nt+ycKI;oUah5u-9RHaMqm-0m&nxdYPIOw(n)t-e zk79yPp^k0I*0F}x`C+r|Ti)7)qHaQ^9L;Wb=2l>uXEf^FKTQv_qFwspGKr4~T9Pfr(z#7TU5i9v&P40gdrQw{|>Vdj<=g zsiAb)E~THcQL1&D0#gU#7QZHhiFX*!-k^PvWn!f(S$4BoRvM@uB+EvDe(y?0;+Pv^ zu4#-IY>G;4z#8ai{-YVQ6%OsEkd_p-A&eaiiU$?T9ErFDH(K!rAwiNNp)^%}0t0%- zeAzLFlimXb%3|A$$iLijRX^dj`4q153(LJ)`r!6a*S3s>5-CxofoKZx6~=kFvcCt zleI0F*sZ3@dnwDds|T1zI6BIQe?aAFeX*>N>^GMDaow>>AQ~pLm%x=7&X8DFtG|TgLO&3A7i26hAXkuo zJ}jFt1ednuyYhhLPL?uz=zdr@Sa}o*Vz`x>MdWD4nJJwqTpclX-Fu{_6$%msXf1dw z#f#_qf<7is)Y7EOB2OjTluQ8rk12TqvG-$WD;&n;!&Xmmrdry4tg?|nQHnP`v~ac{ zX&Tc~S4W`(iM1Y8%YLTr)bFWEV)ZW8^)YSQNkud3Fu@&q|IiP}j1|Fp60+4wUAHV% zHX)gFiAV93Lnge&YvV?~e@uCeo7m-kOL4XeJg$dY0|}|!V>35uu0NND)v|W;lLkUB zk68L~Srr}}wKU(v&yT`zBpRx!t;v(9)H$vSr|LaZsJXN031!+E1xxM#o{X-aU-d1O zV=pngM;CBhv4fWC5f}ewKy*HCX^T<*p9UJ80J`o5XUfzhSkCAuiDRp#*Nwc2DC{C0 z@gL^!$=sYk8ET(@kL`p@Jmy#`Ge!vx>D9tl$&~uq7eVG{q~)~rVITd5ztuI%8ee83pUWi&~7ajL#~`5_l260 zN8$n@Z9`inUG=GPXf=@W8=q>ikfO@bY(2lZV;udctxbi+?p_WM#^o1t!c{{xBq>b4 zJa8J~qE, 2004. +# Мирослав Николић , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good-0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-12-04 16:44+0200\n" +"Last-Translator: Мирослав Николић \n" +"Language-Team: Serbian \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"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" +"X-Generator: Virtaal 0.7.0\n" +"X-Project-Style: gnome\n" + +msgid "Could not establish connection to sound server" +msgstr "Не могу да успоставим везу са сервером звука" + +msgid "Failed to query sound server capabilities" +msgstr "Нисам успео да испитам могућности сервера звука" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "„%s“ изводи „%s“" + +msgid "Internal data stream error." +msgstr "Унутрашња грешка тока података." + +msgid "Failed to decode JPEG image" +msgstr "Нисам успео да декодирам ЈПЕГ слику" + +msgid "Could not connect to server" +msgstr "Не могу да се повежем са сервером" + +msgid "Server does not support seeking." +msgstr "Сервер не подржава позиционирање." + +msgid "Could not resolve server name." +msgstr "Не могу да решим назив сервера." + +msgid "Could not establish connection to server." +msgstr "Не могу да успоставим везу са сервером." + +msgid "Secure connection setup failed." +msgstr "Подешавање безбедне везе није успело." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Дошло је до грешке на мрежи, или је сервер неочекивано затворио везу." + +msgid "Server sent bad data." +msgstr "Сервер је послао лоше податке." + +msgid "No URL set." +msgstr "Није подешена адреса." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Улазног звука нема или је неисправан, АВИ ток ће бити оштећен." + +msgid "This file contains no playable streams." +msgstr "Ова датотека не садржи токове за пуштање." + +msgid "This file is invalid and cannot be played." +msgstr "Ова датотека је неисправна и не може бити пуштена." + +msgid "This file is corrupt and cannot be played." +msgstr "Ова датотека је оштећена и не може бити пуштена." + +msgid "Invalid atom size." +msgstr "Неисправна величина атома." + +msgid "This file is incomplete and cannot be played." +msgstr "Ова датотека је непотпуна и не може бити пуштена." + +msgid "The video in this file might not play correctly." +msgstr "Видео у овој датотеци можда неће бити пуштен исправно." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Ова датотека садржи превише токова. Пуштам само први %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Није пронађен ниједан подржани ток. Можда ћете морати да инсталирате " +"прикључак РТСП проширења Гстримера за токове Стварног медија." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Није пронађен ниједан подржани ток. Можда ћете морати да омогућите више " +"протокола преноса или можда на неки други начин недостаје прави прикључак " +"РТСП проширења ГСтримера." + +msgid "Internal data flow error." +msgstr "Унутрaшња грешка протока података." + +msgid "Volume" +msgstr "Јачина звука" + +msgid "Bass" +msgstr "Бас" + +msgid "Treble" +msgstr "Високотонац" + +msgid "Synth" +msgstr "Синтисајзер" + +msgid "PCM" +msgstr "ПЦМ" + +msgid "Speaker" +msgstr "Звучник" + +msgid "Line-in" +msgstr "Линијски улаз" + +msgid "Microphone" +msgstr "Микрофон" + +msgid "CD" +msgstr "ЦД" + +msgid "Mixer" +msgstr "Мешач" + +msgid "PCM-2" +msgstr "ПЦМ-2" + +msgid "Record" +msgstr "Снимање" + +msgid "In-gain" +msgstr "Улазно појачање" + +msgid "Out-gain" +msgstr "Излазно појачање" + +msgid "Line-1" +msgstr "Линија 1" + +msgid "Line-2" +msgstr "Линија 2" + +msgid "Line-3" +msgstr "Линија 3" + +msgid "Digital-1" +msgstr "Дигитални 1" + +msgid "Digital-2" +msgstr "Дигитални 2" + +msgid "Digital-3" +msgstr "Дигитални 3" + +msgid "Phone-in" +msgstr "Телефонски улаз" + +msgid "Phone-out" +msgstr "Телефонски излаз" + +msgid "Video" +msgstr "Видео" + +msgid "Radio" +msgstr "Радио" + +msgid "Monitor" +msgstr "Праћење" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Не могу да покренем звучни уређај ради пуштања. Уређај користи нека друга " +"апликација." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Не могу да покренем аудио уређај ради пуштања. Немате овлашћење за покретање " +"уређаја." + +msgid "Could not open audio device for playback." +msgstr "Не могу да покренем звучни уређај ради пуштања." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Не могу да покренем аудио уређај ради снимања. Немате овлашћење за покретање " +"уређаја." + +msgid "Could not open audio device for recording." +msgstr "Не могу да покренем звучни уређај ради снимања." + +msgid "Could not open audio device for mixer control handling." +msgstr "Не могу да покренем звучни уређај за руковање управљањем мешача." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Не могу да покренем звучни уређај за руковање управљањем мешача. Ово издање " +"система отвореног звука није подржано овим елементом." + +msgid "Master" +msgstr "Главни" + +msgid "Front" +msgstr "Предњи" + +msgid "Rear" +msgstr "Задњи" + +msgid "Headphones" +msgstr "Слушалице" + +msgid "Center" +msgstr "Средињи" + +msgid "LFE" +msgstr "ЛФЕ" + +msgid "Surround" +msgstr "Окружење" + +msgid "Side" +msgstr "Са стране" + +msgid "Built-in Speaker" +msgstr "Уграђени звучник" + +msgid "AUX 1 Out" +msgstr "АУХ 1 излаз" + +msgid "AUX 2 Out" +msgstr "АУХ 2 излаз" + +msgid "AUX Out" +msgstr "АУХ излаз" + +msgid "3D Depth" +msgstr "3Д дубина" + +msgid "3D Center" +msgstr "3Д средиште" + +msgid "3D Enhance" +msgstr "3Д побољшање" + +msgid "Telephone" +msgstr "Телефон" + +msgid "Line Out" +msgstr "Линијски излаз" + +msgid "Line In" +msgstr "Линијски улаз" + +msgid "Internal CD" +msgstr "Унутрашњи ЦД" + +msgid "Video In" +msgstr "Видео улаз" + +msgid "AUX 1 In" +msgstr "АУХ 1 улаз" + +msgid "AUX 2 In" +msgstr "АУХ 2 улаз" + +msgid "AUX In" +msgstr "АУХ улаз" + +msgid "Record Gain" +msgstr "Појачање снимања" + +msgid "Output Gain" +msgstr "Појачање излаза" + +msgid "Microphone Boost" +msgstr "Појачање микрофона" + +msgid "Loopback" +msgstr "Повратна петља" + +msgid "Diagnostic" +msgstr "Дијагностика" + +msgid "Bass Boost" +msgstr "Појачање баса" + +msgid "Playback Ports" +msgstr "Портови пуштања" + +msgid "Input" +msgstr "Улаз" + +msgid "Record Source" +msgstr "Извор снимања" + +msgid "Monitor Source" +msgstr "Извор праћења" + +msgid "Keyboard Beep" +msgstr "Звук тастатуре" + +msgid "Simulate Stereo" +msgstr "Лажни стерео" + +msgid "Stereo" +msgstr "Стерео" + +msgid "Surround Sound" +msgstr "Звук окружења" + +msgid "Microphone Gain" +msgstr "Појачање микрофона" + +msgid "Speaker Source" +msgstr "Извор звучника" + +msgid "Microphone Source" +msgstr "Извор микрофона" + +msgid "Jack" +msgstr "Утичница" + +msgid "Center / LFE" +msgstr "Средиште / ЛФЕ" + +msgid "Stereo Mix" +msgstr "Стерео микс" + +msgid "Mono Mix" +msgstr "Моно микс" + +msgid "Input Mix" +msgstr "Улазни микс" + +msgid "SPDIF In" +msgstr "СПДИФ улаз" + +msgid "SPDIF Out" +msgstr "СПДИФ излаз" + +msgid "Microphone 1" +msgstr "Микрофон 1" + +msgid "Microphone 2" +msgstr "Микрофон 2" + +msgid "Digital Out" +msgstr "Дигитални излаз" + +msgid "Digital In" +msgstr "Дигитални улаз" + +msgid "HDMI" +msgstr "ХДМИ" + +msgid "Modem" +msgstr "Модем" + +msgid "Handset" +msgstr "Слушалица" + +msgid "Other" +msgstr "Остало" + +msgid "None" +msgstr "Ништа" + +msgid "On" +msgstr "Укљ." + +msgid "Off" +msgstr "Искљ." + +msgid "Mute" +msgstr "Без звука" + +msgid "Fast" +msgstr "Брзо" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Врло низак" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Низак" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Средњи" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Висок" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Врло висок" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Производни" + +msgid "Front Panel Microphone" +msgstr "Микрофон предње површи" + +msgid "Front Panel Line In" +msgstr "Линијски улаз предње површи" + +msgid "Front Panel Headphones" +msgstr "Слушалице предње површи" + +msgid "Front Panel Line Out" +msgstr "Линијски излаз предње површи" + +msgid "Green Connector" +msgstr "Зелени прикључак" + +msgid "Pink Connector" +msgstr "Ружичаст прикључак" + +msgid "Blue Connector" +msgstr "Плави прикључак" + +msgid "White Connector" +msgstr "Бели прикључак" + +msgid "Black Connector" +msgstr "Црни прикључак" + +msgid "Gray Connector" +msgstr "Сиви прикључак" + +msgid "Orange Connector" +msgstr "Наранџасти прикључак" + +msgid "Red Connector" +msgstr "Црвени прикључак" + +msgid "Yellow Connector" +msgstr "Жути прикључак" + +msgid "Green Front Panel Connector" +msgstr "Зелени прикључак на предњој површи" + +msgid "Pink Front Panel Connector" +msgstr "Ружичасти прикључак на предњој површи" + +msgid "Blue Front Panel Connector" +msgstr "Плави прикључак на предњој површи" + +msgid "White Front Panel Connector" +msgstr "Бели прикључак на предњој површи" + +msgid "Black Front Panel Connector" +msgstr "Црни прикључак на предњој површи" + +msgid "Gray Front Panel Connector" +msgstr "Сиви прикључак на предњој површи" + +msgid "Orange Front Panel Connector" +msgstr "Наранџасти прикључак на предњој површи" + +msgid "Red Front Panel Connector" +msgstr "Црвени прикључак на предњој површи" + +msgid "Yellow Front Panel Connector" +msgstr "Жути прикључак на предњој површи" + +msgid "Spread Output" +msgstr "Излаз ширења" + +msgid "Downmix" +msgstr "Сабирни мешач" + +msgid "Virtual Mixer Input" +msgstr "Улаз виртуелног мешача" + +msgid "Virtual Mixer Output" +msgstr "Излаз виртуелног мешача" + +msgid "Virtual Mixer Channels" +msgstr "Канали виртуелног мешача" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d функција" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s функција" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Не могу да покренем звучни уређај ради пуштања. Ово издање система отвореног " +"звука није подржано овим елементом." + +msgid "Playback is not supported by this audio device." +msgstr "Пуштање није подржано од стране овог звучног уређаја." + +msgid "Audio playback error." +msgstr "Грешка приликом пуштања звука." + +msgid "Recording is not supported by this audio device." +msgstr "Снимање није подржано од стране овог звучног уређаја." + +msgid "Error recording from audio device." +msgstr "Грешка приликом снимања са звучног уређаја." + +msgid "Gain" +msgstr "Појачање" + +msgid "Headphone" +msgstr "Слушалице" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Грешка приликом читања %d бајтова са уређаја „%s“." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Добих неочекивану величину кадра, %u уместо %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Грешка приликом читања %d бајтова на уређају „%s“." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Грешка приликом добављања могућности за уређај „%s“: Није в4л2 управљачки " +"програм. Проверите да ли је то в4л1 управљачки програм." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Нисам успео да пропитам својства уноса %d у уређају %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Нисам успео да добавим подешавања тјунера %d на уређају „%s“." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Нисам успео да пропитам норму на уређају „%s“." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Нисам успео да добавим својства контрола на уређају „%s“." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Не могу да распознам уређај „%s“." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Ово није уређај „%s“." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Не могу да покренем уређај „%s“ ради читања и уписа." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Уређај „%s“ није уређај за снимање." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Уређај „%s“ није излазни уређај." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Нисам успео да подесим норму за уређај „%s“." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Нисам успео да добавим текућу учестаност тјунера за уређај „%s“." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Нисам успео да подесим текућу учестаност тјунера за уређај „%s“ на %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Нисам успео да добавим јачину сигнала за уређај „%s“." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Нисам успео да добавим вредност за контролу %d на уређају „%s“." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Нисам успео да подесим вредност %d за контролу %d на уређају „%s“." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Нисам успео да добавим текући улаз на уређају „%s“. Можда је то радио уређај." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Нисам успео да подесим улаз %d на уређају %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Нисам успео да добавим текући излаз на уређају „%s“. Можда је то радио " +"уређај." + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Нисам успео да подесим излаз %d на уређају %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Не могу да додам помоћне меморије у уређају „%s“." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Нисам успео да добавим видео кадрове са уређаја „%s“." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Нисам успео након %d покушаја. уређај %s. системска грешка: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Не могу да добавим параметре на уређају „%s“" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Улазни видео уређај не прихвата нове поставке протока кадрова." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Не могу да мапирам помоћне меморије са уређаја „%s“" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Управљачки програм уређаја „%s“ не подржава ниједан познати начин снимања." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Промена резолуције приликом извршавања још увек није подржана." + +msgid "Cannot operate without a clock" +msgstr "Не могу да радим без сата" + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "Не могу да отворим датотеку „%s“ ради уписа." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Грешка при затварању датотеке „%s“." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "Не могу да отворим датотеку „%s“ ради читања." + +#~ msgid "No filename specified." +#~ msgstr "Име датотеке није задато." + +#~ msgid "Could not write to file \"%s\"." +#~ msgstr "Не могу да пишем у датотеку „%s“." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "Не могу да отворим управљачки уређај „%s“ ради уписа." + +#~ msgid "Could not configure audio device \"%s\"." +#~ msgstr "Не могу да подесим звучни уређај „%s“." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "Не могу да поставим звучни уређај „%s“ на %d Hz." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "Не могу да отворим видео уређај „%s“ ради уписа." + +#~ msgid "Could not close video device \"%s\"." +#~ msgstr "Не могу да затворим видео уређај „%s“." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "OSS уређај „%s“ већ користи неки програм." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "Не могу да приступим уређају „%s“, проверите његова овлашћења." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Не постоји уређај „%s“." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "Не могу да отворим уређај „%s“ ради уписа." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "Не могу да отворим уређај „%s“ ради читања." + +# Виртуелни Систем Датотека +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "Не могу да отворим ВСД датотеку „%s“ ради читања." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Име датотеке није задато." + +#, fuzzy +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "Не могу да отворим ВСД датотеку „%s“ ради уписа." + +#, fuzzy +#~ msgid "No filename given" +#~ msgstr "Име датотеке није задато." + +#~ msgid "Could not close vfs file \"%s\"." +#~ msgstr "Не могу да затворим ВСД датотеку „%s“." + +#~ msgid "No device specified." +#~ msgstr "Уређај није наведен." + +#~ msgid "Device is not open." +#~ msgstr "Уређај није отворен." + +#~ msgid "Device is open." +#~ msgstr "Уређај је отворен." diff --git a/po/stamp-po b/po/stamp-po new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/po/stamp-po @@ -0,0 +1 @@ +timestamp diff --git a/po/sv.gmo b/po/sv.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a835ca9d69b1a6df0ce6886bc0424346b014fb46 GIT binary patch literal 14847 zcmchd3zQ^PdB;l>#RXA7MDbOE!-BirJ2T5`2T*or_A%@ZJMQc*f{&!8yQZhMyQ|u& z>RAS2Kn0BwB`O$2G(>hIfnYSqf^RufJfCJz5K&4L86O;3!-Lcfc#)Rqp=Bp~~Io@(;TFmmp1fe*~We{}`SQ{~SI8{wq{{ zKZMVPKZ7rZ&pE~R=R9~O`HLZsyeW7btV4~X0bd4hf@EAAlFZzkoNuQ%|$y-w*ea{{nn7Jni|69o`II1-}Ph2Tx#d>tO)Z zuiN1(;b-94@G+?I{><@&7g%|p1|`3jJD%sb9!hSP!2oWC=fY1w_4ixwEcjzM49`5n zasq1HH^Qy(PPh&JExZs`Ug&v4unr}M4??~FC{+Ld8>-)HUu4JsT6j76>!I#{0ct#t z!vT0alXL-G1I_rM=J$4ZJiG(aMei<%2)&0OBJ;lP?tdSu{Ewmf^HV5&T*Dx^^hTic zV-M80LcUb~tx)oL2bBEY3nkwVx#xGg=l4MM<5N)O4ngVpS0F?1z5)63{+=(U-a8KE zQvIjH=fE@J)8V;L?X87c59dSa-DQqrj@zNi?Sd+I4b=NJ_q^d4L-n@{rMEXaz6VO* z?|>TjeGnD)J`XjHZ#sS(s-4H6enHtcE1ey^S;KH51)W6Id2si z)$c>ebpT3!7eMv%GN^WTK(&7jRR02~`dd)tx=`}C397w!!!dXpRR11>tKq6wpu2Dw zz6!Qs1%AlozY5j=A3(KtB8yq|oeI_7OQ6~raQQWG1Nrlz)>90%o^FO(PalS==aW$5 zdk{*mABCFF$D!u)hwz4{QRZwro?BmO<@_;d>?c$|9)gn3BT#bq8XSjz3e~@t4Op&r z9CX|O)sIb%;}DbLO~Plu2&%pqO5XGC`8%Q7zYAijy!)Zn96_#H^o-glwqS4L3n z_)zbyhUdfcp`J&u3f~3S!iS;k+}}aX(+im-Js*d!hS$P5_z;wSR?oF||4pz%{z3S9 zc+PqDy|=+@$bTAM0#9O+nM!XPR6qAYy6W8uSHTAzzvB3H_-yX~ndA2z|H(c7Pk24g z{}-x1*RQeqb01W_kHL%d9BzgeF-YBi3%nZM?f5gegZxz}-)rFkcscwLoPZZ0gst#q zcrpAYl)ZQ+ja~&WgOb1;x);ESR5k8|Kj@C{JUBlsNnRw(_s6{_BQ;EC{l_$>HYC^nC_8kY%Ws7~NwUJkdkxa{r1D4m-_<0h#@O`NyNAE;_^{&) zyo#iGJd3o4RD6EVUDV*4Nv|XQ7D+lP{do=PizM7D^SPDpUm=}hv%T*wSGSQgr~0fW zeVlY9NqYKT(tAj^kS-wIMLL7@Hqr-4Un1#q8VQqXbY&cVjI@`Ok|s&gb?L7@zef5H z>C4Kv&u_y!Nbev?ui7N7qotpR+>M(Y&xRrCtt71reMU)j(pu7sNC!wCCH)3TpL0pS zYOd^8P`WNIKgGp5(sk~}yJ1Fpzsnc6k&BHkb3442G)#IK2@_@3+#kR3LuD){pt4VVsAluExSnKC6q(@oW&+ zLT{rVhxz^_ZTexFCaIs)YTY!ful2dkXG1>=)44G9Ypo;;>*h`^iQ~|;>38Gs+78!Y zy)|F;Htu`!&VpoxG+$Gp)Xj+5Mv>WD0w znfL4ATvQ8z5|4S7o`q!YCGukx;c|3 z?ZXs9ut>*fgsW!;HEc)MN&}heG->(Bv))3WfT&nu}z{DD_UYJY@zs zHJ{~SyO^2YtY|&udNXW=ZIt84?H5XY3?*5gM%`#;I+WIQwd!a&KuczkLeS~7qFNv| zI+kkx--qm9opk+r60gpgu({A@#k8Z$NF2R0^CjzIXZgq@NyA!_){kn|`$eBxA4-bs zOAFI5PzRWay1ze-@+F-y%bS5Zdl|DNs-BxoV~*WQ$5sTL9246c`-+7yD;+FLA)m1* zXv7%8sOF7DjVKRVGOER;?5Ml04E3&tdspkdv1EVDGV(SX8_%j$_tleNI%+YNFf(H; zjd{c$#|mbez`&n7zcuXF(}+b=^+#tzY;iQ>M=D^S4i!&b3x%-Qpr+?@)xKoWR}WWk zu?guHbMtR2Dw~L^wB5UPZ>|OFfjvMW_C%N9d5)Q$ck5bg0QxQ!Q{L= z-Bpj5cEq)U_SR9xdgxyf%ZQu z_`}rWbm6I2l(S!_NHApIh->ppr@SXgH;&AyiA!hlypferpppdX-zII;}m0&(3aO^rA(ot6m&W-+u(Fy z4o4_KWiV$eE#fT!&Y5wp?6-5qwqYwfvq>DX(n>zsjwlXgx0cJp^p48~*XqE@>|NJ`Jn&~)$$sm7SC>4| zLJHdbXG~>;q04cgH2SJ{1#YpoJ)ECTg0${$3d4>kr?U{Wp@gdowg!V?i}e=tbVrhO zruDul_sKp=?|6e`@`jo_0~&8&GeP>xL7Ht4g{h`Fr&1Q#8Hk< z?G!b8Ov`vePv- z-Xqj)7W}Rdm1{GbffEdt=1Nwkw{vF3+ZlU18Cj!zUUD~9UIRPjgnDR{)p0Jg#hFQ- z9G&n;m0@pEE1zSPyGYQ#$tW%#-%NJp7AA|6;3U${yk6G1Pkm7p?)YL~U@}eWU3(zj zrJdDd{3%~@9~^9V?X5!DY)&(Gl!zMlK70BdcOk?$AM7WEk=BwRp>1aB|A`TO;IM_NC z!=38LLDO+uHmWFVUNK8<3J*rB!YeN9(a4*ckBJ`a<^*Jo^KQBD#x0cTE$vje{!4lv z#PfbL#trTHznmFo6Arto#BMX};pT)jgFnYoGHVe5=p1F1F_8wv8O&kEl&Rsj1*`|; zWJ+TDnpc@^{9qdGoF&e#PK(p<(Uo=vog>9zDlRAnSMHG6bIg^j_g-z+_FGD4vd-Ud zHPqQaq*Xz!Mkokdx8H52CZd5R+JnvBD9yWA4r8cs`5AWD%BZk>+ir1-?>U{?ORS?E zdRNUxh@!txY<}gXa&>6zZNIR)v2tk^`ablbGG4DRdRf#Fzmeq?YgV&LBT4H1V0CD) zI(%Vuc-5{@*1Iy1HKKZDQ@4>-b|)kLY@T;U)~%cFHm+m02&$a1IJPBeW8JFBox3Ze ztP-8HD`PCF5r24aXt**sTp1qn2M0%n2Ga=wL6!TxY*C%L?C?#1p_H49(OdvT-7A)~SzS75}S z+K(+KkaKC?sbq7P6V#!ys>v)WKH_I{t0u-LHuuFdR2^J}blHID$b5$pi(x8s7w(SBliNabm>s{huUjYbmUY6GYF!?CoSF;R z_nR^`O^jtZ$I{_;M*&Dek_!iWrOKIdq49WnzR{@rvkQkBY~n#0dZTr3JEoQsAyO*h zju8PyKa6KFB(afW)!QD#wg@tB=y5ma4v(9PJq9ZV9~W+lG0zw_W`i-d77k?^qZxN| z;ZT}0ek6OSF3UyhNRx*8y|Ka${9L}2n~L&t>S!$-Xfy&B+{**}vZej*R~IS@sjl}Y zaZ%Na+U^x*h)c_B&Q|Eo3^R}i?BPXBGNnHqZk8ok?muD4PPy+h>B2$DbdlWq{a-lL z>BNE2n4-)KQdCG11$T08%eBq&`P6DtNt%ay-MrDOqe=`grWMwN@e`T4<-y4;XvU1q z%$;xgP{(qkGDU3iD4JcQ^v76UKOY#~3}P)o^oMTJ17<2Fx{Z_E;K;aWJ`XqgayO1@ z=p}un(Wf?Uf2_;w=`exzPlqf^dF`Chi8A=E$8M^RYB2aBJv(v~A}tkviajax(b!(2 z5G+i)*pu3Tkz%^MishNahy_Tili$DwSNZZQ?14Y+~G(n~dJpQtE3_eyKSkrsFoE zzB0H>ZZnT>Wk5 zp(5AImE(xhXG5;qZ<<7sv>TOI!4bNo_ORb6M%2DrCd}ETZg3x?3QeNskYLn%Og-|cE$ND zy=ue0M>&n9_X@pVGHYsb26y5AO>(X4nfGKIVyuA43yBb|rfeWGsQV z@IidnMjCN0A|y2t);S#&Q`fsNL1Z_b3L)FeY4hJ6MQ(|JirY=u(13Ri8$&Ki5JHv| zck}a~#LE0Dh+LRqf;YOEyQ5}erKI0yWJ9V7CReO*b^L3$IgZLL%-Dki)|IW$%Gl2o zlDD2IA&*?UG>&}NZ*p{LI@c1Z80)cc&;O z?`@p(CKnDCA?9M`xB#=umY2>(9Uii8`TX22`H@8^nefW8^Q62=nWc4z$OT4hV4A{B zv;hs54Z>hX4gOD|2tfxn1T7uX??_={jGYU0$nKd-H-5s, 2004. +# Daniel Nylander , 2007, 2008, 2009, 2010, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-01-09 19:36+0100\n" +"Last-Translator: Daniel Nylander \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "Kunde inte etablera en anslutning till ljudservern" + +msgid "Failed to query sound server capabilities" +msgstr "Misslyckades med att fråga efter ljudserverförmågor" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "\"%s\" av \"%s\"" + +msgid "Internal data stream error." +msgstr "Internt fel i dataström." + +msgid "Failed to decode JPEG image" +msgstr "Misslyckades med att avkoda JPEG-bild" + +msgid "Could not connect to server" +msgstr "Kunde inte ansluta till servern" + +msgid "Server does not support seeking." +msgstr "Servern saknar stöd för sökning/spolning." + +msgid "Could not resolve server name." +msgstr "Kunde inte slå upp servernamnet." + +msgid "Could not establish connection to server." +msgstr "Kunde inte etablera anslutning till servern." + +msgid "Secure connection setup failed." +msgstr "Säker anslutning misslyckades." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "Ett nätverksfel inträfade eller servern stängde anslutningen oväntat." + +msgid "Server sent bad data." +msgstr "Servern skickade felaktigt data." + +msgid "No URL set." +msgstr "Ingen URL inställd." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Inget eller ogiltigt inljud. AVI-flödet kommer att skadas." + +msgid "This file contains no playable streams." +msgstr "Den här filen innehåller inga uppspelningsbara strömmar." + +msgid "This file is invalid and cannot be played." +msgstr "Den här filen är ogiltig och kan inte spelas upp." + +msgid "This file is corrupt and cannot be played." +msgstr "Den här filen är skadad och kan inte spelas upp." + +msgid "Invalid atom size." +msgstr "Ogiltig atomstorlek." + +msgid "This file is incomplete and cannot be played." +msgstr "Den här filen är inte fullständig och kan inte spelas upp." + +msgid "The video in this file might not play correctly." +msgstr "Videon i den här filen kanske inte kan spelas upp korrekt." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" +"Den här filen innehåller för många strömmar. Spelar endast upp de första %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Ingen ström som stöds hittades. Du kanske behöver installera en GStreamer-" +"insticksmodul för RTSP för Real Media-strömmar." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Ingen ström som stöds hittades. Du kanske behöver tillåta fler " +"transportprotokoll eller så saknar du kanske det rätta GStreamer-tillägget " +"för RTSP." + +msgid "Internal data flow error." +msgstr "Internt fel i dataflöde." + +msgid "Volume" +msgstr "Volym" + +msgid "Bass" +msgstr "Bass" + +msgid "Treble" +msgstr "Diskant" + +msgid "Synth" +msgstr "Synt" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Högtalare" + +msgid "Line-in" +msgstr "Linje-in" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "Cd" + +msgid "Mixer" +msgstr "Mixer" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Spela in" + +msgid "In-gain" +msgstr "Införstärkning" + +msgid "Out-gain" +msgstr "Utförstärkning" + +msgid "Line-1" +msgstr "Linje-1" + +msgid "Line-2" +msgstr "Linje-2" + +msgid "Line-3" +msgstr "Linje-3" + +msgid "Digital-1" +msgstr "Digital-1" + +msgid "Digital-2" +msgstr "Digital-2" + +msgid "Digital-3" +msgstr "Digital-3" + +msgid "Phone-in" +msgstr "Tele-in" + +msgid "Phone-out" +msgstr "Tele-ut" + +msgid "Video" +msgstr "Video" + +msgid "Radio" +msgstr "Radio" + +msgid "Monitor" +msgstr "Monitor" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Kunde inte öppna ljudenheten för uppspelning. Enheten används av ett annat " +"program." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Kunde inte öppna ljudenheten för uppspelning. Du har inte behörighet att " +"öppna enheten." + +msgid "Could not open audio device for playback." +msgstr "Kunde inte öppna ljudenheten för uppspelning." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Kunde inte öppna ljudenheten för inspelning. Du har inte behörighet att " +"öppna enheten." + +msgid "Could not open audio device for recording." +msgstr "Kunde inte öppna ljudenheten för inspelning." + +msgid "Could not open audio device for mixer control handling." +msgstr "Kunde inte öppna ljudenheten för hantering av mixerstyrning." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Kunde inte öppna ljudenheten för mixerhantering. Denna version av Open Sound " +"System saknar stöd för detta element." + +msgid "Master" +msgstr "Övergripande" + +msgid "Front" +msgstr "Fram" + +msgid "Rear" +msgstr "Bak" + +msgid "Headphones" +msgstr "Hörlurar" + +msgid "Center" +msgstr "Center" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Sida" + +msgid "Built-in Speaker" +msgstr "Inbyggd högtalare" + +msgid "AUX 1 Out" +msgstr "AUX 1 ut" + +msgid "AUX 2 Out" +msgstr "AUX 2 ut" + +msgid "AUX Out" +msgstr "AUX ut" + +msgid "3D Depth" +msgstr "3D-djup" + +msgid "3D Center" +msgstr "3D-center" + +msgid "3D Enhance" +msgstr "3D Enhance" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Linje ut" + +msgid "Line In" +msgstr "Linje-in" + +msgid "Internal CD" +msgstr "Intern cd-spelare" + +msgid "Video In" +msgstr "Video-in" + +msgid "AUX 1 In" +msgstr "AUX 1 in" + +msgid "AUX 2 In" +msgstr "AUX 2 in" + +msgid "AUX In" +msgstr "AUX in" + +msgid "Record Gain" +msgstr "Inspelningsförstärkning" + +msgid "Output Gain" +msgstr "Utförstärkning" + +msgid "Microphone Boost" +msgstr "Mikrofonboost" + +msgid "Loopback" +msgstr "Loopback" + +msgid "Diagnostic" +msgstr "Diagnostik" + +msgid "Bass Boost" +msgstr "Bass Boost" + +msgid "Playback Ports" +msgstr "Uppspelningsportar" + +msgid "Input" +msgstr "Ingång" + +msgid "Record Source" +msgstr "Inspelningskälla" + +msgid "Monitor Source" +msgstr "Monitorkälla" + +msgid "Keyboard Beep" +msgstr "Tangentbordspip" + +msgid "Simulate Stereo" +msgstr "Simulera stereo" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Surroundljud" + +msgid "Microphone Gain" +msgstr "Mikrofonförstärkning" + +msgid "Speaker Source" +msgstr "Högtalarkälla" + +msgid "Microphone Source" +msgstr "Mikrofonkälla" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Center / LFE" + +msgid "Stereo Mix" +msgstr "Stereomix" + +msgid "Mono Mix" +msgstr "Monomix" + +msgid "Input Mix" +msgstr "Ingångsmix" + +msgid "SPDIF In" +msgstr "SPDIF in" + +msgid "SPDIF Out" +msgstr "SPDIF ut" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Digital-ut" + +msgid "Digital In" +msgstr "Digital-in" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +# Telefon? +msgid "Handset" +msgstr "Handhållen" + +msgid "Other" +msgstr "Annat" + +msgid "None" +msgstr "Ingen" + +msgid "On" +msgstr "På" + +msgid "Off" +msgstr "Av" + +msgid "Mute" +msgstr "Tyst" + +msgid "Fast" +msgstr "Snabb" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Mycket låg" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Låg" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Medel" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Hög" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Mycket hög" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Produktion" + +msgid "Front Panel Microphone" +msgstr "Mikrofon på frontpanel" + +msgid "Front Panel Line In" +msgstr "Linje-in frontpanel" + +msgid "Front Panel Headphones" +msgstr "Hörlurar frontpanel" + +msgid "Front Panel Line Out" +msgstr "Linje-ut frontpanel" + +msgid "Green Connector" +msgstr "Grön kontakt" + +msgid "Pink Connector" +msgstr "Rosa kontakt" + +msgid "Blue Connector" +msgstr "Blå kontakt" + +msgid "White Connector" +msgstr "Vit kontakt" + +msgid "Black Connector" +msgstr "Svart kontakt" + +msgid "Gray Connector" +msgstr "Grå kontakt" + +msgid "Orange Connector" +msgstr "Orange kontakt" + +msgid "Red Connector" +msgstr "Röd kontakt" + +msgid "Yellow Connector" +msgstr "Gul kontakt" + +msgid "Green Front Panel Connector" +msgstr "Grön kontakt frontpanel" + +msgid "Pink Front Panel Connector" +msgstr "Rosa kontakt frontpanel" + +msgid "Blue Front Panel Connector" +msgstr "Blå kontakt frontpanel" + +msgid "White Front Panel Connector" +msgstr "Vit kontakt frontpanel" + +msgid "Black Front Panel Connector" +msgstr "Svart kontakt frontpanel" + +msgid "Gray Front Panel Connector" +msgstr "Grå kontakt frontpanel" + +msgid "Orange Front Panel Connector" +msgstr "Orange kontakt frontpanel" + +msgid "Red Front Panel Connector" +msgstr "Röd kontakt frontpanel" + +msgid "Yellow Front Panel Connector" +msgstr "Gul kontakt frontpanel" + +msgid "Spread Output" +msgstr "Spridd utgång" + +msgid "Downmix" +msgstr "Nermixning" + +msgid "Virtual Mixer Input" +msgstr "Virtuell mixer ingång" + +msgid "Virtual Mixer Output" +msgstr "Virtuell mixer utgång" + +msgid "Virtual Mixer Channels" +msgstr "Kanaler för virtuell mixer" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d-funktion" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s-funktion" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Kunde inte öppna ljudenheten för uppspelning. Denna version av Open Sound " +"System stöds inte av detta element." + +msgid "Playback is not supported by this audio device." +msgstr "Uppspelning stöds inte av denna ljudenhet." + +msgid "Audio playback error." +msgstr "Fel vid ljuduppspelning." + +msgid "Recording is not supported by this audio device." +msgstr "Inspelning stöds inte av denna ljudenhet." + +msgid "Error recording from audio device." +msgstr "Fel vid inspelning från ljudenheten." + +msgid "Gain" +msgstr "Förstärk" + +msgid "Headphone" +msgstr "Hörlur" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Fel vid läsning av %d byte från enheten \"%s\"." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Fick oväntade bildrutstorleken %u istället för %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Fel vid läsning av %d byte på enheten \"%s\"." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Fel vid läsning av förmågor för enheten \"%s\": Det är inte en v4l2-" +"drivrutin. Kontrollera om det är en v4l1-drivrutin." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Misslyckades med att fråga efter attribut för ingång %d i enheten %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" +"Misslyckades med att få tag i inställningen för mottagare %d på enheten \"%s" +"\"." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Misslyckades med att fråga efter norm på enheten \"%s\"." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Misslyckades med att få tag på kontrollattributen på enheten \"%s\"." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Kunde inte identifiera enheten \"%s\"." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Det här är inte en enhet \"%s\"." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Kunde inte öppna enheten \"%s\" för läsning och skrivning." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Enheten \"%s\" är ingen fångstenhet." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Enheten \"%s\" är ingen utgångsenhet." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Misslyckades med att ställa in norm för enheten \"%s\"." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" +"Misslyckades med att gå tag på aktuell mottagarfrekvens för enheten \"%s\"." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Misslyckades med att ställa in aktuell mottagarfrekvens för enheten \"%s\" " +"till %lu Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Misslyckades med att få tag på signalstyrka för enheten \"%s\"." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" +"Misslyckades med att få tag på värdet för kontrollen %d på enheten \"%s\"." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Kunde inte ställa in värdet %d för kontrollen %d på enheten \"%s\"." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Misslyckades med att få tag på aktuell ingång på enheten \"%s\". Kan vara en " +"radioenhet" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Kunde inte ställa in ingång %d på enheten %s." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Misslyckades med att få tag på aktuell utgång på enheten \"%s\". Kan vara en " +"radioenhet" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Misslyckades med att ställa in utgång %d på enheten %s." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Kunde inte kölägga buffertar i enheten \"%s\"." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Misslyckades med att få videobildrutor från enheten \"%s\"." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Misslyckades efter %d försök. enhet %s. systemfel: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Kunde inte få tag i parametrar på enheten \"%s\"" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Videoingångsenheten accepterade inte ny inställning för bildfrekvens." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Kunde inte mappa buffertar från enheten \"%s\"." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Drivrutinen för enheten \"%s\" saknar stöd för någon känd fångstmetod." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Ändring av upplösning vid körtid stöds inte än." + +msgid "Cannot operate without a clock" +msgstr "Kan inte fungera utan en klocka" + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Misslyckades med att räkna upp möjliga videoformat som enheten \"%s\" kan " +#~ "arbeta med" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "Bufferttypen stöds inte, indexet är utanför intervallet, inga buffertar " +#~ "har allokerats än eller att userptr eller längden är ogiltig. enhet %s" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "Misslyckades med att försöka få tag på videobildrutor från enheten \"%s" +#~ "\". Inte tillräckligt mycket minne." + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "Otillräckligt minne för att kölägga en användarpekarbuffert. enhet %s." + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "Inga lediga buffertar hittades i poolen på index %d." + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "Enheten \"%s\" kan inte fånga i %dx%d" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "Enheten \"%s\" kan inte fånga i det angivna formatet" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "Kunde inte få tag i buffertar från enheten \"%s\"." + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "" +#~ "Kunde inte få tag i tillräckligt många buffertar från enheten \"%s\"." + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Fel vid start av strömfångst från enheten \"%s\"." + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Fel vid stopp av strömfångst från enheten \"%s\"." + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "" +#~ "Misslyckades med att få tag på kontrollattributen på enheten \"%s\"." + +#~ msgid "Could not read from CD." +#~ msgstr "Kunde inte läsa från cd-skiva." + +#~ msgid "Disc is not an Audio CD." +#~ msgstr "Skivan är inte en ljud-cd." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Den här filen är krypterad och kan inte spelas upp." + +#~ msgid "Could not set parameters on device '%s'" +#~ msgstr "Kunde inte ställa in parametrar på enheten \"%s\"" + +#~ msgid "Device '%s' cannot capture at %d/%d frames per second" +#~ msgstr "Enheten \"%s\" kan inte fånga i %d/%d bildrutor per sekund" + +#~ msgid "Could not exchange data with device '%s'." +#~ msgstr "Kunde inte utväxla data med enheten \"%s\"." + +#~ msgid "Could not open file \"%s\" for writing." +#~ msgstr "Kunde inte öppna filen \"%s\" för skrivning." + +#~ msgid "Error closing file \"%s\"." +#~ msgstr "Fel vid stängning av filen \"%s\"." + +#~ msgid "Could not open file \"%s\" for reading." +#~ msgstr "Kunde inte öppna filen \"%s\" för läsning." + +#~ msgid "No filename specified." +#~ msgstr "Inget filnamn angivet." + +#~ msgid "Could not open control device \"%s\" for writing." +#~ msgstr "Kunde inte öppna styrenheten \"%s\" för skrivning." + +#~ msgid "Could not set audio device \"%s\" to %d Hz." +#~ msgstr "Kan inte ställa in ljudenheten \"%s\" till %d Hz." + +#~ msgid "Could not close audio device \"%s\"." +#~ msgstr "Kunde inte stänga ljudenheten \"%s\"." + +#~ msgid "Could not open video device \"%s\" for writing." +#~ msgstr "Kunde inte öppna videoenheten \"%s\" för skrivning." + +#~ msgid "OSS device \"%s\" is already in use by another program." +#~ msgstr "OSS-enheten \"%s\" används redan av ett annat program." + +#~ msgid "Could not access device \"%s\", check its permissions." +#~ msgstr "Kunde inte komma åt enheten \"%s\". Kontrollera dess rättigheter." + +#~ msgid "Device \"%s\" does not exist." +#~ msgstr "Enheten \"%s\" finns inte." + +#~ msgid "Could not open device \"%s\" for writing." +#~ msgstr "Kunde inte öppna enheten \"%s\" för skrivning." + +#~ msgid "Could not open device \"%s\" for reading." +#~ msgstr "Kunde inte öppna enheten \"%s\" för läsning." + +#~ msgid "Your OSS device could not be probed correctly" +#~ msgstr "Din OSS-enhet kunde inte undersökas korrekt" + +#, fuzzy +#~ msgid "Capture" +#~ msgstr "Satir" + +#, fuzzy +#~ msgid "discid" +#~ msgstr "Ingen skiva" + +#~ msgid "Could not open vfs file \"%s\" for reading." +#~ msgstr "Kunde inte öppna vfs-filen \"%s\" för läsning." + +#, fuzzy +#~ msgid "No filename given." +#~ msgstr "Inget filnamn angivet" + +#~ msgid "Could not open vfs file \"%s\" for writing: %s." +#~ msgstr "Kunde inte öppna vfs-filen \"%s\" för skrivning: %s." + +#~ msgid "No filename given" +#~ msgstr "Inget filnamn angivet" + +#~ msgid "Could not close vfs file \"%s\"." +#~ msgstr "Kunde inte stänga vfs-filen \"%s\"." + +#, fuzzy +#~ msgid "Your OSS device doesn't support mono or stereo." +#~ msgstr "Din OSS-enhet kunde inte undersökas korrekt" + +#~ msgid "No device specified." +#~ msgstr "Ingen enheten angiven." + +#~ msgid "Device is open." +#~ msgstr "Enheten är öppen." + +#~ msgid "" +#~ "The %s element could not be found. This element is essential for " +#~ "playback. Please install the right plug-in and verify that it works by " +#~ "running 'gst-inspect %s'" +#~ msgstr "" +#~ "Elementet %s kunde inte hittas. Detta element är nödvändigt för " +#~ "uppspelning. Installera rätt insticksmodul och verifiera att den fungerar " +#~ "genom att köra \"gst-inspect %s\"" + +#~ msgid "" +#~ "No usable colorspace element could be found.\n" +#~ "Please install one and restart." +#~ msgstr "" +#~ "Inget användbart namnrymdselement kunde hittas.\n" +#~ "Installera ett och starta om." + +#~ msgid "Phone in" +#~ msgstr "Tele in" + +#~ msgid "Phone out" +#~ msgstr "Tele ut" + +#~ msgid "Address of the server to contact for CD queries" +#~ msgstr "Adress till servern som ska kontaktas för cd-frågor" + +#~ msgid "Information to send to server" +#~ msgstr "Information att skicka till server" + +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgid "Server name" +#~ msgstr "Servernamn" + +#~ msgid "Server type" +#~ msgstr "Servertyp" + +#~ msgid "The hostname that will be sent with all queries" +#~ msgstr "Värdnamnet som kommer att skickas med alla frågor" + +#~ msgid "The port that the server is running the database on" +#~ msgstr "Porten som servern kör databasen på" + +#~ msgid "" +#~ "There was an error displaying help: \n" +#~ "%s" +#~ msgstr "" +#~ "Det uppstod ett fel vid visning av hjälp: \n" +#~ "%s" + +#~ msgid "Login Information" +#~ msgstr "Inloggningsinformation" + +#~ msgid "Sen_d no information" +#~ msgstr "Ski_cka ingen information" + +#~ msgid "Send real _information" +#~ msgstr "Skicka verklig _information" + +#~ msgid "Send _other information:" +#~ msgstr "Skicka _annan information:" + +#~ msgid "_Name:" +#~ msgstr "_Namn:" + +#~ msgid "Hostna_me:" +#~ msgstr "Värdna_mn:" + +#~ msgid "_Update Server List" +#~ msgstr "_Uppdatera serverlistan" + +#~ msgid "Other _server:" +#~ msgstr "Annan _server:" + +#~ msgid "Hos_tname:" +#~ msgstr "Vä_rdnamn:" + +#~ msgid "_Port:" +#~ msgstr "_Port:" + +#~ msgid "CD Database Preferences" +#~ msgstr "Inställningar för cd-databas" + +#~ msgid "Unknown / Unknown" +#~ msgstr "Okänd / Okänd" + +#~ msgid "Unknown" +#~ msgstr "Okänd" + +#~ msgid "Multiple matches..." +#~ msgstr "Flera träffar..." + +#~ msgid "Category" +#~ msgstr "Kategori" + +#~ msgid "Disc ID" +#~ msgstr "Skiv-ID" + +#~ msgid "Artist and Title" +#~ msgstr "Artist och titel" + +#~ msgid "Unknown track" +#~ msgstr "Okänt spår" + +#~ msgid "CD Database" +#~ msgstr "Cd-databas" + +#~ msgid "Modify your CD database preferences" +#~ msgstr "Ändra dina inställningar för cd-databas" + +#~ msgid "Blues" +#~ msgstr "Blues" + +#~ msgid "Classical Rock" +#~ msgstr "Klassisk rock" + +#~ msgid "Disco" +#~ msgstr "Disco" + +#~ msgid "Funk" +#~ msgstr "Funk" + +#~ msgid "Grunge" +#~ msgstr "Grunge" + +#~ msgid "Hip-Hop" +#~ msgstr "Hip-Hop" + +#~ msgid "Jazz" +#~ msgstr "Jazz" + +#~ msgid "Metal" +#~ msgstr "Metal" + +#~ msgid "New Age" +#~ msgstr "New Age" + +#~ msgid "Oldies" +#~ msgstr "Gamla godingar" + +#~ msgid "Pop" +#~ msgstr "Pop" + +#~ msgid "R&B" +#~ msgstr "R&B" + +#~ msgid "Rap" +#~ msgstr "Rap" + +#~ msgid "Reggae" +#~ msgstr "Reggae" + +#~ msgid "Rock" +#~ msgstr "Rock" + +#~ msgid "Techno" +#~ msgstr "Techno" + +#~ msgid "Industrial" +#~ msgstr "Industrial" + +#~ msgid "Alternative" +#~ msgstr "Alternativmusik" + +#~ msgid "Ska" +#~ msgstr "Ska" + +#~ msgid "Death Metal" +#~ msgstr "Death Metal" + +#~ msgid "Pranks" +#~ msgstr "Pranks" + +#~ msgid "Soundtrack" +#~ msgstr "Filmmusik" + +#~ msgid "Euro-Techno" +#~ msgstr "Euro-Techno" + +#~ msgid "Ambient" +#~ msgstr "Ambient" + +#~ msgid "Trip-Hop" +#~ msgstr "Trip-Hop" + +#~ msgid "Vocal" +#~ msgstr "Vocal" + +#~ msgid "Jazz+Funk" +#~ msgstr "Jazz+Funk" + +#~ msgid "Fusion" +#~ msgstr "Fusion" + +#~ msgid "Trance" +#~ msgstr "Trance" + +#~ msgid "Classical" +#~ msgstr "Klassiskt" + +#~ msgid "Acid" +#~ msgstr "Acid" + +#~ msgid "House" +#~ msgstr "House" + +#~ msgid "Game" +#~ msgstr "Spel" + +#~ msgid "Sound Clip" +#~ msgstr "Ljudklipp" + +#~ msgid "Gospel" +#~ msgstr "Gospel" + +#~ msgid "Alt" +#~ msgstr "Alt" + +#~ msgid "Soul" +#~ msgstr "Soul" + +#~ msgid "Punk" +#~ msgstr "Punk" + +#~ msgid "Space" +#~ msgstr "Space" + +#~ msgid "Meditative" +#~ msgstr "Meditativt" + +#~ msgid "Instrumental Pop" +#~ msgstr "Instrumentell pop" + +#~ msgid "Instrumental Rock" +#~ msgstr "Instrumentell rock" + +#~ msgid "Ethnic" +#~ msgstr "Folkmusik" + +#~ msgid "Gothic" +#~ msgstr "Gotiskt" + +#~ msgid "Darkwave" +#~ msgstr "Darkwave" + +#~ msgid "Techno-Industrial" +#~ msgstr "Techno-Industrial" + +#~ msgid "Electronic" +#~ msgstr "Electroniskt" + +#~ msgid "Pop-Folk" +#~ msgstr "Pop-Folk" + +#~ msgid "Eurodance" +#~ msgstr "Eurodance" + +#~ msgid "Dream" +#~ msgstr "Dream" + +#~ msgid "Southern Rock" +#~ msgstr "Southern Rock" + +#~ msgid "Comedy" +#~ msgstr "Komedi" + +#~ msgid "Cult" +#~ msgstr "Kult" + +#~ msgid "Gangsta Rap" +#~ msgstr "Gangsta Rap" + +#~ msgid "Top 40" +#~ msgstr "Topp 40" + +#~ msgid "Christian Rap" +#~ msgstr "Kristen rap" + +#~ msgid "Pop/Funk" +#~ msgstr "Pop/Funk" + +#~ msgid "Jungle" +#~ msgstr "Jungle" + +#~ msgid "Native American" +#~ msgstr "Amerikansk urbefolkning" + +#~ msgid "Cabaret" +#~ msgstr "Kabaré" + +#~ msgid "New Wave" +#~ msgstr "New Wave" + +#~ msgid "Psychedelic" +#~ msgstr "Psykedeliskt" + +#~ msgid "Rave" +#~ msgstr "Rejv" + +#~ msgid "Showtunes" +#~ msgstr "Showtunes" + +#~ msgid "Trailer" +#~ msgstr "Trailer" + +#~ msgid "Lo-Fi" +#~ msgstr "Lo-Fi" + +#~ msgid "Tribal" +#~ msgstr "Tribal" + +#~ msgid "Acid Punk" +#~ msgstr "Acid Punk" + +#~ msgid "Acid Jazz" +#~ msgstr "Acid Jazz" + +#~ msgid "Polka" +#~ msgstr "Polka" + +#~ msgid "Musical" +#~ msgstr "Musikal" + +#~ msgid "Rock & Roll" +#~ msgstr "Rock & Roll" + +#~ msgid "Hard Rock" +#~ msgstr "Hårdrock" + +#~ msgid "Folk" +#~ msgstr "Folk" + +#~ msgid "Folk/Rock" +#~ msgstr "Folk/Rock" + +#~ msgid "National Folk" +#~ msgstr "Nationell Folk" + +#~ msgid "Swing" +#~ msgstr "Swing" + +#~ msgid "Fast-Fusion" +#~ msgstr "Fast-Fusion" + +#~ msgid "Bebop" +#~ msgstr "Bebop" + +#~ msgid "Latin" +#~ msgstr "Latinskt" + +#~ msgid "Revival" +#~ msgstr "Uppväckelse" + +#~ msgid "Celtic" +#~ msgstr "Keltiskt" + +#~ msgid "Bluegrass" +#~ msgstr "Bluegrass" + +#~ msgid "Avantgarde" +#~ msgstr "Avantgarde" + +#~ msgid "Gothic Rock" +#~ msgstr "Gotisk rock" + +#~ msgid "Progressive Rock" +#~ msgstr "Progressiv rock" + +#~ msgid "Psychedelic Rock" +#~ msgstr "Psykedelisk rock" + +#~ msgid "Symphonic Rock" +#~ msgstr "Symfonisk rock" + +#~ msgid "Slow Rock" +#~ msgstr "Slow Rock" + +#~ msgid "Big Band" +#~ msgstr "Big Band" + +#~ msgid "Chorus" +#~ msgstr "Kör" + +#~ msgid "Easy Listening" +#~ msgstr "Lättlyssnat" + +#~ msgid "Acoustic" +#~ msgstr "Akustiskt" + +#~ msgid "Humour" +#~ msgstr "Humor" + +#~ msgid "Speech" +#~ msgstr "Tal" + +#~ msgid "Chanson" +#~ msgstr "Chanson" + +#~ msgid "Opera" +#~ msgstr "Opera" + +#~ msgid "Chamber Music" +#~ msgstr "Kammarmusik" + +#~ msgid "Sonata" +#~ msgstr "Sonat" + +#~ msgid "Symphony" +#~ msgstr "Symfoni" + +#~ msgid "Booty Bass" +#~ msgstr "Booty Bass" + +#~ msgid "Primus" +#~ msgstr "Primus" + +#~ msgid "Porn Groove" +#~ msgstr "Porn Groove" + +#~ msgid "Slow Jam" +#~ msgstr "Slow Jam" + +#~ msgid "Club" +#~ msgstr "Klubb" + +#~ msgid "Tango" +#~ msgstr "Tango" + +#~ msgid "Samba" +#~ msgstr "Samba" + +#~ msgid "Folklore" +#~ msgstr "Folklore" + +#~ msgid "Ballad" +#~ msgstr "Ballad" + +#~ msgid "Power Ballad" +#~ msgstr "Power Ballad" + +#~ msgid "Rhythmic Soul" +#~ msgstr "Rhythmic Soul" + +#~ msgid "Freestyle" +#~ msgstr "Freestyle" + +#~ msgid "Duet" +#~ msgstr "Duett" + +#~ msgid "Punk Rock" +#~ msgstr "Punkrock" + +#~ msgid "Drum Solo" +#~ msgstr "Trumsolo" + +#~ msgid "A Cappella" +#~ msgstr "A cappella" + +#~ msgid "Euro-House" +#~ msgstr "Euro-House" + +#~ msgid "Dance Hall" +#~ msgstr "Dance Hall" + +#~ msgid "Goa" +#~ msgstr "Goa" + +#~ msgid "Drum & Bass" +#~ msgstr "Drum & Bass" + +#~ msgid "Club-House" +#~ msgstr "Club-House" + +#~ msgid "Hardcore" +#~ msgstr "Hardcore" + +#~ msgid "Terror" +#~ msgstr "Terror" + +#~ msgid "Indie" +#~ msgstr "Indie" + +#~ msgid "BritPop" +#~ msgstr "BritPop" + +#~ msgid "Negerpunk" +#~ msgstr "Negerpunk" + +#~ msgid "Polsk Punk" +#~ msgstr "Polsk Punk" + +#~ msgid "Beat" +#~ msgstr "Beat" + +#~ msgid "Christian Gangsta Rap" +#~ msgstr "Kristen gangsta rap" + +#~ msgid "Heavy Metal" +#~ msgstr "Heavy Metal" + +#~ msgid "Crossover" +#~ msgstr "Crossover" + +#~ msgid "Contemporary Christian" +#~ msgstr "Modern kristen" + +#~ msgid "Christian Rock" +#~ msgstr "Kristen rock" + +#~ msgid "Merengue" +#~ msgstr "Merengue" + +#~ msgid "Salsa" +#~ msgstr "Salsa" + +#~ msgid "Thrash Metal" +#~ msgstr "Thrash Metal" + +#~ msgid "Anime" +#~ msgstr "Anime" + +#~ msgid "JPop" +#~ msgstr "JPop" + +#~ msgid "Synthpop" +#~ msgstr "Synthpop" + +#~ msgid "Nu-Metal" +#~ msgstr "Nu-Metal" + +#~ msgid "Art Rock" +#~ msgstr "Art rock" + +#~ msgid "Editing Disc ID: %s" +#~ msgstr "Redigerar skivid: %s" + +#~ msgid "Editing Disc ID: " +#~ msgstr "Redigerar skivid: " + +#~ msgid "_Artist:" +#~ msgstr "_Artist:" + +#~ msgid "Disc _Title:" +#~ msgstr "Skiv_titel:" + +#~ msgid "Show advanced disc options" +#~ msgstr "Visa avancerade skivalternativ" + +#~ msgid "Hide advanced disc options" +#~ msgstr "Dölj avancerade skivalternativ" + +#~ msgid "_Disc comments:" +#~ msgstr "_Skivkommentarer:" + +#~ msgid "_Genre:" +#~ msgstr "_Genre:" + +#~ msgid "_Year:" +#~ msgstr "_År:" + +#~ msgid "Title" +#~ msgstr "Titel" + +#~ msgid "Length" +#~ msgstr "Längd" + +#~ msgid "Show advanced track options" +#~ msgstr "Visa avancerade spåralternativ" + +#~ msgid "Hide advanced track options" +#~ msgstr "Dölj avancerade spåralternativ" + +#~ msgid "_Extra track data:" +#~ msgstr "_Extra spårdata:" + +#~ msgid "Time Line" +#~ msgstr "Tidslinje" + +#~ msgid "Line for displaying the time elapsed for the current track" +#~ msgstr "Linje för visning av den tid som gått tid för aktuellt spår" + +#~ msgid "Info Line" +#~ msgstr "Informationsrad" + +#~ msgid "Line for displaying information" +#~ msgstr "Rad för visning av information" + +#~ msgid "Artist Line" +#~ msgstr "Artistrad" + +#~ msgid "Line for displaying the name of the artist" +#~ msgstr "Rad för visning av namnet på artisten" + +#~ msgid "Album Line" +#~ msgstr "Albumrad" + +#~ msgid "Line for displaying the name of the album" +#~ msgstr "Rad för visning av namnet på albumet" + +#~ msgid "Pause" +#~ msgstr "Paus" + +#~ msgid "Playing %s - %s" +#~ msgstr "Spelar %s - %s" + +#~ msgid "Unknown Artist" +#~ msgstr "Okänd artist" + +#~ msgid "Unknown Album" +#~ msgstr "Okänt album" + +#~ msgid "Playing" +#~ msgstr "Spelar" + +#~ msgid "Paused" +#~ msgstr "Gör paus" + +#~ msgid "CD Player" +#~ msgstr "Cd-spelare" + +#~ msgid "Stopped" +#~ msgstr "Stoppad" + +#~ msgid "Disc error" +#~ msgstr "Skivfel" + +#~ msgid "Data CD" +#~ msgstr "Data-cd" + +#~ msgid "No Cdrom" +#~ msgstr "Ingen cd-rom" + +#~ msgid "Drive Error" +#~ msgstr "Enhetsfel" + +#~ msgid "You do not seem to have permission to access %s." +#~ msgstr "Du verkar inte ha rättighet att komma åt %s." + +#~ msgid "Unknown artist" +#~ msgstr "Okänd artist" + +#~ msgid "Unknown disc" +#~ msgstr "Okänd skiva" + +#~ msgid "%d - Unknown" +#~ msgstr "%d - okänd" + +#~ msgid "P_revious track" +#~ msgstr "F_öregående spår" + +#~ msgid "_Stop" +#~ msgstr "_Stopp" + +#~ msgid "_Play / Pause" +#~ msgstr "S_pela/Paus" + +#~ msgid "_Next track" +#~ msgstr "_Nästa spår" + +#~ msgid "_Eject disc" +#~ msgstr "_Mata ut skiva" + +#~ msgid "_Help" +#~ msgstr "_Hjälp" + +#~ msgid "_About CD player" +#~ msgstr "_Om cd-spelare" + +#~ msgid "Set device" +#~ msgstr "Ställ in enhet" + +#~ msgid "No CD device" +#~ msgstr "Ingen cd-enhet" + +#~ msgid "_Details" +#~ msgstr "_Detaljer" + +#~ msgid "_Set device" +#~ msgstr "_Ställ in enhet" + +#~ msgid "Volume control" +#~ msgstr "Volymkontroll" + +#~ msgid "Position" +#~ msgstr "Position" + +#~ msgid "Open track editor" +#~ msgstr "Öppna spårredigerare" + +#~ msgid "Track editor" +#~ msgstr "Spårredigerare" + +#~ msgid "Open preferences" +#~ msgstr "Öppna inställningar" + +#~ msgid "Preferences" +#~ msgstr "Inställningar" + +#~ msgid "Track List" +#~ msgstr "Spårlista" + +#~ msgid "Previous track" +#~ msgstr "Föregående spår" + +#~ msgid "Previous" +#~ msgstr "Föregående" + +#~ msgid "Rewind" +#~ msgstr "Spola tillbaka" + +#~ msgid "Play / Pause" +#~ msgstr "Spela/Paus" + +#~ msgid "Stop" +#~ msgstr "Stopp" + +#~ msgid "Fast forward" +#~ msgstr "Snabbspola" + +#~ msgid "Next track" +#~ msgstr "Nästa spår" + +#~ msgid "Eject CD" +#~ msgstr "Mata ut cd" + +#~ msgid "Eject" +#~ msgstr "Mata ut" + +#~ msgid "CD device to use" +#~ msgstr "Cd-enhet att använda" + +#~ msgid "Only start if there isn't already a CD player application running" +#~ msgstr "Starta endast om det inte finns ett annat cd-spelarprogram som kör" + +#~ msgid "Play the CD on startup" +#~ msgstr "Spela cd-skivan vid uppstart" + +#~ msgid "Cannot create player" +#~ msgstr "Kan inte skapa spelare" + +#~ msgid "Play audio CDs" +#~ msgstr "Spela ljud-cd" + +#~ msgid "CD player theme" +#~ msgstr "Cd-spelartema" + +#~ msgid "Device path" +#~ msgstr "Enhetssökväg" + +#~ msgid "Record sound clips" +#~ msgstr "Spela in ljudklipp" + +#~ msgid "Sound Recorder" +#~ msgstr "Ljudinspelare" + +#~ msgid "About" +#~ msgstr "Om" + +#~ msgid "Close" +#~ msgstr "Stäng" + +#~ msgid "Close this window" +#~ msgstr "Stäng detta fönster" + +#~ msgid "Contents" +#~ msgstr "Innehåll" + +#~ msgid "Create a new sample" +#~ msgstr "Skapa ett nytt ljudklipp" + +#~ msgid "File Information" +#~ msgstr "Filinformation" + +#~ msgid "File _Information" +#~ msgstr "Fil_information" + +#~ msgid "Main toolbar" +#~ msgstr "Huvudverktygsrad" + +#~ msgid "New" +#~ msgstr "Nytt" + +#~ msgid "Open a file" +#~ msgstr "Öppna en fil" + +#~ msgid "Play sound" +#~ msgstr "Spela ljud" + +#~ msgid "Quit" +#~ msgstr "Avsluta" + +#~ msgid "Quit the application" +#~ msgstr "Avsluta programmet" + +#~ msgid "Recent _Files" +#~ msgstr "Senaste _filer" + +#~ msgid "Run Mixer" +#~ msgstr "Kör mixer" + +#~ msgid "Run _Mixer" +#~ msgstr "Kör _mixer" + +#~ msgid "Run the audio mixer" +#~ msgstr "Kör ljudmixern" + +#~ msgid "Save" +#~ msgstr "Spara" + +#~ msgid "Save As" +#~ msgstr "Spara som" + +#~ msgid "Save _As..." +#~ msgstr "Spara so_m..." + +#~ msgid "Save the current file" +#~ msgstr "Spara den aktuella filen" + +#~ msgid "Save the current file with a different name" +#~ msgstr "Spara den aktuella filen med ett annat namn" + +#~ msgid "Show information about the current file" +#~ msgstr "Visa information om den aktuella filen" + +#~ msgid "Show information for Sound Recorder" +#~ msgstr "Visa information för ljudinspelaren" + +#~ msgid "Stop sound" +#~ msgstr "Stoppa ljud" + +#~ msgid "_About" +#~ msgstr "_Om" + +#~ msgid "_Close Window" +#~ msgstr "S_täng fönster" + +#~ msgid "_Contents" +#~ msgstr "_Innehåll" + +#~ msgid "_Control" +#~ msgstr "_Kontroll" + +#~ msgid "_File" +#~ msgstr "_Fil" + +#~ msgid "_New" +#~ msgstr "_Nytt" + +#~ msgid "_Open..." +#~ msgstr "_Öppna..." + +#~ msgid "_Play" +#~ msgstr "_Spela" + +#~ msgid "_Quit" +#~ msgstr "_Avsluta" + +#~ msgid "_Record" +#~ msgstr "Spela _in" + +#~ msgid "_Save" +#~ msgstr "_Spara" + +#~ msgid "hours" +#~ msgstr "timmar" + +#~ msgid "hour" +#~ msgstr "timme" + +#~ msgid "minutes" +#~ msgstr "minuter" + +#~ msgid "minute" +#~ msgstr "minut" + +#~ msgid "seconds" +#~ msgstr "sekunder" + +#~ msgid "second" +#~ msgstr "sekund" + +#~ msgid "Ready" +#~ msgstr "Klar" + +#~ msgid "Save file as" +#~ msgstr "Spara fil som" + +#~ msgid "%s is not installed in the path." +#~ msgstr "%s är inte installerad i sökvägen." + +#~ msgid "There was an error starting %s: %s" +#~ msgstr "Det uppstod ett fel vid start av %s: %s" + +#~ msgid "%s (Has not been saved)" +#~ msgstr "%s (Har inte sparats)" + +#~ msgid "Unknown size" +#~ msgstr "Okänd storlek" + +#~ msgid "%.1f kHz" +#~ msgstr "%.1f kHz" + +#~ msgid "%.0f kb/s" +#~ msgstr "%.0f kb/s" + +#~ msgid "1 (mono)" +#~ msgstr "1 (mono)" + +#~ msgid "2 (stereo)" +#~ msgstr "2 (stereo)" + +#~ msgid "Folder:" +#~ msgstr "Mapp:" + +#~ msgid "Filename:" +#~ msgstr "Filnamn:" + +#~ msgid "File size:" +#~ msgstr "Filstorlek:" + +#~ msgid "Audio Information" +#~ msgstr "Ljudinformation" + +#~ msgid "Song length:" +#~ msgstr "Låtlängd:" + +#~ msgid "Number of channels:" +#~ msgstr "Antal kanaler:" + +#~ msgid "Sample rate:" +#~ msgstr "Samplingsfrekvens:" + +#~ msgid "Bit rate:" +#~ msgstr "Bithastighet:" + +#~ msgid "Playing..." +#~ msgstr "Spelar upp..." + +#~ msgid "%s.%s - Sound Recorder" +#~ msgstr "%s.%s - Ljudinspelare" + +#~ msgid "Recording..." +#~ msgstr "Spelar in..." + +#~ msgid "File information" +#~ msgstr "Filinformation" + +#~ msgid "" +#~ msgstr "" + +#~ msgid "Length:" +#~ msgstr "Längd:" + +#~ msgid "Adjust the volume level" +#~ msgstr "Justera nivån på volymen" + +#~ msgid "%s Slider" +#~ msgstr "%s-skjutreglage" + +#~ msgid "Channel %d of %s Slider" +#~ msgstr "Kanal %d för %s-skjutreglage" + +#~ msgid "%s Slider %d" +#~ msgstr "%s-skjutreglage %d" + +#~ msgid "%s Lock" +#~ msgstr "%s-lås" diff --git a/po/tr.gmo b/po/tr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a063a8ad2fa54756bc86c374a388840b3b6df48f GIT binary patch literal 14734 zcmchdd5|1eea9QHjghgzHs&w{H`uZ)OFPVo9sZ(s~!IEL#o^^zQV|HZ#*b z?&)5676|4r1`}`s*cfxHIR)m3#UVnFal)>ERDh839~>bRP*i{lsSv0Hr~)dV?|ZLj zdPgf{7fGh{=F`WUcl@sRdvEpKvrf9pvR>O0-zZ~+)n}CmnRj7H?;IrXtp!#_q)VS}5m%z_Jwf9rF8lHNV z2?2{SkOGJo_ok9o_~nhW`R@fTuFK^)P@M z*In=e_$hck{1()Ff9rVaQ?0zuhLYcTj;kHlL&@zb7{IOYB6tvLykCdUg};Qu@Z6_a zjzZ1*R=6F$6YhXNgqOjAr+eNItU}4*Zm8cMg&O~_pvJxS8Fv0JfLC+>QmE%gpyu;^ zxDuX>k}id7pqW3Ee(!=O!+Rk^^zMU*(EAKTWZplx=ih^>|4XRx{07P%*Dwh#y^T=z zaUImWLcUc0l~D3|EtLG;1SQ{l-23;r_aA~9#{*FH4nx`b-$JI~eFgH*`&YhDz4us* zOYNTnPlxBi$H9xB`dbU-50^mM-Bpewj=P}h?SZOyBh>Gw-20ki3^m>y%5HCUd?S>- z-wQSGk3dY=`yA9fzUufeR6pN>lGpd4`uiEw_Ua0K_wRS_?}w7}C!xmmAe0`z;_iP0*Kz;f zQ1id=Jlp;d)Oel;CD$vV`q=`dhcP$^Z*uos^5no|GdBF%ZERKxSY3w z8@2C4$#o@^{4RwW=T%Vs?1t+9MyT-xQ0+IM>g7=Kcnws4cfb+&R;clP3$B7Io`dbe zVR$iY!U1@XyZ<88`2Q2CzteDLwRaX&f6s#IXQjJe12=Gg36wv@Q2ulqls~;4s-2HR z&F|Atc6}5|pWlbl=g;BokD<=_cD`@Bz|QjnP;zwY zXAJ87i`;z!N^UQMlIQJEp>{{_?mnE6DYa-8frXeUuf-eHN<4S zwNUS`fv3PKRR49j4c-C?b>2g;0>1$fv3Cke;nKSZu7P8aF1(jQ#l!c&1U?K`!z~wi z-iu)q*5KFRZg?3l)!wV&R`>y^`1x-TllGpCvbprGg3^19ugAkTL(ThMs5o;!Tmc_+ z{IcW2P;&b&d_DXrTnA?vwA%e3M1|hhq5A&?lz(qnYv~6`12*9m z@G!g_{v2+CYY-NfUK1h$?;Y?;xBz9x8iefo3aH;V96tor{|}+&`AjNF&*wwg=_)8a zJ|9YNd!g(hhN}N6xDDO`&w&2~S%SRpLB+jaL)r0ZDCs1)3Z4wt!Y9CC_(XUmRKGjn zli(;k1>OW#z$#Sz1Zo@|sD9o8HNKBRwf_b9WcVeh_Pz;EgWrK__s3BE|H|=qjwfLR zs<*=NsSr2wo(naO3!vIx15bs6P~+O*I0EGdWAIG)5_lGT8Ps_0gzEP`sCj%4N{$ae zwYLZ*hp$5U`M2R!@R#r&cqv9O3%>?cf9oYy{?|f{Zy!{9H$nN?&F=Y~?)lyDES}#F zC6@=G#`AYj^ZpW){vL)J?+>8n^9y%>#-%oYIS;D89ZA3)Xr8N3L}80Cknq3Z2`8t)9${2Ea5yVc#_;rMQ-aeV?xFQ0`* zu2B7a6>6UU3}v@Jf)V@=h>LjppJ&JUI=GqpPeAqmUr_ou2WLAU4nx`BKB#fEp!&(6 z+J8BeTwV{=@11ZPd>4Eg{2_b_{0)3MJadEn-NjJyx(rJ0+ui-7yKh6;;|D3T6wTqq z6n!KQ=~kb=vG7LWO3DS4k5e?Kw@}_kDL!#=0k5HqP>xVOKpCJgL=$T#p~m)V%BLy% zeA2?3fw+)&HRZFE*HiS_LupVBP!xwgMA7FQ3-5Ngk@69Dza9FN9h3_xHOfmV<&X5R zpMpxf7UfSU`uvrJ_t%co@OsJ%D9@!_M=3rZbr)0cX37nedCJ9(&tXf z%P8{c@+ar!trW#JeO6K4OSzUJdwvt;jg&V~E~VT@k^WyrxtsENiaxUGL5gf>C*|Fg zeUy|kPLVAuF6i?*$~}~abmKnnf%j5gOL;1#Ns-<5e?H?LyvFf-7*bwIk^kzmg;J%g zr96Z3e#*Nje?igbBFdkcEBh6cu8YeDxL8M-a}Vx-ZOWV7eSurK*yL{Rg11nHDe`?n zj){GrfPYGP4&{Ez=@j|SYKlIWQO3*_>yqOHJWM(0?oWo>D1Ywm-wDrf*N0$-@_fo; z-Lnrnz5>3DvVrm`_v{^TH{~`;=AK3HC6qelM)&M<@FvP%QXWTnA*J}d++Dl~?xG}= z3gtA)$0%1&)>HJ^N_jfv?YiM}uD({b{gqXJTOLnkQ4;I6d%bF9dzC-g@kMX_h`%L_ zvoO`wNZ86|bg?y_3F4{H+vLY#b|6XXewe07>L*iEc^X#N`dnu-q2CVE*)a8|8c92> znkQ399EYY)Kaay(T3mei?KX2SHs1lVZV6f>X_TS8YOfCH&6mG9N!ppWxuKU^Y|lyR?zg2$ocZHH95$A`%ftTLIi7dh_@w(<0SK=Dk6)fJAO5sjiy2)$x87uX@zN!h5mskn@RG_41eyHgzYStY((uDzofiwljZ)7TQkYy>ajzpG45872F(!r zYWvKsG=kDln?b8P%;_{~9;X_DMLNbJTsza4VKcf#7KpCXq~RmaY6F3mNByXN=kJ|C z>KJufx=5ytQIDzT2{XxwPCE;mg=V^1kw0bnW!MOt7{`hGFO2$8)WkoHxzWvJD67fk zb@UuyB{N7NXtf&AR3I~YG|m3MPubs}K`_Sk|F!D!ZZvt05nnc52R7nHyGpIOw`587?-GcPManiJ5MK81g(q^ z+nxKel?W>>B1<8kktnFe1j1;_8;NRB7Bm!8i%Z2(cReuFy&CRbt@lQf12JyoZ8b3- zuhsB1l3+4wFqg1x=2)8ZMt>(!uq_1!{_G`4S8-_w=~Z+3w+)p;M8(?{L=C(om?j2kNz78_Qz=5sN-o>hrOgVr z(O=mve$o|$jV(+j1cxj;Z&kFuH?KoTb!yC$2uTvx#vTnpvoqm;fCF$nTc4ndwX?}@p`v%cB z;&xPvG0k?y{A=0Fi8`1K8Z2LOt|GYq-X0irN+c|)2pcpq=4ZXducuz-VSf`RY4i6C z-BxOsmbfLZQJN$o>8kex($tc@vXT2c=E`za1KlzAgo%;%^-IHRa z>^cyLIw6eGM-oRFIlZH@FjFOo6JLTGB^-O#CjNDMcC)&YcX5qhM6s2I^(M0-to1kT z+i9W?LOT#O8Va;59BJONKkFrPPO=9AEqtW56_YG9QDDY~C}a^y{GcJlG!xe9EDhqe zvU9(cCRs9-G*}?WOtCYQmmP@O5WZKdt{Hv{gQjIybp{i z3H7ijYvWvKi8D$b-!ke^28O+Hc|O}JcadO!<567RzM0$Qdl)Zvg5yZL?R9Tm`qUFu zk&Z9T1;*2)n%fQW9<8h%^H2Fw`ru%PYabQHX78lAN7&CEOr#e!bhrF;CdNm0Zu57> zp1qJSPK4TFmv>@Vb>8x)O&U|-z1eYB6C$qmhHlE(epqLO-3o2x7?VUj1reSSsrhQ= z4Q)*)aN;oWijA#fG2Mxl5;Sec6{Cu}<|oGGCdgpq6<%>+w?^JXC+75EFFPO`ocAh) zH))|lZ)v3>_3s;f5O@4~Od8tFf7vt6By4uoh+Sq_!_5wBntTpdGQNlaw2v}w%t?dJ z8O&zJ)R`i03-AZzWNNX=B?C7OhnX)^FG~`fmZ21t{IR&vF~61ar=zr;kwTV!iaodp zVlw|Jdpv-vYgF2+_j;jf6i+41R)gK}BdhHKI$Mh4G+bohCE3zt8ZuFDpVA?-=9nu* z?|oXX?YE51+`4?jwNPaNkyQm#Qyc{m>khc()SPHwiFRYNFG{nV$YBCCDL>N=8*Lga zKekKU(r3=5_HowH487}TB1F-16nnqCtLzU=yzNzX50cHl_)*jfKZ1iWcthI67y2-pY$7&H& z*kiG6OVZl972{)j2e#lP+G!7r;8Gj?;lZKdfx+Q{;URx;aO2S6nn6BP9N5FAT_fn# z8yXno-{q<|xPHyxF!gq`unz3iI)Z~H=|0fELjRDtJ*O~-^3U>5-eiPSn zHW&kYNdq?ed-JreL!2vXaXyfx1NqQ!a5cv|S-V2=%A!ezR|_i~==FZOk+o~Z=+4ot zJuwYc23H_u79s}JX)&{mWoaD-9mQApQ!_z|8C;cT(*u|H>S^GdG7W6S!nF_H=wCh= zWh>k%CHGBnqE8EG}My65Ri0ZoD9>x)EaI-n$ zm}7CCbAv2sFCJp?>hSY`tyQBMt>xgR!%~*V`BYByTbyqMakhAL&DJXBviC4iq-iryM+`_@2(F}^= znzKuLbh#OVD;m875Hy21vOc343wMCI zaJ#L*OzH@B;o!pIxrHO~!V!8qvN*qRgt)&rk4Up9ZH9G!Cgj~556L5qJ|cRiQ=>6d z=XB$P>D5U2WbU`o$HI~3!jZMQTR6NpA9kXy63hTA zo>bWkIJ-IF$R2S`-kvDQgsa=ikTJpk}lx?x7(br9(3(o(^?dYzP z)GOZ6cjrBuF@Av$FeZ){JHea=cTC6Dz5Jj`cg{tdUDG7=*??f$l8!n-Juo`znx=8$ z#<4Yx!6`uWM%1fH#38$$(4^ZW3ob-b-}?Y)+}pAHEt-~`m}O%zEENj+?Ljq4;Rum z4PjK(Fe8MLF=_3ycA&wqeIxR=lQ<1@zA0Y|SXQJ!^j&eyaIVQor-=&1Vr0%bM{Gc1 zn=s2FE>)tmWd~?%-8Jf&MB z@5tzoWzg;qN=!q(`a>NK_IF`7t|(w5dTb zoTKxFM%l6UmRy_(G1je#nICn&qMA5GZ zrqd^nV=cg(t}2dUsA{e62i?HcmA&h3nZEkW+awmG0o0W1k_ouk^#9c6J4?;Z4pd1< zX}_nb5laUaGtwkBA!OjMzO{wzfH?-894LsJE*SK<`ST*c;6iQyH)!DsskE*qBZoM}ir} zdy?tJ2Nn+M&&3GcY!!;&TIqY!?7i4-LLf)9_N>+l#U0i*g4s^!Z;m)6;7mO-=e1>> z=(?;4?pZbUJ#4<$>)XXv2F|#u3x^5KP5#%`D0|G1^SLw&w4xflbuY}Zt$k(=ZQbPr zn^y+3f8hw}YlHQt_XDHwDXgJr%O}5y*>mw|m(~!HezUpZckgz4x!R#L1cN?VjnJC)hQtXKhc?rXI}5MjGVXqpPi zq(+Ke2KSW8?{4zp)ExqvUhQiZfYd}g^_OkA?W&Lasjg9NvZrIJfi6b@!Lvc-Z7zt+W%i50>rTZcu!U(JVFIX7)f>M>nCcyK)^1 z6gyG33EHn!rD<1qZ&O+in1ix;hu)Z7F5ffx{x0e+VLNuCwF|Gne&^`DG@a7ZW#?p% zh>O^4@4B+|wl5r+4LL0-HqbIQISW|2P!?MO{${6%_0QkEX2+ppGubqejo=(tL;ix(yG$i({z{&TVu0RP~yy=EX;qxQjDROeu2pua8}=eU9Z_9YW4i(ycka2T)_VO<7qeX~8m4km??xFpvaM!n`4a*EpMXHqp!cFf zds@RebhnAgWG=6xt8NvPi$B}Jg!Oi`%**bNZANaD-PZthO!%?;L%Xw+fH`DlnOwM? zfp;%, 2010. +# Server Acim , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.26.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-01-08 00:03+0200\n" +"Last-Translator: Server Acim \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "Ses sunucusuyla bağlantı kurulumayor" + +msgid "Failed to query sound server capabilities" +msgstr "Ses sunucusu olanakları sorgulanamadı" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "'%s' tarafından '%s'" + +msgid "Internal data stream error." +msgstr "İç veri akım hatası." + +msgid "Failed to decode JPEG image" +msgstr "JPEG görüntüsünü çözümlenemedi" + +msgid "Could not connect to server" +msgstr "Sunucuya bağlanamıyor" + +msgid "Server does not support seeking." +msgstr "Sunucu aramayı desteklemiyor." + +msgid "Could not resolve server name." +msgstr "Sunucu adı çözümlenemiyor." + +msgid "Could not establish connection to server." +msgstr "Sunucuyla bağlantı kurulumayor." + +msgid "Secure connection setup failed." +msgstr "Güvenli bağlantı ayarı yapılamadı." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Bir ağ hatası meydana geldi, veya sunucu bağlantıyı beklenmeyen bir şekilde " +"kesti." + +msgid "Server sent bad data." +msgstr "Sunucu yetersiz veri gönderdi." + +msgid "No URL set." +msgstr "Hiç bir URL ayarlanmamış." + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "Geçerli bir ses girişi bulunamadı. AVI akışı kesilecek." + +msgid "This file contains no playable streams." +msgstr "Dosya çalınabilir akışlar içermiyor." + +msgid "This file is invalid and cannot be played." +msgstr "Bu dosya geçersiz ve oynatılamaz." + +msgid "This file is corrupt and cannot be played." +msgstr "Bu dosya bozuk ve oynatılamaz." + +msgid "Invalid atom size." +msgstr "Geçersiz atom boyutu" + +msgid "This file is incomplete and cannot be played." +msgstr "Dosya eksik ve oynatılamaz." + +msgid "The video in this file might not play correctly." +msgstr "Bu dosyadaki vidyo doğru oynatılamıyabilir." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Bu dosya çok fazla akış içeriyor. Sadece ilki oynatılıyor %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Desteklenen bir akış bulunamadı. Real Media akışları için bir GStreamer RTSP " +"uzantı eklentisi kurmalısınız." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Desteklenen akış bulunamadı. Daha fazla aktarım protokolüne izin vermeniz " +"veya doğru GStreamer RTSP uzantı eklentisine onay vermeniz gerekebilir." + +msgid "Internal data flow error." +msgstr "İç veri akış hatası." + +msgid "Volume" +msgstr "Ses Girişi" + +msgid "Bass" +msgstr "Bas" + +msgid "Treble" +msgstr "Tiz" + +msgid "Synth" +msgstr "Synthisizer" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Hoparlör" + +msgid "Line-in" +msgstr "Hat girişi" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Karıştırıcı" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Kayıt" + +msgid "In-gain" +msgstr "Kazanç-girişi" + +msgid "Out-gain" +msgstr "Kazanç-çıkışı" + +msgid "Line-1" +msgstr "Hat-1" + +msgid "Line-2" +msgstr "Hat-2" + +msgid "Line-3" +msgstr "Hat-3" + +msgid "Digital-1" +msgstr "Sayısal-1" + +msgid "Digital-2" +msgstr "Sayısal-2" + +msgid "Digital-3" +msgstr "Sayısal-3" + +msgid "Phone-in" +msgstr "Fono-giriş" + +msgid "Phone-out" +msgstr "Fono-çıkış" + +msgid "Video" +msgstr "Vidyo" + +msgid "Radio" +msgstr "Radyo" + +msgid "Monitor" +msgstr "Hoparlör" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Çalmak için ses aygıtı açılamıyor. Aygıt başka bir uygulama tarafından " +"kullanılıyor." + +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." + +msgid "Could not open audio device for playback." +msgstr "Çalmak için ses aygıtı açılamıyor." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "Kayıt için aygıtı açamıyor. Aygıtı açmak için yetkiniz yok." + +msgid "Could not open audio device for recording." +msgstr "Aygıtı kayıt için açamıyor." + +msgid "Could not open audio device for mixer control handling." +msgstr "Mikser denetimi için ses aygıtı açılamıyor." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Mikser denetimi için ses aygıtı açılamıyor. Açık Ses Sisteminin bu sürümü, " +"bu öğeyi desteklemiyor." + +msgid "Master" +msgstr "Master" + +msgid "Front" +msgstr "Ön" + +msgid "Rear" +msgstr "Arka" + +msgid "Headphones" +msgstr "Kulaklıklar" + +msgid "Center" +msgstr "Merkez" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Surround" + +msgid "Side" +msgstr "Yan" + +msgid "Built-in Speaker" +msgstr "Varsayılan Hoparlör" + +msgid "AUX 1 Out" +msgstr "AUX 1 Çıkış" + +msgid "AUX 2 Out" +msgstr "AUX 2 Çıkış" + +msgid "AUX Out" +msgstr "AUX Çıkış" + +msgid "3D Depth" +msgstr "3D Derinlik" + +msgid "3D Center" +msgstr "3D Merkez" + +msgid "3D Enhance" +msgstr "3D Genişlik" + +msgid "Telephone" +msgstr "Telefon" + +msgid "Line Out" +msgstr "Hat Çıkışı" + +msgid "Line In" +msgstr "Hat Girişi" + +msgid "Internal CD" +msgstr "Dahili CD" + +msgid "Video In" +msgstr "Vidyo Girişi" + +msgid "AUX 1 In" +msgstr "AUX 1 Giriş" + +msgid "AUX 2 In" +msgstr "AUX 2 Giriş" + +msgid "AUX In" +msgstr "AUX Giriş" + +msgid "Record Gain" +msgstr "Kayıt Kazancı" + +msgid "Output Gain" +msgstr "Çıkış Kazancı" + +msgid "Microphone Boost" +msgstr "Mikrofon Seviye Yükseltme" + +msgid "Loopback" +msgstr "Geridönüm" + +msgid "Diagnostic" +msgstr "Ayarlar" + +msgid "Bass Boost" +msgstr "Bass Arttırım" + +msgid "Playback Ports" +msgstr "Çalma Portları" + +msgid "Input" +msgstr "Giriş" + +msgid "Record Source" +msgstr "Kayıt Kaynağı" + +msgid "Monitor Source" +msgstr "Hoparlör Kaynağı" + +msgid "Keyboard Beep" +msgstr "Klavye Biplemesi" + +msgid "Simulate Stereo" +msgstr "Stereo Simülasyonu" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Surround Sound" +msgstr "Surround Sesi" + +msgid "Microphone Gain" +msgstr "Mikrofon Kazancı" + +msgid "Speaker Source" +msgstr "Hoparlör Kaynağı" + +msgid "Microphone Source" +msgstr "Mikrofon Kaynağı" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Merkez / LFE" + +msgid "Stereo Mix" +msgstr "Stereo Mix" + +msgid "Mono Mix" +msgstr "Mono Mix" + +msgid "Input Mix" +msgstr "Giriş Mix" + +msgid "SPDIF In" +msgstr "SPDIF Girişi" + +msgid "SPDIF Out" +msgstr "SPDIF Çıkış" + +msgid "Microphone 1" +msgstr "Mikrofon 1" + +msgid "Microphone 2" +msgstr "Mikrofon 2" + +msgid "Digital Out" +msgstr "Sayısal Çıkış" + +msgid "Digital In" +msgstr "Sayısal Giriş" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "Ahize" + +msgid "Other" +msgstr "Diğer" + +msgid "None" +msgstr "Hiçbiri" + +msgid "On" +msgstr "Açık" + +msgid "Off" +msgstr "Kapalı" + +msgid "Mute" +msgstr "Sustulurmuş" + +msgid "Fast" +msgstr "Hızlı" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Çok Kalın" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "D" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Orta" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Tiz" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Çok Tiz" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Yapım" + +msgid "Front Panel Microphone" +msgstr "Ön Panel Mikrofonu" + +msgid "Front Panel Line In" +msgstr "Ön Panel Hat Girişi" + +msgid "Front Panel Headphones" +msgstr "Ön Panel Kulaklıklar" + +msgid "Front Panel Line Out" +msgstr "Ön Panel Hat Çıkışı" + +msgid "Green Connector" +msgstr "Yeşil Konnektör" + +msgid "Pink Connector" +msgstr "Pembe Konnektör" + +msgid "Blue Connector" +msgstr "Mavi Konnektör" + +msgid "White Connector" +msgstr "Beyaz Konnektör" + +msgid "Black Connector" +msgstr "Siyah Konnektör" + +msgid "Gray Connector" +msgstr "Gri Konnektör" + +msgid "Orange Connector" +msgstr "Portakal Konnektör" + +msgid "Red Connector" +msgstr "Kırmızı Konnektör" + +msgid "Yellow Connector" +msgstr "Sarı Konnektör" + +msgid "Green Front Panel Connector" +msgstr "Yeşil Ön Panel Konnektör" + +msgid "Pink Front Panel Connector" +msgstr "Pembe Ön Panel Konnektör" + +msgid "Blue Front Panel Connector" +msgstr "Mavi Ön Panel Konnektör" + +msgid "White Front Panel Connector" +msgstr "Beyaz Ön Panel Konnektör" + +msgid "Black Front Panel Connector" +msgstr "Siyah Ön Panel Konnektör" + +msgid "Gray Front Panel Connector" +msgstr "Gri Ön Panel Konnektör" + +msgid "Orange Front Panel Connector" +msgstr "Portakal Ön Panel Konnektör" + +msgid "Red Front Panel Connector" +msgstr "Kırmızı Ön Panel Konnektör" + +msgid "Yellow Front Panel Connector" +msgstr "Sarı Ön Panel Konnektör" + +msgid "Spread Output" +msgstr "Çıkışı Dağıt" + +msgid "Downmix" +msgstr "Miks Edilmiş" + +msgid "Virtual Mixer Input" +msgstr "Sanal Mikser Girişi" + +msgid "Virtual Mixer Output" +msgstr "Sanal Mikser Çıkışı" + +msgid "Virtual Mixer Channels" +msgstr "Sanal Mikser Kanalları" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s %d İşlev" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s İşlev" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Çalma için ses aygıtı açılamıyor. Açık Ses Sistemi'nin bu sürümü, bu öğeyi " +"desteklemiyor." + +msgid "Playback is not supported by this audio device." +msgstr "Bu ses aygıtı çalmayı desteklemiyor." + +msgid "Audio playback error." +msgstr "Ses çalma hatası." + +msgid "Recording is not supported by this audio device." +msgstr "Bu ses aygıtı kaydetmeyi desteklemiyor." + +msgid "Error recording from audio device." +msgstr "Ses aygıtından kaydetmekte hata." + +msgid "Gain" +msgstr "Kazanç" + +msgid "Headphone" +msgstr "Kulaklık" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "%d bayt bilgili '%s' aygıtından okumada hata." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Beklenmeyen bir çerçevece boyutu %u bunun yerine %u görüntülendi." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "%d baytı şu aygıtta '%s' okumada hata." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Şu aygıtın '%s' özelliklerini almada hata: O bir v4l2 sürücüsü değil. Onun " +"bir v4l1 sürücüsü olup olmadığını denetleyin." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Giriş davranışları sorgusu %d şu aygıtta %s başarılamadı" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Radyo istasyonu ayarlarını bulma %d şu aygıtta '%s' başarılamadı." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Şu aygıtta '%s' sorgu normuna erişilemedi." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Denetim davranışları şu aygıtta '%s' bulunamadı." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Aygıt tanımlanamıyor '%s'." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Bu bir aygıt değil'%s'." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Şu aygıtı '%s' okuma ve yazma için açamıyor." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Aygıt '%s' bir yakalama aygıtı değil." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Aygıt '%s' bir çıkış aygıtı değil." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Aygıt için '%s' norm değerleri ayarlanamadı." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Aygıt için '%s' radyo frekansları ayarlanamadı." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "Aygıt için '%s' radyo frekansı %lu Hz için yapılamadı." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Aygıt için '%s' güçlü sinyal alımı gerçekleşemedi." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Denetim değeri şuna %d bu aygıtta '%s' ayarlanamadı." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Değer %d denetim için %d şu aygıtta '%s' ayarlanamadı." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Şu aygıtta '%s' geçerli giriş elde edilemedi. O bir radyo aygıtı olabilir." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Giriş değeri olarak bu %d şu aygıtta %s ayarlanamadı." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Şu aygıtta '%s' geçerli giriş elde edilemedi. O bir radyo aygıtı olabilir." + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Çıkış değeri olarak %d şu aygıtta %s elde edilemedi." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Aygıtta '%s' arabellek kuyruğa sokulamıyor." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Aygıttan device '%s' vidyo çerçeveleri alınamadı." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Şu denemeden sonra %d başarılamadı. aygıt %s. sistem hatası: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Değiştirgeler aygıttan '%s' alınamıyor" + +msgid "Video input device did not accept new frame rate setting." +msgstr "Vidyo giriş aygıtı yeni çerçeve oranı ayarlarını kabul etmedi." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Aygıttan '%s' bellekler eşlenemiyor" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Bu aygıtın sürücüsü '%s' bilinen görüntü yakalama yöntemlerinden herhangi " +"birisi desteklemiyor." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Çalışırken çözünürlüğü değiştirmek henüz desteklenmiyor." + +msgid "Cannot operate without a clock" +msgstr "Saat olmadan çalışamaz" + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Aygıtın '%s' birlikte çalışabileceği vidyo kiplerini sıralamada hata" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "Arabellek türü desteklenmiyor, veya içerik bir yere ait değil, veya " +#~ "arabellekler henüz ayrılmamış, veya userptr veya uzunluk geçersiz. aygıt. " +#~ "%s" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "Vidyo çervevesi aygıttan '%s' alınamadı. Yetersiz bellek." + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "kullanıcı arabelleğini kuyruğa sokmak için yetersiz bellek. aygıt %s." + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "Dizindeki %d havuzda boş bellek bulunamadı." + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "Aygıt '%s' görüntü yakalayamadı%dx%d" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "Aygıt '%s' belirtilen kipte görüntü yakalayamadı" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "Arabellek aygıttan '%s' alınamıyor." + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "Yeterli bellek aygıttan '%s' alınamıyor." + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Aygıttan '%s' akan görüntü başlatılamadı." + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Aygıttan '%s' akan görüntü durdurulamadı." diff --git a/po/uk.gmo b/po/uk.gmo new file mode 100644 index 0000000000000000000000000000000000000000..4a4bc4efb9808592bf9f81ce3116fb5b573640b8 GIT binary patch literal 19684 zcmdU#3y@q@na3~kFb=3Zd?12cl^7uD$;>3Y2BSb;1QIePAv~1b?M&a9Y17kpyxpBJ zC`%p$Q6hmj1i>KB1%y>6k4ZvaSeEXtE33E5Dj#dDE|%r4wOXat?&|L1?*9JgoZEf7 zr-w;Et=&$}{O>vU+;hJ3z0bM#ho>HQpU3Zc%9)fmo#1)L9OHQ>oupRJJNabKdjoh1 zcp~V7x-|oQ9e4>i1)K}Efs4Vb!0TN5W1#vy>*`~!ei&pb?{C1@g5Lt)41O0p4*UhE z@qP`y5&RwacJTG5SbEL_&!B!W$SrR<_!=+=Y90OHJHXpP&GR@Yx}O1OgL^@Z_jB+( zaLTC`yTEqp9|EU=cY*H#cYzmye-GXUo_d2-tBk844#E8vg%uLs4SJ3#U8ZczOFjJyB1yZ{BKZlZ#xTF zgO`I5_&relu0~l!Uk@nzS^;YQ>p&j$20+cb3Do#^ff{!N)N_xx`%k$0&w%3dE>LtG z0wu>6T>YQGnbiLs)cW6ZwjI9{6g?M#;_G`s%`+F29F~F|;7zW6Hz@gS2SwK&Q1dc1J~#+wz|Xk)UxA|kSD@xQ5o6YPr-GXAOi=Sob@l1sCDdnw zvZo>_d)frbo*n=-&KE(gZw!=Pe+`s8Uj!x3UxVK~hCc7MeEH!yR=@rg#Pq!rrg|PE zd1r%k@h%6?0|W3$a0@6tT=*V4?tD=7m98Fu(&sgeK6_k9cpjkhtb)5*) za8cfT@FMUgQ1jmh9tS=LE&>mO>ObXN%ZDpK>DLY58n6sr3jPbY6r2X}!nNQk@UOuh z@O*?K{3v)c_yYJ{aQ<{`06c4k=Y0u`z+K?G5Z*K3cfhN__3h|B_yQP!gER3_;J3jm z!Shgt4}cLUd3_bsdVc^)F8>C~-<$$-gy%TC2t*X#Rp7V45X^z^@AAAp@Ck4!cp}a= z3w{t3{fEE>;DxjCh2X8=J>W?==K}Z;_(8DkLU;xCfqL%C;C0|7FkR2z3##Auz>k5m zFZR48;0|yx_&=cLUyKlL1Gj@(_n9dBNniw?4BiI5AG`;oix-2EOB;V!y0-w7-mV2T z|7P&5;7>rN_Fe+t4$gkBeXa+T9&851uX`On;czdg`TrJt8~9yt3ivA!SLgkwYd?LC zm0uSKN#3pCGH@TL@lSl8)z6c`W2tw58gDizdaeOA|A!sk>hK;={T>Ik{zIVX`KGJ? z0F<5l+|~aJ)Ho->B;na0s_k_-yb+WgZU8mT6JQ&-1JpPNLGke$p!oO_sQFL1%=*3Q z;0X1_;ECA#i{J~?e{s1TXa5znQ~w(Hdaw#&+TM@A`QY($E&r|tweA(5=otb}0JpmP z4}hmpe++yxxCd1K7r;xwe+Kp3IrFUjEdWLD=RvLKFsSu?-POMXs{f0i)^jYxtOU;j z&jQOJqVl$a;zJCI-#-Ei;4eYh=S?W{W#H4G`uz;l^S^cVw=A@Bp6YNuC^`c0bT9(n z2;SxDp9MwtZcyWW9UKO~2W|qFVe~6h2R{O47FoM_805eA3;syYE`qpsfu965-xomf zZNI}9Y@_~DPg ztf9P?@@EwNUPsYf`t7%1Y#K`p#bQy!-zzhZI$LZ*p>2f@Ff;3hp>g*TnD ziXs{}QpPCy?XutvfVem#tLMN^xOVZXKv_${biJo3`iWQieViiueO48Ih{5wIu;1jz z{oqF_>ED@DZlH)iLzE9v^!t(pZ=b_H@H)x|D3aB+l;ro9?xGizoUf-mOgW!&0tGYl z4pF3Q`fZ_njB<)9sb7Wb5sGX@ziE`mDA!P=cXv}hMY)S|0p$_OTPYhT+bD-A`pNdB z4^t@8v(HgvFA=4O(ndLnqTijA&rqIM#r+-yAEewtc?)HbayF&;x7Rh??(p4UKv_>Y z&b7@2bCekr>E08RhbZ?@^gEaG=jO`($)>K8%TX?7Qf_e#p9D*kt*)NHIxa4EmHWV( zDP5FzP-G`_C_5>CLU||U8H)Ven<(c|^t+I<)LdEH)#Y-^9?Day@H?KefU;Q?e%mQ; zFjx3uaG3Hw%4=NP=N;Y#-cPxNvfH(N7FvTAPr<7xA*G#iBIOH|ODVG``pu`DPI*8TerM><)RI3n=P#%fd&~K-sA}zc+SJlC zf7P%r^k&WT=LW@c5b0`OFjOAU#r)zxw%8kZm;1$_yf%zh`#}_ikstQWGl!9@FNnfo+3(2~gF?f- zO3+-Lpl2mtC};9TfB8_5T@8cg&hzGGi^Z_)=X0sxbUu;O9%erW+2* zeyK7v6h`opdBRE|XKpxV`{mF{B6Tk)exwqx)>W0hz91_3EToaz+9*M(oLyDOmj?Wl z@M=S*=bNx+SSjYllh6;{L)j=h7@%JzpS7hZNRc|29jcMp7lnfpbc3;Q$7qBbrw=t8 z%-<{xMAlJQ@Zo2!07KJMAJudIiUGKeQkNu)u+J#FEOPm9sT>R@lBr2W_EgrB zK_M7KIVPV!QR<`UiG3P%W13Zgw5B4fW9BScG5{B{LqmmpZ&qq_G{gSUm+apVR{UI8 zoK{9)YXTpO8O)aq$I&|@FL@U$<;hnP1-)UEJ0hvqyS_RaQi|+L3!@+_0+2+`UmNAi zO~e@UW}(hs7BPu-&q>p`V`u63itJDs7h79<%TBnJAv{aMpLzLge-THR@Ac;8`}5^& zK~6Qflpl51naZo|B43nbSLF+=B`BFSrq=&qaBRrrn=A5a5gReSTgY?A^}fuA3oY76EG2a9N`_8GZXi9UEOpy_=K29VqQ0 z+PwwYd;u%T_ThsR63Y?mX-{0tR4z-_q)mkD_NSJTM{10)zJW-%m-H7T2H?&B1rfobDMvRtOq5i&X&mTz!6u!ck^L}hSit&Dg< zmgLMNSN5+<#;(Ly4h@9G082~dXp8g3Kz?gnn;clWaY?>63e5oC!fd|iEhI&%=bDxr zzm&fvQ23r&fun@%EZV7BySFgH#^%@=pS~3k_nYgj`(8P3$s+Gc+&?n(YAdW? zmAotS{R7^jVy0g-FOp{3zy1iRiwq<)xq$pFdOCkD}rFiQ_`6*+Mt-L3qpf|E(^0PKX&|Js@?BOS8TSP>T1N7s*_?x>^fkGCc%v|M_A04$>|*`3o~89 zV(5!;OK`{DHKBj)vc*JK@-D8ii+s^?!&;Mx2s8Z4S1vN%2d1sf7YcH;1dgaOWFM<1 zbB?oXvkH8qw(TZa7({?&HbenIB=oZd31%=PR+pn}v83$WABw_q*c%oI5M-w4naRu6 z=1b(^0jVlEj;x2=CNhI9TyA8D-(9w1d5<65Tn>sR4H_y`*cX`9935Fwc1R=ePBOMJ z_+>l51#f151^JdT5l@aV`|%jF5ZgF7YUt zF0V(H&$h~4gy>&SzL?&=nQH49dXk-B58N(!wW>>>>a0rA@y1-BCkk^FyCGht$m+5F zh(Agn99VK~Q=)9PCdnP)Jj+m#y4z5#^>UW?%v-d;UsUw$g=}$opdEI4Cx%v6hWtL0 z#4khIntMGbqBDCVE`7>B4XluG0BMw3@+1NTvmb-jN z37WR!@=-}&^N2CIfc0twm9ss zE|P}U@?Z9h10kDT4PwI#G2HC1`pD-nC1Z;)K>H|T#+)?hoWX2nOrKuzwk-AlpG+?{ zxn$tR;861x{mNm8(Lzen$zNJ544Y>q{JwltDw9H{9z`FV2Qis{uRR{X)J2u{>h)RZ znlJW-gF^*&!$;QJIdrxZ6AYYW;3?iRWfZVbZ>7>96LZX!y!T3lYx`G9XR0pWa3kah zAkwOAZ!bqd_`0<&oSG92G|_HsR_3E}1wDbpW@IlrU5v!lK1 z;`Xk#Wr4hRW=W|(pUYfP=`Uqggx&r?xjfW8bLOf_|1Cs|Y&&}_wrye5KeMf8>59x; ztVBEQ%sfo0+wbb=?8Wx6{3j*jlmj_Doz=$Ki?rd<@&`*mhIF35Cr`kkHK7hEvC zV;21u6Ie4V6h|=7FzWVis6=@<8%D)2zb0Gs-#bj)qk36ob=1zG-1~T>*k56Pky$|& z(CuHlIzrj=>T2Q<<7iScpTSIJ^<|vzluPYou|!W&z5bwakZ!-Sx^2m#CG+e2>TK_5 zgWW_VC>tJPiDlx`Of)-RywvX<$VTYHoNHGs$Xs0SrxkGAl$npJYeU@aU%V<`Zo59S zFkp9Km$o=uoh>Lm>xA_^g-VnyWEPNvm%9BT0-{=)(|IW-q{}%Sm$q?wIm55sUfmcU ziuYIVsBWunkr~EMG`5tyuRJ@o^pyjCyffYx?~f11hpHQ^Bihl$4_DX4hpX$W8~DqW z>G7Ojy(1o@(}wE0Ry{`jcvpOYp>|LX#iOnIjQR2N47Z;_N2{OEXpFbTiyvjCQ63&; z&MmgjK}Iv}Wy?&>y{qaKIt$a`VXx>}RQXE;dQ=<|do+G+ldwtMl`>L#Av?VH0{s`0+2 zhE%ny`Mw(J_nYp*EGDh5Io_#>Sn*CH0mmp7$&HO74r(5PLwl>6scjRl)qlNVTCMjE z!%)`i#ZQ@W4sjnjN~C+?{I>Yu#CIeH%V${1G>5DAt4W+2iw|hdM;T3nG>_Q2ee&_P z8hP!8I4dC0iad=r#Rr*azZX9kk7(s6(oSwkXQZcFd@bK(kSN0`j27V5i$0TBN#+U%@imo(5U`5?`Em~Wqk_2MV(Yzzz$u*a}=g65gp zN5uD=HK3h|0HlicQN!E4S`hT2nTFJDa7=WwR5~^*!!}C3th`1b?7&5|B5#7V9ocv=3{g9CVomaa2gh+>f+=uCmemOpFbksy@=WH| zQSv}eai{#(7D#HvSZGb@@R2Z8_8>p&7@B&Tr5n3CAhzz8=&Y$YPV>xIyi1O=x&>h< z0F25r;dgm*fAvlyY`MeM()@!@?8i@va^sfK9fh~?ZyZ<*YCoY}D3(d!EcE~dxuIn& zHa_@j*VW2aCo)6R_eiAFdQjiQ>9k)nYD_3MayQ{y@uKbyP;e(wqP_F#L{KTmVPtM4 zjm7?9nDGBmaDM!_RE@;MMggLe^;huGL`BQJ(Rimql`*LXsp1aM)s*$gc3&-f@e#%e zuXlOCcn9A=gKRfNL4*CLhx$LY)+9N#Os#(0#+<}Q5isPvCuIXhPNIYO?DH^Ult_w) zLx{}@o*7V59#vd$a(Xy1rH0JGhFy~7G+%jQL@q@hd=vKcym2iid?D~xFpy#rUJkvg zWpqk;$TX^(7;ywaj*_joe1Xp7D#}2V0M)a0Jb=ksTiww}jIw*&JWOjc)BlvXL2N4_f@~%_D)R;8c z4GMSQp^uKqO^`*2T;-Mf)Mj!evp#LZlx0FND~B=Y%0z4XeNLj3vx$ZG*K@L_wWN$n ze$NrkMg!@j(b>2t_a48+U^l~v~?_m6^VzQ+>&1&<$v1Q(o z(j^HCJ9o;Z{8SB0)|A#*35-vGn%6WTtIXP^Sz}lpdxlgRWtfEu81-bI>e#5)oUQYw zarBcCLib@5$ZpyYhH>iSSe}sQ$J-$y*`ctx)o#7fc3AOq{*TvcibOvk}d&*=PvIhiK_j^Ywvn28*+LtJh(!*UcZA~#=|6jq9 z5~qPzYqC6RWazFn5aR)x`DIR=(q`^hYC@^qZE9S_xpi{8N6qmD@+Jr|<9!>#NFD#Q zwv(2d&6MfBa@F*CRIj|_Pgn1lK;SJWPu#@IO0kv6w;av!{HS%Y$MP|KH#=1*e+`yh`9gCJRc8!`IRRorIr(HQPASPC z8`3~~SgXKi1~-RzZc&-Ncs zzn>^zBfQiOP4%ciYLn5-I_1Lk(Z5!t8< zDbDrRj-I{P%FG<%7%d^^s%*QHCC<}r?~wmRa>zDQf9 zpQjL%$|6$Ms2wFq%q*6)Dl?P+FJ9P^1T1p5m?2HS1IB*|wa5 z)JN}$q%iUq$@9824#tg-8KD*Xt!5fuF5A-^2Nw?H=H+ByEh&!i_~sB{q7LSr)K1B# z{unkvL$mhQeRVnqAylSR-+YaeF)P*15jC}T%1%|QmmY{ecI~yK-ULXJReOM7c58AC zZr5Ggu9&Gbj5RqnrZ|NMU-bO!kuW<{)^Ws_S>M^=R8U7^atey zOHJ<=9HkQzrB&3=3RzdvYrY0y`1Q|@oCnmdW<-9}=`78U*M&jtVc4Ng#1S<5ZnWsLpYLNX=$~73wQ^^VMK-;&ZSz1pO#)hBGo||g42t=JL2sQqQGDCCgBMc$MZ?(jU?@hii*h6?TI%l%IW-*CIV@}P|!_1}k4W?GDy^_<$+`M{d zuy!3$HSUWzOOzyy$k_DY)#bmi7cYJUv6|hxjRkr?YqCfM2ECkHKY<&T|1$T*@LK0a z7s>FcJHOARJY~#Y8^MOC?UeE5?oKYN{tLjH^U|6oNrzmHW)M8h6*{Y(10_z0n32jP!JJ z80nm@$+oK77~o!R8ec5?_pmW#&w6=lzY9slO|~T?bkh1wWE_`CNKYE>%eeL`>qAFP zHYoROj9RRR53*G5u}f;GG)7(ykoB@x$9;yx#(M40QEb)c2674LF=(RyV~rkSgy~Y} z!HpJ`occ^85I^3-icGLnw#6D8XH9_N&93g6twxLU{TA`kjG!%|69<-G%ad_wqLWn9 zQKMk7N8C?^_C~kkqKZ{eef=Va5s*1z<`Nx1+)vn1lQEIC;u25l4L^!v)?oIOd?K_( zyGt88-OMc}Ob;sENsT8;^jQLlg$}iMS*bM5Ln_hWCaZVz&wZWXD<4qsa0Xtz6MD?2 zO35-ra#M0cCh{DsHJc6No>H8fgns2;vKE&bzw(i)BZkA{lDUINKP2Cg)bx?9hWM*Z z6~Vgp)x=gcL$>+QX9TZAw6lg*+xXR5r4zNSfML8fzuF~=?OypPw7B`;vUzo7_@@Wd zi@!wX8gUbaGoyPrI~fKVVX_V9GMhh(;LDfPIjy{fJ3L{%J5jU;5xZ4yITEFw#tA1M z*f^o5@^%Ho#PuKf1FYH}LmlxWY!9Jan+}O*Gj0`%^(jzuO4Yi3^7zF`Jj7tB<3^n5 I&ZJ}hFAY+RaR2}S literal 0 HcmV?d00001 diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..b180f15 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,741 @@ +# Ukrainian translation to gst-plugins. +# Copyright (C) 2004 Free Software Foundation, Inc. +# This file is distributed under the same license as the gst-plugins-good package. +# +# Maxim V. Dziumanenko , 2004-2007. +# Yuri Chornoivan , 2011. +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.28.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2011-05-01 11:55+0300\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Could not establish connection to sound server" +msgstr "Не вдалося встановити з'єднання із звуковим сервером." + +msgid "Failed to query sound server capabilities" +msgstr "Помилка при запиті можливостей звукового сервера" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "«%s» виконує %s" + +msgid "Internal data stream error." +msgstr "Внутрішня помилка потоку даних." + +msgid "Failed to decode JPEG image" +msgstr "Помилка при декодуванні зображення JPEG" + +msgid "Could not connect to server" +msgstr "Не вдалося з'єднатись з сервером" + +msgid "Server does not support seeking." +msgstr "Сервером не підтримується позиціювання." + +msgid "Could not resolve server name." +msgstr "Не вдалося визначити адресу сервера за назвою." + +msgid "Could not establish connection to server." +msgstr "Не вдалося встановити з'єднання з сервером." + +msgid "Secure connection setup failed." +msgstr "Помилка під час спроби налаштування безпечного з’єднання." + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" +"Сталася помилка роботи з мережею або з’єднання було несподівано розірвано з " +"боку сервера." + +msgid "Server sent bad data." +msgstr "Сервером надіслано помилкові дані." + +msgid "No URL set." +msgstr "Не вказано адресу" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" +"Не вказано або вказано некоректний вхід звукових даних, AVI-потік буде " +"пошкоджено." + +msgid "This file contains no playable streams." +msgstr "Файл не містить потоків, які можна відтворити." + +msgid "This file is invalid and cannot be played." +msgstr "Файл є некоректним, його не можна відтворити." + +msgid "This file is corrupt and cannot be played." +msgstr "Файл пошкоджено, його не можна відтворити." + +msgid "Invalid atom size." +msgstr "Некоректний розмір елементарного фрагмента." + +msgid "This file is incomplete and cannot be played." +msgstr "Файл неповний, його не можна відтворити." + +msgid "The video in this file might not play correctly." +msgstr "" +"Ймовірно, відеодані цього файла не можна буде відтворити належним чином." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Файл містить надто багато потоків. Відтворюються лише перші %d" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Не знайдено підтримуваних потоків. Ймовірно, вам слід встановити модуль RTSP " +"GStreamer для відтворення потоків Real media." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Не знайдено підтримуваних потоків. Ймовірно, вам слід увімкнути додаткові " +"протоколи передавання даних або встановити додатковий модуль RTSP GStreamer." + +msgid "Internal data flow error." +msgstr "Помилка внутрішнього перенесення даних." + +msgid "Volume" +msgstr "Гучність" + +msgid "Bass" +msgstr "Низькі" + +msgid "Treble" +msgstr "Високі" + +msgid "Synth" +msgstr "Синтезатор" + +msgid "PCM" +msgstr "КІМ" + +msgid "Speaker" +msgstr "Динамік" + +msgid "Line-in" +msgstr "Лінійний вхід" + +msgid "Microphone" +msgstr "Мікрофон" + +msgid "CD" +msgstr "КД" + +msgid "Mixer" +msgstr "Мікшер" + +msgid "PCM-2" +msgstr "КІМ-2" + +msgid "Record" +msgstr "Запис" + +msgid "In-gain" +msgstr "Вх.підсилення" + +msgid "Out-gain" +msgstr "Вих.підсилення" + +msgid "Line-1" +msgstr "Лінійний-1" + +msgid "Line-2" +msgstr "Лінійний-2" + +msgid "Line-3" +msgstr "Лінійний-3" + +msgid "Digital-1" +msgstr "Цифровий-1" + +msgid "Digital-2" +msgstr "Цифровий-2" + +msgid "Digital-3" +msgstr "Цифровий-3" + +msgid "Phone-in" +msgstr "Вх.телефон" + +msgid "Phone-out" +msgstr "Вих.телефон" + +msgid "Video" +msgstr "Відео" + +msgid "Radio" +msgstr "Радіо" + +msgid "Monitor" +msgstr "Монітор" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Не вдалося відкрити пристрій для відтворення. Пристрій використовується " +"сторонньою програмою." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" +"Не вдалося відкрити пристрій для відтворення. У вас недостатньо прав для " +"відкриття пристрою." + +msgid "Could not open audio device for playback." +msgstr "Не вдалося відкрити пристрій для відтворення." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Не вдалося відкрити пристрій для запису. У вас недостатньо прав для " +"відкриття пристрою." + +msgid "Could not open audio device for recording." +msgstr "Не вдалося відкрити пристрій для запису." + +msgid "Could not open audio device for mixer control handling." +msgstr "Не вдалося відкрити пристрій для керування регуляторами мікшера." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"Не вдалося відкрити пристрій для керування регуляторами мікшера. Ця версія " +"Open Sound System не підтримується цим елементом." + +msgid "Master" +msgstr "Основний" + +msgid "Front" +msgstr "Передній" + +msgid "Rear" +msgstr "Задній" + +msgid "Headphones" +msgstr "Навушники" + +msgid "Center" +msgstr "Центральний" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Об'ємний" + +msgid "Side" +msgstr "Боковий" + +msgid "Built-in Speaker" +msgstr "Вбудований динамік" + +msgid "AUX 1 Out" +msgstr "Вихід AUX 1" + +msgid "AUX 2 Out" +msgstr "Вихід AUX 2" + +msgid "AUX Out" +msgstr "Вихід AUX" + +msgid "3D Depth" +msgstr "Просторова глибина" + +msgid "3D Center" +msgstr "Просторовий центр" + +msgid "3D Enhance" +msgstr "Просторове покращення" + +msgid "Telephone" +msgstr "Телефон" + +msgid "Line Out" +msgstr "Лінійний вихід" + +msgid "Line In" +msgstr "Лінійний вхід" + +msgid "Internal CD" +msgstr "Вбудований КД" + +msgid "Video In" +msgstr "Відеовхід" + +msgid "AUX 1 In" +msgstr "Вхід AUX 1" + +msgid "AUX 2 In" +msgstr "Вхід AUX 2" + +msgid "AUX In" +msgstr "Вхід AUX" + +msgid "Record Gain" +msgstr "Підсилення запису" + +msgid "Output Gain" +msgstr "Підсилення виходу" + +msgid "Microphone Boost" +msgstr "Підсилення мікрофона" + +msgid "Loopback" +msgstr "Заглушка" + +msgid "Diagnostic" +msgstr "Діагностика" + +msgid "Bass Boost" +msgstr "Підсилення басів" + +msgid "Playback Ports" +msgstr "Порти відтворення" + +msgid "Input" +msgstr "Вхід" + +msgid "Record Source" +msgstr "Запис джерела" + +msgid "Monitor Source" +msgstr "Спостереження за джерелом" + +msgid "Keyboard Beep" +msgstr "Гудок клавіатури" + +msgid "Simulate Stereo" +msgstr "Імітація стерео" + +msgid "Stereo" +msgstr "Стерео" + +msgid "Surround Sound" +msgstr "Об'ємний звук" + +msgid "Microphone Gain" +msgstr "Підсилення мікрофона" + +msgid "Speaker Source" +msgstr "Основний динамік" + +msgid "Microphone Source" +msgstr "Основний мікрофон" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "Центральний/LFE" + +msgid "Stereo Mix" +msgstr "Стереомікшер" + +msgid "Mono Mix" +msgstr "Мономікшер" + +msgid "Input Mix" +msgstr "Мікшер вх. даних" + +msgid "SPDIF In" +msgstr "Вхід SPDIF" + +msgid "SPDIF Out" +msgstr "Вихід SPDIF" + +msgid "Microphone 1" +msgstr "Мікрофон 1" + +msgid "Microphone 2" +msgstr "Мікрофон 2" + +msgid "Digital Out" +msgstr "Цифровий вихід" + +msgid "Digital In" +msgstr "Цифровий вхід" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Модем" + +msgid "Handset" +msgstr "Гарнітура" + +msgid "Other" +msgstr "Інше" + +msgid "None" +msgstr "Немає" + +msgid "On" +msgstr "Увімкн." + +msgid "Off" +msgstr "Вимкн." + +msgid "Mute" +msgstr "Вимкнути звук" + +msgid "Fast" +msgstr "Швидко" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Дуже низька" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Низька" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Середня" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Висока" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Дуже висока" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Промислова" + +msgid "Front Panel Microphone" +msgstr "Мікрофон передньої панелі" + +msgid "Front Panel Line In" +msgstr "Лінійний вхід передньої панелі" + +msgid "Front Panel Headphones" +msgstr "Вихід навушників передньої панелі" + +msgid "Front Panel Line Out" +msgstr "Лінійний вихід передньої панелі" + +msgid "Green Connector" +msgstr "Зелений рознім" + +msgid "Pink Connector" +msgstr "Рожевий рознім" + +msgid "Blue Connector" +msgstr "Синій рознім" + +msgid "White Connector" +msgstr "Білий рознім" + +msgid "Black Connector" +msgstr "Чорний рознім" + +msgid "Gray Connector" +msgstr "Сірий рознім" + +msgid "Orange Connector" +msgstr "Помаранчевий рознім" + +msgid "Red Connector" +msgstr "Червоний рознім" + +msgid "Yellow Connector" +msgstr "Жовтий рознім" + +msgid "Green Front Panel Connector" +msgstr "Зелений рознім передньої панелі" + +msgid "Pink Front Panel Connector" +msgstr "Рожевий рознім передньої панелі" + +msgid "Blue Front Panel Connector" +msgstr "Синій рознім передньої панелі" + +msgid "White Front Panel Connector" +msgstr "Білий рознім передньої панелі" + +msgid "Black Front Panel Connector" +msgstr "Чорний рознім передньої панелі" + +msgid "Gray Front Panel Connector" +msgstr "Сірий рознім передньої панелі" + +msgid "Orange Front Panel Connector" +msgstr "Помаранчевий рознім передньої панелі" + +msgid "Red Front Panel Connector" +msgstr "Червоний рознім передньої панелі" + +msgid "Yellow Front Panel Connector" +msgstr "Жовтий рознім передньої панелі" + +msgid "Spread Output" +msgstr "Розгорнути вихід" + +msgid "Downmix" +msgstr "Об’єднання каналів" + +msgid "Virtual Mixer Input" +msgstr "Вхід віртуального мікшера" + +msgid "Virtual Mixer Output" +msgstr "Вихід віртуального мікшера" + +msgid "Virtual Mixer Channels" +msgstr "Канали віртуального мікшера" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "%s, функція %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Функція %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "" +"Не вдалося відкрити пристрій для відтворення. Ця версія Open Sound System не " +"підтримується цим елементом." + +msgid "Playback is not supported by this audio device." +msgstr "Відтворення не підтримується цим звуковим пристроєм." + +msgid "Audio playback error." +msgstr "Помилка відтворення звуку." + +msgid "Recording is not supported by this audio device." +msgstr "Запис не підтримується цим звуковим пристроєм." + +msgid "Error recording from audio device." +msgstr "Помилка записування зі звукового пристрою." + +msgid "Gain" +msgstr "Підсилення" + +msgid "Headphone" +msgstr "Навушники" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Помилка під час спроби читання %d байтів з пристрою «%s»." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Отримано неочікуваний розмір блоку %u замість %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Помилка під час спроби читання %d байтів на пристрої «%s»." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Помилка при отриманні можливостей пристрою «%s»: драйвер не є драйвером для " +"v4l2. Перевірте, може це драйвер типу v4l1." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Помилка при запиті атрибутів вводу %d пристрою %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Помилка при встановленні приймача %d пристрою «%s»." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Помилка при запиті норми пристрою «%s»." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Не вдалося отримати атрибути регуляторів керування пристрою «%s»." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Не вдалося ідентифікувати пристрій «%s»." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Це не пристрій «%s»." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Не вдалося відкрити пристрій «%s» для читання та запису." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Пристрій «%s» не є пристроєм захоплення." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Пристрій «%s» не є пристроєм виведення даних." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Не вдалося встановити норму пристрою «%s»." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Не вдалося отримати поточну частоту приймача пристрою «%s»." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "Не вдалося встановити поточну частоту приймача пристрою «%s» у %lu Гц." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Помилка при отриманні сили сигналу пристрою «%s»." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Не вдалося отримати значення від органу керування %d пристрою «%s»." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" +"Не вдалося встановити значення %d для органу керування %d пристрою «%s»." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Не вдалося отримати поточний ввід пристрою «%s». Можливо цей пристрій — " +"радіо." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Не вдалося встановити ввід %d пристрою «%s»." + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Не вдалося отримати поточний вихід пристрою «%s». Можливо цей пристрій — " +"радіо." + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "Не вдалося встановити вихід %d пристрою «%s»." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Не вдалося опитати буфери від пристрою «%s»." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Не вдалося отримати відеокадри з пристрою «%s»." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Помилка після %d спроб. Пристрій %s. Системна помилка: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Не вдалося отримати параметри пристрою «%s»." + +msgid "Video input device did not accept new frame rate setting." +msgstr "" +"Пристроєм відеовходу не підтримується нове значення параметра частоти кадрів." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Не вдалося пов’язати буфери з пристрою «%s»." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "Драйвер пристрою «%s» не підтримує жоден відомий метод захоплення." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Зміна роздільної здатності при відтворенні ще не підтримується." + +msgid "Cannot operate without a clock" +msgstr "Робота без годинника неможлива" + +#~ msgid "Could not read from CD." +#~ msgstr "Не вдається прочитати з компакт-диску." + +#~ msgid "Disc is not an Audio CD." +#~ msgstr "Диск не є аудіо компакт-диском." + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "Файл зашифрований та не може бути відтворений." + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "Не вдається отримати атрибути органів керування пристрою \"%s\"." + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "" +#~ "Не вдається отримати список усіх можливих відеоформатів, які підтримує " +#~ "пристрій \"%s\"" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "Буфер цього типу не підтримується, або індекс поза межами діапазону, або " +#~ "буфери ще не були виділені, або неправильні параметри userptr чи довжина. " +#~ "Пристрій %s" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "" +#~ "Не вдається отримати відеокадри з пристрою \"%s\". Недостатньо пам'яті." + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "" +#~ "Недостатньо пам'яті для вставляння у чергу вказівника на буфер " +#~ "користувача. Пристрій %s." + +#~ msgid "Could not exchange data with device '%s'." +#~ msgstr "Помилка при обміні даними з пристроєм \"%s\"." + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "Пристрій \"%s\" не здатний захоплювати відео у форматі %dx%d" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "Пристрій \"%s\" не здатний захоплювати відео у вказаному форматі" + +#~ msgid "Could not set parameters on device '%s'" +#~ msgstr "Не вдається встановити параметри пристрою \"%s\"." + +#~ msgid "Device '%s' cannot capture at %d/%d frames per second" +#~ msgstr "Пристрій \"%s\" не здатний захоплювати %d/%d кадрів за секунду" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "Не вдається отримати буфери від пристрою \"%s\"." + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "Не вдається отримати достатньо буферів від пристрою \"%s\"." + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "Не вдається розпочати захоплення кадрів з пристрою \"%s\"." + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "Помилка при зупиненні захоплення кадрів з пристрою \"%s\"." diff --git a/po/vi.gmo b/po/vi.gmo new file mode 100644 index 0000000000000000000000000000000000000000..4bacc919d6e5675c89fa2b69a1db85f4f77478df GIT binary patch literal 15445 zcmchd3y>T~d4L<+!A96I4?lU>9ovUx9r?VX!!rboM?x5Y7 z)$FWJ>i~WTVr(E-_=Rw6>m-D+EyYiTa2I333Of)U1xZ0%;G~W~0Y#At6)IFh%22z#JB zS_w~t>*1^5weSR(gNtCvrYG(Dn{4`ao4ymil6?2Wsc-Y= zjqnFh+VQ{e4e+GbD8)aum_NtBcR*?XCGaeGEtGn;Luv1g@FMt8DCPYvya2ukv+(%W zDs?`*7`_F*8@?TW2;K;vfs+5y*C{my3ves^0=yb_zh0@g!Vkl1;8SoJJn%dzTaxO9ZEZIgkq1kTiy#XLG@`U{XGaVHT7jE?fbU}n z{)b>Uyw0XS3T3=L1*Kh2L#g)}DCIm4MQ>k&qMz?WY0nR#l=mM{>UjlDLE3QwlyY7V zCEuH%^m_@Ea(m!vxB^N$Zi45-Ctx3Z0lpQUa<)<#csZ1G8A>}p38lU#p_KP|DD^d< z)bll){x*CE>F+_AC#ULoo?HlJo~(pY&Soh6yB;!>ssv@+J`7Q<+6Djq6-xaT#1*Mq za0Zh9Zpc(s`)v9d%dbOe=ZjGE@hd3pJLcRt{c0%b(=5-1(vHPY>RW2l>!H~32$c4} z2fhVP+Vlf9eGp1}zYmXrKZoLf{vC?nIOn{09LJ!v=Q=n9C!pBR)9@PjL%1GZ+J(T| zVL$vkcs)Fk%KsXAa0NVvLAwRM8{Q3PVF^wyj_ds)%#%Ljg1Ef*!^=s}SpFKGM0y2- zEAw#>ie9gS(w{As@3Z_Elzb1sFT%&6*vr->aeMYdv8SKFE8v+I#_Py+P{#F1ScKnz zIr#RBQtyKI!OP%(!FR&tS*2FN+o9Oc*P-a+c$5{uHBj;&greVH!p(3om0t-z0L2c! z0%e@P330{hpP<;qFQC}Xs~IF|*SYXycsZ1IZ-g@5JE4sCXQAZ(CX{*dV|W}qnMLJQ z@DwQZoMm}FJeG7fd@Z~PO8&J_+Hn;;5#}L7tF~I+3#GhgptR?CDCKhyMl-!s11&mGCSUQ~B;YP}(zV`D1u0>7PT<$FUd3?=OI& zho$g!@Ny{n*ks?2LGdHk+xJ_c==XyV(^vP~=g+~bNxuL^?>%pi^>i7O@&+u|L-~Ff zz6N@5BfJ5g4!;Uz{C@zYAB&d9<9;fXexC)6JwYk=awvYkAD#g>Lg`Ntz8P+Z^4&d9 z{PcZL+V=>Qe4m3`;PX)Iav75W6{#A$3O))^vHBJ4hfA1@GH(JX{eKclJH7|SF8&2d z`9Fm+?*9ozug9%WY8;*p&xAL?GvHnDG*gi>dXG&N;4VaTEA4y~kt;&3LogrZA)i9%s=5o2>rWA}qmM~~>)aUX z-S8$v`qFtlz=I*=NyN7=_gKCU-j7rfvG?S^NXhhmt&2l*>@D05gYriZbE3*q&M*xYf*Q^+49a$)+$CtMBhMb;w6 zAn!!v%EV~UayD`Y@>%2* zL)6zN8KkmUL}H+5t&avyRU@-E~x$SuePNI$Y4Nv@K;S!Q{& z<4?ntYY@3u-qc?r;!{pQ6LiU-v*srLrs_x3`wKYE%d4Vs< z=Kc9y)${duT?^H+)wcei;t*K|LdybLOC=tQob z^rB)=i?pM2r69LOS>43YOZED-Yg9kFDR_QChi)|})kMGAiF8<___C|Ls+Q{NZltTV zN+k#*H%~o5t&}$}a&eb+6zHlOZj&}P-?{$QnoD2DYZDW0Sk-i-y|t~J)yNqydDWt} z}_{L zX-^aeC5@KyCDfGe`%C&xj~3A-3aU!qf(acJUA<9i9x3I?@0}BCjVyFEWj> z!)08bouEu{rxMk|R_Er;gg2<*5E2Ef_MC!`|MGHbwO8;WrzE~GxfSe*Rh1EP^tOviy*eLy%!;h;FS@u; zZ$f*LA%5GFytOqX+F&sluSZgP$E?mCE@QioXl1hl92b=K0a>-y@k&esX96c9%TE;2 zpKRhoy11>zbJna0eY&ffe9}}z>^$g9#K+?`X>n&mY%Q2)9&5|H`pV%o>$F#P3T{#y z@5JNfYGH^6z>Uffc9f%soH~=Ysl3pUWh++vVakbWJ{_9~UA(lPt9Oo6QvtU6svTW% zUFJ(v($R>HimG10$D*nc%`Qa6qgAlYDY00H(I-y#h&9ma5D%5oET&^r!)L9frZp<` zBmTw@!txQC9%o7~J#7}9>Le;@j>=KADXUpmsip^RNb6M!XtuefOl+&87Sm)=O=>E2 z=85%3=NG8Lur8C;j_x)BiU4C^O`UI6t#t@;Opp@)wL#4Q-l7MC#X9Rf-xWtP z=b3nv^ur-97Y3#Pwa)Q;wT@5&+uB|sigM|QG)Gsx8(dj1yK3l)Mbg3UB$ZX`LX5t@ z8FZOsy7=@fmzB0NJ%8ST)kA}70Ef%ysAdmacU3ju6^d%m&lIH1gJN^>Up<5`9F+J| z?4Dq)d7pP8M^BW3$s~YmesFLRYKc}2MU!%aV>alG zu`CA7S|0=ziCDRrR6`7(8>%5U@72mGrS;aW?nyn@z3D_8;-<2iu}YMOAPRCp371T; zhas6zXVR+@u)0Klgbgx12p2+A*t!ujNVv>Rqa(xG-5$BVi7YCm8Ugfg&@8cLn#NLh zl(Nl?-sECaWk%4kior>2VCt!j6BBBquQt-NLV9CiAIxv$8zrt&SW#@m+=%kczz+8h zDJ0XYhGlBA|FAa!HaG0~>3xn#&R@fDvSk`Z+f~&}+JL1sf=PtizWNS_LB1Am_cqB| zrs#jjA6c+1;^xMW5(A4sU@(YrhzdIwts|VNWL0`o;GXF;Knfxi&O0wA+ zVTQSZO15g2NxMcW61&I-Q@llz*L-5;!w8GJn6FB1;%$K%srzhVM~VJpH#sWdtBIJz z38q#9!d^VL?A5Gh2^s5pi%*2s3=P>Y6$7?!Qb_FZStrfzVuDZyn>Uk&B4iI?<{N&v zRF@CXrpc2dq;W7@YBIUlw&9`8%)lP!$rl9yvx}xAne;}#R5#zsC{1`_H6pr7eM(h! zs+*`c7jJl(lhP{LeYR>LtLNu}a;3yhaACP)UnAl4VG2%y)0A$hGIZ&v8k3O2cz<&z zu60Zn&iJobhe=vjW=qK9+hkmvT#ge7oYJIS*vuZ?hE-X<45J!T+;~xsvVEx z#il*0wW%?7?`2nAUGz{z%cA4-{5E~9YaC-MvwbjsZf4|rv4_lHK11)t_4VmOHOj>P zubL?YL0)%fd%Cl|%d)+THo4+vGegyam(Q%K6{?xhpidX0sM5D|>3FSh18&{Pvi&H# z*&r+|T{OILG}F&4kzHnHHB+ij_jdR6X1aSby*;|SyRWBvNjDc6Gn?43N()-~x-&i9 zneJt}XL;X6%a`eb1Dh{6s8iakizf@;WqM5gO@w=DgOnRl6P9;nt>$_3b zsa?jGexXJLo*89X?$cwQ8~G9$x%!fAUS@2=O8QzTxdokk;a}{ zIz4L2%suz`?9BZXp2``Yzl}9^2lfPRlVcCyn$LQ*eb#(Jdj0Ioy`HWV8&i=k%}!5w zTAC0sLy9spXQv-3tGL!EP8_;}XEp85&g}Gbxv{&Z5AAe)H8eZ@xrhirns#5VkB9SS zoBQ>4YFfb8CfoYJ(fQe#C+K>0cKV<%XLeT=8&8vtQ2Gw-7iXsraAJk_ZZ+O_cKX>! zl>CvVjZ-rY-|XJ_{E zTGrbz2wiOKrb6kEslD;YLRCY1Q6FY;pn}3@p3p~c zTg!afTS+1NSoWlSsHZH&?Uc^kOfs(KNTbx4@{4*q%9`6lRP^YA$|y6{+A}sS-RNcq zJ6OiY*QLfYJTMbbMhUy};~^*pjomtu*2-CB+o1iH3)jO%PljpSG-v>8rsZgiVQk!D zr>7p04q1!E2*k7w?UebqH>c|~vZm3^PVF~#*Hf1Ik{h1#4KM3kO=v-@>~u7(I<%9u zpw(!UxGT~)PaZPO_W``F24vIQDU`MqpK1LQFbXfm zJ4R=5sF&_rWRzp$qAWZQ;<0l@;;HlmZMLMXGf5V@MsTr^f*G|1s4-U6 zxLG~L5_g%wiPcqGXyXcAV~WZoY&^oCF04UOSgRB0Oz#s9&&b*sF)o)P?0CjOVWJfi z3vs$0k4mZtBF359h(Q{UVC_dYs??WTiq6+=Ypc97tW1S&alPoz1ogiYb1=RpIkj)A zkEQ=HT@w3dn}N!(5AkhqH^{_f3l{IF=4_Eh9Z&m(A}7P~AT@Vhs~daj+N@XezG2yXXy~@FUx0S=D+MoyJ{Dbk|Qo0f&7p# z&z7$-#UXY_v!%ZFedTt^Huvk2?1L8Yd7RJu;LuOeEOJg=HMQ2f>329`VwaRDaQIs? zz4Qy_i5f`7`$iwMPt1^QCs8VqnQY_|uf|Fs+r>8H#r=3@JC>|IrK9AUow*C$PCr&w zs~VX7I2$+FJ02*TA1PWRYwj3Hq5OO-;J0G|KO758JJInJqs3m*wu9q6hO1)EBOX#? zEX`O0zY{f{Rw*NppDS7>!S5CE0f6xr^P5S$KeF#O6ihGMo^g^ev&&bj#33h3M!e!t z6`d?fyh7{voh;utD3)!?=p2IQh?A37{jw$R$L=^TVTnsCzPajK|8XH97v`2bVx}aF z!o%)00okotrqOT#MvlLo}6Bo1FHE-{Jq{$gK67O|k*tq+i+= zPcnHZ`?us_C>w)LU&cV<9TwoVY{q^Dl2J_Uz0I6$9xJ9^BzD_*1kkotre;LvalnWy zNjlyJF$0M!%)&F`)YQ77Cn9dKChop%WoW)=PRQ6=<8x05E!+1c%~`R~hRxNYESn!+ zfD+?;@sCMnC5&$w%T>hTc$}wY!pwXe4U1yp7}U&0e$jPQ;=oGWn?n}kyf}=Y|52hT zIfqGqIDkp)O-_gA6g$>A(|gQjQCu`Ji8-ER55NM%e>sZJk6P}k zIjC}CoVXR{WIDIaBazs{EUI?VYn5TFm;HMCS2p|B8o{?O8;_f7&2N3#KgE$, 2005-2010. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.23.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2010-10-03 18:48+1030\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: LocFactoryEditor 1.8\n" + +msgid "Could not establish connection to sound server" +msgstr "Không thể thiết lập sự kết nối tới máy phục vụ âm thanh" + +msgid "Failed to query sound server capabilities" +msgstr "Lỗi truy vấn khả năng của máy phục vụ âm thanh" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "« %s » bởi « %s »" + +msgid "Internal data stream error." +msgstr "Lỗi luồng dữ liệu nội bộ." + +msgid "Failed to decode JPEG image" +msgstr "Lỗi giải mã ảnh JPEG" + +msgid "Could not connect to server" +msgstr "Không thể kết nối tới máy phục vụ" + +msgid "Server does not support seeking." +msgstr "" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "Không thể kết nối tới máy phục vụ" + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "Không thể thiết lập sự kết nối tới máy phục vụ âm thanh" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "" +"Chưa có dữ liệu âm thanh nhập, hoặc dữ liệu âm thanh nhập không hợp lệ. Vì " +"thế luồng AVI hư." + +msgid "This file contains no playable streams." +msgstr "Tập tin này không chứa luồng có thể phát." + +msgid "This file is invalid and cannot be played." +msgstr "Tập tin này không hợp lệ nên không thể phát được." + +msgid "This file is corrupt and cannot be played." +msgstr "Tập tin này bị hỏng nên không thể phát." + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "Tập tin này chưa hoàn thành nên không thể được phát." + +msgid "The video in this file might not play correctly." +msgstr "Ảnh động trong tập tin này có thể không phát đúng." + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "Tập tin này chứa quá nhiều luồng nên chỉ phát %d đầu tiên" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"Không tìm thấy luồng được hỗ trợ. Người dùng có thể cần phải cài đặt một " +"phần bổ sung RTSP Gstreamer để xử lý luồng nhạc/phim loại Real." + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"Không tìm thấy luồng được hỗ trợ. Người dùng có thể cần cho phép thêm giao " +"thức truyền, hoặc chưa cài đặt phần bổ sung RTSP Gstreamer đúng." + +msgid "Internal data flow error." +msgstr "Lỗi luồng dữ liệu nội bộ." + +msgid "Volume" +msgstr "Âm lượng" + +msgid "Bass" +msgstr "Trầm" + +msgid "Treble" +msgstr "Cao" + +msgid "Synth" +msgstr "Tổng hợp" + +msgid "PCM" +msgstr "PCM" + +msgid "Speaker" +msgstr "Loa" + +msgid "Line-in" +msgstr "Dây-vào" + +msgid "Microphone" +msgstr "Micrô" + +msgid "CD" +msgstr "CD" + +msgid "Mixer" +msgstr "Trộn" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "Ghi" + +msgid "In-gain" +msgstr "Vào-gia lượng" + +msgid "Out-gain" +msgstr "Ra-gia lượng" + +msgid "Line-1" +msgstr "Dây-1" + +msgid "Line-2" +msgstr "Dây-2" + +msgid "Line-3" +msgstr "Dây-3" + +msgid "Digital-1" +msgstr "Đoạn biến-1" + +msgid "Digital-2" +msgstr "Đoạn biến-2" + +msgid "Digital-3" +msgstr "Đoạn biến-3" + +msgid "Phone-in" +msgstr "Điện thoại-vào" + +msgid "Phone-out" +msgstr "Điạn thoại-ra" + +msgid "Video" +msgstr "Ảnh động" + +msgid "Radio" +msgstr "Thu thanh" + +msgid "Monitor" +msgstr "Màn hình" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" +"Không thể mở thiết bị âm thanh để phát lại. Thiết bị này đang được một ứng " +"dụng khác sử dụng." + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +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." + +msgid "Could not open audio device for playback." +msgstr "Không thể mở thiết bị âm thanh để phát lại." + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" +"Không thể mở thiết bị âm thanh để thu. Bạn không có quyền mở thiết bị này." + +msgid "Could not open audio device for recording." +msgstr "Không thể mở thiết bị âm thanh để thu." + +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." + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +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ở không phải được yếu tố này hỗ trợ." + +msgid "Master" +msgstr "Chủ" + +msgid "Front" +msgstr "Trước" + +msgid "Rear" +msgstr "Sau" + +msgid "Headphones" +msgstr "Tai nghe" + +msgid "Center" +msgstr "Tâm" + +msgid "LFE" +msgstr "LFE" + +msgid "Surround" +msgstr "Vòm" + +msgid "Side" +msgstr "Bên" + +msgid "Built-in Speaker" +msgstr "Loa dựng sẵn" + +msgid "AUX 1 Out" +msgstr "AUX 1 Ra" + +msgid "AUX 2 Out" +msgstr "AUX 2 Ra" + +msgid "AUX Out" +msgstr "AUX Ra" + +msgid "3D Depth" +msgstr "Sâu ba chiều" + +msgid "3D Center" +msgstr "Tâm ba chiều" + +msgid "3D Enhance" +msgstr "Tăng cường ba chiều" + +msgid "Telephone" +msgstr "Điện thoại" + +msgid "Line Out" +msgstr "Dây Ra" + +msgid "Line In" +msgstr "Dây Vào" + +msgid "Internal CD" +msgstr "CD ở trong" + +msgid "Video In" +msgstr "Ảnh động Vào" + +msgid "AUX 1 In" +msgstr "AUX 1 Vào" + +msgid "AUX 2 In" +msgstr "AUX 2 Vào" + +msgid "AUX In" +msgstr "AUX Vào" + +msgid "Record Gain" +msgstr "Ghi lưu khuếch đại" + +msgid "Output Gain" +msgstr "Khuếch đại Ra" + +msgid "Microphone Boost" +msgstr "Tăng máy vi âm" + +msgid "Loopback" +msgstr "Mạch nội bộ" + +msgid "Diagnostic" +msgstr "Chẩn đoán" + +msgid "Bass Boost" +msgstr "Tăng trầm" + +msgid "Playback Ports" +msgstr "Cổng phát lại" + +msgid "Input" +msgstr "Vào" + +msgid "Record Source" +msgstr "Ghi lưu nguồn" + +msgid "Monitor Source" +msgstr "Theo dõi nguồn" + +msgid "Keyboard Beep" +msgstr "Bíp bàn phím" + +msgid "Simulate Stereo" +msgstr "Mô phỏng âm lập thể" + +msgid "Stereo" +msgstr "Âm lập thể" + +msgid "Surround Sound" +msgstr "Âm thanh vòm" + +msgid "Microphone Gain" +msgstr "Khuếch đại máy vi âm" + +msgid "Speaker Source" +msgstr "Nguồn loa" + +msgid "Microphone Source" +msgstr "Nguồn máy vi âm" + +msgid "Jack" +msgstr "Ổ cắm" + +msgid "Center / LFE" +msgstr "Tâm / LFE" + +msgid "Stereo Mix" +msgstr "Hoả tiếng âm lập thể" + +msgid "Mono Mix" +msgstr "Hoà tiếng đơn nguồn" + +msgid "Input Mix" +msgstr "Hoà tiếng đầu vào" + +msgid "SPDIF In" +msgstr "SPDIF Vào" + +msgid "SPDIF Out" +msgstr "SPDIF Ra" + +msgid "Microphone 1" +msgstr "Máy vi âm 1" + +msgid "Microphone 2" +msgstr "Máy vi âm 2" + +msgid "Digital Out" +msgstr "Điện số Ra" + +msgid "Digital In" +msgstr "Điện số Vào" + +msgid "HDMI" +msgstr "HDMI" + +msgid "Modem" +msgstr "Bộ điều giải" + +msgid "Handset" +msgstr "Cầm tay" + +msgid "Other" +msgstr "Khác" + +msgid "None" +msgstr "Không có" + +msgid "On" +msgstr "Bật" + +msgid "Off" +msgstr "Tắt" + +msgid "Mute" +msgstr "Câm" + +msgid "Fast" +msgstr "Nhanh" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "Rất thấp" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "Thấp" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "Vừa" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "Cao" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "Rất cao" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "Sản xuất" + +msgid "Front Panel Microphone" +msgstr "Mặt trước: Máy vi âm" + +msgid "Front Panel Line In" +msgstr "Mặt trước: Dây Vào" + +msgid "Front Panel Headphones" +msgstr "Mặt trước: Tai nghe" + +msgid "Front Panel Line Out" +msgstr "Mặt trước: Dây Ra" + +msgid "Green Connector" +msgstr "Đầu nối màu lục" + +msgid "Pink Connector" +msgstr "Đầu nối màu hồng" + +msgid "Blue Connector" +msgstr "Đầu nối màu xanh" + +msgid "White Connector" +msgstr "Đầu nối màu trắng" + +msgid "Black Connector" +msgstr "Đầu nối màu đen" + +msgid "Gray Connector" +msgstr "Đầu nối màu xám" + +msgid "Orange Connector" +msgstr "Đầu nối màu cam" + +msgid "Red Connector" +msgstr "Đầu nối màu đỏ" + +msgid "Yellow Connector" +msgstr "Đầu nối màu vàng" + +msgid "Green Front Panel Connector" +msgstr "Mặt trước: đầu nối màu lục" + +msgid "Pink Front Panel Connector" +msgstr "Mặt trước: đầu nối màu hồng" + +msgid "Blue Front Panel Connector" +msgstr "Mặt trước: đầu nối màu xanh" + +msgid "White Front Panel Connector" +msgstr "Mặt trước: đầu nối màu trắng" + +msgid "Black Front Panel Connector" +msgstr "Mặt trước: đầu nối màu đen" + +msgid "Gray Front Panel Connector" +msgstr "Mặt trước: đầu nối màu xám" + +msgid "Orange Front Panel Connector" +msgstr "Mặt trước: đầu nối màu cam" + +msgid "Red Front Panel Connector" +msgstr "Mặt trước: đầu nối màu đỏ" + +msgid "Yellow Front Panel Connector" +msgstr "Mặt trước: đầu nối màu vàng" + +msgid "Spread Output" +msgstr "Mở rộng kết xuất" + +msgid "Downmix" +msgstr "Hạ hoà tiếng" + +msgid "Virtual Mixer Input" +msgstr "Hoà tiếng ảo : Vào" + +msgid "Virtual Mixer Output" +msgstr "Hoà tiếng ảo : Ra" + +msgid "Virtual Mixer Channels" +msgstr "Hoà tiếng ảo : Kênh" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "Chức năng %s %d" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "Chức năng %s" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +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ợ." + +msgid "Playback is not supported by this audio device." +msgstr "Chức năng phát lại không phải được thiết bị âm thanh này hỗ trợ." + +msgid "Audio playback error." +msgstr "Lỗi phát lại âm thanh." + +msgid "Recording is not supported by this audio device." +msgstr "Chức năng thu không phải được thiết bị âm thanh này hỗ trợ." + +msgid "Error recording from audio device." +msgstr "Gặp lỗi khi thu từ thiết bị âm thanh." + +msgid "Gain" +msgstr "Khuếch đại" + +msgid "Headphone" +msgstr "Tai nghe" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "Gặp lỗi khi đọc %d byte từ thiết bị « %s »." + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "Nhận được kích cỡ khung bất thường %u, thay cho %u." + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "Gặp lỗi khi đọc %d byte trên thiết bị « %s »." + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" +"Gặp lỗi khi lấy khả năng của thiết bị « %s ». Nó không phải là trình điều " +"khiển phiên bản 4l2. Kiểm tra nó là trình điều khiển phiên bản 4l1 không." + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "Lỗi truy vấn khả năng của %d nhập trong thiết bị %s" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "Lỗi lấy thiết lập của thiết bị điều hưởng %d trên thiết bị « %s »." + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "Lỗi truy vấn chỉ tiêu trên thiết bị « %s »." + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "Lỗi lấy các thuộc tính của bộ điều khiển trên thiết bị « %s »." + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "Không thể nhận diện thiết bị « %s »." + +#, c-format +msgid "This isn't a device '%s'." +msgstr "Không phải là thiết bị « %s »." + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "Không thể mở thiết bị « %s » để đọc và ghi." + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "Thiết bị « %s » không phải là thiết bị bắt gì." + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "Thiết bị « %s » không phải là thiết bị xuất ra." + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "Lỗi đặt chỉ tiêu cho thiết bị « %s »." + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "Lỗi lấy tần số hiện thời của thiết bị điều hưởng cho thiết bị « %s »." + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" +"Lỗi đặt tần số hiện thời của thiết bị điều hưởng cho thiết bị « %s » là %lu " +"Hz." + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "Lỗi lấy biên độ tín hiệu cho thiết bị « %s »." + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "Lỗi lấy giá trị của bộ điều khiển %d trên thiết bị « %s »." + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "Lỗi đặt giá trị %d của bộ điều khiển %d trên thiết bị « %s »." + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" +"Lỗi lấy kết nhập hiện thời vào thiết bị « %s ». Có thể là thiết bị thu thanh." + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "Lỗi đặt dữ liệu nhập %d vào thiết bị « %s »." + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" +"Lỗi lấy kết nhập hiện thời vào thiết bị « %s ». Có thể là thiết bị thu thanh." + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "Lỗi đặt dữ liệu nhập %d vào thiết bị « %s »." + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "Không thể phụ thêm các bộ đệm vào hàng đợi trên thiết bị « %s »." + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "Lỗi khi thử lấy các khung ảnh động từ thiết bị « %s »." + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "Lỗi sau %d lần thử. Thiết bị %s. Lỗi hệ thống: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "Không thể lấy các tham số về thiết bị « %s »." + +msgid "Video input device did not accept new frame rate setting." +msgstr "Thiết bị nhập ảnh động vào không chấp nhận thiết lập tốc độ khung mới." + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "Không thể ánh xạ các bộ đệm từ thiết bị « %s »." + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" +"Trình điều khiển của thiết bị « %s » không hỗ trợ phương pháp bắt đã biết " +"nào." + +msgid "Changing resolution at runtime is not yet supported." +msgstr "Chưa hỗ trợ khả năng thay đổi độ phân giải trong khi chạy." + +msgid "Cannot operate without a clock" +msgstr "Không thể thao tác khi không có đồng hồ." diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ed7238311a1f587577ebac4ecfc20c6458f12309 GIT binary patch literal 7822 zcmbuCS#T7`8OPg+<2d+;Z#&M_Nh|}lchRnVfD9NTE;$y+LLnwE_GovsJ7#xgJv$4C zO1T6WUFg692{4kyAsHDPNg!egoykKUQkA@rR4P}c%6MmXRVkO_O64V$>;Fynu6AX~ zm}E+=-_A_;*WcOQ^XI#6>|nSm(7u88-WM2)f-Ap-f4Kg76Jxi6pMYNh|1Ej*ml?Ye z_jiGJfcJwK%9em6=TY!m;3n{KFa&-b>;jj9qo5bO3N8lkyqU3w!4)9Ae;M2cHi16` zKL8)0_fXoGTzy zXE)r=7+k?_0lx;`4U!%n5T>(I5UytxlG`O;25DRfgelAbDRg_}^IDMfZvZ>NY0w0> zeO1W)1^7kWUjb>{Z{_npfuxr$pMMO}{C}6v{|VB(HzD{m?sjk;cn??zZU+~GO<*y2 z5qt#v2=sst+$ruifMoBhAjv-nlDu|s1$az8zXCSjz}WA>d-1&bZjqNimTZ*l1fd!` z1Csv3;5WfZkn-`5AnEZB@By&k9uc3_An9v?lt*3QW8hEa^N+yIxW5;ZuLpzRcffPt zGvF^l8h7h`f`uT>TL~h>%#^H^Yz3?EybF8^{15mz_|*N3Ee9hYcEFac9M_jA{k^Ct&tR0$|cg1 zu8nA3G@38>Ldv<97Adk&5Agsv?DBLDCkDemS3 zJw}>|YjHt*F|VrOME2|tUgSQ$C1JV0{O+%{N<7ZiCbWp<(R98wrYbvBla;JvC5o;a z7T1ERZfVsuJgDx}0;(&>n|W!(R8z53zDu*hM#AC>4@8W>4ptIY^pK{9xT(gCNW#(# zohueM6A%?uxfbUnx<<8lJQ0f-rlkfU(?~>u?u&q->uSK_mciqyxs&wCzEkyA6KX=` zRf+0q)r@l}ov+z!&$y*jMYMRBOL?RPi8K;=@Y8}r&?cssN>sH-F8b!k%~2q##IloD zn?`hjZg353P6Rb0)1lfhc`TyTR4IWSxz=8zCtoKV52sbBz%YYQ?|QoO|4WCQ@Nn|2 zsVbxZ{1W85OwDqYkdgR2sx&H}Tb>Vim+pvs>sU%!!SQ6;2i#Ni#4ULawbSZPqtOy8(z zI@^ei1fkv?!-k<^8tTmB+8&i7lm!WBi7Zy&YP$2XP52!P8@kF$bx(){lnz@p&7FHj@^*=1V5G{kge+HTckWrnUBsG znvQa+sN7o4)!mk=yBkF;lE5ziKd41PfofRet|8k^n+g@tiK;BY$B1W)-wfunKo?Vq44Cm2PljmO15YtS;LLWH<6BH=sxXvoqZ$|gWgW;~K@S={c4Q?A!uwhiaYsLIMs;}v+;QyTPa!|@Hrm|`A^TON_3aZkuFg1pe{!{3u$ z|Dp<&D#2404{1Tq+C(VssWggt*s@~9%a&CoLVHkoiZ`SiQPpdhp=FE8w^VvcumI30 z%d-w=-eT@A^!Yu7evjYB3k!>Vg^w2ELPt*p4s4`BwqM~2kI(1v6>-16*pGh8(eHT$ z+Er3bMii_F#r!#q|0s;DWP5_I+(SQV60c}$LQ(9~Uc_THM(CjgHcn3^)}dk?7qIf6 zWS7J>1WT*d)ZkLSQu8g>J$u4yU~ed*hD;+7i{}q7=6k{~m26&AR$8`x)>l4n;i3{G zBDP>pWlap`S*Y`6$PZ0_ng_y)36HNzSk<28v;9bW9Kt>8kuY@hD(1_pG;0yNT6?S@ zezo>EPaV0yGdJ?|fm~-@`Gu)9nHIN?YO%F`jz4aN{AJ*<;&c#zsSEFd?OVATj|o!~hwZwHcJo+z`UHt?ZMVnTX2rp#)Vl|hqhu+J$qFS^ z-I=8HbnA%S)|o#6`q*vzoQ@&cCpq4l-vJsp$4=Tqufw%jJ!EI6@vuEnD`pj=oc8n1 zkty+HR>5ob6NBx^!**i}0&BOuogA%Aj-E^PAB3gJ$?4RQ{_7Cu?CU3gcJCJ>)6>Tx zPR#LHQtZhNX#Tl+T*nOg?o1Dk+jYljj!c44>Kq#s_Bt&c2-2*k`F+xEe$T!|)a>&| zQ)AQVkwG8Jz4PbY6|n^(pPWAB>>Wg=BDOO}ju+bl`*XDs-w-qJT(Fz^k)t0^G^Yng zoHMmfPaib4485$qRfB1v%mgb<<7zvJ=uc(PP$0*`dfx zF>angs4_a^I`5sbhq}{)9rmGCyZ1u+QXeD=QTV99@6_;kYP<)gr3VMy?~M5zksNKp zTu$p*yWxHN!dp)5*?a}ho=KhDE50u56I1s7HsP&#ohoFBM5b^Z=o6ixOY(A0dSDbT z&PLn5JdJu0`pzqjiqowLdukv(w11|30OgI9BwxRrs^$f79~?~vWyc6F;t6I-O%7xS zFEk~x!fqRx>6o_1-p+P*LzOcVWu^$#tnZE^C=_U#ymlgMI77bJgX5XF2n}gj6Aqdk zlka;u3>7(NO_S@J8*e6T60$SZLi5k(HcD6Vy}|SCa{ZF8A9*lWzXb=-q(yGJV}wj1 za)dwY2zOfYOP-9pdJ)yqB(w8u9fcW2h}?D!O^(%32<+2urA{<4)RaAS6wl~01U*r; zGhMamxA)Sh(X)2%S$n9B>b1666g2v|!+S3|4VUbRwsbA_o-rmZbSMGkc2Uj8Tl%EP+B6tYH)%&)ZjE6 zq9}c;E<4UlH=pa$qswuVydT)qT%jrPUmGLpX;FWy-sI6yd_RJX*cJkw-NT? z4&iEH@0, 2005. +# Ji ZhengYu , 2008, 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good 0.10.16.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2009-11-13 22:20+0800\n" +"Last-Translator: Ji ZhengYu \n" +"Language-Team: Chinese (simplified) \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "无法建立与音频服务器的连接" + +msgid "Failed to query sound server capabilities" +msgstr "查寻音频服务器的服务失败" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "‘%s’ 由 ‘%s’" + +msgid "Internal data stream error." +msgstr "内部数据流错误。" + +msgid "Failed to decode JPEG image" +msgstr "解码 JPEG 图像出错" + +msgid "Could not connect to server" +msgstr "无法连接至服务器" + +#, fuzzy +msgid "Server does not support seeking." +msgstr "设备‘%s’不支持视频捕获" + +#, fuzzy +msgid "Could not resolve server name." +msgstr "无法连接至服务器" + +#, fuzzy +msgid "Could not establish connection to server." +msgstr "无法建立与音频服务器的连接" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "没有或无效的输入音频,AVI 流将损坏。" + +msgid "This file contains no playable streams." +msgstr "此文件不包含可播放的流。" + +msgid "This file is invalid and cannot be played." +msgstr "此文件无效,无法播放。" + +msgid "This file is corrupt and cannot be played." +msgstr "此文件已损坏,无法播放。" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "此文件不完整且无法播放。" + +msgid "The video in this file might not play correctly." +msgstr "此文件中的视频可能无法正确播放。" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "此文件包含了太多的流。只播放前面 %d 个" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" +"未找到支持的流媒体。您可能需要安装一个 GStreamer RTSP 扩展插件来播放 Real 媒" +"体流。" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" +"未找到支持的流媒体。您可能需要启用更多的传送协议,或者也有可能是缺少正确的 " +"GStreamer RTSP 扩展插件。" + +msgid "Internal data flow error." +msgstr "内部数据流错误。" + +msgid "Volume" +msgstr "音量" + +msgid "Bass" +msgstr "低音(Bass)" + +msgid "Treble" +msgstr "高音(Treble)" + +msgid "Synth" +msgstr "合成器" + +msgid "PCM" +msgstr "波形(PCM)" + +msgid "Speaker" +msgstr "扬声器(Speaker)" + +msgid "Line-in" +msgstr "线路输入(Line-in)" + +msgid "Microphone" +msgstr "话筒" + +msgid "CD" +msgstr "CD 音频" + +msgid "Mixer" +msgstr "混音器" + +msgid "PCM-2" +msgstr "PCM-2" + +msgid "Record" +msgstr "录音" + +msgid "In-gain" +msgstr "输入增益" + +msgid "Out-gain" +msgstr "输出增益" + +msgid "Line-1" +msgstr "线路1" + +msgid "Line-2" +msgstr "线路2" + +msgid "Line-3" +msgstr "线路3" + +msgid "Digital-1" +msgstr "数字线路1" + +msgid "Digital-2" +msgstr "数字线路2" + +msgid "Digital-3" +msgstr "数字线路3" + +msgid "Phone-in" +msgstr "话筒输入" + +msgid "Phone-out" +msgstr "话筒输出" + +msgid "Video" +msgstr "视频" + +msgid "Radio" +msgstr "广播" + +msgid "Monitor" +msgstr "监控器" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "无法打开音频设备播放音频。设备当前由另一个程序使用。" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "无法打开音频设备播放音频。您无权使用这一设备。" + +msgid "Could not open audio device for playback." +msgstr "无法打开音频设备播放音频。" + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "无法打开音频设备录音。您无权使用这一设备。" + +msgid "Could not open audio device for recording." +msgstr "无法打开音频设备录音。" + +#, fuzzy +msgid "Could not open audio device for mixer control handling." +msgstr "无法打开音频设备录音。" + +#, 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 "无法打开音频设备录音。您无权使用这一设备。" + +msgid "Master" +msgstr "" + +msgid "Front" +msgstr "" + +msgid "Rear" +msgstr "" + +#, fuzzy +msgid "Headphones" +msgstr "头戴式耳机" + +msgid "Center" +msgstr "" + +msgid "LFE" +msgstr "" + +msgid "Surround" +msgstr "" + +msgid "Side" +msgstr "" + +msgid "Built-in Speaker" +msgstr "内建扬声器" + +msgid "AUX 1 Out" +msgstr "AUX 1 输出" + +msgid "AUX 2 Out" +msgstr "AUX 2 输出" + +#, fuzzy +msgid "AUX Out" +msgstr "AUX 1 输出" + +msgid "3D Depth" +msgstr "" + +msgid "3D Center" +msgstr "" + +msgid "3D Enhance" +msgstr "" + +#, fuzzy +msgid "Telephone" +msgstr "头戴式耳机" + +msgid "Line Out" +msgstr "线路输出" + +#, fuzzy +msgid "Line In" +msgstr "线路输入(Line-in)" + +msgid "Internal CD" +msgstr "" + +#, fuzzy +msgid "Video In" +msgstr "视频" + +#, fuzzy +msgid "AUX 1 In" +msgstr "AUX 1 输出" + +#, fuzzy +msgid "AUX 2 In" +msgstr "AUX 2 输出" + +msgid "AUX In" +msgstr "" + +#, fuzzy +msgid "Record Gain" +msgstr "录音" + +msgid "Output Gain" +msgstr "" + +#, fuzzy +msgid "Microphone Boost" +msgstr "话筒" + +msgid "Loopback" +msgstr "" + +msgid "Diagnostic" +msgstr "" + +msgid "Bass Boost" +msgstr "" + +msgid "Playback Ports" +msgstr "" + +msgid "Input" +msgstr "" + +#, fuzzy +msgid "Record Source" +msgstr "录音" + +#, fuzzy +msgid "Monitor Source" +msgstr "监控器" + +msgid "Keyboard Beep" +msgstr "" + +msgid "Simulate Stereo" +msgstr "" + +msgid "Stereo" +msgstr "" + +msgid "Surround Sound" +msgstr "" + +#, fuzzy +msgid "Microphone Gain" +msgstr "话筒" + +#, fuzzy +msgid "Speaker Source" +msgstr "扬声器(Speaker)" + +#, fuzzy +msgid "Microphone Source" +msgstr "话筒" + +msgid "Jack" +msgstr "" + +msgid "Center / LFE" +msgstr "" + +msgid "Stereo Mix" +msgstr "" + +msgid "Mono Mix" +msgstr "" + +msgid "Input Mix" +msgstr "" + +#, fuzzy +msgid "SPDIF In" +msgstr "SPDIF 输出" + +msgid "SPDIF Out" +msgstr "SPDIF 输出" + +#, fuzzy +msgid "Microphone 1" +msgstr "话筒" + +#, fuzzy +msgid "Microphone 2" +msgstr "话筒" + +#, fuzzy +msgid "Digital Out" +msgstr "数字线路1" + +#, fuzzy +msgid "Digital In" +msgstr "数字线路1" + +msgid "HDMI" +msgstr "" + +msgid "Modem" +msgstr "" + +msgid "Handset" +msgstr "" + +msgid "Other" +msgstr "" + +msgid "None" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Off" +msgstr "" + +msgid "Mute" +msgstr "" + +msgid "Fast" +msgstr "" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "" + +#, fuzzy +msgid "Front Panel Microphone" +msgstr "话筒" + +msgid "Front Panel Line In" +msgstr "" + +msgid "Front Panel Headphones" +msgstr "" + +msgid "Front Panel Line Out" +msgstr "" + +msgid "Green Connector" +msgstr "" + +msgid "Pink Connector" +msgstr "" + +msgid "Blue Connector" +msgstr "" + +msgid "White Connector" +msgstr "" + +msgid "Black Connector" +msgstr "" + +msgid "Gray Connector" +msgstr "" + +msgid "Orange Connector" +msgstr "" + +msgid "Red Connector" +msgstr "" + +msgid "Yellow Connector" +msgstr "" + +msgid "Green Front Panel Connector" +msgstr "" + +msgid "Pink Front Panel Connector" +msgstr "" + +msgid "Blue Front Panel Connector" +msgstr "" + +msgid "White Front Panel Connector" +msgstr "" + +msgid "Black Front Panel Connector" +msgstr "" + +msgid "Gray Front Panel Connector" +msgstr "" + +msgid "Orange Front Panel Connector" +msgstr "" + +msgid "Red Front Panel Connector" +msgstr "" + +msgid "Yellow Front Panel Connector" +msgstr "" + +msgid "Spread Output" +msgstr "" + +msgid "Downmix" +msgstr "" + +msgid "Virtual Mixer Input" +msgstr "" + +msgid "Virtual Mixer Output" +msgstr "" + +msgid "Virtual Mixer Channels" +msgstr "" + +#. TRANSLATORS: name + number of a volume mixer control +#, c-format +msgid "%s %d Function" +msgstr "" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "" + +#, fuzzy +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "无法打开音频设备播放音频。您无权使用这一设备。" + +msgid "Playback is not supported by this audio device." +msgstr "" + +msgid "Audio playback error." +msgstr "" + +msgid "Recording is not supported by this audio device." +msgstr "" + +#, fuzzy +msgid "Error recording from audio device." +msgstr "从设备‘%2$s’中读取 %1$d 个字节时出错。" + +msgid "Gain" +msgstr "增益" + +msgid "Headphone" +msgstr "头戴式耳机" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "从设备‘%2$s’中读取 %1$d 个字节时出错。" + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "取得了 %u 的不需要的帧大小,而不是 %u。" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "读取设备‘%2$s’中的 %1$d 字节时出错。" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "获取设备‘%s’的信息时出错:它不是一个 v4l2 驱动器,请检查是否为 v4l1。" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "查寻设备 %2$s 中的输入 %1$d 的属性时出错" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "获取设备 %2$s 上的微调钮 %1$d 的设置时出错" + +#, fuzzy, c-format +msgid "Failed to query norm on device '%s'." +msgstr "查寻设备 ‘%s’上的基准时出错。" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "获取设备‘%s’上的控制属性时出错。" + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "无法确认设备‘%s’。" + +#, c-format +msgid "This isn't a device '%s'." +msgstr "不是设备‘%s’。" + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "无法打开设备‘%s’读写。" + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "‘%s’不是一个捕获设备。" + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "‘%s’不是输出设备。" + +#, fuzzy, c-format +msgid "Failed to set norm for device '%s'." +msgstr "设置设备‘%s’的基准时出错。" + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "获取设备‘%s’的当前微调钮频率时出错。" + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "设置设备‘%s’的当前微调钮频率为 %lu Hz 时出错。" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "获取设备‘%s’的信号长度时出错。" + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "获取设备‘%2$s’的控制器 %1$d 的值出错。" + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "设置设备‘%3$s’的控制器 %2$d 的值为 %1$d 时出错。" + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "获取设备‘%s’上的当前输入出错。也许它是一个广播设备" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "设置设备 %2$s 上的输入 %1$d 时出错。" + +#, fuzzy, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "获取设备‘%s’上的当前输入出错。也许它是一个广播设备" + +#, fuzzy, c-format +msgid "Failed to set output %d on device %s." +msgstr "设置设备 %2$s 上的输入 %1$d 时出错。" + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "无法对设备‘%s’中的缓冲区进行排序。" + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "从设备‘%s’上获取视频的尝试失败了。" + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "在 %d 次尝试后失败。设备 %s。系统错误: %s" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "无法获取设备‘%s’的参数" + +msgid "Video input device did not accept new frame rate setting." +msgstr "视频输入设备不接受新的帧率设置。" + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "无法从设备‘%s’中映射出缓冲区" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "设备‘%s’的驱动不支持任何已知的捕获方式。" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "尚不支持在运行时更改分辨率。" + +msgid "Cannot operate without a clock" +msgstr "没有时钟的话无法操作" + +#~ msgid "Failed to enumerate possible video formats device '%s' can work with" +#~ msgstr "枚举设备‘%s’可能支持的视频格式时出错" + +#~ msgid "" +#~ "The buffer type is not supported, or the index is out of bounds, or no " +#~ "buffers have been allocated yet, or the userptr or length are invalid. " +#~ "device %s" +#~ msgstr "" +#~ "不支持的缓冲区类型,或者索引超出范围了,或是还未分配缓冲区,或非法的用户指" +#~ "针或长度。设备 %s" + +#~ msgid "" +#~ "Failed trying to get video frames from device '%s'. Not enough memory." +#~ msgstr "从设备‘%s’上获取视频的尝试失败了。没有足够的内存。" + +#~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." +#~ msgstr "内存不足无法对用户指针缓冲区进行排序。设备 %s。" + +#~ msgid "No free buffers found in the pool at index %d." +#~ msgstr "在内存池中 %d 处没有可分配的缓冲区。" + +#~ msgid "Device '%s' cannot capture at %dx%d" +#~ msgstr "设备‘%s’不能在 %dx%d 处捕获" + +#~ msgid "Device '%s' cannot capture in the specified format" +#~ msgstr "设备‘%s’无法以指定格式捕获" + +#~ msgid "Could not get buffers from device '%s'." +#~ msgstr "无法从设备‘%s’中获取缓冲区。" + +#~ msgid "Could not get enough buffers from device '%s'." +#~ msgstr "无法从设备‘%s’中获取足够的缓冲区。" + +#~ msgid "Error starting streaming capture from device '%s'." +#~ msgstr "从设备‘%s’中启用流捕获时出错。" + +#~ msgid "Error stopping streaming capture from device '%s'." +#~ msgstr "从设备‘%s’中停止流捕获时出错。" + +#~ msgid "Failed getting controls attributes on device '%s.'" +#~ msgstr "获取设备‘%s’上的控制属性时出错。" + +#~ msgid "Could not read from CD." +#~ msgstr "无法从 CD 中读取。" + +#~ msgid "Disc is not an Audio CD." +#~ msgstr "非音频 CD 盘。" + +#~ msgid "This file is encrypted and cannot be played." +#~ msgstr "此文件已加密,无法播放。" diff --git a/po/zh_HK.gmo b/po/zh_HK.gmo new file mode 100644 index 0000000000000000000000000000000000000000..04297372b5af5c4044a29b1eb361d51c9985c7ad GIT binary patch literal 4704 zcmb`Idu$v>9ml6_Xo?9Gnm|i=WKx=vG}-gn4XJZY+QhH=8eeSX+=xOYy1pIXZF9GK z+1pFvAVFS!H4i88Bji<+R}+#tj_TqVJ5Gc|;Xe@kfsl|uD7Sle5-KkhRR|E@-|d|5 zni7Z*qxuZK z6!>$H{I~^v0?dPC_kED&zXwjQ1n&o_y#^#dYC&urYXoV05G4OwK(h07uo8R~#E%`v zhsK`=N$(O!>zV-l;EzC>_dSsG{t1$w_d%KL%?C;UF_6~j2cg2A25DR^NP6o*xX!*N zsmcEh$!#F*+fI=7?I?KY9>y+%G;TE}AvS_!w-uy$UIHnen&cMQ|1HTrkn(O2gei6j zBtIuWiu(-s6!=px2Hp#2UjjFSWcMA(Ux2i~zXiVxWB$yX#3Agy#X0vCsE%3p}0_42BEV^g<@C@p*=+Evj#{Vgh~~JV)!_OL+JjY+@SJB4=e=I zIa?~*UjY@!bC89Q&qAH5kmJcowX(iTb$yJX(M9mroo=7 z=XJucg+;Y`k+fq}X)t1{5fNhF0JV%PsY{Gb~Un@3(GPs zAFEYUDPC)uDVs^-9(W~hZfsz6W;(8M!?d}X6b4rdHZ-wSj|kpjT0Eg|7Z#70hHaT~ z4o|eWZbW_m>p0#P(^Gt_uu@nsH#@i;6TF3H4x4F1-DH^t8of^u}V>|H@6uG5^JDvb4x@_OGAWshh-){5KbR! zRIv$-7Gmjrd8=xOIBycFmW-K(NPVEYSvLetRu~{v3w<c2l)9UMobB zQRWo=Yc|a!B^+xux3LhGi2Mx+O;0CS$unM6-l#5bc)3}o`n;+e1H35^R zq1y=bY^PyzT1+Ty3%0@J_)9mos&QQdv0iTrmh*L+g2iQR)8ld8E|Aogl};j;HX!z_ zrK5wj7_0>eX)%PD#uhwjEgq;=q+*KAHt(3Dk+*T16vL zsIQGCR6XvCn2BdG#)ziXs8HH)m;zA7fldj&q{+mX_4q91tD%@kBcnUl;#y5_kE!uE zt)MhGz<0#H(X_rI6bv<#;#KAISJdGi!BwcVbtbVqTWq&0ap~#CGdvPgEnEO=UTkYr zYD#+KeTT4=1|wq96&2t$?Ydn-PmuH4NN&%}T|Gd#8v{<)dHD#HHEyf+OtJjPc>c^` z_sFO_cq2b}EH^fGYv*q7J#x;xo;~pz%S?`DXRb(8W@ZjzNOt!X<{tg7J3i$04LH|# zN-M)Xndyn#%@euP``v5T(CHq$;Pg(o0|zoQC&})I$KaES08A8)NI^pym&JK>0g6!P9%$&Xh2rjK< z*8p?Qz3ukC?OgBA?HqScPUTOXaZlZ3*{PekYh&JoAL{BUYUQWiaJu&8&mNR2^vEp9 zU;d6e*|n6peftnM&z;+6VNhbleZ#X%*@&UZg0b3cj}OQjIt*V=Pq1GdZx1dH%h@kt|MgQ z4Cx9^I9K+_4agyPdZwh$&WYEN%-PFhPXAd(xn7nzvl;Jodbvw+M$j`;7o4GP<{Ua$ zmOq6|D;oCF&Rg@H412jrCcS5hT*JNLTzkXmAD2;bFP?VyjbtzH%ghX*3(52*fOx_y zil=, 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good-0.10.2 0.10.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2006-08-29 01:08+0800\n" +"Last-Translator: Abel Cheung \n" +"Language-Team: Chinese (Hong Kong) \n" +"Language: zh_HK\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +msgid "Internal data stream error." +msgstr "內部資料串流發生錯誤。" + +msgid "Failed to decode JPEG image" +msgstr "" + +msgid "Could not connect to server" +msgstr "" + +msgid "Server does not support seeking." +msgstr "" + +msgid "Could not resolve server name." +msgstr "" + +msgid "Could not establish connection to server." +msgstr "" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "沒有任何輸入的音效資料或者資料無效,表示 AVI 串流出現錯誤。" + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +#, fuzzy +msgid "Internal data flow error." +msgstr "內部資料串流發生錯誤。" + +msgid "Volume" +msgstr "" + +msgid "Bass" +msgstr "" + +msgid "Treble" +msgstr "" + +msgid "Synth" +msgstr "" + +msgid "PCM" +msgstr "" + +msgid "Speaker" +msgstr "" + +msgid "Line-in" +msgstr "" + +msgid "Microphone" +msgstr "" + +msgid "CD" +msgstr "" + +msgid "Mixer" +msgstr "" + +msgid "PCM-2" +msgstr "" + +msgid "Record" +msgstr "" + +msgid "In-gain" +msgstr "" + +msgid "Out-gain" +msgstr "" + +msgid "Line-1" +msgstr "" + +msgid "Line-2" +msgstr "" + +msgid "Line-3" +msgstr "" + +msgid "Digital-1" +msgstr "" + +msgid "Digital-2" +msgstr "" + +msgid "Digital-3" +msgstr "" + +msgid "Phone-in" +msgstr "" + +msgid "Phone-out" +msgstr "" + +msgid "Video" +msgstr "" + +msgid "Radio" +msgstr "" + +msgid "Monitor" +msgstr "" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +msgid "Could not open audio device for playback." +msgstr "" + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +msgid "Could not open audio device for recording." +msgstr "" + +msgid "Could not open audio device for mixer control handling." +msgstr "无法打开音频文件进行混音控制操作。" + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"无法打开音频设备进行音量控制操作。此部件不支持开放声音系统(OSS)的版本。" + +msgid "Master" +msgstr "主声道" + +msgid "Front" +msgstr "前置声道" + +msgid "Rear" +msgstr "后置声道" + +msgid "Headphones" +msgstr "头戴式耳机" + +msgid "Center" +msgstr "中置" + +msgid "LFE" +msgstr "低音炮" + +msgid "Surround" +msgstr "立体声环绕" + +msgid "Side" +msgstr "左右声道" + +msgid "Built-in Speaker" +msgstr "" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "AUX 输出" + +msgid "3D Depth" +msgstr "3D Depth" + +msgid "3D Center" +msgstr "3D Center" + +msgid "3D Enhance" +msgstr "3D Enhance" + +msgid "Telephone" +msgstr "话筒" + +msgid "Line Out" +msgstr "" + +msgid "Line In" +msgstr "线路输入" + +msgid "Internal CD" +msgstr "内部 CD 音频" + +msgid "Video In" +msgstr "视频输入" + +msgid "AUX 1 In" +msgstr "AUX 1 输入" + +msgid "AUX 2 In" +msgstr "AUX 2 输入" + +msgid "AUX In" +msgstr "AUX 输入" + +msgid "Record Gain" +msgstr "录音增益" + +msgid "Output Gain" +msgstr "输出增益" + +msgid "Microphone Boost" +msgstr "麦克风增益" + +msgid "Loopback" +msgstr "Loopback" + +#, fuzzy +msgid "Diagnostic" +msgstr "采样分析" + +msgid "Bass Boost" +msgstr "Bass 增益" + +msgid "Playback Ports" +msgstr "回放端口" + +msgid "Input" +msgstr "输入" + +msgid "Record Source" +msgstr "录音来源" + +msgid "Monitor Source" +msgstr "监视器来源" + +msgid "Keyboard Beep" +msgstr "按键声音" + +msgid "Simulate Stereo" +msgstr "模拟立体声" + +msgid "Stereo" +msgstr "立体声" + +msgid "Surround Sound" +msgstr "立体声环绕" + +msgid "Microphone Gain" +msgstr "麦克风增益" + +msgid "Speaker Source" +msgstr "扬声器音源" + +msgid "Microphone Source" +msgstr "麦克风音源" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "中置/低音炮" + +msgid "Stereo Mix" +msgstr "立体声" + +msgid "Mono Mix" +msgstr "单声道" + +msgid "Input Mix" +msgstr "混音输入" + +msgid "SPDIF In" +msgstr "SPDIF 输入" + +msgid "SPDIF Out" +msgstr "" + +msgid "Microphone 1" +msgstr "麦克风 1" + +msgid "Microphone 2" +msgstr "麦克风 2" + +msgid "Digital Out" +msgstr "数字输出" + +msgid "Digital In" +msgstr "数字输入" + +msgid "HDMI" +msgstr "HDMI(高清)" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "手持设备" + +msgid "Other" +msgstr "其它设备" + +msgid "None" +msgstr "无" + +msgid "On" +msgstr "开" + +msgid "Off" +msgstr "关" + +msgid "Mute" +msgstr "静音" + +msgid "Fast" +msgstr "快" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "很慢" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "慢" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "中等" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "高" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "很高" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "生产商" + +msgid "Front Panel Microphone" +msgstr "麦克风面板" + +msgid "Front Panel Line In" +msgstr "线路输入面板" + +msgid "Front Panel Headphones" +msgstr "头戴式耳机面板" + +msgid "Front Panel Line Out" +msgstr "线路输出面板" + +#, fuzzy +msgid "Green Connector" +msgstr "线路输出" + +#, fuzzy +msgid "Pink Connector" +msgstr "话筒输出" + +#, fuzzy +msgid "Blue Connector" +msgstr "立体声输入" + +#, fuzzy +msgid "White Connector" +msgstr "左/单声道" + +#, fuzzy +msgid "Black Connector" +msgstr "后置声道输出" + +#, fuzzy +msgid "Gray Connector" +msgstr "中置声道输出" + +#, fuzzy +msgid "Orange Connector" +msgstr "低音炮输出" + +#, fuzzy +msgid "Red Connector" +msgstr "右声道" + +#, fuzzy +msgid "Yellow Connector" +msgstr "Midi 输出/游戏摇杆" + +#, fuzzy +msgid "Green Front Panel Connector" +msgstr "线路输出面板" + +#, fuzzy +msgid "Pink Front Panel Connector" +msgstr "话筒输出面板" + +#, fuzzy +msgid "Blue Front Panel Connector" +msgstr "立体声输入面板" + +#, fuzzy +msgid "White Front Panel Connector" +msgstr "左/单声道面板" + +#, fuzzy +msgid "Black Front Panel Connector" +msgstr "后置声道输出面板" + +#, fuzzy +msgid "Gray Front Panel Connector" +msgstr "中置声道输出面板" + +#, fuzzy +msgid "Orange Front Panel Connector" +msgstr "低音炮输出面板" + +#, fuzzy +msgid "Red Front Panel Connector" +msgstr "右声道面板" + +#, fuzzy +msgid "Yellow Front Panel Connector" +msgstr "Midi 输出/游戏摇杆面板" + +msgid "Spread Output" +msgstr "Spread 输出" + +msgid "Downmix" +msgstr "Downmix" + +msgid "Virtual Mixer Input" +msgstr "模拟混音输入" + +#, fuzzy +msgid "Virtual Mixer Output" +msgstr "模拟混音输出" + +msgid "Virtual Mixer Channels" +msgstr "模拟混音输入" + +#. TRANSLATORS: name + number of a volume mixer control +#, fuzzy, c-format +msgid "%s %d Function" +msgstr "%s 功能" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s 功能" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "无法打开音频设备播放音频。此组件不支持开放声音系统(OSS)版本。" + +msgid "Playback is not supported by this audio device." +msgstr "此音频设备不支持音频播放。" + +msgid "Audio playback error." +msgstr "音频播放错误。" + +msgid "Recording is not supported by this audio device." +msgstr "此音频设备不支持录音。" + +msgid "Error recording from audio device." +msgstr "从音频设备录音时发生错误。" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "" + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "" + +#, c-format +msgid "This isn't a device '%s'." +msgstr "" + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "" + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "" + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "" + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "" + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "" + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "" + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "" + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "" diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo new file mode 100644 index 0000000000000000000000000000000000000000..f133f4da7ef28f7a02e561a27b70c72809bc04a2 GIT binary patch literal 4703 zcmb`Ie{2-T6~~8$LgUh;g*0i?HcXSyKw!^jlON`Q1pF&@@NpJ)Xxdal>$~yY!g=?y zw+EQ2D!+{F@WTPy5XU$UzXF9Aqd0);U#L=|{#8}^qf(_xQ6+Bo?xaR-DxtPgRQ3CI z=X@7ZT2ys(?>;lLZ{ECl^JeDbg>(BEN(k~@NZ*$j+XgQ9GX7A;=P~wG@R#7d;D_K> zz~6!;;O}MorsSVM{Mar0%?CdNzX{GogY+K;>H89J0k{Hu7F-4X9DEgg75o$={V*n@ z`E?LoY!~<_xEGuYo&(9%i{OLc6>t&wYw!W^53>I+AnDJ?BFN4HknBGIQvYI*>^u(Q z$DYI=&HEJi9dI2;dOrcb2CCpapaGJ-B#0^4Pi6mpkk;8H*#pvgk4v5bzmE15@P6=D z;5WdJK=R`zcpsPp$?o4lntu+Qeg>QeQhO~(epG_kI#vtP_@5OG|51?E=?9_0o&{-KB}jT3K)B9+ zEE$pCb;%td?b~jU_U#1NGl#KDAdOp%Nr*Kd*$sg-&&wdiGc1{q{XdiJ0x9o$L6~B{ z0Ljm*AjN$OTnYXLjDd6D?2o{$Aldyu@*|M;_hax0&;cpl_aPXhw-BUx7K01HrzPt^ z{Mak_BfV{sJ7s?dNOt-`@@qhTe;XwKM!@fbGa$wPkMg?>Qat`D+n<3HmwPdY>@5W8 z`-33av7avqYI z+KWJn8wbf=o$TKvxkWM#(t6uvdrND`8f!cwGcY9 z>ml`!#~^e!t$^gq3#f!3bO$%c&L4oQWxZ08a)HW25ZbSNp*!(=vatqyO4h4EYzcc& zwh2oitBTrBqP`JAaiOvtLT8Z*#jqSgdx+F$HIOO@l`;s$@No!-(EUTXLFEw-EC|v$ zTPE92g9_w%$YRL1A=omu4)QRBa@h}=523tW0-;h1p?jFlS{;NfN%Gp19=0??XDh3D zmC!9=QmtAftQb{l^q8uL1zZ2p%e;)&>u#kyUyg0~tbZ_{=PlZOr6GL1Ng zCy}_OM}7b6INlu7l6<=`lUOh}TDcVyJVY}$87V!&o7$6>Xyec!my)SO!Z0ln;VtdZ zM6Za8HiYQE&z}#2@BcPqwHDPZHBN!gS1Ib%#tt1pVl@Z*hFtPY!$ z6c#J8Tc<^1tX@xGr2Ef<@VK5*O~;C=stfgqYNdbU$HI4vfavIN^`aD3AA?P^?$fLO1$1uOXa&Gq?Z?a<i9B;;JQh6LvrttSKSXZ8*EqdQ$>>8sXl`SYF3fbpzOx zLIUFmvV6rmk*pa<&P%S%!ffYmCb>1*?#-CkAP+WcrjsxSgt70OB?OLOv z5q9hAqHU@c_l1qN=P*W(rqrlVnsJx{P{x5y3cl1b)rdx(sqtle&90adFZ1i`aIL0x zlJ`DqM`3J$?}}|{{$WY5K3G!-SDDXWQiW>-H=)wpp1|rXvC}HWou}!mc{rw;IR9&3 zYOYl(3VP&xt1y)sJ#5eo72p*unpHwCkp0?lcHi_}y+7HRUc2L*e1nP_w^chQSZ;VM zclxMvY{coC$@L9nM@Mh&-s?R__UX4WgRiml_(*2@vP5Zm`Ur+(_FiVriMO4xey6+F zp4u&~9Pdm|Ud!GX%$_>rT)&P^=g4`x>zdPhI6Zxm?0#`f_VSE?e z&F#AYyXo=6PT#0=Xbn-xlnh}(1Y>J z%cUa;JM#U444^#bh7HW14E8T%Wt7;W1W7m*QpM5t6Tw({UP^H7Nr?sW#HhX4iuE zs8BC2)MaMQe!IO5hn, 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-good-0.10.2 0.10.2\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" +"POT-Creation-Date: 2012-02-21 00:10+0000\n" +"PO-Revision-Date: 2006-08-29 01:08+0800\n" +"Last-Translator: Abel Cheung \n" +"Language-Team: Chinese (traditional) \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Could not establish connection to sound server" +msgstr "" + +msgid "Failed to query sound server capabilities" +msgstr "" + +#. TRANSLATORS: 'song title' by 'artist name' +#, c-format +msgid "'%s' by '%s'" +msgstr "" + +msgid "Internal data stream error." +msgstr "內部資料串流發生錯誤。" + +msgid "Failed to decode JPEG image" +msgstr "" + +msgid "Could not connect to server" +msgstr "" + +msgid "Server does not support seeking." +msgstr "" + +msgid "Could not resolve server name." +msgstr "" + +msgid "Could not establish connection to server." +msgstr "" + +msgid "Secure connection setup failed." +msgstr "" + +msgid "" +"A network error occured, or the server closed the connection unexpectedly." +msgstr "" + +msgid "Server sent bad data." +msgstr "" + +msgid "No URL set." +msgstr "" + +msgid "No or invalid input audio, AVI stream will be corrupt." +msgstr "沒有任何輸入的音效資料或者資料無效,表示 AVI 串流出現錯誤。" + +msgid "This file contains no playable streams." +msgstr "" + +msgid "This file is invalid and cannot be played." +msgstr "" + +msgid "This file is corrupt and cannot be played." +msgstr "" + +msgid "Invalid atom size." +msgstr "" + +msgid "This file is incomplete and cannot be played." +msgstr "" + +msgid "The video in this file might not play correctly." +msgstr "" + +#, c-format +msgid "This file contains too many streams. Only playing first %d" +msgstr "" + +msgid "" +"No supported stream was found. You might need to install a GStreamer RTSP " +"extension plugin for Real media streams." +msgstr "" + +msgid "" +"No supported stream was found. You might need to allow more transport " +"protocols or may otherwise be missing the right GStreamer RTSP extension " +"plugin." +msgstr "" + +#, fuzzy +msgid "Internal data flow error." +msgstr "內部資料串流發生錯誤。" + +msgid "Volume" +msgstr "" + +msgid "Bass" +msgstr "" + +msgid "Treble" +msgstr "" + +msgid "Synth" +msgstr "" + +msgid "PCM" +msgstr "" + +msgid "Speaker" +msgstr "" + +msgid "Line-in" +msgstr "" + +msgid "Microphone" +msgstr "" + +msgid "CD" +msgstr "" + +msgid "Mixer" +msgstr "" + +msgid "PCM-2" +msgstr "" + +msgid "Record" +msgstr "" + +msgid "In-gain" +msgstr "" + +msgid "Out-gain" +msgstr "" + +msgid "Line-1" +msgstr "" + +msgid "Line-2" +msgstr "" + +msgid "Line-3" +msgstr "" + +msgid "Digital-1" +msgstr "" + +msgid "Digital-2" +msgstr "" + +msgid "Digital-3" +msgstr "" + +msgid "Phone-in" +msgstr "" + +msgid "Phone-out" +msgstr "" + +msgid "Video" +msgstr "" + +msgid "Radio" +msgstr "" + +msgid "Monitor" +msgstr "" + +msgid "" +"Could not open audio device for playback. Device is being used by another " +"application." +msgstr "" + +msgid "" +"Could not open audio device for playback. You don't have permission to open " +"the device." +msgstr "" + +msgid "Could not open audio device for playback." +msgstr "" + +msgid "" +"Could not open audio device for recording. You don't have permission to open " +"the device." +msgstr "" + +msgid "Could not open audio device for recording." +msgstr "" + +msgid "Could not open audio device for mixer control handling." +msgstr "无法打开音频文件进行混音控制操作。" + +msgid "" +"Could not open audio device for mixer control handling. This version of the " +"Open Sound System is not supported by this element." +msgstr "" +"无法打开音频设备进行音量控制操作。此部件不支持开放声音系统(OSS)的版本。" + +msgid "Master" +msgstr "主声道" + +msgid "Front" +msgstr "前置声道" + +msgid "Rear" +msgstr "后置声道" + +msgid "Headphones" +msgstr "头戴式耳机" + +msgid "Center" +msgstr "中置" + +msgid "LFE" +msgstr "低音炮" + +msgid "Surround" +msgstr "立体声环绕" + +msgid "Side" +msgstr "左右声道" + +msgid "Built-in Speaker" +msgstr "" + +msgid "AUX 1 Out" +msgstr "" + +msgid "AUX 2 Out" +msgstr "" + +msgid "AUX Out" +msgstr "AUX 输出" + +msgid "3D Depth" +msgstr "3D Depth" + +msgid "3D Center" +msgstr "3D Center" + +msgid "3D Enhance" +msgstr "3D Enhance" + +msgid "Telephone" +msgstr "话筒" + +msgid "Line Out" +msgstr "" + +msgid "Line In" +msgstr "线路输入" + +msgid "Internal CD" +msgstr "内部 CD 音频" + +msgid "Video In" +msgstr "视频输入" + +msgid "AUX 1 In" +msgstr "AUX 1 输入" + +msgid "AUX 2 In" +msgstr "AUX 2 输入" + +msgid "AUX In" +msgstr "AUX 输入" + +msgid "Record Gain" +msgstr "录音增益" + +msgid "Output Gain" +msgstr "输出增益" + +msgid "Microphone Boost" +msgstr "麦克风增益" + +msgid "Loopback" +msgstr "Loopback" + +#, fuzzy +msgid "Diagnostic" +msgstr "采样分析" + +msgid "Bass Boost" +msgstr "Bass 增益" + +msgid "Playback Ports" +msgstr "回放端口" + +msgid "Input" +msgstr "输入" + +msgid "Record Source" +msgstr "录音来源" + +msgid "Monitor Source" +msgstr "监视器来源" + +msgid "Keyboard Beep" +msgstr "按键声音" + +msgid "Simulate Stereo" +msgstr "模拟立体声" + +msgid "Stereo" +msgstr "立体声" + +msgid "Surround Sound" +msgstr "立体声环绕" + +msgid "Microphone Gain" +msgstr "麦克风增益" + +msgid "Speaker Source" +msgstr "扬声器音源" + +msgid "Microphone Source" +msgstr "麦克风音源" + +msgid "Jack" +msgstr "Jack" + +msgid "Center / LFE" +msgstr "中置/低音炮" + +msgid "Stereo Mix" +msgstr "立体声" + +msgid "Mono Mix" +msgstr "单声道" + +msgid "Input Mix" +msgstr "混音输入" + +msgid "SPDIF In" +msgstr "SPDIF 输入" + +msgid "SPDIF Out" +msgstr "" + +msgid "Microphone 1" +msgstr "麦克风 1" + +msgid "Microphone 2" +msgstr "麦克风 2" + +msgid "Digital Out" +msgstr "数字输出" + +msgid "Digital In" +msgstr "数字输入" + +msgid "HDMI" +msgstr "HDMI(高清)" + +msgid "Modem" +msgstr "Modem" + +msgid "Handset" +msgstr "手持设备" + +msgid "Other" +msgstr "其它设备" + +msgid "None" +msgstr "无" + +msgid "On" +msgstr "开" + +msgid "Off" +msgstr "关" + +msgid "Mute" +msgstr "静音" + +msgid "Fast" +msgstr "快" + +#. TRANSLATORS: "Very Low" is a quality setting here +msgid "Very Low" +msgstr "很慢" + +#. TRANSLATORS: "Low" is a quality setting here +msgid "Low" +msgstr "慢" + +#. TRANSLATORS: "Medium" is a quality setting here +msgid "Medium" +msgstr "中等" + +#. TRANSLATORS: "High" is a quality setting here +msgid "High" +msgstr "高" + +#. TRANSLATORS: "Very High" is a quality setting here +msgid "Very High" +msgstr "很高" + +#. TRANSLATORS: "Production" is a quality setting here +msgid "Production" +msgstr "生产商" + +msgid "Front Panel Microphone" +msgstr "麦克风面板" + +msgid "Front Panel Line In" +msgstr "线路输入面板" + +msgid "Front Panel Headphones" +msgstr "头戴式耳机面板" + +msgid "Front Panel Line Out" +msgstr "线路输出面板" + +#, fuzzy +msgid "Green Connector" +msgstr "线路输出" + +#, fuzzy +msgid "Pink Connector" +msgstr "话筒输出" + +#, fuzzy +msgid "Blue Connector" +msgstr "立体声输入" + +#, fuzzy +msgid "White Connector" +msgstr "左/单声道" + +#, fuzzy +msgid "Black Connector" +msgstr "后置声道输出" + +#, fuzzy +msgid "Gray Connector" +msgstr "中置声道输出" + +#, fuzzy +msgid "Orange Connector" +msgstr "低音炮输出" + +#, fuzzy +msgid "Red Connector" +msgstr "右声道" + +#, fuzzy +msgid "Yellow Connector" +msgstr "Midi 输出/游戏摇杆" + +#, fuzzy +msgid "Green Front Panel Connector" +msgstr "线路输出面板" + +#, fuzzy +msgid "Pink Front Panel Connector" +msgstr "话筒输出面板" + +#, fuzzy +msgid "Blue Front Panel Connector" +msgstr "立体声输入面板" + +#, fuzzy +msgid "White Front Panel Connector" +msgstr "左/单声道面板" + +#, fuzzy +msgid "Black Front Panel Connector" +msgstr "后置声道输出面板" + +#, fuzzy +msgid "Gray Front Panel Connector" +msgstr "中置声道输出面板" + +#, fuzzy +msgid "Orange Front Panel Connector" +msgstr "低音炮输出面板" + +#, fuzzy +msgid "Red Front Panel Connector" +msgstr "右声道面板" + +#, fuzzy +msgid "Yellow Front Panel Connector" +msgstr "Midi 输出/游戏摇杆面板" + +msgid "Spread Output" +msgstr "Spread 输出" + +msgid "Downmix" +msgstr "Downmix" + +msgid "Virtual Mixer Input" +msgstr "模拟混音输入" + +#, fuzzy +msgid "Virtual Mixer Output" +msgstr "模拟混音输出" + +msgid "Virtual Mixer Channels" +msgstr "模拟混音输入" + +#. TRANSLATORS: name + number of a volume mixer control +#, fuzzy, c-format +msgid "%s %d Function" +msgstr "%s 功能" + +#. TRANSLATORS: name of a volume mixer control +#, c-format +msgid "%s Function" +msgstr "%s 功能" + +msgid "" +"Could not open audio device for playback. This version of the Open Sound " +"System is not supported by this element." +msgstr "无法打开音频设备播放音频。此组件不支持开放声音系统(OSS)版本。" + +msgid "Playback is not supported by this audio device." +msgstr "此音频设备不支持音频播放。" + +msgid "Audio playback error." +msgstr "音频播放错误。" + +msgid "Recording is not supported by this audio device." +msgstr "此音频设备不支持录音。" + +msgid "Error recording from audio device." +msgstr "从音频设备录音时发生错误。" + +msgid "Gain" +msgstr "" + +msgid "Headphone" +msgstr "" + +#, c-format +msgid "Error reading %d bytes from device '%s'." +msgstr "" + +#, c-format +msgid "Got unexpected frame size of %u instead of %u." +msgstr "" + +#, c-format +msgid "Error reading %d bytes on device '%s'." +msgstr "" + +#, c-format +msgid "" +"Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " +"it is a v4l1 driver." +msgstr "" + +#, c-format +msgid "Failed to query attributes of input %d in device %s" +msgstr "" + +#, c-format +msgid "Failed to get setting of tuner %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to query norm on device '%s'." +msgstr "" + +#, c-format +msgid "Failed getting controls attributes on device '%s'." +msgstr "" + +#, c-format +msgid "Cannot identify device '%s'." +msgstr "" + +#, c-format +msgid "This isn't a device '%s'." +msgstr "" + +#, c-format +msgid "Could not open device '%s' for reading and writing." +msgstr "" + +#, c-format +msgid "Device '%s' is not a capture device." +msgstr "" + +#, c-format +msgid "Device '%s' is not a output device." +msgstr "" + +#, c-format +msgid "Failed to set norm for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get current tuner frequency for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." +msgstr "" + +#, c-format +msgid "Failed to get signal strength for device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get value for control %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to set value %d for control %d on device '%s'." +msgstr "" + +#, c-format +msgid "Failed to get current input on device '%s'. May be it is a radio device" +msgstr "" + +#, c-format +msgid "Failed to set input %d on device %s." +msgstr "" + +#, c-format +msgid "" +"Failed to get current output on device '%s'. May be it is a radio device" +msgstr "" + +#, c-format +msgid "Failed to set output %d on device %s." +msgstr "" + +#, c-format +msgid "Could not enqueue buffers in device '%s'." +msgstr "" + +#, c-format +msgid "Failed trying to get video frames from device '%s'." +msgstr "" + +#, c-format +msgid "Failed after %d tries. device %s. system error: %s" +msgstr "" + +#, c-format +msgid "Could not get parameters on device '%s'" +msgstr "" + +msgid "Video input device did not accept new frame rate setting." +msgstr "" + +#, c-format +msgid "Could not map buffers from device '%s'" +msgstr "" + +#, c-format +msgid "The driver of device '%s' does not support any known capture method." +msgstr "" + +msgid "Changing resolution at runtime is not yet supported." +msgstr "" + +msgid "Cannot operate without a clock" +msgstr "" diff --git a/sys/Makefile.am b/sys/Makefile.am new file mode 100644 index 0000000..ab08d04 --- /dev/null +++ b/sys/Makefile.am @@ -0,0 +1,84 @@ +# if USE_DXR3 +# DXR3_DIR=dxr3 +# else +# DXR3_DIR= +# endif + +if USE_OSS +OSS_DIR=oss +else +OSS_DIR= +endif + +if USE_OSS4 +OSS4_DIR=oss4 +else +OSS4_DIR= +endif + + +if USE_DIRECTSOUND +DIRECTSOUND_DIR=directsound +else +DIRECTSOUND_DIR= +endif + +if USE_SUNAUDIO +SUNAUDIO_DIR=sunaudio +else +SUNAUDIO_DIR= +endif + +if USE_OSX_AUDIO +OSX_AUDIO_DIR=osxaudio +else +OSX_AUDIO_DIR= +endif + +if USE_OSX_VIDEO +OSX_VIDEO_DIR=osxvideo +else +OSX_VIDEO_DIR= +endif + +# if USE_QCAM +# QCAM_DIR=qcam +# else +# QCAM_DIR= +# endif + +if USE_GST_V4L2 +V4L2_DIR=v4l2 +else +V4L2_DIR= +endif + +# if USE_VCD +# VCD_DIR=vcd +# else +# VCD_DIR= +# endif + +# if USE_CDROM +# CDROM_DIR=cdrom +# else +# CDROM_DIR= +# endif + +# if USE_OPENGL +# GL_DIR=glsink +# else +# GL_DIR= +# endif + +if USE_X +XIMAGE_DIR=ximage +else +XIMAGE_DIR= +endif + +SUBDIRS=$(DIRECTSOUND_DIR) $(OSS_DIR) $(OSS4_DIR) $(OSX_AUDIO_DIR) $(OSX_VIDEO_DIR) $(SUNAUDIO_DIR) $(V4L2_DIR) $(XIMAGE_DIR) + +DIST_SUBDIRS=directsound oss oss4 osxaudio osxvideo sunaudio v4l2 waveform ximage + +include $(top_srcdir)/common/parallel-subdirs.mak diff --git a/sys/Makefile.in b/sys/Makefile.in new file mode 100644 index 0000000..c37f1df --- /dev/null +++ b/sys/Makefile.in @@ -0,0 +1,869 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# if USE_DXR3 +# DXR3_DIR=dxr3 +# else +# DXR3_DIR= +# endif + +# include this at the end of $MODULE/ext/Makefile.am to force make to +# build subdirectories in parallel when make -jN is used. We will end up +# descending into all subdirectories a second time, but only after the first +# (parallel) run has finished, so it should go right through the second time. +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/common/parallel-subdirs.mak +subdir = sys +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@USE_OSS_FALSE@OSS_DIR = +@USE_OSS_TRUE@OSS_DIR = oss +@USE_OSS4_FALSE@OSS4_DIR = +@USE_OSS4_TRUE@OSS4_DIR = oss4 +@USE_DIRECTSOUND_FALSE@DIRECTSOUND_DIR = +@USE_DIRECTSOUND_TRUE@DIRECTSOUND_DIR = directsound +@USE_SUNAUDIO_FALSE@SUNAUDIO_DIR = +@USE_SUNAUDIO_TRUE@SUNAUDIO_DIR = sunaudio +@USE_OSX_AUDIO_FALSE@OSX_AUDIO_DIR = +@USE_OSX_AUDIO_TRUE@OSX_AUDIO_DIR = osxaudio +@USE_OSX_VIDEO_FALSE@OSX_VIDEO_DIR = +@USE_OSX_VIDEO_TRUE@OSX_VIDEO_DIR = osxvideo +@USE_GST_V4L2_FALSE@V4L2_DIR = + +# if USE_QCAM +# QCAM_DIR=qcam +# else +# QCAM_DIR= +# endif +@USE_GST_V4L2_TRUE@V4L2_DIR = v4l2 +@USE_X_FALSE@XIMAGE_DIR = + +# if USE_VCD +# VCD_DIR=vcd +# else +# VCD_DIR= +# endif + +# if USE_CDROM +# CDROM_DIR=cdrom +# else +# CDROM_DIR= +# endif + +# if USE_OPENGL +# GL_DIR=glsink +# else +# GL_DIR= +# endif +@USE_X_TRUE@XIMAGE_DIR = ximage +SUBDIRS = $(DIRECTSOUND_DIR) $(OSS_DIR) $(OSS4_DIR) $(OSX_AUDIO_DIR) $(OSX_VIDEO_DIR) $(SUNAUDIO_DIR) $(V4L2_DIR) $(XIMAGE_DIR) +DIST_SUBDIRS = directsound oss oss4 osxaudio osxvideo sunaudio v4l2 waveform ximage +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/parallel-subdirs.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/parallel-subdirs.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +.PHONY: independent-subdirs $(SUBDIRS) + +independent-subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@ + +all-recursive: independent-subdirs + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/directsound/Makefile.am b/sys/directsound/Makefile.am new file mode 100644 index 0000000..8227905 --- /dev/null +++ b/sys/directsound/Makefile.am @@ -0,0 +1,18 @@ +plugin_LTLIBRARIES = libgstdirectsoundsink.la + +libgstdirectsoundsink_la_SOURCES = gstdirectsoundsink.c gstdirectsoundplugin.c +libgstdirectsoundsink_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(DIRECTSOUND_CFLAGS) +libgstdirectsoundsink_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(DIRECTSOUND_LIBS) +libgstdirectsoundsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS) +libgstdirectsoundsink_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstdirectsoundsink.h diff --git a/sys/directsound/Makefile.in b/sys/directsound/Makefile.in new file mode 100644 index 0000000..94cbb01 --- /dev/null +++ b/sys/directsound/Makefile.in @@ -0,0 +1,828 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = sys/directsound +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstdirectsoundsink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstdirectsoundsink_la_OBJECTS = \ + libgstdirectsoundsink_la-gstdirectsoundsink.lo \ + libgstdirectsoundsink_la-gstdirectsoundplugin.lo +libgstdirectsoundsink_la_OBJECTS = \ + $(am_libgstdirectsoundsink_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstdirectsoundsink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstdirectsoundsink_la_CFLAGS) \ + $(CFLAGS) $(libgstdirectsoundsink_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstdirectsoundsink_la_SOURCES) +DIST_SOURCES = $(libgstdirectsoundsink_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstdirectsoundsink.la +libgstdirectsoundsink_la_SOURCES = gstdirectsoundsink.c gstdirectsoundplugin.c +libgstdirectsoundsink_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(DIRECTSOUND_CFLAGS) + +libgstdirectsoundsink_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(DIRECTSOUND_LIBS) + +libgstdirectsoundsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS) +libgstdirectsoundsink_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstdirectsoundsink.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/directsound/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/directsound/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstdirectsoundsink.la: $(libgstdirectsoundsink_la_OBJECTS) $(libgstdirectsoundsink_la_DEPENDENCIES) $(EXTRA_libgstdirectsoundsink_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstdirectsoundsink_la_LINK) -rpath $(plugindir) $(libgstdirectsoundsink_la_OBJECTS) $(libgstdirectsoundsink_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundplugin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundsink.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstdirectsoundsink_la-gstdirectsoundsink.lo: gstdirectsoundsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdirectsoundsink_la_CFLAGS) $(CFLAGS) -MT libgstdirectsoundsink_la-gstdirectsoundsink.lo -MD -MP -MF $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundsink.Tpo -c -o libgstdirectsoundsink_la-gstdirectsoundsink.lo `test -f 'gstdirectsoundsink.c' || echo '$(srcdir)/'`gstdirectsoundsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundsink.Tpo $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdirectsoundsink.c' object='libgstdirectsoundsink_la-gstdirectsoundsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdirectsoundsink_la_CFLAGS) $(CFLAGS) -c -o libgstdirectsoundsink_la-gstdirectsoundsink.lo `test -f 'gstdirectsoundsink.c' || echo '$(srcdir)/'`gstdirectsoundsink.c + +libgstdirectsoundsink_la-gstdirectsoundplugin.lo: gstdirectsoundplugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdirectsoundsink_la_CFLAGS) $(CFLAGS) -MT libgstdirectsoundsink_la-gstdirectsoundplugin.lo -MD -MP -MF $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundplugin.Tpo -c -o libgstdirectsoundsink_la-gstdirectsoundplugin.lo `test -f 'gstdirectsoundplugin.c' || echo '$(srcdir)/'`gstdirectsoundplugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundplugin.Tpo $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundplugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdirectsoundplugin.c' object='libgstdirectsoundsink_la-gstdirectsoundplugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdirectsoundsink_la_CFLAGS) $(CFLAGS) -c -o libgstdirectsoundsink_la-gstdirectsoundplugin.lo `test -f 'gstdirectsoundplugin.c' || echo '$(srcdir)/'`gstdirectsoundplugin.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/directsound/gstdirectsoundplugin.c b/sys/directsound/gstdirectsoundplugin.c new file mode 100644 index 0000000..1af665a --- /dev/null +++ b/sys/directsound/gstdirectsoundplugin.c @@ -0,0 +1,49 @@ +/* GStreamer +* Copyright (C) 2005 Sebastien Moutte +* Copyright (C) 2007 Pioneers of the Inevitable +* +* gstdirectsoundplugin.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 "gstdirectsoundsink.h" + + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "directsoundsink", GST_RANK_PRIMARY, + GST_TYPE_DIRECTSOUND_SINK)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "directsound", + "Direct Sound plugin library", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/directsound/gstdirectsoundsink.c b/sys/directsound/gstdirectsoundsink.c new file mode 100644 index 0000000..2f9a04c --- /dev/null +++ b/sys/directsound/gstdirectsoundsink.c @@ -0,0 +1,785 @@ +/* GStreamer +* Copyright (C) 2005 Sebastien Moutte +* Copyright (C) 2007 Pioneers of the Inevitable +* Copyright (C) 2010 Fluendo S.A. +* +* gstdirectsoundsink.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 +* +*/ + +/** + * SECTION:element-directsoundsink + * + * This element lets you output sound using the DirectSound API. + * + * Note that you should almost always use generic audio conversion elements + * like audioconvert and audioresample in front of an audiosink to make sure + * your pipeline works under all circumstances (those conversion elements will + * act in passthrough-mode if no conversion is necessary). + * + * + * Example pipelines + * |[ + * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.1 ! directsoundsink + * ]| will output a sine wave (continuous beep sound) to your sound card (with + * a very low volume as precaution). + * |[ + * gst-launch -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! directsoundsink + * ]| will play an Ogg/Vorbis audio file and output it. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstdirectsoundsink.h" + +#include + +#ifdef __CYGWIN__ +#include +#ifndef _swab +#define _swab swab +#endif +#endif + +GST_DEBUG_CATEGORY_STATIC (directsoundsink_debug); +#define GST_CAT_DEFAULT directsoundsink_debug + +static void gst_directsound_sink_finalise (GObject * object); + +static void gst_directsound_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_directsound_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_directsound_sink_getcaps (GstBaseSink * bsink); +static gboolean gst_directsound_sink_prepare (GstAudioSink * asink, + GstRingBufferSpec * spec); +static gboolean gst_directsound_sink_unprepare (GstAudioSink * asink); + +static gboolean gst_directsound_sink_open (GstAudioSink * asink); +static gboolean gst_directsound_sink_close (GstAudioSink * asink); +static guint gst_directsound_sink_write (GstAudioSink * asink, gpointer data, + guint length); +static guint gst_directsound_sink_delay (GstAudioSink * asink); +static void gst_directsound_sink_reset (GstAudioSink * asink); +static GstCaps *gst_directsound_probe_supported_formats (GstDirectSoundSink * + dsoundsink, const GstCaps * template_caps); + +/* interfaces */ +static void gst_directsound_sink_interfaces_init (GType type); +static void +gst_directsound_sink_implements_interface_init (GstImplementsInterfaceClass * + iface); +static void gst_directsound_sink_mixer_interface_init (GstMixerClass * iface); + +static GstStaticPadTemplate directsoundsink_sink_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " + "audio/x-raw-int, " + "signed = (boolean) FALSE, " + "width = (int) 8, " + "depth = (int) 8, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ];" + "audio/x-iec958")); + +enum +{ + PROP_0, + PROP_VOLUME +}; + +GST_BOILERPLATE_FULL (GstDirectSoundSink, gst_directsound_sink, GstAudioSink, + GST_TYPE_AUDIO_SINK, gst_directsound_sink_interfaces_init); + +/* interfaces stuff */ +static void +gst_directsound_sink_interfaces_init (GType type) +{ + static const GInterfaceInfo implements_interface_info = { + (GInterfaceInitFunc) gst_directsound_sink_implements_interface_init, + NULL, + NULL, + }; + + static const GInterfaceInfo mixer_interface_info = { + (GInterfaceInitFunc) gst_directsound_sink_mixer_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, + GST_TYPE_IMPLEMENTS_INTERFACE, &implements_interface_info); + g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_interface_info); +} + +static gboolean +gst_directsound_sink_interface_supported (GstImplementsInterface * iface, + GType iface_type) +{ + g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE); + + /* for the sake of this example, we'll always support it. However, normally, + * you would check whether the device you've opened supports mixers. */ + return TRUE; +} + +static void +gst_directsound_sink_implements_interface_init (GstImplementsInterfaceClass * + iface) +{ + iface->supported = gst_directsound_sink_interface_supported; +} + +/* + * This function returns the list of support tracks (inputs, outputs) + * on this element instance. Elements usually build this list during + * _init () or when going from NULL to READY. + */ + +static const GList * +gst_directsound_sink_mixer_list_tracks (GstMixer * mixer) +{ + GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); + + return dsoundsink->tracks; +} + +static void +gst_directsound_sink_set_volume (GstDirectSoundSink * dsoundsink) +{ + if (dsoundsink->pDSBSecondary) { + /* DirectSound controls volume using units of 100th of a decibel, + * ranging from -10000 to 0. We use a linear scale of 0 - 100 + * here, so remap. + */ + long dsVolume; + if (dsoundsink->volume == 0) + dsVolume = -10000; + else + dsVolume = 100 * (long) (20 * log10 ((double) dsoundsink->volume / 100.)); + dsVolume = CLAMP (dsVolume, -10000, 0); + + GST_DEBUG_OBJECT (dsoundsink, + "Setting volume on secondary buffer to %d from %d", (int) dsVolume, + (int) dsoundsink->volume); + IDirectSoundBuffer_SetVolume (dsoundsink->pDSBSecondary, dsVolume); + } +} + +/* + * Set volume. volumes is an array of size track->num_channels, and + * each value in the array gives the wanted volume for one channel + * on the track. + */ + +static void +gst_directsound_sink_mixer_set_volume (GstMixer * mixer, + GstMixerTrack * track, gint * volumes) +{ + GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); + + if (volumes[0] != dsoundsink->volume) { + dsoundsink->volume = volumes[0]; + + gst_directsound_sink_set_volume (dsoundsink); + } +} + +static void +gst_directsound_sink_mixer_get_volume (GstMixer * mixer, + GstMixerTrack * track, gint * volumes) +{ + GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); + + volumes[0] = dsoundsink->volume; +} + +static void +gst_directsound_sink_mixer_interface_init (GstMixerClass * iface) +{ + /* the mixer interface requires a definition of the mixer type: + * hardware or software? */ + GST_MIXER_TYPE (iface) = GST_MIXER_SOFTWARE; + + /* virtual function pointers */ + iface->list_tracks = gst_directsound_sink_mixer_list_tracks; + iface->set_volume = gst_directsound_sink_mixer_set_volume; + iface->get_volume = gst_directsound_sink_mixer_get_volume; +} + +static void +gst_directsound_sink_finalise (GObject * object) +{ + GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (object); + + g_mutex_free (dsoundsink->dsound_lock); + + if (dsoundsink->tracks) { + g_list_foreach (dsoundsink->tracks, (GFunc) g_object_unref, NULL); + g_list_free (dsoundsink->tracks); + dsoundsink->tracks = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_directsound_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "Direct Sound Audio Sink", "Sink/Audio", + "Output to a sound card via Direct Sound", + "Sebastien Moutte "); + gst_element_class_add_static_pad_template (element_class, + &directsoundsink_sink_factory); +} + +static void +gst_directsound_sink_class_init (GstDirectSoundSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + GstBaseAudioSinkClass *gstbaseaudiosink_class; + GstAudioSinkClass *gstaudiosink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; + gstaudiosink_class = (GstAudioSinkClass *) klass; + + GST_DEBUG_CATEGORY_INIT (directsoundsink_debug, "directsoundsink", 0, + "DirectSound sink"); + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_directsound_sink_finalise; + gobject_class->set_property = gst_directsound_sink_set_property; + gobject_class->get_property = gst_directsound_sink_get_property; + + gstbasesink_class->get_caps = + GST_DEBUG_FUNCPTR (gst_directsound_sink_getcaps); + + gstaudiosink_class->prepare = + GST_DEBUG_FUNCPTR (gst_directsound_sink_prepare); + gstaudiosink_class->unprepare = + GST_DEBUG_FUNCPTR (gst_directsound_sink_unprepare); + gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_directsound_sink_open); + gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_directsound_sink_close); + gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_directsound_sink_write); + gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_directsound_sink_delay); + gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_directsound_sink_reset); + + g_object_class_install_property (gobject_class, + PROP_VOLUME, + g_param_spec_double ("volume", "Volume", + "Volume of this stream", 0.0, 1.0, 1.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_directsound_sink_init (GstDirectSoundSink * dsoundsink, + GstDirectSoundSinkClass * g_class) +{ + GstMixerTrack *track = NULL; + + dsoundsink->tracks = NULL; + track = g_object_new (GST_TYPE_MIXER_TRACK, NULL); + track->label = g_strdup ("DSoundTrack"); + track->num_channels = 2; + track->min_volume = 0; + track->max_volume = 100; + track->flags = GST_MIXER_TRACK_OUTPUT; + dsoundsink->tracks = g_list_append (dsoundsink->tracks, track); + + dsoundsink->pDS = NULL; + dsoundsink->cached_caps = NULL; + dsoundsink->pDSBSecondary = NULL; + dsoundsink->current_circular_offset = 0; + dsoundsink->buffer_size = DSBSIZE_MIN; + dsoundsink->volume = 100; + dsoundsink->dsound_lock = g_mutex_new (); + dsoundsink->first_buffer_after_reset = FALSE; +} + +static void +gst_directsound_sink_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstDirectSoundSink *sink = GST_DIRECTSOUND_SINK (object); + + switch (prop_id) { + case PROP_VOLUME: + sink->volume = (int) (g_value_get_double (value) * 100); + gst_directsound_sink_set_volume (sink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_directsound_sink_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstDirectSoundSink *sink = GST_DIRECTSOUND_SINK (object); + + switch (prop_id) { + case PROP_VOLUME: + g_value_set_double (value, (double) sink->volume / 100.); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_directsound_sink_getcaps (GstBaseSink * bsink) +{ + GstElementClass *element_class; + GstPadTemplate *pad_template; + GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (bsink); + GstCaps *caps; + gchar *caps_string = NULL; + + if (dsoundsink->pDS == NULL) { + GST_DEBUG_OBJECT (dsoundsink, "device not open, using template caps"); + return NULL; /* base class will get template caps for us */ + } + + if (dsoundsink->cached_caps) { + caps_string = gst_caps_to_string (dsoundsink->cached_caps); + GST_DEBUG_OBJECT (dsoundsink, "Returning cached caps: %s", caps_string); + g_free (caps_string); + return gst_caps_ref (dsoundsink->cached_caps); + } + + element_class = GST_ELEMENT_GET_CLASS (dsoundsink); + pad_template = gst_element_class_get_pad_template (element_class, "sink"); + g_return_val_if_fail (pad_template != NULL, NULL); + + caps = gst_directsound_probe_supported_formats (dsoundsink, + gst_pad_template_get_caps (pad_template)); + if (caps) { + dsoundsink->cached_caps = gst_caps_ref (caps); + } + + if (caps) { + gchar *caps_string = gst_caps_to_string (caps); + GST_DEBUG_OBJECT (dsoundsink, "returning caps %s", caps_string); + g_free (caps_string); + } + + return caps; +} + +static gboolean +gst_directsound_sink_open (GstAudioSink * asink) +{ + GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (asink); + HRESULT hRes; + + /* create and initialize a DirecSound object */ + if (FAILED (hRes = DirectSoundCreate (NULL, &dsoundsink->pDS, NULL))) { + GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, + ("gst_directsound_sink_open: DirectSoundCreate: %s", + DXGetErrorString9 (hRes)), (NULL)); + return FALSE; + } + + if (FAILED (hRes = IDirectSound_SetCooperativeLevel (dsoundsink->pDS, + GetDesktopWindow (), DSSCL_PRIORITY))) { + GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, + ("gst_directsound_sink_open: IDirectSound_SetCooperativeLevel: %s", + DXGetErrorString9 (hRes)), (NULL)); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_directsound_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) +{ + GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (asink); + HRESULT hRes; + DSBUFFERDESC descSecondary; + WAVEFORMATEX wfx; + + /*save number of bytes per sample and buffer format */ + dsoundsink->bytes_per_sample = spec->bytes_per_sample; + dsoundsink->buffer_format = spec->format; + + /* fill the WAVEFORMATEX structure with spec params */ + memset (&wfx, 0, sizeof (wfx)); + if (spec->format != GST_IEC958) { + wfx.cbSize = sizeof (wfx); + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.nChannels = spec->channels; + wfx.nSamplesPerSec = spec->rate; + wfx.wBitsPerSample = (spec->bytes_per_sample * 8) / wfx.nChannels; + wfx.nBlockAlign = spec->bytes_per_sample; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + + /* Create directsound buffer with size based on our configured + * buffer_size (which is 200 ms by default) */ + dsoundsink->buffer_size = + gst_util_uint64_scale_int (wfx.nAvgBytesPerSec, spec->buffer_time, + GST_MSECOND); + /* Make sure we make those numbers multiple of our sample size in bytes */ + dsoundsink->buffer_size += dsoundsink->buffer_size % spec->bytes_per_sample; + + spec->segsize = + gst_util_uint64_scale_int (wfx.nAvgBytesPerSec, spec->latency_time, + GST_MSECOND); + spec->segsize += spec->segsize % spec->bytes_per_sample; + spec->segtotal = dsoundsink->buffer_size / spec->segsize; + } else { +#ifdef WAVE_FORMAT_DOLBY_AC3_SPDIF + wfx.cbSize = 0; + wfx.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF; + wfx.nChannels = 2; + wfx.nSamplesPerSec = spec->rate; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.wBitsPerSample / 8 * wfx.nChannels; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + + spec->segsize = 6144; + spec->segtotal = 10; +#else + g_assert_not_reached (); +#endif + } + + // Make the final buffer size be an integer number of segments + dsoundsink->buffer_size = spec->segsize * spec->segtotal; + + GST_INFO_OBJECT (dsoundsink, + "GstRingBufferSpec->channels: %d, GstRingBufferSpec->rate: %d, GstRingBufferSpec->bytes_per_sample: %d\n" + "WAVEFORMATEX.nSamplesPerSec: %ld, WAVEFORMATEX.wBitsPerSample: %d, WAVEFORMATEX.nBlockAlign: %d, WAVEFORMATEX.nAvgBytesPerSec: %ld\n" + "Size of dsound circular buffer=>%d\n", spec->channels, spec->rate, + spec->bytes_per_sample, wfx.nSamplesPerSec, wfx.wBitsPerSample, + wfx.nBlockAlign, wfx.nAvgBytesPerSec, dsoundsink->buffer_size); + + /* create a secondary directsound buffer */ + memset (&descSecondary, 0, sizeof (DSBUFFERDESC)); + descSecondary.dwSize = sizeof (DSBUFFERDESC); + descSecondary.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS; + if (spec->format != GST_IEC958) + descSecondary.dwFlags |= DSBCAPS_CTRLVOLUME; + + descSecondary.dwBufferBytes = dsoundsink->buffer_size; + descSecondary.lpwfxFormat = (WAVEFORMATEX *) & wfx; + + hRes = IDirectSound_CreateSoundBuffer (dsoundsink->pDS, &descSecondary, + &dsoundsink->pDSBSecondary, NULL); + if (FAILED (hRes)) { + GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, + ("gst_directsound_sink_prepare: IDirectSound_CreateSoundBuffer: %s", + DXGetErrorString9 (hRes)), (NULL)); + return FALSE; + } + + gst_directsound_sink_set_volume (dsoundsink); + + return TRUE; +} + +static gboolean +gst_directsound_sink_unprepare (GstAudioSink * asink) +{ + GstDirectSoundSink *dsoundsink; + + dsoundsink = GST_DIRECTSOUND_SINK (asink); + + /* release secondary DirectSound buffer */ + if (dsoundsink->pDSBSecondary) { + IDirectSoundBuffer_Release (dsoundsink->pDSBSecondary); + dsoundsink->pDSBSecondary = NULL; + } + + return TRUE; +} + +static gboolean +gst_directsound_sink_close (GstAudioSink * asink) +{ + GstDirectSoundSink *dsoundsink = NULL; + + dsoundsink = GST_DIRECTSOUND_SINK (asink); + + /* release DirectSound object */ + g_return_val_if_fail (dsoundsink->pDS != NULL, FALSE); + IDirectSound_Release (dsoundsink->pDS); + dsoundsink->pDS = NULL; + + gst_caps_replace (&dsoundsink->cached_caps, NULL); + + return TRUE; +} + +static guint +gst_directsound_sink_write (GstAudioSink * asink, gpointer data, guint length) +{ + GstDirectSoundSink *dsoundsink; + DWORD dwStatus; + HRESULT hRes; + LPVOID pLockedBuffer1 = NULL, pLockedBuffer2 = NULL; + DWORD dwSizeBuffer1, dwSizeBuffer2; + DWORD dwCurrentPlayCursor; + + dsoundsink = GST_DIRECTSOUND_SINK (asink); + + /* Fix endianness */ + if (dsoundsink->buffer_format == GST_IEC958) + _swab (data, data, length); + + GST_DSOUND_LOCK (dsoundsink); + + /* get current buffer status */ + hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); + + /* get current play cursor position */ + hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, + &dwCurrentPlayCursor, NULL); + + if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING)) { + DWORD dwFreeBufferSize; + + calculate_freesize: + /* calculate the free size of the circular buffer */ + if (dwCurrentPlayCursor < dsoundsink->current_circular_offset) + dwFreeBufferSize = + dsoundsink->buffer_size - (dsoundsink->current_circular_offset - + dwCurrentPlayCursor); + else + dwFreeBufferSize = + dwCurrentPlayCursor - dsoundsink->current_circular_offset; + + if (length >= dwFreeBufferSize) { + Sleep (100); + hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, + &dwCurrentPlayCursor, NULL); + + hRes = + IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); + if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING)) + goto calculate_freesize; + else { + dsoundsink->first_buffer_after_reset = FALSE; + GST_DSOUND_UNLOCK (dsoundsink); + return 0; + } + } + } + + if (dwStatus & DSBSTATUS_BUFFERLOST) { + hRes = IDirectSoundBuffer_Restore (dsoundsink->pDSBSecondary); /*need a loop waiting the buffer is restored?? */ + + dsoundsink->current_circular_offset = 0; + } + + hRes = IDirectSoundBuffer_Lock (dsoundsink->pDSBSecondary, + dsoundsink->current_circular_offset, length, &pLockedBuffer1, + &dwSizeBuffer1, &pLockedBuffer2, &dwSizeBuffer2, 0L); + + if (SUCCEEDED (hRes)) { + // Write to pointers without reordering. + memcpy (pLockedBuffer1, data, dwSizeBuffer1); + if (pLockedBuffer2 != NULL) + memcpy (pLockedBuffer2, (LPBYTE) data + dwSizeBuffer1, dwSizeBuffer2); + + // Update where the buffer will lock (for next time) + dsoundsink->current_circular_offset += dwSizeBuffer1 + dwSizeBuffer2; + dsoundsink->current_circular_offset %= dsoundsink->buffer_size; /* Circular buffer */ + + hRes = IDirectSoundBuffer_Unlock (dsoundsink->pDSBSecondary, pLockedBuffer1, + dwSizeBuffer1, pLockedBuffer2, dwSizeBuffer2); + } + + /* if the buffer was not in playing state yet, call play on the buffer + except if this buffer is the fist after a reset (base class call reset and write a buffer when setting the sink to pause) */ + if (!(dwStatus & DSBSTATUS_PLAYING) && + dsoundsink->first_buffer_after_reset == FALSE) { + hRes = IDirectSoundBuffer_Play (dsoundsink->pDSBSecondary, 0, 0, + DSBPLAY_LOOPING); + } + + dsoundsink->first_buffer_after_reset = FALSE; + + GST_DSOUND_UNLOCK (dsoundsink); + + return length; +} + +static guint +gst_directsound_sink_delay (GstAudioSink * asink) +{ + GstDirectSoundSink *dsoundsink; + HRESULT hRes; + DWORD dwCurrentPlayCursor; + DWORD dwBytesInQueue = 0; + gint nNbSamplesInQueue = 0; + DWORD dwStatus; + + dsoundsink = GST_DIRECTSOUND_SINK (asink); + + /* get current buffer status */ + hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); + + if (dwStatus & DSBSTATUS_PLAYING) { + /*evaluate the number of samples in queue in the circular buffer */ + hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, + &dwCurrentPlayCursor, NULL); + + if (hRes == S_OK) { + if (dwCurrentPlayCursor < dsoundsink->current_circular_offset) + dwBytesInQueue = + dsoundsink->current_circular_offset - dwCurrentPlayCursor; + else + dwBytesInQueue = + dsoundsink->current_circular_offset + (dsoundsink->buffer_size - + dwCurrentPlayCursor); + + nNbSamplesInQueue = dwBytesInQueue / dsoundsink->bytes_per_sample; + } + } + + return nNbSamplesInQueue; +} + +static void +gst_directsound_sink_reset (GstAudioSink * asink) +{ + GstDirectSoundSink *dsoundsink; + LPVOID pLockedBuffer = NULL; + DWORD dwSizeBuffer = 0; + + dsoundsink = GST_DIRECTSOUND_SINK (asink); + + GST_DSOUND_LOCK (dsoundsink); + + if (dsoundsink->pDSBSecondary) { + /*stop playing */ + HRESULT hRes = IDirectSoundBuffer_Stop (dsoundsink->pDSBSecondary); + + /*reset position */ + hRes = IDirectSoundBuffer_SetCurrentPosition (dsoundsink->pDSBSecondary, 0); + dsoundsink->current_circular_offset = 0; + + /*reset the buffer */ + hRes = IDirectSoundBuffer_Lock (dsoundsink->pDSBSecondary, + dsoundsink->current_circular_offset, dsoundsink->buffer_size, + &pLockedBuffer, &dwSizeBuffer, NULL, NULL, 0L); + + if (SUCCEEDED (hRes)) { + memset (pLockedBuffer, 0, dwSizeBuffer); + + hRes = + IDirectSoundBuffer_Unlock (dsoundsink->pDSBSecondary, pLockedBuffer, + dwSizeBuffer, NULL, 0); + } + } + + dsoundsink->first_buffer_after_reset = TRUE; + + GST_DSOUND_UNLOCK (dsoundsink); +} + +/* + * gst_directsound_probe_supported_formats: + * + * Takes the template caps and returns the subset which is actually + * supported by this device. + * + */ + +static GstCaps * +gst_directsound_probe_supported_formats (GstDirectSoundSink * dsoundsink, + const GstCaps * template_caps) +{ + HRESULT hRes; + DSBUFFERDESC descSecondary; + WAVEFORMATEX wfx; + GstCaps *caps; + + caps = gst_caps_copy (template_caps); + + /* + * Check availability of digital output by trying to create an SPDIF buffer + */ + +#ifdef WAVE_FORMAT_DOLBY_AC3_SPDIF + /* fill the WAVEFORMATEX structure with some standard AC3 over SPDIF params */ + memset (&wfx, 0, sizeof (wfx)); + wfx.cbSize = 0; + wfx.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF; + wfx.nChannels = 2; + wfx.nSamplesPerSec = 48000; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = 4; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + + // create a secondary directsound buffer + memset (&descSecondary, 0, sizeof (DSBUFFERDESC)); + descSecondary.dwSize = sizeof (DSBUFFERDESC); + descSecondary.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS; + descSecondary.dwBufferBytes = 6144; + descSecondary.lpwfxFormat = &wfx; + + hRes = IDirectSound_CreateSoundBuffer (dsoundsink->pDS, &descSecondary, + &dsoundsink->pDSBSecondary, NULL); + if (FAILED (hRes)) { + GST_INFO_OBJECT (dsoundsink, "AC3 passthrough not supported " + "(IDirectSound_CreateSoundBuffer returned: %s)\n", + DXGetErrorString9 (hRes)); + caps = + gst_caps_subtract (caps, gst_caps_new_simple ("audio/x-iec958", NULL)); + } else { + GST_INFO_OBJECT (dsoundsink, "AC3 passthrough supported"); + hRes = IDirectSoundBuffer_Release (dsoundsink->pDSBSecondary); + if (FAILED (hRes)) { + GST_DEBUG_OBJECT (dsoundsink, + "(IDirectSoundBuffer_Release returned: %s)\n", + DXGetErrorString9 (hRes)); + } + } +#else + caps = gst_caps_subtract (caps, gst_caps_new_simple ("audio/x-iec958", NULL)); +#endif + + return caps; +} diff --git a/sys/directsound/gstdirectsoundsink.h b/sys/directsound/gstdirectsoundsink.h new file mode 100644 index 0000000..8bb10bf --- /dev/null +++ b/sys/directsound/gstdirectsoundsink.h @@ -0,0 +1,97 @@ +/* GStreamer + * Copyright (C) 2005 Sebastien Moutte + * Copyright (C) 2007 Pioneers of the Inevitable + * Copyright (C) 2010 Fluendo S.A. + * + * gstdirectsoundsink.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * 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_DIRECTSOUNDSINK_H__ +#define __GST_DIRECTSOUNDSINK_H__ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +G_BEGIN_DECLS +#define GST_TYPE_DIRECTSOUND_SINK (gst_directsound_sink_get_type()) +#define GST_DIRECTSOUND_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DIRECTSOUND_SINK,GstDirectSoundSink)) +#define GST_DIRECTSOUND_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DIRECTSOUND_SINK,GstDirectSoundSinkClass)) +#define GST_IS_DIRECTSOUND_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DIRECTSOUND_SINK)) +#define GST_IS_DIRECTSOUND_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DIRECTSOUND_SINK)) +typedef struct _GstDirectSoundSink GstDirectSoundSink; +typedef struct _GstDirectSoundSinkClass GstDirectSoundSinkClass; + +#define GST_DSOUND_LOCK(obj) (g_mutex_lock (obj->dsound_lock)) +#define GST_DSOUND_UNLOCK(obj) (g_mutex_unlock (obj->dsound_lock)) + +struct _GstDirectSoundSink +{ + GstAudioSink sink; + + /* directsound object interface pointer */ + LPDIRECTSOUND pDS; + + /* directsound sound object interface pointer */ + LPDIRECTSOUNDBUFFER pDSBSecondary; + + /* directSound buffer size */ + guint buffer_size; + + /* offset of the circular buffer where we must write next */ + guint current_circular_offset; + + guint bytes_per_sample; + + /* current volume setup by mixer interface */ + glong volume; + + /* tracks list of our mixer interface implementation */ + GList *tracks; + + GstCaps *cached_caps; + + /* lock used to protect writes and resets */ + GMutex *dsound_lock; + + gboolean first_buffer_after_reset; + + GstBufferFormat buffer_format; +}; + +struct _GstDirectSoundSinkClass +{ + GstAudioSinkClass parent_class; +}; + +GType gst_directsound_sink_get_type (void); + +G_END_DECLS +#endif /* __GST_DIRECTSOUNDSINK_H__ */ diff --git a/sys/oss/Makefile.am b/sys/oss/Makefile.am new file mode 100644 index 0000000..c42dfea --- /dev/null +++ b/sys/oss/Makefile.am @@ -0,0 +1,28 @@ +plugin_LTLIBRARIES = libgstossaudio.la + +libgstossaudio_la_SOURCES = gstossaudio.c \ + gstosshelper.c \ + gstossmixer.c \ + gstossmixerelement.c \ + gstossmixertrack.c \ + gstosssink.c \ + gstosssrc.c + +libgstossaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstossaudio_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstinterfaces-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) +libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstossaudio_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = common.h \ + gstosssink.h \ + gstosssrc.h \ + gstosshelper.h \ + gstossdmabuffer.h \ + gstossmixer.h \ + gstossmixerelement.h \ + gstossmixertrack.h diff --git a/sys/oss/Makefile.in b/sys/oss/Makefile.in new file mode 100644 index 0000000..ce15b09 --- /dev/null +++ b/sys/oss/Makefile.in @@ -0,0 +1,879 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = sys/oss +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstossaudio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstossaudio_la_OBJECTS = libgstossaudio_la-gstossaudio.lo \ + libgstossaudio_la-gstosshelper.lo \ + libgstossaudio_la-gstossmixer.lo \ + libgstossaudio_la-gstossmixerelement.lo \ + libgstossaudio_la-gstossmixertrack.lo \ + libgstossaudio_la-gstosssink.lo libgstossaudio_la-gstosssrc.lo +libgstossaudio_la_OBJECTS = $(am_libgstossaudio_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstossaudio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstossaudio_la_CFLAGS) $(CFLAGS) \ + $(libgstossaudio_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstossaudio_la_SOURCES) +DIST_SOURCES = $(libgstossaudio_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstossaudio.la +libgstossaudio_la_SOURCES = gstossaudio.c \ + gstosshelper.c \ + gstossmixer.c \ + gstossmixerelement.c \ + gstossmixertrack.c \ + gstosssink.c \ + gstosssrc.c + +libgstossaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstossaudio_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstinterfaces-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) + +libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstossaudio_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = common.h \ + gstosssink.h \ + gstosssrc.h \ + gstosshelper.h \ + gstossdmabuffer.h \ + gstossmixer.h \ + gstossmixerelement.h \ + gstossmixertrack.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/oss/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/oss/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstossaudio.la: $(libgstossaudio_la_OBJECTS) $(libgstossaudio_la_DEPENDENCIES) $(EXTRA_libgstossaudio_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstossaudio_la_LINK) -rpath $(plugindir) $(libgstossaudio_la_OBJECTS) $(libgstossaudio_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstossaudio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstosshelper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstossmixer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstossmixerelement.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstossmixertrack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstosssink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstosssrc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstossaudio_la-gstossaudio.lo: gstossaudio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstossaudio.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstossaudio.Tpo -c -o libgstossaudio_la-gstossaudio.lo `test -f 'gstossaudio.c' || echo '$(srcdir)/'`gstossaudio.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstossaudio.Tpo $(DEPDIR)/libgstossaudio_la-gstossaudio.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstossaudio.c' object='libgstossaudio_la-gstossaudio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstossaudio.lo `test -f 'gstossaudio.c' || echo '$(srcdir)/'`gstossaudio.c + +libgstossaudio_la-gstosshelper.lo: gstosshelper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstosshelper.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstosshelper.Tpo -c -o libgstossaudio_la-gstosshelper.lo `test -f 'gstosshelper.c' || echo '$(srcdir)/'`gstosshelper.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstosshelper.Tpo $(DEPDIR)/libgstossaudio_la-gstosshelper.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosshelper.c' object='libgstossaudio_la-gstosshelper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstosshelper.lo `test -f 'gstosshelper.c' || echo '$(srcdir)/'`gstosshelper.c + +libgstossaudio_la-gstossmixer.lo: gstossmixer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstossmixer.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstossmixer.Tpo -c -o libgstossaudio_la-gstossmixer.lo `test -f 'gstossmixer.c' || echo '$(srcdir)/'`gstossmixer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstossmixer.Tpo $(DEPDIR)/libgstossaudio_la-gstossmixer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstossmixer.c' object='libgstossaudio_la-gstossmixer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstossmixer.lo `test -f 'gstossmixer.c' || echo '$(srcdir)/'`gstossmixer.c + +libgstossaudio_la-gstossmixerelement.lo: gstossmixerelement.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstossmixerelement.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstossmixerelement.Tpo -c -o libgstossaudio_la-gstossmixerelement.lo `test -f 'gstossmixerelement.c' || echo '$(srcdir)/'`gstossmixerelement.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstossmixerelement.Tpo $(DEPDIR)/libgstossaudio_la-gstossmixerelement.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstossmixerelement.c' object='libgstossaudio_la-gstossmixerelement.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstossmixerelement.lo `test -f 'gstossmixerelement.c' || echo '$(srcdir)/'`gstossmixerelement.c + +libgstossaudio_la-gstossmixertrack.lo: gstossmixertrack.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstossmixertrack.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstossmixertrack.Tpo -c -o libgstossaudio_la-gstossmixertrack.lo `test -f 'gstossmixertrack.c' || echo '$(srcdir)/'`gstossmixertrack.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstossmixertrack.Tpo $(DEPDIR)/libgstossaudio_la-gstossmixertrack.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstossmixertrack.c' object='libgstossaudio_la-gstossmixertrack.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstossmixertrack.lo `test -f 'gstossmixertrack.c' || echo '$(srcdir)/'`gstossmixertrack.c + +libgstossaudio_la-gstosssink.lo: gstosssink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstosssink.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstosssink.Tpo -c -o libgstossaudio_la-gstosssink.lo `test -f 'gstosssink.c' || echo '$(srcdir)/'`gstosssink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstosssink.Tpo $(DEPDIR)/libgstossaudio_la-gstosssink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosssink.c' object='libgstossaudio_la-gstosssink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstosssink.lo `test -f 'gstosssink.c' || echo '$(srcdir)/'`gstosssink.c + +libgstossaudio_la-gstosssrc.lo: gstosssrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstosssrc.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstosssrc.Tpo -c -o libgstossaudio_la-gstosssrc.lo `test -f 'gstosssrc.c' || echo '$(srcdir)/'`gstosssrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstosssrc.Tpo $(DEPDIR)/libgstossaudio_la-gstosssrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosssrc.c' object='libgstossaudio_la-gstosssrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstosssrc.lo `test -f 'gstosssrc.c' || echo '$(srcdir)/'`gstosssrc.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/oss/common.h b/sys/oss/common.h new file mode 100644 index 0000000..2445c3d --- /dev/null +++ b/sys/oss/common.h @@ -0,0 +1,43 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000,2005 Wim Taymans + * + * 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. + */ + +#define SET_PARAM(_oss, _name, _val, _detail) \ +G_STMT_START { \ + int _tmp = _val; \ + if (ioctl(_oss->fd, _name, &_tmp) == -1) { \ + GST_ELEMENT_ERROR (_oss, RESOURCE, SETTINGS,\ + (NULL), \ + ("Unable to set param " _detail ": %s", \ + g_strerror (errno))); \ + return FALSE; \ + } \ + GST_DEBUG_OBJECT(_oss, _detail " %d", _tmp); \ +} G_STMT_END + +#define GET_PARAM(_oss, _name, _val, _detail) \ +G_STMT_START { \ + if (ioctl(oss->fd, _name, _val) == -1) { \ + GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, \ + (NULL), \ + ("Unable to get param " _detail ": %s", \ + g_strerror (errno))); \ + return FALSE; \ + } \ +} G_STMT_END diff --git a/sys/oss/gstossaudio.c b/sys/oss/gstossaudio.c new file mode 100644 index 0000000..2a181e8 --- /dev/null +++ b/sys/oss/gstossaudio.c @@ -0,0 +1,61 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gst/gst-i18n-plugin.h" + +#include "gstossmixerelement.h" +#include "gstosssink.h" +#include "gstosssrc.h" + +GST_DEBUG_CATEGORY (oss_debug); +#define GST_CAT_DEFAULT oss_debug + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "ossmixer", GST_RANK_NONE, + GST_TYPE_OSS_MIXER_ELEMENT) || + !gst_element_register (plugin, "osssrc", GST_RANK_SECONDARY, + GST_TYPE_OSS_SRC) || + !gst_element_register (plugin, "osssink", GST_RANK_SECONDARY, + GST_TYPE_OSSSINK)) { + return FALSE; + } + + GST_DEBUG_CATEGORY_INIT (oss_debug, "oss", 0, "OSS elements"); + +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "ossaudio", + "OSS (Open Sound System) support for GStreamer", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/oss/gstossdmabuffer.h b/sys/oss/gstossdmabuffer.h new file mode 100644 index 0000000..c38ef6f --- /dev/null +++ b/sys/oss/gstossdmabuffer.h @@ -0,0 +1,77 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2005 Wim Taymans + * + * gstossdmabuffer.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_OSSDMABUFFER_H__ +#define __GST_OSSDMABUFFER_H__ + +#include + +#include "gstosshelper.h" +#include + +G_BEGIN_DECLS + +#define GST_TYPE_OSSDMABUFFER (gst_ossdmabuffer_get_type()) +#define GST_OSSDMABUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSSDMABUFFER,GstOssDMABuffer)) +#define GST_OSSDMABUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSSDMABUFFER,GstOssDMABufferClass)) +#define GST_IS_OSSDMABUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSDMABUFFER)) +#define GST_IS_OSSDMABUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSDMABUFFER)) + +#define GST_OSSELEMENT_GET(obj) GST_OSSELEMENT (obj->element) + +typedef enum { + GST_OSSDMABUFFER_OPEN = (1 << 0), +} GstOssDMABufferFlags; + +typedef struct _GstOssDMABuffer GstOssDMABuffer; +typedef struct _GstOssDMABufferClass GstOssDMABufferClass; + +#define GST_OSSDMABUFFER_THREAD(buf) (GST_OSSDMABUFFER(buf)->thread) +#define GST_OSSDMABUFFER_LOCK GST_OBJECT_LOCK +#define GST_OSSDMABUFFER_UNLOCK GST_OBJECT_UNLOCK +#define GST_OSSDMABUFFER_COND(buf) (GST_OSSDMABUFFER(buf)->cond) +#define GST_OSSDMABUFFER_SIGNAL(buf) (g_cond_signal (GST_OSSDMABUFFER_COND (buf))) +#define GST_OSSDMABUFFER_WAIT(buf) (g_cond_wait (GST_OSSDMABUFFER_COND (buf), GST_OBJECT_GET_LOCK (buf))) + +struct _GstOssDMABuffer { + GstRingBuffer buffer; + + GstOssElement *element; + + int fd; + int caps; + int frag; + + GThread *thread; + GCond *cond; + gboolean running; +}; + +struct _GstOssDMABufferClass { + GstRingBufferClass parent_class; +}; + +GType gst_ossdmabuffer_get_type(void); + +G_END_DECLS + +#endif /* __GST_OSSDMABUFFER_H__ */ diff --git a/sys/oss/gstosshelper.c b/sys/oss/gstosshelper.c new file mode 100644 index 0000000..6d7e6bd --- /dev/null +++ b/sys/oss/gstosshelper.c @@ -0,0 +1,407 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * + * gstosshelper.c: OSS helper routines + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gst/gst-i18n-plugin.h" +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_OSS_INCLUDE_IN_SYS +# include +#else +# ifdef HAVE_OSS_INCLUDE_IN_ROOT +# include +# else +# ifdef HAVE_OSS_INCLUDE_IN_MACHINE +# include +# else +# error "What to include?" +# endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ +# endif /* HAVE_OSS_INCLUDE_IN_ROOT */ +#endif /* HAVE_OSS_INCLUDE_IN_SYS */ + +#include + +#include "gstosshelper.h" +#include "gstossmixer.h" + +GST_DEBUG_CATEGORY_EXTERN (oss_debug); +#define GST_CAT_DEFAULT oss_debug + +typedef struct _GstOssProbe GstOssProbe; +struct _GstOssProbe +{ + int fd; + int format; + int n_channels; + GArray *rates; + int min; + int max; +}; + +typedef struct _GstOssRange GstOssRange; +struct _GstOssRange +{ + int min; + int max; +}; + +static GstStructure *gst_oss_helper_get_format_structure (unsigned int + format_bit); +static gboolean gst_oss_helper_rate_probe_check (GstOssProbe * probe); +static int gst_oss_helper_rate_check_rate (GstOssProbe * probe, int irate); +static void gst_oss_helper_rate_add_range (GQueue * queue, int min, int max); +static void gst_oss_helper_rate_add_rate (GArray * array, int rate); +static int gst_oss_helper_rate_int_compare (gconstpointer a, gconstpointer b); + +GstCaps * +gst_oss_helper_probe_caps (gint fd) +{ + GstOssProbe *probe; + int i; + gboolean ret; + GstStructure *structure; + unsigned int format_bit; + unsigned int format_mask; + GstCaps *caps; + + /* FIXME test make sure we're not currently playing */ + /* FIXME test both mono and stereo */ + + format_mask = AFMT_U8 | AFMT_S8; + + if (G_BYTE_ORDER == G_LITTLE_ENDIAN) + format_mask |= AFMT_S16_LE | AFMT_U16_LE; + else + format_mask |= AFMT_S16_BE | AFMT_U16_BE; + + caps = gst_caps_new_empty (); + + /* assume that the most significant bit of format_mask is 0 */ + for (format_bit = 1 << 31; format_bit > 0; format_bit >>= 1) { + if (format_bit & format_mask) { + GValue rate_value = { 0 }; + + probe = g_new0 (GstOssProbe, 1); + probe->fd = fd; + probe->format = format_bit; + /* FIXME: this is not working for all cards, see bug #518474 */ + probe->n_channels = 2; + + ret = gst_oss_helper_rate_probe_check (probe); + if (probe->min == -1 || probe->max == -1) { + g_array_free (probe->rates, TRUE); + g_free (probe); + continue; + } + + if (ret) { + GValue value = { 0 }; + + g_array_sort (probe->rates, gst_oss_helper_rate_int_compare); + + g_value_init (&rate_value, GST_TYPE_LIST); + g_value_init (&value, G_TYPE_INT); + + for (i = 0; i < probe->rates->len; i++) { + g_value_set_int (&value, g_array_index (probe->rates, int, i)); + + gst_value_list_append_value (&rate_value, &value); + } + + g_value_unset (&value); + } else { + /* one big range */ + g_value_init (&rate_value, GST_TYPE_INT_RANGE); + gst_value_set_int_range (&rate_value, probe->min, probe->max); + } + + g_array_free (probe->rates, TRUE); + g_free (probe); + + structure = gst_oss_helper_get_format_structure (format_bit); + gst_structure_set (structure, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); + gst_structure_set_value (structure, "rate", &rate_value); + g_value_unset (&rate_value); + + gst_caps_append_structure (caps, structure); + } + } + + if (gst_caps_is_empty (caps)) { + /* fixme: make user-visible */ + GST_WARNING ("Your OSS device could not be probed correctly"); + } + + GST_DEBUG ("probed caps: %" GST_PTR_FORMAT, caps); + + return caps; +} + +static GstStructure * +gst_oss_helper_get_format_structure (unsigned int format_bit) +{ + GstStructure *structure; + int endianness; + gboolean sign; + int width; + + switch (format_bit) { + case AFMT_U8: + endianness = 0; + sign = FALSE; + width = 8; + break; + case AFMT_S16_LE: + endianness = G_LITTLE_ENDIAN; + sign = TRUE; + width = 16; + break; + case AFMT_S16_BE: + endianness = G_BIG_ENDIAN; + sign = TRUE; + width = 16; + break; + case AFMT_S8: + endianness = 0; + sign = TRUE; + width = 8; + break; + case AFMT_U16_LE: + endianness = G_LITTLE_ENDIAN; + sign = FALSE; + width = 16; + break; + case AFMT_U16_BE: + endianness = G_BIG_ENDIAN; + sign = FALSE; + width = 16; + break; + default: + g_assert_not_reached (); + return NULL; + } + + structure = gst_structure_new ("audio/x-raw-int", + "width", G_TYPE_INT, width, + "depth", G_TYPE_INT, width, "signed", G_TYPE_BOOLEAN, sign, NULL); + + if (endianness) { + gst_structure_set (structure, "endianness", G_TYPE_INT, endianness, NULL); + } + + return structure; +} + +static gboolean +gst_oss_helper_rate_probe_check (GstOssProbe * probe) +{ + GstOssRange *range; + GQueue *ranges; + int exact_rates = 0; + gboolean checking_exact_rates = TRUE; + int n_checks = 0; + gboolean result = TRUE; + + ranges = g_queue_new (); + + probe->rates = g_array_new (FALSE, FALSE, sizeof (int)); + + probe->min = gst_oss_helper_rate_check_rate (probe, 1000); + n_checks++; + probe->max = gst_oss_helper_rate_check_rate (probe, 100000); + /* a little bug workaround */ + { + int max; + + max = gst_oss_helper_rate_check_rate (probe, 48000); + if (max > probe->max) { + GST_ERROR + ("Driver bug recognized (driver does not round rates correctly). Please file a bug report."); + probe->max = max; + } + } + n_checks++; + if (probe->min == -1 || probe->max == -1) { + /* This is a workaround for drivers that return -EINVAL (or another + * error) for rates outside of [8000,48000]. If this fails, the + * driver is seriously buggy, and probably doesn't work with other + * media libraries/apps. */ + probe->min = gst_oss_helper_rate_check_rate (probe, 8000); + probe->max = gst_oss_helper_rate_check_rate (probe, 48000); + } + if (probe->min == -1 || probe->max == -1) { + GST_DEBUG ("unexpected check_rate error"); + return FALSE; + } + gst_oss_helper_rate_add_range (ranges, probe->min + 1, probe->max - 1); + + while ((range = g_queue_pop_head (ranges))) { + int min1; + int max1; + int mid; + int mid_ret; + + GST_DEBUG ("checking [%d,%d]", range->min, range->max); + + mid = (range->min + range->max) / 2; + mid_ret = gst_oss_helper_rate_check_rate (probe, mid); + if (mid_ret == -1) { + /* FIXME ioctl returned an error. do something */ + GST_DEBUG ("unexpected check_rate error"); + } + n_checks++; + + if (mid == mid_ret && checking_exact_rates) { + int max_exact_matches = 20; + + exact_rates++; + if (exact_rates > max_exact_matches) { + GST_DEBUG ("got %d exact rates, assuming all are exact", + max_exact_matches); + result = FALSE; + g_free (range); + break; + } + } else { + checking_exact_rates = FALSE; + } + + /* Assume that the rate is arithmetically rounded to the nearest + * supported rate. */ + if (mid == mid_ret) { + min1 = mid - 1; + max1 = mid + 1; + } else { + if (mid < mid_ret) { + min1 = mid - (mid_ret - mid); + max1 = mid_ret + 1; + } else { + min1 = mid_ret - 1; + max1 = mid + (mid - mid_ret); + } + } + + gst_oss_helper_rate_add_range (ranges, range->min, min1); + gst_oss_helper_rate_add_range (ranges, max1, range->max); + + g_free (range); + } + + while ((range = g_queue_pop_head (ranges))) { + g_free (range); + } + g_queue_free (ranges); + + return result; +} + +static void +gst_oss_helper_rate_add_range (GQueue * queue, int min, int max) +{ + if (min <= max) { + GstOssRange *range = g_new0 (GstOssRange, 1); + + range->min = min; + range->max = max; + + g_queue_push_tail (queue, range); + /* push_head also works, but has different probing behavior */ + /*g_queue_push_head (queue, range); */ + } +} + +static int +gst_oss_helper_rate_check_rate (GstOssProbe * probe, int irate) +{ + int rate; + int format; + int n_channels; + int ret; + + rate = irate; + format = probe->format; + n_channels = probe->n_channels; + + GST_LOG ("checking format %d, channels %d, rate %d", + format, n_channels, rate); + ret = ioctl (probe->fd, SNDCTL_DSP_SETFMT, &format); + if (ret < 0 || format != probe->format) { + GST_DEBUG ("unsupported format: %d (%d)", probe->format, format); + return -1; + } + ret = ioctl (probe->fd, SNDCTL_DSP_CHANNELS, &n_channels); + if (ret < 0 || n_channels != probe->n_channels) { + GST_DEBUG ("unsupported channels: %d (%d)", probe->n_channels, n_channels); + return -1; + } + ret = ioctl (probe->fd, SNDCTL_DSP_SPEED, &rate); + if (ret < 0) { + GST_DEBUG ("unsupported rate: %d (%d)", irate, rate); + return -1; + } + + GST_DEBUG ("rate %d -> %d", irate, rate); + + if (rate == irate - 1 || rate == irate + 1) { + rate = irate; + } + gst_oss_helper_rate_add_rate (probe->rates, rate); + return rate; +} + +static void +gst_oss_helper_rate_add_rate (GArray * array, int rate) +{ + int i; + int val; + + for (i = 0; i < array->len; i++) { + val = g_array_index (array, int, i); + + if (val == rate) + return; + } + GST_DEBUG ("supported rate: %d", rate); + g_array_append_val (array, rate); +} + +static int +gst_oss_helper_rate_int_compare (gconstpointer a, gconstpointer b) +{ + const int *va = (const int *) a; + const int *vb = (const int *) b; + + if (*va < *vb) + return -1; + if (*va > *vb) + return 1; + return 0; +} diff --git a/sys/oss/gstosshelper.h b/sys/oss/gstosshelper.h new file mode 100644 index 0000000..1593fe3 --- /dev/null +++ b/sys/oss/gstosshelper.h @@ -0,0 +1,43 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * + * gstosshelper.h: OSS helper routines. + * + * 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_OSS_HELPER_H__ +#define __GST_OSS_HELPER_H__ + + +#include +#include + +#include "gstosshelper.h" + + +G_BEGIN_DECLS + + +GstCaps* gst_oss_helper_probe_caps (gint fd); + + +G_END_DECLS + + +#endif /* __GST_OSS_HELPER_H__ */ diff --git a/sys/oss/gstossmixer.c b/sys/oss/gstossmixer.c new file mode 100644 index 0000000..e563031 --- /dev/null +++ b/sys/oss/gstossmixer.c @@ -0,0 +1,378 @@ +/* GStreamer OSS Mixer implementation + * Copyright (C) 2003 Ronald Bultje + * + * gstossmixer.c: mixer interface implementation for OSS + * + * 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 +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_OSS_INCLUDE_IN_SYS +# include +#else +# ifdef HAVE_OSS_INCLUDE_IN_ROOT +# include +# else +# ifdef HAVE_OSS_INCLUDE_IN_MACHINE +# include +# else +# error "What to include?" +# endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ +# endif /* HAVE_OSS_INCLUDE_IN_ROOT */ +#endif /* HAVE_OSS_INCLUDE_IN_SYS */ + +#include + +#include "gstossmixer.h" +#include "gstossmixertrack.h" + +GST_DEBUG_CATEGORY_EXTERN (oss_debug); +#define GST_CAT_DEFAULT oss_debug + +#define MASK_BIT_IS_SET(mask, bit) \ + (mask & (1 << bit)) + +static gboolean +gst_ossmixer_open (GstOssMixer * mixer) +{ +#ifdef SOUND_MIXER_INFO + struct mixer_info minfo; +#endif + + g_return_val_if_fail (mixer->mixer_fd == -1, FALSE); + + mixer->mixer_fd = open (mixer->device, O_RDWR); + if (mixer->mixer_fd == -1) + goto open_failed; + + /* get masks */ + if (ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECMASK, &mixer->recmask) < 0 + || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECSRC, &mixer->recdevs) < 0 + || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_STEREODEVS, + &mixer->stereomask) < 0 + || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_DEVMASK, &mixer->devmask) < 0 + || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_CAPS, &mixer->mixcaps) < 0) + goto masks_failed; + + /* get name, not fatal */ + g_free (mixer->cardname); +#ifdef SOUND_MIXER_INFO + if (ioctl (mixer->mixer_fd, SOUND_MIXER_INFO, &minfo) == 0) { + mixer->cardname = g_strdup (minfo.name); + GST_INFO ("Card name = %s", GST_STR_NULL (mixer->cardname)); + } else +#endif + { + mixer->cardname = g_strdup ("Unknown"); + GST_INFO ("Unknown card name"); + } + GST_INFO ("Opened mixer for device %s", mixer->device); + + return TRUE; + + /* ERRORS */ +open_failed: + { + /* this is valid. OSS devices don't need to expose a mixer */ + GST_DEBUG ("Failed to open mixer device %s, mixing disabled: %s", + mixer->device, strerror (errno)); + return FALSE; + } +masks_failed: + { + GST_DEBUG ("Failed to get device masks"); + close (mixer->mixer_fd); + mixer->mixer_fd = -1; + return FALSE; + } +} + +static void +gst_ossmixer_ensure_track_list (GstOssMixer * mixer) +{ + gint i, master = -1; + + g_return_if_fail (mixer->mixer_fd != -1); + + if (mixer->tracklist) + return; + + /* find master volume */ + if (mixer->devmask & SOUND_MASK_VOLUME) + master = SOUND_MIXER_VOLUME; + else if (mixer->devmask & SOUND_MASK_PCM) + master = SOUND_MIXER_PCM; + else if (mixer->devmask & SOUND_MASK_SPEAKER) + master = SOUND_MIXER_SPEAKER; /* doubtful... */ + /* else: no master, so we won't set any */ + + /* build track list */ + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { + if (mixer->devmask & (1 << i)) { + GstMixerTrack *track; + gboolean input = FALSE, stereo = FALSE, record = FALSE; + + /* track exists, make up capabilities */ + if (MASK_BIT_IS_SET (mixer->stereomask, i)) + stereo = TRUE; + if (MASK_BIT_IS_SET (mixer->recmask, i)) + input = TRUE; + if (MASK_BIT_IS_SET (mixer->recdevs, i)) + record = TRUE; + + /* do we want this in our list? */ + if (!((mixer->dir & GST_OSS_MIXER_CAPTURE && input == TRUE) || + (mixer->dir & GST_OSS_MIXER_PLAYBACK && i != SOUND_MIXER_PCM))) + /* the PLAYBACK case seems hacky, but that's how 0.8 had it */ + continue; + + /* add track to list */ + track = gst_ossmixer_track_new (mixer->mixer_fd, i, stereo ? 2 : 1, + (record ? GST_MIXER_TRACK_RECORD : 0) | + (input ? GST_MIXER_TRACK_INPUT : + GST_MIXER_TRACK_OUTPUT) | + ((master != i) ? 0 : GST_MIXER_TRACK_MASTER)); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } + } +} + +GstOssMixer * +gst_ossmixer_new (const char *device, GstOssMixerDirection dir) +{ + GstOssMixer *ret = NULL; + + g_return_val_if_fail (device != NULL, NULL); + + ret = g_new0 (GstOssMixer, 1); + + ret->device = g_strdup (device); + ret->dir = dir; + ret->mixer_fd = -1; + + if (!gst_ossmixer_open (ret)) + goto error; + + return ret; + + /* ERRORS */ +error: + { + gst_ossmixer_free (ret); + return NULL; + } +} + +void +gst_ossmixer_free (GstOssMixer * mixer) +{ + g_return_if_fail (mixer != NULL); + + if (mixer->device) { + g_free (mixer->device); + mixer->device = NULL; + } + + if (mixer->cardname) { + g_free (mixer->cardname); + mixer->cardname = NULL; + } + + if (mixer->tracklist) { + g_list_foreach (mixer->tracklist, (GFunc) g_object_unref, NULL); + g_list_free (mixer->tracklist); + mixer->tracklist = NULL; + } + + if (mixer->mixer_fd != -1) { + close (mixer->mixer_fd); + mixer->mixer_fd = -1; + } + + g_free (mixer); +} + +/* unused with G_DISABLE_* */ +static G_GNUC_UNUSED gboolean +gst_ossmixer_contains_track (GstOssMixer * mixer, GstOssMixerTrack * osstrack) +{ + const GList *item; + + for (item = mixer->tracklist; item != NULL; item = item->next) + if (item->data == osstrack) + return TRUE; + + return FALSE; +} + +const GList * +gst_ossmixer_list_tracks (GstOssMixer * mixer) +{ + gst_ossmixer_ensure_track_list (mixer); + + return (const GList *) mixer->tracklist; +} + +void +gst_ossmixer_get_volume (GstOssMixer * mixer, + GstMixerTrack * track, gint * volumes) +{ + gint volume; + GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); + + g_return_if_fail (mixer->mixer_fd != -1); + g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); + + if (track->flags & GST_MIXER_TRACK_MUTE) { + volumes[0] = osstrack->lvol; + if (track->num_channels == 2) { + volumes[1] = osstrack->rvol; + } + } else { + /* get */ + if (ioctl (mixer->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { + g_warning ("Error getting recording device (%d) volume: %s", + osstrack->track_num, strerror (errno)); + volume = 0; + } + + osstrack->lvol = volumes[0] = (volume & 0xff); + if (track->num_channels == 2) { + osstrack->rvol = volumes[1] = ((volume >> 8) & 0xff); + } + } +} + +void +gst_ossmixer_set_volume (GstOssMixer * mixer, + GstMixerTrack * track, gint * volumes) +{ + gint volume; + GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); + + g_return_if_fail (mixer->mixer_fd != -1); + g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); + + /* prepare the value for ioctl() */ + if (!(track->flags & GST_MIXER_TRACK_MUTE)) { + volume = (volumes[0] & 0xff); + if (track->num_channels == 2) { + volume |= ((volumes[1] & 0xff) << 8); + } + + /* set */ + if (ioctl (mixer->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + g_warning ("Error setting recording device (%d) volume (0x%x): %s", + osstrack->track_num, volume, strerror (errno)); + return; + } + } + + osstrack->lvol = volumes[0]; + if (track->num_channels == 2) { + osstrack->rvol = volumes[1]; + } +} + +void +gst_ossmixer_set_mute (GstOssMixer * mixer, GstMixerTrack * track, + gboolean mute) +{ + int volume; + GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); + + g_return_if_fail (mixer->mixer_fd != -1); + g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); + + if (mute) { + volume = 0; + } else { + volume = (osstrack->lvol & 0xff); + if (MASK_BIT_IS_SET (mixer->stereomask, osstrack->track_num)) { + volume |= ((osstrack->rvol & 0xff) << 8); + } + } + + if (ioctl (mixer->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + g_warning ("Error setting mixer recording device volume (0x%x): %s", + volume, strerror (errno)); + return; + } + + if (mute) { + track->flags |= GST_MIXER_TRACK_MUTE; + } else { + track->flags &= ~GST_MIXER_TRACK_MUTE; + } +} + +void +gst_ossmixer_set_record (GstOssMixer * mixer, + GstMixerTrack * track, gboolean record) +{ + GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); + + g_return_if_fail (mixer->mixer_fd != -1); + g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); + + /* if there's nothing to do... */ + if ((record && GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD)) || + (!record && !GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD))) + return; + + /* if we're exclusive, then we need to unset the current one(s) */ + if (mixer->mixcaps & SOUND_CAP_EXCL_INPUT) { + GList *track; + + for (track = mixer->tracklist; track != NULL; track = track->next) { + GstMixerTrack *turn = (GstMixerTrack *) track->data; + + turn->flags &= ~GST_MIXER_TRACK_RECORD; + } + mixer->recdevs = 0; + } + + /* set new record bit, if needed */ + if (record) { + mixer->recdevs |= (1 << osstrack->track_num); + } else { + mixer->recdevs &= ~(1 << osstrack->track_num); + } + + /* set it to the device */ + if (ioctl (mixer->mixer_fd, SOUND_MIXER_WRITE_RECSRC, &mixer->recdevs) < 0) { + g_warning ("Error setting mixer recording devices (0x%x): %s", + mixer->recdevs, strerror (errno)); + return; + } + + if (record) { + track->flags |= GST_MIXER_TRACK_RECORD; + } else { + track->flags &= ~GST_MIXER_TRACK_RECORD; + } +} diff --git a/sys/oss/gstossmixer.h b/sys/oss/gstossmixer.h new file mode 100644 index 0000000..d2e06fe --- /dev/null +++ b/sys/oss/gstossmixer.h @@ -0,0 +1,171 @@ +/* GStreamer OSS Mixer implementation + * Copyright (C) 2003 Ronald Bultje + * + * gstossmixer.h: mixer interface implementation for OSS + * + * 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_OSS_MIXER_H__ +#define __GST_OSS_MIXER_H__ + + +#include +#include + +#include "gstosshelper.h" + + +G_BEGIN_DECLS + + +#define GST_OSS_MIXER(obj) ((GstOssMixer*)(obj)) + + +typedef enum { + GST_OSS_MIXER_CAPTURE = 1<<0, + GST_OSS_MIXER_PLAYBACK = 1<<1, + GST_OSS_MIXER_ALL = GST_OSS_MIXER_CAPTURE | GST_OSS_MIXER_PLAYBACK +} GstOssMixerDirection; + + +typedef struct _GstOssMixer GstOssMixer; + + +struct _GstOssMixer { + GList * tracklist; /* list of available tracks */ + + gint mixer_fd; + + gchar * device; + gchar * cardname; + + gint recmask; + gint recdevs; + gint stereomask; + gint devmask; + gint mixcaps; + + GstOssMixerDirection dir; +}; + + +GstOssMixer* gst_ossmixer_new (const gchar *device, + GstOssMixerDirection dir); +void gst_ossmixer_free (GstOssMixer *mixer); + +const GList* gst_ossmixer_list_tracks (GstOssMixer * mixer); +void gst_ossmixer_set_volume (GstOssMixer * mixer, + GstMixerTrack * track, + gint * volumes); +void gst_ossmixer_get_volume (GstOssMixer * mixer, + GstMixerTrack * track, + gint * volumes); +void gst_ossmixer_set_record (GstOssMixer * mixer, + GstMixerTrack * track, + gboolean record); +void gst_ossmixer_set_mute (GstOssMixer * mixer, + GstMixerTrack * track, + gboolean mute); + + +#define GST_IMPLEMENT_OSS_MIXER_METHODS(Type, interface_as_function) \ +static gboolean \ +interface_as_function ## _supported (Type *this, GType iface_type) \ +{ \ + g_assert (iface_type == GST_TYPE_MIXER); \ + \ + return (this->mixer != NULL); \ +} \ + \ +static const GList* \ +interface_as_function ## _list_tracks (GstMixer * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_val_if_fail (this != NULL, NULL); \ + g_return_val_if_fail (this->mixer != NULL, NULL); \ + \ + return gst_ossmixer_list_tracks (this->mixer); \ +} \ + \ +static void \ +interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track, \ + gint * volumes) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_ossmixer_set_volume (this->mixer, track, volumes); \ +} \ + \ +static void \ +interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track, \ + gint * volumes) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_ossmixer_get_volume (this->mixer, track, volumes); \ +} \ + \ +static void \ +interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track, \ + gboolean record) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_ossmixer_set_record (this->mixer, track, record); \ +} \ + \ +static void \ +interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track, \ + gboolean mute) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_ossmixer_set_mute (this->mixer, track, mute); \ +} \ + \ +static void \ +interface_as_function ## _interface_init (GstMixerClass * klass) \ +{ \ + GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; \ + \ + /* set up the interface hooks */ \ + klass->list_tracks = interface_as_function ## _list_tracks; \ + klass->set_volume = interface_as_function ## _set_volume; \ + klass->get_volume = interface_as_function ## _get_volume; \ + klass->set_mute = interface_as_function ## _set_mute; \ + klass->set_record = interface_as_function ## _set_record; \ +} + + +G_END_DECLS + + +#endif /* __GST_OSS_MIXER_H__ */ diff --git a/sys/oss/gstossmixerelement.c b/sys/oss/gstossmixerelement.c new file mode 100644 index 0000000..7ceb2b8 --- /dev/null +++ b/sys/oss/gstossmixerelement.c @@ -0,0 +1,218 @@ +/* OSS mixer interface element. + * Copyright (C) 2005 Andrew Vander Wingo + * + * 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-ossmixer + * + * This element lets you adjust sound input and output levels with the + * Open Sound System (OSS). It supports the #GstMixer interface, which can be + * used to obtain a list of available mixer tracks. Set the mixer element to + * READY state before using the #GstMixer interface on it. + * + * + * Example pipelines + * + * ossmixer can't be used in a sensible way in gst-launch. + * + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstossmixerelement.h" + +GST_DEBUG_CATEGORY_EXTERN (oss_debug); +#define GST_CAT_DEFAULT oss_debug + +#define DEFAULT_DEVICE "/dev/mixer" +#define DEFAULT_DEVICE_NAME NULL + +enum +{ + PROP_0, + PROP_DEVICE, + PROP_DEVICE_NAME +}; + +GST_BOILERPLATE_WITH_INTERFACE (GstOssMixerElement, gst_oss_mixer_element, + GstElement, GST_TYPE_ELEMENT, GstMixer, GST_TYPE_MIXER, + gst_oss_mixer_element); + +GST_IMPLEMENT_OSS_MIXER_METHODS (GstOssMixerElement, gst_oss_mixer_element); + +static GstStateChangeReturn gst_oss_mixer_element_change_state (GstElement * + element, GstStateChange transition); + +static void gst_oss_mixer_element_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_oss_mixer_element_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_oss_mixer_element_finalize (GObject * object); + +static void +gst_oss_mixer_element_base_init (gpointer klass) +{ + gst_element_class_set_details_simple (GST_ELEMENT_CLASS (klass), "OSS Mixer", + "Generic/Audio", + "Control sound input and output levels with OSS", + "Andrew Vander Wingo "); +} + +static void +gst_oss_mixer_element_class_init (GstOssMixerElementClass * klass) +{ + GstElementClass *element_class; + GObjectClass *gobject_class; + + element_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = gst_oss_mixer_element_finalize; + gobject_class->set_property = gst_oss_mixer_element_set_property; + gobject_class->get_property = gst_oss_mixer_element_get_property; + + /** + * GstOssMixerElement:device + * + * OSS mixer device (usually /dev/mixer) + * + * Since: 0.10.5 + **/ + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "OSS mixer device (usually /dev/mixer)", DEFAULT_DEVICE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + element_class->change_state = + GST_DEBUG_FUNCPTR (gst_oss_mixer_element_change_state); +} + +static void +gst_oss_mixer_element_finalize (GObject * obj) +{ + GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (obj); + + g_free (this->device); + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_oss_mixer_element_init (GstOssMixerElement * this, + GstOssMixerElementClass * g_class) +{ + this->mixer = NULL; + this->device = g_strdup (DEFAULT_DEVICE); +} + +static void +gst_oss_mixer_element_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (object); + + switch (prop_id) { + case PROP_DEVICE: + g_free (this->device); + this->device = g_value_dup_string (value); + /* make sure we never set NULL */ + if (this->device == NULL) { + this->device = g_strdup (DEFAULT_DEVICE); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_oss_mixer_element_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (object); + + switch (prop_id) { + case PROP_DEVICE: + g_value_set_string (value, this->device); + break; + case PROP_DEVICE_NAME: + if (this->mixer) { + g_value_set_string (value, this->mixer->cardname); + } else { + g_value_set_string (value, NULL); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_oss_mixer_element_change_state (GstElement * element, + GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!this->mixer) { + this->mixer = gst_ossmixer_new (this->device, GST_OSS_MIXER_ALL); + if (!this->mixer) + goto open_failed; + } + break; + 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_READY_TO_NULL: + if (this->mixer) { + gst_ossmixer_free (this->mixer); + this->mixer = NULL; + } + break; + default: + break; + } + return ret; + + /* ERRORS */ +open_failed: + { + GST_ELEMENT_ERROR (element, RESOURCE, OPEN_READ_WRITE, (NULL), + ("Failed to open oss mixer device '%s'", this->device)); + return GST_STATE_CHANGE_FAILURE; + } +} diff --git a/sys/oss/gstossmixerelement.h b/sys/oss/gstossmixerelement.h new file mode 100644 index 0000000..2d47e0e --- /dev/null +++ b/sys/oss/gstossmixerelement.h @@ -0,0 +1,59 @@ +/* OSS mixer interface element. + * Copyright (C) 2005 Andrew Vander Wingo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#ifndef __GST_OSS_MIXER_ELEMENT_H__ +#define __GST_OSS_MIXER_ELEMENT_H__ + + +#include "gstossmixer.h" + + +G_BEGIN_DECLS + + +#define GST_OSS_MIXER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS_MIXER_ELEMENT,GstOssMixerElement)) +#define GST_OSS_MIXER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS_MIXER_ELEMENT,GstOssMixerElementClass)) +#define GST_IS_OSS_MIXER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS_MIXER_ELEMENT)) +#define GST_IS_OSS_MIXER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS_MIXER_ELEMENT)) +#define GST_TYPE_OSS_MIXER_ELEMENT (gst_oss_mixer_element_get_type()) + + +typedef struct _GstOssMixerElement GstOssMixerElement; +typedef struct _GstOssMixerElementClass GstOssMixerElementClass; + + +struct _GstOssMixerElement { + GstElement parent; + + gchar *device; + GstOssMixer *mixer; +}; + +struct _GstOssMixerElementClass { + GstElementClass parent; +}; + + +GType gst_oss_mixer_element_get_type (void); + + +G_END_DECLS + + +#endif /* __GST_OSS_MIXER_ELEMENT_H__ */ diff --git a/sys/oss/gstossmixertrack.c b/sys/oss/gstossmixertrack.c new file mode 100644 index 0000000..3bc8cde --- /dev/null +++ b/sys/oss/gstossmixertrack.c @@ -0,0 +1,172 @@ +/* GStreamer OSS Mixer implementation + * Copyright (C) 2003 Ronald Bultje + * + * gstossmixer.c: mixer interface implementation for OSS + * + * 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 +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_OSS_INCLUDE_IN_SYS +# include +#else +# ifdef HAVE_OSS_INCLUDE_IN_ROOT +# include +# else +# ifdef HAVE_OSS_INCLUDE_IN_MACHINE +# include +# else +# error "What to include?" +# endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ +# endif /* HAVE_OSS_INCLUDE_IN_ROOT */ +#endif /* HAVE_OSS_INCLUDE_IN_SYS */ + +#include + +#include "gstossmixertrack.h" + +GST_DEBUG_CATEGORY_EXTERN (oss_debug); +#define GST_CAT_DEFAULT oss_debug + +#define MASK_BIT_IS_SET(mask, bit) \ + (mask & (1 << bit)) + +G_DEFINE_TYPE (GstOssMixerTrack, gst_ossmixer_track, GST_TYPE_MIXER_TRACK); + +static void +gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass) +{ + /* nop */ +} + +static void +gst_ossmixer_track_init (GstOssMixerTrack * track) +{ + track->lvol = track->rvol = 0; + track->track_num = 0; +} + +static const gchar **labels = NULL; + +/* three functions: firstly, OSS has the nasty habit of inserting + * spaces in the labels, we want to get rid of them. Secondly, + * i18n is impossible with OSS' way of providing us with mixer + * labels, so we make a 'given' list of i18n'ed labels. Thirdly, I + * personally don't like the "1337" names that OSS gives to their + * labels ("Vol", "Mic", "Rec"), I'd rather see full names. */ + +static void +fill_labels (void) +{ + gint i, pos; + const gchar *origs[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; + const struct + { + const gchar *given; + const gchar *wanted; + } + cases[] = { + /* Note: this list is simply ripped from soundcard.h. For + * some people, some values might be missing (3D surround, + * etc.) - feel free to add them. That's the reason why + * I'm doing this in such a horribly complicated way. */ + { + "Vol ", _("Volume")}, { + "Bass ", _("Bass")}, { + "Trebl", _("Treble")}, { + "Synth", _("Synth")}, { + "Pcm ", _("PCM")}, { + "Spkr ", _("Speaker")}, { + "Line ", _("Line-in")}, { + "Mic ", _("Microphone")}, { + "CD ", _("CD")}, { + "Mix ", _("Mixer")}, { + "Pcm2 ", _("PCM-2")}, { + "Rec ", _("Record")}, { + "IGain", _("In-gain")}, { + "OGain", _("Out-gain")}, { + "Line1", _("Line-1")}, { + "Line2", _("Line-2")}, { + "Line3", _("Line-3")}, { + "Digital1", _("Digital-1")}, { + "Digital2", _("Digital-2")}, { + "Digital3", _("Digital-3")}, { + "PhoneIn", _("Phone-in")}, { + "PhoneOut", _("Phone-out")}, { + "Video", _("Video")}, { + "Radio", _("Radio")}, { + "Monitor", _("Monitor")}, { + NULL, NULL} + }; + + labels = g_malloc (sizeof (gchar *) * SOUND_MIXER_NRDEVICES); + + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { + for (pos = 0; cases[pos].given != NULL; pos++) { + if (!strcmp (cases[pos].given, origs[i])) { + labels[i] = g_strdup (cases[pos].wanted); + break; + } + } + if (cases[pos].given == NULL) + labels[i] = g_strdup (origs[i]); + } +} + +GstMixerTrack * +gst_ossmixer_track_new (gint mixer_fd, + gint track_num, gint max_chans, gint flags) +{ + GstOssMixerTrack *osstrack; + GstMixerTrack *track; + gint volume; + + if (!labels) + fill_labels (); + + osstrack = g_object_new (GST_TYPE_OSSMIXER_TRACK, NULL); + track = GST_MIXER_TRACK (osstrack); + track->label = g_strdup (labels[track_num]); + track->num_channels = max_chans; + track->flags = flags; + track->min_volume = 0; + track->max_volume = 100; + osstrack->track_num = track_num; + + /* volume */ + if (ioctl (mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { + g_warning ("Error getting device (%d) volume: %s", + osstrack->track_num, strerror (errno)); + volume = 0; + } + osstrack->lvol = (volume & 0xff); + if (track->num_channels == 2) { + osstrack->rvol = ((volume >> 8) & 0xff); + } + + return track; +} diff --git a/sys/oss/gstossmixertrack.h b/sys/oss/gstossmixertrack.h new file mode 100644 index 0000000..2e62ec8 --- /dev/null +++ b/sys/oss/gstossmixertrack.h @@ -0,0 +1,62 @@ +/* GStreamer OSS Mixer implementation + * Copyright (C) 2003 Ronald Bultje + * + * gstossmixertrack.h: OSS mixer tracks + * + * 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_OSS_MIXER_TRACK_H__ +#define __GST_OSS_MIXER_TRACK_H__ + +#include +#include + +#include "gstosshelper.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSSMIXER_TRACK \ + (gst_ossmixer_track_get_type ()) +#define GST_OSSMIXER_TRACK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OSSMIXER_TRACK, \ + GstOssMixerTrack)) +#define GST_OSSMIXER_TRACK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OSSMIXER_TRACK, \ + GstOssMixerTrackClass)) +#define GST_IS_OSSMIXER_TRACK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OSSMIXER_TRACK)) +#define GST_IS_OSSMIXER_TRACK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OSSMIXER_TRACK)) + +typedef struct _GstOssMixerTrack { + GstMixerTrack parent; + + gint lvol, rvol; + gint track_num; +} GstOssMixerTrack; + +typedef struct _GstOssMixerTrackClass { + GstMixerTrackClass parent; +} GstOssMixerTrackClass; + +GType gst_ossmixer_track_get_type (void); +GstMixerTrack* gst_ossmixer_track_new (gint mixer_fd, + gint track_num, gint max_chans, gint flags); + +G_END_DECLS + +#endif /* __GST_OSS_MIXER_TRACK_H__ */ diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c new file mode 100644 index 0000000..a604d9c --- /dev/null +++ b/sys/oss/gstosssink.c @@ -0,0 +1,565 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000,2005 Wim Taymans + * + * gstosssink.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. + */ + +/** + * SECTION:element-osssink + * + * This element lets you output sound using the Open Sound System (OSS). + * + * Note that you should almost always use generic audio conversion elements + * like audioconvert and audioresample in front of an audiosink to make sure + * your pipeline works under all circumstances (those conversion elements will + * act in passthrough-mode if no conversion is necessary). + * + * + * Example pipelines + * |[ + * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.1 ! osssink + * ]| will output a sine wave (continuous beep sound) to your sound card (with + * a very low volume as precaution). + * |[ + * gst-launch -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! osssink + * ]| will play an Ogg/Vorbis audio file and output it using the Open Sound System. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include + +#ifdef HAVE_OSS_INCLUDE_IN_SYS +# include +#else +# ifdef HAVE_OSS_INCLUDE_IN_ROOT +# include +# else +# ifdef HAVE_OSS_INCLUDE_IN_MACHINE +# include +# else +# error "What to include?" +# endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ +# endif /* HAVE_OSS_INCLUDE_IN_ROOT */ +#endif /* HAVE_OSS_INCLUDE_IN_SYS */ + +#include "common.h" +#include "gstosssink.h" + +#include + +GST_DEBUG_CATEGORY_EXTERN (oss_debug); +#define GST_CAT_DEFAULT oss_debug + +static void gst_oss_sink_base_init (gpointer g_class); +static void gst_oss_sink_class_init (GstOssSinkClass * klass); +static void gst_oss_sink_init (GstOssSink * osssink); + +static void gst_oss_sink_dispose (GObject * object); +static void gst_oss_sink_finalise (GObject * object); + +static void gst_oss_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_oss_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static GstCaps *gst_oss_sink_getcaps (GstBaseSink * bsink); + +static gboolean gst_oss_sink_open (GstAudioSink * asink); +static gboolean gst_oss_sink_close (GstAudioSink * asink); +static gboolean gst_oss_sink_prepare (GstAudioSink * asink, + GstRingBufferSpec * spec); +static gboolean gst_oss_sink_unprepare (GstAudioSink * asink); +static guint gst_oss_sink_write (GstAudioSink * asink, gpointer data, + guint length); +static guint gst_oss_sink_delay (GstAudioSink * asink); +static void gst_oss_sink_reset (GstAudioSink * asink); + +/* OssSink signals and args */ +enum +{ + LAST_SIGNAL +}; + +#define DEFAULT_DEVICE "/dev/dsp" +enum +{ + PROP_0, + PROP_DEVICE, +}; + +static GstStaticPadTemplate osssink_sink_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) { " G_STRINGIFY (G_BYTE_ORDER) " }, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " + "audio/x-raw-int, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) 8, " + "depth = (int) 8, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") + ); + +static GstElementClass *parent_class = NULL; + +/* static guint gst_oss_sink_signals[LAST_SIGNAL] = { 0 }; */ + +GType +gst_oss_sink_get_type (void) +{ + static GType osssink_type = 0; + + if (!osssink_type) { + static const GTypeInfo osssink_info = { + sizeof (GstOssSinkClass), + gst_oss_sink_base_init, + NULL, + (GClassInitFunc) gst_oss_sink_class_init, + NULL, + NULL, + sizeof (GstOssSink), + 0, + (GInstanceInitFunc) gst_oss_sink_init, + }; + + osssink_type = + g_type_register_static (GST_TYPE_AUDIO_SINK, "GstOssSink", + &osssink_info, 0); + } + + return osssink_type; +} + +static void +gst_oss_sink_dispose (GObject * object) +{ + GstOssSink *osssink = GST_OSSSINK (object); + + if (osssink->probed_caps) { + gst_caps_unref (osssink->probed_caps); + osssink->probed_caps = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_oss_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Audio Sink (OSS)", + "Sink/Audio", + "Output to a sound card via OSS", + "Erik Walthinsen , " + "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &osssink_sink_factory); +} + +static void +gst_oss_sink_class_init (GstOssSinkClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSinkClass *gstbasesink_class; + GstAudioSinkClass *gstaudiosink_class; + + gobject_class = (GObjectClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gstaudiosink_class = (GstAudioSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->dispose = gst_oss_sink_dispose; + gobject_class->finalize = gst_oss_sink_finalise; + gobject_class->get_property = gst_oss_sink_get_property; + gobject_class->set_property = gst_oss_sink_set_property; + + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "OSS device (usually /dev/dspN)", DEFAULT_DEVICE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss_sink_getcaps); + + gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_oss_sink_open); + gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_oss_sink_close); + gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_oss_sink_prepare); + gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss_sink_unprepare); + gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_oss_sink_write); + gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_oss_sink_delay); + gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_oss_sink_reset); +} + +static void +gst_oss_sink_init (GstOssSink * osssink) +{ + const gchar *device; + + GST_DEBUG_OBJECT (osssink, "initializing osssink"); + + device = g_getenv ("AUDIODEV"); + if (device == NULL) + device = DEFAULT_DEVICE; + osssink->device = g_strdup (device); + osssink->fd = -1; +} + +static void +gst_oss_sink_finalise (GObject * object) +{ + GstOssSink *osssink = GST_OSSSINK (object); + + g_free (osssink->device); + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (object)); +} + +static void +gst_oss_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOssSink *sink; + + sink = GST_OSSSINK (object); + + switch (prop_id) { + case PROP_DEVICE: + g_free (sink->device); + sink->device = g_value_dup_string (value); + if (sink->probed_caps) { + gst_caps_unref (sink->probed_caps); + sink->probed_caps = NULL; + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_oss_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOssSink *sink; + + sink = GST_OSSSINK (object); + + switch (prop_id) { + case PROP_DEVICE: + g_value_set_string (value, sink->device); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_oss_sink_getcaps (GstBaseSink * bsink) +{ + GstOssSink *osssink; + GstCaps *caps; + + osssink = GST_OSSSINK (bsink); + + if (osssink->fd == -1) { + caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD + (bsink))); + } else if (osssink->probed_caps) { + caps = gst_caps_copy (osssink->probed_caps); + } else { + caps = gst_oss_helper_probe_caps (osssink->fd); + if (caps && !gst_caps_is_empty (caps)) { + osssink->probed_caps = gst_caps_copy (caps); + } + } + + return caps; +} + +static gint +ilog2 (gint x) +{ + /* well... hacker's delight explains... */ + x = x | (x >> 1); + x = x | (x >> 2); + x = x | (x >> 4); + x = x | (x >> 8); + x = x | (x >> 16); + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0f0f0f0f; + x = x + (x >> 8); + x = x + (x >> 16); + return (x & 0x0000003f) - 1; +} + +static gint +gst_oss_sink_get_format (GstBufferFormat fmt) +{ + gint result; + + switch (fmt) { + case GST_MU_LAW: + result = AFMT_MU_LAW; + break; + case GST_A_LAW: + result = AFMT_A_LAW; + break; + case GST_IMA_ADPCM: + result = AFMT_IMA_ADPCM; + break; + case GST_U8: + result = AFMT_U8; + break; + case GST_S16_LE: + result = AFMT_S16_LE; + break; + case GST_S16_BE: + result = AFMT_S16_BE; + break; + case GST_S8: + result = AFMT_S8; + break; + case GST_U16_LE: + result = AFMT_U16_LE; + break; + case GST_U16_BE: + result = AFMT_U16_BE; + break; + case GST_MPEG: + result = AFMT_MPEG; + break; + default: + result = 0; + break; + } + return result; +} + +static gboolean +gst_oss_sink_open (GstAudioSink * asink) +{ + GstOssSink *oss; + int mode; + + oss = GST_OSSSINK (asink); + + mode = O_WRONLY; + mode |= O_NONBLOCK; + + oss->fd = open (oss->device, mode, 0); + if (oss->fd == -1) { + switch (errno) { + case EBUSY: + goto busy; + case EACCES: + goto no_permission; + default: + goto open_failed; + } + } + + return TRUE; + + /* ERRORS */ +busy: + { + GST_ELEMENT_ERROR (oss, RESOURCE, BUSY, + (_("Could not open audio device for playback. " + "Device is being used by another application.")), (NULL)); + return FALSE; + } +no_permission: + { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, + (_("Could not open audio device for playback. " + "You don't have permission to open the device.")), + GST_ERROR_SYSTEM); + return FALSE; + } +open_failed: + { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, + (_("Could not open audio device for playback.")), GST_ERROR_SYSTEM); + return FALSE; + } +} + +static gboolean +gst_oss_sink_close (GstAudioSink * asink) +{ + close (GST_OSSSINK (asink)->fd); + GST_OSSSINK (asink)->fd = -1; + return TRUE; +} + +static gboolean +gst_oss_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) +{ + GstOssSink *oss; + struct audio_buf_info info; + int mode; + int tmp; + + oss = GST_OSSSINK (asink); + + /* we opened non-blocking so that we can detect if the device is available + * without hanging forever. We now want to remove the non-blocking flag. */ + mode = fcntl (oss->fd, F_GETFL); + mode &= ~O_NONBLOCK; + if (fcntl (oss->fd, F_SETFL, mode) == -1) { + /* some drivers do no support unsetting the non-blocking flag, try to + * close/open the device then. This is racy but we error out properly. */ + gst_oss_sink_close (asink); + if ((oss->fd = open (oss->device, O_WRONLY, 0)) == -1) + goto non_block; + } + + tmp = gst_oss_sink_get_format (spec->format); + if (tmp == 0) + goto wrong_format; + + if (spec->width != 16 && spec->width != 8) + goto dodgy_width; + + SET_PARAM (oss, SNDCTL_DSP_SETFMT, tmp, "SETFMT"); + if (spec->channels == 2) + SET_PARAM (oss, SNDCTL_DSP_STEREO, 1, "STEREO"); + SET_PARAM (oss, SNDCTL_DSP_CHANNELS, spec->channels, "CHANNELS"); + SET_PARAM (oss, SNDCTL_DSP_SPEED, spec->rate, "SPEED"); + + tmp = ilog2 (spec->segsize); + tmp = ((spec->segtotal & 0x7fff) << 16) | tmp; + GST_DEBUG_OBJECT (oss, "set segsize: %d, segtotal: %d, value: %08x", + spec->segsize, spec->segtotal, tmp); + + SET_PARAM (oss, SNDCTL_DSP_SETFRAGMENT, tmp, "SETFRAGMENT"); + GET_PARAM (oss, SNDCTL_DSP_GETOSPACE, &info, "GETOSPACE"); + + spec->segsize = info.fragsize; + spec->segtotal = info.fragstotal; + + spec->bytes_per_sample = (spec->width / 8) * spec->channels; + oss->bytes_per_sample = (spec->width / 8) * spec->channels; + + GST_DEBUG_OBJECT (oss, "got segsize: %d, segtotal: %d, value: %08x", + spec->segsize, spec->segtotal, tmp); + + return TRUE; + + /* ERRORS */ +non_block: + { + GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), + ("Unable to set device %s in non blocking mode: %s", + oss->device, g_strerror (errno))); + return FALSE; + } +wrong_format: + { + GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), + ("Unable to get format %d", spec->format)); + return FALSE; + } +dodgy_width: + { + GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), + ("unexpected width %d", spec->width)); + return FALSE; + } +} + +static gboolean +gst_oss_sink_unprepare (GstAudioSink * asink) +{ + /* could do a SNDCTL_DSP_RESET, but the OSS manual recommends a close/open */ + + if (!gst_oss_sink_close (asink)) + goto couldnt_close; + + if (!gst_oss_sink_open (asink)) + goto couldnt_reopen; + + return TRUE; + + /* ERRORS */ +couldnt_close: + { + GST_DEBUG_OBJECT (asink, "Could not close the audio device"); + return FALSE; + } +couldnt_reopen: + { + GST_DEBUG_OBJECT (asink, "Could not reopen the audio device"); + return FALSE; + } +} + +static guint +gst_oss_sink_write (GstAudioSink * asink, gpointer data, guint length) +{ + return write (GST_OSSSINK (asink)->fd, data, length); +} + +static guint +gst_oss_sink_delay (GstAudioSink * asink) +{ + GstOssSink *oss; + gint delay = 0; + gint ret; + + oss = GST_OSSSINK (asink); + +#ifdef SNDCTL_DSP_GETODELAY + ret = ioctl (oss->fd, SNDCTL_DSP_GETODELAY, &delay); +#else + ret = -1; +#endif + if (ret < 0) { + audio_buf_info info; + + ret = ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &info); + + delay = (ret < 0 ? 0 : (info.fragstotal * info.fragsize) - info.bytes); + } + return delay / oss->bytes_per_sample; +} + +static void +gst_oss_sink_reset (GstAudioSink * asink) +{ + /* There's nothing we can do here really: OSS can't handle access to the + * same device/fd from multiple threads and might deadlock or blow up in + * other ways if we try an ioctl SNDCTL_DSP_RESET or similar */ +} diff --git a/sys/oss/gstosssink.h b/sys/oss/gstosssink.h new file mode 100644 index 0000000..bb2ca93 --- /dev/null +++ b/sys/oss/gstosssink.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * + * gstosssink.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __GST_OSSSINK_H__ +#define __GST_OSSSINK_H__ + + +#include +#include + +#include "gstosshelper.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSSSINK (gst_oss_sink_get_type()) +#define GST_OSSSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSSSINK,GstOssSink)) +#define GST_OSSSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSSSINK,GstOssSinkClass)) +#define GST_IS_OSSSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSSINK)) +#define GST_IS_OSSSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSSINK)) + +typedef struct _GstOssSink GstOssSink; +typedef struct _GstOssSinkClass GstOssSinkClass; + +struct _GstOssSink { + GstAudioSink sink; + + gchar *device; + gint fd; + gint bytes_per_sample; + + GstCaps *probed_caps; +}; + +struct _GstOssSinkClass { + GstAudioSinkClass parent_class; +}; + +GType gst_oss_sink_get_type(void); + +G_END_DECLS + +#endif /* __GST_OSSSINK_H__ */ diff --git a/sys/oss/gstosssrc.c b/sys/oss/gstosssrc.c new file mode 100644 index 0000000..2bd931b --- /dev/null +++ b/sys/oss/gstosssrc.c @@ -0,0 +1,537 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000,2005 Wim Taymans + * + * gstosssrc.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. + */ + +/** + * SECTION:element-osssrc + * + * This element lets you record sound using the Open Sound System (OSS). + * + * + * Example pipelines + * |[ + * gst-launch -v osssrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=mymusic.ogg + * ]| will record sound from your sound card using OSS and encode it to an + * Ogg/Vorbis file (this will only work if your mixer settings are right + * and the right inputs enabled etc.) + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#ifdef HAVE_OSS_INCLUDE_IN_SYS +# include +#else +# ifdef HAVE_OSS_INCLUDE_IN_ROOT +# include +# else +# ifdef HAVE_OSS_INCLUDE_IN_MACHINE +# include +# else +# error "What to include?" +# endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ +# endif /* HAVE_OSS_INCLUDE_IN_ROOT */ +#endif /* HAVE_OSS_INCLUDE_IN_SYS */ + +#include "gstosssrc.h" +#include "common.h" + +#include + +GST_DEBUG_CATEGORY_EXTERN (oss_debug); +#define GST_CAT_DEFAULT oss_debug + +#define DEFAULT_DEVICE "/dev/dsp" +#define DEFAULT_DEVICE_NAME "" + +enum +{ + PROP_0, + PROP_DEVICE, + PROP_DEVICE_NAME, +}; + +GST_BOILERPLATE_WITH_INTERFACE (GstOssSrc, gst_oss_src, GstAudioSrc, + GST_TYPE_AUDIO_SRC, GstMixer, GST_TYPE_MIXER, gst_oss_src_mixer); + +GST_IMPLEMENT_OSS_MIXER_METHODS (GstOssSrc, gst_oss_src_mixer); + +static void gst_oss_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_oss_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static void gst_oss_src_dispose (GObject * object); +static void gst_oss_src_finalize (GstOssSrc * osssrc); + +static GstCaps *gst_oss_src_getcaps (GstBaseSrc * bsrc); + +static gboolean gst_oss_src_open (GstAudioSrc * asrc); +static gboolean gst_oss_src_close (GstAudioSrc * asrc); +static gboolean gst_oss_src_prepare (GstAudioSrc * asrc, + GstRingBufferSpec * spec); +static gboolean gst_oss_src_unprepare (GstAudioSrc * asrc); +static guint gst_oss_src_read (GstAudioSrc * asrc, gpointer data, guint length); +static guint gst_oss_src_delay (GstAudioSrc * asrc); +static void gst_oss_src_reset (GstAudioSrc * asrc); + + + +static GstStaticPadTemplate osssrc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) { " G_STRINGIFY (G_BYTE_ORDER) " }, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " + "audio/x-raw-int, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) 8, " + "depth = (int) 8, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") + ); + + +static void +gst_oss_src_dispose (GObject * object) +{ + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_oss_src_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Audio Source (OSS)", + "Source/Audio", + "Capture from a sound card via OSS", + "Erik Walthinsen , " "Wim Taymans "); + + gst_element_class_add_static_pad_template (element_class, + &osssrc_src_factory); +} + +static void +gst_oss_src_class_init (GstOssSrcClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + GstAudioSrcClass *gstaudiosrc_class; + + gobject_class = (GObjectClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstaudiosrc_class = (GstAudioSrcClass *) klass; + + gobject_class->dispose = gst_oss_src_dispose; + gobject_class->finalize = (GObjectFinalizeFunc) gst_oss_src_finalize; + gobject_class->get_property = gst_oss_src_get_property; + gobject_class->set_property = gst_oss_src_set_property; + + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss_src_getcaps); + + gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_oss_src_open); + gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_oss_src_prepare); + gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss_src_unprepare); + gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_oss_src_close); + gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_oss_src_read); + gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_oss_src_delay); + gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_oss_src_reset); + + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "OSS device (usually /dev/dspN)", DEFAULT_DEVICE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_oss_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOssSrc *src; + + src = GST_OSS_SRC (object); + + switch (prop_id) { + case PROP_DEVICE: + if (src->device) + g_free (src->device); + src->device = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_oss_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOssSrc *src; + + src = GST_OSS_SRC (object); + + switch (prop_id) { + case PROP_DEVICE: + g_value_set_string (value, src->device); + break; + case PROP_DEVICE_NAME: + g_value_set_string (value, src->device_name); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_oss_src_init (GstOssSrc * osssrc, GstOssSrcClass * g_class) +{ + const gchar *device; + + GST_DEBUG ("initializing osssrc"); + + device = g_getenv ("AUDIODEV"); + if (device == NULL) + device = DEFAULT_DEVICE; + + osssrc->fd = -1; + osssrc->device = g_strdup (device); + osssrc->device_name = g_strdup (DEFAULT_DEVICE_NAME); + osssrc->probed_caps = NULL; +} + +static void +gst_oss_src_finalize (GstOssSrc * osssrc) +{ + g_free (osssrc->device); + g_free (osssrc->device_name); + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (osssrc)); +} + +static GstCaps * +gst_oss_src_getcaps (GstBaseSrc * bsrc) +{ + GstOssSrc *osssrc; + GstCaps *caps; + + osssrc = GST_OSS_SRC (bsrc); + + if (osssrc->fd == -1) { + GST_DEBUG_OBJECT (osssrc, "device not open, using template caps"); + return NULL; /* base class will get template caps for us */ + } + + if (osssrc->probed_caps) { + GST_LOG_OBJECT (osssrc, "Returning cached caps"); + return gst_caps_ref (osssrc->probed_caps); + } + + caps = gst_oss_helper_probe_caps (osssrc->fd); + + if (caps) { + osssrc->probed_caps = gst_caps_ref (caps); + } + + GST_INFO_OBJECT (osssrc, "returning caps %" GST_PTR_FORMAT, caps); + + return caps; +} + +static gint +ilog2 (gint x) +{ + /* well... hacker's delight explains... */ + x = x | (x >> 1); + x = x | (x >> 2); + x = x | (x >> 4); + x = x | (x >> 8); + x = x | (x >> 16); + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0f0f0f0f; + x = x + (x >> 8); + x = x + (x >> 16); + return (x & 0x0000003f) - 1; +} + +static gint +gst_oss_src_get_format (GstBufferFormat fmt) +{ + gint result; + + switch (fmt) { + case GST_MU_LAW: + result = AFMT_MU_LAW; + break; + case GST_A_LAW: + result = AFMT_A_LAW; + break; + case GST_IMA_ADPCM: + result = AFMT_IMA_ADPCM; + break; + case GST_U8: + result = AFMT_U8; + break; + case GST_S16_LE: + result = AFMT_S16_LE; + break; + case GST_S16_BE: + result = AFMT_S16_BE; + break; + case GST_S8: + result = AFMT_S8; + break; + case GST_U16_LE: + result = AFMT_U16_LE; + break; + case GST_U16_BE: + result = AFMT_U16_BE; + break; + case GST_MPEG: + result = AFMT_MPEG; + break; + default: + result = 0; + break; + } + return result; +} + +static gboolean +gst_oss_src_open (GstAudioSrc * asrc) +{ + GstOssSrc *oss; + int mode; + + oss = GST_OSS_SRC (asrc); + + mode = O_RDONLY; + mode |= O_NONBLOCK; + + oss->fd = open (oss->device, mode, 0); + if (oss->fd == -1) { + switch (errno) { + case EACCES: + goto no_permission; + default: + goto open_failed; + } + } + + if (!oss->mixer) { + oss->mixer = gst_ossmixer_new ("/dev/mixer", GST_OSS_MIXER_CAPTURE); + + if (oss->mixer) { + g_free (oss->device_name); + oss->device_name = g_strdup (oss->mixer->cardname); + } + } + return TRUE; + +no_permission: + { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, + (_("Could not open audio device for recording. " + "You don't have permission to open the device.")), + GST_ERROR_SYSTEM); + return FALSE; + } +open_failed: + { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, + (_("Could not open audio device for recording.")), + ("Unable to open device %s for recording: %s", + oss->device, g_strerror (errno))); + return FALSE; + } +} + +static gboolean +gst_oss_src_close (GstAudioSrc * asrc) +{ + GstOssSrc *oss; + + oss = GST_OSS_SRC (asrc); + + close (oss->fd); + + if (oss->mixer) { + gst_ossmixer_free (oss->mixer); + oss->mixer = NULL; + } + + gst_caps_replace (&oss->probed_caps, NULL); + + return TRUE; +} + +static gboolean +gst_oss_src_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) +{ + GstOssSrc *oss; + struct audio_buf_info info; + int mode; + int fmt, tmp; + + oss = GST_OSS_SRC (asrc); + + mode = fcntl (oss->fd, F_GETFL); + mode &= ~O_NONBLOCK; + if (fcntl (oss->fd, F_SETFL, mode) == -1) + goto non_block; + + fmt = gst_oss_src_get_format (spec->format); + if (fmt == 0) + goto wrong_format; + + tmp = ilog2 (spec->segsize); + tmp = ((spec->segtotal & 0x7fff) << 16) | tmp; + GST_DEBUG_OBJECT (oss, "set segsize: %d, segtotal: %d, value: %08x", + spec->segsize, spec->segtotal, tmp); + + SET_PARAM (oss, SNDCTL_DSP_SETFRAGMENT, tmp, "SETFRAGMENT"); + + SET_PARAM (oss, SNDCTL_DSP_RESET, 0, "RESET"); + + SET_PARAM (oss, SNDCTL_DSP_SETFMT, fmt, "SETFMT"); + if (spec->channels == 2) + SET_PARAM (oss, SNDCTL_DSP_STEREO, 1, "STEREO"); + SET_PARAM (oss, SNDCTL_DSP_CHANNELS, spec->channels, "CHANNELS"); + SET_PARAM (oss, SNDCTL_DSP_SPEED, spec->rate, "SPEED"); + + GET_PARAM (oss, SNDCTL_DSP_GETISPACE, &info, "GETISPACE"); + + spec->segsize = info.fragsize; + spec->segtotal = info.fragstotal; + + if (spec->width != 16 && spec->width != 8) + goto dodgy_width; + + spec->bytes_per_sample = (spec->width / 8) * spec->channels; + oss->bytes_per_sample = (spec->width / 8) * spec->channels; + memset (spec->silence_sample, 0, spec->bytes_per_sample); + + GST_DEBUG_OBJECT (oss, "got segsize: %d, segtotal: %d, value: %08x", + spec->segsize, spec->segtotal, tmp); + + return TRUE; + +non_block: + { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, + ("Unable to set device %s in non blocking mode: %s", + oss->device, g_strerror (errno)), (NULL)); + return FALSE; + } +wrong_format: + { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, + ("Unable to get format %d", spec->format), (NULL)); + return FALSE; + } +dodgy_width: + { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, + ("Unexpected width %d", spec->width), (NULL)); + return FALSE; + } +} + +static gboolean +gst_oss_src_unprepare (GstAudioSrc * asrc) +{ + /* could do a SNDCTL_DSP_RESET, but the OSS manual recommends a close/open */ + + if (!gst_oss_src_close (asrc)) + goto couldnt_close; + + if (!gst_oss_src_open (asrc)) + goto couldnt_reopen; + + return TRUE; + +couldnt_close: + { + GST_DEBUG_OBJECT (asrc, "Could not close the audio device"); + return FALSE; + } +couldnt_reopen: + { + GST_DEBUG_OBJECT (asrc, "Could not reopen the audio device"); + return FALSE; + } +} + +static guint +gst_oss_src_read (GstAudioSrc * asrc, gpointer data, guint length) +{ + return read (GST_OSS_SRC (asrc)->fd, data, length); +} + +static guint +gst_oss_src_delay (GstAudioSrc * asrc) +{ + GstOssSrc *oss; + gint delay = 0; + gint ret; + + oss = GST_OSS_SRC (asrc); + +#ifdef SNDCTL_DSP_GETODELAY + ret = ioctl (oss->fd, SNDCTL_DSP_GETODELAY, &delay); +#else + ret = -1; +#endif + if (ret < 0) { + audio_buf_info info; + + ret = ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &info); + + delay = (ret < 0 ? 0 : (info.fragstotal * info.fragsize) - info.bytes); + } + return delay / oss->bytes_per_sample; +} + +static void +gst_oss_src_reset (GstAudioSrc * asrc) +{ + /* There's nothing we can do here really: OSS can't handle access to the + * same device/fd from multiple threads and might deadlock or blow up in + * other ways if we try an ioctl SNDCTL_DSP_RESET or similar */ +} diff --git a/sys/oss/gstosssrc.h b/sys/oss/gstosssrc.h new file mode 100644 index 0000000..0d14613 --- /dev/null +++ b/sys/oss/gstosssrc.h @@ -0,0 +1,67 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * + * gstosssrc.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __GST_OSS_SRC_H__ +#define __GST_OSS_SRC_H__ + + +#include +#include + +#include "gstosshelper.h" +#include "gstossmixer.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSS_SRC (gst_oss_src_get_type()) +#define GST_OSS_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS_SRC,GstOssSrc)) +#define GST_OSS_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS_SRC,GstOssSrcClass)) +#define GST_IS_OSS_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS_SRC)) +#define GST_IS_OSS_SRC_CLASS(klas) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS_SRC)) + +typedef struct _GstOssSrc GstOssSrc; +typedef struct _GstOssSrcClass GstOssSrcClass; + +struct _GstOssSrc { + GstAudioSrc src; + + gint fd; + gint bytes_per_sample; + + gchar *device; + gchar *device_name; + + GstCaps *probed_caps; + + GstOssMixer *mixer; +}; + +struct _GstOssSrcClass { + GstAudioSrcClass parent_class; +}; + +GType gst_oss_src_get_type(void); + +G_END_DECLS + +#endif /* __GST_OSS_SRC_H__ */ diff --git a/sys/oss4/Makefile.am b/sys/oss4/Makefile.am new file mode 100644 index 0000000..955e903 --- /dev/null +++ b/sys/oss4/Makefile.am @@ -0,0 +1,33 @@ +plugin_LTLIBRARIES = libgstoss4audio.la + +libgstoss4audio_la_SOURCES = \ + oss4-audio.c \ + oss4-mixer.c \ + oss4-mixer-enum.c \ + oss4-mixer-slider.c \ + oss4-mixer-switch.c \ + oss4-property-probe.c \ + oss4-sink.c \ + oss4-source.c + +libgstoss4audio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstoss4audio_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstinterfaces-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_LIBS) +libgstoss4audio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstoss4audio_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = \ + oss4-audio.h \ + oss4-mixer.h \ + oss4-mixer-enum.h \ + oss4-mixer-slider.h \ + oss4-mixer-switch.h \ + oss4-property-probe.h \ + oss4-sink.h \ + oss4-soundcard.h \ + oss4-source.h + + diff --git a/sys/oss4/Makefile.in b/sys/oss4/Makefile.in new file mode 100644 index 0000000..3cda65b --- /dev/null +++ b/sys/oss4/Makefile.in @@ -0,0 +1,892 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = sys/oss4 +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstoss4audio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstoss4audio_la_OBJECTS = libgstoss4audio_la-oss4-audio.lo \ + libgstoss4audio_la-oss4-mixer.lo \ + libgstoss4audio_la-oss4-mixer-enum.lo \ + libgstoss4audio_la-oss4-mixer-slider.lo \ + libgstoss4audio_la-oss4-mixer-switch.lo \ + libgstoss4audio_la-oss4-property-probe.lo \ + libgstoss4audio_la-oss4-sink.lo \ + libgstoss4audio_la-oss4-source.lo +libgstoss4audio_la_OBJECTS = $(am_libgstoss4audio_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstoss4audio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) \ + $(libgstoss4audio_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstoss4audio_la_SOURCES) +DIST_SOURCES = $(libgstoss4audio_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstoss4audio.la +libgstoss4audio_la_SOURCES = \ + oss4-audio.c \ + oss4-mixer.c \ + oss4-mixer-enum.c \ + oss4-mixer-slider.c \ + oss4-mixer-switch.c \ + oss4-property-probe.c \ + oss4-sink.c \ + oss4-source.c + +libgstoss4audio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstoss4audio_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstinterfaces-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ + $(GST_LIBS) + +libgstoss4audio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstoss4audio_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = \ + oss4-audio.h \ + oss4-mixer.h \ + oss4-mixer-enum.h \ + oss4-mixer-slider.h \ + oss4-mixer-switch.h \ + oss4-property-probe.h \ + oss4-sink.h \ + oss4-soundcard.h \ + oss4-source.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/oss4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/oss4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstoss4audio.la: $(libgstoss4audio_la_OBJECTS) $(libgstoss4audio_la_DEPENDENCIES) $(EXTRA_libgstoss4audio_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstoss4audio_la_LINK) -rpath $(plugindir) $(libgstoss4audio_la_OBJECTS) $(libgstoss4audio_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-audio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-mixer-enum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-mixer-slider.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-mixer-switch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-mixer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-property-probe.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-sink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-source.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstoss4audio_la-oss4-audio.lo: oss4-audio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-audio.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-audio.Tpo -c -o libgstoss4audio_la-oss4-audio.lo `test -f 'oss4-audio.c' || echo '$(srcdir)/'`oss4-audio.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-audio.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-audio.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-audio.c' object='libgstoss4audio_la-oss4-audio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-audio.lo `test -f 'oss4-audio.c' || echo '$(srcdir)/'`oss4-audio.c + +libgstoss4audio_la-oss4-mixer.lo: oss4-mixer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-mixer.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-mixer.Tpo -c -o libgstoss4audio_la-oss4-mixer.lo `test -f 'oss4-mixer.c' || echo '$(srcdir)/'`oss4-mixer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-mixer.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-mixer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-mixer.c' object='libgstoss4audio_la-oss4-mixer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-mixer.lo `test -f 'oss4-mixer.c' || echo '$(srcdir)/'`oss4-mixer.c + +libgstoss4audio_la-oss4-mixer-enum.lo: oss4-mixer-enum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-mixer-enum.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-mixer-enum.Tpo -c -o libgstoss4audio_la-oss4-mixer-enum.lo `test -f 'oss4-mixer-enum.c' || echo '$(srcdir)/'`oss4-mixer-enum.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-mixer-enum.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-mixer-enum.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-mixer-enum.c' object='libgstoss4audio_la-oss4-mixer-enum.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-mixer-enum.lo `test -f 'oss4-mixer-enum.c' || echo '$(srcdir)/'`oss4-mixer-enum.c + +libgstoss4audio_la-oss4-mixer-slider.lo: oss4-mixer-slider.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-mixer-slider.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-mixer-slider.Tpo -c -o libgstoss4audio_la-oss4-mixer-slider.lo `test -f 'oss4-mixer-slider.c' || echo '$(srcdir)/'`oss4-mixer-slider.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-mixer-slider.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-mixer-slider.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-mixer-slider.c' object='libgstoss4audio_la-oss4-mixer-slider.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-mixer-slider.lo `test -f 'oss4-mixer-slider.c' || echo '$(srcdir)/'`oss4-mixer-slider.c + +libgstoss4audio_la-oss4-mixer-switch.lo: oss4-mixer-switch.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-mixer-switch.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-mixer-switch.Tpo -c -o libgstoss4audio_la-oss4-mixer-switch.lo `test -f 'oss4-mixer-switch.c' || echo '$(srcdir)/'`oss4-mixer-switch.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-mixer-switch.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-mixer-switch.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-mixer-switch.c' object='libgstoss4audio_la-oss4-mixer-switch.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-mixer-switch.lo `test -f 'oss4-mixer-switch.c' || echo '$(srcdir)/'`oss4-mixer-switch.c + +libgstoss4audio_la-oss4-property-probe.lo: oss4-property-probe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-property-probe.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-property-probe.Tpo -c -o libgstoss4audio_la-oss4-property-probe.lo `test -f 'oss4-property-probe.c' || echo '$(srcdir)/'`oss4-property-probe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-property-probe.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-property-probe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-property-probe.c' object='libgstoss4audio_la-oss4-property-probe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-property-probe.lo `test -f 'oss4-property-probe.c' || echo '$(srcdir)/'`oss4-property-probe.c + +libgstoss4audio_la-oss4-sink.lo: oss4-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-sink.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-sink.Tpo -c -o libgstoss4audio_la-oss4-sink.lo `test -f 'oss4-sink.c' || echo '$(srcdir)/'`oss4-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-sink.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-sink.c' object='libgstoss4audio_la-oss4-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-sink.lo `test -f 'oss4-sink.c' || echo '$(srcdir)/'`oss4-sink.c + +libgstoss4audio_la-oss4-source.lo: oss4-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-source.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-source.Tpo -c -o libgstoss4audio_la-oss4-source.lo `test -f 'oss4-source.c' || echo '$(srcdir)/'`oss4-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-source.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-source.c' object='libgstoss4audio_la-oss4-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-source.lo `test -f 'oss4-source.c' || echo '$(srcdir)/'`oss4-source.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/oss4/oss4-audio.c b/sys/oss4/oss4-audio.c new file mode 100644 index 0000000..09f8495 --- /dev/null +++ b/sys/oss4/oss4-audio.c @@ -0,0 +1,714 @@ +/* GStreamer OSS4 audio plugin + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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 +#include +#include +#include +#include +#include + +#include "gst/gst-i18n-plugin.h" +#include + +#include "oss4-audio.h" +#include "oss4-mixer.h" +#include "oss4-property-probe.h" +#include "oss4-sink.h" +#include "oss4-source.h" +#include "oss4-soundcard.h" + +GST_DEBUG_CATEGORY (oss4mixer_debug); +GST_DEBUG_CATEGORY (oss4sink_debug); +GST_DEBUG_CATEGORY (oss4src_debug); +GST_DEBUG_CATEGORY (oss4_debug); + +#define GST_CAT_DEFAULT oss4_debug + +typedef struct +{ + const GstBufferFormat gst_fmt; + const gint oss_fmt; + const gchar name[16]; + const gint depth; + const gint width; + const gint endianness; + const gboolean signedness; +} GstOss4AudioFormat; + +/* *INDENT-OFF* */ +static const GstOss4AudioFormat fmt_map[] = { + /* note: keep sorted by preference, prefered formats first */ + { + GST_MU_LAW, AFMT_MU_LAW, "audio/x-mulaw", 0, 0, 0, FALSE}, { + GST_A_LAW, AFMT_A_LAW, "audio/x-alaw", 0, 0, 0, FALSE}, { + GST_S32_LE, AFMT_S32_LE, "audio/x-raw-int", 32, 32, G_LITTLE_ENDIAN, TRUE}, { + GST_S32_BE, AFMT_S32_BE, "audio/x-raw-int", 32, 32, G_BIG_ENDIAN, TRUE}, { + GST_S24_LE, AFMT_S24_LE, "audio/x-raw-int", 24, 32, G_LITTLE_ENDIAN, TRUE}, { + GST_S24_BE, AFMT_S24_BE, "audio/x-raw-int", 24, 32, G_BIG_ENDIAN, TRUE}, { + GST_S24_3LE, AFMT_S24_PACKED, "audio/x-raw-int", 24, 24, G_LITTLE_ENDIAN, + TRUE}, { + GST_S16_LE, AFMT_S16_LE, "audio/x-raw-int", 16, 16, G_LITTLE_ENDIAN, TRUE}, { + GST_S16_BE, AFMT_S16_BE, "audio/x-raw-int", 16, 16, G_BIG_ENDIAN, TRUE}, { + GST_U16_LE, AFMT_U16_LE, "audio/x-raw-int", 16, 16, G_LITTLE_ENDIAN, FALSE}, { + GST_U16_BE, AFMT_U16_BE, "audio/x-raw-int", 16, 16, G_BIG_ENDIAN, FALSE}, { + GST_S8, AFMT_S8, "audio/x-raw-int", 8, 8, 0, TRUE}, { + GST_U8, AFMT_U8, "audio/x-raw-int", 8, 8, 0, FALSE} +}; +/* *INDENT-ON* */ + +/* formats we assume the OSS4 layer can always handle and convert internally */ +#define CONVERTIBLE_FORMATS ( \ + AFMT_MU_LAW | AFMT_A_LAW | \ + AFMT_S32_LE | AFMT_S32_BE | \ + AFMT_S24_LE | AFMT_S24_BE | \ + AFMT_S24_PACKED | \ + AFMT_S16_LE | AFMT_S16_BE | \ + AFMT_U16_LE | AFMT_U16_BE | \ + AFMT_S8 | AFMT_U8 ) + +static void +gst_oss4_append_format_to_caps (const GstOss4AudioFormat * fmt, GstCaps * caps) +{ + GstStructure *s; + + s = gst_structure_empty_new (fmt->name); + if (fmt->width != 0 && fmt->depth != 0) { + gst_structure_set (s, "width", G_TYPE_INT, fmt->width, "depth", G_TYPE_INT, + fmt->depth, "signed", G_TYPE_BOOLEAN, fmt->signedness, NULL); + } + if (fmt->endianness != 0) { + gst_structure_set (s, "endianness", G_TYPE_INT, fmt->endianness, NULL); + } + gst_caps_append_structure (caps, s); +} + +static gint +gst_oss4_audio_get_oss_format (GstBufferFormat fmt) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { + if (fmt_map[i].gst_fmt == fmt) + return fmt_map[i].oss_fmt; + } + return 0; +} + +/* These are pretty random */ +#define GST_OSS4_MIN_SAMPLE_RATE 1 +#define GST_OSS4_MAX_SAMPLE_RATE 192000 + +static gboolean +gst_oss4_audio_detect_rates (GstObject * obj, oss_audioinfo * ai, + GstCaps * caps) +{ + GValue val = { 0, }; + int minrate, maxrate, i; + + minrate = ai->min_rate; + maxrate = ai->max_rate; + + /* sanity check */ + if (minrate > maxrate) { + GST_WARNING_OBJECT (obj, "min_rate %d > max_rate %d (buggy driver?)", + minrate, maxrate); + maxrate = ai->min_rate; /* swap */ + minrate = ai->max_rate; + } + + /* limit to something sensible */ + if (minrate < GST_OSS4_MIN_SAMPLE_RATE) + minrate = GST_OSS4_MIN_SAMPLE_RATE; + if (maxrate > GST_OSS4_MAX_SAMPLE_RATE) + maxrate = GST_OSS4_MAX_SAMPLE_RATE; + + if (maxrate < GST_OSS4_MIN_SAMPLE_RATE) { + GST_WARNING_OBJECT (obj, "max_rate < %d, which makes no sense", + GST_OSS4_MIN_SAMPLE_RATE); + return FALSE; + } + + GST_LOG_OBJECT (obj, "min_rate %d, max_rate %d (originally: %d, %d)", + minrate, maxrate, ai->min_rate, ai->max_rate); + + if ((ai->caps & PCM_CAP_FREERATE)) { + GST_LOG_OBJECT (obj, "device supports any sample rate between min and max"); + if (minrate == maxrate) { + g_value_init (&val, G_TYPE_INT); + g_value_set_int (&val, maxrate); + } else { + g_value_init (&val, GST_TYPE_INT_RANGE); + gst_value_set_int_range (&val, minrate, maxrate); + } + } else { + GST_LOG_OBJECT (obj, "%d sample rates:", ai->nrates); + g_value_init (&val, GST_TYPE_LIST); + for (i = 0; i < ai->nrates; ++i) { + GST_LOG_OBJECT (obj, " rate: %d", ai->rates[i]); + + if (ai->rates[i] >= minrate && ai->rates[i] <= maxrate) { + GValue rate_val = { 0, }; + + g_value_init (&rate_val, G_TYPE_INT); + g_value_set_int (&rate_val, ai->rates[i]); + gst_value_list_append_value (&val, &rate_val); + g_value_unset (&rate_val); + } + } + + if (gst_value_list_get_size (&val) == 0) { + g_value_unset (&val); + return FALSE; + } + } + + for (i = 0; i < gst_caps_get_size (caps); ++i) { + GstStructure *s; + + s = gst_caps_get_structure (caps, i); + gst_structure_set_value (s, "rate", &val); + } + + g_value_unset (&val); + + return TRUE; +} + +static void +gst_oss4_audio_add_channel_layout (GstObject * obj, guint64 layout, + guint num_channels, GstStructure * s) +{ + const GstAudioChannelPosition pos_map[16] = { + GST_AUDIO_CHANNEL_POSITION_NONE, /* 0 = dunno */ + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, /* 1 = left */ + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, /* 2 = right */ + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, /* 3 = center */ + GST_AUDIO_CHANNEL_POSITION_LFE, /* 4 = lfe */ + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, /* 5 = left surround */ + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, /* 6 = right surround */ + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, /* 7 = left rear */ + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, /* 8 = right rear */ + GST_AUDIO_CHANNEL_POSITION_NONE, + GST_AUDIO_CHANNEL_POSITION_NONE, + GST_AUDIO_CHANNEL_POSITION_NONE, + GST_AUDIO_CHANNEL_POSITION_NONE, + GST_AUDIO_CHANNEL_POSITION_NONE, + GST_AUDIO_CHANNEL_POSITION_NONE, + GST_AUDIO_CHANNEL_POSITION_NONE + }; + GstAudioChannelPosition ch_layout[8] = { 0, }; + guint speaker_pos; /* speaker position as defined by OSS */ + guint i; + + g_return_if_fail (num_channels <= G_N_ELEMENTS (ch_layout)); + + for (i = 0; i < num_channels; ++i) { + /* layout contains up to 16 speaker positions, with each taking up 4 bits */ + speaker_pos = (guint) ((layout >> (i * 4)) & 0x0f); + + /* if it's a channel position that's unknown to us, set all to NONE and + * bail out */ + if (G_UNLIKELY (pos_map[speaker_pos] == GST_AUDIO_CHANNEL_POSITION_NONE)) + goto no_layout; + + ch_layout[i] = pos_map[speaker_pos]; + } + gst_audio_set_channel_positions (s, ch_layout); + return; + +no_layout: + { + /* only warn if it's really unknown, position 0 is ok and represents NONE + * (in which case we also just set all others to NONE ignoring the other + * positions in the OSS-given layout, because that's what we currently + * require in GStreamer) */ + if (speaker_pos != 0) { + GST_WARNING_OBJECT (obj, "unknown OSS channel position %x", ch_layout[i]); + } + for (i = 0; i < num_channels; ++i) { + ch_layout[i] = GST_AUDIO_CHANNEL_POSITION_NONE; + } + gst_audio_set_channel_positions (s, ch_layout); + return; + } +} + +/* arbitrary max. limit */ +#define GST_OSS4_MIN_CHANNELS 1 +#define GST_OSS4_MAX_CHANNELS 4096 + +/* takes ownership of the input caps */ +static GstCaps * +gst_oss4_audio_detect_channels (GstObject * obj, int fd, oss_audioinfo * ai, + GstCaps * in_caps) +{ + const gchar *forced_layout; + GstStructure *s = NULL; + guint64 layout = 0; + GstCaps *chan_caps = NULL; + GstCaps *out_caps = NULL; + int minchans, maxchans; + int c, i, j; + + /* GST_OSS4_CHANNEL_LAYOUT environment variable: may be used to force a + * particular channel layout (if it contains an odd number of channel + * positions it will also make us advertise a channel layout for that + * channel count, even if we'd usually skip it; this is especially useful + * for folks with 2.1 speakers, I guess) */ + forced_layout = g_getenv ("GST_OSS4_CHANNEL_LAYOUT"); + + minchans = ai->min_channels; + maxchans = ai->max_channels; + + /* sanity check */ + if (minchans > maxchans) { + GST_WARNING_OBJECT (obj, "min_chans %d > max_chans %d (buggy driver?)", + minchans, maxchans); + maxchans = ai->min_channels; /* swap */ + minchans = ai->max_channels; + } + + /* limit to something sensible */ + if (minchans < GST_OSS4_MIN_CHANNELS) + minchans = GST_OSS4_MIN_CHANNELS; + if (maxchans > GST_OSS4_MAX_CHANNELS) + maxchans = GST_OSS4_MAX_CHANNELS; + + if (maxchans < GST_OSS4_MIN_CHANNELS) { + GST_WARNING_OBJECT (obj, "max_chans < %d, which makes no sense", + GST_OSS4_MIN_CHANNELS); + gst_caps_unref (in_caps); + return NULL; + } + + GST_LOG_OBJECT (obj, "min_channels %d, max_channels %d (originally: %d, %d)", + minchans, maxchans, ai->min_channels, ai->max_channels); + + chan_caps = gst_caps_new_empty (); + + /* first do the simple cases: mono + stereo (channel layout implied) */ + if (minchans == 1 && maxchans == 1) + s = gst_structure_new ("x", "channels", G_TYPE_INT, 1, NULL); + else if (minchans == 2 && maxchans >= 2) + s = gst_structure_new ("x", "channels", G_TYPE_INT, 2, NULL); + else if (minchans == 1 && maxchans >= 2) + s = gst_structure_new ("x", "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); + gst_caps_append_structure (chan_caps, s); + s = NULL; + + /* TODO: we assume all drivers use a left/right layout for stereo here */ + if (maxchans <= 2) + goto done; + + if (ioctl (fd, SNDCTL_DSP_GET_CHNORDER, &layout) == -1) { + GST_WARNING_OBJECT (obj, "couldn't query channel layout, assuming default"); + layout = CHNORDER_NORMAL; + } + GST_DEBUG_OBJECT (obj, "channel layout: %08" G_GINT64_MODIFIER "x", layout); + + /* e.g. forced 2.1 layout would be GST_OSS4_CHANNEL_LAYOUT=421 */ + if (forced_layout != NULL && *forced_layout != '\0') { + guint layout_len; + + layout_len = strlen (forced_layout); + if (layout_len >= minchans && layout_len <= maxchans) { + layout = g_ascii_strtoull (forced_layout, NULL, 16); + maxchans = layout_len; + GST_DEBUG_OBJECT (obj, "forced channel layout: %08" G_GINT64_MODIFIER "x" + " ('%s'), maxchans now %d", layout, forced_layout, maxchans); + } else { + GST_WARNING_OBJECT (obj, "ignoring forced channel layout: layout has %d " + "channel positions but maxchans is %d", layout_len, maxchans); + } + } + + /* need to advertise channel layouts for anything >2 and <=8 channels */ + for (c = MAX (3, minchans); c <= MIN (maxchans, 8); c++) { + /* "The min_channels and max_channels fields define the limits for the + * number of channels. However some devices don't support all channels + * within this range. It's possible that the odd values (3, 5, 7, 9, etc). + * are not supported. There is currently no way to check for this other + * than checking if SNDCTL_DSP_CHANNELS accepts the requested value. + * Another approach is trying to avoid using odd number of channels." + * + * So, we don't know for sure if these odd values are supported: + */ + if ((c == 3 || c == 5 || c == 7) && (c != maxchans)) { + GST_LOG_OBJECT (obj, "not adding layout with %d channels", c); + continue; + } + + s = gst_structure_new ("x", "channels", G_TYPE_INT, c, NULL); + gst_oss4_audio_add_channel_layout (obj, layout, c, s); + GST_LOG_OBJECT (obj, "c=%u, appending struct %" GST_PTR_FORMAT, c, s); + gst_caps_append_structure (chan_caps, s); + s = NULL; + } + + if (maxchans <= 8) + goto done; + + /* for everything >8 channels, CHANNEL_POSITION_NONE is implied. */ + if (minchans == maxchans || maxchans == 9) { + s = gst_structure_new ("x", "channels", G_TYPE_INT, maxchans, NULL); + } else { + s = gst_structure_new ("x", "channels", GST_TYPE_INT_RANGE, + MAX (9, minchans), maxchans, NULL); + } + gst_caps_append_structure (chan_caps, s); + s = NULL; + +done: + + GST_LOG_OBJECT (obj, "channel structures: %" GST_PTR_FORMAT, chan_caps); + + out_caps = gst_caps_new_empty (); + + /* combine each structure in the input caps with each channel caps struct */ + for (i = 0; i < gst_caps_get_size (in_caps); ++i) { + const GstStructure *in_s; + + in_s = gst_caps_get_structure (in_caps, i); + + for (j = 0; j < gst_caps_get_size (chan_caps); ++j) { + const GstStructure *chan_s; + const GValue *val; + + s = gst_structure_copy (in_s); + chan_s = gst_caps_get_structure (chan_caps, j); + if ((val = gst_structure_get_value (chan_s, "channels"))) + gst_structure_set_value (s, "channels", val); + if ((val = gst_structure_get_value (chan_s, "channel-positions"))) + gst_structure_set_value (s, "channel-positions", val); + + gst_caps_append_structure (out_caps, s); + s = NULL; + } + } + + gst_caps_unref (in_caps); + gst_caps_unref (chan_caps); + return out_caps; +} + +GstCaps * +gst_oss4_audio_probe_caps (GstObject * obj, int fd) +{ + oss_audioinfo ai = { 0, }; + gboolean output; + GstCaps *caps; + int nonnative_formats = 0; + int formats, i; + + output = GST_IS_OSS4_SINK (obj); + + /* -1 = get info for currently open device (fd). This will fail with + * OSS build <= 1013 because of a bug in OSS */ + ai.dev = -1; + if (ioctl (fd, SNDCTL_ENGINEINFO, &ai) == -1) + goto engineinfo_failed; + + formats = (output) ? ai.oformats : ai.iformats; + + GST_LOG_OBJECT (obj, "%s formats : 0x%08x", (output) ? "out" : "in", formats); + + caps = gst_caps_new_empty (); + + /* first list all the formats natively supported */ + for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { + if ((formats & fmt_map[i].oss_fmt)) { + gst_oss4_append_format_to_caps (&fmt_map[i], caps); + } else if ((fmt_map[i].oss_fmt & CONVERTIBLE_FORMATS)) { + nonnative_formats |= fmt_map[i].oss_fmt; + } + } + + GST_LOG_OBJECT (obj, "adding non-native %s formats : 0x%08x", + (output) ? "out" : "in", nonnative_formats); + + /* now append non-native formats for which conversion would be needed */ + for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { + if ((nonnative_formats & fmt_map[i].oss_fmt)) { + gst_oss4_append_format_to_caps (&fmt_map[i], caps); + } + } + + gst_caps_do_simplify (caps); + GST_LOG_OBJECT (obj, "formats: %" GST_PTR_FORMAT, caps); + + if (!gst_oss4_audio_detect_rates (obj, &ai, caps)) + goto detect_rates_failed; + + caps = gst_oss4_audio_detect_channels (obj, fd, &ai, caps); + if (caps == NULL) + goto detect_channels_failed; + + GST_LOG_OBJECT (obj, "probed caps: %" GST_PTR_FORMAT, caps); + + return caps; + +/* ERRORS */ +engineinfo_failed: + { + GST_WARNING ("ENGINEINFO supported formats probe failed: %s", + g_strerror (errno)); + return NULL; + } +detect_rates_failed: + { + GST_WARNING_OBJECT (obj, "failed to detect supported sample rates"); + gst_caps_unref (caps); + return NULL; + } +detect_channels_failed: + { + GST_WARNING_OBJECT (obj, "failed to detect supported channels"); + gst_caps_unref (caps); + return NULL; + } +} + +GstCaps * +gst_oss4_audio_get_template_caps (void) +{ + GstCaps *caps; + gint i; + + caps = gst_caps_new_empty (); + + for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { + gst_oss4_append_format_to_caps (&fmt_map[i], caps); + } + + gst_caps_do_simplify (caps); + + for (i = 0; i < gst_caps_get_size (caps); ++i) { + GstStructure *s; + + s = gst_caps_get_structure (caps, i); + gst_structure_set (s, "rate", GST_TYPE_INT_RANGE, GST_OSS4_MIN_SAMPLE_RATE, + GST_OSS4_MAX_SAMPLE_RATE, "channels", GST_TYPE_INT_RANGE, + GST_OSS4_MIN_CHANNELS, GST_OSS4_MAX_CHANNELS, NULL); + } + + return caps; +} + +/* called by gst_oss4_sink_prepare() and gst_oss4_source_prepare() */ +gboolean +gst_oss4_audio_set_format (GstObject * obj, int fd, GstRingBufferSpec * spec) +{ + struct audio_buf_info info = { 0, }; + int fmt, chans, rate; + + fmt = gst_oss4_audio_get_oss_format (spec->format); + if (fmt == 0) + goto wrong_format; + + if (spec->type == GST_BUFTYPE_LINEAR && spec->width != 32 && + spec->width != 24 && spec->width != 16 && spec->width != 8) { + goto dodgy_width; + } + + /* format */ + GST_LOG_OBJECT (obj, "setting format: %d", fmt); + if (ioctl (fd, SNDCTL_DSP_SETFMT, &fmt) == -1) + goto set_format_failed; + + /* channels */ + GST_LOG_OBJECT (obj, "setting channels: %d", spec->channels); + chans = spec->channels; + if (ioctl (fd, SNDCTL_DSP_CHANNELS, &chans) == -1) + goto set_channels_failed; + + /* rate */ + GST_LOG_OBJECT (obj, "setting rate: %d", spec->rate); + rate = spec->rate; + if (ioctl (fd, SNDCTL_DSP_SPEED, &rate) == -1) + goto set_rate_failed; + + GST_DEBUG_OBJECT (obj, "effective format : %d", fmt); + GST_DEBUG_OBJECT (obj, "effective channels : %d", chans); + GST_DEBUG_OBJECT (obj, "effective rate : %d", rate); + + /* make sure format, channels, and rate are the ones we requested */ + if (fmt != gst_oss4_audio_get_oss_format (spec->format) || + chans != spec->channels || rate != spec->rate) { + /* This shouldn't happen, but hey */ + goto format_not_what_was_requested; + } + + if (GST_IS_OSS4_SOURCE (obj)) { + if (ioctl (fd, SNDCTL_DSP_GETISPACE, &info) == -1) + goto get_ispace_failed; + } else { + if (ioctl (fd, SNDCTL_DSP_GETOSPACE, &info) == -1) + goto get_ospace_failed; + } + + spec->segsize = info.fragsize; + + /* we add some extra fragments -- this helps us account for delays due to + * conversion buffer, streams queueing, etc. It is important that these + * be taken into account because otherwise the delay counter can wind up + * being too large, and the buffer will wrap. */ + spec->segtotal = info.fragstotal + 4; + + spec->bytes_per_sample = (spec->width / 8) * spec->channels; + + GST_DEBUG_OBJECT (obj, "got segsize: %d, segtotal: %d, value: %08x", + spec->segsize, spec->segtotal, info.fragsize); + + return TRUE; + +/* ERRORS */ +wrong_format: + { + GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), + ("Unable to get format %d", spec->format)); + return FALSE; + } +dodgy_width: + { + GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), + ("unexpected width %d", spec->width)); + return FALSE; + } +set_format_failed: + { + GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), + ("DSP_SETFMT(%d) failed: %s", fmt, g_strerror (errno))); + return FALSE; + } +set_channels_failed: + { + GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), + ("DSP_CHANNELS(%d) failed: %s", chans, g_strerror (errno))); + return FALSE; + } +set_rate_failed: + { + GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), + ("DSP_SPEED(%d) failed: %s", rate, g_strerror (errno))); + return FALSE; + } +get_ospace_failed: + { + GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), + ("DSP_GETOSPACE failed: %s", g_strerror (errno))); + return FALSE; + } +get_ispace_failed: + { + GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), + ("DSP_GETISPACE failed: %s", g_strerror (errno))); + return FALSE; + } +format_not_what_was_requested: + { + GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), + ("Format actually configured wasn't the one we requested. This is " + "probably either a bug in the driver or in the format probing code.")); + return FALSE; + } +} + +int +gst_oss4_audio_get_version (GstObject * obj, int fd) +{ + gint ver = 0; + + /* we use the old ioctl here on purpose instead of SNDCTL_SYSINFO */ + if (ioctl (fd, OSS_GETVERSION, &ver) < 0) { + GST_LOG_OBJECT (obj, "OSS_GETVERSION failed: %s", g_strerror (errno)); + return -1; + } + GST_LOG_OBJECT (obj, "OSS version: 0x%08x", ver); + return ver; +} + +gboolean +gst_oss4_audio_check_version (GstObject * obj, int fd) +{ + return (gst_oss4_audio_get_version (obj, fd) >= GST_MIN_OSS4_VERSION); +} + +gchar * +gst_oss4_audio_find_device (GstObject * oss) +{ + GValueArray *arr; + gchar *ret = NULL; + + arr = gst_property_probe_probe_and_get_values_name (GST_PROPERTY_PROBE (oss), + "device"); + + if (arr != NULL) { + if (arr->n_values > 0) { + const GValue *val; + + val = g_value_array_get_nth (arr, 0); + ret = g_value_dup_string (val); + } + g_value_array_free (arr); + } + + GST_LOG_OBJECT (oss, "first device found: %s", GST_STR_NULL (ret)); + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gint rank; + + GST_DEBUG_CATEGORY_INIT (oss4sink_debug, "oss4sink", 0, "OSS4 audio sink"); + GST_DEBUG_CATEGORY_INIT (oss4src_debug, "oss4src", 0, "OSS4 audio src"); + GST_DEBUG_CATEGORY_INIT (oss4mixer_debug, "oss4mixer", 0, "OSS4 mixer"); + GST_DEBUG_CATEGORY_INIT (oss4_debug, "oss4", 0, "OSS4 plugin"); + +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif + + /* we want a higher rank than the legacy OSS elements have now */ + rank = GST_RANK_SECONDARY + 1; + + if (!gst_element_register (plugin, "oss4sink", rank, GST_TYPE_OSS4_SINK) || + !gst_element_register (plugin, "oss4src", rank, GST_TYPE_OSS4_SOURCE) || + !gst_element_register (plugin, "oss4mixer", rank, GST_TYPE_OSS4_MIXER)) { + return FALSE; + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "oss4", + "Open Sound System (OSS) version 4 support for GStreamer", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/oss4/oss4-audio.h b/sys/oss4/oss4-audio.h new file mode 100644 index 0000000..d220364 --- /dev/null +++ b/sys/oss4/oss4-audio.h @@ -0,0 +1,43 @@ +/* GStreamer OSS4 audio plugin + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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_OSS4_AUDIO_H +#define GST_OSS4_AUDIO_H_ + +#include +#include + +/* This is the minimum version we require */ +#define GST_MIN_OSS4_VERSION 0x040003 + +int gst_oss4_audio_get_version (GstObject * obj, int fd); + +gboolean gst_oss4_audio_check_version (GstObject * obj, int fd); + +GstCaps * gst_oss4_audio_probe_caps (GstObject * obj, int fd); + +gboolean gst_oss4_audio_set_format (GstObject * obj, int fd, GstRingBufferSpec * spec); + +GstCaps * gst_oss4_audio_get_template_caps (void); + +gchar * gst_oss4_audio_find_device (GstObject * oss); + +#endif /* GST_OSS4_AUDIO_H */ + + diff --git a/sys/oss4/oss4-mixer-enum.c b/sys/oss4/oss4-mixer-enum.c new file mode 100644 index 0000000..4b64bb1 --- /dev/null +++ b/sys/oss4/oss4-mixer-enum.c @@ -0,0 +1,269 @@ +/* GStreamer OSS4 mixer enumeration control + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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. + */ + +/* An 'enum' in gnome-volume-control / GstMixer is represented by a + * GstMixerOptions object + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#define NO_LEGACY_MIXER +#include "oss4-mixer.h" +#include "oss4-mixer-enum.h" +#include "oss4-soundcard.h" + +GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); +#define GST_CAT_DEFAULT oss4mixer_debug + +static GList *gst_oss4_mixer_enum_get_values (GstMixerOptions * options); + +/* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ +G_DEFINE_TYPE (GstOss4MixerEnum, gst_oss4_mixer_enum, GST_TYPE_MIXER_OPTIONS); + +static void +gst_oss4_mixer_enum_init (GstOss4MixerEnum * e) +{ + e->need_update = TRUE; +} + +static void +gst_oss4_mixer_enum_dispose (GObject * obj) +{ + GstMixerOptions *options = GST_MIXER_OPTIONS (obj); + + /* our list is a flat list with constant strings, but the GstMixerOptions + * dispose will try to g_free the contained strings, so clean up the list + * before chaining up to GstMixerOptions */ + g_list_free (options->values); + options->values = NULL; + + G_OBJECT_CLASS (gst_oss4_mixer_enum_parent_class)->dispose (obj); +} + +static void +gst_oss4_mixer_enum_class_init (GstOss4MixerEnumClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstMixerOptionsClass *mixeroptions_class = (GstMixerOptionsClass *) klass; + + gobject_class->dispose = gst_oss4_mixer_enum_dispose; + mixeroptions_class->get_values = gst_oss4_mixer_enum_get_values; +} + +static GList * +gst_oss4_mixer_enum_get_values_locked (GstMixerOptions * options) +{ + GstOss4MixerEnum *e = GST_OSS4_MIXER_ENUM_CAST (options); + GList *oldlist, *list = NULL; + int i; + + /* if current list of values is empty, update/re-check in any case */ + if (!e->need_update && options->values != NULL) + return options->values; + + GST_LOG_OBJECT (e, "updating available values for %s", e->mc->mixext.extname); + + for (i = 0; i < e->mc->mixext.maxvalue; ++i) { + const gchar *s; + + s = g_quark_to_string (e->mc->enum_vals[i]); + if (MIXEXT_ENUM_IS_AVAILABLE (e->mc->mixext, i)) { + GST_LOG_OBJECT (e, "option '%s' is available", s); + list = g_list_prepend (list, (gpointer) s); + } else { + GST_LOG_OBJECT (e, "option '%s' is currently not available", s); + } + } + + list = g_list_reverse (list); + + /* this is not thread-safe, but then the entire GstMixer API isn't really, + * since we return foo->list and not a copy and don't take any locks, so + * not much we can do here but pray; we're usually either called from _new() + * or from within _get_values() though, so it should be okay. We could use + * atomic ops here, but I'm not sure how much more that really buys us.*/ + oldlist = options->values; /* keep window small */ + options->values = list; + g_list_free (oldlist); + + e->need_update = FALSE; + + return options->values; +} + +static GList * +gst_oss4_mixer_enum_get_values (GstMixerOptions * options) +{ + GstOss4MixerEnum *e = GST_OSS4_MIXER_ENUM (options); + GList *list; + + /* we take the lock here mostly to serialise ioctls with the watch thread */ + GST_OBJECT_LOCK (e->mixer); + + list = gst_oss4_mixer_enum_get_values_locked (options); + + GST_OBJECT_UNLOCK (e->mixer); + + return list; +} + +static const gchar * +gst_oss4_mixer_enum_get_current_value (GstOss4MixerEnum * e) +{ + const gchar *cur_val = NULL; + + if (e->mc->enum_vals != NULL && e->mc->last_val < e->mc->mixext.maxvalue) { + cur_val = g_quark_to_string (e->mc->enum_vals[e->mc->last_val]); + } + + return cur_val; +} + +static gboolean +gst_oss4_mixer_enum_update_current (GstOss4MixerEnum * e) +{ + int cur = -1; + + if (!gst_oss4_mixer_get_control_val (e->mixer, e->mc, &cur)) + return FALSE; + + if (cur < 0 || cur >= e->mc->mixext.maxvalue) { + GST_WARNING_OBJECT (e, "read value %d out of bounds [0-%d]", cur, + e->mc->mixext.maxvalue - 1); + e->mc->last_val = 0; + return FALSE; + } + + return TRUE; +} + +gboolean +gst_oss4_mixer_enum_set_option (GstOss4MixerEnum * e, const gchar * value) +{ + GQuark q; + int i; + + q = g_quark_try_string (value); + if (q == 0) { + GST_WARNING_OBJECT (e, "unknown option '%s'", value); + return FALSE; + } + + for (i = 0; i < e->mc->mixext.maxvalue; ++i) { + if (q == e->mc->enum_vals[i]) + break; + } + + if (i >= e->mc->mixext.maxvalue) { + GST_WARNING_OBJECT (e, "option '%s' is not valid for this control", value); + return FALSE; + } + + GST_LOG_OBJECT (e, "option '%s' = %d", value, i); + + if (!MIXEXT_ENUM_IS_AVAILABLE (e->mc->mixext, i)) { + GST_WARNING_OBJECT (e, "option '%s' is not selectable currently", value); + return FALSE; + } + + if (!gst_oss4_mixer_set_control_val (e->mixer, e->mc, i)) { + GST_WARNING_OBJECT (e, "could not set option '%s' (%d)", value, i); + return FALSE; + } + + /* and re-read current value with sanity checks (or could just assign here) */ + gst_oss4_mixer_enum_update_current (e); + + return TRUE; +} + +const gchar * +gst_oss4_mixer_enum_get_option (GstOss4MixerEnum * e) +{ + const gchar *cur_str = NULL; + + if (!gst_oss4_mixer_enum_update_current (e)) { + GST_WARNING_OBJECT (e, "failed to read current value"); + return NULL; + } + + cur_str = gst_oss4_mixer_enum_get_current_value (e); + GST_LOG_OBJECT (e, "%s (%d)", GST_STR_NULL (cur_str), e->mc->last_val); + return cur_str; +} + +GstMixerTrack * +gst_oss4_mixer_enum_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc) +{ + GstOss4MixerEnum *e; + GstMixerTrack *track; + + e = g_object_new (GST_TYPE_OSS4_MIXER_ENUM, "untranslated-label", + mc->mixext.extname, NULL); + e->mixer = mixer; + e->mc = mc; + + track = GST_MIXER_TRACK (e); + + /* caller will set track->label and track->flags */ + + track->num_channels = 0; + track->min_volume = 0; + track->max_volume = 0; + + (void) gst_oss4_mixer_enum_get_values_locked (GST_MIXER_OPTIONS (track)); + + if (!gst_oss4_mixer_enum_update_current (e)) { + GST_WARNING_OBJECT (track, "failed to read current value, returning NULL"); + g_object_unref (track); + track = NULL; + } + + GST_LOG_OBJECT (e, "current value: %d (%s)", e->mc->last_val, + gst_oss4_mixer_enum_get_current_value (e)); + + return track; +} + +/* This is called from the watch thread */ +void +gst_oss4_mixer_enum_process_change_unlocked (GstMixerTrack * track) +{ + GstOss4MixerEnum *e = GST_OSS4_MIXER_ENUM_CAST (track); + + gchar *cur; + + if (!e->mc->changed && !e->mc->list_changed) + return; + + if (e->mc->list_changed) { + gst_mixer_options_list_changed (GST_MIXER (e->mixer), + GST_MIXER_OPTIONS (e)); + } + + GST_OBJECT_LOCK (e->mixer); + cur = (gchar *) gst_oss4_mixer_enum_get_current_value (e); + GST_OBJECT_UNLOCK (e->mixer); + + gst_mixer_option_changed (GST_MIXER (e->mixer), GST_MIXER_OPTIONS (e), cur); +} diff --git a/sys/oss4/oss4-mixer-enum.h b/sys/oss4/oss4-mixer-enum.h new file mode 100644 index 0000000..9fd8166 --- /dev/null +++ b/sys/oss4/oss4-mixer-enum.h @@ -0,0 +1,67 @@ +/* GStreamer OSS4 mixer on/off enum control + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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_OSS4_MIXER_ENUM_H +#define GST_OSS4_MIXER_ENUM_H + +#include +#include + +#include "oss4-mixer.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSS4_MIXER_ENUM (gst_oss4_mixer_enum_get_type()) +#define GST_OSS4_MIXER_ENUM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_MIXER_ENUM,GstOss4MixerEnum)) +#define GST_OSS4_MIXER_ENUM_CAST(obj) ((GstOss4MixerEnum *)(obj)) +#define GST_OSS4_MIXER_ENUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_MIXER_ENUM,GstOss4MixerEnumClass)) +#define GST_IS_OSS4_MIXER_ENUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_MIXER_ENUM)) +#define GST_IS_OSS4_MIXER_ENUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_MIXER_ENUM)) + +typedef struct _GstOss4MixerEnum GstOss4MixerEnum; +typedef struct _GstOss4MixerEnumClass GstOss4MixerEnumClass; + +struct _GstOss4MixerEnum { + GstMixerOptions mixer_option; + + GstOss4MixerControl * mc; + GstOss4Mixer * mixer; /* the mixer we belong to (no ref taken) */ + + gboolean need_update; +}; + +struct _GstOss4MixerEnumClass { + GstMixerOptionsClass mixer_option_class; +}; + +GType gst_oss4_mixer_enum_get_type (void); + +gboolean gst_oss4_mixer_enum_set_option (GstOss4MixerEnum * e, const gchar * value); + +const gchar * gst_oss4_mixer_enum_get_option (GstOss4MixerEnum * e); + +GstMixerTrack * gst_oss4_mixer_enum_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc); + +void gst_oss4_mixer_enum_process_change_unlocked (GstMixerTrack * track); + +G_END_DECLS + +#endif /* GST_OSS4_MIXER_ENUM_H */ + + diff --git a/sys/oss4/oss4-mixer-slider.c b/sys/oss4/oss4-mixer-slider.c new file mode 100644 index 0000000..ea2bc8c --- /dev/null +++ b/sys/oss4/oss4-mixer-slider.c @@ -0,0 +1,311 @@ +/* GStreamer OSS4 mixer slider control + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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. + */ + +/* A 'slider' in gnome-volume-control / GstMixer is represented by a + * GstMixerTrack with one or more channels. + * + * A slider should be either flagged as INPUT or OUTPUT (mostly because of + * gnome-volume-control being littered with g_asserts for everything it doesn't + * expect). + * + * From mixertrack.h: + * "Input tracks can have 'recording' enabled, which means that any input will + * be hearable into the speakers that are attached to the output. Mute is + * obvious." + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define NO_LEGACY_MIXER +#include "oss4-mixer-slider.h" + +GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); +#define GST_CAT_DEFAULT oss4mixer_debug + +/* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ +G_DEFINE_TYPE (GstOss4MixerSlider, gst_oss4_mixer_slider, GST_TYPE_MIXER_TRACK); + +static void +gst_oss4_mixer_slider_class_init (GstOss4MixerSliderClass * klass) +{ + /* nothing to do here */ +} + +static void +gst_oss4_mixer_slider_init (GstOss4MixerSlider * s) +{ + /* nothing to do here */ +} + +static int +gst_oss4_mixer_slider_pack_volume (GstOss4MixerSlider * s, const gint * volumes) +{ + int val = 0; + + switch (s->mc->mixext.type) { + case MIXT_MONOSLIDER: + case MIXT_MONOSLIDER16: + case MIXT_SLIDER: + val = volumes[0]; + break; + case MIXT_STEREOSLIDER: + val = ((volumes[1] & 0xff) << 8) | (volumes[0] & 0xff); + break; + case MIXT_STEREOSLIDER16: + val = ((volumes[1] & 0xffff) << 16) | (volumes[0] & 0xffff); + break; + default: + g_return_val_if_reached (0); + } + return val; +} + +static void +gst_oss4_mixer_slider_unpack_volume (GstOss4MixerSlider * s, int v, + gint * volumes) +{ + guint32 val; /* use uint so bitshifting the highest bit works right */ + + val = (guint32) v; + switch (s->mc->mixext.type) { + case MIXT_SLIDER: + volumes[0] = val; + break; + case MIXT_MONOSLIDER: + /* oss repeats the value in the upper bits, as if it was stereo */ + volumes[0] = val & 0x00ff; + break; + case MIXT_MONOSLIDER16: + /* oss repeats the value in the upper bits, as if it was stereo */ + volumes[0] = val & 0x0000ffff; + break; + case MIXT_STEREOSLIDER: + volumes[0] = (val & 0x00ff); + volumes[1] = (val & 0xff00) >> 8; + break; + case MIXT_STEREOSLIDER16: + volumes[0] = (val & 0x0000ffff); + volumes[1] = (val & 0xffff0000) >> 16; + break; + default: + g_return_if_reached (); + } +} + +gboolean +gst_oss4_mixer_slider_get_volume (GstOss4MixerSlider * s, gint * volumes) +{ + GstMixerTrack *track = GST_MIXER_TRACK (s); + int v = 0; + + /* if we're supposed to be muted, and don't have an actual mute control + * (ie. 'simulate' the mute), then just return the volume as saved, not + * the actually set volume which is most likely 0 */ + if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE) && !s->mc->mute) { + volumes[0] = s->volumes[0]; + if (track->num_channels == 2) + volumes[1] = s->volumes[1]; + return TRUE; + } + + if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &v)) + return FALSE; + + gst_oss4_mixer_slider_unpack_volume (s, v, volumes); + + if (track->num_channels > 1) { + GST_LOG_OBJECT (s, "volume: left=%d, right=%d", volumes[0], volumes[1]); + } else { + GST_LOG_OBJECT (s, "volume: mono=%d", volumes[0]); + } + + return TRUE; +} + +gboolean +gst_oss4_mixer_slider_set_volume (GstOss4MixerSlider * s, const gint * volumes) +{ + GstMixerTrack *track = GST_MIXER_TRACK (s); + int val = 0; + + /* if we're supposed to be muted, and are 'simulating' the mute because + * we don't have a mute control, don't actually change the volume, just + * save it as the new desired volume for later when we get unmuted again */ + if (!GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_NO_MUTE)) { + if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE) && !s->mc->mute) + goto done; + } + + val = gst_oss4_mixer_slider_pack_volume (s, volumes); + + if (track->num_channels > 1) { + GST_LOG_OBJECT (s, "left=%d, right=%d", volumes[0], volumes[1]); + } else { + GST_LOG_OBJECT (s, "mono=%d", volumes[0]); + } + + if (!gst_oss4_mixer_set_control_val (s->mixer, s->mc, val)) + return FALSE; + +done: + + s->volumes[0] = volumes[0]; + if (track->num_channels == 2) + s->volumes[1] = volumes[1]; + + return TRUE; +} + +gboolean +gst_oss4_mixer_slider_set_record (GstOss4MixerSlider * s, gboolean record) +{ + /* There doesn't seem to be a way to do this using the OSS4 mixer API, so + * just do nothing here for now. */ + return FALSE; +} + +gboolean +gst_oss4_mixer_slider_set_mute (GstOss4MixerSlider * s, gboolean mute) +{ + GstMixerTrack *track = GST_MIXER_TRACK (s); + gboolean ret; + + /* if the control does not support muting, then do not do anything */ + if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_NO_MUTE)) { + return TRUE; + } + + /* If we do not have a mute control, simulate mute (which is a bit broken, + * since we can not differentiate between capture/playback volume etc., so + * we just assume that setting the volume to 0 would be the same as muting + * this control) */ + if (s->mc->mute == NULL) { + int volume; + + if (mute) { + /* make sure the current volume values get saved. */ + gst_oss4_mixer_slider_get_volume (s, s->volumes); + volume = 0; + } else { + volume = gst_oss4_mixer_slider_pack_volume (s, s->volumes); + } + ret = gst_oss4_mixer_set_control_val (s->mixer, s->mc, volume); + } else { + ret = gst_oss4_mixer_set_control_val (s->mixer, s->mc->mute, ! !mute); + } + + if (mute) { + track->flags |= GST_MIXER_TRACK_MUTE; + } else { + track->flags &= ~GST_MIXER_TRACK_MUTE; + } + + return ret; +} + +GstMixerTrack * +gst_oss4_mixer_slider_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc) +{ + GstOss4MixerSlider *s; + GstMixerTrack *track; + gint volumes[2] = { 0, }; + + s = g_object_new (GST_TYPE_OSS4_MIXER_SLIDER, "untranslated-label", + mc->mixext.extname, NULL); + + track = GST_MIXER_TRACK (s); + + /* caller will set track->label and track->flags */ + + s->mc = mc; + s->mixer = mixer; + + /* we don't do value scaling but just present a scale of 0-maxvalue */ + track->min_volume = 0; + track->max_volume = mc->mixext.maxvalue; + + switch (mc->mixext.type) { + case MIXT_MONOSLIDER: + case MIXT_MONOSLIDER16: + case MIXT_SLIDER: + track->num_channels = 1; + break; + case MIXT_STEREOSLIDER: + case MIXT_STEREOSLIDER16: + track->num_channels = 2; + break; + default: + g_return_val_if_reached (NULL); + } + + GST_LOG_OBJECT (track, "min=%d, max=%d, channels=%d", track->min_volume, + track->max_volume, track->num_channels); + + if (!gst_oss4_mixer_slider_get_volume (s, volumes)) { + GST_WARNING_OBJECT (track, "failed to read volume, returning NULL"); + g_object_unref (track); + track = NULL; + } + + return track; +} + +/* This is called from the watch thread */ +void +gst_oss4_mixer_slider_process_change_unlocked (GstMixerTrack * track) +{ + GstOss4MixerSlider *s = GST_OSS4_MIXER_SLIDER_CAST (track); + + if (s->mc->mute != NULL && s->mc->mute->changed) { + gst_mixer_mute_toggled (GST_MIXER (s->mixer), track, + ! !s->mc->mute->last_val); + } else { + /* nothing to do here, since we don't/can't easily implement the record + * flag */ + } + + if (s->mc->changed) { + gint volumes[2] = { 0, 0 }; + + gst_oss4_mixer_slider_unpack_volume (s, s->mc->last_val, volumes); + + /* if we 'simulate' the mute, update flag when the volume changes */ + if (s->mc->mute == NULL) { + if (volumes[0] == 0 && volumes[1] == 0) { + track->flags |= GST_MIXER_TRACK_MUTE; + } else { + track->flags &= ~GST_MIXER_TRACK_MUTE; + } + } + + gst_mixer_volume_changed (GST_MIXER (s->mixer), track, volumes); + } +} diff --git a/sys/oss4/oss4-mixer-slider.h b/sys/oss4/oss4-mixer-slider.h new file mode 100644 index 0000000..3bee33f --- /dev/null +++ b/sys/oss4/oss4-mixer-slider.h @@ -0,0 +1,70 @@ +/* GStreamer OSS4 mixer slider control + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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_OSS4_MIXER_SLIDER_H +#define GST_OSS4_MIXER_SLIDER_H + +#include +#include + +#include "oss4-mixer.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSS4_MIXER_SLIDER (gst_oss4_mixer_slider_get_type()) +#define GST_OSS4_MIXER_SLIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_MIXER_SLIDER,GstOss4MixerSlider)) +#define GST_OSS4_MIXER_SLIDER_CAST(obj) ((GstOss4MixerSlider *)(obj)) +#define GST_OSS4_MIXER_SLIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_MIXER_SLIDER,GstOss4MixerSliderClass)) +#define GST_IS_OSS4_MIXER_SLIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_MIXER_SLIDER)) +#define GST_IS_OSS4_MIXER_SLIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_MIXER_SLIDER)) + +typedef struct _GstOss4MixerSlider GstOss4MixerSlider; +typedef struct _GstOss4MixerSliderClass GstOss4MixerSliderClass; + +struct _GstOss4MixerSlider { + GstMixerTrack mixer_track; + + GstOss4MixerControl * mc; + GstOss4Mixer * mixer; /* the mixer we belong to (no ref taken) */ + gint volumes[2]; /* left/mono, right */ +}; + +struct _GstOss4MixerSliderClass { + GstMixerTrackClass mixer_track_class; +}; + +GType gst_oss4_mixer_slider_get_type (void); + +GstMixerTrack * gst_oss4_mixer_slider_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc); + +gboolean gst_oss4_mixer_slider_get_volume (GstOss4MixerSlider * s, gint * volumes); + +gboolean gst_oss4_mixer_slider_set_volume (GstOss4MixerSlider * s, const gint * volumes); + +gboolean gst_oss4_mixer_slider_set_record (GstOss4MixerSlider * s, gboolean record); + +gboolean gst_oss4_mixer_slider_set_mute (GstOss4MixerSlider * s, gboolean mute); + +void gst_oss4_mixer_slider_process_change_unlocked (GstMixerTrack * track); + +G_END_DECLS + +#endif /* GST_OSS4_MIXER_SLIDER_H */ + + diff --git a/sys/oss4/oss4-mixer-switch.c b/sys/oss4/oss4-mixer-switch.c new file mode 100644 index 0000000..0a6ce5b --- /dev/null +++ b/sys/oss4/oss4-mixer-switch.c @@ -0,0 +1,150 @@ +/* GStreamer OSS4 mixer on/off switch control + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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. + */ + +/* A simple ON/OFF 'switch' in gnome-volume-control / GstMixer is represented + * by a GstMixerTrack with no channels. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#define NO_LEGACY_MIXER +#include "oss4-mixer-switch.h" +#include "oss4-soundcard.h" + +GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); +#define GST_CAT_DEFAULT oss4mixer_debug + +/* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ +G_DEFINE_TYPE (GstOss4MixerSwitch, gst_oss4_mixer_switch, GST_TYPE_MIXER_TRACK); + +static void +gst_oss4_mixer_switch_class_init (GstOss4MixerSwitchClass * klass) +{ + /* nothing to do here */ +} + +static void +gst_oss4_mixer_switch_init (GstOss4MixerSwitch * s) +{ + /* nothing to do here */ +} + +gboolean +gst_oss4_mixer_switch_set (GstOss4MixerSwitch * s, gboolean disabled) +{ + GstMixerTrack *track; + int newval; + + track = GST_MIXER_TRACK (s); + + newval = disabled ? GST_MIXER_TRACK_MUTE : 0; + + if (newval == (track->flags & GST_MIXER_TRACK_MUTE)) { + GST_LOG_OBJECT (s, "switch is already %d, doing nothing", newval); + return TRUE; + } + + if (!gst_oss4_mixer_set_control_val (s->mixer, s->mc, !disabled)) { + GST_WARNING_OBJECT (s, "could not set switch to %d", !disabled); + return FALSE; + } + + if (disabled) { + track->flags |= GST_MIXER_TRACK_MUTE; + } else { + track->flags &= ~GST_MIXER_TRACK_MUTE; + } + + GST_LOG_OBJECT (s, "set switch to %d", newval); + + return TRUE; +} + +gboolean +gst_oss4_mixer_switch_get (GstOss4MixerSwitch * s, gboolean * disabled) +{ + GstMixerTrack *track; + int enabled = -1; + + track = GST_MIXER_TRACK (s); + + if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &enabled) + || (enabled < 0)) { + GST_WARNING_OBJECT (s, "could not get switch state"); + return FALSE; + } + + if (enabled) { + track->flags &= ~GST_MIXER_TRACK_MUTE; + } else { + track->flags |= GST_MIXER_TRACK_MUTE; + } + *disabled = (enabled == 0); + + return TRUE; +} + +GstMixerTrack * +gst_oss4_mixer_switch_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc) +{ + GstOss4MixerSwitch *s; + GstMixerTrack *track; + int cur = -1; + + s = g_object_new (GST_TYPE_OSS4_MIXER_SWITCH, "untranslated-label", + mc->mixext.extname, NULL); + + s->mixer = mixer; + s->mc = mc; + + track = GST_MIXER_TRACK (s); + + /* caller will set track->label and track->flags */ + + track->num_channels = 0; + track->min_volume = 0; + track->max_volume = 0; + + if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &cur) || cur < 0) + return NULL; + + if (cur) { + track->flags &= ~GST_MIXER_TRACK_MUTE; + } else { + track->flags |= GST_MIXER_TRACK_MUTE; + } + + return track; +} + +/* This is called from the watch thread */ +void +gst_oss4_mixer_switch_process_change_unlocked (GstMixerTrack * track) +{ + GstOss4MixerSwitch *s = GST_OSS4_MIXER_SWITCH_CAST (track); + + if (!s->mc->changed) + return; + + gst_mixer_mute_toggled (GST_MIXER (s->mixer), track, !s->mc->last_val); +} diff --git a/sys/oss4/oss4-mixer-switch.h b/sys/oss4/oss4-mixer-switch.h new file mode 100644 index 0000000..a8ab83f --- /dev/null +++ b/sys/oss4/oss4-mixer-switch.h @@ -0,0 +1,65 @@ +/* GStreamer OSS4 mixer on/off switch control + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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_OSS4_MIXER_SWITCH_H +#define GST_OSS4_MIXER_SWITCH_H + +#include +#include + +#include "oss4-mixer.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSS4_MIXER_SWITCH (gst_oss4_mixer_switch_get_type()) +#define GST_OSS4_MIXER_SWITCH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_MIXER_SWITCH,GstOss4MixerSwitch)) +#define GST_OSS4_MIXER_SWITCH_CAST(obj) ((GstOss4MixerSwitch *)(obj)) +#define GST_OSS4_MIXER_SWITCH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_MIXER_SWITCH,GstOss4MixerSwitchClass)) +#define GST_IS_OSS4_MIXER_SWITCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_MIXER_SWITCH)) +#define GST_IS_OSS4_MIXER_SWITCH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_MIXER_SWITCH)) + +typedef struct _GstOss4MixerSwitch GstOss4MixerSwitch; +typedef struct _GstOss4MixerSwitchClass GstOss4MixerSwitchClass; + +struct _GstOss4MixerSwitch { + GstMixerTrack mixer_track; + + GstOss4MixerControl * mc; + GstOss4Mixer * mixer; /* the mixer we belong to (no ref taken) */ +}; + +struct _GstOss4MixerSwitchClass { + GstMixerTrackClass mixer_track_class; +}; + +GType gst_oss4_mixer_switch_get_type (void); + +gboolean gst_oss4_mixer_switch_set (GstOss4MixerSwitch * s, gboolean enabled); + +gboolean gst_oss4_mixer_switch_get (GstOss4MixerSwitch * s, gboolean * enabled); + +GstMixerTrack * gst_oss4_mixer_switch_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc); + +void gst_oss4_mixer_switch_process_change_unlocked (GstMixerTrack * track); + +G_END_DECLS + +#endif /* GST_OSS4_MIXER_SWITCH_H */ + + diff --git a/sys/oss4/oss4-mixer.c b/sys/oss4/oss4-mixer.c new file mode 100644 index 0000000..03e2d9d --- /dev/null +++ b/sys/oss4/oss4-mixer.c @@ -0,0 +1,1862 @@ +/* GStreamer OSS4 mixer implementation + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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 mixer library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** + * SECTION:element-oss4mixer + * + * This element lets you adjust sound input and output levels with the + * Open Sound System (OSS) version 4. It supports the GstMixer interface, which + * can be used to obtain a list of available mixer tracks. Set the mixer + * element to READY state before using the GstMixer interface on it. + * + * + * Example pipelines + * + * oss4mixer can't be used in a sensible way in gst-launch. + * + * + * + * Since: 0.10.7 + */ + +/* Note: ioctl calls on the same open mixer device are serialised via + * the object lock to make sure we don't do concurrent ioctls from two + * different threads (e.g. app thread and mixer watch thread), since that + * will probably confuse OSS. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "gst/glib-compat-private.h" + +#include + +#define NO_LEGACY_MIXER + +#include "oss4-audio.h" +#include "oss4-mixer.h" +#include "oss4-mixer-enum.h" +#include "oss4-mixer-slider.h" +#include "oss4-mixer-switch.h" +#include "oss4-property-probe.h" +#include "oss4-soundcard.h" + +#define GST_OSS4_MIXER_WATCH_INTERVAL 500 /* in millisecs, ie. 0.5s */ + +GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); +#define GST_CAT_DEFAULT oss4mixer_debug + +#define DEFAULT_DEVICE NULL +#define DEFAULT_DEVICE_NAME NULL + +enum +{ + PROP_0, + PROP_DEVICE, + PROP_DEVICE_NAME +}; + +static void gst_oss4_mixer_init_interfaces (GType type); + +GST_BOILERPLATE_FULL (GstOss4Mixer, gst_oss4_mixer, GstElement, + GST_TYPE_ELEMENT, gst_oss4_mixer_init_interfaces); + +static GstStateChangeReturn gst_oss4_mixer_change_state (GstElement * + element, GstStateChange transition); + +static void gst_oss4_mixer_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_oss4_mixer_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_oss4_mixer_finalize (GObject * object); + +static gboolean gst_oss4_mixer_open (GstOss4Mixer * mixer, + gboolean silent_errors); +static void gst_oss4_mixer_close (GstOss4Mixer * mixer); + +static gboolean gst_oss4_mixer_enum_control_update_enum_list (GstOss4Mixer * m, + GstOss4MixerControl * mc); + +#ifndef GST_DISABLE_GST_DEBUG +static const gchar *mixer_ext_type_get_name (gint type); +static const gchar *mixer_ext_flags_get_string (gint flags); +#endif + +static void +gst_oss4_mixer_base_init (gpointer klass) +{ + gst_element_class_set_details_simple (GST_ELEMENT_CLASS (klass), + "OSS v4 Audio Mixer", "Generic/Audio", + "Control sound input and output levels with OSS4", + "Tim-Philipp Müller "); +} + +static void +gst_oss4_mixer_class_init (GstOss4MixerClass * klass) +{ + GstElementClass *element_class; + GObjectClass *gobject_class; + + element_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; + + gobject_class->finalize = gst_oss4_mixer_finalize; + gobject_class->set_property = gst_oss4_mixer_set_property; + gobject_class->get_property = gst_oss4_mixer_get_property; + + /** + * GstOss4Mixer:device + * + * OSS4 mixer device (e.g. /dev/oss/hdaudio0/mix0 or /dev/mixerN) + * + **/ + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "OSS mixer device (e.g. /dev/oss/hdaudio0/mix0 or /dev/mixerN) " + "(NULL = use first mixer device found)", DEFAULT_DEVICE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstOss4Mixer:device-name + * + * Human-readable name of the sound device. May be NULL if the device is + * not open (ie. when the mixer is in NULL state) + * + **/ + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + element_class->change_state = GST_DEBUG_FUNCPTR (gst_oss4_mixer_change_state); +} + +static void +gst_oss4_mixer_finalize (GObject * obj) +{ + GstOss4Mixer *mixer = GST_OSS4_MIXER (obj); + + g_free (mixer->device); + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gst_oss4_mixer_reset (GstOss4Mixer * mixer) +{ + mixer->fd = -1; + mixer->need_update = TRUE; + memset (&mixer->last_mixext, 0, sizeof (oss_mixext)); +} + +static void +gst_oss4_mixer_init (GstOss4Mixer * mixer, GstOss4MixerClass * g_class) +{ + mixer->device = g_strdup (DEFAULT_DEVICE); + mixer->device_name = NULL; + + gst_oss4_mixer_reset (mixer); +} + +static void +gst_oss4_mixer_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOss4Mixer *mixer = GST_OSS4_MIXER (object); + + switch (prop_id) { + case PROP_DEVICE: + GST_OBJECT_LOCK (mixer); + if (!GST_OSS4_MIXER_IS_OPEN (mixer)) { + g_free (mixer->device); + mixer->device = g_value_dup_string (value); + /* unset any cached device-name */ + g_free (mixer->device_name); + mixer->device_name = NULL; + } else { + g_warning ("%s: can't change \"device\" property while mixer is open", + GST_OBJECT_NAME (mixer)); + } + GST_OBJECT_UNLOCK (mixer); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_oss4_mixer_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOss4Mixer *mixer = GST_OSS4_MIXER (object); + + switch (prop_id) { + case PROP_DEVICE: + GST_OBJECT_LOCK (mixer); + g_value_set_string (value, mixer->device); + GST_OBJECT_UNLOCK (mixer); + break; + case PROP_DEVICE_NAME: + GST_OBJECT_LOCK (mixer); + /* If device is set, try to retrieve the name even if we're not open */ + if (mixer->fd == -1 && mixer->device != NULL) { + if (gst_oss4_mixer_open (mixer, TRUE)) { + g_value_set_string (value, mixer->device_name); + gst_oss4_mixer_close (mixer); + } else { + g_value_set_string (value, mixer->device_name); + } + } else { + g_value_set_string (value, mixer->device_name); + } + GST_OBJECT_UNLOCK (mixer); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_oss4_mixer_open (GstOss4Mixer * mixer, gboolean silent_errors) +{ + struct oss_mixerinfo mi = { 0, }; + gchar *device; + + g_return_val_if_fail (!GST_OSS4_MIXER_IS_OPEN (mixer), FALSE); + + if (mixer->device) + device = g_strdup (mixer->device); + else + device = gst_oss4_audio_find_device (GST_OBJECT_CAST (mixer)); + + /* desperate times, desperate measures */ + if (device == NULL) + device = g_strdup ("/dev/mixer"); + + GST_INFO_OBJECT (mixer, "Trying to open OSS4 mixer device '%s'", device); + + mixer->fd = open (device, O_RDWR, 0); + if (mixer->fd < 0) + goto open_failed; + + /* Make sure it's OSS4. If it's old OSS, let the old ossmixer handle it */ + if (!gst_oss4_audio_check_version (GST_OBJECT (mixer), mixer->fd)) + goto legacy_oss; + + GST_INFO_OBJECT (mixer, "Opened mixer device '%s', which is mixer %d", + device, mi.dev); + + /* Get device name for currently open fd */ + mi.dev = -1; + if (ioctl (mixer->fd, SNDCTL_MIXERINFO, &mi) == 0) { + mixer->modify_counter = mi.modify_counter; + if (mi.name[0] != '\0') { + mixer->device_name = g_strdup (mi.name); + } + } else { + mixer->modify_counter = 0; + } + + if (mixer->device_name == NULL) { + mixer->device_name = g_strdup ("Unknown"); + } + GST_INFO_OBJECT (mixer, "device name = '%s'", mixer->device_name); + + mixer->open_device = device; + + return TRUE; + + /* ERRORS */ +open_failed: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (mixer, RESOURCE, OPEN_READ_WRITE, + (_("Could not open audio device for mixer control handling.")), + GST_ERROR_SYSTEM); + } else { + GST_DEBUG_OBJECT (mixer, "open failed: %s (ignoring errors)", + g_strerror (errno)); + } + g_free (device); + return FALSE; + } +legacy_oss: + { + gst_oss4_mixer_close (mixer); + if (!silent_errors) { + GST_ELEMENT_ERROR (mixer, RESOURCE, OPEN_READ_WRITE, + (_("Could not open audio device for mixer control handling. " + "This version of the Open Sound System is not supported by this " + "element.")), ("Try the 'ossmixer' element instead")); + } else { + GST_DEBUG_OBJECT (mixer, "open failed: legacy oss (ignoring errors)"); + } + g_free (device); + return FALSE; + } +} + +static void +gst_oss4_mixer_control_free (GstOss4MixerControl * mc) +{ + g_list_free (mc->children); + g_list_free (mc->mute_group); + g_free (mc->enum_vals); + memset (mc, 0, sizeof (GstOss4MixerControl)); + g_free (mc); +} + +static void +gst_oss4_mixer_free_tracks (GstOss4Mixer * mixer) +{ + g_list_foreach (mixer->tracks, (GFunc) g_object_unref, NULL); + g_list_free (mixer->tracks); + mixer->tracks = NULL; + + g_list_foreach (mixer->controls, (GFunc) gst_oss4_mixer_control_free, NULL); + g_list_free (mixer->controls); + mixer->controls = NULL; +} + +static void +gst_oss4_mixer_close (GstOss4Mixer * mixer) +{ + g_free (mixer->device_name); + mixer->device_name = NULL; + + g_free (mixer->open_device); + mixer->open_device = NULL; + + gst_oss4_mixer_free_tracks (mixer); + + if (mixer->fd != -1) { + close (mixer->fd); + mixer->fd = -1; + } + + gst_oss4_mixer_reset (mixer); +} + +static void +gst_oss4_mixer_watch_process_changes (GstOss4Mixer * mixer) +{ + GList *c, *t, *tracks = NULL; + + GST_INFO_OBJECT (mixer, "mixer interface or control changed"); + + /* this is all with the mixer object lock held */ + + /* we go through the list backwards so we can bail out faster when the entire + * interface needs to be rebuilt */ + for (c = g_list_last (mixer->controls); c != NULL; c = c->prev) { + GstOss4MixerControl *mc = c->data; + oss_mixer_value ossval = { 0, }; + + mc->changed = FALSE; + mc->list_changed = FALSE; + + /* not interested in controls we don't expose in the mixer interface */ + if (!mc->used) + continue; + + /* don't try to read a value from controls that don't have one */ + if (mc->mixext.type == MIXT_DEVROOT || mc->mixext.type == MIXT_GROUP) + continue; + + /* is this an enum control whose list may change? */ + if (mc->mixext.type == MIXT_ENUM && mc->enum_version != 0) { + if (gst_oss4_mixer_enum_control_update_enum_list (mixer, mc)) + mc->list_changed = TRUE; + } + + ossval.dev = mc->mixext.dev; + ossval.ctrl = mc->mixext.ctrl; + ossval.timestamp = mc->mixext.timestamp; + + if (ioctl (mixer->fd, SNDCTL_MIX_READ, &ossval) == -1) { + if (errno == EIDRM || errno == EFAULT) { + GST_DEBUG ("%s has disappeared", mc->mixext.extname); + goto mixer_changed; + } + GST_WARNING_OBJECT (mixer, "MIX_READ failed: %s", g_strerror (errno)); + /* just ignore, move on to next one */ + continue; + } + + if (ossval.value == mc->last_val) { /* no change */ + /* GST_LOG_OBJECT (mixer, "%s hasn't changed", mc->mixext.extname); */ + continue; + } + + mc->last_val = ossval.value; + GST_LOG_OBJECT (mixer, "%s changed value to %u 0x%08x", + mc->mixext.extname, ossval.value, ossval.value); + mc->changed = TRUE; + } + + /* copy list and take track refs, so we can safely drop the object lock, + * which we need to do to be able to post messages on the bus */ + tracks = g_list_copy (mixer->tracks); + g_list_foreach (tracks, (GFunc) g_object_ref, NULL); + + GST_OBJECT_UNLOCK (mixer); + + /* since we don't know (or want to know exactly) which controls belong to + * which track, we just go through the tracks one-by-one now and make them + * check themselves if any of their controls have changed and which messages + * to post on the bus as a result */ + for (t = tracks; t != NULL; t = t->next) { + GstMixerTrack *track = t->data; + + if (GST_IS_OSS4_MIXER_SLIDER (track)) { + gst_oss4_mixer_slider_process_change_unlocked (track); + } else if (GST_IS_OSS4_MIXER_SWITCH (track)) { + gst_oss4_mixer_switch_process_change_unlocked (track); + } else if (GST_IS_OSS4_MIXER_ENUM (track)) { + gst_oss4_mixer_enum_process_change_unlocked (track); + } + + g_object_unref (track); + } + g_list_free (tracks); + + GST_OBJECT_LOCK (mixer); + return; + +mixer_changed: + { + GST_OBJECT_UNLOCK (mixer); + gst_mixer_mixer_changed (GST_MIXER (mixer)); + GST_OBJECT_LOCK (mixer); + return; + } +} + +/* This thread watches the mixer for changes in a somewhat inefficient way + * (running an ioctl every half second or so). This is still better and + * cheaper than apps polling all tracks for changes a few times a second + * though. Needs more thought. There's probably (hopefully) a way to get + * notifications via the fd directly somehow. */ +static gpointer +gst_oss4_mixer_watch_thread (gpointer thread_data) +{ + GstOss4Mixer *mixer = GST_OSS4_MIXER_CAST (thread_data); + + GST_DEBUG_OBJECT (mixer, "watch thread running"); + + GST_OBJECT_LOCK (mixer); + while (!mixer->watch_shutdown) { + oss_mixerinfo mi = { 0, }; + GTimeVal tv; + + mi.dev = -1; + if (ioctl (mixer->fd, SNDCTL_MIXERINFO, &mi) == 0) { + if (mixer->modify_counter != mi.modify_counter) { + /* GST_LOG ("processing changes"); */ + gst_oss4_mixer_watch_process_changes (mixer); + mixer->modify_counter = mi.modify_counter; + } else { + /* GST_LOG ("no changes"); */ + } + } else { + GST_WARNING_OBJECT (mixer, "MIXERINFO failed: %s", g_strerror (errno)); + } + + /* we could move the _get_current_time out of the loop and just do the + * add in ever iteration, which would be less exact, but who cares */ + g_get_current_time (&tv); + g_time_val_add (&tv, GST_OSS4_MIXER_WATCH_INTERVAL * 1000); + (void) g_cond_timed_wait (mixer->watch_cond, GST_OBJECT_GET_LOCK (mixer), + &tv); + } + GST_OBJECT_UNLOCK (mixer); + + GST_DEBUG_OBJECT (mixer, "watch thread done"); + gst_object_unref (mixer); + return NULL; +} + +/* call with object lock held */ +static void +gst_oss4_mixer_wake_up_watch_task (GstOss4Mixer * mixer) +{ + GST_LOG_OBJECT (mixer, "signalling watch thread to wake up"); + g_cond_signal (mixer->watch_cond); +} + +static void +gst_oss4_mixer_stop_watch_task (GstOss4Mixer * mixer) +{ + if (mixer->watch_thread) { + GST_OBJECT_LOCK (mixer); + mixer->watch_shutdown = TRUE; + GST_LOG_OBJECT (mixer, "signalling watch thread to stop"); + g_cond_signal (mixer->watch_cond); + GST_OBJECT_UNLOCK (mixer); + GST_LOG_OBJECT (mixer, "waiting for watch thread to join"); + g_thread_join (mixer->watch_thread); + GST_DEBUG_OBJECT (mixer, "watch thread stopped"); + mixer->watch_thread = NULL; + } + + if (mixer->watch_cond) { + g_cond_free (mixer->watch_cond); + mixer->watch_cond = NULL; + } +} + +static void +gst_oss4_mixer_start_watch_task (GstOss4Mixer * mixer) +{ + GError *err = NULL; + + mixer->watch_cond = g_cond_new (); + mixer->watch_shutdown = FALSE; + +#if !GLIB_CHECK_VERSION (2, 31, 0) + mixer->watch_thread = g_thread_create (gst_oss4_mixer_watch_thread, + gst_object_ref (mixer), TRUE, &err); +#else + mixer->watch_thread = g_thread_try_new ("oss4-mixer-thread", + gst_oss4_mixer_watch_thread, gst_object_ref (mixer), &err); +#endif + + if (mixer->watch_thread == NULL) { + GST_ERROR_OBJECT (mixer, "Could not create watch thread: %s", err->message); + g_cond_free (mixer->watch_cond); + mixer->watch_cond = NULL; + g_error_free (err); + } +} + +static GstStateChangeReturn +gst_oss4_mixer_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstOss4Mixer *mixer = GST_OSS4_MIXER (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_oss4_mixer_open (mixer, FALSE)) + return GST_STATE_CHANGE_FAILURE; + gst_oss4_mixer_start_watch_task (mixer); + 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_READY_TO_NULL: + gst_oss4_mixer_stop_watch_task (mixer); + gst_oss4_mixer_close (mixer); + break; + default: + break; + } + + return ret; +} + +/* === GstMixer interface === */ + +static inline gboolean +gst_oss4_mixer_contains_track (GstMixer * mixer, GstMixerTrack * track) +{ + return (g_list_find (GST_OSS4_MIXER (mixer)->tracks, track) != NULL); +} + +static inline gboolean +gst_oss4_mixer_contains_options (GstMixer * mixer, GstMixerOptions * options) +{ + return (g_list_find (GST_OSS4_MIXER (mixer)->tracks, options) != NULL); +} + +static void +gst_oss4_mixer_post_mixer_changed_msg (GstOss4Mixer * mixer) +{ + /* only post mixer-changed message once */ + if (!mixer->need_update) { + gst_mixer_mixer_changed (GST_MIXER (mixer)); + mixer->need_update = TRUE; + } +} + +/* call with mixer object lock held to serialise ioctl */ +gboolean +gst_oss4_mixer_get_control_val (GstOss4Mixer * mixer, GstOss4MixerControl * mc, + int *val) +{ + oss_mixer_value ossval = { 0, }; + + if (GST_OBJECT_TRYLOCK (mixer)) { + GST_ERROR ("must be called with mixer lock held"); + GST_OBJECT_UNLOCK (mixer); + } + + ossval.dev = mc->mixext.dev; + ossval.ctrl = mc->mixext.ctrl; + ossval.timestamp = mc->mixext.timestamp; + + if (ioctl (mixer->fd, SNDCTL_MIX_READ, &ossval) == -1) { + if (errno == EIDRM) { + GST_DEBUG_OBJECT (mixer, "MIX_READ failed: mixer interface has changed"); + gst_oss4_mixer_post_mixer_changed_msg (mixer); + } else { + GST_WARNING_OBJECT (mixer, "MIX_READ failed: %s", g_strerror (errno)); + } + *val = 0; + mc->last_val = 0; + return FALSE; + } + + *val = ossval.value; + mc->last_val = ossval.value; + GST_LOG_OBJECT (mixer, "got value 0x%08x from %s)", *val, mc->mixext.extname); + return TRUE; +} + +/* call with mixer object lock held to serialise ioctl */ +gboolean +gst_oss4_mixer_set_control_val (GstOss4Mixer * mixer, GstOss4MixerControl * mc, + int val) +{ + oss_mixer_value ossval = { 0, }; + + ossval.dev = mc->mixext.dev; + ossval.ctrl = mc->mixext.ctrl; + ossval.timestamp = mc->mixext.timestamp; + ossval.value = val; + + if (GST_OBJECT_TRYLOCK (mixer)) { + GST_ERROR ("must be called with mixer lock held"); + GST_OBJECT_UNLOCK (mixer); + } + + if (ioctl (mixer->fd, SNDCTL_MIX_WRITE, &ossval) == -1) { + if (errno == EIDRM) { + GST_LOG_OBJECT (mixer, "MIX_WRITE failed: mixer interface has changed"); + gst_oss4_mixer_post_mixer_changed_msg (mixer); + } else { + GST_WARNING_OBJECT (mixer, "MIX_WRITE failed: %s", g_strerror (errno)); + } + return FALSE; + } + + mc->last_val = val; + GST_LOG_OBJECT (mixer, "set value 0x%08x on %s", val, mc->mixext.extname); + return TRUE; +} + +#if 0 +static gchar * +gst_oss4_mixer_control_get_pretty_name (GstOss4MixerControl * mc) +{ + gchar *name; + + const gchar *name, *u; + + /* "The id field is the original name given by the driver when it called + * mixer_ext_create_control. This name can be used by fully featured GUI + * mixers. However this name should be downshifted and cut before the last + * underscore ("_") to get the proper name. For example mixer control name + * created as "MYDRV_MAINVOL" will become just "mainvol" after this + * transformation." */ + name = mc->mixext.extname; + u = MAX (strrchr (name, '_'), strrchr (name, '.')); + if (u != NULL) + name = u + 1; + + /* maybe capitalize the first letter? */ + return g_ascii_strdown (name, -1); + /* the .id thing doesn't really seem to work right, ie. for some sliders + * it's just '-' so you have to use the name of the parent control etc. + * let's not use it for now, much too painful. */ + if (g_str_has_prefix (mc->mixext.extname, "misc.")) + name = g_strdup (mc->mixext.extname + 5); + else + name = g_strdup (mc->mixext.extname); + /* chop off trailing digit (only one for now) */ + if (strlen (name) > 0 && g_ascii_isdigit (name[strlen (name) - 1])) + name[strlen (name) - 1] = '\0'; + g_strdelimit (name, ".", ' '); + return name; +} +#endif + +/* these translations are a bit ad-hoc and horribly incomplete; it is not + * really going to work this way with all the different chipsets and drivers. + * We also use these for translating option values. */ +static struct +{ + const gchar oss_name[32]; + const gchar *label; +} labels[] = { + { + "volume", N_("Volume")}, { + "master", N_("Master")}, { + "front", N_("Front")}, { + "rear", N_("Rear")}, { + "headphones", N_("Headphones")}, { + "center", N_("Center")}, { + "lfe", N_("LFE")}, { + "surround", N_("Surround")}, { + "side", N_("Side")}, { + "speaker", N_("Built-in Speaker")}, { + "aux1-out", N_("AUX 1 Out")}, { + "aux2-out", N_("AUX 2 Out")}, { + "aux-out", N_("AUX Out")}, { + "bass", N_("Bass")}, { + "treble", N_("Treble")}, { + "3d-depth", N_("3D Depth")}, { + "3d-center", N_("3D Center")}, { + "3d-enhance", N_("3D Enhance")}, { + "phone", N_("Telephone")}, { + "mic", N_("Microphone")}, { + "line-out", N_("Line Out")}, { + "line-in", N_("Line In")}, { + "linein", N_("Line In")}, { + "cd", N_("Internal CD")}, { + "video", N_("Video In")}, { + "aux1-in", N_("AUX 1 In")}, { + "aux2-in", N_("AUX 2 In")}, { + "aux-in", N_("AUX In")}, { + "pcm", N_("PCM")}, { + "record-gain", N_("Record Gain")}, { + "igain", N_("Record Gain")}, { + "ogain", N_("Output Gain")}, { + "micboost", N_("Microphone Boost")}, { + "loopback", N_("Loopback")}, { + "diag", N_("Diagnostic")}, { + "loudness", N_("Bass Boost")}, { + "outputs", N_("Playback Ports")}, { + "input", N_("Input")}, { + "inputs", N_("Record Source")}, { + "record-source", N_("Record Source")}, { + "monitor-source", N_("Monitor Source")}, { + "beep", N_("Keyboard Beep")}, { + "monitor-gain", N_("Monitor")}, { + "stereo-simulate", N_("Simulate Stereo")}, { + "stereo", N_("Stereo")}, { + "multich", N_("Surround Sound")}, { + "mic-gain", N_("Microphone Gain")}, { + "speaker-source", N_("Speaker Source")}, { + "mic-source", N_("Microphone Source")}, { + "jack", N_("Jack")}, { + "center/lfe", N_("Center / LFE")}, { + "stereo-mix", N_("Stereo Mix")}, { + "mono-mix", N_("Mono Mix")}, { + "input-mix", N_("Input Mix")}, { + "spdif-in", N_("SPDIF In")}, { + "spdif-out", N_("SPDIF Out")}, { + "mic1", N_("Microphone 1")}, { + "mic2", N_("Microphone 2")}, { + "digital-out", N_("Digital Out")}, { + "digital-in", N_("Digital In")}, { + "hdmi", N_("HDMI")}, { + "modem", N_("Modem")}, { + "handset", N_("Handset")}, { + "other", N_("Other")}, { + "stereo", N_("Stereo")}, { + "none", N_("None")}, { + "on", N_("On")}, { + "off", N_("Off")}, { + "mute", N_("Mute")}, { + "fast", N_("Fast")}, { + /* TRANSLATORS: "Very Low" is a quality setting here */ + "very-low", N_("Very Low")}, { + /* TRANSLATORS: "Low" is a quality setting here */ + "low", N_("Low")}, { + /* TRANSLATORS: "Medium" is a quality setting here */ + "medium", N_("Medium")}, { + /* TRANSLATORS: "High" is a quality setting here */ + "high", N_("High")}, { + /* TRANSLATORS: "Very High" is a quality setting here */ + "very-high", N_("Very High")}, { + "high+", N_("Very High")}, { + /* TRANSLATORS: "Production" is a quality setting here */ + "production", N_("Production")}, { + "fp-mic", N_("Front Panel Microphone")}, { + "fp-linein", N_("Front Panel Line In")}, { + "fp-headphones", N_("Front Panel Headphones")}, { + "fp-lineout", N_("Front Panel Line Out")}, { + "green", N_("Green Connector")}, { + "pink", N_("Pink Connector")}, { + "blue", N_("Blue Connector")}, { + "white", N_("White Connector")}, { + "black", N_("Black Connector")}, { + "gray", N_("Gray Connector")}, { + "orange", N_("Orange Connector")}, { + "red", N_("Red Connector")}, { + "yellow", N_("Yellow Connector")}, { + "fp-green", N_("Green Front Panel Connector")}, { + "fp-pink", N_("Pink Front Panel Connector")}, { + "fp-blue", N_("Blue Front Panel Connector")}, { + "fp-white", N_("White Front Panel Connector")}, { + "fp-black", N_("Black Front Panel Connector")}, { + "fp-gray", N_("Gray Front Panel Connector")}, { + "fp-orange", N_("Orange Front Panel Connector")}, { + "fp-red", N_("Red Front Panel Connector")}, { + "fp-yellow", N_("Yellow Front Panel Connector")}, { + "spread", N_("Spread Output")}, { + "downmix", N_("Downmix")}, + /* FIXME translate Audigy NX USB labels) */ +/* + { "rec.src", N_("Record Source") }, + { "output.mute", N_("Mute output") } + headph (Controller group) + headph.src (Enumeration control) + headph.mute (On/Off switch) + digital2 (Controller group) + digital2.src (Enumeration control) + digital2.mute (On/Off switch) + digital (Controller group) + digital.mute1 (On/Off switch) + digital.vol (Controller group) + digital.vol.front (Stereo slider (0-255)) + digital.vol.surr (Stereo slider (0-255)) + digital.vol.c/l (Stereo slider (0-255)) + digital.vol.center (Stereo slider (0-255)) + digital.mute2 (On/Off switch) + digital.vol (Stereo slider (0-255)) + line (Controller group) + line.mute (On/Off switch) + line.vol (Stereo slider (0-255)) + play-altset (Enumeration control) + rec-altset (Enumeration control) +*/ +}; + +/* Decent i18n is pretty much impossible with OSS's way of providing us with + * mixer labels (and the fact that they are pretty much random), but that + * doesn't mean we shouldn't at least try. */ +static gchar * +gst_oss4_mixer_control_get_translated_name (GstOss4MixerControl * mc) +{ + gchar name[128] = { 0, }; + gchar vmix_str[32] = { '\0', }; + gchar *ptr; + int dummy, i; + int num = -1; + gboolean function_suffix = FALSE; + + /* main virtual mixer controls (we hide the stream volumes) */ + if (sscanf (mc->mixext.extname, "vmix%d-%32c", &dummy, vmix_str) == 2) { + if (strcmp (vmix_str, "src") == 0) + return g_strdup (_("Virtual Mixer Input")); + else if (strcmp (vmix_str, "vol") == 0) + return g_strdup (_("Virtual Mixer Output")); + else if (strcmp (vmix_str, "channels") == 0) + return g_strdup (_("Virtual Mixer Channels")); + } + + g_strlcpy (name, mc->mixext.extname, sizeof (name)); + + /* we deal with either "connector." or "jack." */ + if ((g_str_has_prefix (name, "connector.")) || + (g_str_has_prefix (name, "jack."))) { + ptr = strchr (mc->mixext.extname, '.'); + ptr++; + g_strlcpy (name, ptr, sizeof (name)); + } + + /* special handling for jack retasking suffixes */ + if (g_str_has_suffix (name, ".function") || g_str_has_suffix (name, ".mode")) { + function_suffix = TRUE; + ptr = strrchr (name, '.'); + *ptr = 0; + } + + /* parse off trailing numbers */ + i = strlen (name); + while ((i > 0) && (g_ascii_isdigit (name[i - 1]))) { + i--; + } + /* the check catches the case where the control name is just a number */ + if ((i > 0) && (name[i] != '\0')) { + num = atoi (name + i); + name[i] = '\0'; + } + + /* look for a match, progressively skipping '.' delimited prefixes as we go */ + ptr = name; + do { + if (*ptr == '.') + ptr++; + for (i = 0; i < G_N_ELEMENTS (labels); ++i) { + if (g_ascii_strcasecmp (ptr, labels[i].oss_name) == 0) { + g_strlcpy (name, _(labels[i].label), sizeof (name)); + goto append_suffixes; + } + } + } while ((ptr = strchr (ptr, '.')) != NULL); + + /* failing that, just replace periods with spaces */ + g_strdelimit (name, ".", ' '); + +append_suffixes: + if (num > -1) { + if (function_suffix) { + /* TRANSLATORS: name + number of a volume mixer control */ + return g_strdup_printf (_("%s %d Function"), name, num); + } else { + return g_strdup_printf ("%s %d", name, num); + } + } else { + if (function_suffix) { + /* TRANSLATORS: name of a volume mixer control */ + return g_strdup_printf (_("%s Function"), name); + } else { + return g_strdup (name); + } + } +} + +static const gchar * +gst_oss4_mixer_control_get_translated_option (const gchar * name) +{ + int i; + for (i = 0; i < G_N_ELEMENTS (labels); ++i) { + if (g_ascii_strcasecmp (name, labels[i].oss_name) == 0) { + return _(labels[i].label); + } + } + return (name); +} + +#ifndef GST_DISABLE_GST_DEBUG +static const gchar * +mixer_ext_type_get_name (gint type) +{ + switch (type) { + case MIXT_DEVROOT: + return "Device root entry"; + case MIXT_GROUP: + return "Controller group"; + case MIXT_ONOFF: + return "On/Off switch"; + case MIXT_ENUM: + return "Enumeration control"; + case MIXT_MONOSLIDER: + return "Mono slider (0-255)"; + case MIXT_STEREOSLIDER: + return "Stereo slider (0-255)"; + case MIXT_MESSAGE: + return "Textual message"; /* whatever this is */ + case MIXT_MONOVU: + return "Mono VU meter value"; + case MIXT_STEREOVU: + return "Stereo VU meter value"; + case MIXT_MONOPEAK: + return "Mono VU meter peak value"; + case MIXT_STEREOPEAK: + return "Stereo VU meter peak value"; + case MIXT_RADIOGROUP: + return "Radio button group"; + case MIXT_MARKER: /* Separator between normal and extension entries */ + return "Separator"; + case MIXT_VALUE: + return "Decimal value entry"; + case MIXT_HEXVALUE: + return "Hex value entry"; + case MIXT_SLIDER: + return "Mono slider (31-bit value range)"; + case MIXT_3D: + return "3D"; /* what's this? */ + case MIXT_MONOSLIDER16: + return "Mono slider (0-32767)"; + case MIXT_STEREOSLIDER16: + return "Stereo slider (0-32767)"; + case MIXT_MUTE: + return "Mute switch"; + default: + break; + } + return "unknown"; +} +#endif /* GST_DISABLE_GST_DEBUG */ + +#ifndef GST_DISABLE_GST_DEBUG +static const gchar * +mixer_ext_flags_get_string (gint flags) +{ + struct + { + gint flag; + gchar nick[16]; + } all_flags[] = { + /* first the important ones */ + { + MIXF_MAINVOL, "MAINVOL"}, { + MIXF_PCMVOL, "PCMVOL"}, { + MIXF_RECVOL, "RECVOL"}, { + MIXF_MONVOL, "MONVOL"}, { + MIXF_DESCR, "DESCR"}, + /* now the rest in the right order */ + { + MIXF_READABLE, "READABLE"}, { + MIXF_WRITEABLE, "WRITABLE"}, { + MIXF_POLL, "POLL"}, { + MIXF_HZ, "HZ"}, { + MIXF_STRING, "STRING"}, { + MIXF_DYNAMIC, "DYNAMIC"}, { + MIXF_OKFAIL, "OKFAIL"}, { + MIXF_FLAT, "FLAT"}, { + MIXF_LEGACY, "LEGACY"}, { + MIXF_CENTIBEL, "CENTIBEL"}, { + MIXF_DECIBEL, "DECIBEL"}, { + MIXF_WIDE, "WIDE"} + }; + GString *s; + GQuark q; + gint i; + + if (flags == 0) + return "None"; + + s = g_string_new (""); + for (i = 0; i < G_N_ELEMENTS (all_flags); ++i) { + if ((flags & all_flags[i].flag)) { + if (s->len > 0) + g_string_append (s, " | "); + g_string_append (s, all_flags[i].nick); + flags &= ~all_flags[i].flag; /* unset */ + } + } + + /* unknown flags? */ + if (flags != 0) { + if (s->len > 0) + g_string_append (s, " | "); + g_string_append (s, "???"); + } + + /* we'll just put it into the global quark table (cheeky, eh?) */ + q = g_quark_from_string (s->str); + g_string_free (s, TRUE); + + return g_quark_to_string (q); +} +#endif /* GST_DISABLE_GST_DEBUG */ + +#ifndef GST_DISABLE_GST_DEBUG +static void +gst_oss4_mixer_control_dump_tree (GstOss4MixerControl * mc, gint depth) +{ + GList *c; + gchar spaces[64]; + gint i; + + depth = MIN (sizeof (spaces) - 1, depth); + for (i = 0; i < depth; ++i) + spaces[i] = ' '; + spaces[i] = '\0'; + + GST_LOG ("%s%s (%s)", spaces, mc->mixext.extname, + mixer_ext_type_get_name (mc->mixext.type)); + for (c = mc->children; c != NULL; c = c->next) { + GstOss4MixerControl *child_mc = (GstOss4MixerControl *) c->data; + + gst_oss4_mixer_control_dump_tree (child_mc, depth + 2); + } +} +#endif /* GST_DISABLE_GST_DEBUG */ + +static GList * +gst_oss4_mixer_get_controls (GstOss4Mixer * mixer) +{ + GstOss4MixerControl *root_mc = NULL; + oss_mixerinfo mi = { 0, }; + GList *controls = NULL; + GList *l; + guint i; + + /* Get info for currently open fd */ + mi.dev = -1; + if (ioctl (mixer->fd, SNDCTL_MIXERINFO, &mi) == -1) + goto no_mixerinfo; + + if (mi.nrext <= 0) { + GST_DEBUG ("mixer %s has no controls", mi.id); + return NULL; + } + + GST_INFO ("Reading controls for mixer %s", mi.id); + + for (i = 0; i < mi.nrext; ++i) { + GstOss4MixerControl *mc; + oss_mixext mix_ext = { 0, }; + + mix_ext.dev = mi.dev; + mix_ext.ctrl = i; + + if (ioctl (mixer->fd, SNDCTL_MIX_EXTINFO, &mix_ext) == -1) { + GST_DEBUG ("SNDCTL_MIX_EXTINFO failed on mixer %s, control %d: %s", + mi.id, i, g_strerror (errno)); + continue; + } + + /* if this is the last one, save it for is-interface-up-to-date checking */ + if (i == mi.nrext) + mixer->last_mixext = mix_ext; + + mc = g_new0 (GstOss4MixerControl, 1); + mc->mixext = mix_ext; + + /* both control_no and desc fields are pretty useless, ie. not always set, + * if ever, so not listed here */ + GST_INFO ("Control %d", mix_ext.ctrl); + GST_INFO (" name : %s", mix_ext.extname); + GST_INFO (" type : %s (%d)", mixer_ext_type_get_name (mix_ext.type), + mix_ext.type); + GST_INFO (" flags : %s (0x%04x)", + mixer_ext_flags_get_string (mix_ext.flags), mix_ext.flags); + GST_INFO (" parent : %d", mix_ext.parent); + + if (!MIXEXT_IS_ROOT (mix_ext)) { + /* find parent (we assume it comes in the list before the child) */ + for (l = controls; l != NULL; l = l->next) { + GstOss4MixerControl *parent_mc = (GstOss4MixerControl *) l->data; + + if (parent_mc->mixext.ctrl == mix_ext.parent) { + mc->parent = parent_mc; + parent_mc->children = g_list_append (parent_mc->children, mc); + break; + } + } + if (mc->parent == NULL) { + GST_ERROR_OBJECT (mixer, "couldn't find parent for control %d", i); + g_free (mc); + continue; + } + } else if (root_mc == NULL) { + root_mc = mc; + } else { + GST_WARNING_OBJECT (mixer, "two root controls?!"); + } + + controls = g_list_prepend (controls, mc); + } + +#ifndef GST_DISABLE_GST_DEBUG + gst_oss4_mixer_control_dump_tree (root_mc, 0); +#endif + + return g_list_reverse (controls); + +/* ERRORS */ +no_mixerinfo: + { + GST_WARNING ("SNDCTL_MIXERINFO failed on mixer device %s: %s", mi.id, + g_strerror (errno)); + return NULL; + } +} + +static void +gst_oss4_mixer_controls_guess_master (GstOss4Mixer * mixer, + const GList * controls) +{ + GstOss4MixerControl *master_mc = NULL; + const GList *l; + + for (l = controls; l != NULL; l = l->next) { + GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; + + /* do we need to check if it's a slider type here? */ + if ((mc->mixext.flags & MIXF_PCMVOL)) { + GST_INFO_OBJECT (mixer, "First PCM control: %s", mc->mixext.extname); + master_mc = mc; + break; + } + + if (((mc->mixext.flags & MIXF_MAINVOL)) && master_mc == NULL) { + GST_INFO_OBJECT (mixer, "First main volume control: %s", + mc->mixext.extname); + master_mc = mc; + } + } + + if (master_mc != NULL) + master_mc->is_master = TRUE; +} + +/* type: -1 for all types, otherwise just return siblings with requested type */ +static GList * +gst_oss4_mixer_control_get_siblings (GstOss4MixerControl * mc, gint type) +{ + GList *s, *siblings = NULL; + + if (mc->parent == NULL) + return NULL; + + for (s = mc->parent->children; s != NULL; s = s->next) { + GstOss4MixerControl *sibling = (GstOss4MixerControl *) s->data; + + if (mc != sibling && (type < 0 || sibling->mixext.type == type)) + siblings = g_list_append (siblings, sibling); + } + + return siblings; +} + +static void +gst_oss4_mixer_controls_find_sliders (GstOss4Mixer * mixer, + const GList * controls) +{ + const GList *l; + + for (l = controls; l != NULL; l = l->next) { + GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; + GList *s, *siblings; + + if (!MIXEXT_IS_SLIDER (mc->mixext) || mc->parent == NULL || mc->used) + continue; + + mc->is_slider = TRUE; + mc->used = TRUE; + + siblings = gst_oss4_mixer_control_get_siblings (mc, -1); + + /* Note: the names can be misleading and may not reflect the actual + * hierarchy of the controls, e.g. it's possible that a slider is called + * connector.green and the mute control then connector.green.mute, but + * both controls are in fact siblings and both children of the group + * 'green' instead of mute being a child of connector.green as the naming + * would seem to suggest */ + GST_LOG ("Slider: %s, parent=%s, %d siblings", mc->mixext.extname, + mc->parent->mixext.extname, g_list_length (siblings)); + + for (s = siblings; s != NULL; s = s->next) { + GstOss4MixerControl *sibling = (GstOss4MixerControl *) s->data; + + GST_LOG (" %s (%s)", sibling->mixext.extname, + mixer_ext_type_get_name (sibling->mixext.type)); + + if (sibling->mixext.type == MIXT_MUTE || + g_str_has_suffix (sibling->mixext.extname, ".mute")) { + /* simple case: slider with single mute sibling. We assume the .mute + * suffix in the name won't change - can't really do much else anyway */ + if (sibling->mixext.type == MIXT_ONOFF || + sibling->mixext.type == MIXT_MUTE) { + GST_LOG (" mute control for %s is %s", mc->mixext.extname, + sibling->mixext.extname); + mc->mute = sibling; + sibling->used = TRUE; + } + /* a group of .mute controls. We assume they are all switches here */ + if (sibling->mixext.type == MIXT_GROUP) { + GList *m; + + for (m = sibling->children; m != NULL; m = m->next) { + GstOss4MixerControl *grouped_sibling = m->data; + + if (grouped_sibling->mixext.type == MIXT_ONOFF || + grouped_sibling->mixext.type == MIXT_MUTE) { + GST_LOG (" %s is grouped mute control for %s", + grouped_sibling->mixext.extname, mc->mixext.extname); + mc->mute_group = g_list_append (mc->mute_group, grouped_sibling); + } + } + + GST_LOG (" %s has a group of %d mute controls", + mc->mixext.extname, g_list_length (mc->mute_group)); + + /* we don't mark the individual mute controls as used, only the + * group control, as we still want individual switches for the + * individual controls */ + sibling->used = TRUE; + } + } + } + g_list_free (siblings); + } +} + +/* should be called with the mixer object lock held because of the ioctl; + * returns TRUE if the list was read the first time or modified */ +static gboolean +gst_oss4_mixer_enum_control_update_enum_list (GstOss4Mixer * mixer, + GstOss4MixerControl * mc) +{ + oss_mixer_enuminfo ei = { 0, }; + guint num_existing = 0; + int i; + + /* count and existing values */ + while (mc->enum_vals != NULL && mc->enum_vals[num_existing] != 0) + ++num_existing; + + ei.dev = mc->mixext.dev; + ei.ctrl = mc->mixext.ctrl; + + /* if we have create a generic list with numeric IDs already and the + * number of values hasn't changed, then there's not much to do here */ + if (mc->no_list && mc->enum_vals != NULL && + num_existing == mc->mixext.maxvalue) { + return FALSE; + } + + /* if we have a list and it doesn't change, there's nothing to do either */ + if (mc->enum_vals != NULL && mc->enum_version == 0) + return FALSE; + + if (ioctl (mixer->fd, SNDCTL_MIX_ENUMINFO, &ei) == -1) { + g_free (mc->enum_vals); + mc->enum_vals = g_new0 (GQuark, mc->mixext.maxvalue + 1); + + GST_DEBUG ("no enum info available, creating numeric values from 0-%d", + mc->mixext.maxvalue - 1); + + /* "It is possible that some enum controls don't have any name list + * available. In this case the application should automatically generate + * list of numbers (0 to N-1)" */ + for (i = 0; i < mc->mixext.maxvalue; ++i) { + gchar num_str[8]; + + g_snprintf (num_str, sizeof (num_str), "%d", i); + mc->enum_vals[i] = g_quark_from_string (num_str); + } + mc->enum_version = 0; /* the only way to change is via maxvalue */ + } else { + /* old list same as current list? */ + if (mc->enum_vals != NULL && mc->enum_version == ei.version) + return FALSE; + + /* no list yet, or the list has changed */ + GST_LOG ("%s", (mc->enum_vals) ? "enum list has changed" : "reading list"); + if (ei.nvalues != mc->mixext.maxvalue) { + GST_WARNING_OBJECT (mixer, "Enum: %s, nvalues %d != maxvalue %d", + mc->mixext.extname, ei.nvalues, mc->mixext.maxvalue); + mc->mixext.maxvalue = MIN (ei.nvalues, mc->mixext.maxvalue); + } + + mc->mixext.maxvalue = MIN (mc->mixext.maxvalue, OSS_ENUM_MAXVALUE); + + g_free (mc->enum_vals); + mc->enum_vals = g_new0 (GQuark, mc->mixext.maxvalue + 1); + for (i = 0; i < mc->mixext.maxvalue; ++i) { + GST_LOG (" %s", ei.strings + ei.strindex[i]); + mc->enum_vals[i] = + g_quark_from_string (gst_oss4_mixer_control_get_translated_option + (ei.strings + ei.strindex[i])); + } + } + + return TRUE; +} + +static void +gst_oss4_mixer_controls_find_enums (GstOss4Mixer * mixer, + const GList * controls) +{ + const GList *l; + + for (l = controls; l != NULL; l = l->next) { + GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; + + if (mc->mixext.type != MIXT_ENUM || mc->used) + continue; + + mc->is_enum = TRUE; + mc->used = TRUE; + + /* Note: enums are special: for most controls, the maxvalue is inclusive, + * but for enum controls it's actually exclusive (boggle), so that + * mixext.maxvalue = num_values */ + + GST_LOG ("Enum: %s, parent=%s, num_enums=%d", mc->mixext.extname, + mc->parent->mixext.extname, mc->mixext.maxvalue); + + gst_oss4_mixer_enum_control_update_enum_list (mixer, mc); + } +} + +static void +gst_oss4_mixer_controls_find_switches (GstOss4Mixer * mixer, + const GList * controls) +{ + const GList *l; + + for (l = controls; l != NULL; l = l->next) { + GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; + + if (mc->used) + continue; + + if (mc->mixext.type != MIXT_ONOFF && mc->mixext.type != MIXT_MUTE) + continue; + + mc->is_switch = TRUE; + mc->used = TRUE; + + GST_LOG ("Switch: %s, parent=%s", mc->mixext.extname, + mc->parent->mixext.extname); + } +} + +static void +gst_oss4_mixer_controls_find_virtual (GstOss4Mixer * mixer, + const GList * controls) +{ + const GList *l; + + for (l = controls; l != NULL; l = l->next) { + GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; + + /* or sscanf (mc->mixext.extname, "vmix%d-out.", &n) == 1 ? */ + /* for now we just flag all virtual controls with managed labels, those + * are really more appropriate for a pavucontrol-type control thing than + * the (more hardware-oriented) mixer interface */ + if (mc->mixext.id[0] == '@') { + mc->is_virtual = TRUE; + GST_LOG ("%s is virtual control with managed label", mc->mixext.extname); + } + } +} + +static void +gst_oss4_mixer_controls_dump_unused (GstOss4Mixer * mixer, + const GList * controls) +{ + const GList *l; + + for (l = controls; l != NULL; l = l->next) { + GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; + + if (mc->used) + continue; + + switch (mc->mixext.type) { + case MIXT_DEVROOT: + case MIXT_GROUP: + case MIXT_MESSAGE: + case MIXT_MONOVU: + case MIXT_STEREOVU: + case MIXT_MONOPEAK: + case MIXT_STEREOPEAK: + case MIXT_MARKER: + continue; /* not interested in these types of controls */ + case MIXT_MONODB: + case MIXT_STEREODB: + GST_DEBUG ("obsolete control type %d", mc->mixext.type); + continue; + case MIXT_MONOSLIDER: + case MIXT_STEREOSLIDER: + case MIXT_SLIDER: + case MIXT_MONOSLIDER16: + case MIXT_STEREOSLIDER16: + /* this shouldn't happen */ + GST_ERROR ("unused slider control?!"); + continue; + case MIXT_VALUE: + case MIXT_HEXVALUE: + /* value entry, not sure what to do with that, skip for now */ + continue; + case MIXT_ONOFF: + case MIXT_MUTE: + case MIXT_ENUM: + case MIXT_3D: + case MIXT_RADIOGROUP: + GST_DEBUG ("FIXME: handle %s %s", + mixer_ext_type_get_name (mc->mixext.type), mc->mixext.extname); + break; + default: + GST_WARNING ("unknown control type %d", mc->mixext.type); + continue; + } + } +} + +static GList * +gst_oss4_mixer_create_tracks (GstOss4Mixer * mixer, const GList * controls) +{ + const GList *c; + GList *tracks = NULL; + + for (c = controls; c != NULL; c = c->next) { + GstOss4MixerControl *mc = (GstOss4MixerControl *) c->data; + GstMixerTrack *track = NULL; + + if (mc->is_virtual) + continue; + + if (mc->is_slider) { + track = gst_oss4_mixer_slider_new (mixer, mc); + } else if (mc->is_enum) { + track = gst_oss4_mixer_enum_new (mixer, mc); + } else if (mc->is_switch) { + track = gst_oss4_mixer_switch_new (mixer, mc); + } + + if (track == NULL) + continue; + + track->label = gst_oss4_mixer_control_get_translated_name (mc); + track->flags = 0; + + GST_LOG ("translated label: %s [%s] = %s", track->label, mc->mixext.id, + track->label); + + /* This whole 'a track is either INPUT or OUTPUT' model is just flawed, + * esp. if a slider's role can be changed on the fly, like when you change + * function of a connector. What should we do in that case? Change the flag + * and make the app rebuild the interface? Ignore it? */ + if (mc->mixext.flags & (MIXF_MAINVOL | MIXF_PCMVOL)) { + track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST; + + } else if (mc->mixext.flags & MIXF_RECVOL) { + /* record gain whitelisted by default */ + track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD | + GST_MIXER_TRACK_WHITELIST; + + } else if (mc->mixext.flags & MIXF_MONVOL) { + /* monitor sources not whitelisted by default */ + track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD; + } + + /* + * The kernel may give us better clues about the scope of a control. + * If so, try to honor it. + */ + switch (mc->mixext.desc & MIXEXT_SCOPE_MASK) { + case MIXEXT_SCOPE_INPUT: + case MIXEXT_SCOPE_RECSWITCH: + track->flags |= GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD | + GST_MIXER_TRACK_WHITELIST; + break; + case MIXEXT_SCOPE_MONITOR: + /* don't whitelist monitor tracks by default */ + track->flags |= GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD; + break; + case MIXEXT_SCOPE_OUTPUT: + track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST; + break; + } + + if (mc->is_master) { + track->flags |= GST_MIXER_TRACK_OUTPUT; + } + + if (mc->is_master) + track->flags |= GST_MIXER_TRACK_MASTER; + + tracks = g_list_append (tracks, track); + } + + return tracks; +} + +static void +gst_oss4_mixer_update_tracks (GstOss4Mixer * mixer) +{ + GList *controls, *tracks; + + /* read and process controls */ + controls = gst_oss4_mixer_get_controls (mixer); + + gst_oss4_mixer_controls_guess_master (mixer, controls); + + gst_oss4_mixer_controls_find_sliders (mixer, controls); + + gst_oss4_mixer_controls_find_enums (mixer, controls); + + gst_oss4_mixer_controls_find_switches (mixer, controls); + + gst_oss4_mixer_controls_find_virtual (mixer, controls); + + gst_oss4_mixer_controls_dump_unused (mixer, controls); + + tracks = gst_oss4_mixer_create_tracks (mixer, controls); + + /* free old tracks and controls */ + gst_oss4_mixer_free_tracks (mixer); + + /* replace old with new */ + mixer->tracks = tracks; + mixer->controls = controls; +} + +static const GList * +gst_oss4_mixer_list_tracks (GstMixer * mixer_iface) +{ + GstOss4Mixer *mixer = GST_OSS4_MIXER (mixer_iface); + + g_return_val_if_fail (mixer != NULL, NULL); + g_return_val_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer), NULL); + + GST_OBJECT_LOCK (mixer); + + /* Do a read on the last control to check if the interface has changed */ + if (!mixer->need_update && mixer->last_mixext.ctrl > 0) { + GstOss4MixerControl mc = { {0,} + , + }; + int val; + + mc.mixext = mixer->last_mixext; + gst_oss4_mixer_get_control_val (mixer, &mc, &val); + } + + if (mixer->need_update || mixer->tracks == NULL) { + gst_oss4_mixer_update_tracks (mixer); + mixer->need_update = FALSE; + } + + GST_OBJECT_UNLOCK (mixer); + + return (const GList *) mixer->tracks; +} + +static void +gst_oss4_mixer_set_volume (GstMixer * mixer, GstMixerTrack * track, + gint * volumes) +{ + GstOss4Mixer *oss; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); + g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); + g_return_if_fail (gst_oss4_mixer_contains_track (mixer, track)); + g_return_if_fail (volumes != NULL); + + oss = GST_OSS4_MIXER (mixer); + + GST_OBJECT_LOCK (oss); + + if (GST_IS_OSS4_MIXER_SLIDER (track)) { + gst_oss4_mixer_slider_set_volume (GST_OSS4_MIXER_SLIDER (track), volumes); + } + + GST_OBJECT_UNLOCK (oss); +} + +static void +gst_oss4_mixer_get_volume (GstMixer * mixer, GstMixerTrack * track, + gint * volumes) +{ + GstOss4Mixer *oss; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); + g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); + g_return_if_fail (gst_oss4_mixer_contains_track (mixer, track)); + g_return_if_fail (volumes != NULL); + + oss = GST_OSS4_MIXER (mixer); + + GST_OBJECT_LOCK (oss); + + memset (volumes, 0, track->num_channels * sizeof (gint)); + + if (GST_IS_OSS4_MIXER_SWITCH (track)) { + gboolean enabled = FALSE; + gst_oss4_mixer_switch_get (GST_OSS4_MIXER_SWITCH (track), &enabled); + } + if (GST_IS_OSS4_MIXER_SLIDER (track)) { + gst_oss4_mixer_slider_get_volume (GST_OSS4_MIXER_SLIDER (track), volumes); + } + + GST_OBJECT_UNLOCK (oss); +} + +static void +gst_oss4_mixer_set_record (GstMixer * mixer, GstMixerTrack * track, + gboolean record) +{ + GstOss4Mixer *oss; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); + g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); + g_return_if_fail (gst_oss4_mixer_contains_track (mixer, track)); + + oss = GST_OSS4_MIXER (mixer); + + GST_OBJECT_LOCK (oss); + + if (GST_IS_OSS4_MIXER_SLIDER (track)) { + gst_oss4_mixer_slider_set_record (GST_OSS4_MIXER_SLIDER (track), record); + } else if (GST_IS_OSS4_MIXER_SWITCH (track)) { + if ((track->flags & GST_MIXER_TRACK_INPUT)) { + gst_oss4_mixer_switch_set (GST_OSS4_MIXER_SWITCH (track), record); + } else { + GST_WARNING_OBJECT (track, "set_record called on non-INPUT track"); + } + } + + GST_OBJECT_UNLOCK (oss); +} + +static void +gst_oss4_mixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute) +{ + GstOss4Mixer *oss; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); + g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); + g_return_if_fail (gst_oss4_mixer_contains_track (mixer, track)); + + oss = GST_OSS4_MIXER (mixer); + + GST_OBJECT_LOCK (oss); + + if (GST_IS_OSS4_MIXER_SLIDER (track)) { + gst_oss4_mixer_slider_set_mute (GST_OSS4_MIXER_SLIDER (track), mute); + } else if (GST_IS_OSS4_MIXER_SWITCH (track)) { + gst_oss4_mixer_switch_set (GST_OSS4_MIXER_SWITCH (track), mute); + } + + GST_OBJECT_UNLOCK (oss); +} + +static void +gst_oss4_mixer_set_option (GstMixer * mixer, GstMixerOptions * options, + gchar * value) +{ + GstOss4Mixer *oss; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (value != NULL); + g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); + g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); + g_return_if_fail (GST_IS_OSS4_MIXER_ENUM (options)); + g_return_if_fail (gst_oss4_mixer_contains_options (mixer, options)); + + oss = GST_OSS4_MIXER (mixer); + + GST_OBJECT_LOCK (oss); + + if (!gst_oss4_mixer_enum_set_option (GST_OSS4_MIXER_ENUM (options), value)) { + /* not much we can do here but wake up the watch thread early, so it + * can do its thing and post messages if anything has changed */ + gst_oss4_mixer_wake_up_watch_task (oss); + } + + GST_OBJECT_UNLOCK (oss); +} + +static const gchar * +gst_oss4_mixer_get_option (GstMixer * mixer, GstMixerOptions * options) +{ + GstOss4Mixer *oss; + const gchar *current_val; + + g_return_val_if_fail (mixer != NULL, NULL); + g_return_val_if_fail (GST_IS_OSS4_MIXER (mixer), NULL); + g_return_val_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer), NULL); + g_return_val_if_fail (GST_IS_OSS4_MIXER_ENUM (options), NULL); + g_return_val_if_fail (gst_oss4_mixer_contains_options (mixer, options), NULL); + + oss = GST_OSS4_MIXER (mixer); + + GST_OBJECT_LOCK (oss); + + current_val = gst_oss4_mixer_enum_get_option (GST_OSS4_MIXER_ENUM (options)); + + if (current_val == NULL) { + /* not much we can do here but wake up the watch thread early, so it + * can do its thing and post messages if anything has changed */ + gst_oss4_mixer_wake_up_watch_task (oss); + } + + GST_OBJECT_UNLOCK (oss); + + return current_val; +} + +static GstMixerFlags +gst_oss4_mixer_get_mixer_flags (GstMixer * mixer) +{ + return GST_MIXER_FLAG_AUTO_NOTIFICATIONS | GST_MIXER_FLAG_HAS_WHITELIST | + GST_MIXER_FLAG_GROUPING; +} + +static void +gst_oss4_mixer_interface_init (GstMixerClass * klass) +{ + GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; + + klass->list_tracks = gst_oss4_mixer_list_tracks; + klass->set_volume = gst_oss4_mixer_set_volume; + klass->get_volume = gst_oss4_mixer_get_volume; + klass->set_mute = gst_oss4_mixer_set_mute; + klass->set_record = gst_oss4_mixer_set_record; + klass->set_option = gst_oss4_mixer_set_option; + klass->get_option = gst_oss4_mixer_get_option; + klass->get_mixer_flags = gst_oss4_mixer_get_mixer_flags; +} + +/* Implement the horror that is GstImplementsInterface */ + +static gboolean +gst_oss4_mixer_supported (GstImplementsInterface * iface, GType iface_type) +{ + GstOss4Mixer *mixer; + + g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE); + + mixer = GST_OSS4_MIXER (iface); + + return GST_OSS4_MIXER_IS_OPEN (mixer); +} + +static void +gst_oss4_mixer_implements_interface_init (GstImplementsInterfaceClass * klass) +{ + klass->supported = gst_oss4_mixer_supported; +} + +static void +gst_oss4_mixer_init_interfaces (GType type) +{ + static const GInterfaceInfo implements_iface_info = { + (GInterfaceInitFunc) gst_oss4_mixer_implements_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo mixer_iface_info = { + (GInterfaceInitFunc) gst_oss4_mixer_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, + &implements_iface_info); + g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info); + + gst_oss4_add_property_probe_interface (type); +} diff --git a/sys/oss4/oss4-mixer.h b/sys/oss4/oss4-mixer.h new file mode 100644 index 0000000..4eaff50 --- /dev/null +++ b/sys/oss4/oss4-mixer.h @@ -0,0 +1,128 @@ +/* GStreamer OSS4 mixer implementation + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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 OSS4_MIXER_H +#define OSS4_MIXER_H + +#include + +#include "oss4-soundcard.h" + +#define GST_OSS4_MIXER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_MIXER,GstOss4Mixer)) +#define GST_OSS4_MIXER_CAST(obj) ((GstOss4Mixer *)(obj)) +#define GST_OSS4_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_MIXER,GstOss4MixerClass)) +#define GST_IS_OSS4_MIXER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_MIXER)) +#define GST_IS_OSS4_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_MIXER)) +#define GST_TYPE_OSS4_MIXER (gst_oss4_mixer_get_type()) + +#define GST_OSS4_MIXER_IS_OPEN(obj) (GST_OSS4_MIXER(obj)->fd != -1) + +typedef struct _GstOss4Mixer GstOss4Mixer; +typedef struct _GstOss4MixerClass GstOss4MixerClass; + +struct _GstOss4Mixer { + GstElement element; + + /*< private >*/ + + /* element bits'n'bops */ + gchar * device; + + /* mixer details */ + gint fd; /* file descriptor if open, or -1 */ + gchar * device_name; /* device description, or NULL */ + gchar * open_device; /* the device we opened */ + + GList * tracks; /* list of available tracks */ + GList * controls; /* list of available controls */ + gboolean need_update; /* re-read list of available tracks? */ + + oss_mixext last_mixext; /* we keep this around so we can + * easily check if the mixer + * interface has changed */ + + GThread * watch_thread; /* thread watching for value changes */ + GCond * watch_cond; + gint watch_shutdown; + gint modify_counter; /* from MIXERINFO */ + + /* for property probe interface */ + GList * property_probe_list; +}; + +struct _GstOss4MixerClass { + GstElementClass element_class; +}; + +/* helper struct holding info about one control */ +typedef struct _GstOss4MixerControl GstOss4MixerControl; + +struct _GstOss4MixerControl { + oss_mixext mixext; + GstOss4MixerControl *parent; /* NULL if root */ + GstOss4MixerControl *mute; /* sibling with mute function, or NULL */ + GList *mute_group; /* group of mute controls, or NULL */ + GList *children; /* GstOss4MixerControls (no ownership) */ + + GQuark *enum_vals; /* 0-terminated array of values or NULL */ + int enum_version; /* 0 = list won't change */ + + int last_val; /* last value seen */ + + gboolean is_virtual : 1; /* is a vmix control with dynamic label */ + gboolean is_master : 1; + gboolean is_slider : 1; /* represent as slider */ + gboolean is_switch : 1; /* represent as switch */ + gboolean is_enum : 1; /* represent as combo/enumeration */ + gboolean no_list : 1; /* enumeration with no list available */ + gboolean is_input : 1; /* is an input-related control */ + gboolean is_output : 1; /* is an output-related control */ + gboolean used : 1; /* whether we know what to do with this */ + + gboolean changed : 1; /* transient flag used by watch thread */ + gboolean list_changed : 1; /* transient flag used by watch thread */ +}; + +/* header says parent=-1 means root, but it can also be parent=ctrl */ +#define MIXEXT_IS_ROOT(me) ((me).parent == -1 || (me).parent == (me).ctrl) + +#define MIXEXT_IS_SLIDER(me) ((me).type == MIXT_MONOSLIDER || \ + (me).type == MIXT_STEREOSLIDER || (me).type == MIXT_MONOSLIDER16 || \ + (me).type == MIXT_STEREOSLIDER16 || (me).type == MIXT_SLIDER) + +#define MIXEXT_HAS_DESCRIPTION(me) (((me).flags & MIXF_DESCR) != 0) + +#define MIXEXT_ENUM_IS_AVAILABLE(me,num) \ + (((me).enum_present[num/8]) & (1 << (num % 8))) + + +GType gst_oss4_mixer_get_type (void); + +gboolean gst_oss4_mixer_get_control_val (GstOss4Mixer * mixer, + GstOss4MixerControl * mc, + int * val); + +gboolean gst_oss4_mixer_set_control_val (GstOss4Mixer * mixer, + GstOss4MixerControl * mc, + int val); + +G_END_DECLS + +#endif /* OSS4_MIXER_H */ + diff --git a/sys/oss4/oss4-property-probe.c b/sys/oss4/oss4-property-probe.c new file mode 100644 index 0000000..a99410e --- /dev/null +++ b/sys/oss4/oss4-property-probe.c @@ -0,0 +1,412 @@ +/* GStreamer OSS4 audio property probe interface implementation + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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 +#endif + +#include + +#define NO_LEGACY_MIXER +#include "oss4-audio.h" +#include "oss4-mixer.h" +#include "oss4-sink.h" +#include "oss4-source.h" +#include "oss4-soundcard.h" +#include "oss4-property-probe.h" + +#include +#include +#include +#include +#include +#include +#include + +GST_DEBUG_CATEGORY_EXTERN (oss4_debug); +#define GST_CAT_DEFAULT oss4_debug + +static const GList * +gst_oss4_property_probe_get_properties (GstPropertyProbe * probe) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS (probe); + GList *list; + + GST_OBJECT_LOCK (GST_OBJECT (probe)); + + /* we create a new list and store it in the instance struct, since apparently + * we forgot to update the API for 0.10 (and why don't we mark probable + * properties with a flag instead anyway?). A bit hackish, but what can you + * do (can't really use a static variable since the pspec will be different + * for src and sink class); this isn't particularly pretty, but the best + * we can do given that we can't create a common base class (we could do + * fancy things with the interface, or use g_object_set_data instead, but + * it's not really going to make it much better) */ + if (GST_IS_AUDIO_SINK_CLASS (klass)) { + list = GST_OSS4_SINK (probe)->property_probe_list; + } else if (GST_IS_AUDIO_SRC_CLASS (klass)) { + list = GST_OSS4_SOURCE (probe)->property_probe_list; + } else if (GST_IS_OSS4_MIXER_CLASS (klass)) { + list = GST_OSS4_MIXER (probe)->property_probe_list; + } else { + GST_OBJECT_UNLOCK (GST_OBJECT (probe)); + g_return_val_if_reached (NULL); + } + + if (list == NULL) { + GParamSpec *pspec; + + pspec = g_object_class_find_property (klass, "device"); + list = g_list_prepend (NULL, pspec); + + if (GST_IS_AUDIO_SINK_CLASS (klass)) { + GST_OSS4_SINK (probe)->property_probe_list = list; + } else if (GST_IS_AUDIO_SRC_CLASS (klass)) { + GST_OSS4_SOURCE (probe)->property_probe_list = list; + } else if (GST_IS_OSS4_MIXER_CLASS (klass)) { + GST_OSS4_MIXER (probe)->property_probe_list = list; + } + } + + GST_OBJECT_UNLOCK (GST_OBJECT (probe)); + + return list; +} + +static void +gst_oss4_property_probe_probe_property (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + if (!g_str_equal (pspec->name, "device")) { + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + } +} + +static gboolean +gst_oss4_property_probe_needs_probe (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + /* don't cache probed data */ + return TRUE; +} + +static gint +oss4_mixerinfo_priority_cmp (struct oss_mixerinfo *mi1, + struct oss_mixerinfo *mi2) +{ + /* return negative vaue if mi1 comes before mi2 */ + if (mi1->priority != mi2->priority) + return mi2->priority - mi1->priority; + + return strcmp (mi1->devnode, mi2->devnode); +} + +/* caller must ensure LOCK is taken (e.g. if ioctls need to be serialised) */ +gboolean +gst_oss4_property_probe_find_device_name (GstObject * obj, int fd, + const gchar * device_handle, gchar ** device_name) +{ + struct oss_sysinfo si = { {0,}, }; + gchar *name = NULL; + + if (ioctl (fd, SNDCTL_SYSINFO, &si) == 0) { + int i; + + for (i = 0; i < si.numaudios; ++i) { + struct oss_audioinfo ai = { 0, }; + + ai.dev = i; + if (ioctl (fd, SNDCTL_AUDIOINFO, &ai) == -1) { + GST_DEBUG_OBJECT (obj, "AUDIOINFO ioctl for device %d failed", i); + continue; + } + if (strcmp (ai.devnode, device_handle) == 0) { + name = g_strdup (ai.name); + break; + } + } + } else { + GST_WARNING_OBJECT (obj, "SYSINFO ioctl failed: %s", g_strerror (errno)); + } + + /* try ENGINEINFO as fallback (which is better than nothing) */ + if (name == NULL) { + struct oss_audioinfo ai = { 0, }; + + GST_LOG_OBJECT (obj, "device %s not listed in AUDIOINFO", device_handle); + ai.dev = -1; + if (ioctl (fd, SNDCTL_ENGINEINFO, &ai) == 0) + name = g_strdup (ai.name); + } + + GST_DEBUG_OBJECT (obj, "Device name: %s", GST_STR_NULL (name)); + + if (name != NULL) + *device_name = name; + + return (name != NULL); +} + +gboolean +gst_oss4_property_probe_find_device_name_nofd (GstObject * obj, + const gchar * device_handle, gchar ** device_name) +{ + gboolean res; + int fd; + + fd = open ("/dev/mixer", O_RDONLY); + if (fd < 0) + return FALSE; + + res = gst_oss4_property_probe_find_device_name (obj, fd, device_handle, + device_name); + + close (fd); + return res; +} + +static GList * +gst_oss4_property_probe_get_mixer_devices (GstObject * obj, int fd, + struct oss_sysinfo *si) +{ + GList *m, *mixers = NULL; + GList *devices = NULL; + + int i; + + GST_LOG_OBJECT (obj, "%d mixer devices", si->nummixers); + + /* first, find suitable mixer devices and sort by priority */ + for (i = 0; i < si->nummixers; ++i) { + struct oss_mixerinfo mi = { 0, }; + + mi.dev = i; + if (ioctl (fd, SNDCTL_MIXERINFO, &mi) == -1) { + GST_DEBUG_OBJECT (obj, "MIXERINFO ioctl for device %d failed", i); + continue; + } + + GST_INFO_OBJECT (obj, "mixer device %d:", i); + GST_INFO_OBJECT (obj, " enabled : %s", (mi.enabled) ? "yes" : + "no (powered off or unplugged)"); + GST_INFO_OBJECT (obj, " priority : %d", mi.priority); + GST_INFO_OBJECT (obj, " devnode : %s", mi.devnode); + GST_INFO_OBJECT (obj, " handle : %s", mi.handle); + GST_INFO_OBJECT (obj, " caps : 0x%02x", mi.caps); + GST_INFO_OBJECT (obj, " name : %s", mi.name); + + if (!mi.enabled) { + GST_DEBUG_OBJECT (obj, "mixer device is not usable/enabled, skipping"); + continue; + } + + /* only want mixers that control hardware directly */ + if ((mi.caps & MIXER_CAP_VIRTUAL)) { + GST_DEBUG_OBJECT (obj, "mixer device is a virtual device, skipping"); + continue; + } + + mixers = g_list_insert_sorted (mixers, g_memdup (&mi, sizeof (mi)), + (GCompareFunc) oss4_mixerinfo_priority_cmp); + } + + /* then create device list according to priority */ + for (m = mixers; m != NULL; m = m->next) { + struct oss_mixerinfo *mi = (struct oss_mixerinfo *) m->data; + + GST_LOG_OBJECT (obj, "mixer device: '%s'", mi->devnode); + devices = g_list_prepend (devices, g_strdup (mi->devnode)); + g_free (m->data); + } + g_list_free (mixers); + mixers = NULL; + + return g_list_reverse (devices); +} + +static GList * +gst_oss4_property_probe_get_audio_devices (GstObject * obj, int fd, + struct oss_sysinfo *si, int cap_mask) +{ + GList *devices = NULL; + int i; + + GST_LOG_OBJECT (obj, "%d audio/dsp devices", si->numaudios); + + for (i = 0; i < si->numaudios; ++i) { + struct oss_audioinfo ai = { 0, }; + + ai.dev = i; + if (ioctl (fd, SNDCTL_AUDIOINFO, &ai) == -1) { + GST_DEBUG_OBJECT (obj, "AUDIOINFO ioctl for device %d failed", i); + continue; + } + + if ((ai.caps & cap_mask) == 0) { + GST_DEBUG_OBJECT (obj, "audio device %d is not an %s device", i, + (cap_mask == PCM_CAP_OUTPUT) ? "output" : "input"); + continue; + } + + if (!ai.enabled) { + GST_DEBUG_OBJECT (obj, "audio device %d is not usable/enabled", i); + continue; + } + + GST_DEBUG_OBJECT (obj, "audio device %d looks ok: %s (\"%s\")", i, + ai.devnode, ai.name); + + devices = g_list_prepend (devices, g_strdup (ai.devnode)); + } + + return g_list_reverse (devices); +} + +static GValueArray * +gst_oss4_property_probe_get_values (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + struct oss_sysinfo si = { {0,}, }; + GValueArray *array = NULL; + GstObject *obj; + GList *devices, *l; + int cap_mask, fd = -1; + + if (!g_str_equal (pspec->name, "device")) { + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + return NULL; + } + + obj = GST_OBJECT (probe); + + GST_OBJECT_LOCK (obj); + + /* figure out whether the element is a source or sink */ + if (GST_IS_OSS4_SINK (probe)) { + GST_DEBUG_OBJECT (probe, "probing available output devices"); + cap_mask = PCM_CAP_OUTPUT; + fd = GST_OSS4_SINK (probe)->fd; + } else if (GST_IS_OSS4_SOURCE (probe)) { + GST_DEBUG_OBJECT (probe, "probing available input devices"); + cap_mask = PCM_CAP_INPUT; + fd = GST_OSS4_SOURCE (probe)->fd; + } else if (GST_IS_OSS4_MIXER (probe)) { + fd = GST_OSS4_MIXER (probe)->fd; + cap_mask = 0; + } else { + GST_OBJECT_UNLOCK (obj); + g_return_val_if_reached (NULL); + } + + /* copy fd if it's open, so we can just unconditionally close() later */ + if (fd != -1) + fd = dup (fd); + + /* this will also catch the unlikely case where the above dup() failed */ + if (fd == -1) { + fd = open ("/dev/mixer", O_RDONLY | O_NONBLOCK, 0); + if (fd < 0) + goto open_failed; + else if (!gst_oss4_audio_check_version (GST_OBJECT (probe), fd)) + goto legacy_oss; + } + + if (ioctl (fd, SNDCTL_SYSINFO, &si) == -1) + goto no_sysinfo; + + if (cap_mask != 0) { + devices = + gst_oss4_property_probe_get_audio_devices (obj, fd, &si, cap_mask); + } else { + devices = gst_oss4_property_probe_get_mixer_devices (obj, fd, &si); + } + + if (devices == NULL) { + GST_DEBUG_OBJECT (obj, "No devices found"); + goto done; + } + + array = g_value_array_new (1); + + for (l = devices; l != NULL; l = l->next) { + GValue val = { 0, }; + + g_value_init (&val, G_TYPE_STRING); + g_value_take_string (&val, (gchar *) l->data); + l->data = NULL; + g_value_array_append (array, &val); + g_value_unset (&val); + } + + GST_OBJECT_UNLOCK (obj); + + g_list_free (devices); + +done: + + close (fd); + + return array; + +/* ERRORS */ +open_failed: + { + GST_OBJECT_UNLOCK (GST_OBJECT (probe)); + GST_WARNING_OBJECT (probe, "Can't open file descriptor to probe " + "available devices: %s", g_strerror (errno)); + return NULL; + } +legacy_oss: + { + close (fd); + GST_OBJECT_UNLOCK (GST_OBJECT (probe)); + GST_DEBUG_OBJECT (probe, "Legacy OSS (ie. not OSSv4), not supported"); + return NULL; + } +no_sysinfo: + { + close (fd); + GST_OBJECT_UNLOCK (GST_OBJECT (probe)); + GST_WARNING_OBJECT (probe, "Can't open file descriptor to probe " + "available devices: %s", g_strerror (errno)); + return NULL; + } +} + +static void +gst_oss4_property_probe_interface_init (GstPropertyProbeInterface * iface) +{ + iface->get_properties = gst_oss4_property_probe_get_properties; + iface->probe_property = gst_oss4_property_probe_probe_property; + iface->needs_probe = gst_oss4_property_probe_needs_probe; + iface->get_values = gst_oss4_property_probe_get_values; +} + +void +gst_oss4_add_property_probe_interface (GType type) +{ + static const GInterfaceInfo probe_iface_info = { + (GInterfaceInitFunc) gst_oss4_property_probe_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &probe_iface_info); +} diff --git a/sys/oss4/oss4-property-probe.h b/sys/oss4/oss4-property-probe.h new file mode 100644 index 0000000..707af02 --- /dev/null +++ b/sys/oss4/oss4-property-probe.h @@ -0,0 +1,38 @@ +/* GStreamer OSS4 audio property probe interface implementation + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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_OSS4_PROPERTY_PROBE_H +#define GST_OSS4_PROPERTY_PROBE_H + +#include + +void gst_oss4_add_property_probe_interface (GType type); + +gboolean gst_oss4_property_probe_find_device_name (GstObject * obj, + int fd, + const gchar * device_handle, + gchar ** device_name); + +gboolean gst_oss4_property_probe_find_device_name_nofd (GstObject * obj, + const gchar * device_handle, + gchar ** device_name); + +#endif /* GST_OSS4_PROPERTY_PROBE_H */ + + diff --git a/sys/oss4/oss4-sink.c b/sys/oss4/oss4-sink.c new file mode 100644 index 0000000..54e95b9 --- /dev/null +++ b/sys/oss4/oss4-sink.c @@ -0,0 +1,696 @@ +/* GStreamer OSS4 audio sink + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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-oss4sink + * + * This element lets you output sound using the Open Sound System (OSS) + * version 4. + * + * Note that you should almost always use generic audio conversion elements + * like audioconvert and audioresample in front of an audiosink to make sure + * your pipeline works under all circumstances (those conversion elements will + * act in passthrough-mode if no conversion is necessary). + * + * + * Example pipelines + * |[ + * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.1 ! oss4sink + * ]| will output a sine wave (continuous beep sound) to your sound card (with + * a very low volume as precaution). + * |[ + * gst-launch -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! oss4sink + * ]| will play an Ogg/Vorbis audio file and output it using the Open Sound System + * version 4. + * + * + * Since: 0.10.7 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define NO_LEGACY_MIXER +#include "oss4-audio.h" +#include "oss4-sink.h" +#include "oss4-property-probe.h" +#include "oss4-soundcard.h" + +GST_DEBUG_CATEGORY_EXTERN (oss4sink_debug); +#define GST_CAT_DEFAULT oss4sink_debug + +static void gst_oss4_sink_init_interfaces (GType type); +static void gst_oss4_sink_dispose (GObject * object); +static void gst_oss4_sink_finalize (GObject * object); + +static void gst_oss4_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_oss4_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static GstCaps *gst_oss4_sink_getcaps (GstBaseSink * bsink); +static gboolean gst_oss4_sink_open (GstAudioSink * asink, + gboolean silent_errors); +static gboolean gst_oss4_sink_open_func (GstAudioSink * asink); +static gboolean gst_oss4_sink_close (GstAudioSink * asink); +static gboolean gst_oss4_sink_prepare (GstAudioSink * asink, + GstRingBufferSpec * spec); +static gboolean gst_oss4_sink_unprepare (GstAudioSink * asink); +static guint gst_oss4_sink_write (GstAudioSink * asink, gpointer data, + guint length); +static guint gst_oss4_sink_delay (GstAudioSink * asink); +static void gst_oss4_sink_reset (GstAudioSink * asink); + +#define DEFAULT_DEVICE NULL +#define DEFAULT_DEVICE_NAME NULL +#define DEFAULT_MUTE FALSE +#define DEFAULT_VOLUME 1.0 +#define MAX_VOLUME 10.0 + +enum +{ + PROP_0, + PROP_DEVICE, + PROP_DEVICE_NAME, + PROP_VOLUME, + PROP_MUTE, + PROP_LAST +}; + +GST_BOILERPLATE_FULL (GstOss4Sink, gst_oss4_sink, GstAudioSink, + GST_TYPE_AUDIO_SINK, gst_oss4_sink_init_interfaces); + +static void +gst_oss4_sink_dispose (GObject * object) +{ + GstOss4Sink *osssink = GST_OSS4_SINK (object); + + if (osssink->probed_caps) { + gst_caps_unref (osssink->probed_caps); + osssink->probed_caps = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_oss4_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstPadTemplate *templ; + + gst_element_class_set_details_simple (element_class, + "OSS v4 Audio Sink", "Sink/Audio", + "Output to a sound card via OSS version 4", + "Tim-Philipp Müller "); + + templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + gst_oss4_audio_get_template_caps ()); + gst_element_class_add_pad_template (element_class, templ); + gst_object_unref (templ); +} + +static void +gst_oss4_sink_class_init (GstOss4SinkClass * klass) +{ + GstAudioSinkClass *audiosink_class = (GstAudioSinkClass *) klass; + GstBaseSinkClass *basesink_class = (GstBaseSinkClass *) klass; + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->dispose = gst_oss4_sink_dispose; + gobject_class->finalize = gst_oss4_sink_finalize; + gobject_class->get_property = gst_oss4_sink_get_property; + gobject_class->set_property = gst_oss4_sink_set_property; + + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) " + "(NULL = use first available playback device)", + DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_VOLUME, + g_param_spec_double ("volume", "Volume", + "Linear volume of this stream, 1.0=100%", 0.0, MAX_VOLUME, + DEFAULT_VOLUME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_MUTE, + g_param_spec_boolean ("mute", "Mute", + "Mute state of this stream", DEFAULT_MUTE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss4_sink_getcaps); + + audiosink_class->open = GST_DEBUG_FUNCPTR (gst_oss4_sink_open_func); + audiosink_class->close = GST_DEBUG_FUNCPTR (gst_oss4_sink_close); + audiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_oss4_sink_prepare); + audiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss4_sink_unprepare); + audiosink_class->write = GST_DEBUG_FUNCPTR (gst_oss4_sink_write); + audiosink_class->delay = GST_DEBUG_FUNCPTR (gst_oss4_sink_delay); + audiosink_class->reset = GST_DEBUG_FUNCPTR (gst_oss4_sink_reset); +} + +static void +gst_oss4_sink_init (GstOss4Sink * osssink, GstOss4SinkClass * klass) +{ + const gchar *device; + + device = g_getenv ("AUDIODEV"); + if (device == NULL) + device = DEFAULT_DEVICE; + osssink->device = g_strdup (device); + osssink->fd = -1; + osssink->bytes_per_sample = 0; + osssink->probed_caps = NULL; + osssink->device_name = NULL; + osssink->mute_volume = 100 | (100 << 8); +} + +static void +gst_oss4_sink_finalize (GObject * object) +{ + GstOss4Sink *osssink = GST_OSS4_SINK (object); + + g_free (osssink->device); + osssink->device = NULL; + + g_list_free (osssink->property_probe_list); + osssink->property_probe_list = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_oss4_sink_set_volume (GstOss4Sink * oss, gdouble volume) +{ + int ivol; + + volume = volume * 100.0; + ivol = (int) volume | ((int) volume << 8); + GST_OBJECT_LOCK (oss); + if (ioctl (oss->fd, SNDCTL_DSP_SETPLAYVOL, &ivol) < 0) { + GST_LOG_OBJECT (oss, "SETPLAYVOL failed"); + } + GST_OBJECT_UNLOCK (oss); +} + +static gdouble +gst_oss4_sink_get_volume (GstOss4Sink * oss) +{ + int ivol, lvol, rvol; + gdouble dvol = DEFAULT_VOLUME; + + GST_OBJECT_LOCK (oss); + if (ioctl (oss->fd, SNDCTL_DSP_GETPLAYVOL, &ivol) < 0) { + GST_LOG_OBJECT (oss, "GETPLAYVOL failed"); + } else { + /* Return the higher of the two volume channels, if different */ + lvol = ivol & 0xff; + rvol = (ivol >> 8) & 0xff; + dvol = MAX (lvol, rvol) / 100.0; + } + GST_OBJECT_UNLOCK (oss); + + return dvol; +} + +static void +gst_oss4_sink_set_mute (GstOss4Sink * oss, gboolean mute) +{ + int ivol; + + if (mute) { + /* + * OSSv4 does not have a per-channel mute, so simulate by setting + * the value to 0. Save the volume before doing a mute so we can + * reset the value when the user un-mutes. + */ + ivol = 0; + + GST_OBJECT_LOCK (oss); + if (ioctl (oss->fd, SNDCTL_DSP_GETPLAYVOL, &oss->mute_volume) < 0) { + GST_LOG_OBJECT (oss, "GETPLAYVOL failed"); + } + if (ioctl (oss->fd, SNDCTL_DSP_SETPLAYVOL, &ivol) < 0) { + GST_LOG_OBJECT (oss, "SETPLAYVOL failed"); + } + GST_OBJECT_UNLOCK (oss); + } else { + /* + * If the saved volume is 0, then reset it to 100. Otherwise the mute + * can get stuck. This can happen, for example, due to rounding + * errors in converting from the float to an integer. + */ + if (oss->mute_volume == 0) { + oss->mute_volume = 100 | (100 << 8); + } + GST_OBJECT_LOCK (oss); + if (ioctl (oss->fd, SNDCTL_DSP_SETPLAYVOL, &oss->mute_volume) < 0) { + GST_LOG_OBJECT (oss, "SETPLAYVOL failed"); + } + GST_OBJECT_UNLOCK (oss); + } +} + +static gboolean +gst_oss4_sink_get_mute (GstOss4Sink * oss) +{ + int ivol, lvol, rvol; + + GST_OBJECT_LOCK (oss); + if (ioctl (oss->fd, SNDCTL_DSP_GETPLAYVOL, &ivol) < 0) { + GST_LOG_OBJECT (oss, "GETPLAYVOL failed"); + lvol = rvol = 100; + } else { + lvol = ivol & 0xff; + rvol = (ivol >> 8) & 0xff; + } + GST_OBJECT_UNLOCK (oss); + + return (lvol == 0 && rvol == 0); +} + +static void +gst_oss4_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOss4Sink *oss = GST_OSS4_SINK (object); + + switch (prop_id) { + case PROP_DEVICE: + GST_OBJECT_LOCK (oss); + if (oss->fd == -1) { + g_free (oss->device); + oss->device = g_value_dup_string (value); + if (oss->probed_caps) { + gst_caps_unref (oss->probed_caps); + oss->probed_caps = NULL; + } + g_free (oss->device_name); + oss->device_name = NULL; + } else { + g_warning ("%s: can't change \"device\" property while audio sink " + "is open", GST_OBJECT_NAME (oss)); + } + GST_OBJECT_UNLOCK (oss); + break; + case PROP_VOLUME: + gst_oss4_sink_set_volume (oss, g_value_get_double (value)); + break; + case PROP_MUTE: + gst_oss4_sink_set_mute (oss, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_oss4_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOss4Sink *oss = GST_OSS4_SINK (object); + + switch (prop_id) { + case PROP_DEVICE: + GST_OBJECT_LOCK (oss); + g_value_set_string (value, oss->device); + GST_OBJECT_UNLOCK (oss); + break; + case PROP_DEVICE_NAME: + GST_OBJECT_LOCK (oss); + if (oss->fd == -1 && oss->device != NULL) { + /* If device is set, try to retrieve the name even if we're not open */ + if (gst_oss4_sink_open (GST_AUDIO_SINK (oss), TRUE)) { + g_value_set_string (value, oss->device_name); + gst_oss4_sink_close (GST_AUDIO_SINK (oss)); + } else { + gchar *name = NULL; + + gst_oss4_property_probe_find_device_name_nofd (GST_OBJECT (oss), + oss->device, &name); + g_value_set_string (value, name); + g_free (name); + } + } else { + g_value_set_string (value, oss->device_name); + } + GST_OBJECT_UNLOCK (oss); + break; + case PROP_VOLUME: + g_value_set_double (value, gst_oss4_sink_get_volume (oss)); + break; + case PROP_MUTE: + g_value_set_boolean (value, gst_oss4_sink_get_mute (oss)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_oss4_sink_getcaps (GstBaseSink * bsink) +{ + GstOss4Sink *oss; + GstCaps *caps; + + oss = GST_OSS4_SINK (bsink); + + if (oss->fd == -1) { + caps = gst_oss4_audio_get_template_caps (); + } else if (oss->probed_caps) { + caps = gst_caps_copy (oss->probed_caps); + } else { + caps = gst_oss4_audio_probe_caps (GST_OBJECT (oss), oss->fd); + if (caps != NULL && !gst_caps_is_empty (caps)) { + oss->probed_caps = gst_caps_copy (caps); + } + } + + return caps; +} + +/* note: we must not take the object lock here unless we fix up get_property */ +static gboolean +gst_oss4_sink_open (GstAudioSink * asink, gboolean silent_errors) +{ + GstOss4Sink *oss; + gchar *device; + int mode; + + oss = GST_OSS4_SINK (asink); + + if (oss->device) + device = g_strdup (oss->device); + else + device = gst_oss4_audio_find_device (GST_OBJECT_CAST (oss)); + + /* desperate times, desperate measures */ + if (device == NULL) + device = g_strdup ("/dev/dsp0"); + + GST_INFO_OBJECT (oss, "Trying to open OSS4 device '%s'", device); + + /* we open in non-blocking mode even if we don't really want to do writes + * non-blocking because we can't be sure that this is really a genuine + * OSS4 device with well-behaved drivers etc. We really don't want to + * hang forever under any circumstances. */ + oss->fd = open (device, O_WRONLY | O_NONBLOCK, 0); + if (oss->fd == -1) { + switch (errno) { + case EBUSY: + goto busy; + case EACCES: + goto no_permission; + default: + goto open_failed; + } + } + + GST_INFO_OBJECT (oss, "Opened device '%s'", device); + + /* Make sure it's OSS4. If it's old OSS, let osssink handle it */ + if (!gst_oss4_audio_check_version (GST_OBJECT_CAST (oss), oss->fd)) + goto legacy_oss; + + /* now remove the non-blocking flag. */ + mode = fcntl (oss->fd, F_GETFL); + mode &= ~O_NONBLOCK; + if (fcntl (oss->fd, F_SETFL, mode) < 0) { + /* some drivers do no support unsetting the non-blocking flag, try to + * close/open the device then. This is racy but we error out properly. */ + GST_WARNING_OBJECT (oss, "failed to unset O_NONBLOCK (buggy driver?), " + "will try to re-open device now"); + gst_oss4_sink_close (asink); + if ((oss->fd = open (device, O_WRONLY, 0)) == -1) + goto non_block; + } + + oss->open_device = device; + + /* not using ENGINEINFO here because it sometimes returns a different and + * less useful name than AUDIOINFO for the same device */ + if (!gst_oss4_property_probe_find_device_name (GST_OBJECT (oss), oss->fd, + oss->open_device, &oss->device_name)) { + oss->device_name = NULL; + } + + /* list output routings, for informational purposes only so far */ + { + oss_mixer_enuminfo routings = { 0, }; + guint i; + + if (ioctl (oss->fd, SNDCTL_DSP_GET_PLAYTGT_NAMES, &routings) != -1) { + GST_LOG_OBJECT (oss, "%u output routings (static list: %d)", + routings.nvalues, !!(routings.version == 0)); + for (i = 0; i < routings.nvalues; ++i) { + GST_LOG_OBJECT (oss, " output routing %d: %s", i, + &routings.strings[routings.strindex[i]]); + } + } + } + + return TRUE; + + /* ERRORS */ +busy: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, BUSY, + (_("Could not open audio device for playback. " + "Device is being used by another application.")), (NULL)); + } + g_free (device); + return FALSE; + } +no_permission: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, + (_("Could not open audio device for playback. " + "You don't have permission to open the device.")), + GST_ERROR_SYSTEM); + } + g_free (device); + return FALSE; + } +open_failed: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, + (_("Could not open audio device for playback.")), GST_ERROR_SYSTEM); + } + g_free (device); + return FALSE; + } +legacy_oss: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, + (_("Could not open audio device for playback. " + "This version of the Open Sound System is not supported by this " + "element.")), ("Try the 'osssink' element instead")); + } + gst_oss4_sink_close (asink); + g_free (device); + return FALSE; + } +non_block: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), + ("Unable to set device %s into non-blocking mode: %s", + oss->device, g_strerror (errno))); + } + g_free (device); + return FALSE; + } +} + +static gboolean +gst_oss4_sink_open_func (GstAudioSink * asink) +{ + return gst_oss4_sink_open (asink, FALSE); +} + +static gboolean +gst_oss4_sink_close (GstAudioSink * asink) +{ + GstOss4Sink *oss = GST_OSS4_SINK (asink); + + if (oss->fd != -1) { + GST_DEBUG_OBJECT (oss, "closing device"); + close (oss->fd); + oss->fd = -1; + } + + oss->bytes_per_sample = 0; + /* we keep the probed caps cached, at least until the device changes */ + + g_free (oss->open_device); + oss->open_device = NULL; + + g_free (oss->device_name); + oss->device_name = NULL; + + if (oss->probed_caps) { + gst_caps_unref (oss->probed_caps); + oss->probed_caps = NULL; + } + + return TRUE; +} + +static gboolean +gst_oss4_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) +{ + GstOss4Sink *oss; + + oss = GST_OSS4_SINK (asink); + + if (!gst_oss4_audio_set_format (GST_OBJECT_CAST (oss), oss->fd, spec)) { + GST_WARNING_OBJECT (oss, "Couldn't set requested format %" GST_PTR_FORMAT, + spec->caps); + return FALSE; + } + + oss->bytes_per_sample = spec->bytes_per_sample; + return TRUE; +} + +static gboolean +gst_oss4_sink_unprepare (GstAudioSink * asink) +{ + /* could do a SNDCTL_DSP_HALT, but the OSS manual recommends a close/open, + * since HALT won't properly reset some devices, apparently */ + + if (!gst_oss4_sink_close (asink)) + goto couldnt_close; + + if (!gst_oss4_sink_open_func (asink)) + goto couldnt_reopen; + + return TRUE; + + /* ERRORS */ +couldnt_close: + { + GST_DEBUG_OBJECT (asink, "Couldn't close the audio device"); + return FALSE; + } +couldnt_reopen: + { + GST_DEBUG_OBJECT (asink, "Couldn't reopen the audio device"); + return FALSE; + } +} + +static guint +gst_oss4_sink_write (GstAudioSink * asink, gpointer data, guint length) +{ + GstOss4Sink *oss; + int n; + + oss = GST_OSS4_SINK_CAST (asink); + + n = write (oss->fd, data, length); + GST_LOG_OBJECT (asink, "wrote %d/%d samples, %d bytes", + n / oss->bytes_per_sample, length / oss->bytes_per_sample, n); + + if (G_UNLIKELY (n < 0)) { + switch (errno) { + case ENOTSUP: + case EACCES:{ + /* This is the most likely cause, I think */ + GST_ELEMENT_ERROR (asink, RESOURCE, WRITE, + (_("Playback is not supported by this audio device.")), + ("write: %s (device: %s) (maybe this is an input-only device?)", + g_strerror (errno), oss->open_device)); + break; + } + default:{ + GST_ELEMENT_ERROR (asink, RESOURCE, WRITE, + (_("Audio playback error.")), + ("write: %s (device: %s)", g_strerror (errno), oss->open_device)); + break; + } + } + } + + return n; +} + +static guint +gst_oss4_sink_delay (GstAudioSink * asink) +{ + GstOss4Sink *oss; + gint delay = -1; + + oss = GST_OSS4_SINK_CAST (asink); + + GST_OBJECT_LOCK (oss); + if (ioctl (oss->fd, SNDCTL_DSP_GETODELAY, &delay) < 0 || delay < 0) { + GST_LOG_OBJECT (oss, "GETODELAY failed"); + } + GST_OBJECT_UNLOCK (oss); + + if (G_UNLIKELY (delay < 0)) /* error case */ + return 0; + + return delay / oss->bytes_per_sample; +} + +static void +gst_oss4_sink_reset (GstAudioSink * asink) +{ + /* There's nothing we can do here really: OSS can't handle access to the + * same device/fd from multiple threads and might deadlock or blow up in + * other ways if we try an ioctl SNDCTL_DSP_HALT or similar */ +} + +static void +gst_oss4_sink_init_interfaces (GType type) +{ + static const GInterfaceInfo svol_iface_info = { + NULL, NULL, NULL + }; + + g_type_add_interface_static (type, GST_TYPE_STREAM_VOLUME, &svol_iface_info); + + gst_oss4_add_property_probe_interface (type); +} diff --git a/sys/oss4/oss4-sink.h b/sys/oss4/oss4-sink.h new file mode 100644 index 0000000..b1489a7 --- /dev/null +++ b/sys/oss4/oss4-sink.h @@ -0,0 +1,64 @@ +/* GStreamer OSS4 audio sink + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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_OSS4_SINK_H +#define GST_OSS4_SINK_H + + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_OSS4_SINK (gst_oss4_sink_get_type()) +#define GST_OSS4_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_SINK,GstOss4Sink)) +#define GST_OSS4_SINK_CAST(obj) ((GstOss4Sink *)(obj)) +#define GST_OSS4_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_SINK,GstOss4SinkClass)) +#define GST_IS_OSS4_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_SINK)) +#define GST_IS_OSS4_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_SINK)) + +typedef struct _GstOss4Sink GstOss4Sink; +typedef struct _GstOss4SinkClass GstOss4SinkClass; + +struct _GstOss4Sink { + GstAudioSink audio_sink; + + gchar * device; /* NULL if none was set */ + gchar * open_device; /* the device we opened */ + gchar * device_name; /* set if the device is open */ + gint fd; /* -1 if not open */ + gint bytes_per_sample; + gint mute_volume; + + GstCaps * probed_caps; + + GList * property_probe_list; +}; + +struct _GstOss4SinkClass { + GstAudioSinkClass audio_sink_class; +}; + +GType gst_oss4_sink_get_type (void); + +G_END_DECLS + +#endif /* GST_OSS4_SINK_H */ + + diff --git a/sys/oss4/oss4-soundcard.h b/sys/oss4/oss4-soundcard.h new file mode 100644 index 0000000..8b12489 --- /dev/null +++ b/sys/oss4/oss4-soundcard.h @@ -0,0 +1,2067 @@ +/* + * Purpose: The C/C++ header file that defines the OSS API. + * Description: + * This header file contains all the declarations required to compile OSS + * programs. The latest version is always installed together with OSS + * use of the latest version is strongly recommended. + * + * {!notice This header file contains many obsolete definitions + * (for compatibility with older applications that still ned them). + * Do not use this file as a reference manual of OSS. + * Please check the OSS Programmer's guide for descriptions + * of the supported API details (http://manuals.opensound.com/developer).} + */ + +#ifndef SOUNDCARD_H +#define SOUNDCARD_H + +#define COPYING40 Copyright (C) 4Front Technologies 2000-2006. Released under the BSD license. + +#if defined(__cplusplus) +#define EXTERNC extern "C" +#else +#define EXTERNC extern +#endif /* EXTERN_C_WRAPPERS */ + +#define OSS_VERSION 0x040090 // Pre 4.1 + +#define SOUND_VERSION OSS_VERSION +#define OPEN_SOUND_SYSTEM + +#if defined(__hpux) && !defined(_HPUX_SOURCE) +# error "-D_HPUX_SOURCE must be used when compiling OSS applications" +#endif + +#ifdef __hpux +#include +#endif + +#ifdef linux +/* In Linux we need to be prepared for cross compiling */ +#include +#else +# ifdef __FreeBSD__ +# include +# else +# include +# endif +#endif + +#ifndef __SIOWR +#if defined(__hpux) || (defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__INCioctlh) && !defined(__Lynx__)))) + +/* + * Make sure the ioctl macros are compatible with the ones already used + * by this operating system. + */ +#define SIOCPARM_MASK IOCPARM_MASK +#define SIOC_VOID IOC_VOID +#define SIOC_OUT IOC_OUT +#define SIOC_IN IOC_IN +#define SIOC_INOUT IOC_INOUT +#define __SIOC_SIZE _IOC_SIZE +#define __SIOC_DIR _IOC_DIR +#define __SIOC_NONE _IOC_NONE +#define __SIOC_READ _IOC_READ +#define __SIOC_WRITE _IOC_WRITE +#define __SIO _IO +#define __SIOR _IOR +#define __SIOW _IOW +#define __SIOWR _IOWR +#else + +/* #define SIOCTYPE (0xff<<8) */ +#define SIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */ +#define SIOC_VOID 0x00000000 /* no parameters */ +#define SIOC_OUT 0x20000000 /* copy out parameters */ +#define SIOC_IN 0x40000000 /* copy in parameters */ +#define SIOC_INOUT (SIOC_IN|SIOC_OUT) + +#define __SIO(x,y) ((int)(SIOC_VOID|(x<<8)|y)) +#define __SIOR(x,y,t) ((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) +#define __SIOW(x,y,t) ((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) +#define __SIOWR(x,y,t) ((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) +#define __SIOC_SIZE(x) ((x>>16)&SIOCPARM_MASK) +#define __SIOC_DIR(x) (x & 0xf0000000) +#define __SIOC_NONE SIOC_VOID +#define __SIOC_READ SIOC_OUT +#define __SIOC_WRITE SIOC_IN +# endif /* _IOWR */ +#endif /* !__SIOWR */ + +#define OSS_LONGNAME_SIZE 64 +#define OSS_LABEL_SIZE 16 +#define OSS_DEVNODE_SIZE 32 +typedef char oss_longname_t[OSS_LONGNAME_SIZE]; +typedef char oss_label_t[OSS_LABEL_SIZE]; +typedef char oss_devnode_t[OSS_DEVNODE_SIZE]; + +#ifndef DISABLE_SEQUENCER +/* + **************************************************************************** + * IOCTL Commands for /dev/sequencer and /dev/music (AKA /dev/sequencer2) + * + * Note that this interface is obsolete and no longer developed. New + * applications should use /dev/midi instead. + ****************************************************************************/ +#define SNDCTL_SEQ_RESET __SIO ('Q', 0) +#define SNDCTL_SEQ_SYNC __SIO ('Q', 1) +#define SNDCTL_SYNTH_INFO __SIOWR('Q', 2, struct synth_info) +#define SNDCTL_SEQ_CTRLRATE __SIOWR('Q', 3, int) /* Set/get timer resolution (HZ) */ +#define SNDCTL_SEQ_GETOUTCOUNT __SIOR ('Q', 4, int) +#define SNDCTL_SEQ_GETINCOUNT __SIOR ('Q', 5, int) +#define SNDCTL_SEQ_PERCMODE __SIOW ('Q', 6, int) +#define SNDCTL_FM_LOAD_INSTR __SIOW ('Q', 7, struct sbi_instrument) /* Obsolete. Don't use!!!!!! */ +#define SNDCTL_SEQ_TESTMIDI __SIOW ('Q', 8, int) +#define SNDCTL_SEQ_RESETSAMPLES __SIOW ('Q', 9, int) +#define SNDCTL_SEQ_NRSYNTHS __SIOR ('Q',10, int) +#define SNDCTL_SEQ_NRMIDIS __SIOR ('Q',11, int) +#define SNDCTL_MIDI_INFO __SIOWR('Q',12, struct midi_info) /* OBSOLETE - use SNDCTL_MIDIINFO instead */ +#define SNDCTL_SEQ_THRESHOLD __SIOW ('Q',13, int) +#define SNDCTL_SYNTH_MEMAVL __SIOWR('Q',14, int) /* in=dev#, out=memsize */ +#define SNDCTL_FM_4OP_ENABLE __SIOW ('Q',15, int) /* in=dev# */ +#define SNDCTL_SEQ_PANIC __SIO ('Q',17) +#define SNDCTL_SEQ_OUTOFBAND __SIOW ('Q',18, struct seq_event_rec) +#define SNDCTL_SEQ_GETTIME __SIOR ('Q',19, int) +#define SNDCTL_SYNTH_ID __SIOWR('Q',20, struct synth_info) +#define SNDCTL_SYNTH_CONTROL __SIOWR('Q',21, struct synth_control) +#define SNDCTL_SYNTH_REMOVESAMPLE __SIOWR('Q',22, struct remove_sample) /* Reserved for future use */ +#define SNDCTL_SEQ_TIMING_ENABLE __SIO ('Q', 23) /* Enable incoming MIDI timing messages */ +#define SNDCTL_SEQ_ACTSENSE_ENABLE __SIO ('Q', 24) /* Enable incoming active sensing messages */ +#define SNDCTL_SEQ_RT_ENABLE __SIO ('Q', 25) /* Enable other incoming realtime messages */ + +typedef struct synth_control +{ + int devno; /* Synthesizer # */ + char data[4000]; /* Device spesific command/data record */ +} synth_control; + +typedef struct remove_sample +{ + int devno; /* Synthesizer # */ + int bankno; /* MIDI bank # (0=General MIDI) */ + int instrno; /* MIDI instrument number */ +} remove_sample; + +typedef struct seq_event_rec +{ + unsigned char arr[8]; +} seq_event_rec; + +#define SNDCTL_TMR_TIMEBASE __SIOWR('T', 1, int) +#define SNDCTL_TMR_START __SIO ('T', 2) +#define SNDCTL_TMR_STOP __SIO ('T', 3) +#define SNDCTL_TMR_CONTINUE __SIO ('T', 4) +#define SNDCTL_TMR_TEMPO __SIOWR('T', 5, int) +#define SNDCTL_TMR_SOURCE __SIOWR('T', 6, int) +# define TMR_INTERNAL 0x00000001 +# define TMR_EXTERNAL 0x00000002 +# define TMR_MODE_MIDI 0x00000010 +# define TMR_MODE_FSK 0x00000020 +# define TMR_MODE_CLS 0x00000040 +# define TMR_MODE_SMPTE 0x00000080 +#define SNDCTL_TMR_METRONOME __SIOW ('T', 7, int) +#define SNDCTL_TMR_SELECT __SIOW ('T', 8, int) + +/* + * Sample loading mechanism for internal synthesizers (/dev/sequencer) + * (for the .PAT format). + */ + +struct patch_info +{ + unsigned short key; /* Use WAVE_PATCH here */ +#define WAVE_PATCH _PATCHKEY(0x04) +#define GUS_PATCH WAVE_PATCH +#define WAVEFRONT_PATCH _PATCHKEY(0x06) + + short device_no; /* Synthesizer number */ + short instr_no; /* Midi pgm# */ + + unsigned int mode; +/* + * The least significant byte has the same format than the GUS .PAT + * files + */ +#define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */ +#define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */ +#define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */ +#define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */ +#define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */ +#define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3) */ +#define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */ +#define WAVE_FAST_RELEASE 0x80 /* bit 7 = Shut off immediately after note off */ + /* (use the env_rate/env_offs fields). */ +/* Linux specific bits */ +#define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */ +#define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */ +#define WAVE_SCALE 0x00040000 /* The scaling info is valid */ +#define WAVE_FRACTIONS 0x00080000 /* Fraction information is valid */ +/* Reserved bits */ +#define WAVE_ROM 0x40000000 /* For future use */ +#define WAVE_MULAW 0x20000000 /* For future use */ +/* Other bits must be zeroed */ + + int len; /* Size of the wave data in bytes */ + int loop_start, loop_end; /* Byte offsets from the beginning */ + +/* + * The base_freq and base_note fields are used when computing the + * playback speed for a note. The base_note defines the tone frequency + * which is heard if the sample is played using the base_freq as the + * playback speed. + * + * The low_note and high_note fields define the minimum and maximum note + * frequencies for which this sample is valid. It is possible to define + * more than one samples for an instrument number at the same time. The + * low_note and high_note fields are used to select the most suitable one. + * + * The fields base_note, high_note and low_note should contain + * the note frequency multiplied by 1000. For example value for the + * middle A is 440*1000. + */ + + unsigned int base_freq; + unsigned int base_note; + unsigned int high_note; + unsigned int low_note; + int panning; /* -128=left, 127=right */ + int detuning; + + /* Envelope. Enabled by mode bit WAVE_ENVELOPES */ + unsigned char env_rate[6]; /* GUS HW ramping rate */ + unsigned char env_offset[6]; /* 255 == 100% */ + + /* + * The tremolo, vibrato and scale info are not supported yet. + * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or + * WAVE_SCALE + */ + + unsigned char tremolo_sweep; + unsigned char tremolo_rate; + unsigned char tremolo_depth; + + unsigned char vibrato_sweep; + unsigned char vibrato_rate; + unsigned char vibrato_depth; + + int scale_frequency; + unsigned int scale_factor; /* from 0 to 2048 or 0 to 2 */ + + int volume; + int fractions; + int reserved1; + int spare[2]; + char data[1]; /* The waveform data starts here */ +}; + +struct sysex_info +{ + short key; /* Use SYSEX_PATCH or MAUI_PATCH here */ +#define SYSEX_PATCH _PATCHKEY(0x05) +#define MAUI_PATCH _PATCHKEY(0x06) + short device_no; /* Synthesizer number */ + int len; /* Size of the sysex data in bytes */ + unsigned char data[1]; /* Sysex data starts here */ +}; + +/* + * /dev/sequencer input events. + * + * The data written to the /dev/sequencer is a stream of events. Events + * are records of 4 or 8 bytes. The first byte defines the size. + * Any number of events can be written with a write call. There + * is a set of macros for sending these events. Use these macros if you + * want to maximize portability of your program. + * + * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events. + * (All input events are currently 4 bytes long. Be prepared to support + * 8 byte events also. If you receive any event having first byte >= 128, + * it's a 8 byte event. + * + * The events are documented at the end of this file. + * + * Normal events (4 bytes) + * There is also a 8 byte version of most of the 4 byte events. The + * 8 byte one is recommended. + * + * NOTE! All 4 byte events are now obsolete. Applications should not write + * them. However 4 byte events are still used as inputs from + * /dev/sequencer (/dev/music uses only 8 byte ones). + */ +#define SEQ_NOTEOFF 0 +#define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */ +#define SEQ_NOTEON 1 +#define SEQ_FMNOTEON SEQ_NOTEON +#define SEQ_WAIT TMR_WAIT_ABS +#define SEQ_PGMCHANGE 3 +#define SEQ_FMPGMCHANGE SEQ_PGMCHANGE +#define SEQ_SYNCTIMER TMR_START +#define SEQ_MIDIPUTC 5 +#define SEQ_DRUMON 6 /*** OBSOLETE ***/ +#define SEQ_DRUMOFF 7 /*** OBSOLETE ***/ +#define SEQ_ECHO TMR_ECHO /* For synching programs with output */ +#define SEQ_AFTERTOUCH 9 +#define SEQ_CONTROLLER 10 +#define SEQ_BALANCE 11 +#define SEQ_VOLMODE 12 + +/************************************ + * Midi controller numbers * + ************************************/ +/* + * Controllers 0 to 31 (0x00 to 0x1f) and + * 32 to 63 (0x20 to 0x3f) are continuous + * controllers. + * In the MIDI 1.0 these controllers are sent using + * two messages. Controller numbers 0 to 31 are used + * to send the MSB and the controller numbers 32 to 63 + * are for the LSB. Note that just 7 bits are used in MIDI bytes. + */ + +#define CTL_BANK_SELECT 0x00 +#define CTL_MODWHEEL 0x01 +#define CTL_BREATH 0x02 +/* undefined 0x03 */ +#define CTL_FOOT 0x04 +#define CTL_PORTAMENTO_TIME 0x05 +#define CTL_DATA_ENTRY 0x06 +#define CTL_MAIN_VOLUME 0x07 +#define CTL_BALANCE 0x08 +/* undefined 0x09 */ +#define CTL_PAN 0x0a +#define CTL_EXPRESSION 0x0b +/* undefined 0x0c */ +/* undefined 0x0d */ +/* undefined 0x0e */ +/* undefined 0x0f */ +#define CTL_GENERAL_PURPOSE1 0x10 +#define CTL_GENERAL_PURPOSE2 0x11 +#define CTL_GENERAL_PURPOSE3 0x12 +#define CTL_GENERAL_PURPOSE4 0x13 +/* undefined 0x14 - 0x1f */ + +/* undefined 0x20 */ +/* The controller numbers 0x21 to 0x3f are reserved for the */ +/* least significant bytes of the controllers 0x00 to 0x1f. */ +/* These controllers are not recognised by the driver. */ + +/* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */ +/* 0=OFF and 127=ON (intermediate values are possible) */ +#define CTL_DAMPER_PEDAL 0x40 +#define CTL_SUSTAIN 0x40 /* Alias */ +#define CTL_HOLD 0x40 /* Alias */ +#define CTL_PORTAMENTO 0x41 +#define CTL_SOSTENUTO 0x42 +#define CTL_SOFT_PEDAL 0x43 +/* undefined 0x44 */ +#define CTL_HOLD2 0x45 +/* undefined 0x46 - 0x4f */ + +#define CTL_GENERAL_PURPOSE5 0x50 +#define CTL_GENERAL_PURPOSE6 0x51 +#define CTL_GENERAL_PURPOSE7 0x52 +#define CTL_GENERAL_PURPOSE8 0x53 +/* undefined 0x54 - 0x5a */ +#define CTL_EXT_EFF_DEPTH 0x5b +#define CTL_TREMOLO_DEPTH 0x5c +#define CTL_CHORUS_DEPTH 0x5d +#define CTL_DETUNE_DEPTH 0x5e +#define CTL_CELESTE_DEPTH 0x5e /* Alias for the above one */ +#define CTL_PHASER_DEPTH 0x5f +#define CTL_DATA_INCREMENT 0x60 +#define CTL_DATA_DECREMENT 0x61 +#define CTL_NONREG_PARM_NUM_LSB 0x62 +#define CTL_NONREG_PARM_NUM_MSB 0x63 +#define CTL_REGIST_PARM_NUM_LSB 0x64 +#define CTL_REGIST_PARM_NUM_MSB 0x65 +/* undefined 0x66 - 0x78 */ +/* reserved 0x79 - 0x7f */ + +/* Pseudo controllers (not midi compatible) */ +#define CTRL_PITCH_BENDER 255 +#define CTRL_PITCH_BENDER_RANGE 254 +#define CTRL_EXPRESSION 253 /* Obsolete */ +#define CTRL_MAIN_VOLUME 252 /* Obsolete */ + +/* + * Volume mode defines how volumes are used + */ + +#define VOL_METHOD_ADAGIO 1 +#define VOL_METHOD_LINEAR 2 + +/* + * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as + * input events. + */ + +/* + * Event codes 0xf0 to 0xfc are reserved for future extensions. + */ + +#define SEQ_FULLSIZE 0xfd /* Long events */ +/* + * SEQ_FULLSIZE events are used for loading patches/samples to the + * synthesizer devices. These events are passed directly to the driver + * of the associated synthesizer device. There is no limit to the size + * of the extended events. These events are not queued but executed + * immediately when the write() is called (execution can take several + * seconds of time). + * + * When a SEQ_FULLSIZE message is written to the device, it must + * be written using exactly one write() call. Other events cannot + * be mixed to the same write. + * + * For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the + * /dev/sequencer. Don't write other data together with the instrument structure + * Set the key field of the structure to FM_PATCH. The device field is used to + * route the patch to the corresponding device. + * + * For wave table use struct patch_info. Initialize the key field + * to WAVE_PATCH. + */ +#define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */ +#define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */ + +/* + * Record for FM patches + */ + +typedef unsigned char sbi_instr_data[32]; + +struct sbi_instrument +{ + unsigned short key; /* FM_PATCH or OPL3_PATCH */ +#define FM_PATCH _PATCHKEY(0x01) +#define OPL3_PATCH _PATCHKEY(0x03) + short device; /* Synth# (0-4) */ + int channel; /* Program# to be initialized */ + sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */ +}; + +struct synth_info +{ /* Read only */ + char name[30]; + int device; /* 0-N. INITIALIZE BEFORE CALLING */ + int synth_type; +#define SYNTH_TYPE_FM 0 +#define SYNTH_TYPE_SAMPLE 1 +#define SYNTH_TYPE_MIDI 2 /* Midi interface */ + + int synth_subtype; +#define FM_TYPE_ADLIB 0x00 +#define FM_TYPE_OPL3 0x01 +#define MIDI_TYPE_MPU401 0x401 + +#define SAMPLE_TYPE_BASIC 0x10 +#define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC +#define SAMPLE_TYPE_WAVEFRONT 0x11 + + int perc_mode; /* No longer supported */ + int nr_voices; + int nr_drums; /* Obsolete field */ + int instr_bank_size; + unsigned int capabilities; +#define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */ +#define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ +#define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */ + int dummies[19]; /* Reserve space */ +}; + +struct sound_timer_info +{ + char name[32]; + int caps; +}; + +struct midi_info /* OBSOLETE */ +{ + char name[30]; + int device; /* 0-N. INITIALIZE BEFORE CALLING */ + unsigned int capabilities; /* To be defined later */ + int dev_type; + int dummies[18]; /* Reserve space */ +}; + +/* + * Level 2 event types for /dev/sequencer + */ + +/* + * The 4 most significant bits of byte 0 specify the class of + * the event: + * + * 0x8X = system level events, + * 0x9X = device/port specific events, event[1] = device/port, + * The last 4 bits give the subtype: + * 0x02 = Channel event (event[3] = chn). + * 0x01 = note event (event[4] = note). + * (0x01 is not used alone but always with bit 0x02). + * event[2] = MIDI message code (0x80=note off etc.) + * + */ + +#define EV_SEQ_LOCAL 0x80 +#define EV_TIMING 0x81 +#define EV_CHN_COMMON 0x92 +#define EV_CHN_VOICE 0x93 +#define EV_SYSEX 0x94 +#define EV_SYSTEM 0x95 /* MIDI system and real time messages (input only) */ +/* + * Event types 200 to 220 are reserved for application use. + * These numbers will not be used by the driver. + */ + +/* + * Events for event type EV_CHN_VOICE + */ + +#define MIDI_NOTEOFF 0x80 +#define MIDI_NOTEON 0x90 +#define MIDI_KEY_PRESSURE 0xA0 + +/* + * Events for event type EV_CHN_COMMON + */ + +#define MIDI_CTL_CHANGE 0xB0 +#define MIDI_PGM_CHANGE 0xC0 +#define MIDI_CHN_PRESSURE 0xD0 +#define MIDI_PITCH_BEND 0xE0 + +#define MIDI_SYSTEM_PREFIX 0xF0 + +/* + * Timer event types + */ +#define TMR_WAIT_REL 1 /* Time relative to the prev time */ +#define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */ +#define TMR_STOP 3 +#define TMR_START 4 +#define TMR_CONTINUE 5 +#define TMR_TEMPO 6 +#define TMR_ECHO 8 +#define TMR_CLOCK 9 /* MIDI clock */ +#define TMR_SPP 10 /* Song position pointer */ +#define TMR_TIMESIG 11 /* Time signature */ + +/* + * Local event types + */ +#define LOCL_STARTAUDIO 1 +#define LOCL_STARTAUDIO2 2 +#define LOCL_STARTAUDIO3 3 +#define LOCL_STARTAUDIO4 4 + +#if (!defined(__KERNEL__) && !defined(KERNEL) && !defined(INKERNEL) && !defined(_KERNEL)) || defined(USE_SEQ_MACROS) +/* + * Some convenience macros to simplify programming of the + * /dev/sequencer interface + * + * These macros define the API which should be used when possible. + */ +#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF() + +void seqbuf_dump (void); /* This function must be provided by programs */ + +EXTERNC int OSS_init (int seqfd, int buflen); +EXTERNC void OSS_seqbuf_dump (int fd, unsigned char *buf, int buflen); +EXTERNC void OSS_seq_advbuf (int len, int fd, unsigned char *buf, int buflen); +EXTERNC void OSS_seq_needbuf (int len, int fd, unsigned char *buf, + int buflen); +EXTERNC void OSS_patch_caching (int dev, int chn, int patch, int fd, + unsigned char *buf, int buflen); +EXTERNC void OSS_drum_caching (int dev, int chn, int patch, int fd, + unsigned char *buf, int buflen); +EXTERNC void OSS_write_patch (int fd, unsigned char *buf, int len); +EXTERNC int OSS_write_patch2 (int fd, unsigned char *buf, int len); + +#define SEQ_PM_DEFINES int __foo_bar___ +#ifdef OSSLIB +# define SEQ_USE_EXTBUF() \ + EXTERNC unsigned char *_seqbuf; \ + EXTERNC int _seqbuflen;EXTERNC int _seqbufptr +# define SEQ_DEFINEBUF(len) SEQ_USE_EXTBUF();static int _requested_seqbuflen=len +# define _SEQ_ADVBUF(len) OSS_seq_advbuf(len, seqfd, _seqbuf, _seqbuflen) +# define _SEQ_NEEDBUF(len) OSS_seq_needbuf(len, seqfd, _seqbuf, _seqbuflen) +# define SEQ_DUMPBUF() OSS_seqbuf_dump(seqfd, _seqbuf, _seqbuflen) + +# define SEQ_LOAD_GMINSTR(dev, instr) \ + OSS_patch_caching(dev, -1, instr, seqfd, _seqbuf, _seqbuflen) +# define SEQ_LOAD_GMDRUM(dev, drum) \ + OSS_drum_caching(dev, -1, drum, seqfd, _seqbuf, _seqbuflen) +#else /* !OSSLIB */ + +# define SEQ_LOAD_GMINSTR(dev, instr) +# define SEQ_LOAD_GMDRUM(dev, drum) + +# define SEQ_USE_EXTBUF() \ + EXTERNC unsigned char _seqbuf[]; \ + EXTERNC int _seqbuflen;EXTERNC int _seqbufptr + +#ifndef USE_SIMPLE_MACROS +/* Sample seqbuf_dump() implementation: + * + * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes + * + * int seqfd; -- The file descriptor for /dev/sequencer. + * + * void + * seqbuf_dump () + * { + * if (_seqbufptr) + * if (write (seqfd, _seqbuf, _seqbufptr) == -1) + * { + * perror ("write /dev/sequencer"); + * exit (-1); + * } + * _seqbufptr = 0; + * } + */ + +#define SEQ_DEFINEBUF(len) \ + unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0 +#define _SEQ_NEEDBUF(len) \ + if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump() +#define _SEQ_ADVBUF(len) _seqbufptr += len +#define SEQ_DUMPBUF seqbuf_dump +#else +/* + * This variation of the sequencer macros is used just to format one event + * using fixed buffer. + * + * The program using the macro library must define the following macros before + * using this library. + * + * #define _seqbuf name of the buffer (unsigned char[]) + * #define _SEQ_ADVBUF(len) If the applic needs to know the exact + * size of the event, this macro can be used. + * Otherwise this must be defined as empty. + * #define _seqbufptr Define the name of index variable or 0 if + * not required. + */ +#define _SEQ_NEEDBUF(len) /* empty */ +#endif +#endif /* !OSSLIB */ + +#define SEQ_VOLUME_MODE(dev, mode) \ + {_SEQ_NEEDBUF(8);\ + _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ + _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\ + _seqbuf[_seqbufptr+2] = (dev);\ + _seqbuf[_seqbufptr+3] = (mode);\ + _seqbuf[_seqbufptr+4] = 0;\ + _seqbuf[_seqbufptr+5] = 0;\ + _seqbuf[_seqbufptr+6] = 0;\ + _seqbuf[_seqbufptr+7] = 0;\ + _SEQ_ADVBUF(8);} + +/* + * Midi voice messages + */ + +#define _CHN_VOICE(dev, event, chn, note, parm) \ + {_SEQ_NEEDBUF(8);\ + _seqbuf[_seqbufptr] = EV_CHN_VOICE;\ + _seqbuf[_seqbufptr+1] = (dev);\ + _seqbuf[_seqbufptr+2] = (event);\ + _seqbuf[_seqbufptr+3] = (chn);\ + _seqbuf[_seqbufptr+4] = (note);\ + _seqbuf[_seqbufptr+5] = (parm);\ + _seqbuf[_seqbufptr+6] = (0);\ + _seqbuf[_seqbufptr+7] = 0;\ + _SEQ_ADVBUF(8);} + +#define SEQ_START_NOTE(dev, chn, note, vol) \ + _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol) + +#define SEQ_STOP_NOTE(dev, chn, note, vol) \ + _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol) + +#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \ + _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure) + +/* + * Midi channel messages + */ + +#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \ + {_SEQ_NEEDBUF(8);\ + _seqbuf[_seqbufptr] = EV_CHN_COMMON;\ + _seqbuf[_seqbufptr+1] = (dev);\ + _seqbuf[_seqbufptr+2] = (event);\ + _seqbuf[_seqbufptr+3] = (chn);\ + _seqbuf[_seqbufptr+4] = (p1);\ + _seqbuf[_seqbufptr+5] = (p2);\ + *(short *)&_seqbuf[_seqbufptr+6] = (w14);\ + _SEQ_ADVBUF(8);} +/* + * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits + * sending any MIDI bytes but it's absolutely not possible. Trying to do + * so _will_ cause problems with MPU401 intelligent mode). + * + * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be + * sent by calling SEQ_SYSEX() several times (there must be no other events + * between them). First sysex fragment must have 0xf0 in the first byte + * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte + * between these sysex start and end markers cannot be larger than 0x7f. Also + * lengths of each fragments (except the last one) must be 6. + * + * Breaking the above rules may work with some MIDI ports but is likely to + * cause fatal problems with some other devices (such as MPU401). + */ +#define SEQ_SYSEX(dev, buf, len) \ + {int ii, ll=(len); \ + unsigned char *bufp=buf;\ + if (ll>6)ll=6;\ + _SEQ_NEEDBUF(8);\ + _seqbuf[_seqbufptr] = EV_SYSEX;\ + _seqbuf[_seqbufptr+1] = (dev);\ + for(ii=0;ii>8)&0xff);\ + _seqbuf[_seqbufptr+7] = 0;\ + _SEQ_ADVBUF(8);} +/* + * The following 5 macros are incorrectly implemented and obsolete. + * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead. + */ +#define SEQ_PITCHBEND(dev, voice, value) \ + SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value) +#define SEQ_BENDER_RANGE(dev, voice, value) \ + SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value) +#define SEQ_EXPRESSION(dev, voice, value) \ + SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128) +#define SEQ_MAIN_VOLUME(dev, voice, value) \ + SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100) +#define SEQ_PANNING(dev, voice, pos) \ + SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2) + +/* + * Timing and syncronization macros + */ + +#define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ + _seqbuf[_seqbufptr+0] = EV_TIMING; \ + _seqbuf[_seqbufptr+1] = (ev); \ + _seqbuf[_seqbufptr+2] = 0;\ + _seqbuf[_seqbufptr+3] = 0;\ + *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ + _SEQ_ADVBUF(8);} + +#define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0) +#define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0) +#define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0) +#define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks) +#define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks) +#define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key) +#define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value) +#define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos) +#define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig) + +/* + * Local control events + */ + +#define _LOCAL_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ + _seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \ + _seqbuf[_seqbufptr+1] = (ev); \ + _seqbuf[_seqbufptr+2] = 0;\ + _seqbuf[_seqbufptr+3] = 0;\ + *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ + _SEQ_ADVBUF(8);} + +#define SEQ_PLAYAUDIO(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO, devmask) +#define SEQ_PLAYAUDIO2(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO2, devmask) +#define SEQ_PLAYAUDIO3(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO3, devmask) +#define SEQ_PLAYAUDIO4(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO4, devmask) +/* + * Events for the level 1 interface only + */ + +#define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\ + _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\ + _seqbuf[_seqbufptr+1] = (byte);\ + _seqbuf[_seqbufptr+2] = (device);\ + _seqbuf[_seqbufptr+3] = 0;\ + _SEQ_ADVBUF(4);} + +/* + * Patch loading. + */ +#ifdef OSSLIB +# define SEQ_WRPATCH(patchx, len) \ + OSS_write_patch(seqfd, (char*)(patchx), len) +# define SEQ_WRPATCH2(patchx, len) \ + OSS_write_patch2(seqfd, (char*)(patchx), len) +#else +# define SEQ_WRPATCH(patchx, len) \ + {if (_seqbufptr) SEQ_DUMPBUF();\ + if (write(seqfd, (char*)(patchx), len)==-1) \ + perror("Write patch: /dev/sequencer");} +# define SEQ_WRPATCH2(patchx, len) \ + (SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len)) +#endif + +#endif +#endif /* ifndef DISABLE_SEQUENCER */ + +/* + **************************************************************************** + * ioctl commands for the /dev/midi## + ****************************************************************************/ +#define SNDCTL_MIDI_PRETIME __SIOWR('m', 0, int) + +#if 0 +/* + * The SNDCTL_MIDI_MPUMODE and SNDCTL_MIDI_MPUCMD calls + * are completely obsolete. The hardware device (MPU-401 "intelligent mode" + * and compatibles) has disappeared from the market 10 years ago so there + * is no need for this stuff. The MPU-401 "UART" mode devices don't support + * this stuff. + */ +typedef struct +{ + unsigned char cmd; + char nr_args, nr_returns; + unsigned char data[30]; +} mpu_command_rec; + +#define SNDCTL_MIDI_MPUMODE __SIOWR('m', 1, int) +#define SNDCTL_MIDI_MPUCMD __SIOWR('m', 2, mpu_command_rec) +#endif + +/* + * SNDCTL_MIDI_MTCINPUT turns on a mode where OSS automatically inserts + * MTC quarter frame messages (F1 xx) to the input. + * The argument is the MTC mode: + * + * -1 = Turn MTC messages OFF (default) + * 24 = 24 FPS + * 25 = 25 FPS + * 29 = 30 FPS drop frame + * 30 = 30 FPS + * + * Note that 25 FPS mode is probably the only mode that is supported. Other + * modes may be supported in the future versions of OSS, 25 FPS is handy + * because it generates 25*4=100 quarter frame messages per second which + * matches the usual 100 HZ system timer rate). + * + * The quarter frame timer will be reset to 0:00:00:00.0 at the moment this + * ioctl is made. + */ +#define SNDCTL_MIDI_MTCINPUT __SIOWR('m', 3, int) + +/* + * MTC/SMPTE time code record (for future use) + */ +typedef struct +{ + unsigned char hours, minutes, seconds, frames, qframes; + char direction; +#define MTC_DIR_STOPPED 0 +#define MTC_DIR_FORWARD 1 +#define MTC_DIR_BACKWARD -1 + unsigned char time_code_type; + unsigned int flags; +} oss_mtc_data_t; + +#define SNDCTL_MIDI_SETMODE __SIOWR('m', 6, int) +# define MIDI_MODE_TRADITIONAL 0 +# define MIDI_MODE_TIMED 1 /* Input times are in MIDI ticks */ +# define MIDI_MODE_TIMED_ABS 2 /* Input times are absolute (usecs) */ + +/* + * Packet header for MIDI_MODE_TIMED and MIDI_MODE_TIMED_ABS + */ +typedef unsigned long long oss_midi_time_t; /* Variable type for MIDI time (clock ticks) */ + +typedef struct +{ + int magic; /* Initialize to MIDI_HDR_MAGIC */ +#define MIDI_HDR_MAGIC -1 + unsigned short event_type; +#define MIDI_EV_WRITE 0 /* Write or read (with payload) */ +#define MIDI_EV_TEMPO 1 +#define MIDI_EV_ECHO 2 +#define MIDI_EV_START 3 +#define MIDI_EV_STOP 4 +#define MIDI_EV_CONTINUE 5 +#define MIDI_EV_XPRESSWRITE 6 +#define MIDI_EV_TIMEBASE 7 +#define MIDI_EV_DEVCTL 8 /* Device control read/write */ + unsigned short options; +#define MIDI_OPT_NONE 0x0000 +#define MIDI_OPT_TIMED 0x0001 +#define MIDI_OPT_CONTINUATION 0x0002 +#define MIDI_OPT_USECTIME 0x0004 /* Time is absolute (in usecs) */ +#define MIDI_OPT_BUSY 0x0008 /* Reserved for internal use */ + oss_midi_time_t time; + int parm; + int filler[3]; /* Fur future expansion - init to zeros */ +} midi_packet_header_t; +/* + * MIDI_PAYLOAD_SIZE is the maximum size of one MIDI input chunk. It must be + * less (or equal) than 1024 which is the read size recommended in the + * documentation. TODO: Explain this better. + */ +#define MIDI_PAYLOAD_SIZE 1000 + +typedef struct +{ + midi_packet_header_t hdr; + unsigned char payload[MIDI_PAYLOAD_SIZE]; +} midi_packet_t; + +#define SNDCTL_MIDI_TIMEBASE __SIOWR('m', 7, int) +#define SNDCTL_MIDI_TEMPO __SIOWR('m', 8, int) +/* + * User land MIDI servers (synths) can use SNDCTL_MIDI_SET_LATENCY + * to request MIDI events to be sent to them in advance. The parameter + * (in microseconds) tells how much before the events are submitted. + * + * This feature is only valid for loopback devices and possibly some other + * types of virtual devices. + */ +#define SNDCTL_MIDI_SET_LATENCY __SIOW ('m', 9, int) +/* + **************************************************************************** + * IOCTL commands for /dev/dsp + ****************************************************************************/ + +#define SNDCTL_DSP_HALT __SIO ('P', 0) +#define SNDCTL_DSP_RESET SNDCTL_DSP_HALT /* Old name */ +#define SNDCTL_DSP_SYNC __SIO ('P', 1) +#define SNDCTL_DSP_SPEED __SIOWR('P', 2, int) + +/* SNDCTL_DSP_STEREO is obsolete - use SNDCTL_DSP_CHANNELS instead */ +#define SNDCTL_DSP_STEREO __SIOWR('P', 3, int) +/* SNDCTL_DSP_STEREO is obsolete - use SNDCTL_DSP_CHANNELS instead */ + +#define SNDCTL_DSP_GETBLKSIZE __SIOWR('P', 4, int) +#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT +#define SNDCTL_DSP_CHANNELS __SIOWR('P', 6, int) +#define SNDCTL_DSP_POST __SIO ('P', 8) +#define SNDCTL_DSP_SUBDIVIDE __SIOWR('P', 9, int) +#define SNDCTL_DSP_SETFRAGMENT __SIOWR('P',10, int) + +/* Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */ +#define SNDCTL_DSP_GETFMTS __SIOR ('P',11, int) /* Returns a mask */ +#define SNDCTL_DSP_SETFMT __SIOWR('P',5, int) /* Selects ONE fmt */ +# define AFMT_QUERY 0x00000000 /* Return current fmt */ +# define AFMT_MU_LAW 0x00000001 +# define AFMT_A_LAW 0x00000002 +# define AFMT_IMA_ADPCM 0x00000004 +# define AFMT_U8 0x00000008 +# define AFMT_S16_LE 0x00000010 /* Little endian signed 16 */ +# define AFMT_S16_BE 0x00000020 /* Big endian signed 16 */ +# define AFMT_S8 0x00000040 +# define AFMT_U16_LE 0x00000080 /* Little endian U16 */ +# define AFMT_U16_BE 0x00000100 /* Big endian U16 */ +# define AFMT_MPEG 0x00000200 /* MPEG (2) audio */ + +/* AC3 _compressed_ bitstreams (See Programmer's Guide for details). */ +# define AFMT_AC3 0x00000400 +/* Ogg Vorbis _compressed_ bit streams */ +# define AFMT_VORBIS 0x00000800 + +/* 32 bit formats (MSB aligned) formats */ +# define AFMT_S32_LE 0x00001000 +# define AFMT_S32_BE 0x00002000 + +/* Reserved for _native_ endian double precision IEEE floating point */ +# define AFMT_FLOAT 0x00004000 + +/* 24 bit formats (LSB aligned in 32 bit word) formats */ +# define AFMT_S24_LE 0x00008000 +# define AFMT_S24_BE 0x00010000 + +/* + * S/PDIF raw format. In this format the S/PDIF frames (including all + * control and user bits) are included in the data stream. Each sample + * is stored in a 32 bit frame (see IEC-958 for more info). This format + * is supported by very few devices and it's only usable for purposes + * where full access to the control/user bits is required (real time control). + */ +# define AFMT_SPDIF_RAW 0x00020000 + +/* 24 bit packed (3 byte) little endian format (USB compatibility) */ +# define AFMT_S24_PACKED 0x00040000 + + +/* + * Some big endian/little endian handling macros (native endian and opposite + * endian formats). The usage of these macros is described in the OSS + * Programmer's Manual. + */ + +#if defined(_AIX) || defined(AIX) || defined(sparc) || defined(__hppa) || defined(PPC) || defined(__powerpc__) && !defined(i386) && !defined(__i386) && !defined(__i386__) + +/* Big endian machines */ +# define _PATCHKEY(id) (0xfd00|id) +# define AFMT_S16_NE AFMT_S16_BE +# define AFMT_U16_NE AFMT_U16_BE +# define AFMT_S32_NE AFMT_S32_BE +# define AFMT_S24_NE AFMT_S24_BE +# define AFMT_S16_OE AFMT_S16_LE +# define AFMT_S32_OE AFMT_S32_LE +# define AFMT_S24_OE AFMT_S24_LE +#else +# define _PATCHKEY(id) ((id<<8)|0xfd) +# define AFMT_S16_NE AFMT_S16_LE +# define AFMT_U16_NE AFMT_U16_LE +# define AFMT_S32_NE AFMT_S32_LE +# define AFMT_S24_NE AFMT_S24_LE +# define AFMT_S16_OE AFMT_S16_BE +# define AFMT_S32_OE AFMT_S32_BE +# define AFMT_S24_OE AFMT_S24_BE +#endif +/* + * Buffer status queries. + */ +typedef struct audio_buf_info +{ + int fragments; /* # of available fragments (partially usend ones not counted) */ + int fragstotal; /* Total # of fragments allocated */ + int fragsize; /* Size of a fragment in bytes */ + int bytes; /* Available space in bytes (includes partially used fragments) */ + /* Note! 'bytes' could be more than fragments*fragsize */ +} audio_buf_info; + +#define SNDCTL_DSP_GETOSPACE __SIOR ('P',12, audio_buf_info) +#define SNDCTL_DSP_GETISPACE __SIOR ('P',13, audio_buf_info) +#define SNDCTL_DSP_GETCAPS __SIOR ('P',15, int) +# define PCM_CAP_REVISION 0x000000ff /* Bits for revision level (0 to 255) */ +# define PCM_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */ +# define PCM_CAP_REALTIME 0x00000200 /* Not in use */ +# define PCM_CAP_BATCH 0x00000400 /* Device has some kind of */ + /* internal buffers which may */ + /* cause some delays and */ + /* decrease precision of timing */ +# define PCM_CAP_COPROC 0x00000800 /* Has a coprocessor */ + /* Sometimes it's a DSP */ + /* but usually not */ +# define PCM_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */ +# define PCM_CAP_MMAP 0x00002000 /* Supports mmap() */ +# define PCM_CAP_MULTI 0x00004000 /* Supports multiple open */ +# define PCM_CAP_BIND 0x00008000 /* Supports binding to front/rear/center/lfe */ +# define PCM_CAP_INPUT 0x00010000 /* Supports recording */ +# define PCM_CAP_OUTPUT 0x00020000 /* Supports playback */ +# define PCM_CAP_VIRTUAL 0x00040000 /* Virtual device */ +/* 0x00040000 and 0x00080000 reserved for future use */ + +/* Analog/digital control capabilities */ +# define PCM_CAP_ANALOGOUT 0x00100000 +# define PCM_CAP_ANALOGIN 0x00200000 +# define PCM_CAP_DIGITALOUT 0x00400000 +# define PCM_CAP_DIGITALIN 0x00800000 +# define PCM_CAP_ADMASK 0x00f00000 +/* + * NOTE! (capabilities & PCM_CAP_ADMASK)==0 means just that the + * digital/analog interface control features are not supported by the + * device/driver. However the device still supports analog, digital or + * both inputs/outputs (depending on the device). See the OSS Programmer's + * Guide for full details. + */ +# define PCM_CAP_SHADOW 0x01000000 /* "Shadow" device */ + +/* + * Preferred channel usage. These bits can be used to + * give recommendations to the application. Used by few drivers. + * For example if ((caps & DSP_CH_MASK) == DSP_CH_MONO) means that + * the device works best in mono mode. However it doesn't necessarily mean + * that the device cannot be used in stereo. These bits should only be used + * by special applications such as multi track hard disk recorders to find + * out the initial setup. However the user should be able to override this + * selection. + * + * To find out which modes are actually supported the application should + * try to select them using SNDCTL_DSP_CHANNELS. + */ +# define DSP_CH_MASK 0x06000000 /* Mask */ +# define DSP_CH_ANY 0x00000000 /* No preferred mode */ +# define DSP_CH_MONO 0x02000000 +# define DSP_CH_STEREO 0x04000000 +# define DSP_CH_MULTI 0x06000000 /* More than two channels */ + +# define PCM_CAP_HIDDEN 0x08000000 /* Hidden device */ +# define PCM_CAP_FREERATE 0x10000000 +# define PCM_CAP_MODEM 0x20000000 /* Modem device */ +# define PCM_CAP_DEFAULT 0x40000000 /* "Default" device */ + +/* + * The PCM_CAP_* capability names were known as DSP_CAP_* prior OSS 4.0 + * so it's necessary to define the older names too. + */ +#define DSP_CAP_ADMASK PCM_CAP_ADMASK +#define DSP_CAP_ANALOGIN PCM_CAP_ANALOGIN +#define DSP_CAP_ANALOGOUT PCM_CAP_ANALOGOUT +#define DSP_CAP_BATCH PCM_CAP_BATCH +#define DSP_CAP_BIND PCM_CAP_BIND +#define DSP_CAP_COPROC PCM_CAP_COPROC +#define DSP_CAP_DEFAULT PCM_CAP_DEFAULT +#define DSP_CAP_DIGITALIN PCM_CAP_DIGITALIN +#define DSP_CAP_DIGITALOUT PCM_CAP_DIGITALOUT +#define DSP_CAP_DUPLEX PCM_CAP_DUPLEX +#define DSP_CAP_FREERATE PCM_CAP_FREERATE +#define DSP_CAP_HIDDEN PCM_CAP_HIDDEN +#define DSP_CAP_INPUT PCM_CAP_INPUT +#define DSP_CAP_MMAP PCM_CAP_MMAP +#define DSP_CAP_MODEM PCM_CAP_MODEM +#define DSP_CAP_MULTI PCM_CAP_MULTI +#define DSP_CAP_OUTPUT PCM_CAP_OUTPUT +#define DSP_CAP_REALTIME PCM_CAP_REALTIME +#define DSP_CAP_REVISION PCM_CAP_REVISION +#define DSP_CAP_SHADOW PCM_CAP_SHADOW +#define DSP_CAP_TRIGGER PCM_CAP_TRIGGER +#define DSP_CAP_VIRTUAL PCM_CAP_VIRTUAL + +#define SNDCTL_DSP_GETTRIGGER __SIOR ('P',16, int) +#define SNDCTL_DSP_SETTRIGGER __SIOW ('P',16, int) +# define PCM_ENABLE_INPUT 0x00000001 +# define PCM_ENABLE_OUTPUT 0x00000002 + +typedef struct count_info +{ + unsigned int bytes; /* Total # of bytes processed */ + int blocks; /* # of fragment transitions since last time */ + int ptr; /* Current DMA pointer value */ +} count_info; + +#define SNDCTL_DSP_GETIPTR __SIOR ('P',17, count_info) +#define SNDCTL_DSP_GETOPTR __SIOR ('P',18, count_info) + +typedef struct buffmem_desc +{ + unsigned *buffer; + int size; +} buffmem_desc; +#define SNDCTL_DSP_SETSYNCRO __SIO ('P', 21) +#define SNDCTL_DSP_SETDUPLEX __SIO ('P', 22) + +#define SNDCTL_DSP_PROFILE __SIOW ('P', 23, int) /* OBSOLETE */ +#define APF_NORMAL 0 /* Normal applications */ +#define APF_NETWORK 1 /* Underruns probably caused by an "external" delay */ +#define APF_CPUINTENS 2 /* Underruns probably caused by "overheating" the CPU */ + +#define SNDCTL_DSP_GETODELAY __SIOR ('P', 23, int) + +typedef struct audio_errinfo +{ + int play_underruns; + int rec_overruns; + unsigned int play_ptradjust; + unsigned int rec_ptradjust; + int play_errorcount; + int rec_errorcount; + int play_lasterror; + int rec_lasterror; + int play_errorparm; + int rec_errorparm; + int filler[16]; +} audio_errinfo; + +#define SNDCTL_DSP_GETPLAYVOL __SIOR ('P', 24, int) +#define SNDCTL_DSP_SETPLAYVOL __SIOWR('P', 24, int) +#define SNDCTL_DSP_GETERROR __SIOR ('P', 25, audio_errinfo) +/* + **************************************************************************** + * Digital interface (S/PDIF) control interface + */ + +typedef struct oss_digital_control +{ + unsigned int caps; +#define DIG_CBITIN_NONE 0x00000000 +#define DIG_CBITIN_LIMITED 0x00000001 +#define DIG_CBITIN_DATA 0x00000002 +#define DIG_CBITIN_BYTE0 0x00000004 +#define DIG_CBITIN_FULL 0x00000008 +#define DIG_CBITIN_MASK 0x0000000f +#define DIG_CBITOUT_NONE 0x00000000 +#define DIG_CBITOUT_LIMITED 0x00000010 +#define DIG_CBITOUT_BYTE0 0x00000020 +#define DIG_CBITOUT_FULL 0x00000040 +#define DIG_CBITOUT_DATA 0x00000080 +#define DIG_CBITOUT_MASK 0x000000f0 +#define DIG_UBITIN 0x00000100 +#define DIG_UBITOUT 0x00000200 +#define DIG_VBITOUT 0x00000400 +#define DIG_OUTRATE 0x00000800 +#define DIG_INRATE 0x00001000 +#define DIG_INBITS 0x00002000 +#define DIG_OUTBITS 0x00004000 +#define DIG_EXACT 0x00010000 +#define DIG_PRO 0x00020000 +#define DIG_CONSUMER 0x00040000 +#define DIG_PASSTHROUGH 0x00080000 +#define DIG_OUTSEL 0x00100000 + + unsigned int valid; +#define VAL_CBITIN 0x00000001 +#define VAL_UBITIN 0x00000002 +#define VAL_CBITOUT 0x00000004 +#define VAL_UBITOUT 0x00000008 +#define VAL_ISTATUS 0x00000010 +#define VAL_IRATE 0x00000020 +#define VAL_ORATE 0x00000040 +#define VAL_INBITS 0x00000080 +#define VAL_OUTBITS 0x00000100 +#define VAL_REQUEST 0x00000200 +#define VAL_OUTSEL 0x00000400 + +#define VAL_OUTMASK (VAL_CBITOUT|VAL_UBITOUT|VAL_ORATE|VAL_OUTBITS|VAL_OUTSEL) + + unsigned int request, param; +#define SPD_RQ_PASSTHROUGH 1 + + unsigned char cbitin[24]; + unsigned char ubitin[24]; + unsigned char cbitout[24]; + unsigned char ubitout[24]; + + unsigned int outsel; +#define OUTSEL_DIGITAL 1 +#define OUTSEL_ANALOG 2 +#define OUTSEL_BOTH (OUTSEL_DIGITAL|OUTSEL_ANALOG) + + int in_data; /* Audio/data if autodetectable by the receiver */ +#define IND_UNKNOWN 0 +#define IND_AUDIO 1 +#define IND_DATA 2 + + int in_locked; /* Receiver locked */ +#define LOCK_NOT_INDICATED 0 +#define LOCK_UNLOCKED 1 +#define LOCK_LOCKED 2 + + int in_quality; /* Input signal quality */ +#define IN_QUAL_NOT_INDICATED 0 +#define IN_QUAL_POOR 1 +#define IN_QUAL_GOOD 2 + + int in_vbit, out_vbit; /* V bits */ +#define VBIT_NOT_INDICATED 0 +#define VBIT_OFF 1 +#define VBIT_ON 2 + + unsigned int in_errors; /* Various input error conditions */ +#define INERR_CRC 0x0001 +#define INERR_QCODE_CRC 0x0002 +#define INERR_PARITY 0x0004 +#define INERR_BIPHASE 0x0008 + + int srate_in, srate_out; + int bits_in, bits_out; + + int filler[32]; +} oss_digital_control; + +#define SNDCTL_DSP_READCTL __SIOWR('P', 26, oss_digital_control) +#define SNDCTL_DSP_WRITECTL __SIOWR('P', 27, oss_digital_control) + +/* + **************************************************************************** + * Sync groups for audio devices + */ +typedef struct oss_syncgroup +{ + int id; + int mode; + int filler[16]; +} oss_syncgroup; + +#define SNDCTL_DSP_SYNCGROUP __SIOWR('P', 28, oss_syncgroup) +#define SNDCTL_DSP_SYNCSTART __SIOW ('P', 29, int) + +/* + ************************************************************************** + * "cooked" mode enables software based conversions for sample rate, sample + * format (bits) and number of channels (mono/stereo). These conversions are + * required with some devices that support only one sample rate or just stereo + * to let the applications to use other formats. The cooked mode is enabled by + * default. However it's necessary to disable this mode when mmap() is used or + * when very deterministic timing is required. SNDCTL_DSP_COOKEDMODE is an + * optional call introduced in OSS 3.9.6f. It's _error return must be ignored_ + * since normally this call will return erno=EINVAL. + * + * SNDCTL_DSP_COOKEDMODE must be called immediately after open before doing + * anything else. Otherwise the call will not have any effect. + */ +#define SNDCTL_DSP_COOKEDMODE __SIOW ('P', 30, int) + +/* + ************************************************************************** + * SNDCTL_DSP_SILENCE and SNDCTL_DSP_SKIP are new calls in OSS 3.99.0 + * that can be used to implement pause/continue during playback (no effect + * on recording). + */ +#define SNDCTL_DSP_SILENCE __SIO ('P', 31) +#define SNDCTL_DSP_SKIP __SIO ('P', 32) +/* + **************************************************************************** + * Abort transfer (reset) functions for input and output + */ +#define SNDCTL_DSP_HALT_INPUT __SIO ('P', 33) +#define SNDCTL_DSP_RESET_INPUT SNDCTL_DSP_HALT_INPUT /* Old name */ +#define SNDCTL_DSP_HALT_OUTPUT __SIO ('P', 34) +#define SNDCTL_DSP_RESET_OUTPUT SNDCTL_DSP_HALT_OUTPUT /* Old name */ +/* + **************************************************************************** + * Low water level control + */ +#define SNDCTL_DSP_LOW_WATER __SIOW ('P', 34, int) + +/* + **************************************************************************** + * 64 bit pointer support. Only available in environments that support + * the 64 bit (long long) integer type. + */ +#ifndef OSS_NO_LONG_LONG +typedef struct +{ + long long samples; + int fifo_samples; + int filler[32]; /* For future use */ +} oss_count_t; + +#define SNDCTL_DSP_CURRENT_IPTR __SIOR ('P', 35, oss_count_t) +#define SNDCTL_DSP_CURRENT_OPTR __SIOR ('P', 36, oss_count_t) +#endif + +/* + **************************************************************************** + * Interface for selecting recording sources and playback output routings. + */ +#define SNDCTL_DSP_GET_RECSRC_NAMES __SIOR ('P', 37, oss_mixer_enuminfo) +#define SNDCTL_DSP_GET_RECSRC __SIOR ('P', 38, int) +#define SNDCTL_DSP_SET_RECSRC __SIOWR('P', 38, int) + +#define SNDCTL_DSP_GET_PLAYTGT_NAMES __SIOR ('P', 39, oss_mixer_enuminfo) +#define SNDCTL_DSP_GET_PLAYTGT __SIOR ('P', 40, int) +#define SNDCTL_DSP_SET_PLAYTGT __SIOWR('P', 40, int) +#define SNDCTL_DSP_GETRECVOL __SIOR ('P', 41, int) +#define SNDCTL_DSP_SETRECVOL __SIOWR('P', 41, int) + +/* + *************************************************************************** + * Some calls for setting the channel assignment with multi channel devices + * (see the manual for details). + */ +#ifndef OSS_NO_LONG_LONG +#define SNDCTL_DSP_GET_CHNORDER __SIOR ('P', 42, unsigned long long) +#define SNDCTL_DSP_SET_CHNORDER __SIOWR('P', 42, unsigned long long) +# define CHID_UNDEF 0 +# define CHID_L 1 +# define CHID_R 2 +# define CHID_C 3 +# define CHID_LFE 4 +# define CHID_LS 5 +# define CHID_RS 6 +# define CHID_LR 7 +# define CHID_RR 8 +#define CHNORDER_UNDEF 0x0000000000000000ULL +#define CHNORDER_NORMAL 0x0000000087654321ULL +#endif + +#define MAX_PEAK_CHANNELS 128 +typedef unsigned short oss_peaks_t[MAX_PEAK_CHANNELS]; +#define SNDCTL_DSP_GETIPEAKS __SIOR('P', 43, oss_peaks_t) +#define SNDCTL_DSP_GETOPEAKS __SIOR('P', 44, oss_peaks_t) + +#define SNDCTL_DSP_POLICY __SIOW('P', 45, int) /* See the manual */ + +/* + **************************************************************************** + * Few ioctl calls that are not official parts of OSS. They have been used + * by few freeware implementations of OSS. + */ +#define SNDCTL_DSP_GETCHANNELMASK __SIOWR('P', 64, int) +#define SNDCTL_DSP_BIND_CHANNEL __SIOWR('P', 65, int) +# define DSP_BIND_QUERY 0x00000000 +# define DSP_BIND_FRONT 0x00000001 +# define DSP_BIND_SURR 0x00000002 +# define DSP_BIND_CENTER_LFE 0x00000004 +# define DSP_BIND_HANDSET 0x00000008 +# define DSP_BIND_MIC 0x00000010 +# define DSP_BIND_MODEM1 0x00000020 +# define DSP_BIND_MODEM2 0x00000040 +# define DSP_BIND_I2S 0x00000080 +# define DSP_BIND_SPDIF 0x00000100 +# define DSP_BIND_REAR 0x00000200 + +#ifdef sun +/* Not part of OSS. Reserved for internal use by Solaris */ +#define X_SADA_GET_PLAYTGT_MASK __SIOR ('P', 66, int) +#define X_SADA_GET_PLAYTGT __SIOR ('P', 67, int) +#define X_SADA_SET_PLAYTGT __SIOWR('P', 68, int) +#endif + +#ifndef NO_LEGACY_MIXER +/* + **************************************************************************** + * IOCTL commands for the "legacy " /dev/mixer API (obsolete) + * + * Mixer controls + * + * There can be up to 20 different analog mixer channels. The + * SOUND_MIXER_NRDEVICES gives the currently supported maximum. + * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells + * the devices supported by the particular mixer. + * + * {!notice This "legacy" mixer API is obsolete. It has been superceded + * by a new one (see below). + */ + +#define SOUND_MIXER_NRDEVICES 28 +#define SOUND_MIXER_VOLUME 0 +#define SOUND_MIXER_BASS 1 +#define SOUND_MIXER_TREBLE 2 +#define SOUND_MIXER_SYNTH 3 +#define SOUND_MIXER_PCM 4 +#define SOUND_MIXER_SPEAKER 5 +#define SOUND_MIXER_LINE 6 +#define SOUND_MIXER_MIC 7 +#define SOUND_MIXER_CD 8 +#define SOUND_MIXER_IMIX 9 /* Recording monitor */ +#define SOUND_MIXER_ALTPCM 10 +#define SOUND_MIXER_RECLEV 11 /* Recording level */ +#define SOUND_MIXER_IGAIN 12 /* Input gain */ +#define SOUND_MIXER_OGAIN 13 /* Output gain */ +/* + * Some soundcards have three line level inputs (line, aux1 and aux2). + * Since each card manufacturer has assigned different meanings to + * these inputs, it's impractical to assign specific meanings + * (eg line, cd, synth etc.) to them. + */ +#define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */ +#define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */ +#define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */ +#define SOUND_MIXER_DIGITAL1 17 /* Digital I/O 1 */ +#define SOUND_MIXER_DIGITAL2 18 /* Digital I/O 2 */ +#define SOUND_MIXER_DIGITAL3 19 /* Digital I/O 3 */ +#define SOUND_MIXER_PHONE 20 /* Phone */ +#define SOUND_MIXER_MONO 21 /* Mono Output */ +#define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */ +#define SOUND_MIXER_RADIO 23 /* Radio in */ +#define SOUND_MIXER_DEPTH 24 /* Surround depth */ +#define SOUND_MIXER_REARVOL 25 /* Rear/Surround speaker vol */ +#define SOUND_MIXER_CENTERVOL 26 /* Center/LFE speaker vol */ +#define SOUND_MIXER_SIDEVOL 27 /* Side-Surround (8speaker) vol */ + +/* + * Warning: SOUND_MIXER_SURRVOL is an old name of SOUND_MIXER_SIDEVOL. + * They are both assigned to the same mixer control. Don't + * use both control names in the same program/driver. + */ +#define SOUND_MIXER_SURRVOL SOUND_MIXER_SIDEVOL + +/* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */ +/* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */ +#define SOUND_ONOFF_MIN 28 +#define SOUND_ONOFF_MAX 30 + +/* Note! Number 31 cannot be used since the sign bit is reserved */ +#define SOUND_MIXER_NONE 31 + +/* + * The following unsupported macros are no longer functional. + * Use SOUND_MIXER_PRIVATE# macros in future. + */ +#define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE +#define SOUND_MIXER_MUTE SOUND_MIXER_NONE +#define SOUND_MIXER_LOUD SOUND_MIXER_NONE + +#define SOUND_DEVICE_LABELS \ + {"Vol ", "Bass ", "Treble", "Synth", "Pcm ", "Speaker ", "Line ", \ + "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \ + "Aux1", "Aux2", "Aux3", "Digital1", "Digital2", "Digital3", \ + "Phone", "Mono", "Video", "Radio", "Depth", \ + "Rear", "Center", "Side"} + +#define SOUND_DEVICE_NAMES \ + {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ + "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \ + "aux1", "aux2", "aux3", "dig1", "dig2", "dig3", \ + "phone", "mono", "video", "radio", "depth", \ + "rear", "center", "side"} + +/* Device bitmask identifiers */ + +#define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */ +#define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */ +#define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */ +#define SOUND_MIXER_CAPS 0xfc +# define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */ +# define SOUND_CAP_NOLEGACY 0x00000004 /* For internal use only */ +# define SOUND_CAP_NORECSRC 0x00000008 +#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ + +/* OSS/Free ONLY */ +#define SOUND_MIXER_OUTSRC 0xfa /* Arg contains a bit for each input source to output */ +#define SOUND_MIXER_OUTMASK 0xf9 /* Arg contains a bit for each supported input source to output */ +/* OSS/Free ONLY */ + +/* Device mask bits */ + +#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) +#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) +#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) +#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) +#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) +#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) +#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) +#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) +#define SOUND_MASK_CD (1 << SOUND_MIXER_CD) +#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) +#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) +#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) +#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN) +#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN) +#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1) +#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2) +#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3) +#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1) +#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2) +#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3) +#define SOUND_MASK_MONO (1 << SOUND_MIXER_MONO) +#define SOUND_MASK_PHONE (1 << SOUND_MIXER_PHONE) +#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO) +#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO) +#define SOUND_MASK_DEPTH (1 << SOUND_MIXER_DEPTH) +#define SOUND_MASK_REARVOL (1 << SOUND_MIXER_REARVOL) +#define SOUND_MASK_CENTERVOL (1 << SOUND_MIXER_CENTERVOL) +#define SOUND_MASK_SIDEVOL (1 << SOUND_MIXER_SIDEVOL) + +/* Note! SOUND_MASK_SURRVOL is alias of SOUND_MASK_SIDEVOL */ +#define SOUND_MASK_SURRVOL (1 << SOUND_MIXER_SIDEVOL) + +/* Obsolete macros */ +#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) +#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) +#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) + +#define MIXER_READ(dev) __SIOR('M', dev, int) +#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) +#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) +#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) +#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) +#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) +#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) +#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) +#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) +#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) +#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) +#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) +#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) +#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN) +#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN) +#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1) +#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2) +#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3) + +/* Obsolete macros */ +#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) +#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) +#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) + +#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) +#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) +#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) +#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) +#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) + +#define MIXER_WRITE(dev) __SIOWR('M', dev, int) +#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) +#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) +#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) +#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) +#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) +#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) +#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) +#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) +#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) +#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) +#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) +#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) +#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN) +#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN) +#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1) +#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2) +#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3) + +/* Obsolete macros */ +#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) +#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) +#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) + +#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) + +typedef struct mixer_info /* OBSOLETE */ +{ + char id[16]; + char name[32]; + int modify_counter; + int card_number; + int port_number; + char handle[32]; +} mixer_info; + +/* SOUND_MIXER_INFO is obsolete - use SNDCTL_MIXERINFO instead */ +#define SOUND_MIXER_INFO __SIOR ('M', 101, mixer_info) + +/* + * Two ioctls for special souncard function (OSS/Free only) + */ +#define SOUND_MIXER_AGC _SIOWR('M', 103, int) +#define SOUND_MIXER_3DSE _SIOWR('M', 104, int) +/* + * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers. + * These features can be used when accessing device specific features. + */ +#define SOUND_MIXER_PRIVATE1 __SIOWR('M', 111, int) +#define SOUND_MIXER_PRIVATE2 __SIOWR('M', 112, int) +#define SOUND_MIXER_PRIVATE3 __SIOWR('M', 113, int) +#define SOUND_MIXER_PRIVATE4 __SIOWR('M', 114, int) +#define SOUND_MIXER_PRIVATE5 __SIOWR('M', 115, int) + +/* The following two controls were never implemented and they should not be used. */ +#define SOUND_MIXER_READ_MAINVOL __SIOR ('M', 116, int) +#define SOUND_MIXER_WRITE_MAINVOL __SIOWR('M', 116, int) + +/* + * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used + * for querying current mixer settings from the driver and for loading + * default volume settings _prior_ activating the mixer (loading + * doesn't affect current state of the mixer hardware). These calls + * are for internal use by the driver software only. + */ + +typedef struct mixer_vol_table +{ + int num; /* Index to volume table */ + char name[32]; + int levels[32]; +} mixer_vol_table; + +#define SOUND_MIXER_GETLEVELS __SIOWR('M', 116, mixer_vol_table) +#define SOUND_MIXER_SETLEVELS __SIOWR('M', 117, mixer_vol_table) + +#define OSS_GETVERSION __SIOR ('M', 118, int) + +/* + * Calls to set/get the recording gain for the currently active + * recording source. These calls automatically map to the right control. + * Note that these calls are not supported by all drivers. In this case + * the call will return -1 with errno set to EINVAL + * + * The _MONGAIN work in similar way but set/get the monitoring gain for + * the currently selected recording source. + */ +#define SOUND_MIXER_READ_RECGAIN __SIOR ('M', 119, int) +#define SOUND_MIXER_WRITE_RECGAIN __SIOWR('M', 119, int) +#define SOUND_MIXER_READ_MONGAIN __SIOR ('M', 120, int) +#define SOUND_MIXER_WRITE_MONGAIN __SIOWR('M', 120, int) + +/* The following call is for driver development time purposes. It's not + * present in any released drivers. + */ +typedef unsigned char oss_reserved_t[512]; +#define SOUND_MIXER_RESERVED __SIOWR('M', 121, oss_reserved_t) +#endif /* ifndef NO_LEGACY_MIXER */ + +/* + ************************************************************************* + * The "new" mixer API of OSS 4.0 and later. + * + * This improved mixer API makes it possible to access every possible feature + * of every possible device. However you should read the mixer programming + * section of the OSS API Developer's Manual. There is no chance that you + * could use this interface correctly just by examining this header. + */ + +typedef struct oss_sysinfo +{ + char product[32]; /* For example OSS/Free, OSS/Linux or OSS/Solaris */ + char version[32]; /* For example 4.0a */ + int versionnum; /* See OSS_GETVERSION */ + char options[128]; /* Reserved */ + + int numaudios; /* # of audio/dsp devices */ + int openedaudio[8]; /* Bit mask telling which audio devices are busy */ + + int numsynths; /* # of availavle synth devices */ + int nummidis; /* # of available MIDI ports */ + int numtimers; /* # of available timer devices */ + int nummixers; /* # of mixer devices */ + + int openedmidi[8]; /* Bit mask telling which midi devices are busy */ + int numcards; /* Number of sound cards in the system */ + int numaudioengines; /* Number of audio engines in the system */ + char license[16]; /* For example "GPL" or "CDDL" */ + int filler[236]; /* For future expansion (set to -1) */ +} oss_sysinfo; + +typedef struct oss_mixext +{ + int dev; /* Mixer device number */ + int ctrl; /* Controller number */ + int type; /* Entry type */ +# define MIXT_DEVROOT 0 /* Device root entry */ +# define MIXT_GROUP 1 /* Controller group */ +# define MIXT_ONOFF 2 /* OFF (0) or ON (1) */ +# define MIXT_ENUM 3 /* Enumerated (0 to maxvalue) */ +# define MIXT_MONOSLIDER 4 /* Mono slider (0 to 255) */ +# define MIXT_STEREOSLIDER 5 /* Stereo slider (dual 0 to 255) */ +# define MIXT_MESSAGE 6 /* (Readable) textual message */ +# define MIXT_MONOVU 7 /* VU meter value (mono) */ +# define MIXT_STEREOVU 8 /* VU meter value (stereo) */ +# define MIXT_MONOPEAK 9 /* VU meter peak value (mono) */ +# define MIXT_STEREOPEAK 10 /* VU meter peak value (stereo) */ +# define MIXT_RADIOGROUP 11 /* Radio button group */ +# define MIXT_MARKER 12 /* Separator between normal and extension entries */ +# define MIXT_VALUE 13 /* Decimal value entry */ +# define MIXT_HEXVALUE 14 /* Hexadecimal value entry */ +# define MIXT_MONODB 15 /* OBSOLETE */ +# define MIXT_STEREODB 16 /* OBSOLETE */ +# define MIXT_SLIDER 17 /* Slider (mono) with full (31 bit) postitive integer range */ +# define MIXT_3D 18 + +/* + * Sliders with range expanded to 15 bits per channel (0-32767) + */ +# define MIXT_MONOSLIDER16 19 +# define MIXT_STEREOSLIDER16 20 +# define MIXT_MUTE 21 /* Mute=1, unmute=0 */ + + /**************************************************************/ + + /* Possible value range (minvalue to maxvalue) */ + /* Note that maxvalue may also be smaller than minvalue */ + int maxvalue; + int minvalue; + + int flags; +# define MIXF_READABLE 0x00000001 /* Has readable value */ +# define MIXF_WRITEABLE 0x00000002 /* Has writeable value */ +# define MIXF_POLL 0x00000004 /* May change itself */ +# define MIXF_HZ 0x00000008 /* Herz scale */ +# define MIXF_STRING 0x00000010 /* Use dynamic extensions for value */ +# define MIXF_DYNAMIC 0x00000010 /* Supports dynamic extensions */ +# define MIXF_OKFAIL 0x00000020 /* Interpret value as 1=OK, 0=FAIL */ +# define MIXF_FLAT 0x00000040 /* Flat vertical space requirements */ +# define MIXF_LEGACY 0x00000080 /* Legacy mixer control group */ +# define MIXF_CENTIBEL 0x00000100 /* Centibel (0.1 dB) step size */ +# define MIXF_DECIBEL 0x00000200 /* Step size of 1 dB */ +# define MIXF_MAINVOL 0x00000400 /* Main volume control */ +# define MIXF_PCMVOL 0x00000800 /* PCM output volume control */ +# define MIXF_RECVOL 0x00001000 /* PCM recording volume control */ +# define MIXF_MONVOL 0x00002000 /* Input->output monitor volume */ +# define MIXF_WIDE 0x00004000 /* Enum control has wide labels */ +# define MIXF_DESCR 0x00008000 /* Description (tooltip) available */ + char id[16]; /* Mnemonic ID (mainly for internal use) */ + int parent; /* Entry# of parent (group) node (-1 if root) */ + + int dummy; /* Internal use */ + + int timestamp; + + char data[64]; /* Misc data (entry type dependent) */ + unsigned char enum_present[32]; /* Mask of allowed enum values */ + int control_no; /* SOUND_MIXER_VOLUME..SOUND_MIXER_MIDI */ + /* (-1 means not indicated) */ + +/* + * The desc field is reserved for internal purposes of OSS. It should not be + * used by applications. + */ + unsigned int desc; +#define MIXEXT_SCOPE_MASK 0x0000003f +#define MIXEXT_SCOPE_OTHER 0x00000000 +#define MIXEXT_SCOPE_INPUT 0x00000001 +#define MIXEXT_SCOPE_OUTPUT 0x00000002 +#define MIXEXT_SCOPE_MONITOR 0x00000003 +#define MIXEXT_SCOPE_RECSWITCH 0x00000004 + + char extname[32]; + int update_counter; + int rgbcolor; /* 0 means default color (not black) . Otherwise 24 bit RGB color */ + int filler[6]; +} oss_mixext; + +/* + * Recommended colors to be used in the rgbcolor field. These match the + * colors used as the audio jack colors in HD audio motherboards. + */ +#define OSS_RGB_BLUE 0x7aabde // Light blue +#define OSS_RGB_GREEN 0xb3c98c // Lime green +#define OSS_RGB_PINK 0xe88c99 +#define OSS_RGB_GRAY 0xd1ccc4 +#define OSS_RGB_BLACK 0x2b2926 // Light black +#define OSS_RGB_ORANGE 0xe89e47 +#define OSS_RGB_RED 0xff0000 +#define OSS_RGB_YELLOW 0xffff00 +#define OSS_RGB_PURPLE 0x800080 +#define OSS_RGB_WHITE 0xf8f8ff + +typedef struct oss_mixext_root +{ + char id[16]; + char name[48]; +} oss_mixext_root; + +typedef struct oss_mixer_value +{ + int dev; + int ctrl; + int value; + int flags; /* Reserved for future use. Initialize to 0 */ + int timestamp; /* Must be set to oss_mixext.timestamp */ + int filler[8]; /* Reserved for future use. Initialize to 0 */ +} oss_mixer_value; + +#define OSS_ENUM_MAXVALUE 255 +#define OSS_ENUM_STRINGSIZE 3000 +typedef struct oss_mixer_enuminfo +{ + int dev; + int ctrl; + int nvalues; + int version; /* Read the manual */ + short strindex[OSS_ENUM_MAXVALUE]; + char strings[OSS_ENUM_STRINGSIZE]; +} oss_mixer_enuminfo; + +#define OPEN_READ PCM_ENABLE_INPUT +#define OPEN_WRITE PCM_ENABLE_OUTPUT +#define OPEN_READWRITE (OPEN_READ|OPEN_WRITE) + +typedef struct oss_audioinfo +{ + int dev; /* Audio device number */ + char name[64]; + int busy; /* 0, OPEN_READ, OPEN_WRITE or OPEN_READWRITE */ + int pid; + int caps; /* PCM_CAP_INPUT, PCM_CAP_OUTPUT */ + int iformats, oformats; + int magic; /* Reserved for internal use */ + char cmd[64]; /* Command using the device (if known) */ + int card_number; + int port_number; + int mixer_dev; + int legacy_device; /* Obsolete field. Replaced by devnode */ + int enabled; /* 1=enabled, 0=device not ready at this moment */ + int flags; /* For internal use only - no practical meaning */ + int min_rate, max_rate; /* Sample rate limits */ + int min_channels, max_channels; /* Number of channels supported */ + int binding; /* DSP_BIND_FRONT, etc. 0 means undefined */ + int rate_source; + char handle[32]; +#define OSS_MAX_SAMPLE_RATES 20 /* Cannot be changed */ + unsigned int nrates, rates[OSS_MAX_SAMPLE_RATES]; /* Please read the manual before using these */ + oss_longname_t song_name; /* Song name (if given) */ + oss_label_t label; /* Device label (if given) */ + int latency; /* In usecs, -1=unknown */ + oss_devnode_t devnode; /* Device special file name (absolute path) */ + int next_play_engine; /* Read the documentation for more info */ + int next_rec_engine; /* Read the documentation for more info */ + int filler[184]; +} oss_audioinfo; + +typedef struct oss_mixerinfo +{ + int dev; + char id[16]; + char name[32]; + int modify_counter; + int card_number; + int port_number; + char handle[32]; + int magic; /* Reserved */ + int enabled; /* Reserved */ + int caps; +#define MIXER_CAP_VIRTUAL 0x00000001 +#define MIXER_CAP_LAYOUT_B 0x00000002 /* For internal use only */ +#define MIXER_CAP_NARROW 0x00000004 /* Conserve horiz space */ + int flags; /* Reserved */ + int nrext; + /* + * The priority field can be used to select the default (motherboard) + * mixer device. The mixer with the highest priority is the + * most preferred one. -2 or less means that this device cannot be used + * as the default mixer. + */ + int priority; + oss_devnode_t devnode; /* Device special file name (absolute path) */ + int legacy_device; + int filler[245]; /* Reserved */ +} oss_mixerinfo; + +typedef struct oss_midi_info +{ + int dev; /* Midi device number */ + char name[64]; + int busy; /* 0, OPEN_READ, OPEN_WRITE or OPEN_READWRITE */ + int pid; + char cmd[64]; /* Command using the device (if known) */ + int caps; +#define MIDI_CAP_MPU401 0x00000001 /**** OBSOLETE ****/ +#define MIDI_CAP_INPUT 0x00000002 +#define MIDI_CAP_OUTPUT 0x00000004 +#define MIDI_CAP_INOUT (MIDI_CAP_INPUT|MIDI_CAP_OUTPUT) +#define MIDI_CAP_VIRTUAL 0x00000008 /* Pseudo device */ +#define MIDI_CAP_MTCINPUT 0x00000010 /* Supports SNDCTL_MIDI_MTCINPUT */ +#define MIDI_CAP_CLIENT 0x00000020 /* Virtual client side device */ +#define MIDI_CAP_SERVER 0x00000040 /* Virtual server side device */ +#define MIDI_CAP_INTERNAL 0x00000080 /* Internal (synth) device */ +#define MIDI_CAP_EXTERNAL 0x00000100 /* external (MIDI port) device */ +#define MIDI_CAP_PTOP 0x00000200 /* Point to point link to one device */ +#define MIDI_CAP_MTC 0x00000400 /* MTC/SMPTE (control) device */ + int magic; /* Reserved for internal use */ + int card_number; + int port_number; + int enabled; /* 1=enabled, 0=device not ready at this moment */ + int flags; /* For internal use only - no practical meaning */ + char handle[32]; + oss_longname_t song_name; /* Song name (if known) */ + oss_label_t label; /* Device label (if given) */ + int latency; /* In usecs, -1=unknown */ + oss_devnode_t devnode; /* Device special file name (absolute path) */ + int legacy_device; /* Legacy device mapping */ + int filler[235]; +} oss_midi_info; + +typedef struct oss_card_info +{ + int card; + char shortname[16]; + char longname[128]; + int flags; + char hw_info[400]; + int intr_count, ack_count; + int filler[154]; +} oss_card_info; + +#define SNDCTL_SYSINFO __SIOR ('X', 1, oss_sysinfo) +#define OSS_SYSINFO SNDCTL_SYSINFO /* Old name */ + +#define SNDCTL_MIX_NRMIX __SIOR ('X', 2, int) +#define SNDCTL_MIX_NREXT __SIOWR('X', 3, int) +#define SNDCTL_MIX_EXTINFO __SIOWR('X', 4, oss_mixext) +#define SNDCTL_MIX_READ __SIOWR('X', 5, oss_mixer_value) +#define SNDCTL_MIX_WRITE __SIOWR('X', 6, oss_mixer_value) + +#define SNDCTL_AUDIOINFO __SIOWR('X', 7, oss_audioinfo) +#define SNDCTL_MIX_ENUMINFO __SIOWR('X', 8, oss_mixer_enuminfo) +#define SNDCTL_MIDIINFO __SIOWR('X', 9, oss_midi_info) +#define SNDCTL_MIXERINFO __SIOWR('X',10, oss_mixerinfo) +#define SNDCTL_CARDINFO __SIOWR('X',11, oss_card_info) +#define SNDCTL_ENGINEINFO __SIOWR('X',12, oss_audioinfo) +#define SNDCTL_AUDIOINFO_EX __SIOWR('X',13, oss_audioinfo) + +#define SNDCTL_MIX_DESCRIPTION __SIOWR('X',14, oss_mixer_enuminfo) + +/* ioctl codes 'X', 200-255 are reserved for internal use */ + +/* + * Few more "globally" available ioctl calls. + */ +#define SNDCTL_SETSONG __SIOW ('Y', 2, oss_longname_t) +#define SNDCTL_GETSONG __SIOR ('Y', 2, oss_longname_t) +#define SNDCTL_SETNAME __SIOW ('Y', 3, oss_longname_t) +#define SNDCTL_SETLABEL __SIOW ('Y', 4, oss_label_t) +#define SNDCTL_GETLABEL __SIOR ('Y', 4, oss_label_t) +/* + * The "new" mixer API definitions end here. + *************************************** + */ + +/* + ********************************************************* + * Few routines that are included in -lOSSlib + * + * At this moment this interface is not used. OSSlib contains just + * stubs that call the related system calls directly. + */ +#ifdef OSSLIB +extern int osslib_open (const char *path, int flags, int dummy); +extern void osslib_close (int fd); +extern int osslib_write (int fd, const void *buf, int count); +extern int osslib_read (int fd, void *buf, int count); +extern int osslib_ioctl (int fd, unsigned int request, void *arg); +#else +# define osslib_open open +# define osslib_close close +# define osslib_write write +# define osslib_read read +# define osslib_ioctl ioctl +#endif + +#if 1 +#define SNDCTL_DSP_NONBLOCK __SIO ('P',14) /* Obsolete. Not supported any more */ +#endif + +#if 1 +/* + * Some obsolete macros that are not part of Open Sound System API. + */ +#define SOUND_PCM_READ_RATE SOUND_PCM_READ_RATE_is_obsolete +#define SOUND_PCM_READ_BITS SOUND_PCM_READ_BITS_is_obsolete +#define SOUND_PCM_READ_CHANNELS SOUND_PCM_READ_CHANNELS_is_obsolete +#define SOUND_PCM_WRITE_RATE SOUND_PCM_WRITE_RATE_is_obsolet_use_SNDCTL_DSP_SPEED_instead +#define SOUND_PCM_WRITE_CHANNELS SOUND_PCM_WRITE_CHANNELS_is_obsolete_use_SNDCTL_DSP_CHANNELS_instead +#define SOUND_PCM_WRITE_BITS SOUND_PCM_WRITE_BITS_is_obsolete_use_SNDCTL_DSP_SETFMT_instead +#define SOUND_PCM_POST SOUND_PCM_POST_is_obsolete_use_SNDCTL_DSP_POST_instead +#define SOUND_PCM_RESET SOUND_PCM_RESET_is_obsolete_use_SNDCTL_DSP_HALT_instead +#define SOUND_PCM_SYNC SOUND_PCM_SYNC_is_obsolete_use_SNDCTL_DSP_SYNC_instead +#define SOUND_PCM_SUBDIVIDE SOUND_PCM_SUBDIVIDE_is_obsolete_use_SNDCTL_DSP_SUBDIVIDE_instead +#define SOUND_PCM_SETFRAGMENT SOUND_PCM_SETFRAGMENT_is_obsolete_use_SNDCTL_DSP_SETFRAGMENT_instead +#define SOUND_PCM_GETFMTS SOUND_PCM_GETFMTS_is_obsolete_use_SNDCTL_DSP_GETFMTS_instead +#define SOUND_PCM_SETFMT SOUND_PCM_SETFMT_is_obsolete_use_SNDCTL_DSP_SETFMT_instead +#define SOUND_PCM_GETOSPACE SOUND_PCM_GETOSPACE_is_obsolete_use_SNDCTL_DSP_GETOSPACE_instead +#define SOUND_PCM_GETISPACE SOUND_PCM_GETISPACE_is_obsolete_use_SNDCTL_DSP_GETISPACE_instead +#define SOUND_PCM_NONBLOCK SOUND_PCM_NONBLOCK_is_obsolete_use_SNDCTL_DSP_NONBLOCK_instead +#define SOUND_PCM_GETCAPS SOUND_PCM_GETCAPS_is_obsolete_use_SNDCTL_DSP_GETCAPS_instead +#define SOUND_PCM_GETTRIGGER SOUND_PCM_GETTRIGGER_is_obsolete_use_SNDCTL_DSP_GETTRIGGER_instead +#define SOUND_PCM_SETTRIGGER SOUND_PCM_SETTRIGGER_is_obsolete_use_SNDCTL_DSP_SETTRIGGER_instead +#define SOUND_PCM_SETSYNCRO SOUND_PCM_SETSYNCRO_is_obsolete_use_SNDCTL_DSP_SETSYNCRO_instead +#define SOUND_PCM_GETIPTR SOUND_PCM_GETIPTR_is_obsolete_use_SNDCTL_DSP_GETIPTR_instead +#define SOUND_PCM_GETOPTR SOUND_PCM_GETOPTR_is_obsolete_use_SNDCTL_DSP_GETOPTR_instead +#define SOUND_PCM_MAPINBUF SOUND_PCM_MAPINBUF_is_obsolete_use_SNDCTL_DSP_MAPINBUF_instead +#define SOUND_PCM_MAPOUTBUF SOUND_PCM_MAPOUTBUF_is_obsolete_use_SNDCTL_DSP_MAPOUTBUF_instead +#endif + +#endif diff --git a/sys/oss4/oss4-source.c b/sys/oss4/oss4-source.c new file mode 100644 index 0000000..eadb4c5 --- /dev/null +++ b/sys/oss4/oss4-source.c @@ -0,0 +1,997 @@ +/* GStreamer OSS4 audio source + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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-oss4src + * + * This element lets you record sound using the Open Sound System (OSS) + * version 4. + * + * + * Example pipelines + * |[ + * gst-launch -v oss4src ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=mymusic.ogg + * ]| will record sound from your sound card using OSS4 and encode it to an + * Ogg/Vorbis file (this will only work if your mixer settings are right + * and the right inputs areenabled etc.) + * + * + * Since: 0.10.7 + */ + +/* FIXME: make sure we're not doing ioctls from the app thread (e.g. via the + * mixer interface) while recording */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define NO_LEGACY_MIXER +#include "oss4-audio.h" +#include "oss4-source.h" +#include "oss4-property-probe.h" +#include "oss4-soundcard.h" + +#define GST_OSS4_SOURCE_IS_OPEN(src) (GST_OSS4_SOURCE(src)->fd != -1) + +GST_DEBUG_CATEGORY_EXTERN (oss4src_debug); +#define GST_CAT_DEFAULT oss4src_debug + +#define DEFAULT_DEVICE NULL +#define DEFAULT_DEVICE_NAME NULL + +enum +{ + PROP_0, + PROP_DEVICE, + PROP_DEVICE_NAME +}; + +static void gst_oss4_source_init_interfaces (GType type); + +GST_BOILERPLATE_FULL (GstOss4Source, gst_oss4_source, GstAudioSrc, + GST_TYPE_AUDIO_SRC, gst_oss4_source_init_interfaces); + +static void gst_oss4_source_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_oss4_source_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static void gst_oss4_source_dispose (GObject * object); +static void gst_oss4_source_finalize (GstOss4Source * osssrc); + +static GstCaps *gst_oss4_source_getcaps (GstBaseSrc * bsrc); + +static gboolean gst_oss4_source_open (GstAudioSrc * asrc, + gboolean silent_errors); +static gboolean gst_oss4_source_open_func (GstAudioSrc * asrc); +static gboolean gst_oss4_source_close (GstAudioSrc * asrc); +static gboolean gst_oss4_source_prepare (GstAudioSrc * asrc, + GstRingBufferSpec * spec); +static gboolean gst_oss4_source_unprepare (GstAudioSrc * asrc); +static guint gst_oss4_source_read (GstAudioSrc * asrc, gpointer data, + guint length); +static guint gst_oss4_source_delay (GstAudioSrc * asrc); +static void gst_oss4_source_reset (GstAudioSrc * asrc); + +static void +gst_oss4_source_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstPadTemplate *templ; + + gst_element_class_set_details_simple (element_class, + "OSS v4 Audio Source", "Source/Audio", + "Capture from a sound card via OSS version 4", + "Tim-Philipp Müller "); + + templ = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + gst_oss4_audio_get_template_caps ()); + gst_element_class_add_pad_template (element_class, templ); + gst_object_unref (templ); +} + +static void +gst_oss4_source_class_init (GstOss4SourceClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + GstAudioSrcClass *gstaudiosrc_class; + + gobject_class = (GObjectClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstaudiosrc_class = (GstAudioSrcClass *) klass; + + gobject_class->dispose = gst_oss4_source_dispose; + gobject_class->finalize = (GObjectFinalizeFunc) gst_oss4_source_finalize; + gobject_class->get_property = gst_oss4_source_get_property; + gobject_class->set_property = gst_oss4_source_set_property; + + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss4_source_getcaps); + + gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_oss4_source_open_func); + gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_oss4_source_prepare); + gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss4_source_unprepare); + gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_oss4_source_close); + gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_oss4_source_read); + gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_oss4_source_delay); + gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_oss4_source_reset); + + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) " + "(NULL = use first available device)", + DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_oss4_source_init (GstOss4Source * osssrc, GstOss4SourceClass * g_class) +{ + const gchar *device; + + device = g_getenv ("AUDIODEV"); + if (device == NULL) + device = DEFAULT_DEVICE; + + osssrc->fd = -1; + osssrc->device = g_strdup (device); + osssrc->device_name = g_strdup (DEFAULT_DEVICE_NAME); + osssrc->device_name = NULL; +} + +static void +gst_oss4_source_finalize (GstOss4Source * oss) +{ + g_free (oss->device); + oss->device = NULL; + + g_list_free (oss->property_probe_list); + oss->property_probe_list = NULL; + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (oss)); +} + +static void +gst_oss4_source_dispose (GObject * object) +{ + GstOss4Source *oss = GST_OSS4_SOURCE (object); + + if (oss->probed_caps) { + gst_caps_unref (oss->probed_caps); + oss->probed_caps = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_oss4_source_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOss4Source *oss; + + oss = GST_OSS4_SOURCE (object); + + switch (prop_id) { + case PROP_DEVICE: + GST_OBJECT_LOCK (oss); + if (oss->fd == -1) { + g_free (oss->device); + oss->device = g_value_dup_string (value); + g_free (oss->device_name); + oss->device_name = NULL; + } else { + g_warning ("%s: can't change \"device\" property while audio source " + "is open", GST_OBJECT_NAME (oss)); + } + GST_OBJECT_UNLOCK (oss); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_oss4_source_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOss4Source *oss; + + oss = GST_OSS4_SOURCE (object); + + switch (prop_id) { + case PROP_DEVICE: + GST_OBJECT_LOCK (oss); + g_value_set_string (value, oss->device); + GST_OBJECT_UNLOCK (oss); + break; + case PROP_DEVICE_NAME: + GST_OBJECT_LOCK (oss); + /* If device is set, try to retrieve the name even if we're not open */ + if (oss->fd == -1 && oss->device != NULL) { + if (gst_oss4_source_open (GST_AUDIO_SRC (oss), TRUE)) { + g_value_set_string (value, oss->device_name); + gst_oss4_source_close (GST_AUDIO_SRC (oss)); + } else { + gchar *name = NULL; + + gst_oss4_property_probe_find_device_name_nofd (GST_OBJECT (oss), + oss->device, &name); + g_value_set_string (value, name); + g_free (name); + } + } else { + g_value_set_string (value, oss->device_name); + } + + GST_OBJECT_UNLOCK (oss); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_oss4_source_getcaps (GstBaseSrc * bsrc) +{ + GstOss4Source *oss; + GstCaps *caps; + + oss = GST_OSS4_SOURCE (bsrc); + + if (oss->fd == -1) { + caps = gst_oss4_audio_get_template_caps (); + } else if (oss->probed_caps) { + caps = gst_caps_copy (oss->probed_caps); + } else { + caps = gst_oss4_audio_probe_caps (GST_OBJECT (oss), oss->fd); + if (caps != NULL && !gst_caps_is_empty (caps)) { + oss->probed_caps = gst_caps_copy (caps); + } + } + + return caps; +} + +/* note: we must not take the object lock here unless we fix up get_property */ +static gboolean +gst_oss4_source_open (GstAudioSrc * asrc, gboolean silent_errors) +{ + GstOss4Source *oss; + gchar *device; + int mode; + + oss = GST_OSS4_SOURCE (asrc); + + if (oss->device) + device = g_strdup (oss->device); + else + device = gst_oss4_audio_find_device (GST_OBJECT_CAST (oss)); + + /* desperate times, desperate measures */ + if (device == NULL) + device = g_strdup ("/dev/dsp0"); + + GST_INFO_OBJECT (oss, "Trying to open OSS4 device '%s'", device); + + /* we open in non-blocking mode even if we don't really want to do writes + * non-blocking because we can't be sure that this is really a genuine + * OSS4 device with well-behaved drivers etc. We really don't want to + * hang forever under any circumstances. */ + oss->fd = open (device, O_RDONLY | O_NONBLOCK, 0); + if (oss->fd == -1) { + switch (errno) { + case EBUSY: + goto busy; + case EACCES: + goto no_permission; + default: + goto open_failed; + } + } + + GST_INFO_OBJECT (oss, "Opened device"); + + /* Make sure it's OSS4. If it's old OSS, let osssink handle it */ + if (!gst_oss4_audio_check_version (GST_OBJECT_CAST (oss), oss->fd)) + goto legacy_oss; + + /* now remove the non-blocking flag. */ + mode = fcntl (oss->fd, F_GETFL); + mode &= ~O_NONBLOCK; + if (fcntl (oss->fd, F_SETFL, mode) < 0) { + /* some drivers do no support unsetting the non-blocking flag, try to + * close/open the device then. This is racy but we error out properly. */ + GST_WARNING_OBJECT (oss, "failed to unset O_NONBLOCK (buggy driver?), " + "will try to re-open device now"); + gst_oss4_source_close (asrc); + if ((oss->fd = open (device, O_RDONLY, 0)) == -1) + goto non_block; + } + + oss->open_device = device; + + /* not using ENGINEINFO here because it sometimes returns a different and + * less useful name than AUDIOINFO for the same device */ + if (!gst_oss4_property_probe_find_device_name (GST_OBJECT (oss), oss->fd, + oss->open_device, &oss->device_name)) { + oss->device_name = NULL; + } + + return TRUE; + + /* ERRORS */ +busy: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, BUSY, + (_("Could not open audio device for playback. " + "Device is being used by another application.")), (NULL)); + } + g_free (device); + return FALSE; + } +no_permission: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, + (_("Could not open audio device for playback. " + "You don't have permission to open the device.")), + GST_ERROR_SYSTEM); + } + g_free (device); + return FALSE; + } +open_failed: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, + (_("Could not open audio device for playback.")), GST_ERROR_SYSTEM); + } + g_free (device); + return FALSE; + } +legacy_oss: + { + gst_oss4_source_close (asrc); + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, + (_("Could not open audio device for playback. " + "This version of the Open Sound System is not supported by this " + "element.")), ("Try the 'osssink' element instead")); + } + g_free (device); + return FALSE; + } +non_block: + { + if (!silent_errors) { + GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), + ("Unable to set device %s into non-blocking mode: %s", + oss->device, g_strerror (errno))); + } + g_free (device); + return FALSE; + } +} + +static gboolean +gst_oss4_source_open_func (GstAudioSrc * asrc) +{ + return gst_oss4_source_open (asrc, FALSE); +} + +static void +gst_oss4_source_free_mixer_tracks (GstOss4Source * oss) +{ + g_list_foreach (oss->tracks, (GFunc) g_object_unref, NULL); + g_list_free (oss->tracks); + oss->tracks = NULL; +} + +static gboolean +gst_oss4_source_close (GstAudioSrc * asrc) +{ + GstOss4Source *oss; + + oss = GST_OSS4_SOURCE (asrc); + + if (oss->fd != -1) { + GST_DEBUG_OBJECT (oss, "closing device"); + close (oss->fd); + oss->fd = -1; + } + + oss->bytes_per_sample = 0; + + gst_caps_replace (&oss->probed_caps, NULL); + + g_free (oss->open_device); + oss->open_device = NULL; + + g_free (oss->device_name); + oss->device_name = NULL; + + gst_oss4_source_free_mixer_tracks (oss); + + return TRUE; +} + +static gboolean +gst_oss4_source_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) +{ + GstOss4Source *oss; + + oss = GST_OSS4_SOURCE (asrc); + + if (!gst_oss4_audio_set_format (GST_OBJECT_CAST (oss), oss->fd, spec)) { + GST_WARNING_OBJECT (oss, "Couldn't set requested format %" GST_PTR_FORMAT, + spec->caps); + return FALSE; + } + + oss->bytes_per_sample = spec->bytes_per_sample; + return TRUE; +} + +static gboolean +gst_oss4_source_unprepare (GstAudioSrc * asrc) +{ + /* could do a SNDCTL_DSP_HALT, but the OSS manual recommends a close/open, + * since HALT won't properly reset some devices, apparently */ + + if (!gst_oss4_source_close (asrc)) + goto couldnt_close; + + if (!gst_oss4_source_open_func (asrc)) + goto couldnt_reopen; + + return TRUE; + + /* ERRORS */ +couldnt_close: + { + GST_DEBUG_OBJECT (asrc, "Couldn't close the audio device"); + return FALSE; + } +couldnt_reopen: + { + GST_DEBUG_OBJECT (asrc, "Couldn't reopen the audio device"); + return FALSE; + } +} + +static guint +gst_oss4_source_read (GstAudioSrc * asrc, gpointer data, guint length) +{ + GstOss4Source *oss; + int n; + + oss = GST_OSS4_SOURCE_CAST (asrc); + + n = read (oss->fd, data, length); + GST_LOG_OBJECT (asrc, "%u bytes, %u samples", n, n / oss->bytes_per_sample); + + if (G_UNLIKELY (n < 0)) { + switch (errno) { + case ENOTSUP: + case EACCES:{ + /* This is the most likely cause, I think */ + GST_ELEMENT_ERROR (asrc, RESOURCE, READ, + (_("Recording is not supported by this audio device.")), + ("read: %s (device: %s) (maybe this is an output-only device?)", + g_strerror (errno), oss->open_device)); + break; + } + default:{ + GST_ELEMENT_ERROR (asrc, RESOURCE, READ, + (_("Error recording from audio device.")), + ("read: %s (device: %s)", g_strerror (errno), oss->open_device)); + break; + } + } + } + + return (guint) n; +} + +static guint +gst_oss4_source_delay (GstAudioSrc * asrc) +{ + audio_buf_info info = { 0, }; + GstOss4Source *oss; + guint delay; + + oss = GST_OSS4_SOURCE_CAST (asrc); + + if (ioctl (oss->fd, SNDCTL_DSP_GETISPACE, &info) == -1) { + GST_LOG_OBJECT (oss, "GETISPACE failed: %s", g_strerror (errno)); + return 0; + } + + delay = (info.fragstotal * info.fragsize) - info.bytes; + GST_LOG_OBJECT (oss, "fragstotal:%d, fragsize:%d, bytes:%d, delay:%d", + info.fragstotal, info.fragsize, info.bytes, delay); + return delay; +} + +static void +gst_oss4_source_reset (GstAudioSrc * asrc) +{ + /* There's nothing we can do here really: OSS can't handle access to the + * same device/fd from multiple threads and might deadlock or blow up in + * other ways if we try an ioctl SNDCTL_DSP_HALT or similar */ +} + +/* GstMixer interface, which we abuse here for input selection, because we + * don't have a proper interface for that and because that's what + * gnome-sound-recorder does. */ + +/* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ +G_DEFINE_TYPE (GstOss4SourceInput, gst_oss4_source_input, GST_TYPE_MIXER_TRACK); + +static void +gst_oss4_source_input_class_init (GstOss4SourceInputClass * klass) +{ + /* nothing to do here */ +} + +static void +gst_oss4_source_input_init (GstOss4SourceInput * i) +{ + /* nothing to do here */ +} + +#if 0 + +static void +gst_ossmixer_ensure_track_list (GstOssMixer * mixer) +{ + gint i, master = -1; + + g_return_if_fail (mixer->fd != -1); + + if (mixer->tracklist) + return; + + /* find master volume */ + if (mixer->devmask & SOUND_MASK_VOLUME) + master = SOUND_MIXER_VOLUME; + else if (mixer->devmask & SOUND_MASK_PCM) + master = SOUND_MIXER_PCM; + else if (mixer->devmask & SOUND_MASK_SPEAKER) + master = SOUND_MIXER_SPEAKER; /* doubtful... */ + /* else: no master, so we won't set any */ + + /* build track list */ + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { + if (mixer->devmask & (1 << i)) { + GstMixerTrack *track; + gboolean input = FALSE, stereo = FALSE, record = FALSE; + + /* track exists, make up capabilities */ + if (MASK_BIT_IS_SET (mixer->stereomask, i)) + stereo = TRUE; + if (MASK_BIT_IS_SET (mixer->recmask, i)) + input = TRUE; + if (MASK_BIT_IS_SET (mixer->recdevs, i)) + record = TRUE; + + /* do we want mixer in our list? */ + if (!((mixer->dir & GST_OSS_MIXER_CAPTURE && input == TRUE) || + (mixer->dir & GST_OSS_MIXER_PLAYBACK && i != SOUND_MIXER_PCM))) + /* the PLAYBACK case seems hacky, but that's how 0.8 had it */ + continue; + + /* add track to list */ + track = gst_ossmixer_track_new (mixer->fd, i, stereo ? 2 : 1, + (record ? GST_MIXER_TRACK_RECORD : 0) | + (input ? GST_MIXER_TRACK_INPUT : + GST_MIXER_TRACK_OUTPUT) | + ((master != i) ? 0 : GST_MIXER_TRACK_MASTER)); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } + } +} + +/* unused with G_DISABLE_* */ +static G_GNUC_UNUSED gboolean +gst_ossmixer_contains_track (GstOssMixer * mixer, GstOssMixerTrack * osstrack) +{ + const GList *item; + + for (item = mixer->tracklist; item != NULL; item = item->next) + if (item->data == osstrack) + return TRUE; + + return FALSE; +} + +const GList * +gst_ossmixer_list_tracks (GstOssMixer * mixer) +{ + gst_ossmixer_ensure_track_list (mixer); + + return (const GList *) mixer->tracklist; +} + +void +gst_ossmixer_get_volume (GstOssMixer * mixer, + GstMixerTrack * track, gint * volumes) +{ + gint volume; + GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); + + g_return_if_fail (mixer->fd != -1); + g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); + + if (track->flags & GST_MIXER_TRACK_MUTE) { + volumes[0] = osstrack->lvol; + if (track->num_channels == 2) { + volumes[1] = osstrack->rvol; + } + } else { + /* get */ + if (ioctl (mixer->fd, MIXER_READ (osstrack->track_num), &volume) < 0) { + g_warning ("Error getting recording device (%d) volume: %s", + osstrack->track_num, g_strerror (errno)); + volume = 0; + } + + osstrack->lvol = volumes[0] = (volume & 0xff); + if (track->num_channels == 2) { + osstrack->rvol = volumes[1] = ((volume >> 8) & 0xff); + } + } +} + +void +gst_ossmixer_set_mute (GstOssMixer * mixer, GstMixerTrack * track, + gboolean mute) +{ + int volume; + GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); + + g_return_if_fail (mixer->fd != -1); + g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); + + if (mute) { + volume = 0; + } else { + volume = (osstrack->lvol & 0xff); + if (MASK_BIT_IS_SET (mixer->stereomask, osstrack->track_num)) { + volume |= ((osstrack->rvol & 0xff) << 8); + } + } + + if (ioctl (mixer->fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { + g_warning ("Error setting mixer recording device volume (0x%x): %s", + volume, g_strerror (errno)); + return; + } + + if (mute) { + track->flags |= GST_MIXER_TRACK_MUTE; + } else { + track->flags &= ~GST_MIXER_TRACK_MUTE; + } +} +#endif + +static gint +gst_oss4_source_mixer_get_current_input (GstOss4Source * oss) +{ + int cur = -1; + + if (ioctl (oss->fd, SNDCTL_DSP_GET_RECSRC, &cur) == -1 || cur < 0) + return -1; + + return cur; +} + +static const gchar * +gst_oss4_source_mixer_update_record_flags (GstOss4Source * oss, gint cur_route) +{ + const gchar *cur_name = ""; + GList *t; + + for (t = oss->tracks; t != NULL; t = t->next) { + GstMixerTrack *track = t->data; + + if (GST_OSS4_SOURCE_INPUT (track)->route == cur_route) { + if (!GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD)) { + track->flags |= GST_MIXER_TRACK_RECORD; + /* no point in sending a mixer-record-changes message here */ + } + cur_name = track->label; + } else { + if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD)) { + track->flags &= ~GST_MIXER_TRACK_RECORD; + /* no point in sending a mixer-record-changes message here */ + } + } + } + + return cur_name; +} + +static const GList * +gst_oss4_source_mixer_list_tracks (GstMixer * mixer) +{ + oss_mixer_enuminfo names = { 0, }; + GstOss4Source *oss; + const gchar *cur_name; + GList *tracks = NULL; + gint i, cur; + + g_return_val_if_fail (mixer != NULL, NULL); + g_return_val_if_fail (GST_IS_OSS4_SOURCE (mixer), NULL); + g_return_val_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer), NULL); + + oss = GST_OSS4_SOURCE (mixer); + + if (oss->tracks != NULL && oss->tracks_static) + goto done; + + if (ioctl (oss->fd, SNDCTL_DSP_GET_RECSRC_NAMES, &names) == -1) + goto get_recsrc_names_error; + + oss->tracks_static = (names.version == 0); + + GST_INFO_OBJECT (oss, "%d inputs (list is static: %s):", names.nvalues, + (oss->tracks_static) ? "yes" : "no"); + + for (i = 0; i < MIN (names.nvalues, OSS_ENUM_MAXVALUE + 1); ++i) { + GstMixerTrack *track; + + track = g_object_new (GST_TYPE_OSS4_SOURCE_INPUT, NULL); + track->label = g_strdup (&names.strings[names.strindex[i]]); + track->flags = GST_MIXER_TRACK_INPUT; + track->num_channels = 2; + track->min_volume = 0; + track->max_volume = 100; + GST_OSS4_SOURCE_INPUT (track)->route = i; + + GST_INFO_OBJECT (oss, " [%d] %s", i, track->label); + tracks = g_list_append (tracks, track); + } + + gst_oss4_source_free_mixer_tracks (oss); + oss->tracks = tracks; + +done: + + /* update RECORD flags */ + cur = gst_oss4_source_mixer_get_current_input (oss); + cur_name = gst_oss4_source_mixer_update_record_flags (oss, cur); + GST_DEBUG_OBJECT (oss, "current input route: %d (%s)", cur, cur_name); + + return (const GList *) oss->tracks; + +/* ERRORS */ +get_recsrc_names_error: + { + GST_WARNING_OBJECT (oss, "GET_RECSRC_NAMES failed: %s", g_strerror (errno)); + return NULL; + } +} + +static void +gst_oss4_source_mixer_set_volume (GstMixer * mixer, GstMixerTrack * track, + gint * volumes) +{ + GstOss4Source *oss; + int new_vol, cur; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (track != NULL); + g_return_if_fail (GST_IS_MIXER_TRACK (track)); + g_return_if_fail (GST_IS_OSS4_SOURCE (mixer)); + g_return_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer)); + + oss = GST_OSS4_SOURCE (mixer); + + cur = gst_oss4_source_mixer_get_current_input (oss); + if (cur != GST_OSS4_SOURCE_INPUT (track)->route) { + GST_DEBUG_OBJECT (oss, "track not selected input route, ignoring request"); + return; + } + + new_vol = (volumes[1] << 8) | volumes[0]; + if (ioctl (oss->fd, SNDCTL_DSP_SETRECVOL, &new_vol) == -1) { + GST_WARNING_OBJECT (oss, "SETRECVOL failed: %s", g_strerror (errno)); + } +} + +static void +gst_oss4_source_mixer_get_volume (GstMixer * mixer, GstMixerTrack * track, + gint * volumes) +{ + GstOss4Source *oss; + int cur; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (GST_IS_OSS4_SOURCE (mixer)); + g_return_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer)); + + oss = GST_OSS4_SOURCE (mixer); + + cur = gst_oss4_source_mixer_get_current_input (oss); + if (cur != GST_OSS4_SOURCE_INPUT (track)->route) { + volumes[0] = 0; + volumes[1] = 0; + } else { + int vol = -1; + + if (ioctl (oss->fd, SNDCTL_DSP_GETRECVOL, &vol) == -1 || vol < 0) { + GST_WARNING_OBJECT (oss, "GETRECVOL failed: %s", g_strerror (errno)); + volumes[0] = 100; + volumes[1] = 100; + } else { + volumes[0] = MIN (100, vol & 0xff); + volumes[1] = MIN (100, (vol >> 8) & 0xff); + } + } +} + +static void +gst_oss4_source_mixer_set_record (GstMixer * mixer, GstMixerTrack * track, + gboolean record) +{ + GstOss4Source *oss; + const gchar *cur_name; + gint cur; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (track != NULL); + g_return_if_fail (GST_IS_MIXER_TRACK (track)); + g_return_if_fail (GST_IS_OSS4_SOURCE (mixer)); + g_return_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer)); + + oss = GST_OSS4_SOURCE (mixer); + + cur = gst_oss4_source_mixer_get_current_input (oss); + + /* stop recording for an input that's not selected anyway => nothing to do */ + if (!record && cur != GST_OSS4_SOURCE_INPUT (track)->route) + goto done; + + /* select recording for an input that's already selected => nothing to do + * (or should we mess with the recording volume in this case maybe?) */ + if (record && cur == GST_OSS4_SOURCE_INPUT (track)->route) + goto done; + + /* make current input stop recording: we can't really make an input stop + * recording, we can only select an input FOR recording, so we'll just ignore + * all requests to stop for now */ + if (!record) { + GST_WARNING_OBJECT (oss, "Can't un-select an input as such, only switch " + "to a different input source"); + /* FIXME: set recording volume to 0 maybe? */ + } else { + int new_route = GST_OSS4_SOURCE_INPUT (track)->route; + + /* select this input for recording */ + + if (ioctl (oss->fd, SNDCTL_DSP_SET_RECSRC, &new_route) == -1) { + GST_WARNING_OBJECT (oss, "Could not select input %d for recording: %s", + new_route, g_strerror (errno)); + } else { + cur = new_route; + } + } + +done: + + cur_name = gst_oss4_source_mixer_update_record_flags (oss, cur); + GST_DEBUG_OBJECT (oss, "active input route: %d (%s)", cur, cur_name); +} + +static void +gst_oss4_source_mixer_set_mute (GstMixer * mixer, GstMixerTrack * track, + gboolean mute) +{ + g_return_if_fail (mixer != NULL); + g_return_if_fail (track != NULL); + g_return_if_fail (GST_IS_MIXER_TRACK (track)); + g_return_if_fail (GST_IS_OSS4_SOURCE (mixer)); + g_return_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer)); + + /* FIXME: implement gst_oss4_source_mixer_set_mute() - what to do here? */ + /* oss4_mixer_set_mute (mixer->mixer, track, mute); */ +} + +static void +gst_oss4_source_mixer_interface_init (GstMixerClass * klass) +{ + GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; + + klass->list_tracks = gst_oss4_source_mixer_list_tracks; + klass->set_volume = gst_oss4_source_mixer_set_volume; + klass->get_volume = gst_oss4_source_mixer_get_volume; + klass->set_mute = gst_oss4_source_mixer_set_mute; + klass->set_record = gst_oss4_source_mixer_set_record; +} + +/* Implement the horror that is GstImplementsInterface */ + +static gboolean +gst_oss4_source_mixer_supported (GstImplementsInterface * iface, + GType iface_type) +{ + GstOss4Source *oss; + gboolean is_open; + + g_return_val_if_fail (GST_IS_OSS4_SOURCE (iface), FALSE); + g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE); + + oss = GST_OSS4_SOURCE (iface); + + GST_OBJECT_LOCK (oss); + is_open = GST_OSS4_SOURCE_IS_OPEN (iface); + GST_OBJECT_UNLOCK (oss); + + return is_open; +} + +static void +gst_oss4_source_mixer_implements_interface_init (GstImplementsInterfaceClass * + klass) +{ + klass->supported = gst_oss4_source_mixer_supported; +} + +static void +gst_oss4_source_init_interfaces (GType type) +{ + static const GInterfaceInfo implements_iface_info = { + (GInterfaceInitFunc) gst_oss4_source_mixer_implements_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo mixer_iface_info = { + (GInterfaceInitFunc) gst_oss4_source_mixer_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, + &implements_iface_info); + g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info); + + gst_oss4_add_property_probe_interface (type); +} diff --git a/sys/oss4/oss4-source.h b/sys/oss4/oss4-source.h new file mode 100644 index 0000000..3a86b43 --- /dev/null +++ b/sys/oss4/oss4-source.h @@ -0,0 +1,89 @@ +/* GStreamer OSS4 audio source + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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_OSS4_SOURCE_H +#define GST_OSS4_SOURCE_H + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_OSS4_SOURCE (gst_oss4_source_get_type()) +#define GST_OSS4_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_SOURCE,GstOss4Source)) +#define GST_OSS4_SOURCE_CAST(obj) ((GstOss4Source *)(obj)) +#define GST_OSS4_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_SOURCE,GstOss4SourceClass)) +#define GST_IS_OSS4_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_SOURCE)) +#define GST_IS_OSS4_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_SOURCE)) + +typedef struct _GstOss4Source GstOss4Source; +typedef struct _GstOss4SourceClass GstOss4SourceClass; + +struct _GstOss4Source { + GstAudioSrc audiosrc; + + gchar * device; /* NULL if none was set */ + gchar * open_device; /* the device we opened */ + gchar * device_name; /* set if the device is open */ + gint fd; /* -1 if not open */ + gint bytes_per_sample; + + GstCaps * probed_caps; + + /* property probe interface */ + GList * property_probe_list; + + /* mixer interface */ + GList * tracks; + gboolean tracks_static; /* FALSE if the list of inputs may change */ +}; + +struct _GstOss4SourceClass { + GstAudioSrcClass audiosrc_class; +}; + +GType gst_oss4_source_get_type (void); + +/* our mixer track for input selection */ +#define GST_TYPE_OSS4_SOURCE_INPUT (gst_oss4_source_input_get_type()) +#define GST_OSS4_SOURCE_INPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_SOURCE_INPUT,GstOss4SourceInput)) +#define GST_OSS4_SOURCE_INPUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_SOURCE_INPUT,GstOss4SourceInputClass)) +#define GST_IS_OSS4_SOURCE_INPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_SOURCE_INPUT)) +#define GST_IS_OSS4_SOURCE_INPUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_SOURCE_INPUT)) + +typedef struct _GstOss4SourceInput GstOss4SourceInput; +typedef struct _GstOss4SourceInputClass GstOss4SourceInputClass; + +struct _GstOss4SourceInput { + GstMixerTrack mixer_track; + + int route; /* number for SNDCTL_DSP_SET_RECSRC etc. */ +}; + +struct _GstOss4SourceInputClass { + GstMixerTrackClass mixer_track_class; +}; + +GType gst_oss4_source_input_get_type (void); + +G_END_DECLS + +#endif /* GST_OSS4_SOURCE_H */ + diff --git a/sys/osxaudio/Makefile.am b/sys/osxaudio/Makefile.am new file mode 100644 index 0000000..cfd0c4d --- /dev/null +++ b/sys/osxaudio/Makefile.am @@ -0,0 +1,26 @@ +plugin_LTLIBRARIES = libgstosxaudio.la + +libgstosxaudio_la_SOURCES = gstosxringbuffer.c \ + gstosxaudioelement.c \ + gstosxaudiosink.c \ + gstosxaudiosrc.c \ + gstosxaudio.c + +libgstosxaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + -Wno-deprecated-declarations +libgstosxaudio_la_LIBADD = \ + -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) +libgstosxaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -Wl,-framework -Wl,CoreAudio -Wl,-framework -Wl,AudioUnit -Wl,-framework -Wl,CoreServices +libgstosxaudio_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstosxaudiosink.h \ + gstosxaudioelement.h \ + gstosxringbuffer.h \ + gstosxaudiosrc.h + + + diff --git a/sys/osxaudio/Makefile.in b/sys/osxaudio/Makefile.in new file mode 100644 index 0000000..9e8e186 --- /dev/null +++ b/sys/osxaudio/Makefile.in @@ -0,0 +1,858 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = sys/osxaudio +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstosxaudio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstosxaudio_la_OBJECTS = libgstosxaudio_la-gstosxringbuffer.lo \ + libgstosxaudio_la-gstosxaudioelement.lo \ + libgstosxaudio_la-gstosxaudiosink.lo \ + libgstosxaudio_la-gstosxaudiosrc.lo \ + libgstosxaudio_la-gstosxaudio.lo +libgstosxaudio_la_OBJECTS = $(am_libgstosxaudio_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstosxaudio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) \ + $(libgstosxaudio_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstosxaudio_la_SOURCES) +DIST_SOURCES = $(libgstosxaudio_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstosxaudio.la +libgstosxaudio_la_SOURCES = gstosxringbuffer.c \ + gstosxaudioelement.c \ + gstosxaudiosink.c \ + gstosxaudiosrc.c \ + gstosxaudio.c + +libgstosxaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + -Wno-deprecated-declarations + +libgstosxaudio_la_LIBADD = \ + -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) + +libgstosxaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -Wl,-framework -Wl,CoreAudio -Wl,-framework -Wl,AudioUnit -Wl,-framework -Wl,CoreServices +libgstosxaudio_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstosxaudiosink.h \ + gstosxaudioelement.h \ + gstosxringbuffer.h \ + gstosxaudiosrc.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/osxaudio/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/osxaudio/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstosxaudio.la: $(libgstosxaudio_la_OBJECTS) $(libgstosxaudio_la_DEPENDENCIES) $(EXTRA_libgstosxaudio_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstosxaudio_la_LINK) -rpath $(plugindir) $(libgstosxaudio_la_OBJECTS) $(libgstosxaudio_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxaudio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxaudioelement.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxaudiosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxaudiosrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxringbuffer.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstosxaudio_la-gstosxringbuffer.lo: gstosxringbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxringbuffer.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxringbuffer.Tpo -c -o libgstosxaudio_la-gstosxringbuffer.lo `test -f 'gstosxringbuffer.c' || echo '$(srcdir)/'`gstosxringbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxringbuffer.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxringbuffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxringbuffer.c' object='libgstosxaudio_la-gstosxringbuffer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxringbuffer.lo `test -f 'gstosxringbuffer.c' || echo '$(srcdir)/'`gstosxringbuffer.c + +libgstosxaudio_la-gstosxaudioelement.lo: gstosxaudioelement.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxaudioelement.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxaudioelement.Tpo -c -o libgstosxaudio_la-gstosxaudioelement.lo `test -f 'gstosxaudioelement.c' || echo '$(srcdir)/'`gstosxaudioelement.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxaudioelement.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxaudioelement.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxaudioelement.c' object='libgstosxaudio_la-gstosxaudioelement.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxaudioelement.lo `test -f 'gstosxaudioelement.c' || echo '$(srcdir)/'`gstosxaudioelement.c + +libgstosxaudio_la-gstosxaudiosink.lo: gstosxaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxaudiosink.Tpo -c -o libgstosxaudio_la-gstosxaudiosink.lo `test -f 'gstosxaudiosink.c' || echo '$(srcdir)/'`gstosxaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxaudiosink.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxaudiosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxaudiosink.c' object='libgstosxaudio_la-gstosxaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxaudiosink.lo `test -f 'gstosxaudiosink.c' || echo '$(srcdir)/'`gstosxaudiosink.c + +libgstosxaudio_la-gstosxaudiosrc.lo: gstosxaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxaudiosrc.Tpo -c -o libgstosxaudio_la-gstosxaudiosrc.lo `test -f 'gstosxaudiosrc.c' || echo '$(srcdir)/'`gstosxaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxaudiosrc.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxaudiosrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxaudiosrc.c' object='libgstosxaudio_la-gstosxaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxaudiosrc.lo `test -f 'gstosxaudiosrc.c' || echo '$(srcdir)/'`gstosxaudiosrc.c + +libgstosxaudio_la-gstosxaudio.lo: gstosxaudio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxaudio.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxaudio.Tpo -c -o libgstosxaudio_la-gstosxaudio.lo `test -f 'gstosxaudio.c' || echo '$(srcdir)/'`gstosxaudio.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxaudio.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxaudio.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxaudio.c' object='libgstosxaudio_la-gstosxaudio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxaudio.lo `test -f 'gstosxaudio.c' || echo '$(srcdir)/'`gstosxaudio.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/osxaudio/gstosxaudio.c b/sys/osxaudio/gstosxaudio.c new file mode 100644 index 0000000..1ddfce4 --- /dev/null +++ b/sys/osxaudio/gstosxaudio.c @@ -0,0 +1,53 @@ +/* + * GStreamer + * Copyright (C) 1999 Erik Walthinsen + * Copyright (C) 2007,2008 Pioneers of the Inevitable + * + * 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 "gstosxaudioelement.h" +#include "gstosxaudiosink.h" +#include "gstosxaudiosrc.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "osxaudiosink", GST_RANK_PRIMARY, + GST_TYPE_OSX_AUDIO_SINK)) { + return FALSE; + } + if (!gst_element_register (plugin, "osxaudiosrc", GST_RANK_PRIMARY, + GST_TYPE_OSX_AUDIO_SRC)) { + return FALSE; + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "osxaudio", + "OSX (Mac OS X) audio support for GStreamer", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/osxaudio/gstosxaudioelement.c b/sys/osxaudio/gstosxaudioelement.c new file mode 100644 index 0000000..a41f4b8 --- /dev/null +++ b/sys/osxaudio/gstosxaudioelement.c @@ -0,0 +1,92 @@ +/* + * GStreamer + * Copyright (C) 2006 Zaheer Abbas Merali + * Copyright (C) 2007 Pioneers of the Inevitable + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * The development of this code was made possible due to the involvement of + * Pioneers of the Inevitable, the creators of the Songbird Music player + * + */ + +#include +#include "gstosxaudioelement.h" + +static void +gst_osx_audio_element_class_init (GstOsxAudioElementInterface * klass); + +GType +gst_osx_audio_element_get_type (void) +{ + static GType gst_osxaudioelement_type = 0; + + if (!gst_osxaudioelement_type) { + static const GTypeInfo gst_osxaudioelement_info = { + sizeof (GstOsxAudioElementInterface), + (GBaseInitFunc) gst_osx_audio_element_class_init, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + NULL, + NULL + }; + + gst_osxaudioelement_type = g_type_register_static (G_TYPE_INTERFACE, + "GstOsxAudioElement", &gst_osxaudioelement_info, 0); + } + + return gst_osxaudioelement_type; +} + +static void +gst_osx_audio_element_class_init (GstOsxAudioElementInterface * klass) +{ + static gboolean initialized = FALSE; + + if (!initialized) { + initialized = TRUE; + } + + /* default virtual functions */ + klass->io_proc = NULL; +} diff --git a/sys/osxaudio/gstosxaudioelement.h b/sys/osxaudio/gstosxaudioelement.h new file mode 100644 index 0000000..b5d90c0 --- /dev/null +++ b/sys/osxaudio/gstosxaudioelement.h @@ -0,0 +1,84 @@ +/* + * GStreamer + * Copyright (C) 2006 Zaheer Abbas Merali + * Copyright (C) 2007 Pioneers of the Inevitable + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * 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_OSX_AUDIO_ELEMENT_H__ +#define __GST_OSX_AUDIO_ELEMENT_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_OSX_AUDIO_ELEMENT_TYPE \ + (gst_osx_audio_element_get_type()) +#define GST_OSX_AUDIO_ELEMENT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_OSX_AUDIO_ELEMENT_TYPE,GstOsxAudioElementInterface)) +#define GST_IS_OSX_AUDIO_ELEMENT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_OSX_AUDIO_ELEMENT_TYPE)) +#define GST_OSX_AUDIO_ELEMENT_GET_INTERFACE(inst) \ + (G_TYPE_INSTANCE_GET_INTERFACE((inst),GST_OSX_AUDIO_ELEMENT_TYPE,GstOsxAudioElementInterface)) + +typedef struct _GstOsxAudioElementInterface GstOsxAudioElementInterface; + +struct _GstOsxAudioElementInterface +{ + GTypeInterface parent; + + OSStatus (*io_proc) (void * userdata, + AudioUnitRenderActionFlags * ioActionFlags, + const AudioTimeStamp * inTimeStamp, + UInt32 inBusNumber, UInt32 inNumberFrames, + AudioBufferList * bufferList); +}; + +GType gst_osx_audio_element_get_type (void); + +G_END_DECLS + +#endif /* __GST_OSX_AUDIO_ELEMENT_H__ */ diff --git a/sys/osxaudio/gstosxaudiosink.c b/sys/osxaudio/gstosxaudiosink.c new file mode 100644 index 0000000..cd456e5 --- /dev/null +++ b/sys/osxaudio/gstosxaudiosink.c @@ -0,0 +1,348 @@ +/* + * GStreamer + * Copyright (C) 2005,2006 Zaheer Abbas Merali + * Copyright (C) 2007,2008 Pioneers of the Inevitable + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * 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-osxaudiosink + * + * This element renders raw audio samples using the CoreAudio api. + * + * + * Example pipelines + * |[ + * gst-launch filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! osxaudiosink + * ]| Play an Ogg/Vorbis file. + * + * + * Last reviewed on 2006-03-01 (0.10.4) + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include "gstosxaudiosink.h" +#include "gstosxaudioelement.h" + +GST_DEBUG_CATEGORY_STATIC (osx_audiosink_debug); +#define GST_CAT_DEFAULT osx_audiosink_debug + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, + ARG_DEVICE, + ARG_VOLUME +}; + +#define DEFAULT_VOLUME 1.0 + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "endianness = (int) {" G_STRINGIFY (G_BYTE_ORDER) " }, " + "signed = (boolean) { TRUE }, " + "width = (int) 32, " + "depth = (int) 32, " + "rate = (int) [1, MAX], " "channels = (int) [1, MAX]") + ); + +static void gst_osx_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_osx_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstRingBuffer *gst_osx_audio_sink_create_ringbuffer (GstBaseAudioSink * + sink); +static void gst_osx_audio_sink_osxelement_init (gpointer g_iface, + gpointer iface_data); +static void gst_osx_audio_sink_select_device (GstOsxAudioSink * osxsink); +static void gst_osx_audio_sink_set_volume (GstOsxAudioSink * sink); + +static OSStatus gst_osx_audio_sink_io_proc (GstOsxRingBuffer * buf, + AudioUnitRenderActionFlags * ioActionFlags, + const AudioTimeStamp * inTimeStamp, + UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList); + +static void +gst_osx_audio_sink_do_init (GType type) +{ + static const GInterfaceInfo osxelement_info = { + gst_osx_audio_sink_osxelement_init, + NULL, + NULL + }; + + GST_DEBUG_CATEGORY_INIT (osx_audiosink_debug, "osxaudiosink", 0, + "OSX Audio Sink"); + GST_DEBUG ("Adding static interface"); + g_type_add_interface_static (type, GST_OSX_AUDIO_ELEMENT_TYPE, + &osxelement_info); +} + +GST_BOILERPLATE_FULL (GstOsxAudioSink, gst_osx_audio_sink, GstBaseAudioSink, + GST_TYPE_BASE_AUDIO_SINK, gst_osx_audio_sink_do_init); + +static void +gst_osx_audio_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &sink_factory); + + gst_element_class_set_details_simple (element_class, "Audio Sink (OSX)", + "Sink/Audio", + "Output to a sound card in OS X", + "Zaheer Abbas Merali "); +} + +static void +gst_osx_audio_sink_class_init (GstOsxAudioSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + GstBaseAudioSinkClass *gstbaseaudiosink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_osx_audio_sink_set_property; + gobject_class->get_property = gst_osx_audio_sink_get_property; + + g_object_class_install_property (gobject_class, ARG_DEVICE, + g_param_spec_int ("device", "Device ID", "Device ID of output device", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, ARG_VOLUME, + g_param_spec_double ("volume", "Volume", "Volume of this stream", + 0, 1.0, 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbaseaudiosink_class->create_ringbuffer = + GST_DEBUG_FUNCPTR (gst_osx_audio_sink_create_ringbuffer); +} + +static void +gst_osx_audio_sink_init (GstOsxAudioSink * sink, GstOsxAudioSinkClass * gclass) +{ + GST_DEBUG ("Initialising object"); + + sink->device_id = kAudioDeviceUnknown; + sink->volume = DEFAULT_VOLUME; +} + +static void +gst_osx_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOsxAudioSink *sink = GST_OSX_AUDIO_SINK (object); + + switch (prop_id) { + case ARG_DEVICE: + sink->device_id = g_value_get_int (value); + break; + case ARG_VOLUME: + sink->volume = g_value_get_double (value); + gst_osx_audio_sink_set_volume (sink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_osx_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOsxAudioSink *sink = GST_OSX_AUDIO_SINK (object); + switch (prop_id) { + case ARG_DEVICE: + g_value_set_int (value, sink->device_id); + break; + case ARG_VOLUME: + g_value_set_double (value, sink->volume); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstRingBuffer * +gst_osx_audio_sink_create_ringbuffer (GstBaseAudioSink * sink) +{ + GstOsxAudioSink *osxsink; + GstOsxRingBuffer *ringbuffer; + + osxsink = GST_OSX_AUDIO_SINK (sink); + + gst_osx_audio_sink_select_device (osxsink); + + GST_DEBUG ("Creating ringbuffer"); + ringbuffer = g_object_new (GST_TYPE_OSX_RING_BUFFER, NULL); + GST_DEBUG ("osx sink 0x%p element 0x%p ioproc 0x%p", osxsink, + GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsink), + (void *) gst_osx_audio_sink_io_proc); + + gst_osx_audio_sink_set_volume (osxsink); + + ringbuffer->element = GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsink); + ringbuffer->device_id = osxsink->device_id; + + return GST_RING_BUFFER (ringbuffer); +} + +/* HALOutput AudioUnit will request fairly arbitrarily-sized chunks of data, + * not of a fixed size. So, we keep track of where in the current ringbuffer + * segment we are, and only advance the segment once we've read the whole + * thing */ +static OSStatus +gst_osx_audio_sink_io_proc (GstOsxRingBuffer * buf, + AudioUnitRenderActionFlags * ioActionFlags, + const AudioTimeStamp * inTimeStamp, + UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList) +{ + guint8 *readptr; + gint readseg; + gint len; + gint remaining = bufferList->mBuffers[0].mDataByteSize; + gint offset = 0; + + while (remaining) { + if (!gst_ring_buffer_prepare_read (GST_RING_BUFFER (buf), + &readseg, &readptr, &len)) + return 0; + + len -= buf->segoffset; + + if (len > remaining) + len = remaining; + + memcpy ((char *) bufferList->mBuffers[0].mData + offset, + readptr + buf->segoffset, len); + + buf->segoffset += len; + offset += len; + remaining -= len; + + if ((gint) buf->segoffset == GST_RING_BUFFER (buf)->spec.segsize) { + /* clear written samples */ + gst_ring_buffer_clear (GST_RING_BUFFER (buf), readseg); + + /* we wrote one segment */ + gst_ring_buffer_advance (GST_RING_BUFFER (buf), 1); + + buf->segoffset = 0; + } + } + return 0; +} + +static void +gst_osx_audio_sink_osxelement_init (gpointer g_iface, gpointer iface_data) +{ + GstOsxAudioElementInterface *iface = (GstOsxAudioElementInterface *) g_iface; + + iface->io_proc = (AURenderCallback) gst_osx_audio_sink_io_proc; +} + +static void +gst_osx_audio_sink_set_volume (GstOsxAudioSink * sink) +{ + if (!sink->audiounit) + return; + + AudioUnitSetParameter (sink->audiounit, kHALOutputParam_Volume, + kAudioUnitScope_Global, 0, (float) sink->volume, 0); +} + +static void +gst_osx_audio_sink_select_device (GstOsxAudioSink * osxsink) +{ + OSStatus status; + UInt32 propertySize; + + if (osxsink->device_id == kAudioDeviceUnknown) { + /* If no specific device has been selected by the user, then pick the + * default device */ + GST_DEBUG_OBJECT (osxsink, "Selecting device for OSXAudioSink"); + propertySize = sizeof (osxsink->device_id); + status = + AudioHardwareGetProperty (kAudioHardwarePropertyDefaultOutputDevice, + &propertySize, &osxsink->device_id); + + if (status) { + GST_WARNING_OBJECT (osxsink, + "AudioHardwareGetProperty returned %d", (int) status); + } else { + GST_DEBUG_OBJECT (osxsink, "AudioHardwareGetProperty returned 0"); + } + + if (osxsink->device_id == kAudioDeviceUnknown) { + GST_WARNING_OBJECT (osxsink, + "AudioHardwareGetProperty: device_id is kAudioDeviceUnknown"); + } + + GST_DEBUG_OBJECT (osxsink, "AudioHardwareGetProperty: device_id is %lu", + (long) osxsink->device_id); + } +} diff --git a/sys/osxaudio/gstosxaudiosink.h b/sys/osxaudio/gstosxaudiosink.h new file mode 100644 index 0000000..aac9719 --- /dev/null +++ b/sys/osxaudio/gstosxaudiosink.h @@ -0,0 +1,86 @@ +/* + * GStreamer + * Copyright (C) 2005-2006 Zaheer Abbas Merali + * Copyright (C) 2007 Pioneers of the Inevitable + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * 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_OSXAUDIOSINK_H__ +#define __GST_OSXAUDIOSINK_H__ + +#include +#include +#include "gstosxringbuffer.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSX_AUDIO_SINK \ + (gst_osx_audio_sink_get_type()) +#define GST_OSX_AUDIO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSX_AUDIO_SINK,GstOsxAudioSink)) +#define GST_OSX_AUDIO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSX_AUDIO_SINK,GstOsxAudioSinkClass)) + +typedef struct _GstOsxAudioSink GstOsxAudioSink; +typedef struct _GstOsxAudioSinkClass GstOsxAudioSinkClass; + +struct _GstOsxAudioSink +{ + GstBaseAudioSink sink; + + AudioDeviceID device_id; + AudioUnit audiounit; + double volume; +}; + +struct _GstOsxAudioSinkClass +{ + GstBaseAudioSinkClass parent_class; +}; + +GType gst_osx_audio_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_OSXAUDIOSINK_H__ */ diff --git a/sys/osxaudio/gstosxaudiosrc.c b/sys/osxaudio/gstosxaudiosrc.c new file mode 100644 index 0000000..7e9ad24 --- /dev/null +++ b/sys/osxaudio/gstosxaudiosrc.c @@ -0,0 +1,362 @@ +/* + * GStreamer + * Copyright (C) 2005,2006 Zaheer Abbas Merali + * Copyright (C) 2008 Pioneers of the Inevitable + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** + * SECTION:element-osxaudiosrc + * + * This element captures raw audio samples using the CoreAudio api. + * + * + * Example launch line + * |[ + * gst-launch osxaudiosrc ! wavenc ! filesink location=audio.wav + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include "gstosxaudiosrc.h" +#include "gstosxaudioelement.h" + +GST_DEBUG_CATEGORY_STATIC (osx_audiosrc_debug); +#define GST_CAT_DEFAULT osx_audiosrc_debug + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, + ARG_DEVICE +}; + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "endianness = (int) {" G_STRINGIFY (G_BYTE_ORDER) " }, " + "signed = (boolean) { TRUE }, " + "width = (int) 32, " + "depth = (int) 32, " + "rate = (int) [1, MAX], " "channels = (int) [1, MAX]") + ); + +static void gst_osx_audio_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_osx_audio_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_osx_audio_src_get_caps (GstBaseSrc * src); + +static GstRingBuffer *gst_osx_audio_src_create_ringbuffer (GstBaseAudioSrc * + src); +static void gst_osx_audio_src_osxelement_init (gpointer g_iface, + gpointer iface_data); +static OSStatus gst_osx_audio_src_io_proc (GstOsxRingBuffer * buf, + AudioUnitRenderActionFlags * ioActionFlags, + const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, + UInt32 inNumberFrames, AudioBufferList * bufferList); +static void gst_osx_audio_src_select_device (GstOsxAudioSrc * osxsrc); + +static void +gst_osx_audio_src_do_init (GType type) +{ + static const GInterfaceInfo osxelement_info = { + gst_osx_audio_src_osxelement_init, + NULL, + NULL + }; + + GST_DEBUG_CATEGORY_INIT (osx_audiosrc_debug, "osxaudiosrc", 0, + "OSX Audio Src"); + GST_DEBUG ("Adding static interface"); + g_type_add_interface_static (type, GST_OSX_AUDIO_ELEMENT_TYPE, + &osxelement_info); +} + +GST_BOILERPLATE_FULL (GstOsxAudioSrc, gst_osx_audio_src, GstBaseAudioSrc, + GST_TYPE_BASE_AUDIO_SRC, gst_osx_audio_src_do_init); + +static void +gst_osx_audio_src_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, &src_factory); + + gst_element_class_set_details_simple (element_class, "Audio Source (OSX)", + "Source/Audio", + "Input from a sound card in OS X", + "Zaheer Abbas Merali "); +} + +static void +gst_osx_audio_src_class_init (GstOsxAudioSrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSrcClass *gstbasesrc_class; + GstBaseAudioSrcClass *gstbaseaudiosrc_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_osx_audio_src_set_property; + gobject_class->get_property = gst_osx_audio_src_get_property; + + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_osx_audio_src_get_caps); + + g_object_class_install_property (gobject_class, ARG_DEVICE, + g_param_spec_int ("device", "Device ID", "Device ID of input device", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstbaseaudiosrc_class->create_ringbuffer = + GST_DEBUG_FUNCPTR (gst_osx_audio_src_create_ringbuffer); +} + +static void +gst_osx_audio_src_init (GstOsxAudioSrc * src, GstOsxAudioSrcClass * gclass) +{ + gst_base_src_set_live (GST_BASE_SRC (src), TRUE); + + src->device_id = kAudioDeviceUnknown; + src->deviceChannels = -1; +} + +static void +gst_osx_audio_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOsxAudioSrc *src = GST_OSX_AUDIO_SRC (object); + + switch (prop_id) { + case ARG_DEVICE: + src->device_id = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_osx_audio_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOsxAudioSrc *src = GST_OSX_AUDIO_SRC (object); + + switch (prop_id) { + case ARG_DEVICE: + g_value_set_int (value, src->device_id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_osx_audio_src_get_caps (GstBaseSrc * src) +{ + GstElementClass *gstelement_class; + GstOsxAudioSrc *osxsrc; + GstPadTemplate *pad_template; + GstCaps *caps; + gint min, max; + + gstelement_class = GST_ELEMENT_GET_CLASS (src); + osxsrc = GST_OSX_AUDIO_SRC (src); + + if (osxsrc->deviceChannels == -1) { + /* -1 means we don't know the number of channels yet. for now, return + * template caps. + */ + return NULL; + } + + max = osxsrc->deviceChannels; + if (max < 1) + max = 1; /* 0 channels means 1 channel? */ + + min = MIN (1, max); + + pad_template = gst_element_class_get_pad_template (gstelement_class, "src"); + g_return_val_if_fail (pad_template != NULL, NULL); + + caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); + + if (min == max) { + gst_caps_set_simple (caps, "channels", G_TYPE_INT, max, NULL); + } else { + gst_caps_set_simple (caps, "channels", GST_TYPE_INT_RANGE, min, max, NULL); + } + + return caps; +} + +static GstRingBuffer * +gst_osx_audio_src_create_ringbuffer (GstBaseAudioSrc * src) +{ + GstOsxAudioSrc *osxsrc; + GstOsxRingBuffer *ringbuffer; + + osxsrc = GST_OSX_AUDIO_SRC (src); + + gst_osx_audio_src_select_device (osxsrc); + + GST_DEBUG ("Creating ringbuffer"); + ringbuffer = g_object_new (GST_TYPE_OSX_RING_BUFFER, NULL); + GST_DEBUG ("osx src 0x%p element 0x%p ioproc 0x%p", osxsrc, + GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsrc), + (void *) gst_osx_audio_src_io_proc); + + ringbuffer->element = GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsrc); + ringbuffer->is_src = TRUE; + ringbuffer->device_id = osxsrc->device_id; + + return GST_RING_BUFFER (ringbuffer); +} + +static OSStatus +gst_osx_audio_src_io_proc (GstOsxRingBuffer * buf, + AudioUnitRenderActionFlags * ioActionFlags, + const AudioTimeStamp * inTimeStamp, + UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList) +{ + OSStatus status; + guint8 *writeptr; + gint writeseg; + gint len; + gint remaining; + gint offset = 0; + + status = AudioUnitRender (buf->audiounit, ioActionFlags, inTimeStamp, + inBusNumber, inNumberFrames, buf->recBufferList); + + if (status) { + GST_WARNING_OBJECT (buf, "AudioUnitRender returned %d", (int) status); + return status; + } + + remaining = buf->recBufferList->mBuffers[0].mDataByteSize; + + while (remaining) { + if (!gst_ring_buffer_prepare_read (GST_RING_BUFFER (buf), + &writeseg, &writeptr, &len)) + return 0; + + len -= buf->segoffset; + + if (len > remaining) + len = remaining; + + memcpy (writeptr + buf->segoffset, + (char *) buf->recBufferList->mBuffers[0].mData + offset, len); + + buf->segoffset += len; + offset += len; + remaining -= len; + + if ((gint) buf->segoffset == GST_RING_BUFFER (buf)->spec.segsize) { + /* we wrote one segment */ + gst_ring_buffer_advance (GST_RING_BUFFER (buf), 1); + + buf->segoffset = 0; + } + } + return 0; +} + +static void +gst_osx_audio_src_osxelement_init (gpointer g_iface, gpointer iface_data) +{ + GstOsxAudioElementInterface *iface = (GstOsxAudioElementInterface *) g_iface; + + iface->io_proc = (AURenderCallback) gst_osx_audio_src_io_proc; +} + +static void +gst_osx_audio_src_select_device (GstOsxAudioSrc * osxsrc) +{ + OSStatus status; + UInt32 propertySize; + + if (osxsrc->device_id == kAudioDeviceUnknown) { + /* If no specific device has been selected by the user, then pick the + * default device */ + GST_DEBUG_OBJECT (osxsrc, "Selecting device for OSXAudioSrc"); + propertySize = sizeof (osxsrc->device_id); + status = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultInputDevice, + &propertySize, &osxsrc->device_id); + + if (status) { + GST_WARNING_OBJECT (osxsrc, + "AudioHardwareGetProperty returned %d", (int) status); + } else { + GST_DEBUG_OBJECT (osxsrc, "AudioHardwareGetProperty returned 0"); + } + + if (osxsrc->device_id == kAudioDeviceUnknown) { + GST_WARNING_OBJECT (osxsrc, + "AudioHardwareGetProperty: device_id is kAudioDeviceUnknown"); + } + + GST_DEBUG_OBJECT (osxsrc, "AudioHardwareGetProperty: device_id is %lu", + (long) osxsrc->device_id); + } +} diff --git a/sys/osxaudio/gstosxaudiosrc.h b/sys/osxaudio/gstosxaudiosrc.h new file mode 100644 index 0000000..a812d9e --- /dev/null +++ b/sys/osxaudio/gstosxaudiosrc.h @@ -0,0 +1,82 @@ +/* + * GStreamer + * Copyright (C) 2005-2006 Zaheer Abbas Merali + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_OSXAUDIOSRC_H__ +#define __GST_OSXAUDIOSRC_H__ + +#include +#include +#include "gstosxringbuffer.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSX_AUDIO_SRC \ + (gst_osx_audio_src_get_type()) +#define GST_OSX_AUDIO_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSX_AUDIO_SRC,GstOsxAudioSrc)) +#define GST_OSX_AUDIO_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSX_AUDIO_SRC,GstOsxAudioSrcClass)) + +typedef struct _GstOsxAudioSrc GstOsxAudioSrc; +typedef struct _GstOsxAudioSrcClass GstOsxAudioSrcClass; + +struct _GstOsxAudioSrc +{ + GstBaseAudioSrc src; + + AudioDeviceID device_id; + + /* actual number of channels reported by input device */ + int deviceChannels; +}; + +struct _GstOsxAudioSrcClass +{ + GstBaseAudioSrcClass parent_class; +}; + +GType gst_osx_audio_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_OSXAUDIOSRC_H__ */ diff --git a/sys/osxaudio/gstosxringbuffer.c b/sys/osxaudio/gstosxringbuffer.c new file mode 100644 index 0000000..095efc1 --- /dev/null +++ b/sys/osxaudio/gstosxringbuffer.c @@ -0,0 +1,689 @@ +/* + * GStreamer + * Copyright (C) 2006 Zaheer Abbas Merali + * Copyright (C) 2008 Pioneers of the Inevitable + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include "gstosxringbuffer.h" +#include "gstosxaudiosink.h" +#include "gstosxaudiosrc.h" + +GST_DEBUG_CATEGORY_STATIC (osx_audio_debug); +#define GST_CAT_DEFAULT osx_audio_debug + +static void gst_osx_ring_buffer_dispose (GObject * object); +static void gst_osx_ring_buffer_finalize (GObject * object); +static gboolean gst_osx_ring_buffer_open_device (GstRingBuffer * buf); +static gboolean gst_osx_ring_buffer_close_device (GstRingBuffer * buf); + +static gboolean gst_osx_ring_buffer_acquire (GstRingBuffer * buf, + GstRingBufferSpec * spec); +static gboolean gst_osx_ring_buffer_release (GstRingBuffer * buf); + +static gboolean gst_osx_ring_buffer_start (GstRingBuffer * buf); +static gboolean gst_osx_ring_buffer_pause (GstRingBuffer * buf); +static gboolean gst_osx_ring_buffer_stop (GstRingBuffer * buf); +static guint gst_osx_ring_buffer_delay (GstRingBuffer * buf); +static GstRingBufferClass *ring_parent_class = NULL; + +static OSStatus gst_osx_ring_buffer_render_notify (GstOsxRingBuffer * osxbuf, + AudioUnitRenderActionFlags * ioActionFlags, + const AudioTimeStamp * inTimeStamp, unsigned int inBusNumber, + unsigned int inNumberFrames, AudioBufferList * ioData); + +static AudioBufferList *buffer_list_alloc (int channels, int size); +static void buffer_list_free (AudioBufferList * list); + +static void +gst_osx_ring_buffer_do_init (GType type) +{ + GST_DEBUG_CATEGORY_INIT (osx_audio_debug, "osxaudio", 0, + "OSX Audio Elements"); +} + +GST_BOILERPLATE_FULL (GstOsxRingBuffer, gst_osx_ring_buffer, GstRingBuffer, + GST_TYPE_RING_BUFFER, gst_osx_ring_buffer_do_init); + +static void +gst_osx_ring_buffer_base_init (gpointer g_class) +{ + /* Nothing to do right now */ +} + +static void +gst_osx_ring_buffer_class_init (GstOsxRingBufferClass * klass) +{ + GObjectClass *gobject_class; + GstObjectClass *gstobject_class; + GstRingBufferClass *gstringbuffer_class; + + gobject_class = (GObjectClass *) klass; + gstobject_class = (GstObjectClass *) klass; + gstringbuffer_class = (GstRingBufferClass *) klass; + + ring_parent_class = g_type_class_peek_parent (klass); + + gobject_class->dispose = gst_osx_ring_buffer_dispose; + gobject_class->finalize = gst_osx_ring_buffer_finalize; + + gstringbuffer_class->open_device = + GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_open_device); + gstringbuffer_class->close_device = + GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_close_device); + gstringbuffer_class->acquire = + GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_acquire); + gstringbuffer_class->release = + GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_release); + gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_start); + gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_pause); + gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_start); + gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_stop); + + gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_delay); + + GST_DEBUG ("osx ring buffer class init"); +} + +static void +gst_osx_ring_buffer_init (GstOsxRingBuffer * ringbuffer, + GstOsxRingBufferClass * g_class) +{ + /* Nothing to do right now */ +} + +static void +gst_osx_ring_buffer_dispose (GObject * object) +{ + G_OBJECT_CLASS (ring_parent_class)->dispose (object); +} + +static void +gst_osx_ring_buffer_finalize (GObject * object) +{ + G_OBJECT_CLASS (ring_parent_class)->finalize (object); +} + +static AudioUnit +gst_osx_ring_buffer_create_audio_unit (GstOsxRingBuffer * osxbuf, + gboolean input, AudioDeviceID device_id) +{ + ComponentDescription desc; + Component comp; + OSStatus status; + AudioUnit unit; + UInt32 enableIO; + + /* Create a HALOutput AudioUnit. + * This is the lowest-level output API that is actually sensibly usable + * (the lower level ones require that you do channel-remapping yourself, + * and the CoreAudio channel mapping is sufficiently complex that doing + * so would be very difficult) + * + * Note that for input we request an output unit even though we will do + * input with it: http://developer.apple.com/technotes/tn2002/tn2091.html + */ + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_HALOutput; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + + comp = FindNextComponent (NULL, &desc); + if (comp == NULL) { + GST_WARNING_OBJECT (osxbuf, "Couldn't find HALOutput component"); + return NULL; + } + + status = OpenAComponent (comp, &unit); + + if (status) { + GST_WARNING_OBJECT (osxbuf, "Couldn't open HALOutput component"); + return NULL; + } + + if (input) { + /* enable input */ + enableIO = 1; + status = AudioUnitSetProperty (unit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, /* 1 = input element */ + &enableIO, sizeof (enableIO)); + + if (status) { + CloseComponent (unit); + GST_WARNING_OBJECT (osxbuf, "Failed to enable input: %lx", + (gulong) status); + return NULL; + } + + /* disable output */ + enableIO = 0; + status = AudioUnitSetProperty (unit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, /* 0 = output element */ + &enableIO, sizeof (enableIO)); + + if (status) { + CloseComponent (unit); + GST_WARNING_OBJECT (osxbuf, "Failed to disable output: %lx", + (gulong) status); + return NULL; + } + } + + /* Specify which device we're using. */ + GST_DEBUG_OBJECT (osxbuf, "Setting device to %d", (int) device_id); + status = AudioUnitSetProperty (unit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, /* N/A for global */ + &device_id, sizeof (AudioDeviceID)); + + if (status) { + CloseComponent (unit); + GST_WARNING_OBJECT (osxbuf, "Failed to set device: %lx", (gulong) status); + return NULL; + } + + GST_DEBUG_OBJECT (osxbuf, "Create HALOutput AudioUnit: %p", unit); + + return unit; +} + +static gboolean +gst_osx_ring_buffer_open_device (GstRingBuffer * buf) +{ + GstOsxRingBuffer *osxbuf; + GstOsxAudioSink *sink; + GstOsxAudioSrc *src; + AudioStreamBasicDescription asbd_in; + OSStatus status; + UInt32 propertySize; + + osxbuf = GST_OSX_RING_BUFFER (buf); + sink = NULL; + src = NULL; + + osxbuf->audiounit = gst_osx_ring_buffer_create_audio_unit (osxbuf, + osxbuf->is_src, osxbuf->device_id); + + if (osxbuf->is_src) { + src = GST_OSX_AUDIO_SRC (GST_OBJECT_PARENT (buf)); + + propertySize = sizeof (asbd_in); + status = AudioUnitGetProperty (osxbuf->audiounit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, 1, &asbd_in, &propertySize); + + if (status) { + CloseComponent (osxbuf->audiounit); + osxbuf->audiounit = NULL; + GST_WARNING_OBJECT (osxbuf, "Unable to obtain device properties: %lx", + (gulong) status); + return FALSE; + } + + src->deviceChannels = asbd_in.mChannelsPerFrame; + } else { + sink = GST_OSX_AUDIO_SINK (GST_OBJECT_PARENT (buf)); + + /* needed for the sink's volume control */ + sink->audiounit = osxbuf->audiounit; + } + + return TRUE; +} + +static gboolean +gst_osx_ring_buffer_close_device (GstRingBuffer * buf) +{ + GstOsxRingBuffer *osxbuf; + osxbuf = GST_OSX_RING_BUFFER (buf); + + CloseComponent (osxbuf->audiounit); + osxbuf->audiounit = NULL; + + return TRUE; +} + +static AudioChannelLabel +gst_audio_channel_position_to_coreaudio_channel_label (GstAudioChannelPosition + position, int channel) +{ + switch (position) { + case GST_AUDIO_CHANNEL_POSITION_NONE: + return kAudioChannelLabel_Discrete_0 | channel; + case GST_AUDIO_CHANNEL_POSITION_FRONT_MONO: + return kAudioChannelLabel_Mono; + case GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT: + return kAudioChannelLabel_Left; + case GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT: + return kAudioChannelLabel_Right; + case GST_AUDIO_CHANNEL_POSITION_REAR_CENTER: + return kAudioChannelLabel_CenterSurround; + case GST_AUDIO_CHANNEL_POSITION_REAR_LEFT: + return kAudioChannelLabel_LeftSurround; + case GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT: + return kAudioChannelLabel_RightSurround; + case GST_AUDIO_CHANNEL_POSITION_LFE: + return kAudioChannelLabel_LFEScreen; + case GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER: + return kAudioChannelLabel_Center; + case GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: + return kAudioChannelLabel_Center; // ??? + case GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: + return kAudioChannelLabel_Center; // ??? + case GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT: + return kAudioChannelLabel_LeftSurroundDirect; + case GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT: + return kAudioChannelLabel_RightSurroundDirect; + default: + return kAudioChannelLabel_Unknown; + } +} + +static gboolean +gst_osx_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec) +{ + /* Configure the output stream and allocate ringbuffer memory */ + GstOsxRingBuffer *osxbuf; + AudioStreamBasicDescription format; + AudioChannelLayout *layout = NULL; + OSStatus status; + UInt32 propertySize; + int layoutSize; + int element; + int i; + AudioUnitScope scope; + gboolean ret = FALSE; + GstStructure *structure; + GstAudioChannelPosition *positions; + UInt32 frameSize; + + osxbuf = GST_OSX_RING_BUFFER (buf); + + /* Fill out the audio description we're going to be using */ + format.mFormatID = kAudioFormatLinearPCM; + format.mSampleRate = (double) spec->rate; + format.mChannelsPerFrame = spec->channels; + format.mFormatFlags = kAudioFormatFlagsNativeFloatPacked; + format.mBytesPerFrame = spec->channels * sizeof (float); + format.mBitsPerChannel = sizeof (float) * 8; + format.mBytesPerPacket = spec->channels * sizeof (float); + format.mFramesPerPacket = 1; + format.mReserved = 0; + + /* Describe channels */ + layoutSize = sizeof (AudioChannelLayout) + + spec->channels * sizeof (AudioChannelDescription); + layout = g_malloc (layoutSize); + + structure = gst_caps_get_structure (spec->caps, 0); + positions = gst_audio_get_channel_positions (structure); + + layout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions; + layout->mChannelBitmap = 0; /* Not used */ + layout->mNumberChannelDescriptions = spec->channels; + for (i = 0; i < spec->channels; i++) { + if (positions) { + layout->mChannelDescriptions[i].mChannelLabel = + gst_audio_channel_position_to_coreaudio_channel_label (positions[i], + i); + } else { + /* Discrete channel numbers are ORed into this */ + layout->mChannelDescriptions[i].mChannelLabel = + kAudioChannelLabel_Discrete_0 | i; + } + + /* Others unused */ + layout->mChannelDescriptions[i].mChannelFlags = 0; + layout->mChannelDescriptions[i].mCoordinates[0] = 0.f; + layout->mChannelDescriptions[i].mCoordinates[1] = 0.f; + layout->mChannelDescriptions[i].mCoordinates[2] = 0.f; + } + + if (positions) { + g_free (positions); + positions = NULL; + } + + GST_LOG_OBJECT (osxbuf, "Format: %x, %f, %u, %x, %d, %d, %d, %d, %d", + (unsigned int) format.mFormatID, + format.mSampleRate, + (unsigned int) format.mChannelsPerFrame, + (unsigned int) format.mFormatFlags, + (unsigned int) format.mBytesPerFrame, + (unsigned int) format.mBitsPerChannel, + (unsigned int) format.mBytesPerPacket, + (unsigned int) format.mFramesPerPacket, (unsigned int) format.mReserved); + + GST_DEBUG_OBJECT (osxbuf, "Setting format for AudioUnit"); + + scope = osxbuf->is_src ? kAudioUnitScope_Output : kAudioUnitScope_Input; + element = osxbuf->is_src ? 1 : 0; + + propertySize = sizeof (format); + status = AudioUnitSetProperty (osxbuf->audiounit, + kAudioUnitProperty_StreamFormat, scope, element, &format, propertySize); + + if (status) { + GST_WARNING_OBJECT (osxbuf, "Failed to set audio description: %lx", + (gulong) status); + goto done; + } + + status = AudioUnitSetProperty (osxbuf->audiounit, + kAudioUnitProperty_AudioChannelLayout, + scope, element, layout, layoutSize); + if (status) { + GST_WARNING_OBJECT (osxbuf, "Failed to set output channel layout: %lx", + (gulong) status); + goto done; + } + + spec->segsize = + (spec->latency_time * spec->rate / G_USEC_PER_SEC) * + spec->bytes_per_sample; + spec->segtotal = spec->buffer_time / spec->latency_time; + + /* create AudioBufferList needed for recording */ + if (osxbuf->is_src) { + propertySize = sizeof (frameSize); + status = AudioUnitGetProperty (osxbuf->audiounit, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global, 0, /* N/A for global */ + &frameSize, &propertySize); + + if (status) { + GST_WARNING_OBJECT (osxbuf, "Failed to get frame size: %lx", + (gulong) status); + goto done; + } + + osxbuf->recBufferList = buffer_list_alloc (format.mChannelsPerFrame, + frameSize * format.mBytesPerFrame); + } + + buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize); + memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data)); + + osxbuf->segoffset = 0; + + status = AudioUnitInitialize (osxbuf->audiounit); + if (status) { + gst_buffer_unref (buf->data); + buf->data = NULL; + + if (osxbuf->recBufferList) { + buffer_list_free (osxbuf->recBufferList); + osxbuf->recBufferList = NULL; + } + + GST_WARNING_OBJECT (osxbuf, + "Failed to initialise AudioUnit: %d", (int) status); + goto done; + } + + GST_DEBUG_OBJECT (osxbuf, "osx ring buffer acquired"); + + ret = TRUE; + +done: + g_free (layout); + return ret; +} + +static gboolean +gst_osx_ring_buffer_release (GstRingBuffer * buf) +{ + GstOsxRingBuffer *osxbuf; + + osxbuf = GST_OSX_RING_BUFFER (buf); + + AudioUnitUninitialize (osxbuf->audiounit); + + gst_buffer_unref (buf->data); + buf->data = NULL; + + if (osxbuf->recBufferList) { + buffer_list_free (osxbuf->recBufferList); + osxbuf->recBufferList = NULL; + } + + return TRUE; +} + +static void +gst_osx_ring_buffer_remove_render_callback (GstOsxRingBuffer * osxbuf) +{ + AURenderCallbackStruct input; + OSStatus status; + + /* Deactivate the render callback by calling SetRenderCallback with a NULL + * inputProc. + */ + input.inputProc = NULL; + input.inputProcRefCon = NULL; + + status = AudioUnitSetProperty (osxbuf->audiounit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, /* N/A for global */ + &input, sizeof (input)); + + if (status) { + GST_WARNING_OBJECT (osxbuf, "Failed to remove render callback"); + } + + /* Remove the RenderNotify too */ + status = AudioUnitRemoveRenderNotify (osxbuf->audiounit, + (AURenderCallback) gst_osx_ring_buffer_render_notify, osxbuf); + + if (status) { + GST_WARNING_OBJECT (osxbuf, "Failed to remove render notify callback"); + } + + /* We're deactivated.. */ + osxbuf->io_proc_needs_deactivation = FALSE; + osxbuf->io_proc_active = FALSE; +} + +static OSStatus +gst_osx_ring_buffer_render_notify (GstOsxRingBuffer * osxbuf, + AudioUnitRenderActionFlags * ioActionFlags, + const AudioTimeStamp * inTimeStamp, + unsigned int inBusNumber, + unsigned int inNumberFrames, AudioBufferList * ioData) +{ + /* Before rendering a frame, we get the PreRender notification. + * Here, we detach the RenderCallback if we've been paused. + * + * This is necessary (rather than just directly detaching it) to work + * around some thread-safety issues in CoreAudio + */ + if ((*ioActionFlags) & kAudioUnitRenderAction_PreRender) { + if (osxbuf->io_proc_needs_deactivation) { + gst_osx_ring_buffer_remove_render_callback (osxbuf); + } + } + + return noErr; +} + +static gboolean +gst_osx_ring_buffer_start (GstRingBuffer * buf) +{ + OSStatus status; + GstOsxRingBuffer *osxbuf; + AURenderCallbackStruct input; + AudioUnitPropertyID callback_type; + + osxbuf = GST_OSX_RING_BUFFER (buf); + + GST_DEBUG ("osx ring buffer start ioproc: 0x%p device_id %lu", + osxbuf->element->io_proc, (gulong) osxbuf->device_id); + if (!osxbuf->io_proc_active) { + callback_type = osxbuf->is_src ? + kAudioOutputUnitProperty_SetInputCallback : + kAudioUnitProperty_SetRenderCallback; + + input.inputProc = (AURenderCallback) osxbuf->element->io_proc; + input.inputProcRefCon = osxbuf; + + status = AudioUnitSetProperty (osxbuf->audiounit, callback_type, kAudioUnitScope_Global, 0, /* N/A for global */ + &input, sizeof (input)); + + if (status) { + GST_WARNING ("AudioUnitSetProperty returned %d", (int) status); + return FALSE; + } + // ### does it make sense to do this notify stuff for input mode? + status = AudioUnitAddRenderNotify (osxbuf->audiounit, + (AURenderCallback) gst_osx_ring_buffer_render_notify, osxbuf); + + if (status) { + GST_WARNING ("AudioUnitAddRenderNotify returned %d", (int) status); + return FALSE; + } + + osxbuf->io_proc_active = TRUE; + } + + osxbuf->io_proc_needs_deactivation = FALSE; + + status = AudioOutputUnitStart (osxbuf->audiounit); + if (status) { + GST_WARNING ("AudioOutputUnitStart returned %d", (int) status); + return FALSE; + } + return TRUE; +} + +// ### +static gboolean +gst_osx_ring_buffer_pause (GstRingBuffer * buf) +{ + GstOsxRingBuffer *osxbuf = GST_OSX_RING_BUFFER (buf); + + GST_DEBUG ("osx ring buffer pause ioproc: 0x%p device_id %lu", + osxbuf->element->io_proc, (gulong) osxbuf->device_id); + if (osxbuf->io_proc_active) { + /* CoreAudio isn't threadsafe enough to do this here; we must deactivate + * the render callback elsewhere. See: + * http://lists.apple.com/archives/Coreaudio-api/2006/Mar/msg00010.html + */ + osxbuf->io_proc_needs_deactivation = TRUE; + } + return TRUE; +} + +// ### +static gboolean +gst_osx_ring_buffer_stop (GstRingBuffer * buf) +{ + OSErr status; + GstOsxRingBuffer *osxbuf; + + osxbuf = GST_OSX_RING_BUFFER (buf); + + GST_DEBUG ("osx ring buffer stop ioproc: 0x%p device_id %lu", + osxbuf->element->io_proc, (gulong) osxbuf->device_id); + + status = AudioOutputUnitStop (osxbuf->audiounit); + if (status) + GST_WARNING ("AudioOutputUnitStop returned %d", (int) status); + + // ###: why is it okay to directly remove from here but not from pause() ? + if (osxbuf->io_proc_active) { + gst_osx_ring_buffer_remove_render_callback (osxbuf); + } + return TRUE; +} + +static guint +gst_osx_ring_buffer_delay (GstRingBuffer * buf) +{ + double latency; + UInt32 size = sizeof (double); + GstOsxRingBuffer *osxbuf; + OSStatus status; + guint samples; + + osxbuf = GST_OSX_RING_BUFFER (buf); + + status = AudioUnitGetProperty (osxbuf->audiounit, kAudioUnitProperty_Latency, kAudioUnitScope_Global, 0, /* N/A for global */ + &latency, &size); + + if (status) { + GST_WARNING_OBJECT (buf, "Failed to get latency: %d", (int) status); + return 0; + } + + samples = latency * GST_RING_BUFFER (buf)->spec.rate; + GST_DEBUG_OBJECT (buf, "Got latency: %f seconds -> %d samples", latency, + samples); + return samples; +} + +static AudioBufferList * +buffer_list_alloc (int channels, int size) +{ + AudioBufferList *list; + int total_size; + int n; + + total_size = sizeof (AudioBufferList) + 1 * sizeof (AudioBuffer); + list = (AudioBufferList *) g_malloc (total_size); + + list->mNumberBuffers = 1; + for (n = 0; n < (int) list->mNumberBuffers; ++n) { + list->mBuffers[n].mNumberChannels = channels; + list->mBuffers[n].mDataByteSize = size; + list->mBuffers[n].mData = g_malloc (size); + } + + return list; +} + +static void +buffer_list_free (AudioBufferList * list) +{ + int n; + + for (n = 0; n < (int) list->mNumberBuffers; ++n) { + if (list->mBuffers[n].mData) + g_free (list->mBuffers[n].mData); + } + + g_free (list); +} diff --git a/sys/osxaudio/gstosxringbuffer.h b/sys/osxaudio/gstosxringbuffer.h new file mode 100644 index 0000000..5e6dbe4 --- /dev/null +++ b/sys/osxaudio/gstosxringbuffer.h @@ -0,0 +1,94 @@ +/* + * GStreamer + * Copyright (C) 2006 Zaheer Abbas Merali + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_OSX_RING_BUFFER_H__ +#define __GST_OSX_RING_BUFFER_H__ + +#include +#include +#include +#include "gstosxaudioelement.h" + +G_BEGIN_DECLS + +#define GST_TYPE_OSX_RING_BUFFER \ + (gst_osx_ring_buffer_get_type()) +#define GST_OSX_RING_BUFFER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSX_RING_BUFFER,GstOsxRingBuffer)) +#define GST_OSX_RING_BUFFER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSX_RING_BUFFER,GstOsxRingBufferClass)) +#define GST_OSX_RING_BUFFER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_OSX_RING_BUFFER,GstOsxRingBufferClass)) +#define GST_IS_OSX_RING_BUFFER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSX_RING_BUFFER)) +#define GST_IS_OSX_RING_BUFFER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSX_RING_BUFFER)) + +typedef struct _GstOsxRingBuffer GstOsxRingBuffer; +typedef struct _GstOsxRingBufferClass GstOsxRingBufferClass; + +struct _GstOsxRingBuffer +{ + GstRingBuffer object; + + gboolean is_src; + AudioUnit audiounit; + AudioDeviceID device_id; + gboolean io_proc_active; + gboolean io_proc_needs_deactivation; + guint buffer_len; + guint segoffset; + AudioBufferList * recBufferList; + GstOsxAudioElementInterface * element; +}; + +struct _GstOsxRingBufferClass +{ + GstRingBufferClass parent_class; +}; + +GType gst_osx_ring_buffer_get_type (void); + +G_END_DECLS + +#endif /* __GST_OSX_RING_BUFFER_H__ */ diff --git a/sys/osxvideo/Makefile.am b/sys/osxvideo/Makefile.am new file mode 100644 index 0000000..8893c2e --- /dev/null +++ b/sys/osxvideo/Makefile.am @@ -0,0 +1,19 @@ + +plugin_LTLIBRARIES = libgstosxvideosink.la + +libgstosxvideosink_la_SOURCES = osxvideosink.m cocoawindow.m +libgstosxvideosink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) +libgstosxvideosink_la_LIBADD = \ + $(GST_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-$(GST_MAJORMINOR) \ + -lgstinterfaces-$(GST_MAJORMINOR) + +libgstosxvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -Wl,-framework -Wl,Cocoa -Wl,-framework -Wl,QuickTime -Wl,-framework -Wl,OpenGL +libgstosxvideosink_la_LIBTOOLFLAGS = --tag=disable-static + +AM_OBJCFLAGS=$(CFLAGS) $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) -Wno-aggregate-return + +noinst_HEADERS = osxvideosink.h cocoawindow.h diff --git a/sys/osxvideo/Makefile.in b/sys/osxvideo/Makefile.in new file mode 100644 index 0000000..fe62cb4 --- /dev/null +++ b/sys/osxvideo/Makefile.in @@ -0,0 +1,824 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = sys/osxvideo +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstosxvideosink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libgstosxvideosink_la_OBJECTS = \ + libgstosxvideosink_la-osxvideosink.lo \ + libgstosxvideosink_la-cocoawindow.lo +libgstosxvideosink_la_OBJECTS = $(am_libgstosxvideosink_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstosxvideosink_la_LINK = $(LIBTOOL) $(AM_V_lt) \ + $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) \ + $(libgstosxvideosink_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +OBJCCOMPILE = $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) +LTOBJCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_OBJCFLAGS) $(OBJCFLAGS) +AM_V_OBJC = $(am__v_OBJC_@AM_V@) +am__v_OBJC_ = $(am__v_OBJC_@AM_DEFAULT_V@) +am__v_OBJC_0 = @echo " OBJC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +OBJCLD = $(OBJC) +OBJCLINK = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_OBJCLD = $(am__v_OBJCLD_@AM_V@) +am__v_OBJCLD_ = $(am__v_OBJCLD_@AM_DEFAULT_V@) +am__v_OBJCLD_0 = @echo " OBJCLD" $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstosxvideosink_la_SOURCES) +DIST_SOURCES = $(libgstosxvideosink_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstosxvideosink.la +libgstosxvideosink_la_SOURCES = osxvideosink.m cocoawindow.m +libgstosxvideosink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) + +libgstosxvideosink_la_LIBADD = \ + $(GST_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-$(GST_MAJORMINOR) \ + -lgstinterfaces-$(GST_MAJORMINOR) + +libgstosxvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -Wl,-framework -Wl,Cocoa -Wl,-framework -Wl,QuickTime -Wl,-framework -Wl,OpenGL +libgstosxvideosink_la_LIBTOOLFLAGS = --tag=disable-static +AM_OBJCFLAGS = $(CFLAGS) $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) -Wno-aggregate-return +noinst_HEADERS = osxvideosink.h cocoawindow.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .lo .m .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/osxvideo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/osxvideo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstosxvideosink.la: $(libgstosxvideosink_la_OBJECTS) $(libgstosxvideosink_la_DEPENDENCIES) $(EXTRA_libgstosxvideosink_la_DEPENDENCIES) + $(AM_V_OBJCLD)$(libgstosxvideosink_la_LINK) -rpath $(plugindir) $(libgstosxvideosink_la_OBJECTS) $(libgstosxvideosink_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxvideosink_la-cocoawindow.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxvideosink_la-osxvideosink.Plo@am__quote@ + +.m.o: +@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(OBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(OBJCCOMPILE) -c -o $@ $< + +.m.obj: +@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(OBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(OBJCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.m.lo: +@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LTOBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(LTOBJCCOMPILE) -c -o $@ $< + +libgstosxvideosink_la-osxvideosink.lo: osxvideosink.m +@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) -MT libgstosxvideosink_la-osxvideosink.lo -MD -MP -MF $(DEPDIR)/libgstosxvideosink_la-osxvideosink.Tpo -c -o libgstosxvideosink_la-osxvideosink.lo `test -f 'osxvideosink.m' || echo '$(srcdir)/'`osxvideosink.m +@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxvideosink_la-osxvideosink.Tpo $(DEPDIR)/libgstosxvideosink_la-osxvideosink.Plo +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='osxvideosink.m' object='libgstosxvideosink_la-osxvideosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstosxvideosink_la-osxvideosink.lo `test -f 'osxvideosink.m' || echo '$(srcdir)/'`osxvideosink.m + +libgstosxvideosink_la-cocoawindow.lo: cocoawindow.m +@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) -MT libgstosxvideosink_la-cocoawindow.lo -MD -MP -MF $(DEPDIR)/libgstosxvideosink_la-cocoawindow.Tpo -c -o libgstosxvideosink_la-cocoawindow.lo `test -f 'cocoawindow.m' || echo '$(srcdir)/'`cocoawindow.m +@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxvideosink_la-cocoawindow.Tpo $(DEPDIR)/libgstosxvideosink_la-cocoawindow.Plo +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='cocoawindow.m' object='libgstosxvideosink_la-cocoawindow.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstosxvideosink_la-cocoawindow.lo `test -f 'cocoawindow.m' || echo '$(srcdir)/'`cocoawindow.m + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/osxvideo/cocoawindow.h b/sys/osxvideo/cocoawindow.h new file mode 100644 index 0000000..7324cc7 --- /dev/null +++ b/sys/osxvideo/cocoawindow.h @@ -0,0 +1,74 @@ +/* GStreamer + * Copyright (C) 2004 Zaheer Abbas Merali + * Copyright (C) 2007 Pioneers of the Inevitable + * + * 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 + * + */ + +/* inspiration gained from looking at source of osx video out of xine and vlc + * and is reflected in the code + */ + +#import +#import +#import + +struct _GstOSXImage; + +@interface GstGLView : NSOpenGLView +{ + int i_effect; + unsigned int pi_texture; + float f_x; + float f_y; + int initDone; + char* data; + int width, height; + BOOL fullscreen; + NSOpenGLContext* fullScreenContext; + NSOpenGLContext* actualContext; +} +- (void) drawQuad; +- (void) drawRect: (NSRect) rect; +- (id) initWithFrame: (NSRect) frame; +- (void) initTextures; +- (void) reloadTexture; +- (void) cleanUp; +- (void) displayTexture; +- (char*) getTextureBuffer; +- (void) setFullScreen: (BOOL) flag; +- (void) reshape; +- (void) setVideoSize: (int) w: (int) h; +- (BOOL) haveSuperview; +- (void) haveSuperviewReal: (NSMutableArray *)closure; +- (void) addToSuperview: (NSView *)superview; +- (void) removeFromSuperview: (id)unused; + +@end + +@interface GstOSXVideoSinkWindow: NSWindow { + int width, height; + GstGLView *gstview; +} + +- (void) setContentSize: (NSSize) size; +- (GstGLView *) gstView; +- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag screen:(NSScreen *)aScreen; +@end diff --git a/sys/osxvideo/cocoawindow.m b/sys/osxvideo/cocoawindow.m new file mode 100644 index 0000000..ed24fad --- /dev/null +++ b/sys/osxvideo/cocoawindow.m @@ -0,0 +1,432 @@ +/* GStreamer + * Copyright (C) 2004 Zaheer Abbas Merali + * Copyright (C) 2007 Pioneers of the Inevitable + * + * 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 + * + */ + +/* inspiration gained from looking at source of osx video out of xine and vlc + * and is reflected in the code + */ + + +#include +#include +#import "cocoawindow.h" +#import "osxvideosink.h" + +#include +#include +#include + +/* Debugging category */ +#include + +@ implementation GstOSXVideoSinkWindow + +/* The object has to be released */ +- (id) initWithContentRect: (NSRect) rect + styleMask: (unsigned int) styleMask + backing: (NSBackingStoreType) bufferingType + defer: (BOOL) flag + screen:(NSScreen *) aScreen +{ + self = [super initWithContentRect: rect + styleMask: styleMask + backing: bufferingType + defer: flag + screen:aScreen]; + + GST_DEBUG ("Initializing GstOSXvideoSinkWindow"); + + gstview = [[GstGLView alloc] initWithFrame:rect]; + + if (gstview) + [self setContentView:gstview]; + [self setTitle:@"GStreamer Video Output"]; + + return self; +} + +- (void) setContentSize:(NSSize) size { + width = size.width; + height = size.height; + + [gstview setVideoSize: (int) width:(int) height]; + + [super setContentSize:size]; +} + +- (GstGLView *) gstView { + return gstview; +} + +- (void) awakeFromNib { + [self setAcceptsMouseMovedEvents:YES]; +} + +- (void) sendEvent:(NSEvent *) event { + BOOL taken = NO; + + GST_DEBUG ("event %p type:%d", event,(gint)[event type]); + + if ([event type] == NSKeyDown) { + } + /*taken = [gstview keyDown:event]; */ + + if (!taken) { + [super sendEvent:event]; + } +} + + +@end + + +// +// OpenGL implementation +// + +@ implementation GstGLView + +- (id) initWithFrame:(NSRect) frame { + NSOpenGLPixelFormat *fmt; + NSOpenGLPixelFormatAttribute attribs[] = { + NSOpenGLPFAAccelerated, + NSOpenGLPFANoRecovery, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAColorSize, 24, + NSOpenGLPFAAlphaSize, 8, + NSOpenGLPFADepthSize, 24, + NSOpenGLPFAWindow, + 0 + }; + + fmt = [[NSOpenGLPixelFormat alloc] + initWithAttributes:attribs]; + + if (!fmt) { + GST_WARNING ("Cannot create NSOpenGLPixelFormat"); + return nil; + } + + self = [super initWithFrame: frame pixelFormat:fmt]; + [fmt release]; + + actualContext = [self openGLContext]; + [actualContext makeCurrentContext]; + [actualContext update]; + + /* Black background */ + glClearColor (0.0, 0.0, 0.0, 0.0); + + pi_texture = 0; + data = nil; + width = frame.size.width; + height = frame.size.height; + + GST_LOG ("Width: %d Height: %d", width, height); + + [self initTextures]; + return self; +} + +- (void) reshape { + NSRect bounds; + + GST_LOG ("reshaping"); + + if (!initDone) { + return; + } + + [actualContext makeCurrentContext]; + + bounds = [self bounds]; + + glViewport (0, 0, (GLint) bounds.size.width, (GLint) bounds.size.height); + +} + +- (void) initTextures { + + [actualContext makeCurrentContext]; + + /* Free previous texture if any */ + if (pi_texture) { + glDeleteTextures (1, (GLuint *)&pi_texture); + } + + if (data) { + data = g_realloc (data, width * height * sizeof(short)); // short or 3byte? + } else { + data = g_malloc0(width * height * sizeof(short)); + } + /* Create textures */ + glGenTextures (1, (GLuint *)&pi_texture); + + glEnable (GL_TEXTURE_RECTANGLE_EXT); + glEnable (GL_UNPACK_CLIENT_STORAGE_APPLE); + + glPixelStorei (GL_UNPACK_ALIGNMENT, 1); + glPixelStorei (GL_UNPACK_ROW_LENGTH, width); + + glBindTexture (GL_TEXTURE_RECTANGLE_EXT, pi_texture); + + /* Use VRAM texturing */ + glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, + GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE); + + /* Tell the driver not to make a copy of the texture but to use + our buffer */ + glPixelStorei (GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); + + /* Linear interpolation */ + glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + /* I have no idea what this exactly does, but it seems to be + necessary for scaling */ + glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, + GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, + GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + // glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); WHY ?? + + glTexImage2D (GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, + width, height, 0, + GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, data); + + + initDone = 1; +} + +- (void) reloadTexture { + if (!initDone) { + return; + } + + GST_LOG ("Reloading Texture"); + + [actualContext makeCurrentContext]; + + glBindTexture (GL_TEXTURE_RECTANGLE_EXT, pi_texture); + glPixelStorei (GL_UNPACK_ROW_LENGTH, width); + + /* glTexSubImage2D is faster than glTexImage2D + http://developer.apple.com/samplecode/Sample_Code/Graphics_3D/ + TextureRange/MainOpenGLView.m.htm */ + glTexSubImage2D (GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, + width, height, + GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, data); //FIXME +} + +- (void) cleanUp { + initDone = 0; +} + +- (void) drawQuad { + f_x = 1.0; + f_y = 1.0; + + glBegin (GL_QUADS); + /* Top left */ + glTexCoord2f (0.0, 0.0); + glVertex2f (-f_x, f_y); + /* Bottom left */ + glTexCoord2f (0.0, (float) height); + glVertex2f (-f_x, -f_y); + /* Bottom right */ + glTexCoord2f ((float) width, (float) height); + glVertex2f (f_x, -f_y); + /* Top right */ + glTexCoord2f ((float) width, 0.0); + glVertex2f (f_x, f_y); + glEnd (); +} + +- (void) drawRect:(NSRect) rect { + GLint params[] = { 1 }; + + [actualContext makeCurrentContext]; + + CGLSetParameter (CGLGetCurrentContext (), kCGLCPSwapInterval, params); + + /* Black background */ + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if (!initDone) { + [actualContext flushBuffer]; + return; + } + + /* Draw */ + glBindTexture (GL_TEXTURE_RECTANGLE_EXT, pi_texture); // FIXME + [self drawQuad]; + /* Draw */ + [actualContext flushBuffer]; +} + +- (void) displayTexture { + if ([self lockFocusIfCanDraw]) { + + [self drawRect:[self bounds]]; + [self reloadTexture]; + + [self unlockFocus]; + + } + +} + +- (char *) getTextureBuffer { + return data; +} + +- (void) setFullScreen:(BOOL) flag { + if (!fullscreen && flag) { + // go to full screen + /* Create the new pixel format */ + NSOpenGLPixelFormat *fmt; + NSOpenGLPixelFormatAttribute attribs[] = { + NSOpenGLPFAAccelerated, + NSOpenGLPFANoRecovery, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAColorSize, 24, + NSOpenGLPFAAlphaSize, 8, + NSOpenGLPFADepthSize, 24, + NSOpenGLPFAFullScreen, + NSOpenGLPFAScreenMask, + CGDisplayIDToOpenGLDisplayMask (kCGDirectMainDisplay), + 0 + }; + + fmt = [[NSOpenGLPixelFormat alloc] + initWithAttributes:attribs]; + + if (!fmt) { + GST_WARNING ("Cannot create NSOpenGLPixelFormat"); + return; + } + + /* Create the new OpenGL context */ + fullScreenContext = [[NSOpenGLContext alloc] + initWithFormat: fmt shareContext:nil]; + if (!fullScreenContext) { + GST_WARNING ("Failed to create new NSOpenGLContext"); + return; + } + + actualContext = fullScreenContext; + + /* Capture display, switch to fullscreen */ + if (CGCaptureAllDisplays () != CGDisplayNoErr) { + GST_WARNING ("CGCaptureAllDisplays() failed"); + return; + } + [fullScreenContext setFullScreen]; + [fullScreenContext makeCurrentContext]; + + fullscreen = YES; + + [self initTextures]; + [self setNeedsDisplay:YES]; + + } else if (fullscreen && !flag) { + // fullscreen now and needs to go back to normal + initDone = NO; + + actualContext = [self openGLContext]; + + [NSOpenGLContext clearCurrentContext]; + [fullScreenContext clearDrawable]; + [fullScreenContext release]; + fullScreenContext = nil; + + CGReleaseAllDisplays (); + + [self reshape]; + [self initTextures]; + + [self setNeedsDisplay:YES]; + + fullscreen = NO; + initDone = YES; + } +} + +- (void) setVideoSize: (int) w:(int) h { + GST_LOG ("width:%d, height:%d", w, h); + + width = w; + height = h; + +// if (data) g_free(data); + +// data = g_malloc0 (2 * w * h); + [self initTextures]; +} + +- (void) haveSuperviewReal:(NSMutableArray *)closure { + BOOL haveSuperview = [self superview] != nil; + [closure addObject:[NSNumber numberWithBool:haveSuperview]]; +} + +- (BOOL) haveSuperview { + NSMutableArray *closure = [NSMutableArray arrayWithCapacity:1]; + [self performSelectorOnMainThread:@selector(haveSuperviewReal:) + withObject:(id)closure waitUntilDone:YES]; + + return [[closure objectAtIndex:0] boolValue]; +} + +- (void) addToSuperviewReal:(NSView *)superview { + NSRect bounds; + [superview addSubview:self]; + bounds = [superview bounds]; + [self setFrame:bounds]; + [self setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; +} + +- (void) addToSuperview: (NSView *)superview { + [self performSelectorOnMainThread:@selector(addToSuperviewReal:) + withObject:superview waitUntilDone:YES]; +} + +- (void) removeFromSuperview: (id)unused +{ + [self removeFromSuperview]; +} + +- (void) dealloc { + GST_LOG ("dealloc called"); + if (data) g_free(data); + + if (fullScreenContext) { + [NSOpenGLContext clearCurrentContext]; + [fullScreenContext clearDrawable]; + [fullScreenContext release]; + if (actualContext == fullScreenContext) actualContext = nil; + fullScreenContext = nil; + } + + [super dealloc]; +} +@end diff --git a/sys/osxvideo/osxvideosink.h b/sys/osxvideo/osxvideosink.h new file mode 100644 index 0000000..2a228d0 --- /dev/null +++ b/sys/osxvideo/osxvideosink.h @@ -0,0 +1,85 @@ +/* GStreamer + * Copyright (C) 2004-6 Zaheer Abbas Merali + * Copyright (C) 2007 Pioneers of the Inevitable + * + * + * 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_OSX_VIDEO_SINK_H__ +#define __GST_OSX_VIDEO_SINK_H__ + +#include + +#include +#include +#include + +#include +#import "cocoawindow.h" + +GST_DEBUG_CATEGORY_EXTERN (gst_debug_osx_video_sink); +#define GST_CAT_DEFAULT gst_debug_osx_video_sink + +G_BEGIN_DECLS + +#define GST_TYPE_OSX_VIDEO_SINK \ + (gst_osx_video_sink_get_type()) +#define GST_OSX_VIDEO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_OSX_VIDEO_SINK, GstOSXVideoSink)) +#define GST_OSX_VIDEO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_OSX_VIDEO_SINK, GstOSXVideoSinkClass)) +#define GST_IS_OSX_VIDEO_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_OSX_VIDEO_SINK)) +#define GST_IS_OSX_VIDEO_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_OSX_VIDEO_SINK)) + +typedef struct _GstOSXWindow GstOSXWindow; + +typedef struct _GstOSXVideoSink GstOSXVideoSink; +typedef struct _GstOSXVideoSinkClass GstOSXVideoSinkClass; + +#define GST_TYPE_OSXVIDEOBUFFER (gst_osxvideobuffer_get_type()) + +/* OSXWindow stuff */ +struct _GstOSXWindow { + gint width, height; + gboolean internal; + GstGLView* gstview; +}; + +struct _GstOSXVideoSink { + /* Our element stuff */ + GstVideoSink videosink; + GstOSXWindow *osxwindow; + NSView *superview; +}; + +struct _GstOSXVideoSinkClass { + GstVideoSinkClass parent_class; +}; + +GType gst_osx_video_sink_get_type(void); + +G_END_DECLS + +#endif /* __GST_OSX_VIDEO_SINK_H__ */ + diff --git a/sys/osxvideo/osxvideosink.m b/sys/osxvideo/osxvideosink.m new file mode 100644 index 0000000..5914550 --- /dev/null +++ b/sys/osxvideo/osxvideosink.m @@ -0,0 +1,524 @@ +/* GStreamer + * OSX video sink + * Copyright (C) 2004-6 Zaheer Abbas Merali + * Copyright (C) 2007,2008,2009 Pioneers of the Inevitable + * + * 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-osxvideosink + * + * The OSXVideoSink renders video frames to a MacOSX window. The video output + * must be directed to a window embedded in an existing NSApp. + * + * When the NSView to be embedded is created an element #GstMessage with a + * name of 'have-ns-view' will be created and posted on the bus. + * The pointer to the NSView to embed will be in the 'nsview' field of that + * message. The application MUST handle this message and embed the view + * appropriately. + */ + +#include "config.h" +#include + +#include "osxvideosink.h" +#include +#import "cocoawindow.h" + +GST_DEBUG_CATEGORY (gst_debug_osx_video_sink); +#define GST_CAT_DEFAULT gst_debug_osx_video_sink + +static GstStaticPadTemplate gst_osx_video_sink_sink_template_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-yuv, " + "framerate = (fraction) [ 0, MAX ], " + "width = (int) [ 1, MAX ], " + "height = (int) [ 1, MAX ], " +#if G_BYTE_ORDER == G_BIG_ENDIAN + "format = (fourcc) YUY2") +#else + "format = (fourcc) UYVY") +#endif + ); + +enum +{ + ARG_0, + ARG_EMBED, +}; + +static void gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink); + +static GstVideoSinkClass *parent_class = NULL; + +/* This function handles osx window creation */ +static gboolean +gst_osx_video_sink_osxwindow_create (GstOSXVideoSink * osxvideosink, gint width, + gint height) +{ + NSRect rect; + GstOSXWindow *osxwindow = NULL; + GstStructure *s; + GstMessage *msg; + gboolean res = TRUE; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + g_return_val_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink), FALSE); + + GST_DEBUG_OBJECT (osxvideosink, "Creating new OSX window"); + + osxvideosink->osxwindow = osxwindow = g_new0 (GstOSXWindow, 1); + + osxwindow->width = width; + osxwindow->height = height; + + /* Allocate our GstGLView for the window, and then tell the application + * about it (hopefully it's listening...) */ + rect.origin.x = 0.0; + rect.origin.y = 0.0; + rect.size.width = (float) osxwindow->width; + rect.size.height = (float) osxwindow->height; + osxwindow->gstview =[[GstGLView alloc] initWithFrame:rect]; + + s = gst_structure_new ("have-ns-view", + "nsview", G_TYPE_POINTER, osxwindow->gstview, + nil); + + msg = gst_message_new_element (GST_OBJECT (osxvideosink), s); + gst_element_post_message (GST_ELEMENT (osxvideosink), msg); + + GST_INFO_OBJECT (osxvideosink, "'have-ns-view' message sent"); + + /* check if have-ns-view was handled and osxwindow->gstview was added to a + * superview + */ + if ([osxwindow->gstview haveSuperview] == NO) { + /* have-ns-view wasn't handled, post prepare-xwindow-id */ + if (osxvideosink->superview == NULL) { + GST_INFO_OBJECT (osxvideosink, "emitting prepare-xwindow-id"); + gst_x_overlay_prepare_xwindow_id (GST_X_OVERLAY (osxvideosink)); + } + + if (osxvideosink->superview != NULL) { + /* prepare-xwindow-id was handled, we have the superview in + * osxvideosink->superview. We now add osxwindow->gstview to the superview + * from the main thread + */ + GST_INFO_OBJECT (osxvideosink, "we have a superview, adding our view to it"); + [osxwindow->gstview performSelectorOnMainThread:@selector(addToSuperview:) + withObject:osxvideosink->superview waitUntilDone:YES]; + } else { + /* the view wasn't added to a superview. It's possible that the + * application handled have-ns-view, stored our view internally and is + * going to add it to a superview later (webkit does that now). + */ + GST_INFO_OBJECT (osxvideosink, "no superview"); + } + } + + [pool release]; + + return res; +} + +static void +gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink) +{ + NSAutoreleasePool *pool; + + g_return_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink)); + pool = [[NSAutoreleasePool alloc] init]; + + if (osxvideosink->osxwindow) { + if (osxvideosink->superview) { + [osxvideosink->osxwindow->gstview + performSelectorOnMainThread:@selector(removeFromSuperview:) + withObject:(id)nil waitUntilDone:YES]; + } + [osxvideosink->osxwindow->gstview release]; + + g_free (osxvideosink->osxwindow); + osxvideosink->osxwindow = NULL; + } + [pool release]; +} + +/* This function resizes a GstXWindow */ +static void +gst_osx_video_sink_osxwindow_resize (GstOSXVideoSink * osxvideosink, + GstOSXWindow * osxwindow, guint width, guint height) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + g_return_if_fail (osxwindow != NULL); + g_return_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink)); + + osxwindow->width = width; + osxwindow->height = height; + + GST_DEBUG_OBJECT (osxvideosink, "Resizing window to (%d,%d)", width, height); + + /* Directly resize the underlying view */ + GST_DEBUG_OBJECT (osxvideosink, "Calling setVideoSize on %p", osxwindow->gstview); + [osxwindow->gstview setVideoSize:width :height]; + + [pool release]; +} + +static gboolean +gst_osx_video_sink_setcaps (GstBaseSink * bsink, GstCaps * caps) +{ + GstOSXVideoSink *osxvideosink; + GstStructure *structure; + gboolean res, result = FALSE; + gint video_width, video_height; + + osxvideosink = GST_OSX_VIDEO_SINK (bsink); + + GST_DEBUG_OBJECT (osxvideosink, "caps: %" GST_PTR_FORMAT, caps); + + structure = gst_caps_get_structure (caps, 0); + res = gst_structure_get_int (structure, "width", &video_width); + res &= gst_structure_get_int (structure, "height", &video_height); + + if (!res) { + goto beach; + } + + GST_DEBUG_OBJECT (osxvideosink, "our format is: %dx%d video", + video_width, video_height); + + GST_VIDEO_SINK_WIDTH (osxvideosink) = video_width; + GST_VIDEO_SINK_HEIGHT (osxvideosink) = video_height; + + gst_osx_video_sink_osxwindow_resize (osxvideosink, osxvideosink->osxwindow, + video_width, video_height); + result = TRUE; + +beach: + return result; + +} + +static GstStateChangeReturn +gst_osx_video_sink_change_state (GstElement * element, + GstStateChange transition) +{ + GstOSXVideoSink *osxvideosink; + GstStateChangeReturn ret; + + osxvideosink = GST_OSX_VIDEO_SINK (element); + + GST_DEBUG_OBJECT (osxvideosink, "%s => %s", + gst_element_state_get_name(GST_STATE_TRANSITION_CURRENT (transition)), + gst_element_state_get_name(GST_STATE_TRANSITION_NEXT (transition))); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + /* Creating our window and our image */ + GST_VIDEO_SINK_WIDTH (osxvideosink) = 320; + GST_VIDEO_SINK_HEIGHT (osxvideosink) = 240; + if (!gst_osx_video_sink_osxwindow_create (osxvideosink, + GST_VIDEO_SINK_WIDTH (osxvideosink), + GST_VIDEO_SINK_HEIGHT (osxvideosink))) { + ret = GST_STATE_CHANGE_FAILURE; + goto done; + } + break; + default: + break; + } + + ret = (GST_ELEMENT_CLASS (parent_class))->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_VIDEO_SINK_WIDTH (osxvideosink) = 0; + GST_VIDEO_SINK_HEIGHT (osxvideosink) = 0; + gst_osx_video_sink_osxwindow_destroy (osxvideosink); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + +done: + return ret; +} + +static GstFlowReturn +gst_osx_video_sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) +{ + GstOSXVideoSink *osxvideosink; + guint8 *viewdata; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + osxvideosink = GST_OSX_VIDEO_SINK (bsink); + viewdata = (guint8 *) [osxvideosink->osxwindow->gstview getTextureBuffer]; + + GST_DEBUG ("show_frame"); + memcpy (viewdata, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + [osxvideosink->osxwindow->gstview displayTexture]; + + [pool release]; + + return GST_FLOW_OK; +} + +/* Buffer management */ + + + +/* =========================================== */ +/* */ +/* Init & Class init */ +/* */ +/* =========================================== */ + +static void +gst_osx_video_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOSXVideoSink *osxvideosink; + + g_return_if_fail (GST_IS_OSX_VIDEO_SINK (object)); + + osxvideosink = GST_OSX_VIDEO_SINK (object); + + switch (prop_id) { + case ARG_EMBED: + /* Ignore, just here for backwards compatibility */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_osx_video_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstOSXVideoSink *osxvideosink; + + g_return_if_fail (GST_IS_OSX_VIDEO_SINK (object)); + + osxvideosink = GST_OSX_VIDEO_SINK (object); + + switch (prop_id) { + case ARG_EMBED: + g_value_set_boolean (value, TRUE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static void +gst_osx_video_sink_init (GstOSXVideoSink * osxvideosink) +{ + osxvideosink->osxwindow = NULL; + osxvideosink->superview = NULL; +} + +static void +gst_osx_video_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "OSX Video sink", + "Sink/Video", "OSX native videosink", + "Zaheer Abbas Merali "); + + gst_element_class_add_static_pad_template (element_class, + &gst_osx_video_sink_sink_template_factory); +} + +static void +gst_osx_video_sink_finalize (GObject *object) +{ + GstOSXVideoSink *osxvideosink = GST_OSX_VIDEO_SINK (object); + + if (osxvideosink->superview) + [osxvideosink->superview release]; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_osx_video_sink_class_init (GstOSXVideoSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + + + parent_class = g_type_class_ref (GST_TYPE_VIDEO_SINK); + + gobject_class->set_property = gst_osx_video_sink_set_property; + gobject_class->get_property = gst_osx_video_sink_get_property; + gobject_class->finalize = gst_osx_video_sink_finalize; + + gstbasesink_class->set_caps = gst_osx_video_sink_setcaps; + gstbasesink_class->preroll = gst_osx_video_sink_show_frame; + gstbasesink_class->render = gst_osx_video_sink_show_frame; + gstelement_class->change_state = gst_osx_video_sink_change_state; + + /** + * GstOSXVideoSink:embed + * + * Set to #TRUE if you are embedding the video window in an application. + * + **/ + + g_object_class_install_property (gobject_class, ARG_EMBED, + g_param_spec_boolean ("embed", "embed", "For ABI compatiblity only, do not use", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static gboolean +gst_osx_video_sink_interface_supported (GstImplementsInterface * iface, GType type) +{ + g_assert (type == GST_TYPE_X_OVERLAY); + return TRUE; +} + +static void +gst_osx_video_sink_interface_init (GstImplementsInterfaceClass * klass) +{ + klass->supported = gst_osx_video_sink_interface_supported; +} + +static void +gst_osx_video_sink_set_window_handle (GstXOverlay * overlay, guintptr handle_id) +{ + GstOSXVideoSink *osxvideosink = GST_OSX_VIDEO_SINK (overlay); + gulong window_id = (gulong) handle_id; + + if (osxvideosink->superview) { + GST_INFO_OBJECT (osxvideosink, "old xwindow id %p", osxvideosink->superview); + if (osxvideosink->osxwindow) { + [osxvideosink->osxwindow->gstview + performSelectorOnMainThread:@selector(removeFromSuperview:) + withObject:(id)nil waitUntilDone:YES]; + } + [osxvideosink->superview release]; + } + + GST_INFO_OBJECT (osxvideosink, "set xwindow id 0x%lx", window_id); + osxvideosink->superview = [((NSView *) window_id) retain]; + if (osxvideosink->osxwindow) { + [osxvideosink->osxwindow->gstview performSelectorOnMainThread:@selector(addToSuperview:) + withObject:osxvideosink->superview waitUntilDone:YES]; + } +} + +static void +gst_osx_video_sink_xoverlay_init (GstXOverlayClass * iface) +{ + iface->set_window_handle = gst_osx_video_sink_set_window_handle; + iface->expose = NULL; + iface->handle_events = NULL; +} + +/* ============================================================= */ +/* */ +/* Public Methods */ +/* */ +/* ============================================================= */ + +/* =========================================== */ +/* */ +/* Object typing & Creation */ +/* */ +/* =========================================== */ + +GType +gst_osx_video_sink_get_type (void) +{ + static GType osxvideosink_type = 0; + + if (!osxvideosink_type) { + static const GTypeInfo osxvideosink_info = { + sizeof (GstOSXVideoSinkClass), + gst_osx_video_sink_base_init, + NULL, + (GClassInitFunc) gst_osx_video_sink_class_init, + NULL, + NULL, + sizeof (GstOSXVideoSink), + 0, + (GInstanceInitFunc) gst_osx_video_sink_init, + }; + + static const GInterfaceInfo iface_info = { + (GInterfaceInitFunc) gst_osx_video_sink_interface_init, + NULL, + NULL, + }; + + static const GInterfaceInfo overlay_info = { + (GInterfaceInitFunc) gst_osx_video_sink_xoverlay_init, + NULL, + NULL, + }; + + osxvideosink_type = g_type_register_static (GST_TYPE_VIDEO_SINK, + "GstOSXVideoSink", &osxvideosink_info, 0); + + g_type_add_interface_static (osxvideosink_type, + GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info); + g_type_add_interface_static (osxvideosink_type, GST_TYPE_X_OVERLAY, + &overlay_info); + } + + return osxvideosink_type; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + + if (!gst_element_register (plugin, "osxvideosink", + GST_RANK_PRIMARY, GST_TYPE_OSX_VIDEO_SINK)) + return FALSE; + + GST_DEBUG_CATEGORY_INIT (gst_debug_osx_video_sink, "osxvideosink", 0, + "osxvideosink element"); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "osxvideo", + "OSX native video output plugin", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/sunaudio/Makefile.am b/sys/sunaudio/Makefile.am new file mode 100644 index 0000000..e106ce3 --- /dev/null +++ b/sys/sunaudio/Makefile.am @@ -0,0 +1,26 @@ +plugin_LTLIBRARIES = libgstsunaudio.la + +libgstsunaudio_la_SOURCES = gstsunaudio.c \ + gstsunaudiosink.c \ + gstsunaudiomixerctrl.c \ + gstsunaudiomixer.c \ + gstsunaudiomixertrack.c \ + gstsunaudiomixeroptions.c \ + gstsunaudiosrc.c + +libgstsunaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstsunaudio_la_LIBADD = \ + -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_LIBS) +libgstsunaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstsunaudio_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstsunaudiosink.h \ + gstsunaudiomixer.h \ + gstsunaudiomixerctrl.h \ + gstsunaudiomixertrack.h \ + gstsunaudiomixeroptions.h \ + gstsunaudiosrc.h + diff --git a/sys/sunaudio/Makefile.in b/sys/sunaudio/Makefile.in new file mode 100644 index 0000000..a1d1abd --- /dev/null +++ b/sys/sunaudio/Makefile.in @@ -0,0 +1,877 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = sys/sunaudio +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstsunaudio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstsunaudio_la_OBJECTS = libgstsunaudio_la-gstsunaudio.lo \ + libgstsunaudio_la-gstsunaudiosink.lo \ + libgstsunaudio_la-gstsunaudiomixerctrl.lo \ + libgstsunaudio_la-gstsunaudiomixer.lo \ + libgstsunaudio_la-gstsunaudiomixertrack.lo \ + libgstsunaudio_la-gstsunaudiomixeroptions.lo \ + libgstsunaudio_la-gstsunaudiosrc.lo +libgstsunaudio_la_OBJECTS = $(am_libgstsunaudio_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstsunaudio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) \ + $(libgstsunaudio_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstsunaudio_la_SOURCES) +DIST_SOURCES = $(libgstsunaudio_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstsunaudio.la +libgstsunaudio_la_SOURCES = gstsunaudio.c \ + gstsunaudiosink.c \ + gstsunaudiomixerctrl.c \ + gstsunaudiomixer.c \ + gstsunaudiomixertrack.c \ + gstsunaudiomixeroptions.c \ + gstsunaudiosrc.c + +libgstsunaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstsunaudio_la_LIBADD = \ + -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstaudio-@GST_MAJORMINOR@ \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_LIBS) + +libgstsunaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstsunaudio_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstsunaudiosink.h \ + gstsunaudiomixer.h \ + gstsunaudiomixerctrl.h \ + gstsunaudiomixertrack.h \ + gstsunaudiomixeroptions.h \ + gstsunaudiosrc.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/sunaudio/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/sunaudio/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstsunaudio.la: $(libgstsunaudio_la_OBJECTS) $(libgstsunaudio_la_DEPENDENCIES) $(EXTRA_libgstsunaudio_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstsunaudio_la_LINK) -rpath $(plugindir) $(libgstsunaudio_la_OBJECTS) $(libgstsunaudio_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiomixer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiomixerctrl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiomixeroptions.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiomixertrack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiosink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiosrc.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstsunaudio_la-gstsunaudio.lo: gstsunaudio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudio.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudio.Tpo -c -o libgstsunaudio_la-gstsunaudio.lo `test -f 'gstsunaudio.c' || echo '$(srcdir)/'`gstsunaudio.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudio.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudio.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudio.c' object='libgstsunaudio_la-gstsunaudio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudio.lo `test -f 'gstsunaudio.c' || echo '$(srcdir)/'`gstsunaudio.c + +libgstsunaudio_la-gstsunaudiosink.lo: gstsunaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiosink.Tpo -c -o libgstsunaudio_la-gstsunaudiosink.lo `test -f 'gstsunaudiosink.c' || echo '$(srcdir)/'`gstsunaudiosink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiosink.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiosink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiosink.c' object='libgstsunaudio_la-gstsunaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiosink.lo `test -f 'gstsunaudiosink.c' || echo '$(srcdir)/'`gstsunaudiosink.c + +libgstsunaudio_la-gstsunaudiomixerctrl.lo: gstsunaudiomixerctrl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiomixerctrl.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixerctrl.Tpo -c -o libgstsunaudio_la-gstsunaudiomixerctrl.lo `test -f 'gstsunaudiomixerctrl.c' || echo '$(srcdir)/'`gstsunaudiomixerctrl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixerctrl.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixerctrl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiomixerctrl.c' object='libgstsunaudio_la-gstsunaudiomixerctrl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiomixerctrl.lo `test -f 'gstsunaudiomixerctrl.c' || echo '$(srcdir)/'`gstsunaudiomixerctrl.c + +libgstsunaudio_la-gstsunaudiomixer.lo: gstsunaudiomixer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiomixer.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixer.Tpo -c -o libgstsunaudio_la-gstsunaudiomixer.lo `test -f 'gstsunaudiomixer.c' || echo '$(srcdir)/'`gstsunaudiomixer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixer.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiomixer.c' object='libgstsunaudio_la-gstsunaudiomixer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiomixer.lo `test -f 'gstsunaudiomixer.c' || echo '$(srcdir)/'`gstsunaudiomixer.c + +libgstsunaudio_la-gstsunaudiomixertrack.lo: gstsunaudiomixertrack.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiomixertrack.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixertrack.Tpo -c -o libgstsunaudio_la-gstsunaudiomixertrack.lo `test -f 'gstsunaudiomixertrack.c' || echo '$(srcdir)/'`gstsunaudiomixertrack.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixertrack.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixertrack.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiomixertrack.c' object='libgstsunaudio_la-gstsunaudiomixertrack.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiomixertrack.lo `test -f 'gstsunaudiomixertrack.c' || echo '$(srcdir)/'`gstsunaudiomixertrack.c + +libgstsunaudio_la-gstsunaudiomixeroptions.lo: gstsunaudiomixeroptions.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiomixeroptions.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixeroptions.Tpo -c -o libgstsunaudio_la-gstsunaudiomixeroptions.lo `test -f 'gstsunaudiomixeroptions.c' || echo '$(srcdir)/'`gstsunaudiomixeroptions.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixeroptions.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixeroptions.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiomixeroptions.c' object='libgstsunaudio_la-gstsunaudiomixeroptions.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiomixeroptions.lo `test -f 'gstsunaudiomixeroptions.c' || echo '$(srcdir)/'`gstsunaudiomixeroptions.c + +libgstsunaudio_la-gstsunaudiosrc.lo: gstsunaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiosrc.Tpo -c -o libgstsunaudio_la-gstsunaudiosrc.lo `test -f 'gstsunaudiosrc.c' || echo '$(srcdir)/'`gstsunaudiosrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiosrc.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiosrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiosrc.c' object='libgstsunaudio_la-gstsunaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiosrc.lo `test -f 'gstsunaudiosrc.c' || echo '$(srcdir)/'`gstsunaudiosrc.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/sunaudio/gstsunaudio.c b/sys/sunaudio/gstsunaudio.c new file mode 100644 index 0000000..07aa575 --- /dev/null +++ b/sys/sunaudio/gstsunaudio.c @@ -0,0 +1,63 @@ +/* + * GStreamer - SunAudio plugin + * Copyright (C) 2005,2006 Sun Microsystems, Inc., + * Brian Cameron + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gst/gst-i18n-plugin.h" + +#include "gstsunaudiomixer.h" +#include "gstsunaudiosink.h" +#include "gstsunaudiosrc.h" + +extern gchar *__gst_oss_plugin_dir; + +GST_DEBUG_CATEGORY (sunaudio_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "sunaudiomixer", GST_RANK_NONE, + GST_TYPE_SUNAUDIO_MIXER) || + !gst_element_register (plugin, "sunaudiosink", GST_RANK_SECONDARY, + GST_TYPE_SUNAUDIO_SINK) || + !gst_element_register (plugin, "sunaudiosrc", GST_RANK_SECONDARY, + GST_TYPE_SUNAUDIO_SRC)) { + return FALSE; + } + + GST_DEBUG_CATEGORY_INIT (sunaudio_debug, "sunaudio", 0, "sunaudio elements"); + +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "sunaudio", + "Sun Audio support for GStreamer", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/sunaudio/gstsunaudiomixer.c b/sys/sunaudio/gstsunaudiomixer.c new file mode 100644 index 0000000..7688450 --- /dev/null +++ b/sys/sunaudio/gstsunaudiomixer.c @@ -0,0 +1,104 @@ +/* + * GStreamer - SunAudio mixer + * Copyright (C) 2005,2006 Sun Microsystems, Inc., + * Brian Cameron + * + * 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-sunaudiomixer + * + * sunaudiomixer is an mixer that controls the sound input and output + * levels with the Sun Audio interface available in Solaris. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstsunaudiomixer.h" + +GST_BOILERPLATE_WITH_INTERFACE (GstSunAudioMixer, gst_sunaudiomixer, + GstElement, GST_TYPE_ELEMENT, GstMixer, GST_TYPE_MIXER, gst_sunaudiomixer); + +GST_IMPLEMENT_SUNAUDIO_MIXER_CTRL_METHODS (GstSunAudioMixer, gst_sunaudiomixer); + +static GstStateChangeReturn gst_sunaudiomixer_change_state (GstElement * + element, GstStateChange transition); + +static void +gst_sunaudiomixer_base_init (gpointer klass) +{ + gst_element_class_set_details_simple (GST_ELEMENT_CLASS (klass), + "Sun Audio Mixer", "Generic/Audio", + "Control sound input and output levels with Sun Audio", + "Brian Cameron "); +} + +static void +gst_sunaudiomixer_class_init (GstSunAudioMixerClass * klass) +{ + GstElementClass *element_class; + + element_class = (GstElementClass *) klass; + + element_class->change_state = gst_sunaudiomixer_change_state; +} + +static void +gst_sunaudiomixer_init (GstSunAudioMixer * this, + GstSunAudioMixerClass * g_class) +{ + this->mixer = NULL; +} + +static GstStateChangeReturn +gst_sunaudiomixer_change_state (GstElement * element, GstStateChange transition) +{ + GstSunAudioMixer *this = GST_SUNAUDIO_MIXER (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!this->mixer) { + const char *audiodev; + + audiodev = g_getenv ("AUDIODEV"); + if (audiodev == NULL) { + this->mixer = gst_sunaudiomixer_ctrl_new ("/dev/audioctl"); + } else { + gchar *device = g_strdup_printf ("%sctl", audiodev); + + this->mixer = gst_sunaudiomixer_ctrl_new (device); + g_free (device); + } + } + break; + case GST_STATE_CHANGE_READY_TO_NULL: + if (this->mixer) { + gst_sunaudiomixer_ctrl_free (this->mixer); + this->mixer = NULL; + } + break; + default: + break; + } + + if (GST_ELEMENT_CLASS (parent_class)->change_state) + return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + return GST_STATE_CHANGE_SUCCESS; +} diff --git a/sys/sunaudio/gstsunaudiomixer.h b/sys/sunaudio/gstsunaudiomixer.h new file mode 100644 index 0000000..7ab6e74 --- /dev/null +++ b/sys/sunaudio/gstsunaudiomixer.h @@ -0,0 +1,51 @@ +/* + * GStreamer - SunAudio mixer + * Copyright (C) 2005,2006 Sun Microsystems, Inc., + * Brian Cameron + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __GST_SUNAUDIO_MIXER_H__ +#define __GST_SUNAUDIO_MIXER_H__ + +#include "gstsunaudiomixerctrl.h" + +G_BEGIN_DECLS + +#define GST_SUNAUDIO_MIXER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_MIXER,GstSunAudioMixer)) +#define GST_SUNAUDIO_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_MIXER,GstSunAudioMixerClass)) +#define GST_IS_SUNAUDIO_MIXER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_MIXER)) +#define GST_IS_SUNAUDIO_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_MIXER)) +#define GST_TYPE_SUNAUDIO_MIXER (gst_sunaudiomixer_get_type()) + +typedef struct _GstSunAudioMixer GstSunAudioMixer; +typedef struct _GstSunAudioMixerClass GstSunAudioMixerClass; + +struct _GstSunAudioMixer { + GstElement parent; + + GstSunAudioMixerCtrl *mixer; +}; + +struct _GstSunAudioMixerClass { + GstElementClass parent; +}; + +GType gst_sunaudiomixer_get_type (void); + +G_END_DECLS + +#endif /* __GST_SUNAUDIO_MIXER_H__ */ diff --git a/sys/sunaudio/gstsunaudiomixerctrl.c b/sys/sunaudio/gstsunaudiomixerctrl.c new file mode 100644 index 0000000..0723134 --- /dev/null +++ b/sys/sunaudio/gstsunaudiomixerctrl.c @@ -0,0 +1,585 @@ +/* + * GStreamer - SunAudio mixer interface element + * Copyright (C) 2005,2006,2008,2009 Sun Microsystems, Inc., + * Brian Cameron + * Copyright (C) 2008 Sun Microsystems, Inc., + * Jan Schmidt + * Copyright (C) 2009 Sun Microsystems, Inc., + * Garrett D'Amore + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "gstsunaudiomixerctrl.h" +#include "gstsunaudiomixertrack.h" +#include "gstsunaudiomixeroptions.h" + +GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); +#define GST_CAT_DEFAULT sunaudio_debug + +static gboolean +gst_sunaudiomixer_ctrl_open (GstSunAudioMixerCtrl * mixer) +{ + int fd; + + /* First try to open non-blocking */ + fd = open (mixer->device, O_RDWR | O_NONBLOCK); + + if (fd >= 0) { + close (fd); + fd = open (mixer->device, O_WRONLY); + } + + if (fd == -1) { + GST_DEBUG_OBJECT (mixer, + "Failed to open mixer device %s, mixing disabled: %s", mixer->device, + strerror (errno)); + + return FALSE; + } + mixer->mixer_fd = fd; + + /* Try to set the multiple open flag if we can, but ignore errors */ + ioctl (mixer->mixer_fd, AUDIO_MIXER_MULTIPLE_OPEN); + + GST_DEBUG_OBJECT (mixer, "Opened mixer device %s", mixer->device); + + return TRUE; +} + +void +gst_sunaudiomixer_ctrl_build_list (GstSunAudioMixerCtrl * mixer) +{ + GstMixerTrack *track; + GstMixerOptions *options; + + struct audio_info audioinfo; + + /* + * Do not continue appending the same 3 static tracks onto the list + */ + if (mixer->tracklist == NULL) { + g_return_if_fail (mixer->mixer_fd != -1); + + /* query available ports */ + if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { + g_warning ("Error getting audio device volume"); + return; + } + + /* Output & should be MASTER when it's the only one. */ + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_OUTPUT); + mixer->tracklist = g_list_append (mixer->tracklist, track); + + /* Input */ + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_RECORD); + mixer->tracklist = g_list_append (mixer->tracklist, track); + + /* Monitor */ + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_MONITOR); + mixer->tracklist = g_list_append (mixer->tracklist, track); + + if (audioinfo.play.avail_ports & AUDIO_SPEAKER) { + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_SPEAKER); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } + if (audioinfo.play.avail_ports & AUDIO_HEADPHONE) { + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_HP); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } + if (audioinfo.play.avail_ports & AUDIO_LINE_OUT) { + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_LINEOUT); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } + if (audioinfo.play.avail_ports & AUDIO_SPDIF_OUT) { + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_SPDIFOUT); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } + if (audioinfo.play.avail_ports & AUDIO_AUX1_OUT) { + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_AUX1OUT); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } + if (audioinfo.play.avail_ports & AUDIO_AUX2_OUT) { + track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_AUX2OUT); + mixer->tracklist = g_list_append (mixer->tracklist, track); + } + + if (audioinfo.record.avail_ports != AUDIO_NONE) { + options = + gst_sunaudiomixer_options_new (mixer, GST_SUNAUDIO_TRACK_RECSRC); + mixer->tracklist = g_list_append (mixer->tracklist, options); + } + } +} + +GstSunAudioMixerCtrl * +gst_sunaudiomixer_ctrl_new (const char *device) +{ + GstSunAudioMixerCtrl *ret = NULL; + + g_return_val_if_fail (device != NULL, NULL); + + ret = g_new0 (GstSunAudioMixerCtrl, 1); + + ret->device = g_strdup (device); + ret->mixer_fd = -1; + ret->tracklist = NULL; + + if (!gst_sunaudiomixer_ctrl_open (ret)) + goto error; + + return ret; + +error: + if (ret) + gst_sunaudiomixer_ctrl_free (ret); + + return NULL; +} + +void +gst_sunaudiomixer_ctrl_free (GstSunAudioMixerCtrl * mixer) +{ + g_return_if_fail (mixer != NULL); + + if (mixer->device) { + g_free (mixer->device); + mixer->device = NULL; + } + + if (mixer->tracklist) { + g_list_foreach (mixer->tracklist, (GFunc) g_object_unref, NULL); + g_list_free (mixer->tracklist); + mixer->tracklist = NULL; + } + + if (mixer->mixer_fd != -1) { + close (mixer->mixer_fd); + mixer->mixer_fd = -1; + } + + g_free (mixer); +} + +GstMixerFlags +gst_sunaudiomixer_ctrl_get_mixer_flags (GstSunAudioMixerCtrl * mixer) +{ + return GST_MIXER_FLAG_HAS_WHITELIST | GST_MIXER_FLAG_GROUPING; +} + +const GList * +gst_sunaudiomixer_ctrl_list_tracks (GstSunAudioMixerCtrl * mixer) +{ + gst_sunaudiomixer_ctrl_build_list (mixer); + + return (const GList *) mixer->tracklist; +} + +void +gst_sunaudiomixer_ctrl_get_volume (GstSunAudioMixerCtrl * mixer, + GstMixerTrack * track, gint * volumes) +{ + gint gain, balance; + float ratio; + struct audio_info audioinfo; + GstSunAudioMixerTrack *sunaudiotrack; + + g_return_if_fail (GST_IS_SUNAUDIO_MIXER_TRACK (track)); + sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track); + + g_return_if_fail (mixer->mixer_fd != -1); + + if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { + g_warning ("Error getting audio device volume"); + return; + } + + balance = AUDIO_MID_BALANCE; + gain = 0; + + switch (sunaudiotrack->track_num) { + case GST_SUNAUDIO_TRACK_OUTPUT: + gain = (int) audioinfo.play.gain; + balance = audioinfo.play.balance; + break; + case GST_SUNAUDIO_TRACK_RECORD: + gain = (int) audioinfo.record.gain; + balance = audioinfo.record.balance; + break; + case GST_SUNAUDIO_TRACK_MONITOR: + gain = (int) audioinfo.monitor_gain; + balance = audioinfo.record.balance; + break; + case GST_SUNAUDIO_TRACK_SPEAKER: + if (audioinfo.play.port & AUDIO_SPEAKER) + gain = AUDIO_MAX_GAIN; + break; + case GST_SUNAUDIO_TRACK_HP: + if (audioinfo.play.port & AUDIO_HEADPHONE) + gain = AUDIO_MAX_GAIN; + break; + case GST_SUNAUDIO_TRACK_LINEOUT: + if (audioinfo.play.port & AUDIO_LINE_OUT) + gain = AUDIO_MAX_GAIN; + break; + case GST_SUNAUDIO_TRACK_SPDIFOUT: + if (audioinfo.play.port & AUDIO_SPDIF_OUT) + gain = AUDIO_MAX_GAIN; + break; + case GST_SUNAUDIO_TRACK_AUX1OUT: + if (audioinfo.play.port & AUDIO_AUX1_OUT) + gain = AUDIO_MAX_GAIN; + break; + case GST_SUNAUDIO_TRACK_AUX2OUT: + if (audioinfo.play.port & AUDIO_AUX2_OUT) + gain = AUDIO_MAX_GAIN; + break; + default: + break; + } + + switch (track->num_channels) { + case 2: + if (balance == AUDIO_MID_BALANCE) { + volumes[0] = gain; + volumes[1] = gain; + } else if (balance < AUDIO_MID_BALANCE) { + volumes[0] = gain; + ratio = 1 - (float) (AUDIO_MID_BALANCE - balance) / + (float) AUDIO_MID_BALANCE; + volumes[1] = (int) ((float) gain * ratio + 0.5); + } else { + volumes[1] = gain; + ratio = 1 - (float) (balance - AUDIO_MID_BALANCE) / + (float) AUDIO_MID_BALANCE; + volumes[0] = (int) ((float) gain * ratio + 0.5); + } + break; + case 1: + volumes[0] = gain; + break; + } + + /* Likewise reset MUTE */ + if ((sunaudiotrack->track_num == GST_SUNAUDIO_TRACK_OUTPUT + && audioinfo.output_muted == 1) + || (sunaudiotrack->track_num != GST_SUNAUDIO_TRACK_OUTPUT && gain == 0)) { + /* + * If MUTE is set, then gain is always 0, so don't bother + * resetting our internal value. + */ + track->flags |= GST_MIXER_TRACK_MUTE; + } else { + sunaudiotrack->gain = gain; + sunaudiotrack->balance = balance; + track->flags &= ~GST_MIXER_TRACK_MUTE; + } +} + +void +gst_sunaudiomixer_ctrl_set_volume (GstSunAudioMixerCtrl * mixer, + GstMixerTrack * track, gint * volumes) +{ + gint gain; + gint balance; + gint l_real_gain; + gint r_real_gain; + float ratio; + struct audio_info audioinfo; + GstSunAudioMixerTrack *sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track); + + l_real_gain = volumes[0]; + r_real_gain = volumes[1]; + + if (l_real_gain == r_real_gain) { + gain = l_real_gain; + balance = AUDIO_MID_BALANCE; + } else if (l_real_gain < r_real_gain) { + gain = r_real_gain; + ratio = (float) l_real_gain / (float) r_real_gain; + balance = + AUDIO_RIGHT_BALANCE - (int) (ratio * (float) AUDIO_MID_BALANCE + 0.5); + } else { + gain = l_real_gain; + ratio = (float) r_real_gain / (float) l_real_gain; + balance = + AUDIO_LEFT_BALANCE + (int) (ratio * (float) AUDIO_MID_BALANCE + 0.5); + } + + sunaudiotrack->gain = gain; + sunaudiotrack->balance = balance; + + if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE)) { + if (sunaudiotrack->track_num == GST_SUNAUDIO_TRACK_OUTPUT) { + return; + } else if (gain == 0) { + return; + } else { + /* + * If the volume is set to a non-zero value for LINE_IN + * or MONITOR, then unset MUTE. + */ + track->flags &= ~GST_MIXER_TRACK_MUTE; + } + } + + /* Set the volume */ + AUDIO_INITINFO (&audioinfo); + + switch (sunaudiotrack->track_num) { + case GST_SUNAUDIO_TRACK_OUTPUT: + audioinfo.play.gain = gain; + audioinfo.play.balance = balance; + break; + case GST_SUNAUDIO_TRACK_RECORD: + audioinfo.record.gain = gain; + audioinfo.record.balance = balance; + break; + case GST_SUNAUDIO_TRACK_MONITOR: + audioinfo.monitor_gain = gain; + audioinfo.record.balance = balance; + break; + default: + break; + } + + g_return_if_fail (mixer->mixer_fd != -1); + + if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) { + g_warning ("Error setting audio device volume"); + return; + } +} + +void +gst_sunaudiomixer_ctrl_set_mute (GstSunAudioMixerCtrl * mixer, + GstMixerTrack * track, gboolean mute) +{ + struct audio_info audioinfo; + struct audio_info oldinfo; + GstSunAudioMixerTrack *sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track); + gint volume, balance; + + AUDIO_INITINFO (&audioinfo); + + if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &oldinfo) < 0) { + g_warning ("Error getting audio device volume"); + return; + } + + if (mute) { + volume = 0; + track->flags |= GST_MIXER_TRACK_MUTE; + } else { + volume = sunaudiotrack->gain; + track->flags &= ~GST_MIXER_TRACK_MUTE; + } + + balance = sunaudiotrack->balance; + + switch (sunaudiotrack->track_num) { + case GST_SUNAUDIO_TRACK_OUTPUT: + if (mute) + audioinfo.output_muted = 1; + else + audioinfo.output_muted = 0; + + audioinfo.play.gain = volume; + audioinfo.play.balance = balance; + break; + case GST_SUNAUDIO_TRACK_RECORD: + audioinfo.record.gain = volume; + audioinfo.record.balance = balance; + break; + case GST_SUNAUDIO_TRACK_MONITOR: + audioinfo.monitor_gain = volume; + audioinfo.record.balance = balance; + break; + case GST_SUNAUDIO_TRACK_SPEAKER: + if (mute) { + audioinfo.play.port = oldinfo.play.port & ~AUDIO_SPEAKER; + } else { + audioinfo.play.port = oldinfo.play.port | AUDIO_SPEAKER; + } + break; + case GST_SUNAUDIO_TRACK_HP: + if (mute) { + audioinfo.play.port = oldinfo.play.port & ~AUDIO_HEADPHONE; + } else { + audioinfo.play.port = oldinfo.play.port | AUDIO_HEADPHONE; + } + break; + case GST_SUNAUDIO_TRACK_LINEOUT: + if (mute) { + audioinfo.play.port = oldinfo.play.port & ~AUDIO_LINE_OUT; + } else { + audioinfo.play.port = oldinfo.play.port | AUDIO_LINE_OUT; + } + break; + case GST_SUNAUDIO_TRACK_SPDIFOUT: + if (mute) { + audioinfo.play.port = oldinfo.play.port & ~AUDIO_SPDIF_OUT; + } else { + audioinfo.play.port = oldinfo.play.port | AUDIO_SPDIF_OUT; + } + break; + case GST_SUNAUDIO_TRACK_AUX1OUT: + if (mute) { + audioinfo.play.port = oldinfo.play.port & ~AUDIO_AUX1_OUT; + } else { + audioinfo.play.port = oldinfo.play.port | AUDIO_AUX1_OUT; + } + break; + case GST_SUNAUDIO_TRACK_AUX2OUT: + if (mute) { + audioinfo.play.port = oldinfo.play.port & ~AUDIO_AUX2_OUT; + } else { + audioinfo.play.port = oldinfo.play.port | AUDIO_AUX2_OUT; + } + break; + default: + break; + } + + if (audioinfo.play.port != ((unsigned) ~0)) { + /* mask off ports we can't modify. Hack for broken drivers where mod_ports == 0 */ + if (oldinfo.play.mod_ports != 0) { + audioinfo.play.port &= oldinfo.play.mod_ports; + /* and add in any that are forced to be on */ + audioinfo.play.port |= (oldinfo.play.port & ~oldinfo.play.mod_ports); + } + } + g_return_if_fail (mixer->mixer_fd != -1); + + if (audioinfo.play.port != (guint) (-1) && + audioinfo.play.port != oldinfo.play.port) + GST_LOG_OBJECT (mixer, "Changing play port mask to 0x%08x", + audioinfo.play.port); + + if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) { + g_warning ("Error setting audio settings"); + return; + } +} + +void +gst_sunaudiomixer_ctrl_set_record (GstSunAudioMixerCtrl * mixer, + GstMixerTrack * track, gboolean record) +{ +} + +void +gst_sunaudiomixer_ctrl_set_option (GstSunAudioMixerCtrl * mixer, + GstMixerOptions * options, gchar * value) +{ + struct audio_info audioinfo; + GstMixerTrack *track; + GstSunAudioMixerOptions *opts; + GQuark q; + int i; + + g_return_if_fail (mixer != NULL); + g_return_if_fail (mixer->mixer_fd != -1); + g_return_if_fail (value != NULL); + g_return_if_fail (GST_IS_SUNAUDIO_MIXER_OPTIONS (options)); + + track = GST_MIXER_TRACK (options); + opts = GST_SUNAUDIO_MIXER_OPTIONS (options); + + if (opts->track_num != GST_SUNAUDIO_TRACK_RECSRC) { + g_warning ("set_option not supported on track %s", track->label); + return; + } + + q = g_quark_try_string (value); + if (q == 0) { + g_warning ("unknown option '%s'", value); + return; + } + + for (i = 0; i < 8; i++) { + if (opts->names[i] == q) { + break; + } + } + + if (((1 << (i)) & opts->avail) == 0) { + g_warning ("Record port %s not available", g_quark_to_string (q)); + return; + } + + AUDIO_INITINFO (&audioinfo); + audioinfo.record.port = (1 << (i)); + + if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) { + g_warning ("Error setting audio record port"); + } +} + +const gchar * +gst_sunaudiomixer_ctrl_get_option (GstSunAudioMixerCtrl * mixer, + GstMixerOptions * options) +{ + GstMixerTrack *track; + GstSunAudioMixerOptions *opts; + struct audio_info audioinfo; + int i; + + g_return_val_if_fail (mixer != NULL, NULL); + g_return_val_if_fail (mixer->fd != -1, NULL); + g_return_val_if_fail (GST_IS_SUNAUDIO_MIXER_OPTIONS (options), NULL); + + track = GST_MIXER_TRACK (options); + opts = GST_SUNAUDIO_MIXER_OPTIONS (options); + + g_return_val_if_fail (opts->track_num == GST_SUNAUDIO_TRACK_RECSRC, NULL); + + if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { + g_warning ("Error getting audio device settings"); + return (NULL); + } + + for (i = 0; i < 8; i++) { + if ((1 << i) == audioinfo.record.port) { + const gchar *s = g_quark_to_string (opts->names[i]); + GST_DEBUG_OBJECT (mixer, "Getting value for option %d: %s", + opts->track_num, s); + return (s); + } + } + + GST_DEBUG_OBJECT (mixer, "Unable to get value for option %d", + opts->track_num); + + g_warning ("Record port value %d seems illegal", audioinfo.record.port); + return (NULL); +} diff --git a/sys/sunaudio/gstsunaudiomixerctrl.h b/sys/sunaudio/gstsunaudiomixerctrl.h new file mode 100644 index 0000000..d38f02f --- /dev/null +++ b/sys/sunaudio/gstsunaudiomixerctrl.h @@ -0,0 +1,189 @@ +/* + * GStreamer - SunAudio mixer interface element. + * Copyright (C) 2005,2006,2009 Sun Microsystems, Inc., + * Brian Cameron + * Copyright (C) 2009 Sun Microsystems, Inc., + * Garrett D'Amore + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __GST_SUNAUDIO_MIXER_CTRL_H +#define __GST_SUNAUDIO_MIXER_CTRL_H + +#include + +#include +#include + +G_BEGIN_DECLS + +#define GST_SUNAUDIO_MIXER_CTRL(obj) ((GstSunAudioMixerCtrl*)(obj)) + +typedef struct _GstSunAudioMixerCtrl GstSunAudioMixerCtrl; + +struct _GstSunAudioMixerCtrl { + GList * tracklist; /* list of available tracks */ + + gint fd; + gint mixer_fd; + + gchar * device; +}; + +GstSunAudioMixerCtrl* gst_sunaudiomixer_ctrl_new (const gchar *device); +void gst_sunaudiomixer_ctrl_free (GstSunAudioMixerCtrl *mixer); + +const GList* gst_sunaudiomixer_ctrl_list_tracks (GstSunAudioMixerCtrl * mixer); +void gst_sunaudiomixer_ctrl_set_volume (GstSunAudioMixerCtrl * mixer, + GstMixerTrack * track, + gint * volumes); +void gst_sunaudiomixer_ctrl_get_volume (GstSunAudioMixerCtrl * mixer, + GstMixerTrack * track, + gint * volumes); +void gst_sunaudiomixer_ctrl_set_record (GstSunAudioMixerCtrl * mixer, + GstMixerTrack * track, + gboolean record); +void gst_sunaudiomixer_ctrl_set_mute (GstSunAudioMixerCtrl * mixer, + GstMixerTrack * track, + gboolean mute); +void gst_sunaudiomixer_ctrl_set_option (GstSunAudioMixerCtrl * mixer, + GstMixerOptions * options, + gchar * value); +const gchar * gst_sunaudiomixer_ctrl_get_option (GstSunAudioMixerCtrl * mixer, + GstMixerOptions * options); +GstMixerFlags gst_sunaudiomixer_ctrl_get_mixer_flags (GstSunAudioMixerCtrl *mixer); + +#define GST_IMPLEMENT_SUNAUDIO_MIXER_CTRL_METHODS(Type, interface_as_function) \ +static gboolean \ +interface_as_function ## _supported (Type *this, GType iface_type) \ +{ \ + g_assert (iface_type == GST_TYPE_MIXER); \ + \ + return (this->mixer != NULL); \ +} \ + \ +static const GList* \ +interface_as_function ## _list_tracks (GstMixer * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_val_if_fail (this != NULL, NULL); \ + g_return_val_if_fail (this->mixer != NULL, NULL); \ + \ + return gst_sunaudiomixer_ctrl_list_tracks (this->mixer); \ +} \ + \ +static void \ +interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track, \ + gint * volumes) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_sunaudiomixer_ctrl_set_volume (this->mixer, track, volumes); \ +} \ + \ +static void \ +interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track, \ + gint * volumes) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_sunaudiomixer_ctrl_get_volume (this->mixer, track, volumes); \ +} \ + \ +static void \ +interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track, \ + gboolean record) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_sunaudiomixer_ctrl_set_record (this->mixer, track, record); \ +} \ + \ +static void \ +interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track, \ + gboolean mute) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_sunaudiomixer_ctrl_set_mute (this->mixer, track, mute); \ +} \ + \ +static const gchar * \ +interface_as_function ## _get_option (GstMixer * mixer, GstMixerOptions * opts) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_val_if_fail (this != NULL, NULL); \ + g_return_val_if_fail (this->mixer != NULL, NULL); \ + \ + return gst_sunaudiomixer_ctrl_get_option (this->mixer, opts); \ +} \ +\ +static void \ +interface_as_function ## _set_option (GstMixer * mixer, GstMixerOptions * opts, \ + gchar * value) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_if_fail (this != NULL); \ + g_return_if_fail (this->mixer != NULL); \ + \ + gst_sunaudiomixer_ctrl_set_option (this->mixer, opts, value); \ +} \ +\ +static GstMixerFlags \ +interface_as_function ## _get_mixer_flags (GstMixer * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + \ + g_return_val_if_fail (this != NULL, GST_MIXER_FLAG_NONE); \ + g_return_val_if_fail (this->mixer != NULL, GST_MIXER_FLAG_NONE); \ + \ + return gst_sunaudiomixer_ctrl_get_mixer_flags (this->mixer); \ +} \ + \ +static void \ +interface_as_function ## _interface_init (GstMixerClass * klass) \ +{ \ + GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; \ + \ + /* set up the interface hooks */ \ + klass->list_tracks = interface_as_function ## _list_tracks; \ + klass->set_volume = interface_as_function ## _set_volume; \ + klass->get_volume = interface_as_function ## _get_volume; \ + klass->set_mute = interface_as_function ## _set_mute; \ + klass->set_record = interface_as_function ## _set_record; \ + klass->get_option = interface_as_function ## _get_option; \ + klass->set_option = interface_as_function ## _set_option; \ + klass->get_mixer_flags = interface_as_function ## _get_mixer_flags; \ +} + +G_END_DECLS + +#endif diff --git a/sys/sunaudio/gstsunaudiomixeroptions.c b/sys/sunaudio/gstsunaudiomixeroptions.c new file mode 100644 index 0000000..1fa025b --- /dev/null +++ b/sys/sunaudio/gstsunaudiomixeroptions.c @@ -0,0 +1,157 @@ +/* + * GStreamer SunAudio mixer track implementation + * Copyright (C) 2009 Sun Microsystems, Inc., + * Brian Cameron + * Garrett D'Amore + * + * gstsunaudiomixeroptions.c: Sun Audio mixer options object + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "gstsunaudiomixeroptions.h" +#include "gstsunaudiomixertrack.h" + +GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); +#define GST_CAT_DEFAULT sunaudio_debug + +static void gst_sunaudiomixer_options_init (GstSunAudioMixerOptions * sun_opts); +static void gst_sunaudiomixer_options_class_init (gpointer g_class, + gpointer class_data); + +static GstMixerOptionsClass *parent_class = NULL; + +GType +gst_sunaudiomixer_options_get_type (void) +{ + static GType opts_type = 0; + + if (!opts_type) { + static const GTypeInfo opts_info = { + sizeof (GstSunAudioMixerOptionsClass), + NULL, + NULL, + gst_sunaudiomixer_options_class_init, + NULL, + NULL, + sizeof (GstSunAudioMixerOptions), + 0, + (GInstanceInitFunc) gst_sunaudiomixer_options_init, + }; + + opts_type = + g_type_register_static (GST_TYPE_MIXER_OPTIONS, + "GstSunAudioMixerOptions", &opts_info, 0); + } + + return opts_type; +} + +static void +gst_sunaudiomixer_options_class_init (gpointer g_class, gpointer class_data) +{ + parent_class = g_type_class_peek_parent (g_class); +} + +static void +gst_sunaudiomixer_options_init (GstSunAudioMixerOptions * sun_opts) +{ +} + +GstMixerOptions * +gst_sunaudiomixer_options_new (GstSunAudioMixerCtrl * mixer, gint track_num) +{ + GstMixerOptions *opts; + GstSunAudioMixerOptions *sun_opts; + GstMixerTrack *track; + const gchar *label; + gint i; + struct audio_info audioinfo; + + if ((mixer == NULL) || (mixer->mixer_fd == -1)) { + g_warning ("mixer not initialized"); + return NULL; + } + + if (track_num != GST_SUNAUDIO_TRACK_RECSRC) { + g_warning ("invalid options track"); + return (NULL); + } + + label = N_("Record Source"); + + opts = g_object_new (GST_TYPE_SUNAUDIO_MIXER_OPTIONS, + "untranslated-label", label, NULL); + sun_opts = GST_SUNAUDIO_MIXER_OPTIONS (opts); + track = GST_MIXER_TRACK (opts); + + GST_DEBUG_OBJECT (opts, "New mixer options, track %d: %s", + track_num, GST_STR_NULL (label)); + + /* save off names for the record sources */ + sun_opts->names[0] = g_quark_from_string (_("Microphone")); + sun_opts->names[1] = g_quark_from_string (_("Line In")); + sun_opts->names[2] = g_quark_from_string (_("Internal CD")); + sun_opts->names[3] = g_quark_from_string (_("SPDIF In")); + sun_opts->names[4] = g_quark_from_string (_("AUX 1 In")); + sun_opts->names[5] = g_quark_from_string (_("AUX 2 In")); + sun_opts->names[6] = g_quark_from_string (_("Codec Loopback")); + sun_opts->names[7] = g_quark_from_string (_("SunVTS Loopback")); + + /* set basic information */ + track->label = g_strdup (_(label)); + track->num_channels = 0; + track->min_volume = 0; + track->max_volume = 0; + track->flags = + GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_WHITELIST | + GST_MIXER_TRACK_NO_RECORD; + + if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { + g_warning ("Error getting audio device settings"); + g_object_unref (G_OBJECT (sun_opts)); + return NULL; + } + + sun_opts->avail = audioinfo.record.avail_ports; + sun_opts->track_num = track_num; + + for (i = 0; i < 8; i++) { + if ((1 << i) & audioinfo.record.avail_ports) { + const char *s = g_quark_to_string (sun_opts->names[i]); + opts->values = g_list_append (opts->values, g_strdup (s)); + GST_DEBUG_OBJECT (opts, "option for track %d: %s", + track_num, GST_STR_NULL (s)); + } + } + + return opts; +} diff --git a/sys/sunaudio/gstsunaudiomixeroptions.h b/sys/sunaudio/gstsunaudiomixeroptions.h new file mode 100644 index 0000000..fb02b46 --- /dev/null +++ b/sys/sunaudio/gstsunaudiomixeroptions.h @@ -0,0 +1,65 @@ +/* + * GStreamer SunAudio mixer track implementation + * Copyright (C) 2009 Sun Microsystems, Inc., + * Brian Cameron + * Garrett D'Amore + * + * gstsunaudiomixeroptions.h: Sun Audio mixer options object + * + * 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, + */ + +#ifndef __GST_SUNAUDIO_MIXER_OPTIONS_H__ +#define __GST_SUNAUDIO_MIXER_OPTIONS_H__ + + +#include "gstsunaudiomixer.h" +#include + + +G_BEGIN_DECLS + + +#define GST_SUNAUDIO_MIXER_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_MIXER_OPTIONS, GstSunAudioMixerOptions)) +#define GST_SUNAUDIO_MIXER_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_MIXER_OPTIONS, GstSunAudioMixerOptionsClass)) +#define GST_IS_SUNAUDIO_MIXER_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_MIXER_OPTIONS)) +#define GST_IS_SUNAUDIO_MIXER_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_MIXER_OPTIONS)) +#define GST_TYPE_SUNAUDIO_MIXER_OPTIONS (gst_sunaudiomixer_options_get_type()) + + +typedef struct _GstSunAudioMixerOptions GstSunAudioMixerOptions; +typedef struct _GstSunAudioMixerOptionsClass GstSunAudioMixerOptionsClass; + + +struct _GstSunAudioMixerOptions { + GstMixerOptions parent; + gint track_num; + GQuark names[8]; /* only 8 possible */ + gint avail; /* mask of avail */ +}; + +struct _GstSunAudioMixerOptionsClass { + GstMixerOptionsClass parent; +}; + + +GType gst_sunaudiomixer_options_get_type (void); +GstMixerOptions *gst_sunaudiomixer_options_new (GstSunAudioMixerCtrl *mixer, gint track_num); + + +G_END_DECLS + + +#endif /* __GST_SUNAUDIO_MIXER_OPTIONS_H__ */ diff --git a/sys/sunaudio/gstsunaudiomixertrack.c b/sys/sunaudio/gstsunaudiomixertrack.c new file mode 100644 index 0000000..786ef0d --- /dev/null +++ b/sys/sunaudio/gstsunaudiomixertrack.c @@ -0,0 +1,158 @@ +/* + * GStreamer + * Copyright (C) 2005,2008, 2009 Sun Microsystems, Inc., + * Brian Cameron + * Copyright (C) 2009 Sun Microsystems, Inc., + * Garrett D'Amore + * + * gstsunaudiomixer.c: mixer interface implementation for OSS + * + * 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 +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "gstsunaudiomixertrack.h" + +GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); +#define GST_CAT_DEFAULT sunaudio_debug + +#define MASK_BIT_IS_SET(mask, bit) \ + (mask & (1 << bit)) + +G_DEFINE_TYPE (GstSunAudioMixerTrack, gst_sunaudiomixer_track, + GST_TYPE_MIXER_TRACK); + +static void +gst_sunaudiomixer_track_class_init (GstSunAudioMixerTrackClass * klass) +{ + /* nop */ +} + +static void +gst_sunaudiomixer_track_init (GstSunAudioMixerTrack * track) +{ + track->gain = 0; + track->balance = AUDIO_MID_BALANCE; + track->track_num = 0; +} + +GstMixerTrack * +gst_sunaudiomixer_track_new (GstSunAudioTrackType track_num) +{ + const gchar *labels[] = { N_("Volume"), + N_("Gain"), + N_("Monitor"), + N_("Built-in Speaker"), + N_("Headphone"), + N_("Line Out"), + N_("SPDIF Out"), + N_("AUX 1 Out"), + N_("AUX 2 Out"), + }; + + + GstSunAudioMixerTrack *sunaudiotrack; + GstMixerTrack *track; + const gchar *untranslated_label; + + if ((guint) track_num < G_N_ELEMENTS (labels)) + untranslated_label = labels[track_num]; + else + untranslated_label = NULL; + + sunaudiotrack = g_object_new (GST_TYPE_SUNAUDIO_MIXER_TRACK, + "untranslated-label", untranslated_label, NULL); + + GST_DEBUG_OBJECT (sunaudiotrack, "Creating new mixer track of type %d: %s", + track_num, GST_STR_NULL (untranslated_label)); + + switch (track_num) { + case GST_SUNAUDIO_TRACK_OUTPUT: + /* these are sliders */ + track = GST_MIXER_TRACK (sunaudiotrack); + track->label = g_strdup (_(untranslated_label)); + track->num_channels = 2; + track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST | + GST_MIXER_TRACK_MASTER; + track->min_volume = 0; + track->max_volume = 255; + sunaudiotrack->track_num = track_num; + sunaudiotrack->gain = (0 & 0xff); + sunaudiotrack->balance = AUDIO_MID_BALANCE; + break; + case GST_SUNAUDIO_TRACK_RECORD: + /* these are sliders */ + track = GST_MIXER_TRACK (sunaudiotrack); + track->label = g_strdup (_(untranslated_label)); + track->num_channels = 2; + track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD | + GST_MIXER_TRACK_WHITELIST; + track->min_volume = 0; + track->max_volume = 255; + sunaudiotrack->track_num = track_num; + sunaudiotrack->gain = (0 & 0xff); + sunaudiotrack->balance = AUDIO_MID_BALANCE; + break; + case GST_SUNAUDIO_TRACK_MONITOR: + /* these are sliders */ + track = GST_MIXER_TRACK (sunaudiotrack); + track->label = g_strdup (_(untranslated_label)); + track->num_channels = 2; + track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD; + track->min_volume = 0; + track->max_volume = 255; + sunaudiotrack->track_num = track_num; + sunaudiotrack->gain = (0 & 0xff); + sunaudiotrack->balance = AUDIO_MID_BALANCE; + break; + case GST_SUNAUDIO_TRACK_SPEAKER: + case GST_SUNAUDIO_TRACK_HP: + case GST_SUNAUDIO_TRACK_LINEOUT: + case GST_SUNAUDIO_TRACK_SPDIFOUT: + case GST_SUNAUDIO_TRACK_AUX1OUT: + case GST_SUNAUDIO_TRACK_AUX2OUT: + /* these are switches */ + track = GST_MIXER_TRACK (sunaudiotrack); + track->label = g_strdup (_(untranslated_label)); + track->num_channels = 0; + track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST; + track->min_volume = 0; + track->max_volume = 255; + sunaudiotrack->track_num = track_num; + sunaudiotrack->gain = (0 & 0xff); + sunaudiotrack->balance = AUDIO_MID_BALANCE; + break; + default: + g_warning ("Unknown sun audio track num %d", track_num); + track = NULL; + } + + return track; +} diff --git a/sys/sunaudio/gstsunaudiomixertrack.h b/sys/sunaudio/gstsunaudiomixertrack.h new file mode 100644 index 0000000..83be9fc --- /dev/null +++ b/sys/sunaudio/gstsunaudiomixertrack.h @@ -0,0 +1,78 @@ +/* + * GStreamer SunAudio mixer track implementation + * Copyright (C) 2005,2006,2009 Sun Microsystems, Inc., + * Brian Cameron + * Copyright (C) 2009 Sun Microsystems, Inc., + * Garrett D'Amore + * + * gstsunaudiomixertrack.h: SunAudio mixer tracks + * + * 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_SUNAUDIO_MIXER_TRACK_H__ +#define __GST_SUNAUDIO_MIXER_TRACK_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef enum +{ + GST_SUNAUDIO_TRACK_OUTPUT = 0, + GST_SUNAUDIO_TRACK_RECORD, + GST_SUNAUDIO_TRACK_MONITOR, + GST_SUNAUDIO_TRACK_SPEAKER, + GST_SUNAUDIO_TRACK_HP, + GST_SUNAUDIO_TRACK_LINEOUT, + GST_SUNAUDIO_TRACK_SPDIFOUT, + GST_SUNAUDIO_TRACK_AUX1OUT, + GST_SUNAUDIO_TRACK_AUX2OUT, + GST_SUNAUDIO_TRACK_RECSRC +} GstSunAudioTrackType; + +#define GST_TYPE_SUNAUDIO_MIXER_TRACK \ + (gst_sunaudiomixer_track_get_type ()) +#define GST_SUNAUDIO_MIXER_TRACK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SUNAUDIO_MIXER_TRACK, \ + GstSunAudioMixerTrack)) +#define GST_SUNAUDIO_MIXER_TRACK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SUNAUDIO_MIXER_TRACK, \ + GstSunAudioMixerTrackClass)) +#define GST_IS_SUNAUDIO_MIXER_TRACK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SUNAUDIO_MIXER_TRACK)) +#define GST_IS_SUNAUDIO_MIXER_TRACK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SUNAUDIO_MIXER_TRACK)) + +typedef struct _GstSunAudioMixerTrack { + GstMixerTrack parent; + + gint gain; + gint balance; + GstSunAudioTrackType track_num; +} GstSunAudioMixerTrack; + +typedef struct _GstSunAudioMixerTrackClass { + GstMixerTrackClass parent; +} GstSunAudioMixerTrackClass; + +GType gst_sunaudiomixer_track_get_type (void); +GstMixerTrack* gst_sunaudiomixer_track_new (GstSunAudioTrackType track_num); + +G_END_DECLS + +#endif /* __GST_SUNAUDIO_MIXER_TRACK_H__ */ diff --git a/sys/sunaudio/gstsunaudiosink.c b/sys/sunaudio/gstsunaudiosink.c new file mode 100644 index 0000000..2a3cf19 --- /dev/null +++ b/sys/sunaudio/gstsunaudiosink.c @@ -0,0 +1,651 @@ +/* + * GStreamer - SunAudio sink + * Copyright (C) 2004 David A. Schleef + * Copyright (C) 2005,2006 Sun Microsystems, Inc., + * Brian Cameron + * Copyright (C) 2006 Jan Schmidt + * + * 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-sunaudiosink + * + * sunaudiosink is an audio sink designed to work with the Sun Audio + * interface available in Solaris. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc volume=0.5 ! sunaudiosink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "gstsunaudiosink.h" + +GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); +#define GST_CAT_DEFAULT sunaudio_debug + +static void gst_sunaudiosink_base_init (gpointer g_class); +static void gst_sunaudiosink_class_init (GstSunAudioSinkClass * klass); +static void gst_sunaudiosink_init (GstSunAudioSink * filter); +static void gst_sunaudiosink_dispose (GObject * object); +static void gst_sunaudiosink_finalize (GObject * object); + +static void gst_sunaudiosink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_sunaudiosink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_sunaudiosink_getcaps (GstBaseSink * bsink); + +static gboolean gst_sunaudiosink_open (GstAudioSink * asink); +static gboolean gst_sunaudiosink_close (GstAudioSink * asink); +static gboolean gst_sunaudiosink_prepare (GstAudioSink * asink, + GstRingBufferSpec * spec); +static gboolean gst_sunaudiosink_unprepare (GstAudioSink * asink); +static guint gst_sunaudiosink_write (GstAudioSink * asink, gpointer data, + guint length); +static guint gst_sunaudiosink_delay (GstAudioSink * asink); +static void gst_sunaudiosink_reset (GstAudioSink * asink); + +#define DEFAULT_DEVICE "/dev/audio" +enum +{ + PROP_0, + PROP_DEVICE, +}; + +static GstStaticPadTemplate gst_sunaudiosink_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " + /* [5510,48000] seems to be a Solaris limit */ + "rate = (int) [ 5510, 48000 ], " "channels = (int) [ 1, 2 ]") + ); + +static GstElementClass *parent_class = NULL; + +GType +gst_sunaudiosink_get_type (void) +{ + static GType plugin_type = 0; + + if (!plugin_type) { + static const GTypeInfo plugin_info = { + sizeof (GstSunAudioSinkClass), + gst_sunaudiosink_base_init, + NULL, + (GClassInitFunc) gst_sunaudiosink_class_init, + NULL, + NULL, + sizeof (GstSunAudioSink), + 0, + (GInstanceInitFunc) gst_sunaudiosink_init, + }; + + plugin_type = g_type_register_static (GST_TYPE_AUDIO_SINK, + "GstSunAudioSink", &plugin_info, 0); + } + return plugin_type; +} + +static void +gst_sunaudiosink_dispose (GObject * object) +{ + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_sunaudiosink_finalize (GObject * object) +{ + GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (object); + + g_mutex_free (sunaudiosink->write_mutex); + g_cond_free (sunaudiosink->sleep_cond); + + g_free (sunaudiosink->device); + + if (sunaudiosink->fd != -1) { + close (sunaudiosink->fd); + sunaudiosink->fd = -1; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_sunaudiosink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_sunaudiosink_factory); + gst_element_class_set_details_simple (element_class, "Sun Audio Sink", + "Sink/Audio", + "Audio sink for Sun Audio devices", + "David A. Schleef , " + "Brian Cameron "); +} + +static void +gst_sunaudiosink_class_init (GstSunAudioSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + GstBaseAudioSinkClass *gstbaseaudiosink_class; + GstAudioSinkClass *gstaudiosink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; + gstaudiosink_class = (GstAudioSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->dispose = gst_sunaudiosink_dispose; + gobject_class->finalize = gst_sunaudiosink_finalize; + + gobject_class->set_property = gst_sunaudiosink_set_property; + gobject_class->get_property = gst_sunaudiosink_get_property; + + gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_sunaudiosink_getcaps); + + gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_sunaudiosink_open); + gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_sunaudiosink_close); + gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_sunaudiosink_prepare); + gstaudiosink_class->unprepare = + GST_DEBUG_FUNCPTR (gst_sunaudiosink_unprepare); + gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_sunaudiosink_write); + gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_sunaudiosink_delay); + gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_sunaudiosink_reset); + + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", "Audio Device (/dev/audio)", + DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_sunaudiosink_init (GstSunAudioSink * sunaudiosink) +{ + const char *audiodev; + + GST_DEBUG_OBJECT (sunaudiosink, "initializing sunaudiosink"); + + sunaudiosink->fd = -1; + + audiodev = g_getenv ("AUDIODEV"); + if (audiodev == NULL) + audiodev = DEFAULT_DEVICE; + sunaudiosink->device = g_strdup (audiodev); + + /* mutex and gcond used to control the write method */ + sunaudiosink->write_mutex = g_mutex_new (); + sunaudiosink->sleep_cond = g_cond_new (); +} + +static void +gst_sunaudiosink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSunAudioSink *sunaudiosink; + + sunaudiosink = GST_SUNAUDIO_SINK (object); + + switch (prop_id) { + case PROP_DEVICE: + GST_OBJECT_LOCK (sunaudiosink); + g_free (sunaudiosink->device); + sunaudiosink->device = g_strdup (g_value_get_string (value)); + GST_OBJECT_UNLOCK (sunaudiosink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_sunaudiosink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstSunAudioSink *sunaudiosink; + + sunaudiosink = GST_SUNAUDIO_SINK (object); + + switch (prop_id) { + case PROP_DEVICE: + GST_OBJECT_LOCK (sunaudiosink); + g_value_set_string (value, sunaudiosink->device); + GST_OBJECT_UNLOCK (sunaudiosink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_sunaudiosink_getcaps (GstBaseSink * bsink) +{ + GstPadTemplate *pad_template; + GstCaps *caps = NULL; + GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (bsink); + + GST_DEBUG_OBJECT (sunaudiosink, "getcaps called"); + + pad_template = gst_static_pad_template_get (&gst_sunaudiosink_factory); + caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); + + gst_object_unref (pad_template); + + return caps; +} + +static gboolean +gst_sunaudiosink_open (GstAudioSink * asink) +{ + GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink); + int fd, ret; + + /* First try to open non-blocking */ + GST_OBJECT_LOCK (sunaudiosink); + fd = open (sunaudiosink->device, O_WRONLY | O_NONBLOCK); + + if (fd >= 0) { + close (fd); + fd = open (sunaudiosink->device, O_WRONLY); + } + + if (fd == -1) { + GST_OBJECT_UNLOCK (sunaudiosink); + goto open_failed; + } + + sunaudiosink->fd = fd; + GST_OBJECT_UNLOCK (sunaudiosink); + + ret = ioctl (fd, AUDIO_GETDEV, &sunaudiosink->dev); + if (ret == -1) + goto ioctl_error; + + GST_DEBUG_OBJECT (sunaudiosink, "name %s", sunaudiosink->dev.name); + GST_DEBUG_OBJECT (sunaudiosink, "version %s", sunaudiosink->dev.version); + GST_DEBUG_OBJECT (sunaudiosink, "config %s", sunaudiosink->dev.config); + + ret = ioctl (fd, AUDIO_GETINFO, &sunaudiosink->info); + if (ret == -1) + goto ioctl_error; + + GST_DEBUG_OBJECT (sunaudiosink, "monitor_gain %d", + sunaudiosink->info.monitor_gain); + GST_DEBUG_OBJECT (sunaudiosink, "output_muted %d", + sunaudiosink->info.output_muted); + GST_DEBUG_OBJECT (sunaudiosink, "hw_features %08x", + sunaudiosink->info.hw_features); + GST_DEBUG_OBJECT (sunaudiosink, "sw_features %08x", + sunaudiosink->info.sw_features); + GST_DEBUG_OBJECT (sunaudiosink, "sw_features_enabled %08x", + sunaudiosink->info.sw_features_enabled); + + return TRUE; + +open_failed: + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, OPEN_WRITE, (NULL), + ("can't open connection to Sun Audio device %s", sunaudiosink->device)); + return FALSE; +ioctl_error: + close (sunaudiosink->fd); + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return FALSE; +} + +static gboolean +gst_sunaudiosink_close (GstAudioSink * asink) +{ + GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink); + + if (sunaudiosink->fd != -1) { + close (sunaudiosink->fd); + sunaudiosink->fd = -1; + } + return TRUE; +} + +static gboolean +gst_sunaudiosink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) +{ + GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink); + audio_info_t ainfo; + int ret; + int ports; + + ret = ioctl (sunaudiosink->fd, AUDIO_GETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return FALSE; + } + + if (spec->width != 16) + return FALSE; + + ports = ainfo.play.port; + + AUDIO_INITINFO (&ainfo); + + ainfo.play.sample_rate = spec->rate; + ainfo.play.channels = spec->channels; + ainfo.play.precision = spec->width; + ainfo.play.encoding = AUDIO_ENCODING_LINEAR; + ainfo.play.port = ports; + + /* buffer_time for playback is not implemented in Solaris at the moment, + but at some point in the future, it might be */ + ainfo.play.buffer_size = + gst_util_uint64_scale (spec->rate * spec->bytes_per_sample, + spec->buffer_time, GST_SECOND / GST_USECOND); + + spec->silence_sample[0] = 0; + spec->silence_sample[1] = 0; + spec->silence_sample[2] = 0; + spec->silence_sample[3] = 0; + + ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return FALSE; + } + + /* Now read back the info to find out the actual buffer size and set + segtotal */ + AUDIO_INITINFO (&ainfo); + + ret = ioctl (sunaudiosink->fd, AUDIO_GETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return FALSE; + } +#if 0 + /* We don't actually use the buffer_size from the sound device, because + * it seems it's just bogus sometimes */ + sunaudiosink->segtotal = spec->segtotal = + ainfo.play.buffer_size / spec->segsize; +#else + sunaudiosink->segtotal = spec->segtotal; +#endif + sunaudiosink->segtotal_samples = + spec->segtotal * spec->segsize / spec->bytes_per_sample; + + sunaudiosink->segs_written = (gint) ainfo.play.eof; + sunaudiosink->samples_written = ainfo.play.samples; + sunaudiosink->bytes_per_sample = spec->bytes_per_sample; + + GST_DEBUG_OBJECT (sunaudiosink, "Got device buffer_size of %u", + ainfo.play.buffer_size); + + return TRUE; +} + +static gboolean +gst_sunaudiosink_unprepare (GstAudioSink * asink) +{ + return TRUE; +} + +#define LOOP_WHILE_EINTR(v,func) do { (v) = (func); } \ + while ((v) == -1 && errno == EINTR); + +/* Called with the write_mutex held */ +static void +gst_sunaudio_sink_do_delay (GstSunAudioSink * sink) +{ + GstBaseAudioSink *ba_sink = GST_BASE_AUDIO_SINK (sink); + GstClockTime total_sleep; + GstClockTime max_sleep; + gint sleep_usecs; + GTimeVal sleep_end; + gint err; + audio_info_t ainfo; + guint diff; + + /* This code below ensures that we don't race any further than buffer_time + * ahead of the audio output, by sleeping if the next write call would cause + * us to advance too far in the ring-buffer */ + LOOP_WHILE_EINTR (err, ioctl (sink->fd, AUDIO_GETINFO, &ainfo)); + if (err < 0) + goto write_error; + + /* Compute our offset from the output (copes with overflow) */ + diff = (guint) (sink->segs_written) - ainfo.play.eof; + if (diff > sink->segtotal) { + /* This implies that reset did a flush just as the sound device aquired + * some buffers internally, and it causes us to be out of sync with the + * eof measure. This corrects it */ + sink->segs_written = ainfo.play.eof; + diff = 0; + } + + if (diff + 1 < sink->segtotal) + return; /* no need to sleep at all */ + + /* Never sleep longer than the initial number of undrained segments in the + device plus one */ + total_sleep = 0; + max_sleep = (diff + 1) * (ba_sink->latency_time * GST_USECOND); + /* sleep for a segment period between .eof polls */ + sleep_usecs = ba_sink->latency_time; + + /* Current time is our reference point */ + g_get_current_time (&sleep_end); + + /* If the next segment would take us too far along the ring buffer, + * sleep for a bit to free up a slot. If there were a way to find out + * when the eof field actually increments, we could use, but the only + * notification mechanism seems to be SIGPOLL, which we can't use from + * a support library */ + while (diff + 1 >= sink->segtotal && total_sleep < max_sleep) { + GST_LOG_OBJECT (sink, "need to block to drain segment(s). " + "Sleeping for %d us", sleep_usecs); + + g_time_val_add (&sleep_end, sleep_usecs); + + if (g_cond_timed_wait (sink->sleep_cond, sink->write_mutex, &sleep_end)) { + GST_LOG_OBJECT (sink, "Waking up early due to reset"); + return; /* Got told to wake up */ + } + total_sleep += (sleep_usecs * GST_USECOND); + + LOOP_WHILE_EINTR (err, ioctl (sink->fd, AUDIO_GETINFO, &ainfo)); + if (err < 0) + goto write_error; + + /* Compute our (new) offset from the output (copes with overflow) */ + diff = (guint) g_atomic_int_get (&sink->segs_written) - ainfo.play.eof; + } + + return; + +write_error: + GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL), + ("Playback error on device '%s': %s", sink->device, strerror (errno))); + return; +} + +static guint +gst_sunaudiosink_write (GstAudioSink * asink, gpointer data, guint length) +{ + GstSunAudioSink *sink = GST_SUNAUDIO_SINK (asink); + + gint bytes_written, err; + + g_mutex_lock (sink->write_mutex); + if (sink->flushing) { + /* Exit immediately if reset tells us to */ + g_mutex_unlock (sink->write_mutex); + return length; + } + + LOOP_WHILE_EINTR (bytes_written, write (sink->fd, data, length)); + if (bytes_written < 0) { + err = bytes_written; + goto write_error; + } + + /* Increment our sample counter, for delay calcs */ + g_atomic_int_add (&sink->samples_written, length / sink->bytes_per_sample); + + /* Don't consider the segment written if we didn't output the whole lot yet */ + if (bytes_written < length) { + g_mutex_unlock (sink->write_mutex); + return (guint) bytes_written; + } + + /* Write a zero length output to trigger increment of the eof field */ + LOOP_WHILE_EINTR (err, write (sink->fd, NULL, 0)); + if (err < 0) + goto write_error; + + /* Count this extra segment we've written */ + sink->segs_written += 1; + + /* Now delay so we don't overrun the ring buffer */ + gst_sunaudio_sink_do_delay (sink); + + g_mutex_unlock (sink->write_mutex); + return length; + +write_error: + g_mutex_unlock (sink->write_mutex); + + GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL), + ("Playback error on device '%s': %s", sink->device, strerror (errno))); + return length; /* Say we wrote the segment to let the ringbuffer exit */ +} + +/* + * Provide the current number of unplayed samples that have been written + * to the device */ +static guint +gst_sunaudiosink_delay (GstAudioSink * asink) +{ + GstSunAudioSink *sink = GST_SUNAUDIO_SINK (asink); + audio_info_t ainfo; + gint ret; + guint offset; + + ret = ioctl (sink->fd, AUDIO_GETINFO, &ainfo); + if (G_UNLIKELY (ret == -1)) + return 0; + + offset = (g_atomic_int_get (&sink->samples_written) - ainfo.play.samples); + + /* If the offset is larger than the total ringbuffer size, then we asked + between the write call and when samples_written is updated */ + if (G_UNLIKELY (offset > sink->segtotal_samples)) + return 0; + + return offset; +} + +static void +gst_sunaudiosink_reset (GstAudioSink * asink) +{ + /* Get current values */ + GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink); + audio_info_t ainfo; + int ret; + + ret = ioctl (sunaudiosink->fd, AUDIO_GETINFO, &ainfo); + if (ret == -1) { + /* + * Should never happen, but if we couldn't getinfo, then no point + * trying to setinfo + */ + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return; + } + + /* + * Pause the audio - so audio stops playing immediately rather than + * waiting for the ringbuffer to empty. + */ + ainfo.play.pause = !NULL; + ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + } + + /* Flush the audio */ + ret = ioctl (sunaudiosink->fd, I_FLUSH, FLUSHW); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + } + + /* Now, we take the write_mutex and signal to ensure the write thread + * is not busy, and we signal the condition to wake up any sleeper, + * then we flush again in case the write wrote something after we flushed, + * and finally release the lock and unpause */ + g_mutex_lock (sunaudiosink->write_mutex); + sunaudiosink->flushing = TRUE; + + g_cond_signal (sunaudiosink->sleep_cond); + + ret = ioctl (sunaudiosink->fd, I_FLUSH, FLUSHW); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + } + + /* unpause the audio */ + ainfo.play.pause = NULL; + ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + } + + /* After flushing the audio device, we need to remeasure the sample count + * and segments written count so we're in sync with the device */ + + sunaudiosink->segs_written = ainfo.play.eof; + g_atomic_int_set (&sunaudiosink->samples_written, ainfo.play.samples); + + sunaudiosink->flushing = FALSE; + g_mutex_unlock (sunaudiosink->write_mutex); +} diff --git a/sys/sunaudio/gstsunaudiosink.h b/sys/sunaudio/gstsunaudiosink.h new file mode 100644 index 0000000..9454475 --- /dev/null +++ b/sys/sunaudio/gstsunaudiosink.h @@ -0,0 +1,78 @@ +/* + * GStreamer - SunAudio sink + * Copyright (C) 2004 David A. Schleef + * Copyright (C) 2005,2006 Sun Microsystems, Inc., + * Brian Cameron + * Copyright (C) 2006 Jan Schmidt + * + * gstsunaudiosink.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_SUNAUDIO_SINK_H__ +#define __GST_SUNAUDIO_SINK_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_SUNAUDIO_SINK (gst_sunaudiosink_get_type()) +#define GST_SUNAUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_SINK,GstSunAudioSink)) +#define GST_SUNAUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_SINK,GstSunAudioSinkClass)) +#define GST_IS_SUNAUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_SINK)) +#define GST_IS_SUNAUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_SINK)) + +typedef struct _GstSunAudioSink GstSunAudioSink; +typedef struct _GstSunAudioSinkClass GstSunAudioSinkClass; + +struct _GstSunAudioSink { + GstAudioSink sink; + + gchar *device; + gint fd; + + audio_device_t dev; + audio_info_t info; + + /* Number of segments the ringbuffer is configured for */ + guint segtotal; + guint segtotal_samples; + + /* Number of segments written to the device */ + gint segs_written; + /* Number of samples written to the device */ + gint samples_written; + guint bytes_per_sample; + + /* mutex and gcond used to control the write method */ + GMutex *write_mutex; + GCond *sleep_cond; + gboolean flushing; +}; + +struct _GstSunAudioSinkClass { + GstAudioSinkClass parent_class; +}; + +GType gst_sunaudiosink_get_type(void); + +G_END_DECLS + +#endif /* __GST_SUNAUDIO_SINK_H__ */ + diff --git a/sys/sunaudio/gstsunaudiosrc.c b/sys/sunaudio/gstsunaudiosrc.c new file mode 100644 index 0000000..08282cf --- /dev/null +++ b/sys/sunaudio/gstsunaudiosrc.c @@ -0,0 +1,423 @@ +/* + * GStreamer - SunAudio source + * Copyright (C) 2005,2006 Sun Microsystems, Inc., + * Brian Cameron + * + * gstsunaudiosrc.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. + */ + +/** + * SECTION:element-sunaudiosrc + * + * sunaudiosrc is an audio source designed to work with the Sun Audio + * interface available in Solaris. + * + * + * Example launch line + * |[ + * gst-launch sunaudiosrc ! wavenc ! filesink location=audio.wav + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "gstsunaudiosrc.h" + +GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); +#define GST_CAT_DEFAULT sunaudio_debug + +static void gst_sunaudiosrc_base_init (gpointer g_class); +static void gst_sunaudiosrc_class_init (GstSunAudioSrcClass * klass); +static void gst_sunaudiosrc_init (GstSunAudioSrc * sunaudiosrc, + GstSunAudioSrcClass * g_class); +static void gst_sunaudiosrc_dispose (GObject * object); + +static void gst_sunaudiosrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_sunaudiosrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_sunaudiosrc_getcaps (GstBaseSrc * bsrc); + +static gboolean gst_sunaudiosrc_open (GstAudioSrc * asrc); +static gboolean gst_sunaudiosrc_close (GstAudioSrc * asrc); +static gboolean gst_sunaudiosrc_prepare (GstAudioSrc * asrc, + GstRingBufferSpec * spec); +static gboolean gst_sunaudiosrc_unprepare (GstAudioSrc * asrc); +static guint gst_sunaudiosrc_read (GstAudioSrc * asrc, gpointer data, + guint length); +static guint gst_sunaudiosrc_delay (GstAudioSrc * asrc); +static void gst_sunaudiosrc_reset (GstAudioSrc * asrc); + +#define DEFAULT_DEVICE "/dev/audio" + +enum +{ + PROP_0, + PROP_DEVICE +}; + +GST_BOILERPLATE_WITH_INTERFACE (GstSunAudioSrc, gst_sunaudiosrc, + GstAudioSrc, GST_TYPE_AUDIO_SRC, GstMixer, GST_TYPE_MIXER, gst_sunaudiosrc); + +GST_IMPLEMENT_SUNAUDIO_MIXER_CTRL_METHODS (GstSunAudioSrc, gst_sunaudiosrc); + +static GstStaticPadTemplate gst_sunaudiosrc_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " + /* [5510,48000] seems to be a Solaris limit */ + "rate = (int) [ 5510, 48000 ], " "channels = (int) [ 1, 2 ]") + ); + +static void +gst_sunaudiosrc_dispose (GObject * object) +{ + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_sunaudiosrc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_add_static_pad_template (element_class, + &gst_sunaudiosrc_factory); + gst_element_class_set_details_simple (element_class, "Sun Audio Source", + "Source/Audio", + "Audio source for Sun Audio devices", + "Brian Cameron "); +} + +static void +gst_sunaudiosrc_class_init (GstSunAudioSrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSrcClass *gstbasesrc_class; + GstBaseAudioSrcClass *gstbaseaudiosrc_class; + GstAudioSrcClass *gstaudiosrc_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass; + gstaudiosrc_class = (GstAudioSrcClass *) klass; + + gobject_class->dispose = gst_sunaudiosrc_dispose; + gobject_class->get_property = gst_sunaudiosrc_get_property; + gobject_class->set_property = gst_sunaudiosrc_set_property; + + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_getcaps); + + gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_open); + gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_prepare); + gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_unprepare); + gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_close); + gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_read); + gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_delay); + gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_reset); + + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "SunAudio device (usually /dev/audio)", DEFAULT_DEVICE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_sunaudiosrc_init (GstSunAudioSrc * sunaudiosrc, + GstSunAudioSrcClass * g_class) +{ + const char *audiodev; + + GST_DEBUG_OBJECT (sunaudiosrc, "initializing sunaudiosrc"); + + sunaudiosrc->fd = -1; + + audiodev = g_getenv ("AUDIODEV"); + if (audiodev == NULL) + audiodev = DEFAULT_DEVICE; + sunaudiosrc->device = g_strdup (audiodev); +} + +static void +gst_sunaudiosrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstSunAudioSrc *sunaudiosrc; + + sunaudiosrc = GST_SUNAUDIO_SRC (object); + + switch (prop_id) { + case PROP_DEVICE: + if (sunaudiosrc->device) + g_free (sunaudiosrc->device); + sunaudiosrc->device = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_sunaudiosrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstSunAudioSrc *sunaudiosrc; + + sunaudiosrc = GST_SUNAUDIO_SRC (object); + + switch (prop_id) { + case PROP_DEVICE: + g_value_set_string (value, sunaudiosrc->device); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_sunaudiosrc_getcaps (GstBaseSrc * bsrc) +{ + GstPadTemplate *pad_template; + GstCaps *caps = NULL; + GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (bsrc); + + GST_DEBUG_OBJECT (sunaudiosrc, "getcaps called"); + + pad_template = gst_static_pad_template_get (&gst_sunaudiosrc_factory); + caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); + + gst_object_unref (pad_template); + + return caps; +} + +static gboolean +gst_sunaudiosrc_open (GstAudioSrc * asrc) +{ + GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc); + int fd, ret; + + fd = open (sunaudiosrc->device, O_RDONLY); + + if (fd == -1) { + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, OPEN_READ, (NULL), + ("can't open connection to Sun Audio device %s", sunaudiosrc->device)); + + return FALSE; + } + + sunaudiosrc->fd = fd; + + ret = ioctl (fd, AUDIO_GETDEV, &sunaudiosrc->dev); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return FALSE; + } + + GST_DEBUG_OBJECT (sunaudiosrc, "name %s", sunaudiosrc->dev.name); + GST_DEBUG_OBJECT (sunaudiosrc, "version %s", sunaudiosrc->dev.version); + GST_DEBUG_OBJECT (sunaudiosrc, "config %s", sunaudiosrc->dev.config); + + ret = ioctl (fd, AUDIO_GETINFO, &sunaudiosrc->info); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return FALSE; + } + + GST_DEBUG_OBJECT (sunaudiosrc, "monitor_gain %d", + sunaudiosrc->info.monitor_gain); + GST_DEBUG_OBJECT (sunaudiosrc, "output_muted %d", + sunaudiosrc->info.output_muted); + GST_DEBUG_OBJECT (sunaudiosrc, "hw_features %08x", + sunaudiosrc->info.hw_features); + GST_DEBUG_OBJECT (sunaudiosrc, "sw_features %08x", + sunaudiosrc->info.sw_features); + GST_DEBUG_OBJECT (sunaudiosrc, "sw_features_enabled %08x", + sunaudiosrc->info.sw_features_enabled); + + if (!sunaudiosrc->mixer) { + const char *audiodev; + + audiodev = g_getenv ("AUDIODEV"); + if (audiodev == NULL) { + sunaudiosrc->mixer = gst_sunaudiomixer_ctrl_new ("/dev/audioctl"); + } else { + gchar *device = g_strdup_printf ("%sctl", audiodev); + + sunaudiosrc->mixer = gst_sunaudiomixer_ctrl_new (device); + g_free (device); + } + } + + return TRUE; +} + +static gboolean +gst_sunaudiosrc_close (GstAudioSrc * asrc) +{ + GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc); + + close (sunaudiosrc->fd); + sunaudiosrc->fd = -1; + + if (sunaudiosrc->mixer) { + gst_sunaudiomixer_ctrl_free (sunaudiosrc->mixer); + sunaudiosrc->mixer = NULL; + } + + return TRUE; +} + +static gboolean +gst_sunaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) +{ + GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc); + audio_info_t ainfo; + int ret; + GstSunAudioMixerCtrl *mixer; + struct audio_info audioinfo; + + ret = ioctl (sunaudiosrc->fd, AUDIO_GETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return FALSE; + } + + if (spec->width != 16) + return FALSE; + + AUDIO_INITINFO (&ainfo); + + ainfo.record.sample_rate = spec->rate; + ainfo.record.precision = spec->width; + ainfo.record.channels = spec->channels; + ainfo.record.encoding = AUDIO_ENCODING_LINEAR; + ainfo.record.buffer_size = spec->buffer_time; + + mixer = sunaudiosrc->mixer; + + if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { + g_warning ("Error getting audio device volume"); + } + ainfo.record.port = audioinfo.record.port; + ainfo.record.gain = audioinfo.record.gain; + ainfo.record.balance = audioinfo.record.balance; + + spec->segsize = 128; + spec->segtotal = spec->buffer_time / 128; + + spec->silence_sample[0] = 0; + spec->silence_sample[1] = 0; + spec->silence_sample[2] = 0; + spec->silence_sample[3] = 0; + + ret = ioctl (sunaudiosrc->fd, AUDIO_SETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return FALSE; + } + + + ioctl (sunaudiosrc->fd, I_FLUSH, FLUSHR); + + return TRUE; +} + +static gboolean +gst_sunaudiosrc_unprepare (GstAudioSrc * asrc) +{ + return TRUE; +} + +static guint +gst_sunaudiosrc_read (GstAudioSrc * asrc, gpointer data, guint length) +{ + return read (GST_SUNAUDIO_SRC (asrc)->fd, data, length); +} + +static guint +gst_sunaudiosrc_delay (GstAudioSrc * asrc) +{ + return 0; +} + +static void +gst_sunaudiosrc_reset (GstAudioSrc * asrc) +{ + /* Get current values */ + GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc); + audio_info_t ainfo; + int ret; + + ret = ioctl (sunaudiosrc->fd, AUDIO_GETINFO, &ainfo); + if (ret == -1) { + /* + * Should never happen, but if we couldn't getinfo, then no point + * trying to setinfo + */ + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + return; + } + + /* + * Pause the audio - so audio stops playing immediately rather than + * waiting for the ringbuffer to empty. + */ + ainfo.record.pause = !NULL; + ret = ioctl (sunaudiosrc->fd, AUDIO_SETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + } + + /* Flush the audio */ + ret = ioctl (sunaudiosrc->fd, I_FLUSH, FLUSHR); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + } + + /* unpause the audio */ + ainfo.record.pause = NULL; + ret = ioctl (sunaudiosrc->fd, AUDIO_SETINFO, &ainfo); + if (ret == -1) { + GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", + strerror (errno))); + } +} diff --git a/sys/sunaudio/gstsunaudiosrc.h b/sys/sunaudio/gstsunaudiosrc.h new file mode 100644 index 0000000..95d9613 --- /dev/null +++ b/sys/sunaudio/gstsunaudiosrc.h @@ -0,0 +1,67 @@ +/* GStreamer - SunAudio source + * Copyright (C) 2005,2006 Sun Microsystems, Inc., + * Brian Cameron + * + * gstsunaudiosrc.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_SUNAUDIO_SRC_H__ +#define __GST_SUNAUDIO_SRC_H__ + +#include +#include +#include + +#include "gstsunaudiomixerctrl.h" + +G_BEGIN_DECLS + +#define GST_TYPE_SUNAUDIO_SRC (gst_sunaudiosrc_get_type()) +#define GST_SUNAUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_SRC,GstSunAudioSrc)) +#define GST_SUNAUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_SRC,GstSunAudioSrcClass)) +#define GST_IS_SUNAUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_SRC)) +#define GST_IS_SUNAUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_SRC)) + +typedef struct _GstSunAudioSrc GstSunAudioSrc; +typedef struct _GstSunAudioSrcClass GstSunAudioSrcClass; + +struct _GstSunAudioSrc { + GstAudioSrc src; + + gchar *device; + gint fd; + gint control_fd; + + audio_device_t dev; + audio_info_t info; + + gint bytes_per_sample; + + GstSunAudioMixerCtrl *mixer; +}; + +struct _GstSunAudioSrcClass { + GstAudioSrcClass parent_class; +}; + +GType gst_sunaudiosrc_get_type(void); + +G_END_DECLS + +#endif /* __GST_SUNAUDIO_SRC_H__ */ + diff --git a/sys/v4l2/Makefile.am b/sys/v4l2/Makefile.am new file mode 100644 index 0000000..a7a99de --- /dev/null +++ b/sys/v4l2/Makefile.am @@ -0,0 +1,60 @@ +plugin_LTLIBRARIES = libgstvideo4linux2.la + +if USE_XVIDEO +xv_source = gstv4l2xoverlay.c +xv_libs = $(X_LIBS) $(XVIDEO_LIBS) +else +xv_source = +xv_libs = +endif + +libgstvideo4linux2_la_SOURCES = gstv4l2.c \ + gstv4l2colorbalance.c \ + gstv4l2object.c \ + gstv4l2bufferpool.c \ + gstv4l2src.c \ + gstv4l2radio.c \ + gstv4l2tuner.c \ + gstv4l2vidorient.c \ + v4l2_calls.c \ + v4l2src_calls.c \ + $(xv_source) + +if BUILD_EXPERIMENTAL +libgstvideo4linux2_la_SOURCES += gstv4l2sink.c +endif + +libgstvideo4linux2_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) \ + $(GST_CFLAGS) \ + $(X_CFLAGS) \ + $(LIBV4L2_CFLAGS) \ + $(GUDEV_CFLAGS) + +libgstvideo4linux2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideo4linux2_la_LIBTOOLFLAGS = --tag=disable-static + +libgstvideo4linux2_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_CONTROLLER_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-$(GST_MAJORMINOR) \ + -lgstinterfaces-$(GST_MAJORMINOR) \ + $(GST_LIBS) \ + $(xv_libs) \ + $(LIBV4L2_LIBS) \ + $(GUDEV_LIBS) + +noinst_HEADERS = \ + gstv4l2bufferpool.h \ + gstv4l2colorbalance.h \ + gstv4l2object.h \ + gstv4l2sink.h \ + gstv4l2src.h \ + gstv4l2radio.h \ + gstv4l2tuner.h \ + gstv4l2vidorient.h \ + gstv4l2xoverlay.h \ + v4l2_calls.h \ + v4l2src_calls.h diff --git a/sys/v4l2/Makefile.in b/sys/v4l2/Makefile.in new file mode 100644 index 0000000..c9ad860 --- /dev/null +++ b/sys/v4l2/Makefile.in @@ -0,0 +1,953 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@BUILD_EXPERIMENTAL_TRUE@am__append_1 = gstv4l2sink.c +subdir = sys/v4l2 +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +@USE_XVIDEO_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) \ +@USE_XVIDEO_TRUE@ $(am__DEPENDENCIES_1) +libgstvideo4linux2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__libgstvideo4linux2_la_SOURCES_DIST = gstv4l2.c \ + gstv4l2colorbalance.c gstv4l2object.c gstv4l2bufferpool.c \ + gstv4l2src.c gstv4l2radio.c gstv4l2tuner.c gstv4l2vidorient.c \ + v4l2_calls.c v4l2src_calls.c gstv4l2xoverlay.c gstv4l2sink.c +@USE_XVIDEO_TRUE@am__objects_1 = \ +@USE_XVIDEO_TRUE@ libgstvideo4linux2_la-gstv4l2xoverlay.lo +@BUILD_EXPERIMENTAL_TRUE@am__objects_2 = \ +@BUILD_EXPERIMENTAL_TRUE@ libgstvideo4linux2_la-gstv4l2sink.lo +am_libgstvideo4linux2_la_OBJECTS = libgstvideo4linux2_la-gstv4l2.lo \ + libgstvideo4linux2_la-gstv4l2colorbalance.lo \ + libgstvideo4linux2_la-gstv4l2object.lo \ + libgstvideo4linux2_la-gstv4l2bufferpool.lo \ + libgstvideo4linux2_la-gstv4l2src.lo \ + libgstvideo4linux2_la-gstv4l2radio.lo \ + libgstvideo4linux2_la-gstv4l2tuner.lo \ + libgstvideo4linux2_la-gstv4l2vidorient.lo \ + libgstvideo4linux2_la-v4l2_calls.lo \ + libgstvideo4linux2_la-v4l2src_calls.lo $(am__objects_1) \ + $(am__objects_2) +libgstvideo4linux2_la_OBJECTS = $(am_libgstvideo4linux2_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstvideo4linux2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) \ + $(libgstvideo4linux2_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstvideo4linux2_la_SOURCES) +DIST_SOURCES = $(am__libgstvideo4linux2_la_SOURCES_DIST) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstvideo4linux2.la +@USE_XVIDEO_FALSE@xv_source = +@USE_XVIDEO_TRUE@xv_source = gstv4l2xoverlay.c +@USE_XVIDEO_FALSE@xv_libs = +@USE_XVIDEO_TRUE@xv_libs = $(X_LIBS) $(XVIDEO_LIBS) +libgstvideo4linux2_la_SOURCES = gstv4l2.c gstv4l2colorbalance.c \ + gstv4l2object.c gstv4l2bufferpool.c gstv4l2src.c \ + gstv4l2radio.c gstv4l2tuner.c gstv4l2vidorient.c v4l2_calls.c \ + v4l2src_calls.c $(xv_source) $(am__append_1) +libgstvideo4linux2_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CONTROLLER_CFLAGS) \ + $(GST_CFLAGS) \ + $(X_CFLAGS) \ + $(LIBV4L2_CFLAGS) \ + $(GUDEV_CFLAGS) + +libgstvideo4linux2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideo4linux2_la_LIBTOOLFLAGS = --tag=disable-static +libgstvideo4linux2_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + $(GST_BASE_LIBS) \ + $(GST_CONTROLLER_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-$(GST_MAJORMINOR) \ + -lgstinterfaces-$(GST_MAJORMINOR) \ + $(GST_LIBS) \ + $(xv_libs) \ + $(LIBV4L2_LIBS) \ + $(GUDEV_LIBS) + +noinst_HEADERS = \ + gstv4l2bufferpool.h \ + gstv4l2colorbalance.h \ + gstv4l2object.h \ + gstv4l2sink.h \ + gstv4l2src.h \ + gstv4l2radio.h \ + gstv4l2tuner.h \ + gstv4l2vidorient.h \ + gstv4l2xoverlay.h \ + v4l2_calls.h \ + v4l2src_calls.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/v4l2/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/v4l2/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstvideo4linux2.la: $(libgstvideo4linux2_la_OBJECTS) $(libgstvideo4linux2_la_DEPENDENCIES) $(EXTRA_libgstvideo4linux2_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstvideo4linux2_la_LINK) -rpath $(plugindir) $(libgstvideo4linux2_la_OBJECTS) $(libgstvideo4linux2_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2xoverlay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-v4l2src_calls.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstvideo4linux2_la-gstv4l2.lo: gstv4l2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Tpo -c -o libgstvideo4linux2_la-gstv4l2.lo `test -f 'gstv4l2.c' || echo '$(srcdir)/'`gstv4l2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2.c' object='libgstvideo4linux2_la-gstv4l2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2.lo `test -f 'gstv4l2.c' || echo '$(srcdir)/'`gstv4l2.c + +libgstvideo4linux2_la-gstv4l2colorbalance.lo: gstv4l2colorbalance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2colorbalance.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Tpo -c -o libgstvideo4linux2_la-gstv4l2colorbalance.lo `test -f 'gstv4l2colorbalance.c' || echo '$(srcdir)/'`gstv4l2colorbalance.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2colorbalance.c' object='libgstvideo4linux2_la-gstv4l2colorbalance.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2colorbalance.lo `test -f 'gstv4l2colorbalance.c' || echo '$(srcdir)/'`gstv4l2colorbalance.c + +libgstvideo4linux2_la-gstv4l2object.lo: gstv4l2object.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2object.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2object.Tpo -c -o libgstvideo4linux2_la-gstv4l2object.lo `test -f 'gstv4l2object.c' || echo '$(srcdir)/'`gstv4l2object.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2object.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2object.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2object.c' object='libgstvideo4linux2_la-gstv4l2object.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2object.lo `test -f 'gstv4l2object.c' || echo '$(srcdir)/'`gstv4l2object.c + +libgstvideo4linux2_la-gstv4l2bufferpool.lo: gstv4l2bufferpool.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2bufferpool.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Tpo -c -o libgstvideo4linux2_la-gstv4l2bufferpool.lo `test -f 'gstv4l2bufferpool.c' || echo '$(srcdir)/'`gstv4l2bufferpool.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2bufferpool.c' object='libgstvideo4linux2_la-gstv4l2bufferpool.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2bufferpool.lo `test -f 'gstv4l2bufferpool.c' || echo '$(srcdir)/'`gstv4l2bufferpool.c + +libgstvideo4linux2_la-gstv4l2src.lo: gstv4l2src.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2src.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Tpo -c -o libgstvideo4linux2_la-gstv4l2src.lo `test -f 'gstv4l2src.c' || echo '$(srcdir)/'`gstv4l2src.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2src.c' object='libgstvideo4linux2_la-gstv4l2src.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2src.lo `test -f 'gstv4l2src.c' || echo '$(srcdir)/'`gstv4l2src.c + +libgstvideo4linux2_la-gstv4l2radio.lo: gstv4l2radio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2radio.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Tpo -c -o libgstvideo4linux2_la-gstv4l2radio.lo `test -f 'gstv4l2radio.c' || echo '$(srcdir)/'`gstv4l2radio.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2radio.c' object='libgstvideo4linux2_la-gstv4l2radio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2radio.lo `test -f 'gstv4l2radio.c' || echo '$(srcdir)/'`gstv4l2radio.c + +libgstvideo4linux2_la-gstv4l2tuner.lo: gstv4l2tuner.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2tuner.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Tpo -c -o libgstvideo4linux2_la-gstv4l2tuner.lo `test -f 'gstv4l2tuner.c' || echo '$(srcdir)/'`gstv4l2tuner.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2tuner.c' object='libgstvideo4linux2_la-gstv4l2tuner.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2tuner.lo `test -f 'gstv4l2tuner.c' || echo '$(srcdir)/'`gstv4l2tuner.c + +libgstvideo4linux2_la-gstv4l2vidorient.lo: gstv4l2vidorient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2vidorient.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Tpo -c -o libgstvideo4linux2_la-gstv4l2vidorient.lo `test -f 'gstv4l2vidorient.c' || echo '$(srcdir)/'`gstv4l2vidorient.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2vidorient.c' object='libgstvideo4linux2_la-gstv4l2vidorient.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2vidorient.lo `test -f 'gstv4l2vidorient.c' || echo '$(srcdir)/'`gstv4l2vidorient.c + +libgstvideo4linux2_la-v4l2_calls.lo: v4l2_calls.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-v4l2_calls.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Tpo -c -o libgstvideo4linux2_la-v4l2_calls.lo `test -f 'v4l2_calls.c' || echo '$(srcdir)/'`v4l2_calls.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Tpo $(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v4l2_calls.c' object='libgstvideo4linux2_la-v4l2_calls.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-v4l2_calls.lo `test -f 'v4l2_calls.c' || echo '$(srcdir)/'`v4l2_calls.c + +libgstvideo4linux2_la-v4l2src_calls.lo: v4l2src_calls.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-v4l2src_calls.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-v4l2src_calls.Tpo -c -o libgstvideo4linux2_la-v4l2src_calls.lo `test -f 'v4l2src_calls.c' || echo '$(srcdir)/'`v4l2src_calls.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-v4l2src_calls.Tpo $(DEPDIR)/libgstvideo4linux2_la-v4l2src_calls.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v4l2src_calls.c' object='libgstvideo4linux2_la-v4l2src_calls.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-v4l2src_calls.lo `test -f 'v4l2src_calls.c' || echo '$(srcdir)/'`v4l2src_calls.c + +libgstvideo4linux2_la-gstv4l2xoverlay.lo: gstv4l2xoverlay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2xoverlay.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2xoverlay.Tpo -c -o libgstvideo4linux2_la-gstv4l2xoverlay.lo `test -f 'gstv4l2xoverlay.c' || echo '$(srcdir)/'`gstv4l2xoverlay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2xoverlay.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2xoverlay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2xoverlay.c' object='libgstvideo4linux2_la-gstv4l2xoverlay.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2xoverlay.lo `test -f 'gstv4l2xoverlay.c' || echo '$(srcdir)/'`gstv4l2xoverlay.c + +libgstvideo4linux2_la-gstv4l2sink.lo: gstv4l2sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2sink.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Tpo -c -o libgstvideo4linux2_la-gstv4l2sink.lo `test -f 'gstv4l2sink.c' || echo '$(srcdir)/'`gstv4l2sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2sink.c' object='libgstvideo4linux2_la-gstv4l2sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2sink.lo `test -f 'gstv4l2sink.c' || echo '$(srcdir)/'`gstv4l2sink.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/v4l2/README b/sys/v4l2/README new file mode 100644 index 0000000..e9c4ab4 --- /dev/null +++ b/sys/v4l2/README @@ -0,0 +1,32 @@ +v4l2 plugins +============ + +The idea is a bit the same as the idea for the v4l1 plugins. We want +one generic v4l2element, and a few child objects (probably only two: +v4l2src and v4l2sink): + + /-------- v4l2src +v4l2element ---= + \-------- v4l2sink + +Both v4l2src and v4l2sink have a uncompressed and a compressed +recording-/playback-mode. Since this is all part of v4l2, the 'client' +of these elements, i.e. an application using v4l2src/v4l2sink, will +hardly notice this. All capsnego stuff is done inside, and the plugin +knows which formats are compressed and which are not. + +Please note that the v4l1 and the v4l2 plugins are *not* compatible +concerning properties. Naming has been kept the same where possible, +but in some cases, properties had to be removed or added to make +full use of v4l2. + +V4L2 API: http://linux.bytesex.org/v4l2/. + http://v4l2spec.bytesex.org/ + /usr/include/linux/videodev2.h or + +Kernel patches available from + http://dl.bytesex.org/patches/. + +Articles: + http://lwn.net/Articles/203924/ + diff --git a/sys/v4l2/gstv4l2.c b/sys/v4l2/gstv4l2.c new file mode 100644 index 0000000..95f64db --- /dev/null +++ b/sys/v4l2/gstv4l2.c @@ -0,0 +1,86 @@ +/* GStreamer + * + * Copyright (C) 2001-2002 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2.c: plugin for v4l2 elements + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gst/gst-i18n-plugin.h" + +#include +#include + +#include "gstv4l2object.h" +#include "gstv4l2src.h" +#ifdef HAVE_EXPERIMENTAL +#include "gstv4l2sink.h" +#endif +#include "gstv4l2radio.h" +/* #include "gstv4l2jpegsrc.h" */ +/* #include "gstv4l2mjpegsrc.h" */ +/* #include "gstv4l2mjpegsink.h" */ + +/* used in v4l2_calls.c and v4l2src_calls.c */ +GST_DEBUG_CATEGORY (v4l2_debug); +GST_DEBUG_CATEGORY (GST_CAT_PERFORMANCE); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (v4l2_debug, "v4l2", 0, "V4L2 API calls"); + GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE"); + + /* initialize gst controller library */ + gst_controller_init (NULL, NULL); + + if (!gst_element_register (plugin, "v4l2src", GST_RANK_PRIMARY, + GST_TYPE_V4L2SRC) || +#ifdef HAVE_EXPERIMENTAL + !gst_element_register (plugin, "v4l2sink", GST_RANK_NONE, + GST_TYPE_V4L2SINK) || +#endif + !gst_element_register (plugin, "v4l2radio", GST_RANK_NONE, + GST_TYPE_V4L2RADIO) || + /* !gst_element_register (plugin, "v4l2jpegsrc", */ + /* GST_RANK_NONE, GST_TYPE_V4L2JPEGSRC) || */ + /* !gst_element_register (plugin, "v4l2mjpegsrc", */ + /* GST_RANK_NONE, GST_TYPE_V4L2MJPEGSRC) || */ + /* !gst_element_register (plugin, "v4l2mjpegsink", */ + /* GST_RANK_NONE, GST_TYPE_V4L2MJPEGSINK)) */ + FALSE) + return FALSE; + +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif /* ENABLE_NLS */ + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "video4linux2", + "elements for Video 4 Linux", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/v4l2/gstv4l2bufferpool.c b/sys/v4l2/gstv4l2bufferpool.c new file mode 100644 index 0000000..b81c6a4 --- /dev/null +++ b/sys/v4l2/gstv4l2bufferpool.c @@ -0,0 +1,652 @@ +/* GStreamer + * + * Copyright (C) 2001-2002 Ronald Bultje + * 2006 Edgard Lima + * 2009 Texas Instruments, Inc - http://www.ti.com/ + * + * gstv4l2bufferpool.c V4L2 buffer pool class + * + * 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 +#endif + +#include +#include +#include + +#include "gst/video/video.h" + +#include +#include "gstv4l2src.h" +#ifdef HAVE_EXPERIMENTAL +#include "gstv4l2sink.h" +#endif +#include "v4l2_calls.h" +#include "gst/gst-i18n-plugin.h" +#include + +/* videodev2.h is not versioned and we can't easily check for the presence + * of enum values at compile time, but the V4L2_CAP_VIDEO_OUTPUT_OVERLAY define + * was added in the same commit as V4L2_FIELD_INTERLACED_{TB,BT} (b2787845) */ +#ifndef V4L2_CAP_VIDEO_OUTPUT_OVERLAY +#define V4L2_FIELD_INTERLACED_TB 8 +#define V4L2_FIELD_INTERLACED_BT 9 +#endif + + +GST_DEBUG_CATEGORY_EXTERN (v4l2_debug); +#define GST_CAT_DEFAULT v4l2_debug + + +/* + * GstV4l2Buffer: + */ + +static GstBufferClass *v4l2buffer_parent_class = NULL; + +static void +gst_v4l2_buffer_finalize (GstV4l2Buffer * buffer) +{ + GstV4l2BufferPool *pool; + gboolean resuscitated = FALSE; + gint index; + + pool = buffer->pool; + + index = buffer->vbuffer.index; + + GST_LOG_OBJECT (pool->v4l2elem, "finalizing buffer %p %d", buffer, index); + + GST_V4L2_BUFFER_POOL_LOCK (pool); + if (pool->running) { + if (pool->requeuebuf) { + if (!gst_v4l2_buffer_pool_qbuf (pool, buffer)) { + GST_WARNING ("could not requeue buffer %p %d", buffer, index); + } else { + resuscitated = TRUE; + } + } else { + resuscitated = TRUE; + /* XXX double check this... I think it is ok to not synchronize this + * w.r.t. destruction of the pool, since the buffer is still live and + * the buffer holds a ref to the pool.. + */ + g_async_queue_push (pool->avail_buffers, buffer); + } + } else { + GST_LOG_OBJECT (pool->v4l2elem, "the pool is shutting down"); + } + + if (resuscitated) { + /* FIXME: check that the caps didn't change */ + GST_LOG_OBJECT (pool->v4l2elem, "reviving buffer %p, %d", buffer, index); + gst_buffer_ref (GST_BUFFER (buffer)); + GST_BUFFER_SIZE (buffer) = 0; + pool->buffers[index] = buffer; + } + + GST_V4L2_BUFFER_POOL_UNLOCK (pool); + + if (!resuscitated) { + GST_LOG_OBJECT (pool->v4l2elem, + "buffer %p (data %p, len %u) not recovered, unmapping", + buffer, GST_BUFFER_DATA (buffer), buffer->vbuffer.length); + gst_mini_object_unref (GST_MINI_OBJECT (pool)); + v4l2_munmap ((void *) GST_BUFFER_DATA (buffer), buffer->vbuffer.length); + + GST_MINI_OBJECT_CLASS (v4l2buffer_parent_class)->finalize (GST_MINI_OBJECT + (buffer)); + } +} + +static void +gst_v4l2_buffer_class_init (gpointer g_class, gpointer class_data) +{ + GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); + + v4l2buffer_parent_class = g_type_class_peek_parent (g_class); + + mini_object_class->finalize = (GstMiniObjectFinalizeFunction) + gst_v4l2_buffer_finalize; +} + +GType +gst_v4l2_buffer_get_type (void) +{ + static GType _gst_v4l2_buffer_type; + + if (G_UNLIKELY (_gst_v4l2_buffer_type == 0)) { + static const GTypeInfo v4l2_buffer_info = { + sizeof (GstBufferClass), + NULL, + NULL, + gst_v4l2_buffer_class_init, + NULL, + NULL, + sizeof (GstV4l2Buffer), + 0, + NULL, + NULL + }; + _gst_v4l2_buffer_type = g_type_register_static (GST_TYPE_BUFFER, + "GstV4l2Buffer", &v4l2_buffer_info, 0); + } + return _gst_v4l2_buffer_type; +} + +static GstV4l2Buffer * +gst_v4l2_buffer_new (GstV4l2BufferPool * pool, guint index, GstCaps * caps) +{ + GstV4l2Buffer *ret; + guint8 *data; + + ret = (GstV4l2Buffer *) gst_mini_object_new (GST_TYPE_V4L2_BUFFER); + + GST_LOG_OBJECT (pool->v4l2elem, "creating buffer %u, %p in pool %p", index, + ret, pool); + + ret->pool = + (GstV4l2BufferPool *) gst_mini_object_ref (GST_MINI_OBJECT (pool)); + + ret->vbuffer.index = index; + ret->vbuffer.type = pool->type; + ret->vbuffer.memory = V4L2_MEMORY_MMAP; + + if (v4l2_ioctl (pool->video_fd, VIDIOC_QUERYBUF, &ret->vbuffer) < 0) + goto querybuf_failed; + + GST_LOG_OBJECT (pool->v4l2elem, " index: %u", ret->vbuffer.index); + GST_LOG_OBJECT (pool->v4l2elem, " type: %d", ret->vbuffer.type); + GST_LOG_OBJECT (pool->v4l2elem, " bytesused: %u", ret->vbuffer.bytesused); + GST_LOG_OBJECT (pool->v4l2elem, " flags: %08x", ret->vbuffer.flags); + GST_LOG_OBJECT (pool->v4l2elem, " field: %d", ret->vbuffer.field); + GST_LOG_OBJECT (pool->v4l2elem, " memory: %d", ret->vbuffer.memory); + if (ret->vbuffer.memory == V4L2_MEMORY_MMAP) + GST_LOG_OBJECT (pool->v4l2elem, " MMAP offset: %u", + ret->vbuffer.m.offset); + GST_LOG_OBJECT (pool->v4l2elem, " length: %u", ret->vbuffer.length); + GST_LOG_OBJECT (pool->v4l2elem, " input: %u", ret->vbuffer.input); + + data = (guint8 *) v4l2_mmap (0, ret->vbuffer.length, + PROT_READ | PROT_WRITE, MAP_SHARED, pool->video_fd, + ret->vbuffer.m.offset); + + if (data == MAP_FAILED) + goto mmap_failed; + + GST_BUFFER_DATA (ret) = data; + GST_BUFFER_SIZE (ret) = ret->vbuffer.length; + + GST_BUFFER_FLAG_SET (ret, GST_BUFFER_FLAG_READONLY); + + gst_buffer_set_caps (GST_BUFFER (ret), caps); + + return ret; + + /* ERRORS */ +querybuf_failed: + { + gint errnosave = errno; + + GST_WARNING ("Failed QUERYBUF: %s", g_strerror (errnosave)); + gst_buffer_unref (GST_BUFFER (ret)); + errno = errnosave; + return NULL; + } +mmap_failed: + { + gint errnosave = errno; + + GST_WARNING ("Failed to mmap: %s", g_strerror (errnosave)); + gst_buffer_unref (GST_BUFFER (ret)); + errno = errnosave; + return NULL; + } +} + + +/* + * GstV4l2BufferPool: + */ + +static GstMiniObjectClass *buffer_pool_parent_class = NULL; + +static void +gst_v4l2_buffer_pool_finalize (GstV4l2BufferPool * pool) +{ + g_mutex_free (pool->lock); + pool->lock = NULL; + + g_async_queue_unref (pool->avail_buffers); + pool->avail_buffers = NULL; + + if (pool->video_fd >= 0) + v4l2_close (pool->video_fd); + + if (pool->buffers) { + g_free (pool->buffers); + pool->buffers = NULL; + } + + GST_MINI_OBJECT_CLASS (buffer_pool_parent_class)->finalize (GST_MINI_OBJECT + (pool)); +} + +static void +gst_v4l2_buffer_pool_init (GstV4l2BufferPool * pool, gpointer g_class) +{ + pool->lock = g_mutex_new (); + pool->running = FALSE; + pool->num_live_buffers = 0; +} + +static void +gst_v4l2_buffer_pool_class_init (gpointer g_class, gpointer class_data) +{ + GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); + + buffer_pool_parent_class = g_type_class_peek_parent (g_class); + + mini_object_class->finalize = (GstMiniObjectFinalizeFunction) + gst_v4l2_buffer_pool_finalize; +} + +GType +gst_v4l2_buffer_pool_get_type (void) +{ + static GType _gst_v4l2_buffer_pool_type; + + if (G_UNLIKELY (_gst_v4l2_buffer_pool_type == 0)) { + static const GTypeInfo v4l2_buffer_pool_info = { + sizeof (GstMiniObjectClass), + NULL, + NULL, + gst_v4l2_buffer_pool_class_init, + NULL, + NULL, + sizeof (GstV4l2BufferPool), + 0, + (GInstanceInitFunc) gst_v4l2_buffer_pool_init, + NULL + }; + _gst_v4l2_buffer_pool_type = g_type_register_static (GST_TYPE_MINI_OBJECT, + "GstV4l2BufferPool", &v4l2_buffer_pool_info, 0); + } + return _gst_v4l2_buffer_pool_type; +} + + +/* this is somewhat of a hack.. but better to keep the hack in + * one place than copy/pasting it around.. + */ +static GstV4l2Object * +get_v4l2_object (GstElement * v4l2elem) +{ + GstV4l2Object *v4l2object = NULL; + if (GST_IS_V4L2SRC (v4l2elem)) { + v4l2object = (GST_V4L2SRC (v4l2elem))->v4l2object; +#ifdef HAVE_EXPERIMENTAL + } else if (GST_IS_V4L2SINK (v4l2elem)) { + v4l2object = (GST_V4L2SINK (v4l2elem))->v4l2object; +#endif + } else { + GST_ERROR_OBJECT (v4l2elem, "unknown v4l2 element"); + } + return v4l2object; +} + + + +/** + * gst_v4l2_buffer_pool_new: + * @v4l2elem: the v4l2 element (src or sink) that owns this pool + * @fd: the video device file descriptor + * @num_buffers: the requested number of buffers in the pool + * @caps: the caps to set on the buffer + * @requeuebuf: if %TRUE, and if the pool is still in the running state, a + * buffer with no remaining references is immediately passed back to v4l2 + * (VIDIOC_QBUF), otherwise it is returned to the pool of available buffers + * (which can be accessed via gst_v4l2_buffer_pool_get(). + * + * Construct a new buffer pool. + * + * Returns: the new pool, use gst_v4l2_buffer_pool_destroy() to free resources + */ +GstV4l2BufferPool * +gst_v4l2_buffer_pool_new (GstElement * v4l2elem, gint fd, gint num_buffers, + GstCaps * caps, gboolean requeuebuf, enum v4l2_buf_type type) +{ + GstV4l2BufferPool *pool; + gint n; + struct v4l2_requestbuffers breq; + + pool = (GstV4l2BufferPool *) gst_mini_object_new (GST_TYPE_V4L2_BUFFER_POOL); + + pool->video_fd = v4l2_dup (fd); + if (pool->video_fd < 0) + goto dup_failed; + + + /* first, lets request buffers, and see how many we can get: */ + GST_DEBUG_OBJECT (v4l2elem, "STREAMING, requesting %d MMAP buffers", + num_buffers); + + memset (&breq, 0, sizeof (struct v4l2_requestbuffers)); + breq.type = type; + breq.count = num_buffers; + breq.memory = V4L2_MEMORY_MMAP; + + if (v4l2_ioctl (fd, VIDIOC_REQBUFS, &breq) < 0) + goto reqbufs_failed; + + GST_LOG_OBJECT (v4l2elem, " count: %u", breq.count); + GST_LOG_OBJECT (v4l2elem, " type: %d", breq.type); + GST_LOG_OBJECT (v4l2elem, " memory: %d", breq.memory); + + if (breq.count < GST_V4L2_MIN_BUFFERS) + goto no_buffers; + + if (num_buffers != breq.count) { + GST_WARNING_OBJECT (v4l2elem, "using %u buffers instead", breq.count); + num_buffers = breq.count; + } + + pool->v4l2elem = v4l2elem; + pool->requeuebuf = requeuebuf; + pool->type = type; + pool->buffer_count = num_buffers; + pool->buffers = g_new0 (GstV4l2Buffer *, num_buffers); + pool->avail_buffers = g_async_queue_new (); + + /* now, map the buffers: */ + for (n = 0; n < num_buffers; n++) { + pool->buffers[n] = gst_v4l2_buffer_new (pool, n, caps); + if (!pool->buffers[n]) + goto buffer_new_failed; + pool->num_live_buffers++; + g_async_queue_push (pool->avail_buffers, pool->buffers[n]); + } + + return pool; + + /* ERRORS */ +dup_failed: + { + gint errnosave = errno; + + gst_mini_object_unref (GST_MINI_OBJECT (pool)); + + errno = errnosave; + + return NULL; + } +reqbufs_failed: + { + GstV4l2Object *v4l2object = get_v4l2_object (v4l2elem); + GST_ELEMENT_ERROR (v4l2elem, RESOURCE, READ, + (_("Could not get buffers from device '%s'."), + v4l2object->videodev), + ("error requesting %d buffers: %s", num_buffers, g_strerror (errno))); + return NULL; + } +no_buffers: + { + GstV4l2Object *v4l2object = get_v4l2_object (v4l2elem); + GST_ELEMENT_ERROR (v4l2elem, RESOURCE, READ, + (_("Could not get enough buffers from device '%s'."), + v4l2object->videodev), + ("we received %d from device '%s', we want at least %d", + breq.count, v4l2object->videodev, GST_V4L2_MIN_BUFFERS)); + return NULL; + } +buffer_new_failed: + { + gint errnosave = errno; + + gst_v4l2_buffer_pool_destroy (pool); + + errno = errnosave; + + return NULL; + } +} + +/** + * gst_v4l2_buffer_pool_destroy: + * @pool: the pool + * + * Free all resources in the pool and the pool itself. + */ +void +gst_v4l2_buffer_pool_destroy (GstV4l2BufferPool * pool) +{ + gint n; + + GST_V4L2_BUFFER_POOL_LOCK (pool); + pool->running = FALSE; + GST_V4L2_BUFFER_POOL_UNLOCK (pool); + + GST_DEBUG_OBJECT (pool->v4l2elem, "destroy pool"); + + /* after this point, no more buffers will be queued or dequeued; no buffer + * from pool->buffers that is NULL will be set to a buffer, and no buffer that + * is not NULL will be pushed out. */ + + /* miniobjects have no dispose, so they can't break ref-cycles, as buffers ref + * the pool, we need to unref the buffer to properly finalize te pool */ + for (n = 0; n < pool->buffer_count; n++) { + GstBuffer *buf; + + GST_V4L2_BUFFER_POOL_LOCK (pool); + buf = GST_BUFFER (pool->buffers[n]); + GST_V4L2_BUFFER_POOL_UNLOCK (pool); + + if (buf) + /* we own the ref if the buffer is in pool->buffers; drop it. */ + gst_buffer_unref (buf); + } + + gst_mini_object_unref (GST_MINI_OBJECT (pool)); +} + +/** + * gst_v4l2_buffer_pool_get: + * @pool: the "this" object + * @blocking: should this call suspend until there is a buffer available + * in the buffer pool? + * + * Get an available buffer in the pool + */ +GstV4l2Buffer * +gst_v4l2_buffer_pool_get (GstV4l2BufferPool * pool, gboolean blocking) +{ + GstV4l2Buffer *buf; + + if (blocking) { + buf = g_async_queue_pop (pool->avail_buffers); + } else { + buf = g_async_queue_try_pop (pool->avail_buffers); + } + + if (buf) { + GST_V4L2_BUFFER_POOL_LOCK (pool); + GST_BUFFER_SIZE (buf) = buf->vbuffer.length; + GST_BUFFER_FLAG_UNSET (buf, 0xffffffff); + GST_V4L2_BUFFER_POOL_UNLOCK (pool); + } + + pool->running = TRUE; + + return buf; +} + + +/** + * gst_v4l2_buffer_pool_qbuf: + * @pool: the pool + * @buf: the buffer to queue + * + * Queue a buffer to the driver + * + * Returns: %TRUE for success + */ +gboolean +gst_v4l2_buffer_pool_qbuf (GstV4l2BufferPool * pool, GstV4l2Buffer * buf) +{ + GST_LOG_OBJECT (pool->v4l2elem, "enqueue pool buffer %d", buf->vbuffer.index); + + if (v4l2_ioctl (pool->video_fd, VIDIOC_QBUF, &buf->vbuffer) < 0) + return FALSE; + + pool->num_live_buffers--; + GST_DEBUG_OBJECT (pool->v4l2elem, "num_live_buffers--: %d", + pool->num_live_buffers); + + return TRUE; +} + +/** + * gst_v4l2_buffer_pool_dqbuf: + * @pool: the pool + * + * Dequeue a buffer from the driver. Some generic error handling is done in + * this function, but any error handling specific to v4l2src (capture) or + * v4l2sink (output) can be done outside this function by checking 'errno' + * + * Returns: a buffer + */ +GstV4l2Buffer * +gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool) +{ + GstV4l2Object *v4l2object = get_v4l2_object (pool->v4l2elem); + GstV4l2Buffer *pool_buffer; + struct v4l2_buffer buffer; + + memset (&buffer, 0x00, sizeof (buffer)); + buffer.type = pool->type; + buffer.memory = V4L2_MEMORY_MMAP; + + + if (v4l2_ioctl (pool->video_fd, VIDIOC_DQBUF, &buffer) >= 0) { + + GST_V4L2_BUFFER_POOL_LOCK (pool); + + /* get our GstBuffer with that index from the pool, if the buffer was + * outstanding we have a serious problem. + */ + pool_buffer = pool->buffers[buffer.index]; + + if (pool_buffer == NULL) { + GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, FAILED, + (_("Failed trying to get video frames from device '%s'."), + v4l2object->videodev), + (_("No free buffers found in the pool at index %d."), buffer.index)); + GST_V4L2_BUFFER_POOL_UNLOCK (pool); + return NULL; + } + + GST_LOG_OBJECT (pool->v4l2elem, + "grabbed frame %d (ix=%d), flags %08x, pool-ct=%d, buffer=%p", + buffer.sequence, buffer.index, buffer.flags, pool->num_live_buffers, + pool_buffer); + + pool->num_live_buffers++; + GST_DEBUG_OBJECT (pool->v4l2elem, "num_live_buffers++: %d", + pool->num_live_buffers); + + /* set top/bottom field first if v4l2_buffer has the information */ + if (buffer.field == V4L2_FIELD_INTERLACED_TB) + GST_BUFFER_FLAG_SET (pool_buffer, GST_VIDEO_BUFFER_TFF); + if (buffer.field == V4L2_FIELD_INTERLACED_BT) + GST_BUFFER_FLAG_UNSET (pool_buffer, GST_VIDEO_BUFFER_TFF); + + /* this can change at every frame, esp. with jpeg */ + GST_BUFFER_SIZE (pool_buffer) = buffer.bytesused; + + GST_V4L2_BUFFER_POOL_UNLOCK (pool); + + return pool_buffer; + } + + + GST_WARNING_OBJECT (pool->v4l2elem, + "problem grabbing frame %d (ix=%d), pool-ct=%d, buf.flags=%d", + buffer.sequence, buffer.index, + GST_MINI_OBJECT_REFCOUNT (pool), buffer.flags); + + switch (errno) { + case EAGAIN: + GST_WARNING_OBJECT (pool->v4l2elem, + "Non-blocking I/O has been selected using O_NONBLOCK and" + " no buffer was in the outgoing queue. device %s", + v4l2object->videodev); + break; + case EINVAL: + GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, FAILED, + (_("Failed trying to get video frames from device '%s'."), + v4l2object->videodev), + (_("The buffer type is not supported, or the index is out of bounds," + " or no buffers have been allocated yet, or the userptr" + " or length are invalid. device %s"), v4l2object->videodev)); + break; + case ENOMEM: + GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, FAILED, + (_("Failed trying to get video frames from device '%s'. Not enough memory."), v4l2object->videodev), (_("insufficient memory to enqueue a user pointer buffer. device %s."), v4l2object->videodev)); + break; + case EIO: + GST_INFO_OBJECT (pool->v4l2elem, + "VIDIOC_DQBUF failed due to an internal error." + " Can also indicate temporary problems like signal loss." + " Note the driver might dequeue an (empty) buffer despite" + " returning an error, or even stop capturing." + " device %s", v4l2object->videodev); + /* have we de-queued a buffer ? */ + if (!(buffer.flags & (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))) { + GST_DEBUG_OBJECT (pool->v4l2elem, "reenqueing buffer"); + /* FIXME ... should we do something here? */ + } + break; + case EINTR: + GST_WARNING_OBJECT (pool->v4l2elem, + "could not sync on a buffer on device %s", v4l2object->videodev); + break; + default: + GST_WARNING_OBJECT (pool->v4l2elem, + "Grabbing frame got interrupted on %s unexpectedly. %d: %s.", + v4l2object->videodev, errno, g_strerror (errno)); + break; + } + + return NULL; +} + +/** + * gst_v4l2_buffer_pool_available_buffers: + * @pool: the pool + * + * Check the number of buffers available to the driver, ie. buffers that + * have been QBUF'd but not yet DQBUF'd. + * + * Returns: the number of buffers available. + */ +gint +gst_v4l2_buffer_pool_available_buffers (GstV4l2BufferPool * pool) +{ + return pool->buffer_count - pool->num_live_buffers; +} diff --git a/sys/v4l2/gstv4l2bufferpool.h b/sys/v4l2/gstv4l2bufferpool.h new file mode 100644 index 0000000..caad9ac --- /dev/null +++ b/sys/v4l2/gstv4l2bufferpool.h @@ -0,0 +1,97 @@ +/* GStreamer + * + * Copyright (C) 2001-2002 Ronald Bultje + * 2006 Edgard Lima + * 2009 Texas Instruments, Inc - http://www.ti.com/ + * + * gstv4l2bufferpool.h V4L2 buffer pool class + * + * 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 __GSTV4L2BUFFER_H__ +#define __GSTV4L2BUFFER_H__ + +#include +#include "v4l2_calls.h" + +GST_DEBUG_CATEGORY_EXTERN (v4l2buffer_debug); + +G_BEGIN_DECLS + + +GType gst_v4l2_buffer_get_type (void); +#define GST_TYPE_V4L2_BUFFER (gst_v4l2_buffer_get_type()) +#define GST_IS_V4L2_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_BUFFER)) +#define GST_V4L2_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_BUFFER, GstV4l2Buffer)) + +GType gst_v4l2_buffer_pool_get_type (void); +#define GST_TYPE_V4L2_BUFFER_POOL (gst_v4l2_buffer_pool_get_type()) +#define GST_IS_V4L2_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_BUFFER_POOL)) +#define GST_V4L2_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_BUFFER_POOL, GstV4l2BufferPool)) + + + +typedef struct _GstV4l2BufferPool GstV4l2BufferPool; +typedef struct _GstV4l2Buffer GstV4l2Buffer; + + +struct _GstV4l2BufferPool +{ + GstMiniObject parent; + + GstElement *v4l2elem; /* the v4l2 src/sink that owns us.. maybe we should be owned by v4l2object? */ + gboolean requeuebuf; /* if true, unusued buffers are automatically re-QBUF'd */ + enum v4l2_buf_type type; /* V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_BUF_TYPE_VIDEO_OUTPUT */ + + GMutex *lock; + gboolean running; /* with lock */ + gint num_live_buffers; /* number of buffers not with driver */ + GAsyncQueue* avail_buffers;/* pool of available buffers, not with the driver and which aren't held outside the bufferpool */ + gint video_fd; /* a dup(2) of the v4l2object's video_fd */ + guint buffer_count; + GstV4l2Buffer **buffers; +}; + +struct _GstV4l2Buffer { + GstBuffer buffer; + + struct v4l2_buffer vbuffer; + + /* FIXME: have GstV4l2Src* instead, as this has GstV4l2BufferPool* */ + /* FIXME: do we really want to fix this if GstV4l2Buffer/Pool is shared + * between v4l2src and v4l2sink?? + */ + GstV4l2BufferPool *pool; +}; + +void gst_v4l2_buffer_pool_destroy (GstV4l2BufferPool * pool); +GstV4l2BufferPool *gst_v4l2_buffer_pool_new (GstElement *v4l2elem, gint fd, gint num_buffers, GstCaps * caps, gboolean requeuebuf, enum v4l2_buf_type type); + + +GstV4l2Buffer *gst_v4l2_buffer_pool_get (GstV4l2BufferPool *pool, gboolean blocking); +gboolean gst_v4l2_buffer_pool_qbuf (GstV4l2BufferPool *pool, GstV4l2Buffer *buf); +GstV4l2Buffer *gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool *pool); + +gint gst_v4l2_buffer_pool_available_buffers (GstV4l2BufferPool *pool); + + +#define GST_V4L2_BUFFER_POOL_LOCK(pool) g_mutex_lock ((pool)->lock) +#define GST_V4L2_BUFFER_POOL_UNLOCK(pool) g_mutex_unlock ((pool)->lock) + +G_END_DECLS + +#endif /* __GSTV4L2BUFFER_H__ */ diff --git a/sys/v4l2/gstv4l2colorbalance.c b/sys/v4l2/gstv4l2colorbalance.c new file mode 100644 index 0000000..f5cde09 --- /dev/null +++ b/sys/v4l2/gstv4l2colorbalance.c @@ -0,0 +1,106 @@ +/* GStreamer + * + * Copyright (C) 2003 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2colorbalance.c: color balance interface implementation for V4L2 + * + * 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 +#include "gstv4l2colorbalance.h" +#include "gstv4l2object.h" + +GST_BOILERPLATE (GstV4l2ColorBalanceChannel, + gst_v4l2_color_balance_channel, + GstColorBalanceChannel, GST_TYPE_COLOR_BALANCE_CHANNEL); + +static void +gst_v4l2_color_balance_channel_base_init (gpointer g_class) +{ +} + +static void +gst_v4l2_color_balance_channel_class_init (GstV4l2ColorBalanceChannelClass * + klass) +{ +} + +static void +gst_v4l2_color_balance_channel_init (GstV4l2ColorBalanceChannel * channel, + GstV4l2ColorBalanceChannelClass * klass) +{ + channel->id = (guint32) - 1; +} + +static G_GNUC_UNUSED gboolean +gst_v4l2_color_balance_contains_channel (GstV4l2Object * v4l2object, + GstV4l2ColorBalanceChannel * v4l2channel) +{ + const GList *item; + + for (item = v4l2object->colors; item != NULL; item = item->next) + if (item->data == v4l2channel) + return TRUE; + + return FALSE; +} + +const GList * +gst_v4l2_color_balance_list_channels (GstV4l2Object * v4l2object) +{ + return v4l2object->colors; +} + +void +gst_v4l2_color_balance_set_value (GstV4l2Object * v4l2object, + GstColorBalanceChannel * channel, gint value) +{ + + GstV4l2ColorBalanceChannel *v4l2channel = + GST_V4L2_COLOR_BALANCE_CHANNEL (channel); + + /* assert that we're opened and that we're using a known item */ + g_return_if_fail (GST_V4L2_IS_OPEN (v4l2object)); + g_return_if_fail (gst_v4l2_color_balance_contains_channel (v4l2object, + v4l2channel)); + + gst_v4l2_set_attribute (v4l2object, v4l2channel->id, value); +} + +gint +gst_v4l2_color_balance_get_value (GstV4l2Object * v4l2object, + GstColorBalanceChannel * channel) +{ + GstV4l2ColorBalanceChannel *v4l2channel = + GST_V4L2_COLOR_BALANCE_CHANNEL (channel); + gint value; + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), 0); + g_return_val_if_fail (gst_v4l2_color_balance_contains_channel (v4l2object, + v4l2channel), 0); + + if (!gst_v4l2_get_attribute (v4l2object, v4l2channel->id, &value)) + return 0; + + return value; +} diff --git a/sys/v4l2/gstv4l2colorbalance.h b/sys/v4l2/gstv4l2colorbalance.h new file mode 100644 index 0000000..9e183f0 --- /dev/null +++ b/sys/v4l2/gstv4l2colorbalance.h @@ -0,0 +1,104 @@ +/* GStreamer + * + * Copyright (C) 2003 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2colorbalance.h: color balance interface implementation for V4L2 + * + * 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_V4L2_COLOR_BALANCE_H__ +#define __GST_V4L2_COLOR_BALANCE_H__ + +#include +#include +#include "v4l2_calls.h" + +G_BEGIN_DECLS + +#define GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL \ + (gst_v4l2_color_balance_channel_get_type ()) +#define GST_V4L2_COLOR_BALANCE_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL, \ + GstV4l2ColorBalanceChannel)) +#define GST_V4L2_COLOR_BALANCE_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL, \ + GstV4l2ColorBalanceChannelClass)) +#define GST_IS_V4L2_COLOR_BALANCE_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL)) +#define GST_IS_V4L2_COLOR_BALANCE_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL)) + +typedef struct _GstV4l2ColorBalanceChannel { + GstColorBalanceChannel parent; + + guint32 id; +} GstV4l2ColorBalanceChannel; + +typedef struct _GstV4l2ColorBalanceChannelClass { + GstColorBalanceChannelClass parent; +} GstV4l2ColorBalanceChannelClass; + +GType gst_v4l2_color_balance_channel_get_type (void); + +const GList * gst_v4l2_color_balance_list_channels (GstV4l2Object * v4l2object); + +void gst_v4l2_color_balance_set_value (GstV4l2Object * v4l2object, + GstColorBalanceChannel * channel, + gint value); + +gint gst_v4l2_color_balance_get_value (GstV4l2Object * v4l2object, + GstColorBalanceChannel * channel); + +#define GST_IMPLEMENT_V4L2_COLOR_BALANCE_METHODS(Type, interface_as_function) \ + \ +static const GList * \ +interface_as_function ## _color_balance_list_channels (GstColorBalance * balance) \ +{ \ + Type *this = (Type*) balance; \ + return gst_v4l2_color_balance_list_channels(this->v4l2object); \ +} \ + \ +static void \ +interface_as_function ## _color_balance_set_value (GstColorBalance * balance, \ + GstColorBalanceChannel * channel, \ + gint value) \ +{ \ + Type *this = (Type*) balance; \ + gst_v4l2_color_balance_set_value(this->v4l2object, channel, value); \ +} \ + \ +static gint \ +interface_as_function ## _color_balance_get_value (GstColorBalance * balance, \ + GstColorBalanceChannel * channel) \ +{ \ + Type *this = (Type*) balance; \ + return gst_v4l2_color_balance_get_value(this->v4l2object, channel); \ +} \ + \ +static void \ +interface_as_function ## _color_balance_interface_init (GstColorBalanceClass * klass) \ +{ \ + GST_COLOR_BALANCE_TYPE (klass) = GST_COLOR_BALANCE_HARDWARE; \ + \ + /* default virtual functions */ \ + klass->list_channels = interface_as_function ## _color_balance_list_channels; \ + klass->set_value = interface_as_function ## _color_balance_set_value; \ + klass->get_value = interface_as_function ## _color_balance_get_value; \ +} \ + +#endif /* __GST_V4L2_COLOR_BALANCE_H__ */ diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c new file mode 100644 index 0000000..81d1cb7 --- /dev/null +++ b/sys/v4l2/gstv4l2object.c @@ -0,0 +1,2247 @@ +/* GStreamer + * + * Copyright (C) 2001-2002 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2object.c: base class for V4L2 elements + * + * 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 +#endif + +#include +#include +#include +#include +#include + +#ifdef HAVE_GUDEV +#include +#endif + +#include "v4l2_calls.h" +#include "gstv4l2tuner.h" +#ifdef HAVE_XVIDEO +#include "gstv4l2xoverlay.h" +#endif +#include "gstv4l2colorbalance.h" + +#include "gst/gst-i18n-plugin.h" + +/* videodev2.h is not versioned and we can't easily check for the presence + * of enum values at compile time, but the V4L2_CAP_VIDEO_OUTPUT_OVERLAY define + * was added in the same commit as V4L2_FIELD_INTERLACED_{TB,BT} (b2787845) */ +#ifndef V4L2_CAP_VIDEO_OUTPUT_OVERLAY +#define V4L2_FIELD_INTERLACED_TB 8 +#define V4L2_FIELD_INTERLACED_BT 9 +#endif + +GST_DEBUG_CATEGORY_EXTERN (v4l2_debug); +#define GST_CAT_DEFAULT v4l2_debug + + +#define DEFAULT_PROP_DEVICE_NAME NULL +#define DEFAULT_PROP_DEVICE_FD -1 +#define DEFAULT_PROP_FLAGS 0 +#define DEFAULT_PROP_TV_NORM 0 +#define DEFAULT_PROP_CHANNEL NULL +#define DEFAULT_PROP_FREQUENCY 0 + +enum +{ + PROP_0, + V4L2_STD_OBJECT_PROPS, +}; + +G_LOCK_DEFINE_STATIC (probe_lock); + +const GList * +gst_v4l2_probe_get_properties (GstPropertyProbe * probe) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS (probe); + static GList *list = NULL; + + /* well, not perfect, but better than no locking at all. + * In the worst case we leak a list node, so who cares? */ + G_LOCK (probe_lock); + + if (!list) { + list = g_list_append (NULL, g_object_class_find_property (klass, "device")); + } + + G_UNLOCK (probe_lock); + + return list; +} + +static gboolean init = FALSE; +static GList *devices = NULL; + +#ifdef HAVE_GUDEV +static gboolean +gst_v4l2_class_probe_devices_with_udev (GstElementClass * klass, gboolean check, + GList ** klass_devices) +{ + GUdevClient *client = NULL; + GList *item; + + if (!check) { + while (devices) { + gchar *device = devices->data; + devices = g_list_remove (devices, device); + g_free (device); + } + + GST_INFO ("Enumerating video4linux devices from udev"); + client = g_udev_client_new (NULL); + if (!client) { + GST_WARNING ("Failed to initialize gudev client"); + goto finish; + } + + item = g_udev_client_query_by_subsystem (client, "video4linux"); + while (item) { + GUdevDevice *device = item->data; + gchar *devnode = g_strdup (g_udev_device_get_device_file (device)); + gint api = g_udev_device_get_property_as_int (device, "ID_V4L_VERSION"); + GST_INFO ("Found new device: %s, API: %d", devnode, api); + /* Append v4l2 devices only. If api is 0 probably v4l_id has + been stripped out of the current udev installation, append + anyway */ + if (api == 0) { + GST_WARNING + ("Couldn't retrieve ID_V4L_VERSION, silly udev installation?"); + } + if ((api == 2 || api == 0)) { + devices = g_list_append (devices, devnode); + } else { + g_free (devnode); + } + g_object_unref (device); + item = item->next; + } + g_list_free (item); + init = TRUE; + } + +finish: + if (client) { + g_object_unref (client); + } + + *klass_devices = devices; + + return init; +} +#endif /* HAVE_GUDEV */ + +static gboolean +gst_v4l2_class_probe_devices (GstElementClass * klass, gboolean check, + GList ** klass_devices) +{ + if (!check) { + const gchar *dev_base[] = { "/dev/video", "/dev/v4l2/video", NULL }; + gint base, n, fd; + + while (devices) { + gchar *device = devices->data; + devices = g_list_remove (devices, device); + g_free (device); + } + + /* + * detect /dev entries + */ + for (n = 0; n < 64; n++) { + for (base = 0; dev_base[base] != NULL; base++) { + struct stat s; + gchar *device = g_strdup_printf ("%s%d", + dev_base[base], + n); + + /* + * does the /dev/ entry exist at all? + */ + if (stat (device, &s) == 0) { + /* + * yes: is a device attached? + */ + if (S_ISCHR (s.st_mode)) { + + if ((fd = open (device, O_RDWR | O_NONBLOCK)) > 0 || errno == EBUSY) { + if (fd > 0) + close (fd); + + devices = g_list_append (devices, device); + break; + } + } + } + g_free (device); + } + } + init = TRUE; + } + + *klass_devices = devices; + + return init; +} + +void +gst_v4l2_probe_probe_property (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec, GList ** klass_devices) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); + + switch (prop_id) { + case PROP_DEVICE: +#ifdef HAVE_GUDEV + if (!gst_v4l2_class_probe_devices_with_udev (klass, FALSE, klass_devices)) + gst_v4l2_class_probe_devices (klass, FALSE, klass_devices); +#else /* !HAVE_GUDEV */ + gst_v4l2_class_probe_devices (klass, FALSE, klass_devices); +#endif /* HAVE_GUDEV */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } +} + +gboolean +gst_v4l2_probe_needs_probe (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec, GList ** klass_devices) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); + gboolean ret = FALSE; + + switch (prop_id) { + case PROP_DEVICE: +#ifdef HAVE_GUDEV + ret = + !gst_v4l2_class_probe_devices_with_udev (klass, FALSE, klass_devices); +#else /* !HAVE_GUDEV */ + ret = !gst_v4l2_class_probe_devices (klass, TRUE, klass_devices); +#endif /* HAVE_GUDEV */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + return ret; +} + +static GValueArray * +gst_v4l2_class_list_devices (GstElementClass * klass, GList ** klass_devices) +{ + GValueArray *array; + GValue value = { 0 }; + GList *item; + + if (!*klass_devices) + return NULL; + + array = g_value_array_new (g_list_length (*klass_devices)); + item = *klass_devices; + g_value_init (&value, G_TYPE_STRING); + while (item) { + gchar *device = item->data; + + g_value_set_string (&value, device); + g_value_array_append (array, &value); + + item = item->next; + } + g_value_unset (&value); + + return array; +} + +GValueArray * +gst_v4l2_probe_get_values (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec, GList ** klass_devices) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); + GValueArray *array = NULL; + + switch (prop_id) { + case PROP_DEVICE: + array = gst_v4l2_class_list_devices (klass, klass_devices); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + + return array; +} + +#define GST_TYPE_V4L2_DEVICE_FLAGS (gst_v4l2_device_get_type ()) +static GType +gst_v4l2_device_get_type (void) +{ + static GType v4l2_device_type = 0; + + if (v4l2_device_type == 0) { + static const GFlagsValue values[] = { + {V4L2_CAP_VIDEO_CAPTURE, "Device supports video capture", "capture"}, + {V4L2_CAP_VIDEO_OUTPUT, "Device supports video playback", "output"}, + {V4L2_CAP_VIDEO_OVERLAY, "Device supports video overlay", "overlay"}, + + {V4L2_CAP_VBI_CAPTURE, "Device supports the VBI capture", "vbi-capture"}, + {V4L2_CAP_VBI_OUTPUT, "Device supports the VBI output", "vbi-output"}, + + {V4L2_CAP_TUNER, "Device has a tuner or modulator", "tuner"}, + {V4L2_CAP_AUDIO, "Device has audio inputs or outputs", "audio"}, + + {0, NULL, NULL} + }; + + v4l2_device_type = + g_flags_register_static ("GstV4l2DeviceTypeFlags", values); + } + + return v4l2_device_type; +} + +#define GST_TYPE_V4L2_TV_NORM (gst_v4l2_tv_norm_get_type ()) +static GType +gst_v4l2_tv_norm_get_type (void) +{ + static GType v4l2_tv_norm = 0; + + if (!v4l2_tv_norm) { + static const GEnumValue tv_norms[] = { + {0, "none", "none"}, + + {V4L2_STD_NTSC, "NTSC", "NTSC"}, + {V4L2_STD_NTSC_M, "NTSC-M", "NTSC-M"}, + {V4L2_STD_NTSC_M_JP, "NTSC-M-JP", "NTSC-M-JP"}, + {V4L2_STD_NTSC_M_KR, "NTSC-M-KR", "NTSC-M-KR"}, + {V4L2_STD_NTSC_443, "NTSC-443", "NTSC-443"}, + + {V4L2_STD_PAL, "PAL", "PAL"}, + {V4L2_STD_PAL_BG, "PAL-BG", "PAL-BG"}, + {V4L2_STD_PAL_B, "PAL-B", "PAL-B"}, + {V4L2_STD_PAL_B1, "PAL-B1", "PAL-B1"}, + {V4L2_STD_PAL_G, "PAL-G", "PAL-G"}, + {V4L2_STD_PAL_H, "PAL-H", "PAL-H"}, + {V4L2_STD_PAL_I, "PAL-I", "PAL-I"}, + {V4L2_STD_PAL_DK, "PAL-DK", "PAL-DK"}, + {V4L2_STD_PAL_D, "PAL-D", "PAL-D"}, + {V4L2_STD_PAL_D1, "PAL-D1", "PAL-D1"}, + {V4L2_STD_PAL_K, "PAL-K", "PAL-K"}, + {V4L2_STD_PAL_M, "PAL-M", "PAL-M"}, + {V4L2_STD_PAL_N, "PAL-N", "PAL-N"}, + {V4L2_STD_PAL_Nc, "PAL-Nc", "PAL-Nc"}, + {V4L2_STD_PAL_60, "PAL-60", "PAL-60"}, + + {V4L2_STD_SECAM, "SECAM", "SECAM"}, + {V4L2_STD_SECAM_B, "SECAM-B", "SECAM-B"}, + {V4L2_STD_SECAM_G, "SECAM-G", "SECAM-G"}, + {V4L2_STD_SECAM_H, "SECAM-H", "SECAM-H"}, + {V4L2_STD_SECAM_DK, "SECAM-DK", "SECAM-DK"}, + {V4L2_STD_SECAM_D, "SECAM-D", "SECAM-D"}, + {V4L2_STD_SECAM_K, "SECAM-K", "SECAM-K"}, + {V4L2_STD_SECAM_K1, "SECAM-K1", "SECAM-K1"}, + {V4L2_STD_SECAM_L, "SECAM-L", "SECAM-L"}, + {V4L2_STD_SECAM_LC, "SECAM-Lc", "SECAM-Lc"}, + + {0, NULL, NULL} + }; + + v4l2_tv_norm = g_enum_register_static ("V4L2_TV_norms", tv_norms); + } + + return v4l2_tv_norm; +} + +void +gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class, + const char *default_device) +{ + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", "Device location", + default_device, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Name of the device", DEFAULT_PROP_DEVICE_NAME, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DEVICE_FD, + g_param_spec_int ("device-fd", "File descriptor", + "File descriptor of the device", -1, G_MAXINT, DEFAULT_PROP_DEVICE_FD, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_FLAGS, + g_param_spec_flags ("flags", "Flags", "Device type flags", + GST_TYPE_V4L2_DEVICE_FLAGS, DEFAULT_PROP_FLAGS, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GstV4l2Src:brightness + * + * Picture brightness, or more precisely, the black level + * + * Since: 0.10.26 + */ + g_object_class_install_property (gobject_class, PROP_BRIGHTNESS, + g_param_spec_int ("brightness", "Brightness", + "Picture brightness, or more precisely, the black level", G_MININT, + G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + /** + * GstV4l2Src:contrast + * + * Picture contrast or luma gain + * + * Since: 0.10.26 + */ + g_object_class_install_property (gobject_class, PROP_CONTRAST, + g_param_spec_int ("contrast", "Contrast", + "Picture contrast or luma gain", G_MININT, + G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + /** + * GstV4l2Src:saturation + * + * Picture color saturation or chroma gain + * + * Since: 0.10.26 + */ + g_object_class_install_property (gobject_class, PROP_SATURATION, + g_param_spec_int ("saturation", "Saturation", + "Picture color saturation or chroma gain", G_MININT, + G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + /** + * GstV4l2Src:hue + * + * Hue or color balance + * + * Since: 0.10.26 + */ + g_object_class_install_property (gobject_class, PROP_HUE, + g_param_spec_int ("hue", "Hue", + "Hue or color balance", G_MININT, + G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + /** + * GstV4l2Src:norm + * + * TV norm + * + * Since: 0.10.31 + */ + g_object_class_install_property (gobject_class, PROP_TV_NORM, + g_param_spec_enum ("norm", "TV norm", + "video standard", + GST_TYPE_V4L2_TV_NORM, DEFAULT_PROP_TV_NORM, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +GstV4l2Object * +gst_v4l2_object_new (GstElement * element, + enum v4l2_buf_type type, + const char *default_device, + GstV4l2GetInOutFunction get_in_out_func, + GstV4l2SetInOutFunction set_in_out_func, + GstV4l2UpdateFpsFunction update_fps_func) +{ + GstV4l2Object *v4l2object; + + /* + * some default values + */ + v4l2object = g_new0 (GstV4l2Object, 1); + + v4l2object->type = type; + v4l2object->formats = NULL; + + v4l2object->element = element; + v4l2object->get_in_out_func = get_in_out_func; + v4l2object->set_in_out_func = set_in_out_func; + v4l2object->update_fps_func = update_fps_func; + + v4l2object->video_fd = -1; + v4l2object->poll = gst_poll_new (TRUE); + v4l2object->buffer = NULL; + v4l2object->videodev = g_strdup (default_device); + + v4l2object->norms = NULL; + v4l2object->channels = NULL; + v4l2object->colors = NULL; + + v4l2object->xwindow_id = 0; + + return v4l2object; +} + +static gboolean gst_v4l2_object_clear_format_list (GstV4l2Object * v4l2object); + + +void +gst_v4l2_object_destroy (GstV4l2Object * v4l2object) +{ + g_return_if_fail (v4l2object != NULL); + + if (v4l2object->videodev) + g_free (v4l2object->videodev); + + if (v4l2object->poll) + gst_poll_free (v4l2object->poll); + + if (v4l2object->channel) + g_free (v4l2object->channel); + + if (v4l2object->formats) { + gst_v4l2_object_clear_format_list (v4l2object); + } + + g_free (v4l2object); +} + + +static gboolean +gst_v4l2_object_clear_format_list (GstV4l2Object * v4l2object) +{ + g_slist_foreach (v4l2object->formats, (GFunc) g_free, NULL); + g_slist_free (v4l2object->formats); + v4l2object->formats = NULL; + + return TRUE; +} + +static gint +gst_v4l2_object_prop_to_cid (guint prop_id) +{ + gint cid = -1; + + switch (prop_id) { + case PROP_BRIGHTNESS: + cid = V4L2_CID_BRIGHTNESS; + break; + case PROP_CONTRAST: + cid = V4L2_CID_CONTRAST; + break; + case PROP_SATURATION: + cid = V4L2_CID_SATURATION; + break; + case PROP_HUE: + cid = V4L2_CID_HUE; + break; + default: + GST_WARNING ("unmapped property id: %d", prop_id); + } + return cid; +} + + +gboolean +gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + switch (prop_id) { + case PROP_DEVICE: + g_free (v4l2object->videodev); + v4l2object->videodev = g_value_dup_string (value); + break; + case PROP_BRIGHTNESS: + case PROP_CONTRAST: + case PROP_SATURATION: + case PROP_HUE: + { + gint cid = gst_v4l2_object_prop_to_cid (prop_id); + + if (cid != -1) { + if (GST_V4L2_IS_OPEN (v4l2object)) { + gst_v4l2_set_attribute (v4l2object, cid, g_value_get_int (value)); + } + } + return TRUE; + } + break; + case PROP_TV_NORM: + v4l2object->tv_norm = g_value_get_enum (value); + break; +#if 0 + case PROP_CHANNEL: + if (GST_V4L2_IS_OPEN (v4l2object)) { + GstTuner *tuner = GST_TUNER (v4l2object->element); + GstTunerChannel *channel = gst_tuner_find_channel_by_name (tuner, + (gchar *) g_value_get_string (value)); + + if (channel) { + /* like gst_tuner_set_channel (tuner, channel) + without g_object_notify */ + gst_v4l2_tuner_set_channel (v4l2object, channel); + } + } else { + g_free (v4l2object->channel); + v4l2object->channel = g_value_dup_string (value); + } + break; + case PROP_FREQUENCY: + if (GST_V4L2_IS_OPEN (v4l2object)) { + GstTuner *tuner = GST_TUNER (v4l2object->element); + GstTunerChannel *channel = gst_tuner_get_channel (tuner); + + if (channel && + GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { + /* like + gst_tuner_set_frequency (tuner, channel, g_value_get_ulong (value)) + without g_object_notify */ + gst_v4l2_tuner_set_frequency (v4l2object, channel, + g_value_get_ulong (value)); + } + } else { + v4l2object->frequency = g_value_get_ulong (value); + } + break; +#endif + default: + return FALSE; + break; + } + return TRUE; +} + + +gboolean +gst_v4l2_object_get_property_helper (GstV4l2Object * v4l2object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + switch (prop_id) { + case PROP_DEVICE: + g_value_set_string (value, v4l2object->videodev); + break; + case PROP_DEVICE_NAME: + { + const guchar *new = NULL; + + if (GST_V4L2_IS_OPEN (v4l2object)) { + new = v4l2object->vcap.card; + } else if (gst_v4l2_open (v4l2object)) { + new = v4l2object->vcap.card; + gst_v4l2_close (v4l2object); + } + g_value_set_string (value, (gchar *) new); + break; + } + case PROP_DEVICE_FD: + { + if (GST_V4L2_IS_OPEN (v4l2object)) + g_value_set_int (value, v4l2object->video_fd); + else + g_value_set_int (value, DEFAULT_PROP_DEVICE_FD); + break; + } + case PROP_FLAGS: + { + guint flags = 0; + + if (GST_V4L2_IS_OPEN (v4l2object)) { + flags |= v4l2object->vcap.capabilities & + (V4L2_CAP_VIDEO_CAPTURE | + V4L2_CAP_VIDEO_OUTPUT | + V4L2_CAP_VIDEO_OVERLAY | + V4L2_CAP_VBI_CAPTURE | + V4L2_CAP_VBI_OUTPUT | V4L2_CAP_TUNER | V4L2_CAP_AUDIO); + } + g_value_set_flags (value, flags); + break; + } + case PROP_BRIGHTNESS: + case PROP_CONTRAST: + case PROP_SATURATION: + case PROP_HUE: + { + gint cid = gst_v4l2_object_prop_to_cid (prop_id); + + if (cid != -1) { + if (GST_V4L2_IS_OPEN (v4l2object)) { + gint v; + if (gst_v4l2_get_attribute (v4l2object, cid, &v)) { + g_value_set_int (value, v); + } + } + } + return TRUE; + } + break; + case PROP_TV_NORM: + g_value_set_enum (value, v4l2object->tv_norm); + break; + default: + return FALSE; + break; + } + return TRUE; +} + +static void +gst_v4l2_set_defaults (GstV4l2Object * v4l2object) +{ + GstTunerNorm *norm = NULL; + GstTunerChannel *channel = NULL; + GstTuner *tuner; + + if (!GST_IS_TUNER (v4l2object->element)) + return; + + tuner = GST_TUNER (v4l2object->element); + + if (v4l2object->tv_norm) + norm = gst_v4l2_tuner_get_norm_by_std_id (v4l2object, v4l2object->tv_norm); + GST_DEBUG_OBJECT (v4l2object->element, "tv_norm=0x%" G_GINT64_MODIFIER "x, " + "norm=%p", (guint64) v4l2object->tv_norm, norm); + if (norm) { + gst_tuner_set_norm (tuner, norm); + } else { + norm = + GST_TUNER_NORM (gst_tuner_get_norm (GST_TUNER (v4l2object->element))); + if (norm) { + v4l2object->tv_norm = + gst_v4l2_tuner_get_std_id_by_norm (v4l2object, norm); + gst_tuner_norm_changed (tuner, norm); + } + } + + if (v4l2object->channel) + channel = gst_tuner_find_channel_by_name (tuner, v4l2object->channel); + if (channel) { + gst_tuner_set_channel (tuner, channel); + } else { + channel = + GST_TUNER_CHANNEL (gst_tuner_get_channel (GST_TUNER + (v4l2object->element))); + if (channel) { + g_free (v4l2object->channel); + v4l2object->channel = g_strdup (channel->label); + gst_tuner_channel_changed (tuner, channel); + } + } + + if (channel + && GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { + if (v4l2object->frequency != 0) { + gst_tuner_set_frequency (tuner, channel, v4l2object->frequency); + } else { + v4l2object->frequency = gst_tuner_get_frequency (tuner, channel); + if (v4l2object->frequency == 0) { + /* guess */ + gst_tuner_set_frequency (tuner, channel, 1000); + } else { + } + } + } +} + +gboolean +gst_v4l2_object_start (GstV4l2Object * v4l2object) +{ + if (gst_v4l2_open (v4l2object)) + gst_v4l2_set_defaults (v4l2object); + else + return FALSE; + +#ifdef HAVE_XVIDEO + gst_v4l2_xoverlay_start (v4l2object); +#endif + + return TRUE; +} + +gboolean +gst_v4l2_object_stop (GstV4l2Object * v4l2object) +{ +#ifdef HAVE_XVIDEO + gst_v4l2_xoverlay_stop (v4l2object); +#endif + + if (!gst_v4l2_close (v4l2object)) + return FALSE; + + if (v4l2object->formats) { + gst_v4l2_object_clear_format_list (v4l2object); + } + + return TRUE; +} + + +/* + * common format / caps utilities: + */ +typedef struct +{ + guint32 format; + gboolean dimensions; +} GstV4L2FormatDesc; + +static const GstV4L2FormatDesc gst_v4l2_formats[] = { + /* from Linux 2.6.15 videodev2.h */ + {V4L2_PIX_FMT_RGB332, TRUE}, + {V4L2_PIX_FMT_RGB555, TRUE}, + {V4L2_PIX_FMT_RGB565, TRUE}, + {V4L2_PIX_FMT_RGB555X, TRUE}, + {V4L2_PIX_FMT_RGB565X, TRUE}, + {V4L2_PIX_FMT_BGR24, TRUE}, + {V4L2_PIX_FMT_RGB24, TRUE}, + {V4L2_PIX_FMT_BGR32, TRUE}, + {V4L2_PIX_FMT_RGB32, TRUE}, + {V4L2_PIX_FMT_GREY, TRUE}, + {V4L2_PIX_FMT_YVU410, TRUE}, + {V4L2_PIX_FMT_YVU420, TRUE}, + {V4L2_PIX_FMT_YUYV, TRUE}, + {V4L2_PIX_FMT_UYVY, TRUE}, + {V4L2_PIX_FMT_YUV422P, TRUE}, + {V4L2_PIX_FMT_YUV411P, TRUE}, + {V4L2_PIX_FMT_Y41P, TRUE}, + + /* two planes -- one Y, one Cr + Cb interleaved */ + {V4L2_PIX_FMT_NV12, TRUE}, + {V4L2_PIX_FMT_NV21, TRUE}, + + /* The following formats are not defined in the V4L2 specification */ + {V4L2_PIX_FMT_YUV410, TRUE}, + {V4L2_PIX_FMT_YUV420, TRUE}, + {V4L2_PIX_FMT_YYUV, TRUE}, + {V4L2_PIX_FMT_HI240, TRUE}, + + /* see http://www.siliconimaging.com/RGB%20Bayer.htm */ +#ifdef V4L2_PIX_FMT_SBGGR8 + {V4L2_PIX_FMT_SBGGR8, TRUE}, +#endif + + /* compressed formats */ + {V4L2_PIX_FMT_MJPEG, TRUE}, + {V4L2_PIX_FMT_JPEG, TRUE}, +#ifdef V4L2_PIX_FMT_PJPG + {V4L2_PIX_FMT_PJPG, TRUE}, +#endif + {V4L2_PIX_FMT_DV, TRUE}, + {V4L2_PIX_FMT_MPEG, FALSE}, + + /* Vendor-specific formats */ + {V4L2_PIX_FMT_WNVA, TRUE}, + +#ifdef V4L2_PIX_FMT_SN9C10X + {V4L2_PIX_FMT_SN9C10X, TRUE}, +#endif +#ifdef V4L2_PIX_FMT_PWC1 + {V4L2_PIX_FMT_PWC1, TRUE}, +#endif +#ifdef V4L2_PIX_FMT_PWC2 + {V4L2_PIX_FMT_PWC2, TRUE}, +#endif +#ifdef V4L2_PIX_FMT_YVYU + {V4L2_PIX_FMT_YVYU, TRUE}, +#endif +}; + +#define GST_V4L2_FORMAT_COUNT (G_N_ELEMENTS (gst_v4l2_formats)) + + +static struct v4l2_fmtdesc * +gst_v4l2_object_get_format_from_fourcc (GstV4l2Object * v4l2object, + guint32 fourcc) +{ + struct v4l2_fmtdesc *fmt; + GSList *walk; + + if (fourcc == 0) + return NULL; + + walk = gst_v4l2_object_get_format_list (v4l2object); + while (walk) { + fmt = (struct v4l2_fmtdesc *) walk->data; + if (fmt->pixelformat == fourcc) + return fmt; + /* special case for jpeg */ + if (fmt->pixelformat == V4L2_PIX_FMT_MJPEG || + fmt->pixelformat == V4L2_PIX_FMT_JPEG +#ifdef V4L2_PIX_FMT_PJPG + || fmt->pixelformat == V4L2_PIX_FMT_PJPG +#endif + ) { + if (fourcc == V4L2_PIX_FMT_JPEG || fourcc == V4L2_PIX_FMT_MJPEG +#ifdef V4L2_PIX_FMT_PJPG + || fourcc == V4L2_PIX_FMT_PJPG +#endif + ) { + return fmt; + } + } + walk = g_slist_next (walk); + } + + return NULL; +} + + + +/* complete made up ranking, the values themselves are meaningless */ +/* These ranks MUST be X such that X<<15 fits on a signed int - see + the comment at the end of gst_v4l2_object_format_get_rank. */ +#define YUV_BASE_RANK 1000 +#define JPEG_BASE_RANK 500 +#define DV_BASE_RANK 200 +#define RGB_BASE_RANK 100 +#define YUV_ODD_BASE_RANK 50 +#define RGB_ODD_BASE_RANK 25 +#define BAYER_BASE_RANK 15 +#define S910_BASE_RANK 10 +#define GREY_BASE_RANK 5 +#define PWC_BASE_RANK 1 + +/* This flag is already used by libv4l2 although + * it was added to the Linux kernel in 2.6.32 + */ +#ifndef V4L2_FMT_FLAG_EMULATED +#define V4L2_FMT_FLAG_EMULATED 0x0002 +#endif + +static gint +gst_v4l2_object_format_get_rank (const struct v4l2_fmtdesc *fmt) +{ + guint32 fourcc = fmt->pixelformat; + gboolean emulated = ((fmt->flags & V4L2_FMT_FLAG_EMULATED) != 0); + gint rank = 0; + + switch (fourcc) { + case V4L2_PIX_FMT_MJPEG: +#ifdef V4L2_PIX_FMT_PJPG + case V4L2_PIX_FMT_PJPG: + rank = JPEG_BASE_RANK; + break; +#endif + case V4L2_PIX_FMT_JPEG: + rank = JPEG_BASE_RANK + 1; + break; + case V4L2_PIX_FMT_MPEG: /* MPEG */ + rank = JPEG_BASE_RANK + 2; + break; + + case V4L2_PIX_FMT_RGB332: + case V4L2_PIX_FMT_RGB555: + case V4L2_PIX_FMT_RGB555X: + case V4L2_PIX_FMT_RGB565: + case V4L2_PIX_FMT_RGB565X: + rank = RGB_ODD_BASE_RANK; + break; + + case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: + rank = RGB_BASE_RANK - 1; + break; + + case V4L2_PIX_FMT_RGB32: + case V4L2_PIX_FMT_BGR32: + rank = RGB_BASE_RANK; + break; + + case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ + rank = GREY_BASE_RANK; + break; + + case V4L2_PIX_FMT_NV12: /* 12 Y/CbCr 4:2:0 */ + case V4L2_PIX_FMT_NV21: /* 12 Y/CrCb 4:2:0 */ + case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */ + case V4L2_PIX_FMT_HI240: /* 8 8-bit color */ + rank = YUV_ODD_BASE_RANK; + break; + + case V4L2_PIX_FMT_YVU410: /* YVU9, 9 bits per pixel */ + rank = YUV_BASE_RANK + 3; + break; + case V4L2_PIX_FMT_YUV410: /* YUV9, 9 bits per pixel */ + rank = YUV_BASE_RANK + 2; + break; + case V4L2_PIX_FMT_YUV420: /* I420, 12 bits per pixel */ + rank = YUV_BASE_RANK + 7; + break; + case V4L2_PIX_FMT_YUYV: /* YUY2, 16 bits per pixel */ + rank = YUV_BASE_RANK + 10; + break; + case V4L2_PIX_FMT_YVU420: /* YV12, 12 bits per pixel */ + rank = YUV_BASE_RANK + 6; + break; + case V4L2_PIX_FMT_UYVY: /* UYVY, 16 bits per pixel */ + rank = YUV_BASE_RANK + 9; + break; + case V4L2_PIX_FMT_Y41P: /* Y41P, 12 bits per pixel */ + rank = YUV_BASE_RANK + 5; + break; + case V4L2_PIX_FMT_YUV411P: /* Y41B, 12 bits per pixel */ + rank = YUV_BASE_RANK + 4; + break; + case V4L2_PIX_FMT_YUV422P: /* Y42B, 16 bits per pixel */ + rank = YUV_BASE_RANK + 8; + break; + + case V4L2_PIX_FMT_DV: + rank = DV_BASE_RANK; + break; + + case V4L2_PIX_FMT_WNVA: /* Winnov hw compres */ + rank = 0; + break; + +#ifdef V4L2_PIX_FMT_SBGGR8 + case V4L2_PIX_FMT_SBGGR8: + rank = BAYER_BASE_RANK; + break; +#endif + +#ifdef V4L2_PIX_FMT_SN9C10X + case V4L2_PIX_FMT_SN9C10X: + rank = S910_BASE_RANK; + break; +#endif + +#ifdef V4L2_PIX_FMT_PWC1 + case V4L2_PIX_FMT_PWC1: + rank = PWC_BASE_RANK; + break; +#endif +#ifdef V4L2_PIX_FMT_PWC2 + case V4L2_PIX_FMT_PWC2: + rank = PWC_BASE_RANK; + break; +#endif + + default: + rank = 0; + break; + } + + /* All ranks are below 1<<15 so a shift by 15 + * will a) make all non-emulated formats larger + * than emulated and b) will not overflow + */ + if (!emulated) + rank <<= 15; + + return rank; +} + + + +static gint +format_cmp_func (gconstpointer a, gconstpointer b) +{ + const struct v4l2_fmtdesc *fa = a; + const struct v4l2_fmtdesc *fb = b; + + if (fa->pixelformat == fb->pixelformat) + return 0; + + return gst_v4l2_object_format_get_rank (fb) - + gst_v4l2_object_format_get_rank (fa); +} + +/****************************************************** + * gst_v4l2_object_fill_format_list(): + * create list of supported capture formats + * return value: TRUE on success, FALSE on error + ******************************************************/ +static gboolean +gst_v4l2_object_fill_format_list (GstV4l2Object * v4l2object) +{ + gint n; + struct v4l2_fmtdesc *format; + + GST_DEBUG_OBJECT (v4l2object->element, "getting src format enumerations"); + + /* format enumeration */ + for (n = 0;; n++) { + format = g_new0 (struct v4l2_fmtdesc, 1); + + format->index = n; + format->type = v4l2object->type; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_ENUM_FMT, format) < 0) { + if (errno == EINVAL) { + g_free (format); + break; /* end of enumeration */ + } else { + goto failed; + } + } + + GST_LOG_OBJECT (v4l2object->element, "index: %u", format->index); + GST_LOG_OBJECT (v4l2object->element, "type: %d", format->type); + GST_LOG_OBJECT (v4l2object->element, "flags: %08x", format->flags); + GST_LOG_OBJECT (v4l2object->element, "description: '%s'", + format->description); + GST_LOG_OBJECT (v4l2object->element, "pixelformat: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (format->pixelformat)); + + /* sort formats according to our preference; we do this, because caps + * are probed in the order the formats are in the list, and the order of + * formats in the final probed caps matters for things like fixation */ + v4l2object->formats = g_slist_insert_sorted (v4l2object->formats, format, + (GCompareFunc) format_cmp_func); + } + +#ifndef GST_DISABLE_GST_DEBUG + { + GSList *l; + + GST_INFO_OBJECT (v4l2object->element, "got %d format(s):", n); + for (l = v4l2object->formats; l != NULL; l = l->next) { + format = l->data; + + GST_INFO_OBJECT (v4l2object->element, + " %" GST_FOURCC_FORMAT "%s", GST_FOURCC_ARGS (format->pixelformat), + ((format->flags & V4L2_FMT_FLAG_EMULATED)) ? " (emulated)" : ""); + } + } +#endif + + return TRUE; + + /* ERRORS */ +failed: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to enumerate possible video formats device '%s' can work with"), v4l2object->videodev), ("Failed to get number %d in pixelformat enumeration for %s. (%d - %s)", n, v4l2object->videodev, errno, g_strerror (errno))); + g_free (format); + return FALSE; + } +} + +/* + * Get the list of supported capture formats, a list of + * struct v4l2_fmtdesc. + */ +GSList * +gst_v4l2_object_get_format_list (GstV4l2Object * v4l2object) +{ + if (!v4l2object->formats) + gst_v4l2_object_fill_format_list (v4l2object); + return v4l2object->formats; +} + + +GstStructure * +gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) +{ + GstStructure *structure = NULL; + + switch (fourcc) { + case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */ +#ifdef V4L2_PIX_FMT_PJPG + case V4L2_PIX_FMT_PJPG: /* Progressive-JPEG */ +#endif + case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */ + structure = gst_structure_new ("image/jpeg", NULL); + break; + case V4L2_PIX_FMT_RGB332: + case V4L2_PIX_FMT_RGB555: + case V4L2_PIX_FMT_RGB555X: + case V4L2_PIX_FMT_RGB565: + case V4L2_PIX_FMT_RGB565X: + case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: + case V4L2_PIX_FMT_RGB32: + case V4L2_PIX_FMT_BGR32:{ + guint depth = 0, bpp = 0; + + gint endianness = 0; + + guint32 r_mask = 0, b_mask = 0, g_mask = 0; + + switch (fourcc) { + case V4L2_PIX_FMT_RGB332: + bpp = depth = 8; + endianness = G_BYTE_ORDER; /* 'like, whatever' */ + r_mask = 0xe0; + g_mask = 0x1c; + b_mask = 0x03; + break; + case V4L2_PIX_FMT_RGB555: + case V4L2_PIX_FMT_RGB555X: + bpp = 16; + depth = 15; + endianness = + fourcc == V4L2_PIX_FMT_RGB555X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; + r_mask = 0x7c00; + g_mask = 0x03e0; + b_mask = 0x001f; + break; + case V4L2_PIX_FMT_RGB565: + case V4L2_PIX_FMT_RGB565X: + bpp = depth = 16; + endianness = + fourcc == V4L2_PIX_FMT_RGB565X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; + r_mask = 0xf800; + g_mask = 0x07e0; + b_mask = 0x001f; + break; + case V4L2_PIX_FMT_RGB24: + bpp = depth = 24; + endianness = G_BIG_ENDIAN; + r_mask = 0xff0000; + g_mask = 0x00ff00; + b_mask = 0x0000ff; + break; + case V4L2_PIX_FMT_BGR24: + bpp = depth = 24; + endianness = G_BIG_ENDIAN; + r_mask = 0x0000ff; + g_mask = 0x00ff00; + b_mask = 0xff0000; + break; + case V4L2_PIX_FMT_RGB32: + bpp = depth = 32; + endianness = G_BIG_ENDIAN; + r_mask = 0xff000000; + g_mask = 0x00ff0000; + b_mask = 0x0000ff00; + break; + case V4L2_PIX_FMT_BGR32: + bpp = depth = 32; + endianness = G_BIG_ENDIAN; + r_mask = 0x000000ff; + g_mask = 0x0000ff00; + b_mask = 0x00ff0000; + break; + default: + g_assert_not_reached (); + break; + } + structure = gst_structure_new ("video/x-raw-rgb", + "bpp", G_TYPE_INT, bpp, + "depth", G_TYPE_INT, depth, + "red_mask", G_TYPE_INT, r_mask, + "green_mask", G_TYPE_INT, g_mask, + "blue_mask", G_TYPE_INT, b_mask, + "endianness", G_TYPE_INT, endianness, NULL); + break; + } + case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ + structure = gst_structure_new ("video/x-raw-gray", + "bpp", G_TYPE_INT, 8, NULL); + break; + case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */ + case V4L2_PIX_FMT_HI240: /* 8 8-bit color */ + /* FIXME: get correct fourccs here */ + break; + case V4L2_PIX_FMT_NV12: /* 12 Y/CbCr 4:2:0 */ + case V4L2_PIX_FMT_NV21: /* 12 Y/CrCb 4:2:0 */ + case V4L2_PIX_FMT_YVU410: + case V4L2_PIX_FMT_YUV410: + case V4L2_PIX_FMT_YUV420: /* I420/IYUV */ + case V4L2_PIX_FMT_YUYV: + case V4L2_PIX_FMT_YVU420: + case V4L2_PIX_FMT_UYVY: + case V4L2_PIX_FMT_Y41P: + case V4L2_PIX_FMT_YUV422P: +#ifdef V4L2_PIX_FMT_YVYU + case V4L2_PIX_FMT_YVYU: +#endif + case V4L2_PIX_FMT_YUV411P:{ + guint32 fcc = 0; + + switch (fourcc) { + case V4L2_PIX_FMT_NV12: + fcc = GST_MAKE_FOURCC ('N', 'V', '1', '2'); + break; + case V4L2_PIX_FMT_NV21: + fcc = GST_MAKE_FOURCC ('N', 'V', '2', '1'); + break; + case V4L2_PIX_FMT_YVU410: + fcc = GST_MAKE_FOURCC ('Y', 'V', 'U', '9'); + break; + case V4L2_PIX_FMT_YUV410: + fcc = GST_MAKE_FOURCC ('Y', 'U', 'V', '9'); + break; + case V4L2_PIX_FMT_YUV420: + fcc = GST_MAKE_FOURCC ('I', '4', '2', '0'); + break; + case V4L2_PIX_FMT_YUYV: + fcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); + break; + case V4L2_PIX_FMT_YVU420: + fcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); + break; + case V4L2_PIX_FMT_UYVY: + fcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); + break; + case V4L2_PIX_FMT_Y41P: + fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'P'); + break; + case V4L2_PIX_FMT_YUV411P: + fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B'); + break; + case V4L2_PIX_FMT_YUV422P: + fcc = GST_MAKE_FOURCC ('Y', '4', '2', 'B'); + break; +#ifdef V4L2_PIX_FMT_YVYU + case V4L2_PIX_FMT_YVYU: + fcc = GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'); + break; +#endif + default: + g_assert_not_reached (); + break; + } + structure = gst_structure_new ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, fcc, NULL); + break; + } + case V4L2_PIX_FMT_DV: + structure = + gst_structure_new ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, + NULL); + break; + case V4L2_PIX_FMT_MPEG: /* MPEG */ + structure = gst_structure_new ("video/mpegts", NULL); + break; + case V4L2_PIX_FMT_WNVA: /* Winnov hw compres */ + break; +#ifdef V4L2_PIX_FMT_SBGGR8 + case V4L2_PIX_FMT_SBGGR8: + structure = gst_structure_new ("video/x-raw-bayer", NULL); + break; +#endif +#ifdef V4L2_PIX_FMT_SN9C10X + case V4L2_PIX_FMT_SN9C10X: + structure = gst_structure_new ("video/x-sonix", NULL); + break; +#endif +#ifdef V4L2_PIX_FMT_PWC1 + case V4L2_PIX_FMT_PWC1: + structure = gst_structure_new ("video/x-pwc1", NULL); + break; +#endif +#ifdef V4L2_PIX_FMT_PWC2 + case V4L2_PIX_FMT_PWC2: + structure = gst_structure_new ("video/x-pwc2", NULL); + break; +#endif + default: + GST_DEBUG ("Unknown fourcc 0x%08x %" GST_FOURCC_FORMAT, + fourcc, GST_FOURCC_ARGS (fourcc)); + break; + } + + return structure; +} + + + +GstCaps * +gst_v4l2_object_get_all_caps (void) +{ + static GstCaps *caps = NULL; + + if (caps == NULL) { + GstStructure *structure; + + guint i; + + caps = gst_caps_new_empty (); + for (i = 0; i < GST_V4L2_FORMAT_COUNT; i++) { + structure = + gst_v4l2_object_v4l2fourcc_to_structure (gst_v4l2_formats[i].format); + if (structure) { + if (gst_v4l2_formats[i].dimensions) { + gst_structure_set (structure, + "width", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE, + "height", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, NULL); + } + gst_caps_append_structure (caps, structure); + } + } + } + + return gst_caps_ref (caps); +} + + +/* collect data for the given caps + * @caps: given input caps + * @format: location for the v4l format + * @w/@h: location for width and height + * @fps_n/@fps_d: location for framerate + * @size: location for expected size of the frame or 0 if unknown + */ +gboolean +gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, + struct v4l2_fmtdesc ** format, gint * w, gint * h, + gboolean * interlaced, guint * fps_n, guint * fps_d, guint * size) +{ + GstStructure *structure; + const GValue *framerate; + guint32 fourcc; + const gchar *mimetype; + guint outsize; + + /* default unknown values */ + fourcc = 0; + outsize = 0; + + structure = gst_caps_get_structure (caps, 0); + + mimetype = gst_structure_get_name (structure); + + if (strcmp (mimetype, "video/mpegts") == 0) { + fourcc = V4L2_PIX_FMT_MPEG; + *fps_n = 0; + *fps_d = 1; + goto done; + } + + if (!gst_structure_get_int (structure, "width", w)) + return FALSE; + + if (!gst_structure_get_int (structure, "height", h)) + return FALSE; + + if (!gst_structure_get_boolean (structure, "interlaced", interlaced)) + *interlaced = FALSE; + + framerate = gst_structure_get_value (structure, "framerate"); + if (!framerate) + return FALSE; + + *fps_n = gst_value_get_fraction_numerator (framerate); + *fps_d = gst_value_get_fraction_denominator (framerate); + + if (!strcmp (mimetype, "video/x-raw-yuv")) { + gst_structure_get_fourcc (structure, "format", &fourcc); + + switch (fourcc) { + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('I', 'Y', 'U', 'V'): + fourcc = V4L2_PIX_FMT_YUV420; + outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); + outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * (GST_ROUND_UP_2 (*h) / 2)); + break; + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + fourcc = V4L2_PIX_FMT_YUYV; + outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; + break; + case GST_MAKE_FOURCC ('Y', '4', '1', 'P'): + fourcc = V4L2_PIX_FMT_Y41P; + outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; + break; + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + fourcc = V4L2_PIX_FMT_UYVY; + outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; + break; + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + fourcc = V4L2_PIX_FMT_YVU420; + outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); + outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * (GST_ROUND_UP_2 (*h) / 2)); + break; + case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): + fourcc = V4L2_PIX_FMT_YUV411P; + outsize = GST_ROUND_UP_4 (*w) * *h; + outsize += 2 * ((GST_ROUND_UP_8 (*w) / 4) * *h); + break; + case GST_MAKE_FOURCC ('Y', '4', '2', 'B'): + fourcc = V4L2_PIX_FMT_YUV422P; + outsize = GST_ROUND_UP_4 (*w) * *h; + outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * *h); + break; + case GST_MAKE_FOURCC ('N', 'V', '1', '2'): + fourcc = V4L2_PIX_FMT_NV12; + outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); + outsize += (GST_ROUND_UP_4 (*w) * *h) / 2; + break; + case GST_MAKE_FOURCC ('N', 'V', '2', '1'): + fourcc = V4L2_PIX_FMT_NV21; + outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); + outsize += (GST_ROUND_UP_4 (*w) * *h) / 2; + break; +#ifdef V4L2_PIX_FMT_YVYU + case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'): + fourcc = V4L2_PIX_FMT_YVYU; + outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; + break; +#endif + } + } else if (!strcmp (mimetype, "video/x-raw-rgb")) { + gint depth, endianness, r_mask; + + gst_structure_get_int (structure, "depth", &depth); + gst_structure_get_int (structure, "endianness", &endianness); + gst_structure_get_int (structure, "red_mask", &r_mask); + + switch (depth) { + case 8: + fourcc = V4L2_PIX_FMT_RGB332; + break; + case 15: + fourcc = (endianness == G_LITTLE_ENDIAN) ? + V4L2_PIX_FMT_RGB555 : V4L2_PIX_FMT_RGB555X; + break; + case 16: + fourcc = (endianness == G_LITTLE_ENDIAN) ? + V4L2_PIX_FMT_RGB565 : V4L2_PIX_FMT_RGB565X; + break; + case 24: + fourcc = (r_mask == 0xFF) ? V4L2_PIX_FMT_BGR24 : V4L2_PIX_FMT_RGB24; + break; + case 32: + fourcc = (r_mask == 0xFF) ? V4L2_PIX_FMT_BGR32 : V4L2_PIX_FMT_RGB32; + break; + } + } else if (strcmp (mimetype, "video/x-dv") == 0) { + fourcc = V4L2_PIX_FMT_DV; + } else if (strcmp (mimetype, "image/jpeg") == 0) { + fourcc = V4L2_PIX_FMT_JPEG; +#ifdef V4L2_PIX_FMT_SBGGR8 + } else if (strcmp (mimetype, "video/x-raw-bayer") == 0) { + fourcc = V4L2_PIX_FMT_SBGGR8; +#endif +#ifdef V4L2_PIX_FMT_SN9C10X + } else if (strcmp (mimetype, "video/x-sonix") == 0) { + fourcc = V4L2_PIX_FMT_SN9C10X; +#endif +#ifdef V4L2_PIX_FMT_PWC1 + } else if (strcmp (mimetype, "video/x-pwc1") == 0) { + fourcc = V4L2_PIX_FMT_PWC1; +#endif +#ifdef V4L2_PIX_FMT_PWC2 + } else if (strcmp (mimetype, "video/x-pwc2") == 0) { + fourcc = V4L2_PIX_FMT_PWC2; +#endif + } else if (strcmp (mimetype, "video/x-raw-gray") == 0) { + fourcc = V4L2_PIX_FMT_GREY; + } + + if (fourcc == 0) + return FALSE; + +done: + *format = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc); + *size = outsize; + + return TRUE; +} + + +static gboolean +gst_v4l2_object_get_nearest_size (GstV4l2Object * v4l2object, + guint32 pixelformat, gint * width, gint * height, gboolean * interlaced); + + +/* The frame interval enumeration code first appeared in Linux 2.6.19. */ +#ifdef VIDIOC_ENUM_FRAMEINTERVALS +static GstStructure * +gst_v4l2_object_probe_caps_for_format_and_size (GstV4l2Object * v4l2object, + guint32 pixelformat, + guint32 width, guint32 height, const GstStructure * template) +{ + gint fd = v4l2object->video_fd; + struct v4l2_frmivalenum ival; + guint32 num, denom; + GstStructure *s; + GValue rates = { 0, }; + gboolean interlaced; + gint int_width = width; + gint int_height = height; + + /* interlaced detection using VIDIOC_TRY/S_FMT */ + if (!gst_v4l2_object_get_nearest_size (v4l2object, pixelformat, + &int_width, &int_height, &interlaced)) + return NULL; + + memset (&ival, 0, sizeof (struct v4l2_frmivalenum)); + ival.index = 0; + ival.pixel_format = pixelformat; + ival.width = width; + ival.height = height; + + GST_LOG_OBJECT (v4l2object->element, + "get frame interval for %ux%u, %" GST_FOURCC_FORMAT, width, height, + GST_FOURCC_ARGS (pixelformat)); + + /* keep in mind that v4l2 gives us frame intervals (durations); we invert the + * fraction to get framerate */ + if (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMEINTERVALS, &ival) < 0) + goto enum_frameintervals_failed; + + if (ival.type == V4L2_FRMIVAL_TYPE_DISCRETE) { + GValue rate = { 0, }; + + g_value_init (&rates, GST_TYPE_LIST); + g_value_init (&rate, GST_TYPE_FRACTION); + + do { + num = ival.discrete.numerator; + denom = ival.discrete.denominator; + + if (num > G_MAXINT || denom > G_MAXINT) { + /* let us hope we don't get here... */ + num >>= 1; + denom >>= 1; + } + + GST_LOG_OBJECT (v4l2object->element, "adding discrete framerate: %d/%d", + denom, num); + + /* swap to get the framerate */ + gst_value_set_fraction (&rate, denom, num); + gst_value_list_append_value (&rates, &rate); + + ival.index++; + } while (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMEINTERVALS, &ival) >= 0); + } else if (ival.type == V4L2_FRMIVAL_TYPE_STEPWISE) { + GValue min = { 0, }; + GValue step = { 0, }; + GValue max = { 0, }; + gboolean added = FALSE; + guint32 minnum, mindenom; + guint32 maxnum, maxdenom; + + g_value_init (&rates, GST_TYPE_LIST); + + g_value_init (&min, GST_TYPE_FRACTION); + g_value_init (&step, GST_TYPE_FRACTION); + g_value_init (&max, GST_TYPE_FRACTION); + + /* get the min */ + minnum = ival.stepwise.min.numerator; + mindenom = ival.stepwise.min.denominator; + if (minnum > G_MAXINT || mindenom > G_MAXINT) { + minnum >>= 1; + mindenom >>= 1; + } + GST_LOG_OBJECT (v4l2object->element, "stepwise min frame interval: %d/%d", + minnum, mindenom); + gst_value_set_fraction (&min, minnum, mindenom); + + /* get the max */ + maxnum = ival.stepwise.max.numerator; + maxdenom = ival.stepwise.max.denominator; + if (maxnum > G_MAXINT || maxdenom > G_MAXINT) { + maxnum >>= 1; + maxdenom >>= 1; + } + + GST_LOG_OBJECT (v4l2object->element, "stepwise max frame interval: %d/%d", + maxnum, maxdenom); + gst_value_set_fraction (&max, maxnum, maxdenom); + + /* get the step */ + num = ival.stepwise.step.numerator; + denom = ival.stepwise.step.denominator; + if (num > G_MAXINT || denom > G_MAXINT) { + num >>= 1; + denom >>= 1; + } + + if (num == 0 || denom == 0) { + /* in this case we have a wrong fraction or no step, set the step to max + * so that we only add the min value in the loop below */ + num = maxnum; + denom = maxdenom; + } + + /* since we only have gst_value_fraction_subtract and not add, negate the + * numerator */ + GST_LOG_OBJECT (v4l2object->element, "stepwise step frame interval: %d/%d", + num, denom); + gst_value_set_fraction (&step, -num, denom); + + while (gst_value_compare (&min, &max) != GST_VALUE_GREATER_THAN) { + GValue rate = { 0, }; + + num = gst_value_get_fraction_numerator (&min); + denom = gst_value_get_fraction_denominator (&min); + GST_LOG_OBJECT (v4l2object->element, "adding stepwise framerate: %d/%d", + denom, num); + + /* invert to get the framerate */ + g_value_init (&rate, GST_TYPE_FRACTION); + gst_value_set_fraction (&rate, denom, num); + gst_value_list_append_value (&rates, &rate); + added = TRUE; + + /* we're actually adding because step was negated above. This is because + * there is no _add function... */ + if (!gst_value_fraction_subtract (&min, &min, &step)) { + GST_WARNING_OBJECT (v4l2object->element, "could not step fraction!"); + break; + } + } + if (!added) { + /* no range was added, leave the default range from the template */ + GST_WARNING_OBJECT (v4l2object->element, + "no range added, leaving default"); + g_value_unset (&rates); + } + } else if (ival.type == V4L2_FRMIVAL_TYPE_CONTINUOUS) { + guint32 maxnum, maxdenom; + + g_value_init (&rates, GST_TYPE_FRACTION_RANGE); + + num = ival.stepwise.min.numerator; + denom = ival.stepwise.min.denominator; + if (num > G_MAXINT || denom > G_MAXINT) { + num >>= 1; + denom >>= 1; + } + + maxnum = ival.stepwise.max.numerator; + maxdenom = ival.stepwise.max.denominator; + if (maxnum > G_MAXINT || maxdenom > G_MAXINT) { + maxnum >>= 1; + maxdenom >>= 1; + } + + GST_LOG_OBJECT (v4l2object->element, + "continuous frame interval %d/%d to %d/%d", maxdenom, maxnum, denom, + num); + + gst_value_set_fraction_range_full (&rates, maxdenom, maxnum, denom, num); + } else { + goto unknown_type; + } + +return_data: + s = gst_structure_copy (template); + gst_structure_set (s, "width", G_TYPE_INT, (gint) width, + "height", G_TYPE_INT, (gint) height, + "interlaced", G_TYPE_BOOLEAN, interlaced, + "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); + + if (G_IS_VALUE (&rates)) { + /* only change the framerate on the template when we have a valid probed new + * value */ + gst_structure_set_value (s, "framerate", &rates); + g_value_unset (&rates); + } else { + gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, + NULL); + } + return s; + + /* ERRORS */ +enum_frameintervals_failed: + { + GST_DEBUG_OBJECT (v4l2object->element, + "Unable to enumerate intervals for %" GST_FOURCC_FORMAT "@%ux%u", + GST_FOURCC_ARGS (pixelformat), width, height); + goto return_data; + } +unknown_type: + { + /* I don't see how this is actually an error, we ignore the format then */ + GST_WARNING_OBJECT (v4l2object->element, + "Unknown frame interval type at %" GST_FOURCC_FORMAT "@%ux%u: %u", + GST_FOURCC_ARGS (pixelformat), width, height, ival.type); + return NULL; + } +} +#endif /* defined VIDIOC_ENUM_FRAMEINTERVALS */ + +#ifdef VIDIOC_ENUM_FRAMESIZES +static gint +sort_by_frame_size (GstStructure * s1, GstStructure * s2) +{ + int w1, h1, w2, h2; + + gst_structure_get_int (s1, "width", &w1); + gst_structure_get_int (s1, "height", &h1); + gst_structure_get_int (s2, "width", &w2); + gst_structure_get_int (s2, "height", &h2); + + /* I think it's safe to assume that this won't overflow for a while */ + return ((w2 * h2) - (w1 * h1)); +} +#endif + +GstCaps * +gst_v4l2_object_probe_caps_for_format (GstV4l2Object * v4l2object, + guint32 pixelformat, const GstStructure * template) +{ + GstCaps *ret = gst_caps_new_empty (); + GstStructure *tmp; + +#ifdef VIDIOC_ENUM_FRAMESIZES + gint fd = v4l2object->video_fd; + struct v4l2_frmsizeenum size; + GList *results = NULL; + guint32 w, h; + + if (pixelformat == GST_MAKE_FOURCC ('M', 'P', 'E', 'G')) + return gst_caps_new_simple ("video/mpegts", NULL); + + memset (&size, 0, sizeof (struct v4l2_frmsizeenum)); + size.index = 0; + size.pixel_format = pixelformat; + + GST_DEBUG_OBJECT (v4l2object->element, "Enumerating frame sizes"); + + if (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMESIZES, &size) < 0) + goto enum_framesizes_failed; + + if (size.type == V4L2_FRMSIZE_TYPE_DISCRETE) { + do { + GST_LOG_OBJECT (v4l2object->element, "got discrete frame size %dx%d", + size.discrete.width, size.discrete.height); + + w = MIN (size.discrete.width, G_MAXINT); + h = MIN (size.discrete.height, G_MAXINT); + + if (w && h) { + tmp = + gst_v4l2_object_probe_caps_for_format_and_size (v4l2object, + pixelformat, w, h, template); + + if (tmp) + results = g_list_prepend (results, tmp); + } + + size.index++; + } while (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMESIZES, &size) >= 0); + GST_DEBUG_OBJECT (v4l2object->element, + "done iterating discrete frame sizes"); + } else if (size.type == V4L2_FRMSIZE_TYPE_STEPWISE) { + GST_DEBUG_OBJECT (v4l2object->element, "we have stepwise frame sizes:"); + GST_DEBUG_OBJECT (v4l2object->element, "min width: %d", + size.stepwise.min_width); + GST_DEBUG_OBJECT (v4l2object->element, "min height: %d", + size.stepwise.min_height); + GST_DEBUG_OBJECT (v4l2object->element, "max width: %d", + size.stepwise.max_width); + GST_DEBUG_OBJECT (v4l2object->element, "min height: %d", + size.stepwise.max_height); + GST_DEBUG_OBJECT (v4l2object->element, "step width: %d", + size.stepwise.step_width); + GST_DEBUG_OBJECT (v4l2object->element, "step height: %d", + size.stepwise.step_height); + + for (w = size.stepwise.min_width, h = size.stepwise.min_height; + w <= size.stepwise.max_width && h <= size.stepwise.max_height; + w += size.stepwise.step_width, h += size.stepwise.step_height) { + if (w == 0 || h == 0) + continue; + + tmp = + gst_v4l2_object_probe_caps_for_format_and_size (v4l2object, + pixelformat, w, h, template); + + if (tmp) + results = g_list_prepend (results, tmp); + } + GST_DEBUG_OBJECT (v4l2object->element, + "done iterating stepwise frame sizes"); + } else if (size.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) { + guint32 maxw, maxh; + + GST_DEBUG_OBJECT (v4l2object->element, "we have continuous frame sizes:"); + GST_DEBUG_OBJECT (v4l2object->element, "min width: %d", + size.stepwise.min_width); + GST_DEBUG_OBJECT (v4l2object->element, "min height: %d", + size.stepwise.min_height); + GST_DEBUG_OBJECT (v4l2object->element, "max width: %d", + size.stepwise.max_width); + GST_DEBUG_OBJECT (v4l2object->element, "min height: %d", + size.stepwise.max_height); + + w = MAX (size.stepwise.min_width, 1); + h = MAX (size.stepwise.min_height, 1); + maxw = MIN (size.stepwise.max_width, G_MAXINT); + maxh = MIN (size.stepwise.max_height, G_MAXINT); + + tmp = + gst_v4l2_object_probe_caps_for_format_and_size (v4l2object, pixelformat, + w, h, template); + if (tmp) { + gst_structure_set (tmp, "width", GST_TYPE_INT_RANGE, (gint) w, + (gint) maxw, "height", GST_TYPE_INT_RANGE, (gint) h, (gint) maxh, + NULL); + + /* no point using the results list here, since there's only one struct */ + gst_caps_append_structure (ret, tmp); + } + } else { + goto unknown_type; + } + + /* we use an intermediary list to store and then sort the results of the + * probing because we can't make any assumptions about the order in which + * the driver will give us the sizes, but we want the final caps to contain + * the results starting with the highest resolution and having the lowest + * resolution last, since order in caps matters for things like fixation. */ + results = g_list_sort (results, (GCompareFunc) sort_by_frame_size); + while (results != NULL) { + gst_caps_append_structure (ret, GST_STRUCTURE (results->data)); + results = g_list_delete_link (results, results); + } + + if (gst_caps_is_empty (ret)) + goto enum_framesizes_no_results; + + return ret; + + /* ERRORS */ +enum_framesizes_failed: + { + /* I don't see how this is actually an error */ + GST_DEBUG_OBJECT (v4l2object->element, + "Failed to enumerate frame sizes for pixelformat %" GST_FOURCC_FORMAT + " (%s)", GST_FOURCC_ARGS (pixelformat), g_strerror (errno)); + goto default_frame_sizes; + } +enum_framesizes_no_results: + { + /* it's possible that VIDIOC_ENUM_FRAMESIZES is defined but the driver in + * question doesn't actually support it yet */ + GST_DEBUG_OBJECT (v4l2object->element, + "No results for pixelformat %" GST_FOURCC_FORMAT + " enumerating frame sizes, trying fallback", + GST_FOURCC_ARGS (pixelformat)); + goto default_frame_sizes; + } +unknown_type: + { + GST_WARNING_OBJECT (v4l2object->element, + "Unknown frame sizeenum type for pixelformat %" GST_FOURCC_FORMAT + ": %u", GST_FOURCC_ARGS (pixelformat), size.type); + goto default_frame_sizes; + } +default_frame_sizes: +#endif /* defined VIDIOC_ENUM_FRAMESIZES */ + { + gint min_w, max_w, min_h, max_h, fix_num = 0, fix_denom = 0; + gboolean interlaced; + + /* This code is for Linux < 2.6.19 */ + min_w = min_h = 1; + max_w = max_h = GST_V4L2_MAX_SIZE; + if (!gst_v4l2_object_get_nearest_size (v4l2object, pixelformat, &min_w, + &min_h, &interlaced)) { + GST_WARNING_OBJECT (v4l2object->element, + "Could not probe minimum capture size for pixelformat %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (pixelformat)); + } + if (!gst_v4l2_object_get_nearest_size (v4l2object, pixelformat, &max_w, + &max_h, &interlaced)) { + GST_WARNING_OBJECT (v4l2object->element, + "Could not probe maximum capture size for pixelformat %" + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (pixelformat)); + } + + /* Since we can't get framerate directly, try to use the current norm */ + if (v4l2object->tv_norm && v4l2object->norms) { + GList *norms; + GstTunerNorm *norm = NULL; + GstTunerNorm *current = + gst_v4l2_tuner_get_norm_by_std_id (v4l2object, v4l2object->tv_norm); + + for (norms = v4l2object->norms; norms != NULL; norms = norms->next) { + norm = (GstTunerNorm *) norms->data; + if (!strcmp (norm->label, current->label)) + break; + } + /* If it's possible, set framerate to that (discrete) value */ + if (norm) { + fix_num = gst_value_get_fraction_numerator (&norm->framerate); + fix_denom = gst_value_get_fraction_denominator (&norm->framerate); + } + } + + tmp = gst_structure_copy (template); + if (fix_num) { + gst_structure_set (tmp, "framerate", GST_TYPE_FRACTION, fix_num, + fix_denom, NULL); + } else { + /* if norm can't be used, copy the template framerate */ + gst_structure_set (tmp, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, + 100, 1, NULL); + } + + if (min_w == max_w) + gst_structure_set (tmp, "width", G_TYPE_INT, max_w, NULL); + else + gst_structure_set (tmp, "width", GST_TYPE_INT_RANGE, min_w, max_w, NULL); + + if (min_h == max_h) + gst_structure_set (tmp, "height", G_TYPE_INT, max_h, NULL); + else + gst_structure_set (tmp, "height", GST_TYPE_INT_RANGE, min_h, max_h, NULL); + + gst_structure_set (tmp, "interlaced", G_TYPE_BOOLEAN, interlaced, NULL); + gst_structure_set (tmp, "pixel-aspect-ratio", + GST_TYPE_FRACTION, 1, 1, NULL); + + gst_caps_append_structure (ret, tmp); + + return ret; + } +} + +static gboolean +gst_v4l2_object_get_nearest_size (GstV4l2Object * v4l2object, + guint32 pixelformat, gint * width, gint * height, gboolean * interlaced) +{ + struct v4l2_format fmt, prevfmt; + int fd; + int r; + int prevfmt_valid; + + g_return_val_if_fail (width != NULL, FALSE); + g_return_val_if_fail (height != NULL, FALSE); + + GST_LOG_OBJECT (v4l2object->element, + "getting nearest size to %dx%d with format %" GST_FOURCC_FORMAT, + *width, *height, GST_FOURCC_ARGS (pixelformat)); + + fd = v4l2object->video_fd; + + /* Some drivers are buggy and will modify the currently set format + when processing VIDIOC_TRY_FMT, so we remember what is set at the + minute, and will reset it when done. */ + prevfmt_valid = (v4l2_ioctl (fd, VIDIOC_G_FMT, &prevfmt) >= 0); + + /* get size delimiters */ + memset (&fmt, 0, sizeof (fmt)); + fmt.type = v4l2object->type; + fmt.fmt.pix.width = *width; + fmt.fmt.pix.height = *height; + fmt.fmt.pix.pixelformat = pixelformat; + fmt.fmt.pix.field = V4L2_FIELD_NONE; + + r = v4l2_ioctl (fd, VIDIOC_TRY_FMT, &fmt); + if (r < 0 && errno == EINVAL) { + /* try again with interlaced video */ + fmt.fmt.pix.width = *width; + fmt.fmt.pix.height = *height; + fmt.fmt.pix.pixelformat = pixelformat; + fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; + r = v4l2_ioctl (fd, VIDIOC_TRY_FMT, &fmt); + } + + if (r < 0) { + /* The driver might not implement TRY_FMT, in which case we will try + S_FMT to probe */ + if (errno != ENOTTY) + goto error; + + /* Only try S_FMT if we're not actively capturing yet, which we shouldn't + be, because we're still probing */ + if (GST_V4L2_IS_ACTIVE (v4l2object)) + goto error; + + GST_LOG_OBJECT (v4l2object->element, + "Failed to probe size limit with VIDIOC_TRY_FMT, trying VIDIOC_S_FMT"); + + fmt.fmt.pix.width = *width; + fmt.fmt.pix.height = *height; + + r = v4l2_ioctl (fd, VIDIOC_S_FMT, &fmt); + if (r < 0 && errno == EINVAL) { + /* try again with progressive video */ + fmt.fmt.pix.width = *width; + fmt.fmt.pix.height = *height; + fmt.fmt.pix.pixelformat = pixelformat; + fmt.fmt.pix.field = V4L2_FIELD_NONE; + r = v4l2_ioctl (fd, VIDIOC_S_FMT, &fmt); + } + + if (r < 0) + goto error; + } + + GST_LOG_OBJECT (v4l2object->element, + "got nearest size %dx%d", fmt.fmt.pix.width, fmt.fmt.pix.height); + + *width = fmt.fmt.pix.width; + *height = fmt.fmt.pix.height; + + switch (fmt.fmt.pix.field) { + case V4L2_FIELD_ANY: + case V4L2_FIELD_NONE: + *interlaced = FALSE; + break; + case V4L2_FIELD_INTERLACED: + case V4L2_FIELD_INTERLACED_TB: + case V4L2_FIELD_INTERLACED_BT: + *interlaced = TRUE; + break; + default: + GST_WARNING_OBJECT (v4l2object->element, + "Unsupported field type for %" GST_FOURCC_FORMAT "@%ux%u", + GST_FOURCC_ARGS (pixelformat), *width, *height); + goto error; + } + + if (prevfmt_valid) + v4l2_ioctl (fd, VIDIOC_S_FMT, &prevfmt); + return TRUE; + +error: + if (prevfmt_valid) + v4l2_ioctl (fd, VIDIOC_S_FMT, &prevfmt); + return FALSE; +} + + +gboolean +gst_v4l2_object_set_format (GstV4l2Object * v4l2object, guint32 pixelformat, + guint32 width, guint32 height, gboolean interlaced) +{ + gint fd = v4l2object->video_fd; + struct v4l2_format format; + enum v4l2_field field; + + if (interlaced) { + GST_DEBUG_OBJECT (v4l2object->element, "interlaced video"); + /* ideally we would differentiate between types of interlaced video + * but there is not sufficient information in the caps.. + */ + field = V4L2_FIELD_INTERLACED; + } else { + GST_DEBUG_OBJECT (v4l2object->element, "progressive video"); + field = V4L2_FIELD_NONE; + } + + GST_DEBUG_OBJECT (v4l2object->element, "Setting format to %dx%d, format " + "%" GST_FOURCC_FORMAT, width, height, GST_FOURCC_ARGS (pixelformat)); + + GST_V4L2_CHECK_OPEN (v4l2object); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2object); + + /* Only unconditionally accept mpegts for sources */ + if ((v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) && + (pixelformat == GST_MAKE_FOURCC ('M', 'P', 'E', 'G'))) + return TRUE; + + memset (&format, 0x00, sizeof (struct v4l2_format)); + format.type = v4l2object->type; + + if (v4l2_ioctl (fd, VIDIOC_G_FMT, &format) < 0) + goto get_fmt_failed; + + if (format.type == v4l2object->type && + format.fmt.pix.width == width && + format.fmt.pix.height == height && + format.fmt.pix.pixelformat == pixelformat && + format.fmt.pix.field == field) { + /* Nothing to do. We want to succeed immediately + * here because setting the same format back + * can still fail due to EBUSY. By short-circuiting + * here, we allow pausing and re-playing pipelines + * with changed caps, as long as the changed caps + * do not change the webcam's format. Otherwise, + * any caps change would require us to go to NULL + * state to close the device and set format. + */ + return TRUE; + } + + format.type = v4l2object->type; + format.fmt.pix.width = width; + format.fmt.pix.height = height; + format.fmt.pix.pixelformat = pixelformat; + format.fmt.pix.field = field; + + if (v4l2_ioctl (fd, VIDIOC_S_FMT, &format) < 0) { + goto set_fmt_failed; + } + + if (format.fmt.pix.width != width || format.fmt.pix.height != height) + goto invalid_dimensions; + + if (format.fmt.pix.pixelformat != pixelformat) + goto invalid_pixelformat; + + return TRUE; + + /* ERRORS */ +get_fmt_failed: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, + (_("Device '%s' does not support video capture"), + v4l2object->videodev), + ("Call to G_FMT failed: (%s)", g_strerror (errno))); + return FALSE; + } +set_fmt_failed: + { + if (errno == EBUSY) { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, BUSY, + (_("Device '%s' is busy"), v4l2object->videodev), + ("Call to S_FMT failed for %" GST_FOURCC_FORMAT " @ %dx%d: %s", + GST_FOURCC_ARGS (pixelformat), width, height, + g_strerror (errno))); + } else { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, + (_("Device '%s' cannot capture at %dx%d"), + v4l2object->videodev, width, height), + ("Call to S_FMT failed for %" GST_FOURCC_FORMAT " @ %dx%d: %s", + GST_FOURCC_ARGS (pixelformat), width, height, + g_strerror (errno))); + } + return FALSE; + } +invalid_dimensions: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, + (_("Device '%s' cannot capture at %dx%d"), + v4l2object->videodev, width, height), + ("Tried to capture at %dx%d, but device returned size %dx%d", + width, height, format.fmt.pix.width, format.fmt.pix.height)); + return FALSE; + } +invalid_pixelformat: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, + (_("Device '%s' cannot capture in the specified format"), + v4l2object->videodev), + ("Tried to capture in %" GST_FOURCC_FORMAT + ", but device returned format" " %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (pixelformat), + GST_FOURCC_ARGS (format.fmt.pix.pixelformat))); + return FALSE; + } +} + +gboolean +gst_v4l2_object_start_streaming (GstV4l2Object * v4l2object) +{ + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_STREAMON, + &(v4l2object->type)) < 0) { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, OPEN_READ, + (_("Error starting streaming on device '%s'."), v4l2object->videodev), + GST_ERROR_SYSTEM); + return FALSE; + } + return TRUE; +} + +gboolean +gst_v4l2_object_stop_streaming (GstV4l2Object * v4l2object) +{ + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_STREAMOFF, + &(v4l2object->type)) < 0) { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, OPEN_READ, + (_("Error stopping streaming on device '%s'."), v4l2object->videodev), + GST_ERROR_SYSTEM); + return FALSE; + } + return TRUE; +} diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h new file mode 100644 index 0000000..a7b590d --- /dev/null +++ b/sys/v4l2/gstv4l2object.h @@ -0,0 +1,242 @@ +/* GStreamer + * + * Copyright (C) 2001-2002 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2object.h: base class for V4L2 elements + * + * 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_V4L2_OBJECT_H__ +#define __GST_V4L2_OBJECT_H__ + +/* Because of some really cool feature in video4linux1, also known as + * 'not including sys/types.h and sys/time.h', we had to include it + * ourselves. In all their intelligence, these people decided to fix + * this in the next version (video4linux2) in such a cool way that it + * breaks all compilations of old stuff... + * The real problem is actually that linux/time.h doesn't use proper + * macro checks before defining types like struct timeval. The proper + * fix here is to either fuck the kernel header (which is what we do + * by defining _LINUX_TIME_H, an innocent little hack) or by fixing it + * upstream, which I'll consider doing later on. If you get compiler + * errors here, check your linux/time.h && sys/time.h header setup. + */ +#include +#include +#ifndef __sun +#include +#define _LINUX_TIME_H +#define __user +#include +#else +#include +#endif + +#include +#include +#include + +#include + + +/* size of v4l2 buffer pool in streaming case */ +#define GST_V4L2_MAX_BUFFERS 16 +#define GST_V4L2_MIN_BUFFERS 1 + +/* max frame width/height */ +#define GST_V4L2_MAX_SIZE (1<<15) /* 2^15 == 32768 */ + + + +G_BEGIN_DECLS + +#define GST_V4L2_OBJECT(obj) (GstV4l2Object *)(obj) + +typedef struct _GstV4l2Object GstV4l2Object; +typedef struct _GstV4l2ObjectClassHelper GstV4l2ObjectClassHelper; +typedef struct _GstV4l2Xv GstV4l2Xv; + +typedef gboolean (*GstV4l2GetInOutFunction) (GstV4l2Object * v4l2object, gint * input); +typedef gboolean (*GstV4l2SetInOutFunction) (GstV4l2Object * v4l2object, gint input); +typedef gboolean (*GstV4l2UpdateFpsFunction) (GstV4l2Object * v4l2object); + +struct _GstV4l2Object { + GstElement * element; + + /* the video device */ + char *videodev; + + /* the video-device's file descriptor */ + gint video_fd; + GstPoll * poll; + gboolean can_poll_device; + + /* the video buffer (mmap()'ed) */ + guint8 **buffer; + + enum v4l2_buf_type type; /* V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_BUF_TYPE_VIDEO_OUTPUT */ + + /* the video device's capabilities */ + struct v4l2_capability vcap; + + /* the video device's window properties */ + struct v4l2_window vwin; + + /* some more info about the current input's capabilities */ + struct v4l2_input vinput; + + /* lists... */ + GSList *formats; /* list of available capture formats */ + + GList *colors; + GList *norms; + GList *channels; + + /* properties */ + v4l2_std_id tv_norm; + gchar *channel; + gulong frequency; + + /* X-overlay */ + GstV4l2Xv *xv; + gulong xwindow_id; + + /* funcs */ + GstV4l2GetInOutFunction get_in_out_func; + GstV4l2SetInOutFunction set_in_out_func; + GstV4l2UpdateFpsFunction update_fps_func; +}; + +struct _GstV4l2ObjectClassHelper { + /* probed devices */ + GList *devices; +}; + +GType gst_v4l2_object_get_type (void); + +#define V4L2_STD_OBJECT_PROPS \ + PROP_DEVICE, \ + PROP_DEVICE_NAME, \ + PROP_DEVICE_FD, \ + PROP_FLAGS, \ + PROP_BRIGHTNESS, \ + PROP_CONTRAST, \ + PROP_SATURATION, \ + PROP_HUE, \ + PROP_TV_NORM + +/* create/destroy */ +GstV4l2Object * gst_v4l2_object_new (GstElement * element, + enum v4l2_buf_type type, + const char *default_device, + GstV4l2GetInOutFunction get_in_out_func, + GstV4l2SetInOutFunction set_in_out_func, + GstV4l2UpdateFpsFunction update_fps_func); +void gst_v4l2_object_destroy (GstV4l2Object * v4l2object); + +/* properties */ + +void gst_v4l2_object_install_properties_helper (GObjectClass *gobject_class, const char *default_device); + +gboolean gst_v4l2_object_set_property_helper (GstV4l2Object *v4l2object, + guint prop_id, const GValue * value, + GParamSpec * pspec); +gboolean gst_v4l2_object_get_property_helper (GstV4l2Object *v4l2object, + guint prop_id, GValue * value, + GParamSpec * pspec); +/* starting/stopping */ +gboolean gst_v4l2_object_start (GstV4l2Object *v4l2object); +gboolean gst_v4l2_object_stop (GstV4l2Object *v4l2object); + +/* probing */ +const GList* gst_v4l2_probe_get_properties (GstPropertyProbe * probe); + +void gst_v4l2_probe_probe_property (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec, + GList ** klass_devices); +gboolean gst_v4l2_probe_needs_probe (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec, + GList ** klass_devices); +GValueArray* gst_v4l2_probe_get_values (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec, + GList ** klass_devices); + +GstCaps* gst_v4l2_object_probe_caps_for_format (GstV4l2Object *v4l2object, guint32 pixelformat, + const GstStructure * template); + +gboolean gst_v4l2_object_get_caps_info (GstV4l2Object *v4l2object, GstCaps *caps, + struct v4l2_fmtdesc **format, gint *w, gint *h, + gboolean * interlaced, guint *fps_n, guint *fps_d, guint *size); + + +GSList* gst_v4l2_object_get_format_list (GstV4l2Object *v4l2object); + +GstCaps* gst_v4l2_object_get_all_caps (void); + +GstStructure* gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc); + +gboolean gst_v4l2_object_set_format (GstV4l2Object *v4l2object, guint32 pixelformat, guint32 width, guint32 height, gboolean interlaced); + +gboolean gst_v4l2_object_start_streaming (GstV4l2Object *v4l2object); +gboolean gst_v4l2_object_stop_streaming (GstV4l2Object *v4l2object); + + +#define GST_IMPLEMENT_V4L2_PROBE_METHODS(Type_Class, interface_as_function) \ + \ +static void \ +interface_as_function ## _probe_probe_property (GstPropertyProbe * probe, \ + guint prop_id, \ + const GParamSpec * pspec) \ +{ \ + Type_Class *this_class = (Type_Class*) G_OBJECT_GET_CLASS (probe); \ + gst_v4l2_probe_probe_property (probe, prop_id, pspec, \ + &this_class->v4l2_class_devices); \ +} \ + \ +static gboolean \ +interface_as_function ## _probe_needs_probe (GstPropertyProbe * probe, \ + guint prop_id, \ + const GParamSpec * pspec) \ +{ \ + Type_Class *this_class = (Type_Class*) G_OBJECT_GET_CLASS (probe); \ + return gst_v4l2_probe_needs_probe (probe, prop_id, pspec, \ + &this_class->v4l2_class_devices); \ +} \ + \ +static GValueArray * \ +interface_as_function ## _probe_get_values (GstPropertyProbe * probe, \ + guint prop_id, \ + const GParamSpec * pspec) \ +{ \ + Type_Class *this_class = (Type_Class*) G_OBJECT_GET_CLASS (probe); \ + return gst_v4l2_probe_get_values (probe, prop_id, pspec, \ + &this_class->v4l2_class_devices); \ +} \ + \ +static void \ +interface_as_function ## _property_probe_interface_init (GstPropertyProbeInterface * iface) \ +{ \ + iface->get_properties = gst_v4l2_probe_get_properties; \ + iface->probe_property = interface_as_function ## _probe_probe_property; \ + iface->needs_probe = interface_as_function ## _probe_needs_probe; \ + iface->get_values = interface_as_function ## _probe_get_values; \ +} + +G_END_DECLS + +#endif /* __GST_V4L2_OBJECT_H__ */ diff --git a/sys/v4l2/gstv4l2radio.c b/sys/v4l2/gstv4l2radio.c new file mode 100644 index 0000000..63a2fed --- /dev/null +++ b/sys/v4l2/gstv4l2radio.c @@ -0,0 +1,635 @@ +/* GStreamer v4l2 radio tuner element + * Copyright (C) 2010, 2011 Alexey Chernov <4ernov@gmail.com> + * + * gstv4l2radio.c - V4L2 radio tuner element + * + * 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-v4l2radio + * + * v4l2radio can be used to control radio device + * and to tune it to different radiostations. + * + * + * Example launch lines + * |[ + * gst-launch v4l2radio device=/dev/radio0 frequency=101200000 + * gst-launch alsasrc device=hw:1 ! audioconvert ! audioresample ! alsasink + * ]| + * First pipeline tunes the radio device /dev/radio0 to station 101.2 MHz, + * second pipeline connects digital audio out (hw:1) to default sound card. + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gst/gst-i18n-plugin.h" + +#include "gstv4l2tuner.h" +#include "gstv4l2radio.h" +#include "v4l2_calls.h" + +GST_DEBUG_CATEGORY_STATIC (v4l2radio_debug); +#define GST_CAT_DEFAULT v4l2radio_debug + +#define DEFAULT_PROP_DEVICE "/dev/radio0" +#define MIN_FREQUENCY 87500000 +#define DEFAULT_FREQUENCY 100000000 +#define MAX_FREQUENCY 108000000 + +enum +{ + ARG_0, + ARG_DEVICE, + ARG_FREQUENCY +}; + +static gboolean +gst_v4l2radio_fill_channel_list (GstV4l2Radio * radio) +{ + int res; + struct v4l2_tuner vtun; + struct v4l2_capability vc; + GstV4l2TunerChannel *v4l2channel; + GstTunerChannel *channel; + + GstElement *e; + + GstV4l2Object *v4l2object; + + e = GST_ELEMENT (radio); + v4l2object = radio->v4l2object; + + GST_DEBUG_OBJECT (e, "getting audio enumeration"); + GST_V4L2_CHECK_OPEN (v4l2object); + + GST_DEBUG_OBJECT (e, " audio input"); + + memset (&vc, 0, sizeof (vc)); + + res = v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCAP, &vc); + if (res < 0) + goto caps_failed; + + if (!(vc.capabilities & V4L2_CAP_TUNER)) + goto not_a_tuner; + + /* getting audio input */ + memset (&vtun, 0, sizeof (vtun)); + vtun.index = 0; + + res = v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &vtun); + if (res < 0) + goto tuner_failed; + + GST_LOG_OBJECT (e, " index: %d", vtun.index); + GST_LOG_OBJECT (e, " name: '%s'", vtun.name); + GST_LOG_OBJECT (e, " type: %016x", (guint) vtun.type); + GST_LOG_OBJECT (e, " caps: %016x", (guint) vtun.capability); + GST_LOG_OBJECT (e, " rlow: %016x", (guint) vtun.rangelow); + GST_LOG_OBJECT (e, " rhigh: %016x", (guint) vtun.rangehigh); + GST_LOG_OBJECT (e, " audmode: %016x", (guint) vtun.audmode); + + v4l2channel = g_object_new (GST_TYPE_V4L2_TUNER_CHANNEL, NULL); + channel = GST_TUNER_CHANNEL (v4l2channel); + channel->label = g_strdup ((const gchar *) vtun.name); + channel->flags = GST_TUNER_CHANNEL_FREQUENCY | GST_TUNER_CHANNEL_AUDIO; + v4l2channel->index = 0; + v4l2channel->tuner = 0; + + channel->freq_multiplicator = + 62.5 * ((vtun.capability & V4L2_TUNER_CAP_LOW) ? 1 : 1000); + channel->min_frequency = vtun.rangelow * channel->freq_multiplicator; + channel->max_frequency = vtun.rangehigh * channel->freq_multiplicator; + channel->min_signal = 0; + channel->max_signal = 0xffff; + + v4l2object->channels = + g_list_prepend (v4l2object->channels, (gpointer) channel); + + v4l2object->channels = g_list_reverse (v4l2object->channels); + + GST_DEBUG_OBJECT (e, "done"); + return TRUE; + + /* ERRORS */ +tuner_failed: + { + GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, + (_("Failed to get settings of tuner %d on device '%s'."), + vtun.index, v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +caps_failed: + { + GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, + (_("Error getting capabilities for device '%s'."), + v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +not_a_tuner: + { + GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, + (_("Device '%s' is not a tuner."), + v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + +static gboolean +gst_v4l2radio_get_input (GstV4l2Object * v4l2object, gint * input) +{ + GST_DEBUG_OBJECT (v4l2object->element, "trying to get radio input"); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (!v4l2object->channels) + goto input_failed; + + *input = 0; + + GST_DEBUG_OBJECT (v4l2object->element, "input: %d", 0); + + return TRUE; + + /* ERRORS */ +input_failed: + { + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to get radio input on device '%s'. "), + v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + +static gboolean +gst_v4l2radio_set_input (GstV4l2Object * v4l2object, gint input) +{ + GST_DEBUG_OBJECT (v4l2object->element, "trying to set input to %d", input); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (!v4l2object->channels) + goto input_failed; + + return TRUE; + + /* ERRORS */ +input_failed: + { + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to set input %d on device %s."), + input, v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + +static gboolean +gst_v4l2radio_set_mute_on (GstV4l2Radio * radio, gboolean on) +{ + gint res; + struct v4l2_control vctrl; + + GST_DEBUG_OBJECT (radio, "setting current tuner mute state: %d", on); + + if (!GST_V4L2_IS_OPEN (radio->v4l2object)) + return FALSE; + + memset (&vctrl, 0, sizeof (vctrl)); + vctrl.id = V4L2_CID_AUDIO_MUTE; + vctrl.value = on; + + GST_DEBUG_OBJECT (radio, "radio fd: %d", radio->v4l2object->video_fd); + + res = ioctl (radio->v4l2object->video_fd, VIDIOC_S_CTRL, &vctrl); + GST_DEBUG_OBJECT (radio, "mute state change result: %d", res); + if (res < 0) + goto freq_failed; + + return TRUE; + + /* ERRORS */ +freq_failed: + { + GST_ELEMENT_WARNING (radio, RESOURCE, SETTINGS, + (_("Failed to change mute state for device '%s'."), + radio->v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + +static gboolean +gst_v4l2radio_set_mute (GstV4l2Radio * radio) +{ + return gst_v4l2radio_set_mute_on (radio, TRUE); +} + +static gboolean +gst_v4l2radio_set_unmute (GstV4l2Radio * radio) +{ + return gst_v4l2radio_set_mute_on (radio, FALSE); +} + +GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2RadioClass, gst_v4l2radio); +GST_IMPLEMENT_V4L2_TUNER_METHODS (GstV4l2Radio, gst_v4l2radio); + +static void gst_v4l2radio_uri_handler_init (gpointer g_iface, + gpointer iface_data); + +static gboolean +gst_v4l2radio_interface_supported (GstImplementsInterface * iface, + GType iface_type) +{ + if (iface_type == GST_TYPE_TUNER) + return TRUE; + else + return FALSE; +} + +static void +gst_v4l2radio_implements_interface_init (GstImplementsInterfaceClass * iface) +{ + iface->supported = gst_v4l2radio_interface_supported; +} + +static void +gst_v4l2radio_tuner_interface_reinit (GstTunerClass * iface) +{ + gst_v4l2radio_tuner_interface_init (iface); +} + +static void +gst_v4l2radio_interfaces (GType type) +{ + static const GInterfaceInfo urihandler_info = { + (GInterfaceInitFunc) gst_v4l2radio_uri_handler_init, + NULL, + NULL + }; + + static const GInterfaceInfo implements_interface_info = { + (GInterfaceInitFunc) gst_v4l2radio_implements_interface_init, + NULL, + NULL, + }; + + static const GInterfaceInfo propertyprobe_info = { + (GInterfaceInitFunc) gst_v4l2radio_property_probe_interface_init, + NULL, + NULL, + }; + + static const GInterfaceInfo tuner_interface_info = { + (GInterfaceInitFunc) gst_v4l2radio_tuner_interface_reinit, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); + g_type_add_interface_static (type, + GST_TYPE_IMPLEMENTS_INTERFACE, &implements_interface_info); + + g_type_add_interface_static (type, GST_TYPE_TUNER, &tuner_interface_info); + + g_type_add_interface_static (type, + GST_TYPE_PROPERTY_PROBE, &propertyprobe_info); +} + +GST_BOILERPLATE_FULL (GstV4l2Radio, gst_v4l2radio, GstElement, GST_TYPE_ELEMENT, + gst_v4l2radio_interfaces); + +static void gst_v4l2radio_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_v4l2radio_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_v4l2radio_finalize (GstV4l2Radio * radio); +static void gst_v4l2radio_dispose (GObject * object); +static GstStateChangeReturn gst_v4l2radio_change_state (GstElement * element, + GstStateChange transition); + +static void +gst_v4l2radio_base_init (gpointer gclass) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (gclass); + GstV4l2RadioClass *gstv4l2radio_class = GST_V4L2RADIO_CLASS (gclass); + + GST_DEBUG_CATEGORY_INIT (v4l2radio_debug, "v4l2radio", 0, + "V4l2 radio element"); + + gstv4l2radio_class->v4l2_class_devices = NULL; + + gst_element_class_set_details_simple (gstelement_class, + "Radio (video4linux2) Tuner", + "Tuner", + "Controls a Video4Linux2 radio device", + "Alexey Chernov <4ernov@gmail.com>"); +} + +static void +gst_v4l2radio_class_init (GstV4l2RadioClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->set_property = gst_v4l2radio_set_property; + gobject_class->get_property = gst_v4l2radio_get_property; + + g_object_class_install_property (gobject_class, ARG_DEVICE, + g_param_spec_string ("device", "Radio device location", + "Video4Linux2 radio device location", + DEFAULT_PROP_DEVICE, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, ARG_FREQUENCY, + g_param_spec_int ("frequency", "Station frequency", + "Station frequency in Hz", + MIN_FREQUENCY, MAX_FREQUENCY, DEFAULT_FREQUENCY, G_PARAM_READWRITE)); + + gobject_class->dispose = gst_v4l2radio_dispose; + gobject_class->finalize = (GObjectFinalizeFunc) gst_v4l2radio_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_v4l2radio_change_state); + +} + +static void +gst_v4l2radio_init (GstV4l2Radio * filter, GstV4l2RadioClass * gclass) +{ + filter->v4l2object = gst_v4l2_object_new (GST_ELEMENT (filter), + V4L2_BUF_TYPE_VIDEO_CAPTURE, DEFAULT_PROP_DEVICE, + gst_v4l2radio_get_input, gst_v4l2radio_set_input, NULL); + + filter->v4l2object->frequency = DEFAULT_FREQUENCY; + g_free (filter->v4l2object->videodev); + filter->v4l2object->videodev = g_strdup (DEFAULT_PROP_DEVICE); +} + +static void +gst_v4l2radio_dispose (GObject * object) +{ + GstV4l2Radio *radio = GST_V4L2RADIO (object); + gst_v4l2_close (radio->v4l2object); + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_v4l2radio_finalize (GstV4l2Radio * radio) +{ + gst_v4l2_object_destroy (radio->v4l2object); + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (radio)); +} + +static gboolean +gst_v4l2radio_open (GstV4l2Radio * radio) +{ + GstV4l2Object *v4l2object; + + v4l2object = radio->v4l2object; + if (gst_v4l2_open (v4l2object)) + return gst_v4l2radio_fill_channel_list (radio); + else + return FALSE; +} + +static void +gst_v4l2radio_set_defaults (GstV4l2Radio * radio) +{ + GstV4l2Object *v4l2object; + GstTunerChannel *channel = NULL; + GstTuner *tuner; + + v4l2object = radio->v4l2object; + + if (!GST_IS_TUNER (v4l2object->element)) + return; + + tuner = GST_TUNER (v4l2object->element); + + if (v4l2object->channel) + channel = gst_tuner_find_channel_by_name (tuner, v4l2object->channel); + if (channel) { + gst_tuner_set_channel (tuner, channel); + } else { + channel = + GST_TUNER_CHANNEL (gst_tuner_get_channel (GST_TUNER + (v4l2object->element))); + if (channel) { + g_free (v4l2object->channel); + v4l2object->channel = g_strdup (channel->label); + gst_tuner_channel_changed (tuner, channel); + } + } + + if (channel + && GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { + if (v4l2object->frequency != 0) { + gst_tuner_set_frequency (tuner, channel, v4l2object->frequency); + } else { + v4l2object->frequency = gst_tuner_get_frequency (tuner, channel); + if (v4l2object->frequency == 0) { + /* guess */ + gst_tuner_set_frequency (tuner, channel, MIN_FREQUENCY); + } else { + } + } + } +} + +static gboolean +gst_v4l2radio_start (GstV4l2Radio * radio) +{ + if (!gst_v4l2radio_open (radio)) + return FALSE; + + gst_v4l2radio_set_defaults (radio); + + return TRUE; +} + +static gboolean +gst_v4l2radio_stop (GstV4l2Radio * radio) +{ + if (!gst_v4l2_object_stop (radio->v4l2object)) + return FALSE; + + return TRUE; +} + +static GstStateChangeReturn +gst_v4l2radio_change_state (GstElement * element, GstStateChange transition) +{ + GstV4l2Radio *radio; + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + radio = GST_V4L2RADIO (element); + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + /*start radio */ + if (!gst_v4l2radio_start (radio)) + ret = GST_STATE_CHANGE_FAILURE; + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + /*unmute radio */ + if (!gst_v4l2radio_set_unmute (radio)) + ret = GST_STATE_CHANGE_FAILURE; + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + /*mute radio */ + if (!gst_v4l2radio_set_mute (radio)) + ret = GST_STATE_CHANGE_FAILURE; + break; + case GST_STATE_CHANGE_READY_TO_NULL: + /*stop radio */ + if (!gst_v4l2radio_stop (radio)) + ret = GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + return ret; +} + +static void +gst_v4l2radio_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstV4l2Radio *radio = GST_V4L2RADIO (object); + gint frequency; + switch (prop_id) { + case ARG_DEVICE: + g_free (radio->v4l2object->videodev); + radio->v4l2object->videodev = + g_strdup ((gchar *) g_value_get_string (value)); + break; + case ARG_FREQUENCY: + frequency = g_value_get_int (value); + if (frequency >= MIN_FREQUENCY && frequency <= MAX_FREQUENCY) { + radio->v4l2object->frequency = frequency; + gst_v4l2_set_frequency (radio->v4l2object, 0, + radio->v4l2object->frequency); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_v4l2radio_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstV4l2Radio *radio = GST_V4L2RADIO (object); + + switch (prop_id) { + case ARG_DEVICE: + g_value_set_string (value, radio->v4l2object->videodev); + break; + case ARG_FREQUENCY: + if (gst_v4l2_get_frequency (radio->v4l2object, + 0, &(radio->v4l2object->frequency))) + g_value_set_int (value, radio->v4l2object->frequency); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstURIHandler interface */ +static GstURIType +gst_v4l2radio_uri_get_type (void) +{ + return GST_URI_SRC; +} + +static gchar ** +gst_v4l2radio_uri_get_protocols (void) +{ + static gchar *protocols[] = { (char *) "radio", NULL }; + return protocols; +} + +static const gchar * +gst_v4l2radio_uri_get_uri (GstURIHandler * handler) +{ + GstV4l2Radio *radio = GST_V4L2RADIO (handler); + + if (radio->v4l2object->videodev != NULL) { + if (gst_v4l2_get_frequency (radio->v4l2object, + 0, &(radio->v4l2object->frequency))) { + gchar uri[20]; + gchar freq[6]; + g_ascii_formatd (freq, 6, "%4.1f", radio->v4l2object->frequency / 1e6); + g_snprintf (uri, sizeof (uri), "radio://%s", freq); + return g_intern_string (uri); + } + } + + return "radio://"; +} + +static gboolean +gst_v4l2radio_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + GstV4l2Radio *radio = GST_V4L2RADIO (handler); + gdouble dfreq; + gint ifreq; + const gchar *freq; + gchar *end; + + if (strcmp (uri, "radio://") != 0) { + freq = uri + 8; + + dfreq = g_ascii_strtod (freq, &end); + + if (errno || strlen (end)) + goto uri_failed; + + ifreq = dfreq * 1e6; + g_object_set (radio, "frequency", ifreq, NULL); + + } else + goto uri_failed; + + return TRUE; + +uri_failed: + return FALSE; +} + +static void +gst_v4l2radio_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_v4l2radio_uri_get_type; + iface->get_protocols = gst_v4l2radio_uri_get_protocols; + iface->get_uri = gst_v4l2radio_uri_get_uri; + iface->set_uri = gst_v4l2radio_uri_set_uri; +} diff --git a/sys/v4l2/gstv4l2radio.h b/sys/v4l2/gstv4l2radio.h new file mode 100644 index 0000000..68b7ec3 --- /dev/null +++ b/sys/v4l2/gstv4l2radio.h @@ -0,0 +1,67 @@ +/* GStreamer v4l2 radio tuner element + * Copyright (C) 2010, 2011 Alexey Chernov <4ernov@gmail.com> + * + * gstv4l2radio.h - V4L2 radio tuner element + * + * 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_V4L2RADIO_H__ +#define __GST_V4L2RADIO_H__ + +#include "gstv4l2object.h" + +G_BEGIN_DECLS + +#define GST_TYPE_V4L2RADIO \ + (gst_v4l2radio_get_type()) +#define GST_V4L2RADIO(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2RADIO,GstV4l2Radio)) +#define GST_V4L2RADIO_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2RADIO,GstV4l2RadioClass)) +#define GST_IS_V4L2RADIO(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2RADIO)) +#define GST_IS_V4L2RADIO_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2RADIO)) + +typedef struct _GstV4l2Radio GstV4l2Radio; +typedef struct _GstV4l2RadioClass GstV4l2RadioClass; + +/** + * GstV4l2Radio: + * + * Opaque video4linux2 radio tuner element + */ +struct _GstV4l2Radio +{ + GstElement element; + + /*< private >*/ + GstV4l2Object * v4l2object; +}; + +struct _GstV4l2RadioClass +{ + GstElementClass parent_class; + + GList *v4l2_class_devices; +}; + +GType gst_v4l2radio_get_type (void); + +G_END_DECLS + +#endif /* __GST_V4L2RADIO_H__ */ diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c new file mode 100644 index 0000000..f6aba24 --- /dev/null +++ b/sys/v4l2/gstv4l2sink.c @@ -0,0 +1,971 @@ +/* GStreamer + * + * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/ + * + * Description: V4L2 sink element + * Created on: Jul 2, 2009 + * Author: Rob Clark + * + * 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-v4l2sink + * + * v4l2sink can be used to display video to v4l2 devices (screen overlays + * provided by the graphics hardware, tv-out, etc) + * + * + * Example launch lines + * |[ + * gst-launch videotestsrc ! v4l2sink device=/dev/video1 + * ]| This pipeline displays a test pattern on /dev/video1 + * |[ + * gst-launch -v videotestsrc ! navigationtest ! v4l2sink + * ]| A pipeline to test navigation events. + * While moving the mouse pointer over the test signal you will see a black box + * following the mouse pointer. If you press the mouse button somewhere on the + * video and release it somewhere else a green box will appear where you pressed + * the button and a red one where you released it. (The navigationtest element + * is part of gst-plugins-good.) You can observe here that even if the images + * are scaled through hardware the pointer coordinates are converted back to the + * original video frame geometry so that the box can be drawn to the correct + * position. This also handles borders correctly, limiting coordinates to the + * image area + * + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + + +#include "gstv4l2colorbalance.h" +#include "gstv4l2tuner.h" +#ifdef HAVE_XVIDEO +#include "gstv4l2xoverlay.h" +#endif +#include "gstv4l2vidorient.h" + +#include "gstv4l2sink.h" +#include "gst/gst-i18n-plugin.h" + +#include + +GST_DEBUG_CATEGORY (v4l2sink_debug); +#define GST_CAT_DEFAULT v4l2sink_debug + +#define PROP_DEF_QUEUE_SIZE 12 +#define PROP_DEF_MIN_QUEUED_BUFS 1 +#define DEFAULT_PROP_DEVICE "/dev/video1" + +enum +{ + PROP_0, + V4L2_STD_OBJECT_PROPS, + PROP_QUEUE_SIZE, + PROP_MIN_QUEUED_BUFS, + PROP_OVERLAY_TOP, + PROP_OVERLAY_LEFT, + PROP_OVERLAY_WIDTH, + PROP_OVERLAY_HEIGHT, + PROP_CROP_TOP, + PROP_CROP_LEFT, + PROP_CROP_WIDTH, + PROP_CROP_HEIGHT, +}; + + +GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2SinkClass, gst_v4l2sink); +GST_IMPLEMENT_V4L2_COLOR_BALANCE_METHODS (GstV4l2Sink, gst_v4l2sink); +GST_IMPLEMENT_V4L2_TUNER_METHODS (GstV4l2Sink, gst_v4l2sink); +#ifdef HAVE_XVIDEO +GST_IMPLEMENT_V4L2_XOVERLAY_METHODS (GstV4l2Sink, gst_v4l2sink); +#endif +GST_IMPLEMENT_V4L2_VIDORIENT_METHODS (GstV4l2Sink, gst_v4l2sink); + +static gboolean +gst_v4l2sink_iface_supported (GstImplementsInterface * iface, GType iface_type) +{ + GstV4l2Object *v4l2object = GST_V4L2SINK (iface)->v4l2object; + +#ifdef HAVE_XVIDEO + g_assert (iface_type == GST_TYPE_X_OVERLAY || + iface_type == GST_TYPE_NAVIGATION || + iface_type == GST_TYPE_COLOR_BALANCE || + iface_type == GST_TYPE_VIDEO_ORIENTATION || + iface_type == GST_TYPE_TUNER); +#else + g_assert (iface_type == GST_TYPE_COLOR_BALANCE || + iface_type == GST_TYPE_VIDEO_ORIENTATION || + iface_type == GST_TYPE_TUNER); +#endif + + if (v4l2object->video_fd == -1) + return FALSE; + +#ifdef HAVE_XVIDEO + if (!GST_V4L2_IS_OVERLAY (v4l2object)) { + if (iface_type == GST_TYPE_X_OVERLAY || iface_type == GST_TYPE_NAVIGATION) + return FALSE; + } +#endif + + return TRUE; +} + +static void +gst_v4l2sink_interface_init (GstImplementsInterfaceClass * klass) +{ + /* + * default virtual functions + */ + klass->supported = gst_v4l2sink_iface_supported; +} + +#ifdef HAVE_XVIDEO +static void gst_v4l2sink_navigation_send_event (GstNavigation * navigation, + GstStructure * structure); +static void +gst_v4l2sink_navigation_init (GstNavigationInterface * iface) +{ + iface->send_event = gst_v4l2sink_navigation_send_event; +} +#endif + +static void +gst_v4l2sink_init_interfaces (GType type) +{ + static const GInterfaceInfo v4l2iface_info = { + (GInterfaceInitFunc) gst_v4l2sink_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_tuner_info = { + (GInterfaceInitFunc) gst_v4l2sink_tuner_interface_init, + NULL, + NULL, + }; +#ifdef HAVE_XVIDEO + static const GInterfaceInfo v4l2_xoverlay_info = { + (GInterfaceInitFunc) gst_v4l2sink_xoverlay_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_navigation_info = { + (GInterfaceInitFunc) gst_v4l2sink_navigation_init, + NULL, + NULL, + }; +#endif + static const GInterfaceInfo v4l2_colorbalance_info = { + (GInterfaceInitFunc) gst_v4l2sink_color_balance_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_videoorientation_info = { + (GInterfaceInitFunc) gst_v4l2sink_video_orientation_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_propertyprobe_info = { + (GInterfaceInitFunc) gst_v4l2sink_property_probe_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, + GST_TYPE_IMPLEMENTS_INTERFACE, &v4l2iface_info); + g_type_add_interface_static (type, GST_TYPE_TUNER, &v4l2_tuner_info); +#ifdef HAVE_XVIDEO + g_type_add_interface_static (type, GST_TYPE_X_OVERLAY, &v4l2_xoverlay_info); + g_type_add_interface_static (type, + GST_TYPE_NAVIGATION, &v4l2_navigation_info); +#endif + g_type_add_interface_static (type, + GST_TYPE_COLOR_BALANCE, &v4l2_colorbalance_info); + g_type_add_interface_static (type, + GST_TYPE_VIDEO_ORIENTATION, &v4l2_videoorientation_info); + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &v4l2_propertyprobe_info); +} + + +GST_BOILERPLATE_FULL (GstV4l2Sink, gst_v4l2sink, GstVideoSink, + GST_TYPE_VIDEO_SINK, gst_v4l2sink_init_interfaces); + + +static void gst_v4l2sink_dispose (GObject * object); +static void gst_v4l2sink_finalize (GstV4l2Sink * v4l2sink); + +/* GObject methods: */ +static void gst_v4l2sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_v4l2sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + + +/* GstElement methods: */ +static GstStateChangeReturn gst_v4l2sink_change_state (GstElement * element, + GstStateChange transition); + +/* GstBaseSink methods: */ +static GstCaps *gst_v4l2sink_get_caps (GstBaseSink * bsink); +static gboolean gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps); +static GstFlowReturn gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, + guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); +static GstFlowReturn gst_v4l2sink_show_frame (GstBaseSink * bsink, + GstBuffer * buf); + +static void +gst_v4l2sink_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + GstV4l2SinkClass *gstv4l2sink_class = GST_V4L2SINK_CLASS (g_class); + GstPadTemplate *pad_template; + + gstv4l2sink_class->v4l2_class_devices = NULL; + + GST_DEBUG_CATEGORY_INIT (v4l2sink_debug, "v4l2sink", 0, "V4L2 sink element"); + + gst_element_class_set_details_simple (gstelement_class, + "Video (video4linux2) Sink", "Sink/Video", + "Displays frames on a video4linux2 device", "Rob Clark ,"); + + pad_template = + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + gst_v4l2_object_get_all_caps ()); + gst_element_class_add_pad_template (gstelement_class, pad_template); + gst_object_unref (pad_template); +} + +static void +gst_v4l2sink_class_init (GstV4l2SinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *element_class; + GstBaseSinkClass *basesink_class; + + gobject_class = G_OBJECT_CLASS (klass); + element_class = GST_ELEMENT_CLASS (klass); + basesink_class = GST_BASE_SINK_CLASS (klass); + + gobject_class->dispose = gst_v4l2sink_dispose; + gobject_class->finalize = (GObjectFinalizeFunc) gst_v4l2sink_finalize; + gobject_class->set_property = gst_v4l2sink_set_property; + gobject_class->get_property = gst_v4l2sink_get_property; + + element_class->change_state = gst_v4l2sink_change_state; + + gst_v4l2_object_install_properties_helper (gobject_class, + DEFAULT_PROP_DEVICE); + g_object_class_install_property (gobject_class, PROP_QUEUE_SIZE, + g_param_spec_uint ("queue-size", "Queue size", + "Number of buffers to be enqueud in the driver in streaming mode", + GST_V4L2_MIN_BUFFERS, GST_V4L2_MAX_BUFFERS, PROP_DEF_QUEUE_SIZE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_MIN_QUEUED_BUFS, + g_param_spec_uint ("min-queued-bufs", "Minimum queued bufs", + "Minimum number of queued bufs; v4l2sink won't dqbuf if the driver " + "doesn't have more than this number (which normally you shouldn't change)", + 0, GST_V4L2_MAX_BUFFERS, PROP_DEF_MIN_QUEUED_BUFS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_OVERLAY_TOP, + g_param_spec_int ("overlay-top", "Overlay top", + "The topmost (y) coordinate of the video overlay; top left corner of screen is 0,0", + G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_OVERLAY_LEFT, + g_param_spec_int ("overlay-left", "Overlay left", + "The leftmost (x) coordinate of the video overlay; top left corner of screen is 0,0", + G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_OVERLAY_WIDTH, + g_param_spec_uint ("overlay-width", "Overlay width", + "The width of the video overlay; default is equal to negotiated image width", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_OVERLAY_HEIGHT, + g_param_spec_uint ("overlay-height", "Overlay height", + "The height of the video overlay; default is equal to negotiated image height", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_CROP_TOP, + g_param_spec_int ("crop-top", "Crop top", + "The topmost (y) coordinate of the video crop; top left corner of image is 0,0", + 0x80000000, 0x7fffffff, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_CROP_LEFT, + g_param_spec_int ("crop-left", "Crop left", + "The leftmost (x) coordinate of the video crop; top left corner of image is 0,0", + 0x80000000, 0x7fffffff, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_CROP_WIDTH, + g_param_spec_uint ("crop-width", "Crop width", + "The width of the video crop; default is equal to negotiated image width", + 0, 0xffffffff, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_CROP_HEIGHT, + g_param_spec_uint ("crop-height", "Crop height", + "The height of the video crop; default is equal to negotiated image height", + 0, 0xffffffff, 0, G_PARAM_READWRITE)); + + basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_get_caps); + basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_set_caps); + basesink_class->buffer_alloc = GST_DEBUG_FUNCPTR (gst_v4l2sink_buffer_alloc); + basesink_class->render = GST_DEBUG_FUNCPTR (gst_v4l2sink_show_frame); +} + +static void +gst_v4l2sink_init (GstV4l2Sink * v4l2sink, GstV4l2SinkClass * klass) +{ + v4l2sink->v4l2object = gst_v4l2_object_new (GST_ELEMENT (v4l2sink), + V4L2_BUF_TYPE_VIDEO_OUTPUT, DEFAULT_PROP_DEVICE, + gst_v4l2_get_output, gst_v4l2_set_output, NULL); + + /* same default value for video output device as is used for + * v4l2src/capture is no good.. so lets set a saner default + * (which can be overridden by the one creating the v4l2sink + * after the constructor returns) + */ + g_object_set (v4l2sink, "device", "/dev/video1", NULL); + + /* number of buffers requested */ + v4l2sink->num_buffers = PROP_DEF_QUEUE_SIZE; + v4l2sink->min_queued_bufs = PROP_DEF_MIN_QUEUED_BUFS; + + v4l2sink->probed_caps = NULL; + v4l2sink->current_caps = NULL; + + v4l2sink->overlay_fields_set = 0; + v4l2sink->crop_fields_set = 0; + v4l2sink->state = 0; +} + + +static void +gst_v4l2sink_dispose (GObject * object) +{ + GstV4l2Sink *v4l2sink = GST_V4L2SINK (object); + + if (v4l2sink->probed_caps) { + gst_caps_unref (v4l2sink->probed_caps); + } + + if (v4l2sink->current_caps) { + gst_caps_unref (v4l2sink->current_caps); + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + + +static void +gst_v4l2sink_finalize (GstV4l2Sink * v4l2sink) +{ + gst_v4l2_object_destroy (v4l2sink->v4l2object); + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (v4l2sink)); +} + + +/* + * State values + */ +enum +{ + STATE_OFF = 0, + STATE_PENDING_STREAMON, + STATE_STREAMING +}; + +/* + * flags to indicate which overlay/crop properties the user has set (and + * therefore which ones should override the defaults from the driver) + */ +enum +{ + RECT_TOP_SET = 0x01, + RECT_LEFT_SET = 0x02, + RECT_WIDTH_SET = 0x04, + RECT_HEIGHT_SET = 0x08 +}; + +static void +gst_v4l2sink_sync_overlay_fields (GstV4l2Sink * v4l2sink) +{ + if (!v4l2sink->overlay_fields_set) + return; + + if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { + + gint fd = v4l2sink->v4l2object->video_fd; + struct v4l2_format format; + + memset (&format, 0x00, sizeof (struct v4l2_format)); + format.type = V4L2_BUF_TYPE_VIDEO_OVERLAY; + + if (v4l2_ioctl (fd, VIDIOC_G_FMT, &format) < 0) { + GST_WARNING_OBJECT (v4l2sink, "VIDIOC_G_FMT failed"); + return; + } + + GST_DEBUG_OBJECT (v4l2sink, + "setting overlay: overlay_fields_set=0x%02x, top=%d, left=%d, width=%d, height=%d", + v4l2sink->overlay_fields_set, + v4l2sink->overlay.top, v4l2sink->overlay.left, + v4l2sink->overlay.width, v4l2sink->overlay.height); + + if (v4l2sink->overlay_fields_set & RECT_TOP_SET) + format.fmt.win.w.top = v4l2sink->overlay.top; + if (v4l2sink->overlay_fields_set & RECT_LEFT_SET) + format.fmt.win.w.left = v4l2sink->overlay.left; + if (v4l2sink->overlay_fields_set & RECT_WIDTH_SET) + format.fmt.win.w.width = v4l2sink->overlay.width; + if (v4l2sink->overlay_fields_set & RECT_HEIGHT_SET) + format.fmt.win.w.height = v4l2sink->overlay.height; + + if (v4l2_ioctl (fd, VIDIOC_S_FMT, &format) < 0) { + GST_WARNING_OBJECT (v4l2sink, "VIDIOC_S_FMT failed"); + return; + } + + v4l2sink->overlay_fields_set = 0; + v4l2sink->overlay = format.fmt.win.w; + } +} + +static void +gst_v4l2sink_sync_crop_fields (GstV4l2Sink * v4l2sink) +{ + if (!v4l2sink->crop_fields_set) + return; + + if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { + + gint fd = v4l2sink->v4l2object->video_fd; + struct v4l2_crop crop; + + memset (&crop, 0x00, sizeof (struct v4l2_crop)); + crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + + if (v4l2_ioctl (fd, VIDIOC_G_CROP, &crop) < 0) { + GST_WARNING_OBJECT (v4l2sink, "VIDIOC_G_CROP failed"); + return; + } + + GST_DEBUG_OBJECT (v4l2sink, + "setting crop: crop_fields_set=0x%02x, top=%d, left=%d, width=%d, height=%d", + v4l2sink->crop_fields_set, + v4l2sink->crop.top, v4l2sink->crop.left, + v4l2sink->crop.width, v4l2sink->crop.height); + + if (v4l2sink->crop_fields_set & RECT_TOP_SET) + crop.c.top = v4l2sink->crop.top; + if (v4l2sink->crop_fields_set & RECT_LEFT_SET) + crop.c.left = v4l2sink->crop.left; + if (v4l2sink->crop_fields_set & RECT_WIDTH_SET) + crop.c.width = v4l2sink->crop.width; + if (v4l2sink->crop_fields_set & RECT_HEIGHT_SET) + crop.c.height = v4l2sink->crop.height; + + if (v4l2_ioctl (fd, VIDIOC_S_CROP, &crop) < 0) { + GST_WARNING_OBJECT (v4l2sink, "VIDIOC_S_CROP failed"); + return; + } + + v4l2sink->crop_fields_set = 0; + v4l2sink->crop = crop.c; + } +} + + +static void +gst_v4l2sink_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstV4l2Sink *v4l2sink = GST_V4L2SINK (object); + + if (!gst_v4l2_object_set_property_helper (v4l2sink->v4l2object, + prop_id, value, pspec)) { + switch (prop_id) { + case PROP_QUEUE_SIZE: + v4l2sink->num_buffers = g_value_get_uint (value); + break; + case PROP_MIN_QUEUED_BUFS: + v4l2sink->min_queued_bufs = g_value_get_uint (value); + break; + case PROP_OVERLAY_TOP: + v4l2sink->overlay.top = g_value_get_int (value); + v4l2sink->overlay_fields_set |= RECT_TOP_SET; + gst_v4l2sink_sync_overlay_fields (v4l2sink); + break; + case PROP_OVERLAY_LEFT: + v4l2sink->overlay.left = g_value_get_int (value); + v4l2sink->overlay_fields_set |= RECT_LEFT_SET; + gst_v4l2sink_sync_overlay_fields (v4l2sink); + break; + case PROP_OVERLAY_WIDTH: + v4l2sink->overlay.width = g_value_get_uint (value); + v4l2sink->overlay_fields_set |= RECT_WIDTH_SET; + gst_v4l2sink_sync_overlay_fields (v4l2sink); + break; + case PROP_OVERLAY_HEIGHT: + v4l2sink->overlay.height = g_value_get_uint (value); + v4l2sink->overlay_fields_set |= RECT_HEIGHT_SET; + gst_v4l2sink_sync_overlay_fields (v4l2sink); + break; + case PROP_CROP_TOP: + v4l2sink->crop.top = g_value_get_int (value); + v4l2sink->crop_fields_set |= RECT_TOP_SET; + gst_v4l2sink_sync_crop_fields (v4l2sink); + break; + case PROP_CROP_LEFT: + v4l2sink->crop.left = g_value_get_int (value); + v4l2sink->crop_fields_set |= RECT_LEFT_SET; + gst_v4l2sink_sync_crop_fields (v4l2sink); + break; + case PROP_CROP_WIDTH: + v4l2sink->crop.width = g_value_get_uint (value); + v4l2sink->crop_fields_set |= RECT_WIDTH_SET; + gst_v4l2sink_sync_crop_fields (v4l2sink); + break; + case PROP_CROP_HEIGHT: + v4l2sink->crop.height = g_value_get_uint (value); + v4l2sink->crop_fields_set |= RECT_HEIGHT_SET; + gst_v4l2sink_sync_crop_fields (v4l2sink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } +} + + +static void +gst_v4l2sink_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstV4l2Sink *v4l2sink = GST_V4L2SINK (object); + + if (!gst_v4l2_object_get_property_helper (v4l2sink->v4l2object, + prop_id, value, pspec)) { + switch (prop_id) { + case PROP_QUEUE_SIZE: + g_value_set_uint (value, v4l2sink->num_buffers); + break; + case PROP_MIN_QUEUED_BUFS: + g_value_set_uint (value, v4l2sink->min_queued_bufs); + break; + case PROP_OVERLAY_TOP: + g_value_set_int (value, v4l2sink->overlay.top); + break; + case PROP_OVERLAY_LEFT: + g_value_set_int (value, v4l2sink->overlay.left); + break; + case PROP_OVERLAY_WIDTH: + g_value_set_uint (value, v4l2sink->overlay.width); + break; + case PROP_OVERLAY_HEIGHT: + g_value_set_uint (value, v4l2sink->overlay.height); + break; + case PROP_CROP_TOP: + g_value_set_int (value, v4l2sink->crop.top); + break; + case PROP_CROP_LEFT: + g_value_set_int (value, v4l2sink->crop.left); + break; + case PROP_CROP_WIDTH: + g_value_set_uint (value, v4l2sink->crop.width); + break; + case PROP_CROP_HEIGHT: + g_value_set_uint (value, v4l2sink->crop.height); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } +} + +static GstStateChangeReturn +gst_v4l2sink_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstV4l2Sink *v4l2sink = GST_V4L2SINK (element); + + GST_DEBUG_OBJECT (v4l2sink, "%d -> %d", + GST_STATE_TRANSITION_CURRENT (transition), + GST_STATE_TRANSITION_NEXT (transition)); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + /* open the device */ + if (!gst_v4l2_object_start (v4l2sink->v4l2object)) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + if (v4l2sink->state == STATE_STREAMING) { + if (!gst_v4l2_object_stop_streaming (v4l2sink->v4l2object)) { + return GST_STATE_CHANGE_FAILURE; + } + v4l2sink->state = STATE_PENDING_STREAMON; + } + break; + case GST_STATE_CHANGE_READY_TO_NULL: + if (NULL != v4l2sink->pool) + gst_v4l2_buffer_pool_destroy (v4l2sink->pool); + v4l2sink->pool = NULL; + /* close the device */ + if (!gst_v4l2_object_stop (v4l2sink->v4l2object)) + return GST_STATE_CHANGE_FAILURE; + v4l2sink->state = STATE_OFF; + break; + default: + break; + } + + return ret; +} + + +static GstCaps * +gst_v4l2sink_get_caps (GstBaseSink * bsink) +{ + GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); + GstCaps *ret; + GSList *walk; + GSList *formats; + + if (!GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { + /* FIXME: copy? */ + GST_DEBUG_OBJECT (v4l2sink, "device is not open"); + return + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD + (v4l2sink))); + } + + if (v4l2sink->probed_caps) { + LOG_CAPS (v4l2sink, v4l2sink->probed_caps); + return gst_caps_ref (v4l2sink->probed_caps); + } + + formats = gst_v4l2_object_get_format_list (v4l2sink->v4l2object); + + ret = gst_caps_new_empty (); + + for (walk = formats; walk; walk = walk->next) { + struct v4l2_fmtdesc *format; + + GstStructure *template; + + format = (struct v4l2_fmtdesc *) walk->data; + + template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat); + + if (template) { + GstCaps *tmp; + + tmp = + gst_v4l2_object_probe_caps_for_format (v4l2sink->v4l2object, + format->pixelformat, template); + if (tmp) + gst_caps_append (ret, tmp); + + gst_structure_free (template); + } else { + GST_DEBUG_OBJECT (v4l2sink, "unknown format %u", format->pixelformat); + } + } + + v4l2sink->probed_caps = gst_caps_ref (ret); + + GST_INFO_OBJECT (v4l2sink, "probed caps: %p", ret); + LOG_CAPS (v4l2sink, ret); + + return ret; +} + +static gboolean +gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) +{ + GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); + gint w = 0, h = 0; + gboolean interlaced; + struct v4l2_fmtdesc *format; + guint fps_n, fps_d; + guint size; + + LOG_CAPS (v4l2sink, caps); + + if (!GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { + GST_DEBUG_OBJECT (v4l2sink, "device is not open"); + return FALSE; + } + + if (v4l2sink->current_caps) { + GST_DEBUG_OBJECT (v4l2sink, "already have caps set.. are they equal?"); + LOG_CAPS (v4l2sink, v4l2sink->current_caps); + if (gst_caps_is_equal (v4l2sink->current_caps, caps)) { + GST_DEBUG_OBJECT (v4l2sink, "yes they are!"); + return TRUE; + } + GST_DEBUG_OBJECT (v4l2sink, "no they aren't!"); + } + + if (v4l2sink->pool) { + /* TODO: if we've already allocated buffers, we probably need to + * do something here to free and reallocate.... + * + * gst_v4l2_object_stop_streaming() + * gst_v4l2_buffer_pool_destroy() + * + */ + GST_DEBUG_OBJECT (v4l2sink, "warning, changing caps not supported yet"); + return FALSE; + } + + /* we want our own v4l2 type of fourcc codes */ + if (!gst_v4l2_object_get_caps_info (v4l2sink->v4l2object, caps, + &format, &w, &h, &interlaced, &fps_n, &fps_d, &size)) { + GST_DEBUG_OBJECT (v4l2sink, "can't get capture format from caps %p", caps); + return FALSE; + } + + if (!format) { + GST_DEBUG_OBJECT (v4l2sink, "unrecognized caps!!"); + return FALSE; + } + + if (!gst_v4l2_object_set_format (v4l2sink->v4l2object, format->pixelformat, + w, h, interlaced)) { + /* error already posted */ + return FALSE; + } + + v4l2sink->video_width = w; + v4l2sink->video_height = h; + + /* TODO: videosink width/height should be scaled according to + * pixel-aspect-ratio + */ + GST_VIDEO_SINK_WIDTH (v4l2sink) = w; + GST_VIDEO_SINK_HEIGHT (v4l2sink) = h; + + v4l2sink->current_caps = gst_caps_ref (caps); + + return TRUE; +} + +/* buffer alloc function to implement pad_alloc for upstream element */ +static GstFlowReturn +gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf) +{ + GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); + GstV4l2Buffer *v4l2buf; + + if (v4l2sink->v4l2object->vcap.capabilities & V4L2_CAP_STREAMING) { + + /* initialize the buffer pool if not initialized yet (first buffer): */ + if (G_UNLIKELY (!v4l2sink->pool)) { + + /* set_caps() might not be called yet.. so just to make sure: */ + if (!gst_v4l2sink_set_caps (bsink, caps)) { + return GST_FLOW_ERROR; + } + + GST_V4L2_CHECK_OPEN (v4l2sink->v4l2object); + + if (!(v4l2sink->pool = gst_v4l2_buffer_pool_new (GST_ELEMENT (v4l2sink), + v4l2sink->v4l2object->video_fd, + v4l2sink->num_buffers, caps, FALSE, + V4L2_BUF_TYPE_VIDEO_OUTPUT))) { + return GST_FLOW_ERROR; + } + + gst_v4l2sink_sync_overlay_fields (v4l2sink); + gst_v4l2sink_sync_crop_fields (v4l2sink); + +#ifdef HAVE_XVIDEO + gst_v4l2_xoverlay_prepare_xwindow_id (v4l2sink->v4l2object, TRUE); +#endif + + v4l2sink->state = STATE_PENDING_STREAMON; + + GST_INFO_OBJECT (v4l2sink, "outputting buffers via mmap()"); + + if (v4l2sink->num_buffers != v4l2sink->pool->buffer_count) { + v4l2sink->num_buffers = v4l2sink->pool->buffer_count; + g_object_notify (G_OBJECT (v4l2sink), "queue-size"); + } + } + + v4l2buf = gst_v4l2_buffer_pool_get (v4l2sink->pool, TRUE); + + if (G_LIKELY (v4l2buf)) { + GST_DEBUG_OBJECT (v4l2sink, "allocated buffer: %p", v4l2buf); + *buf = GST_BUFFER (v4l2buf); + return GST_FLOW_OK; + } else { + GST_DEBUG_OBJECT (v4l2sink, "failed to allocate buffer"); + return GST_FLOW_ERROR; + } + + } else { + GST_ERROR_OBJECT (v4l2sink, "only supporting streaming mode for now..."); + return GST_FLOW_ERROR; + } +} + +/* called after A/V sync to render frame */ +static GstFlowReturn +gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) +{ + GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); + GstBuffer *newbuf = NULL; + + GST_DEBUG_OBJECT (v4l2sink, "render buffer: %p", buf); + + if (!GST_IS_V4L2_BUFFER (buf)) { + GstFlowReturn ret; + + /* special case check for sub-buffers: In certain cases, places like + * GstBaseTransform, which might check that the buffer is writable + * before copying metadata, timestamp, and such, will find that the + * buffer has more than one reference to it. In these cases, they + * will create a sub-buffer with an offset=0 and length equal to the + * original buffer size. + * + * This could happen in two scenarios: (1) a tee in the pipeline, and + * (2) because the refcnt is incremented in gst_mini_object_free() + * before the finalize function is called, and decremented after it + * returns.. but returning this buffer to the buffer pool in the + * finalize function, could wake up a thread blocked in _buffer_alloc() + * which could run and get a buffer w/ refcnt==2 before the thread + * originally unref'ing the buffer returns from finalize function and + * decrements the refcnt back to 1! + */ + if (buf->parent && + (GST_BUFFER_DATA (buf) == GST_BUFFER_DATA (buf->parent)) && + (GST_BUFFER_SIZE (buf) == GST_BUFFER_SIZE (buf->parent))) { + GST_DEBUG_OBJECT (v4l2sink, "I have a sub-buffer!"); + return gst_v4l2sink_show_frame (bsink, buf->parent); + } + + GST_DEBUG_OBJECT (v4l2sink, "slow-path.. I got a %s so I need to memcpy", + g_type_name (G_OBJECT_TYPE (buf))); + + ret = gst_v4l2sink_buffer_alloc (bsink, + GST_BUFFER_OFFSET (buf), GST_BUFFER_SIZE (buf), GST_BUFFER_CAPS (buf), + &newbuf); + + if (GST_FLOW_OK != ret) { + GST_DEBUG_OBJECT (v4l2sink, + "dropping frame! Consider increasing 'queue-size' property!"); + return GST_FLOW_OK; + } + + memcpy (GST_BUFFER_DATA (newbuf), + GST_BUFFER_DATA (buf), + MIN (GST_BUFFER_SIZE (newbuf), GST_BUFFER_SIZE (buf))); + + GST_DEBUG_OBJECT (v4l2sink, "render copied buffer: %p", newbuf); + + buf = newbuf; + } + + if (!gst_v4l2_buffer_pool_qbuf (v4l2sink->pool, GST_V4L2_BUFFER (buf))) { + return GST_FLOW_ERROR; + } + if (v4l2sink->state == STATE_PENDING_STREAMON) { + if (!gst_v4l2_object_start_streaming (v4l2sink->v4l2object)) { + return GST_FLOW_ERROR; + } + v4l2sink->state = STATE_STREAMING; + } + + if (!newbuf) { + gst_buffer_ref (buf); + } + + /* if the driver has more than one buffer, ie. more than just the one we + * just queued, then dequeue one immediately to make it available via + * _buffer_alloc(): + */ + if (gst_v4l2_buffer_pool_available_buffers (v4l2sink->pool) > + v4l2sink->min_queued_bufs) { + GstV4l2Buffer *v4l2buf = gst_v4l2_buffer_pool_dqbuf (v4l2sink->pool); + + /* note: if we get a buf, we don't want to use it directly (because + * someone else could still hold a ref).. but instead we release our + * reference to it, and if no one else holds a ref it will be returned + * to the pool of available buffers.. and if not, we keep looping. + */ + if (v4l2buf) { + gst_buffer_unref (GST_BUFFER (v4l2buf)); + } + } + + return GST_FLOW_OK; +} + +#ifdef HAVE_XVIDEO +static void +gst_v4l2sink_navigation_send_event (GstNavigation * navigation, + GstStructure * structure) +{ + GstV4l2Sink *v4l2sink = GST_V4L2SINK (navigation); + GstV4l2Xv *xv = v4l2sink->v4l2object->xv; + GstPad *peer; + + if (!xv) + return; + + if ((peer = gst_pad_get_peer (GST_VIDEO_SINK_PAD (v4l2sink)))) { + GstVideoRectangle rect; + gdouble x, y, xscale = 1.0, yscale = 1.0; + + gst_v4l2_xoverlay_get_render_rect (v4l2sink->v4l2object, &rect); + + /* We calculate scaling using the original video frames geometry to + * include pixel aspect ratio scaling. + */ + xscale = (gdouble) v4l2sink->video_width / rect.w; + yscale = (gdouble) v4l2sink->video_height / rect.h; + + /* Converting pointer coordinates to the non scaled geometry */ + if (gst_structure_get_double (structure, "pointer_x", &x)) { + x = MIN (x, rect.x + rect.w); + x = MAX (x - rect.x, 0); + gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, + (gdouble) x * xscale, NULL); + } + if (gst_structure_get_double (structure, "pointer_y", &y)) { + y = MIN (y, rect.y + rect.h); + y = MAX (y - rect.y, 0); + gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, + (gdouble) y * yscale, NULL); + } + + gst_pad_send_event (peer, gst_event_new_navigation (structure)); + gst_object_unref (peer); + } +} +#endif diff --git a/sys/v4l2/gstv4l2sink.h b/sys/v4l2/gstv4l2sink.h new file mode 100644 index 0000000..8fe8222 --- /dev/null +++ b/sys/v4l2/gstv4l2sink.h @@ -0,0 +1,91 @@ +/* GStreamer + * + * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/ + * + * Description: V4L2 sink element + * Created on: Jul 2, 2009 + * Author: Rob Clark + * + * 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 __GSTV4L2SINK_H__ +#define __GSTV4L2SINK_H__ + +#include +#include +#include + +GST_DEBUG_CATEGORY_EXTERN (v4l2sink_debug); + + +G_BEGIN_DECLS + +#define GST_TYPE_V4L2SINK \ + (gst_v4l2sink_get_type()) +#define GST_V4L2SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_V4L2SINK, GstV4l2Sink)) +#define GST_V4L2SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_V4L2SINK, GstV4l2SinkClass)) +#define GST_IS_V4L2SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_V4L2SINK)) +#define GST_IS_V4L2SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_V4L2SINK)) + +typedef struct _GstV4l2Sink GstV4l2Sink; +typedef struct _GstV4l2SinkClass GstV4l2SinkClass; + + +struct _GstV4l2Sink { + GstVideoSink videosink; + + /*< private >*/ + GstV4l2Object * v4l2object; + GstCaps *probed_caps; /* all supported caps of underlying v4l2 device */ + GstCaps *current_caps; /* the current negotiated caps */ + GstV4l2BufferPool *pool; + guint32 num_buffers; + guint32 min_queued_bufs; + + gint video_width, video_height; /* original (unscaled) video w/h */ + + /* + * field to store requested overlay and crop top/left/width/height props: + * note, could maybe be combined with 'vwin' field in GstV4l2Object? + */ + struct v4l2_rect overlay, crop; + + /* + * bitmask to track which overlay and crop fields user has requested by + * setting properties: + */ + guint8 overlay_fields_set, crop_fields_set; + + guint8 state; +}; + +struct _GstV4l2SinkClass { + GstVideoSinkClass parent_class; + + GList *v4l2_class_devices; +}; + +GType gst_v4l2sink_get_type(void); + +G_END_DECLS + + +#endif /* __GSTV4L2SINK_H__ */ diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c new file mode 100644 index 0000000..f8ae09c --- /dev/null +++ b/sys/v4l2/gstv4l2src.c @@ -0,0 +1,1072 @@ +/* GStreamer + * + * Copyright (C) 2001-2002 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2src.c: Video4Linux2 source element + * + * 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-v4l2src + * + * v4l2src can be used to capture video from v4l2 devices, like webcams and tv + * cards. + * + * + * Example launch lines + * |[ + * gst-launch v4l2src ! xvimagesink + * ]| This pipeline shows the video captured from /dev/video0 tv card and for + * webcams. + * |[ + * gst-launch v4l2src ! jpegdec ! xvimagesink + * ]| This pipeline shows the video captured from a webcam that delivers jpeg + * images. + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#undef HAVE_XVIDEO + +#include +#include +#include "v4l2src_calls.h" +#include + +#include "gstv4l2colorbalance.h" +#include "gstv4l2tuner.h" +#ifdef HAVE_XVIDEO +#include "gstv4l2xoverlay.h" +#endif +#include "gstv4l2vidorient.h" + +#include "gst/gst-i18n-plugin.h" + +GST_DEBUG_CATEGORY (v4l2src_debug); +#define GST_CAT_DEFAULT v4l2src_debug + +#define PROP_DEF_QUEUE_SIZE 2 +#define PROP_DEF_ALWAYS_COPY TRUE +#define PROP_DEF_DECIMATE 1 + +#define DEFAULT_PROP_DEVICE "/dev/video0" + +enum +{ + PROP_0, + V4L2_STD_OBJECT_PROPS, + PROP_QUEUE_SIZE, + PROP_ALWAYS_COPY, + PROP_DECIMATE +}; + +GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2SrcClass, gst_v4l2src); +GST_IMPLEMENT_V4L2_COLOR_BALANCE_METHODS (GstV4l2Src, gst_v4l2src); +GST_IMPLEMENT_V4L2_TUNER_METHODS (GstV4l2Src, gst_v4l2src); +#ifdef HAVE_XVIDEO +GST_IMPLEMENT_V4L2_XOVERLAY_METHODS (GstV4l2Src, gst_v4l2src); +#endif +GST_IMPLEMENT_V4L2_VIDORIENT_METHODS (GstV4l2Src, gst_v4l2src); + +static void gst_v4l2src_uri_handler_init (gpointer g_iface, + gpointer iface_data); + +static gboolean +gst_v4l2src_iface_supported (GstImplementsInterface * iface, GType iface_type) +{ + GstV4l2Object *v4l2object = GST_V4L2SRC (iface)->v4l2object; + +#ifdef HAVE_XVIDEO + if (!(iface_type == GST_TYPE_TUNER || + iface_type == GST_TYPE_X_OVERLAY || + iface_type == GST_TYPE_COLOR_BALANCE || + iface_type == GST_TYPE_VIDEO_ORIENTATION)) + return FALSE; +#else + if (!(iface_type == GST_TYPE_TUNER || + iface_type == GST_TYPE_COLOR_BALANCE || + iface_type == GST_TYPE_VIDEO_ORIENTATION)) + return FALSE; +#endif + + if (v4l2object->video_fd == -1) + return FALSE; + +#ifdef HAVE_XVIDEO + if (iface_type == GST_TYPE_X_OVERLAY && !GST_V4L2_IS_OVERLAY (v4l2object)) + return FALSE; +#endif + + return TRUE; +} + +static void +gst_v4l2src_interface_init (GstImplementsInterfaceClass * klass) +{ + /* + * default virtual functions + */ + klass->supported = gst_v4l2src_iface_supported; +} + +static void +gst_v4l2src_init_interfaces (GType type) +{ + static const GInterfaceInfo urihandler_info = { + gst_v4l2src_uri_handler_init, + NULL, + NULL + }; + + static const GInterfaceInfo v4l2iface_info = { + (GInterfaceInitFunc) gst_v4l2src_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_tuner_info = { + (GInterfaceInitFunc) gst_v4l2src_tuner_interface_init, + NULL, + NULL, + }; +#ifdef HAVE_XVIDEO + /* FIXME: does GstXOverlay for v4l2src make sense in a GStreamer context? */ + static const GInterfaceInfo v4l2_xoverlay_info = { + (GInterfaceInitFunc) gst_v4l2src_xoverlay_interface_init, + NULL, + NULL, + }; +#endif + static const GInterfaceInfo v4l2_colorbalance_info = { + (GInterfaceInitFunc) gst_v4l2src_color_balance_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_videoorientation_info = { + (GInterfaceInitFunc) gst_v4l2src_video_orientation_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo v4l2_propertyprobe_info = { + (GInterfaceInitFunc) gst_v4l2src_property_probe_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); + g_type_add_interface_static (type, + GST_TYPE_IMPLEMENTS_INTERFACE, &v4l2iface_info); + g_type_add_interface_static (type, GST_TYPE_TUNER, &v4l2_tuner_info); +#ifdef HAVE_XVIDEO + g_type_add_interface_static (type, GST_TYPE_X_OVERLAY, &v4l2_xoverlay_info); +#endif + g_type_add_interface_static (type, + GST_TYPE_COLOR_BALANCE, &v4l2_colorbalance_info); + g_type_add_interface_static (type, + GST_TYPE_VIDEO_ORIENTATION, &v4l2_videoorientation_info); + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &v4l2_propertyprobe_info); +} + +GST_BOILERPLATE_FULL (GstV4l2Src, gst_v4l2src, GstPushSrc, GST_TYPE_PUSH_SRC, + gst_v4l2src_init_interfaces); + +static void gst_v4l2src_dispose (GObject * object); +static void gst_v4l2src_finalize (GstV4l2Src * v4l2src); + +/* element methods */ +static GstStateChangeReturn gst_v4l2src_change_state (GstElement * element, + GstStateChange transition); + +/* basesrc methods */ +static gboolean gst_v4l2src_start (GstBaseSrc * src); +static gboolean gst_v4l2src_unlock (GstBaseSrc * src); +static gboolean gst_v4l2src_unlock_stop (GstBaseSrc * src); +static gboolean gst_v4l2src_stop (GstBaseSrc * src); +static gboolean gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps); +static GstCaps *gst_v4l2src_get_caps (GstBaseSrc * src); +static gboolean gst_v4l2src_query (GstBaseSrc * bsrc, GstQuery * query); +static GstFlowReturn gst_v4l2src_create (GstPushSrc * src, GstBuffer ** out); +static void gst_v4l2src_fixate (GstBaseSrc * basesrc, GstCaps * caps); +static gboolean gst_v4l2src_negotiate (GstBaseSrc * basesrc); + +static void gst_v4l2src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_v4l2src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +/* get_frame io methods */ +static GstFlowReturn +gst_v4l2src_get_read (GstV4l2Src * v4l2src, GstBuffer ** buf); +static GstFlowReturn +gst_v4l2src_get_mmap (GstV4l2Src * v4l2src, GstBuffer ** buf); + +static void +gst_v4l2src_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + GstV4l2SrcClass *gstv4l2src_class = GST_V4L2SRC_CLASS (g_class); + GstPadTemplate *pad_template; + + gstv4l2src_class->v4l2_class_devices = NULL; + + GST_DEBUG_CATEGORY_INIT (v4l2src_debug, "v4l2src", 0, "V4L2 source element"); + + gst_element_class_set_details_simple (gstelement_class, + "Video (video4linux2) Source", "Source/Video", + "Reads frames from a Video4Linux2 device", + "Edgard Lima ," + " Stefan Kost "); + + pad_template = + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + gst_v4l2_object_get_all_caps ()); + gst_element_class_add_pad_template (gstelement_class, pad_template); + gst_object_unref (pad_template); +} + +static void +gst_v4l2src_class_init (GstV4l2SrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *element_class; + GstBaseSrcClass *basesrc_class; + GstPushSrcClass *pushsrc_class; + + gobject_class = G_OBJECT_CLASS (klass); + element_class = GST_ELEMENT_CLASS (klass); + basesrc_class = GST_BASE_SRC_CLASS (klass); + pushsrc_class = GST_PUSH_SRC_CLASS (klass); + + gobject_class->dispose = gst_v4l2src_dispose; + gobject_class->finalize = (GObjectFinalizeFunc) gst_v4l2src_finalize; + gobject_class->set_property = gst_v4l2src_set_property; + gobject_class->get_property = gst_v4l2src_get_property; + + element_class->change_state = gst_v4l2src_change_state; + + gst_v4l2_object_install_properties_helper (gobject_class, + DEFAULT_PROP_DEVICE); + g_object_class_install_property (gobject_class, PROP_QUEUE_SIZE, + g_param_spec_uint ("queue-size", "Queue size", + "Number of buffers to be enqueud in the driver in streaming mode", + GST_V4L2_MIN_BUFFERS, GST_V4L2_MAX_BUFFERS, PROP_DEF_QUEUE_SIZE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_ALWAYS_COPY, + g_param_spec_boolean ("always-copy", "Always Copy", + "If the buffer will or not be used directly from mmap", + PROP_DEF_ALWAYS_COPY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstV4l2Src:decimate + * + * Only use every nth frame + * + * Since: 0.10.26 + */ + g_object_class_install_property (gobject_class, PROP_DECIMATE, + g_param_spec_int ("decimate", "Decimate", + "Only use every nth frame", 1, G_MAXINT, + PROP_DEF_DECIMATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2src_get_caps); + basesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2src_set_caps); + basesrc_class->start = GST_DEBUG_FUNCPTR (gst_v4l2src_start); + basesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_v4l2src_unlock); + basesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_v4l2src_unlock_stop); + basesrc_class->stop = GST_DEBUG_FUNCPTR (gst_v4l2src_stop); + basesrc_class->query = GST_DEBUG_FUNCPTR (gst_v4l2src_query); + basesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_v4l2src_fixate); + basesrc_class->negotiate = GST_DEBUG_FUNCPTR (gst_v4l2src_negotiate); + + pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_v4l2src_create); +} + +static void +gst_v4l2src_init (GstV4l2Src * v4l2src, GstV4l2SrcClass * klass) +{ + /* fixme: give an update_fps_function */ + v4l2src->v4l2object = gst_v4l2_object_new (GST_ELEMENT (v4l2src), + V4L2_BUF_TYPE_VIDEO_CAPTURE, DEFAULT_PROP_DEVICE, + gst_v4l2_get_input, gst_v4l2_set_input, NULL); + + /* number of buffers requested */ + v4l2src->num_buffers = PROP_DEF_QUEUE_SIZE; + + v4l2src->always_copy = PROP_DEF_ALWAYS_COPY; + v4l2src->decimate = PROP_DEF_DECIMATE; + + v4l2src->is_capturing = FALSE; + + gst_base_src_set_format (GST_BASE_SRC (v4l2src), GST_FORMAT_TIME); + gst_base_src_set_live (GST_BASE_SRC (v4l2src), TRUE); + + v4l2src->fps_d = 0; + v4l2src->fps_n = 0; +} + + +static void +gst_v4l2src_dispose (GObject * object) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (object); + + if (v4l2src->probed_caps) { + gst_caps_unref (v4l2src->probed_caps); + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + + +static void +gst_v4l2src_finalize (GstV4l2Src * v4l2src) +{ + gst_v4l2_object_destroy (v4l2src->v4l2object); + + G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (v4l2src)); +} + + +static void +gst_v4l2src_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (object); + + if (!gst_v4l2_object_set_property_helper (v4l2src->v4l2object, + prop_id, value, pspec)) { + switch (prop_id) { + case PROP_QUEUE_SIZE: + v4l2src->num_buffers = g_value_get_uint (value); + break; + case PROP_ALWAYS_COPY: + v4l2src->always_copy = g_value_get_boolean (value); + break; + case PROP_DECIMATE: + v4l2src->decimate = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } +} + + +static void +gst_v4l2src_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (object); + + if (!gst_v4l2_object_get_property_helper (v4l2src->v4l2object, + prop_id, value, pspec)) { + switch (prop_id) { + case PROP_QUEUE_SIZE: + g_value_set_uint (value, v4l2src->num_buffers); + break; + case PROP_ALWAYS_COPY: + g_value_set_boolean (value, v4l2src->always_copy); + break; + case PROP_DECIMATE: + g_value_set_int (value, v4l2src->decimate); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } +} + + +/* this function is a bit of a last resort */ +static void +gst_v4l2src_fixate (GstBaseSrc * basesrc, GstCaps * caps) +{ + GstStructure *structure; + gint i; + + GST_DEBUG_OBJECT (basesrc, "fixating caps %" GST_PTR_FORMAT, caps); + + for (i = 0; i < gst_caps_get_size (caps); ++i) { + const GValue *v; + + structure = gst_caps_get_structure (caps, i); + + /* FIXME such sizes? we usually fixate to something in the 320x200 + * range... */ + /* We are fixating to greater possble size (limited to GST_V4L2_MAX_SIZE) + and the maximum framerate resolution for that size */ + gst_structure_fixate_field_nearest_int (structure, "width", + GST_V4L2_MAX_SIZE); + gst_structure_fixate_field_nearest_int (structure, "height", + GST_V4L2_MAX_SIZE); + gst_structure_fixate_field_nearest_fraction (structure, "framerate", + G_MAXINT, 1); + + v = gst_structure_get_value (structure, "format"); + if (v && G_VALUE_TYPE (v) != GST_TYPE_FOURCC) { + guint32 fourcc; + + g_return_if_fail (G_VALUE_TYPE (v) == GST_TYPE_LIST); + + fourcc = gst_value_get_fourcc (gst_value_list_get_value (v, 0)); + gst_structure_set (structure, "format", GST_TYPE_FOURCC, fourcc, NULL); + } + } + + GST_DEBUG_OBJECT (basesrc, "fixated caps %" GST_PTR_FORMAT, caps); +} + + +static gboolean +gst_v4l2src_negotiate (GstBaseSrc * basesrc) +{ + GstCaps *thiscaps; + GstCaps *caps = NULL; + GstCaps *peercaps = NULL; + gboolean result = FALSE; + + /* first see what is possible on our source pad */ + thiscaps = gst_pad_get_caps (GST_BASE_SRC_PAD (basesrc)); + GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps); + LOG_CAPS (basesrc, thiscaps); + + /* nothing or anything is allowed, we're done */ + if (thiscaps == NULL || gst_caps_is_any (thiscaps)) + goto no_nego_needed; + + /* get the peer caps */ + peercaps = gst_pad_peer_get_caps (GST_BASE_SRC_PAD (basesrc)); + GST_DEBUG_OBJECT (basesrc, "caps of peer: %" GST_PTR_FORMAT, peercaps); + LOG_CAPS (basesrc, peercaps); + if (peercaps && !gst_caps_is_any (peercaps)) { + GstCaps *icaps = NULL; + int i; + + /* Prefer the first caps we are compatible with that the peer proposed */ + for (i = 0; i < gst_caps_get_size (peercaps); i++) { + /* get intersection */ + GstCaps *ipcaps = gst_caps_copy_nth (peercaps, i); + + GST_DEBUG_OBJECT (basesrc, "peer: %" GST_PTR_FORMAT, ipcaps); + LOG_CAPS (basesrc, ipcaps); + + icaps = gst_caps_intersect (thiscaps, ipcaps); + gst_caps_unref (ipcaps); + + if (!gst_caps_is_empty (icaps)) + break; + + gst_caps_unref (icaps); + icaps = NULL; + } + + GST_DEBUG_OBJECT (basesrc, "intersect: %" GST_PTR_FORMAT, icaps); + LOG_CAPS (basesrc, icaps); + if (icaps) { + /* If there are multiple intersections pick the one with the smallest + * resolution strictly bigger then the first peer caps */ + if (gst_caps_get_size (icaps) > 1) { + GstStructure *s = gst_caps_get_structure (peercaps, 0); + + int best = 0; + + int twidth, theight; + + int width = G_MAXINT, height = G_MAXINT; + + if (gst_structure_get_int (s, "width", &twidth) + && gst_structure_get_int (s, "height", &theight)) { + + /* Walk the structure backwards to get the first entry of the + * smallest resolution bigger (or equal to) the preferred resolution) + */ + for (i = gst_caps_get_size (icaps) - 1; i >= 0; i--) { + GstStructure *is = gst_caps_get_structure (icaps, i); + + int w, h; + + if (gst_structure_get_int (is, "width", &w) + && gst_structure_get_int (is, "height", &h)) { + if (w >= twidth && w <= width && h >= theight && h <= height) { + width = w; + height = h; + best = i; + } + } + } + } + + caps = gst_caps_copy_nth (icaps, best); + gst_caps_unref (icaps); + } else { + caps = icaps; + } + } + gst_caps_unref (thiscaps); + } else { + /* no peer or peer have ANY caps, work with our own caps then */ + caps = thiscaps; + } + if (peercaps) + gst_caps_unref (peercaps); + if (caps) { + caps = gst_caps_make_writable (caps); + gst_caps_truncate (caps); + + /* now fixate */ + if (!gst_caps_is_empty (caps)) { + gst_pad_fixate_caps (GST_BASE_SRC_PAD (basesrc), caps); + GST_DEBUG_OBJECT (basesrc, "fixated to: %" GST_PTR_FORMAT, caps); + LOG_CAPS (basesrc, caps); + + if (gst_caps_is_any (caps)) { + /* hmm, still anything, so element can do anything and + * nego is not needed */ + result = TRUE; + } else if (gst_caps_is_fixed (caps)) { + /* yay, fixed caps, use those then */ + if (gst_pad_set_caps (GST_BASE_SRC_PAD (basesrc), caps)) + result = TRUE; + } + } + gst_caps_unref (caps); + } + return result; + +no_nego_needed: + { + GST_DEBUG_OBJECT (basesrc, "no negotiation needed"); + if (thiscaps) + gst_caps_unref (thiscaps); + return TRUE; + } +} + +static GstCaps * +gst_v4l2src_get_caps (GstBaseSrc * src) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (src); + GstCaps *ret; + GSList *walk; + GSList *formats; + + if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) { + /* FIXME: copy? */ + return + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD + (v4l2src))); + } + + if (v4l2src->probed_caps) + return gst_caps_ref (v4l2src->probed_caps); + + formats = gst_v4l2_object_get_format_list (v4l2src->v4l2object); + + ret = gst_caps_new_empty (); + + for (walk = formats; walk; walk = walk->next) { + struct v4l2_fmtdesc *format; + + GstStructure *template; + + format = (struct v4l2_fmtdesc *) walk->data; + + template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat); + + if (template) { + GstCaps *tmp; + + tmp = + gst_v4l2_object_probe_caps_for_format (v4l2src->v4l2object, + format->pixelformat, template); + if (tmp) + gst_caps_append (ret, tmp); + + gst_structure_free (template); + } else { + GST_DEBUG_OBJECT (v4l2src, "unknown format %u", format->pixelformat); + } + } + + v4l2src->probed_caps = gst_caps_ref (ret); + + GST_INFO_OBJECT (v4l2src, "probed caps: %" GST_PTR_FORMAT, ret); + + return ret; +} + +static gboolean +gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps) +{ + GstV4l2Src *v4l2src; + gint w = 0, h = 0; + gboolean interlaced; + struct v4l2_fmtdesc *format; + guint fps_n, fps_d; + guint size; + + v4l2src = GST_V4L2SRC (src); + + /* if we're not open, punt -- we'll get setcaps'd later via negotiate */ + if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) + return FALSE; + + /* make sure we stop capturing and dealloc buffers */ + if (GST_V4L2_IS_ACTIVE (v4l2src->v4l2object)) { + /* both will throw an element-error on failure */ + if (!gst_v4l2src_capture_stop (v4l2src)) + return FALSE; + if (!gst_v4l2src_capture_deinit (v4l2src)) + return FALSE; + } + + /* we want our own v4l2 type of fourcc codes */ + if (!gst_v4l2_object_get_caps_info (v4l2src->v4l2object, caps, &format, &w, + &h, &interlaced, &fps_n, &fps_d, &size)) { + GST_INFO_OBJECT (v4l2src, + "can't get capture format from caps %" GST_PTR_FORMAT, caps); + return FALSE; + } + + GST_DEBUG_OBJECT (v4l2src, "trying to set_capture %dx%d at %d/%d fps, " + "format %s", w, h, fps_n, fps_d, format->description); + + if (!gst_v4l2src_set_capture (v4l2src, format->pixelformat, w, h, + interlaced, fps_n, fps_d)) + /* error already posted */ + return FALSE; + + if (!gst_v4l2src_capture_init (v4l2src, caps)) + return FALSE; + + if (v4l2src->use_mmap) { + v4l2src->get_frame = gst_v4l2src_get_mmap; + } else { + v4l2src->get_frame = gst_v4l2src_get_read; + } + + if (!gst_v4l2src_capture_start (v4l2src)) + return FALSE; + + /* now store the expected output size */ + v4l2src->frame_byte_size = size; + + return TRUE; +} + +static gboolean +gst_v4l2src_query (GstBaseSrc * bsrc, GstQuery * query) +{ + GstV4l2Src *src; + + gboolean res = FALSE; + + src = GST_V4L2SRC (bsrc); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY:{ + GstClockTime min_latency, max_latency; + + /* device must be open */ + if (!GST_V4L2_IS_OPEN (src->v4l2object)) { + GST_WARNING_OBJECT (src, + "Can't give latency since device isn't open !"); + goto done; + } + + /* we must have a framerate */ + if (src->fps_n <= 0 || src->fps_d <= 0) { + GST_WARNING_OBJECT (src, + "Can't give latency since framerate isn't fixated !"); + goto done; + } + + /* min latency is the time to capture one frame */ + min_latency = + gst_util_uint64_scale_int (GST_SECOND, src->fps_d, src->fps_n); + + /* max latency is total duration of the frame buffer */ + max_latency = src->num_buffers * min_latency; + + GST_DEBUG_OBJECT (bsrc, + "report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + /* we are always live, the min latency is 1 frame and the max latency is + * the complete buffer of frames. */ + gst_query_set_latency (query, TRUE, min_latency, max_latency); + + res = TRUE; + break; + } + default: + res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query); + break; + } + +done: + + return res; +} + +/* start and stop are not symmetric -- start will open the device, but not start + * capture. it's setcaps that will start capture, which is called via basesrc's + * negotiate method. stop will both stop capture and close the device. + */ +static gboolean +gst_v4l2src_start (GstBaseSrc * src) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (src); + + v4l2src->offset = 0; + + /* activate settings for first frame */ + v4l2src->ctrl_time = 0; + gst_object_sync_values (G_OBJECT (src), v4l2src->ctrl_time); + + return TRUE; +} + +static gboolean +gst_v4l2src_unlock (GstBaseSrc * src) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (src); + + GST_LOG_OBJECT (src, "Flushing"); + gst_poll_set_flushing (v4l2src->v4l2object->poll, TRUE); + + return TRUE; +} + +static gboolean +gst_v4l2src_unlock_stop (GstBaseSrc * src) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (src); + + GST_LOG_OBJECT (src, "No longer flushing"); + gst_poll_set_flushing (v4l2src->v4l2object->poll, FALSE); + + return TRUE; +} + +static gboolean +gst_v4l2src_stop (GstBaseSrc * src) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (src); + + if (GST_V4L2_IS_ACTIVE (v4l2src->v4l2object) + && !gst_v4l2src_capture_stop (v4l2src)) + return FALSE; + + if (v4l2src->v4l2object->buffer != NULL) { + if (!gst_v4l2src_capture_deinit (v4l2src)) + return FALSE; + } + + v4l2src->fps_d = 0; + v4l2src->fps_n = 0; + + return TRUE; +} + +static GstStateChangeReturn +gst_v4l2src_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstV4l2Src *v4l2src = GST_V4L2SRC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + /* open the device */ + if (!gst_v4l2_object_start (v4l2src->v4l2object)) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + /* close the device */ + if (!gst_v4l2_object_stop (v4l2src->v4l2object)) + return GST_STATE_CHANGE_FAILURE; + + if (v4l2src->probed_caps) { + gst_caps_unref (v4l2src->probed_caps); + v4l2src->probed_caps = NULL; + } + break; + default: + break; + } + + return ret; +} + +static GstFlowReturn +gst_v4l2src_get_read (GstV4l2Src * v4l2src, GstBuffer ** buf) +{ + gint amount; + gint ret; + + gint buffersize; + + buffersize = v4l2src->frame_byte_size; + /* In case the size per frame is unknown assume it's a streaming format (e.g. + * mpegts) and grab a reasonable default size instead */ + if (buffersize == 0) + buffersize = GST_BASE_SRC (v4l2src)->blocksize; + + *buf = gst_buffer_new_and_alloc (buffersize); + + do { + ret = gst_poll_wait (v4l2src->v4l2object->poll, GST_CLOCK_TIME_NONE); + if (G_UNLIKELY (ret < 0)) { + if (errno == EBUSY) + goto stopped; + if (errno == ENXIO) { + GST_DEBUG_OBJECT (v4l2src, + "v4l2 device doesn't support polling. Disabling"); + v4l2src->v4l2object->can_poll_device = FALSE; + } else { + if (errno != EAGAIN && errno != EINTR) + goto select_error; + } + } + amount = + v4l2_read (v4l2src->v4l2object->video_fd, GST_BUFFER_DATA (*buf), + buffersize); + if (amount == buffersize) { + break; + } else if (amount == -1) { + if (errno == EAGAIN || errno == EINTR) { + continue; + } else + goto read_error; + } else { + /* short reads can happen if a signal interrupts the read */ + continue; + } + } while (TRUE); + + /* we set the buffer metadata in gst_v4l2src_create() */ + + return GST_FLOW_OK; + + /* ERRORS */ +select_error: + { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (NULL), + ("select error %d: %s (%d)", ret, g_strerror (errno), errno)); + return GST_FLOW_ERROR; + } +stopped: + { + GST_DEBUG ("stop called"); + return GST_FLOW_WRONG_STATE; + } +read_error: + { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, + (_("Error reading %d bytes from device '%s'."), + buffersize, v4l2src->v4l2object->videodev), GST_ERROR_SYSTEM); + gst_buffer_unref (*buf); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_v4l2src_get_mmap (GstV4l2Src * v4l2src, GstBuffer ** buf) +{ + GstBuffer *temp; + GstFlowReturn ret; + guint size; + guint count = 0; + +again: + ret = gst_v4l2src_grab_frame (v4l2src, &temp); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto done; + + if (v4l2src->frame_byte_size > 0) { + size = GST_BUFFER_SIZE (temp); + + /* if size does not match what we expected, try again */ + if (size != v4l2src->frame_byte_size) { + GST_ELEMENT_WARNING (v4l2src, RESOURCE, READ, + (_("Got unexpected frame size of %u instead of %u."), + size, v4l2src->frame_byte_size), (NULL)); + gst_buffer_unref (temp); + if (count++ > 50) + goto size_error; + + goto again; + } + } + + *buf = temp; +done: + return ret; + + /* ERRORS */ +size_error: + { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, + (_("Error reading %d bytes on device '%s'."), + v4l2src->frame_byte_size, v4l2src->v4l2object->videodev), (NULL)); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (src); + int i; + GstFlowReturn ret; + + for (i = 0; i < v4l2src->decimate - 1; i++) { + ret = v4l2src->get_frame (v4l2src, buf); + if (ret != GST_FLOW_OK) { + return ret; + } + gst_buffer_unref (*buf); + } + + ret = v4l2src->get_frame (v4l2src, buf); + + /* set buffer metadata */ + if (G_LIKELY (ret == GST_FLOW_OK && *buf)) { + GstClock *clock; + GstClockTime timestamp; + + GST_BUFFER_OFFSET (*buf) = v4l2src->offset++; + GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset; + + /* timestamps, LOCK to get clock and base time. */ + /* FIXME: element clock and base_time is rarely changing */ + GST_OBJECT_LOCK (v4l2src); + if ((clock = GST_ELEMENT_CLOCK (v4l2src))) { + /* we have a clock, get base time and ref clock */ + timestamp = GST_ELEMENT (v4l2src)->base_time; + gst_object_ref (clock); + } else { + /* no clock, can't set timestamps */ + timestamp = GST_CLOCK_TIME_NONE; + } + GST_OBJECT_UNLOCK (v4l2src); + + if (G_LIKELY (clock)) { + /* the time now is the time of the clock minus the base time */ + timestamp = gst_clock_get_time (clock) - timestamp; + gst_object_unref (clock); + + /* if we have a framerate adjust timestamp for frame latency */ + if (GST_CLOCK_TIME_IS_VALID (v4l2src->duration)) { + if (timestamp > v4l2src->duration) + timestamp -= v4l2src->duration; + else + timestamp = 0; + } + } + + /* activate settings for next frame */ + if (GST_CLOCK_TIME_IS_VALID (v4l2src->duration)) { + v4l2src->ctrl_time += v4l2src->duration; + } else { + /* this is not very good (as it should be the next timestamp), + * still good enough for linear fades (as long as it is not -1) + */ + v4l2src->ctrl_time = timestamp; + } + gst_object_sync_values (G_OBJECT (src), v4l2src->ctrl_time); + GST_INFO_OBJECT (src, "sync to %" GST_TIME_FORMAT, + GST_TIME_ARGS (v4l2src->ctrl_time)); + + /* FIXME: use the timestamp from the buffer itself! */ + GST_BUFFER_TIMESTAMP (*buf) = timestamp; + GST_BUFFER_DURATION (*buf) = v4l2src->duration; + } + return ret; +} + + +/* GstURIHandler interface */ +static GstURIType +gst_v4l2src_uri_get_type (void) +{ + return GST_URI_SRC; +} + +static gchar ** +gst_v4l2src_uri_get_protocols (void) +{ + static gchar *protocols[] = { (char *) "v4l2", NULL }; + + return protocols; +} + +static const gchar * +gst_v4l2src_uri_get_uri (GstURIHandler * handler) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (handler); + + if (v4l2src->v4l2object->videodev != NULL) { + gchar uri[256]; + + /* need to return a const string, but also don't want to leak the generated + * string, so just intern it - there's a limited number of video devices + * after all */ + g_snprintf (uri, sizeof (uri), "v4l2://%s", v4l2src->v4l2object->videodev); + return g_intern_string (uri); + } + + return "v4l2://"; +} + +static gboolean +gst_v4l2src_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (handler); + const gchar *device = DEFAULT_PROP_DEVICE; + + if (strcmp (uri, "v4l2://") != 0) { + device = uri + 7; + } + g_object_set (v4l2src, "device", device, NULL); + + return TRUE; +} + + +static void +gst_v4l2src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_v4l2src_uri_get_type; + iface->get_protocols = gst_v4l2src_uri_get_protocols; + iface->get_uri = gst_v4l2src_uri_get_uri; + iface->set_uri = gst_v4l2src_uri_set_uri; +} diff --git a/sys/v4l2/gstv4l2src.h b/sys/v4l2/gstv4l2src.h new file mode 100644 index 0000000..0dd794a --- /dev/null +++ b/sys/v4l2/gstv4l2src.h @@ -0,0 +1,102 @@ +/* GStreamer + * + * Copyright (C) 2001-2002 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2src.h: BT8x8/V4L2 source element + * + * 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_V4L2SRC_H__ +#define __GST_V4L2SRC_H__ + +#include +#include + +GST_DEBUG_CATEGORY_EXTERN (v4l2src_debug); + +G_BEGIN_DECLS + +#define GST_TYPE_V4L2SRC \ + (gst_v4l2src_get_type()) +#define GST_V4L2SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2SRC,GstV4l2Src)) +#define GST_V4L2SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2SRC,GstV4l2SrcClass)) +#define GST_IS_V4L2SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2SRC)) +#define GST_IS_V4L2SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2SRC)) + +typedef struct _GstV4l2Src GstV4l2Src; +typedef struct _GstV4l2SrcClass GstV4l2SrcClass; + +typedef GstFlowReturn (*GstV4l2SrcGetFunc)(GstV4l2Src * v4l2src, GstBuffer ** buf); + +/** + * GstV4l2Src: + * + * Opaque object. + */ +struct _GstV4l2Src +{ + GstPushSrc pushsrc; + + /*< private >*/ + GstV4l2Object * v4l2object; + + /* pads */ + GstCaps *probed_caps; + + /* buffer handling */ + GstV4l2BufferPool *pool; + + guint32 num_buffers; + gboolean use_mmap; + guint32 frame_byte_size; + + /* if the buffer will be or not used from directly mmap */ + gboolean always_copy; + + int decimate; + + /* True if we want to stop */ + gboolean quit; + gboolean is_capturing; + + guint64 offset; + + gint fps_d, fps_n; /* framerate if device is open */ + GstClockTime duration; /* duration of one frame */ + + GstClockTime ctrl_time; + + GstV4l2SrcGetFunc get_frame; +}; + +struct _GstV4l2SrcClass +{ + GstPushSrcClass parent_class; + + GList *v4l2_class_devices; +}; + +GType gst_v4l2src_get_type (void); + +G_END_DECLS + +#endif /* __GST_V4L2SRC_H__ */ diff --git a/sys/v4l2/gstv4l2tuner.c b/sys/v4l2/gstv4l2tuner.c new file mode 100644 index 0000000..a805396 --- /dev/null +++ b/sys/v4l2/gstv4l2tuner.c @@ -0,0 +1,364 @@ +/* GStreamer + * + * Copyright (C) 2003 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2tuner.c: tuner interface implementation for V4L2 + * + * 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 + +#include "gstv4l2tuner.h" +#include "gstv4l2object.h" +#include "v4l2_calls.h" +#include "v4l2src_calls.h" + +static void gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass * + klass); +static void gst_v4l2_tuner_channel_init (GstV4l2TunerChannel * channel); + +static void gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass * klass); +static void gst_v4l2_tuner_norm_init (GstV4l2TunerNorm * norm); + +static GstTunerNormClass *norm_parent_class = NULL; +static GstTunerChannelClass *channel_parent_class = NULL; + +GType +gst_v4l2_tuner_channel_get_type (void) +{ + static GType gst_v4l2_tuner_channel_type = 0; + + if (!gst_v4l2_tuner_channel_type) { + static const GTypeInfo v4l2_tuner_channel_info = { + sizeof (GstV4l2TunerChannelClass), + NULL, + NULL, + (GClassInitFunc) gst_v4l2_tuner_channel_class_init, + NULL, + NULL, + sizeof (GstV4l2TunerChannel), + 0, + (GInstanceInitFunc) gst_v4l2_tuner_channel_init, + NULL + }; + + gst_v4l2_tuner_channel_type = + g_type_register_static (GST_TYPE_TUNER_CHANNEL, + "GstV4l2TunerChannel", &v4l2_tuner_channel_info, 0); + } + + return gst_v4l2_tuner_channel_type; +} + +static void +gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass * klass) +{ + channel_parent_class = g_type_class_peek_parent (klass); +} + +static void +gst_v4l2_tuner_channel_init (GstV4l2TunerChannel * channel) +{ + channel->index = (guint32) - 1; + channel->tuner = (guint32) - 1; + channel->audio = (guint32) - 1; +} + +GType +gst_v4l2_tuner_norm_get_type (void) +{ + static GType gst_v4l2_tuner_norm_type = 0; + + if (!gst_v4l2_tuner_norm_type) { + static const GTypeInfo v4l2_tuner_norm_info = { + sizeof (GstV4l2TunerNormClass), + NULL, + NULL, + (GClassInitFunc) gst_v4l2_tuner_norm_class_init, + NULL, + NULL, + sizeof (GstV4l2TunerNorm), + 0, + (GInstanceInitFunc) gst_v4l2_tuner_norm_init, + NULL + }; + + gst_v4l2_tuner_norm_type = + g_type_register_static (GST_TYPE_TUNER_NORM, + "GstV4l2TunerNorm", &v4l2_tuner_norm_info, 0); + } + + return gst_v4l2_tuner_norm_type; +} + +static void +gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass * klass) +{ + norm_parent_class = g_type_class_peek_parent (klass); +} + +static void +gst_v4l2_tuner_norm_init (GstV4l2TunerNorm * norm) +{ + norm->index = 0; +} + +static G_GNUC_UNUSED gboolean +gst_v4l2_tuner_contains_channel (GstV4l2Object * v4l2object, + GstV4l2TunerChannel * v4l2channel) +{ + const GList *item; + + for (item = v4l2object->channels; item != NULL; item = item->next) + if (item->data == v4l2channel) + return TRUE; + + return FALSE; +} + +const GList * +gst_v4l2_tuner_list_channels (GstV4l2Object * v4l2object) +{ + return v4l2object->channels; +} + +gboolean +gst_v4l2_tuner_set_channel (GstV4l2Object * v4l2object, + GstTunerChannel * channel) +{ + GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE); + g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object, + v4l2channel), FALSE); + + if (v4l2object->set_in_out_func (v4l2object, v4l2channel->index)) { + gst_tuner_channel_changed (GST_TUNER (v4l2object->element), channel); + /* can FPS change here? */ + return TRUE; + } + + return FALSE; + +} + +GstTunerChannel * +gst_v4l2_tuner_get_channel (GstV4l2Object * v4l2object) +{ + GList *item; + gint channel; + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), NULL); + + if (v4l2object->get_in_out_func (v4l2object, &channel)) { + + for (item = v4l2object->channels; item != NULL; item = item->next) { + if (channel == GST_V4L2_TUNER_CHANNEL (item->data)->index) + return (GstTunerChannel *) item->data; + } + + } + + return NULL; +} + +static G_GNUC_UNUSED gboolean +gst_v4l2_tuner_contains_norm (GstV4l2Object * v4l2object, + GstV4l2TunerNorm * v4l2norm) +{ + const GList *item; + + for (item = v4l2object->norms; item != NULL; item = item->next) + if (item->data == v4l2norm) + return TRUE; + + return FALSE; +} + +const GList * +gst_v4l2_tuner_list_norms (GstV4l2Object * v4l2object) +{ + return v4l2object->norms; +} + +void +gst_v4l2_tuner_set_norm_and_notify (GstV4l2Object * v4l2object, + GstTunerNorm * norm) +{ + if (gst_v4l2_tuner_set_norm (v4l2object, norm)) { +#if 0 + g_object_notify (G_OBJECT (v4l2object->element), "norm"); +#endif + } +} + +gboolean +gst_v4l2_tuner_set_norm (GstV4l2Object * v4l2object, GstTunerNorm * norm) +{ + GstV4l2TunerNorm *v4l2norm = GST_V4L2_TUNER_NORM (norm); + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE); + g_return_val_if_fail (gst_v4l2_tuner_contains_norm (v4l2object, v4l2norm), + FALSE); + + if (gst_v4l2_set_norm (v4l2object, v4l2norm->index)) { + gst_tuner_norm_changed (GST_TUNER (v4l2object->element), norm); + if (v4l2object->update_fps_func) + v4l2object->update_fps_func (v4l2object); + return TRUE; + } + + return FALSE; + +} + +GstTunerNorm * +gst_v4l2_tuner_get_norm (GstV4l2Object * v4l2object) +{ + v4l2_std_id norm; + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), NULL); + + gst_v4l2_get_norm (v4l2object, &norm); + + return gst_v4l2_tuner_get_norm_by_std_id (v4l2object, norm); +} + +GstTunerNorm * +gst_v4l2_tuner_get_norm_by_std_id (GstV4l2Object * v4l2object, v4l2_std_id norm) +{ + GList *item; + + for (item = v4l2object->norms; item != NULL; item = item->next) { + if (norm & GST_V4L2_TUNER_NORM (item->data)->index) + return (GstTunerNorm *) item->data; + } + + return NULL; +} + +v4l2_std_id +gst_v4l2_tuner_get_std_id_by_norm (GstV4l2Object * v4l2object, + GstTunerNorm * norm) +{ + GList *item; + + for (item = v4l2object->norms; item != NULL; item = item->next) { + if (norm == GST_TUNER_NORM (item->data)) + return GST_V4L2_TUNER_NORM (item->data)->index; + } + + return 0; +} + +void +gst_v4l2_tuner_set_frequency_and_notify (GstV4l2Object * v4l2object, + GstTunerChannel * channel, gulong frequency) +{ + if (gst_v4l2_tuner_set_frequency (v4l2object, channel, frequency)) { +#if 0 + g_object_notify (G_OBJECT (v4l2object->element), "frequency"); +#endif + } +} + +gboolean +gst_v4l2_tuner_set_frequency (GstV4l2Object * v4l2object, + GstTunerChannel * channel, gulong frequency) +{ + GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); + gint chan; + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE); + g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, + GST_TUNER_CHANNEL_FREQUENCY), FALSE); + g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object, + v4l2channel), FALSE); + + if (v4l2object->get_in_out_func (v4l2object, &chan)) { + if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index && + GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { + if (gst_v4l2_set_frequency (v4l2object, v4l2channel->tuner, frequency)) { + gst_tuner_frequency_changed (GST_TUNER (v4l2object->element), channel, + frequency); + return TRUE; + } + } + } + + return FALSE; +} + +gulong +gst_v4l2_tuner_get_frequency (GstV4l2Object * v4l2object, + GstTunerChannel * channel) +{ + GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); + gint chan; + gulong frequency = 0; + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), 0); + g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, + GST_TUNER_CHANNEL_FREQUENCY), 0); + g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object, + v4l2channel), 0); + + if (v4l2object->get_in_out_func (v4l2object, &chan)) { + if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index && + GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { + gst_v4l2_get_frequency (v4l2object, v4l2channel->tuner, &frequency); + } + } + + return frequency; +} + +gint +gst_v4l2_tuner_signal_strength (GstV4l2Object * v4l2object, + GstTunerChannel * channel) +{ + GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); + gint chan; + gulong signal = 0; + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), 0); + g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, + GST_TUNER_CHANNEL_FREQUENCY), 0); + g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object, + v4l2channel), 0); + + if (v4l2object->get_in_out_func (v4l2object, &chan)) { + if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index && + GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { + gst_v4l2_signal_strength (v4l2object, v4l2channel->tuner, &signal); + } + } + + return signal; +} diff --git a/sys/v4l2/gstv4l2tuner.h b/sys/v4l2/gstv4l2tuner.h new file mode 100644 index 0000000..699ca87 --- /dev/null +++ b/sys/v4l2/gstv4l2tuner.h @@ -0,0 +1,198 @@ +/* GStreamer + * + * Copyright (C) 2003 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2tuner.h: tuner interface implementation for V4L2 + * + * 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_V4L2_TUNER_H__ +#define __GST_V4L2_TUNER_H__ + +#include +#include + +#include "gstv4l2object.h" + +G_BEGIN_DECLS + +#define GST_TYPE_V4L2_TUNER_CHANNEL \ + (gst_v4l2_tuner_channel_get_type ()) +#define GST_V4L2_TUNER_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_TUNER_CHANNEL, \ + GstV4l2TunerChannel)) +#define GST_V4L2_TUNER_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_V4L2_TUNER_CHANNEL, \ + GstV4l2TunerChannelClass)) +#define GST_IS_V4L2_TUNER_CHANNEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_TUNER_CHANNEL)) +#define GST_IS_V4L2_TUNER_CHANNEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_TUNER_CHANNEL)) + +typedef struct _GstV4l2TunerChannel { + GstTunerChannel parent; + + guint32 index; + guint32 tuner; + guint32 audio; +} GstV4l2TunerChannel; + +typedef struct _GstV4l2TunerChannelClass { + GstTunerChannelClass parent; +} GstV4l2TunerChannelClass; + +#define GST_TYPE_V4L2_TUNER_NORM \ + (gst_v4l2_tuner_norm_get_type ()) +#define GST_V4L2_TUNER_NORM(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_TUNER_NORM, \ + GstV4l2TunerNorm)) +#define GST_V4L2_TUNER_NORM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_V4L2_TUNER_NORM, \ + GstV4l2TunerNormClass)) +#define GST_IS_V4L2_TUNER_NORM(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_TUNER_NORM)) +#define GST_IS_V4L2_TUNER_NORM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_TUNER_NORM)) + +typedef struct _GstV4l2TunerNorm { + GstTunerNorm parent; + + v4l2_std_id index; +} GstV4l2TunerNorm; + +typedef struct _GstV4l2TunerNormClass { + GstTunerNormClass parent; +} GstV4l2TunerNormClass; + +GType gst_v4l2_tuner_channel_get_type (void); +GType gst_v4l2_tuner_norm_get_type (void); + +/* channels */ +const GList* gst_v4l2_tuner_list_channels (GstV4l2Object * v4l2object); +GstTunerChannel* gst_v4l2_tuner_get_channel (GstV4l2Object * v4l2object); +gboolean gst_v4l2_tuner_set_channel (GstV4l2Object * v4l2object, + GstTunerChannel * channel); +/* norms */ +const GList* gst_v4l2_tuner_list_norms (GstV4l2Object * v4l2object); +void gst_v4l2_tuner_set_norm_and_notify (GstV4l2Object * v4l2object, + GstTunerNorm * norm); +GstTunerNorm* gst_v4l2_tuner_get_norm (GstV4l2Object * v4l2object); +gboolean gst_v4l2_tuner_set_norm (GstV4l2Object * v4l2object, + GstTunerNorm * norm); +GstTunerNorm* gst_v4l2_tuner_get_norm_by_std_id (GstV4l2Object * v4l2object, + v4l2_std_id norm); +v4l2_std_id gst_v4l2_tuner_get_std_id_by_norm (GstV4l2Object * v4l2object, + GstTunerNorm * norm); + +/* frequency */ +void gst_v4l2_tuner_set_frequency_and_notify (GstV4l2Object * v4l2object, + GstTunerChannel * channel, + gulong frequency); +gint gst_v4l2_tuner_signal_strength (GstV4l2Object * v4l2object, + GstTunerChannel * channel); +gulong gst_v4l2_tuner_get_frequency (GstV4l2Object * v4l2object, + GstTunerChannel * channel); +gboolean gst_v4l2_tuner_set_frequency (GstV4l2Object * v4l2object, + GstTunerChannel * channel, + gulong frequency); + +#define GST_IMPLEMENT_V4L2_TUNER_METHODS(Type, interface_as_function) \ + \ +static const GList * \ +interface_as_function ## _tuner_list_channels (GstTuner * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + return gst_v4l2_tuner_list_channels (this->v4l2object); \ +} \ + \ +static void \ +interface_as_function ## _tuner_set_channel (GstTuner * mixer, \ + GstTunerChannel * channel) \ +{ \ + Type *this = (Type*) mixer; \ + gst_v4l2_tuner_set_channel (this->v4l2object, channel); \ +} \ +static GstTunerChannel * \ +interface_as_function ## _tuner_get_channel (GstTuner * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + return gst_v4l2_tuner_get_channel (this->v4l2object); \ +} \ +static const GList * \ +interface_as_function ## _tuner_list_norms (GstTuner * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + return gst_v4l2_tuner_list_norms (this->v4l2object); \ +} \ +static void \ +interface_as_function ## _tuner_set_norm_and_notify (GstTuner * mixer, \ + GstTunerNorm * norm) \ +{ \ + Type *this = (Type*) mixer; \ + gst_v4l2_tuner_set_norm_and_notify (this->v4l2object, norm); \ +} \ +static GstTunerNorm * \ +interface_as_function ## _tuner_get_norm (GstTuner * mixer) \ +{ \ + Type *this = (Type*) mixer; \ + return gst_v4l2_tuner_get_norm (this->v4l2object); \ +} \ + \ +static void \ +interface_as_function ## _tuner_set_frequency_and_notify (GstTuner * mixer, \ + GstTunerChannel * channel, \ + gulong frequency) \ +{ \ + Type *this = (Type*) mixer; \ + gst_v4l2_tuner_set_frequency_and_notify (this->v4l2object, channel, frequency); \ +} \ + \ +static gulong \ +interface_as_function ## _tuner_get_frequency (GstTuner * mixer, \ + GstTunerChannel * channel) \ +{ \ + Type *this = (Type*) mixer; \ + return gst_v4l2_tuner_get_frequency (this->v4l2object, channel); \ +} \ + \ +static gint \ +interface_as_function ## _tuner_signal_strength (GstTuner * mixer, \ + GstTunerChannel * channel) \ +{ \ + Type *this = (Type*) mixer; \ + return gst_v4l2_tuner_signal_strength (this->v4l2object, channel); \ +} \ + \ +static void \ +interface_as_function ## _tuner_interface_init (GstTunerClass * klass) \ +{ \ + /* default virtual functions */ \ + klass->list_channels = interface_as_function ## _tuner_list_channels; \ + klass->set_channel = interface_as_function ## _tuner_set_channel; \ + klass->get_channel = interface_as_function ## _tuner_get_channel; \ + \ + klass->list_norms = interface_as_function ## _tuner_list_norms; \ + klass->set_norm = interface_as_function ## _tuner_set_norm_and_notify; \ + klass->get_norm = interface_as_function ## _tuner_get_norm; \ + \ + klass->set_frequency = interface_as_function ## _tuner_set_frequency_and_notify; \ + klass->get_frequency = interface_as_function ## _tuner_get_frequency; \ + klass->signal_strength = interface_as_function ## _tuner_signal_strength; \ +} \ + +#endif /* __GST_V4L2_TUNER_H__ */ diff --git a/sys/v4l2/gstv4l2vidorient.c b/sys/v4l2/gstv4l2vidorient.c new file mode 100644 index 0000000..1fa47e7 --- /dev/null +++ b/sys/v4l2/gstv4l2vidorient.c @@ -0,0 +1,104 @@ +/* GStreamer + * + * Copyright (C) 2006 Edgard Lima + * + * gstv4l2vidorient.c: video orientation interface implementation for V4L2 + * + * 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 + +#include "gstv4l2vidorient.h" +#include "gstv4l2object.h" +#include "v4l2_calls.h" +#include "v4l2src_calls.h" + +GST_DEBUG_CATEGORY_STATIC (v4l2vo_debug); +#define GST_CAT_DEFAULT v4l2vo_debug + +/* Those are deprecated calls that have been replaced */ +#ifndef V4L2_CID_HCENTER +#define V4L2_CID_HCENTER V4L2_CID_PAN_RESET +#endif +#ifndef V4L2_CID_VCENTER +#define V4L2_CID_VCENTER V4L2_CID_TILT_RESET +#endif + +void +gst_v4l2_video_orientation_interface_init (GstVideoOrientationInterface * klass) +{ + GST_DEBUG_CATEGORY_INIT (v4l2vo_debug, "v4l2vo", 0, + "V4L2 VideoOrientation interface debugging"); +} + + +gboolean +gst_v4l2_video_orientation_get_hflip (GstV4l2Object * v4l2object, + gboolean * flip) +{ + + return gst_v4l2_get_attribute (v4l2object, V4L2_CID_HFLIP, flip); +} + +gboolean +gst_v4l2_video_orientation_get_vflip (GstV4l2Object * v4l2object, + gboolean * flip) +{ + return gst_v4l2_get_attribute (v4l2object, V4L2_CID_VFLIP, flip); +} + +gboolean +gst_v4l2_video_orientation_get_hcenter (GstV4l2Object * v4l2object, + gint * center) +{ + return gst_v4l2_get_attribute (v4l2object, V4L2_CID_HCENTER, center); +} + +gboolean +gst_v4l2_video_orientation_get_vcenter (GstV4l2Object * v4l2object, + gint * center) +{ + return gst_v4l2_get_attribute (v4l2object, V4L2_CID_VCENTER, center); +} + +gboolean +gst_v4l2_video_orientation_set_hflip (GstV4l2Object * v4l2object, gboolean flip) +{ + return gst_v4l2_set_attribute (v4l2object, V4L2_CID_HFLIP, flip); +} + +gboolean +gst_v4l2_video_orientation_set_vflip (GstV4l2Object * v4l2object, gboolean flip) +{ + return gst_v4l2_set_attribute (v4l2object, V4L2_CID_VFLIP, flip); +} + +gboolean +gst_v4l2_video_orientation_set_hcenter (GstV4l2Object * v4l2object, gint center) +{ + return gst_v4l2_set_attribute (v4l2object, V4L2_CID_HCENTER, center); +} + +gboolean +gst_v4l2_video_orientation_set_vcenter (GstV4l2Object * v4l2object, gint center) +{ + return gst_v4l2_set_attribute (v4l2object, V4L2_CID_VCENTER, center); +} diff --git a/sys/v4l2/gstv4l2vidorient.h b/sys/v4l2/gstv4l2vidorient.h new file mode 100644 index 0000000..39682e2 --- /dev/null +++ b/sys/v4l2/gstv4l2vidorient.h @@ -0,0 +1,117 @@ +/* GStreamer + * + * Copyright (C) 2006 Edgard Lima + * + * gstv4l2vidorient.h: video orientation interface implementation for V4L2 + * + * 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_V4L2_VIDORIENT_H__ +#define __GST_V4L2_VIDORIENT_H__ + +#include +#include + +#include "gstv4l2object.h" + +G_BEGIN_DECLS + +void gst_v4l2_video_orientation_interface_init (GstVideoOrientationInterface * klass); + +gboolean gst_v4l2_video_orientation_get_hflip (GstV4l2Object *v4l2object, gboolean *flip); +gboolean gst_v4l2_video_orientation_get_vflip (GstV4l2Object *v4l2object, gboolean *flip); +gboolean gst_v4l2_video_orientation_get_hcenter (GstV4l2Object *v4l2object, gint *center); +gboolean gst_v4l2_video_orientation_get_vcenter (GstV4l2Object *v4l2object, gint *center); + +gboolean gst_v4l2_video_orientation_set_hflip (GstV4l2Object *v4l2object, gboolean flip); +gboolean gst_v4l2_video_orientation_set_vflip (GstV4l2Object *v4l2object, gboolean flip); +gboolean gst_v4l2_video_orientation_set_hcenter (GstV4l2Object *v4l2object, gint center); +gboolean gst_v4l2_video_orientation_set_vcenter (GstV4l2Object *v4l2object, gint center); + +#define GST_IMPLEMENT_V4L2_VIDORIENT_METHODS(Type, interface_as_function) \ + \ + static gboolean \ + interface_as_function ## _video_orientation_get_hflip (GstVideoOrientation *vo, gboolean *flip) \ + { \ + Type *this = (Type*) vo; \ + return gst_v4l2_video_orientation_get_hflip (this->v4l2object, flip); \ + } \ + \ + static gboolean \ + interface_as_function ## _video_orientation_get_vflip (GstVideoOrientation *vo, gboolean *flip) \ + { \ + Type *this = (Type*) vo; \ + return gst_v4l2_video_orientation_get_vflip (this->v4l2object, flip); \ + } \ + \ + static gboolean \ + interface_as_function ## _video_orientation_get_hcenter (GstVideoOrientation *vo, gint *center) \ + { \ + Type *this = (Type*) vo; \ + return gst_v4l2_video_orientation_get_hcenter (this->v4l2object, center); \ + } \ + \ + static gboolean \ + interface_as_function ## _video_orientation_get_vcenter (GstVideoOrientation *vo, gint *center) \ + { \ + Type *this = (Type*) vo; \ + return gst_v4l2_video_orientation_get_vcenter (this->v4l2object, center); \ + } \ + \ + static gboolean \ + interface_as_function ## _video_orientation_set_hflip (GstVideoOrientation *vo, gboolean flip) \ + { \ + Type *this = (Type*) vo; \ + return gst_v4l2_video_orientation_set_hflip (this->v4l2object, flip); \ + } \ + \ + static gboolean \ + interface_as_function ## _video_orientation_set_vflip (GstVideoOrientation *vo, gboolean flip) \ + { \ + Type *this = (Type*) vo; \ + return gst_v4l2_video_orientation_set_vflip (this->v4l2object, flip); \ + } \ + \ + static gboolean \ + interface_as_function ## _video_orientation_set_hcenter (GstVideoOrientation *vo, gint center) \ + { \ + Type *this = (Type*) vo; \ + return gst_v4l2_video_orientation_set_hcenter (this->v4l2object, center); \ + } \ + \ + static gboolean \ + interface_as_function ## _video_orientation_set_vcenter (GstVideoOrientation *vo, gint center) \ + { \ + Type *this = (Type*) vo; \ + return gst_v4l2_video_orientation_set_vcenter (this->v4l2object, center); \ + } \ + \ + static void \ + interface_as_function ## _video_orientation_interface_init (GstVideoOrientationInterface * klass) \ + { \ + /* default virtual functions */ \ + klass->get_hflip = interface_as_function ## _video_orientation_get_hflip; \ + klass->get_vflip = interface_as_function ## _video_orientation_get_vflip; \ + klass->get_hcenter = interface_as_function ## _video_orientation_get_hcenter; \ + klass->get_vcenter = interface_as_function ## _video_orientation_get_vcenter; \ + klass->set_hflip = interface_as_function ## _video_orientation_set_hflip; \ + klass->set_vflip = interface_as_function ## _video_orientation_set_vflip; \ + klass->set_hcenter = interface_as_function ## _video_orientation_set_hcenter; \ + klass->set_vcenter = interface_as_function ## _video_orientation_set_vcenter; \ + } + +#endif /* __GST_V4L2_VIDORIENT_H__ */ diff --git a/sys/v4l2/gstv4l2xoverlay.c b/sys/v4l2/gstv4l2xoverlay.c new file mode 100644 index 0000000..60d0919 --- /dev/null +++ b/sys/v4l2/gstv4l2xoverlay.c @@ -0,0 +1,486 @@ +/* GStreamer + * + * Copyright (C) 2003 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2xoverlay.c: X-based overlay interface implementation for V4L2 + * + * 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 +#include +#include +#include +#include +#include +#include + +#include + +#include "gstv4l2xoverlay.h" +#include "gstv4l2object.h" +#include "v4l2_calls.h" + +#include "gst/gst-i18n-plugin.h" +#include + +struct _GstV4l2Xv +{ + Display *dpy; + gint port, idle_id, event_id; + GMutex *mutex; /* to serialize calls to X11 */ +}; + +GST_DEBUG_CATEGORY_STATIC (v4l2xv_debug); +#define GST_CAT_DEFAULT v4l2xv_debug + +void +gst_v4l2_xoverlay_interface_init (GstXOverlayClass * klass) +{ + GST_DEBUG_CATEGORY_INIT (v4l2xv_debug, "v4l2xv", 0, + "V4L2 XOverlay interface debugging"); +} + +static void +gst_v4l2_xoverlay_open (GstV4l2Object * v4l2object) +{ + struct stat s; + GstV4l2Xv *v4l2xv; + const gchar *name = g_getenv ("DISPLAY"); + unsigned int ver, rel, req, ev, err, anum; + int i, id = 0, first_id = 0, min; + XvAdaptorInfo *ai; + Display *dpy; + + /* we need a display, obviously */ + if (!name || !(dpy = XOpenDisplay (name))) { + GST_WARNING_OBJECT (v4l2object->element, + "No $DISPLAY set or failed to open - no overlay"); + return; + } + + /* First let's check that XVideo extension is available */ + if (!XQueryExtension (dpy, "XVideo", &i, &i, &i)) { + GST_WARNING_OBJECT (v4l2object->element, + "Xv extension not available - no overlay"); + XCloseDisplay (dpy); + return; + } + + /* find port that belongs to this device */ + if (XvQueryExtension (dpy, &ver, &rel, &req, &ev, &err) != Success) { + GST_WARNING_OBJECT (v4l2object->element, + "Xv extension not supported - no overlay"); + XCloseDisplay (dpy); + return; + } + if (XvQueryAdaptors (dpy, DefaultRootWindow (dpy), &anum, &ai) != Success) { + GST_WARNING_OBJECT (v4l2object->element, "Failed to query Xv adaptors"); + XCloseDisplay (dpy); + return; + } + if (fstat (v4l2object->video_fd, &s) < 0) { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, + (_("Cannot identify device '%s'."), v4l2object->videodev), + GST_ERROR_SYSTEM); + XCloseDisplay (dpy); + return; + } + min = s.st_rdev & 0xff; + for (i = 0; i < anum; i++) { + GST_DEBUG_OBJECT (v4l2object->element, "found adapter: %s", ai[i].name); + if (!strcmp (ai[i].name, "video4linux2") || + !strcmp (ai[i].name, "video4linux")) { + if (first_id == 0) + first_id = ai[i].base_id; + + GST_DEBUG_OBJECT (v4l2object->element, + "first_id=%d, base_id=%lu, min=%d", first_id, ai[i].base_id, min); + + /* hmm... */ + if (first_id != 0 && ai[i].base_id == first_id + min) + id = ai[i].base_id; + } + } + XvFreeAdaptorInfo (ai); + + if (id == 0) { + GST_WARNING_OBJECT (v4l2object->element, + "Did not find XvPortID for device - no overlay"); + XCloseDisplay (dpy); + return; + } + + v4l2xv = g_new0 (GstV4l2Xv, 1); + v4l2xv->dpy = dpy; + v4l2xv->port = id; + v4l2xv->mutex = g_mutex_new (); + v4l2xv->idle_id = 0; + v4l2xv->event_id = 0; + v4l2object->xv = v4l2xv; + + if (v4l2object->xwindow_id) { + gst_v4l2_xoverlay_set_window_handle (v4l2object, v4l2object->xwindow_id); + } +} + +static void +gst_v4l2_xoverlay_close (GstV4l2Object * v4l2object) +{ + GstV4l2Xv *v4l2xv = v4l2object->xv; + + if (!v4l2object->xv) + return; + + if (v4l2object->xwindow_id) { + gst_v4l2_xoverlay_set_window_handle (v4l2object, 0); + } + + XCloseDisplay (v4l2xv->dpy); + g_mutex_free (v4l2xv->mutex); + if (v4l2xv->idle_id) + g_source_remove (v4l2xv->idle_id); + if (v4l2xv->event_id) + g_source_remove (v4l2xv->event_id); + g_free (v4l2xv); + v4l2object->xv = NULL; +} + +void +gst_v4l2_xoverlay_start (GstV4l2Object * v4l2object) +{ + if (v4l2object->xwindow_id) { + gst_v4l2_xoverlay_open (v4l2object); + } +} + +void +gst_v4l2_xoverlay_stop (GstV4l2Object * v4l2object) +{ + gst_v4l2_xoverlay_close (v4l2object); +} + +/* should be called with mutex held */ +static gboolean +get_render_rect (GstV4l2Object * v4l2object, GstVideoRectangle * rect) +{ + GstV4l2Xv *v4l2xv = v4l2object->xv; + if (v4l2xv && v4l2xv->dpy && v4l2object->xwindow_id) { + XWindowAttributes attr; + XGetWindowAttributes (v4l2xv->dpy, v4l2object->xwindow_id, &attr); + /* this is where we'd add support to maintain aspect ratio */ + rect->x = 0; + rect->y = 0; + rect->w = attr.width; + rect->h = attr.height; + return TRUE; + } else { + return FALSE; + } +} + +gboolean +gst_v4l2_xoverlay_get_render_rect (GstV4l2Object * v4l2object, + GstVideoRectangle * rect) +{ + GstV4l2Xv *v4l2xv = v4l2object->xv; + gboolean ret = FALSE; + if (v4l2xv) { + g_mutex_lock (v4l2xv->mutex); + ret = get_render_rect (v4l2object, rect); + g_mutex_unlock (v4l2xv->mutex); + } + return ret; +} + +static void +update_geometry (GstV4l2Object * v4l2object) +{ + GstV4l2Xv *v4l2xv = v4l2object->xv; + GstVideoRectangle rect; + if (!get_render_rect (v4l2object, &rect)) + return; + /* note: we don't pass in valid video x/y/w/h.. currently the xserver + * doesn't need to know these, as they come from v4l2 by setting the + * crop.. + */ + XvPutVideo (v4l2xv->dpy, v4l2xv->port, v4l2object->xwindow_id, + DefaultGC (v4l2xv->dpy, DefaultScreen (v4l2xv->dpy)), + 0, 0, rect.w, rect.h, rect.x, rect.y, rect.w, rect.h); +} + +static gboolean +idle_refresh (gpointer data) +{ + GstV4l2Object *v4l2object = GST_V4L2_OBJECT (data); + GstV4l2Xv *v4l2xv = v4l2object->xv; + + GST_LOG_OBJECT (v4l2object->element, "idle refresh"); + + if (v4l2xv) { + g_mutex_lock (v4l2xv->mutex); + + update_geometry (v4l2object); + + v4l2xv->idle_id = 0; + g_mutex_unlock (v4l2xv->mutex); + } + + /* once */ + return FALSE; +} + + +static gboolean +event_refresh (gpointer data) +{ + GstV4l2Object *v4l2object = GST_V4L2_OBJECT (data); + GstV4l2Xv *v4l2xv = v4l2object->xv; + + GST_LOG_OBJECT (v4l2object->element, "event refresh"); + + if (v4l2xv) { + XEvent e; + + g_mutex_lock (v4l2xv->mutex); + + /* If the element supports navigation, collect the relavent input + * events and push them upstream as navigation events + */ + if (GST_IS_NAVIGATION (v4l2object->element)) { + guint pointer_x = 0, pointer_y = 0; + gboolean pointer_moved = FALSE; + + /* We get all pointer motion events, only the last position is + * interesting. + */ + while (XCheckWindowEvent (v4l2xv->dpy, v4l2object->xwindow_id, + PointerMotionMask, &e)) { + switch (e.type) { + case MotionNotify: + pointer_x = e.xmotion.x; + pointer_y = e.xmotion.y; + pointer_moved = TRUE; + break; + default: + break; + } + } + if (pointer_moved) { + GST_DEBUG_OBJECT (v4l2object->element, + "pointer moved over window at %d,%d", pointer_x, pointer_y); + g_mutex_unlock (v4l2xv->mutex); + gst_navigation_send_mouse_event (GST_NAVIGATION (v4l2object->element), + "mouse-move", 0, e.xbutton.x, e.xbutton.y); + g_mutex_lock (v4l2xv->mutex); + } + + /* We get all events on our window to throw them upstream + */ + while (XCheckWindowEvent (v4l2xv->dpy, v4l2object->xwindow_id, + KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask, &e)) { + KeySym keysym; + const char *key_str = NULL; + + g_mutex_unlock (v4l2xv->mutex); + + switch (e.type) { + case ButtonPress: + GST_DEBUG_OBJECT (v4l2object->element, + "button %d pressed over window at %d,%d", + e.xbutton.button, e.xbutton.x, e.xbutton.y); + gst_navigation_send_mouse_event (GST_NAVIGATION + (v4l2object->element), "mouse-button-press", e.xbutton.button, + e.xbutton.x, e.xbutton.y); + break; + case ButtonRelease: + GST_DEBUG_OBJECT (v4l2object->element, + "button %d released over window at %d,%d", + e.xbutton.button, e.xbutton.x, e.xbutton.y); + gst_navigation_send_mouse_event (GST_NAVIGATION + (v4l2object->element), "mouse-button-release", e.xbutton.button, + e.xbutton.x, e.xbutton.y); + break; + case KeyPress: + case KeyRelease: + g_mutex_lock (v4l2xv->mutex); + keysym = XKeycodeToKeysym (v4l2xv->dpy, e.xkey.keycode, 0); + if (keysym != NoSymbol) { + key_str = XKeysymToString (keysym); + } else { + key_str = "unknown"; + } + g_mutex_unlock (v4l2xv->mutex); + GST_DEBUG_OBJECT (v4l2object->element, + "key %d pressed over window at %d,%d (%s)", + e.xkey.keycode, e.xkey.x, e.xkey.y, key_str); + gst_navigation_send_key_event (GST_NAVIGATION (v4l2object->element), + e.type == KeyPress ? "key-press" : "key-release", key_str); + break; + default: + GST_DEBUG_OBJECT (v4l2object->element, + "unhandled X event (%d)", e.type); + } + + g_mutex_lock (v4l2xv->mutex); + } + } + + /* Handle ConfigureNotify */ + while (XCheckWindowEvent (v4l2xv->dpy, v4l2object->xwindow_id, + StructureNotifyMask, &e)) { + switch (e.type) { + case ConfigureNotify: + update_geometry (v4l2object); + break; + default: + break; + } + } + g_mutex_unlock (v4l2xv->mutex); + } + + /* repeat */ + return TRUE; +} + +void +gst_v4l2_xoverlay_set_window_handle (GstV4l2Object * v4l2object, guintptr id) +{ + GstV4l2Xv *v4l2xv; + XID xwindow_id = id; + gboolean change = (v4l2object->xwindow_id != xwindow_id); + + GST_LOG_OBJECT (v4l2object->element, "Setting XID to %lx", + (gulong) xwindow_id); + + if (!v4l2object->xv && GST_V4L2_IS_OPEN (v4l2object)) + gst_v4l2_xoverlay_open (v4l2object); + + v4l2xv = v4l2object->xv; + + if (v4l2xv) + g_mutex_lock (v4l2xv->mutex); + + if (change) { + if (v4l2object->xwindow_id && v4l2xv) { + GST_DEBUG_OBJECT (v4l2object->element, + "Deactivating old port %lx", v4l2object->xwindow_id); + + XvSelectPortNotify (v4l2xv->dpy, v4l2xv->port, 0); + XvSelectVideoNotify (v4l2xv->dpy, v4l2object->xwindow_id, 0); + XvStopVideo (v4l2xv->dpy, v4l2xv->port, v4l2object->xwindow_id); + } + + v4l2object->xwindow_id = xwindow_id; + } + + if (!v4l2xv || xwindow_id == 0) { + if (v4l2xv) + g_mutex_unlock (v4l2xv->mutex); + return; + } + + if (change) { + GST_DEBUG_OBJECT (v4l2object->element, "Activating new port %lx", + xwindow_id); + + /* draw */ + XvSelectPortNotify (v4l2xv->dpy, v4l2xv->port, 1); + XvSelectVideoNotify (v4l2xv->dpy, v4l2object->xwindow_id, 1); + } + + update_geometry (v4l2object); + + if (v4l2xv->idle_id) + g_source_remove (v4l2xv->idle_id); + v4l2xv->idle_id = g_idle_add (idle_refresh, v4l2object); + g_mutex_unlock (v4l2xv->mutex); +} + +/** + * gst_v4l2_xoverlay_prepare_xwindow_id: + * @v4l2object: the v4l2object + * @required: %TRUE if display is required (ie. TRUE for v4l2sink, but + * FALSE for any other element with optional overlay capabilities) + * + * Helper function to create a windo if none is set from the application. + */ +void +gst_v4l2_xoverlay_prepare_xwindow_id (GstV4l2Object * v4l2object, + gboolean required) +{ + if (!GST_V4L2_IS_OVERLAY (v4l2object)) + return; + + gst_x_overlay_prepare_xwindow_id (GST_X_OVERLAY (v4l2object->element)); + + if (required && !v4l2object->xwindow_id) { + GstV4l2Xv *v4l2xv; + Window win; + int width, height; + long event_mask; + + if (!v4l2object->xv && GST_V4L2_IS_OPEN (v4l2object)) + gst_v4l2_xoverlay_open (v4l2object); + + v4l2xv = v4l2object->xv; + + /* if xoverlay is not supported, just bail */ + if (!v4l2xv) + return; + + /* xoverlay is supported, but we don't have a window.. so create one */ + GST_DEBUG_OBJECT (v4l2object->element, "creating window"); + + g_mutex_lock (v4l2xv->mutex); + + width = XDisplayWidth (v4l2xv->dpy, DefaultScreen (v4l2xv->dpy)); + height = XDisplayHeight (v4l2xv->dpy, DefaultScreen (v4l2xv->dpy)); + GST_DEBUG_OBJECT (v4l2object->element, "dpy=%p", v4l2xv->dpy); + + win = XCreateSimpleWindow (v4l2xv->dpy, + DefaultRootWindow (v4l2xv->dpy), + 0, 0, width, height, 0, 0, + XBlackPixel (v4l2xv->dpy, DefaultScreen (v4l2xv->dpy))); + + GST_DEBUG_OBJECT (v4l2object->element, "win=%lu", win); + + event_mask = ExposureMask | StructureNotifyMask; + if (GST_IS_NAVIGATION (v4l2object->element)) { + event_mask |= PointerMotionMask | + KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask; + } + XSelectInput (v4l2xv->dpy, win, event_mask); + v4l2xv->event_id = g_timeout_add (45, event_refresh, v4l2object); + + XMapRaised (v4l2xv->dpy, win); + + XSync (v4l2xv->dpy, FALSE); + + g_mutex_unlock (v4l2xv->mutex); + + GST_DEBUG_OBJECT (v4l2object->element, "got window"); + + gst_v4l2_xoverlay_set_window_handle (v4l2object, win); + } +} diff --git a/sys/v4l2/gstv4l2xoverlay.h b/sys/v4l2/gstv4l2xoverlay.h new file mode 100644 index 0000000..1a09306 --- /dev/null +++ b/sys/v4l2/gstv4l2xoverlay.h @@ -0,0 +1,70 @@ +/* GStreamer + * + * Copyright (C) 2003 Ronald Bultje + * 2006 Edgard Lima + * + * gstv4l2xoverlay.h: tv mixer interface implementation for V4L2 + * + * 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_V4L2_X_OVERLAY_H__ +#define __GST_V4L2_X_OVERLAY_H__ + +#include + +#include +#include +#include +#include /* for GstVideoRectange */ + +#include "gstv4l2object.h" + +G_BEGIN_DECLS + +void gst_v4l2_xoverlay_start (GstV4l2Object *v4l2object); +void gst_v4l2_xoverlay_stop (GstV4l2Object *v4l2object); +gboolean gst_v4l2_xoverlay_get_render_rect (GstV4l2Object *v4l2object, + GstVideoRectangle *rect); + +void gst_v4l2_xoverlay_interface_init (GstXOverlayClass * klass); +void gst_v4l2_xoverlay_set_window_handle (GstV4l2Object * v4l2object, + guintptr id); +void gst_v4l2_xoverlay_prepare_xwindow_id (GstV4l2Object * v4l2object, + gboolean required); + + +#define GST_IMPLEMENT_V4L2_XOVERLAY_METHODS(Type, interface_as_function) \ + \ +static void \ +interface_as_function ## _xoverlay_set_window_handle (GstXOverlay * xoverlay, \ + guintptr id) \ +{ \ + Type *this = (Type*) xoverlay; \ + gst_v4l2_xoverlay_set_window_handle (this->v4l2object, id); \ +} \ + \ +static void \ +interface_as_function ## _xoverlay_interface_init (GstXOverlayClass * klass) \ +{ \ + /* default virtual functions */ \ + klass->set_window_handle = interface_as_function ## _xoverlay_set_window_handle; \ + \ + gst_v4l2_xoverlay_interface_init(klass); \ +} \ + + +#endif /* __GST_V4L2_X_OVERLAY_H__ */ diff --git a/sys/v4l2/v4l2_calls.c b/sys/v4l2/v4l2_calls.c new file mode 100644 index 0000000..309bfb6 --- /dev/null +++ b/sys/v4l2/v4l2_calls.c @@ -0,0 +1,925 @@ +/* GStreamer + * + * Copyright (C) 2002 Ronald Bultje + * 2006 Edgard Lima + * + * v4l2_calls.c - generic V4L2 calls handling + * + * 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 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __sun +/* Needed on older Solaris Nevada builds (72 at least) */ +#include +#include +#endif +#include "v4l2_calls.h" +#include "gstv4l2tuner.h" +#if 0 +#include "gstv4l2xoverlay.h" +#endif +#include "gstv4l2colorbalance.h" + +#include "gstv4l2src.h" + +#ifdef HAVE_EXPERIMENTAL +#include "gstv4l2sink.h" +#endif + +#include "gst/gst-i18n-plugin.h" + +/* Those are ioctl calls */ +#ifndef V4L2_CID_HCENTER +#define V4L2_CID_HCENTER V4L2_CID_HCENTER_DEPRECATED +#endif +#ifndef V4L2_CID_VCENTER +#define V4L2_CID_VCENTER V4L2_CID_VCENTER_DEPRECATED +#endif + +GST_DEBUG_CATEGORY_EXTERN (v4l2_debug); +#define GST_CAT_DEFAULT v4l2_debug + +/****************************************************** + * gst_v4l2_get_capabilities(): + * get the device's capturing capabilities + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_get_capabilities (GstV4l2Object * v4l2object) +{ + GstElement *e; + + e = v4l2object->element; + + GST_DEBUG_OBJECT (e, "getting capabilities"); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCAP, &v4l2object->vcap) < 0) + goto cap_failed; + + GST_LOG_OBJECT (e, "driver: '%s'", v4l2object->vcap.driver); + GST_LOG_OBJECT (e, "card: '%s'", v4l2object->vcap.card); + GST_LOG_OBJECT (e, "bus_info: '%s'", v4l2object->vcap.bus_info); + GST_LOG_OBJECT (e, "version: %08x", v4l2object->vcap.version); + GST_LOG_OBJECT (e, "capabilites: %08x", v4l2object->vcap.capabilities); + + return TRUE; + + /* ERRORS */ +cap_failed: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, + (_("Error getting capabilities for device '%s': " + "It isn't a v4l2 driver. Check if it is a v4l1 driver."), + v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + + +/****************************************************** + * gst_v4l2_empty_lists() and gst_v4l2_fill_lists(): + * fill/empty the lists of enumerations + * return value: TRUE on success, FALSE on error + ******************************************************/ +static gboolean +gst_v4l2_fill_lists (GstV4l2Object * v4l2object) +{ + gint n; + + GstElement *e; + + e = v4l2object->element; + + GST_DEBUG_OBJECT (e, "getting enumerations"); + GST_V4L2_CHECK_OPEN (v4l2object); + + GST_DEBUG_OBJECT (e, " channels"); + /* and now, the channels */ + for (n = 0;; n++) { + struct v4l2_input input; + GstV4l2TunerChannel *v4l2channel; + GstTunerChannel *channel; + + memset (&input, 0, sizeof (input)); + + input.index = n; + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_ENUMINPUT, &input) < 0) { + if (errno == EINVAL) + break; /* end of enumeration */ + else { + GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, + (_("Failed to query attributes of input %d in device %s"), + n, v4l2object->videodev), + ("Failed to get %d in input enumeration for %s. (%d - %s)", + n, v4l2object->videodev, errno, strerror (errno))); + return FALSE; + } + } + + GST_LOG_OBJECT (e, " index: %d", input.index); + GST_LOG_OBJECT (e, " name: '%s'", input.name); + GST_LOG_OBJECT (e, " type: %08x", input.type); + GST_LOG_OBJECT (e, " audioset: %08x", input.audioset); + GST_LOG_OBJECT (e, " std: %016x", (guint) input.std); + GST_LOG_OBJECT (e, " status: %08x", input.status); + + v4l2channel = g_object_new (GST_TYPE_V4L2_TUNER_CHANNEL, NULL); + channel = GST_TUNER_CHANNEL (v4l2channel); + channel->label = g_strdup ((const gchar *) input.name); + channel->flags = GST_TUNER_CHANNEL_INPUT; + v4l2channel->index = n; + + if (input.type == V4L2_INPUT_TYPE_TUNER) { + struct v4l2_tuner vtun; + + v4l2channel->tuner = input.tuner; + channel->flags |= GST_TUNER_CHANNEL_FREQUENCY; + + vtun.index = input.tuner; + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &vtun) < 0) { + GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, + (_("Failed to get setting of tuner %d on device '%s'."), + input.tuner, v4l2object->videodev), GST_ERROR_SYSTEM); + g_object_unref (G_OBJECT (channel)); + return FALSE; + } + + channel->freq_multiplicator = + 62.5 * ((vtun.capability & V4L2_TUNER_CAP_LOW) ? 1 : 1000); + channel->min_frequency = vtun.rangelow * channel->freq_multiplicator; + channel->max_frequency = vtun.rangehigh * channel->freq_multiplicator; + channel->min_signal = 0; + channel->max_signal = 0xffff; + } + if (input.audioset) { + /* we take the first. We don't care for + * the others for now */ + while (!(input.audioset & (1 << v4l2channel->audio))) + v4l2channel->audio++; + channel->flags |= GST_TUNER_CHANNEL_AUDIO; + } + + v4l2object->channels = + g_list_prepend (v4l2object->channels, (gpointer) channel); + } + v4l2object->channels = g_list_reverse (v4l2object->channels); + + GST_DEBUG_OBJECT (e, " norms"); + /* norms... */ + for (n = 0;; n++) { + struct v4l2_standard standard = { 0, }; + GstV4l2TunerNorm *v4l2norm; + + GstTunerNorm *norm; + + /* fill in defaults */ + standard.frameperiod.numerator = 1; + standard.frameperiod.denominator = 0; + standard.index = n; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_ENUMSTD, &standard) < 0) { + if (errno == EINVAL || errno == ENOTTY) + break; /* end of enumeration */ + else { + GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, + (_("Failed to query norm on device '%s'."), + v4l2object->videodev), + ("Failed to get attributes for norm %d on devide '%s'. (%d - %s)", + n, v4l2object->videodev, errno, strerror (errno))); + return FALSE; + } + } + + GST_DEBUG_OBJECT (e, " '%s', fps: %d / %d", + standard.name, standard.frameperiod.denominator, + standard.frameperiod.numerator); + + v4l2norm = g_object_new (GST_TYPE_V4L2_TUNER_NORM, NULL); + norm = GST_TUNER_NORM (v4l2norm); + norm->label = g_strdup ((const gchar *) standard.name); + gst_value_set_fraction (&norm->framerate, + standard.frameperiod.denominator, standard.frameperiod.numerator); + v4l2norm->index = standard.id; + + GST_DEBUG_OBJECT (v4l2object->element, "index=%08x, label=%s", + (unsigned int) v4l2norm->index, norm->label); + + v4l2object->norms = g_list_prepend (v4l2object->norms, (gpointer) norm); + } + v4l2object->norms = g_list_reverse (v4l2object->norms); + + GST_DEBUG_OBJECT (e, " controls+menus"); + + /* and lastly, controls+menus (if appropriate) */ + for (n = V4L2_CID_BASE;; n++) { + struct v4l2_queryctrl control = { 0, }; + GstV4l2ColorBalanceChannel *v4l2channel; + GstColorBalanceChannel *channel; + + /* when we reached the last official CID, continue with private CIDs */ + if (n == V4L2_CID_LASTP1) { + GST_DEBUG_OBJECT (e, "checking private CIDs"); + n = V4L2_CID_PRIVATE_BASE; + } + GST_DEBUG_OBJECT (e, "checking control %08x", n); + + control.id = n; + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCTRL, &control) < 0) { + if (errno == EINVAL || errno == ENOTTY || errno == EIO) { + if (n < V4L2_CID_PRIVATE_BASE) { + GST_DEBUG_OBJECT (e, "skipping control %08x", n); + /* continue so that we also check private controls */ + continue; + } else { + GST_DEBUG_OBJECT (e, "controls finished"); + break; + } + } else { + GST_WARNING_OBJECT (e, "Failed querying control %d on device '%s'. " + "(%d - %s)", n, v4l2object->videodev, errno, strerror (errno)); + continue; + } + } + if (control.flags & V4L2_CTRL_FLAG_DISABLED) { + GST_DEBUG_OBJECT (e, "skipping disabled control"); + continue; + } + + switch (n) { + case V4L2_CID_BRIGHTNESS: + case V4L2_CID_CONTRAST: + case V4L2_CID_SATURATION: + case V4L2_CID_HUE: + case V4L2_CID_BLACK_LEVEL: + case V4L2_CID_AUTO_WHITE_BALANCE: + case V4L2_CID_DO_WHITE_BALANCE: + case V4L2_CID_RED_BALANCE: + case V4L2_CID_BLUE_BALANCE: + case V4L2_CID_GAMMA: + case V4L2_CID_EXPOSURE: + case V4L2_CID_AUTOGAIN: + case V4L2_CID_GAIN: +#ifdef V4L2_CID_SHARPNESS + case V4L2_CID_SHARPNESS: +#endif + /* we only handle these for now (why?) */ + break; + case V4L2_CID_HFLIP: + case V4L2_CID_VFLIP: + case V4L2_CID_HCENTER: + case V4L2_CID_VCENTER: +#ifdef V4L2_CID_PAN_RESET + case V4L2_CID_PAN_RESET: +#endif +#ifdef V4L2_CID_TILT_RESET + case V4L2_CID_TILT_RESET: +#endif + /* not handled here, handled by VideoOrientation interface */ + control.id++; + break; + case V4L2_CID_AUDIO_VOLUME: + case V4L2_CID_AUDIO_BALANCE: + case V4L2_CID_AUDIO_BASS: + case V4L2_CID_AUDIO_TREBLE: + case V4L2_CID_AUDIO_MUTE: + case V4L2_CID_AUDIO_LOUDNESS: + /* FIXME: We should implement GstMixer interface */ + /* fall through */ + default: + GST_DEBUG_OBJECT (e, + "ControlID %s (%x) unhandled, FIXME", control.name, n); + control.id++; + break; + } + if (n != control.id) + continue; + + GST_DEBUG_OBJECT (e, "Adding ControlID %s (%x)", control.name, n); + v4l2channel = g_object_new (GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL, NULL); + channel = GST_COLOR_BALANCE_CHANNEL (v4l2channel); + channel->label = g_strdup ((const gchar *) control.name); + v4l2channel->id = n; + +#if 0 + /* FIXME: it will be need just when handling private controls + *(currently none of base controls are of this type) */ + if (control.type == V4L2_CTRL_TYPE_MENU) { + struct v4l2_querymenu menu, *mptr; + + int i; + + menu.id = n; + for (i = 0;; i++) { + menu.index = i; + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYMENU, &menu) < 0) { + if (errno == EINVAL) + break; /* end of enumeration */ + else { + GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, + (_("Failed getting controls attributes on device '%s'."), + v4l2object->videodev), + ("Failed to get %d in menu enumeration for %s. (%d - %s)", + n, v4l2object->videodev, errno, strerror (errno))); + return FALSE; + } + } + mptr = g_malloc (sizeof (menu)); + memcpy (mptr, &menu, sizeof (menu)); + menus = g_list_append (menus, mptr); + } + } + v4l2object->menus = g_list_append (v4l2object->menus, menus); +#endif + + switch (control.type) { + case V4L2_CTRL_TYPE_INTEGER: + channel->min_value = control.minimum; + channel->max_value = control.maximum; + break; + case V4L2_CTRL_TYPE_BOOLEAN: + channel->min_value = FALSE; + channel->max_value = TRUE; + break; + default: + /* FIXME we should find out how to handle V4L2_CTRL_TYPE_BUTTON. + BUTTON controls like V4L2_CID_DO_WHITE_BALANCE can just be set (1) or + unset (0), but can't be queried */ + GST_DEBUG_OBJECT (e, + "Control with non supported type %s (%x), type=%d", + control.name, n, control.type); + channel->min_value = channel->max_value = 0; + break; + } + + v4l2object->colors = + g_list_prepend (v4l2object->colors, (gpointer) channel); + } + v4l2object->colors = g_list_reverse (v4l2object->colors); + + GST_DEBUG_OBJECT (e, "done"); + return TRUE; +} + + +static void +gst_v4l2_empty_lists (GstV4l2Object * v4l2object) +{ + GST_DEBUG_OBJECT (v4l2object->element, "deleting enumerations"); + + g_list_foreach (v4l2object->channels, (GFunc) g_object_unref, NULL); + g_list_free (v4l2object->channels); + v4l2object->channels = NULL; + + g_list_foreach (v4l2object->norms, (GFunc) g_object_unref, NULL); + g_list_free (v4l2object->norms); + v4l2object->norms = NULL; + + g_list_foreach (v4l2object->colors, (GFunc) g_object_unref, NULL); + g_list_free (v4l2object->colors); + v4l2object->colors = NULL; +} + +/****************************************************** + * gst_v4l2_open(): + * open the video device (v4l2object->videodev) + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_open (GstV4l2Object * v4l2object) +{ + struct stat st; + int libv4l2_fd; + GstPollFD pollfd = GST_POLL_FD_INIT; + + GST_DEBUG_OBJECT (v4l2object->element, "Trying to open device %s", + v4l2object->videodev); + + GST_V4L2_CHECK_NOT_OPEN (v4l2object); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2object); + + /* be sure we have a device */ + if (!v4l2object->videodev) + v4l2object->videodev = g_strdup ("/dev/video"); + + /* check if it is a device */ + if (stat (v4l2object->videodev, &st) == -1) + goto stat_failed; + + if (!S_ISCHR (st.st_mode)) + goto no_device; + + /* open the device */ + v4l2object->video_fd = + open (v4l2object->videodev, O_RDWR /* | O_NONBLOCK */ ); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + goto not_open; + + libv4l2_fd = v4l2_fd_open (v4l2object->video_fd, + V4L2_ENABLE_ENUM_FMT_EMULATION); + /* Note the v4l2_xxx functions are designed so that if they get passed an + unknown fd, the will behave exactly as their regular xxx counterparts, so + if v4l2_fd_open fails, we continue as normal (missing the libv4l2 custom + cam format to normal formats conversion). Chances are big we will still + fail then though, as normally v4l2_fd_open only fails if the device is not + a v4l2 device. */ + if (libv4l2_fd != -1) + v4l2object->video_fd = libv4l2_fd; + + v4l2object->can_poll_device = TRUE; + + /* get capabilities, error will be posted */ + if (!gst_v4l2_get_capabilities (v4l2object)) + goto error; + + /* do we need to be a capture device? */ + if (GST_IS_V4L2SRC (v4l2object->element) && + !(v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) + goto not_capture; + +#ifdef HAVE_EXPERIMENTAL + if (GST_IS_V4L2SINK (v4l2object->element) && + !(v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) + goto not_output; +#endif + + /* create enumerations, posts errors. */ + if (!gst_v4l2_fill_lists (v4l2object)) + goto error; + + GST_INFO_OBJECT (v4l2object->element, + "Opened device '%s' (%s) successfully", + v4l2object->vcap.card, v4l2object->videodev); + + pollfd.fd = v4l2object->video_fd; + gst_poll_add_fd (v4l2object->poll, &pollfd); + gst_poll_fd_ctl_read (v4l2object->poll, &pollfd, TRUE); + + return TRUE; + + /* ERRORS */ +stat_failed: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, + (_("Cannot identify device '%s'."), v4l2object->videodev), + GST_ERROR_SYSTEM); + goto error; + } +no_device: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, + (_("This isn't a device '%s'."), v4l2object->videodev), + GST_ERROR_SYSTEM); + goto error; + } +not_open: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, OPEN_READ_WRITE, + (_("Could not open device '%s' for reading and writing."), + v4l2object->videodev), GST_ERROR_SYSTEM); + goto error; + } +not_capture: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, + (_("Device '%s' is not a capture device."), + v4l2object->videodev), + ("Capabilities: 0x%x", v4l2object->vcap.capabilities)); + goto error; + } +#ifdef HAVE_EXPERIMENTAL +not_output: + { + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, + (_("Device '%s' is not a output device."), + v4l2object->videodev), + ("Capabilities: 0x%x", v4l2object->vcap.capabilities)); + goto error; + } +#endif +error: + { + if (GST_V4L2_IS_OPEN (v4l2object)) { + /* close device */ + v4l2_close (v4l2object->video_fd); + v4l2object->video_fd = -1; + } + /* empty lists */ + gst_v4l2_empty_lists (v4l2object); + + return FALSE; + } +} + + +/****************************************************** + * gst_v4l2_close(): + * close the video device (v4l2object->video_fd) + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_close (GstV4l2Object * v4l2object) +{ + GstPollFD pollfd = GST_POLL_FD_INIT; + GST_DEBUG_OBJECT (v4l2object->element, "Trying to close %s", + v4l2object->videodev); + + GST_V4L2_CHECK_OPEN (v4l2object); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2object); + + /* close device */ + v4l2_close (v4l2object->video_fd); + pollfd.fd = v4l2object->video_fd; + gst_poll_remove_fd (v4l2object->poll, &pollfd); + v4l2object->video_fd = -1; + + /* empty lists */ + gst_v4l2_empty_lists (v4l2object); + + return TRUE; +} + + +/****************************************************** + * gst_v4l2_get_norm() + * Get the norm of the current device + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_get_norm (GstV4l2Object * v4l2object, v4l2_std_id * norm) +{ + GST_DEBUG_OBJECT (v4l2object->element, "getting norm"); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_STD, norm) < 0) + goto std_failed; + + return TRUE; + + /* ERRORS */ +std_failed: + { + GST_DEBUG ("Failed to get the current norm for device %s", + v4l2object->videodev); + return FALSE; + } +} + + +/****************************************************** + * gst_v4l2_set_norm() + * Set the norm of the current device + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_set_norm (GstV4l2Object * v4l2object, v4l2_std_id norm) +{ + GST_DEBUG_OBJECT (v4l2object->element, "trying to set norm to " + "%" G_GINT64_MODIFIER "x", (guint64) norm); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_STD, &norm) < 0) + goto std_failed; + + return TRUE; + + /* ERRORS */ +std_failed: + { + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to set norm for device '%s'."), + v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + +/****************************************************** + * gst_v4l2_get_frequency(): + * get the current frequency + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_get_frequency (GstV4l2Object * v4l2object, + gint tunernum, gulong * frequency) +{ + struct v4l2_frequency freq = { 0, }; + + GstTunerChannel *channel; + + GST_DEBUG_OBJECT (v4l2object->element, "getting current tuner frequency"); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + channel = gst_tuner_get_channel (GST_TUNER (v4l2object->element)); + + freq.tuner = tunernum; + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_FREQUENCY, &freq) < 0) + goto freq_failed; + + *frequency = freq.frequency * channel->freq_multiplicator; + + return TRUE; + + /* ERRORS */ +freq_failed: + { + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to get current tuner frequency for device '%s'."), + v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + + +/****************************************************** + * gst_v4l2_set_frequency(): + * set frequency + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_set_frequency (GstV4l2Object * v4l2object, + gint tunernum, gulong frequency) +{ + struct v4l2_frequency freq = { 0, }; + + GstTunerChannel *channel; + + GST_DEBUG_OBJECT (v4l2object->element, + "setting current tuner frequency to %lu", frequency); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + channel = gst_tuner_get_channel (GST_TUNER (v4l2object->element)); + + freq.tuner = tunernum; + /* fill in type - ignore error */ + v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_FREQUENCY, &freq); + freq.frequency = frequency / channel->freq_multiplicator; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_FREQUENCY, &freq) < 0) + goto freq_failed; + + return TRUE; + + /* ERRORS */ +freq_failed: + { + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to set current tuner frequency for device '%s' to %lu Hz."), + v4l2object->videodev, frequency), GST_ERROR_SYSTEM); + return FALSE; + } +} + +/****************************************************** + * gst_v4l2_signal_strength(): + * get the strength of the signal on the current input + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_signal_strength (GstV4l2Object * v4l2object, + gint tunernum, gulong * signal_strength) +{ + struct v4l2_tuner tuner = { 0, }; + + GST_DEBUG_OBJECT (v4l2object->element, "trying to get signal strength"); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + tuner.index = tunernum; + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &tuner) < 0) + goto tuner_failed; + + *signal_strength = tuner.signal; + + return TRUE; + + /* ERRORS */ +tuner_failed: + { + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to get signal strength for device '%s'."), + v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + +/****************************************************** + * gst_v4l2_get_attribute(): + * try to get the value of one specific attribute + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_get_attribute (GstV4l2Object * v4l2object, + int attribute_num, int *value) +{ + struct v4l2_control control = { 0, }; + + GST_DEBUG_OBJECT (v4l2object->element, "getting value of attribute %d", + attribute_num); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + control.id = attribute_num; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_CTRL, &control) < 0) + goto ctrl_failed; + + *value = control.value; + + return TRUE; + + /* ERRORS */ +ctrl_failed: + { + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to get value for control %d on device '%s'."), + attribute_num, v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + + +/****************************************************** + * gst_v4l2_set_attribute(): + * try to set the value of one specific attribute + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2_set_attribute (GstV4l2Object * v4l2object, + int attribute_num, const int value) +{ + struct v4l2_control control = { 0, }; + + GST_DEBUG_OBJECT (v4l2object->element, "setting value of attribute %d to %d", + attribute_num, value); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + control.id = attribute_num; + control.value = value; + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_CTRL, &control) < 0) + goto ctrl_failed; + + return TRUE; + + /* ERRORS */ +ctrl_failed: + { + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to set value %d for control %d on device '%s'."), + value, attribute_num, v4l2object->videodev), GST_ERROR_SYSTEM); + return FALSE; + } +} + +gboolean +gst_v4l2_get_input (GstV4l2Object * v4l2object, gint * input) +{ + gint n; + + GST_DEBUG_OBJECT (v4l2object->element, "trying to get input"); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_INPUT, &n) < 0) + goto input_failed; + + *input = n; + + GST_DEBUG_OBJECT (v4l2object->element, "input: %d", n); + + return TRUE; + + /* ERRORS */ +input_failed: + if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) { + /* only give a warning message if driver actually claims to have tuner + * support + */ + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to get current input on device '%s'. May be it is a radio device"), v4l2object->videodev), GST_ERROR_SYSTEM); + } + return FALSE; +} + +gboolean +gst_v4l2_set_input (GstV4l2Object * v4l2object, gint input) +{ + GST_DEBUG_OBJECT (v4l2object->element, "trying to set input to %d", input); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_INPUT, &input) < 0) + goto input_failed; + + return TRUE; + + /* ERRORS */ +input_failed: + if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) { + /* only give a warning message if driver actually claims to have tuner + * support + */ + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to set input %d on device %s."), + input, v4l2object->videodev), GST_ERROR_SYSTEM); + } + return FALSE; +} + +gboolean +gst_v4l2_get_output (GstV4l2Object * v4l2object, gint * output) +{ + gint n; + + GST_DEBUG_OBJECT (v4l2object->element, "trying to get output"); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_OUTPUT, &n) < 0) + goto output_failed; + + *output = n; + + GST_DEBUG_OBJECT (v4l2object->element, "output: %d", n); + + return TRUE; + + /* ERRORS */ +output_failed: + if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) { + /* only give a warning message if driver actually claims to have tuner + * support + */ + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to get current output on device '%s'. May be it is a radio device"), v4l2object->videodev), GST_ERROR_SYSTEM); + } + return FALSE; +} + +gboolean +gst_v4l2_set_output (GstV4l2Object * v4l2object, gint output) +{ + GST_DEBUG_OBJECT (v4l2object->element, "trying to set output to %d", output); + + if (!GST_V4L2_IS_OPEN (v4l2object)) + return FALSE; + + if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_OUTPUT, &output) < 0) + goto output_failed; + + return TRUE; + + /* ERRORS */ +output_failed: + if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) { + /* only give a warning message if driver actually claims to have tuner + * support + */ + GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, + (_("Failed to set output %d on device %s."), + output, v4l2object->videodev), GST_ERROR_SYSTEM); + } + return FALSE; +} diff --git a/sys/v4l2/v4l2_calls.h b/sys/v4l2/v4l2_calls.h new file mode 100644 index 0000000..d2e2c72 --- /dev/null +++ b/sys/v4l2/v4l2_calls.h @@ -0,0 +1,142 @@ +/* GStreamer + * + * Copyright (C) 2002 Ronald Bultje + * 2006 Edgard Lima + * + * v4l2_calls.h - generic V4L2 calls handling + * + * 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 __V4L2_CALLS_H__ +#define __V4L2_CALLS_H__ + +#include "gstv4l2object.h" + +#ifdef HAVE_LIBV4L2 +# include +#else +# include +# include +# define v4l2_fd_open(fd, flags) (fd) +# define v4l2_close close +# define v4l2_dup dup +# define v4l2_ioctl ioctl +# define v4l2_read read +# define v4l2_mmap mmap +# define v4l2_munmap munmap +#endif + +/* simple check whether the device is open */ +#define GST_V4L2_IS_OPEN(v4l2object) \ + (v4l2object->video_fd > 0) + +/* check whether the device is 'active' */ +#define GST_V4L2_IS_ACTIVE(v4l2object) \ + (v4l2object->buffer != NULL) + +#define GST_V4L2_IS_OVERLAY(v4l2object) \ + (v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_OVERLAY) + +/* checks whether the current v4lv4l2object has already been open()'ed or not */ +#define GST_V4L2_CHECK_OPEN(v4l2object) \ + if (!GST_V4L2_IS_OPEN(v4l2object)) \ + { \ + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ + (_("Device is not open.")), (NULL)); \ + return FALSE; \ + } + +/* checks whether the current v4lv4l2object is close()'ed or whether it is still open */ +#define GST_V4L2_CHECK_NOT_OPEN(v4l2object) \ + if (GST_V4L2_IS_OPEN(v4l2object)) \ + { \ + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ + (_("Device is open.")), (NULL)); \ + return FALSE; \ + } + +/* checks whether the current v4lv4l2object does video overlay */ +#define GST_V4L2_CHECK_OVERLAY(v4l2object) \ + if (!GST_V4L2_IS_OVERLAY(v4l2object)) \ + { \ + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ + (NULL), ("Device cannot handle overlay")); \ + return FALSE; \ + } + +/* checks whether we're in capture mode or not */ +#define GST_V4L2_CHECK_ACTIVE(v4l2object) \ + if (!GST_V4L2_IS_ACTIVE(v4l2object)) \ + { \ + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ + (NULL), ("Device is not in streaming mode")); \ + return FALSE; \ + } + +/* checks whether we're out of capture mode or not */ +#define GST_V4L2_CHECK_NOT_ACTIVE(v4l2object) \ + if (GST_V4L2_IS_ACTIVE(v4l2object)) \ + { \ + GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ + (NULL), ("Device is in streaming mode")); \ + return FALSE; \ + } + + +/* open/close the device */ +gboolean gst_v4l2_open (GstV4l2Object *v4l2object); +gboolean gst_v4l2_close (GstV4l2Object *v4l2object); + +/* norm/input/output */ +gboolean gst_v4l2_get_norm (GstV4l2Object *v4l2object, + v4l2_std_id *norm); +gboolean gst_v4l2_set_norm (GstV4l2Object *v4l2object, + v4l2_std_id norm); +gboolean gst_v4l2_get_input (GstV4l2Object * v4l2object, + gint * input); +gboolean gst_v4l2_set_input (GstV4l2Object * v4l2object, + gint input); +gboolean gst_v4l2_get_output (GstV4l2Object *v4l2object, + gint *output); +gboolean gst_v4l2_set_output (GstV4l2Object *v4l2object, + gint output); + +/* frequency control */ +gboolean gst_v4l2_get_frequency (GstV4l2Object *v4l2object, + gint tunernum, + gulong *frequency); +gboolean gst_v4l2_set_frequency (GstV4l2Object *v4l2object, + gint tunernum, + gulong frequency); +gboolean gst_v4l2_signal_strength (GstV4l2Object *v4l2object, + gint tunernum, + gulong *signal); + +/* attribute control */ +gboolean gst_v4l2_get_attribute (GstV4l2Object *v4l2object, + int attribute, + int *value); +gboolean gst_v4l2_set_attribute (GstV4l2Object *v4l2object, + int attribute, + const int value); + +gboolean gst_v4l2_get_capabilities (GstV4l2Object * v4l2object); + + +#define LOG_CAPS(obj, caps) GST_DEBUG_OBJECT (obj, "%s: %" GST_PTR_FORMAT, #caps, caps) + +#endif /* __V4L2_CALLS_H__ */ diff --git a/sys/v4l2/v4l2src_calls.c b/sys/v4l2/v4l2src_calls.c new file mode 100644 index 0000000..bfa5589 --- /dev/null +++ b/sys/v4l2/v4l2src_calls.c @@ -0,0 +1,434 @@ +/* GStreamer + * + * Copyright (C) 2002 Ronald Bultje + * 2006 Edgard Lima + * + * v4l2src.c - system calls + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include "v4l2src_calls.h" +#include +#include +#ifdef __sun +/* Needed on older Solaris Nevada builds (72 at least) */ +#include +#include +#endif + +#include "gstv4l2tuner.h" +#include "gstv4l2bufferpool.h" + +#include "gst/gst-i18n-plugin.h" + +#define GST_CAT_DEFAULT v4l2src_debug +GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE); + +/* lalala... */ +#define GST_V4L2_SET_ACTIVE(element) (element)->buffer = GINT_TO_POINTER (-1) +#define GST_V4L2_SET_INACTIVE(element) (element)->buffer = NULL + +/* On some systems MAP_FAILED seems to be missing */ +#ifndef MAP_FAILED +#define MAP_FAILED ((caddr_t) -1) +#endif + + +/* Local functions */ + +static gboolean +gst_v4l2src_buffer_pool_activate (GstV4l2BufferPool * pool, + GstV4l2Src * v4l2src) +{ + GstV4l2Buffer *buf; + + while ((buf = gst_v4l2_buffer_pool_get (pool, FALSE)) != NULL) + if (!gst_v4l2_buffer_pool_qbuf (pool, buf)) + goto queue_failed; + + return TRUE; + + /* ERRORS */ +queue_failed: + { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, + (_("Could not enqueue buffers in device '%s'."), + v4l2src->v4l2object->videodev), + ("enqueing buffer %d/%d failed: %s", + buf->vbuffer.index, v4l2src->num_buffers, g_strerror (errno))); + return FALSE; + } +} + +/****************************************************** + * gst_v4l2src_grab_frame (): + * grab a frame for capturing + * return value: GST_FLOW_OK, GST_FLOW_WRONG_STATE or GST_FLOW_ERROR + ******************************************************/ +GstFlowReturn +gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf) +{ +#define NUM_TRIALS 50 + GstV4l2Object *v4l2object; + GstV4l2BufferPool *pool; + gint32 trials = NUM_TRIALS; + GstBuffer *pool_buffer; + gboolean need_copy; + gint ret; + + v4l2object = v4l2src->v4l2object; + pool = v4l2src->pool; + if (!pool) + goto no_buffer_pool; + + GST_DEBUG_OBJECT (v4l2src, "grab frame"); + + for (;;) { + if (v4l2object->can_poll_device) { + ret = gst_poll_wait (v4l2object->poll, GST_CLOCK_TIME_NONE); + if (G_UNLIKELY (ret < 0)) { + if (errno == EBUSY) + goto stopped; + if (errno == ENXIO) { + GST_DEBUG_OBJECT (v4l2src, + "v4l2 device doesn't support polling. Disabling"); + v4l2object->can_poll_device = FALSE; + } else { + if (errno != EAGAIN && errno != EINTR) + goto select_error; + } + } + } + + pool_buffer = GST_BUFFER (gst_v4l2_buffer_pool_dqbuf (pool)); + if (pool_buffer) + break; + + GST_WARNING_OBJECT (pool->v4l2elem, "trials=%d", trials); + + /* if the sync() got interrupted, we can retry */ + switch (errno) { + case EINVAL: + case ENOMEM: + /* fatal */ + return GST_FLOW_ERROR; + + case EAGAIN: + case EIO: + case EINTR: + default: + /* try again, until too many trials */ + break; + } + + /* check nr. of attempts to capture */ + if (--trials == -1) { + goto too_many_trials; + } + } + + /* if we are handing out the last buffer in the pool, we need to make a + * copy and bring the buffer back in the pool. */ + need_copy = v4l2src->always_copy + || !gst_v4l2_buffer_pool_available_buffers (pool); + + if (G_UNLIKELY (need_copy)) { + if (!v4l2src->always_copy) { + GST_CAT_LOG_OBJECT (GST_CAT_PERFORMANCE, v4l2src, + "running out of buffers, making a copy to reuse current one"); + } + *buf = gst_buffer_copy (pool_buffer); + GST_BUFFER_FLAG_UNSET (*buf, GST_BUFFER_FLAG_READONLY); + /* this will requeue */ + gst_buffer_unref (pool_buffer); + } else { + *buf = pool_buffer; + } + /* we set the buffer metadata in gst_v4l2src_create() */ + + return GST_FLOW_OK; + + /* ERRORS */ +no_buffer_pool: + { + GST_DEBUG ("no buffer pool"); + return GST_FLOW_WRONG_STATE; + } +select_error: + { + GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, READ, (NULL), + ("select error %d: %s (%d)", ret, g_strerror (errno), errno)); + return GST_FLOW_ERROR; + } +stopped: + { + GST_DEBUG ("stop called"); + return GST_FLOW_WRONG_STATE; + } +too_many_trials: + { + GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, FAILED, + (_("Failed trying to get video frames from device '%s'."), + v4l2object->videodev), + (_("Failed after %d tries. device %s. system error: %s"), + NUM_TRIALS, v4l2object->videodev, g_strerror (errno))); + return GST_FLOW_ERROR; + } +} + +/****************************************************** + * gst_v4l2src_set_capture(): + * set capture parameters + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2src_set_capture (GstV4l2Src * v4l2src, guint32 pixelformat, + guint32 width, guint32 height, gboolean interlaced, + guint fps_n, guint fps_d) +{ + gint fd = v4l2src->v4l2object->video_fd; + struct v4l2_streamparm stream; + + if (pixelformat == GST_MAKE_FOURCC ('M', 'P', 'E', 'G')) + return TRUE; + + if (!gst_v4l2_object_set_format (v4l2src->v4l2object, pixelformat, width, + height, interlaced)) { + /* error already reported */ + return FALSE; + } + + /* Is there a reason we require the caller to always specify a framerate? */ + GST_DEBUG_OBJECT (v4l2src, "Desired framerate: %u/%u", fps_n, fps_d); + + memset (&stream, 0x00, sizeof (struct v4l2_streamparm)); + stream.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (v4l2_ioctl (fd, VIDIOC_G_PARM, &stream) < 0) { + GST_ELEMENT_WARNING (v4l2src, RESOURCE, SETTINGS, + (_("Could not get parameters on device '%s'"), + v4l2src->v4l2object->videodev), GST_ERROR_SYSTEM); + goto done; + } + + /* We used to skip frame rate setup if the camera was already setup + with the requested frame rate. This breaks some cameras though, + causing them to not output data (several models of Thinkpad cameras + have this problem at least). + So, don't skip. */ + + /* We want to change the frame rate, so check whether we can. Some cheap USB + * cameras don't have the capability */ + if ((stream.parm.capture.capability & V4L2_CAP_TIMEPERFRAME) == 0) { + GST_DEBUG_OBJECT (v4l2src, "Not setting framerate (not supported)"); + goto done; + } + + GST_LOG_OBJECT (v4l2src, "Setting framerate to %u/%u", fps_n, fps_d); + + /* Note: V4L2 wants the frame interval, we have the frame rate */ + stream.parm.capture.timeperframe.numerator = fps_d; + stream.parm.capture.timeperframe.denominator = fps_n; + + /* some cheap USB cam's won't accept any change */ + if (v4l2_ioctl (fd, VIDIOC_S_PARM, &stream) < 0) { + GST_ELEMENT_WARNING (v4l2src, RESOURCE, SETTINGS, + (_("Video input device did not accept new frame rate setting.")), + GST_ERROR_SYSTEM); + goto done; + } + + v4l2src->fps_n = fps_n; + v4l2src->fps_d = fps_d; + + /* if we have a framerate pre-calculate duration */ + if (fps_n > 0 && fps_d > 0) { + v4l2src->duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n); + } else { + v4l2src->duration = GST_CLOCK_TIME_NONE; + } + + GST_INFO_OBJECT (v4l2src, + "Set framerate to %u/%u and duration to %" GST_TIME_FORMAT, fps_n, fps_d, + GST_TIME_ARGS (v4l2src->duration)); +done: + + return TRUE; +} + +/****************************************************** + * gst_v4l2src_capture_init(): + * initialize the capture system + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2src_capture_init (GstV4l2Src * v4l2src, GstCaps * caps) +{ + GST_DEBUG_OBJECT (v4l2src, "initializing the capture system"); + + GST_V4L2_CHECK_OPEN (v4l2src->v4l2object); + GST_V4L2_CHECK_NOT_ACTIVE (v4l2src->v4l2object); + + if (v4l2src->v4l2object->vcap.capabilities & V4L2_CAP_STREAMING) { + + /* Map the buffers */ + GST_LOG_OBJECT (v4l2src, "initiating buffer pool"); + + if (!(v4l2src->pool = gst_v4l2_buffer_pool_new (GST_ELEMENT (v4l2src), + v4l2src->v4l2object->video_fd, + v4l2src->num_buffers, caps, TRUE, V4L2_BUF_TYPE_VIDEO_CAPTURE))) + goto buffer_pool_new_failed; + + GST_INFO_OBJECT (v4l2src, "capturing buffers via mmap()"); + v4l2src->use_mmap = TRUE; + + if (v4l2src->num_buffers != v4l2src->pool->buffer_count) { + v4l2src->num_buffers = v4l2src->pool->buffer_count; + g_object_notify (G_OBJECT (v4l2src), "queue-size"); + } + + } else if (v4l2src->v4l2object->vcap.capabilities & V4L2_CAP_READWRITE) { + GST_INFO_OBJECT (v4l2src, "capturing buffers via read()"); + v4l2src->use_mmap = FALSE; + v4l2src->pool = NULL; + } else { + goto no_supported_capture_method; + } + + GST_V4L2_SET_ACTIVE (v4l2src->v4l2object); + + return TRUE; + + /* ERRORS */ +buffer_pool_new_failed: + { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, + (_("Could not map buffers from device '%s'"), + v4l2src->v4l2object->videodev), + ("Failed to create buffer pool: %s", g_strerror (errno))); + return FALSE; + } +no_supported_capture_method: + { + GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, + (_("The driver of device '%s' does not support any known capture " + "method."), v4l2src->v4l2object->videodev), (NULL)); + return FALSE; + } +} + + +/****************************************************** + * gst_v4l2src_capture_start(): + * start streaming capture + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2src_capture_start (GstV4l2Src * v4l2src) +{ + GST_DEBUG_OBJECT (v4l2src, "starting the capturing"); + //GST_V4L2_CHECK_OPEN (v4l2src->v4l2object); + GST_V4L2_CHECK_ACTIVE (v4l2src->v4l2object); + + v4l2src->quit = FALSE; + + if (v4l2src->use_mmap) { + if (!gst_v4l2src_buffer_pool_activate (v4l2src->pool, v4l2src)) { + return FALSE; + } + + if (!gst_v4l2_object_start_streaming (v4l2src->v4l2object)) { + return FALSE; + } + } + + v4l2src->is_capturing = TRUE; + + return TRUE; +} + +/****************************************************** + * gst_v4l2src_capture_stop(): + * stop streaming capture + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2src_capture_stop (GstV4l2Src * v4l2src) +{ + GST_DEBUG_OBJECT (v4l2src, "stopping capturing"); + + if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) { + goto done; + } + if (!GST_V4L2_IS_ACTIVE (v4l2src->v4l2object)) { + goto done; + } + + if (v4l2src->use_mmap) { + /* we actually need to sync on all queued buffers but not + * on the non-queued ones */ + if (!gst_v4l2_object_stop_streaming (v4l2src->v4l2object)) { + return FALSE; + } + } + +done: + + /* make an optional pending wait stop */ + v4l2src->quit = TRUE; + v4l2src->is_capturing = FALSE; + + return TRUE; +} + +/****************************************************** + * gst_v4l2src_capture_deinit(): + * deinitialize the capture system + * return value: TRUE on success, FALSE on error + ******************************************************/ +gboolean +gst_v4l2src_capture_deinit (GstV4l2Src * v4l2src) +{ + GST_DEBUG_OBJECT (v4l2src, "deinitting capture system"); + + if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) { + return TRUE; + } + if (!GST_V4L2_IS_ACTIVE (v4l2src->v4l2object)) { + return TRUE; + } + + if (v4l2src->pool) { + gst_v4l2_buffer_pool_destroy (v4l2src->pool); + v4l2src->pool = NULL; + } + + GST_V4L2_SET_INACTIVE (v4l2src->v4l2object); + + return TRUE; +} diff --git a/sys/v4l2/v4l2src_calls.h b/sys/v4l2/v4l2src_calls.h new file mode 100644 index 0000000..7091918 --- /dev/null +++ b/sys/v4l2/v4l2src_calls.h @@ -0,0 +1,46 @@ +/* GStreamer + * + * Copyright (C) 2002 Ronald Bultje + * 2006 Edgard Lima + * + * v4l2src.h - system calls + * + * 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 __V4L2SRC_CALLS_H__ +#define __V4L2SRC_CALLS_H__ + +#include "gstv4l2src.h" +#include "v4l2_calls.h" + +gboolean gst_v4l2src_get_capture (GstV4l2Src * v4l2src); +gboolean gst_v4l2src_set_capture (GstV4l2Src * v4l2src, + guint32 pixelformat, + guint32 width, guint32 height, + gboolean interlaced, + guint32 fps_n, guint32 fps_d); + +gboolean gst_v4l2src_capture_init (GstV4l2Src * v4l2src, GstCaps *caps); +gboolean gst_v4l2src_capture_start (GstV4l2Src * v4l2src); + +GstFlowReturn gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer **buf); + +gboolean gst_v4l2src_capture_stop (GstV4l2Src * v4l2src); +gboolean gst_v4l2src_capture_deinit (GstV4l2Src * v4l2src); + + +#endif /* __V4L2SRC_CALLS_H__ */ diff --git a/sys/waveform/Makefile.am b/sys/waveform/Makefile.am new file mode 100644 index 0000000..a9562a8 --- /dev/null +++ b/sys/waveform/Makefile.am @@ -0,0 +1,20 @@ +plugin_LTLIBRARIES = libgstwaveformsink.la + +# FIXME: Replace DIRECTSOUND CFLAGS+LIBS with waveform related ones and fix +# the configure.ac + sys/Makefile.am to get this stuff building in MingW +# For now, it's just disted for use in the VS builds. + +libgstwaveformsink_la_SOURCES = gstwaveformsink.c gstwaveformplugin.c +libgstwaveformsink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) $(DIRECTSOUND_CFLAGS) +libgstwaveformsink_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(DIRECTSOUND_LIBS) +libgstwaveformsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS) +libgstwaveformsink_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstwaveformsink.h + diff --git a/sys/waveform/Makefile.in b/sys/waveform/Makefile.in new file mode 100644 index 0000000..efdf5e7 --- /dev/null +++ b/sys/waveform/Makefile.in @@ -0,0 +1,828 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = sys/waveform +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstwaveformsink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstwaveformsink_la_OBJECTS = \ + libgstwaveformsink_la-gstwaveformsink.lo \ + libgstwaveformsink_la-gstwaveformplugin.lo +libgstwaveformsink_la_OBJECTS = $(am_libgstwaveformsink_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstwaveformsink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) \ + $(libgstwaveformsink_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstwaveformsink_la_SOURCES) +DIST_SOURCES = $(libgstwaveformsink_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstwaveformsink.la + +# FIXME: Replace DIRECTSOUND CFLAGS+LIBS with waveform related ones and fix +# the configure.ac + sys/Makefile.am to get this stuff building in MingW +# For now, it's just disted for use in the VS builds. +libgstwaveformsink_la_SOURCES = gstwaveformsink.c gstwaveformplugin.c +libgstwaveformsink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) $(DIRECTSOUND_CFLAGS) + +libgstwaveformsink_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(DIRECTSOUND_LIBS) + +libgstwaveformsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS) +libgstwaveformsink_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstwaveformsink.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/waveform/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/waveform/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstwaveformsink.la: $(libgstwaveformsink_la_OBJECTS) $(libgstwaveformsink_la_DEPENDENCIES) $(EXTRA_libgstwaveformsink_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstwaveformsink_la_LINK) -rpath $(plugindir) $(libgstwaveformsink_la_OBJECTS) $(libgstwaveformsink_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaveformsink_la-gstwaveformplugin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaveformsink_la-gstwaveformsink.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstwaveformsink_la-gstwaveformsink.lo: gstwaveformsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) -MT libgstwaveformsink_la-gstwaveformsink.lo -MD -MP -MF $(DEPDIR)/libgstwaveformsink_la-gstwaveformsink.Tpo -c -o libgstwaveformsink_la-gstwaveformsink.lo `test -f 'gstwaveformsink.c' || echo '$(srcdir)/'`gstwaveformsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwaveformsink_la-gstwaveformsink.Tpo $(DEPDIR)/libgstwaveformsink_la-gstwaveformsink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwaveformsink.c' object='libgstwaveformsink_la-gstwaveformsink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) -c -o libgstwaveformsink_la-gstwaveformsink.lo `test -f 'gstwaveformsink.c' || echo '$(srcdir)/'`gstwaveformsink.c + +libgstwaveformsink_la-gstwaveformplugin.lo: gstwaveformplugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) -MT libgstwaveformsink_la-gstwaveformplugin.lo -MD -MP -MF $(DEPDIR)/libgstwaveformsink_la-gstwaveformplugin.Tpo -c -o libgstwaveformsink_la-gstwaveformplugin.lo `test -f 'gstwaveformplugin.c' || echo '$(srcdir)/'`gstwaveformplugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwaveformsink_la-gstwaveformplugin.Tpo $(DEPDIR)/libgstwaveformsink_la-gstwaveformplugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwaveformplugin.c' object='libgstwaveformsink_la-gstwaveformplugin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) -c -o libgstwaveformsink_la-gstwaveformplugin.lo `test -f 'gstwaveformplugin.c' || echo '$(srcdir)/'`gstwaveformplugin.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/waveform/gstwaveformplugin.c b/sys/waveform/gstwaveformplugin.c new file mode 100644 index 0000000..0d7943e --- /dev/null +++ b/sys/waveform/gstwaveformplugin.c @@ -0,0 +1,42 @@ +/* GStreamer +* Copyright (C) 2005 Sebastien Moutte +* +* gstwaveformplugin.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. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstwaveformsink.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "waveformsink", GST_RANK_PRIMARY, + GST_TYPE_WAVEFORM_SINK)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "waveform", + "WaveForm win32 API plugin", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/sys/waveform/gstwaveformsink.c b/sys/waveform/gstwaveformsink.c new file mode 100644 index 0000000..0c59829 --- /dev/null +++ b/sys/waveform/gstwaveformsink.c @@ -0,0 +1,585 @@ +/* GStreamer +* Copyright (C) 2005 Sebastien Moutte +* +* gstwaveformsink.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. +*/ + +/** + * SECTION:element-waveformsink + * + * This element lets you output sound using the Windows WaveForm API. + * + * Note that you should almost always use generic audio conversion elements + * like audioconvert and audioresample in front of an audiosink to make sure + * your pipeline works under all circumstances (those conversion elements will + * act in passthrough-mode if no conversion is necessary). + * + * + * Example pipelines + * |[ + * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.1 ! waveformsink + * ]| will output a sine wave (continuous beep sound) to your sound card (with + * a very low volume as precaution). + * |[ + * gst-launch -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! waveformsink + * ]| will play an Ogg/Vorbis audio file and output it. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstwaveformsink.h" + +GST_DEBUG_CATEGORY_STATIC (waveformsink_debug); + +static void gst_waveform_sink_base_init (gpointer g_class); +static void gst_waveform_sink_class_init (GstWaveFormSinkClass * klass); +static void gst_waveform_sink_init (GstWaveFormSink * wfsink, + GstWaveFormSinkClass * g_class); +static void gst_waveform_sink_finalise (GObject * object); +static void gst_waveform_sink_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_waveform_sink_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static GstCaps *gst_waveform_sink_getcaps (GstBaseSink * bsink); + +/************************************************************************/ +/* GstAudioSink functions */ +/************************************************************************/ +static gboolean gst_waveform_sink_prepare (GstAudioSink * asink, + GstRingBufferSpec * spec); +static gboolean gst_waveform_sink_unprepare (GstAudioSink * asink); +static gboolean gst_waveform_sink_open (GstAudioSink * asink); +static gboolean gst_waveform_sink_close (GstAudioSink * asink); +static guint gst_waveform_sink_write (GstAudioSink * asink, gpointer data, + guint length); +static guint gst_waveform_sink_delay (GstAudioSink * asink); +static void gst_waveform_sink_reset (GstAudioSink * asink); + +/************************************************************************/ +/* Utils */ +/************************************************************************/ +GstCaps *gst_waveform_sink_create_caps (gint rate, gint channels, + gint bits_per_sample); +WAVEHDR *bufferpool_get_buffer (GstWaveFormSink * wfsink, gpointer data, + guint length); +void CALLBACK waveOutProc (HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, + DWORD_PTR dwParam1, DWORD_PTR dwParam2); + +static GstStaticPadTemplate waveformsink_sink_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " + "audio/x-raw-int, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) 8, " + "depth = (int) 8, " + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]")); + +GST_BOILERPLATE (GstWaveFormSink, gst_waveform_sink, GstAudioSink, + GST_TYPE_AUDIO_SINK); + +static void +gst_waveform_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "WaveForm Audio Sink", + "Sink/Audio", + "Output to a sound card via WaveForm API", + "Sebastien Moutte "); + gst_element_class_add_static_pad_template (element_class, + &waveformsink_sink_factory); +} + +static void +gst_waveform_sink_class_init (GstWaveFormSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + GstBaseAudioSinkClass *gstbaseaudiosink_class; + GstAudioSinkClass *gstaudiosink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; + gstaudiosink_class = (GstAudioSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_waveform_sink_finalise; + gobject_class->get_property = gst_waveform_sink_get_property; + gobject_class->set_property = gst_waveform_sink_set_property; + + gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_waveform_sink_getcaps); + + gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_waveform_sink_prepare); + gstaudiosink_class->unprepare = + GST_DEBUG_FUNCPTR (gst_waveform_sink_unprepare); + gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_waveform_sink_open); + gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_waveform_sink_close); + gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_waveform_sink_write); + gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_waveform_sink_delay); + gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_waveform_sink_reset); + + GST_DEBUG_CATEGORY_INIT (waveformsink_debug, "waveformsink", 0, + "Waveform sink"); +} + +static void +gst_waveform_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); + + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_waveform_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); + + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_waveform_sink_init (GstWaveFormSink * wfsink, + GstWaveFormSinkClass * g_class) +{ + /* initialize members */ + wfsink->hwaveout = NULL; + wfsink->cached_caps = NULL; + wfsink->wave_buffers = NULL; + wfsink->write_buffer = 0; + wfsink->buffer_count = BUFFER_COUNT; + wfsink->buffer_size = BUFFER_SIZE; + wfsink->free_buffers_count = wfsink->buffer_count; + wfsink->bytes_in_queue = 0; + + InitializeCriticalSection (&wfsink->critic_wave); +} + +static void +gst_waveform_sink_finalise (GObject * object) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); + + if (wfsink->cached_caps) { + gst_caps_unref (wfsink->cached_caps); + wfsink->cached_caps = NULL; + } + + DeleteCriticalSection (&wfsink->critic_wave); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstCaps * +gst_waveform_sink_getcaps (GstBaseSink * bsink) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (bsink); + MMRESULT mmresult; + WAVEOUTCAPS wocaps; + GstCaps *caps, *caps_temp; + + /* return the cached caps if already defined */ + if (wfsink->cached_caps) { + return gst_caps_ref (wfsink->cached_caps); + } + + /* get the default device caps */ + mmresult = waveOutGetDevCaps (WAVE_MAPPER, &wocaps, sizeof (wocaps)); + if (mmresult != MMSYSERR_NOERROR) { + waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); + GST_ELEMENT_ERROR (wfsink, RESOURCE, SETTINGS, + ("gst_waveform_sink_getcaps: waveOutGetDevCaps failed error=>%s", + wfsink->error_string), (NULL)); + return NULL; + } + + caps = gst_caps_new_empty (); + + /* create a caps for all wave formats supported by the device + starting by the best quality format */ + if (wocaps.dwFormats & WAVE_FORMAT_96S16) { + caps_temp = gst_waveform_sink_create_caps (96000, 2, 16); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_96S08) { + caps_temp = gst_waveform_sink_create_caps (96000, 2, 8); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_96M16) { + caps_temp = gst_waveform_sink_create_caps (96000, 1, 16); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_96M08) { + caps_temp = gst_waveform_sink_create_caps (96000, 1, 8); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_4S16) { + caps_temp = gst_waveform_sink_create_caps (44100, 2, 16); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_4S08) { + caps_temp = gst_waveform_sink_create_caps (44100, 2, 8); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_4M16) { + caps_temp = gst_waveform_sink_create_caps (44100, 1, 16); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_4M08) { + caps_temp = gst_waveform_sink_create_caps (44100, 1, 8); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_2S16) { + caps_temp = gst_waveform_sink_create_caps (22050, 2, 16); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_2S08) { + caps_temp = gst_waveform_sink_create_caps (22050, 2, 8); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_2M16) { + caps_temp = gst_waveform_sink_create_caps (22050, 1, 16); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_2M08) { + caps_temp = gst_waveform_sink_create_caps (22050, 1, 8); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_1S16) { + caps_temp = gst_waveform_sink_create_caps (11025, 2, 16); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_1S08) { + caps_temp = gst_waveform_sink_create_caps (11025, 2, 8); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_1M16) { + caps_temp = gst_waveform_sink_create_caps (11025, 1, 16); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + if (wocaps.dwFormats & WAVE_FORMAT_1M08) { + caps_temp = gst_waveform_sink_create_caps (11025, 1, 8); + if (caps_temp) { + gst_caps_append (caps, caps_temp); + } + } + + if (gst_caps_is_empty (caps)) { + gst_caps_unref (caps); + caps = NULL; + } else { + wfsink->cached_caps = gst_caps_ref (caps); + } + + GST_CAT_LOG_OBJECT (waveformsink_debug, wfsink, "Returning caps %s", + gst_caps_to_string (caps)); + + return caps; +} + +static gboolean +gst_waveform_sink_open (GstAudioSink * asink) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); + + /* nothing to do here as the device needs to be opened with the format we will use */ + + return TRUE; +} + +static gboolean +gst_waveform_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); + WAVEFORMATEX wfx; + MMRESULT mmresult; + guint index; + + /* setup waveformex struture with the input ringbuffer specs */ + memset (&wfx, 0, sizeof (wfx)); + wfx.cbSize = 0; + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.nChannels = spec->channels; + wfx.nSamplesPerSec = spec->rate; + wfx.wBitsPerSample = (spec->bytes_per_sample * 8) / wfx.nChannels; + wfx.nBlockAlign = spec->bytes_per_sample; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + + /* save bytes per sample to use it in delay */ + wfsink->bytes_per_sample = spec->bytes_per_sample; + + /* open the default audio device with the given caps */ + mmresult = waveOutOpen (&wfsink->hwaveout, WAVE_MAPPER, + &wfx, (DWORD_PTR) waveOutProc, (DWORD_PTR) wfsink, CALLBACK_FUNCTION); + if (mmresult != MMSYSERR_NOERROR) { + waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); + GST_ELEMENT_ERROR (wfsink, RESOURCE, OPEN_WRITE, + ("gst_waveform_sink_prepare: waveOutOpen failed error=>%s", + wfsink->error_string), (NULL)); + return FALSE; + } + + /* evaluate the buffer size and the number of buffers needed */ + wfsink->free_buffers_count = wfsink->buffer_count; + + /* allocate wave buffers */ + wfsink->wave_buffers = (WAVEHDR *) g_new0 (WAVEHDR, wfsink->buffer_count); + if (!wfsink->wave_buffers) { + GST_ELEMENT_ERROR (wfsink, RESOURCE, OPEN_WRITE, + ("gst_waveform_sink_prepare: Failed to allocate wave buffer headers (buffer count=%d)", + wfsink->buffer_count), (NULL)); + return FALSE; + } + memset (wfsink->wave_buffers, 0, sizeof (WAVEHDR) * wfsink->buffer_count); + + /* setup headers */ + for (index = 0; index < wfsink->buffer_count; index++) { + wfsink->wave_buffers[index].dwBufferLength = wfsink->buffer_size; + wfsink->wave_buffers[index].lpData = g_new0 (gchar, wfsink->buffer_size); + } + + return TRUE; +} + +static gboolean +gst_waveform_sink_unprepare (GstAudioSink * asink) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); + + /* free wave buffers */ + if (wfsink->wave_buffers) { + guint index; + + for (index = 0; index < wfsink->buffer_count; index++) { + if (wfsink->wave_buffers[index].dwFlags & WHDR_PREPARED) { + MMRESULT mmresult = waveOutUnprepareHeader (wfsink->hwaveout, + &wfsink->wave_buffers[index], sizeof (WAVEHDR)); + if (mmresult != MMSYSERR_NOERROR) { + waveOutGetErrorText (mmresult, wfsink->error_string, + ERROR_LENGTH - 1); + GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, + "gst_waveform_sink_unprepare: Error unpreparing buffer => %s", + wfsink->error_string); + } + } + g_free (wfsink->wave_buffers[index].lpData); + } + g_free (wfsink->wave_buffers); + wfsink->wave_buffers = NULL; + } + + /* close waveform-audio output device */ + if (wfsink->hwaveout) { + waveOutClose (wfsink->hwaveout); + wfsink->hwaveout = NULL; + } + + return TRUE; +} + +static gboolean +gst_waveform_sink_close (GstAudioSink * asink) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); + + return TRUE; +} + +static guint +gst_waveform_sink_write (GstAudioSink * asink, gpointer data, guint length) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); + WAVEHDR *waveheader; + MMRESULT mmresult; + guint bytes_to_write = length; + guint remaining_length = length; + + wfsink->bytes_in_queue += length; + + while (remaining_length > 0) { + if (wfsink->free_buffers_count == 0) { + /* no free buffer available, wait for one */ + Sleep (10); + continue; + } + + /* get the current write buffer header */ + waveheader = &wfsink->wave_buffers[wfsink->write_buffer]; + + /* unprepare the header if needed */ + if (waveheader->dwFlags & WHDR_PREPARED) { + mmresult = + waveOutUnprepareHeader (wfsink->hwaveout, waveheader, + sizeof (WAVEHDR)); + if (mmresult != MMSYSERR_NOERROR) { + waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); + GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, + "Error unpreparing buffer => %s", wfsink->error_string); + } + } + + if (wfsink->buffer_size - waveheader->dwUser >= remaining_length) + bytes_to_write = remaining_length; + else + bytes_to_write = wfsink->buffer_size - waveheader->dwUser; + + memcpy (waveheader->lpData + waveheader->dwUser, data, bytes_to_write); + waveheader->dwUser += bytes_to_write; + remaining_length -= bytes_to_write; + data = (guint8 *) data + bytes_to_write; + + if (waveheader->dwUser == wfsink->buffer_size) { + /* we have filled a buffer, let's prepare it and next write it to the device */ + mmresult = + waveOutPrepareHeader (wfsink->hwaveout, waveheader, sizeof (WAVEHDR)); + if (mmresult != MMSYSERR_NOERROR) { + waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); + GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, + "gst_waveform_sink_write: Error preparing header => %s", + wfsink->error_string); + } + mmresult = waveOutWrite (wfsink->hwaveout, waveheader, sizeof (WAVEHDR)); + if (mmresult != MMSYSERR_NOERROR) { + waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); + GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, + "gst_waveform_sink_write: Error writting buffer to the device => %s", + wfsink->error_string); + } + + EnterCriticalSection (&wfsink->critic_wave); + wfsink->free_buffers_count--; + LeaveCriticalSection (&wfsink->critic_wave); + + wfsink->write_buffer++; + wfsink->write_buffer %= wfsink->buffer_count; + waveheader->dwUser = 0; + wfsink->bytes_in_queue = 0; + GST_CAT_LOG_OBJECT (waveformsink_debug, wfsink, + "gst_waveform_sink_write: Writting a buffer to the device (free buffers remaining=%d, write buffer=%d)", + wfsink->free_buffers_count, wfsink->write_buffer); + } + } + + return length; +} + +static guint +gst_waveform_sink_delay (GstAudioSink * asink) +{ + /* return the number of samples in queue (device+internal queue) */ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); + guint bytes_in_device = + (wfsink->buffer_count - wfsink->free_buffers_count) * wfsink->buffer_size; + guint delay = + (bytes_in_device + wfsink->bytes_in_queue) / wfsink->bytes_per_sample; + return delay; +} + +static void +gst_waveform_sink_reset (GstAudioSink * asink) +{ + GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); + MMRESULT mmresult = waveOutReset (wfsink->hwaveout); + + if (mmresult != MMSYSERR_NOERROR) { + waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); + GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, + "gst_waveform_sink_reset: Error reseting waveform-audio device => %s", + wfsink->error_string); + } +} + +GstCaps * +gst_waveform_sink_create_caps (gint rate, gint channels, gint bits_per_sample) +{ + GstCaps *caps = NULL; + + caps = gst_caps_new_simple ("audio/x-raw-int", + "width", G_TYPE_INT, bits_per_sample, + "depth", G_TYPE_INT, bits_per_sample, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, NULL); + return caps; +} + +void CALLBACK +waveOutProc (HWAVEOUT hwo, + UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) +{ + GstWaveFormSink *wfsink = (GstWaveFormSink *) dwInstance; + + if (uMsg == WOM_DONE) { + EnterCriticalSection (&wfsink->critic_wave); + wfsink->free_buffers_count++; + LeaveCriticalSection (&wfsink->critic_wave); + } +} diff --git a/sys/waveform/gstwaveformsink.h b/sys/waveform/gstwaveformsink.h new file mode 100644 index 0000000..b23aea1 --- /dev/null +++ b/sys/waveform/gstwaveformsink.h @@ -0,0 +1,107 @@ +/* GStreamer + * Copyright (C) 2005 Sebastien Moutte + * + * gstwaveformsink.h: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_WAVEFORMSINK_H__ +#define __GST_WAVEFORMSINK_H__ + +#include +#include + +#include +#include + +#ifndef WAVE_FORMAT_96M08 +#define WAVE_FORMAT_96M08 0x00001000 /* 96 kHz, Mono, 8-bit */ +#endif + +#ifndef WAVE_FORMAT_96S08 +#define WAVE_FORMAT_96S08 0x00002000 /* 96 kHz, Stereo, 8-bit */ +#endif + +#ifndef WAVE_FORMAT_96M16 +#define WAVE_FORMAT_96M16 0x00004000 /* 96 kHz, Mono, 16-bit */ +#endif + +#ifndef WAVE_FORMAT_96S16 +#define WAVE_FORMAT_96S16 0x00008000 /* 96 kHz, Stereo, 16-bit */ +#endif + +#define ERROR_LENGTH MAXERRORLENGTH+50 +#define BUFFER_COUNT 20 +#define BUFFER_SIZE 8192 + +G_BEGIN_DECLS +#define GST_TYPE_WAVEFORM_SINK (gst_waveform_sink_get_type()) +#define GST_WAVEFORM_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVEFORM_SINK,GstWaveFormSink)) +#define GST_WAVEFORM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVEFORM_SINK,GstWaveFormSinkClass)) +#define GST_IS_WAVEFORM_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVEFORM_SINK)) +#define GST_IS_WAVEFORM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVEFORM_SINK)) +typedef struct _GstWaveFormSink GstWaveFormSink; +typedef struct _GstWaveFormSinkClass GstWaveFormSinkClass; + +struct _GstWaveFormSink +{ + /* parent object */ + GstAudioSink sink; + + /* supported caps */ + GstCaps *cached_caps; + + /* handle to the waveform-audio output device */ + HWAVEOUT hwaveout; + + /* table of buffer headers */ + WAVEHDR *wave_buffers; + + /* critical section protecting access to the number of free buffers */ + CRITICAL_SECTION critic_wave; + + /* number of free buffers available */ + guint free_buffers_count; + + /* current free buffer where you have to write incoming data */ + guint write_buffer; + + /* size of buffers streamed to the device */ + guint buffer_size; + + /* number of buffers streamed to the device */ + guint buffer_count; + + /* total of bytes in queue before they are written to the device */ + guint bytes_in_queue; + + /* bytes per sample from setcaps used to evaluate the number samples returned by delay */ + guint bytes_per_sample; + + /* wave form error string */ + gchar error_string[ERROR_LENGTH]; +}; + +struct _GstWaveFormSinkClass +{ + GstAudioSinkClass parent_class; +}; + +GType gst_waveform_sink_get_type (void); + +G_END_DECLS +#endif /* __GST_WAVEFORMSINK_H__ */ diff --git a/sys/ximage/Makefile.am b/sys/ximage/Makefile.am new file mode 100644 index 0000000..db3ab22 --- /dev/null +++ b/sys/ximage/Makefile.am @@ -0,0 +1,16 @@ +plugin_LTLIBRARIES = libgstximagesrc.la + +libgstximagesrc_la_SOURCES = gstximagesrc.c ximageutil.c +libgstximagesrc_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(X_CFLAGS) $(XFIXES_CFLAGS) $(XDAMAGE_CFLAGS) +libgstximagesrc_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_BASE_LIBS) \ + $(X_LIBS) $(XSHM_LIBS) $(XFIXES_LIBS) $(XDAMAGE_LIBS) +libgstximagesrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstximagesrc_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstximagesrc.h ximageutil.h diff --git a/sys/ximage/Makefile.in b/sys/ximage/Makefile.in new file mode 100644 index 0000000..129f9a8 --- /dev/null +++ b/sys/ximage/Makefile.in @@ -0,0 +1,825 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = sys/ximage +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstximagesrc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_libgstximagesrc_la_OBJECTS = libgstximagesrc_la-gstximagesrc.lo \ + libgstximagesrc_la-ximageutil.lo +libgstximagesrc_la_OBJECTS = $(am_libgstximagesrc_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libgstximagesrc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) \ + $(libgstximagesrc_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstximagesrc_la_SOURCES) +DIST_SOURCES = $(libgstximagesrc_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstximagesrc.la +libgstximagesrc_la_SOURCES = gstximagesrc.c ximageutil.c +libgstximagesrc_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(X_CFLAGS) $(XFIXES_CFLAGS) $(XDAMAGE_CFLAGS) + +libgstximagesrc_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_BASE_LIBS) \ + $(X_LIBS) $(XSHM_LIBS) $(XFIXES_LIBS) $(XDAMAGE_LIBS) + +libgstximagesrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstximagesrc_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstximagesrc.h ximageutil.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/ximage/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu sys/ximage/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstximagesrc.la: $(libgstximagesrc_la_OBJECTS) $(libgstximagesrc_la_DEPENDENCIES) $(EXTRA_libgstximagesrc_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstximagesrc_la_LINK) -rpath $(plugindir) $(libgstximagesrc_la_OBJECTS) $(libgstximagesrc_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstximagesrc_la-gstximagesrc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstximagesrc_la-ximageutil.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libgstximagesrc_la-gstximagesrc.lo: gstximagesrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) -MT libgstximagesrc_la-gstximagesrc.lo -MD -MP -MF $(DEPDIR)/libgstximagesrc_la-gstximagesrc.Tpo -c -o libgstximagesrc_la-gstximagesrc.lo `test -f 'gstximagesrc.c' || echo '$(srcdir)/'`gstximagesrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstximagesrc_la-gstximagesrc.Tpo $(DEPDIR)/libgstximagesrc_la-gstximagesrc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstximagesrc.c' object='libgstximagesrc_la-gstximagesrc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) -c -o libgstximagesrc_la-gstximagesrc.lo `test -f 'gstximagesrc.c' || echo '$(srcdir)/'`gstximagesrc.c + +libgstximagesrc_la-ximageutil.lo: ximageutil.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) -MT libgstximagesrc_la-ximageutil.lo -MD -MP -MF $(DEPDIR)/libgstximagesrc_la-ximageutil.Tpo -c -o libgstximagesrc_la-ximageutil.lo `test -f 'ximageutil.c' || echo '$(srcdir)/'`ximageutil.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstximagesrc_la-ximageutil.Tpo $(DEPDIR)/libgstximagesrc_la-ximageutil.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ximageutil.c' object='libgstximagesrc_la-ximageutil.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) -c -o libgstximagesrc_la-ximageutil.lo `test -f 'ximageutil.c' || echo '$(srcdir)/'`ximageutil.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sys/ximage/gstximagesrc.c b/sys/ximage/gstximagesrc.c new file mode 100644 index 0000000..36c0b44 --- /dev/null +++ b/sys/ximage/gstximagesrc.c @@ -0,0 +1,1317 @@ +/* GStreamer + * + * Copyright (C) 2006 Zaheer Merali + * + * 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-ximagesrc + * + * This element captures your X Display and creates raw RGB video. It uses + * the XDamage extension if available to only capture areas of the screen that + * have changed since the last frame. It uses the XFixes extension if + * available to also capture your mouse pointer. By default it will fixate to + * 25 frames per second. + * + * + * Example pipelines + * |[ + * gst-launch ximagesrc ! video/x-raw-rgb,framerate=5/1 ! ffmpegcolorspace ! theoraenc ! oggmux ! filesink location=desktop.ogg + * ]| Encodes your X display to an Ogg theora video at 5 frames per second. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "gstximagesrc.h" + +#include +#include + +#include +#include + +#include +#include + +#include "gst/glib-compat-private.h" + +GST_DEBUG_CATEGORY_STATIC (gst_debug_ximage_src); +#define GST_CAT_DEFAULT gst_debug_ximage_src + +static GstStaticPadTemplate t = +GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-rgb, " + "framerate = (fraction) [ 0, MAX ], " + "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ], " + "pixel-aspect-ratio = (fraction) [ 0, MAX ]")); + +enum +{ + PROP_0, + PROP_DISPLAY_NAME, + PROP_SCREEN_NUM, + PROP_SHOW_POINTER, + PROP_USE_DAMAGE, + PROP_STARTX, + PROP_STARTY, + PROP_ENDX, + PROP_ENDY, + PROP_REMOTE, + PROP_XID, + PROP_XNAME, +}; + +GST_BOILERPLATE (GstXImageSrc, gst_ximage_src, GstPushSrc, GST_TYPE_PUSH_SRC); + +static void gst_ximage_src_fixate (GstPad * pad, GstCaps * caps); +static void gst_ximage_src_clear_bufpool (GstXImageSrc * ximagesrc); + +/* Called when a buffer is returned from the pipeline */ +static void +gst_ximage_src_return_buf (GstXImageSrc * ximagesrc, + GstXImageSrcBuffer * ximage) +{ + /* If our geometry changed we can't reuse that image. */ + if ((ximage->width != ximagesrc->width) || + (ximage->height != ximagesrc->height)) { + GST_DEBUG_OBJECT (ximagesrc, + "destroy image %p as its size changed %dx%d vs current %dx%d", + ximage, ximage->width, ximage->height, + ximagesrc->width, ximagesrc->height); + g_mutex_lock (ximagesrc->x_lock); + gst_ximageutil_ximage_destroy (ximagesrc->xcontext, ximage); + g_mutex_unlock (ximagesrc->x_lock); + } else { + /* In that case we can reuse the image and add it to our image pool. */ + GST_LOG_OBJECT (ximagesrc, "recycling image %p in pool", ximage); + /* need to increment the refcount again to recycle */ + gst_buffer_ref (GST_BUFFER (ximage)); + g_mutex_lock (ximagesrc->pool_lock); + GST_BUFFER_FLAGS (GST_BUFFER (ximage)) = 0; /* clear out any flags from the previous use */ + ximagesrc->buffer_pool = g_slist_prepend (ximagesrc->buffer_pool, ximage); + g_mutex_unlock (ximagesrc->pool_lock); + } +} + +static Window +gst_ximage_src_find_window (GstXImageSrc * src, Window root, const char *name) +{ + Window *children; + Window window = 0, root_return, parent_return; + unsigned int nchildren; + char *tmpname; + int n, status; + + status = XFetchName (src->xcontext->disp, root, &tmpname); + if (status && !strcmp (name, tmpname)) + return root; + + status = + XQueryTree (src->xcontext->disp, root, &root_return, &parent_return, + &children, &nchildren); + if (!status || !children) + return (Window) 0; + + for (n = 0; n < nchildren; ++n) { + window = gst_ximage_src_find_window (src, children[n], name); + if (window != 0) + break; + } + + XFree (children); + return window; +} + +static gboolean +gst_ximage_src_open_display (GstXImageSrc * s, const gchar * name) +{ + g_return_val_if_fail (GST_IS_XIMAGE_SRC (s), FALSE); + + if (s->xcontext != NULL) + return TRUE; + + g_mutex_lock (s->x_lock); + s->xcontext = ximageutil_xcontext_get (GST_ELEMENT (s), name); + if (s->xcontext == NULL) { + g_mutex_unlock (s->x_lock); + GST_ELEMENT_ERROR (s, RESOURCE, OPEN_READ, + ("Could not open X display for reading"), + ("NULL returned from getting xcontext")); + return FALSE; + } + s->width = s->xcontext->width; + s->height = s->xcontext->height; + + s->xwindow = s->xcontext->root; + if (s->xid != 0 || s->xname) { + int status; + XWindowAttributes attrs; + Window window; + + if (s->xid != 0) { + status = XGetWindowAttributes (s->xcontext->disp, s->xid, &attrs); + if (status) { + GST_DEBUG_OBJECT (s, "Found window XID %" G_GUINT64_FORMAT, s->xid); + s->xwindow = s->xid; + goto window_found; + } else { + GST_WARNING_OBJECT (s, "Failed to get window %" G_GUINT64_FORMAT + " attributes", s->xid); + } + } + + if (s->xname) { + GST_DEBUG_OBJECT (s, "Looking for window %s", s->xname); + window = gst_ximage_src_find_window (s, s->xcontext->root, s->xname); + if (window != 0) { + GST_DEBUG_OBJECT (s, "Found window named %s, ", s->xname); + status = XGetWindowAttributes (s->xcontext->disp, window, &attrs); + if (status) { + s->xwindow = window; + goto window_found; + } else { + GST_WARNING_OBJECT (s, "Failed to get window attributes for " + "window named %s", s->xname); + } + } + } + + GST_INFO_OBJECT (s, "Using root window"); + goto use_root_window; + + window_found: + g_assert (s->xwindow != 0); + s->width = attrs.width; + s->height = attrs.height; + GST_INFO_OBJECT (s, "Using default window size of %dx%d", + s->width, s->height); + } +use_root_window: + +#ifdef HAVE_XFIXES + /* check if xfixes supported */ + { + int error_base; + + if (XFixesQueryExtension (s->xcontext->disp, &s->fixes_event_base, + &error_base)) { + s->have_xfixes = TRUE; + GST_DEBUG_OBJECT (s, "X Server supports XFixes"); + } else { + + GST_DEBUG_OBJECT (s, "X Server does not support XFixes"); + } + } + +#ifdef HAVE_XDAMAGE + /* check if xdamage is supported */ + { + int error_base; + long evmask = NoEventMask; + + s->have_xdamage = FALSE; + s->damage = None; + s->damage_copy_gc = None; + s->damage_region = None; + + if (XDamageQueryExtension (s->xcontext->disp, &s->damage_event_base, + &error_base)) { + s->damage = + XDamageCreate (s->xcontext->disp, s->xwindow, XDamageReportNonEmpty); + if (s->damage != None) { + s->damage_region = XFixesCreateRegion (s->xcontext->disp, NULL, 0); + if (s->damage_region != None) { + XGCValues values; + + GST_DEBUG_OBJECT (s, "Using XDamage extension"); + values.subwindow_mode = IncludeInferiors; + s->damage_copy_gc = XCreateGC (s->xcontext->disp, + s->xwindow, GCSubwindowMode, &values); + XSelectInput (s->xcontext->disp, s->xwindow, evmask); + + s->have_xdamage = TRUE; + } else { + XDamageDestroy (s->xcontext->disp, s->damage); + s->damage = None; + } + } else + GST_DEBUG_OBJECT (s, "Could not attach to XDamage"); + } else { + GST_DEBUG_OBJECT (s, "X Server does not have XDamage extension"); + } + } +#endif +#endif + + g_mutex_unlock (s->x_lock); + + if (s->xcontext == NULL) + return FALSE; + + return TRUE; +} + +static gboolean +gst_ximage_src_start (GstBaseSrc * basesrc) +{ + GstXImageSrc *s = GST_XIMAGE_SRC (basesrc); + + s->last_frame_no = -1; +#ifdef HAVE_XDAMAGE + if (s->last_ximage) + gst_buffer_unref (GST_BUFFER_CAST (s->last_ximage)); + s->last_ximage = NULL; +#endif + return gst_ximage_src_open_display (s, s->display_name); +} + +static gboolean +gst_ximage_src_stop (GstBaseSrc * basesrc) +{ + GstXImageSrc *src = GST_XIMAGE_SRC (basesrc); + +#ifdef HAVE_XDAMAGE + if (src->last_ximage) + gst_buffer_unref (GST_BUFFER_CAST (src->last_ximage)); + src->last_ximage = NULL; +#endif + + gst_ximage_src_clear_bufpool (src); + +#ifdef HAVE_XFIXES + if (src->cursor_image) + XFree (src->cursor_image); + src->cursor_image = NULL; +#endif + + if (src->xcontext) { + g_mutex_lock (src->x_lock); + +#ifdef HAVE_XDAMAGE + if (src->damage_copy_gc != None) { + XFreeGC (src->xcontext->disp, src->damage_copy_gc); + src->damage_copy_gc = None; + } + if (src->damage_region != None) { + XFixesDestroyRegion (src->xcontext->disp, src->damage_region); + src->damage_region = None; + } + if (src->damage != None) { + XDamageDestroy (src->xcontext->disp, src->damage); + src->damage = None; + } +#endif + + ximageutil_xcontext_clear (src->xcontext); + src->xcontext = NULL; + g_mutex_unlock (src->x_lock); + } + + return TRUE; +} + +static gboolean +gst_ximage_src_unlock (GstBaseSrc * basesrc) +{ + GstXImageSrc *src = GST_XIMAGE_SRC (basesrc); + + /* Awaken the create() func if it's waiting on the clock */ + GST_OBJECT_LOCK (src); + if (src->clock_id) { + GST_DEBUG_OBJECT (src, "Waking up waiting clock"); + gst_clock_id_unschedule (src->clock_id); + } + GST_OBJECT_UNLOCK (src); + + return TRUE; +} + +static gboolean +gst_ximage_src_recalc (GstXImageSrc * src) +{ + if (!src->xcontext) + return FALSE; + + /* Maybe later we can check the display hasn't changed size */ + /* We could use XQueryPointer to get only the current window. */ + return TRUE; +} + +#ifdef HAVE_XFIXES +static void +composite_pixel (GstXContext * xcontext, guchar * dest, guchar * src) +{ + guint8 r = src[2]; + guint8 g = src[1]; + guint8 b = src[0]; + guint8 a = src[3]; + guint8 dr, dg, db; + guint32 color; + gint r_shift, r_max, r_shift_out; + gint g_shift, g_max, g_shift_out; + gint b_shift, b_max, b_shift_out; + + switch (xcontext->bpp) { + case 8: + color = *dest; + break; + case 16: + color = GUINT16_FROM_LE (*(guint16 *) (dest)); + break; + case 32: + color = GUINT32_FROM_LE (*(guint32 *) (dest)); + break; + default: + /* Should not reach here */ + g_return_if_reached (); + } + + /* possible optimisation: + * move the code that finds shift and max in the _link function */ + for (r_shift = 0; !(xcontext->visual->red_mask & (1 << r_shift)); r_shift++); + for (g_shift = 0; !(xcontext->visual->green_mask & (1 << g_shift)); + g_shift++); + for (b_shift = 0; !(xcontext->visual->blue_mask & (1 << b_shift)); b_shift++); + + for (r_shift_out = 0; !(xcontext->visual->red_mask & (1 << r_shift_out)); + r_shift_out++); + for (g_shift_out = 0; !(xcontext->visual->green_mask & (1 << g_shift_out)); + g_shift_out++); + for (b_shift_out = 0; !(xcontext->visual->blue_mask & (1 << b_shift_out)); + b_shift_out++); + + + r_max = (xcontext->visual->red_mask >> r_shift); + b_max = (xcontext->visual->blue_mask >> b_shift); + g_max = (xcontext->visual->green_mask >> g_shift); + +#define RGBXXX_R(x) (((x)>>r_shift) & (r_max)) +#define RGBXXX_G(x) (((x)>>g_shift) & (g_max)) +#define RGBXXX_B(x) (((x)>>b_shift) & (b_max)) + + dr = (RGBXXX_R (color) * 255) / r_max; + dg = (RGBXXX_G (color) * 255) / g_max; + db = (RGBXXX_B (color) * 255) / b_max; + + dr = (r * a + (0xff - a) * dr) / 0xff; + dg = (g * a + (0xff - a) * dg) / 0xff; + db = (b * a + (0xff - a) * db) / 0xff; + + color = (((dr * r_max) / 255) << r_shift_out) + + (((dg * g_max) / 255) << g_shift_out) + + (((db * b_max) / 255) << b_shift_out); + + switch (xcontext->bpp) { + case 8: + *dest = color; + break; + case 16: + *(guint16 *) (dest) = color; + break; + case 32: + *(guint32 *) (dest) = color; + break; + default: + g_warning ("bpp %d not supported\n", xcontext->bpp); + } +} +#endif + +/* Retrieve an XImageSrcBuffer, preferably from our + * pool of existing images and populate it from the window */ +static GstXImageSrcBuffer * +gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) +{ + GstXImageSrcBuffer *ximage = NULL; + + g_mutex_lock (ximagesrc->pool_lock); + while (ximagesrc->buffer_pool != NULL) { + ximage = ximagesrc->buffer_pool->data; + + if ((ximage->width != ximagesrc->width) || + (ximage->height != ximagesrc->height)) { + gst_ximage_buffer_free (ximage); + } + + ximagesrc->buffer_pool = g_slist_delete_link (ximagesrc->buffer_pool, + ximagesrc->buffer_pool); + } + g_mutex_unlock (ximagesrc->pool_lock); + + if (ximage == NULL) { + GstXContext *xcontext; + GstCaps *caps = NULL; + + GST_DEBUG_OBJECT (ximagesrc, "creating image (%dx%d)", + ximagesrc->width, ximagesrc->height); + + g_mutex_lock (ximagesrc->x_lock); + ximage = gst_ximageutil_ximage_new (ximagesrc->xcontext, + GST_ELEMENT (ximagesrc), ximagesrc->width, ximagesrc->height, + (BufferReturnFunc) (gst_ximage_src_return_buf)); + if (ximage == NULL) { + GST_ELEMENT_ERROR (ximagesrc, RESOURCE, WRITE, (NULL), + ("could not create a %dx%d ximage", ximagesrc->width, + ximagesrc->height)); + g_mutex_unlock (ximagesrc->x_lock); + return NULL; + } + + xcontext = ximagesrc->xcontext; + + + caps = gst_caps_new_simple ("video/x-raw-rgb", + "bpp", G_TYPE_INT, xcontext->bpp, + "depth", G_TYPE_INT, xcontext->depth, + "endianness", G_TYPE_INT, xcontext->endianness, + "red_mask", G_TYPE_INT, xcontext->r_mask_output, + "green_mask", G_TYPE_INT, xcontext->g_mask_output, + "blue_mask", G_TYPE_INT, xcontext->b_mask_output, + "width", G_TYPE_INT, ximagesrc->width, + "height", G_TYPE_INT, ximagesrc->height, + "framerate", GST_TYPE_FRACTION, ximagesrc->fps_n, ximagesrc->fps_d, + "pixel-aspect-ratio", GST_TYPE_FRACTION, + gst_value_get_fraction_numerator (xcontext->par), + gst_value_get_fraction_denominator (xcontext->par), NULL); + + gst_buffer_set_caps (GST_BUFFER (ximage), caps); + g_mutex_unlock (ximagesrc->x_lock); + + gst_caps_unref (caps); + } + + g_return_val_if_fail (GST_IS_XIMAGE_SRC (ximagesrc), NULL); +#ifdef HAVE_XDAMAGE + if (ximagesrc->have_xdamage && ximagesrc->use_damage && + ximagesrc->last_ximage != NULL) { + XEvent ev; + + /* have_frame is TRUE when either the entire screen has been + * grabbed or when the last image has been copied */ + gboolean have_frame = FALSE; + + GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XDamage"); + + do { + XNextEvent (ximagesrc->xcontext->disp, &ev); + + if (ev.type == ximagesrc->damage_event_base + XDamageNotify) { + XserverRegion parts; + XRectangle *rects; + int nrects; + + parts = XFixesCreateRegion (ximagesrc->xcontext->disp, 0, 0); + XDamageSubtract (ximagesrc->xcontext->disp, ximagesrc->damage, None, + parts); + /* Now copy out all of the damaged rectangles. */ + rects = XFixesFetchRegion (ximagesrc->xcontext->disp, parts, &nrects); + if (rects != NULL) { + int i; + + if (!have_frame) { + GST_LOG_OBJECT (ximagesrc, + "Copying from last frame ximage->size: %d", + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + memcpy (GST_BUFFER_DATA (GST_BUFFER (ximage)), + GST_BUFFER_DATA (GST_BUFFER (ximagesrc->last_ximage)), + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + have_frame = TRUE; + } + for (i = 0; i < nrects; i++) { + GST_LOG_OBJECT (ximagesrc, + "Damaged sub-region @ %d,%d size %dx%d reported", + rects[i].x, rects[i].y, rects[i].width, rects[i].height); + + /* if we only want a small area, clip this damage region to + * area we want */ + if (ximagesrc->endx > ximagesrc->startx && + ximagesrc->endy > ximagesrc->starty) { + /* see if damage area intersects */ + if (rects[i].x + rects[i].width - 1 < ximagesrc->startx || + rects[i].x > ximagesrc->endx) { + /* trivial reject */ + } else if (rects[i].y + rects[i].height - 1 < ximagesrc->starty || + rects[i].y > ximagesrc->endy) { + /* trivial reject */ + } else { + /* find intersect region */ + int startx, starty, width, height; + + startx = (rects[i].x < ximagesrc->startx) ? ximagesrc->startx : + rects[i].x; + starty = (rects[i].y < ximagesrc->starty) ? ximagesrc->starty : + rects[i].y; + width = (rects[i].x + rects[i].width - 1 < ximagesrc->endx) ? + rects[i].x + rects[i].width - startx : + ximagesrc->endx - startx + 1; + height = (rects[i].y + rects[i].height - 1 < ximagesrc->endy) ? + rects[i].y + rects[i].height - starty : ximagesrc->endy - + starty + 1; + + GST_LOG_OBJECT (ximagesrc, + "Retrieving damaged sub-region @ %d,%d size %dx%d as intersect region", + startx, starty, width, height); + XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, + startx, starty, width, height, AllPlanes, ZPixmap, + ximage->ximage, startx - ximagesrc->startx, + starty - ximagesrc->starty); + } + } else { + + GST_LOG_OBJECT (ximagesrc, + "Retrieving damaged sub-region @ %d,%d size %dx%d", + rects[i].x, rects[i].y, rects[i].width, rects[i].height); + + XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, + rects[i].x, rects[i].y, + rects[i].width, rects[i].height, + AllPlanes, ZPixmap, ximage->ximage, rects[i].x, rects[i].y); + } + } + free (rects); + } + } + } while (XPending (ximagesrc->xcontext->disp)); + if (!have_frame) { + GST_LOG_OBJECT (ximagesrc, + "Copying from last frame ximage->size: %d", + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + memcpy (GST_BUFFER_DATA (GST_BUFFER (ximage)), + GST_BUFFER_DATA (GST_BUFFER (ximagesrc->last_ximage)), + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + } +#ifdef HAVE_XFIXES + /* re-get area where last mouse pointer was but only if in our clipping + * bounds */ + if (ximagesrc->cursor_image) { + gint x, y, width, height; + + x = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot; + y = ximagesrc->cursor_image->y - ximagesrc->cursor_image->yhot; + width = ximagesrc->cursor_image->width; + height = ximagesrc->cursor_image->height; + + /* bounds checking */ + if (x < 0) + x = 0; + if (y < 0) + y = 0; + if (x + width > ximagesrc->xcontext->width) + width = ximagesrc->xcontext->width - x; + if (y + height > ximagesrc->xcontext->height) + height = ximagesrc->xcontext->height - y; + g_assert (x >= 0); + g_assert (y >= 0); + GST_DEBUG_OBJECT (ximagesrc, + "Cursor was at (%d,%d) width: %d, height: %d and our range is: (%d,%d) - (%d,%d)", + x, y, width, height, ximagesrc->startx, ximagesrc->starty, + ximagesrc->endx, ximagesrc->endy); + /* only get where cursor last was, if it is in our range */ + if (ximagesrc->endx > ximagesrc->startx && + ximagesrc->endy > ximagesrc->starty) { + /* check bounds */ + if (x + width < ximagesrc->startx || x > ximagesrc->endx) { + /* trivial reject */ + } else if (y + height < ximagesrc->starty || y > ximagesrc->endy) { + /* trivial reject */ + } else { + /* find intersect region */ + int startx, starty, iwidth, iheight; + + startx = (x < ximagesrc->startx) ? ximagesrc->startx : x; + starty = (y < ximagesrc->starty) ? ximagesrc->starty : y; + iwidth = (x + width < ximagesrc->endx) ? + x + width - startx : ximagesrc->endx - startx; + iheight = (y + height < ximagesrc->endy) ? + y + height - starty : ximagesrc->endy - starty; + GST_DEBUG_OBJECT (ximagesrc, "Removing cursor from %d,%d", x, y); + XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, + startx, starty, iwidth, iheight, AllPlanes, ZPixmap, + ximage->ximage, startx - ximagesrc->startx, + starty - ximagesrc->starty); + } + } else { + + GST_DEBUG_OBJECT (ximagesrc, "Removing cursor from %d,%d", x, y); + XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, + x, y, width, height, AllPlanes, ZPixmap, ximage->ximage, x, y); + } + } +#endif + + + } else { +#endif + +#ifdef HAVE_XSHM + if (ximagesrc->xcontext->use_xshm) { + GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XShm"); + XShmGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, + ximage->ximage, ximagesrc->startx, ximagesrc->starty, AllPlanes); + + } else +#endif /* HAVE_XSHM */ + { + GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XGetImage"); + if (ximagesrc->remote) { + XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, + ximagesrc->startx, ximagesrc->starty, ximagesrc->width, + ximagesrc->height, AllPlanes, ZPixmap, ximage->ximage, 0, 0); + } else { + ximage->ximage = + XGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, + ximagesrc->startx, ximagesrc->starty, ximagesrc->width, + ximagesrc->height, AllPlanes, ZPixmap); + } + } +#ifdef HAVE_XDAMAGE + } +#endif + +#ifdef HAVE_XFIXES + if (ximagesrc->show_pointer && ximagesrc->have_xfixes) { + + GST_DEBUG_OBJECT (ximagesrc, "Using XFixes to draw cursor"); + /* get cursor */ + if (ximagesrc->cursor_image) + XFree (ximagesrc->cursor_image); + ximagesrc->cursor_image = XFixesGetCursorImage (ximagesrc->xcontext->disp); + if (ximagesrc->cursor_image != NULL) { + int cx, cy, i, j, count; + int startx, starty, iwidth, iheight; + gboolean cursor_in_image = TRUE; + + cx = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot; + if (cx < 0) + cx = 0; + cy = ximagesrc->cursor_image->y - ximagesrc->cursor_image->yhot; + if (cy < 0) + cy = 0; + count = ximagesrc->cursor_image->width * ximagesrc->cursor_image->height; + + /* only get where cursor last was, if it is in our range */ + if (ximagesrc->endx > ximagesrc->startx && + ximagesrc->endy > ximagesrc->starty) { + /* check bounds */ + if (cx + ximagesrc->cursor_image->width < ximagesrc->startx || + cx > ximagesrc->endx) { + /* trivial reject */ + cursor_in_image = FALSE; + } else if (cy + ximagesrc->cursor_image->height < ximagesrc->starty || + cy > ximagesrc->endy) { + /* trivial reject */ + cursor_in_image = FALSE; + } else { + /* find intersect region */ + + startx = (cx < ximagesrc->startx) ? ximagesrc->startx : cx; + starty = (cy < ximagesrc->starty) ? ximagesrc->starty : cy; + iwidth = (cx + ximagesrc->cursor_image->width < ximagesrc->endx) ? + cx + ximagesrc->cursor_image->width - startx : + ximagesrc->endx - startx; + iheight = (cy + ximagesrc->cursor_image->height < ximagesrc->endy) ? + cy + ximagesrc->cursor_image->height - starty : + ximagesrc->endy - starty; + } + } else { + startx = cx; + starty = cy; + iwidth = ximagesrc->cursor_image->width; + iheight = ximagesrc->cursor_image->height; + } + + if (cursor_in_image) { + GST_DEBUG_OBJECT (ximagesrc, "Cursor is in image so trying to draw it"); + for (i = 0; i < count; i++) + ximagesrc->cursor_image->pixels[i] = + GUINT_TO_LE (ximagesrc->cursor_image->pixels[i]); + /* copy those pixels across */ + for (j = starty; + j < starty + iheight && j < ximagesrc->starty + ximagesrc->height; + j++) { + for (i = startx; + i < startx + iwidth && i < ximagesrc->startx + ximagesrc->width; + i++) { + guint8 *src, *dest; + + src = + (guint8 *) & (ximagesrc->cursor_image->pixels[((j - + cy) * ximagesrc->cursor_image->width + (i - cx))]); + dest = + (guint8 *) & (ximage->ximage->data[((j - + ximagesrc->starty) * ximagesrc->width + (i - + ximagesrc->startx)) * (ximagesrc->xcontext->bpp / + 8)]); + + composite_pixel (ximagesrc->xcontext, (guint8 *) dest, + (guint8 *) src); + } + } + } + } + } +#endif +#ifdef HAVE_XDAMAGE + if (ximagesrc->have_xdamage && ximagesrc->use_damage) { + /* need to ref ximage to put in last_ximage */ + gst_buffer_ref (GST_BUFFER (ximage)); + if (ximagesrc->last_ximage) { + gst_buffer_unref (GST_BUFFER (ximagesrc->last_ximage)); + } + ximagesrc->last_ximage = ximage; + GST_LOG_OBJECT (ximagesrc, "reffing current buffer for last_ximage"); + } +#endif + return ximage; +} + +static GstFlowReturn +gst_ximage_src_create (GstPushSrc * bs, GstBuffer ** buf) +{ + GstXImageSrc *s = GST_XIMAGE_SRC (bs); + GstXImageSrcBuffer *image; + GstClockTime base_time; + GstClockTime next_capture_ts; + GstClockTime dur; + gint64 next_frame_no; + + if (!gst_ximage_src_recalc (s)) { + GST_ELEMENT_ERROR (s, RESOURCE, FAILED, + (_("Changing resolution at runtime is not yet supported.")), (NULL)); + return GST_FLOW_ERROR; + } + + if (s->fps_n <= 0 || s->fps_d <= 0) + return GST_FLOW_NOT_NEGOTIATED; /* FPS must be > 0 */ + + /* Now, we might need to wait for the next multiple of the fps + * before capturing */ + + GST_OBJECT_LOCK (s); + if (GST_ELEMENT_CLOCK (s) == NULL) { + GST_OBJECT_UNLOCK (s); + GST_ELEMENT_ERROR (s, RESOURCE, FAILED, + (_("Cannot operate without a clock")), (NULL)); + return GST_FLOW_ERROR; + } + + base_time = GST_ELEMENT_CAST (s)->base_time; + next_capture_ts = gst_clock_get_time (GST_ELEMENT_CLOCK (s)); + next_capture_ts -= base_time; + + /* Figure out which 'frame number' position we're at, based on the cur time + * and frame rate */ + next_frame_no = gst_util_uint64_scale (next_capture_ts, + s->fps_n, GST_SECOND * s->fps_d); + if (next_frame_no == s->last_frame_no) { + GstClockID id; + GstClockReturn ret; + + /* Need to wait for the next frame */ + next_frame_no += 1; + + /* Figure out what the next frame time is */ + next_capture_ts = gst_util_uint64_scale (next_frame_no, + s->fps_d * GST_SECOND, s->fps_n); + + id = gst_clock_new_single_shot_id (GST_ELEMENT_CLOCK (s), + next_capture_ts + base_time); + s->clock_id = id; + + /* release the object lock while waiting */ + GST_OBJECT_UNLOCK (s); + + GST_DEBUG_OBJECT (s, "Waiting for next frame time %" G_GUINT64_FORMAT, + next_capture_ts); + ret = gst_clock_id_wait (id, NULL); + GST_OBJECT_LOCK (s); + + gst_clock_id_unref (id); + s->clock_id = NULL; + if (ret == GST_CLOCK_UNSCHEDULED) { + /* Got woken up by the unlock function */ + GST_OBJECT_UNLOCK (s); + return GST_FLOW_WRONG_STATE; + } + /* Duration is a complete 1/fps frame duration */ + dur = gst_util_uint64_scale_int (GST_SECOND, s->fps_d, s->fps_n); + } else { + GstClockTime next_frame_ts; + + GST_DEBUG_OBJECT (s, "No need to wait for next frame time %" + G_GUINT64_FORMAT " next frame = %" G_GINT64_FORMAT " prev = %" + G_GINT64_FORMAT, next_capture_ts, next_frame_no, s->last_frame_no); + next_frame_ts = gst_util_uint64_scale (next_frame_no + 1, + s->fps_d * GST_SECOND, s->fps_n); + /* Frame duration is from now until the next expected capture time */ + dur = next_frame_ts - next_capture_ts; + } + s->last_frame_no = next_frame_no; + GST_OBJECT_UNLOCK (s); + + image = gst_ximage_src_ximage_get (s); + if (!image) + return GST_FLOW_ERROR; + + *buf = GST_BUFFER (image); + GST_BUFFER_TIMESTAMP (*buf) = next_capture_ts; + GST_BUFFER_DURATION (*buf) = dur; + + return GST_FLOW_OK; +} + +static void +gst_ximage_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstXImageSrc *src = GST_XIMAGE_SRC (object); + + switch (prop_id) { + case PROP_DISPLAY_NAME: + + g_free (src->display_name); + src->display_name = g_strdup (g_value_get_string (value)); + break; + case PROP_SCREEN_NUM: + src->screen_num = g_value_get_uint (value); + break; + case PROP_SHOW_POINTER: + src->show_pointer = g_value_get_boolean (value); + break; + case PROP_USE_DAMAGE: + src->use_damage = g_value_get_boolean (value); + break; + case PROP_STARTX: + src->startx = g_value_get_uint (value); + break; + case PROP_STARTY: + src->starty = g_value_get_uint (value); + break; + case PROP_ENDX: + src->endx = g_value_get_uint (value); + break; + case PROP_ENDY: + src->endy = g_value_get_uint (value); + break; + case PROP_REMOTE: + src->remote = g_value_get_boolean (value); + break; + case PROP_XID: + if (src->xcontext != NULL) { + g_warning ("ximagesrc window ID must be set before opening display"); + break; + } + src->xid = g_value_get_uint64 (value); + break; + case PROP_XNAME: + if (src->xcontext != NULL) { + g_warning ("ximagesrc window name must be set before opening display"); + break; + } + g_free (src->xname); + src->xname = g_strdup (g_value_get_string (value)); + break; + default: + break; + } +} + +static void +gst_ximage_src_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstXImageSrc *src = GST_XIMAGE_SRC (object); + + switch (prop_id) { + case PROP_DISPLAY_NAME: + if (src->xcontext) + g_value_set_string (value, DisplayString (src->xcontext->disp)); + else + g_value_set_string (value, src->display_name); + + break; + case PROP_SCREEN_NUM: + g_value_set_uint (value, src->screen_num); + break; + case PROP_SHOW_POINTER: + g_value_set_boolean (value, src->show_pointer); + break; + case PROP_USE_DAMAGE: + g_value_set_boolean (value, src->use_damage); + break; + case PROP_STARTX: + g_value_set_uint (value, src->startx); + break; + case PROP_STARTY: + g_value_set_uint (value, src->starty); + break; + case PROP_ENDX: + g_value_set_uint (value, src->endx); + break; + case PROP_ENDY: + g_value_set_uint (value, src->endy); + break; + case PROP_REMOTE: + g_value_set_boolean (value, src->remote); + break; + case PROP_XID: + g_value_set_uint64 (value, src->xid); + break; + case PROP_XNAME: + g_value_set_string (value, src->xname); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_ximage_src_clear_bufpool (GstXImageSrc * ximagesrc) +{ + g_mutex_lock (ximagesrc->pool_lock); + while (ximagesrc->buffer_pool != NULL) { + GstXImageSrcBuffer *ximage = ximagesrc->buffer_pool->data; + + gst_ximage_buffer_free (ximage); + + ximagesrc->buffer_pool = g_slist_delete_link (ximagesrc->buffer_pool, + ximagesrc->buffer_pool); + } + g_mutex_unlock (ximagesrc->pool_lock); +} + +static void +gst_ximage_src_base_init (gpointer g_class) +{ + GstElementClass *ec = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (ec, "Ximage video source", + "Source/Video", + "Creates a screenshot video stream", + "Lutz Mueller , " + "Jan Schmidt , " + "Zaheer Merali "); + gst_element_class_add_static_pad_template (ec, &t); +} + +static void +gst_ximage_src_dispose (GObject * object) +{ + /* Drop references in the buffer_pool */ + gst_ximage_src_clear_bufpool (GST_XIMAGE_SRC (object)); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_ximage_src_finalize (GObject * object) +{ + GstXImageSrc *src = GST_XIMAGE_SRC (object); + + if (src->xcontext) + ximageutil_xcontext_clear (src->xcontext); + + g_free (src->xname); + g_mutex_free (src->pool_lock); + g_mutex_free (src->x_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstCaps * +gst_ximage_src_get_caps (GstBaseSrc * bs) +{ + GstXImageSrc *s = GST_XIMAGE_SRC (bs); + GstXContext *xcontext; + gint width, height; + + if ((!s->xcontext) && (!gst_ximage_src_open_display (s, s->display_name))) + return + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC + (s)->srcpad)); + + if (!gst_ximage_src_recalc (s)) + return + gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC + (s)->srcpad)); + + xcontext = s->xcontext; + width = s->xcontext->width; + height = s->xcontext->height; + if (s->xwindow != 0) { + XWindowAttributes attrs; + int status = XGetWindowAttributes (s->xcontext->disp, s->xwindow, &attrs); + if (status) { + width = attrs.width; + height = attrs.height; + } + } + + /* property comments say 0 means right/bottom, means we can't capture + the top left pixel alone */ + if (s->endx == 0) + s->endx = width - 1; + if (s->endy == 0) + s->endy = height - 1; + + if (s->endx >= s->startx && s->endy >= s->starty) { + /* this means user has put in values */ + if (s->startx < xcontext->width && s->endx < xcontext->width && + s->starty < xcontext->height && s->endy < xcontext->height && + s->startx >= 0 && s->starty >= 0) { + /* values are fine */ + s->width = width = s->endx - s->startx + 1; + s->height = height = s->endy - s->starty + 1; + } else { + GST_WARNING + ("User put in co-ordinates overshooting the X resolution, setting to full screen"); + s->startx = 0; + s->starty = 0; + s->endx = width - 1; + s->endy = height - 1; + } + } else { + GST_WARNING ("User put in bogus co-ordinates, setting to full screen"); + s->startx = 0; + s->starty = 0; + s->endx = width - 1; + s->endy = height - 1; + } + GST_DEBUG ("width = %d, height=%d", width, height); + return gst_caps_new_simple ("video/x-raw-rgb", + "bpp", G_TYPE_INT, xcontext->bpp, + "depth", G_TYPE_INT, xcontext->depth, + "endianness", G_TYPE_INT, xcontext->endianness, + "red_mask", G_TYPE_INT, xcontext->r_mask_output, + "green_mask", G_TYPE_INT, xcontext->g_mask_output, + "blue_mask", G_TYPE_INT, xcontext->b_mask_output, + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + "framerate", GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, + "pixel-aspect-ratio", GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, + NULL); +} + +static gboolean +gst_ximage_src_set_caps (GstBaseSrc * bs, GstCaps * caps) +{ + GstXImageSrc *s = GST_XIMAGE_SRC (bs); + GstStructure *structure; + const GValue *new_fps; + + /* If not yet opened, disallow setcaps until later */ + if (!s->xcontext) + return FALSE; + + /* The only thing that can change is the framerate downstream wants */ + structure = gst_caps_get_structure (caps, 0); + new_fps = gst_structure_get_value (structure, "framerate"); + if (!new_fps) + return FALSE; + + /* Store this FPS for use when generating buffers */ + s->fps_n = gst_value_get_fraction_numerator (new_fps); + s->fps_d = gst_value_get_fraction_denominator (new_fps); + + GST_DEBUG_OBJECT (s, "peer wants %d/%d fps", s->fps_n, s->fps_d); + + return TRUE; +} + +static void +gst_ximage_src_fixate (GstPad * pad, GstCaps * caps) +{ + gint i; + GstStructure *structure; + + for (i = 0; i < gst_caps_get_size (caps); ++i) { + structure = gst_caps_get_structure (caps, i); + + gst_structure_fixate_field_nearest_fraction (structure, "framerate", 25, 1); + } +} + +static void +gst_ximage_src_class_init (GstXImageSrcClass * klass) +{ + GObjectClass *gc = G_OBJECT_CLASS (klass); + GstBaseSrcClass *bc = GST_BASE_SRC_CLASS (klass); + GstPushSrcClass *push_class = GST_PUSH_SRC_CLASS (klass); + + gc->set_property = gst_ximage_src_set_property; + gc->get_property = gst_ximage_src_get_property; + gc->dispose = gst_ximage_src_dispose; + gc->finalize = gst_ximage_src_finalize; + + g_object_class_install_property (gc, PROP_DISPLAY_NAME, + g_param_spec_string ("display-name", "Display", "X Display Name", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gc, PROP_SCREEN_NUM, + g_param_spec_uint ("screen-num", "Screen number", "X Screen Number", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gc, PROP_SHOW_POINTER, + g_param_spec_boolean ("show-pointer", "Show Mouse Pointer", + "Show mouse pointer (if XFixes extension enabled)", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstXImageSrc:use-damage + * + * Use XDamage (if the XDamage extension is enabled) + * + * Since: 0.10.4 + **/ + g_object_class_install_property (gc, PROP_USE_DAMAGE, + g_param_spec_boolean ("use-damage", "Use XDamage", + "Use XDamage (if XDamage extension enabled)", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstXImageSrc:startx + * + * X coordinate of top left corner of area to be recorded + * (0 for top left of screen) + * + * Since: 0.10.4 + **/ + g_object_class_install_property (gc, PROP_STARTX, + g_param_spec_uint ("startx", "Start X co-ordinate", + "X coordinate of top left corner of area to be recorded (0 for top left of screen)", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstXImageSrc:starty + * + * Y coordinate of top left corner of area to be recorded + * (0 for top left of screen) + * + * Since: 0.10.4 + **/ + g_object_class_install_property (gc, PROP_STARTY, + g_param_spec_uint ("starty", "Start Y co-ordinate", + "Y coordinate of top left corner of area to be recorded (0 for top left of screen)", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); + /** + * GstXImageSrc:endx + * + * X coordinate of bottom right corner of area to be recorded + * (0 for bottom right of screen) + * + * Since: 0.10.4 + **/ + g_object_class_install_property (gc, PROP_ENDX, + g_param_spec_uint ("endx", "End X", + "X coordinate of bottom right corner of area to be recorded (0 for bottom right of screen)", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); + /** + * GstXImageSrc:endy + * + * Y coordinate of bottom right corner of area to be recorded + * (0 for bottom right of screen) + * + * Since: 0.10.4 + **/ + g_object_class_install_property (gc, PROP_ENDY, + g_param_spec_uint ("endy", "End Y", + "Y coordinate of bottom right corner of area to be recorded (0 for bottom right of screen)", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); + + /** + * GstXImageSrc:remote + * + * Whether the X display is remote. The element will try to use alternate calls + * known to work better with remote displays. + * + * Since: 0.10.26 + **/ + g_object_class_install_property (gc, PROP_REMOTE, + g_param_spec_boolean ("remote", "Remote dispay", + "Whether the display is remote", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstXImageSrc:xid + * + * The XID of the window to capture. 0 for the root window (default). + * + * Since: 0.10.31 + **/ + g_object_class_install_property (gc, PROP_XID, + g_param_spec_uint64 ("xid", "Window XID", + "Window XID to capture from", 0, G_MAXUINT64, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstXImageSrc:xname + * + * The name of the window to capture, if any. + * + * Since: 0.10.31 + **/ + g_object_class_install_property (gc, PROP_XNAME, + g_param_spec_string ("xname", "Window name", + "Window name to capture from", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + parent_class = g_type_class_peek_parent (klass); + + push_class->create = gst_ximage_src_create; + bc->get_caps = gst_ximage_src_get_caps; + bc->set_caps = gst_ximage_src_set_caps; + bc->start = gst_ximage_src_start; + bc->stop = gst_ximage_src_stop; + bc->unlock = gst_ximage_src_unlock; +} + +static void +gst_ximage_src_init (GstXImageSrc * ximagesrc, GstXImageSrcClass * klass) +{ + gst_base_src_set_format (GST_BASE_SRC (ximagesrc), GST_FORMAT_TIME); + gst_base_src_set_live (GST_BASE_SRC (ximagesrc), TRUE); + gst_pad_set_fixatecaps_function (GST_BASE_SRC_PAD (ximagesrc), + gst_ximage_src_fixate); + + ximagesrc->pool_lock = g_mutex_new (); + ximagesrc->x_lock = g_mutex_new (); + ximagesrc->show_pointer = TRUE; + ximagesrc->use_damage = TRUE; + ximagesrc->startx = 0; + ximagesrc->starty = 0; + ximagesrc->endx = 0; + ximagesrc->endy = 0; + ximagesrc->remote = FALSE; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret; + + GST_DEBUG_CATEGORY_INIT (gst_debug_ximage_src, "ximagesrc", 0, + "ximagesrc element debug"); + + ret = gst_element_register (plugin, "ximagesrc", GST_RANK_NONE, + GST_TYPE_XIMAGE_SRC); + + return ret; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "ximagesrc", + "X11 video input plugin using standard Xlib calls", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); diff --git a/sys/ximage/gstximagesrc.h b/sys/ximage/gstximagesrc.h new file mode 100644 index 0000000..e58513c --- /dev/null +++ b/sys/ximage/gstximagesrc.h @@ -0,0 +1,113 @@ +/* screenshotsrc: Screenshot plugin for GStreamer + * + * 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_XIMAGE_SRC_H__ +#define __GST_XIMAGE_SRC_H__ + +#include +#include +#include "ximageutil.h" + +#ifdef HAVE_XFIXES +#include +#endif +#ifdef HAVE_XDAMAGE +#include +#endif + +G_BEGIN_DECLS + +#define GST_TYPE_XIMAGE_SRC (gst_ximage_src_get_type()) +#define GST_XIMAGE_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_XIMAGE_SRC,GstXImageSrc)) +#define GST_XIMAGE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_XIMAGE_SRC,GstXImageSrc)) +#define GST_IS_XIMAGE_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_XIMAGE_SRC)) +#define GST_IS_XIMAGE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_XIMAGE_SRC)) + +typedef struct _GstXImageSrc GstXImageSrc; +typedef struct _GstXImageSrcClass GstXImageSrcClass; + +GType gst_ximage_src_get_type (void) G_GNUC_CONST; + +struct _GstXImageSrc +{ + GstPushSrc parent; + + /* Information on display */ + GstXContext *xcontext; + gint width; + gint height; + + Window xwindow; + gchar *display_name; + guint screen_num; + + /* Window selection */ + guint64 xid; + gchar *xname; + + /* Desired output framerate */ + gint fps_n; + gint fps_d; + + /* for framerate sync */ + GstClockID clock_id; + gint64 last_frame_no; + + /* Protect X Windows calls */ + GMutex *x_lock; + + /* Gathered pool of emitted buffers */ + GMutex *pool_lock; + GSList *buffer_pool; + + /* XFixes and XDamage support */ + gboolean have_xfixes; + gboolean have_xdamage; + gboolean show_pointer; + gboolean use_damage; + + /* co-ordinates for start and end */ + guint startx; + guint starty; + guint endx; + guint endy; + + /* whether to use remote friendly calls */ + gboolean remote; + +#ifdef HAVE_XFIXES + int fixes_event_base; + XFixesCursorImage *cursor_image; +#endif +#ifdef HAVE_XDAMAGE + Damage damage; + int damage_event_base; + XserverRegion damage_region; + GC damage_copy_gc; + GstXImageSrcBuffer *last_ximage; +#endif +}; + +struct _GstXImageSrcClass +{ + GstPushSrcClass parent_class; +}; + +G_END_DECLS + +#endif /* __GST_XIMAGE_SRC_H__ */ diff --git a/sys/ximage/ximageutil.c b/sys/ximage/ximageutil.c new file mode 100644 index 0000000..2fac09a --- /dev/null +++ b/sys/ximage/ximageutil.c @@ -0,0 +1,501 @@ +/* GStreamer + * Copyright (C) <2005> Luca Ognibene + * + * 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 "ximageutil.h" + +#ifdef HAVE_XSHM +static gboolean error_caught = FALSE; + +static int +ximageutil_handle_xerror (Display * display, XErrorEvent * xevent) +{ + char error_msg[1024]; + + XGetErrorText (display, xevent->error_code, error_msg, 1024); + GST_DEBUG ("ximageutil failed to use XShm calls. error: %s", error_msg); + error_caught = TRUE; + return 0; +} + +/* This function checks that it is actually really possible to create an image + using XShm */ +gboolean +ximageutil_check_xshm_calls (GstXContext * xcontext) +{ + XImage *ximage; + XShmSegmentInfo SHMInfo; + size_t size; + int (*handler) (Display *, XErrorEvent *); + gboolean result = FALSE; + gboolean did_attach = FALSE; + + g_return_val_if_fail (xcontext != NULL, FALSE); + + /* Sync to ensure any older errors are already processed */ + XSync (xcontext->disp, FALSE); + + /* Set defaults so we don't free these later unnecessarily */ + SHMInfo.shmaddr = ((void *) -1); + SHMInfo.shmid = -1; + + /* Setting an error handler to catch failure */ + error_caught = FALSE; + handler = XSetErrorHandler (ximageutil_handle_xerror); + + /* Trying to create a 1x1 ximage */ + GST_DEBUG ("XShmCreateImage of 1x1"); + + ximage = XShmCreateImage (xcontext->disp, xcontext->visual, + xcontext->depth, ZPixmap, NULL, &SHMInfo, 1, 1); + + /* Might cause an error, sync to ensure it is noticed */ + XSync (xcontext->disp, FALSE); + if (!ximage || error_caught) { + GST_WARNING ("could not XShmCreateImage a 1x1 image"); + goto beach; + } + size = ximage->height * ximage->bytes_per_line; + + SHMInfo.shmid = shmget (IPC_PRIVATE, size, IPC_CREAT | 0777); + if (SHMInfo.shmid == -1) { + GST_WARNING ("could not get shared memory of %" G_GSIZE_FORMAT " bytes", + size); + goto beach; + } + + SHMInfo.shmaddr = shmat (SHMInfo.shmid, 0, 0); + if (SHMInfo.shmaddr == ((void *) -1)) { + GST_WARNING ("Failed to shmat: %s", g_strerror (errno)); + goto beach; + } + + /* Delete the SHM segment. It will actually go away automatically + * when we detach now */ + shmctl (SHMInfo.shmid, IPC_RMID, 0); + + ximage->data = SHMInfo.shmaddr; + SHMInfo.readOnly = FALSE; + + if (XShmAttach (xcontext->disp, &SHMInfo) == 0) { + GST_WARNING ("Failed to XShmAttach"); + goto beach; + } + + /* Sync to ensure we see any errors we caused */ + XSync (xcontext->disp, FALSE); + + if (!error_caught) { + did_attach = TRUE; + /* store whether we succeeded in result */ + result = TRUE; + } +beach: + /* Sync to ensure we swallow any errors we caused and reset error_caught */ + XSync (xcontext->disp, FALSE); + error_caught = FALSE; + XSetErrorHandler (handler); + + if (did_attach) { + XShmDetach (xcontext->disp, &SHMInfo); + XSync (xcontext->disp, FALSE); + } + if (SHMInfo.shmaddr != ((void *) -1)) + shmdt (SHMInfo.shmaddr); + if (ximage) + XDestroyImage (ximage); + return result; +} +#endif /* HAVE_XSHM */ + +/* This function gets the X Display and global info about it. Everything is + stored in our object and will be cleaned when the object is disposed. Note + here that caps for supported format are generated without any window or + image creation */ +GstXContext * +ximageutil_xcontext_get (GstElement * parent, const gchar * display_name) +{ + GstXContext *xcontext = NULL; + XPixmapFormatValues *px_formats = NULL; + gint nb_formats = 0, i; + + xcontext = g_new0 (GstXContext, 1); + + xcontext->disp = XOpenDisplay (display_name); + GST_DEBUG_OBJECT (parent, "opened display %p", xcontext->disp); + if (!xcontext->disp) { + g_free (xcontext); + return NULL; + } + xcontext->screen = DefaultScreenOfDisplay (xcontext->disp); + xcontext->screen_num = DefaultScreen (xcontext->disp); + xcontext->visual = DefaultVisual (xcontext->disp, xcontext->screen_num); + xcontext->root = DefaultRootWindow (xcontext->disp); + xcontext->white = XWhitePixel (xcontext->disp, xcontext->screen_num); + xcontext->black = XBlackPixel (xcontext->disp, xcontext->screen_num); + xcontext->depth = DefaultDepthOfScreen (xcontext->screen); + + xcontext->width = DisplayWidth (xcontext->disp, xcontext->screen_num); + xcontext->height = DisplayHeight (xcontext->disp, xcontext->screen_num); + + xcontext->widthmm = DisplayWidthMM (xcontext->disp, xcontext->screen_num); + xcontext->heightmm = DisplayHeightMM (xcontext->disp, xcontext->screen_num); + + xcontext->caps = NULL; + + GST_DEBUG_OBJECT (parent, "X reports %dx%d pixels and %d mm x %d mm", + xcontext->width, xcontext->height, xcontext->widthmm, xcontext->heightmm); + ximageutil_calculate_pixel_aspect_ratio (xcontext); + + /* We get supported pixmap formats at supported depth */ + px_formats = XListPixmapFormats (xcontext->disp, &nb_formats); + + if (!px_formats) { + XCloseDisplay (xcontext->disp); + g_free (xcontext); + return NULL; + } + + /* We get bpp value corresponding to our running depth */ + for (i = 0; i < nb_formats; i++) { + if (px_formats[i].depth == xcontext->depth) + xcontext->bpp = px_formats[i].bits_per_pixel; + } + + XFree (px_formats); + + xcontext->endianness = + (ImageByteOrder (xcontext->disp) == + LSBFirst) ? G_LITTLE_ENDIAN : G_BIG_ENDIAN; + +#ifdef HAVE_XSHM + /* Search for XShm extension support */ + if (XShmQueryExtension (xcontext->disp) && + ximageutil_check_xshm_calls (xcontext)) { + xcontext->use_xshm = TRUE; + GST_DEBUG ("ximageutil is using XShm extension"); + } else { + xcontext->use_xshm = FALSE; + GST_DEBUG ("ximageutil is not using XShm extension"); + } +#endif /* HAVE_XSHM */ + + /* our caps system handles 24/32bpp RGB as big-endian. */ + if ((xcontext->bpp == 24 || xcontext->bpp == 32) && + xcontext->endianness == G_LITTLE_ENDIAN) { + xcontext->endianness = G_BIG_ENDIAN; + xcontext->r_mask_output = GUINT32_TO_BE (xcontext->visual->red_mask); + xcontext->g_mask_output = GUINT32_TO_BE (xcontext->visual->green_mask); + xcontext->b_mask_output = GUINT32_TO_BE (xcontext->visual->blue_mask); + if (xcontext->bpp == 24) { + xcontext->r_mask_output >>= 8; + xcontext->g_mask_output >>= 8; + xcontext->b_mask_output >>= 8; + } + } else { + xcontext->r_mask_output = xcontext->visual->red_mask; + xcontext->g_mask_output = xcontext->visual->green_mask; + xcontext->b_mask_output = xcontext->visual->blue_mask; + } + + return xcontext; +} + +/* This function cleans the X context. Closing the Display and unrefing the + caps for supported formats. */ +void +ximageutil_xcontext_clear (GstXContext * xcontext) +{ + g_return_if_fail (xcontext != NULL); + + if (xcontext->caps != NULL) + gst_caps_unref (xcontext->caps); + + if (xcontext->par) { + g_value_unset (xcontext->par); + g_free (xcontext->par); + } + + XCloseDisplay (xcontext->disp); + + g_free (xcontext); +} + +/* This function calculates the pixel aspect ratio based on the properties + * in the xcontext structure and stores it there. */ +void +ximageutil_calculate_pixel_aspect_ratio (GstXContext * xcontext) +{ + gint par[][2] = { + {1, 1}, /* regular screen */ + {16, 15}, /* PAL TV */ + {11, 10}, /* 525 line Rec.601 video */ + {54, 59} /* 625 line Rec.601 video */ + }; + gint i; + gint index; + gdouble ratio; + gdouble delta; + +#define DELTA(idx) (ABS (ratio - ((gdouble) par[idx][0] / par[idx][1]))) + + /* first calculate the "real" ratio based on the X values; + * which is the "physical" w/h divided by the w/h in pixels of the display */ + ratio = (gdouble) (xcontext->widthmm * xcontext->height) + / (xcontext->heightmm * xcontext->width); + + /* DirectFB's X in 720x576 reports the physical dimensions wrong, so + * override here */ + if (xcontext->width == 720 && xcontext->height == 576) { + ratio = 4.0 * 576 / (3.0 * 720); + } + GST_DEBUG ("calculated pixel aspect ratio: %f", ratio); + + /* now find the one from par[][2] with the lowest delta to the real one */ + delta = DELTA (0); + index = 0; + + for (i = 1; i < sizeof (par) / (sizeof (gint) * 2); ++i) { + gdouble this_delta = DELTA (i); + + if (this_delta < delta) { + index = i; + delta = this_delta; + } + } + + GST_DEBUG ("Decided on index %d (%d/%d)", index, + par[index][0], par[index][1]); + + if (xcontext->par) + g_free (xcontext->par); + xcontext->par = g_new0 (GValue, 1); + g_value_init (xcontext->par, GST_TYPE_FRACTION); + gst_value_set_fraction (xcontext->par, par[index][0], par[index][1]); + GST_DEBUG ("set xcontext PAR to %d/%d\n", + gst_value_get_fraction_numerator (xcontext->par), + gst_value_get_fraction_denominator (xcontext->par)); +} + +static GstBufferClass *ximagesrc_buffer_parent_class = NULL; + +static void +gst_ximagesrc_buffer_finalize (GstXImageSrcBuffer * ximage) +{ + GstElement *parent; + + g_return_if_fail (ximage != NULL); + + parent = ximage->parent; + if (parent == NULL) { + g_warning ("XImageSrcBuffer->ximagesrc == NULL"); + goto beach; + } + + if (ximage->return_func) + ximage->return_func (parent, ximage); + +beach: + + GST_MINI_OBJECT_CLASS (ximagesrc_buffer_parent_class)->finalize + (GST_MINI_OBJECT (ximage)); + + return; +} + +void +gst_ximage_buffer_free (GstXImageSrcBuffer * ximage) +{ + /* make sure it is not recycled */ + ximage->width = -1; + ximage->height = -1; + gst_buffer_unref (GST_BUFFER (ximage)); +} + +static void +gst_ximagesrc_buffer_init (GstXImageSrcBuffer * ximage_buffer, gpointer g_class) +{ +#ifdef HAVE_XSHM + ximage_buffer->SHMInfo.shmaddr = ((void *) -1); + ximage_buffer->SHMInfo.shmid = -1; +#endif +} + +static void +gst_ximagesrc_buffer_class_init (gpointer g_class, gpointer class_data) +{ + GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); + + ximagesrc_buffer_parent_class = g_type_class_peek_parent (g_class); + + mini_object_class->finalize = (GstMiniObjectFinalizeFunction) + gst_ximagesrc_buffer_finalize; +} + +static GType +gst_ximagesrc_buffer_get_type (void) +{ + static GType _gst_ximagesrc_buffer_type; + + if (G_UNLIKELY (_gst_ximagesrc_buffer_type == 0)) { + static const GTypeInfo ximagesrc_buffer_info = { + sizeof (GstBufferClass), + NULL, + NULL, + gst_ximagesrc_buffer_class_init, + NULL, + NULL, + sizeof (GstXImageSrcBuffer), + 0, + (GInstanceInitFunc) gst_ximagesrc_buffer_init, + NULL + }; + _gst_ximagesrc_buffer_type = g_type_register_static (GST_TYPE_BUFFER, + "GstXImageSrcBuffer", &ximagesrc_buffer_info, 0); + } + return _gst_ximagesrc_buffer_type; +} + +/* This function handles GstXImageSrcBuffer creation depending on XShm availability */ +GstXImageSrcBuffer * +gst_ximageutil_ximage_new (GstXContext * xcontext, + GstElement * parent, int width, int height, BufferReturnFunc return_func) +{ + GstXImageSrcBuffer *ximage = NULL; + gboolean succeeded = FALSE; + + ximage = + (GstXImageSrcBuffer *) gst_mini_object_new (GST_TYPE_XIMAGESRC_BUFFER); + + ximage->width = width; + ximage->height = height; + +#ifdef HAVE_XSHM + if (xcontext->use_xshm) { + ximage->ximage = XShmCreateImage (xcontext->disp, + xcontext->visual, xcontext->depth, + ZPixmap, NULL, &ximage->SHMInfo, ximage->width, ximage->height); + if (!ximage->ximage) { + GST_WARNING_OBJECT (parent, + "could not XShmCreateImage a %dx%d image", + ximage->width, ximage->height); + + /* Retry without XShm */ + xcontext->use_xshm = FALSE; + goto no_xshm; + } + + /* we have to use the returned bytes_per_line for our shm size */ + ximage->size = ximage->ximage->bytes_per_line * ximage->ximage->height; + ximage->SHMInfo.shmid = shmget (IPC_PRIVATE, ximage->size, + IPC_CREAT | 0777); + if (ximage->SHMInfo.shmid == -1) + goto beach; + + ximage->SHMInfo.shmaddr = shmat (ximage->SHMInfo.shmid, 0, 0); + if (ximage->SHMInfo.shmaddr == ((void *) -1)) + goto beach; + + /* Delete the SHM segment. It will actually go away automatically + * when we detach now */ + shmctl (ximage->SHMInfo.shmid, IPC_RMID, 0); + + ximage->ximage->data = ximage->SHMInfo.shmaddr; + ximage->SHMInfo.readOnly = FALSE; + + if (XShmAttach (xcontext->disp, &ximage->SHMInfo) == 0) + goto beach; + + XSync (xcontext->disp, FALSE); + } else + no_xshm: +#endif /* HAVE_XSHM */ + { + ximage->ximage = XCreateImage (xcontext->disp, + xcontext->visual, + xcontext->depth, + ZPixmap, 0, NULL, ximage->width, ximage->height, xcontext->bpp, 0); + if (!ximage->ximage) + goto beach; + + /* we have to use the returned bytes_per_line for our image size */ + ximage->size = ximage->ximage->bytes_per_line * ximage->ximage->height; + ximage->ximage->data = g_malloc (ximage->size); + + XSync (xcontext->disp, FALSE); + } + succeeded = TRUE; + + GST_BUFFER_DATA (ximage) = (guchar *) ximage->ximage->data; + GST_BUFFER_SIZE (ximage) = ximage->size; + + /* Keep a ref to our src */ + ximage->parent = gst_object_ref (parent); + ximage->return_func = return_func; +beach: + if (!succeeded) { + gst_ximage_buffer_free (ximage); + ximage = NULL; + } + + return ximage; +} + +/* This function destroys a GstXImageBuffer handling XShm availability */ +void +gst_ximageutil_ximage_destroy (GstXContext * xcontext, + GstXImageSrcBuffer * ximage) +{ + /* We might have some buffers destroyed after changing state to NULL */ + if (!xcontext) + goto beach; + + g_return_if_fail (ximage != NULL); + +#ifdef HAVE_XSHM + if (xcontext->use_xshm) { + if (ximage->SHMInfo.shmaddr != ((void *) -1)) { + XShmDetach (xcontext->disp, &ximage->SHMInfo); + XSync (xcontext->disp, 0); + shmdt (ximage->SHMInfo.shmaddr); + } + if (ximage->ximage) + XDestroyImage (ximage->ximage); + + } else +#endif /* HAVE_XSHM */ + { + if (ximage->ximage) { + XDestroyImage (ximage->ximage); + } + } + + XSync (xcontext->disp, FALSE); +beach: + if (ximage->parent) { + /* Release the ref to our parent */ + gst_object_unref (ximage->parent); + ximage->parent = NULL; + } + + return; +} diff --git a/sys/ximage/ximageutil.h b/sys/ximage/ximageutil.h new file mode 100644 index 0000000..517fc8e --- /dev/null +++ b/sys/ximage/ximageutil.h @@ -0,0 +1,182 @@ +/* GStreamer + * Copyright (C) <2005> Luca Ognibene + * + * 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_XIMAGEUTIL_H__ +#define __GST_XIMAGEUTIL_H__ + +#include + +#ifdef HAVE_XSHM +#include +#include +#include +#endif /* HAVE_XSHM */ + +#include +#include + +#ifdef HAVE_XSHM +#include +#endif /* HAVE_XSHM */ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GstXContext GstXContext; +typedef struct _GstXWindow GstXWindow; +typedef struct _GstXImage GstXImage; +typedef struct _GstXImageSrcBuffer GstXImageSrcBuffer; + +/* Global X Context stuff */ +/** + * GstXContext: + * @disp: the X11 Display of this context + * @screen: the default Screen of Display @disp + * @screen_num: the Screen number of @screen + * @visual: the default Visual of Screen @screen + * @root: the root Window of Display @disp + * @white: the value of a white pixel on Screen @screen + * @black: the value of a black pixel on Screen @screen + * @depth: the color depth of Display @disp + * @bpp: the number of bits per pixel on Display @disp + * @endianness: the endianness of image bytes on Display @disp + * @width: the width in pixels of Display @disp + * @height: the height in pixels of Display @disp + * @widthmm: the width in millimeters of Display @disp + * @heightmm: the height in millimeters of Display @disp + * @par: the pixel aspect ratio calculated from @width, @widthmm and @height, + * @heightmm ratio + * @use_xshm: used to known wether of not XShm extension is usable or not even + * if the Extension is present + * @caps: the #GstCaps that Display @disp can accept + * + * Structure used to store various informations collected/calculated for a + * Display. + */ +struct _GstXContext { + Display *disp; + + Screen *screen; + gint screen_num; + + Visual *visual; + + Window root; + + gulong white, black; + + gint depth; + gint bpp; + gint endianness; + + gint width, height; + gint widthmm, heightmm; + + /* these are the output masks + * for buffers from ximagesrc + * and are in big endian */ + guint32 r_mask_output, g_mask_output, b_mask_output; + + GValue *par; /* calculated pixel aspect ratio */ + + gboolean use_xshm; + + GstCaps *caps; +}; + +/** + * GstXWindow: + * @win: the Window ID of this X11 window + * @width: the width in pixels of Window @win + * @height: the height in pixels of Window @win + * @internal: used to remember if Window @win was created internally or passed + * through the #GstXOverlay interface + * @gc: the Graphical Context of Window @win + * + * Structure used to store informations about a Window. + */ +struct _GstXWindow { + Window win; + gint width, height; + gboolean internal; + GC gc; +}; + +gboolean ximageutil_check_xshm_calls (GstXContext * xcontext); + +GstXContext *ximageutil_xcontext_get (GstElement *parent, + const gchar *display_name); +void ximageutil_xcontext_clear (GstXContext *xcontext); +void ximageutil_calculate_pixel_aspect_ratio (GstXContext * xcontext); + +/* custom ximagesrc buffer, copied from ximagesink */ + +/* BufferReturnFunc is called when a buffer is finalised */ +typedef void (*BufferReturnFunc) (GstElement *parent, GstXImageSrcBuffer *buf); + +/** + * GstXImageSrcBuffer: + * @parent: a reference to the element we belong to + * @ximage: the XImage of this buffer + * @width: the width in pixels of XImage @ximage + * @height: the height in pixels of XImage @ximage + * @size: the size in bytes of XImage @ximage + * + * Subclass of #GstBuffer containing additional information about an XImage. + */ +struct _GstXImageSrcBuffer { + GstBuffer buffer; + + /* Reference to the ximagesrc we belong to */ + GstElement *parent; + + XImage *ximage; + +#ifdef HAVE_XSHM + XShmSegmentInfo SHMInfo; +#endif /* HAVE_XSHM */ + + gint width, height; + size_t size; + + BufferReturnFunc return_func; +}; + + +GstXImageSrcBuffer *gst_ximageutil_ximage_new (GstXContext *xcontext, + GstElement *parent, int width, int height, BufferReturnFunc return_func); + +void gst_ximageutil_ximage_destroy (GstXContext *xcontext, + GstXImageSrcBuffer * ximage); + +/* Call to manually release a buffer */ +void gst_ximage_buffer_free (GstXImageSrcBuffer *ximage); + +#define GST_TYPE_XIMAGESRC_BUFFER (gst_ximagesrc_buffer_get_type()) +#define GST_IS_XIMAGESRC_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_XIMAGESRC_BUFFER)) +#define GST_IS_XIMAGESRC_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_XIMAGESRC_BUFFER)) +#define GST_XIMAGESRC_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_XIMAGESRC_BUFFER, GstXImageSrcBuffer)) +#define GST_XIMAGESRC_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_XIMAGESRC_BUFFER, GstXImageSrcBufferClass)) +#define GST_XIMAGESRC_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_XIMAGESRC_BUFFER, GstXImageSrcBufferClass)) + +G_END_DECLS + +#endif /* __GST_XIMAGEUTIL_H__ */ diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..5f10e8f --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,22 @@ +if HAVE_GST_CHECK +SUBDIRS_CHECK = check files +else +SUBDIRS_CHECK = +endif + +if USE_X +SUBDIRS_ICLES = icles +else +SUBDIRS_ICLES = +endif + +if BUILD_EXAMPLES +SUBDIR_EXAMPLES = examples +else +SUBDIR_EXAMPLES = +endif + +SUBDIRS = $(SUBDIRS_CHECK) $(SUBDIRS_ICLES) $(SUBDIR_EXAMPLES) + +DIST_SUBDIRS = check icles examples files + diff --git a/tests/Makefile.in b/tests/Makefile.in new file mode 100644 index 0000000..f25bc7c --- /dev/null +++ b/tests/Makefile.in @@ -0,0 +1,813 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = tests +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@HAVE_GST_CHECK_FALSE@SUBDIRS_CHECK = +@HAVE_GST_CHECK_TRUE@SUBDIRS_CHECK = check files +@USE_X_FALSE@SUBDIRS_ICLES = +@USE_X_TRUE@SUBDIRS_ICLES = icles +@BUILD_EXAMPLES_FALSE@SUBDIR_EXAMPLES = +@BUILD_EXAMPLES_TRUE@SUBDIR_EXAMPLES = examples +SUBDIRS = $(SUBDIRS_CHECK) $(SUBDIRS_ICLES) $(SUBDIR_EXAMPLES) +DIST_SUBDIRS = check icles examples files +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am new file mode 100644 index 0000000..27dde40 --- /dev/null +++ b/tests/check/Makefile.am @@ -0,0 +1,309 @@ +include $(top_srcdir)/common/check.mak + +CHECK_REGISTRY = $(top_builddir)/tests/check/test-registry.reg +TEST_FILES_DIRECTORY = $(top_srcdir)/tests/files + +REGISTRY_ENVIRONMENT = \ + GST_REGISTRY=$(CHECK_REGISTRY) + +TESTS_ENVIRONMENT = \ + $(REGISTRY_ENVIRONMENT) \ + GST_PLUGIN_SYSTEM_PATH= \ + GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/ext:$(top_builddir)/sys:$(GSTPB_PLUGINS_DIR):$(GST_PLUGINS_DIR) \ + GST_PLUGIN_LOADING_WHITELIST="gstreamer@$(GST_PLUGINS_DIR):gst-plugins-base@$(GSTPB_PLUGINS_DIR):gst-plugins-good@$(top_builddir)" \ + GST_STATE_IGNORE_ELEMENTS="aasink autoaudiosrc autoaudiosink autovideosrc autovideosink \ + cacasink cairotextoverlay gconfaudiosrc gconfvideosrc gconfaudiosink gconfvideosink \ + halaudiosrc halaudiosink jackaudiosrc jackaudiosink \ + osssrc osssink osxaudiosink osxaudiosrc osxvideosrc osxvideosink \ + pulsesink pulsesrc pulsemixer v4l2src" + +# fake device drivers: we could run hardware element tests against dummy drivers +# v4l2: vivo (part of normal kernel) +# modprobe vivo; +# gst-launch v4l2src device="/dev/video1" ! xvimagesink; +# rmmod vivo +# +# alsa: snd-dummy (part of normal alsa, not removable) +# modprobe snd-dummy; +# gst-launch alsasrc device="hw:2" ! fakesink +# gst-launch fakesrc ! alsasink device="hw:2" +# +# need a way to figure out value for the device property + +# the core dumps of some machines have PIDs appended +CLEANFILES = core.* test-registry.* + +clean-local: clean-local-check clean-local-orc + +if USE_ANNODEX +check_annodex = \ + elements/cmmldec \ + elements/cmmlenc +else +check_annodex = +endif + +if USE_FLAC +check_flac = pipelines/flacdec +else +check_flac = +endif + +if USE_GDK_PIXBUF +check_gdkpixbuf = elements/gdkpixbufsink +else +check_gdkpixbuf = +endif + +if USE_JPEG +check_jpeg = elements/jpegenc +else +check_jpeg = +endif + +if USE_SOUP +check_soup = elements/souphttpsrc +else +check_soup = +endif + +if USE_SUNAUDIO +check_sunaudio = elements/sunaudio +else +check_sunaudio = +endif + +if USE_TAGLIB +check_taglib = \ + elements/id3v2mux \ + elements/apev2mux +else +check_taglib = +endif + +if USE_WAVPACK +check_wavpack = \ + elements/wavpackparse \ + elements/wavpackdec \ + elements/wavpackenc \ + pipelines/wavpack +else +check_wavpack = +endif + +if HAVE_ORC +check_orc = orc/deinterlace orc/videomixer orc/videobox +else +check_orc = +endif + + +check_PROGRAMS = \ + generic/index \ + generic/states \ + elements/aacparse \ + elements/ac3parse \ + elements/amrparse \ + $(check_annodex) \ + elements/alphacolor \ + elements/aspectratiocrop \ + elements/audioamplify \ + elements/audiochebband \ + elements/audiocheblimit \ + elements/audiodynamic \ + elements/audioecho \ + elements/audiofirfilter \ + elements/audioiirfilter \ + elements/audioinvert \ + elements/audiopanorama \ + elements/audiowsincband \ + elements/audiowsinclimit \ + elements/avimux \ + elements/avisubtitle \ + elements/capssetter \ + elements/deinterlace \ + elements/deinterleave \ + elements/equalizer \ + elements/flacparse \ + elements/flvdemux \ + elements/flvmux \ + elements/icydemux \ + elements/id3demux \ + elements/imagefreeze \ + elements/interleave \ + elements/level \ + elements/matroskamux \ + elements/matroskaparse \ + elements/mpegaudioparse \ + elements/multifile \ + elements/qtmux \ + elements/rganalysis \ + elements/rglimiter \ + elements/rgvolume \ + elements/rtp-payloading \ + elements/rtpbin \ + elements/rtpbin_buffer_list \ + elements/rtpjitterbuffer \ + elements/shapewipe \ + elements/spectrum \ + elements/udpsink \ + elements/videocrop \ + elements/videofilter \ + elements/y4menc \ + pipelines/simple-launch-lines \ + pipelines/effectv \ + pipelines/tagschecking \ + pipelines/wavenc \ + $(check_flac) \ + $(check_gdkpixbuf) \ + $(check_jpeg) \ + $(check_soup) \ + $(check_sunaudio) \ + $(check_taglib) \ + $(check_wavpack) \ + $(check_orc) + +VALGRIND_TO_FIX = \ + elements/rtp-payloading + +TESTS = $(check_PROGRAMS) + +# these tests don't even pass +# autodetect: temporarily disabled because of broken videosinks in -bad +noinst_PROGRAMS = \ + elements/autodetect + +AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) \ + $(GST_OPTION_CFLAGS) -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \ + -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS +LDADD = $(GST_OBJ_LIBS) $(GST_CHECK_LIBS) $(CHECK_LIBS) + +# valgrind testing +# videocrop disabled since it takes way too long in valgrind +VALGRIND_TESTS_DISABLE = \ + elements/videocrop \ + $(VALGRIND_TO_FIX) + +SUPPRESSIONS = $(top_srcdir)/common/gst.supp $(srcdir)/gst-plugins-good.supp + +# parser unit test convenience lib +noinst_LTLIBRARIES = libparser.la +libparser_la_SOURCES = elements/parser.c elements/parser.h +libparser_la_CFLAGS = \ + -I$(top_srcdir)/tests/check \ + $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) + +elements_aacparse_LDADD = libparser.la $(LDADD) + +elements_ac3parse_LDADD = libparser.la $(LDADD) + +elements_amrparse_LDADD = libparser.la $(LDADD) + +elements_flacparse_LDADD = libparser.la $(LDADD) + +elements_mpegaudioparse_LDADD = libparser.la $(LDADD) + +elements_aspectratiocrop_LDADD = $(LDADD) +elements_aspectratiocrop_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) + +elements_audiopanorama_LDADD = \ + $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \ + $(LDADD) + +elements_audiopanorama_CFLAGS = \ + $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) \ + $(CFLAGS) $(AM_CFLAGS) + +elements_cmmldec_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_cmmlenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) + +elements_alphacolor_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) + +elements_deinterlace_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_deinterlace_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(LDADD) + +elements_deinterleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_deinterleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) +elements_interleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_interleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) + +elements_imagefreeze_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) +elements_imagefreeze_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LDADD) + +elements_jpegenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) +elements_jpegenc_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstapp-0.10 $(GST_BASE_LIBS) $(LDADD) + +elements_level_LDADD = $(LDADD) $(LIBM) + +elements_matroskamux_LDADD = $(GST_BASE_LIBS) $(LDADD) $(LIBM) + +elements_multifile_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) +elements_multifile_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_LIBS) $(LDADD) $(LIBM) + +elements_qtmux_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) +elements_qtmux_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CHECK_LIBS) + +elements_rtpbin_buffer_list_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(WARNING_CFLAGS) $(ERROR_CFLAGS) $(GST_CHECK_CFLAGS) $(AM_CFLAGS) +elements_rtpbin_buffer_list_LDADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CHECK_LIBS) +elements_rtpbin_buffer_list_SOURCES = elements/rtpbin_buffer_list.c + +elements_souphttpsrc_CFLAGS = $(SOUP_CFLAGS) $(AM_CFLAGS) +elements_souphttpsrc_LDADD = $(SOUP_LIBS) $(LDADD) + +elements_sunaudio_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) \ + $(AM_CFLAGS) +elements_sunaudio_LDADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-@GST_MAJORMINOR@ \ + $(LDADD) + +elements_videocrop_LDADD = $(GST_BASE_LIBS) $(LDADD) +elements_videocrop_CFLAGS = $(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) + +elements_videofilter_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_videofilter_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(LDADD) + +# FIXME: configure should check for gdk-pixbuf not gtk +# only need video.h header, not the lib +elements_gdkpixbufsink_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) $(GDK_PIXBUF_CFLAGS) +elements_gdkpixbufsink_LDADD = \ + $(LDADD) $(GDK_PIXBUF_LIBS) + + +pipelines_wavenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +pipelines_wavenc_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) + +pipelines_wavpack_LDADD = $(LDADD) $(GST_BASE_LIBS) +pipelines_wavpack_CFLAGS = $(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) + +orc_deinterlace_CFLAGS = $(ORC_CFLAGS) +orc_deinterlace_LDADD = $(ORC_LIBS) -lorc-test-0.4 +nodist_orc_deinterlace_SOURCES = orc/deinterlace.c +orc_videomixer_CFLAGS = $(ORC_CFLAGS) +orc_videomixer_LDADD = $(ORC_LIBS) -lorc-test-0.4 +nodist_orc_videomixer_SOURCES = orc/videomixer.c +orc_videobox_CFLAGS = $(ORC_CFLAGS) +orc_videobox_LDADD = $(ORC_LIBS) -lorc-test-0.4 +nodist_orc_videobox_SOURCES = orc/videobox.c + +orc/deinterlace.c: $(top_srcdir)/gst/deinterlace/tvtime.orc + $(MKDIR_P) orc/ + $(ORCC) --test -o $@ $< + +orc/videomixer.c: $(top_srcdir)/gst/videomixer/blendorc.orc + $(MKDIR_P) orc/ + $(ORCC) --test -o $@ $< + +orc/videobox.c: $(top_srcdir)/gst/videobox/gstvideoboxorc.orc + $(MKDIR_P) orc/ + $(ORCC) --test -o $@ $< + +clean-local-orc: + rm -rf orc + +EXTRA_DIST = gst-plugins-good.supp diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in new file mode 100644 index 0000000..66e9b6e --- /dev/null +++ b/tests/check/Makefile.in @@ -0,0 +1,3014 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/common/check.mak +check_PROGRAMS = generic/index$(EXEEXT) generic/states$(EXEEXT) \ + elements/aacparse$(EXEEXT) elements/ac3parse$(EXEEXT) \ + elements/amrparse$(EXEEXT) $(am__EXEEXT_1) \ + elements/alphacolor$(EXEEXT) elements/aspectratiocrop$(EXEEXT) \ + elements/audioamplify$(EXEEXT) elements/audiochebband$(EXEEXT) \ + elements/audiocheblimit$(EXEEXT) \ + elements/audiodynamic$(EXEEXT) elements/audioecho$(EXEEXT) \ + elements/audiofirfilter$(EXEEXT) \ + elements/audioiirfilter$(EXEEXT) elements/audioinvert$(EXEEXT) \ + elements/audiopanorama$(EXEEXT) \ + elements/audiowsincband$(EXEEXT) \ + elements/audiowsinclimit$(EXEEXT) elements/avimux$(EXEEXT) \ + elements/avisubtitle$(EXEEXT) elements/capssetter$(EXEEXT) \ + elements/deinterlace$(EXEEXT) elements/deinterleave$(EXEEXT) \ + elements/equalizer$(EXEEXT) elements/flacparse$(EXEEXT) \ + elements/flvdemux$(EXEEXT) elements/flvmux$(EXEEXT) \ + elements/icydemux$(EXEEXT) elements/id3demux$(EXEEXT) \ + elements/imagefreeze$(EXEEXT) elements/interleave$(EXEEXT) \ + elements/level$(EXEEXT) elements/matroskamux$(EXEEXT) \ + elements/matroskaparse$(EXEEXT) \ + elements/mpegaudioparse$(EXEEXT) elements/multifile$(EXEEXT) \ + elements/qtmux$(EXEEXT) elements/rganalysis$(EXEEXT) \ + elements/rglimiter$(EXEEXT) elements/rgvolume$(EXEEXT) \ + elements/rtp-payloading$(EXEEXT) elements/rtpbin$(EXEEXT) \ + elements/rtpbin_buffer_list$(EXEEXT) \ + elements/rtpjitterbuffer$(EXEEXT) elements/shapewipe$(EXEEXT) \ + elements/spectrum$(EXEEXT) elements/udpsink$(EXEEXT) \ + elements/videocrop$(EXEEXT) elements/videofilter$(EXEEXT) \ + elements/y4menc$(EXEEXT) \ + pipelines/simple-launch-lines$(EXEEXT) \ + pipelines/effectv$(EXEEXT) pipelines/tagschecking$(EXEEXT) \ + pipelines/wavenc$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_3) \ + $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \ + $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) +noinst_PROGRAMS = elements/autodetect$(EXEEXT) +subdir = tests/check +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libparser_la_LIBADD = +am_libparser_la_OBJECTS = libparser_la-parser.lo +libparser_la_OBJECTS = $(am_libparser_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libparser_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libparser_la_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +@USE_ANNODEX_TRUE@am__EXEEXT_1 = elements/cmmldec$(EXEEXT) \ +@USE_ANNODEX_TRUE@ elements/cmmlenc$(EXEEXT) +@USE_FLAC_TRUE@am__EXEEXT_2 = pipelines/flacdec$(EXEEXT) +@USE_GDK_PIXBUF_TRUE@am__EXEEXT_3 = elements/gdkpixbufsink$(EXEEXT) +@USE_JPEG_TRUE@am__EXEEXT_4 = elements/jpegenc$(EXEEXT) +@USE_SOUP_TRUE@am__EXEEXT_5 = elements/souphttpsrc$(EXEEXT) +@USE_SUNAUDIO_TRUE@am__EXEEXT_6 = elements/sunaudio$(EXEEXT) +@USE_TAGLIB_TRUE@am__EXEEXT_7 = elements/id3v2mux$(EXEEXT) \ +@USE_TAGLIB_TRUE@ elements/apev2mux$(EXEEXT) +@USE_WAVPACK_TRUE@am__EXEEXT_8 = elements/wavpackparse$(EXEEXT) \ +@USE_WAVPACK_TRUE@ elements/wavpackdec$(EXEEXT) \ +@USE_WAVPACK_TRUE@ elements/wavpackenc$(EXEEXT) \ +@USE_WAVPACK_TRUE@ pipelines/wavpack$(EXEEXT) +@HAVE_ORC_TRUE@am__EXEEXT_9 = orc/deinterlace$(EXEEXT) \ +@HAVE_ORC_TRUE@ orc/videomixer$(EXEEXT) orc/videobox$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +elements_aacparse_SOURCES = elements/aacparse.c +elements_aacparse_OBJECTS = aacparse.$(OBJEXT) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +elements_aacparse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2) +am__dirstamp = $(am__leading_dot)dirstamp +elements_ac3parse_SOURCES = elements/ac3parse.c +elements_ac3parse_OBJECTS = ac3parse.$(OBJEXT) +elements_ac3parse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2) +elements_alphacolor_SOURCES = elements/alphacolor.c +elements_alphacolor_OBJECTS = \ + elements_alphacolor-alphacolor.$(OBJEXT) +elements_alphacolor_LDADD = $(LDADD) +elements_alphacolor_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_alphacolor_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_alphacolor_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_amrparse_SOURCES = elements/amrparse.c +elements_amrparse_OBJECTS = amrparse.$(OBJEXT) +elements_amrparse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2) +elements_apev2mux_SOURCES = elements/apev2mux.c +elements_apev2mux_OBJECTS = apev2mux.$(OBJEXT) +elements_apev2mux_LDADD = $(LDADD) +elements_apev2mux_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_aspectratiocrop_SOURCES = elements/aspectratiocrop.c +elements_aspectratiocrop_OBJECTS = \ + elements_aspectratiocrop-aspectratiocrop.$(OBJEXT) +elements_aspectratiocrop_DEPENDENCIES = $(am__DEPENDENCIES_2) +elements_aspectratiocrop_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_audioamplify_SOURCES = elements/audioamplify.c +elements_audioamplify_OBJECTS = audioamplify.$(OBJEXT) +elements_audioamplify_LDADD = $(LDADD) +elements_audioamplify_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audiochebband_SOURCES = elements/audiochebband.c +elements_audiochebband_OBJECTS = audiochebband.$(OBJEXT) +elements_audiochebband_LDADD = $(LDADD) +elements_audiochebband_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audiocheblimit_SOURCES = elements/audiocheblimit.c +elements_audiocheblimit_OBJECTS = audiocheblimit.$(OBJEXT) +elements_audiocheblimit_LDADD = $(LDADD) +elements_audiocheblimit_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audiodynamic_SOURCES = elements/audiodynamic.c +elements_audiodynamic_OBJECTS = audiodynamic.$(OBJEXT) +elements_audiodynamic_LDADD = $(LDADD) +elements_audiodynamic_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audioecho_SOURCES = elements/audioecho.c +elements_audioecho_OBJECTS = audioecho.$(OBJEXT) +elements_audioecho_LDADD = $(LDADD) +elements_audioecho_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audiofirfilter_SOURCES = elements/audiofirfilter.c +elements_audiofirfilter_OBJECTS = audiofirfilter.$(OBJEXT) +elements_audiofirfilter_LDADD = $(LDADD) +elements_audiofirfilter_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audioiirfilter_SOURCES = elements/audioiirfilter.c +elements_audioiirfilter_OBJECTS = audioiirfilter.$(OBJEXT) +elements_audioiirfilter_LDADD = $(LDADD) +elements_audioiirfilter_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audioinvert_SOURCES = elements/audioinvert.c +elements_audioinvert_OBJECTS = audioinvert.$(OBJEXT) +elements_audioinvert_LDADD = $(LDADD) +elements_audioinvert_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audiopanorama_SOURCES = elements/audiopanorama.c +elements_audiopanorama_OBJECTS = \ + elements_audiopanorama-audiopanorama.$(OBJEXT) +elements_audiopanorama_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +elements_audiopanorama_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_audiopanorama_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_audiowsincband_SOURCES = elements/audiowsincband.c +elements_audiowsincband_OBJECTS = audiowsincband.$(OBJEXT) +elements_audiowsincband_LDADD = $(LDADD) +elements_audiowsincband_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_audiowsinclimit_SOURCES = elements/audiowsinclimit.c +elements_audiowsinclimit_OBJECTS = audiowsinclimit.$(OBJEXT) +elements_audiowsinclimit_LDADD = $(LDADD) +elements_audiowsinclimit_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_autodetect_SOURCES = elements/autodetect.c +elements_autodetect_OBJECTS = autodetect.$(OBJEXT) +elements_autodetect_LDADD = $(LDADD) +elements_autodetect_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_avimux_SOURCES = elements/avimux.c +elements_avimux_OBJECTS = avimux.$(OBJEXT) +elements_avimux_LDADD = $(LDADD) +elements_avimux_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_avisubtitle_SOURCES = elements/avisubtitle.c +elements_avisubtitle_OBJECTS = avisubtitle.$(OBJEXT) +elements_avisubtitle_LDADD = $(LDADD) +elements_avisubtitle_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_capssetter_SOURCES = elements/capssetter.c +elements_capssetter_OBJECTS = capssetter.$(OBJEXT) +elements_capssetter_LDADD = $(LDADD) +elements_capssetter_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_cmmldec_SOURCES = elements/cmmldec.c +elements_cmmldec_OBJECTS = elements_cmmldec-cmmldec.$(OBJEXT) +elements_cmmldec_LDADD = $(LDADD) +elements_cmmldec_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_cmmldec_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_cmmldec_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +elements_cmmlenc_SOURCES = elements/cmmlenc.c +elements_cmmlenc_OBJECTS = elements_cmmlenc-cmmlenc.$(OBJEXT) +elements_cmmlenc_LDADD = $(LDADD) +elements_cmmlenc_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_cmmlenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_cmmlenc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +elements_deinterlace_SOURCES = elements/deinterlace.c +elements_deinterlace_OBJECTS = \ + elements_deinterlace-deinterlace.$(OBJEXT) +elements_deinterlace_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +elements_deinterlace_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_deinterlace_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_deinterleave_SOURCES = elements/deinterleave.c +elements_deinterleave_OBJECTS = \ + elements_deinterleave-deinterleave.$(OBJEXT) +elements_deinterleave_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +elements_deinterleave_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_deinterleave_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_equalizer_SOURCES = elements/equalizer.c +elements_equalizer_OBJECTS = equalizer.$(OBJEXT) +elements_equalizer_LDADD = $(LDADD) +elements_equalizer_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_flacparse_SOURCES = elements/flacparse.c +elements_flacparse_OBJECTS = flacparse.$(OBJEXT) +elements_flacparse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2) +elements_flvdemux_SOURCES = elements/flvdemux.c +elements_flvdemux_OBJECTS = flvdemux.$(OBJEXT) +elements_flvdemux_LDADD = $(LDADD) +elements_flvdemux_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_flvmux_SOURCES = elements/flvmux.c +elements_flvmux_OBJECTS = flvmux.$(OBJEXT) +elements_flvmux_LDADD = $(LDADD) +elements_flvmux_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_gdkpixbufsink_SOURCES = elements/gdkpixbufsink.c +elements_gdkpixbufsink_OBJECTS = \ + elements_gdkpixbufsink-gdkpixbufsink.$(OBJEXT) +elements_gdkpixbufsink_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) +elements_gdkpixbufsink_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_icydemux_SOURCES = elements/icydemux.c +elements_icydemux_OBJECTS = icydemux.$(OBJEXT) +elements_icydemux_LDADD = $(LDADD) +elements_icydemux_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_id3demux_SOURCES = elements/id3demux.c +elements_id3demux_OBJECTS = id3demux.$(OBJEXT) +elements_id3demux_LDADD = $(LDADD) +elements_id3demux_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_id3v2mux_SOURCES = elements/id3v2mux.c +elements_id3v2mux_OBJECTS = id3v2mux.$(OBJEXT) +elements_id3v2mux_LDADD = $(LDADD) +elements_id3v2mux_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_imagefreeze_SOURCES = elements/imagefreeze.c +elements_imagefreeze_OBJECTS = \ + elements_imagefreeze-imagefreeze.$(OBJEXT) +elements_imagefreeze_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +elements_imagefreeze_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_imagefreeze_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_interleave_SOURCES = elements/interleave.c +elements_interleave_OBJECTS = \ + elements_interleave-interleave.$(OBJEXT) +elements_interleave_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +elements_interleave_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_interleave_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_jpegenc_SOURCES = elements/jpegenc.c +elements_jpegenc_OBJECTS = elements_jpegenc-jpegenc.$(OBJEXT) +elements_jpegenc_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +elements_jpegenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_jpegenc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +elements_level_SOURCES = elements/level.c +elements_level_OBJECTS = level.$(OBJEXT) +elements_level_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) +elements_matroskamux_SOURCES = elements/matroskamux.c +elements_matroskamux_OBJECTS = matroskamux.$(OBJEXT) +elements_matroskamux_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) +elements_matroskaparse_SOURCES = elements/matroskaparse.c +elements_matroskaparse_OBJECTS = matroskaparse.$(OBJEXT) +elements_matroskaparse_LDADD = $(LDADD) +elements_matroskaparse_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_mpegaudioparse_SOURCES = elements/mpegaudioparse.c +elements_mpegaudioparse_OBJECTS = mpegaudioparse.$(OBJEXT) +elements_mpegaudioparse_DEPENDENCIES = libparser.la \ + $(am__DEPENDENCIES_2) +elements_multifile_SOURCES = elements/multifile.c +elements_multifile_OBJECTS = elements_multifile-multifile.$(OBJEXT) +elements_multifile_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) +elements_multifile_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_multifile_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_qtmux_SOURCES = elements/qtmux.c +elements_qtmux_OBJECTS = elements_qtmux-qtmux.$(OBJEXT) +elements_qtmux_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +elements_qtmux_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_qtmux_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ + $@ +elements_rganalysis_SOURCES = elements/rganalysis.c +elements_rganalysis_OBJECTS = rganalysis.$(OBJEXT) +elements_rganalysis_LDADD = $(LDADD) +elements_rganalysis_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_rglimiter_SOURCES = elements/rglimiter.c +elements_rglimiter_OBJECTS = rglimiter.$(OBJEXT) +elements_rglimiter_LDADD = $(LDADD) +elements_rglimiter_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_rgvolume_SOURCES = elements/rgvolume.c +elements_rgvolume_OBJECTS = rgvolume.$(OBJEXT) +elements_rgvolume_LDADD = $(LDADD) +elements_rgvolume_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_rtp_payloading_SOURCES = elements/rtp-payloading.c +elements_rtp_payloading_OBJECTS = rtp-payloading.$(OBJEXT) +elements_rtp_payloading_LDADD = $(LDADD) +elements_rtp_payloading_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_rtpbin_SOURCES = elements/rtpbin.c +elements_rtpbin_OBJECTS = rtpbin.$(OBJEXT) +elements_rtpbin_LDADD = $(LDADD) +elements_rtpbin_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_elements_rtpbin_buffer_list_OBJECTS = \ + elements_rtpbin_buffer_list-rtpbin_buffer_list.$(OBJEXT) +elements_rtpbin_buffer_list_OBJECTS = \ + $(am_elements_rtpbin_buffer_list_OBJECTS) +elements_rtpbin_buffer_list_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +elements_rtpbin_buffer_list_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_rtpjitterbuffer_SOURCES = elements/rtpjitterbuffer.c +elements_rtpjitterbuffer_OBJECTS = rtpjitterbuffer.$(OBJEXT) +elements_rtpjitterbuffer_LDADD = $(LDADD) +elements_rtpjitterbuffer_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_shapewipe_SOURCES = elements/shapewipe.c +elements_shapewipe_OBJECTS = shapewipe.$(OBJEXT) +elements_shapewipe_LDADD = $(LDADD) +elements_shapewipe_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_souphttpsrc_SOURCES = elements/souphttpsrc.c +elements_souphttpsrc_OBJECTS = \ + elements_souphttpsrc-souphttpsrc.$(OBJEXT) +elements_souphttpsrc_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +elements_souphttpsrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_souphttpsrc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_spectrum_SOURCES = elements/spectrum.c +elements_spectrum_OBJECTS = spectrum.$(OBJEXT) +elements_spectrum_LDADD = $(LDADD) +elements_spectrum_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_sunaudio_SOURCES = elements/sunaudio.c +elements_sunaudio_OBJECTS = elements_sunaudio-sunaudio.$(OBJEXT) +elements_sunaudio_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +elements_sunaudio_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_sunaudio_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +elements_udpsink_SOURCES = elements/udpsink.c +elements_udpsink_OBJECTS = udpsink.$(OBJEXT) +elements_udpsink_LDADD = $(LDADD) +elements_udpsink_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_videocrop_SOURCES = elements/videocrop.c +elements_videocrop_OBJECTS = elements_videocrop-videocrop.$(OBJEXT) +elements_videocrop_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +elements_videocrop_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_videocrop_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_videofilter_SOURCES = elements/videofilter.c +elements_videofilter_OBJECTS = \ + elements_videofilter-videofilter.$(OBJEXT) +elements_videofilter_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +elements_videofilter_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(elements_videofilter_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +elements_wavpackdec_SOURCES = elements/wavpackdec.c +elements_wavpackdec_OBJECTS = wavpackdec.$(OBJEXT) +elements_wavpackdec_LDADD = $(LDADD) +elements_wavpackdec_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_wavpackenc_SOURCES = elements/wavpackenc.c +elements_wavpackenc_OBJECTS = wavpackenc.$(OBJEXT) +elements_wavpackenc_LDADD = $(LDADD) +elements_wavpackenc_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_wavpackparse_SOURCES = elements/wavpackparse.c +elements_wavpackparse_OBJECTS = wavpackparse.$(OBJEXT) +elements_wavpackparse_LDADD = $(LDADD) +elements_wavpackparse_DEPENDENCIES = $(am__DEPENDENCIES_1) +elements_y4menc_SOURCES = elements/y4menc.c +elements_y4menc_OBJECTS = y4menc.$(OBJEXT) +elements_y4menc_LDADD = $(LDADD) +elements_y4menc_DEPENDENCIES = $(am__DEPENDENCIES_1) +generic_index_SOURCES = generic/index.c +generic_index_OBJECTS = index.$(OBJEXT) +generic_index_LDADD = $(LDADD) +generic_index_DEPENDENCIES = $(am__DEPENDENCIES_1) +generic_states_SOURCES = generic/states.c +generic_states_OBJECTS = states.$(OBJEXT) +generic_states_LDADD = $(LDADD) +generic_states_DEPENDENCIES = $(am__DEPENDENCIES_1) +nodist_orc_deinterlace_OBJECTS = \ + orc_deinterlace-deinterlace.$(OBJEXT) +orc_deinterlace_OBJECTS = $(nodist_orc_deinterlace_OBJECTS) +orc_deinterlace_DEPENDENCIES = $(am__DEPENDENCIES_1) +orc_deinterlace_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(orc_deinterlace_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +nodist_orc_videobox_OBJECTS = orc_videobox-videobox.$(OBJEXT) +orc_videobox_OBJECTS = $(nodist_orc_videobox_OBJECTS) +orc_videobox_DEPENDENCIES = $(am__DEPENDENCIES_1) +orc_videobox_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(orc_videobox_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +nodist_orc_videomixer_OBJECTS = orc_videomixer-videomixer.$(OBJEXT) +orc_videomixer_OBJECTS = $(nodist_orc_videomixer_OBJECTS) +orc_videomixer_DEPENDENCIES = $(am__DEPENDENCIES_1) +orc_videomixer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(orc_videomixer_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ + $@ +pipelines_effectv_SOURCES = pipelines/effectv.c +pipelines_effectv_OBJECTS = effectv.$(OBJEXT) +pipelines_effectv_LDADD = $(LDADD) +pipelines_effectv_DEPENDENCIES = $(am__DEPENDENCIES_1) +pipelines_flacdec_SOURCES = pipelines/flacdec.c +pipelines_flacdec_OBJECTS = flacdec.$(OBJEXT) +pipelines_flacdec_LDADD = $(LDADD) +pipelines_flacdec_DEPENDENCIES = $(am__DEPENDENCIES_1) +pipelines_simple_launch_lines_SOURCES = \ + pipelines/simple-launch-lines.c +pipelines_simple_launch_lines_OBJECTS = simple-launch-lines.$(OBJEXT) +pipelines_simple_launch_lines_LDADD = $(LDADD) +pipelines_simple_launch_lines_DEPENDENCIES = $(am__DEPENDENCIES_1) +pipelines_tagschecking_SOURCES = pipelines/tagschecking.c +pipelines_tagschecking_OBJECTS = tagschecking.$(OBJEXT) +pipelines_tagschecking_LDADD = $(LDADD) +pipelines_tagschecking_DEPENDENCIES = $(am__DEPENDENCIES_1) +pipelines_wavenc_SOURCES = pipelines/wavenc.c +pipelines_wavenc_OBJECTS = pipelines_wavenc-wavenc.$(OBJEXT) +pipelines_wavenc_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +pipelines_wavenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(pipelines_wavenc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +pipelines_wavpack_SOURCES = pipelines/wavpack.c +pipelines_wavpack_OBJECTS = pipelines_wavpack-wavpack.$(OBJEXT) +pipelines_wavpack_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) +pipelines_wavpack_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(pipelines_wavpack_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libparser_la_SOURCES) elements/aacparse.c \ + elements/ac3parse.c elements/alphacolor.c elements/amrparse.c \ + elements/apev2mux.c elements/aspectratiocrop.c \ + elements/audioamplify.c elements/audiochebband.c \ + elements/audiocheblimit.c elements/audiodynamic.c \ + elements/audioecho.c elements/audiofirfilter.c \ + elements/audioiirfilter.c elements/audioinvert.c \ + elements/audiopanorama.c elements/audiowsincband.c \ + elements/audiowsinclimit.c elements/autodetect.c \ + elements/avimux.c elements/avisubtitle.c elements/capssetter.c \ + elements/cmmldec.c elements/cmmlenc.c elements/deinterlace.c \ + elements/deinterleave.c elements/equalizer.c \ + elements/flacparse.c elements/flvdemux.c elements/flvmux.c \ + elements/gdkpixbufsink.c elements/icydemux.c \ + elements/id3demux.c elements/id3v2mux.c elements/imagefreeze.c \ + elements/interleave.c elements/jpegenc.c elements/level.c \ + elements/matroskamux.c elements/matroskaparse.c \ + elements/mpegaudioparse.c elements/multifile.c \ + elements/qtmux.c elements/rganalysis.c elements/rglimiter.c \ + elements/rgvolume.c elements/rtp-payloading.c \ + elements/rtpbin.c $(elements_rtpbin_buffer_list_SOURCES) \ + elements/rtpjitterbuffer.c elements/shapewipe.c \ + elements/souphttpsrc.c elements/spectrum.c elements/sunaudio.c \ + elements/udpsink.c elements/videocrop.c elements/videofilter.c \ + elements/wavpackdec.c elements/wavpackenc.c \ + elements/wavpackparse.c elements/y4menc.c generic/index.c \ + generic/states.c $(nodist_orc_deinterlace_SOURCES) \ + $(nodist_orc_videobox_SOURCES) \ + $(nodist_orc_videomixer_SOURCES) pipelines/effectv.c \ + pipelines/flacdec.c pipelines/simple-launch-lines.c \ + pipelines/tagschecking.c pipelines/wavenc.c \ + pipelines/wavpack.c +DIST_SOURCES = $(libparser_la_SOURCES) elements/aacparse.c \ + elements/ac3parse.c elements/alphacolor.c elements/amrparse.c \ + elements/apev2mux.c elements/aspectratiocrop.c \ + elements/audioamplify.c elements/audiochebband.c \ + elements/audiocheblimit.c elements/audiodynamic.c \ + elements/audioecho.c elements/audiofirfilter.c \ + elements/audioiirfilter.c elements/audioinvert.c \ + elements/audiopanorama.c elements/audiowsincband.c \ + elements/audiowsinclimit.c elements/autodetect.c \ + elements/avimux.c elements/avisubtitle.c elements/capssetter.c \ + elements/cmmldec.c elements/cmmlenc.c elements/deinterlace.c \ + elements/deinterleave.c elements/equalizer.c \ + elements/flacparse.c elements/flvdemux.c elements/flvmux.c \ + elements/gdkpixbufsink.c elements/icydemux.c \ + elements/id3demux.c elements/id3v2mux.c elements/imagefreeze.c \ + elements/interleave.c elements/jpegenc.c elements/level.c \ + elements/matroskamux.c elements/matroskaparse.c \ + elements/mpegaudioparse.c elements/multifile.c \ + elements/qtmux.c elements/rganalysis.c elements/rglimiter.c \ + elements/rgvolume.c elements/rtp-payloading.c \ + elements/rtpbin.c $(elements_rtpbin_buffer_list_SOURCES) \ + elements/rtpjitterbuffer.c elements/shapewipe.c \ + elements/souphttpsrc.c elements/spectrum.c elements/sunaudio.c \ + elements/udpsink.c elements/videocrop.c elements/videofilter.c \ + elements/wavpackdec.c elements/wavpackenc.c \ + elements/wavpackparse.c elements/y4menc.c generic/index.c \ + generic/states.c pipelines/effectv.c pipelines/flacdec.c \ + pipelines/simple-launch-lines.c pipelines/tagschecking.c \ + pipelines/wavenc.c pipelines/wavpack.c +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +LOOPS = 10 + +# inspect every plugin feature +GST_INSPECT = $(GST_TOOLS_DIR)/gst-inspect-$(GST_MAJORMINOR) +CHECK_REGISTRY = $(top_builddir)/tests/check/test-registry.reg +TEST_FILES_DIRECTORY = $(top_srcdir)/tests/files +REGISTRY_ENVIRONMENT = \ + GST_REGISTRY=$(CHECK_REGISTRY) + +TESTS_ENVIRONMENT = \ + $(REGISTRY_ENVIRONMENT) \ + GST_PLUGIN_SYSTEM_PATH= \ + GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/ext:$(top_builddir)/sys:$(GSTPB_PLUGINS_DIR):$(GST_PLUGINS_DIR) \ + GST_PLUGIN_LOADING_WHITELIST="gstreamer@$(GST_PLUGINS_DIR):gst-plugins-base@$(GSTPB_PLUGINS_DIR):gst-plugins-good@$(top_builddir)" \ + GST_STATE_IGNORE_ELEMENTS="aasink autoaudiosrc autoaudiosink autovideosrc autovideosink \ + cacasink cairotextoverlay gconfaudiosrc gconfvideosrc gconfaudiosink gconfvideosink \ + halaudiosrc halaudiosink jackaudiosrc jackaudiosink \ + osssrc osssink osxaudiosink osxaudiosrc osxvideosrc osxvideosink \ + pulsesink pulsesrc pulsemixer v4l2src" + + +# fake device drivers: we could run hardware element tests against dummy drivers +# v4l2: vivo (part of normal kernel) +# modprobe vivo; +# gst-launch v4l2src device="/dev/video1" ! xvimagesink; +# rmmod vivo +# +# alsa: snd-dummy (part of normal alsa, not removable) +# modprobe snd-dummy; +# gst-launch alsasrc device="hw:2" ! fakesink +# gst-launch fakesrc ! alsasink device="hw:2" +# +# need a way to figure out value for the device property + +# the core dumps of some machines have PIDs appended +CLEANFILES = core.* test-registry.* +@USE_ANNODEX_FALSE@check_annodex = +@USE_ANNODEX_TRUE@check_annodex = \ +@USE_ANNODEX_TRUE@ elements/cmmldec \ +@USE_ANNODEX_TRUE@ elements/cmmlenc + +@USE_FLAC_FALSE@check_flac = +@USE_FLAC_TRUE@check_flac = pipelines/flacdec +@USE_GDK_PIXBUF_FALSE@check_gdkpixbuf = +@USE_GDK_PIXBUF_TRUE@check_gdkpixbuf = elements/gdkpixbufsink +@USE_JPEG_FALSE@check_jpeg = +@USE_JPEG_TRUE@check_jpeg = elements/jpegenc +@USE_SOUP_FALSE@check_soup = +@USE_SOUP_TRUE@check_soup = elements/souphttpsrc +@USE_SUNAUDIO_FALSE@check_sunaudio = +@USE_SUNAUDIO_TRUE@check_sunaudio = elements/sunaudio +@USE_TAGLIB_FALSE@check_taglib = +@USE_TAGLIB_TRUE@check_taglib = \ +@USE_TAGLIB_TRUE@ elements/id3v2mux \ +@USE_TAGLIB_TRUE@ elements/apev2mux + +@USE_WAVPACK_FALSE@check_wavpack = +@USE_WAVPACK_TRUE@check_wavpack = \ +@USE_WAVPACK_TRUE@ elements/wavpackparse \ +@USE_WAVPACK_TRUE@ elements/wavpackdec \ +@USE_WAVPACK_TRUE@ elements/wavpackenc \ +@USE_WAVPACK_TRUE@ pipelines/wavpack + +@HAVE_ORC_FALSE@check_orc = +@HAVE_ORC_TRUE@check_orc = orc/deinterlace orc/videomixer orc/videobox +VALGRIND_TO_FIX = \ + elements/rtp-payloading + +TESTS = $(check_PROGRAMS) +AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) \ + $(GST_OPTION_CFLAGS) -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \ + -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS + +LDADD = $(GST_OBJ_LIBS) $(GST_CHECK_LIBS) $(CHECK_LIBS) + +# valgrind testing +# videocrop disabled since it takes way too long in valgrind +VALGRIND_TESTS_DISABLE = \ + elements/videocrop \ + $(VALGRIND_TO_FIX) + +SUPPRESSIONS = $(top_srcdir)/common/gst.supp $(srcdir)/gst-plugins-good.supp + +# parser unit test convenience lib +noinst_LTLIBRARIES = libparser.la +libparser_la_SOURCES = elements/parser.c elements/parser.h +libparser_la_CFLAGS = \ + -I$(top_srcdir)/tests/check \ + $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) + +elements_aacparse_LDADD = libparser.la $(LDADD) +elements_ac3parse_LDADD = libparser.la $(LDADD) +elements_amrparse_LDADD = libparser.la $(LDADD) +elements_flacparse_LDADD = libparser.la $(LDADD) +elements_mpegaudioparse_LDADD = libparser.la $(LDADD) +elements_aspectratiocrop_LDADD = $(LDADD) +elements_aspectratiocrop_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_audiopanorama_LDADD = \ + $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \ + $(LDADD) + +elements_audiopanorama_CFLAGS = \ + $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) \ + $(CFLAGS) $(AM_CFLAGS) + +elements_cmmldec_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_cmmlenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_alphacolor_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_deinterlace_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_deinterlace_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(LDADD) +elements_deinterleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_deinterleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) +elements_interleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_interleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) +elements_imagefreeze_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) +elements_imagefreeze_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LDADD) +elements_jpegenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) +elements_jpegenc_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstapp-0.10 $(GST_BASE_LIBS) $(LDADD) +elements_level_LDADD = $(LDADD) $(LIBM) +elements_matroskamux_LDADD = $(GST_BASE_LIBS) $(LDADD) $(LIBM) +elements_multifile_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) +elements_multifile_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_LIBS) $(LDADD) $(LIBM) +elements_qtmux_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) +elements_qtmux_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CHECK_LIBS) + +elements_rtpbin_buffer_list_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(WARNING_CFLAGS) $(ERROR_CFLAGS) $(GST_CHECK_CFLAGS) $(AM_CFLAGS) + +elements_rtpbin_buffer_list_LDADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CHECK_LIBS) + +elements_rtpbin_buffer_list_SOURCES = elements/rtpbin_buffer_list.c +elements_souphttpsrc_CFLAGS = $(SOUP_CFLAGS) $(AM_CFLAGS) +elements_souphttpsrc_LDADD = $(SOUP_LIBS) $(LDADD) +elements_sunaudio_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) \ + $(AM_CFLAGS) + +elements_sunaudio_LDADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-@GST_MAJORMINOR@ \ + $(LDADD) + +elements_videocrop_LDADD = $(GST_BASE_LIBS) $(LDADD) +elements_videocrop_CFLAGS = $(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_videofilter_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +elements_videofilter_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(LDADD) + +# FIXME: configure should check for gdk-pixbuf not gtk +# only need video.h header, not the lib +elements_gdkpixbufsink_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) $(GDK_PIXBUF_CFLAGS) + +elements_gdkpixbufsink_LDADD = \ + $(LDADD) $(GDK_PIXBUF_LIBS) + +pipelines_wavenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +pipelines_wavenc_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) +pipelines_wavpack_LDADD = $(LDADD) $(GST_BASE_LIBS) +pipelines_wavpack_CFLAGS = $(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) +orc_deinterlace_CFLAGS = $(ORC_CFLAGS) +orc_deinterlace_LDADD = $(ORC_LIBS) -lorc-test-0.4 +nodist_orc_deinterlace_SOURCES = orc/deinterlace.c +orc_videomixer_CFLAGS = $(ORC_CFLAGS) +orc_videomixer_LDADD = $(ORC_LIBS) -lorc-test-0.4 +nodist_orc_videomixer_SOURCES = orc/videomixer.c +orc_videobox_CFLAGS = $(ORC_CFLAGS) +orc_videobox_LDADD = $(ORC_LIBS) -lorc-test-0.4 +nodist_orc_videobox_SOURCES = orc/videobox.c +EXTRA_DIST = gst-plugins-good.supp +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/check.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/check/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/check/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/check.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libparser.la: $(libparser_la_OBJECTS) $(libparser_la_DEPENDENCIES) $(EXTRA_libparser_la_DEPENDENCIES) + $(AM_V_CCLD)$(libparser_la_LINK) $(libparser_la_OBJECTS) $(libparser_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +elements/$(am__dirstamp): + @$(MKDIR_P) elements + @: > elements/$(am__dirstamp) +elements/aacparse$(EXEEXT): $(elements_aacparse_OBJECTS) $(elements_aacparse_DEPENDENCIES) $(EXTRA_elements_aacparse_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/aacparse$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_aacparse_OBJECTS) $(elements_aacparse_LDADD) $(LIBS) +elements/ac3parse$(EXEEXT): $(elements_ac3parse_OBJECTS) $(elements_ac3parse_DEPENDENCIES) $(EXTRA_elements_ac3parse_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/ac3parse$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_ac3parse_OBJECTS) $(elements_ac3parse_LDADD) $(LIBS) +elements/alphacolor$(EXEEXT): $(elements_alphacolor_OBJECTS) $(elements_alphacolor_DEPENDENCIES) $(EXTRA_elements_alphacolor_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/alphacolor$(EXEEXT) + $(AM_V_CCLD)$(elements_alphacolor_LINK) $(elements_alphacolor_OBJECTS) $(elements_alphacolor_LDADD) $(LIBS) +elements/amrparse$(EXEEXT): $(elements_amrparse_OBJECTS) $(elements_amrparse_DEPENDENCIES) $(EXTRA_elements_amrparse_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/amrparse$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_amrparse_OBJECTS) $(elements_amrparse_LDADD) $(LIBS) +elements/apev2mux$(EXEEXT): $(elements_apev2mux_OBJECTS) $(elements_apev2mux_DEPENDENCIES) $(EXTRA_elements_apev2mux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/apev2mux$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_apev2mux_OBJECTS) $(elements_apev2mux_LDADD) $(LIBS) +elements/aspectratiocrop$(EXEEXT): $(elements_aspectratiocrop_OBJECTS) $(elements_aspectratiocrop_DEPENDENCIES) $(EXTRA_elements_aspectratiocrop_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/aspectratiocrop$(EXEEXT) + $(AM_V_CCLD)$(elements_aspectratiocrop_LINK) $(elements_aspectratiocrop_OBJECTS) $(elements_aspectratiocrop_LDADD) $(LIBS) +elements/audioamplify$(EXEEXT): $(elements_audioamplify_OBJECTS) $(elements_audioamplify_DEPENDENCIES) $(EXTRA_elements_audioamplify_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audioamplify$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audioamplify_OBJECTS) $(elements_audioamplify_LDADD) $(LIBS) +elements/audiochebband$(EXEEXT): $(elements_audiochebband_OBJECTS) $(elements_audiochebband_DEPENDENCIES) $(EXTRA_elements_audiochebband_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audiochebband$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audiochebband_OBJECTS) $(elements_audiochebband_LDADD) $(LIBS) +elements/audiocheblimit$(EXEEXT): $(elements_audiocheblimit_OBJECTS) $(elements_audiocheblimit_DEPENDENCIES) $(EXTRA_elements_audiocheblimit_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audiocheblimit$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audiocheblimit_OBJECTS) $(elements_audiocheblimit_LDADD) $(LIBS) +elements/audiodynamic$(EXEEXT): $(elements_audiodynamic_OBJECTS) $(elements_audiodynamic_DEPENDENCIES) $(EXTRA_elements_audiodynamic_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audiodynamic$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audiodynamic_OBJECTS) $(elements_audiodynamic_LDADD) $(LIBS) +elements/audioecho$(EXEEXT): $(elements_audioecho_OBJECTS) $(elements_audioecho_DEPENDENCIES) $(EXTRA_elements_audioecho_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audioecho$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audioecho_OBJECTS) $(elements_audioecho_LDADD) $(LIBS) +elements/audiofirfilter$(EXEEXT): $(elements_audiofirfilter_OBJECTS) $(elements_audiofirfilter_DEPENDENCIES) $(EXTRA_elements_audiofirfilter_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audiofirfilter$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audiofirfilter_OBJECTS) $(elements_audiofirfilter_LDADD) $(LIBS) +elements/audioiirfilter$(EXEEXT): $(elements_audioiirfilter_OBJECTS) $(elements_audioiirfilter_DEPENDENCIES) $(EXTRA_elements_audioiirfilter_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audioiirfilter$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audioiirfilter_OBJECTS) $(elements_audioiirfilter_LDADD) $(LIBS) +elements/audioinvert$(EXEEXT): $(elements_audioinvert_OBJECTS) $(elements_audioinvert_DEPENDENCIES) $(EXTRA_elements_audioinvert_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audioinvert$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audioinvert_OBJECTS) $(elements_audioinvert_LDADD) $(LIBS) +elements/audiopanorama$(EXEEXT): $(elements_audiopanorama_OBJECTS) $(elements_audiopanorama_DEPENDENCIES) $(EXTRA_elements_audiopanorama_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audiopanorama$(EXEEXT) + $(AM_V_CCLD)$(elements_audiopanorama_LINK) $(elements_audiopanorama_OBJECTS) $(elements_audiopanorama_LDADD) $(LIBS) +elements/audiowsincband$(EXEEXT): $(elements_audiowsincband_OBJECTS) $(elements_audiowsincband_DEPENDENCIES) $(EXTRA_elements_audiowsincband_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audiowsincband$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audiowsincband_OBJECTS) $(elements_audiowsincband_LDADD) $(LIBS) +elements/audiowsinclimit$(EXEEXT): $(elements_audiowsinclimit_OBJECTS) $(elements_audiowsinclimit_DEPENDENCIES) $(EXTRA_elements_audiowsinclimit_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/audiowsinclimit$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_audiowsinclimit_OBJECTS) $(elements_audiowsinclimit_LDADD) $(LIBS) +elements/autodetect$(EXEEXT): $(elements_autodetect_OBJECTS) $(elements_autodetect_DEPENDENCIES) $(EXTRA_elements_autodetect_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/autodetect$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_autodetect_OBJECTS) $(elements_autodetect_LDADD) $(LIBS) +elements/avimux$(EXEEXT): $(elements_avimux_OBJECTS) $(elements_avimux_DEPENDENCIES) $(EXTRA_elements_avimux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/avimux$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_avimux_OBJECTS) $(elements_avimux_LDADD) $(LIBS) +elements/avisubtitle$(EXEEXT): $(elements_avisubtitle_OBJECTS) $(elements_avisubtitle_DEPENDENCIES) $(EXTRA_elements_avisubtitle_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/avisubtitle$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_avisubtitle_OBJECTS) $(elements_avisubtitle_LDADD) $(LIBS) +elements/capssetter$(EXEEXT): $(elements_capssetter_OBJECTS) $(elements_capssetter_DEPENDENCIES) $(EXTRA_elements_capssetter_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/capssetter$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_capssetter_OBJECTS) $(elements_capssetter_LDADD) $(LIBS) +elements/cmmldec$(EXEEXT): $(elements_cmmldec_OBJECTS) $(elements_cmmldec_DEPENDENCIES) $(EXTRA_elements_cmmldec_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/cmmldec$(EXEEXT) + $(AM_V_CCLD)$(elements_cmmldec_LINK) $(elements_cmmldec_OBJECTS) $(elements_cmmldec_LDADD) $(LIBS) +elements/cmmlenc$(EXEEXT): $(elements_cmmlenc_OBJECTS) $(elements_cmmlenc_DEPENDENCIES) $(EXTRA_elements_cmmlenc_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/cmmlenc$(EXEEXT) + $(AM_V_CCLD)$(elements_cmmlenc_LINK) $(elements_cmmlenc_OBJECTS) $(elements_cmmlenc_LDADD) $(LIBS) +elements/deinterlace$(EXEEXT): $(elements_deinterlace_OBJECTS) $(elements_deinterlace_DEPENDENCIES) $(EXTRA_elements_deinterlace_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/deinterlace$(EXEEXT) + $(AM_V_CCLD)$(elements_deinterlace_LINK) $(elements_deinterlace_OBJECTS) $(elements_deinterlace_LDADD) $(LIBS) +elements/deinterleave$(EXEEXT): $(elements_deinterleave_OBJECTS) $(elements_deinterleave_DEPENDENCIES) $(EXTRA_elements_deinterleave_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/deinterleave$(EXEEXT) + $(AM_V_CCLD)$(elements_deinterleave_LINK) $(elements_deinterleave_OBJECTS) $(elements_deinterleave_LDADD) $(LIBS) +elements/equalizer$(EXEEXT): $(elements_equalizer_OBJECTS) $(elements_equalizer_DEPENDENCIES) $(EXTRA_elements_equalizer_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/equalizer$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_equalizer_OBJECTS) $(elements_equalizer_LDADD) $(LIBS) +elements/flacparse$(EXEEXT): $(elements_flacparse_OBJECTS) $(elements_flacparse_DEPENDENCIES) $(EXTRA_elements_flacparse_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/flacparse$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_flacparse_OBJECTS) $(elements_flacparse_LDADD) $(LIBS) +elements/flvdemux$(EXEEXT): $(elements_flvdemux_OBJECTS) $(elements_flvdemux_DEPENDENCIES) $(EXTRA_elements_flvdemux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/flvdemux$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_flvdemux_OBJECTS) $(elements_flvdemux_LDADD) $(LIBS) +elements/flvmux$(EXEEXT): $(elements_flvmux_OBJECTS) $(elements_flvmux_DEPENDENCIES) $(EXTRA_elements_flvmux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/flvmux$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_flvmux_OBJECTS) $(elements_flvmux_LDADD) $(LIBS) +elements/gdkpixbufsink$(EXEEXT): $(elements_gdkpixbufsink_OBJECTS) $(elements_gdkpixbufsink_DEPENDENCIES) $(EXTRA_elements_gdkpixbufsink_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/gdkpixbufsink$(EXEEXT) + $(AM_V_CCLD)$(elements_gdkpixbufsink_LINK) $(elements_gdkpixbufsink_OBJECTS) $(elements_gdkpixbufsink_LDADD) $(LIBS) +elements/icydemux$(EXEEXT): $(elements_icydemux_OBJECTS) $(elements_icydemux_DEPENDENCIES) $(EXTRA_elements_icydemux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/icydemux$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_icydemux_OBJECTS) $(elements_icydemux_LDADD) $(LIBS) +elements/id3demux$(EXEEXT): $(elements_id3demux_OBJECTS) $(elements_id3demux_DEPENDENCIES) $(EXTRA_elements_id3demux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/id3demux$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_id3demux_OBJECTS) $(elements_id3demux_LDADD) $(LIBS) +elements/id3v2mux$(EXEEXT): $(elements_id3v2mux_OBJECTS) $(elements_id3v2mux_DEPENDENCIES) $(EXTRA_elements_id3v2mux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/id3v2mux$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_id3v2mux_OBJECTS) $(elements_id3v2mux_LDADD) $(LIBS) +elements/imagefreeze$(EXEEXT): $(elements_imagefreeze_OBJECTS) $(elements_imagefreeze_DEPENDENCIES) $(EXTRA_elements_imagefreeze_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/imagefreeze$(EXEEXT) + $(AM_V_CCLD)$(elements_imagefreeze_LINK) $(elements_imagefreeze_OBJECTS) $(elements_imagefreeze_LDADD) $(LIBS) +elements/interleave$(EXEEXT): $(elements_interleave_OBJECTS) $(elements_interleave_DEPENDENCIES) $(EXTRA_elements_interleave_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/interleave$(EXEEXT) + $(AM_V_CCLD)$(elements_interleave_LINK) $(elements_interleave_OBJECTS) $(elements_interleave_LDADD) $(LIBS) +elements/jpegenc$(EXEEXT): $(elements_jpegenc_OBJECTS) $(elements_jpegenc_DEPENDENCIES) $(EXTRA_elements_jpegenc_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/jpegenc$(EXEEXT) + $(AM_V_CCLD)$(elements_jpegenc_LINK) $(elements_jpegenc_OBJECTS) $(elements_jpegenc_LDADD) $(LIBS) +elements/level$(EXEEXT): $(elements_level_OBJECTS) $(elements_level_DEPENDENCIES) $(EXTRA_elements_level_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/level$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_level_OBJECTS) $(elements_level_LDADD) $(LIBS) +elements/matroskamux$(EXEEXT): $(elements_matroskamux_OBJECTS) $(elements_matroskamux_DEPENDENCIES) $(EXTRA_elements_matroskamux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/matroskamux$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_matroskamux_OBJECTS) $(elements_matroskamux_LDADD) $(LIBS) +elements/matroskaparse$(EXEEXT): $(elements_matroskaparse_OBJECTS) $(elements_matroskaparse_DEPENDENCIES) $(EXTRA_elements_matroskaparse_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/matroskaparse$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_matroskaparse_OBJECTS) $(elements_matroskaparse_LDADD) $(LIBS) +elements/mpegaudioparse$(EXEEXT): $(elements_mpegaudioparse_OBJECTS) $(elements_mpegaudioparse_DEPENDENCIES) $(EXTRA_elements_mpegaudioparse_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/mpegaudioparse$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_mpegaudioparse_OBJECTS) $(elements_mpegaudioparse_LDADD) $(LIBS) +elements/multifile$(EXEEXT): $(elements_multifile_OBJECTS) $(elements_multifile_DEPENDENCIES) $(EXTRA_elements_multifile_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/multifile$(EXEEXT) + $(AM_V_CCLD)$(elements_multifile_LINK) $(elements_multifile_OBJECTS) $(elements_multifile_LDADD) $(LIBS) +elements/qtmux$(EXEEXT): $(elements_qtmux_OBJECTS) $(elements_qtmux_DEPENDENCIES) $(EXTRA_elements_qtmux_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/qtmux$(EXEEXT) + $(AM_V_CCLD)$(elements_qtmux_LINK) $(elements_qtmux_OBJECTS) $(elements_qtmux_LDADD) $(LIBS) +elements/rganalysis$(EXEEXT): $(elements_rganalysis_OBJECTS) $(elements_rganalysis_DEPENDENCIES) $(EXTRA_elements_rganalysis_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/rganalysis$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_rganalysis_OBJECTS) $(elements_rganalysis_LDADD) $(LIBS) +elements/rglimiter$(EXEEXT): $(elements_rglimiter_OBJECTS) $(elements_rglimiter_DEPENDENCIES) $(EXTRA_elements_rglimiter_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/rglimiter$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_rglimiter_OBJECTS) $(elements_rglimiter_LDADD) $(LIBS) +elements/rgvolume$(EXEEXT): $(elements_rgvolume_OBJECTS) $(elements_rgvolume_DEPENDENCIES) $(EXTRA_elements_rgvolume_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/rgvolume$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_rgvolume_OBJECTS) $(elements_rgvolume_LDADD) $(LIBS) +elements/rtp-payloading$(EXEEXT): $(elements_rtp_payloading_OBJECTS) $(elements_rtp_payloading_DEPENDENCIES) $(EXTRA_elements_rtp_payloading_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/rtp-payloading$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_rtp_payloading_OBJECTS) $(elements_rtp_payloading_LDADD) $(LIBS) +elements/rtpbin$(EXEEXT): $(elements_rtpbin_OBJECTS) $(elements_rtpbin_DEPENDENCIES) $(EXTRA_elements_rtpbin_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/rtpbin$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_rtpbin_OBJECTS) $(elements_rtpbin_LDADD) $(LIBS) +elements/rtpbin_buffer_list$(EXEEXT): $(elements_rtpbin_buffer_list_OBJECTS) $(elements_rtpbin_buffer_list_DEPENDENCIES) $(EXTRA_elements_rtpbin_buffer_list_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/rtpbin_buffer_list$(EXEEXT) + $(AM_V_CCLD)$(elements_rtpbin_buffer_list_LINK) $(elements_rtpbin_buffer_list_OBJECTS) $(elements_rtpbin_buffer_list_LDADD) $(LIBS) +elements/rtpjitterbuffer$(EXEEXT): $(elements_rtpjitterbuffer_OBJECTS) $(elements_rtpjitterbuffer_DEPENDENCIES) $(EXTRA_elements_rtpjitterbuffer_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/rtpjitterbuffer$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_rtpjitterbuffer_OBJECTS) $(elements_rtpjitterbuffer_LDADD) $(LIBS) +elements/shapewipe$(EXEEXT): $(elements_shapewipe_OBJECTS) $(elements_shapewipe_DEPENDENCIES) $(EXTRA_elements_shapewipe_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/shapewipe$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_shapewipe_OBJECTS) $(elements_shapewipe_LDADD) $(LIBS) +elements/souphttpsrc$(EXEEXT): $(elements_souphttpsrc_OBJECTS) $(elements_souphttpsrc_DEPENDENCIES) $(EXTRA_elements_souphttpsrc_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/souphttpsrc$(EXEEXT) + $(AM_V_CCLD)$(elements_souphttpsrc_LINK) $(elements_souphttpsrc_OBJECTS) $(elements_souphttpsrc_LDADD) $(LIBS) +elements/spectrum$(EXEEXT): $(elements_spectrum_OBJECTS) $(elements_spectrum_DEPENDENCIES) $(EXTRA_elements_spectrum_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/spectrum$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_spectrum_OBJECTS) $(elements_spectrum_LDADD) $(LIBS) +elements/sunaudio$(EXEEXT): $(elements_sunaudio_OBJECTS) $(elements_sunaudio_DEPENDENCIES) $(EXTRA_elements_sunaudio_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/sunaudio$(EXEEXT) + $(AM_V_CCLD)$(elements_sunaudio_LINK) $(elements_sunaudio_OBJECTS) $(elements_sunaudio_LDADD) $(LIBS) +elements/udpsink$(EXEEXT): $(elements_udpsink_OBJECTS) $(elements_udpsink_DEPENDENCIES) $(EXTRA_elements_udpsink_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/udpsink$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_udpsink_OBJECTS) $(elements_udpsink_LDADD) $(LIBS) +elements/videocrop$(EXEEXT): $(elements_videocrop_OBJECTS) $(elements_videocrop_DEPENDENCIES) $(EXTRA_elements_videocrop_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/videocrop$(EXEEXT) + $(AM_V_CCLD)$(elements_videocrop_LINK) $(elements_videocrop_OBJECTS) $(elements_videocrop_LDADD) $(LIBS) +elements/videofilter$(EXEEXT): $(elements_videofilter_OBJECTS) $(elements_videofilter_DEPENDENCIES) $(EXTRA_elements_videofilter_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/videofilter$(EXEEXT) + $(AM_V_CCLD)$(elements_videofilter_LINK) $(elements_videofilter_OBJECTS) $(elements_videofilter_LDADD) $(LIBS) +elements/wavpackdec$(EXEEXT): $(elements_wavpackdec_OBJECTS) $(elements_wavpackdec_DEPENDENCIES) $(EXTRA_elements_wavpackdec_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/wavpackdec$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_wavpackdec_OBJECTS) $(elements_wavpackdec_LDADD) $(LIBS) +elements/wavpackenc$(EXEEXT): $(elements_wavpackenc_OBJECTS) $(elements_wavpackenc_DEPENDENCIES) $(EXTRA_elements_wavpackenc_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/wavpackenc$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_wavpackenc_OBJECTS) $(elements_wavpackenc_LDADD) $(LIBS) +elements/wavpackparse$(EXEEXT): $(elements_wavpackparse_OBJECTS) $(elements_wavpackparse_DEPENDENCIES) $(EXTRA_elements_wavpackparse_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/wavpackparse$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_wavpackparse_OBJECTS) $(elements_wavpackparse_LDADD) $(LIBS) +elements/y4menc$(EXEEXT): $(elements_y4menc_OBJECTS) $(elements_y4menc_DEPENDENCIES) $(EXTRA_elements_y4menc_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/y4menc$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_y4menc_OBJECTS) $(elements_y4menc_LDADD) $(LIBS) +generic/$(am__dirstamp): + @$(MKDIR_P) generic + @: > generic/$(am__dirstamp) +generic/index$(EXEEXT): $(generic_index_OBJECTS) $(generic_index_DEPENDENCIES) $(EXTRA_generic_index_DEPENDENCIES) generic/$(am__dirstamp) + @rm -f generic/index$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(generic_index_OBJECTS) $(generic_index_LDADD) $(LIBS) +generic/states$(EXEEXT): $(generic_states_OBJECTS) $(generic_states_DEPENDENCIES) $(EXTRA_generic_states_DEPENDENCIES) generic/$(am__dirstamp) + @rm -f generic/states$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(generic_states_OBJECTS) $(generic_states_LDADD) $(LIBS) +orc/$(am__dirstamp): + @$(MKDIR_P) orc + @: > orc/$(am__dirstamp) +orc/deinterlace$(EXEEXT): $(orc_deinterlace_OBJECTS) $(orc_deinterlace_DEPENDENCIES) $(EXTRA_orc_deinterlace_DEPENDENCIES) orc/$(am__dirstamp) + @rm -f orc/deinterlace$(EXEEXT) + $(AM_V_CCLD)$(orc_deinterlace_LINK) $(orc_deinterlace_OBJECTS) $(orc_deinterlace_LDADD) $(LIBS) +orc/videobox$(EXEEXT): $(orc_videobox_OBJECTS) $(orc_videobox_DEPENDENCIES) $(EXTRA_orc_videobox_DEPENDENCIES) orc/$(am__dirstamp) + @rm -f orc/videobox$(EXEEXT) + $(AM_V_CCLD)$(orc_videobox_LINK) $(orc_videobox_OBJECTS) $(orc_videobox_LDADD) $(LIBS) +orc/videomixer$(EXEEXT): $(orc_videomixer_OBJECTS) $(orc_videomixer_DEPENDENCIES) $(EXTRA_orc_videomixer_DEPENDENCIES) orc/$(am__dirstamp) + @rm -f orc/videomixer$(EXEEXT) + $(AM_V_CCLD)$(orc_videomixer_LINK) $(orc_videomixer_OBJECTS) $(orc_videomixer_LDADD) $(LIBS) +pipelines/$(am__dirstamp): + @$(MKDIR_P) pipelines + @: > pipelines/$(am__dirstamp) +pipelines/effectv$(EXEEXT): $(pipelines_effectv_OBJECTS) $(pipelines_effectv_DEPENDENCIES) $(EXTRA_pipelines_effectv_DEPENDENCIES) pipelines/$(am__dirstamp) + @rm -f pipelines/effectv$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pipelines_effectv_OBJECTS) $(pipelines_effectv_LDADD) $(LIBS) +pipelines/flacdec$(EXEEXT): $(pipelines_flacdec_OBJECTS) $(pipelines_flacdec_DEPENDENCIES) $(EXTRA_pipelines_flacdec_DEPENDENCIES) pipelines/$(am__dirstamp) + @rm -f pipelines/flacdec$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pipelines_flacdec_OBJECTS) $(pipelines_flacdec_LDADD) $(LIBS) +pipelines/simple-launch-lines$(EXEEXT): $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_DEPENDENCIES) $(EXTRA_pipelines_simple_launch_lines_DEPENDENCIES) pipelines/$(am__dirstamp) + @rm -f pipelines/simple-launch-lines$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_LDADD) $(LIBS) +pipelines/tagschecking$(EXEEXT): $(pipelines_tagschecking_OBJECTS) $(pipelines_tagschecking_DEPENDENCIES) $(EXTRA_pipelines_tagschecking_DEPENDENCIES) pipelines/$(am__dirstamp) + @rm -f pipelines/tagschecking$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pipelines_tagschecking_OBJECTS) $(pipelines_tagschecking_LDADD) $(LIBS) +pipelines/wavenc$(EXEEXT): $(pipelines_wavenc_OBJECTS) $(pipelines_wavenc_DEPENDENCIES) $(EXTRA_pipelines_wavenc_DEPENDENCIES) pipelines/$(am__dirstamp) + @rm -f pipelines/wavenc$(EXEEXT) + $(AM_V_CCLD)$(pipelines_wavenc_LINK) $(pipelines_wavenc_OBJECTS) $(pipelines_wavenc_LDADD) $(LIBS) +pipelines/wavpack$(EXEEXT): $(pipelines_wavpack_OBJECTS) $(pipelines_wavpack_DEPENDENCIES) $(EXTRA_pipelines_wavpack_DEPENDENCIES) pipelines/$(am__dirstamp) + @rm -f pipelines/wavpack$(EXEEXT) + $(AM_V_CCLD)$(pipelines_wavpack_LINK) $(pipelines_wavpack_OBJECTS) $(pipelines_wavpack_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aacparse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ac3parse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amrparse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apev2mux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audioamplify.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiochebband.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiocheblimit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiodynamic.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audioecho.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiofirfilter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audioiirfilter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audioinvert.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiowsincband.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiowsinclimit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autodetect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avimux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avisubtitle.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/capssetter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/effectv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_alphacolor-alphacolor.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_audiopanorama-audiopanorama.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_cmmldec-cmmldec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_cmmlenc-cmmlenc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_deinterlace-deinterlace.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_deinterleave-deinterleave.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_imagefreeze-imagefreeze.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_interleave-interleave.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_jpegenc-jpegenc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_multifile-multifile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_qtmux-qtmux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_souphttpsrc-souphttpsrc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_sunaudio-sunaudio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_videocrop-videocrop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_videofilter-videofilter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/equalizer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flacdec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flacparse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flvdemux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flvmux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icydemux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id3demux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id3v2mux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/index.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/level.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libparser_la-parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matroskamux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matroskaparse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpegaudioparse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_deinterlace-deinterlace.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_videobox-videobox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_videomixer-videomixer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_wavenc-wavenc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_wavpack-wavpack.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rganalysis.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rglimiter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgvolume.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtp-payloading.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpbin.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpjitterbuffer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shapewipe.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple-launch-lines.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spectrum.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/states.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tagschecking.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udpsink.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavpackdec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavpackenc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavpackparse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/y4menc.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libparser_la-parser.lo: elements/parser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libparser_la_CFLAGS) $(CFLAGS) -MT libparser_la-parser.lo -MD -MP -MF $(DEPDIR)/libparser_la-parser.Tpo -c -o libparser_la-parser.lo `test -f 'elements/parser.c' || echo '$(srcdir)/'`elements/parser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libparser_la-parser.Tpo $(DEPDIR)/libparser_la-parser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/parser.c' object='libparser_la-parser.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libparser_la_CFLAGS) $(CFLAGS) -c -o libparser_la-parser.lo `test -f 'elements/parser.c' || echo '$(srcdir)/'`elements/parser.c + +aacparse.o: elements/aacparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT aacparse.o -MD -MP -MF $(DEPDIR)/aacparse.Tpo -c -o aacparse.o `test -f 'elements/aacparse.c' || echo '$(srcdir)/'`elements/aacparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aacparse.Tpo $(DEPDIR)/aacparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/aacparse.c' object='aacparse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o aacparse.o `test -f 'elements/aacparse.c' || echo '$(srcdir)/'`elements/aacparse.c + +aacparse.obj: elements/aacparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT aacparse.obj -MD -MP -MF $(DEPDIR)/aacparse.Tpo -c -o aacparse.obj `if test -f 'elements/aacparse.c'; then $(CYGPATH_W) 'elements/aacparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/aacparse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aacparse.Tpo $(DEPDIR)/aacparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/aacparse.c' object='aacparse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o aacparse.obj `if test -f 'elements/aacparse.c'; then $(CYGPATH_W) 'elements/aacparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/aacparse.c'; fi` + +ac3parse.o: elements/ac3parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ac3parse.o -MD -MP -MF $(DEPDIR)/ac3parse.Tpo -c -o ac3parse.o `test -f 'elements/ac3parse.c' || echo '$(srcdir)/'`elements/ac3parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ac3parse.Tpo $(DEPDIR)/ac3parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/ac3parse.c' object='ac3parse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ac3parse.o `test -f 'elements/ac3parse.c' || echo '$(srcdir)/'`elements/ac3parse.c + +ac3parse.obj: elements/ac3parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ac3parse.obj -MD -MP -MF $(DEPDIR)/ac3parse.Tpo -c -o ac3parse.obj `if test -f 'elements/ac3parse.c'; then $(CYGPATH_W) 'elements/ac3parse.c'; else $(CYGPATH_W) '$(srcdir)/elements/ac3parse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ac3parse.Tpo $(DEPDIR)/ac3parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/ac3parse.c' object='ac3parse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ac3parse.obj `if test -f 'elements/ac3parse.c'; then $(CYGPATH_W) 'elements/ac3parse.c'; else $(CYGPATH_W) '$(srcdir)/elements/ac3parse.c'; fi` + +elements_alphacolor-alphacolor.o: elements/alphacolor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alphacolor_CFLAGS) $(CFLAGS) -MT elements_alphacolor-alphacolor.o -MD -MP -MF $(DEPDIR)/elements_alphacolor-alphacolor.Tpo -c -o elements_alphacolor-alphacolor.o `test -f 'elements/alphacolor.c' || echo '$(srcdir)/'`elements/alphacolor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_alphacolor-alphacolor.Tpo $(DEPDIR)/elements_alphacolor-alphacolor.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/alphacolor.c' object='elements_alphacolor-alphacolor.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alphacolor_CFLAGS) $(CFLAGS) -c -o elements_alphacolor-alphacolor.o `test -f 'elements/alphacolor.c' || echo '$(srcdir)/'`elements/alphacolor.c + +elements_alphacolor-alphacolor.obj: elements/alphacolor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alphacolor_CFLAGS) $(CFLAGS) -MT elements_alphacolor-alphacolor.obj -MD -MP -MF $(DEPDIR)/elements_alphacolor-alphacolor.Tpo -c -o elements_alphacolor-alphacolor.obj `if test -f 'elements/alphacolor.c'; then $(CYGPATH_W) 'elements/alphacolor.c'; else $(CYGPATH_W) '$(srcdir)/elements/alphacolor.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_alphacolor-alphacolor.Tpo $(DEPDIR)/elements_alphacolor-alphacolor.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/alphacolor.c' object='elements_alphacolor-alphacolor.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alphacolor_CFLAGS) $(CFLAGS) -c -o elements_alphacolor-alphacolor.obj `if test -f 'elements/alphacolor.c'; then $(CYGPATH_W) 'elements/alphacolor.c'; else $(CYGPATH_W) '$(srcdir)/elements/alphacolor.c'; fi` + +amrparse.o: elements/amrparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT amrparse.o -MD -MP -MF $(DEPDIR)/amrparse.Tpo -c -o amrparse.o `test -f 'elements/amrparse.c' || echo '$(srcdir)/'`elements/amrparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/amrparse.Tpo $(DEPDIR)/amrparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/amrparse.c' object='amrparse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o amrparse.o `test -f 'elements/amrparse.c' || echo '$(srcdir)/'`elements/amrparse.c + +amrparse.obj: elements/amrparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT amrparse.obj -MD -MP -MF $(DEPDIR)/amrparse.Tpo -c -o amrparse.obj `if test -f 'elements/amrparse.c'; then $(CYGPATH_W) 'elements/amrparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/amrparse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/amrparse.Tpo $(DEPDIR)/amrparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/amrparse.c' object='amrparse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o amrparse.obj `if test -f 'elements/amrparse.c'; then $(CYGPATH_W) 'elements/amrparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/amrparse.c'; fi` + +apev2mux.o: elements/apev2mux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT apev2mux.o -MD -MP -MF $(DEPDIR)/apev2mux.Tpo -c -o apev2mux.o `test -f 'elements/apev2mux.c' || echo '$(srcdir)/'`elements/apev2mux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/apev2mux.Tpo $(DEPDIR)/apev2mux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/apev2mux.c' object='apev2mux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o apev2mux.o `test -f 'elements/apev2mux.c' || echo '$(srcdir)/'`elements/apev2mux.c + +apev2mux.obj: elements/apev2mux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT apev2mux.obj -MD -MP -MF $(DEPDIR)/apev2mux.Tpo -c -o apev2mux.obj `if test -f 'elements/apev2mux.c'; then $(CYGPATH_W) 'elements/apev2mux.c'; else $(CYGPATH_W) '$(srcdir)/elements/apev2mux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/apev2mux.Tpo $(DEPDIR)/apev2mux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/apev2mux.c' object='apev2mux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o apev2mux.obj `if test -f 'elements/apev2mux.c'; then $(CYGPATH_W) 'elements/apev2mux.c'; else $(CYGPATH_W) '$(srcdir)/elements/apev2mux.c'; fi` + +elements_aspectratiocrop-aspectratiocrop.o: elements/aspectratiocrop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) -MT elements_aspectratiocrop-aspectratiocrop.o -MD -MP -MF $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Tpo -c -o elements_aspectratiocrop-aspectratiocrop.o `test -f 'elements/aspectratiocrop.c' || echo '$(srcdir)/'`elements/aspectratiocrop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Tpo $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/aspectratiocrop.c' object='elements_aspectratiocrop-aspectratiocrop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) -c -o elements_aspectratiocrop-aspectratiocrop.o `test -f 'elements/aspectratiocrop.c' || echo '$(srcdir)/'`elements/aspectratiocrop.c + +elements_aspectratiocrop-aspectratiocrop.obj: elements/aspectratiocrop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) -MT elements_aspectratiocrop-aspectratiocrop.obj -MD -MP -MF $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Tpo -c -o elements_aspectratiocrop-aspectratiocrop.obj `if test -f 'elements/aspectratiocrop.c'; then $(CYGPATH_W) 'elements/aspectratiocrop.c'; else $(CYGPATH_W) '$(srcdir)/elements/aspectratiocrop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Tpo $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/aspectratiocrop.c' object='elements_aspectratiocrop-aspectratiocrop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) -c -o elements_aspectratiocrop-aspectratiocrop.obj `if test -f 'elements/aspectratiocrop.c'; then $(CYGPATH_W) 'elements/aspectratiocrop.c'; else $(CYGPATH_W) '$(srcdir)/elements/aspectratiocrop.c'; fi` + +audioamplify.o: elements/audioamplify.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioamplify.o -MD -MP -MF $(DEPDIR)/audioamplify.Tpo -c -o audioamplify.o `test -f 'elements/audioamplify.c' || echo '$(srcdir)/'`elements/audioamplify.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioamplify.Tpo $(DEPDIR)/audioamplify.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioamplify.c' object='audioamplify.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioamplify.o `test -f 'elements/audioamplify.c' || echo '$(srcdir)/'`elements/audioamplify.c + +audioamplify.obj: elements/audioamplify.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioamplify.obj -MD -MP -MF $(DEPDIR)/audioamplify.Tpo -c -o audioamplify.obj `if test -f 'elements/audioamplify.c'; then $(CYGPATH_W) 'elements/audioamplify.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioamplify.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioamplify.Tpo $(DEPDIR)/audioamplify.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioamplify.c' object='audioamplify.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioamplify.obj `if test -f 'elements/audioamplify.c'; then $(CYGPATH_W) 'elements/audioamplify.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioamplify.c'; fi` + +audiochebband.o: elements/audiochebband.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiochebband.o -MD -MP -MF $(DEPDIR)/audiochebband.Tpo -c -o audiochebband.o `test -f 'elements/audiochebband.c' || echo '$(srcdir)/'`elements/audiochebband.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiochebband.Tpo $(DEPDIR)/audiochebband.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiochebband.c' object='audiochebband.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiochebband.o `test -f 'elements/audiochebband.c' || echo '$(srcdir)/'`elements/audiochebband.c + +audiochebband.obj: elements/audiochebband.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiochebband.obj -MD -MP -MF $(DEPDIR)/audiochebband.Tpo -c -o audiochebband.obj `if test -f 'elements/audiochebband.c'; then $(CYGPATH_W) 'elements/audiochebband.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiochebband.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiochebband.Tpo $(DEPDIR)/audiochebband.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiochebband.c' object='audiochebband.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiochebband.obj `if test -f 'elements/audiochebband.c'; then $(CYGPATH_W) 'elements/audiochebband.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiochebband.c'; fi` + +audiocheblimit.o: elements/audiocheblimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiocheblimit.o -MD -MP -MF $(DEPDIR)/audiocheblimit.Tpo -c -o audiocheblimit.o `test -f 'elements/audiocheblimit.c' || echo '$(srcdir)/'`elements/audiocheblimit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiocheblimit.Tpo $(DEPDIR)/audiocheblimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiocheblimit.c' object='audiocheblimit.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiocheblimit.o `test -f 'elements/audiocheblimit.c' || echo '$(srcdir)/'`elements/audiocheblimit.c + +audiocheblimit.obj: elements/audiocheblimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiocheblimit.obj -MD -MP -MF $(DEPDIR)/audiocheblimit.Tpo -c -o audiocheblimit.obj `if test -f 'elements/audiocheblimit.c'; then $(CYGPATH_W) 'elements/audiocheblimit.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiocheblimit.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiocheblimit.Tpo $(DEPDIR)/audiocheblimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiocheblimit.c' object='audiocheblimit.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiocheblimit.obj `if test -f 'elements/audiocheblimit.c'; then $(CYGPATH_W) 'elements/audiocheblimit.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiocheblimit.c'; fi` + +audiodynamic.o: elements/audiodynamic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiodynamic.o -MD -MP -MF $(DEPDIR)/audiodynamic.Tpo -c -o audiodynamic.o `test -f 'elements/audiodynamic.c' || echo '$(srcdir)/'`elements/audiodynamic.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiodynamic.Tpo $(DEPDIR)/audiodynamic.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiodynamic.c' object='audiodynamic.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiodynamic.o `test -f 'elements/audiodynamic.c' || echo '$(srcdir)/'`elements/audiodynamic.c + +audiodynamic.obj: elements/audiodynamic.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiodynamic.obj -MD -MP -MF $(DEPDIR)/audiodynamic.Tpo -c -o audiodynamic.obj `if test -f 'elements/audiodynamic.c'; then $(CYGPATH_W) 'elements/audiodynamic.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiodynamic.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiodynamic.Tpo $(DEPDIR)/audiodynamic.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiodynamic.c' object='audiodynamic.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiodynamic.obj `if test -f 'elements/audiodynamic.c'; then $(CYGPATH_W) 'elements/audiodynamic.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiodynamic.c'; fi` + +audioecho.o: elements/audioecho.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioecho.o -MD -MP -MF $(DEPDIR)/audioecho.Tpo -c -o audioecho.o `test -f 'elements/audioecho.c' || echo '$(srcdir)/'`elements/audioecho.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioecho.Tpo $(DEPDIR)/audioecho.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioecho.c' object='audioecho.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioecho.o `test -f 'elements/audioecho.c' || echo '$(srcdir)/'`elements/audioecho.c + +audioecho.obj: elements/audioecho.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioecho.obj -MD -MP -MF $(DEPDIR)/audioecho.Tpo -c -o audioecho.obj `if test -f 'elements/audioecho.c'; then $(CYGPATH_W) 'elements/audioecho.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioecho.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioecho.Tpo $(DEPDIR)/audioecho.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioecho.c' object='audioecho.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioecho.obj `if test -f 'elements/audioecho.c'; then $(CYGPATH_W) 'elements/audioecho.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioecho.c'; fi` + +audiofirfilter.o: elements/audiofirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiofirfilter.o -MD -MP -MF $(DEPDIR)/audiofirfilter.Tpo -c -o audiofirfilter.o `test -f 'elements/audiofirfilter.c' || echo '$(srcdir)/'`elements/audiofirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiofirfilter.Tpo $(DEPDIR)/audiofirfilter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiofirfilter.c' object='audiofirfilter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiofirfilter.o `test -f 'elements/audiofirfilter.c' || echo '$(srcdir)/'`elements/audiofirfilter.c + +audiofirfilter.obj: elements/audiofirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiofirfilter.obj -MD -MP -MF $(DEPDIR)/audiofirfilter.Tpo -c -o audiofirfilter.obj `if test -f 'elements/audiofirfilter.c'; then $(CYGPATH_W) 'elements/audiofirfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiofirfilter.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiofirfilter.Tpo $(DEPDIR)/audiofirfilter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiofirfilter.c' object='audiofirfilter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiofirfilter.obj `if test -f 'elements/audiofirfilter.c'; then $(CYGPATH_W) 'elements/audiofirfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiofirfilter.c'; fi` + +audioiirfilter.o: elements/audioiirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioiirfilter.o -MD -MP -MF $(DEPDIR)/audioiirfilter.Tpo -c -o audioiirfilter.o `test -f 'elements/audioiirfilter.c' || echo '$(srcdir)/'`elements/audioiirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioiirfilter.Tpo $(DEPDIR)/audioiirfilter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioiirfilter.c' object='audioiirfilter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioiirfilter.o `test -f 'elements/audioiirfilter.c' || echo '$(srcdir)/'`elements/audioiirfilter.c + +audioiirfilter.obj: elements/audioiirfilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioiirfilter.obj -MD -MP -MF $(DEPDIR)/audioiirfilter.Tpo -c -o audioiirfilter.obj `if test -f 'elements/audioiirfilter.c'; then $(CYGPATH_W) 'elements/audioiirfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioiirfilter.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioiirfilter.Tpo $(DEPDIR)/audioiirfilter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioiirfilter.c' object='audioiirfilter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioiirfilter.obj `if test -f 'elements/audioiirfilter.c'; then $(CYGPATH_W) 'elements/audioiirfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioiirfilter.c'; fi` + +audioinvert.o: elements/audioinvert.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioinvert.o -MD -MP -MF $(DEPDIR)/audioinvert.Tpo -c -o audioinvert.o `test -f 'elements/audioinvert.c' || echo '$(srcdir)/'`elements/audioinvert.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioinvert.Tpo $(DEPDIR)/audioinvert.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioinvert.c' object='audioinvert.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioinvert.o `test -f 'elements/audioinvert.c' || echo '$(srcdir)/'`elements/audioinvert.c + +audioinvert.obj: elements/audioinvert.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioinvert.obj -MD -MP -MF $(DEPDIR)/audioinvert.Tpo -c -o audioinvert.obj `if test -f 'elements/audioinvert.c'; then $(CYGPATH_W) 'elements/audioinvert.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioinvert.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioinvert.Tpo $(DEPDIR)/audioinvert.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioinvert.c' object='audioinvert.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioinvert.obj `if test -f 'elements/audioinvert.c'; then $(CYGPATH_W) 'elements/audioinvert.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioinvert.c'; fi` + +elements_audiopanorama-audiopanorama.o: elements/audiopanorama.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiopanorama_CFLAGS) $(CFLAGS) -MT elements_audiopanorama-audiopanorama.o -MD -MP -MF $(DEPDIR)/elements_audiopanorama-audiopanorama.Tpo -c -o elements_audiopanorama-audiopanorama.o `test -f 'elements/audiopanorama.c' || echo '$(srcdir)/'`elements/audiopanorama.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_audiopanorama-audiopanorama.Tpo $(DEPDIR)/elements_audiopanorama-audiopanorama.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiopanorama.c' object='elements_audiopanorama-audiopanorama.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiopanorama_CFLAGS) $(CFLAGS) -c -o elements_audiopanorama-audiopanorama.o `test -f 'elements/audiopanorama.c' || echo '$(srcdir)/'`elements/audiopanorama.c + +elements_audiopanorama-audiopanorama.obj: elements/audiopanorama.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiopanorama_CFLAGS) $(CFLAGS) -MT elements_audiopanorama-audiopanorama.obj -MD -MP -MF $(DEPDIR)/elements_audiopanorama-audiopanorama.Tpo -c -o elements_audiopanorama-audiopanorama.obj `if test -f 'elements/audiopanorama.c'; then $(CYGPATH_W) 'elements/audiopanorama.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiopanorama.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_audiopanorama-audiopanorama.Tpo $(DEPDIR)/elements_audiopanorama-audiopanorama.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiopanorama.c' object='elements_audiopanorama-audiopanorama.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiopanorama_CFLAGS) $(CFLAGS) -c -o elements_audiopanorama-audiopanorama.obj `if test -f 'elements/audiopanorama.c'; then $(CYGPATH_W) 'elements/audiopanorama.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiopanorama.c'; fi` + +audiowsincband.o: elements/audiowsincband.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiowsincband.o -MD -MP -MF $(DEPDIR)/audiowsincband.Tpo -c -o audiowsincband.o `test -f 'elements/audiowsincband.c' || echo '$(srcdir)/'`elements/audiowsincband.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiowsincband.Tpo $(DEPDIR)/audiowsincband.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiowsincband.c' object='audiowsincband.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiowsincband.o `test -f 'elements/audiowsincband.c' || echo '$(srcdir)/'`elements/audiowsincband.c + +audiowsincband.obj: elements/audiowsincband.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiowsincband.obj -MD -MP -MF $(DEPDIR)/audiowsincband.Tpo -c -o audiowsincband.obj `if test -f 'elements/audiowsincband.c'; then $(CYGPATH_W) 'elements/audiowsincband.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiowsincband.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiowsincband.Tpo $(DEPDIR)/audiowsincband.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiowsincband.c' object='audiowsincband.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiowsincband.obj `if test -f 'elements/audiowsincband.c'; then $(CYGPATH_W) 'elements/audiowsincband.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiowsincband.c'; fi` + +audiowsinclimit.o: elements/audiowsinclimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiowsinclimit.o -MD -MP -MF $(DEPDIR)/audiowsinclimit.Tpo -c -o audiowsinclimit.o `test -f 'elements/audiowsinclimit.c' || echo '$(srcdir)/'`elements/audiowsinclimit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiowsinclimit.Tpo $(DEPDIR)/audiowsinclimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiowsinclimit.c' object='audiowsinclimit.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiowsinclimit.o `test -f 'elements/audiowsinclimit.c' || echo '$(srcdir)/'`elements/audiowsinclimit.c + +audiowsinclimit.obj: elements/audiowsinclimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiowsinclimit.obj -MD -MP -MF $(DEPDIR)/audiowsinclimit.Tpo -c -o audiowsinclimit.obj `if test -f 'elements/audiowsinclimit.c'; then $(CYGPATH_W) 'elements/audiowsinclimit.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiowsinclimit.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiowsinclimit.Tpo $(DEPDIR)/audiowsinclimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiowsinclimit.c' object='audiowsinclimit.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiowsinclimit.obj `if test -f 'elements/audiowsinclimit.c'; then $(CYGPATH_W) 'elements/audiowsinclimit.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiowsinclimit.c'; fi` + +autodetect.o: elements/autodetect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT autodetect.o -MD -MP -MF $(DEPDIR)/autodetect.Tpo -c -o autodetect.o `test -f 'elements/autodetect.c' || echo '$(srcdir)/'`elements/autodetect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autodetect.Tpo $(DEPDIR)/autodetect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/autodetect.c' object='autodetect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o autodetect.o `test -f 'elements/autodetect.c' || echo '$(srcdir)/'`elements/autodetect.c + +autodetect.obj: elements/autodetect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT autodetect.obj -MD -MP -MF $(DEPDIR)/autodetect.Tpo -c -o autodetect.obj `if test -f 'elements/autodetect.c'; then $(CYGPATH_W) 'elements/autodetect.c'; else $(CYGPATH_W) '$(srcdir)/elements/autodetect.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autodetect.Tpo $(DEPDIR)/autodetect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/autodetect.c' object='autodetect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o autodetect.obj `if test -f 'elements/autodetect.c'; then $(CYGPATH_W) 'elements/autodetect.c'; else $(CYGPATH_W) '$(srcdir)/elements/autodetect.c'; fi` + +avimux.o: elements/avimux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avimux.o -MD -MP -MF $(DEPDIR)/avimux.Tpo -c -o avimux.o `test -f 'elements/avimux.c' || echo '$(srcdir)/'`elements/avimux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/avimux.Tpo $(DEPDIR)/avimux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/avimux.c' object='avimux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avimux.o `test -f 'elements/avimux.c' || echo '$(srcdir)/'`elements/avimux.c + +avimux.obj: elements/avimux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avimux.obj -MD -MP -MF $(DEPDIR)/avimux.Tpo -c -o avimux.obj `if test -f 'elements/avimux.c'; then $(CYGPATH_W) 'elements/avimux.c'; else $(CYGPATH_W) '$(srcdir)/elements/avimux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/avimux.Tpo $(DEPDIR)/avimux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/avimux.c' object='avimux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avimux.obj `if test -f 'elements/avimux.c'; then $(CYGPATH_W) 'elements/avimux.c'; else $(CYGPATH_W) '$(srcdir)/elements/avimux.c'; fi` + +avisubtitle.o: elements/avisubtitle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avisubtitle.o -MD -MP -MF $(DEPDIR)/avisubtitle.Tpo -c -o avisubtitle.o `test -f 'elements/avisubtitle.c' || echo '$(srcdir)/'`elements/avisubtitle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/avisubtitle.Tpo $(DEPDIR)/avisubtitle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/avisubtitle.c' object='avisubtitle.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avisubtitle.o `test -f 'elements/avisubtitle.c' || echo '$(srcdir)/'`elements/avisubtitle.c + +avisubtitle.obj: elements/avisubtitle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avisubtitle.obj -MD -MP -MF $(DEPDIR)/avisubtitle.Tpo -c -o avisubtitle.obj `if test -f 'elements/avisubtitle.c'; then $(CYGPATH_W) 'elements/avisubtitle.c'; else $(CYGPATH_W) '$(srcdir)/elements/avisubtitle.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/avisubtitle.Tpo $(DEPDIR)/avisubtitle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/avisubtitle.c' object='avisubtitle.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avisubtitle.obj `if test -f 'elements/avisubtitle.c'; then $(CYGPATH_W) 'elements/avisubtitle.c'; else $(CYGPATH_W) '$(srcdir)/elements/avisubtitle.c'; fi` + +capssetter.o: elements/capssetter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT capssetter.o -MD -MP -MF $(DEPDIR)/capssetter.Tpo -c -o capssetter.o `test -f 'elements/capssetter.c' || echo '$(srcdir)/'`elements/capssetter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/capssetter.Tpo $(DEPDIR)/capssetter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/capssetter.c' object='capssetter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o capssetter.o `test -f 'elements/capssetter.c' || echo '$(srcdir)/'`elements/capssetter.c + +capssetter.obj: elements/capssetter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT capssetter.obj -MD -MP -MF $(DEPDIR)/capssetter.Tpo -c -o capssetter.obj `if test -f 'elements/capssetter.c'; then $(CYGPATH_W) 'elements/capssetter.c'; else $(CYGPATH_W) '$(srcdir)/elements/capssetter.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/capssetter.Tpo $(DEPDIR)/capssetter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/capssetter.c' object='capssetter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o capssetter.obj `if test -f 'elements/capssetter.c'; then $(CYGPATH_W) 'elements/capssetter.c'; else $(CYGPATH_W) '$(srcdir)/elements/capssetter.c'; fi` + +elements_cmmldec-cmmldec.o: elements/cmmldec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmldec_CFLAGS) $(CFLAGS) -MT elements_cmmldec-cmmldec.o -MD -MP -MF $(DEPDIR)/elements_cmmldec-cmmldec.Tpo -c -o elements_cmmldec-cmmldec.o `test -f 'elements/cmmldec.c' || echo '$(srcdir)/'`elements/cmmldec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_cmmldec-cmmldec.Tpo $(DEPDIR)/elements_cmmldec-cmmldec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/cmmldec.c' object='elements_cmmldec-cmmldec.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmldec_CFLAGS) $(CFLAGS) -c -o elements_cmmldec-cmmldec.o `test -f 'elements/cmmldec.c' || echo '$(srcdir)/'`elements/cmmldec.c + +elements_cmmldec-cmmldec.obj: elements/cmmldec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmldec_CFLAGS) $(CFLAGS) -MT elements_cmmldec-cmmldec.obj -MD -MP -MF $(DEPDIR)/elements_cmmldec-cmmldec.Tpo -c -o elements_cmmldec-cmmldec.obj `if test -f 'elements/cmmldec.c'; then $(CYGPATH_W) 'elements/cmmldec.c'; else $(CYGPATH_W) '$(srcdir)/elements/cmmldec.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_cmmldec-cmmldec.Tpo $(DEPDIR)/elements_cmmldec-cmmldec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/cmmldec.c' object='elements_cmmldec-cmmldec.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmldec_CFLAGS) $(CFLAGS) -c -o elements_cmmldec-cmmldec.obj `if test -f 'elements/cmmldec.c'; then $(CYGPATH_W) 'elements/cmmldec.c'; else $(CYGPATH_W) '$(srcdir)/elements/cmmldec.c'; fi` + +elements_cmmlenc-cmmlenc.o: elements/cmmlenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmlenc_CFLAGS) $(CFLAGS) -MT elements_cmmlenc-cmmlenc.o -MD -MP -MF $(DEPDIR)/elements_cmmlenc-cmmlenc.Tpo -c -o elements_cmmlenc-cmmlenc.o `test -f 'elements/cmmlenc.c' || echo '$(srcdir)/'`elements/cmmlenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_cmmlenc-cmmlenc.Tpo $(DEPDIR)/elements_cmmlenc-cmmlenc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/cmmlenc.c' object='elements_cmmlenc-cmmlenc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmlenc_CFLAGS) $(CFLAGS) -c -o elements_cmmlenc-cmmlenc.o `test -f 'elements/cmmlenc.c' || echo '$(srcdir)/'`elements/cmmlenc.c + +elements_cmmlenc-cmmlenc.obj: elements/cmmlenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmlenc_CFLAGS) $(CFLAGS) -MT elements_cmmlenc-cmmlenc.obj -MD -MP -MF $(DEPDIR)/elements_cmmlenc-cmmlenc.Tpo -c -o elements_cmmlenc-cmmlenc.obj `if test -f 'elements/cmmlenc.c'; then $(CYGPATH_W) 'elements/cmmlenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/cmmlenc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_cmmlenc-cmmlenc.Tpo $(DEPDIR)/elements_cmmlenc-cmmlenc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/cmmlenc.c' object='elements_cmmlenc-cmmlenc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmlenc_CFLAGS) $(CFLAGS) -c -o elements_cmmlenc-cmmlenc.obj `if test -f 'elements/cmmlenc.c'; then $(CYGPATH_W) 'elements/cmmlenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/cmmlenc.c'; fi` + +elements_deinterlace-deinterlace.o: elements/deinterlace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterlace_CFLAGS) $(CFLAGS) -MT elements_deinterlace-deinterlace.o -MD -MP -MF $(DEPDIR)/elements_deinterlace-deinterlace.Tpo -c -o elements_deinterlace-deinterlace.o `test -f 'elements/deinterlace.c' || echo '$(srcdir)/'`elements/deinterlace.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_deinterlace-deinterlace.Tpo $(DEPDIR)/elements_deinterlace-deinterlace.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/deinterlace.c' object='elements_deinterlace-deinterlace.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterlace_CFLAGS) $(CFLAGS) -c -o elements_deinterlace-deinterlace.o `test -f 'elements/deinterlace.c' || echo '$(srcdir)/'`elements/deinterlace.c + +elements_deinterlace-deinterlace.obj: elements/deinterlace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterlace_CFLAGS) $(CFLAGS) -MT elements_deinterlace-deinterlace.obj -MD -MP -MF $(DEPDIR)/elements_deinterlace-deinterlace.Tpo -c -o elements_deinterlace-deinterlace.obj `if test -f 'elements/deinterlace.c'; then $(CYGPATH_W) 'elements/deinterlace.c'; else $(CYGPATH_W) '$(srcdir)/elements/deinterlace.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_deinterlace-deinterlace.Tpo $(DEPDIR)/elements_deinterlace-deinterlace.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/deinterlace.c' object='elements_deinterlace-deinterlace.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterlace_CFLAGS) $(CFLAGS) -c -o elements_deinterlace-deinterlace.obj `if test -f 'elements/deinterlace.c'; then $(CYGPATH_W) 'elements/deinterlace.c'; else $(CYGPATH_W) '$(srcdir)/elements/deinterlace.c'; fi` + +elements_deinterleave-deinterleave.o: elements/deinterleave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterleave_CFLAGS) $(CFLAGS) -MT elements_deinterleave-deinterleave.o -MD -MP -MF $(DEPDIR)/elements_deinterleave-deinterleave.Tpo -c -o elements_deinterleave-deinterleave.o `test -f 'elements/deinterleave.c' || echo '$(srcdir)/'`elements/deinterleave.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_deinterleave-deinterleave.Tpo $(DEPDIR)/elements_deinterleave-deinterleave.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/deinterleave.c' object='elements_deinterleave-deinterleave.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterleave_CFLAGS) $(CFLAGS) -c -o elements_deinterleave-deinterleave.o `test -f 'elements/deinterleave.c' || echo '$(srcdir)/'`elements/deinterleave.c + +elements_deinterleave-deinterleave.obj: elements/deinterleave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterleave_CFLAGS) $(CFLAGS) -MT elements_deinterleave-deinterleave.obj -MD -MP -MF $(DEPDIR)/elements_deinterleave-deinterleave.Tpo -c -o elements_deinterleave-deinterleave.obj `if test -f 'elements/deinterleave.c'; then $(CYGPATH_W) 'elements/deinterleave.c'; else $(CYGPATH_W) '$(srcdir)/elements/deinterleave.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_deinterleave-deinterleave.Tpo $(DEPDIR)/elements_deinterleave-deinterleave.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/deinterleave.c' object='elements_deinterleave-deinterleave.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterleave_CFLAGS) $(CFLAGS) -c -o elements_deinterleave-deinterleave.obj `if test -f 'elements/deinterleave.c'; then $(CYGPATH_W) 'elements/deinterleave.c'; else $(CYGPATH_W) '$(srcdir)/elements/deinterleave.c'; fi` + +equalizer.o: elements/equalizer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT equalizer.o -MD -MP -MF $(DEPDIR)/equalizer.Tpo -c -o equalizer.o `test -f 'elements/equalizer.c' || echo '$(srcdir)/'`elements/equalizer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/equalizer.Tpo $(DEPDIR)/equalizer.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/equalizer.c' object='equalizer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o equalizer.o `test -f 'elements/equalizer.c' || echo '$(srcdir)/'`elements/equalizer.c + +equalizer.obj: elements/equalizer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT equalizer.obj -MD -MP -MF $(DEPDIR)/equalizer.Tpo -c -o equalizer.obj `if test -f 'elements/equalizer.c'; then $(CYGPATH_W) 'elements/equalizer.c'; else $(CYGPATH_W) '$(srcdir)/elements/equalizer.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/equalizer.Tpo $(DEPDIR)/equalizer.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/equalizer.c' object='equalizer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o equalizer.obj `if test -f 'elements/equalizer.c'; then $(CYGPATH_W) 'elements/equalizer.c'; else $(CYGPATH_W) '$(srcdir)/elements/equalizer.c'; fi` + +flacparse.o: elements/flacparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flacparse.o -MD -MP -MF $(DEPDIR)/flacparse.Tpo -c -o flacparse.o `test -f 'elements/flacparse.c' || echo '$(srcdir)/'`elements/flacparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flacparse.Tpo $(DEPDIR)/flacparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flacparse.c' object='flacparse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flacparse.o `test -f 'elements/flacparse.c' || echo '$(srcdir)/'`elements/flacparse.c + +flacparse.obj: elements/flacparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flacparse.obj -MD -MP -MF $(DEPDIR)/flacparse.Tpo -c -o flacparse.obj `if test -f 'elements/flacparse.c'; then $(CYGPATH_W) 'elements/flacparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/flacparse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flacparse.Tpo $(DEPDIR)/flacparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flacparse.c' object='flacparse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flacparse.obj `if test -f 'elements/flacparse.c'; then $(CYGPATH_W) 'elements/flacparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/flacparse.c'; fi` + +flvdemux.o: elements/flvdemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flvdemux.o -MD -MP -MF $(DEPDIR)/flvdemux.Tpo -c -o flvdemux.o `test -f 'elements/flvdemux.c' || echo '$(srcdir)/'`elements/flvdemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flvdemux.Tpo $(DEPDIR)/flvdemux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flvdemux.c' object='flvdemux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flvdemux.o `test -f 'elements/flvdemux.c' || echo '$(srcdir)/'`elements/flvdemux.c + +flvdemux.obj: elements/flvdemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flvdemux.obj -MD -MP -MF $(DEPDIR)/flvdemux.Tpo -c -o flvdemux.obj `if test -f 'elements/flvdemux.c'; then $(CYGPATH_W) 'elements/flvdemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/flvdemux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flvdemux.Tpo $(DEPDIR)/flvdemux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flvdemux.c' object='flvdemux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flvdemux.obj `if test -f 'elements/flvdemux.c'; then $(CYGPATH_W) 'elements/flvdemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/flvdemux.c'; fi` + +flvmux.o: elements/flvmux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flvmux.o -MD -MP -MF $(DEPDIR)/flvmux.Tpo -c -o flvmux.o `test -f 'elements/flvmux.c' || echo '$(srcdir)/'`elements/flvmux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flvmux.Tpo $(DEPDIR)/flvmux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flvmux.c' object='flvmux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flvmux.o `test -f 'elements/flvmux.c' || echo '$(srcdir)/'`elements/flvmux.c + +flvmux.obj: elements/flvmux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flvmux.obj -MD -MP -MF $(DEPDIR)/flvmux.Tpo -c -o flvmux.obj `if test -f 'elements/flvmux.c'; then $(CYGPATH_W) 'elements/flvmux.c'; else $(CYGPATH_W) '$(srcdir)/elements/flvmux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flvmux.Tpo $(DEPDIR)/flvmux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flvmux.c' object='flvmux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flvmux.obj `if test -f 'elements/flvmux.c'; then $(CYGPATH_W) 'elements/flvmux.c'; else $(CYGPATH_W) '$(srcdir)/elements/flvmux.c'; fi` + +elements_gdkpixbufsink-gdkpixbufsink.o: elements/gdkpixbufsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) -MT elements_gdkpixbufsink-gdkpixbufsink.o -MD -MP -MF $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Tpo -c -o elements_gdkpixbufsink-gdkpixbufsink.o `test -f 'elements/gdkpixbufsink.c' || echo '$(srcdir)/'`elements/gdkpixbufsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Tpo $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/gdkpixbufsink.c' object='elements_gdkpixbufsink-gdkpixbufsink.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) -c -o elements_gdkpixbufsink-gdkpixbufsink.o `test -f 'elements/gdkpixbufsink.c' || echo '$(srcdir)/'`elements/gdkpixbufsink.c + +elements_gdkpixbufsink-gdkpixbufsink.obj: elements/gdkpixbufsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) -MT elements_gdkpixbufsink-gdkpixbufsink.obj -MD -MP -MF $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Tpo -c -o elements_gdkpixbufsink-gdkpixbufsink.obj `if test -f 'elements/gdkpixbufsink.c'; then $(CYGPATH_W) 'elements/gdkpixbufsink.c'; else $(CYGPATH_W) '$(srcdir)/elements/gdkpixbufsink.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Tpo $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/gdkpixbufsink.c' object='elements_gdkpixbufsink-gdkpixbufsink.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) -c -o elements_gdkpixbufsink-gdkpixbufsink.obj `if test -f 'elements/gdkpixbufsink.c'; then $(CYGPATH_W) 'elements/gdkpixbufsink.c'; else $(CYGPATH_W) '$(srcdir)/elements/gdkpixbufsink.c'; fi` + +icydemux.o: elements/icydemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT icydemux.o -MD -MP -MF $(DEPDIR)/icydemux.Tpo -c -o icydemux.o `test -f 'elements/icydemux.c' || echo '$(srcdir)/'`elements/icydemux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/icydemux.Tpo $(DEPDIR)/icydemux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/icydemux.c' object='icydemux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o icydemux.o `test -f 'elements/icydemux.c' || echo '$(srcdir)/'`elements/icydemux.c + +icydemux.obj: elements/icydemux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT icydemux.obj -MD -MP -MF $(DEPDIR)/icydemux.Tpo -c -o icydemux.obj `if test -f 'elements/icydemux.c'; then $(CYGPATH_W) 'elements/icydemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/icydemux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/icydemux.Tpo $(DEPDIR)/icydemux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/icydemux.c' object='icydemux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o icydemux.obj `if test -f 'elements/icydemux.c'; then $(CYGPATH_W) 'elements/icydemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/icydemux.c'; fi` + +id3demux.o: elements/id3demux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT id3demux.o -MD -MP -MF $(DEPDIR)/id3demux.Tpo -c -o id3demux.o `test -f 'elements/id3demux.c' || echo '$(srcdir)/'`elements/id3demux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/id3demux.Tpo $(DEPDIR)/id3demux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/id3demux.c' object='id3demux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o id3demux.o `test -f 'elements/id3demux.c' || echo '$(srcdir)/'`elements/id3demux.c + +id3demux.obj: elements/id3demux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT id3demux.obj -MD -MP -MF $(DEPDIR)/id3demux.Tpo -c -o id3demux.obj `if test -f 'elements/id3demux.c'; then $(CYGPATH_W) 'elements/id3demux.c'; else $(CYGPATH_W) '$(srcdir)/elements/id3demux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/id3demux.Tpo $(DEPDIR)/id3demux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/id3demux.c' object='id3demux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o id3demux.obj `if test -f 'elements/id3demux.c'; then $(CYGPATH_W) 'elements/id3demux.c'; else $(CYGPATH_W) '$(srcdir)/elements/id3demux.c'; fi` + +id3v2mux.o: elements/id3v2mux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT id3v2mux.o -MD -MP -MF $(DEPDIR)/id3v2mux.Tpo -c -o id3v2mux.o `test -f 'elements/id3v2mux.c' || echo '$(srcdir)/'`elements/id3v2mux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/id3v2mux.Tpo $(DEPDIR)/id3v2mux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/id3v2mux.c' object='id3v2mux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o id3v2mux.o `test -f 'elements/id3v2mux.c' || echo '$(srcdir)/'`elements/id3v2mux.c + +id3v2mux.obj: elements/id3v2mux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT id3v2mux.obj -MD -MP -MF $(DEPDIR)/id3v2mux.Tpo -c -o id3v2mux.obj `if test -f 'elements/id3v2mux.c'; then $(CYGPATH_W) 'elements/id3v2mux.c'; else $(CYGPATH_W) '$(srcdir)/elements/id3v2mux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/id3v2mux.Tpo $(DEPDIR)/id3v2mux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/id3v2mux.c' object='id3v2mux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o id3v2mux.obj `if test -f 'elements/id3v2mux.c'; then $(CYGPATH_W) 'elements/id3v2mux.c'; else $(CYGPATH_W) '$(srcdir)/elements/id3v2mux.c'; fi` + +elements_imagefreeze-imagefreeze.o: elements/imagefreeze.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_imagefreeze_CFLAGS) $(CFLAGS) -MT elements_imagefreeze-imagefreeze.o -MD -MP -MF $(DEPDIR)/elements_imagefreeze-imagefreeze.Tpo -c -o elements_imagefreeze-imagefreeze.o `test -f 'elements/imagefreeze.c' || echo '$(srcdir)/'`elements/imagefreeze.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_imagefreeze-imagefreeze.Tpo $(DEPDIR)/elements_imagefreeze-imagefreeze.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/imagefreeze.c' object='elements_imagefreeze-imagefreeze.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_imagefreeze_CFLAGS) $(CFLAGS) -c -o elements_imagefreeze-imagefreeze.o `test -f 'elements/imagefreeze.c' || echo '$(srcdir)/'`elements/imagefreeze.c + +elements_imagefreeze-imagefreeze.obj: elements/imagefreeze.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_imagefreeze_CFLAGS) $(CFLAGS) -MT elements_imagefreeze-imagefreeze.obj -MD -MP -MF $(DEPDIR)/elements_imagefreeze-imagefreeze.Tpo -c -o elements_imagefreeze-imagefreeze.obj `if test -f 'elements/imagefreeze.c'; then $(CYGPATH_W) 'elements/imagefreeze.c'; else $(CYGPATH_W) '$(srcdir)/elements/imagefreeze.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_imagefreeze-imagefreeze.Tpo $(DEPDIR)/elements_imagefreeze-imagefreeze.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/imagefreeze.c' object='elements_imagefreeze-imagefreeze.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_imagefreeze_CFLAGS) $(CFLAGS) -c -o elements_imagefreeze-imagefreeze.obj `if test -f 'elements/imagefreeze.c'; then $(CYGPATH_W) 'elements/imagefreeze.c'; else $(CYGPATH_W) '$(srcdir)/elements/imagefreeze.c'; fi` + +elements_interleave-interleave.o: elements/interleave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_interleave_CFLAGS) $(CFLAGS) -MT elements_interleave-interleave.o -MD -MP -MF $(DEPDIR)/elements_interleave-interleave.Tpo -c -o elements_interleave-interleave.o `test -f 'elements/interleave.c' || echo '$(srcdir)/'`elements/interleave.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_interleave-interleave.Tpo $(DEPDIR)/elements_interleave-interleave.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/interleave.c' object='elements_interleave-interleave.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_interleave_CFLAGS) $(CFLAGS) -c -o elements_interleave-interleave.o `test -f 'elements/interleave.c' || echo '$(srcdir)/'`elements/interleave.c + +elements_interleave-interleave.obj: elements/interleave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_interleave_CFLAGS) $(CFLAGS) -MT elements_interleave-interleave.obj -MD -MP -MF $(DEPDIR)/elements_interleave-interleave.Tpo -c -o elements_interleave-interleave.obj `if test -f 'elements/interleave.c'; then $(CYGPATH_W) 'elements/interleave.c'; else $(CYGPATH_W) '$(srcdir)/elements/interleave.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_interleave-interleave.Tpo $(DEPDIR)/elements_interleave-interleave.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/interleave.c' object='elements_interleave-interleave.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_interleave_CFLAGS) $(CFLAGS) -c -o elements_interleave-interleave.obj `if test -f 'elements/interleave.c'; then $(CYGPATH_W) 'elements/interleave.c'; else $(CYGPATH_W) '$(srcdir)/elements/interleave.c'; fi` + +elements_jpegenc-jpegenc.o: elements/jpegenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_jpegenc_CFLAGS) $(CFLAGS) -MT elements_jpegenc-jpegenc.o -MD -MP -MF $(DEPDIR)/elements_jpegenc-jpegenc.Tpo -c -o elements_jpegenc-jpegenc.o `test -f 'elements/jpegenc.c' || echo '$(srcdir)/'`elements/jpegenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_jpegenc-jpegenc.Tpo $(DEPDIR)/elements_jpegenc-jpegenc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/jpegenc.c' object='elements_jpegenc-jpegenc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_jpegenc_CFLAGS) $(CFLAGS) -c -o elements_jpegenc-jpegenc.o `test -f 'elements/jpegenc.c' || echo '$(srcdir)/'`elements/jpegenc.c + +elements_jpegenc-jpegenc.obj: elements/jpegenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_jpegenc_CFLAGS) $(CFLAGS) -MT elements_jpegenc-jpegenc.obj -MD -MP -MF $(DEPDIR)/elements_jpegenc-jpegenc.Tpo -c -o elements_jpegenc-jpegenc.obj `if test -f 'elements/jpegenc.c'; then $(CYGPATH_W) 'elements/jpegenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/jpegenc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_jpegenc-jpegenc.Tpo $(DEPDIR)/elements_jpegenc-jpegenc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/jpegenc.c' object='elements_jpegenc-jpegenc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_jpegenc_CFLAGS) $(CFLAGS) -c -o elements_jpegenc-jpegenc.obj `if test -f 'elements/jpegenc.c'; then $(CYGPATH_W) 'elements/jpegenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/jpegenc.c'; fi` + +level.o: elements/level.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT level.o -MD -MP -MF $(DEPDIR)/level.Tpo -c -o level.o `test -f 'elements/level.c' || echo '$(srcdir)/'`elements/level.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/level.Tpo $(DEPDIR)/level.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/level.c' object='level.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o level.o `test -f 'elements/level.c' || echo '$(srcdir)/'`elements/level.c + +level.obj: elements/level.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT level.obj -MD -MP -MF $(DEPDIR)/level.Tpo -c -o level.obj `if test -f 'elements/level.c'; then $(CYGPATH_W) 'elements/level.c'; else $(CYGPATH_W) '$(srcdir)/elements/level.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/level.Tpo $(DEPDIR)/level.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/level.c' object='level.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o level.obj `if test -f 'elements/level.c'; then $(CYGPATH_W) 'elements/level.c'; else $(CYGPATH_W) '$(srcdir)/elements/level.c'; fi` + +matroskamux.o: elements/matroskamux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matroskamux.o -MD -MP -MF $(DEPDIR)/matroskamux.Tpo -c -o matroskamux.o `test -f 'elements/matroskamux.c' || echo '$(srcdir)/'`elements/matroskamux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matroskamux.Tpo $(DEPDIR)/matroskamux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/matroskamux.c' object='matroskamux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matroskamux.o `test -f 'elements/matroskamux.c' || echo '$(srcdir)/'`elements/matroskamux.c + +matroskamux.obj: elements/matroskamux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matroskamux.obj -MD -MP -MF $(DEPDIR)/matroskamux.Tpo -c -o matroskamux.obj `if test -f 'elements/matroskamux.c'; then $(CYGPATH_W) 'elements/matroskamux.c'; else $(CYGPATH_W) '$(srcdir)/elements/matroskamux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matroskamux.Tpo $(DEPDIR)/matroskamux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/matroskamux.c' object='matroskamux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matroskamux.obj `if test -f 'elements/matroskamux.c'; then $(CYGPATH_W) 'elements/matroskamux.c'; else $(CYGPATH_W) '$(srcdir)/elements/matroskamux.c'; fi` + +matroskaparse.o: elements/matroskaparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matroskaparse.o -MD -MP -MF $(DEPDIR)/matroskaparse.Tpo -c -o matroskaparse.o `test -f 'elements/matroskaparse.c' || echo '$(srcdir)/'`elements/matroskaparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matroskaparse.Tpo $(DEPDIR)/matroskaparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/matroskaparse.c' object='matroskaparse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matroskaparse.o `test -f 'elements/matroskaparse.c' || echo '$(srcdir)/'`elements/matroskaparse.c + +matroskaparse.obj: elements/matroskaparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matroskaparse.obj -MD -MP -MF $(DEPDIR)/matroskaparse.Tpo -c -o matroskaparse.obj `if test -f 'elements/matroskaparse.c'; then $(CYGPATH_W) 'elements/matroskaparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/matroskaparse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matroskaparse.Tpo $(DEPDIR)/matroskaparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/matroskaparse.c' object='matroskaparse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matroskaparse.obj `if test -f 'elements/matroskaparse.c'; then $(CYGPATH_W) 'elements/matroskaparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/matroskaparse.c'; fi` + +mpegaudioparse.o: elements/mpegaudioparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpegaudioparse.o -MD -MP -MF $(DEPDIR)/mpegaudioparse.Tpo -c -o mpegaudioparse.o `test -f 'elements/mpegaudioparse.c' || echo '$(srcdir)/'`elements/mpegaudioparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpegaudioparse.Tpo $(DEPDIR)/mpegaudioparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/mpegaudioparse.c' object='mpegaudioparse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpegaudioparse.o `test -f 'elements/mpegaudioparse.c' || echo '$(srcdir)/'`elements/mpegaudioparse.c + +mpegaudioparse.obj: elements/mpegaudioparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpegaudioparse.obj -MD -MP -MF $(DEPDIR)/mpegaudioparse.Tpo -c -o mpegaudioparse.obj `if test -f 'elements/mpegaudioparse.c'; then $(CYGPATH_W) 'elements/mpegaudioparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/mpegaudioparse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpegaudioparse.Tpo $(DEPDIR)/mpegaudioparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/mpegaudioparse.c' object='mpegaudioparse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpegaudioparse.obj `if test -f 'elements/mpegaudioparse.c'; then $(CYGPATH_W) 'elements/mpegaudioparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/mpegaudioparse.c'; fi` + +elements_multifile-multifile.o: elements/multifile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_multifile_CFLAGS) $(CFLAGS) -MT elements_multifile-multifile.o -MD -MP -MF $(DEPDIR)/elements_multifile-multifile.Tpo -c -o elements_multifile-multifile.o `test -f 'elements/multifile.c' || echo '$(srcdir)/'`elements/multifile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_multifile-multifile.Tpo $(DEPDIR)/elements_multifile-multifile.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/multifile.c' object='elements_multifile-multifile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_multifile_CFLAGS) $(CFLAGS) -c -o elements_multifile-multifile.o `test -f 'elements/multifile.c' || echo '$(srcdir)/'`elements/multifile.c + +elements_multifile-multifile.obj: elements/multifile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_multifile_CFLAGS) $(CFLAGS) -MT elements_multifile-multifile.obj -MD -MP -MF $(DEPDIR)/elements_multifile-multifile.Tpo -c -o elements_multifile-multifile.obj `if test -f 'elements/multifile.c'; then $(CYGPATH_W) 'elements/multifile.c'; else $(CYGPATH_W) '$(srcdir)/elements/multifile.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_multifile-multifile.Tpo $(DEPDIR)/elements_multifile-multifile.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/multifile.c' object='elements_multifile-multifile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_multifile_CFLAGS) $(CFLAGS) -c -o elements_multifile-multifile.obj `if test -f 'elements/multifile.c'; then $(CYGPATH_W) 'elements/multifile.c'; else $(CYGPATH_W) '$(srcdir)/elements/multifile.c'; fi` + +elements_qtmux-qtmux.o: elements/qtmux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_qtmux_CFLAGS) $(CFLAGS) -MT elements_qtmux-qtmux.o -MD -MP -MF $(DEPDIR)/elements_qtmux-qtmux.Tpo -c -o elements_qtmux-qtmux.o `test -f 'elements/qtmux.c' || echo '$(srcdir)/'`elements/qtmux.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_qtmux-qtmux.Tpo $(DEPDIR)/elements_qtmux-qtmux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/qtmux.c' object='elements_qtmux-qtmux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_qtmux_CFLAGS) $(CFLAGS) -c -o elements_qtmux-qtmux.o `test -f 'elements/qtmux.c' || echo '$(srcdir)/'`elements/qtmux.c + +elements_qtmux-qtmux.obj: elements/qtmux.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_qtmux_CFLAGS) $(CFLAGS) -MT elements_qtmux-qtmux.obj -MD -MP -MF $(DEPDIR)/elements_qtmux-qtmux.Tpo -c -o elements_qtmux-qtmux.obj `if test -f 'elements/qtmux.c'; then $(CYGPATH_W) 'elements/qtmux.c'; else $(CYGPATH_W) '$(srcdir)/elements/qtmux.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_qtmux-qtmux.Tpo $(DEPDIR)/elements_qtmux-qtmux.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/qtmux.c' object='elements_qtmux-qtmux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_qtmux_CFLAGS) $(CFLAGS) -c -o elements_qtmux-qtmux.obj `if test -f 'elements/qtmux.c'; then $(CYGPATH_W) 'elements/qtmux.c'; else $(CYGPATH_W) '$(srcdir)/elements/qtmux.c'; fi` + +rganalysis.o: elements/rganalysis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rganalysis.o -MD -MP -MF $(DEPDIR)/rganalysis.Tpo -c -o rganalysis.o `test -f 'elements/rganalysis.c' || echo '$(srcdir)/'`elements/rganalysis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rganalysis.Tpo $(DEPDIR)/rganalysis.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rganalysis.c' object='rganalysis.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rganalysis.o `test -f 'elements/rganalysis.c' || echo '$(srcdir)/'`elements/rganalysis.c + +rganalysis.obj: elements/rganalysis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rganalysis.obj -MD -MP -MF $(DEPDIR)/rganalysis.Tpo -c -o rganalysis.obj `if test -f 'elements/rganalysis.c'; then $(CYGPATH_W) 'elements/rganalysis.c'; else $(CYGPATH_W) '$(srcdir)/elements/rganalysis.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rganalysis.Tpo $(DEPDIR)/rganalysis.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rganalysis.c' object='rganalysis.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rganalysis.obj `if test -f 'elements/rganalysis.c'; then $(CYGPATH_W) 'elements/rganalysis.c'; else $(CYGPATH_W) '$(srcdir)/elements/rganalysis.c'; fi` + +rglimiter.o: elements/rglimiter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rglimiter.o -MD -MP -MF $(DEPDIR)/rglimiter.Tpo -c -o rglimiter.o `test -f 'elements/rglimiter.c' || echo '$(srcdir)/'`elements/rglimiter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rglimiter.Tpo $(DEPDIR)/rglimiter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rglimiter.c' object='rglimiter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rglimiter.o `test -f 'elements/rglimiter.c' || echo '$(srcdir)/'`elements/rglimiter.c + +rglimiter.obj: elements/rglimiter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rglimiter.obj -MD -MP -MF $(DEPDIR)/rglimiter.Tpo -c -o rglimiter.obj `if test -f 'elements/rglimiter.c'; then $(CYGPATH_W) 'elements/rglimiter.c'; else $(CYGPATH_W) '$(srcdir)/elements/rglimiter.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rglimiter.Tpo $(DEPDIR)/rglimiter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rglimiter.c' object='rglimiter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rglimiter.obj `if test -f 'elements/rglimiter.c'; then $(CYGPATH_W) 'elements/rglimiter.c'; else $(CYGPATH_W) '$(srcdir)/elements/rglimiter.c'; fi` + +rgvolume.o: elements/rgvolume.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rgvolume.o -MD -MP -MF $(DEPDIR)/rgvolume.Tpo -c -o rgvolume.o `test -f 'elements/rgvolume.c' || echo '$(srcdir)/'`elements/rgvolume.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rgvolume.Tpo $(DEPDIR)/rgvolume.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rgvolume.c' object='rgvolume.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rgvolume.o `test -f 'elements/rgvolume.c' || echo '$(srcdir)/'`elements/rgvolume.c + +rgvolume.obj: elements/rgvolume.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rgvolume.obj -MD -MP -MF $(DEPDIR)/rgvolume.Tpo -c -o rgvolume.obj `if test -f 'elements/rgvolume.c'; then $(CYGPATH_W) 'elements/rgvolume.c'; else $(CYGPATH_W) '$(srcdir)/elements/rgvolume.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rgvolume.Tpo $(DEPDIR)/rgvolume.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rgvolume.c' object='rgvolume.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rgvolume.obj `if test -f 'elements/rgvolume.c'; then $(CYGPATH_W) 'elements/rgvolume.c'; else $(CYGPATH_W) '$(srcdir)/elements/rgvolume.c'; fi` + +rtp-payloading.o: elements/rtp-payloading.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtp-payloading.o -MD -MP -MF $(DEPDIR)/rtp-payloading.Tpo -c -o rtp-payloading.o `test -f 'elements/rtp-payloading.c' || echo '$(srcdir)/'`elements/rtp-payloading.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtp-payloading.Tpo $(DEPDIR)/rtp-payloading.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtp-payloading.c' object='rtp-payloading.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtp-payloading.o `test -f 'elements/rtp-payloading.c' || echo '$(srcdir)/'`elements/rtp-payloading.c + +rtp-payloading.obj: elements/rtp-payloading.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtp-payloading.obj -MD -MP -MF $(DEPDIR)/rtp-payloading.Tpo -c -o rtp-payloading.obj `if test -f 'elements/rtp-payloading.c'; then $(CYGPATH_W) 'elements/rtp-payloading.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtp-payloading.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtp-payloading.Tpo $(DEPDIR)/rtp-payloading.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtp-payloading.c' object='rtp-payloading.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtp-payloading.obj `if test -f 'elements/rtp-payloading.c'; then $(CYGPATH_W) 'elements/rtp-payloading.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtp-payloading.c'; fi` + +rtpbin.o: elements/rtpbin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtpbin.o -MD -MP -MF $(DEPDIR)/rtpbin.Tpo -c -o rtpbin.o `test -f 'elements/rtpbin.c' || echo '$(srcdir)/'`elements/rtpbin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpbin.Tpo $(DEPDIR)/rtpbin.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpbin.c' object='rtpbin.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtpbin.o `test -f 'elements/rtpbin.c' || echo '$(srcdir)/'`elements/rtpbin.c + +rtpbin.obj: elements/rtpbin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtpbin.obj -MD -MP -MF $(DEPDIR)/rtpbin.Tpo -c -o rtpbin.obj `if test -f 'elements/rtpbin.c'; then $(CYGPATH_W) 'elements/rtpbin.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpbin.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpbin.Tpo $(DEPDIR)/rtpbin.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpbin.c' object='rtpbin.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtpbin.obj `if test -f 'elements/rtpbin.c'; then $(CYGPATH_W) 'elements/rtpbin.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpbin.c'; fi` + +elements_rtpbin_buffer_list-rtpbin_buffer_list.o: elements/rtpbin_buffer_list.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) -MT elements_rtpbin_buffer_list-rtpbin_buffer_list.o -MD -MP -MF $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Tpo -c -o elements_rtpbin_buffer_list-rtpbin_buffer_list.o `test -f 'elements/rtpbin_buffer_list.c' || echo '$(srcdir)/'`elements/rtpbin_buffer_list.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Tpo $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpbin_buffer_list.c' object='elements_rtpbin_buffer_list-rtpbin_buffer_list.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) -c -o elements_rtpbin_buffer_list-rtpbin_buffer_list.o `test -f 'elements/rtpbin_buffer_list.c' || echo '$(srcdir)/'`elements/rtpbin_buffer_list.c + +elements_rtpbin_buffer_list-rtpbin_buffer_list.obj: elements/rtpbin_buffer_list.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) -MT elements_rtpbin_buffer_list-rtpbin_buffer_list.obj -MD -MP -MF $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Tpo -c -o elements_rtpbin_buffer_list-rtpbin_buffer_list.obj `if test -f 'elements/rtpbin_buffer_list.c'; then $(CYGPATH_W) 'elements/rtpbin_buffer_list.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpbin_buffer_list.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Tpo $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpbin_buffer_list.c' object='elements_rtpbin_buffer_list-rtpbin_buffer_list.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) -c -o elements_rtpbin_buffer_list-rtpbin_buffer_list.obj `if test -f 'elements/rtpbin_buffer_list.c'; then $(CYGPATH_W) 'elements/rtpbin_buffer_list.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpbin_buffer_list.c'; fi` + +rtpjitterbuffer.o: elements/rtpjitterbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtpjitterbuffer.o -MD -MP -MF $(DEPDIR)/rtpjitterbuffer.Tpo -c -o rtpjitterbuffer.o `test -f 'elements/rtpjitterbuffer.c' || echo '$(srcdir)/'`elements/rtpjitterbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpjitterbuffer.Tpo $(DEPDIR)/rtpjitterbuffer.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpjitterbuffer.c' object='rtpjitterbuffer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtpjitterbuffer.o `test -f 'elements/rtpjitterbuffer.c' || echo '$(srcdir)/'`elements/rtpjitterbuffer.c + +rtpjitterbuffer.obj: elements/rtpjitterbuffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtpjitterbuffer.obj -MD -MP -MF $(DEPDIR)/rtpjitterbuffer.Tpo -c -o rtpjitterbuffer.obj `if test -f 'elements/rtpjitterbuffer.c'; then $(CYGPATH_W) 'elements/rtpjitterbuffer.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpjitterbuffer.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpjitterbuffer.Tpo $(DEPDIR)/rtpjitterbuffer.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpjitterbuffer.c' object='rtpjitterbuffer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtpjitterbuffer.obj `if test -f 'elements/rtpjitterbuffer.c'; then $(CYGPATH_W) 'elements/rtpjitterbuffer.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpjitterbuffer.c'; fi` + +shapewipe.o: elements/shapewipe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shapewipe.o -MD -MP -MF $(DEPDIR)/shapewipe.Tpo -c -o shapewipe.o `test -f 'elements/shapewipe.c' || echo '$(srcdir)/'`elements/shapewipe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shapewipe.Tpo $(DEPDIR)/shapewipe.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/shapewipe.c' object='shapewipe.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shapewipe.o `test -f 'elements/shapewipe.c' || echo '$(srcdir)/'`elements/shapewipe.c + +shapewipe.obj: elements/shapewipe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shapewipe.obj -MD -MP -MF $(DEPDIR)/shapewipe.Tpo -c -o shapewipe.obj `if test -f 'elements/shapewipe.c'; then $(CYGPATH_W) 'elements/shapewipe.c'; else $(CYGPATH_W) '$(srcdir)/elements/shapewipe.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shapewipe.Tpo $(DEPDIR)/shapewipe.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/shapewipe.c' object='shapewipe.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shapewipe.obj `if test -f 'elements/shapewipe.c'; then $(CYGPATH_W) 'elements/shapewipe.c'; else $(CYGPATH_W) '$(srcdir)/elements/shapewipe.c'; fi` + +elements_souphttpsrc-souphttpsrc.o: elements/souphttpsrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_souphttpsrc_CFLAGS) $(CFLAGS) -MT elements_souphttpsrc-souphttpsrc.o -MD -MP -MF $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Tpo -c -o elements_souphttpsrc-souphttpsrc.o `test -f 'elements/souphttpsrc.c' || echo '$(srcdir)/'`elements/souphttpsrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Tpo $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/souphttpsrc.c' object='elements_souphttpsrc-souphttpsrc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_souphttpsrc_CFLAGS) $(CFLAGS) -c -o elements_souphttpsrc-souphttpsrc.o `test -f 'elements/souphttpsrc.c' || echo '$(srcdir)/'`elements/souphttpsrc.c + +elements_souphttpsrc-souphttpsrc.obj: elements/souphttpsrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_souphttpsrc_CFLAGS) $(CFLAGS) -MT elements_souphttpsrc-souphttpsrc.obj -MD -MP -MF $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Tpo -c -o elements_souphttpsrc-souphttpsrc.obj `if test -f 'elements/souphttpsrc.c'; then $(CYGPATH_W) 'elements/souphttpsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/souphttpsrc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Tpo $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/souphttpsrc.c' object='elements_souphttpsrc-souphttpsrc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_souphttpsrc_CFLAGS) $(CFLAGS) -c -o elements_souphttpsrc-souphttpsrc.obj `if test -f 'elements/souphttpsrc.c'; then $(CYGPATH_W) 'elements/souphttpsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/souphttpsrc.c'; fi` + +spectrum.o: elements/spectrum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spectrum.o -MD -MP -MF $(DEPDIR)/spectrum.Tpo -c -o spectrum.o `test -f 'elements/spectrum.c' || echo '$(srcdir)/'`elements/spectrum.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spectrum.Tpo $(DEPDIR)/spectrum.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/spectrum.c' object='spectrum.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spectrum.o `test -f 'elements/spectrum.c' || echo '$(srcdir)/'`elements/spectrum.c + +spectrum.obj: elements/spectrum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spectrum.obj -MD -MP -MF $(DEPDIR)/spectrum.Tpo -c -o spectrum.obj `if test -f 'elements/spectrum.c'; then $(CYGPATH_W) 'elements/spectrum.c'; else $(CYGPATH_W) '$(srcdir)/elements/spectrum.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spectrum.Tpo $(DEPDIR)/spectrum.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/spectrum.c' object='spectrum.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spectrum.obj `if test -f 'elements/spectrum.c'; then $(CYGPATH_W) 'elements/spectrum.c'; else $(CYGPATH_W) '$(srcdir)/elements/spectrum.c'; fi` + +elements_sunaudio-sunaudio.o: elements/sunaudio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_sunaudio_CFLAGS) $(CFLAGS) -MT elements_sunaudio-sunaudio.o -MD -MP -MF $(DEPDIR)/elements_sunaudio-sunaudio.Tpo -c -o elements_sunaudio-sunaudio.o `test -f 'elements/sunaudio.c' || echo '$(srcdir)/'`elements/sunaudio.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_sunaudio-sunaudio.Tpo $(DEPDIR)/elements_sunaudio-sunaudio.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/sunaudio.c' object='elements_sunaudio-sunaudio.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_sunaudio_CFLAGS) $(CFLAGS) -c -o elements_sunaudio-sunaudio.o `test -f 'elements/sunaudio.c' || echo '$(srcdir)/'`elements/sunaudio.c + +elements_sunaudio-sunaudio.obj: elements/sunaudio.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_sunaudio_CFLAGS) $(CFLAGS) -MT elements_sunaudio-sunaudio.obj -MD -MP -MF $(DEPDIR)/elements_sunaudio-sunaudio.Tpo -c -o elements_sunaudio-sunaudio.obj `if test -f 'elements/sunaudio.c'; then $(CYGPATH_W) 'elements/sunaudio.c'; else $(CYGPATH_W) '$(srcdir)/elements/sunaudio.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_sunaudio-sunaudio.Tpo $(DEPDIR)/elements_sunaudio-sunaudio.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/sunaudio.c' object='elements_sunaudio-sunaudio.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_sunaudio_CFLAGS) $(CFLAGS) -c -o elements_sunaudio-sunaudio.obj `if test -f 'elements/sunaudio.c'; then $(CYGPATH_W) 'elements/sunaudio.c'; else $(CYGPATH_W) '$(srcdir)/elements/sunaudio.c'; fi` + +udpsink.o: elements/udpsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT udpsink.o -MD -MP -MF $(DEPDIR)/udpsink.Tpo -c -o udpsink.o `test -f 'elements/udpsink.c' || echo '$(srcdir)/'`elements/udpsink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/udpsink.Tpo $(DEPDIR)/udpsink.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/udpsink.c' object='udpsink.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o udpsink.o `test -f 'elements/udpsink.c' || echo '$(srcdir)/'`elements/udpsink.c + +udpsink.obj: elements/udpsink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT udpsink.obj -MD -MP -MF $(DEPDIR)/udpsink.Tpo -c -o udpsink.obj `if test -f 'elements/udpsink.c'; then $(CYGPATH_W) 'elements/udpsink.c'; else $(CYGPATH_W) '$(srcdir)/elements/udpsink.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/udpsink.Tpo $(DEPDIR)/udpsink.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/udpsink.c' object='udpsink.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o udpsink.obj `if test -f 'elements/udpsink.c'; then $(CYGPATH_W) 'elements/udpsink.c'; else $(CYGPATH_W) '$(srcdir)/elements/udpsink.c'; fi` + +elements_videocrop-videocrop.o: elements/videocrop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videocrop_CFLAGS) $(CFLAGS) -MT elements_videocrop-videocrop.o -MD -MP -MF $(DEPDIR)/elements_videocrop-videocrop.Tpo -c -o elements_videocrop-videocrop.o `test -f 'elements/videocrop.c' || echo '$(srcdir)/'`elements/videocrop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_videocrop-videocrop.Tpo $(DEPDIR)/elements_videocrop-videocrop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/videocrop.c' object='elements_videocrop-videocrop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videocrop_CFLAGS) $(CFLAGS) -c -o elements_videocrop-videocrop.o `test -f 'elements/videocrop.c' || echo '$(srcdir)/'`elements/videocrop.c + +elements_videocrop-videocrop.obj: elements/videocrop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videocrop_CFLAGS) $(CFLAGS) -MT elements_videocrop-videocrop.obj -MD -MP -MF $(DEPDIR)/elements_videocrop-videocrop.Tpo -c -o elements_videocrop-videocrop.obj `if test -f 'elements/videocrop.c'; then $(CYGPATH_W) 'elements/videocrop.c'; else $(CYGPATH_W) '$(srcdir)/elements/videocrop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_videocrop-videocrop.Tpo $(DEPDIR)/elements_videocrop-videocrop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/videocrop.c' object='elements_videocrop-videocrop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videocrop_CFLAGS) $(CFLAGS) -c -o elements_videocrop-videocrop.obj `if test -f 'elements/videocrop.c'; then $(CYGPATH_W) 'elements/videocrop.c'; else $(CYGPATH_W) '$(srcdir)/elements/videocrop.c'; fi` + +elements_videofilter-videofilter.o: elements/videofilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videofilter_CFLAGS) $(CFLAGS) -MT elements_videofilter-videofilter.o -MD -MP -MF $(DEPDIR)/elements_videofilter-videofilter.Tpo -c -o elements_videofilter-videofilter.o `test -f 'elements/videofilter.c' || echo '$(srcdir)/'`elements/videofilter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_videofilter-videofilter.Tpo $(DEPDIR)/elements_videofilter-videofilter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/videofilter.c' object='elements_videofilter-videofilter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videofilter_CFLAGS) $(CFLAGS) -c -o elements_videofilter-videofilter.o `test -f 'elements/videofilter.c' || echo '$(srcdir)/'`elements/videofilter.c + +elements_videofilter-videofilter.obj: elements/videofilter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videofilter_CFLAGS) $(CFLAGS) -MT elements_videofilter-videofilter.obj -MD -MP -MF $(DEPDIR)/elements_videofilter-videofilter.Tpo -c -o elements_videofilter-videofilter.obj `if test -f 'elements/videofilter.c'; then $(CYGPATH_W) 'elements/videofilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/videofilter.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_videofilter-videofilter.Tpo $(DEPDIR)/elements_videofilter-videofilter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/videofilter.c' object='elements_videofilter-videofilter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videofilter_CFLAGS) $(CFLAGS) -c -o elements_videofilter-videofilter.obj `if test -f 'elements/videofilter.c'; then $(CYGPATH_W) 'elements/videofilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/videofilter.c'; fi` + +wavpackdec.o: elements/wavpackdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackdec.o -MD -MP -MF $(DEPDIR)/wavpackdec.Tpo -c -o wavpackdec.o `test -f 'elements/wavpackdec.c' || echo '$(srcdir)/'`elements/wavpackdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackdec.Tpo $(DEPDIR)/wavpackdec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackdec.c' object='wavpackdec.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackdec.o `test -f 'elements/wavpackdec.c' || echo '$(srcdir)/'`elements/wavpackdec.c + +wavpackdec.obj: elements/wavpackdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackdec.obj -MD -MP -MF $(DEPDIR)/wavpackdec.Tpo -c -o wavpackdec.obj `if test -f 'elements/wavpackdec.c'; then $(CYGPATH_W) 'elements/wavpackdec.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackdec.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackdec.Tpo $(DEPDIR)/wavpackdec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackdec.c' object='wavpackdec.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackdec.obj `if test -f 'elements/wavpackdec.c'; then $(CYGPATH_W) 'elements/wavpackdec.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackdec.c'; fi` + +wavpackenc.o: elements/wavpackenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackenc.o -MD -MP -MF $(DEPDIR)/wavpackenc.Tpo -c -o wavpackenc.o `test -f 'elements/wavpackenc.c' || echo '$(srcdir)/'`elements/wavpackenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackenc.Tpo $(DEPDIR)/wavpackenc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackenc.c' object='wavpackenc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackenc.o `test -f 'elements/wavpackenc.c' || echo '$(srcdir)/'`elements/wavpackenc.c + +wavpackenc.obj: elements/wavpackenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackenc.obj -MD -MP -MF $(DEPDIR)/wavpackenc.Tpo -c -o wavpackenc.obj `if test -f 'elements/wavpackenc.c'; then $(CYGPATH_W) 'elements/wavpackenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackenc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackenc.Tpo $(DEPDIR)/wavpackenc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackenc.c' object='wavpackenc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackenc.obj `if test -f 'elements/wavpackenc.c'; then $(CYGPATH_W) 'elements/wavpackenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackenc.c'; fi` + +wavpackparse.o: elements/wavpackparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackparse.o -MD -MP -MF $(DEPDIR)/wavpackparse.Tpo -c -o wavpackparse.o `test -f 'elements/wavpackparse.c' || echo '$(srcdir)/'`elements/wavpackparse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackparse.Tpo $(DEPDIR)/wavpackparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackparse.c' object='wavpackparse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackparse.o `test -f 'elements/wavpackparse.c' || echo '$(srcdir)/'`elements/wavpackparse.c + +wavpackparse.obj: elements/wavpackparse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackparse.obj -MD -MP -MF $(DEPDIR)/wavpackparse.Tpo -c -o wavpackparse.obj `if test -f 'elements/wavpackparse.c'; then $(CYGPATH_W) 'elements/wavpackparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackparse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackparse.Tpo $(DEPDIR)/wavpackparse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackparse.c' object='wavpackparse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackparse.obj `if test -f 'elements/wavpackparse.c'; then $(CYGPATH_W) 'elements/wavpackparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackparse.c'; fi` + +y4menc.o: elements/y4menc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT y4menc.o -MD -MP -MF $(DEPDIR)/y4menc.Tpo -c -o y4menc.o `test -f 'elements/y4menc.c' || echo '$(srcdir)/'`elements/y4menc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/y4menc.Tpo $(DEPDIR)/y4menc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/y4menc.c' object='y4menc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o y4menc.o `test -f 'elements/y4menc.c' || echo '$(srcdir)/'`elements/y4menc.c + +y4menc.obj: elements/y4menc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT y4menc.obj -MD -MP -MF $(DEPDIR)/y4menc.Tpo -c -o y4menc.obj `if test -f 'elements/y4menc.c'; then $(CYGPATH_W) 'elements/y4menc.c'; else $(CYGPATH_W) '$(srcdir)/elements/y4menc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/y4menc.Tpo $(DEPDIR)/y4menc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/y4menc.c' object='y4menc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o y4menc.obj `if test -f 'elements/y4menc.c'; then $(CYGPATH_W) 'elements/y4menc.c'; else $(CYGPATH_W) '$(srcdir)/elements/y4menc.c'; fi` + +index.o: generic/index.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT index.o -MD -MP -MF $(DEPDIR)/index.Tpo -c -o index.o `test -f 'generic/index.c' || echo '$(srcdir)/'`generic/index.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/index.Tpo $(DEPDIR)/index.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generic/index.c' object='index.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o index.o `test -f 'generic/index.c' || echo '$(srcdir)/'`generic/index.c + +index.obj: generic/index.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT index.obj -MD -MP -MF $(DEPDIR)/index.Tpo -c -o index.obj `if test -f 'generic/index.c'; then $(CYGPATH_W) 'generic/index.c'; else $(CYGPATH_W) '$(srcdir)/generic/index.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/index.Tpo $(DEPDIR)/index.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generic/index.c' object='index.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o index.obj `if test -f 'generic/index.c'; then $(CYGPATH_W) 'generic/index.c'; else $(CYGPATH_W) '$(srcdir)/generic/index.c'; fi` + +states.o: generic/states.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT states.o -MD -MP -MF $(DEPDIR)/states.Tpo -c -o states.o `test -f 'generic/states.c' || echo '$(srcdir)/'`generic/states.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/states.Tpo $(DEPDIR)/states.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generic/states.c' object='states.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o states.o `test -f 'generic/states.c' || echo '$(srcdir)/'`generic/states.c + +states.obj: generic/states.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT states.obj -MD -MP -MF $(DEPDIR)/states.Tpo -c -o states.obj `if test -f 'generic/states.c'; then $(CYGPATH_W) 'generic/states.c'; else $(CYGPATH_W) '$(srcdir)/generic/states.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/states.Tpo $(DEPDIR)/states.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generic/states.c' object='states.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o states.obj `if test -f 'generic/states.c'; then $(CYGPATH_W) 'generic/states.c'; else $(CYGPATH_W) '$(srcdir)/generic/states.c'; fi` + +orc_deinterlace-deinterlace.o: orc/deinterlace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_deinterlace_CFLAGS) $(CFLAGS) -MT orc_deinterlace-deinterlace.o -MD -MP -MF $(DEPDIR)/orc_deinterlace-deinterlace.Tpo -c -o orc_deinterlace-deinterlace.o `test -f 'orc/deinterlace.c' || echo '$(srcdir)/'`orc/deinterlace.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_deinterlace-deinterlace.Tpo $(DEPDIR)/orc_deinterlace-deinterlace.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/deinterlace.c' object='orc_deinterlace-deinterlace.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_deinterlace_CFLAGS) $(CFLAGS) -c -o orc_deinterlace-deinterlace.o `test -f 'orc/deinterlace.c' || echo '$(srcdir)/'`orc/deinterlace.c + +orc_deinterlace-deinterlace.obj: orc/deinterlace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_deinterlace_CFLAGS) $(CFLAGS) -MT orc_deinterlace-deinterlace.obj -MD -MP -MF $(DEPDIR)/orc_deinterlace-deinterlace.Tpo -c -o orc_deinterlace-deinterlace.obj `if test -f 'orc/deinterlace.c'; then $(CYGPATH_W) 'orc/deinterlace.c'; else $(CYGPATH_W) '$(srcdir)/orc/deinterlace.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_deinterlace-deinterlace.Tpo $(DEPDIR)/orc_deinterlace-deinterlace.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/deinterlace.c' object='orc_deinterlace-deinterlace.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_deinterlace_CFLAGS) $(CFLAGS) -c -o orc_deinterlace-deinterlace.obj `if test -f 'orc/deinterlace.c'; then $(CYGPATH_W) 'orc/deinterlace.c'; else $(CYGPATH_W) '$(srcdir)/orc/deinterlace.c'; fi` + +orc_videobox-videobox.o: orc/videobox.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videobox_CFLAGS) $(CFLAGS) -MT orc_videobox-videobox.o -MD -MP -MF $(DEPDIR)/orc_videobox-videobox.Tpo -c -o orc_videobox-videobox.o `test -f 'orc/videobox.c' || echo '$(srcdir)/'`orc/videobox.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videobox-videobox.Tpo $(DEPDIR)/orc_videobox-videobox.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/videobox.c' object='orc_videobox-videobox.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videobox_CFLAGS) $(CFLAGS) -c -o orc_videobox-videobox.o `test -f 'orc/videobox.c' || echo '$(srcdir)/'`orc/videobox.c + +orc_videobox-videobox.obj: orc/videobox.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videobox_CFLAGS) $(CFLAGS) -MT orc_videobox-videobox.obj -MD -MP -MF $(DEPDIR)/orc_videobox-videobox.Tpo -c -o orc_videobox-videobox.obj `if test -f 'orc/videobox.c'; then $(CYGPATH_W) 'orc/videobox.c'; else $(CYGPATH_W) '$(srcdir)/orc/videobox.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videobox-videobox.Tpo $(DEPDIR)/orc_videobox-videobox.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/videobox.c' object='orc_videobox-videobox.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videobox_CFLAGS) $(CFLAGS) -c -o orc_videobox-videobox.obj `if test -f 'orc/videobox.c'; then $(CYGPATH_W) 'orc/videobox.c'; else $(CYGPATH_W) '$(srcdir)/orc/videobox.c'; fi` + +orc_videomixer-videomixer.o: orc/videomixer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videomixer_CFLAGS) $(CFLAGS) -MT orc_videomixer-videomixer.o -MD -MP -MF $(DEPDIR)/orc_videomixer-videomixer.Tpo -c -o orc_videomixer-videomixer.o `test -f 'orc/videomixer.c' || echo '$(srcdir)/'`orc/videomixer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videomixer-videomixer.Tpo $(DEPDIR)/orc_videomixer-videomixer.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/videomixer.c' object='orc_videomixer-videomixer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videomixer_CFLAGS) $(CFLAGS) -c -o orc_videomixer-videomixer.o `test -f 'orc/videomixer.c' || echo '$(srcdir)/'`orc/videomixer.c + +orc_videomixer-videomixer.obj: orc/videomixer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videomixer_CFLAGS) $(CFLAGS) -MT orc_videomixer-videomixer.obj -MD -MP -MF $(DEPDIR)/orc_videomixer-videomixer.Tpo -c -o orc_videomixer-videomixer.obj `if test -f 'orc/videomixer.c'; then $(CYGPATH_W) 'orc/videomixer.c'; else $(CYGPATH_W) '$(srcdir)/orc/videomixer.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videomixer-videomixer.Tpo $(DEPDIR)/orc_videomixer-videomixer.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/videomixer.c' object='orc_videomixer-videomixer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videomixer_CFLAGS) $(CFLAGS) -c -o orc_videomixer-videomixer.obj `if test -f 'orc/videomixer.c'; then $(CYGPATH_W) 'orc/videomixer.c'; else $(CYGPATH_W) '$(srcdir)/orc/videomixer.c'; fi` + +effectv.o: pipelines/effectv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT effectv.o -MD -MP -MF $(DEPDIR)/effectv.Tpo -c -o effectv.o `test -f 'pipelines/effectv.c' || echo '$(srcdir)/'`pipelines/effectv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/effectv.Tpo $(DEPDIR)/effectv.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/effectv.c' object='effectv.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o effectv.o `test -f 'pipelines/effectv.c' || echo '$(srcdir)/'`pipelines/effectv.c + +effectv.obj: pipelines/effectv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT effectv.obj -MD -MP -MF $(DEPDIR)/effectv.Tpo -c -o effectv.obj `if test -f 'pipelines/effectv.c'; then $(CYGPATH_W) 'pipelines/effectv.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/effectv.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/effectv.Tpo $(DEPDIR)/effectv.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/effectv.c' object='effectv.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o effectv.obj `if test -f 'pipelines/effectv.c'; then $(CYGPATH_W) 'pipelines/effectv.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/effectv.c'; fi` + +flacdec.o: pipelines/flacdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flacdec.o -MD -MP -MF $(DEPDIR)/flacdec.Tpo -c -o flacdec.o `test -f 'pipelines/flacdec.c' || echo '$(srcdir)/'`pipelines/flacdec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flacdec.Tpo $(DEPDIR)/flacdec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/flacdec.c' object='flacdec.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flacdec.o `test -f 'pipelines/flacdec.c' || echo '$(srcdir)/'`pipelines/flacdec.c + +flacdec.obj: pipelines/flacdec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flacdec.obj -MD -MP -MF $(DEPDIR)/flacdec.Tpo -c -o flacdec.obj `if test -f 'pipelines/flacdec.c'; then $(CYGPATH_W) 'pipelines/flacdec.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/flacdec.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flacdec.Tpo $(DEPDIR)/flacdec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/flacdec.c' object='flacdec.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flacdec.obj `if test -f 'pipelines/flacdec.c'; then $(CYGPATH_W) 'pipelines/flacdec.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/flacdec.c'; fi` + +simple-launch-lines.o: pipelines/simple-launch-lines.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple-launch-lines.o -MD -MP -MF $(DEPDIR)/simple-launch-lines.Tpo -c -o simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple-launch-lines.Tpo $(DEPDIR)/simple-launch-lines.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/simple-launch-lines.c' object='simple-launch-lines.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c + +simple-launch-lines.obj: pipelines/simple-launch-lines.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple-launch-lines.obj -MD -MP -MF $(DEPDIR)/simple-launch-lines.Tpo -c -o simple-launch-lines.obj `if test -f 'pipelines/simple-launch-lines.c'; then $(CYGPATH_W) 'pipelines/simple-launch-lines.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/simple-launch-lines.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple-launch-lines.Tpo $(DEPDIR)/simple-launch-lines.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/simple-launch-lines.c' object='simple-launch-lines.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple-launch-lines.obj `if test -f 'pipelines/simple-launch-lines.c'; then $(CYGPATH_W) 'pipelines/simple-launch-lines.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/simple-launch-lines.c'; fi` + +tagschecking.o: pipelines/tagschecking.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tagschecking.o -MD -MP -MF $(DEPDIR)/tagschecking.Tpo -c -o tagschecking.o `test -f 'pipelines/tagschecking.c' || echo '$(srcdir)/'`pipelines/tagschecking.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tagschecking.Tpo $(DEPDIR)/tagschecking.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/tagschecking.c' object='tagschecking.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tagschecking.o `test -f 'pipelines/tagschecking.c' || echo '$(srcdir)/'`pipelines/tagschecking.c + +tagschecking.obj: pipelines/tagschecking.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tagschecking.obj -MD -MP -MF $(DEPDIR)/tagschecking.Tpo -c -o tagschecking.obj `if test -f 'pipelines/tagschecking.c'; then $(CYGPATH_W) 'pipelines/tagschecking.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/tagschecking.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tagschecking.Tpo $(DEPDIR)/tagschecking.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/tagschecking.c' object='tagschecking.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tagschecking.obj `if test -f 'pipelines/tagschecking.c'; then $(CYGPATH_W) 'pipelines/tagschecking.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/tagschecking.c'; fi` + +pipelines_wavenc-wavenc.o: pipelines/wavenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavenc_CFLAGS) $(CFLAGS) -MT pipelines_wavenc-wavenc.o -MD -MP -MF $(DEPDIR)/pipelines_wavenc-wavenc.Tpo -c -o pipelines_wavenc-wavenc.o `test -f 'pipelines/wavenc.c' || echo '$(srcdir)/'`pipelines/wavenc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_wavenc-wavenc.Tpo $(DEPDIR)/pipelines_wavenc-wavenc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/wavenc.c' object='pipelines_wavenc-wavenc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavenc_CFLAGS) $(CFLAGS) -c -o pipelines_wavenc-wavenc.o `test -f 'pipelines/wavenc.c' || echo '$(srcdir)/'`pipelines/wavenc.c + +pipelines_wavenc-wavenc.obj: pipelines/wavenc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavenc_CFLAGS) $(CFLAGS) -MT pipelines_wavenc-wavenc.obj -MD -MP -MF $(DEPDIR)/pipelines_wavenc-wavenc.Tpo -c -o pipelines_wavenc-wavenc.obj `if test -f 'pipelines/wavenc.c'; then $(CYGPATH_W) 'pipelines/wavenc.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/wavenc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_wavenc-wavenc.Tpo $(DEPDIR)/pipelines_wavenc-wavenc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/wavenc.c' object='pipelines_wavenc-wavenc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavenc_CFLAGS) $(CFLAGS) -c -o pipelines_wavenc-wavenc.obj `if test -f 'pipelines/wavenc.c'; then $(CYGPATH_W) 'pipelines/wavenc.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/wavenc.c'; fi` + +pipelines_wavpack-wavpack.o: pipelines/wavpack.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavpack_CFLAGS) $(CFLAGS) -MT pipelines_wavpack-wavpack.o -MD -MP -MF $(DEPDIR)/pipelines_wavpack-wavpack.Tpo -c -o pipelines_wavpack-wavpack.o `test -f 'pipelines/wavpack.c' || echo '$(srcdir)/'`pipelines/wavpack.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_wavpack-wavpack.Tpo $(DEPDIR)/pipelines_wavpack-wavpack.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/wavpack.c' object='pipelines_wavpack-wavpack.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavpack_CFLAGS) $(CFLAGS) -c -o pipelines_wavpack-wavpack.o `test -f 'pipelines/wavpack.c' || echo '$(srcdir)/'`pipelines/wavpack.c + +pipelines_wavpack-wavpack.obj: pipelines/wavpack.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavpack_CFLAGS) $(CFLAGS) -MT pipelines_wavpack-wavpack.obj -MD -MP -MF $(DEPDIR)/pipelines_wavpack-wavpack.Tpo -c -o pipelines_wavpack-wavpack.obj `if test -f 'pipelines/wavpack.c'; then $(CYGPATH_W) 'pipelines/wavpack.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/wavpack.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_wavpack-wavpack.Tpo $(DEPDIR)/pipelines_wavpack-wavpack.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/wavpack.c' object='pipelines_wavpack-wavpack.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavpack_CFLAGS) $(CFLAGS) -c -o pipelines_wavpack-wavpack.obj `if test -f 'pipelines/wavpack.c'; then $(CYGPATH_W) 'pipelines/wavpack.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/wavpack.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf elements/.libs elements/_libs + -rm -rf generic/.libs generic/_libs + -rm -rf orc/.libs orc/_libs + -rm -rf pipelines/.libs pipelines/_libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + fi; \ + echo "$${col}$$dashes$${std}"; \ + echo "$${col}$$banner$${std}"; \ + test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ + test -z "$$report" || echo "$${col}$$report$${std}"; \ + echo "$${col}$$dashes$${std}"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f elements/$(am__dirstamp) + -rm -f generic/$(am__dirstamp) + -rm -f orc/$(am__dirstamp) + -rm -f pipelines/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# keep target around, since it's referenced in the modules' Makefiles +clean-local-check: + @echo + +# hangs spectacularly on some machines, so let's not do this by default yet +@HAVE_VALGRIND_TRUE@check-valgrind: +@HAVE_VALGRIND_TRUE@ $(MAKE) valgrind +@HAVE_VALGRIND_FALSE@check-valgrind: +@HAVE_VALGRIND_FALSE@ @true + +# run any given test by running make test.check +# if the test fails, run it again at at least debug level 2 +%.check: % + @$(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $* || \ + $(TESTS_ENVIRONMENT) \ + GST_DEBUG=$$GST_DEBUG,*:2 \ + CK_DEFAULT_TIMEOUT=20 \ + $* + +# run any given test in a loop +%.torture: % + @for i in `seq 1 $(LOOPS)`; do \ + $(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $*; done + +# run any given test in an infinite loop +%.forever: % + @while true; do \ + $(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $* || break; done + +# valgrind any given test by running make test.valgrind +%.valgrind: % + @$(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=360 \ + G_SLICE=always-malloc \ + $(LIBTOOL) --mode=execute \ + $(VALGRIND_PATH) -q \ + $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ + --tool=memcheck --leak-check=full --trace-children=yes \ + --leak-resolution=high --num-callers=20 \ + ./$* 2>&1 | tee valgrind.log + @if grep "==" valgrind.log > /dev/null 2>&1; then \ + rm valgrind.log; \ + exit 1; \ + fi + @rm valgrind.log + +# valgrind any given test and generate suppressions for it +%.valgrind.gen-suppressions: % + @$(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=360 \ + G_SLICE=always-malloc \ + $(LIBTOOL) --mode=execute \ + $(VALGRIND_PATH) -q \ + $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ + --tool=memcheck --leak-check=full --trace-children=yes \ + --leak-resolution=high --num-callers=20 \ + --gen-suppressions=all \ + ./$* 2>&1 | tee suppressions.log + +# valgrind any given test until failure by running make test.valgrind-forever +%.valgrind-forever: % + @while $(MAKE) $*.valgrind; do \ + true; done + +# gdb any given test by running make test.gdb +%.gdb: % + @$(TESTS_ENVIRONMENT) \ + CK_FORK=no \ + $(LIBTOOL) --mode=execute \ + gdb $* + +# torture tests +torture: $(TESTS) + -rm test-registry.xml + @echo "Torturing tests ..." + @for i in `seq 1 $(LOOPS)`; do \ + $(MAKE) check || \ + (echo "Failure after $$i runs"; exit 1) || \ + exit 1; \ + done + @banner="All $(LOOPS) loops passed"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo $$dashes; echo $$banner; echo $$dashes + +# forever tests +forever: $(TESTS) + -rm test-registry.xml + @echo "Forever tests ..." + @while true; do \ + $(MAKE) check || \ + (echo "Failure"; exit 1) || \ + exit 1; \ + done + +# valgrind all tests +valgrind: $(TESTS) + @echo "Valgrinding tests ..." + @failed=0; \ + for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ + $(MAKE) $$t.valgrind; \ + if test "$$?" -ne 0; then \ + echo "Valgrind error for test $$t"; \ + failed=`expr $$failed + 1`; \ + whicht="$$whicht $$t"; \ + fi; \ + done; \ + if test "$$failed" -ne 0; then \ + echo "$$failed tests had leaks or errors under valgrind:"; \ + echo "$$whicht"; \ + false; \ + fi + +# valgrind all tests and generate suppressions +valgrind.gen-suppressions: $(TESTS) + @echo "Valgrinding tests ..." + @failed=0; \ + for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ + $(MAKE) $$t.valgrind.gen-suppressions; \ + if test "$$?" -ne 0; then \ + echo "Valgrind error for test $$t"; \ + failed=`expr $$failed + 1`; \ + whicht="$$whicht $$t"; \ + fi; \ + done; \ + if test "$$failed" -ne 0; then \ + echo "$$failed tests had leaks or errors under valgrind:"; \ + echo "$$whicht"; \ + false; \ + fi +inspect: + @echo "Inspecting features ..." + @for e in `$(TESTS_ENVIRONMENT) $(GST_INSPECT) | head -n -2 \ + | cut -d: -f2`; \ + do echo Inspecting $$e; \ + $(GST_INSPECT) $$e > /dev/null 2>&1; done + +help: + @echo + @echo "make check -- run all checks" + @echo "make torture -- run all checks $(LOOPS) times" + @echo "make (dir)/(test).check -- run the given check once" + @echo "make (dir)/(test).forever -- run the given check forever" + @echo "make (dir)/(test).torture -- run the given check $(LOOPS) times" + @echo + @echo "make (dir)/(test).gdb -- start up gdb for the given test" + @echo + @echo "make valgrind -- valgrind all tests" + @echo "make valgrind.gen-suppressions -- generate suppressions for all tests" + @echo " and save to suppressions.log" + @echo "make (dir)/(test).valgrind -- valgrind the given test" + @echo "make (dir)/(test).valgrind-forever -- valgrind the given test forever" + @echo "make (dir)/(test).valgrind.gen-suppressions -- generate suppressions" + @echo " and save to suppressions.log" + @echo "make inspect -- inspect all plugin features" + @echo + @echo + @echo "Additionally, you can use the GST_CHECKS environment variable to" + @echo "specify which test(s) should be run. This is useful if you are" + @echo "debugging a failure in one particular test, or want to reproduce" + @echo "a race condition in a single test." + @echo + @echo "Examples:" + @echo + @echo " GST_CHECKS=test_this,test_that make element/foobar.check" + @echo " GST_CHECKS=test_many_threads make element/foobar.forever" + @echo + +clean-local: clean-local-check clean-local-orc + +orc/deinterlace.c: $(top_srcdir)/gst/deinterlace/tvtime.orc + $(MKDIR_P) orc/ + $(ORCC) --test -o $@ $< + +orc/videomixer.c: $(top_srcdir)/gst/videomixer/blendorc.orc + $(MKDIR_P) orc/ + $(ORCC) --test -o $@ $< + +orc/videobox.c: $(top_srcdir)/gst/videobox/gstvideoboxorc.orc + $(MKDIR_P) orc/ + $(ORCC) --test -o $@ $< + +clean-local-orc: + rm -rf orc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/check/elements/aacparse.c b/tests/check/elements/aacparse.c new file mode 100644 index 0000000..af10a27 --- /dev/null +++ b/tests/check/elements/aacparse.c @@ -0,0 +1,240 @@ +/* + * GStreamer + * + * unit test for aacparse + * + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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 +#include "parser.h" + +#define SRC_CAPS_CDATA "audio/mpeg, framed=(boolean)false, codec_data=(buffer)1190" +#define SRC_CAPS_TMPL "audio/mpeg, framed=(boolean)false, mpegversion=(int){2,4}" + +#define SINK_CAPS \ + "audio/mpeg, framed=(boolean)true" +#define SINK_CAPS_MPEG2 \ + "audio/mpeg, framed=(boolean)true, mpegversion=2, rate=48000, channels=2" +#define SINK_CAPS_MPEG4 \ + "audio/mpeg, framed=(boolean)true, mpegversion=4, rate=96000, channels=2" +#define SINK_CAPS_TMPL "audio/mpeg, framed=(boolean)true, mpegversion=(int){2,4}" + +GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS_TMPL) + ); + +GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS_TMPL) + ); + +/* some data */ +static guint8 adif_header[] = { + 'A', 'D', 'I', 'F' +}; + +static guint8 adts_frame_mpeg2[] = { + 0xff, 0xf9, 0x4c, 0x80, 0x01, 0xff, 0xfc, 0x21, 0x10, 0xd3, 0x20, 0x0c, + 0x32, 0x00, 0xc7 +}; + +static guint8 adts_frame_mpeg4[] = { + 0xff, 0xf1, 0x4c, 0x80, 0x01, 0xff, 0xfc, 0x21, 0x10, 0xd3, 0x20, 0x0c, + 0x32, 0x00, 0xc7 +}; + +static guint8 garbage_frame[] = { + 0xff, 0xff, 0xff, 0xff, 0xff +}; + +/* + * Test if the parser pushes data with ADIF header properly and detects the + * stream to MPEG4 properly. + */ +GST_START_TEST (test_parse_adif_normal) +{ + GstParserTest ptest; + + /* ADIF header */ + gst_parser_test_init (&ptest, adif_header, sizeof (adif_header), 1); + /* well, no garbage, followed by random data */ + ptest.series[2].size = 100; + ptest.series[2].num = 3; + /* and we do not really expect output frames */ + ptest.framed = FALSE; + /* Check that the negotiated caps are as expected */ + /* For ADIF parser assumes that data is always version 4 */ + ptest.sink_caps = + gst_caps_from_string (SINK_CAPS_MPEG4 ", stream-format=(string)adif"); + + gst_parser_test_run (&ptest, NULL); + + gst_caps_unref (ptest.sink_caps); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_adts_normal) +{ + gst_parser_test_normal (adts_frame_mpeg4, sizeof (adts_frame_mpeg4)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_adts_drain_single) +{ + gst_parser_test_drain_single (adts_frame_mpeg4, sizeof (adts_frame_mpeg4)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_adts_drain_garbage) +{ + gst_parser_test_drain_garbage (adts_frame_mpeg4, sizeof (adts_frame_mpeg4), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_adts_split) +{ + gst_parser_test_split (adts_frame_mpeg4, sizeof (adts_frame_mpeg4)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_adts_skip_garbage) +{ + gst_parser_test_skip_garbage (adts_frame_mpeg4, sizeof (adts_frame_mpeg4), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +/* + * Test if the src caps are set according to stream format (MPEG version). + */ +GST_START_TEST (test_parse_adts_detect_mpeg_version) +{ + gst_parser_test_output_caps (adts_frame_mpeg2, sizeof (adts_frame_mpeg2), + NULL, SINK_CAPS_MPEG2 ", stream-format=(string)adts"); +} + +GST_END_TEST; + +#define structure_get_int(s,f) \ + (g_value_get_int(gst_structure_get_value(s,f))) +#define fail_unless_structure_field_int_equals(s,field,num) \ + fail_unless_equals_int (structure_get_int(s,field), num) +/* + * Test if the parser handles raw stream and codec_data info properly. + */ +GST_START_TEST (test_parse_handle_codec_data) +{ + GstCaps *caps; + GstStructure *s; + const gchar *stream_format; + + /* Push random data. It should get through since the parser should be + * initialized because it got codec_data in the caps */ + caps = gst_parser_test_get_output_caps (NULL, 100, SRC_CAPS_CDATA); + fail_unless (caps != NULL); + + /* Check that the negotiated caps are as expected */ + /* When codec_data is present, parser assumes that data is version 4 */ + GST_LOG ("aac output caps: %" GST_PTR_FORMAT, caps); + s = gst_caps_get_structure (caps, 0); + fail_unless (gst_structure_has_name (s, "audio/mpeg")); + fail_unless_structure_field_int_equals (s, "mpegversion", 4); + fail_unless_structure_field_int_equals (s, "channels", 2); + fail_unless_structure_field_int_equals (s, "rate", 48000); + fail_unless (gst_structure_has_field (s, "codec_data")); + fail_unless (gst_structure_has_field (s, "stream-format")); + stream_format = gst_structure_get_string (s, "stream-format"); + fail_unless (strcmp (stream_format, "raw") == 0); + + gst_caps_unref (caps); +} + +GST_END_TEST; + + +static Suite * +aacparse_suite (void) +{ + Suite *s = suite_create ("aacparse"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + /* ADIF tests */ + tcase_add_test (tc_chain, test_parse_adif_normal); + + /* ADTS tests */ + tcase_add_test (tc_chain, test_parse_adts_normal); + tcase_add_test (tc_chain, test_parse_adts_drain_single); + tcase_add_test (tc_chain, test_parse_adts_drain_garbage); + tcase_add_test (tc_chain, test_parse_adts_split); + tcase_add_test (tc_chain, test_parse_adts_skip_garbage); + tcase_add_test (tc_chain, test_parse_adts_detect_mpeg_version); + + /* Other tests */ + tcase_add_test (tc_chain, test_parse_handle_codec_data); + + return s; +} + + +/* + * TODO: + * - Both push- and pull-modes need to be tested + * * Pull-mode & EOS + */ + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = aacparse_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + /* init test context */ + ctx_factory = "aacparse"; + ctx_sink_template = &sinktemplate; + ctx_src_template = &srctemplate; + + srunner_run_all (sr, CK_NORMAL); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + + return nf; +} diff --git a/tests/check/elements/ac3parse.c b/tests/check/elements/ac3parse.c new file mode 100644 index 0000000..eb25004 --- /dev/null +++ b/tests/check/elements/ac3parse.c @@ -0,0 +1,163 @@ +/* + * GStreamer + * + * unit test for ac3parse + * + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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 +#include "parser.h" + +#define SRC_CAPS_TMPL "audio/x-ac3, framed=(boolean)false" +#define SINK_CAPS_TMPL "audio/x-ac3, framed=(boolean)true" + +GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS_TMPL) + ); + +GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS_TMPL) + ); + +/* some data */ + +static guint8 ac3_frame[512] = { + 0x0b, 0x77, 0xb6, 0xa8, 0x10, 0x40, 0x2f, 0x84, + 0x29, 0xcb, 0xfe, 0x75, 0x7c, 0xf9, 0xf3, 0xe7, + 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, + 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, + 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, + 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, + 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, + 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, + 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, + 0xcf, 0x9f, 0x3e, 0x32, 0xd3, 0xff, 0xc0, 0x06, + 0xe9, 0x40, 0x00, 0x6e, 0x94, 0x00, 0x06, 0xe9, + 0x40, 0x00, 0x6e, 0x94, 0x00, 0x06, 0xe9, 0x40, + 0x00, 0x6e, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static guint8 garbage_frame[] = { + 0xff, 0xff, 0xff, 0xff, 0xff +}; + + +GST_START_TEST (test_parse_normal) +{ + gst_parser_test_normal (ac3_frame, sizeof (ac3_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_drain_single) +{ + gst_parser_test_drain_single (ac3_frame, sizeof (ac3_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_drain_garbage) +{ + gst_parser_test_drain_garbage (ac3_frame, sizeof (ac3_frame), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_split) +{ + gst_parser_test_split (ac3_frame, sizeof (ac3_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_skip_garbage) +{ + gst_parser_test_skip_garbage (ac3_frame, sizeof (ac3_frame), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_detect_stream) +{ + gst_parser_test_output_caps (ac3_frame, sizeof (ac3_frame), + NULL, SINK_CAPS_TMPL ",channels=1,rate=48000,alignment=frame"); +} + +GST_END_TEST; + + +static Suite * +ac3parse_suite (void) +{ + Suite *s = suite_create ("ac3parse"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_parse_normal); + tcase_add_test (tc_chain, test_parse_drain_single); + tcase_add_test (tc_chain, test_parse_drain_garbage); + tcase_add_test (tc_chain, test_parse_split); + tcase_add_test (tc_chain, test_parse_skip_garbage); + tcase_add_test (tc_chain, test_parse_detect_stream); + + return s; +} + + +/* + * TODO: + * - Both push- and pull-modes need to be tested + * * Pull-mode & EOS + */ + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = ac3parse_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + /* init test context */ + ctx_factory = "ac3parse"; + ctx_sink_template = &sinktemplate; + ctx_src_template = &srctemplate; + + srunner_run_all (sr, CK_NORMAL); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + + return nf; +} diff --git a/tests/check/elements/alphacolor.c b/tests/check/elements/alphacolor.c new file mode 100644 index 0000000..abe182d --- /dev/null +++ b/tests/check/elements/alphacolor.c @@ -0,0 +1,292 @@ +/* GStreamer unit test for the alphacolor element + * + * Copyright (C) 2007 Tim-Philipp Müller + * + * 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 +#include + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV")) + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB) + ); + +static GstElement * +setup_alphacolor (void) +{ + GstElement *alphacolor; + + alphacolor = gst_check_setup_element ("alphacolor"); + mysrcpad = gst_check_setup_src_pad (alphacolor, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (alphacolor, &sinktemplate, NULL); + + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return alphacolor; +} + +static void +cleanup_alphacolor (GstElement * alphacolor) +{ + GST_DEBUG ("cleaning up"); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (alphacolor); + gst_check_teardown_sink_pad (alphacolor); + gst_check_teardown_element (alphacolor); +} + +#define WIDTH 3 +#define HEIGHT 4 + +static GstCaps * +create_caps_rgb24 (void) +{ + GstCaps *caps; + + caps = gst_caps_new_simple ("video/x-raw-rgb", + "width", G_TYPE_INT, 3, + "height", G_TYPE_INT, 4, + "bpp", G_TYPE_INT, 24, + "depth", G_TYPE_INT, 24, + "framerate", GST_TYPE_FRACTION, 0, 1, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "red_mask", G_TYPE_INT, 0x00ff0000, + "green_mask", G_TYPE_INT, 0x0000ff00, + "blue_mask", G_TYPE_INT, 0x000000ff, NULL); + + return caps; +} + +static GstCaps * +create_caps_rgba32 (void) +{ + GstCaps *caps; + + caps = gst_caps_new_simple ("video/x-raw-rgb", + "width", G_TYPE_INT, 3, + "height", G_TYPE_INT, 4, + "bpp", G_TYPE_INT, 32, + "depth", G_TYPE_INT, 32, + "framerate", GST_TYPE_FRACTION, 0, 1, + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "red_mask", G_TYPE_INT, 0xff000000, + "green_mask", G_TYPE_INT, 0x00ff0000, + "blue_mask", G_TYPE_INT, 0x0000ff00, + "alpha_mask", G_TYPE_INT, 0x000000ff, NULL); + + return caps; +} + +static GstBuffer * +create_buffer_rgb24_3x4 (void) +{ + /* stride is rounded up to multiple of 4, so 3 bytes padding for each row */ + const guint8 rgb24_3x4_img[HEIGHT * GST_ROUND_UP_4 (WIDTH * 3)] = { + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00 + }; + guint rowstride = GST_ROUND_UP_4 (WIDTH * 3); + GstBuffer *buf; + GstCaps *caps; + + buf = gst_buffer_new_and_alloc (HEIGHT * rowstride); + fail_unless_equals_int (GST_BUFFER_SIZE (buf), sizeof (rgb24_3x4_img)); + memcpy (GST_BUFFER_DATA (buf), rgb24_3x4_img, sizeof (rgb24_3x4_img)); + + caps = create_caps_rgb24 (); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + return buf; +} + +static GstBuffer * +create_buffer_rgba32_3x4 (void) +{ + /* stride is rounded up to multiple of 4, so 3 bytes padding for each row */ + /* should be: RED BLUE WHITE where 'nothing' is fully transparent + * GREEN RED BLUE and all other colours are fully + * NOTHING GREEN RED opaque. + * BLACK NOTHING GREEN + */ + const guint8 rgba32_3x4_img[HEIGHT * WIDTH * 4] = { + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff + }; + guint rowstride = WIDTH * 4; + GstBuffer *buf; + GstCaps *caps; + + buf = gst_buffer_new_and_alloc (HEIGHT * rowstride); + fail_unless_equals_int (GST_BUFFER_SIZE (buf), sizeof (rgba32_3x4_img)); + memcpy (GST_BUFFER_DATA (buf), rgba32_3x4_img, sizeof (rgba32_3x4_img)); + + caps = create_caps_rgba32 (); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + return buf; +} + +GST_START_TEST (test_rgb24) +{ + GstElement *alphacolor; + GstBuffer *inbuffer; + GstCaps *incaps; + + incaps = create_caps_rgb24 (); + alphacolor = setup_alphacolor (); + + fail_unless_equals_int (gst_element_set_state (alphacolor, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + inbuffer = create_buffer_rgb24_3x4 (); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away reference; this should error out with a not-negotiated + * error, alphacolor should only accept RGBA caps, not but plain RGB24 caps */ + GST_DEBUG ("push it"); + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), + GST_FLOW_NOT_NEGOTIATED); + GST_DEBUG ("pushed it"); + + fail_unless (g_list_length (buffers) == 0); + + fail_unless_equals_int (gst_element_set_state (alphacolor, GST_STATE_NULL), + GST_STATE_CHANGE_SUCCESS); + + /* cleanup */ + GST_DEBUG ("cleanup alphacolor"); + cleanup_alphacolor (alphacolor); + GST_DEBUG ("cleanup, unref incaps"); + ASSERT_CAPS_REFCOUNT (incaps, "incaps", 1); + gst_caps_unref (incaps); +} + +GST_END_TEST; + +/* these macros assume WIDTH and HEIGHT is fixed to what's defined above */ +#define fail_unless_ayuv_pixel_has_alpha(ayuv,x,y,a) \ + { \ + guint8 *pixel; \ + pixel = ((guint8*)(ayuv) + ((WIDTH * 4) * (y)) + ((x) * 4)); \ + fail_unless_equals_int (pixel[0], a); \ + } + +GST_START_TEST (test_rgba32) +{ + GstElement *alphacolor; + GstBuffer *inbuffer; + GstBuffer *outbuffer; + GstCaps *incaps; + guint8 *ayuv; + guint outlength; + + incaps = create_caps_rgba32 (); + alphacolor = setup_alphacolor (); + + fail_unless_equals_int (gst_element_set_state (alphacolor, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + inbuffer = create_buffer_rgba32_3x4 (); + GST_DEBUG ("Created buffer of %d bytes", GST_BUFFER_SIZE (inbuffer)); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away reference */ + GST_DEBUG ("push it"); + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + GST_DEBUG ("pushed it"); + + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) == 1); + outbuffer = (GstBuffer *) buffers->data; + fail_if (outbuffer == NULL); + fail_unless (GST_IS_BUFFER (outbuffer)); + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + outlength = WIDTH * HEIGHT * 4; /* output is AYUV */ + fail_unless_equals_int (GST_BUFFER_SIZE (outbuffer), outlength); + + ayuv = GST_BUFFER_DATA (outbuffer); + + /* check alpha values (0x00 = totally transparent, 0xff = totally opaque) */ + fail_unless_ayuv_pixel_has_alpha (ayuv, 0, 0, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 1, 0, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 2, 0, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 0, 1, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 1, 1, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 2, 1, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 0, 2, 0x00); + fail_unless_ayuv_pixel_has_alpha (ayuv, 1, 2, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 2, 2, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 0, 3, 0xff); + fail_unless_ayuv_pixel_has_alpha (ayuv, 1, 3, 0x00); + fail_unless_ayuv_pixel_has_alpha (ayuv, 2, 3, 0xff); + + /* we don't check the YUV data, because apparently results differ slightly + * depending on whether we run in valgrind or not */ + + buffers = g_list_remove (buffers, outbuffer); + gst_buffer_unref (outbuffer); + + fail_unless_equals_int (gst_element_set_state (alphacolor, GST_STATE_NULL), + GST_STATE_CHANGE_SUCCESS); + + /* cleanup */ + GST_DEBUG ("cleanup alphacolor"); + cleanup_alphacolor (alphacolor); + GST_DEBUG ("cleanup, unref incaps"); + ASSERT_CAPS_REFCOUNT (incaps, "incaps", 1); + gst_caps_unref (incaps); +} + +GST_END_TEST; + + +static Suite * +alphacolor_suite (void) +{ + Suite *s = suite_create ("alphacolor"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_rgb24); + tcase_add_test (tc_chain, test_rgba32); + + return s; +} + +GST_CHECK_MAIN (alphacolor); diff --git a/tests/check/elements/amrparse.c b/tests/check/elements/amrparse.c new file mode 100644 index 0000000..e5d64ca --- /dev/null +++ b/tests/check/elements/amrparse.c @@ -0,0 +1,327 @@ +/* + * GStreamer + * + * unit test for amrparse + * + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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 +#include "parser.h" + +#define SRC_CAPS_NB "audio/x-amr-nb-sh" +#define SRC_CAPS_WB "audio/x-amr-wb-sh" +#define SRC_CAPS_ANY "ANY" + +#define SINK_CAPS_NB "audio/AMR, rate=8000 , channels=1" +#define SINK_CAPS_WB "audio/AMR-WB, rate=16000 , channels=1" +#define SINK_CAPS_ANY "ANY" + +#define AMR_FRAME_DURATION (GST_SECOND/50) + +static GstStaticPadTemplate sinktemplate_nb = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS_NB) + ); + +static GstStaticPadTemplate sinktemplate_wb = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS_WB) + ); + +static GstStaticPadTemplate srctemplate_nb = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS_NB) + ); + +static GstStaticPadTemplate srctemplate_wb = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS_WB) + ); + + +/* some data */ + +static guint8 frame_data_nb[] = { + 0x0c, 0x56, 0x3c, 0x52, 0xe0, 0x61, 0xbc, 0x45, + 0x0f, 0x98, 0x2e, 0x01, 0x42, 0x02 +}; + +static guint8 frame_data_wb[] = { + 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 +}; + +static guint8 frame_hdr_nb[] = { + '#', '!', 'A', 'M', 'R', '\n' +}; + +static guint8 frame_hdr_wb[] = { + '#', '!', 'A', 'M', 'R', '-', 'W', 'B', '\n' +}; + +static guint8 garbage_frame[] = { + 0xff, 0xff, 0xff, 0xff, 0xff +}; + + +GST_START_TEST (test_parse_nb_normal) +{ + gst_parser_test_normal (frame_data_nb, sizeof (frame_data_nb)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_nb_drain_single) +{ + gst_parser_test_drain_single (frame_data_nb, sizeof (frame_data_nb)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_nb_drain_garbage) +{ + gst_parser_test_drain_garbage (frame_data_nb, sizeof (frame_data_nb), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_nb_split) +{ + gst_parser_test_split (frame_data_nb, sizeof (frame_data_nb)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_nb_skip_garbage) +{ + gst_parser_test_skip_garbage (frame_data_nb, sizeof (frame_data_nb), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_nb_detect_stream) +{ + GstParserTest ptest; + GstCaps *old_ctx_caps; + + /* no input caps, override ctx */ + old_ctx_caps = ctx_input_caps; + ctx_input_caps = NULL; + + /* AMR-NB header */ + gst_parser_test_init (&ptest, frame_hdr_nb, sizeof (frame_hdr_nb), 1); + /* well, no garbage, followed by real data */ + ptest.series[2].data = frame_data_nb; + ptest.series[2].size = sizeof (frame_data_nb); + ptest.series[2].num = 10; + /* header gets dropped, so ... */ + /* buffer count will not match */ + ptest.framed = FALSE; + /* total size a bit less */ + ptest.dropped = sizeof (frame_hdr_nb); + + /* Check that the negotiated caps are as expected */ + ptest.sink_caps = gst_caps_from_string (SINK_CAPS_NB); + + gst_parser_test_run (&ptest, NULL); + + gst_caps_unref (ptest.sink_caps); + + ctx_input_caps = old_ctx_caps; +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_wb_normal) +{ + gst_parser_test_normal (frame_data_wb, sizeof (frame_data_wb)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_wb_drain_single) +{ + gst_parser_test_drain_single (frame_data_wb, sizeof (frame_data_wb)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_wb_drain_garbage) +{ + gst_parser_test_drain_garbage (frame_data_wb, sizeof (frame_data_wb), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_wb_split) +{ + gst_parser_test_split (frame_data_wb, sizeof (frame_data_wb)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_wb_skip_garbage) +{ + gst_parser_test_skip_garbage (frame_data_wb, sizeof (frame_data_wb), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_wb_detect_stream) +{ + GstParserTest ptest; + GstCaps *old_ctx_caps; + + /* no input caps, override ctx */ + old_ctx_caps = ctx_input_caps; + ctx_input_caps = NULL; + + /* AMR-WB header */ + gst_parser_test_init (&ptest, frame_hdr_wb, sizeof (frame_hdr_wb), 1); + /* well, no garbage, followed by real data */ + ptest.series[2].data = frame_data_wb; + ptest.series[2].size = sizeof (frame_data_wb); + ptest.series[2].num = 10; + /* header gets dropped, so ... */ + /* buffer count will not match */ + ptest.framed = FALSE; + /* total size a bit less */ + ptest.dropped = sizeof (frame_hdr_wb); + + /* Check that the negotiated caps are as expected */ + ptest.sink_caps = gst_caps_from_string (SINK_CAPS_WB); + + gst_parser_test_run (&ptest, NULL); + + gst_caps_unref (ptest.sink_caps); + + ctx_input_caps = old_ctx_caps; +} + +GST_END_TEST; + + + +/* + * Create test suite. + */ +static Suite * +amrnb_parse_suite (void) +{ + Suite *s = suite_create ("amrwb_parse"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + /* AMR-NB tests */ + tcase_add_test (tc_chain, test_parse_nb_normal); + tcase_add_test (tc_chain, test_parse_nb_drain_single); + tcase_add_test (tc_chain, test_parse_nb_drain_garbage); + tcase_add_test (tc_chain, test_parse_nb_split); + tcase_add_test (tc_chain, test_parse_nb_detect_stream); + tcase_add_test (tc_chain, test_parse_nb_skip_garbage); + + return s; +} + +static Suite * +amrwb_parse_suite (void) +{ + Suite *s = suite_create ("amrnb_parse"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + /* AMR-WB tests */ + tcase_add_test (tc_chain, test_parse_wb_normal); + tcase_add_test (tc_chain, test_parse_wb_drain_single); + tcase_add_test (tc_chain, test_parse_wb_drain_garbage); + tcase_add_test (tc_chain, test_parse_wb_split); + tcase_add_test (tc_chain, test_parse_wb_detect_stream); + tcase_add_test (tc_chain, test_parse_wb_skip_garbage); + + return s; +} + +/* + * TODO: + * - Both push- and pull-modes need to be tested + * * Pull-mode & EOS + */ + +int +main (int argc, char **argv) +{ + int nf; + GstCaps *caps; + + Suite *s = amrnb_parse_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + /* init test context */ + ctx_factory = "amrparse"; + ctx_sink_template = &sinktemplate_nb; + ctx_src_template = &srctemplate_nb; + caps = gst_caps_from_string (SRC_CAPS_NB); + g_assert (caps); + ctx_input_caps = caps; + + srunner_run_all (sr, CK_NORMAL); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + gst_caps_unref (caps); + + s = amrwb_parse_suite (); + sr = srunner_create (s); + + ctx_sink_template = &sinktemplate_wb; + ctx_src_template = &srctemplate_wb; + caps = gst_caps_from_string (SRC_CAPS_WB); + g_assert (caps); + ctx_input_caps = caps; + + srunner_run_all (sr, CK_NORMAL); + nf += srunner_ntests_failed (sr); + srunner_free (sr); + gst_caps_unref (caps); + + return nf; +} diff --git a/tests/check/elements/apev2mux.c b/tests/check/elements/apev2mux.c new file mode 100644 index 0000000..fbbfb0d --- /dev/null +++ b/tests/check/elements/apev2mux.c @@ -0,0 +1,433 @@ +/* GStreamer + * + * unit test for the taglib-based apev2mux element + * + * Copyright (C) 2006 Tim-Philipp Müller + * Copyright (C) 2006 Sebastian Dröge + * + * 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 + +#include +#include + +#define TEST_ARTIST "Ar T\303\255st" +#define TEST_TITLE "M\303\274llermilch!" +#define TEST_ALBUM "Boom" +#define TEST_DATE g_date_new_dmy(1,1,2006) +#define TEST_TRACK_NUMBER 7 +#define TEST_TRACK_COUNT 19 +#define TEST_TRACK_GAIN 1.45 +#define TEST_ALBUM_GAIN 0.78 + +/* for dummy mp3 frame sized MP3_FRAME_SIZE bytes, + * start: ff fb b0 44 00 00 08 00 00 4b 00 00 00 00 00 00 */ +static const guint8 mp3_dummyhdr[] = { 0xff, 0xfb, 0xb0, 0x44, 0x00, 0x00, + 0x08, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00 +}; + +#define MP3_FRAME_SIZE 626 + +static GstTagList * +test_taglib_apev2mux_create_tags (guint32 mask) +{ + GstTagList *tags; + + tags = gst_tag_list_new (); + + if (mask & (1 << 0)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ARTIST, TEST_ARTIST, NULL); + } + if (mask & (1 << 1)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TITLE, TEST_TITLE, NULL); + } + if (mask & (1 << 2)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ALBUM, TEST_ALBUM, NULL); + } + if (mask & (1 << 3)) { + GDate *date; + + date = TEST_DATE; + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_DATE, date, NULL); + g_date_free (date); + } + if (mask & (1 << 4)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TRACK_NUMBER, TEST_TRACK_NUMBER, NULL); + } + if (mask & (1 << 5)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TRACK_COUNT, TEST_TRACK_COUNT, NULL); + } + if (mask & (1 << 6)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TRACK_GAIN, TEST_TRACK_GAIN, NULL); + } + if (mask & (1 << 7)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ALBUM_GAIN, TEST_ALBUM_GAIN, NULL); + } + if (mask & (1 << 8)) { + } + if (mask & (1 << 9)) { + } + if (mask & (1 << 10)) { + } + if (mask & (1 << 11)) { + } + if (mask & (1 << 12)) { + } + if (mask & (1 << 13)) { + } + return tags; +} + +static void +test_taglib_apev2mux_check_tags (GstTagList * tags, guint32 mask) +{ + if (mask & (1 << 0)) { + gchar *s = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &s)); + fail_unless (g_str_equal (s, TEST_ARTIST)); + g_free (s); + } + if (mask & (1 << 1)) { + gchar *s = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &s)); + fail_unless (g_str_equal (s, TEST_TITLE)); + g_free (s); + } + if (mask & (1 << 2)) { + gchar *s = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &s)); + fail_unless (g_str_equal (s, TEST_ALBUM)); + g_free (s); + } + if (mask & (1 << 3)) { + GDate *shouldbe, *date = NULL; + + shouldbe = TEST_DATE; + fail_unless (gst_tag_list_get_date (tags, GST_TAG_DATE, &date)); + fail_unless (g_date_compare (shouldbe, date) == 0); + g_date_free (shouldbe); + g_date_free (date); + } + if (mask & (1 << 4)) { + guint num; + + fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_NUMBER, &num)); + fail_unless (num == TEST_TRACK_NUMBER); + } + if (mask & (1 << 5)) { + guint count; + + fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_COUNT, &count)); + fail_unless (count == TEST_TRACK_COUNT); + } + if (mask & (1 << 6)) { + gdouble gain; + + fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_GAIN, &gain)); + fail_unless (gain == TEST_TRACK_GAIN); + } + if (mask & (1 << 7)) { + gdouble gain; + + fail_unless (gst_tag_list_get_double (tags, GST_TAG_ALBUM_GAIN, &gain)); + fail_unless (gain == TEST_ALBUM_GAIN); + } + if (mask & (1 << 8)) { + } + if (mask & (1 << 9)) { + } + if (mask & (1 << 10)) { + } + if (mask & (1 << 11)) { + } + if (mask & (1 << 12)) { + } + if (mask & (1 << 13)) { + } +} + +static void +fill_mp3_buffer (GstElement * fakesrc, GstBuffer * buf, GstPad * pad, + guint64 * p_offset) +{ + fail_unless (GST_BUFFER_SIZE (buf) == MP3_FRAME_SIZE); + + GST_LOG ("filling buffer with fake mp3 data, offset = %" G_GUINT64_FORMAT, + *p_offset); + + memcpy (GST_BUFFER_DATA (buf), mp3_dummyhdr, sizeof (mp3_dummyhdr)); + + /* can't use gst_buffer_set_caps() here because the metadata isn't writable + * because of the extra refcounts taken by the signal emission mechanism; + * we know it's fine to use GST_BUFFER_CAPS() here though */ + GST_BUFFER_CAPS (buf) = gst_caps_new_simple ("audio/mpeg", "mpegversion", + G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL); + + GST_BUFFER_OFFSET (buf) = *p_offset; + *p_offset += GST_BUFFER_SIZE (buf); +} + +static void +got_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad, + GstBuffer ** p_buf) +{ + gint64 off; + guint size; + + off = GST_BUFFER_OFFSET (buf); + size = GST_BUFFER_SIZE (buf); + + GST_LOG ("got buffer, size=%u, offset=%" G_GINT64_FORMAT, size, off); + + fail_unless (GST_BUFFER_OFFSET_IS_VALID (buf)); + + if (*p_buf == NULL || (off + size) > GST_BUFFER_SIZE (*p_buf)) { + GstBuffer *newbuf; + + /* not very elegant, but who cares */ + newbuf = gst_buffer_new_and_alloc (off + size); + if (*p_buf) { + memcpy (GST_BUFFER_DATA (newbuf), GST_BUFFER_DATA (*p_buf), + GST_BUFFER_SIZE (*p_buf)); + } + memcpy (GST_BUFFER_DATA (newbuf) + off, GST_BUFFER_DATA (buf), size); + if (*p_buf) + gst_buffer_unref (*p_buf); + *p_buf = newbuf; + } else { + memcpy (GST_BUFFER_DATA (*p_buf) + off, GST_BUFFER_DATA (buf), size); + } +} + +static void +demux_pad_added (GstElement * apedemux, GstPad * srcpad, GstBuffer ** p_outbuf) +{ + GstElement *fakesink, *pipeline; + + GST_LOG ("apedemux added source pad with caps %" GST_PTR_FORMAT, + GST_PAD_CAPS (srcpad)); + + pipeline = apedemux; + while (GST_OBJECT_PARENT (pipeline) != NULL) + pipeline = (GstElement *) GST_OBJECT_PARENT (pipeline); + + fakesink = gst_element_factory_make ("fakesink", "fakesink"); + g_assert (fakesink != NULL); + + /* set up sink */ + g_object_set (fakesink, "signal-handoffs", TRUE, NULL); + g_signal_connect (fakesink, "handoff", G_CALLBACK (got_buffer), p_outbuf); + + gst_bin_add (GST_BIN (pipeline), fakesink); + gst_element_set_state (fakesink, GST_STATE_PLAYING); + + fail_unless (gst_element_link (apedemux, fakesink)); +} + +static void +test_taglib_apev2mux_check_output_buffer (GstBuffer * buf) +{ + guint8 *data = GST_BUFFER_DATA (buf); + guint size = GST_BUFFER_SIZE (buf); + guint off; + + g_assert (size % MP3_FRAME_SIZE == 0); + + for (off = 0; off < size; off += MP3_FRAME_SIZE) { + fail_unless (memcmp (data + off, mp3_dummyhdr, sizeof (mp3_dummyhdr)) == 0); + } +} + +static void +test_taglib_apev2mux_with_tags (GstTagList * tags, guint32 mask) +{ + GstMessage *msg; + GstTagList *tags_read = NULL; + GstElement *pipeline, *apev2mux, *apedemux, *fakesrc; + GstBus *bus; + guint64 offset; + GstBuffer *outbuf = NULL; + + pipeline = gst_pipeline_new ("pipeline"); + g_assert (pipeline != NULL); + + fakesrc = gst_element_factory_make ("fakesrc", "fakesrc"); + g_assert (fakesrc != NULL); + + apev2mux = gst_element_factory_make ("apev2mux", "apev2mux"); + g_assert (apev2mux != NULL); + + apedemux = gst_element_factory_make ("apedemux", "apedemux"); + g_assert (apedemux != NULL); + + outbuf = NULL; + g_signal_connect (apedemux, "pad-added", + G_CALLBACK (demux_pad_added), &outbuf); + + gst_bin_add (GST_BIN (pipeline), fakesrc); + gst_bin_add (GST_BIN (pipeline), apev2mux); + gst_bin_add (GST_BIN (pipeline), apedemux); + + gst_tag_setter_merge_tags (GST_TAG_SETTER (apev2mux), tags, + GST_TAG_MERGE_APPEND); + + gst_element_link_many (fakesrc, apev2mux, apedemux, NULL); + + /* set up source */ + g_object_set (fakesrc, "signal-handoffs", TRUE, "can-activate-pull", FALSE, + "filltype", 2, "sizetype", 2, "sizemax", MP3_FRAME_SIZE, + "num-buffers", 16, NULL); + + offset = 0; + g_signal_connect (fakesrc, "handoff", G_CALLBACK (fill_mp3_buffer), &offset); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + fail_unless (gst_element_get_state (pipeline, NULL, NULL, + -1) == GST_STATE_CHANGE_SUCCESS); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + + GST_LOG ("Waiting for tag ..."); + msg = + gst_bus_poll (bus, GST_MESSAGE_TAG | GST_MESSAGE_EOS | GST_MESSAGE_ERROR, + -1); + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + g_printerr ("ERROR from element %s: %s\n%s\n", + GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg)); + g_error_free (err); + g_free (dbg); + } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { + g_printerr ("EOS message, but were waiting for TAGS!\n"); + } + fail_unless (msg->type == GST_MESSAGE_TAG); + + gst_message_parse_tag (msg, &tags_read); + gst_message_unref (msg); + + GST_LOG ("Got tags: %" GST_PTR_FORMAT, tags_read); + test_taglib_apev2mux_check_tags (tags_read, mask); + gst_tag_list_free (tags_read); + + GST_LOG ("Waiting for EOS ..."); + msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + g_printerr ("ERROR from element %s: %s\n%s\n", + GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg)); + g_error_free (err); + g_free (dbg); + } + fail_unless (msg->type == GST_MESSAGE_EOS); + gst_message_unref (msg); + + gst_object_unref (bus); + + GST_LOG ("Got EOS, shutting down ..."); + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + test_taglib_apev2mux_check_output_buffer (outbuf); + gst_buffer_unref (outbuf); + + GST_LOG ("Done"); +} + +GST_START_TEST (test_apev2mux) +{ + GstTagList *tags; + gint i; + + g_random_set_seed (247166295); + + /* internal consistency check */ + tags = test_taglib_apev2mux_create_tags (0xFFFFFFFF); + test_taglib_apev2mux_check_tags (tags, 0xFFFFFFFF); + gst_tag_list_free (tags); + + /* now the real tests */ + for (i = 0; i < 50; ++i) { + guint32 mask; + + mask = g_random_int (); + GST_LOG ("tag mask = %08x (i=%d)", mask, i); + + if (mask == 0) + continue; + + /* create tags */ + tags = test_taglib_apev2mux_create_tags (mask); + GST_LOG ("tags for mask %08x = %" GST_PTR_FORMAT, mask, tags); + + /* double-check for internal consistency */ + test_taglib_apev2mux_check_tags (tags, mask); + + /* test with pipeline */ + test_taglib_apev2mux_with_tags (tags, mask); + + /* free tags */ + gst_tag_list_free (tags); + } +} + +GST_END_TEST; + +static Suite * +apev2mux_suite (void) +{ + Suite *s = suite_create ("apev2mux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_apev2mux); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = apev2mux_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/aspectratiocrop.c b/tests/check/elements/aspectratiocrop.c new file mode 100644 index 0000000..5d42bfb --- /dev/null +++ b/tests/check/elements/aspectratiocrop.c @@ -0,0 +1,201 @@ +/* GStreamer unit test for the aspectratiocrop element + * Copyright (C) 2009 Thijs Vermeir + * + * 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 +#include +#include + +#define ASPECT_RATIO_CROP_CAPS \ + GST_VIDEO_CAPS_RGBx ";" \ + GST_VIDEO_CAPS_xRGB ";" \ + GST_VIDEO_CAPS_BGRx ";" \ + GST_VIDEO_CAPS_xBGR ";" \ + GST_VIDEO_CAPS_RGBA ";" \ + GST_VIDEO_CAPS_ARGB ";" \ + GST_VIDEO_CAPS_BGRA ";" \ + GST_VIDEO_CAPS_ABGR ";" \ + GST_VIDEO_CAPS_RGB ";" \ + GST_VIDEO_CAPS_BGR ";" \ + GST_VIDEO_CAPS_YUV ("AYUV") ";" \ + GST_VIDEO_CAPS_YUV ("YUY2") ";" \ + GST_VIDEO_CAPS_YUV ("YVYU") ";" \ + GST_VIDEO_CAPS_YUV ("UYVY") ";" \ + GST_VIDEO_CAPS_YUV ("Y800") ";" \ + GST_VIDEO_CAPS_YUV ("I420") ";" \ + GST_VIDEO_CAPS_YUV ("YV12") ";" \ + GST_VIDEO_CAPS_RGB_16 ";" \ + GST_VIDEO_CAPS_RGB_15 + +static GstBuffer * +make_buffer_with_caps (const gchar * caps_string, int buffer_size) +{ + GstCaps *caps; + GstBuffer *temp; + + caps = gst_caps_from_string (caps_string); + temp = gst_buffer_new_and_alloc (buffer_size); + fail_if (caps == NULL); + fail_if (temp == NULL); + gst_buffer_set_caps (temp, caps); + gst_caps_unref (caps); + + return temp; +} + +static void +check_aspectratiocrop (const gchar * in_string, const gchar * out_string, + gint in_size, gint out_size, gint ar_n, gint ar_d) +{ + GstElement *element; + GstPad *pad_peer; + GstPad *sink_pad = NULL; + GstPad *src_pad; + GstBuffer *new; + GstBuffer *buffer; + GstBuffer *buffer_out; + GstCaps *sink_caps; + + buffer = make_buffer_with_caps (in_string, in_size); + buffer_out = make_buffer_with_caps (out_string, out_size); + + /* check that there are no buffers waiting */ + gst_check_drop_buffers (); + + /* create the element */ + element = gst_check_setup_element ("aspectratiocrop"); + + /* set the requested aspect ratio */ + g_object_set (G_OBJECT (element), "aspect-ratio", ar_n, ar_d, NULL); + + /* create the src pad */ + src_pad = gst_pad_new (NULL, GST_PAD_SRC); + gst_pad_set_caps (src_pad, GST_BUFFER_CAPS (buffer)); + pad_peer = gst_element_get_static_pad (element, "sink"); + fail_if (pad_peer == NULL); + fail_unless (gst_pad_link (src_pad, pad_peer) == GST_PAD_LINK_OK, + "Could not link source and %s sink pads", GST_ELEMENT_NAME (element)); + gst_object_unref (pad_peer); + gst_pad_set_active (src_pad, TRUE); + + /* create the sink pad */ + pad_peer = gst_element_get_static_pad (element, "src"); + sink_caps = gst_caps_from_string (ASPECT_RATIO_CROP_CAPS); + sink_pad = gst_pad_new (NULL, GST_PAD_SINK); + GST_PAD_CAPS (sink_pad) = sink_caps; + fail_unless (gst_pad_link (pad_peer, sink_pad) == GST_PAD_LINK_OK, + "Could not link sink and %s source pads", GST_ELEMENT_NAME (element)); + gst_object_unref (pad_peer); + gst_pad_set_chain_function (sink_pad, gst_check_chain_func); + gst_pad_set_active (sink_pad, TRUE); + + /* configure the sink pad */ + fail_unless (gst_element_set_state (element, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + fail_unless (gst_pad_push (src_pad, buffer) == GST_FLOW_OK, + "Failed to push buffer"); + fail_unless (gst_element_set_state (element, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + + /* check the result */ + fail_unless (g_list_length (buffers) == 1); + new = GST_BUFFER (buffers->data); + buffers = g_list_remove (buffers, new); + fail_unless (GST_BUFFER_SIZE (buffer_out) == GST_BUFFER_SIZE (new), + "size of the buffers are not the same"); + gst_check_caps_equal (GST_BUFFER_CAPS (buffer_out), GST_BUFFER_CAPS (new)); + gst_buffer_unref (new); + gst_buffer_unref (buffer_out); + + /* teardown the element and pads */ + gst_pad_set_active (src_pad, FALSE); + gst_check_teardown_src_pad (element); + gst_pad_set_active (sink_pad, FALSE); + gst_check_teardown_sink_pad (element); + gst_check_teardown_element (element); +} + +GST_START_TEST (test_no_cropping) +{ + check_aspectratiocrop + ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1", + "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1", + 153600, 153600, 4, 3); + check_aspectratiocrop + ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)320, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)4/3", + "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)320, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)4/3", + 204800, 204800, 4, 3); +} + +GST_END_TEST; + +GST_START_TEST (test_autocropping) +{ + check_aspectratiocrop + ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)4/3", + "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)240, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)4/3", + 153600, 115200, 4, 3); + + check_aspectratiocrop + ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)16/9", + "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)180, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)16/9", + 153600, 86400, 4, 3); + + check_aspectratiocrop + ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)16/15", + "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)192, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)16/15", + 153600, 122880, 16, 9); + +} + +GST_END_TEST; + +static Suite * +aspectratiocrop_suite (void) +{ + Suite *s = suite_create ("aspectratiocrop"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_no_cropping); + tcase_add_test (tc_chain, test_autocropping); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = aspectratiocrop_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/audioamplify.c b/tests/check/elements/audioamplify.c new file mode 100644 index 0000000..48ce8ff --- /dev/null +++ b/tests/check/elements/audioamplify.c @@ -0,0 +1,469 @@ +/* GStreamer + * + * unit test for audioamplify + * + * Copyright (C) 2007 Sebastian Dröge + * + * Greatly based on the audiopanorama unit test + * Copyright (C) 2006 Stefan Kost + * + * 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 + +#include +#include + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + + +#define AMPLIFY_CAPS_STRING \ + "audio/x-raw-int, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (bool) TRUE" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 1, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 1, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); + +static GstElement * +setup_amplify (void) +{ + GstElement *amplify; + + GST_DEBUG ("setup_amplify"); + amplify = gst_check_setup_element ("audioamplify"); + mysrcpad = gst_check_setup_src_pad (amplify, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (amplify, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return amplify; +} + +static void +cleanup_amplify (GstElement * amplify) +{ + GST_DEBUG ("cleanup_amplify"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (amplify); + gst_check_teardown_sink_pad (amplify); + gst_check_teardown_element (amplify); +} + +GST_START_TEST (test_passthrough) +{ + GstElement *amplify; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 *res; + + amplify = setup_amplify (); + fail_unless (gst_element_set_state (amplify, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3], + res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 12) == 0); + + /* cleanup */ + cleanup_amplify (amplify); +} + +GST_END_TEST; + +GST_START_TEST (test_zero) +{ + GstElement *amplify; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 out[6] = { 0, 0, 0, 0, 0, 0 }; + gint16 *res; + + amplify = setup_amplify (); + g_object_set (G_OBJECT (amplify), "amplification", 0.0, NULL); + fail_unless (gst_element_set_state (amplify, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], + res[3], res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); + + /* cleanup */ + cleanup_amplify (amplify); +} + +GST_END_TEST; + +GST_START_TEST (test_050_clip) +{ + GstElement *amplify; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 }; + gint16 *res; + + amplify = setup_amplify (); + g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL); + fail_unless (gst_element_set_state (amplify, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], + res[3], res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); + + /* cleanup */ + cleanup_amplify (amplify); +} + +GST_END_TEST; + +GST_START_TEST (test_200_clip) +{ + GstElement *amplify; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 out[6] = { G_MAXINT16, -32768, 512, -256, 0, G_MININT16 }; + gint16 *res; + + amplify = setup_amplify (); + g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL); + fail_unless (gst_element_set_state (amplify, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], + res[3], res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); + + /* cleanup */ + cleanup_amplify (amplify); +} + +GST_END_TEST; + +GST_START_TEST (test_050_wrap_negative) +{ + GstElement *amplify; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 }; + gint16 *res; + + amplify = setup_amplify (); + g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL); + g_object_set (G_OBJECT (amplify), "clipping-method", 1, NULL); + fail_unless (gst_element_set_state (amplify, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], + res[3], res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); + + /* cleanup */ + cleanup_amplify (amplify); +} + +GST_END_TEST; + +GST_START_TEST (test_200_wrap_negative) +{ + GstElement *amplify; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 out[6] = { -16384, -32768, 512, -256, 0, 16384 }; + gint16 *res; + + amplify = setup_amplify (); + g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL); + g_object_set (G_OBJECT (amplify), "clipping-method", 1, NULL); + fail_unless (gst_element_set_state (amplify, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], + res[3], res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); + + /* cleanup */ + cleanup_amplify (amplify); +} + +GST_END_TEST; + +GST_START_TEST (test_050_wrap_positive) +{ + GstElement *amplify; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 }; + gint16 *res; + + amplify = setup_amplify (); + g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL); + g_object_set (G_OBJECT (amplify), "clipping-method", 2, NULL); + fail_unless (gst_element_set_state (amplify, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], + res[3], res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); + + /* cleanup */ + cleanup_amplify (amplify); +} + +GST_END_TEST; + +GST_START_TEST (test_200_wrap_positive) +{ + GstElement *amplify; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 out[6] = { 16382, -32768, 512, -256, 0, -16384 }; + gint16 *res; + + amplify = setup_amplify (); + g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL); + g_object_set (G_OBJECT (amplify), "clipping-method", 2, NULL); + fail_unless (gst_element_set_state (amplify, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], + res[3], res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); + + /* cleanup */ + cleanup_amplify (amplify); +} + +GST_END_TEST; + +static Suite * +amplify_suite (void) +{ + Suite *s = suite_create ("amplify"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_passthrough); + tcase_add_test (tc_chain, test_zero); + tcase_add_test (tc_chain, test_050_clip); + tcase_add_test (tc_chain, test_200_clip); + tcase_add_test (tc_chain, test_050_wrap_negative); + tcase_add_test (tc_chain, test_200_wrap_negative); + tcase_add_test (tc_chain, test_050_wrap_positive); + tcase_add_test (tc_chain, test_200_wrap_positive); + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = amplify_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/audiochebband.c b/tests/check/elements/audiochebband.c new file mode 100644 index 0000000..73a8b15 --- /dev/null +++ b/tests/check/elements/audiochebband.c @@ -0,0 +1,1538 @@ +/* GStreamer + * + * Copyright (C) 2007 Sebastian Dröge + * + * audiochebband.c: Unit test for the audiochebband element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include +#include + +#include + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define BUFFER_CAPS_STRING_32 \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 32" \ + +#define BUFFER_CAPS_STRING_64 \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 64" \ + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") + ); + +static GstElement * +setup_audiochebband (void) +{ + GstElement *audiochebband; + + GST_DEBUG ("setup_audiochebband"); + audiochebband = gst_check_setup_element ("audiochebband"); + mysrcpad = gst_check_setup_src_pad (audiochebband, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (audiochebband, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return audiochebband; +} + +static void +cleanup_audiochebband (GstElement * audiochebband) +{ + GST_DEBUG ("cleanup_audiochebband"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (audiochebband); + gst_check_teardown_sink_pad (audiochebband); + gst_check_teardown_element (audiochebband); +} + +/* Test if data containing only one frequency component + * at 0 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_32_bp_0hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at band center is preserved with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_32_bp_11025hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.6); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_32_bp_22050hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_32_br_0hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at band center is erased with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_32_br_11025hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_32_br_22050hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_64_bp_0hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at band center is preserved with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_64_bp_11025hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.6); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_64_bp_22050hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_64_br_0hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at band center is erased with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_64_br_11025hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type1_64_br_22050hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_32_bp_0hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at band center is preserved with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_32_bp_11025hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.6); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_32_bp_22050hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_32_br_0hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at band center is erased with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_32_br_11025hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_32_br_22050hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_64_bp_0hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at band center is preserved with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_64_bp_11025hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.6); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_64_bp_22050hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_64_br_0hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at band center is erased with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_64_br_11025hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_type2_64_br_22050hz) +{ + GstElement *audiochebband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiochebband = setup_audiochebband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); + g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); + g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiochebband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiochebband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiochebband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 1024; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 1024.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiochebband (audiochebband); +} + +GST_END_TEST; + +static Suite * +audiochebband_suite (void) +{ + Suite *s = suite_create ("audiochebband"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_type1_32_bp_0hz); + tcase_add_test (tc_chain, test_type1_32_bp_11025hz); + tcase_add_test (tc_chain, test_type1_32_bp_22050hz); + tcase_add_test (tc_chain, test_type1_32_br_0hz); + tcase_add_test (tc_chain, test_type1_32_br_11025hz); + tcase_add_test (tc_chain, test_type1_32_br_22050hz); + tcase_add_test (tc_chain, test_type1_64_bp_0hz); + tcase_add_test (tc_chain, test_type1_64_bp_11025hz); + tcase_add_test (tc_chain, test_type1_64_bp_22050hz); + tcase_add_test (tc_chain, test_type1_64_br_0hz); + tcase_add_test (tc_chain, test_type1_64_br_11025hz); + tcase_add_test (tc_chain, test_type1_64_br_22050hz); + tcase_add_test (tc_chain, test_type2_32_bp_0hz); + tcase_add_test (tc_chain, test_type2_32_bp_11025hz); + tcase_add_test (tc_chain, test_type2_32_bp_22050hz); + tcase_add_test (tc_chain, test_type2_32_br_0hz); + tcase_add_test (tc_chain, test_type2_32_br_11025hz); + tcase_add_test (tc_chain, test_type2_32_br_22050hz); + tcase_add_test (tc_chain, test_type2_64_bp_0hz); + tcase_add_test (tc_chain, test_type2_64_bp_11025hz); + tcase_add_test (tc_chain, test_type2_64_bp_22050hz); + tcase_add_test (tc_chain, test_type2_64_br_0hz); + tcase_add_test (tc_chain, test_type2_64_br_11025hz); + tcase_add_test (tc_chain, test_type2_64_br_22050hz); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = audiochebband_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/audiocheblimit.c b/tests/check/elements/audiocheblimit.c new file mode 100644 index 0000000..3b46504 --- /dev/null +++ b/tests/check/elements/audiocheblimit.c @@ -0,0 +1,1002 @@ +/* GStreamer + * + * Copyright (C) 2007 Sebastian Dröge + * + * audiocheblimit.c: Unit test for the audiocheblimit element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include +#include + +#include + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define BUFFER_CAPS_STRING_32 \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 32" \ + +#define BUFFER_CAPS_STRING_64 \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 64" \ + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") + ); + +static GstElement * +setup_audiocheblimit (void) +{ + GstElement *audiocheblimit; + + GST_DEBUG ("setup_audiocheblimit"); + audiocheblimit = gst_check_setup_element ("audiocheblimit"); + mysrcpad = gst_check_setup_src_pad (audiocheblimit, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (audiocheblimit, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return audiocheblimit; +} + +static void +cleanup_audiocheblimit (GstElement * audiocheblimit) +{ + GST_DEBUG ("cleanup_audiocheblimit"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (audiocheblimit); + gst_check_teardown_sink_pad (audiocheblimit); + gst_check_teardown_element (audiocheblimit); +} + +/* Test if data containing only one frequency component + * at 0 is preserved with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type1_32_lp_0hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type1_32_lp_22050hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type1_32_hp_0hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type1_32_hp_22050hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is preserved with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type1_64_lp_0hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type1_64_lp_22050hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type1_64_hp_0hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type1_64_hp_22050hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is preserved with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type2_32_lp_0hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type2_32_lp_22050hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type2_32_hp_0hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type2_32_hp_22050hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is preserved with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type2_64_lp_0hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type2_64_lp_22050hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type2_64_hp_0hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms <= 0.1); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_type2_64_hp_22050hz) +{ + GstElement *audiocheblimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + + audiocheblimit = setup_audiocheblimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); + g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); + g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); + + fail_unless (gst_element_set_state (audiocheblimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + + rms = 0.0; + for (i = 0; i < 128; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / 128.0); + fail_unless (rms >= 0.9); + + /* cleanup */ + cleanup_audiocheblimit (audiocheblimit); +} + +GST_END_TEST; + + +static Suite * +audiocheblimit_suite (void) +{ + Suite *s = suite_create ("audiocheblimit"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_type1_32_lp_0hz); + tcase_add_test (tc_chain, test_type1_32_lp_22050hz); + tcase_add_test (tc_chain, test_type1_32_hp_0hz); + tcase_add_test (tc_chain, test_type1_32_hp_22050hz); + tcase_add_test (tc_chain, test_type1_64_lp_0hz); + tcase_add_test (tc_chain, test_type1_64_lp_22050hz); + tcase_add_test (tc_chain, test_type1_64_hp_0hz); + tcase_add_test (tc_chain, test_type1_64_hp_22050hz); + tcase_add_test (tc_chain, test_type2_32_lp_0hz); + tcase_add_test (tc_chain, test_type2_32_lp_22050hz); + tcase_add_test (tc_chain, test_type2_32_hp_0hz); + tcase_add_test (tc_chain, test_type2_32_hp_22050hz); + tcase_add_test (tc_chain, test_type2_64_lp_0hz); + tcase_add_test (tc_chain, test_type2_64_lp_22050hz); + tcase_add_test (tc_chain, test_type2_64_hp_0hz); + tcase_add_test (tc_chain, test_type2_64_hp_22050hz); + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = audiocheblimit_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/audiodynamic.c b/tests/check/elements/audiodynamic.c new file mode 100644 index 0000000..1119779 --- /dev/null +++ b/tests/check/elements/audiodynamic.c @@ -0,0 +1,459 @@ +/* GStreamer + * + * unit test for audiodynamic + * + * Copyright (C) 2007 Sebastian Dröge + * + * Greatly based on the audiopanorama unit test + * Copyright (C) 2006 Stefan Kost + * + * 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 + +#include +#include + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + + +#define DYNAMIC_CAPS_STRING \ + "audio/x-raw-int, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (bool) TRUE" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 1, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 1, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); + +static GstElement * +setup_dynamic (void) +{ + GstElement *dynamic; + + GST_DEBUG ("setup_dynamic"); + dynamic = gst_check_setup_element ("audiodynamic"); + mysrcpad = gst_check_setup_src_pad (dynamic, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (dynamic, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return dynamic; +} + +static void +cleanup_dynamic (GstElement * dynamic) +{ + GST_DEBUG ("cleanup_dynamic"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (dynamic); + gst_check_teardown_sink_pad (dynamic); + gst_check_teardown_element (dynamic); +} + +GST_START_TEST (test_passthrough) +{ + GstElement *dynamic; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; + gint16 *res; + + dynamic = setup_dynamic (); + fail_unless (gst_element_set_state (dynamic, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (12); + memcpy (GST_BUFFER_DATA (inbuffer), in, 12); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); + caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", + in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3], + res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 12) == 0); + + /* cleanup */ + cleanup_dynamic (dynamic); +} + +GST_END_TEST; + +GST_START_TEST (test_compress_hard_50_50) +{ + GstElement *dynamic; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 }; + gint16 *res; + + dynamic = setup_dynamic (); + g_object_set (G_OBJECT (dynamic), "mode", 0, NULL); + g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL); + g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL); + g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL); + fail_unless (gst_element_set_state (dynamic, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (16); + memcpy (GST_BUFFER_DATA (inbuffer), in, 16); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); + caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + + fail_unless (res[0] > in[0]); + fail_unless (res[1] < in[1]); + fail_unless (res[2] == in[2]); + fail_unless (res[3] == in[3]); + fail_unless (res[4] == in[4]); + fail_unless (res[5] == in[5]); + fail_unless (res[6] > in[6]); + fail_unless (res[7] < in[7]); + + /* cleanup */ + cleanup_dynamic (dynamic); +} + +GST_END_TEST; + +GST_START_TEST (test_compress_soft_50_50) +{ + GstElement *dynamic; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 }; + gint16 *res; + + dynamic = setup_dynamic (); + g_object_set (G_OBJECT (dynamic), "mode", 0, NULL); + g_object_set (G_OBJECT (dynamic), "characteristics", 1, NULL); + g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL); + g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL); + fail_unless (gst_element_set_state (dynamic, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (16); + memcpy (GST_BUFFER_DATA (inbuffer), in, 16); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); + caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + + fail_unless (res[0] > in[0]); + fail_unless (res[1] < in[1]); + fail_unless (res[2] == in[2]); + fail_unless (res[3] == in[3]); + fail_unless (res[4] == in[4]); + fail_unless (res[5] == in[5]); + fail_unless (res[6] > in[6]); + fail_unless (res[7] < in[7]); + + /* cleanup */ + cleanup_dynamic (dynamic); +} + +GST_END_TEST; + +GST_START_TEST (test_compress_hard_100_50) +{ + GstElement *dynamic; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 }; + gint16 *res; + + dynamic = setup_dynamic (); + g_object_set (G_OBJECT (dynamic), "mode", 0, NULL); + g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL); + g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL); + g_object_set (G_OBJECT (dynamic), "threshold", 1.0, NULL); + fail_unless (gst_element_set_state (dynamic, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (16); + memcpy (GST_BUFFER_DATA (inbuffer), in, 16); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); + caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + + fail_unless (res[0] == in[0]); + fail_unless (res[1] == in[1]); + fail_unless (res[2] == in[2]); + fail_unless (res[3] == in[3]); + fail_unless (res[4] == in[4]); + fail_unless (res[5] == in[5]); + fail_unless (res[6] == in[6]); + fail_unless (res[7] == in[7]); + + /* cleanup */ + cleanup_dynamic (dynamic); +} + +GST_END_TEST; + + +GST_START_TEST (test_expand_hard_50_200) +{ + GstElement *dynamic; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 }; + gint16 *res; + + dynamic = setup_dynamic (); + g_object_set (G_OBJECT (dynamic), "mode", 1, NULL); + g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL); + g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL); + g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL); + fail_unless (gst_element_set_state (dynamic, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (16); + memcpy (GST_BUFFER_DATA (inbuffer), in, 16); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); + caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + + fail_unless (res[0] == in[0]); + fail_unless (res[1] == in[1]); + fail_unless (res[2] > in[2]); + fail_unless (res[3] < in[3]); + fail_unless (res[4] > in[4]); + fail_unless (res[5] == in[5]); + fail_unless (res[6] == in[6]); + fail_unless (res[7] == in[7]); + + /* cleanup */ + cleanup_dynamic (dynamic); +} + +GST_END_TEST; + +GST_START_TEST (test_expand_soft_50_200) +{ + GstElement *dynamic; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 }; + gint16 *res; + + dynamic = setup_dynamic (); + g_object_set (G_OBJECT (dynamic), "mode", 1, NULL); + g_object_set (G_OBJECT (dynamic), "characteristics", 1, NULL); + g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL); + g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL); + fail_unless (gst_element_set_state (dynamic, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (16); + memcpy (GST_BUFFER_DATA (inbuffer), in, 16); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); + caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + + fail_unless (res[0] == in[0]); + fail_unless (res[1] == in[1]); + fail_unless (res[2] > in[2]); + fail_unless (res[3] < in[3]); + fail_unless (res[4] > in[4]); + fail_unless (res[5] == in[5]); + fail_unless (res[6] == in[6]); + fail_unless (res[7] == in[7]); + + /* cleanup */ + cleanup_dynamic (dynamic); +} + +GST_END_TEST; + +GST_START_TEST (test_expand_hard_0_200) +{ + GstElement *dynamic; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 }; + gint16 *res; + + dynamic = setup_dynamic (); + g_object_set (G_OBJECT (dynamic), "mode", 1, NULL); + g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL); + g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL); + g_object_set (G_OBJECT (dynamic), "threshold", 0.0, NULL); + fail_unless (gst_element_set_state (dynamic, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (16); + memcpy (GST_BUFFER_DATA (inbuffer), in, 16); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); + caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + + fail_unless (res[0] == in[0]); + fail_unless (res[1] == in[1]); + fail_unless (res[2] == in[2]); + fail_unless (res[3] == in[3]); + fail_unless (res[4] == in[4]); + fail_unless (res[5] == in[5]); + fail_unless (res[6] == in[6]); + fail_unless (res[7] == in[7]); + + /* cleanup */ + cleanup_dynamic (dynamic); +} + +GST_END_TEST; + +static Suite * +dynamic_suite (void) +{ + Suite *s = suite_create ("dynamic"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_passthrough); + tcase_add_test (tc_chain, test_compress_hard_50_50); + tcase_add_test (tc_chain, test_compress_soft_50_50); + tcase_add_test (tc_chain, test_compress_hard_100_50); + tcase_add_test (tc_chain, test_expand_hard_50_200); + tcase_add_test (tc_chain, test_expand_soft_50_200); + tcase_add_test (tc_chain, test_expand_hard_0_200); + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = dynamic_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/audioecho.c b/tests/check/elements/audioecho.c new file mode 100644 index 0000000..fa88c3f --- /dev/null +++ b/tests/check/elements/audioecho.c @@ -0,0 +1,229 @@ +/* GStreamer + * + * Copyright (C) 2009 Sebastian Dröge + * + * 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 + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define ECHO_CAPS_STRING \ + "audio/x-raw-float, " \ + "channels = (int) 2, " \ + "rate = (int) 100000, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 64" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) [ 1, 2 ], " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) [ 1, 2 ], " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") + ); + +static GstElement * +setup_echo (void) +{ + GstElement *echo; + + GST_DEBUG ("setup_echo"); + echo = gst_check_setup_element ("audioecho"); + mysrcpad = gst_check_setup_src_pad (echo, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (echo, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return echo; +} + +static void +cleanup_echo (GstElement * echo) +{ + GST_DEBUG ("cleanup_echo"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (echo); + gst_check_teardown_sink_pad (echo); + gst_check_teardown_element (echo); +} + +GST_START_TEST (test_passthrough) +{ + GstElement *echo; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble in[] = { 1.0, -1.0, 0.0, 0.5, -0.5, 0.0 }; + gdouble *res; + + echo = setup_echo (); + g_object_set (G_OBJECT (echo), "delay", (GstClockTime) 1, "intensity", 0.0, + "feedback", 0.0, NULL); + fail_unless (gst_element_set_state (echo, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (sizeof (in)); + memcpy (GST_BUFFER_DATA (inbuffer), in, sizeof (in)); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, sizeof (in)) == 0); + caps = gst_caps_from_string (ECHO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+lf %+lf %+lf %+lf %+lf %+lf real %+lf %+lf %+lf %+lf %+lf %+lf", + in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3], + res[4], res[5]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, sizeof (in)) == 0); + + /* cleanup */ + cleanup_echo (echo); +} + +GST_END_TEST; + +GST_START_TEST (test_echo) +{ + GstElement *echo; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble in[] = { 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, }; + gdouble out[] = { 1.0, -1.0, 0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0 }; + gdouble *res; + + echo = setup_echo (); + g_object_set (G_OBJECT (echo), "delay", (GstClockTime) 20000, "intensity", + 1.0, "feedback", 0.0, NULL); + fail_unless (gst_element_set_state (echo, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (sizeof (in)); + memcpy (GST_BUFFER_DATA (inbuffer), in, sizeof (in)); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, sizeof (in)) == 0); + caps = gst_caps_from_string (ECHO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf real %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf", + out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], + out[9], res[0], res[1], res[2], res[3], res[4], res[5], res[6], res[7], + res[8], res[9]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, sizeof (out)) == 0); + + /* cleanup */ + cleanup_echo (echo); +} + +GST_END_TEST; + +GST_START_TEST (test_feedback) +{ + GstElement *echo; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble in[] = { 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, }; + gdouble out[] = { 1.0, -1.0, 0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, -1.0 }; + gdouble *res; + + echo = setup_echo (); + g_object_set (G_OBJECT (echo), "delay", (GstClockTime) 20000, "intensity", + 1.0, "feedback", 1.0, NULL); + fail_unless (gst_element_set_state (echo, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (sizeof (in)); + memcpy (GST_BUFFER_DATA (inbuffer), in, sizeof (in)); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, sizeof (in)) == 0); + caps = gst_caps_from_string (ECHO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + GST_INFO + ("expected %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf real %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf", + out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], + out[9], res[0], res[1], res[2], res[3], res[4], res[5], res[6], res[7], + res[8], res[9]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, sizeof (out)) == 0); + + /* cleanup */ + cleanup_echo (echo); +} + +GST_END_TEST; + +static Suite * +audioecho_suite (void) +{ + Suite *s = suite_create ("audioecho"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_passthrough); + tcase_add_test (tc_chain, test_echo); + tcase_add_test (tc_chain, test_feedback); + + return s; +} + +GST_CHECK_MAIN (audioecho); diff --git a/tests/check/elements/audiofirfilter.c b/tests/check/elements/audiofirfilter.c new file mode 100644 index 0000000..c4eb723 --- /dev/null +++ b/tests/check/elements/audiofirfilter.c @@ -0,0 +1,169 @@ +/* GStreamer + * + * Copyright (C) 2009 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include + +static gboolean have_eos = FALSE; + +static gboolean +on_message (GstBus * bus, GstMessage * message, gpointer user_data) +{ + GMainLoop *loop = (GMainLoop *) user_data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR: + case GST_MESSAGE_WARNING: + g_assert_not_reached (); + g_main_loop_quit (loop); + break; + + case GST_MESSAGE_EOS: + have_eos = TRUE; + g_main_loop_quit (loop); + break; + default: + break; + } + + return TRUE; +} + +static void +on_rate_changed (GstElement * element, gint rate, gpointer user_data) +{ + GValueArray *va; + GValue v = { 0, }; + + fail_unless (rate > 0); + + va = g_value_array_new (6); + + g_value_init (&v, G_TYPE_DOUBLE); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 1.0); + g_value_array_append (va, &v); + g_value_reset (&v); + + g_object_set (G_OBJECT (element), "kernel", va, NULL); + + g_value_array_free (va); +} + +static gboolean have_data = FALSE; + +static void +on_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad, + gpointer user_data) +{ + if (!have_data) { + gdouble *data = (gdouble *) GST_BUFFER_DATA (buffer); + + fail_unless (GST_BUFFER_SIZE (buffer) > 5 * sizeof (gdouble)); + fail_unless (data[0] == 0.0); + fail_unless (data[1] == 0.0); + fail_unless (data[2] == 0.0); + fail_unless (data[3] == 0.0); + fail_unless (data[4] == 0.0); + fail_unless (data[5] != 0.0); + have_data = TRUE; + } +} + +GST_START_TEST (test_pipeline) +{ + GstElement *pipeline, *src, *filter, *sink; + GstBus *bus; + GMainLoop *loop; + + have_data = FALSE; + have_eos = FALSE; + + pipeline = gst_element_factory_make ("pipeline", NULL); + fail_unless (pipeline != NULL); + + src = gst_element_factory_make ("audiotestsrc", NULL); + fail_unless (src != NULL); + g_object_set (G_OBJECT (src), "num-buffers", 1000, NULL); + + filter = gst_element_factory_make ("audiofirfilter", NULL); + fail_unless (filter != NULL); + g_signal_connect (G_OBJECT (filter), "rate-changed", + G_CALLBACK (on_rate_changed), NULL); + + sink = gst_element_factory_make ("fakesink", NULL); + fail_unless (sink != NULL); + g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL); + g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_handoff), NULL); + + gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL); + fail_unless (gst_element_link_many (src, filter, sink, NULL)); + + loop = g_main_loop_new (NULL, FALSE); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); + gst_object_unref (GST_OBJECT (bus)); + + fail_if (gst_element_set_state (pipeline, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + g_main_loop_run (loop); + + fail_unless (have_data); + fail_unless (have_eos); + + fail_unless (gst_element_set_state (pipeline, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); + + g_main_loop_unref (loop); + gst_object_unref (pipeline); +} + +GST_END_TEST; + +static Suite * +audiofirfilter_suite (void) +{ + Suite *s = suite_create ("audiofirfilter"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_pipeline); + + return s; +} + +GST_CHECK_MAIN (audiofirfilter); diff --git a/tests/check/elements/audioiirfilter.c b/tests/check/elements/audioiirfilter.c new file mode 100644 index 0000000..d144792 --- /dev/null +++ b/tests/check/elements/audioiirfilter.c @@ -0,0 +1,179 @@ +/* GStreamer + * + * Copyright (C) 2009 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include + +static gboolean have_eos = FALSE; + +static gboolean +on_message (GstBus * bus, GstMessage * message, gpointer user_data) +{ + GMainLoop *loop = (GMainLoop *) user_data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR: + case GST_MESSAGE_WARNING: + g_assert_not_reached (); + g_main_loop_quit (loop); + break; + + case GST_MESSAGE_EOS: + have_eos = TRUE; + g_main_loop_quit (loop); + break; + default: + break; + } + + return TRUE; +} + +static void +on_rate_changed (GstElement * element, gint rate, gpointer user_data) +{ + GValueArray *va; + GValue v = { 0, }; + + fail_unless (rate > 0); + + va = g_value_array_new (6); + + g_value_init (&v, G_TYPE_DOUBLE); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + g_value_set_double (&v, 1.0); + g_value_array_append (va, &v); + g_value_reset (&v); + + g_object_set (G_OBJECT (element), "a", va, NULL); + + g_value_array_free (va); + + va = g_value_array_new (6); + + g_value_set_double (&v, 0.0); + g_value_array_append (va, &v); + g_value_reset (&v); + + g_object_set (G_OBJECT (element), "b", va, NULL); + + g_value_array_free (va); +} + +static gboolean have_data = FALSE; + +static void +on_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad, + gpointer user_data) +{ + if (!have_data) { + gdouble *data = (gdouble *) GST_BUFFER_DATA (buffer); + + fail_unless (GST_BUFFER_SIZE (buffer) > 5 * sizeof (gdouble)); + fail_unless (data[0] == 0.0); + fail_unless (data[1] == 0.0); + fail_unless (data[2] == 0.0); + fail_unless (data[3] == 0.0); + fail_unless (data[4] == 0.0); + fail_unless (data[5] != 0.0); + have_data = TRUE; + } +} + +GST_START_TEST (test_pipeline) +{ + GstElement *pipeline, *src, *filter, *sink; + GstBus *bus; + GMainLoop *loop; + + have_data = FALSE; + have_eos = FALSE; + + pipeline = gst_element_factory_make ("pipeline", NULL); + fail_unless (pipeline != NULL); + + src = gst_element_factory_make ("audiotestsrc", NULL); + fail_unless (src != NULL); + g_object_set (G_OBJECT (src), "num-buffers", 1000, NULL); + + filter = gst_element_factory_make ("audioiirfilter", NULL); + fail_unless (filter != NULL); + g_signal_connect (G_OBJECT (filter), "rate-changed", + G_CALLBACK (on_rate_changed), NULL); + + sink = gst_element_factory_make ("fakesink", NULL); + fail_unless (sink != NULL); + g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL); + g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_handoff), NULL); + + gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL); + fail_unless (gst_element_link_many (src, filter, sink, NULL)); + + loop = g_main_loop_new (NULL, FALSE); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); + gst_object_unref (GST_OBJECT (bus)); + + fail_if (gst_element_set_state (pipeline, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + g_main_loop_run (loop); + + fail_unless (have_data); + fail_unless (have_eos); + + fail_unless (gst_element_set_state (pipeline, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); + + g_main_loop_unref (loop); + gst_object_unref (pipeline); +} + +GST_END_TEST; + +static Suite * +audioiirfilter_suite (void) +{ + Suite *s = suite_create ("audioiirfilter"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_pipeline); + + return s; +} + +GST_CHECK_MAIN (audioiirfilter); diff --git a/tests/check/elements/audioinvert.c b/tests/check/elements/audioinvert.c new file mode 100644 index 0000000..39ff80e --- /dev/null +++ b/tests/check/elements/audioinvert.c @@ -0,0 +1,286 @@ +/* GStreamer + * + * unit test for audioinvert + * + * Copyright (C) 2007 Sebastian Dröge + * + * Greatly based on the audiopanorama unit test + * Copyright (C) 2006 Stefan Kost + * + * 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 + +#include +#include + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + + +#define INVERT_CAPS_STRING \ + "audio/x-raw-int, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (bool) TRUE" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 1, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 1, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); + +static GstElement * +setup_invert (void) +{ + GstElement *invert; + + GST_DEBUG ("setup_invert"); + invert = gst_check_setup_element ("audioinvert"); + mysrcpad = gst_check_setup_src_pad (invert, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (invert, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return invert; +} + +static void +cleanup_invert (GstElement * invert) +{ + GST_DEBUG ("cleanup_invert"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (invert); + gst_check_teardown_sink_pad (invert); + gst_check_teardown_element (invert); +} + +GST_START_TEST (test_passthrough) +{ + GstElement *invert; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 128, -512 }; + gint16 *res; + + invert = setup_invert (); + fail_unless (gst_element_set_state (invert, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); + caps = gst_caps_from_string (INVERT_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + in[0], in[1], in[2], in[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 8) == 0); + + /* cleanup */ + cleanup_invert (invert); +} + +GST_END_TEST; + +GST_START_TEST (test_zero) +{ + GstElement *invert; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 128, -512 }; + gint16 out[4] = { 0, 0, 0, 0 }; + gint16 *res; + + invert = setup_invert (); + g_object_set (G_OBJECT (invert), "degree", 0.5, NULL); + fail_unless (gst_element_set_state (invert, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); + caps = gst_caps_from_string (INVERT_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_invert (invert); +} + +GST_END_TEST; + +GST_START_TEST (test_full_inverse) +{ + GstElement *invert; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 128, -512 }; + gint16 out[4] = { -16385, 255, -129, 511 }; + gint16 *res; + + invert = setup_invert (); + g_object_set (G_OBJECT (invert), "degree", 1.0, NULL); + fail_unless (gst_element_set_state (invert, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); + caps = gst_caps_from_string (INVERT_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_invert (invert); +} + +GST_END_TEST; + +GST_START_TEST (test_25_inverse) +{ + GstElement *invert; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 128, -512 }; + gint16 out[4] = { 8191, -128, 63, -256 }; + gint16 *res; + + invert = setup_invert (); + g_object_set (G_OBJECT (invert), "degree", 0.25, NULL); + fail_unless (gst_element_set_state (invert, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); + caps = gst_caps_from_string (INVERT_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_invert (invert); +} + +GST_END_TEST; + +static Suite * +invert_suite (void) +{ + Suite *s = suite_create ("invert"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_passthrough); + tcase_add_test (tc_chain, test_zero); + tcase_add_test (tc_chain, test_full_inverse); + tcase_add_test (tc_chain, test_25_inverse); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = invert_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/audiopanorama.c b/tests/check/elements/audiopanorama.c new file mode 100644 index 0000000..07abca7 --- /dev/null +++ b/tests/check/elements/audiopanorama.c @@ -0,0 +1,707 @@ +/* GStreamer + * + * unit test for audiopanorama + * + * Copyright (C) 2006 Stefan Kost + * + * 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 + +#include +#include + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + + +#define PANORAMA_MONO_CAPS_STRING \ + "audio/x-raw-int, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (bool) TRUE" + +#define PANORAMA_STEREO_CAPS_STRING \ + "audio/x-raw-int, " \ + "channels = (int) 2, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (bool) TRUE" + +#define PANORAMA_WRONG_CAPS_STRING \ + "audio/x-raw-int, " \ + "channels = (int) 5, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (bool) FALSE" + + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 2, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); +static GstStaticPadTemplate msrctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 1, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); +static GstStaticPadTemplate ssrctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "channels = (int) 2, " + "rate = (int) [ 1, MAX ], " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") + ); + +static GstElement * +setup_panorama_m (void) +{ + GstElement *panorama; + + GST_DEBUG ("setup_panorama"); + panorama = gst_check_setup_element ("audiopanorama"); + mysrcpad = gst_check_setup_src_pad (panorama, &msrctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (panorama, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return panorama; +} + +static GstElement * +setup_panorama_s (void) +{ + GstElement *panorama; + + GST_DEBUG ("setup_panorama"); + panorama = gst_check_setup_element ("audiopanorama"); + mysrcpad = gst_check_setup_src_pad (panorama, &ssrctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (panorama, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return panorama; +} + +static void +cleanup_panorama (GstElement * panorama) +{ + GST_DEBUG ("cleanup_panorama"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (panorama); + gst_check_teardown_sink_pad (panorama); + gst_check_teardown_element (panorama); +} + +GST_START_TEST (test_mono_middle) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[2] = { 16384, -256 }; + gint16 out[4] = { 8192, 8192, -128, -128 }; + gint16 *res; + + panorama = setup_panorama_m (); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (4); + memcpy (GST_BUFFER_DATA (inbuffer), in, 4); + caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_mono_left) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[2] = { 16384, -256 }; + gint16 out[4] = { 16384, 0, -256, 0 }; + gint16 *res; + + panorama = setup_panorama_m (); + g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (4); + memcpy (GST_BUFFER_DATA (inbuffer), in, 4); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 4) == 0); + caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_mono_right) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[2] = { 16384, -256 }; + gint16 out[4] = { 0, 16384, 0, -256 }; + gint16 *res; + + panorama = setup_panorama_m (); + g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (4); + memcpy (GST_BUFFER_DATA (inbuffer), in, 4); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 4) == 0); + caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_stereo_middle) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 8192, 128 }; + gint16 *res; + + panorama = setup_panorama_s (); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... so keep an extra one */ + gst_buffer_ref (inbuffer); + + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (inbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + in[0], in[1], in[2], in[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 8) == 0); + + /* cleanup */ + gst_buffer_unref (inbuffer); + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_stereo_left) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 8192, 128 }; + gint16 out[4] = { 16384 - 256, 0, 8192 + 128, 0 }; + gint16 *res; + + panorama = setup_panorama_s (); + g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); + caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_stereo_right) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 8192, 128 }; + gint16 out[4] = { 0, -256 + 16384, 0, 128 + 8192 }; + gint16 *res; + + panorama = setup_panorama_s (); + g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); + caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_mono_middle_simple) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[2] = { 16384, -256 }; + gint16 out[4] = { 16384, 16384, -256, -256 }; + gint16 *res; + + panorama = setup_panorama_m (); + g_object_set (G_OBJECT (panorama), "method", 1, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (4); + memcpy (GST_BUFFER_DATA (inbuffer), in, 4); + caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_mono_left_simple) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[2] = { 16384, -256 }; + gint16 out[4] = { 16384, 0, -256, 0 }; + gint16 *res; + + panorama = setup_panorama_m (); + g_object_set (G_OBJECT (panorama), "method", 1, NULL); + g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (4); + memcpy (GST_BUFFER_DATA (inbuffer), in, 4); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 4) == 0); + caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_mono_right_simple) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[2] = { 16384, -256 }; + gint16 out[4] = { 0, 16384, 0, -256 }; + gint16 *res; + + panorama = setup_panorama_m (); + g_object_set (G_OBJECT (panorama), "method", 1, NULL); + g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (4); + memcpy (GST_BUFFER_DATA (inbuffer), in, 4); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 4) == 0); + caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_stereo_middle_simple) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 8192, 128 }; + gint16 *res; + + panorama = setup_panorama_s (); + g_object_set (G_OBJECT (panorama), "method", 1, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... so keep an extra one */ + gst_buffer_ref (inbuffer); + + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (inbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + in[0], in[1], in[2], in[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 8) == 0); + + /* cleanup */ + gst_buffer_unref (inbuffer); + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_stereo_left_simple) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 8192, 128 }; + gint16 out[4] = { 16384, 0, 8192, 0 }; + gint16 *res; + + panorama = setup_panorama_s (); + g_object_set (G_OBJECT (panorama), "method", 1, NULL); + g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); + caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_stereo_right_simple) +{ + GstElement *panorama; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gint16 in[4] = { 16384, -256, 8192, 128 }; + gint16 out[4] = { 0, -256, 0, 128 }; + gint16 *res; + + panorama = setup_panorama_s (); + g_object_set (G_OBJECT (panorama), "method", 1, NULL); + g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL); + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (8); + memcpy (GST_BUFFER_DATA (inbuffer), in, 8); + fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); + caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... and puts a new buffer on the global list */ + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + res = (gint16 *) GST_BUFFER_DATA (outbuffer); + GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", + out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); + + /* cleanup */ + cleanup_panorama (panorama); +} + +GST_END_TEST; + +GST_START_TEST (test_wrong_caps) +{ + GstElement *panorama; + GstBuffer *inbuffer; + gint16 in[2] = { 16384, -256 }; + GstBus *bus; + GstMessage *message; + GstCaps *caps; + + panorama = setup_panorama_m (); + bus = gst_bus_new (); + + fail_unless (gst_element_set_state (panorama, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (4); + memcpy (GST_BUFFER_DATA (inbuffer), in, 4); + caps = gst_caps_from_string (PANORAMA_WRONG_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_ref (inbuffer); + + /* set a bus here so we avoid getting state change messages */ + gst_element_set_bus (panorama, bus); + + /* pushing gives an error because it can't negotiate with wrong caps */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), + GST_FLOW_NOT_NEGOTIATED); + /* ... and the buffer would have been lost if we didn't ref it ourselves */ + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_unref (inbuffer); + fail_unless_equals_int (g_list_length (buffers), 0); + + /* panorama_set_caps should not have been called since basetransform caught + * the negotiation problem */ + fail_if ((message = gst_bus_pop (bus)) != NULL); + + /* cleanup */ + gst_element_set_bus (panorama, NULL); + gst_object_unref (GST_OBJECT (bus)); + cleanup_panorama (panorama); +} + +GST_END_TEST; + + +static Suite * +panorama_suite (void) +{ + Suite *s = suite_create ("panorama"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_mono_middle); + tcase_add_test (tc_chain, test_mono_left); + tcase_add_test (tc_chain, test_mono_right); + tcase_add_test (tc_chain, test_stereo_middle); + tcase_add_test (tc_chain, test_stereo_left); + tcase_add_test (tc_chain, test_stereo_right); + tcase_add_test (tc_chain, test_mono_middle_simple); + tcase_add_test (tc_chain, test_mono_left_simple); + tcase_add_test (tc_chain, test_mono_right_simple); + tcase_add_test (tc_chain, test_stereo_middle_simple); + tcase_add_test (tc_chain, test_stereo_left_simple); + tcase_add_test (tc_chain, test_stereo_right_simple); + tcase_add_test (tc_chain, test_wrong_caps); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = panorama_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/audiowsincband.c b/tests/check/elements/audiowsincband.c new file mode 100644 index 0000000..137f425 --- /dev/null +++ b/tests/check/elements/audiowsincband.c @@ -0,0 +1,1010 @@ +/* GStreamer + * + * Copyright (C) 2007 Sebastian Dröge + * + * audiowsincband.c: Unit test for the audiowsincband element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include +#include + +#include + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define AUDIO_WSINC_BAND_CAPS_STRING_32 \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 32" \ + +#define AUDIO_WSINC_BAND_CAPS_STRING_64 \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 64" \ + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ") + ); + +static GstElement * +setup_audiowsincband (void) +{ + GstElement *audiowsincband; + + GST_DEBUG ("setup_audiowsincband"); + audiowsincband = gst_check_setup_element ("audiowsincband"); + mysrcpad = gst_check_setup_src_pad (audiowsincband, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (audiowsincband, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return audiowsincband; +} + +static void +cleanup_audiowsincband (GstElement * audiowsincband) +{ + GST_DEBUG ("cleanup_audiowsincband"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (audiowsincband); + gst_check_teardown_sink_pad (audiowsincband); + gst_check_teardown_element (audiowsincband); +} + +/* Test if data containing only one frequency component + * at rate/2 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_32_bp_0hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.1); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at the band center is preserved with bandreject mode + * and a 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_32_bp_11025hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.4); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + + +/* Test if data containing only one frequency component + * at rate/2 is erased with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_32_bp_22050hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.3); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_32_br_0hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.9); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at the band center is erased with bandreject mode + * and a 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_32_br_11025hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.35); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + + +/* Test if data containing only one frequency component + * at rate/2 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_32_br_22050hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.9); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +/* Test if buffers smaller than the kernel size are handled + * correctly without accessing wrong memory areas */ +GST_START_TEST (test_32_small_buffer) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer; + GstCaps *caps; + gfloat *in; + gint i; + + audiowsincband = setup_audiowsincband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 101, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 44100 / 16.0, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 44100 / 16.0, NULL); + inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 20; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + + + + + + + + + +/* Test if data containing only one frequency component + * at rate/2 is erased with bandpass mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_64_bp_0hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.1); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at the band center is preserved with bandreject mode + * and a 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_64_bp_11025hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.4); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + + +/* Test if data containing only one frequency component + * at rate/2 is erased with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_64_bp_22050hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.3); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_64_br_0hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.9); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at the band center is erased with bandreject mode + * and a 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_64_br_11025hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + + for (i = 0; i < 1024; i += 4) { + in[i] = 0.0; + in[i + 1] = 1.0; + in[i + 2] = 0.0; + in[i + 3] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.35); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + + +/* Test if data containing only one frequency component + * at rate/2 is preserved with bandreject mode and a + * 2000Hz frequency band around rate/4 */ +GST_START_TEST (test_64_br_22050hz) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsincband = setup_audiowsincband (); + /* Set to bandreject */ + g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 1000, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 1000, NULL); + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.9); + } + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +/* Test if buffers smaller than the kernel size are handled + * correctly without accessing wrong memory areas */ +GST_START_TEST (test_64_small_buffer) +{ + GstElement *audiowsincband; + GstBuffer *inbuffer; + GstCaps *caps; + gdouble *in; + gint i; + + audiowsincband = setup_audiowsincband (); + /* Set to bandpass */ + g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsincband), "length", 101, NULL); + + fail_unless (gst_element_set_state (audiowsincband, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsincband), "lower-frequency", + 44100 / 4.0 - 44100 / 16.0, NULL); + g_object_set (G_OBJECT (audiowsincband), "upper-frequency", + 44100 / 4.0 + 44100 / 16.0, NULL); + inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 20; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + /* cleanup */ + cleanup_audiowsincband (audiowsincband); +} + +GST_END_TEST; + +static Suite * +audiowsincband_suite (void) +{ + Suite *s = suite_create ("audiowsincband"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_32_bp_0hz); + tcase_add_test (tc_chain, test_32_bp_11025hz); + tcase_add_test (tc_chain, test_32_bp_22050hz); + tcase_add_test (tc_chain, test_32_br_0hz); + tcase_add_test (tc_chain, test_32_br_11025hz); + tcase_add_test (tc_chain, test_32_br_22050hz); + tcase_add_test (tc_chain, test_32_small_buffer); + tcase_add_test (tc_chain, test_64_bp_0hz); + tcase_add_test (tc_chain, test_64_bp_11025hz); + tcase_add_test (tc_chain, test_64_bp_22050hz); + tcase_add_test (tc_chain, test_64_br_0hz); + tcase_add_test (tc_chain, test_64_br_11025hz); + tcase_add_test (tc_chain, test_64_br_22050hz); + tcase_add_test (tc_chain, test_64_small_buffer); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = audiowsincband_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/audiowsinclimit.c b/tests/check/elements/audiowsinclimit.c new file mode 100644 index 0000000..a5f0291 --- /dev/null +++ b/tests/check/elements/audiowsinclimit.c @@ -0,0 +1,704 @@ +/* GStreamer + * + * Copyright (C) 2007 Sebastian Dröge + * + * audiowsinclimit.c: Unit test for the audiowsinclimit element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include +#include + +#include + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define AUDIO_WSINC_LIMIT_CAPS_STRING_32 \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 32" \ + +#define AUDIO_WSINC_LIMIT_CAPS_STRING_64 \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 64" \ + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ") + ); + +static GstElement * +setup_audiowsinclimit (void) +{ + GstElement *audiowsinclimit; + + GST_DEBUG ("setup_audiowsinclimit"); + audiowsinclimit = gst_check_setup_element ("audiowsinclimit"); + mysrcpad = gst_check_setup_src_pad (audiowsinclimit, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (audiowsinclimit, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return audiowsinclimit; +} + +static void +cleanup_audiowsinclimit (GstElement * audiowsinclimit) +{ + GST_DEBUG ("cleanup_audiowsinclimit"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (audiowsinclimit); + gst_check_teardown_sink_pad (audiowsinclimit); + gst_check_teardown_element (audiowsinclimit); +} + +/* Test if data containing only one frequency component + * at 0 is preserved with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_32_lp_0hz) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* cutoff = sampling rate / 4, data = 0 */ + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.9); + } + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_32_lp_22050hz) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.1); + } + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_32_hp_0hz) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.1); + } + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_32_hp_22050hz) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in, *res, rms; + gint i; + GList *node; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gfloat *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.9); + } + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if buffers smaller than the kernel size are handled + * correctly without accessing wrong memory areas */ +GST_START_TEST (test_32_small_buffer) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gfloat *in; + gint i; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 101, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gfloat)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 20; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is preserved with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_64_lp_0hz) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* cutoff = sampling rate / 4, data = 0 */ + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.9); + } + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is erased with lowpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_64_lp_22050hz) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.1); + } + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at 0 is erased with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_64_hp_0hz) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms <= 0.1); + } + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if data containing only one frequency component + * at rate/2 is preserved with highpass mode and a cutoff + * at rate/4 */ +GST_START_TEST (test_64_hp_22050hz) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in, *res, rms; + gint i; + GList *node; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to highpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 128; i += 2) { + in[i] = 1.0; + in[i + 1] = -1.0; + } + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + for (node = buffers; node; node = node->next) { + gint buffer_length; + + fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); + + res = (gdouble *) GST_BUFFER_DATA (outbuffer); + buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); + rms = 0.0; + for (i = 0; i < buffer_length; i++) + rms += res[i] * res[i]; + rms = sqrt (rms / buffer_length); + fail_unless (rms >= 0.9); + } + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +/* Test if buffers smaller than the kernel size are handled + * correctly without accessing wrong memory areas */ +GST_START_TEST (test_64_small_buffer) +{ + GstElement *audiowsinclimit; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + gdouble *in; + gint i; + + audiowsinclimit = setup_audiowsinclimit (); + /* Set to lowpass */ + g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); + g_object_set (G_OBJECT (audiowsinclimit), "length", 101, NULL); + + fail_unless (gst_element_set_state (audiowsinclimit, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); + inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gdouble)); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 20; i++) + in[i] = 1.0; + + caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) >= 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + + /* cleanup */ + cleanup_audiowsinclimit (audiowsinclimit); +} + +GST_END_TEST; + +static Suite * +audiowsinclimit_suite (void) +{ + Suite *s = suite_create ("audiowsinclimit"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_32_lp_0hz); + tcase_add_test (tc_chain, test_32_lp_22050hz); + tcase_add_test (tc_chain, test_32_hp_0hz); + tcase_add_test (tc_chain, test_32_hp_22050hz); + tcase_add_test (tc_chain, test_32_small_buffer); + tcase_add_test (tc_chain, test_64_lp_0hz); + tcase_add_test (tc_chain, test_64_lp_22050hz); + tcase_add_test (tc_chain, test_64_hp_0hz); + tcase_add_test (tc_chain, test_64_hp_22050hz); + tcase_add_test (tc_chain, test_64_small_buffer); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = audiowsinclimit_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/autodetect.c b/tests/check/elements/autodetect.c new file mode 100644 index 0000000..21f9bb5 --- /dev/null +++ b/tests/check/elements/autodetect.c @@ -0,0 +1,163 @@ +/* GStreamer unit test for the autodetect elements + * + * Copyright (C) <2006> Tim-Philipp Müller + * + * 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 +#endif + +#include + +GST_START_TEST (test_autovideosink_ghostpad_error_case) +{ + GstStateChangeReturn state_ret; + GstElement *pipeline, *src, *filter, *sink; + GstCaps *caps; + + /* check that there's a usable video sink (think of build bot case) */ + sink = gst_element_factory_make ("autovideosink", NULL); + state_ret = gst_element_set_state (sink, GST_STATE_READY); + + /* need to set state back to NULL, or our test won't work since we + * already have detected the real caps in ready and then linking fails */ + gst_element_set_state (sink, GST_STATE_NULL); + + if (state_ret != GST_STATE_CHANGE_SUCCESS) { + GST_WARNING ("No usable video sink, skipping test"); + gst_object_unref (sink); + return; + } + + pipeline = gst_pipeline_new ("pipeline"); + src = gst_element_factory_make ("fakesrc", NULL); + filter = gst_element_factory_make ("capsfilter", NULL); + + caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, + GST_MAKE_FOURCC ('A', 'C', 'D', 'C'), NULL); + + g_object_set (filter, "caps", caps, NULL); + gst_caps_unref (caps); + + gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL); + + fail_unless (gst_element_link (src, filter), "Failed to link src to filter"); + fail_unless (gst_element_link (filter, sink), + "Failed to link filter to sink"); + + /* this should fail, there's no such format */ + state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); + if (state_ret == GST_STATE_CHANGE_ASYNC) { + /* make sure we wait for the actual success/failure to happen */ + GstState state; + state_ret = + gst_element_get_state (pipeline, &state, &state, GST_CLOCK_TIME_NONE); + } + fail_unless (state_ret == GST_STATE_CHANGE_FAILURE, + "pipeline _set_state() to PAUSED succeeded but should have failed"); + + /* so, we hit an error and try to shut down the pipeline; this shouldn't + * deadlock or block anywhere when autovideosink resets the ghostpad + * targets etc. */ + state_ret = gst_element_set_state (pipeline, GST_STATE_NULL); + fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS, + "State change on pipeline failed"); + + /* clean up */ + gst_object_unref (pipeline); +} + +GST_END_TEST; + +/* disable this for now, too many valgrind suppressions needed for libasound */ +#if 0 +GST_START_TEST (test_autoaudiosink_ghostpad_error_case) +{ + GstStateChangeReturn state_ret; + GstElement *pipeline, *src, *filter, *sink; + GstCaps *caps; + + /* check that there's a usable audio sink (think of build bot case) */ + sink = gst_element_factory_make ("autoaudiosink", NULL); + state_ret = gst_element_set_state (sink, GST_STATE_READY); + + /* need to set state back to NULL, or our test won't work since we + * already have detected the real caps in ready and then linking fails */ + gst_element_set_state (sink, GST_STATE_NULL); + + if (state_ret != GST_STATE_CHANGE_SUCCESS) { + GST_WARNING ("No usable audio sink, skipping test"); + gst_object_unref (sink); + return; + } + + pipeline = gst_pipeline_new ("pipeline"); + src = gst_element_factory_make ("fakesrc", NULL); + filter = gst_element_factory_make ("capsfilter", NULL); + + caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 42, NULL); + + g_object_set (filter, "caps", caps, NULL); + gst_caps_unref (caps); + + gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL); + + fail_unless (gst_element_link (src, filter)); + fail_unless (gst_element_link (filter, sink)); + + /* this should fail, there's no such width (hopefully) */ + state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); + fail_unless (state_ret == GST_STATE_CHANGE_FAILURE, + "pipeline _set_state() to PAUSED succeeded but should have failed"); + + /* so, we hit an error and try to shut down the pipeline; this shouldn't + * deadlock or block anywhere when autoaudiosink resets the ghostpad + * targets etc. */ + state_ret = gst_element_set_state (pipeline, GST_STATE_NULL); + fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS); + + /* clean up */ + gst_object_unref (pipeline); +} + +GST_END_TEST; +#endif + +static Suite * +autodetect_suite (void) +{ + guint maj, min, mic, nano; + + Suite *s = suite_create ("autodetect"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + + gst_version (&maj, &min, &mic, &nano); + + /* requires fixes from 0.10.10.1, but don't want to add a hard dependency + * in configure.ac just for this yet */ + if (maj > 0 || min > 10 || mic > 10 || (mic == 10 && nano > 0)) { + tcase_add_test (tc_chain, test_autovideosink_ghostpad_error_case); + /* tcase_add_test (tc_chain, test_autoaudiosink_ghostpad_error_case); */ + } + + return s; +} + +GST_CHECK_MAIN (autodetect); diff --git a/tests/check/elements/avimux.c b/tests/check/elements/avimux.c new file mode 100644 index 0000000..be06a6b --- /dev/null +++ b/tests/check/elements/avimux.c @@ -0,0 +1,276 @@ +/* GStreamer + * + * unit test for avimux + * + * Copyright (C) <2006> Mark Nauwelaerts + * + * 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 + +#include + +/* 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 AUDIO_CAPS_STRING "audio/x-ac3, " \ + "channels = (int) 1, " \ + "rate = (int) 8000" +#define VIDEO_CAPS_STRING "video/x-xvid, " \ + "width = (int) 384, " \ + "height = (int) 288, " \ + "framerate = (fraction) 25/1" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-msvideo")); +static GstStaticPadTemplate srcvideotemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CAPS_STRING)); + +static GstStaticPadTemplate srcaudiotemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (AUDIO_CAPS_STRING)); + + +/* setup and teardown needs some special handling for muxer */ +static GstPad * +setup_src_pad (GstElement * element, + GstStaticPadTemplate * template, GstCaps * caps, const gchar * sinkname) +{ + GstPad *srcpad, *sinkpad; + + GST_DEBUG_OBJECT (element, "setting up sending pad"); + /* sending pad */ + srcpad = gst_pad_new_from_static_template (template, "src"); + fail_if (srcpad == NULL, "Could not create a srcpad"); + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); + + if (!(sinkpad = gst_element_get_static_pad (element, sinkname))) + sinkpad = gst_element_get_request_pad (element, sinkname); + fail_if (sinkpad == NULL, "Could not get sink pad from %s", + GST_ELEMENT_NAME (element)); + /* references are owned by: 1) us, 2) avimux, 3) collect pads */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + if (caps) + fail_unless (gst_pad_set_caps (srcpad, caps)); + fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, + "Could not link source and %s sink pads", GST_ELEMENT_NAME (element)); + gst_object_unref (sinkpad); /* because we got it higher up */ + + /* references are owned by: 1) avimux, 2) collect pads */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); + + return srcpad; +} + +static void +teardown_src_pad (GstElement * element, const gchar * sinkname) +{ + GstPad *srcpad, *sinkpad; + gchar *padname; + + /* clean up floating src pad */ + /* hm, avimux uses _00 as suffixes for padnames */ + padname = g_strdup (sinkname); + memcpy (strchr (padname, '%'), "00", 2); + if (!(sinkpad = gst_element_get_static_pad (element, padname))) + sinkpad = gst_element_get_request_pad (element, padname); + g_free (padname); + /* pad refs held by 1) avimux 2) collectpads and 3) us (through _get) */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + srcpad = gst_pad_get_peer (sinkpad); + + gst_pad_unlink (srcpad, sinkpad); + + /* after unlinking, pad refs still held by + * 1) avimux and 2) collectpads and 3) us (through _get) */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + gst_object_unref (sinkpad); + /* one more ref is held by element itself */ + + /* pad refs held by both creator and this function (through _get_peer) */ + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2); + gst_object_unref (srcpad); + gst_object_unref (srcpad); + +} + +static GstElement * +setup_avimux (GstStaticPadTemplate * srctemplate, const gchar * sinkname) +{ + GstElement *avimux; + + GST_DEBUG ("setup_avimux"); + avimux = gst_check_setup_element ("avimux"); + mysrcpad = setup_src_pad (avimux, srctemplate, NULL, sinkname); + mysinkpad = gst_check_setup_sink_pad (avimux, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return avimux; +} + +static void +cleanup_avimux (GstElement * avimux, const gchar * sinkname) +{ + GST_DEBUG ("cleanup_avimux"); + gst_element_set_state (avimux, GST_STATE_NULL); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + teardown_src_pad (avimux, sinkname); + gst_check_teardown_sink_pad (avimux); + gst_check_teardown_element (avimux); +} + +static void +check_avimux_pad (GstStaticPadTemplate * srctemplate, + const gchar * src_caps_string, const gchar * chunk_id, + const gchar * sinkname) +{ + GstElement *avimux; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + int num_buffers; + int i; + guint8 data0[4] = "RIFF"; + guint8 data1[8] = "AVI LIST"; + guint8 data2[8] = "hdrlavih"; + guint8 data3[4] = "LIST"; + guint8 data4[8] = "strlstrh"; + guint8 data5[4] = "strf"; + guint8 data6[4] = "LIST"; + guint8 data7[4] = "movi"; + + avimux = setup_avimux (srctemplate, sinkname); + fail_unless (gst_element_set_state (avimux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1); + caps = gst_caps_from_string (src_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); + /* at least expect avi header, chunk header, chunk and padding */ + fail_unless (num_buffers >= 4); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + buffers = g_list_remove (buffers, outbuffer); + + switch (i) { + case 0:{ /* check riff header */ + /* avi header */ + guint8 *data = GST_BUFFER_DATA (outbuffer); + + fail_unless (memcmp (data, data0, sizeof (data0)) == 0); + fail_unless (memcmp (data + 8, data1, sizeof (data1)) == 0); + fail_unless (memcmp (data + 20, data2, sizeof (data2)) == 0); + /* video or audio header */ + data += 32 + 56; + fail_unless (memcmp (data, data3, sizeof (data3)) == 0); + fail_unless (memcmp (data + 8, data4, sizeof (data4)) == 0); + fail_unless (memcmp (data + 76, data5, sizeof (data5)) == 0); + /* avi data header */ + data = GST_BUFFER_DATA (outbuffer); + data += GST_BUFFER_SIZE (outbuffer) - 12; + fail_unless (memcmp (data, data6, sizeof (data6)) == 0); + data += 8; + fail_unless (memcmp (data, data7, sizeof (data7)) == 0); + break; + } + case 1: /* chunk header */ + fail_unless (GST_BUFFER_SIZE (outbuffer) == 8); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), chunk_id, 4) == 0); + break; + case 2: + fail_unless (GST_BUFFER_SIZE (outbuffer) == 1); + break; + case 3: /* buffer we put in, must be padded to even size */ + fail_unless (GST_BUFFER_SIZE (outbuffer) == 1); + break; + default: + break; + } + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + cleanup_avimux (avimux, sinkname); + g_list_free (buffers); + buffers = NULL; +} + + +GST_START_TEST (test_video_pad) +{ + check_avimux_pad (&srcvideotemplate, VIDEO_CAPS_STRING, "00db", "video_%d"); +} + +GST_END_TEST; + + +GST_START_TEST (test_audio_pad) +{ + check_avimux_pad (&srcaudiotemplate, AUDIO_CAPS_STRING, "00wb", "audio_%d"); +} + +GST_END_TEST; + + +static Suite * +avimux_suite (void) +{ + Suite *s = suite_create ("avimux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_video_pad); + tcase_add_test (tc_chain, test_audio_pad); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = avimux_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/avisubtitle.c b/tests/check/elements/avisubtitle.c new file mode 100644 index 0000000..06598ac --- /dev/null +++ b/tests/check/elements/avisubtitle.c @@ -0,0 +1,264 @@ +/* GStreamer + * + * unit test for avisubtitle + * + * Copyright (C) <2007> Thijs Vermeir + * + * 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. + */ +/* Element-Checklist-Version: 5 */ + +#include + +#include +#include + +GstPad *mysinkpad; +GstPad *mysrcpad; + +guint8 avisub_utf_8_with_bom[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00, + 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30, + 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x2c, + 0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, + 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32, + 0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x3c, 0x62, + 0x3e, 0x41, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x38, + 0x20, 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42, + 0x4f, 0x4d, 0x3c, 0x2f, 0x62, 0x3e, 0x0d, 0x0a, + 0x0d, 0x0a, 0x32, 0x0d, 0x0a, 0x30, 0x30, 0x3a, + 0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x31, 0x30, + 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30, + 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x34, 0x2c, 0x30, + 0x30, 0x30, 0x0d, 0x0a, 0x53, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, + 0x6e, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x2d, + 0x20, 0xc2, 0xb5, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3, + 0xbc, 0xc3, 0x9f, 0x0d, 0x0a, 0x0d, 0x0a +}; + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-subtitle") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-subtitle-avi") + ); + +static GstElement * +setup_avisubtitle (void) +{ + GstElement *avisubtitle; + GstCaps *caps; + + GST_DEBUG ("setup_avisubtitle"); + avisubtitle = gst_check_setup_element ("avisubtitle"); + caps = gst_caps_new_simple ("application/x-subtitle", NULL); + mysinkpad = gst_check_setup_sink_pad (avisubtitle, &sink_template, caps); + gst_caps_unref (caps); + caps = gst_caps_new_simple ("application/x-subtitle-avi", NULL); + mysrcpad = gst_check_setup_src_pad (avisubtitle, &src_template, caps); + gst_caps_unref (caps); + gst_pad_set_active (mysinkpad, TRUE); + gst_pad_set_active (mysrcpad, TRUE); + return avisubtitle; +} + +static void +cleanup_avisubtitle (GstElement * avisubtitle) +{ + gst_pad_set_active (mysinkpad, FALSE); + gst_pad_set_active (mysrcpad, FALSE); + gst_check_teardown_sink_pad (avisubtitle); + gst_check_teardown_src_pad (avisubtitle); + gst_check_teardown_element (avisubtitle); +} + +static void +check_wrong_buffer (guint8 * data, guint length) +{ + GstBuffer *buffer = gst_buffer_new (); + GstElement *avisubtitle = setup_avisubtitle (); + + gst_buffer_set_data (buffer, data, length); + fail_unless (gst_element_set_state (avisubtitle, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + gst_buffer_ref (buffer); + ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 2); + /* push the broken buffer */ + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_ERROR, + "accepted a broken buffer"); + /* check if we have unreffed this buffer on failure */ + ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1); + gst_buffer_unref (buffer); + fail_unless (gst_element_set_state (avisubtitle, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + cleanup_avisubtitle (avisubtitle); +} + +static void +check_correct_buffer (guint8 * src_data, guint src_size, guint8 * dst_data, + guint dst_size) +{ + GstBuffer *buffer = gst_buffer_new (); + GstBuffer *newBuffer; + GstElement *avisubtitle = setup_avisubtitle (); + GstEvent *event; + + fail_unless (g_list_length (buffers) == 0, "Buffers list needs to be empty"); + gst_buffer_set_data (buffer, src_data, src_size); + fail_unless (gst_element_set_state (avisubtitle, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1); + event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, + GST_SEEK_TYPE_SET, 2 * GST_SECOND, GST_SEEK_TYPE_SET, 5 * GST_SECOND); + fail_unless (gst_element_send_event (avisubtitle, event) == FALSE, + "Seeking is not possible when there is no buffer yet"); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK, + "not accepted a correct buffer"); + /* we gave away our reference to the buffer, don't assume anything */ + buffer = NULL; + /* a new buffer is created in the list */ + fail_unless (g_list_length (buffers) == 1, + "No new buffer in the buffers list"); + event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, + GST_SEEK_TYPE_SET, 2 * GST_SECOND, GST_SEEK_TYPE_SET, 5 * GST_SECOND); + fail_unless (gst_element_send_event (avisubtitle, event) == TRUE, + "seeking should be working now"); + fail_unless (g_list_length (buffers) == 2, + "After seeking we need another buffer in the buffers"); + newBuffer = GST_BUFFER (buffers->data); + buffers = g_list_remove (buffers, newBuffer); + fail_unless (g_list_length (buffers) == 1, "Buffers list needs to be empty"); + fail_unless (GST_BUFFER_SIZE (newBuffer) == dst_size, + "size of the new buffer is wrong ( %d != %d)", + GST_BUFFER_SIZE (newBuffer), dst_size); + fail_unless (memcmp (GST_BUFFER_DATA (newBuffer), dst_data, dst_size) == 0, + "data of the buffer is not correct"); + gst_buffer_unref (newBuffer); + /* free the buffer from seeking */ + gst_buffer_unref (GST_BUFFER (buffers->data)); + buffers = g_list_remove (buffers, buffers->data); + fail_unless (gst_element_set_state (avisubtitle, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + cleanup_avisubtitle (avisubtitle); +} + + +GST_START_TEST (test_avisubtitle_negative) +{ + guint8 wrong_magic[] = + { 0x47, 0x41, 0x41, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 + }; + guint8 wrong_fixed_word_2[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x01, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68 + }; + guint8 wrong_length_after_name[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68 + }; + guint8 wrong_fixed_word_4[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x00, 0x00, 0x04, 0x01, 0x8e, 0x00, 0x00, + 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30 + }; + guint8 wrong_total_length[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00, + 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30 + }; + /* size of the buffer must be larger than 11 */ + check_wrong_buffer (avisub_utf_8_with_bom, 11); + /* buffer must start with 'GAB2\0' */ + check_wrong_buffer (wrong_magic, 14); + /* next word must be 2 */ + check_wrong_buffer (wrong_fixed_word_2, 24); + /* length must be larger than the length of the name + 17 */ + check_wrong_buffer (wrong_length_after_name, 24); + /* next word must be 4 */ + check_wrong_buffer (wrong_fixed_word_4, 36); + /* check wrong total length */ + check_wrong_buffer (wrong_total_length, 36); +} + +GST_END_TEST; + +GST_START_TEST (test_avisubtitle_positive) +{ + guint8 avisub_utf_8_without_bom[] = { + 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, + 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x8b, 0x00, 0x00, + 0x00, 0x31, 0x0d, 0x0a, 0x30, + 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x2c, + 0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, + 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32, + 0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x3c, 0x62, + 0x3e, 0x41, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x38, + 0x20, 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42, + 0x4f, 0x4d, 0x3c, 0x2f, 0x62, 0x3e, 0x0d, 0x0a, + 0x0d, 0x0a, 0x32, 0x0d, 0x0a, 0x30, 0x30, 0x3a, + 0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x31, 0x30, + 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30, + 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x34, 0x2c, 0x30, + 0x30, 0x30, 0x0d, 0x0a, 0x53, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, + 0x6e, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x2d, + 0x20, 0xc2, 0xb5, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3, + 0xbc, 0xc3, 0x9f, 0x0d, 0x0a, 0x0d, 0x0a + }; + check_correct_buffer (avisub_utf_8_with_bom, 175, avisub_utf_8_with_bom + 36, + 139); + check_correct_buffer (avisub_utf_8_without_bom, 172, + avisub_utf_8_without_bom + 33, 139); +} + +GST_END_TEST; + +static Suite * +avisubtitle_suite (void) +{ + Suite *s = suite_create ("avisubtitle"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_avisubtitle_negative); + tcase_add_test (tc_chain, test_avisubtitle_positive); + + return s; +} + +GST_CHECK_MAIN (avisubtitle); diff --git a/tests/check/elements/capssetter.c b/tests/check/elements/capssetter.c new file mode 100644 index 0000000..0a6986b --- /dev/null +++ b/tests/check/elements/capssetter.c @@ -0,0 +1,228 @@ +/* GStreamer + * + * unit test for capssetter + * + * Copyright (C) <2009> Mark Nauwelaerts + * + * 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 + +#include + + +/* 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; + + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstElement * +setup_capssetter (void) +{ + GstElement *capssetter; + + GST_DEBUG ("setup_capssetter"); + + capssetter = gst_check_setup_element ("capssetter"); + mysrcpad = gst_check_setup_src_pad (capssetter, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (capssetter, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return capssetter; +} + +static void +cleanup_capssetter (GstElement * capssetter) +{ + GST_DEBUG ("cleanup_capssetter"); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (capssetter); + gst_check_teardown_sink_pad (capssetter); + gst_check_teardown_element (capssetter); +} + +static void +push_and_test (GstCaps * prop_caps, gboolean join, gboolean replace, + GstCaps * in_caps, GstCaps * out_caps) +{ + GstElement *capssetter; + GstBuffer *buffer; + + capssetter = setup_capssetter (); + fail_unless (gst_element_set_state (capssetter, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + buffer = gst_buffer_new_and_alloc (4); + ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1); + memcpy (GST_BUFFER_DATA (buffer), "data", 4); + + gst_buffer_set_caps (buffer, in_caps); + gst_caps_unref (in_caps); + + g_object_set (capssetter, "join", join, NULL); + g_object_set (capssetter, "replace", replace, NULL); + g_object_set (capssetter, "caps", prop_caps, NULL); + gst_caps_unref (prop_caps); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK, + "Failed pushing buffer to capssetter"); + + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); + + /* ... but it should end up being collected on the global buffer list */ + fail_unless (g_list_length (buffers) == 1); + buffer = g_list_first (buffers)->data; + ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1); + + fail_unless (gst_caps_is_equal (out_caps, GST_BUFFER_CAPS (buffer))); + gst_caps_unref (out_caps); + + /* cleanup */ + cleanup_capssetter (capssetter); +} + +#define SRC_WIDTH 8 +#define SRC_HEIGHT 12 + +static GstCaps * +make_src_caps (void) +{ + return gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, SRC_WIDTH, + "height", G_TYPE_INT, SRC_HEIGHT, NULL); +} + +/* don't try these caps mutations at home, folks */ + +GST_START_TEST (test_n_join_n_replace) +{ + GstCaps *in_caps, *prop_caps, *out_caps; + + in_caps = make_src_caps (); + prop_caps = gst_caps_new_simple ("video/x-raw-rgb", + "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); + out_caps = gst_caps_new_simple ("video/x-raw-rgb", + "width", G_TYPE_INT, 2 * SRC_WIDTH, + "height", G_TYPE_INT, SRC_HEIGHT, NULL); + push_and_test (prop_caps, FALSE, FALSE, in_caps, out_caps); +} + +GST_END_TEST; + +GST_START_TEST (test_n_join_replace) +{ + GstCaps *in_caps, *prop_caps, *out_caps; + + in_caps = make_src_caps (); + prop_caps = gst_caps_new_simple ("video/x-raw-rgb", + "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); + out_caps = gst_caps_copy (prop_caps); + push_and_test (prop_caps, FALSE, TRUE, in_caps, out_caps); +} + +GST_END_TEST; + +GST_START_TEST (test_join_n_replace_n_match) +{ + GstCaps *in_caps, *prop_caps, *out_caps; + + /* non joining caps */ + in_caps = make_src_caps (); + prop_caps = gst_caps_new_simple ("video/x-raw-rgb", + "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); + out_caps = gst_caps_copy (in_caps); + push_and_test (prop_caps, TRUE, FALSE, in_caps, out_caps); +} + +GST_END_TEST; + +GST_START_TEST (test_join_n_replace_match) +{ + GstCaps *in_caps, *prop_caps, *out_caps; + + /* joining caps */ + in_caps = make_src_caps (); + prop_caps = gst_caps_new_simple ("video/x-raw-yuv", + "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); + out_caps = gst_caps_new_simple ("video/x-raw-yuv", + "width", G_TYPE_INT, 2 * SRC_WIDTH, + "height", G_TYPE_INT, SRC_HEIGHT, NULL); + push_and_test (prop_caps, TRUE, FALSE, in_caps, out_caps); +} + +GST_END_TEST; + +GST_START_TEST (test_join_replace_n_match) +{ + GstCaps *in_caps, *prop_caps, *out_caps; + + /* non joining caps */ + in_caps = make_src_caps (); + prop_caps = gst_caps_new_simple ("video/x-raw-rgb", + "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); + out_caps = gst_caps_copy (in_caps); + push_and_test (prop_caps, TRUE, TRUE, in_caps, out_caps); +} + +GST_END_TEST; + +GST_START_TEST (test_join_replace_match) +{ + GstCaps *in_caps, *prop_caps, *out_caps; + + /* joining caps */ + in_caps = make_src_caps (); + prop_caps = gst_caps_new_simple ("video/x-raw-yuv", + "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); + out_caps = gst_caps_copy (prop_caps); + push_and_test (prop_caps, TRUE, TRUE, in_caps, out_caps); +} + +GST_END_TEST; + +static Suite * +capssetter_suite (void) +{ + Suite *s = suite_create ("capssetter"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_n_join_n_replace); + tcase_add_test (tc_chain, test_n_join_replace); + tcase_add_test (tc_chain, test_join_n_replace_n_match); + tcase_add_test (tc_chain, test_join_n_replace_match); + tcase_add_test (tc_chain, test_join_replace_n_match); + tcase_add_test (tc_chain, test_join_replace_match); + + return s; +} + +GST_CHECK_MAIN (capssetter); diff --git a/tests/check/elements/cmmldec.c b/tests/check/elements/cmmldec.c new file mode 100644 index 0000000..a6b8559 --- /dev/null +++ b/tests/check/elements/cmmldec.c @@ -0,0 +1,600 @@ +/* + * cmmldec.c - GStreamer CMML decoder test suite + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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 +#include + +#define SINK_CAPS "text/x-cmml" +#define SRC_CAPS "text/x-cmml, encoded=(boolean)TRUE" + +#define IDENT_HEADER \ + "CMML\x00\x00\x00\x00"\ + "\x03\x00\x00\x00"\ + "\xe8\x03\x00\x00\x00\x00\x00\x00"\ + "\x01\x00\x00\x00\x00\x00\x00\x00"\ + "\x20" +#define IDENT_HEADER_SIZE 29 + +#define PREAMBLE_NO_PI \ + "\n"\ + "\n" +#define PREAMBLE PREAMBLE_NO_PI "" +#define PREAMBLE_DECODED PREAMBLE_NO_PI "" + +#define HEAD_TAG \ + ""\ + "The Research Hunter"\ + ""\ + ""\ + ""\ + ""\ + ""\ + "" + +#define HEAD_TAG_DECODED HEAD_TAG + +#define CLIP_TEMPLATE \ + ""\ + "http://www.csiro.au"\ + ""\ + "Welcome to CSIRO"\ + ""\ + "" + +#define CLIP_TEMPLATE_DECODED \ + ""\ + "http://www.csiro.au"\ + ""\ + "Welcome to CSIRO"\ + ""\ + "" + +#define EMPTY_CLIP_TEMPLATE \ + "" + +#define END_TAG \ + "" + +#define fail_unless_equals_flow_return(a, b) \ +G_STMT_START { \ + gchar *a_up = g_ascii_strup (gst_flow_get_name (a), -1); \ + gchar *b_up = g_ascii_strup (gst_flow_get_name (b), -1); \ + fail_unless (a == b, \ + "'" #a "' (GST_FLOW_%s) is not equal to '" #b "' (GST_FLOW_%s)", \ + a_up, b_up); \ + g_free (a_up); \ + g_free (b_up); \ +} G_STMT_END; + +static GstElement *cmmldec; + +static GstBus *bus; + +static GstFlowReturn flow; + +static GList *current_buf; + +static gint64 granulerate; + +static guint8 granuleshift; + +static GstPad *srcpad, *sinkpad; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS) + ); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS) + ); + +static GstBuffer * +buffer_new (const gchar * buffer_data, guint size) +{ + GstBuffer *buffer; + + GstCaps *caps; + + buffer = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (buffer), buffer_data, size); + caps = gst_caps_from_string (SRC_CAPS); + gst_buffer_set_caps (buffer, caps); + gst_caps_unref (caps); + + return buffer; +} + +static void +buffer_unref (void *buffer, void *user_data) +{ + ASSERT_OBJECT_REFCOUNT (buffer, "buf", 1); + gst_buffer_unref (GST_BUFFER (buffer)); +} + +static void +setup_cmmldec (void) +{ + GST_DEBUG ("setup_cmmldec"); + cmmldec = gst_check_setup_element ("cmmldec"); + srcpad = gst_check_setup_src_pad (cmmldec, &srctemplate, NULL); + sinkpad = gst_check_setup_sink_pad (cmmldec, &sinktemplate, NULL); + gst_pad_set_active (srcpad, TRUE); + gst_pad_set_active (sinkpad, TRUE); + + bus = gst_bus_new (); + gst_element_set_bus (cmmldec, bus); + + fail_unless (gst_element_set_state (cmmldec, + GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, + "could not set to playing"); + + granulerate = GST_SECOND / 1000; + granuleshift = 32; + buffers = NULL; +} + +static void +teardown_cmmldec (void) +{ + g_list_foreach (buffers, buffer_unref, NULL); + g_list_free (buffers); + buffers = NULL; + current_buf = NULL; + + gst_bus_set_flushing (bus, TRUE); + gst_object_unref (bus); + + GST_DEBUG ("teardown_cmmldec"); + gst_pad_set_active (srcpad, FALSE); + gst_pad_set_active (sinkpad, FALSE); + gst_check_teardown_src_pad (cmmldec); + gst_check_teardown_sink_pad (cmmldec); + gst_check_teardown_element (cmmldec); +} + +static void +check_output_buffer_is_equal (const gchar * name, + const gchar * data, gint refcount) +{ + GstBuffer *buffer; + + if (current_buf == NULL) + current_buf = buffers; + else + current_buf = g_list_next (current_buf); + + fail_unless (current_buf != NULL); + + buffer = GST_BUFFER (current_buf->data); + + ASSERT_OBJECT_REFCOUNT (buffer, name, refcount); + fail_unless (memcmp (GST_BUFFER_DATA (buffer), data, + GST_BUFFER_SIZE (buffer)) == 0, + "'%s' (%s) is not equal to (%s)", name, GST_BUFFER_DATA (buffer), data); +} + +static GstFlowReturn +push_data (const gchar * name, const gchar * data, gint size, gint64 granulepos) +{ + GstBuffer *buffer; + + buffer = buffer_new (data, size); + GST_BUFFER_OFFSET_END (buffer) = granulepos; + return gst_pad_push (srcpad, buffer); +} + +static GObject * +cmml_tag_message_pop (GstBus * bus, const gchar * tag) +{ + GstMessage *message; + + GstTagList *taglist; + + const GValue *value; + + GObject *obj; + + message = gst_bus_poll (bus, GST_MESSAGE_TAG, 0); + if (message == NULL) + return NULL; + + gst_message_parse_tag (message, &taglist); + value = gst_tag_list_get_value_index (taglist, tag, 0); + if (value == NULL) { + gst_message_unref (message); + gst_tag_list_free (taglist); + return NULL; + } + + obj = g_value_dup_object (value); + gst_message_unref (message); + gst_tag_list_free (taglist); + + return obj; +} + +static void +check_headers (void) +{ + GObject *head_tag; + + gchar *title, *base; + + GValueArray *meta; + + /* push the ident header */ + flow = push_data ("ident-header", IDENT_HEADER, IDENT_HEADER_SIZE, 0); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + /* push the cmml preamble */ + flow = push_data ("preamble", PREAMBLE, strlen (PREAMBLE), 0); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + /* push the head tag */ + flow = push_data ("head", HEAD_TAG, strlen (HEAD_TAG), 0); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + fail_unless_equals_int (g_list_length (buffers), 2); + + /* check the decoded preamble */ + check_output_buffer_is_equal ("cmml-preamble-buffer", PREAMBLE_DECODED, 1); + + /* check the decoded head tag */ + check_output_buffer_is_equal ("head-tag-buffer", HEAD_TAG_DECODED, 1); + + /* check the GstCmmlTagHead tag object */ + head_tag = cmml_tag_message_pop (bus, GST_TAG_CMML_HEAD); + fail_unless (head_tag != NULL); + g_object_get (head_tag, + "title", &title, "base-uri", &base, "meta", &meta, NULL); + fail_unless_equals_string ("The Research Hunter", title); + fail_unless (base == NULL); + fail_unless (meta != NULL); + fail_unless_equals_int (meta->n_values, 10); + + g_free (title); + g_free (base); + g_value_array_free (meta); + g_object_unref (head_tag); +} + +static GstFlowReturn +push_clip_full (const gchar * name, const gchar * track, const gchar * template, + GstClockTime prev, GstClockTime start) +{ + gchar *clip; + + gint64 keyindex, keyoffset, granulepos; + + GstFlowReturn res; + + if (track == NULL) + track = "default"; + + if (prev == GST_CLOCK_TIME_NONE) + prev = 0; + + keyindex = prev / granulerate << granuleshift; + keyoffset = (start - prev) / granulerate; + granulepos = keyindex + keyoffset; + + clip = g_strdup_printf (template, name, track); + res = push_data (name, clip, strlen (clip), granulepos); + g_free (clip); + + return res; +} + +static GstFlowReturn +push_clip (const gchar * name, const gchar * track, + GstClockTime prev, GstClockTime start) +{ + return push_clip_full (name, track, CLIP_TEMPLATE, prev, start); +} + +static GstFlowReturn +push_empty_clip (const gchar * name, const gchar * track, GstClockTime start) +{ + return push_clip_full (name, track, + EMPTY_CLIP_TEMPLATE, GST_CLOCK_TIME_NONE, start); +} + + +static void +check_output_clip (const gchar * name, const gchar * track, + const gchar * start, const gchar * end) +{ + gchar *decoded_clip; + + if (track == NULL) + track = "default"; + + decoded_clip = g_strdup_printf (CLIP_TEMPLATE_DECODED, name, track, start); + check_output_buffer_is_equal (name, decoded_clip, 1); + g_free (decoded_clip); +} + +GST_START_TEST (test_dec) +{ + GstClockTime clip1_start = 1 * GST_SECOND + 234 * GST_MSECOND; + + GstClockTime clip2_start = clip1_start; + + GstClockTime clip3_start = + ((100 * 3600) + (59 * 60) + 59) * GST_SECOND + 678 * GST_MSECOND; + + check_headers (); + + flow = push_clip ("clip-1", "default", GST_CLOCK_TIME_NONE, clip1_start); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + flow = push_clip ("clip-2", "othertrack", GST_CLOCK_TIME_NONE, clip2_start); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + flow = push_clip ("clip-3", "default", clip1_start, clip3_start); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + /* send EOS to flush clip-2 and clip-3 */ + gst_pad_send_event (GST_PAD_PEER (srcpad), gst_event_new_eos ()); + + check_output_clip ("clip-1", "default", "0:00:01.234", NULL); + check_output_clip ("clip-2", "othertrack", "0:00:01.234", NULL); + check_output_clip ("clip-3", "default", "100:59:59.678", NULL); + check_output_buffer_is_equal ("cmml-end-tag", END_TAG, 1); +} + +GST_END_TEST; + +GST_START_TEST (test_preamble_no_pi) +{ + flow = push_data ("ident-header", IDENT_HEADER, IDENT_HEADER_SIZE, 0); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + fail_unless_equals_int (g_list_length (buffers), 0); + + flow = push_data ("preamble-no-pi", + PREAMBLE_NO_PI, strlen (PREAMBLE_NO_PI), 0); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + fail_unless_equals_int (g_list_length (buffers), 1); + + check_output_buffer_is_equal ("cmml-preamble-buffer", + PREAMBLE_NO_PI "", 1); +} + +GST_END_TEST; + +GST_START_TEST (test_tags) +{ + GObject *tag; + + gboolean empty; + + gchar *id, *track; + + gint64 start_time, end_time; + + gchar *anchor_href, *anchor_text; + + gchar *img_src, *img_alt; + + gchar *desc; + + GValueArray *meta; + + GstClockTime clip1_start; + + check_headers (); + + clip1_start = 1 * GST_SECOND + 234 * GST_MSECOND; + flow = push_clip ("clip-1", "default", 0, clip1_start); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); + fail_unless (tag != NULL); + + g_object_get (tag, "id", &id, "empty", &empty, "track", &track, + "start-time", &start_time, "end-time", &end_time, + "anchor-uri", &anchor_href, "anchor-text", &anchor_text, + "img-uri", &img_src, "img-alt", &img_alt, + "description", &desc, "meta", &meta, NULL); + + fail_unless (empty == FALSE); + fail_unless_equals_string (id, "clip-1"); + fail_unless_equals_string (track, "default"); + fail_unless_equals_int (start_time, 1 * GST_SECOND + 234 * GST_MSECOND); + fail_unless_equals_uint64 (end_time, GST_CLOCK_TIME_NONE); + fail_unless_equals_string (anchor_href, "http://www.csiro.au/"); + fail_unless_equals_string (anchor_text, "http://www.csiro.au"); + fail_unless_equals_string (img_src, "images/index1.jpg"); + fail_unless (img_alt == NULL); + fail_unless_equals_string (desc, "Welcome to CSIRO"); + fail_unless (meta != NULL); + fail_unless_equals_int (meta->n_values, 2); + + g_free (id); + g_free (track); + g_free (anchor_href); + g_free (anchor_text); + g_free (img_src); + g_free (img_alt); + g_free (desc); + g_value_array_free (meta); + g_object_unref (tag); +} + +GST_END_TEST; + +GST_START_TEST (test_wait_clip_end) +{ + GObject *tag; + + gchar *id; + + GstClockTime end_time = 0; + + GstClockTime clip1_start = 1 * GST_SECOND + 234 * GST_MSECOND; + + GstClockTime clip2_start = 2 * GST_SECOND + 234 * GST_MSECOND; + + GstClockTime clip3_start = 3 * GST_SECOND + 234 * GST_MSECOND; + + GstClockTime clip3_end = 4 * GST_SECOND + 234 * GST_MSECOND; + + GstClockTime clip4_start = 5 * GST_SECOND + 234 * GST_MSECOND; + + g_object_set (cmmldec, "wait-clip-end-time", TRUE, NULL); + + check_headers (); + + flow = push_clip ("clip-1", "default", 0, clip1_start); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + /* no tag has been posted yet */ + fail_unless (cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP) == NULL); + + flow = push_clip ("clip-2", "default", clip1_start, clip2_start); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); + fail_unless (tag != NULL); + g_object_get (tag, "id", &id, "end-time", &end_time, NULL); + /* clip-1 is posted when clip-2 is decoded. clip-1 ends when clip-2 starts */ + fail_unless_equals_string (id, "clip-1"); + fail_unless_equals_int (end_time, clip2_start); + g_free (id); + g_object_unref (tag); + + flow = push_clip ("clip-3", "default", clip2_start, clip3_start); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); + fail_unless (tag != NULL); + g_object_get (tag, "id", &id, "end-time", &end_time, NULL); + /* clip-2 is posted when clip-3 is decoded. It ends when clip-3 starts */ + fail_unless_equals_string (id, "clip-2"); + fail_unless_equals_int (end_time, clip3_start); + g_free (id); + g_object_unref (tag); + + flow = push_empty_clip ("empty-clip", "default", clip3_end); + tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); + fail_unless (tag != NULL); + g_object_get (tag, "id", &id, "end-time", &end_time, NULL); + /* clip-3 ends when empty-clip is decoded */ + fail_unless_equals_string (id, "clip-3"); + fail_unless_equals_int (end_time, clip3_end); + g_free (id); + g_object_unref (tag); + + flow = push_clip ("clip-4", "default", clip3_start, clip4_start); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + /* an empty clip just marks the end of the previous one, so no tag is posted + * for empty-clip */ + fail_unless (cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP) == NULL); + /* send EOS to flush clip-4 */ + gst_pad_send_event (GST_PAD_PEER (srcpad), gst_event_new_eos ()); + + tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); + fail_unless (tag != NULL); + g_object_get (tag, "id", &id, NULL); + fail_unless_equals_string (id, "clip-4"); + g_free (id); + g_object_unref (tag); +} + +GST_END_TEST; + +GST_START_TEST (test_weird_input) +{ + const gchar *bad_xml = ""; + + /* malformed ident header */ + flow = push_data ("bad-ident-header", "CMML\0\0\0\0garbage", 15, 0); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + /* push invalid xml */ + flow = push_data ("bad-xml", bad_xml, strlen (bad_xml), 0); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + /* and now for something completely different: an empty buffer. This is valid + * as 'NIL' EOS pages are allowed */ + flow = push_data ("empty-eos", NULL, 0, 0); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); +} + +GST_END_TEST; + +GST_START_TEST (test_sink_query_convert) +{ + guint64 keyindex, keyoffset, granulepos; + + GstClockTime index_time, offset_time; + + GstFormat dstfmt = GST_FORMAT_TIME; + + gint64 dstval; + + /* send headers to set the granulerate */ + check_headers (); + + /* create a 1|1 granulepos */ + index_time = 1 * GST_SECOND; + offset_time = 1 * GST_SECOND; + + keyindex = (index_time / granulerate) << granuleshift; + keyoffset = offset_time / granulerate; + granulepos = keyindex + keyoffset; + + fail_unless (gst_pad_query_convert (GST_PAD_PEER (srcpad), + GST_FORMAT_DEFAULT, granulepos, &dstfmt, &dstval)); + + fail_unless (dstfmt == GST_FORMAT_TIME); + /* fail unless dstval == index + offset */ + fail_unless_equals_int (2 * GST_SECOND, dstval); +} + +GST_END_TEST; + +static Suite * +cmmldec_suite (void) +{ + Suite *s = suite_create ("cmmldec"); + + TCase *tc_general = tcase_create ("general"); + + suite_add_tcase (s, tc_general); + tcase_add_checked_fixture (tc_general, setup_cmmldec, teardown_cmmldec); + tcase_add_test (tc_general, test_dec); + tcase_add_test (tc_general, test_tags); + tcase_add_test (tc_general, test_preamble_no_pi); + tcase_add_test (tc_general, test_wait_clip_end); + tcase_add_test (tc_general, test_sink_query_convert); + tcase_add_test (tc_general, test_weird_input); + + return s; +} + +GST_CHECK_MAIN (cmmldec); diff --git a/tests/check/elements/cmmlenc.c b/tests/check/elements/cmmlenc.c new file mode 100644 index 0000000..4b95d71 --- /dev/null +++ b/tests/check/elements/cmmlenc.c @@ -0,0 +1,491 @@ +/* + * cmmlenc.c - GStreamer CMML decoder test suite + * Copyright (C) 2005 Alessandro Decina + * + * Authors: + * Alessandro Decina + * + * 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 + +#include + +#define SINK_CAPS "text/x-cmml" +#define SRC_CAPS "text/x-cmml,encoded=(boolean)FALSE" + +#define IDENT_HEADER \ + "CMML\x00\x00\x00\x00"\ + "\x03\x00\x00\x00"\ + "\xe8\x03\x00\x00\x00\x00\x00\x00"\ + "\x01\x00\x00\x00\x00\x00\x00\x00"\ + "\x20" + +#define XML_PREAMBLE \ + "\n"\ + "\n" + +#define START_TAG \ + "" + +#define PROCESSING_INSTRUCTION \ + "" + +#define PREAMBLE \ + XML_PREAMBLE START_TAG + +#define PREAMBLE_ENCODED \ + XML_PREAMBLE PROCESSING_INSTRUCTION + +#define STREAM_TAG \ + ""\ + ""\ + ""\ + "" + +#define STREAM_TAG_ENCODED STREAM_TAG + +#define HEAD_TAG \ + ""\ + "The Research Hunter"\ + ""\ + ""\ + ""\ + ""\ + ""\ + "" + +#define HEAD_TAG_ENCODED HEAD_TAG + +#define CLIP_TEMPLATE \ + ""\ + "http://www.annodex.org"\ + ""\ + "Annodex Foundation"\ + ""\ + "" + +#define ENDED_CLIP_TEMPLATE \ + ""\ + "http://www.annodex.org"\ + ""\ + "Annodex Foundation"\ + ""\ + "" + +#define CLIP_TEMPLATE_ENCODED \ + ""\ + "http://www.annodex.org"\ + ""\ + "Annodex Foundation"\ + ""\ + "" + +#define EMPTY_CLIP_TEMPLATE_ENCODED \ + "" + +#define fail_unless_equals_flow_return(a, b) \ +G_STMT_START { \ + gchar *a_up = g_ascii_strup (gst_flow_get_name (a), -1); \ + gchar *b_up = g_ascii_strup (gst_flow_get_name (b), -1); \ + fail_unless (a == b, \ + "'" #a "' (GST_FLOW_%s) is not equal to '" #b "' (GST_FLOW_%s)", \ + a_up, b_up); \ + g_free (a_up); \ + g_free (b_up); \ +} G_STMT_END; + +static GList *current_buf; +static guint64 granulerate; +static guint8 granuleshift; +static GstElement *cmmlenc; +static GstBus *bus; +static GstFlowReturn flow; +static GstPad *srcpad, *sinkpad; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS) + ); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS) + ); + +static GstBuffer * +buffer_new (const gchar * buffer_data, guint size) +{ + GstBuffer *buffer; + GstCaps *caps; + + buffer = gst_buffer_new_and_alloc (size); + memcpy (GST_BUFFER_DATA (buffer), buffer_data, size); + caps = gst_caps_from_string (SRC_CAPS); + gst_buffer_set_caps (buffer, caps); + gst_caps_unref (caps); + + return buffer; +} + +static void +buffer_unref (void *buffer, void *user_data) +{ + gst_buffer_unref (GST_BUFFER (buffer)); +} + +static void +setup_cmmlenc (void) +{ + guint64 granulerate_n, granulerate_d; + + GST_DEBUG ("setup_cmmlenc"); + + cmmlenc = gst_check_setup_element ("cmmlenc"); + srcpad = gst_check_setup_src_pad (cmmlenc, &srctemplate, NULL); + sinkpad = gst_check_setup_sink_pad (cmmlenc, &sinktemplate, NULL); + gst_pad_set_active (srcpad, TRUE); + gst_pad_set_active (sinkpad, TRUE); + + bus = gst_bus_new (); + gst_element_set_bus (cmmlenc, bus); + + fail_unless (gst_element_set_state (cmmlenc, + GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, + "could not set to playing"); + + g_object_get (cmmlenc, "granule-rate-numerator", &granulerate_n, + "granule-rate-denominator", &granulerate_d, + "granule-shift", &granuleshift, NULL); + + granulerate = GST_SECOND * granulerate_d / granulerate_n; +} + +static void +teardown_cmmlenc (void) +{ + /* free encoded buffers */ + g_list_foreach (buffers, buffer_unref, NULL); + g_list_free (buffers); + buffers = NULL; + current_buf = NULL; + + gst_bus_set_flushing (bus, TRUE); + gst_object_unref (bus); + + GST_DEBUG ("teardown_cmmlenc"); + gst_pad_set_active (srcpad, FALSE); + gst_pad_set_active (sinkpad, FALSE); + gst_check_teardown_src_pad (cmmlenc); + gst_check_teardown_sink_pad (cmmlenc); + gst_check_teardown_element (cmmlenc); +} + +static void +check_output_buffer_is_equal (const gchar * name, + const gchar * data, gint refcount) +{ + GstBuffer *buffer; + + if (current_buf == NULL) + current_buf = buffers; + else + current_buf = g_list_next (current_buf); + + fail_unless (current_buf != NULL); + buffer = GST_BUFFER (current_buf->data); + + ASSERT_OBJECT_REFCOUNT (buffer, name, refcount); + fail_unless (memcmp (GST_BUFFER_DATA (buffer), data, + GST_BUFFER_SIZE (buffer)) == 0, + "'%s' (%s) is not equal to (%s)", name, GST_BUFFER_DATA (buffer), data); +} + +static GstFlowReturn +push_data (const gchar * name, const gchar * data, gint size) +{ + GstBuffer *buffer; + GstFlowReturn res; + + buffer = buffer_new (data, size); + res = gst_pad_push (srcpad, buffer); + + return res; +} + +static void +check_headers (void) +{ + /* push the cmml start tag */ + flow = push_data ("preamble", PREAMBLE, strlen (PREAMBLE)); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + /* push the stream tag */ + flow = push_data ("stream", STREAM_TAG, strlen (STREAM_TAG)); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + /* push the head tag */ + flow = push_data ("head", HEAD_TAG, strlen (HEAD_TAG)); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + + /* should output 3 buffers: the ident, preamble and head headers */ + fail_unless_equals_int (g_list_length (buffers), 3); + + /* check the ident header */ + check_output_buffer_is_equal ("cmml-ident-buffer", IDENT_HEADER, 1); + + /* check the cmml processing instruction */ + check_output_buffer_is_equal ("cmml-preamble-buffer", PREAMBLE_ENCODED, 1); + + /* check the encoded head tag */ + check_output_buffer_is_equal ("head-tag-buffer", HEAD_TAG_ENCODED, 1); +} + +static GstFlowReturn +push_clip (const gchar * name, const gchar * track, + const gchar * start, const gchar * end) +{ + gchar *clip; + GstFlowReturn res; + + if (end != NULL) + clip = g_strdup_printf (ENDED_CLIP_TEMPLATE, name, track, start, end); + else + clip = g_strdup_printf (CLIP_TEMPLATE, name, track, start); + res = push_data (name, clip, strlen (clip)); + g_free (clip); + + return res; +} + +static void +check_clip_times (GstBuffer * buffer, GstClockTime start, GstClockTime prev) +{ + guint64 keyindex, keyoffset, granulepos; + + granulepos = GST_BUFFER_OFFSET_END (buffer); + if (granuleshift == 0 || granuleshift == 64) + keyindex = 0; + else + keyindex = granulepos >> granuleshift; + keyoffset = granulepos - (keyindex << granuleshift); + fail_unless_equals_uint64 (keyindex * granulerate, prev); + fail_unless_equals_uint64 ((keyindex + keyoffset) * granulerate, start); +} + +static void +check_clip (const gchar * name, const gchar * track, + GstClockTime start, GstClockTime prev) +{ + gchar *encoded_clip; + GstBuffer *buffer; + + encoded_clip = g_strdup_printf (CLIP_TEMPLATE_ENCODED, name, track); + check_output_buffer_is_equal (name, encoded_clip, 1); + g_free (encoded_clip); + buffer = GST_BUFFER (current_buf->data); + check_clip_times (buffer, start, prev); +} + +static void +check_empty_clip (const gchar * name, const gchar * track, + GstClockTime start, GstClockTime prev) +{ + gchar *encoded_clip; + GstBuffer *buffer; + + encoded_clip = g_strdup_printf (EMPTY_CLIP_TEMPLATE_ENCODED, track); + check_output_buffer_is_equal (name, encoded_clip, 1); + g_free (encoded_clip); + buffer = GST_BUFFER (current_buf->data); + check_clip_times (buffer, start, prev); +} + +GST_START_TEST (test_enc) +{ + check_headers (); + + flow = push_clip ("clip-1", "default", "1.234", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("clip-1", "default", 1 * GST_SECOND + 234 * GST_MSECOND, 0); + + flow = push_clip ("clip-2", "default", "5.678", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("clip-2", "default", + 5 * GST_SECOND + 678 * GST_MSECOND, 1 * GST_SECOND + 234 * GST_MSECOND); + + flow = push_clip ("clip-3", "othertrack", "9.123", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("clip-3", "othertrack", 9 * GST_SECOND + 123 * GST_MSECOND, 0); + + flow = push_data ("end-tag", "", strlen ("")); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_output_buffer_is_equal ("cmml-eos", NULL, 1); +} + +GST_END_TEST; + +GST_START_TEST (test_clip_end_time) +{ + check_headers (); + + /* push a clip that starts at 1.234 an ends at 2.234 */ + flow = push_clip ("clip-1", "default", "1.234", "2.234"); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("clip-1", "default", 1 * GST_SECOND + 234 * GST_MSECOND, 0); + + /* now check that the encoder created an empty clip starting at 2.234 to mark + * the end of clip-1 */ + check_empty_clip ("clip-1-end", "default", + 2 * GST_SECOND + 234 * GST_MSECOND, 1 * GST_SECOND + 234 * GST_MSECOND); + + /* now push another clip on the same track and check that the keyindex part of + * the granulepos points to clip-1 and not to the empty clip */ + flow = push_clip ("clip-2", "default", "5", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("clip-2", "default", + 5 * GST_SECOND, 1 * GST_SECOND + 234 * GST_MSECOND); +} + +GST_END_TEST; + +GST_START_TEST (test_time_order) +{ + check_headers (); + + /* clips belonging to the same track must have start times in non decreasing + * order */ + flow = push_clip ("clip-1", "default", "1000:00:00.000", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("clip-1", "default", 3600 * 1000 * GST_SECOND, 0); + + /* this will make the encoder throw an error message */ + flow = push_clip ("clip-2", "default", "5.678", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + flow = push_clip ("clip-3", "default", "1000:00:00.001", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("clip-3", "default", + 3600 * 1000 * GST_SECOND + 1 * GST_MSECOND, 3600 * 1000 * GST_SECOND); + + /* tracks don't interfere with each other */ + flow = push_clip ("clip-4", "othertrack", "9.123", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("clip-4", "othertrack", 9 * GST_SECOND + 123 * GST_MSECOND, 0); +} + +GST_END_TEST; + +GST_START_TEST (test_time_parsing) +{ + check_headers (); + + flow = push_clip ("bad-msecs", "default", "0.1000", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + flow = push_clip ("bad-secs", "default", "00:00:60.123", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + flow = push_clip ("bad-minutes", "default", "00:60:12.345", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + /* this fails since we can't store 5124096 * 3600 * GST_SECOND in a + * GstClockTime */ + flow = push_clip ("bad-hours", "default", "5124096:00:00.000", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); +} + +GST_END_TEST; + +GST_START_TEST (test_time_limits) +{ + check_headers (); + + /* ugly hack to make sure that the following checks actually overflow parsing + * the times in gst_cmml_clock_time_from_npt rather than converting them to + * granulepos in gst_cmml_clock_time_to_granule */ + granuleshift = 64; + g_object_set (cmmlenc, "granule-shift", granuleshift, NULL); + + /* 5124095:34:33.709 is the max npt-hhmmss time representable with + * GstClockTime */ + flow = push_clip ("max-npt-hhmmss", "foo", "5124095:34:33.709", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("max-npt-hhmmss", "foo", + (GstClockTime) 5124095 * 3600 * GST_SECOND + 34 * 60 * GST_SECOND + + 33 * GST_SECOND + 709 * GST_MSECOND, 0); + + flow = push_clip ("overflow-max-npt-hhmmss", "overflows", + "5124095:34:33.710", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + /* 18446744073.709 is the max ntp-sec time */ + flow = push_clip ("max-npt-secs", "bar", "18446744073.709", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("max-npt-secs", "bar", + (GstClockTime) 5124095 * 3600 * GST_SECOND + 34 * 60 * GST_SECOND + + 33 * GST_SECOND + 709 * GST_MSECOND, 0); + + /* overflow doing 18446744074 * GST_SECOND */ + flow = push_clip ("overflow-max-npt-secs", "overflows", + "18446744074.000", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + /* overflow doing seconds + milliseconds */ + flow = push_clip ("overflow-max-npt-secs-msecs", "overflows", + "18446744073.710", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); + + /* reset granuleshift to 32 to check keyoffset overflows in + * gst_cmml_clock_time_to_granule */ + granuleshift = 32; + g_object_set (cmmlenc, "granule-shift", granuleshift, NULL); + + /* 1193:02:47.295 is the max time we can encode in the keyoffset part of a + * granulepos given a granuleshift of 32 */ + flow = push_clip ("max-granule-keyoffset", "baz", "1193:02:47.295", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_OK); + check_clip ("max-granule-keyoffset", "baz", + 1193 * 3600 * GST_SECOND + 2 * 60 * GST_SECOND + + 47 * GST_SECOND + 295 * GST_MSECOND, 0); + + flow = push_clip ("overflow-max-granule-keyoffset", "overflows", + "1193:02:47.296", NULL); + fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); +} + +GST_END_TEST; + +static Suite * +cmmlenc_suite (void) +{ + Suite *s = suite_create ("cmmlenc"); + TCase *tc_general = tcase_create ("general"); + + suite_add_tcase (s, tc_general); + tcase_add_checked_fixture (tc_general, setup_cmmlenc, teardown_cmmlenc); + tcase_add_test (tc_general, test_enc); + tcase_add_test (tc_general, test_clip_end_time); + tcase_add_test (tc_general, test_time_order); + tcase_add_test (tc_general, test_time_parsing); + tcase_add_test (tc_general, test_time_limits); + + return s; +} + +GST_CHECK_MAIN (cmmlenc); diff --git a/tests/check/elements/deinterlace.c b/tests/check/elements/deinterlace.c new file mode 100644 index 0000000..6aeb3de --- /dev/null +++ b/tests/check/elements/deinterlace.c @@ -0,0 +1,445 @@ +/* GStreamer unit tests for the deinterlace element + * Copyright (C) 2010 Thiago Santos + * + * 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 +#include +#include + +static gboolean +gst_caps_is_interlaced (GstCaps * caps) +{ + GstStructure G_GNUC_UNUSED *structure; + gboolean interlaced = FALSE; + + fail_unless (gst_caps_is_fixed (caps)); + structure = gst_caps_get_structure (caps, 0); + fail_unless (gst_video_format_parse_caps_interlaced (caps, &interlaced)); + return interlaced; +} + +GST_START_TEST (test_create_and_unref) +{ + GstElement *deinterlace; + + deinterlace = gst_element_factory_make ("deinterlace", NULL); + fail_unless (deinterlace != NULL); + + gst_element_set_state (deinterlace, GST_STATE_NULL); + gst_object_unref (deinterlace); +} + +GST_END_TEST; + +#define CAPS_VIDEO_COMMON \ + "width=(int)800, height=(int)600, framerate=(fraction)15/1" + +#define CAPS_IMAGE_COMMON \ + "width=(int)3200, height=(int)3400, framerate=(fraction)0/1" + +#define CAPS_YUY2 \ + "video/x-raw-yuv, " \ + CAPS_VIDEO_COMMON ", " \ + "format=(fourcc)YUY2" + +#define CAPS_YUY2_INTERLACED \ + CAPS_YUY2 ", " \ + "interlaced=(boolean)true" + +#define CAPS_YVYU \ + "video/x-raw-yuv, " \ + CAPS_VIDEO_COMMON ", " \ + "format=(fourcc)YVYU" + +#define CAPS_YVYU_INTERLACED \ + CAPS_YVYU ", " \ + "interlaced=(boolean)true" + +#define CAPS_YUY2_IMAGE \ + "video/x-raw-yuv, " \ + CAPS_IMAGE_COMMON ", " \ + "format=(fourcc)YUY2" + +#define CAPS_YUY2_INTERLACED_IMAGE \ + CAPS_YUY2_IMAGE ", " \ + "interlaced=(boolean)true" + +#define CAPS_YVYU_IMAGE \ + "video/x-raw-yuv, " \ + CAPS_IMAGE_COMMON ", " \ + "format=(fourcc)YVYU" + +#define CAPS_YVYU_INTERLACED_IMAGE \ + CAPS_YVYU_IMAGE ", " \ + "interlaced=(boolean)true" + +static GstElement *deinterlace; +static GstPad *srcpad; +static GstPad *sinkpad; + +static GstElement *pipeline; + +/* sets up deinterlace and shortcut pointers to its pads */ +static void +setup_deinterlace (void) +{ + deinterlace = gst_element_factory_make ("deinterlace", NULL); + fail_unless (deinterlace != NULL); + + sinkpad = gst_element_get_static_pad (deinterlace, "sink"); + fail_unless (sinkpad != NULL); + srcpad = gst_element_get_static_pad (deinterlace, "src"); + fail_unless (srcpad != NULL); +} + +/* sets up a basic test pipeline containing: + * + * videotestsrc ! capsfilter ! deinterlace ! fakesink + * + * The parameters set the capsfilter caps and the num-buffers + * property of videotestsrc + * + * It is useful for adding buffer probes to deinterlace pads + * and validating inputs/outputs + */ +static void +setup_test_pipeline (gint mode, GstCaps * infiltercaps, GstCaps * outfiltercaps, + gint numbuffers) +{ + GstElement *src; + GstElement *infilter; + GstElement *outfilter; + GstElement *sink; + + setup_deinterlace (); + + pipeline = gst_pipeline_new ("pipeline"); + src = gst_element_factory_make ("videotestsrc", NULL); + infilter = gst_element_factory_make ("capsfilter", "infilter"); + outfilter = gst_element_factory_make ("capsfilter", "outfilter"); + sink = gst_element_factory_make ("fakesink", NULL); + fail_if (src == NULL); + fail_if (infilter == NULL); + fail_if (outfilter == NULL); + fail_if (sink == NULL); + + fail_unless (gst_bin_add (GST_BIN (pipeline), src)); + fail_unless (gst_bin_add (GST_BIN (pipeline), infilter)); + fail_unless (gst_bin_add (GST_BIN (pipeline), deinterlace)); + fail_unless (gst_bin_add (GST_BIN (pipeline), outfilter)); + fail_unless (gst_bin_add (GST_BIN (pipeline), sink)); + + /* set the properties */ + g_object_set (deinterlace, "mode", mode, NULL); + if (numbuffers > 0) + g_object_set (src, "num-buffers", numbuffers, NULL); + if (infiltercaps) + g_object_set (infilter, "caps", infiltercaps, NULL); + if (outfiltercaps) + g_object_set (outfilter, "caps", outfiltercaps, NULL); + + fail_unless (gst_element_link_many (src, infilter, deinterlace, outfilter, + sink, NULL)); + if (infiltercaps) + gst_caps_unref (infiltercaps); + if (outfiltercaps) + gst_caps_unref (outfiltercaps); +} + +/* + * Checks if 2 buffers are equal + * + * Equals means same caps and same data + */ +static gboolean +test_buffer_equals (GstBuffer * buf_a, GstBuffer * buf_b) +{ + GstCaps *caps_a; + GstCaps *caps_b; + + if (GST_BUFFER_SIZE (buf_a) != GST_BUFFER_SIZE (buf_b)) + return FALSE; + + caps_a = gst_buffer_get_caps (buf_a); + caps_b = gst_buffer_get_caps (buf_b); + + if (!gst_caps_is_equal (caps_a, caps_b)) + return FALSE; + + gst_caps_unref (caps_a); + gst_caps_unref (caps_b); + + return memcmp (GST_BUFFER_DATA (buf_a), GST_BUFFER_DATA (buf_b), + GST_BUFFER_SIZE (buf_a)) == 0; +} + +static gboolean +sinkpad_enqueue_buffer (GstPad * pad, GstBuffer * buf, gpointer data) +{ + GQueue *queue = (GQueue *) data; + + /* enqueue a copy for being compared later */ + g_queue_push_tail (queue, gst_buffer_copy (buf)); + + return TRUE; +} + +/* + * pad buffer probe that compares the buffer with the top one + * in the GQueue passed as the user data + */ +static gboolean +srcpad_dequeue_and_compare_buffer (GstPad * pad, GstBuffer * buf, gpointer data) +{ + GQueue *queue = (GQueue *) data; + GstBuffer *queue_buf; + + queue_buf = (GstBuffer *) g_queue_pop_head (queue); + fail_if (queue_buf == NULL); + + fail_unless (test_buffer_equals (buf, queue_buf)); + + gst_buffer_unref (queue_buf); + + return TRUE; +} + +/* + * Utility function that sets up a pipeline with deinterlace for + * validanting that it operates in passthrough mode when receiving + * data with 'infiltercaps' as the input caps and operating in 'mode' mode + */ +static void +deinterlace_check_passthrough (gint mode, const gchar * infiltercaps) +{ + GstMessage *msg; + GQueue *queue; + GstCaps *incaps = NULL; + + if (infiltercaps) + incaps = gst_caps_from_string (infiltercaps); + + setup_test_pipeline (mode, incaps, NULL, 20); + + queue = g_queue_new (); + + /* set up probes for testing */ + gst_pad_add_buffer_probe (sinkpad, (GCallback) sinkpad_enqueue_buffer, queue); + gst_pad_add_buffer_probe (srcpad, + (GCallback) srcpad_dequeue_and_compare_buffer, queue); + + fail_unless (gst_element_set_state (pipeline, GST_STATE_PLAYING) != + GST_STATE_CHANGE_FAILURE); + + msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); + gst_message_unref (msg); + + /* queue should be empty */ + fail_unless (g_queue_is_empty (queue)); + + fail_unless (gst_element_set_state (pipeline, GST_STATE_NULL) == + GST_STATE_CHANGE_SUCCESS); + gst_object_unref (pipeline); + g_queue_free (queue); +} + +/* + * Sets the caps on deinterlace sinkpad and validates the + * caps that is set on the srcpad + */ +static void +deinterlace_set_caps_and_check (GstCaps * input, gboolean must_deinterlace) +{ + GstCaps *othercaps = NULL; + + fail_unless (gst_pad_set_caps (sinkpad, input)); + g_object_get (srcpad, "caps", &othercaps, NULL); + + if (must_deinterlace) { + fail_if (gst_caps_is_interlaced (othercaps)); + } else { + GstStructure *s; + + fail_unless (gst_caps_is_interlaced (input) == + gst_caps_is_interlaced (othercaps)); + + othercaps = gst_caps_make_writable (othercaps); + s = gst_caps_get_structure (othercaps, 0); + gst_structure_remove_field (s, "interlaced"); + + input = gst_caps_make_writable (input); + s = gst_caps_get_structure (input, 0); + gst_structure_remove_field (s, "interlaced"); + + fail_unless (gst_caps_is_equal (input, othercaps)); + } + gst_caps_unref (input); + gst_caps_unref (othercaps); +} + +static void +deinterlace_set_string_caps_and_check (const gchar * input, + gboolean must_deinterlace) +{ + deinterlace_set_caps_and_check (gst_caps_from_string (input), + must_deinterlace); +} + +GST_START_TEST (test_mode_auto_accept_caps) +{ + setup_deinterlace (); + + /* auto mode */ + g_object_set (deinterlace, "mode", 0, NULL); + fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == + GST_STATE_CHANGE_SUCCESS); + + /* try to set non interlaced caps */ + deinterlace_set_string_caps_and_check (CAPS_YVYU, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YUY2, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, FALSE); + + /* now try to set interlaced caps */ + deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, TRUE); + + /* cleanup */ + gst_object_unref (sinkpad); + gst_object_unref (srcpad); + fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == + GST_STATE_CHANGE_SUCCESS); + gst_object_unref (deinterlace); +} + +GST_END_TEST; + +GST_START_TEST (test_mode_forced_accept_caps) +{ + setup_deinterlace (); + + /* forced mode */ + g_object_set (deinterlace, "mode", 1, NULL); + fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == + GST_STATE_CHANGE_SUCCESS); + + /* try to set non interlaced caps */ + deinterlace_set_string_caps_and_check (CAPS_YVYU, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YUY2, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, TRUE); + + /* now try to set interlaced caps */ + deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, TRUE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, TRUE); + + /* cleanup */ + gst_object_unref (sinkpad); + gst_object_unref (srcpad); + fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == + GST_STATE_CHANGE_SUCCESS); + gst_object_unref (deinterlace); +} + +GST_END_TEST; + +GST_START_TEST (test_mode_disabled_accept_caps) +{ + setup_deinterlace (); + + /* disabled mode */ + g_object_set (deinterlace, "mode", 2, NULL); + fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == + GST_STATE_CHANGE_SUCCESS); + + /* try to set non interlaced caps */ + deinterlace_set_string_caps_and_check (CAPS_YVYU, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YUY2, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, FALSE); + + /* now try to set interlaced caps */ + deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, FALSE); + deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, FALSE); + + /* cleanup */ + gst_object_unref (sinkpad); + gst_object_unref (srcpad); + fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == + GST_STATE_CHANGE_SUCCESS); + gst_object_unref (deinterlace); +} + +GST_END_TEST; + +GST_START_TEST (test_mode_disabled_passthrough) +{ + /* 2 is disabled mode */ + deinterlace_check_passthrough (2, CAPS_YUY2_INTERLACED); + deinterlace_check_passthrough (2, CAPS_YVYU_INTERLACED); + deinterlace_check_passthrough (2, CAPS_YUY2); + deinterlace_check_passthrough (2, CAPS_YVYU); + + deinterlace_check_passthrough (2, CAPS_YUY2_INTERLACED_IMAGE); + deinterlace_check_passthrough (2, CAPS_YVYU_INTERLACED_IMAGE); + deinterlace_check_passthrough (2, CAPS_YUY2_IMAGE); + deinterlace_check_passthrough (2, CAPS_YVYU_IMAGE); +} + +GST_END_TEST; + +GST_START_TEST (test_mode_auto_deinterlaced_passthrough) +{ + /* 0 is auto mode */ + deinterlace_check_passthrough (0, CAPS_YUY2); + deinterlace_check_passthrough (0, CAPS_YVYU); + deinterlace_check_passthrough (0, CAPS_YUY2_IMAGE); + deinterlace_check_passthrough (0, CAPS_YVYU_IMAGE); +} + +GST_END_TEST; + +static Suite * +deinterlace_suite (void) +{ + Suite *s = suite_create ("deinterlace"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_set_timeout (tc_chain, 180); + tcase_add_test (tc_chain, test_create_and_unref); + tcase_add_test (tc_chain, test_mode_auto_accept_caps); + tcase_add_test (tc_chain, test_mode_forced_accept_caps); + tcase_add_test (tc_chain, test_mode_disabled_accept_caps); + tcase_add_test (tc_chain, test_mode_disabled_passthrough); + tcase_add_test (tc_chain, test_mode_auto_deinterlaced_passthrough); + + return s; +} + +GST_CHECK_MAIN (deinterlace); diff --git a/tests/check/elements/deinterleave.c b/tests/check/elements/deinterleave.c new file mode 100644 index 0000000..3a0eb0c --- /dev/null +++ b/tests/check/elements/deinterleave.c @@ -0,0 +1,559 @@ +/* GStreamer unit tests for the interleave element + * Copyright (C) 2008 Sebastian Dröge + * + * 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 +#include +#include + +GST_START_TEST (test_create_and_unref) +{ + GstElement *deinterleave; + + deinterleave = gst_element_factory_make ("deinterleave", NULL); + fail_unless (deinterleave != NULL); + + gst_element_set_state (deinterleave, GST_STATE_NULL); + gst_object_unref (deinterleave); +} + +GST_END_TEST; + +static GstPad *mysrcpad, **mysinkpads; +static gint nsinkpads; +static GstBus *bus; +static GstElement *deinterleave; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "width = (int) 32, " + "channels = (int) 1, " + "rate = (int) {32000, 48000}, " "endianness = (int) BYTE_ORDER")); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "width = (int) 32, " + "channels = (int) { 2, 3 }, " + "rate = (int) {32000, 48000}, " "endianness = (int) BYTE_ORDER")); + +#define CAPS_32khz \ + "audio/x-raw-float, " \ + "width = (int) 32, " \ + "channels = (int) 2, " \ + "rate = (int) 32000, " \ + "endianness = (int) BYTE_ORDER" + +#define CAPS_48khz \ + "audio/x-raw-float, " \ + "width = (int) 32, " \ + "channels = (int) 2, " \ + "rate = (int) 48000, " \ + "endianness = (int) BYTE_ORDER" + +#define CAPS_48khz_3CH \ + "audio/x-raw-float, " \ + "width = (int) 32, " \ + "channels = (int) 3, " \ + "rate = (int) 48000, " \ + "endianness = (int) BYTE_ORDER" + +static GstFlowReturn +deinterleave_chain_func (GstPad * pad, GstBuffer * buffer) +{ + gint i; + gfloat *indata; + + fail_unless (GST_IS_BUFFER (buffer)); + fail_unless_equals_int (GST_BUFFER_SIZE (buffer), 48000 * sizeof (gfloat)); + fail_unless (GST_BUFFER_DATA (buffer) != NULL); + + indata = (gfloat *) GST_BUFFER_DATA (buffer); + + if (strcmp (GST_PAD_NAME (pad), "sink0") == 0) { + for (i = 0; i < 48000; i++) + fail_unless_equals_float (indata[i], -1.0); + } else if (strcmp (GST_PAD_NAME (pad), "sink1") == 0) { + for (i = 0; i < 48000; i++) + fail_unless_equals_float (indata[i], 1.0); + } else { + g_assert_not_reached (); + } + + gst_buffer_unref (buffer); + + return GST_FLOW_OK; +} + +static void +deinterleave_pad_added (GstElement * src, GstPad * pad, gpointer data) +{ + gchar *name; + gint link = GPOINTER_TO_INT (data); + + if (nsinkpads >= link) + return; + + name = g_strdup_printf ("sink%d", nsinkpads); + + mysinkpads[nsinkpads] = + gst_pad_new_from_static_template (&sinktemplate, name); + g_free (name); + fail_if (mysinkpads[nsinkpads] == NULL); + + gst_pad_set_chain_function (mysinkpads[nsinkpads], deinterleave_chain_func); + fail_unless (gst_pad_link (pad, mysinkpads[nsinkpads]) == GST_PAD_LINK_OK); + gst_pad_set_active (mysinkpads[nsinkpads], TRUE); + nsinkpads++; +} + +GST_START_TEST (test_2_channels) +{ + GstPad *sinkpad; + gint i; + GstBuffer *inbuf; + GstCaps *caps; + gfloat *indata; + + mysinkpads = g_new0 (GstPad *, 2); + nsinkpads = 0; + + deinterleave = gst_element_factory_make ("deinterleave", NULL); + fail_unless (deinterleave != NULL); + + mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src"); + fail_unless (mysrcpad != NULL); + + caps = gst_caps_from_string (CAPS_48khz); + fail_unless (gst_pad_set_caps (mysrcpad, caps)); + gst_pad_use_fixed_caps (mysrcpad); + + sinkpad = gst_element_get_static_pad (deinterleave, "sink"); + fail_unless (sinkpad != NULL); + fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK); + g_object_unref (sinkpad); + + g_signal_connect (deinterleave, "pad-added", + G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (2)); + + bus = gst_bus_new (); + gst_element_set_bus (deinterleave, bus); + + fail_unless (gst_element_set_state (deinterleave, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); + + inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 2 * 48000; i += 2) { + indata[i] = -1.0; + indata[i + 1] = 1.0; + } + gst_buffer_set_caps (inbuf, caps); + + fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); + + fail_unless (gst_element_set_state (deinterleave, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); + + for (i = 0; i < nsinkpads; i++) + g_object_unref (mysinkpads[i]); + g_free (mysinkpads); + mysinkpads = NULL; + + g_object_unref (deinterleave); + g_object_unref (bus); + gst_caps_unref (caps); +} + +GST_END_TEST; + +GST_START_TEST (test_2_channels_1_linked) +{ + GstPad *sinkpad; + gint i; + GstBuffer *inbuf; + GstCaps *caps; + gfloat *indata; + + nsinkpads = 0; + mysinkpads = g_new0 (GstPad *, 2); + + deinterleave = gst_element_factory_make ("deinterleave", NULL); + fail_unless (deinterleave != NULL); + + mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src"); + fail_unless (mysrcpad != NULL); + + caps = gst_caps_from_string (CAPS_48khz); + fail_unless (gst_pad_set_caps (mysrcpad, caps)); + gst_pad_use_fixed_caps (mysrcpad); + + sinkpad = gst_element_get_static_pad (deinterleave, "sink"); + fail_unless (sinkpad != NULL); + fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK); + g_object_unref (sinkpad); + + g_signal_connect (deinterleave, "pad-added", + G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (1)); + + bus = gst_bus_new (); + gst_element_set_bus (deinterleave, bus); + + fail_unless (gst_element_set_state (deinterleave, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); + + inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 2 * 48000; i += 2) { + indata[i] = -1.0; + indata[i + 1] = 1.0; + } + gst_buffer_set_caps (inbuf, caps); + + fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); + + fail_unless (gst_element_set_state (deinterleave, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); + + for (i = 0; i < nsinkpads; i++) + g_object_unref (mysinkpads[i]); + g_free (mysinkpads); + mysinkpads = NULL; + + g_object_unref (deinterleave); + g_object_unref (bus); + gst_caps_unref (caps); +} + +GST_END_TEST; + +GST_START_TEST (test_2_channels_caps_change) +{ + GstPad *sinkpad; + GstCaps *caps, *caps2; + gint i; + GstBuffer *inbuf; + gfloat *indata; + + nsinkpads = 0; + mysinkpads = g_new0 (GstPad *, 2); + + deinterleave = gst_element_factory_make ("deinterleave", NULL); + fail_unless (deinterleave != NULL); + + mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src"); + fail_unless (mysrcpad != NULL); + + caps = gst_caps_from_string (CAPS_48khz); + fail_unless (gst_pad_set_caps (mysrcpad, caps)); + gst_pad_use_fixed_caps (mysrcpad); + + sinkpad = gst_element_get_static_pad (deinterleave, "sink"); + fail_unless (sinkpad != NULL); + fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK); + g_object_unref (sinkpad); + + g_signal_connect (deinterleave, "pad-added", + G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (2)); + + bus = gst_bus_new (); + gst_element_set_bus (deinterleave, bus); + + fail_unless (gst_element_set_state (deinterleave, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); + + inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 2 * 48000; i += 2) { + indata[i] = -1.0; + indata[i + 1] = 1.0; + } + gst_buffer_set_caps (inbuf, caps); + + fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); + + caps2 = gst_caps_from_string (CAPS_32khz); + gst_pad_set_caps (mysrcpad, caps2); + + inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 2 * 48000; i += 2) { + indata[i] = -1.0; + indata[i + 1] = 1.0; + } + gst_buffer_set_caps (inbuf, caps2); + + /* Should work fine because the caps changed in a compatible way */ + fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); + + gst_caps_unref (caps2); + + caps2 = gst_caps_from_string (CAPS_48khz_3CH); + gst_pad_set_caps (mysrcpad, caps2); + + inbuf = gst_buffer_new_and_alloc (3 * 48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 3 * 48000; i += 3) { + indata[i] = -1.0; + indata[i + 1] = 1.0; + indata[i + 2] = 0.0; + } + gst_buffer_set_caps (inbuf, caps2); + + /* Should break because the caps changed in an incompatible way */ + fail_if (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); + + fail_unless (gst_element_set_state (deinterleave, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); + + for (i = 0; i < nsinkpads; i++) + g_object_unref (mysinkpads[i]); + g_free (mysinkpads); + mysinkpads = NULL; + + g_object_unref (deinterleave); + g_object_unref (bus); + gst_caps_unref (caps); + gst_caps_unref (caps2); +} + +GST_END_TEST; + + +#define SAMPLES_PER_BUFFER 10 +#define NUM_CHANNELS 8 +#define SAMPLE_RATE 44100 + +static guint pads_created; + +static void +set_channel_positions (GstCaps * caps, int channels, + GstAudioChannelPosition * channelpositions) +{ + GValue chanpos = { 0 }; + GValue pos = { 0 }; + GstStructure *structure = gst_caps_get_structure (caps, 0); + int c; + + g_value_init (&chanpos, GST_TYPE_ARRAY); + g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION); + + for (c = 0; c < channels; c++) { + g_value_set_enum (&pos, channelpositions[c]); + gst_value_array_append_value (&chanpos, &pos); + } + g_value_unset (&pos); + + gst_structure_set_value (structure, "channel-positions", &chanpos); + g_value_unset (&chanpos); +} + +static void +src_handoff_float32_8ch (GstElement * src, GstBuffer * buf, GstPad * pad, + gpointer user_data) +{ + GstAudioChannelPosition layout[NUM_CHANNELS]; + GstCaps *caps; + gfloat *data; + guint size, i, c; + + caps = gst_caps_new_simple ("audio/x-raw-float", + "width", G_TYPE_INT, 32, + "depth", G_TYPE_INT, 32, + "channels", G_TYPE_INT, NUM_CHANNELS, + "rate", G_TYPE_INT, SAMPLE_RATE, + "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); + + for (i = 0; i < NUM_CHANNELS; ++i) + layout[i] = GST_AUDIO_CHANNEL_POSITION_NONE; + + set_channel_positions (caps, NUM_CHANNELS, layout); + + size = sizeof (gfloat) * SAMPLES_PER_BUFFER * NUM_CHANNELS; + data = (gfloat *) g_malloc (size); + + GST_BUFFER_MALLOCDATA (buf) = (guint8 *) data; + GST_BUFFER_DATA (buf) = (guint8 *) data; + GST_BUFFER_SIZE (buf) = size; + + GST_BUFFER_OFFSET (buf) = 0; + GST_BUFFER_TIMESTAMP (buf) = 0; + + GST_BUFFER_CAPS (buf) = caps; + + for (i = 0; i < SAMPLES_PER_BUFFER; ++i) { + for (c = 0; c < NUM_CHANNELS; ++c) { + *data = (gfloat) ((i * NUM_CHANNELS) + c); + ++data; + } + } +} + +static gboolean +float_buffer_check_probe (GstPad * pad, GstBuffer * buf, gpointer userdata) +{ + gfloat *data; + guint padnum, numpads; + guint num, i; + GstCaps *caps; + GstStructure *s; + GstAudioChannelPosition *pos; + gint channels; + + fail_unless_equals_int (sscanf (GST_PAD_NAME (pad), "src%u", &padnum), 1); + + numpads = pads_created; + + /* Check caps */ + caps = GST_BUFFER_CAPS (buf); + fail_unless (caps != NULL); + s = gst_caps_get_structure (caps, 0); + fail_unless (gst_structure_get_int (s, "channels", &channels)); + fail_unless_equals_int (channels, 1); + fail_unless (gst_structure_has_field (s, "channel-positions")); + pos = gst_audio_get_channel_positions (s); + fail_unless (pos != NULL && pos[0] == GST_AUDIO_CHANNEL_POSITION_NONE); + g_free (pos); + + data = (gfloat *) GST_BUFFER_DATA (buf); + num = GST_BUFFER_SIZE (buf) / sizeof (gfloat); + + /* Check buffer content */ + for (i = 0; i < num; ++i) { + guint val, rest; + + val = (guint) data[i]; + GST_LOG ("%s[%u]: %8f", GST_PAD_NAME (pad), i, data[i]); + /* can't use the modulo operator in the assertion statement, since due to + * the way it gets expanded it would be interpreted as a printf operator + * in the failure case, which will result in segfaults */ + rest = val % numpads; + /* check that the first channel is on pad src0, the second on src1 etc. */ + fail_unless_equals_int (rest, padnum); + } + + return TRUE; /* don't drop data */ +} + +static void +pad_added_setup_data_check_float32_8ch_cb (GstElement * deinterleave, + GstPad * pad, GstElement * pipeline) +{ + GstElement *queue, *sink; + GstPad *sinkpad; + + queue = gst_element_factory_make ("queue", NULL); + fail_unless (queue != NULL); + + sink = gst_element_factory_make ("fakesink", NULL); + fail_unless (sink != NULL); + + gst_bin_add_many (GST_BIN (pipeline), queue, sink, NULL); + fail_unless (gst_element_link_many (queue, sink, NULL)); + + sinkpad = gst_element_get_static_pad (queue, "sink"); + fail_unless_equals_int (gst_pad_link (pad, sinkpad), GST_PAD_LINK_OK); + gst_object_unref (sinkpad); + + gst_pad_add_buffer_probe (pad, G_CALLBACK (float_buffer_check_probe), NULL); + + gst_element_set_state (sink, GST_STATE_PLAYING); + gst_element_set_state (queue, GST_STATE_PLAYING); + + GST_LOG ("new pad: %s", GST_PAD_NAME (pad)); + ++pads_created; +} + +static GstElement * +make_fake_src_8chans_float32 (void) +{ + GstElement *src; + + src = gst_element_factory_make ("fakesrc", "src"); + fail_unless (src != NULL, "failed to create fakesrc element"); + + g_object_set (src, "num-buffers", 1, NULL); + g_object_set (src, "signal-handoffs", TRUE, NULL); + + g_signal_connect (src, "handoff", G_CALLBACK (src_handoff_float32_8ch), NULL); + + return src; +} + +GST_START_TEST (test_8_channels_float32) +{ + GstElement *pipeline, *src, *deinterleave; + GstMessage *msg; + + pipeline = (GstElement *) gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL, "failed to create pipeline"); + + src = make_fake_src_8chans_float32 (); + + deinterleave = gst_element_factory_make ("deinterleave", "deinterleave"); + fail_unless (deinterleave != NULL, "failed to create deinterleave element"); + g_object_set (deinterleave, "keep-positions", TRUE, NULL); + + gst_bin_add_many (GST_BIN (pipeline), src, deinterleave, NULL); + + fail_unless (gst_element_link (src, deinterleave), + "failed to link src <=> deinterleave"); + + g_signal_connect (deinterleave, "pad-added", + G_CALLBACK (pad_added_setup_data_check_float32_8ch_cb), pipeline); + + pads_created = 0; + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); + gst_message_unref (msg); + + fail_unless_equals_int (pads_created, NUM_CHANNELS); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); +} + +GST_END_TEST; + +static Suite * +deinterleave_suite (void) +{ + Suite *s = suite_create ("deinterleave"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_set_timeout (tc_chain, 180); + tcase_add_test (tc_chain, test_create_and_unref); + tcase_add_test (tc_chain, test_2_channels); + tcase_add_test (tc_chain, test_2_channels_1_linked); + tcase_add_test (tc_chain, test_2_channels_caps_change); + tcase_add_test (tc_chain, test_8_channels_float32); + + return s; +} + +GST_CHECK_MAIN (deinterleave); diff --git a/tests/check/elements/equalizer.c b/tests/check/elements/equalizer.c new file mode 100644 index 0000000..29b2e38 --- /dev/null +++ b/tests/check/elements/equalizer.c @@ -0,0 +1,327 @@ +/* GStreamer + * + * Copyright (C) 2008 Sebastian Dröge + * + * equalizer.c: Unit test for the equalizer element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include +#include + +#include + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define EQUALIZER_CAPS_STRING \ + "audio/x-raw-float, " \ + "channels = (int) 1, " \ + "rate = (int) 48000, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 64" \ + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 48000, " + "endianness = (int) BYTE_ORDER, " "width = (int) 64 ") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "channels = (int) 1, " + "rate = (int) 48000, " + "endianness = (int) BYTE_ORDER, " "width = (int) 64 ") + ); + +static GstElement * +setup_equalizer (void) +{ + GstElement *equalizer; + + GST_DEBUG ("setup_equalizer"); + equalizer = gst_check_setup_element ("equalizer-nbands"); + mysrcpad = gst_check_setup_src_pad (equalizer, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (equalizer, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return equalizer; +} + +static void +cleanup_equalizer (GstElement * equalizer) +{ + GST_DEBUG ("cleanup_equalizer"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (equalizer); + gst_check_teardown_sink_pad (equalizer); + gst_check_teardown_element (equalizer); +} + +GST_START_TEST (test_equalizer_5bands_passthrough) +{ + GstElement *equalizer; + GstBuffer *inbuffer; + GstCaps *caps; + gdouble *in, *res; + gint i; + + equalizer = setup_equalizer (); + g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); + + fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY + (equalizer)), 5); + + fail_unless (gst_element_set_state (equalizer, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = g_random_double_range (-1.0, 1.0); + + caps = gst_caps_from_string (EQUALIZER_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) == 1); + + res = (gdouble *) GST_BUFFER_DATA (GST_BUFFER (buffers->data)); + + for (i = 0; i < 1024; i++) + fail_unless_equals_float (in[i], res[i]); + + /* cleanup */ + cleanup_equalizer (equalizer); +} + +GST_END_TEST; + +GST_START_TEST (test_equalizer_5bands_minus_24) +{ + GstElement *equalizer; + GstBuffer *inbuffer; + GstCaps *caps; + gdouble *in, *res, rms_in, rms_out; + gint i; + + equalizer = setup_equalizer (); + g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); + + fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY + (equalizer)), 5); + + for (i = 0; i < 5; i++) { + GstObject *band = + gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); + fail_unless (band != NULL); + + g_object_set (G_OBJECT (band), "gain", -24.0, NULL); + g_object_unref (G_OBJECT (band)); + } + + fail_unless (gst_element_set_state (equalizer, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = g_random_double_range (-1.0, 1.0); + + rms_in = 0.0; + for (i = 0; i < 1024; i++) + rms_in += in[i] * in[i]; + rms_in = sqrt (rms_in / 1024); + + caps = gst_caps_from_string (EQUALIZER_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) == 1); + + res = (gdouble *) GST_BUFFER_DATA (GST_BUFFER (buffers->data)); + + rms_out = 0.0; + for (i = 0; i < 1024; i++) + rms_out += res[i] * res[i]; + rms_out = sqrt (rms_out / 1024); + + fail_unless (rms_in > rms_out); + + /* cleanup */ + cleanup_equalizer (equalizer); +} + +GST_END_TEST; + +GST_START_TEST (test_equalizer_5bands_plus_12) +{ + GstElement *equalizer; + GstBuffer *inbuffer; + GstCaps *caps; + gdouble *in, *res, rms_in, rms_out; + gint i; + + equalizer = setup_equalizer (); + g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); + + fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY + (equalizer)), 5); + + for (i = 0; i < 5; i++) { + GstObject *band = + gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); + fail_unless (band != NULL); + + g_object_set (G_OBJECT (band), "gain", 12.0, NULL); + g_object_unref (G_OBJECT (band)); + } + + fail_unless (gst_element_set_state (equalizer, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); + in = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (i = 0; i < 1024; i++) + in[i] = g_random_double_range (-1.0, 1.0); + + rms_in = 0.0; + for (i = 0; i < 1024; i++) + rms_in += in[i] * in[i]; + rms_in = sqrt (rms_in / 1024); + + caps = gst_caps_from_string (EQUALIZER_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + /* ... and puts a new buffer on the global list */ + fail_unless (g_list_length (buffers) == 1); + + res = (gdouble *) GST_BUFFER_DATA (GST_BUFFER (buffers->data)); + + rms_out = 0.0; + for (i = 0; i < 1024; i++) + rms_out += res[i] * res[i]; + rms_out = sqrt (rms_out / 1024); + + fail_unless (rms_in < rms_out); + + /* cleanup */ + cleanup_equalizer (equalizer); +} + +GST_END_TEST; + +GST_START_TEST (test_equalizer_band_number_changing) +{ + GstElement *equalizer; + gint i; + + equalizer = setup_equalizer (); + + g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); + fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY + (equalizer)), 5); + + for (i = 0; i < 5; i++) { + GstObject *band; + + band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); + fail_unless (band != NULL); + gst_object_unref (band); + } + + g_object_set (G_OBJECT (equalizer), "num-bands", 10, NULL); + fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY + (equalizer)), 10); + + for (i = 0; i < 10; i++) { + GstObject *band; + + band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); + fail_unless (band != NULL); + gst_object_unref (band); + } + + /* cleanup */ + cleanup_equalizer (equalizer); +} + +GST_END_TEST; + +static Suite * +equalizer_suite (void) +{ + Suite *s = suite_create ("equalizer"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_equalizer_5bands_passthrough); + tcase_add_test (tc_chain, test_equalizer_5bands_minus_24); + tcase_add_test (tc_chain, test_equalizer_5bands_plus_12); + tcase_add_test (tc_chain, test_equalizer_band_number_changing); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = equalizer_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/flacparse.c b/tests/check/elements/flacparse.c new file mode 100644 index 0000000..ebff9b4 --- /dev/null +++ b/tests/check/elements/flacparse.c @@ -0,0 +1,319 @@ +/* + * GStreamer + * + * unit test for flacparse + * + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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 +#include "parser.h" + +#define SRC_CAPS_TMPL "audio/x-flac, framed=(boolean)false" +#define SINK_CAPS_TMPL "audio/x-flac, framed=(boolean)true" + +GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS_TMPL) + ); + +GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS_TMPL) + ); + +/* some data */ +static guint8 streaminfo_header[] = { + 0x7f, 0x46, 0x4c, 0x41, 0x43, 0x01, 0x00, 0x00, + 0x02, 0x66, 0x4c, 0x61, 0x43, 0x00, 0x00, 0x00, + 0x22, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0xc4, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; + +static guint8 comment_header[] = { + 0x84, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +static guint8 flac_frame[] = { + 0xff, 0xf8, 0xa9, 0x08, 0x00, 0x50, 0x18, 0x06, + 0x6a, 0x0c, 0xce, 0x13, 0x24, 0x19, 0x68, 0x00, + 0x46, 0x23, 0x08, 0xca, 0xcb, 0x58, 0x9c, 0x26, + 0x92, 0x30, 0xa6, 0x29, 0x8a, 0xca, 0xd1, 0x18, + 0xae, 0x26, 0x5c, 0x90, 0x60, 0xbf, 0x11, 0xad, + 0x43, 0x02, 0x06, 0x26, 0xbd, 0x35, 0xdd, 0xa3, + 0x11, 0xa6, 0x4d, 0x18, 0x8c, 0x9a, 0xe4, 0x62, + 0xd9, 0x23, 0x11, 0x8b, 0xcb, 0x56, 0x55, 0x45, + 0xc2, 0x18, 0x56, 0xa2, 0xe2, 0xe1, 0x18, 0x99, + 0x54, 0x98, 0x46, 0x4d, 0x08, 0x70, 0x9a, 0x64, + 0xc4, 0x18, 0x4f, 0x27, 0x64, 0x31, 0x66, 0x27, + 0x79, 0x19, 0x3c, 0x8c, 0x8c, 0xa3, 0x44, 0x18, + 0x23, 0xd2, 0x6b, 0x8b, 0x64, 0x8c, 0x21, 0x84, + 0xd6, 0x23, 0x13, 0x13, 0x2d, 0x44, 0xca, 0x5a, + 0x23, 0x09, 0x93, 0x25, 0x18, 0x10, 0x61, 0x38, + 0xb4, 0x60, 0x8f, 0x2c, 0x8d, 0x26, 0xb4, 0xc9, + 0xd9, 0x19, 0x19, 0x34, 0xd7, 0x31, 0x06, 0x10, + 0xc4, 0x30, 0x83, 0x17, 0xe2, 0x0c, 0x2c, 0xc4, + 0xc8, 0xc9, 0x3c, 0x5e, 0x93, 0x11, 0x8a, 0x62, + 0x64, 0x8c, 0x26, 0x23, 0x22, 0x30, 0x9a, 0x58, + 0x86, 0x04, 0x18, 0x4c, 0xab, 0x2b, 0x26, 0x5c, + 0x46, 0x88, 0xcb, 0xb1, 0x0d, 0x26, 0xbb, 0x5e, + 0x8c, 0xa7, 0x64, 0x31, 0x3d, 0x31, 0x06, 0x26, + 0x43, 0x17, 0xa3, 0x08, 0x61, 0x06, 0x17, 0xc4, + 0x62, 0xec, 0x4d, 0x4b, 0x2e, 0x2d, 0x4a, 0x94, + 0xa4, 0xc2, 0x31, 0x4c, 0x4c, 0x20, 0xc0, 0x83, + 0x14, 0x8c, 0x27, 0x8b, 0x31, 0x23, 0x2f, 0x23, + 0x11, 0x91, 0x94, 0x65, 0x1a, 0x20, 0xc2, 0x18, + 0x86, 0x51, 0x88, 0x62, 0x7c, 0x43, 0x2e, 0xa3, + 0x04, 0x18, 0x8c, 0x20, 0xc2, 0xf5, 0xaa, 0x94, + 0xc2, 0x31, 0x32, 0xd2, 0xb2, 0xa2, 0x30, 0xba, + 0x10, 0xc2, 0xb5, 0x89, 0xa5, 0x18, 0x10, 0x62, + 0x9a, 0x10, 0x61, 0x19, 0x72, 0x71, 0x1a, 0xb9, + 0x0c, 0x23, 0x46, 0x10, 0x62, 0x78, 0x81, 0x82, + 0x3d, 0x75, 0xea, 0x6b, 0x51, 0x8b, 0x61, 0x06, + 0x08, 0x62, 0x32, 0x5e, 0x84, 0x18, 0x27, 0x25, + 0xc2, 0x6a, 0x4b, 0x51, 0x31, 0x34, 0x5e, 0x29, + 0xa1, 0x3c, 0x4d, 0x26, 0x23, 0x10, 0xc2, 0x6b, + 0xb1, 0x0d, 0x11, 0xae, 0x46, 0x88, 0x31, 0x35, + 0xb1, 0x06, 0x08, 0x79, 0x7e, 0x4f, 0x53, 0x23, + 0x29, 0xa4, 0x30, 0x20, 0x30, 0x23, 0x5a, 0xb2, + 0xc8, 0x60, 0x9c, 0x93, 0x13, 0x17, 0x92, 0x98, + 0x46, 0x13, 0x54, 0x53, 0x08, 0xcb, 0x13, 0xa1, + 0x1a, 0x89, 0xe5, 0x46, 0x08, 0x18, 0x10, 0x30, + 0x9d, 0x68, 0xc2, 0x1c, 0x46, 0x46, 0xae, 0x62, + 0x1a, 0x46, 0x4e, 0x4d, 0x34, 0x8c, 0xbd, 0x26, + 0xc0, 0x40, 0x62, 0xc9, 0xa9, 0x31, 0x74, 0xa8, + 0x99, 0x52, 0xb0, 0x8c, 0xa9, 0x29, 0x84, 0x61, + 0x19, 0x54, 0x43, 0x02, 0x06, 0x04, 0x32, 0xe5, + 0x18, 0x21, 0x91, 0x8b, 0xf2, 0xcc, 0x10, 0x30, + 0x8e, 0x23, 0xc4, 0x76, 0x43, 0x08, 0x30, 0x83, + 0x08, 0x62, 0x6c, 0x4e, 0xe2, 0x35, 0x96, 0xd0, + 0x8e, 0x89, 0x97, 0x42, 0x18, 0x91, 0x84, 0x61, + 0x3c, 0x26, 0xa5, 0x2c, 0x4e, 0x17, 0x94, 0xb8, + 0xb5, 0xa4, 0xcb, 0x88, 0xc9, 0x84, 0x18, 0xb9, + 0x84, 0x19, 0x23, 0x2d, 0xa4, 0x64, 0x62, 0x18, + 0x86, 0x53, 0x93, 0xcb, 0x30, 0x8f, 0x2f, 0x93, + 0x55, 0xc4, 0xd7, 0x08, 0x62, 0xb8, 0x46, 0x84, + 0x68, 0xa3, 0x02, 0xaf, 0x33 +}; + +static guint8 garbage_frame[] = { + 0xff, 0xff, 0xff, 0xff, 0xff +}; + + +GST_START_TEST (test_parse_flac_normal) +{ + gst_parser_test_normal (flac_frame, sizeof (flac_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_flac_drain_single) +{ + gst_parser_test_drain_single (flac_frame, sizeof (flac_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_flac_drain_garbage) +{ + /* We always output the after frame garbage too because we + * have no way of detecting it + */ +#if 0 + gst_parser_test_drain_garbage (flac_frame, sizeof (flac_frame), + garbage_frame, sizeof (garbage_frame)); +#endif + guint8 frame[sizeof (flac_frame) + sizeof (garbage_frame)]; + + memcpy (frame, flac_frame, sizeof (flac_frame)); + memcpy (frame + sizeof (flac_frame), garbage_frame, sizeof (garbage_frame)); + + gst_parser_test_drain_single (frame, sizeof (frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_flac_split) +{ + gst_parser_test_split (flac_frame, sizeof (flac_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_flac_skip_garbage) +{ + /* We always include the garbage into the frame because + * we have no easy way for finding the real end of the + * frame. The decoder will later skip the garbage + */ +#if 0 + gst_parser_test_skip_garbage (flac_frame, sizeof (flac_frame), + garbage_frame, sizeof (garbage_frame)); +#endif + guint8 frame[sizeof (flac_frame) + sizeof (garbage_frame)]; + + memcpy (frame, flac_frame, sizeof (flac_frame)); + memcpy (frame + sizeof (flac_frame), garbage_frame, sizeof (garbage_frame)); + + gst_parser_test_normal (frame, sizeof (frame)); +} + +GST_END_TEST; + + +#define structure_get_int(s,f) \ + (g_value_get_int(gst_structure_get_value(s,f))) +#define fail_unless_structure_field_int_equals(s,field,num) \ + fail_unless_equals_int (structure_get_int(s,field), num) +/* + * Test if the parser handles raw stream and codec_data info properly. + */ +GST_START_TEST (test_parse_flac_detect_stream) +{ + GstCaps *caps; + GstStructure *s; + const GValue *streamheader; + GArray *bufarr; + gint i; + + /* Push random data. It should get through since the parser should be + * initialized because it got codec_data in the caps */ + caps = gst_parser_test_get_output_caps (flac_frame, sizeof (flac_frame), + SRC_CAPS_TMPL); + fail_unless (caps != NULL); + + /* Check that the negotiated caps are as expected */ + /* When codec_data is present, parser assumes that data is version 4 */ + GST_LOG ("flac output caps: %" GST_PTR_FORMAT, caps); + s = gst_caps_get_structure (caps, 0); + fail_unless (gst_structure_has_name (s, "audio/x-flac")); + fail_unless_structure_field_int_equals (s, "channels", 1); + fail_unless_structure_field_int_equals (s, "rate", 44100); + fail_unless (gst_structure_has_field (s, "streamheader")); + streamheader = gst_structure_get_value (s, "streamheader"); + fail_unless (G_VALUE_TYPE (streamheader) == GST_TYPE_ARRAY); + bufarr = g_value_peek_pointer (streamheader); + fail_unless (bufarr->len == 2); + for (i = 0; i < bufarr->len; i++) { + GstBuffer *buf; + GValue *bufval = &g_array_index (bufarr, GValue, i); + + fail_unless (G_VALUE_TYPE (bufval) == GST_TYPE_BUFFER); + buf = g_value_peek_pointer (bufval); + if (i == 0) { + fail_unless (GST_BUFFER_SIZE (buf) == sizeof (streaminfo_header)); + fail_unless (memcmp (GST_BUFFER_DATA (buf), streaminfo_header, + sizeof (streaminfo_header)) == 0); + } else if (i == 1) { + fail_unless (GST_BUFFER_SIZE (buf) == sizeof (comment_header)); + fail_unless (memcmp (GST_BUFFER_DATA (buf), comment_header, + sizeof (comment_header)) == 0); + } + } + + gst_caps_unref (caps); +} + +GST_END_TEST; + +GST_START_TEST (test_parse_flac_set_index) +{ + GstElement *parse; + GstIndex *idx; + + idx = gst_index_factory_make ("memindex"); + if (idx == NULL) + return; + parse = gst_element_factory_make ("flacparse", NULL); + fail_unless (parse != NULL); + gst_object_ref_sink (idx); + gst_element_set_index (parse, GST_INDEX (idx)); + gst_object_unref (idx); + gst_object_unref (parse); +} + +GST_END_TEST; + +static Suite * +flacparse_suite (void) +{ + Suite *s = suite_create ("flacparse"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_parse_flac_normal); + tcase_add_test (tc_chain, test_parse_flac_drain_single); + tcase_add_test (tc_chain, test_parse_flac_drain_garbage); + tcase_add_test (tc_chain, test_parse_flac_split); + tcase_add_test (tc_chain, test_parse_flac_skip_garbage); + + /* Other tests */ + tcase_add_test (tc_chain, test_parse_flac_detect_stream); + tcase_add_test (tc_chain, test_parse_flac_set_index); + + return s; +} + + +/* + * TODO: + * - Both push- and pull-modes need to be tested + * * Pull-mode & EOS + */ + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = flacparse_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + /* init test context */ + ctx_factory = "flacparse"; + ctx_sink_template = &sinktemplate; + ctx_src_template = &srctemplate; + ctx_discard = 3; + ctx_headers[0].data = streaminfo_header; + ctx_headers[0].size = sizeof (streaminfo_header); + ctx_headers[1].data = comment_header; + ctx_headers[1].size = sizeof (comment_header); + /* custom offsets, and ts always repeatedly 0 */ + ctx_no_metadata = TRUE; + + srunner_run_all (sr, CK_NORMAL); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + + return nf; +} diff --git a/tests/check/elements/flvdemux.c b/tests/check/elements/flvdemux.c new file mode 100644 index 0000000..2fe8ab3 --- /dev/null +++ b/tests/check/elements/flvdemux.c @@ -0,0 +1,184 @@ +/* GStreamer unit tests for flvdemux + * + * Copyright (C) 2009 Tim-Philipp Müller + * + * 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 + +#include + +static void +pad_added_cb (GstElement * flvdemux, GstPad * pad, GstBin * pipeline) +{ + GstElement *sink; + + sink = gst_bin_get_by_name (pipeline, "fakesink"); + fail_unless (gst_element_link (flvdemux, sink)); + gst_object_unref (sink); + + gst_element_set_state (sink, GST_STATE_PAUSED); +} + +static GstBusSyncReply +error_cb (GstBus * bus, GstMessage * msg, gpointer user_data) +{ + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + const gchar *file = (const gchar *) user_data; + GError *err = NULL; + gchar *dbg = NULL; + + gst_message_parse_error (msg, &err, &dbg); + g_error ("ERROR for %s: %s\n%s\n", file, err->message, dbg); + } + + return GST_BUS_PASS; +} + +static void +handoff_cb (GstElement * element, GstBuffer * buf, GstPad * pad, + gint * p_counter) +{ + *p_counter += 1; + GST_LOG ("counter = %d", *p_counter); + + fail_unless (GST_BUFFER_CAPS (buf) != NULL); +} + +static void +process_file (const gchar * file, gboolean push_mode, gint repeat, + gint num_buffers) +{ + GstElement *src, *sep, *sink, *flvdemux, *pipeline; + GstBus *bus; + gchar *path; + gint counter; + + pipeline = gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL, "Failed to create pipeline!"); + + bus = gst_element_get_bus (pipeline); + + /* kids, don't use a sync handler for this at home, really; we do because + * we just want to abort and nothing else */ + gst_bus_set_sync_handler (bus, error_cb, (gpointer) file); + + src = gst_element_factory_make ("filesrc", "filesrc"); + fail_unless (src != NULL, "Failed to create 'filesrc' element!"); + + if (push_mode) { + sep = gst_element_factory_make ("queue", "queue"); + fail_unless (sep != NULL, "Failed to create 'queue' element"); + } else { + sep = gst_element_factory_make ("identity", "identity"); + fail_unless (sep != NULL, "Failed to create 'identity' element"); + } + + flvdemux = gst_element_factory_make ("flvdemux", "flvdemux"); + fail_unless (flvdemux != NULL, "Failed to create 'flvdemux' element!"); + + sink = gst_element_factory_make ("fakesink", "fakesink"); + fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); + + g_object_set (sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "handoff", G_CALLBACK (handoff_cb), &counter); + + gst_bin_add_many (GST_BIN (pipeline), src, sep, flvdemux, sink, NULL); + + fail_unless (gst_element_link (src, sep)); + fail_unless (gst_element_link (sep, flvdemux)); + + /* can't link flvdemux and sink yet, do that later */ + g_signal_connect (flvdemux, "pad-added", G_CALLBACK (pad_added_cb), pipeline); + + path = g_build_filename (GST_TEST_FILES_PATH, file, NULL); + GST_LOG ("processing file '%s'", path); + g_object_set (src, "location", path, NULL); + + do { + GstStateChangeReturn state_ret; + GstMessage *msg; + + GST_LOG ("repeat=%d", repeat); + + counter = 0; + + state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + if (state_ret == GST_STATE_CHANGE_ASYNC) { + GST_LOG ("waiting for pipeline to reach PAUSED state"); + state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); + fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); + } + + GST_LOG ("PAUSED, let's read all of it"); + + state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + msg = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); + fail_unless (msg != NULL, "Expected EOS message on bus! (%s)", file); + + gst_message_unref (msg); + + if (num_buffers >= 0) { + fail_unless_equals_int (counter, num_buffers); + } + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), + GST_STATE_CHANGE_SUCCESS); + + --repeat; + } while (repeat > 0); + + gst_object_unref (bus); + gst_object_unref (pipeline); + + g_free (path); +} + +GST_START_TEST (test_reuse_pull) +{ + process_file ("pcm16sine.flv", FALSE, 3, 129); + gst_task_cleanup_all (); +} + +GST_END_TEST; + +GST_START_TEST (test_reuse_push) +{ + process_file ("pcm16sine.flv", TRUE, 3, 129); + gst_task_cleanup_all (); +} + +GST_END_TEST; + +static Suite * +flvdemux_suite (void) +{ + Suite *s = suite_create ("flvdemux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_reuse_push); + tcase_add_test (tc_chain, test_reuse_pull); + + return s; +} + +GST_CHECK_MAIN (flvdemux) diff --git a/tests/check/elements/flvmux.c b/tests/check/elements/flvmux.c new file mode 100644 index 0000000..fe10282 --- /dev/null +++ b/tests/check/elements/flvmux.c @@ -0,0 +1,161 @@ +/* GStreamer unit tests for flvmux + * + * Copyright (C) 2009 Tim-Philipp Müller + * + * 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 + +#include + +static GstBusSyncReply +error_cb (GstBus * bus, GstMessage * msg, gpointer user_data) +{ + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + GError *err = NULL; + gchar *dbg = NULL; + + gst_message_parse_error (msg, &err, &dbg); + g_error ("ERROR: %s\n%s\n", err->message, dbg); + } + + return GST_BUS_PASS; +} + +static void +handoff_cb (GstElement * element, GstBuffer * buf, GstPad * pad, + gint * p_counter) +{ + *p_counter += 1; + GST_LOG ("counter = %d", *p_counter); + + fail_unless (GST_BUFFER_CAPS (buf) != NULL); +} + +static void +mux_pcm_audio (guint num_buffers, guint repeat) +{ + GstElement *src, *sink, *flvmux, *conv, *pipeline; + GstPad *sinkpad, *srcpad; + gint counter; + + GST_LOG ("num_buffers = %u", num_buffers); + + pipeline = gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL, "Failed to create pipeline!"); + + /* kids, don't use a sync handler for this at home, really; we do because + * we just want to abort and nothing else */ + gst_bus_set_sync_handler (GST_ELEMENT_BUS (pipeline), error_cb, NULL); + + src = gst_element_factory_make ("audiotestsrc", "audiotestsrc"); + fail_unless (src != NULL, "Failed to create 'audiotestsrc' element!"); + + g_object_set (src, "num-buffers", num_buffers, NULL); + + conv = gst_element_factory_make ("audioconvert", "audioconvert"); + fail_unless (conv != NULL, "Failed to create 'audioconvert' element!"); + + flvmux = gst_element_factory_make ("flvmux", "flvmux"); + fail_unless (flvmux != NULL, "Failed to create 'flvmux' element!"); + + sink = gst_element_factory_make ("fakesink", "fakesink"); + fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); + + g_object_set (sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "handoff", G_CALLBACK (handoff_cb), &counter); + + gst_bin_add_many (GST_BIN (pipeline), src, conv, flvmux, sink, NULL); + + fail_unless (gst_element_link (src, conv)); + fail_unless (gst_element_link (flvmux, sink)); + + /* now link the elements */ + sinkpad = gst_element_get_request_pad (flvmux, "audio"); + fail_unless (sinkpad != NULL, "Could not get audio request pad"); + + srcpad = gst_element_get_static_pad (conv, "src"); + fail_unless (srcpad != NULL, "Could not get audioconvert's source pad"); + + fail_unless_equals_int (gst_pad_link (srcpad, sinkpad), GST_PAD_LINK_OK); + + gst_object_unref (srcpad); + gst_object_unref (sinkpad); + + do { + GstStateChangeReturn state_ret; + GstMessage *msg; + + GST_LOG ("repeat=%d", repeat); + + counter = 0; + + state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + if (state_ret == GST_STATE_CHANGE_ASYNC) { + GST_LOG ("waiting for pipeline to reach PAUSED state"); + state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); + fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); + } + + GST_LOG ("PAUSED, let's do the rest of it"); + + state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); + fail_unless (msg != NULL, "Expected EOS message on bus!"); + + GST_LOG ("EOS"); + gst_message_unref (msg); + + /* should have some output */ + fail_unless (counter > 2); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), + GST_STATE_CHANGE_SUCCESS); + + /* repeat = test re-usability */ + --repeat; + } while (repeat > 0); + + gst_object_unref (pipeline); +} + +GST_START_TEST (test_index_writing) +{ + /* note: there's a magic 128 value in flvmux when doing index writing */ + if ((__i__ % 33) == 1) + mux_pcm_audio (__i__, 2); +} + +GST_END_TEST; + +static Suite * +flvmux_suite (void) +{ + Suite *s = suite_create ("flvmux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_loop_test (tc_chain, test_index_writing, 1, 499); + + return s; +} + +GST_CHECK_MAIN (flvmux) diff --git a/tests/check/elements/gdkpixbufsink.c b/tests/check/elements/gdkpixbufsink.c new file mode 100644 index 0000000..242cf85 --- /dev/null +++ b/tests/check/elements/gdkpixbufsink.c @@ -0,0 +1,291 @@ +/* GStreamer unit test for the gdkpixbufsink element + * Copyright (C) 2008 Tim-Philipp Müller + * + * 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 +#include + +#include + +#define WxH ",width=(int)319,height=(int)241" + +#define N_BUFFERS 5 + +typedef struct +{ + GstElement *pipe; + GstElement *src; + GstElement *filter; + GstElement *sink; +} GstGdkPixbufSinkTestContext; + +static void +gdkpixbufsink_init_test_context (GstGdkPixbufSinkTestContext * ctx, + const gchar * filter_caps_string, gint num_buffers) +{ + GstCaps *caps; + + fail_unless (ctx != NULL); + + ctx->pipe = gst_pipeline_new ("pipeline"); + fail_unless (ctx->pipe != NULL); + ctx->src = gst_element_factory_make ("videotestsrc", "src"); + fail_unless (ctx->src != NULL, "Failed to create videotestsrc element"); + ctx->filter = gst_element_factory_make ("capsfilter", "filter"); + fail_unless (ctx->filter != NULL, "Failed to create capsfilter element"); + ctx->sink = gst_element_factory_make ("gdkpixbufsink", "sink"); + fail_unless (ctx->sink != NULL, "Failed to create gdkpixbufsink element"); + + caps = gst_caps_from_string (filter_caps_string); + fail_unless (caps != NULL); + g_object_set (ctx->filter, "caps", caps, NULL); + gst_caps_unref (caps); + + if (num_buffers > 0) + g_object_set (ctx->src, "num-buffers", num_buffers, NULL); + + fail_unless (gst_bin_add (GST_BIN (ctx->pipe), ctx->src)); + fail_unless (gst_bin_add (GST_BIN (ctx->pipe), ctx->filter)); + fail_unless (gst_bin_add (GST_BIN (ctx->pipe), ctx->sink)); + fail_unless (gst_element_link (ctx->src, ctx->filter)); + fail_unless (gst_element_link (ctx->filter, ctx->sink)); +} + +static void +gdkpixbufsink_unset_test_context (GstGdkPixbufSinkTestContext * ctx) +{ + gst_element_set_state (ctx->pipe, GST_STATE_NULL); + gst_object_unref (ctx->pipe); + memset (ctx, 0, sizeof (GstGdkPixbufSinkTestContext)); +} + +static gboolean +check_last_pixbuf (GstGdkPixbufSinkTestContext * ctx, gpointer pixbuf) +{ + gpointer last_pb = NULL; + gboolean ret; + + g_object_get (ctx->sink, "last-pixbuf", &last_pb, NULL); + + ret = (last_pb == pixbuf); + + if (last_pb) + g_object_unref (last_pb); + + return ret; +} + +/* doesn't return a ref to the pixbuf */ +static GdkPixbuf * +check_message_pixbuf (GstMessage * msg, const gchar * name, gint channels, + gboolean has_alpha) +{ + GdkPixbuf *pixbuf; + GstStructure *s; + + fail_unless (msg->structure != NULL); + + s = msg->structure; + fail_unless_equals_string (gst_structure_get_name (s), name); + + fail_unless (gst_structure_has_field (s, "pixbuf")); + fail_unless (gst_structure_has_field_typed (s, "pixel-aspect-ratio", + GST_TYPE_FRACTION)); + pixbuf = + GDK_PIXBUF (g_value_get_object (gst_structure_get_value (s, "pixbuf"))); + fail_unless (GDK_IS_PIXBUF (pixbuf)); + fail_unless_equals_int (gdk_pixbuf_get_n_channels (pixbuf), channels); + fail_unless_equals_int (gdk_pixbuf_get_has_alpha (pixbuf), has_alpha); + fail_unless_equals_int (gdk_pixbuf_get_width (pixbuf), 319); + fail_unless_equals_int (gdk_pixbuf_get_height (pixbuf), 241); + + return pixbuf; +} + +GST_START_TEST (test_rgb) +{ + GstGdkPixbufSinkTestContext ctx; + GstMessage *msg; + GdkPixbuf *pixbuf; + GstBus *bus; + gint i; + + gdkpixbufsink_init_test_context (&ctx, GST_VIDEO_CAPS_RGB WxH, N_BUFFERS); + + fail_unless (check_last_pixbuf (&ctx, NULL)); + + /* start prerolling */ + fail_unless_equals_int (gst_element_set_state (ctx.pipe, GST_STATE_PAUSED), + GST_STATE_CHANGE_ASYNC); + + /* wait until prerolled */ + fail_unless_equals_int (gst_element_get_state (ctx.pipe, NULL, NULL, -1), + GST_STATE_CHANGE_SUCCESS); + + bus = gst_element_get_bus (ctx.pipe); + + /* find element message from our gdkpixbufsink, ignore element messages from + * other elemements (which just seems prudent to do, we don't expect any) */ + while (1) { + msg = gst_bus_pop_filtered (bus, GST_MESSAGE_ELEMENT); + fail_if (msg == NULL, "Expected element message from gdkpixbufsink"); + + if (msg->src == GST_OBJECT (ctx.sink)) + break; + } + + pixbuf = check_message_pixbuf (msg, "preroll-pixbuf", 3, FALSE); + fail_unless (check_last_pixbuf (&ctx, pixbuf)); + gst_message_unref (msg); + pixbuf = NULL; + + /* and go! */ + fail_unless_equals_int (gst_element_set_state (ctx.pipe, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + /* This is racy, supposed to make sure locking and refcounting works at + * least to some extent */ + for (i = 0; i < 10000; ++i) { + gpointer obj = NULL; + + g_object_get (ctx.sink, "last-pixbuf", &obj, NULL); + fail_unless (obj == NULL || GDK_IS_PIXBUF (obj)); + if (obj) + g_object_unref (obj); + } + + /* there should be as many pixbuf messages as buffers */ + for (i = 0; i < N_BUFFERS; ++i) { + /* find element message from our gdkpixbufsink, ignore element messages from + * other elemements (which just seems prudent to do, we don't expect any) */ + while (1) { + msg = gst_bus_timed_pop_filtered (bus, -1, GST_MESSAGE_ELEMENT); + fail_if (msg == NULL, "Expected element message from gdkpixbufsink"); + if (msg->src == GST_OBJECT (ctx.sink)) + break; + } + + pixbuf = check_message_pixbuf (msg, "pixbuf", 3, FALSE); + gst_message_unref (msg); + } + + /* note: we don't hold a ref to pixbuf any longer here, but it should be ok */ + fail_unless (check_last_pixbuf (&ctx, pixbuf)); + pixbuf = NULL; + + gdkpixbufsink_unset_test_context (&ctx); + gst_object_unref (bus); +} + +GST_END_TEST; + +GST_START_TEST (test_rgba) +{ + GstGdkPixbufSinkTestContext ctx; + GstMessage *msg; + GdkPixbuf *pixbuf; + GstBus *bus; + gint i; + + gdkpixbufsink_init_test_context (&ctx, GST_VIDEO_CAPS_RGBA WxH, N_BUFFERS); + + fail_unless (check_last_pixbuf (&ctx, NULL)); + + /* start prerolling */ + fail_unless_equals_int (gst_element_set_state (ctx.pipe, GST_STATE_PAUSED), + GST_STATE_CHANGE_ASYNC); + + /* wait until prerolled */ + fail_unless_equals_int (gst_element_get_state (ctx.pipe, NULL, NULL, -1), + GST_STATE_CHANGE_SUCCESS); + + bus = gst_element_get_bus (ctx.pipe); + + /* find element message from our gdkpixbufsink, ignore element messages from + * other elemements (which just seems prudent to do, we don't expect any) */ + while (1) { + msg = gst_bus_pop_filtered (bus, GST_MESSAGE_ELEMENT); + fail_if (msg == NULL, "Expected element message from gdkpixbufsink"); + + if (msg->src == GST_OBJECT (ctx.sink)) + break; + } + + pixbuf = check_message_pixbuf (msg, "preroll-pixbuf", 4, TRUE); + fail_unless (check_last_pixbuf (&ctx, pixbuf)); + gst_message_unref (msg); + pixbuf = NULL; + + /* and go! */ + fail_unless_equals_int (gst_element_set_state (ctx.pipe, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + /* This is racy, supposed to make sure locking and refcounting works at + * least to some extent */ + for (i = 0; i < 10000; ++i) { + gpointer obj = NULL; + + g_object_get (ctx.sink, "last-pixbuf", &obj, NULL); + fail_unless (obj == NULL || GDK_IS_PIXBUF (obj)); + if (obj) + g_object_unref (obj); + } + + /* there should be as many pixbuf messages as buffers */ + for (i = 0; i < N_BUFFERS; ++i) { + /* find element message from our gdkpixbufsink, ignore element messages from + * other elemements (which just seems prudent to do, we don't expect any) */ + while (1) { + msg = gst_bus_timed_pop_filtered (bus, -1, GST_MESSAGE_ELEMENT); + fail_if (msg == NULL, "Expected element message from gdkpixbufsink"); + if (msg->src == GST_OBJECT (ctx.sink)) + break; + } + + pixbuf = check_message_pixbuf (msg, "pixbuf", 4, TRUE); + gst_message_unref (msg); + } + + /* note: we don't hold a ref to pixbuf any longer here, but it should be ok */ + fail_unless (check_last_pixbuf (&ctx, pixbuf)); + pixbuf = NULL; + + gdkpixbufsink_unset_test_context (&ctx); + gst_object_unref (bus); +} + +GST_END_TEST; + +static Suite * +gdkpixbufsink_suite (void) +{ + Suite *s = suite_create ("gdkpixbufsink"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_rgb); + tcase_add_test (tc_chain, test_rgba); + + return s; +} + +GST_CHECK_MAIN (gdkpixbufsink); diff --git a/tests/check/elements/icydemux.c b/tests/check/elements/icydemux.c new file mode 100644 index 0000000..e1686c8 --- /dev/null +++ b/tests/check/elements/icydemux.c @@ -0,0 +1,272 @@ +/* + * icydemux.c - Test icydemux element + * Copyright (C) 2006 Michael Smith + * + * 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 + +/* Chunk of data: 8 bytes, followed by a metadata-length byte of 2, followed by + * some metadata (32 bytes), then some more data. + */ +#define TEST_METADATA \ + "Test metadata" +#define ICY_METADATA \ + "StreamTitle='" TEST_METADATA "';\0\0\0\0" + +#define ICY_DATA \ + "aaaaaaaa" \ + "\x02" \ + ICY_METADATA \ + "bbbbbbbb" + +#define ICYCAPS "application/x-icy, metadata-interval = (int)8" + +#define SRC_CAPS "application/x-icy, metadata-interval = (int)[0, MAX]" +#define SINK_CAPS "ANY" + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS) + ); + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS) + ); + +static GstElement *icydemux; +static GstBus *bus; +GstPad *srcpad, *sinkpad; + +static GstStaticCaps typefind_caps = +GST_STATIC_CAPS ("application/octet-stream"); + +static gboolean fake_typefind_caps; /* FALSE */ + +static void +typefind_succeed (GstTypeFind * tf, gpointer private) +{ + if (fake_typefind_caps) { + gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, + gst_static_caps_get (&typefind_caps)); + } +} + +static void +icydemux_found_pad (GstElement * src, GstPad * pad, gpointer data) +{ + GST_DEBUG ("got new pad %" GST_PTR_FORMAT, pad); + + /* Turns out that this asserts a refcount which is wrong for this + * case (adding the pad from a pad-added callback), so just do the same + * thing inline... */ + /* sinkpad = gst_check_setup_sink_pad (icydemux, &sinktemplate, NULL); */ + sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); + fail_if (sinkpad == NULL, "Couldn't create sinkpad"); + srcpad = gst_element_get_static_pad (icydemux, "src"); + fail_if (srcpad == NULL, "Failed to get srcpad from icydemux"); + gst_pad_set_chain_function (sinkpad, gst_check_chain_func); + + GST_DEBUG ("checking srcpad %p refcount", srcpad); + /* 1 from element, 1 from signal, 1 from us */ + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 3); + + GST_DEBUG ("linking srcpad"); + fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, + "Failed to link pads"); + gst_object_unref (srcpad); + + gst_pad_set_active (sinkpad, TRUE); +} + +static GstElement * +create_icydemux (void) +{ + icydemux = gst_check_setup_element ("icydemux"); + srcpad = gst_check_setup_src_pad (icydemux, &srctemplate, NULL); + + g_signal_connect (icydemux, "pad-added", G_CALLBACK (icydemux_found_pad), + NULL); + + bus = gst_bus_new (); + gst_element_set_bus (icydemux, bus); + + fail_unless (gst_element_set_state (icydemux, GST_STATE_PLAYING) != + GST_STATE_CHANGE_FAILURE, "could not set to playing"); + + return icydemux; +} + +static void +cleanup_icydemux (void) +{ + gst_bus_set_flushing (bus, TRUE); + gst_object_unref (bus); + bus = NULL; + + gst_check_teardown_src_pad (icydemux); + if (sinkpad) + gst_check_teardown_sink_pad (icydemux); + gst_check_teardown_element (icydemux); + + srcpad = NULL; + sinkpad = NULL; + icydemux = NULL; +} + +static void +push_data (const guint8 * data, int len, GstCaps * caps, gint64 offset) +{ + GstFlowReturn res; + GstBuffer *buffer = gst_buffer_new_and_alloc (len); + + memcpy (GST_BUFFER_DATA (buffer), data, len); + gst_buffer_set_caps (buffer, caps); + + GST_BUFFER_OFFSET (buffer) = offset; + + res = gst_pad_push (srcpad, buffer); + + fail_unless (res == GST_FLOW_OK, "Failed pushing buffer: %d", res); +} + +GST_START_TEST (test_demux) +{ + GstMessage *message; + GstTagList *tags; + const GValue *tag_val; + const gchar *tag; + GstCaps *caps; + + fail_unless (gst_type_find_register (NULL, "success", GST_RANK_PRIMARY, + typefind_succeed, NULL, gst_static_caps_get (&typefind_caps), NULL, + NULL)); + + fake_typefind_caps = TRUE; + + caps = gst_caps_from_string (ICYCAPS); + + create_icydemux (); + + push_data ((guint8 *) ICY_DATA, sizeof (ICY_DATA), caps, -1); + + message = gst_bus_poll (bus, GST_MESSAGE_TAG, -1); + fail_unless (message != NULL); + + gst_message_parse_tag (message, &tags); + fail_unless (tags != NULL); + + tag_val = gst_tag_list_get_value_index (tags, GST_TAG_TITLE, 0); + fail_unless (tag_val != NULL); + + tag = g_value_get_string (tag_val); + fail_unless (tag != NULL); + + fail_unless_equals_string (TEST_METADATA, (char *) tag); + + gst_tag_list_free (tags); + gst_message_unref (message); + gst_caps_unref (caps); + + cleanup_icydemux (); + + fake_typefind_caps = FALSE; +} + +GST_END_TEST; + +/* run this test first before the custom typefind function is set up */ +GST_START_TEST (test_first_buf_offset_when_merged_for_typefinding) +{ + const guint8 buf1[] = { 'M' }; + const guint8 buf2[] = { 'P', '+', 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + GstCaps *icy_caps; + GstPad *icy_srcpad; + + fake_typefind_caps = FALSE; + + create_icydemux (); + + icy_caps = gst_caps_from_string (ICYCAPS); + + push_data (buf1, G_N_ELEMENTS (buf1), icy_caps, 0); + + /* one byte isn't really enough for typefinding, can't have a srcpad yet */ + fail_unless (gst_element_get_static_pad (icydemux, "src") == NULL); + + push_data (buf2, G_N_ELEMENTS (buf2), icy_caps, -1); + + /* should have been enough to create a audio/x-musepack source pad .. */ + icy_srcpad = gst_element_get_static_pad (icydemux, "src"); + fail_unless (icy_srcpad != NULL); + gst_object_unref (icy_srcpad); + + fail_unless (g_list_length (buffers) > 0); + + /* first buffer should have offset 0 even after it was merged with 2nd buf */ + fail_unless (GST_BUFFER_OFFSET (GST_BUFFER_CAST (buffers->data)) == 0); + + /* first buffer should have caps set */ + fail_unless (GST_BUFFER_CAPS (GST_BUFFER_CAST (buffers->data)) != NULL); + + gst_caps_unref (icy_caps); + + cleanup_icydemux (); +} + +GST_END_TEST; + +GST_START_TEST (test_not_negotiated) +{ + GstBuffer *buf; + + create_icydemux (); + + buf = gst_buffer_new_and_alloc (0); + GST_BUFFER_OFFSET (buf) = 0; + + fail_unless_equals_int (gst_pad_push (srcpad, buf), GST_FLOW_NOT_NEGOTIATED); + buf = NULL; + + cleanup_icydemux (); +} + +GST_END_TEST; + +static Suite * +icydemux_suite (void) +{ + Suite *s = suite_create ("icydemux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_demux); + tcase_add_test (tc_chain, test_first_buf_offset_when_merged_for_typefinding); + tcase_add_test (tc_chain, test_not_negotiated); + + return s; +} + +GST_CHECK_MAIN (icydemux) diff --git a/tests/check/elements/id3demux.c b/tests/check/elements/id3demux.c new file mode 100644 index 0000000..724461b --- /dev/null +++ b/tests/check/elements/id3demux.c @@ -0,0 +1,290 @@ +/* GStreamer unit tests for id3demux + * + * Copyright (C) 2007 Tim-Philipp Müller + * + * 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 + +#include + +typedef void (CheckTagsFunc) (const GstTagList * tags, const gchar * file); + +static void +pad_added_cb (GstElement * id3demux, GstPad * pad, GstBin * pipeline) +{ + GstElement *sink; + + sink = gst_bin_get_by_name (pipeline, "fakesink"); + fail_unless (gst_element_link (id3demux, sink)); + gst_object_unref (sink); + + gst_element_set_state (sink, GST_STATE_PAUSED); +} + +static GstBusSyncReply +error_cb (GstBus * bus, GstMessage * msg, gpointer user_data) +{ + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + const gchar *file = (const gchar *) user_data; + GError *err = NULL; + gchar *dbg = NULL; + + gst_message_parse_error (msg, &err, &dbg); + g_error ("ERROR for %s: %s\n%s\n", file, err->message, dbg); + } + + return GST_BUS_PASS; +} + +static GstTagList * +read_tags_from_file (const gchar * file, gboolean push_mode) +{ + GstStateChangeReturn state_ret; + GstTagList *tags = NULL; + GstMessage *msg; + GstElement *src, *sep, *sink, *id3demux, *pipeline; + GstBus *bus; + gchar *path; + + pipeline = gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL, "Failed to create pipeline!"); + + bus = gst_element_get_bus (pipeline); + + /* kids, don't use a sync handler for this at home, really; we do because + * we just want to abort and nothing else */ + gst_bus_set_sync_handler (bus, error_cb, (gpointer) file); + + src = gst_element_factory_make ("filesrc", "filesrc"); + fail_unless (src != NULL, "Failed to create 'filesrc' element!"); + + if (push_mode) { + sep = gst_element_factory_make ("queue", "queue"); + fail_unless (sep != NULL, "Failed to create 'queue' element"); + } else { + sep = gst_element_factory_make ("identity", "identity"); + fail_unless (sep != NULL, "Failed to create 'identity' element"); + } + + id3demux = gst_element_factory_make ("id3demux", "id3demux"); + fail_unless (id3demux != NULL, "Failed to create 'id3demux' element!"); + + sink = gst_element_factory_make ("fakesink", "fakesink"); + fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); + + gst_bin_add_many (GST_BIN (pipeline), src, sep, id3demux, sink, NULL); + + fail_unless (gst_element_link (src, sep)); + fail_unless (gst_element_link (sep, id3demux)); + + /* can't link id3demux and sink yet, do that later */ + g_signal_connect (id3demux, "pad-added", G_CALLBACK (pad_added_cb), pipeline); + + path = g_build_filename (GST_TEST_FILES_PATH, file, NULL); + GST_LOG ("reading file '%s'", path); + g_object_set (src, "location", path, NULL); + + state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + if (state_ret == GST_STATE_CHANGE_ASYNC) { + GST_LOG ("waiting for pipeline to reach PAUSED state"); + state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); + fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); + } + + GST_LOG ("PAUSED, let's retrieve our tags"); + + msg = gst_bus_poll (bus, GST_MESSAGE_TAG, -1); + fail_unless (msg != NULL, "Expected TAG message on bus! (%s)", file); + + gst_message_parse_tag (msg, &tags); + fail_unless (tags != NULL, "TAG message did not contain taglist! (%s)", file); + + gst_message_unref (msg); + gst_object_unref (bus); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), + GST_STATE_CHANGE_SUCCESS); + gst_object_unref (pipeline); + + g_free (path); + + GST_INFO ("%s: tags = %" GST_PTR_FORMAT, file, tags); + return tags; +} + +static void +run_check_for_file (const gchar * filename, CheckTagsFunc * check_func) +{ + GstTagList *tags; + + /* first, pull-based */ + tags = read_tags_from_file (filename, FALSE); + fail_unless (tags != NULL, "Failed to extract tags from '%s'", filename); + check_func (tags, filename); + gst_tag_list_free (tags); + + /* FIXME: need to fix id3demux for short content in push mode */ +#if 0 + /* now try push-based */ + tags = read_tags_from_file (filename, TRUE); + fail_unless (tags != NULL, "Failed to extract tags from '%s'", filename); + check_func (tags, filename); + gst_tag_list_free (tags); +#endif +} + +static void +check_date_1977_06_23 (const GstTagList * tags, const gchar * file) +{ + GDate *date = NULL; + + gst_tag_list_get_date (tags, GST_TAG_DATE, &date); + fail_unless (date != NULL, "Tags from %s should contain a GST_TAG_DATE tag"); + fail_unless_equals_int (g_date_get_year (date), 1977); + fail_unless_equals_int (g_date_get_month (date), 6); + fail_unless_equals_int (g_date_get_day (date), 23); + g_date_free (date); +} + +GST_START_TEST (test_tdat_tyer) +{ + run_check_for_file ("id3-407349-1.tag", check_date_1977_06_23); + run_check_for_file ("id3-407349-2.tag", check_date_1977_06_23); +} + +GST_END_TEST; + +static void +check_wcop (const GstTagList * tags, const gchar * file) +{ + gchar *copyright = NULL; + gchar *uri = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_LICENSE_URI, &uri)); + fail_unless (uri != NULL); + fail_unless_equals_string (uri, + "http://creativecommons.org/licenses/by/3.0/"); + g_free (uri); + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_COPYRIGHT, ©right)); + fail_unless (copyright != NULL); + fail_unless_equals_string (copyright, + " Steadman. Licensed to the public under http://creativecommons.org/licenses/by/3.0/ verify at http://test.com"); + g_free (copyright); +} + +GST_START_TEST (test_wcop) +{ + run_check_for_file ("id3-447000-wcop.tag", check_wcop); +} + +GST_END_TEST; + +static void +check_unsync_v23 (const GstTagList * tags, const gchar * file) +{ + gchar *album = NULL; + gchar *title = NULL; + gchar *artist = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &title)); + fail_unless (title != NULL); + fail_unless_equals_string (title, "ARTIST"); /* sic */ + g_free (title); + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &album)); + fail_unless (album != NULL); + fail_unless_equals_string (album, "Album"); + g_free (album); + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &artist)); + fail_unless (artist != NULL); + fail_unless_equals_string (artist, "藝人"); + g_free (artist); +} + +GST_START_TEST (test_unsync_v23) +{ + run_check_for_file ("id3-577468-unsynced-tag.tag", check_unsync_v23); +} + +GST_END_TEST; + +static void +check_unsync_v24 (const GstTagList * tags, const gchar * file) +{ + const GValue *val; + GstBuffer *buf; + gchar *album = NULL; + gchar *title = NULL; + gchar *artist = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &title)); + fail_unless (title != NULL); + fail_unless_equals_string (title, "Starlight"); + g_free (title); + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &album)); + fail_unless (album != NULL); + fail_unless_equals_string (album, "L'albumRockVol.4 CD1"); + g_free (album); + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &artist)); + fail_unless (artist != NULL); + fail_unless_equals_string (artist, "Muse"); + g_free (artist); + + val = gst_tag_list_get_value_index (tags, GST_TAG_IMAGE, 0); + fail_unless (val != NULL); + fail_unless (GST_VALUE_HOLDS_BUFFER (val)); + buf = gst_value_get_buffer (val); + fail_unless (buf != NULL); + fail_unless (GST_BUFFER_CAPS (buf) != NULL); + fail_unless_equals_int (GST_BUFFER_SIZE (buf), 38022); + /* check for jpeg start/end markers */ + fail_unless_equals_int (GST_BUFFER_DATA (buf)[0], 0xff); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[1], 0xd8); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[38020], 0xff); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[38021], 0xd9); +} + +GST_START_TEST (test_unsync_v24) +{ + run_check_for_file ("id3-588148-unsynced-v24.tag", check_unsync_v24); +} + +GST_END_TEST; + +static Suite * +id3demux_suite (void) +{ + Suite *s = suite_create ("id3demux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_tdat_tyer); + tcase_add_test (tc_chain, test_wcop); + tcase_add_test (tc_chain, test_unsync_v23); + tcase_add_test (tc_chain, test_unsync_v24); + + return s; +} + +GST_CHECK_MAIN (id3demux) diff --git a/tests/check/elements/id3v2mux.c b/tests/check/elements/id3v2mux.c new file mode 100644 index 0000000..b32827d --- /dev/null +++ b/tests/check/elements/id3v2mux.c @@ -0,0 +1,538 @@ +/* GStreamer + * + * unit test for the taglib-based id3v2mux element + * + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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 + +#include +#include + +#define TEST_ARTIST "Ar T\303\255st" +#define TEST_TITLE "M\303\274llermilch!" +#define TEST_ALBUM "Boom" +#define TEST_DATE g_date_new_dmy(1,1,2006) +#define TEST_TRACK_NUMBER 7 +#define TEST_TRACK_COUNT 19 +#define TEST_VOLUME_NUMBER 2 +#define TEST_VOLUME_COUNT 3 +#define TEST_TRACK_GAIN 1.45 +#define TEST_ALBUM_GAIN 0.78 +#define TEST_TRACK_PEAK 0.83 +#define TEST_ALBUM_PEAK 0.18 +#define TEST_BPM 113.0 + +/* for dummy mp3 frame sized MP3_FRAME_SIZE bytes, + * start: ff fb b0 44 00 00 08 00 00 4b 00 00 00 00 00 00 */ +static const guint8 mp3_dummyhdr[] = { 0xff, 0xfb, 0xb0, 0x44, 0x00, 0x00, + 0x08, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00 +}; + +#define MP3_FRAME_SIZE 626 + +/* the peak and gain values are stored pretty roughly, so check that they're + * within 2% of the expected value. + */ +#define fail_unless_sorta_equals_float(a, b) \ +G_STMT_START { \ + double first = a; \ + double second = b; \ + fail_unless(fabs (first - second) < (0.02 * fabs (first)), \ + "'" #a "' (%g) is not equal to '" #b "' (%g)", first, second); \ +} G_STMT_END; + + +static GstTagList * +test_taglib_id3mux_create_tags (guint32 mask) +{ + GstTagList *tags; + + tags = gst_tag_list_new (); + + if (mask & (1 << 0)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ARTIST, TEST_ARTIST, NULL); + } + if (mask & (1 << 1)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TITLE, TEST_TITLE, NULL); + } + if (mask & (1 << 2)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ALBUM, TEST_ALBUM, NULL); + } + if (mask & (1 << 3)) { + GDate *date; + + date = TEST_DATE; + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_DATE, date, NULL); + g_date_free (date); + } + if (mask & (1 << 4)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TRACK_NUMBER, TEST_TRACK_NUMBER, NULL); + } + if (mask & (1 << 5)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TRACK_COUNT, TEST_TRACK_COUNT, NULL); + } + if (mask & (1 << 6)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ALBUM_VOLUME_NUMBER, TEST_VOLUME_NUMBER, NULL); + } + if (mask & (1 << 7)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ALBUM_VOLUME_COUNT, TEST_VOLUME_COUNT, NULL); + } + if (mask & (1 << 8)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TRACK_GAIN, TEST_TRACK_GAIN, NULL); + } + if (mask & (1 << 9)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ALBUM_GAIN, TEST_ALBUM_GAIN, NULL); + } + if (mask & (1 << 10)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_TRACK_PEAK, TEST_TRACK_PEAK, NULL); + } + if (mask & (1 << 11)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_ALBUM_PEAK, TEST_ALBUM_PEAK, NULL); + } + if (mask & (1 << 12)) { + gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, + GST_TAG_BEATS_PER_MINUTE, TEST_BPM, NULL); + } + if (mask & (1 << 13)) { + } + return tags; +} + +static gboolean +utf8_string_in_buf (GstBuffer * buf, const gchar * s) +{ + gint i, len; + + len = strlen (s); + for (i = 0; i < (GST_BUFFER_SIZE (buf) - len); ++i) { + if (memcmp (GST_BUFFER_DATA (buf) + i, s, len) == 0) { + return TRUE; + } + } + + return FALSE; +} + +static void +test_taglib_id3mux_check_tag_buffer (GstBuffer * buf, guint32 mask) +{ + /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */ + if (mask & (1 << 0)) { + fail_unless (utf8_string_in_buf (buf, TEST_ARTIST)); + } + /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */ + if (mask & (1 << 1)) { + fail_unless (utf8_string_in_buf (buf, TEST_TITLE)); + } + /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */ + if (mask & (1 << 2)) { + fail_unless (utf8_string_in_buf (buf, TEST_ALBUM)); + } +} + +static void +test_taglib_id3mux_check_tags (GstTagList * tags, guint32 mask) +{ + if (mask & (1 << 0)) { + gchar *s = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &s)); + fail_unless (g_str_equal (s, TEST_ARTIST)); + g_free (s); + } + if (mask & (1 << 1)) { + gchar *s = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &s)); + fail_unless (g_str_equal (s, TEST_TITLE)); + g_free (s); + } + if (mask & (1 << 2)) { + gchar *s = NULL; + + fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &s)); + fail_unless (g_str_equal (s, TEST_ALBUM)); + g_free (s); + } + if (mask & (1 << 3)) { + GDate *shouldbe, *date = NULL; + + shouldbe = TEST_DATE; + fail_unless (gst_tag_list_get_date (tags, GST_TAG_DATE, &date)); + fail_unless (g_date_compare (shouldbe, date) == 0); + g_date_free (shouldbe); + g_date_free (date); + } + if (mask & (1 << 4)) { + guint num; + + fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_NUMBER, &num)); + fail_unless (num == TEST_TRACK_NUMBER); + } + if (mask & (1 << 5)) { + guint count; + + fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_COUNT, &count)); + fail_unless (count == TEST_TRACK_COUNT); + } + if (mask & (1 << 6)) { + guint num; + + fail_unless (gst_tag_list_get_uint (tags, GST_TAG_ALBUM_VOLUME_NUMBER, + &num)); + fail_unless (num == TEST_VOLUME_NUMBER); + } + if (mask & (1 << 7)) { + guint count; + + fail_unless (gst_tag_list_get_uint (tags, GST_TAG_ALBUM_VOLUME_COUNT, + &count)); + fail_unless (count == TEST_VOLUME_COUNT); + } + if (mask & (1 << 8)) { + gdouble gain; + + fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_GAIN, &gain)); + fail_unless_sorta_equals_float (gain, TEST_TRACK_GAIN); + } + if (mask & (1 << 9)) { + gdouble gain; + + fail_unless (gst_tag_list_get_double (tags, GST_TAG_ALBUM_GAIN, &gain)); + fail_unless_sorta_equals_float (gain, TEST_ALBUM_GAIN); + } + if (mask & (1 << 10)) { + gdouble peak; + + fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_PEAK, &peak)); + fail_unless_sorta_equals_float (peak, TEST_TRACK_PEAK); + } + if (mask & (1 << 11)) { + gdouble peak; + + fail_unless (gst_tag_list_get_double (tags, GST_TAG_ALBUM_PEAK, &peak)); + fail_unless_sorta_equals_float (peak, TEST_ALBUM_PEAK); + } + if (mask & (1 << 12)) { + gdouble bpm; + + fail_unless (gst_tag_list_get_double (tags, GST_TAG_BEATS_PER_MINUTE, + &bpm)); + fail_unless_sorta_equals_float (bpm, TEST_BPM); + } + if (mask & (1 << 13)) { + } +} + +static void +fill_mp3_buffer (GstElement * fakesrc, GstBuffer * buf, GstPad * pad, + guint64 * p_offset) +{ + fail_unless (GST_BUFFER_SIZE (buf) == MP3_FRAME_SIZE); + + GST_LOG ("filling buffer with fake mp3 data, offset = %" G_GUINT64_FORMAT, + *p_offset); + + memcpy (GST_BUFFER_DATA (buf), mp3_dummyhdr, sizeof (mp3_dummyhdr)); + + /* can't use gst_buffer_set_caps() here because the metadata isn't writable + * because of the extra refcounts taken by the signal emission mechanism; + * we know it's fine to use GST_BUFFER_CAPS() here though */ + GST_BUFFER_CAPS (buf) = gst_caps_new_simple ("audio/mpeg", "mpegversion", + G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL); + + GST_BUFFER_OFFSET (buf) = *p_offset; + *p_offset += GST_BUFFER_SIZE (buf); +} + +static void +got_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad, + GstBuffer ** p_buf) +{ + gint64 off; + guint size; + + off = GST_BUFFER_OFFSET (buf); + size = GST_BUFFER_SIZE (buf); + + GST_LOG ("got buffer, size=%u, offset=%" G_GINT64_FORMAT, size, off); + + fail_unless (GST_BUFFER_OFFSET_IS_VALID (buf)); + + if (*p_buf == NULL || (off + size) > GST_BUFFER_SIZE (*p_buf)) { + GstBuffer *newbuf; + + /* not very elegant, but who cares */ + newbuf = gst_buffer_new_and_alloc (off + size); + if (*p_buf) { + memcpy (GST_BUFFER_DATA (newbuf), GST_BUFFER_DATA (*p_buf), + GST_BUFFER_SIZE (*p_buf)); + } + memcpy (GST_BUFFER_DATA (newbuf) + off, GST_BUFFER_DATA (buf), size); + if (*p_buf) + gst_buffer_unref (*p_buf); + *p_buf = newbuf; + } else { + memcpy (GST_BUFFER_DATA (*p_buf) + off, GST_BUFFER_DATA (buf), size); + } +} + +static void +demux_pad_added (GstElement * id3demux, GstPad * srcpad, GstBuffer ** p_outbuf) +{ + GstElement *fakesink, *pipeline; + + GST_LOG ("id3demux added source pad with caps %" GST_PTR_FORMAT, + GST_PAD_CAPS (srcpad)); + + pipeline = id3demux; + while (GST_OBJECT_PARENT (pipeline) != NULL) + pipeline = (GstElement *) GST_OBJECT_PARENT (pipeline); + + fakesink = gst_element_factory_make ("fakesink", "fakesink"); + g_assert (fakesink != NULL); + + /* set up sink */ + g_object_set (fakesink, "signal-handoffs", TRUE, NULL); + g_signal_connect (fakesink, "handoff", G_CALLBACK (got_buffer), p_outbuf); + + gst_bin_add (GST_BIN (pipeline), fakesink); + gst_element_set_state (fakesink, GST_STATE_PLAYING); + + fail_unless (gst_element_link (id3demux, fakesink)); +} + +static void +test_taglib_id3mux_check_output_buffer (GstBuffer * buf) +{ + guint8 *data = GST_BUFFER_DATA (buf); + guint size = GST_BUFFER_SIZE (buf); + guint off; + + g_assert (size % MP3_FRAME_SIZE == 0); + + for (off = 0; off < size; off += MP3_FRAME_SIZE) { + fail_unless (memcmp (data + off, mp3_dummyhdr, sizeof (mp3_dummyhdr)) == 0); + } +} + +static void +identity_cb (GstElement * identity, GstBuffer * buf, GstBuffer ** p_tagbuf) +{ + if (*p_tagbuf == NULL) { + *p_tagbuf = gst_buffer_ref (buf); + } +} + +static void +test_taglib_id3mux_with_tags (GstTagList * tags, guint32 mask) +{ + GstMessage *msg; + GstTagList *tags_read = NULL; + GstElement *pipeline, *id3mux, *id3demux, *fakesrc, *identity; + GstBus *bus; + guint64 offset; + GstBuffer *outbuf = NULL; + GstBuffer *tagbuf = NULL; + GstStateChangeReturn state_result; + + pipeline = gst_pipeline_new ("pipeline"); + g_assert (pipeline != NULL); + + fakesrc = gst_element_factory_make ("fakesrc", "fakesrc"); + g_assert (fakesrc != NULL); + + id3mux = gst_element_factory_make ("id3v2mux", "id3v2mux"); + g_assert (id3mux != NULL); + + identity = gst_element_factory_make ("identity", "identity"); + g_assert (identity != NULL); + + id3demux = gst_element_factory_make ("id3demux", "id3demux"); + g_assert (id3demux != NULL); + + outbuf = NULL; + g_signal_connect (id3demux, "pad-added", + G_CALLBACK (demux_pad_added), &outbuf); + + gst_bin_add (GST_BIN (pipeline), fakesrc); + gst_bin_add (GST_BIN (pipeline), id3mux); + gst_bin_add (GST_BIN (pipeline), identity); + gst_bin_add (GST_BIN (pipeline), id3demux); + + gst_tag_setter_merge_tags (GST_TAG_SETTER (id3mux), tags, + GST_TAG_MERGE_APPEND); + + gst_element_link_many (fakesrc, id3mux, identity, id3demux, NULL); + + /* set up source */ + g_object_set (fakesrc, "signal-handoffs", TRUE, "can-activate-pull", FALSE, + "filltype", 2, "sizetype", 2, "sizemax", MP3_FRAME_SIZE, + "num-buffers", 16, NULL); + + offset = 0; + g_signal_connect (fakesrc, "handoff", G_CALLBACK (fill_mp3_buffer), &offset); + + /* set up identity to catch tag buffer */ + g_signal_connect (identity, "handoff", G_CALLBACK (identity_cb), &tagbuf); + + GST_LOG ("setting and getting state ..."); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + state_result = gst_element_get_state (pipeline, NULL, NULL, -1); + fail_unless (state_result == GST_STATE_CHANGE_SUCCESS, + "Unexpected result from get_state(). Expected success, got %d", + state_result); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + + GST_LOG ("Waiting for tag ..."); + msg = + gst_bus_poll (bus, GST_MESSAGE_TAG | GST_MESSAGE_EOS | GST_MESSAGE_ERROR, + -1); + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + g_printerr ("ERROR from element %s: %s\n%s\n", + GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg)); + g_error_free (err); + g_free (dbg); + } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { + g_printerr ("EOS message, but were waiting for TAGS!\n"); + } + fail_unless (msg->type == GST_MESSAGE_TAG); + + gst_message_parse_tag (msg, &tags_read); + gst_message_unref (msg); + + GST_LOG ("Got tags: %" GST_PTR_FORMAT, tags_read); + test_taglib_id3mux_check_tags (tags_read, mask); + gst_tag_list_free (tags_read); + + fail_unless (tagbuf != NULL); + test_taglib_id3mux_check_tag_buffer (tagbuf, mask); + gst_buffer_unref (tagbuf); + + GST_LOG ("Waiting for EOS ..."); + msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + g_printerr ("ERROR from element %s: %s\n%s\n", + GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg)); + g_error_free (err); + g_free (dbg); + } + fail_unless (msg->type == GST_MESSAGE_EOS); + gst_message_unref (msg); + + gst_object_unref (bus); + + GST_LOG ("Got EOS, shutting down ..."); + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + test_taglib_id3mux_check_output_buffer (outbuf); + gst_buffer_unref (outbuf); + + GST_LOG ("Done"); +} + +GST_START_TEST (test_id3v2mux) +{ + GstTagList *tags; + gint i; + + g_random_set_seed (247166295); + + /* internal consistency check */ + tags = test_taglib_id3mux_create_tags (0xFFFFFFFF); + test_taglib_id3mux_check_tags (tags, 0xFFFFFFFF); + gst_tag_list_free (tags); + + /* now the real tests */ + for (i = 0; i < 50; ++i) { + guint32 mask; + + mask = g_random_int (); + GST_LOG ("tag mask = %08x (i=%d)", mask, i); + + if (mask == 0) + continue; + + /* create tags */ + tags = test_taglib_id3mux_create_tags (mask); + GST_LOG ("tags for mask %08x = %" GST_PTR_FORMAT, mask, tags); + + /* double-check for internal consistency */ + test_taglib_id3mux_check_tags (tags, mask); + + /* test with pipeline */ + test_taglib_id3mux_with_tags (tags, mask); + + /* free tags */ + gst_tag_list_free (tags); + } +} + +GST_END_TEST; + +static Suite * +id3v2mux_suite (void) +{ + Suite *s = suite_create ("id3v2mux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_id3v2mux); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = id3v2mux_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/imagefreeze.c b/tests/check/elements/imagefreeze.c new file mode 100644 index 0000000..15da222 --- /dev/null +++ b/tests/check/elements/imagefreeze.c @@ -0,0 +1,640 @@ +/* GStreamer + * Copyright (C) 2010 Sebastian Dröge + * + * 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 + +#include +#include + +static gboolean +bus_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + GMainLoop *loop = (GMainLoop *) data; + + switch (message->type) { + case GST_MESSAGE_EOS: + g_main_loop_quit (loop); + break; + case GST_MESSAGE_WARNING: + case GST_MESSAGE_ERROR:{ + GError *gerror; + gchar *debug; + + if (message->type == GST_MESSAGE_WARNING) + gst_message_parse_warning (message, &gerror, &debug); + else + gst_message_parse_error (message, &gerror, &debug); + g_error ("error from %s: %s (%s)\n", + GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)), gerror->message, + GST_STR_NULL (debug)); + gst_message_unref (message); + g_error_free (gerror); + g_free (debug); + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + +static GstElement * +setup_imagefreeze (const GstCaps * caps1, const GstCaps * caps2, + GCallback sink_handoff, gpointer sink_handoff_data) +{ + GstElement *pipeline; + GstElement *videotestsrc, *capsfilter1, *imagefreeze, *capsfilter2, *fakesink; + + pipeline = gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL); + + videotestsrc = gst_element_factory_make ("videotestsrc", "src"); + fail_unless (videotestsrc != NULL); + g_object_set (videotestsrc, "num-buffers", 1, NULL); + + capsfilter1 = gst_element_factory_make ("capsfilter", "filter1"); + fail_unless (capsfilter1 != NULL); + g_object_set (capsfilter1, "caps", caps1, NULL); + + imagefreeze = gst_element_factory_make ("imagefreeze", "freeze"); + fail_unless (imagefreeze != NULL); + + capsfilter2 = gst_element_factory_make ("capsfilter", "filter2"); + fail_unless (capsfilter2 != NULL); + g_object_set (capsfilter2, "caps", caps2, NULL); + + fakesink = gst_element_factory_make ("fakesink", "sink"); + fail_unless (fakesink != NULL); + g_object_set (fakesink, "signal-handoffs", TRUE, "async", FALSE, NULL); + + if (sink_handoff) + g_signal_connect (fakesink, "handoff", sink_handoff, sink_handoff_data); + + gst_bin_add_many (GST_BIN (pipeline), videotestsrc, capsfilter1, imagefreeze, + capsfilter2, fakesink, NULL); + + fail_unless (gst_element_link_pads (videotestsrc, "src", capsfilter1, + "sink")); + fail_unless (gst_element_link_pads (capsfilter1, "src", imagefreeze, "sink")); + fail_unless (gst_element_link_pads (imagefreeze, "src", capsfilter2, "sink")); + fail_unless (gst_element_link_pads (capsfilter2, "src", fakesink, "sink")); + + return pipeline; +} + +static void +sink_handoff_cb_0_1 (GstElement * object, GstBuffer * buffer, GstPad * pad, + gpointer user_data) +{ + guint *n_buffers = (guint *) user_data; + + if (*n_buffers == G_MAXUINT) + return; + + fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 0); + fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), GST_CLOCK_TIME_NONE); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 0); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), 1); + + *n_buffers = *n_buffers + 1; +} + +GST_START_TEST (test_imagefreeze_0_1) +{ + GstElement *pipeline; + GstCaps *caps1, *caps2; + GstBus *bus; + GMainLoop *loop; + guint n_buffers = G_MAXUINT; + guint bus_watch = 0; + + caps1 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + caps2 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 0, 1, 1, 1); + + pipeline = + setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_0_1), + &n_buffers); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + n_buffers = 0; + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + g_main_loop_run (loop); + + fail_unless_equals_int (n_buffers, 1); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + gst_caps_unref (caps1); + gst_caps_unref (caps2); + g_source_remove (bus_watch); +} + +GST_END_TEST; + +static void +sink_handoff_cb_25_1_0ms_400ms (GstElement * object, GstBuffer * buffer, + GstPad * pad, gpointer user_data) +{ + guint *n_buffers = (guint *) user_data; + + if (*n_buffers == G_MAXUINT) + return; + + fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), + *n_buffers * 40 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), *n_buffers); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), *n_buffers + 1); + + *n_buffers = *n_buffers + 1; +} + +GST_START_TEST (test_imagefreeze_25_1_0ms_400ms) +{ + GstElement *pipeline; + GstCaps *caps1, *caps2; + GstBus *bus; + GMainLoop *loop; + guint n_buffers = G_MAXUINT; + guint bus_watch = 0; + + caps1 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + caps2 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + + pipeline = + setup_imagefreeze (caps1, caps2, + G_CALLBACK (sink_handoff_cb_25_1_0ms_400ms), &n_buffers); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), + GST_STATE_CHANGE_SUCCESS); + + fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, + 400 * GST_MSECOND)); + + n_buffers = 0; + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + g_main_loop_run (loop); + + fail_unless_equals_int (n_buffers, 10); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + gst_caps_unref (caps1); + gst_caps_unref (caps2); + g_source_remove (bus_watch); +} + +GST_END_TEST; + +static void +sink_handoff_cb_25_1_200ms_400ms (GstElement * object, GstBuffer * buffer, + GstPad * pad, gpointer user_data) +{ + guint *n_buffers = (guint *) user_data; + + if (*n_buffers == G_MAXUINT) + return; + + fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), + 200 * GST_MSECOND + *n_buffers * 40 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 5 + *n_buffers); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), + 5 + *n_buffers + 1); + + *n_buffers = *n_buffers + 1; +} + +GST_START_TEST (test_imagefreeze_25_1_200ms_400ms) +{ + GstElement *pipeline; + GstCaps *caps1, *caps2; + GstBus *bus; + GMainLoop *loop; + guint n_buffers = G_MAXUINT; + guint bus_watch = 0; + + caps1 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + caps2 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + + pipeline = + setup_imagefreeze (caps1, caps2, + G_CALLBACK (sink_handoff_cb_25_1_200ms_400ms), &n_buffers); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), + GST_STATE_CHANGE_SUCCESS); + + fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 200 * GST_MSECOND, + GST_SEEK_TYPE_SET, 400 * GST_MSECOND)); + + n_buffers = 0; + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + g_main_loop_run (loop); + + fail_unless_equals_int (n_buffers, 5); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + gst_caps_unref (caps1); + gst_caps_unref (caps2); + g_source_remove (bus_watch); +} + +GST_END_TEST; + +static void +sink_handoff_cb_25_1_400ms_0ms (GstElement * object, GstBuffer * buffer, + GstPad * pad, gpointer user_data) +{ + guint *n_buffers = (guint *) user_data; + + if (*n_buffers == G_MAXUINT) + return; + + fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), + 400 * GST_MSECOND - (*n_buffers + 1) * 40 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 10 - (*n_buffers + 1)); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), + 10 - (*n_buffers + 1) + 1); + + *n_buffers = *n_buffers + 1; +} + +GST_START_TEST (test_imagefreeze_25_1_400ms_0ms) +{ + GstElement *pipeline; + GstCaps *caps1, *caps2; + GstBus *bus; + GMainLoop *loop; + guint n_buffers = G_MAXUINT; + guint bus_watch = 0; + + caps1 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + caps2 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + + pipeline = + setup_imagefreeze (caps1, caps2, + G_CALLBACK (sink_handoff_cb_25_1_400ms_0ms), &n_buffers); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), + GST_STATE_CHANGE_SUCCESS); + + fail_unless (gst_element_seek (pipeline, -1.0, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, + 400 * GST_MSECOND)); + + n_buffers = 0; + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + g_main_loop_run (loop); + + fail_unless_equals_int (n_buffers, 10); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + gst_caps_unref (caps1); + gst_caps_unref (caps2); + g_source_remove (bus_watch); +} + +GST_END_TEST; + +static void +sink_handoff_cb_25_1_220ms_380ms (GstElement * object, GstBuffer * buffer, + GstPad * pad, gpointer user_data) +{ + guint *n_buffers = (guint *) user_data; + + if (*n_buffers == G_MAXUINT) + return; + + if (*n_buffers == 0) { + fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), + 220 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 20 * GST_MSECOND); + } else if (*n_buffers == 4) { + fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), + 360 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 20 * GST_MSECOND); + } else { + fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), + 200 * GST_MSECOND + *n_buffers * 40 * GST_MSECOND); + fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); + } + + fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 5 + *n_buffers); + fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), + 5 + *n_buffers + 1); + + *n_buffers = *n_buffers + 1; +} + +GST_START_TEST (test_imagefreeze_25_1_220ms_380ms) +{ + GstElement *pipeline; + GstCaps *caps1, *caps2; + GstBus *bus; + GMainLoop *loop; + guint n_buffers = G_MAXUINT; + guint bus_watch = 0; + + caps1 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + caps2 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + + pipeline = + setup_imagefreeze (caps1, caps2, + G_CALLBACK (sink_handoff_cb_25_1_220ms_380ms), &n_buffers); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), + GST_STATE_CHANGE_SUCCESS); + + fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 220 * GST_MSECOND, + GST_SEEK_TYPE_SET, 380 * GST_MSECOND)); + + n_buffers = 0; + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + g_main_loop_run (loop); + + fail_unless_equals_int (n_buffers, 5); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + gst_caps_unref (caps1); + gst_caps_unref (caps2); + g_source_remove (bus_watch); +} + +GST_END_TEST; + +static GstBuffer *test_buffer = NULL; + +static GstFlowReturn +test_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, + GstBuffer ** buf) +{ + fail_if (test_buffer != NULL); + + test_buffer = gst_buffer_new_and_alloc (size); + gst_buffer_set_caps (test_buffer, caps); + + *buf = gst_buffer_ref (test_buffer); + + return GST_FLOW_OK; +} + +static void +sink_handoff_cb_bufferalloc (GstElement * object, GstBuffer * buffer, + GstPad * pad, gpointer user_data) +{ + guint *n_buffers = (guint *) user_data; + + if (*n_buffers == G_MAXUINT) + return; + + fail_unless (buffer->parent != NULL); + fail_unless (test_buffer != NULL); + fail_unless (buffer->parent == test_buffer); + + *n_buffers = *n_buffers + 1; +} + +GST_START_TEST (test_imagefreeze_bufferalloc) +{ + GstElement *pipeline; + GstElement *sink; + GstPad *sinkpad; + GstCaps *caps1, *caps2; + GstBus *bus; + GMainLoop *loop; + guint n_buffers = G_MAXUINT; + guint bus_watch = 0; + + caps1 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + caps2 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + + pipeline = + setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_bufferalloc), + &n_buffers); + + sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); + fail_unless (sink != NULL); + sinkpad = gst_element_get_static_pad (sink, "sink"); + fail_unless (sinkpad != NULL); + gst_pad_set_bufferalloc_function (sinkpad, test_bufferalloc); + gst_object_unref (sinkpad); + gst_object_unref (sink); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), + GST_STATE_CHANGE_SUCCESS); + + fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, + 400 * GST_MSECOND)); + + n_buffers = 0; + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + g_main_loop_run (loop); + + fail_unless (test_buffer != NULL); + fail_unless (n_buffers >= 1); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_buffer_unref (test_buffer); + test_buffer = NULL; + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + gst_caps_unref (caps1); + gst_caps_unref (caps2); + g_source_remove (bus_watch); +} + +GST_END_TEST; + +GST_START_TEST (test_imagefreeze_eos) +{ + GstElement *pipeline; + GstElement *src; + GstCaps *caps1, *caps2; + GstBus *bus; + GMainLoop *loop; + GstFormat fmt = GST_FORMAT_TIME; + gint64 position; + guint bus_watch = 0; + + caps1 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + caps2 = + gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); + + pipeline = setup_imagefreeze (caps1, caps2, NULL, NULL); + + src = gst_bin_get_by_name (GST_BIN (pipeline), "src"); + fail_unless (src != NULL); + g_object_set (src, "num-buffers", 100, NULL); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), + GST_STATE_CHANGE_SUCCESS); + + fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, + 400 * GST_MSECOND)); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), + GST_STATE_CHANGE_SUCCESS); + + g_main_loop_run (loop); + + fail_unless (gst_element_query_position (src, &fmt, &position)); + fail_unless_equals_uint64 (position, 40 * GST_MSECOND); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (src); + gst_object_unref (pipeline); + g_main_loop_unref (loop); + gst_caps_unref (caps1); + gst_caps_unref (caps2); + g_source_remove (bus_watch); +} + +GST_END_TEST; + +static Suite * +imagefreeze_suite (void) +{ + Suite *s = suite_create ("imagefreeze"); + TCase *tc_chain = tcase_create ("linear"); + + /* time out after 120s, not the default 3 */ + tcase_set_timeout (tc_chain, 120); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_imagefreeze_0_1); + tcase_add_test (tc_chain, test_imagefreeze_25_1_0ms_400ms); + tcase_add_test (tc_chain, test_imagefreeze_25_1_200ms_400ms); + tcase_add_test (tc_chain, test_imagefreeze_25_1_400ms_0ms); + tcase_add_test (tc_chain, test_imagefreeze_25_1_220ms_380ms); + + tcase_add_test (tc_chain, test_imagefreeze_bufferalloc); + tcase_add_test (tc_chain, test_imagefreeze_eos); + + return s; +} + +GST_CHECK_MAIN (imagefreeze); diff --git a/tests/check/elements/interleave.c b/tests/check/elements/interleave.c new file mode 100644 index 0000000..1497a49 --- /dev/null +++ b/tests/check/elements/interleave.c @@ -0,0 +1,733 @@ +/* GStreamer unit tests for the interleave element + * Copyright (C) 2007 Tim-Philipp Müller + * Copyright (C) 2008 Sebastian Dröge + * + * 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 +#include + +GST_START_TEST (test_create_and_unref) +{ + GstElement *interleave; + + interleave = gst_element_factory_make ("interleave", NULL); + fail_unless (interleave != NULL); + + gst_element_set_state (interleave, GST_STATE_NULL); + gst_object_unref (interleave); +} + +GST_END_TEST; + +GST_START_TEST (test_request_pads) +{ + GstElement *interleave; + GstPad *pad1, *pad2; + + interleave = gst_element_factory_make ("interleave", NULL); + fail_unless (interleave != NULL); + + pad1 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (pad1 != NULL); + fail_unless_equals_string (GST_OBJECT_NAME (pad1), "sink0"); + + pad2 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (pad2 != NULL); + fail_unless_equals_string (GST_OBJECT_NAME (pad2), "sink1"); + + gst_element_release_request_pad (interleave, pad2); + gst_object_unref (pad2); + gst_element_release_request_pad (interleave, pad1); + gst_object_unref (pad1); + + gst_element_set_state (interleave, GST_STATE_NULL); + gst_object_unref (interleave); +} + +GST_END_TEST; + +static GstPad **mysrcpads, *mysinkpad; +static GstBus *bus; +static GstElement *interleave; +static gint have_data; +static gfloat input[2]; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "width = (int) 32, " + "channels = (int) 2, " + "rate = (int) 48000, " "endianness = (int) BYTE_ORDER")); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-float, " + "width = (int) 32, " + "channels = (int) 1, " + "rate = (int) 48000, " "endianness = (int) BYTE_ORDER")); + +#define CAPS_48khz \ + "audio/x-raw-float, " \ + "width = (int) 32, " \ + "channels = (int) 1, " \ + "rate = (int) 48000, " \ + "endianness = (int) BYTE_ORDER" + +static GstFlowReturn +interleave_chain_func (GstPad * pad, GstBuffer * buffer) +{ + gfloat *outdata; + gint i; + + fail_unless (GST_IS_BUFFER (buffer)); + fail_unless_equals_int (GST_BUFFER_SIZE (buffer), + 48000 * 2 * sizeof (gfloat)); + fail_unless (GST_BUFFER_DATA (buffer) != NULL); + + outdata = (gfloat *) GST_BUFFER_DATA (buffer); + + for (i = 0; i < 48000 * 2; i += 2) { + fail_unless_equals_float (outdata[i], input[0]); + fail_unless_equals_float (outdata[i + 1], input[1]); + } + + have_data++; + + gst_buffer_unref (buffer); + + return GST_FLOW_OK; +} + +GST_START_TEST (test_interleave_2ch) +{ + GstElement *queue; + GstPad *sink0, *sink1, *src, *tmp; + GstCaps *caps; + gint i; + GstBuffer *inbuf; + gfloat *indata; + + mysrcpads = g_new0 (GstPad *, 2); + + have_data = 0; + + interleave = gst_element_factory_make ("interleave", NULL); + fail_unless (interleave != NULL); + + queue = gst_element_factory_make ("queue", "queue"); + fail_unless (queue != NULL); + + sink0 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sink0 != NULL); + fail_unless_equals_string (GST_OBJECT_NAME (sink0), "sink0"); + + sink1 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sink1 != NULL); + fail_unless_equals_string (GST_OBJECT_NAME (sink1), "sink1"); + + mysrcpads[0] = gst_pad_new_from_static_template (&srctemplate, "src0"); + fail_unless (mysrcpads[0] != NULL); + + caps = gst_caps_from_string (CAPS_48khz); + fail_unless (gst_pad_set_caps (mysrcpads[0], caps)); + gst_pad_use_fixed_caps (mysrcpads[0]); + + mysrcpads[1] = gst_pad_new_from_static_template (&srctemplate, "src1"); + fail_unless (mysrcpads[1] != NULL); + + fail_unless (gst_pad_set_caps (mysrcpads[1], caps)); + gst_pad_use_fixed_caps (mysrcpads[1]); + + tmp = gst_element_get_static_pad (queue, "sink"); + fail_unless (gst_pad_link (mysrcpads[0], tmp) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + tmp = gst_element_get_static_pad (queue, "src"); + fail_unless (gst_pad_link (tmp, sink0) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + + fail_unless (gst_pad_link (mysrcpads[1], sink1) == GST_PAD_LINK_OK); + + mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); + fail_unless (mysinkpad != NULL); + gst_pad_set_chain_function (mysinkpad, interleave_chain_func); + gst_pad_set_active (mysinkpad, TRUE); + + src = gst_element_get_static_pad (interleave, "src"); + fail_unless (src != NULL); + fail_unless (gst_pad_link (src, mysinkpad) == GST_PAD_LINK_OK); + gst_object_unref (src); + + bus = gst_bus_new (); + gst_element_set_bus (interleave, bus); + + fail_unless (gst_element_set_state (interleave, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); + fail_unless (gst_element_set_state (queue, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); + + input[0] = -1.0; + inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 48000; i++) + indata[i] = -1.0; + gst_buffer_set_caps (inbuf, caps); + fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK); + + input[1] = 1.0; + inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 48000; i++) + indata[i] = 1.0; + gst_buffer_set_caps (inbuf, caps); + fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK); + + inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 48000; i++) + indata[i] = -1.0; + gst_buffer_set_caps (inbuf, caps); + fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK); + + inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 48000; i++) + indata[i] = 1.0; + gst_buffer_set_caps (inbuf, caps); + fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK); + + fail_unless (have_data == 2); + + gst_element_set_state (interleave, GST_STATE_NULL); + gst_element_set_state (queue, GST_STATE_NULL); + + gst_object_unref (mysrcpads[0]); + gst_object_unref (mysrcpads[1]); + gst_object_unref (mysinkpad); + + gst_element_release_request_pad (interleave, sink0); + gst_object_unref (sink0); + gst_element_release_request_pad (interleave, sink1); + gst_object_unref (sink1); + + gst_object_unref (interleave); + gst_object_unref (queue); + gst_object_unref (bus); + gst_caps_unref (caps); + + g_free (mysrcpads); +} + +GST_END_TEST; + +GST_START_TEST (test_interleave_2ch_1eos) +{ + GstElement *queue; + GstPad *sink0, *sink1, *src, *tmp; + GstCaps *caps; + gint i; + GstBuffer *inbuf; + gfloat *indata; + + mysrcpads = g_new0 (GstPad *, 2); + + have_data = 0; + + interleave = gst_element_factory_make ("interleave", NULL); + fail_unless (interleave != NULL); + + queue = gst_element_factory_make ("queue", "queue"); + fail_unless (queue != NULL); + + sink0 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sink0 != NULL); + fail_unless_equals_string (GST_OBJECT_NAME (sink0), "sink0"); + + sink1 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sink1 != NULL); + fail_unless_equals_string (GST_OBJECT_NAME (sink1), "sink1"); + + mysrcpads[0] = gst_pad_new_from_static_template (&srctemplate, "src0"); + fail_unless (mysrcpads[0] != NULL); + + caps = gst_caps_from_string (CAPS_48khz); + fail_unless (gst_pad_set_caps (mysrcpads[0], caps)); + gst_pad_use_fixed_caps (mysrcpads[0]); + + mysrcpads[1] = gst_pad_new_from_static_template (&srctemplate, "src1"); + fail_unless (mysrcpads[1] != NULL); + + fail_unless (gst_pad_set_caps (mysrcpads[1], caps)); + gst_pad_use_fixed_caps (mysrcpads[1]); + + tmp = gst_element_get_static_pad (queue, "sink"); + fail_unless (gst_pad_link (mysrcpads[0], tmp) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + tmp = gst_element_get_static_pad (queue, "src"); + fail_unless (gst_pad_link (tmp, sink0) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + + fail_unless (gst_pad_link (mysrcpads[1], sink1) == GST_PAD_LINK_OK); + + mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); + fail_unless (mysinkpad != NULL); + gst_pad_set_chain_function (mysinkpad, interleave_chain_func); + gst_pad_set_active (mysinkpad, TRUE); + + src = gst_element_get_static_pad (interleave, "src"); + fail_unless (src != NULL); + fail_unless (gst_pad_link (src, mysinkpad) == GST_PAD_LINK_OK); + gst_object_unref (src); + + bus = gst_bus_new (); + gst_element_set_bus (interleave, bus); + + fail_unless (gst_element_set_state (interleave, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); + fail_unless (gst_element_set_state (queue, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); + + input[0] = -1.0; + inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 48000; i++) + indata[i] = -1.0; + gst_buffer_set_caps (inbuf, caps); + fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK); + + input[1] = 1.0; + inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 48000; i++) + indata[i] = 1.0; + gst_buffer_set_caps (inbuf, caps); + fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK); + + input[0] = 0.0; + gst_pad_push_event (mysrcpads[0], gst_event_new_eos ()); + + input[1] = 1.0; + inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); + indata = (gfloat *) GST_BUFFER_DATA (inbuf); + for (i = 0; i < 48000; i++) + indata[i] = 1.0; + gst_buffer_set_caps (inbuf, caps); + fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK); + + fail_unless (have_data == 2); + + gst_element_set_state (interleave, GST_STATE_NULL); + gst_element_set_state (queue, GST_STATE_NULL); + + gst_object_unref (mysrcpads[0]); + gst_object_unref (mysrcpads[1]); + gst_object_unref (mysinkpad); + + gst_element_release_request_pad (interleave, sink0); + gst_object_unref (sink0); + gst_element_release_request_pad (interleave, sink1); + gst_object_unref (sink1); + + gst_object_unref (interleave); + gst_object_unref (queue); + gst_object_unref (bus); + gst_caps_unref (caps); + + g_free (mysrcpads); +} + +GST_END_TEST; + +static void +src_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad, + gpointer user_data) +{ + gint n = GPOINTER_TO_INT (user_data); + GstCaps *caps; + gfloat *data; + gint i; + + if (GST_PAD_CAPS (pad)) + caps = gst_caps_ref (GST_PAD_CAPS (pad)); + else { + caps = gst_caps_new_simple ("audio/x-raw-float", + "width", G_TYPE_INT, 32, + "channels", G_TYPE_INT, 1, + "rate", G_TYPE_INT, 48000, "endianness", G_TYPE_INT, G_BYTE_ORDER, + NULL); + + if (n == 2) { + GstAudioChannelPosition pos[1] = + { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT }; + gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); + } else if (n == 3) { + GstAudioChannelPosition pos[1] = + { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT }; + gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); + } + } + + data = g_new (gfloat, 48000); + GST_BUFFER_MALLOCDATA (buffer) = (guint8 *) data; + GST_BUFFER_DATA (buffer) = (guint8 *) data; + GST_BUFFER_SIZE (buffer) = 48000 * sizeof (gfloat); + + GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE; + GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE; + GST_BUFFER_DURATION (buffer) = GST_SECOND; + + GST_BUFFER_CAPS (buffer) = caps; + + for (i = 0; i < 48000; i++) + data[i] = (n % 2 == 0) ? -1.0 : 1.0; +} + +static void +sink_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad, + gpointer user_data) +{ + gint i; + gfloat *data; + GstCaps *caps; + gint n = GPOINTER_TO_INT (user_data); + + fail_unless (GST_IS_BUFFER (buffer)); + fail_unless_equals_int (GST_BUFFER_SIZE (buffer), + 48000 * 2 * sizeof (gfloat)); + fail_unless_equals_int (GST_BUFFER_DURATION (buffer), GST_SECOND); + + caps = gst_caps_new_simple ("audio/x-raw-float", + "width", G_TYPE_INT, 32, + "channels", G_TYPE_INT, 2, + "rate", G_TYPE_INT, 48000, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); + + if (n == 0) { + GstAudioChannelPosition pos[2] = + { GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE }; + gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); + } else if (n == 1) { + GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT + }; + gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); + } else if (n == 2) { + GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER + }; + gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); + } + + fail_unless (gst_caps_is_equal (caps, GST_BUFFER_CAPS (buffer))); + gst_caps_unref (caps); + + data = (gfloat *) GST_BUFFER_DATA (buffer); + + for (i = 0; i < 48000 * 2; i += 2) { + fail_unless_equals_float (data[i], -1.0); + fail_unless_equals_float (data[i + 1], 1.0); + } + + have_data++; +} + +GST_START_TEST (test_interleave_2ch_pipeline) +{ + GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink; + GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2; + GstMessage *msg; + + have_data = 0; + + pipeline = (GstElement *) gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL); + + src1 = gst_element_factory_make ("fakesrc", "src1"); + fail_unless (src1 != NULL); + g_object_set (src1, "num-buffers", 4, NULL); + g_object_set (src1, "signal-handoffs", TRUE, NULL); + g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32), + GINT_TO_POINTER (0)); + gst_bin_add (GST_BIN (pipeline), src1); + + src2 = gst_element_factory_make ("fakesrc", "src2"); + fail_unless (src2 != NULL); + g_object_set (src2, "num-buffers", 4, NULL); + g_object_set (src2, "signal-handoffs", TRUE, NULL); + g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32), + GINT_TO_POINTER (1)); + gst_bin_add (GST_BIN (pipeline), src2); + + queue = gst_element_factory_make ("queue", "queue"); + fail_unless (queue != NULL); + gst_bin_add (GST_BIN (pipeline), queue); + + interleave = gst_element_factory_make ("interleave", "interleave"); + fail_unless (interleave != NULL); + gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave)); + + sinkpad0 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sinkpad0 != NULL); + tmp = gst_element_get_static_pad (src1, "src"); + fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + + sinkpad1 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sinkpad1 != NULL); + tmp = gst_element_get_static_pad (src2, "src"); + tmp2 = gst_element_get_static_pad (queue, "sink"); + fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + gst_object_unref (tmp2); + tmp = gst_element_get_static_pad (queue, "src"); + fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + + sink = gst_element_factory_make ("fakesink", "sink"); + fail_unless (sink != NULL); + g_object_set (sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32), + GINT_TO_POINTER (0)); + gst_bin_add (GST_BIN (pipeline), sink); + tmp = gst_element_get_static_pad (interleave, "src"); + tmp2 = gst_element_get_static_pad (sink, "sink"); + fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + gst_object_unref (tmp2); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); + gst_message_unref (msg); + + fail_unless (have_data == 4); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_element_release_request_pad (interleave, sinkpad0); + gst_object_unref (sinkpad0); + gst_element_release_request_pad (interleave, sinkpad1); + gst_object_unref (sinkpad1); + gst_object_unref (interleave); + gst_object_unref (pipeline); +} + +GST_END_TEST; + +GST_START_TEST (test_interleave_2ch_pipeline_input_chanpos) +{ + GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink; + GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2; + GstMessage *msg; + + have_data = 0; + + pipeline = (GstElement *) gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL); + + src1 = gst_element_factory_make ("fakesrc", "src1"); + fail_unless (src1 != NULL); + g_object_set (src1, "num-buffers", 4, NULL); + g_object_set (src1, "signal-handoffs", TRUE, NULL); + g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32), + GINT_TO_POINTER (2)); + gst_bin_add (GST_BIN (pipeline), src1); + + src2 = gst_element_factory_make ("fakesrc", "src2"); + fail_unless (src2 != NULL); + g_object_set (src2, "num-buffers", 4, NULL); + g_object_set (src2, "signal-handoffs", TRUE, NULL); + g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32), + GINT_TO_POINTER (3)); + gst_bin_add (GST_BIN (pipeline), src2); + + queue = gst_element_factory_make ("queue", "queue"); + fail_unless (queue != NULL); + gst_bin_add (GST_BIN (pipeline), queue); + + interleave = gst_element_factory_make ("interleave", "interleave"); + fail_unless (interleave != NULL); + g_object_set (interleave, "channel-positions-from-input", TRUE, NULL); + gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave)); + + sinkpad0 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sinkpad0 != NULL); + tmp = gst_element_get_static_pad (src1, "src"); + fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + + sinkpad1 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sinkpad1 != NULL); + tmp = gst_element_get_static_pad (src2, "src"); + tmp2 = gst_element_get_static_pad (queue, "sink"); + fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + gst_object_unref (tmp2); + tmp = gst_element_get_static_pad (queue, "src"); + fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + + sink = gst_element_factory_make ("fakesink", "sink"); + fail_unless (sink != NULL); + g_object_set (sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32), + GINT_TO_POINTER (1)); + gst_bin_add (GST_BIN (pipeline), sink); + tmp = gst_element_get_static_pad (interleave, "src"); + tmp2 = gst_element_get_static_pad (sink, "sink"); + fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + gst_object_unref (tmp2); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); + gst_message_unref (msg); + + fail_unless (have_data == 4); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_element_release_request_pad (interleave, sinkpad0); + gst_object_unref (sinkpad0); + gst_element_release_request_pad (interleave, sinkpad1); + gst_object_unref (sinkpad1); + gst_object_unref (interleave); + gst_object_unref (pipeline); +} + +GST_END_TEST; + +GST_START_TEST (test_interleave_2ch_pipeline_custom_chanpos) +{ + GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink; + GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2; + GstMessage *msg; + GValueArray *arr; + GValue val = { 0, }; + + have_data = 0; + + pipeline = (GstElement *) gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL); + + src1 = gst_element_factory_make ("fakesrc", "src1"); + fail_unless (src1 != NULL); + g_object_set (src1, "num-buffers", 4, NULL); + g_object_set (src1, "signal-handoffs", TRUE, NULL); + g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32), + GINT_TO_POINTER (0)); + gst_bin_add (GST_BIN (pipeline), src1); + + src2 = gst_element_factory_make ("fakesrc", "src2"); + fail_unless (src2 != NULL); + g_object_set (src2, "num-buffers", 4, NULL); + g_object_set (src2, "signal-handoffs", TRUE, NULL); + g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32), + GINT_TO_POINTER (1)); + gst_bin_add (GST_BIN (pipeline), src2); + + queue = gst_element_factory_make ("queue", "queue"); + fail_unless (queue != NULL); + gst_bin_add (GST_BIN (pipeline), queue); + + interleave = gst_element_factory_make ("interleave", "interleave"); + fail_unless (interleave != NULL); + g_object_set (interleave, "channel-positions-from-input", FALSE, NULL); + arr = g_value_array_new (2); + g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER); + g_value_array_append (arr, &val); + g_value_reset (&val); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER); + g_value_array_append (arr, &val); + g_value_unset (&val); + g_object_set (interleave, "channel-positions", arr, NULL); + g_value_array_free (arr); + gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave)); + + sinkpad0 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sinkpad0 != NULL); + tmp = gst_element_get_static_pad (src1, "src"); + fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + + sinkpad1 = gst_element_get_request_pad (interleave, "sink%d"); + fail_unless (sinkpad1 != NULL); + tmp = gst_element_get_static_pad (src2, "src"); + tmp2 = gst_element_get_static_pad (queue, "sink"); + fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + gst_object_unref (tmp2); + tmp = gst_element_get_static_pad (queue, "src"); + fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + + sink = gst_element_factory_make ("fakesink", "sink"); + fail_unless (sink != NULL); + g_object_set (sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32), + GINT_TO_POINTER (2)); + gst_bin_add (GST_BIN (pipeline), sink); + tmp = gst_element_get_static_pad (interleave, "src"); + tmp2 = gst_element_get_static_pad (sink, "sink"); + fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); + gst_object_unref (tmp); + gst_object_unref (tmp2); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); + gst_message_unref (msg); + + fail_unless (have_data == 4); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_element_release_request_pad (interleave, sinkpad0); + gst_object_unref (sinkpad0); + gst_element_release_request_pad (interleave, sinkpad1); + gst_object_unref (sinkpad1); + gst_object_unref (interleave); + gst_object_unref (pipeline); +} + +GST_END_TEST; + +static Suite * +interleave_suite (void) +{ + Suite *s = suite_create ("interleave"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_set_timeout (tc_chain, 180); + tcase_add_test (tc_chain, test_create_and_unref); + tcase_add_test (tc_chain, test_request_pads); + tcase_add_test (tc_chain, test_interleave_2ch); + tcase_add_test (tc_chain, test_interleave_2ch_1eos); + tcase_add_test (tc_chain, test_interleave_2ch_pipeline); + tcase_add_test (tc_chain, test_interleave_2ch_pipeline_input_chanpos); + tcase_add_test (tc_chain, test_interleave_2ch_pipeline_custom_chanpos); + + return s; +} + +GST_CHECK_MAIN (interleave); diff --git a/tests/check/elements/jpegenc.c b/tests/check/elements/jpegenc.c new file mode 100644 index 0000000..2c992f7 --- /dev/null +++ b/tests/check/elements/jpegenc.c @@ -0,0 +1,247 @@ +/* GStreamer + * + * unit test for jpegenc + * + * Copyright (C) <2010> Thiago Santos + * + * 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 + +#include +#include + +/* For ease of programming we use globals to keep refs for our floating + * sink pads we create; otherwise we always have to do get_pad, + * get_peer, and then remove references in every test function */ +static GstPad *mysinkpad; +static GstPad *mysrcpad; + +#define JPEG_CAPS_STRING "image/jpeg" + +#define JPEG_CAPS_RESTRICTIVE "image/jpeg, " \ + "width = (int) [100, 200], " \ + "framerate = (fraction) 25/1, " \ + "extraparameter = (string) { abc, def }" + +static GstStaticPadTemplate jpeg_sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (JPEG_CAPS_STRING)); + +static GstStaticPadTemplate any_sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate jpeg_restrictive_sinktemplate = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (JPEG_CAPS_RESTRICTIVE)); + +static GstStaticPadTemplate any_srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + + +static GstElement * +setup_jpegenc (GstStaticPadTemplate * sinktemplate) +{ + GstElement *jpegenc; + + GST_DEBUG ("setup_jpegenc"); + jpegenc = gst_check_setup_element ("jpegenc"); + mysinkpad = gst_check_setup_sink_pad (jpegenc, sinktemplate, NULL); + mysrcpad = gst_check_setup_src_pad (jpegenc, &any_srctemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return jpegenc; +} + +static void +cleanup_jpegenc (GstElement * jpegenc) +{ + GST_DEBUG ("cleanup_jpegenc"); + gst_element_set_state (jpegenc, GST_STATE_NULL); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_sink_pad (jpegenc); + gst_check_teardown_src_pad (jpegenc); + gst_check_teardown_element (jpegenc); +} + +static GstBuffer * +create_video_buffer (GstCaps * caps) +{ + GstElement *pipeline; + GstElement *cf; + GstElement *sink; + GstBuffer *buffer; + + pipeline = + gst_parse_launch + ("videotestsrc num-buffers=1 ! capsfilter name=cf ! appsink name=sink", + NULL); + g_assert (pipeline != NULL); + + cf = gst_bin_get_by_name (GST_BIN (pipeline), "cf"); + sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); + + g_object_set (G_OBJECT (cf), "caps", caps, NULL); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + buffer = gst_app_sink_pull_buffer (GST_APP_SINK (sink)); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + gst_object_unref (sink); + gst_object_unref (cf); + return buffer; +} + + +GST_START_TEST (test_jpegenc_getcaps) +{ + GstElement *jpegenc; + GstPad *sinkpad; + GstCaps *caps; + GstStructure *structure; + gint fps_n; + gint fps_d; + const GValue *value; + + /* we are going to do some get caps to confirm it doesn't return non-subset + * caps */ + + jpegenc = setup_jpegenc (&any_sinktemplate); + sinkpad = gst_element_get_static_pad (jpegenc, "sink"); + /* this should assert if non-subset */ + caps = gst_pad_get_caps (sinkpad); + gst_caps_unref (caps); + gst_object_unref (sinkpad); + cleanup_jpegenc (jpegenc); + + jpegenc = setup_jpegenc (&jpeg_sinktemplate); + sinkpad = gst_element_get_static_pad (jpegenc, "sink"); + /* this should assert if non-subset */ + caps = gst_pad_get_caps (sinkpad); + gst_caps_unref (caps); + gst_object_unref (sinkpad); + cleanup_jpegenc (jpegenc); + + /* now use a more restricted one and check the resulting caps */ + jpegenc = setup_jpegenc (&jpeg_restrictive_sinktemplate); + sinkpad = gst_element_get_static_pad (jpegenc, "sink"); + /* this should assert if non-subset */ + caps = gst_pad_get_caps (sinkpad); + structure = gst_caps_get_structure (caps, 0); + + /* check the width */ + value = gst_structure_get_value (structure, "width"); + fail_unless (gst_value_get_int_range_min (value) == 100); + fail_unless (gst_value_get_int_range_max (value) == 200); + + fail_unless (gst_structure_get_fraction (structure, "framerate", &fps_n, + &fps_d)); + fail_unless (fps_n == 25); + fail_unless (fps_d == 1); + + gst_caps_unref (caps); + gst_object_unref (sinkpad); + cleanup_jpegenc (jpegenc); +} + +GST_END_TEST; + + +GST_START_TEST (test_jpegenc_different_caps) +{ + GstElement *jpegenc; + GstBuffer *buffer; + GstCaps *caps; + GstCaps *allowed_caps; + + /* now use a more restricted one and check the resulting caps */ + jpegenc = setup_jpegenc (&any_sinktemplate); + gst_element_set_state (jpegenc, GST_STATE_PLAYING); + + /* push first buffer with 800x600 resolution */ + caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, + 800, "height", G_TYPE_INT, 600, "framerate", + GST_TYPE_FRACTION, 1, 1, "format", GST_TYPE_FOURCC, + GST_MAKE_FOURCC ('I', '4', '2', '0'), NULL); + buffer = create_video_buffer (caps); + gst_caps_unref (caps); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + + /* check the allowed caps to see if a second buffer with a different + * caps could be negotiated */ + allowed_caps = gst_pad_get_allowed_caps (mysrcpad); + + /* the caps we want to negotiate to */ + caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, + 640, "height", G_TYPE_INT, 480, "framerate", + GST_TYPE_FRACTION, 1, 1, "format", GST_TYPE_FOURCC, + GST_MAKE_FOURCC ('I', '4', '2', '0'), NULL); + fail_unless (gst_caps_can_intersect (allowed_caps, caps)); + + /* push second buffer with 640x480 resolution */ + buffer = create_video_buffer (caps); + gst_caps_unref (caps); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + + gst_caps_unref (allowed_caps); + gst_element_set_state (jpegenc, GST_STATE_NULL); + cleanup_jpegenc (jpegenc); +} + +GST_END_TEST; + +static Suite * +jpegenc_suite (void) +{ + Suite *s = suite_create ("jpegenc"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_jpegenc_getcaps); + tcase_add_test (tc_chain, test_jpegenc_different_caps); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = jpegenc_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/level.c b/tests/check/elements/level.c new file mode 100644 index 0000000..2bb4eb7 --- /dev/null +++ b/tests/check/elements/level.c @@ -0,0 +1,326 @@ +/* GStreamer + * + * unit test for level + * + * Copyright (C) <2005> Thomas Vander Stichele + * + * 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 +#include + +#include + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define LEVEL_CAPS_TEMPLATE_STRING \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 8 ], " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) {8, 16}, " \ + "depth = (int) {8, 16}, " \ + "signed = (boolean) true" + +#define LEVEL_CAPS_STRING \ + "audio/x-raw-int, " \ + "rate = (int) 1000, " \ + "channels = (int) 2, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (boolean) true" + + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (LEVEL_CAPS_TEMPLATE_STRING) + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (LEVEL_CAPS_TEMPLATE_STRING) + ); + +/* takes over reference for outcaps */ +static GstElement * +setup_level (void) +{ + GstElement *level; + + GST_DEBUG ("setup_level"); + level = gst_check_setup_element ("level"); + mysrcpad = gst_check_setup_src_pad (level, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (level, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return level; +} + +static void +cleanup_level (GstElement * level) +{ + GST_DEBUG ("cleanup_level"); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (level); + gst_check_teardown_sink_pad (level); + gst_check_teardown_element (level); +} + + +GST_START_TEST (test_int16) +{ + GstElement *level; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + GstCaps *caps; + GstMessage *message; + const GstStructure *structure; + int i, j; + gint16 *data; + const GValue *list, *value; + GstClockTime endtime; + gdouble dB; + + level = setup_level (); + g_object_set (level, "message", TRUE, "interval", GST_SECOND / 10, NULL); + + fail_unless (gst_element_set_state (level, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* create a fake 0.1 sec buffer with a half-amplitude block signal */ + inbuffer = gst_buffer_new_and_alloc (400); + data = (gint16 *) GST_BUFFER_DATA (inbuffer); + for (j = 0; j < 200; ++j) { + *data = 16536; + ++data; + } + caps = gst_caps_from_string (LEVEL_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* create a bus to get the level message on */ + bus = gst_bus_new (); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_element_set_bus (level, bus); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); + ASSERT_OBJECT_REFCOUNT (message, "message", 1); + + fail_unless (message != NULL); + fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (level)); + fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); + structure = gst_message_get_structure (message); + fail_if (structure == NULL); + fail_unless_equals_string ((char *) gst_structure_get_name (structure), + "level"); + fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); + + /* block wave of half amplitude has -5.94 dB for rms, peak and decay */ + for (i = 0; i < 2; ++i) { + const gchar *fields[3] = { "rms", "peak", "decay" }; + for (j = 0; j < 3; ++j) { + list = gst_structure_get_value (structure, fields[j]); + value = gst_value_list_get_value (list, i); + dB = g_value_get_double (value); + GST_DEBUG ("%s is %lf", fields[j], dB); + fail_if (dB < -6.0); + fail_if (dB > -5.9); + } + } + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + /* clean up */ + /* flush current messages,and future state change messages */ + gst_bus_set_flushing (bus, TRUE); + + /* message has a ref to the element */ + ASSERT_OBJECT_REFCOUNT (level, "level", 2); + gst_message_unref (message); + ASSERT_OBJECT_REFCOUNT (level, "level", 1); + + gst_element_set_bus (level, NULL); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_object_unref (bus); + gst_buffer_unref (outbuffer); + fail_unless (gst_element_set_state (level, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + ASSERT_OBJECT_REFCOUNT (level, "level", 1); + cleanup_level (level); +} + +GST_END_TEST; + +GST_START_TEST (test_int16_panned) +{ + GstElement *level; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + GstCaps *caps; + GstMessage *message; + const GstStructure *structure; + int j; + gint16 *data; + const GValue *list, *value; + GstClockTime endtime; + gdouble dB; + const gchar *fields[3] = { "rms", "peak", "decay" }; + + level = setup_level (); + g_object_set (level, "message", TRUE, "interval", GST_SECOND / 10, NULL); + + fail_unless (gst_element_set_state (level, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* create a fake 0.1 sec buffer with a half-amplitude block signal */ + inbuffer = gst_buffer_new_and_alloc (400); + data = (gint16 *) GST_BUFFER_DATA (inbuffer); + for (j = 0; j < 100; ++j) { + *data = 0; + ++data; + *data = 16536; + ++data; + } + caps = gst_caps_from_string (LEVEL_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* create a bus to get the level message on */ + bus = gst_bus_new (); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_element_set_bus (level, bus); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); + ASSERT_OBJECT_REFCOUNT (message, "message", 1); + + fail_unless (message != NULL); + fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (level)); + fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); + structure = gst_message_get_structure (message); + fail_if (structure == NULL); + fail_unless_equals_string ((char *) gst_structure_get_name (structure), + "level"); + fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); + + /* silence has 0 dB for rms, peak and decay */ + for (j = 0; j < 3; ++j) { + list = gst_structure_get_value (structure, fields[j]); + value = gst_value_list_get_value (list, 0); + dB = g_value_get_double (value); + GST_DEBUG ("%s[0] is %lf", fields[j], dB); +#ifdef HAVE_ISINF + fail_unless (isinf (dB)); +#elif defined (HAVE_FPCLASS) + fail_unless (fpclass (dB) == FP_NINF); +#endif + } + /* block wave of half amplitude has -5.94 dB for rms, peak and decay */ + for (j = 0; j < 3; ++j) { + list = gst_structure_get_value (structure, fields[j]); + value = gst_value_list_get_value (list, 1); + dB = g_value_get_double (value); + GST_DEBUG ("%s[1] is %lf", fields[j], dB); + fail_if (dB < -6.0); + fail_if (dB > -5.9); + } + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + /* clean up */ + /* flush current messages,and future state change messages */ + gst_bus_set_flushing (bus, TRUE); + + /* message has a ref to the element */ + ASSERT_OBJECT_REFCOUNT (level, "level", 2); + gst_message_unref (message); + ASSERT_OBJECT_REFCOUNT (level, "level", 1); + + gst_element_set_bus (level, NULL); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_object_unref (bus); + gst_buffer_unref (outbuffer); + fail_unless (gst_element_set_state (level, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + ASSERT_OBJECT_REFCOUNT (level, "level", 1); + cleanup_level (level); +} + +GST_END_TEST; + +static Suite * +level_suite (void) +{ + Suite *s = suite_create ("level"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_int16); + tcase_add_test (tc_chain, test_int16_panned); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = level_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/matroskamux.c b/tests/check/elements/matroskamux.c new file mode 100644 index 0000000..bbc1862 --- /dev/null +++ b/tests/check/elements/matroskamux.c @@ -0,0 +1,470 @@ +/* GStreamer + * + * unit test for matroskamux + * + * Copyright (C) <2005> Michal Benes + * + * 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 + +#include +#include + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define AC3_CAPS_STRING "audio/x-ac3, " \ + "channels = (int) 1, " \ + "rate = (int) 8000" +#define VORBIS_CAPS_STRING "audio/x-vorbis, " \ + "channels = (int) 1, " \ + "rate = (int) 8000, " \ + "streamheader=(buffer)<10, 2020, 303030>" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska")); +static GstStaticPadTemplate srcvorbistemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VORBIS_CAPS_STRING)); + +static GstStaticPadTemplate srcac3template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (AC3_CAPS_STRING)); + + +static GstPad * +setup_src_pad (GstElement * element, + GstStaticPadTemplate * template, GstCaps * caps) +{ + GstPad *srcpad, *sinkpad; + + GST_DEBUG_OBJECT (element, "setting up sending pad"); + /* sending pad */ + srcpad = gst_pad_new_from_static_template (template, "src"); + fail_if (srcpad == NULL, "Could not create a srcpad"); + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); + gst_pad_set_active (srcpad, TRUE); + + if (!(sinkpad = gst_element_get_static_pad (element, "audio_%d"))) + sinkpad = gst_element_get_request_pad (element, "audio_%d"); + fail_if (sinkpad == NULL, "Could not get sink pad from %s", + GST_ELEMENT_NAME (element)); + /* references are owned by: 1) us, 2) matroskamux, 3) collect pads */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + if (caps) + fail_unless (gst_pad_set_caps (srcpad, caps)); + fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, + "Could not link source and %s sink pads", GST_ELEMENT_NAME (element)); + gst_object_unref (sinkpad); /* because we got it higher up */ + + /* references are owned by: 1) matroskamux, 2) collect pads */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); + + return srcpad; +} + +static void +teardown_src_pad (GstElement * element) +{ + GstPad *srcpad, *sinkpad; + + /* clean up floating src pad */ + if (!(sinkpad = gst_element_get_static_pad (element, "audio_0"))) + sinkpad = gst_element_get_request_pad (element, "audio_0"); + /* references are owned by: 1) us, 2) matroskamux, 3) collect pads */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + srcpad = gst_pad_get_peer (sinkpad); + + gst_pad_unlink (srcpad, sinkpad); + + /* references are owned by: 1) us, 2) matroskamux, 3) collect pads */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + gst_object_unref (sinkpad); + /* one more ref is held by element itself */ + + /* pad refs held by both creator and this function (through _get_peer) */ + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2); + gst_object_unref (srcpad); + gst_object_unref (srcpad); +} + +static GstPad * +setup_sink_pad (GstElement * element, GstStaticPadTemplate * template, + GstCaps * caps) +{ + GstPad *srcpad, *sinkpad; + + GST_DEBUG_OBJECT (element, "setting up receiving pad"); + /* receiving pad */ + sinkpad = gst_pad_new_from_static_template (template, "sink"); + + fail_if (sinkpad == NULL, "Could not create a sinkpad"); + gst_pad_set_active (sinkpad, TRUE); + + srcpad = gst_element_get_static_pad (element, "src"); + fail_if (srcpad == NULL, "Could not get source pad from %s", + GST_ELEMENT_NAME (element)); + if (caps) + fail_unless (gst_pad_set_caps (sinkpad, caps)); + gst_pad_set_chain_function (sinkpad, gst_check_chain_func); + + fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, + "Could not link %s source and sink pads", GST_ELEMENT_NAME (element)); + gst_object_unref (srcpad); /* because we got it higher up */ + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2); + + return sinkpad; +} + +static void +teardown_sink_pad (GstElement * element) +{ + GstPad *srcpad, *sinkpad; + + /* clean up floating sink pad */ + srcpad = gst_element_get_static_pad (element, "src"); + sinkpad = gst_pad_get_peer (srcpad); + gst_pad_unlink (srcpad, sinkpad); + + /* pad refs held by both creator and this function (through _get_pad) */ + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 3); + gst_object_unref (srcpad); + /* one more ref is held by element itself */ + + /* pad refs held by both creator and this function (through _get_peer) */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); + gst_object_unref (sinkpad); + gst_object_unref (sinkpad); +} + + +static GstElement * +setup_matroskamux (GstStaticPadTemplate * srctemplate) +{ + GstElement *matroskamux; + + GST_DEBUG ("setup_matroskamux"); + matroskamux = gst_check_setup_element ("matroskamux"); + g_object_set (matroskamux, "version", 1, NULL); + mysrcpad = setup_src_pad (matroskamux, srctemplate, NULL); + mysinkpad = setup_sink_pad (matroskamux, &sinktemplate, NULL); + + return matroskamux; +} + +static void +cleanup_matroskamux (GstElement * matroskamux) +{ + GST_DEBUG ("cleanup_matroskamux"); + gst_element_set_state (matroskamux, GST_STATE_NULL); + + teardown_src_pad (matroskamux); + teardown_sink_pad (matroskamux); + gst_check_teardown_element (matroskamux); +} + +static void +check_buffer_data (GstBuffer * buffer, void *data, size_t data_size) +{ + fail_unless (GST_BUFFER_SIZE (buffer) == data_size); + fail_unless (memcmp (data, GST_BUFFER_DATA (buffer), data_size) == 0); +} + +GST_START_TEST (test_ebml_header) +{ + GstElement *matroskamux; + GstBuffer *inbuffer, *outbuffer; + GstAdapter *adapter; + int num_buffers; + int i; + gint available; + guint8 data[] = + { 0x1a, 0x45, 0xdf, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x42, 0x82, 0x89, 0x6d, 0x61, 0x74, 0x72, 0x6f, 0x73, 0x6b, 0x61, 0x00, + 0x42, 0x87, 0x81, 0x01, + 0x42, 0x85, 0x81, 0x01 + }; + + matroskamux = setup_matroskamux (&srcac3template); + fail_unless (gst_element_set_state (matroskamux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1); + 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, + "expected at least 5 buffers, but got only %d", num_buffers); + + adapter = gst_adapter_new (); + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + buffers = g_list_remove (buffers, outbuffer); + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + + gst_adapter_push (adapter, outbuffer); + } + + available = gst_adapter_available (adapter); + fail_unless (available >= sizeof (data)); + outbuffer = gst_adapter_take_buffer (adapter, sizeof (data)); + g_object_unref (adapter); + + check_buffer_data (outbuffer, data, sizeof (data)); + gst_buffer_unref (outbuffer); + + cleanup_matroskamux (matroskamux); + g_list_free (buffers); + buffers = NULL; +} + +GST_END_TEST; + + +GST_START_TEST (test_vorbis_header) +{ + GstElement *matroskamux; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + int num_buffers; + int i; + gboolean vorbis_header_found = FALSE; + guint8 data[12] = + { 0x63, 0xa2, 0x89, 0x02, 0x01, 0x02, 0x10, 0x20, 0x20, 0x30, 0x30, + 0x30 + }; + + matroskamux = setup_matroskamux (&srcvorbistemplate); + fail_unless (gst_element_set_state (matroskamux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1); + caps = gst_caps_from_string (VORBIS_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + num_buffers = g_list_length (buffers); + + for (i = 0; i < num_buffers; ++i) { + gint j; + + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + buffers = g_list_remove (buffers, outbuffer); + + if (!vorbis_header_found && GST_BUFFER_SIZE (outbuffer) >= sizeof (data)) { + for (j = 0; j <= GST_BUFFER_SIZE (outbuffer) - sizeof (data); j++) { + if (memcmp (GST_BUFFER_DATA (outbuffer) + j, data, sizeof (data)) == 0) { + vorbis_header_found = TRUE; + break; + } + } + } + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + fail_unless (vorbis_header_found); + + cleanup_matroskamux (matroskamux); + g_list_free (buffers); + buffers = NULL; +} + +GST_END_TEST; + + +GST_START_TEST (test_block_group) +{ + GstElement *matroskamux; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + int num_buffers; + int i; + guint8 data0[] = { 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xa1, 0x85, + 0x81, 0x00, 0x01, 0x00 + }; + guint8 data1[] = { 0x42 }; + + matroskamux = setup_matroskamux (&srcac3template); + fail_unless (gst_element_set_state (matroskamux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* Generate the header */ + inbuffer = gst_buffer_new_and_alloc (1); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + caps = gst_caps_from_string (AC3_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + num_buffers = g_list_length (buffers); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + buffers = g_list_remove (buffers, outbuffer); + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + g_list_free (buffers); + buffers = NULL; + + /* Now push a buffer */ + inbuffer = gst_buffer_new_and_alloc (1); + GST_BUFFER_DATA (inbuffer)[0] = 0x42; + GST_BUFFER_TIMESTAMP (inbuffer) = 1000000; + caps = gst_caps_from_string (AC3_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + 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 >= 2); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + buffers = g_list_remove (buffers, outbuffer); + + switch (i) { + case 0: + check_buffer_data (outbuffer, data0, sizeof (data0)); + break; + case 1: + check_buffer_data (outbuffer, data1, sizeof (data1)); + break; + default: + break; + } + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + g_list_free (buffers); + buffers = NULL; + + cleanup_matroskamux (matroskamux); +} + +GST_END_TEST; + +GST_START_TEST (test_reset) +{ + GstElement *matroskamux; + GstBuffer *inbuffer; + GstBuffer *outbuffer; + int num_buffers; + int i; + + matroskamux = setup_matroskamux (&srcac3template); + fail_unless (gst_element_set_state (matroskamux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1); + 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, + "expected at least 1 buffer, but got only %d", num_buffers); + + fail_unless (gst_element_set_state (matroskamux, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + + fail_unless (gst_element_set_state (matroskamux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1); + 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 >= 2, + "expected at least 2 buffers, but got only %d", num_buffers); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + buffers = g_list_remove (buffers, outbuffer); + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + } + + cleanup_matroskamux (matroskamux); + g_list_free (buffers); + buffers = NULL; +} + +GST_END_TEST; + +static Suite * +matroskamux_suite (void) +{ + Suite *s = suite_create ("matroskamux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_ebml_header); + tcase_add_test (tc_chain, test_vorbis_header); + tcase_add_test (tc_chain, test_block_group); + tcase_add_test (tc_chain, test_reset); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = matroskamux_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/matroskaparse.c b/tests/check/elements/matroskaparse.c new file mode 100644 index 0000000..e1d5e41 --- /dev/null +++ b/tests/check/elements/matroskaparse.c @@ -0,0 +1,118 @@ +/* GStreamer unit tests for matroskaparse + * Copyright (C) 2011 Tim-Philipp Müller + * + * 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 + +#include + +static void +run_check_for_file (const gchar * file_name, gboolean push_mode) +{ + GstStateChangeReturn state_ret; + GstMessage *msg; + GstElement *src, *sep, *sink, *matroskaparse, *pipeline; + GstBus *bus; + gchar *path; + + pipeline = gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL, "Failed to create pipeline!"); + + bus = gst_element_get_bus (pipeline); + + src = gst_element_factory_make ("filesrc", "filesrc"); + fail_unless (src != NULL, "Failed to create 'filesrc' element!"); + + if (push_mode) { + sep = gst_element_factory_make ("queue", "queue"); + fail_unless (sep != NULL, "Failed to create 'queue' element"); + } else { + sep = gst_element_factory_make ("identity", "identity"); + fail_unless (sep != NULL, "Failed to create 'identity' element"); + } + + matroskaparse = gst_element_factory_make ("matroskaparse", "matroskaparse"); + fail_unless (matroskaparse != NULL, "Failed to create matroskaparse element"); + + sink = gst_element_factory_make ("fakesink", "fakesink"); + fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); + + gst_bin_add_many (GST_BIN (pipeline), src, sep, matroskaparse, sink, NULL); + + fail_unless (gst_element_link (src, sep)); + fail_unless (gst_element_link (sep, matroskaparse)); + fail_unless (gst_element_link (matroskaparse, sink)); + + path = g_build_filename (GST_TEST_FILES_PATH, file_name, NULL); + GST_LOG ("reading file '%s'", path); + g_object_set (src, "location", path, NULL); + + state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + if (state_ret == GST_STATE_CHANGE_ASYNC) { + GST_LOG ("waiting for pipeline to reach PAUSED state"); + state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); + fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); + } + + GST_LOG ("PAUSED, let's play a little.."); + state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + + msg = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); + fail_unless (msg != NULL, "Expected EOS message on bus! (%s)", file_name); + + gst_message_unref (msg); + gst_object_unref (bus); + + fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), + GST_STATE_CHANGE_SUCCESS); + gst_object_unref (pipeline); + + g_free (path); +} + +GST_START_TEST (test_parse_file_pull) +{ + run_check_for_file ("pinknoise-vorbis.mkv", TRUE); +} + +GST_END_TEST; + +GST_START_TEST (test_parse_file_push) +{ + run_check_for_file ("pinknoise-vorbis.mkv", FALSE); +} + +GST_END_TEST; + +static Suite * +matroskaparse_suite (void) +{ + Suite *s = suite_create ("matroskaparse"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_parse_file_pull); + tcase_add_test (tc_chain, test_parse_file_push); + + return s; +} + +GST_CHECK_MAIN (matroskaparse) diff --git a/tests/check/elements/mpegaudioparse.c b/tests/check/elements/mpegaudioparse.c new file mode 100644 index 0000000..2bb2699 --- /dev/null +++ b/tests/check/elements/mpegaudioparse.c @@ -0,0 +1,170 @@ +/* + * GStreamer + * + * unit test for aacparse + * + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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 +#include "parser.h" + +#define SRC_CAPS_TMPL "audio/mpeg, parsed=(boolean)false, mpegversion=(int)1" +#define SINK_CAPS_TMPL "audio/mpeg, parsed=(boolean)true, mpegversion=(int)1" + +GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SINK_CAPS_TMPL) + ); + +GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_CAPS_TMPL) + ); + +/* some data */ +static guint8 mp3_frame[384] = { + 0xff, 0xfb, 0x94, 0xc4, 0xff, 0x83, 0xc0, 0x00, + 0x01, 0xa4, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x34, 0x80, 0x00, 0x00, 0x04, 0x00, +}; + +static guint8 garbage_frame[] = { + 0xff, 0xff, 0xff, 0xff, 0xff +}; + + +GST_START_TEST (test_parse_normal) +{ + gst_parser_test_normal (mp3_frame, sizeof (mp3_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_drain_single) +{ + gst_parser_test_drain_single (mp3_frame, sizeof (mp3_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_drain_garbage) +{ + gst_parser_test_drain_garbage (mp3_frame, sizeof (mp3_frame), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_split) +{ + gst_parser_test_split (mp3_frame, sizeof (mp3_frame)); +} + +GST_END_TEST; + + +GST_START_TEST (test_parse_skip_garbage) +{ + gst_parser_test_skip_garbage (mp3_frame, sizeof (mp3_frame), + garbage_frame, sizeof (garbage_frame)); +} + +GST_END_TEST; + + +#define structure_get_int(s,f) \ + (g_value_get_int(gst_structure_get_value(s,f))) +#define fail_unless_structure_field_int_equals(s,field,num) \ + fail_unless_equals_int (structure_get_int(s,field), num) + +GST_START_TEST (test_parse_detect_stream) +{ + GstStructure *s; + GstCaps *caps; + + caps = gst_parser_test_get_output_caps (mp3_frame, sizeof (mp3_frame), NULL); + + fail_unless (caps != NULL); + + GST_LOG ("mpegaudio output caps: %" GST_PTR_FORMAT, caps); + s = gst_caps_get_structure (caps, 0); + fail_unless (gst_structure_has_name (s, "audio/mpeg")); + fail_unless_structure_field_int_equals (s, "mpegversion", 1); + fail_unless_structure_field_int_equals (s, "layer", 3); + fail_unless_structure_field_int_equals (s, "channels", 1); + fail_unless_structure_field_int_equals (s, "rate", 48000); + + gst_caps_unref (caps); +} + +GST_END_TEST; + + +static Suite * +mpegaudioparse_suite (void) +{ + Suite *s = suite_create ("mpegaudioparse"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_parse_normal); + tcase_add_test (tc_chain, test_parse_drain_single); + tcase_add_test (tc_chain, test_parse_drain_garbage); + tcase_add_test (tc_chain, test_parse_split); + tcase_add_test (tc_chain, test_parse_skip_garbage); + tcase_add_test (tc_chain, test_parse_detect_stream); + + return s; +} + + +/* + * TODO: + * - Both push- and pull-modes need to be tested + * * Pull-mode & EOS + */ + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = mpegaudioparse_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + /* init test context */ + ctx_factory = "mpegaudioparse"; + ctx_sink_template = &sinktemplate; + ctx_src_template = &srctemplate; + + srunner_run_all (sr, CK_NORMAL); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + + return nf; +} diff --git a/tests/check/elements/multifile.c b/tests/check/elements/multifile.c new file mode 100644 index 0000000..0a4849a --- /dev/null +++ b/tests/check/elements/multifile.c @@ -0,0 +1,283 @@ +/* GStreamer unit test for multifile plugin + * + * Copyright (C) 2007 David A. Schleef + * + * 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 +#include + +#include +#include +#include +#include + +static void +run_pipeline (GstElement * pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PAUSED); + gst_element_get_state (pipeline, NULL, NULL, -1); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + /* FIXME too lazy */ + g_usleep (1000000); + gst_element_set_state (pipeline, GST_STATE_NULL); +} + +#if !GLIB_CHECK_VERSION(2,30,0) +static gchar * +g_mkdtemp (gchar * template) +{ + gchar *tmpdir; + + tmpdir = mkdtemp (template); + if (tmpdir == NULL) { + g_free (template); + } + return tmpdir; +} +#endif + +GST_START_TEST (test_multifilesink_key_frame) +{ + GstElement *pipeline; + GstElement *mfs; + int i; + const gchar *tmpdir; + gchar *my_tmpdir; + gchar *template; + gchar *mfs_pattern; + + tmpdir = g_get_tmp_dir (); + template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL); + my_tmpdir = g_mkdtemp (template); + fail_if (my_tmpdir == NULL); + + pipeline = + gst_parse_launch + ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink name=mfs", + NULL); + fail_if (pipeline == NULL); + mfs = gst_bin_get_by_name (GST_BIN (pipeline), "mfs"); + fail_if (mfs == NULL); + mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); + g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL); + g_object_unref (mfs); + run_pipeline (pipeline); + gst_object_unref (pipeline); + + for (i = 0; i < 10; i++) { + char *s; + + s = g_strdup_printf (mfs_pattern, i); + fail_if (g_remove (s) != 0); + g_free (s); + } + fail_if (g_remove (my_tmpdir) != 0); + + g_free (mfs_pattern); + g_free (my_tmpdir); +} + +GST_END_TEST; + +GST_START_TEST (test_multifilesink_max_files) +{ + GstElement *pipeline; + GstElement *mfs; + int i; + const gchar *tmpdir; + gchar *my_tmpdir; + gchar *template; + gchar *mfs_pattern; + + tmpdir = g_get_tmp_dir (); + template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL); + my_tmpdir = g_mkdtemp (template); + fail_if (my_tmpdir == NULL); + + pipeline = + gst_parse_launch + ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink name=mfs", + NULL); + fail_if (pipeline == NULL); + mfs = gst_bin_get_by_name (GST_BIN (pipeline), "mfs"); + fail_if (mfs == NULL); + mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); + g_object_set (G_OBJECT (mfs), "location", mfs_pattern, "max-files", 3, NULL); + g_object_unref (mfs); + run_pipeline (pipeline); + gst_object_unref (pipeline); + + for (i = 0; i < 7; i++) { + char *s; + + s = g_strdup_printf (mfs_pattern, i); + fail_unless (g_remove (s) != 0); + g_free (s); + } + for (i = 7; i < 10; i++) { + char *s; + + s = g_strdup_printf (mfs_pattern, i); + fail_if (g_remove (s) != 0); + g_free (s); + } + fail_if (g_remove (my_tmpdir) != 0); + + g_free (mfs_pattern); + g_free (my_tmpdir); +} + +GST_END_TEST; + +GST_START_TEST (test_multifilesink_key_unit) +{ + GstElement *mfs; + int i; + const gchar *tmpdir; + gchar *my_tmpdir; + gchar *template; + gchar *mfs_pattern; + GstBuffer *buf; + GstPad *sink; + + tmpdir = g_get_tmp_dir (); + template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL); + my_tmpdir = g_mkdtemp (template); + fail_if (my_tmpdir == NULL); + + mfs = gst_element_factory_make ("multifilesink", NULL); + fail_if (mfs == NULL); + mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); + g_object_set (G_OBJECT (mfs), "location", mfs_pattern, "next-file", 3, NULL); + fail_if (gst_element_set_state (mfs, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + sink = gst_element_get_static_pad (mfs, "sink"); + buf = gst_buffer_new_and_alloc (4); + + memcpy (GST_BUFFER_DATA (buf), "foo", 4); + fail_if (gst_pad_chain (sink, gst_buffer_ref (buf)) != GST_FLOW_OK); + + memcpy (GST_BUFFER_DATA (buf), "bar", 4); + fail_if (gst_pad_chain (sink, gst_buffer_ref (buf)) != GST_FLOW_OK); + + fail_unless (gst_pad_send_event (sink, + gst_video_event_new_downstream_force_key_unit (GST_CLOCK_TIME_NONE, + GST_CLOCK_TIME_NONE, GST_CLOCK_TIME_NONE, TRUE, 1))); + + memcpy (GST_BUFFER_DATA (buf), "baz", 4); + fail_if (gst_pad_chain (sink, buf) != GST_FLOW_OK); + + fail_if (gst_element_set_state (mfs, + GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE); + + for (i = 0; i < 2; i++) { + char *s; + + s = g_strdup_printf (mfs_pattern, i); + fail_if (g_remove (s) != 0); + g_free (s); + } + fail_if (g_remove (my_tmpdir) != 0); + + g_free (mfs_pattern); + g_free (my_tmpdir); + gst_object_unref (sink); + gst_object_unref (mfs); +} + +GST_END_TEST; + +GST_START_TEST (test_multifilesrc) +{ + GstElement *pipeline; + GstElement *mfs; + int i; + const gchar *tmpdir; + gchar *my_tmpdir; + gchar *template; + gchar *mfs_pattern; + + tmpdir = g_get_tmp_dir (); + template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL); + my_tmpdir = g_mkdtemp (template); + fail_if (my_tmpdir == NULL); + + pipeline = + gst_parse_launch + ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink name=mfs", + NULL); + fail_if (pipeline == NULL); + mfs = gst_bin_get_by_name (GST_BIN (pipeline), "mfs"); + fail_if (mfs == NULL); + mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); + g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL); + g_free (mfs_pattern); + g_object_unref (mfs); + run_pipeline (pipeline); + gst_object_unref (pipeline); + + pipeline = + gst_parse_launch + ("multifilesrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=10/1 ! fakesink", + NULL); + fail_if (pipeline == NULL); + mfs = gst_bin_get_by_name (GST_BIN (pipeline), "multifilesrc0"); + fail_if (mfs == NULL); + mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); + g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL); + g_object_unref (mfs); + run_pipeline (pipeline); + gst_object_unref (pipeline); + + for (i = 0; i < 10; i++) { + char *s; + + s = g_strdup_printf (mfs_pattern, i); + fail_if (g_remove (s) != 0); + g_free (s); + } + fail_if (g_remove (my_tmpdir) != 0); + + g_free (mfs_pattern); + g_free (my_tmpdir); +} + +GST_END_TEST; + +static Suite * +libvisual_suite (void) +{ + Suite *s = suite_create ("multifile"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + + tcase_add_test (tc_chain, test_multifilesink_key_frame); + tcase_add_test (tc_chain, test_multifilesink_max_files); + tcase_add_test (tc_chain, test_multifilesink_key_unit); + tcase_add_test (tc_chain, test_multifilesrc); + + return s; +} + +GST_CHECK_MAIN (libvisual); diff --git a/tests/check/elements/parser.c b/tests/check/elements/parser.c new file mode 100644 index 0000000..4da658b --- /dev/null +++ b/tests/check/elements/parser.c @@ -0,0 +1,436 @@ +/* + * GStreamer + * + * unit test for (audio) parser + * + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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 +#include "elements/parser.h" + + +/* context state variables */ +const gchar *ctx_factory; +GstStaticPadTemplate *ctx_sink_template; +GstStaticPadTemplate *ctx_src_template; +GstCaps *ctx_input_caps; +GstCaps *ctx_output_caps; +guint ctx_discard = 0; +datablob ctx_headers[MAX_HEADERS] = { {NULL, 0}, }; + +gboolean ctx_no_metadata = FALSE; + +/* helper variables */ +GList *current_buf = NULL; + +GstPad *srcpad, *sinkpad; +guint dataoffset = 0; +GstClockTime ts_counter = 0; +gint64 offset_counter = 0; +guint buffer_counter = 0; + +typedef struct +{ + guint discard; + guint buffers_before_offset_skip; + guint offset_skip_amount; + const guint8 *data_to_verify; + guint data_to_verify_size; + GstCaps *caps; + gboolean no_metadata; +} buffer_verify_data_s; + +/* takes a copy of the passed buffer data */ +static GstBuffer * +buffer_new (const unsigned char *buffer_data, guint size) +{ + GstBuffer *buffer; + + buffer = gst_buffer_new_and_alloc (size); + if (buffer_data) { + memcpy (GST_BUFFER_DATA (buffer), buffer_data, size); + } else { + guint i; + /* Create a recognizable pattern (loop 0x00 -> 0xff) in the data block */ + for (i = 0; i < size; i++) { + GST_BUFFER_DATA (buffer)[i] = i % 0x100; + } + } + + gst_buffer_set_caps (buffer, GST_PAD_CAPS (srcpad)); + GST_BUFFER_OFFSET (buffer) = dataoffset; + dataoffset += size; + return buffer; +} + +/* + * Adds buffer sizes together. + */ +static void +buffer_count_size (void *buffer, void *user_data) +{ + guint *sum = (guint *) user_data; + *sum += GST_BUFFER_SIZE (buffer); +} + +/* + * Verify that given buffer contains predefined ADTS frame. + */ +static void +buffer_verify_data (void *buffer, void *user_data) +{ + buffer_verify_data_s *vdata; + + if (!user_data) { + return; + } + + vdata = (buffer_verify_data_s *) user_data; + + GST_DEBUG ("discard: %d", vdata->discard); + if (vdata->discard) { + buffer_counter++; + if (buffer_counter == vdata->discard) { + buffer_counter = 0; + vdata->discard = 0; + } + return; + } + + fail_unless (GST_BUFFER_SIZE (buffer) == vdata->data_to_verify_size); + fail_unless (memcmp (GST_BUFFER_DATA (buffer), vdata->data_to_verify, + vdata->data_to_verify_size) == 0); + + if (vdata->buffers_before_offset_skip) { + /* This is for skipping the garbage in some test cases */ + if (buffer_counter == vdata->buffers_before_offset_skip) { + offset_counter += vdata->offset_skip_amount; + } + } + if (!vdata->no_metadata) { + fail_unless (GST_BUFFER_TIMESTAMP (buffer) == ts_counter); + fail_unless (GST_BUFFER_DURATION (buffer) != 0); + fail_unless (GST_BUFFER_OFFSET (buffer) == offset_counter); + } + + if (vdata->caps) { + GST_LOG ("%" GST_PTR_FORMAT " = %" GST_PTR_FORMAT " ?", + GST_BUFFER_CAPS (buffer), vdata->caps); + fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), vdata->caps)); + } + + ts_counter += GST_BUFFER_DURATION (buffer); + offset_counter += GST_BUFFER_SIZE (buffer); + buffer_counter++; +} + +static GstElement * +setup_element (const gchar * factory, GstStaticPadTemplate * sink_template, + GstCaps * sink_caps, GstStaticPadTemplate * src_template, + GstCaps * src_caps) +{ + GstElement *element; + GstBus *bus; + + element = gst_check_setup_element (factory); + srcpad = gst_check_setup_src_pad (element, src_template, src_caps); + sinkpad = gst_check_setup_sink_pad (element, sink_template, sink_caps); + gst_pad_set_active (srcpad, TRUE); + gst_pad_set_active (sinkpad, TRUE); + + bus = gst_bus_new (); + gst_element_set_bus (element, bus); + + fail_unless (gst_element_set_state (element, + GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, + "could not set to playing"); + + ts_counter = offset_counter = buffer_counter = 0; + buffers = NULL; + return element; +} + +static void +cleanup_element (GstElement * element) +{ + GstBus *bus; + + /* Free parsed buffers */ + gst_check_drop_buffers (); + + bus = GST_ELEMENT_BUS (element); + gst_bus_set_flushing (bus, TRUE); + gst_object_unref (bus); + + gst_pad_set_active (srcpad, FALSE); + gst_pad_set_active (sinkpad, FALSE); + gst_check_teardown_src_pad (element); + gst_check_teardown_sink_pad (element); + gst_check_teardown_element (element); +} + +/* inits a standard test */ +void +gst_parser_test_init (GstParserTest * ptest, guint8 * data, guint size, + guint num) +{ + /* need these */ + fail_unless (ctx_factory != NULL); + fail_unless (ctx_src_template != NULL); + fail_unless (ctx_sink_template != NULL); + + /* basics */ + memset (ptest, 0, sizeof (*ptest)); + ptest->factory = ctx_factory; + ptest->sink_template = ctx_sink_template; + ptest->src_template = ctx_src_template; + ptest->framed = TRUE; + /* could be NULL if not relevant/needed */ + ptest->src_caps = ctx_input_caps; + ptest->sink_caps = ctx_output_caps; + memcpy (ptest->headers, ctx_headers, sizeof (ptest->headers)); + ptest->discard = ctx_discard; + /* some data that pleases caller */ + ptest->series[0].data = data; + ptest->series[0].size = size; + ptest->series[0].num = num; + ptest->series[0].fpb = 1; + ptest->series[1].fpb = 1; + ptest->series[2].fpb = 1; + ptest->no_metadata = ctx_no_metadata; +} + +/* + * Test if the parser pushes clean data properly. + */ +void +gst_parser_test_run (GstParserTest * test, GstCaps ** out_caps) +{ + buffer_verify_data_s vdata = { 0, 0, 0, NULL, 0, NULL, FALSE }; + GstElement *element; + GstBuffer *buffer = NULL; + GstCaps *src_caps; + guint i, j, k; + guint frames = 0, size = 0; + + element = setup_element (test->factory, test->sink_template, NULL, + test->src_template, test->src_caps); + + /* push some setup headers */ + for (j = 0; j < G_N_ELEMENTS (test->headers) && test->headers[j].data; j++) { + buffer = buffer_new (test->headers[j].data, test->headers[j].size); + fail_unless_equals_int (gst_pad_push (srcpad, buffer), GST_FLOW_OK); + } + + for (j = 0; j < 3; j++) { + for (i = 0; i < test->series[j].num; i++) { + /* sanity enforcing */ + for (k = 0; k < MAX (1, test->series[j].fpb); k++) { + if (!k) + buffer = buffer_new (test->series[j].data, test->series[j].size); + else { + GstCaps *caps = gst_buffer_get_caps (buffer); + + buffer = gst_buffer_join (buffer, + buffer_new (test->series[j].data, test->series[j].size)); + if (caps) { + gst_buffer_set_caps (buffer, caps); + gst_caps_unref (caps); + } + } + } + fail_unless_equals_int (gst_pad_push (srcpad, buffer), GST_FLOW_OK); + if (j == 0) + vdata.buffers_before_offset_skip++; + else if (j == 1) + vdata.offset_skip_amount += test->series[j].size * test->series[j].fpb; + if (j != 1) { + frames += test->series[j].fpb; + size += test->series[j].size * test->series[j].fpb; + } + } + } + gst_pad_push_event (srcpad, gst_event_new_eos ()); + + if (G_LIKELY (test->framed)) + fail_unless_equals_int (g_list_length (buffers) - test->discard, frames); + + /* if all frames are identical, do extended test, + * otherwise only verify total data size */ + if (test->series[0].data && (!test->series[2].size || + (test->series[0].size == test->series[2].size && test->series[2].data + && !memcmp (test->series[0].data, test->series[2].data, + test->series[0].size)))) { + vdata.data_to_verify = test->series[0].data; + vdata.data_to_verify_size = test->series[0].size; + vdata.caps = test->sink_caps; + vdata.discard = test->discard; + vdata.no_metadata = test->no_metadata; + g_list_foreach (buffers, buffer_verify_data, &vdata); + } else { + guint datasum = 0; + + g_list_foreach (buffers, buffer_count_size, &datasum); + size -= test->dropped; + fail_unless_equals_int (datasum, size); + } + + src_caps = gst_pad_get_negotiated_caps (sinkpad); + GST_LOG ("output caps: %" GST_PTR_FORMAT, src_caps); + + if (test->sink_caps) { + GST_LOG ("%" GST_PTR_FORMAT " = %" GST_PTR_FORMAT " ?", src_caps, + test->sink_caps); + fail_unless (gst_caps_is_equal (src_caps, test->sink_caps)); + } + + if (out_caps) + *out_caps = src_caps; + else + gst_caps_unref (src_caps); + + cleanup_element (element); +} + +/* + * Test if the parser pushes clean data properly. + */ +void +gst_parser_test_normal (guint8 * data, guint size) +{ + GstParserTest ptest; + + gst_parser_test_init (&ptest, data, size, 10); + gst_parser_test_run (&ptest, NULL); +} + +/* + * Test if parser drains its buffers properly. Even one single frame + * should be drained and pushed forward when EOS occurs. This single frame + * case is special, since normally the parser needs more data to be sure + * about stream format. But it should still push the frame forward in EOS. + */ +void +gst_parser_test_drain_single (guint8 * data, guint size) +{ + GstParserTest ptest; + + gst_parser_test_init (&ptest, data, size, 1); + gst_parser_test_run (&ptest, NULL); +} + +/* + * Make sure that parser does not drain garbage when EOS occurs. + */ +void +gst_parser_test_drain_garbage (guint8 * data, guint size, guint8 * garbage, + guint gsize) +{ + GstParserTest ptest; + + /* provide enough initial frames since it may take some parsers some + * time to be convinced of proper sync */ + gst_parser_test_init (&ptest, data, size, 10); + ptest.series[1].data = garbage; + ptest.series[1].size = gsize; + ptest.series[1].num = 1; + gst_parser_test_run (&ptest, NULL); +} + +/* + * Test if parser splits a buffer that contains two frames into two + * separate buffers properly. + */ +void +gst_parser_test_split (guint8 * data, guint size) +{ + GstParserTest ptest; + + gst_parser_test_init (&ptest, data, size, 10); + ptest.series[0].fpb = 2; + gst_parser_test_run (&ptest, NULL); +} + +/* + * Test if the parser skips garbage between frames properly. + */ +void +gst_parser_test_skip_garbage (guint8 * data, guint size, guint8 * garbage, + guint gsize) +{ + GstParserTest ptest; + + gst_parser_test_init (&ptest, data, size, 10); + ptest.series[1].data = garbage; + ptest.series[1].size = gsize; + ptest.series[1].num = 1; + ptest.series[2].data = data; + ptest.series[2].size = size; + ptest.series[2].num = 10; + gst_parser_test_run (&ptest, NULL); +} + +/* + * Test if the src caps are set according to stream format. + */ +void +gst_parser_test_output_caps (guint8 * data, guint size, + const gchar * input_caps, const gchar * output_caps) +{ + GstParserTest ptest; + + gst_parser_test_init (&ptest, data, size, 10); + if (input_caps) { + ptest.src_caps = gst_caps_from_string (input_caps); + fail_unless (ptest.src_caps != NULL); + } + if (output_caps) { + ptest.sink_caps = gst_caps_from_string (output_caps); + fail_unless (ptest.sink_caps != NULL); + } + gst_parser_test_run (&ptest, NULL); + if (ptest.sink_caps) + gst_caps_unref (ptest.sink_caps); + if (ptest.src_caps) + gst_caps_unref (ptest.src_caps); +} + +/* + * Test if the src caps are set according to stream format. + */ +GstCaps * +gst_parser_test_get_output_caps (guint8 * data, guint size, + const gchar * input_caps) +{ + GstParserTest ptest; + GstCaps *out_caps; + + gst_parser_test_init (&ptest, data, size, 10); + if (input_caps) { + ptest.src_caps = gst_caps_from_string (input_caps); + fail_unless (ptest.src_caps != NULL); + } + gst_parser_test_run (&ptest, &out_caps); + if (ptest.src_caps) + gst_caps_unref (ptest.src_caps); + + return out_caps; +} diff --git a/tests/check/elements/parser.h b/tests/check/elements/parser.h new file mode 100644 index 0000000..470f594 --- /dev/null +++ b/tests/check/elements/parser.h @@ -0,0 +1,95 @@ +/* + * GStreamer + * + * unit test for (audio) parser + * + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * Contact: Stefan Kost + * + * 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 + +#define MAX_HEADERS 10 + +typedef struct { + guint8 *data; + guint size; +} datablob; + +/* context state variables; to be set by test using this helper */ +/* mandatory */ +extern const gchar *ctx_factory; +extern GstStaticPadTemplate *ctx_sink_template; +extern GstStaticPadTemplate *ctx_src_template; +/* optional */ +extern GstCaps *ctx_input_caps; +extern GstCaps *ctx_output_caps; +extern guint ctx_discard; +extern datablob ctx_headers[MAX_HEADERS]; +extern gboolean ctx_no_metadata; + +/* no refs taken/kept, all up to caller */ +typedef struct +{ + const gchar *factory; + GstStaticPadTemplate *sink_template; + GstStaticPadTemplate *src_template; + /* caps that go into element */ + GstCaps *src_caps; + /* optional: output caps to verify */ + GstCaps *sink_caps; + /* initial headers */ + datablob headers[MAX_HEADERS]; + /* initial (header) output to forego checking */ + guint discard; + /* series of buffers; middle series considered garbage */ + struct { + /* data and size */ + guint8 *data; + guint size; + /* num of frames with above data per buffer */ + guint fpb; + /* num of buffers */ + guint num; + } series[3]; + /* sigh, weird cases */ + gboolean framed; + guint dropped; + gboolean no_metadata; +} GstParserTest; + +void gst_parser_test_init (GstParserTest * ptest, guint8 * data, guint size, guint num); + +void gst_parser_test_run (GstParserTest * test, GstCaps ** out_caps); + +void gst_parser_test_normal (guint8 *data, guint size); + +void gst_parser_test_drain_single (guint8 *data, guint size); + +void gst_parser_test_drain_garbage (guint8 *data, guint size, guint8 *garbage, guint gsize); + +void gst_parser_test_split (guint8 *data, guint size); + +void gst_parser_test_skip_garbage (guint8 *data, guint size, guint8 *garbage, guint gsize); + +void gst_parser_test_output_caps (guint8 *data, guint size, const gchar * input_caps, + const gchar * output_caps); + +GstCaps *gst_parser_test_get_output_caps (guint8 *data, guint size, const gchar * input_caps); + diff --git a/tests/check/elements/qtmux.c b/tests/check/elements/qtmux.c new file mode 100644 index 0000000..a9364c9 --- /dev/null +++ b/tests/check/elements/qtmux.c @@ -0,0 +1,899 @@ +/* GStreamer + * + * unit test for qtmux + * + * Copyright (C) <2008> Mark Nauwelaerts + * + * 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 +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include + +#include +#include + +/* 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 AUDIO_CAPS_STRING "audio/mpeg, " \ + "mpegversion = (int) 1, " \ + "layer = (int) 3, " \ + "channels = (int) 2, " \ + "rate = (int) 48000" + +#define AUDIO_AAC_CAPS_STRING "audio/mpeg, " \ + "mpegversion=(int)4, " \ + "channels=(int)1, " \ + "rate=(int)44100, " \ + "stream-format=(string)raw, " \ + "level=(string)2, " \ + "base-profile=(string)lc, " \ + "profile=(string)lc, " \ + "codec_data=(buffer)1208" + +#define VIDEO_CAPS_STRING "video/mpeg, " \ + "mpegversion = (int) 4, " \ + "systemstream = (boolean) false, " \ + "width = (int) 384, " \ + "height = (int) 288, " \ + "framerate = (fraction) 25/1" + +#define VIDEO_CAPS_H264_STRING "video/x-h264, " \ + "width=(int)320, " \ + "height=(int)240, " \ + "framerate=(fraction)30/1, " \ + "pixel-aspect-ratio=(fraction)1/1, " \ + "codec_data=(buffer)01640014ffe1001867640014a" \ + "cd94141fb0110000003001773594000f14299600" \ + "1000568ebecb22c, " \ + "stream-format=(string)avc, " \ + "alignment=(string)au, " \ + "level=(string)2, " \ + "profile=(string)high" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/quicktime")); +static GstStaticPadTemplate srcvideotemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CAPS_STRING)); + +static GstStaticPadTemplate srcvideoh264template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CAPS_H264_STRING)); + +static GstStaticPadTemplate srcaudiotemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (AUDIO_CAPS_STRING)); + +static GstStaticPadTemplate srcaudioaactemplate = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (AUDIO_AAC_CAPS_STRING)); + +/* setup and teardown needs some special handling for muxer */ +static GstPad * +setup_src_pad (GstElement * element, + GstStaticPadTemplate * template, GstCaps * caps, const gchar * sinkname) +{ + GstPad *srcpad, *sinkpad; + + GST_DEBUG_OBJECT (element, "setting up sending pad"); + /* sending pad */ + srcpad = gst_pad_new_from_static_template (template, "src"); + fail_if (srcpad == NULL, "Could not create a srcpad"); + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); + + if (!(sinkpad = gst_element_get_static_pad (element, sinkname))) + sinkpad = gst_element_get_request_pad (element, sinkname); + fail_if (sinkpad == NULL, "Could not get sink pad from %s", + GST_ELEMENT_NAME (element)); + /* references are owned by: 1) us, 2) qtmux, 3) collect pads */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + if (caps) + fail_unless (gst_pad_set_caps (srcpad, caps)); + fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, + "Could not link source and %s sink pads", GST_ELEMENT_NAME (element)); + gst_object_unref (sinkpad); /* because we got it higher up */ + + /* references are owned by: 1) qtmux, 2) collect pads */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); + + return srcpad; +} + +static void +teardown_src_pad (GstPad * srcpad) +{ + GstPad *sinkpad; + + /* clean up floating src pad */ + sinkpad = gst_pad_get_peer (srcpad); + fail_if (sinkpad == NULL); + /* pad refs held by 1) qtmux 2) collectpads and 3) us (through _get_peer) */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + + gst_pad_unlink (srcpad, sinkpad); + + /* after unlinking, pad refs still held by + * 1) qtmux and 2) collectpads and 3) us (through _get_peer) */ + ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); + gst_object_unref (sinkpad); + /* one more ref is held by element itself */ + + /* pad refs held by creator */ + ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); + gst_object_unref (srcpad); +} + +static GstElement * +setup_qtmux (GstStaticPadTemplate * srctemplate, const gchar * sinkname) +{ + GstElement *qtmux; + + GST_DEBUG ("setup_qtmux"); + qtmux = gst_check_setup_element ("qtmux"); + mysrcpad = setup_src_pad (qtmux, srctemplate, NULL, sinkname); + mysinkpad = gst_check_setup_sink_pad (qtmux, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return qtmux; +} + +static void +cleanup_qtmux (GstElement * qtmux, const gchar * sinkname) +{ + GST_DEBUG ("cleanup_qtmux"); + gst_element_set_state (qtmux, GST_STATE_NULL); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + teardown_src_pad (mysrcpad); + gst_check_teardown_sink_pad (qtmux); + gst_check_teardown_element (qtmux); +} + +static void +check_qtmux_pad (GstStaticPadTemplate * srctemplate, const gchar * sinkname, + guint32 dts_method) +{ + GstElement *qtmux; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + int num_buffers; + int i; + guint8 data0[12] = "\000\000\000\024ftypqt "; + guint8 data1[8] = "\000\000\000\001mdat"; + guint8 data2[4] = "moov"; + + qtmux = setup_qtmux (srctemplate, sinkname); + g_object_set (qtmux, "dts-method", dts_method, NULL); + fail_unless (gst_element_set_state (qtmux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (mysrcpad)); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + GST_BUFFER_DURATION (inbuffer) = 40 * GST_MSECOND; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + + /* send eos to have moov written */ + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); + + num_buffers = g_list_length (buffers); + /* at least expect ftyp, mdat header, buffer chunk and moov */ + fail_unless (num_buffers >= 4); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + buffers = g_list_remove (buffers, outbuffer); + + switch (i) { + case 0: + { + /* ftyp header */ + guint8 *data = GST_BUFFER_DATA (outbuffer); + + fail_unless (GST_BUFFER_SIZE (outbuffer) >= 20); + fail_unless (memcmp (data, data0, sizeof (data0)) == 0); + fail_unless (memcmp (data + 16, data0 + 8, 4) == 0); + break; + } + case 1: /* mdat header */ + fail_unless (GST_BUFFER_SIZE (outbuffer) == 16); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), data1, sizeof (data1)) + == 0); + break; + case 2: /* buffer we put in */ + fail_unless (GST_BUFFER_SIZE (outbuffer) == 1); + break; + case 3: /* moov */ + fail_unless (GST_BUFFER_SIZE (outbuffer) > 8); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data2, + sizeof (data2)) == 0); + break; + default: + break; + } + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + g_list_free (buffers); + buffers = NULL; + + cleanup_qtmux (qtmux, sinkname); +} + +static void +check_qtmux_pad_fragmented (GstStaticPadTemplate * srctemplate, + const gchar * sinkname, guint32 dts_method, gboolean streamable) +{ + GstElement *qtmux; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + int num_buffers; + int i; + guint8 data0[12] = "\000\000\000\024ftypqt "; + guint8 data1[4] = "mdat"; + guint8 data2[4] = "moov"; + guint8 data3[4] = "moof"; + guint8 data4[4] = "mfra"; + + qtmux = setup_qtmux (srctemplate, sinkname); + g_object_set (qtmux, "dts-method", dts_method, NULL); + g_object_set (qtmux, "fragment-duration", 2000, NULL); + g_object_set (qtmux, "streamable", streamable, NULL); + fail_unless (gst_element_set_state (qtmux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + inbuffer = gst_buffer_new_and_alloc (1); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (mysrcpad)); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + GST_BUFFER_DURATION (inbuffer) = 40 * GST_MSECOND; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + + /* send eos to have all written */ + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); + + num_buffers = g_list_length (buffers); + /* at least expect ftyp, moov, moof, mdat header, buffer chunk + * and optionally mfra */ + fail_unless (num_buffers >= 5); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + buffers = g_list_remove (buffers, outbuffer); + + switch (i) { + case 0: + { + /* ftyp header */ + guint8 *data = GST_BUFFER_DATA (outbuffer); + + fail_unless (GST_BUFFER_SIZE (outbuffer) >= 20); + fail_unless (memcmp (data, data0, sizeof (data0)) == 0); + fail_unless (memcmp (data + 16, data0 + 8, 4) == 0); + break; + } + case 1: /* moov */ + fail_unless (GST_BUFFER_SIZE (outbuffer) > 8); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data2, + sizeof (data2)) == 0); + break; + case 2: /* moof */ + fail_unless (GST_BUFFER_SIZE (outbuffer) > 8); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data3, + sizeof (data3)) == 0); + break; + case 3: /* mdat header */ + fail_unless (GST_BUFFER_SIZE (outbuffer) == 8); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data1, + sizeof (data1)) == 0); + break; + case 4: /* buffer we put in */ + fail_unless (GST_BUFFER_SIZE (outbuffer) == 1); + break; + case 5: /* mfra */ + fail_unless (GST_BUFFER_SIZE (outbuffer) > 8); + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data4, + sizeof (data4)) == 0); + break; + default: + break; + } + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + g_list_free (buffers); + buffers = NULL; + + cleanup_qtmux (qtmux, sinkname); +} + +/* dts-method dd */ + +GST_START_TEST (test_video_pad_dd) +{ + check_qtmux_pad (&srcvideotemplate, "video_%d", 0); +} + +GST_END_TEST; + +GST_START_TEST (test_audio_pad_dd) +{ + check_qtmux_pad (&srcaudiotemplate, "audio_%d", 0); +} + +GST_END_TEST; + + +GST_START_TEST (test_video_pad_frag_dd) +{ + check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 0, FALSE); +} + +GST_END_TEST; + +GST_START_TEST (test_audio_pad_frag_dd) +{ + check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 0, FALSE); +} + +GST_END_TEST; + + +GST_START_TEST (test_video_pad_frag_dd_streamable) +{ + check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 0, TRUE); +} + +GST_END_TEST; + + +GST_START_TEST (test_audio_pad_frag_dd_streamable) +{ + check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 0, TRUE); +} + +GST_END_TEST; + +/* dts-method reorder */ + +GST_START_TEST (test_video_pad_reorder) +{ + check_qtmux_pad (&srcvideotemplate, "video_%d", 1); +} + +GST_END_TEST; + +GST_START_TEST (test_audio_pad_reorder) +{ + check_qtmux_pad (&srcaudiotemplate, "audio_%d", 1); +} + +GST_END_TEST; + + +GST_START_TEST (test_video_pad_frag_reorder) +{ + check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 1, FALSE); +} + +GST_END_TEST; + +GST_START_TEST (test_audio_pad_frag_reorder) +{ + check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 1, FALSE); +} + +GST_END_TEST; + + +GST_START_TEST (test_video_pad_frag_reorder_streamable) +{ + check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 1, TRUE); +} + +GST_END_TEST; + + +GST_START_TEST (test_audio_pad_frag_reorder_streamable) +{ + check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 1, TRUE); +} + +GST_END_TEST; + +/* dts-method asc */ + +GST_START_TEST (test_video_pad_asc) +{ + check_qtmux_pad (&srcvideotemplate, "video_%d", 2); +} + +GST_END_TEST; + +GST_START_TEST (test_audio_pad_asc) +{ + check_qtmux_pad (&srcaudiotemplate, "audio_%d", 2); +} + +GST_END_TEST; + + +GST_START_TEST (test_video_pad_frag_asc) +{ + check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 2, FALSE); +} + +GST_END_TEST; + +GST_START_TEST (test_audio_pad_frag_asc) +{ + check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 2, FALSE); +} + +GST_END_TEST; + + +GST_START_TEST (test_video_pad_frag_asc_streamable) +{ + check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 2, TRUE); +} + +GST_END_TEST; + + +GST_START_TEST (test_audio_pad_frag_asc_streamable) +{ + check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 2, TRUE); +} + +GST_END_TEST; + +GST_START_TEST (test_reuse) +{ + GstElement *qtmux = setup_qtmux (&srcvideotemplate, "video_%d"); + GstBuffer *inbuffer; + GstCaps *caps; + + gst_element_set_state (qtmux, GST_STATE_PLAYING); + gst_element_set_state (qtmux, GST_STATE_NULL); + gst_element_set_state (qtmux, GST_STATE_PLAYING); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + inbuffer = gst_buffer_new_and_alloc (1); + fail_unless (inbuffer != NULL); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (mysrcpad)); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + GST_BUFFER_DURATION (inbuffer) = 40 * GST_MSECOND; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + + /* send eos to have all written */ + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); + + cleanup_qtmux (qtmux, "video_%d"); +} + +GST_END_TEST; + +static GstEncodingContainerProfile * +create_qtmux_profile (const gchar * variant) +{ + GstEncodingContainerProfile *cprof; + GstCaps *caps; + + if (variant == NULL) { + caps = gst_caps_new_simple ("video/quicktime", NULL); + } else { + caps = gst_caps_new_simple ("video/quicktime", + "variant", G_TYPE_STRING, variant, NULL); + } + + cprof = gst_encoding_container_profile_new ("Name", "blah", caps, NULL); + gst_caps_unref (caps); + + caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, 4321, + "channels", G_TYPE_INT, 2, "rate", G_TYPE_INT, 44100, + "signed", G_TYPE_BOOLEAN, TRUE, NULL); + gst_encoding_container_profile_add_profile (cprof, + GST_ENCODING_PROFILE (gst_encoding_audio_profile_new (caps, NULL, NULL, + 1))); + gst_caps_unref (caps); + + return cprof; +} + +GST_START_TEST (test_encodebin_qtmux) +{ + GstEncodingContainerProfile *cprof; + GstElement *enc; + GstPad *pad; + + enc = gst_element_factory_make ("encodebin", NULL); + if (enc == NULL) + return; + + /* Make sure encodebin finds a muxer for a profile with a variant field .. */ + cprof = create_qtmux_profile ("apple"); + g_object_set (enc, "profile", cprof, NULL); + gst_encoding_profile_unref (cprof); + + /* should have created a pad after setting the profile */ + pad = gst_element_get_static_pad (enc, "audio_0"); + fail_unless (pad != NULL); + gst_object_unref (pad); + gst_object_unref (enc); + + /* ... and for a profile without a variant field */ + enc = gst_element_factory_make ("encodebin", NULL); + cprof = create_qtmux_profile (NULL); + g_object_set (enc, "profile", cprof, NULL); + gst_encoding_profile_unref (cprof); + + /* should have created a pad after setting the profile */ + pad = gst_element_get_static_pad (enc, "audio_0"); + fail_unless (pad != NULL); + gst_object_unref (pad); + gst_object_unref (enc); +} + +GST_END_TEST; + +/* Fake mp3 encoder for test */ +typedef GstElement TestMp3Enc; +typedef GstElementClass TestMp3EncClass; + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, mpegversion=1, layer=[1,3]") + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int") + ); + +static GType test_mp3_enc_get_type (void); + +GST_BOILERPLATE (TestMp3Enc, test_mp3_enc, GstElement, GST_TYPE_ELEMENT); + +static void +test_mp3_enc_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_details_simple (element_class, "MPEG1 Audio Encoder", + "Codec/Encoder/Audio", "Pretends to encode mp3", "Foo Bar "); +} + +static void +test_mp3_enc_class_init (TestMp3EncClass * klass) +{ + /* doesn't actually need to do anything for this test */ +} + +static void +test_mp3_enc_init (TestMp3Enc * mp3enc, TestMp3EncClass * klass) +{ + GstPad *pad; + + pad = gst_pad_new_from_static_template (&sink_template, "sink"); + gst_element_add_pad (mp3enc, pad); + + pad = gst_pad_new_from_static_template (&src_template, "src"); + gst_element_add_pad (mp3enc, pad); +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + return gst_element_register (plugin, "testmp3enc", GST_RANK_NONE, + test_mp3_enc_get_type ()); +} + +static GstEncodingContainerProfile * +create_mp4mux_profile (void) +{ + GstEncodingContainerProfile *cprof; + GstCaps *caps; + + caps = gst_caps_new_simple ("video/quicktime", + "variant", G_TYPE_STRING, "iso", NULL); + + cprof = gst_encoding_container_profile_new ("Name", "blah", caps, NULL); + gst_caps_unref (caps); + + caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, + "layer", G_TYPE_INT, 3, "channels", G_TYPE_INT, 2, "rate", G_TYPE_INT, + 44100, NULL); + gst_encoding_container_profile_add_profile (cprof, + GST_ENCODING_PROFILE (gst_encoding_audio_profile_new (caps, NULL, NULL, + 1))); + gst_caps_unref (caps); + + return cprof; +} + +GST_START_TEST (test_encodebin_mp4mux) +{ + GstEncodingContainerProfile *cprof; + GstPluginFeature *feature; + GstElement *enc, *mux; + GstPad *pad; + + /* need a fake mp3 encoder because mp4 only accepts encoded formats */ + gst_plugin_register_static (GST_VERSION_MAJOR, GST_VERSION_MINOR, + "fakemp3enc", "fakemp3enc", plugin_init, VERSION, "LGPL", + "gst-plugins-good", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); + + feature = gst_default_registry_find_feature ("testmp3enc", + GST_TYPE_ELEMENT_FACTORY); + gst_plugin_feature_set_rank (feature, GST_RANK_PRIMARY + 100); + + enc = gst_element_factory_make ("encodebin", NULL); + if (enc == NULL) + return; + + /* Make sure encodebin finds mp4mux even though qtmux outputs a superset */ + cprof = create_mp4mux_profile (); + g_object_set (enc, "profile", cprof, NULL); + gst_encoding_profile_unref (cprof); + + /* should have created a pad after setting the profile */ + pad = gst_element_get_static_pad (enc, "audio_0"); + fail_unless (pad != NULL); + gst_object_unref (pad); + + mux = gst_bin_get_by_interface (GST_BIN (enc), GST_TYPE_TAG_SETTER); + fail_unless (mux != NULL); + { + GstElementFactory *f = gst_element_get_factory (mux); + + /* make sure we got mp4mux for variant=iso */ + GST_INFO ("muxer: %s", G_OBJECT_TYPE_NAME (mux)); + fail_unless_equals_string (GST_PLUGIN_FEATURE_NAME (f), "mp4mux"); + } + gst_object_unref (mux); + gst_object_unref (enc); + + gst_plugin_feature_set_rank (feature, GST_RANK_NONE); + gst_object_unref (feature); +} + +GST_END_TEST; + +static gboolean +extract_tags (const gchar * location, GstTagList ** taglist) +{ + gboolean ret = TRUE; + GstElement *src; + GstBus *bus; + GstElement *pipeline = + gst_parse_launch ("filesrc name=src ! qtdemux ! fakesink", NULL); + + src = gst_bin_get_by_name (GST_BIN (pipeline), "src"); + g_object_set (src, "location", location, NULL); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + fail_unless (gst_element_set_state (pipeline, GST_STATE_PLAYING) + != GST_STATE_CHANGE_FAILURE); + + if (*taglist == NULL) { + *taglist = gst_tag_list_new (); + } + + while (1) { + GstMessage *msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, + GST_MESSAGE_TAG | GST_MESSAGE_ERROR | GST_MESSAGE_EOS); + + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { + gst_message_unref (msg); + break; + } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + ret = FALSE; + gst_message_unref (msg); + break; + } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_TAG) { + GstTagList *tags; + + gst_message_parse_tag (msg, &tags); + gst_tag_list_insert (*taglist, tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_free (tags); + } + gst_message_unref (msg); + } + + gst_object_unref (bus); + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (src); + gst_object_unref (pipeline); + return ret; +} + +static void +test_average_bitrate_custom (const gchar * elementname, + GstStaticPadTemplate * tmpl, const gchar * sinkpadname) +{ + gchar *location; + GstElement *qtmux; + GstElement *filesink; + GstBuffer *inbuffer; + GstCaps *caps; + int i; + gint bytes[] = { 16, 22, 12 }; + gint64 durations[] = { GST_SECOND * 3, GST_SECOND * 5, GST_SECOND * 2 }; + gint64 total_bytes = 0; + GstClockTime total_duration = 0; + + location = g_strdup_printf ("%s/%s-%d", g_get_tmp_dir (), "qtmuxtest", + g_random_int ()); + GST_INFO ("Using location %s for bitrate test", location); + qtmux = gst_check_setup_element (elementname); + filesink = gst_element_factory_make ("filesink", NULL); + g_object_set (filesink, "location", location, NULL); + gst_element_link (qtmux, filesink); + mysrcpad = setup_src_pad (qtmux, tmpl, NULL, sinkpadname); + fail_unless (mysrcpad != NULL); + gst_pad_set_active (mysrcpad, TRUE); + + fail_unless (gst_element_set_state (filesink, + GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, + "could not set filesink to playing"); + fail_unless (gst_element_set_state (qtmux, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + for (i = 0; i < 3; i++) { + inbuffer = gst_buffer_new_and_alloc (bytes[i]); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (mysrcpad)); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + GST_BUFFER_TIMESTAMP (inbuffer) = total_duration; + GST_BUFFER_DURATION (inbuffer) = (GstClockTime) durations[i]; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + total_bytes += GST_BUFFER_SIZE (inbuffer); + total_duration += GST_BUFFER_DURATION (inbuffer); + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + } + + /* send eos to have moov written */ + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); + + gst_element_set_state (qtmux, GST_STATE_NULL); + gst_element_set_state (filesink, GST_STATE_NULL); + + gst_pad_set_active (mysrcpad, FALSE); + teardown_src_pad (mysrcpad); + gst_object_unref (filesink); + gst_check_teardown_element (qtmux); + + /* check the bitrate tag */ + { + GstTagList *taglist = NULL; + guint bitrate = 0; + guint expected; + + fail_unless (extract_tags (location, &taglist)); + + fail_unless (gst_tag_list_get_uint (taglist, GST_TAG_BITRATE, &bitrate)); + + expected = + (guint) gst_util_uint64_scale_round ((guint64) total_bytes, + (guint64) 8 * GST_SECOND, (guint64) total_duration); + fail_unless (bitrate == expected); + gst_tag_list_free (taglist); + } + + /* delete file */ + g_unlink (location); + g_free (location); +} + +GST_START_TEST (test_average_bitrate) +{ + test_average_bitrate_custom ("mp4mux", &srcaudioaactemplate, "audio_%d"); + test_average_bitrate_custom ("mp4mux", &srcvideoh264template, "video_%d"); + + test_average_bitrate_custom ("qtmux", &srcaudioaactemplate, "audio_%d"); + test_average_bitrate_custom ("qtmux", &srcvideoh264template, "video_%d"); +} + +GST_END_TEST; + + +static Suite * +qtmux_suite (void) +{ + Suite *s = suite_create ("qtmux"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_video_pad_dd); + tcase_add_test (tc_chain, test_audio_pad_dd); + tcase_add_test (tc_chain, test_video_pad_frag_dd); + tcase_add_test (tc_chain, test_audio_pad_frag_dd); + tcase_add_test (tc_chain, test_video_pad_frag_dd_streamable); + tcase_add_test (tc_chain, test_audio_pad_frag_dd_streamable); + + tcase_add_test (tc_chain, test_video_pad_reorder); + tcase_add_test (tc_chain, test_audio_pad_reorder); + tcase_add_test (tc_chain, test_video_pad_frag_reorder); + tcase_add_test (tc_chain, test_audio_pad_frag_reorder); + tcase_add_test (tc_chain, test_video_pad_frag_reorder_streamable); + tcase_add_test (tc_chain, test_audio_pad_frag_reorder_streamable); + + tcase_add_test (tc_chain, test_video_pad_asc); + tcase_add_test (tc_chain, test_audio_pad_asc); + tcase_add_test (tc_chain, test_video_pad_frag_asc); + tcase_add_test (tc_chain, test_audio_pad_frag_asc); + tcase_add_test (tc_chain, test_video_pad_frag_asc_streamable); + tcase_add_test (tc_chain, test_audio_pad_frag_asc_streamable); + + tcase_add_test (tc_chain, test_average_bitrate); + + tcase_add_test (tc_chain, test_reuse); + tcase_add_test (tc_chain, test_encodebin_qtmux); + tcase_add_test (tc_chain, test_encodebin_mp4mux); + + return s; +} + +GST_CHECK_MAIN (qtmux) diff --git a/tests/check/elements/rganalysis.c b/tests/check/elements/rganalysis.c new file mode 100644 index 0000000..8c26cf3 --- /dev/null +++ b/tests/check/elements/rganalysis.c @@ -0,0 +1,1878 @@ +/* GStreamer ReplayGain analysis + * + * Copyright (C) 2006 Rene Stadler + * + * rganalysis.c: Unit test for the rganalysis element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +/* Some things to note about the RMS window length of the analysis algorithm and + * thus the implementation used in the element: Processing divides input data + * into 50ms windows at some point. Some details about this that normally do + * not matter: + * + * 1. At the end of a stream, the remainder of data that did not fill up the + * last 50ms window is simply discarded. + * + * 2. If the sample rate changes during a stream, the currently running window + * is discarded and the equal loudness filter gets reset as if a new stream + * started. + * + * 3. For the album gain, it is not entirely correct to think of obtaining it + * like "as if all the tracks are analyzed as one track". There isn't a + * separate window being tracked for album processing, so at stream (track) + * end, the remaining unfilled window does not contribute to the album gain + * either. + * + * 4. If a waveform with a result gain G is concatenated to itself and the + * result processed as a track, the gain can be different from G if and only + * if the duration of the original waveform is not an integer multiple of + * 50ms. If the original waveform gets processed as a single track and then + * the same data again as a subsequent track, the album result gain will + * always match G (this is implied by 3.). + * + * 5. A stream shorter than 50ms cannot be analyzed. At 8000 and 48000 Hz, + * this corresponds to 400 resp. 2400 frames. If a stream is shorter than + * 50ms, the element will not generate tags at EOS (only if an album + * finished, but only album tags are generated then). This is not an + * erroneous condition, the element should behave normally. + * + * The limitations outlined in 1.-4. do not apply to the peak values. Every + * single sample is accounted for when looking for the peak. Thus the album + * peak is guaranteed to be the maximum value of all track peaks. + * + * In normal day-to-day use, these little facts are unlikely to be relevant, but + * they have to be kept in mind for writing the tests here. + */ + +#include + +/* 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; + +/* Mapping from supported sample rates to the correct result gain for the + * following test waveform: 20 * 512 samples with a quarter-full amplitude of + * toggling sign, changing every 48 samples and starting with the positive + * value. + * + * Even if we would generate a wave describing a signal with the same frequency + * at each sampling rate, the results would vary (slightly). Hence the simple + * generation method, since we cannot use a constant value as expected result + * anyways. For all sample rates, changing the sign every 48 frames gives a + * sane frequency. Buffers containing data that forms such a waveform is + * created using the test_buffer_square_{float,int16}_{mono,stereo} functions + * below. + * + * The results have been checked against what the metaflac and wavegain programs + * generate for such a stream. If you want to verify these, be sure that the + * metaflac program does not produce incorrect results in your environment: I + * found a strange bug in the (defacto) reference code for the analysis that + * sometimes leads to incorrect RMS window lengths. */ + +struct rate_test +{ + guint sample_rate; + gdouble gain; +}; + +static const struct rate_test supported_rates[] = { + {8000, -0.91}, + {11025, -2.80}, + {12000, -3.13}, + {16000, -4.26}, + {22050, -5.64}, + {24000, -5.87}, + {32000, -6.03}, + {44100, -6.20}, + {48000, -6.14} +}; + +/* Lookup the correct gain adjustment result in above array. */ + +static gdouble +get_expected_gain (guint sample_rate) +{ + gint i; + + for (i = G_N_ELEMENTS (supported_rates); i--;) + if (supported_rates[i].sample_rate == sample_rate) + return supported_rates[i].gain; + g_return_val_if_reached (0.0); +} + +#define SILENCE_GAIN 64.82 + +#define REPLAY_GAIN_CAPS \ + "channels = (int) { 1, 2 }, " \ + "rate = (int) { 8000, 11025, 12000, 16000, 22050, " \ + "24000, 32000, 44100, 48000 }" + +#define RG_ANALYSIS_CAPS_TEMPLATE_STRING \ + "audio/x-raw-float, " \ + "width = (int) 32, " \ + "endianness = (int) BYTE_ORDER, " \ + REPLAY_GAIN_CAPS \ + "; " \ + "audio/x-raw-int, " \ + "width = (int) 16, " \ + "depth = (int) [ 1, 16 ], " \ + "signed = (boolean) true, " \ + "endianness = (int) BYTE_ORDER, " \ + REPLAY_GAIN_CAPS + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (RG_ANALYSIS_CAPS_TEMPLATE_STRING) + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (RG_ANALYSIS_CAPS_TEMPLATE_STRING) + ); + +static GstElement * +setup_rganalysis (void) +{ + GstElement *analysis; + GstBus *bus; + + GST_DEBUG ("setup_rganalysis"); + analysis = gst_check_setup_element ("rganalysis"); + mysrcpad = gst_check_setup_src_pad (analysis, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (analysis, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + bus = gst_bus_new (); + gst_element_set_bus (analysis, bus); + /* gst_element_set_bus does not steal a reference. */ + gst_object_unref (bus); + + return analysis; +} + +static void +cleanup_rganalysis (GstElement * element) +{ + GST_DEBUG ("cleanup_rganalysis"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + /* The bus owns references to the element: */ + gst_element_set_bus (element, NULL); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (element); + gst_check_teardown_sink_pad (element); + gst_check_teardown_element (element); +} + +static void +set_playing_state (GstElement * element) +{ + fail_unless (gst_element_set_state (element, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "Could not set state to PLAYING"); +} + +static void +send_eos_event (GstElement * element) +{ + GstBus *bus = gst_element_get_bus (element); + GstPad *pad = gst_element_get_static_pad (element, "sink"); + GstEvent *event = gst_event_new_eos (); + + fail_unless (gst_pad_send_event (pad, event), + "Cannot send EOS event: Not handled."); + + /* There is no sink element, so _we_ post the EOS message on the bus here. Of + * course we generate any EOS ourselves, but this allows us to poll for the + * EOS message in poll_eos if we expect the element to _not_ generate a TAG + * message. That's better than waiting for a timeout to lapse. */ + fail_unless (gst_bus_post (bus, gst_message_new_eos (NULL))); + + gst_object_unref (bus); + gst_object_unref (pad); +} + +static void +send_tag_event (GstElement * element, GstTagList * tag_list) +{ + GstPad *pad = gst_element_get_static_pad (element, "sink"); + GstEvent *event = gst_event_new_tag (tag_list); + + fail_unless (gst_pad_send_event (pad, event), + "Cannot send TAG event: Not handled."); + + gst_object_unref (pad); +} + +static void +poll_eos (GstElement * element) +{ + GstBus *bus = gst_element_get_bus (element); + GstMessage *message; + + message = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_TAG, GST_SECOND); + fail_unless (message != NULL, "Could not poll for EOS message: Timed out"); + fail_unless (message->type == GST_MESSAGE_EOS, + "Could not poll for eos message: got message of type %s instead", + gst_message_type_get_name (message->type)); + + gst_message_unref (message); + gst_object_unref (bus); +} + +/* This also polls for EOS since the TAG message comes right before the end of + * streams. */ + +static GstTagList * +poll_tags (GstElement * element) +{ + GstBus *bus = gst_element_get_bus (element); + GstTagList *tag_list; + GstMessage *message; + + message = gst_bus_poll (bus, GST_MESSAGE_TAG, GST_SECOND); + fail_unless (message != NULL, "Could not poll for TAG message: Timed out"); + + gst_message_parse_tag (message, &tag_list); + gst_message_unref (message); + gst_object_unref (bus); + + poll_eos (element); + + return tag_list; +} + +#define MATCH_PEAK(p1, p2) ((p1 < p2 + 1e-6) && (p2 < p1 + 1e-6)) +#define MATCH_GAIN(g1, g2) ((g1 < g2 + 1e-13) && (g2 < g1 + 1e-13)) + +static void +fail_unless_track_gain (const GstTagList * tag_list, gdouble gain) +{ + gdouble result; + + fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, &result), + "Tag list contains no track gain value"); + fail_unless (MATCH_GAIN (gain, result), + "Track gain %+.2f does not match, expected %+.2f", result, gain); +} + +static void +fail_unless_track_peak (const GstTagList * tag_list, gdouble peak) +{ + gdouble result; + + fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, &result), + "Tag list contains no track peak value"); + fail_unless (MATCH_PEAK (peak, result), + "Track peak %f does not match, expected %f", result, peak); +} + +static void +fail_unless_album_gain (const GstTagList * tag_list, gdouble gain) +{ + gdouble result; + + fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, &result), + "Tag list contains no album gain value"); + fail_unless (MATCH_GAIN (result, gain), + "Album gain %+.2f does not match, expected %+.2f", result, gain); +} + +static void +fail_unless_album_peak (const GstTagList * tag_list, gdouble peak) +{ + gdouble result; + + fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, &result), + "Tag list contains no album peak value"); + fail_unless (MATCH_PEAK (peak, result), + "Album peak %f does not match, expected %f", result, peak); +} + +static void +fail_if_track_tags (const GstTagList * tag_list) +{ + gdouble result; + + fail_if (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, &result), + "Tag list contains track gain value (but should not)"); + fail_if (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, &result), + "Tag list contains track peak value (but should not)"); +} + +static void +fail_if_album_tags (const GstTagList * tag_list) +{ + gdouble result; + + fail_if (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, &result), + "Tag list contains album gain value (but should not)"); + fail_if (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, &result), + "Tag list contains album peak value (but should not)"); +} + +static void +fail_unless_num_tracks (GstElement * element, guint num_tracks) +{ + guint current; + + g_object_get (element, "num-tracks", ¤t, NULL); + fail_unless (current == num_tracks, + "num-tracks property has incorrect value %u, expected %u", + current, num_tracks); +} + +/* Functions that create buffers with constant sample values, for peak + * tests. */ + +static GstBuffer * +test_buffer_const_float_mono (gint sample_rate, gsize n_frames, gfloat value) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gfloat)); + gfloat *data = (gfloat *) GST_BUFFER_DATA (buf); + GstCaps *caps; + gint i; + + for (i = n_frames; i--;) + *data++ = value; + + caps = gst_caps_new_simple ("audio/x-raw-float", + "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 1, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +static GstBuffer * +test_buffer_const_float_stereo (gint sample_rate, gsize n_frames, + gfloat value_l, gfloat value_r) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gfloat) * 2); + gfloat *data = (gfloat *) GST_BUFFER_DATA (buf); + GstCaps *caps; + gint i; + + for (i = n_frames; i--;) { + *data++ = value_l; + *data++ = value_r; + } + + caps = gst_caps_new_simple ("audio/x-raw-float", + "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 2, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +static GstBuffer * +test_buffer_const_int16_mono (gint sample_rate, gint depth, gsize n_frames, + gint16 value) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gint16)); + gint16 *data = (gint16 *) GST_BUFFER_DATA (buf); + GstCaps *caps; + gint i; + + for (i = n_frames; i--;) + *data++ = value; + + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 1, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, depth, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +static GstBuffer * +test_buffer_const_int16_stereo (gint sample_rate, gint depth, gsize n_frames, + gint16 value_l, gint16 value_r) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gint16) * 2); + gint16 *data = (gint16 *) GST_BUFFER_DATA (buf); + GstCaps *caps; + gint i; + + for (i = n_frames; i--;) { + *data++ = value_l; + *data++ = value_r; + } + + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 2, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, depth, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +/* Functions that create data buffers containing square signal + * waveforms. */ + +static GstBuffer * +test_buffer_square_float_mono (gint * accumulator, gint sample_rate, + gsize n_frames, gfloat value) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gfloat)); + gfloat *data = (gfloat *) GST_BUFFER_DATA (buf); + GstCaps *caps; + gint i; + + for (i = n_frames; i--;) { + *accumulator += 1; + *accumulator %= 96; + + if (*accumulator < 48) + *data++ = value; + else + *data++ = -value; + } + + caps = gst_caps_new_simple ("audio/x-raw-float", + "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 1, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +static GstBuffer * +test_buffer_square_float_stereo (gint * accumulator, gint sample_rate, + gsize n_frames, gfloat value_l, gfloat value_r) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gfloat) * 2); + gfloat *data = (gfloat *) GST_BUFFER_DATA (buf); + GstCaps *caps; + gint i; + + for (i = n_frames; i--;) { + *accumulator += 1; + *accumulator %= 96; + + if (*accumulator < 48) { + *data++ = value_l; + *data++ = value_r; + } else { + *data++ = -value_l; + *data++ = -value_r; + } + } + + caps = gst_caps_new_simple ("audio/x-raw-float", + "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 2, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +static GstBuffer * +test_buffer_square_int16_mono (gint * accumulator, gint sample_rate, + gint depth, gsize n_frames, gint16 value) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gint16)); + gint16 *data = (gint16 *) GST_BUFFER_DATA (buf); + GstCaps *caps; + gint i; + + for (i = n_frames; i--;) { + *accumulator += 1; + *accumulator %= 96; + + if (*accumulator < 48) + *data++ = value; + else + *data++ = -MAX (value, -32767); + } + + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 1, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, depth, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +static GstBuffer * +test_buffer_square_int16_stereo (gint * accumulator, gint sample_rate, + gint depth, gsize n_frames, gint16 value_l, gint16 value_r) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gint16) * 2); + gint16 *data = (gint16 *) GST_BUFFER_DATA (buf); + GstCaps *caps; + gint i; + + for (i = n_frames; i--;) { + *accumulator += 1; + *accumulator %= 96; + + if (*accumulator < 48) { + *data++ = value_l; + *data++ = value_r; + } else { + *data++ = -MAX (value_l, -32767); + *data++ = -MAX (value_r, -32767); + } + } + + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 2, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, depth, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +static void +push_buffer (GstBuffer * buf) +{ + /* gst_pad_push steals a reference. */ + fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); +} + +/*** Start of the tests. ***/ + +/* This test looks redundant, but early versions of the element + * crashed when doing, well, nothing: */ + +GST_START_TEST (test_no_buffer) +{ + GstElement *element = setup_rganalysis (); + + set_playing_state (element); + send_eos_event (element); + poll_eos (element); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_no_buffer_album_1) +{ + GstElement *element = setup_rganalysis (); + + set_playing_state (element); + + /* Single track: */ + send_eos_event (element); + poll_eos (element); + + /* First album: */ + g_object_set (element, "num-tracks", 3, NULL); + + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 2); + + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 1); + + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 0); + + /* Second album: */ + g_object_set (element, "num-tracks", 2, NULL); + + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 1); + + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 0); + + /* Single track: */ + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 0); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_no_buffer_album_2) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator = 0; + gint i; + + g_object_set (element, "num-tracks", 3, NULL); + set_playing_state (element); + + /* No buffer for the first track. */ + + send_eos_event (element); + /* No tags should be posted, there was nothing to analyze: */ + poll_eos (element); + fail_unless_num_tracks (element, 2); + + /* A test waveform with known gain result as second track: */ + + for (i = 20; i--;) + push_buffer (test_buffer_square_float_mono (&accumulator, 44100, 512, + 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, -6.20); + /* Album is not finished yet: */ + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 1); + + /* No buffer for the last track. */ + + send_eos_event (element); + + tag_list = poll_tags (element); + fail_unless_album_peak (tag_list, 0.25); + fail_unless_album_gain (tag_list, -6.20); + /* No track tags should be posted, as there was no data for it: */ + fail_if_track_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 0); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_empty_buffers) +{ + GstElement *element = setup_rganalysis (); + + set_playing_state (element); + + /* Single track: */ + push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); + send_eos_event (element); + poll_eos (element); + + /* First album: */ + g_object_set (element, "num-tracks", 2, NULL); + + push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 1); + + push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 0); + + /* Second album, with a single track: */ + g_object_set (element, "num-tracks", 1, NULL); + push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 0); + + /* Single track: */ + push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); + send_eos_event (element); + poll_eos (element); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* Tests for correctness of the peak values. */ + +/* Float peak test. For stereo, one channel has the constant value of -1.369, + * the other one 0.0. This tests many things: The result peak value should + * occur on any channel. The peak is of course the absolute amplitude, so 1.369 + * should be the result. This will also detect if the code uses the absolute + * value during the comparison. If it is buggy it will return 0.0 since 0.0 > + * -1.369. Furthermore, this makes sure that there is no problem with headroom + * (exceeding 0dBFS). In the wild you get float samples > 1.0 from stuff like + * vorbis. */ + +GST_START_TEST (test_peak_float) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + + set_playing_state (element); + push_buffer (test_buffer_const_float_stereo (8000, 512, -1.369, 0.0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.369); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, -1.369)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.369); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_float_mono (8000, 512, -1.369)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.369); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_peak_int16_16) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + + set_playing_state (element); + + /* Half amplitude. */ + push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 1 << 14, 0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, 1 << 14)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_int16_mono (8000, 16, 512, 1 << 14)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Half amplitude, negative variant. */ + push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, -1 << 14, 0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, -1 << 14)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_int16_mono (8000, 16, 512, -1 << 14)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + + /* Now check for correct normalization of the peak value: Sample + * values of this format range from -32768 to 32767. So for the + * highest positive amplitude we do not reach 1.0, only for + * -32768! */ + + push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 32767, 0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 32767. / 32768.); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, 32767)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 32767. / 32768.); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_int16_mono (8000, 16, 512, 32767)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 32767. / 32768.); + gst_tag_list_free (tag_list); + + + /* Negative variant, reaching 1.0. */ + push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, -32768, 0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, -32768)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_int16_mono (8000, 16, 512, -32768)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* Same as the test before, but with 8 bits (packed into 16 bits). */ + +GST_START_TEST (test_peak_int16_8) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + + set_playing_state (element); + + /* Half amplitude. */ + push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 1 << 6, 0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 0, 1 << 6)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_int16_mono (8000, 8, 512, 1 << 6)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + + /* Half amplitude, negative variant. */ + push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, -1 << 6, 0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 0, -1 << 6)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_int16_mono (8000, 8, 512, -1 << 6)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + + + /* Almost full amplitude (maximum positive value). */ + push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, (1 << 7) - 1, 0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.9921875); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 0, (1 << 7) - 1)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.9921875); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_int16_mono (8000, 8, 512, (1 << 7) - 1)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.9921875); + gst_tag_list_free (tag_list); + + + /* Full amplitude (maximum negative value). */ + push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, -1 << 7, 0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + gst_tag_list_free (tag_list); + + /* Swapped channels. */ + push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 0, -1 << 7)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + gst_tag_list_free (tag_list); + + /* Mono. */ + push_buffer (test_buffer_const_int16_mono (8000, 8, 512, -1 << 7)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_peak_album) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + + g_object_set (element, "num-tracks", 2, NULL); + set_playing_state (element); + + push_buffer (test_buffer_const_float_stereo (8000, 1024, 1.0, 0.0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 1); + + push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.0, 0.5)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + fail_unless_album_peak (tag_list, 1.0); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 0); + + /* Try a second album: */ + g_object_set (element, "num-tracks", 3, NULL); + + push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.4, 0.4)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.4); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 2); + + push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.45, 0.45)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.45); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 1); + + push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.2, 0.2)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.2); + fail_unless_album_peak (tag_list, 0.45); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 0); + + /* And now a single track, not in album mode (num-tracks is 0 + * now): */ + push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.1, 0.1)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.1); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* Switching from track to album mode. */ + +GST_START_TEST (test_peak_track_album) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + + set_playing_state (element); + + push_buffer (test_buffer_const_float_mono (8000, 1024, 1.0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + + g_object_set (element, "num-tracks", 1, NULL); + push_buffer (test_buffer_const_float_mono (8000, 1024, 0.5)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + fail_unless_album_peak (tag_list, 0.5); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 0); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* Disabling album processing before the end of the album. Probably a rare edge + * case and applications should not rely on this to work. They need to send the + * element to the READY state to clear up after an aborted album anyway since + * they might need to process another album afterwards. */ + +GST_START_TEST (test_peak_album_abort_to_track) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + + g_object_set (element, "num-tracks", 2, NULL); + set_playing_state (element); + + push_buffer (test_buffer_const_float_stereo (8000, 1024, 1.0, 0.0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 1.0); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 1); + + g_object_set (element, "num-tracks", 0, NULL); + + push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.0, 0.5)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_gain_album) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator; + gint i; + + g_object_set (element, "num-tracks", 3, NULL); + set_playing_state (element); + + /* The three tracks are constructed such that if any of these is in fact + * ignored for the album gain, the album gain will differ. */ + + accumulator = 0; + for (i = 8; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.75, 0.75)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.75); + fail_unless_track_gain (tag_list, -15.70); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + + accumulator = 0; + for (i = 12; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.5, 0.5)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.5); + fail_unless_track_gain (tag_list, -12.22); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + + accumulator = 0; + for (i = 180; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.25, 0.25)); + send_eos_event (element); + + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, -6.20); + fail_unless_album_peak (tag_list, 0.75); + /* Strangely, wavegain reports -12.17 for the album, but the fixed + * metaflac agrees to us. Could be a 32767 vs. 32768 issue. */ + fail_unless_album_gain (tag_list, -12.18); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* Checks ensuring that the "forced" property works as advertised. */ + +GST_START_TEST (test_forced) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator = 0; + gint i; + + g_object_set (element, "forced", FALSE, NULL); + set_playing_state (element); + + tag_list = gst_tag_list_new (); + /* Provided values are totally arbitrary. */ + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_TRACK_PEAK, 1.0, GST_TAG_TRACK_GAIN, 2.21, NULL); + send_tag_event (element, tag_list); + + for (i = 20; i--;) + push_buffer (test_buffer_const_float_stereo (44100, 512, 0.5, 0.5)); + send_eos_event (element); + /* This fails if a tag message is generated: */ + poll_eos (element); + + /* Now back to a track without tags. */ + + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.25, 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (44100)); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* Sending track gain and peak in separate tag lists. */ + +GST_START_TEST (test_forced_separate) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator = 0; + gint i; + + g_object_set (element, "forced", FALSE, NULL); + set_playing_state (element); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_GAIN, 2.21, + NULL); + send_tag_event (element, tag_list); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, 1.0, + NULL); + send_tag_event (element, tag_list); + + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.5, 0.5)); + send_eos_event (element); + /* This fails if a tag message is generated: */ + poll_eos (element); + + /* Now a track without tags. */ + + accumulator = 0; + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.25, 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (44100)); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* A TAG event is sent _after_ data has already been processed. In real + * pipelines, this could happen if there is more than one rganalysis element (by + * accident). While it would have analyzed all the data prior to receiving the + * event, I expect it to not post its results if not forced. This test is + * almost equivalent to test_forced. */ + +GST_START_TEST (test_forced_after_data) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator = 0; + gint i; + + g_object_set (element, "forced", FALSE, NULL); + set_playing_state (element); + + for (i = 20; i--;) + push_buffer (test_buffer_const_float_stereo (8000, 512, 0.5, 0.5)); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_TRACK_PEAK, 1.0, GST_TAG_TRACK_GAIN, 2.21, NULL); + send_tag_event (element, tag_list); + + send_eos_event (element); + poll_eos (element); + + /* Now back to a normal track, this one has no tags: */ + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, + 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (8000)); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* Like test_forced, but *analyze* an album afterwards. The two tests following + * this one check the *skipping* of albums. */ + +GST_START_TEST (test_forced_album) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator; + gint i; + + g_object_set (element, "forced", FALSE, NULL); + set_playing_state (element); + + tag_list = gst_tag_list_new (); + /* Provided values are totally arbitrary. */ + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_TRACK_PEAK, 1.0, GST_TAG_TRACK_GAIN, 2.21, NULL); + send_tag_event (element, tag_list); + + accumulator = 0; + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.5, 0.5)); + send_eos_event (element); + /* This fails if a tag message is generated: */ + poll_eos (element); + + /* Now an album without tags. */ + g_object_set (element, "num-tracks", 2, NULL); + + accumulator = 0; + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.25, 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (44100)); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 1); + + accumulator = 0; + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.25, 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (44100)); + fail_unless_album_peak (tag_list, 0.25); + fail_unless_album_gain (tag_list, get_expected_gain (44100)); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 0); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_forced_album_skip) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator = 0; + gint i; + + g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL); + set_playing_state (element); + + tag_list = gst_tag_list_new (); + /* Provided values are totally arbitrary. */ + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_TRACK_PEAK, 0.75, GST_TAG_TRACK_GAIN, 2.21, + GST_TAG_ALBUM_PEAK, 0.80, GST_TAG_ALBUM_GAIN, -0.11, NULL); + send_tag_event (element, tag_list); + + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, + 0.25)); + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 1); + + /* This track has no tags, but needs to be skipped anyways since we + * are in album processing mode. */ + for (i = 20; i--;) + push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, 0.0)); + send_eos_event (element); + poll_eos (element); + fail_unless_num_tracks (element, 0); + + /* Normal track after the album. Of course not to be skipped. */ + accumulator = 0; + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, + 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (8000)); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_forced_album_no_skip) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator = 0; + gint i; + + g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL); + set_playing_state (element); + + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, + 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (8000)); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 1); + + /* The second track has indeed full tags, but although being not forced, this + * one has to be processed because album processing is on. */ + tag_list = gst_tag_list_new (); + /* Provided values are totally arbitrary. */ + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_TRACK_PEAK, 0.75, GST_TAG_TRACK_GAIN, 2.21, + GST_TAG_ALBUM_PEAK, 0.80, GST_TAG_ALBUM_GAIN, -0.11, NULL); + send_tag_event (element, tag_list); + for (i = 20; i--;) + push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, 0.0)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.0); + fail_unless_track_gain (tag_list, SILENCE_GAIN); + /* Second track was just silence so the album peak equals the first + * track's peak. */ + fail_unless_album_peak (tag_list, 0.25); + /* Statistical processing leads to the second track being + * ignored for the gain (because it is so short): */ + fail_unless_album_gain (tag_list, get_expected_gain (8000)); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 0); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_forced_abort_album_no_skip) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator = 0; + gint i; + + g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL); + set_playing_state (element); + + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, + 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (8000)); + fail_if_album_tags (tag_list); + gst_tag_list_free (tag_list); + fail_unless_num_tracks (element, 1); + + /* Disabling album processing before end of album: */ + g_object_set (element, "num-tracks", 0, NULL); + + /* Processing a track that has to be skipped. */ + tag_list = gst_tag_list_new (); + /* Provided values are totally arbitrary. */ + gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, + GST_TAG_TRACK_PEAK, 0.75, GST_TAG_TRACK_GAIN, 2.21, + GST_TAG_ALBUM_PEAK, 0.80, GST_TAG_ALBUM_GAIN, -0.11, NULL); + send_tag_event (element, tag_list); + for (i = 20; i--;) + push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, 0.0)); + send_eos_event (element); + poll_eos (element); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_reference_level) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gdouble ref_level; + gint accumulator = 0; + gint i; + + set_playing_state (element); + + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.25, 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (44100)); + fail_if_album_tags (tag_list); + fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_REFERENCE_LEVEL, + &ref_level) && MATCH_GAIN (ref_level, 89.), + "Incorrect reference level tag"); + gst_tag_list_free (tag_list); + + g_object_set (element, "reference-level", 83., "num-tracks", 2, NULL); + + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.25, 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (44100) - 6.); + fail_if_album_tags (tag_list); + fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_REFERENCE_LEVEL, + &ref_level) && MATCH_GAIN (ref_level, 83.), + "Incorrect reference level tag"); + gst_tag_list_free (tag_list); + + accumulator = 0; + for (i = 20; i--;) + push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, + 0.25, 0.25)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, get_expected_gain (44100) - 6.); + fail_unless_album_peak (tag_list, 0.25); + /* We provided the same waveform twice, with a reset separating + * them. Therefore, the album gain matches the track gain. */ + fail_unless_album_gain (tag_list, get_expected_gain (44100) - 6.); + fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_REFERENCE_LEVEL, + &ref_level) && MATCH_GAIN (ref_level, 83.), + "Incorrect reference level tag"); + gst_tag_list_free (tag_list); + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +GST_START_TEST (test_all_formats) +{ + GstElement *element = setup_rganalysis (); + GstTagList *tag_list; + gint accumulator = 0; + gint i, j; + + set_playing_state (element); + for (i = G_N_ELEMENTS (supported_rates); i--;) { + accumulator = 0; + for (j = 0; j < 4; j++) + push_buffer (test_buffer_square_float_stereo (&accumulator, + supported_rates[i].sample_rate, 512, 0.25, 0.25)); + for (j = 0; j < 3; j++) + push_buffer (test_buffer_square_float_mono (&accumulator, + supported_rates[i].sample_rate, 512, 0.25)); + for (j = 0; j < 4; j++) + push_buffer (test_buffer_square_int16_stereo (&accumulator, + supported_rates[i].sample_rate, 16, 512, 1 << 13, 1 << 13)); + for (j = 0; j < 3; j++) + push_buffer (test_buffer_square_int16_mono (&accumulator, + supported_rates[i].sample_rate, 16, 512, 1 << 13)); + for (j = 0; j < 3; j++) + push_buffer (test_buffer_square_int16_stereo (&accumulator, + supported_rates[i].sample_rate, 8, 512, 1 << 5, 1 << 5)); + for (j = 0; j < 3; j++) + push_buffer (test_buffer_square_int16_mono (&accumulator, + supported_rates[i].sample_rate, 8, 512, 1 << 5)); + send_eos_event (element); + tag_list = poll_tags (element); + fail_unless_track_peak (tag_list, 0.25); + fail_unless_track_gain (tag_list, supported_rates[i].gain); + gst_tag_list_free (tag_list); + } + + cleanup_rganalysis (element); +} + +GST_END_TEST; + +/* Checks ensuring all advertised supported sample rates are really + * accepted, for integer and float, mono and stereo. This also + * verifies that the correct gain is computed for all formats (except + * odd bit depths). */ + +#define MAKE_GAIN_TEST_FLOAT_MONO(sample_rate) \ + GST_START_TEST (test_gain_float_mono_##sample_rate) \ +{ \ + GstElement *element = setup_rganalysis (); \ + GstTagList *tag_list; \ + gint accumulator = 0; \ + gint i; \ + \ + set_playing_state (element); \ + \ + for (i = 0; i < 20; i++) \ + push_buffer (test_buffer_square_float_mono (&accumulator, \ + sample_rate, 512, 0.25)); \ + send_eos_event (element); \ + tag_list = poll_tags (element); \ + fail_unless_track_peak (tag_list, 0.25); \ + fail_unless_track_gain (tag_list, \ + get_expected_gain (sample_rate)); \ + gst_tag_list_free (tag_list); \ + \ + cleanup_rganalysis (element); \ +} \ + \ +GST_END_TEST; + +#define MAKE_GAIN_TEST_FLOAT_STEREO(sample_rate) \ + GST_START_TEST (test_gain_float_stereo_##sample_rate) \ +{ \ + GstElement *element = setup_rganalysis (); \ + GstTagList *tag_list; \ + gint accumulator = 0; \ + gint i; \ + \ + set_playing_state (element); \ + \ + for (i = 0; i < 20; i++) \ + push_buffer (test_buffer_square_float_stereo (&accumulator, \ + sample_rate, 512, 0.25, 0.25)); \ + send_eos_event (element); \ + tag_list = poll_tags (element); \ + fail_unless_track_peak (tag_list, 0.25); \ + fail_unless_track_gain (tag_list, \ + get_expected_gain (sample_rate)); \ + gst_tag_list_free (tag_list); \ + \ + cleanup_rganalysis (element); \ +} \ + \ +GST_END_TEST; + +#define MAKE_GAIN_TEST_INT16_MONO(sample_rate, depth) \ + GST_START_TEST (test_gain_int16_##depth##_mono_##sample_rate) \ +{ \ + GstElement *element = setup_rganalysis (); \ + GstTagList *tag_list; \ + gint accumulator = 0; \ + gint i; \ + \ + set_playing_state (element); \ + \ + for (i = 0; i < 20; i++) \ + push_buffer (test_buffer_square_int16_mono (&accumulator, \ + sample_rate, depth, 512, 1 << (13 + depth - 16))); \ + \ + send_eos_event (element); \ + tag_list = poll_tags (element); \ + fail_unless_track_peak (tag_list, 0.25); \ + fail_unless_track_gain (tag_list, \ + get_expected_gain (sample_rate)); \ + gst_tag_list_free (tag_list); \ + \ + cleanup_rganalysis (element); \ +} \ + \ +GST_END_TEST; + +#define MAKE_GAIN_TEST_INT16_STEREO(sample_rate, depth) \ + GST_START_TEST (test_gain_int16_##depth##_stereo_##sample_rate) \ +{ \ + GstElement *element = setup_rganalysis (); \ + GstTagList *tag_list; \ + gint accumulator = 0; \ + gint i; \ + \ + set_playing_state (element); \ + \ + for (i = 0; i < 20; i++) \ + push_buffer (test_buffer_square_int16_stereo (&accumulator, \ + sample_rate, depth, 512, 1 << (13 + depth - 16), \ + 1 << (13 + depth - 16))); \ + send_eos_event (element); \ + tag_list = poll_tags (element); \ + fail_unless_track_peak (tag_list, 0.25); \ + fail_unless_track_gain (tag_list, \ + get_expected_gain (sample_rate)); \ + gst_tag_list_free (tag_list); \ + \ + cleanup_rganalysis (element); \ +} \ + \ +GST_END_TEST; + +MAKE_GAIN_TEST_FLOAT_MONO (8000); +MAKE_GAIN_TEST_FLOAT_MONO (11025); +MAKE_GAIN_TEST_FLOAT_MONO (12000); +MAKE_GAIN_TEST_FLOAT_MONO (16000); +MAKE_GAIN_TEST_FLOAT_MONO (22050); +MAKE_GAIN_TEST_FLOAT_MONO (24000); +MAKE_GAIN_TEST_FLOAT_MONO (32000); +MAKE_GAIN_TEST_FLOAT_MONO (44100); +MAKE_GAIN_TEST_FLOAT_MONO (48000); + +MAKE_GAIN_TEST_FLOAT_STEREO (8000); +MAKE_GAIN_TEST_FLOAT_STEREO (11025); +MAKE_GAIN_TEST_FLOAT_STEREO (12000); +MAKE_GAIN_TEST_FLOAT_STEREO (16000); +MAKE_GAIN_TEST_FLOAT_STEREO (22050); +MAKE_GAIN_TEST_FLOAT_STEREO (24000); +MAKE_GAIN_TEST_FLOAT_STEREO (32000); +MAKE_GAIN_TEST_FLOAT_STEREO (44100); +MAKE_GAIN_TEST_FLOAT_STEREO (48000); + +MAKE_GAIN_TEST_INT16_MONO (8000, 16); +MAKE_GAIN_TEST_INT16_MONO (11025, 16); +MAKE_GAIN_TEST_INT16_MONO (12000, 16); +MAKE_GAIN_TEST_INT16_MONO (16000, 16); +MAKE_GAIN_TEST_INT16_MONO (22050, 16); +MAKE_GAIN_TEST_INT16_MONO (24000, 16); +MAKE_GAIN_TEST_INT16_MONO (32000, 16); +MAKE_GAIN_TEST_INT16_MONO (44100, 16); +MAKE_GAIN_TEST_INT16_MONO (48000, 16); + +MAKE_GAIN_TEST_INT16_STEREO (8000, 16); +MAKE_GAIN_TEST_INT16_STEREO (11025, 16); +MAKE_GAIN_TEST_INT16_STEREO (12000, 16); +MAKE_GAIN_TEST_INT16_STEREO (16000, 16); +MAKE_GAIN_TEST_INT16_STEREO (22050, 16); +MAKE_GAIN_TEST_INT16_STEREO (24000, 16); +MAKE_GAIN_TEST_INT16_STEREO (32000, 16); +MAKE_GAIN_TEST_INT16_STEREO (44100, 16); +MAKE_GAIN_TEST_INT16_STEREO (48000, 16); + +MAKE_GAIN_TEST_INT16_MONO (8000, 8); +MAKE_GAIN_TEST_INT16_MONO (11025, 8); +MAKE_GAIN_TEST_INT16_MONO (12000, 8); +MAKE_GAIN_TEST_INT16_MONO (16000, 8); +MAKE_GAIN_TEST_INT16_MONO (22050, 8); +MAKE_GAIN_TEST_INT16_MONO (24000, 8); +MAKE_GAIN_TEST_INT16_MONO (32000, 8); +MAKE_GAIN_TEST_INT16_MONO (44100, 8); +MAKE_GAIN_TEST_INT16_MONO (48000, 8); + +MAKE_GAIN_TEST_INT16_STEREO (8000, 8); +MAKE_GAIN_TEST_INT16_STEREO (11025, 8); +MAKE_GAIN_TEST_INT16_STEREO (12000, 8); +MAKE_GAIN_TEST_INT16_STEREO (16000, 8); +MAKE_GAIN_TEST_INT16_STEREO (22050, 8); +MAKE_GAIN_TEST_INT16_STEREO (24000, 8); +MAKE_GAIN_TEST_INT16_STEREO (32000, 8); +MAKE_GAIN_TEST_INT16_STEREO (44100, 8); +MAKE_GAIN_TEST_INT16_STEREO (48000, 8); + +static Suite * +rganalysis_suite (void) +{ + Suite *s = suite_create ("rganalysis"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + + tcase_add_test (tc_chain, test_no_buffer); + tcase_add_test (tc_chain, test_no_buffer_album_1); + tcase_add_test (tc_chain, test_no_buffer_album_2); + tcase_add_test (tc_chain, test_empty_buffers); + + tcase_add_test (tc_chain, test_peak_float); + tcase_add_test (tc_chain, test_peak_int16_16); + tcase_add_test (tc_chain, test_peak_int16_8); + + tcase_add_test (tc_chain, test_peak_album); + tcase_add_test (tc_chain, test_peak_track_album); + tcase_add_test (tc_chain, test_peak_album_abort_to_track); + + tcase_add_test (tc_chain, test_gain_album); + + tcase_add_test (tc_chain, test_forced); + tcase_add_test (tc_chain, test_forced_separate); + tcase_add_test (tc_chain, test_forced_after_data); + tcase_add_test (tc_chain, test_forced_album); + tcase_add_test (tc_chain, test_forced_album_skip); + tcase_add_test (tc_chain, test_forced_album_no_skip); + tcase_add_test (tc_chain, test_forced_abort_album_no_skip); + + tcase_add_test (tc_chain, test_reference_level); + + tcase_add_test (tc_chain, test_all_formats); + + tcase_add_test (tc_chain, test_gain_float_mono_8000); + tcase_add_test (tc_chain, test_gain_float_mono_11025); + tcase_add_test (tc_chain, test_gain_float_mono_12000); + tcase_add_test (tc_chain, test_gain_float_mono_16000); + tcase_add_test (tc_chain, test_gain_float_mono_22050); + tcase_add_test (tc_chain, test_gain_float_mono_24000); + tcase_add_test (tc_chain, test_gain_float_mono_32000); + tcase_add_test (tc_chain, test_gain_float_mono_44100); + tcase_add_test (tc_chain, test_gain_float_mono_48000); + + tcase_add_test (tc_chain, test_gain_float_stereo_8000); + tcase_add_test (tc_chain, test_gain_float_stereo_11025); + tcase_add_test (tc_chain, test_gain_float_stereo_12000); + tcase_add_test (tc_chain, test_gain_float_stereo_16000); + tcase_add_test (tc_chain, test_gain_float_stereo_22050); + tcase_add_test (tc_chain, test_gain_float_stereo_24000); + tcase_add_test (tc_chain, test_gain_float_stereo_32000); + tcase_add_test (tc_chain, test_gain_float_stereo_44100); + tcase_add_test (tc_chain, test_gain_float_stereo_48000); + + tcase_add_test (tc_chain, test_gain_int16_16_mono_8000); + tcase_add_test (tc_chain, test_gain_int16_16_mono_11025); + tcase_add_test (tc_chain, test_gain_int16_16_mono_12000); + tcase_add_test (tc_chain, test_gain_int16_16_mono_16000); + tcase_add_test (tc_chain, test_gain_int16_16_mono_22050); + tcase_add_test (tc_chain, test_gain_int16_16_mono_24000); + tcase_add_test (tc_chain, test_gain_int16_16_mono_32000); + tcase_add_test (tc_chain, test_gain_int16_16_mono_44100); + tcase_add_test (tc_chain, test_gain_int16_16_mono_48000); + + tcase_add_test (tc_chain, test_gain_int16_16_stereo_8000); + tcase_add_test (tc_chain, test_gain_int16_16_stereo_11025); + tcase_add_test (tc_chain, test_gain_int16_16_stereo_12000); + tcase_add_test (tc_chain, test_gain_int16_16_stereo_16000); + tcase_add_test (tc_chain, test_gain_int16_16_stereo_22050); + tcase_add_test (tc_chain, test_gain_int16_16_stereo_24000); + tcase_add_test (tc_chain, test_gain_int16_16_stereo_32000); + tcase_add_test (tc_chain, test_gain_int16_16_stereo_44100); + tcase_add_test (tc_chain, test_gain_int16_16_stereo_48000); + + tcase_add_test (tc_chain, test_gain_int16_8_mono_8000); + tcase_add_test (tc_chain, test_gain_int16_8_mono_11025); + tcase_add_test (tc_chain, test_gain_int16_8_mono_12000); + tcase_add_test (tc_chain, test_gain_int16_8_mono_16000); + tcase_add_test (tc_chain, test_gain_int16_8_mono_22050); + tcase_add_test (tc_chain, test_gain_int16_8_mono_24000); + tcase_add_test (tc_chain, test_gain_int16_8_mono_32000); + tcase_add_test (tc_chain, test_gain_int16_8_mono_44100); + tcase_add_test (tc_chain, test_gain_int16_8_mono_48000); + + tcase_add_test (tc_chain, test_gain_int16_8_stereo_8000); + tcase_add_test (tc_chain, test_gain_int16_8_stereo_11025); + tcase_add_test (tc_chain, test_gain_int16_8_stereo_12000); + tcase_add_test (tc_chain, test_gain_int16_8_stereo_16000); + tcase_add_test (tc_chain, test_gain_int16_8_stereo_22050); + tcase_add_test (tc_chain, test_gain_int16_8_stereo_24000); + tcase_add_test (tc_chain, test_gain_int16_8_stereo_32000); + tcase_add_test (tc_chain, test_gain_int16_8_stereo_44100); + tcase_add_test (tc_chain, test_gain_int16_8_stereo_48000); + + return s; +} + +int +main (int argc, char **argv) +{ + gint nf; + + Suite *s = rganalysis_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + srunner_run_all (sr, CK_ENV); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + + return nf; +} diff --git a/tests/check/elements/rglimiter.c b/tests/check/elements/rglimiter.c new file mode 100644 index 0000000..6b4b96a --- /dev/null +++ b/tests/check/elements/rglimiter.c @@ -0,0 +1,269 @@ +/* GStreamer ReplayGain limiter + * + * Copyright (C) 2007 Rene Stadler + * + * rglimiter.c: Unit test for the rglimiter element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include + +#include + +/* 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 RG_LIMITER_CAPS_TEMPLATE_STRING \ + "audio/x-raw-float, " \ + "width = (int) 32, " \ + "endianness = (int) BYTE_ORDER, " \ + "channels = (int) [ 1, MAX ], " \ + "rate = (int) [ 1, MAX ]" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (RG_LIMITER_CAPS_TEMPLATE_STRING) + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (RG_LIMITER_CAPS_TEMPLATE_STRING) + ); + +static GstElement * +setup_rglimiter (void) +{ + GstElement *element; + + GST_DEBUG ("setup_rglimiter"); + element = gst_check_setup_element ("rglimiter"); + mysrcpad = gst_check_setup_src_pad (element, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return element; +} + +static void +cleanup_rglimiter (GstElement * element) +{ + GST_DEBUG ("cleanup_rglimiter"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + gst_check_teardown_src_pad (element); + gst_check_teardown_sink_pad (element); + gst_check_teardown_element (element); +} + +static void +set_playing_state (GstElement * element) +{ + fail_unless (gst_element_set_state (element, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "Could not set state to PLAYING"); +} + +static const gfloat test_input[] = { + -2.0, -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0, 2.0 +}; + +static const gfloat test_output[] = { + -0.99752737684336523, /* -2.0 */ + -0.88079707797788243, /* -1.0 */ + -0.7310585786300049, /* -0.75 */ + -0.5, -0.25, 0.0, 0.25, 0.5, + 0.7310585786300049, /* 0.75 */ + 0.88079707797788243, /* 1.0 */ + 0.99752737684336523, /* 2.0 */ +}; + +static GstBuffer * +create_test_buffer (void) +{ + GstBuffer *buf = gst_buffer_new_and_alloc (sizeof (test_input)); + GstCaps *caps; + + memcpy (GST_BUFFER_DATA (buf), test_input, sizeof (test_input)); + + caps = gst_caps_new_simple ("audio/x-raw-float", + "rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 1, + "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +static void +verify_test_buffer (GstBuffer * buf) +{ + gfloat *output = (gfloat *) GST_BUFFER_DATA (buf); + gint i; + + fail_unless (GST_BUFFER_SIZE (buf) == sizeof (test_output)); + for (i = 0; i < G_N_ELEMENTS (test_input); i++) + fail_unless (ABS (output[i] - test_output[i]) < 1.e-6, + "Incorrect output value %.6f for input %.2f, expected %.6f", + output[i], test_input[i], test_output[i]); +} + +/* Start of tests. */ + +GST_START_TEST (test_no_buffer) +{ + GstElement *element = setup_rglimiter (); + + set_playing_state (element); + + cleanup_rglimiter (element); +} + +GST_END_TEST; + +GST_START_TEST (test_disabled) +{ + GstElement *element = setup_rglimiter (); + GstBuffer *buf, *out_buf; + + g_object_set (element, "enabled", FALSE, NULL); + set_playing_state (element); + + buf = create_test_buffer (); + fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); + fail_unless (g_list_length (buffers) == 1); + out_buf = buffers->data; + fail_if (out_buf == NULL); + buffers = g_list_remove (buffers, out_buf); + ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1); + fail_unless (buf == out_buf); + gst_buffer_unref (out_buf); + + cleanup_rglimiter (element); +} + +GST_END_TEST; + +GST_START_TEST (test_limiting) +{ + GstElement *element = setup_rglimiter (); + GstBuffer *buf, *out_buf; + + set_playing_state (element); + + /* Mutable variant. */ + buf = create_test_buffer (); + GST_DEBUG ("push mutable buffer"); + fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); + fail_unless (g_list_length (buffers) == 1); + out_buf = buffers->data; + fail_if (out_buf == NULL); + ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1); + verify_test_buffer (out_buf); + + /* Immutable variant. */ + buf = create_test_buffer (); + /* Extra ref: */ + gst_buffer_ref (buf); + ASSERT_BUFFER_REFCOUNT (buf, "buf", 2); + GST_DEBUG ("push immutable buffer"); + fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + fail_unless (g_list_length (buffers) == 2); + out_buf = g_list_last (buffers)->data; + fail_if (out_buf == NULL); + ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1); + fail_unless (buf != out_buf); + /* Drop our extra ref: */ + gst_buffer_unref (buf); + verify_test_buffer (out_buf); + + cleanup_rglimiter (element); +} + +GST_END_TEST; + +GST_START_TEST (test_gap) +{ + GstElement *element = setup_rglimiter (); + GstBuffer *buf, *out_buf; + + set_playing_state (element); + + buf = create_test_buffer (); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_GAP); + fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); + fail_unless (g_list_length (buffers) == 1); + out_buf = buffers->data; + fail_if (out_buf == NULL); + ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1); + + /* Verify that the baseclass does not lift the GAP flag: */ + fail_unless (GST_BUFFER_FLAG_IS_SET (out_buf, GST_BUFFER_FLAG_GAP)); + + g_assert (GST_BUFFER_SIZE (out_buf) == GST_BUFFER_SIZE (buf)); + /* We cheated by passing an input buffer with non-silence that has the GAP + * flag set. The element cannot know that however and must have skipped + * adjusting the buffer because of the flag, which we can easily verify: */ + fail_if (memcmp (GST_BUFFER_DATA (out_buf), + GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (out_buf)) != 0); + + cleanup_rglimiter (element); +} + +GST_END_TEST; + +static Suite * +rglimiter_suite (void) +{ + Suite *s = suite_create ("rglimiter"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + + tcase_add_test (tc_chain, test_no_buffer); + tcase_add_test (tc_chain, test_disabled); + tcase_add_test (tc_chain, test_limiting); + tcase_add_test (tc_chain, test_gap); + + return s; +} + +int +main (int argc, char **argv) +{ + gint nf; + + Suite *s = rglimiter_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + srunner_run_all (sr, CK_ENV); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + + return nf; +} diff --git a/tests/check/elements/rgvolume.c b/tests/check/elements/rgvolume.c new file mode 100644 index 0000000..5226259 --- /dev/null +++ b/tests/check/elements/rgvolume.c @@ -0,0 +1,617 @@ +/* GStreamer ReplayGain volume adjustment + * + * Copyright (C) 2007 Rene Stadler + * + * rgvolume.c: Unit test for the rgvolume element + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include + +#include + +GList *events = NULL; + +/* 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 RG_VOLUME_CAPS_TEMPLATE_STRING \ + "audio/x-raw-float, " \ + "width = (int) 32, " \ + "endianness = (int) BYTE_ORDER, " \ + "channels = (int) [ 1, MAX ], " \ + "rate = (int) [ 1, MAX ]" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (RG_VOLUME_CAPS_TEMPLATE_STRING) + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (RG_VOLUME_CAPS_TEMPLATE_STRING) + ); + +static GstBuffer *test_buffer_new (gfloat value); + +/* gstcheck sets up a chain function that appends buffers to a global list. + * This is our equivalent of that for event handling. */ +static gboolean +event_func (GstPad * pad, GstEvent * event) +{ + events = g_list_append (events, event); + + return TRUE; +} + +static GstElement * +setup_rgvolume (void) +{ + GstElement *element; + + GST_DEBUG ("setup_rgvolume"); + element = gst_check_setup_element ("rgvolume"); + mysrcpad = gst_check_setup_src_pad (element, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate, NULL); + + /* Capture events, to test tag filtering behavior: */ + gst_pad_set_event_function (mysinkpad, event_func); + + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return element; +} + +static void +send_newsegment_and_empty_buffer (void) +{ + GstBuffer *buf; + GstEvent *ev; + + fail_unless (g_list_length (events) == 0); + + ev = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0); + fail_unless (gst_pad_push_event (mysrcpad, ev), + "Pushing newsegment event failed"); + + buf = test_buffer_new (0.0); + GST_BUFFER_SIZE (buf) = 0; + GST_BUFFER_DURATION (buf) = 0; + GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET (buf); + fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); + + fail_unless (g_list_length (events) == 1); + fail_unless (events->data == ev); + gst_mini_object_unref ((GstMiniObject *) events->data); + events = g_list_remove (events, ev); + + fail_unless (g_list_length (buffers) == 1); + fail_unless (buffers->data == buf); + gst_mini_object_unref ((GstMiniObject *) buffers->data); + buffers = g_list_remove (buffers, buf); +} + +static void +cleanup_rgvolume (GstElement * element) +{ + GST_DEBUG ("cleanup_rgvolume"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + g_list_foreach (events, (GFunc) gst_mini_object_unref, NULL); + g_list_free (events); + events = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (element); + gst_check_teardown_sink_pad (element); + gst_check_teardown_element (element); +} + +static void +set_playing_state (GstElement * element) +{ + fail_unless (gst_element_set_state (element, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "Could not set state to PLAYING"); +} + +static void +set_null_state (GstElement * element) +{ + fail_unless (gst_element_set_state (element, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, + "Could not set state to NULL"); +} + +static void +send_eos_event (GstElement * element) +{ + GstEvent *event = gst_event_new_eos (); + + fail_unless (g_list_length (events) == 0); + fail_unless (gst_pad_push_event (mysrcpad, event), + "Pushing EOS event failed"); + fail_unless (g_list_length (events) == 1); + fail_unless (events->data == event); + gst_mini_object_unref ((GstMiniObject *) events->data); + events = g_list_remove (events, event); +} + +static GstEvent * +send_tag_event (GstElement * element, GstEvent * event) +{ + g_return_val_if_fail (event->type == GST_EVENT_TAG, NULL); + + fail_unless (g_list_length (events) == 0); + fail_unless (gst_pad_push_event (mysrcpad, event), + "Pushing tag event failed"); + + if (g_list_length (events) == 0) { + /* Event got filtered out. */ + event = NULL; + } else { + GstTagList *tag_list; + gdouble dummy; + + event = events->data; + events = g_list_remove (events, event); + + fail_unless (event->type == GST_EVENT_TAG); + gst_event_parse_tag (event, &tag_list); + + /* The element is supposed to filter out ReplayGain related tags. */ + fail_if (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, &dummy), + "tag event still contains track gain tag"); + fail_if (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, &dummy), + "tag event still contains track peak tag"); + fail_if (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, &dummy), + "tag event still contains album gain tag"); + fail_if (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, &dummy), + "tag event still contains album peak tag"); + } + + return event; +} + +static GstBuffer * +test_buffer_new (gfloat value) +{ + GstBuffer *buf; + GstCaps *caps; + gfloat *data; + gint i; + + buf = gst_buffer_new_and_alloc (8 * sizeof (gfloat)); + data = (gfloat *) GST_BUFFER_DATA (buf); + for (i = 0; i < 8; i++) + data[i] = value; + + caps = gst_caps_from_string ("audio/x-raw-float, " + "rate = 8000, channels = 1, endianness = BYTE_ORDER, width = 32"); + gst_buffer_set_caps (buf, caps); + gst_caps_unref (caps); + + ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); + + return buf; +} + +#define MATCH_GAIN(g1, g2) ((g1 < g2 + 1e-6) && (g2 < g1 + 1e-6)) + +static void +fail_unless_target_gain (GstElement * element, gdouble expected_gain) +{ + gdouble prop_gain; + + g_object_get (element, "target-gain", &prop_gain, NULL); + + fail_unless (MATCH_GAIN (prop_gain, expected_gain), + "Target gain is %.2f dB, expected %.2f dB", prop_gain, expected_gain); +} + +static void +fail_unless_result_gain (GstElement * element, gdouble expected_gain) +{ + GstBuffer *input_buf, *output_buf; + gfloat input_sample, output_sample; + gdouble gain, prop_gain; + gboolean is_passthrough, expect_passthrough; + gint i; + + fail_unless (g_list_length (buffers) == 0); + + input_sample = 1.0; + input_buf = test_buffer_new (input_sample); + + /* We keep an extra reference to detect passthrough mode. */ + gst_buffer_ref (input_buf); + /* Pushing steals a reference. */ + fail_unless (gst_pad_push (mysrcpad, input_buf) == GST_FLOW_OK); + gst_buffer_unref (input_buf); + + /* The output buffer ends up on the global buffer list. */ + fail_unless (g_list_length (buffers) == 1); + output_buf = buffers->data; + fail_if (output_buf == NULL); + + buffers = g_list_remove (buffers, output_buf); + ASSERT_BUFFER_REFCOUNT (output_buf, "output_buf", 1); + fail_unless_equals_int (GST_BUFFER_SIZE (output_buf), 8 * sizeof (gfloat)); + + output_sample = *((gfloat *) GST_BUFFER_DATA (output_buf)); + + fail_if (output_sample == 0.0, "First output sample is zero"); + for (i = 1; i < 8; i++) { + gfloat output = ((gfloat *) GST_BUFFER_DATA (output_buf))[i]; + + fail_unless (output_sample == output, "Output samples not uniform"); + }; + + gain = 20. * log10 (output_sample / input_sample); + fail_unless (MATCH_GAIN (gain, expected_gain), + "Applied gain is %.2f dB, expected %.2f dB", gain, expected_gain); + g_object_get (element, "result-gain", &prop_gain, NULL); + fail_unless (MATCH_GAIN (prop_gain, expected_gain), + "Result gain is %.2f dB, expected %.2f dB", prop_gain, expected_gain); + + is_passthrough = (output_buf == input_buf); + expect_passthrough = MATCH_GAIN (expected_gain, +0.00); + fail_unless (is_passthrough == expect_passthrough, + expect_passthrough + ? "Expected operation in passthrough mode" + : "Incorrect passthrough behaviour"); + + gst_buffer_unref (output_buf); +} + +static void +fail_unless_gain (GstElement * element, gdouble expected_gain) +{ + fail_unless_target_gain (element, expected_gain); + fail_unless_result_gain (element, expected_gain); +} + +/* Start of tests. */ + +GST_START_TEST (test_no_buffer) +{ + GstElement *element = setup_rgvolume (); + + set_playing_state (element); + set_null_state (element); + set_playing_state (element); + send_eos_event (element); + + cleanup_rgvolume (element); +} + +GST_END_TEST; + +GST_START_TEST (test_events) +{ + GstElement *element = setup_rgvolume (); + GstEvent *event; + GstEvent *new_event; + GstTagList *tag_list; + gchar *artist; + + set_playing_state (element); + + send_newsegment_and_empty_buffer (); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, +4.95, GST_TAG_TRACK_PEAK, 0.59463, + GST_TAG_ALBUM_GAIN, -1.54, GST_TAG_ALBUM_PEAK, 0.693415, + GST_TAG_ARTIST, "Foobar", NULL); + event = gst_event_new_tag (tag_list); + new_event = send_tag_event (element, event); + /* Expect the element to modify the writable event. */ + fail_unless (event == new_event, "Writable tag event not reused"); + gst_event_parse_tag (new_event, &tag_list); + fail_unless (gst_tag_list_get_string (tag_list, GST_TAG_ARTIST, &artist)); + fail_unless (g_str_equal (artist, "Foobar")); + g_free (artist); + gst_event_unref (new_event); + + /* Same as above, but with a non-writable event. */ + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, +4.95, GST_TAG_TRACK_PEAK, 0.59463, + GST_TAG_ALBUM_GAIN, -1.54, GST_TAG_ALBUM_PEAK, 0.693415, + GST_TAG_ARTIST, "Foobar", NULL); + event = gst_event_new_tag (tag_list); + /* Holding an extra ref makes the event unwritable: */ + gst_event_ref (event); + new_event = send_tag_event (element, event); + fail_unless (event != new_event, "Unwritable tag event reused"); + gst_event_parse_tag (new_event, &tag_list); + fail_unless (gst_tag_list_get_string (tag_list, GST_TAG_ARTIST, &artist)); + fail_unless (g_str_equal (artist, "Foobar")); + g_free (artist); + gst_event_unref (event); + gst_event_unref (new_event); + + cleanup_rgvolume (element); +} + +GST_END_TEST; + +GST_START_TEST (test_simple) +{ + GstElement *element = setup_rgvolume (); + GstTagList *tag_list; + + g_object_set (element, "album-mode", FALSE, "headroom", +0.00, + "pre-amp", -6.00, "fallback-gain", +1.23, NULL); + set_playing_state (element); + + send_newsegment_and_empty_buffer (); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, -3.45, GST_TAG_TRACK_PEAK, 1.0, + GST_TAG_ALBUM_GAIN, +2.09, GST_TAG_ALBUM_PEAK, 1.0, NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_gain (element, -9.45); /* pre-amp + track gain */ + send_eos_event (element); + + g_object_set (element, "album-mode", TRUE, NULL); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, -3.45, GST_TAG_TRACK_PEAK, 1.0, + GST_TAG_ALBUM_GAIN, +2.09, GST_TAG_ALBUM_PEAK, 1.0, NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_gain (element, -3.91); /* pre-amp + album gain */ + + /* Switching back to track mode in the middle of a stream: */ + g_object_set (element, "album-mode", FALSE, NULL); + fail_unless_gain (element, -9.45); /* pre-amp + track gain */ + send_eos_event (element); + + cleanup_rgvolume (element); +} + +GST_END_TEST; + +/* If there are no gain tags at all, the fallback gain is used. */ + +GST_START_TEST (test_fallback_gain) +{ + GstElement *element = setup_rgvolume (); + GstTagList *tag_list; + + /* First some track where fallback does _not_ apply. */ + + g_object_set (element, "album-mode", FALSE, "headroom", 10.00, + "pre-amp", -6.00, "fallback-gain", -3.00, NULL); + set_playing_state (element); + + send_newsegment_and_empty_buffer (); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, +3.5, GST_TAG_TRACK_PEAK, 1.0, + GST_TAG_ALBUM_GAIN, -0.5, GST_TAG_ALBUM_PEAK, 1.0, NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_gain (element, -2.50); /* pre-amp + track gain */ + send_eos_event (element); + + /* Now a track completely missing tags. */ + + fail_unless_gain (element, -9.00); /* pre-amp + fallback-gain */ + + /* Changing the fallback gain in the middle of a stream, going to pass-through + * mode: */ + g_object_set (element, "fallback-gain", +6.00, NULL); + fail_unless_gain (element, +0.00); /* pre-amp + fallback-gain */ + send_eos_event (element); + + /* Verify that result gain is set to +0.00 with pre-amp + fallback-gain > + * +0.00 and no headroom. */ + + g_object_set (element, "fallback-gain", +12.00, "headroom", +0.00, NULL); + fail_unless_target_gain (element, +6.00); /* pre-amp + fallback-gain */ + fail_unless_result_gain (element, +0.00); + send_eos_event (element); + + cleanup_rgvolume (element); +} + +GST_END_TEST; + +/* If album gain is to be preferred but not available, the track gain is to be + * taken instead. */ + +GST_START_TEST (test_fallback_track) +{ + GstElement *element = setup_rgvolume (); + GstTagList *tag_list; + + g_object_set (element, "album-mode", TRUE, "headroom", +0.00, + "pre-amp", -6.00, "fallback-gain", +1.23, NULL); + set_playing_state (element); + + send_newsegment_and_empty_buffer (); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, +2.11, GST_TAG_TRACK_PEAK, 1.0, NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_gain (element, -3.89); /* pre-amp + track gain */ + + send_eos_event (element); + + cleanup_rgvolume (element); +} + +GST_END_TEST; + +/* If track gain is to be preferred but not available, the album gain is to be + * taken instead. */ + +GST_START_TEST (test_fallback_album) +{ + GstElement *element = setup_rgvolume (); + GstTagList *tag_list; + + g_object_set (element, "album-mode", FALSE, "headroom", +0.00, + "pre-amp", -6.00, "fallback-gain", +1.23, NULL); + set_playing_state (element); + + send_newsegment_and_empty_buffer (); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_ALBUM_GAIN, +3.73, GST_TAG_ALBUM_PEAK, 1.0, NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_gain (element, -2.27); /* pre-amp + album gain */ + + send_eos_event (element); + + cleanup_rgvolume (element); +} + +GST_END_TEST; + +GST_START_TEST (test_headroom) +{ + GstElement *element = setup_rgvolume (); + GstTagList *tag_list; + + g_object_set (element, "album-mode", FALSE, "headroom", +0.00, + "pre-amp", +0.00, "fallback-gain", +1.23, NULL); + set_playing_state (element); + + send_newsegment_and_empty_buffer (); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, +3.50, GST_TAG_TRACK_PEAK, 1.0, NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_target_gain (element, +3.50); /* pre-amp + track gain */ + fail_unless_result_gain (element, +0.00); + send_eos_event (element); + + g_object_set (element, "headroom", +2.00, NULL); + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, +9.18, GST_TAG_TRACK_PEAK, 0.687149, NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_target_gain (element, +9.18); /* pre-amp + track gain */ + /* Result is 20. * log10 (1. / peak) + headroom. */ + fail_unless_result_gain (element, 5.2589816238303335); + send_eos_event (element); + + g_object_set (element, "album-mode", TRUE, NULL); + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_ALBUM_GAIN, +5.50, GST_TAG_ALBUM_PEAK, 1.0, NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_target_gain (element, +5.50); /* pre-amp + album gain */ + fail_unless_result_gain (element, +2.00); /* headroom */ + send_eos_event (element); + + cleanup_rgvolume (element); +} + +GST_END_TEST; + +GST_START_TEST (test_reference_level) +{ + GstElement *element = setup_rgvolume (); + GstTagList *tag_list; + + g_object_set (element, + "album-mode", FALSE, + "headroom", +0.00, "pre-amp", +0.00, "fallback-gain", +1.23, NULL); + set_playing_state (element); + + send_newsegment_and_empty_buffer (); + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, 0.00, GST_TAG_TRACK_PEAK, 0.2, + GST_TAG_REFERENCE_LEVEL, 83., NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + /* Because our authorative reference is 89 dB, we bump it up by +6 dB. */ + fail_unless_gain (element, +6.00); /* pre-amp + track gain */ + send_eos_event (element); + + g_object_set (element, "album-mode", TRUE, NULL); + + /* Same as above, but with album gain. */ + + tag_list = gst_tag_list_new (); + gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, + GST_TAG_TRACK_GAIN, 1.23, GST_TAG_TRACK_PEAK, 0.1, + GST_TAG_ALBUM_GAIN, 0.00, GST_TAG_ALBUM_PEAK, 0.2, + GST_TAG_REFERENCE_LEVEL, 83., NULL); + fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); + fail_unless_gain (element, +6.00); /* pre-amp + album gain */ + + cleanup_rgvolume (element); +} + +GST_END_TEST; + +static Suite * +rgvolume_suite (void) +{ + Suite *s = suite_create ("rgvolume"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + + tcase_add_test (tc_chain, test_no_buffer); + tcase_add_test (tc_chain, test_events); + tcase_add_test (tc_chain, test_simple); + tcase_add_test (tc_chain, test_fallback_gain); + tcase_add_test (tc_chain, test_fallback_track); + tcase_add_test (tc_chain, test_fallback_album); + tcase_add_test (tc_chain, test_headroom); + tcase_add_test (tc_chain, test_reference_level); + + return s; +} + +int +main (int argc, char **argv) +{ + gint nf; + + Suite *s = rgvolume_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + srunner_run_all (sr, CK_ENV); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + + return nf; +} diff --git a/tests/check/elements/rtp-payloading.c b/tests/check/elements/rtp-payloading.c new file mode 100644 index 0000000..b2160f4 --- /dev/null +++ b/tests/check/elements/rtp-payloading.c @@ -0,0 +1,828 @@ +/* GStreamer RTP payloader unit tests + * Copyright (C) 2008 Nokia Corporation and its subsidary(-ies) + * contact: + * + * 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 +#include +#include + +#define RELEASE_ELEMENT(x) if(x) {gst_object_unref(x); x = NULL;} + +#define LOOP_COUNT 1 + +/* + * RTP pipeline structure to store the required elements. + */ +typedef struct +{ + GstElement *pipeline; + GstElement *fdsrc; + GstElement *capsfilter; + GstElement *rtppay; + GstElement *rtpdepay; + GstElement *fakesink; + int fd[2]; + const char *frame_data; + int frame_data_size; + int frame_count; +} rtp_pipeline; + +/* + * Number of bytes received in the chain list function when using buffer lists + */ +static guint chain_list_bytes_received; + +/* + * Chain list function for testing buffer lists + */ +static GstFlowReturn +rtp_pipeline_chain_list (GstPad * pad, GstBufferList * list) +{ + GstBufferListIterator *it; + + fail_if (!list); + it = gst_buffer_list_iterate (list); + + /* + * Count the size of the payload in the buffer list. + */ + + /* Loop through all groups */ + while (gst_buffer_list_iterator_next_group (it)) { + GstBuffer *paybuf; + + /* Skip the first buffer in the group, its the RTP header */ + fail_if (!gst_buffer_list_iterator_next (it)); + + /* Loop through all payload buffers in the current group */ + while ((paybuf = gst_buffer_list_iterator_next (it))) { + chain_list_bytes_received += GST_BUFFER_SIZE (paybuf); + } + } + + gst_buffer_list_iterator_free (it); + gst_buffer_list_unref (list); + + return GST_FLOW_OK; +} + +/* + * RTP bus callback. + */ +static gboolean +rtp_bus_callback (GstBus * bus, GstMessage * message, gpointer data) +{ + GMainLoop *mainloop = (GMainLoop *) data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR: + { + GError *err; + + gchar *debug; + + gchar *element_name; + + element_name = (message->src) ? gst_object_get_name (message->src) : NULL; + gst_message_parse_error (message, &err, &debug); + /* FIXME: should we fail the test here? */ + g_print ("\nError from element %s: %s\n%s\n\n", + GST_STR_NULL (element_name), err->message, (debug) ? debug : ""); + g_error_free (err); + g_free (debug); + g_free (element_name); + + g_main_loop_quit (mainloop); + } + break; + + case GST_MESSAGE_EOS: + { + g_main_loop_quit (mainloop); + } + break; + break; + + default: + { + } + break; + } + + return TRUE; +} + +/* + * Creates a RTP pipeline for one test. + * @param frame_data Pointer to the frame data which is used to pass thru pay/depayloaders. + * @param frame_data_size Frame data size in bytes. + * @param frame_count Frame count. + * @param filtercaps Caps filters. + * @param pay Payloader name. + * @param depay Depayloader name. + * @return + * Returns pointer to the RTP pipeline. + * The user must free the RTP pipeline when it's not used anymore. + */ +static rtp_pipeline * +rtp_pipeline_create (const char *frame_data, int frame_data_size, + int frame_count, const char *filtercaps, const char *pay, const char *depay) +{ + gchar *pipeline_name; + + rtp_pipeline *p; + + GstCaps *caps; + + /* Check parameters. */ + if (!frame_data || !pay || !depay) { + return NULL; + } + + /* Allocate memory for the RTP pipeline. */ + p = (rtp_pipeline *) malloc (sizeof (rtp_pipeline)); + + p->frame_data = frame_data; + p->frame_data_size = frame_data_size; + p->frame_count = frame_count; + + /* Create elements. */ + pipeline_name = g_strdup_printf ("%s-%s-pipeline", pay, depay); + p->pipeline = gst_pipeline_new (pipeline_name); + g_free (pipeline_name); + p->fdsrc = gst_element_factory_make ("fdsrc", NULL); + p->capsfilter = gst_element_factory_make ("capsfilter", NULL); + p->rtppay = gst_element_factory_make (pay, NULL); + p->rtpdepay = gst_element_factory_make (depay, NULL); + p->fakesink = gst_element_factory_make ("fakesink", NULL); + + /* One or more elements are not created successfully or failed to create p? */ + if (!p->pipeline || !p->fdsrc || !p->capsfilter || !p->rtppay || !p->rtpdepay + || !p->fakesink || pipe (p->fd) == -1) { + /* Release created elements. */ + RELEASE_ELEMENT (p->pipeline); + RELEASE_ELEMENT (p->fdsrc); + RELEASE_ELEMENT (p->capsfilter); + RELEASE_ELEMENT (p->rtppay); + RELEASE_ELEMENT (p->rtpdepay); + RELEASE_ELEMENT (p->fakesink); + + /* Close pipe. */ + if (p->fd[0]) { + close (p->fd[0]); + } + + if (p->fd[1]) { + close (p->fd[1]); + } + + /* Release allocated memory. */ + free (p); + + return NULL; + } + + /* Set fdsrc properties. */ + g_object_set (p->fdsrc, "fd", p->fd[0], NULL); + g_object_set (p->fdsrc, "do-timestamp", TRUE, NULL); + g_object_set (p->fdsrc, "blocksize", p->frame_data_size, NULL); + g_object_set (p->fdsrc, "num-buffers", p->frame_count * LOOP_COUNT, NULL); + + /* Set caps filters. */ + caps = gst_caps_from_string (filtercaps); + + g_object_set (p->capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + + /* Add elements to the pipeline. */ + gst_bin_add (GST_BIN (p->pipeline), p->fdsrc); + gst_bin_add (GST_BIN (p->pipeline), p->capsfilter); + gst_bin_add (GST_BIN (p->pipeline), p->rtppay); + gst_bin_add (GST_BIN (p->pipeline), p->rtpdepay); + gst_bin_add (GST_BIN (p->pipeline), p->fakesink); + + /* Link elements. */ + gst_element_link (p->fdsrc, p->capsfilter); + gst_element_link (p->capsfilter, p->rtppay); + gst_element_link (p->rtppay, p->rtpdepay); + gst_element_link (p->rtpdepay, p->fakesink); + + return p; +} + +/* + * Destroys the RTP pipeline. + * @param p Pointer to the RTP pipeline. + */ +static void +rtp_pipeline_destroy (rtp_pipeline * p) +{ + /* Check parameters. */ + if (p == NULL) { + return; + } + + /* Release pipeline. */ + RELEASE_ELEMENT (p->pipeline); + + /* Close pipe. */ + if (p->fd[0]) { + close (p->fd[0]); + } + + if (p->fd[1]) { + close (p->fd[1]); + } + + /* Release allocated memory. */ + free (p); +} + +/* + * Runs the RTP pipeline. + * @param p Pointer to the RTP pipeline. + */ +static void +rtp_pipeline_run (rtp_pipeline * p) +{ + GMainLoop *mainloop = NULL; + + GstBus *bus; + + gint i; + + /* Check parameters. */ + if (p == NULL) { + return; + } + + /* Create mainloop. */ + mainloop = g_main_loop_new (NULL, FALSE); + if (!mainloop) { + return; + } + + /* Add bus callback. */ + bus = gst_pipeline_get_bus (GST_PIPELINE (p->pipeline)); + + gst_bus_add_watch (bus, rtp_bus_callback, (gpointer) mainloop); + gst_object_unref (bus); + + /* Set pipeline to PLAYING. */ + gst_element_set_state (p->pipeline, GST_STATE_PLAYING); + + /* TODO: Writing may need some changes... */ + + for (i = 0; i < LOOP_COUNT; i++) { + const char *frame_data_pointer = p->frame_data; + int res; + int frame_count = p->frame_count; + + /* Write in to the pipe. */ + while (frame_count > 0) { + res = write (p->fd[1], frame_data_pointer, p->frame_data_size); + fail_unless_equals_int (res, p->frame_data_size); + frame_data_pointer += p->frame_data_size; + frame_count--; + } + } + + /* Run mainloop. */ + g_main_loop_run (mainloop); + + /* Set pipeline to NULL. */ + gst_element_set_state (p->pipeline, GST_STATE_NULL); + + /* Release mainloop. */ + g_main_loop_unref (mainloop); +} + +/* + * Enables buffer lists. Sets the buffer-list property of the payloader + * and adds a chain_list_function to the depayloader. + * @param p Pointer to the RTP pipeline. + */ +static void +rtp_pipeline_enable_lists (rtp_pipeline * p, guint mtu_size) +{ + GstPad *pad; + + /* use buffer lists */ + g_object_set (p->rtppay, "buffer-list", TRUE, NULL); + + /* set mtu size if needed */ + if (mtu_size) { + g_object_set (p->rtppay, "mtu", mtu_size, NULL); + } + + /* Add chain list function for the buffer list tests */ + pad = gst_element_get_static_pad (p->rtpdepay, "sink"); + gst_pad_set_chain_list_function (pad, + GST_DEBUG_FUNCPTR (rtp_pipeline_chain_list)); + gst_object_unref (pad); +} + +/* + * Creates the RTP pipeline and runs the test using the pipeline. + * @param frame_data Pointer to the frame data which is used to pass thru pay/depayloaders. + * @param frame_data_size Frame data size in bytes. + * @param frame_count Frame count. + * @param filtercaps Caps filters. + * @param pay Payloader name. + * @param depay Depayloader name. + * @bytes_sent bytes that will be sent, used when testing buffer lists + * @mtu_size set mtu size when testing lists + * @use_lists enable buffer lists + */ +static void +rtp_pipeline_test (const char *frame_data, int frame_data_size, int frame_count, + const char *filtercaps, const char *pay, const char *depay, + guint bytes_sent, guint mtu_size, gboolean use_lists) +{ + /* Create RTP pipeline. */ + rtp_pipeline *p = + rtp_pipeline_create (frame_data, frame_data_size, frame_count, filtercaps, + pay, depay); + + if (p == NULL) { + return; + } + + if (use_lists) { + rtp_pipeline_enable_lists (p, mtu_size); + chain_list_bytes_received = 0; + } + + /* Run RTP pipeline. */ + rtp_pipeline_run (p); + + /* Destroy RTP pipeline. */ + rtp_pipeline_destroy (p); + + if (use_lists) { + /* 'next NAL' indicator is 4 bytes */ + fail_if (chain_list_bytes_received != bytes_sent * LOOP_COUNT); + } +} + +static char rtp_ilbc_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_ilbc_frame_data_size = 20; + +static int rtp_ilbc_frame_count = 1; + +GST_START_TEST (rtp_ilbc) +{ + rtp_pipeline_test (rtp_ilbc_frame_data, rtp_ilbc_frame_data_size, + rtp_ilbc_frame_count, "audio/x-iLBC,mode=20", "rtpilbcpay", + "rtpilbcdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_gsm_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_gsm_frame_data_size = 20; + +static int rtp_gsm_frame_count = 1; + +GST_START_TEST (rtp_gsm) +{ + rtp_pipeline_test (rtp_gsm_frame_data, rtp_gsm_frame_data_size, + rtp_gsm_frame_count, "audio/x-gsm,rate=8000,channels=1", "rtpgsmpay", + "rtpgsmdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_amr_frame_data[] = + { 0x3c, 0x24, 0x03, 0xb3, 0x48, 0x10, 0x68, 0x46, 0x6c, 0xec, 0x03, + 0x7a, 0x37, 0x16, 0x41, 0x41, 0xc0, 0x00, 0x0d, 0xcd, 0x12, 0xed, + 0xad, 0x80, 0x00, 0x00, 0x11, 0x31, 0x00, 0x00, 0x0d, 0xa0 +}; + +static int rtp_amr_frame_data_size = 32; + +static int rtp_amr_frame_count = 1; + +GST_START_TEST (rtp_amr) +{ + rtp_pipeline_test (rtp_amr_frame_data, rtp_amr_frame_data_size, + rtp_amr_frame_count, "audio/AMR,channels=1,rate=8000", "rtpamrpay", + "rtpamrdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_pcma_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_pcma_frame_data_size = 20; + +static int rtp_pcma_frame_count = 1; + +GST_START_TEST (rtp_pcma) +{ + rtp_pipeline_test (rtp_pcma_frame_data, rtp_pcma_frame_data_size, + rtp_pcma_frame_count, "audio/x-alaw,channels=1,rate=8000", "rtppcmapay", + "rtppcmadepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_pcmu_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_pcmu_frame_data_size = 20; + +static int rtp_pcmu_frame_count = 1; + +GST_START_TEST (rtp_pcmu) +{ + rtp_pipeline_test (rtp_pcmu_frame_data, rtp_pcmu_frame_data_size, + rtp_pcmu_frame_count, "audio/x-mulaw,channels=1,rate=8000", "rtppcmupay", + "rtppcmudepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_mpa_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_mpa_frame_data_size = 20; + +static int rtp_mpa_frame_count = 1; + +GST_START_TEST (rtp_mpa) +{ + rtp_pipeline_test (rtp_mpa_frame_data, rtp_mpa_frame_data_size, + rtp_mpa_frame_count, "audio/mpeg", "rtpmpapay", "rtpmpadepay", 0, 0, + FALSE); +} + +GST_END_TEST; +static char rtp_h263_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_h263_frame_data_size = 20; + +static int rtp_h263_frame_count = 1; + +GST_START_TEST (rtp_h263) +{ + rtp_pipeline_test (rtp_h263_frame_data, rtp_h263_frame_data_size, + rtp_h263_frame_count, "video/x-h263,variant=itu,h263version=h263", + "rtph263pay", "rtph263depay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_h263p_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_h263p_frame_data_size = 20; + +static int rtp_h263p_frame_count = 1; + +GST_START_TEST (rtp_h263p) +{ + rtp_pipeline_test (rtp_h263p_frame_data, rtp_h263p_frame_data_size, + rtp_h263p_frame_count, "video/x-h263,variant=itu", "rtph263ppay", + "rtph263pdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_h264_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_h264_frame_data_size = 20; + +static int rtp_h264_frame_count = 1; + +GST_START_TEST (rtp_h264) +{ + rtp_pipeline_test (rtp_h264_frame_data, rtp_h264_frame_data_size, + rtp_h264_frame_count, "video/x-h264", "rtph264pay", "rtph264depay", + 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_h264_list_lt_mtu_frame_data[] = + /* not packetized, next NAL starts with 0001 */ +{ 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xad, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00 +}; + +static int rtp_h264_list_lt_mtu_frame_data_size = 16; + +static int rtp_h264_list_lt_mtu_frame_count = 2; + +/* NAL = 4 bytes */ +static int rtp_h264_list_lt_mtu_bytes_sent = 2 * (16 - 4); + +static int rtp_h264_list_lt_mtu_mtu_size = 1024; + +GST_START_TEST (rtp_h264_list_lt_mtu) +{ + rtp_pipeline_test (rtp_h264_list_lt_mtu_frame_data, + rtp_h264_list_lt_mtu_frame_data_size, rtp_h264_list_lt_mtu_frame_count, + "video/x-h264", "rtph264pay", "rtph264depay", + rtp_h264_list_lt_mtu_bytes_sent, rtp_h264_list_lt_mtu_mtu_size, TRUE); +} + +GST_END_TEST; +static char rtp_h264_list_gt_mtu_frame_data[] = + /* not packetized, next NAL starts with 0001 */ +{ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_h264_list_gt_mtu_frame_data_size = 64; + +static int rtp_h264_list_gt_mtu_frame_count = 1; + +/* NAL = 4 bytes. When data does not fit into 1 mtu, 1 byte will be skipped */ +static int rtp_h264_list_gt_mtu_bytes_sent = 1 * (64 - 4) - 1; + +static int rtp_h264_list_gt_mtu_mty_size = 28; + +GST_START_TEST (rtp_h264_list_gt_mtu) +{ + rtp_pipeline_test (rtp_h264_list_gt_mtu_frame_data, + rtp_h264_list_gt_mtu_frame_data_size, rtp_h264_list_gt_mtu_frame_count, + "video/x-h264", "rtph264pay", "rtph264depay", + rtp_h264_list_gt_mtu_bytes_sent, rtp_h264_list_gt_mtu_mty_size, TRUE); +} + +GST_END_TEST; +static char rtp_L16_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_L16_frame_data_size = 20; + +static int rtp_L16_frame_count = 1; + +GST_START_TEST (rtp_L16) +{ + rtp_pipeline_test (rtp_L16_frame_data, rtp_L16_frame_data_size, + rtp_L16_frame_count, + "audio/x-raw-int,endianess=4321,signed=true,width=16,depth=16,rate=1,channels=1", + "rtpL16pay", "rtpL16depay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_mp2t_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_mp2t_frame_data_size = 20; + +static int rtp_mp2t_frame_count = 1; + +GST_START_TEST (rtp_mp2t) +{ + rtp_pipeline_test (rtp_mp2t_frame_data, rtp_mp2t_frame_data_size, + rtp_mp2t_frame_count, "video/mpegts,packetsize=188,systemstream=true", + "rtpmp2tpay", "rtpmp2tdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_mp4v_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_mp4v_frame_data_size = 20; + +static int rtp_mp4v_frame_count = 1; + +GST_START_TEST (rtp_mp4v) +{ + rtp_pipeline_test (rtp_mp4v_frame_data, rtp_mp4v_frame_data_size, + rtp_mp4v_frame_count, "video/mpeg,mpegversion=4,systemstream=false", + "rtpmp4vpay", "rtpmp4vdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_mp4v_list_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_mp4v_list_frame_data_size = 20; + +static int rtp_mp4v_list_frame_count = 1; + +static int rtp_mp4v_list_bytes_sent = 1 * 20; + +GST_START_TEST (rtp_mp4v_list) +{ + rtp_pipeline_test (rtp_mp4v_list_frame_data, rtp_mp4v_list_frame_data_size, + rtp_mp4v_list_frame_count, + "video/mpeg,mpegversion=4,codec_data=(buffer)000001b001", + "rtpmp4vpay", "rtpmp4vdepay", rtp_mp4v_list_bytes_sent, 0, TRUE); +} + +GST_END_TEST; +static char rtp_mp4g_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_mp4g_frame_data_size = 20; + +static int rtp_mp4g_frame_count = 1; + +GST_START_TEST (rtp_mp4g) +{ + rtp_pipeline_test (rtp_mp4g_frame_data, rtp_mp4g_frame_data_size, + rtp_mp4g_frame_count, + "video/mpeg,mpegversion=4,codec_data=(buffer)000001b001", "rtpmp4gpay", + "rtpmp4gdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_theora_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_theora_frame_data_size = 20; + +static int rtp_theora_frame_count = 1; + +GST_START_TEST (rtp_theora) +{ + rtp_pipeline_test (rtp_theora_frame_data, rtp_theora_frame_data_size, + rtp_theora_frame_count, "video/x-theora", "rtptheorapay", + "rtptheoradepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_vorbis_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_vorbis_frame_data_size = 20; + +static int rtp_vorbis_frame_count = 1; + +GST_START_TEST (rtp_vorbis) +{ + rtp_pipeline_test (rtp_vorbis_frame_data, rtp_vorbis_frame_data_size, + rtp_vorbis_frame_count, "audio/x-vorbis", "rtpvorbispay", + "rtpvorbisdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_jpeg_frame_data[] = + { /* SOF */ 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x03, 0x00, 0x21, 0x08, 0x01, 0x11, 0x08, 0x02, 0x11, 0x08, + /* DQT */ 0xFF, 0xDB, 0x00, 0x43, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* DATA */ 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_jpeg_frame_data_size = sizeof (rtp_jpeg_frame_data); + +static int rtp_jpeg_frame_count = 1; + +GST_START_TEST (rtp_jpeg) +{ + rtp_pipeline_test (rtp_jpeg_frame_data, rtp_jpeg_frame_data_size, + rtp_jpeg_frame_count, "video/x-jpeg,height=640,width=480", "rtpjpegpay", + "rtpjpegdepay", 0, 0, FALSE); +} + +GST_END_TEST; +static char rtp_jpeg_list_frame_data[] = + { /* SOF */ 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x03, 0x00, 0x21, 0x08, 0x01, 0x11, 0x08, 0x02, 0x11, 0x08, + /* DQT */ 0xFF, 0xDB, 0x00, 0x43, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* DATA */ 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_jpeg_list_frame_data_size = sizeof (rtp_jpeg_list_frame_data); + +static int rtp_jpeg_list_frame_count = 1; + +static int rtp_jpeg_list_bytes_sent = 1 * sizeof (rtp_jpeg_list_frame_data); + +GST_START_TEST (rtp_jpeg_list) +{ + rtp_pipeline_test (rtp_jpeg_list_frame_data, rtp_jpeg_list_frame_data_size, + rtp_jpeg_list_frame_count, "video/x-jpeg,height=640,width=480", + "rtpjpegpay", "rtpjpegdepay", rtp_jpeg_list_bytes_sent, 0, TRUE); +} + +GST_END_TEST; +static char rtp_g729_frame_data[] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static int rtp_g729_frame_data_size = 22; + +static int rtp_g729_frame_count = 1; + +GST_START_TEST (rtp_g729) +{ + rtp_pipeline_test (rtp_g729_frame_data, rtp_g729_frame_data_size, + rtp_g729_frame_count, "audio/G729", "rtpg729pay", + "rtpg729depay", 0, 0, FALSE); +} + +GST_END_TEST; + +/* + * Creates the test suite. + * + * Returns: pointer to the test suite. + */ +static Suite * +rtp_payloading_suite (void) +{ + Suite *s = suite_create ("rtp_data_test"); + + TCase *tc_chain = tcase_create ("linear"); + + /* Set timeout to 60 seconds. */ + tcase_set_timeout (tc_chain, 60); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, rtp_ilbc); + tcase_add_test (tc_chain, rtp_gsm); + tcase_add_test (tc_chain, rtp_amr); + tcase_add_test (tc_chain, rtp_pcma); + tcase_add_test (tc_chain, rtp_pcmu); + tcase_add_test (tc_chain, rtp_mpa); + tcase_add_test (tc_chain, rtp_h263); + tcase_add_test (tc_chain, rtp_h263p); + tcase_add_test (tc_chain, rtp_h264); + tcase_add_test (tc_chain, rtp_h264_list_lt_mtu); + tcase_add_test (tc_chain, rtp_h264_list_gt_mtu); + tcase_add_test (tc_chain, rtp_L16); + tcase_add_test (tc_chain, rtp_mp2t); + tcase_add_test (tc_chain, rtp_mp4v); + tcase_add_test (tc_chain, rtp_mp4v_list); + tcase_add_test (tc_chain, rtp_mp4g); + tcase_add_test (tc_chain, rtp_theora); + tcase_add_test (tc_chain, rtp_vorbis); + tcase_add_test (tc_chain, rtp_jpeg); + tcase_add_test (tc_chain, rtp_jpeg_list); + tcase_add_test (tc_chain, rtp_g729); + return s; +} + +GST_CHECK_MAIN (rtp_payloading) diff --git a/tests/check/elements/rtpbin.c b/tests/check/elements/rtpbin.c new file mode 100644 index 0000000..63c6ae7 --- /dev/null +++ b/tests/check/elements/rtpbin.c @@ -0,0 +1,447 @@ +/* GStreamer + * + * unit test for gstrtpbin + * + * Copyright (C) <2009> Wim Taymans + * + * 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_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); + + /* 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); + + 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; + +GST_START_TEST (test_cleanup_recv2) +{ + 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); + + /* 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); + + while (count--) { + /* 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); + + /* change state */ + ret = gst_element_set_state (rtpbin, GST_STATE_NULL); + fail_unless (ret == GST_STATE_CHANGE_SUCCESS); + + /* 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); + + /* back to playing for the next round */ + ret = gst_element_set_state (rtpbin, GST_STATE_PLAYING); + fail_unless (ret == GST_STATE_CHANGE_SUCCESS); + } + + /* remove the session */ + gst_element_release_request_pad (rtpbin, rtp_sink); + gst_object_unref (rtp_sink); + + /* 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; + +GST_START_TEST (test_request_pad_by_template_name) +{ + GstElement *rtpbin; + GstPad *rtp_sink1, *rtp_sink2, *rtp_sink3; + + rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); + rtp_sink1 = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_%d"); + fail_unless (rtp_sink1 != NULL); + fail_unless_equals_string (GST_PAD_NAME (rtp_sink1), "recv_rtp_sink_0"); + ASSERT_OBJECT_REFCOUNT (rtp_sink1, "rtp_sink1", 2); + + rtp_sink2 = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_%d"); + fail_unless (rtp_sink2 != NULL); + fail_unless_equals_string (GST_PAD_NAME (rtp_sink2), "recv_rtp_sink_1"); + ASSERT_OBJECT_REFCOUNT (rtp_sink2, "rtp_sink2", 2); + + rtp_sink3 = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_%d"); + fail_unless (rtp_sink3 != NULL); + fail_unless_equals_string (GST_PAD_NAME (rtp_sink3), "recv_rtp_sink_2"); + ASSERT_OBJECT_REFCOUNT (rtp_sink3, "rtp_sink3", 2); + + + gst_element_release_request_pad (rtpbin, rtp_sink2); + gst_element_release_request_pad (rtpbin, rtp_sink1); + gst_element_release_request_pad (rtpbin, rtp_sink3); + ASSERT_OBJECT_REFCOUNT (rtp_sink3, "rtp_sink3", 1); + ASSERT_OBJECT_REFCOUNT (rtp_sink2, "rtp_sink2", 1); + ASSERT_OBJECT_REFCOUNT (rtp_sink1, "rtp_sink", 1); + gst_object_unref (rtp_sink1); + gst_object_unref (rtp_sink2); + gst_object_unref (rtp_sink3); + + gst_object_unref (rtpbin); +} + +GST_END_TEST; + +static 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); + tcase_add_test (tc_chain, test_cleanup_recv2); + tcase_add_test (tc_chain, test_request_pad_by_template_name); + + 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/rtpbin_buffer_list.c b/tests/check/elements/rtpbin_buffer_list.c new file mode 100644 index 0000000..f459b92 --- /dev/null +++ b/tests/check/elements/rtpbin_buffer_list.c @@ -0,0 +1,331 @@ +/* GStreamer + * + * Unit test for gstrtpbin sending rtp packets using GstBufferList. + * Copyright (C) 2009 Branko Subasic + * + * 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 + +#include + + + +/* This test makes sure that RTP packets sent as buffer lists are sent through + * the rtpbin as they are supposed to, and not corrupted in any way. + */ + + +#define TEST_CAPS \ + "application/x-rtp, " \ + "media=(string)video, " \ + "clock-rate=(int)90000, " \ + "encoding-name=(string)H264, " \ + "profile-level-id=(string)4d4015, " \ + "payload=(int)96, " \ + "ssrc=(guint)2633237432, " \ + "clock-base=(guint)1868267015, " \ + "seqnum-base=(guint)54229" + + +/* RTP headers and the first 2 bytes of the payload (FU indicator and FU header) + */ +static const guint8 rtp_header[2][14] = { + {0x80, 0x60, 0xbb, 0xb7, 0x5c, 0xe9, 0x09, + 0x0d, 0xf5, 0x9c, 0x43, 0x55, 0x1c, 0x86}, + {0x80, 0x60, 0xbb, 0xb8, 0x5c, 0xe9, 0x09, + 0x0d, 0xf5, 0x9c, 0x43, 0x55, 0x1c, 0x46} +}; + +static const guint rtp_header_len[] = { + sizeof rtp_header[0], + sizeof rtp_header[1] +}; + +static GstBuffer *header_buffer[2] = { NULL, NULL }; + + +/* Some payload. + */ +static const char *payload = + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" + "0123456789ABSDEF0123456"; + +static const guint payload_offset[] = { + 0, 498 +}; + +static const guint payload_len[] = { + 498, 5 +}; + + +static GstBuffer *original_buffer = NULL; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp")); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp")); + + +static GstBuffer * +_create_original_buffer (void) +{ + GstCaps *caps; + + if (original_buffer != NULL) + return original_buffer; + + original_buffer = gst_buffer_new (); + fail_unless (original_buffer != NULL); + + gst_buffer_set_data (original_buffer, (guint8 *) payload, strlen (payload)); + GST_BUFFER_TIMESTAMP (original_buffer) = + gst_clock_get_internal_time (gst_system_clock_obtain ()); + + caps = gst_caps_from_string (TEST_CAPS); + fail_unless (caps != NULL); + gst_buffer_set_caps (original_buffer, caps); + gst_caps_unref (caps); + + return original_buffer; +} + +static GstBufferList * +_create_buffer_list (void) +{ + GstBufferList *list; + GstBufferListIterator *it; + GstBuffer *orig_buffer; + GstBuffer *buffer; + + orig_buffer = _create_original_buffer (); + fail_if (orig_buffer == NULL); + + list = gst_buffer_list_new (); + fail_if (list == NULL); + + it = gst_buffer_list_iterate (list); + fail_if (it == NULL); + + /*** First group, i.e. first packet. **/ + gst_buffer_list_iterator_add_group (it); + + /* Create buffer with RTP header and add it to the 1st group */ + buffer = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (buffer) = g_memdup (&rtp_header[0], rtp_header_len[0]); + GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer); + GST_BUFFER_SIZE (buffer) = rtp_header_len[0]; + gst_buffer_copy_metadata (buffer, orig_buffer, GST_BUFFER_COPY_ALL); + header_buffer[0] = buffer; + gst_buffer_list_iterator_add (it, buffer); + + /* Create the payload buffer and add it to the 1st group + */ + buffer = + gst_buffer_create_sub (orig_buffer, payload_offset[0], payload_len[0]); + fail_if (buffer == NULL); + gst_buffer_list_iterator_add (it, buffer); + + + /*** Second group, i.e. second packet. ***/ + + /* Create a new group to hold the rtp header and the payload */ + gst_buffer_list_iterator_add_group (it); + + /* Create buffer with RTP header and add it to the 2nd group */ + buffer = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (buffer) = g_memdup (&rtp_header[1], rtp_header_len[1]); + GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer); + GST_BUFFER_SIZE (buffer) = rtp_header_len[1]; + gst_buffer_copy_metadata (buffer, orig_buffer, GST_BUFFER_COPY_ALL); + header_buffer[1] = buffer; + + /* Add the rtp header to the buffer list */ + gst_buffer_list_iterator_add (it, buffer); + + /* Create the payload buffer and add it to the 2d group + */ + buffer = + gst_buffer_create_sub (orig_buffer, payload_offset[1], payload_len[1]); + fail_if (buffer == NULL); + gst_buffer_list_iterator_add (it, buffer); + + gst_buffer_list_iterator_free (it); + + return list; +} + + +static void +_check_header (GstBuffer * buffer, guint index) +{ + guint8 *data; + + fail_if (buffer == NULL); + fail_unless (index < 2); + + fail_unless (GST_BUFFER_SIZE (buffer) == rtp_header_len[index]); + + /* Can't do a memcmp() on the whole header, cause the SSRC (bytes 8-11) will + * most likely be changed in gstrtpbin. + */ + fail_unless ((data = GST_BUFFER_DATA (buffer)) != NULL); + fail_unless_equals_uint64 (*(guint64 *) data, *(guint64 *) rtp_header[index]); + fail_unless (*(guint16 *) (data + 12) == + *(guint16 *) (rtp_header[index] + 12)); +} + + +static void +_check_payload (GstBuffer * buffer, guint index) +{ + fail_if (buffer == NULL); + fail_unless (index < 2); + + fail_unless (GST_BUFFER_SIZE (buffer) == payload_len[index]); + fail_if (GST_BUFFER_DATA (buffer) != + (gpointer) (payload + payload_offset[index])); + fail_if (memcmp (GST_BUFFER_DATA (buffer), payload + payload_offset[index], + payload_len[index])); +} + + +static void +_check_group (GstBufferListIterator * it, guint index, GstCaps * caps) +{ + GstBuffer *buffer; + + fail_unless (it != NULL); + fail_unless (gst_buffer_list_iterator_n_buffers (it) == 2); + fail_unless (caps != NULL); + + fail_unless ((buffer = gst_buffer_list_iterator_next (it)) != NULL); + + fail_unless (GST_BUFFER_TIMESTAMP (buffer) == + GST_BUFFER_TIMESTAMP (original_buffer)); + + fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (original_buffer), + GST_BUFFER_CAPS (buffer))); + + _check_header (buffer, index); + + fail_unless ((buffer = gst_buffer_list_iterator_next (it)) != NULL); + _check_payload (buffer, index); +} + + +static GstFlowReturn +_sink_chain_list (GstPad * pad, GstBufferList * list) +{ + GstCaps *caps; + GstBufferListIterator *it; + + caps = gst_caps_from_string (TEST_CAPS); + fail_unless (caps != NULL); + + fail_unless (GST_IS_BUFFER_LIST (list)); + fail_unless (gst_buffer_list_n_groups (list) == 2); + + it = gst_buffer_list_iterate (list); + fail_if (it == NULL); + + fail_unless (gst_buffer_list_iterator_next_group (it)); + _check_group (it, 0, caps); + + fail_unless (gst_buffer_list_iterator_next_group (it)); + _check_group (it, 1, caps); + + gst_caps_unref (caps); + gst_buffer_list_iterator_free (it); + + gst_buffer_list_unref (list); + + return GST_FLOW_OK; +} + + +static void +_set_chain_functions (GstPad * pad) +{ + gst_pad_set_chain_list_function (pad, _sink_chain_list); +} + + +GST_START_TEST (test_bufferlist) +{ + GstElement *rtpbin; + GstPad *sinkpad; + GstPad *srcpad; + GstBufferList *list; + + list = _create_buffer_list (); + fail_unless (list != NULL); + + rtpbin = gst_check_setup_element ("gstrtpbin"); + + srcpad = + gst_check_setup_src_pad_by_name (rtpbin, &srctemplate, "send_rtp_sink_0"); + fail_if (srcpad == NULL); + sinkpad = + gst_check_setup_sink_pad_by_name (rtpbin, &sinktemplate, + "send_rtp_src_0"); + fail_if (sinkpad == NULL); + + _set_chain_functions (sinkpad); + + gst_pad_set_active (sinkpad, TRUE); + gst_element_set_state (rtpbin, GST_STATE_PLAYING); + fail_unless (gst_pad_push_list (srcpad, list) == GST_FLOW_OK); + gst_pad_set_active (sinkpad, FALSE); + + gst_check_teardown_pad_by_name (rtpbin, "send_rtp_src_0"); + gst_check_teardown_pad_by_name (rtpbin, "send_rtp_sink_0"); + gst_check_teardown_element (rtpbin); +} + +GST_END_TEST; + + + +static Suite * +bufferlist_suite (void) +{ + Suite *s = suite_create ("BufferList"); + + TCase *tc_chain = tcase_create ("general"); + + /* time out after 30s. */ + tcase_set_timeout (tc_chain, 10); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_bufferlist); + + return s; +} + +GST_CHECK_MAIN (bufferlist); diff --git a/tests/check/elements/rtpjitterbuffer.c b/tests/check/elements/rtpjitterbuffer.c new file mode 100644 index 0000000..a8eaa61 --- /dev/null +++ b/tests/check/elements/rtpjitterbuffer.c @@ -0,0 +1,341 @@ +/* GStreamer + * + * Copyright (C) 2009 Nokia Corporation and its subsidary(-ies) + * contact: + * + * 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 + +/* 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; +/* we also have a list of src buffers */ +static GList *inbuffers = NULL; +static gint num_dropped = 0; + +#define RTP_CAPS_STRING \ + "application/x-rtp, " \ + "media = (string)audio, " \ + "payload = (int) 0, " \ + "clock-rate = (int) 8000, " \ + "encoding-name = (string)PCMU" + +#define RTP_FRAME_SIZE 20 + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-rtp, " + "clock-rate = (int) [ 1, 2147483647 ]") + ); + +static void +buffer_dropped (gpointer mem) +{ + if (mem) { + GST_DEBUG ("dropping buffer: data=%p", mem); + g_free (mem); + num_dropped++; + } +} + +static GstElement * +setup_jitterbuffer (gint num_buffers) +{ + GstElement *jitterbuffer; + GstClock *clock; + GstBuffer *buffer; + GstCaps *caps; + /* a 20 sample audio block (2,5 ms) generated with + * gst-launch audiotestsrc wave=silence blocksize=40 num-buffers=3 ! + * "audio/x-raw-int,channels=1,rate=8000" ! mulawenc ! rtppcmupay ! + * fakesink dump=1 + */ + guint8 in[] = { /* first 4 bytes are rtp-header, next 4 bytes are timestamp */ + 0x80, 0x80, 0x1c, 0x24, 0x46, 0xcd, 0xb7, 0x11, 0x3c, 0x3a, 0x7c, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + }; + GstClockTime ts = G_GUINT64_CONSTANT (0); + GstClockTime tso = gst_util_uint64_scale (RTP_FRAME_SIZE, GST_SECOND, 8000); + /*guint latency = GST_TIME_AS_MSECONDS (num_buffers * tso); */ + gint i; + + GST_DEBUG ("setup_jitterbuffer"); + jitterbuffer = gst_check_setup_element ("gstrtpjitterbuffer"); + /* we need a clock here */ + clock = gst_system_clock_obtain (); + gst_element_set_clock (jitterbuffer, clock); + gst_object_unref (clock); + /* setup latency */ + /* latency would be 7 for 3 buffers here, default is 200 + g_object_set (G_OBJECT (jitterbuffer), "latency", latency, NULL); + GST_INFO_OBJECT (jitterbuffer, "set latency to %u ms", latency); + */ + + mysrcpad = gst_check_setup_src_pad (jitterbuffer, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (jitterbuffer, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + /* create n buffers */ + caps = gst_caps_from_string (RTP_CAPS_STRING); + for (i = 0; i < num_buffers; i++) { + buffer = gst_buffer_new_and_alloc (sizeof (in)); + memcpy (GST_BUFFER_DATA (buffer), in, sizeof (in)); + gst_buffer_set_caps (buffer, caps); + GST_BUFFER_TIMESTAMP (buffer) = ts; + GST_BUFFER_DURATION (buffer) = tso; + GST_BUFFER_FREE_FUNC (buffer) = buffer_dropped; + GST_DEBUG ("created buffer: %p, data=%p", buffer, GST_BUFFER_DATA (buffer)); + + if (!i) + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); + + inbuffers = g_list_append (inbuffers, buffer); + + /* hackish way to update the rtp header */ + in[1] = 0x00; + in[3]++; /* seqnumber */ + in[7] += RTP_FRAME_SIZE; /* inc. timestamp with framesize */ + ts += tso; + } + gst_caps_unref (caps); + num_dropped = 0; + + return jitterbuffer; +} + +static GstStateChangeReturn +start_jitterbuffer (GstElement * jitterbuffer) +{ + GstStateChangeReturn ret; + GstClockTime now; + GstClock *clock; + + clock = gst_element_get_clock (jitterbuffer); + now = gst_clock_get_time (clock); + gst_object_unref (clock); + + gst_element_set_base_time (jitterbuffer, now); + ret = gst_element_set_state (jitterbuffer, GST_STATE_PLAYING); + + return ret; +} + +static void +cleanup_jitterbuffer (GstElement * jitterbuffer) +{ + GST_DEBUG ("cleanup_jitterbuffer"); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; + + g_list_free (inbuffers); + inbuffers = NULL; + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (jitterbuffer); + gst_check_teardown_sink_pad (jitterbuffer); + gst_check_teardown_element (jitterbuffer); +} + +static void +check_jitterbuffer_results (GstElement * jitterbuffer, gint num_buffers) +{ + GstBuffer *buffer; + GList *node; + GstClockTime ts = G_GUINT64_CONSTANT (0); + GstClockTime tso = gst_util_uint64_scale (RTP_FRAME_SIZE, GST_SECOND, 8000); + guint8 *data; + guint16 prev_sn = 0, cur_sn; + guint32 prev_ts = 0, cur_ts; + + /* sleep for twice the latency */ + g_usleep (400 * 1000); + + GST_INFO ("of %d buffer %d/%d received/dropped", num_buffers, + g_list_length (buffers), num_dropped); + /* if this fails, not all buffers have been processed */ + fail_unless_equals_int ((g_list_length (buffers) + num_dropped), num_buffers); + + /* check the buffer list */ + fail_unless_equals_int (g_list_length (buffers), num_buffers); + for (node = buffers; node; node = g_list_next (node)) { + fail_if ((buffer = (GstBuffer *) node->data) == NULL); + fail_if (GST_BUFFER_TIMESTAMP (buffer) != ts); + data = GST_BUFFER_DATA (buffer); + cur_sn = ((guint16) data[2] << 8) | data[3]; + cur_ts = ((guint32) data[4] << 24) | ((guint32) data[5] << 16) | + ((guint32) data[6] << 8) | data[7]; + + if (node != buffers) { + fail_unless (cur_sn > prev_sn); + fail_unless (cur_ts > prev_ts); + + prev_sn = cur_sn; + prev_ts = cur_ts; + } + ts += tso; + } +} + +GST_START_TEST (test_push_forward_seq) +{ + GstElement *jitterbuffer; + const guint num_buffers = 3; + GstBuffer *buffer; + GList *node; + + jitterbuffer = setup_jitterbuffer (num_buffers); + fail_unless (start_jitterbuffer (jitterbuffer) + == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); + + /* push buffers: 0,1,2, */ + for (node = inbuffers; node; node = g_list_next (node)) { + buffer = (GstBuffer *) node->data; + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + } + + /* check the buffer list */ + check_jitterbuffer_results (jitterbuffer, num_buffers); + + /* cleanup */ + cleanup_jitterbuffer (jitterbuffer); +} + +GST_END_TEST; + +GST_START_TEST (test_push_backward_seq) +{ + GstElement *jitterbuffer; + const guint num_buffers = 4; + GstBuffer *buffer; + GList *node; + + jitterbuffer = setup_jitterbuffer (num_buffers); + fail_unless (start_jitterbuffer (jitterbuffer) + == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); + + /* push buffers: 0,3,2,1 */ + buffer = (GstBuffer *) inbuffers->data; + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + for (node = g_list_last (inbuffers); node != inbuffers; + node = g_list_previous (node)) { + buffer = (GstBuffer *) node->data; + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + } + + /* check the buffer list */ + check_jitterbuffer_results (jitterbuffer, num_buffers); + + /* cleanup */ + cleanup_jitterbuffer (jitterbuffer); +} + +GST_END_TEST; + +GST_START_TEST (test_push_unordered) +{ + GstElement *jitterbuffer; + const guint num_buffers = 4; + GstBuffer *buffer; + + jitterbuffer = setup_jitterbuffer (num_buffers); + fail_unless (start_jitterbuffer (jitterbuffer) + == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); + + /* push buffers; 0,2,1,3 */ + buffer = (GstBuffer *) inbuffers->data; + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + buffer = g_list_nth_data (inbuffers, 2); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + buffer = g_list_nth_data (inbuffers, 1); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + buffer = g_list_nth_data (inbuffers, 3); + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + + /* check the buffer list */ + check_jitterbuffer_results (jitterbuffer, num_buffers); + + /* cleanup */ + cleanup_jitterbuffer (jitterbuffer); +} + +GST_END_TEST; + +GST_START_TEST (test_basetime) +{ + GstElement *jitterbuffer; + const guint num_buffers = 3; + GstBuffer *buffer; + GList *node; + GstClockTime tso = gst_util_uint64_scale (RTP_FRAME_SIZE, GST_SECOND, 8000); + + jitterbuffer = setup_jitterbuffer (num_buffers); + fail_unless (start_jitterbuffer (jitterbuffer) + == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); + + /* push buffers: 2,1,0 */ + for (node = g_list_last (inbuffers); node; node = g_list_previous (node)) { + buffer = (GstBuffer *) node->data; + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + } + + /* sleep for twice the latency */ + g_usleep (400 * 1000); + + /* if this fails, not all buffers have been processed */ + fail_unless_equals_int ((g_list_length (buffers) + num_dropped), num_buffers); + + buffer = (GstBuffer *) buffers->data; + fail_unless (GST_BUFFER_TIMESTAMP (buffer) != (num_buffers * tso)); + + /* cleanup */ + cleanup_jitterbuffer (jitterbuffer); +} + +GST_END_TEST; + + +static Suite * +rtpjitterbuffer_suite (void) +{ + Suite *s = suite_create ("rtpjitterbuffer"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_push_forward_seq); + tcase_add_test (tc_chain, test_push_backward_seq); + tcase_add_test (tc_chain, test_push_unordered); + tcase_add_test (tc_chain, test_basetime); + + /* FIXME: test buffer lists */ + + return s; +} + +GST_CHECK_MAIN (rtpjitterbuffer); diff --git a/tests/check/elements/shapewipe.c b/tests/check/elements/shapewipe.c new file mode 100644 index 0000000..d38f9ea --- /dev/null +++ b/tests/check/elements/shapewipe.c @@ -0,0 +1,307 @@ +/* GStreamer + * + * Copyright (C) 2009 Sebastian Dröge + * + * 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 + +#include + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *myvideosrcpad, *mymasksrcpad, *mysinkpad; + + +#define SHAPEWIPE_VIDEO_CAPS_STRING \ + "video/x-raw-yuv, " \ + "format = (GstFourcc)AYUV, " \ + "width = 400, " \ + "height = 400, " \ + "framerate = 0/1" + +#define SHAPEWIPE_MASK_CAPS_STRING \ + "video/x-raw-gray, " \ + "bpp = 8, " \ + "depth = 8, " \ + "width = 400, " \ + "height = 400, " \ + "framerate = 0/1" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SHAPEWIPE_VIDEO_CAPS_STRING) + ); +static GstStaticPadTemplate videosrctemplate = +GST_STATIC_PAD_TEMPLATE ("videosrc", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SHAPEWIPE_VIDEO_CAPS_STRING) + ); +static GstStaticPadTemplate masksrctemplate = +GST_STATIC_PAD_TEMPLATE ("masksrc", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SHAPEWIPE_MASK_CAPS_STRING) + ); + + +static GstBuffer *output = NULL; + +static GstFlowReturn +on_chain (GstPad * pad, GstBuffer * buffer) +{ + g_return_val_if_fail (output == NULL, GST_FLOW_ERROR); + + output = buffer; + return GST_FLOW_OK; +} + +GST_START_TEST (test_general) +{ + GstElement *shapewipe; + GstPad *p; + GstCaps *caps; + GstBuffer *mask, *input; + guint i, j; + guint8 *data; + + myvideosrcpad = + gst_pad_new_from_static_template (&videosrctemplate, "videosrc"); + gst_pad_set_active (myvideosrcpad, TRUE); + caps = gst_caps_from_string (SHAPEWIPE_VIDEO_CAPS_STRING); + gst_pad_set_caps (myvideosrcpad, caps); + gst_caps_unref (caps); + + mymasksrcpad = gst_pad_new_from_static_template (&masksrctemplate, "masksrc"); + gst_pad_set_active (mymasksrcpad, TRUE); + caps = gst_caps_from_string (SHAPEWIPE_MASK_CAPS_STRING); + gst_pad_set_caps (mymasksrcpad, caps); + gst_caps_unref (caps); + + mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); + gst_pad_set_chain_function (mysinkpad, on_chain); + gst_pad_set_active (mysinkpad, TRUE); + caps = gst_caps_from_string (SHAPEWIPE_VIDEO_CAPS_STRING); + gst_pad_set_caps (mysinkpad, caps); + gst_caps_unref (caps); + + shapewipe = gst_element_factory_make ("shapewipe", NULL); + fail_unless (shapewipe != NULL); + + p = gst_element_get_static_pad (shapewipe, "video_sink"); + fail_unless (gst_pad_link (myvideosrcpad, p) == GST_PAD_LINK_OK); + gst_object_unref (p); + p = gst_element_get_static_pad (shapewipe, "mask_sink"); + fail_unless (gst_pad_link (mymasksrcpad, p) == GST_PAD_LINK_OK); + gst_object_unref (p); + p = gst_element_get_static_pad (shapewipe, "src"); + fail_unless (gst_pad_link (p, mysinkpad) == GST_PAD_LINK_OK); + gst_object_unref (p); + + fail_unless (gst_element_set_state (shapewipe, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); + + mask = gst_buffer_new_and_alloc (400 * 400); + caps = gst_caps_from_string (SHAPEWIPE_MASK_CAPS_STRING); + gst_buffer_set_caps (mask, caps); + gst_caps_unref (caps); + data = GST_BUFFER_DATA (mask); + for (i = 0; i < 400; i++) { + for (j = 0; j < 400; j++) { + if (i < 100 && j < 100) + data[0] = 0; + else if (i < 200 && j < 200) + data[0] = 85; + else if (i < 300 && j < 300) + data[0] = 170; + else + data[0] = 254; + data++; + } + } + + fail_unless (gst_pad_push (mymasksrcpad, mask) == GST_FLOW_OK); + + input = gst_buffer_new_and_alloc (400 * 400 * 4); + caps = gst_caps_from_string (SHAPEWIPE_VIDEO_CAPS_STRING); + gst_buffer_set_caps (input, caps); + gst_caps_unref (caps); + data = GST_BUFFER_DATA (input); + for (i = 0; i < 400; i++) { + for (j = 0; j < 400; j++) { + /* This is green */ + data[0] = 255; /* A */ + data[1] = 173; /* Y */ + data[2] = 42; /* U */ + data[3] = 26; /* V */ + data += 4; + } + } + + g_object_set (G_OBJECT (shapewipe), "position", 0.0, NULL); + output = NULL; + fail_unless (gst_pad_push (myvideosrcpad, + gst_buffer_ref (input)) == GST_FLOW_OK); + fail_unless (output != NULL); + data = GST_BUFFER_DATA (output); + for (i = 0; i < 400; i++) { + for (j = 0; j < 400; j++) { + fail_unless_equals_int (data[0], 255); /* A */ + fail_unless_equals_int (data[1], 173); /* Y */ + fail_unless_equals_int (data[2], 42); /* U */ + fail_unless_equals_int (data[3], 26); /* V */ + data += 4; + } + } + gst_buffer_unref (output); + output = NULL; + + g_object_set (G_OBJECT (shapewipe), "position", 0.1, NULL); + output = NULL; + fail_unless (gst_pad_push (myvideosrcpad, + gst_buffer_ref (input)) == GST_FLOW_OK); + fail_unless (output != NULL); + data = GST_BUFFER_DATA (output); + for (i = 0; i < 400; i++) { + for (j = 0; j < 400; j++) { + if (i < 100 && j < 100) { + fail_unless_equals_int (data[0], 0); /* A */ + fail_unless_equals_int (data[1], 173); /* Y */ + fail_unless_equals_int (data[2], 42); /* U */ + fail_unless_equals_int (data[3], 26); /* V */ + } else { + fail_unless_equals_int (data[0], 255); /* A */ + fail_unless_equals_int (data[1], 173); /* Y */ + fail_unless_equals_int (data[2], 42); /* U */ + fail_unless_equals_int (data[3], 26); /* V */ + } + data += 4; + } + } + gst_buffer_unref (output); + output = NULL; + + g_object_set (G_OBJECT (shapewipe), "position", 0.34, NULL); + output = NULL; + fail_unless (gst_pad_push (myvideosrcpad, + gst_buffer_ref (input)) == GST_FLOW_OK); + fail_unless (output != NULL); + data = GST_BUFFER_DATA (output); + for (i = 0; i < 400; i++) { + for (j = 0; j < 400; j++) { + if (i < 200 && j < 200) { + fail_unless_equals_int (data[0], 0); /* A */ + fail_unless_equals_int (data[1], 173); /* Y */ + fail_unless_equals_int (data[2], 42); /* U */ + fail_unless_equals_int (data[3], 26); /* V */ + } else { + fail_unless_equals_int (data[0], 255); /* A */ + fail_unless_equals_int (data[1], 173); /* Y */ + fail_unless_equals_int (data[2], 42); /* U */ + fail_unless_equals_int (data[3], 26); /* V */ + } + data += 4; + } + } + gst_buffer_unref (output); + output = NULL; + + g_object_set (G_OBJECT (shapewipe), "position", 0.67, NULL); + output = NULL; + fail_unless (gst_pad_push (myvideosrcpad, + gst_buffer_ref (input)) == GST_FLOW_OK); + fail_unless (output != NULL); + data = GST_BUFFER_DATA (output); + for (i = 0; i < 400; i++) { + for (j = 0; j < 400; j++) { + if (i < 300 && j < 300) { + fail_unless_equals_int (data[0], 0); /* A */ + fail_unless_equals_int (data[1], 173); /* Y */ + fail_unless_equals_int (data[2], 42); /* U */ + fail_unless_equals_int (data[3], 26); /* V */ + } else { + fail_unless_equals_int (data[0], 255); /* A */ + fail_unless_equals_int (data[1], 173); /* Y */ + fail_unless_equals_int (data[2], 42); /* U */ + fail_unless_equals_int (data[3], 26); /* V */ + } + data += 4; + } + } + gst_buffer_unref (output); + output = NULL; + + g_object_set (G_OBJECT (shapewipe), "position", 1.0, NULL); + output = NULL; + fail_unless (gst_pad_push (myvideosrcpad, + gst_buffer_ref (input)) == GST_FLOW_OK); + fail_unless (output != NULL); + data = GST_BUFFER_DATA (output); + for (i = 0; i < 400; i++) { + for (j = 0; j < 400; j++) { + fail_unless_equals_int (data[0], 0); /* A */ + fail_unless_equals_int (data[1], 173); /* Y */ + fail_unless_equals_int (data[2], 42); /* U */ + fail_unless_equals_int (data[3], 26); /* V */ + data += 4; + } + } + gst_buffer_unref (output); + output = NULL; + + gst_buffer_unref (input); + + fail_unless (gst_element_set_state (shapewipe, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); + + p = gst_element_get_static_pad (shapewipe, "video_sink"); + fail_unless (gst_pad_unlink (myvideosrcpad, p)); + gst_object_unref (p); + p = gst_element_get_static_pad (shapewipe, "mask_sink"); + fail_unless (gst_pad_unlink (mymasksrcpad, p)); + gst_object_unref (p); + p = gst_element_get_static_pad (shapewipe, "src"); + fail_unless (gst_pad_unlink (p, mysinkpad)); + gst_object_unref (p); + + gst_object_unref (myvideosrcpad); + gst_object_unref (mymasksrcpad); + gst_object_unref (mysinkpad); + gst_object_unref (shapewipe); +} + +GST_END_TEST; + +static Suite * +shapewipe_suite (void) +{ + Suite *s = suite_create ("shapewipe"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_set_timeout (tc_chain, 180); + tcase_add_test (tc_chain, test_general); + + return s; +} + +GST_CHECK_MAIN (shapewipe); diff --git a/tests/check/elements/souphttpsrc.c b/tests/check/elements/souphttpsrc.c new file mode 100644 index 0000000..9fc8f7c --- /dev/null +++ b/tests/check/elements/souphttpsrc.c @@ -0,0 +1,639 @@ +/* GStreamer unit tests for the souphttpsrc element + * Copyright (C) 2006-2007 Tim-Philipp Müller + * Copyright (C) 2008 Wouter Cloetens + * Copyright (C) 2001-2003, Ximian, Inc. + * + * 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static guint http_port = 0, https_port = 0; + +gboolean redirect = TRUE; + +static const char **cookies = NULL; + +/* Variables for authentication tests */ +static const char *user_id = NULL; +static const char *user_pw = NULL; +static const char *good_user = "good_user"; +static const char *bad_user = "bad_user"; +static const char *good_pw = "good_pw"; +static const char *bad_pw = "bad_pw"; +static const char *realm = "SOUPHTTPSRC_REALM"; +static const char *basic_auth_path = "/basic_auth"; +static const char *digest_auth_path = "/digest_auth"; + +static int run_server (guint * http_port, guint * https_port); +static void stop_server (void); + +static void +handoff_cb (GstElement * fakesink, GstBuffer * buf, GstPad * pad, + GstBuffer ** p_outbuf) +{ + GST_LOG ("handoff, buf = %p", buf); + if (*p_outbuf == NULL) + *p_outbuf = gst_buffer_ref (buf); +} + +static gboolean +basic_auth_cb (SoupAuthDomain * domain, SoupMessage * msg, + const char *username, const char *password, gpointer user_data) +{ + /* There is only one good login for testing */ + return (strcmp (username, good_user) == 0) + && (strcmp (password, good_pw) == 0); +} + + +static char * +digest_auth_cb (SoupAuthDomain * domain, SoupMessage * msg, + const char *username, gpointer user_data) +{ + /* There is only one good login for testing */ + if (strcmp (username, good_user) == 0) + return soup_auth_domain_digest_encode_password (good_user, realm, good_pw); + return NULL; +} + +static int +run_test (const char *format, ...) +{ + GstStateChangeReturn ret; + + GstElement *pipe, *src, *sink; + + GstBuffer *buf = NULL; + + GstMessage *msg; + + gchar *url; + + va_list args; + + int rc = -1; + + pipe = gst_pipeline_new (NULL); + + src = gst_element_factory_make ("souphttpsrc", NULL); + fail_unless (src != NULL); + + sink = gst_element_factory_make ("fakesink", NULL); + fail_unless (sink != NULL); + + gst_bin_add (GST_BIN (pipe), src); + gst_bin_add (GST_BIN (pipe), sink); + fail_unless (gst_element_link (src, sink)); + + if (http_port == 0) { + GST_DEBUG ("failed to start soup http server"); + } + fail_unless (http_port != 0); + va_start (args, format); + g_vasprintf (&url, format, args); + va_end (args); + fail_unless (url != NULL); + g_object_set (src, "location", url, NULL); + g_free (url); + + g_object_set (src, "automatic-redirect", redirect, NULL); + if (cookies != NULL) + g_object_set (src, "cookies", cookies, NULL); + g_object_set (sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "preroll-handoff", G_CALLBACK (handoff_cb), &buf); + + if (user_id != NULL) + g_object_set (src, "user-id", user_id, NULL); + if (user_pw != NULL) + g_object_set (src, "user-pw", user_pw, NULL); + + ret = gst_element_set_state (pipe, GST_STATE_PAUSED); + if (ret != GST_STATE_CHANGE_ASYNC) { + GST_DEBUG ("failed to start up soup http src, ret = %d", ret); + goto done; + } + + gst_element_set_state (pipe, GST_STATE_PLAYING); + msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), + GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + gchar *debug = NULL; + + GError *err = NULL; + + gst_message_parse_error (msg, &err, &debug); + GST_INFO ("error: %s", err->message); + if (g_str_has_suffix (err->message, "Not Found")) + rc = 404; + else if (g_str_has_suffix (err->message, "Forbidden")) + rc = 403; + else if (g_str_has_suffix (err->message, "Unauthorized")) + rc = 401; + else if (g_str_has_suffix (err->message, "Found")) + rc = 302; + GST_INFO ("debug: %s", debug); + g_error_free (err); + g_free (debug); + gst_message_unref (msg); + goto done; + } + gst_message_unref (msg); + + /* don't wait for more than 10 seconds */ + ret = gst_element_get_state (pipe, NULL, NULL, 10 * GST_SECOND); + GST_LOG ("ret = %u", ret); + + if (buf == NULL) { + /* we want to test the buffer offset, nothing else; if there's a failure + * it might be for lots of reasons (no network connection, whatever), we're + * not interested in those */ + GST_DEBUG ("didn't manage to get data within 10 seconds, skipping test"); + goto done; + } + + GST_DEBUG ("buffer offset = %" G_GUINT64_FORMAT, GST_BUFFER_OFFSET (buf)); + + /* first buffer should have a 0 offset */ + fail_unless (GST_BUFFER_OFFSET (buf) == 0); + gst_buffer_unref (buf); + rc = 0; + +done: + + gst_element_set_state (pipe, GST_STATE_NULL); + gst_object_unref (pipe); + return rc; +} + +GST_START_TEST (test_first_buffer_has_offset) +{ + fail_unless (run_test ("http://127.0.0.1:%u/", http_port) == 0); +} + +GST_END_TEST; + +GST_START_TEST (test_not_found) +{ + fail_unless (run_test ("http://127.0.0.1:%u/404", http_port) == 404); +} + +GST_END_TEST; + +GST_START_TEST (test_forbidden) +{ + fail_unless (run_test ("http://127.0.0.1:%u/403", http_port) == 403); +} + +GST_END_TEST; + +GST_START_TEST (test_redirect_no) +{ + redirect = FALSE; + fail_unless (run_test ("http://127.0.0.1:%u/302", http_port) == 302); +} + +GST_END_TEST; + +GST_START_TEST (test_redirect_yes) +{ + redirect = TRUE; + fail_unless (run_test ("http://127.0.0.1:%u/302", http_port) == 0); +} + +GST_END_TEST; + +GST_START_TEST (test_https) +{ + if (!https_port) + GST_INFO ("Failed to start an HTTPS server; let's just skip this test."); + else + fail_unless (run_test ("https://127.0.0.1:%u/", https_port) == 0); +} + +GST_END_TEST; + +GST_START_TEST (test_cookies) +{ + static const char *biscotti[] = { "delacre=yummie", "koekje=lu", NULL }; + int rc; + + cookies = biscotti; + rc = run_test ("http://127.0.0.1:%u/", http_port); + cookies = NULL; + fail_unless (rc == 0); +} + +GST_END_TEST; + +GST_START_TEST (test_good_user_basic_auth) +{ + int res; + + user_id = good_user; + user_pw = good_pw; + res = run_test ("http://127.0.0.1:%u%s", http_port, basic_auth_path); + GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res); + user_id = user_pw = NULL; + fail_unless (res == 0); +} + +GST_END_TEST; + +GST_START_TEST (test_bad_user_basic_auth) +{ + int res; + + user_id = bad_user; + user_pw = good_pw; + res = run_test ("http://127.0.0.1:%u%s", http_port, basic_auth_path); + GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res); + user_id = user_pw = NULL; + fail_unless (res == 401); +} + +GST_END_TEST; + +GST_START_TEST (test_bad_password_basic_auth) +{ + int res; + + user_id = good_user; + user_pw = bad_pw; + res = run_test ("http://127.0.0.1:%u%s", http_port, basic_auth_path); + GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res); + user_id = user_pw = NULL; + fail_unless (res == 401); +} + +GST_END_TEST; + +GST_START_TEST (test_good_user_digest_auth) +{ + int res; + + user_id = good_user; + user_pw = good_pw; + res = run_test ("http://127.0.0.1:%u%s", http_port, digest_auth_path); + GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res); + user_id = user_pw = NULL; + fail_unless (res == 0); +} + +GST_END_TEST; + +GST_START_TEST (test_bad_user_digest_auth) +{ + int res; + + user_id = bad_user; + user_pw = good_pw; + res = run_test ("http://127.0.0.1:%u%s", http_port, digest_auth_path); + GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res); + user_id = user_pw = NULL; + fail_unless (res == 401); +} + +GST_END_TEST; + +GST_START_TEST (test_bad_password_digest_auth) +{ + int res; + + user_id = good_user; + user_pw = bad_pw; + res = run_test ("http://127.0.0.1:%u%s", http_port, digest_auth_path); + GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res); + user_id = user_pw = NULL; + fail_unless (res == 401); +} + +GST_END_TEST; + +static gboolean icy_caps = FALSE; + +static void +got_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad, + gpointer user_data) +{ + GstStructure *s; + + /* Caps can be anything if we don't except icy caps */ + if (!icy_caps) + return; + + /* Otherwise they _must_ be "application/x-icy" */ + fail_unless (GST_BUFFER_CAPS (buf) != NULL); + s = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0); + fail_unless_equals_string (gst_structure_get_name (s), "application/x-icy"); +} + +GST_START_TEST (test_icy_stream) +{ + GstElement *pipe, *src, *sink; + + GstMessage *msg; + + pipe = gst_pipeline_new (NULL); + + src = gst_element_factory_make ("souphttpsrc", NULL); + fail_unless (src != NULL); + g_object_set (src, "iradio-mode", TRUE, NULL); + + sink = gst_element_factory_make ("fakesink", NULL); + fail_unless (sink != NULL); + g_object_set (sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "handoff", G_CALLBACK (got_buffer), NULL); + + gst_bin_add (GST_BIN (pipe), src); + gst_bin_add (GST_BIN (pipe), sink); + fail_unless (gst_element_link (src, sink)); + + /* First try Virgin Radio Ogg stream, to see if there's connectivity and all + * (which is an attempt to work around the completely horrid error reporting + * and that we can't distinguish different types of failures here). */ + + g_object_set (src, "location", "http://ogg2.smgradio.com/vr32.ogg", NULL); + g_object_set (src, "num-buffers", 1, NULL); + icy_caps = FALSE; + gst_element_set_state (pipe, GST_STATE_PLAYING); + + msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), + GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + GST_INFO ("looks like there's no net connectivity or sgmradio.com is " + "down. In any case, let's just skip this test"); + gst_message_unref (msg); + goto done; + } + gst_message_unref (msg); + msg = NULL; + gst_element_set_state (pipe, GST_STATE_NULL); + + /* Now, if the ogg stream works, the mp3 shoutcast stream should work as + * well (time will tell if that's true) */ + + /* Virgin Radio 32kbps mp3 shoutcast stream */ + g_object_set (src, "location", "http://mp3-vr-32.smgradio.com:80/", NULL); + + + /* EOS after the first buffer */ + g_object_set (src, "num-buffers", 1, NULL); + icy_caps = TRUE; + gst_element_set_state (pipe, GST_STATE_PLAYING); + msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), + GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); + + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { + GST_DEBUG ("success, we're done here"); + gst_message_unref (msg); + goto done; + } + + { + GError *err = NULL; + + gst_message_parse_error (msg, &err, NULL); + gst_message_unref (msg); + g_error ("Error with ICY mp3 shoutcast stream: %s", err->message); + g_error_free (err); + } + +done: + icy_caps = FALSE; + + gst_element_set_state (pipe, GST_STATE_NULL); + gst_object_unref (pipe); +} + +GST_END_TEST; + +static Suite * +souphttpsrc_suite (void) +{ + Suite *s; + + TCase *tc_chain, *tc_internet; + + g_type_init (); + +#if !GLIB_CHECK_VERSION (2, 31, 0) + if (!g_thread_supported ()) + g_thread_init (NULL); +#endif + + s = suite_create ("souphttpsrc"); + tc_chain = tcase_create ("general"); + tc_internet = tcase_create ("internet"); + + suite_add_tcase (s, tc_chain); + run_server (&http_port, &https_port); + atexit (stop_server); + tcase_add_test (tc_chain, test_first_buffer_has_offset); + tcase_add_test (tc_chain, test_redirect_yes); + tcase_add_test (tc_chain, test_redirect_no); + tcase_add_test (tc_chain, test_not_found); + tcase_add_test (tc_chain, test_forbidden); + tcase_add_test (tc_chain, test_cookies); + tcase_add_test (tc_chain, test_good_user_basic_auth); + tcase_add_test (tc_chain, test_bad_user_basic_auth); + tcase_add_test (tc_chain, test_bad_password_basic_auth); + tcase_add_test (tc_chain, test_good_user_digest_auth); + tcase_add_test (tc_chain, test_bad_user_digest_auth); + tcase_add_test (tc_chain, test_bad_password_digest_auth); + if (soup_ssl_supported) + tcase_add_test (tc_chain, test_https); + + suite_add_tcase (s, tc_internet); + tcase_set_timeout (tc_internet, 250); + tcase_add_test (tc_internet, test_icy_stream); + + return s; +} + +GST_CHECK_MAIN (souphttpsrc); + +static void +do_get (SoupMessage * msg, const char *path) +{ + char *uri; + + int buflen = 4096; + + SoupKnownStatusCode status = SOUP_STATUS_OK; + + uri = soup_uri_to_string (soup_message_get_uri (msg), FALSE); + GST_DEBUG ("request: \"%s\"", uri); + + if (!strcmp (path, "/301")) + status = SOUP_STATUS_MOVED_PERMANENTLY; + else if (!strcmp (path, "/302")) + status = SOUP_STATUS_MOVED_TEMPORARILY; + else if (!strcmp (path, "/307")) + status = SOUP_STATUS_TEMPORARY_REDIRECT; + else if (!strcmp (path, "/403")) + status = SOUP_STATUS_FORBIDDEN; + else if (!strcmp (path, "/404")) + status = SOUP_STATUS_NOT_FOUND; + + if (SOUP_STATUS_IS_REDIRECTION (status)) { + char *redir_uri; + + redir_uri = g_strdup_printf ("%s-redirected", uri); + soup_message_headers_append (msg->response_headers, "Location", redir_uri); + g_free (redir_uri); + } + if (status != SOUP_STATUS_OK) + goto leave; + + if (msg->method == SOUP_METHOD_GET) { + char *buf; + + buf = g_malloc (buflen); + memset (buf, 0, buflen); + soup_message_body_append (msg->response_body, SOUP_MEMORY_TAKE, + buf, buflen); + } else { /* msg->method == SOUP_METHOD_HEAD */ + + char *length; + + /* We could just use the same code for both GET and + * HEAD. But we'll optimize and avoid the extra + * malloc. + */ + length = g_strdup_printf ("%lu", (gulong) buflen); + soup_message_headers_append (msg->response_headers, + "Content-Length", length); + g_free (length); + } + +leave: + soup_message_set_status (msg, status); + g_free (uri); +} + +static void +print_header (const char *name, const char *value, gpointer data) +{ + GST_DEBUG ("header: %s: %s", name, value); +} + +static void +server_callback (SoupServer * server, SoupMessage * msg, + const char *path, GHashTable * query, + SoupClientContext * context, gpointer data) +{ + GST_DEBUG ("%s %s HTTP/1.%d", msg->method, path, + soup_message_get_http_version (msg)); + soup_message_headers_foreach (msg->request_headers, print_header, NULL); + if (msg->request_body->length) + GST_DEBUG ("%s", msg->request_body->data); + + if (msg->method == SOUP_METHOD_GET || msg->method == SOUP_METHOD_HEAD) + do_get (msg, path); + else + soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED); + + GST_DEBUG (" -> %d %s", msg->status_code, msg->reason_phrase); +} + +static SoupServer *server; /* NULL */ +static SoupServer *ssl_server; /* NULL */ + +int +run_server (guint * http_port, guint * https_port) +{ + guint port = SOUP_ADDRESS_ANY_PORT; + guint ssl_port = SOUP_ADDRESS_ANY_PORT; + const char *ssl_cert_file = GST_TEST_FILES_PATH "/test-cert.pem"; + const char *ssl_key_file = GST_TEST_FILES_PATH "/test-key.pem"; + static int server_running = 0; + + SoupAuthDomain *domain = NULL; + + if (server_running) + return 0; + server_running = 1; + + *http_port = *https_port = 0; + + server = soup_server_new (SOUP_SERVER_PORT, port, NULL); + if (!server) { + GST_DEBUG ("Unable to bind to server port %u", port); + return 1; + } + *http_port = soup_server_get_port (server); + GST_INFO ("HTTP server listening on port %u", *http_port); + soup_server_add_handler (server, NULL, server_callback, NULL, NULL); + domain = soup_auth_domain_basic_new (SOUP_AUTH_DOMAIN_REALM, realm, + SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, basic_auth_cb, + SOUP_AUTH_DOMAIN_ADD_PATH, basic_auth_path, NULL); + soup_server_add_auth_domain (server, domain); + g_object_unref (domain); + domain = soup_auth_domain_digest_new (SOUP_AUTH_DOMAIN_REALM, realm, + SOUP_AUTH_DOMAIN_DIGEST_AUTH_CALLBACK, digest_auth_cb, + SOUP_AUTH_DOMAIN_ADD_PATH, digest_auth_path, NULL); + soup_server_add_auth_domain (server, domain); + g_object_unref (domain); + soup_server_run_async (server); + + if (ssl_cert_file && ssl_key_file) { + ssl_server = soup_server_new (SOUP_SERVER_PORT, ssl_port, + SOUP_SERVER_SSL_CERT_FILE, ssl_cert_file, + SOUP_SERVER_SSL_KEY_FILE, ssl_key_file, NULL); + + if (!ssl_server) { + GST_DEBUG ("Unable to bind to SSL server port %u", ssl_port); + return 1; + } + *https_port = soup_server_get_port (ssl_server); + GST_INFO ("HTTPS server listening on port %u", *https_port); + soup_server_add_handler (ssl_server, NULL, server_callback, NULL, NULL); + soup_server_run_async (ssl_server); + } + + return 0; +} + +static void +stop_server (void) +{ + GST_INFO ("cleaning up"); + + if (server) { + g_object_unref (server); + server = NULL; + } + if (ssl_server) { + g_object_unref (ssl_server); + ssl_server = NULL; + } +} diff --git a/tests/check/elements/spectrum.c b/tests/check/elements/spectrum.c new file mode 100644 index 0000000..0eed1dc --- /dev/null +++ b/tests/check/elements/spectrum.c @@ -0,0 +1,570 @@ +/* GStreamer + * + * unit test for spectrum + * + * Copyright (C) <2007> Stefan Kost + * + * 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 + +#include + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define SPECT_CAPS_TEMPLATE_STRING \ + "audio/x-raw-int, " \ + " width = (int) 16, " \ + " depth = (int) 16, " \ + " signed = (boolean) true, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) [ 1, MAX ], " \ + " channels = (int) [ 1, MAX ]; " \ + "audio/x-raw-int, " \ + " width = (int) 32, " \ + " depth = (int) 32, " \ + " signed = (boolean) true, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) [ 1, MAX ], " \ + " channels = (int) [ 1, MAX ]; " \ + "audio/x-raw-float, " \ + " width = (int) { 32, 64 }, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) [ 1, MAX ], " \ + " channels = (int) [ 1, MAX ]" + +#define SPECT_CAPS_STRING_S16 \ + "audio/x-raw-int, " \ + "rate = (int) 44100, " \ + "channels = (int) 1, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 16, " \ + "depth = (int) 16, " \ + "signed = (boolean) true" + +#define SPECT_CAPS_STRING_S32 \ + "audio/x-raw-int, " \ + "rate = (int) 44100, " \ + "channels = (int) 1, " \ + "endianness = (int) BYTE_ORDER, " \ + "width = (int) 32, " \ + "depth = (int) 32, " \ + "signed = (boolean) true" + +#define SPECT_CAPS_STRING_F32 \ + "audio/x-raw-float, " \ + " width = (int) 32, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) 44100, " \ + " channels = (int) 1" + +#define SPECT_CAPS_STRING_F64 \ + "audio/x-raw-float, " \ + " width = (int) 64, " \ + " endianness = (int) BYTE_ORDER, " \ + " rate = (int) 44100, " \ + " channels = (int) 1" + +#define SPECT_BANDS 256 + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SPECT_CAPS_TEMPLATE_STRING) + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SPECT_CAPS_TEMPLATE_STRING) + ); + +/* takes over reference for outcaps */ +static GstElement * +setup_spectrum (void) +{ + GstElement *spectrum; + + GST_DEBUG ("setup_spectrum"); + spectrum = gst_check_setup_element ("spectrum"); + mysrcpad = gst_check_setup_src_pad (spectrum, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (spectrum, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return spectrum; +} + +static void +cleanup_spectrum (GstElement * spectrum) +{ + GST_DEBUG ("cleanup_spectrum"); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (spectrum); + gst_check_teardown_sink_pad (spectrum); + gst_check_teardown_element (spectrum); + + g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); + g_list_free (buffers); + buffers = NULL; +} + + +GST_START_TEST (test_int16) +{ + GstElement *spectrum; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + GstCaps *caps; + GstMessage *message; + const GstStructure *structure; + int i, j; + gint16 *data; + const GValue *list, *value; + GstClockTime endtime; + gfloat level; + + spectrum = setup_spectrum (); + g_object_set (spectrum, "message", TRUE, "interval", GST_SECOND / 100, + "bands", SPECT_BANDS, "threshold", -80, NULL); + + fail_unless (gst_element_set_state (spectrum, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* create a 1 sec buffer with an 11025 Hz sine wave */ + inbuffer = gst_buffer_new_and_alloc (44100 * sizeof (gint16)); + data = (gint16 *) GST_BUFFER_DATA (inbuffer); + + for (j = 0; j < 44100; j += 4) { + *data = 0; + ++data; + *data = 32767; + ++data; + *data = 0; + ++data; + *data = -32767; + ++data; + } + + caps = gst_caps_from_string (SPECT_CAPS_STRING_S16); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* create a bus to get the spectrum message on */ + bus = gst_bus_new (); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_element_set_bus (spectrum, bus); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); + ASSERT_OBJECT_REFCOUNT (message, "message", 1); + + fail_unless (message != NULL); + fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (spectrum)); + fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); + structure = gst_message_get_structure (message); + fail_if (structure == NULL); + fail_unless_equals_string ((char *) gst_structure_get_name (structure), + "spectrum"); + fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); + + list = gst_structure_get_value (structure, "magnitude"); + for (i = 0; i < SPECT_BANDS; ++i) { + value = gst_value_list_get_value (list, i); + level = g_value_get_float (value); + GST_DEBUG ("band[%3d] is %.2f", i, level); + /* Only the bands in the middle should have a level above 60 */ + fail_if ((i == SPECT_BANDS / 2 || i == SPECT_BANDS / 2 - 1) + && level < -20.0); + fail_if ((i != SPECT_BANDS / 2 && i != SPECT_BANDS / 2 - 1) + && level > -20.0); + } + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + /* clean up */ + /* flush current messages,and future state change messages */ + gst_bus_set_flushing (bus, TRUE); + + /* message has a ref to the element */ + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 2); + gst_message_unref (message); + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); + + gst_element_set_bus (spectrum, NULL); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_object_unref (bus); + fail_unless (gst_element_set_state (spectrum, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); + cleanup_spectrum (spectrum); +} + +GST_END_TEST; + +GST_START_TEST (test_int32) +{ + GstElement *spectrum; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + GstCaps *caps; + GstMessage *message; + const GstStructure *structure; + int i, j; + gint32 *data; + const GValue *list, *value; + GstClockTime endtime; + gfloat level; + + spectrum = setup_spectrum (); + g_object_set (spectrum, "message", TRUE, "interval", GST_SECOND / 100, + "bands", SPECT_BANDS, "threshold", -80, NULL); + + fail_unless (gst_element_set_state (spectrum, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* create a 1 sec buffer with an 11025 Hz sine wave */ + inbuffer = gst_buffer_new_and_alloc (44100 * sizeof (gint32)); + data = (gint32 *) GST_BUFFER_DATA (inbuffer); + for (j = 0; j < 44100; j += 4) { + *data = 0; + ++data; + *data = 2147483647; + ++data; + *data = 0; + ++data; + *data = -2147483647; + ++data; + } + caps = gst_caps_from_string (SPECT_CAPS_STRING_S32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* create a bus to get the spectrum message on */ + bus = gst_bus_new (); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_element_set_bus (spectrum, bus); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); + ASSERT_OBJECT_REFCOUNT (message, "message", 1); + + fail_unless (message != NULL); + fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (spectrum)); + fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); + structure = gst_message_get_structure (message); + fail_if (structure == NULL); + fail_unless_equals_string ((char *) gst_structure_get_name (structure), + "spectrum"); + fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); + + list = gst_structure_get_value (structure, "magnitude"); + for (i = 0; i < SPECT_BANDS; ++i) { + value = gst_value_list_get_value (list, i); + level = g_value_get_float (value); + GST_DEBUG ("band[%3d] is %.2f", i, level); + /* Only the bands in the middle should have a level above 60 */ + fail_if ((i == SPECT_BANDS / 2 || i == SPECT_BANDS / 2 - 1) + && level < -20.0); + fail_if ((i != SPECT_BANDS / 2 && i != SPECT_BANDS / 2 - 1) + && level > -20.0); + } + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + /* clean up */ + /* flush current messages,and future state change messages */ + gst_bus_set_flushing (bus, TRUE); + + /* message has a ref to the element */ + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 2); + gst_message_unref (message); + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); + + gst_element_set_bus (spectrum, NULL); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_object_unref (bus); + fail_unless (gst_element_set_state (spectrum, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); + cleanup_spectrum (spectrum); +} + +GST_END_TEST; + +GST_START_TEST (test_float32) +{ + GstElement *spectrum; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + GstCaps *caps; + GstMessage *message; + const GstStructure *structure; + int i, j; + gfloat *data; + const GValue *list, *value; + GstClockTime endtime; + gfloat level; + + spectrum = setup_spectrum (); + g_object_set (spectrum, "message", TRUE, "interval", GST_SECOND / 100, + "bands", SPECT_BANDS, "threshold", -80, NULL); + + fail_unless (gst_element_set_state (spectrum, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* create a 1 sec buffer with an 11025 Hz sine wave */ + inbuffer = gst_buffer_new_and_alloc (44100 * sizeof (gfloat)); + data = (gfloat *) GST_BUFFER_DATA (inbuffer); + for (j = 0; j < 44100; j += 4) { + *data = 0.0; + ++data; + *data = 1.0; + ++data; + *data = 0.0; + ++data; + *data = -1.0; + ++data; + } + caps = gst_caps_from_string (SPECT_CAPS_STRING_F32); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* create a bus to get the spectrum message on */ + bus = gst_bus_new (); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_element_set_bus (spectrum, bus); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); + ASSERT_OBJECT_REFCOUNT (message, "message", 1); + + fail_unless (message != NULL); + fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (spectrum)); + fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); + structure = gst_message_get_structure (message); + fail_if (structure == NULL); + fail_unless_equals_string ((char *) gst_structure_get_name (structure), + "spectrum"); + fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); + + list = gst_structure_get_value (structure, "magnitude"); + for (i = 0; i < SPECT_BANDS; ++i) { + value = gst_value_list_get_value (list, i); + level = g_value_get_float (value); + GST_DEBUG ("band[%3d] is %.2f", i, level); + /* Only the bands in the middle should have a level above 60 */ + fail_if ((i == SPECT_BANDS / 2 || i == SPECT_BANDS / 2 - 1) + && level < -20.0); + fail_if ((i != SPECT_BANDS / 2 && i != SPECT_BANDS / 2 - 1) + && level > -20.0); + } + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + /* clean up */ + /* flush current messages,and future state change messages */ + gst_bus_set_flushing (bus, TRUE); + + /* message has a ref to the element */ + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 2); + gst_message_unref (message); + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); + + gst_element_set_bus (spectrum, NULL); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_object_unref (bus); + fail_unless (gst_element_set_state (spectrum, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); + cleanup_spectrum (spectrum); +} + +GST_END_TEST; + +GST_START_TEST (test_float64) +{ + GstElement *spectrum; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + GstCaps *caps; + GstMessage *message; + const GstStructure *structure; + int i, j; + gdouble *data; + const GValue *list, *value; + GstClockTime endtime; + gfloat level; + + spectrum = setup_spectrum (); + g_object_set (spectrum, "message", TRUE, "interval", GST_SECOND / 100, + "bands", SPECT_BANDS, "threshold", -80, NULL); + + fail_unless (gst_element_set_state (spectrum, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + /* create a 1 sec buffer with an 11025 Hz sine wave */ + inbuffer = gst_buffer_new_and_alloc (44100 * sizeof (gdouble)); + data = (gdouble *) GST_BUFFER_DATA (inbuffer); + for (j = 0; j < 44100; j += 4) { + *data = 0.0; + ++data; + *data = 1.0; + ++data; + *data = 0.0; + ++data; + *data = -1.0; + ++data; + } + caps = gst_caps_from_string (SPECT_CAPS_STRING_F64); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + + /* create a bus to get the spectrum message on */ + bus = gst_bus_new (); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_element_set_bus (spectrum, bus); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); + + /* pushing gives away my reference ... */ + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + /* ... but it ends up being collected on the global buffer list */ + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); + ASSERT_OBJECT_REFCOUNT (message, "message", 1); + + fail_unless (message != NULL); + fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (spectrum)); + fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); + structure = gst_message_get_structure (message); + fail_if (structure == NULL); + fail_unless_equals_string ((char *) gst_structure_get_name (structure), + "spectrum"); + fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); + + list = gst_structure_get_value (structure, "magnitude"); + for (i = 0; i < SPECT_BANDS; ++i) { + value = gst_value_list_get_value (list, i); + level = g_value_get_float (value); + GST_DEBUG ("band[%3d] is %.2f", i, level); + /* Only the bands in the middle should have a level above 60 */ + fail_if ((i == SPECT_BANDS / 2 || i == SPECT_BANDS / 2 - 1) + && level < -20.0); + fail_if ((i != SPECT_BANDS / 2 && i != SPECT_BANDS / 2 - 1) + && level > -20.0); + } + fail_unless_equals_int (g_list_length (buffers), 1); + fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); + fail_unless (inbuffer == outbuffer); + + /* clean up */ + /* flush current messages,and future state change messages */ + gst_bus_set_flushing (bus, TRUE); + + /* message has a ref to the element */ + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 2); + gst_message_unref (message); + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); + + gst_element_set_bus (spectrum, NULL); + ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); + gst_object_unref (bus); + fail_unless (gst_element_set_state (spectrum, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); + ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); + cleanup_spectrum (spectrum); +} + +GST_END_TEST; + + +static Suite * +spectrum_suite (void) +{ + Suite *s = suite_create ("spectrum"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_int16); + tcase_add_test (tc_chain, test_int32); + tcase_add_test (tc_chain, test_float32); + tcase_add_test (tc_chain, test_float64); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = spectrum_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/sunaudio.c b/tests/check/elements/sunaudio.c new file mode 100644 index 0000000..30b569a --- /dev/null +++ b/tests/check/elements/sunaudio.c @@ -0,0 +1,95 @@ +/* GStreamer unit tests for the sun audio elements + * + * Copyright (C) 2007 Tim-Philipp Müller + * + * 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 +#include +#include +#include + +GST_START_TEST (test_sun_audio_mixer_track) +{ + GstStateChangeReturn state_ret; + GstElement *mixer; + GList *tracks, *l; + + mixer = gst_element_factory_make ("sunaudiomixer", "sunaudiomixer"); + fail_unless (mixer != NULL, "Failed to create 'sunaudiomixer' element!"); + + state_ret = gst_element_set_state (mixer, GST_STATE_READY); + if (state_ret != GST_STATE_CHANGE_SUCCESS) { + gst_object_unref (mixer); + return; + } + + GST_LOG ("opened sunaudiomixer"); + fail_unless (GST_IS_MIXER (mixer), "is not a GstMixer?!"); + + tracks = (GList *) gst_mixer_list_tracks (GST_MIXER (mixer)); + for (l = tracks; l != NULL; l = l->next) { + GObjectClass *klass; + GstMixerTrack *track; + gchar *ulabel = NULL, *label = NULL; + + track = GST_MIXER_TRACK (l->data); + + g_object_get (track, "label", &label, NULL); + fail_unless (label == NULL || g_utf8_validate (label, -1, NULL)); + + /* FIXME: remove this check once we depend on -base >= 0.10.12.1 */ + klass = G_OBJECT_GET_CLASS (track); + if (g_object_class_find_property (klass, "untranslated-label")) { + g_object_get (track, "untranslated-label", &ulabel, NULL); + } + + if (ulabel != NULL) { + gchar *p; + + for (p = ulabel; p != NULL && *p != '\0'; ++p) { + fail_unless (g_ascii_isprint (*p), + "untranslated label '%s' not printable ASCII", ulabel); + } + } + GST_DEBUG ("%s: %s", GST_STR_NULL (ulabel), GST_STR_NULL (label)); + g_free (label); + g_free (ulabel); + } + + fail_unless_equals_int (gst_element_set_state (mixer, GST_STATE_NULL), + GST_STATE_CHANGE_SUCCESS); + + gst_object_unref (mixer); +} + +GST_END_TEST; + + +static Suite * +sunaudio_suite (void) +{ + Suite *s = suite_create ("sunaudio"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_sun_audio_mixer_track); + + return s; +} + +GST_CHECK_MAIN (sunaudio) diff --git a/tests/check/elements/udpsink.c b/tests/check/elements/udpsink.c new file mode 100644 index 0000000..9949ffc --- /dev/null +++ b/tests/check/elements/udpsink.c @@ -0,0 +1,207 @@ +/* GStreamer RTP payloader unit tests + * Copyright (C) 2009 Axis Communications + * @author Ognyan Tonchev + * + * 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 +#include +#include +#include + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +#define RTP_HEADER_SIZE 12 +#define RTP_PAYLOAD_SIZE 1024 + +/* + * Number of bytes received in the render function when using buffer lists + */ +static guint render_list_bytes_received; + +/* + * Render function for testing udpsink with buffer lists + */ +static GstFlowReturn +udpsink_render (GstBaseSink * sink, GstBufferList * list) +{ + GstBufferListIterator *it; + + fail_if (!list); + + /* + * Count the size of the rtp header and the payload in the buffer list. + */ + + it = gst_buffer_list_iterate (list); + + /* Loop through all groups */ + while (gst_buffer_list_iterator_next_group (it)) { + GstBuffer *buf; + /* Loop through all buffers in the current group */ + while ((buf = gst_buffer_list_iterator_next (it))) { + guint size; + + size = GST_BUFFER_SIZE (buf); + GST_DEBUG ("rendered %u bytes", size); + + render_list_bytes_received += size; + } + } + + gst_buffer_list_iterator_free (it); + + return GST_FLOW_OK; +} + +static void +_set_render_function (GstElement * bsink) +{ + GstBaseSinkClass *bsclass; + bsclass = GST_BASE_SINK_GET_CLASS ((GstBaseSink *) bsink); + /* Add callback function for the buffer list tests */ + bsclass->render_list = udpsink_render; +} + +static GstBufferList * +_create_buffer_list (guint * data_size) +{ + GstBufferList *list; + GstBufferListIterator *it; + GstBuffer *rtp_buffer; + GstBuffer *data_buffer; + + list = gst_buffer_list_new (); + it = gst_buffer_list_iterate (list); + + /*** First group, i.e. first packet. **/ + + /* Create the RTP header buffer */ + rtp_buffer = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (rtp_buffer) = g_malloc (RTP_HEADER_SIZE); + GST_BUFFER_DATA (rtp_buffer) = GST_BUFFER_MALLOCDATA (rtp_buffer); + GST_BUFFER_SIZE (rtp_buffer) = RTP_HEADER_SIZE; + memset (GST_BUFFER_DATA (rtp_buffer), 0, RTP_HEADER_SIZE); + + /* Create the buffer that holds the payload */ + data_buffer = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (data_buffer) = g_malloc (RTP_PAYLOAD_SIZE); + GST_BUFFER_DATA (data_buffer) = GST_BUFFER_MALLOCDATA (data_buffer); + GST_BUFFER_SIZE (data_buffer) = RTP_PAYLOAD_SIZE; + memset (GST_BUFFER_DATA (data_buffer), 0, RTP_PAYLOAD_SIZE); + + /* Create a new group to hold the rtp header and the payload */ + gst_buffer_list_iterator_add_group (it); + gst_buffer_list_iterator_add (it, rtp_buffer); + gst_buffer_list_iterator_add (it, data_buffer); + + /*** Second group, i.e. second packet. ***/ + + /* Create the RTP header buffer */ + rtp_buffer = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (rtp_buffer) = g_malloc (RTP_HEADER_SIZE); + GST_BUFFER_DATA (rtp_buffer) = GST_BUFFER_MALLOCDATA (rtp_buffer); + GST_BUFFER_SIZE (rtp_buffer) = RTP_HEADER_SIZE; + memset (GST_BUFFER_DATA (rtp_buffer), 0, RTP_HEADER_SIZE); + + /* Create the buffer that holds the payload */ + data_buffer = gst_buffer_new (); + GST_BUFFER_MALLOCDATA (data_buffer) = g_malloc (RTP_PAYLOAD_SIZE); + GST_BUFFER_DATA (data_buffer) = GST_BUFFER_MALLOCDATA (data_buffer); + GST_BUFFER_SIZE (data_buffer) = RTP_PAYLOAD_SIZE; + memset (GST_BUFFER_DATA (data_buffer), 0, RTP_PAYLOAD_SIZE); + + /* Create a new group to hold the rtp header and the payload */ + gst_buffer_list_iterator_add_group (it); + gst_buffer_list_iterator_add (it, rtp_buffer); + gst_buffer_list_iterator_add (it, data_buffer); + + /* Calculate the size of the data */ + *data_size = 2 * RTP_HEADER_SIZE + 2 * RTP_PAYLOAD_SIZE; + + gst_buffer_list_iterator_free (it); + + return list; +} + +static void +udpsink_test (gboolean use_buffer_lists) +{ + GstElement *udpsink; + GstPad *srcpad; + GstBufferList *list; + guint data_size; + + list = _create_buffer_list (&data_size); + + udpsink = gst_check_setup_element ("udpsink"); + if (use_buffer_lists) + _set_render_function (udpsink); + + srcpad = gst_check_setup_src_pad_by_name (udpsink, &srctemplate, "sink"); + + gst_element_set_state (udpsink, GST_STATE_PLAYING); + + gst_pad_push_event (srcpad, gst_event_new_new_segment_full (FALSE, 1.0, 1.0, + GST_FORMAT_TIME, 0, -1, 0)); + + gst_pad_push_list (srcpad, list); + + gst_check_teardown_pad_by_name (udpsink, "sink"); + gst_check_teardown_element (udpsink); + + if (use_buffer_lists) + fail_unless_equals_int (data_size, render_list_bytes_received); +} + +GST_START_TEST (test_udpsink) +{ + udpsink_test (FALSE); +} + +GST_END_TEST; +GST_START_TEST (test_udpsink_bufferlist) +{ + udpsink_test (TRUE); +} + +GST_END_TEST; + +/* + * Creates the test suite. + * + * Returns: pointer to the test suite. + */ +static Suite * +udpsink_suite (void) +{ + Suite *s = suite_create ("udpsink_test"); + + TCase *tc_chain = tcase_create ("linear"); + + /* Set timeout to 60 seconds. */ + tcase_set_timeout (tc_chain, 60); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_udpsink); + tcase_add_test (tc_chain, test_udpsink_bufferlist); + return s; +} + +GST_CHECK_MAIN (udpsink) diff --git a/tests/check/elements/videocrop.c b/tests/check/elements/videocrop.c new file mode 100644 index 0000000..fc7c5dc --- /dev/null +++ b/tests/check/elements/videocrop.c @@ -0,0 +1,816 @@ +/* GStreamer unit test for the videocrop element + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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 + +#ifdef HAVE_VALGRIND +# include +#endif + +#include + +#include +#include + +/* return a list of caps where we only need to set + * width and height to get fixed caps */ +static GList * +video_crop_get_test_caps (GstElement * videocrop) +{ + const GstCaps *allowed_caps; + GstPad *srcpad; + GList *list = NULL; + guint i; + + srcpad = gst_element_get_static_pad (videocrop, "src"); + fail_unless (srcpad != NULL); + allowed_caps = gst_pad_get_pad_template_caps (srcpad); + fail_unless (allowed_caps != NULL); + + for (i = 0; i < gst_caps_get_size (allowed_caps); ++i) { + GstStructure *new_structure; + GstCaps *single_caps; + + single_caps = gst_caps_new_empty (); + new_structure = + gst_structure_copy (gst_caps_get_structure (allowed_caps, i)); + gst_structure_set (new_structure, "framerate", GST_TYPE_FRACTION, + 1, 1, NULL); + gst_structure_remove_field (new_structure, "width"); + gst_structure_remove_field (new_structure, "height"); + gst_caps_append_structure (single_caps, new_structure); + + /* should be fixed without width/height */ + fail_unless (gst_caps_is_fixed (single_caps)); + + list = g_list_prepend (list, single_caps); + } + + gst_object_unref (srcpad); + + return list; +} + +GST_START_TEST (test_unit_sizes) +{ + GstBaseTransformClass *csp_klass, *vcrop_klass; + GstElement *videocrop, *csp; + GList *caps_list, *l; + + videocrop = gst_element_factory_make ("videocrop", "videocrop"); + fail_unless (videocrop != NULL, "Failed to create videocrop element"); + vcrop_klass = GST_BASE_TRANSFORM_GET_CLASS (videocrop); + + csp = gst_element_factory_make ("ffmpegcolorspace", "csp"); + fail_unless (csp != NULL, "Failed to create ffmpegcolorspace element"); + csp_klass = GST_BASE_TRANSFORM_GET_CLASS (csp); + + caps_list = video_crop_get_test_caps (videocrop); + + for (l = caps_list; l != NULL; l = l->next) { + const struct + { + gint width, height; + } sizes_to_try[] = { + { + 160, 120}, { + 161, 120}, { + 160, 121}, { + 161, 121}, { + 159, 120}, { + 160, 119}, { + 159, 119}, { + 159, 121} + }; + GstStructure *s; + GstCaps *caps; + gint i; + + caps = gst_caps_copy (GST_CAPS (l->data)); + s = gst_caps_get_structure (caps, 0); + fail_unless (s != NULL); + + for (i = 0; i < G_N_ELEMENTS (sizes_to_try); ++i) { + gchar *caps_str; + guint csp_size = 0; + guint vc_size = 0; + + gst_structure_set (s, "width", G_TYPE_INT, sizes_to_try[i].width, + "height", G_TYPE_INT, sizes_to_try[i].height, NULL); + + caps_str = gst_caps_to_string (caps); + GST_INFO ("Testing unit size for %s", caps_str); + + /* skip if ffmpegcolorspace doesn't support these caps + * (only works with gst-plugins-base 0.10.9.1 or later) */ + if (!csp_klass->get_unit_size ((GstBaseTransform *) csp, caps, &csp_size)) { + GST_INFO ("ffmpegcolorspace does not support format %s", caps_str); + g_free (caps_str); + continue; + } + + fail_unless (vcrop_klass->get_unit_size ((GstBaseTransform *) videocrop, + caps, &vc_size)); + + fail_unless (vc_size == csp_size, + "videocrop and ffmpegcolorspace return different unit sizes for " + "caps %s: vc_size=%d, csp_size=%d", caps_str, vc_size, csp_size); + + g_free (caps_str); + } + + gst_caps_unref (caps); + } + + g_list_foreach (caps_list, (GFunc) gst_caps_unref, NULL); + g_list_free (caps_list); + + gst_object_unref (csp); + gst_object_unref (videocrop); +} + +GST_END_TEST; + +typedef struct +{ + GstElement *pipeline; + GstElement *src; + GstElement *filter; + GstElement *crop; + GstElement *sink; + GstBuffer *last_buf; +} GstVideoCropTestContext; + +static void +handoff_cb (GstElement * sink, GstBuffer * buf, GstPad * pad, + GstBuffer ** p_buf) +{ + gst_buffer_replace (p_buf, buf); +} + +static void +videocrop_test_cropping_init_context (GstVideoCropTestContext * ctx) +{ + fail_unless (ctx != NULL); + + ctx->pipeline = gst_pipeline_new ("pipeline"); + fail_unless (ctx->pipeline != NULL); + ctx->src = gst_element_factory_make ("videotestsrc", "src"); + fail_unless (ctx->src != NULL, "Failed to create videotestsrc element"); + ctx->filter = gst_element_factory_make ("capsfilter", "filter"); + fail_unless (ctx->filter != NULL, "Failed to create capsfilter element"); + ctx->crop = gst_element_factory_make ("videocrop", "crop"); + fail_unless (ctx->crop != NULL, "Failed to create videocrop element"); + ctx->sink = gst_element_factory_make ("fakesink", "sink"); + fail_unless (ctx->sink != NULL, "Failed to create fakesink element"); + + gst_bin_add_many (GST_BIN (ctx->pipeline), ctx->src, ctx->filter, + ctx->crop, ctx->sink, NULL); + gst_element_link_many (ctx->src, ctx->filter, ctx->crop, ctx->sink, NULL); + + /* set pattern to 'red' - for our purposes it doesn't matter anyway */ + g_object_set (ctx->src, "pattern", 4, NULL); + + g_object_set (ctx->sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (ctx->sink, "preroll-handoff", G_CALLBACK (handoff_cb), + &ctx->last_buf); + + ctx->last_buf = NULL; + + GST_LOG ("context inited"); +} + +static void +videocrop_test_cropping_deinit_context (GstVideoCropTestContext * ctx) +{ + GST_LOG ("deiniting context"); + + gst_element_set_state (ctx->pipeline, GST_STATE_NULL); + gst_object_unref (ctx->pipeline); + gst_buffer_replace (&ctx->last_buf, NULL); + memset (ctx, 0x00, sizeof (GstVideoCropTestContext)); +} + +typedef void (*GstVideoCropTestBufferFunc) (GstBuffer * buffer); + +static void +videocrop_test_cropping (GstVideoCropTestContext * ctx, GstCaps * in_caps, + gint left, gint right, gint top, gint bottom, + GstVideoCropTestBufferFunc func) +{ + GST_LOG ("lrtb = %03u %03u %03u %03u, caps = %" GST_PTR_FORMAT, left, right, + top, bottom, in_caps); + + g_object_set (ctx->filter, "caps", in_caps, NULL); + + g_object_set (ctx->crop, "left", left, "right", right, "top", top, + "bottom", bottom, NULL); + + /* this will fail if videotestsrc doesn't support our format; we need + * videotestsrc from -base CVS 0.10.9.1 with RGBA and AYUV support */ + fail_unless (gst_element_set_state (ctx->pipeline, + GST_STATE_PAUSED) != GST_STATE_CHANGE_FAILURE); + fail_unless (gst_element_get_state (ctx->pipeline, NULL, NULL, + -1) == GST_STATE_CHANGE_SUCCESS); + + if (func != NULL) { + func (ctx->last_buf); + } + + gst_element_set_state (ctx->pipeline, GST_STATE_NULL); +} + +static void +check_1x1_buffer (GstBuffer * buf) +{ + GstStructure *s; + + fail_unless (buf != NULL); + fail_unless (GST_BUFFER_CAPS (buf) != NULL); + + s = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0); + if (gst_structure_has_name (s, "video/x-raw-yuv")) { + guint32 format = 0; + + fail_unless (gst_structure_get_fourcc (s, "format", &format)); + + /* the exact values we check for come from videotestsrc */ + switch (format) { + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + fail_unless_equals_int (GST_BUFFER_DATA (buf)[0], 81); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[8], 90); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[12], 240); + break; + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + fail_unless_equals_int (GST_BUFFER_DATA (buf)[0], 81); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[8], 240); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[12], 90); + break; + case GST_MAKE_FOURCC ('Y', '8', '0', '0'): + fail_unless_equals_int (GST_BUFFER_DATA (buf)[0], 81); + /* no chroma planes */ + break; + case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): + fail_unless_equals_int (GST_BUFFER_DATA (buf)[1], 81); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[2], 90); + fail_unless_equals_int (GST_BUFFER_DATA (buf)[3], 240); + /* no chroma planes */ + break; + default: + GST_LOG ("not checking %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (format)); + break; + } + } else if (gst_structure_has_name (s, "video/x-raw-rgb")) { + guint32 pixel; + gint rmask = 0, bmask = 0, gmask = 0, endianness = 0, bpp = 0; + gint rshift, gshift, bshift; + + fail_unless (gst_structure_get_int (s, "red_mask", &rmask)); + fail_unless (gst_structure_get_int (s, "blue_mask", &bmask)); + fail_unless (gst_structure_get_int (s, "green_mask", &gmask)); + fail_unless (gst_structure_get_int (s, "bpp", &bpp)); + fail_unless (gst_structure_get_int (s, "endianness", &endianness)); + + fail_unless (rmask != 0); + fail_unless (gmask != 0); + fail_unless (bmask != 0); + fail_unless (bpp != 0); + fail_unless (endianness != 0); + + rshift = g_bit_nth_lsf (rmask, -1); + gshift = g_bit_nth_lsf (gmask, -1); + bshift = g_bit_nth_lsf (bmask, -1); + + switch (bpp) { + case 32:{ + if (endianness == G_LITTLE_ENDIAN) + pixel = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); + else + pixel = GST_READ_UINT32_BE (GST_BUFFER_DATA (buf)); + break; + } + case 24:{ + if (endianness == G_BIG_ENDIAN) { + pixel = (GST_READ_UINT8 (GST_BUFFER_DATA (buf)) << 16) | + (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 1) << 8) | + (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 2) << 0); + } else { + pixel = (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 2) << 16) | + (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 1) << 8) | + (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 0) << 0); + } + break; + } + default:{ + GST_LOG ("not checking RGB-format buffer with %ubpp", bpp); + return; + } + } + + fail_unless_equals_int ((pixel & rmask) >> rshift, 0xff); + fail_unless_equals_int ((pixel & gmask) >> gshift, 0x00); + fail_unless_equals_int ((pixel & bmask) >> bshift, 0x00); + } +} + +GST_START_TEST (test_crop_to_1x1) +{ + GstVideoCropTestContext ctx; + GList *caps_list, *node; + + videocrop_test_cropping_init_context (&ctx); + + caps_list = video_crop_get_test_caps (ctx.crop); + + for (node = caps_list; node != NULL; node = node->next) { + GstStructure *s; + GstCaps *caps; + + caps = gst_caps_copy (GST_CAPS (node->data)); + s = gst_caps_get_structure (caps, 0); + fail_unless (s != NULL); + + if (g_strcmp0 (gst_structure_get_name (s), "video/x-raw-gray") == 0) { + /* videotestsrc does not support this format */ + gst_caps_unref (caps); + continue; + } + + GST_INFO ("testing format: %" GST_PTR_FORMAT, caps); + + gst_structure_set (s, "width", G_TYPE_INT, 160, + "height", G_TYPE_INT, 160, NULL); + + videocrop_test_cropping (&ctx, caps, 159, 0, 159, 0, check_1x1_buffer); + /* commented out because they don't really add anything useful check-wise: + videocrop_test_cropping (&ctx, caps, 0, 159, 0, 159, check_1x1_buffer); + videocrop_test_cropping (&ctx, caps, 159, 0, 0, 159, check_1x1_buffer); + videocrop_test_cropping (&ctx, caps, 0, 159, 159, 0, check_1x1_buffer); + */ + gst_caps_unref (caps); + } + g_list_foreach (caps_list, (GFunc) gst_caps_unref, NULL); + g_list_free (caps_list); + + videocrop_test_cropping_deinit_context (&ctx); +} + +GST_END_TEST; + +GST_START_TEST (test_cropping) +{ + GstVideoCropTestContext ctx; + struct + { + gint width, height; + } sizes_to_try[] = { + { + 160, 160}, { + 161, 160}, { + 160, 161}, { + 161, 161}, { + 159, 160}, { + 160, 159}, { + 159, 159}, { + 159, 161} + }; + GList *caps_list, *node; + gint i; + + videocrop_test_cropping_init_context (&ctx); + + caps_list = video_crop_get_test_caps (ctx.crop); + node = g_list_nth (caps_list, __i__); + + if (node != NULL) { + GstStructure *s; + GstCaps *caps; + + caps = gst_caps_copy (GST_CAPS (node->data)); + s = gst_caps_get_structure (caps, 0); + fail_unless (s != NULL); + + /* videotestsrc does not support this format, so ignore it */ + if (!g_str_equal (gst_structure_get_name (s), "video/x-raw-gray")) { + GST_INFO ("testing format: %" GST_PTR_FORMAT, caps); + + for (i = 0; i < G_N_ELEMENTS (sizes_to_try); ++i) { + GstCaps *in_caps; + + GST_INFO (" - %d x %d", sizes_to_try[i].width, sizes_to_try[i].height); + + gst_structure_set (s, "width", G_TYPE_INT, sizes_to_try[i].width, + "height", G_TYPE_INT, sizes_to_try[i].height, NULL); + in_caps = gst_caps_copy (caps); + + videocrop_test_cropping (&ctx, in_caps, 0, 0, 0, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 1, 0, 0, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 1, 0, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 0, 1, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 0, 0, 1, NULL); + videocrop_test_cropping (&ctx, in_caps, 63, 0, 0, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 63, 0, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 0, 63, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 0, 0, 63, NULL); + videocrop_test_cropping (&ctx, in_caps, 63, 0, 0, 1, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 63, 1, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 1, 63, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 1, 0, 0, 63, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 0, 0, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 32, 0, 0, 128, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 32, 128, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 0, 128, 32, 0, NULL); + videocrop_test_cropping (&ctx, in_caps, 128, 0, 0, 32, NULL); + videocrop_test_cropping (&ctx, in_caps, 1, 1, 1, 1, NULL); + videocrop_test_cropping (&ctx, in_caps, 63, 63, 63, 63, NULL); + videocrop_test_cropping (&ctx, in_caps, 64, 64, 64, 64, NULL); + + gst_caps_unref (in_caps); + } + } + + gst_caps_unref (caps); + } else { + GST_INFO ("no caps #%d", __i__); + } + g_list_foreach (caps_list, (GFunc) gst_caps_unref, NULL); + g_list_free (caps_list); + + videocrop_test_cropping_deinit_context (&ctx); +} + +GST_END_TEST; + + +static gboolean +buffer_probe_cb (GstPad * pad, GstBuffer * buf, GstBuffer ** p_buf) +{ + gst_buffer_replace (p_buf, buf); + return TRUE; /* keep data */ +} + +GST_START_TEST (test_passthrough) +{ + GstStateChangeReturn state_ret; + GstVideoCropTestContext ctx; + GstPad *srcpad; + GstBuffer *gen_buf = NULL; /* buffer generated by videotestsrc */ + + videocrop_test_cropping_init_context (&ctx); + + g_object_set (ctx.src, "num-buffers", 1, NULL); + + srcpad = gst_element_get_static_pad (ctx.src, "src"); + fail_unless (srcpad != NULL); + gst_pad_add_buffer_probe (srcpad, G_CALLBACK (buffer_probe_cb), &gen_buf); + gst_object_unref (srcpad); + + g_object_set (ctx.crop, "left", 0, "right", 0, "top", 0, "bottom", 0, NULL); + + state_ret = gst_element_set_state (ctx.pipeline, GST_STATE_PAUSED); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE, + "couldn't set pipeline to PAUSED state"); + + state_ret = gst_element_get_state (ctx.pipeline, NULL, NULL, -1); + fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS, + "pipeline failed to go to PAUSED state"); + + fail_unless (gen_buf != NULL); + fail_unless (ctx.last_buf != NULL); + + /* pass through should do nothing */ + fail_unless (gen_buf == ctx.last_buf); + + videocrop_test_cropping_deinit_context (&ctx); + + fail_unless_equals_int (GST_MINI_OBJECT_REFCOUNT_VALUE (gen_buf), 1); + gst_buffer_unref (gen_buf); +} + +GST_END_TEST; + +static gint +notgst_value_list_get_nth_int (const GValue * list_val, guint n) +{ + const GValue *v; + + fail_unless (GST_VALUE_HOLDS_LIST (list_val)); + fail_unless (n < gst_value_list_get_size (list_val)); + + v = gst_value_list_get_value (list_val, n); + fail_unless (G_VALUE_HOLDS_INT (v)); + return g_value_get_int (v); +} + +GST_START_TEST (test_caps_transform) +{ + GstVideoCropTestContext ctx; + GstBaseTransformClass *klass; + GstBaseTransform *crop; + const GValue *w_val; + const GValue *h_val; + GstCaps *caps, *adj_caps; + + videocrop_test_cropping_init_context (&ctx); + + crop = GST_BASE_TRANSFORM (ctx.crop); + klass = GST_BASE_TRANSFORM_GET_CLASS (ctx.crop); + fail_unless (klass != NULL); + + caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), + "framerate", GST_TYPE_FRACTION, 1, 1, + "width", G_TYPE_INT, 200, "height", G_TYPE_INT, 100, NULL); + + /* by default, it should be no cropping and hence passthrough */ + adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_is_equal (adj_caps, caps)); + gst_caps_unref (adj_caps); + + adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_is_equal (adj_caps, caps)); + gst_caps_unref (adj_caps); + + /* make sure that's still true after changing properties back and forth */ + g_object_set (ctx.crop, "left", 1, "right", 3, "top", 5, "bottom", 7, NULL); + g_object_set (ctx.crop, "left", 0, "right", 0, "top", 0, "bottom", 0, NULL); + + adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_is_equal (adj_caps, caps)); + gst_caps_unref (adj_caps); + + adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_is_equal (adj_caps, caps)); + gst_caps_unref (adj_caps); + + /* now check adjustments made ... */ + g_object_set (ctx.crop, "left", 1, "right", 3, "top", 5, "bottom", 7, NULL); + + /* ========= (1) fixed value ============================================= */ + + /* sink => source, source must be bigger if we crop stuff off */ + adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_get_size (adj_caps) == 1); + w_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); + fail_unless (w_val != NULL); + fail_unless (G_VALUE_HOLDS_INT (w_val)); + fail_unless_equals_int (g_value_get_int (w_val), 200 + (1 + 3)); + h_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); + fail_unless (h_val != NULL); + fail_unless (G_VALUE_HOLDS_INT (h_val)); + fail_unless_equals_int (g_value_get_int (h_val), 100 + (5 + 7)); + gst_caps_unref (adj_caps); + + /* source => sink becomes smaller */ + adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_get_size (adj_caps) == 1); + w_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); + fail_unless (w_val != NULL); + fail_unless (G_VALUE_HOLDS_INT (w_val)); + fail_unless_equals_int (g_value_get_int (w_val), 200 - (1 + 3)); + h_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); + fail_unless (h_val != NULL); + fail_unless (G_VALUE_HOLDS_INT (h_val)); + fail_unless_equals_int (g_value_get_int (h_val), 100 - (5 + 7)); + gst_caps_unref (adj_caps); + + /* ========= (2) range (simple adjustment) =============================== */ + + gst_structure_set (gst_caps_get_structure (caps, 0), + "width", GST_TYPE_INT_RANGE, 1000, 2000, + "height", GST_TYPE_INT_RANGE, 3000, 4000, NULL); + + /* sink => source, source must be bigger if we crop stuff off */ + adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_get_size (adj_caps) == 1); + w_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); + fail_unless (w_val != NULL); + fail_unless (GST_VALUE_HOLDS_INT_RANGE (w_val)); + fail_unless_equals_int (gst_value_get_int_range_min (w_val), 1000 + (1 + 3)); + fail_unless_equals_int (gst_value_get_int_range_max (w_val), 2000 + (1 + 3)); + h_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); + fail_unless (h_val != NULL); + fail_unless (GST_VALUE_HOLDS_INT_RANGE (h_val)); + fail_unless_equals_int (gst_value_get_int_range_min (h_val), 3000 + (5 + 7)); + fail_unless_equals_int (gst_value_get_int_range_max (h_val), 4000 + (5 + 7)); + gst_caps_unref (adj_caps); + + /* source => sink becomes smaller */ + adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_get_size (adj_caps) == 1); + w_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); + fail_unless (w_val != NULL); + fail_unless (GST_VALUE_HOLDS_INT_RANGE (w_val)); + fail_unless_equals_int (gst_value_get_int_range_min (w_val), 1000 - (1 + 3)); + fail_unless_equals_int (gst_value_get_int_range_max (w_val), 2000 - (1 + 3)); + h_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); + fail_unless (h_val != NULL); + fail_unless (GST_VALUE_HOLDS_INT_RANGE (h_val)); + fail_unless_equals_int (gst_value_get_int_range_min (h_val), 3000 - (5 + 7)); + fail_unless_equals_int (gst_value_get_int_range_max (h_val), 4000 - (5 + 7)); + gst_caps_unref (adj_caps); + + /* ========= (3) range (adjustment at boundary) ========================== */ + + gst_structure_set (gst_caps_get_structure (caps, 0), + "width", GST_TYPE_INT_RANGE, 2, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 2, G_MAXINT, NULL); + + /* sink => source, source must be bigger if we crop stuff off */ + adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_get_size (adj_caps) == 1); + w_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); + fail_unless (w_val != NULL); + fail_unless (GST_VALUE_HOLDS_INT_RANGE (w_val)); + fail_unless_equals_int (gst_value_get_int_range_min (w_val), 2 + (1 + 3)); + fail_unless_equals_int (gst_value_get_int_range_max (w_val), G_MAXINT); + h_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); + fail_unless (h_val != NULL); + fail_unless (GST_VALUE_HOLDS_INT_RANGE (h_val)); + fail_unless_equals_int (gst_value_get_int_range_min (h_val), 2 + (5 + 7)); + fail_unless_equals_int (gst_value_get_int_range_max (h_val), G_MAXINT); + gst_caps_unref (adj_caps); + + /* source => sink becomes smaller */ + adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_get_size (adj_caps) == 1); + w_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); + fail_unless (w_val != NULL); + fail_unless (GST_VALUE_HOLDS_INT_RANGE (w_val)); + fail_unless_equals_int (gst_value_get_int_range_min (w_val), 1); + fail_unless_equals_int (gst_value_get_int_range_max (w_val), + G_MAXINT - (1 + 3)); + h_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); + fail_unless (h_val != NULL); + fail_unless (GST_VALUE_HOLDS_INT_RANGE (h_val)); + fail_unless_equals_int (gst_value_get_int_range_min (h_val), 1); + fail_unless_equals_int (gst_value_get_int_range_max (h_val), + G_MAXINT - (5 + 7)); + gst_caps_unref (adj_caps); + + /* ========= (4) list of values ========================================== */ + + { + GValue list = { 0, }; + GValue ival = { 0, }; + + g_value_init (&ival, G_TYPE_INT); + g_value_init (&list, GST_TYPE_LIST); + g_value_set_int (&ival, 2); + gst_value_list_append_value (&list, &ival); + g_value_set_int (&ival, G_MAXINT); + gst_value_list_append_value (&list, &ival); + gst_structure_set_value (gst_caps_get_structure (caps, 0), "width", &list); + g_value_unset (&list); + g_value_unset (&ival); + + g_value_init (&ival, G_TYPE_INT); + g_value_init (&list, GST_TYPE_LIST); + g_value_set_int (&ival, 5); + gst_value_list_append_value (&list, &ival); + g_value_set_int (&ival, 1000); + gst_value_list_append_value (&list, &ival); + gst_structure_set_value (gst_caps_get_structure (caps, 0), "height", &list); + g_value_unset (&list); + g_value_unset (&ival); + } + + /* sink => source, source must be bigger if we crop stuff off */ + adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_get_size (adj_caps) == 1); + w_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); + fail_unless (w_val != NULL); + fail_unless (GST_VALUE_HOLDS_LIST (w_val)); + fail_unless_equals_int (notgst_value_list_get_nth_int (w_val, 0), + 2 + (1 + 3)); + fail_unless_equals_int (notgst_value_list_get_nth_int (w_val, 1), G_MAXINT); + h_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); + fail_unless (h_val != NULL); + fail_unless (GST_VALUE_HOLDS_LIST (h_val)); + fail_unless_equals_int (notgst_value_list_get_nth_int (h_val, 0), + 5 + (5 + 7)); + fail_unless_equals_int (notgst_value_list_get_nth_int (h_val, 1), + 1000 + (5 + 7)); + gst_caps_unref (adj_caps); + + /* source => sink becomes smaller */ + adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); + fail_unless (adj_caps != NULL); + fail_unless (gst_caps_get_size (adj_caps) == 1); + w_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); + fail_unless (w_val != NULL); + fail_unless (GST_VALUE_HOLDS_LIST (w_val)); + fail_unless_equals_int (notgst_value_list_get_nth_int (w_val, 0), 1); + fail_unless_equals_int (notgst_value_list_get_nth_int (w_val, 1), + G_MAXINT - (1 + 3)); + h_val = + gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); + fail_unless (h_val != NULL); + fail_unless (GST_VALUE_HOLDS_LIST (h_val)); + fail_unless_equals_int (notgst_value_list_get_nth_int (h_val, 0), 1); + fail_unless_equals_int (notgst_value_list_get_nth_int (h_val, 1), + 1000 - (5 + 7)); + gst_caps_unref (adj_caps); + + gst_caps_unref (caps); + videocrop_test_cropping_deinit_context (&ctx); +} + +GST_END_TEST; + +static Suite * +videocrop_suite (void) +{ + Suite *s = suite_create ("videocrop"); + TCase *tc_chain = tcase_create ("general"); + +#ifdef HAVE_VALGRIND + if (RUNNING_ON_VALGRIND) { + /* our tests take quite a long time, so increase + * timeout (~25 minutes on my 1.6GHz AMD K7) */ + tcase_set_timeout (tc_chain, 30 * 60); + } else +#endif + { + /* increase timeout, these tests take a long time (60 secs here) */ + tcase_set_timeout (tc_chain, 2 * 60); + } + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_crop_to_1x1); + tcase_add_test (tc_chain, test_caps_transform); + tcase_add_test (tc_chain, test_passthrough); + tcase_add_test (tc_chain, test_unit_sizes); + tcase_add_loop_test (tc_chain, test_cropping, 0, 25); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = videocrop_suite (); + SRunner *sr = srunner_create (s); + +#ifdef HAVE_VALGRIND + if (RUNNING_ON_VALGRIND) { + /* otherwise valgrind errors out when liboil probes CPU extensions + * in oil_init() during which it causes SIGILLs etc. to be fired */ + g_setenv ("OIL_CPU_FLAGS", "0", 0); + } +#endif + + 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/videofilter.c b/tests/check/elements/videofilter.c new file mode 100644 index 0000000..7389478 --- /dev/null +++ b/tests/check/elements/videofilter.c @@ -0,0 +1,237 @@ +/* GStreamer + * + * unit test for videofilter elements + * + * Copyright (C) <2006> Mark Nauwelaerts + * + * 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 +#include + +#include +#include + +gboolean have_eos = FALSE; + +/* 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 */ +GstPad *mysrcpad, *mysinkpad; + +#define VIDEO_CAPS_TEMPLATE_STRING \ + GST_VIDEO_CAPS_YUV ("I420") ";" \ + GST_VIDEO_CAPS_YUV ("AYUV") ";" \ + GST_VIDEO_CAPS_YUV ("YUY2") ";" \ + GST_VIDEO_CAPS_YUV ("UYVY") ";" \ + GST_VIDEO_CAPS_YUV ("YVYU") ";" \ + GST_VIDEO_CAPS_xRGB + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CAPS_TEMPLATE_STRING) + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CAPS_TEMPLATE_STRING) + ); + +/* takes over reference for outcaps */ +static GstElement * +setup_filter (const gchar * name, const gchar * prop, va_list var_args) +{ + GstElement *element; + + GST_DEBUG ("setup_element"); + element = gst_check_setup_element (name); + g_object_set_valist (G_OBJECT (element), prop, var_args); + mysrcpad = gst_check_setup_src_pad (element, &srctemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate, NULL); + gst_pad_set_active (mysinkpad, TRUE); + + return element; +} + +static void +cleanup_filter (GstElement * filter) +{ + GST_DEBUG ("cleanup_element"); + + gst_check_teardown_src_pad (filter); + gst_check_teardown_sink_pad (filter); + gst_check_teardown_element (filter); +} + +static void +check_filter_caps (const gchar * name, GstCaps * caps, gint size, + gint num_buffers, const gchar * prop, va_list varargs) +{ + GstElement *filter; + GstBuffer *inbuffer, *outbuffer; + gint i; + + filter = setup_filter (name, prop, varargs); + fail_unless (gst_element_set_state (filter, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + + for (i = 0; i < num_buffers; ++i) { + inbuffer = gst_buffer_new_and_alloc (size); + /* makes valgrind's memcheck happier */ + memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer)); + gst_buffer_set_caps (inbuffer, caps); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); + } + + fail_unless (g_list_length (buffers) == num_buffers); + + /* 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 (GST_BUFFER_SIZE (outbuffer) == size); + /* no check on filter operation itself */ + break; + default: + break; + } + buffers = g_list_remove (buffers, outbuffer); + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + cleanup_filter (filter); + g_list_free (buffers); + buffers = NULL; +} + +static void +check_filter (const gchar * name, gint num_buffers, const gchar * prop, ...) +{ + static const struct + { + const int width, height; + } resolutions[] = { { + 384, 288}, { + 385, 289}, { + 385, 385}}; + gint i, n, r; + GstVideoFormat format; + gint size; + GstCaps *templ = gst_caps_from_string (VIDEO_CAPS_TEMPLATE_STRING); + va_list varargs; + + n = gst_caps_get_size (templ); + + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (templ, i); + GstCaps *caps = gst_caps_new_empty (); + + gst_caps_append_structure (caps, gst_structure_copy (s)); + + /* try various resolutions */ + for (r = 0; r < G_N_ELEMENTS (resolutions); ++r) { + caps = gst_caps_make_writable (caps); + gst_caps_set_simple (caps, "width", G_TYPE_INT, resolutions[r].width, + "height", G_TYPE_INT, resolutions[r].height, + "framerate", GST_TYPE_FRACTION, 25, 1, NULL); + + GST_DEBUG ("Testing with caps: %" GST_PTR_FORMAT, caps); + gst_video_format_parse_caps (caps, &format, NULL, NULL); + size = gst_video_format_get_size (format, resolutions[r].width, + resolutions[r].height); + + va_start (varargs, prop); + check_filter_caps (name, caps, size, num_buffers, prop, varargs); + va_end (varargs); + } + + gst_caps_unref (caps); + } + + gst_caps_unref (templ); +} + +GST_START_TEST (test_videobalance) +{ + check_filter ("videobalance", 2, NULL); + check_filter ("videobalance", 2, "saturation", 0.5, "hue", 0.8, NULL); +} + +GST_END_TEST; + + +GST_START_TEST (test_videoflip) +{ + /* these we can handle with the caps */ + check_filter ("videoflip", 2, "method", 0, NULL); + check_filter ("videoflip", 2, "method", 2, NULL); + check_filter ("videoflip", 2, "method", 4, NULL); + check_filter ("videoflip", 2, "method", 5, NULL); +} + +GST_END_TEST; + +GST_START_TEST (test_gamma) +{ + check_filter ("gamma", 2, NULL); + check_filter ("gamma", 2, "gamma", 2.0, NULL); +} + +GST_END_TEST; + + +static Suite * +videofilter_suite (void) +{ + Suite *s = suite_create ("videofilter"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_videobalance); + tcase_add_test (tc_chain, test_videoflip); + tcase_add_test (tc_chain, test_gamma); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = videofilter_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/wavpackdec.c b/tests/check/elements/wavpackdec.c new file mode 100644 index 0000000..0d17323 --- /dev/null +++ b/tests/check/elements/wavpackdec.c @@ -0,0 +1,257 @@ +/* GStreamer + * + * unit test for wavpackdec + * + * Copyright (c) 2006 Sebastian Dröge + * + * 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 + +#include + +/* 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; + +guint8 test_frame[] = { + 0x77, 0x76, 0x70, 0x6B, /* "wvpk" */ + 0x2E, 0x00, 0x00, 0x00, /* ckSize */ + 0x04, 0x04, /* version */ + 0x00, /* track_no */ + 0x00, /* index_no */ + 0x00, 0x64, 0x00, 0x00, /* total_samples */ + 0x00, 0x00, 0x00, 0x00, /* block_index */ + 0x00, 0x64, 0x00, 0x00, /* block_samples */ + 0x05, 0x18, 0x80, 0x04, /* flags */ + 0xFF, 0xAF, 0x80, 0x60, /* crc */ + 0x02, 0x00, 0x03, 0x00, /* data */ + 0x04, 0x00, 0x05, 0x03, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8A, 0x02, + 0x00, 0x00, 0xFF, 0x7F, + 0x00, 0xE4, +}; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "width = (int) 32, " + "depth = (int) 16, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "signed = (boolean) true") + ); +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wavpack, " + "width = (int) 16, " + "channels = (int) 1, " "rate = (int) 44100, " "framed = (boolean) true") + ); + +static GstElement * +setup_wavpackdec (void) +{ + GstElement *wavpackdec; + + GST_DEBUG ("setup_wavpackdec"); + wavpackdec = gst_check_setup_element ("wavpackdec"); + mysrcpad = gst_check_setup_src_pad (wavpackdec, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (wavpackdec, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + return wavpackdec; +} + +static void +cleanup_wavpackdec (GstElement * wavpackdec) +{ + GST_DEBUG ("cleanup_wavpackdec"); + gst_element_set_state (wavpackdec, GST_STATE_NULL); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (wavpackdec); + gst_check_teardown_sink_pad (wavpackdec); + gst_check_teardown_element (wavpackdec); +} + +GST_START_TEST (test_decode_frame) +{ + GstElement *wavpackdec; + GstBuffer *inbuffer, *outbuffer; + GstBus *bus; + int i; + + wavpackdec = setup_wavpackdec (); + + fail_unless (gst_element_set_state (wavpackdec, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + bus = gst_bus_new (); + + inbuffer = gst_buffer_new_and_alloc (sizeof (test_frame)); + memcpy (GST_BUFFER_DATA (inbuffer), test_frame, sizeof (test_frame)); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + gst_buffer_ref (inbuffer); + + gst_element_set_bus (wavpackdec, bus); + + /* should decode the buffer without problems */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_unref (inbuffer); + + outbuffer = GST_BUFFER (buffers->data); + + fail_if (outbuffer == NULL); + /* uncompressed data should be 102400 bytes */ + fail_unless_equals_int (GST_BUFFER_SIZE (outbuffer), 102400); + + /* and all 102400 bytes must be 0, i.e. silence */ + for (i = 0; i < 102400; i++) + fail_unless_equals_int (GST_BUFFER_DATA (outbuffer)[i], 0); + + ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); + gst_buffer_unref (outbuffer); + outbuffer = NULL; + + g_list_free (buffers); + buffers = NULL; + + gst_bus_set_flushing (bus, TRUE); + gst_element_set_bus (wavpackdec, NULL); + gst_object_unref (GST_OBJECT (bus)); + cleanup_wavpackdec (wavpackdec); +} + +GST_END_TEST; + +GST_START_TEST (test_decode_frame_with_broken_header) +{ + GstElement *wavpackdec; + GstBuffer *inbuffer; + GstBus *bus; + GstMessage *message; + + wavpackdec = setup_wavpackdec (); + + fail_unless (gst_element_set_state (wavpackdec, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + bus = gst_bus_new (); + + inbuffer = gst_buffer_new_and_alloc (sizeof (test_frame)); + memcpy (GST_BUFFER_DATA (inbuffer), test_frame, sizeof (test_frame)); + /* break header */ + GST_BUFFER_DATA (inbuffer)[2] = 'e'; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + gst_buffer_ref (inbuffer); + + gst_element_set_bus (wavpackdec, bus); + + /* should fail gracefully */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_ERROR); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_unref (inbuffer); + + fail_if ((message = gst_bus_pop (bus)) == NULL); + fail_unless_message_error (message, STREAM, DECODE); + gst_message_unref (message); + + gst_element_set_bus (wavpackdec, NULL); + gst_object_unref (GST_OBJECT (bus)); + cleanup_wavpackdec (wavpackdec); +} + +GST_END_TEST; + +GST_START_TEST (test_decode_frame_with_incomplete_frame) +{ + GstElement *wavpackdec; + GstBuffer *inbuffer; + GstBus *bus; + GstMessage *message; + + wavpackdec = setup_wavpackdec (); + + fail_unless (gst_element_set_state (wavpackdec, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + bus = gst_bus_new (); + + inbuffer = gst_buffer_new_and_alloc (sizeof (test_frame) - 2); + memcpy (GST_BUFFER_DATA (inbuffer), test_frame, sizeof (test_frame) - 2); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + gst_buffer_ref (inbuffer); + + gst_element_set_bus (wavpackdec, bus); + + /* should fail gracefully */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_ERROR); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_unref (inbuffer); + + fail_if ((message = gst_bus_pop (bus)) == NULL); + fail_unless_message_error (message, STREAM, DECODE); + gst_message_unref (message); + + + gst_element_set_bus (wavpackdec, NULL); + gst_object_unref (GST_OBJECT (bus)); + cleanup_wavpackdec (wavpackdec); +} + +GST_END_TEST; + +static Suite * +wavpackdec_suite (void) +{ + Suite *s = suite_create ("wavpackdec"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_decode_frame); + tcase_add_test (tc_chain, test_decode_frame_with_broken_header); + tcase_add_test (tc_chain, test_decode_frame_with_incomplete_frame); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = wavpackdec_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/wavpackenc.c b/tests/check/elements/wavpackenc.c new file mode 100644 index 0000000..153668a --- /dev/null +++ b/tests/check/elements/wavpackenc.c @@ -0,0 +1,192 @@ +/* GStreamer + * + * unit test for wavpackenc + * + * Copyright (c) 2006 Sebastian Dröge + * + * 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 + +#include + +/* 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; +static GstBus *bus; + +#define RAW_CAPS_STRING "audio/x-raw-int, " \ + "width = (int) 32, " \ + "depth = (int) 16, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "endianness = (int) BYTE_ORDER, " \ + "signed = (boolean) true" + +#define WAVPACK_CAPS_STRING "audio/x-wavpack, " \ + "width = (int) 16, " \ + "channels = (int) 1, " \ + "rate = (int) 44100, " \ + "framed = (boolean) true" + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wavpack, " + "width = (int) 16, " + "channels = (int) 1, " + "rate = (int) 44100, " "framed = (boolean) true")); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "width = (int) 32, " + "depth = (int) 16, " + "channels = (int) 1, " + "rate = (int) 44100, " + "endianness = (int) BYTE_ORDER, " "signed = (boolean) true")); + +static GstElement * +setup_wavpackenc (void) +{ + GstElement *wavpackenc; + + GST_DEBUG ("setup_wavpackenc"); + wavpackenc = gst_check_setup_element ("wavpackenc"); + mysrcpad = gst_check_setup_src_pad (wavpackenc, &srctemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (wavpackenc, &sinktemplate, NULL); + gst_pad_set_active (mysrcpad, TRUE); + gst_pad_set_active (mysinkpad, TRUE); + + fail_unless (gst_element_set_state (wavpackenc, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); + bus = gst_bus_new (); + + return wavpackenc; +} + +static void +cleanup_wavpackenc (GstElement * wavpackenc) +{ + GST_DEBUG ("cleanup_wavpackenc"); + + gst_bus_set_flushing (bus, TRUE); + gst_element_set_bus (wavpackenc, NULL); + gst_object_unref (GST_OBJECT (bus)); + + gst_element_set_state (wavpackenc, GST_STATE_NULL); + + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (wavpackenc); + gst_check_teardown_sink_pad (wavpackenc); + gst_check_teardown_element (wavpackenc); +} + +GST_START_TEST (test_encode_silence) +{ + GstElement *wavpackenc; + GstBuffer *inbuffer, *outbuffer; + GstCaps *caps; + GstEvent *eos = gst_event_new_eos (); + int i, num_buffers; + + wavpackenc = setup_wavpackenc (); + + inbuffer = gst_buffer_new_and_alloc (1000); + for (i = 0; i < 1000; i++) + GST_BUFFER_DATA (inbuffer)[i] = 0; + caps = gst_caps_from_string (RAW_CAPS_STRING); + gst_buffer_set_caps (inbuffer, caps); + gst_caps_unref (caps); + GST_BUFFER_TIMESTAMP (inbuffer) = 0; + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_ref (inbuffer); + + gst_element_set_bus (wavpackenc, bus); + + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); + gst_buffer_unref (inbuffer); + + fail_if (gst_pad_push_event (mysrcpad, eos) != TRUE); + + /* check first buffer */ + outbuffer = GST_BUFFER (buffers->data); + + fail_if (outbuffer == NULL); + + fail_unless_equals_int (GST_BUFFER_TIMESTAMP (outbuffer), 0); + fail_unless_equals_int (GST_BUFFER_OFFSET (outbuffer), 0); + fail_unless_equals_int (GST_BUFFER_DURATION (outbuffer), 5668934); + fail_unless_equals_int (GST_BUFFER_OFFSET_END (outbuffer), 250); + + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), "wvpk", 4) == 0, + "Failed to encode to valid Wavpack frames"); + + /* free all buffers */ + num_buffers = g_list_length (buffers); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + + buffers = g_list_remove (buffers, outbuffer); + + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + g_list_free (buffers); + buffers = NULL; + + cleanup_wavpackenc (wavpackenc); +} + +GST_END_TEST; + +static Suite * +wavpackenc_suite (void) +{ + Suite *s = suite_create ("wavpackenc"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_encode_silence); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = wavpackenc_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/wavpackparse.c b/tests/check/elements/wavpackparse.c new file mode 100644 index 0000000..5083903 --- /dev/null +++ b/tests/check/elements/wavpackparse.c @@ -0,0 +1,293 @@ +/* GStreamer + * + * unit test for wavpackparse + * + * Copyright (c) 2006 Sebastian Dröge + * + * 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 + +#include + +/* 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; +static GstBus *bus; +static GstElement *wavpackparse; + +/* Wavpack file with 2 frames of silence */ +guint8 test_file[] = { + 0x77, 0x76, 0x70, 0x6B, 0x62, 0x00, 0x00, 0x00, /* first frame */ + 0x04, 0x04, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, /* include RIFF header */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, + 0x05, 0x18, 0x80, 0x04, 0xFF, 0xAF, 0x80, 0x60, + 0x21, 0x16, 0x52, 0x49, 0x46, 0x46, 0x24, 0x90, + 0x01, 0x00, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, + 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x88, 0x58, + 0x01, 0x00, 0x02, 0x00, 0x10, 0x00, 0x64, 0x61, + 0x74, 0x61, 0x00, 0x90, 0x01, 0x00, 0x02, 0x00, + 0x03, 0x00, 0x04, 0x00, 0x05, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x8A, 0x02, 0x00, 0x00, 0xFF, 0x7F, + 0x00, 0xE4, + 0x77, 0x76, 0x70, 0x6B, 0x2E, 0x00, 0x00, 0x00, /* second frame */ + 0x04, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, + 0x05, 0x18, 0x80, 0x04, 0xFF, 0xAF, 0x80, 0x60, + 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x02, + 0x00, 0x00, 0xFF, 0x7F, 0x00, 0xE4, +}; + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wavpack, " + "width = (int) 16, " + "channels = (int) 1, " + "rate = (int) 44100, " "framed = (boolean) TRUE")); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-wavpack")); + +static void +wavpackparse_found_pad (GstElement * src, GstPad * pad, gpointer data) +{ + GstPad *srcpad; + + mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); + fail_if (mysinkpad == NULL, "Couldn't create sinkpad"); + srcpad = gst_element_get_static_pad (wavpackparse, "src"); + fail_if (srcpad == NULL, "Failed to get srcpad from wavpackparse"); + gst_pad_set_chain_function (mysinkpad, gst_check_chain_func); + fail_unless (gst_pad_link (srcpad, mysinkpad) == GST_PAD_LINK_OK, + "Failed to link pads"); + gst_pad_set_active (mysinkpad, TRUE); + gst_object_unref (srcpad); +} + +static void +setup_wavpackparse (void) +{ + GstPad *sinkpad; + + GST_DEBUG ("setup_wavpackparse"); + + wavpackparse = gst_element_factory_make ("wavpackparse", "wavpackparse"); + fail_if (wavpackparse == NULL, "Could not create wavpackparse"); + + mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src"); + fail_if (mysrcpad == NULL, "Could not create srcpad"); + + sinkpad = gst_element_get_static_pad (wavpackparse, "sink"); + fail_if (sinkpad == NULL, "Failed to get sinkpad from wavpackparse"); + fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK, + "Failed to link pads"); + gst_object_unref (sinkpad); + + g_signal_connect (wavpackparse, "pad-added", + G_CALLBACK (wavpackparse_found_pad), NULL); + + bus = gst_bus_new (); + gst_element_set_bus (wavpackparse, bus); + + fail_unless (gst_element_set_state (wavpackparse, + GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, + "could not set to playing"); +} + +static void +cleanup_wavpackparse (void) +{ + GstPad *sinkpad, *srcpad; + + GST_DEBUG ("cleanup_wavpackparse"); + + gst_bus_set_flushing (bus, TRUE); + gst_element_set_bus (wavpackparse, NULL); + gst_object_unref (GST_OBJECT (bus)); + + sinkpad = gst_element_get_static_pad (wavpackparse, "sink"); + fail_if (sinkpad == NULL, "Failed to get sinkpad from wavpackparse"); + fail_unless (gst_pad_unlink (mysrcpad, sinkpad), "Failed to unlink pads"); + gst_pad_set_caps (mysrcpad, NULL); + gst_object_unref (sinkpad); + gst_object_unref (mysrcpad); + + srcpad = gst_element_get_static_pad (wavpackparse, "src"); + fail_if (srcpad == NULL, "Failed to get srcpad from wavpackparse"); + fail_unless (gst_pad_unlink (srcpad, mysinkpad), "Failed to unlink pads"); + gst_pad_set_caps (mysinkpad, NULL); + gst_object_unref (srcpad); + gst_object_unref (mysinkpad); + + fail_unless (gst_element_set_state (wavpackparse, GST_STATE_NULL) == + GST_STATE_CHANGE_SUCCESS, "could not set to null"); + + gst_object_unref (wavpackparse); +} + +GST_START_TEST (test_parsing_valid_frames) +{ + GstBuffer *inbuffer, *outbuffer; + int i, num_buffers; + GstFormat format = GST_FORMAT_DEFAULT; + gint64 pos; + + setup_wavpackparse (); + + inbuffer = gst_buffer_new_and_alloc (sizeof (test_file)); + memcpy (GST_BUFFER_DATA (inbuffer), test_file, sizeof (test_file)); + gst_buffer_ref (inbuffer); + + /* should decode the buffer without problems */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + gst_buffer_unref (inbuffer); + + num_buffers = g_list_length (buffers); + /* should get 2 buffers, each one complete wavpack frame */ + fail_unless_equals_int (num_buffers, 2); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), "wvpk", 4) == 0, + "Buffer contains no Wavpack frame"); + fail_unless_equals_int (GST_BUFFER_DURATION (outbuffer), 580498866); + + switch (i) { + case 0:{ + fail_unless_equals_int (GST_BUFFER_TIMESTAMP (outbuffer), 0); + fail_unless_equals_int (GST_BUFFER_OFFSET (outbuffer), 0); + fail_unless_equals_int (GST_BUFFER_OFFSET_END (outbuffer), 25600); + break; + } + case 1:{ + fail_unless_equals_int (GST_BUFFER_TIMESTAMP (outbuffer), 580498866); + fail_unless_equals_int (GST_BUFFER_OFFSET (outbuffer), 25600); + fail_unless_equals_int (GST_BUFFER_OFFSET_END (outbuffer), 51200); + break; + } + } + + buffers = g_list_remove (buffers, outbuffer); + + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + fail_unless (gst_element_query_position (wavpackparse, &format, &pos), + "Position query failed"); + fail_unless_equals_int (pos, 51200); + fail_unless (gst_element_query_duration (wavpackparse, &format, NULL), + "Duration query failed"); + + g_list_free (buffers); + buffers = NULL; + + cleanup_wavpackparse (); +} + +GST_END_TEST; + +GST_START_TEST (test_parsing_invalid_first_header) +{ + GstBuffer *inbuffer, *outbuffer; + int i, num_buffers; + + setup_wavpackparse (); + + inbuffer = gst_buffer_new_and_alloc (sizeof (test_file)); + memcpy (GST_BUFFER_DATA (inbuffer), test_file, sizeof (test_file)); + GST_BUFFER_DATA (inbuffer)[0] = 'k'; + gst_buffer_ref (inbuffer); + + /* should decode the buffer without problems */ + fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); + gst_buffer_unref (inbuffer); + + num_buffers = g_list_length (buffers); + + /* should get 1 buffers, the second non-broken one */ + fail_unless_equals_int (num_buffers, 1); + + for (i = 0; i < num_buffers; ++i) { + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + + fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), "wvpk", 4) == 0, + "Buffer contains no Wavpack frame"); + fail_unless_equals_int (GST_BUFFER_DURATION (outbuffer), 580498866); + + switch (i) { + case 0:{ + fail_unless_equals_int (GST_BUFFER_TIMESTAMP (outbuffer), 580498866); + fail_unless_equals_int (GST_BUFFER_OFFSET (outbuffer), 25600); + break; + } + } + + buffers = g_list_remove (buffers, outbuffer); + + gst_buffer_unref (outbuffer); + outbuffer = NULL; + } + + g_list_free (buffers); + buffers = NULL; + + cleanup_wavpackparse (); +} + +GST_END_TEST; + + +static Suite * +wavpackparse_suite (void) +{ + Suite *s = suite_create ("wavpackparse"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_parsing_valid_frames); + tcase_add_test (tc_chain, test_parsing_invalid_first_header); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = wavpackparse_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 new file mode 100644 index 0000000..3b7c9b4 --- /dev/null +++ b/tests/check/elements/y4menc.c @@ -0,0 +1,179 @@ +/* GStreamer + * + * unit test for y4menc + * + * Copyright (C) <2006> Mark Nauwelaerts + * + * 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 + +#include + +/* 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, " \ + "format = (fourcc) I420, "\ + "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)); + + +static GstElement * +setup_y4menc (void) +{ + 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; +} + +static 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 Ip F25:1 A1:1\n"; + const gchar *data1 = "YUV4MPEG2 C420 W384 H288 Ip F25:1 A1:1\n"; + const gchar *data2 = "FRAME\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) { + gchar *data; + + outbuffer = GST_BUFFER (buffers->data); + fail_if (outbuffer == NULL); + + switch (i) { + case 0: + fail_unless (GST_BUFFER_SIZE (outbuffer) > size); + fail_unless (memcmp (data0, GST_BUFFER_DATA (outbuffer), + strlen (data0)) == 0 || + memcmp (data1, GST_BUFFER_DATA (outbuffer), strlen (data1)) == 0); + /* so we know there is a newline */ + data = (gchar *) GST_BUFFER_DATA (outbuffer); + data = strchr (data, '\n'); + fail_unless (data != NULL); + data++; + fail_unless (memcmp (data2, data, strlen (data2)) == 0); + data += strlen (data2); + /* remainder must be frame data */ + fail_unless ((data - (gchar *) GST_BUFFER_DATA (outbuffer)) + size == + GST_BUFFER_SIZE (outbuffer)); + 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; + +static 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/check/generic/index.c b/tests/check/generic/index.c new file mode 100644 index 0000000..e733c6d --- /dev/null +++ b/tests/check/generic/index.c @@ -0,0 +1,140 @@ +/* GStreamer + * unit test for index setting on all elements + * Copyright (C) 2005 Thomas Vander Stichele + * Copyright (C) 2011 Tim-Philipp Müller + * + * 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 + +static GList *elements = NULL; + +static void +setup (void) +{ + GList *features, *f; + GList *plugins, *p; + gchar **ignorelist = NULL; + const gchar *INDEX_IGNORE_ELEMENTS = NULL; + + GST_DEBUG ("getting elements for package %s", PACKAGE); + INDEX_IGNORE_ELEMENTS = g_getenv ("GST_INDEX_IGNORE_ELEMENTS"); + if (!g_getenv ("GST_NO_INDEX_IGNORE_ELEMENTS") && INDEX_IGNORE_ELEMENTS) { + GST_DEBUG ("Will ignore element factories: '%s'", INDEX_IGNORE_ELEMENTS); + ignorelist = g_strsplit (INDEX_IGNORE_ELEMENTS, " ", 0); + } + + plugins = gst_registry_get_plugin_list (gst_registry_get_default ()); + + for (p = plugins; p; p = p->next) { + GstPlugin *plugin = p->data; + + if (strcmp (gst_plugin_get_source (plugin), PACKAGE) != 0) + continue; + + features = + gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), + gst_plugin_get_name (plugin)); + + for (f = features; f; f = f->next) { + GstPluginFeature *feature = f->data; + const gchar *name = gst_plugin_feature_get_name (feature); + gboolean ignore = FALSE; + + if (!GST_IS_ELEMENT_FACTORY (feature)) + continue; + + if (ignorelist) { + gchar **s; + + for (s = ignorelist; s && *s; ++s) { + if (g_str_has_prefix (name, *s)) { + GST_DEBUG ("ignoring element %s", name); + ignore = TRUE; + } + } + if (ignore) + continue; + } + + GST_DEBUG ("adding element %s", name); + elements = g_list_prepend (elements, (gpointer) g_strdup (name)); + } + gst_plugin_feature_list_free (features); + } + gst_plugin_list_free (plugins); + g_strfreev (ignorelist); +} + +static void +teardown (void) +{ + GList *e; + + for (e = elements; e; e = e->next) { + g_free (e->data); + } + g_list_free (elements); + elements = NULL; +} + +GST_START_TEST (test_set_index) +{ + GstElement *element; + GstIndex *idx; + GList *e; + + idx = gst_index_factory_make ("memindex"); + if (idx == NULL) + return; + + gst_object_ref_sink (idx); + + for (e = elements; e; e = e->next) { + const gchar *name = e->data; + + GST_INFO ("testing element %s", name); + element = gst_element_factory_make (name, name); + fail_if (element == NULL, "Could not make element from factory %s", name); + + gst_element_set_index (element, idx); + gst_object_unref (element); + } + + gst_object_unref (idx); +} + +GST_END_TEST; + +static Suite * +index_suite (void) +{ + Suite *s = suite_create ("index"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_checked_fixture (tc_chain, setup, teardown); + tcase_add_test (tc_chain, test_set_index); + + return s; +} + +GST_CHECK_MAIN (index); diff --git a/tests/check/generic/states.c b/tests/check/generic/states.c new file mode 100644 index 0000000..0f6d1da --- /dev/null +++ b/tests/check/generic/states.c @@ -0,0 +1,222 @@ +/* GStreamer + * + * unit test for state changes on all elements + * + * Copyright (C) <2005> Thomas Vander Stichele + * + * 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 + +#include + +static GList *elements = NULL; + +static void +setup (void) +{ + GList *features, *f; + GList *plugins, *p; + gchar **ignorelist = NULL; + const gchar *STATE_IGNORE_ELEMENTS = NULL; + + GST_DEBUG ("getting elements for package %s", PACKAGE); + STATE_IGNORE_ELEMENTS = g_getenv ("GST_STATE_IGNORE_ELEMENTS"); + if (!g_getenv ("GST_NO_STATE_IGNORE_ELEMENTS") && STATE_IGNORE_ELEMENTS) { + GST_DEBUG ("Will ignore element factories: '%s'", STATE_IGNORE_ELEMENTS); + ignorelist = g_strsplit (STATE_IGNORE_ELEMENTS, " ", 0); + } + + plugins = gst_registry_get_plugin_list (gst_registry_get_default ()); + + for (p = plugins; p; p = p->next) { + GstPlugin *plugin = p->data; + + if (strcmp (gst_plugin_get_source (plugin), PACKAGE) != 0) + continue; + + features = + gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), + gst_plugin_get_name (plugin)); + + for (f = features; f; f = f->next) { + GstPluginFeature *feature = f->data; + const gchar *name = gst_plugin_feature_get_name (feature); + gboolean ignore = FALSE; + + if (!GST_IS_ELEMENT_FACTORY (feature)) + continue; + + if (ignorelist) { + gchar **s; + + for (s = ignorelist; s && *s; ++s) { + if (g_str_has_prefix (name, *s)) { + GST_DEBUG ("ignoring element %s", name); + ignore = TRUE; + } + } + if (ignore) + continue; + } + + GST_DEBUG ("adding element %s", name); + elements = g_list_prepend (elements, (gpointer) g_strdup (name)); + } + gst_plugin_feature_list_free (features); + } + gst_plugin_list_free (plugins); + g_strfreev (ignorelist); +} + +static void +teardown (void) +{ + GList *e; + + for (e = elements; e; e = e->next) { + g_free (e->data); + } + g_list_free (elements); + elements = NULL; +} + + +GST_START_TEST (test_state_changes_up_and_down_seq) +{ + GstElement *element; + GList *e; + + for (e = elements; e; e = e->next) { + const gchar *name = e->data; + + GST_INFO ("testing element %s", name); + element = gst_element_factory_make (name, name); + fail_if (element == NULL, "Could not make element from factory %s", name); + + if (GST_IS_PIPELINE (element)) { + GST_DEBUG ("element %s is a pipeline", name); + } + + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_NULL); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_PLAYING); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (element)); + } +} + +GST_END_TEST; + +GST_START_TEST (test_state_changes_up_seq) +{ + GstElement *element; + GList *e; + + for (e = elements; e; e = e->next) { + const gchar *name = e->data; + + GST_INFO ("testing element %s", name); + element = gst_element_factory_make (name, name); + fail_if (element == NULL, "Could not make element from factory %s", name); + + if (GST_IS_PIPELINE (element)) { + GST_DEBUG ("element %s is a pipeline", name); + } + + gst_element_set_state (element, GST_STATE_READY); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + + gst_element_set_state (element, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (element)); + } +} + +GST_END_TEST; + +GST_START_TEST (test_state_changes_down_seq) +{ + GstElement *element; + GList *e; + + for (e = elements; e; e = e->next) { + const gchar *name = e->data; + + GST_INFO ("testing element %s", name); + element = gst_element_factory_make (name, name); + fail_if (element == NULL, "Could not make element from factory %s", name); + + if (GST_IS_PIPELINE (element)) { + GST_DEBUG ("element %s is a pipeline", name); + } + + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_PLAYING); + + gst_element_set_state (element, GST_STATE_PAUSED); + gst_element_set_state (element, GST_STATE_READY); + gst_element_set_state (element, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (element)); + } +} + +GST_END_TEST; + + +static Suite * +states_suite (void) +{ + Suite *s = suite_create ("states"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_checked_fixture (tc_chain, setup, teardown); + tcase_add_test (tc_chain, test_state_changes_up_and_down_seq); + tcase_add_test (tc_chain, test_state_changes_up_seq); + tcase_add_test (tc_chain, test_state_changes_down_seq); + + return s; +} + +GST_CHECK_MAIN (states); diff --git a/tests/check/gst-plugins-good.supp b/tests/check/gst-plugins-good.supp new file mode 100644 index 0000000..3e987e6 --- /dev/null +++ b/tests/check/gst-plugins-good.supp @@ -0,0 +1,127 @@ +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_finish_decompress +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_consume_input + fun:jpeg_read_header +} + +{ + + Memcheck:Cond + fun:jpeg_fill_bit_buffer + fun:jpeg_huff_decode + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_read_raw_data +} + +{ + + Memcheck:Cond + fun:jpeg_fill_bit_buffer + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_read_raw_data +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_consume_input + fun:jpeg_read_header +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + fun:jpeg_finish_compress +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_finish_compress +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_finish_compress +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_write_raw_data +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_write_raw_data +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_write_raw_data +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jpeg_write_raw_data +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jinit_compress_master + fun:jpeg_start_compress +} + +{ + + Memcheck:Cond + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + obj:/usr/lib/libjpeg.so.* + fun:jinit_compress_master + fun:jpeg_start_compress +} diff --git a/tests/check/pipelines/effectv.c b/tests/check/pipelines/effectv.c new file mode 100644 index 0000000..1e8d96f --- /dev/null +++ b/tests/check/pipelines/effectv.c @@ -0,0 +1,146 @@ +/* GStreamer + * + * Copyright (C) <2009> Sebastian Dröge + * + * 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 +#include + +typedef struct +{ + GMainLoop *loop; + gboolean eos; +} OnMessageUserData; + +static void +on_message_cb (GstBus * bus, GstMessage * message, gpointer user_data) +{ + OnMessageUserData *d = user_data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR: + case GST_MESSAGE_WARNING: + g_assert_not_reached (); + break; + case GST_MESSAGE_EOS: + g_main_loop_quit (d->loop); + d->eos = TRUE; + break; + default: + break; + } +} + +static void +run_test (const gchar * pipeline_string) +{ + GstElement *pipeline; + GstBus *bus; + GMainLoop *loop; + OnMessageUserData omud = { NULL, }; + GstStateChangeReturn ret; + + GST_DEBUG ("Testing pipeline '%s'", pipeline_string); + + pipeline = gst_parse_launch (pipeline_string, NULL); + fail_unless (pipeline != NULL); + g_object_set (G_OBJECT (pipeline), "async-handling", TRUE, NULL); + + loop = g_main_loop_new (NULL, FALSE); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + gst_bus_add_signal_watch (bus); + + omud.loop = loop; + omud.eos = FALSE; + + g_signal_connect (bus, "message", (GCallback) on_message_cb, &omud); + + gst_object_unref (bus); + + ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + fail_unless (ret == GST_STATE_CHANGE_SUCCESS + || ret == GST_STATE_CHANGE_ASYNC); + + g_main_loop_run (loop); + + fail_unless (gst_element_set_state (pipeline, + GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); + + fail_unless (omud.eos == TRUE); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); +} + +#define CREATE_TEST(element) \ +GST_START_TEST (test_##element) \ +{ \ + gchar *pipeline; \ + \ + pipeline = g_strdup_printf ("videotestsrc num-buffers=100 ! " \ + "ffmpegcolorspace ! " \ + " %s ! " \ + " fakesink", #element); \ + \ + run_test (pipeline); \ + g_free (pipeline); \ +} \ +\ +GST_END_TEST; + +CREATE_TEST (agingtv); +CREATE_TEST (dicetv); +CREATE_TEST (edgetv); +CREATE_TEST (optv); +CREATE_TEST (quarktv); +CREATE_TEST (radioactv); +CREATE_TEST (revtv); +CREATE_TEST (rippletv); +CREATE_TEST (shagadelictv); +CREATE_TEST (streaktv); +CREATE_TEST (vertigotv); +CREATE_TEST (warptv); + +static Suite * +effectv_suite (void) +{ + Suite *s = suite_create ("effectv"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_set_timeout (tc_chain, 180); + + tcase_add_test (tc_chain, test_agingtv); + tcase_add_test (tc_chain, test_dicetv); + tcase_add_test (tc_chain, test_edgetv); + tcase_add_test (tc_chain, test_optv); + tcase_add_test (tc_chain, test_quarktv); + tcase_add_test (tc_chain, test_radioactv); + tcase_add_test (tc_chain, test_revtv); + tcase_add_test (tc_chain, test_rippletv); + tcase_add_test (tc_chain, test_shagadelictv); + tcase_add_test (tc_chain, test_streaktv); + tcase_add_test (tc_chain, test_vertigotv); + tcase_add_test (tc_chain, test_warptv); + + return s; +} + +GST_CHECK_MAIN (effectv); diff --git a/tests/check/pipelines/flacdec.c b/tests/check/pipelines/flacdec.c new file mode 100644 index 0000000..ce8546e --- /dev/null +++ b/tests/check/pipelines/flacdec.c @@ -0,0 +1,247 @@ +/* GStreamer + * Copyright (C) 2009 Thomas Vander Stichele + * + * 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 +#include + +static guint16 +buffer_get_first_sample (GstBuffer * buf) +{ + GstStructure *s; + gint w, d, c, r, e; + + fail_unless (buf != NULL, "NULL buffer"); + fail_unless (GST_BUFFER_CAPS (buf) != NULL, "buffer without caps"); + + /* log buffer details */ + GST_DEBUG ("buffer with size=%u, caps=%" GST_PTR_FORMAT, + GST_BUFFER_SIZE (buf), GST_BUFFER_CAPS (buf)); + GST_MEMDUMP ("buffer data from decoder", GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + + /* make sure it's the format we expect */ + s = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0); + fail_unless_equals_string (gst_structure_get_name (s), "audio/x-raw-int"); + fail_unless (gst_structure_get_int (s, "width", &w)); + fail_unless_equals_int (w, 16); + fail_unless (gst_structure_get_int (s, "depth", &d)); + fail_unless_equals_int (d, 16); + fail_unless (gst_structure_get_int (s, "rate", &r)); + fail_unless_equals_int (r, 44100); + fail_unless (gst_structure_get_int (s, "channels", &c)); + fail_unless_equals_int (c, 1); + fail_unless (gst_structure_get_int (s, "endianness", &e)); + if (e == G_BIG_ENDIAN) + return GST_READ_UINT16_BE (GST_BUFFER_DATA (buf)); + else + return GST_READ_UINT16_LE (GST_BUFFER_DATA (buf)); +} + +GST_START_TEST (test_decode) +{ + GstElement *pipeline; + GstElement *appsink; + GstBuffer *buffer = NULL; + guint16 first_sample = 0; + guint size = 0; + gchar *path = + g_build_filename (GST_TEST_FILES_PATH, "audiotestsrc.flac", NULL); + gchar *pipe_desc = + g_strdup_printf ("filesrc location=\"%s\" ! flacdec ! appsink name=sink", + path); + + pipeline = gst_parse_launch (pipe_desc, NULL); + fail_unless (pipeline != NULL); + + g_free (path); + g_free (pipe_desc); + + appsink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); + fail_unless (appsink != NULL); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + do { + g_signal_emit_by_name (appsink, "pull-buffer", &buffer); + if (buffer == NULL) + break; + if (first_sample == 0) + first_sample = buffer_get_first_sample (buffer); + GST_DEBUG ("buffer: %d\n", buffer->size); + GST_DEBUG ("buffer: %04x\n", buffer_get_first_sample (buffer)); + size += buffer->size; + + gst_buffer_unref (buffer); + buffer = NULL; + } + while (TRUE); + + /* audiotestsrc with samplesperbuffer 1024 and 10 num-buffers */ + fail_unless_equals_int (size, 20480); + fail_unless_equals_int (first_sample, 0x066a); + + gst_element_set_state (pipeline, GST_STATE_NULL); + g_object_unref (pipeline); + g_object_unref (appsink); +} + +GST_END_TEST; + +GST_START_TEST (test_decode_seek_full) +{ + GstElement *pipeline; + GstElement *appsink; + GstEvent *event; + GstBuffer *buffer = NULL; + guint16 first_sample = 0; + guint size = 0; + gchar *path = + g_build_filename (GST_TEST_FILES_PATH, "audiotestsrc.flac", NULL); + gchar *pipe_desc = + g_strdup_printf ("filesrc location=\"%s\" ! flacdec ! appsink name=sink", + path); + + pipeline = gst_parse_launch (pipe_desc, NULL); + fail_unless (pipeline != NULL); + + g_free (pipe_desc); + g_free (path); + + appsink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); + fail_unless (appsink != NULL); + + gst_element_set_state (pipeline, GST_STATE_PAUSED); + gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE); + + /* do a seek that should give us the complete output */ + event = gst_event_new_seek (1.0, GST_FORMAT_DEFAULT, GST_SEEK_FLAG_FLUSH, + GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 20480); + fail_unless (gst_element_send_event (appsink, event)); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + do { + g_signal_emit_by_name (appsink, "pull-buffer", &buffer); + if (buffer == NULL) + break; + if (first_sample == 0) + first_sample = buffer_get_first_sample (buffer); + size += buffer->size; + + gst_buffer_unref (buffer); + buffer = NULL; + } + while (TRUE); + + /* file was generated with audiotestsrc + * with 1024 samplesperbuffer and 10 num-buffers in 16 bit audio */ + fail_unless_equals_int (size, 20480); + fail_unless_equals_int (first_sample, 0x066a); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + g_object_unref (pipeline); + g_object_unref (appsink); +} + +GST_END_TEST; + +GST_START_TEST (test_decode_seek_partial) +{ + GstElement *pipeline; + GstElement *appsink; + GstEvent *event; + GstBuffer *buffer = NULL; + guint size = 0; + guint16 first_sample = 0; + gchar *path = + g_build_filename (GST_TEST_FILES_PATH, "audiotestsrc.flac", NULL); + gchar *pipe_desc = + g_strdup_printf ("filesrc location=\"%s\" ! flacdec ! appsink name=sink", + path); + + pipeline = gst_parse_launch (pipe_desc, NULL); + fail_unless (pipeline != NULL); + + g_free (path); + g_free (pipe_desc); + + appsink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); + fail_unless (appsink != NULL); + + gst_element_set_state (pipeline, GST_STATE_PAUSED); + gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE); + + /* do a partial seek to get the first 1024 samples or 2048 bytes */ + event = gst_event_new_seek (1.0, GST_FORMAT_DEFAULT, GST_SEEK_FLAG_FLUSH, + GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 1024); + GST_DEBUG ("seeking"); + fail_unless (gst_element_send_event (appsink, event)); + GST_DEBUG ("seeked"); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + do { + GST_DEBUG ("pulling buffer"); + g_signal_emit_by_name (appsink, "pull-buffer", &buffer); + GST_DEBUG ("pulled buffer %p", buffer); + if (buffer == NULL) + break; + if (first_sample == 0) { + fail_unless_equals_int (GST_BUFFER_OFFSET (buffer), 0L); + first_sample = buffer_get_first_sample (buffer); + } + size += buffer->size; + + gst_buffer_unref (buffer); + buffer = NULL; + } + while (TRUE); + + fail_unless_equals_int (size, 2048); + fail_unless_equals_int (first_sample, 0x066a); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + g_object_unref (pipeline); + g_object_unref (appsink); +} + +GST_END_TEST; + + +static Suite * +flacdec_suite (void) +{ + Suite *s = suite_create ("flacdec"); + + TCase *tc_chain = tcase_create ("linear"); + + /* time out after 60s, not the default 3 */ + tcase_set_timeout (tc_chain, 60); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_decode); + tcase_add_test (tc_chain, test_decode_seek_full); + tcase_add_test (tc_chain, test_decode_seek_partial); + + return s; +} + +GST_CHECK_MAIN (flacdec); diff --git a/tests/check/pipelines/simple-launch-lines.c b/tests/check/pipelines/simple-launch-lines.c new file mode 100644 index 0000000..c1c12ed --- /dev/null +++ b/tests/check/pipelines/simple-launch-lines.c @@ -0,0 +1,284 @@ +/* GStreamer + * Copyright (C) 2005 Andy Wingo + * + * simple_launch_lines.c: Unit test for simple pipelines + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#ifndef GST_DISABLE_PARSE + +static GstElement * +setup_pipeline (const gchar * pipe_descr) +{ + GstElement *pipeline; + + pipeline = gst_parse_launch (pipe_descr, NULL); + g_return_val_if_fail (GST_IS_PIPELINE (pipeline), NULL); + return pipeline; +} + +/* + * run_pipeline: + * @pipe: the pipeline to run + * @desc: the description for use in messages + * @events: is a mask of expected events + * @tevent: is the expected terminal event. + * + * the poll call will time out after half a second. + */ +static void +run_pipeline (GstElement * pipe, const gchar * descr, + GstMessageType events, GstMessageType tevent, GstState target_state) +{ + GstBus *bus; + GstMessage *message; + GstMessageType revent; + GstStateChangeReturn ret; + + g_assert (pipe); + bus = gst_element_get_bus (pipe); + g_assert (bus); + + fail_if (gst_element_set_state (pipe, target_state) == + GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to playing", descr); + ret = gst_element_get_state (pipe, NULL, NULL, 10 * GST_SECOND); + if (ret == GST_STATE_CHANGE_ASYNC) { + g_critical ("Pipeline '%s' failed to go to PAUSED fast enough", descr); + goto done; + } else if ((ret != GST_STATE_CHANGE_SUCCESS) + && (ret != GST_STATE_CHANGE_NO_PREROLL)) { + g_critical ("Pipeline '%s' failed to go into PAUSED state (%s)", descr, + gst_element_state_change_return_get_name (ret)); + goto done; + } + + while (1) { + message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2); + + /* always have to pop the message before getting back into poll */ + if (message) { + revent = GST_MESSAGE_TYPE (message); + gst_message_unref (message); + } else { + revent = GST_MESSAGE_UNKNOWN; + } + + if (revent == tevent) { + break; + } else if (revent == GST_MESSAGE_UNKNOWN) { + g_critical ("Unexpected timeout in gst_bus_poll, looking for %d: %s", + tevent, descr); + break; + } else if (revent & events) { + continue; + } + g_critical + ("Unexpected message received of type %d, '%s', looking for %d: %s", + revent, gst_message_type_get_name (revent), tevent, descr); + } + +done: + fail_if (gst_element_set_state (pipe, GST_STATE_NULL) == + GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to NULL", descr); + gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); + gst_object_unref (pipe); + + gst_bus_set_flushing (bus, TRUE); + gst_object_unref (bus); +} + +GST_START_TEST (test_rtp_payloaders) +{ + const gchar *s; + + /* FIXME: going to playing would be nice, but thet leads to lot of failure */ + GstState target_state = GST_STATE_PAUSED; + + /* we use is-live here to avoid preroll */ +#define PIPELINE_STRING(bufcount, bufsize, pl, dpl) "fakesrc is-live=true num-buffers=" bufcount " filltype=2 sizetype=2 sizemax=" bufsize " ! " pl " ! " dpl " ! fakesink" +#define DEFAULT_BUFCOUNT "5" +#define DEFAULT_BUFSIZE "16" + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpilbcpay", + "rtpilbcdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpgsmpay", + "rtpgsmdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + /* This one needs a bit different buffer size than others or it doesn't work. */ + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, "52", "rtpamrpay", "rtpamrdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtppcmapay", + "rtppcmadepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtppcmupay", + "rtppcmudepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpmpapay", + "rtpmpadepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtph263ppay", + "rtph263pdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtph263pay", + "rtph263depay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtph264pay", + "rtph264depay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpL16pay", + "rtpL16depay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpmp2tpay", + "rtpmp2tdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpmp4vpay", + "rtpmp4vdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpmp4gpay", + "rtpmp4gdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + /* Cannot be tested with fakesrc becouse speex payloader requires a valid header?! */ + /* + s = PIPELINE_STRING(DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpspeexpay", "rtpspeexdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + */ + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtptheorapay", + "rtptheoradepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpvorbispay", + "rtpvorbisdepay"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + /*s = FAKESRC " ! ! rtpac3depay ! " FAKESINK */ + /*s = FAKESRC " ! ! asteriskh263 ! " FAKESINK; */ + /*s = FAKESRC " ! ! rtpmpvdepay ! " FAKESINK; */ + /*s = FAKESRC " ! ! rtpmp4adepay ! " FAKESINK; */ + /*s = FAKESRC " ! ! rtpsv3vdepay ! " FAKESINK; */ +} + +GST_END_TEST +GST_START_TEST (test_video_encoders_decoders) +{ + const gchar *s; + GstState target_state = GST_STATE_PLAYING; + + /* no is-live on the source because we actually want to preroll since + * run_pipeline only goes into PAUSED */ +#define ENC_DEC_PIPELINE_STRING(bufcount, enc, dec) "videotestsrc num-buffers=" bufcount " ! " enc " ! " dec " ! fakesink" +#define DEFAULT_BUFCOUNT "5" + + s = ENC_DEC_PIPELINE_STRING (DEFAULT_BUFCOUNT, "jpegenc", "jpegdec"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = ENC_DEC_PIPELINE_STRING (DEFAULT_BUFCOUNT, "pngenc", "pngdec"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); + + s = ENC_DEC_PIPELINE_STRING (DEFAULT_BUFCOUNT, "smokeenc", "smokedec"); + run_pipeline (setup_pipeline (s), s, + GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), + GST_MESSAGE_UNKNOWN, target_state); +} + +GST_END_TEST +#endif /* #ifndef GST_DISABLE_PARSE */ +static Suite * +simple_launch_lines_suite (void) +{ + Suite *s = suite_create ("Pipelines"); + TCase *tc_chain = tcase_create ("linear"); + + /* time out after 60s, not the default 3 */ + tcase_set_timeout (tc_chain, 60); + + suite_add_tcase (s, tc_chain); +#ifndef GST_DISABLE_PARSE + tcase_add_test (tc_chain, test_rtp_payloaders); + tcase_add_test (tc_chain, test_video_encoders_decoders); +#endif + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = simple_launch_lines_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/pipelines/tagschecking.c b/tests/check/pipelines/tagschecking.c new file mode 100644 index 0000000..d851b3f --- /dev/null +++ b/tests/check/pipelines/tagschecking.c @@ -0,0 +1,354 @@ +/* GStreamer + * Copyright (C) 2008 Nokia Corporation. (contact ) + * Copyright (C) 2010 Thiago Santos + * + * 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 + +static GstTagList *received_tags = NULL; + +static gboolean +bus_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + GMainLoop *loop = (GMainLoop *) data; + + switch (message->type) { + case GST_MESSAGE_EOS: + g_main_loop_quit (loop); + break; + case GST_MESSAGE_WARNING: + case GST_MESSAGE_ERROR:{ + GError *gerror; + + gchar *debug; + + gst_message_parse_error (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + g_error_free (gerror); + g_free (debug); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_TAG:{ + if (received_tags == NULL) { + gst_message_parse_tag (message, &received_tags); + } else { + GstTagList *tl = NULL, *ntl = NULL; + + gst_message_parse_tag (message, &tl); + if (tl) { + ntl = gst_tag_list_merge (received_tags, tl, GST_TAG_MERGE_PREPEND); + if (ntl) { + GST_LOG ("taglists merged: %" GST_PTR_FORMAT, ntl); + gst_tag_list_free (received_tags); + received_tags = ntl; + } + gst_tag_list_free (tl); + } + } + break; + } + default: + break; + } + + return TRUE; +} + +/* + * Creates a pipeline in the form: + * fakesrc num-buffers=1 ! caps ! muxer ! filesink location=file + * + * And sets the tags in tag_str into the muxer via tagsetter. + */ +static void +test_mux_tags (const gchar * tag_str, const gchar * caps, + const gchar * muxer, const gchar * file) +{ + GstElement *pipeline; + GstBus *bus; + GMainLoop *loop; + GstTagList *sent_tags; + GstElement *mux; + GstTagSetter *setter; + gchar *launch_str; + guint bus_watch = 0; + + GST_DEBUG ("testing xmp muxing on : %s", muxer); + + launch_str = g_strdup_printf ("fakesrc num-buffers=1 ! %s ! %s name=mux ! " + "filesink location=%s name=sink", caps, muxer, file); + pipeline = gst_parse_launch (launch_str, NULL); + g_free (launch_str); + fail_unless (pipeline != NULL); + + mux = gst_bin_get_by_name (GST_BIN (pipeline), "mux"); + fail_unless (mux != NULL); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + gst_element_set_state (pipeline, GST_STATE_READY); + + setter = GST_TAG_SETTER (mux); + fail_unless (setter != NULL); + sent_tags = gst_structure_from_string (tag_str, NULL); + fail_unless (sent_tags != NULL); + gst_tag_setter_merge_tags (setter, sent_tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_free (sent_tags); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_main_loop_run (loop); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + g_main_loop_unref (loop); + g_object_unref (mux); + g_object_unref (pipeline); + g_source_remove (bus_watch); +} + +/* + * Makes a pipeline in the form: + * filesrc location=file ! demuxer ! fakesink + * + * And gets the tags that are posted on the bus to compare + * with the tags in 'tag_str' + */ +static void +test_demux_tags (const gchar * tag_str, const gchar * demuxer, + const gchar * file) +{ + GstElement *pipeline; + GstBus *bus; + GMainLoop *loop; + GstTagList *sent_tags; + gint i, j, n_recv, n_sent; + const gchar *name_sent, *name_recv; + const GValue *value_sent, *value_recv; + gboolean found; + gint comparison; + GstElement *demux; + gchar *launch_str; + guint bus_watch = 0; + + GST_DEBUG ("testing tags : %s", tag_str); + + if (received_tags) { + gst_tag_list_free (received_tags); + received_tags = NULL; + } + + launch_str = g_strdup_printf ("filesrc location=%s ! %s name=demux ! " + "fakesink", file, demuxer); + pipeline = gst_parse_launch (launch_str, NULL); + g_free (launch_str); + fail_unless (pipeline != NULL); + + demux = gst_bin_get_by_name (GST_BIN (pipeline), "demux"); + fail_unless (demux != NULL); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + sent_tags = gst_structure_from_string (tag_str, NULL); + fail_unless (sent_tags != NULL); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_main_loop_run (loop); + + GST_DEBUG ("mainloop done : %p", received_tags); + + /* verify tags */ + fail_unless (received_tags != NULL); + n_recv = gst_structure_n_fields (received_tags); + n_sent = gst_structure_n_fields (sent_tags); + fail_unless (n_recv >= n_sent); + /* FIXME: compare taglits values */ + for (i = 0; i < n_sent; i++) { + name_sent = gst_structure_nth_field_name (sent_tags, i); + value_sent = gst_structure_get_value (sent_tags, name_sent); + found = FALSE; + for (j = 0; j < n_recv; j++) { + name_recv = gst_structure_nth_field_name (received_tags, j); + if (!strcmp (name_sent, name_recv)) { + value_recv = gst_structure_get_value (received_tags, name_recv); + comparison = gst_value_compare (value_sent, value_recv); + if (comparison != GST_VALUE_EQUAL) { + gchar *vs = g_strdup_value_contents (value_sent); + gchar *vr = g_strdup_value_contents (value_recv); + GST_DEBUG ("sent = %s:'%s', recv = %s:'%s'", + G_VALUE_TYPE_NAME (value_sent), vs, + G_VALUE_TYPE_NAME (value_recv), vr); + g_free (vs); + g_free (vr); + } + fail_unless (comparison == GST_VALUE_EQUAL, + "tag item %s has been received with different type or value", + name_sent); + found = TRUE; + break; + } + } + fail_unless (found, "tag item %s is lost", name_sent); + } + + gst_tag_list_free (received_tags); + received_tags = NULL; + gst_tag_list_free (sent_tags); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + g_main_loop_unref (loop); + g_object_unref (demux); + g_object_unref (pipeline); + g_source_remove (bus_watch); +} + +/* + * Tests if the muxer/demuxer pair can serialize the tags in 'tag_str' + * to a file and recover them correctly. + * + * 'caps' are used to assure the muxer accepts the fake buffer fakesrc + * will send to it. + */ +static void +test_tags (const gchar * tag_str, const gchar * caps, const gchar * muxer, + const gchar * demuxer) +{ + gchar *tmpfile; + gchar *tmp; + + tmp = g_strdup_printf ("%s%d", "gst-check-xmp-test-", g_random_int ()); + tmpfile = g_build_filename (g_get_tmp_dir (), tmp, NULL); + g_free (tmp); + + GST_DEBUG ("testing tags : %s", tag_str); + test_mux_tags (tag_str, caps, muxer, tmpfile); + test_demux_tags (tag_str, demuxer, tmpfile); + g_free (tmpfile); +} + +#define H264_CAPS "video/x-h264, width=(int)320, height=(int)240," \ + " framerate=(fraction)30/1, codec_data=(buffer)" \ + "01401592ffe10017674d401592540a0fd8088000000300" \ + "8000001e478b175001000468ee3c80, stream-format=(string)avc" + +#define COMMON_TAGS \ + "taglist,title=test_title," \ + "artist=test_artist," \ + "keywords=\"key1,key2\"," \ + "description=test_desc" + +GST_START_TEST (test_common_tags) +{ + if (!gst_default_registry_check_feature_version ("qtdemux", 0, 10, 23)) { + GST_INFO ("Skipping test, qtdemux either not available or too old"); + return; + } + test_tags (COMMON_TAGS, H264_CAPS, "qtmux", "qtdemux"); + test_tags (COMMON_TAGS, H264_CAPS, "mp4mux", "qtdemux"); + test_tags (COMMON_TAGS, H264_CAPS, "gppmux", "qtdemux"); +} + +GST_END_TEST; + +#define GEO_LOCATION_TAGS \ + "taglist,geo-location-country=Brazil," \ + "geo-location-city=\"Campina Grande\"," \ + "geo-location-sublocation=Bodocongo," \ + "geo-location-latitude=-12.125," \ + "geo-location-longitude=56.75," \ + "geo-location-elevation=327.5" + +GST_START_TEST (test_geo_location_tags) +{ + if (!gst_default_registry_check_feature_version ("qtdemux", 0, 10, 23)) { + GST_INFO ("Skipping test, qtdemux either not available or too old"); + return; + } + test_tags (GEO_LOCATION_TAGS, H264_CAPS, "qtmux", "qtdemux"); + test_tags (GEO_LOCATION_TAGS, H264_CAPS, "mp4mux", "qtdemux"); + test_tags (GEO_LOCATION_TAGS, H264_CAPS, "gppmux", "qtdemux"); +} + +GST_END_TEST; + + +#define USER_TAGS \ + "taglist,user-rating=(uint)85" + +GST_START_TEST (test_user_tags) +{ + if (!gst_default_registry_check_feature_version ("qtdemux", 0, 10, 23)) { + GST_INFO ("Skipping test, qtdemux either not available or too old"); + return; + } + + test_tags (USER_TAGS, H264_CAPS, "qtmux", "qtdemux"); + test_tags (USER_TAGS, H264_CAPS, "mp4mux", "qtdemux"); + test_tags (USER_TAGS, H264_CAPS, "gppmux", "qtdemux"); +} + +GST_END_TEST; + +static Suite * +metadata_suite (void) +{ + Suite *s = suite_create ("tagschecking"); + + TCase *tc_chain = tcase_create ("general"); + + /* time out after 60s, not the default 3 */ + tcase_set_timeout (tc_chain, 60); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_common_tags); + tcase_add_test (tc_chain, test_geo_location_tags); + tcase_add_test (tc_chain, test_user_tags); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = metadata_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/pipelines/wavenc.c b/tests/check/pipelines/wavenc.c new file mode 100644 index 0000000..c5344a7 --- /dev/null +++ b/tests/check/pipelines/wavenc.c @@ -0,0 +1,201 @@ +/* GStreamer + * + * unit test for wavenc + * + * Copyright (C) <2010> Stefan Kost + * + * 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 +#include + +static gboolean +bus_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + GMainLoop *loop = (GMainLoop *) data; + + switch (message->type) { + case GST_MESSAGE_EOS: + g_main_loop_quit (loop); + break; + case GST_MESSAGE_WARNING: + case GST_MESSAGE_ERROR:{ + GError *gerror; + gchar *debug; + + gst_message_parse_error (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + gst_message_unref (message); + g_error_free (gerror); + g_free (debug); + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + +/* + * gst-launch \ + * audiotestsrc freq=440 num-buffers=100 ! interleave name=i ! audioconvert ! wavenc ! filesink location=/tmp/mc.wav \ + * audiotestsrc freq=880 num-buffers=100 ! i. + * ... + * + * http://www.microsoft.com/whdc/device/audio/multichaud.mspx + */ + +static void +make_n_channel_wav (const gint channels, const GValueArray * arr) +{ + GstElement *pipeline; + GstElement **audiotestsrc, *interleave, *wavenc, *conv, *fakesink; + GstBus *bus; + GMainLoop *loop; + guint i; + guint bus_watch = 0; + + audiotestsrc = g_new0 (GstElement *, channels); + + pipeline = gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL); + + interleave = gst_element_factory_make ("interleave", NULL); + fail_unless (interleave != NULL); + g_object_set (interleave, "channel-positions", arr, NULL); + gst_bin_add (GST_BIN (pipeline), interleave); + + if (G_BYTE_ORDER == G_BIG_ENDIAN) { + /* we're not here to test orc; audioconvert misbehaves on ppc32 */ + g_setenv ("ORC_CODE", "backup", 1); + conv = gst_element_factory_make ("audioconvert", NULL); + } else { + conv = gst_element_factory_make ("identity", NULL); + } + fail_unless (conv != NULL); + gst_bin_add (GST_BIN (pipeline), conv); + fail_unless (gst_element_link (interleave, conv)); + + wavenc = gst_element_factory_make ("wavenc", NULL); + fail_unless (wavenc != NULL); + gst_bin_add (GST_BIN (pipeline), wavenc); + fail_unless (gst_element_link (conv, wavenc)); + + fakesink = gst_element_factory_make ("fakesink", NULL); + fail_unless (fakesink != NULL); + gst_bin_add (GST_BIN (pipeline), fakesink); + fail_unless (gst_element_link (wavenc, fakesink)); + + for (i = 0; i < channels; i++) { + audiotestsrc[i] = gst_element_factory_make ("audiotestsrc", NULL); + fail_unless (audiotestsrc[i] != NULL); + g_object_set (G_OBJECT (audiotestsrc[i]), "wave", 0, "freq", 440.0 * i, + "num-buffers", 100, NULL); + gst_bin_add (GST_BIN (pipeline), audiotestsrc[i]); + fail_unless (gst_element_link (audiotestsrc[i], interleave)); + } + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_main_loop_run (loop); + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (pipeline); + g_free (audiotestsrc); + + g_main_loop_unref (loop); + g_source_remove (bus_watch); +} + +GST_START_TEST (test_encode_stereo) +{ + GValueArray *arr; + GValue val = { 0, }; + + arr = g_value_array_new (2); + g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT); + g_value_array_append (arr, &val); + g_value_reset (&val); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT); + g_value_array_append (arr, &val); + g_value_unset (&val); + + make_n_channel_wav (2, arr); + g_value_array_free (arr); +} + +GST_END_TEST; + +#if 0 +GST_START_TEST (test_encode_multichannel) +{ + GValueArray *arr; + GValue val = { 0, }; + + arr = g_value_array_new (6); + g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT); + g_value_array_append (arr, &val); + g_value_reset (&val); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT); + g_value_array_append (arr, &val); + g_value_reset (&val); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER); + g_value_array_append (arr, &val); + g_value_reset (&val); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_LFE); + g_value_array_append (arr, &val); + g_value_reset (&val); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT); + g_value_array_append (arr, &val); + g_value_reset (&val); + g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT); + g_value_array_append (arr, &val); + g_value_unset (&val); + + make_n_channel_wav (6); +} + +GST_END_TEST; +#endif + +static Suite * +wavenc_suite (void) +{ + Suite *s = suite_create ("wavenc"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_encode_stereo); + /* FIXME: improve wavenc + tcase_add_test (tc_chain, test_encode_multichannel); + */ + + return s; +} + +GST_CHECK_MAIN (wavenc); diff --git a/tests/check/pipelines/wavpack.c b/tests/check/pipelines/wavpack.c new file mode 100644 index 0000000..6a166b2 --- /dev/null +++ b/tests/check/pipelines/wavpack.c @@ -0,0 +1,217 @@ +/* GStreamer + * Copyright (C) 2008 Sebastian Dröge + * + * 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 +#include + +static gboolean +bus_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + GMainLoop *loop = (GMainLoop *) data; + + switch (message->type) { + case GST_MESSAGE_EOS: + g_main_loop_quit (loop); + break; + case GST_MESSAGE_WARNING: + case GST_MESSAGE_ERROR:{ + GError *gerror; + gchar *debug; + + gst_message_parse_error (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + gst_message_unref (message); + g_error_free (gerror); + g_free (debug); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_ELEMENT: + { + const GstStructure *s = gst_message_get_structure (message); + + const gchar *name = gst_structure_get_name (s); + + fail_unless (strcmp (name, "imperfect-timestamp") != 0); + fail_unless (strcmp (name, "imperfect-offset") != 0); + break; + } + default: + break; + } + + return TRUE; +} + +static gboolean had_first_buffer = FALSE; + +static void +identity_handoff (GstElement * object, GstBuffer * buffer, gpointer user_data) +{ + GstAdapter *adapter = GST_ADAPTER (user_data); + + gst_adapter_push (adapter, gst_buffer_ref (buffer)); +} + +static void +fakesink_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad, + gpointer user_data) +{ + GstAdapter *adapter = GST_ADAPTER (user_data); + + /* Don't allow the second buffer with offset=0 as it's the decoded + * rewrite of the first + */ + if (had_first_buffer == FALSE && GST_BUFFER_OFFSET (buffer) == 0) + had_first_buffer = TRUE; + else if (GST_BUFFER_OFFSET (buffer) == 0) + return; + + gst_adapter_push (adapter, gst_buffer_ref (buffer)); +} + +GST_START_TEST (test_encode_decode) +{ + GstElement *pipeline; + GstElement *audiotestsrc, *identity1, *wavpackenc, *identity2, *wavpackdec, + *identity3, *fakesink; + GstAdapter *srcadapter, *sinkadapter; + GstBus *bus; + GMainLoop *loop; + GstBuffer *in, *out; + guint bus_watch = 0; + + srcadapter = gst_adapter_new (); + fail_unless (srcadapter != NULL); + sinkadapter = gst_adapter_new (); + fail_unless (sinkadapter != NULL); + + pipeline = gst_pipeline_new ("pipeline"); + fail_unless (pipeline != NULL); + + audiotestsrc = gst_element_factory_make ("audiotestsrc", "src"); + fail_unless (audiotestsrc != NULL); + g_object_set (G_OBJECT (audiotestsrc), "wave", 0, "freq", 440.0, + "num-buffers", 2000, NULL); + + identity1 = gst_element_factory_make ("identity", "identity1"); + fail_unless (identity1 != NULL); + g_object_set (G_OBJECT (identity1), "signal-handoffs", TRUE, NULL); + g_signal_connect (G_OBJECT (identity1), "handoff", + G_CALLBACK (identity_handoff), srcadapter); + + wavpackenc = gst_element_factory_make ("wavpackenc", "enc"); + fail_unless (wavpackenc != NULL); + + identity2 = gst_element_factory_make ("identity", "identity2"); + fail_unless (identity2 != NULL); + g_object_set (G_OBJECT (identity2), "check-imperfect-timestamp", TRUE, + "check-imperfect-offset", TRUE, NULL); + + wavpackdec = gst_element_factory_make ("wavpackdec", "dec"); + fail_unless (wavpackdec != NULL); + + identity3 = gst_element_factory_make ("identity", "identity3"); + fail_unless (identity3 != NULL); + g_object_set (G_OBJECT (identity3), "check-imperfect-timestamp", TRUE, + "check-imperfect-offset", TRUE, NULL); + + fakesink = gst_element_factory_make ("fakesink", "sink"); + fail_unless (fakesink != NULL); + g_object_set (G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL); + g_signal_connect (G_OBJECT (fakesink), "handoff", + G_CALLBACK (fakesink_handoff), sinkadapter); + + gst_bin_add_many (GST_BIN (pipeline), audiotestsrc, identity1, wavpackenc, + identity2, wavpackdec, identity3, fakesink, NULL); + + fail_unless (gst_element_link_many (audiotestsrc, identity1, wavpackenc, + identity2, wavpackdec, identity3, fakesink, NULL)); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (pipeline); + fail_unless (bus != NULL); + bus_watch = gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + had_first_buffer = FALSE; + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_main_loop_run (loop); + gst_element_set_state (pipeline, GST_STATE_NULL); + + fail_unless (had_first_buffer == TRUE); + fail_unless (gst_adapter_available (srcadapter) > 0); + fail_unless (gst_adapter_available (sinkadapter) > 0); + fail_unless_equals_int (gst_adapter_available (srcadapter), + gst_adapter_available (sinkadapter)); + + in = gst_adapter_take_buffer (srcadapter, gst_adapter_available (srcadapter)); + fail_unless (in != NULL); + out = + gst_adapter_take_buffer (sinkadapter, + gst_adapter_available (sinkadapter)); + fail_unless (out != NULL); + + fail_unless_equals_int (GST_BUFFER_SIZE (in), GST_BUFFER_SIZE (out)); + fail_unless (memcmp (GST_BUFFER_DATA (in), GST_BUFFER_DATA (out), + GST_BUFFER_SIZE (in)) == 0); + + gst_buffer_unref (in); + gst_buffer_unref (out); + g_object_unref (pipeline); + g_main_loop_unref (loop); + g_object_unref (srcadapter); + g_object_unref (sinkadapter); + g_source_remove (bus_watch); +} + +GST_END_TEST; + +static Suite * +wavpack_suite (void) +{ + Suite *s = suite_create ("Wavpack"); + TCase *tc_chain = tcase_create ("linear"); + + /* time out after 60s, not the default 3 */ + tcase_set_timeout (tc_chain, 60); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_encode_decode); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + Suite *s = wavpack_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/Makefile.am b/tests/examples/Makefile.am new file mode 100644 index 0000000..50a9725 --- /dev/null +++ b/tests/examples/Makefile.am @@ -0,0 +1,19 @@ +if USE_JACK +JACK_DIR=jack +else +JACK_DIR= +endif + +if USE_CAIRO_GOBJECT +CAIRO_DIR=cairo +else +CAIRO_DIR= +endif + +SUBDIRS = audiofx equalizer $(JACK_DIR) level pulse \ + rtp shapewipe spectrum v4l2 $(CAIRO_DIR) + +DIST_SUBDIRS = audiofx equalizer jack level pulse \ + rtp shapewipe spectrum v4l2 cairo + +include $(top_srcdir)/common/parallel-subdirs.mak diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in new file mode 100644 index 0000000..5f9ce74 --- /dev/null +++ b/tests/examples/Makefile.in @@ -0,0 +1,831 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# include this at the end of $MODULE/ext/Makefile.am to force make to +# build subdirectories in parallel when make -jN is used. We will end up +# descending into all subdirectories a second time, but only after the first +# (parallel) run has finished, so it should go right through the second time. +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/common/parallel-subdirs.mak +subdir = tests/examples +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@USE_JACK_FALSE@JACK_DIR = +@USE_JACK_TRUE@JACK_DIR = jack +@USE_CAIRO_GOBJECT_FALSE@CAIRO_DIR = +@USE_CAIRO_GOBJECT_TRUE@CAIRO_DIR = cairo +SUBDIRS = audiofx equalizer $(JACK_DIR) level pulse \ + rtp shapewipe spectrum v4l2 $(CAIRO_DIR) + +DIST_SUBDIRS = audiofx equalizer jack level pulse \ + rtp shapewipe spectrum v4l2 cairo + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/parallel-subdirs.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/common/parallel-subdirs.mak: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +.PHONY: independent-subdirs $(SUBDIRS) + +independent-subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@ + +all-recursive: independent-subdirs + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/audiofx/Makefile.am b/tests/examples/audiofx/Makefile.am new file mode 100644 index 0000000..efcf785 --- /dev/null +++ b/tests/examples/audiofx/Makefile.am @@ -0,0 +1,7 @@ +noinst_PROGRAMS = firfilter-example iirfilter-example + +firfilter_example_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) +firfilter_example_LDADD = $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstfft-@GST_MAJORMINOR@ $(LIBM) + +iirfilter_example_CFLAGS = $(GST_CFLAGS) +iirfilter_example_LDADD = $(GST_LIBS) $(LIBM) diff --git a/tests/examples/audiofx/Makefile.in b/tests/examples/audiofx/Makefile.in new file mode 100644 index 0000000..d55ae51 --- /dev/null +++ b/tests/examples/audiofx/Makefile.in @@ -0,0 +1,783 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = firfilter-example$(EXEEXT) \ + iirfilter-example$(EXEEXT) +subdir = tests/examples/audiofx +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +firfilter_example_SOURCES = firfilter-example.c +firfilter_example_OBJECTS = \ + firfilter_example-firfilter-example.$(OBJEXT) +am__DEPENDENCIES_1 = +firfilter_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +firfilter_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(firfilter_example_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +iirfilter_example_SOURCES = iirfilter-example.c +iirfilter_example_OBJECTS = \ + iirfilter_example-iirfilter-example.$(OBJEXT) +iirfilter_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +iirfilter_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(iirfilter_example_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = firfilter-example.c iirfilter-example.c +DIST_SOURCES = firfilter-example.c iirfilter-example.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +firfilter_example_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) +firfilter_example_LDADD = $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstfft-@GST_MAJORMINOR@ $(LIBM) +iirfilter_example_CFLAGS = $(GST_CFLAGS) +iirfilter_example_LDADD = $(GST_LIBS) $(LIBM) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/audiofx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/audiofx/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +firfilter-example$(EXEEXT): $(firfilter_example_OBJECTS) $(firfilter_example_DEPENDENCIES) $(EXTRA_firfilter_example_DEPENDENCIES) + @rm -f firfilter-example$(EXEEXT) + $(AM_V_CCLD)$(firfilter_example_LINK) $(firfilter_example_OBJECTS) $(firfilter_example_LDADD) $(LIBS) +iirfilter-example$(EXEEXT): $(iirfilter_example_OBJECTS) $(iirfilter_example_DEPENDENCIES) $(EXTRA_iirfilter_example_DEPENDENCIES) + @rm -f iirfilter-example$(EXEEXT) + $(AM_V_CCLD)$(iirfilter_example_LINK) $(iirfilter_example_OBJECTS) $(iirfilter_example_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/firfilter_example-firfilter-example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iirfilter_example-iirfilter-example.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +firfilter_example-firfilter-example.o: firfilter-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(firfilter_example_CFLAGS) $(CFLAGS) -MT firfilter_example-firfilter-example.o -MD -MP -MF $(DEPDIR)/firfilter_example-firfilter-example.Tpo -c -o firfilter_example-firfilter-example.o `test -f 'firfilter-example.c' || echo '$(srcdir)/'`firfilter-example.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/firfilter_example-firfilter-example.Tpo $(DEPDIR)/firfilter_example-firfilter-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='firfilter-example.c' object='firfilter_example-firfilter-example.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(firfilter_example_CFLAGS) $(CFLAGS) -c -o firfilter_example-firfilter-example.o `test -f 'firfilter-example.c' || echo '$(srcdir)/'`firfilter-example.c + +firfilter_example-firfilter-example.obj: firfilter-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(firfilter_example_CFLAGS) $(CFLAGS) -MT firfilter_example-firfilter-example.obj -MD -MP -MF $(DEPDIR)/firfilter_example-firfilter-example.Tpo -c -o firfilter_example-firfilter-example.obj `if test -f 'firfilter-example.c'; then $(CYGPATH_W) 'firfilter-example.c'; else $(CYGPATH_W) '$(srcdir)/firfilter-example.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/firfilter_example-firfilter-example.Tpo $(DEPDIR)/firfilter_example-firfilter-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='firfilter-example.c' object='firfilter_example-firfilter-example.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(firfilter_example_CFLAGS) $(CFLAGS) -c -o firfilter_example-firfilter-example.obj `if test -f 'firfilter-example.c'; then $(CYGPATH_W) 'firfilter-example.c'; else $(CYGPATH_W) '$(srcdir)/firfilter-example.c'; fi` + +iirfilter_example-iirfilter-example.o: iirfilter-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iirfilter_example_CFLAGS) $(CFLAGS) -MT iirfilter_example-iirfilter-example.o -MD -MP -MF $(DEPDIR)/iirfilter_example-iirfilter-example.Tpo -c -o iirfilter_example-iirfilter-example.o `test -f 'iirfilter-example.c' || echo '$(srcdir)/'`iirfilter-example.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iirfilter_example-iirfilter-example.Tpo $(DEPDIR)/iirfilter_example-iirfilter-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iirfilter-example.c' object='iirfilter_example-iirfilter-example.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iirfilter_example_CFLAGS) $(CFLAGS) -c -o iirfilter_example-iirfilter-example.o `test -f 'iirfilter-example.c' || echo '$(srcdir)/'`iirfilter-example.c + +iirfilter_example-iirfilter-example.obj: iirfilter-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iirfilter_example_CFLAGS) $(CFLAGS) -MT iirfilter_example-iirfilter-example.obj -MD -MP -MF $(DEPDIR)/iirfilter_example-iirfilter-example.Tpo -c -o iirfilter_example-iirfilter-example.obj `if test -f 'iirfilter-example.c'; then $(CYGPATH_W) 'iirfilter-example.c'; else $(CYGPATH_W) '$(srcdir)/iirfilter-example.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iirfilter_example-iirfilter-example.Tpo $(DEPDIR)/iirfilter_example-iirfilter-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iirfilter-example.c' object='iirfilter_example-iirfilter-example.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iirfilter_example_CFLAGS) $(CFLAGS) -c -o iirfilter_example-iirfilter-example.obj `if test -f 'iirfilter-example.c'; then $(CYGPATH_W) 'iirfilter-example.c'; else $(CYGPATH_W) '$(srcdir)/iirfilter-example.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/audiofx/firfilter-example.c b/tests/examples/audiofx/firfilter-example.c new file mode 100644 index 0000000..b344e74 --- /dev/null +++ b/tests/examples/audiofx/firfilter-example.c @@ -0,0 +1,161 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Droege + * + * 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 small sample application creates a bandpass FIR filter + * by transforming the frequency response to the filter kernel. + */ + +#include +#include + +#include +#include + +static gboolean +on_message (GstBus * bus, GstMessage * message, gpointer user_data) +{ + GMainLoop *loop = (GMainLoop *) user_data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR: + g_error ("Got ERROR"); + g_main_loop_quit (loop); + break; + case GST_MESSAGE_WARNING: + g_warning ("Got WARNING"); + g_main_loop_quit (loop); + break; + case GST_MESSAGE_EOS: + g_main_loop_quit (loop); + break; + default: + break; + } + + return TRUE; +} + +static void +on_rate_changed (GstElement * element, gint rate, gpointer user_data) +{ + GValueArray *va; + GValue v = { 0, }; + GstFFTF64 *fft; + GstFFTF64Complex frequency_response[17]; + gdouble tmp[32]; + gdouble filter_kernel[32]; + guint i; + + /* Create the frequency response: zero outside + * a small frequency band */ + for (i = 0; i < 17; i++) { + if (i < 5 || i > 11) + frequency_response[i].r = 0.0; + else + frequency_response[i].r = 1.0; + + frequency_response[i].i = 0.0; + } + + /* Calculate the inverse FT of the frequency response */ + fft = gst_fft_f64_new (32, TRUE); + gst_fft_f64_inverse_fft (fft, frequency_response, tmp); + gst_fft_f64_free (fft); + + /* Shift the inverse FT of the frequency response by 16, + * i.e. the half of the kernel length to get the + * impulse response. See http://www.dspguide.com/ch17/1.htm + * for more information. + */ + for (i = 0; i < 32; i++) + filter_kernel[i] = tmp[(i + 16) % 32]; + + /* Apply the hamming window to the impulse response to get + * a better result than given from the rectangular window + */ + for (i = 0; i < 32; i++) + filter_kernel[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / 32)); + + va = g_value_array_new (1); + + g_value_init (&v, G_TYPE_DOUBLE); + for (i = 0; i < 32; i++) { + g_value_set_double (&v, filter_kernel[i]); + g_value_array_append (va, &v); + g_value_reset (&v); + } + g_object_set (G_OBJECT (element), "kernel", va, NULL); + /* Latency is 1/2 of the kernel length for this method of + * calculating a filter kernel from the frequency response + */ + g_object_set (G_OBJECT (element), "latency", (gint64) (32 / 2), NULL); + g_value_array_free (va); +} + +gint +main (gint argc, gchar * argv[]) +{ + GstElement *pipeline, *src, *filter, *conv, *sink; + GstBus *bus; + GMainLoop *loop; + + gst_init (NULL, NULL); + + pipeline = gst_element_factory_make ("pipeline", NULL); + + src = gst_element_factory_make ("audiotestsrc", NULL); + g_object_set (G_OBJECT (src), "wave", 5, NULL); + + filter = gst_element_factory_make ("audiofirfilter", NULL); + g_signal_connect (G_OBJECT (filter), "rate-changed", + G_CALLBACK (on_rate_changed), NULL); + + conv = gst_element_factory_make ("audioconvert", NULL); + + sink = gst_element_factory_make ("autoaudiosink", NULL); + g_return_val_if_fail (sink != NULL, -1); + + gst_bin_add_many (GST_BIN (pipeline), src, filter, conv, sink, NULL); + if (!gst_element_link_many (src, filter, conv, sink, NULL)) { + g_error ("Failed to link elements"); + return -2; + } + + loop = g_main_loop_new (NULL, FALSE); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); + gst_object_unref (GST_OBJECT (bus)); + + if (gst_element_set_state (pipeline, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { + g_error ("Failed to go into PLAYING state"); + return -3; + } + + g_main_loop_run (loop); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + g_main_loop_unref (loop); + gst_object_unref (pipeline); + + return 0; +} diff --git a/tests/examples/audiofx/iirfilter-example.c b/tests/examples/audiofx/iirfilter-example.c new file mode 100644 index 0000000..7fac2ac --- /dev/null +++ b/tests/examples/audiofx/iirfilter-example.c @@ -0,0 +1,137 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Droege + * + * 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 small sample application creates a lowpass IIR filter + * and applies it to white noise. + * See http://www.dspguide.com/ch19/2.htm for a description + * of the IIR filter that is used. + */ + +#include +#include + +#include + +/* Cutoff of 4000 Hz */ +#define CUTOFF (4000.0) + +static gboolean +on_message (GstBus * bus, GstMessage * message, gpointer user_data) +{ + GMainLoop *loop = (GMainLoop *) user_data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR: + g_error ("Got ERROR"); + g_main_loop_quit (loop); + break; + case GST_MESSAGE_WARNING: + g_warning ("Got WARNING"); + g_main_loop_quit (loop); + break; + case GST_MESSAGE_EOS: + g_main_loop_quit (loop); + break; + default: + break; + } + + return TRUE; +} + +static void +on_rate_changed (GstElement * element, gint rate, gpointer user_data) +{ + GValueArray *va; + GValue v = { 0, }; + gdouble x; + + if (rate / 2.0 > CUTOFF) + x = exp (-2.0 * G_PI * (CUTOFF / rate)); + else + x = 0.0; + + va = g_value_array_new (1); + + g_value_init (&v, G_TYPE_DOUBLE); + g_value_set_double (&v, 1.0 - x); + g_value_array_append (va, &v); + g_value_reset (&v); + g_object_set (G_OBJECT (element), "a", va, NULL); + g_value_array_free (va); + + va = g_value_array_new (1); + g_value_set_double (&v, x); + g_value_array_append (va, &v); + g_value_reset (&v); + g_object_set (G_OBJECT (element), "b", va, NULL); + g_value_array_free (va); +} + +gint +main (gint argc, gchar * argv[]) +{ + GstElement *pipeline, *src, *filter, *conv, *sink; + GstBus *bus; + GMainLoop *loop; + + gst_init (NULL, NULL); + + pipeline = gst_element_factory_make ("pipeline", NULL); + + src = gst_element_factory_make ("audiotestsrc", NULL); + g_object_set (G_OBJECT (src), "wave", 5, NULL); + + filter = gst_element_factory_make ("audioiirfilter", NULL); + g_signal_connect (G_OBJECT (filter), "rate-changed", + G_CALLBACK (on_rate_changed), NULL); + + conv = gst_element_factory_make ("audioconvert", NULL); + + sink = gst_element_factory_make ("autoaudiosink", NULL); + g_return_val_if_fail (sink != NULL, -1); + + gst_bin_add_many (GST_BIN (pipeline), src, filter, conv, sink, NULL); + if (!gst_element_link_many (src, filter, conv, sink, NULL)) { + g_error ("Failed to link elements"); + return -2; + } + + loop = g_main_loop_new (NULL, FALSE); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); + gst_object_unref (GST_OBJECT (bus)); + + if (gst_element_set_state (pipeline, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { + g_error ("Failed to go into PLAYING state"); + return -3; + } + + g_main_loop_run (loop); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + g_main_loop_unref (loop); + gst_object_unref (pipeline); + + return 0; +} diff --git a/tests/examples/cairo/Makefile.am b/tests/examples/cairo/Makefile.am new file mode 100644 index 0000000..3a5eb58 --- /dev/null +++ b/tests/examples/cairo/Makefile.am @@ -0,0 +1,7 @@ +if USE_CAIRO_GOBJECT +noinst_PROGRAMS = cairo_overlay +endif + +cairo_overlay_SOURCES = cairo_overlay.c +cairo_overlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(CAIRO_CFLAGS) +cairo_overlay_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_LIBS) $(CAIRO_LIBS) diff --git a/tests/examples/cairo/Makefile.in b/tests/examples/cairo/Makefile.in new file mode 100644 index 0000000..aad215c --- /dev/null +++ b/tests/examples/cairo/Makefile.in @@ -0,0 +1,752 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@USE_CAIRO_GOBJECT_TRUE@noinst_PROGRAMS = cairo_overlay$(EXEEXT) +subdir = tests/examples/cairo +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_cairo_overlay_OBJECTS = cairo_overlay-cairo_overlay.$(OBJEXT) +cairo_overlay_OBJECTS = $(am_cairo_overlay_OBJECTS) +am__DEPENDENCIES_1 = +cairo_overlay_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +cairo_overlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(cairo_overlay_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(cairo_overlay_SOURCES) +DIST_SOURCES = $(cairo_overlay_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +cairo_overlay_SOURCES = cairo_overlay.c +cairo_overlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(CAIRO_CFLAGS) +cairo_overlay_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_LIBS) $(CAIRO_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/cairo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/cairo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +cairo_overlay$(EXEEXT): $(cairo_overlay_OBJECTS) $(cairo_overlay_DEPENDENCIES) $(EXTRA_cairo_overlay_DEPENDENCIES) + @rm -f cairo_overlay$(EXEEXT) + $(AM_V_CCLD)$(cairo_overlay_LINK) $(cairo_overlay_OBJECTS) $(cairo_overlay_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_overlay-cairo_overlay.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +cairo_overlay-cairo_overlay.o: cairo_overlay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_overlay_CFLAGS) $(CFLAGS) -MT cairo_overlay-cairo_overlay.o -MD -MP -MF $(DEPDIR)/cairo_overlay-cairo_overlay.Tpo -c -o cairo_overlay-cairo_overlay.o `test -f 'cairo_overlay.c' || echo '$(srcdir)/'`cairo_overlay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_overlay-cairo_overlay.Tpo $(DEPDIR)/cairo_overlay-cairo_overlay.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo_overlay.c' object='cairo_overlay-cairo_overlay.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_overlay_CFLAGS) $(CFLAGS) -c -o cairo_overlay-cairo_overlay.o `test -f 'cairo_overlay.c' || echo '$(srcdir)/'`cairo_overlay.c + +cairo_overlay-cairo_overlay.obj: cairo_overlay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_overlay_CFLAGS) $(CFLAGS) -MT cairo_overlay-cairo_overlay.obj -MD -MP -MF $(DEPDIR)/cairo_overlay-cairo_overlay.Tpo -c -o cairo_overlay-cairo_overlay.obj `if test -f 'cairo_overlay.c'; then $(CYGPATH_W) 'cairo_overlay.c'; else $(CYGPATH_W) '$(srcdir)/cairo_overlay.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_overlay-cairo_overlay.Tpo $(DEPDIR)/cairo_overlay-cairo_overlay.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo_overlay.c' object='cairo_overlay-cairo_overlay.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_overlay_CFLAGS) $(CFLAGS) -c -o cairo_overlay-cairo_overlay.obj `if test -f 'cairo_overlay.c'; then $(CYGPATH_W) 'cairo_overlay.c'; else $(CYGPATH_W) '$(srcdir)/cairo_overlay.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/cairo/cairo_overlay.c b/tests/examples/cairo/cairo_overlay.c new file mode 100644 index 0000000..cae4c13 --- /dev/null +++ b/tests/examples/cairo/cairo_overlay.c @@ -0,0 +1,172 @@ +/* GStreamer + * Copyright (C) 2011 Jon Nordby + * + * 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. + */ + +/* + * Example showing usage of the cairooverlay element + */ + +#include +#include + +#include +#include + +#include + + +static gboolean +on_message (GstBus * bus, GstMessage * message, gpointer user_data) +{ + GMainLoop *loop = (GMainLoop *) user_data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR:{ + GError *err = NULL; + gchar *debug; + + gst_message_parse_error (message, &err, &debug); + g_critical ("Got ERROR: %s (%s)", err->message, GST_STR_NULL (debug)); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_WARNING:{ + GError *err = NULL; + gchar *debug; + + gst_message_parse_warning (message, &err, &debug); + g_warning ("Got WARNING: %s (%s)", err->message, GST_STR_NULL (debug)); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_EOS: + g_main_loop_quit (loop); + break; + default: + break; + } + + return TRUE; +} + +/* Datastructure to share the state we are interested in between + * prepare and render function. */ +typedef struct +{ + gboolean valid; + int width; + int height; +} CairoOverlayState; + +/* Store the information from the caps that we are interested in. */ +static void +prepare_overlay (GstElement * overlay, GstCaps * caps, gpointer user_data) +{ + CairoOverlayState *state = (CairoOverlayState *) user_data; + + gst_video_format_parse_caps (caps, NULL, &state->width, &state->height); + state->valid = TRUE; +} + +/* Draw the overlay. + * This function draws a cute "beating" heart. */ +static void +draw_overlay (GstElement * overlay, cairo_t * cr, guint64 timestamp, + guint64 duration, gpointer user_data) +{ + CairoOverlayState *s = (CairoOverlayState *) user_data; + double scale; + + if (!s->valid) + return; + + scale = 2 * (((timestamp / (int) 1e7) % 70) + 30) / 100.0; + cairo_translate (cr, s->width / 2, (s->height / 2) - 30); + cairo_scale (cr, scale, scale); + + cairo_move_to (cr, 0, 0); + cairo_curve_to (cr, 0, -30, -50, -30, -50, 0); + cairo_curve_to (cr, -50, 30, 0, 35, 0, 60); + cairo_curve_to (cr, 0, 35, 50, 30, 50, 0); + cairo_curve_to (cr, 50, -30, 0, -30, 0, 0); + cairo_set_source_rgba (cr, 0.9, 0.0, 0.1, 0.7); + cairo_fill (cr); +} + +static GstElement * +setup_gst_pipeline (CairoOverlayState * overlay_state) +{ + GstElement *pipeline; + GstElement *cairo_overlay; + GstElement *source, *adaptor1, *adaptor2, *sink; + + pipeline = gst_pipeline_new ("cairo-overlay-example"); + + /* Adaptors needed because cairooverlay only supports ARGB data */ + source = gst_element_factory_make ("videotestsrc", "source"); + adaptor1 = gst_element_factory_make ("ffmpegcolorspace", "adaptor1"); + cairo_overlay = gst_element_factory_make ("cairooverlay", "overlay"); + adaptor2 = gst_element_factory_make ("ffmpegcolorspace", "adaptor2"); + sink = gst_element_factory_make ("autovideosink", "sink"); + + /* If failing, the element could not be created */ + g_assert (cairo_overlay); + + /* Hook up the neccesary signals for cairooverlay */ + g_signal_connect (cairo_overlay, "draw", + G_CALLBACK (draw_overlay), overlay_state); + g_signal_connect (cairo_overlay, "caps-changed", + G_CALLBACK (prepare_overlay), overlay_state); + + gst_bin_add_many (GST_BIN (pipeline), source, adaptor1, + cairo_overlay, adaptor2, sink, NULL); + + if (!gst_element_link_many (source, adaptor1, + cairo_overlay, adaptor2, sink, NULL)) { + g_warning ("Failed to link elements!"); + } + + return pipeline; +} + +int +main (int argc, char **argv) +{ + GMainLoop *loop; + GstElement *pipeline; + GstBus *bus; + CairoOverlayState overlay_state = { FALSE, 0, 0 }; + + gst_init (&argc, &argv); + loop = g_main_loop_new (NULL, FALSE); + + pipeline = setup_gst_pipeline (&overlay_state); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); + gst_object_unref (GST_OBJECT (bus)); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_main_loop_run (loop); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; +} diff --git a/tests/examples/equalizer/Makefile.am b/tests/examples/equalizer/Makefile.am new file mode 100644 index 0000000..07f2b25 --- /dev/null +++ b/tests/examples/equalizer/Makefile.am @@ -0,0 +1,8 @@ +if HAVE_GTK +noinst_PROGRAMS = demo +endif + +demo_SOURCES = demo.c +demo_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) +demo_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) + diff --git a/tests/examples/equalizer/Makefile.in b/tests/examples/equalizer/Makefile.in new file mode 100644 index 0000000..de371a2 --- /dev/null +++ b/tests/examples/equalizer/Makefile.in @@ -0,0 +1,752 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HAVE_GTK_TRUE@noinst_PROGRAMS = demo$(EXEEXT) +subdir = tests/examples/equalizer +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_demo_OBJECTS = demo-demo.$(OBJEXT) +demo_OBJECTS = $(am_demo_OBJECTS) +am__DEPENDENCIES_1 = +demo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +demo_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(demo_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(demo_SOURCES) +DIST_SOURCES = $(demo_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +demo_SOURCES = demo.c +demo_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) +demo_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/equalizer/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/equalizer/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +demo$(EXEEXT): $(demo_OBJECTS) $(demo_DEPENDENCIES) $(EXTRA_demo_DEPENDENCIES) + @rm -f demo$(EXEEXT) + $(AM_V_CCLD)$(demo_LINK) $(demo_OBJECTS) $(demo_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo-demo.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +demo-demo.o: demo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -MT demo-demo.o -MD -MP -MF $(DEPDIR)/demo-demo.Tpo -c -o demo-demo.o `test -f 'demo.c' || echo '$(srcdir)/'`demo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo-demo.Tpo $(DEPDIR)/demo-demo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo.c' object='demo-demo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -c -o demo-demo.o `test -f 'demo.c' || echo '$(srcdir)/'`demo.c + +demo-demo.obj: demo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -MT demo-demo.obj -MD -MP -MF $(DEPDIR)/demo-demo.Tpo -c -o demo-demo.obj `if test -f 'demo.c'; then $(CYGPATH_W) 'demo.c'; else $(CYGPATH_W) '$(srcdir)/demo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo-demo.Tpo $(DEPDIR)/demo-demo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo.c' object='demo-demo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -c -o demo-demo.obj `if test -f 'demo.c'; then $(CYGPATH_W) 'demo.c'; else $(CYGPATH_W) '$(srcdir)/demo.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/equalizer/demo.c b/tests/examples/equalizer/demo.c new file mode 100644 index 0000000..a446f2a --- /dev/null +++ b/tests/examples/equalizer/demo.c @@ -0,0 +1,254 @@ +#include +#include +#include +#include +#include + +#define NBANDS 10 + +static GtkWidget *drawingarea = NULL; +static guint spect_height = 128; +static guint spect_bands = 256; +static gfloat height_scale = 2.0; + +static void +on_window_destroy (GObject * object, gpointer user_data) +{ + drawingarea = NULL; + gtk_main_quit (); +} + +static gboolean +on_configure_event (GtkWidget * widget, GdkEventConfigure * event, + gpointer user_data) +{ + GstElement *spectrum = GST_ELEMENT (user_data); + + /*GST_INFO ("%d x %d", event->width, event->height); */ + spect_height = event->height; + height_scale = event->height / 64.0; + spect_bands = event->width; + + g_object_set (G_OBJECT (spectrum), "bands", spect_bands, NULL); + return FALSE; +} + +/* control gains */ +static void +on_gain_changed (GtkRange * range, gpointer user_data) +{ + GstObject *band = GST_OBJECT (user_data); + gdouble value = gtk_range_get_value (range); + + g_object_set (band, "gain", value, NULL); +} + +/* control bandwidths */ +static void +on_bandwidth_changed (GtkRange * range, gpointer user_data) +{ + GstObject *band = GST_OBJECT (user_data); + gdouble value = gtk_range_get_value (range); + + g_object_set (band, "bandwidth", value, NULL); +} + +/* control frequency */ +static void +on_freq_changed (GtkRange * range, gpointer user_data) +{ + GstObject *band = GST_OBJECT (user_data); + gdouble value = gtk_range_get_value (range); + + /* hbox */ + GtkWidget *parent = gtk_widget_get_parent (GTK_WIDGET (range)); + + /* frame */ + GtkWidget *parent_parent = gtk_widget_get_parent (parent); + gchar *label = g_strdup_printf ("%d Hz", (int) (value + 0.5)); + + gtk_frame_set_label (GTK_FRAME (parent_parent), label); + g_free (label); + + g_object_set (band, "freq", value, NULL); +} + +/* draw frequency spectrum as a bunch of bars */ +static void +draw_spectrum (gfloat * data) +{ + gint i; + GdkRectangle rect = { 0, 0, spect_bands, spect_height }; + cairo_t *cr; + + if (!drawingarea) + return; + + gdk_window_begin_paint_rect (gtk_widget_get_window (drawingarea), &rect); + cr = gdk_cairo_create (gtk_widget_get_window (drawingarea)); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_rectangle (cr, 0, 0, spect_bands, spect_height); + cairo_fill (cr); + for (i = 0; i < spect_bands; i++) { + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, i, -data[i], 1, spect_height + data[i]); + cairo_fill (cr); + } + cairo_destroy (cr); + + gdk_window_end_paint (gtk_widget_get_window (drawingarea)); +} + +/* receive spectral data from element message */ +static gboolean +message_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + if (message->type == GST_MESSAGE_ELEMENT) { + const GstStructure *s = gst_message_get_structure (message); + const gchar *name = gst_structure_get_name (s); + + if (strcmp (name, "spectrum") == 0) { + gfloat *spect = g_new (gfloat, spect_bands); + const GValue *list; + const GValue *value; + guint i; + + list = gst_structure_get_value (s, "magnitude"); + for (i = 0; i < spect_bands; ++i) { + value = gst_value_list_get_value (list, i); + spect[i] = height_scale * g_value_get_float (value); + } + draw_spectrum (spect); + g_free (spect); + } + } + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + GstElement *bin; + GstElement *src, *capsfilter, *equalizer, *spectrum, *audioconvert, *sink; + GstCaps *caps; + GstBus *bus; + GtkWidget *appwindow, *vbox, *hbox, *widget; + int i; + + gst_init (&argc, &argv); + gtk_init (&argc, &argv); + + bin = gst_pipeline_new ("bin"); + + /* White noise */ + src = gst_element_factory_make ("audiotestsrc", "src"); + g_object_set (G_OBJECT (src), "wave", 5, "volume", 0.8, NULL); + + /* Force float32 samples */ + capsfilter = gst_element_factory_make ("capsfilter", "capsfilter"); + caps = + gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, NULL); + g_object_set (capsfilter, "caps", caps, NULL); + + equalizer = gst_element_factory_make ("equalizer-nbands", "equalizer"); + g_object_set (G_OBJECT (equalizer), "num-bands", NBANDS, NULL); + + spectrum = gst_element_factory_make ("spectrum", "spectrum"); + g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, + "message", TRUE, "interval", 500 * GST_MSECOND, NULL); + + audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); + + sink = gst_element_factory_make ("autoaudiosink", "sink"); + + gst_bin_add_many (GST_BIN (bin), src, capsfilter, equalizer, spectrum, + audioconvert, sink, NULL); + if (!gst_element_link_many (src, capsfilter, equalizer, spectrum, + audioconvert, sink, NULL)) { + fprintf (stderr, "can't link elements\n"); + exit (1); + } + + bus = gst_element_get_bus (bin); + gst_bus_add_watch (bus, message_handler, NULL); + gst_object_unref (bus); + + appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (G_OBJECT (appwindow), "destroy", + G_CALLBACK (on_window_destroy), NULL); + vbox = gtk_vbox_new (FALSE, 6); + + drawingarea = gtk_drawing_area_new (); + gtk_widget_set_size_request (drawingarea, spect_bands, spect_height); + g_signal_connect (G_OBJECT (drawingarea), "configure-event", + G_CALLBACK (on_configure_event), (gpointer) spectrum); + gtk_box_pack_start (GTK_BOX (vbox), drawingarea, TRUE, TRUE, 0); + + hbox = gtk_hbox_new (FALSE, 20); + + for (i = 0; i < NBANDS; i++) { + GstObject *band; + gdouble freq; + gdouble bw; + gdouble gain; + gchar *label; + GtkWidget *frame, *scales_hbox; + + band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); + g_assert (band != NULL); + g_object_get (G_OBJECT (band), "freq", &freq, NULL); + g_object_get (G_OBJECT (band), "bandwidth", &bw, NULL); + g_object_get (G_OBJECT (band), "gain", &gain, NULL); + + label = g_strdup_printf ("%d Hz", (int) (freq + 0.5)); + frame = gtk_frame_new (label); + g_free (label); + + scales_hbox = gtk_hbox_new (FALSE, 6); + + widget = gtk_vscale_new_with_range (-24.0, 12.0, 0.5); + gtk_scale_set_draw_value (GTK_SCALE (widget), TRUE); + gtk_scale_set_value_pos (GTK_SCALE (widget), GTK_POS_TOP); + gtk_range_set_value (GTK_RANGE (widget), gain); + gtk_widget_set_size_request (widget, 25, 150); + g_signal_connect (G_OBJECT (widget), "value-changed", + G_CALLBACK (on_gain_changed), (gpointer) band); + gtk_box_pack_start (GTK_BOX (scales_hbox), widget, FALSE, FALSE, 0); + + widget = gtk_vscale_new_with_range (0.0, 20000.0, 5.0); + gtk_scale_set_draw_value (GTK_SCALE (widget), TRUE); + gtk_scale_set_value_pos (GTK_SCALE (widget), GTK_POS_TOP); + gtk_range_set_value (GTK_RANGE (widget), bw); + gtk_widget_set_size_request (widget, 25, 150); + g_signal_connect (G_OBJECT (widget), "value-changed", + G_CALLBACK (on_bandwidth_changed), (gpointer) band); + gtk_box_pack_start (GTK_BOX (scales_hbox), widget, TRUE, TRUE, 0); + + widget = gtk_vscale_new_with_range (20.0, 20000.0, 5.0); + gtk_scale_set_draw_value (GTK_SCALE (widget), TRUE); + gtk_scale_set_value_pos (GTK_SCALE (widget), GTK_POS_TOP); + gtk_range_set_value (GTK_RANGE (widget), freq); + gtk_widget_set_size_request (widget, 25, 150); + g_signal_connect (G_OBJECT (widget), "value-changed", + G_CALLBACK (on_freq_changed), (gpointer) band); + gtk_box_pack_start (GTK_BOX (scales_hbox), widget, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (frame), scales_hbox); + + gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + } + + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (appwindow), vbox); + gtk_widget_show_all (appwindow); + + gst_element_set_state (bin, GST_STATE_PLAYING); + gtk_main (); + gst_element_set_state (bin, GST_STATE_NULL); + + gst_object_unref (bin); + + return 0; +} diff --git a/tests/examples/jack/Makefile.am b/tests/examples/jack/Makefile.am new file mode 100644 index 0000000..ad61cbd --- /dev/null +++ b/tests/examples/jack/Makefile.am @@ -0,0 +1,12 @@ +if HAVE_GTK +GTK_EXAMPLES=jack_client +else +GTK_EXAMPLES= +endif + +noinst_PROGRAMS = $(GTK_EXAMPLES) + +jack_client_SOURCES = jack_client.c +jack_client_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) $(JACK_CFLAGS) +jack_client_LDFLAGS = $(GST_LIBS) $(GTK_LIBS) $(JACK_LIBS) + diff --git a/tests/examples/jack/Makefile.in b/tests/examples/jack/Makefile.in new file mode 100644 index 0000000..bf112c0 --- /dev/null +++ b/tests/examples/jack/Makefile.in @@ -0,0 +1,753 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = $(am__EXEEXT_1) +subdir = tests/examples/jack +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@HAVE_GTK_TRUE@am__EXEEXT_1 = jack_client$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +am_jack_client_OBJECTS = jack_client-jack_client.$(OBJEXT) +jack_client_OBJECTS = $(am_jack_client_OBJECTS) +jack_client_LDADD = $(LDADD) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +jack_client_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(jack_client_CFLAGS) \ + $(CFLAGS) $(jack_client_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(jack_client_SOURCES) +DIST_SOURCES = $(jack_client_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@HAVE_GTK_FALSE@GTK_EXAMPLES = +@HAVE_GTK_TRUE@GTK_EXAMPLES = jack_client +jack_client_SOURCES = jack_client.c +jack_client_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) $(JACK_CFLAGS) +jack_client_LDFLAGS = $(GST_LIBS) $(GTK_LIBS) $(JACK_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/jack/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/jack/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +jack_client$(EXEEXT): $(jack_client_OBJECTS) $(jack_client_DEPENDENCIES) $(EXTRA_jack_client_DEPENDENCIES) + @rm -f jack_client$(EXEEXT) + $(AM_V_CCLD)$(jack_client_LINK) $(jack_client_OBJECTS) $(jack_client_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jack_client-jack_client.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +jack_client-jack_client.o: jack_client.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jack_client_CFLAGS) $(CFLAGS) -MT jack_client-jack_client.o -MD -MP -MF $(DEPDIR)/jack_client-jack_client.Tpo -c -o jack_client-jack_client.o `test -f 'jack_client.c' || echo '$(srcdir)/'`jack_client.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/jack_client-jack_client.Tpo $(DEPDIR)/jack_client-jack_client.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jack_client.c' object='jack_client-jack_client.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jack_client_CFLAGS) $(CFLAGS) -c -o jack_client-jack_client.o `test -f 'jack_client.c' || echo '$(srcdir)/'`jack_client.c + +jack_client-jack_client.obj: jack_client.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jack_client_CFLAGS) $(CFLAGS) -MT jack_client-jack_client.obj -MD -MP -MF $(DEPDIR)/jack_client-jack_client.Tpo -c -o jack_client-jack_client.obj `if test -f 'jack_client.c'; then $(CYGPATH_W) 'jack_client.c'; else $(CYGPATH_W) '$(srcdir)/jack_client.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/jack_client-jack_client.Tpo $(DEPDIR)/jack_client-jack_client.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jack_client.c' object='jack_client-jack_client.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jack_client_CFLAGS) $(CFLAGS) -c -o jack_client-jack_client.obj `if test -f 'jack_client.c'; then $(CYGPATH_W) 'jack_client.c'; else $(CYGPATH_W) '$(srcdir)/jack_client.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/jack/jack_client.c b/tests/examples/jack/jack_client.c new file mode 100644 index 0000000..99599ab --- /dev/null +++ b/tests/examples/jack/jack_client.c @@ -0,0 +1,79 @@ +/* This app demonstrates the creation and use of a jack client in conjunction + * with the jack plugins. This way, an application can control the jack client + * directly. + */ + +#include +#include +#include + +static gboolean +quit_cb (gpointer data) +{ + gtk_main_quit (); + return FALSE; +} + +int +main (int argc, char **argv) +{ + jack_client_t *src_client, *sink_client; + jack_status_t status; + GstElement *pipeline, *src, *sink; + GstStateChangeReturn ret; + + gst_init (&argc, &argv); + + /* create jack clients */ + src_client = jack_client_open ("src_client", JackNoStartServer, &status); + if (src_client == NULL) { + if (status & JackServerFailed) + g_print ("JACK server not running\n"); + else + g_print ("jack_client_open() failed, status = 0x%2.0x\n", status); + return 1; + } + + sink_client = jack_client_open ("sink_client", JackNoStartServer, &status); + if (sink_client == NULL) { + if (status & JackServerFailed) + g_print ("JACK server not running\n"); + else + g_print ("jack_client_open() failed, status = 0x%2.0x\n", status); + return 1; + } + + /* create gst elements */ + pipeline = gst_pipeline_new ("my_pipeline"); + + src = gst_element_factory_make ("jackaudiosrc", NULL); + sink = gst_element_factory_make ("jackaudiosink", NULL); + + g_object_set (src, "client", src_client, NULL); + g_object_set (sink, "client", sink_client, NULL); + + gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL); + + /* link everything together */ + if (!gst_element_link (src, sink)) { + g_print ("Failed to link elements!\n"); + return 1; + } + + /* run */ + ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) { + g_print ("Failed to start up pipeline!\n"); + return 1; + } + + /* quit after 5 seconds */ + g_timeout_add (5000, (GSourceFunc) quit_cb, NULL); + gtk_main (); + + /* clean up */ + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; +} diff --git a/tests/examples/level/Makefile.am b/tests/examples/level/Makefile.am new file mode 100644 index 0000000..67ca719 --- /dev/null +++ b/tests/examples/level/Makefile.am @@ -0,0 +1,4 @@ +noinst_PROGRAMS = level-example +level_example_CFLAGS = $(GST_CFLAGS) +level_example_LDADD = $(GST_LIBS) $(LIBM) + diff --git a/tests/examples/level/Makefile.in b/tests/examples/level/Makefile.in new file mode 100644 index 0000000..3ec0a10 --- /dev/null +++ b/tests/examples/level/Makefile.in @@ -0,0 +1,751 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = level-example$(EXEEXT) +subdir = tests/examples/level +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +level_example_SOURCES = level-example.c +level_example_OBJECTS = level_example-level-example.$(OBJEXT) +am__DEPENDENCIES_1 = +level_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +level_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(level_example_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = level-example.c +DIST_SOURCES = level-example.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +level_example_CFLAGS = $(GST_CFLAGS) +level_example_LDADD = $(GST_LIBS) $(LIBM) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/level/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/level/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +level-example$(EXEEXT): $(level_example_OBJECTS) $(level_example_DEPENDENCIES) $(EXTRA_level_example_DEPENDENCIES) + @rm -f level-example$(EXEEXT) + $(AM_V_CCLD)$(level_example_LINK) $(level_example_OBJECTS) $(level_example_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/level_example-level-example.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +level_example-level-example.o: level-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(level_example_CFLAGS) $(CFLAGS) -MT level_example-level-example.o -MD -MP -MF $(DEPDIR)/level_example-level-example.Tpo -c -o level_example-level-example.o `test -f 'level-example.c' || echo '$(srcdir)/'`level-example.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/level_example-level-example.Tpo $(DEPDIR)/level_example-level-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='level-example.c' object='level_example-level-example.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(level_example_CFLAGS) $(CFLAGS) -c -o level_example-level-example.o `test -f 'level-example.c' || echo '$(srcdir)/'`level-example.c + +level_example-level-example.obj: level-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(level_example_CFLAGS) $(CFLAGS) -MT level_example-level-example.obj -MD -MP -MF $(DEPDIR)/level_example-level-example.Tpo -c -o level_example-level-example.obj `if test -f 'level-example.c'; then $(CYGPATH_W) 'level-example.c'; else $(CYGPATH_W) '$(srcdir)/level-example.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/level_example-level-example.Tpo $(DEPDIR)/level_example-level-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='level-example.c' object='level_example-level-example.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(level_example_CFLAGS) $(CFLAGS) -c -o level_example-level-example.obj `if test -f 'level-example.c'; then $(CYGPATH_W) 'level-example.c'; else $(CYGPATH_W) '$(srcdir)/level-example.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/level/level-example.c b/tests/examples/level/level-example.c new file mode 100644 index 0000000..a85d751 --- /dev/null +++ b/tests/examples/level/level-example.c @@ -0,0 +1,129 @@ +/* GStreamer + * Copyright (C) 2000,2001,2002,2003,2005 + * Thomas Vander Stichele + * + * 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 +#include + +#include + +static gboolean +message_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + + if (message->type == GST_MESSAGE_ELEMENT) { + const GstStructure *s = gst_message_get_structure (message); + const gchar *name = gst_structure_get_name (s); + + if (strcmp (name, "level") == 0) { + gint channels; + GstClockTime endtime; + gdouble rms_dB, peak_dB, decay_dB; + gdouble rms; + const GValue *list; + const GValue *value; + + gint i; + + if (!gst_structure_get_clock_time (s, "endtime", &endtime)) + g_warning ("Could not parse endtime"); + /* we can get the number of channels as the length of any of the value + * lists */ + list = gst_structure_get_value (s, "rms"); + channels = gst_value_list_get_size (list); + + g_print ("endtime: %" GST_TIME_FORMAT ", channels: %d\n", + GST_TIME_ARGS (endtime), channels); + for (i = 0; i < channels; ++i) { + g_print ("channel %d\n", i); + list = gst_structure_get_value (s, "rms"); + value = gst_value_list_get_value (list, i); + rms_dB = g_value_get_double (value); + list = gst_structure_get_value (s, "peak"); + value = gst_value_list_get_value (list, i); + peak_dB = g_value_get_double (value); + list = gst_structure_get_value (s, "decay"); + value = gst_value_list_get_value (list, i); + decay_dB = g_value_get_double (value); + g_print (" RMS: %f dB, peak: %f dB, decay: %f dB\n", + rms_dB, peak_dB, decay_dB); + + /* converting from dB to normal gives us a value between 0.0 and 1.0 */ + rms = pow (10, rms_dB / 20); + g_print (" normalized rms value: %f\n", rms); + } + } + } + /* we handled the message we want, and ignored the ones we didn't want. + * so the core can unref the message for us */ + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + GstElement *audiotestsrc, *audioconvert, *level, *fakesink; + GstElement *pipeline; + GstCaps *caps; + GstBus *bus; + guint watch_id; + GMainLoop *loop; + + gst_init (&argc, &argv); + + caps = gst_caps_from_string ("audio/x-raw-int,channels=2"); + + pipeline = gst_pipeline_new (NULL); + g_assert (pipeline); + audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL); + g_assert (audiotestsrc); + audioconvert = gst_element_factory_make ("audioconvert", NULL); + g_assert (audioconvert); + level = gst_element_factory_make ("level", NULL); + g_assert (level); + fakesink = gst_element_factory_make ("fakesink", NULL); + g_assert (fakesink); + + gst_bin_add_many (GST_BIN (pipeline), audiotestsrc, audioconvert, level, + fakesink, NULL); + if (!gst_element_link (audiotestsrc, audioconvert)) + g_error ("Failed to link audiotestsrc and audioconvert"); + if (!gst_element_link_filtered (audioconvert, level, caps)) + g_error ("Failed to link audioconvert and level"); + if (!gst_element_link (level, fakesink)) + g_error ("Failed to link level and fakesink"); + + /* make sure we'll get messages */ + g_object_set (G_OBJECT (level), "message", TRUE, NULL); + /* run synced and not as fast as we can */ + g_object_set (G_OBJECT (fakesink), "sync", TRUE, NULL); + + bus = gst_element_get_bus (pipeline); + watch_id = gst_bus_add_watch (bus, message_handler, NULL); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + /* we need to run a GLib main loop to get the messages */ + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_source_remove (watch_id); + g_main_loop_unref (loop); + return 0; +} diff --git a/tests/examples/pulse/Makefile.am b/tests/examples/pulse/Makefile.am new file mode 100644 index 0000000..5d35e61 --- /dev/null +++ b/tests/examples/pulse/Makefile.am @@ -0,0 +1,5 @@ +noinst_PROGRAMS = pulse +pulse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +pulse_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_BASE_LIBS) $(GST_LIBS) + + diff --git a/tests/examples/pulse/Makefile.in b/tests/examples/pulse/Makefile.in new file mode 100644 index 0000000..da82e6e --- /dev/null +++ b/tests/examples/pulse/Makefile.in @@ -0,0 +1,751 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = pulse$(EXEEXT) +subdir = tests/examples/pulse +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +pulse_SOURCES = pulse.c +pulse_OBJECTS = pulse-pulse.$(OBJEXT) +am__DEPENDENCIES_1 = +pulse_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +pulse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pulse_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = pulse.c +DIST_SOURCES = pulse.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +pulse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +pulse_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_BASE_LIBS) $(GST_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/pulse/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/pulse/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +pulse$(EXEEXT): $(pulse_OBJECTS) $(pulse_DEPENDENCIES) $(EXTRA_pulse_DEPENDENCIES) + @rm -f pulse$(EXEEXT) + $(AM_V_CCLD)$(pulse_LINK) $(pulse_OBJECTS) $(pulse_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pulse-pulse.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +pulse-pulse.o: pulse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulse_CFLAGS) $(CFLAGS) -MT pulse-pulse.o -MD -MP -MF $(DEPDIR)/pulse-pulse.Tpo -c -o pulse-pulse.o `test -f 'pulse.c' || echo '$(srcdir)/'`pulse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pulse-pulse.Tpo $(DEPDIR)/pulse-pulse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse.c' object='pulse-pulse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulse_CFLAGS) $(CFLAGS) -c -o pulse-pulse.o `test -f 'pulse.c' || echo '$(srcdir)/'`pulse.c + +pulse-pulse.obj: pulse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulse_CFLAGS) $(CFLAGS) -MT pulse-pulse.obj -MD -MP -MF $(DEPDIR)/pulse-pulse.Tpo -c -o pulse-pulse.obj `if test -f 'pulse.c'; then $(CYGPATH_W) 'pulse.c'; else $(CYGPATH_W) '$(srcdir)/pulse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pulse-pulse.Tpo $(DEPDIR)/pulse-pulse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse.c' object='pulse-pulse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulse_CFLAGS) $(CFLAGS) -c -o pulse-pulse.obj `if test -f 'pulse.c'; then $(CYGPATH_W) 'pulse.c'; else $(CYGPATH_W) '$(srcdir)/pulse.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/pulse/pulse.c b/tests/examples/pulse/pulse.c new file mode 100644 index 0000000..54c1a87 --- /dev/null +++ b/tests/examples/pulse/pulse.c @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) 2010 Wim Taymans + * + * 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 + +#include + +static void +test_element (const gchar * name) +{ + GstElement *element; + GstPropertyProbe *probe = NULL; + const GParamSpec *pspec = NULL; + GValueArray *array = NULL; + guint i; + + g_print ("testing element %s\n", name); + element = gst_element_factory_make (name, NULL); + g_assert (element); + + gst_element_set_state (element, GST_STATE_READY); + probe = GST_PROPERTY_PROBE (element); + pspec = gst_property_probe_get_property (probe, "device"); + + array = gst_property_probe_probe_and_get_values (probe, pspec); + g_assert (array); + + for (i = 0; i < array->n_values; i++) { + GValue *device = NULL; + gchar *name = NULL; + + device = g_value_array_get_nth (array, i); + g_object_set_property (G_OBJECT (element), "device", device); + g_object_get (G_OBJECT (element), "device-name", &name, NULL); + + g_print ("device: %s (%s)\n", g_value_get_string (device), + GST_STR_NULL (name)); + } + g_value_array_free (array); + + gst_element_set_state (element, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (element)); +} + +int +main (int argc, char *argv[]) +{ + gst_init (&argc, &argv); + + test_element ("pulsesink"); + test_element ("pulsesrc"); + + return 0; +} diff --git a/tests/examples/rtp/Makefile.am b/tests/examples/rtp/Makefile.am new file mode 100644 index 0000000..f636e81 --- /dev/null +++ b/tests/examples/rtp/Makefile.am @@ -0,0 +1,22 @@ +noinst_PROGRAMS = server-alsasrc-PCMA client-PCMA + +server_alsasrc_PCMA_SOURCES = server-alsasrc-PCMA.c +server_alsasrc_PCMA_CFLAGS = $(GST_CFLAGS) +server_alsasrc_PCMA_LDADD = $(GST_LIBS) $(LIBM) + +client_PCMA_SOURCES = client-PCMA.c +client_PCMA_CFLAGS = $(GST_CFLAGS) +client_PCMA_LDADD = $(GST_LIBS) $(LIBM) + +noinst_SCRIPTS=client-H263p-AMR.sh \ + client-H263p-PCMA.sh \ + client-H264-PCMA.sh \ + client-PCMA.sh \ + server-alsasrc-PCMA.sh \ + server-v4l2-H263p-alsasrc-AMR.sh \ + server-v4l2-H264-alsasrc-PCMA.sh \ + server-VTS-H263p-ATS-PCMA.sh + +EXTRA_DIST= $(noinst_SCRIPTS) \ + client-H263p-PCMA.sdp \ + client-H264-PCMA.sdp diff --git a/tests/examples/rtp/Makefile.in b/tests/examples/rtp/Makefile.in new file mode 100644 index 0000000..56e5948 --- /dev/null +++ b/tests/examples/rtp/Makefile.in @@ -0,0 +1,796 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = server-alsasrc-PCMA$(EXEEXT) client-PCMA$(EXEEXT) +subdir = tests/examples/rtp +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_client_PCMA_OBJECTS = client_PCMA-client-PCMA.$(OBJEXT) +client_PCMA_OBJECTS = $(am_client_PCMA_OBJECTS) +am__DEPENDENCIES_1 = +client_PCMA_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +client_PCMA_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(client_PCMA_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_server_alsasrc_PCMA_OBJECTS = \ + server_alsasrc_PCMA-server-alsasrc-PCMA.$(OBJEXT) +server_alsasrc_PCMA_OBJECTS = $(am_server_alsasrc_PCMA_OBJECTS) +server_alsasrc_PCMA_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +server_alsasrc_PCMA_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SCRIPTS = $(noinst_SCRIPTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(client_PCMA_SOURCES) $(server_alsasrc_PCMA_SOURCES) +DIST_SOURCES = $(client_PCMA_SOURCES) $(server_alsasrc_PCMA_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +server_alsasrc_PCMA_SOURCES = server-alsasrc-PCMA.c +server_alsasrc_PCMA_CFLAGS = $(GST_CFLAGS) +server_alsasrc_PCMA_LDADD = $(GST_LIBS) $(LIBM) +client_PCMA_SOURCES = client-PCMA.c +client_PCMA_CFLAGS = $(GST_CFLAGS) +client_PCMA_LDADD = $(GST_LIBS) $(LIBM) +noinst_SCRIPTS = client-H263p-AMR.sh \ + client-H263p-PCMA.sh \ + client-H264-PCMA.sh \ + client-PCMA.sh \ + server-alsasrc-PCMA.sh \ + server-v4l2-H263p-alsasrc-AMR.sh \ + server-v4l2-H264-alsasrc-PCMA.sh \ + server-VTS-H263p-ATS-PCMA.sh + +EXTRA_DIST = $(noinst_SCRIPTS) \ + client-H263p-PCMA.sdp \ + client-H264-PCMA.sdp + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/rtp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/rtp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +client-PCMA$(EXEEXT): $(client_PCMA_OBJECTS) $(client_PCMA_DEPENDENCIES) $(EXTRA_client_PCMA_DEPENDENCIES) + @rm -f client-PCMA$(EXEEXT) + $(AM_V_CCLD)$(client_PCMA_LINK) $(client_PCMA_OBJECTS) $(client_PCMA_LDADD) $(LIBS) +server-alsasrc-PCMA$(EXEEXT): $(server_alsasrc_PCMA_OBJECTS) $(server_alsasrc_PCMA_DEPENDENCIES) $(EXTRA_server_alsasrc_PCMA_DEPENDENCIES) + @rm -f server-alsasrc-PCMA$(EXEEXT) + $(AM_V_CCLD)$(server_alsasrc_PCMA_LINK) $(server_alsasrc_PCMA_OBJECTS) $(server_alsasrc_PCMA_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_PCMA-client-PCMA.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +client_PCMA-client-PCMA.o: client-PCMA.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(client_PCMA_CFLAGS) $(CFLAGS) -MT client_PCMA-client-PCMA.o -MD -MP -MF $(DEPDIR)/client_PCMA-client-PCMA.Tpo -c -o client_PCMA-client-PCMA.o `test -f 'client-PCMA.c' || echo '$(srcdir)/'`client-PCMA.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/client_PCMA-client-PCMA.Tpo $(DEPDIR)/client_PCMA-client-PCMA.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client-PCMA.c' object='client_PCMA-client-PCMA.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(client_PCMA_CFLAGS) $(CFLAGS) -c -o client_PCMA-client-PCMA.o `test -f 'client-PCMA.c' || echo '$(srcdir)/'`client-PCMA.c + +client_PCMA-client-PCMA.obj: client-PCMA.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(client_PCMA_CFLAGS) $(CFLAGS) -MT client_PCMA-client-PCMA.obj -MD -MP -MF $(DEPDIR)/client_PCMA-client-PCMA.Tpo -c -o client_PCMA-client-PCMA.obj `if test -f 'client-PCMA.c'; then $(CYGPATH_W) 'client-PCMA.c'; else $(CYGPATH_W) '$(srcdir)/client-PCMA.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/client_PCMA-client-PCMA.Tpo $(DEPDIR)/client_PCMA-client-PCMA.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client-PCMA.c' object='client_PCMA-client-PCMA.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(client_PCMA_CFLAGS) $(CFLAGS) -c -o client_PCMA-client-PCMA.obj `if test -f 'client-PCMA.c'; then $(CYGPATH_W) 'client-PCMA.c'; else $(CYGPATH_W) '$(srcdir)/client-PCMA.c'; fi` + +server_alsasrc_PCMA-server-alsasrc-PCMA.o: server-alsasrc-PCMA.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) -MT server_alsasrc_PCMA-server-alsasrc-PCMA.o -MD -MP -MF $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Tpo -c -o server_alsasrc_PCMA-server-alsasrc-PCMA.o `test -f 'server-alsasrc-PCMA.c' || echo '$(srcdir)/'`server-alsasrc-PCMA.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Tpo $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='server-alsasrc-PCMA.c' object='server_alsasrc_PCMA-server-alsasrc-PCMA.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) -c -o server_alsasrc_PCMA-server-alsasrc-PCMA.o `test -f 'server-alsasrc-PCMA.c' || echo '$(srcdir)/'`server-alsasrc-PCMA.c + +server_alsasrc_PCMA-server-alsasrc-PCMA.obj: server-alsasrc-PCMA.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) -MT server_alsasrc_PCMA-server-alsasrc-PCMA.obj -MD -MP -MF $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Tpo -c -o server_alsasrc_PCMA-server-alsasrc-PCMA.obj `if test -f 'server-alsasrc-PCMA.c'; then $(CYGPATH_W) 'server-alsasrc-PCMA.c'; else $(CYGPATH_W) '$(srcdir)/server-alsasrc-PCMA.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Tpo $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='server-alsasrc-PCMA.c' object='server_alsasrc_PCMA-server-alsasrc-PCMA.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) -c -o server_alsasrc_PCMA-server-alsasrc-PCMA.obj `if test -f 'server-alsasrc-PCMA.c'; then $(CYGPATH_W) 'server-alsasrc-PCMA.c'; else $(CYGPATH_W) '$(srcdir)/server-alsasrc-PCMA.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(SCRIPTS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/rtp/client-H263p-AMR.sh b/tests/examples/rtp/client-H263p-AMR.sh new file mode 100755 index 0000000..bb0b795 --- /dev/null +++ b/tests/examples/rtp/client-H263p-AMR.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# +# A simple RTP receiver +# + +VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998" +AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1" + +VIDEO_DEC="rtph263pdepay ! ffdec_h263" +AUDIO_DEC="rtpamrdepay ! amrnbdec" + +VIDEO_SINK="ffmpegcolorspace ! autovideosink" +AUDIO_SINK="audioconvert ! audioresample ! autoaudiosink" + +gst-launch -v gstrtpbin name=rtpbin latency=100 \ + udpsrc caps=$VIDEO_CAPS port=5000 ! rtpbin.recv_rtp_sink_0 \ + rtpbin. ! $VIDEO_DEC ! $VIDEO_SINK \ + udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ + rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false \ + udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_1 \ + rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK \ + udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ + rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false diff --git a/tests/examples/rtp/client-H263p-PCMA.sdp b/tests/examples/rtp/client-H263p-PCMA.sdp new file mode 100644 index 0000000..8d2264f --- /dev/null +++ b/tests/examples/rtp/client-H263p-PCMA.sdp @@ -0,0 +1,12 @@ +v=0 +o=- 1188340656180883 1 IN IP4 127.0.0.1 +s=Session streamed by GStreamer +i=server.sh +t=0 0 +a=tool:GStreamer +a=type:broadcast +m=video 5000 RTP/AVP 96 +c=IN IP4 127.0.0.1 +a=rtpmap:96 H263-1998/90000 +m=audio 5002 RTP/AVP 8 +c=IN IP4 127.0.0.1 diff --git a/tests/examples/rtp/client-H263p-PCMA.sh b/tests/examples/rtp/client-H263p-PCMA.sh new file mode 100755 index 0000000..9db0d7e --- /dev/null +++ b/tests/examples/rtp/client-H263p-PCMA.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# +# A simple RTP receiver +# + +VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998" +AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA" + +#DEST=192.168.1.126 +DEST=localhost + +VIDEO_DEC="rtph263pdepay ! ffdec_h263" +AUDIO_DEC="rtppcmadepay ! alawdec" + +VIDEO_SINK="ffmpegcolorspace ! autovideosink" +AUDIO_SINK="audioconvert ! audioresample ! autoaudiosink" + +LATENCY=100 + +gst-launch -v gstrtpbin name=rtpbin latency=$LATENCY \ + udpsrc caps=$VIDEO_CAPS port=5000 ! rtpbin.recv_rtp_sink_0 \ + rtpbin. ! $VIDEO_DEC ! $VIDEO_SINK \ + udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ + rtpbin.send_rtcp_src_0 ! udpsink host=$DEST port=5005 sync=false async=false \ + udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_1 \ + rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK \ + udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ + rtpbin.send_rtcp_src_1 ! udpsink host=$DEST port=5007 sync=false async=false diff --git a/tests/examples/rtp/client-H264-PCMA.sdp b/tests/examples/rtp/client-H264-PCMA.sdp new file mode 100644 index 0000000..85aa75f --- /dev/null +++ b/tests/examples/rtp/client-H264-PCMA.sdp @@ -0,0 +1,12 @@ +v=0 +o=- 1188340656180883 1 IN IP4 127.0.0.1 +s=Session streamed by GStreamer +i=server.sh +t=0 0 +a=tool:GStreamer +a=type:broadcast +m=video 5000 RTP/AVP 96 +c=IN IP4 127.0.0.1 +a=rtpmap:96 H264/90000 +m=audio 5002 RTP/AVP 8 +c=IN IP4 127.0.0.1 diff --git a/tests/examples/rtp/client-H264-PCMA.sh b/tests/examples/rtp/client-H264-PCMA.sh new file mode 100755 index 0000000..7b104ab --- /dev/null +++ b/tests/examples/rtp/client-H264-PCMA.sh @@ -0,0 +1,64 @@ +#!/bin/sh +# +# A simple RTP receiver +# +# receives H264 encoded RTP video on port 5000, RTCP is received on port 5001. +# the receiver RTCP reports are sent to port 5005 +# receives alaw encoded RTP audio on port 5002, RTCP is received on port 5003. +# the receiver RTCP reports are sent to port 5007 +# +# .-------. .----------. .---------. .-------. .-----------. +# RTP |udpsrc | | rtpbin | |h264depay| |h264dec| |xvimagesink| +# port=5000 | src->recv_rtp recv_rtp->sink src->sink src->sink | +# '-------' | | '---------' '-------' '-----------' +# | | +# | | .-------. +# | | |udpsink| RTCP +# | send_rtcp->sink | port=5005 +# .-------. | | '-------' sync=false +# RTCP |udpsrc | | | async=false +# port=5001 | src->recv_rtcp | +# '-------' | | +# | | +# .-------. | | .---------. .-------. .-------------. +# RTP |udpsrc | | rtpbin | |pcmadepay| |alawdec| |autoaudiosink| +# port=5002 | src->recv_rtp recv_rtp->sink src->sink src->sink | +# '-------' | | '---------' '-------' '-------------' +# | | +# | | .-------. +# | | |udpsink| RTCP +# | send_rtcp->sink | port=5007 +# .-------. | | '-------' sync=false +# RTCP |udpsrc | | | async=false +# port=5003 | src->recv_rtcp | +# '-------' '----------' + +# the destination machine to send RTCP to. This is the address of the sender and +# is used to send back the RTCP reports of this receiver. If the data is sent +# from another machine, change this address. +DEST=127.0.0.1 + +# this adjusts the latency in the receiver +LATENCY=200 + +# the caps of the sender RTP stream. This is usually negotiated out of band with +# SDP or RTSP. normally these caps will also include SPS and PPS but we don't +# have a mechanism to get this from the sender with a -launch line. +VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" +AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA" + +VIDEO_DEC="rtph264depay ! ffdec_h264" +AUDIO_DEC="rtppcmadepay ! alawdec" + +VIDEO_SINK="ffmpegcolorspace ! autovideosink" +AUDIO_SINK="audioconvert ! audioresample ! autoaudiosink" + +gst-launch -v gstrtpbin name=rtpbin latency=$LATENCY \ + udpsrc caps=$VIDEO_CAPS port=5000 ! rtpbin.recv_rtp_sink_0 \ + rtpbin. ! $VIDEO_DEC ! $VIDEO_SINK \ + udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ + rtpbin.send_rtcp_src_0 ! udpsink port=5005 host=$DEST sync=false async=false \ + udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_1 \ + rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK \ + udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ + rtpbin.send_rtcp_src_1 ! udpsink port=5007 host=$DEST sync=false async=false diff --git a/tests/examples/rtp/client-PCMA.c b/tests/examples/rtp/client-PCMA.c new file mode 100644 index 0000000..885b826 --- /dev/null +++ b/tests/examples/rtp/client-PCMA.c @@ -0,0 +1,237 @@ +/* GStreamer + * Copyright (C) 2009 Wim Taymans + * + * 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 +#include + +#include + +/* + * A simple RTP receiver + * + * receives alaw encoded RTP audio on port 5002, RTCP is received on port 5003. + * the receiver RTCP reports are sent to port 5007 + * + * .-------. .----------. .---------. .-------. .--------. + * RTP |udpsrc | | rtpbin | |pcmadepay| |alawdec| |alsasink| + * port=5002 | src->recv_rtp recv_rtp->sink src->sink src->sink | + * '-------' | | '---------' '-------' '--------' + * | | + * | | .-------. + * | | |udpsink| RTCP + * | send_rtcp->sink | port=5007 + * .-------. | | '-------' sync=false + * RTCP |udpsrc | | | async=false + * port=5003 | src->recv_rtcp | + * '-------' '----------' + */ + +/* the caps of the sender RTP stream. This is usually negotiated out of band with + * SDP or RTSP. */ +#define AUDIO_CAPS "application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA" + +#define AUDIO_DEPAY "rtppcmadepay" +#define AUDIO_DEC "alawdec" +#define AUDIO_SINK "autoaudiosink" + +/* the destination machine to send RTCP to. This is the address of the sender and + * is used to send back the RTCP reports of this receiver. If the data is sent + * from another machine, change this address. */ +#define DEST_HOST "127.0.0.1" + +/* print the stats of a source */ +static void +print_source_stats (GObject * source) +{ + GstStructure *stats; + gchar *str; + + g_return_if_fail (source != NULL); + + /* get the source stats */ + g_object_get (source, "stats", &stats, NULL); + + /* simply dump the stats structure */ + str = gst_structure_to_string (stats); + g_print ("source stats: %s\n", str); + + gst_structure_free (stats); + g_free (str); +} + +/* will be called when gstrtpbin signals on-ssrc-active. It means that an RTCP + * packet was received from another source. */ +static void +on_ssrc_active_cb (GstElement * rtpbin, guint sessid, guint ssrc, + GstElement * depay) +{ + GObject *session, *isrc, *osrc; + + g_print ("got RTCP from session %u, SSRC %u\n", sessid, ssrc); + + /* get the right session */ + g_signal_emit_by_name (rtpbin, "get-internal-session", sessid, &session); + + /* get the internal source (the SSRC allocated to us, the receiver */ + g_object_get (session, "internal-source", &isrc, NULL); + print_source_stats (isrc); + + /* get the remote source that sent us RTCP */ + g_signal_emit_by_name (session, "get-source-by-ssrc", ssrc, &osrc); + print_source_stats (osrc); +} + +/* will be called when rtpbin has validated a payload that we can depayload */ +static void +pad_added_cb (GstElement * rtpbin, GstPad * new_pad, GstElement * depay) +{ + GstPad *sinkpad; + GstPadLinkReturn lres; + + g_print ("new payload on pad: %s\n", GST_PAD_NAME (new_pad)); + + sinkpad = gst_element_get_static_pad (depay, "sink"); + g_assert (sinkpad); + + lres = gst_pad_link (new_pad, sinkpad); + g_assert (lres == GST_PAD_LINK_OK); + gst_object_unref (sinkpad); +} + +/* build a pipeline equivalent to: + * + * gst-launch -v gstrtpbin name=rtpbin \ + * udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_0 \ + * rtpbin. ! rtppcmadepay ! alawdec ! audioconvert ! audioresample ! alsasink \ + * udpsrc port=5003 ! rtpbin.recv_rtcp_sink_0 \ + * rtpbin.send_rtcp_src_0 ! udpsink port=5007 host=$DEST sync=false async=false + */ +int +main (int argc, char *argv[]) +{ + GstElement *rtpbin, *rtpsrc, *rtcpsrc, *rtcpsink; + GstElement *audiodepay, *audiodec, *audiores, *audioconv, *audiosink; + GstElement *pipeline; + GMainLoop *loop; + GstCaps *caps; + gboolean res; + GstPadLinkReturn lres; + GstPad *srcpad, *sinkpad; + + /* always init first */ + gst_init (&argc, &argv); + + /* the pipeline to hold everything */ + pipeline = gst_pipeline_new (NULL); + g_assert (pipeline); + + /* the udp src and source we will use for RTP and RTCP */ + rtpsrc = gst_element_factory_make ("udpsrc", "rtpsrc"); + g_assert (rtpsrc); + g_object_set (rtpsrc, "port", 5002, NULL); + /* we need to set caps on the udpsrc for the RTP data */ + caps = gst_caps_from_string (AUDIO_CAPS); + g_object_set (rtpsrc, "caps", caps, NULL); + gst_caps_unref (caps); + + rtcpsrc = gst_element_factory_make ("udpsrc", "rtcpsrc"); + g_assert (rtcpsrc); + g_object_set (rtcpsrc, "port", 5003, NULL); + + rtcpsink = gst_element_factory_make ("udpsink", "rtcpsink"); + g_assert (rtcpsink); + g_object_set (rtcpsink, "port", 5007, "host", DEST_HOST, NULL); + /* no need for synchronisation or preroll on the RTCP sink */ + g_object_set (rtcpsink, "async", FALSE, "sync", FALSE, NULL); + + gst_bin_add_many (GST_BIN (pipeline), rtpsrc, rtcpsrc, rtcpsink, NULL); + + /* the depayloading and decoding */ + audiodepay = gst_element_factory_make (AUDIO_DEPAY, "audiodepay"); + g_assert (audiodepay); + audiodec = gst_element_factory_make (AUDIO_DEC, "audiodec"); + g_assert (audiodec); + /* the audio playback and format conversion */ + audioconv = gst_element_factory_make ("audioconvert", "audioconv"); + g_assert (audioconv); + audiores = gst_element_factory_make ("audioresample", "audiores"); + g_assert (audiores); + audiosink = gst_element_factory_make (AUDIO_SINK, "audiosink"); + g_assert (audiosink); + + /* add depayloading and playback to the pipeline and link */ + gst_bin_add_many (GST_BIN (pipeline), audiodepay, audiodec, audioconv, + audiores, audiosink, NULL); + + res = gst_element_link_many (audiodepay, audiodec, audioconv, audiores, + audiosink, NULL); + g_assert (res == TRUE); + + /* the rtpbin element */ + rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); + g_assert (rtpbin); + + gst_bin_add (GST_BIN (pipeline), rtpbin); + + /* now link all to the rtpbin, start by getting an RTP sinkpad for session 0 */ + srcpad = gst_element_get_static_pad (rtpsrc, "src"); + sinkpad = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_0"); + lres = gst_pad_link (srcpad, sinkpad); + g_assert (lres == GST_PAD_LINK_OK); + gst_object_unref (srcpad); + + /* get an RTCP sinkpad in session 0 */ + srcpad = gst_element_get_static_pad (rtcpsrc, "src"); + sinkpad = gst_element_get_request_pad (rtpbin, "recv_rtcp_sink_0"); + lres = gst_pad_link (srcpad, sinkpad); + g_assert (lres == GST_PAD_LINK_OK); + gst_object_unref (srcpad); + gst_object_unref (sinkpad); + + /* get an RTCP srcpad for sending RTCP back to the sender */ + srcpad = gst_element_get_request_pad (rtpbin, "send_rtcp_src_0"); + sinkpad = gst_element_get_static_pad (rtcpsink, "sink"); + lres = gst_pad_link (srcpad, sinkpad); + g_assert (lres == GST_PAD_LINK_OK); + gst_object_unref (sinkpad); + + /* the RTP pad that we have to connect to the depayloader will be created + * dynamically so we connect to the pad-added signal, pass the depayloader as + * user_data so that we can link to it. */ + g_signal_connect (rtpbin, "pad-added", G_CALLBACK (pad_added_cb), audiodepay); + + /* give some stats when we receive RTCP */ + g_signal_connect (rtpbin, "on-ssrc-active", G_CALLBACK (on_ssrc_active_cb), + audiodepay); + + /* set the pipeline to playing */ + g_print ("starting receiver pipeline\n"); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + /* we need to run a GLib main loop to get the messages */ + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_print ("stopping receiver pipeline\n"); + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_object_unref (pipeline); + + return 0; +} diff --git a/tests/examples/rtp/client-PCMA.sh b/tests/examples/rtp/client-PCMA.sh new file mode 100755 index 0000000..aad6502 --- /dev/null +++ b/tests/examples/rtp/client-PCMA.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# +# A simple RTP receiver +# +# receives alaw encoded RTP audio on port 5002, RTCP is received on port 5003. +# the receiver RTCP reports are sent to port 5007 +# +# .-------. .----------. .---------. .-------. .-------------. +# RTP |udpsrc | | rtpbin | |pcmadepay| |alawdec| |autoaudiosink| +# port=5002 | src->recv_rtp recv_rtp->sink src->sink src->sink | +# '-------' | | '---------' '-------' '-------------' +# | | +# | | .-------. +# | | |udpsink| RTCP +# | send_rtcp->sink | port=5007 +# .-------. | | '-------' sync=false +# RTCP |udpsrc | | | async=false +# port=5003 | src->recv_rtcp | +# '-------' '----------' + + +# the caps of the sender RTP stream. This is usually negotiated out of band with +# SDP or RTSP. +AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA" + +AUDIO_DEC="rtppcmadepay ! alawdec" + +AUDIO_SINK="audioconvert ! audioresample ! autoaudiosink" + +# the destination machine to send RTCP to. This is the address of the sender and +# is used to send back the RTCP reports of this receiver. If the data is sent +# from another machine, change this address. +DEST=127.0.0.1 + +gst-launch -v gstrtpbin name=rtpbin \ + udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_0 \ + rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK \ + udpsrc port=5003 ! rtpbin.recv_rtcp_sink_0 \ + rtpbin.send_rtcp_src_0 ! udpsink port=5007 host=$DEST sync=false async=false diff --git a/tests/examples/rtp/server-VTS-H263p-ATS-PCMA.sh b/tests/examples/rtp/server-VTS-H263p-ATS-PCMA.sh new file mode 100755 index 0000000..ff2614d --- /dev/null +++ b/tests/examples/rtp/server-VTS-H263p-ATS-PCMA.sh @@ -0,0 +1,16 @@ +#!/bin/sh +# +# A simple RTP server +# + +VCAPS="video/x-raw-yuv,width=352,height=288,framerate=15/1" + +gst-launch -v gstrtpbin name=rtpbin \ + videotestsrc ! $VCAPS ! ffenc_h263p ! rtph263ppay ! rtpbin.send_rtp_sink_0 \ + rtpbin.send_rtp_src_0 ! udpsink port=5000 \ + rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false \ + udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \ + audiotestsrc samplesperbuffer=1000 ! alawenc ! rtppcmapay ! rtpbin.send_rtp_sink_1 \ + rtpbin.send_rtp_src_1 ! udpsink port=5002 \ + rtpbin.send_rtcp_src_1 ! udpsink port=5003 sync=false async=false \ + udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1 diff --git a/tests/examples/rtp/server-alsasrc-PCMA.c b/tests/examples/rtp/server-alsasrc-PCMA.c new file mode 100644 index 0000000..d61ec30 --- /dev/null +++ b/tests/examples/rtp/server-alsasrc-PCMA.c @@ -0,0 +1,221 @@ +/* GStreamer + * Copyright (C) 2009 Wim Taymans + * + * 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 +#include + +#include + +/* + * A simple RTP server + * sends the output of alsasrc as alaw encoded RTP on port 5002, RTCP is sent on + * port 5003. The destination is 127.0.0.1. + * the receiver RTCP reports are received on port 5007 + * + * .-------. .-------. .-------. .----------. .-------. + * |alsasrc| |alawenc| |pcmapay| | rtpbin | |udpsink| RTP + * | src->sink src->sink src->send_rtp send_rtp->sink | port=5002 + * '-------' '-------' '-------' | | '-------' + * | | + * | | .-------. + * | | |udpsink| RTCP + * | send_rtcp->sink | port=5003 + * .-------. | | '-------' sync=false + * RTCP |udpsrc | | | async=false + * port=5007 | src->recv_rtcp | + * '-------' '----------' + */ + +/* change this to send the RTP data and RTCP to another host */ +#define DEST_HOST "127.0.0.1" + +/* #define AUDIO_SRC "alsasrc" */ +#define AUDIO_SRC "audiotestsrc" + +/* the encoder and payloader elements */ +#define AUDIO_ENC "alawenc" +#define AUDIO_PAY "rtppcmapay" + +/* print the stats of a source */ +static void +print_source_stats (GObject * source) +{ + GstStructure *stats; + gchar *str; + + /* get the source stats */ + g_object_get (source, "stats", &stats, NULL); + + /* simply dump the stats structure */ + str = gst_structure_to_string (stats); + g_print ("source stats: %s\n", str); + + gst_structure_free (stats); + g_free (str); +} + +/* this function is called every second and dumps the RTP manager stats */ +static gboolean +print_stats (GstElement * rtpbin) +{ + GObject *session; + GValueArray *arr; + GValue *val; + guint i; + + g_print ("***********************************\n"); + + /* get session 0 */ + g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session); + + /* print all the sources in the session, this includes the internal source */ + g_object_get (session, "sources", &arr, NULL); + + for (i = 0; i < arr->n_values; i++) { + GObject *source; + + val = g_value_array_get_nth (arr, i); + source = g_value_get_object (val); + + print_source_stats (source); + } + g_value_array_free (arr); + + g_object_unref (session); + + return TRUE; +} + +/* build a pipeline equivalent to: + * + * gst-launch -v gstrtpbin name=rtpbin \ + * $AUDIO_SRC ! audioconvert ! audioresample ! $AUDIO_ENC ! $AUDIO_PAY ! rtpbin.send_rtp_sink_0 \ + * rtpbin.send_rtp_src_0 ! udpsink port=5002 host=$DEST \ + * rtpbin.send_rtcp_src_0 ! udpsink port=5003 host=$DEST sync=false async=false \ + * udpsrc port=5007 ! rtpbin.recv_rtcp_sink_0 + */ +int +main (int argc, char *argv[]) +{ + GstElement *audiosrc, *audioconv, *audiores, *audioenc, *audiopay; + GstElement *rtpbin, *rtpsink, *rtcpsink, *rtcpsrc; + GstElement *pipeline; + GMainLoop *loop; + GstPad *srcpad, *sinkpad; + + /* always init first */ + gst_init (&argc, &argv); + + /* the pipeline to hold everything */ + pipeline = gst_pipeline_new (NULL); + g_assert (pipeline); + + /* the audio capture and format conversion */ + audiosrc = gst_element_factory_make (AUDIO_SRC, "audiosrc"); + g_assert (audiosrc); + audioconv = gst_element_factory_make ("audioconvert", "audioconv"); + g_assert (audioconv); + audiores = gst_element_factory_make ("audioresample", "audiores"); + g_assert (audiores); + /* the encoding and payloading */ + audioenc = gst_element_factory_make (AUDIO_ENC, "audioenc"); + g_assert (audioenc); + audiopay = gst_element_factory_make (AUDIO_PAY, "audiopay"); + g_assert (audiopay); + + /* add capture and payloading to the pipeline and link */ + gst_bin_add_many (GST_BIN (pipeline), audiosrc, audioconv, audiores, + audioenc, audiopay, NULL); + + if (!gst_element_link_many (audiosrc, audioconv, audiores, audioenc, + audiopay, NULL)) { + g_error ("Failed to link audiosrc, audioconv, audioresample, " + "audio encoder and audio payloader"); + } + + /* the rtpbin element */ + rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); + g_assert (rtpbin); + + gst_bin_add (GST_BIN (pipeline), rtpbin); + + /* the udp sinks and source we will use for RTP and RTCP */ + rtpsink = gst_element_factory_make ("udpsink", "rtpsink"); + g_assert (rtpsink); + g_object_set (rtpsink, "port", 5002, "host", DEST_HOST, NULL); + + rtcpsink = gst_element_factory_make ("udpsink", "rtcpsink"); + g_assert (rtcpsink); + g_object_set (rtcpsink, "port", 5003, "host", DEST_HOST, NULL); + /* no need for synchronisation or preroll on the RTCP sink */ + g_object_set (rtcpsink, "async", FALSE, "sync", FALSE, NULL); + + rtcpsrc = gst_element_factory_make ("udpsrc", "rtcpsrc"); + g_assert (rtcpsrc); + g_object_set (rtcpsrc, "port", 5007, NULL); + + gst_bin_add_many (GST_BIN (pipeline), rtpsink, rtcpsink, rtcpsrc, NULL); + + /* now link all to the rtpbin, start by getting an RTP sinkpad for session 0 */ + sinkpad = gst_element_get_request_pad (rtpbin, "send_rtp_sink_0"); + srcpad = gst_element_get_static_pad (audiopay, "src"); + if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) + g_error ("Failed to link audio payloader to rtpbin"); + gst_object_unref (srcpad); + + /* get the RTP srcpad that was created when we requested the sinkpad above and + * link it to the rtpsink sinkpad*/ + srcpad = gst_element_get_static_pad (rtpbin, "send_rtp_src_0"); + sinkpad = gst_element_get_static_pad (rtpsink, "sink"); + if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) + g_error ("Failed to link rtpbin to rtpsink"); + gst_object_unref (srcpad); + gst_object_unref (sinkpad); + + /* get an RTCP srcpad for sending RTCP to the receiver */ + srcpad = gst_element_get_request_pad (rtpbin, "send_rtcp_src_0"); + sinkpad = gst_element_get_static_pad (rtcpsink, "sink"); + if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) + g_error ("Failed to link rtpbin to rtcpsink"); + gst_object_unref (sinkpad); + + /* we also want to receive RTCP, request an RTCP sinkpad for session 0 and + * link it to the srcpad of the udpsrc for RTCP */ + srcpad = gst_element_get_static_pad (rtcpsrc, "src"); + sinkpad = gst_element_get_request_pad (rtpbin, "recv_rtcp_sink_0"); + if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) + g_error ("Failed to link rtcpsrc to rtpbin"); + gst_object_unref (srcpad); + + /* set the pipeline to playing */ + g_print ("starting sender pipeline\n"); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + /* print stats every second */ + g_timeout_add (1000, (GSourceFunc) print_stats, rtpbin); + + /* we need to run a GLib main loop to get the messages */ + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_print ("stopping sender pipeline\n"); + gst_element_set_state (pipeline, GST_STATE_NULL); + + return 0; +} diff --git a/tests/examples/rtp/server-alsasrc-PCMA.sh b/tests/examples/rtp/server-alsasrc-PCMA.sh new file mode 100755 index 0000000..5340434 --- /dev/null +++ b/tests/examples/rtp/server-alsasrc-PCMA.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# +# A simple RTP server +# sends the output of autoaudiosrc as alaw encoded RTP on port 5002, RTCP is sent on +# port 5003. The destination is 127.0.0.1. +# the receiver RTCP reports are received on port 5007 +# +# .--------. .-------. .-------. .----------. .-------. +# |audiosrc| |alawenc| |pcmapay| | rtpbin | |udpsink| RTP +# | src->sink src->sink src->send_rtp send_rtp->sink | port=5002 +# '--------' '-------' '-------' | | '-------' +# | | +# | | .-------. +# | | |udpsink| RTCP +# | send_rtcp->sink | port=5003 +# .-------. | | '-------' sync=false +# RTCP |udpsrc | | | async=false +# port=5007 | src->recv_rtcp | +# '-------' '----------' + +# change this to send the RTP data and RTCP to another host +DEST=127.0.0.1 + +#AELEM=autoaudiosrc +AELEM=audiotestsrc + +# PCMA encode from an the source +ASOURCE="$AELEM ! audioconvert" +AENC="alawenc ! rtppcmapay" + +gst-launch -v gstrtpbin name=rtpbin \ + $ASOURCE ! $AENC ! rtpbin.send_rtp_sink_0 \ + rtpbin.send_rtp_src_0 ! udpsink port=5002 host=$DEST \ + rtpbin.send_rtcp_src_0 ! udpsink port=5003 host=$DEST sync=false async=false \ + udpsrc port=5007 ! rtpbin.recv_rtcp_sink_0 diff --git a/tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh b/tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh new file mode 100755 index 0000000..d8c13a7 --- /dev/null +++ b/tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# +# A simple RTP server +# + +# change these to change the server sync. This causes the server to send the +# packets largly out-of-sync, the client should use the RTCP SR packets to +# restore proper lip-sync between the streams. +AOFFSET=0 +VOFFSET=0 + +VCAPS="video/x-raw-yuv,width=352,height=288,framerate=15/1" + +#DEST=192.168.1.126 +DEST=localhost + +gst-launch -v gstrtpbin name=rtpbin \ + v4l2src ! videorate ! ffmpegcolorspace ! $VCAPS ! ffenc_h263p ! rtph263ppay ! rtpbin.send_rtp_sink_0 \ + rtpbin.send_rtp_src_0 ! queue ! udpsink host=$DEST port=5000 ts-offset=$AOFFSET \ + rtpbin.send_rtcp_src_0 ! udpsink host=$DEST port=5001 sync=false async=false \ + udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \ + autoaudiosrc ! audioconvert ! amrnbenc ! rtpamrpay ! rtpbin.send_rtp_sink_1 \ + rtpbin.send_rtp_src_1 ! queue ! udpsink host=$DEST port=5002 ts-offset=$VOFFSET \ + rtpbin.send_rtcp_src_1 ! udpsink host=$DEST port=5003 sync=false async=false \ + udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1 diff --git a/tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh b/tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh new file mode 100755 index 0000000..8dc4d70 --- /dev/null +++ b/tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh @@ -0,0 +1,78 @@ +#!/bin/sh +# +# A simple RTP server +# sends the output of v4l2src as h264 encoded RTP on port 5000, RTCP is sent on +# port 5001. The destination is 127.0.0.1. +# the video receiver RTCP reports are received on port 5005 +# sends the output of autoaudiosrc as alaw encoded RTP on port 5002, RTCP is sent on +# port 5003. The destination is 127.0.0.1. +# the receiver RTCP reports are received on port 5007 +# +# .-------. .-------. .-------. .----------. .-------. +# |v4lssrc| |h264enc| |h264pay| | rtpbin | |udpsink| RTP +# | src->sink src->sink src->send_rtp send_rtp->sink | port=5000 +# '-------' '-------' '-------' | | '-------' +# | | +# | | .-------. +# | | |udpsink| RTCP +# | send_rtcp->sink | port=5001 +# .-------. | | '-------' sync=false +# RTCP |udpsrc | | | async=false +# port=5005 | src->recv_rtcp | +# '-------' | | +# | | +# .--------. .-------. .-------. | | .-------. +# |audiosrc| |alawenc| |pcmapay| | rtpbin | |udpsink| RTP +# | src->sink src->sink src->send_rtp send_rtp->sink | port=5002 +# '--------' '-------' '-------' | | '-------' +# | | +# | | .-------. +# | | |udpsink| RTCP +# | send_rtcp->sink | port=5003 +# .-------. | | '-------' sync=false +# RTCP |udpsrc | | | async=false +# port=5007 | src->recv_rtcp | +# '-------' '----------' +# +# ideally we should transport the properties on the RTP udpsink pads to the +# receiver in order to transmit the SPS and PPS earlier. + +# change this to send the RTP data and RTCP to another host +DEST=127.0.0.1 + +# tuning parameters to make the sender send the streams out of sync. Can be used +# ot test the client RTCP synchronisation. +#VOFFSET=900000000 +VOFFSET=0 +AOFFSET=0 + +# H264 encode from the source +VELEM="v4l2src" +#VELEM="videotestsrc is-live=1" +VCAPS="video/x-raw-yuv,width=352,height=288,framerate=15/1" +VSOURCE="$VELEM ! queue ! videorate ! ffmpegcolorspace ! $VCAPS" +VENC="x264enc tune=zerolatency byte-stream=true bitrate=300 ! rtph264pay" + +VRTPSINK="udpsink port=5000 host=$DEST ts-offset=$VOFFSET name=vrtpsink" +VRTCPSINK="udpsink port=5001 host=$DEST sync=false async=false name=vrtcpsink" +VRTCPSRC="udpsrc port=5005 name=vrtpsrc" + +# PCMA encode from the source +AELEM="autoaudiosrc" +#AELEM="audiotestsrc is-live=1" +ASOURCE="$AELEM ! queue ! audioresample ! audioconvert" +AENC="alawenc ! rtppcmapay" + +ARTPSINK="udpsink port=5002 host=$DEST ts-offset=$AOFFSET name=artpsink" +ARTCPSINK="udpsink port=5003 host=$DEST sync=false async=false name=artcpsink" +ARTCPSRC="udpsrc port=5007 name=artpsrc" + +gst-launch -v gstrtpbin name=rtpbin \ + $VSOURCE ! $VENC ! rtpbin.send_rtp_sink_0 \ + rtpbin.send_rtp_src_0 ! $VRTPSINK \ + rtpbin.send_rtcp_src_0 ! $VRTCPSINK \ + $VRTCPSRC ! rtpbin.recv_rtcp_sink_0 \ + $ASOURCE ! $AENC ! rtpbin.send_rtp_sink_1 \ + rtpbin.send_rtp_src_1 ! $ARTPSINK \ + rtpbin.send_rtcp_src_1 ! $ARTCPSINK \ + $ARTCPSRC ! rtpbin.recv_rtcp_sink_1 diff --git a/tests/examples/shapewipe/Makefile.am b/tests/examples/shapewipe/Makefile.am new file mode 100644 index 0000000..e0e9217 --- /dev/null +++ b/tests/examples/shapewipe/Makefile.am @@ -0,0 +1,8 @@ +noinst_PROGRAMS = shapewipe-example + +shapewipe_example_SOURCES = shapewipe-example.c +shapewipe_example_CFLAGS = $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) +shapewipe_example_LDADD = $(GST_CONTROLLER_LIBS) $(GST_LIBS) + +noinst_HEADERS = + diff --git a/tests/examples/shapewipe/Makefile.in b/tests/examples/shapewipe/Makefile.in new file mode 100644 index 0000000..f403d6f --- /dev/null +++ b/tests/examples/shapewipe/Makefile.in @@ -0,0 +1,758 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = shapewipe-example$(EXEEXT) +subdir = tests/examples/shapewipe +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_shapewipe_example_OBJECTS = \ + shapewipe_example-shapewipe-example.$(OBJEXT) +shapewipe_example_OBJECTS = $(am_shapewipe_example_OBJECTS) +am__DEPENDENCIES_1 = +shapewipe_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +shapewipe_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(shapewipe_example_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(shapewipe_example_SOURCES) +DIST_SOURCES = $(shapewipe_example_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +shapewipe_example_SOURCES = shapewipe-example.c +shapewipe_example_CFLAGS = $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) +shapewipe_example_LDADD = $(GST_CONTROLLER_LIBS) $(GST_LIBS) +noinst_HEADERS = +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/shapewipe/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/shapewipe/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +shapewipe-example$(EXEEXT): $(shapewipe_example_OBJECTS) $(shapewipe_example_DEPENDENCIES) $(EXTRA_shapewipe_example_DEPENDENCIES) + @rm -f shapewipe-example$(EXEEXT) + $(AM_V_CCLD)$(shapewipe_example_LINK) $(shapewipe_example_OBJECTS) $(shapewipe_example_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shapewipe_example-shapewipe-example.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +shapewipe_example-shapewipe-example.o: shapewipe-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(shapewipe_example_CFLAGS) $(CFLAGS) -MT shapewipe_example-shapewipe-example.o -MD -MP -MF $(DEPDIR)/shapewipe_example-shapewipe-example.Tpo -c -o shapewipe_example-shapewipe-example.o `test -f 'shapewipe-example.c' || echo '$(srcdir)/'`shapewipe-example.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shapewipe_example-shapewipe-example.Tpo $(DEPDIR)/shapewipe_example-shapewipe-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shapewipe-example.c' object='shapewipe_example-shapewipe-example.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(shapewipe_example_CFLAGS) $(CFLAGS) -c -o shapewipe_example-shapewipe-example.o `test -f 'shapewipe-example.c' || echo '$(srcdir)/'`shapewipe-example.c + +shapewipe_example-shapewipe-example.obj: shapewipe-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(shapewipe_example_CFLAGS) $(CFLAGS) -MT shapewipe_example-shapewipe-example.obj -MD -MP -MF $(DEPDIR)/shapewipe_example-shapewipe-example.Tpo -c -o shapewipe_example-shapewipe-example.obj `if test -f 'shapewipe-example.c'; then $(CYGPATH_W) 'shapewipe-example.c'; else $(CYGPATH_W) '$(srcdir)/shapewipe-example.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shapewipe_example-shapewipe-example.Tpo $(DEPDIR)/shapewipe_example-shapewipe-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shapewipe-example.c' object='shapewipe_example-shapewipe-example.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(shapewipe_example_CFLAGS) $(CFLAGS) -c -o shapewipe_example-shapewipe-example.obj `if test -f 'shapewipe-example.c'; then $(CYGPATH_W) 'shapewipe-example.c'; else $(CYGPATH_W) '$(srcdir)/shapewipe-example.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/shapewipe/shapewipe-example.c b/tests/examples/shapewipe/shapewipe-example.c new file mode 100644 index 0000000..e3b49fe --- /dev/null +++ b/tests/examples/shapewipe/shapewipe-example.c @@ -0,0 +1,147 @@ +/* GStreamer + * Copyright (C) 2009 Sebastian Dröge + * + * 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 +#include +#include + +#include + +static gboolean +on_message (GstBus * bus, GstMessage * message, gpointer user_data) +{ + GMainLoop *loop = (GMainLoop *) user_data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR:{ + GError *err = NULL; + gchar *debug = NULL; + + g_warning ("Got ERROR"); + gst_message_parse_error (message, &err, &debug); + g_warning ("%s: %s", err->message, debug); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_WARNING:{ + GError *err = NULL; + gchar *debug = NULL; + + g_warning ("Got WARNING"); + gst_message_parse_error (message, &err, &debug); + g_warning ("%s: %s", err->message, debug); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_EOS: + g_main_loop_quit (loop); + break; + default: + break; + } + + return TRUE; +} + +gint +main (gint argc, gchar ** argv) +{ + GstElement *pipeline; + GstElement *shapewipe; + GstController *ctrl; + GstLFOControlSource *csource; + GValue val = { 0, }; + GMainLoop *loop; + GstBus *bus; + gchar *pipeline_string; + gfloat border = 0.05; + + if (argc < 2) { + g_print ("Usage: shapewipe mask.png \n"); + return -1; + } + + gst_init (&argc, &argv); + gst_controller_init (&argc, &argv); + + if (argc > 2) { + border = atof (argv[2]); + } + + pipeline_string = + g_strdup_printf + ("videotestsrc ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! shapewipe name=shape border=%f ! videomixer name=mixer ! ffmpegcolorspace ! autovideosink filesrc location=%s ! typefind ! decodebin2 ! ffmpegcolorspace ! videoscale ! queue ! shape.mask_sink videotestsrc pattern=snow ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! queue ! mixer.", + border, argv[1]); + + pipeline = gst_parse_launch (pipeline_string, NULL); + g_free (pipeline_string); + + if (pipeline == NULL) { + g_print ("Failed to create pipeline\n"); + return -2; + } + + shapewipe = gst_bin_get_by_name (GST_BIN (pipeline), "shape"); + + if (!(ctrl = gst_controller_new (G_OBJECT (shapewipe), "position", NULL))) { + g_print ("can't control shapewipe element\n"); + return -3; + } + + csource = gst_lfo_control_source_new (); + + gst_controller_set_control_source (ctrl, "position", + GST_CONTROL_SOURCE (csource)); + + g_value_init (&val, G_TYPE_FLOAT); + g_value_set_float (&val, 0.5); + g_object_set (G_OBJECT (csource), "amplitude", &val, NULL); + g_value_set_float (&val, 0.5); + g_object_set (G_OBJECT (csource), "offset", &val, NULL); + g_value_unset (&val); + + g_object_set (G_OBJECT (csource), "frequency", 0.25, NULL); + g_object_set (G_OBJECT (csource), "timeshift", 500 * GST_MSECOND, NULL); + + g_object_unref (csource); + + loop = g_main_loop_new (NULL, FALSE); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); + gst_object_unref (GST_OBJECT (bus)); + + if (gst_element_set_state (pipeline, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { + g_error ("Failed to go into PLAYING state"); + return -4; + } + + g_main_loop_run (loop); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + g_main_loop_unref (loop); + + g_object_unref (G_OBJECT (ctrl)); + gst_object_unref (G_OBJECT (pipeline)); + + return 0; +} diff --git a/tests/examples/spectrum/Makefile.am b/tests/examples/spectrum/Makefile.am new file mode 100644 index 0000000..8bb89da --- /dev/null +++ b/tests/examples/spectrum/Makefile.am @@ -0,0 +1,16 @@ +if HAVE_GTK +noinst_PROGRAMS = demo-osssrc demo-audiotest spectrum-example +endif + +demo_osssrc_SOURCES = demo-osssrc.c +demo_osssrc_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) +demo_osssrc_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) + +demo_audiotest_SOURCES = demo-audiotest.c +demo_audiotest_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) +demo_audiotest_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) + +spectrum_example_SOURCES = spectrum-example.c +spectrum_example_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) +spectrum_example_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) + diff --git a/tests/examples/spectrum/Makefile.in b/tests/examples/spectrum/Makefile.in new file mode 100644 index 0000000..c535310 --- /dev/null +++ b/tests/examples/spectrum/Makefile.in @@ -0,0 +1,815 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HAVE_GTK_TRUE@noinst_PROGRAMS = demo-osssrc$(EXEEXT) \ +@HAVE_GTK_TRUE@ demo-audiotest$(EXEEXT) \ +@HAVE_GTK_TRUE@ spectrum-example$(EXEEXT) +subdir = tests/examples/spectrum +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_demo_audiotest_OBJECTS = demo_audiotest-demo-audiotest.$(OBJEXT) +demo_audiotest_OBJECTS = $(am_demo_audiotest_OBJECTS) +am__DEPENDENCIES_1 = +demo_audiotest_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +demo_audiotest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(demo_audiotest_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ + $@ +am_demo_osssrc_OBJECTS = demo_osssrc-demo-osssrc.$(OBJEXT) +demo_osssrc_OBJECTS = $(am_demo_osssrc_OBJECTS) +demo_osssrc_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +demo_osssrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(demo_osssrc_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_spectrum_example_OBJECTS = \ + spectrum_example-spectrum-example.$(OBJEXT) +spectrum_example_OBJECTS = $(am_spectrum_example_OBJECTS) +spectrum_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +spectrum_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(spectrum_example_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(demo_audiotest_SOURCES) $(demo_osssrc_SOURCES) \ + $(spectrum_example_SOURCES) +DIST_SOURCES = $(demo_audiotest_SOURCES) $(demo_osssrc_SOURCES) \ + $(spectrum_example_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +demo_osssrc_SOURCES = demo-osssrc.c +demo_osssrc_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) +demo_osssrc_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) +demo_audiotest_SOURCES = demo-audiotest.c +demo_audiotest_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) +demo_audiotest_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) +spectrum_example_SOURCES = spectrum-example.c +spectrum_example_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) +spectrum_example_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/spectrum/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/spectrum/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +demo-audiotest$(EXEEXT): $(demo_audiotest_OBJECTS) $(demo_audiotest_DEPENDENCIES) $(EXTRA_demo_audiotest_DEPENDENCIES) + @rm -f demo-audiotest$(EXEEXT) + $(AM_V_CCLD)$(demo_audiotest_LINK) $(demo_audiotest_OBJECTS) $(demo_audiotest_LDADD) $(LIBS) +demo-osssrc$(EXEEXT): $(demo_osssrc_OBJECTS) $(demo_osssrc_DEPENDENCIES) $(EXTRA_demo_osssrc_DEPENDENCIES) + @rm -f demo-osssrc$(EXEEXT) + $(AM_V_CCLD)$(demo_osssrc_LINK) $(demo_osssrc_OBJECTS) $(demo_osssrc_LDADD) $(LIBS) +spectrum-example$(EXEEXT): $(spectrum_example_OBJECTS) $(spectrum_example_DEPENDENCIES) $(EXTRA_spectrum_example_DEPENDENCIES) + @rm -f spectrum-example$(EXEEXT) + $(AM_V_CCLD)$(spectrum_example_LINK) $(spectrum_example_OBJECTS) $(spectrum_example_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_audiotest-demo-audiotest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_osssrc-demo-osssrc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spectrum_example-spectrum-example.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +demo_audiotest-demo-audiotest.o: demo-audiotest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_audiotest_CFLAGS) $(CFLAGS) -MT demo_audiotest-demo-audiotest.o -MD -MP -MF $(DEPDIR)/demo_audiotest-demo-audiotest.Tpo -c -o demo_audiotest-demo-audiotest.o `test -f 'demo-audiotest.c' || echo '$(srcdir)/'`demo-audiotest.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo_audiotest-demo-audiotest.Tpo $(DEPDIR)/demo_audiotest-demo-audiotest.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo-audiotest.c' object='demo_audiotest-demo-audiotest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_audiotest_CFLAGS) $(CFLAGS) -c -o demo_audiotest-demo-audiotest.o `test -f 'demo-audiotest.c' || echo '$(srcdir)/'`demo-audiotest.c + +demo_audiotest-demo-audiotest.obj: demo-audiotest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_audiotest_CFLAGS) $(CFLAGS) -MT demo_audiotest-demo-audiotest.obj -MD -MP -MF $(DEPDIR)/demo_audiotest-demo-audiotest.Tpo -c -o demo_audiotest-demo-audiotest.obj `if test -f 'demo-audiotest.c'; then $(CYGPATH_W) 'demo-audiotest.c'; else $(CYGPATH_W) '$(srcdir)/demo-audiotest.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo_audiotest-demo-audiotest.Tpo $(DEPDIR)/demo_audiotest-demo-audiotest.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo-audiotest.c' object='demo_audiotest-demo-audiotest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_audiotest_CFLAGS) $(CFLAGS) -c -o demo_audiotest-demo-audiotest.obj `if test -f 'demo-audiotest.c'; then $(CYGPATH_W) 'demo-audiotest.c'; else $(CYGPATH_W) '$(srcdir)/demo-audiotest.c'; fi` + +demo_osssrc-demo-osssrc.o: demo-osssrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_osssrc_CFLAGS) $(CFLAGS) -MT demo_osssrc-demo-osssrc.o -MD -MP -MF $(DEPDIR)/demo_osssrc-demo-osssrc.Tpo -c -o demo_osssrc-demo-osssrc.o `test -f 'demo-osssrc.c' || echo '$(srcdir)/'`demo-osssrc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo_osssrc-demo-osssrc.Tpo $(DEPDIR)/demo_osssrc-demo-osssrc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo-osssrc.c' object='demo_osssrc-demo-osssrc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_osssrc_CFLAGS) $(CFLAGS) -c -o demo_osssrc-demo-osssrc.o `test -f 'demo-osssrc.c' || echo '$(srcdir)/'`demo-osssrc.c + +demo_osssrc-demo-osssrc.obj: demo-osssrc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_osssrc_CFLAGS) $(CFLAGS) -MT demo_osssrc-demo-osssrc.obj -MD -MP -MF $(DEPDIR)/demo_osssrc-demo-osssrc.Tpo -c -o demo_osssrc-demo-osssrc.obj `if test -f 'demo-osssrc.c'; then $(CYGPATH_W) 'demo-osssrc.c'; else $(CYGPATH_W) '$(srcdir)/demo-osssrc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo_osssrc-demo-osssrc.Tpo $(DEPDIR)/demo_osssrc-demo-osssrc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo-osssrc.c' object='demo_osssrc-demo-osssrc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_osssrc_CFLAGS) $(CFLAGS) -c -o demo_osssrc-demo-osssrc.obj `if test -f 'demo-osssrc.c'; then $(CYGPATH_W) 'demo-osssrc.c'; else $(CYGPATH_W) '$(srcdir)/demo-osssrc.c'; fi` + +spectrum_example-spectrum-example.o: spectrum-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(spectrum_example_CFLAGS) $(CFLAGS) -MT spectrum_example-spectrum-example.o -MD -MP -MF $(DEPDIR)/spectrum_example-spectrum-example.Tpo -c -o spectrum_example-spectrum-example.o `test -f 'spectrum-example.c' || echo '$(srcdir)/'`spectrum-example.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spectrum_example-spectrum-example.Tpo $(DEPDIR)/spectrum_example-spectrum-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spectrum-example.c' object='spectrum_example-spectrum-example.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(spectrum_example_CFLAGS) $(CFLAGS) -c -o spectrum_example-spectrum-example.o `test -f 'spectrum-example.c' || echo '$(srcdir)/'`spectrum-example.c + +spectrum_example-spectrum-example.obj: spectrum-example.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(spectrum_example_CFLAGS) $(CFLAGS) -MT spectrum_example-spectrum-example.obj -MD -MP -MF $(DEPDIR)/spectrum_example-spectrum-example.Tpo -c -o spectrum_example-spectrum-example.obj `if test -f 'spectrum-example.c'; then $(CYGPATH_W) 'spectrum-example.c'; else $(CYGPATH_W) '$(srcdir)/spectrum-example.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spectrum_example-spectrum-example.Tpo $(DEPDIR)/spectrum_example-spectrum-example.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spectrum-example.c' object='spectrum_example-spectrum-example.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(spectrum_example_CFLAGS) $(CFLAGS) -c -o spectrum_example-spectrum-example.obj `if test -f 'spectrum-example.c'; then $(CYGPATH_W) 'spectrum-example.c'; else $(CYGPATH_W) '$(srcdir)/spectrum-example.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/spectrum/demo-audiotest.c b/tests/examples/spectrum/demo-audiotest.c new file mode 100644 index 0000000..f9d1058 --- /dev/null +++ b/tests/examples/spectrum/demo-audiotest.c @@ -0,0 +1,233 @@ +/* GStreamer + * Copyright (C) 2006 Stefan Kost + * + * 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. + */ +/* TODO: add wave selection */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#ifndef DEFAULT_AUDIOSINK +#define DEFAULT_AUDIOSINK "autoaudiosink" +#endif + +static guint spect_height = 64; +static guint spect_bands = 256; +static gfloat height_scale = 1.0; + +static GtkWidget *drawingarea = NULL; +static GstClock *sync_clock = NULL; + +static void +on_window_destroy (GObject * object, gpointer user_data) +{ + drawingarea = NULL; + gtk_main_quit (); +} + +/* control audiotestsrc frequency */ +static void +on_frequency_changed (GtkRange * range, gpointer user_data) +{ + GstElement *machine = GST_ELEMENT (user_data); + gdouble value = gtk_range_get_value (range); + + g_object_set (machine, "freq", value, NULL); +} + +static gboolean +on_configure_event (GtkWidget * widget, GdkEventConfigure * event, + gpointer user_data) +{ + GstElement *spectrum = GST_ELEMENT (user_data); + + /*GST_INFO ("%d x %d", event->width, event->height); */ + spect_height = event->height; + height_scale = event->height / 64.0; + spect_bands = event->width; + + g_object_set (G_OBJECT (spectrum), "bands", spect_bands, NULL); + return FALSE; +} + +/* draw frequency spectrum as a bunch of bars */ +static void +draw_spectrum (gfloat * data) +{ + gint i; + GdkRectangle rect = { 0, 0, spect_bands, spect_height }; + cairo_t *cr; + + if (!drawingarea) + return; + + gdk_window_begin_paint_rect (gtk_widget_get_window (drawingarea), &rect); + cr = gdk_cairo_create (gtk_widget_get_window (drawingarea)); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_rectangle (cr, 0, 0, spect_bands, spect_height); + cairo_fill (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + for (i = 0; i < spect_bands; i++) { + cairo_rectangle (cr, i, -data[i], 1, spect_height + data[i]); + cairo_fill (cr); + } + cairo_destroy (cr); + + gdk_window_end_paint (gtk_widget_get_window (drawingarea)); +} + +/* process delayed message */ +static gboolean +delayed_idle_spectrum_update (gpointer user_data) +{ + draw_spectrum ((gfloat *) user_data); + g_free (user_data); + return (FALSE); +} + +static gboolean +delayed_spectrum_update (GstClock * sync_clock, GstClockTime time, + GstClockID id, gpointer user_data) +{ + if (GST_CLOCK_TIME_IS_VALID (time)) + g_idle_add (delayed_idle_spectrum_update, user_data); + else + g_free (user_data); + return (TRUE); +} + +/* receive spectral data from element message */ +static gboolean +message_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + if (message->type == GST_MESSAGE_ELEMENT) { + const GstStructure *s = gst_message_get_structure (message); + const gchar *name = gst_structure_get_name (s); + + if (strcmp (name, "spectrum") == 0) { + GstElement *spectrum = GST_ELEMENT (GST_MESSAGE_SRC (message)); + GstClockTime timestamp, duration; + GstClockTime waittime = GST_CLOCK_TIME_NONE; + + if (gst_structure_get_clock_time (s, "running-time", ×tamp) && + gst_structure_get_clock_time (s, "duration", &duration)) { + /* wait for middle of buffer */ + waittime = timestamp + duration / 2; + } else if (gst_structure_get_clock_time (s, "endtime", ×tamp)) { + waittime = timestamp; + } + if (GST_CLOCK_TIME_IS_VALID (waittime)) { + GstClockID clock_id; + GstClockTime basetime = gst_element_get_base_time (spectrum); + gfloat *spect = g_new (gfloat, spect_bands); + const GValue *list; + const GValue *value; + guint i; + + list = gst_structure_get_value (s, "magnitude"); + for (i = 0; i < spect_bands; ++i) { + value = gst_value_list_get_value (list, i); + spect[i] = height_scale * g_value_get_float (value); + } + + clock_id = + gst_clock_new_single_shot_id (sync_clock, waittime + basetime); + gst_clock_id_wait_async (clock_id, delayed_spectrum_update, + (gpointer) spect); + gst_clock_id_unref (clock_id); + } + } + } + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + GstElement *bin; + GstElement *src, *spectrum, *audioconvert, *sink; + GstBus *bus; + GtkWidget *appwindow, *vbox, *widget; + + gst_init (&argc, &argv); + gtk_init (&argc, &argv); + + bin = gst_pipeline_new ("bin"); + + src = gst_element_factory_make ("audiotestsrc", "src"); + g_object_set (G_OBJECT (src), "wave", 0, NULL); + + spectrum = gst_element_factory_make ("spectrum", "spectrum"); + g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, + "message", TRUE, NULL); + + audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); + + sink = gst_element_factory_make (DEFAULT_AUDIOSINK, "sink"); + + gst_bin_add_many (GST_BIN (bin), src, spectrum, audioconvert, sink, NULL); + if (!gst_element_link_many (src, spectrum, audioconvert, sink, NULL)) { + fprintf (stderr, "can't link elements\n"); + exit (1); + } + + bus = gst_element_get_bus (bin); + gst_bus_add_watch (bus, message_handler, NULL); + gst_object_unref (bus); + + sync_clock = gst_pipeline_get_clock (GST_PIPELINE (bin)); + + appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (G_OBJECT (appwindow), "destroy", + G_CALLBACK (on_window_destroy), NULL); + vbox = gtk_vbox_new (FALSE, 6); + + widget = gtk_hscale_new_with_range (50.0, 20000.0, 10); + gtk_scale_set_draw_value (GTK_SCALE (widget), TRUE); + gtk_scale_set_value_pos (GTK_SCALE (widget), GTK_POS_TOP); + gtk_range_set_value (GTK_RANGE (widget), 440.0); + g_signal_connect (G_OBJECT (widget), "value-changed", + G_CALLBACK (on_frequency_changed), (gpointer) src); + gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); + + drawingarea = gtk_drawing_area_new (); + gtk_widget_set_size_request (drawingarea, spect_bands, spect_height); + g_signal_connect (G_OBJECT (drawingarea), "configure-event", + G_CALLBACK (on_configure_event), (gpointer) spectrum); + gtk_box_pack_start (GTK_BOX (vbox), drawingarea, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (appwindow), vbox); + gtk_widget_show_all (appwindow); + + gst_element_set_state (bin, GST_STATE_PLAYING); + gtk_main (); + gst_element_set_state (bin, GST_STATE_NULL); + + gst_object_unref (sync_clock); + gst_object_unref (bin); + + return 0; +} diff --git a/tests/examples/spectrum/demo-osssrc.c b/tests/examples/spectrum/demo-osssrc.c new file mode 100644 index 0000000..f8fee78 --- /dev/null +++ b/tests/examples/spectrum/demo-osssrc.c @@ -0,0 +1,208 @@ +/* GStreamer + * Copyright (C) 2006 Stefan Kost + * + * 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 +#include +#include +#include +#include +#include + +#ifndef DEFAULT_AUDIOSRC +#define DEFAULT_AUDIOSRC "alsasrc" +#endif + +static guint spect_height = 64; +static guint spect_bands = 256; +static gfloat height_scale = 1.0; + +static GtkWidget *drawingarea = NULL; +static GstClock *sync_clock = NULL; + +static void +on_window_destroy (GObject * object, gpointer user_data) +{ + drawingarea = NULL; + gtk_main_quit (); +} + +static gboolean +on_configure_event (GtkWidget * widget, GdkEventConfigure * event, + gpointer user_data) +{ + GstElement *spectrum = GST_ELEMENT (user_data); + + /*GST_INFO ("%d x %d", event->width, event->height); */ + spect_height = event->height; + height_scale = event->height / 64.0; + spect_bands = event->width; + + g_object_set (G_OBJECT (spectrum), "bands", spect_bands, NULL); + return FALSE; +} + +/* draw frequency spectrum as a bunch of bars */ +static void +draw_spectrum (gfloat * data) +{ + gint i; + GdkRectangle rect = { 0, 0, spect_bands, spect_height }; + cairo_t *cr; + + if (!drawingarea) + return; + + gdk_window_begin_paint_rect (gtk_widget_get_window (drawingarea), &rect); + cr = gdk_cairo_create (gtk_widget_get_window (drawingarea)); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_rectangle (cr, 0, 0, spect_bands, spect_height); + cairo_fill (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + for (i = 0; i < spect_bands; i++) { + cairo_rectangle (cr, i, -data[i], 1, spect_height + data[i]); + cairo_fill (cr); + } + cairo_destroy (cr); + + gdk_window_end_paint (gtk_widget_get_window (drawingarea)); +} + +/* process delayed message */ +static gboolean +delayed_idle_spectrum_update (gpointer user_data) +{ + draw_spectrum ((gfloat *) user_data); + g_free (user_data); + return (FALSE); +} + +static gboolean +delayed_spectrum_update (GstClock * sync_clock, GstClockTime time, + GstClockID id, gpointer user_data) +{ + if (GST_CLOCK_TIME_IS_VALID (time)) + g_idle_add (delayed_idle_spectrum_update, user_data); + else + g_free (user_data); + return (TRUE); +} + +/* receive spectral data from element message */ +static gboolean +message_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + if (message->type == GST_MESSAGE_ELEMENT) { + const GstStructure *s = gst_message_get_structure (message); + const gchar *name = gst_structure_get_name (s); + + if (strcmp (name, "spectrum") == 0) { + GstElement *spectrum = GST_ELEMENT (GST_MESSAGE_SRC (message)); + GstClockTime timestamp, duration; + GstClockTime waittime = GST_CLOCK_TIME_NONE; + + if (gst_structure_get_clock_time (s, "running-time", ×tamp) && + gst_structure_get_clock_time (s, "duration", &duration)) { + /* wait for middle of buffer */ + waittime = timestamp + duration / 2; + } else if (gst_structure_get_clock_time (s, "endtime", ×tamp)) { + waittime = timestamp; + } + if (GST_CLOCK_TIME_IS_VALID (waittime)) { + GstClockID clock_id; + GstClockTime basetime = gst_element_get_base_time (spectrum); + gfloat *spect = g_new (gfloat, spect_bands); + const GValue *list; + const GValue *value; + guint i; + + list = gst_structure_get_value (s, "magnitude"); + for (i = 0; i < spect_bands; ++i) { + value = gst_value_list_get_value (list, i); + spect[i] = height_scale * g_value_get_float (value); + } + + clock_id = + gst_clock_new_single_shot_id (sync_clock, waittime + basetime); + gst_clock_id_wait_async (clock_id, delayed_spectrum_update, + (gpointer) spect); + gst_clock_id_unref (clock_id); + } + } + } + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + GstElement *bin; + GstElement *src, *spectrum, *sink; + GstBus *bus; + GtkWidget *appwindow; + + gst_init (&argc, &argv); + gtk_init (&argc, &argv); + + bin = gst_pipeline_new ("bin"); + + src = gst_element_factory_make (DEFAULT_AUDIOSRC, "src"); + + spectrum = gst_element_factory_make ("spectrum", "spectrum"); + g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, + "message", TRUE, NULL); + + sink = gst_element_factory_make ("fakesink", "sink"); + + gst_bin_add_many (GST_BIN (bin), src, spectrum, sink, NULL); + if (!gst_element_link_many (src, spectrum, sink, NULL)) { + fprintf (stderr, "can't link elements\n"); + exit (1); + } + + bus = gst_element_get_bus (bin); + gst_bus_add_watch (bus, message_handler, NULL); + gst_object_unref (bus); + + sync_clock = gst_pipeline_get_clock (GST_PIPELINE (bin)); + + appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (G_OBJECT (appwindow), "destroy", + G_CALLBACK (on_window_destroy), NULL); + + drawingarea = gtk_drawing_area_new (); + gtk_widget_set_size_request (drawingarea, spect_bands, spect_height); + g_signal_connect (G_OBJECT (drawingarea), "configure-event", + G_CALLBACK (on_configure_event), (gpointer) spectrum); + gtk_container_add (GTK_CONTAINER (appwindow), drawingarea); + gtk_widget_show_all (appwindow); + + gst_element_set_state (bin, GST_STATE_PLAYING); + gtk_main (); + gst_element_set_state (bin, GST_STATE_NULL); + + gst_object_unref (sync_clock); + gst_object_unref (bin); + + return 0; +} diff --git a/tests/examples/spectrum/spectrum-example.c b/tests/examples/spectrum/spectrum-example.c new file mode 100644 index 0000000..b552921 --- /dev/null +++ b/tests/examples/spectrum/spectrum-example.c @@ -0,0 +1,124 @@ +/* GStreamer + * Copyright (C) 2006 Stefan Kost + * Copyright (C) 2008 Jan Schmidt + * + * 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 +#include +#include +#include + +static guint spect_bands = 20; + +#define AUDIOFREQ 32000 + +/* receive spectral data from element message */ +static gboolean +message_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + if (message->type == GST_MESSAGE_ELEMENT) { + const GstStructure *s = gst_message_get_structure (message); + const gchar *name = gst_structure_get_name (s); + GstClockTime endtime; + + if (strcmp (name, "spectrum") == 0) { + const GValue *magnitudes; + const GValue *phases; + const GValue *mag, *phase; + gdouble freq; + guint i; + + if (!gst_structure_get_clock_time (s, "endtime", &endtime)) + endtime = GST_CLOCK_TIME_NONE; + + g_print ("New spectrum message, endtime %" GST_TIME_FORMAT "\n", + GST_TIME_ARGS (endtime)); + + magnitudes = gst_structure_get_value (s, "magnitude"); + phases = gst_structure_get_value (s, "phase"); + + for (i = 0; i < spect_bands; ++i) { + freq = (gdouble) ((AUDIOFREQ / 2) * i + AUDIOFREQ / 4) / spect_bands; + mag = gst_value_list_get_value (magnitudes, i); + phase = gst_value_list_get_value (phases, i); + + if (mag != NULL && phase != NULL) { + g_print ("band %d (freq %g): magnitude %f dB phase %f\n", i, freq, + g_value_get_float (mag), g_value_get_float (phase)); + } + } + g_print ("\n"); + } + } + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + GstElement *bin; + GstElement *src, *audioconvert, *spectrum, *sink; + GstBus *bus; + GstCaps *caps; + GMainLoop *loop; + + gst_init (&argc, &argv); + + bin = gst_pipeline_new ("bin"); + + src = gst_element_factory_make ("audiotestsrc", "src"); + g_object_set (G_OBJECT (src), "wave", 0, "freq", 6000.0, NULL); + audioconvert = gst_element_factory_make ("audioconvert", NULL); + g_assert (audioconvert); + + spectrum = gst_element_factory_make ("spectrum", "spectrum"); + g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, + "message", TRUE, "message-phase", TRUE, NULL); + + sink = gst_element_factory_make ("fakesink", "sink"); + g_object_set (G_OBJECT (sink), "sync", TRUE, NULL); + + gst_bin_add_many (GST_BIN (bin), src, audioconvert, spectrum, sink, NULL); + + caps = gst_caps_new_simple ("audio/x-raw-int", + "rate", G_TYPE_INT, AUDIOFREQ, NULL); + + if (!gst_element_link (src, audioconvert) || + !gst_element_link_filtered (audioconvert, spectrum, caps) || + !gst_element_link (spectrum, sink)) { + fprintf (stderr, "can't link elements\n"); + exit (1); + } + gst_caps_unref (caps); + + bus = gst_element_get_bus (bin); + gst_bus_add_watch (bus, message_handler, NULL); + gst_object_unref (bus); + + gst_element_set_state (bin, GST_STATE_PLAYING); + + /* we need to run a GLib main loop to get the messages */ + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + gst_element_set_state (bin, GST_STATE_NULL); + + gst_object_unref (bin); + + return 0; +} diff --git a/tests/examples/v4l2/Makefile.am b/tests/examples/v4l2/Makefile.am new file mode 100644 index 0000000..4fdb7e3 --- /dev/null +++ b/tests/examples/v4l2/Makefile.am @@ -0,0 +1,10 @@ +noinst_PROGRAMS = probe camctrl + +camctrl_SOURCES = camctrl.c +camctrl_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) +camctrl_LDADD = $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) + +probe_SOURCES = probe.c +probe_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +probe_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_BASE_LIBS) $(GST_LIBS) + diff --git a/tests/examples/v4l2/Makefile.in b/tests/examples/v4l2/Makefile.in new file mode 100644 index 0000000..cd89368 --- /dev/null +++ b/tests/examples/v4l2/Makefile.in @@ -0,0 +1,780 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = probe$(EXEEXT) camctrl$(EXEEXT) +subdir = tests/examples/v4l2 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_camctrl_OBJECTS = camctrl-camctrl.$(OBJEXT) +camctrl_OBJECTS = $(am_camctrl_OBJECTS) +am__DEPENDENCIES_1 = +camctrl_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +camctrl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(camctrl_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_probe_OBJECTS = probe-probe.$(OBJEXT) +probe_OBJECTS = $(am_probe_OBJECTS) +probe_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +probe_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(probe_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(camctrl_SOURCES) $(probe_SOURCES) +DIST_SOURCES = $(camctrl_SOURCES) $(probe_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +camctrl_SOURCES = camctrl.c +camctrl_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) +camctrl_LDADD = $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) +probe_SOURCES = probe.c +probe_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +probe_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_BASE_LIBS) $(GST_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/v4l2/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/examples/v4l2/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +camctrl$(EXEEXT): $(camctrl_OBJECTS) $(camctrl_DEPENDENCIES) $(EXTRA_camctrl_DEPENDENCIES) + @rm -f camctrl$(EXEEXT) + $(AM_V_CCLD)$(camctrl_LINK) $(camctrl_OBJECTS) $(camctrl_LDADD) $(LIBS) +probe$(EXEEXT): $(probe_OBJECTS) $(probe_DEPENDENCIES) $(EXTRA_probe_DEPENDENCIES) + @rm -f probe$(EXEEXT) + $(AM_V_CCLD)$(probe_LINK) $(probe_OBJECTS) $(probe_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camctrl-camctrl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/probe-probe.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +camctrl-camctrl.o: camctrl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(camctrl_CFLAGS) $(CFLAGS) -MT camctrl-camctrl.o -MD -MP -MF $(DEPDIR)/camctrl-camctrl.Tpo -c -o camctrl-camctrl.o `test -f 'camctrl.c' || echo '$(srcdir)/'`camctrl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/camctrl-camctrl.Tpo $(DEPDIR)/camctrl-camctrl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='camctrl.c' object='camctrl-camctrl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(camctrl_CFLAGS) $(CFLAGS) -c -o camctrl-camctrl.o `test -f 'camctrl.c' || echo '$(srcdir)/'`camctrl.c + +camctrl-camctrl.obj: camctrl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(camctrl_CFLAGS) $(CFLAGS) -MT camctrl-camctrl.obj -MD -MP -MF $(DEPDIR)/camctrl-camctrl.Tpo -c -o camctrl-camctrl.obj `if test -f 'camctrl.c'; then $(CYGPATH_W) 'camctrl.c'; else $(CYGPATH_W) '$(srcdir)/camctrl.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/camctrl-camctrl.Tpo $(DEPDIR)/camctrl-camctrl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='camctrl.c' object='camctrl-camctrl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(camctrl_CFLAGS) $(CFLAGS) -c -o camctrl-camctrl.obj `if test -f 'camctrl.c'; then $(CYGPATH_W) 'camctrl.c'; else $(CYGPATH_W) '$(srcdir)/camctrl.c'; fi` + +probe-probe.o: probe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(probe_CFLAGS) $(CFLAGS) -MT probe-probe.o -MD -MP -MF $(DEPDIR)/probe-probe.Tpo -c -o probe-probe.o `test -f 'probe.c' || echo '$(srcdir)/'`probe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/probe-probe.Tpo $(DEPDIR)/probe-probe.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='probe.c' object='probe-probe.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(probe_CFLAGS) $(CFLAGS) -c -o probe-probe.o `test -f 'probe.c' || echo '$(srcdir)/'`probe.c + +probe-probe.obj: probe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(probe_CFLAGS) $(CFLAGS) -MT probe-probe.obj -MD -MP -MF $(DEPDIR)/probe-probe.Tpo -c -o probe-probe.obj `if test -f 'probe.c'; then $(CYGPATH_W) 'probe.c'; else $(CYGPATH_W) '$(srcdir)/probe.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/probe-probe.Tpo $(DEPDIR)/probe-probe.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='probe.c' object='probe-probe.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(probe_CFLAGS) $(CFLAGS) -c -o probe-probe.obj `if test -f 'probe.c'; then $(CYGPATH_W) 'probe.c'; else $(CYGPATH_W) '$(srcdir)/probe.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/examples/v4l2/camctrl.c b/tests/examples/v4l2/camctrl.c new file mode 100644 index 0000000..3c7262a --- /dev/null +++ b/tests/examples/v4l2/camctrl.c @@ -0,0 +1,213 @@ +/* GStreamer + * Copyright (C) 2010 Stefan Kost + * + * 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. + */ +/* demo for using gstcontroler with camera capture for e.g. bracketing + * + * gcc `pkg-config --cflags --libs gstreamer-0.10 gstreamer-controller-0.10` camctrl.c -o camctrl + * + * TODO: + * - handle stream status and switch capture thread to SCHED_RR/FIFO + * - the queue-size controls the controler offset + * - right now we work with 1 queued picture and thus active settings for next + * frame + * - we want some feedback about how precisely a program can be realized + * - we might want to adjust the framerate to handle hardware limmits + * - we e.g. can't change resolution per frame right now + */ + +#include +#include +#include + +static void +event_loop (GstElement * bin) +{ + GstBus *bus; + GstMessage *message = NULL; + + bus = gst_element_get_bus (GST_ELEMENT (bin)); + + while (TRUE) { + message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1); + + switch (message->type) { + case GST_MESSAGE_EOS: + gst_message_unref (message); + return; + case GST_MESSAGE_WARNING: + case GST_MESSAGE_ERROR:{ + GError *gerror; + gchar *debug; + + gst_message_parse_error (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + gst_message_unref (message); + g_error_free (gerror); + g_free (debug); + return; + } + default: + gst_message_unref (message); + break; + } + } +} + +static void +set_program (GstController * ctrl, GstStructure * prog) +{ + const GstStructure *s; + GstInterpolationControlSource *cs; + GstClockTime ts, dur; + GValue val = { 0, }; + gint v; + const GValue *frame; + GHashTable *css; + gint i, j; + const gchar *name; + + css = g_hash_table_new (g_str_hash, g_str_equal); + + g_value_init (&val, G_TYPE_INT); + + ts = 0; + dur = gst_util_uint64_scale_int (GST_SECOND, 1, 15); + + /* loop over each image in prog */ + for (i = 0; i < gst_structure_n_fields (prog); i++) { + GST_DEBUG ("ctrl on %" GST_TIME_FORMAT, GST_TIME_ARGS (ts)); + + frame = + gst_structure_get_value (prog, gst_structure_nth_field_name (prog, i)); + s = gst_value_get_structure (frame); + for (j = 0; j < gst_structure_n_fields (s); j++) { + name = gst_structure_nth_field_name (s, j); + cs = g_hash_table_lookup (css, name); + if (!cs) { + cs = gst_interpolation_control_source_new (); + gst_controller_set_control_source (ctrl, name, GST_CONTROL_SOURCE (cs)); + gst_interpolation_control_source_set_interpolation_mode (cs, + GST_INTERPOLATE_NONE); + g_hash_table_insert (css, (gpointer) name, cs); + g_object_unref (cs); + } + gst_structure_get_int (s, name, &v); + g_value_set_int (&val, v); + gst_interpolation_control_source_set (cs, ts, &val); + GST_DEBUG (" %s = %d", name, v); + } + ts += dur; + } + + g_value_unset (&val); + + g_hash_table_unref (css); +} + +gint +main (gint argc, gchar ** argv) +{ + GstElement *bin; + GstElement *src, *fmt, *enc, *sink; + GstCaps *caps; + GstController *ctrl; + GstStructure *prog; + + /* init gstreamer */ + gst_init (&argc, &argv); + gst_controller_init (&argc, &argv); + + /* create a new bin to hold the elements */ + bin = gst_pipeline_new ("camera"); + + /* create elements */ + if (!(sink = gst_element_factory_make ("multifilesink", NULL))) { + GST_WARNING ("Can't create element \"multifilesink\""); + return -1; + } + g_object_set (sink, "location", "image%02d.jpg", NULL); + + if (!(enc = gst_element_factory_make ("jpegenc", NULL))) { + GST_WARNING ("Can't create element \"jpegenc\""); + return -1; + } + + if (!(fmt = gst_element_factory_make ("capsfilter", NULL))) { + GST_WARNING ("Can't create element \"capsfilter\""); + return -1; + } + caps = + gst_caps_from_string + ("video/x-raw-yuv, width=640, height=480, framerate=(fraction)15/1"); + g_object_set (fmt, "caps", caps, NULL); + + if (!(src = gst_element_factory_make ("v4l2src", NULL))) { + GST_WARNING ("Can't create element \"v4l2src\""); + return -1; + } + g_object_set (src, "queue-size", 1, NULL); + + /* add objects to the main bin */ + gst_bin_add_many (GST_BIN (bin), src, fmt, enc, sink, NULL); + + /* link elements */ + if (!gst_element_link_many (src, fmt, enc, sink, NULL)) { + GST_WARNING ("Can't link elements"); + return -1; + } + + /* get the controller */ + if (!(ctrl = gst_controller_new (G_OBJECT (src), "brightness", "contrast", + "saturation", NULL))) { + GST_WARNING ("can't control source element"); + return -1; + } + + /* programm a pattern of events */ +#if 0 + prog = gst_structure_from_string ("program" + ", image00=(structure)\"image\\,contrast\\=0\\;\"" + ", image01=(structure)\"image\\,contrast\\=79\\;\"" + ", image02=(structure)\"image\\,contrast\\=255\\;\"" + ", image03=(structure)\"image\\,contrast\\=15\\;\";", NULL); +#endif +#if 1 + prog = gst_structure_from_string ("program" + ", image00=(structure)\"image\\,brightness\\=255\\,contrast\\=0\\;\"" + ", image01=(structure)\"image\\,brightness\\=127\\,contrast\\=79\\;\"" + ", image02=(structure)\"image\\,brightness\\=64\\,contrast\\=255\\;\"" + ", image03=(structure)\"image\\,brightness\\=0\\,contrast\\=15\\;\";", + NULL); +#endif + set_program (ctrl, prog); + g_object_set (src, "num-buffers", gst_structure_n_fields (prog), NULL); + + /* prepare playback */ + gst_element_set_state (bin, GST_STATE_PAUSED); + + /* play and wait */ + gst_element_set_state (bin, GST_STATE_PLAYING); + + /* mainloop and wait for eos */ + event_loop (bin); + + /* stop and cleanup */ + gst_element_set_state (bin, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (bin)); + return 0; +} diff --git a/tests/examples/v4l2/probe.c b/tests/examples/v4l2/probe.c new file mode 100644 index 0000000..169288a --- /dev/null +++ b/tests/examples/v4l2/probe.c @@ -0,0 +1,85 @@ +/* GStreamer + * Copyright (C) 2009 Filippo Argiolas + * + * 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 +#include +#include + +int +main (int argc, char *argv[]) +{ + GstElement *src, *sink; + GstElement *bin; + GstPropertyProbe *probe = NULL; + const GParamSpec *pspec = NULL; + GValueArray *array = NULL; + gint i, ret; + GValue *value; + const gchar *device; + gchar *name; + guint flags; + + gst_init (&argc, &argv); + + bin = gst_pipeline_new ("pipeline"); + g_assert (bin); + + src = gst_element_factory_make ("v4l2src", "v4l2_source"); + g_assert (src); + sink = gst_element_factory_make ("fakesink", "fake_sink"); + g_assert (sink); + + /* add objects to the main pipeline */ + gst_bin_add_many (GST_BIN (bin), src, sink, NULL); + /* link the elements */ + gst_element_link_many (src, sink, NULL); + + /* probe devices */ + g_print ("Probing devices with propertyprobe...\n"); + probe = GST_PROPERTY_PROBE (src); + pspec = gst_property_probe_get_property (probe, "device"); + array = gst_property_probe_probe_and_get_values (probe, pspec); + + if (!array) { + g_print ("No device found\n"); + exit (1); + } + + for (i = 0; i < array->n_values; i++) { + value = g_value_array_get_nth (array, i); + device = g_value_get_string (value); + g_print ("Device: %s\n", device); + g_object_set_property (G_OBJECT (src), "device", value); + gst_element_set_state (bin, GST_STATE_READY); + ret = gst_element_get_state (bin, NULL, NULL, 10 * GST_SECOND); + if (ret != GST_STATE_CHANGE_SUCCESS) { + g_print ("Couldn't set STATE_READY\n"); + continue; + } + g_object_get (G_OBJECT (src), "device-name", &name, NULL); + g_print ("Name: %s\n", name); + g_free (name); + g_object_get (G_OBJECT (src), "flags", &flags, NULL); + g_print ("Flags: 0x%08X\n", flags); + gst_element_set_state (bin, GST_STATE_NULL); + g_print ("\n"); + } + + exit (0); +} diff --git a/tests/files/Makefile.am b/tests/files/Makefile.am new file mode 100644 index 0000000..ae08e1a --- /dev/null +++ b/tests/files/Makefile.am @@ -0,0 +1,13 @@ + +EXTRA_DIST = \ + audiotestsrc.flac \ + id3-407349-1.tag \ + id3-407349-2.tag \ + id3-447000-wcop.tag \ + id3-577468-unsynced-tag.tag \ + id3-588148-unsynced-v24.tag \ + pcm16sine.flv \ + pinknoise-vorbis.mkv \ + test-cert.pem \ + test-key.pem + diff --git a/tests/files/Makefile.in b/tests/files/Makefile.in new file mode 100644 index 0000000..c80640f --- /dev/null +++ b/tests/files/Makefile.in @@ -0,0 +1,616 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = tests/files +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO_CFLAGS = @GIO_CFLAGS@ +GIO_LIBS = @GIO_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ +PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + audiotestsrc.flac \ + id3-407349-1.tag \ + id3-407349-2.tag \ + id3-447000-wcop.tag \ + id3-577468-unsynced-tag.tag \ + id3-588148-unsynced-v24.tag \ + pcm16sine.flv \ + pinknoise-vorbis.mkv \ + test-cert.pem \ + test-key.pem + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/files/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/files/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tests/files/audiotestsrc.flac b/tests/files/audiotestsrc.flac new file mode 100644 index 0000000000000000000000000000000000000000..2f12c3f7667d59f82036609e3a80d5ddd0886f9c GIT binary patch literal 4708 zcmds5?Nb})y(L)HEM$AHWMNn_ZbxEaWdRbq3aX8bI|0Fhj0EK+#JpD8Xl-6x6JtV5 zZk(w>RwT407UD%H;MO2y6ax+d83WD>8qr9?PHh?EV1hGY1T_ZQhS<-x-67t+q2=LQz&x?Nz3E3BNsqFCYKmTs% z^y0TmeStSJyR;!8IFDXhPaY%d$&;^;yc5*~u1J&dFtJ38@gyj^A5FpbKS!^Lrk{+= zLRo?QS4Hx?+{5bEG}Uzt*_}GyKhQ>kW`3S1AfYh4EX1d_9E@5UD)cs z3ymV>7gZmzM`WQ)}%VGc)>;V*^5%yAG)ePBZMPT~b*!nefbCO^QKEDzcewF)MB zyuQ>*GrN`0PzW4@T94`&km70rQjY8A$9{^;R8m(o*kO!`$f5=SH8aXXY$ObVK5mJi1V#)_g4w1HGMeXxboqMXO__Lr0Z}~nv-djOm?YrrN2ghCmthcM5muI( zTYoBg3WRYM5v7OV2bFdgbe*Nr!Euk%n(NCEn~THAT(xpM0RjV&8P?tCU{wpJjHPcV^&)+E%brI{!-c91=EsYrG1+^(=iito|Xtn+P};JxhmzzGI3 z(Q1x5V(3f&{OuN;-I;;%R5EdXGZ*?OadsE5nwq6STL4stc>WBR{04a3)4(@CILBR6 z;Q6vC$5^VkL0Qs_mb7-sLmcPp$&}P_VCV1Ba^${YPHx*4Bo|JiejX2s+7}_%{c_4JTJd zj&uoXvmMDJ%kD!JF$dmejR<^eq$#Sg;nI<|Puu^|xkscgIQw*Z><=j-`Lb>5m&>aW zerx}`i{r&ljrO5nagi%3X2Cc)M66YMz2{y+&U-l%*7bcxlVZEXcdYYf z&i><)h1ORlTu~K!jY#9pS<%X#zPR>^#?yy{tpTNPJu~M0TQH!yBy1%JEZH)?J6RS5 z@l-lIUr(+)sP>I|7pUB9m5w!MQ%g{shVqbIB+5ww7A%(ph*DX|Z)UQu@eN~KungYk zAvdB$29p6~+bEVB)dBtzjmNW~aCIB(T4-Vw;t|&sI>D%BTOz@ty=t&5cCGs|Gi=pj zu_8zZ9;=peGEiLMJOKOjKwyVu>{~+lU;cN;{kZ@5krP*RpLb zKiSc&L6__U`~1*Huzt~M(ZK+T(yt%H=(%#6h6Escl29ru13Ya5Gh=-rQ3?>}4(uD{w zGuhn&_SK8-WHnRp!x=3bV**WY zm3uFaj}p;%t}>bW0QvYu!soymXd=B&Ip_hvEux1dL$U_(O~##DEVK>wG|B*))5M9~ zRcY6qHbZwhWYVfrk-@~=sE!*h+q~YVg{HJzSY*=>kgm`?kG_*+e#!FyAa3B=s)0~0 z5{vR?rE&}d*=~q8%Vc->+@Q%^aZgY^S{?0Om24~coeu1PlGy1gHFOF!bMI$ygnCsA z1IhwWiu%wAve0pn7A*9fY0KBv`~1$JmF2OD>3Si{O>^WdXj5r5p5Xjq@09IS^q;*| zI=&HYGYisF%}0CtB{VT~fLaRN>E)ke#s+YNMNFaJ&$k5+241uCuiA5`@d`5@x+~_X z<)(9$_$xI?5U1vNEdmsz-tOy{n?VT$(;TMYp|eU zqhDWerd!xGn7O<;-ISkS_?O|Wf`?J>GmWnJqkSVWw!mZ^u-%|v-J3q~J3(hxM#WN~DgMyGoWB(nUFXaHJMiQa zDCiQLY!CiVoxU)>rnRp0c3D7d9Wa#?ER-7y#E<%~beF{^E_#Gr+y5mDKdu-NJH&xn zOTRet1=sO7Yw=f!E4}jt!nVLdMMHgJ&$937WJ7U7m;AM*TU+)7`F=r9MC(0M_WH9c z)yvMwWmoaM>ERr9>#<``U!v1TKB^lYnkMUhaXRH^qyF4hGRGu;Du1}$a9J%;2SFY?C?`iZOkGY8d%d7Ser}#hT!xMibs{Q}x!#O_^ z)z&F;6(3a3TeH}sTRJ@fjRPB!2G}Px_~`(pqh*`(s|#UnI_fB62{kjp{C^fkA!GT! zC8DP_n>KPOS;dni$&K@3Bnj{rBLW6iqgTD?{dZ)v>6Sx!q;KXdXYjtL?nA=$2)1k| z<+eTAJlOPlW+r)mZ`%X=*F}?zY;bQKCJOCYF$vIIr< z?I!)46Bn0YkdxHUIdVja6aW>EMQ5YGMso8FPiiF8W#i6)3)K!if$9nY0;Pss26r_a zPFRLV*sZIikNNyp(F-V#sJ&P55R2B_)%!+q(Z7HV|4#AUHx3}Q68e*H`{dW3e47xG z{tZ=OaFBD3f({EVG-zo!nY3RWizS1EMDl&kr}2b=d2~=wwXn5NrK`Y#Bc;VfcvL#Q zC&>e$U|~84i*w%7_jO!7U^kjXj*lTlk-0&?03Vy6&r*R-m+L<5|kIyAd0l*t)^WP0!YTe57Q z&u;3reFlIfQbgRzi7#e%#-S7(Phjk=K!6{Yo|5a(%W#!UcADgmADW=*l=aRe7!qUy@fp8^V)+cd?va$!*{jl(i+4d;r21z_ zuC@soOUcmStXYudu3=w3Kqr2=jZ*OD>eb(G28}uHuNAVF6@3lV3_>xOnHyLW`P-7o F{{_i+)i(eD literal 0 HcmV?d00001 diff --git a/tests/files/id3-407349-1.tag b/tests/files/id3-407349-1.tag new file mode 100644 index 0000000000000000000000000000000000000000..47a27634af29989f8ebbe3b5226bb3068e1656b3 GIT binary patch literal 304 wcmeZtF=l1}0w$Rd7sn7FgB6I4j19~}B3*-^TtiE9b0BjBga5w+jzGK*0H?DE4gdfE literal 0 HcmV?d00001 diff --git a/tests/files/id3-407349-2.tag b/tests/files/id3-407349-2.tag new file mode 100644 index 0000000000000000000000000000000000000000..d44a9a1d03b7ee400d1a4a44d66e80afbded2059 GIT binary patch literal 304 wcmeZtF=l1}0w$S|NY@}BgB6GkEzQkCTpUB7Tq9!xGaz#Wga5w+jzGK*0IAOi4gdfE literal 0 HcmV?d00001 diff --git a/tests/files/id3-447000-wcop.tag b/tests/files/id3-447000-wcop.tag new file mode 100644 index 0000000000000000000000000000000000000000..0f81c260b4fe3743dc4f13274dc983c6645c3cbb GIT binary patch literal 360 zcmb7=!Ab)$5Qam0@*sjwFn3|o+MBnyZKb%{#SM0EWt$yspqnhoY+>KV_w=Bn?SfYa zevjV!byGS0l0I@fVoh~fmV92bQoVgpdA2Bu?ObUkCcG$T-w82>flVN@ z23^D&$OG*W+HQB?1f8on*Xw&NH}7!Z#`5r jP=t{ZMmDFtH$wbl+-9wo9G1W93=PxR{8L|_AHUr9u^_&yM{$}IAN9D01*+<6BQH{B&aCjmO$7+*+dk?03xdx zL=+G(gdGF}BC@FgJc@`K6crWadfu(Nf4x`t|5v}B>YnbNp01g$>6)sp_HZ$S11tat z^mL?oI0JyrQvd)CM(#Nfw&}pZ{eSo^9&T3Fd-4Gu@C^Vyk5k%OAGEO1mX?;MPMunA z#$Udi@8;(Ac>uTcdi?Hb)ZpOYlP9AzbHs2C=5iRauemTVFz~>E1Ec+o-#)*cDaF+s zLnZ|wzJLF&qoezE0>9XW6IS{wC@9>ynf3MS7Z?n_)B+9EMy)&`EKJmY`0)NxQpDZ6 zcdIhDjpj>yc}AL@6$x@TjbFw7{Qil}W*>4!OkKm(f ze(~bP2`~8TfByO0Lg?=9ZcI1*(n>6iK(;pCJh!k08M(BJ1sykicWx2%9e)*4& z2m==|i}kpg+M3t5u$h^eKY#w5?#i7hMGs^k_#DLhyEq3ug!n!*S0&Mvg1YcG@JMRN8~z-w#>AjY|e#tIiPY6DNh!o`HAS6Ta*`f zeU}<=Z{EClRe|F3A1*cE3z@hN?Kou_#N71I=N6)_GV-5VTwC*f=`CK zn(D56YJ-xKlO{@W(-krgQ{)SxmAbk*TZ`o9Dxk7c_}v~_eLbDeu1mgefq(q?@z?LQ z<$Bm$EoNqBCU&Rh@84^WA3t8Yh5T>_^{N_rc^kKQkHGKfN)3|~-zVtFGY$=bj4kF*ZV&(Hs>GBPsyGyP^Vncu#B`}OO0UtjO^^z_$usn6{j+RlS_ z&dK}w`kI)Sd=lX9-@o5ejOW$!Zr9yjRA=jTC+e^(uZ#aZ*VCs@r^bbyodWgmh(9R;07n0ke{%%DtOJ0Dgo-mrAit?NoISG2iBMMUL+gtew0$ub)7L6n8)XuDBjDW>>DVu8qIA{ zkV1tn2xoVp84JUw%!Fkw4WUE(4R*C0*Mh?osqWW28xNr*nz(yH2O14sGs?AOYdr7O zj)A@r5nl%Gz3&J;vb)vH>%I|B;ZSbN^XV^h@n8)6@(^>M@ykw=%i6Xk+j;ZVbz>UE zkm-)wr!Kx5HVpI*+ID0%$GFTpc<&u*nCTPaCv4^W*9t1yaapx@-zW9YfdP?$6Az#P zf(k9aq#+`tG0M;~)(`ga#VtwqEK%C3?PGtlaIf~((|4Hl*SD_&Up9WtjS?Fhy51J(mU1s!n{9&(Om;+WVVQ`_U@z1y@(%N_x@zjW=0^&cuD zB%6Ma8^T-8tr94P?E!A-Vb>bGGhFXH4auQP1U$0s2AY*3w|)5Mk<1L^N;!pwdhN;H zbMKNjVc(U5f1{Ualdt{z*EB0q-V;w%`1g~WE6%>i_^P{oq*bVVwY8*qGXLP{W`16> z=_T)!9r=FHVg7Mq731^T2`cJ(ATmSwL?CuF`3Gq&T-) zwYWv$spYm?AL&5`+X!xyl1wsiZ1@Np|Gmb0i@tLpdSKOZ+_o$GX=%d?m$@#yB}s(c z&xiQMJA7AdB3+*bZU#Wh%1#0pCNCqp;vcQqf%7FX;WD}_02-W*3x0+hX~jKp9rwM| zfwM#aTdZ_jSp-ZNkh;NgR!NBKSX}k@v|1{{!4AZnny>4WMjoy)^j-P%7`BdJ@No}Z zgQ21K{Eieo>sp=@!G1-$zlW@Xb3%-eFvqqG2Wdt$Y+8Z!5>`a4PPJcF+s6Tv5vx)aihu?KjJFoy%~^M7Ux1bZytM+Xr7~6g^viyp zXh>j9+7(>d!wT+Seg6RA%bg#P*&-3V9d(4S`oL*~MA^29?HO}HrddbEXA_w@d2rP- zFAGWuh@n!ox}hr&{CsXq^~w{?yf(TwSFPPr3MiA8De`xVWBIjPn!Gc50VECP_{Ez( zMUr0Eyma}X3+ZTS?j@60hEoc9#+N#DXBJqNE|=4*!ae^U7NjTx0hbAD>~qpa?xthW z_J_xO4EU8>_fW#BL$vyg(0mMGof4jZGGb$rlt+^G&AqH}B0tdL&=xBqJ9$@7w8GbL zKm(JNi7W{7fkI~wS#VrZS~poB05rbF6sHsd?l^o;qPAoD~&O zrgjyGm-1&Kw*{#q?%wzZWx+=t6{<_TrBX3_>v8I}WX*Cb#x88Gcak|=$s5i#C5@mk z7yw7WbZ>TMtq)Nm$P&i^78P9$Ly*-sF6|cqtQQ zAeJedzTr$o+9246sBjFGztMRXI4TgByw9n0n$wosJJAV)(c+crc!=PTT;epM66+r9 zFITiusp|@}9_M5CVUnn(J}G9UQYM84qGJ6NCyh1H2r=UG_2aY-Vh-r_aelO@{?>>jwMdj?r^J|b&(M~Gymcpdk+bqFm8 zCX&iP8&aqIp`9!kb?)Bh@&r^9G2Ky*j5JPhgi48UXj8rcJd3XeqMv~>IVb!bIRpkJ zg-)I8e(NrvYM&X?8v6#T>taF%G|-;0NAl9@rfotg3787t9Ka@@s(5BwCF?9xD|D3q zKuux}G}Rh#J5dJKDY#HafFP__T@eAAs{r1csfV#4v)xG>*I|pV%2JUzkn3h2lC&5w zOyi~FLgxr4o4U03cI*taV-V%Tj}!#(!}XWg$cua=-l*h48Wz4`Q!KkMwE%?3W>;b? zX7Peqwh;hgB>NCiz5GM34Q8JbFb(iLR^riBKD7?J7ln9cZ)QD<}62fLL|atWp!#IP@sw+13Sw=g+>e&2&Z9DoHF?(R$$Wauvb<- zt}yNVgQolWs)AS0%OArq-+BgTJ8q^8_|dT$UezUW`e$M@;=xsrgdEqZXJ>-$Y@nX(wvYX&HB zJ8|ilV?yctX}Ov{*QIqZ`CKi47G_OR{_=ME{48!E*}_u{ zh8sC6$&Z9ym{siB?54ED!`@Ly!1gkyL=q$#-bT;bkQVpu__<}r_?J`{e|4~rtDvMu^jMIv&N`7V zgil_EYm4zh7Nk5uOuMY;b|dk*$u>(g6ndOEOwrM1nop6@M_Ax*g=B&{zF&lUJnL~H zRyl1Qn6;xjh6s99wo)aF#rW$YXb^~%%Z5&^s7N#LRnK(NmL*HHOr|^HC8W-icu=mp zR9d}zt9mNMS(8AQ%cekEfn;n+x=1Wd?nrRZQ%&5Hay|!IA*a(ph$%uvQXmM-RL|yU zhpUCLVyknYNLuV?5w?^DdvTu#tRhC;rAB#B%PJU2<$PTxRNXM>+AjZ*DDexp@RXZ| zFo8OS$wD#y7AAI8j|h5T%h>pU&CpBH=3*9HjhoR5LK>^O3eoV26eAQ1H^l^^S#OB(Ds8s8~Ct2~i>b^=mrg0`~26$adv2%TrZNvx2@PbB_29~c+vXt~E7@4#E~ z3FTxoNr-w?dGQAZA1Oj|tW zzQVA#{7yoPg7#?OhlqH>4mq?C*Ty9jZ-?Q&gY;BzxB~B5hG*%aUotKQ_FvW(T{h!m z_U*uylaDZk@OBXn$Agf#`Pe@c@!q`=FC@Fre_IThX{E_`^(%!(%wv`UiGQgSV|*zPP}s}6Ge3397w zfA<{3+q6y^OnxFQAS`8&1#Q$v>vaIQbt0iXfkcINU3MB)`ab0V?%Ku7|}Ou2xzDLhKeRXxR}wB)FMM|d~GOS4Y6-j663Njzmb z`}?7+yYTLT3Q=Fu?l0@eSxdq`Ild6WGl-Hesfq5XkWJ;qJ{o>kLa70^%rGraiG(*& z%rO*7TFGG6`Iv{y#BFTj0a}sHm}I7vOuC=kM;76csU)0;F#|5p50&#yaj|J2XSIT& zRLH?rhBiU>-ZI(ifC%@7Q*zG~cq6*$KWo|(q}0y}dHdODVwq3^zwrDZxBg(|b>>z7 zf%4?V>!oSjJ|h097_{JH?1>nh2zA|E-g)pCB$xvg;{oyuVs=7 zO*ODSkW)-1K&)%~W|e0sz@i@{Crv^e#Shd+&pN8pqY0JIc;|ocevoeY;wneuDmmEt zDuc#_ReVALl+IBT?5XJH9*gO~R~@@cngXR5C#u4@BR{f(epZy3BoUMw5&DhNhiiMW zw}Wcf1_$xuWt-q+6?GThfXH0cQ}MI9o3pLl8wxbSyFa9Ks}-p1V_uc2xl@9@UEkb% z)}~t8%N^orD*|^H0BHJ?Q4BlUZ9t))hMn+(-Vi;zsmhxVH@-C}yaC{MN;D83)PDF; z7iZWU_cOa+3@-5XuYJ<;mr{}Js=1L3Ic?$XMZnNv{AZ~+vq4_$;c`SOXz}L(NJ!Q2 zBo^qWMY_|{9Y!OgHjvES?xE2_ge0~+bA>w{neYM!2d4Y64IqgETU(pN`=+%Ijo{IfK zc)c=MG6u3`%b@h?21UsZVcJq~t%6a5x_4vGRp=rAR)AlZujYZ2Wp#(E;Gn+tWMRAe zl?Odaah{cUE2!+@bX{RhBWAI}z^37G3&i}MtKlh6$RIrpx7_%MHML$-J2KUVIn95` zFjr&N30sSsLKUji*V%Ohxs5%tlFE>R>z zc0aXYL8&2m5h|u!J;H3n77m`8>Fk>BEtshov2ku=55%uaf%|%8hr|+xUO(QR3%12K z>Kk{Xrl7GOr=2O+y+0wuns0=c{x-`>_ zKiv^}Yw*5pH~MPIeh}J?ak0E5OOd|3qLYr!ve}ne8R9u+COql=zMC4^K2ggHkK|td ztbco!v;goFhcGQyjRK^=iNVe{Gr}P<+KdOkrPo;fW7x!ID5Rx4(cVHXvnK7mT%b=y z!yGki2 zJMT+{;r(`NqrYtHpDwj=@v8GB8!!6Z*c~lpYb^JXqT(};Sj&=S_B}+m^5}=)KT^9F zr>`@A);5RaJeawT!H&^wDsF1@>}N+G@sE`b5h0ysP1mM+(;&h|^sM{P`LPlnZjh@1HG!mW?Fs!=S^ zQsim$ILc=eEAGIn5?Pp8Z8>XQFyLtILaT^*dK$lxaFmx`7&%w0EHK>JAbYMicqilS z9aUKAjUNL10$U|O45ZD8EGbLz#` zpZ5-4xKC_zI-C!-*cf?fY#1OacQbt>OGw|ckVSmd2jaUAJfxb=R&(MjC*#Ql_qR`l z!Z*0lvYMFr;3AZF^?kO&q{g+)_7nlhlu!$k>$w=d00AAz9)mRAiR|sQDQq3C+vNNFy5W3T3tm=;X7RS4<6;j}B_h9&2&FQ|vj4L4 z1@lBefe39!fj#C!&vuKa*By>S*XJNr?s?jWM=Bp2&b;(#FKuO@GP4Nou4s4KySXs+ zZW^XG3+NbNl@L@{Zz)BwC!8*M4_Ls*ru{s}H z2O}_*)1)PHJTVs(?Cj%<9W`81ymeg2^t#YV z|FBEO7~&0QqK>brzje%qSCeLw=F%FAJhJE576s&Kf2QDgQXl5f<8vxy!7(=;&|`yP z57@P$j!g9B#ttEBo^nAJf2cKurWu?%nB$tD;4H-C+@(lV&W(Qb4B9susduGLMxw}G z?pwrbCr-RRVa(fCvpXfbT<)s0^-9K$r;o2+%p}bcI#|$isvccLP zw9}#cj1#|iWK50;KV0q`_i^NLkyE&fE%F*Md?cJzvix$fDGqW4?Nh_Z5A}DSffvn_H7>pH|<* zKb!Vwg}?9jy6qya1!EdM`G@99^eA}6O&|pO51i4&qIt1${l{+K!27(rP!qCLeg6yEvuh^}Azwi={g_l+UqdNfn8lh{nF1 zro89i%e2DRZCOHwi2IU7II>+ct^VnZPdc2?VB0+|J^R;^Dw^#dC3LZHces54~ zKWi@Gp|rqc$+gcZKcAc$QZ9?V7V<8&_}!Osf;M0EM~3BvaCIbFg|;_tQ8!9G&9c%e zZ(3-6pfk_m+(EZ@x+O$z;!rG2`R-V=&+*8S1-NB~3FEEsQq)?*`{yFLt49lb9Q7^k z@92@a3!?vC5yb}4I^{ym%M4u{C5>ZMSNxfdoB!0cqJo^jrUUDj)KoNrGxf&b+{uML zFIP$I-T88H=8eM$#lZYARS}kAUibPqgIusU#Ih?dTnAQ}ib9^F{$g0F4Tg;L3l~VQ z0Ue*{R7shlQq@wPV})3BHq}N^Ie1T^G0Rc4zp1DG9*EN3=pCV{x1(=7Ur%A+4N3R# zPH90_e7kuvP}h%t5&KNJJqD|2#o#=)V8cKwG8WQ=$eIgyl!(BTbe+=_O|wptD9eE%%)I!R+3ASdt)9!D z*K)RM&vwXSxky`(B{aWl!;XO>7k58y984-|bNVPc5J*NA&BG)*cXwiGfQDVP+W|(U z%rCNTa$EgXjZkM$36y+%g{j*QRLBbNqmJI&QhGagUq9WtHwv#0xiJ*IzNS1bdMb0h zwWjaUiTTI=L@sd$c|q=63{BO0Ve5qzc<*ZjJ-hhx7G2ve^>fU$Gg%^uUpu@_LuhCt z?(Kx+(%0|Y7TXU$rG%_TOW54?%c`~a&;$ken@2~z4E%23JIH)HVh6T-p`+qek^I3} z;;o0DxQCMOjBjt=e8>5%liXRdqjJxi+`q>h*RlFmg1~3r1h34^~B}sEofgn=WTv#SzyziNXb>jE9$WOMJDe*o z@{5cot@7gLtS_+8+LKh03OBLg^?Oh2^(zO-F@XV-oQ(=ISv%n`ymnOW*b{727v&*Y zG%V@A58)fusdRxUb6pF-d2(yj;>+i&m=;Z6w;k%M>xLsYS;=839S2V}HC*|G8epjR z;nPN>_XR1oS04Hhwsq2>^Ij0=RuG)LN(E&;!67WeOlL;LD5nv9!Z>5)Os%Vu6Q`ul zug{5?vz)p|9N%Am>gdZCpQb{)652Mhk*Y7=u^et?^DABzUw+>E&+{anT)aC%XOz`w zr=0-DiuDYzVU-O#{;{tz`|2)rI-MB7fL9UudR^Jj?g{BeyO2l+=j06KP|>DDzO%e6 zbeDJF zAI@PVJgEA|xM(UY!s!_lqgUpf$YQs#uYGizzCTxYOfx_~GnM4dMmA7BM3+$C%WBOH zaa`%&#>Stf{au9am2fuj=K^*vR6?WdAosM4LcEryirNQaDFl`fvHz3fNS_>Vza@dd%&Iy{=}a+;CQ!ait@0zzJb?wX(sznzCl=_ z=F2UNMD2)@a9At=Ev=tq?XCrsGIbr6qxr1e?$j5#QJbK1LtT$veoN4?&AVpeo2Ww! z!TWPL8}@^<-66HM5e@=52Yht<^|;~3yZ)(6C_I<3NnO^D2A5~iICk*>2~B2!WA!XW zV&XYWGL?otK>?zy(8sOJU+rjGJ(nYoVrUIMSj(URC@+Glgx=hshJ! zh`yxAKEgVKt)Eqd73*7r`3Z4m!%h~dPK6E49Xt6BKc?ZhCKif!J^xfP0Z2Nj2j5dr zh>9Qtg##N%2#^-(WNz`QPMotQEGub1!fVD zAYV|5Z7Ma4z3CeQv*2_LW}7kZ=9hbM^xQ#BfJDl=v?FATOW!3l4H!?~q*!GC(58~I zoUrth|0WxTq=L@;r2PvwLuZsuv0%pl7?}s$j8-{FkMH*Y58W;OlrE(>OX6zStPjT( z5JF&YqUCV0EY|mqn4<0zV{9~!rB8#&!MfuzIyie(_vESW<*@$dCvlYfic*rIt^!hG zwqq>7p}QklJ$(n=`wL191*OuTYw{t3zo?1ZUOAHc;x*j2kX8D%B6{-!`YJ{Y>Fi2U zkxZB;$FPzm&jfnv0kul@;S`ro{VfshED0)nM=Z+-@GMaoxLM_L@UANUDEY{W+vyuw zmO{ZX1T1R|w4-gQeKde#v2pHwy7UCSrg)te!Ra+uY8Lre5ex~y6uH3eCXb@p>itbg zhgTC3EI_uB^8hjMr~Wb-aqSI=bp&fYXbq=sBrvt|CF&)d z)I({?3g%q|uc;gZeu9RTM;{F~P)$w*AH{{pDf1j1w4aIR@kfp4yN-_Z%UMMLQgJJ_(xpuX_228$J`xAimha6dCC ze3ips0gA$S4I#LpiG_;=)P3ArSM9i1FC*+IVX|3zHit z+XbqV0=*K4Ch~lOhhY1^pwD5Pk8R%G?2bAoMo5y7c75aa??>z-N4slbGUR7*-7>o; zK+m(@dpG#2pPgWJz}3ac2g;w7C)|2gTLa1nIjC?}M9jAB8zu~zl68UP^lq6iEy)Hz z07*RJ(6%karx!&5t+N_)+a?eGgS3w2SOMwSG8Vy1P$DK+ufiHOgOUuEWD0M~m*ApI`niJb zV{2OXpI+@ToC=*tio{%NdB5{vW}w?O)I&T5u%$bCJN@b1LH$9;h`lk9bmy(UfB1jf zdT3Ehx(D6#4~PDD)t~MWK&R7OP5xT}{%Hhyp4j3`4+;wUqf!5Z^gRa-96WM>eEeW! z7+^}FSQ}H!jVY#dlg&2fmNuI$|Csy-{u6=!MBxAP2&~VOy8c`d?hdj5z}wNs)oi1+ o*|z@${x5d_`my~#e)s_Jzij`X<^PAD6aV`8H}3yq_}|Qb0g&OJBme*a literal 0 HcmV?d00001 diff --git a/tests/files/id3-588148-unsynced-v24.tag b/tests/files/id3-588148-unsynced-v24.tag new file mode 100644 index 0000000000000000000000000000000000000000..099d930e7f4022c4622111858f0b27afd8ede56a GIT binary patch literal 39000 zcma&Nby!%s(Q&k6{jUNH#KpzK!7s>%s8RL*#qIyYW!0n+EY1fcRC_1x4;Bt)j^-B5 zk|0HCBot-^BotI@ds9mbb{i)POGFMt0alm)Pf%8Fehxtn4mKMnOQiq#_diJMNN<(o z6y=bR5#clPXC$QmSwfOVLVxq-4cZ%YG&FQ9bi{>?iH?qmjROE+0{}R0asD^F#lgdW zi;ssxL<9s95mAtnlT&>7zwlor$QT$HxH!0^Z{L!V5fc!T{U7-Mm-wGQNCcS3{>a^^ z$OK3z1jwia$p6!eM1h2af{ccY=>Go&WONkNH)t4`2=x0~BxF=n6cmK$0Cd3HH)v?c z2n-30fRF~A6NBiZq=qSwO9~Q%NvoNdM@+~4%{jQHYx11rowSzOG$}ogj7w5-{?x`N zUOs+Vu(r8tNJ?#8ch3cbj$46TXnpUNMOfj?CZZj3gu0MW|BL=F{MQf~ItBt1BtS+; zfr5&Lfr^3<;J+LQkl+msA*UqTM-9k15tnIVUd?1s*M^iPkeHU+nU3dM@I})9EF$5c zA|twrN`NGebhQ;nyruIfm-2v<9JG^U6U4^E!1Qmz!my&zuzYTPDZgFJHa8@e65!QM zGhT*jXQc9lqA0#AY1?5NzR(|C`db3>*q%iy)5lvh)>fSS@J;(L7Gd#OXL>?xI z0clZ|t5@ui`!WFpKMNI)@=t9*P-cXk1F9_`D&r>TC7+q_(l66x25aQR!Y>k32;x*9~} z5cOh#6LRT)@a0v}@^y*maTqh5=-d)`-WI;Kc2fCA>#?1(??6lKU~jf1xR8Z%onpe8 zvA`Qi11}KDh$<1k4`pPRkG$He=18nf^TJ>Bh1tV+b%#>qjLB9e;rT<9un0;e=hbwg zIoVpSl*%J|hNPBM_m2(!nM)74+9X?#KGRzwzf9YL{I;-175O?)>;1Z``CpdynWrGv zB`Z{nYZOn`RC*P&8Y+%PyME5$dXYA=1wkjm#tx?@MfhjfNXUUc-Frg{ifa$WvuEY^ zupEte@$S=3yG<`Or9)5dFdF$JL7`DgM{Xznl?6&CMT*O`WKCGW3iu_)v$l%m;G02Y z=PG5mt3UddODsmUFX@q?I4*H4r){Ahm)#_LIO|4rV^hx1Z=;C_`i{J_Nn+`fiZ+** z+7Xs7T}S+Ny>ow`4Vnu5{G-$a&vT*u>66#;kbV9q+S95e0*;#TUKIx}jQiOU;|$Bf zsdDUUh(1!bNer-wJnLoTI*Vs*gb3(_tr+Xws6 z=8XA4lh~xtKKF53SKnhfXMDz+XxGDOvi0ELfMEF1riAvf*J7j0C9!~V)JkJ=vb`AF0MuJ{9 z4u#KSb>O!cO{}fe?v-($QCOD6EZInZy_)_#%NS4XhGC(GJU*XM$`R6d_H-gq%Y}vH z31Yn%4*Ck>5N=~6Rgxd*2<-NWU;`rwQd5Aa#^kyKnaIz!tx#i#Zto^o8!jkH2}n`9 zLvpTf03tcjXQDQQa2d`WIXZ_30vgPjT%5ctKl5#%K+IEjn_a|Sn{YEP4xbt|kYPJiJ%S3l{&G=0B{eM>Y=h4o!KXd9L z@BMZ3(;4npwM=6DI{2-l(Pf(-7^8!Z58i%2V|4BZPF$6ng%n!O_m1*dhjquWG(u7t z8kepaY1&E-=$%ch_Eu-@{+gig9b}PA&6cqaZ9A42{VUInRM8Dk<^0m6$gc(%w^`tR zzg)aO=l{=Ki}-$E>26vvoNiu*=mNR9@!)$ z`r1j|lTH45=42D1`5n?`o|bgh^{z=HE2jr5)6UU@zT2(Yo{#&ljfFCkdd8nBzMIlG zql{vL#fd)`AZ8|LLVZF79YNSxW6sivY*e@Y_swkWjLhfkIegmSPp&K{2heqU!$ zEsVRLiJv~dYC1tBXq`M1$%92C%X1|OzfLAj$|6gAk7Ue`WF$r@Aj!Gvg?zOru72*^ z9Vm+*5iix@)*6|+%_eb=yYZ)_9lyAh+8*{-KJ>f8j%Uw^|0fcW`t?D$(WY6KSnF5n zdodmxO{?f|$*w)gL-u3?*K6mEQ|&2z@y%LsZ7et6IJq(^$cQPzqT|#1gM-FzW@Y6C z&aX;~8oAG)d{|2XHxt@B)#KcfYOY&%%i6?f6!z7ZrD%-nXJD$fvc{eMC=hSiz|g@u_3b;%KmRe)Pv@Pr@%NSlwbt4b%;dOVhKu$&5u= zKbXCmPJLbRmyE&t1?6?Oc1M=jY&&A29cz>eE*4E>vG3p57|gD$GgZwh34vpzqUW{B=u%T>BtzOLZnRPw@bcddrsnwrL zb?p6Hu%nF>=&)QJ6Pfo0*R**azN)cESGaWYX5G(^7kWR%*lKkPAN}}KgFRKiz$K7l zV`$&6b-kcmGI{dXkGMQtJ#t5<>iN~AIr+jS_bISv1hTiXsoa*jVGy7uVZ7O` z*Pr&&!DugaIe(dN_JOtW051ojJv*JTyYBbg`l=JwoSy!|icY08L!4=+>dDD-_3pkf ztO5O-M^0WNfvAGnU)5V?&47lIjVmnek4!hIRJj3)vv=+^&tDX*UcyLWk>`(qjMQFd zwc!w_$xfa6#g*~hQVjg=nm*1gYR;GkH>M-Ye}s#egKnV;;Yr*_C`k=`JBK8X4u1T_ge$>uxHQSwvS|LEtec!J@aHQ`Ds&0PUuFL z7J+eaC_vun+dHqfk>~vHb06J4q^lWj6jQjKrcJ=JT)GLt@*d%{NrJk!D(6_pieYY3 z612Mo_%GfApRfX${4w6EFF)m7Va3MRT&YxGpB!`wX;ag7 z{W&9E^NLlN#FwItsh`*BwxVG8;^E%8%J@Ay(WH~UUhcGL-VioFJ z4X0bajb;RQnk>67j{_N-aF)tSlwiWp*o@%XG#K zbtg_c8OUC2{K&Lvgecpm8Gwjs%KG)C2Y&Pub*Ovxb9S4gYU>Z{>Q@(q7x;nxRG;wJLQ)1q;lh?Y6;lr-^ zJH9{X&D$ggktpGbv(&L0LF znu!V+evcUOb*Yg|8;tHDpSi|rrskqC)q4T##UK2_Yw!&Ua({-K!vtB(`s zuCui*qs+yQmXj8&OGdxPaV>xSx#ggL7>sq7q-ui6(XDp`1n-S8UTL< zM}wt45QI6NL7OS>wz38wc2uvwmE`;$A)02i?5D8G@ znrZ`<`gA8Le0U(cWR9`h(=R2K012T)55|hwnU#rz)ywrL#c`hQ$SoN}pFAaVEXr?@ z*O}qDIg89?QCE<@5T^s%S^OHkb39@5U0G`s&PS#`*Md)4x>57$j`x$7xf?F`F4V7| z_U;c}QUx-_#}8hI9uRf|&>mpjs=?BKwnTct;`RJF?l_<%*4aaF%G(4xSK*rfHB)z+ zAU2$(X7l8Jd>L)F$7<9%I|b^w)G4I?O3Cz?933xo+Hy1Q{d-{KxVve5!^||Z6mmhS&F`q}+FU<&!B2BQ9K374@OoN#K z|B9S}!5=IHXdL7$F+7IQ6{3`0n%_8>N;3(OoD0wnmyQSIpGJQiaF(egZ>XUR)TX(^ zj+NY`}jp6)kALv2%|HPP&i9VSk}nG(98KRzp4k|db!s<{?+)r;Q-w4Gx_1a;bUCA zUN!09lsFixDwr2Qm@K38B%M%3iknxAHatGX$GN3+iN#lqxbUZflkWHCU417~Ap0*=F})%MRE zbsf|hiH(~aHcCC&t{N^bVM6jX3aM8bm9Y&Y!`q@{y9sYAE)JWaxkEfe<0nhk}ej!5lcliBDQuGt%yuAlrkv3B$-|{!RXX3%X(C}X zo^AgwJuPCqqF6~!v@-^@j}v7xs0$3FieK`7un&3x7Cr@C+- zD+r0dlWk~eoJlZJiz`n#5M0c}oBwkgM+SGQ7s%pzNHo*cyA}kvRL)VlDH(+Pl=Cr< z)7EGc3SZMJqsitto3tdl%auZiJ8zTUGhj=~i-sP;yhL7=l64yDKKmHaJ1>{BM*IcS zQs%qivu^o5@O^_J&(Ysi;(QbrKA*w3elIlkjM@9r_nK{CX4-l&Nk@$&Cp889R5V^N z;kVNO+QcrS!bKAg`PH6|jb5%KDRrJ&Ufo=k(TB%JX(>)f!g@-56{epR-#n2$ZSAxe zJZY>TrJ;xRsn+ygw$V%b_2cvS3APf8&~eJoAqne&Ji10)+>$d!Gm-p;3S*n0701?W z`2=C+#y+u@2Gdf5Ww+Uu!;!cqH=)BJ%@lR-sG&~{%o&UWY1e4z_Lb5#MR1x3;K&I@ z!;uZ6fqGInW;wHc-a-MyzTlp1u?q8P^DwMvz>KC|r1S))05LO%8Aghc)r>WLkJ?-+ zpu$2#X%}d4fZM=HEdeB|d1ivq3-wX&@T6pwD_7_!-`9|yav;FX!3v0mT1s+F!iIA* zu}pbD7O{&^aasK#(_g~=rUmMOFfTS!iAM4n^i_ZVM`$T2)KV2GKPe?Ji{Oa5sB=M5 z5sFw`OCTN$NgY)*FEJiq1|WI{o(dyNQ4~OOxg4w$j{p9@XkyQ2|T z@Be*DS1=Zk-o(zAYR4|irE^iZ=HcsgeRbJkdEEc($`_cEm8Is6XTpC+^N8b^BEm%A zt>UhkoVL>ye(dWbS(pYEeO%(9j4$lq-%u1KHZGBG8t{7elllAVh(kk3%5`2~Tsfsg zW9iZ0k|H$3H{G=JKtx%jAN}& zC4*6{#Z*W7q6RIu)W@ufj9oej>Qm4SCj#0qZ;hA%T%$=>XZoSYNj3sMMb?&0!s5X< zVQ6S6pHZ|D8{IIJAGGpBJ#e;WsB%)CY7tKl1K`?YBDCXu{a7mm^V=RXt=d@pohG*s zwWf3Zjg4C2`W+eGeAi@?I|Hs{P)}{7PEVT?!cNldqoVJ`zl&Y&|HUSh5bUaxr{Q!brskpjp4n&-DE>TOu|ek*#Q;U*|Bc z=v(F5K$!N^E>|NhJZsV_AwSSraG$oJua$}NXfC20;0(;NeP!8*5O z*a0*kQYeQN^12sg>M0KayhLgy=Q>HO?BWy0mIml!mPg1b!j@4lNK0`}!0(Aspp3+* zr%>U2VpOP`EEsbFF%eR{bO61w&IorLC?opSGJllERUAq@;s~++0*UMgO{Gu}~A|+bO-=qK-D!h##dUv6DHIl9xQd zYx~LA%phXHL9X1~j}XgpcO_78C8zH#7?7;irTMzi-c;pYPb2kX^jGyJ{$Qw6Sd4*vxOBqARV}X)lU9(rna;klb-z}_ z40+w-gEj$P8c1FC8H_Z3+wR-h-Kb%@<>sG(7L7&RPG-s>qLuuxG+*^iIC1-^V8vW# zPEv-3-ex;7`Fu5GQgyL2B%5N9)rQoUhax5WNqtZevYa5t?+SH1T?Skp!lIkgB9GXZ z`aJF!hTX!AnInmpK>ZXTor=hRPR>4j2#AK<{ffG65XT^J4*7$s{nee5 zaGk4pz*97KZkJ=q9=mc2zTZL~BF8Bsvk2v7`WL}@{MePwqr>8!d;H5Zja6R+7O;{M z@I~6}mEB(xuyz_V`mmb(;)na+M1mxjvB=JWt7gv!!90}OmE2c6NK(fBx8K2jvWAF9 zq%9co#d1@}HV+Wo)52>*{&7QP_@f6coVQ!#%<^%OoKBST`peWxX6y;S@bsZ}8B3oF zp+mSF$j~6*jZTGezHq5hjy7x|^c#Pm@wg9GsHQ4k3F;h{0 z?SQ^Y`jXb=uvcEXq8diVxqM60b;DydTy2aQvNGJdl(HGvhZq#bEaOY_C~snf#@vdYE{ETI!#4$maZ(*1+mcBm>}C+jHB z&!1W%p_BT?@2w_>7)slUjK?y6`@z@OC!I7X`qR@sm4X-;ePB3nh@x5&YPA2JwuhQ5 zI0IcSNp67L+=1^LsyEJF7I=n`1oaqN7F?F+F@x~ABbpzAQg2?$BM9wOL=@VGVW@1L z0;RB_#aPp(u$i2Occ1jHIg^Ii{;++@+ZV`X8oUCBR!Mp?zMR283mslU0c80bMjc5l zCT20D>o-m(2_`!{<^z%mh}v`vF(LX|*$&84!?jE)Jpuj3tX&%{Rd@zxxDE8npr!fO z!qj{s7P;U};Th2nN!-sF_>s_o1NK5ShK-KTHBK+tt@`iWfqO+OB=uZj5hPi^XIQb6 z09vCV?ZnhSrUM9u_csyE^ol!g^19TjM&YtSo3`ImCDf(@Z@X&)xoZcz(0_3xT|`hD zAFmKfZ!xO$YfnkL-;qp58vGpXwQ<41RtkS^1AqW%J4B1*%DZx%->A zrc;>0o5B-H$dG9Uf(ep}7$3A)LN;^K??)oEyVXqWIgi&|XAaM5-rX%ujIeVhHF!5V zFR%)zh3!a8bp7`pQ!?`CZ`1IrKX+UnmobyRO+WqIwzgWdzQDF&A?ufSJYnZex8;!J z*>_{aChjbc-{&`2moTly%U*%w7W=#Hw>8sT;ocV5&DZ0yEVSHZHy~gM^!~KpMG|aZjlQu{vx>0qbW1h-RlI^LZ@-#oKMe8H zf*7PT_1)7q9ld$x-EF?nTDEB&qS!RNT9ypR_4W`C5HhmH_-8q5fqH4EBx~QOj$>NO z)T3w1C!v9DgW3|9AN_#`oe>AX2xUeId{ekhVFr<`3EzS5yfGrv@_K!WMz0z--@txe z`Ba^CZ5P_G@`szA`+)DxphfaFC&tI>5>m9$OC4sF*;&ADO)&m_?y5WgZ}%yV--|m4 z&+=d7&}_+T&8X#|4$u6rOEXnpZ7+eUw*|738`rM!SF$c&a-M!@oQ-H_OzrXH%!0^* zK%9GE<{%I=hD0fgT0x^YGg{~!=uNQV>aK&NZ1lu;%?Y&C%!61 z>; z{-dsRptCX{XY;mKpe%Z)6{Z7ErMV`iU(r*)laFwd1U9*1?%baEwqD>9b~N9)9sk5F zDkdCuGO(Tzo=eTE4YgLFoxNE7X#`W3BD56l4vBKOI6e2YPnCB6SkM%&6jlDaIHj^a z<;H6YKM+Xre*fbUb@-VtJ9U)S9m)~?Z;h>XVr6&X7$IO1kV-*AOA*t>Gz(Sby+!-P z9#D1t!HC6mi->Po3zua3r=rrgNZTc3HVf~>g%xllSB=a58)jF-upd!{3v5);y~4?( zd0#|lYQv2nXn6I7Zh6(kA1~zBzVoO{ z42Fw2u)tp|Q$Juu9HEr4ai9zp<#q2ivbV|Fvr?~gpp3^ukY`?as527aP zWhc-uH$1a21)lyrv56;|T9_cK7@1=omXLEeq^>GiU3Y$Sdzt@3wnMc`@g~MSr9Q^9 zYKEFfZ`Mejj~gs494SB@-Q>^0nv@JwQFEo>!@*G{Lw?0K*L^o&GY%?=~?Cid*L?gl17Ywz~!ZmP7g$uSfxYvtOHtzJ^02~SA-XJu`lf|NpsXP}uy z=Zof2-~45mR7k*ij3}pYnRsq1txDcSE?}(B&06$qa?&g_B++;*4~!VZP=Y)_6yZ;1 zzo5VEn__IG5@D{kifZza5Yz(~0c!6`ai zRWNOiY?s)3z~Qltr8iWVrf(P=m`}l?IaTeHmz*70#cV0uW>Yr0otw0^r}fV;`*aIi zJVn0ZOn64N>|^28@@8NeF$!YpNBSw~F(f)P7743XG;to9FSJ?*&r0QA>p4~4gK=n zMWUwjsEq0Cs+2^2prthGx-NdRCpzHK<=11MtmnjTba9BOxegnWAKhpF&RJtJ{j=BD z#{e%HR6p3HhY-Kq3*pcv58S<#ShkudEh)L^;j8_X@3heTTz4UO+n0f5#XcL$)1JSNA{I=L{Mu~RJmr7cN;7Z@`&6>wmC}M_A$wWIQx@BA z89@_olH+NDPN6lTt7YV49-$OIvU)&l-H=FF>0%ers zf%kqnA2yFHisk%>@050tYd&*@32nNp{AQfKsFFJI<=I(ruOxH6(Na(X5vGJsBoKyv zFlAC8#Zov$vP1KV7xV<<1@e$yQ5#uR4ck+iC1yaj`2>HfekiANxrv5on+UKN7F6iZ zH2OnqE;OHHo)xQ%4+(&PK*afp;ON2YA(NneAr`X&fI+1+cP3h4kS$MxcTc7T~x^2;8hX;TgiQ-7-w}WTK|xuk=;$6Icl{VS*J#KiYZ9fDNQ}%tjI(Hzpb3QA zTnMnwByt!Criy=Hv+sF#wdLf9Xn49fv{h%%bo5?ZHjj%dOG)VV$FQ2_KL}Z*ND5I_ zVl;pV(#WC~m6)PiAV+1jXX0uG?`WeG6P*E;omeY*_l?D*Sm7PA*JJ2Z1i#o>(;a(( zzPPKn*UXD72_+Sklp7E%$Q|lz+a<`UqJ8q~WO+J?|2b#!u>0y*HlSYxUzjYl8UK7H zsWr7((-y_beHfo*KyXBu^4RO$M~Ck|1H?MVabcMH$r%hh`!ZJm!&IvOZQ=DtL2pVO zvRK*{@wOhVL25}4TRKW82=E^8#!j-7N}f$R?FKa9bcfi+U6Yh|7i&RFsDdm8(@yP* zN1rkeJm;MHkGWyQ5g&og^Mi_H=@?zqwl=_Sr%|V>@>@^9U{^SOpZtF-x9r;D=~wSR zRdRRU5k)@U+>h--3yW=gSxt;oRsgglOxii}5LqX+)D~9fnd8it#0qzd(pEk)ey}X# zZCc`L7lZiZt2!Iv2vz-+`$B7WNoM-DmTbMxo)e_`Uuz^l7)X}s*|LA8_&=D+cV24{ zJq_SGg~r9?LwKX`>V#;^`&x?Tf%zr6p+dk^!UURJWTm$)ES_*LzpUwk&0p44 z2y-(K8oNq;WXVni`@)wSA>Poobo0F=vlPbb#bK)~0Y%t5)Nn!wC9n?_h#HEwr6mvDHJ8cE>JN`(A$6K?4KYS|wu3RxW&e`+QHemNV!p^1ku zWhFIv+F)4>25k_?n|iw$5@WY4YY*t{->%`7TdHmNAyhMNQG&55VuQCH0bER4Uxo%J zt~4;`3*rY=OfW=M7b;p`hszx*-Nl9RrJDAZI-~=I|BPFb_MwFf3D?!kTBoz)+8*}n zsR?bSiezUDVzYjT&x;%5vf_fC+mUL75bP>RTf26oY;yKI{|M2-cu$#41*M#MkAGfK zDV0y0J^+<<$3_MyJVY3334trf#!}dkEHRKu3DHo@Ld%b36Nx(-OOqo0P3YwGa3yKh z(;Z;g+kAjA_zgi}_w3)FDq(rbt4SNS#z+cd&uwUE^!jT8(D3U4J`sl>o{8#BSwg2j79yt<7?%{-apUiz&ckHU%yTa4v@|L9?gu=GQiR1B( zokAc3%0nR}7DaqalMc=WtkrCa(#W`jQkh5C)>>t{{^)<^p4?qJjQQ#xvUWK(eon<8 zX&0I@U7S;soqDu0b+3?|_hpPO3#RSQV+T)&?GGnS88f>+4$8Id+cTJlZuOp-xOo&? z?96+AH)<^sizVMEA#X8&GY`@GX=Z3JgLPArQfvg7?LCDQmnq}iD>M0<8gd+3-+3Zp zce$I1gFmJGM&uBH;G3d7+*x#Ia??)@udWyeiY3a`Fm)xqCc((y{bS zASArrMAK$1&<$|IWVXQ!FHYEpl-N4G#WQ)}m9psmW{#DHda9%2N2bJhE{WLp19dI( zmVf2VU*KWG_hz5jw0qPv*yDVUMm=}_*V(lXz>v7*0d59u22F?t4hc|hU#_L1PD)rq z$LsVR(tjkAEE!qSkEc|89bb3=?L*m6(N* z2xEsXf#iymVy^LyR`oCabeTyJ)|fx2%YNL$H08%c=hY=?C1mT_%=g7z}_0EFPXH3nLMj@MRvb8)!>9XdbfZSz7lAV2U} znh+pn_hi#^5-u@|&Be6zWMB7^f4pyfj^?^tq>^uz6}$pHe}lOifx1Y!- z7JfJR%dVMK&`}PWElDpSc+vOn?GC@muSbm-c)@8V6GIwJ|5C3*NXGB*Uw*>Z#l)}6 z|7|)xDCEv+M81l(Xi=Yc2OKAgmzCjfofWY^7*pROATTjr?jx9@3UmC0kotxP$Wk(v z`k&hg&rFQKH2#GQvy&_v>_CtXHq=-s?;kIY)Kif+X-KuRTg4G8>; zJ|D5Y|5INiR}Eu_0djL@EM(I-@S{pm*N2MjU}Au>AKtQuZ%n1kQPezdxGmrmzRiMc z&m?bNbc}*^+sWMUr7?S>Q`=H>-vf(~{0F5bJu7EH1FyhSFW;hkltFdIwv%)MWKFdt z>7+GuM$S2%-P~+#zf}A_`gwBASm)TY)!tfY_R@Jtbm7QiQ*;5BmrcdP@54tuwuVOj z69Fz@KG4llp;+pD>>hzbB9or%pU$ti`fv8zjhKKONPW^+9&+KdZN}u&_T#JOc}Poo(!Z5J$G%J~u5D7@4GFQ0 z-TqNK230;4WRZR3cKxOn`FywBhjlOa*EWkEOvFSbKdb!W4LWp{ zPTtBiXCwx?XU_T|D7m?7u$*11M+3~;UN+M^Fe@pzKavldCs$#SY6tXDdVgO5W}U50 zV~K})9IM0E_4h>;O*inUs`bfgmS|{N-Q9$y1BFaXgw@1!#2_{UTq5D7W?N6n zjPmU5=&rWzbA^kqJA*neesGJ}JHf-a26gc~LxQoh&QIjg#AQ7`Hd0v6xLt6L{|?dX zjT@u}L}%c^{)kfOc``4S-kyKS{ebM$BEWINBQF%WPpUUhPp8S=Ak60SY$lO2kt{`WYSbQD(c}Zrb8Tp3mFp^YpL0=?t+iGa- zJ~`6v^B>uU=OTJX`Z`WK``MPlqxYznHi~#m10q3Z z@Y64(5IPuzEuc8fZjv1L;~OVZd(SnkMGj-lxb4zYTO-4mJs4QOm_gJaP0wroZLceF z$6?YmZctKD`GJ(g*>EIr)`%{y!-etf4MW9=3$KSn73r}d8M(}TTKYHfOHA*~=2 zH@Cm)Bs+_+-L-5OdL#S6+;e1`DA{nB--Vm2(E54odxNOwyL$Yf${)b9T#WB=F|)ZC z0N#Js=U@&-(^R__BUY`2Cc|8?b>f(Tn*g0TFfj}z3804gv9MonRz{mNHGS1v`gG8* z`{;}nF$^?nrq%scV(3lIfDweXmvZh7%UF&086MmaZ59mb5YP9#w{87`CMca&#A;z9 zs5zvWy6aITxT%s@8j&nR?o$>Pjk*QW4vI;&2P+Bqg!<7i{(?v)Q=HDY)Mj1j@GFT; z8@szctm;oI*(4xgp(+t_5b`16N#L!sz~T5?|NbT7neaidE#&`VX!`eMY|aia*;W9j zjba^IC)p*Znqs(pHhG$fBF5g4aU6^DudGf}#~-mQJc6lGLr^|5{*?*urj?Ehg_ChB zPAu6M+NBgalg|MMye&sgo@>pmmwnX_e~VrF*FE_kR;k*_3Ry9MN?94nu=RN4L)3+6 zg@z7tT{+*^izF?!bC$%V5tBcdv>U!@;1g<34i?sfCam_FPz1iON%uaAbo-S~e|%;2 zXC9-ezMWwYy%!qu*vH6Bxw9gJ^gXZ-SyI;xO+g3uO;5oA$CkLrTc=%`#55ybQh(SFTYHCf^IhRQXs9p`_7@Inv}7O4(S>CQXMs5 zlk8qxWUP3o6Y{TT!xD&B>V9={A?mtt;wmJX|{-^3#20H%LETP>`HC;~JX0czaQ&BF^`a(%yxX+jyK1KoO3GBDMBkh- z-@vaM4P_8A@DQ6I?b^xG0j~bMhcC^}s(3bL$##|g>SlMkiPbnBEw{F(lrpkZThG%6 zXe!mU{yvHB&bS+eYj_Yt)Xu~p?=UXj;k6fEU};Pggzw-jyS*w89Y5pYr+R1^sWa3# zobX<{j)mL{Etf__f6+8o!xy9?GU|1xvS_M0&>>zpSKD%F6n%UYaBH*_5vBCBHyT6d zIjEtL@ird_A)uvE8}u_uSd;@--FRHWunBV1*&z{xgPSHa=^k$Mg+fvvtG(cq?HTf& zltuoWylb)|9CxgS>m|6KSooF!q(CDQ{yrjzRyR$t8p*1$sE|j&GlwLNhPEZyh7ZuJ=h22B*i(FTn#nr zOS3Nw68pJOiSAz=7gm%pbHQX zb3)VVGpr+cMRG%r?~cBrr{c5hSDRGUYcbAL}oD59@Bz7jmq=DFU zMoh+0q2EG^d~?~*859#T=JU7>`~@-EeivC&6Mw5KNoh3P0sC@ark79Z!C_D(du*vp z1B4Tzd!ibcijPKjY*lV(pFeABVP{BFhnD_sPGH8BzCJYpSpy5n5(!WzXrZkovS29^ z{;Ew{!BB8x%+a~T{!pf1|+o<(&MN<%esmkc?pVYV$eN^WNo13z}H;eWf$(Xxy zM?=Y92LZ8x5>}?vo8SGNh3^+68vG6fsSD@X@~L#KG}@Hq{LA*ddeHN6KtkA)rh{pZ zW_|KTmk%`J)`I_#xAe7CMmLGYtDRDKIPyCWL=`}e_L|?aQxUP0;Et8aK$tEFN#(ZaR zcz~`&t@vu_Z+o4jbq8sCh2Y`aI8WtTTAqTq^>j+5y3Q~zPK!kcrzO1M=q;7f1AKzC zp`ExIK{;m;D^A~1W@rh*nbv0yZIr}I7SqhGN>r!(BQ-|I?l?cwvUT(`=WwJaonEH_N4H2537Kpi-h zqLLg~Jpm<{vpbvae4gm9J8`o*KTZ9+OqozOKU>9qomF6^LAa(9WJP~grly=U>_N<%#Xa``-3yMZX+!r)M6W>b0hA%mC6L^5^(*E#eatd44Sj|mb0-A9%t*hNaFJ*sjU$8Px~=^)Ma(% zd}Z&2qmeuSfaJm$DtR->wWg1o4iro_Nd>=G^FFsf*!d23o_=p@o!R_tonwtuq2Pts zS1JPphkXy8+Gll?@pShdeZy}T-Hshodp!S3x9W2&gVN;R&xL7IlFNspH)#8f@6+X9 z$XwN1@z~*Wd$6=n+Bw}K0Sq0LL=!u>8-D=H-aB{u1!jxXv-`?Q=3|cpFLSInDj0|A4Ay82+aGRiqN2c0GQcm z?-?y@Z%F2xz0)y2pdPZ=trv$FuSigtxW216e-ZMv(x0LiN=vEAPo-e`l981Gs7%%p z+F|~NPM&a>HgRs3n@RoVE9l$Ae}`I1srX*NXvop1*AqY-%9{9CWJ#v|{u9FKfjQ-@ zS}iKNgsrCcLQYbV&x!38Di$q&xxt%)qv{Js%JJmqsg*(|zdU~ANwcCG;a8aTVOko* z&+0Iyf%PgYHP{0BjQRRg0mdCe$mWXH{fJL$X|des0gR?Xajwa+O7}X4cK5Bvx4yl* zzrVRs_i!(_<$Qz`@!QArl*_moVr09%p`=!1lq-j&IWe!o?6^;`C*$xcm$G5Mw(+Wq zteI9Mc4)_2LWY;MP(<)PwRXion=XpQmY5X>r%0T**Gh!^iC1KfACf!`1lmw5It0_^6lYr#q`af~A_Uyzrd5iGm~!k#&!f9p2tda&Kw_ibY7 zpQp3ztoP98ZpH4k0q$!<%DwS~Cl)stH{v_561EURpcQ1Aj2YFAAxUmebVvRdLtDo6 z?_%0yNBU#3K_PU;g7J<>jPBsV2{-@ny`y^dz=Ae?EHBgxI@*A%MR8-N!!6IWmK7px zXAaq>wL)QaK=s?20}qenGFCXCt805}cn#)wqFXE6|D^N1^OFX^n=8??>3pMOm70C5 zt)p?eA>|{tn}IAbmcJR98XC8b8cFPHg{##hQ6B)$SjqHD;tt6}tH^ zo&L@SoH#3h>_wMOztwD=`@Ilm8WQGzl;YZQkk6QjcneA>2*MeJFaY+V&5cuS>;E2R zCh|5>NbD;8y0-lJP0deJXnVlE1T63VwyIC$kkfvxYyZ&w^N6-&m)Ps z>H*X81{t`i#iN&GO-etwC?YcB^kR$7SB;YZBt!?uaf_sQ6!@P(*4qoGlZHoMLZ4LD zSt<@^XAi`F&vC_2o$PaTVI+>X1pV(5^uO*h%kDs^h0+vJ&fpN%l?Y;uDvPQ#te~l= zH02D$d!XF>LAbyWSsA64P;Y*vtCKCiwsNbpX0O%w+CLa+eE-3jj6;_j}+CAb#7zTD6I{m3LU89Osa_TFpl zb?Rf@&dhiysMHrSrLd)K75EtqrUcM5bki%uae5(hf27?_7Tgj%wVo@?6RV3$5n9lk zO;wKN*I^yFq~_#yJ5qvFDHzzb`tXA6i?{N)?=BX2&R$;Hj($4bF;5$m6#Gq!Fd^Xt z!XUL0wKAlL4xc$!H`fh|BA|`V$gk6g!|MjXV?FC&@bpR9n(>J+><=IO|k**U{N@ZY{bGD|TVFvVG z;&Ub3d2mBJv`oGunZOt_y@$O4Yg*k|<+ub-Bij&x8S$o zet3M`j7I|O+8kH8%X9JA?>P9X5Q7Q}D^z{^u^%6xAEZ4$8D5#MVf^dq*DrXr;4&Q^ z41|cK#On2PagRtfeN?sL_Uqt+z*-@<27aT_aD&y<@m3gxZ&^^2=@GayzJHrd8H5v_ zHvy4R-A<}ANUBR8p0t?B{+nzfT9`t-cKQ_*le*ni2nve)LfT9z=f@&M5M-qQADvd>Lnf=&OT*T9Ih0lNM@FvWgAp4wKGN&)(C1Gtu4keM~OhouRYrwB@J4CY+ z0{ZPWW$$owV|{Vz)f-bXV~LA+UJ8lO3Pr^C+YtkmZY|;nLc<}YMVxyxw(Mf<;)%8T z+?Z*yZclSTzR5W1?Ig(R>DJ%3-eSWx8!uM{vZE|;tt>SHT9xu?+7r@?JxeL=4RI`3 zVFbD3Z&-aryGc5Z|G>CQGehIZ_q>STn%*q5_ASXi<(`Cd)8n68aYmm$4{o`>dg-h;Yr*C}kAMJZ+?|5dhhI!HVzi}C=Ypw@6 z5&h&fZ#0SkxW~iq9U{RrZi2@Y@wG%%{5OD%A5zw2}=cD^TP8tACWK;X>7 zAm~Nkpwf8?Iv#dEdDL!fFj4c+Hr$?XY$&^+~;ws^3 zCDL9>b7oDSg1*$&0!}iV=Fu|zDF$km) z=&~xMJbWy}DWeYypBS~!8yYoNqku3rH8Wm{j@tf=Yf>*G**klbG5~2#zZzkn_?eh> z3T{Nt>FJrMYjH}U#OKn@6bh(VjMKkeUVS*g)HoYH%kA?%$nhTB)NbBT&-9+SYRm$P z6Iw@0(1#Wh7TF`P%4`YbR>lx(-8gGu3xPBpS4b7@X(O3Tu<%xk``KB^yh>xzaClR}ulVj=w=H^6O8Vqf`lVr-AWBZ}fDB_F7TDLyjlX_o;;ajXYXi+&EDh4FyM} zoxd|Q<@C(cI+Wfj7uE5z$74d=OOUYlo1c{H?yMIzPC5(!?ci3>d!gr`dYEyRo;{wM_k?`eGVhW=^KAK zOL&VE9_ESgYM0U;Yb6B;U zjQf|=x7o1sKf-vGD?@+CdVmTd{q_Zv+2IiDa>jLEne+FT9?3Uwrt%Zrc$#N#R*r-2 z?=xC=3jzJBum2&1sk0BRRa`rYi#EYq{)wSw7}Mm!Z=nJZ3yv>s&45G~74OQsqUE3Z zwtiw)L2LiA?yu&!%<4A|uA*u1G<}<4T83%f`q?w(ouy}ki~nqR^|MVadU=vREkN1a z2XwS@`uB5ccD9TJN~~t?z!L!7*Y$3kMtdJpBDHlHsv9om?}y*jxa7i#I=vlMLT^JW zTb#zsV?iA9-|^AYDo$IB9j(=D>G;7qy_t`fZnzYO@EC__iX`E8wRZb!dypFM@QjhC zmzt#iF#qThnhz0uzhn=6W}yDJ&d}>$uZkQE@qQAtvv&(+^OM2O`Oj+8>l@?cU!5vq zYkqL91i06}@R|Vvcs%a4pL`-Kw%GI4&~w1hTL|@J{f0_g+gpfX^EcH6zFePJh%w?4 zyn5et_XUX6oPWW+eeijFFW2{#-yXBe?UaBQJk$|8s9q2US3}&ePi0YjKFwr9PntMV zmX0$#p;C0xj;^Km6)A7Oh@rR!b*jW%nej&09zGQeb#Rcm6t*xq6ZLJo_by9$KZ*qC z+EZJlcPy>tGi;R3#Z;r0gnkRXR zBWHgpEyyt&S-YPun=%~v35eu@;t-#Il5{NV*;m()cpt5f*OX32GG{!{DG z`{Lo}5B7;QXQHMTte~J3Z4V*}icqPwv?gCwF8j+7e__9n_SlL8GQ+S!7Z%myUvjSh zMmF+m)%{r_w)7+NSJG!Hl6&MWK-gQX@p3Sh$-g@VLgLB>fqltNCfJ-f4J<8oE7I`a z0iY-M7J7!-wHXj#zVuv+{1GR{&Q&2gZIL0xl-)L_$0I=d-$Q0F;SycLanqwPWR8UM z!-rxRQXadUm1-1DWq2A8q5yJH6q}g?CU01OzBsUbLJMhQ5cyRVN3!SFgLwAiPE&R@ z5`To~Osz3d(8&fi_%H+a{x9H&0F@TIfHcnU9%*e+Zstb?+cm-O#rdgwk=t6J~Q*U*z?6}&_zbD)zmQrhDD|7kLe8^Dy7Pkh?vH7+Kr(=`mT zFZvOVcV1AC#CNahw>ecI%AVVdrio)xsk^?w{S~}dvpxOt*1uPc{zXKd)*ID@0h(^! ze%-78Rv1PW(L5_!hGg6tzBz@((ihRWoi^oal(a<8=Y067Jd|GV%5QaWKt&znVD)uo zn^oEaZq%vo@~bMdt6(z0y^sD?JbFr|%U}5p(v@xO>}H$6|KFtnzU)-dB1u%dR{| zB-S{*!r;1O@EVTeNO>dg&}EllJ?q$EX89oN_m4w-nEizhoTKZx@Fbj8VzWW%2f~Ge z1R5K*F)6{axU_~dg^9`Z55e!MmD6{1L5kX|0-_f8ej>_WV`sTnY&vmb@a+1oDY75? z35j|B-Ea}Kcje~H>)osI6 z|LZgpFG5u>;s<#4{=N*EXDcqO_1z$Dx^L!2sVR@}_@NEyDj&DP_uCQ%5CN^_Frt?Hw;HM2%tNn zs#;y*GE5pIQE7@%2A=2tvFMsv*Yubg4GOGuhxjdFdHXUwuLO$=Z|@d1j2L|NQoBB! zrnpsC;V;cvb2grt?`{EWk^bmn7U+tio>6QONIeT7=crh3QrzUZ9M|0)dVcmPg!!eZ zGbk8Fak3n&tvj$~uOc`7My^5mE~G|MD&PmW_T*DheW>`(n@Mf&FonPt>2@S5$$n3Y zT}zN7?EqZ(oOuZEW#Hut%fh1U8w=`G|-#Ay~+&Ph)j6S>A~F44lKTETuiUpCG*{RDbVBlBg*? zDhx+h3Q2+CK(in){;k6B61{_+tk&Lj+r&&p)`~|7T&#oYb5H>2gLi+cpW#tMAEH$y zF3*%zP~);StWuxNbcETBj`g+}z$j_{2;|5`Mm8yUq4hL|a?IXj>QCw(iFsdDP&64d z^Q(C9G@}=aVP?6=HgQZhD!S{Fk5Ee6>g~oi7O@PUT~_pRrr&%hD~YyQCO>iv?&K8y z2f_LgAPeGDMsBbC_#F^eJapTk_Q0P^3;^)zMBTZ&WE%(2RIiVKJ<4mIVW|bmz%rFkgpw$$ zMS7kKc=kg>6AlDzr}Db#pX^P z1chpk>a$UrK1t2Qk_CHp#Z1uHmbco$8Uk#xEPpJ)s$TYy`&&_$xTaL05Z|S?XUUs= z0w`j-*0c++ARd$xR8;(kvgWU`=09JkS|I6=d*M@Ft8R;GjgTUkKtkMti#6j6z0B56 z&3AQD#%&A@LjkxzC5t^qNhSDFt_ep`A7rKh^&~TixN@8HFv=_ab}u01k=j7@bmXDC zbE;qtc1kYIet4@dM^xn>@1iQ8L3BmeyQ9>j)XZ;V^3&y({zE*GF0@mSgF8<+ap{jn zl;H2-@=v_QBN-oupa=SAZ{Gf)Wd;pPA)sa`M3F+{T|S>4PvIvKOXxNHmO>?E_aD;R z-K@X^$r_#={UF)SzM&Quqj9kU@BLqCn_{1-Uc*IA$$?%{Q0hK5fdAM2wYJpxC%Aef74Xm4_@x+xG5vHvr? zRE1Fxo-ykkLeP;%nRwZU@sL{i5_?my2v@eQ0xQa4y?GC^_qnqe@89Uz?~T$MHwrg^ zFGidLWR6jzjvNwN7jz*(WS=(qC97q@x#bePZJGFHuO&2?%W3#nPI8m}OOg@Mm486u zCR(}K)^mdezY(i%DJI>UBd;h&`3a9r)lqw<1u?6`IN^cvnw@z#b3MhmPB4|&9_Qaf z!;pCKw=*76{=K)?FkT_QfdVa~&eHjfc~S4DrS*EXl5 zbN(#+TL7JkvR;+v5&ZPp&GX-NA=YmAR-@2a<8=`?>=3)mJm*kC@9~0-IiL1$AVS5K zH@0B#N1IO13odaB)1`EnBU|GkM>Xr@&H0(iZtknQ*%uK?VaWVzhGEAKf`z^UjG0?`!?@q4|*1XVy@PkTv&0I`!3(8t@9!g{;UF;l6oA% zmT*xCL!B7546|`hEz0{q(JEiWi$Nn8c?gzPq!q#wxw>hZB9qgqXpD}Y8RBeY*=byi zvV=KsSX23s`}Y%9SD@$^zZSq9pq{pXXeHMlF7p=MV`*&4Gq1<-_XWpr(wOb|!~)vM zy>IiaD1xF7Yf>h8QEmbL|3wVW-oJ|bnfPnb;X?Ym@7^sgX!e@!#FhEX5sQ=wv3 z+QhUg>PgK%sD)t(iCXbes_~jtTN1#`9#Ty zS9DliC{H};CNAf*zg>AZ`p?Q!-I8`k@5`e{ua}N#t(Im=4G1&LPDp*uMWth*WKv6W zY~K@_Q{aFvVlbe}K01GB%Np>v;Y3E;7lh;+eP{1o9%Dok=NMyjepZgDo&oM`_|wD} zn}Nffu!QnGjBWneQ2Wv3jw+|*&Lf{G^IWV8Kj-3}zIDwX_6k8QzozMYaBp3*5X(oWf9g<)f+f`B+D?TQ(Xx;dnU{%_vsP03b>0vo z@c@LFkUY=4krF2I0UzYE2ydyBH>1+$E_$~07I>i4dn1(4>bDPgc1$L{KQv}?GB8rL zgy@r6`Fr{uiKwYM^h#FN-l%i+M#1SukR?+M0BCtYjPo^g)pF?6n^OAsD5&tI$#o>`|D4Q=$nn5T2pgakUKj*B`DxP>^O+^TC`FQxE*7SmG~$bM|l@#QKy|nO^eLM z_W}2#g9tjzgJhNv081%WvL#nW;wCg4IqUDAgoE4$f^m`q=jJBh~K1T2q20RWN7-Q#lBCYEcH{!l1#Cb zx^}*&K^%{Pntn5rj>nufwgJP6?n0luaMyi`a8vk?B3Ehu!LGx-z^*tcA> zN1Rrz40_kIw6i^CRWZQRr zv}PI3#UuiBi5%i|Arhf6(W7xTv78(UoJE@HmbY*7g?)w-GgU45EFV(o#X4vk{#p(G zRy8xGUHLRba5@`1Bp~)LonT&G{pp30?SN?M(QdZlFdBDoDo$$Kv*1$a{oqrt6_{jD z{$AcI{t@r$+juTQA;^lXU|N@c7m-Ux#+qBpsp(almCQ0%OBI?*?cE!ihmyt^b5v}b zDR<2&+b_zk>}_Wjk#IQu;NyEVI&v*-#bWP8Y+-!7Oe7YfymU#iw&5r2_t;uAb6CW( z8aAPx>HIA`@iBU#V2#H`C7w8kslrH8ufR{^>&N?Sx&Vh_(ot?9g461&p>#5h7`(I?o}ug3Q@?D^5BCZjh`Ha47O@Wcs;gzBh9nJcWtcY<@3Bcom{I< z=-5)*YzKMc33G!MU9I-HN8T5>SYYZiZ#9abJ79UQakqv5c%RODb&J~JU}1&5sYX+; zdG!+=N)lKg2YFwmFXz4fH;(8tt%dTE{qo6x`VF&k*(!YozL27EGEB*5H#T6>UP7m4 zyJ@>?bOGT~NK#I?UpZfy3%jS0#iG8{dQ5)l8S|Usxxzy=$$ftMzdKnUqD@5>t^3-K zf7$`x^+wGt4>?n_0GRz`(Gy!BgRGlPW=Euk}e$zs2yZU>wa3kO_g`HEFt0Er> z*kO5J2xcfwE<)5gFT|qq)wiKqE8IYT4gO6Bp`ox7)cHj-3|>ikTC}g)&hEiQFE3wE zR@ku#?pFNjQ9#BM!8foV?YAH?|BK)HDeecMrIN?~d^*d`&xR89k<7%uEJM!QuO)@- zr3@G-?j;1Q*S9$%7f}8&LamJd3!;I zWqK^#81LipdeJ%Kt)X>N=%slr>$WABO((Q3|qS!La{`z>jei zz!*KM32X7pF}4V}LrbDoVn!|*M~q30H+>#VxPyo^9!9A{-@q4O!AiP}<$0i8&=j9A5!=LET)xekDKp7WVrN>F0*4)e+!vlq6_e>{ zdVy|tWWWJQJ%b>S*}O^`aeLG)!j|3PxRh;UWGq{CNI@~oh^UrK3~und=ZPwTqZ2$3c|0ZE8+h{dB>-Hs>QF? zq`&GvvSSZTYdTmYH}js_u|j=ijbNa^FFe)i+AFt%kQZ>>_(#Jr;b2p9MTK80@$oz3 zvEssn{9$w%w!^n7th1jZyKO7nziN@*-rD!eCFNsc5^H)R?ynf`Sm0c45vRUGkorS3 zbMV{J3XYEtusvHD+PXE#daS-QrQVpwGQ7-3`gusBOMx;;k1I_rq1y|9Z{5H6$Z({| zJ?C_Q-+kXTzH$btxcDX;G3O6KKpS0UtE7MD{*%=yCs@V!81F%6$~H-4Va!KO+m5P; zvrZ0FWnhzOG9Xu<>oRAc`<@yx@eyx8;ntSU%)Fu7LATAQ(0}M>NlkCTc~q2G&!GSK~a*jHxtgHahl_EuJn?hwcba3KJt#WShqJpao#w@*u^oD7|P zz>bc>wEEeip_8{0g}gMs+-<&rL62>LGq_oral;5SoL&#T>ZLtqHh4Y4ou}BxXk&g?OsdjnT3CuB^&pzV!*}NMd z)NalkdRh-3AcFs-Ac9ETMdl8-$Vc^hGW~)SDzy%}-Llbga+7sf6m(l0+{C-azB`-q zSDhBzfxtj5je^(FY|ir)>d=A>#kHgjWwieVD99xNn3&PTl?ABGKD`|@!q}xGC5WU> zjFVuZohoVtn}+0;tt%-)W#Y(A2AM(|#aqdJbPvD7XzTw)1W|I~hA922ZQ_S#;LBLt zOGmSex5<%OF?H33&D~!>B8Gors%rH z%B;s&y}4@p6M^CUPOeafj|eIS5^CXhBmpGk8YGwU@pdWN#bjK~gT* zu;IcCHj)nD`TPsZq?)-Pse)#L`uExVI(l}F|KhsyeM*UuyR4&don|9Uo&l(~mgt?% zsO^fN$p=kYtb(r{cnel@8@^?5_i+;kjXSV!(cL|0=@ffaMC4!O$Z~mk(14qExmM3( z+ZG`un{KZLv8Q`M+S!iZYHbkj(O@L)SqQ>r2me5Bv6!XwwW-ATTj{I~o8CQx5M$_= zjHNeyybu45jcz~8p8iQaWtGMh(tT}5&FrMJ;^Xt9Ld>9TQGNjk5N6`c&xs?nwlYUJ!?=WS&yV7`66)9UBn7xgBRF8$xmMcvI`d4O>+Bzzk17n|gZZ zJ|H~zSZ=^N)ydRh)!h|yre7Y_Zvf)Gworp9?rA!2La{;P!46qHMRKfXYkbG@59L)a zMAueIapY&_4e(NH3%^PF`}8uN-_G-bFyKE-m@6ybID{WLp=F=BYIOQDFofWrT_nw_ zCF~26${+3=wa0Y5=cF~e$^YN5mw>ou!7=a3|_KJ?E;$QuuT9EqJ~L&}1ws zt!64mE7tl&ig9Dkr4-^2P9*SF#U&-jB4}Bq@rL#p)d#jq9y~ym}aw5b6V(0sjB7|)@R`!R>B~JMYS~Fp5YL16KmRryv7`3R#M$pejH?|BWPlqO-T@8381KLhNYEk{QlNT54H7mI zb475pTnM@O(6pH-qtZ|uxiHbr6%`_zx+!a}vGfEf_ZnTvNI-cz3}98uGUUgHOX=z+ z{$+gP20=AF->*g{81cT!Cm8GsPJa{hHw5yCz9qTPrQDRV=R8*iN6OGdr?jRv8OBmV zmhh%k%I~eY>87&V(l$~!spZc6DPFYZp{-_m9OWTJ22QIkt*FI$AhX{B6?O zPT={C#=ae^$(e_W)#YSE^*ZDmO&rvJxf8eIB?9Wpoc<4GsHpz&NJ9sVxXo_Fr!wGZ z-SjeYo^r6H7}%nXviywGkMdlA$8@V>8MpC5rvA5%o*{3$Yxi~KM(=Cmh(6S%Aenr) zN;A`IUQ$90m}}-Fxi0$mpC;kI7uK8bUYwdme4vstJ#9mFnJ!QcX(WRc;FW%m#ZQgx z6e6z}$HL8lK3fesINyh;POnu=Ln|F)7io0|9-ZMibaVnlO(^dgC4a!W1d@x<7MC&g zqcjD}Me`QSQ#J*Khk^{5Z+)N+H{B!TuLa;wa1F#LEhD*|Cw*AUO>Gp&FxMX#*LNf5Wu2@NCJvrgD&EM)3MV|hICY~oHYutp%N8|+p|o@uQtF5d zJ*f(Y@Ed9Nw7Xm*GLMWRgP4@Cp4eoY8{TH_R4;l{>{*wXp9w~J7T#c>5nc2AQay4>O zL}FODl9NzX{Xfc+7MQhG0t=+9*rN)pAOY2(Cxr1r$Z}*4Rnza% zS(ygcY&UTYdUSiLuKwIG4vnb39q~6iELo8RJHJ@W7fcAW2Sr9@nix>Y(%5DsZ+ zHqy`X?k7f63C$wrT?FGb$$-X;s1Hn;m6JDlPk-Q-x|CE2*(k&m%pK9^BgTK9v zcd`Nm*C~fwXTBlCs%@TtB!hVgKI{}MXs_g66cH+{*XK2ITXa(S`NySmKQ zjr{^7;cfkynfFD-WRT4W#uW?7VSr~+lGcZ0jtm!WTm6&=wAK%XHtTw$&aQ2Q8soiT z73~W9+FkTtcH2l}Hi}S_3F_3LObhyRPEcCWV*utSEpSsk4q0?n;~*Jllnp~fj`bVL z8;j3x*d=%h$+YrBq_X27rN zv5rItr9J=W(gF^tkZ@oBgYFS9wWKZ)RYcxvsPXoj@u#RX4H41$1X{|x;a5zt8M=Sj zc6S~d(Ko#ue6!Xz4Gc{g3ewyVD-01#F|CQQMd@!fPc$n0$k)O7++jS zmzZo?W?nFItWxjXW3^99sj2N-bSlx*52>lJGU}#S6XC$Ughp-8N*!ASG(WEPyFe-Y zIj`-j3l@3^7|$k+rBkPQRZ!!rAb?wv5_$zH5g`aV)ueV~IxZk)L<9o=0}~`wb5C;^ zwyU@B@Jj$bC`>d-Ok{|9C05=^9v$5(OGF;Pw5=c_ZtJr3xw%`1TyR-ML{5F_v94f^ zwXGptzgnkP1%46tA*X6lZ_yxRk?hR9E=NeeGakJ>6nB^2KEZ&-*>YUqDB5NZTT*V( z_R#ZXsPf;$4;s`4aV-;#-FDX(#MNHR?p4s_BXQ9Aj_zO1wGdn8Oc0CXbolfW;=3?T zh)o1OM{=CE9hjdiaVeQ$UB7nze!1Czj??hqdY&t`)m1&}H&El0#Q?LXJpW6=Jo$qN zh~r~>pL2#MN~M&kNKLY5U{|AXpy)s1{?{*mTb&J*!xndIQh#Y&84JbPDKa}-5BMC+ zkN?^kT+pe%shIq}WOR-|6>oHpZOzwd@dWWj$zbUFQ{gXCyIZct##P7)1pw3AhgG)O4td(i)heZsI7Pwk&Pij9XszV9mHBm|_kf5=N@ocozWM@yzh_UDm zqQ^!Ajfn8Nf~LQ!QHA7oMJ;cCK)mkI<^|~#QV5ZB=s^Yd-9s|uj$EwfZoc_rc|}CQ znU0-%9ZQ-EbWK}4(`|>|^CQlj-y2!ECvCe{5x%~$)$A(;^@7lYm;MA7FB0gA@PZk>dl}N*Ty??n8m{Hf@c8eZmXWyGTXEi#C%FQ- zZ<&R=hr9I2k8r-0##D$0W%h2~% zQR)-9C7IYFob4xOe$DDije=@&$FykWn-7&dElC=&Ic*0gDrmbF4v6=og)o70gX`93 zawhe229*hks*elRCMokUMPPEQBQr7c)tt9^e`0n==gXOe!IY%PX;bm=*=_F?u$ztb z(e~D~dX*#k*UIJM7h9-g;!fJlXmoTVny_3WZ8EzBGf1;eU?EpCT_BaBfsIc);S}{K zil76#i0NZ6KdQiomBmDU2T1K$+pmw!SfQ=w?lZ($7_{#|LtvB!srOyzJRld)Zc?XO zz)=cWhy#!4T8E!HK%(Jl z`3dg@HM}3POS3vY2Oc8Ah&n~%$=|Ye_Cd%t%_+WBU2A+1SAiOXGBJlfknPLNN~3a{ zmraZ`b!=6_RAVW?wZ%xA=M&$rF&cDwhx!X}M}WJT#_v=3QhvIKmH6lV07y$gkZzaJ z9^%AME3%Acl23oA#(vjW;F={K2%{VSI8F+W$SzMa<5V1*e)qZ`RD=cus$)V6LW}6= zv;U$I3vYE1$nZp^5``&K6)y=g+x@O+ReD12_FjN^+{8+ui9_~^8kR(ZGRq@S3B zzh<$EIP4zH^6?S6@6SfoGrrYKWR2`Qpqo3++akF-1ufHlZT}Vd1gT}3b;PxQ*-6)^LB_u$ z9pr3A`BRh7iW62JvDD1m?fH&3Lq!){o&44;j4Iig<@DGXH!|{}|4Ekue|gNkc*R9) z&%xFSDjYE-{D4b`jNLYasZJPYO5r8#>t2!wV(m@bP19&lwjpFFIZ(5S@9xYGz4QNc za{rwe6;UdtWeieMg@<}I|MmhUh++0lJ*_w_!S|2D7Q=)bf0?i(xU!T%e@5d0@I|uD zEM%@})!AA;cVL4d)trP<5DZKt(oDm%?a_263aO=VC(_1y?@Z27G}PazVGL4I2`M5E z$IQZ7w@};<>Dm+u-HOMLFdxd`aA-R&`s%NzKMbeT@0#%-)@>S?tKf{%Npbu75%6~I z?`g$hI|JpaH9>rsN9JB&W;za_s^hxC{eWm^q7*i$1!qBsoy4U9rqm=5A_NG22ZGD> zmYD!io{bPQ&ar1USM`0r*%__K%T5@Qt@_%d2twfTwyDC9Z{NGF7lmm{KjHIV`mPzP z5wNYiVVo4bz2-{IPSm6b8wRT9f@bfbFP8HAjHFrXr?HnrKX7wTy}w|7IprZhN4nOh z>b>(7(oGqpLUfl8D!_Zj!XMft-^@1t?4?1|(Y$8U2fG-=GWtB>@SUq@Q1Who{~Vk6vFv}O1Bn)bPrHe59p!T52J zAj=oH7Nq-`Cz4XEyIZFT!*EqRuFni0W&j5rq;nEhpkwzo(hJuwtPufJu7SMc99RD; z(ysEG0k2PLQuP}+#P~b#05$6EpyQXb%PS!btH17ebwhI z?143@lyZ1_++N^H56_;MWQz|J;XBwo%Slddw|A?qXwve!7#e@(5mSXBwQ`SfNMHC6 zTqhG(;g!|x{b`N-8mX`L=`|tpVgOM_AN^%gIMu0@?zQR+&sKLExk(}IPajjZvLA#d z7k4$(z6wmUoRhIs8a5#9_X(kyu^12iYHam-T2xzN2Ekfe%6ANf?#w0)1v+YE-Ram( zp@}M`ZXR``R{Fb-x9~e{^R(CkW~;hn6ISgv(*6b}^r+cIbQQpxta$vSKyqM1+hnzI z7h-M=`sNG^&g4gc{Jx$mtKxhir04ex?)#?rB5?c)l0%kUM%2GE{xqcsGo^2CGkih} z#pzO{f~R;HK&iD$%B0w5mdwn|@kJx=y^iD2IN|(eBfYsI=4<+F%L-z^cmD<~K6I-$ zLHmfLt^YKgVjG$bmB6{M{w!vx|CAhvO?eofMSEbsSyI2?PEh1^Sz99>&HlF>+Vvgd zunbDTq`*>9#m*wIq|dGuoA}vK5AnBD!|{RF6>vJpFop^xOdn^-?1v((_hE$YhF*Kf zzuH`_x1?kz?Xl_BI5)Rc)sr(yJLwNWpb&EcGr?b@q2_BW+nQda`{2W zvEFIbs*%O6Wt3*RHsu!$G0f`PRwT+PgCQF3-}(jISbIdcwn;VvrFS*>37|#k$eES# z1d(lV()4ENSeC0pJmE_w^=BAHxtjBCGA%6Hy79XW4$0&bOCm&UBW1RT>^vn4v*I8 zx}2bm`JYrWeRICz$>5p7oH7ZTy2u(Xxz&HuT6q&il2ZyCcYjnwN}S_FOXIxd5~Dc2 zuymyC(tZ}us+~EO8t@a)B9o?96=ublMQa(_GFMVKHQ3FY{}JNJUU8~!+q-)MwYu_G@vbAi^dluHw^TyKvTLSez6&4gRhO zRWI3*KF&@YA02&t^&KEmy9tyTabO7HGy z$F};=&r4ZqX8+&dFIcTvIploM?QGFfW-;1;_Er)oylRohCI}>#fcrD5Cnq)4X$ve= z&FIM>+FgX5d5WU@ASIk(+$q(_FVU@~u>dxqpeC1vQ20ll55D#k>-2fb4Y1NH3MZ1{ z$}a1BoH%Ca+mTcguG5ZB1SThkG4Ct%&?YhBR0|vVzMEZrhbafOK7SO=Ou8{xD`B16 zD#kzK*x9ZD-!bvkmPjw6-f7l&7iC{0C8Y{gh^~z@s%pjt%m3CgHBZ`1NBDs>ftK*eh9#ZA@nV+@ZFpoxG1ll3aaQEMAA{&-9siSwdG{+h`G5#eF zE>-a-_W`0uF4xqXp^^8UY-y1&6Qc|;bM{Byq_!2y z6z;oZv2^u3nDvvKnlocwD{ zl~xV=Y+!nwTd)gCusJ;_756Yfe%nyHMt}t_-g0l@c4(H@Oq&6v zm^HU*3+2!UwLv|oZoA5B$)G-;3ml?2)|d&LGu6Z+YhUIvZ`JC!G$_Ote-@hGe|Nn) zKep^_l{iHHh`Im&iaYP8rnat+hZ~A0f*>f;xsaQLsz@hDsM320AV^hO=)E^FAP`!l zNC`~>1VNM{pa_Wc4nYXLNH0=D^S<$!d4G7{f8g0aoSA)QowN7sHFIXKwa)&0O%UWz zxzPBIsguw+mwfQTbg?YLx9#Jm^`{L&SxJk(7tYF^!*2p(+cneny-Ue+8uiisa)~Dk z`SPBIzi^b+Hzz3jy@1EMDGh*`QtMS`R<}6ECc4UWv<#PW-V)vcx@Xv&S?$v^ve}6@x3xVp1WD)j zw7)K#a2X84ln>a#Qvf$a_>-5b;P+8@LRP#-@@jiXIr1id`Q$_%ls-2#rd$QLuncl% zoZkH_%jcc&a*$LSE>)@6BI@!^Ti5&U=45yXgq{9!qFuX~1(EO{C?U0i4gkV+tkyo_ znC%-{nA`_Zkmt3oP;hCXLN>U#Ix=P|)>|wR?T;DL(Q8j0HBBrPpVRmSi(4kxKl_m= z_REsF`A`wNj0p3?s_RuVe#Mi0thQ$R)II0tgi(&q!uLk_p|y_@cE2OaACmP5Ysl~u z|GQ#P=Fxm@#b6FP&VEa{%B;kfigLc_)V==V)uiMbuE@h14w!8YPYCogaC*3~HGq8H zxGaj8iQMnxp1fTksvv3gM}3cen3z)4?J;&|Y1WhChjKNfs*B@X7pmDa)YV?o@l(IS z+VAwvVTGXIb3;P$C-5Mu%xyyH*A-bb!0~H?!h?PuXD2RVmnW=c2*Uz?#fa)Z)&|q= zfpgFa=pbC>H+{aOb>2{qQH~H%^S`Ez{yuCp=YitpGiS&d(%Jb14Y3s_{_eDkG>68r z71=61*dlqCaGGus{X_02>Uc=e`wCn{{71=XyjH=FI2%h&=bbT4ZVfR3_eskCqGl z1$$M_;<#x=R@e$3(t})Xl2-xpJBM(2AS1x6%I_l0d11n3o7r)9PGW-_#rCl#f8x7F zI%ps(`G=oQsXHz(){R`Q@e3aDhBVyU2h9cYMdCyG+#f9PHw!Pw%PuW&`g{vOZc56f zNd6+{ShgD8ep1P}PGESU%6x4pdOAt*U9%PPq&f6e(s!l5;R$)({7s&*;G?u4%A}qj z`rcCEMlc}`gnO5dSB<)I&N83=uB>KlE{W|;vSb;zhQFO-1EGx~Ug{&jwoUPv&r&~+ z*F6>Yf{$}m`ksG(nDVNqYmi_4B z+XnR_EKx2~=&ZWc=hAnp8LH*uKu}lDlJ(K_*XJcn2mjeFB5WxBHp(%2-)>aSE=hn> z@Ip5e^o-y2!Zq4{h)95)kFIPFWI4T4wED=Hg)2m%*pGJ@vsh{3;vmfj|y1~;Sb%jD2rKDnMG~4twVGM z6*j8_{~a*xc^Y>{ekAF9t7srucr9Jlx!3=jzkLmATawKdcugsYVLEhc7=>Dy{$vi> zE8_k=&Me!fCsuF8mg5JaXXr$K`Rmf-CA`fQu2O4L?yp^^3N-D|AMQlFgv063vA$-YYm6D>AFCcJMw8|TpG}(Q zF{h=hqyk=qiP5(mdcwl4<=nduqY4j?;`~k%QZlk6F_f{P(m2m#8S|)(0hNYRf-*UF^Mi-T~h=(*Ata2k-Rs{9Ewk`{Fv?e z*bVd|$OtF8C0+4Z&mEC)!7(H9y!;9Xt(D(VD`u=q;tg!`x_&&QQcE-&9`q`8aj%F~ z&YtsfU0&+odDhE7dN+eSFA=oMe#dt0do*su_J@(G8JtakeH4?qi>Cc@KSIR=)7~qgqhfMZSF3aSKDvdsmZ&rZ&>ID(5W< z@+;<0HW?{}Gu{G;f>!xN=L9=q@msm;ULK7Zhn9nRy3%!=<8`+`DHP%RyZc#gUEoTb z7_o(FDDU35F#=HlU*OJEEpt!@g|&HBOSe7>xUvY>j;!~M0W?5R}3P~Y!4>=-jzF# zKH&|kN+&ee@&_Mpoth(O(xy2y)i90gnp`wwLhmS9C(o)%6C$5ts@ZV1rf7*E2R^NS zcEn``@zNbl08_O(QJ}XjiNCyU%iSz3BX9JH&l+5AkI{l;2XTaGHLw&5DeBdx&u#2D zYnb}Xwbm!BX3FJmWpwuC{t7zw_elgnInrX2(oz=$|DiLy#!*j>cv|P=kEmlx1-f?v z=)!jsF9yftWlKvS2$!vN25!nHD0)RAS4O7H4V39y?oo5%Y zx0ed-+U*{@FIK=+ZmwE4F4=iJ%IB7>SzW;yA1 zFx5MYoUdDvdlAv0%@qXJV74xADLKZnbOGp>>iwsrb6d01tir^EP)p&s|B)B2BGF`&*i3 zXXO<&dnjCGbR@QZ=~hWbV;&O6T*a*cc4R;m3$?5U)>pqI#c6{)PQ}!XR4#N16$$7y zska~2FZ%9=ea2N@EN}IOSF5|+Ft7*`{g@j_CQpz+N+^No$f7$gnuyPMfVbtb@Oq0VOE*s>zt zE5i%ig7y59XrbhEr-Hss%m7)&s@cooir;d8r1n$K9FIodPo#o=OAIdIm9?+FcTxVW zzVV)5iYbGNcik2tST}SH>6Pe##VXpMI(&H zAz%%|`|QaGIV7KGIe0~u0+uFM%ZoyKBoNR6GLKaL>StsRHe~o7CBVOHFX6iP!@fmD zeKWKykVP4Jos1LVFL#mEPyNJy00Bnum9ewY)yFzjj*X!8Z2NR zlALzdpgtb`@o=z$eg{W)so(?WCk@NeD3&idab-HBWF$6qZ%uc>8a{C|Kl?aeEDll! z6>;`D4hp$i-oVIrG1-g#=*=j}vtFQ<0^7(;zMfR|(f-yYo%@-^`8}~Q_(9_gheqby z`VQ#x)1Deh0kh?RQyb$7{Ac&!9cb%Eq(?{B&_3FFZ&c*fciAlG**_5bv&^OH8Y2b) z$I5wT#hNv^zIaI*Q;KGWCtwd&-$|J;;Xt<$jObhTl?>2?(e4UdP_fj>6rmYpW7z!K zg;+P!g};vREN~rjtzbhm#W^;wzIpEsI_nE7EA|)v3D-^StGc0(MQlRuYf)h|x6t+HIFn}))ld>WIixtk^wRhY# z@Mxj0U{-{=PHO^_weCE>pBUQvd)zoMXY0w`3N(7&|0rZrx>H|YfKrE1X+p8L$#kQZ z=7t~P71TX|DY>ty*=sQ(uIt@ijMdy^R7`)vjSOP!+S*W<_s>3aZ|zLo(#8*S#V7VD z?AQ738VnKxJ>Yea!})nd)7DOIj~(o`DN)ZfqlKi&-0Q~+72fbrmkprRq)su31}IVc z0yHd&g?KN`x;Fg;8>Tp*_EZddx{8RNsl=1Cm;%H}%YA{j`Uc5}ulq&Zd*sOUgfvY3 zM>)rS6B~A6V1CQCC!6;{v7}Xyb;aYCLEuIPw!xfd<=`R*)kv3#A+J9Z>q_;o(WR!QrzS-o8WU;>F-YmKs4x!V3Vw+juD>iz4#*805wn9ajKjrLx zixBRu!TxEcfIochJTZIjyzm)z(t6Lc%Alhwj6WZs?9Pr-ebwy;74`Ma0G*5!U5hW?4Mh1S%+<#9N-)OMT&d0C-NA3`6DC7XS7)T0$oWYR;$PLi^wP98^`tD0to5!MDgCL4su7Fu- ze_xcl|J;OzO5p13(xoVO{Dz$VJ!~-MVhNY#^^~=@<)=`X!H(0)D0)yXS#^n)lgNY2 zJC(Tq0n*8+17zJB021Z&MFnUs_TWcJGT66~T~mq$&L6a!6eb?C85XpEsWt$RNCgy@ z$myIZ702NnNu23-Syaz#;Fh)7yAPzUuL0nu&jP}o4?ei5-NU@$T{K|;GwVAs4p6{5 zft`#WY7rnStL@Mk)1e`C`T2y@9l@gj!kft=w3s6#&!^sVTf9B)hcO!QFz+BDBkalH zg3QH>Ak3tMu48OrZAq($(u(?1i-Rji?iz|27yyr`8Wx~dBVk*anB(2!rZ_(P6_^0O z6%0c_w~)UU#q@`JF{H;PTY{S_FkDZn{yhmbG^#OQz7$jfIPO%2JfC_Tows*NMuW-B zd`ffdd6F$C@?{NQ7Zw=+kb7Y&_%~J{(qWuUFmL@N8|5h@ym-!d;ZoA4qXvdwr!`Z% zJpwGzWzVQPMiwn|3O-$GdRIdJ0xs!?DB_dQe)mLy@b&9dtpQ|+b(g5hzL`dRV}05i zx8e;DUuJR7b}yW4O#RbXLGr`;c{BHMurBvjQY+##-0Py5$@m%-KNReX^XA#T_K4Dy z0fRBGh}EIKIlbpmM_hU0ZpcVaX}pyR8jIx#Pt)T`{RG3I?;n+oS@k8H6HUtS4f`Xq zrX$;}LiA^p-fpL23Uczp-Ur1dH@-xXB{|7e7(v(pgFsP2lwFkFAF>^AKtDZFt!iwJ zdLF4*zjz@!8{g;gRKEi%(p;9GhZs#<3p>l1eKyH)$%}cAsT9u!L#(6k)r?(Ri6xz; zFX;tIY>a8E*s*8UlL(sfzn{7vDbvc}D#8lpPj|5lL8J+~fMJ-2frd2k^q?YXp6-W% zf6yeCxi+E=G!AyeSEkT3Psm6VUCmu1=9cs-e>01D?wECpO-svy7O6}jjOFk*nyZdz z4L(?V*i0#`>ZoavVO+;i<*<_8pB6H}iUTZfpRdz#&y(LCBi{Z2Im{wyW`yH~>ef}Z za?~HrMH_eAy#K>7V_hkvMPm=#GVV|<_xrcP7Pd_8k8V+`AEnQ$M$CmZ%IkK#djsKI zaYizCqxW&};c`up%o(8+SFWmMume>|Gs$&GA4C-o&7SN+?(Ur{jAEtEPtMo*8ni0W znEUesHED*0bNIlsAcMp{a}`u6Ez;zCEFCBX4L-saIuqGbuu`$BRPm z(shup`!-}b-Yh#iGtS(xUQOo));XGz75)MUjEae+TzJgPw*NI|D}>qe5i9D(i)6?` zs3M+Z0~i186av^{9rh>i=H)Q*awttbT_20u-a0lSu|4IYg0svh8Df=3+XP)28cV1>3Tzx0V0RScv|G;Db z!bbilZZbeQdXpP3j$_Y><0ugz3%-jYehedi}EW^Roml3rk zo)-&LNAC`g-b5_r$$;q&vEdBoEs=~RrVLXnYjbmJ6UO%@CRXG_MiX0)J~Z(NtO$jA zRi@^KnM6;ad#X;R!H$L2rnq0W(6BLB@o^>YyPRv>%UApO;-2BZcb!(S3kP>C?(VQ8 z-XcEkJpNLCF0XLpDf!QNR&jT8f`gma;XdGh)>q$qnFsE&F54Z-RutOc9<;Q@bipEL zL)`5dv$dXR{;oFW6Nm&Xrs8?v^`)mD_k+D|os2e($GFeCAJNcKmso@Q#;VlwLuF@9 z;(o3~<5*QeZ7%MMBz;-aGP6av?-RBOG6a_dxH}3hL`fNTS-1y@n{!U(cNF3tbKFC^ z{mhrMxK~zQxgvif;ntYT5D8dDjT4(yo*8%G9@Sm_PVZCFH{3tS1*nv1e4CED(HzJ$ zTJX*o_utIhtYu+`J?=Z48r_<_{`dj+4!_QTeL?p^a6cDn6XwrTr_B|4eh%M-U(b6@ zn=8^K-1nUJ;J841pMtgjTQlfw;5p{9L;}{ZOS0n~+s5U%r&;PP`DJnLT-@_@ch7R3 z`gs!W=}IOt*9U_?;4b_2Y}fAR(NA#y|ARBPwf{bQ4fg}p1s5h%6r93cQ2O*({L#of z+%HJNv$tk;)8>l2t}DV}L9U>bHdmzU2tNwVG9F}(?ITAdU_H);Idb{>w7DW(RJ{Jg zZ>Qf@;OlcPreChVZgUg&XLn9E6}QyBz#Y8y=qnwVHiUbEZ0E$4>Z#LkzoGqH@8P@x zBi!xHO0Ax<8ticYb=5Q151!|JaG&o70|o>ALU8v9?d9t7`gmh5Pb6UZ@%{Pzyt(82 z12-s?7or@5ulEYD@oVr=^}_w5>)}=1c7rV3Z&`(z)fx@X!(Cp#N4tDlggWl3%K5U( zh8hQOkLzQ;?tW3YW|oj5D8cwIbGRp znaeY99}?;dPY7~ob49NIDyS5`5Jl7GiuAzj5=lTF|0ups-LYMz`%iV2 zBG-Qk_~@7Q!yDRMk>2Abasn$E5Pw{-EYEzhiRS{`xy;pb^kzKLz&$}lOJ4fT@e}SH z?^3(HJB*)=Iq@licpertdp3%1F>m1BdZoE?>bdkYxUZKc9{*f;l{Q!8K3zE*#qL>$ zXmdsSa*>O$n)pkI@AFKsN0=^BrOg$&zCCM>q$0PZ0AK&LD7PfzWP2IzKb`le+E7zj zhr3gQ!u_|8zP92%zjIS>ZU4eAV?O#3i**0{&~Lb{&nlTXmdsSRt}ph3Cp6*59#K79^Z(cGR~93^to#|^TzEX zTvzJ9!T08B{5((GGo2?p*p54=u}zyrfNAc+vGvMC0#=nlxlZy-C))EsdcW!c1p{#L zGrr!hAM{>)`DZKciH{`rI_rb$a96AObcuOBjrKZ{`}>>>DXA{{iT1jao|yYyd^zha zZLUb)DcUM*5{PJXMS88kU+5(|F>ZZK)*eNHC*z>LZ{H<{%N zaNlAgYZ0(49^&r3@|BaByXolbI~mB;5ciMV#(fo$0rGL-QM}C~S2yyaQ#W?4rDODh zwT^(@Wa%RAvW)}mwg{_hvx}btcBiG=xmt@P!0uJxl*U|M0@&{&tnchIcmvq)z3l&P z>$U~#kCyJ&Eu=>P`-_fWb<&pCfIWm35BF{?yq5SofD@?Sf-)^t^%Z;40hFVD9m?0# z)v3Dm0H{dq1C@#!uW~dYfXdW{P$jjcvh3ku0M!&i%?h_!0XS)Er|I3+7XW_O8)-CT zw+}#dY5Wn*Mr{B!B9=`llKT-bI{&PlMg%&>v~9_blI<%1oQ}>j{U42yO9gNSI@nC!kre~>#Cf#P3ALJMu^C6% z0M0^3)ppJPY`kzifU^}sf38_~k%(&Mfd76C0OxG&jC)hX2T*58QU9*K3qM32~Y3tsVA;W4_&Fg zwZv=oFmZwU=#ur{a~n>ZY5~YZ*Ul_8bYB%34WNOFVx+vvLn7996?^3EBBG}5wQ#u+ zfQGuo^V{zecNuO=4maLJ+-3MUs_+-Z#Q@H=bnmRmehAd~;gP(U=*{7A#FtlUxFDAr zE*Op?8bxdZS#S%Acoe^)*oGpZ8jRlHPDsVBYASXkNkp;-$sb6PkR&77kK_Q76fqdR z!9PQ&NM)dCrQ)ENibEk(9A=%5Qb18VxVZHB123?W(XBo z3>2+YWQ(Z~o1jQR(MN^E6NQwD9CZ{iC~i}cYl0#LMIRM;o+zYL4>WM;1MWH&17!6_bs3V literal 0 HcmV?d00001 diff --git a/tests/files/pinknoise-vorbis.mkv b/tests/files/pinknoise-vorbis.mkv new file mode 100644 index 0000000000000000000000000000000000000000..f83006c8558f12b5ff859b9718bedbb4088f5815 GIT binary patch literal 5486 zcma)A30PCtw%$Z05iyJchBmaMB#25hAQ1-==0F4z4nt@jWr%_yh=i!L#Y;#SMC2j{ z&=|d-L_vWXDkxg510bTJfCLZ`6=kq0DiwTo@a+?Z-oE#J-gmy8lXcd=hP~EaYoDE1 zdkr4b0-DQ=p1E5Potm;$$d3l}95IHTCB|5?Gd54-=5%A`q0|}KWafn#%7lGNYVKFH ziCvvLZ3cY*H_RfWmj4&_;cpm@ec><6^vvHdlaOnh=k&}SQ5Q2FQ-l?TeLt70bVrk) zlbHnm#n9|C4m~Q#BD%Zh?p$}SZcMGeRyH%^m=8NOg%>U0rQnkjMVk|n@Y{JQ!i23! zc&FuLr{$~Q9fZ*i{w2kn2_7#H?c}8Z&*)t3W@FL9f=qx0G3|Y!OYID?tVgUR5o3hS zxt{fg3hjRcUw=F^L4*2S_h-2oXgacY)1pEHS#&=(h&>wc2J=~@*7mI_F$qEx)bgxG zzW~T^oz^_3HE$YS2ASar$??krQ#Ruh6JkO&I(R?)N++@t84f&=9UC7l+Qdr|ZQjgF zC87G(@Z;&l_F(x1h4=+-To)~hOW2yq6Q<&KL~rM5=}epcg66C!6IwcWD}@$P ztTjEzY6wSf=fAL`2N-AKRt7}gBnS&_E6V7(kwo#`LIj`+IkcT-(ma~Jt(34Xyhvid z4pO;P$V)(ZSo-YEiy9A6n!b&6$jQ}E^33%;PU=Ms$3osHUb={WPA;jYLSZ{+-yn%D zbrdJP>PXDXY;rnhA=P#!=4U>2YP}~}K+ly+{G8ugOE=SYT1@+}qxlv}bZM=YQg0fZ zfiCr&ne-;D(pu_3)&E?Ir^K0qLIBE+67!A{4Y1aA2A~xHtb4H8^=-Ht`*1f@xCQzP zBXnTqfj*S;&8zS&cL0O*&w<|)JT zl<|2Zxdr;t>}m|i06-hMp?I*@`p7)*gdjZ)g8qLSktIAUjXKOBwliT2dU80R@PWy~fy!;)cibbbwWP%%^%VI*g$s5T1U`m~}$d5zQ&g|Pj`u!7tUsiTSr zLphWiQ8blB7)(?4s z(WXY7=37e?^yeL;@fET)`h?43bjDGSK7?4|7k~ zwTdeYMlHwWl1?a63>+$_(}_oy27th~xDI2Rzs4Kf9b-bU2^`D1RyudFy$}(vr$iKS zHa)U8i#wG*0LOb#ba)9b;%{R*bPND^SnSh*kXkH-x2U6bGVE-aa6v(`nUAL4{Oaud zJMC_FItETq0!`Nin|XCnkPdTh@M=M@3$M$W%XZ-+p@OgyL1crdzm(TMl|J}ygR7?r z(FA}sMPHJNz91D1xfa;@xyQFU0C!!qBlDgR3x-^a?EH!d2}PUJN-7V^#||EGIH?f< zSX2bP@{aG!tJ;}YxwBw2wzz;J-3LNiV-Y1_P})(*~74>C}P{G#KW>Ss{P^pCL|?% zB#kI!?S8|G{hfY9SRa?Q;D=76#CZX%J$RIiWA3Lg%?M0WuRt?ykEvI8G37SJIXDDi znlZaWkO&JVQbJ&^VlvGTwy76lj<8FZNImZkMbH<53|JuD4ZO(7^so}qz$#`R`Up`G zeB?F=21@5lAw3~TzY9d2gHyS|2rmL!-p-BaLBiDO&~i7M*=LR*B}iX44=E8vr6L2N z+`b+pLY>~P&Wci}U#&cOKB=v?_EcTGlAipRaK77b1XbTu%0xHd!bmglB#YjUIoWaNe0XKZt(CF`% zR;G#~p|0xIrP{R@wxwpThdr;00{|01oR^hdtq-1P152sGBY>7`CV^W4Nm|HivXtJU zlB|R*I;kp)#oA*jDWrZy5N>1;%auV4|8l9CPEuvDIEgjga?T!SX(xxMtPf)BsZv@; z@}0f&X|0O=MO1sGOat7aIvke3Efj8a97j@fIMtpYDPZW?DvKBa1f`{igQ{2-1A$&n zVq^0GAyL^}#7HD4!y^Nz4VJ z=bm{+aC`VlCWd{FLHl0YmO<7nr{$7IDk%EoVTCM@Jc6%ak%w_o*2)pQtcZnDECXdl z5sP0gW3jf>z`nKEcgt zjz~11kwHXU?v!V+Gb~_O;On3k+toL2*8zB~tq005OG15IN!AM-HM4>TH@LPmUt0+lzDku? z76a~$mdWr~;#6*EW?g3ja$&9N?}M+%y)yJYiBd|L$=uoOuT$FJC>`)V&=tJj&|5}Q zxw@CzF4f9_MlV|`52P5bnNM=gr|Oo=WH3|F`DA@%#XXLHu@KAftE%sfsa8mWSd5xx z>sVM*YEHFEEq8-;Yr(Ik_Tm@`%UZ&P?H8vCS$wjZBOJe2s*b649(f?aUOi(LTiZDK z=(}-J1BZWm-Fv(=NY%{|zD5s|d&pA{B(LEC^Xq)-$Y;{mSM;I**ddt*JTv#Msr1lPqrGAM3|$LQY?dr%E8=X>F_p_fa1s>{xA}4^!ae9^^C+7#d;M>(T7plh44@Ej=#Vm*S|MqgM=!$>zZBE8@|F3k*S^WNfAC2A@KKhY=BEf;{Y3y=*TEWh z;JmY2bbWHJ>-oadFuYp9Wj%1&7UStj$=O$~y3+CZjg|>Kq|98}+S(cl)*;Z=W+!FS z(4QgTbB_j*#xl@J91(-EX&S6PBnIVmVko;dB59ta>B4t4E#fcBox$>@>Aek)S}2R+ z#&!*v?wuNG+i)|gBkanDQ^(XFOATiAoezmI<)=~oxCj7TBF=Qkw34lce}9d8+_Wu0_HmzsZiQ=iW_uE$=X5EfDSN&b|u0KO-w!T|o+5hbTv8yv2 zp$f~luGxt_zoRL7psGVp>s4DOQa}9Ri=D|C9&vr%?*8ht=DNR480Ecp)+YIcW*Xwmdh%MA9Q)0sZqie->0wKt z11pU#bjy?2S#5Vu6)u0Y)_KQcJTv;#*?=BJIP+x8M8Ke)&gsqnmvA%%uFbe#?GA=@Kht_*}uXYQniH2KL~H zzcLt>FBt#w*h7KsQG(I~Gn#PK^6)Y;ap{Ahts|>Nj~hfB(}(v9c4Zwo^X$L2P5!Pn zm`}J-Wc+coRuCf&ZEE#A@cM+F>-sYXmU(A?MXWs1k^k@R=5QFu=g@a^e zI06s~G9Jn@J#QW%XS?h@ij`$~@S}C}-w)W`+v8U=IhMTQ{+hAS8>9SG0&2h-7uW0K4=eTj+75o8{P?`%L$%MuiXGtt4zwS?a1iYOV|}b} z)2|~3k;kVa2d=rqUHEq162s1uNx?bS$NFDHJhxjDKRz^wB(Gk`&c5fi@R%nR@q4TLqDfKtsDH+AaPh8vTyT^Hlx`I&N_>S&Jr;f+}y0SX&+1{-UiYA z*L8d5T5%OR!&)&&0wLVHx(}NFR3?^TD{|EL1&PI5*EPI+_unbUm?oEU*kK82)GdOX z?f>YVa|ky|47yQn1CH$79@z0;D@;A@DZ&gIqm+`c%jfq+nF7Maen%g|(-HdB!mpR5 zM08vmRa`!T{>3)E*J>rs{$*$SqZpi>*?{$?#9D7Mjn@7@G0Z3Q7JUM<{{*)F6BzOd jEanp!?-N-3Coujeu%u65+x|C({(U) + * + * 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. + */ + +/* + * Will tests the equalizer by fading all bands in and out one by one and + * finaly all together. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (equalizer_test_debug); +#define GST_CAT_DEFAULT equalizer_test_debug + +static GstBus *pipeline_bus; + +static gboolean +check_bus (GstClockTime max_wait_time) +{ + GstMessage *msg; + + msg = gst_bus_poll (pipeline_bus, GST_MESSAGE_ERROR | GST_MESSAGE_EOS, + max_wait_time); + + if (msg == NULL) + return FALSE; + + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { + GError *err = NULL; + gchar *debug = NULL; + + g_assert (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR); + gst_message_parse_error (msg, &err, &debug); + GST_ERROR ("ERROR: %s [%s]", err->message, debug); + g_print ("\n===========> ERROR: %s\n%s\n\n", err->message, debug); + g_error_free (err); + g_free (debug); + } + + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { + g_print ("\n === EOS ===\n\n"); + } + + gst_message_unref (msg); + return TRUE; +} + +// fix below + +static void +equalizer_set_band_value (GstElement * eq, guint band, gdouble val) +{ + GstObject *child; + + child = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (eq), band); + g_object_set (child, "gain", val, NULL); + gst_object_unref (child); + g_print ("Band %2d: %.2f\n", band, val); +} + +static void +equalizer_set_all_band_values (GstElement * eq, guint num, gdouble val) +{ + gint i; + GstObject *child; + + for (i = 0; i < num; i++) { + child = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (eq), i); + g_object_set (child, "gain", val, NULL); + gst_object_unref (child); + } + g_print ("All bands: %.2f\n", val); +} + +// fix above + +static gboolean +equalizer_set_band_value_and_wait (GstElement * eq, guint band, gdouble val) +{ + equalizer_set_band_value (eq, band, val); + return check_bus (100 * GST_MSECOND); +} + +static gboolean +equalizer_set_all_band_values_and_wait (GstElement * eq, guint num, gdouble val) +{ + equalizer_set_all_band_values (eq, num, val); + return check_bus (100 * GST_MSECOND); +} + +static void +do_slider_fiddling (GstElement * playbin, GstElement * eq) +{ + gboolean stop; + guint num_bands, i; + gdouble d, step = 0.5; + + stop = FALSE; + + g_object_get (eq, "num-bands", &num_bands, NULL); + + g_print ("%u bands.\n", num_bands); + + while (!stop) { + for (i = 0; !stop && i < num_bands; ++i) { + d = -24.0; + while (!stop && d <= 12.0) { + stop = equalizer_set_band_value_and_wait (eq, i, d); + d += step; + } + d = 12.0; + while (!stop && d >= -24.0) { + stop = equalizer_set_band_value_and_wait (eq, i, d); + d -= step; + } + d = -24.0; + while (!stop && d <= 12.0) { + stop = equalizer_set_band_value_and_wait (eq, i, d); + d += step; + } + } + + d = 0.0; + while (!stop && d <= 12.0) { + stop = equalizer_set_all_band_values_and_wait (eq, num_bands, d); + d += step; + } + d = 12.0; + while (!stop && d >= -24.0) { + stop = equalizer_set_all_band_values_and_wait (eq, num_bands, d); + d -= step; + } + d = -24.0; + while (!stop && d <= 0.0) { + stop = equalizer_set_all_band_values_and_wait (eq, num_bands, d); + d += step; + } + } +} + +int +main (int argc, char **argv) +{ + gchar *opt_audiosink_str = NULL; + gchar **filenames = NULL; + const GOptionEntry test_goptions[] = { + {"audiosink", '\0', 0, G_OPTION_ARG_STRING, &opt_audiosink_str, + "audiosink to use (default: autoaudiosink)", NULL}, + {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL}, + {NULL, '\0', 0, 0, NULL, NULL, NULL} + }; + GOptionContext *ctx; + GError *opt_err = NULL; + + GstStateChangeReturn ret; + GstElement *playbin, *sink, *bin, *eq, *auconv; + GstPad *eq_sinkpad; + gchar *uri; + +#if !GLIB_CHECK_VERSION (2, 31, 0) + if (!g_thread_supported ()) + g_thread_init (NULL); +#endif + + /* command line option parsing */ + ctx = g_option_context_new ("FILENAME"); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + g_option_context_add_main_entries (ctx, test_goptions, NULL); + + if (!g_option_context_parse (ctx, &argc, &argv, &opt_err)) { + g_error ("Error parsing command line options: %s", opt_err->message); + return -1; + } + + GST_DEBUG_CATEGORY_INIT (equalizer_test_debug, "equalizertest", 0, "eqtest"); + + if (filenames == NULL || *filenames == NULL) { + g_printerr ("Please specify a file to play back\n"); + return -1; + } + + playbin = gst_element_factory_make ("playbin", "playbin"); + if (playbin == NULL) { + g_error ("Couldn't create 'playbin' element"); + return -1; + } + + if (opt_audiosink_str) { + g_print ("Trying audiosink '%s' ...", opt_audiosink_str); + sink = gst_element_factory_make (opt_audiosink_str, "sink"); + g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); + } else { + sink = NULL; + } + if (sink == NULL) { + g_print ("Trying audiosink '%s' ...", "autoaudiosink"); + sink = gst_element_factory_make ("autoaudiosink", "sink"); + g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); + } + if (sink == NULL) { + g_print ("Trying audiosink '%s' ...", "alsasink"); + sink = gst_element_factory_make ("alsasink", "sink"); + g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); + } + if (sink == NULL) { + g_print ("Trying audiosink '%s' ...", "osssink"); + sink = gst_element_factory_make ("osssink", "sink"); + g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); + } + + g_assert (sink != NULL); + + bin = gst_bin_new ("ausinkbin"); + g_assert (bin != NULL); + + eq = gst_element_factory_make ("equalizer-nbands", "equalizer"); + g_assert (eq != NULL); + + auconv = gst_element_factory_make ("audioconvert", "eqauconv"); + g_assert (auconv != NULL); + + gst_bin_add_many (GST_BIN (bin), eq, auconv, sink, NULL); + + if (!gst_element_link (eq, auconv)) + g_error ("Failed to link equalizer to audioconvert"); + + if (!gst_element_link (auconv, sink)) + g_error ("Failed to link audioconvert to audio sink"); + + eq_sinkpad = gst_element_get_static_pad (eq, "sink"); + g_assert (eq_sinkpad != NULL); + + gst_element_add_pad (bin, gst_ghost_pad_new (NULL, eq_sinkpad)); + gst_object_unref (eq_sinkpad); + + g_object_set (playbin, "audio-sink", bin, NULL); + + /* won't work: uri = gst_uri_construct ("file", filenames[0]); */ + uri = g_strdup_printf ("file://%s", filenames[0]); + g_object_set (playbin, "uri", uri, NULL); + g_free (uri); + + pipeline_bus = GST_ELEMENT_BUS (playbin); + + ret = gst_element_set_state (playbin, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) { + g_printerr ("Failed to set playbin to PLAYING\n"); + check_bus (1 * GST_SECOND); + return -1; + } + + ret = gst_element_get_state (playbin, NULL, NULL, 5 * GST_SECOND); + if (ret == GST_STATE_CHANGE_ASYNC) { + g_printerr ("Failed to go to PLAYING in 5 seconds, bailing out\n"); + return -1; + } else if (ret != GST_STATE_CHANGE_SUCCESS) { + g_printerr ("State change to PLAYING failed\n"); + check_bus (1 * GST_SECOND); + return -1; + } + + g_print ("Playing ...\n"); + do_slider_fiddling (playbin, eq); + + gst_element_set_state (playbin, GST_STATE_NULL); + gst_object_unref (playbin); + + return 0; +} diff --git a/tests/icles/gdkpixbufsink-test.c b/tests/icles/gdkpixbufsink-test.c new file mode 100644 index 0000000..425e470 --- /dev/null +++ b/tests/icles/gdkpixbufsink-test.c @@ -0,0 +1,360 @@ +/* GStreamer interactive test for the gdkpixbufsink element + * Copyright (C) 2008 Tim-Philipp Müller + * + * 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 +#include + +typedef struct +{ + GstElement *pipe; + GstElement *sink; + gboolean got_video; + + GtkWidget *win; + GtkWidget *img; + GtkWidget *slider; + GtkWidget *accurate_cb; + + gboolean accurate; /* whether to try accurate seeks */ + + gint64 cur_pos; + gboolean prerolled; +} AppInfo; + +static void seek_to (AppInfo * info, gdouble percent); + +static GstElement * +create_element (const gchar * factory_name) +{ + GstElement *element; + + element = gst_element_factory_make (factory_name, NULL); + + if (element == NULL) + g_error ("Failed to create '%s' element", factory_name); + + return element; +} + +static void +new_decoded_pad (GstElement * dec, GstPad * new_pad, gboolean last, + AppInfo * info) +{ + const gchar *sname; + GstElement *csp, *scale, *filter; + GstStructure *s; + GstCaps *caps; + GstPad *sinkpad; + + /* already found a video stream? */ + if (info->got_video) + return; + + /* FIXME: is this racy or does decodebin2 make sure caps are always + * negotiated at this point? */ + caps = gst_pad_get_caps (new_pad); + g_return_if_fail (caps != NULL); + + s = gst_caps_get_structure (caps, 0); + sname = gst_structure_get_name (s); + if (!g_str_has_prefix (sname, "video/x-raw-")) + goto not_video; + + csp = create_element ("ffmpegcolorspace"); + scale = create_element ("videoscale"); + filter = create_element ("capsfilter"); + info->sink = create_element ("gdkpixbufsink"); + g_object_set (info->sink, "qos", FALSE, "max-lateness", (gint64) - 1, NULL); + + gst_bin_add_many (GST_BIN (info->pipe), csp, scale, filter, info->sink, NULL); + + sinkpad = gst_element_get_static_pad (csp, "sink"); + if (GST_PAD_LINK_FAILED (gst_pad_link (new_pad, sinkpad))) + g_error ("Can't link new decoded pad to ffmpegcolorspace's sink pad"); + gst_object_unref (sinkpad); + + if (!gst_element_link (csp, scale)) + g_error ("Can't link ffmpegcolorspace to videoscale"); + if (!gst_element_link (scale, filter)) + g_error ("Can't link videoscale to capsfilter"); + if (!gst_element_link (filter, info->sink)) + g_error ("Can't link capsfilter to gdkpixbufsink"); + + gst_element_set_state (info->sink, GST_STATE_PAUSED); + gst_element_set_state (filter, GST_STATE_PAUSED); + gst_element_set_state (scale, GST_STATE_PAUSED); + gst_element_set_state (csp, GST_STATE_PAUSED); + + info->got_video = TRUE; + return; + +not_video: + { + if (last) { + g_error ("This file does not contain a video track, or you do not have " + "the necessary decoder(s) installed"); + } + } +} + +static void +bus_message_cb (GstBus * bus, GstMessage * msg, AppInfo * info) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ASYNC_DONE:{ + GstFormat fmt = GST_FORMAT_TIME; + + /* only interested in async-done messages from the top-level pipeline */ + if (msg->src != GST_OBJECT_CAST (info->pipe)) + break; + + if (!info->prerolled) { + /* make slider visible if it's not visible already */ + gtk_widget_show (info->slider); + + /* initial frame is often black, so seek to beginning plus a bit */ + seek_to (info, 0.001); + info->prerolled = TRUE; + } + + /* update position */ + if (!gst_element_query_position (info->pipe, &fmt, &info->cur_pos)) + info->cur_pos = -1; + break; + } + case GST_MESSAGE_ELEMENT:{ + const GValue *val; + GdkPixbuf *pixbuf = NULL; + + /* only interested in element messages from our gdkpixbufsink */ + if (msg->src != GST_OBJECT_CAST (info->sink)) + break; + + /* only interested in these two messages */ + if (!gst_structure_has_name (msg->structure, "preroll-pixbuf") && + !gst_structure_has_name (msg->structure, "pixbuf")) { + break; + } + + g_print ("pixbuf\n"); + val = gst_structure_get_value (msg->structure, "pixbuf"); + g_return_if_fail (val != NULL); + + pixbuf = GDK_PIXBUF (g_value_dup_object (val)); + gtk_image_set_from_pixbuf (GTK_IMAGE (info->img), pixbuf); + g_object_unref (pixbuf); + break; + } + case GST_MESSAGE_ERROR:{ + GError *err = NULL; + gchar *dbg = NULL; + + gst_message_parse_error (msg, &err, &dbg); + g_error ("Error: %s\n%s\n", err->message, (dbg) ? dbg : ""); + g_error_free (err); + g_free (dbg); + break; + } + default: + break; + } +} + +static gboolean +create_pipeline (AppInfo * info, const gchar * filename) +{ + GstElement *src, *dec; + GstBus *bus; + + info->pipe = gst_pipeline_new ("pipeline"); + src = create_element ("filesrc"); + g_object_set (src, "location", filename, NULL); + + dec = create_element ("decodebin2"); + + gst_bin_add_many (GST_BIN (info->pipe), src, dec, NULL); + if (!gst_element_link (src, dec)) + g_error ("Can't link filesrc to decodebin2"); + + g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (new_decoded_pad), info); + + /* set up bus */ + bus = gst_element_get_bus (info->pipe); + gst_bus_add_signal_watch (bus); + g_signal_connect (bus, "message", G_CALLBACK (bus_message_cb), info); + gst_object_unref (bus); + + return TRUE; +} + +static void +seek_to (AppInfo * info, gdouble percent) +{ + GstSeekFlags seek_flags; + GstFormat fmt = GST_FORMAT_TIME; + gint64 seek_pos, dur = -1; + + if (!gst_element_query_duration (info->pipe, &fmt, &dur) || dur <= 0) { + g_printerr ("Could not query duration\n"); + return; + } + + seek_pos = gst_gdouble_to_guint64 (gst_guint64_to_gdouble (dur) * percent); + g_print ("Seeking to %" GST_TIME_FORMAT ", accurate: %d\n", + GST_TIME_ARGS (seek_pos), info->accurate); + + seek_flags = GST_SEEK_FLAG_FLUSH; + + if (info->accurate) + seek_flags |= GST_SEEK_FLAG_ACCURATE; + else + seek_flags |= GST_SEEK_FLAG_KEY_UNIT; + + if (!gst_element_seek_simple (info->pipe, GST_FORMAT_TIME, seek_flags, + seek_pos)) { + g_printerr ("Seek failed.\n"); + return; + } +} + +static void +slider_cb (GtkRange * range, AppInfo * info) +{ + gdouble val; + + val = gtk_range_get_value (range); + seek_to (info, val); +} + +static gchar * +slider_format_value_cb (GtkScale * scale, gdouble value, AppInfo * info) +{ + gchar s[64]; + + if (info->cur_pos < 0) + return g_strdup_printf ("%0.1g%%", value * 100.0); + + g_snprintf (s, 64, "%" GST_TIME_FORMAT, GST_TIME_ARGS (info->cur_pos)); + s[10] = '\0'; + return g_strdup (s); +} + +static void +accurate_toggled_cb (GtkToggleButton * toggle, AppInfo * info) +{ + info->accurate = gtk_toggle_button_get_active (toggle); +} + +static void +run_gui (const gchar * filename) +{ + GtkWidget *vbox, *hbox; + AppInfo *info; + + info = g_new0 (AppInfo, 1); + + /* create pipeline */ + if (!create_pipeline (info, filename)) + goto done; + + /* create window */ + info->win = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (info->win, "delete-event", G_CALLBACK (gtk_main_quit), + NULL); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); + gtk_container_add (GTK_CONTAINER (info->win), vbox); + + info->img = gtk_image_new (); + gtk_box_pack_start (GTK_BOX (vbox), info->img, FALSE, FALSE, 6); + + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 6); + + info->accurate_cb = gtk_check_button_new_with_label ("accurate seek " + "(might not work reliably with all demuxers)"); + gtk_box_pack_start (GTK_BOX (hbox), info->accurate_cb, FALSE, FALSE, 6); + g_signal_connect (info->accurate_cb, "toggled", + G_CALLBACK (accurate_toggled_cb), info); + + info->slider = gtk_hscale_new_with_range (0.0, 1.0, 0.001); + gtk_box_pack_start (GTK_BOX (vbox), info->slider, FALSE, FALSE, 6); + g_signal_connect (info->slider, "value-changed", + G_CALLBACK (slider_cb), info); + g_signal_connect (info->slider, "format-value", + G_CALLBACK (slider_format_value_cb), info); + + /* and go! */ + gst_element_set_state (info->pipe, GST_STATE_PAUSED); + + gtk_widget_show_all (info->win); + gtk_widget_hide (info->slider); /* hide until we're prerolled */ + gtk_main (); + +done: + + g_free (info); +} + +static gchar **filenames = NULL; + +int +main (int argc, char **argv) +{ + static const GOptionEntry test_goptions[] = { + {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL}, + {NULL, '\0', 0, 0, NULL, NULL, NULL} + }; + GOptionContext *ctx; + GError *opt_err = NULL; + +#if !GLIB_CHECK_VERSION (2, 31, 0) + if (!g_thread_supported ()) + g_thread_init (NULL); +#endif + + gtk_init (&argc, &argv); + + /* command line option parsing */ + ctx = g_option_context_new (" VIDEOFILE"); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + g_option_context_add_main_entries (ctx, test_goptions, NULL); + + if (!g_option_context_parse (ctx, &argc, &argv, &opt_err)) { + g_error ("Error parsing command line options: %s", opt_err->message); + return -1; + } + + if (filenames == NULL || filenames[0] == NULL || filenames[0][0] == '\0') { + g_printerr ("Please specify a path to a video file\n\n"); + return -1; + } + + run_gui (filenames[0]); + + g_free (filenames); + g_option_context_free (ctx); + + return 0; +} diff --git a/tests/icles/test-oss4.c b/tests/icles/test-oss4.c new file mode 100644 index 0000000..233e891 --- /dev/null +++ b/tests/icles/test-oss4.c @@ -0,0 +1,255 @@ +/* GStreamer OSS4 audio tests + * Copyright (C) 2007-2008 Tim-Philipp Müller + * + * 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 +#endif + +#include +#include + +#include +#include +#include + +static gboolean opt_show_mixer_messages = FALSE; + +#define WAIT_TIME 60.0 /* in seconds */ + +static void +show_mixer_messages (GstElement * element) +{ + GstMessage *msg; + GstBus *bus; + GTimer *t; + + t = g_timer_new (); + + bus = gst_bus_new (); + gst_element_set_bus (element, bus); + + g_print ("\nShowing mixer messages for %u seconds ...\n", (guint) WAIT_TIME); + + while (g_timer_elapsed (t, NULL) < WAIT_TIME) { + gdouble remaining = WAIT_TIME - g_timer_elapsed (t, NULL); + gint64 maxwait = + GST_SECOND * gst_util_gdouble_to_guint64 (MAX (0.0, remaining)); + gchar *s = NULL; + + msg = gst_bus_timed_pop (bus, maxwait); + if (!msg) + break; + + if (msg->structure) + s = gst_structure_to_string (msg->structure); + g_print ("%s message: %s\n", GST_MESSAGE_TYPE_NAME (msg), s); + gst_message_unref (msg); + g_free (s); + } + + gst_element_set_bus (element, NULL); + gst_object_unref (bus); + g_timer_destroy (t); +} + +static void +probe_mixer_tracks (GstElement * element) +{ + const GList *tracks, *t; + GstMixer *mixer; + guint count; + + if (!GST_IS_MIXER (element)) + return; + + mixer = GST_MIXER (element); + tracks = gst_mixer_list_tracks (mixer); + count = g_list_length ((GList *) tracks); + g_print (" %d mixer tracks%c\n", count, (count == 0) ? '.' : ':'); + + for (t = tracks; t != NULL; t = t->next) { + GstMixerTrack *track; + gchar *label = NULL; + guint flags = 0; + + track = GST_MIXER_TRACK (t->data); + g_object_get (track, "label", &label, "flags", &flags, NULL); + + if (GST_IS_MIXER_OPTIONS (track)) { + GString *s; + GList *vals, *v; + + vals = gst_mixer_options_get_values (GST_MIXER_OPTIONS (track)); + s = g_string_new ("options: "); + for (v = vals; v != NULL; v = v->next) { + if (v->prev != NULL) + g_string_append (s, ", "); + g_string_append (s, (const gchar *) v->data); + } + + g_print (" [%s] flags=0x%08x, %s\n", label, flags, s->str); + g_string_free (s, TRUE); + } else if (track->num_channels == 0) { + g_print (" [%s] flags=0x%08x, switch\n", label, flags); + } else if (track->num_channels > 0) { + g_print (" [%s] flags=0x%08x, slider (%d channels)\n", label, flags, + track->num_channels); + } else { + g_print (" [%s] flags=0x%08x, UNKNOWN TYPE\n", label, flags); + } + + g_free (label); + } + + /* for testing the mixer watch thread / auto-notifications */ + if (strstr (GST_ELEMENT_NAME (element), "mixer") != NULL && + opt_show_mixer_messages) { + show_mixer_messages (element); + } +} + +static void +probe_pad (GstElement * element, const gchar * pad_name) +{ + GstCaps *caps = NULL; + GstPad *pad; + guint i; + + pad = gst_element_get_static_pad (element, pad_name); + if (pad == NULL) + return; + + caps = gst_pad_get_caps (pad); + g_return_if_fail (caps != NULL); + + for (i = 0; i < gst_caps_get_size (caps); ++i) { + gchar *s; + + s = gst_structure_to_string (gst_caps_get_structure (caps, i)); + g_print (" %4s[%d]: %s\n", GST_PAD_NAME (pad), i, s); + g_free (s); + } + gst_caps_unref (caps); + gst_object_unref (pad); +} + +static void +probe_details (GstElement * element) +{ + GstStateChangeReturn ret; + + ret = gst_element_set_state (element, GST_STATE_READY); + if (ret == GST_STATE_CHANGE_FAILURE) { + g_print ("Could not set element %s to READY.", GST_ELEMENT_NAME (element)); + return; + } + + probe_pad (element, "sink"); + probe_pad (element, "src"); + + probe_mixer_tracks (element); + + gst_element_set_state (element, GST_STATE_NULL); +} + +static void +probe_element (const gchar * name) +{ + GstPropertyProbe *probe; + GValueArray *arr; + GstElement *element; + gchar *devname = NULL; + gint i; + + element = gst_element_factory_make (name, name); + + /* make sure we don't deadlock on GST_ELEMENT_ERROR or do other silly things + * if we try to query the "device-name" property when the device isn't open */ + g_object_set (element, "device", "/dev/does/not/exist", NULL); + g_object_get (element, "device-name", &devname, NULL); + GST_LOG ("devname: '%s'", GST_STR_NULL (devname)); + g_assert (devname == NULL || *devname == '\0'); + + /* and now for real */ + + probe = GST_PROPERTY_PROBE (element); + arr = gst_property_probe_probe_and_get_values_name (probe, "device"); + + for (i = 0; arr != NULL && i < arr->n_values; ++i) { + GValue *val; + gchar *dev_name = NULL; + + g_print ("\n"); + /* we assume the element supports getting the device-name in NULL state */ + val = g_value_array_get_nth (arr, i); + g_object_set (element, "device", g_value_get_string (val), NULL); + g_object_get (element, "device-name", &dev_name, NULL); + g_print ("%-10s device[%d] = %s (%s)\n", GST_OBJECT_NAME (element), + i, g_value_get_string (val), dev_name); + if (strstr (dev_name, "/usb")) { + g_print ("\n\nWARNING: going to probe USB audio device. OSS4 USB support" + " is still\npretty shaky, so bad things may happen (e.g. kernel " + "lockup).\nPress Control-C NOW if you don't want to continue. " + "(waiting 5secs)\n\n"); + g_usleep (5 * G_USEC_PER_SEC); + } + g_free (dev_name); + + probe_details (element); + } + + if (arr) { + g_value_array_free (arr); + } + + gst_object_unref (element); +} + +int +main (int argc, char **argv) +{ + GOptionEntry options[] = { + {"show-mixer-messages", 'm', 0, G_OPTION_ARG_NONE, &opt_show_mixer_messages, + "For mixer elements, wait 60 seconds and show any mixer messages " + "(for debugging auto-notifications)", NULL}, + {NULL,} + }; + GOptionContext *ctx; + GError *err = NULL; + +#if !GLIB_CHECK_VERSION (2, 31, 0) + if (!g_thread_supported ()) + g_thread_init (NULL); +#endif + + ctx = g_option_context_new (""); + g_option_context_add_main_entries (ctx, options, NULL); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + g_print ("Error initializing: %s\n", err->message); + exit (1); + } + g_option_context_free (ctx); + + probe_element ("oss4sink"); + probe_element ("oss4src"); + probe_element ("oss4mixer"); + + return 0; +} diff --git a/tests/icles/v4l2src-test.c b/tests/icles/v4l2src-test.c new file mode 100644 index 0000000..dbcaef0 --- /dev/null +++ b/tests/icles/v4l2src-test.c @@ -0,0 +1,517 @@ +/* GStreamer + * + * Copyright (C) 2006 Edgard Lima + * + * 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 +#include +#include +#include + +#include +#include +#include +#include + +GstElement *pipeline, *source, *sink; +GMainLoop *loop; +volatile int exit_read = 0; + +static void +print_options (void) +{ + printf ("\nf - to change the fequency\n"); + printf ("i - to change the input\n"); + printf ("n - to change the norm\n"); + printf ("c - list color balance\n"); + printf ("v - change video orientarion\n"); + printf ("e - to exit\n"); +} + +static void +run_options (char opt) +{ + int res; + + switch (opt) { + case 'f': + { + GstTuner *tuner = GST_TUNER (source); + GstTunerChannel *channel; + guint freq; + + channel = gst_tuner_get_channel (tuner); + + freq = gst_tuner_get_frequency (tuner, channel); + + printf ("\ntype the new frequency (current = %u) (-1 to cancel): ", freq); + res = scanf ("%u", &freq); + if (res != 1 || freq != -1) + gst_tuner_set_frequency (tuner, channel, freq); + } + break; + case 'n': + { + GstTuner *tuner = GST_TUNER (source); + const GList *item, *list; + const GstTunerNorm *current_norm; + GstTunerNorm *norm = NULL; + gint index, next_norm; + + + list = gst_tuner_list_norms (tuner); + + current_norm = gst_tuner_get_norm (tuner); + + printf ("\nlist of norms:\n"); + for (item = list, index = 0; item != NULL; item = item->next, ++index) { + norm = item->data; + if (current_norm == norm) { + printf (" * %u - %s\n", index, norm->label); + } else { + printf (" %u - %s\n", index, norm->label); + } + } + printf ("\ntype the number of norm you want (-1 to cancel): "); + res = scanf ("%d", &next_norm); + if (res != 1 || next_norm < 0) { + break; + } + if (index <= next_norm) { + printf ("Norm %d not available\n", next_norm); + break; + } + for (item = list, index = 0; item != NULL && index <= next_norm; + item = item->next, ++index) { + norm = item->data; + } + if (norm) + gst_tuner_set_norm (tuner, norm); + } + break; + case 'i': + { + GstTuner *tuner = GST_TUNER (source); + const GList *item, *list; + const GstTunerChannel *current_channel; + GstTunerChannel *channel = NULL; + gint index, next_channel; + + + list = gst_tuner_list_channels (tuner); + + current_channel = gst_tuner_get_channel (tuner); + + printf ("\nlist of inputs:\n"); + for (item = list, index = 0; item != NULL; item = item->next, ++index) { + channel = item->data; + if (current_channel == channel) { + printf (" * %u - %s\n", index, channel->label); + } else { + printf (" %u - %s\n", index, channel->label); + } + } + printf ("\ntype the number of input you want (-1 to cancel): "); + res = scanf ("%d", &next_channel); + if (res != 1 || next_channel < 0) { + break; + } + if (index <= next_channel) { + printf ("Input %d not available\n", next_channel); + break; + } + for (item = list, index = 0; item != NULL && index <= next_channel; + item = item->next, ++index) { + channel = item->data; + } + if (channel) + gst_tuner_set_channel (tuner, channel); + } + break; + case 'e': + gst_element_set_state (pipeline, GST_STATE_NULL); + g_main_loop_quit (loop); + printf ("Bye\n"); + g_thread_exit (0); + break; + case 'c': + { + GstColorBalance *balance = GST_COLOR_BALANCE (source); + const GList *controls; + GstColorBalanceChannel *channel; + const GList *item; + gint index, new_value; + + controls = gst_color_balance_list_channels (balance); + + printf ("\n"); + + if (controls == NULL) { + printf ("There is no list of colorbalance controls\n"); + goto done; + } + + if (controls) { + printf ("list of controls:\n"); + for (item = controls, index = 0; item != NULL; + item = item->next, ++index) { + channel = item->data; + printf (" %u - %s (%d - %d) = %d\n", index, channel->label, + channel->min_value, channel->max_value, + gst_color_balance_get_value (balance, channel)); + } + printf ("\ntype the number of color control you want (-1 to cancel): "); + res = scanf ("%d", &new_value); + if (res != 1 || new_value == -1) + break; + for (item = controls, index = 0; item != NULL && index <= new_value; + item = item->next, ++index) { + channel = item->data; + } + printf (" %u - %s (%d - %d) = %d, type the new value: ", index - 1, + channel->label, channel->min_value, channel->max_value, + gst_color_balance_get_value (balance, channel)); + res = scanf ("%d", &new_value); + if (res != 1 || new_value == -1) + break; + gst_color_balance_set_value (balance, channel, new_value); + } + } + case 'v': + { + GstVideoOrientation *vidorient = GST_VIDEO_ORIENTATION (source); + gboolean flip = FALSE; + gint center = 0; + + printf ("\n"); + + if (gst_video_orientation_get_hflip (vidorient, &flip)) { + gint new_value; + + printf ("Horizontal flip is %s\n", flip ? "on" : "off"); + printf ("\ntype 1 to toggle (-1 to cancel): "); + res = scanf ("%d", &new_value); + if (res != 1 || new_value == 1) { + flip = !flip; + if (gst_video_orientation_set_hflip (vidorient, flip)) { + gst_video_orientation_get_hflip (vidorient, &flip); + printf ("Now horizontal flip is %s\n", flip ? "on" : "off"); + } else { + printf ("Error toggling horizontal flip\n"); + } + } else { + } + } else { + printf ("Horizontal flip control not available\n"); + } + + if (gst_video_orientation_get_vflip (vidorient, &flip)) { + gint new_value; + + printf ("\nVertical flip is %s\n", flip ? "on" : "off"); + printf ("\ntype 1 to toggle (-1 to cancel): "); + res = scanf ("%d", &new_value); + if (res != 1 || new_value == 1) { + flip = !flip; + if (gst_video_orientation_set_vflip (vidorient, flip)) { + gst_video_orientation_get_vflip (vidorient, &flip); + printf ("Now vertical flip is %s\n", flip ? "on" : "off"); + } else { + printf ("Error toggling vertical flip\n"); + } + } else { + } + } else { + printf ("Vertical flip control not available\n"); + } + + if (gst_video_orientation_get_hcenter (vidorient, ¢er)) { + printf ("Horizontal center is %d\n", center); + printf ("\ntype the new horizontal center value (-1 to cancel): "); + res = scanf ("%d", ¢er); + if (res != 1 || center != -1) { + if (gst_video_orientation_set_hcenter (vidorient, center)) { + gst_video_orientation_get_hcenter (vidorient, ¢er); + printf ("Now horizontal center is %d\n", center); + } else { + printf ("Error setting horizontal center\n"); + } + } else { + } + } else { + printf ("Horizontal center control not available\n"); + } + + if (gst_video_orientation_get_vcenter (vidorient, ¢er)) { + printf ("Vertical center is %d\n", center); + printf ("\ntype the new vertical center value (-1 to cancel): "); + res = scanf ("%d", ¢er); + if (res != 1 || center != -1) { + if (gst_video_orientation_set_vcenter (vidorient, center)) { + gst_video_orientation_get_vcenter (vidorient, ¢er); + printf ("Now vertical center is %d\n", center); + } else { + printf ("Error setting vertical center\n"); + } + } else { + } + } else { + printf ("Vertical center control not available\n"); + } + + } + break; + break; + default: + if (opt != 10) + printf ("error: invalid option %c", opt); + break; + } + +done: + + return; + +} + +static gpointer +read_user (gpointer data) +{ + + char opt; + + while (!exit_read) { + + print_options (); + + do { + opt = getchar (); + if (exit_read) { + break; + } + } while (opt == '\n'); + + run_options (opt); + + } + + return NULL; + +} + +static gboolean +my_bus_callback (GstBus * bus, GstMessage * message, gpointer data) +{ + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *debug; + gchar *str; + + gst_message_parse_error (message, &err, &debug); + str = gst_element_get_name (message->src); + g_print ("%s error: %s\n", str, err->message); + g_free (str); + g_print ("Debug: %s\n", debug); + + g_error_free (err); + g_free (debug); + + printf ("presse key to exit\n"); + exit_read = 1; + g_main_loop_quit (loop); + break; + case GST_MESSAGE_EOS: + /* end-of-stream */ + printf ("presse any key to exit\n"); + exit_read = 1; + g_main_loop_quit (loop); + break; + default: + break; + } + } + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + + GThread *input_thread; + gint numbuffers = -1; + gchar device[128] = { '\0' }; + gchar input[128] = { '\0' }; + gulong frequency = 0; + GstBus *bus; + + /* see for input option */ + + int c; + + while (1) { + static char long_options_desc[][64] = { + {"Number of buffers to output before sending EOS"}, + {"Device location. Common in /dev/video0"}, + {"input/output (channel) to switch to"}, + {"frequency to tune to (in Hz)"}, + {0, 0, 0, 0} + }; + static struct option long_options[] = { + {"numbuffers", 1, 0, 'n'}, + {"device", 1, 0, 'd'}, + {"input", 1, 0, 'i'}, + {"frequency", 1, 0, 'f'}, + {0, 0, 0, 0} + }; + /* getopt_long stores the option index here. */ + int option_index = 0; + + c = getopt_long (argc, argv, "n:d:i:f:h", long_options, &option_index); + + /* Detect the end of the options. */ + if (c == -1) { + printf ("tip: use -h to see help message.\n"); + break; + } + + switch (c) { + case 0: + /* If this option set a flag, do nothing else now. */ + if (long_options[option_index].flag != 0) + break; + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case 'n': + numbuffers = atoi (optarg); + break; + + case 'd': + strncpy (device, optarg, sizeof (device) / sizeof (device[0])); + break; + + case 'i': + strncpy (input, optarg, sizeof (input) / sizeof (input[0])); + break; + + case 'f': + frequency = atol (optarg); + break; + + case 'h': + printf ("Usage: v4l2src-test [OPTION]...\n"); + for (c = 0; long_options[c].name; ++c) { + printf ("-%c, --%s\r\t\t\t\t%s\n", long_options[c].val, + long_options[c].name, long_options_desc[c]); + } + exit (0); + break; + + case '?': + /* getopt_long already printed an error message. */ + printf ("Use -h to see help message.\n"); + break; + + default: + abort (); + } + } + + /* Print any remaining command line arguments (not options). */ + if (optind < argc) { + printf ("Use -h to see help message.\n" "non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + putchar ('\n'); + } + + /* init */ + gst_init (&argc, &argv); + + /* create elements */ + if (!(pipeline = gst_pipeline_new ("my_pipeline"))) { + fprintf (stderr, "error: gst_pipeline_new return NULL"); + return -1; + } + + if (!(source = gst_element_factory_make ("v4l2src", NULL))) { + fprintf (stderr, + "error: gst_element_factory_make (\"v4l2src\", NULL) return NULL"); + return -1; + } + + if (!(sink = gst_element_factory_make ("xvimagesink", NULL))) { + fprintf (stderr, + "error: gst_element_factory_make (\"xvimagesink\", NULL) return NULL"); + return -1; + } + + if (numbuffers > -1) { + g_object_set (source, "num-buffers", numbuffers, NULL); + } + if (device[0]) { + g_object_set (source, "device", device, NULL); + } + if (input[0]) { + g_object_set (source, "input", input, NULL); + } + if (frequency) { + g_object_set (source, "frequency", frequency, NULL); + } + + /* you would normally check that the elements were created properly */ + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_watch (bus, my_bus_callback, NULL); + + /* put together a pipeline */ + gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL); + gst_element_link_pads (source, "src", sink, "sink"); + + /* start the pipeline */ + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); + loop = g_main_loop_new (NULL, FALSE); + +#if !GLIB_CHECK_VERSION (2, 31, 0) + input_thread = g_thread_create (read_user, source, TRUE, NULL); +#else + input_thread = g_thread_try_new ("v4l2src-test", read_user, source, NULL); +#endif + + if (input_thread == NULL) { + fprintf (stderr, "error: g_thread_create return NULL"); + return -1; + } + + g_main_loop_run (loop); + g_thread_join (input_thread); + + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); + + gst_object_unref (bus); + gst_object_unref (pipeline); + + gst_deinit (); + + return 0; + +} diff --git a/tests/icles/videobox-test.c b/tests/icles/videobox-test.c new file mode 100644 index 0000000..49697df --- /dev/null +++ b/tests/icles/videobox-test.c @@ -0,0 +1,141 @@ +/* GStreamer interactive videobox test + * + * Copyright (C) 2008 Wim Taymans + * + * 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 + +#include + +static GstElement * +make_pipeline (gint type) +{ + GstElement *result; + gchar *pstr; + + switch (type) { + case 0: + pstr = g_strdup_printf ("videotestsrc ! videobox name=box ! " + "xvimagesink"); + break; + default: + return NULL; + } + + result = gst_parse_launch_full (pstr, NULL, GST_PARSE_FLAG_NONE, NULL); + g_print ("created test %d: \"%s\"\n", type, pstr); + g_free (pstr); + + return result; +} + +#define MAX_ROUND 500 + +int +main (int argc, char **argv) +{ + GstElement *pipe, *box; + gint left, right; + gint top, bottom; + gint ldir, rdir; + gint tdir, bdir; + gint round, type, stop; + + gst_init (&argc, &argv); + + type = 0; + stop = -1; + + if (argc > 1) { + type = atoi (argv[1]); + stop = type + 1; + } + + while (TRUE) { + GstMessage *message; + + pipe = make_pipeline (type); + if (pipe == NULL) + break; + + box = gst_bin_get_by_name (GST_BIN (pipe), "box"); + g_assert (box); + + top = bottom = left = right = 0; + tdir = bdir = -10; + ldir = rdir = 10; + + for (round = 0; round < MAX_ROUND; round++) { + g_print ("box to %4d %4d %4d %4d (%d/%d) \r", top, bottom, left, right, + round, MAX_ROUND); + + g_object_set (box, "top", top, "bottom", bottom, "left", left, "right", + right, NULL); + + if (round == 0) + gst_element_set_state (pipe, GST_STATE_PLAYING); + + top += tdir; + if (top >= 50) + tdir = -10; + else if (top < -50) + tdir = 10; + + bottom += bdir; + if (bottom >= 40) + bdir = -10; + else if (bottom < -60) + bdir = 10; + + left += ldir; + if (left >= 60) + ldir = -10; + else if (left < -80) + ldir = 10; + + right += rdir; + if (right >= 80) + rdir = -10; + else if (right < -90) + rdir = 10; + + message = + gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, + 50 * GST_MSECOND); + if (message) { + g_print ("got error \n"); + + gst_message_unref (message); + } + } + g_print ("test %d done \n", type); + + gst_object_unref (box); + gst_element_set_state (pipe, GST_STATE_NULL); + gst_object_unref (pipe); + + type++; + if (type == stop) + break; + } + return 0; +} diff --git a/tests/icles/videocrop-test.c b/tests/icles/videocrop-test.c new file mode 100644 index 0000000..cc8f8d0 --- /dev/null +++ b/tests/icles/videocrop-test.c @@ -0,0 +1,357 @@ +/* GStreamer interactive test for the videocrop element + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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 + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (videocrop_test_debug); +#define GST_CAT_DEFAULT videocrop_test_debug + +#define OUT_WIDTH 640 +#define OUT_HEIGHT 480 +#define TIME_PER_TEST 10 /* seconds each format is tested */ +#define FRAMERATE 15 /* frames per second */ + +#ifndef DEFAULT_VIDEOSINK +#define DEFAULT_VIDEOSINK "xvimagesink" +#endif + +static gboolean +check_bus_for_errors (GstBus * bus, GstClockTime max_wait_time) +{ + GstMessage *msg; + + msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, max_wait_time); + + if (msg) { + GError *err = NULL; + gchar *debug = NULL; + + g_assert (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR); + gst_message_parse_error (msg, &err, &debug); + GST_ERROR ("ERROR: %s [%s]", err->message, debug); + g_print ("\n===========> ERROR: %s\n%s\n\n", err->message, debug); + g_error_free (err); + g_free (debug); + gst_message_unref (msg); + } + + return (msg != NULL); +} + +static void +test_with_caps (GstElement * src, GstElement * videocrop, GstCaps * caps) +{ + GstClockTime time_run; + GstElement *pipeline; + GTimer *timer; + GstBus *bus; + GstPad *pad; + guint hcrop; + guint vcrop; + + /* caps must be writable, we can't check that here though */ + g_assert (GST_CAPS_REFCOUNT_VALUE (caps) == 1); + + timer = g_timer_new (); + vcrop = 0; + hcrop = 0; + + pipeline = GST_ELEMENT (gst_element_get_parent (videocrop)); + g_assert (GST_IS_PIPELINE (pipeline)); + + /* at this point the pipeline is in PLAYING state; we only want to capture + * errors resulting from our on-the-fly changing of the filtercaps */ + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + + /* pad to block */ + pad = gst_element_get_static_pad (src, "src"); + + time_run = 0; + do { + GstClockTime wait_time, waited_for_block; + + if (check_bus_for_errors (bus, 0)) + break; + + wait_time = GST_SECOND / FRAMERATE; + + GST_LOG ("hcrop = %3d, vcrop = %3d", vcrop, hcrop); + + g_timer_reset (timer); + + /* need to block the streaming thread while changing these properties, + * otherwise we might get random not-negotiated errors (when caps are + * changed in between upstream calling pad_alloc_buffer() and pushing + * the processed buffer?) */ + gst_pad_set_blocked (pad, TRUE); + g_object_set (videocrop, "left", hcrop, "top", vcrop, NULL); + gst_pad_set_blocked (pad, FALSE); + + waited_for_block = g_timer_elapsed (timer, NULL) * (double) GST_SECOND; + /* GST_LOG ("waited: %" GST_TIME_FORMAT ", frame len: %" GST_TIME_FORMAT, + GST_TIME_ARGS (waited_for_block), GST_TIME_ARGS (wait_time)); */ + ++vcrop; + ++hcrop; + + if (wait_time > waited_for_block) { + g_usleep ((wait_time - waited_for_block) / GST_MSECOND); + } + + time_run += wait_time; + } + while (time_run < (TIME_PER_TEST * GST_SECOND)); + + g_timer_destroy (timer); + gst_object_unref (bus); + gst_object_unref (pad); +} + +/* return a list of caps where we only need to set + * width and height to get fixed caps */ +static GList * +video_crop_get_test_caps (GstElement * videocrop) +{ + const GstCaps *allowed_caps; + GstPad *srcpad; + GList *list = NULL; + guint i; + + srcpad = gst_element_get_static_pad (videocrop, "src"); + g_assert (srcpad != NULL); + allowed_caps = gst_pad_get_pad_template_caps (srcpad); + g_assert (allowed_caps != NULL); + + for (i = 0; i < gst_caps_get_size (allowed_caps); ++i) { + GstStructure *new_structure; + GstCaps *single_caps; + + single_caps = gst_caps_new_empty (); + new_structure = + gst_structure_copy (gst_caps_get_structure (allowed_caps, i)); + gst_structure_set (new_structure, "framerate", GST_TYPE_FRACTION, + FRAMERATE, 1, NULL); + gst_structure_remove_field (new_structure, "width"); + gst_structure_remove_field (new_structure, "height"); + gst_caps_append_structure (single_caps, new_structure); + + /* should be fixed without width/height */ + g_assert (gst_caps_is_fixed (single_caps)); + + list = g_list_prepend (list, single_caps); + } + + gst_object_unref (srcpad); + + return list; +} + +static gchar *opt_videosink_str; /* NULL */ +static gchar *opt_filtercaps_str; /* NULL */ +static gboolean opt_with_ffmpegcolorspace; /* FALSE */ + +int +main (int argc, char **argv) +{ + static const GOptionEntry test_goptions[] = { + {"videosink", '\0', 0, G_OPTION_ARG_STRING, &opt_videosink_str, + "videosink to use (default: " DEFAULT_VIDEOSINK ")", NULL}, + {"caps", '\0', 0, G_OPTION_ARG_STRING, &opt_filtercaps_str, + "filter caps to narrow down formats to test", NULL}, + {"with-ffmpegcolorspace", '\0', 0, G_OPTION_ARG_NONE, + &opt_with_ffmpegcolorspace, + "whether to add an ffmpegcolorspace element in front of the sink", + NULL}, + {NULL, '\0', 0, 0, NULL, NULL, NULL} + }; + GOptionContext *ctx; + GError *opt_err = NULL; + + GstElement *pipeline, *src, *filter1, *crop, *scale, *filter2, *csp, *sink; + GstCaps *filter_caps = NULL; + GList *caps_list, *l; + +#if !GLIB_CHECK_VERSION (2, 31, 0) + if (!g_thread_supported ()) + g_thread_init (NULL); +#endif + + /* command line option parsing */ + ctx = g_option_context_new (""); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + g_option_context_add_main_entries (ctx, test_goptions, NULL); + + if (!g_option_context_parse (ctx, &argc, &argv, &opt_err)) { + g_error ("Error parsing command line options: %s", opt_err->message); + return -1; + } + + GST_DEBUG_CATEGORY_INIT (videocrop_test_debug, "videocroptest", 0, "vctest"); + + pipeline = gst_pipeline_new ("pipeline"); + src = gst_element_factory_make ("videotestsrc", "videotestsrc"); + g_assert (src != NULL); + filter1 = gst_element_factory_make ("capsfilter", "capsfilter1"); + g_assert (filter1 != NULL); + crop = gst_element_factory_make ("videocrop", "videocrop"); + g_assert (crop != NULL); + scale = gst_element_factory_make ("videoscale", "videoscale"); + g_assert (scale != NULL); + filter2 = gst_element_factory_make ("capsfilter", "capsfilter2"); + g_assert (filter2 != NULL); + + if (opt_with_ffmpegcolorspace) { + g_print ("Adding ffmpegcolorspace\n"); + csp = gst_element_factory_make ("ffmpegcolorspace", "colorspace"); + } else { + csp = gst_element_factory_make ("identity", "colorspace"); + } + g_assert (csp != NULL); + + if (opt_filtercaps_str) { + filter_caps = gst_caps_from_string (opt_filtercaps_str); + if (filter_caps == NULL) { + g_error ("Invalid filter caps string '%s'", opt_filtercaps_str); + } else { + g_print ("Using filter caps '%s'\n", opt_filtercaps_str); + } + } + + if (opt_videosink_str) { + g_print ("Trying videosink '%s' ...", opt_videosink_str); + sink = gst_element_factory_make (opt_videosink_str, "sink"); + g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); + } else { + sink = NULL; + } + + if (sink == NULL) { + g_print ("Trying videosink '%s' ...", DEFAULT_VIDEOSINK); + sink = gst_element_factory_make (DEFAULT_VIDEOSINK, "sink"); + g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); + } + if (sink == NULL) { + g_print ("Trying videosink '%s' ...", "xvimagesink"); + sink = gst_element_factory_make ("xvimagesink", "sink"); + g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); + } + if (sink == NULL) { + g_print ("Trying videosink '%s' ...", "ximagesink"); + sink = gst_element_factory_make ("ximagesink", "sink"); + g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); + } + + g_assert (sink != NULL); + + gst_bin_add_many (GST_BIN (pipeline), src, filter1, crop, scale, filter2, + csp, sink, NULL); + + if (!gst_element_link (src, filter1)) + g_error ("Failed to link videotestsrc to capsfilter1"); + + if (!gst_element_link (filter1, crop)) + g_error ("Failed to link capsfilter1 to videocrop"); + + if (!gst_element_link (crop, scale)) + g_error ("Failed to link videocrop to videoscale"); + + if (!gst_element_link (scale, filter2)) + g_error ("Failed to link videoscale to capsfilter2"); + + if (!gst_element_link (filter2, csp)) + g_error ("Failed to link capsfilter2 to ffmpegcolorspace"); + + if (!gst_element_link (csp, sink)) + g_error ("Failed to link ffmpegcolorspace to video sink"); + + caps_list = video_crop_get_test_caps (crop); + for (l = caps_list; l != NULL; l = l->next) { + GstStateChangeReturn ret; + GstCaps *caps, *out_caps; + gboolean skip = FALSE; + gchar *s; + + if (filter_caps) { + GstCaps *icaps; + + icaps = gst_caps_intersect (filter_caps, GST_CAPS (l->data)); + skip = gst_caps_is_empty (icaps); + gst_caps_unref (icaps); + } + + /* this is the size of our window (stays fixed) */ + out_caps = gst_caps_copy (GST_CAPS (l->data)); + gst_structure_set (gst_caps_get_structure (out_caps, 0), "width", + G_TYPE_INT, OUT_WIDTH, "height", G_TYPE_INT, OUT_HEIGHT, NULL); + + g_object_set (filter2, "caps", out_caps, NULL); + + /* filter1 gets these too to prevent videotestsrc from renegotiating */ + g_object_set (filter1, "caps", out_caps, NULL); + gst_caps_unref (out_caps); + + caps = gst_caps_copy (GST_CAPS (l->data)); + GST_INFO ("testing format: %" GST_PTR_FORMAT, caps); + + s = gst_caps_to_string (caps); + + if (skip) { + g_print ("Skipping format: %s\n", s); + g_free (s); + continue; + } + + g_print ("Format: %s\n", s); + + caps = gst_caps_make_writable (caps); + + /* FIXME: check return values */ + ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret != GST_STATE_CHANGE_FAILURE) { + ret = gst_element_get_state (pipeline, NULL, NULL, -1); + + if (ret != GST_STATE_CHANGE_FAILURE) { + test_with_caps (src, crop, caps); + } else { + g_print ("Format: %s not supported (failed to go to PLAYING)\n", s); + } + } else { + g_print ("Format: %s not supported\n", s); + } + + gst_element_set_state (pipeline, GST_STATE_NULL); + + gst_caps_unref (caps); + g_free (s); + } + + g_list_foreach (caps_list, (GFunc) gst_caps_unref, NULL); + g_list_free (caps_list); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; +} diff --git a/tests/icles/videocrop2-test.c b/tests/icles/videocrop2-test.c new file mode 100644 index 0000000..58d1932 --- /dev/null +++ b/tests/icles/videocrop2-test.c @@ -0,0 +1,141 @@ +/* GStreamer interactive videocrop test + * + * Copyright (C) 2008 Wim Taymans + * + * 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 + +#include + +static GstElement * +make_pipeline (gint type) +{ + GstElement *result; + gchar *pstr; + + switch (type) { + case 0: + pstr = g_strdup_printf ("videotestsrc ! videocrop name=crop ! " + "xvimagesink"); + break; + default: + return NULL; + } + + result = gst_parse_launch_full (pstr, NULL, GST_PARSE_FLAG_NONE, NULL); + g_print ("created test %d: \"%s\"\n", type, pstr); + g_free (pstr); + + return result; +} + +#define MAX_ROUND 500 + +int +main (int argc, char **argv) +{ + GstElement *pipe, *crop; + gint left, right; + gint top, bottom; + gint ldir, rdir; + gint tdir, bdir; + gint round, type, stop; + + gst_init (&argc, &argv); + + type = 0; + stop = -1; + + if (argc > 1) { + type = atoi (argv[1]); + stop = type + 1; + } + + while (TRUE) { + GstMessage *message; + + pipe = make_pipeline (type); + if (pipe == NULL) + break; + + crop = gst_bin_get_by_name (GST_BIN (pipe), "crop"); + g_assert (crop); + + top = bottom = left = right = 0; + tdir = bdir = 10; + ldir = rdir = 10; + + for (round = 0; round < MAX_ROUND; round++) { + g_print ("crop to %4d %4d %4d %4d (%d/%d) \r", top, bottom, left, right, + round, MAX_ROUND); + + g_object_set (crop, "top", top, "bottom", bottom, "left", left, "right", + right, NULL); + + if (round == 0) + gst_element_set_state (pipe, GST_STATE_PLAYING); + + top += tdir; + if (top >= 80) + tdir = -10; + else if (top < 10) + tdir = 10; + + bottom += bdir; + if (bottom >= 60) + bdir = -10; + else if (bottom < 10) + bdir = 10; + + left += ldir; + if (left >= 100) + ldir = -10; + else if (left < 10) + ldir = 10; + + right += rdir; + if (right >= 80) + rdir = -10; + else if (right < 10) + rdir = 10; + + message = + gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, + 50 * GST_MSECOND); + if (message) { + g_print ("got error \n"); + + gst_message_unref (message); + } + } + g_print ("test %d done \n", type); + + gst_object_unref (crop); + gst_element_set_state (pipe, GST_STATE_NULL); + gst_object_unref (pipe); + + type++; + if (type == stop) + break; + } + return 0; +} diff --git a/tests/icles/ximagesrc-test.c b/tests/icles/ximagesrc-test.c new file mode 100644 index 0000000..a01bf65 --- /dev/null +++ b/tests/icles/ximagesrc-test.c @@ -0,0 +1,70 @@ +/* GStreamer + * Copyright (C) <2006> Zaheer Abbas Merali + * + * 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 + +static GMainLoop *loop; + +static gboolean +terminate_playback (GstElement * pipeline) +{ + g_print ("Terminating playback\n"); + g_main_loop_quit (loop); + return FALSE; +} + +int +main (int argc, char **argv) +{ + GstElement *pipeline; +#ifndef G_DISABLE_ASSERT + GstState state, pending; +#endif + GError *error = NULL; + + gst_init (&argc, &argv); + + pipeline = gst_parse_launch ("ximagesrc ! fakesink", &error); + if (error) { + g_print ("Error while parsing pipeline description: %s\n", error->message); + return -1; + } + + loop = g_main_loop_new (NULL, FALSE); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + /* lets check it gets to PLAYING */ + g_assert (gst_element_get_state (pipeline, &state, &pending, + GST_CLOCK_TIME_NONE) != GST_STATE_CHANGE_FAILURE); + g_assert (state == GST_STATE_PLAYING || pending == GST_STATE_PLAYING); + + /* We want to get out after 5 seconds */ + g_timeout_add (5000, (GSourceFunc) terminate_playback, pipeline); + + g_main_loop_run (loop); + + g_main_loop_unref (loop); + + return 0; +} diff --git a/win32/MANIFEST b/win32/MANIFEST new file mode 100644 index 0000000..cf63177 --- /dev/null +++ b/win32/MANIFEST @@ -0,0 +1,91 @@ +win32/MANIFEST +win32/common/config.h +win32/common/gstudp-enumtypes.c +win32/common/gstudp-enumtypes.h +win32/vs6/gst_plugins_good.dsw +win32/vs6/autogen.dsp +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/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/libgstpng.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 +win32/vs7/libgstdirectsound.vcproj +win32/vs8/gst-plugins-good.sln +win32/vs8/libgst1394.vcproj +win32/vs8/libgstaasink.vcproj +win32/vs8/libgstalaw.vcproj +win32/vs8/libgstalpha.vcproj +win32/vs8/libgstalphacolor.vcproj +win32/vs8/libgstannodex.vcproj +win32/vs8/libgstapetag.vcproj +win32/vs8/libgstaudiofx.vcproj +win32/vs8/libgstauparse.vcproj +win32/vs8/libgstautodetect.vcproj +win32/vs8/libgstavi.vcproj +win32/vs8/libgstcacasink.vcproj +win32/vs8/libgstcdio.vcproj +win32/vs8/libgstcutter.vcproj +win32/vs8/libgstdirectsound.vcproj +win32/vs8/libgstdv.vcproj +win32/vs8/libgsteffectv.vcproj +win32/vs8/libgstflac.vcproj +win32/vs8/libgstflxdec.vcproj +win32/vs8/libgstgoom.vcproj +win32/vs8/libgsticydemux.vcproj +win32/vs8/libgstid3demux.vcproj +win32/vs8/libgstjpeg.vcproj +win32/vs8/libgstladspa.vcproj +win32/vs8/libgstlevel.vcproj +win32/vs8/libgstmatroska.vcproj +win32/vs8/libgstmikmod.vcproj +win32/vs8/libgstmng.vcproj +win32/vs8/libgstmonoscope.vcproj +win32/vs8/libgstmulaw.vcproj +win32/vs8/libgstmultipart.vcproj +win32/vs8/libgstpng.vcproj +win32/vs8/libgstrtp.vcproj +win32/vs8/libgstrtsp.vcproj +win32/vs8/libgstshout2.vcproj +win32/vs8/libgstsmpte.vcproj +win32/vs8/libgstspeex.vcproj +win32/vs8/libgsttaglib.vcproj +win32/vs8/libgstudp.vcproj +win32/vs8/libgstvideobalance.vcproj +win32/vs8/libgstvideobox.vcproj +win32/vs8/libgstvideoflip.vcproj +win32/vs8/libgstvideomixer.vcproj +win32/vs8/libgstwavenc.vcproj +win32/vs8/libgstwavparse.vcproj diff --git a/win32/common/config.h b/win32/common/config.h new file mode 100644 index 0000000..ddc1bb1 --- /dev/null +++ b/win32/common/config.h @@ -0,0 +1,445 @@ +/* Autogenerated config.h created for win32 Visual Studio builds */ + +/* PREFIX -- specifically added for Windows for easier moving */ +#define PREFIX "C:\\gstreamer" + +#define GST_INSTALL_PLUGINS_HELPER PREFIX "\\libexec\\gst-install-plugins-helper.exe" + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Default audio sink */ +#define DEFAULT_AUDIOSINK "directsoundsink" + +/* Default audio source */ +#define DEFAULT_AUDIOSRC "audiotestsrc" + +/* Default video sink */ +#undef DEFAULT_VIDEOSINK + +/* Default video source */ +#define DEFAULT_VIDEOSRC "videotestsrc" + +/* Default visualizer */ +#define DEFAULT_VISUALIZER "goom" + +/* Disable Orc */ +#undef DISABLE_ORC + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* gettext package name */ +#define GETTEXT_PACKAGE "gst-plugins-good-0.10" + +/* Defined if gcov is enabled to force a rebuild due to config.h changing */ +#undef GST_GCOV_ENABLED + +/* Default errorlevel to use */ +#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR + +/* GStreamer license */ +#define GST_LICENSE "LGPL" + +/* package name in plugins */ +#define GST_PACKAGE_NAME "GStreamer Good Plug-ins source release" + +/* package origin */ +#define GST_PACKAGE_ORIGIN "Unknown package origin" + +/* GStreamer package release date/time for plugins as YYYY-MM-DD */ +#define GST_PACKAGE_RELEASE_DATETIME "2012-02-20" + +/* struct v4l2_buffer missing */ +#undef GST_V4L2_MISSING_BUFDECL + +/* I know the API is subject to change. */ +#undef G_UDEV_API_IS_SUBJECT_TO_CHANGE + +/* Define to enable aalib ASCII Art library (used by aasink). */ +#undef HAVE_AALIB + +/* Define to enable XML library (used by annodex). */ +#undef HAVE_ANNODEX + +/* Define to 1 if you have the `asinh' function. */ +#undef HAVE_ASINH + +/* Define to enable bz2 library for matroska . */ +#undef HAVE_BZ2 + +/* Define to enable Cairo graphics rendering (used by cairo). */ +#undef HAVE_CAIRO + +/* Define to enable Cairo graphics rendering gobject bindings (used by + cairooverlay). */ +#undef HAVE_CAIRO_GOBJECT + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +#undef HAVE_CFLOCALECOPYCURRENT + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +#undef HAVE_CFPREFERENCESCOPYAPPVALUE + +/* Define to 1 if you have the `cosh' function. */ +#undef HAVE_COSH + +/* Define if the host CPU is an Alpha */ +#undef HAVE_CPU_ALPHA + +/* Define if the host CPU is an ARM */ +#undef HAVE_CPU_ARM + +/* Define if the host CPU is a CRIS */ +#undef HAVE_CPU_CRIS + +/* Define if the host CPU is a CRISv32 */ +#undef HAVE_CPU_CRISV32 + +/* Define if the host CPU is a HPPA */ +#undef HAVE_CPU_HPPA + +/* Define if the host CPU is an x86 */ +#define HAVE_CPU_I386 1 + +/* Define if the host CPU is a IA64 */ +#undef HAVE_CPU_IA64 + +/* Define if the host CPU is a M68K */ +#undef HAVE_CPU_M68K + +/* Define if the host CPU is a MIPS */ +#undef HAVE_CPU_MIPS + +/* Define if the host CPU is a PowerPC */ +#undef HAVE_CPU_PPC + +/* Define if the host CPU is a 64 bit PowerPC */ +#undef HAVE_CPU_PPC64 + +/* Define if the host CPU is a S390 */ +#undef HAVE_CPU_S390 + +/* Define if the host CPU is a SPARC */ +#undef HAVE_CPU_SPARC + +/* Define if the host CPU is a x86_64 */ +#undef HAVE_CPU_X86_64 + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to enable DirectSound plug-in (used by directsoundsink). */ +#undef HAVE_DIRECTSOUND + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* define for working do while(0) macros */ +#undef HAVE_DOWHILE_MACROS + +/* Define to enable raw1394 and avc1394 library (used by 1394). */ +#undef HAVE_DV1394 + +/* Define to enable ESounD sound daemon (used by esdsink). */ +#undef HAVE_ESD + +/* Define to enable building of experimental plug-ins. */ +#undef HAVE_EXPERIMENTAL + +/* Define to enable building of plug-ins with external deps. */ +#undef HAVE_EXTERNAL + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* FIONREAD ioctl found in sys/filio.h */ +#undef HAVE_FIONREAD_IN_SYS_FILIO + +/* FIONREAD ioctl found in sys/ioclt.h */ +#undef HAVE_FIONREAD_IN_SYS_IOCTL + +/* Define to enable FLAC lossless audio (used by flac). */ +#undef HAVE_FLAC + +/* Define to 1 if you have the `fpclass' function. */ +#undef HAVE_FPCLASS + +/* Define if compiler supports gcc inline assembly */ +#undef HAVE_GCC_ASM + +/* Define to enable GConf libraries (used by gconfelements). */ +#undef HAVE_GCONF + +/* Define to enable GConf schemas. */ +#undef HAVE_GCONFTOOL + +/* Define to enable GDK pixbuf (used by gdkpixbuf). */ +#undef HAVE_GDK_PIXBUF + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to enable Video 4 Linux 2 (used by v4l2src). */ +#undef HAVE_GST_V4L2 + +/* Whether gudev is available for device detection */ +#undef HAVE_GUDEV + +/* Define to enable HAL libraries (used by halelements). */ +#undef HAVE_HAL + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if we have struct ip_mreqn */ +#undef HAVE_IP_MREQN + +/* Define to 1 if you have the `isinf' function. */ +#undef HAVE_ISINF + +/* Define to enable Jack (used by jack). */ +#undef HAVE_JACK + +/* defined if jack >= 0.120.1 is available */ +#undef HAVE_JACK_0_120_1 + +/* defined if jack >= 1.9.7 is available */ +#undef HAVE_JACK_1_9_7 + +/* Define to enable jpeg library (used by jpeg). */ +#undef HAVE_JPEG + +/* Define to enable libcaca coloured ASCII art (used by cacasink). */ +#undef HAVE_LIBCACA + +/* Define to enable libdv DV demuxer/decoder (used by dv). */ +#undef HAVE_LIBDV + +/* Define to enable Portable Network Graphics library (used by png). */ +#undef HAVE_LIBPNG + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#undef HAVE_LIBSOCKET + +/* soup gnome integration */ +#undef HAVE_LIBSOUP_GNOME + +/* Whether libv4l2 is available for video buffer conversion */ +#undef HAVE_LIBV4L2 + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Use Orc */ +#undef HAVE_ORC + +/* Define to enable OSS audio (used by ossaudio). */ +#undef HAVE_OSS + +/* Define to enable Open Sound System 4 (used by oss4). */ +#undef HAVE_OSS4 + +/* Define if OSS includes are in /machine/ */ +#undef HAVE_OSS_INCLUDE_IN_MACHINE + +/* Define if OSS includes are in / */ +#undef HAVE_OSS_INCLUDE_IN_ROOT + +/* Define if OSS includes are in /sys/ */ +#undef HAVE_OSS_INCLUDE_IN_SYS + +/* Define to enable OSX audio (used by osxaudio). */ +#undef HAVE_OSX_AUDIO + +/* Define to enable OSX video (used by osxvideosink). */ +#undef HAVE_OSX_VIDEO + +/* Define to 1 if you have the header file. */ +#define HAVE_PROCESS_H 1 + +/* Define to enable pulseaudio plug-in (used by pulseaudio). */ +#undef HAVE_PULSE + +/* defined if pulseaudio >= 0.9.20 is available */ +#undef HAVE_PULSE_0_9_20 + +/* defined if pulseaudio >= 1.0 is available */ +#undef HAVE_PULSE_1_0 + +/* Define if RDTSC is available */ +#undef HAVE_RDTSC + +/* Define to 1 if you have the `rint' function. */ +#undef HAVE_RINT + +/* Define to enable Shoutcast/Icecast client library (used by shout2). */ +#undef HAVE_SHOUT2 + +/* Define to 1 if you have the `sinh' function. */ +#undef HAVE_SINH + +/* Define to enable soup http client plugin (2.4) (used by souphttpsrc). */ +#undef HAVE_SOUP + +/* Define to enable speex speech codec (used by speex). */ +#undef HAVE_SPEEX + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to enable Sun Audio (used by sunaudio). */ +#undef HAVE_SUNAUDIO + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to enable taglib tagging library (used by taglib). */ +#undef HAVE_TAGLIB + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if valgrind should be used */ +#undef HAVE_VALGRIND + +/* Define to enable wavpack plug-in (used by wavpack). */ +#undef HAVE_WAVPACK + +/* Define to 1 if you have the header file. */ +#define HAVE_WINSOCK2_H 1 + +/* Define to enable X libraries and plugins (used by ximagesrc). */ +#undef HAVE_X + +/* Define to enable X Shared Memory extension. */ +#undef HAVE_XSHM + +/* Define to enable X11 XVideo extensions. */ +#undef HAVE_XVIDEO + +/* Define to enable zlib support for qtdemux/matroska. */ +#undef HAVE_ZLIB + +/* the host CPU */ +#define HOST_CPU "i686" + +/* gettext locale dir */ +#define LOCALEDIR PREFIX "\\share\\locale" + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#define PACKAGE "gst-plugins-good" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "GStreamer Good Plug-ins" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "GStreamer Good Plug-ins 0.10.31" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "gst-plugins-good" + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.10.31" + +/* directory where plugins are located */ +#ifdef _DEBUG +# define PLUGINDIR PREFIX "\\debug\\lib\\gstreamer-0.10" +#else +# define PLUGINDIR PREFIX "\\lib\\gstreamer-0.10" +#endif + +/* The size of `char', as computed by sizeof. */ +#undef SIZEOF_CHAR + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `void*', as computed by sizeof. */ +#undef SIZEOF_VOIDP + +/* defined if speex 1.0.x API detected */ +#undef SPEEX_1_0 + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#define VERSION "0.10.31" + +/* old wavpack API */ +#undef WAVPACK_OLD_API + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to 1 if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING diff --git a/win32/common/gstudp-enumtypes.c b/win32/common/gstudp-enumtypes.c new file mode 100644 index 0000000..7982ccd --- /dev/null +++ b/win32/common/gstudp-enumtypes.c @@ -0,0 +1,25 @@ + + + +#include "gstudp-enumtypes.h" + +#include "gstudp.h" + +/* enumerations from "gstudp.h" */ +GType +gst_udp_control_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + {CONTROL_ZERO, "CONTROL_ZERO", "zero"}, + {CONTROL_NONE, "CONTROL_NONE", "none"}, + {CONTROL_UDP, "CONTROL_UDP", "udp"}, + {CONTROL_TCP, "CONTROL_TCP", "tcp"}, + {0, NULL, NULL} + }; + GType g_define_type_id = g_enum_register_static ("GstUDPControl", values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + return g_define_type_id__volatile; +} diff --git a/win32/common/gstudp-enumtypes.h b/win32/common/gstudp-enumtypes.h new file mode 100644 index 0000000..5f2dca2 --- /dev/null +++ b/win32/common/gstudp-enumtypes.h @@ -0,0 +1,19 @@ + + + +#ifndef __GST_UDP_ENUM_TYPES_H__ +#define __GST_UDP_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS + +/* enumerations from "gstudp.h" */ +GType gst_udp_control_get_type (void); +#define GST_TYPE_UDP_CONTROL (gst_udp_control_get_type()) +G_END_DECLS + +#endif /* __GST_UDP_ENUM_TYPES_H__ */ + + + diff --git a/win32/vs6/autogen.dsp b/win32/vs6/autogen.dsp new file mode 100644 index 0000000..0f46f2e --- /dev/null +++ b/win32/vs6/autogen.dsp @@ -0,0 +1,149 @@ +# Microsoft Developer Studio Project File - Name="autogen" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Generic Project" 0x010a + +CFG=autogen - 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 "autogen.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 "autogen.mak" CFG="autogen - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "autogen - Win32 Release" (based on "Win32 (x86) Generic Project") +!MESSAGE "autogen - Win32 Debug" (based on "Win32 (x86) Generic Project") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +MTL=midl.exe + +!IF "$(CFG)" == "autogen - 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 Target_Dir "" + +!ELSEIF "$(CFG)" == "autogen - 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 Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "autogen - Win32 Release" +# Name "autogen - Win32 Debug" +# Begin Source File + +SOURCE="..\..\gst\playback\gstplay-marshal.list" + +!IF "$(CFG)" == "autogen - Win32 Release" + +# Begin Custom Build +InputPath="..\..\gst\playback\gstplay-marshal.list" + +BuildCmds= \ + echo #include "glib-object.h" > gstudp-marshal.c.tmp \ + echo #include "gstudp-marshal.h" >> gstudp-marshal.c.tmp \ + glib-genmarshal --body --prefix=gst_udp_marshal ..\..\gst\udp\gstudp-marshal.list >> gstudp-marshal.c.tmp \ + move gstudp-marshal.c.tmp ..\..\gst\udp\gstudp-marshal.c \ + echo #include "gst/gstconfig.h" > gstudp-marshal.h.tmp \ + glib-genmarshal --header --prefix=gst_udp_marshal ..\..\gst\udp\gstudp-marshal.list >> gstudp-marshal.h.tmp \ + move gstudp-marshal.h.tmp ..\..\gst\udp\gstudp-marshal.h \ + + +"..\..\gst\udp\gstudp-marshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"..\..\gst\udp\gstudp-marshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "autogen - Win32 Debug" + +# Begin Custom Build +InputPath="..\..\gst\playback\gstplay-marshal.list" + +BuildCmds= \ + echo #include "glib-object.h" > gstudp-marshal.c.tmp \ + echo #include "gstudp-marshal.h" >> gstudp-marshal.c.tmp \ + glib-genmarshal --body --prefix=gst_udp_marshal ..\..\gst\udp\gstudp-marshal.list >> gstudp-marshal.c.tmp \ + move gstudp-marshal.c.tmp ..\..\gst\udp\gstudp-marshal.c \ + echo #include "gst/gstconfig.h" > gstudp-marshal.h.tmp \ + glib-genmarshal --header --prefix=gst_udp_marshal ..\..\gst\udp\gstudp-marshal.list >> gstudp-marshal.h.tmp \ + move gstudp-marshal.h.tmp ..\..\gst\udp\gstudp-marshal.h \ + + +"..\..\gst\udp\gstudp-marshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"..\..\gst\udp\gstudp-marshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE="..\common\gstudp-enumtypes.c" + +!IF "$(CFG)" == "autogen - Win32 Release" + +# Begin Custom Build +InputPath="..\common\gstudp-enumtypes.c" + +BuildCmds= \ + copy /y ..\common\gstudp-enumtypes.c ..\..\gst\udp\gstudp-enumtypes.c \ + copy /y ..\common\gstudp-enumtypes.h ..\..\gst\udp\gstudp-enumtypes.h \ + + +"..\..\gst\udp\gstudp-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"..\..\gst\udp\gstudp-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "autogen - Win32 Debug" + +# Begin Custom Build +InputPath="..\common\gstudp-enumtypes.c" + +"..\..\gst\udp\gstudp-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy /y ..\common\gstudp-enumtypes.c ..\..\gst\udp\gstudp-enumtypes.c + copy /y ..\common\gstudp-enumtypes.h ..\..\gst\udp\gstudp-enumtypes.h + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/win32/vs6/gst_plugins_good.dsw b/win32/vs6/gst_plugins_good.dsw new file mode 100644 index 0000000..0180e15 --- /dev/null +++ b/win32/vs6/gst_plugins_good.dsw @@ -0,0 +1,524 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "autogen"=".\autogen.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstalaw"=".\libgstalaw.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstalpha"=".\libgstalpha.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstalphacolor"=".\libgstalphacolor.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstapetag"=".\libgstapetag.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstaudiofx"=".\libgstaudiofx.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstauparse"=".\libgstauparse.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstautodetect"=".\libgstautodetect.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstavi"=".\libgstavi.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstcutter"=".\libgstcutter.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstdebug"=".\libgstdebug.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstdirectdraw"=".\libgstdirectdraw.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstdirectsound"=".\libgstdirectsound.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstdvdemux"=".\libgstdvdemux.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgsteffectv"=".\libgsteffectv.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstflx"=".\libgstflx.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstgoom"=".\libgstgoom.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgsticydemux"=".\libgsticydemux.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstid3demux"=".\libgstid3demux.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstinterleave"=".\libgstinterleave.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstjpeg"=".\libgstjpeg.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstlevel"=".\libgstlevel.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstmatroska"=".\libgstmatroska.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstmedian"=".\libgstmedian.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstmonoscope"=".\libgstmonoscope.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstmulaw"=".\libgstmulaw.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstmultipart"=".\libgstmultipart.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstpng"=".\libgstpng.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstqtdemux"=".\libgstqtdemux.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstrtp"=".\libgstrtp.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstrtsp"=".\libgstrtsp.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstsmpte"=".\libgstsmpte.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstspeex"=".\libgstspeex.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstudp"=".\libgstudp.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name autogen + End Project Dependency +}}} + +############################################################################### + +Project: "libgstvideobalance"=".\libgstvideobalance.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstvideobox"=".\libgstvideobox.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstvideocrop"=".\libgstvideocrop.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstvideoflip"=".\libgstvideoflip.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstvideomixer"=".\libgstvideomixer.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstwaveform"=".\libgstwaveform.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstwavenc"=".\libgstwavenc.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libgstwavparse"=".\libgstwavparse.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/win32/vs6/libgstalaw.dsp b/win32/vs6/libgstalaw.dsp new file mode 100644 index 0000000..27b3559 --- /dev/null +++ b/win32/vs6/libgstalaw.dsp @@ -0,0 +1,135 @@ +# Microsoft Developer Studio Project File - Name="libgstalaw" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstalaw - 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 "libgstalaw.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 "libgstalaw.mak" CFG="libgstalaw - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstalaw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstalaw - 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)" == "libgstalaw - 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 "LIBGSTALAW_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTALAW_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstalaw.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstalaw - 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 "LIBGSTALAW_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTALAW_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstalaw.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstalaw - Win32 Release" +# Name "libgstalaw - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE="..\..\gst\law\alaw-decode.c" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\law\alaw-encode.c" +# End Source File +# Begin Source File + +SOURCE=..\..\gst\law\alaw.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE="..\..\gst\law\alaw-decode.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\law\alaw-encode.h" +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstalpha.dsp b/win32/vs6/libgstalpha.dsp new file mode 100644 index 0000000..8e2e541 --- /dev/null +++ b/win32/vs6/libgstalpha.dsp @@ -0,0 +1,119 @@ +# Microsoft Developer Studio Project File - Name="libgstalpha" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstalpha - 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 "libgstalpha.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 "libgstalpha.mak" CFG="libgstalpha - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstalpha - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstalpha - 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)" == "libgstalpha - 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 "LIBGSTALPHA_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTALPHA_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib libgstvideo-0.10.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\libgstalpha.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstalpha - 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 "LIBGSTALPHA_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTALPHA_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib libgstvideo-0.10.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\libgstalpha.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstalpha - Win32 Release" +# Name "libgstalpha - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\alpha\gstalpha.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstalphacolor.dsp b/win32/vs6/libgstalphacolor.dsp new file mode 100644 index 0000000..6a22405 --- /dev/null +++ b/win32/vs6/libgstalphacolor.dsp @@ -0,0 +1,119 @@ +# Microsoft Developer Studio Project File - Name="libgstalphacolor" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstalphacolor - 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 "libgstalphacolor.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 "libgstalphacolor.mak" CFG="libgstalphacolor - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstalphacolor - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstalphacolor - 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)" == "libgstalphacolor - 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 "LIBGSTALPHACOLOR_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTALPHACOLOR_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" +# Begin Special Build Tool +TargetPath=.\Release\libgstalphacolor.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstalphacolor - 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 "LIBGSTALPHACOLOR_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTALPHACOLOR_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstalphacolor.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstalphacolor - Win32 Release" +# Name "libgstalphacolor - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\alpha\gstalphacolor.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstapetag.dsp b/win32/vs6/libgstapetag.dsp new file mode 100644 index 0000000..fe5cdef --- /dev/null +++ b/win32/vs6/libgstapetag.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstapetag" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstapetag - 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 "libgstapetag.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 "libgstapetag.mak" CFG="libgstapetag - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstapetag - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstapetag - 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)" == "libgstapetag - 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 "LIBGSTAPETAG_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTAPETAG_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgsttag-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstapetag.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstapetag - 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 "LIBGSTAPETAG_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTAPETAG_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgsttag-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstapetag.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstapetag - Win32 Release" +# Name "libgstapetag - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\apetag\gstapedemux.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\apetag\gstapedemux.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstaudiofx.dsp b/win32/vs6/libgstaudiofx.dsp new file mode 100644 index 0000000..7dae7bf --- /dev/null +++ b/win32/vs6/libgstaudiofx.dsp @@ -0,0 +1,151 @@ +# Microsoft Developer Studio Project File - Name="libgstaudiofx" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstaudiofx - 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 "libgstaudiofx.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 "libgstaudiofx.mak" CFG="libgstaudiofx - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstaudiofx - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstaudiofx - 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)" == "libgstaudiofx - 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 "LIBGSTAUDIOFX_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTAUDIOFX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib libgstaudio-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstaudiofx.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstaudiofx - 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 "LIBGSTAUDIOFX_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTAUDIOFX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib libgstaudio-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstaudiofx.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstaudiofx - Win32 Release" +# Name "libgstaudiofx - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\audiofx\audioamplify.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\audiofx\audiochebband.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\audiofx\audiocheblimit.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\audiofx\audiodynamic.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\audiofx\audiofx.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\audiofx\audioinvert.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\audiofx\audiopanorama.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\audiofx\audiowsincband.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\audiofx\audiowsinclimit.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstauparse.dsp b/win32/vs6/libgstauparse.dsp new file mode 100644 index 0000000..9ceab01 --- /dev/null +++ b/win32/vs6/libgstauparse.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstauparse" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstauparse - 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 "libgstauparse.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 "libgstauparse.mak" CFG="libgstauparse - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstauparse - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstauparse - 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)" == "libgstauparse - 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 "LIBGSTAUPARSE_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTAUPARSE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" +# Begin Special Build Tool +TargetPath=.\Release\libgstauparse.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstauparse - 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 "LIBGSTAUPARSE_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTAUPARSE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstauparse.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstauparse - Win32 Release" +# Name "libgstauparse - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\auparse\gstauparse.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\auparse\gstauparse.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstautodetect.dsp b/win32/vs6/libgstautodetect.dsp new file mode 100644 index 0000000..adc015a --- /dev/null +++ b/win32/vs6/libgstautodetect.dsp @@ -0,0 +1,139 @@ +# Microsoft Developer Studio Project File - Name="libgstautodetect" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstautodetect - 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 "libgstautodetect.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 "libgstautodetect.mak" CFG="libgstautodetect - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstautodetect - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstautodetect - 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)" == "libgstautodetect - 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 "LIBGSTAUTODETECT_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst-libs/gst/audio" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUTODETECT_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" +# Begin Special Build Tool +TargetPath=.\Release\libgstautodetect.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstautodetect - 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 "LIBGSTAUTODETECT_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst-libs/gst/audio" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUTODETECT_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstautodetect.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstautodetect - Win32 Release" +# Name "libgstautodetect - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\autodetect\gstautoaudiosink.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\autodetect\gstautodetect.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\autodetect\gstautovideosink.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\autodetect\gstautoaudiosink.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\autodetect\gstautodetect.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\autodetect\gstautovideosink.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstavi.dsp b/win32/vs6/libgstavi.dsp new file mode 100644 index 0000000..a1ac94e --- /dev/null +++ b/win32/vs6/libgstavi.dsp @@ -0,0 +1,140 @@ +# Microsoft Developer Studio Project File - Name="libgstavi" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstavi - 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 "libgstavi.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 "libgstavi.mak" CFG="libgstavi - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstavi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstavi - 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)" == "libgstavi - 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 "LIBGSTAVI_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTAVI_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# SUBTRACT LINK32 /incremental:yes +# Begin Special Build Tool +TargetPath=.\Release\libgstavi.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstavi - 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 "LIBGSTAVI_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTAVI_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstavi.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstavi - Win32 Release" +# Name "libgstavi - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\avi\gstavi.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\avi\gstavidemux.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\avi\gstavimux.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\avi\gstavisubtitle.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE="..\..\gst\avi\avi-ids.h" +# End Source File +# Begin Source File + +SOURCE=..\..\gst\avi\gstavidemux.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstcutter.dsp b/win32/vs6/libgstcutter.dsp new file mode 100644 index 0000000..832a839 --- /dev/null +++ b/win32/vs6/libgstcutter.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstcutter" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstcutter - 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 "libgstcutter.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 "libgstcutter.mak" CFG="libgstcutter - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstcutter - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstcutter - 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)" == "libgstcutter - 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 "LIBGSTCUTTER_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTCUTTER_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstcutter.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstcutter - 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 "LIBGSTCUTTER_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTCUTTER_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstcutter.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstcutter - Win32 Release" +# Name "libgstcutter - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\cutter\gstcutter.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\cutter\gstcutter.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstdirectsound.dsp b/win32/vs6/libgstdirectsound.dsp new file mode 100644 index 0000000..0928b19 --- /dev/null +++ b/win32/vs6/libgstdirectsound.dsp @@ -0,0 +1,126 @@ +# Microsoft Developer Studio Project File - Name="libgstdirectsound" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstdirectsound - 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 "libgstdirectsound.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 "libgstdirectsound.mak" CFG="libgstdirectsound - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstdirectsound - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstdirectsound - 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)" == "libgstdirectsound - 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 "LIBGSTDIRECTSOUND_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "../.." /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 "LIBGSTDIRECTSOUND_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 libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstinterfaces-0.10.lib dsound.lib dxerr9.lib user32.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\libgstdirectsound.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstdirectsound - 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 "LIBGSTDIRECTSOUND_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTDIRECTSOUND_EXPORTS" /D "HAVE_CONFIG_H" /FR /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 libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstinterfaces-0.10.lib dsound.lib dxerr9.lib user32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" /libpath:"./debug" +# SUBTRACT LINK32 /incremental:no +# Begin Special Build Tool +TargetPath=.\Debug\libgstdirectsound.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstdirectsound - Win32 Release" +# Name "libgstdirectsound - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\sys\directsound\gstdirectsoundplugin.c +# End Source File +# Begin Source File + +SOURCE=..\..\sys\directsound\gstdirectsoundsink.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\sys\directsound\gstdirectsoundsink.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgsteffectv.dsp b/win32/vs6/libgsteffectv.dsp new file mode 100644 index 0000000..f11ebe5 --- /dev/null +++ b/win32/vs6/libgsteffectv.dsp @@ -0,0 +1,155 @@ +# Microsoft Developer Studio Project File - Name="libgsteffectv" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgsteffectv - 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 "libgsteffectv.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 "libgsteffectv.mak" CFG="libgsteffectv - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgsteffectv - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgsteffectv - 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)" == "libgsteffectv - 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 "LIBGSTEFFECTV_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTEFFECTV_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgsteffectv.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgsteffectv - 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 "LIBGSTEFFECTV_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTEFFECTV_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgsteffectv.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgsteffectv - Win32 Release" +# Name "libgsteffectv - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\effectv\gstaging.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\effectv\gstdice.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\effectv\gstedge.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\effectv\gsteffectv.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\effectv\gstquark.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\effectv\gstrev.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\effectv\gstshagadelic.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\effectv\gstvertigo.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\effectv\gstwarp.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\effectv\gsteffectv.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstflx.dsp b/win32/vs6/libgstflx.dsp new file mode 100644 index 0000000..e8226a6 --- /dev/null +++ b/win32/vs6/libgstflx.dsp @@ -0,0 +1,135 @@ +# Microsoft Developer Studio Project File - Name="libgstflx" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstflx - 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 "libgstflx.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 "libgstflx.mak" CFG="libgstflx - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstflx - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstflx - 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)" == "libgstflx - 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 "LIBGSTFLX_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTFLX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstflx.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstflx - 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 "LIBGSTFLX_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTFLX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstflx.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstflx - Win32 Release" +# Name "libgstflx - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\flx\flx_color.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\flx\gstflxdec.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\flx\flx_color.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\flx\flx_fmt.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\flx\gstflxdec.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstgoom.dsp b/win32/vs6/libgstgoom.dsp new file mode 100644 index 0000000..76ff0f0 --- /dev/null +++ b/win32/vs6/libgstgoom.dsp @@ -0,0 +1,159 @@ +# Microsoft Developer Studio Project File - Name="libgstgoom" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstgoom - 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 "libgstgoom.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 "libgstgoom.mak" CFG="libgstgoom - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstgoom - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstgoom - 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)" == "libgstgoom - 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 "LIBGSTGOOM_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTGOOM_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstgoom.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstgoom - 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 "LIBGSTGOOM_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTGOOM_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstgoom.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstgoom - Win32 Release" +# Name "libgstgoom - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\goom\filters.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\goom_core.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\graphic.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\gstgoom.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\lines.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\goom\filters.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\goom_core.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\goom_tools.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\graphic.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\gstgoom.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\goom\lines.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgsticydemux.dsp b/win32/vs6/libgsticydemux.dsp new file mode 100644 index 0000000..ff43da1 --- /dev/null +++ b/win32/vs6/libgsticydemux.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgsticydemux" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgsticydemux - 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 "libgsticydemux.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 "libgsticydemux.mak" CFG="libgsticydemux - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgsticydemux - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgsticydemux - 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)" == "libgsticydemux - 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 "LIBGSTICYDEMUX_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTICYDEMUX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgsticydemux.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgsticydemux - 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 "LIBGSTICYDEMUX_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTICYDEMUX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgsticydemux.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgsticydemux - Win32 Release" +# Name "libgsticydemux - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\icydemux\gsticydemux.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\icydemux\gsticydemux.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstid3demux.dsp b/win32/vs6/libgstid3demux.dsp new file mode 100644 index 0000000..5f36c9b --- /dev/null +++ b/win32/vs6/libgstid3demux.dsp @@ -0,0 +1,135 @@ +# Microsoft Developer Studio Project File - Name="libgstid3demux" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstid3demux - 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 "libgstid3demux.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 "libgstid3demux.mak" CFG="libgstid3demux - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstid3demux - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstid3demux - 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)" == "libgstid3demux - 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 "LIBGSTID3DEMUX_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTID3DEMUX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgsttag-0.10.lib glib-2.0.lib gobject-2.0.lib zlib.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstid3demux.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstid3demux - 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 "LIBGSTID3DEMUX_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTID3DEMUX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgsttag-0.10.lib glib-2.0D.lib gobject-2.0D.lib zlib.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstid3demux.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstid3demux - Win32 Release" +# Name "libgstid3demux - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\id3demux\gstid3demux.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\id3demux\id3tags.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\id3demux\id3v2frames.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\id3demux\gstid3demux.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\id3demux\id3tags.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstinterleave.dsp b/win32/vs6/libgstinterleave.dsp new file mode 100644 index 0000000..61dfaed --- /dev/null +++ b/win32/vs6/libgstinterleave.dsp @@ -0,0 +1,131 @@ +# Microsoft Developer Studio Project File - Name="libgstinterleave" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstinterleave - 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 "libgstinterleave.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 "libgstinterleave.mak" CFG="libgstinterleave - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstinterleave - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstinterleave - 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)" == "libgstinterleave - 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 "LIBGSTINTERLEAVE_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTINTERLEAVE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstinterleave.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstinterleave - 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 "LIBGSTINTERLEAVE_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTINTERLEAVE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstinterleave.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstinterleave - Win32 Release" +# Name "libgstinterleave - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\interleave\deinterleave.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\interleave\interleave.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\interleave\plugin.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\interleave\plugin.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstjpeg.dsp b/win32/vs6/libgstjpeg.dsp new file mode 100644 index 0000000..e8fbdc1 --- /dev/null +++ b/win32/vs6/libgstjpeg.dsp @@ -0,0 +1,163 @@ +# Microsoft Developer Studio Project File - Name="libgstjpeg" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstjpeg - 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 "libgstjpeg.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 "libgstjpeg.mak" CFG="libgstjpeg - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstjpeg - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstjpeg - 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)" == "libgstjpeg - 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 "LIBGSTJPEG_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTJPEG_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libjpeg.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstjpeg.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstjpeg - 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 "LIBGSTJPEG_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTJPEG_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libjpeg.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstjpeg.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstjpeg - Win32 Release" +# Name "libgstjpeg - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstjpeg.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstjpegdec.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstjpegenc.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstsmokedec.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstsmokeenc.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\smokecodec.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstjpegdec.h +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstjpegenc.h +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstsmokedec.h +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\gstsmokeenc.h +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\smokecodec.h +# End Source File +# Begin Source File + +SOURCE=..\..\ext\jpeg\smokeformat.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstlevel.dsp b/win32/vs6/libgstlevel.dsp new file mode 100644 index 0000000..2c5334f --- /dev/null +++ b/win32/vs6/libgstlevel.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstlevel" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstlevel - 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 "libgstlevel.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 "libgstlevel.mak" CFG="libgstlevel - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstlevel - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstlevel - 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)" == "libgstlevel - 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 "LIBGSTLEVEL_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTLEVEL_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstlevel.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstlevel - 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 "LIBGSTLEVEL_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTLEVEL_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstlevel.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstlevel - Win32 Release" +# Name "libgstlevel - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\level\gstlevel.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\level\gstlevel.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstmatroska.dsp b/win32/vs6/libgstmatroska.dsp new file mode 100644 index 0000000..dbb6772 --- /dev/null +++ b/win32/vs6/libgstmatroska.dsp @@ -0,0 +1,163 @@ +# Microsoft Developer Studio Project File - Name="libgstmatroska" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstmatroska - 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 "libgstmatroska.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 "libgstmatroska.mak" CFG="libgstmatroska - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstmatroska - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstmatroska - 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)" == "libgstmatroska - 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 "LIBGSTMATROSKA_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTMATROSKA_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib zlib.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstmatroska.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstmatroska - 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 "LIBGSTMATROSKA_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTMATROSKA_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib zlib.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstmatroska.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstmatroska - Win32 Release" +# Name "libgstmatroska - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE="..\..\gst\matroska\ebml-read.c" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\ebml-write.c" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\matroska-demux.c" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\matroska-ids.c" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\matroska-mux.c" +# End Source File +# Begin Source File + +SOURCE=..\..\gst\matroska\matroska.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE="..\..\gst\matroska\ebml-ids.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\ebml-read.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\ebml-write.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\matroska-demux.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\matroska-ids.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\matroska\matroska-mux.h" +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstmedian.dsp b/win32/vs6/libgstmedian.dsp new file mode 100644 index 0000000..db14b4e --- /dev/null +++ b/win32/vs6/libgstmedian.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstmedian" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstmedian - 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 "libgstmedian.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 "libgstmedian.mak" CFG="libgstmedian - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstmedian - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstmedian - 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)" == "libgstmedian - 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 "LIBGSTMEDIAN_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTMEDIAN_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstmedian.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstmedian - 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 "LIBGSTMEDIAN_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTMEDIAN_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstmedian.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstmedian - Win32 Release" +# Name "libgstmedian - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\median\gstmedian.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\median\gstmedian.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstmonoscope.dsp b/win32/vs6/libgstmonoscope.dsp new file mode 100644 index 0000000..26d9d0f --- /dev/null +++ b/win32/vs6/libgstmonoscope.dsp @@ -0,0 +1,135 @@ +# Microsoft Developer Studio Project File - Name="libgstmonoscope" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstmonoscope - 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 "libgstmonoscope.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 "libgstmonoscope.mak" CFG="libgstmonoscope - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstmonoscope - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstmonoscope - 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)" == "libgstmonoscope - 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 "LIBGSTMONOSCOPE_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTMONOSCOPE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstmonoscope.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstmonoscope - 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 "LIBGSTMONOSCOPE_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTMONOSCOPE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstmonoscope.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstmonoscope - Win32 Release" +# Name "libgstmonoscope - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\monoscope\convolve.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\monoscope\gstmonoscope.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\monoscope\monoscope.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\monoscope\convolve.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\monoscope\monoscope.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstmulaw.dsp b/win32/vs6/libgstmulaw.dsp new file mode 100644 index 0000000..907f9dc --- /dev/null +++ b/win32/vs6/libgstmulaw.dsp @@ -0,0 +1,143 @@ +# Microsoft Developer Studio Project File - Name="libgstmulaw" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstmulaw - 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 "libgstmulaw.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 "libgstmulaw.mak" CFG="libgstmulaw - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstmulaw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstmulaw - 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)" == "libgstmulaw - 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 "LIBGSTMULAW_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTMULAW_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstmulaw.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstmulaw - 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 "LIBGSTMULAW_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTMULAW_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstmulaw.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstmulaw - Win32 Release" +# Name "libgstmulaw - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE="..\..\gst\law\mulaw-conversion.c" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\law\mulaw-decode.c" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\law\mulaw-encode.c" +# End Source File +# Begin Source File + +SOURCE=..\..\gst\law\mulaw.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE="..\..\gst\law\mulaw-conversion.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\law\mulaw-decode.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\law\mulaw-encode.h" +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstmultipart.dsp b/win32/vs6/libgstmultipart.dsp new file mode 100644 index 0000000..76103be --- /dev/null +++ b/win32/vs6/libgstmultipart.dsp @@ -0,0 +1,127 @@ +# Microsoft Developer Studio Project File - Name="libgstmultipart" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstmultipart - 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 "libgstmultipart.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 "libgstmultipart.mak" CFG="libgstmultipart - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstmultipart - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstmultipart - 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)" == "libgstmultipart - 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 "LIBGSTMULTIPART_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTMULTIPART_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstmultipart.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstmultipart - 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 "LIBGSTMULTIPART_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTMULTIPART_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstmultipart.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstmultipart - Win32 Release" +# Name "libgstmultipart - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\multipart\multipart.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\multipart\multipartdemux.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\multipart\multipartmux.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstpng.dsp b/win32/vs6/libgstpng.dsp new file mode 100644 index 0000000..773c808 --- /dev/null +++ b/win32/vs6/libgstpng.dsp @@ -0,0 +1,139 @@ +# Microsoft Developer Studio Project File - Name="libgstpng" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstpng - 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 "libgstpng.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 "libgstpng.mak" CFG="libgstpng - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstpng - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstpng - 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)" == "libgstpng - 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 "LIBGSTPNG_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTPNG_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libpng.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstpng.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstpng - 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 "LIBGSTPNG_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTPNG_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libpng.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstpng.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstpng - Win32 Release" +# Name "libgstpng - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\ext\libpng\gstpng.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\libpng\gstpngdec.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\libpng\gstpngenc.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\ext\libpng\gstpng.h +# End Source File +# Begin Source File + +SOURCE=..\..\ext\libpng\gstpngdec.h +# End Source File +# Begin Source File + +SOURCE=..\..\ext\libpng\gstpngenc.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstqtdemux.dsp b/win32/vs6/libgstqtdemux.dsp new file mode 100644 index 0000000..6c35e86 --- /dev/null +++ b/win32/vs6/libgstqtdemux.dsp @@ -0,0 +1,142 @@ +# Microsoft Developer Studio Project File - Name="libgstqtdemux" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstqtdemux - 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 "libgstqtdemux.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 "libgstqtdemux.mak" CFG="libgstqtdemux - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstqtdemux - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstqtdemux - 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)" == "libgstqtdemux - 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 "LIBGSTQTDEMUX_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" /I "../../../gst-plugins-good/gst/qtdemux" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTQTDEMUX_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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgsttag-0.10.lib zlib.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\libgstqtdemux.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstqtdemux - 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 "LIBGSTQTDEMUX_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" /I "../../../gst-plugins-good/gst/qtdemux" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTQTDEMUX_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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgsttag-0.10.lib zlib.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\libgstqtdemux.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstqtdemux - Win32 Release" +# Name "libgstqtdemux - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\qtdemux\gstrtpxqtdepay.c +# SUBTRACT CPP /YX +# End Source File +# Begin Source File + +SOURCE=..\..\gst\qtdemux\qtdemux.c +# SUBTRACT CPP /YX +# End Source File +# Begin Source File + +SOURCE=..\..\gst\qtdemux\qtdemux_dump.c +# SUBTRACT CPP /YX +# End Source File +# Begin Source File + +SOURCE=..\..\gst\qtdemux\qtdemux_types.c +# SUBTRACT CPP /YX +# End Source File +# Begin Source File + +SOURCE=..\..\gst\qtdemux\quicktime.c +# SUBTRACT CPP /YX +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\qtdemux\qtdemux.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstrtp.dsp b/win32/vs6/libgstrtp.dsp new file mode 100644 index 0000000..1c89fe5 --- /dev/null +++ b/win32/vs6/libgstrtp.dsp @@ -0,0 +1,359 @@ +# Microsoft Developer Studio Project File - Name="libgstrtp" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstrtp - 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 "libgstrtp.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 "libgstrtp.mak" CFG="libgstrtp - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstrtp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstrtp - 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)" == "libgstrtp - 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 "LIBGSTRTP_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../gst/rtsp" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgsttag-0.10.lib Ws2_32.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstrtp.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstrtp - 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 "LIBGSTRTP_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../gst/rtsp" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgsttag-0.10.lib Ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstrtp.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstrtp - Win32 Release" +# Name "libgstrtp - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\rtp\fnv1hash.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstasteriskh263.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtp.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpac3depay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpamrdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpamrpay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpgsmdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpgsmpay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph263depay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph263pay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph263pdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph263ppay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph264depay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph264pay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpilbcdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpilbcpay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpL16depay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpL16pay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp2tdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp2tpay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp4adepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp4gdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp4gpay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp4vdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp4vpay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmpadepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmpapay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmpvdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmpvpay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtppcmadepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtppcmapay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtppcmudepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtppcmupay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpspeexdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpspeexpay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpsv3vdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtptheoradepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtptheorapay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpvorbisdepay.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpvorbispay.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\rtp\gstasteriskh263.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpamrdepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpamrpay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpdepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpgsmdepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpgsmpay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph263pay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph263pdepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtph263ppay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp4gpay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp4vdepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmp4vpay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmpadepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpmpapay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtppcmadepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtppcmapay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtppcmudepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtppcmupay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpspeexdepay.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtp\gstrtpspeexpay.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstrtsp.dsp b/win32/vs6/libgstrtsp.dsp new file mode 100644 index 0000000..8bbc366 --- /dev/null +++ b/win32/vs6/libgstrtsp.dsp @@ -0,0 +1,175 @@ +# Microsoft Developer Studio Project File - Name="libgstrtsp" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstrtsp - 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 "libgstrtsp.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 "libgstrtsp.mak" CFG="libgstrtsp - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstrtsp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstrtsp - 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)" == "libgstrtsp - 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 "LIBGSTRTSP_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/rtsp" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTSP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 ws2_32.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgstrtsp-0.10.lib libgstsdp-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstrtsp.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstrtsp - 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 "LIBGSTRTSP_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/rtsp" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTSP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 ws2_32.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgstrtsp-0.10.lib libgstsdp-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstrtsp.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstrtsp - Win32 Release" +# Name "libgstrtsp - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\rtsp\gstrtpdec.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\gstrtsp.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\gstrtspext.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\gstrtspsrc.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\rtsp\gstrtpdec.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\gstrtsp.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\gstrtspsrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\rtsp.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\rtspconnection.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\rtspdefs.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\rtspmessage.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\rtsptransport.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\rtspurl.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\sdp.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\rtsp\sdpmessage.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstsmpte.dsp b/win32/vs6/libgstsmpte.dsp new file mode 100644 index 0000000..0ecf823 --- /dev/null +++ b/win32/vs6/libgstsmpte.dsp @@ -0,0 +1,143 @@ +# Microsoft Developer Studio Project File - Name="libgstsmpte" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstsmpte - 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 "libgstsmpte.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 "libgstsmpte.mak" CFG="libgstsmpte - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstsmpte - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstsmpte - 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)" == "libgstsmpte - 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 "LIBGSTSMPTE_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTSMPTE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstsmpte.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstsmpte - 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 "LIBGSTSMPTE_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTSMPTE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstsmpte.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstsmpte - Win32 Release" +# Name "libgstsmpte - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\smpte\barboxwipes.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\smpte\gstmask.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\smpte\gstsmpte.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\smpte\paint.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\smpte\gstmask.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\smpte\gstsmpte.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\smpte\paint.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstspeex.dsp b/win32/vs6/libgstspeex.dsp new file mode 100644 index 0000000..f20e650 --- /dev/null +++ b/win32/vs6/libgstspeex.dsp @@ -0,0 +1,135 @@ +# Microsoft Developer Studio Project File - Name="libgstspeex" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstspeex - 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 "libgstspeex.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 "libgstspeex.mak" CFG="libgstspeex - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstspeex - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstspeex - 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)" == "libgstspeex - 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 "LIBGSTSPEEX_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTSPEEX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libspeex.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstspeex.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstspeex - 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 "LIBGSTSPEEX_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTSPEEX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgsttag-0.10.lib libspeex.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstspeex.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstspeex - Win32 Release" +# Name "libgstspeex - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\ext\speex\gstspeex.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\speex\gstspeexdec.c +# End Source File +# Begin Source File + +SOURCE=..\..\ext\speex\gstspeexenc.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\ext\speex\gstspeexdec.h +# End Source File +# Begin Source File + +SOURCE=..\..\ext\speex\gstspeexenc.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstudp.dsp b/win32/vs6/libgstudp.dsp new file mode 100644 index 0000000..077d219 --- /dev/null +++ b/win32/vs6/libgstudp.dsp @@ -0,0 +1,179 @@ +# Microsoft Developer Studio Project File - Name="libgstudp" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstudp - 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 "libgstudp.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 "libgstudp.mak" CFG="libgstudp - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstudp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstudp - 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)" == "libgstudp - 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 "LIBGSTUDP_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/udp" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTUDP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstnetbuffer-0.10.lib Ws2_32.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstudp.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstudp - 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 "LIBGSTUDP_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/udp" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTUDP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstnetbuffer-0.10.lib Ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstudp.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstudp - Win32 Release" +# Name "libgstudp - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\udp\gstdynudpsink.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstmultiudpsink.c +# End Source File +# Begin Source File + +SOURCE="..\..\gst\udp\gstudp-enumtypes.c" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\udp\gstudp-marshal.c" +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstudp.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstudpnetutils.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstudpsink.c +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstudpsrc.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\udp\gstdynudpsink.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstmultiudpsink.h +# End Source File +# Begin Source File + +SOURCE="..\..\gst\udp\gstudp-enumtypes.h" +# End Source File +# Begin Source File + +SOURCE="..\..\gst\udp\gstudp-marshal.h" +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstudp.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstudpnetutils.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstudpsink.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\udp\gstudpsrc.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstvideobalance.dsp b/win32/vs6/libgstvideobalance.dsp new file mode 100644 index 0000000..c38f098 --- /dev/null +++ b/win32/vs6/libgstvideobalance.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstvideobalance" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstvideobalance - 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 "libgstvideobalance.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 "libgstvideobalance.mak" CFG="libgstvideobalance - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstvideobalance - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstvideobalance - 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)" == "libgstvideobalance - 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 "LIBGSTVIDEOBALANCE_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTVIDEOBALANCE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstinterfaces-0.10.lib libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstvideobalance.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstvideobalance - 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 "LIBGSTVIDEOBALANCE_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTVIDEOBALANCE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstinterfaces-0.10.lib libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstvideobalance.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstvideobalance - Win32 Release" +# Name "libgstvideobalance - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\videofilter\gstvideobalance.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\videofilter\gstvideobalance.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstvideobox.dsp b/win32/vs6/libgstvideobox.dsp new file mode 100644 index 0000000..cc1a6e6 --- /dev/null +++ b/win32/vs6/libgstvideobox.dsp @@ -0,0 +1,119 @@ +# Microsoft Developer Studio Project File - Name="libgstvideobox" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstvideobox - 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 "libgstvideobox.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 "libgstvideobox.mak" CFG="libgstvideobox - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstvideobox - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstvideobox - 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)" == "libgstvideobox - 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 "LIBGSTVIDEOBOX_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTVIDEOBOX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 liboil-0.3-0.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstvideobox.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstvideobox - 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 "LIBGSTVIDEOBOX_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTVIDEOBOX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 liboil-0.3-0.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstvideobox.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstvideobox - Win32 Release" +# Name "libgstvideobox - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\videobox\gstvideobox.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstvideocrop.dsp b/win32/vs6/libgstvideocrop.dsp new file mode 100644 index 0000000..ffeeed9 --- /dev/null +++ b/win32/vs6/libgstvideocrop.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstvideocrop" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstvideocrop - 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 "libgstvideocrop.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 "libgstvideocrop.mak" CFG="libgstvideocrop - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstvideocrop - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstvideocrop - 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)" == "libgstvideocrop - 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 "LIBGSTVIDEOCROP_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTVIDEOCROP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstvideocrop.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstvideocrop - 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 "LIBGSTVIDEOCROP_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTVIDEOCROP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstvideocrop.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstvideocrop - Win32 Release" +# Name "libgstvideocrop - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\videocrop\gstvideocrop.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\videocrop\gstvideocrop.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstvideoflip.dsp b/win32/vs6/libgstvideoflip.dsp new file mode 100644 index 0000000..7b8e84d --- /dev/null +++ b/win32/vs6/libgstvideoflip.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstvideoflip" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstvideoflip - 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 "libgstvideoflip.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 "libgstvideoflip.mak" CFG="libgstvideoflip - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstvideoflip - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstvideoflip - 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)" == "libgstvideoflip - 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 "LIBGSTVIDEOFLIP_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTVIDEOFLIP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstvideoflip.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstvideoflip - 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 "LIBGSTVIDEOFLIP_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTVIDEOFLIP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstvideoflip.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstvideoflip - Win32 Release" +# Name "libgstvideoflip - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\videofilter\gstvideoflip.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\videofilter\gstvideoflip.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstvideomixer.dsp b/win32/vs6/libgstvideomixer.dsp new file mode 100644 index 0000000..5fb2118 --- /dev/null +++ b/win32/vs6/libgstvideomixer.dsp @@ -0,0 +1,119 @@ +# Microsoft Developer Studio Project File - Name="libgstvideomixer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstvideomixer - 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 "libgstvideomixer.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 "libgstvideomixer.mak" CFG="libgstvideomixer - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstvideomixer - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstvideomixer - 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)" == "libgstvideomixer - 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 "LIBGSTVIDEOMIXER_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTVIDEOMIXER_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstvideomixer.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstvideomixer - 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 "LIBGSTVIDEOMIXER_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTVIDEOMIXER_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstvideomixer.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstvideomixer - Win32 Release" +# Name "libgstvideomixer - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\videomixer\videomixer.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstwaveform.dsp b/win32/vs6/libgstwaveform.dsp new file mode 100644 index 0000000..0773b46 --- /dev/null +++ b/win32/vs6/libgstwaveform.dsp @@ -0,0 +1,126 @@ +# Microsoft Developer Studio Project File - Name="libgstwaveform" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstwaveform - 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 "libgstwaveform.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 "libgstwaveform.mak" CFG="libgstwaveform - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstwaveform - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstwaveform - 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)" == "libgstwaveform - 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 "LIBGSTWAVEFORM_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "../.." /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 "LIBGSTWAVEFORM_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 Winmm.lib libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.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\libgstwaveform.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstwaveform - 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 "LIBGSTWAVEFORM_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTWAVEFORM_EXPORTS" /D "HAVE_CONFIG_H" /FR /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 Winmm.lib libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" /libpath:"./debug" +# SUBTRACT LINK32 /incremental:no +# Begin Special Build Tool +TargetPath=.\Debug\libgstwaveform.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstwaveform - Win32 Release" +# Name "libgstwaveform - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\sys\waveform\gstwaveformplugin.c +# End Source File +# Begin Source File + +SOURCE=..\..\sys\waveform\gstwaveformsink.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\sys\waveform\gstwaveformsink.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstwavenc.dsp b/win32/vs6/libgstwavenc.dsp new file mode 100644 index 0000000..c81e8fd --- /dev/null +++ b/win32/vs6/libgstwavenc.dsp @@ -0,0 +1,127 @@ +# Microsoft Developer Studio Project File - Name="libgstwavenc" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstwavenc - 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 "libgstwavenc.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 "libgstwavenc.mak" CFG="libgstwavenc - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstwavenc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstwavenc - 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)" == "libgstwavenc - 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 "LIBGSTWAVENC_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTWAVENC_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstwavenc.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstwavenc - 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 "LIBGSTWAVENC_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTWAVENC_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstwavenc.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstwavenc - Win32 Release" +# Name "libgstwavenc - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\wavenc\gstwavenc.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\wavenc\gstwavenc.h +# End Source File +# Begin Source File + +SOURCE=..\..\gst\wavenc\riff.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs6/libgstwavparse.dsp b/win32/vs6/libgstwavparse.dsp new file mode 100644 index 0000000..612805d --- /dev/null +++ b/win32/vs6/libgstwavparse.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="libgstwavparse" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libgstwavparse - 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 "libgstwavparse.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 "libgstwavparse.mak" CFG="libgstwavparse - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libgstwavparse - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libgstwavparse - 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)" == "libgstwavparse - 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 "LIBGSTWAVPARSE_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "./" /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 "LIBGSTWAVPARSE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c +# SUBTRACT CPP /YX +# 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 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" +# Begin Special Build Tool +TargetPath=.\Release\libgstwavparse.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libgstwavparse - 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 "LIBGSTWAVPARSE_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /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 "LIBGSTWAVPARSE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c +# SUBTRACT CPP /YX +# 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 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" +# Begin Special Build Tool +TargetPath=.\Debug\libgstwavparse.dll +SOURCE="$(InputPath)" +PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libgstwavparse - Win32 Release" +# Name "libgstwavparse - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\gst\wavparse\gstwavparse.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\gst\wavparse\gstwavparse.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/win32/vs7/libgstdirectsound.vcproj b/win32/vs7/libgstdirectsound.vcproj new file mode 100644 index 0000000..f852c48 --- /dev/null +++ b/win32/vs7/libgstdirectsound.vcproj @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/gst-plugins-good.sln b/win32/vs8/gst-plugins-good.sln new file mode 100644 index 0000000..c92eb16 --- /dev/null +++ b/win32/vs8/gst-plugins-good.sln @@ -0,0 +1,260 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstautodetect", "libgstautodetect.vcproj", "{B6669382-7F21-42E4-9023-462F9018F865}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstid3demux", "libgstid3demux.vcproj", "{B6591AC3-BD2F-4C79-87C9-7F42E21251C2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstavi", "libgstavi.vcproj", "{381D20B2-92DB-4205-AC64-C33A0AC40D5E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstudp", "libgstudp.vcproj", "{25B084CE-AC6C-4414-B9B0-41004371934A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstalaw", "libgstalaw.vcproj", "{92CBE678-6C17-11DB-9733-DDB456D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstalpha", "libgstalpha.vcproj", "{9CC6D4D0-6C17-11DB-89C9-E3B456D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstalphacolor", "libgstalphacolor.vcproj", "{AA003CFE-6C17-11DB-9B55-E6B456D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstapetag", "libgstapetag.vcproj", "{B3B897FA-6C17-11DB-8D14-EFB456D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaudiofx", "libgstaudiofx.vcproj", "{BB0FABB0-6C17-11DB-A701-F5B456D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstauparse", "libgstauparse.vcproj", "{C276F778-6C17-11DB-B896-00B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcutter", "libgstcutter.vcproj", "{CBF1FBE0-6C17-11DB-99AF-05B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsteffectv", "libgsteffectv.vcproj", "{D103C582-6C17-11DB-8273-09B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstflxdec", "libgstflxdec.vcproj", "{D778BBE8-6C17-11DB-AFE1-0DB556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstgoom", "libgstgoom.vcproj", "{F41C2640-6C17-11DB-9510-3DB556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsticydemux", "libgsticydemux.vcproj", "{FD69ECA0-6C17-11DB-BF73-62B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstlevel", "libgstlevel.vcproj", "{0780A724-6C18-11DB-ACF2-70B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmatroska", "libgstmatroska.vcproj", "{0CE09E18-6C18-11DB-8579-83B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmonoscope", "libgstmonoscope.vcproj", "{16142432-6C18-11DB-A314-93B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmulaw", "libgstmulaw.vcproj", "{1B53F562-6C18-11DB-AFE1-94B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmultipart", "libgstmultipart.vcproj", "{2386631E-6C18-11DB-B2CD-9EB556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstrtp", "libgstrtp.vcproj", "{29E030BE-6C18-11DB-8859-A0B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstrtsp", "libgstrtsp.vcproj", "{3904C230-6C18-11DB-A868-A9B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstsmpte", "libgstsmpte.vcproj", "{423C0CDC-6C18-11DB-9704-AAB556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideobalance", "libgstvideobalance.vcproj", "{4B12161C-6C18-11DB-BC6F-B3B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideobox", "libgstvideobox.vcproj", "{5330421A-6C18-11DB-A88B-BEB556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideoflip", "libgstvideoflip.vcproj", "{5A6F5C14-6C18-11DB-B1F3-D9B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideomixer", "libgstvideomixer.vcproj", "{651409EE-6C18-11DB-AEAF-E4B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstwavenc", "libgstwavenc.vcproj", "{6C6FD66E-6C18-11DB-AA23-F0B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstwavparse", "libgstwavparse.vcproj", "{739D73A6-6C18-11DB-B933-F3B556D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstflac", "libgstflac.vcproj", "{9986EFCA-6EA2-11DB-B620-FCFA55D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaasink", "libgstaasink.vcproj", "{A6BD695A-6EA5-11DB-BB0B-4B0156D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstannodex", "libgstannodex.vcproj", "{D591C19A-6EA5-11DB-AF77-BD0156D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcdio", "libgstcdio.vcproj", "{39672A0C-6EA6-11DB-9C0E-170256D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdv", "libgstdv.vcproj", "{7B605CA8-6EA6-11DB-AA13-7B0256D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstjpeg", "libgstjpeg.vcproj", "{C85765CE-6EA6-11DB-AF57-DC0256D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstladspa", "libgstladspa.vcproj", "{248366D6-6EA7-11DB-B463-360356D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcacasink", "libgstcacasink.vcproj", "{6BA664FA-6EA7-11DB-BD2C-9D0356D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmng", "libgstmng.vcproj", "{A540149A-6EA7-11DB-8FF8-E10356D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstpng", "libgstpng.vcproj", "{D5152638-6EA7-11DB-8D6A-1E0456D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmikmod", "libgstmikmod.vcproj", "{A97137F2-7036-11DB-9E40-0D7555D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgst1394", "libgst1394.vcproj", "{E7E9BA40-7036-11DB-8128-867555D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstshout2", "libgstshout2.vcproj", "{1EACDB66-7037-11DB-B4B7-B17655D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstspeex", "libgstspeex.vcproj", "{CDC7BC24-7037-11DB-AC6C-7F7755D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsttaglib", "libgsttaglib.vcproj", "{0AEC363E-7038-11DB-9B86-957755D89593}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdirectdraw", "libgstdirectdraw.vcproj", "{1594A623-5529-4B86-BD4A-694CF0BDB5C4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdirectsound", "libgstdirectsound.vcproj", "{566A2EB9-984C-4027-86DD-EDC7B390C679}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B6669382-7F21-42E4-9023-462F9018F865}.Debug|Win32.ActiveCfg = Debug|Win32 + {B6669382-7F21-42E4-9023-462F9018F865}.Debug|Win32.Build.0 = Debug|Win32 + {B6669382-7F21-42E4-9023-462F9018F865}.Release|Win32.ActiveCfg = Release|Win32 + {B6669382-7F21-42E4-9023-462F9018F865}.Release|Win32.Build.0 = Release|Win32 + {B6591AC3-BD2F-4C79-87C9-7F42E21251C2}.Debug|Win32.ActiveCfg = Debug|Win32 + {B6591AC3-BD2F-4C79-87C9-7F42E21251C2}.Debug|Win32.Build.0 = Debug|Win32 + {B6591AC3-BD2F-4C79-87C9-7F42E21251C2}.Release|Win32.ActiveCfg = Release|Win32 + {B6591AC3-BD2F-4C79-87C9-7F42E21251C2}.Release|Win32.Build.0 = Release|Win32 + {381D20B2-92DB-4205-AC64-C33A0AC40D5E}.Debug|Win32.ActiveCfg = Debug|Win32 + {381D20B2-92DB-4205-AC64-C33A0AC40D5E}.Debug|Win32.Build.0 = Debug|Win32 + {381D20B2-92DB-4205-AC64-C33A0AC40D5E}.Release|Win32.ActiveCfg = Release|Win32 + {381D20B2-92DB-4205-AC64-C33A0AC40D5E}.Release|Win32.Build.0 = Release|Win32 + {25B084CE-AC6C-4414-B9B0-41004371934A}.Debug|Win32.ActiveCfg = Debug|Win32 + {25B084CE-AC6C-4414-B9B0-41004371934A}.Release|Win32.ActiveCfg = Release|Win32 + {92CBE678-6C17-11DB-9733-DDB456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {92CBE678-6C17-11DB-9733-DDB456D89593}.Debug|Win32.Build.0 = Debug|Win32 + {92CBE678-6C17-11DB-9733-DDB456D89593}.Release|Win32.ActiveCfg = Release|Win32 + {92CBE678-6C17-11DB-9733-DDB456D89593}.Release|Win32.Build.0 = Release|Win32 + {9CC6D4D0-6C17-11DB-89C9-E3B456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {9CC6D4D0-6C17-11DB-89C9-E3B456D89593}.Debug|Win32.Build.0 = Debug|Win32 + {9CC6D4D0-6C17-11DB-89C9-E3B456D89593}.Release|Win32.ActiveCfg = Release|Win32 + {9CC6D4D0-6C17-11DB-89C9-E3B456D89593}.Release|Win32.Build.0 = Release|Win32 + {AA003CFE-6C17-11DB-9B55-E6B456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA003CFE-6C17-11DB-9B55-E6B456D89593}.Debug|Win32.Build.0 = Debug|Win32 + {AA003CFE-6C17-11DB-9B55-E6B456D89593}.Release|Win32.ActiveCfg = Release|Win32 + {AA003CFE-6C17-11DB-9B55-E6B456D89593}.Release|Win32.Build.0 = Release|Win32 + {B3B897FA-6C17-11DB-8D14-EFB456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {B3B897FA-6C17-11DB-8D14-EFB456D89593}.Debug|Win32.Build.0 = Debug|Win32 + {B3B897FA-6C17-11DB-8D14-EFB456D89593}.Release|Win32.ActiveCfg = Release|Win32 + {B3B897FA-6C17-11DB-8D14-EFB456D89593}.Release|Win32.Build.0 = Release|Win32 + {BB0FABB0-6C17-11DB-A701-F5B456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {BB0FABB0-6C17-11DB-A701-F5B456D89593}.Debug|Win32.Build.0 = Debug|Win32 + {BB0FABB0-6C17-11DB-A701-F5B456D89593}.Release|Win32.ActiveCfg = Release|Win32 + {BB0FABB0-6C17-11DB-A701-F5B456D89593}.Release|Win32.Build.0 = Release|Win32 + {C276F778-6C17-11DB-B896-00B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {C276F778-6C17-11DB-B896-00B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {C276F778-6C17-11DB-B896-00B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {C276F778-6C17-11DB-B896-00B556D89593}.Release|Win32.Build.0 = Release|Win32 + {CBF1FBE0-6C17-11DB-99AF-05B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {CBF1FBE0-6C17-11DB-99AF-05B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {CBF1FBE0-6C17-11DB-99AF-05B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {CBF1FBE0-6C17-11DB-99AF-05B556D89593}.Release|Win32.Build.0 = Release|Win32 + {D103C582-6C17-11DB-8273-09B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {D103C582-6C17-11DB-8273-09B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {D103C582-6C17-11DB-8273-09B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {D103C582-6C17-11DB-8273-09B556D89593}.Release|Win32.Build.0 = Release|Win32 + {D778BBE8-6C17-11DB-AFE1-0DB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {D778BBE8-6C17-11DB-AFE1-0DB556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {D778BBE8-6C17-11DB-AFE1-0DB556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {D778BBE8-6C17-11DB-AFE1-0DB556D89593}.Release|Win32.Build.0 = Release|Win32 + {F41C2640-6C17-11DB-9510-3DB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {F41C2640-6C17-11DB-9510-3DB556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {F41C2640-6C17-11DB-9510-3DB556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {F41C2640-6C17-11DB-9510-3DB556D89593}.Release|Win32.Build.0 = Release|Win32 + {FD69ECA0-6C17-11DB-BF73-62B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {FD69ECA0-6C17-11DB-BF73-62B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {FD69ECA0-6C17-11DB-BF73-62B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {FD69ECA0-6C17-11DB-BF73-62B556D89593}.Release|Win32.Build.0 = Release|Win32 + {0780A724-6C18-11DB-ACF2-70B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {0780A724-6C18-11DB-ACF2-70B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {0780A724-6C18-11DB-ACF2-70B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {0780A724-6C18-11DB-ACF2-70B556D89593}.Release|Win32.Build.0 = Release|Win32 + {0CE09E18-6C18-11DB-8579-83B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {0CE09E18-6C18-11DB-8579-83B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {0CE09E18-6C18-11DB-8579-83B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {0CE09E18-6C18-11DB-8579-83B556D89593}.Release|Win32.Build.0 = Release|Win32 + {16142432-6C18-11DB-A314-93B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {16142432-6C18-11DB-A314-93B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {16142432-6C18-11DB-A314-93B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {16142432-6C18-11DB-A314-93B556D89593}.Release|Win32.Build.0 = Release|Win32 + {1B53F562-6C18-11DB-AFE1-94B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {1B53F562-6C18-11DB-AFE1-94B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {1B53F562-6C18-11DB-AFE1-94B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {1B53F562-6C18-11DB-AFE1-94B556D89593}.Release|Win32.Build.0 = Release|Win32 + {2386631E-6C18-11DB-B2CD-9EB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {2386631E-6C18-11DB-B2CD-9EB556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {2386631E-6C18-11DB-B2CD-9EB556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {2386631E-6C18-11DB-B2CD-9EB556D89593}.Release|Win32.Build.0 = Release|Win32 + {29E030BE-6C18-11DB-8859-A0B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {29E030BE-6C18-11DB-8859-A0B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {3904C230-6C18-11DB-A868-A9B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {3904C230-6C18-11DB-A868-A9B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {423C0CDC-6C18-11DB-9704-AAB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {423C0CDC-6C18-11DB-9704-AAB556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {423C0CDC-6C18-11DB-9704-AAB556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {423C0CDC-6C18-11DB-9704-AAB556D89593}.Release|Win32.Build.0 = Release|Win32 + {4B12161C-6C18-11DB-BC6F-B3B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {4B12161C-6C18-11DB-BC6F-B3B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {4B12161C-6C18-11DB-BC6F-B3B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {4B12161C-6C18-11DB-BC6F-B3B556D89593}.Release|Win32.Build.0 = Release|Win32 + {5330421A-6C18-11DB-A88B-BEB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {5330421A-6C18-11DB-A88B-BEB556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {5330421A-6C18-11DB-A88B-BEB556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {5330421A-6C18-11DB-A88B-BEB556D89593}.Release|Win32.Build.0 = Release|Win32 + {5A6F5C14-6C18-11DB-B1F3-D9B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {5A6F5C14-6C18-11DB-B1F3-D9B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {5A6F5C14-6C18-11DB-B1F3-D9B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {5A6F5C14-6C18-11DB-B1F3-D9B556D89593}.Release|Win32.Build.0 = Release|Win32 + {651409EE-6C18-11DB-AEAF-E4B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {651409EE-6C18-11DB-AEAF-E4B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {651409EE-6C18-11DB-AEAF-E4B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {651409EE-6C18-11DB-AEAF-E4B556D89593}.Release|Win32.Build.0 = Release|Win32 + {6C6FD66E-6C18-11DB-AA23-F0B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {6C6FD66E-6C18-11DB-AA23-F0B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {6C6FD66E-6C18-11DB-AA23-F0B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {6C6FD66E-6C18-11DB-AA23-F0B556D89593}.Release|Win32.Build.0 = Release|Win32 + {739D73A6-6C18-11DB-B933-F3B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {739D73A6-6C18-11DB-B933-F3B556D89593}.Debug|Win32.Build.0 = Debug|Win32 + {739D73A6-6C18-11DB-B933-F3B556D89593}.Release|Win32.ActiveCfg = Release|Win32 + {739D73A6-6C18-11DB-B933-F3B556D89593}.Release|Win32.Build.0 = Release|Win32 + {9986EFCA-6EA2-11DB-B620-FCFA55D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {9986EFCA-6EA2-11DB-B620-FCFA55D89593}.Debug|Win32.Build.0 = Debug|Win32 + {9986EFCA-6EA2-11DB-B620-FCFA55D89593}.Release|Win32.ActiveCfg = Release|Win32 + {9986EFCA-6EA2-11DB-B620-FCFA55D89593}.Release|Win32.Build.0 = Release|Win32 + {A6BD695A-6EA5-11DB-BB0B-4B0156D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {A6BD695A-6EA5-11DB-BB0B-4B0156D89593}.Release|Win32.ActiveCfg = Release|Win32 + {D591C19A-6EA5-11DB-AF77-BD0156D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {D591C19A-6EA5-11DB-AF77-BD0156D89593}.Debug|Win32.Build.0 = Debug|Win32 + {D591C19A-6EA5-11DB-AF77-BD0156D89593}.Release|Win32.ActiveCfg = Release|Win32 + {D591C19A-6EA5-11DB-AF77-BD0156D89593}.Release|Win32.Build.0 = Release|Win32 + {39672A0C-6EA6-11DB-9C0E-170256D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {39672A0C-6EA6-11DB-9C0E-170256D89593}.Release|Win32.ActiveCfg = Release|Win32 + {7B605CA8-6EA6-11DB-AA13-7B0256D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {7B605CA8-6EA6-11DB-AA13-7B0256D89593}.Release|Win32.ActiveCfg = Release|Win32 + {C85765CE-6EA6-11DB-AF57-DC0256D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {C85765CE-6EA6-11DB-AF57-DC0256D89593}.Release|Win32.ActiveCfg = Release|Win32 + {248366D6-6EA7-11DB-B463-360356D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {248366D6-6EA7-11DB-B463-360356D89593}.Release|Win32.ActiveCfg = Release|Win32 + {6BA664FA-6EA7-11DB-BD2C-9D0356D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {6BA664FA-6EA7-11DB-BD2C-9D0356D89593}.Release|Win32.ActiveCfg = Release|Win32 + {A540149A-6EA7-11DB-8FF8-E10356D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {A540149A-6EA7-11DB-8FF8-E10356D89593}.Release|Win32.ActiveCfg = Release|Win32 + {D5152638-6EA7-11DB-8D6A-1E0456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {D5152638-6EA7-11DB-8D6A-1E0456D89593}.Release|Win32.ActiveCfg = Release|Win32 + {A97137F2-7036-11DB-9E40-0D7555D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {A97137F2-7036-11DB-9E40-0D7555D89593}.Release|Win32.ActiveCfg = Release|Win32 + {E7E9BA40-7036-11DB-8128-867555D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {E7E9BA40-7036-11DB-8128-867555D89593}.Release|Win32.ActiveCfg = Release|Win32 + {1EACDB66-7037-11DB-B4B7-B17655D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {1EACDB66-7037-11DB-B4B7-B17655D89593}.Release|Win32.ActiveCfg = Release|Win32 + {CDC7BC24-7037-11DB-AC6C-7F7755D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {CDC7BC24-7037-11DB-AC6C-7F7755D89593}.Debug|Win32.Build.0 = Debug|Win32 + {CDC7BC24-7037-11DB-AC6C-7F7755D89593}.Release|Win32.ActiveCfg = Release|Win32 + {CDC7BC24-7037-11DB-AC6C-7F7755D89593}.Release|Win32.Build.0 = Release|Win32 + {0AEC363E-7038-11DB-9B86-957755D89593}.Debug|Win32.ActiveCfg = Debug|Win32 + {0AEC363E-7038-11DB-9B86-957755D89593}.Release|Win32.ActiveCfg = Release|Win32 + {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Debug|Win32.ActiveCfg = Debug|Win32 + {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Debug|Win32.Build.0 = Debug|Win32 + {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Release|Win32.ActiveCfg = Release|Win32 + {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Release|Win32.Build.0 = Release|Win32 + {566A2EB9-984C-4027-86DD-EDC7B390C679}.Debug|Win32.ActiveCfg = Debug|Win32 + {566A2EB9-984C-4027-86DD-EDC7B390C679}.Debug|Win32.Build.0 = Debug|Win32 + {566A2EB9-984C-4027-86DD-EDC7B390C679}.Release|Win32.ActiveCfg = Release|Win32 + {566A2EB9-984C-4027-86DD-EDC7B390C679}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/win32/vs8/libgst1394.vcproj b/win32/vs8/libgst1394.vcproj new file mode 100644 index 0000000..943d6eb --- /dev/null +++ b/win32/vs8/libgst1394.vcproj @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstaasink.vcproj b/win32/vs8/libgstaasink.vcproj new file mode 100644 index 0000000..9dc9cf2 --- /dev/null +++ b/win32/vs8/libgstaasink.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstalaw.vcproj b/win32/vs8/libgstalaw.vcproj new file mode 100644 index 0000000..2473c97 --- /dev/null +++ b/win32/vs8/libgstalaw.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstalpha.vcproj b/win32/vs8/libgstalpha.vcproj new file mode 100644 index 0000000..db7cd6e --- /dev/null +++ b/win32/vs8/libgstalpha.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstalphacolor.vcproj b/win32/vs8/libgstalphacolor.vcproj new file mode 100644 index 0000000..74aa038 --- /dev/null +++ b/win32/vs8/libgstalphacolor.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstannodex.vcproj b/win32/vs8/libgstannodex.vcproj new file mode 100644 index 0000000..febca4b --- /dev/null +++ b/win32/vs8/libgstannodex.vcproj @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstapetag.vcproj b/win32/vs8/libgstapetag.vcproj new file mode 100644 index 0000000..fcc3ab6 --- /dev/null +++ b/win32/vs8/libgstapetag.vcproj @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstaudiofx.vcproj b/win32/vs8/libgstaudiofx.vcproj new file mode 100644 index 0000000..bdf79e9 --- /dev/null +++ b/win32/vs8/libgstaudiofx.vcproj @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstauparse.vcproj b/win32/vs8/libgstauparse.vcproj new file mode 100644 index 0000000..ceef5c5 --- /dev/null +++ b/win32/vs8/libgstauparse.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstautodetect.vcproj b/win32/vs8/libgstautodetect.vcproj new file mode 100644 index 0000000..4f33234 --- /dev/null +++ b/win32/vs8/libgstautodetect.vcproj @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstavi.vcproj b/win32/vs8/libgstavi.vcproj new file mode 100644 index 0000000..6937d05 --- /dev/null +++ b/win32/vs8/libgstavi.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstcacasink.vcproj b/win32/vs8/libgstcacasink.vcproj new file mode 100644 index 0000000..eec0786 --- /dev/null +++ b/win32/vs8/libgstcacasink.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstcdio.vcproj b/win32/vs8/libgstcdio.vcproj new file mode 100644 index 0000000..7b38fc0 --- /dev/null +++ b/win32/vs8/libgstcdio.vcproj @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstcutter.vcproj b/win32/vs8/libgstcutter.vcproj new file mode 100644 index 0000000..7656127 --- /dev/null +++ b/win32/vs8/libgstcutter.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstdirectsound.vcproj b/win32/vs8/libgstdirectsound.vcproj new file mode 100644 index 0000000..bb6b6c5 --- /dev/null +++ b/win32/vs8/libgstdirectsound.vcproj @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstdv.vcproj b/win32/vs8/libgstdv.vcproj new file mode 100644 index 0000000..26d5315 --- /dev/null +++ b/win32/vs8/libgstdv.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgsteffectv.vcproj b/win32/vs8/libgsteffectv.vcproj new file mode 100644 index 0000000..57359c3 --- /dev/null +++ b/win32/vs8/libgsteffectv.vcproj @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstflac.vcproj b/win32/vs8/libgstflac.vcproj new file mode 100644 index 0000000..053ba59 --- /dev/null +++ b/win32/vs8/libgstflac.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstflxdec.vcproj b/win32/vs8/libgstflxdec.vcproj new file mode 100644 index 0000000..92b6cd4 --- /dev/null +++ b/win32/vs8/libgstflxdec.vcproj @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstgoom.vcproj b/win32/vs8/libgstgoom.vcproj new file mode 100644 index 0000000..53541eb --- /dev/null +++ b/win32/vs8/libgstgoom.vcproj @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgsticydemux.vcproj b/win32/vs8/libgsticydemux.vcproj new file mode 100644 index 0000000..21de124 --- /dev/null +++ b/win32/vs8/libgsticydemux.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstid3demux.vcproj b/win32/vs8/libgstid3demux.vcproj new file mode 100644 index 0000000..240403c --- /dev/null +++ b/win32/vs8/libgstid3demux.vcproj @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstjpeg.vcproj b/win32/vs8/libgstjpeg.vcproj new file mode 100644 index 0000000..59da29a --- /dev/null +++ b/win32/vs8/libgstjpeg.vcproj @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstladspa.vcproj b/win32/vs8/libgstladspa.vcproj new file mode 100644 index 0000000..3668590 --- /dev/null +++ b/win32/vs8/libgstladspa.vcproj @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstlevel.vcproj b/win32/vs8/libgstlevel.vcproj new file mode 100644 index 0000000..d63e35f --- /dev/null +++ b/win32/vs8/libgstlevel.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstmatroska.vcproj b/win32/vs8/libgstmatroska.vcproj new file mode 100644 index 0000000..9aaeb9c --- /dev/null +++ b/win32/vs8/libgstmatroska.vcproj @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstmikmod.vcproj b/win32/vs8/libgstmikmod.vcproj new file mode 100644 index 0000000..19fab70 --- /dev/null +++ b/win32/vs8/libgstmikmod.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstmng.vcproj b/win32/vs8/libgstmng.vcproj new file mode 100644 index 0000000..0486846 --- /dev/null +++ b/win32/vs8/libgstmng.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstmonoscope.vcproj b/win32/vs8/libgstmonoscope.vcproj new file mode 100644 index 0000000..f80b617 --- /dev/null +++ b/win32/vs8/libgstmonoscope.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstmulaw.vcproj b/win32/vs8/libgstmulaw.vcproj new file mode 100644 index 0000000..4a6011b --- /dev/null +++ b/win32/vs8/libgstmulaw.vcproj @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstmultipart.vcproj b/win32/vs8/libgstmultipart.vcproj new file mode 100644 index 0000000..7c08a42 --- /dev/null +++ b/win32/vs8/libgstmultipart.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstpng.vcproj b/win32/vs8/libgstpng.vcproj new file mode 100644 index 0000000..7320f1c --- /dev/null +++ b/win32/vs8/libgstpng.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstrtp.vcproj b/win32/vs8/libgstrtp.vcproj new file mode 100644 index 0000000..3e4c9a7 --- /dev/null +++ b/win32/vs8/libgstrtp.vcproj @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstrtsp.vcproj b/win32/vs8/libgstrtsp.vcproj new file mode 100644 index 0000000..c892af9 --- /dev/null +++ b/win32/vs8/libgstrtsp.vcproj @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstshout2.vcproj b/win32/vs8/libgstshout2.vcproj new file mode 100644 index 0000000..7f36aef --- /dev/null +++ b/win32/vs8/libgstshout2.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstsmpte.vcproj b/win32/vs8/libgstsmpte.vcproj new file mode 100644 index 0000000..72ceb0d --- /dev/null +++ b/win32/vs8/libgstsmpte.vcproj @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstspeex.vcproj b/win32/vs8/libgstspeex.vcproj new file mode 100644 index 0000000..2212554 --- /dev/null +++ b/win32/vs8/libgstspeex.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgsttaglib.vcproj b/win32/vs8/libgsttaglib.vcproj new file mode 100644 index 0000000..2c017bc --- /dev/null +++ b/win32/vs8/libgsttaglib.vcproj @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstudp.vcproj b/win32/vs8/libgstudp.vcproj new file mode 100644 index 0000000..ad6d8b2 --- /dev/null +++ b/win32/vs8/libgstudp.vcproj @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstvideobalance.vcproj b/win32/vs8/libgstvideobalance.vcproj new file mode 100644 index 0000000..4754c66 --- /dev/null +++ b/win32/vs8/libgstvideobalance.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstvideobox.vcproj b/win32/vs8/libgstvideobox.vcproj new file mode 100644 index 0000000..bc59823 --- /dev/null +++ b/win32/vs8/libgstvideobox.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstvideoflip.vcproj b/win32/vs8/libgstvideoflip.vcproj new file mode 100644 index 0000000..33b0b3a --- /dev/null +++ b/win32/vs8/libgstvideoflip.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstvideomixer.vcproj b/win32/vs8/libgstvideomixer.vcproj new file mode 100644 index 0000000..fe73e13 --- /dev/null +++ b/win32/vs8/libgstvideomixer.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstwavenc.vcproj b/win32/vs8/libgstwavenc.vcproj new file mode 100644 index 0000000..1477bd7 --- /dev/null +++ b/win32/vs8/libgstwavenc.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vs8/libgstwavparse.vcproj b/win32/vs8/libgstwavparse.vcproj new file mode 100644 index 0000000..e7cac88 --- /dev/null +++ b/win32/vs8/libgstwavparse.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.7.4